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+bG9jaywgZmxhZ3MpOworCisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUgKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5ldGRydl9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZSAocGRldik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCAoZGV2KTsKKwluZXRkcnZfaHdfc3RhcnQgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuZXRkcnZfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBNT0ROQU1FLAorCS5pZF90YWJsZQk9IG5ldGRydl9wY2lfdGJsLAorCS5wcm9iZQkJPSBuZXRkcnZfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuZXRkcnZfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBuZXRkcnZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG5ldGRydl9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG5ldGRydl9pbml0X21vZHVsZSAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuZXRkcnZfcGNpX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IG5ldGRydl9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZuZXRkcnZfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQobmV0ZHJ2X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG5ldGRydl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTUxNzExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTAsMCArMSwxMzA3IEBACisvKiAzYzU3NC5jOiBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIHRoZSAzY29tIDNjNTc0ICJSb2FkUnVubmVyIi4KKworCVdyaXR0ZW4gMTk5My0xOTk4IGJ5CisJRG9uYWxkIEJlY2tlciwgYmVja2VyQHNjeWxkLmNvbSwgKGRyaXZlciBjb3JlKSBhbmQKKwlEYXZpZCBIaW5kcywgZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgKGZyb20gaGlzIFBDIGNhcmQgY29kZSkuCisJTG9ja2luZyBmaXhlcyAoQykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMKKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgZGVyaXZlcyBmcm9tIERvbmFsZCBCZWNrZXIncyAzYzUwOSBjb3JlLCB3aGljaCBoYXMgdGhlCisJZm9sbG93aW5nIGNvcHlyaWdodDoKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKwkKKworKi8KKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgM0NvbSAzYzU3NCBQQyBjYXJkIEZhc3QgRXRoZXJuZXQKK0FkYXB0ZXIuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitOb25lIC0tIFBDIGNhcmRzIGFyZSBhdXRvY29uZmlndXJlZC4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK1RoZSAzYzU3NCB1c2VzIGEgQm9vbWVyYW5nLXN0eWxlIGludGVyZmFjZSwgd2l0aG91dCB0aGUgYnVzLW1hc3RlciBjYXBhYmlsaXR5LgorU2VlIHRoZSBCb29tZXJhbmcgZHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIGZvciBtb3N0IGRldGFpbHMuCisKK0lWLiBOb3RlcyBhbmQgY2hpcCBkb2N1bWVudGF0aW9uLgorCitUd28gYWRkZWQgcmVnaXN0ZXJzIGFyZSB1c2VkIHRvIGVuaGFuY2UgUElPIHBlcmZvcm1hbmNlLCBSdW5uZXJSZEN0cmwgYW5kCitSdW5uZXJXckN0cmwuICBUaGVzZSBhcmUgMTEgYml0IGRvd24tY291bnRlcnMgdGhhdCBhcmUgcHJlbG9hZGVkIHdpdGggdGhlCitjb3VudCBvZiB3b3JkICgxNiBiaXRzKSByZWFkcyBvciB3cml0ZXMgdGhlIGRyaXZlciBpcyBhYm91dCB0byBkbyB0byB0aGUgUngKK29yIFR4IEZJRk8uICBUaGUgY2hpcCBpcyB0aGVuIGFibGUgdG8gaGlkZSB0aGUgaW50ZXJuYWwtUENJLWJ1cyB0byBQQy1jYXJkCit0cmFuc2xhdGlvbiBsYXRlbmN5IGJ5IGJ1ZmZlcmluZyB0aGUgSS9PIG9wZXJhdGlvbnMgd2l0aCBhbiA4IHdvcmQgRklGTy4KK05vdGU6IE5vIG90aGVyIGNoaXAgYWNjZXNzZXMgYXJlIHBlcm1pdHRlZCB3aGVuIHRoaXMgYnVmZmVyIGlzIHVzZWQuCisKK0Egc2Vjb25kIGVuaGFuY2VtZW50IGlzIHRoYXQgYm90aCBhdHRyaWJ1dGUgYW5kIGNvbW1vbiBtZW1vcnkgc3BhY2UKKzB4MDgwMC0weDBmZmYgY2FuIHRyYW5zbGF0ZWQgdG8gdGhlIFBJTyBGSUZPLiAgVGh1cyBtZW1vcnkgb3BlcmF0aW9ucyAoZmFzdGVyCit3aXRoICpzb21lKiBQQ2NhcmQgYnJpZGdlcykgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBJL08gb3BlcmF0aW9ucy4KK1RoaXMgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZSAweDEwIGJpdCBpbiB0aGUgUENNQ0lBIExBTiBDT1IuCisKK1NvbWUgc2xvdyBQQyBjYXJkIGJyaWRnZXMgd29yayBiZXR0ZXIgaWYgdGhleSBuZXZlciBzZWUgYSBXQUlUIHNpZ25hbC4KK1RoaXMgaXMgY29uZmlndXJlZCBieSBzZXR0aW5nIHRoZSAweDIwIGJpdCBpbiB0aGUgUENNQ0lBIExBTiBDT1IuCitPbmx5IGRvIHRoaXMgYWZ0ZXIgdGVzdGluZyB0aGF0IGl0IGlzIHJlbGlhYmxlIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKworVGhlIHVwcGVyIGZpdmUgYml0cyBvZiBSdW5uZXJSZEN0cmwgYXJlIHVzZWQgdG8gd2luZG93IGludG8gUENjYXJkCitjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycy4gIFdpbmRvdyAwIGlzIHRoZSByZWd1bGFyIEJvb21lcmFuZy9PZGllCityZWdpc3RlciBzZXQsIDEtNSBhcmUgdmFyaW91cyBQQyBjYXJkIGNvbnRyb2wgcmVnaXN0ZXJzLCBhbmQgMTYtMzEgYXJlCit0aGUgKHJldmVyc2VkISkgQ0lTIHRhYmxlLgorCitBIGZpbmFsIG5vdGU6IHdyaXRpbmcgdGhlIEludGVybmFsQ29uZmlnIHJlZ2lzdGVyIGluIHdpbmRvdyAzIHdpdGggYW4KK2ludmFsaWQgcmFtV2lkdGggaXMgVmVyeSBCYWQuCisKK1YuIFJlZmVyZW5jZXMKKworaHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0L05XYXkuaHRtbAoraHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvRFAvRFA4Mzg0MC5odG1sCisKK1RoYW5rcyB0byBUZXJyeSBNdXJwaHkgb2YgM0NvbSBmb3IgcHJvdmlkaW5nIGRldmVsb3BtZW50IGluZm9ybWF0aW9uIGZvcgorZWFybGllciAzQ29tIHByb2R1Y3RzLgorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCIzQ29tIDNjNTc0IHNlcmllcyBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitJTlRfTU9EVUxFX1BBUk0obWF4X2ludGVycnVwdF93b3JrLCAzMik7CisKKy8qIEZvcmNlIGZ1bGwgZHVwbGV4IG1vZGVzPyAqLworSU5UX01PRFVMRV9QQVJNKGZ1bGxfZHVwbGV4LCAwKTsKKworLyogQXV0b2RldGVjdCBsaW5rIHBvbGFyaXR5IHJldmVyc2FsPyAqLworSU5UX01PRFVMRV9QQVJNKGF1dG9fcG9sYXJpdHksIDEpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitJTlRfTU9EVUxFX1BBUk0ocGNfZGVidWcsIFBDTUNJQV9ERUJVRyk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisiM2M1NzRfY3MuYyAxLjY1YWMxIDIwMDMvMDQvMDcgRG9uYWxkIEJlY2tlci9EYXZpZCBIaW5kcywgYmVja2VyQHNjeWxkLmNvbS5cbiI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgoODAwKkhaKS8xMDAwKQorCisvKiBUbyBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIHNvdXJjZSBhbmQgbWFrZSB0aGUgZHJpdmVyIG1vcmUKKyAgIHJlYWRhYmxlIG5vdCBhbGwgY29uc3RhbnRzIGFyZSBzeW1ib2xpY2FsbHkgZGVmaW5lZC4KKyAgIFlvdSdsbCBuZWVkIHRoZSBtYW51YWwgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCBkcml2ZXIgZGV0YWlscyBhbnl3YXkuICovCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgRUwzX0RBVEEJMHgwMAorI2RlZmluZSBFTDNfQ01ECQkweDBlCisjZGVmaW5lIEVMM19TVEFUVVMJMHgwZQorCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKworLyogVGhlIHRvcCBmaXZlIGJpdHMgd3JpdHRlbiB0byBFTDNfQ01EIGFyZSBhIGNvbW1hbmQsIHRoZSBsb3dlcgorICAgMTEgYml0cyBhcmUgdGhlIHBhcmFtZXRlciwgaWYgYXBwbGljYWJsZS4gKi8KK2VudW0gZWwzX2NtZHMgeworCVRvdGFsUmVzZXQgPSAwPDwxMSwgU2VsZWN0V2luZG93ID0gMTw8MTEsIFN0YXJ0Q29heCA9IDI8PDExLAorCVJ4RGlzYWJsZSA9IDM8PDExLCBSeEVuYWJsZSA9IDQ8PDExLCBSeFJlc2V0ID0gNTw8MTEsIFJ4RGlzY2FyZCA9IDg8PDExLAorCVR4RW5hYmxlID0gOTw8MTEsIFR4RGlzYWJsZSA9IDEwPDwxMSwgVHhSZXNldCA9IDExPDwxMSwKKwlGYWtlSW50ciA9IDEyPDwxMSwgQWNrSW50ciA9IDEzPDwxMSwgU2V0SW50ckVuYiA9IDE0PDwxMSwKKwlTZXRTdGF0dXNFbmIgPSAxNTw8MTEsIFNldFJ4RmlsdGVyID0gMTY8PDExLCBTZXRSeFRocmVzaG9sZCA9IDE3PDwxMSwKKwlTZXRUeFRocmVzaG9sZCA9IDE4PDwxMSwgU2V0VHhTdGFydCA9IDE5PDwxMSwgU3RhdHNFbmFibGUgPSAyMTw8MTEsCisJU3RhdHNEaXNhYmxlID0gMjI8PDExLCBTdG9wQ29heCA9IDIzPDwxMSwKK307CisKK2VudW0gZWx4bF9zdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKwlJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwgQ21kQnVzeSA9IDB4MTAwMCB9OworCisvKiBUaGUgU2V0UnhGaWx0ZXIgY29tbWFuZCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczogKi8KK2VudW0gUnhGaWx0ZXIgeworCVJ4U3RhdGlvbiA9IDEsIFJ4TXVsdGljYXN0ID0gMiwgUnhCcm9hZGNhc3QgPSA0LCBSeFByb20gPSA4Cit9OworCitlbnVtIFdpbmRvdzAgeworCVduMEVlcHJvbUNtZCA9IDEwLCBXbjBFZXByb21EYXRhID0gMTIsIC8qIEVFUFJPTSBjb21tYW5kL2FkZHJlc3MsIGRhdGEuICovCisJSW50clN0YXR1cz0weDBFLAkJLyogVmFsaWQgaW4gYWxsIHdpbmRvd3MuICovCit9OworLyogVGhlc2UgYXNzdW1lcyB0aGUgbGFyZ2VyIEVFUFJPTS4gKi8KK2VudW0gV2luMF9FRVBST01fY21kcyB7CisJRUVQUk9NX1JlYWQgPSAweDIwMCwgRUVQUk9NX1dSSVRFID0gMHgxMDAsIEVFUFJPTV9FUkFTRSA9IDB4MzAwLAorCUVFUFJPTV9FV0VOQiA9IDB4MzAsCQkvKiBFbmFibGUgZXJhc2luZy93cml0aW5nIGZvciAxMCBtc2VjLiAqLworCUVFUFJPTV9FV0RJUyA9IDB4MDAsCQkvKiBEaXNhYmxlIEVXRU5CIGJlZm9yZSAxMCBtc2VjIHRpbWVvdXQuICovCit9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4KKyAgIE9uIHRoZSAiT2RpZSIgdGhpcyB3aW5kb3cgaXMgYWx3YXlzIG1hcHBlZCBhdCBvZmZzZXRzIDB4MTAtMHgxZi4KKyAgIEV4Y2VwdCBmb3IgVHhGcmVlLCB3aGljaCBpcyBvdmVybGFwcGVkIGJ5IFJ1bm5lcldyQ3RybC4gKi8KK2VudW0gV2luZG93MSB7CisJVFhfRklGTyA9IDB4MTAsICBSWF9GSUZPID0gMHgxMCwgIFJ4RXJyb3JzID0gMHgxNCwKKwlSeFN0YXR1cyA9IDB4MTgsICBUaW1lcj0weDFBLCBUeFN0YXR1cyA9IDB4MUIsCisJVHhGcmVlID0gMHgwQywgLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworCVJ1bm5lclJkQ3RybCA9IDB4MTYsIFJ1bm5lcldyQ3RybCA9IDB4MWMsCit9OworCitlbnVtIFdpbmRvdzMgewkJCS8qIFdpbmRvdyAzOiBNQUMvY29uZmlnIGJpdHMuICovCisJV24zX0NvbmZpZz0wLCBXbjNfTUFDX0N0cmw9NiwgV24zX09wdGlvbnM9OCwKK307Cit1bmlvbiB3bjNfY29uZmlnIHsKKwlpbnQgaTsKKwlzdHJ1Y3QgdzNfY29uZmlnX2ZpZWxkcyB7CisJCXVuc2lnbmVkIGludCByYW1fc2l6ZTozLCByYW1fd2lkdGg6MSwgcmFtX3NwZWVkOjIsIHJvbV9zaXplOjI7CisJCWludCBwYWQ4Ojg7CisJCXVuc2lnbmVkIGludCByYW1fc3BsaXQ6MiwgcGFkMTg6MiwgeGN2cjozLCBwYWQyMToxLCBhdXRvc2VsZWN0OjE7CisJCWludCBwYWQyNDo3OworCX0gdTsKK307CisKK2VudW0gV2luZG93NCB7CQkvKiBXaW5kb3cgNDogWGN2ci9tZWRpYSBiaXRzLiAqLworCVduNF9GSUZPRGlhZyA9IDQsIFduNF9OZXREaWFnID0gNiwgV240X1BoeXNpY2FsTWdtdD04LCBXbjRfTWVkaWEgPSAxMCwKK307CisKKyNkZWZpbmUgTUVESUFfVFAJMHgwMEMwCS8qIEVuYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciBmb3IgMTBiYXNlVC4gKi8KKworc3RydWN0IGVsM19wcml2YXRlIHsKKwlkZXZfbGlua190IGxpbms7CisJZGV2X25vZGVfdCBub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXUxNiBhZHZlcnRpc2luZywgcGFydG5lcjsJCS8qIE5XYXkgbWVkaWEgYWR2ZXJ0aXNlbWVudCAqLworCXVuc2lnbmVkIGNoYXIgcGh5czsJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgYXV0b3NlbGVjdDoxLCBkZWZhdWx0X21lZGlhOjM7CS8qIFJlYWQgZnJvbSB0aGUgRUVQUk9NL1duM19Db25maWcuICovCisJLyogZm9yIHRyYW5zY2VpdmVyIG1vbml0b3JpbmcgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBtZWRpYTsKKwl1bnNpZ25lZCBzaG9ydCBtZWRpYV9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgZmFzdF9wb2xsOworCXVuc2lnbmVkIGxvbmcgbGFzdF9pcnE7CisJc3BpbmxvY2tfdCB3aW5kb3dfbG9jazsJCQkvKiBHdWFyZHMgdGhlIFdpbmRvdyBzZWxlY3Rpb24gKi8KK307CisKKy8qIFNldCBpZmYgYSBNSUkgdHJhbnNjZWl2ZXIgb24gYW55IGludGVyZmFjZSByZXF1aXJlcyBtZGlvIHByZWFtYmxlLgorICAgVGhpcyBvbmx5IHNldCB3aXRoIHRoZSBvcmlnaW5hbCBEUDgzODQwIG9uIG9sZGVyIDNjOTA1IGJvYXJkcywgc28gdGhlIGV4dHJhCisgICBjb2RlIHNpemUgb2YgYSBwZXItaW50ZXJmYWNlIGZsYWcgaXMgbm90IHdvcnRod2hpbGUuICovCitzdGF0aWMgY2hhciBtaWlfcHJlYW1ibGVfcmVxdWlyZWQgPSAwOworCisvKiBJbmRleCBvZiBmdW5jdGlvbnMuICovCisKK3N0YXRpYyB2b2lkIHRjNTc0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHRjNTc0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IHRjNTc0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCQkJICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgYml0cyk7CitzdGF0aWMgaW50IG1kaW9fcmVhZChraW9fYWRkcl90IGlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByZWFkX2VlcHJvbShraW9fYWRkcl90IGlvYWRkciwgaW50IGluZGV4KTsKK3N0YXRpYyB2b2lkIHRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCk7CisKK3N0YXRpYyB2b2lkIHRjNTc0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBlbDNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZWwzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB3b3JrbGltaXQpOworc3RhdGljIGludCBlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbDNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiM2M1NzRfY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqdGM1NzRfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgdGM1NzRfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyoKKwl0YzU3NF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworCWxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorCXdpdGggQ2FyZCBTZXJ2aWNlcy4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICp0YzU3NF9hdHRhY2godm9pZCkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OworCisJREVCVUcoMCwgIjNjNTc0X2F0dGFjaCgpXG4iKTsKKworCS8qIENyZWF0ZSB0aGUgUEMgY2FyZCBkZXZpY2Ugb2JqZWN0LiAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxpbmsgPSAmbHAtPmxpbms7CisJbGluay0+cHJpdiA9IGRldjsKKworCXNwaW5fbG9ja19pbml0KCZscC0+d2luZG93X2xvY2spOworCWxpbmstPmlvLk51bVBvcnRzMSA9IDMyOworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKwlsaW5rLT5pcnEuSGFuZGxlciA9ICZlbDNfaW50ZXJydXB0OworCWxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisJbGluay0+Y29uZi5WY2MgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworCS8qIFRoZSBFTDMtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlbDNfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZlbDNfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSAmZWwzX2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+b3BlbiA9ICZlbDNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmZWwzX2Nsb3NlOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorCWRldi0+dHhfdGltZW91dCA9IGVsM190eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCQkJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnRjNTc0X2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gMCkgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQl0YzU3NF9kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBsaW5rOworfSAvKiB0YzU3NF9hdHRhY2ggKi8KKworLyoKKworCVRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisJd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisJc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKwl3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKyovCisKK3N0YXRpYyB2b2lkIHRjNTc0X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWRldl9saW5rX3QgKipsaW5rcDsKKworCURFQlVHKDAsICIzYzU3NF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworCWlmICgqbGlua3AgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGxpbmstPmRldikKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCXRjNTc0X3JlbGVhc2UobGluayk7CisKKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIHRjNTc0X2RldGFjaCAqLworCisvKgorCXRjNTc0X2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorCWlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorCWV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorICBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgY2hhciAqcmFtX3NwbGl0W10gPSB7IjU6MyIsICIzOjEiLCAiMToxIiwgIjM6NSJ9OworCitzdGF0aWMgdm9pZCB0YzU3NF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwl1bnNpZ25lZCBzaG9ydCBidWZbMzJdOworCWludCBsYXN0X2ZuLCBsYXN0X3JldCwgaSwgajsKKwlraW9fYWRkcl90IGlvYWRkcjsKKwl1MTYgKnBoeXNfYWRkcjsKKwljaGFyICpjYXJkbmFtZTsKKwl1bmlvbiB3bjNfY29uZmlnIGNvbmZpZzsKKworCXBoeXNfYWRkciA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCisJREVCVUcoMCwgIjNjNTc0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKwlmb3IgKGkgPSBqID0gMDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKKwkJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCQlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKwl9CisJaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFRoZSAzYzU3NCBub3JtYWxseSB1c2VzIGFuIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbiBpbmZvLCBpbmNsdWRpbmcKKwkgICB0aGUgaGFyZHdhcmUgYWRkcmVzcy4gIFRoZSBmdXR1cmUgcHJvZHVjdHMgbWF5IGluY2x1ZGUgYSBtb2RlbSBjaGlwCisJICAgYW5kIHB1dCB0aGUgYWRkcmVzcyBpbiB0aGUgQ0lTLiAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODg7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKwkJcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCXBoeXNfYWRkcltpXSA9IGh0b25zKGJ1ZltpXSk7CisJfSBlbHNlIHsKKwkJRUwzV0lORE9XKDApOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJcGh5c19hZGRyW2ldID0gaHRvbnMocmVhZF9lZXByb20oaW9hZGRyLCBpICsgMTApKTsKKwkJaWYgKHBoeXNfYWRkclswXSA9PSAweDYwNjApIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiM2M1NzRfY3M6IElPIHBvcnQgY29uZmxpY3QgYXQgMHglMDNseCIKKwkJCQkgICAiLTB4JTAzbHhcbiIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmJhc2VfYWRkcisxNSk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTICYmCisJCXBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUyAmJgorCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgeworCQljYXJkbmFtZSA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzFdOworCX0gZWxzZQorCQljYXJkbmFtZSA9ICIzQ29tIDNjNTc0IjsKKworCXsKKwkJdV9jaGFyIG1jcjsKKwkJb3V0dygyPDwxMSwgaW9hZGRyICsgUnVubmVyUmRDdHJsKTsKKwkJbWNyID0gaW5iKGlvYWRkciArIDIpOworCQlvdXR3KDA8PDExLCBpb2FkZHIgKyBSdW5uZXJSZEN0cmwpOworCQlwcmludGsoS0VSTl9JTkZPICIgIEFTSUMgcmV2ICVkLCIsIG1jcj4+Myk7CisJCUVMM1dJTkRPVygzKTsKKwkJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWxwLT5kZWZhdWx0X21lZGlhID0gY29uZmlnLnUueGN2cjsKKwkJbHAtPmF1dG9zZWxlY3QgPSBjb25maWcudS5hdXRvc2VsZWN0OworCX0KKworCWluaXRfdGltZXIoJmxwLT5tZWRpYSk7CisKKwl7CisJCWludCBwaHk7CisJCQorCQkvKiBSb2FkcnVubmVyIG9ubHk6IFR1cm4gb24gdGhlIE1JSSB0cmFuc2NlaXZlciAqLworCQlvdXR3KDB4ODA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCQltZGVsYXkoMSk7CisJCW91dHcoMHhjMDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4UmVzZXQpOworCQltZGVsYXkoMSk7CisJCW91dHcoMHg4MDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJCQorCQlFTDNXSU5ET1coNCk7CisJCWZvciAocGh5ID0gMTsgcGh5IDw9IDMyOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXM7CisJCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGlvYWRkciwgcGh5ICYgMHgxZiwgMSk7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYpIHsKKwkJCQlscC0+cGh5cyA9IHBoeSAmIDB4MWY7CisJCQkJREVCVUcoMCwgIiAgTUlJIHRyYW5zY2VpdmVyIGF0IGluZGV4ICVkLCBzdGF0dXMgJXguXG4iLAorCQkJCQkgIHBoeSwgbWlpX3N0YXR1cyk7CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKQorCQkJCQltaWlfcHJlYW1ibGVfcmVxdWlyZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChwaHkgPiAzMikgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIgIE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCWkgPSBtZGlvX3JlYWQoaW9hZGRyLCBscC0+cGh5cywgMTYpIHwgMHg0MDsKKwkJbWRpb193cml0ZShpb2FkZHIsIGxwLT5waHlzLCAxNiwgaSk7CisJCWxwLT5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChpb2FkZHIsIGxwLT5waHlzLCA0KTsKKwkJaWYgKGZ1bGxfZHVwbGV4KSB7CisJCQkvKiBPbmx5IGFkdmVydGlzZSB0aGUgRkQgbWVkaWEgdHlwZXMuICovCisJCQlscC0+YWR2ZXJ0aXNpbmcgJj0gfjB4MDJhMDsKKwkJCW1kaW9fd3JpdGUoaW9hZGRyLCBscC0+cGh5cywgNCwgbHAtPmFkdmVydGlzaW5nKTsKKwkJfQorCX0KKworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisJbGluay0+ZGV2ID0gJmxwLT5ub2RlOworCVNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIjNjNTc0X2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCQlsaW5rLT5kZXYgPSBOVUxMOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlzdHJjcHkobHAtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgaW8gJSMzbHgsIGlycSAlZCwgaHdfYWRkciAiLAorCQkgICBkZXYtPm5hbWUsIGNhcmRuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIi5cbiIpKTsKKwlwcmludGsoIiAlZEsgRklGTyBzcGxpdCAlcyBSeDpUeCwgJXNNSUkgaW50ZXJmYWNlLlxuIiwKKwkJICAgOCA8PCBjb25maWcudS5yYW1fc2l6ZSwgcmFtX3NwbGl0W2NvbmZpZy51LnJhbV9zcGxpdF0sCisJCSAgIGNvbmZpZy51LmF1dG9zZWxlY3QgPyAiYXV0b3NlbGVjdCAiIDogIiIpOworCisJcmV0dXJuOworCitjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisJdGM1NzRfcmVsZWFzZShsaW5rKTsKKwlyZXR1cm47CisKK30gLyogdGM1NzRfY29uZmlnICovCisKKy8qCisJQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHRjNTc0X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorCWRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworCXN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorKi8KKworc3RhdGljIHZvaWQgdGM1NzRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCURFQlVHKDAsICIzYzU3NF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyoKKwlUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKwlzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorCWFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisJdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyovCisKK3N0YXRpYyBpbnQgdGM1NzRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJCQkgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisJREVCVUcoMSwgIjNjNTc0X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJdGM1NzRfY29uZmlnKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlpZiAobGluay0+b3BlbikKKwkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJaWYgKGxpbmstPm9wZW4pIHsKKwkJCQl0YzU3NF9yZXNldChkZXYpOworCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9IC8qIHRjNTc0X2V2ZW50ICovCisKK3N0YXRpYyB2b2lkIGR1bXBfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlFTDNXSU5ET1coMSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBpcnEgc3RhdHVzICUwNHgsIHJ4IHN0YXR1cyAlMDR4LCB0eCBzdGF0dXMgIgorCQkgICAiJTAyeCwgdHggZnJlZSAlMDR4XG4iLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpLAorCQkgICBpbncoaW9hZGRyK1J4U3RhdHVzKSwgaW5iKGlvYWRkcitUeFN0YXR1cyksCisJCSAgIGludyhpb2FkZHIrVHhGcmVlKSk7CisJRUwzV0lORE9XKDQpOworCXByaW50ayhLRVJOX0lORk8gIiAgZGlhZ25vc3RpY3M6IGZpZm8gJTA0eCBuZXQgJTA0eCBldGhlcm5ldCAlMDR4IgorCQkgICAiIG1lZGlhICUwNHhcbiIsIGludyhpb2FkZHIrMHgwNCksIGludyhpb2FkZHIrMHgwNiksCisJCSAgIGludyhpb2FkZHIrMHgwOCksIGludyhpb2FkZHIrMHgwYSkpOworCUVMM1dJTkRPVygxKTsKK30KKworLyoKKyAgVXNlIHRoaXMgZm9yIGNvbW1hbmRzIHRoYXQgbWF5IHRha2UgdGltZSB0byBmaW5pc2gKKyovCitzdGF0aWMgdm9pZCB0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpCit7CisJaW50IGkgPSAxNTAwOworCW91dHcoY21kLCBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworCXdoaWxlICgtLWkgPiAwKQorCQlpZiAoIShpbncoZGV2LT5iYXNlX2FkZHIgKyBFTDNfU1RBVFVTKSAmIDB4MTAwMCkpIGJyZWFrOworCWlmIChpID09IDApCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNvbW1hbmQgMHglMDR4IGRpZCBub3QgY29tcGxldGUhXG4iLCBkZXYtPm5hbWUsIGNtZCk7Cit9CisKKy8qIFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgcmVndWxhciBFRVBST00gYWNjZXNzIHJlZ2lzdGVyLgorICAgQXNzdW1lIHRoYXQgd2UgYXJlIGluIHJlZ2lzdGVyIHdpbmRvdyB6ZXJvLgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVhZF9lZXByb20oa2lvX2FkZHJfdCBpb2FkZHIsIGludCBpbmRleCkKK3sKKwlpbnQgdGltZXI7CisJb3V0dyhFRVBST01fUmVhZCArIGluZGV4LCBpb2FkZHIgKyBXbjBFZXByb21DbWQpOworCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXNlYyBmb3IgdGhlIHJlYWQgdG8gdGFrZSBwbGFjZS4gKi8KKwlmb3IgKHRpbWVyID0gMTYyMDsgdGltZXIgPj0gMDsgdGltZXItLSkgeworCQlpZiAoKGludyhpb2FkZHIgKyBXbjBFZXByb21DbWQpICYgMHg4MDAwKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpbncoaW9hZGRyICsgV24wRWVwcm9tRGF0YSk7Cit9CisKKy8qIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorICAgZm9yIGRldGFpbHMuCisgICBUaGUgbWF4aXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIHRpbWluZyBpcyBlYXNpbHkgbWV0IGJ5IHRoZQorICAgc2xvdyBQQyBjYXJkIGludGVyZmFjZS4gKi8KKworI2RlZmluZSBNRElPX1NISUZUX0NMSwkweDAxCisjZGVmaW5lIE1ESU9fRElSX1dSSVRFCTB4MDQKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMCAoMHgwMCB8IE1ESU9fRElSX1dSSVRFKQorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxICgweDAyIHwgTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECTB4MDIKKyNkZWZpbmUgTURJT19FTkJfSU4JCTB4MDAKKworLyogR2VuZXJhdGUgdGhlIHByZWFtYmxlIHJlcXVpcmVkIGZvciBpbml0aWFsIHN5bmNocm9uaXphdGlvbiBhbmQKKyAgIGEgZmV3IG9sZGVyIHRyYW5zY2VpdmVycy4gKi8KK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGlvYWRkciwgaW50IGJpdHMpCit7CisJa2lvX2FkZHJfdCBtZGlvX2FkZHIgPSBpb2FkZHIgKyBXbjRfUGh5c2ljYWxNZ210OworCisJLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyBhdCBsZWFzdCAzMiBsb2dpYyBvbmVzLiAqLworCXdoaWxlICgtLSBiaXRzID49IDApIHsKKwkJb3V0dyhNRElPX0RBVEFfV1JJVEUxLCBtZGlvX2FkZHIpOworCQlvdXR3KE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJaW50IHJlYWRfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCXVuc2lnbmVkIGludCByZXR2YWwgPSAwOworCWtpb19hZGRyX3QgbWRpb19hZGRyID0gaW9hZGRyICsgV240X1BoeXNpY2FsTWdtdDsKKworCWlmIChtaWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTQ7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwkJb3V0dyhkYXRhdmFsLCBtZGlvX2FkZHIpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlvdXR3KE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbncobWRpb19hZGRyKSAmIE1ESU9fREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJb3V0dyhNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCX0KKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCWludCB3cml0ZV9jbWQgPSAweDUwMDIwMDAwIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJa2lvX2FkZHJfdCBtZGlvX2FkZHIgPSBpb2FkZHIgKyBXbjRfUGh5c2ljYWxNZ210OworCWludCBpOworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHdyaXRlX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJb3V0dyhkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJfQorCS8qIExlYXZlIHRoZSBpbnRlcmZhY2UgaWRsZS4gKi8KKwlmb3IgKGkgPSAxOyBpID49IDA7IGktLSkgeworCQlvdXR3KE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCQlvdXR3KE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJfQorCisJcmV0dXJuOworfQorCisvKiBSZXNldCBhbmQgcmVzdG9yZSBhbGwgb2YgdGhlIDNjNTc0IHJlZ2lzdGVycy4gKi8KK3N0YXRpYyB2b2lkIHRjNTc0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFRvdGFsUmVzZXR8MHgxMCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJLyogQ2xlYXIgYW55IHRyYW5zYWN0aW9ucyBpbiBwcm9ncmVzcy4gKi8KKwlvdXR3KDAsIGlvYWRkciArIFJ1bm5lcldyQ3RybCk7CisJb3V0dygwLCBpb2FkZHIgKyBSdW5uZXJSZEN0cmwpOworCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgYW5kIG1hc2suICovCisJRUwzV0lORE9XKDIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgaSk7CisJZm9yICg7IGkgPCAxMjsgaSs9MikKKwkJb3V0dygwLCBpb2FkZHIgKyBpKTsKKworCS8qIFJlc2V0IGNvbmZpZyBvcHRpb25zICovCisJRUwzV0lORE9XKDMpOworCW91dGIoKGRldi0+bXR1ID4gMTUwMCA/IDB4NDAgOiAwKSwgaW9hZGRyICsgV24zX01BQ19DdHJsKTsKKwlvdXRsKChscC0+YXV0b3NlbGVjdCA/IDB4MDEwMDAwMDAgOiAwKSB8IDB4MDA2MjAwMWIsCisJCSBpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKwkvKiBSb2FkcnVubmVyIG9ubHk6IFR1cm4gb24gdGhlIE1JSSB0cmFuc2NlaXZlci4gKi8KKwlvdXR3KDB4ODA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCW1kZWxheSgxKTsKKwlvdXR3KDB4YzA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCUVMM1dJTkRPVygxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkKKwl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4UmVzZXQpOworCW1kZWxheSgxKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJRUwzV0lORE9XKDMpOworCW91dHcoMHg4MDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisKKwkvKiBTd2l0Y2ggdG8gdGhlIHN0YXRzIHdpbmRvdywgYW5kIGNsZWFyIGFsbCBzdGF0cyBieSByZWFkaW5nLiAqLworCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlFTDNXSU5ET1coNik7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWluYihpb2FkZHIgKyBpKTsKKwlpbncoaW9hZGRyICsgMTApOworCWludyhpb2FkZHIgKyAxMik7CisJRUwzV0lORE9XKDQpOworCWluYihpb2FkZHIgKyAxMik7CisJaW5iKGlvYWRkciArIDEzKTsKKworCS8qIC4uIGVuYWJsZSBhbnkgZXh0cmEgc3RhdGlzdGljcyBiaXRzLi4gKi8KKwlvdXR3KDB4MDA0MCwgaW9hZGRyICsgV240X05ldERpYWcpOworCQorCUVMM1dJTkRPVygxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkKKwkvKiAuLiByZS1zeW5jIE1JSSBhbmQgcmUtZmlsbCB3aGF0IE5XYXkgaXMgYWR2ZXJ0aXNpbmcuICovCisJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCW1kaW9fd3JpdGUoaW9hZGRyLCBscC0+cGh5cywgNCwgbHAtPmFkdmVydGlzaW5nKTsKKwlpZiAoIWF1dG9fcG9sYXJpdHkpIHsKKwkJLyogd29ya3MgZm9yIFRESyA3OFEyMTIwIHNlcmllcyBNSUkncyAqLworCQlpbnQgaSA9IG1kaW9fcmVhZChpb2FkZHIsIGxwLT5waHlzLCAxNikgfCAweDIwOworCQltZGlvX3dyaXRlKGlvYWRkciwgbHAtPnBoeXMsIDE2LCBpKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCAxIGZvciBub3JtYWwgdXNlLCBqdXN0IGZvciBUeEZyZWUuICovCisJc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlvdXR3KFN0YXRzRW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogVHVybiBvbiBzdGF0aXN0aWNzLiAqLworCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwlvdXR3KFNldFN0YXR1c0VuYiB8IDB4ZmYsIGlvYWRkciArIEVMM19DTUQpOworCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTZXRJbnRyRW5iIHwgSW50TGF0Y2ggfCBUeEF2YWlsYWJsZSB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwKKwkJIHwgQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5LCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIGludCBlbDNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKwlpZiAoIURFVl9PSyhsaW5rKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJbGluay0+b3BlbisrOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJdGM1NzRfcmVzZXQoZGV2KTsKKwlscC0+bWVkaWEuZnVuY3Rpb24gPSAmbWVkaWFfY2hlY2s7CisJbHAtPm1lZGlhLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCWxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworCWFkZF90aW1lcigmbHAtPm1lZGlhKTsKKwkKKwlERUJVRygyLCAiJXM6IG9wZW5lZCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJICBkZXYtPm5hbWUsIGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCFcbiIsIGRldi0+bmFtZSk7CisJZHVtcF9zdGF0dXMoZGV2KTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLyogSXNzdWUgVFhfUkVTRVQgYW5kIFRYX1NUQVJUIGNvbW1hbmRzLiAqLworCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHBvcF90eF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworICAgIAorCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJZm9yIChpID0gMzI7IGkgPiAwOyBpLS0pIHsKKwkJdV9jaGFyIHR4X3N0YXR1cyA9IGluYihpb2FkZHIgKyBUeFN0YXR1cyk7CisJCWlmICghKHR4X3N0YXR1cyAmIDB4ODQpKQorCQkJYnJlYWs7CisJCS8qIHJlc2V0IHRyYW5zbWl0dGVyIG9uIGphYmJlciBlcnJvciBvciB1bmRlcnJ1biAqLworCQlpZiAodHhfc3RhdHVzICYgMHgzMCkKKwkJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIHsKKwkJCURFQlVHKDEsICIlczogdHJhbnNtaXQgZXJyb3I6IHN0YXR1cyAweCUwMnhcbiIsCisJCQkJICBkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisJCQlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQl9CisJCW91dGIoMHgwMCwgaW9hZGRyICsgVHhTdGF0dXMpOyAvKiBQb3AgdGhlIHN0YXR1cyBzdGFjay4gKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgZWwzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUJVRygzLCAiJXM6IGVsM19zdGFydF94bWl0KGxlbmd0aCA9ICVsZCkgY2FsbGVkLCAiCisJCSAgInN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgKGxvbmcpc2tiLT5sZW4sCisJCSAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlvdXR3KHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlvdXR3KDAsIGlvYWRkciArIFRYX0ZJRk8pOworCW91dHNsKGlvYWRkciArIFRYX0ZJRk8sIHNrYi0+ZGF0YSwgKHNrYi0+bGVuKzMpPj4yKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogVHhGcmVlIGFwcGVhcnMgb25seSBpbiBXaW5kb3cgMSwgbm90IG9mZnNldCAweDFjLiAqLworCWlmIChpbncoaW9hZGRyICsgVHhGcmVlKSA8PSAxNTM2KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJLyogSW50ZXJydXB0IHVzIHdoZW4gdGhlIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuIAorCQkgICBUaGUgdGhyZXNob2xkIGlzIGluIHVuaXRzIG9mIGR3b3Jkcy4gKi8KKwkJb3V0dyhTZXRUeFRocmVzaG9sZCArICgxNTM2Pj4yKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCisJcG9wX3R4X3N0YXR1cyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIEVMMyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHI7CisJdW5zaWduZWQgc3RhdHVzOworCWludCB3b3JrX2J1ZGdldCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiBJUlFfTk9ORTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCURFQlVHKDMsICIlczogaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKworCXNwaW5fbG9jaygmbHAtPndpbmRvd19sb2NrKTsKKwkKKwl3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJgorCQkgICAoSW50TGF0Y2ggfCBSeENvbXBsZXRlIHwgUnhFYXJseSB8IFN0YXRzRnVsbCkpIHsKKwkJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpIHx8CisJCQkoKHN0YXR1cyAmIDB4ZTAwMCkgIT0gMHgyMDAwKSkgeworCQkJREVCVUcoMSwgIiVzOiBJbnRlcnJ1cHQgZnJvbSBkZWFkIGNhcmRcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChzdGF0dXMgJiBSeENvbXBsZXRlKQorCQkJd29ya19idWRnZXQgPSBlbDNfcngoZGV2LCB3b3JrX2J1ZGdldCk7CisKKwkJaWYgKHN0YXR1cyAmIFR4QXZhaWxhYmxlKSB7CisJCQlERUJVRygzLCAiICBUWCByb29tIGJpdCB3YXMgaGFuZGxlZC5cbiIpOworCQkJLyogVGhlcmUncyByb29tIGluIHRoZSBGSUZPIGZvciBhIGZ1bGwtc2l6ZWQgcGFja2V0LiAqLworCQkJb3V0dyhBY2tJbnRyIHwgVHhBdmFpbGFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIFR4Q29tcGxldGUpCisJCQlwb3BfdHhfc3RhdHVzKGRldik7CisKKwkJaWYgKHN0YXR1cyAmIChBZGFwdGVyRmFpbHVyZSB8IFJ4RWFybHkgfCBTdGF0c0Z1bGwpKSB7CisJCQkvKiBIYW5kbGUgYWxsIHVuY29tbW9uIGludGVycnVwdHMuICovCisJCQlpZiAoc3RhdHVzICYgU3RhdHNGdWxsKQorCQkJCXVwZGF0ZV9zdGF0cyhkZXYpOworCQkJaWYgKHN0YXR1cyAmIFJ4RWFybHkpIHsKKwkJCQl3b3JrX2J1ZGdldCA9IGVsM19yeChkZXYsIHdvcmtfYnVkZ2V0KTsKKwkJCQlvdXR3KEFja0ludHIgfCBSeEVhcmx5LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBBZGFwdGVyRmFpbHVyZSkgeworCQkJCXUxNiBmaWZvX2RpYWc7CisJCQkJRUwzV0lORE9XKDQpOworCQkJCWZpZm9fZGlhZyA9IGludyhpb2FkZHIgKyBXbjRfRklGT0RpYWcpOworCQkJCUVMM1dJTkRPVygxKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBhZGFwdGVyIGZhaWx1cmUsIEZJRk8gZGlhZ25vc3RpYyIKKwkJCQkJICAgIiByZWdpc3RlciAlMDR4LlxuIiwgZGV2LT5uYW1lLCBmaWZvX2RpYWcpOworCQkJCWlmIChmaWZvX2RpYWcgJiAweDA0MDApIHsKKwkJCQkJLyogVHggb3ZlcnJ1biAqLworCQkJCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJCQkJCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJCX0KKwkJCQlpZiAoZmlmb19kaWFnICYgMHgyMDAwKSB7CisJCQkJCS8qIFJ4IHVuZGVycnVuICovCisJCQkJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeFJlc2V0KTsKKwkJCQkJc2V0X3J4X21vZGUoZGV2KTsKKwkJCQkJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJfQorCQkJCW91dHcoQWNrSW50ciB8IEFkYXB0ZXJGYWlsdXJlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCX0KKwkJfQorCisJCWlmICgtLXdvcmtfYnVkZ2V0IDwgMCkgeworCQkJREVCVUcoMCwgIiVzOiBUb28gbXVjaCB3b3JrIGluIGludGVycnVwdCwgIgorCQkJCSAgInN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJCQlvdXR3KEFja0ludHIgfCAweEZGLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEFja25vd2xlZGdlIHRoZSBJUlEuICovCisJCW91dHcoQWNrSW50ciB8IEludFJlcSB8IEludExhdGNoLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisKKwlERUJVRygzLCAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwkJICAKKwlzcGluX3VubG9jaygmbHAtPndpbmRvd19sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAgICBUaGlzIHRpbWVyIHNlcnZlcyB0d28gcHVycG9zZXM6IHRvIGNoZWNrIGZvciBtaXNzZWQgaW50ZXJydXB0cworCShhbmQgYXMgYSBsYXN0IHJlc29ydCwgcG9sbCB0aGUgTklDIGZvciBldmVudHMpLCBhbmQgdG8gbW9uaXRvcgorCXRoZSBNSUksIHJlcG9ydGluZyBjaGFuZ2VzIGluIGNhYmxlIHN0YXR1cy4KKyovCitzdGF0aWMgdm9pZCBtZWRpYV9jaGVjayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgLyogY2FibGUsICovIG1lZGlhLCBwYXJ0bmVyOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlnb3RvIHJlc2NoZWR1bGU7CisJCisJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggZXhwaXJlZCBsYXRlbmN5IHRpbWVyOiB3aXRoCisJICAgdGhpcywgd2UgY2FuIGxpbXAgYWxvbmcgZXZlbiBpZiB0aGUgaW50ZXJydXB0IGlzIGJsb2NrZWQgKi8KKwlpZiAoKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIEludExhdGNoKSAmJiAoaW5iKGlvYWRkciArIFRpbWVyKSA9PSAweGZmKSkgeworCQlpZiAoIWxwLT5mYXN0X3BvbGwpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0KHMpIGRyb3BwZWQhXG4iLCBkZXYtPm5hbWUpOworCQllbDNfaW50ZXJydXB0KGRldi0+aXJxLCBscCwgTlVMTCk7CisJCWxwLT5mYXN0X3BvbGwgPSBIWjsKKwl9CisJaWYgKGxwLT5mYXN0X3BvbGwpIHsKKwkJbHAtPmZhc3RfcG9sbC0tOworCQlscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyAyKkhaLzEwMDsKKwkJYWRkX3RpbWVyKCZscC0+bWVkaWEpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCUVMM1dJTkRPVyg0KTsKKwltZWRpYSA9IG1kaW9fcmVhZChpb2FkZHIsIGxwLT5waHlzLCAxKTsKKwlwYXJ0bmVyID0gbWRpb19yZWFkKGlvYWRkciwgbHAtPnBoeXMsIDUpOworCUVMM1dJTkRPVygxKTsKKwkKKwlpZiAobWVkaWEgIT0gbHAtPm1lZGlhX3N0YXR1cykgeworCQlpZiAoKG1lZGlhIF4gbHAtPm1lZGlhX3N0YXR1cykgJiAweDAwMDQpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJCQkJICAgKGxwLT5tZWRpYV9zdGF0dXMgJiAweDAwMDQpID8gImxvc3QiIDogImZvdW5kIik7CisJCWlmICgobWVkaWEgXiBscC0+bWVkaWFfc3RhdHVzKSAmIDB4MDAyMCkgeworCQkJbHAtPnBhcnRuZXIgPSAwOworCQkJaWYgKGxwLT5tZWRpYV9zdGF0dXMgJiAweDAwMjApIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIHJlc3RhcnRlZFxuIiwKKwkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSBpZiAocGFydG5lcikgeworCQkJCXBhcnRuZXIgJj0gbHAtPmFkdmVydGlzaW5nOworCQkJCWxwLT5wYXJ0bmVyID0gcGFydG5lcjsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlOiAiCisJCQkJCSAgICIlc2Jhc2VULSVjRCBzZWxlY3RlZFxuIiwgZGV2LT5uYW1lLAorCQkJCQkgICAoKHBhcnRuZXIgJiAweDAxODApID8gIjEwMCIgOiAiMTAiKSwKKwkJCQkJICAgKChwYXJ0bmVyICYgMHgwMTQwKSA/ICdGJyA6ICdIJykpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBwYXJ0bmVyIGRpZCBub3QgYXV0b25lZ290aWF0ZVxuIiwKKwkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCX0KKworCQkJRUwzV0lORE9XKDMpOworCQkJb3V0YigocGFydG5lciAmIDB4MDE0MCA/IDB4MjAgOiAwKSB8CisJCQkJIChkZXYtPm10dSA+IDE1MDAgPyAweDQwIDogMCksIGlvYWRkciArIFduM19NQUNfQ3RybCk7CisJCQlFTDNXSU5ET1coMSk7CisKKwkJfQorCQlpZiAobWVkaWEgJiAweDAwMTApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVtb3RlIGZhdWx0IGRldGVjdGVkXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCWlmIChtZWRpYSAmIDB4MDAwMikKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBqYWJiZXIgZGV0ZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5tZWRpYV9zdGF0dXMgPSBtZWRpYTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisKK3Jlc2NoZWR1bGU6CisJbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKCZscC0+bWVkaWEpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3N0YXRzKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogIFVwZGF0ZSBzdGF0aXN0aWNzLgorCVN1cHJpc2luZ2x5IHRoaXMgbmVlZCBub3QgYmUgcnVuIHNpbmdsZS10aHJlYWRlZCwgYnV0IGl0IGVmZmVjdGl2ZWx5IGlzLgorCVRoZSBjb3VudGVycyBjbGVhciB3aGVuIHJlYWQsIHNvIHRoZSBhZGRzIG11c3QgbWVyZWx5IGJlIGF0b21pYy4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1OCByeCwgdHgsIHVwOworCisJREVCVUcoMiwgIiVzOiB1cGRhdGluZyB0aGUgc3RhdGlzdGljcy5cbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoaW53KGlvYWRkcitFTDNfU1RBVFVTKSA9PSAweGZmZmYpIC8qIE5vIGNhcmQuICovCisJCXJldHVybjsKKwkJCisJLyogVW5saWtlIHRoZSAzYzUwOSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyAJCSs9IGluYihpb2FkZHIgKyAwKTsKKwlscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDEpOworCS8qIE11bHRpcGxlIGNvbGxpc2lvbnMuICovCSAgIAlpbmIoaW9hZGRyICsgMik7CisJbHAtPnN0YXRzLmNvbGxpc2lvbnMJCQkrPSBpbmIoaW9hZGRyICsgMyk7CisJbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA0KTsKKwlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA1KTsKKwlscC0+c3RhdHMudHhfcGFja2V0cwkJCSs9IGluYihpb2FkZHIgKyA2KTsKKwl1cAkJIAkJCSA9IGluYihpb2FkZHIgKyA5KTsKKwlscC0+c3RhdHMudHhfcGFja2V0cwkJCSs9ICh1cCYweDMwKSA8PCA0OworCS8qIFJ4IHBhY2tldHMgICAqLwkJCSAgIGluYihpb2FkZHIgKyA3KTsKKwkvKiBUeCBkZWZlcnJhbHMgKi8JCQkgICBpbmIoaW9hZGRyICsgOCk7CisJcngJCSAJCQkgPSBpbncoaW9hZGRyICsgMTApOworCXR4CQkJCQkgPSBpbncoaW9hZGRyICsgMTIpOworCisJRUwzV0lORE9XKDQpOworCS8qIEJhZFNTRCAqLwkJCQkgICBpbmIoaW9hZGRyICsgMTIpOworCXVwCQkJCQkgPSBpbmIoaW9hZGRyICsgMTMpOworCisJbHAtPnN0YXRzLnR4X2J5dGVzIAkJCSs9IHR4ICsgKCh1cCAmIDB4ZjApIDw8IDEyKTsKKworCUVMM1dJTkRPVygxKTsKK30KKworc3RhdGljIGludCBlbDNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdvcmtsaW1pdCkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IHJ4X3N0YXR1czsKKwkKKwlERUJVRygzLCAiJXM6IGluIHJ4X3BhY2tldCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1J4U3RhdHVzKSk7CisJd2hpbGUgKCEoKHJ4X3N0YXR1cyA9IGludyhpb2FkZHIgKyBSeFN0YXR1cykpICYgMHg4MDAwKSAmJgorCQkgICAoLS13b3JrbGltaXQgPj0gMCkpIHsKKwkJaWYgKHJ4X3N0YXR1cyAmIDB4NDAwMCkgeyAvKiBFcnJvciwgdXBkYXRlIHN0YXRzLiAqLworCQkJc2hvcnQgZXJyb3IgPSByeF9zdGF0dXMgJiAweDM4MDA7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzd2l0Y2ggKGVycm9yKSB7CisJCQljYXNlIDB4MDAwMDoJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDA4MDA6CWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDEwMDA6CWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MTgwMDoJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MjAwMDoJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyODAwOglscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNob3J0IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDdmZjsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbis1KTsKKworCQkJREVCVUcoMywgIiAgUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICBwa3RfbGVuLCByeF9zdGF0dXMpOworCQkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlpbnNsKGlvYWRkcitSWF9GSUZPLCBza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJCQkoKHBrdF9sZW4rMyk+PjIpKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJfSBlbHNlIHsKKwkJCQlERUJVRygxLCAiJXM6IGNvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiIKKwkJCQkJICAiIHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9CisJCX0KKwkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4RGlzY2FyZCk7CisJfQorCisJcmV0dXJuIHdvcmtsaW1pdDsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiM2M1NzRfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qIFByb3ZpZGUgaW9jdGwoKSBjYWxscyB0byBleGFtaW5lIHRoZSBNSUkgeGN2ciBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgZWwzX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgKmRhdGEgPSAodTE2ICopJnJxLT5pZnJfaWZydTsKKwlpbnQgcGh5ID0gbHAtPnBoeXMgJiAweDFmOworCisJREVCVUcoMiwgIiVzOiBJbiBpb2N0KCUtLjZzLCAlIzQuNHgpICU0LjR4ICU0LjR4ICU0LjR4ICU0LjR4LlxuIiwKKwkJICBkZXYtPm5hbWUsIHJxLT5pZnJfaWZybi5pZnJuX25hbWUsIGNtZCwKKwkJICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLworCQlkYXRhWzBdID0gcGh5OworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyLiAqLworCQl7CisJCQlpbnQgc2F2ZWRfd2luZG93OworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQkJc2F2ZWRfd2luZG93ID0gaW53KGlvYWRkciArIEVMM19DTUQpID4+IDEzOworCQkJRUwzV0lORE9XKDQpOworCQkJZGF0YVszXSA9IG1kaW9fcmVhZChpb2FkZHIsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZik7CisJCQlFTDNXSU5ET1coc2F2ZWRfd2luZG93KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJeworCQkJaW50IHNhdmVkX3dpbmRvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCQlzYXZlZF93aW5kb3cgPSBpbncoaW9hZGRyICsgRUwzX0NNRCkgPj4gMTM7CisJCQlFTDNXSU5ET1coNCk7CisJCQltZGlvX3dyaXRlKGlvYWRkciwgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmLCBkYXRhWzJdKTsKKwkJCUVMM1dJTkRPVyhzYXZlZF93aW5kb3cpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qIFRoZSBPZGllIGNoaXAgaGFzIGEgNjQgYmluIG11bHRpY2FzdCBmaWx0ZXIsIGJ1dCB0aGUgYml0IGxheW91dCBpcyBub3QKKyAgIGRvY3VtZW50ZWQuICBVbnRpbCBpdCBpcyB3ZSByZXZlcnQgdG8gcmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHdoZW4KKyAgIGFueSBtdWx0aWNhc3QgcmVjZXB0aW9uIGlzIGRlc2lyZWQuCisgICBOb3RlOiBNeSBvdGhlciBkcml2ZXJzIGVtaXQgYSBsb2cgbWVzc2FnZSB3aGVuZXZlciBwcm9taXNjdW91cyBtb2RlIGlzCisgICBlbnRlcmVkIHRvIGhlbHAgZGV0ZWN0IHBhc3N3b3JkIHNuaWZmZXJzLiAgVGhpcyBpcyBsZXNzIGRlc2lyYWJsZSBvbgorICAgdHlwaWNhbCBQQyBjYXJkIG1hY2hpbmVzLCBzbyB3ZSBvbWl0IHRoZSBtZXNzYWdlLgorICAgKi8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4TXVsdGljYXN0IHwgUnhCcm9hZGNhc3QgfCBSeFByb20sCisJCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJZWxzZSBpZiAoZGV2LT5tY19jb3VudCB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpCisJCW91dHcoU2V0UnhGaWx0ZXJ8UnhTdGF0aW9ufFJ4TXVsdGljYXN0fFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbHNlCisJCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisJREVCVUcoMiwgIiVzOiBzaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisJCisJaWYgKERFVl9PSyhsaW5rKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIFR1cm4gb2ZmIHN0YXRpc3RpY3MgQVNBUC4gIFdlIHVwZGF0ZSBscC0+c3RhdHMgYmVsb3cuICovCisJCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCisJCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlci4gKi8KKwkJb3V0dyhSeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCQlvdXR3KFR4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQorCQkvKiBOb3RlOiBTd2l0Y2hpbmcgdG8gd2luZG93IDAgbWF5IGRpc2FibGUgdGhlIElSUS4gKi8KKwkJRUwzV0lORE9XKDApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCXVwZGF0ZV9zdGF0cyhkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlsaW5rLT5vcGVuLS07CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZscC0+bWVkaWEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB0YzU3NF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICIzYzU3NF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHRjNTc0X2F0dGFjaCwKKwkuZGV0YWNoCQk9IHRjNTc0X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdGM1NzQodm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmdGM1NzRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdGM1NzQodm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnRjNTc0X2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X3RjNTc0KTsKK21vZHVsZV9leGl0KGV4aXRfdGM1NzQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWFiZGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKQEAgLTAsMCArMSwxMDgxIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgdGhlIDNjb20gM2M1ODkgY2FyZC4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMgLS0gZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworICAgIDNjNTg5X2NzLmMgMS4xNjIgMjAwMS8xMC8xMyAwMDowODo1MAorCisgICAgVGhlIG5ldHdvcmsgZHJpdmVyIGNvZGUgaXMgYmFzZWQgb24gRG9uYWxkIEJlY2tlcidzIDNjNTg5IGNvZGU6CisgICAgCisgICAgV3JpdHRlbiAxOTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgIERvbmFsZCBCZWNrZXIgbWF5IGJlIHJlYWNoZWQgYXQgYmVja2VyQHNjeWxkLmNvbQorICAgIAorICAgIFVwZGF0ZWQgZm9yIDIuNS54IGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzU4OV9jcyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTYyLWFjIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIFRvIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgc291cmNlIEkgb25seSBkZWZpbmUgb3BlcmF0aW5nCisgICBjb25zdGFudHMgaWYgdGhleSBhcmUgdXNlZCBzZXZlcmFsIHRpbWVzLiAgWW91J2xsIG5lZWQgdGhlIG1hbnVhbAorICAgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCBkcml2ZXIgZGV0YWlscy4gKi8KKy8qIE9mZnNldHMgZnJvbSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZSBFTDNfREFUQQkweDAwCisjZGVmaW5lIEVMM19USU1FUgkweDBhCisjZGVmaW5lIEVMM19DTUQJCTB4MGUKKyNkZWZpbmUgRUwzX1NUQVRVUwkweDBlCisKKyNkZWZpbmUgRUVQUk9NX1JFQUQJMHgwMDgwCisjZGVmaW5lIEVFUFJPTV9CVVNZCTB4ODAwMAorCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKworLyogVGhlIHRvcCBmaXZlIGJpdHMgd3JpdHRlbiB0byBFTDNfQ01EIGFyZSBhIGNvbW1hbmQsIHRoZSBsb3dlcgorICAgMTEgYml0cyBhcmUgdGhlIHBhcmFtZXRlciwgaWYgYXBwbGljYWJsZS4gKi8KK2VudW0gYzUwOWNtZCB7CisgICAgVG90YWxSZXNldCA9IDA8PDExLCBTZWxlY3RXaW5kb3cgPSAxPDwxMSwgU3RhcnRDb2F4ID0gMjw8MTEsCisgICAgUnhEaXNhYmxlID0gMzw8MTEsIFJ4RW5hYmxlID0gNDw8MTEsIFJ4UmVzZXQgPSA1PDwxMSwgUnhEaXNjYXJkID0gODw8MTEsCisgICAgVHhFbmFibGUgPSA5PDwxMSwgVHhEaXNhYmxlID0gMTA8PDExLCBUeFJlc2V0ID0gMTE8PDExLAorICAgIEZha2VJbnRyID0gMTI8PDExLCBBY2tJbnRyID0gMTM8PDExLCBTZXRJbnRyRW5iID0gMTQ8PDExLAorICAgIFNldFN0YXR1c0VuYiA9IDE1PDwxMSwgU2V0UnhGaWx0ZXIgPSAxNjw8MTEsIFNldFJ4VGhyZXNob2xkID0gMTc8PDExLAorICAgIFNldFR4VGhyZXNob2xkID0gMTg8PDExLCBTZXRUeFN0YXJ0ID0gMTk8PDExLCBTdGF0c0VuYWJsZSA9IDIxPDwxMSwKKyAgICBTdGF0c0Rpc2FibGUgPSAyMjw8MTEsIFN0b3BDb2F4ID0gMjM8PDExLAorfTsKKworZW51bSBjNTA5c3RhdHVzIHsKKyAgICBJbnRMYXRjaCA9IDB4MDAwMSwgQWRhcHRlckZhaWx1cmUgPSAweDAwMDIsIFR4Q29tcGxldGUgPSAweDAwMDQsCisgICAgVHhBdmFpbGFibGUgPSAweDAwMDgsIFJ4Q29tcGxldGUgPSAweDAwMTAsIFJ4RWFybHkgPSAweDAwMjAsCisgICAgSW50UmVxID0gMHgwMDQwLCBTdGF0c0Z1bGwgPSAweDAwODAsIENtZEJ1c3kgPSAweDEwMDAKK307CisKKy8qIFRoZSBTZXRSeEZpbHRlciBjb21tYW5kIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAqLworZW51bSBSeEZpbHRlciB7CisgICAgUnhTdGF0aW9uID0gMSwgUnhNdWx0aWNhc3QgPSAyLCBSeEJyb2FkY2FzdCA9IDQsIFJ4UHJvbSA9IDgKK307CisKKy8qIFJlZ2lzdGVyIHdpbmRvdyAxIG9mZnNldHMsIHRoZSB3aW5kb3cgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9uLiAqLworI2RlZmluZSBUWF9GSUZPCQkweDAwCisjZGVmaW5lIFJYX0ZJRk8JCTB4MDAKKyNkZWZpbmUgUlhfU1RBVFVTIAkweDA4CisjZGVmaW5lIFRYX1NUQVRVUyAJMHgwQgorI2RlZmluZSBUWF9GUkVFCQkweDBDCS8qIFJlbWFpbmluZyBmcmVlIGJ5dGVzIGluIFR4IGJ1ZmZlci4gKi8KKworI2RlZmluZSBXTjBfSVJRCQkweDA4CS8qIFdpbmRvdyAwOiBTZXQgSVJRIGxpbmUgaW4gYml0cyAxMi0xNS4gKi8KKyNkZWZpbmUgV040X01FRElBCTB4MEEJLyogV2luZG93IDQ6IFZhcmlvdXMgdHJhbnNjdnIvbWVkaWEgYml0cy4gKi8KKyNkZWZpbmUgTUVESUFfVFAJMHgwMEMwCS8qIEVuYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciBmb3IgMTBiYXNlVC4gKi8KKyNkZWZpbmUgTUVESUFfTEVECTB4MDAwMQkvKiBFbmFibGUgbGluayBsaWdodCBvbiAzQzU4OUUgY2FyZHMuICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyBUeCBodW5nICovCisjZGVmaW5lIFRYX1RJTUVPVVQJKCg0MDAqSFopLzEwMDApCisKK3N0cnVjdCBlbDNfcHJpdmF0ZSB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBkZXZfbm9kZV90IAkJbm9kZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICAvKiBGb3IgdHJhbnNjZWl2ZXIgbW9uaXRvcmluZyAqLworICAgIHN0cnVjdCB0aW1lcl9saXN0CW1lZGlhOworICAgIHUxNgkJCW1lZGlhX3N0YXR1czsKKyAgICB1MTYJCQlmYXN0X3BvbGw7CisgICAgdW5zaWduZWQgbG9uZwlsYXN0X2lycTsKKyAgICBzcGlubG9ja190CQlsb2NrOworfTsKKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJhdXRvIiwgIjEwYmFzZVQiLCAiMTBiYXNlMiIsICJBVUkiIH07CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM2M1ODkgc2VyaWVzIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworLyogU3BlY2lhbCBob29rIGZvciBzZXR0aW5nIGlmX3BvcnQgd2hlbiBtb2R1bGUgaXMgbG9hZGVkICovCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwgMCk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KK0RSVl9OQU1FICIuYyAiIERSVl9WRVJTSU9OICIgMjAwMS8xMC8xMyAwMDowODo1MCAoRGF2aWQgSGluZHMpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHRjNTg5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHRjNTg5X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IHRjNTg5X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyB1MTYgcmVhZF9lZXByb20oa2lvX2FkZHJfdCBpb2FkZHIsIGludCBpbmRleCk7CitzdGF0aWMgdm9pZCB0YzU4OV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgZWwzX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgaW50IGVsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gIjNjNTg5X2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKnRjNTg5X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHRjNTg5X2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgdGM1ODlfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqdGM1ODlfYXR0YWNoKHZvaWQpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscDsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgaW50IHJldDsKKworICAgIERFQlVHKDAsICIzYzU4OV9hdHRhY2goKVxuIik7CisgICAgCisgICAgLyogQ3JlYXRlIG5ldyBldGhlcm5ldCBkZXZpY2UgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVsM19wcml2YXRlKSk7CisgICAgaWYgKCFkZXYpCisJIHJldHVybiBOVUxMOworICAgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJmxwLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZlbDNfaW50ZXJydXB0OworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKyAgICAKKyAgICAvKiBUaGUgRUwzLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsM19zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZlbDNfY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmVsM19nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworICAgIGRldi0+b3BlbiA9ICZlbDNfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmZWwzX2Nsb3NlOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IGVsM190eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnRjNTg5X2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJdGM1ODlfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGluazsKK30gLyogdGM1ODlfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHRjNTg5X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKyAgICAKKyAgICBERUJVRygwLCAiM2M1ODlfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwl0YzU4OV9yZWxlYXNlKGxpbmspOworICAgIAorICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisgICAgCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogdGM1ODlfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgdGM1ODlfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgICAgZXRoZXJuZXQgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgdGM1ODlfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdTE2IGJ1ZlszMl0sICpwaHlzX2FkZHI7CisgICAgaW50IGxhc3RfZm4sIGxhc3RfcmV0LCBpLCBqLCBtdWx0aSA9IDAsIGZpZm87CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgY2hhciAqcmFtX3NwbGl0W10gPSB7IjU6MyIsICIzOjEiLCAiMToxIiwgIjM6NSJ9OworICAgIAorICAgIERFQlVHKDAsICIzYzU4OV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgcGh5c19hZGRyID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKyAgICAKKyAgICAvKiBJcyB0aGlzIGEgM2M1NjI/ICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICBpZiAoKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpICYmCisJKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpIHsKKwlpZiAobGUxNl90b19jcHUoYnVmWzBdKSAhPSBNQU5GSURfM0NPTSkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiM2M1ODlfY3M6IGhtbW0sIGlzIHRoaXMgcmVhbGx5IGEgIgorCQkgICAiM0NvbSBjYXJkPz9cbiIpOworCW11bHRpID0gKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEXzNDT01fM0M1NjIpOworICAgIH0KKyAgICAKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKiBGb3IgdGhlIDNjNTYyLCB0aGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgeHgwMC14eDdmICovCisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBmb3IgKGkgPSBqID0gMDsgaiA8IDB4NDAwOyBqICs9IDB4MTApIHsKKwlpZiAobXVsdGkgJiYgKGogJiAweDgwKSkgY29udGludWU7CisJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7CisJZ290byBmYWlsZWQ7CisgICAgfQorICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisJCisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgRUwzV0lORE9XKDApOworCisgICAgLyogVGhlIDNjNTg5IGhhcyBhbiBleHRyYSBFRVBST00gZm9yIGNvbmZpZ3VyYXRpb24gaW5mbywgaW5jbHVkaW5nCisgICAgICAgdGhlIGhhcmR3YXJlIGFkZHJlc3MuICBUaGUgM2M1NjIgcHV0cyB0aGUgYWRkcmVzcyBpbiB0aGUgQ0lTLiAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODg7CisgICAgaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKwlwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAgIHBoeXNfYWRkcltpXSA9IGh0b25zKGJ1ZltpXSk7CisgICAgfSBlbHNlIHsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCSAgICBwaHlzX2FkZHJbaV0gPSBodG9ucyhyZWFkX2VlcHJvbShpb2FkZHIsIGkpKTsKKwlpZiAocGh5c19hZGRyWzBdID09IDB4NjA2MCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIjNjNTg5X2NzOiBJTyBwb3J0IGNvbmZsaWN0IGF0IDB4JTAzbHgiCisJCSAgICItMHglMDNseFxuIiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+YmFzZV9hZGRyKzE1KTsKKwkgICAgZ290byBmYWlsZWQ7CisJfQorICAgIH0KKworICAgIC8qIFRoZSBhZGRyZXNzIGFuZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFyZW4ndCBsb2FkZWQgZnJvbQorICAgICAgIHRoZSBFRVBST00gYW5kICptdXN0KiBiZSBzZXQgdG8gMCBhbmQgSVJRMyBmb3IgdGhlIFBDTUNJQSB2ZXJzaW9uLiAqLworICAgIG91dHcoMHgzZjAwLCBpb2FkZHIgKyA4KTsKKyAgICBmaWZvID0gaW5sKGlvYWRkcik7CisKKyAgICAvKiBUaGUgaWZfcG9ydCBzeW1ib2wgY2FuIGJlIHNldCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCisgICAgaWYgKChpZl9wb3J0ID49IDApICYmIChpZl9wb3J0IDw9IDMpKQorCWRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisgICAgZWxzZQorCXByaW50ayhLRVJOX0VSUiAiM2M1ODlfY3M6IGludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworICAgIAorICAgIGxpbmstPmRldiA9ICZscC0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX0VSUiAiM2M1ODlfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkobHAtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAzYyVzLCBpbyAlIzNseCwgaXJxICVkLCBod19hZGRyICIsCisJICAgZGV2LT5uYW1lLCAobXVsdGkgPyAiNTYyIiA6ICI1ODkiKSwgZGV2LT5iYXNlX2FkZHIsCisJICAgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAlZEsgRklGTyBzcGxpdCAlcyBSeDpUeCwgJXMgeGN2clxuIiwKKwkgICAoZmlmbyAmIDcpID8gMzIgOiA4LCByYW1fc3BsaXRbKGZpZm8gPj4gMTYpICYgM10sCisJICAgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgdGM1ODlfcmVsZWFzZShsaW5rKTsKKyAgICByZXR1cm47CisgICAgCit9IC8qIHRjNTg5X2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCB0YzU4OV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0YzU4OV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgREVCVUcoMCwgIjNjNTg5X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworICAgIAorICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB0YzU4OV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIAorICAgIERFQlVHKDEsICIzYzU4OV9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisgICAgCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwl0YzU4OV9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQl0YzU4OV9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiB0YzU4OV9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgVXNlIHRoaXMgZm9yIGNvbW1hbmRzIHRoYXQgbWF5IHRha2UgdGltZSB0byBmaW5pc2gKKyovCitzdGF0aWMgdm9pZCB0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpCit7CisgICAgaW50IGkgPSAxMDA7CisgICAgb3V0dyhjbWQsIGRldi0+YmFzZV9hZGRyICsgRUwzX0NNRCk7CisgICAgd2hpbGUgKC0taSA+IDApCisJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiAweDEwMDApKSBicmVhazsKKyAgICBpZiAoaSA9PSAwKQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb21tYW5kIDB4JTA0eCBkaWQgbm90IGNvbXBsZXRlIVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjbWQpOworfQorCisvKgorICBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gdXNpbmcgdGhlIHJlZ3VsYXIgRUVQUk9NIGFjY2VzcyByZWdpc3Rlci4KKyAgQXNzdW1lIHRoYXQgd2UgYXJlIGluIHJlZ2lzdGVyIHdpbmRvdyB6ZXJvLgorKi8KK3N0YXRpYyB1MTYgcmVhZF9lZXByb20oa2lvX2FkZHJfdCBpb2FkZHIsIGludCBpbmRleCkKK3sKKyAgICBpbnQgaTsKKyAgICBvdXR3KEVFUFJPTV9SRUFEICsgaW5kZXgsIGlvYWRkciArIDEwKTsKKyAgICAvKiBSZWFkaW5nIHRoZSBlZXByb20gdGFrZXMgMTYyIHVzICovCisgICAgZm9yIChpID0gMTYyMDsgaSA+PSAwOyBpLS0pCisJaWYgKChpbncoaW9hZGRyICsgMTApICYgRUVQUk9NX0JVU1kpID09IDApCisJICAgIGJyZWFrOworICAgIHJldHVybiBpbncoaW9hZGRyICsgMTIpOworfQorCisvKgorICBTZXQgdHJhbnNjZWl2ZXIgdHlwZSwgcGVyaGFwcyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSB1c2VyCisgIHNwZWNpZmllZCBpbiBkZXYtPmlmX3BvcnQuCisqLworc3RhdGljIHZvaWQgdGM1ODlfc2V0X3hjdnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlmX3BvcnQpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBFTDNXSU5ET1coMCk7CisgICAgc3dpdGNoIChpZl9wb3J0KSB7CisgICAgY2FzZSAwOiBjYXNlIDE6IG91dHcoMCwgaW9hZGRyICsgNik7IGJyZWFrOworICAgIGNhc2UgMjogb3V0dygzPDwxNCwgaW9hZGRyICsgNik7IGJyZWFrOworICAgIGNhc2UgMzogb3V0dygxPDwxNCwgaW9hZGRyICsgNik7IGJyZWFrOworICAgIH0KKyAgICAvKiBPbiBQQ01DSUEsIHRoaXMganVzdCB0dXJucyBvbiB0aGUgTEVEICovCisgICAgb3V0dygoaWZfcG9ydCA9PSAyKSA/IFN0YXJ0Q29heCA6IFN0b3BDb2F4LCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICAvKiAxMGJhc2VUIGludGVyZmFjZSwgZW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGNoZWNrLiAqLworICAgIEVMM1dJTkRPVyg0KTsKKyAgICBvdXR3KE1FRElBX0xFRCB8ICgoaWZfcG9ydCA8IDIpID8gTUVESUFfVFAgOiAwKSwgaW9hZGRyICsgV040X01FRElBKTsKKyAgICBFTDNXSU5ET1coMSk7CisgICAgaWYgKGlmX3BvcnQgPT0gMikKKwlscC0+bWVkaWFfc3RhdHVzID0gKChkZXYtPmlmX3BvcnQgPT0gMCkgPyAweDgwMDAgOiAweDQwMDApOworICAgIGVsc2UKKwlscC0+bWVkaWFfc3RhdHVzID0gKChkZXYtPmlmX3BvcnQgPT0gMCkgPyAweDQwMTAgOiAweDg4MDApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgRUwzV0lORE9XKDEpOworICAgIHByaW50ayhLRVJOX0lORk8gIiAgaXJxIHN0YXR1cyAlMDR4LCByeCBzdGF0dXMgJTA0eCwgdHggc3RhdHVzICIKKwkgICAiJTAyeCAgdHggZnJlZSAlMDR4XG4iLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpLAorCSAgIGludyhpb2FkZHIrUlhfU1RBVFVTKSwgaW5iKGlvYWRkcitUWF9TVEFUVVMpLAorCSAgIGludyhpb2FkZHIrVFhfRlJFRSkpOworICAgIEVMM1dJTkRPVyg0KTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIgIGRpYWdub3N0aWNzOiBmaWZvICUwNHggbmV0ICUwNHggZXRoZXJuZXQgJTA0eCIKKwkgICAiIG1lZGlhICUwNHhcbiIsIGludyhpb2FkZHIrMHgwNCksIGludyhpb2FkZHIrMHgwNiksCisJICAgaW53KGlvYWRkcisweDA4KSwgaW53KGlvYWRkcisweDBhKSk7CisgICAgRUwzV0lORE9XKDEpOworfQorCisvKiBSZXNldCBhbmQgcmVzdG9yZSBhbGwgb2YgdGhlIDNjNTg5IHJlZ2lzdGVycy4gKi8KK3N0YXRpYyB2b2lkIHRjNTg5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBFTDNXSU5ET1coMCk7CisgICAgb3V0dygweDAwMDEsIGlvYWRkciArIDQpOwkJCS8qIEFjdGl2YXRlIGJvYXJkLiAqLyAKKyAgICBvdXR3KDB4M2YwMCwgaW9hZGRyICsgOCk7CQkJLyogU2V0IHRoZSBJUlEgbGluZS4gKi8KKyAgICAKKyAgICAvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyBpbiB3aW5kb3cgMi4gKi8KKyAgICBFTDNXSU5ET1coMik7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCisgICAgdGM1ODlfc2V0X3hjdnIoZGV2LCBkZXYtPmlmX3BvcnQpOworICAgIAorICAgIC8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisgICAgb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworICAgIEVMM1dJTkRPVyg2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCWluYihpb2FkZHIraSk7CisgICAgaW53KGlvYWRkciArIDEwKTsKKyAgICBpbncoaW9hZGRyICsgMTIpOworICAgIAorICAgIC8qIFN3aXRjaCB0byByZWdpc3RlciBzZXQgMSBmb3Igbm9ybWFsIHVzZS4gKi8KKyAgICBFTDNXSU5ET1coMSk7CisKKyAgICAvKiBBY2NlcHQgYi1jYXN0IGFuZCBwaHlzIGFkZHIgb25seS4gKi8KKyAgICBvdXR3KFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhCcm9hZGNhc3QsIGlvYWRkciArIEVMM19DTUQpOworICAgIG91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisgICAgb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisgICAgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEVuYWJsZSB0cmFuc21pdHRlci4gKi8KKyAgICAvKiBBbGxvdyBzdGF0dXMgYml0cyB0byBiZSBzZWVuLiAqLworICAgIG91dHcoU2V0U3RhdHVzRW5iIHwgMHhmZiwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgLyogQWNrIGFsbCBwZW5kaW5nIGV2ZW50cywgYW5kIHNldCBhY3RpdmUgaW5kaWNhdG9yIG1hc2suICovCisgICAgb3V0dyhBY2tJbnRyIHwgSW50TGF0Y2ggfCBUeEF2YWlsYWJsZSB8IFJ4RWFybHkgfCBJbnRSZXEsCisJIGlvYWRkciArIEVMM19DTUQpOworICAgIG91dHcoU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeENvbXBsZXRlIHwgU3RhdHNGdWxsCisJIHwgQWRhcHRlckZhaWx1cmUsIGlvYWRkciArIEVMM19DTUQpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJQQ01DSUEgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBwY19kZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJcGNfZGVidWcgPSBsZXZlbDsKK30KKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworfTsKKworc3RhdGljIGludCBlbDNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICAgIGlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJaWYgKG1hcC0+cG9ydCA8PSAzKSB7CisJICAgIGRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHBvcnRcbiIsCisJCSAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisJICAgIHRjNTg5X3NldF94Y3ZyKGRldiwgZGV2LT5pZl9wb3J0KTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKyAgICAKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4rKzsKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIAorICAgIHRjNTg5X3Jlc2V0KGRldik7CisgICAgaW5pdF90aW1lcigmbHAtPm1lZGlhKTsKKyAgICBscC0+bWVkaWEuZnVuY3Rpb24gPSAmbWVkaWFfY2hlY2s7CisgICAgbHAtPm1lZGlhLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworICAgIGxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmbHAtPm1lZGlhKTsKKworICAgIERFQlVHKDEsICIlczogb3BlbmVkLCBzdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoZGV2LT5iYXNlX2FkZHIgKyBFTDNfU1RBVFVTKSk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVsM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0IVxuIiwgZGV2LT5uYW1lKTsKKyAgICBkdW1wX3N0YXR1cyhkZXYpOworICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAvKiBJc3N1ZSBUWF9SRVNFVCBhbmQgVFhfU1RBUlQgY29tbWFuZHMuICovCisgICAgdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworICAgIG91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcG9wX3R4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisgICAgCisgICAgLyogQ2xlYXIgdGhlIFR4IHN0YXR1cyBzdGFjay4gKi8KKyAgICBmb3IgKGkgPSAzMjsgaSA+IDA7IGktLSkgeworCXVfY2hhciB0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKTsKKwlpZiAoISh0eF9zdGF0dXMgJiAweDg0KSkgYnJlYWs7CisJLyogcmVzZXQgdHJhbnNtaXR0ZXIgb24gamFiYmVyIGVycm9yIG9yIHVuZGVycnVuICovCisJaWYgKHR4X3N0YXR1cyAmIDB4MzApCisJICAgIHRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwlpZiAodHhfc3RhdHVzICYgMHgzOCkgeworCSAgICBERUJVRygxLCAiJXM6IHRyYW5zbWl0IGVycm9yOiBzdGF0dXMgMHglMDJ4XG4iLAorCQkgIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkgICAgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJICAgIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KKwlvdXRiKDB4MDAsIGlvYWRkciArIFRYX1NUQVRVUyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworICAgIH0KK30KKworc3RhdGljIGludCBlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIERFQlVHKDMsICIlczogZWwzX3N0YXJ0X3htaXQobGVuZ3RoID0gJWxkKSBjYWxsZWQsICIKKwkgICJzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIChsb25nKXNrYi0+bGVuLAorCSAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKworICAgIHByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisgICAgLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKyAgICBvdXR3KHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKyAgICBvdXR3KDB4MDAsIGlvYWRkciArIFRYX0ZJRk8pOworICAgIC8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKyAgICBvdXRzbChpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpID4+IDIpOworCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgaWYgKGludyhpb2FkZHIgKyBUWF9GUkVFKSA8PSAxNTM2KSB7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAqLworCW91dHcoU2V0VHhUaHJlc2hvbGQgKyAxNTM2LCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICB9CisKKyAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgcG9wX3R4X3N0YXR1cyhkZXYpOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBUaGUgRUwzIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICBfX3UxNiBzdGF0dXM7CisgICAgaW50IGkgPSAwLCBoYW5kbGVkID0gMTsKKyAgICAKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJcmV0dXJuIElSUV9OT05FOworCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygzLCAiJXM6IGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKworICAgIHNwaW5fbG9jaygmbHAtPmxvY2spOyAgICAKKyAgICB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJgorCShJbnRMYXRjaCB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwpKSB7CisJaWYgKChzdGF0dXMgJiAweGUwMDApICE9IDB4MjAwMCkgeworCSAgICBERUJVRygxLCAiJXM6IGludGVycnVwdCBmcm9tIGRlYWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkgICAgaGFuZGxlZCA9IDA7CisJICAgIGJyZWFrOworCX0KKwkKKwlpZiAoc3RhdHVzICYgUnhDb21wbGV0ZSkKKwkgICAgZWwzX3J4KGRldik7CisJCisJaWYgKHN0YXR1cyAmIFR4QXZhaWxhYmxlKSB7CisJICAgIERFQlVHKDMsICIgICAgVFggcm9vbSBiaXQgd2FzIGhhbmRsZWQuXG4iKTsKKwkgICAgLyogVGhlcmUncyByb29tIGluIHRoZSBGSUZPIGZvciBhIGZ1bGwtc2l6ZWQgcGFja2V0LiAqLworCSAgICBvdXR3KEFja0ludHIgfCBUeEF2YWlsYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJCisJaWYgKHN0YXR1cyAmIFR4Q29tcGxldGUpCisJICAgIHBvcF90eF9zdGF0dXMoZGV2KTsKKworCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsKSkgeworCSAgICAvKiBIYW5kbGUgYWxsIHVuY29tbW9uIGludGVycnVwdHMuICovCisJICAgIGlmIChzdGF0dXMgJiBTdGF0c0Z1bGwpCQkvKiBFbXB0eSBzdGF0aXN0aWNzLiAqLworCQl1cGRhdGVfc3RhdHMoZGV2KTsKKwkgICAgaWYgKHN0YXR1cyAmIFJ4RWFybHkpIHsJCS8qIFJ4IGVhcmx5IGlzIHVudXNlZC4gKi8KKwkJZWwzX3J4KGRldik7CisJCW91dHcoQWNrSW50ciB8IFJ4RWFybHksIGlvYWRkciArIEVMM19DTUQpOworCSAgICB9CisJICAgIGlmIChzdGF0dXMgJiBBZGFwdGVyRmFpbHVyZSkgeworCQl1MTYgZmlmb19kaWFnOworCQlFTDNXSU5ET1coNCk7CisJCWZpZm9fZGlhZyA9IGludyhpb2FkZHIgKyA0KTsKKwkJRUwzV0lORE9XKDEpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWRhcHRlciBmYWlsdXJlLCBGSUZPIGRpYWdub3N0aWMiCisJCSAgICAgICAiIHJlZ2lzdGVyICUwNHguXG4iLCBkZXYtPm5hbWUsIGZpZm9fZGlhZyk7CisJCWlmIChmaWZvX2RpYWcgJiAweDA0MDApIHsKKwkJICAgIC8qIFR4IG92ZXJydW4gKi8KKwkJICAgIHRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwkJICAgIG91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCWlmIChmaWZvX2RpYWcgJiAweDIwMDApIHsKKwkJICAgIC8qIFJ4IHVuZGVycnVuICovCisJCSAgICB0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhSZXNldCk7CisJCSAgICBzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJICAgIG91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCW91dHcoQWNrSW50ciB8IEFkYXB0ZXJGYWlsdXJlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkgICAgfQorCX0KKwkKKwlpZiAoKytpID4gMTApIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogaW5maW5pdGUgbG9vcCBpbiBpbnRlcnJ1cHQsICIKKwkJICAgInN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkgICAgLyogQ2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwkgICAgb3V0dyhBY2tJbnRyIHwgMHhGRiwgaW9hZGRyICsgRUwzX0NNRCk7CisJICAgIGJyZWFrOworCX0KKwkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCW91dHcoQWNrSW50ciB8IEludFJlcSB8IEludExhdGNoLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICB9CisKKyAgICBscC0+bGFzdF9pcnEgPSBqaWZmaWVzOworICAgIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7ICAgIAorICAgIERFQlVHKDMsICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJICBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikoYXJnKTsKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiBtZWRpYSwgZXJyczsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSBnb3RvIHJlc2NoZWR1bGU7CisKKyAgICBFTDNXSU5ET1coMSk7CisgICAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggZXhwaXJlZCBsYXRlbmN5IHRpbWVyOiB3aXRoCisgICAgICAgdGhpcywgd2UgY2FuIGxpbXAgYWxvbmcgZXZlbiBpZiB0aGUgaW50ZXJydXB0IGlzIGJsb2NrZWQgKi8KKyAgICBpZiAoKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIEludExhdGNoKSAmJgorCShpbmIoaW9hZGRyICsgRUwzX1RJTUVSKSA9PSAweGZmKSkgeworCWlmICghbHAtPmZhc3RfcG9sbCkKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwllbDNfaW50ZXJydXB0KGRldi0+aXJxLCBscCwgTlVMTCk7CisJbHAtPmZhc3RfcG9sbCA9IEhaOworICAgIH0KKyAgICBpZiAobHAtPmZhc3RfcG9sbCkgeworCWxwLT5mYXN0X3BvbGwtLTsKKwlscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDA7CisJYWRkX3RpbWVyKCZscC0+bWVkaWEpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBscC0+bG9jayBndWFyZHMgdGhlIEVMMyB3aW5kb3cuIFdpbmRvdyBzaG91bGQgYWx3YXlzIGJlIDEgZXhjZXB0CisgICAgICAgd2hlbiB0aGUgbG9jayBpcyBoZWxkICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7ICAgIAorICAgIEVMM1dJTkRPVyg0KTsKKyAgICBtZWRpYSA9IGludyhpb2FkZHIrV040X01FRElBKSAmIDB4YzgxMDsKKworICAgIC8qIElnbm9yZSBjb2xsaXNpb25zIHVubGVzcyB3ZSd2ZSBoYWQgbm8gaXJxJ3MgcmVjZW50bHkgKi8KKyAgICBpZiAoamlmZmllcyAtIGxwLT5sYXN0X2lycSA8IEhaKSB7CisJbWVkaWEgJj0gfjB4MDAxMDsKKyAgICB9IGVsc2UgeworCS8qIFRyeSBoYXJkZXIgdG8gZGV0ZWN0IGNhcnJpZXIgZXJyb3JzICovCisJRUwzV0lORE9XKDYpOworCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllcnJzID0gaW5iKGlvYWRkciArIDApOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBlcnJzOworCWlmIChlcnJzIHx8IChscC0+bWVkaWFfc3RhdHVzICYgMHgwMDEwKSkgbWVkaWEgfD0gMHgwMDEwOworICAgIH0KKworICAgIGlmIChtZWRpYSAhPSBscC0+bWVkaWFfc3RhdHVzKSB7CisJaWYgKChtZWRpYSAmIGxwLT5tZWRpYV9zdGF0dXMgJiAweDgwMDApICYmCisJICAgICgobHAtPm1lZGlhX3N0YXR1cyBeIG1lZGlhKSAmIDB4MDgwMCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJICAgKGxwLT5tZWRpYV9zdGF0dXMgJiAweDA4MDAgPyAibG9zdCIgOiAiZm91bmQiKSk7CisJZWxzZSBpZiAoKG1lZGlhICYgbHAtPm1lZGlhX3N0YXR1cyAmIDB4NDAwMCkgJiYKKwkJICgobHAtPm1lZGlhX3N0YXR1cyBeIG1lZGlhKSAmIDB4MDAxMCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBjb2F4IGNhYmxlICVzXG4iLCBkZXYtPm5hbWUsCisJCSAgIChscC0+bWVkaWFfc3RhdHVzICYgMHgwMDEwID8gIm9rIiA6ICJwcm9ibGVtIikpOworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkgeworCSAgICBpZiAobWVkaWEgJiAweDgwMDApIHsKKwkJaWYgKG1lZGlhICYgMHgwODAwKQorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZsaXBwZWQgdG8gMTBiYXNlVFxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJCWVsc2UKKwkJICAgIHRjNTg5X3NldF94Y3ZyKGRldiwgMik7CisJICAgIH0gZWxzZSBpZiAobWVkaWEgJiAweDQwMDApIHsKKwkJaWYgKG1lZGlhICYgMHgwMDEwKQorCQkgICAgdGM1ODlfc2V0X3hjdnIoZGV2LCAxKTsKKwkJZWxzZQorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZsaXBwZWQgdG8gMTBiYXNlMlxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJICAgIH0KKwl9CisJbHAtPm1lZGlhX3N0YXR1cyA9IG1lZGlhOworICAgIH0KKyAgICAKKyAgICBFTDNXSU5ET1coMSk7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsgICAgCisKK3Jlc2NoZWR1bGU6CisgICAgbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZscC0+bWVkaWEpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgICBpZiAoREVWX09LKGxpbmspKSB7CisgICAgCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXVwZGF0ZV9zdGF0cyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICBVcGRhdGUgc3RhdGlzdGljcy4gIFdlIGNoYW5nZSB0byByZWdpc3RlciB3aW5kb3cgNiwgc28gdGhpcyBzaG91bGQgYmUgcnVuCisgIHNpbmdsZS10aHJlYWRlZCBpZiB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4gVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIHJhcmUKKyAgb3BlcmF0aW9uLCBhbmQgaXQncyBzaW1wbGVyIGZvciB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIHRvIGFzc3VtZSB0aGF0CisgIHdpbmRvdyAxIGlzIGFsd2F5cyB2YWxpZCByYXRoZXIgdGhhbiB1c2UgYSBzcGVjaWFsIHdpbmRvdy1zdGF0ZSB2YXJpYWJsZS4KKyAgCisgIENhbGxlciBtdXN0IGhvbGQgdGhlIGxvY2sgZm9yIHRoaXMKKyovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMiwgIiVzOiB1cGRhdGluZyB0aGUgc3RhdGlzdGljcy5cbiIsIGRldi0+bmFtZSk7CisgICAgLyogVHVybiBvZmYgc3RhdGlzdGljcyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisgICAgb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworICAgIC8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgcmVhZCBldmVyeXRoaW5nLiAqLworICAgIEVMM1dJTkRPVyg2KTsKKyAgICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgCSs9IGluYihpb2FkZHIgKyAwKTsKKyAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycwkrPSBpbmIoaW9hZGRyICsgMSk7CisgICAgLyogTXVsdGlwbGUgY29sbGlzaW9ucy4gKi8JICAgCWluYihpb2FkZHIgKyAyKTsKKyAgICBscC0+c3RhdHMuY29sbGlzaW9ucwkJKz0gaW5iKGlvYWRkciArIDMpOworICAgIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgNCk7CisgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgNSk7CisgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMJCSs9IGluYihpb2FkZHIgKyA2KTsKKyAgICAvKiBSeCBwYWNrZXRzICAgKi8JCQlpbmIoaW9hZGRyICsgNyk7CisgICAgLyogVHggZGVmZXJyYWxzICovCQkJaW5iKGlvYWRkciArIDgpOworICAgIC8qIFJ4IG9jdGV0cyAqLwkJCWludyhpb2FkZHIgKyAxMCk7CisgICAgLyogVHggb2N0ZXRzICovCQkJaW53KGlvYWRkciArIDEyKTsKKyAgICAKKyAgICAvKiBCYWNrIHRvIHdpbmRvdyAxLCBhbmQgdHVybiBzdGF0aXN0aWNzIGJhY2sgb24uICovCisgICAgRUwzV0lORE9XKDEpOworICAgIG91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworfQorCitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHdvcmtsaW1pdCA9IDMyOworICAgIHNob3J0IHJ4X3N0YXR1czsKKyAgICAKKyAgICBERUJVRygzLCAiJXM6IGluIHJ4X3BhY2tldCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJICBkZXYtPm5hbWUsIGludyhpb2FkZHIrRUwzX1NUQVRVUyksIGludyhpb2FkZHIrUlhfU1RBVFVTKSk7CisgICAgd2hpbGUgKCEoKHJ4X3N0YXR1cyA9IGludyhpb2FkZHIgKyBSWF9TVEFUVVMpKSAmIDB4ODAwMCkgJiYKKwkgICAoLS13b3JrbGltaXQgPj0gMCkpIHsKKwlpZiAocnhfc3RhdHVzICYgMHg0MDAwKSB7IC8qIEVycm9yLCB1cGRhdGUgc3RhdHMuICovCisJICAgIHNob3J0IGVycm9yID0gcnhfc3RhdHVzICYgMHgzODAwOworCSAgICBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIHN3aXRjaCAoZXJyb3IpIHsKKwkgICAgY2FzZSAweDAwMDA6CWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOyBicmVhazsKKwkgICAgY2FzZSAweDA4MDA6CWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCSAgICBjYXNlIDB4MTAwMDoJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkgICAgY2FzZSAweDE4MDA6CWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCSAgICBjYXNlIDB4MjAwMDoJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkgICAgY2FzZSAweDI4MDA6CWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7IGJyZWFrOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgc2hvcnQgcGt0X2xlbiA9IHJ4X3N0YXR1cyAmIDB4N2ZmOworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCSAgICAKKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzUpOworCSAgICAKKwkgICAgREVCVUcoMywgIiAgICBSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJICBwa3RfbGVuLCByeF9zdGF0dXMpOworCSAgICBpZiAoc2tiICE9IE5VTEwpIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCWluc2woaW9hZGRyK1JYX0ZJRk8sIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCShwa3RfbGVuKzMpPj4yKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJICAgIH0gZWxzZSB7CisJCURFQlVHKDEsICIlczogY291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIgorCQkgICAgICAiIHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCSAgICB9CisJfQorCS8qIFBvcCB0aGUgdG9wIG9mIHRoZSBSeCBGSUZPICovCisJdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4RGlzY2FyZCk7CisgICAgfQorICAgIGlmICh3b3JrbGltaXQgPT0gMCkKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdG9vIG11Y2ggd29yayBpbiBlbDNfcnghXG4iLCBkZXYtPm5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IG9wdHMgPSBTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0OworCisgICAgaWYgKCEoREVWX09LKGxpbmspKSkgcmV0dXJuOworICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJb3B0cyB8PSBSeE11bHRpY2FzdCB8IFJ4UHJvbTsKKyAgICBlbHNlIGlmIChkZXYtPm1jX2NvdW50IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkKKwlvcHRzIHw9IFJ4TXVsdGljYXN0OworICAgIG91dHcob3B0cywgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIERFQlVHKDEsICIlczogc2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisgICAgaWYgKERFVl9PSyhsaW5rKSkgeworCS8qIFR1cm4gb2ZmIHN0YXRpc3RpY3MgQVNBUC4gIFdlIHVwZGF0ZSBscC0+c3RhdHMgYmVsb3cuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCQorCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlci4gKi8KKwlvdXR3KFJ4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhUeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCQorCWlmIChkZXYtPmlmX3BvcnQgPT0gMikKKwkgICAgLyogVHVybiBvZmYgdGhpbm5ldCBwb3dlci4gIEdyZWVuISAqLworCSAgICBvdXR3KFN0b3BDb2F4LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gMSkgeworCSAgICAvKiBEaXNhYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyICovCisJICAgIEVMM1dJTkRPVyg0KTsKKwkgICAgb3V0dygwLCBpb2FkZHIgKyBXTjRfTUVESUEpOworCX0KKwkKKwkvKiBTd2l0Y2hpbmcgYmFjayB0byB3aW5kb3cgMCBkaXNhYmxlcyB0aGUgSVJRLiAqLworCUVMM1dJTkRPVygwKTsKKwkvKiBCdXQgd2UgZXhwbGljaXRseSB6ZXJvIHRoZSBJUlEgbGluZSBzZWxlY3QgYW55d2F5LiAqLworCW91dHcoMHgwZjAwLCBpb2FkZHIgKyBXTjBfSVJRKTsKKyAgICAgICAgCisJLyogQ2hlY2sgaWYgdGhlIGNhcmQgc3RpbGwgZXhpc3RzICovCisJaWYgKChpbncoaW9hZGRyK0VMM19TVEFUVVMpICYgMHhlMDAwKSA9PSAweDIwMDApCisJICAgIHVwZGF0ZV9zdGF0cyhkZXYpOworICAgIH0KKworICAgIGxpbmstPm9wZW4tLTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgZGVsX3RpbWVyX3N5bmMoJmxwLT5tZWRpYSk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB0YzU4OV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICIzYzU4OV9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHRjNTg5X2F0dGFjaCwKKwkuZGV0YWNoCQk9IHRjNTg5X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdGM1ODkodm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmdGM1ODlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdGM1ODkodm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnRjNTg5X2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X3RjNTg5KTsKK21vZHVsZV9leGl0KGV4aXRfdGM1ODkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL25ldC9wY21jaWEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY4NjIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL0tjb25maWcKQEAgLTAsMCArMSwxMzIgQEAKKyMKKyMgUENNQ0lBIE5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBDTUNJQSE9bgorCitjb25maWcgTkVUX1BDTUNJQQorCWJvb2wgIlBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgYW55IFBDTUNJQSBvciBDYXJkQnVzCisJICBuZXR3b3JrIGFkYXB0ZXJzLCB0aGVuIHNheSBZIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIgcGFydGljdWxhciBjYXJkCisJICBiZWxvdy4gIFBDTUNJQS0gb3IgUEMtY2FyZHMgYXJlIGNyZWRpdC1jYXJkIHNpemUgZGV2aWNlcyBvZnRlbiB1c2VkCisJICB3aXRoIGxhcHRvcHMgY29tcHV0ZXJzOyBDYXJkQnVzIGlzIHRoZSBuZXdlciBhbmQgZmFzdGVyIHZlcnNpb24gb2YKKwkgIFBDTUNJQS4KKworCSAgVG8gdXNlIHlvdXIgUEMtY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIERhdmlkCisJICBIaW5kcycgcGNtY2lhLWNzIHBhY2thZ2UgKHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+CisJICBmb3IgbG9jYXRpb24pLiAgWW91IGFsc28gd2FudCB0byBjaGVjayBvdXQgdGhlIFBDTUNJQS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfM0M1ODkKKwl0cmlzdGF0ZSAiM0NvbSAzYzU4OSBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIDNDb20gM2M1ODkgb3IgY29tcGF0aWJsZSBQQ01DSUEKKwkgIChQQy1jYXJkKSBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIDNjNTg5X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV8zQzU3NAorCXRyaXN0YXRlICIzQ29tIDNjNTc0IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgM0NvbSAzYzU3NCBvciBjb21wYXRpYmxlIFBDTUNJQQorCSAgKFBDLWNhcmQpIEZhc3QgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCAzYzU3NF9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfRk1WSjE4WAorCXRyaXN0YXRlICJGdWppdHN1IEZNVi1KMTh4IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgRnVqaXRzdSBGTVYtSjE4eCBvciBjb21wYXRpYmxlCisJICBQQ01DSUEgKFBDLWNhcmQpIEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZm12ajE4eF9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfUENORVQKKwl0cmlzdGF0ZSAiTkUyMDAwIGNvbXBhdGlibGUgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gTkUyMDAwIGNvbXBhdGlibGUgUENNQ0lBCisJICAoUEMtY2FyZCkgRXRoZXJuZXQgb3IgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHBjbmV0X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9OTUNMQU4KKwl0cmlzdGF0ZSAiTmV3IE1lZGlhIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgTmV3IE1lZGlhIEV0aGVybmV0IG9yIExpdmVXaXJlCisJICBQQ01DSUEgKFBDLWNhcmQpIEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgbm1jbGFuX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9TTUM5MUM5MgorCXRyaXN0YXRlICJTTUMgOTFDeHggUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIFNNQyA5MUN4eCBjb21wYXRpYmxlIFBDTUNJQQorCSAgKFBDLWNhcmQpIEV0aGVybmV0IG9yIEZhc3QgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBzbWM5MWM5Ml9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfWElSQzJQUworCXRyaXN0YXRlICJYaXJjb20gMTYtYml0IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgWGlyY29tIDE2LWJpdCBQQ01DSUEgKFBDLWNhcmQpCisJICBFdGhlcm5ldCBvciBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgeGlyYzJwc19jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfQVhORVQKKwl0cmlzdGF0ZSAiQXNpeCBBWDg4MTkwIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEFzaXggQVg4ODE5MC1iYXNlZCBQQ01DSUEKKwkgIChQQy1jYXJkKSBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4gIFRoZXNlIGNhcmRzIGFyZQorCSAgbmVhcmx5IE5FMjAwMCBjb21wYXRpYmxlIGJ1dCBuZWVkIGEgc2VwYXJhdGUgZHJpdmVyIGR1ZSB0byBhIGZldworCSAgbWlzZmVhdHVyZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGF4bmV0X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFSQ05FVF9DT00yMDAyMF9DUworCXRyaXN0YXRlICJDT00yMDAyMCBBUkNuZXQgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIEFSQ05FVF9DT00yMDAyMCAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBBUkNuZXQgUENNQ0lBIGNhcmQKKwkgIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGNvbTIwMDIwX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9JQk1UUgorCXRyaXN0YXRlICJJQk0gUENNQ0lBIHRva2VucmluZyBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIElCTVRSIT15ICYmIFRSICYmIFBDTUNJQSAmJiAhNjRCSVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBUb2tlbiBSaW5nIFBDTUNJQQorCSAgY2FyZCB0byB5b3VyIGNvbXB1dGVyLiBZb3UgdGhlbiBhbHNvIG5lZWQgdG8gc2F5IFkgdG8gIlRva2VuIFJpbmcKKwkgIGRyaXZlciBzdXBwb3J0Ii4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaWJtdHJfY3MuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcGNtY2lhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDJkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFBDTUNJQSBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorIworCisjIDE2LWJpdCBjbGllbnQgZHJpdmVycworb2JqLSQoQ09ORklHX1BDTUNJQV8zQzU4OSkJKz0gM2M1ODlfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV8zQzU3NCkJKz0gM2M1NzRfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9GTVZKMThYKQkrPSBmbXZqMTh4X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfTk1DTEFOKQkrPSBubWNsYW5fY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9QQ05FVCkJKz0gcGNuZXRfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9TTUM5MUM5MikJKz0gc21jOTFjOTJfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9YSVJDMlBTKQkrPSB4aXJjMnBzX2NzLm8KK29iai0kKENPTkZJR19BUkNORVRfQ09NMjAwMjBfQ1MpKz0gY29tMjAwMjBfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9BWE5FVCkJKz0gYXhuZXRfY3MubworCitvYmotJChDT05GSUdfUENNQ0lBX0lCTVRSKQkrPSBpYm10cl9jcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2I1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwpAQCAtMCwwICsxLDE4NjQgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciBBc2l4IEFYODgxOTAtYmFzZWQgY2FyZHMKKworICAgIFRoZSBBc2l4IEFYODgxOTAgaXMgYSBOUzgzOTAtZGVyaXZlZCBjaGlwc2V0IHdpdGggYSBmZXcgbmFzdHkKKyAgICBpZGlvc3luY3JhY2llcyB0aGF0IG1ha2UgaXQgdmVyeSBpbmNvbnZlbmllbnQgdG8gc3VwcG9ydCB3aXRoIGEKKyAgICBzdGFuZGFyZCA4MzkwIGRyaXZlci4gIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHBjbmV0X2NzLCB3aXRoIHRoZQorICAgIHR3ZWFrZWQgODM5MCBjb2RlIGdyYWZ0ZWQgb24gdGhlIGVuZC4gIE11Y2ggb2Ygd2hhdCBJIGRpZCB3YXMgdG8KKyAgICBjbGVhbiB1cCBhbmQgdXBkYXRlIGEgc2ltaWxhciBkcml2ZXIgc3VwcGxpZWQgYnkgQXNpeCwgd2hpY2ggd2FzCisgICAgYWRhcHRlZCBieSBXaWxsaWFtIExlZSwgd2lsbGlhbUBhc2l4LmNvbS50dy4KKworICAgIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBIaW5kcyAtLSBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCisgICAgYXhuZXRfY3MuYyAxLjI4IDIwMDIvMDYvMjkgMDY6Mjc6MzcKKworICAgIFRoZSBuZXR3b3JrIGRyaXZlciBjb2RlIGlzIGJhc2VkIG9uIERvbmFsZCBCZWNrZXIncyBORTIwMDAgY29kZToKKworICAgIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgIERvbmFsZCBCZWNrZXIgbWF5IGJlIHJlYWNoZWQgYXQgYmVja2VyQHNjeWxkLmNvbQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgIi4uLzgzOTAuaCIKKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIEFYTkVUX0NNRAkweDAwCisjZGVmaW5lIEFYTkVUX0RBVEFQT1JUCTB4MTAJLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KKyNkZWZpbmUgQVhORVRfUkVTRVQJMHgxZgkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIEFYTkVUX01JSV9FRVAJMHgxNAkvKiBPZmZzZXQgb2YgTUlJIGFjY2VzcyBwb3J0ICovCisjZGVmaW5lIEFYTkVUX1RFU1QJMHgxNQkvKiBPZmZzZXQgb2YgVEVTVCBSZWdpc3RlciBwb3J0ICovCisjZGVmaW5lIEFYTkVUX0dQSU8JMHgxNwkvKiBPZmZzZXQgb2YgR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIFBvcnQgKi8KKworI2RlZmluZSBBWE5FVF9TVEFSVF9QRwkweDQwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIEFYTkVUX1NUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCisjZGVmaW5lIEFYTkVUX1JEQ19USU1FT1VUIDB4MDIJLyogTWF4IHdhaXQgaW4gamlmZmllcyBmb3IgVHggUkRDICovCisKKyNkZWZpbmUgSVNfQVg4ODE5MAkweDAwMDEKKyNkZWZpbmUgSVNfQVg4ODc5MAkweDAwMDIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXNpeCBBWDg4MTkwIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImF4bmV0X2NzLmMgMS4yOCAyMDAyLzA2LzI5IDA2OjI3OjM3IChEYXZpZCBIaW5kcykiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXhuZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgYXhuZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgYXhuZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBpbnQgYXhuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXhuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGF4bmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaXJxcmV0dXJuX3QgZWlfaXJxX3dyYXBwZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBlaV93YXRjaGRvZyh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGF4bmV0X3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYyk7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKTsKKworc3RhdGljIHZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkgc3RydWN0IGU4MzkwX3BrdF9oZHIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCXN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJIGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKK3N0YXRpYyBkZXZfbGlua190ICpheG5ldF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBheG5ldF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiYXhuZXRfY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCitzdGF0aWMgdm9pZCBheGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIEFYODgxOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKTsKK3N0YXRpYyBpbnQgYXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgYXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgYXhuZXRfZGV2X3QgeworICAgIGRldl9saW5rX3QJCWxpbms7CisgICAgZGV2X25vZGVfdAkJbm9kZTsKKyAgICBjYWRkcl90CQliYXNlOworICAgIHN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOworICAgIGludAkJCXN0YWxlLCBmYXN0X3BvbGw7CisgICAgdV9zaG9ydAkJbGlua19zdGF0dXM7CisgICAgdV9jaGFyCQlkdXBsZXhfZmxhZzsKKyAgICBpbnQJCQlwaHlfaWQ7CisgICAgaW50CQkJZmxhZ3M7Cit9IGF4bmV0X2Rldl90OworCitzdGF0aWMgaW5saW5lIGF4bmV0X2Rldl90ICpQUklWKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCAqcCA9IChjaGFyICopbmV0ZGV2X3ByaXYoZGV2KSArIHNpemVvZihzdHJ1Y3QgZWlfZGV2aWNlKTsKKwlyZXR1cm4gcDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBheG5ldF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICpheG5ldF9hdHRhY2godm9pZCkKK3sKKyAgICBheG5ldF9kZXZfdCAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKworICAgIERFQlVHKDAsICJheG5ldF9hdHRhY2goKVxuIik7CisKKyAgICBkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpICsgc2l6ZW9mKGF4bmV0X2Rldl90KSwKKwkJCSJldGglZCIsIGF4ZGV2X3NldHVwKTsKKworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworCisgICAgaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBsaW5rID0gJmluZm8tPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgICAgZGV2LT5vcGVuID0gJmF4bmV0X29wZW47CisgICAgZGV2LT5zdG9wID0gJmF4bmV0X2Nsb3NlOworICAgIGRldi0+ZG9faW9jdGwgPSAmYXhuZXRfaW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF4bmV0X2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJYXhuZXRfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiBheG5ldF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXhuZXRfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgImF4bmV0X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlheG5ldF9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIGF4bmV0X2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgcHJvYmVzIGZvciBhIGNhcmQncyBoYXJkd2FyZSBhZGRyZXNzIGJ5IHJlYWRpbmcgdGhlIFBST00uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGdldF9wcm9tKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFRoaXMgaXMgYmFzZWQgb24gZHJpdmVycy9uZXQvbmUuYyAqLworICAgIHN0cnVjdCB7CisJdV9jaGFyIHZhbHVlLCBvZmZzZXQ7CisgICAgfSBwcm9ncmFtX3NlcVtdID0geworCXtFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBFODM5MF9DTUR9LCAvKiBTZWxlY3QgcGFnZSAwKi8KKwl7MHgwMSwJRU4wX0RDRkd9LAkvKiBTZXQgd29yZC13aWRlIGFjY2Vzcy4gKi8KKwl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCXsweDAwLAlFTjBfUkNOVEhJfSwKKwl7MHgwMCwJRU4wX0lNUn0sCS8qIE1hc2sgY29tcGxldGlvbiBpcnEuICovCisJezB4RkYsCUVOMF9JU1J9LAorCXtFODM5MF9SWE9GRnwweDQwLCBFTjBfUlhDUn0sCS8qIDB4NjAgIFNldCB0byBtb25pdG9yICovCisJe0U4MzkwX1RYT0ZGLCBFTjBfVFhDUn0sCS8qIDB4MDIgIGFuZCBsb29wYmFjayBtb2RlLiAqLworCXsweDEwLAlFTjBfUkNOVExPfSwKKwl7MHgwMCwJRU4wX1JDTlRISX0sCisJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwNDAwLiAqLworCXsweDA0LAlFTjBfUlNBUkhJfSwKKwl7RTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIEU4MzkwX0NNRH0sCisgICAgfTsKKworICAgIC8qIE5vdCBtdWNoIG9mIGEgdGVzdCwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgYXJlIG1lc3N5ICovCisgICAgaWYgKGxpbmstPmNvbmYuQ29uZmlnQmFzZSAhPSAweDAzYzApCisJcmV0dXJuIDA7CisKKyAgICBheG5ldF9yZXNldF84MzkwKGRldik7CisgICAgbWRlbGF5KDEwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwlvdXRiX3AocHJvZ3JhbV9zZXFbaV0udmFsdWUsIGlvYWRkciArIHByb2dyYW1fc2VxW2ldLm9mZnNldCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJaiA9IGludyhpb2FkZHIgKyBBWE5FVF9EQVRBUE9SVCk7CisJZGV2LT5kZXZfYWRkcltpXSA9IGogJiAweGZmOworCWRldi0+ZGV2X2FkZHJbaSsxXSA9IGogPj4gODsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9IC8qIGdldF9wcm9tICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgYXhuZXRfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgICAgZXRoZXJuZXQgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IHRyeV9pb19wb3J0KGRldl9saW5rX3QgKmxpbmspCit7CisgICAgaW50IGosIHJldDsKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMxID09IDMyKSB7CisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyID4gMCkgeworCSAgICAvKiBmb3IgbWFzdGVyL3NsYXZlIG11bHRpZnVuY3Rpb24gY2FyZHMgKi8KKwkgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSAKKwkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisJfQorICAgIH0gZWxzZSB7CisJLyogVGhpcyBzaG91bGQgYmUgdHdvIDE2LXBvcnQgd2luZG93cyAqLworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgfQorICAgIGlmIChsaW5rLT5pby5CYXNlUG9ydDEgPT0gMCkgeworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisJZm9yIChqID0gMDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDIgPSAoaiBeIDB4MzAwKSArIDB4MTA7CisJICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKHJldCA9PSBDU19TVUNDRVNTKSByZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF4bmV0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBpLCBqLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAgICB1X3Nob3J0IGJ1Zls2NF07CisgICAgY29uZmlnX2luZm9fdCBjb25mOworCisgICAgREVCVUcoMCwgImF4bmV0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgLyogZG9uJ3QgdHJ1c3QgdGhlIENJUyBvbiB0aGlzOyBMaW5rc3lzIGdvdCBpdCB3cm9uZyAqLworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IDB4NjM7CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKiBMb29rIHVwIGN1cnJlbnQgVmNjICovCisgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHdoaWxlIChsYXN0X3JldCA9PSBDU19TVUNDRVNTKSB7CisJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKKwljaXN0cGxfaW9fdCAqaW8gPSAmKHBhcnNlLmNmdGFibGVfZW50cnkuaW8pOworCQorCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDAgfHwKKwkJY2ZnLT5pbmRleCA9PSAwIHx8IGNmZy0+aW8ubndpbiA9PSAwKQorCSAgICBnb3RvIG5leHRfZW50cnk7CisJCisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4MDU7CisJLyogRm9yIG11bHRpZnVuY3Rpb24gY2FyZHMsIGJ5IGNvbnZlbnRpb24sIHdlIGNvbmZpZ3VyZSB0aGUKKwkgICBuZXR3b3JrIGZ1bmN0aW9uIHdpdGggd2luZG93IDAsIGFuZCBzZXJpYWwgd2l0aCB3aW5kb3cgMSAqLworCWlmIChpby0+bndpbiA+IDEpIHsKKwkgICAgaSA9IChpby0+d2luWzFdLmxlbiA+IGlvLT53aW5bMF0ubGVuKTsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxLWldLmJhc2U7CisJICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMS1pXS5sZW47CisJfSBlbHNlIHsKKwkgICAgaSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJfQorCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5baV0uYmFzZTsKKwlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luW2ldLmxlbjsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEgKyBsaW5rLT5pby5OdW1Qb3J0czIgPj0gMzIpIHsKKwkgICAgbGFzdF9yZXQgPSB0cnlfaW9fcG9ydChsaW5rKTsKKwkgICAgaWYgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKyAgICBuZXh0X2VudHJ5OgorCWxhc3RfcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB9CisgICAgaWYgKGxhc3RfcmV0ICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihoYW5kbGUsIFJlcXVlc3RJTywgbGFzdF9yZXQpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICAKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyID09IDgpIHsKKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworICAgIH0KKyAgICAKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBpZiAoIWdldF9wcm9tKGxpbmspKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJheG5ldF9jczogdGhpcyBpcyBub3QgYW4gQVg4ODE5MCBjYXJkIVxuIik7CisJcHJpbnRrKEtFUk5fTk9USUNFICJheG5ldF9jczogdXNlIHBjbmV0X2NzIGluc3RlYWQuXG4iKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBlaV9zdGF0dXMubmFtZSA9ICJBWDg4MTkwIjsKKyAgICBlaV9zdGF0dXMud29yZDE2ID0gMTsKKyAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IEFYTkVUX1NUQVJUX1BHOworICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gQVhORVRfU1RBUlRfUEcgKyBUWF9QQUdFUzsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gQVhORVRfU1RPUF9QRzsKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZheG5ldF9yZXNldF84MzkwOworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZ2V0XzgzOTBfaGRyOworICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZibG9ja19pbnB1dDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmJsb2NrX291dHB1dDsKKworICAgIGlmIChpbmIoZGV2LT5iYXNlX2FkZHIgKyBBWE5FVF9URVNUKSAhPSAwKQorCWluZm8tPmZsYWdzIHw9IElTX0FYODg3OTA7CisgICAgZWxzZQorCWluZm8tPmZsYWdzIHw9IElTX0FYODgxOTA7CisKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBJU19BWDg4NzkwKQorCW91dGIoMHgxMCwgZGV2LT5iYXNlX2FkZHIgKyBBWE5FVF9HUElPKTsgIC8qIHNlbGVjdCBJbnRlcm5hbCBQSFkgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJaiA9IG1kaW9fcmVhZChkZXYtPmJhc2VfYWRkciArIEFYTkVUX01JSV9FRVAsIGksIDEpOworCWlmICgoaiAhPSAwKSAmJiAoaiAhPSAweGZmZmYpKSBicmVhazsKKyAgICB9CisKKyAgICAvKiBNYXliZSBQSFkgaXMgaW4gcG93ZXIgZG93biBtb2RlLiAoUFBEX1NFVCA9IDEpIAorICAgICAgIEJpdCAyIG9mIENDU1IgaXMgYWN0aXZlIGxvdy4gKi8gCisgICAgaWYgKGkgPT0gMzIpIHsKKwljb25mX3JlZ190IHJlZyA9IHsgMCwgQ1NfV1JJVEUsIENJU1JFR19DQ1NSLCAweDA0IH07CisgCXBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJICAgIGogPSBtZGlvX3JlYWQoZGV2LT5iYXNlX2FkZHIgKyBBWE5FVF9NSUlfRUVQLCBpLCAxKTsKKwkgICAgaWYgKChqICE9IDApICYmIChqICE9IDB4ZmZmZikpIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBpbmZvLT5waHlfaWQgPSAoaSA8IDMyKSA/IGkgOiAtMTsKKyAgICBsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX05PVElDRSAiYXhuZXRfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkoaW5mby0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBc2l4IEFYODglZDkwOiBpbyAlIzNseCwgaXJxICVkLCBod19hZGRyICIsCisJICAgZGV2LT5uYW1lLCAoKGluZm8tPmZsYWdzICYgSVNfQVg4ODc5MCkgPyA3IDogMSksCisJICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworICAgIGlmIChpbmZvLT5waHlfaWQgIT0gLTEpIHsKKwlERUJVRygwLCAiICBNSUkgdHJhbnNjZWl2ZXIgYXQgaW5kZXggJWQsIHN0YXR1cyAleC5cbiIsIGluZm8tPnBoeV9pZCwgaik7CisgICAgfSBlbHNlIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiAgTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOworICAgIH0KKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBheG5ldF9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcmV0dXJuOworfSAvKiBheG5ldF9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYXhuZXRfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBheG5ldF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgREVCVUcoMCwgImF4bmV0X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBheG5ldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgREVCVUcoMiwgImF4bmV0X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJYXhuZXRfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJYXhuZXRfcmVzZXRfODM5MChkZXYpOworCQlBWDg4MTkwX2luaXQoZGV2LCAxKTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogYXhuZXRfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNSUkgaW50ZXJmYWNlIHN1cHBvcnQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTURJT19TSElGVF9DTEsJCTB4MDEKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMAkweDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEJMHgwOAorI2RlZmluZSBNRElPX0RBVEFfUkVBRAkJMHgwNAorI2RlZmluZSBNRElPX01BU0sJCTB4MGYKKyNkZWZpbmUgTURJT19FTkJfSU4JCTB4MDIKKworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcikKK3sKKyAgICBpbnQgYml0czsKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMzI7IGJpdHMrKykgeworCW91dGJfcChNRElPX0RBVEFfV1JJVEUxLCBhZGRyKTsKKwlvdXRiX3AoTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYykKK3sKKyAgICB1X2ludCBjbWQgPSAoMHhmNjw8MTApfChwaHlfaWQ8PDUpfGxvYzsKKyAgICBpbnQgaSwgcmV0dmFsID0gMDsKKworICAgIG1kaW9fc3luYyhhZGRyKTsKKyAgICBmb3IgKGkgPSAxNDsgaSA+PSAwOyBpLS0pIHsKKwlpbnQgZGF0ID0gKGNtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJb3V0Yl9wKGRhdCwgYWRkcik7CisJb3V0Yl9wKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwlvdXRiX3AoTURJT19FTkJfSU4sIGFkZHIpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYl9wKGFkZHIpICYgTURJT19EQVRBX1JFQUQpICE9IDApOworCW91dGJfcChNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKQoreworICAgIHVfaW50IGNtZCA9ICgweDA1PDwyOCl8KHBoeV9pZDw8MjMpfChsb2M8PDE4KXwoMTw8MTcpfHZhbHVlOworICAgIGludCBpOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiX3AoZGF0LCBhZGRyKTsKKwlvdXRiX3AoZGF0IHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpID49IDA7IGktLSkgeworCW91dGJfcChNRElPX0VOQl9JTiwgYWRkcik7CisJb3V0Yl9wKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXhuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmaW5mby0+bGluazsKKyAgICAKKyAgICBERUJVRygyLCAiYXhuZXRfb3BlbignJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgbGluay0+b3BlbisrOworCisgICAgcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2lycV93cmFwcGVyLCBTQV9TSElSUSwgZGV2X2luZm8sIGRldik7CisKKyAgICBpbmZvLT5saW5rX3N0YXR1cyA9IDB4MDA7CisgICAgaW5pdF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworICAgIGluZm8tPndhdGNoZG9nLmZ1bmN0aW9uID0gJmVpX3dhdGNoZG9nOworICAgIGluZm8tPndhdGNoZG9nLmRhdGEgPSAodV9sb25nKWRldjsKKyAgICBpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworCisgICAgcmV0dXJuIGF4X29wZW4oZGV2KTsKK30gLyogYXhuZXRfb3BlbiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBheG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmaW5mby0+bGluazsKKworICAgIERFQlVHKDIsICJheG5ldF9jbG9zZSgnJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGF4X2Nsb3NlKGRldik7CisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgCisgICAgbGluay0+b3Blbi0tOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBkZWxfdGltZXJfc3luYygmaW5mby0+d2F0Y2hkb2cpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGF4bmV0X2Nsb3NlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgSGFyZCByZXNldCB0aGUgY2FyZC4gIFRoaXMgdXNlZCB0byBwYXVzZSBmb3IgdGhlIHNhbWUgcGVyaW9kIHRoYXQKKyAgICBhIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF4bmV0X3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisKKyAgICBlaV9zdGF0dXMudHhpbmcgPSBlaV9zdGF0dXMuZG1haW5nID0gMDsKKworICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBuaWNfYmFzZSArIEU4MzkwX0NNRCk7CisKKyAgICBvdXRiKGluYihuaWNfYmFzZSArIEFYTkVUX1JFU0VUKSwgbmljX2Jhc2UgKyBBWE5FVF9SRVNFVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwlpZiAoKGluYl9wKG5pY19iYXNlK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpICE9IDApCisJICAgIGJyZWFrOworCXVkZWxheSgxMDApOworICAgIH0KKyAgICBvdXRiX3AoRU5JU1JfUkVTRVQsIG5pY19iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLworICAgIAorICAgIGlmIChpID09IDEwMCkKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBheG5ldF9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisgICAgCit9IC8qIGF4bmV0X3Jlc2V0XzgzOTAgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlaV9pcnFfd3JhcHBlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisgICAgUFJJVihkZXYpLT5zdGFsZSA9IDA7CisgICAgcmV0dXJuIGF4X2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGVpX3dhdGNoZG9nKHVfbG9uZyBhcmcpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKShhcmcpOworICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBraW9fYWRkcl90IG1paV9hZGRyID0gbmljX2Jhc2UgKyBBWE5FVF9NSUlfRUVQOworICAgIHVfc2hvcnQgbGluazsKKworICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgZ290byByZXNjaGVkdWxlOworCisgICAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggZXhwaXJlZCBsYXRlbmN5IHRpbWVyOiB3aXRoCisgICAgICAgdGhpcywgd2UgY2FuIGxpbXAgYWxvbmcgZXZlbiBpZiB0aGUgaW50ZXJydXB0IGlzIGJsb2NrZWQgKi8KKyAgICBpZiAoaW5mby0+c3RhbGUrKyAmJiAoaW5iX3AobmljX2Jhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX0FMTCkpIHsKKwlpZiAoIWluZm8tPmZhc3RfcG9sbCkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwllaV9pcnFfd3JhcHBlcihkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwlpbmZvLT5mYXN0X3BvbGwgPSBIWjsKKyAgICB9CisgICAgaWYgKGluZm8tPmZhc3RfcG9sbCkgeworCWluZm8tPmZhc3RfcG9sbC0tOworCWluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwlhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGluZm8tPnBoeV9pZCA8IDApCisJZ290byByZXNjaGVkdWxlOworICAgIGxpbmsgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgMSk7CisgICAgaWYgKCFsaW5rIHx8IChsaW5rID09IDB4ZmZmZikpIHsKKwlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIGlzIG1pc3NpbmchXG4iLCBkZXYtPm5hbWUpOworCWluZm8tPnBoeV9pZCA9IC0xOworCWdvdG8gcmVzY2hlZHVsZTsKKyAgICB9CisKKyAgICBsaW5rICY9IDB4MDAwNDsKKyAgICBpZiAobGluayAhPSBpbmZvLT5saW5rX3N0YXR1cykgeworCXVfc2hvcnQgcCA9IG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+cGh5X2lkLCA1KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIChsaW5rKSA/ICJmb3VuZCIgOiAibG9zdCIpOworCWlmIChsaW5rKSB7CisJICAgIGluZm8tPmR1cGxleF9mbGFnID0gKHAgJiAweDAxNDApID8gMHg4MCA6IDB4MDA7CisJICAgIGlmIChwKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlOiAiCisJCSAgICAgICAiJXNiYXNlVC0lY0Qgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgICgocCAmIDB4MDE4MCkgPyAiMTAwIiA6ICIxMCIpLAorCQkgICAgICAgKChwICYgMHgwMTQwKSA/ICdGJyA6ICdIJykpOworCSAgICBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHBhcnRuZXIgZGlkIG5vdCBhdXRvbmVnb3RpYXRlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkgICAgQVg4ODE5MF9pbml0KGRldiwgMSk7CisJfQorCWluZm8tPmxpbmtfc3RhdHVzID0gbGluazsKKyAgICB9CisKK3Jlc2NoZWR1bGU6CisgICAgaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiYXhuZXRfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGF4bmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgICAgYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisgICAga2lvX2FkZHJfdCBtaWlfYWRkciA9IGRldi0+YmFzZV9hZGRyICsgQVhORVRfTUlJX0VFUDsKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgU0lPQ0dNSUlQSFk6CisJZGF0YVswXSA9IGluZm8tPnBoeV9pZDsKKyAgICBjYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWRhdGFbM10gPSBtZGlvX3JlYWQobWlpX2FkZHIsIGRhdGFbMF0sIGRhdGFbMV0gJiAweDFmKTsKKwlyZXR1cm4gMDsKKyAgICBjYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJICAgIHJldHVybiAtRVBFUk07CisJbWRpb193cml0ZShtaWlfYWRkciwgZGF0YVswXSwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0pOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBnZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJIGludCByaW5nX3BhZ2UpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisgICAgb3V0Yl9wKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgQVhORVRfQ01EKTsKKworICAgIGluc3cobmljX2Jhc2UgKyBBWE5FVF9EQVRBUE9SVCwgaGRyLAorCSAgICBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKKyAgICAvKiBGaXggZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAqLworICAgIGhkci0+Y291bnQgPSBsZTE2X3RvX2NwdShoZHItPmNvdW50KTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgeGZlcl9jb3VudCA9IGNvdW50OworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmICgoZWlfZGVidWcgPiA0KSAmJiAoY291bnQgIT0gNCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBbYmk9JWRdXG4iLCBkZXYtPm5hbWUsIGNvdW50KzQpOworI2VuZGlmCisgICAgb3V0Yl9wKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKyAgICBvdXRiX3AocmluZ19vZmZzZXQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgQVhORVRfQ01EKTsKKworICAgIGluc3cobmljX2Jhc2UgKyBBWE5FVF9EQVRBUE9SVCxidWYsY291bnQ+PjEpOworICAgIGlmIChjb3VudCAmIDB4MDEpCisJYnVmW2NvdW50LTFdID0gaW5iKG5pY19iYXNlICsgQVhORVRfREFUQVBPUlQpLCB4ZmVyX2NvdW50Kys7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGJsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChlaV9kZWJ1ZyA+IDQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBbYm89JWRdXG4iLCBkZXYtPm5hbWUsIGNvdW50KTsKKyNlbmRpZgorCisgICAgLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKyAgICAgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisgICAgICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKyAgICBpZiAoY291bnQgJiAweDAxKQorCWNvdW50Kys7CisKKyAgICBvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKyAgICBvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIEFYTkVUX0NNRCk7CisgICAgb3V0c3cobmljX2Jhc2UgKyBBWE5FVF9EQVRBUE9SVCwgYnVmLCBjb3VudD4+MSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBheG5ldF9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJheG5ldF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGF4bmV0X2F0dGFjaCwKKwkuZGV0YWNoCQk9IGF4bmV0X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXhuZXRfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmYXhuZXRfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYXhuZXRfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmF4bmV0X2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X2F4bmV0X2NzKTsKK21vZHVsZV9leGl0KGV4aXRfYXhuZXRfY3MpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogODM5MC5jOiBBIGdlbmVyYWwgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBjb3JlIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgIAorCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgVGhpcyBpcyB0aGUgY2hpcC1zcGVjaWZpYyBjb2RlIGZvciBtYW55IDgzOTAtYmFzZWQgZXRoZXJuZXQgYWRhcHRvcnMuCisgIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBpdCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggYm9hcmQtc3BlY2lmaWMKKyAgY29kZSBzdWNoIGFzIG5lLmMsIHdkLmMsIDNjNTAzLmMsIGV0Yy4KKworICBTZWVpbmcgaG93IGF0IGxlYXN0IGVpZ2h0IGRyaXZlcnMgdXNlIHRoaXMgY29kZSwgKG5vdCBjb3VudGluZyB0aGUKKyAgUENNQ0lBIG9uZXMgZWl0aGVyKSBpdCBpcyBlYXN5IHRvIGJyZWFrIHNvbWUgY2FyZCBieSB3aGF0IHNlZW1zIGxpa2UKKyAgYSBzaW1wbGUgaW5ub2NlbnQgY2hhbmdlLiBQbGVhc2UgY29udGFjdCBtZSBvciBEb25hbGQgaWYgeW91IHRoaW5rCisgIHlvdSBoYXZlIGZvdW5kIHNvbWV0aGluZyB0aGF0IG5lZWRzIGNoYW5naW5nLiAtLSBQRworCisgIENoYW5nZWxvZzoKKworICBQYXVsIEdvcnRtYWtlcgk6IHJlbW92ZSBzZXRfYml0IGxvY2ssIG90aGVyIGNsZWFudXBzLgorICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBlaV9nZXRfODM5MF9oZHIoKSBzbyB3ZSBjYW4gcGFzcyBza2IncyB0byAKKwkJCSAgZWlfYmxvY2tfaW5wdXQoKSBmb3IgZXRoX2lvX2NvcHlfYW5kX3N1bSgpLgorICBQYXVsIEdvcnRtYWtlcgk6IGV4Y2hhbmdlIHN0YXRpYyBpbnQgZWlfcGluZ3BvbmcgZm9yIGEgI2RlZmluZSwKKwkJCSAgYWxzbyBhZGQgYmV0dGVyIFR4IGVycm9yIGhhbmRsaW5nLgorICBQYXVsIEdvcnRtYWtlcgk6IHJld3JpdGUgUnggb3ZlcnJ1biBoYW5kbGluZyBhcyBwZXIgTlMgc3BlY3MuCisgIEFsZXhleSBLdXpuZXRzb3YJOiB1c2UgdGhlIDgzOTAncyBzaXggYml0IGhhc2ggbXVsdGljYXN0IGZpbHRlci4KKyAgUGF1bCBHb3J0bWFrZXIJOiB0d2VhayBBTksncyBhYm92ZSBtdWx0aWNhc3QgY2hhbmdlcyBhIGJpdC4KKyAgUGF1bCBHb3J0bWFrZXIJOiB1cGRhdGUgcGFja2V0IHN0YXRpc3RpY3MgZm9yIHYyLjEueAorICBBbGFuIENveAkJOiBzdXBwb3J0IGFyYml0YXJ5IHN0dXBpZCBwb3J0IG1hcHBpbmdzIG9uIHRoZQorICAJCQkgIDY4SyBNYWNpbnRvc2guIFN1cHBvcnQgPjE2Yml0IEkvTyBzcGFjZXMKKyAgUGF1bCBHb3J0bWFrZXIJOiBhZGQga21vZCBzdXBwb3J0IGZvciBhdXRvLWxvYWRpbmcgb2YgdGhlIDgzOTAKKwkJCSAgbW9kdWxlIGJ5IGFsbCBkcml2ZXJzIHRoYXQgcmVxdWlyZSBpdC4KKyAgQWxhbiBDb3gJCTogU3BpbmxvY2tpbmcgd29yaywgYWRkZWQgJ0JVR184M0M2OTAnCisgIFBhdWwgR29ydG1ha2VyCTogU2VwYXJhdGUgb3V0IFR4IHRpbWVvdXQgY29kZSBmcm9tIFR4IHBhdGguCisKKyAgU291cmNlczoKKyAgVGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTEFOIERhdGFib29rLCBhbmQgdGhlIDNDb20gM2M1MDMgZGF0YWJvb2suCisKKyAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb25fODM5MCA9CisgICAgIjgzOTAuYzp2MS4xMGN2cyA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBzY3lsZC5jb20pXG4iOworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNkZWZpbmUgQlVHXzgzQzY5MAorCisvKiBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbmFsIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gYm9hcmQtc3BlY2lmaWMKKyAgIHJvdXRpbmVzLgorCXZvaWQgcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCQlSZXNldHMgdGhlIGJvYXJkIGFzc29jaWF0ZWQgd2l0aCBERVYsIGluY2x1ZGluZyBhIGhhcmR3YXJlIHJlc2V0IG9mCisJCXRoZSA4MzkwLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgdHJhbnNtaXQgdGltZW91dCwgYW5kCisJCWl0IGlzIGFsd2F5cyBmb2xsb3dlZCBieSA4MzkwX2luaXQoKS4KKwl2b2lkIGJsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkJICBpbnQgc3RhcnRfcGFnZSkKKwkJV3JpdGUgdGhlIENPVU5UIGJ5dGVzIG9mIEJVRiB0byB0aGUgcGFja2V0IGJ1ZmZlciBhdCBTVEFSVF9QQUdFLiAgVGhlCisJCSJwYWdlIiB2YWx1ZSB1c2VzIHRoZSA4MzkwJ3MgMjU2LWJ5dGUgcGFnZXMuCisJdm9pZCBnZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQorCQlSZWFkIHRoZSA0IGJ5dGUsIHBhZ2UgYWxpZ25lZCA4MzkwIGhlYWRlci4gKklmKiB0aGVyZSBpcyBhCisJCXN1YnNlcXVlbnQgcmVhZCwgaXQgd2lsbCBiZSBvZiB0aGUgcmVzdCBvZiB0aGUgcGFja2V0LgorCXZvaWQgYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCisJCVJlYWQgQ09VTlQgYnl0ZXMgZnJvbSB0aGUgcGFja2V0IGJ1ZmZlciBpbnRvIHRoZSBza2IgZGF0YSBhcmVhLiBTdGFydCAKKwkJcmVhZGluZyBmcm9tIFJJTkdfT0ZGU0VULCB0aGUgYWRkcmVzcyBhcyB0aGUgODM5MCBzZWVzIGl0LiAgVGhpcyB3aWxsIGFsd2F5cworCQlmb2xsb3cgdGhlIHJlYWQgb2YgdGhlIDgzOTAgaGVhZGVyLiAKKyovCisjZGVmaW5lIGVpX3Jlc2V0XzgzOTAgKGVpX2xvY2FsLT5yZXNldF84MzkwKQorI2RlZmluZSBlaV9ibG9ja19vdXRwdXQgKGVpX2xvY2FsLT5ibG9ja19vdXRwdXQpCisjZGVmaW5lIGVpX2Jsb2NrX2lucHV0IChlaV9sb2NhbC0+YmxvY2tfaW5wdXQpCisjZGVmaW5lIGVpX2dldF84MzkwX2hkciAoZWlfbG9jYWwtPmdldF84MzkwX2hkcikKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIGVpX2RlYnVnCitpbnQgZWlfZGVidWcgPSAxOworI2VuZGlmCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFJvdXRpbmVzIGdlbmVyaWMgdG8gTlM4MzkwLWJhc2VkIGJvYXJkcy4gKi8KK3N0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG9fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICoJU01QIGFuZCB0aGUgODM5MCBzZXR1cC4KKyAqCisgKglUaGUgODM5MCBpc250IGV4YWN0bHkgZGVzaWduZWQgdG8gYmUgbXVsdGl0aHJlYWRlZCBvbiBSWC9UWC4gVGhlcmUgaXMKKyAqCWEgcGFnZSByZWdpc3RlciB0aGF0IGNvbnRyb2xzIGJhbmsgYW5kIHBhY2tldCBidWZmZXIgYWNjZXNzLiBXZSBndWFyZAorICoJdGhpcyB3aXRoIGVpX2xvY2FsLT5wYWdlX2xvY2suIE5vYm9keSBzaG91bGQgYXNzdW1lIG9yIHNldCB0aGUgcGFnZSBvdGhlcgorICoJdGhhbiB6ZXJvIHdoZW4gdGhlIGxvY2sgaXMgbm90IGhlbGQuIExvY2sgaG9sZGVycyBtdXN0IHJlc3RvcmUgcGFnZSAwCisgKgliZWZvcmUgdW5sb2NraW5nLiBFdmVuIHB1cmUgcmVhZGVycyBtdXN0IHRha2UgdGhlIGxvY2sgdG8gcHJvdGVjdCBpbiAKKyAqCXBhZ2UgMC4KKyAqCisgKglUbyBtYWtlIGxpZmUgZGlmZmljdWx0IHRoZSBjaGlwIGNhbiBhbHNvIGJlIHZlcnkgc2xvdy4gV2UgdGhlcmVmb3JlIGNhbid0CisgKglqdXN0IHVzZSBzcGlubG9ja3MuIEZvciB0aGUgbG9uZ2VyIGxvY2t1cHMgd2UgZGlzYWJsZSB0aGUgaXJxIHRoZSBkZXZpY2UKKyAqCXNpdHMgb24gYW5kIGhvbGQgdGhlIGxvY2suIFdlIG11c3QgaG9sZCB0aGUgbG9jayBiZWNhdXNlIHRoZXJlIGlzIGEgZHVhbAorICoJcHJvY2Vzc29yIGNhc2Ugb3RoZXIgdGhhbiBpbnRlcnJ1cHRzIChnZXQgc3RhdHMvc2V0IG11bHRpY2FzdCBsaXN0IGluCisgKglwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXIgYW5kIHRyYW5zbWl0KS4KKyAqCisgKglOb3RlOiBpbiB0aGVvcnkgd2UgY2FuIGp1c3QgZGlzYWJsZSB0aGUgaXJxIG9uIHRoZSBjYXJkIF9idXRfIHRoZXJlIGlzCisgKglhIGxhdGVuY3kgb24gU01QIGlycSBkZWxpdmVyeS4gU28gd2UgY2FuIGVhc2lseSBnbyAiZGlzYWJsZSBpcnEiICJzeW5jIGlycXMiCisgKgllbnRlciBsb2NrLCB0YWtlIHRoZSBxdWV1ZWQgaXJxLiBTbyB3ZSB3YWRkbGUgaW5zdGVhZCBvZiBmbHlpbmcuCisgKgorICoJRmluYWxseSBieSBzcGVjaWFsIGFycmFuZ2VtZW50IGZvciB0aGUgcHVycG9zZSBvZiBiZWluZyBnZW5lcmFsbHkgCisgKglhbm5veWluZyB0aGUgdHJhbnNtaXQgZnVuY3Rpb24gaXMgY2FsbGVkIGJoIGF0b21pYy4gVGhhdCBwbGFjZXMKKyAqCXJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlciBjb250ZXh0IGNhbGxlcnMgYXMgZGlzYWJsZV9pcnEgd29uJ3Qgc2F2ZQorICoJdGhlbS4KKyAqLworIAorLyoqCisgKiBheF9vcGVuIC0gT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqCisgKiBUaGlzIHJvdXRpbmUgZ29lcyBhbGwtb3V0LCBzZXR0aW5nIGV2ZXJ5dGhpbmcKKyAqIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHRob3VnaCBtYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBzaG91bGQgb25seQorICogbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LgorICovCitzdGF0aWMgaW50IGF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorCS8qIFRoZSBjYXJkIEkvTyBwYXJ0IG9mIHRoZSBkcml2ZXIgKGUuZy4gM2M1MDMpIGNhbiBob29rIGEgVHggdGltZW91dAorCSAgICB3cmFwcGVyIHRoYXQgZG9lcyBlLmcuIG1lZGlhIGNoZWNrICYgdGhlbiBjYWxscyBlaV90eF90aW1lb3V0LiAqLworCWlmIChkZXYtPnR4X3RpbWVvdXQgPT0gTlVMTCkKKwkJIGRldi0+dHhfdGltZW91dCA9IGVpX3R4X3RpbWVvdXQ7CisJaWYgKGRldi0+d2F0Y2hkb2dfdGltZW8gPD0gMCkKKwkJIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKwkvKgorCSAqCUdyYWIgdGhlIHBhZ2UgbG9jayBzbyB3ZSBvd24gdGhlIHJlZ2lzdGVyIHNldCwgdGhlbiBjYWxsCisJICoJdGhlIGluaXQgZnVuY3Rpb24uCisJICovCisgICAgICAKKyAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCUFYODgxOTBfaW5pdChkZXYsIDEpOworCS8qIFNldCB0aGUgZmxhZyBiZWZvcmUgd2UgZHJvcCB0aGUgbG9jaywgVGhhdCB3YXkgdGhlIElSUSBhcnJpdmVzCisJICAgYWZ0ZXIgaXRzIHNldCBhbmQgd2UgZ2V0IG5vIHNpbGx5IHdhcm5pbmdzICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCXJldHVybiAwOworfQorCisjZGVmaW5lIGRldl9sb2NrKGRldikgKCgoc3RydWN0IGVpX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wYWdlX2xvY2spCisKKy8qKgorICogYXhfY2xvc2UgLSBzaHV0IGRvd24gbmV0d29yayBkZXZpY2UKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGNsb3NlCisgKgorICogT3Bwb3NpdGUgb2YgYXhfb3BlbigpLiBPbmx5IHVzZWQgd2hlbiAiaWZjb25maWcgPGRldm5hbWU+IGRvd24iIGlzIGRvbmUuCisgKi8KK2ludCBheF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqICAgICAgSG9sZCB0aGUgcGFnZSBsb2NrIGR1cmluZyBjbG9zZQorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9sb2NrKGRldiksIGZsYWdzKTsKKwlBWDg4MTkwX2luaXQoZGV2LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfbG9jayhkZXYpLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVpX3R4X3RpbWVvdXQgLSBoYW5kbGUgdHJhbnNtaXQgdGltZSBvdXQgY29uZGl0aW9uCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCBoYXMgYXBwYXJlbnRseSBmYWxsZW4gYXNsZWVwCisgKgorICogQ2FsbGVkIGJ5IGtlcm5lbCB3aGVuIGRldmljZSBuZXZlciBhY2tub3dsZWRnZXMgYSB0cmFuc21pdCBoYXMKKyAqIGNvbXBsZXRlZCAob3IgZmFpbGVkKSAtIGkuZS4gbmV2ZXIgcG9zdGVkIGEgVHggcmVsYXRlZCBpbnRlcnJ1cHQuCisgKi8KKwordm9pZCBlaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0eHNyLCBpc3IsIHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXR4c3IgPSBpbmIoZTgzOTBfYmFzZStFTjBfVFNSKTsKKwlpc3IgPSBpbmIoZTgzOTBfYmFzZStFTjBfSVNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHRpbWVkIG91dCwgJXMgVFNSPSUjMngsIElTUj0lIzJ4LCB0PSVkLlxuIiwKKwkJZGV2LT5uYW1lLCAodHhzciAmIEVOVFNSX0FCVCkgPyAiZXhjZXNzIGNvbGxpc2lvbnMuIiA6CisJCShpc3IpID8gImxvc3QgaW50ZXJydXB0PyIgOiAiY2FibGUgcHJvYmxlbT8iLCB0eHNyLCBpc3IsIHRpY2tzc29mYXIpOworCisJaWYgKCFpc3IgJiYgIWVpX2xvY2FsLT5zdGF0LnR4X3BhY2tldHMpIAorCXsKKwkJLyogVGhlIDgzOTAgcHJvYmFibHkgaGFzbid0IGdvdHRlbiBvbiB0aGUgY2FibGUgeWV0LiAqLworCQllaV9sb2NhbC0+aW50ZXJmYWNlX251bSBePSAxOyAgIC8qIFRyeSBhIGRpZmZlcmVudCB4Y3ZyLiAgKi8KKwl9CisKKwkvKiBVZ2x5IGJ1dCBhIHJlc2V0IGNhbiBiZSBzbG93LCB5ZXQgbXVzdCBiZSBwcm90ZWN0ZWQgKi8KKwkJCisJZGlzYWJsZV9pcnFfbm9zeW5jKGRldi0+aXJxKTsKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQkKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgY2FyZC4gIFBlcmhhcHMgdGhlIHVzZXIgaGFzIGZpeGVkIHNvbWV0aGluZy4gKi8KKwllaV9yZXNldF84MzkwKGRldik7CisJQVg4ODE5MF9pbml0KGRldiwgMSk7CisJCQorCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisgICAgCisvKioKKyAqIGVpX3N0YXJ0X3htaXQgLSBiZWdpbiBwYWNrZXQgdHJhbnNtaXNzaW9uCisgKiBAc2tiOiBwYWNrZXQgdG8gYmUgc2VudAorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gd2hpY2ggcGFja2V0IGlzIHNlbnQKKyAqCisgKiBTZW5kcyBhIHBhY2tldCB0byBhbiA4MzkwIG5ldHdvcmsgZGV2aWNlLgorICovCisgCitzdGF0aWMgaW50IGVpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IGxlbmd0aCwgc2VuZF9sZW5ndGgsIG91dHB1dF9wYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggcGFja2V0W0VUSF9aTEVOXTsKKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlsZW5ndGggPSBza2ItPmxlbjsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIHRoZSBldGhlcmNhcmQuIAorCSAgIFNNUDogV2UgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUgb3RoZXJ3aXNlIHRoZSBJUlEgaGFuZGxlcgorCSAgIG9uIGFub3RoZXIgQ1BVIGNhbiBmbGlwIHdpbmRvdyBhbmQgcmFjZSB0aGUgSVJRIG1hc2sgc2V0LiBXZSBlbmQKKwkgICB1cCB0cmFzaGluZyB0aGUgbWNhc3QgZmlsdGVyIG5vdCBkaXNhYmxpbmcgaXJxcyBpZiB3ZSBkb24ndCBsb2NrICovCisJICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwkKKwkvKgorCSAqCVNsb3cgcGhhc2Ugd2l0aCBsb2NrIGhlbGQuCisJICovCisJIAorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJCisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkKKwllaV9sb2NhbC0+aXJxbG9jayA9IDE7CisKKwlzZW5kX2xlbmd0aCA9IEVUSF9aTEVOIDwgbGVuZ3RoID8gbGVuZ3RoIDogRVRIX1pMRU47CisJCisJLyoKKwkgKiBXZSBoYXZlIHR3byBUeCBzbG90cyBhdmFpbGFibGUgZm9yIHVzZS4gRmluZCB0aGUgZmlyc3QgZnJlZQorCSAqIHNsb3QsIGFuZCB0aGVuIHBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiBXaXRoIHR3byBUeCBidWZzLAorCSAqIHlvdSBnZXQgdmVyeSBjbG9zZSB0byB0cmFuc21pdHRpbmcgYmFjay10by1iYWNrIHBhY2tldHMuIFdpdGgKKwkgKiBvbmx5IG9uZSBUeCBidWYsIHRoZSB0cmFuc21pdHRlciBzaXRzIGlkbGUgd2hpbGUgeW91IHJlbG9hZCB0aGUKKwkgKiBjYXJkLCBsZWF2aW5nIGEgc3Vic3RhbnRpYWwgZ2FwIGJldHdlZW4gZWFjaCB0cmFuc21pdHRlZCBwYWNrZXQuCisJICovCisKKwlpZiAoZWlfbG9jYWwtPnR4MSA9PSAwKSAKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2U7CisJCWVpX2xvY2FsLT50eDEgPSBzZW5kX2xlbmd0aDsKKwkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MiA+IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIgdHgyPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7CisJfQorCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPT0gMCkgCisJeworCQlvdXRwdXRfcGFnZSA9IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlICsgVFhfUEFHRVMvMjsKKwkJZWlfbG9jYWwtPnR4MiA9IHNlbmRfbGVuZ3RoOworCQlpZiAoZWlfZGVidWcgICYmICBlaV9sb2NhbC0+dHgxID4gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaWRsZSB0cmFuc21pdHRlciwgdHgxPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7CisJfQorCWVsc2UKKwl7CS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KKwkJaWYgKGVpX2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBUeCBidWZmZXJzIGZyZWUhIHR4MT0lZCB0eDI9JWQgbGFzdD0lZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgpOworCQllaV9sb2NhbC0+aXJxbG9jayA9IDA7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBPa2F5LCBub3cgdXBsb2FkIHRoZSBwYWNrZXQgYW5kIHRyaWdnZXIgYSBzZW5kIGlmIHRoZSB0cmFuc21pdHRlcgorCSAqIGlzbid0IGFscmVhZHkgc2VuZGluZy4gSWYgaXQgaXMgYnVzeSwgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwKKwkgKiB0cmlnZ2VyIHRoZSBzZW5kIGxhdGVyLCB1cG9uIHJlY2VpdmluZyBhIFR4IGRvbmUgaW50ZXJydXB0LgorCSAqLworCisJaWYgKGxlbmd0aCA9PSBza2ItPmxlbikKKwkJZWlfYmxvY2tfb3V0cHV0KGRldiwgbGVuZ3RoLCBza2ItPmRhdGEsIG91dHB1dF9wYWdlKTsKKwllbHNlIHsKKwkJbWVtc2V0KHBhY2tldCwgMCwgRVRIX1pMRU4pOworCQltZW1jcHkocGFja2V0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZWlfYmxvY2tfb3V0cHV0KGRldiwgbGVuZ3RoLCBwYWNrZXQsIG91dHB1dF9wYWdlKTsKKwl9CisJCisJaWYgKCEgZWlfbG9jYWwtPnR4aW5nKSAKKwl7CisJCWVpX2xvY2FsLT50eGluZyA9IDE7CisJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBzZW5kX2xlbmd0aCwgb3V0cHV0X3BhZ2UpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWYgKG91dHB1dF9wYWdlID09IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKSAKKwkJeworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0xOworCQl9CisJCWVsc2UgCisJCXsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMjsKKwkJfQorCX0KKwllbHNlIGVpX2xvY2FsLT50eHF1ZXVlKys7CisKKwlpZiAoZWlfbG9jYWwtPnR4MSAgJiYgIGVpX2xvY2FsLT50eDIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCisJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwllaV9sb2NhbC0+c3RhdC50eF9ieXRlcyArPSBzZW5kX2xlbmd0aDsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBheF9pbnRlcnJ1cHQgLSBoYW5kbGUgdGhlIGludGVycnVwdHMgZnJvbSBhbiA4MzkwCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGV2X2lkOiBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2UKKyAqIEByZWdzOiB1bnVzZWQKKyAqCisgKiBIYW5kbGUgdGhlIGV0aGVyIGludGVyZmFjZSBpbnRlcnJ1cHRzLiBXZSBwdWxsIHBhY2tldHMgZnJvbQorICogdGhlIDgzOTAgdmlhIHRoZSBjYXJkIHNwZWNpZmljIGZ1bmN0aW9ucyBhbmQgZmlyZSB0aGVtIGF0IHRoZSBuZXR3b3JraW5nCisgKiBzdGFjay4gV2UgYWxzbyBoYW5kbGUgdHJhbnNtaXQgY29tcGxldGlvbnMgYW5kIHdha2UgdGhlIHRyYW5zbWl0IHBhdGggaWYKKyAqIG5lY2Vzc2FyeS4gV2UgYWxzbyB1cGRhdGUgdGhlIGNvdW50ZXJzIGFuZCBkbyBvdGhlciBob3VzZWtlZXBpbmcgYXMKKyAqIG5lZWRlZC4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJbG9uZyBlODM5MF9iYXNlOworCWludCBpbnRlcnJ1cHRzLCBucl9zZXJ2aWNlZCA9IDAsIGk7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7CisgICAgCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgCisJeworCQlwcmludGsgKCJuZXRfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorICAgIAorCWU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwllaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisKKwkvKgorCSAqCVByb3RlY3QgdGhlIGlycSB0ZXN0IHRvby4KKwkgKi8KKwkgCisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKworCWlmIChlaV9sb2NhbC0+aXJxbG9jaykgCisJeworI2lmIDEgLyogVGhpcyBtaWdodCBqdXN0IGJlIGFuIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlIHNoYXJpbmcgdGhpcyBsaW5lICovCisJCS8qIFRoZSAiaXJxbG9jayIgY2hlY2sgaXMgb25seSBmb3IgdGVzdGluZy4gKi8KKwkJcHJpbnRrKGVpX2xvY2FsLT5pcnFsb2NrCisJCQkgICA/ICIlczogSW50ZXJydXB0ZWQgd2hpbGUgaW50ZXJydXB0cyBhcmUgbWFza2VkISBpc3I9JSMyeCBpbXI9JSMyeC5cbiIKKwkJCSAgIDogIiVzOiBSZWVudGVyaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciEgaXNyPSUjMnggaW1yPSUjMnguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbmJfcChlODM5MF9iYXNlICsgRU4wX0lTUiksCisJCQkgICBpbmJfcChlODM5MF9iYXNlICsgRU4wX0lNUikpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyAgICAKKwlpZiAoZWlfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdChpc3I9JSMyLjJ4KS5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSk7CisKKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCWVpX2xvY2FsLT5pcnFsb2NrID0gMTsKKyAgIAorCS8qICEhQXNzdW1wdGlvbiEhIC0tIHdlIHN0YXkgaW4gcGFnZSAwLgkgRG9uJ3QgYnJlYWsgdGhpcy4gKi8KKwl3aGlsZSAoKGludGVycnVwdHMgPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0lTUikpICE9IDAKKwkJICAgJiYgKytucl9zZXJ2aWNlZCA8IE1BWF9TRVJWSUNFKSAKKwl7CisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8IChpbnRlcnJ1cHRzID09IDB4ZmYpKSB7CisJCQlpZiAoZWlfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnRlcnJ1cHQgZnJvbSBzdG9wcGVkIGNhcmRcbiIsIGRldi0+bmFtZSk7CisJCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQkJaW50ZXJydXB0cyA9IDA7CisJCQlicmVhazsKKwkJfQorCQloYW5kbGVkID0gMTsKKworCQkvKiBBWDg4MTkwIGJ1ZyBmaXguICovCisJCW91dGJfcChpbnRlcnJ1cHRzLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlpZiAoIShpbmIoZTgzOTBfYmFzZSArIEVOMF9JU1IpICYgaW50ZXJydXB0cykpCisJCQkJYnJlYWs7CisJCQlvdXRiX3AoMCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQkJb3V0Yl9wKGludGVycnVwdHMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJfQorCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX09WRVIpIAorCQkJZWlfcnhfb3ZlcnJ1bihkZXYpOworCQllbHNlIGlmIChpbnRlcnJ1cHRzICYgKEVOSVNSX1JYK0VOSVNSX1JYX0VSUikpIAorCQl7CisJCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCisJCQllaV9yZWNlaXZlKGRldik7CisJCX0KKwkJLyogUHVzaCB0aGUgbmV4dCB0by10cmFuc21pdCBwYWNrZXQgdGhyb3VnaC4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9UWCkKKwkJCWVpX3R4X2ludHIoZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYX0VSUikKKwkJCWVpX3R4X2VycihkZXYpOworCisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpIAorCQl7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMCk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMSk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMik7CisJCX0KKwl9CisgICAgCisJaWYgKGludGVycnVwdHMgJiYgZWlfZGVidWcpIAorCXsKKwkJaGFuZGxlZCA9IDE7CisJCWlmIChucl9zZXJ2aWNlZCA+PSBNQVhfU0VSVklDRSkgCisJCXsKKwkJCS8qIDB4RkYgaXMgdmFsaWQgZm9yIGEgY2FyZCByZW1vdmFsICovCisJCQlpZihpbnRlcnJ1cHRzIT0weEZGKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzICUjMi4yeFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludGVycnVwdHMpOworCQkJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIG1vc3QgaW50cnMuICovCisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBpbnRlcnJ1cHQgJSMyeFxuIiwgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCW91dGJfcCgweGZmLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjay4gYWxsIGludHJzLiAqLworCQl9CisJfQorCisJLyogVHVybiA4MzkwIGludGVycnVwdHMgYmFjayBvbi4gKi8KKwllaV9sb2NhbC0+aXJxbG9jayA9IDA7CisJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCisJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioKKyAqIGVpX3R4X2VyciAtIGhhbmRsZSB0cmFuc21pdHRlciBlcnJvcgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgdGhlIGV4Y2VwdGlvbgorICoKKyAqIEEgdHJhbnNtaXR0ZXIgZXJyb3IgaGFzIGhhcHBlbmVkLiBNb3N0IGxpa2VseSBleGNlc3MgY29sbGlzaW9ucyAod2hpY2gKKyAqIGlzIGEgZmFpcmx5IG5vcm1hbCBjb25kaXRpb24pLiBJZiB0aGUgZXJyb3IgaXMgb25lIHdoZXJlIHRoZSBUeCB3aWxsCisgKiBoYXZlIGJlZW4gYWJvcnRlZCwgd2UgdHJ5IGFuZCBzZW5kIGFub3RoZXIgb25lIHJpZ2h0IGF3YXksIGluc3RlYWQgb2YKKyAqIGxldHRpbmcgdGhlIGZhaWxlZCBwYWNrZXQgc2l0IGFuZCBjb2xsZWN0IGR1c3QgaW4gdGhlIFR4IGJ1ZmZlci4gVGhpcworICogaXMgYSBtdWNoIGJldHRlciBzb2x1dGlvbiBhcyBpdCBhdm9pZHMga2VybmVsIGJhc2VkIFR4IHRpbWVvdXRzLCBhbmQKKyAqIGFuIHVubmVjZXNzYXJ5IGNhcmQgcmVzZXQuCisgKgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGVpX3R4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHR4c3IgPSBpbmJfcChlODM5MF9iYXNlK0VOMF9UU1IpOworCXVuc2lnbmVkIGNoYXIgdHhfd2FzX2Fib3J0ZWQgPSB0eHNyICYgKEVOVFNSX0FCVCtFTlRTUl9GVSk7CisKKyNpZmRlZiBWRVJCT1NFX0VSUk9SX0RVTVAKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGVycm9yICglIzJ4KTogIiwgZGV2LT5uYW1lLCB0eHNyKTsKKwlpZiAodHhzciAmIEVOVFNSX0FCVCkKKwkJcHJpbnRrKCJleGNlc3MtY29sbGlzaW9ucyAiKTsKKwlpZiAodHhzciAmIEVOVFNSX05EKQorCQlwcmludGsoIm5vbi1kZWZlcnJhbCAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0NSUykKKwkJcHJpbnRrKCJsb3N0LWNhcnJpZXIgIik7CisJaWYgKHR4c3IgJiBFTlRTUl9GVSkKKwkJcHJpbnRrKCJGSUZPLXVuZGVycnVuICIpOworCWlmICh0eHNyICYgRU5UU1JfQ0RIKQorCQlwcmludGsoImxvc3QtaGVhcnRiZWF0ICIpOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCisJaWYgKHR4X3dhc19hYm9ydGVkKQorCQllaV90eF9pbnRyKGRldik7CisJZWxzZSAKKwl7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlpZiAodHhzciAmIEVOVFNSX0NSUykgZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DREgpIGVpX2xvY2FsLT5zdGF0LnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9PV0MpIGVpX2xvY2FsLT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9Cit9CisKKy8qKgorICogZWlfdHhfaW50ciAtIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdHggaW50ciBpcyBoYW5kbGVkCisgKgorICogV2UgaGF2ZSBmaW5pc2hlZCBhIHRyYW5zbWl0OiBjaGVjayBmb3IgZXJyb3JzIGFuZCB0aGVuIHRyaWdnZXIgdGhlIG5leHQKKyAqIHBhY2tldCB0byBiZSBzZW50LiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzID0gaW5iKGU4MzkwX2Jhc2UgKyBFTjBfVFNSKTsKKyAgICAKKwkvKgorCSAqIFRoZXJlIGFyZSB0d28gVHggYnVmZmVycywgc2VlIHdoaWNoIG9uZSBmaW5pc2hlZCwgYW5kIHRyaWdnZXIKKwkgKiB0aGUgc2VuZCBvZiBhbm90aGVyIG9uZSBpZiBpdCBleGlzdHMuCisJICovCisJZWlfbG9jYWwtPnR4cXVldWUtLTsKKworCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkgCisJeworCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAxICYmIGVpX2xvY2FsLT5sYXN0dHggIT0gLTEpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4MSk7CisJCWVpX2xvY2FsLT50eDEgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MiA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlICsgNik7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMSwKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAyOworCQl9CisJCWVsc2UgZWlfbG9jYWwtPmxhc3R0eCA9IDIwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOwkKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA8IDApIAorCXsKKwkJaWYgKGVpX2xvY2FsLT5sYXN0dHggIT0gMiAgJiYgIGVpX2xvY2FsLT5sYXN0dHggIT0gLTIpCisJCQlwcmludGsoIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgyPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4Mik7CisJCWVpX2xvY2FsLT50eDIgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MSA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDE7CisJCX0KKwkJZWxzZQorCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDEwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOworCX0KKy8vCWVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgVFgtZG9uZSBpbnRlcnJ1cHQsIGxhc3R0eD0lZC5cbiIsCisvLwkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCk7CisKKwkvKiBNaW5pbWl6ZSBUeCBsYXRlbmN5OiB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgYWZ0ZXIgd2UgcmVzdGFydCBUWGluZy4gKi8KKwlpZiAoc3RhdHVzICYgRU5UU1JfQ09MKQorCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zKys7CisJaWYgKHN0YXR1cyAmIEVOVFNSX1BUWCkKKwkJZWlfbG9jYWwtPnN0YXQudHhfcGFja2V0cysrOworCWVsc2UgCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkgCisJCXsKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zICs9IDE2OworCQl9CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DUlMpIAorCQkJZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0ZVKSAKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DREgpCisJCQllaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9PV0MpCisJCQllaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBlaV9yZWNlaXZlIC0gcmVjZWl2ZSBzb21lIHBhY2tldHMKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdpdGggd2hpY2ggcmVjZWl2ZSB3aWxsIGJlIHJ1bgorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAKKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgcnhpbmdfcGFnZSwgdGhpc19mcmFtZSwgbmV4dF9mcmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X29mZnNldDsKKwlpbnQgcnhfcGt0X2NvdW50ID0gMDsKKwlzdHJ1Y3QgZTgzOTBfcGt0X2hkciByeF9mcmFtZTsKKyAgICAKKwl3aGlsZSAoKytyeF9wa3RfY291bnQgPCAxMCkgCisJeworCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7CisJCQorCQkvKiBHZXQgdGhlIHJ4IHBhZ2UgKGluY29taW5nIHBhY2tldCBwb2ludGVyKS4gKi8KKwkJcnhpbmdfcGFnZSA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHIC0xKTsKKwkJCisJCS8qIFJlbW92ZSBvbmUgZnJhbWUgZnJvbSB0aGUgcmluZy4gIEJvdW5kYXJ5IGlzIGFsd2F5cyBhIHBhZ2UgYmVoaW5kLiAqLworCQl0aGlzX2ZyYW1lID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSkgKyAxOworCQlpZiAodGhpc19mcmFtZSA+PSBlaV9sb2NhbC0+c3RvcF9wYWdlKQorCQkJdGhpc19mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOworCQkKKwkJLyogU29tZWRheSB3ZSdsbCBvbWl0IHRoZSBwcmV2aW91cywgaWZmIHdlIG5ldmVyIGdldCB0aGlzIG1lc3NhZ2UuCisJCSAgIChUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xvbmUgY2xhaW1lZCB0byBoYXZlIGEgcHJvYmxlbS4pICAKKwkJICAgCisJCSAgIEtlZXAgcXVpZXQgaWYgaXQgbG9va3MgbGlrZSBhIGNhcmQgcmVtb3ZhbC4gT25lIHByb2JsZW0gaGVyZQorCQkgICBpcyB0aGF0IHNvbWUgY2xvbmVzIGNyYXNoIGluIHJvdWdobHkgdGhlIHNhbWUgd2F5LgorCQkgKi8KKwkJaWYgKGVpX2RlYnVnID4gMCAgJiYgIHRoaXNfZnJhbWUgIT0gZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKKwkJCisJCWlmICh0aGlzX2ZyYW1lID09IHJ4aW5nX3BhZ2UpCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCisJCQlicmVhazsJCQkJLyogRG9uZSBmb3Igbm93ICovCisJCQorCQljdXJyZW50X29mZnNldCA9IHRoaXNfZnJhbWUgPDwgODsKKwkJZWlfZ2V0XzgzOTBfaGRyKGRldiwgJnJ4X2ZyYW1lLCB0aGlzX2ZyYW1lKTsKKwkJCisJCXBrdF9sZW4gPSByeF9mcmFtZS5jb3VudCAtIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik7CisJCXBrdF9zdGF0ID0gcnhfZnJhbWUuc3RhdHVzOworCQkKKwkJbmV4dF9mcmFtZSA9IHRoaXNfZnJhbWUgKyAxICsgKChwa3RfbGVuKzQpPj44KTsKKwkJCisJCWlmIChwa3RfbGVuIDwgNjAgIHx8ICBwa3RfbGVuID4gMTUxOCkgCisJCXsKKwkJCWlmIChlaV9kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJvZ3VzIHBhY2tldCBzaXplOiAlZCwgc3RhdHVzPSUjMnggbnhwZz0lIzJ4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5jb3VudCwgcnhfZnJhbWUuc3RhdHVzLAorCQkJCQkgICByeF9mcmFtZS5uZXh0KTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJZWlfbG9jYWwtPnN0YXQucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisJCSBlbHNlIGlmICgocGt0X3N0YXQgJiAweDBGKSA9PSBFTlJTUl9SWE9LKSAKKwkJeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCQorCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCQkJaWYgKHNrYiA9PSBOVUxMKSAKKwkJCXsKKwkJCQlpZiAoZWlfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogSVAgaGVhZGVycyBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCQkJCWVpX2Jsb2NrX2lucHV0KGRldiwgcGt0X2xlbiwgc2tiLCBjdXJyZW50X29mZnNldCArIHNpemVvZihyeF9mcmFtZSkpOworCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X3BhY2tldHMrKzsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX1BIWSkKKwkJCQkJZWlfbG9jYWwtPnN0YXQubXVsdGljYXN0Kys7CisJCQl9CisJCX0gCisJCWVsc2UgCisJCXsKKwkJCWlmIChlaV9kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJvZ3VzIHBhY2tldDogc3RhdHVzPSUjMnggbnhwZz0lIzJ4IHNpemU9JWRcbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcnhfZnJhbWUuc3RhdHVzLCByeF9mcmFtZS5uZXh0LAorCQkJCQkgICByeF9mcmFtZS5jb3VudCk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9lcnJvcnMrKzsKKwkJCS8qIE5COiBUaGUgTklDIGNvdW50cyBDUkMsIGZyYW1lIGFuZCBtaXNzZWQgZXJyb3JzLiAqLworCQkJaWYgKHBrdF9zdGF0ICYgRU5SU1JfRk8pCisJCQkJZWlfbG9jYWwtPnN0YXQucnhfZmlmb19lcnJvcnMrKzsKKwkJfQorCQluZXh0X2ZyYW1lID0gcnhfZnJhbWUubmV4dDsKKwkJCisJCS8qIFRoaXMgX3Nob3VsZF8gbmV2ZXIgaGFwcGVuOiBpdCdzIGhlcmUgZm9yIGF2b2lkaW5nIGJhZCBjbG9uZXMuICovCisJCWlmIChuZXh0X2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpIHsKKwkJCXByaW50aygiJXM6IG5leHQgZnJhbWUgaW5jb25zaXN0ZW5jeSwgJSMyeFxuIiwgZGV2LT5uYW1lLAorCQkJCSAgIG5leHRfZnJhbWUpOworCQkJbmV4dF9mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOworCQl9CisJCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSBuZXh0X2ZyYW1lOworCQlvdXRiX3AobmV4dF9mcmFtZS0xLCBlODM5MF9iYXNlK0VOMF9CT1VOREFSWSk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGVpX3J4X292ZXJydW4gLSBoYW5kbGUgcmVjZWl2ZXIgb3ZlcnJ1bgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgZXhjZXB0aW9uCisgKgorICogV2UgaGF2ZSBhIHJlY2VpdmVyIG92ZXJydW46IHdlIGhhdmUgdG8ga2ljayB0aGUgODM5MCB0byBnZXQgaXQgc3RhcnRlZAorICogYWdhaW4uIFByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byBraWNrIGl0IGV4YWN0bHkgYXMgTlMgcHJlc2NyaWJlcyBpbgorICogdGhlIHVwZGF0ZWQgZGF0YXNoZWV0cywgb3IgInRoZSBOSUMgbWF5IGFjdCBpbiBhbiB1bnByZWRpY3RhYmxlIG1hbm5lci4iCisgKiBUaGlzIGluY2x1ZGVzIGNhdXNpbmcgInRoZSBOSUMgdG8gZGVmZXIgaW5kZWZpbml0ZWx5IHdoZW4gaXQgaXMgc3RvcHBlZAorICogb24gYSBidXN5IG5ldHdvcmsuIiAgVWdoLgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBEb24ndCBjYWxsIHRoaXMgd2l0aCB0aGUgaW50ZXJydXB0cyBvZmYgb3IgeW91cgorICogY29tcHV0ZXIgd2lsbCBoYXRlIHlvdSAtIGl0IHRha2VzIDEwbXMgb3Igc28uIAorICovCisKK3N0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlheG5ldF9kZXZfdCAqaW5mbyA9IChheG5ldF9kZXZfdCAqKWRldjsKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHdhc190eGluZywgbXVzdF9yZXNlbmQgPSAwOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKwkvKgorCSAqIFJlY29yZCB3aGV0aGVyIGEgVHggd2FzIGluIHByb2dyZXNzIGFuZCB0aGVuIGlzc3VlIHRoZQorCSAqIHN0b3AgY29tbWFuZC4KKwkgKi8KKwl3YXNfdHhpbmcgPSBpbmJfcChlODM5MF9iYXNlK0U4MzkwX0NNRCkgJiBFODM5MF9UUkFOUzsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworICAgIAorCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZXIgb3ZlcnJ1bi5cbiIsIGRldi0+bmFtZSk7CisJZWlfbG9jYWwtPnN0YXQucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAKKwkvKiAKKwkgKiBXYWl0IGEgZnVsbCBUeCB0aW1lICgxLjJtcykgKyBzb21lIGd1YXJkIHRpbWUsIE5TIHNheXMgMS42bXMgdG90YWwuCisJICogRWFybHkgZGF0YXNoZWV0cyBzYWlkIHRvIHBvbGwgdGhlIHJlc2V0IGJpdCwgYnV0IG5vdyB0aGV5IHNheSB0aGF0CisJICogaXQgImlzIG5vdCBhIHJlbGlhYmxlIGluZGljYXRvciBhbmQgc3Vic2VxdWVudGx5IHNob3VsZCBiZSBpZ25vcmVkLiIKKwkgKiBXZSB3YWl0IGF0IGxlYXN0IDEwbXMuCisJICovCisKKwltZGVsYXkoMTApOworCisJLyoKKwkgKiBSZXNldCBSQkNSWzAxXSBiYWNrIHRvIHplcm8gYXMgcGVyIG1hZ2ljIGluY2FudGF0aW9uLgorCSAqLworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05UTE8pOworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05USEkpOworCisJLyoKKwkgKiBTZWUgaWYgYW55IFR4IHdhcyBpbnRlcnJ1cHRlZCBvciBub3QuIEFjY29yZGluZyB0byBOUywgdGhpcworCSAqIHN0ZXAgaXMgdml0YWwsIGFuZCBza2lwcGluZyBpdCB3aWxsIGNhdXNlIG5vIGVuZCBvZiBoYXZvYy4KKwkgKi8KKworCWlmICh3YXNfdHhpbmcpCisJeyAKKwkJdW5zaWduZWQgY2hhciB0eF9jb21wbGV0ZWQgPSBpbmJfcChlODM5MF9iYXNlK0VOMF9JU1IpICYgKEVOSVNSX1RYK0VOSVNSX1RYX0VSUik7CisJCWlmICghdHhfY29tcGxldGVkKQorCQkJbXVzdF9yZXNlbmQgPSAxOworCX0KKworCS8qCisJICogSGF2ZSB0byBlbnRlciBsb29wYmFjayBtb2RlIGFuZCB0aGVuIHJlc3RhcnQgdGhlIE5JQyBiZWZvcmUKKwkgKiB5b3UgYXJlIGFsbG93ZWQgdG8gc2x1cnAgcGFja2V0cyB1cCBvZmYgdGhlIHJpbmcuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOworCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCisJLyoKKwkgKiBDbGVhciB0aGUgUnggcmluZyBvZiBhbGwgdGhlIGRlYnJpcywgYW5kIGFjayB0aGUgaW50ZXJydXB0LgorCSAqLworCWVpX3JlY2VpdmUoZGV2KTsKKworCS8qCisJICogTGVhdmUgbG9vcGJhY2sgbW9kZSwgYW5kIHJlc2VuZCBhbnkgcGFja2V0IHRoYXQgZ290IHN0b3BwZWQuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYQ09ORklHIHwgaW5mby0+ZHVwbGV4X2ZsYWcsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IAorCWlmIChtdXN0X3Jlc2VuZCkKKyAgICAJCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQgKyBFODM5MF9UUkFOUywgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Cit9CisKKy8qCisgKglDb2xsZWN0IHRoZSBzdGF0cy4gVGhpcyBpcyBjYWxsZWQgdW5sb2NrZWQgYW5kIGZyb20gc2V2ZXJhbCBjb250ZXh0cy4KKyAqLworIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorCS8qIElmIHRoZSBjYXJkIGlzIHN0b3BwZWQsIGp1c3QgcmV0dXJuIHRoZSBwcmVzZW50IHN0YXRzLiAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gJmVpX2xvY2FsLT5zdGF0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssZmxhZ3MpOworCS8qIFJlYWQgdGhlIGNvdW50ZXIgcmVnaXN0ZXJzLCBhc3N1bWluZyB3ZSBhcmUgaW4gcGFnZSAwLiAqLworCWVpX2xvY2FsLT5zdGF0LnJ4X2ZyYW1lX2Vycm9ycyArPSBpbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjApOworCWVpX2xvY2FsLT5zdGF0LnJ4X2NyY19lcnJvcnMgICArPSBpbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjEpOworCWVpX2xvY2FsLT5zdGF0LnJ4X21pc3NlZF9lcnJvcnMrPSBpbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKyAgICAKKwlyZXR1cm4gJmVpX2xvY2FsLT5zdGF0OworfQorCisvKioKKyAqIGRvX3NldF9tdWx0aWNhc3RfbGlzdCAtIHNldC9jbGVhciBtdWx0aWNhc3QgZmlsdGVyCisgKiBAZGV2OiBuZXQgZGV2aWNlIGZvciB3aGljaCBtdWx0aWNhc3QgZmlsdGVyIGlzIGFkanVzdGVkCisgKgorICoJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuIE1heSBiZSBjYWxsZWQKKyAqCWZyb20gYSBCSCBpbiAyLjEueC4gTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuIAorICovCisgCitzdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKyAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDU4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworCWVsc2UgaWYoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19saXN0KQorICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4NDgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisgIAllbHNlCisgIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHg0MCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKK30KKworLyoKKyAqCUNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZC4gVGhpcyBpcyBpbnZva2VkIGZyb20gdXNlciBjb250ZXh0IGFuZCBtYXkKKyAqCWJlIHBhcmFsbGVsIHRvIGp1c3QgYWJvdXQgZXZlcnl0aGluZyBlbHNlLiBJdHMgYWxzbyBmYWlybHkgcXVpY2sgYW5kCisgKglub3QgY2FsbGVkIHRvbyBvZnRlbi4gTXVzdCBwcm90ZWN0IGFnYWluc3QgYm90aCBiaCBhbmQgaXJxIHVzZXJzCisgKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfbG9jayhkZXYpLCBmbGFncyk7CisJZG9fc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X2xvY2soZGV2KSwgZmxhZ3MpOworfQkKKworLyoqCisgKiBheGRldl9zZXR1cCAtIGluaXQgcmVzdCBvZiA4MzkwIGRldmljZSBzdHJ1Y3QKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSB0byBpbml0CisgKgorICogSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgODM5MCBkZXZpY2Ugc3RydWN0dXJlLiAgRG8gTk9UIF9faW5pdAorICogdGhpcywgYXMgaXQgaXMgdXNlZCBieSA4MzkwIGJhc2VkIG1vZHVsYXIgZHJpdmVycyB0b28uCisgKi8KKworc3RhdGljIHZvaWQgYXhkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbDsKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsodmVyc2lvbl84MzkwKTsKKyAgICAKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkJCisJZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKW5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmVpX2xvY2FsLT5wYWdlX2xvY2spOworICAgIAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVpX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJPSBnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisJZXRoZXJfc2V0dXAoZGV2KTsKK30KKworLyogVGhpcyBwYWdlIG9mIGZ1bmN0aW9ucyBzaG91bGQgYmUgODM5MCBnZW5lcmljICovCisvKiBGb2xsb3cgTmF0aW9uYWwgU2VtaSdzIHJlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIHRoZSAiTklDIi4gKi8KKworLyoqCisgKiBBWDg4MTkwX2luaXQgLSBpbml0aWFsaXplIDgzOTAgaGFyZHdhcmUKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqIEBzdGFydHA6IGJvb2xlYW4uICBub24temVybyB2YWx1ZSB0byBpbml0aWF0ZSBjaGlwIHByb2Nlc3NpbmcKKyAqCisgKglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBBWDg4MTkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCkKK3sKKwlheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJaW50IGVuZGNmZyA9IGVpX2xvY2FsLT53b3JkMTYgPyAoMHg0OCB8IEVORENGR19XVFMpIDogMHg0ODsKKyAgICAKKwlpZihzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpIT00KQorICAgIAkJcGFuaWMoIjgzOTAuYzogaGVhZGVyIHN0cnVjdCBtaXNwYWNrZWRcbiIpOyAgICAKKwkvKiBGb2xsb3cgTmF0aW9uYWwgU2VtaSdzIHJlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGluZyB0aGUgRFA4MzkwMi4gKi8KKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOyAvKiAweDIxICovCisJb3V0Yl9wKGVuZGNmZywgZTgzOTBfYmFzZSArIEVOMF9EQ0ZHKTsJLyogMHg0OCBvciAweDQ5ICovCisJLyogQ2xlYXIgdGhlIHJlbW90ZSBieXRlIGNvdW50IHJlZ2lzdGVycy4gKi8KKwlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwkvKiBTZXQgdG8gbW9uaXRvciBhbmQgbG9vcGJhY2sgbW9kZSAtLSB0aGlzIGlzIHZpdGFsIS4gKi8KKwlvdXRiX3AoRTgzOTBfUlhPRkZ8MHg0MCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogMHg2MCAqLworCW91dGJfcChFODM5MF9UWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgLyogMHgwMiAqLworCS8qIFNldCB0aGUgdHJhbnNtaXQgcGFnZSBhbmQgcmVjZWl2ZSByaW5nLiAqLworCW91dGJfcChlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKKwllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CisJb3V0Yl9wKGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUQVJUUEcpOworCW91dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLTEsIGU4MzkwX2Jhc2UgKyBFTjBfQk9VTkRBUlkpOwkvKiAzYzUwMyBzYXlzIDB4M2YsTlMweDI2Ki8KKwllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CQkvKiBhc3NlcnQgYm91bmRhcnkrMSAqLworCW91dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUT1BQRyk7CisJLyogQ2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgbWFzay4gKi8KKwlvdXRiX3AoMHhGRiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworICAgIAorCS8qIENvcHkgdGhlIHN0YXRpb24gYWRkcmVzcyBpbnRvIHRoZSBEUzgzOTAgcmVnaXN0ZXJzLiAqLworCisJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4NjEgKi8KKwlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIAorCXsKKwkJb3V0Yl9wKGRldi0+ZGV2X2FkZHJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSk7CisJCWlmKGluYl9wKGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSkhPWRldi0+ZGV2X2FkZHJbaV0pCisJCQlwcmludGsoS0VSTl9FUlIgIkh3LiBhZGRyZXNzIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOworCX0KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG11bHRpY2FzdCBsaXN0IHRvIGFjY2VwdC1hbGwuICBJZiB3ZSBlbmFibGUgbXVsdGljYXN0CisJICogdGhlIGhpZ2hlciBsZXZlbHMgY2FuIGRvIHRoZSBmaWx0ZXJpbmcuCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJb3V0Yl9wKDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjFfTVVMVCArIGkpOworCisJb3V0Yl9wKGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4xX0NVUlBBRyk7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZWlfbG9jYWwtPnR4MSA9IGVpX2xvY2FsLT50eDIgPSAwOworCWVpX2xvY2FsLT50eGluZyA9IDA7CisKKwlpZiAoc3RhcnRwKSAKKwl7CisJCW91dGJfcCgweGZmLCAgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQlvdXRiX3AoRU5JU1JfQUxMLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKwkJb3V0Yl9wKEU4MzkwX1RYQ09ORklHIHwgaW5mby0+ZHVwbGV4X2ZsYWcsCisJCSAgICAgICBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiB4bWl0IG9uLiAqLworCQkvKiAzYzUwMyBUZWNoTWFuIHNheXMgcnhjb25maWcgb25seSBhZnRlciB0aGUgTklDIGlzIHN0YXJ0ZWQuICovCisJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4NDAsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7IC8qIHJ4IG9uLCAqLworCQlkb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsJLyogKHJlKWxvYWQgdGhlIG1jYXN0IHRhYmxlICovCisJfQorfQorCisvKiBUcmlnZ2VyIGEgdHJhbnNtaXQgc3RhcnQsIGFzc3VtaW5nIHRoZSBsZW5ndGggaXMgdmFsaWQuIAorICAgQWx3YXlzIGNhbGxlZCB3aXRoIHRoZSBwYWdlIGxvY2sgaGVsZCAqLworICAgCitzdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBzdGFydF9wYWdlKQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworIAlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorCWlmIChpbmJfcChlODM5MF9iYXNlKSAmIEU4MzkwX1RSQU5TKSAKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmlnZ2VyX3NlbmQoKSBjYWxsZWQgd2l0aCB0aGUgdHJhbnNtaXR0ZXIgYnVzeS5cbiIsCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCW91dGJfcChsZW5ndGggJiAweGZmLCBlODM5MF9iYXNlICsgRU4wX1RDTlRMTyk7CisJb3V0Yl9wKGxlbmd0aCA+PiA4LCBlODM5MF9iYXNlICsgRU4wX1RDTlRISSk7CisJb3V0Yl9wKHN0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfVFBTUik7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1RSQU5TK0U4MzkwX1NUQVJULCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTRlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBDT00yMDAyMCBQQ01DSUEgc3VwcG9ydAorICogCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1biwKKyAqICAgIGJhc2VkIG9uIGFuIElTQSB2ZXJzaW9uIGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIERlcml2ZWQgZnJvbSBpYm10cl9jcy5jIGJ5IFN0ZXZlIEtpcGlzeiAocGNtY2lhLWNzIDMuMS40KQorICogICAgd2hpY2ggd2FzIGRlcml2ZWQgZnJvbSBwY25ldF9jcy5jIGJ5IERhdmlkIEhpbmRzLgorICogU29tZSBhZGRpdGlvbmFsIHBvcnRpb25zIGRlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqIENoYW5nZXM6CisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAwOC8wOC8yMDAwCisgKiAtIHJlb3JnYW5pemUga21hbGxvY3MgaW4gY29tMjAwMjBfYXR0YWNoLCBjaGVja2luZyBhbGwgZm9yIGZhaWx1cmUKKyAqICAgYW5kIHJlbGVhc2luZyB0aGUgcHJldmlvdXMgYWxsb2NhdGlvbnMgaWYgb25lIGZhaWxzCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IENPTTIwMDIwIFBDTUNJQSBzdXBwb3J0IGxvYWRlZC5cbiIKKworI2lmZGVmIFBDTUNJQV9ERUJVRworCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorCitzdGF0aWMgdm9pZCByZWdkdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBjb3VudDsKKyAgICAKKyAgICBwcmludGsoImNvbTIwMDIwIHJlZ2lzdGVyIGR1bXA6XG4iKTsKKyAgICBmb3IgKGNvdW50ID0gaW9hZGRyOyBjb3VudCA8IGlvYWRkciArIDE2OyBjb3VudCsrKQorICAgIHsKKwlpZiAoIShjb3VudCAlIDE2KSkKKwkgICAgcHJpbnRrKCJcbiUwNFg6ICIsIGNvdW50KTsKKwlwcmludGsoIiUwMlggIiwgaW5iKGNvdW50KSk7CisgICAgfQorICAgIHByaW50aygiXG4iKTsKKyAgICAKKyAgICBwcmludGsoImJ1ZmZlcjAgZHVtcDpcbiIpOworCS8qIHNldCB1cCB0aGUgYWRkcmVzcyByZWdpc3RlciAqLworICAgICAgICBjb3VudCA9IDA7CisJb3V0YigoY291bnQgPj4gOCkgfCBSRERBVEFmbGFnIHwgQVVUT0lOQ2ZsYWcsIF9BRERSX0hJKTsKKwlvdXRiKGNvdW50ICYgMHhmZiwgX0FERFJfTE8pOworICAgIAorICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NiszMjsgY291bnQrKykKKyAgICB7CisJaWYgKCEoY291bnQgJSAxNikpCisJICAgIHByaW50aygiXG4lMDRYOiAiLCBjb3VudCk7CisJCisJLyogY29weSB0aGUgZGF0YSAqLworCXByaW50aygiJTAyWCAiLCBpbmIoX01FTURBVEEpKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworfQorCisjZWxzZQorCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdkdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsgfQorCisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJyAqLworCitzdGF0aWMgaW50IG5vZGU7CitzdGF0aWMgaW50IHRpbWVvdXQgPSAzOworc3RhdGljIGludCBiYWNrcGxhbmU7CitzdGF0aWMgaW50IGNsb2NrcDsKK3N0YXRpYyBpbnQgY2xvY2ttOworCittb2R1bGVfcGFyYW0obm9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJhY2twbGFuZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja3AsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2ttLCBpbnQsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBjb20yMDAyMF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBjb20yMDAyMF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImNvbTIwMDIwX2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKmNvbTIwMDIwX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBjb20yMDAyMF9kZXZfdCB7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKKyAgICBkZXZfbm9kZV90ICAgICAgICAgIG5vZGU7Cit9IGNvbTIwMDIwX2Rldl90OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGNvbTIwMDIwX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgICAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKmNvbTIwMDIwX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgY29tMjAwMjBfZGV2X3QgKmluZm87CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwOworICAgIAorICAgIERFQlVHKDAsICJjb20yMDAyMF9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IG5ldHdvcmsgZGV2aWNlICovCisgICAgbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFsaW5rKQorCXJldHVybiBOVUxMOworCisgICAgaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb20yMDAyMF9kZXZfdCksIEdGUF9LRVJORUwpOworICAgIGlmICghaW5mbykKKwlnb3RvIGZhaWxfYWxsb2NfaW5mbzsKKworICAgIGRldiA9IGFsbG9jX2FyY2RldigiIik7CisgICAgaWYgKCFkZXYpCisJZ290byBmYWlsX2FsbG9jX2RldjsKKworICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGNvbTIwMDIwX2Rldl90KSk7CisgICAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworICAgIGxwID0gZGV2LT5wcml2OworICAgIGxwLT50aW1lb3V0ID0gdGltZW91dDsKKyAgICBscC0+YmFja3BsYW5lID0gYmFja3BsYW5lOworICAgIGxwLT5jbG9ja3AgPSBjbG9ja3A7CisgICAgbHAtPmNsb2NrbSA9IGNsb2NrbSAmIDM7CisgICAgbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisKKyAgICAvKiBmaWxsIGluIG91ciBtb2R1bGUgcGFyYW1ldGVycyBhcyBkZWZhdWx0cyAqLworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBub2RlOworCisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworCisgICAgbGluay0+aXJxLkluc3RhbmNlID0gaW5mby0+ZGV2ID0gZGV2OworICAgIGxpbmstPnByaXYgPSBpbmZvOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKyAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZjb20yMDAyMF9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKyAgICAgICAgY29tMjAwMjBfZGV0YWNoKGxpbmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKKworZmFpbF9hbGxvY19kZXY6CisgICAga2ZyZWUoaW5mbyk7CitmYWlsX2FsbG9jX2luZm86CisgICAga2ZyZWUobGluayk7CisgICAgcmV0dXJuIE5VTEw7Cit9IC8qIGNvbTIwMDIwX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgY29tMjAwMjBfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAKKyAgICAKKyAgICBERUJVRygxLCJkZXRhY2guLi5cbiIpOworCisgICAgREVCVUcoMCwgImNvbTIwMDIwX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisgICAgICAgIGlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBpZiAobGluay0+ZGV2KSB7CisJREVCVUcoMSwidW5yZWdpc3Rlci4uLlxuIik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCSAgICAKKwkvKgorCSAqIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgcmVnaXN0ZXIgb3VyIElSUSBzZXBhcmF0ZWx5CisJICogZnJvbSBjYXJkIHNlcnZpY2VzLgorCSAqLworCWlmIChkZXYtPmlycSkKKwkgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgfQorCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgY29tMjAwMjBfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisgICAgICAgIHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgIERFQlVHKDEsInVubGlua2luZy4uLlxuIik7CisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBpZiAobGluay0+cHJpdikKKyAgICB7CisJZGV2ID0gaW5mby0+ZGV2OworCWlmIChkZXYpCisJeworCSAgICBERUJVRygxLCJrZnJlZS4uLlxuIik7CisJICAgIGZyZWVfbmV0ZGV2KGRldik7CisJfQorCURFQlVHKDEsImtmcmVlMi4uLlxuIik7CisJa2ZyZWUoaW5mbyk7CisgICAgfQorICAgIERFQlVHKDEsImtmcmVlMy4uLlxuIik7CisgICAga2ZyZWUobGluayk7CisKK30gLyogY29tMjAwMjBfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgY29tMjAwMjBfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgICAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBjb20yMDAyMF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBjb20yMDAyMF9kZXZfdCAqaW5mbzsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAgICB1X2NoYXIgYnVmWzY0XTsKKyAgICBpbnQgaW9hZGRyOworCisgICAgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIGluZm8gPSBsaW5rLT5wcml2OworICAgIGRldiA9IGluZm8tPmRldjsKKworICAgIERFQlVHKDEsImNvbmZpZy4uLlxuIik7CisKKyAgICBERUJVRygwLCAiY29tMjAwMjBfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgREVCVUcoMSwiYXJjbmV0OiBiYXNlcG9ydDEgaXMgJVhoXG4iLCBsaW5rLT5pby5CYXNlUG9ydDEpOworICAgIGkgPSAhQ1NfU1VDQ0VTUzsKKyAgICBpZiAoIWxpbmstPmlvLkJhc2VQb3J0MSkKKyAgICB7CisJZm9yIChpb2FkZHIgPSAweDEwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKQorCXsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOworCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKQorCQlicmVhazsKKwl9CisgICAgfQorICAgIGVsc2UKKwlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIAorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpCisgICAgeworCURFQlVHKDEsImFyY25ldDogcmVxdWVzdElPIGZhaWxlZCB0b3RhbGx5IVxuIik7CisJZ290byBmYWlsZWQ7CisgICAgfQorCQorICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIERFQlVHKDEsImFyY25ldDogZ290IGlvYWRkciAlWGhcbiIsIGlvYWRkcik7CisKKyAgICBERUJVRygxLCJhcmNuZXQ6IHJlcXVlc3QgSVJRICVkICglWGgvJVhoKVxuIiwKKwkgICBsaW5rLT5pcnEuQXNzaWduZWRJUlEsCisJICAgbGluay0+aXJxLklSUUluZm8xLCBsaW5rLT5pcnEuSVJRSW5mbzIpOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKwlERUJVRygxLCJhcmNuZXQ6IHJlcXVlc3RJUlEgZmFpbGVkIHRvdGFsbHkhXG4iKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIGlmIChjb20yMDAyMF9jaGVjayhkZXYpKQorICAgIHsKKwlyZWdkdW1wKGRldik7CisJZ290byBmYWlsZWQ7CisgICAgfQorICAgIAorICAgIGxwID0gZGV2LT5wcml2OworICAgIGxwLT5jYXJkX25hbWUgPSAiUENNQ0lBIENPTTIwMDIwIjsKKyAgICBscC0+Y2FyZF9mbGFncyA9IEFSQ19DQU5fMTBNQklUOyAvKiBwcmV0ZW5kIGFsbCBvZiB0aGVtIGNhbiAxME1iaXQgKi8KKworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGkgPSBjb20yMDAyMF9mb3VuZChkZXYsIDApOwkvKiBjYWxscyByZWdpc3Rlcl9uZXRkZXYgKi8KKyAgICAKKyAgICBpZiAoaSAhPSAwKSB7CisJREVCVUcoMSxLRVJOX05PVElDRSAiY29tMjAwMjBfY3M6IGNvbTIwMDIwX2ZvdW5kKCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShpbmZvLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgREVCVUcoMSxLRVJOX0lORk8gIiVzOiBwb3J0ICUjM2x4LCBpcnEgJWRcbiIsCisgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBERUJVRygxLCJjb20yMDAyMF9jb25maWcgZmFpbGVkLi4uXG4iKTsKKyAgICBjb20yMDAyMF9yZWxlYXNlKGxpbmspOworfSAvKiBjb20yMDAyMF9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgY29tMjAwMjBfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisKKyAgICBERUJVRygxLCJyZWxlYXNlLi4uXG4iKTsKKworICAgIERFQlVHKDAsICJjb20yMDAyMF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+KERFVl9DT05GSUcgfCBERVZfUkVMRUFTRV9QRU5ESU5HKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY29tMjAwMjBfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIGNvbTIwMDIwX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworCisgICAgREVCVUcoMSwgImNvbTIwMDIwX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQ7CisJY29tMjAwMjBfY29uZmlnKGxpbmspOyAKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworICAgICAgICAgICAgICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworCQlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCQlBUkNSRVNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGNvbTIwMDIwX2V2ZW50ICovCisKKworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgY29tMjAwMjBfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiY29tMjAwMjBfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBjb20yMDAyMF9hdHRhY2gsCisJLmRldGFjaAkJPSBjb20yMDAyMF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2NvbTIwMDIwX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmNvbTIwMDIwX2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2NvbTIwMDIwX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZjb20yMDAyMF9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9jb20yMDAyMF9jcyk7Cittb2R1bGVfZXhpdChleGl0X2NvbTIwMDIwX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MjQ4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC0wLDAgKzEsMTI4NiBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgZm12ajE4eF9jcy5jIDIuOCAyMDAyLzAzLzIzCisKKyAgICBBIGZtdmoxOHggKGFuZCBpdHMgY29tcGF0aWJsZXMpIFBDTUNJQSBjbGllbnQgZHJpdmVyCisKKyAgICBDb250cmlidXRlZCBieSBTaGluZ28gRnVqaW1vdG8sIHNoaW5nb0BmbGFiLmZ1aml0c3UuY28uanAKKworICAgIFRESyBMQUstQ0QwMjEgYW5kIENPTlRFQyBDLU5FVChQQylDIHN1cHBvcnQgYWRkZWQgYnkgCisgICAgTm9idWhpcm8gS2F0YXlhbWEsIGthdGEtbkBwby5paWpuZXQub3IuanAKKworICAgIFRoZSBQQ01DSUEgY2xpZW50IGNvZGUgaXMgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IERhdmlkIEhpbmRzLgorICAgIE5ldHdvcmsgY29kZSBpcyBiYXNlZCBvbiB0aGUgIkZNVi0xOHggZHJpdmVyIiBieSBZdXRha2EgVEFNSVlBCisgICAgYnV0IGlzIGFjdHVhbGx5IGxhcmdlbHkgRG9uYWxkIEJlY2tlcidzIEFUMTcwMCBkcml2ZXIsIHdoaWNoCisgICAgY2FycmllcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0aW9uOgorCisgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAgICAKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgICAKKyAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICAgIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorICAgIDQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisgICAgQW5uYXBvbGlzIE1EIDIxNDAzCisgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIERSVl9OQU1FCSJmbXZqMTh4X2NzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi44IgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJmbXZqMTh4IGFuZCBjb21wYXRpYmxlIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworLyogU1JBTSBjb25maWd1cmF0aW9uICovCisvKiAwOjRLQioyIFRYIGJ1ZmZlciAgIGVsc2U6OEtCKjIgVFggYnVmZmVyICovCitJTlRfTU9EVUxFX1BBUk0oc3JhbV9jb25maWcsIDApOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitJTlRfTU9EVUxFX1BBUk0ocGNfZGVidWcsIFBDTUNJQV9ERUJVRyk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9IERSVl9OQU1FICIuYyAiIERSVl9WRVJTSU9OICIgMjAwMi8wMy8yMyI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoKKyAgICBQQ01DSUEgZXZlbnQgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgZm12ajE4eF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGZtdmoxOHhfZ2V0X2h3aW5mbyhkZXZfbGlua190ICpsaW5rLCB1X2NoYXIgKm5vZGVfaWQpOworc3RhdGljIGludCBmbXZqMTh4X3NldHVwX21mYyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGZtdmoxOHhfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgZm12ajE4eF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgZGV2X2xpbmtfdCAqZm12ajE4eF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBmbXZqMTh4X2RldGFjaChkZXZfbGlua190ICopOworCisvKgorICAgIExBTiBjb250cm9sbGVyKE1CSDg2OTYwQSkgc3BlY2lmaWMgcm91dGluZXMKKyAqLworc3RhdGljIGludCBmam5fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZmpuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGZqbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZmpuX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZmpuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGZqbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZqbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZmpuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZmpuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiZm12ajE4eF9jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qCisgICAgY2FyZCB0eXBlCisgKi8KK3R5cGVkZWYgZW51bSB7IE1CSDEwMzAyLCBNQkgxMDMwNCwgVERLLCBDT05URUMsIExBNTAxLCBVTkdFUk1BTk4sIAorCSAgICAgICBYWFgxMDMwNAorfSBjYXJkdHlwZV90OworCisvKgorICAgIGRyaXZlciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZQorKi8KK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CisgICAgZGV2X2xpbmtfdCBsaW5rOworICAgIGRldl9ub2RlX3Qgbm9kZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBsb25nIG9wZW5fdGltZTsKKyAgICB1aW50IHR4X3N0YXJ0ZWQ6MTsKKyAgICB1aW50IHR4X3F1ZXVlOworICAgIHVfc2hvcnQgdHhfcXVldWVfbGVuOworICAgIGNhcmR0eXBlX3QgY2FyZHR5cGU7CisgICAgdV9zaG9ydCBzZW50OworICAgIHVfY2hhciBtY19maWx0ZXJbOF07Cit9IGxvY2FsX2luZm9fdDsKKworI2RlZmluZSBNQ19GSUxURVJCUkVBSyA2NAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIAorICAgIGlvcG9ydCBvZmZzZXQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIAorICovCisjZGVmaW5lIFRYX1NUQVRVUyAgICAgICAgICAgICAgIDAgLyogdHJhbnNtaXQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJYX1NUQVRVUyAgICAgICAgICAgICAgIDEgLyogcmVjZWl2ZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhfSU5UUiAgICAgICAgICAgICAgICAgMiAvKiB0cmFuc21pdCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBSWF9JTlRSICAgICAgICAgICAgICAgICAzIC8qIHJlY2VpdmUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhfTU9ERSAgICAgICAgICAgICAgICAgNCAvKiB0cmFuc21pdCBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIFJYX01PREUgICAgICAgICAgICAgICAgIDUgLyogcmVjZWl2ZSBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIENPTkZJR18wICAgICAgICAgICAgICAgIDYgLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAwICovCisjZGVmaW5lIENPTkZJR18xICAgICAgICAgICAgICAgIDcgLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAxICovCisKKyNkZWZpbmUgTk9ERV9JRCAgICAgICAgICAgICAgICAgOCAvKiBub2RlIElEIHJlZ2lzdGVyICAgICAgICAgICAgKGJhbmsgMCkgKi8KKyNkZWZpbmUgTUFSX0FEUiAgICAgICAgICAgICAgICAgOCAvKiBtdWx0aWNhc3QgYWRkcmVzcyByZWdpc3RlcnMgKGJhbmsgMSkgKi8KKworI2RlZmluZSBEQVRBUE9SVCAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlciBtZW0gcG9ydCByZWdpc3RlcnMgICAoYmFuayAyKSAqLworI2RlZmluZSBUWF9TVEFSVCAgICAgICAgICAgICAgIDEwIC8qIHRyYW5zbWl0IHN0YXJ0IHJlZ2lzdGVyICovCisjZGVmaW5lIENPTF9DVFJMICAgICAgICAgICAgICAgMTEgLyogMTYgY29sbGlzaW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQk1QUjEyICAgICAgICAgICAgICAgICAxMiAvKiByZXNlcnZlZCAqLworI2RlZmluZSBCTVBSMTMgICAgICAgICAgICAgICAgIDEzIC8qIHJlc2VydmVkICovCisjZGVmaW5lIFJYX1NLSVAgICAgICAgICAgICAgICAgMTQgLyogc2tpcCByZWNlaXZlZCBwYWNrZXQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBMQU5fQ1RSTCAgICAgICAgICAgICAgIDE2IC8qIExBTiBjYXJkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBNQUNfSUQgICAgICAgICAgICAgICAweDFhIC8qIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVU5HRVJNQU5OX01BQ19JRCAgICAgMHgxOCAvKiBVTkdFUk1BTk4tQkFTUyBoYXJkd2FyZSBhZGRyZXNzICovCisKKy8qIAorICAgIGNvbnRyb2wgYml0cyAKKyAqLworI2RlZmluZSBFTkFfVE1UX09LICAgICAgICAgICAweDgwCisjZGVmaW5lIEVOQV9UTVRfUkVDICAgICAgICAgIDB4MjAKKyNkZWZpbmUgRU5BX0NPTCAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFTkFfMTZfQ09MICAgICAgICAgICAweDAyCisjZGVmaW5lIEVOQV9UQlVTX0VSUiAgICAgICAgIDB4MDEKKworI2RlZmluZSBFTkFfUEtUX1JEWSAgICAgICAgICAweDgwCisjZGVmaW5lIEVOQV9CVVNfRVJSICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRU5BX0xFTl9FUlIgICAgICAgICAgMHgwOAorI2RlZmluZSBFTkFfQUxHX0VSUiAgICAgICAgICAweDA0CisjZGVmaW5lIEVOQV9DUkNfRVJSICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRU5BX09WUl9GTE8gICAgICAgICAgMHgwMQorCisvKiBmbGFncyAqLworI2RlZmluZSBGX1RNVF9SRFkgICAgICAgICAgICAweDgwIC8qIGNhbiBhY2NlcHQgbmV3IHBhY2tldCAqLworI2RlZmluZSBGX05FVF9CU1kgICAgICAgICAgICAweDQwIC8qIGNhcnJpZXIgaXMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgRl9UTVRfT0sgICAgICAgICAgICAgMHgyMCAvKiBzZW5kIHBhY2tldCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgRl9TUlRfUEtUICAgICAgICAgICAgMHgxMCAvKiBzaG9ydCBwYWNrZXQgZXJyb3IgKi8KKyNkZWZpbmUgRl9DT0xfRVJSICAgICAgICAgICAgMHgwNCAvKiBjb2xsaXNpb24gZXJyb3IgKi8KKyNkZWZpbmUgRl8xNl9DT0wgICAgICAgICAgICAgMHgwMiAvKiAxNiBjb2xsaXNpb24gZXJyb3IgKi8KKyNkZWZpbmUgRl9UQlVTX0VSUiAgICAgICAgICAgMHgwMSAvKiBidXMgcmVhZCBlcnJvciAqLworCisjZGVmaW5lIEZfUEtUX1JEWSAgICAgICAgICAgIDB4ODAgLyogcGFja2V0KHMpIGluIGJ1ZmZlciAqLworI2RlZmluZSBGX0JVU19FUlIgICAgICAgICAgICAweDQwIC8qIGJ1cyByZWFkIGVycm9yICovCisjZGVmaW5lIEZfTEVOX0VSUiAgICAgICAgICAgIDB4MDggLyogc2hvcnQgcGFja2V0ICovCisjZGVmaW5lIEZfQUxHX0VSUiAgICAgICAgICAgIDB4MDQgLyogZnJhbWUgZXJyb3IgKi8KKyNkZWZpbmUgRl9DUkNfRVJSICAgICAgICAgICAgMHgwMiAvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgRl9PVlJfRkxPICAgICAgICAgICAgMHgwMSAvKiBvdmVyZmxvdyBlcnJvciAqLworCisjZGVmaW5lIEZfQlVGX0VNUCAgICAgICAgICAgIDB4NDAgLyogcmVjZWl2ZSBidWZmZXIgaXMgZW1wdHkgKi8KKworI2RlZmluZSBGX1NLUF9QS1QgICAgICAgICAgICAweDA1IC8qIGRyb3AgcGFja2V0IGluIGJ1ZmZlciAqLworCisvKiBkZWZhdWx0IGJpdG1hcHMgKi8KKyNkZWZpbmUgRF9UWF9JTlRSICAoIEVOQV9UTVRfT0sgKQorI2RlZmluZSBEX1JYX0lOVFIgICggRU5BX1BLVF9SRFkgfCBFTkFfTEVOX0VSUiBcCisJCSAgIHwgRU5BX0FMR19FUlIgfCBFTkFfQ1JDX0VSUiB8IEVOQV9PVlJfRkxPICkKKyNkZWZpbmUgVFhfU1RBVF9NICAoIEZfVE1UX1JEWSApCisjZGVmaW5lIFJYX1NUQVRfTSAgKCBGX1BLVF9SRFkgfCBGX0xFTl9FUlIgXAorICAgICAgICAgICAgICAgICAgIHwgRl9BTEdfRVJSIHwgRl9DUkNfRVJSIHwgRl9PVlJfRkxPICkKKworLyogY29tbWFuZHMgKi8KKyNkZWZpbmUgRF9UWF9NT0RFICAgICAgICAgICAgMHgwNiAvKiBubyB0ZXN0cywgZGV0ZWN0IGNhcnJpZXIgKi8KKyNkZWZpbmUgSURfTUFUQ0hFRCAgICAgICAgICAgMHgwMiAvKiAoUlhfTU9ERSkgKi8KKyNkZWZpbmUgUkVDVl9BTEwgICAgICAgICAgICAgMHgwMyAvKiAoUlhfTU9ERSkgKi8KKyNkZWZpbmUgQ09ORklHMF9ERkwgICAgICAgICAgMHg1YSAvKiAxNmJpdCBidXMsIDRLIHggMiBUeCBxdWV1ZXMgKi8KKyNkZWZpbmUgQ09ORklHMF9ERkxfMSAgICAgICAgMHg1ZSAvKiAxNmJpdCBidXMsIDhLIHggMiBUeCBxdWV1ZXMgKi8KKyNkZWZpbmUgQ09ORklHMF9SU1QgICAgICAgICAgMHhkYSAvKiBEYXRhIExpbmsgQ29udHJvbGxlciBvZmYgKENPTkZJR18wKSAqLworI2RlZmluZSBDT05GSUcwX1JTVF8xICAgICAgICAweGRlIC8qIERhdGEgTGluayBDb250cm9sbGVyIG9mZiAoQ09ORklHXzApICovCisjZGVmaW5lIEJBTktfMCAgICAgICAgICAgICAgIDB4YTAgLyogYmFuayAwIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgQkFOS18xICAgICAgICAgICAgICAgMHhhNCAvKiBiYW5rIDEgKENPTkZJR18xKSAqLworI2RlZmluZSBCQU5LXzIgICAgICAgICAgICAgICAweGE4IC8qIGJhbmsgMiAoQ09ORklHXzEpICovCisjZGVmaW5lIENISVBfT0ZGICAgICAgICAgICAgIDB4ODAgLyogY29udHJsIGNoaXAgcG93ZXIgb2ZmIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgRE9fVFggICAgICAgICAgICAgICAgMHg4MCAvKiBkbyB0cmFuc21pdCBwYWNrZXQgKi8KKyNkZWZpbmUgU0VORF9QS1QgICAgICAgICAgICAgMHg4MSAvKiBzZW5kIGEgcGFja2V0ICovCisjZGVmaW5lIEFVVE9fTU9ERSAgICAgICAgICAgIDB4MDcgLyogQXV0byBza2lwIHBhY2tldCBvbiAxNiBjb2wgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUFOVV9NT0RFICAgICAgICAgICAgMHgwMyAvKiBTdG9wIGFuZCBza2lwIHBhY2tldCBvbiAxNiBjb2wgKi8KKyNkZWZpbmUgVERLX0FVVE9fTU9ERSAgICAgICAgMHg0NyAvKiBBdXRvIHNraXAgcGFja2V0IG9uIDE2IGNvbCBkZXRlY3RlZCAqLworI2RlZmluZSBUREtfTUFOVV9NT0RFICAgICAgICAweDQzIC8qIFN0b3AgYW5kIHNraXAgcGFja2V0IG9uIDE2IGNvbCAqLworI2RlZmluZSBJTlRSX09GRiAgICAgICAgICAgICAweDBkIC8qIExBTiBjb250cm9sbGVyIGlnbm9yZXMgaW50ZXJydXB0cyAqLworI2RlZmluZSBJTlRSX09OICAgICAgICAgICAgICAweDFkIC8qIExBTiBjb250cm9sbGVyIHdpbGwgY2F0Y2ggaW50ZXJydXB0cyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQJCSgoNDAwKkhaKS8xMDAwKQorCisjZGVmaW5lIEJBTktfMFUgICAgICAgICAgICAgIDB4MjAgLyogYmFuayAwIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgQkFOS18xVSAgICAgICAgICAgICAgMHgyNCAvKiBiYW5rIDEgKENPTkZJR18xKSAqLworI2RlZmluZSBCQU5LXzJVICAgICAgICAgICAgICAweDI4IC8qIGJhbmsgMiAoQ09ORklHXzEpICovCisKK3N0YXRpYyBkZXZfbGlua190ICpmbXZqMTh4X2F0dGFjaCh2b2lkKQoreworICAgIGxvY2FsX2luZm9fdCAqbHA7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgImZtdmoxOHhfYXR0YWNoKClcbiIpOworCisgICAgLyogTWFrZSB1cCBhIEZNVkoxOHggc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobG9jYWxfaW5mb190KSk7CisgICAgaWYgKCFkZXYpCisJcmV0dXJuIE5VTEw7CisgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmbHAtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDMyOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSA1OworCisgICAgLyogSW50ZXJydXB0IHNldHVwICovCisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gJmZqbl9pbnRlcnJ1cHQ7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIAorICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworICAgIC8qIFRoZSBGTVZKMTh4IHNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmZqbl9zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZmam5fY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmZqbl9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisgICAgZGV2LT5vcGVuID0gJmZqbl9vcGVuOworICAgIGRldi0+c3RvcCA9ICZmam5fY2xvc2U7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ID0gZmpuX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKyAgICAKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmZtdmoxOHhfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlmbXZqMTh4X2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogZm12ajE4eF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZtdmoxOHhfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworICAgIAorICAgIERFQlVHKDAsICJmbXZqMTh4X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJZm12ajE4eF9yZWxlYXNlKGxpbmspOworCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIGZtdmoxOHhfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgbWZjX3RyeV9pb19wb3J0KGRldl9saW5rX3QgKmxpbmspCit7CisgICAgaW50IGksIHJldDsKKyAgICBzdGF0aWMga2lvX2FkZHJfdCBzZXJpYWxfYmFzZVs1XSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgsIDB4MCB9OworCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCWxpbmstPmlvLkJhc2VQb3J0MiA9IHNlcmlhbF9iYXNlW2ldOworCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJaWYgKGxpbmstPmlvLkJhc2VQb3J0MiA9PSAwKSB7CisJICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJICAgIHByaW50ayhLRVJOX05PVElDRSAiZm12ajE4eF9jczogb3V0IG9mIHJlc291cmNlIGZvciBzZXJpYWxcbiIpOworCX0KKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKHJldCA9PSBDU19TVUNDRVNTKSByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVuZ2VybWFubl90cnlfaW9fcG9ydChkZXZfbGlua190ICpsaW5rKQoreworICAgIGludCByZXQ7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgLyoKKwlVbmdlcm1hbm4tQmFzcyBBY2Nlc3MvQ0FSRCBhY2NlcHRzIDB4MzAwLDB4MzIwLDB4MzQwLDB4MzYwCisJMHgzODAsMHgzYzAgb25seSBmb3IgaW9wb3J0LgorICAgICovCisgICAgZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHgzZTA7IGlvYWRkciArPSAweDIwKSB7CisJbGluay0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAocmV0ID09IENTX1NVQ0NFU1MpIHsKKwkgICAgLyogY2FsY3VsYXRlIENvbmZpZ0luZGV4IHZhbHVlICovCisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAKKwkJKChsaW5rLT5pby5CYXNlUG9ydDEgJiAweDBmMCkgPj4gMykgfCAweDIyOworCSAgICByZXR1cm4gcmV0OworCX0KKyAgICB9CisgICAgcmV0dXJuIHJldDsJLyogUmVxdWVzdElPIGZhaWxlZCAqLworfQorCitzdGF0aWMgdm9pZCBmbXZqMTh4X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfc2hvcnQgYnVmWzMyXTsKKyAgICBpbnQgaSwgbGFzdF9mbiwgbGFzdF9yZXQsIHJldDsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICBjYXJkdHlwZV90IGNhcmR0eXBlOworICAgIGNoYXIgKmNhcmRfbmFtZSA9ICJ1bmtub3duIjsKKyAgICB1X2NoYXIgKm5vZGVfaWQ7CisKKyAgICBERUJVRygwLCAiZm12ajE4eF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyoKKyAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICAgICByZWdpc3RlcnMuCisgICAgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAodV9jaGFyICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7IAorICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKwkvKiBZZXMsIEkgaGF2ZSBDSVNUUExfRlVOQ0UuIExldCdzIGNoZWNrIENJU1RQTF9NQU5GSUQgKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpCisJICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJZWxzZQorCSAgICBidWZbMF0gPSAweGZmZmY7CisJc3dpdGNoIChsZTE2X3RvX2NwdShidWZbMF0pKSB7CisJY2FzZSBNQU5GSURfVERLOgorCSAgICBjYXJkdHlwZSA9IFRESzsKKwkgICAgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19DRjAxMCkgeworCQljc19zdGF0dXNfdCBzdGF0dXM7CisJCXBjbWNpYV9nZXRfc3RhdHVzKGhhbmRsZSwgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMuQ2FyZFN0YXRlICYgQ1NfRVZFTlRfM1ZDQVJEKQorCQkgICAgbGluay0+Y29uZi5WY2MgPSAzMzsgLyogaW5zZXJ0ZWQgaW4gMy4zViBzbG90ICovCisJICAgIH0gZWxzZSBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX0dOMzQxMCkgeworCQkvKiBNdWx0aUZ1bmN0aW9uIENhcmQgKi8KKwkJbGluay0+Y29uZi5Db25maWdCYXNlID0gMHg4MDA7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDQ3OworCQlsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTUFORklEX0NPTlRFQzoKKwkgICAgY2FyZHR5cGUgPSBDT05URUM7CisJICAgIGJyZWFrOworCWNhc2UgTUFORklEX0ZVSklUU1U6CisJICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzAyKQorICAgICAgICAgICAgICAgIC8qIFJBVE9DIFJFWC01NTg4Lzk4MjIvNDg4NidzIFBST0RJRCBhcmUgMDAwNCg9TUJIMTAzMDIpLAorICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVzZSBhcmUgTUJIMTAzMDQgYmFzZWQgY2FyZC4gKi8gCisJCWNhcmR0eXBlID0gTUJIMTAzMDQ7CisJICAgIGVsc2UgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDQpCisJCWNhcmR0eXBlID0gTUJIMTAzMDQ7CisJICAgIGVsc2UKKwkJY2FyZHR5cGUgPSBMQTUwMTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgY2FyZHR5cGUgPSBNQkgxMDMwNDsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBvbGQgdHlwZSBjYXJkICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykKKwkgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwllbHNlCisJICAgIGJ1ZlswXSA9IDB4ZmZmZjsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGJ1ZlswXSkpIHsKKwljYXNlIE1BTkZJRF9GVUpJVFNVOgorCSAgICBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwNCkgeworCQljYXJkdHlwZSA9IFhYWDEwMzA0OyAgICAvKiBNQkgxMDMwNCB3aXRoIGJ1Z2d5IENJUyAqLworCSAgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4MjA7CisJICAgIH0gZWxzZSB7CisJCWNhcmR0eXBlID0gTUJIMTAzMDI7ICAgIC8qIE5leHRDb20gTkM1MzEwLCBldGMuICovCisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTUFORklEX1VOR0VSTUFOTjoKKwkgICAgY2FyZHR5cGUgPSBVTkdFUk1BTk47CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGNhcmR0eXBlID0gTUJIMTAzMDI7CisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworCX0KKyAgICB9CisKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyICE9IDApIHsKKyAgICAJbGluay0+aXJxLkF0dHJpYnV0ZXMgPQorCQlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRHxJUlFfSEFORExFX1BSRVNFTlQ7CisJcmV0ID0gbWZjX3RyeV9pb19wb3J0KGxpbmspOworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgZ290byBjc19mYWlsZWQ7CisgICAgfSBlbHNlIGlmIChjYXJkdHlwZSA9PSBVTkdFUk1BTk4pIHsKKwlyZXQgPSB1bmdlcm1hbm5fdHJ5X2lvX3BvcnQobGluayk7CisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSBnb3RvIGNzX2ZhaWxlZDsKKyAgICB9IGVsc2UgeyAKKwlDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSk7CisgICAgfQorICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBpZiAobGluay0+aW8uQmFzZVBvcnQyICE9IDApCisJZm12ajE4eF9zZXR1cF9tZmMobGluayk7CisKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIC8qIFJlc2V0IGNvbnRyb2xsZXIgKi8KKyAgICBpZiAoc3JhbV9jb25maWcgPT0gMCkgCisJb3V0YihDT05GSUcwX1JTVCwgaW9hZGRyICsgQ09ORklHXzApOworICAgIGVsc2UKKwlvdXRiKENPTkZJRzBfUlNUXzEsIGlvYWRkciArIENPTkZJR18wKTsKKworICAgIC8qIFBvd2VyIE9uIGNoaXAgYW5kIHNlbGVjdCBiYW5rIDAgKi8KKyAgICBpZiAoY2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihCQU5LXzAsIGlvYWRkciArIENPTkZJR18xKTsKKyAgICBlbHNlCisJb3V0YihCQU5LXzBVLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgCisgICAgLyogU2V0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICBzd2l0Y2ggKGNhcmR0eXBlKSB7CisgICAgY2FzZSBNQkgxMDMwNDoKKyAgICBjYXNlIFRESzoKKyAgICBjYXNlIExBNTAxOgorICAgIGNhc2UgQ09OVEVDOgorCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCWlmIChjYXJkdHlwZSA9PSBNQkgxMDMwNCkgeworCSAgICAvKiBNQkgxMDMwNCdzIENJU19GVU5DRSBpcyBjb3JydXB0ZWQgKi8KKwkgICAgbm9kZV9pZCA9ICYodHVwbGUuVHVwbGVEYXRhWzVdKTsKKwkgICAgY2FyZF9uYW1lID0gIkZNVi1KMTgyIjsKKwl9IGVsc2UgeworCSAgICB3aGlsZSAodHVwbGUuVHVwbGVEYXRhWzBdICE9IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCApIHsKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwkJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwkgICAgfQorCSAgICBub2RlX2lkID0gJih0dXBsZS5UdXBsZURhdGFbMl0pOworCSAgICBpZiggY2FyZHR5cGUgPT0gVERLICkgeworCQljYXJkX25hbWUgPSAiVERLIExBSy1DRDAyMSI7CisJICAgIH0gZWxzZSBpZiggY2FyZHR5cGUgPT0gTEE1MDEgKSB7CisJCWNhcmRfbmFtZSA9ICJMQTUwMSI7CisJICAgIH0gZWxzZSB7CisJCWNhcmRfbmFtZSA9ICJDLU5FVChQQylDIjsKKwkgICAgfQorCX0KKwkvKiBSZWFkIE1BQ0lEIGZyb20gQ0lTICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgICAgZGV2LT5kZXZfYWRkcltpXSA9IG5vZGVfaWRbaV07CisJYnJlYWs7CisgICAgY2FzZSBVTkdFUk1BTk46CisJLyogUmVhZCBNQUNJRCBmcm9tIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgVU5HRVJNQU5OX01BQ19JRCArIGkpOworCWNhcmRfbmFtZSA9ICJBY2Nlc3MvQ0FSRCI7CisJYnJlYWs7CisgICAgY2FzZSBYWFgxMDMwNDoKKwkvKiBSZWFkIE1BQ0lEIGZyb20gQnVnZ3kgQ0lTICovCisJaWYgKGZtdmoxOHhfZ2V0X2h3aW5mbyhsaW5rLCB0dXBsZS5UdXBsZURhdGEpID09IC0xKSB7CisJICAgIHByaW50ayhLRVJOX05PVElDRSAiZm12ajE4eF9jczogdW5hYmxlIHRvIHJlYWQgaGFyZHdhcmUgbmV0IGFkZHJlc3MuXG4iKTsKKwkgICAgZ290byBmYWlsZWQ7CisJfQorCWZvciAoaSA9IDAgOyBpIDwgNjsgaSsrKSB7CisJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSB0dXBsZS5UdXBsZURhdGFbaV07CisJfQorCWNhcmRfbmFtZSA9ICJGTVYtSjE4MiI7CisJYnJlYWs7CisgICAgY2FzZSBNQkgxMDMwMjoKKyAgICBkZWZhdWx0OgorCS8qIFJlYWQgTUFDSUQgZnJvbSByZWdpc3RlciAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCSAgICBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIE1BQ19JRCArIGkpOworCWNhcmRfbmFtZSA9ICJGTVYtSjE4MSI7CisJYnJlYWs7CisgICAgfQorCisgICAgbHAtPmNhcmR0eXBlID0gY2FyZHR5cGU7CisgICAgbGluay0+ZGV2ID0gJmxwLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJmbXZqMTh4X2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGxwLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgLyogcHJpbnQgY3VycmVudCBjb25maWd1cmF0aW9uICovCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzLCBzcmFtICVzLCBwb3J0ICUjM2x4LCBpcnEgJWQsIGh3X2FkZHIgIiwgCisJICAgZGV2LT5uYW1lLCBjYXJkX25hbWUsIHNyYW1fY29uZmlnID09IDAgPyAiNEsgVFgqMiIgOiAiOEsgVFgqMiIsIAorCSAgIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIHJldHVybjsKKyAgICAKK2NzX2ZhaWxlZDoKKyAgICAvKiBBbGwgQ2FyZCBTZXJ2aWNlcyBlcnJvcnMgZW5kIHVwIGhlcmUgKi8KKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBmbXZqMTh4X3JlbGVhc2UobGluayk7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKworfSAvKiBmbXZqMTh4X2NvbmZpZyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZm12ajE4eF9nZXRfaHdpbmZvKGRldl9saW5rX3QgKmxpbmssIHVfY2hhciAqbm9kZV9pZCkKK3sKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICB1X2NoYXIgX19pb21lbSAqYmFzZTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKyAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAwOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdFdpbmRvdywgaSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMDsKKyAgICBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisKKyAgICAvKgorICAgICAqICBNQkgxMDMwNCBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQgZm9ybWF0CisgICAgICogIDIyIDBkIHh4IHh4IHh4IDA0IDA2IHl5IHl5IHl5IHl5IHl5IHl5IGZmCisgICAgICogICd4eCcgaXMgZ2FyYmFnZS4KKyAgICAgKiAgJ3l5JyBpcyBNQUMgYWRkcmVzcy4KKyAgICAqLyAKKyAgICBmb3IgKGkgPSAwOyBpIDwgMHgyMDA7IGkrKykgeworCWlmIChyZWFkYihiYXNlK2kqMikgPT0gMHgyMikgewkKKwkgICAgaWYgKHJlYWRiKGJhc2UrKGktMSkqMikgPT0gMHhmZgorCSAgICAgJiYgcmVhZGIoYmFzZSsoaSs1KSoyKSA9PSAweDA0CisJICAgICAmJiByZWFkYihiYXNlKyhpKzYpKjIpID09IDB4MDYKKwkgICAgICYmIHJlYWRiKGJhc2UrKGkrMTMpKjIpID09IDB4ZmYpIAorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKGkgIT0gMHgyMDApIHsKKwlmb3IgKGogPSAwIDsgaiA8IDY7IGorKyxpKyspIHsKKwkgICAgbm9kZV9pZFtqXSA9IHJlYWRiKGJhc2UrKGkrNykqMik7CisJfQorICAgIH0KKworICAgIGlvdW5tYXAoYmFzZSk7CisgICAgaiA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIGlmIChqICE9IENTX1NVQ0NFU1MpCisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWxlYXNlV2luZG93LCBqKTsKKyAgICByZXR1cm4gKGkgIT0gMHgyMDApID8gMCA6IC0xOworCit9IC8qIGZtdmoxOHhfZ2V0X2h3aW5mbyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZm12ajE4eF9zZXR1cF9tZmMoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICB1X2NoYXIgX19pb21lbSAqYmFzZTsKKyAgICBpbnQgaSwgajsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKworICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKyAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAwOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdFdpbmRvdywgaSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMDsKKyAgICBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB3cml0ZWIoMHg0NywgYmFzZSsweDgwMCk7CS8qIENvbmZpZyBPcHRpb24gUmVnaXN0ZXIgb2YgTEFOICovCisgICAgd3JpdGViKDB4MCwgYmFzZSsweDgwMik7CS8qIENvbmZpZyBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyAgICB3cml0ZWIoaW9hZGRyICYgMHhmZiwgYmFzZSsweDgwYSk7CQkvKiBJL08gQmFzZShMb3cpIG9mIExBTiAqLworICAgIHdyaXRlYigoaW9hZGRyID4+IDgpICYgMHhmZiwgYmFzZSsweDgwYyk7CS8qIEkvTyBCYXNlKEhpZ2gpIG9mIExBTiAqLworICAgCisgICAgd3JpdGViKDB4NDUsIGJhc2UrMHg4MjApOwkvKiBDb25maWcgT3B0aW9uIFJlZ2lzdGVyIG9mIE1vZGVtICovCisgICAgd3JpdGViKDB4OCwgYmFzZSsweDgyMik7CS8qIENvbmZpZyBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyAgICBpb3VubWFwKGJhc2UpOworICAgIGogPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoaiAhPSBDU19TVUNDRVNTKQorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVsZWFzZVdpbmRvdywgaik7CisgICAgcmV0dXJuIDA7CisKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmbXZqMTh4X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICAgIERFQlVHKDAsICJmbXZqMTh4X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworICAgIHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZtdmoxOHhfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgREVCVUcoMSwgImZtdmoxOHhfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJZm12ajE4eF9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQlmam5fcmVzZXQoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogZm12ajE4eF9ldmVudCAqLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgZm12ajE4eF9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJmbXZqMTh4X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gZm12ajE4eF9hdHRhY2gsCisJLmRldGFjaAkJPSBmbXZqMTh4X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZm12ajE4eF9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZmbXZqMTh4X2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZtdmoxOHhfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmZtdmoxOHhfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfZm12ajE4eF9jcyk7Cittb2R1bGVfZXhpdChleGl0X2ZtdmoxOHhfY3MpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlycXJldHVybl90IGZqbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIHVuc2lnbmVkIHNob3J0IHR4X3N0YXQsIHJ4X3N0YXQ7CisKKyAgICBpZiAobHAgPT0gTlVMTCkgeworICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgImZqbl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciAiCisJICAgICAgICJ1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAvKiBhdm9pZCBtdWx0aXBsZSBpbnRlcnJ1cHRzICovCisgICAgb3V0dygweDAwMDAsIGlvYWRkciArIFRYX0lOVFIpOworCisgICAgLyogd2FpdCBmb3IgYSB3aGlsZSAqLworICAgIHVkZWxheSgxKTsKKworICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICB0eF9zdGF0ID0gaW5iKGlvYWRkciArIFRYX1NUQVRVUyk7CisgICAgcnhfc3RhdCA9IGluYihpb2FkZHIgKyBSWF9TVEFUVVMpOworCisgICAgLyogY2xlYXIgc3RhdHVzICovCisgICAgb3V0Yih0eF9zdGF0LCBpb2FkZHIgKyBUWF9TVEFUVVMpOworICAgIG91dGIocnhfc3RhdCwgaW9hZGRyICsgUlhfU1RBVFVTKTsKKyAgICAKKyAgICBERUJVRyg0LCAiJXM6IGludGVycnVwdCwgcnhfc3RhdHVzICUwMnguXG4iLCBkZXYtPm5hbWUsIHJ4X3N0YXQpOworICAgIERFQlVHKDQsICIgICAgICAgICAgICAgICB0eF9zdGF0dXMgJTAyeC5cbiIsIHR4X3N0YXQpOworICAgIAorICAgIGlmIChyeF9zdGF0IHx8IChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiBGX0JVRl9FTVApID09IDApIHsKKwkvKiB0aGVyZSBpcyBwYWNrZXQocykgaW4gcnggYnVmZmVyICovCisJZmpuX3J4KGRldik7CisgICAgfQorICAgIGlmICh0eF9zdGF0ICYgRl9UTVRfUkRZKSB7CisJbHAtPnN0YXRzLnR4X3BhY2tldHMgKz0gbHAtPnNlbnQgOworICAgICAgICBscC0+c2VudCA9IDAgOworCWlmIChscC0+dHhfcXVldWUpIHsKKwkgICAgb3V0YihET19UWCB8IGxwLT50eF9xdWV1ZSwgaW9hZGRyICsgVFhfU1RBUlQpOworCSAgICBscC0+c2VudCA9IGxwLT50eF9xdWV1ZSA7CisJICAgIGxwLT50eF9xdWV1ZSA9IDA7CisJICAgIGxwLT50eF9xdWV1ZV9sZW4gPSAwOworCSAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9IGVsc2UgeworCSAgICBscC0+dHhfc3RhcnRlZCA9IDA7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgREVCVUcoNCwgIiVzOiBleGl0aW5nIGludGVycnVwdCxcbiIsIGRldi0+bmFtZSk7CisgICAgREVCVUcoNCwgIiAgICB0eF9zdGF0dXMgJTAyeCwgcnhfc3RhdHVzICUwMnguXG4iLCB0eF9zdGF0LCByeF9zdGF0KTsKKworICAgIG91dGIoRF9UWF9JTlRSLCBpb2FkZHIgKyBUWF9JTlRSKTsKKyAgICBvdXRiKERfUlhfSU5UUiwgaW9hZGRyICsgUlhfSU5UUik7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworCit9IC8qIGZqbl9pbnRlcnJ1cHQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZqbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJTA0eCwgJXM/XG4iLAorCSAgIGRldi0+bmFtZSwgaHRvbnMoaW53KGlvYWRkciArIFRYX1NUQVRVUykpLAorCSAgIGluYihpb2FkZHIgKyBUWF9TVEFUVVMpICYgRl9UTVRfUkRZCisJICAgPyAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0aW1lb3V0IHJlZ2lzdGVyczogJTA0eCAlMDR4ICUwNHggIgorCSAgICIlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHguXG4iLAorCSAgIGRldi0+bmFtZSwgaHRvbnMoaW53KGlvYWRkciArIDApKSwKKwkgICBodG9ucyhpbncoaW9hZGRyICsgMikpLCBodG9ucyhpbncoaW9hZGRyICsgNCkpLAorCSAgIGh0b25zKGludyhpb2FkZHIgKyA2KSksIGh0b25zKGludyhpb2FkZHIgKyA4KSksCisJICAgaHRvbnMoaW53KGlvYWRkciArMTApKSwgaHRvbnMoaW53KGlvYWRkciArMTIpKSwKKwkgICBodG9ucyhpbncoaW9hZGRyICsxNCkpKTsKKyAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgLyogVG9EbzogV2Ugc2hvdWxkIHRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLi4uICovCisgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKyAgICBmam5fcmVzZXQoZGV2KTsKKworICAgIGxwLT50eF9zdGFydGVkID0gMDsKKyAgICBscC0+dHhfcXVldWUgPSAwOworICAgIGxwLT50eF9xdWV1ZV9sZW4gPSAwOworICAgIGxwLT5zZW50ID0gMDsKKyAgICBscC0+b3Blbl90aW1lID0gamlmZmllczsKKyAgICBsb2NhbF9pcnFfZW5hYmxlKCk7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGZqbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisgICAgCisgICAgaWYgKGxlbmd0aCA8IEVUSF9aTEVOKQorICAgIHsKKyAgICAJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworICAgIAlpZiAoc2tiID09IE5VTEwpCisgICAgCQlyZXR1cm4gMDsKKyAgICAJbGVuZ3RoID0gRVRIX1pMRU47CisgICAgfQorCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgeworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCWlmIChsZW5ndGggPiBFVEhfRlJBTUVfTEVOKSB7CisJICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IEF0dGVtcHRpbmcgdG8gc2VuZCBhIGxhcmdlIHBhY2tldCIKKwkJICAgIiAoJWQgYnl0ZXMpLlxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworCSAgICByZXR1cm4gMTsKKwl9CisKKwlERUJVRyg0LCAiJXM6IFRyYW5zbWl0dGluZyBhIHBhY2tldCBvZiBsZW5ndGggJWx1LlxuIiwKKwkgICAgICBkZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nKXNrYi0+bGVuKTsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBEaXNhYmxlIGJvdGggaW50ZXJydXB0cy4gKi8KKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgVFhfSU5UUik7CisKKwkvKiB3YWl0IGZvciBhIHdoaWxlICovCisJdWRlbGF5KDEpOworCisJb3V0dyhsZW5ndGgsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgYnVmLCAobGVuZ3RoICsgMSkgPj4gMSk7CisKKwlscC0+dHhfcXVldWUrKzsKKwlscC0+dHhfcXVldWVfbGVuICs9ICgobGVuZ3RoKzMpICYgfjEpOworCisJaWYgKGxwLT50eF9zdGFydGVkID09IDApIHsKKwkgICAgLyogSWYgdGhlIFR4IGlzIGlkbGUsIGFsd2F5cyB0cmlnZ2VyIGEgdHJhbnNtaXQuICovCisJICAgIG91dGIoRE9fVFggfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkgICAgbHAtPnNlbnQgPSBscC0+dHhfcXVldWUgOworCSAgICBscC0+dHhfcXVldWUgPSAwOworCSAgICBscC0+dHhfcXVldWVfbGVuID0gMDsKKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJICAgIGxwLT50eF9zdGFydGVkID0gMTsKKwkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiggc3JhbV9jb25maWcgPT0gMCApIHsKKwkJaWYgKGxwLT50eF9xdWV1ZV9sZW4gPCAoNDA5NiAtIChFVEhfRlJBTUVfTEVOICsyKSkgKQorCQkgICAgLyogWWVzLCB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBwYWNrZXQuICovCisJCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCSAgICB9IGVsc2UgeworCQlpZiAobHAtPnR4X3F1ZXVlX2xlbiA8ICg4MTkyIC0gKEVUSF9GUkFNRV9MRU4gKzIpKSAmJiAKKwkJCQkJCWxwLT50eF9xdWV1ZSA8IDEyNyApCisJCSAgICAvKiBZZXMsIHRoZXJlIGlzIHJvb20gZm9yIG9uZSBtb3JlIHBhY2tldC4gKi8KKwkJICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJICAgIH0KKwl9CisKKwkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLworCW91dGIoRF9UWF9JTlRSLCBpb2FkZHIgKyBUWF9JTlRSKTsKKwlvdXRiKERfUlhfSU5UUiwgaW9hZGRyICsgUlhfSU5UUik7CisgICAgfQorICAgIGRldl9rZnJlZV9za2IgKHNrYik7CisKKyAgICByZXR1cm4gMDsKK30gLyogZmpuX3N0YXJ0X3htaXQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZqbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworCisgICAgREVCVUcoNCwgImZqbl9yZXNldCglcykgY2FsbGVkLlxuIixkZXYtPm5hbWUpOworCisgICAgLyogUmVzZXQgY29udHJvbGxlciAqLworICAgIGlmKCBzcmFtX2NvbmZpZyA9PSAwICkgCisJb3V0YihDT05GSUcwX1JTVCwgaW9hZGRyICsgQ09ORklHXzApOworICAgIGVsc2UKKwlvdXRiKENPTkZJRzBfUlNUXzEsIGlvYWRkciArIENPTkZJR18wKTsKKworICAgIC8qIFBvd2VyIE9uIGNoaXAgYW5kIHNlbGVjdCBiYW5rIDAgKi8KKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoQkFOS18wLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgZWxzZQorCW91dGIoQkFOS18wVSwgaW9hZGRyICsgQ09ORklHXzEpOworCisgICAgLyogU2V0IFR4IG1vZGVzICovCisgICAgb3V0YihEX1RYX01PREUsIGlvYWRkciArIFRYX01PREUpOworICAgIC8qIHNldCBSeCBtb2RlcyAqLworICAgIG91dGIoSURfTUFUQ0hFRCwgaW9hZGRyICsgUlhfTU9ERSk7CisKKyAgICAvKiBTZXQgaGFyZHdhcmUgYWRkcmVzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorICAgICAgICBvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIE5PREVfSUQgKyBpKTsKKworICAgIC8qIFN3aXRjaCB0byBiYW5rIDEgKi8KKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoQkFOS18xLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgZWxzZQorCW91dGIoQkFOS18xVSwgaW9hZGRyICsgQ09ORklHXzEpOworCisgICAgLyogc2V0IHRoZSBtdWx0aWNhc3QgdGFibGUgdG8gYWNjZXB0IG5vbmUuICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisgICAgICAgIG91dGIoMHgwMCwgaW9hZGRyICsgTUFSX0FEUiArIGkpOworCisgICAgLyogU3dpdGNoIHRvIGJhbmsgMiAocnVudGltZSBtb2RlKSAqLworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihCQU5LXzIsIGlvYWRkciArIENPTkZJR18xKTsKKyAgICBlbHNlCisJb3V0YihCQU5LXzJVLCBpb2FkZHIgKyBDT05GSUdfMSk7CisKKyAgICAvKiBzZXQgMTZjb2wgY3RybCBiaXRzICovCisgICAgaWYoIGxwLT5jYXJkdHlwZSA9PSBUREsgfHwgbHAtPmNhcmR0eXBlID09IENPTlRFQykgCisgICAgICAgIG91dGIoVERLX0FVVE9fTU9ERSwgaW9hZGRyICsgQ09MX0NUUkwpOworICAgIGVsc2UKKyAgICAgICAgb3V0YihBVVRPX01PREUsIGlvYWRkciArIENPTF9DVFJMKTsKKworICAgIC8qIGNsZWFyIFJlc2VydmVkIFJlZ3MgKi8KKyAgICBvdXRiKDB4MDAsIGlvYWRkciArIEJNUFIxMik7CisgICAgb3V0YigweDAwLCBpb2FkZHIgKyBCTVBSMTMpOworCisgICAgLyogcmVzZXQgU2tpcCBwYWNrZXQgcmVnLiAqLworICAgIG91dGIoMHgwMSwgaW9hZGRyICsgUlhfU0tJUCk7CisKKyAgICAvKiBFbmFibGUgVHggYW5kIFJ4ICovCisgICAgaWYoIHNyYW1fY29uZmlnID09IDAgKQorCW91dGIoQ09ORklHMF9ERkwsIGlvYWRkciArIENPTkZJR18wKTsKKyAgICBlbHNlCisJb3V0YihDT05GSUcwX0RGTF8xLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKyAgICAvKiBJbml0IHJlY2VpdmUgcG9pbnRlciA/ICovCisgICAgaW53KGlvYWRkciArIERBVEFQT1JUKTsKKyAgICBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisgICAgLyogQ2xlYXIgYWxsIHN0YXR1cyAqLworICAgIG91dGIoMHhmZiwgaW9hZGRyICsgVFhfU1RBVFVTKTsKKyAgICBvdXRiKDB4ZmYsIGlvYWRkciArIFJYX1NUQVRVUyk7CisKKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoSU5UUl9PRkYsIGlvYWRkciArIExBTl9DVFJMKTsKKworICAgIC8qIFR1cm4gb24gUnggaW50ZXJydXB0cyAqLworICAgIG91dGIoRF9UWF9JTlRSLCBpb2FkZHIgKyBUWF9JTlRSKTsKKyAgICBvdXRiKERfUlhfSU5UUiwgaW9hZGRyICsgUlhfSU5UUik7CisKKyAgICAvKiBUdXJuIG9uIGludGVycnVwdHMgZnJvbSBMQU4gY2FyZCBjb250cm9sbGVyICovCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKElOVFJfT04sIGlvYWRkciArIExBTl9DVFJMKTsKK30gLyogZmpuX3Jlc2V0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmam5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgYm9ndXNjb3VudCA9IDEwOwkvKiA1IC0+IDEwOiBieSBhZ3kgMTk5NDA5MjIgKi8KKworICAgIERFQlVHKDQsICIlczogaW4gcnhfcGFja2V0KCksIHJ4X3N0YXR1cyAlMDJ4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFJYX1NUQVRVUykpOworCisgICAgd2hpbGUgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiBGX0JVRl9FTVApID09IDApIHsKKwl1X3Nob3J0IHN0YXR1cyA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwlERUJVRyg0LCAiJXM6IFJ4aW5nIHBhY2tldCBtb2RlICUwMnggc3RhdHVzICUwNHguXG4iLAorCSAgICAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFJYX01PREUpLCBzdGF0dXMpOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJICAgIG91dGIoRl9TS1BfUEtULCBpb2FkZHIgKyBSWF9TS0lQKTsKKwkgICAgYnJlYWs7CisJfQorI2VuZGlmCisJaWYgKChzdGF0dXMgJiAweEYwKSAhPSAweDIwKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgRl9MRU5fRVJSKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgRl9BTEdfRVJSKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBGX0NSQ19FUlIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBGX09WUl9GTE8pIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCX0gZWxzZSB7CisJICAgIHVfc2hvcnQgcGt0X2xlbiA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisJICAgIC8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIGlmIChwa3RfbGVuID4gMTU1MCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBUaGUgRk1WLTE4eCBjbGFpbWVkIGEgdmVyeSAiCisJCSAgICAgICAibGFyZ2UgcGFja2V0LCBzaXplICVkLlxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJb3V0YihGX1NLUF9QS1QsIGlvYWRkciArIFJYX1NLSVApOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWJyZWFrOworCSAgICB9CisJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkgICAgaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyAiCisJCSAgICAgICAicGFja2V0IChsZW4gJWQpLlxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJb3V0YihGX1NLUF9QS1QsIGlvYWRkciArIFJYX1NLSVApOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlicmVhazsKKwkgICAgfQorCSAgICBza2ItPmRldiA9IGRldjsKKworCSAgICBza2JfcmVzZXJ2ZShza2IsIDIpOworCSAgICBpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCSAocGt0X2xlbiArIDEpID4+IDEpOworCSAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJICAgIGlmIChwY19kZWJ1ZyA+IDUpIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUnhlZCBwYWNrZXQgb2YgbGVuZ3RoICVkOiAiLAorCQkgICAgICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCSAgICBwcmludGsoIiAlMDJ4Iiwgc2tiLT5kYXRhW2ldKTsKKwkJcHJpbnRrKCIuXG4iKTsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgbmV0aWZfcngoc2tiKTsKKwkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJfQorCWlmICgtLWJvZ3VzY291bnQgPD0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICAgaGFzIGRvbmUgYSBuZXRpZl93YWtlX3F1ZXVlKCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworLyoKKyAgICBpZiAobHAtPmNhcmR0eXBlICE9IFRESykgeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJICAgIGlmICgoaW5iKGlvYWRkciArIFJYX01PREUpICYgRl9CVUZfRU1QKSA9PSBGX0JVRl9FTVApCisJCWJyZWFrOworCSAgICAodm9pZClpbncoaW9hZGRyICsgREFUQVBPUlQpOyAgLysgZHVtbXkgc3RhdHVzIHJlYWQgKy8KKwkgICAgb3V0YihGX1NLUF9QS1QsIGlvYWRkciArIFJYX1NLSVApOworCX0KKworCWlmIChpID4gMCkKKwkgICAgREVCVUcoNSwgIiVzOiBFeGludCBSeCBwYWNrZXQgd2l0aCBtb2RlICUwMnggYWZ0ZXIgIgorCQkgICIlZCB0aWNrcy5cbiIsIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFJYX01PREUpLCBpKTsKKyAgICB9CisqLworCisgICAgcmV0dXJuOworfSAvKiBmam5fcnggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBjX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlwY19kZWJ1ZyA9IGxldmVsOworfQorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorI2lmZGVmIFBDTUNJQV9ERUJVRworCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCit9OworCitzdGF0aWMgaW50IGZqbl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApeworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZqbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgICBERUJVRyg0LCAiZmpuX29wZW4oJyVzJykuXG4iLCBkZXYtPm5hbWUpOworCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisgICAgCisgICAgbGluay0+b3BlbisrOworICAgIAorICAgIGZqbl9yZXNldChkZXYpOworICAgIAorICAgIGxwLT50eF9zdGFydGVkID0gMDsKKyAgICBscC0+dHhfcXVldWUgPSAwOworICAgIGxwLT50eF9xdWV1ZV9sZW4gPSAwOworICAgIGxwLT5vcGVuX3RpbWUgPSBqaWZmaWVzOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9IC8qIGZqbl9vcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZqbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRyg0LCAiZmpuX2Nsb3NlKCclcycpLlxuIiwgZGV2LT5uYW1lKTsKKworICAgIGxwLT5vcGVuX3RpbWUgPSAwOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgdG8gZGlzYWJsZSBUeCBhbmQgUnguICovCisgICAgaWYoIHNyYW1fY29uZmlnID09IDAgKSAKKwlvdXRiKENPTkZJRzBfUlNUICxpb2FkZHIgKyBDT05GSUdfMCk7CisgICAgZWxzZQorCW91dGIoQ09ORklHMF9SU1RfMSAsaW9hZGRyICsgQ09ORklHXzApOworCisgICAgLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIC0tIFRvRG8uICovCisKKyAgICAvKiBQb3dlci1kb3duIHRoZSBjaGlwLiAgR3JlZW4sIGdyZWVuLCBncmVlbiEgKi8KKyAgICBvdXRiKENISVBfT0ZGICxpb2FkZHIgKyBDT05GSUdfMSk7CisKKyAgICAvKiBTZXQgdGhlIGV0aGVybmV0IGFkYXB0b3IgZGlzYWJsZSBJUlEgKi8KKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoSU5UUl9PRkYsIGlvYWRkciArIExBTl9DVFJMKTsKKworICAgIGxpbmstPm9wZW4tLTsKKworICAgIHJldHVybiAwOworfSAvKiBmam5fY2xvc2UgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZmpuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHJldHVybiAmbHAtPnN0YXRzOworfSAvKiBmam5fZ2V0X3N0YXRzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICBTZXQgdGhlIG11bHRpY2FzdC9wcm9taXNjdW91cyBtb2RlIGZvciB0aGlzIGFkYXB0b3IuCisqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBtY19maWx0ZXJbOF07CQkgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisgICAgdV9sb25nIGZsYWdzOworICAgIGludCBpOworICAgIAorICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCXByaW50aygiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCW91dGIoMywgaW9hZGRyICsgUlhfTU9ERSk7CS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisgICAgfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID4gTUNfRklMVEVSQlJFQUsKKwkgICAgICAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCS8qIFRvbyBtYW55IHRvIGZpbHRlciBwZXJmZWN0bHkgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwlvdXRiKDIsIGlvYWRkciArIFJYX01PREUpOwkvKiBVc2Ugbm9ybWFsIG1vZGUuICovCisgICAgfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID09IDApIHsKKwltZW1zZXQobWNfZmlsdGVyLCAweDAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJb3V0YigxLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogSWdub3JlIGFsbW9zdCBhbGwgbXVsdGljYXN0cy4gKi8KKyAgICB9IGVsc2UgeworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCWludCBpOworCQorCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJICAgIHVuc2lnbmVkIGludCBiaXQgPQorCSAgICAJZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4M2Y7CisJICAgIG1jX2ZpbHRlcltiaXQgPj4gM10gfD0gKDEgPDwgYml0KTsKKwl9CisgICAgfQorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyAKKyAgICBpZiAobWVtY21wKG1jX2ZpbHRlciwgbHAtPm1jX2ZpbHRlciwgc2l6ZW9mKG1jX2ZpbHRlcikpKSB7CisJaW50IHNhdmVkX2JhbmsgPSBpbmIoaW9hZGRyICsgQ09ORklHXzEpOworCS8qIFN3aXRjaCB0byBiYW5rIDEgYW5kIHNldCB0aGUgbXVsdGljYXN0IHRhYmxlLiAqLworCW91dGIoMHhlNCwgaW9hZGRyICsgQ09ORklHXzEpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJICAgIG91dGIobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyA4ICsgaSk7CisJbWVtY3B5KGxwLT5tY19maWx0ZXIsIG1jX2ZpbHRlciwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCW91dGIoc2F2ZWRfYmFuaywgaW9hZGRyICsgQ09ORklHXzEpOworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDdjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYwpAQCAtMCwwICsxLDUzNSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSB0b2tlbi1yaW5nIGRyaXZlciBmb3IgSUJNLWJhc2VkIGNhcmRzCisKKyAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgSUJNIFBDTUNJQSBUb2tlbi1SaW5nIENhcmQuCisgICAgV3JpdHRlbiBieSBTdGV2ZSBLaXBpc3osIGtpcGlzekB2bmV0LmlibS5jb20gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZ3lAaWJtLm5ldAorCisgICAgV3JpdHRlbiAxOTk1LDE5OTYuCisKKyAgICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gcGNuZXRfY3MuYyBmcm9tIERhdmlkIEhpbmRzLgorICAgIAorICAgIFYyLjIuMCBGZWJydWFyeSAxOTk5IC0gTWlrZSBQaGlsbGlwcyBwaGlsbGltQGFtdHJhay5jb20KKworICAgIExpbnV4IFYyLjIueCBwcmVzZW50ZWQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZworICAgIGlibXRyLmMgY29kZS4gIE1haW5seSB0aGUgY29kZSBiZWNhbWUgYSBsb3QgbW9yZSBvcmdhbml6ZWQgYW5kCisgICAgbW9kdWxhci4KKworICAgIFRoaXMgY2F1c2VkIHRoZSBvbGQgUENNQ0lBIFRva2VuIFJpbmcgZHJpdmVyIHRvIGdpdmUgdXAgYW5kIGdvIAorICAgIGhvbWUgZWFybHkuIEluc3RlYWQgb2YganVzdCBwYXRjaGluZyB0aGUgb2xkIGNvZGUgdG8gbWFrZSBpdCAKKyAgICB3b3JrLCB0aGUgUENNQ0lBIGNvZGUgaGFzIGJlZW4gc3RyZWFtbGluZWQsIHVwZGF0ZWQgYW5kIHBvc3NpYmx5CisgICAgaW1wcm92ZWQuCisKKyAgICBUaGlzIGNvZGUgbm93IG9ubHkgY29udGFpbnMgY29kZSByZXF1aXJlZCBmb3IgdGhlIENhcmQgU2VydmljZXMuCisgICAgQWxsIHdlIGRvIGhlcmUgaXMgc2V0IHRoZSBjYXJkIHVwIGVub3VnaCBzbyB0aGF0IHRoZSByZWFsIGlibXRyLmMKKyAgICBkcml2ZXIgY2FuIGZpbmQgaXQgYW5kIHdvcmsgd2l0aCBpdCBwcm9wZXJseS4KKworICAgIGkuZS4gV2Ugc2V0IHVwIHRoZSBpbyBwb3J0LCBpcnEsIG1taW8gbWVtb3J5IGFuZCBzaGFyZWQgcmFtCisgICAgbWVtb3J5LiAgVGhpcyBlbmFibGVzIGlibXRyX3Byb2JlIGluIGlibXRyLmMgdG8gZmluZCB0aGUgY2FyZCBhbmQKKyAgICBjb25maWd1cmUgaXQgYXMgdGhvdWdoIGl0IHdhcyBhIG5vcm1hbCBJU0EgYW5kL29yIFBuUCBjYXJkLgorCisgICAgQ0hBTkdFUworCisgICAgdjIuMi41IEFwcmlsIDE5OTkgTWlrZSBQaGlsbGlwcyAocGhpbGxpbUBhbXRyYWsuY29tKQorICAgIE9ic2N1cmUgYnVnIGZpeCwgcmVxdWlyZWQgY2hhbmdlZCB0byBpYm10ci5jIG5vdCBpYm10cl9jcy5jCisgICAgCisgICAgdjIuMi43IE1heSAxOTk5IE1pa2UgUGhpbGxpcHMgKHBoaWxsaW1AYW10cmFrLmNvbSkKKyAgICBVcGRhdGVkIHRvIHZlcnNpb24gMi4yLjcgdG8gbWF0Y2ggdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIGtlcm5lbAorICAgIHRoYXQgdGhlIG1vZGlmaWNhdGlvbiB0byBpYm10ci5jIHdlcmUgaW5jb3Jwb3JhdGVkIGludG8uCisgICAgCisgICAgdjIuMi4xNyBKdWx5IDIwMDAgQnVydCBTaWx2ZXJtYW4gKGJ1cnRzQHVzLmlibS5jb20pCisgICAgQWRkcmVzcyB0cmFuc2xhdGlvbiBmZWF0dXJlIG9mIFBDTUNJQSBjb250cm9sbGVyIGlzIHVzYWJsZSBzbworICAgIG1lbW9yeSB3aW5kb3dzIGNhbiBiZSBwbGFjZWQgaW4gSGlnaCBtZW1vcnkgKG1lYW5pbmcgYWJvdmUKKyAgICAweEZGRkZGLikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWJtdHIuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgUENNQ0lBCisjaW5jbHVkZSAiLi4vdG9rZW5yaW5nL2libXRyLmMiCisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisiaWJtdHJfY3MuYyAxLjEwICAgMTk5Ni8wMS8wNiAwNToxOTowMCAoU3RldmUgS2lwaXN6KVxuIgorIiAgICAgICAgICAgMi4yLjcgIDE5OTkvMDUvMDMgMTI6MDA6MDAgKE1pa2UgUGhpbGxpcHMpXG4iCisiICAgICAgICAgICAyLjQuMiAgMjAwMS8zMC8yOCBNaWRuaWdodCAoQnVydCBTaWx2ZXJtYW4pXG4iOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJyAqLworCisvKiBNTUlPIGJhc2UgYWRkcmVzcyAqLworc3RhdGljIHVfbG9uZyBtbWlvYmFzZSA9IDB4Y2UwMDA7CisKKy8qIFNSQU0gYmFzZSBhZGRyZXNzICovCitzdGF0aWMgdV9sb25nIHNyYW1iYXNlID0gMHhkMDAwMDsKKworLyogU1JBTSBzaXplIDgsMTYsMzIsNjQgKi8KK3N0YXRpYyB1X2xvbmcgc3JhbXNpemUgPSA2NDsKKworLyogUmluZ3NwZWVkIDQsMTYgKi8KK3N0YXRpYyBpbnQgcmluZ3NwZWVkID0gMTY7CisKK21vZHVsZV9wYXJhbShtbWlvYmFzZSwgdWxvbmcsIDApOworbW9kdWxlX3BhcmFtKHNyYW1iYXNlLCB1bG9uZywgMCk7Cittb2R1bGVfcGFyYW0oc3JhbXNpemUsIHVsb25nLCAwKTsKK21vZHVsZV9wYXJhbShyaW5nc3BlZWQsIGludCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBpYm10cl9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBpYm10cl9od19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2ludCBtbWlvYmFzZSk7CitzdGF0aWMgdm9pZCBpYm10cl9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBpYm10cl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImlibXRyX2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKmlibXRyX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGlibXRyX2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKK2V4dGVybiBpbnQgaWJtdHJfcHJvYmVfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IGlibXRyX2Rldl90IHsKKyAgICBkZXZfbGlua190CQlsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisgICAgZGV2X25vZGVfdCAgICAgICAgICBub2RlOworICAgIHdpbmRvd19oYW5kbGVfdCAgICAgc3JhbV93aW5faGFuZGxlOworICAgIHN0cnVjdCB0b2tfaW5mbwkqdGk7Cit9IGlibXRyX2Rldl90OworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJpYm10cl9jcyIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBpYm10cl9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICppYm10cl9hdHRhY2godm9pZCkKK3sKKyAgICBpYm10cl9kZXZfdCAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKyAgICAKKyAgICBERUJVRygwLCAiaWJtdHJfYXR0YWNoKClcbiIpOworCisgICAgLyogQ3JlYXRlIG5ldyB0b2tlbi1yaW5nIGRldmljZSAqLworICAgIGluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOyAKKyAgICBpZiAoIWluZm8pIHJldHVybiBOVUxMOworICAgIG1lbXNldChpbmZvLDAsc2l6ZW9mKCppbmZvKSk7CisgICAgZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCB0b2tfaW5mbykpOworICAgIGlmICghZGV2KSB7IAorCWtmcmVlKGluZm8pOyAKKwlyZXR1cm4gTlVMTDsKKyAgICB9IAorCisgICAgbGluayA9ICZpbmZvLT5saW5rOworICAgIGxpbmstPnByaXYgPSBpbmZvOworICAgIGluZm8tPnRpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gNDsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZ0b2tfaW50ZXJydXB0OworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgbGluay0+aXJxLkluc3RhbmNlID0gaW5mby0+ZGV2ID0gZGV2OworICAgIAorICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKyAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZpYm10cl9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlnb3RvIG91dF9kZXRhY2g7CisgICAgfQorCitvdXQ6CisgICAgcmV0dXJuIGxpbms7CisKK291dF9kZXRhY2g6CisgICAgaWJtdHJfZGV0YWNoKGxpbmspOworICAgIGxpbmsgPSBOVUxMOworICAgIGdvdG8gb3V0OworfSAvKiBpYm10cl9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgaWJtdHJfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IGlibXRyX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworICAgIERFQlVHKDAsICJpYm10cl9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorICAgICAgICBpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGV2ID0gaW5mby0+ZGV2OworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgeworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSBuZXRkZXZfcHJpdihkZXYpOworCWRlbF90aW1lcl9zeW5jKCYodGktPnRyX3RpbWVyKSk7CisgICAgfQorICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisgICAgICAgIGlibXRyX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorICAgICAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAga2ZyZWUoaW5mbyk7IAorfSAvKiBpYm10cl9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBpYm10cl9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICB0b2tlbi1yaW5nIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgaWJtdHJfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBpYm10cl9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKKyAgICBzdHJ1Y3QgdG9rX2luZm8gKnRpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfY2hhciBidWZbNjRdOworCisgICAgREVCVUcoMCwgImlibXRyX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDYxOworCisgICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgUFJJTUFSWSBvciBBTFRFUk5BVEUuICovCisKKyAgICAvKiBUcnkgUFJJTUFSWSBjYXJkIGF0IDB4QTIwLTB4QTIzICovCisgICAgbGluay0+aW8uQmFzZVBvcnQxID0gMHhBMjA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJLyogQ291bGRuJ3QgZ2V0IDB4QTIwLTB4QTIzLiAgVHJ5IEFMVEVSTkFURSBhdCAweEEyNC0weEEyNy4gKi8KKwlsaW5rLT5pby5CYXNlUG9ydDEgPSAweEEyNDsKKwlDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSk7CisgICAgfQorICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIHRpLT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgdGktPmdsb2JhbF9pbnRfZW5hYmxlPUdMT0JBTF9JTlRfRU5BQkxFKygoZGV2LT5pcnE9PTkpID8gMiA6IGRldi0+aXJxKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBNTUlPIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOworICAgIHJlcS5BdHRyaWJ1dGVzIHw9IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7IAorICAgIHJlcS5TaXplID0gMHgyMDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDI1MDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworCisgICAgbWVtLkNhcmRPZmZzZXQgPSBtbWlvYmFzZTsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKyAgICB0aS0+bW1pbyA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBTUkFNIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOworICAgIHJlcS5BdHRyaWJ1dGVzIHw9IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSBzcmFtc2l6ZSAqIDEwMjQ7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gMjUwOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmaW5mby0+c3JhbV93aW5faGFuZGxlKSk7CisKKyAgICBtZW0uQ2FyZE9mZnNldCA9IHNyYW1iYXNlOworICAgIG1lbS5QYWdlID0gMDsKKyAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGluZm8tPnNyYW1fd2luX2hhbmRsZSwgJm1lbSkpOworCisgICAgdGktPnNyYW1fYmFzZSA9IG1lbS5DYXJkT2Zmc2V0ID4+IDEyOworICAgIHRpLT5zcmFtX3ZpcnQgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisgICAgdGktPnNyYW1fcGh5cyA9IHJlcS5CYXNlOworCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisgICAgLyogIFNldCB1cCB0aGUgVG9rZW4tUmluZyBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgYW5kCisgICAgICAgIHR1cm4gb24gdGhlIGNhcmQuICBDaGVjayB0aGUgIkxvY2FsIEFyZWEgTmV0d29yayBDcmVkaXQgQ2FyZAorICAgICAgICBBZGFwdGVycyBUZWNobmljYWwgUmVmZXJlbmNlIiAgU0MzMC0zNTg1IGZvciB0aGlzIGluZm8uICAqLworICAgIGlibXRyX2h3X3NldHVwKGRldiwgbW1pb2Jhc2UpOworCisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaSA9IGlibXRyX3Byb2JlX2NhcmQoZGV2KTsKKyAgICBpZiAoaSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJpYm10cl9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShpbmZvLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBvcnQgJSMzbHgsIGlycSAlZCwiLAorICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgcHJpbnRrICgiIG1taW8gJSM1bHgsIiwgKHVfbG9uZyl0aS0+bW1pbyk7CisgICAgcHJpbnRrICgiIHNyYW0gJSM1bHgsIiwgKHVfbG9uZyl0aS0+c3JhbV9iYXNlIDw8IDEyKTsKKyAgICBwcmludGsgKCJcbiIgS0VSTl9JTkZPICIgIGh3YWRkcj0iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFJfQUxFTjsgaSsrKQorICAgICAgICBwcmludGsoIiUwMlgiLCBkZXYtPmRldl9hZGRyW2ldKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgaWJtdHJfcmVsZWFzZShsaW5rKTsKK30gLyogaWJtdHJfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIGlibXRyX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgaWJtdHJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIGlibXRyX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworCisgICAgREVCVUcoMCwgImlibXRyX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBpZiAobGluay0+d2luKSB7CisJc3RydWN0IHRva19pbmZvICp0aSA9IG5ldGRldl9wcml2KGRldik7CisJaW91bm1hcCh0aS0+bW1pbyk7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGluZm8tPnNyYW1fd2luX2hhbmRsZSk7CisgICAgfQorCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGlibXRyX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBpYm10cl9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKKworICAgIERFQlVHKDEsICJpYm10cl9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICAvKiBzZXQgZmxhZyB0byBieXBhc3Mgbm9ybWFsIGludGVycnVwdCBjb2RlICovCisJICAgIHN0cnVjdCB0b2tfaW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJICAgIHByaXYtPnNyYW1fcGh5cyB8PSAxOworCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQ7CisJaWJtdHJfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAgICAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworICAgICAgICAgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJaWJtdHJfcHJvYmUoZGV2KTsJLyogcmVhbGx5PyAqLworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBpYm10cl9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgaWJtdHJfaHdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgbW1pb2Jhc2UpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBCaXphcnJlIElCTSBiZWhhdmlvciwgdGhlcmUgYXJlIDE2IGJpdHMgb2YgaW5mb3JtYXRpb24gd2UKKyAgICAgICBuZWVkIHRvIHNldCwgYnV0IHRoZSBjYXJkIG9ubHkgYWxsb3dzIHVzIHRvIHNlbmQgNCBiaXRzIGF0IGEgCisgICAgICAgdGltZS4gIEZvciBlYWNoIGJ5dGUgc2VudCB0byBiYXNlX2FkZHIsIGJpdHMgNy00IHRlbGwgdGhlCisgICAgICAgY2FyZCB3aGljaCBwYXJ0IG9mIHRoZSAxNiBiaXRzIHdlIGFyZSBzZXR0aW5nLCBiaXRzIDMtMCBjb250YWluIAorICAgICAgIHRoZSBhY3R1YWwgaW5mb3JtYXRpb24gKi8KKworICAgIC8qIEZpcnN0IG5pYmJsZSBwcm92aWRlcyA0IGJpdHMgb2YgbW1pbyAqLworICAgIGkgPSAobW1pb2Jhc2UgPj4gMTYpICYgMHgwRjsKKyAgICBvdXRiKGksIGRldi0+YmFzZV9hZGRyKTsKKworICAgIC8qIFNlY29uZCBuaWJibGUgcHJvdmlkZXMgMyBiaXRzIG9mIG1taW8gKi8KKyAgICBpID0gMHgxMCB8ICgobW1pb2Jhc2UgPj4gMTIpICYgMHgwRSk7CisgICAgb3V0YihpLCBkZXYtPmJhc2VfYWRkcik7CisKKyAgICAvKiBUaGlyZCBuaWJibGUsIGhhcmQtY29kZWQgdmFsdWVzICovCisgICAgaSA9IDB4MjY7CisgICAgb3V0YihpLCBkZXYtPmJhc2VfYWRkcik7CisKKyAgICAvKiBGb3VydGggbmliYmxlIHNldHMgc2hhcmVkIHJhbSBwYWdlIHNpemUgKi8KKworICAgIC8qIDggPSAwMCwgMTYgPSAwMSwgMzIgPSAxMCwgNjQgPSAxMSAqLyAgICAgICAgICAKKyAgICBpID0gKHNyYW1zaXplID4+IDQpICYgMHgwNzsKKyAgICBpID0gKChpID09IDQpID8gMyA6IGkpIDw8IDI7CisgICAgaSB8PSAweDMwOworCisgICAgaWYgKHJpbmdzcGVlZCA9PSAxNikKKwlpIHw9IDI7CisgICAgaWYgKGRldi0+YmFzZV9hZGRyID09IDB4QTI0KQorCWkgfD0gMTsKKyAgICBvdXRiKGksIGRldi0+YmFzZV9hZGRyKTsKKworICAgIC8qIDB4NDAgd2lsbCByZWxlYXNlIHRoZSBjYXJkIGZvciB1c2UgKi8KKyAgICBvdXRiKDB4NDAsIGRldi0+YmFzZV9hZGRyKTsKKworICAgIHJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGlibXRyX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImlibXRyX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gaWJtdHJfYXR0YWNoLAorCS5kZXRhY2gJCT0gaWJtdHJfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pYm10cl9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZpYm10cl9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9pYm10cl9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmaWJtdHJfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaWJtdHJfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9pYm10cl9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMzgwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtMCwwICsxLDE2OTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xpbnV4IFBDTUNJQSBldGhlcm5ldCBhZGFwdGVyIGRyaXZlciBmb3IgdGhlIE5ldyBNZWRpYSBFdGhlcm5ldCBMQU4uCisgIG5tY2xhbl9jcy5jLHYgMC4xNiAxOTk1LzA3LzAxIDA2OjQyOjE3IHJwYW8gRXhwIHJwYW8KKworICBUaGUgRXRoZXJuZXQgTEFOIHVzZXMgdGhlIEFkdmFuY2VkIE1pY3JvIERldmljZXMgKEFNRCkgQW03OUM5NDAgTWVkaWEKKyAgQWNjZXNzIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChNQUNFKS4gIEl0IGlzIGVzc2VudGlhbGx5IHRoZSBBbTIxNTAKKyAgUENNQ0lBIEV0aGVybmV0IGNhcmQgY29udGFpbmVkIGluIHRoZSBBbTIxNTAgRGVtbyBLaXQuCisKK1dyaXR0ZW4gYnkgUm9nZXIgQy4gUGFvIDxycGFvQHBhb25ldC5vcmc+CisgIENvcHlyaWdodCAxOTk1IFJvZ2VyIEMuIFBhbworICBMaW51eCAyLjUgY2xlYW51cHMgQ29weXJpZ2h0IFJlZCBIYXQgMjAwMworCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCitQb3J0ZWQgdG8gTGludXggMS4zLiogbmV0d29yayBkcml2ZXIgZW52aXJvbm1lbnQgYnkKKyAgTWF0dGkgQWFybmlvIDxtZWFAdXR1LmZpPgorCitSZWZlcmVuY2VzCisKKyAgQW0yMTUwIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLCBSZXZpc2lvbiAxLjAsIEF1Z3VzdCAxNywgMTk5MworICBBbTc5Qzk0MCAoTUFDRSkgRGF0YSBTaGVldCwgMTk5NAorICBBbTc5QzkwIChDLUxBTkNFKSBEYXRhIFNoZWV0LCAxOTk0CisgIExpbnV4IFBDTUNJQSBQcm9ncmFtbWVyJ3MgR3VpZGUgdjEuMTcKKyAgL3Vzci9zcmMvbGludXgvbmV0L2luZXQvZGV2LmMsIExpbnV4IGtlcm5lbCAxLjIuOAorCisgIEVyaWMgTWVhcnMsIE5ldyBNZWRpYSBDb3Jwb3JhdGlvbgorICBUb20gUG9sbGFyZCwgTmV3IE1lZGlhIENvcnBvcmF0aW9uCisgIERlYW4gU2lhc295Y28sIE5ldyBNZWRpYSBDb3Jwb3JhdGlvbgorICBLZW4gTGVzbmlhaywgU2lsaWNvbiBHcmFwaGljcywgSW5jLiA8bGVzbmlha0Bib3N0b24uc2dpLmNvbT4KKyAgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4KKyAgRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisgIFRoZSBMaW51eCBjbGllbnQgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSAzYzU4OV9jcy5jIGNsaWVudCBkcml2ZXIgYnkKKyAgRGF2aWQgSGluZHMuCisKKyAgVGhlIExpbnV4IG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgaXMgYmFzZWQgb24gdGhlIDNjNTg5X2NzLmMgZHJpdmVyLAorICB0aGUgODM5MC5jIGRyaXZlciwgYW5kIHRoZSBleGFtcGxlIHNrZWxldG9uLmMga2VybmVsIGNvZGUsIHdoaWNoIGFyZQorICBieSBEb25hbGQgQmVja2VyLgorCisgIFRoZSBBbTIxNTAgbmV0d29yayBkcml2ZXIgaGFyZHdhcmUgaW50ZXJmYWNlIGNvZGUgaXMgYmFzZWQgb24gdGhlCisgIE9TLzkwMDAgZHJpdmVyIGZvciB0aGUgTmV3IE1lZGlhIEV0aGVybmV0IExBTiBieSBFcmljIE1lYXJzLgorCisgIFNwZWNpYWwgdGhhbmtzIGZvciB0ZXN0aW5nIGFuZCBoZWxwIGluIGRlYnVnZ2luZyB0aGlzIGRyaXZlciBnb2VzCisgIHRvIEtlbiBMZXNuaWFrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEcml2ZXIgTm90ZXMgYW5kIElzc3VlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxLiBEZXZlbG9wZWQgb24gYSBEZWxsIDMyMFNMaQorICAgUENNQ0lBIENhcmQgU2VydmljZXMgMi42LjIKKyAgIExpbnV4IGRlbGwgMS4yLjEwICMxIFRodSBKdW4gMjkgMjA6MjM6NDEgUERUIDE5OTUgaTM4NgorCisyLiByYy5wY21jaWEgbWF5IHJlcXVpcmUgbG9hZGluZyBwY21jaWFfY29yZSB3aXRoIGlvX3NwZWVkPTMwMDoKKyAgICdpbnNtb2QgcGNtY2lhX2NvcmUubyBpb19zcGVlZD0zMDAnLgorICAgVGhpcyB3aWxsIGF2b2lkIHByb2JsZW1zIHdpdGggZmFzdCBzeXN0ZW1zIHdoaWNoIGNhdXNlcyByeF9mcmFtZWNudAorICAgdG8gcmV0dXJuIHJhbmRvbSB2YWx1ZXMuCisKKzMuIElmIGhvdCBleHRyYWN0aW9uIGRvZXMgbm90IHdvcmsgZm9yIHlvdSwgdXNlICdpZmNvbmZpZyBldGgwIGRvd24nCisgICBiZWZvcmUgZXh0cmFjdGlvbi4KKworNC4gVGhlcmUgaXMgYSBiYWQgc2xvdy1kb3duIHByb2JsZW0gaW4gdGhpcyBkcml2ZXIuCisKKzUuIEZ1dHVyZTogTXVsdGljYXN0IHByb2Nlc3NpbmcuICBJbiB0aGUgbWVhbnRpbWUsIGRvIF9ub3RfIGNvbXBpbGUgeW91cgorICAga2VybmVsIHdpdGggbXVsdGljYXN0IGlwIGVuYWJsZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xvZzogbm1jbGFuX2NzLmMsdgorICogMi41Ljc1LWFjMSAyMDAzLzA3LzExIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiBGaXhlZCBoYW5nIG9uIGNhcmQgZWplY3QgYXMgd2UgcHJvYmUgaXQKKyAqIENsZWFuZWQgdXAgdG8gdXNlIG5ldyBzdHlsZSBsb2NraW5nLgorICoKKyAqIFJldmlzaW9uIDAuMTYgIDE5OTUvMDcvMDEgIDA2OjQyOjE3ICBycGFvCisgKiBCdWcgZml4OiBubWNsYW5fcmVzZXQoKSBjYWxsZWQgQ2FyZFNlcnZpY2VzIGluY29ycmVjdGx5LgorICoKKyAqIFJldmlzaW9uIDAuMTUgIDE5OTUvMDUvMjQgIDA4OjA5OjQ3ICBycGFvCisgKiBSZS1pbXBsZW1lbnQgTVVMVElfVFggZGV2LT50YnVzeSBoYW5kbGluZy4KKyAqCisgKiBSZXZpc2lvbiAwLjE0ICAxOTk1LzA1LzIzICAwMzoxOTozMCAgcnBhbworICogQWRkZWQsIGluIG5tY2xhbl9jb25maWcoKSwgInR1cGxlLkF0dHJpYnV0ZXMgPSAwOyIuCisgKiBNb2RpZmllZCBNQUNFIElEIGNoZWNrIHRvIGlnbm9yZSBjaGlwIHJldmlzaW9uIGxldmVsLgorICogQXZvaWQgdHhfZnJlZV9mcmFtZXMgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBfc3RhcnRfeG1pdCBhbmQgX2ludGVycnVwdC4KKyAqCisgKiBSZXZpc2lvbiAwLjEzICAxOTk1LzA1LzE4ICAwNTo1NjozNCAgcnBhbworICogU3RhdGlzdGljcyBjaGFuZ2VzLgorICogQnVnIGZpeDogbm1jbGFuX3Jlc2V0IGRpZCBub3QgZW5hYmxlIFRYIGFuZCBSWDogY2FsbCByZXN0b3JlX211bHRpY2FzdF9saXN0LgorICogQnVnIGZpeDogbWFjZV9pbnRlcnJ1cHQgY2hlY2tzIH5NQUNFX0lNUl9ERUZBVUxULiAgRml4ZXMgZHJpdmVyIGxvY2t1cC4KKyAqCisgKiBSZXZpc2lvbiAwLjEyICAxOTk1LzA1LzE0ICAwMDoxMjoyMyAgcnBhbworICogU3RhdGlzdGljcyBvdmVyaGF1bC4KKyAqCisKKzk1LzA1LzEzIHJwYW8JVjAuMTBhCisJCUJ1ZyBmaXg6IE1BQ0Ugc3RhdGlzdGljcyBjb3VudGVycyB1c2VkIHdyb25nIEkvTyBwb3J0cy4KKwkJQnVnIGZpeDogbWFjZV9pbnRlcnJ1cHQoKSBuZWVkZWQgdG8gYWxsb3cgc3RhdGlzdGljcyB0byBiZQorCQlwcm9jZXNzZWQgd2l0aG91dCBSWCBvciBUWCBpbnRlcnJ1cHRzIHBlbmRpbmcuCis5NS8wNS8xMSBycGFvCVYwLjEwCisJCU11bHRpcGxlIHRyYW5zbWl0IHJlcXVlc3QgcHJvY2Vzc2luZy4KKwkJTW9kaWZpZWQgc3RhdGlzdGljcyB0byB1c2UgTUFDRSBjb3VudGVycyB3aGVyZSBwb3NzaWJsZS4KKzk1LzA1LzEwIHJwYW8JVjAuMDkgQnVnIGZpeDogTXVzdCB1c2UgSU9fREFUQV9QQVRIX1dJRFRIX0FVVE8uCisJCSpSZWxlYXNlZAorOTUvMDUvMTAgcnBhbwlWMC4wOAorCQlCdWcgZml4OiBNYWtlIGFsbCBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHByaXZhdGUgYnkgdXNpbmcKKwkJc3RhdGljIGtleXdvcmQuCisJCUJ1ZyBmaXg6IFRlc3QgSW50ckNudCBfYmVmb3JlXyByZWFkaW5nIE1BQ0VfSVIuCis5NS8wNS8xMCBycGFvCVYwLjA3IFN0YXRpc3RpY3MuCis5NS8wNS8wOSBycGFvCVYwLjA2IEZpeCByeF9mcmFtZWNudCBwcm9ibGVtIGJ5IGFkZGl0aW9uIG9mIFBDSUMgd2FpdCBzdGF0ZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBEUlZfTkFNRQkibm1jbGFuX2NzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xNiIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb25kaXRpb25hbCBDb21waWxhdGlvbiBPcHRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTVVMVElfVFgJCQkwCisjZGVmaW5lIFJFU0VUX09OX1RJTUVPVVQJCTEKKyNkZWZpbmUgVFhfSU5URVJSVVBUQUJMRQkJMQorI2RlZmluZSBSRVNFVF9YSUxJTlgJCQkwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luY2x1ZGUgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOCQkJRVRIX0FMRU4KKwkJCQkJLyogNiBieXRlcyBpbiBhbiBFdGhlcm5ldCBBZGRyZXNzICovCisjZGVmaW5lIE1BQ0VfTEFEUkZfTEVOCQkJOAorCQkJCQkvKiA4IGJ5dGVzIGluIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIgKi8KKworLyogTG9vcCBDb250cm9sIERlZmluZXMgKi8KKyNkZWZpbmUgTUFDRV9NQVhfSVJfSVRFUkFUSU9OUwkJMTAKKyNkZWZpbmUgTUFDRV9NQVhfUlhfSVRFUkFUSU9OUwkJMTIKKwkvKgorCVRCRDogRGVhbiBicm91Z2h0IHRoaXMgdXAsIGFuZCBJIGFzc3VtZWQgdGhlIGhhcmR3YXJlIHdvdWxkCisJaGFuZGxlIGl0OgorCisJSWYgTUFDRV9NQVhfUlhfSVRFUkFUSU9OUyBpcyA+IDEsIHJ4X2ZyYW1lY250IG1heSBzdGlsbCBiZQorCW5vbi16ZXJvIHdoZW4gdGhlIGlzciBleGl0cy4gIFdlIG1heSBub3QgZ2V0IGFub3RoZXIgaW50ZXJydXB0CisJdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIHBhY2tldHMgZm9yIHNvbWUgdGltZS4KKwkqLworCisvKgorVGhlIEFtMjE1MCBoYXMgYSBYaWxpbnggWEMzMDQyIGZpZWxkIHByb2dyYW1tYWJsZSBnYXRlIGFycmF5IChGUEdBKQord2hpY2ggbWFuYWdlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIE1BQ0UgYW5kIHRoZSBQQ01DSUEgYnVzLiAgSXQKK2Fsc28gaW5jbHVkZXMgYnVmZmVyIG1hbmFnZW1lbnQgZm9yIHRoZSAzMksgeCA4IFNSQU0gdG8gY29udHJvbCB1cCB0bworZm91ciB0cmFuc21pdCBhbmQgMTIgcmVjZWl2ZSBmcmFtZXMgYXQgYSB0aW1lLgorKi8KKyNkZWZpbmUgQU0yMTUwX01BWF9UWF9GUkFNRVMJCTQKKyNkZWZpbmUgQU0yMTUwX01BWF9SWF9GUkFNRVMJCTEyCisKKy8qIEFtMjE1MCBFdGhlcm5ldCBDYXJkIEkvTyBNYXBwaW5nICovCisjZGVmaW5lIEFNMjE1MF9SQ1YJCQkweDAwCisjZGVmaW5lIEFNMjE1MF9YTVQJCQkweDA0CisjZGVmaW5lIEFNMjE1MF9YTVRfU0tJUAkJCTB4MDkKKyNkZWZpbmUgQU0yMTUwX1JDVl9ORVhUCQkJMHgwQQorI2RlZmluZSBBTTIxNTBfUkNWX0ZSQU1FX0NPVU5UCQkweDBCCisjZGVmaW5lIEFNMjE1MF9NQUNFX0JBTksJCTB4MEMKKyNkZWZpbmUgQU0yMTUwX01BQ0VfQkFTRQkJMHgxMAorCisvKiBNQUNFIFJlZ2lzdGVycyAqLworI2RlZmluZSBNQUNFX1JDVkZJRk8JCQkwCisjZGVmaW5lIE1BQ0VfWE1URklGTwkJCTEKKyNkZWZpbmUgTUFDRV9YTVRGQwkJCTIKKyNkZWZpbmUgTUFDRV9YTVRGUwkJCTMKKyNkZWZpbmUgTUFDRV9YTVRSQwkJCTQKKyNkZWZpbmUgTUFDRV9SQ1ZGQwkJCTUKKyNkZWZpbmUgTUFDRV9SQ1ZGUwkJCTYKKyNkZWZpbmUgTUFDRV9GSUZPRkMJCQk3CisjZGVmaW5lIE1BQ0VfSVIJCQkJOAorI2RlZmluZSBNQUNFX0lNUgkJCTkKKyNkZWZpbmUgTUFDRV9QUgkJCQkxMAorI2RlZmluZSBNQUNFX0JJVUNDCQkJMTEKKyNkZWZpbmUgTUFDRV9GSUZPQ0MJCQkxMgorI2RlZmluZSBNQUNFX01BQ0NDCQkJMTMKKyNkZWZpbmUgTUFDRV9QTFNDQwkJCTE0CisjZGVmaW5lIE1BQ0VfUEhZQ0MJCQkxNQorI2RlZmluZSBNQUNFX0NISVBJREwJCQkxNgorI2RlZmluZSBNQUNFX0NISVBJREgJCQkxNworI2RlZmluZSBNQUNFX0lBQwkJCTE4CisvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQUNFX0xBRFJGCQkJMjAKKyNkZWZpbmUgTUFDRV9QQURSCQkJMjEKKy8qIFJlc2VydmVkICovCisvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQUNFX01QQwkJCTI0CisvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQUNFX1JOVFBDCQkJMjYKKyNkZWZpbmUgTUFDRV9SQ1ZDQwkJCTI3CisvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQUNFX1VUUgkJCTI5CisjZGVmaW5lIE1BQ0VfUlRSMQkJCTMwCisjZGVmaW5lIE1BQ0VfUlRSMgkJCTMxCisKKy8qIE1BQ0UgQml0IE1hc2tzICovCisjZGVmaW5lIE1BQ0VfWE1UUkNfRVhERUYJCTB4ODAKKyNkZWZpbmUgTUFDRV9YTVRSQ19YTVRSQwkJMHgwRgorCisjZGVmaW5lIE1BQ0VfWE1URlNfWE1UU1YJCTB4ODAKKyNkZWZpbmUgTUFDRV9YTVRGU19VRkxPCQkJMHg0MAorI2RlZmluZSBNQUNFX1hNVEZTX0xDT0wJCQkweDIwCisjZGVmaW5lIE1BQ0VfWE1URlNfTU9SRQkJCTB4MTAKKyNkZWZpbmUgTUFDRV9YTVRGU19PTkUJCQkweDA4CisjZGVmaW5lIE1BQ0VfWE1URlNfREVGRVIJCTB4MDQKKyNkZWZpbmUgTUFDRV9YTVRGU19MQ0FSCQkJMHgwMgorI2RlZmluZSBNQUNFX1hNVEZTX1JUUlkJCQkweDAxCisKKyNkZWZpbmUgTUFDRV9SQ1ZGU19SQ1ZTVFMJCTB4RjAwMAorI2RlZmluZSBNQUNFX1JDVkZTX09GTE8JCQkweDgwMDAKKyNkZWZpbmUgTUFDRV9SQ1ZGU19DTFNOCQkJMHg0MDAwCisjZGVmaW5lIE1BQ0VfUkNWRlNfRlJBTQkJCTB4MjAwMAorI2RlZmluZSBNQUNFX1JDVkZTX0ZDUwkJCTB4MTAwMAorCisjZGVmaW5lIE1BQ0VfRklGT0ZDX1JDVkZDCQkweEYwCisjZGVmaW5lIE1BQ0VfRklGT0ZDX1hNVEZDCQkweDBGCisKKyNkZWZpbmUgTUFDRV9JUl9KQUIJCQkweDgwCisjZGVmaW5lIE1BQ0VfSVJfQkFCTAkJCTB4NDAKKyNkZWZpbmUgTUFDRV9JUl9DRVJSCQkJMHgyMAorI2RlZmluZSBNQUNFX0lSX1JDVkNDTwkJCTB4MTAKKyNkZWZpbmUgTUFDRV9JUl9STlRQQ08JCQkweDA4CisjZGVmaW5lIE1BQ0VfSVJfTVBDTwkJCTB4MDQKKyNkZWZpbmUgTUFDRV9JUl9SQ1ZJTlQJCQkweDAyCisjZGVmaW5lIE1BQ0VfSVJfWE1USU5UCQkJMHgwMQorCisjZGVmaW5lIE1BQ0VfTUFDQ0NfUFJPTQkJCTB4ODAKKyNkZWZpbmUgTUFDRV9NQUNDQ19EWE1UMlBECQkweDQwCisjZGVmaW5lIE1BQ0VfTUFDQ0NfRU1CQQkJCTB4MjAKKyNkZWZpbmUgTUFDRV9NQUNDQ19SRVNFUlZFRAkJMHgxMAorI2RlZmluZSBNQUNFX01BQ0NDX0RSQ1ZQQQkJMHgwOAorI2RlZmluZSBNQUNFX01BQ0NDX0RSQ1ZCQwkJMHgwNAorI2RlZmluZSBNQUNFX01BQ0NDX0VOWE1UCQkweDAyCisjZGVmaW5lIE1BQ0VfTUFDQ0NfRU5SQ1YJCTB4MDEKKworI2RlZmluZSBNQUNFX1BIWUNDX0xOS0ZMCQkweDgwCisjZGVmaW5lIE1BQ0VfUEhZQ0NfRExOS1RTVAkJMHg0MAorI2RlZmluZSBNQUNFX1BIWUNDX1JFVlBPTAkJMHgyMAorI2RlZmluZSBNQUNFX1BIWUNDX0RBUEMJCQkweDEwCisjZGVmaW5lIE1BQ0VfUEhZQ0NfTFJUCQkJMHgwOAorI2RlZmluZSBNQUNFX1BIWUNDX0FTRUwJCQkweDA0CisjZGVmaW5lIE1BQ0VfUEhZQ0NfUldBS0UJCTB4MDIKKyNkZWZpbmUgTUFDRV9QSFlDQ19BV0FLRQkJMHgwMQorCisjZGVmaW5lIE1BQ0VfSUFDX0FERFJDSEcJCTB4ODAKKyNkZWZpbmUgTUFDRV9JQUNfUEhZQUREUgkJMHgwNAorI2RlZmluZSBNQUNFX0lBQ19MT0dBRERSCQkweDAyCisKKyNkZWZpbmUgTUFDRV9VVFJfUlRSRQkJCTB4ODAKKyNkZWZpbmUgTUFDRV9VVFJfUlRSRAkJCTB4NDAKKyNkZWZpbmUgTUFDRV9VVFJfUlBBCQkJMHgyMAorI2RlZmluZSBNQUNFX1VUUl9GQ09MTAkJCTB4MTAKKyNkZWZpbmUgTUFDRV9VVFJfUkNWRkNTRQkJMHgwOAorI2RlZmluZSBNQUNFX1VUUl9MT09QX0lOQ0xfTUVOREVDCTB4MDYKKyNkZWZpbmUgTUFDRV9VVFJfTE9PUF9OT19NRU5ERUMJCTB4MDQKKyNkZWZpbmUgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTAkJMHgwMgorI2RlZmluZSBNQUNFX1VUUl9MT09QX05PTkUJCTB4MDAKKyNkZWZpbmUgTUFDRV9VVFJfUkVTRVJWRUQJCTB4MDEKKworLyogU3dpdGNoIE1BQ0UgcmVnaXN0ZXIgYmFuayAob25seSAwIGFuZCAxIGFyZSB2YWxpZCkgKi8KKyNkZWZpbmUgTUFDRUJBTksod2luX251bSkgb3V0Yigod2luX251bSksIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBTkspCisKKyNkZWZpbmUgTUFDRV9JTVJfREVGQVVMVCBcCisgICgweEZGIC0gXAorICAgICggXAorICAgICAgTUFDRV9JUl9DRVJSIHwgXAorICAgICAgTUFDRV9JUl9SQ1ZDQ08gfCBcCisgICAgICBNQUNFX0lSX1JOVFBDTyB8IFwKKyAgICAgIE1BQ0VfSVJfTVBDTyB8IFwKKyAgICAgIE1BQ0VfSVJfUkNWSU5UIHwgXAorICAgICAgTUFDRV9JUl9YTVRJTlQgXAorICAgICkgXAorICApCisjdW5kZWYgTUFDRV9JTVJfREVGQVVMVAorI2RlZmluZSBNQUNFX0lNUl9ERUZBVUxUIDB4MDAgLyogTmV3IHN0YXRpc3RpY3MgaGFuZGxpbmc6IGdyYWIgZXZlcnl0aGluZyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQJCSgoNDAwKkhaKS8xMDAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUeXBlIERlZmluaXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IF9tYWNlX3N0YXRpc3RpY3MgeworICAgIC8qIE1BQ0VfWE1URlMgKi8KKyAgICBpbnQgeG10c3Y7CisgICAgaW50IHVmbG87CisgICAgaW50IGxjb2w7CisgICAgaW50IG1vcmU7CisgICAgaW50IG9uZTsKKyAgICBpbnQgZGVmZXI7CisgICAgaW50IGxjYXI7CisgICAgaW50IHJ0cnk7CisKKyAgICAvKiBNQUNFX1hNVFJDICovCisgICAgaW50IGV4ZGVmOworICAgIGludCB4bXRyYzsKKworICAgIC8qIFJGUzEtLVJlY2VpdmUgU3RhdHVzIChSQ1ZTVFMpICovCisgICAgaW50IG9mbG87CisgICAgaW50IGNsc247CisgICAgaW50IGZyYW07CisgICAgaW50IGZjczsKKworICAgIC8qIFJGUzItLVJ1bnQgUGFja2V0IENvdW50IChSTlRQQykgKi8KKyAgICBpbnQgcmZzX3JudHBjOworCisgICAgLyogUkZTMy0tUmVjZWl2ZSBDb2xsaXNpb24gQ291bnQgKFJDVkNDKSAqLworICAgIGludCByZnNfcmN2Y2M7CisKKyAgICAvKiBNQUNFX0lSICovCisgICAgaW50IGphYjsKKyAgICBpbnQgYmFibDsKKyAgICBpbnQgY2VycjsKKyAgICBpbnQgcmN2Y2NvOworICAgIGludCBybnRwY287CisgICAgaW50IG1wY287CisKKyAgICAvKiBNQUNFX01QQyAqLworICAgIGludCBtcGM7CisKKyAgICAvKiBNQUNFX1JOVFBDICovCisgICAgaW50IHJudHBjOworCisgICAgLyogTUFDRV9SQ1ZDQyAqLworICAgIGludCByY3ZjYzsKK30gbWFjZV9zdGF0aXN0aWNzOworCit0eXBlZGVmIHN0cnVjdCBfbWFjZV9wcml2YXRlIHsKKyAgICBkZXZfbGlua190IGxpbms7CisgICAgZGV2X25vZGVfdCBub2RlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGxpbnV4X3N0YXRzOyAvKiBMaW51eCBzdGF0aXN0aWNzIGNvdW50ZXJzICovCisgICAgbWFjZV9zdGF0aXN0aWNzIG1hY2Vfc3RhdHM7IC8qIE1BQ0UgY2hpcCBzdGF0aXN0aWNzIGNvdW50ZXJzICovCisKKyAgICAvKiByZXN0b3JlX211bHRpY2FzdF9saXN0KCkgc3RhdGUgdmFyaWFibGVzICovCisgICAgaW50IG11bHRpY2FzdF9sYWRyZltNQUNFX0xBRFJGX0xFTl07IC8qIExvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgKi8KKyAgICBpbnQgbXVsdGljYXN0X251bV9hZGRyczsKKworICAgIGNoYXIgdHhfZnJlZV9mcmFtZXM7IC8qIE51bWJlciBvZiBmcmVlIHRyYW5zbWl0IGZyYW1lIGJ1ZmZlcnMgKi8KKyAgICBjaGFyIHR4X2lycV9kaXNhYmxlZDsgLyogTUFDRSBUWCBpbnRlcnJ1cHQgZGlzYWJsZWQgKi8KKyAgICAKKyAgICBzcGlubG9ja190IGJhbmtfbG9jazsgLyogTXVzdCBiZSBoZWxkIGlmIHlvdSBzdGVwIG9mZiBiYW5rIDAgKi8KK30gbWFjZV9wcml2YXRlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQcml2YXRlIEdsb2JhbCBWYXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGNoYXIgcmNzaWRbXSA9Cisibm1jbGFuX2NzLmMsdiAwLjE2IDE5OTUvMDcvMDEgMDY6NDI6MTcgcnBhbyBFeHAgcnBhbyI7CitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiICIgRFJWX1ZFUlNJT04gIiAoUm9nZXIgQy4gUGFvKSI7CisjZW5kaWYKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm89Im5tY2xhbl9jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKK3N0YXRpYyBjaGFyICppZl9uYW1lc1tdPXsKKyAgICAiQXV0byIsICIxMGJhc2VUIiwgIkJOQyIsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQYXJhbWV0ZXJzCisJVGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBkdXJpbmcgbG9hZGluZyB3aXRoCisJJ2luc21vZCcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9ERVNDUklQVElPTigiTmV3IE1lZGlhIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworLyogMD1hdXRvLCAxPTEwYmFzZVQsIDIgPSAxMGJhc2UyLCBkZWZhdWx0PWF1dG8gKi8KK0lOVF9NT0RVTEVfUEFSTShpZl9wb3J0LCAwKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdW5jdGlvbiBQcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIG5tY2xhbl9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBubWNsYW5fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgbm1jbGFuX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyB2b2lkIG5tY2xhbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIGludCBtYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1hY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbWFjZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBSeENudCk7CitzdGF0aWMgdm9pZCByZXN0b3JlX211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKKworc3RhdGljIGRldl9saW5rX3QgKm5tY2xhbl9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBubWNsYW5fZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9hdHRhY2gKKwlDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhCisJc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIENhcmQKKwlTZXJ2aWNlcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGRldl9saW5rX3QgKm5tY2xhbl9hdHRhY2godm9pZCkKK3sKKyAgICBtYWNlX3ByaXZhdGUgKmxwOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgIm5tY2xhbl9hdHRhY2goKVxuIik7CisgICAgREVCVUcoMSwgIiVzXG4iLCByY3NpZCk7CisKKyAgICAvKiBDcmVhdGUgbmV3IGV0aGVybmV0IGRldmljZSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihtYWNlX3ByaXZhdGUpKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gTlVMTDsKKyAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZscC0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworICAgIAorICAgIHNwaW5fbG9ja19pbml0KCZscC0+YmFua19sb2NrKTsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAzMjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmbWFjZV9pbnRlcnJ1cHQ7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgbHAtPnR4X2ZyZWVfZnJhbWVzPUFNMjE1MF9NQVhfVFhfRlJBTUVTOworCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJm1hY2Vfc3RhcnRfeG1pdDsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmbWFjZV9jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmbWFjZV9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworICAgIGRldi0+b3BlbiA9ICZtYWNlX29wZW47CisgICAgZGV2LT5zdG9wID0gJm1hY2VfY2xvc2U7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ID0gbWFjZV90eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5tY2xhbl9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCW5tY2xhbl9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIG5tY2xhbl9hdHRhY2ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX2RldGFjaAorCVRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisJd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisJc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKwl3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIG5tY2xhbl9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygwLCAibm1jbGFuX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlubWNsYW5fcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBubWNsYW5fZGV0YWNoICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfcmVhZAorCVJlYWRzIGEgTUFDRSByZWdpc3Rlci4gIFRoaXMgaXMgYmFuayBpbmRlcGVuZGVudDsgaG93ZXZlciwgdGhlCisJY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhpcyBjYWxsIGlzIG5vdCBpbnRlcnJ1cHRhYmxlLiAgV2UgYXJlCisJYXNzdW1pbmcgdGhhdCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgdGhlIE1BQ0UgaXMgYWx3YXlzIGluCisJYmFuayAwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX3JlYWQobWFjZV9wcml2YXRlICpscCwga2lvX2FkZHJfdCBpb2FkZHIsIGludCByZWcpCit7CisgIGludCBkYXRhID0gMHhGRjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBzd2l0Y2ggKHJlZyA+PiA0KSB7CisgICAgY2FzZSAwOiAvKiByZWdpc3RlciAwLTE1ICovCisgICAgICBkYXRhID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiByZWdpc3RlciAxNi0zMSAqLworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5iYW5rX2xvY2ssIGZsYWdzKTsKKyAgICAgIE1BQ0VCQU5LKDEpOworICAgICAgZGF0YSA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgKHJlZyAmIDB4MEYpKTsKKyAgICAgIE1BQ0VCQU5LKDApOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmJhbmtfbG9jaywgZmxhZ3MpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIChkYXRhICYgMHhGRik7Cit9IC8qIG1hY2VfcmVhZCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX3dyaXRlCisJV3JpdGVzIHRvIGEgTUFDRSByZWdpc3Rlci4gIFRoaXMgaXMgYmFuayBpbmRlcGVuZGVudDsgaG93ZXZlciwKKwl0aGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhpcyBjYWxsIGlzIG5vdCBpbnRlcnJ1cHRhYmxlLiAgV2UKKwlhcmUgYXNzdW1pbmcgdGhhdCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgdGhlIE1BQ0UgaXMgYWx3YXlzIGluCisJYmFuayAwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgbWFjZV93cml0ZShtYWNlX3ByaXZhdGUgKmxwLCBraW9fYWRkcl90IGlvYWRkciwgaW50IHJlZywgaW50IGRhdGEpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgc3dpdGNoIChyZWcgPj4gNCkgeworICAgIGNhc2UgMDogLyogcmVnaXN0ZXIgMC0xNSAqLworICAgICAgb3V0YihkYXRhICYgMHhGRiwgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIHJlZ2lzdGVyIDE2LTMxICovCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmJhbmtfbG9jaywgZmxhZ3MpOworICAgICAgTUFDRUJBTksoMSk7CisgICAgICBvdXRiKGRhdGEgJiAweEZGLCBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgKHJlZyAmIDB4MEYpKTsKKyAgICAgIE1BQ0VCQU5LKDApOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmJhbmtfbG9jaywgZmxhZ3MpOworICAgICAgYnJlYWs7CisgIH0KK30gLyogbWFjZV93cml0ZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX2luaXQKKwlSZXNldHMgdGhlIE1BQ0UgY2hpcC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9pbml0KG1hY2VfcHJpdmF0ZSAqbHAsIGtpb19hZGRyX3QgaW9hZGRyLCBjaGFyICplbmV0X2FkZHIpCit7CisgIGludCBpOworICBpbnQgY3QgPSAwOworCisgIC8qIE1BQ0UgU29mdHdhcmUgcmVzZXQgKi8KKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0JJVUNDLCAxKTsKKyAgd2hpbGUgKG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX0JJVUNDKSAmIDB4MDEpIHsKKyAgICAvKiBXYWl0IGZvciByZXNldCBiaXQgdG8gYmUgY2xlYXJlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIDw9IDIwMG5zICovOworICAgIGlmKCsrY3QgPiA1MDApCisgICAgeworICAgIAlwcmludGsoS0VSTl9FUlIgIm1hY2U6IHJlc2V0IGZhaWxlZCwgY2FyZCByZW1vdmVkID9cbiIpOworICAgIAlyZXR1cm4gLTE7CisgICAgfQorICAgIHVkZWxheSgxKTsKKyAgfQorICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfQklVQ0MsIDApOworCisgIC8qIFRoZSBBbTIxNTAgcmVxdWlyZXMgdGhhdCB0aGUgTUFDRSBGSUZPcyBvcGVyYXRlIGluIGJ1cnN0IG1vZGUuICovCisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9GSUZPQ0MsIDB4MEYpOworCisgIG1hY2Vfd3JpdGUobHAsaW9hZGRyLCBNQUNFX1JDVkZDLCAwKTsgLyogRGlzYWJsZSBBdXRvIFN0cmlwIFJlY2VpdmUgKi8KKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0lNUiwgMHhGRik7IC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgdW50aWwgX29wZW4gKi8KKworICAvKgorICAgKiBCaXQgMi0xIFBPUlRTRUxbMS0wXSBQb3J0IFNlbGVjdC4KKyAgICogMDAgQVVJLzEwQmFzZS0yCisgICAqIDAxIDEwQmFzZS1UCisgICAqIDEwIERBSSBQb3J0IChyZXNlcnZlZCBpbiBBbTIxNTApCisgICAqIDExIEdQU0kKKyAgICogRm9yIHRoaXMgY2FyZCwgb25seSB0aGUgZmlyc3QgdHdvIGFyZSB2YWxpZC4KKyAgICogU28sIFBMU0NDIHNob3VsZCBiZSBzZXQgdG8KKyAgICogMHgwMCBmb3IgMTBCYXNlLTIKKyAgICogMHgwMiBmb3IgMTBCYXNlLVQKKyAgICogT3IganVzdCBzZXQgQVNFTCBpbiBQSFlDQyBiZWxvdyEKKyAgICovCisgIHN3aXRjaCAoaWZfcG9ydCkgeworICAgIGNhc2UgMToKKyAgICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9QTFNDQywgMHgwMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfUExTQ0MsIDB4MDApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9QSFlDQywgLyogQVNFTCAqLyA0KTsKKyAgICAgIC8qIEFTRUwgQXV0byBTZWxlY3QuICBXaGVuIHNldCwgdGhlIFBPUlRTRUxbMS0wXSBiaXRzIGFyZSBvdmVycmlkZGVuLAorCSBhbmQgdGhlIE1BQ0UgZGV2aWNlIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIG9wZXJhdGluZyBtZWRpYQorCSBpbnRlcmZhY2UgcG9ydC4gKi8KKyAgICAgIGJyZWFrOworICB9CisKKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0lBQywgTUFDRV9JQUNfQUREUkNIRyB8IE1BQ0VfSUFDX1BIWUFERFIpOworICAvKiBQb2xsIEFERFJDSEcgYml0ICovCisgIGN0ID0gMDsKKyAgd2hpbGUgKG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX0lBQykgJiBNQUNFX0lBQ19BRERSQ0hHKQorICB7CisgIAlpZigrKyBjdCA+IDUwMCkKKyAgCXsKKyAgCQlwcmludGsoS0VSTl9FUlIgIm1hY2U6IEFERFJDSEcgdGltZW91dCwgY2FyZCByZW1vdmVkID9cbiIpOworICAJCXJldHVybiAtMTsKKyAgCX0KKyAgfQorICAvKiBTZXQgUEFEUiByZWdpc3RlciAqLworICBmb3IgKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfUEFEUiwgZW5ldF9hZGRyW2ldKTsKKworICAvKiBNQUMgQ29uZmlndXJhdGlvbiBDb250cm9sIFJlZ2lzdGVyIHNob3VsZCBiZSB3cml0dGVuIGxhc3QgKi8KKyAgLyogTGV0IHNldF9tdWx0aWNhc3RfbGlzdCBzZXQgdGhpcy4gKi8KKyAgLyogbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVik7ICovCisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywgMHgwMCk7CisgIHJldHVybiAwOworfSAvKiBtYWNlX2luaXQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX2NvbmZpZworCVRoaXMgcm91dGluZSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKwlpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKwlldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorICBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBubWNsYW5fY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdHVwbGVfdCB0dXBsZTsKKyAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgdV9jaGFyIGJ1Zls2NF07CisgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAga2lvX2FkZHJfdCBpb2FkZHI7CisKKyAgREVCVUcoMCwgIm5tY2xhbl9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKyAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICBDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgJmxpbmstPmlvKSk7CisgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBDSVMuICovCisgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODAgLyogQ0lTVFBMX0NGVEFCTEVfRU5UUllfTUlTQyAqLzsKKyAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgIG1lbWNweShkZXYtPmRldl9hZGRyLCB0dXBsZS5UdXBsZURhdGEsIEVUSEVSX0FERFJfTEVOKTsKKworICAvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBieSByZWFkaW5nIHRoZSBNQUNFIElELiAqLworICB7CisgICAgY2hhciBzaWdbMl07CisKKyAgICBzaWdbMF0gPSBtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9DSElQSURMKTsKKyAgICBzaWdbMV0gPSBtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9DSElQSURIKTsKKyAgICBpZiAoKHNpZ1swXSA9PSAweDQwKSAmJiAoKHNpZ1sxXSAmIDB4MEYpID09IDB4MDkpKSB7CisgICAgICBERUJVRygwLCAibm1jbGFuX2NzIGNvbmZpZ3VyZWQ6IG1hY2UgaWQ9JXggJXhcbiIsCisJICAgIHNpZ1swXSwgc2lnWzFdKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJubWNsYW5fY3M6IG1hY2UgaWQgbm90IGZvdW5kOiAleCAleCBzaG91bGQiCisJICAgICAiIGJlIDB4NDAgMHg/OVxuIiwgc2lnWzBdLCBzaWdbMV0pOworICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZihtYWNlX2luaXQobHAsIGlvYWRkciwgZGV2LT5kZXZfYWRkcikgPT0gLTEpCisgIAlnb3RvIGZhaWxlZDsKKworICAvKiBUaGUgaWZfcG9ydCBzeW1ib2wgY2FuIGJlIHNldCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCisgIGlmIChpZl9wb3J0IDw9IDIpCisgICAgZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKyAgZWxzZQorICAgIHByaW50ayhLRVJOX05PVElDRSAibm1jbGFuX2NzOiBpbnZhbGlkIGlmX3BvcnQgcmVxdWVzdGVkXG4iKTsKKworICBsaW5rLT5kZXYgPSAmbHAtPm5vZGU7CisgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICBpZiAoaSAhPSAwKSB7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJubWNsYW5fY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgbGluay0+ZGV2ID0gTlVMTDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorCisgIHN0cmNweShscC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICBwcmludGsoS0VSTl9JTkZPICIlczogbm1jbGFuOiBwb3J0ICUjM2x4LCBpcnEgJWQsICVzIHBvcnQsIGh3X2FkZHIgIiwKKwkgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIG5tY2xhbl9yZWxlYXNlKGxpbmspOworICAgIHJldHVybjsKKworfSAvKiBubWNsYW5fY29uZmlnICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9yZWxlYXNlCisJQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIG5tY2xhbl9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorCW5ldCBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UKKwlpcyBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIG5tY2xhbl9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisKKyAgREVCVUcoMCwgIm5tY2xhbl9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9ldmVudAorCVRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorCXN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisJYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKwl0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBubWNsYW5fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgIERFQlVHKDEsICJubWNsYW5fZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKyAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworICAgICAgbm1jbGFuX2NvbmZpZyhsaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKyAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKyAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwlpZiAobGluay0+b3BlbikKKwkgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKyAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCWlmIChsaW5rLT5vcGVuKSB7CisJICBubWNsYW5fcmVzZXQoZGV2KTsKKwkgIG5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1JFUVVFU1Q6CisgICAgICByZXR1cm4gMTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfSAvKiBubWNsYW5fZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX3Jlc2V0CisJUmVzZXQgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZSBYaWxpbnggYW5kIE1BQ0UgcmVnaXN0ZXJzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgbm1jbGFuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWYgUkVTRVRfWElMSU5YCisgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisgIGNvbmZfcmVnX3QgcmVnOworICB1X2xvbmcgT3JpZ0NvclZhbHVlOyAKKworICAvKiBTYXZlIG9yaWdpbmFsIENPUiB2YWx1ZSAqLworICByZWcuRnVuY3Rpb24gPSAwOworICByZWcuQWN0aW9uID0gQ1NfUkVBRDsKKyAgcmVnLk9mZnNldCA9IENJU1JFR19DT1I7CisgIHJlZy5WYWx1ZSA9IDA7CisgIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICBPcmlnQ29yVmFsdWUgPSByZWcuVmFsdWU7CisKKyAgLyogUmVzZXQgWGlsaW54ICovCisgIHJlZy5BY3Rpb24gPSBDU19XUklURTsKKyAgcmVnLk9mZnNldCA9IENJU1JFR19DT1I7CisgIERFQlVHKDEsICJubWNsYW5fcmVzZXQ6IE9yaWdDb3JWYWx1ZT0weCVsWCwgcmVzZXR0aW5nLi4uXG4iLAorCU9yaWdDb3JWYWx1ZSk7CisgIHJlZy5WYWx1ZSA9IENPUl9TT0ZUX1JFU0VUOworICBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgLyogTmVlZCB0byB3YWl0IGZvciAyMCBtcyBmb3IgUENNQ0lBIHRvIGZpbmlzaCByZXNldC4gKi8KKworICAvKiBSZXN0b3JlIG9yaWdpbmFsIENPUiBjb25maWd1cmF0aW9uIGluZGV4ICovCisgIHJlZy5WYWx1ZSA9IENPUl9MRVZFTF9SRVEgfCAoT3JpZ0NvclZhbHVlICYgQ09SX0NPTkZJR19NQVNLKTsKKyAgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIC8qIFhpbGlueCBpcyBub3cgY29tcGxldGVseSByZXNldCBhbG9uZyB3aXRoIHRoZSBNQUNFIGNoaXAuICovCisgIGxwLT50eF9mcmVlX2ZyYW1lcz1BTTIxNTBfTUFYX1RYX0ZSQU1FUzsKKworI2VuZGlmIC8qICNpZiBSRVNFVF9YSUxJTlggKi8KKworICAvKiBYaWxpbnggaXMgbm93IGNvbXBsZXRlbHkgcmVzZXQgYWxvbmcgd2l0aCB0aGUgTUFDRSBjaGlwLiAqLworICBscC0+dHhfZnJlZV9mcmFtZXM9QU0yMTUwX01BWF9UWF9GUkFNRVM7CisKKyAgLyogUmVpbml0aWFsaXplIHRoZSBNQUNFIGNoaXAgZm9yIG9wZXJhdGlvbi4gKi8KKyAgbWFjZV9pbml0KGxwLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5kZXZfYWRkcik7CisgIG1hY2Vfd3JpdGUobHAsIGRldi0+YmFzZV9hZGRyLCBNQUNFX0lNUiwgTUFDRV9JTVJfREVGQVVMVCk7CisKKyAgLyogUmVzdG9yZSB0aGUgbXVsdGljYXN0IGxpc3QgYW5kIGVuYWJsZSBUWCBhbmQgUlguICovCisgIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QoZGV2KTsKK30gLyogbm1jbGFuX3Jlc2V0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfY29uZmlnCisJW1NvbWVvbmUgdGVsbCBtZSB3aGF0IHRoaXMgaXMgc3VwcG9zZWQgdG8gZG8/ICBJcyBpZl9wb3J0IGEgZGVmaW5lZAorCXN0YW5kYXJkPyAgSWYgc28sIHRoZXJlIHNob3VsZCBiZSBkZWZpbmVzIHRvIGluZGljYXRlIDE9MTBCYXNlLVQsCisJMj0xMEJhc2UtMiwgZXRjLiBpbmNsdWRpbmcgbGltaXRlZCBhdXRvbWF0aWMgZGV0ZWN0aW9uLl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgIGlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisgICAgaWYgKG1hcC0+cG9ydCA8PSAyKSB7CisgICAgICBkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoZWQgdG8gJXMgcG9ydFxuIiwgZGV2LT5uYW1lLAorCSAgICAgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICByZXR1cm4gMDsKK30gLyogbWFjZV9jb25maWcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9vcGVuCisJT3BlbiBkZXZpY2UgZHJpdmVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgaWYgKCFERVZfT0sobGluaykpCisgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgbGluay0+b3BlbisrOworCisgIE1BQ0VCQU5LKDApOworCisgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgIG5tY2xhbl9yZXNldChkZXYpOworCisgIHJldHVybiAwOyAvKiBBbHdheXMgc3VjY2VlZCAqLworfSAvKiBtYWNlX29wZW4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9jbG9zZQorCUNsb3NlcyBkZXZpY2UgZHJpdmVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgIERFQlVHKDIsICIlczogc2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisgIC8qIE1hc2sgb2ZmIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhlIE1BQ0UgY2hpcC4gKi8KKyAgb3V0YigweEZGLCBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JTVIpOworCisgIGxpbmstPm9wZW4tLTsKKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIHJldHVybiAwOworfSAvKiBtYWNlX2Nsb3NlICovCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBjX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlwY19kZWJ1ZyA9IGxldmVsOworfQorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorI2lmZGVmIFBDTUNJQV9ERUJVRworCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX3N0YXJ0X3htaXQKKwlUaGlzIHJvdXRpbmUgYmVnaW5zIHRoZSBwYWNrZXQgdHJhbnNtaXQgZnVuY3Rpb24uICBXaGVuIGNvbXBsZXRlZCwKKwlpdCB3aWxsIGdlbmVyYXRlIGEgdHJhbnNtaXQgaW50ZXJydXB0LgorCisJQWNjb3JkaW5nIHRvIC91c3Ivc3JjL2xpbnV4L25ldC9pbmV0L2Rldi5jLCBpZiBfc3RhcnRfeG1pdAorCXJldHVybnMgMCwgdGhlICJwYWNrZXQgaXMgbm93IHNvbGVseSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisJZHJpdmVyLiIgIElmIF9zdGFydF94bWl0IHJldHVybnMgbm9uLXplcm8sIHRoZSAidHJhbnNtaXNzaW9uCisJZmFpbGVkLCBwdXQgc2tiIGJhY2sgaW50byBhIGxpc3QuIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBtYWNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0IC0tICIsIGRldi0+bmFtZSk7CisjaWYgUkVTRVRfT05fVElNRU9VVAorICBwcmludGsoInJlc2V0dGluZyBjYXJkXG4iKTsKKyAgcGNtY2lhX3Jlc2V0X2NhcmQobGluay0+aGFuZGxlLCBOVUxMKTsKKyNlbHNlIC8qICNpZiBSRVNFVF9PTl9USU1FT1VUICovCisgIHByaW50aygiTk9UIHJlc2V0dGluZyBjYXJkXG4iKTsKKyNlbmRpZiAvKiAjaWYgUkVTRVRfT05fVElNRU9VVCAqLworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IG1hY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgREVCVUcoMywgIiVzOiBtYWNlX3N0YXJ0X3htaXQobGVuZ3RoID0gJWxkKSBjYWxsZWQuXG4iLAorCWRldi0+bmFtZSwgKGxvbmcpc2tiLT5sZW4pOworCisjaWYgKCFUWF9JTlRFUlJVUFRBQkxFKQorICAvKiBEaXNhYmxlIE1BQ0UgVFggaW50ZXJydXB0cy4gKi8KKyAgb3V0YihNQUNFX0lNUl9ERUZBVUxUIHwgTUFDRV9JUl9YTVRJTlQsCisgICAgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSU1SKTsKKyAgbHAtPnR4X2lycV9kaXNhYmxlZD0xOworI2VuZGlmIC8qICNpZiAoIVRYX0lOVEVSUlVQVEFCTEUpICovCisKKyAgeworICAgIC8qIFRoaXMgYmxvY2sgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0cmFuc21pdCByZXF1ZXN0IQorICAgICAgIG1hY2VfdHhfdGltZW91dCB3aWxsIHRha2UgY2FyZSBvZiB0aW1lci1iYXNlZCByZXRyYW5zbWlzc2lvbnMgZnJvbQorICAgICAgIHRoZSB1cHBlciBsYXllcnMuICBUaGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgZ3VhcmFudGVlZCBuZXZlciB0bworICAgICAgIHNlcnZpY2UgYSB0cmFuc21pdCBpbnRlcnJ1cHQgd2hpbGUgd2UgYXJlIGluIGhlcmUuCisgICAgKi8KKworICAgIGxwLT5saW51eF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICBscC0+dHhfZnJlZV9mcmFtZXMtLTsKKworICAgIC8qIFdBUk5JTkc6IFdyaXRlIHRoZSBfZXhhY3RfIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHRoZSBoZWFkZXIhICovCisgICAgLyogUHV0IG91dCB0aGUgd29yZCBoZWFkZXIgW211c3QgYmUgYW4gb3V0dygpXSAuIC4gLiAqLworICAgIG91dHcoc2tiLT5sZW4sIGlvYWRkciArIEFNMjE1MF9YTVQpOworICAgIC8qIC4gLiAuIGFuZCB0aGUgcGFja2V0IFttYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mIG91dHcoKSBhbmQgb3V0YigpXSAqLworICAgIG91dHN3KGlvYWRkciArIEFNMjE1MF9YTVQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4gPj4gMSk7CisgICAgaWYgKHNrYi0+bGVuICYgMSkgeworICAgICAgLyogT2RkIGJ5dGUgdHJhbnNmZXIgKi8KKyAgICAgIG91dGIoc2tiLT5kYXRhW3NrYi0+bGVuLTFdLCBpb2FkZHIgKyBBTTIxNTBfWE1UKTsKKyAgICB9CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworI2lmIE1VTFRJX1RYCisgICAgaWYgKGxwLT50eF9mcmVlX2ZyYW1lcyA+IDApCisgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworI2VuZGlmIC8qICNpZiBNVUxUSV9UWCAqLworICB9CisKKyNpZiAoIVRYX0lOVEVSUlVQVEFCTEUpCisgIC8qIFJlLWVuYWJsZSBNQUNFIFRYIGludGVycnVwdHMuICovCisgIGxwLT50eF9pcnFfZGlzYWJsZWQ9MDsKKyAgb3V0YihNQUNFX0lNUl9ERUZBVUxULCBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JTVIpOworI2VuZGlmIC8qICNpZiAoIVRYX0lOVEVSUlVQVEFCTEUpICovCisKKyAgZGV2X2tmcmVlX3NrYihza2IpOworCisgIHJldHVybiAwOworfSAvKiBtYWNlX3N0YXJ0X3htaXQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9pbnRlcnJ1cHQKKwlUaGUgaW50ZXJydXB0IGhhbmRsZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBpbnQgc3RhdHVzOworICBpbnQgSW50ckNudCA9IE1BQ0VfTUFYX0lSX0lURVJBVElPTlM7CisKKyAgaWYgKGRldiA9PSBOVUxMKSB7CisgICAgREVCVUcoMiwgIm1hY2VfaW50ZXJydXB0KCk6IGlycSAweCVYIGZvciB1bmtub3duIGRldmljZS5cbiIsCisJICBpcnEpOworICAgIHJldHVybiBJUlFfTk9ORTsKKyAgfQorCisgIGlmIChscC0+dHhfaXJxX2Rpc2FibGVkKSB7CisgICAgcHJpbnRrKAorICAgICAgKGxwLT50eF9pcnFfZGlzYWJsZWQ/CisgICAgICAgS0VSTl9OT1RJQ0UgIiVzOiBJbnRlcnJ1cHQgd2l0aCB0eF9pcnFfZGlzYWJsZWQgIgorICAgICAgICJbaXNyPSUwMlgsIGltcj0lMDJYXVxuIjogCisgICAgICAgS0VSTl9OT1RJQ0UgIiVzOiBSZS1lbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgIgorICAgICAgICJbaXNyPSUwMlgsIGltcj0lMDJYXVxuIiksCisgICAgICBkZXYtPm5hbWUsCisgICAgICBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSVIpLAorICAgICAgaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lNUikKKyAgICApOworICAgIC8qIFdBUk5JTkc6IE1BQ0VfSVIgaGFzIGJlZW4gcmVhZCEgKi8KKyAgICByZXR1cm4gSVJRX05PTkU7CisgIH0KKworICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKyAgICBERUJVRygyLCAiJXM6IGludGVycnVwdCBmcm9tIGRlYWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKyAgICByZXR1cm4gSVJRX05PTkU7CisgIH0KKworICBkbyB7CisgICAgLyogV0FSTklORzogTUFDRV9JUiBpcyBhIFJFQUQvQ0xFQVIgcG9ydCEgKi8KKyAgICBzdGF0dXMgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSVIpOworCisgICAgREVCVUcoMywgIm1hY2VfaW50ZXJydXB0OiBpcnEgMHglWCBzdGF0dXMgMHglWC5cbiIsIGlycSwgc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX1JDVklOVCkgeworICAgICAgbWFjZV9yeChkZXYsIE1BQ0VfTUFYX1JYX0lURVJBVElPTlMpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX1hNVElOVCkgeworICAgICAgdW5zaWduZWQgY2hhciBmaWZvZmM7CisgICAgICB1bnNpZ25lZCBjaGFyIHhtdHJjOworICAgICAgdW5zaWduZWQgY2hhciB4bXRmczsKKworICAgICAgZmlmb2ZjID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0ZJRk9GQyk7CisgICAgICBpZiAoKGZpZm9mYyAmIE1BQ0VfRklGT0ZDX1hNVEZDKT09MCkgeworCWxwLT5saW51eF9zdGF0cy50eF9lcnJvcnMrKzsKKwlvdXRiKDB4RkYsIGlvYWRkciArIEFNMjE1MF9YTVRfU0tJUCk7CisgICAgICB9CisKKyAgICAgIC8qIFRyYW5zbWl0IFJldHJ5IENvdW50IChYTVRSQywgcmVnIDQpICovCisgICAgICB4bXRyYyA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9YTVRSQyk7CisgICAgICBpZiAoeG10cmMgJiBNQUNFX1hNVFJDX0VYREVGKSBscC0+bWFjZV9zdGF0cy5leGRlZisrOworICAgICAgbHAtPm1hY2Vfc3RhdHMueG10cmMgKz0gKHhtdHJjICYgTUFDRV9YTVRSQ19YTVRSQyk7CisKKyAgICAgIGlmICgKKyAgICAgICAgKHhtdGZzID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX1hNVEZTKSkgJgorICAgICAgICBNQUNFX1hNVEZTX1hNVFNWIC8qIFRyYW5zbWl0IFN0YXR1cyBWYWxpZCAqLworICAgICAgKSB7CisJbHAtPm1hY2Vfc3RhdHMueG10c3YrKzsKKworCWlmICh4bXRmcyAmIH5NQUNFX1hNVEZTX1hNVFNWKSB7CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX1VGTE8pIHsKKwkgICAgLyogVW5kZXJmbG93LiAgSW5kaWNhdGVzIHRoYXQgdGhlIFRyYW5zbWl0IEZJRk8gZW1wdGllZCBiZWZvcmUKKwkgICAgICAgdGhlIGVuZCBvZiBmcmFtZSB3YXMgcmVhY2hlZC4gKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMudWZsbysrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19MQ09MKSB7CisJICAgIC8qIExhdGUgQ29sbGlzaW9uICovCisJICAgIGxwLT5tYWNlX3N0YXRzLmxjb2wrKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfTU9SRSkgeworCSAgICAvKiBNT1JFIHRoYW4gb25lIHJldHJ5IHdhcyBuZWVkZWQgKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMubW9yZSsrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19PTkUpIHsKKwkgICAgLyogRXhhY3RseSBPTkUgcmV0cnkgb2NjdXJyZWQgKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMub25lKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX0RFRkVSKSB7CisJICAgIC8qIFRyYW5zbWlzc2lvbiB3YXMgZGVmZXJlZCAqLworCSAgICBscC0+bWFjZV9zdGF0cy5kZWZlcisrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19MQ0FSKSB7CisJICAgIC8qIExvc3Mgb2YgY2FycmllciAqLworCSAgICBscC0+bWFjZV9zdGF0cy5sY2FyKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX1JUUlkpIHsKKwkgICAgLyogUmV0cnkgZXJyb3I6IHRyYW5zbWl0IGFib3J0ZWQgYWZ0ZXIgMTYgYXR0ZW1wdHMgKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMucnRyeSsrOworCSAgfQorICAgICAgICB9IC8qIGlmICh4bXRmcyAmIH5NQUNFX1hNVEZTX1hNVFNWKSAqLworCisgICAgICB9IC8qIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfWE1UU1YpICovCisKKyAgICAgIGxwLT5saW51eF9zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICBscC0+dHhfZnJlZV9mcmFtZXMrKzsKKyAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9IC8qIGlmIChzdGF0dXMgJiBNQUNFX0lSX1hNVElOVCkgKi8KKworICAgIGlmIChzdGF0dXMgJiB+TUFDRV9JTVJfREVGQVVMVCAmIH5NQUNFX0lSX1JDVklOVCAmIH5NQUNFX0lSX1hNVElOVCkgeworICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfSkFCKSB7CisgICAgICAgIC8qIEphYmJlciBFcnJvci4gIEV4Y2Vzc2l2ZSB0cmFuc21pdCBkdXJhdGlvbiAoMjAtMTUwbXMpLiAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5qYWIrKzsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX0JBQkwpIHsKKyAgICAgICAgLyogQmFiYmxlIEVycm9yLiAgPjE1MTggYnl0ZXMgdHJhbnNtaXR0ZWQuICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLmJhYmwrKzsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX0NFUlIpIHsKKwkvKiBDb2xsaXNpb24gRXJyb3IuICBDRVJSIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiB0aGUKKwkgICBTaWduYWwgUXVhbGl0eSBFcnJvciBUZXN0IG1lc3NhZ2UgYWZ0ZXIgYSBwYWNrZXQKKwkgICB0cmFuc21pc3Npb24uICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLmNlcnIrKzsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX1JDVkNDTykgeworICAgICAgICAvKiBSZWNlaXZlIENvbGxpc2lvbiBDb3VudCBPdmVyZmxvdzsgKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMucmN2Y2NvKys7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9STlRQQ08pIHsKKyAgICAgICAgLyogUnVudCBQYWNrZXQgQ291bnQgT3ZlcmZsb3cgKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMucm50cGNvKys7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9NUENPKSB7CisgICAgICAgIC8qIE1pc3NlZCBQYWNrZXQgQ291bnQgT3ZlcmZsb3cgKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMubXBjbysrOworICAgICAgfQorICAgIH0gLyogaWYgKHN0YXR1cyAmIH5NQUNFX0lNUl9ERUZBVUxUICYgfk1BQ0VfSVJfUkNWSU5UICYgfk1BQ0VfSVJfWE1USU5UKSAqLworCisgIH0gd2hpbGUgKChzdGF0dXMgJiB+TUFDRV9JTVJfREVGQVVMVCkgJiYgKC0tSW50ckNudCkpOworCisgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogbWFjZV9pbnRlcnJ1cHQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9yeAorCVJlY2VpdmVzIHBhY2tldHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBSeENudCkKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIHVuc2lnbmVkIGNoYXIgcnhfZnJhbWVjbnQ7CisgIHVuc2lnbmVkIHNob3J0IHJ4X3N0YXR1czsKKworICB3aGlsZSAoCisgICAgKChyeF9mcmFtZWNudCA9IGluYihpb2FkZHIgKyBBTTIxNTBfUkNWX0ZSQU1FX0NPVU5UKSkgPiAwKSAmJgorICAgIChyeF9mcmFtZWNudCA8PSAxMikgJiYgLyogcnhfZnJhbWVjbnQ9PTB4RkYgaWYgY2FyZCBpcyBleHRyYWN0ZWQuICovCisgICAgKFJ4Q250LS0pCisgICkgeworICAgIHJ4X3N0YXR1cyA9IGludyhpb2FkZHIgKyBBTTIxNTBfUkNWKTsKKworICAgIERFQlVHKDMsICIlczogaW4gbWFjZV9yeCgpLCBmcmFtZWNudCAweCVYLCByeF9zdGF0dXMiCisJICAiIDB4JVguXG4iLCBkZXYtPm5hbWUsIHJ4X2ZyYW1lY250LCByeF9zdGF0dXMpOworCisgICAgaWYgKHJ4X3N0YXR1cyAmIE1BQ0VfUkNWRlNfUkNWU1RTKSB7IC8qIEVycm9yLCB1cGRhdGUgc3RhdHMuICovCisgICAgICBscC0+bGludXhfc3RhdHMucnhfZXJyb3JzKys7CisgICAgICBpZiAocnhfc3RhdHVzICYgTUFDRV9SQ1ZGU19PRkxPKSB7CisgICAgICAgIGxwLT5tYWNlX3N0YXRzLm9mbG8rKzsKKyAgICAgIH0KKyAgICAgIGlmIChyeF9zdGF0dXMgJiBNQUNFX1JDVkZTX0NMU04pIHsKKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMuY2xzbisrOworICAgICAgfQorICAgICAgaWYgKHJ4X3N0YXR1cyAmIE1BQ0VfUkNWRlNfRlJBTSkgeworCWxwLT5tYWNlX3N0YXRzLmZyYW0rKzsKKyAgICAgIH0KKyAgICAgIGlmIChyeF9zdGF0dXMgJiBNQUNFX1JDVkZTX0ZDUykgeworICAgICAgICBscC0+bWFjZV9zdGF0cy5mY3MrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2hvcnQgcGt0X2xlbiA9IChyeF9zdGF0dXMgJiB+TUFDRV9SQ1ZGU19SQ1ZTVFMpIC0gNDsKKyAgICAgICAgLyogQXV0byBTdHJpcCBpcyBvZmYsIGFsd2F5cyBzdWJ0cmFjdCA0ICovCisgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAgICBscC0+bWFjZV9zdGF0cy5yZnNfcm50cGMgKz0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1YpOworICAgICAgICAvKiBydW50IHBhY2tldCBjb3VudCAqLworICAgICAgbHAtPm1hY2Vfc3RhdHMucmZzX3JjdmNjICs9IGluYihpb2FkZHIgKyBBTTIxNTBfUkNWKTsKKyAgICAgICAgLyogcmN2IGNvbGxpc2lvbiBjb3VudCAqLworCisgICAgICBERUJVRygzLCAiICAgIHJlY2VpdmluZyBwYWNrZXQgc2l6ZSAweCVYIHJ4X3N0YXR1cyIKKwkgICAgIiAweCVYLlxuIiwgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKworICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCisgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKKwlza2ItPmRldiA9IGRldjsKKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJaW5zdyhpb2FkZHIgKyBBTTIxNTBfUkNWLCBza2JfcHV0KHNrYiwgcGt0X2xlbiksIHBrdF9sZW4+PjEpOworCWlmIChwa3RfbGVuICYgMSkKKwkgICAgKihza2ItPnRhaWwtMSkgPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkKKwluZXRpZl9yeChza2IpOyAvKiBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHVwcGVyIChwcm90b2NvbCkgbGF5ZXJzLiAqLworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlscC0+bGludXhfc3RhdHMucnhfcGFja2V0cysrOworCWxwLT5saW51eF9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwlvdXRiKDB4RkYsIGlvYWRkciArIEFNMjE1MF9SQ1ZfTkVYVCk7IC8qIHNraXAgdG8gbmV4dCBmcmFtZSAqLworCWNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKwlERUJVRygxLCAiJXM6IGNvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplIgorCSAgICAgICIgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCWxwLT5saW51eF9zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICB9CisgICAgfQorICAgIG91dGIoMHhGRiwgaW9hZGRyICsgQU0yMTUwX1JDVl9ORVhUKTsgLyogc2tpcCB0byBuZXh0IGZyYW1lICovCisgIH0gLyogd2hpbGUgKi8KKworICByZXR1cm4gMDsKK30gLyogbWFjZV9yeCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcl9saW51eF9zdGF0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgcHJfbGludXhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBzdGF0cykKK3sKKyAgREVCVUcoMiwgInByX2xpbnV4X3N0YXRzXG4iKTsKKyAgREVCVUcoMiwgIiByeF9wYWNrZXRzPSUtN2xkICAgICAgICB0eF9wYWNrZXRzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X3BhY2tldHMsIChsb25nKXBzdGF0cy0+dHhfcGFja2V0cyk7CisgIERFQlVHKDIsICIgcnhfZXJyb3JzPSUtN2xkICAgICAgICAgdHhfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X2Vycm9ycywgKGxvbmcpcHN0YXRzLT50eF9lcnJvcnMpOworICBERUJVRygyLCAiIHJ4X2Ryb3BwZWQ9JS03bGQgICAgICAgIHR4X2Ryb3BwZWQ9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfZHJvcHBlZCwgKGxvbmcpcHN0YXRzLT50eF9kcm9wcGVkKTsKKyAgREVCVUcoMiwgIiBtdWx0aWNhc3Q9JS03bGQgICAgICAgICBjb2xsaXNpb25zPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPm11bHRpY2FzdCwgKGxvbmcpcHN0YXRzLT5jb2xsaXNpb25zKTsKKworICBERUJVRygyLCAiIHJ4X2xlbmd0aF9lcnJvcnM9JS03bGQgIHJ4X292ZXJfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMsIChsb25nKXBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMpOworICBERUJVRygyLCAiIHJ4X2NyY19lcnJvcnM9JS03bGQgICAgIHJ4X2ZyYW1lX2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9jcmNfZXJyb3JzLCAobG9uZylwc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyk7CisgIERFQlVHKDIsICIgcnhfZmlmb19lcnJvcnM9JS03bGQgICAgcnhfbWlzc2VkX2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9maWZvX2Vycm9ycywgKGxvbmcpcHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzKTsKKworICBERUJVRygyLCAiIHR4X2Fib3J0ZWRfZXJyb3JzPSUtN2xkIHR4X2NhcnJpZXJfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzLCAobG9uZylwc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKTsKKyAgREVCVUcoMiwgIiB0eF9maWZvX2Vycm9ycz0lLTdsZCAgICB0eF9oZWFydGJlYXRfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnR4X2ZpZm9fZXJyb3JzLCAobG9uZylwc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnMpOworICBERUJVRygyLCAiIHR4X3dpbmRvd19lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+dHhfd2luZG93X2Vycm9ycyk7Cit9IC8qIHByX2xpbnV4X3N0YXRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByX21hY2Vfc3RhdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHByX21hY2Vfc3RhdHMobWFjZV9zdGF0aXN0aWNzICpwc3RhdHMpCit7CisgIERFQlVHKDIsICJwcl9tYWNlX3N0YXRzXG4iKTsKKworICBERUJVRygyLCAiIHhtdHN2PSUtN2QgICAgICAgICAgICAgdWZsbz0lZFxuIiwKKwlwc3RhdHMtPnhtdHN2LCBwc3RhdHMtPnVmbG8pOworICBERUJVRygyLCAiIGxjb2w9JS03ZCAgICAgICAgICAgICAgbW9yZT0lZFxuIiwKKwlwc3RhdHMtPmxjb2wsIHBzdGF0cy0+bW9yZSk7CisgIERFQlVHKDIsICIgb25lPSUtN2QgICAgICAgICAgICAgICBkZWZlcj0lZFxuIiwKKwlwc3RhdHMtPm9uZSwgcHN0YXRzLT5kZWZlcik7CisgIERFQlVHKDIsICIgbGNhcj0lLTdkICAgICAgICAgICAgICBydHJ5PSVkXG4iLAorCXBzdGF0cy0+bGNhciwgcHN0YXRzLT5ydHJ5KTsKKworICAvKiBNQUNFX1hNVFJDICovCisgIERFQlVHKDIsICIgZXhkZWY9JS03ZCAgICAgICAgICAgICB4bXRyYz0lZFxuIiwKKwlwc3RhdHMtPmV4ZGVmLCBwc3RhdHMtPnhtdHJjKTsKKworICAvKiBSRlMxLS1SZWNlaXZlIFN0YXR1cyAoUkNWU1RTKSAqLworICBERUJVRygyLCAiIG9mbG89JS03ZCAgICAgICAgICAgICAgY2xzbj0lZFxuIiwKKwlwc3RhdHMtPm9mbG8sIHBzdGF0cy0+Y2xzbik7CisgIERFQlVHKDIsICIgZnJhbT0lLTdkICAgICAgICAgICAgICBmY3M9JWRcbiIsCisJcHN0YXRzLT5mcmFtLCBwc3RhdHMtPmZjcyk7CisKKyAgLyogUkZTMi0tUnVudCBQYWNrZXQgQ291bnQgKFJOVFBDKSAqLworICAvKiBSRlMzLS1SZWNlaXZlIENvbGxpc2lvbiBDb3VudCAoUkNWQ0MpICovCisgIERFQlVHKDIsICIgcmZzX3JudHBjPSUtN2QgICAgICAgICByZnNfcmN2Y2M9JWRcbiIsCisJcHN0YXRzLT5yZnNfcm50cGMsIHBzdGF0cy0+cmZzX3JjdmNjKTsKKworICAvKiBNQUNFX0lSICovCisgIERFQlVHKDIsICIgamFiPSUtN2QgICAgICAgICAgICAgICBiYWJsPSVkXG4iLAorCXBzdGF0cy0+amFiLCBwc3RhdHMtPmJhYmwpOworICBERUJVRygyLCAiIGNlcnI9JS03ZCAgICAgICAgICAgICAgcmN2Y2NvPSVkXG4iLAorCXBzdGF0cy0+Y2VyciwgcHN0YXRzLT5yY3ZjY28pOworICBERUJVRygyLCAiIHJudHBjbz0lLTdkICAgICAgICAgICAgbXBjbz0lZFxuIiwKKwlwc3RhdHMtPnJudHBjbywgcHN0YXRzLT5tcGNvKTsKKworICAvKiBNQUNFX01QQyAqLworICBERUJVRygyLCAiIG1wYz0lZFxuIiwgcHN0YXRzLT5tcGMpOworCisgIC8qIE1BQ0VfUk5UUEMgKi8KKyAgREVCVUcoMiwgIiBybnRwYz0lZFxuIiwgcHN0YXRzLT5ybnRwYyk7CisKKyAgLyogTUFDRV9SQ1ZDQyAqLworICBERUJVRygyLCAiIHJjdmNjPSVkXG4iLCBwc3RhdHMtPnJjdmNjKTsKKworfSAvKiBwcl9tYWNlX3N0YXRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VwZGF0ZV9zdGF0cworCVVwZGF0ZSBzdGF0aXN0aWNzLiAgV2UgY2hhbmdlIHRvIHJlZ2lzdGVyIHdpbmRvdyAxLCBzbyB0aGlzCisJc2hvdWxkIGJlIHJ1biBzaW5nbGUtdGhyZWFkZWQgaWYgdGhlIGRldmljZSBpcyBhY3RpdmUuIFRoaXMgaXMKKwlleHBlY3RlZCB0byBiZSBhIHJhcmUgb3BlcmF0aW9uLCBhbmQgaXQncyBzaW1wbGVyIGZvciB0aGUgcmVzdAorCW9mIHRoZSBkcml2ZXIgdG8gYXNzdW1lIHRoYXQgd2luZG93IDAgaXMgYWx3YXlzIHZhbGlkIHJhdGhlcgorCXRoYW4gdXNlIGEgc3BlY2lhbCB3aW5kb3ctc3RhdGUgdmFyaWFibGUuCisKKwlvZmxvICYgdWZsbyBzaG91bGQgX25ldmVyXyBvY2N1ciBzaW5jZSBpdCB3b3VsZCBtZWFuIHRoZSBYaWxpbngKKwl3YXMgbm90IGFibGUgdG8gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHRoZSBNQUNFIEZJRk8gYW5kIHRoZQorCWNhcmQncyBTUkFNIGZhc3QgZW5vdWdoLiAgSWYgdGhpcyBoYXBwZW5zLCBzb21ldGhpbmcgaXMKKwlzZXJpb3VzbHkgd3Jvbmcgd2l0aCB0aGUgaGFyZHdhcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoa2lvX2FkZHJfdCBpb2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIGxwLT5tYWNlX3N0YXRzLnJjdmNjICs9IG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX1JDVkNDKTsKKyAgbHAtPm1hY2Vfc3RhdHMucm50cGMgKz0gbWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfUk5UUEMpOworICBscC0+bWFjZV9zdGF0cy5tcGMgKz0gbWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfTVBDKTsKKyAgLyogQXQgdGhpcyBwb2ludCwgbWFjZV9zdGF0cyBpcyBmdWxseSB1cGRhdGVkIGZvciB0aGlzIGNhbGwuCisgICAgIFdlIG1heSBub3cgdXBkYXRlIHRoZSBsaW51eF9zdGF0cy4gKi8KKworICAvKiBUaGUgTUFDRSBoYXMgbm8gZXF1aXZhbGVudCBmb3IgbGludXhfc3RhdHMgZmllbGQgd2hpY2ggYXJlIGNvbW1lbnRlZAorICAgICBvdXQuICovCisKKyAgLyogbHAtPmxpbnV4X3N0YXRzLm11bHRpY2FzdDsgKi8KKyAgbHAtPmxpbnV4X3N0YXRzLmNvbGxpc2lvbnMgPSAKKyAgICBscC0+bWFjZV9zdGF0cy5yY3ZjY28gKiAyNTYgKyBscC0+bWFjZV9zdGF0cy5yY3ZjYzsKKyAgICAvKiBDb2xsaXNpb246IFRoZSBNQUNFIG1heSByZXRyeSBzZW5kaW5nIGEgcGFja2V0IDE1IHRpbWVzCisgICAgICAgYmVmb3JlIGdpdmluZyB1cC4gIFRoZSByZXRyeSBjb3VudCBpcyBpbiBYTVRSQy4KKyAgICAgICBEb2VzIGVhY2ggcmV0cnkgY29uc3RpdHV0ZSBhIGNvbGxpc2lvbj8KKyAgICAgICBJZiBzbywgd2h5IGRvZXNuJ3QgdGhlIFJDVkNDIHJlY29yZCB0aGVzZSBjb2xsaXNpb25zPyAqLworCisgIC8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKyAgbHAtPmxpbnV4X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAKKyAgICBscC0+bWFjZV9zdGF0cy5ybnRwY28gKiAyNTYgKyBscC0+bWFjZV9zdGF0cy5ybnRwYzsKKyAgLyogbHAtPmxpbnV4X3N0YXRzLnJ4X292ZXJfZXJyb3JzICovCisgIGxwLT5saW51eF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMuZmNzOworICBscC0+bGludXhfc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMuZnJhbTsKKyAgbHAtPmxpbnV4X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMub2ZsbzsKKyAgbHAtPmxpbnV4X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAKKyAgICBscC0+bWFjZV9zdGF0cy5tcGNvICogMjU2ICsgbHAtPm1hY2Vfc3RhdHMubXBjOworCisgIC8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworICBscC0+bGludXhfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5ydHJ5OworICBscC0+bGludXhfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5sY2FyOworICAgIC8qIExDQVIgdXN1YWxseSByZXN1bHRzIGZyb20gYmFkIGNhYmxpbmcuICovCisgIGxwLT5saW51eF9zdGF0cy50eF9maWZvX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLnVmbG87CisgIGxwLT5saW51eF9zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMuY2VycjsKKyAgLyogbHAtPmxpbnV4X3N0YXRzLnR4X3dpbmRvd19lcnJvcnM7ICovCisKKyAgcmV0dXJuOworfSAvKiB1cGRhdGVfc3RhdHMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9nZXRfc3RhdHMKKwlHYXRoZXJzIGV0aGVybmV0IHN0YXRpc3RpY3MgZnJvbSB0aGUgTUFDRSBjaGlwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICB1cGRhdGVfc3RhdHMoZGV2LT5iYXNlX2FkZHIsIGRldik7CisKKyAgREVCVUcoMSwgIiVzOiB1cGRhdGluZyB0aGUgc3RhdGlzdGljcy5cbiIsIGRldi0+bmFtZSk7CisgIHByX2xpbnV4X3N0YXRzKCZscC0+bGludXhfc3RhdHMpOworICBwcl9tYWNlX3N0YXRzKCZscC0+bWFjZV9zdGF0cyk7CisKKyAgcmV0dXJuICZscC0+bGludXhfc3RhdHM7Cit9IC8qIG5ldF9kZXZpY2Vfc3RhdHMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordXBkYXRlQ1JDCisJTW9kaWZpZWQgZnJvbSBBbTc5QzkwIGRhdGEgc2hlZXQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBCUk9LRU5fTVVMVElDQVNUCisKK3N0YXRpYyB2b2lkIHVwZGF0ZUNSQyhpbnQgKkNSQywgaW50IGJpdCkKK3sKKyAgaW50IHBvbHlbXT17CisgICAgMSwxLDEsMCwgMSwxLDAsMSwKKyAgICAxLDAsMSwxLCAxLDAsMCwwLAorICAgIDEsMCwwLDAsIDAsMCwxLDEsCisgICAgMCwwLDEsMCwgMCwwLDAsMAorICB9OyAvKiBDUkMgcG9seW5vbWlhbC4gIHBvbHlbbl0gPSBjb2VmZmljaWVudCBvZiB0aGUgeCoqbiB0ZXJtIG9mIHRoZQorCUNSQyBnZW5lcmF0b3IgcG9seW5vbWlhbC4gKi8KKworICBpbnQgajsKKworICAvKiBzaGlmdCBDUkMgYW5kIGNvbnRyb2wgYml0IChDUkNbMzJdKSAqLworICBmb3IgKGogPSAzMjsgaiA+IDA7IGotLSkKKyAgICBDUkNbal0gPSBDUkNbai0xXTsKKyAgQ1JDWzBdID0gMDsKKworICAvKiBJZiBiaXQgWE9SKGNvbnRyb2wgYml0KSA9IDEsIHNldCBDUkMgPSBDUkMgWE9SIHBvbHlub21pYWwuICovCisgIGlmIChiaXQgXiBDUkNbMzJdKQorICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorICAgICAgQ1JDW2pdIF49IHBvbHlbal07Cit9IC8qIHVwZGF0ZUNSQyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCdWlsZExBRgorCUJ1aWxkIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIuCisJTW9kaWZpZWQgZnJvbSBBbTc5QzkwIGRhdGEgc2hlZXQuCisKK0lucHV0CisJbGFkcmY6IGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgKGNvbnRlbnRzIGluaXRpYWxpemVkIHRvIDApCisJYWRyOiBldGhlcm5ldCBhZGRyZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBCdWlsZExBRihpbnQgKmxhZHJmLCBpbnQgKmFkcikKK3sKKyAgaW50IENSQ1szM109ezF9OyAvKiBDUkMgcmVnaXN0ZXIsIDEgd29yZC9iaXQgKyBleHRyYSBjb250cm9sIGJpdCAqLworCisgIGludCBpLCBieXRlOyAvKiB0ZW1wb3JhcnkgYXJyYXkgaW5kaWNlcyAqLworICBpbnQgaGFzaGNvZGU7IC8qIHRoZSBvdXRwdXQgb2JqZWN0ICovCisKKyAgQ1JDWzMyXT0wOworCisgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA2OyBieXRlKyspCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHVwZGF0ZUNSQyhDUkMsIChhZHJbYnl0ZV0gPj4gaSkgJiAxKTsKKworICBoYXNoY29kZSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgaGFzaGNvZGUgPSAoaGFzaGNvZGUgPDwgMSkgKyBDUkNbaV07CisKKyAgYnl0ZSA9IGhhc2hjb2RlID4+IDM7CisgIGxhZHJmW2J5dGVdIHw9ICgxIDw8IChoYXNoY29kZSAmIDcpKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICBpZiAocGNfZGVidWcgPiAyKSB7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgIiAgICBhZHIgPSIpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICBwcmludGsoIiAlMDJYIiwgYWRyW2ldKTsKKyAgICBwcmludGsoIlxuIiBLRVJOX0RFQlVHICIgICAgaGFzaGNvZGUgPSAlZChkZWNpbWFsKSwgbGFkcmZbMDo2M10iCisJICAgIiA9IiwgaGFzaGNvZGUpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICBwcmludGsoIiAlMDJYIiwgbGFkcmZbaV0pOworICAgIHByaW50aygiXG4iKTsKKyAgfQorI2VuZGlmCit9IC8qIEJ1aWxkTEFGICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Jlc3RvcmVfbXVsdGljYXN0X2xpc3QKKwlSZXN0b3JlcyB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgTUFDRSBjaGlwIHRvIHRoZSBsYXN0CisJc2V0X211bHRpY2FzdF9saXN0KCkgY2FsbC4KKworSW5wdXQKKwltdWx0aWNhc3RfbnVtX2FkZHJzCisJbXVsdGljYXN0X2xhZHJmW10KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGludCBudW1fYWRkcnMgPSBscC0+bXVsdGljYXN0X251bV9hZGRyczsKKyAgaW50ICpsYWRyZiA9IGxwLT5tdWx0aWNhc3RfbGFkcmY7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIGludCBpOworCisgIERFQlVHKDIsICIlczogcmVzdG9yaW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwKKwlkZXYtPm5hbWUsIG51bV9hZGRycyk7CisKKyAgaWYgKG51bV9hZGRycyA+IDApIHsKKworICAgIERFQlVHKDEsICJBdHRlbXB0IHRvIHJlc3RvcmUgbXVsdGljYXN0IGxpc3QgZGV0ZWN0ZWQuXG4iKTsKKworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9JQUMsIE1BQ0VfSUFDX0FERFJDSEcgfCBNQUNFX0lBQ19MT0dBRERSKTsKKyAgICAvKiBQb2xsIEFERFJDSEcgYml0ICovCisgICAgd2hpbGUgKG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX0lBQykgJiBNQUNFX0lBQ19BRERSQ0hHKQorICAgICAgOworICAgIC8qIFNldCBMQURSRiByZWdpc3RlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQUNFX0xBRFJGX0xFTjsgaSsrKQorICAgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0xBRFJGLCBsYWRyZltpXSk7CisKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfVVRSLCBNQUNFX1VUUl9SQ1ZGQ1NFIHwgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTCk7CisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVik7CisKKyAgfSBlbHNlIGlmIChudW1fYWRkcnMgPCAwKSB7CisKKyAgICAvKiBQcm9taXNjdW91cyBtb2RlOiByZWNlaXZlIGFsbCBwYWNrZXRzICovCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1VUUiwgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTCk7CisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLAorICAgICAgTUFDRV9NQUNDQ19QUk9NIHwgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YKKyAgICApOworCisgIH0gZWxzZSB7CisKKyAgICAvKiBOb3JtYWwgbW9kZSAqLworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9VVFIsIE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwpOworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YpOworCisgIH0KK30gLyogcmVzdG9yZV9tdWx0aWNhc3RfbGlzdCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXRfbXVsdGljYXN0X2xpc3QKKwlTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKworSW5wdXQKKwludW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworCW51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorCW51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKwkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KK091dHB1dAorCW11bHRpY2FzdF9udW1fYWRkcnMKKwltdWx0aWNhc3RfbGFkcmZbXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGludCBhZHJbRVRIRVJfQUREUl9MRU5dID0gezB9OyAvKiBFdGhlcm5ldCBhZGRyZXNzICovCisgIGludCBpOworICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICBpZiAocGNfZGVidWcgPiAxKSB7CisgICAgc3RhdGljIGludCBvbGQ7CisgICAgaWYgKGRldi0+bWNfY291bnQgIT0gb2xkKSB7CisgICAgICBvbGQgPSBkZXYtPm1jX2NvdW50OworICAgICAgREVCVUcoMCwgIiVzOiBzZXR0aW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwKKwkgICAgZGV2LT5uYW1lLCBvbGQpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogU2V0IG11bHRpY2FzdF9udW1fYWRkcnMuICovCisgIGxwLT5tdWx0aWNhc3RfbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKworICAvKiBTZXQgbXVsdGljYXN0X2xhZHJmLiAqLworICBpZiAobnVtX2FkZHJzID4gMCkgeworICAgIC8qIENhbGN1bGF0ZSBtdWx0aWNhc3QgbG9naWNhbCBhZGRyZXNzIGZpbHRlciAqLworICAgIG1lbXNldChscC0+bXVsdGljYXN0X2xhZHJmLCAwLCBNQUNFX0xBRFJGX0xFTik7CisgICAgZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworICAgICAgbWVtY3B5KGFkciwgZG1pLT5kbWlfYWRkciwgRVRIRVJfQUREUl9MRU4pOworICAgICAgZG1pID0gZG1pLT5uZXh0OworICAgICAgQnVpbGRMQUYobHAtPm11bHRpY2FzdF9sYWRyZiwgYWRyKTsKKyAgICB9CisgIH0KKworICByZXN0b3JlX211bHRpY2FzdF9saXN0KGRldik7CisKK30gLyogc2V0X211bHRpY2FzdF9saXN0ICovCisKKyNlbmRpZiAvKiBCUk9LRU5fTVVMVElDQVNUICovCisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgREVCVUcoMiwgIiVzOiByZXN0b3JpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLCBkZXYtPm5hbWUsCisJbHAtPm11bHRpY2FzdF9udW1fYWRkcnMpOworCisgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKyAgICAvKiBQcm9taXNjdW91cyBtb2RlOiByZWNlaXZlIGFsbCBwYWNrZXRzICovCisgICAgbWFjZV93cml0ZShscCxpb2FkZHIsIE1BQ0VfVVRSLCBNQUNFX1VUUl9MT09QX0VYVEVSTkFMKTsKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsCisgICAgICBNQUNFX01BQ0NDX1BST00gfCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVgorICAgICk7CisgIH0gZWxzZSB7CisgICAgLyogTm9ybWFsIG1vZGUgKi8KKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfVVRSLCBNQUNFX1VUUl9MT09QX0VYVEVSTkFMKTsKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsIE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWKTsKKyAgfQorfSAvKiByZXN0b3JlX211bHRpY2FzdF9saXN0ICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICBpZiAocGNfZGVidWcgPiAxKSB7CisgICAgc3RhdGljIGludCBvbGQ7CisgICAgaWYgKGRldi0+bWNfY291bnQgIT0gb2xkKSB7CisgICAgICBvbGQgPSBkZXYtPm1jX2NvdW50OworICAgICAgREVCVUcoMCwgIiVzOiBzZXR0aW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwKKwkgICAgZGV2LT5uYW1lLCBvbGQpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgbHAtPm11bHRpY2FzdF9udW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OworICByZXN0b3JlX211bHRpY2FzdF9saXN0KGRldik7CisKK30gLyogc2V0X211bHRpY2FzdF9saXN0ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBubWNsYW5fY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAibm1jbGFuX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gbm1jbGFuX2F0dGFjaCwKKwkuZGV0YWNoCQk9IG5tY2xhbl9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25tY2xhbl9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZubWNsYW5fY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbm1jbGFuX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZubWNsYW5fY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbm1jbGFuX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfbm1jbGFuX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9vc2l0ZWNoLmggYi9kcml2ZXJzL25ldC9wY21jaWEvb3NpdGVjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjZlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvb3NpdGVjaC5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZmlybXdhcmUgb2YgU2V2ZW4gb2YgRGlhbW9uZHMgZnJvbSBPU0lURUNILgorICAgIChTcGVjaWFsIHRoYW5rcyB0byBLZXZpbiBNYWNQaGVyc29uIG9mIE9TSVRFQ0gpCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyovCisKKyAgICBzdGF0aWMgY29uc3QgdV9jaGFyIF9fWGlsaW54N09EW10gPSB7CisgICAgMHhGRiwgMHgwNCwgMHhBMCwgMHgzNiwgMHhGMywgMHhFQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGQiwgMHhGRiwKKyAgICAweEYzLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEVGLCAweDNGLCAweEZGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweDdGLCAweEZFLCAweEZGLAorICAgIDB4Q0UsIDB4RkUsIDB4RkUsIDB4RkUsIAorICAgIDB4RkUsIDB4REUsIDB4QkQsIDB4REQsIDB4RkQsIDB4RkYsIDB4RkQsIDB4Q0YsIDB4RjcsIDB4QkYsIDB4N0YsIDB4RkYsCisgICAgMHg3RiwgMHgzRiwgMHhGRSwgMHhCRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgMHhGRiwgMHhGRiwgMHhCRCwgMHhCNSwgMHg3RiwgMHg3RiwgMHhCRiwgMHhCRiwKKyAgICAweDdGLCAweEZGLCAweEVGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEY3LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERFLAorICAgIDB4RkUsIDB4RkUsIDB4RkEsIDB4REUsIAorICAgIDB4QkQsIDB4RkQsIDB4RUQsIDB4RkQsIDB4RkQsIDB4Q0YsIDB4RUYsIDB4RUYsIDB4RUYsIDB4RUYsIDB4QzcsIDB4REYsCisgICAgMHhERiwgMHhERiwgMHhERiwgMHhERiwgCisgICAgMHhGRiwgMHg3RSwgMHhGRSwgMHhGRCwgMHg3RCwgMHg2RCwgMHhFRSwgMHhGRSwgMHg3QywgMHhGQiwgMHhGNCwgMHhGQiwKKyAgICAweENGLCAweERCLCAweERGLCAweEZGLCAKKyAgICAweEZGLCAweEJCLCAweDdGLCAweEZGLCAweDdGLCAweEZGLCAweEY3LCAweEZGLCAweDlFLCAweEJGLCAweDNCLCAweEJGLAorICAgIDB4QkYsIDB4N0YsIDB4N0YsIDB4N0YsIAorICAgIDB4N0UsIDB4NkYsIDB4REYsIDB4RUYsIDB4RjUsIDB4RjYsIDB4RkQsIDB4RjYsIDB4RjUsIDB4RUQsIDB4RUIsIDB4RkYsCisgICAgMHhFRiwgMHhFRiwgMHhFRiwgMHg3RSwgCisgICAgMHg3RiwgMHg3RiwgMHg2RiwgMHg3RiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhFRiwgMHhCRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweDFGLCAweDFGLCAweEVFLCAweEZGLCAweEJDLAorICAgIDB4QjcsIDB4RkYsIDB4REYsIDB4RkYsIAorICAgIDB4REYsIDB4RUYsIDB4M0IsIDB4RTMsIDB4RDMsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhCQSwgMHhCRiwgMHgyRCwgCisgICAgMHhEQiwgMHhCRCwgMHhGRCwgMHhEQiwgMHhERiwgMHhGQSwgMHhGQiwgMHhGRiwgMHhFRiwgMHhGQiwgMHhEQiwgMHhGMywKKyAgICAweEZGLCAweERGLCAweEZELCAweDdGLCAKKyAgICAweEVGLCAweEZCLCAweEZGLCAweEZGLCAweEJFLCAweEJGLCAweDI3LCAweEJBLCAweEZFLCAweEZCLCAweERGLCAweEZGLAorICAgIDB4RjYsIDB4RkYsIDB4RkYsIDB4RUYsIAorICAgIDB4RkIsIDB4REIsIDB4RjMsIDB4RDksIDB4OUEsIDB4M0YsIDB4RkYsIDB4QUYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4QkUsCisgICAgMHgzRiwgMHgzNywgMHhCRCwgMHg5NiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRSwgMHhGQiwgMHhGMywgMHhGMywgMHhFQiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEY3LCAweEZBLCAweEJDLCAweEFFLCAweEZFLCAweEJFLCAweEZFLCAweEJCLCAweDdGLCAweEZELCAweEZGLAorICAgIDB4N0YsIDB4RUYsIDB4RjcsIDB4RkIsIAorICAgIDB4QkIsIDB4RDcsIDB4RjcsIDB4N0YsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QkMsIDB4RUQsIDB4RkQsCisgICAgMHhCRCwgMHg5RCwgMHg3RCwgMHg3QiwgCisgICAgMHhGQiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRiwgMHhGRiwgMHhGRSwgMHhGRCwgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY3LCAKKyAgICAweEFBLCAweEI5LCAweEJGLCAweDhGLCAweEJGLCAweERGLCAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweDdGLCAweENGLAorICAgIDB4RkIsIDB4RUIsIDB4Q0IsIDB4RUIsIAorICAgIDB4RUUsIDB4RkYsIDB4RkYsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0UsIDB4MzMsIDB4M0YsIDB4MUMsIDB4N0MsCisgICAgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhDRiwgMHhEMywgMHhGMywgMHhFMywgMHhGMywgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEVCLCAweEZFLCAweDM1LCAKKyAgICAweDNGLCAweDNELCAweEZELCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEVGLCAweDZGLCAweEUzLAorICAgIDB4RTMsIDB4RTMsIDB4RUYsIDB4RkYsIAorICAgIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4M0UsIDB4NUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgCisgICAgMHhBRiwgMHhDRiwgMHhGMiwgMHhDQiwgMHhDRiwgMHg4RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwKKyAgICAweEZDLCAweDNFLCAweDFGLCAweDlFLCAKKyAgICAweEFELCAweEZELCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEIzLCAweEY3LCAweEU3LAorICAgIDB4RjcsIDB4RkEsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4RUIsIDB4QUIsIDB4QUYsIDB4OUYsIDB4RTMsIDB4N0YsIDB4RkYsIDB4REUsCisgICAgMHhGRiwgMHg3RiwgMHhFRSwgMHhGRiwgCisgICAgMHhGRiwgMHhGQiwgMHgzQSwgMHhGQSwgMHhGRiwgMHhGMiwgMHg3NywgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHhGRiwKKyAgICAweEZFLCAweEJELCAweEFFLCAweERFLCAKKyAgICAweDdELCAweDdELCAweEZELCAweEZGLCAweEJGLCAweEVFLCAweEZGLCAweEZELCAweEZGLCAweERCLCAweEZCLCAweEZGLAorICAgIDB4RjcsIDB4RUYsIDB4RkIsIDB4RkYsIAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4MkQsIDB4QUYsIDB4QjksIDB4RkQsIDB4NzksIDB4RkIsIDB4RkEsIDB4RkYsIDB4QkYsCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHg5MSwgCisgICAgMHhGQSwgMHhGQiwgMHhERiwgMHhGNywgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHhDRiwgMHgzNywgMHhCRiwKKyAgICAweEJGLCAweEZGLCAweDdGLCAweDdGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEZGLCAweEYzLCAweEZCLCAweEZCLCAweEZGLCAweEY1LCAweEVGLAorICAgIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkEsIAorICAgIDB4RkYsIDB4RkYsIDB4RUUsIDB4RkEsIDB4RkUsIDB4RkIsIDB4NTUsIDB4REQsIDB4RkYsIDB4N0YsIDB4QUYsIDB4RkUsCisgICAgMHhGRiwgMHhGQiwgMHhGQiwgMHhGNSwgCisgICAgMHhGRiwgMHhGNywgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRSwgMHhCRCwgMHhCRCwgMHhCRCwgMHhCRCwgMHg3RCwKKyAgICAweDdCLCAweDdCLCAweDdCLCAweDdCLCAKKyAgICAweEZCLCAweEFFLCAweEZGLCAweEZELCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjcsIDB4REEsIDB4QjcsIDB4NjEsIAorICAgIDB4RkYsIDB4QjksIDB4NTksIDB4RjMsIDB4NzMsIDB4RjMsIDB4REYsIDB4N0YsIDB4NkYsIDB4REYsIDB4RUYsIDB4RjcsCisgICAgMHhFQiwgMHhFQiwgMHhENywgMHhGRiwgCisgICAgMHhENywgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHg3RiwgMHhGQiwgMHgzRSwgMHgzOCwgMHg3MywgMHhGNiwgMHg3RiwKKyAgICAweEZDLCAweEZGLCAweEZGLCAweENGLCAKKyAgICAweEZGLCAweEI3LCAweEZCLCAweEIzLCAweEIzLCAweDY3LCAweEZGLCAweEU3LCAweEZELCAweEZGLCAweEVGLCAweEY2LAorICAgIDB4N0YsIDB4QjcsIDB4QkMsIDB4RjUsIAorICAgIDB4N0IsIDB4RjYsIDB4RjcsIDB4RjUsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RjcsIDB4Q0UsCisgICAgMHhFNywgMHhGRiwgMHg5RiwgMHhGRiwgCisgICAgMHhGRiwgMHhGNSwgMHhGRSwgMHg3RCwgMHhGRiwgMHg1RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEVGLCAweEZGLCAweEY2LCAKKyAgICAweENCLCAweERCLCAweEVFLCAweEZFLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweDdGLCAweEJFLAorICAgIDB4MUUsIDB4M0UsIDB4RkUsIDB4RkYsIAorICAgIDB4N0QsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QkYsIDB4RTcsIDB4RkYsIDB4RTMsIDB4RTMsIDB4RkYsIDB4REYsCisgICAgMHhFNywgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhCOCwgMHhFRiwgMHhCNywgMHgyRiwgMHhFRSwgMHhGRiwgMHhERiwgMHhGRiwgMHhCRiwgMHhGRiwgMHg3RiwgMHhFRiwKKyAgICAweEVCLCAweEJGLCAweEEzLCAweEQzLCAKKyAgICAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEJFLCAweEZELCAweDNGLCAweENGLCAweEZELAorICAgIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkIsIDB4QkYsIDB4QkIsIDB4QkYsIDB4REIsIDB4RkQsIDB4RkIsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHgzRSwgMHhGRSwgCisgICAgMHgzRiwgMHhCQSwgMHhCQSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhFRiwgMHhDMywgMHg3RiwKKyAgICAweEIyLCAweDlCLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweDNDLCAweEZGLCAweDNGLCAweDNDLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4QUYsIDB4RjMsIDB4RkUsIDB4RjMsIDB4RTMsIDB4RUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RjcsCisgICAgMHg5QSwgMHhGRSwgMHhBRiwgMHg5RSwgCisgICAgMHhCRSwgMHhGRSwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHg3QiwgMHhFRiwgMHhGNywgMHhCRiwgMHhGQiwgMHhGQiwKKyAgICAweEZCLCAweEZGLCAweEZGLCAweDdGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEJELCAweEZELCAweEJELCAweERELCAweDdELCAweDdCLCAweDdCLCAweDdCLAorICAgIDB4N0IsIDB4RkIsIDB4QUUsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4OUEsIDB4RkYsCisgICAgMHg5RiwgMHhGRiwgMHhBRiwgMHhFRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhDRiwgMHhGMywgMHhGRiwgMHhFQiwgMHhGRiwgMHhFQiwgMHhGRiwKKyAgICAweEZGLCAweEJGLCAweEZGLCAweEZGLCAKKyAgICAweEVGLCAweEZFLCAweEZGLCAweDM3LCAweEZDLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4Q0YsIDB4RUYsIDB4RkQsIDB4RjMsIAorICAgIDB4RkYsIDB4RUUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkUsIDB4RkQsIDB4MkYsIDB4RkQsCisgICAgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhDRiwgMHhGRiwgMHhGMywgMHhCRiwgMHg2OSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAKKyAgICAweEZCLCAweDlGLCAweEZGLCAweEJGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweDg3LAorICAgIDB4RkUsIDB4REEsIDB4RUYsIDB4Q0YsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4QkYsIDB4RUYsIDB4RUYsIDB4RkQsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhFRiwgMHhGRCwgMHhGRiwgMHg3QiwgMHhGRiwgMHhFQiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVCLCAweEY4LCAweEZGLCAweEVGLCAKKyAgICAweEFGLCAweEZGLCAweEZGLCAweEJELCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEVFLCAweDdGLCAweEVGLCAweEZGLAorICAgIDB4QkIsIDB4RkYsIDB4QkYsIDB4RkIsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RjYsIDB4RkIsIDB4QkQsIDB4RkQsIDB4REQsIDB4RjUsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgCisgICAgMHhGRiwgMHg1RiwgMHhGNSwgMHhERiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwKKyAgICAweEYzLCAweEZGLCAweERFLCAweEZFLCAKKyAgICAweEVGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweERFLCAweERGLCAweDVGLCAweERGLAorICAgIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgCisgICAgMHhFRiwgMHhFRCwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhEQSwgMHhCRCwgMHhCRSwKKyAgICAweEFFLCAweEZFLCAweDdGLCAweEZELCAKKyAgICAweERGLCAweEZGLCAweEZGLCAweDdGLCAweEVGLCAweEZGLCAweEZCLCAweEZCLCAweEZCLCAweDdGLCAweEY3LCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIAorICAgIDB4QkMsIDB4RkQsIDB4QkQsIDB4QkQsIDB4QkQsIDB4RkQsIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUUsCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQSwgMHg5RiwgMHhCRiwgMHhCRiwgMHhDRiwKKyAgICAweDdGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEFGLCAweEZGLCAweEVCLCAweEVCLCAweEVCLCAweEZGLCAweEQ3LCAweEZFLCAweEZGLCAweEZGLAorICAgIDB4QkYsIDB4RTcsIDB4RkUsIDB4QkYsIAorICAgIDB4N0YsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RkYsIDB4RkIsCisgICAgMHhGQiwgMHhGRiwgMHhGRiwgMHhERCwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhCRCwgMHhERiwgMHg5RCwgMHhGRCwgMHhERiwgMHhCOSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEVGLCAweEZGLCAweEZCLCAweEVGLCAweEVCLCAweEZGLCAweERFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjYsIDB4OUYsIDB4RkYsIDB4RkMsIAorICAgIDB4RkUsIDB4RkIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4REYsIDB4RkEsIDB4Q0QsIDB4Q0YsCisgICAgMHhCRiwgMHg5RiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHhCRiwgMHhGRiwgMHhERiwgMHhFRiwgMHg1RiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweDdGLCAweDZGLCAweEZGLCAKKyAgICAweEJCLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdFLCAweEZGLAorICAgIDB4NUYsIDB4RkYsIDB4QkYsIDB4QkYsIAorICAgIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NkUsIDB4N0IsIDB4RkYsIDB4RUYsIDB4RkQsIDB4RUIsIDB4REYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGNywgMHhCNiwgMHgzRSwgMHhGQywgMHhGRCwgMHhCRiwgMHg3RSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywKKyAgICAweEVGLCAweEY3LCAweEYzLCAweEY3LCAKKyAgICAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZFLCAweDM1LCAweDc5LCAweEZGLAorICAgIDB4QkYsIDB4RkMsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkIsIDB4NTMsIDB4REYsIDB4RkYsIDB4RUIsIDB4QkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGNSwKKyAgICAweEZGLCAweEY3LCAweEZGLCAweEZCLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJBLCAweEFBLCAweEVFLCAweEZFLCAweDNGLCAweDdELAorICAgIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4N0YsIDB4QUYsIDB4NzcsIDB4RkIsIDB4RkIsIDB4RkYsIDB4RkIsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHhCRSwgMHhCRCwgMHhCRCwgCisgICAgMHhCRCwgMHhCRCwgMHhGRCwgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRSwgMHhGRiwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZDLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlBLCAweEQ5LCAweEI4LCAweEZGLCAweEZGLCAweDc5LCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIAorICAgIDB4RkIsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RUIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTcsIDB4REUsCisgICAgMHhGOCwgMHhGQiwgMHhGRSwgMHgzRiwgCisgICAgMHhGQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhBRCwgMHhCRiwgMHhGQSwgMHhGRiwgMHg3MywKKyAgICAweERGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweDNBLCAweEY1LCAweEI3LCAweEZDLCAweDNGLCAweEY5LCAweEZELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4N0YsIDB4RUYsIDB4RjMsIDB4RkYsIAorICAgIDB4QkYsIDB4RkUsIDB4RjMsIDB4OUYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4M0UsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhEMywgMHhGRSwgMHhEQiwgMHhGRiwgMHhEQiwgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweDNFLCAweEZGLCAweEJGLCAweEZGLCAweDdGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDhGLAorICAgIDB4RjMsIDB4RkYsIDB4RUQsIDB4RkYsIAorICAgIDB4RjcsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RjYsIDB4M0MsIDB4RkUsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHg5RiwgMHhFRiwgMHhFRiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDdFLCAweEJGLCAKKyAgICAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJCLCAweEVGLCAweERGLCAweEYxLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsIDB4M0UsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgCisgICAgMHhFRiwgMHhGRCwgMHhDMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwKKyAgICAweEZDLCAweDNFLCAweEZFLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDJFLCAweEVGLCAweEYzLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RjcsIDB4QkEsIDB4QkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg3RiwgMHhBRiwgMHhGQiwgCisgICAgMHhGQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGMiwgMHhENiwgMHhFRCwKKyAgICAweEJELCAweEJELCAweEJELCAweDdELCAKKyAgICAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLCAweEFGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4OTIsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsCisgICAgMHhBRiwgMHhFQiwgMHhFQiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNywgMHhGRSwgMHgyRSwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDRGLCAweEVGLCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIAorICAgIDB4M0MsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4Q0UsCisgICAgMHhDMywgMHhGRCwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHg1RCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEVGLCAweENGLCAweEVCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjcsIDB4RUUsIDB4M0UsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUYsIDB4REYsIDB4RTIsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNiwgMHhCRSwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDdGLCAweEVFLCAKKyAgICAweDVGLCAweEU2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNFLAorICAgIDB4N0QsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RjMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhCRiwgMHhGNywgMHgzNiwgMHhCRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEVGLCAweEQzLCAweEY2LCAKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweDdGLCAweEVFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RUYsIDB4RUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhCQSwgMHhCRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwKKyAgICAweEZCLCAweEZBLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEQ2LCAweEZELCAweEJELCAweEJELCAweEJELAorICAgIDB4N0QsIDB4N0IsIDB4N0IsIDB4N0IsIAorICAgIDB4N0IsIDB4RkIsIDB4QUUsIDB4RkYsIDB4N0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGNywgMHhCQSwgMHhCRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRiwgMHhFQiwgMHg2QiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweEJFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4NEYsIDB4RUYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsCisgICAgMHgzRSwgMHg2RSwgMHhGQywgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhDMywgMHhDOSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDNFLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkIsIAorICAgIDB4RDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RiwgMHhFRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEY2LCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEZFLAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RjcsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHg3RiwgMHhGQSwgMHhFRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEU3LCAweEZGLCAweEZFLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEZFLCAweEVGLCAweEJGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RkMsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgCisgICAgMHhGRSwgMHhBRSwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNywKKyAgICAweEY3LCAweEZBLCAweEZGLCAweEZELCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEFGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QkUsIDB4QkQsIDB4QkQsIDB4QkQsIDB4QkQsIDB4N0QsIDB4N0IsIDB4N0IsCisgICAgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRiwgCisgICAgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweDZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RTcsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhDRiwgMHhGRSwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RTcsIDB4RjIsIDB4RkMsIAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QUUsIDB4RUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg3RSwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLAorICAgIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RUYsIDB4REQsIDB4RkUsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEFGLCAweEVGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJBLCAweEZFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkEsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGNiwgMHg5QywgMHhCRCwgMHhCRCwgMHhCRCwgMHhCRCwgMHg3RCwgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwKKyAgICAweEFFLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDdBLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4NkYsIDB4RUYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhFQiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweDlFLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RUYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRiwgMHhDQiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZELCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjgsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkIsIDB4QUYsIDB4N0YsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEJGLCAweEZGLCAKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHg3RiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEY3LCAweEJDLCAweEJELCAKKyAgICAweEJELCAweEJELCAweEJELCAweDdELCAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLCAweEFGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgCisgICAgMHhBRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRSwgMHhGRiwgMHg5RiwgMHg5RiwKKyAgICAweDlGLCAweDNGLCAweDNGLCAweDNGLCAKKyAgICAweDNGLCAweDNGLCAweEZGLCAweEVGLCAweERGLCAweERGLCAweERGLCAweERGLCAweENGLCAweEI3LCAweEJGLCAweEJGLAorICAgIDB4QkYsIDB4QkYsIDB4RkYsIDB4QkMsIAorICAgIDB4QjksIDB4OUQsIDB4QkQsIDB4QkQsIDB4N0QsIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsIDB4RUYsIDB4RDcsCisgICAgMHhGNSwgMHhGMywgMHhGMSwgMHhEMSwgCisgICAgMHg2NSwgMHhFMywgMHhFMywgMHhFMywgMHhBMywgMHhGRiwgMHhGRSwgMHg3RiwgMHhGRSwgMHhERSwgMHhERSwgMHhGRiwKKyAgICAweEJELCAweEJELCAweEJELCAweEJELCAKKyAgICAweERGLCAweEVGLCAweEZCLCAweEY3LCAweEYzLCAweEYzLCAweEYzLCAweEU3LCAweEU3LCAweEU3LCAweEU3LCAweEU3LAorICAgIDB4RkIsIDB4RkUsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKKyAgICAKKyAgICB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDEyNjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTAsMCArMSwxNjU5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgTlM4MzkwLWJhc2VkIGNhcmRzCisKKyAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgRC1MaW5rIERFLTY1MCBhbmQgTGlua3N5cyBFdGhlcm5ldENhcmQKKyAgICBjYXJkcywgdGhlIG5ld2VyIEQtTGluayBhbmQgTGlua3N5cyBjb21ibyBjYXJkcywgQWNjdG9uIEVOMjIxMgorICAgIGNhcmRzLCB0aGUgUlBUSSBFUDQwMCwgYW5kIHRoZSBQcmVNYXggUEUtMjAwIGluIG5vbi1zaGFyZWQtbWVtb3J5CisgICAgbW9kZSwgYW5kIHRoZSBJQk0gQ3JlZGl0IENhcmQgQWRhcHRlciwgdGhlIE5FNDEwMCwgdGhlIFRob21hcworICAgIENvbnJhZCBldGhlcm5ldCBjYXJkLCBhbmQgdGhlIEtpbmdzdG9uIEtORS1QQ00veCBpbiBzaGFyZWQtbWVtb3J5CisgICAgbW9kZS4gIEl0IHdpbGwgYWxzbyBoYW5kbGUgdGhlIFNvY2tldCBFQSBjYXJkIGluIGVpdGhlciBtb2RlLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzIC0tIGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0CisKKyAgICBwY25ldF9jcy5jIDEuMTUzIDIwMDMvMTEvMDkgMTg6NTM6MDkKKyAgICAKKyAgICBUaGUgbmV0d29yayBkcml2ZXIgY29kZSBpcyBiYXNlZCBvbiBEb25hbGQgQmVja2VyJ3MgTkUyMDAwIGNvZGU6CisKKyAgICBXcml0dGVuIDE5OTIsMTk5MyBieSBEb25hbGQgQmVja2VyLgorICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQKKyAgICBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgICBEb25hbGQgQmVja2VyIG1heSBiZSByZWFjaGVkIGF0IGJlY2tlckBzY3lsZC5jb20KKworICAgIEJhc2VkIGFsc28gb24gS2VpdGggTW9vcmUncyBjaGFuZ2VzIHRvIERvbiBCZWNrZXIncyBjb2RlLCBmb3IgSUJNCisgICAgQ0NBRSBzdXBwb3J0LiAgRHJpdmVycyBtZXJnZWQgYmFjayB0b2dldGhlciwgYW5kIHNoYXJlZC1tZW1vcnkKKyAgICBTb2NrZXQgRUEgc3VwcG9ydCBhZGRlZCwgYnkgS2VuIFJhZWJ1cm4sIFNlcHRlbWJlciAxOTk1LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDwuLi9kcml2ZXJzL25ldC84MzkwLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQQ05FVF9DTUQJMHgwMAorI2RlZmluZSBQQ05FVF9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIFBDTkVUX1JFU0VUCTB4MWYJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBQQ05FVF9NSVNDCTB4MTgJLyogRm9yIElCTSBDQ0FFIGFuZCBTb2NrZXQgRUEgY2FyZHMgKi8KKworI2RlZmluZSBQQ05FVF9TVEFSVF9QRwkweDQwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIFBDTkVUX1NUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCisvKiBTb2NrZXQgRUEgY2FyZHMgaGF2ZSBhIGxhcmdlciBwYWNrZXQgYnVmZmVyICovCisjZGVmaW5lIFNPQ0tFVF9TVEFSVF9QRwkweDAxCisjZGVmaW5lIFNPQ0tFVF9TVE9QX1BHCTB4ZmYKKworI2RlZmluZSBQQ05FVF9SRENfVElNRU9VVCAoMipIWi8xMDApCS8qIE1heCB3YWl0IGluIGppZmZpZXMgZm9yIFR4IFJEQyAqLworCitzdGF0aWMgY2hhciAqaWZfbmFtZXNbXSA9IHsgImF1dG8iLCAiMTBiYXNlVCIsICIxMGJhc2UyIn07CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisicGNuZXRfY3MuYyAxLjE1MyAyMDAzLzExLzA5IDE4OjUzOjA5IChEYXZpZCBIaW5kcykiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORTIwMDAgY29tcGF0aWJsZSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKK0lOVF9NT0RVTEVfUEFSTShpZl9wb3J0LAkxKTsJLyogVHJhbnNjZWl2ZXIgdHlwZSAqLworSU5UX01PRFVMRV9QQVJNKHVzZV9iaWdfYnVmLAkxKTsJLyogdXNlIDY0SyBwYWNrZXQgYnVmZmVyPyAqLworSU5UX01PRFVMRV9QQVJNKG1lbV9zcGVlZCwJMCk7CS8qIHNoYXJlZCBtZW0gc3BlZWQsIGluIG5zICovCitJTlRfTU9EVUxFX1BBUk0oZGVsYXlfb3V0cHV0LAkwKTsJLyogcGF1c2UgYWZ0ZXIgeG1pdD8gKi8KK0lOVF9NT0RVTEVfUEFSTShkZWxheV90aW1lLAk0KTsJLyogaW4gdXNlYyAqLworSU5UX01PRFVMRV9QQVJNKHVzZV9zaG1lbSwJLTEpOwkvKiB1c2Ugc2hhcmVkIG1lbW9yeT8gKi8KK0lOVF9NT0RVTEVfUEFSTShmdWxsX2R1cGxleCwJMCk7CS8qIGZ1bGwgZHVwbGV4PyAqLworCisvKiBVZ2ghICBMZXQgdGhlIHVzZXIgaGFyZHdpcmUgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZm9yIHF1ZWVyIGNhcmRzICovCitzdGF0aWMgaW50IGh3X2FkZHJbNl0gPSB7IDAsIC8qIC4uLiAqLyB9OworbW9kdWxlX3BhcmFtX2FycmF5KGh3X2FkZHIsIGludCwgTlVMTCwgMCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBtaWlfcGh5X3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGNuZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgcGNuZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgcGNuZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBpbnQgcGNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaXJxcmV0dXJuX3QgZWlfaXJxX3dyYXBwZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBlaV93YXRjaGRvZyh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIHBjbmV0X3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIGludCBzZXR1cF9zaG1lbV93aW5kb3coZGV2X2xpbmtfdCAqbGluaywgaW50IHN0YXJ0X3BnLAorCQkJICAgICAgaW50IHN0b3BfcGcsIGludCBjbV9vZmZzZXQpOworc3RhdGljIGludCBzZXR1cF9kbWFfY29uZmlnKGRldl9saW5rX3QgKmxpbmssIGludCBzdGFydF9wZywKKwkJCSAgICBpbnQgc3RvcF9wZyk7CisKK3N0YXRpYyBkZXZfbGlua190ICpwY25ldF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBwY25ldF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicGNuZXRfY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgaHdfaW5mb190IHsKKyAgICB1X2ludAlvZmZzZXQ7CisgICAgdV9jaGFyCWEwLCBhMSwgYTI7CisgICAgdV9pbnQJZmxhZ3M7Cit9IGh3X2luZm9fdDsKKworI2RlZmluZSBERUxBWV9PVVRQVVQJMHgwMQorI2RlZmluZSBIQVNfTUlTQ19SRUcJMHgwMgorI2RlZmluZSBVU0VfQklHX0JVRgkweDA0CisjZGVmaW5lIEhBU19JQk1fTUlTQwkweDA4CisjZGVmaW5lIElTX0RMMTAwMTkJMHgxMAorI2RlZmluZSBJU19ETDEwMDIyCTB4MjAKKyNkZWZpbmUgSEFTX01JSQkJMHg0MAorI2RlZmluZSBVU0VfU0hNRU0JMHg4MAkvKiBhdXRvZGV0ZWN0ZWQgKi8KKworI2RlZmluZSBBTTc5QzlYWF9IT01FX1BIWQkweDAwMDA2QjkwICAvKiBIb21lUE5BIFBIWSAqLworI2RlZmluZSBBTTc5QzlYWF9FVEhfUEhZCTB4MDAwMDZCNzAgIC8qIDEwYmFzZVQgUEhZICovCisjZGVmaW5lIE1JSV9QSFlJRF9SRVZfTUFTSwkweGZmZmZmZmYwCisjZGVmaW5lIE1JSV9QSFlJRF9SRUcxCQkweDAyCisjZGVmaW5lIE1JSV9QSFlJRF9SRUcyCQkweDAzCisKK3N0YXRpYyBod19pbmZvX3QgaHdfaW5mb1tdID0geworICAgIHsgLyogQWNjdG9uIEVOMjIxMiAqLyAweDBmZjAsIDB4MDAsIDB4MDAsIDB4ZTgsIERFTEFZX09VVFBVVCB9LCAKKyAgICB7IC8qIEFsbGllZCBUZWxlc2lzIExBLVBDTSAqLyAweDBmZjAsIDB4MDAsIDB4MDAsIDB4ZjQsIDAgfSwKKyAgICB7IC8qIEFQRVggTXVsdGlDYXJkICovIDB4MDNmNCwgMHgwMCwgMHgyMCwgMHhlNSwgMCB9LAorICAgIHsgLyogQVNBTlRFIEZyaWVuZGx5TmV0ICovIDB4NDkxMCwgMHgwMCwgMHgwMCwgMHg5NCwKKyAgICAgIERFTEFZX09VVFBVVCB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogRGFucGV4IEVOLTYyMDBQMiAqLyAweDAxMTAsIDB4MDAsIDB4NDAsIDB4YzcsIDAgfSwKKyAgICB7IC8qIERhdGFUcmVrIE5ldENhcmQgKi8gMHgwZmYwLCAweDAwLCAweDIwLCAweGU4LCAwIH0sCisgICAgeyAvKiBEYXluYSBDb21tdW5pQ2FyZCBFICovIDB4MDExMCwgMHgwMCwgMHg4MCwgMHgxOSwgMCB9LAorICAgIHsgLyogRC1MaW5rIERFLTY1MCAqLyAweDAwNDAsIDB4MDAsIDB4ODAsIDB4YzgsIDAgfSwKKyAgICB7IC8qIEVQLTIxMCBFdGhlcm5ldCAqLyAweDAxMTAsIDB4MDAsIDB4NDAsIDB4MzMsIDAgfSwKKyAgICB7IC8qIEVQNDAwMCBFdGhlcm5ldCAqLyAweDAxYzAsIDB4MDAsIDB4MDAsIDB4YjQsIDAgfSwKKyAgICB7IC8qIEVwc29uIEVFTjEwQiAqLyAweDBmZjAsIDB4MDAsIDB4MDAsIDB4NDgsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIEVMRUNPTSBMYW5lZWQgTEQtQ0RXQSAqLyAweGI4LCAweDA4LCAweDAwLCAweDQyLCAwIH0sCisgICAgeyAvKiBIeXBlcnRlYyBFdGhlcm5ldCAqLyAweDAxYzAsIDB4MDAsIDB4NDAsIDB4NGMsIDAgfSwKKyAgICB7IC8qIElCTSBDQ0FFICovIDB4MGZmMCwgMHgwOCwgMHgwMCwgMHg1YSwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogSUJNIENDQUUgKi8gMHgwZmYwLCAweDAwLCAweDA0LCAweGFjLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBJQk0gQ0NBRSAqLyAweDBmZjAsIDB4MDAsIDB4MDYsIDB4MjksCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIElCTSBGTUUgKi8gMHgwMzc0LCAweDA4LCAweDAwLCAweDVhLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBJQk0gRk1FICovIDB4MDM3NCwgMHgwMCwgMHgwNCwgMHhhYywKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogS2Fuc2FpIEtMQS1QQ00vVCAqLyAweDBmZjAsIDB4MDAsIDB4NjAsIDB4ODcsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIE5TQyBEUDgzOTAzICovIDB4MDM3NCwgMHgwOCwgMHgwMCwgMHgxNywKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogTlNDIERQODM5MDMgKi8gMHgwMzc0LCAweDAwLCAweGMwLCAweGE4LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBOU0MgRFA4MzkwMyAqLyAweDAzNzQsIDB4MDAsIDB4YTAsIDB4YjAsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIE5TQyBEUDgzOTAzICovIDB4MDE5OCwgMHgwMCwgMHgyMCwgMHhlMCwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogSS1PIERBVEEgUENMQS9UICovIDB4MGZmMCwgMHgwMCwgMHhhMCwgMHhiMCwgMCB9LAorICAgIHsgLyogS2F0cm9uIFBFLTUyMCAqLyAweDAxMTAsIDB4MDAsIDB4NDAsIDB4ZjYsIDAgfSwKKyAgICB7IC8qIEtpbmdzdG9uIEtORS1QQ00veCAqLyAweDBmZjAsIDB4MDAsIDB4YzAsIDB4ZjAsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIEtpbmdzdG9uIEtORS1QQ00veCAqLyAweDBmZjAsIDB4ZTIsIDB4MGMsIDB4MGYsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIEtpbmdzdG9uIEtORS1QQzIgKi8gMHgwMTgwLCAweDAwLCAweGMwLCAweGYwLCAwIH0sCisgICAgeyAvKiBNYXh0ZWNoIFBDTjIwMDAgKi8gMHg1MDAwLCAweDAwLCAweDAwLCAweGU4LCAwIH0sCisgICAgeyAvKiBOREMgSW5zdGFudC1MaW5rICovIDB4MDAzYSwgMHgwMCwgMHg4MCwgMHhjNiwgMCB9LAorICAgIHsgLyogTkUyMDAwIENvbXBhdGlibGUgKi8gMHgwZmYwLCAweDAwLCAweGEwLCAweDBjLCAwIH0sCisgICAgeyAvKiBOZXR3b3JrIEdlbmVyYWwgU25pZmZlciAqLyAweDBmZjAsIDB4MDAsIDB4MDAsIDB4NjUsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIFBhbmFzb25pYyBWRUwyMTEgKi8gMHgwZmYwLCAweDAwLCAweDgwLCAweDQ1LCAKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogUHJlTWF4IFBFLTIwMCAqLyAweDA3ZjAsIDB4MDAsIDB4MjAsIDB4ZTAsIDAgfSwKKyAgICB7IC8qIFJQVEkgRVA0MDAgKi8gMHgwMTEwLCAweDAwLCAweDQwLCAweDk1LCAwIH0sCisgICAgeyAvKiBTQ00gRXRoZXJuZXQgKi8gMHgwZmYwLCAweDAwLCAweDIwLCAweGNiLCAwIH0sCisgICAgeyAvKiBTb2NrZXQgRUEgKi8gMHg0MDAwLCAweDAwLCAweGMwLCAweDFiLAorICAgICAgREVMQVlfT1VUUFVUIHwgSEFTX01JU0NfUkVHIHwgVVNFX0JJR19CVUYgfSwKKyAgICB7IC8qIFNvY2tldCBMUC1FIENGKyAqLyAweDAxYzAsIDB4MDAsIDB4YzAsIDB4MWIsIDAgfSwKKyAgICB7IC8qIFN1cGVyU29ja2V0IFJFNDUwVCAqLyAweDAxMTAsIDB4MDAsIDB4ZTAsIDB4OTgsIDAgfSwKKyAgICB7IC8qIFZvbGt0ZWsgTlBMLTQwMkNUICovIDB4MDA2MCwgMHgwMCwgMHg0MCwgMHgwNSwgMCB9LAorICAgIHsgLyogTkVDIFBDLTk4MDFOLUoxMiAqLyAweDBmZjAsIDB4MDAsIDB4MDAsIDB4NGMsIDAgfSwKKyAgICB7IC8qIFBDTUNJQSBUZWNobm9sb2d5IE9FTSAqLyAweDAxYzgsIDB4MDAsIDB4YTAsIDB4MGMsIDAgfQorfTsKKworI2RlZmluZSBOUl9JTkZPCQkoc2l6ZW9mKGh3X2luZm8pL3NpemVvZihod19pbmZvX3QpKQorCitzdGF0aWMgaHdfaW5mb190IGRlZmF1bHRfaW5mbyA9IHsgMCwgMCwgMCwgMCwgMCB9Oworc3RhdGljIGh3X2luZm9fdCBkbDEwMDE5X2luZm8gPSB7IDAsIDAsIDAsIDAsIElTX0RMMTAwMTl8SEFTX01JSSB9Oworc3RhdGljIGh3X2luZm9fdCBkbDEwMDIyX2luZm8gPSB7IDAsIDAsIDAsIDAsIElTX0RMMTAwMjJ8SEFTX01JSSB9OworCit0eXBlZGVmIHN0cnVjdCBwY25ldF9kZXZfdCB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBkZXZfbm9kZV90CQlub2RlOworICAgIHVfaW50CQlmbGFnczsKKyAgICB2b2lkCQlfX2lvbWVtICpiYXNlOworICAgIHN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOworICAgIGludAkJCXN0YWxlLCBmYXN0X3BvbGw7CisgICAgdV9jaGFyCQlwaHlfaWQ7CisgICAgdV9jaGFyCQlldGhfcGh5LCBwbmFfcGh5OworICAgIHVfc2hvcnQJCWxpbmtfc3RhdHVzOworICAgIHVfbG9uZwkJbWlpX3Jlc2V0OworfSBwY25ldF9kZXZfdDsKKworc3RhdGljIGlubGluZSBwY25ldF9kZXZfdCAqUFJJVihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoYXIgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAocGNuZXRfZGV2X3QgKikocCArIHNpemVvZihzdHJ1Y3QgZWlfZGV2aWNlKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgcGNuZXRfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqcGNuZXRfYXR0YWNoKHZvaWQpCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm87CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisKKyAgICBERUJVRygwLCAicGNuZXRfYXR0YWNoKClcbiIpOworCisgICAgLyogQ3JlYXRlIG5ldyBldGhlcm5ldCBkZXZpY2UgKi8KKyAgICBkZXYgPSBfX2FsbG9jX2VpX25ldGRldihzaXplb2YocGNuZXRfZGV2X3QpKTsKKyAgICBpZiAoIWRldikgcmV0dXJuIE5VTEw7CisgICAgaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBsaW5rID0gJmluZm8tPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5vcGVuID0gJnBjbmV0X29wZW47CisgICAgZGV2LT5zdG9wID0gJnBjbmV0X2Nsb3NlOworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZzZXRfY29uZmlnOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwY25ldF9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCXBjbmV0X2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogcGNuZXRfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBjbmV0X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJwY25ldF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJcGNuZXRfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBwY25ldF9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIHByb2JlcyBmb3IgYSBjYXJkJ3MgaGFyZHdhcmUgYWRkcmVzcywgZm9yIGNhcmQgdHlwZXMgdGhhdAorICAgIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZWlyIENJUy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBod19pbmZvX3QgKmdldF9od2luZm8oZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICB1X2NoYXIgX19pb21lbSAqYmFzZSwgKnZpcnQ7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gMDsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pOworICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGkpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnQgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBOUl9JTkZPOyBpKyspIHsKKwltZW0uQ2FyZE9mZnNldCA9IGh3X2luZm9baV0ub2Zmc2V0ICYgfihyZXEuU2l6ZS0xKTsKKwlwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisJYmFzZSA9ICZ2aXJ0W2h3X2luZm9baV0ub2Zmc2V0ICYgKHJlcS5TaXplLTEpXTsKKwlpZiAoKHJlYWRiKGJhc2UrMCkgPT0gaHdfaW5mb1tpXS5hMCkgJiYKKwkgICAgKHJlYWRiKGJhc2UrMikgPT0gaHdfaW5mb1tpXS5hMSkgJiYKKwkgICAgKHJlYWRiKGJhc2UrNCkgPT0gaHdfaW5mb1tpXS5hMikpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA8IE5SX0lORk8pIHsKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCSAgICBkZXYtPmRldl9hZGRyW2pdID0gcmVhZGIoYmFzZSArIChqPDwxKSk7CisgICAgfQorICAgIAorICAgIGlvdW5tYXAodmlydCk7CisgICAgaiA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIGlmIChqICE9IENTX1NVQ0NFU1MpCisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWxlYXNlV2luZG93LCBqKTsKKyAgICByZXR1cm4gKGkgPCBOUl9JTkZPKSA/IGh3X2luZm8raSA6IE5VTEw7Cit9IC8qIGdldF9od2luZm8gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIHByb2JlcyBmb3IgYSBjYXJkJ3MgaGFyZHdhcmUgYWRkcmVzcyBieSByZWFkaW5nIHRoZSBQUk9NLgorICAgIEl0IGNoZWNrcyB0aGUgYWRkcmVzcyBhZ2FpbnN0IGEgbGlzdCBvZiBrbm93biB0eXBlcywgdGhlbiBmYWxscworICAgIGJhY2sgdG8gYSBzaW1wbGUgTkUyMDAwIGNsb25lIHNpZ25hdHVyZSBjaGVjay4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBod19pbmZvX3QgKmdldF9wcm9tKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgcHJvbVszMl07CisgICAgaW50IGksIGo7CisKKyAgICAvKiBUaGlzIGlzIGxpZnRlZCBzdHJhaWdodCBmcm9tIGRyaXZlcnMvbmV0L25lLmMgKi8KKyAgICBzdHJ1Y3QgeworCXVfY2hhciB2YWx1ZSwgb2Zmc2V0OworICAgIH0gcHJvZ3JhbV9zZXFbXSA9IHsKKwl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJezB4NDgsCUVOMF9EQ0ZHfSwJLyogU2V0IGJ5dGUtd2lkZSAoMHg0OCkgYWNjZXNzLiAqLworCXsweDAwLAlFTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MuICovCisJezB4MDAsCUVOMF9SQ05USEl9LAorCXsweDAwLAlFTjBfSU1SfSwJLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KKwl7MHhGRiwJRU4wX0lTUn0sCisJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJe0U4MzkwX1RYT0ZGLCBFTjBfVFhDUn0sCS8qIDB4MDIgIGFuZCBsb29wYmFjayBtb2RlLiAqLworCXszMiwJRU4wX1JDTlRMT30sCisJezB4MDAsCUVOMF9SQ05USEl9LAorCXsweDAwLAlFTjBfUlNBUkxPfSwJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8KKwl7MHgwMCwJRU4wX1JTQVJISX0sCisJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorICAgIH07CisKKyAgICBwY25ldF9yZXNldF84MzkwKGRldik7CisgICAgbWRlbGF5KDEwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwlvdXRiX3AocHJvZ3JhbV9zZXFbaV0udmFsdWUsIGlvYWRkciArIHByb2dyYW1fc2VxW2ldLm9mZnNldCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwlwcm9tW2ldID0gaW5iKGlvYWRkciArIFBDTkVUX0RBVEFQT1JUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlJfSU5GTzsgaSsrKSB7CisJaWYgKChwcm9tWzBdID09IGh3X2luZm9baV0uYTApICYmCisJICAgIChwcm9tWzJdID09IGh3X2luZm9baV0uYTEpICYmCisJICAgIChwcm9tWzRdID09IGh3X2luZm9baV0uYTIpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKChpIDwgTlJfSU5GTykgfHwgKChwcm9tWzI4XSA9PSAweDU3KSAmJiAocHJvbVszMF0gPT0gMHg1NykpKSB7CisJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkgICAgZGV2LT5kZXZfYWRkcltqXSA9IHByb21bajw8MV07CisJcmV0dXJuIChpIDwgTlJfSU5GTykgPyBod19pbmZvK2kgOiAmZGVmYXVsdF9pbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30gLyogZ2V0X3Byb20gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBGb3IgREwxMDAxOSBiYXNlZCBjYXJkcywgbGlrZSB0aGUgTGlua3N5cyBFdGhlckZhc3QKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBod19pbmZvX3QgKmdldF9kbDEwMDE5KGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgaW50IGk7CisgICAgdV9jaGFyIHN1bTsKKworICAgIGZvciAoc3VtID0gMCwgaSA9IDB4MTQ7IGkgPCAweDFjOyBpKyspCisJc3VtICs9IGluYl9wKGRldi0+YmFzZV9hZGRyICsgaSk7CisgICAgaWYgKHN1bSAhPSAweGZmKQorCXJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJZGV2LT5kZXZfYWRkcltpXSA9IGluYl9wKGRldi0+YmFzZV9hZGRyICsgMHgxNCArIGkpOworICAgIGkgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAweDFmKTsKKyAgICByZXR1cm4gKChpID09IDB4OTEpfHwoaSA9PSAweDk5KSkgPyAmZGwxMDAyMl9pbmZvIDogJmRsMTAwMTlfaW5mbzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBGb3IgQXNpeCBBWDg4MTkwIGJhc2VkIGNhcmRzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaHdfaW5mb190ICpnZXRfYXg4ODE5MChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBOb3QgbXVjaCBvZiBhIHRlc3QsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIGFyZSBtZXNzeSAqLworICAgIGlmIChsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgIT0gMHgwM2MwKQorCXJldHVybiBOVUxMOworCisgICAgb3V0Yl9wKDB4MDEsIGlvYWRkciArIEVOMF9EQ0ZHKTsJLyogU2V0IHdvcmQtd2lkZSBhY2Nlc3MuICovCisgICAgb3V0Yl9wKDB4MDAsIGlvYWRkciArIEVOMF9SU0FSTE8pOwkvKiBETUEgc3RhcnRpbmcgYXQgMHgwNDAwLiAqLworICAgIG91dGJfcCgweDA0LCBpb2FkZHIgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIGlvYWRkciArIEU4MzkwX0NNRCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJaiA9IGludyhpb2FkZHIgKyBQQ05FVF9EQVRBUE9SVCk7CisJZGV2LT5kZXZfYWRkcltpXSA9IGogJiAweGZmOworCWRldi0+ZGV2X2FkZHJbaSsxXSA9IGogPj4gODsKKyAgICB9CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJwY25ldF9jczogdGhpcyBpcyBhbiBBWDg4MTkwIGNhcmQhXG4iKTsKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgInBjbmV0X2NzOiB1c2UgYXhuZXRfY3MgaW5zdGVhZC5cbiIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgc2hvdWxkIGJlIHRvdGFsbHkgdW5uZWNlc3NhcnkuLi4gYnV0IHdoZW4gd2UgY2FuJ3QgZmlndXJlCisgICAgb3V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIGFueSBvdGhlciB3YXksIHdlJ2xsIGxldCB0aGUgdXNlciBoYXJkCisgICAgd2lyZSBpdCB3aGVuIHRoZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaHdfaW5mb190ICpnZXRfaHdpcmVkKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCWlmIChod19hZGRyW2ldICE9IDApIGJyZWFrOworICAgIGlmIChpID09IDYpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCWRldi0+ZGV2X2FkZHJbaV0gPSBod19hZGRyW2ldOworCisgICAgcmV0dXJuICZkZWZhdWx0X2luZm87Cit9IC8qIGdldF9od2lyZWQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBwY25ldF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgdHJ5X2lvX3BvcnQoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpbnQgaiwgcmV0OworICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEgPT0gMzIpIHsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIgPiAwKSB7CisJICAgIC8qIGZvciBtYXN0ZXIvc2xhdmUgbXVsdGlmdW5jdGlvbiBjYXJkcyAqLworCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IAorCQlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRDsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBUaGlzIHNob3VsZCBiZSB0d28gMTYtcG9ydCB3aW5kb3dzICovCisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKyAgICB9CisgICAgaWYgKGxpbmstPmlvLkJhc2VQb3J0MSA9PSAwKSB7CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKwlmb3IgKGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IChqIF4gMHgzMDApICsgMHgxMDsKKwkgICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCSAgICBpZiAocmV0ID09IENTX1NVQ0NFU1MpIHJldHVybiByZXQ7CisJfQorCXJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGNuZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuLCBzdGFydF9wZywgc3RvcF9wZywgY21fb2Zmc2V0OworICAgIGludCBtYW5maWQgPSAwLCBwcm9kaWQgPSAwLCBoYXNfc2htZW0gPSAwOworICAgIHVfc2hvcnQgYnVmWzY0XTsKKyAgICBjb25maWdfaW5mb190IGNvbmY7CisgICAgaHdfaW5mb190ICpod19pbmZvOworCisgICAgREVCVUcoMCwgInBjbmV0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyogTG9vayB1cCBjdXJyZW50IFZjYyAqLworICAgIENTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsICZjb25mKSk7CisgICAgbGluay0+Y29uZi5WY2MgPSBjb25mLlZjYzsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CisgICAgaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJgorIAkocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSkgeworCW1hbmZpZCA9IGxlMTZfdG9fY3B1KGJ1ZlswXSk7CisJcHJvZGlkID0gbGUxNl90b19jcHUoYnVmWzFdKTsKKyAgICB9CisgICAgCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHdoaWxlIChsYXN0X3JldCA9PSBDU19TVUNDRVNTKSB7CisJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKKwljaXN0cGxfaW9fdCAqaW8gPSAmKHBhcnNlLmNmdGFibGVfZW50cnkuaW8pOworCQorCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwIHx8CisJCQljZmctPmluZGV4ID09IDAgfHwgY2ZnLT5pby5ud2luID09IDApCisJCWdvdG8gbmV4dF9lbnRyeTsKKwkKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKwkvKiBGb3IgbXVsdGlmdW5jdGlvbiBjYXJkcywgYnkgY29udmVudGlvbiwgd2UgY29uZmlndXJlIHRoZQorCSAgIG5ldHdvcmsgZnVuY3Rpb24gd2l0aCB3aW5kb3cgMCwgYW5kIHNlcmlhbCB3aXRoIHdpbmRvdyAxICovCisJaWYgKGlvLT5ud2luID4gMSkgeworCSAgICBpID0gKGlvLT53aW5bMV0ubGVuID4gaW8tPndpblswXS5sZW4pOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzEtaV0uYmFzZTsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxLWldLmxlbjsKKwl9IGVsc2UgeworCSAgICBpID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwl9CisJaGFzX3NobWVtID0gKChjZmctPm1lbS5ud2luID09IDEpICYmCisJCSAgICAgKGNmZy0+bWVtLndpblswXS5sZW4gPj0gMHg0MDAwKSk7CisJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpbltpXS5iYXNlOworCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5baV0ubGVuOworCWxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSArIGxpbmstPmlvLk51bVBvcnRzMiA+PSAzMikgeworCSAgICBsYXN0X3JldCA9IHRyeV9pb19wb3J0KGxpbmspOworCSAgICBpZiAobGFzdF9yZXQgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorICAgIG5leHRfZW50cnk6CisJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpOworICAgIH0KKyAgICBpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGhhbmRsZSwgUmVxdWVzdElPLCBsYXN0X3JldCk7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIAorICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czIgPT0gOCkgeworCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisgICAgfQorICAgIGlmICgobWFuZmlkID09IE1BTkZJRF9JQk0pICYmCisJKHByb2RpZCA9PSBQUk9ESURfSUJNX0hPTUVfQU5EX0FXQVkpKQorCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggfD0gMHgxMDsKKyAgICAKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaWYgKGluZm8tPmZsYWdzICYgSEFTX01JU0NfUkVHKSB7CisJaWYgKChpZl9wb3J0ID09IDEpIHx8IChpZl9wb3J0ID09IDIpKQorCSAgICBkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworCWVsc2UKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJwY25ldF9jczogaW52YWxpZCBpZl9wb3J0IHJlcXVlc3RlZFxuIik7CisgICAgfSBlbHNlIHsKKwlkZXYtPmlmX3BvcnQgPSAwOworICAgIH0KKworICAgIGh3X2luZm8gPSBnZXRfaHdpbmZvKGxpbmspOworICAgIGlmIChod19pbmZvID09IE5VTEwpCisJaHdfaW5mbyA9IGdldF9wcm9tKGxpbmspOworICAgIGlmIChod19pbmZvID09IE5VTEwpCisJaHdfaW5mbyA9IGdldF9kbDEwMDE5KGxpbmspOworICAgIGlmIChod19pbmZvID09IE5VTEwpCisJaHdfaW5mbyA9IGdldF9heDg4MTkwKGxpbmspOworICAgIGlmIChod19pbmZvID09IE5VTEwpCisJaHdfaW5mbyA9IGdldF9od2lyZWQobGluayk7CisgICAgCisgICAgaWYgKGh3X2luZm8gPT0gTlVMTCkgeworCXByaW50ayhLRVJOX05PVElDRSAicGNuZXRfY3M6IHVuYWJsZSB0byByZWFkIGhhcmR3YXJlIG5ldCIKKwkgICAgICAgIiBhZGRyZXNzIGZvciBpbyBiYXNlICUjM2x4XG4iLCBkZXYtPmJhc2VfYWRkcik7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgaW5mby0+ZmxhZ3MgPSBod19pbmZvLT5mbGFnczsKKyAgICAvKiBDaGVjayBmb3IgdXNlciBvdmVycmlkZXMgKi8KKyAgICBpbmZvLT5mbGFncyB8PSAoZGVsYXlfb3V0cHV0KSA/IERFTEFZX09VVFBVVCA6IDA7CisgICAgaWYgKChtYW5maWQgPT0gTUFORklEX1NPQ0tFVCkgJiYKKwkoKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0xQRSkgfHwKKwkgKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0xQRV9DRikgfHwKKwkgKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0VJTykpKQorCWluZm8tPmZsYWdzICY9IH5VU0VfQklHX0JVRjsKKyAgICBpZiAoIXVzZV9iaWdfYnVmKQorCWluZm8tPmZsYWdzICY9IH5VU0VfQklHX0JVRjsKKyAgICAKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBVU0VfQklHX0JVRikgeworCXN0YXJ0X3BnID0gU09DS0VUX1NUQVJUX1BHOworCXN0b3BfcGcgPSBTT0NLRVRfU1RPUF9QRzsKKwljbV9vZmZzZXQgPSAweDEwMDAwOworICAgIH0gZWxzZSB7CisJc3RhcnRfcGcgPSBQQ05FVF9TVEFSVF9QRzsKKwlzdG9wX3BnID0gUENORVRfU1RPUF9QRzsKKwljbV9vZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIGhhc19zaG1lbSBpcyBpZ25vcmVkIGlmIHVzZV9zaG1lbSAhPSAtMSAqLworICAgIGlmICgodXNlX3NobWVtID09IDApIHx8ICghaGFzX3NobWVtICYmICh1c2Vfc2htZW0gPT0gLTEpKSB8fAorCShzZXR1cF9zaG1lbV93aW5kb3cobGluaywgc3RhcnRfcGcsIHN0b3BfcGcsIGNtX29mZnNldCkgIT0gMCkpCisJc2V0dXBfZG1hX2NvbmZpZyhsaW5rLCBzdGFydF9wZywgc3RvcF9wZyk7CisKKyAgICBlaV9zdGF0dXMubmFtZSA9ICJORTIwMDAiOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSAxOworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJnBjbmV0X3Jlc2V0XzgzOTA7CisKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKworICAgIGlmIChpbmZvLT5mbGFncyAmIChJU19ETDEwMDE5fElTX0RMMTAwMjIpKSB7CisJdV9jaGFyIGlkID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgxYSk7CisJZGV2LT5kb19pb2N0bCA9ICZlaV9pb2N0bDsKKwltaWlfcGh5X3Byb2JlKGRldik7CisJaWYgKChpZCA9PSAweDMwKSAmJiAhaW5mby0+cG5hX3BoeSAmJiAoaW5mby0+ZXRoX3BoeSA9PSA0KSkKKwkgICAgaW5mby0+ZXRoX3BoeSA9IDA7CisgICAgfQorCisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJwY25ldF9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShpbmZvLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgKElTX0RMMTAwMTl8SVNfREwxMDAyMikpIHsKKwl1X2NoYXIgaWQgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAweDFhKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogTkUyMDAwIChETDEwMCVkIHJldiAlMDJ4KTogIiwKKwkgICAgICAgZGV2LT5uYW1lLCAoKGluZm8tPmZsYWdzICYgSVNfREwxMDAyMikgPyAyMiA6IDE5KSwgaWQpOworCWlmIChpbmZvLT5wbmFfcGh5KQorCSAgICBwcmludGsoIlBOQSwgIik7CisgICAgfSBlbHNlIHsKKwlwcmludGsoS0VSTl9JTkZPICIlczogTkUyMDAwIENvbXBhdGlibGU6ICIsIGRldi0+bmFtZSk7CisgICAgfQorICAgIHByaW50aygiaW8gJSMzbHgsIGlycSAlZCwiLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIGlmIChpbmZvLT5mbGFncyAmIFVTRV9TSE1FTSkKKwlwcmludGsgKCIgbWVtICUjNWx4LCIsIGRldi0+bWVtX3N0YXJ0KTsKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBIQVNfTUlTQ19SRUcpCisJcHJpbnRrKCIgJXMgeGN2ciwiLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKyAgICBwcmludGsoIiBod19hZGRyICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgcGNuZXRfcmVsZWFzZShsaW5rKTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHJldHVybjsKK30gLyogcGNuZXRfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHBjbmV0X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcGNuZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihsaW5rLT5wcml2KTsKKworICAgIERFQlVHKDAsICJwY25ldF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIGlmIChpbmZvLT5mbGFncyAmIFVTRV9TSE1FTSkgeworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgfQorICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgcGNuZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIERFQlVHKDIsICJwY25ldF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXBjbmV0X2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCXBjbmV0X3Jlc2V0XzgzOTAoZGV2KTsKKwkJTlM4MzkwX2luaXQoZGV2LCAxKTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogcGNuZXRfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNSUkgaW50ZXJmYWNlIHN1cHBvcnQgZm9yIERMMTAwMTkgYW5kIERMMTAwMjIgYmFzZWQgY2FyZHMKKworICAgIE9uIHRoZSBETDEwMDE5LCB0aGUgTUlJIElPIGRpcmVjdGlvbiBiaXQgaXMgMHgxMDsgb24gdGhlIERMMTAwMjIKKyAgICBpdCBpcyAweDIwLiAgU2V0dGluZyBib3RoIGJpdHMgc2VlbXMgdG8gd29yayBvbiBib3RoIGNhcmQgdHlwZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIERMSU5LX0dQSU8JCTB4MWMKKyNkZWZpbmUgRExJTktfRElBRwkJMHgxZAorI2RlZmluZSBETElOS19FRVBST00JCTB4MWUKKworI2RlZmluZSBNRElPX1NISUZUX0NMSwkJMHg4MAorI2RlZmluZSBNRElPX0RBVEFfT1VUCQkweDQwCisjZGVmaW5lIE1ESU9fRElSX1dSSVRFCQkweDMwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJKE1ESU9fRElSX1dSSVRFKQorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxCShNRElPX0RJUl9XUklURSB8IE1ESU9fREFUQV9PVVQpCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDEwCisjZGVmaW5lIE1ESU9fTUFTSwkJMHgwZgorCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMoa2lvX2FkZHJfdCBhZGRyKQoreworICAgIGludCBiaXRzLCBtYXNrID0gaW5iKGFkZHIpICYgTURJT19NQVNLOworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAzMjsgYml0cysrKSB7CisJb3V0YihtYXNrIHwgTURJT19EQVRBX1dSSVRFMSwgYWRkcik7CisJb3V0YihtYXNrIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYykKK3sKKyAgICB1X2ludCBjbWQgPSAoMHgwNjw8MTApfChwaHlfaWQ8PDUpfGxvYzsKKyAgICBpbnQgaSwgcmV0dmFsID0gMCwgbWFzayA9IGluYihhZGRyKSAmIE1ESU9fTUFTSzsKKworICAgIG1kaW9fc3luYyhhZGRyKTsKKyAgICBmb3IgKGkgPSAxMzsgaSA+PSAwOyBpLS0pIHsKKwlpbnQgZGF0ID0gKGNtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJb3V0YihtYXNrIHwgZGF0LCBhZGRyKTsKKwlvdXRiKG1hc2sgfCBkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJb3V0YihtYXNrLCBhZGRyKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgIT0gMCk7CisJb3V0YihtYXNrIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICByZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsdWUpCit7CisgICAgdV9pbnQgY21kID0gKDB4MDU8PDI4KXwocGh5X2lkPDwyMyl8KGxvYzw8MTgpfCgxPDwxNyl8dmFsdWU7CisgICAgaW50IGksIG1hc2sgPSBpbmIoYWRkcikgJiBNRElPX01BU0s7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIobWFzayB8IGRhdCwgYWRkcik7CisJb3V0YihtYXNrIHwgZGF0IHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpID49IDA7IGktLSkgeworCW91dGIobWFzaywgYWRkcik7CisJb3V0YihtYXNrIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWRpb19yZXNldChraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQpCit7CisgICAgb3V0Yl9wKDB4MDgsIGFkZHIpOworICAgIG91dGJfcCgweDBjLCBhZGRyKTsKKyAgICBvdXRiX3AoMHgwOCwgYWRkcik7CisgICAgb3V0Yl9wKDB4MGMsIGFkZHIpOworICAgIG91dGJfcCgweDAwLCBhZGRyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBFRVBST00gYWNjZXNzIHJvdXRpbmVzIGZvciBETDEwMDE5IGFuZCBETDEwMDIyIGJhc2VkIGNhcmRzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIEVFX0VFUAkJMHg0MAorI2RlZmluZSBFRV9BU0lDCQkweDEwCisjZGVmaW5lIEVFX0NTCQkweDA4CisjZGVmaW5lIEVFX0NLCQkweDA0CisjZGVmaW5lIEVFX0RPCQkweDAyCisjZGVmaW5lIEVFX0RJCQkweDAxCisjZGVmaW5lIEVFX0FET1QJCTB4MDEJLyogRGF0YU91dCBmb3IgQVNJQyAqLworI2RlZmluZSBFRV9SRUFEX0NNRAkweDA2CisKKyNkZWZpbmUgREwxOUZEVVBMWAkweDA0MDAJLyogREwxMDAxOSBGdWxsIGR1cGxleCBtb2RlICovCisKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20oa2lvX2FkZHJfdCBpb2FkZHIsIGludCBsb2NhdGlvbikKK3sKKyAgICBpbnQgaSwgcmV0dmFsID0gMDsKKyAgICBraW9fYWRkcl90IGVlX2FkZHIgPSBpb2FkZHIgKyBETElOS19FRVBST007CisgICAgaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCAoRUVfUkVBRF9DTUQgPDwgOCk7CisKKyAgICBvdXRiKDAsIGVlX2FkZHIpOworICAgIG91dGIoRUVfRUVQfEVFX0NTLCBlZV9hZGRyKTsKKworICAgIC8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RPIDogMDsKKwlvdXRiX3AoRUVfRUVQfEVFX0NTfGRhdGF2YWwsIGVlX2FkZHIpOworCW91dGJfcChFRV9FRVB8RUVfQ1N8ZGF0YXZhbHxFRV9DSywgZWVfYWRkcik7CisgICAgfQorICAgIG91dGIoRUVfRUVQfEVFX0NTLCBlZV9hZGRyKTsKKworICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJb3V0Yl9wKEVFX0VFUHxFRV9DUyB8IEVFX0NLLCBlZV9hZGRyKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoZWVfYWRkcikgJiBFRV9ESSkgPyAxIDogMCk7CisJb3V0Yl9wKEVFX0VFUHxFRV9DUywgZWVfYWRkcik7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICAgIG91dGIoMCwgZWVfYWRkcik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAgICBUaGUgaW50ZXJuYWwgQVNJQyByZWdpc3RlcnMgY2FuIGJlIGNoYW5nZWQgYnkgRUVQUk9NIFJFQUQgYWNjZXNzCisgICAgd2l0aCBFRV9BU0lDIGJpdCBzZXQuCisgICAgSW4gQVNJQyBtb2RlLCBFRV9BRE9UIGlzIHVzZWQgdG8gb3V0cHV0IHRoZSBkYXRhIHRvIHRoZSBBU0lDLgorKi8KKworc3RhdGljIHZvaWQgd3JpdGVfYXNpYyhraW9fYWRkcl90IGlvYWRkciwgaW50IGxvY2F0aW9uLCBzaG9ydCBhc2ljX2RhdGEpCit7CisJaW50IGk7CisJa2lvX2FkZHJfdCBlZV9hZGRyID0gaW9hZGRyICsgRExJTktfRUVQUk9NOworCXNob3J0IGRhdGF2YWw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCAoRUVfUkVBRF9DTUQgPDwgOCk7CisKKwlhc2ljX2RhdGEgfD0gcmVhZF9lZXByb20oaW9hZGRyLCBsb2NhdGlvbik7CisKKwlvdXRiKDAsIGVlX2FkZHIpOworCW91dGIoRUVfQVNJQ3xFRV9DU3xFRV9ESSwgZWVfYWRkcik7CisKKwlyZWFkX2NtZCA9IHJlYWRfY21kID4+IDE7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDk7IGkgPj0gMDsgaS0tKSB7CisJCWRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9ETyA6IDA7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfEVFX0RJfGRhdGF2YWwsIGVlX2FkZHIpOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xFRV9ESXxkYXRhdmFsfEVFX0NLLCBlZV9hZGRyKTsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8RUVfREl8ZGF0YXZhbCwgZWVfYWRkcik7CisJfQorCS8vIHN5bmMKKwlvdXRiKEVFX0FTSUN8RUVfQ1MsIGVlX2FkZHIpOworCW91dGIoRUVfQVNJQ3xFRV9DU3xFRV9DSywgZWVfYWRkcik7CisJb3V0YihFRV9BU0lDfEVFX0NTLCBlZV9hZGRyKTsKKworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlkYXRhdmFsID0gKGFzaWNfZGF0YSAmICgxIDw8IGkpKSA/IEVFX0FET1QgOiAwOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xkYXRhdmFsLCBlZV9hZGRyKTsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8ZGF0YXZhbHxFRV9DSywgZWVfYWRkcik7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfGRhdGF2YWwsIGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgQVNJQyBhY2Nlc3MuICovCisJb3V0YihFRV9BU0lDfEVFX0RJLCBlZV9hZGRyKTsKKwlvdXRiKEVFX0FTSUN8RUVfREl8IEVFX0NLLCBlZV9hZGRyKTsKKwlvdXRiKEVFX0FTSUN8RUVfREksIGVlX2FkZHIpOworCisJb3V0YigwLCBlZV9hZGRyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNldF9taXNjX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB1X2NoYXIgdG1wOworICAgIAorICAgIGlmIChpbmZvLT5mbGFncyAmIEhBU19NSVNDX1JFRykgeworCXRtcCA9IGluYl9wKG5pY19iYXNlICsgUENORVRfTUlTQykgJiB+MzsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDIpCisJICAgIHRtcCB8PSAxOworCWlmIChpbmZvLT5mbGFncyAmIFVTRV9CSUdfQlVGKQorCSAgICB0bXAgfD0gMjsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBIQVNfSUJNX01JU0MpCisJICAgIHRtcCB8PSA4OworCW91dGJfcCh0bXAsIG5pY19iYXNlICsgUENORVRfTUlTQyk7CisgICAgfQorICAgIGlmIChpbmZvLT5mbGFncyAmIElTX0RMMTAwMjIpIHsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBIQVNfTUlJKSB7CisJICAgIG1kaW9fcmVzZXQobmljX2Jhc2UgKyBETElOS19HUElPLCBpbmZvLT5ldGhfcGh5KTsKKwkgICAgLyogUmVzdGFydCBNSUkgYXV0b25lZ290aWF0aW9uICovCisJICAgIG1kaW9fd3JpdGUobmljX2Jhc2UgKyBETElOS19HUElPLCBpbmZvLT5ldGhfcGh5LCAwLCAweDAwMDApOworCSAgICBtZGlvX3dyaXRlKG5pY19iYXNlICsgRExJTktfR1BJTywgaW5mby0+ZXRoX3BoeSwgMCwgMHgxMjAwKTsKKwkgICAgaW5mby0+bWlpX3Jlc2V0ID0gamlmZmllczsKKwl9IGVsc2UgeworCSAgICBvdXRiKGZ1bGxfZHVwbGV4ID8gNCA6IDAsIG5pY19iYXNlICsgRExJTktfRElBRyk7CisJfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG1paV9waHlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBraW9fYWRkcl90IG1paV9hZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBETElOS19HUElPOworICAgIGludCBpOworICAgIHVfaW50IHRtcCwgcGh5aWQ7CisKKyAgICBmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwl0bXAgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGksIDEpOworCWlmICgodG1wID09IDApIHx8ICh0bXAgPT0gMHhmZmZmKSkKKwkgICAgY29udGludWU7CisJdG1wID0gbWRpb19yZWFkKG1paV9hZGRyLCBpLCBNSUlfUEhZSURfUkVHMSk7CisJcGh5aWQgPSB0bXAgPDwgMTY7CisJcGh5aWQgfD0gbWRpb19yZWFkKG1paV9hZGRyLCBpLCBNSUlfUEhZSURfUkVHMik7CisJcGh5aWQgJj0gTUlJX1BIWUlEX1JFVl9NQVNLOworCURFQlVHKDAsICIlczogTUlJIGF0ICVkIGlzIDB4JTA4eFxuIiwgZGV2LT5uYW1lLCBpLCBwaHlpZCk7CisJaWYgKHBoeWlkID09IEFNNzlDOVhYX0hPTUVfUEhZKSB7CisJICAgIGluZm8tPnBuYV9waHkgPSBpOworCX0gZWxzZSBpZiAocGh5aWQgIT0gQU03OUM5WFhfRVRIX1BIWSkgeworCSAgICBpbmZvLT5ldGhfcGh5ID0gaTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50IHBjbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmluZm8tPmxpbms7CisgICAgCisgICAgREVCVUcoMiwgInBjbmV0X29wZW4oJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4rKzsKKworICAgIHNldF9taXNjX3JlZyhkZXYpOworICAgIHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pcnFfd3JhcHBlciwgU0FfU0hJUlEsIGRldl9pbmZvLCBkZXYpOworCisgICAgaW5mby0+cGh5X2lkID0gaW5mby0+ZXRoX3BoeTsKKyAgICBpbmZvLT5saW5rX3N0YXR1cyA9IDB4MDA7CisgICAgaW5pdF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworICAgIGluZm8tPndhdGNoZG9nLmZ1bmN0aW9uID0gJmVpX3dhdGNoZG9nOworICAgIGluZm8tPndhdGNoZG9nLmRhdGEgPSAodV9sb25nKWRldjsKKyAgICBpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworCisgICAgcmV0dXJuIGVpX29wZW4oZGV2KTsKK30gLyogcGNuZXRfb3BlbiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBwY25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmaW5mby0+bGluazsKKworICAgIERFQlVHKDIsICJwY25ldF9jbG9zZSgnJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGVpX2Nsb3NlKGRldik7CisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgCisgICAgbGluay0+b3Blbi0tOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBkZWxfdGltZXJfc3luYygmaW5mby0+d2F0Y2hkb2cpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIHBjbmV0X2Nsb3NlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgSGFyZCByZXNldCB0aGUgY2FyZC4gIFRoaXMgdXNlZCB0byBwYXVzZSBmb3IgdGhlIHNhbWUgcGVyaW9kIHRoYXQKKyAgICBhIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBjbmV0X3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisKKyAgICBlaV9zdGF0dXMudHhpbmcgPSBlaV9zdGF0dXMuZG1haW5nID0gMDsKKworICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBuaWNfYmFzZSArIEU4MzkwX0NNRCk7CisKKyAgICBvdXRiKGluYihuaWNfYmFzZSArIFBDTkVUX1JFU0VUKSwgbmljX2Jhc2UgKyBQQ05FVF9SRVNFVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwlpZiAoKGluYl9wKG5pY19iYXNlK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpICE9IDApCisJICAgIGJyZWFrOworCXVkZWxheSgxMDApOworICAgIH0KKyAgICBvdXRiX3AoRU5JU1JfUkVTRVQsIG5pY19iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLworICAgIAorICAgIGlmIChpID09IDEwMCkKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBwY25ldF9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisgICAgc2V0X21pc2NfcmVnKGRldik7CisgICAgCit9IC8qIHBjbmV0X3Jlc2V0XzgzOTAgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBpZiAoKG1hcC0+cG9ydCAhPSAodV9jaGFyKSgtMSkpICYmIChtYXAtPnBvcnQgIT0gZGV2LT5pZl9wb3J0KSkgeworCWlmICghKGluZm8tPmZsYWdzICYgSEFTX01JU0NfUkVHKSkKKwkgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWVsc2UgaWYgKChtYXAtPnBvcnQgPCAxKSB8fCAobWFwLT5wb3J0ID4gMikpCisJICAgIHJldHVybiAtRUlOVkFMOworCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoZWQgdG8gJXMgcG9ydFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKwlOUzgzOTBfaW5pdChkZXYsIDEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlaV9pcnFfd3JhcHBlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgaXJxcmV0dXJuX3QgcmV0ID0gZWlfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKworICAgIGlmIChyZXQgPT0gSVJRX0hBTkRMRUQpCisJICAgIGluZm8tPnN0YWxlID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlaV93YXRjaGRvZyh1X2xvbmcgYXJnKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGtpb19hZGRyX3QgbWlpX2FkZHIgPSBuaWNfYmFzZSArIERMSU5LX0dQSU87CisgICAgdV9zaG9ydCBsaW5rOworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSBnb3RvIHJlc2NoZWR1bGU7CisKKyAgICAvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgd2l0aCBleHBpcmVkIGxhdGVuY3kgdGltZXI6IHdpdGgKKyAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgbmljX2Jhc2UgKyBFODM5MF9DTUQpOworICAgIGlmIChpbmZvLT5zdGFsZSsrICYmIChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfQUxMKSkgeworCWlmICghaW5mby0+ZmFzdF9wb2xsKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0KHMpIGRyb3BwZWQhXG4iLCBkZXYtPm5hbWUpOworCWVpX2lycV93cmFwcGVyKGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWluZm8tPmZhc3RfcG9sbCA9IEhaOworICAgIH0KKyAgICBpZiAoaW5mby0+ZmFzdF9wb2xsKSB7CisJaW5mby0+ZmFzdF9wb2xsLS07CisJaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCWFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIShpbmZvLT5mbGFncyAmIEhBU19NSUkpKQorCWdvdG8gcmVzY2hlZHVsZTsKKworICAgIG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+cGh5X2lkLCAxKTsKKyAgICBsaW5rID0gbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDEpOworICAgIGlmICghbGluayB8fCAobGluayA9PSAweGZmZmYpKSB7CisJaWYgKGluZm8tPmV0aF9waHkpIHsKKwkgICAgaW5mby0+cGh5X2lkID0gaW5mby0+ZXRoX3BoeSA9IDA7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBpcyBtaXNzaW5nIVxuIiwgZGV2LT5uYW1lKTsKKwkgICAgaW5mby0+ZmxhZ3MgJj0gfkhBU19NSUk7CisJfQorCWdvdG8gcmVzY2hlZHVsZTsKKyAgICB9CisKKyAgICBsaW5rICY9IDB4MDAwNDsKKyAgICBpZiAobGluayAhPSBpbmZvLT5saW5rX3N0YXR1cykgeworCXVfc2hvcnQgcCA9IG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+cGh5X2lkLCA1KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIChsaW5rKSA/ICJmb3VuZCIgOiAibG9zdCIpOworCWlmIChsaW5rICYmIChpbmZvLT5mbGFncyAmIElTX0RMMTAwMjIpKSB7CisJICAgIC8qIERpc2FibGUgY29sbGlzaW9uIGRldGVjdGlvbiBvbiBmdWxsIGR1cGxleCBsaW5rcyAqLworCSAgICBvdXRiKChwICYgMHgwMTQwKSA/IDQgOiAwLCBuaWNfYmFzZSArIERMSU5LX0RJQUcpOworCX0gZWxzZSBpZiAobGluayAmJiAoaW5mby0+ZmxhZ3MgJiBJU19ETDEwMDE5KSkgeworCSAgICAvKiBEaXNhYmxlIGNvbGxpc2lvbiBkZXRlY3Rpb24gb24gZnVsbCBkdXBsZXggbGlua3MgKi8KKwkgICAgd3JpdGVfYXNpYyhkZXYtPmJhc2VfYWRkciwgNCwgKHAgJiAweDE0MCkgPyBETDE5RkRVUExYIDogMCk7CisJfQorCWlmIChsaW5rKSB7CisJICAgIGlmIChpbmZvLT5waHlfaWQgPT0gaW5mby0+ZXRoX3BoeSkgeworCQlpZiAocCkKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gY29tcGxldGU6ICIKKwkJCSAgICIlc2Jhc2VULSVjRCBzZWxlY3RlZFxuIiwgZGV2LT5uYW1lLAorCQkJICAgKChwICYgMHgwMTgwKSA/ICIxMDAiIDogIjEwIiksCisJCQkgICAoKHAgJiAweDAxNDApID8gJ0YnIDogJ0gnKSk7CisJCWVsc2UKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHBhcnRuZXIgZGlkIG5vdCAiCisJCQkgICAiYXV0b25lZ290aWF0ZVxuIiwgZGV2LT5uYW1lKTsKKwkgICAgfQorCSAgICBOUzgzOTBfaW5pdChkZXYsIDEpOworCX0KKwlpbmZvLT5saW5rX3N0YXR1cyA9IGxpbms7CisgICAgfQorICAgIGlmIChpbmZvLT5wbmFfcGh5ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgaW5mby0+bWlpX3Jlc2V0ICsgNipIWikpIHsKKwlsaW5rID0gbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5ldGhfcGh5LCAxKSAmIDB4MDAwNDsKKwlpZiAoKChpbmZvLT5waHlfaWQgPT0gaW5mby0+cG5hX3BoeSkgJiYgbGluaykgfHwKKwkgICAgKChpbmZvLT5waHlfaWQgIT0gaW5mby0+cG5hX3BoeSkgJiYgIWxpbmspKSB7CisJICAgIC8qIGlzb2xhdGUgdGhpcyBNSUkgYW5kIHRyeSBmbGlwcGluZyB0byB0aGUgb3RoZXIgb25lICovCisJICAgIG1kaW9fd3JpdGUobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgMCwgMHgwNDAwKTsKKwkgICAgaW5mby0+cGh5X2lkIF49IGluZm8tPnBuYV9waHkgXiBpbmZvLT5ldGhfcGh5OworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoZWQgdG8gJXMgdHJhbnNjZWl2ZXJcbiIsIGRldi0+bmFtZSwKKwkJICAgKGluZm8tPnBoeV9pZCA9PSBpbmZvLT5ldGhfcGh5KSA/ICJldGhlcm5ldCIgOiAiUE5BIik7CisJICAgIG1kaW9fd3JpdGUobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgMCwKKwkJICAgICAgIChpbmZvLT5waHlfaWQgPT0gaW5mby0+ZXRoX3BoeSkgPyAweDEwMDAgOiAwKTsKKwkgICAgaW5mby0+bGlua19zdGF0dXMgPSAwOworCSAgICBpbmZvLT5taWlfcmVzZXQgPSBqaWZmaWVzOworCX0KKyAgICB9CisKK3Jlc2NoZWR1bGU6CisgICAgaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgInBjbmV0X2NzIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgaW50IGVpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisgICAga2lvX2FkZHJfdCBtaWlfYWRkciA9IGRldi0+YmFzZV9hZGRyICsgRExJTktfR1BJTzsKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgU0lPQ0dNSUlQSFk6CisJZGF0YVswXSA9IGluZm8tPnBoeV9pZDsKKyAgICBjYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWRhdGFbM10gPSBtZGlvX3JlYWQobWlpX2FkZHIsIGRhdGFbMF0sIGRhdGFbMV0gJiAweDFmKTsKKwlyZXR1cm4gMDsKKyAgICBjYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJICAgIHJldHVybiAtRVBFUk07CisJbWRpb193cml0ZShtaWlfYWRkciwgZGF0YVswXSwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0pOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBkbWFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkgICAgIGludCByaW5nX3BhZ2UpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gZG1hX2Jsb2NrX2lucHV0LiIKKwkgICAgICAgIltETUFzdGF0OiUxeF1baXJxbG9jazolMXhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIAorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICBvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgUENORVRfQ01EKTsKKyAgICBvdXRiX3Aoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKyAgICBvdXRiX3AoMCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKyAgICBvdXRiX3AoMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKyAgICBvdXRiX3AocmluZ19wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBQQ05FVF9DTUQpOworCisgICAgaW5zdyhuaWNfYmFzZSArIFBDTkVUX0RBVEFQT1JULCBoZHIsCisJICAgIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworICAgIC8qIEZpeCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCisgICAgaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworCisgICAgb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRtYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgeGZlcl9jb3VudCA9IGNvdW50OworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmICgoZWlfZGVidWcgPiA0KSAmJiAoY291bnQgIT0gNCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBbYmk9JWRdXG4iLCBkZXYtPm5hbWUsIGNvdW50KzQpOworI2VuZGlmCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gZG1hX2Jsb2NrX2lucHV0LiIKKwkgICAgICAgIltETUFzdGF0OiUxeF1baXJxbG9jazolMXhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICBvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgUENORVRfQ01EKTsKKyAgICBvdXRiX3AoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworICAgIG91dGJfcChjb3VudCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworICAgIG91dGJfcChyaW5nX29mZnNldCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisgICAgb3V0Yl9wKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIFBDTkVUX0NNRCk7CisKKyAgICBpbnN3KG5pY19iYXNlICsgUENORVRfREFUQVBPUlQsYnVmLGNvdW50Pj4xKTsKKyAgICBpZiAoY291bnQgJiAweDAxKQorCWJ1Zltjb3VudC0xXSA9IGluYihuaWNfYmFzZSArIFBDTkVUX0RBVEFQT1JUKSwgeGZlcl9jb3VudCsrOworCisgICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKyAgICAgICBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgdGhhdCBpdCBpcyBzdGlsbCBoZXJlLiAqLworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChlaV9kZWJ1ZyA+IDQpIHsJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJaW50IGFkZHIsIHRyaWVzID0gMjA7CisJZG8geworCSAgICAvKiBET04nVCBjaGVjayBmb3IgJ2luYl9wKEVOMF9JU1IpICYgRU5JU1JfUkRDJyBoZXJlCisJICAgICAgIC0tIGl0J3MgYnJva2VuIGZvciBSeCBvbiBzb21lIGNhcmRzISAqLworCSAgICBpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJICAgIGludCBsb3cgPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCSAgICBhZGRyID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJICAgIGlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSAoYWRkciAmIDB4ZmYpKQorCQlicmVhazsKKwl9IHdoaWxlICgtLXRyaWVzID4gMCk7CisJaWYgKHRyaWVzIDw9IDApCisJICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkgICAiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCSAgIGRldi0+bmFtZSwgcmluZ19vZmZzZXQgKyB4ZmVyX2NvdW50LCBhZGRyKTsKKyAgICB9CisjZW5kaWYKKyAgICBvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfSAvKiBkbWFfYmxvY2tfaW5wdXQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRtYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGludCByZXRyaWVzID0gMDsKKyNlbmRpZgorICAgIHVfbG9uZyBkbWFfc3RhcnQ7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAoZWlfZGVidWcgPiA0KQorCXByaW50ayhLRVJOX0RFQlVHICIlczogW2JvPSVkXVxuIiwgZGV2LT5uYW1lLCBjb3VudCk7CisjZW5kaWYKKworICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisgICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwljb3VudCsrOworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGRtYV9ibG9ja19vdXRwdXQuIgorCSAgICAgICAiW0RNQXN0YXQ6JTF4XVtpcnFsb2NrOiUxeF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIC8qIFdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHBhZ2UgMCwgYnV0IHRvIGJlIHNhZmUuLi4gKi8KKyAgICBvdXRiX3AoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlK1BDTkVUX0NNRCk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgcmV0cnk6CisjZW5kaWYKKworICAgIG91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CisKKyAgICAvKiBOb3cgdGhlIG5vcm1hbCBvdXRwdXQuICovCisgICAgb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKyAgICBvdXRiX3AoY291bnQgPj4gOCwgICBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworICAgIG91dGJfcCgweDAwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworICAgIG91dGJfcChzdGFydF9wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCisgICAgb3V0Yl9wKEU4MzkwX1JXUklURStFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBQQ05FVF9DTUQpOworICAgIG91dHN3KG5pY19iYXNlICsgUENORVRfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCisgICAgZG1hX3N0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIC8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisgICAgICAgZW5jb3VudGVyaW5nIHByb2JsZW1zIHRoYXQgaXQgaXMgc3RpbGwgaGVyZS4gKi8KKyAgICBpZiAoZWlfZGVidWcgPiA0KSB7CS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJaW50IGFkZHIsIHRyaWVzID0gMjA7CisJZG8geworCSAgICBpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJICAgIGludCBsb3cgPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCSAgICBhZGRyID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJICAgIGlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCWJyZWFrOworCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwlpZiAodHJpZXMgPD0gMCkgeworCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBUeCBwYWNrZXQgdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCisJCSAgICIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJICAgZGV2LT5uYW1lLCAoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50LCBhZGRyKTsKKwkgICAgaWYgKHJldHJpZXMrKyA9PSAwKQorCQlnb3RvIHJldHJ5OworCX0KKyAgICB9CisjZW5kaWYKKworICAgIHdoaWxlICgoaW5iX3AobmljX2Jhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkbWFfc3RhcnQgKyBQQ05FVF9SRENfVElNRU9VVCkpIHsKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLAorCQkgICBkZXYtPm5hbWUpOworCSAgICBwY25ldF9yZXNldF84MzkwKGRldik7CisJICAgIE5TODM5MF9pbml0KGRldiwgMSk7CisJICAgIGJyZWFrOworCX0KKworICAgIG91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGlmIChpbmZvLT5mbGFncyAmIERFTEFZX09VVFBVVCkKKwl1ZGVsYXkoKGxvbmcpZGVsYXlfdGltZSk7CisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc2V0dXBfZG1hX2NvbmZpZyhkZXZfbGlua190ICpsaW5rLCBpbnQgc3RhcnRfcGcsCisJCQkgICAgaW50IHN0b3BfcGcpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BnOworICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGcgKyBUWF9QQUdFUzsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wZzsKKworICAgIC8qIHNldCB1cCBibG9jayBpL28gZnVuY3Rpb25zICovCisgICAgZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZkbWFfZ2V0XzgzOTBfaGRyOworICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZkbWFfYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZkbWFfYmxvY2tfb3V0cHV0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBjb3B5aW4odm9pZCAqZGVzdCwgdm9pZCBfX2lvbWVtICpzcmMsIGludCBjKQoreworICAgIHVfc2hvcnQgKmQgPSBkZXN0OworICAgIHVfc2hvcnQgX19pb21lbSAqcyA9IHNyYzsKKyAgICBpbnQgb2RkOworCisgICAgaWYgKGMgPD0gMCkKKwlyZXR1cm47CisgICAgb2RkID0gKGMgJiAxKTsgYyA+Pj0gMTsKKworICAgIGlmIChjKSB7CisJZG8geyAqZCsrID0gX19yYXdfcmVhZHcocysrKTsgfSB3aGlsZSAoLS1jKTsKKyAgICB9CisgICAgLyogZ2V0IGxhc3QgYnl0ZSBieSBmZXRjaGluZyBhIHdvcmQgYW5kIG1hc2tpbmcgKi8KKyAgICBpZiAob2RkKQorCSooKHVfY2hhciAqKWQpID0gcmVhZHcocykgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBjb3B5b3V0KHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgYykKK3sKKyAgICB1X3Nob3J0IF9faW9tZW0gKmQgPSBkZXN0OworICAgIGNvbnN0IHVfc2hvcnQgKnMgPSBzcmM7CisgICAgaW50IG9kZDsKKworICAgIGlmIChjIDw9IDApCisJcmV0dXJuOworICAgIG9kZCA9IChjICYgMSk7IGMgPj49IDE7CisKKyAgICBpZiAoYykgeworCWRvIHsgX19yYXdfd3JpdGV3KCpzKyssIGQrKyk7IH0gd2hpbGUgKC0tYyk7CisgICAgfQorICAgIC8qIGNvcHkgbGFzdCBieXRlIGRvaW5nIGEgcmVhZC1tb2RpZnktd3JpdGUgKi8KKyAgICBpZiAob2RkKQorCXdyaXRldygocmVhZHcoZCkgJiAweGZmMDApIHwgKih1X2NoYXIgKilzLCBkKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNobWVtX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkgICAgICAgaW50IHJpbmdfcGFnZSkKK3sKKyAgICB2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKFRYX1BBR0VTPDw4KQorCQkJCSsgKHJpbmdfcGFnZSA8PCA4KQorCQkJCS0gKGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlIDw8IDgpOworICAgIAorICAgIGNvcHlpbihoZHIsIHhmZXJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworICAgIC8qIEZpeCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCisgICAgaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2htZW1fYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIHZvaWQgX19pb21lbSAqeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoVFhfUEFHRVM8PDgpCisJCQkJKyByaW5nX29mZnNldAorCQkJCS0gKGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlIDw8IDgpOworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKyAgICAKKyAgICBpZiAoeGZlcl9zdGFydCArIGNvdW50ID4gKHZvaWQgX19pb21lbSAqKWVpX3N0YXR1cy5ybWVtX2VuZCkgeworCS8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwlpbnQgc2VtaV9jb3VudCA9ICh2b2lkIF9faW9tZW0gKillaV9zdGF0dXMucm1lbV9lbmQgLSB4ZmVyX3N0YXJ0OworCWNvcHlpbihidWYsIHhmZXJfc3RhcnQsIHNlbWlfY291bnQpOworCWJ1ZiArPSBzZW1pX2NvdW50OworCXhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKFRYX1BBR0VTPDw4KTsKKwljb3VudCAtPSBzZW1pX2NvdW50OworICAgIH0KKyAgICBjb3B5aW4oYnVmLCB4ZmVyX3N0YXJ0LCBjb3VudCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzaG1lbV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgIGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKyAgICB2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArIChzdGFydF9wYWdlIDw8IDgpOworICAgIHNobWVtIC09IGVpX3N0YXR1cy50eF9zdGFydF9wYWdlIDw8IDg7CisgICAgY29weW91dChzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHNldHVwX3NobWVtX3dpbmRvdyhkZXZfbGlua190ICpsaW5rLCBpbnQgc3RhcnRfcGcsCisJCQkgICAgICBpbnQgc3RvcF9wZywgaW50IGNtX29mZnNldCkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICBpbnQgaSwgd2luZG93X3NpemUsIG9mZnNldCwgbGFzdF9yZXQsIGxhc3RfZm47CisKKyAgICB3aW5kb3dfc2l6ZSA9IChzdG9wX3BnIC0gc3RhcnRfcGcpIDw8IDg7CisgICAgaWYgKHdpbmRvd19zaXplID4gMzIgKiAxMDI0KQorCXdpbmRvd19zaXplID0gMzIgKiAxMDI0OworCisgICAgLyogTWFrZSBzdXJlIGl0J3MgYSBwb3dlciBvZiB0d28uICAqLworICAgIHdoaWxlICgod2luZG93X3NpemUgJiAod2luZG93X3NpemUgLSAxKSkgIT0gMCkKKwl3aW5kb3dfc2l6ZSArPSB3aW5kb3dfc2l6ZSAmIH4od2luZG93X3NpemUgLSAxKTsKKworICAgIC8qIEFsbG9jYXRlIGEgbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNfFdJTl9FTkFCTEU7CisgICAgcmVxLkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSB3aW5kb3dfc2l6ZTsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSBtZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pKTsKKworICAgIG1lbS5DYXJkT2Zmc2V0ID0gKHN0YXJ0X3BnIDw8IDgpICsgY21fb2Zmc2V0OworICAgIG9mZnNldCA9IG1lbS5DYXJkT2Zmc2V0ICUgd2luZG93X3NpemU7CisgICAgbWVtLkNhcmRPZmZzZXQgLT0gb2Zmc2V0OworICAgIG1lbS5QYWdlID0gMDsKKyAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpOworCisgICAgLyogVHJ5IHNjcmliYmxpbmcgb24gdGhlIGJ1ZmZlciAqLworICAgIGluZm8tPmJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCB3aW5kb3dfc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IChUWF9QQUdFUzw8OCk7IGkgKz0gMikKKwlfX3Jhd193cml0ZXcoKGk+PjEpLCBpbmZvLT5iYXNlK29mZnNldCtpKTsKKyAgICB1ZGVsYXkoMTAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFRYX1BBR0VTPDw4KTsgaSArPSAyKQorCWlmIChfX3Jhd19yZWFkdyhpbmZvLT5iYXNlK29mZnNldCtpKSAhPSAoaT4+MSkpIGJyZWFrOworICAgIHBjbmV0X3Jlc2V0XzgzOTAoZGV2KTsKKyAgICBpZiAoaSAhPSAoVFhfUEFHRVM8PDgpKSB7CisJaW91bm1hcChpbmZvLT5iYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKwlpbmZvLT5iYXNlID0gTlVMTDsgbGluay0+d2luID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgCisgICAgZWlfc3RhdHVzLm1lbSA9IGluZm8tPmJhc2UgKyBvZmZzZXQ7CisgICAgZGV2LT5tZW1fc3RhcnQgPSAodV9sb25nKWVpX3N0YXR1cy5tZW07CisgICAgZGV2LT5tZW1fZW5kID0gZWlfc3RhdHVzLnJtZW1fZW5kID0gKHVfbG9uZylpbmZvLT5iYXNlICsgcmVxLlNpemU7CisKKyAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BnOworICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGcgKyBUWF9QQUdFUzsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RhcnRfcGcgKyAoKHJlcS5TaXplIC0gb2Zmc2V0KSA+PiA4KTsKKworICAgIC8qIHNldCB1cCBibG9jayBpL28gZnVuY3Rpb25zICovCisgICAgZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZzaG1lbV9nZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnNobWVtX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmc2htZW1fYmxvY2tfb3V0cHV0OworCisgICAgaW5mby0+ZmxhZ3MgfD0gVVNFX1NITUVNOworICAgIHJldHVybiAwOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcGNuZXRfZHJpdmVyID0geworCS5kcnYJCT0geworCQkubmFtZQk9ICJwY25ldF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHBjbmV0X2F0dGFjaCwKKwkuZGV0YWNoCQk9IHBjbmV0X2RldGFjaCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjbmV0X2NzKHZvaWQpCit7CisgICAgcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnBjbmV0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3BjbmV0X2NzKHZvaWQpCit7CisgICAgREVCVUcoMCwgInBjbmV0X2NzOiB1bmxvYWRpbmdcbiIpOworICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcGNuZXRfZHJpdmVyKTsKKyAgICBCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcGNuZXRfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9wY25ldF9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTE1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpAQCAtMCwwICsxLDIyNjAgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciBTTUM5MWM5Mi1iYXNlZCBjYXJkcy4KKworICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1lZ2FoZXJ0eiBQQ01DSUEgZXRoZXJuZXQgY2FyZHM7IGFuZAorICAgIE1lZ2FoZXJ0eiwgTW90b3JvbGEsIE9zaXRlY2gsIGFuZCBQc2lvbiBEYWNvbSBldGhlcm5ldC9tb2RlbQorICAgIG11bHRpZnVuY3Rpb24gY2FyZHMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMgLS0gZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworICAgIHNtYzkxYzkyX2NzLmMgMS4xMjIgMjAwMi8xMC8yNSAwNjoyNjozOQorCisgICAgVGhpcyBkcml2ZXIgY29udGFpbnMgY29kZSB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIKKyAgICAoYmVja2VyQHNjeWxkLmNvbSksIFJvd2FuIEh1Z2hlcyAoeC1jc3JkaEBqY3UuZWR1LmF1KSwKKyAgICBEYXZpZCBIaW5kcyAoZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLCBhbmQgRXJpayBTdGFobG1hbgorICAgIChlcmlrQHZ0LmVkdSkuICBEb25hbGQgd3JvdGUgdGhlIFNNQyA5MWM5MiBjb2RlIHVzaW5nIHBhcnRzIG9mCisgICAgRXJpaydzIFNNQyA5MWM5NCBkcml2ZXIuICBSb3dhbiB3cm90ZSBhIHNpbWlsYXIgZHJpdmVyLCBhbmQgSSd2ZQorICAgIGluY29ycG9yYXRlZCBzb21lIHBhcnRzIG9mIGhpcyBkcml2ZXIgaGVyZS4gIEkgKERhdmUpIHdyb3RlIG1vc3QKKyAgICBvZiB0aGUgUENNQ0lBIGdsdWUgY29kZSwgYW5kIHRoZSBPc2l0ZWNoIHN1cHBvcnQgY29kZS4gIEtlbGx5CisgICAgU3RlcGhlbnMgKGtzdGVwaGVuQGhvbGxpLmNvbSkgYWRkZWQgc3VwcG9ydCBmb3IgdGhlIE1vdG9yb2xhCisgICAgTWFyaW5lciwgd2l0aCBoZWxwIGZyb20gQWxsZW4gQnJvc3QuCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogT3NpdGVjaCBTZXZlbiBvZiBEaWFtb25kcyBmaXJtd2FyZSAqLworI2luY2x1ZGUgIm9zaXRlY2guaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBjaGFyICppZl9uYW1lc1tdID0geyAiYXV0byIsICIxMGJhc2VUIiwgIjEwYmFzZTIifTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUMgOTFjOTIgc2VyaWVzIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworLyoKKyAgVHJhbnNjZWl2ZXIvbWVkaWEgdHlwZS4KKyAgIDAgPSBhdXRvCisgICAxID0gMTBiYXNlVCAoYW5kIGF1dG9zZWxlY3QgaWYgI2RlZmluZSBBVVRPU0VMRUNUKSwKKyAgIDIgPSBBVUkvMTBiYXNlMiwKKyovCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwgMCk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0KKyJzbWM5MWM5Ml9jcy5jIDAuMDkgMTk5Ni84LzQgRG9uYWxkIEJlY2tlciwgYmVja2VyQHNjeWxkLmNvbS5cbiI7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgRFJWX05BTUUJInNtYzkxYzkyX2NzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xMjIiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXIgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIFR4IGh1bmcgKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKCg0MDAqSFopLzEwMDApCisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCisjZGVmaW5lIElOVFJfV09SSwkJNAorCisvKiBUaW1lcyB0byBjaGVjayB0aGUgY2hlY2sgdGhlIGNoaXAgYmVmb3JlIGNvbmNsdWRpbmcgdGhhdCBpdCBkb2Vzbid0CisgICBjdXJyZW50bHkgaGF2ZSByb29tIGZvciBhbm90aGVyIFR4IHBhY2tldC4gKi8KKyNkZWZpbmUgTUVNT1JZX1dBSVRfVElNRSAgICAgICAJOAorCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJzbWM5MWM5Ml9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworc3RydWN0IHNtY19wcml2YXRlIHsKKyAgICBkZXZfbGlua190CQkJbGluazsKKyAgICBzcGlubG9ja190CQkJbG9jazsKKyAgICB1X3Nob3J0CQkJbWFuZmlkOworICAgIHVfc2hvcnQJCQljYXJkaWQ7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisgICAgZGV2X25vZGVfdAkJCW5vZGU7CisgICAgc3RydWN0IHNrX2J1ZmYJCSpzYXZlZF9za2I7CisgICAgaW50CQkJCXBhY2tldHNfd2FpdGluZzsKKyAgICB2b2lkCQkJX19pb21lbSAqYmFzZTsKKyAgICB1X3Nob3J0CQkJY2ZnOworICAgIHN0cnVjdCB0aW1lcl9saXN0CQltZWRpYTsKKyAgICBpbnQJCQkJd2F0Y2hkb2csIHR4X2VycjsKKyAgICB1X3Nob3J0CQkJbWVkaWFfc3RhdHVzOworICAgIHVfc2hvcnQJCQlmYXN0X3BvbGw7CisgICAgdV9zaG9ydAkJCWxpbmtfc3RhdHVzOworICAgIHN0cnVjdCBtaWlfaWZfaW5mbwkJbWlpX2lmOworICAgIGludAkJCQlkdXBsZXg7CisgICAgaW50CQkJCXJ4X292cm47Cit9OworCisvKiBTcGVjaWFsIGRlZmluaXRpb25zIGZvciBNZWdhaGVydHogbXVsdGlmdW5jdGlvbiBjYXJkcyAqLworI2RlZmluZSBNRUdBSEVSVFpfSVNSCQkweDAzODAKKworLyogU3BlY2lhbCBmdW5jdGlvbiByZWdpc3RlcnMgZm9yIE1vdG9yb2xhIE1hcmluZXIgKi8KKyNkZWZpbmUgTU9UX0xBTgkJCTB4MDAwMAorI2RlZmluZSBNT1RfVUFSVAkJMHgwMDIwCisjZGVmaW5lIE1PVF9FRVBST00JCTB4MjAKKworI2RlZmluZSBNT1RfTk9STUFMIFwKKyhDT1JfTEVWRUxfUkVRIHwgQ09SX0ZVTkNfRU5BIHwgQ09SX0FERFJfREVDT0RFIHwgQ09SX0lSRVFfRU5BKQorCisvKiBTcGVjaWFsIGZ1bmN0aW9uIHJlZ2lzdGVycyBmb3IgT3NpdGVjaCBjYXJkcyAqLworI2RlZmluZSBPU0lURUNIX0FVSV9DVEwJCTB4MGMKKyNkZWZpbmUgT1NJVEVDSF9QV1JET1dOCQkweDBkCisjZGVmaW5lIE9TSVRFQ0hfUkVTRVQJCTB4MGUKKyNkZWZpbmUgT1NJVEVDSF9JU1IJCTB4MGYKKyNkZWZpbmUgT1NJVEVDSF9BVUlfUFdSCQkweDBjCisjZGVmaW5lIE9TSVRFQ0hfUkVTRVRfSVNSCTB4MGUKKworI2RlZmluZSBPU0lfQVVJX1BXUgkJMHg0MAorI2RlZmluZSBPU0lfTEFOX1BXUkRPV04JCTB4MDIKKyNkZWZpbmUgT1NJX01PREVNX1BXUkRPV04JMHgwMQorI2RlZmluZSBPU0lfTEFOX1JFU0VUCQkweDAyCisjZGVmaW5lIE9TSV9NT0RFTV9SRVNFVAkJMHgwMQorCisvKiBTeW1ib2xpYyBjb25zdGFudHMgZm9yIHRoZSBTTUM5MWM5KiBzZXJpZXMgY2hpcHMsIGZyb20gRXJpayBTdGFobG1hbi4gKi8KKyNkZWZpbmUJQkFOS19TRUxFQ1QJCTE0CQkvKiBXaW5kb3cgc2VsZWN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBTTUNfU0VMRUNUX0JBTksoeCkgIHsgb3V0dyh4LCBpb2FkZHIgKyBCQU5LX1NFTEVDVCk7IH0KKworLyogQmFuayAwIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUJVENSIAkJMAkvKiB0cmFuc21pdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCSBUQ1JfQ0xFQVIJMAkvKiBkbyBOT1RISU5HICovCisjZGVmaW5lICBUQ1JfRU5BQkxFCTB4MDAwMQkvKiBpZiB0aGlzIGlzIDEsIHdlIGNhbiB0cmFuc21pdCAqLworI2RlZmluZQkgVENSX1BBRF9FTgkweDAwODAJLyogcGFkcyBzaG9ydCBwYWNrZXRzIHRvIDY0IGJ5dGVzICovCisjZGVmaW5lICBUQ1JfTU9OQ1NOCTB4MDQwMCAgLyogTW9uaXRvciBDYXJyaWVyLiAqLworI2RlZmluZSAgVENSX0ZEVVBMWAkweDA4MDAgIC8qIEZ1bGwgZHVwbGV4IG1vZGUuICovCisjZGVmaW5lCSBUQ1JfTk9STUFMIFRDUl9FTkFCTEUgfCBUQ1JfUEFEX0VOCisKKyNkZWZpbmUgRVBICQkyCS8qIEV0aGVybmV0IFByb3RvY29sIEhhbmRsZXIgcmVwb3J0LiAqLworI2RlZmluZSAgRVBIX1RYX1NVQwkweDAwMDEKKyNkZWZpbmUgIEVQSF9TTkdMQ09MCTB4MDAwMgorI2RlZmluZSAgRVBIX01VTENPTAkweDAwMDQKKyNkZWZpbmUgIEVQSF9MVFhfTVVMVAkweDAwMDgKKyNkZWZpbmUgIEVQSF8xNkNPTAkweDAwMTAKKyNkZWZpbmUgIEVQSF9TUUVUCTB4MDAyMAorI2RlZmluZSAgRVBIX0xUWF9CUkQJMHgwMDQwCisjZGVmaW5lICBFUEhfVFhfREVGUgkweDAwODAKKyNkZWZpbmUgIEVQSF9MQVRfQ09MCTB4MDIwMAorI2RlZmluZSAgRVBIX0xPU1RfQ0FSCTB4MDQwMAorI2RlZmluZSAgRVBIX0VYQ19ERUYJMHgwODAwCisjZGVmaW5lICBFUEhfQ1RSX1JPTAkweDEwMDAKKyNkZWZpbmUgIEVQSF9SWF9PVlJOCTB4MjAwMAorI2RlZmluZSAgRVBIX0xJTktfT0sJMHg0MDAwCisjZGVmaW5lICBFUEhfVFhfVU5STgkweDgwMDAKKyNkZWZpbmUgTUVNSU5GTwkJOAkvKiBNZW1vcnkgSW5mb3JtYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUVNQ0ZHCQkxMAkvKiBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCisvKiBCYW5rIDEgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBDT05GSUcJCQkwCisjZGVmaW5lICBDRkdfTUlJX1NFTEVDVAkJMHg4MDAwCS8qIDkxQzEwMCBvbmx5ICovCisjZGVmaW5lICBDRkdfTk9fV0FJVAkJMHgxMDAwCisjZGVmaW5lICBDRkdfRlVMTF9TVEVQCQkweDA0MDAKKyNkZWZpbmUgIENGR19TRVRfU1FMQ0gJCTB4MDIwMAorI2RlZmluZSAgQ0ZHX0FVSV9TRUxFQ1QJIAkweDAxMDAKKyNkZWZpbmUgIENGR18xNkJJVAkJMHgwMDgwCisjZGVmaW5lICBDRkdfRElTX0xJTksJCTB4MDA0MAorI2RlZmluZSAgQ0ZHX1NUQVRJQwkJMHgwMDMwCisjZGVmaW5lICBDRkdfSVJRX1NFTF8xCQkweDAwMDQKKyNkZWZpbmUgIENGR19JUlFfU0VMXzAJCTB4MDAwMgorI2RlZmluZSBCQVNFX0FERFIJCTIKKyNkZWZpbmUJQUREUjAJCQk0CisjZGVmaW5lCUdFTkVSQUwJCQkxMAorI2RlZmluZQlDT05UUk9MCQkJMTIKKyNkZWZpbmUgIENUTF9TVE9SRQkJMHgwMDAxCisjZGVmaW5lICBDVExfUkVMT0FECQkweDAwMDIKKyNkZWZpbmUgIENUTF9FRV9TRUxFQ1QJCTB4MDAwNAorI2RlZmluZSAgQ1RMX1RFX0VOQUJMRQkJMHgwMDIwCisjZGVmaW5lICBDVExfQ1JfRU5BQkxFCQkweDAwNDAKKyNkZWZpbmUgIENUTF9MRV9FTkFCTEUJCTB4MDA4MAorI2RlZmluZSAgQ1RMX0FVVE9fUkVMRUFTRQkweDA4MDAKKyNkZWZpbmUJIENUTF9QT1dFUkRPV04JCTB4MjAwMAorCisvKiBCYW5rIDIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBNTVVfQ01ECQkwCisjZGVmaW5lCSBNQ19BTExPQwkweDIwICAJLyogb3Igd2l0aCBudW1iZXIgb2YgMjU2IGJ5dGUgcGFja2V0cyAqLworI2RlZmluZQkgTUNfUkVTRVQJMHg0MAorI2RlZmluZSAgTUNfUkVMRUFTRSAgCTB4ODAgIAkvKiByZW1vdmUgYW5kIHJlbGVhc2UgdGhlIGN1cnJlbnQgcnggcGFja2V0ICovCisjZGVmaW5lICBNQ19GUkVFUEtUICAJMHhBMCAgCS8qIFJlbGVhc2UgcGFja2V0IGluIFBOUiByZWdpc3RlciAqLworI2RlZmluZSAgTUNfRU5RVUVVRQkweEMwIAkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCisjZGVmaW5lCVBOUl9BUlIJCTIKKyNkZWZpbmUgRklGT19QT1JUUwk0CisjZGVmaW5lICBGUF9SWEVNUFRZCTB4ODAwMAorI2RlZmluZQlQT0lOVEVSCQk2CisjZGVmaW5lICBQVFJfQVVUT19JTkMJMHgwMDQwCisjZGVmaW5lICBQVFJfUkVBRAkweDIwMDAKKyNkZWZpbmUJIFBUUl9BVVRPSU5DIAkweDQwMDAKKyNkZWZpbmUJIFBUUl9SQ1YJMHg4MDAwCisjZGVmaW5lCURBVEFfMQkJOAorI2RlZmluZQlJTlRFUlJVUFQJMTIKKyNkZWZpbmUgIElNX1JDVl9JTlQJCTB4MQorI2RlZmluZQkgSU1fVFhfSU5UCQkweDIKKyNkZWZpbmUJIElNX1RYX0VNUFRZX0lOVAkweDQKKyNkZWZpbmUJIElNX0FMTE9DX0lOVAkJMHg4CisjZGVmaW5lCSBJTV9SWF9PVlJOX0lOVAkJMHgxMAorI2RlZmluZQkgSU1fRVBIX0lOVAkJMHgyMAorCisjZGVmaW5lCVJDUgkJNAorZW51bSBSeENmZyB7IFJ4QWxsTXVsdGkgPSAweDAwMDQsIFJ4UHJvbWlzYyA9IDB4MDAwMiwKKwkgICAgIFJ4RW5hYmxlID0gMHgwMTAwLCBSeFN0cmlwQ1JDID0gMHgwMjAwfTsKKyNkZWZpbmUgIFJDUl9TT0ZUUkVTRVQJMHg4MDAwIAkvKiByZXNldHMgdGhlIGNoaXAgKi8KKyNkZWZpbmUJIFJDUl9TVFJJUF9DUkMJMHgyMDAJLyogc3RyaXBzIENSQyAqLworI2RlZmluZSAgUkNSX0VOQUJMRQkweDEwMAkvKiBJRkYgdGhpcyBpcyBzZXQsIHdlIGNhbiByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUgIFJDUl9BTE1VTAkweDQgCS8qIHJlY2VpdmUgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisjZGVmaW5lCSBSQ1JfUFJPTUlTQwkweDIJLyogZW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKworLyogdGhlIG5vcm1hbCBzZXR0aW5ncyBmb3IgdGhlIFJDUiByZWdpc3RlciA6ICovCisjZGVmaW5lCSBSQ1JfTk9STUFMCShSQ1JfU1RSSVBfQ1JDIHwgUkNSX0VOQUJMRSkKKyNkZWZpbmUgIFJDUl9DTEVBUgkweDAJCS8qIHNldCBpdCB0byBhIGJhc2Ugc3RhdGUgKi8KKyNkZWZpbmUJQ09VTlRFUgkJNgorCisvKiBCQU5LIDMgLS0gbm90IHRoZSBzYW1lIHZhbHVlcyBhcyBpbiBzbWM5MTk0ISAqLworI2RlZmluZQlNVUxUSUNBU1QwCTAKKyNkZWZpbmUJTVVMVElDQVNUMgkyCisjZGVmaW5lCU1VTFRJQ0FTVDQJNAorI2RlZmluZQlNVUxUSUNBU1Q2CTYKKyNkZWZpbmUgTUdNVCAgICAJOAorI2RlZmluZSBSRVZJU0lPTgkweDBhCisKKy8qIFRyYW5zbWl0IHN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBUU19TVUNDRVNTIDB4MDAwMQorI2RlZmluZSBUU18xNkNPTCAgIDB4MDAxMAorI2RlZmluZSBUU19MQVRDT0wgIDB4MDIwMAorI2RlZmluZSBUU19MT1NUQ0FSIDB4MDQwMAorCisvKiBSZWNlaXZlIHN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBSU19BTEdORVJSCTB4ODAwMAorI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAorI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKKyNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQorI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpCisKKyNkZWZpbmUgc2V0X2JpdHModiwgcCkgb3V0dyhpbncocCl8KHYpLCAocCkpCisjZGVmaW5lIG1hc2tfYml0cyh2LCBwKSBvdXR3KGludyhwKSYodiksIChwKSkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICpzbWM5MWM5Ml9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBzbWM5MWM5Ml9kZXRhY2goZGV2X2xpbmtfdCAqKTsKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IHNtYzkxYzkyX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIGludCBzbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzbWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc21jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNtY19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzOWtfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyB2b2lkIHNtY19zZXRfeGN2cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWZfcG9ydCk7CitzdGF0aWMgdm9pZCBzbWNfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtZWRpYV9jaGVjayh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGFkZHIpOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYyk7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IHNtY19saW5rX29rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wczsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgc21jOTFjOTJfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICpzbWM5MWM5Ml9hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgaW50IHJldDsKKworICAgIERFQlVHKDAsICJzbWM5MWM5Ml9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IGV0aGVybmV0IGRldmljZSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc21jX3ByaXZhdGUpKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gTlVMTDsKKyAgICBzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmc21jLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmc21jLT5sb2NrKTsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNDsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmc21jX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgICAvKiBUaGUgU01DOTFjOTItc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc21jX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmc21jX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmczlrX2NvbmZpZzsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKyAgICBkZXYtPm9wZW4gPSAmc21jX29wZW47CisgICAgZGV2LT5zdG9wID0gJnNtY19jbG9zZTsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnNtY19pb2N0bDsKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IHNtY190eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyAgICBzbWMtPm1paV9pZi5kZXYgPSBkZXY7CisgICAgc21jLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworICAgIHNtYy0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworICAgIHNtYy0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKyAgICBzbWMtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmc21jOTFjOTJfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlzbWM5MWM5Ml9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIHNtYzkxYzkyX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzbWM5MWM5Ml9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygwLCAic21jOTFjOTJfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCXNtYzkxYzkyX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogc21jOTFjOTJfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGN2dF9hc2NpaV9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKnMpCit7CisgICAgaW50IGksIGosIGRhLCBjOworCisgICAgaWYgKHN0cmxlbihzKSAhPSAxMikKKwlyZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWRhID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJICAgIGMgPSAqcysrOworCSAgICBkYSA8PD0gNDsKKwkgICAgZGEgKz0gKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgPworCQkoYyAtICcwJykgOiAoKGMgJiAweDBmKSArIDkpOworCX0KKwlkZXYtPmRldl9hZGRyW2ldID0gZGE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBmaXJzdF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwKKwkJY2lzcGFyc2VfdCAqcGFyc2UpCit7CisJaW50IGk7CisKKwlpZiAoKGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTIHx8CisJCQkoaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSkgIT0gQ1NfU1VDQ0VTUykKKwkJcmV0dXJuIGk7CisJcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7Cit9CisKK3N0YXRpYyBpbnQgbmV4dF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwKKwkJY2lzcGFyc2VfdCAqcGFyc2UpCit7CisJaW50IGk7CisKKwlpZiAoKGkgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MgfHwKKwkJCShpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBDb25maWd1cmF0aW9uIHN0dWZmIGZvciBNZWdhaGVydHogY2FyZHMKKworICAgIG1oel8zMjg4X3Bvd2VyKCkgaXMgdXNlZCB0byBwb3dlciB1cCBhIDMyODgncyBldGhlcm5ldCBjaGlwLgorICAgIG1oel9tZmNfY29uZmlnKCkgaGFuZGxlcyBzb2NrZXQgc2V0dXAgZm9yIG11bHRpZnVuY3Rpb24gKDExNDQKKyAgICBhbmQgMzI4OCkgY2FyZHMuICBtaHpfc2V0dXAoKSBnZXRzIGEgY2FyZCdzIGhhcmR3YXJlIGV0aGVybmV0CisgICAgYWRkcmVzcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWh6XzMyODhfcG93ZXIoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIHRtcDsKKworICAgIC8qIFJlYWQgdGhlIElTUiB0d2ljZS4uLiAqLworICAgIHJlYWRiKHNtYy0+YmFzZStNRUdBSEVSVFpfSVNSKTsKKyAgICB1ZGVsYXkoNSk7CisgICAgcmVhZGIoc21jLT5iYXNlK01FR0FIRVJUWl9JU1IpOworCisgICAgLyogUGF1c2UgMjAwbXMuLi4gKi8KKyAgICBtZGVsYXkoMjAwKTsKKworICAgIC8qIE5vdyByZWFkIGFuZCB3cml0ZSB0aGUgQ09SLi4uICovCisgICAgdG1wID0gcmVhZGIoc21jLT5iYXNlICsgbGluay0+Y29uZi5Db25maWdCYXNlICsgQ0lTUkVHX0NPUik7CisgICAgdWRlbGF5KDUpOworICAgIHdyaXRlYih0bXAsIHNtYy0+YmFzZSArIGxpbmstPmNvbmYuQ29uZmlnQmFzZSArIENJU1JFR19DT1IpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWh6X21mY19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfY2hhciBidWZbMjU1XTsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIGludCBpLCBrOworCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisgICAgbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9CisJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUR8SVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCisgICAgaSA9IGZpcnN0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIC8qIFRoZSBNZWdhaGVydHogY29tYm8gY2FyZHMgaGF2ZSBtb2RlbS1saWtlIENJUyBlbnRyaWVzLCBzbworICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0cnkgYSBidW5jaCBvZiBwb3J0IGNvbWJpbmF0aW9ucy4gKi8KKyAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7CisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKKwlsaW5rLT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJZm9yIChrID0gMDsgayA8IDB4NDAwOyBrICs9IDB4MTApIHsKKwkgICAgaWYgKGsgJiAweDgwKSBjb250aW51ZTsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gayBeIDB4MzAwOworCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKwl9CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJaSA9IG5leHRfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpCisJcmV0dXJuIGk7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICAvKiBBbGxvY2F0ZSBhIG1lbW9yeSB3aW5kb3csIGZvciBhY2Nlc3NpbmcgdGhlIElTUiAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKyAgICByZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAwOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gaTsKKyAgICBzbWMtPmJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisgICAgbWVtLkNhcmRPZmZzZXQgPSBtZW0uUGFnZSA9IDA7CisgICAgaWYgKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NT1RPUk9MQSkKKwltZW0uQ2FyZE9mZnNldCA9IGxpbmstPmNvbmYuQ29uZmlnQmFzZTsKKyAgICBpID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworCisgICAgaWYgKChpID09IENTX1NVQ0NFU1MpCisJJiYgKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NRUdBSEVSVFopCisJJiYgKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfRU0zMjg4KSkKKwltaHpfMzI4OF9wb3dlcihsaW5rKTsKKworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IG1oel9zZXR1cChkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfY2hhciBidWZbMjU1XSwgKnN0YXRpb25fYWRkcjsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCisgICAgLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIENJUy4gIEl0IGlzIHN0b3JlZCBhcyB0aGUgbGFzdAorICAgICAgIChmb3VydGgpIHN0cmluZyBpbiB0aGUgVmVyc2lvbiAxIFZlcnNpb24vSUQgdHVwbGUuICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKyAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisgICAgLyogVWdoIC0tIHRoZSBFTTExNDQgY2FyZCBoYXMgdHdvIFZFUlNfMSB0dXBsZXMhPyEgKi8KKyAgICBpZiAobmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSBDU19TVUNDRVNTKQorCWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIGlmIChwYXJzZS52ZXJzaW9uXzEubnMgPiAzKSB7CisJc3RhdGlvbl9hZGRyID0gcGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbM107CisJaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKQorCSAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBBbm90aGVyIHBvc3NpYmlsaXR5OiBmb3IgdGhlIEVNMzI4OCwgaW4gYSBzcGVjaWFsIHR1cGxlICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4MTsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisgICAgaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisgICAgYnVmWzEyXSA9ICdcMCc7CisgICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgYnVmKSA9PSAwKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIC0xOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIENvbmZpZ3VyYXRpb24gc3R1ZmYgZm9yIHRoZSBNb3Rvcm9sYSBNYXJpbmVyCisKKyAgICBtb3RfY29uZmlnKCkgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBNYXJpbmVyIGNvbmZpZ3VyYXRpb24KKyAgICByZWdpc3RlcnMgYmVjYXVzZSB0aGUgQ0lTIGlzIGp1c3QgYm9ndXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBtb3RfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAga2lvX2FkZHJfdCBpb3VhcnQgPSBsaW5rLT5pby5CYXNlUG9ydDI7CisKKyAgICAvKiBTZXQgVUFSVCBiYXNlIGFkZHJlc3MgYW5kIGZvcmNlIG1hcCB3aXRoIENPUiBiaXQgMSAqLworICAgIHdyaXRlYihpb3VhcnQgJiAweGZmLCAgICAgICAgc21jLT5iYXNlICsgTU9UX1VBUlQgKyBDSVNSRUdfSU9CQVNFXzApOworICAgIHdyaXRlYigoaW91YXJ0ID4+IDgpICYgMHhmZiwgc21jLT5iYXNlICsgTU9UX1VBUlQgKyBDSVNSRUdfSU9CQVNFXzEpOworICAgIHdyaXRlYihNT1RfTk9STUFMLCAgICAgICAgICAgc21jLT5iYXNlICsgTU9UX1VBUlQgKyBDSVNSRUdfQ09SKTsKKworICAgIC8qIFNldCBTTUMgYmFzZSBhZGRyZXNzIGFuZCBmb3JjZSBtYXAgd2l0aCBDT1IgYml0IDEgKi8KKyAgICB3cml0ZWIoaW9hZGRyICYgMHhmZiwgICAgICAgIHNtYy0+YmFzZSArIE1PVF9MQU4gKyBDSVNSRUdfSU9CQVNFXzApOworICAgIHdyaXRlYigoaW9hZGRyID4+IDgpICYgMHhmZiwgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19JT0JBU0VfMSk7CisgICAgd3JpdGViKE1PVF9OT1JNQUwsICAgICAgICAgICBzbWMtPmJhc2UgKyBNT1RfTEFOICsgQ0lTUkVHX0NPUik7CisKKyAgICAvKiBXYWl0IGZvciB0aGluZ3MgdG8gc2V0dGxlIGRvd24gKi8KKyAgICBtZGVsYXkoMTAwKTsKK30KKworc3RhdGljIGludCBtb3Rfc2V0dXAoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCB3YWl0LCBsb29wOworICAgIHVfaW50IGFkZHI7CisKKyAgICAvKiBSZWFkIEV0aGVybmV0IGFkZHJlc3MgZnJvbSBTZXJpYWwgRUVQUk9NICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJU01DX1NFTEVDVF9CQU5LKDIpOworCW91dHcoTU9UX0VFUFJPTSArIGksIGlvYWRkciArIFBPSU5URVIpOworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwlvdXR3KChDVExfUkVMT0FEIHwgQ1RMX0VFX1NFTEVDVCksIGlvYWRkciArIENPTlRST0wpOworCisJZm9yIChsb29wID0gd2FpdCA9IDA7IGxvb3AgPCAyMDA7IGxvb3ArKykgeworCSAgICB1ZGVsYXkoMTApOworCSAgICB3YWl0ID0gKChDVExfUkVMT0FEIHwgQ1RMX1NUT1JFKSAmIGludyhpb2FkZHIgKyBDT05UUk9MKSk7CisJICAgIGlmICh3YWl0ID09IDApIGJyZWFrOworCX0KKwkKKwlpZiAod2FpdCkKKwkgICAgcmV0dXJuIC0xOworCQorCWFkZHIgPSBpbncoaW9hZGRyICsgR0VORVJBTCk7CisJZGV2LT5kZXZfYWRkclsyKmldICAgPSBhZGRyICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzIqaSsxXSA9IChhZGRyID4+IDgpICYgMHhmZjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc21jX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X2NoYXIgYnVmWzI1NV07CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKyAgICBpbnQgaTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICB3aGlsZSAoaSAhPSBDU19OT19NT1JFX0lURU1TKSB7CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgeworCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKwlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICB9CisgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIGludCBzbWNfc2V0dXAoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBjaXN0cGxfbGFuX25vZGVfaWRfdCAqbm9kZV9pZDsKKyAgICB1X2NoYXIgYnVmWzI1NV0sICpzdGF0aW9uX2FkZHI7CisgICAgaW50IGk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKworICAgIC8qIENoZWNrIGZvciBhIExBTiBmdW5jdGlvbiBleHRlbnNpb24gdHVwbGUgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisgICAgaSA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKKwlpZiAocGFyc2UuZnVuY2UudHlwZSA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQpCisJICAgIGJyZWFrOworCWkgPSBuZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIH0KKyAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSB7CisJbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGE7CisJaWYgKG5vZGVfaWQtPm5iID09IDYpIHsKKwkgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IG5vZGVfaWQtPmlkW2ldOworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICAgIC8qIFRyeSB0aGUgdGhpcmQgc3RyaW5nIGluIHRoZSBWZXJzaW9uIDEgVmVyc2lvbi9JRCB0dXBsZS4gKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICBzdGF0aW9uX2FkZHIgPSBwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1syXTsKKyAgICBpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBzdGF0aW9uX2FkZHIpID09IDApCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG9zaV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdGF0aWMga2lvX2FkZHJfdCBjb21bNF0gPSB7IDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4IH07CisgICAgaW50IGksIGo7CisKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKyAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KKwlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRHxJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gNjQ7CisgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisKKyAgICAvKiBFbmFibGUgSGFyZCBEZWNvZGUsIExBTiwgTW9kZW0gKi8KKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgyMzsKKworICAgIGZvciAoaSA9IGogPSAwOyBqIDwgNDsgaisrKSB7CisJbGluay0+aW8uQmFzZVBvcnQyID0gY29tW2pdOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwkvKiBGYWxsYmFjazogdHVybiBvZmYgaGFyZCBkZWNvZGUgKi8KKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgwMzsKKwlsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgfQorICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxICsgMHgxMDsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIGludCBvc2lfc2V0dXAoZGV2X2xpbmtfdCAqbGluaywgdV9zaG9ydCBtYW5maWQsIHVfc2hvcnQgY2FyZGlkKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICB1X2NoYXIgYnVmWzI1NV07CisgICAgaW50IGk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCisgICAgLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdHVwbGUgMHg5MCwgc3VidHVwbGUgMHgwNCAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4OTA7CisgICAgaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpOworICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKKwlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKwlpZiAoKGkgIT0gQ1NfU1VDQ0VTUykgfHwgKGJ1ZlswXSA9PSAweDA0KSkKKwkgICAgYnJlYWs7CisJaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpCisJcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJZGV2LT5kZXZfYWRkcltpXSA9IGJ1ZltpKzJdOworCisgICAgaWYgKCgobWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCSAoY2FyZGlkID09IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgfHwKKwkoKG1hbmZpZCA9PSBNQU5GSURfUFNJT04pICYmCisJIChjYXJkaWQgPT0gUFJPRElEX1BTSU9OX05FVDEwMCkpKSB7CisJLyogRG93bmxvYWQgdGhlIFNldmVuIG9mIERpYW1vbmRzIGZpcm13YXJlICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihfX1hpbGlueDdPRCk7IGkrKykgeworCSAgICBvdXRiKF9fWGlsaW54N09EW2ldLCBsaW5rLT5pby5CYXNlUG9ydDErMik7CisJICAgIHVkZWxheSg1MCk7CisJfQorICAgIH0gZWxzZSBpZiAobWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSB7CisJLyogTWFrZSBzdXJlIGJvdGggZnVuY3Rpb25zIGFyZSBwb3dlcmVkIHVwICovCisJc2V0X2JpdHMoMHgzMDAsIGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfQVVJX1BXUik7CisJLyogTm93LCB0dXJuIG9uIHRoZSBpbnRlcnJ1cHQgZm9yIGJvdGggY2FyZCBmdW5jdGlvbnMgKi8KKwlzZXRfYml0cygweDMwMCwgbGluay0+aW8uQmFzZVBvcnQxICsgT1NJVEVDSF9SRVNFVF9JU1IpOworCURFQlVHKDIsICJBVUkvUFdSOiAlNC40eCBSRVNFVC9JU1I6ICU0LjR4XG4iLAorCSAgICAgIGludyhsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX0FVSV9QV1IpLAorCSAgICAgIGludyhsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX1JFU0VUX0lTUikpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgY2hpcCBpcyBzb21lIFNNQzkxY1hYIHZhcmlhbnQsIGFuZCByZXR1cm5zCisgICAgdGhlIHJldmlzaW9uIGNvZGUgaWYgc3VjY2Vzc2Z1bC4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyAtRU5PREVWLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjaGVja19zaWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCB3aWR0aDsKKyAgICB1X3Nob3J0IHM7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgaWYgKGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCkgPj4gOCAhPSAweDMzKSB7CisJLyogVHJ5IHBvd2VyaW5nIHVwIHRoZSBjaGlwICovCisJb3V0dygwLCBpb2FkZHIgKyBDT05UUk9MKTsKKwltZGVsYXkoNTUpOworICAgIH0KKworICAgIC8qIFRyeSBzZXR0aW5nIGJ1cyB3aWR0aCAqLworICAgIHdpZHRoID0gKGxpbmstPmlvLkF0dHJpYnV0ZXMxID09IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPKTsKKyAgICBzID0gaW5iKGlvYWRkciArIENPTkZJRyk7CisgICAgaWYgKHdpZHRoKQorCXMgfD0gQ0ZHXzE2QklUOworICAgIGVsc2UKKwlzICY9IH5DRkdfMTZCSVQ7CisgICAgb3V0YihzLCBpb2FkZHIgKyBDT05GSUcpOworCisgICAgLyogQ2hlY2sgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSBidXMgd2lkdGggaXMgT0sgKi8KKyAgICBzID0gaW53KGlvYWRkciArIEJBU0VfQUREUik7CisgICAgaWYgKChpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpID4+IDggPT0gMHgzMykgJiYKKwkoKHMgPj4gOCkgIT0gKHMgJiAweGZmKSkpIHsKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJcyA9IGludyhpb2FkZHIgKyBSRVZJU0lPTik7CisJcmV0dXJuIChzICYgMHhmZik7CisgICAgfQorCisgICAgaWYgKHdpZHRoKSB7CisJZXZlbnRfY2FsbGJhY2tfYXJnc190IGFyZ3M7CisJcHJpbnRrKEtFUk5fSU5GTyAic21jOTFjOTJfY3M6IHVzaW5nIDgtYml0IElPIHdpbmRvdy5cbiIpOworCWFyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXNtYzkxYzkyX2V2ZW50KENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMLCAwLCAmYXJncyk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXNtYzkxYzkyX2V2ZW50KENTX0VWRU5UX0NBUkRfUkVTRVQsIDAsICZhcmdzKTsKKwlyZXR1cm4gY2hlY2tfc2lnKGxpbmspOworICAgIH0KKyAgICByZXR1cm4gLUVOT0RFVjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBzbWM5MWM5Ml9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0VYSVRfVEVTVChyZXQsIHN2YywgbGFiZWwpIFwKK2lmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeyBjc19lcnJvcihsaW5rLT5oYW5kbGUsIHN2YywgcmV0KTsgZ290byBsYWJlbDsgfQorCitzdGF0aWMgdm9pZCBzbWM5MWM5Ml9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9zaG9ydCBidWZbMzJdOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGksIGosIHJldjsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICB1X2xvbmcgbWlyOworCisgICAgREVCVUcoMCwgInNtYzkxYzkyX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIGkgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICBDU19FWElUX1RFU1QoaSwgUGFyc2VUdXBsZSwgY29uZmlnX2ZhaWxlZCk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgeworCXNtYy0+bWFuZmlkID0gcGFyc2UubWFuZmlkLm1hbmY7CisJc21jLT5jYXJkaWQgPSBwYXJzZS5tYW5maWQuY2FyZDsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCShzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHsKKwlpID0gb3NpX2NvbmZpZyhsaW5rKTsKKyAgICB9IGVsc2UgaWYgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTU9UT1JPTEEpIHx8CisJICAgICAgICgoc21jLT5tYW5maWQgPT0gTUFORklEX01FR0FIRVJUWikgJiYKKwkJKChzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX1ZBUklPVVMpIHx8CisJCSAoc21jLT5jYXJkaWQgPT0gUFJPRElEX01FR0FIRVJUWl9FTTMyODgpKSkpIHsKKwlpID0gbWh6X21mY19jb25maWcobGluayk7CisgICAgfSBlbHNlIHsKKwlpID0gc21jX2NvbmZpZyhsaW5rKTsKKyAgICB9CisgICAgQ1NfRVhJVF9URVNUKGksIFJlcXVlc3RJTywgY29uZmlnX2ZhaWxlZCk7CisKKyAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgQ1NfRVhJVF9URVNUKGksIFJlcXVlc3RJUlEsIGNvbmZpZ19mYWlsZWQpOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworICAgIENTX0VYSVRfVEVTVChpLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgY29uZmlnX2ZhaWxlZCk7CisKKyAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQorCW1vdF9jb25maWcobGluayk7CisKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKworICAgIGlmICgoaWZfcG9ydCA+PSAwKSAmJiAoaWZfcG9ydCA8PSAyKSkKKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworICAgIGVsc2UKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNtYzkxYzkyX2NzOiBpbnZhbGlkIGlmX3BvcnQgcmVxdWVzdGVkXG4iKTsKKworICAgIHN3aXRjaCAoc21jLT5tYW5maWQpIHsKKyAgICBjYXNlIE1BTkZJRF9PU0lURUNIOgorICAgIGNhc2UgTUFORklEX1BTSU9OOgorCWkgPSBvc2lfc2V0dXAobGluaywgc21jLT5tYW5maWQsIHNtYy0+Y2FyZGlkKTsgYnJlYWs7CisgICAgY2FzZSBNQU5GSURfU01DOgorICAgIGNhc2UgTUFORklEX05FV19NRURJQToKKwlpID0gc21jX3NldHVwKGxpbmspOyBicmVhazsKKyAgICBjYXNlIDB4MTI4OiAvKiBGb3IgYnJva2VuIE1lZ2FoZXJ0eiBjYXJkcyAqLworICAgIGNhc2UgTUFORklEX01FR0FIRVJUWjoKKwlpID0gbWh6X3NldHVwKGxpbmspOyBicmVhazsKKyAgICBjYXNlIE1BTkZJRF9NT1RPUk9MQToKKyAgICBkZWZhdWx0OiAvKiBnZXQgdGhlIGh3IGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlpID0gbW90X3NldHVwKGxpbmspOyBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzbWM5MWM5Ml9jczogVW5hYmxlIHRvIGZpbmQgaGFyZHdhcmUgYWRkcmVzcy5cbiIpOworCWdvdG8gY29uZmlnX3VuZG87CisgICAgfQorCisgICAgc21jLT5kdXBsZXggPSAwOworICAgIHNtYy0+cnhfb3ZybiA9IDA7CisKKyAgICByZXYgPSBjaGVja19zaWcobGluayk7CisgICAgbmFtZSA9ICI/Pz8iOworICAgIGlmIChyZXYgPiAwKQorCXN3aXRjaCAocmV2ID4+IDQpIHsKKwljYXNlIDM6IG5hbWUgPSAiOTIiOyBicmVhazsKKwljYXNlIDQ6IG5hbWUgPSAoKHJldiAmIDE1KSA+PSA2KSA/ICI5NiIgOiAiOTQiOyBicmVhazsKKwljYXNlIDU6IG5hbWUgPSAiOTUiOyBicmVhazsKKwljYXNlIDc6IG5hbWUgPSAiMTAwIjsgYnJlYWs7CisJY2FzZSA4OiBuYW1lID0gIjEwMC1GRCI7IGJyZWFrOworCWNhc2UgOTogbmFtZSA9ICIxMTAiOyBicmVhazsKKwl9CisKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpZiAocmV2ID4gMCkgeworCXVfbG9uZyBtY3I7CisJU01DX1NFTEVDVF9CQU5LKDApOworCW1pciA9IGludyhpb2FkZHIgKyBNRU1JTkZPKSAmIDB4ZmY7CisJaWYgKG1pciA9PSAweGZmKSBtaXIrKzsKKwkvKiBHZXQgc2NhbGUgZmFjdG9yIGZvciBtZW1vcnkgc2l6ZSAqLworCW1jciA9ICgocmV2ID4+IDQpID4gMykgPyBpbncoaW9hZGRyICsgTUVNQ0ZHKSA6IDB4MDIwMDsKKwltaXIgKj0gMTI4ICogKDE8PCgobWNyID4+IDkpICYgNykpOworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwlzbWMtPmNmZyA9IGludyhpb2FkZHIgKyBDT05GSUcpICYgfkNGR19BVUlfU0VMRUNUOworCXNtYy0+Y2ZnIHw9IENGR19OT19XQUlUIHwgQ0ZHXzE2QklUIHwgQ0ZHX1NUQVRJQzsKKwlpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpCisJICAgIHNtYy0+Y2ZnIHw9IENGR19JUlFfU0VMXzEgfCBDRkdfSVJRX1NFTF8wOworCWlmICgocmV2ID4+IDQpID49IDcpCisJICAgIHNtYy0+Y2ZnIHw9IENGR19NSUlfU0VMRUNUOworICAgIH0gZWxzZQorCW1pciA9IDA7CisKKyAgICBpZiAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkgeworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJICAgIGogPSBtZGlvX3JlYWQoZGV2LCBpLCAxKTsKKwkgICAgaWYgKChqICE9IDApICYmIChqICE9IDB4ZmZmZikpIGJyZWFrOworCX0KKwlzbWMtPm1paV9pZi5waHlfaWQgPSAoaSA8IDMyKSA/IGkgOiAtMTsKKworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKyAgICB9CisKKyAgICBsaW5rLT5kZXYgPSAmc21jLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fRVJSICJzbWM5MWM5Ml9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gY29uZmlnX3VuZG87CisgICAgfQorCisgICAgc3RyY3B5KHNtYy0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzbWM5MWMlcyByZXYgJWQ6IGlvICUjM2x4LCBpcnEgJWQsICIKKwkgICAiaHdfYWRkciAiLCBkZXYtPm5hbWUsIG5hbWUsIChyZXYgJiAweDBmKSwgZGV2LT5iYXNlX2FkZHIsCisJICAgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICBpZiAocmV2ID4gMCkgeworCWlmIChtaXIgJiAweDNmZikKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAlbHUgYnl0ZSIsIG1pcik7CisJZWxzZQorCSAgICBwcmludGsoS0VSTl9JTkZPICIgICVsdSBrYiIsIG1pcj4+MTApOworCXByaW50aygiIGJ1ZmZlciwgJXMgeGN2clxuIiwgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpID8KKwkgICAgICAgIk1JSSIgOiBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKyAgICB9CisKKyAgICBpZiAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkgeworCWlmIChzbWMtPm1paV9pZi5waHlfaWQgIT0gLTEpIHsKKwkgICAgREVCVUcoMCwgIiAgTUlJIHRyYW5zY2VpdmVyIGF0IGluZGV4ICVkLCBzdGF0dXMgJXguXG4iLAorCQkgIHNtYy0+bWlpX2lmLnBoeV9pZCwgaik7CisJfSBlbHNlIHsKKyAgICAJICAgIHByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CisJfQorICAgIH0KKworICAgIHJldHVybjsKKworY29uZmlnX3VuZG86CisgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKK2NvbmZpZ19mYWlsZWQ6CQkJLyogQ1NfRVhJVF9URVNUKCkgY2FsbHMganVtcCB0byBoZXJlLi4uICovCisgICAgc21jOTFjOTJfcmVsZWFzZShsaW5rKTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCit9IC8qIHNtYzkxYzkyX2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBzbWM5MWM5Ml9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICAgIERFQlVHKDAsICJzbWM5MWM5Ml9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgaWYgKGxpbmstPndpbikgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb3VubWFwKHNtYy0+YmFzZSk7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgfQorCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHNtYzkxYzkyX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisKKyAgICBERUJVRygxLCAic21jOTFjOTJfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwlzbWM5MWM5Ml9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NRUdBSEVSVFopICYmCisJCShzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX0VNMzI4OCkpCisJCW1oel8zMjg4X3Bvd2VyKGxpbmspOworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQorCQltb3RfY29uZmlnKGxpbmspOworCSAgICBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCQkoc21jLT5jYXJkaWQgIT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKSB7CisJCS8qIFBvd2VyIHVwIHRoZSBjYXJkIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCQlzZXRfYml0cygweDAzMDAsIGRldi0+YmFzZV9hZGRyLTB4MTArT1NJVEVDSF9BVUlfUFdSKTsKKwkJc2V0X2JpdHMoMHgwMzAwLCBkZXYtPmJhc2VfYWRkci0weDEwK09TSVRFQ0hfUkVTRVRfSVNSKTsKKwkgICAgfQorCSAgICBpZiAoKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkgJiYKKwkgCShzbWMtPmNhcmRpZCA9PSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHx8CisJCSgoc21jLT5tYW5maWQgPT0gTUFORklEX1BTSU9OKSAmJgorCSAJKHNtYy0+Y2FyZGlkID09IFBST0RJRF9QU0lPTl9ORVQxMDApKSkgeworCQkvKiBEb3dubG9hZCB0aGUgU2V2ZW4gb2YgRGlhbW9uZHMgZmlybXdhcmUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihfX1hpbGlueDdPRCk7IGkrKykgeworCSAgICAJICAgIG91dGIoX19YaWxpbng3T0RbaV0sIGxpbmstPmlvLkJhc2VQb3J0MSsyKTsKKwkgICAJICAgIHVkZWxheSg1MCk7CisJCX0KKwkgICAgfQorCSAgICBpZiAobGluay0+b3BlbikgeworCQlzbWNfcmVzZXQoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogc21jOTFjOTJfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNSUkgaW50ZXJmYWNlIHN1cHBvcnQgZm9yIFNNQzkxY1hYIGJhc2VkIGNhcmRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRElPX1NISUZUX0NMSwkJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfT1VUCQkweDAxCisjZGVmaW5lIE1ESU9fRElSX1dSSVRFCQkweDA4CisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJKE1ESU9fRElSX1dSSVRFKQorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxCShNRElPX0RJUl9XUklURSB8IE1ESU9fREFUQV9PVVQpCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDAyCisKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGFkZHIpCit7CisgICAgaW50IGJpdHM7CisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8IDMyOyBiaXRzKyspIHsKKwlvdXRiKE1ESU9fREFUQV9XUklURTEsIGFkZHIpOworCW91dGIoTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2MpCit7CisgICAga2lvX2FkZHJfdCBhZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBNR01UOworICAgIHVfaW50IGNtZCA9ICgweDA2PDwxMCl8KHBoeV9pZDw8NSl8bG9jOworICAgIGludCBpLCByZXR2YWwgPSAwOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDEzOyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiKGRhdCwgYWRkcik7CisJb3V0YihkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJb3V0YigwLCBhZGRyKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgIT0gMCk7CisJb3V0YihNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsdWUpCit7CisgICAga2lvX2FkZHJfdCBhZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBNR01UOworICAgIHVfaW50IGNtZCA9ICgweDA1PDwyOCl8KHBoeV9pZDw8MjMpfChsb2M8PDE4KXwoMTw8MTcpfHZhbHVlOworICAgIGludCBpOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiKGRhdCwgYWRkcik7CisJb3V0YihkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisJb3V0YigwLCBhZGRyKTsKKwlvdXRiKE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGRyaXZlciBjb3JlIGNvZGUsIG1vc3Qgb2Ygd2hpY2ggc2hvdWxkIGJlIGNvbW1vbiB3aXRoIGEKKyAgICBub24tUENNQ0lBIGltcGxlbWVudGF0aW9uLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIHZvaWQgc21jX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfc2hvcnQgaSwgdywgc2F2ZTsKKyAgICBzYXZlID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKyAgICBmb3IgKHcgPSAwOyB3IDwgNDsgdysrKSB7CisJU01DX1NFTEVDVF9CQU5LKHcpOworCXByaW50ayhLRVJOX0RFQlVHICJiYW5rICVkOiAiLCB3KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkgKz0gMikKKwkgICAgcHJpbnRrKCIgJTA0eCIsIGludyhpb2FkZHIgKyBpKSk7CisJcHJpbnRrKCJcbiIpOworICAgIH0KKyAgICBvdXR3KHNhdmUsIGlvYWRkciArIEJBTktfU0VMRUNUKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmc21jLT5saW5rOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgREVCVUcoMCwgIiVzOiBzbWNfb3BlbiglcCksIElEL1dpbmRvdyAlNC40eC5cbiIsCisJICBkZXYtPm5hbWUsIGRldiwgaW53KGRldi0+YmFzZV9hZGRyICsgQkFOS19TRUxFQ1QpKTsKKyAgICBpZiAocGNfZGVidWcgPiAxKSBzbWNfZHVtcChkZXYpOworI2VuZGlmCisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBQQ01DSUEgY2FyZCBpcyBzdGlsbCBoZXJlLiAqLworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworICAgIC8qIFBoeXNpY2FsIGRldmljZSBwcmVzZW50IHNpZ25hdHVyZS4gKi8KKyAgICBpZiAoY2hlY2tfc2lnKGxpbmspIDwgMCkgeworCXByaW50aygic21jOTFjOTJfY3M6IFlpa2VzISAgQmFkIGNoaXAgc2lnbmF0dXJlIVxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIGxpbmstPm9wZW4rKzsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgc21jLT5zYXZlZF9za2IgPSBOVUxMOworICAgIHNtYy0+cGFja2V0c193YWl0aW5nID0gMDsKKworICAgIHNtY19yZXNldChkZXYpOworICAgIGluaXRfdGltZXIoJnNtYy0+bWVkaWEpOworICAgIHNtYy0+bWVkaWEuZnVuY3Rpb24gPSAmbWVkaWFfY2hlY2s7CisgICAgc21jLT5tZWRpYS5kYXRhID0gKHVfbG9uZykgZGV2OworICAgIHNtYy0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJnNtYy0+bWVkaWEpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIHNtY19vcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHNtY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJnNtYy0+bGluazsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMCwgIiVzOiBzbWNfY2xvc2UoKSwgc3RhdHVzICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEJBTktfU0VMRUNUKSk7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAvKiBTaHV0IG9mZiBhbGwgaW50ZXJydXB0cywgYW5kIHR1cm4gb2ZmIHRoZSBUeCBhbmQgUnggc2VjdGlvbnMuCisgICAgICAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBjaGlwIHByZXNlbnQuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOwkvKiBOb21pbmFsbHkgcGFyYW5vaWEsIGJ1dCBkbyBubyBhc3N1bWUuLi4gKi8KKyAgICBvdXR3KDAsIGlvYWRkciArIElOVEVSUlVQVCk7CisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIG1hc2tfYml0cygweGZmMDAsIGlvYWRkciArIFJDUik7CisgICAgbWFza19iaXRzKDB4ZmYwMCwgaW9hZGRyICsgVENSKTsKKworICAgIC8qIFB1dCB0aGUgY2hpcCBpbnRvIHBvd2VyLWRvd24gbW9kZS4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgb3V0dyhDVExfUE9XRVJET1dOLCBpb2FkZHIgKyBDT05UUk9MICk7CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgZGVsX3RpbWVyX3N5bmMoJnNtYy0+bWVkaWEpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIHNtY19jbG9zZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVHJhbnNmZXIgYSBwYWNrZXQgdG8gdGhlIGhhcmR3YXJlIGFuZCB0cmlnZ2VyIHRoZSBwYWNrZXQgc2VuZC4KKyAgIFRoaXMgbWF5IGJlIGNhbGxlZCBhdCBlaXRoZXIgZnJvbSBlaXRoZXIgdGhlIFR4IHF1ZXVlIGNvZGUKKyAgIG9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNtYy0+c2F2ZWRfc2tiOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9jaGFyIHBhY2tldF9ubzsKKworICAgIGlmICghc2tiKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogSW4gWE1JVCB3aXRoIG5vIHBhY2tldCB0byBzZW5kLlxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogVGhlcmUgc2hvdWxkIGJlIGEgcGFja2V0IHNsb3Qgd2FpdGluZy4gKi8KKyAgICBwYWNrZXRfbm8gPSBpbncoaW9hZGRyICsgUE5SX0FSUikgPj4gODsKKyAgICBpZiAocGFja2V0X25vICYgMHg4MCkgeworCS8qIElmIG5vdCwgdGhlcmUgaXMgYSBoYXJkd2FyZSBwcm9ibGVtISAgTGlrZWx5IGFuIGVqZWN0ZWQgY2FyZC4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogOTFjOTIgaGFyZHdhcmUgVHggYnVmZmVyIGFsbG9jYXRpb24iCisJICAgICAgICIgZmFpbGVkLCBzdGF0dXMgJSMyLjJ4LlxuIiwgZGV2LT5uYW1lLCBwYWNrZXRfbm8pOworCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJc21jLT5zYXZlZF9za2IgPSBOVUxMOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuOworICAgIH0KKworICAgIHNtYy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisgICAgLyogVGhlIGNhcmQgc2hvdWxkIHVzZSB0aGUganVzdC1hbGxvY2F0ZWQgYnVmZmVyLiAqLworICAgIG91dHcocGFja2V0X25vLCBpb2FkZHIgKyBQTlJfQVJSKTsKKyAgICAvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKyAgICBvdXR3KFBUUl9BVVRPSU5DICwgaW9hZGRyICsgUE9JTlRFUik7CisKKyAgICAvKiBTZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICgrNiBmb3Igc3RhdHVzLCBsZW5ndGggYW5kIGN0bCBieXRlKQorICAgICAgIGFuZCB0aGUgc3RhdHVzIHdvcmQgKHNldCB0byB6ZXJvcykuICovCisgICAgeworCXVfY2hhciAqYnVmID0gc2tiLT5kYXRhOworCXVfaW50IGxlbmd0aCA9IHNrYi0+bGVuOyAvKiBUaGUgY2hpcCB3aWxsIHBhZCB0byBldGhlcm5ldCBtaW4uICovCisKKwlERUJVRygyLCAiJXM6IFRyeWluZyB0byB4bWl0IHBhY2tldCBvZiBsZW5ndGggJWQuXG4iLAorCSAgICAgIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwkKKwkvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoOiArNiBmb3Igc3RhdHVzIHdvcmQsIGxlbmd0aCwgYW5kIGN0bCAqLworCW91dHcoMCwgaW9hZGRyICsgREFUQV8xKTsKKwlvdXR3KGxlbmd0aCArIDYsIGlvYWRkciArIERBVEFfMSk7CisJb3V0c3coaW9hZGRyICsgREFUQV8xLCBidWYsIGxlbmd0aCA+PiAxKTsKKwkKKwkvKiBUaGUgb2RkIGxhc3QgYnl0ZSwgaWYgdGhlcmUgaXMgb25lLCBnb2VzIGluIHRoZSBjb250cm9sIHdvcmQuICovCisJb3V0dygobGVuZ3RoICYgMSkgPyAweDIwMDAgfCBidWZbbGVuZ3RoLTFdIDogMCwgaW9hZGRyICsgREFUQV8xKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIFR4IGludGVycnVwdHMsIGJvdGggVHggKFR4RXJyKSBhbmQgVHhFbXB0eS4gKi8KKyAgICBvdXR3KCgoSU1fVFhfSU5UfElNX1RYX0VNUFRZX0lOVCk8PDgpIHwKKwkgKGludyhpb2FkZHIgKyBJTlRFUlJVUFQpICYgMHhmZjAwKSwKKwkgaW9hZGRyICsgSU5URVJSVVBUKTsKKworICAgIC8qIFRoZSBjaGlwIGRvZXMgdGhlIHJlc3Qgb2YgdGhlIHdvcmsuICovCisgICAgb3V0dyhNQ19FTlFVRVVFICwgaW9hZGRyICsgTU1VX0NNRCk7CisKKyAgICBzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTTUM5MWM5MiB0cmFuc21pdCB0aW1lZCBvdXQsICIKKwkgICAiVHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eC5cbiIsCisJICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyKSYweGZmLCBpbncoaW9hZGRyICsgMikpOworICAgIHNtYy0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgc21jX3Jlc2V0KGRldik7CisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgc21jLT5zYXZlZF9za2IgPSBOVUxMOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBzbWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfc2hvcnQgbnVtX3BhZ2VzOworICAgIHNob3J0IHRpbWVfb3V0LCBpcjsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIERFQlVHKDIsICIlczogc21jX3N0YXJ0X3htaXQobGVuZ3RoID0gJWQpIGNhbGxlZCwiCisJICAiIHN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgc2tiLT5sZW4sIGludyhpb2FkZHIgKyAyKSk7CisKKyAgICBpZiAoc21jLT5zYXZlZF9za2IpIHsKKwkvKiBUSElTIFNIT1VMRCBORVZFUiBIQVBQRU4uICovCisJc21jLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCXByaW50ayhLRVJOX0RFQlVHICIlczogSW50ZXJuYWwgZXJyb3IgLS0gc2VudCBwYWNrZXQgd2hpbGUgYnVzeS5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIHNtYy0+c2F2ZWRfc2tiID0gc2tiOworCisgICAgbnVtX3BhZ2VzID0gc2tiLT5sZW4gPj4gODsKKworICAgIGlmIChudW1fcGFnZXMgPiA3KSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXNtYy0+c2F2ZWRfc2tiID0gTlVMTDsKKwlzbWMtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gMDsJCS8qIERvIG5vdCByZS1xdWV1ZSB0aGlzIHBhY2tldC4gKi8KKyAgICB9CisgICAgLyogQSBwYWNrZXQgaXMgbm93IHdhaXRpbmcuICovCisgICAgc21jLT5wYWNrZXRzX3dhaXRpbmcrKzsKKworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsJLyogUGFyYW5vaWEsIHdlIHNob3VsZCBhbHdheXMgYmUgaW4gd2luZG93IDIgKi8KKworICAgIC8qIG5lZWQgTUNfUkVTRVQgdG8ga2VlcCB0aGUgbWVtb3J5IGNvbnNpc3RlbnQuIGVycmF0YT8gKi8KKyAgICBpZiAoc21jLT5yeF9vdnJuKSB7CisJb3V0dyhNQ19SRVNFVCwgaW9hZGRyICsgTU1VX0NNRCk7CisJc21jLT5yeF9vdnJuID0gMDsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5OyBzZW5kIHRoZSBwYWNrZXQgbm93IGlmIHdlIHdpbi4gKi8KKyAgICBvdXR3KE1DX0FMTE9DIHwgbnVtX3BhZ2VzLCBpb2FkZHIgKyBNTVVfQ01EKTsKKyAgICBmb3IgKHRpbWVfb3V0ID0gTUVNT1JZX1dBSVRfVElNRTsgdGltZV9vdXQgPj0gMDsgdGltZV9vdXQtLSkgeworCWlyID0gaW53KGlvYWRkcitJTlRFUlJVUFQpOworCWlmIChpciAmIElNX0FMTE9DX0lOVCkgeworCSAgICAvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0LCBzZW5kIHRoZSBwYWNrZXQuICovCisJICAgIG91dHcoKGlyJjB4ZmYwMCkgfCBJTV9BTExPQ19JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJICAgIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldChkZXYpOwkvKiBTZW5kIHRoZSBwYWNrZXQgbm93Li4gKi8KKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAgIC8qIE90aGVyd2lzZSBkZWZlciB1bnRpbCB0aGUgVHgtc3BhY2UtYWxsb2NhdGVkIGludGVycnVwdC4gKi8KKyAgICBERUJVRygyLCAiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGRlZmVycmVkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICBvdXR3KChJTV9BTExPQ19JTlQgPDwgOCkgfCAoaXIgJiAweGZmMDApLCBpb2FkZHIgKyBJTlRFUlJVUFQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgSGFuZGxlIGEgVHggYW5vbW9sb3VzIGV2ZW50LiAgRW50ZXJlZCB3aGlsZSBpbiBXaW5kb3cgMi4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtY190eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHNhdmVkX3BhY2tldCA9IGludyhpb2FkZHIgKyBQTlJfQVJSKSAmIDB4ZmY7CisgICAgaW50IHBhY2tldF9ubyA9IGludyhpb2FkZHIgKyBGSUZPX1BPUlRTKSAmIDB4N2Y7CisgICAgaW50IHR4X3N0YXR1czsKKworICAgIC8qIHNlbGVjdCB0aGlzIGFzIHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tICovCisgICAgb3V0dyhwYWNrZXRfbm8sIGlvYWRkciArIFBOUl9BUlIpOworCisgICAgLyogcmVhZCB0aGUgZmlyc3Qgd29yZCBmcm9tIHRoaXMgcGFja2V0ICovCisgICAgb3V0dyhQVFJfQVVUT0lOQyB8IFBUUl9SRUFEIHwgMCwgaW9hZGRyICsgUE9JTlRFUik7CisKKyAgICB0eF9zdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQV8xKTsKKworICAgIHNtYy0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgaWYgKHR4X3N0YXR1cyAmIFRTX0xPU1RDQVIpIHNtYy0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfTEFUQ09MKSAgc21jLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisgICAgaWYgKHR4X3N0YXR1cyAmIFRTXzE2Q09MKSB7CisJc21jLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCXNtYy0+dHhfZXJyKys7CisgICAgfQorCisgICAgaWYgKHR4X3N0YXR1cyAmIFRTX1NVQ0NFU1MpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTdWNjZXNzZnVsIHBhY2tldCBjYXVzZWQgZXJyb3IgIgorCSAgICAgICAiaW50ZXJydXB0P1xuIiwgZGV2LT5uYW1lKTsKKyAgICB9CisgICAgLyogcmUtZW5hYmxlIHRyYW5zbWl0ICovCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIG91dHcoaW53KGlvYWRkciArIFRDUikgfCBUQ1JfRU5BQkxFIHwgc21jLT5kdXBsZXgsIGlvYWRkciArIFRDUik7CisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworCisgICAgb3V0dyhNQ19GUkVFUEtULCBpb2FkZHIgKyBNTVVfQ01EKTsgCS8qIEZyZWUgdGhlIHBhY2tldCBtZW1vcnkuICovCisKKyAgICAvKiBvbmUgbGVzcyBwYWNrZXQgd2FpdGluZyBmb3IgbWUgKi8KKyAgICBzbWMtPnBhY2tldHNfd2FpdGluZy0tOworCisgICAgb3V0dyhzYXZlZF9wYWNrZXQsIGlvYWRkciArIFBOUl9BUlIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtY19lcGhfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBjYXJkX3N0YXRzLCBlcGhzOworCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIGVwaHMgPSBpbncoaW9hZGRyICsgRVBIKTsKKyAgICBERUJVRygyLCAiJXM6IEV0aGVybmV0IHByb3RvY29sIGhhbmRsZXIgaW50ZXJydXB0LCBzdGF0dXMiCisJICAiICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBlcGhzKTsKKyAgICAvKiBDb3VsZCBiZSBhIGNvdW50ZXIgcm9sbC1vdmVyIHdhcm5pbmc6IHVwZGF0ZSBzdGF0cy4gKi8KKyAgICBjYXJkX3N0YXRzID0gaW53KGlvYWRkciArIENPVU5URVIpOworICAgIC8qIHNpbmdsZSBjb2xsaXNpb25zICovCisgICAgc21jLT5zdGF0cy5jb2xsaXNpb25zICs9IGNhcmRfc3RhdHMgJiAweEY7CisgICAgY2FyZF9zdGF0cyA+Pj0gNDsKKyAgICAvKiBtdWx0aXBsZSBjb2xsaXNpb25zICovCisgICAgc21jLT5zdGF0cy5jb2xsaXNpb25zICs9IGNhcmRfc3RhdHMgJiAweEY7CisjaWYgMCAJCS8qIFRoZXNlIGFyZSBmb3Igd2hlbiBsaW51eCBzdXBwb3J0cyB0aGVzZSBzdGF0aXN0aWNzICovCisgICAgY2FyZF9zdGF0cyA+Pj0gNDsJCQkvKiBkZWZlcnJlZCAqLworICAgIGNhcmRfc3RhdHMgPj49IDQ7CQkJLyogZXhjZXNzIGRlZmVycmVkICovCisjZW5kaWYKKyAgICAvKiBJZiB3ZSBoYWQgYSB0cmFuc21pdCBlcnJvciB3ZSBtdXN0IHJlLWVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCisgICAgb3V0dyhpbncoaW9hZGRyICsgVENSKSB8IFRDUl9FTkFCTEUgfCBzbWMtPmR1cGxleCwgaW9hZGRyICsgVENSKTsKKworICAgIC8qIENsZWFyIGEgbGluayBlcnJvciBpbnRlcnJ1cHQuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDEpOworICAgIG91dHcoQ1RMX0FVVE9fUkVMRUFTRSB8IDB4MDAwMCwgaW9hZGRyICsgQ09OVFJPTCk7CisgICAgb3V0dyhDVExfQVVUT19SRUxFQVNFIHwgQ1RMX1RFX0VOQUJMRSB8IENUTF9DUl9FTkFCTEUsCisJIGlvYWRkciArIENPTlRST0wpOworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgdV9zaG9ydCBzYXZlZF9iYW5rLCBzYXZlZF9wb2ludGVyLCBtYXNrLCBzdGF0dXM7CisgICAgdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOworICAgIGNoYXIgYm9ndXNfY250ID0gSU5UUl9XT1JLOwkJLyogV29yayB3ZSBhcmUgd2lsbGluZyB0byBkby4gKi8KKworICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDMsICIlczogU01DOTFjOTIgaW50ZXJydXB0ICVkIGF0ICUjeC5cbiIsIGRldi0+bmFtZSwKKwkgIGlycSwgaW9hZGRyKTsKKworICAgIHNtYy0+d2F0Y2hkb2cgPSAwOworICAgIHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgIGlmICgoc2F2ZWRfYmFuayAmIDB4ZmYwMCkgIT0gMHgzMzAwKSB7CisJLyogVGhlIGRldmljZSBkb2VzIG5vdCBleGlzdCAtLSB0aGUgY2FyZCBjb3VsZCBiZSBvZmYtbGluZSwgb3IKKwkgICBtYXliZSBpdCBoYXMgYmVlbiBlamVjdGVkLiAqLworCURFQlVHKDEsICIlczogU01DOTFjOTIgaW50ZXJydXB0ICVkIGZvciBub24tZXhpc3RlbnQiCisJICAgICAgIi9lamVjdGVkIGRldmljZS5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKwloYW5kbGVkID0gMDsKKwlnb3RvIGlycV9kb25lOworICAgIH0KKworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKKyAgICBzYXZlZF9wb2ludGVyID0gaW53KGlvYWRkciArIFBPSU5URVIpOworICAgIG1hc2sgPSBpbncoaW9hZGRyICsgSU5URVJSVVBUKSA+PiA4OworICAgIC8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisgICAgb3V0dygwLCBpb2FkZHIgKyBJTlRFUlJVUFQpOworCisgICAgZG8geyAvKiByZWFkIHRoZSBzdGF0dXMgZmxhZywgYW5kIG1hc2sgaXQgKi8KKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgSU5URVJSVVBUKSAmIDB4ZmY7CisJREVCVUcoMywgIiVzOiBTdGF0dXMgaXMgJSMyLjJ4IChtYXNrICUjMi4yeCkuXG4iLCBkZXYtPm5hbWUsCisJICAgICAgc3RhdHVzLCBtYXNrKTsKKwlpZiAoKHN0YXR1cyAmIG1hc2spID09IDApIHsKKwkgICAgaWYgKGJvZ3VzX2NudCA9PSBJTlRSX1dPUkspCisJCWhhbmRsZWQgPSAwOworCSAgICBicmVhazsKKwl9CisJaWYgKHN0YXR1cyAmIElNX1JDVl9JTlQpIHsKKwkgICAgLyogR290IGEgcGFja2V0KHMpLiAqLworCSAgICBzbWNfcngoZGV2KTsKKwl9CisJaWYgKHN0YXR1cyAmIElNX1RYX0lOVCkgeworCSAgICBzbWNfdHhfZXJyKGRldik7CisJICAgIG91dHcoSU1fVFhfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQpOworCX0KKwlzdGF0dXMgJj0gbWFzazsKKwlpZiAoc3RhdHVzICYgSU1fVFhfRU1QVFlfSU5UKSB7CisJICAgIG91dHcoSU1fVFhfRU1QVFlfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQpOworCSAgICBtYXNrICY9IH5JTV9UWF9FTVBUWV9JTlQ7CisJICAgIHNtYy0+c3RhdHMudHhfcGFja2V0cyArPSBzbWMtPnBhY2tldHNfd2FpdGluZzsKKwkgICAgc21jLT5wYWNrZXRzX3dhaXRpbmcgPSAwOworCX0KKwlpZiAoc3RhdHVzICYgSU1fQUxMT0NfSU5UKSB7CisJICAgIC8qIENsZWFyIHRoaXMgaW50ZXJydXB0IHNvIGl0IGRvZXNuJ3QgaGFwcGVuIGFnYWluICovCisJICAgIG1hc2sgJj0gfklNX0FMTE9DX0lOVDsKKwkKKwkgICAgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KGRldik7CisJCisJICAgIC8qIGVuYWJsZSB4bWl0IGludGVycnVwdHMgYmFzZWQgb24gdGhpcyAqLworCSAgICBtYXNrIHw9IChJTV9UWF9FTVBUWV9JTlQgfCBJTV9UWF9JTlQpOworCQorCSAgICAvKiBhbmQgbGV0IHRoZSBjYXJkIHNlbmQgbW9yZSBwYWNrZXRzIHRvIG1lICovCisJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJaWYgKHN0YXR1cyAmIElNX1JYX09WUk5fSU5UKSB7CisJICAgIHNtYy0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIHNtYy0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkgICAgaWYgKHNtYy0+ZHVwbGV4KQorCQlzbWMtPnJ4X292cm4gPSAxOyAvKiBuZWVkIE1DX1JFU0VUIG91dHNpZGUgc21jX2ludGVycnVwdCAqLworCSAgICBvdXR3KElNX1JYX09WUk5fSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQpOworCX0KKwlpZiAoc3RhdHVzICYgSU1fRVBIX0lOVCkKKwkgICAgc21jX2VwaF9pcnEoZGV2KTsKKyAgICB9IHdoaWxlICgtLWJvZ3VzX2NudCk7CisKKyAgICBERUJVRygzLCAiICBSZXN0b3Jpbmcgc2F2ZWQgcmVnaXN0ZXJzIG1hc2sgJTIuMnggYmFuayAlNC40eCIKKwkgICIgcG9pbnRlciAlNC40eC5cbiIsIG1hc2ssIHNhdmVkX2JhbmssIHNhdmVkX3BvaW50ZXIpOworCisgICAgLyogcmVzdG9yZSBzdGF0ZSByZWdpc3RlciAqLworICAgIG91dHcoKG1hc2s8PDgpLCBpb2FkZHIgKyBJTlRFUlJVUFQpOworICAgIG91dHcoc2F2ZWRfcG9pbnRlciwgaW9hZGRyICsgUE9JTlRFUik7CisgICAgU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCisgICAgREVCVUcoMywgIiVzOiBFeGl0aW5nIGludGVycnVwdCBJUlElZC5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKworaXJxX2RvbmU6CisKKyAgICBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCShzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHsKKwkvKiBSZXRyaWdnZXIgaW50ZXJydXB0IGlmIG5lZWRlZCAqLworCW1hc2tfYml0cygweDAwZmYsIGlvYWRkci0weDEwK09TSVRFQ0hfUkVTRVRfSVNSKTsKKwlzZXRfYml0cygweDAzMDAsIGlvYWRkci0weDEwK09TSVRFQ0hfUkVTRVRfSVNSKTsKKyAgICB9CisgICAgaWYgKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NT1RPUk9MQSkgeworCXVfY2hhciBjb3I7CisJY29yID0gcmVhZGIoc21jLT5iYXNlICsgTU9UX1VBUlQgKyBDSVNSRUdfQ09SKTsKKwl3cml0ZWIoY29yICYgfkNPUl9JUkVRX0VOQSwgc21jLT5iYXNlICsgTU9UX1VBUlQgKyBDSVNSRUdfQ09SKTsKKwl3cml0ZWIoY29yLCBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCWNvciA9IHJlYWRiKHNtYy0+YmFzZSArIE1PVF9MQU4gKyBDSVNSRUdfQ09SKTsKKwl3cml0ZWIoY29yICYgfkNPUl9JUkVRX0VOQSwgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IsIHNtYy0+YmFzZSArIE1PVF9MQU4gKyBDSVNSRUdfQ09SKTsKKyAgICB9CisjaWZkZWYgRE9FU19OT1RfV09SSworICAgIGlmIChzbWMtPmJhc2UgIT0gTlVMTCkgeyAvKiBNZWdhaGVydHogTUZDJ3MgKi8KKwlyZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CisJcmVhZGIoc21jLT5iYXNlK01FR0FIRVJUWl9JU1IpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHJ4X3N0YXR1czsKKyAgICBpbnQgcGFja2V0X2xlbmd0aDsJLyogQ2F1dGlvbjogbm90IGZyYW1lIGxlbmd0aCwgcmF0aGVyIHdvcmRzCisJCQkgICB0byB0cmFuc2ZlciBmcm9tIHRoZSBjaGlwLiAqLworCisgICAgLyogQXNzZXJ0aW9uOiB3ZSBhcmUgaW4gV2luZG93IDIuICovCisKKyAgICBpZiAoaW53KGlvYWRkciArIEZJRk9fUE9SVFMpICYgRlBfUlhFTVBUWSkgeworCXByaW50ayhLRVJOX0VSUiAiJXM6IHNtY19yeCgpIHdpdGggbm90aGluZyBvbiBSeCBGSUZPLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogIFJlc2V0IHRoZSByZWFkIHBvaW50ZXIsIGFuZCByZWFkIHRoZSBzdGF0dXMgYW5kIHBhY2tldCBsZW5ndGguICovCisgICAgb3V0dyhQVFJfUkVBRCB8IFBUUl9SQ1YgfCBQVFJfQVVUT0lOQywgaW9hZGRyICsgUE9JTlRFUik7CisgICAgcnhfc3RhdHVzID0gaW53KGlvYWRkciArIERBVEFfMSk7CisgICAgcGFja2V0X2xlbmd0aCA9IGludyhpb2FkZHIgKyBEQVRBXzEpICYgMHgwN2ZmOworCisgICAgREVCVUcoMiwgIiVzOiBSZWNlaXZlIHN0YXR1cyAlNC40eCBsZW5ndGggJWQuXG4iLAorCSAgZGV2LT5uYW1lLCByeF9zdGF0dXMsIHBhY2tldF9sZW5ndGgpOworCisgICAgaWYgKCEocnhfc3RhdHVzICYgUlNfRVJST1JTKSkgewkJCisJLyogZG8gc3R1ZmYgdG8gbWFrZSBhIG5ldyBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQorCS8qIE5vdGU6IHBhY2tldF9sZW5ndGggYWRkcyA1IG9yIDYgZXh0cmEgYnl0ZXMgaGVyZSEgKi8KKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBhY2tldF9sZW5ndGgrMik7CisJCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJICAgIERFQlVHKDEsICIlczogTG93IG1lbW9yeSwgcGFja2V0IGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUpOworCSAgICBzbWMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkgICAgb3V0dyhNQ19SRUxFQVNFLCBpb2FkZHIgKyBNTVVfQ01EKTsKKwkgICAgcmV0dXJuOworCX0KKwkKKwlwYWNrZXRfbGVuZ3RoIC09IChyeF9zdGF0dXMgJiBSU19PRERGUkFNRSA/IDUgOiA2KTsKKwlza2JfcmVzZXJ2ZShza2IsIDIpOworCWluc3coaW9hZGRyK0RBVEFfMSwgc2tiX3B1dChza2IsIHBhY2tldF9sZW5ndGgpLAorCSAgICAgKHBhY2tldF9sZW5ndGgrMSk+PjEpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCisJc2tiLT5kZXYgPSBkZXY7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNtYy0+c3RhdHMucnhfcGFja2V0cysrOworCXNtYy0+c3RhdHMucnhfYnl0ZXMgKz0gcGFja2V0X2xlbmd0aDsKKwlpZiAocnhfc3RhdHVzICYgUlNfTVVMVElDQVNUKQorCSAgICBzbWMtPnN0YXRzLm11bHRpY2FzdCsrOworICAgIH0gZWxzZSB7CisJLyogZXJyb3IgLi4uICovCisJc21jLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkKKwlpZiAocnhfc3RhdHVzICYgUlNfQUxHTkVSUikgIHNtYy0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJaWYgKHJ4X3N0YXR1cyAmIChSU19UT09TSE9SVCB8IFJTX1RPT0xPTkcpKQorCSAgICBzbWMtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAocnhfc3RhdHVzICYgUlNfQkFEQ1JDKQlzbWMtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyAgICB9CisgICAgLyogTGV0IHRoZSBNTVUgZnJlZSB0aGUgbWVtb3J5IG9mIHRoaXMgcGFja2V0LiAqLworICAgIG91dHcoTUNfUkVMRUFTRSwgaW9hZGRyICsgTU1VX0NNRCk7CisKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgLyogTm90aGluZyB0byB1cGRhdGUgLSB0aGUgOTFjOTIgaXMgYSBwcmV0dHkgcHJpbWF0aXZlIGNoaXAuICovCisgICAgcmV0dXJuICZzbWMtPnN0YXRzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIHRoZSBoYXJkd2FyZSBtdWx0aWNhc3QgZmlsdGVyIGhhc2ggdGFibGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmaWxsX211bHRpY2FzdF90YmwoaW50IGNvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKmFkZHJzLAorCQkJICAgICAgIHVfY2hhciAqbXVsdGljYXN0X3RhYmxlKQoreworICAgIHN0cnVjdCBkZXZfbWNfbGlzdAkqbWNfYWRkcjsKKworICAgIGZvciAobWNfYWRkciA9IGFkZHJzOyAgbWNfYWRkciAmJiAtLWNvdW50ID4gMDsgIG1jX2FkZHIgPSBtY19hZGRyLT5uZXh0KSB7CisJdV9pbnQgcG9zaXRpb24gPSBldGhlcl9jcmMoNiwgbWNfYWRkci0+ZG1pX2FkZHIpOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCQkvKiBWZXJpZnkgbXVsdGljYXN0IGFkZHJlc3MuICovCisJaWYgKChtY19hZGRyLT5kbWlfYWRkclswXSAmIDEpID09IDApCisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJbXVsdGljYXN0X3RhYmxlW3Bvc2l0aW9uID4+IDI5XSB8PSAxIDw8ICgocG9zaXRpb24gPj4gMjYpICYgNyk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFNldCB0aGUgcmVjZWl2ZSBtb2RlLgorCisgICAgVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgYm90aCB0aGUgcHJvdG9jb2wgbGV2ZWwgdG8gbm90aWZ5IHVzIG9mCisgICAgcHJvbWlzY3VvdXMvbXVsdGljYXN0IG1vZGUgY2hhbmdlcywgYW5kIGJ5IHRoZSBvcGVuL3Jlc2V0IGNvZGUgdG8KKyAgICBpbml0aWFsaXplIHRoZSBSeCByZWdpc3RlcnMuICBXZSBhbHdheXMgc2V0IHRoZSBtdWx0aWNhc3QgbGlzdCBhbmQKKyAgICBsZWF2ZSB0aGUgcmVjZWl2ZXIgcnVubmluZy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9pbnQgbXVsdGljYXN0X3RhYmxlWyAyIF0gPSB7IDAsIH07CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1X3Nob3J0IHJ4X2NmZ19zZXR0aW5nOworCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHNldHRpbmcgUnggbW9kZSB0byBwcm9taXNjdW91cy5cbiIsIGRldi0+bmFtZSk7CisJcnhfY2ZnX3NldHRpbmcgPSBSeFN0cmlwQ1JDIHwgUnhFbmFibGUgfCBSeFByb21pc2MgfCBSeEFsbE11bHRpOworICAgIH0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwlyeF9jZmdfc2V0dGluZyA9IFJ4U3RyaXBDUkMgfCBSeEVuYWJsZSB8IFJ4QWxsTXVsdGk7CisgICAgZWxzZSB7CisJaWYgKGRldi0+bWNfY291bnQpICB7CisJICAgIGZpbGxfbXVsdGljYXN0X3RibChkZXYtPm1jX2NvdW50LCBkZXYtPm1jX2xpc3QsCisJCQkgICAgICAgKHVfY2hhciAqKW11bHRpY2FzdF90YWJsZSk7CisJfQorCXJ4X2NmZ19zZXR0aW5nID0gUnhTdHJpcENSQyB8IFJ4RW5hYmxlOworICAgIH0KKworICAgIC8qIExvYWQgTUMgdGFibGUgYW5kIFJ4IHNldHRpbmcgaW50byB0aGUgY2hpcCB3aXRob3V0IGludGVycnVwdHMuICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNtYy0+bG9jaywgZmxhZ3MpOworICAgIFNNQ19TRUxFQ1RfQkFOSygzKTsKKyAgICBvdXRsKG11bHRpY2FzdF90YWJsZVswXSwgaW9hZGRyICsgTVVMVElDQVNUMCk7CisgICAgb3V0bChtdWx0aWNhc3RfdGFibGVbMV0sIGlvYWRkciArIE1VTFRJQ0FTVDQpOworICAgIFNNQ19TRUxFQ1RfQkFOSygwKTsKKyAgICBvdXR3KHJ4X2NmZ19zZXR0aW5nLCBpb2FkZHIgKyBSQ1IpOworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWMtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBTZW5zZXMgd2hlbiBhIGNhcmQncyBjb25maWcgY2hhbmdlcy4gSGVyZSwgaXQncyBjb2F4IG9yIFRQLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzOWtfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpZiAoKG1hcC0+cG9ydCAhPSAodV9jaGFyKSgtMSkpICYmIChtYXAtPnBvcnQgIT0gZGV2LT5pZl9wb3J0KSkgeworCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKQorCSAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJZWxzZSBpZiAobWFwLT5wb3J0ID4gMikKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlcyBwb3J0XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworCXNtY19yZXNldChkZXYpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSZXNldCB0aGUgY2hpcCwgcmVsb2FkaW5nIGV2ZXJ5IHJlZ2lzdGVyIHRoYXQgbWlnaHQgYmUgY29ycnVwdGVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgU2V0IHRyYW5zY2VpdmVyIHR5cGUsIHBlcmhhcHMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdCB0aGUgdXNlcgorICBzcGVjaWZpZWQgaW4gZGV2LT5pZl9wb3J0LgorKi8KK3N0YXRpYyB2b2lkIHNtY19zZXRfeGN2cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWZfcG9ydCkKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IHNhdmVkX2Jhbms7CisKKyAgICBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgaWYgKGlmX3BvcnQgPT0gMikgeworCW91dHcoc21jLT5jZmcgfCBDRkdfQVVJX1NFTEVDVCwgaW9hZGRyICsgQ09ORklHKTsKKwlpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCSAgICAoc21jLT5jYXJkaWQgIT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKQorCSAgICBzZXRfYml0cyhPU0lfQVVJX1BXUiwgaW9hZGRyIC0gMHgxMCArIE9TSVRFQ0hfQVVJX1BXUik7CisJc21jLT5tZWRpYV9zdGF0dXMgPSAoKGRldi0+aWZfcG9ydCA9PSAwKSA/IDB4MDAwMSA6IDB4MDAwMik7CisgICAgfSBlbHNlIHsKKwlvdXR3KHNtYy0+Y2ZnLCBpb2FkZHIgKyBDT05GSUcpOworCWlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJICAgIChzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpCisJICAgIG1hc2tfYml0cyh+T1NJX0FVSV9QV1IsIGlvYWRkciAtIDB4MTAgKyBPU0lURUNIX0FVSV9QV1IpOworCXNtYy0+bWVkaWFfc3RhdHVzID0gKChkZXYtPmlmX3BvcnQgPT0gMCkgPyAweDAwMTIgOiAweDQwMDEpOworICAgIH0KKyAgICBTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgREVCVUcoMCwgIiVzOiBzbWM5MWM5MiByZXNldCBjYWxsZWQuXG4iLCBkZXYtPm5hbWUpOworCisgICAgLyogVGhlIGZpcnN0IGludGVyYWN0aW9uIG11c3QgYmUgYSB3cml0ZSB0byBicmluZyB0aGUgY2hpcCBvdXQKKyAgICAgICBvZiBzbGVlcCBtb2RlLiAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygwKTsKKyAgICAvKiBSZXNldCB0aGUgY2hpcC4gKi8KKyAgICBvdXR3KFJDUl9TT0ZUUkVTRVQsIGlvYWRkciArIFJDUik7CisgICAgdWRlbGF5KDEwKTsKKworICAgIC8qIENsZWFyIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KKyAgICBvdXR3KFJDUl9DTEVBUiwgaW9hZGRyICsgUkNSKTsKKyAgICBvdXR3KFRDUl9DTEVBUiwgaW9hZGRyICsgVENSKTsKKworICAgIC8qIFNldCB0aGUgV2luZG93IDEgY29udHJvbCwgY29uZmlndXJhdGlvbiBhbmQgc3RhdGlvbiBhZGRyIHJlZ2lzdGVycy4KKyAgICAgICBObyBwb2ludCBpbiB3cml0aW5nIHRoZSBJL08gYmFzZSByZWdpc3RlciA7LT4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgLyogQXV0b21hdGljYWxseSByZWxlYXNlIHN1Y2Nlc2Z1bGx5IHRyYW5zbWl0dGVkIHBhY2tldHMsCisgICAgICAgQWNjZXB0IGxpbmsgZXJyb3JzLCBjb3VudGVyIGFuZCBUeCBlcnJvciBpbnRlcnJ1cHRzLiAqLworICAgIG91dHcoQ1RMX0FVVE9fUkVMRUFTRSB8IENUTF9URV9FTkFCTEUgfCBDVExfQ1JfRU5BQkxFLAorCSBpb2FkZHIgKyBDT05UUk9MKTsKKyAgICBzbWNfc2V0X3hjdnIoZGV2LCBkZXYtPmlmX3BvcnQpOworICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkKKwlvdXR3KChkZXYtPmlmX3BvcnQgPT0gMiA/IE9TSV9BVUlfUFdSIDogMCkgfAorCSAgICAgKGludyhpb2FkZHItMHgxMCtPU0lURUNIX0FVSV9QV1IpICYgMHhmZjAwKSwKKwkgICAgIGlvYWRkciAtIDB4MTAgKyBPU0lURUNIX0FVSV9QV1IpOworCisgICAgLyogRmlsbCBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gIFRoZSBkYXRhYm9vayBpcyB3cm9uZyBhYm91dCB0aGUgb3JkZXIhICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikKKwlvdXR3KChkZXYtPmRldl9hZGRyW2krMV08PDgpK2Rldi0+ZGV2X2FkZHJbaV0sCisJICAgICBpb2FkZHIgKyBBRERSMCArIGkpOworCisgICAgLyogUmVzZXQgdGhlIE1NVSAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKKyAgICBvdXR3KE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EKTsKKyAgICBvdXR3KDAsIGlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICAvKiBSZS1lbmFibGUgdGhlIGNoaXAuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIG91dHcoKChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSA/IDAgOiBUQ1JfTU9OQ1NOKSB8CisJIFRDUl9FTkFCTEUgfCBUQ1JfUEFEX0VOIHwgc21jLT5kdXBsZXgsIGlvYWRkciArIFRDUik7CisgICAgc2V0X3J4X21vZGUoZGV2KTsKKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJU01DX1NFTEVDVF9CQU5LKDMpOworCisJLyogUmVzZXQgTUlJICovCisJbWRpb193cml0ZShkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgMCwgMHg4MDAwKTsKKworCS8qIEFkdmVydGlzZSAxMDBGLCAxMDBILCAxMEYsIDEwSCAqLworCW1kaW9fd3JpdGUoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDQsIDB4MDFlMSk7CisKKwkvKiBSZXN0YXJ0IE1JSSBhdXRvbmVnb3RpYXRpb24gKi8KKwltZGlvX3dyaXRlKGRldiwgc21jLT5taWlfaWYucGh5X2lkLCAwLCAweDAwMDApOworCW1kaW9fd3JpdGUoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDAsIDB4MTIwMCk7CisgICAgfQorCisgICAgLyogRW5hYmxlIGludGVycnVwdHMuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIG91dHcoKElNX0VQSF9JTlQgfCBJTV9SWF9PVlJOX0lOVCB8IElNX1JDVl9JTlQpIDw8IDgsCisJIGlvYWRkciArIElOVEVSUlVQVCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHJvdXRpbmUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVfbG9uZyBhcmcpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBhcmc7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBpLCBtZWRpYSwgc2F2ZWRfYmFuazsKKyAgICB1X3Nob3J0IGxpbms7CisKKyAgICBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKworICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwlnb3RvIHJlc2NoZWR1bGU7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CisKKyAgICAvKiBuZWVkIE1DX1JFU0VUIHRvIGtlZXAgdGhlIG1lbW9yeSBjb25zaXN0ZW50LiBlcnJhdGE/ICovCisgICAgaWYgKHNtYy0+cnhfb3ZybikgeworCW91dHcoTUNfUkVTRVQsIGlvYWRkciArIE1NVV9DTUQpOworCXNtYy0+cnhfb3ZybiA9IDA7CisgICAgfQorICAgIGkgPSBpbncoaW9hZGRyICsgSU5URVJSVVBUKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgbWVkaWEgPSBpbncoaW9hZGRyICsgRVBIKSAmIEVQSF9MSU5LX09LOworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBtZWRpYSB8PSAoaW53KGlvYWRkciArIENPTkZJRykgJiBDRkdfQVVJX1NFTEVDVCkgPyAyIDogMTsKKworICAgIC8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIHdhdGNoZG9nIGZsYWcgc2V0OiB3aXRoCisgICAgICAgdGhpcywgd2UgY2FuIGxpbXAgYWxvbmcgZXZlbiBpZiB0aGUgaW50ZXJydXB0IGlzIGJsb2NrZWQgKi8KKyAgICBpZiAoc21jLT53YXRjaGRvZysrICYmICgoaT4+OCkgJiBpKSkgeworCWlmICghc21jLT5mYXN0X3BvbGwpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CisJc21jX2ludGVycnVwdChkZXYtPmlycSwgc21jLCBOVUxMKTsKKwlzbWMtPmZhc3RfcG9sbCA9IEhaOworICAgIH0KKyAgICBpZiAoc21jLT5mYXN0X3BvbGwpIHsKKwlzbWMtPmZhc3RfcG9sbC0tOworCXNtYy0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDA7CisJYWRkX3RpbWVyKCZzbWMtPm1lZGlhKTsKKwlTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJaWYgKHNtYy0+bWlpX2lmLnBoeV9pZCA8IDApCisJICAgIGdvdG8gcmVzY2hlZHVsZTsKKworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlsaW5rID0gbWRpb19yZWFkKGRldiwgc21jLT5taWlfaWYucGh5X2lkLCAxKTsKKwlpZiAoIWxpbmsgfHwgKGxpbmsgPT0gMHhmZmZmKSkgeworICAJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgaXMgbWlzc2luZyFcbiIsIGRldi0+bmFtZSk7CisJICAgIHNtYy0+bWlpX2lmLnBoeV9pZCA9IC0xOworCSAgICBnb3RvIHJlc2NoZWR1bGU7CisJfQorCisJbGluayAmPSAweDAwMDQ7CisJaWYgKGxpbmsgIT0gc21jLT5saW5rX3N0YXR1cykgeworCSAgICB1X3Nob3J0IHAgPSBtZGlvX3JlYWQoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDUpOworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJCShsaW5rKSA/ICJmb3VuZCIgOiAibG9zdCIpOworCSAgICBzbWMtPmR1cGxleCA9ICgoKHAgJiAweDAxMDApIHx8ICgocCAmIDB4MWMwKSA9PSAweDQwKSkKKwkJCSAgID8gVENSX0ZEVVBMWCA6IDApOworCSAgICBpZiAobGluaykgeworCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZTogIgorCQkgICAgICAgIiVzYmFzZVQtJWNEIHNlbGVjdGVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoKHAgJiAweDAxODApID8gIjEwMCIgOiAiMTAiKSwKKwkJICAgICAgIChzbWMtPmR1cGxleCA/ICdGJyA6ICdIJykpOworCSAgICB9CisJICAgIFNNQ19TRUxFQ1RfQkFOSygwKTsKKwkgICAgb3V0dyhpbncoaW9hZGRyICsgVENSKSB8IHNtYy0+ZHVwbGV4LCBpb2FkZHIgKyBUQ1IpOworCSAgICBzbWMtPmxpbmtfc3RhdHVzID0gbGluazsKKwl9CisJZ290byByZXNjaGVkdWxlOworICAgIH0KKworICAgIC8qIElnbm9yZSBjb2xsaXNpb25zIHVubGVzcyB3ZSd2ZSBoYWQgbm8gcngncyByZWNlbnRseSAqLworICAgIGlmIChqaWZmaWVzIC0gZGV2LT5sYXN0X3J4ID4gSFopIHsKKwlpZiAoc21jLT50eF9lcnIgfHwgKHNtYy0+bWVkaWFfc3RhdHVzICYgRVBIXzE2Q09MKSkKKwkgICAgbWVkaWEgfD0gRVBIXzE2Q09MOworICAgIH0KKyAgICBzbWMtPnR4X2VyciA9IDA7CisKKyAgICBpZiAobWVkaWEgIT0gc21jLT5tZWRpYV9zdGF0dXMpIHsKKwlpZiAoKG1lZGlhICYgc21jLT5tZWRpYV9zdGF0dXMgJiAxKSAmJgorCSAgICAoKHNtYy0+bWVkaWFfc3RhdHVzIF4gbWVkaWEpICYgRVBIX0xJTktfT0spKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJCSAgIChzbWMtPm1lZGlhX3N0YXR1cyAmIEVQSF9MSU5LX09LID8gImxvc3QiIDogImZvdW5kIikpOworCWVsc2UgaWYgKChtZWRpYSAmIHNtYy0+bWVkaWFfc3RhdHVzICYgMikgJiYKKwkJICgoc21jLT5tZWRpYV9zdGF0dXMgXiBtZWRpYSkgJiBFUEhfMTZDT0wpKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogY29heCBjYWJsZSAlc1xuIiwgZGV2LT5uYW1lLAorCQkgICAobWVkaWEgJiBFUEhfMTZDT0wgPyAicHJvYmxlbSIgOiAib2siKSk7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKSB7CisJICAgIGlmIChtZWRpYSAmIDEpIHsKKwkJaWYgKG1lZGlhICYgRVBIX0xJTktfT0spCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogZmxpcHBlZCB0byAxMGJhc2VUXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJZWxzZQorCQkgICAgc21jX3NldF94Y3ZyKGRldiwgMik7CisJICAgIH0gZWxzZSB7CisJCWlmIChtZWRpYSAmIEVQSF8xNkNPTCkKKwkJICAgIHNtY19zZXRfeGN2cihkZXYsIDEpOworCQllbHNlCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogZmxpcHBlZCB0byAxMGJhc2UyXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkgICAgfQorCX0KKwlzbWMtPm1lZGlhX3N0YXR1cyA9IG1lZGlhOworICAgIH0KKworcmVzY2hlZHVsZToKKyAgICBzbWMtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZzbWMtPm1lZGlhKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7Cit9CisKK3N0YXRpYyBpbnQgc21jX2xpbmtfb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJcmV0dXJuIG1paV9saW5rX29rKCZzbWMtPm1paV9pZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU01DX1NFTEVDVF9CQU5LKDApOworCXJldHVybiBpbncoaW9hZGRyICsgRVBIKSAmIEVQSF9MSU5LX09LOworICAgIH0KK30KKworc3RhdGljIGludCBzbWNfbmV0ZGV2X2dldF9lY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKyAgICB1MTYgdG1wOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBlY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0FVSSB8CisJU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpOworCQkKKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgdG1wID0gaW53KGlvYWRkciArIENPTkZJRyk7CisgICAgZWNtZC0+cG9ydCA9ICh0bXAgJiBDRkdfQVVJX1NFTEVDVCkgPyBQT1JUX0FVSSA6IFBPUlRfVFA7CisgICAgZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworICAgIGVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisgICAgZWNtZC0+cGh5X2FkZHJlc3MgPSBpb2FkZHIgKyBNR01UOworCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIHRtcCA9IGludyhpb2FkZHIgKyBUQ1IpOworICAgIGVjbWQtPmR1cGxleCA9ICh0bXAgJiBUQ1JfRkRVUExYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWNfbmV0ZGV2X3NldF9lY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKyAgICB1MTYgdG1wOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoZWNtZC0+c3BlZWQgIT0gU1BFRURfMTApCisgICAgCXJldHVybiAtRUlOVkFMOworICAgIGlmIChlY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorICAgIAlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoZWNtZC0+cG9ydCAhPSBQT1JUX1RQICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9BVUkpCisJcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfSU5URVJOQUwpCisgICAgCXJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGVjbWQtPnBvcnQgPT0gUE9SVF9BVUkpCisJc21jX3NldF94Y3ZyKGRldiwgMSk7CisgICAgZWxzZQorCXNtY19zZXRfeGN2cihkZXYsIDApOworCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIHRtcCA9IGludyhpb2FkZHIgKyBUQ1IpOworICAgIGlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJdG1wIHw9IFRDUl9GRFVQTFg7CisgICAgZWxzZQorCXRtcCAmPSB+VENSX0ZEVVBMWDsKKyAgICBvdXR3KHRtcCwgaW9hZGRyICsgVENSKTsKKwkKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKK30KKworc3RhdGljIGludCBzbWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisJaW50IHJldDsKKworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlzcGluX2xvY2tfaXJxKCZzbWMtPmxvY2spOworCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKQorCQlyZXQgPSBtaWlfZXRodG9vbF9nc2V0KCZzbWMtPm1paV9pZiwgZWNtZCk7CisJZWxzZQorCQlyZXQgPSBzbWNfbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNtY19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwlpbnQgcmV0OworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpCisJCXJldCA9IG1paV9ldGh0b29sX3NzZXQoJnNtYy0+bWlpX2lmLCBlY21kKTsKKwllbHNlCisJCXJldCA9IHNtY19uZXRkZXZfc2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgc21jX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCXUzMiByZXQ7CisKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJc3Bpbl9sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlyZXQgPSBzbWNfbGlua19vayhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIHUzMiBzbWNfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBjX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBzbWNfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWwpCit7CisJcGNfZGVidWcgPSB2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzbWNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkgeworCQlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQl1MTYgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisJCWludCByZXM7CisKKwkJU01DX1NFTEVDVF9CQU5LKDMpOworCQlyZXMgPSBtaWlfbndheV9yZXN0YXJ0KCZzbWMtPm1paV9pZik7CisJCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKworCQlyZXR1cm4gcmVzOworCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmJlZ2luID0gY2hlY2tfaWZfcnVubmluZywKKwkuZ2V0X2RydmluZm8gPSBzbWNfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncyA9IHNtY19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IHNtY19zZXRfc2V0dGluZ3MsCisJLmdldF9saW5rID0gc21jX2dldF9saW5rLAorI2lmZGVmIFBDTUNJQV9ERUJVRworCS5nZXRfbXNnbGV2ZWwgPSBzbWNfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzbWNfc2V0X21zZ2xldmVsLAorI2VuZGlmCisJLm53YXlfcmVzZXQgPSBzbWNfbndheV9yZXNldCwKK307CisKK3N0YXRpYyBpbnQgc21jX2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paSA9IGlmX21paShycSk7CisJaW50IHJjID0gMDsKKwl1MTYgc2F2ZWRfYmFuazsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmc21jLT5taWlfaWYsIG1paSwgY21kLCBOVUxMKTsKKwlTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisJc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHNtYzkxYzkyX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInNtYzkxYzkyX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gc21jOTFjOTJfYXR0YWNoLAorCS5kZXRhY2gJCT0gc21jOTFjOTJfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zbWM5MWM5Ml9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZzbWM5MWM5Ml9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zbWM5MWM5Ml9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmc21jOTFjOTJfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfc21jOTFjOTJfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9zbWM5MWM5Ml9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE3N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtMCwwICsxLDIwMzEgQEAKKy8qIFt4aXJjMnBzX2NzLmMgd2sgMDMuMTEuOTldICgxLjQwIDE5OTkvMTEvMTggMDA6MDY6MDMpCisgKiBYaXJjb20gQ3JlZGl0Q2FyZCBFdGhlcm5ldCBBZGFwdGVyIElJcHMgZHJpdmVyCisgKiBYaXJjb20gUmVhbHBvcnQgMTAvMTAwIChSRS0xMDApIGRyaXZlciAKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB2YXJpb3VzIFhpcmNvbSBDcmVkaXRDYXJkIEV0aGVybmV0IGFkYXB0ZXJzCisgKiBpbmNsdWRpbmcgdGhlIENFMiwgQ0UgSUlwcywgUkUtMTAsIENFTTI4LCBDRU0zMywgQ0UzMywgQ0VNNTYsCisgKiBDRTMtMTAwLCBDRTNCLCBSRS0xMDAsIFJFTTEwQlQsIGFuZCBSRU01NkctMTAwLgorICoKKyAqIDIwMDAtMDktMjQgPHBzaGVlckBpY29uLmNvLnphPiBUaGUgWGlyY29tIENFM0ItMTAwIG1heSBub3QKKyAqIGF1dG9kZXRlY3QgdGhlIG1lZGlhIHByb3Blcmx5LiBJbiB0aGlzIGNhc2UgdXNlIHRoZQorICogaWZfcG9ydD0xIChmb3IgMTBCYXNlVCkgb3IgaWZfcG9ydD00IChmb3IgMTAwQmFzZVQpIG9wdGlvbnMKKyAqIHRvIGZvcmNlIHRoZSBtZWRpYSB0eXBlLgorICogCisgKiBXcml0dGVuIG9yaWdpbmFsbHkgYnkgV2VybmVyIEtvY2ggYmFzZWQgb24gRGF2aWQgSGluZHMnIHNrZWxldG9uIG9mIHRoZQorICogUENNQ0lBIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMTk5OCBXZXJuZXIgS29jaCAoZGQ5am4pCisgKgorICogVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEl0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBkcml2ZXIgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIGZvbGxvd2luZyBsaWNlbnNlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoaXMgbGljZW5zZQorICogYXJlIHJlcXVpcmVkIElOU1RFQUQgT0YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgKFRoaXMgY2xhdXNlCisgKiBpcyBuZWNlc3NhcnkgZHVlIHRvIGEgcG90ZW50aWFsIGJhZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBHUEwgYW5kCisgKiB0aGUgcmVzdHJpY3Rpb25zIGNvbnRhaW5lZCBpbiBhIEJTRC1zdHlsZSBjb3B5cmlnaHQuKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZm5kZWYgTUFORklEX0NPTVBBUQorICAjZGVmaW5lIE1BTkZJRF9DT01QQVEgCSAgIDB4MDEzOAorICAjZGVmaW5lIE1BTkZJRF9DT01QQVEyCSAgIDB4MDE4MyAgLyogaXMgdGhpcyBjb3JyZWN0PyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIFR4IGh1bmcgKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkoKDQwMCpIWikvMTAwMCkKKworLyoqKioqKioqKioqKioqKioKKyAqIFNvbWUgY29uc3RhbnRzIHVzZWQgdG8gYWNjZXNzIHRoZSBoYXJkd2FyZQorICovCisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgYW5kIHZhbHVlIGNvbnN0YW5zICovCisjZGVmaW5lIFhJUkNSRUdfQ1IgIDAJLyogQ29tbWFuZCByZWdpc3RlciAod3IpICovCitlbnVtIHhpcmNfY3IgeworICAgIFRyYW5zbWl0UGFja2V0ID0gMHgwMSwKKyAgICBTb2Z0UmVzZXQgPSAweDAyLAorICAgIEVuYWJsZUludHIgPSAweDA0LAorICAgIEZvcmNlSW50ciAgPSAweDA4LAorICAgIENsZWFyVHhGSUZPID0gMHgxMCwKKyAgICBDbGVhclJ4T3ZydW4gPSAweDIwLAorICAgIFJlc3RhcnRUeAkgPSAweDQwCit9OworI2RlZmluZSBYSVJDUkVHX0VTUiAwCS8qIEV0aGVybmV0IHN0YXR1cyByZWdpc3RlciAocmQpICovCitlbnVtIHhpcmNfZXNyIHsKKyAgICBGdWxsUGt0UmN2ZCA9IDB4MDEsIC8qIGZ1bGwgcGFja2V0IGluIHJlY2VpdmUgYnVmZmVyICovCisgICAgUGt0UmVqZWN0ZWQgPSAweDA0LCAvKiBhIHBhY2tldCBoYXMgYmVlbiByZWplY3RlZCAqLworICAgIFR4UGt0UGVuZCA9IDB4MDgsCS8qIFRYIFBhY2tldCBQZW5kaW5nICovCisgICAgSW5jb3JQb2xhcml0eSA9IDB4MTAsCisgICAgTWVkaWFTZWxlY3QgPSAweDIwCS8qIHNldCBpZiBUUCwgY2xlYXIgaWYgQVVJICovCit9OworI2RlZmluZSBYSVJDUkVHX1BSICAxCS8qIFBhZ2UgUmVnaXN0ZXIgc2VsZWN0ICovCisjZGVmaW5lIFhJUkNSRUdfRURQIDQJLyogRXRoZXJuZXQgRGF0YSBQb3J0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhJUkNSRUdfSVNSIDYJLyogRXRoZXJuZXQgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworZW51bSB4aXJjX2lzciB7CisgICAgVHhCdWZPdnIgPSAweDAxLAkvKiBUWCBCdWZmZXIgT3ZlcmZsb3cgKi8KKyAgICBQa3RUeGVkICA9IDB4MDIsCS8qIFBhY2tldCBUcmFuc21pdHRlZCAqLworICAgIE1BQ0ludHIgID0gMHgwNCwJLyogTUFDIEludGVycnVwdCBvY2N1cnJlZCAqLworICAgIFR4UmVzR3JhbnQgPSAweDA4LAkvKiBUeCBSZXNlcnZhdGlvbiBHcmFudGVkICovCisgICAgUnhGdWxsUGt0ID0gMHgyMCwJLyogUnggRnVsbCBQYWNrZXQgKi8KKyAgICBSeFBrdFJlaiAgPSAweDQwLAkvKiBSeCBQYWNrZXQgUmVqZWN0ZWQgKi8KKyAgICBGb3JjZWRJbnRyPSAweDgwCS8qIEZvcmNlZCBJbnRlcnJ1cHQgKi8KK307CisjZGVmaW5lIFhJUkNSRUcxX0lNUjAgMTIgLyogRXRoZXJuZXQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKG9uIHBhZ2UgMSkqLworI2RlZmluZSBYSVJDUkVHMV9JTVIxIDEzCisjZGVmaW5lIFhJUkNSRUcwX1RTTyAgOCAgLyogVHJhbnNtaXQgU3BhY2UgT3BlbiBSZWdpc3RlciAob24gcGFnZSAwKSovCisjZGVmaW5lIFhJUkNSRUcwX1RSUyAgMTAgLyogVHJhbnNtaXQgcmVzZXJ2YXRpb24gU2l6ZSBSZWdpc3RlciAocGFnZSAwKSovCisjZGVmaW5lIFhJUkNSRUcwX0RPICAgMTIgLyogRGF0YSBPZmZzZXQgUmVnaXN0ZXIgKHBhZ2UgMCkgKHdyKSAqLworI2RlZmluZSBYSVJDUkVHMF9SU1IgIDEyIC8qIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyIChwYWdlIDApIChyZCkgKi8KK2VudW0geGlyY19yc3IgeworICAgIFBoeVBrdCA9IDB4MDEsCS8qIHNldDpwaHlzaWNhbCBwYWNrZXQsIGNsZWFyOiBtdWx0aWNhc3QgcGFja2V0ICovCisgICAgQnJkY3N0UGt0ID0gMHgwMiwJLyogc2V0IGlmIGl0IGlzIGEgYnJvYWRjYXN0IHBhY2tldCAqLworICAgIFBrdFRvb0xvbmcgPSAweDA0LAkvKiBzZXQgaWYgcGFja2V0IGxlbmd0aCA+IDE1MTggKi8KKyAgICBBbGlnbkVyciA9IDB4MTAsCS8qIGluY29ycmVjdCBDUkMgYW5kIGxhc3Qgb2N0ZXQgbm90IGNvbXBsZXRlICovCisgICAgQ1JDRXJyID0gMHgyMCwJLyogaW5jb3JyZWN0IENSQyBhbmQgbGFzdCBvY3RldCBpcyBjb21wbGV0ZSAqLworICAgIFBrdFJ4T2sgPSAweDgwCS8qIHJlY2VpdmVkIG9rICovCit9OworI2RlZmluZSBYSVJDUkVHMF9QVFIgMTMgLyogcGFja2V0cyB0cmFuc21pdHRlZCByZWdpc3RlciAocmQpICovCisjZGVmaW5lIFhJUkNSRUcwX1JCQyAxNCAvKiByZWNlaXZlIGJ5dGUgY291bnQgcmVnc2lzdGVyIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzFfRUNSIDE0IC8qIGV0aGVybmV0IGNvbmZpZ3VyYXRpb25uIHJlZ2lzdGVyICovCitlbnVtIHhpcmNfZWNyIHsKKyAgICBGdWxsRHVwbGV4ID0gMHgwNCwJLyogZW5hYmxlIGZ1bGwgZHVwbGV4IG1vZGUgKi8KKyAgICBMb25nVFBNb2RlID0gMHgwOCwJLyogYWRqdXN0IGZvciBsb25nZXIgbGVuZ3RocyBvZiBUUCBjYWJsZSAqLworICAgIERpc2FibGVQb2xDb3IgPSAweDEwLC8qIGRpc2FibGUgYXV0byBwb2xhcml0eSBjb3JyZWN0aW9uICovCisgICAgRGlzYWJsZUxpbmtQdWxzZSA9IDB4MjAsIC8qIGRpc2FibGUgbGluayBwdWxzZSBnZW5lcmF0aW9uICovCisgICAgRGlzYWJsZUF1dG9UeCA9IDB4NDAsIC8qIGRpc2FibGUgYXV0by10cmFuc21pdCAqLworfTsKKyNkZWZpbmUgWElSQ1JFRzJfUkJTIDgJLyogcmVjZWl2ZSBidWZmZXIgc3RhcnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzJfTEVEIDEwIC8qIExFRCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisvKiB2YWx1ZXMgZm9yIHRoZSBsZWRzOiAgICBCaXRzIDItMCBmb3IgbGVkIDEKKyAqICAwIGRpc2FibGVkCQkgICBCaXRzIDUtMyBmb3IgbGVkIDIKKyAqICAxIGNvbGxpc2lvbgorICogIDIgbm9uY29sbGlzaW9uCisgKiAgMyBsaW5rX2RldGVjdGVkCisgKiAgNCBpbmNvcl9wb2xhcml0eQorICogIDUgamFiYmVyCisgKiAgNiBhdXRvX2Fzc2VydGlvbgorICogIDcgcnhfdHhfYWN0aXZpdHkKKyAqLworI2RlZmluZSBYSVJDUkVHMl9NU1IgMTIgLyogTW9oYXdrIHNwZWNpZmljIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWElSQ1JFRzRfR1BSMCA4IC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAwICovCisjZGVmaW5lIFhJUkNSRUc0X0dQUjEgOSAvKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBYSVJDUkVHMl9HUFIyIDEzIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAyIChwYWdlMiEpKi8KKyNkZWZpbmUgWElSQ1JFRzRfQk9WIDEwIC8qIEJvbmRpbmcgVmVyc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBYSVJDUkVHNF9MTUEgMTIgLyogTG9jYWwgTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzRfTE1EIDE0IC8qIExvY2FsIE1lbW9yeSBEYXRhIFBvcnQgKi8KKy8qIE1BQyByZWdpc3RlciBjYW4gb25seSBieSBhY2Nlc3NlZCB3aXRoIDggYml0IG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX0NNRDAgOCAgICAvKiBDb21tYW5kIFJlZ2lzdGVyICh3cikgKi8KK2VudW0geGlyY19jbWQgeyAJICAgIC8qIENvbW1hbmRzICovCisgICAgVHJhbnNtaXQgPSAweDAxLAorICAgIEVuYWJsZVJlY3YgPSAweDA0LAorICAgIERpc2FibGVSZWN2ID0gMHgwOCwKKyAgICBBYm9ydCA9IDB4MTAsCisgICAgT25saW5lID0gMHgyMCwKKyAgICBJbnRyQWNrID0gMHg0MCwKKyAgICBPZmZsaW5lID0gMHg4MAorfTsKKyNkZWZpbmUgWElSQ1JFRzVfUkhTQTAJMTAgIC8qIFJ4IEhvc3QgU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBYSVJDUkVHNDBfUlhTVDAgOSAgIC8qIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhJUkNSRUc0MF9UWFNUMCAxMSAgLyogVHJhbnNtaXQgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1RYU1QxIDEyICAvKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgMTAgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1JNQVNLMCAxMyAgLyogUmVjZWl2ZSBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFhJUkNSRUc0MF9UTUFTSzAgMTQgIC8qIFRyYW5zbWl0IE1hc2sgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSVJDUkVHNDBfVE1BU0sxIDE1ICAvKiBUcmFuc21pdCBNYXNrIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgWElSQ1JFRzQyX1NXQzAJOCAgIC8qIFNvZnR3YXJlIENvbmZpZ3VyYXRpb24gMCAqLworI2RlZmluZSBYSVJDUkVHNDJfU1dDMQk5ICAgLyogU29mdHdhcmUgQ29uZmlndXJhdGlvbiAxICovCisjZGVmaW5lIFhJUkNSRUc0Ml9CT0MJMTAgIC8qIEJhY2stT2ZmIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgWElSQ1JFRzQ0X1REUjAJOCAgIC8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgMCAqLworI2RlZmluZSBYSVJDUkVHNDRfVERSMQk5ICAgLyogVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSAxICovCisjZGVmaW5lIFhJUkNSRUc0NF9SWEJDX0xPIDEwIC8qIFJ4IEJ5dGUgQ291bnQgMCAocmQpICovCisjZGVmaW5lIFhJUkNSRUc0NF9SWEJDX0hJIDExIC8qIFJ4IEJ5dGUgQ291bnQgMSAocmQpICovCisjZGVmaW5lIFhJUkNSRUc0NV9SRVYJIDE1IC8qIFJldmlzaW9uIFJlZ2lzdGVyIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzUwX0lBCTggICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgKDgtMTMpICovCisKK3N0YXRpYyBjaGFyICppZl9uYW1lc1tdID0geyAiQXV0byIsICIxMEJhc2VUIiwgIjEwQmFzZTIiLCAiQVVJIiwgIjEwMEJhc2VUIiB9OworCisvKioqKioqKioqKioqKioqKgorICogQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAqIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgKiBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAqIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICogbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorICovCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0RCR19YSVJDIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgS0RCR19YSVJDIEtFUk5fREVCVUcgICAieGlyYzJwc19jczogIgorI2RlZmluZSBLRVJSX1hJUkMgS0VSTl9FUlIgICAgICJ4aXJjMnBzX2NzOiAiCisjZGVmaW5lIEtXUk5fWElSQyBLRVJOX1dBUk5JTkcgInhpcmMycHNfY3M6ICIKKyNkZWZpbmUgS05PVF9YSVJDIEtFUk5fTk9USUNFICAieGlyYzJwc19jczogIgorI2RlZmluZSBLSU5GX1hJUkMgS0VSTl9JTkZPICAgICJ4aXJjMnBzX2NzOiAiCisKKy8qIGNhcmQgdHlwZXMgKi8KKyNkZWZpbmUgWElSX1VOS05PV04gIDAJLyogdW5rbm93bjogbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBYSVJfQ0UJICAgICAxCS8qIChwcm9kaWQgMSkgZGlmZmVyZW50IGhhcmR3YXJlOiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DRTIgICAgICAyCS8qIChwcm9kaWQgMikgKi8KKyNkZWZpbmUgWElSX0NFMyAgICAgIDMJLyogKHByb2RpZCAzKSAqLworI2RlZmluZSBYSVJfQ0VNICAgICAgNAkvKiAocHJvZGlkIDEpIGRpZmZlcmVudCBoYXJkd2FyZTogbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBYSVJfQ0VNMiAgICAgNQkvKiAocHJvZGlkIDIpICovCisjZGVmaW5lIFhJUl9DRU0zICAgICA2CS8qIChwcm9kaWQgMykgKi8KKyNkZWZpbmUgWElSX0NFTTMzICAgIDcJLyogKHByb2RpZCA0KSAqLworI2RlZmluZSBYSVJfQ0VNNTZNICAgOAkvKiAocHJvZGlkIDUpICovCisjZGVmaW5lIFhJUl9DRU01NiAgICA5CS8qIChwcm9kaWQgNikgKi8KKyNkZWZpbmUgWElSX0NNMjggICAgMTAJLyogKHByb2RpZCAzKSBtb2RlbSBvbmx5OiBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKyNkZWZpbmUgWElSX0NNMzMgICAgMTEJLyogKHByb2RpZCA0KSBtb2RlbSBvbmx5OiBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKyNkZWZpbmUgWElSX0NNNTYgICAgMTIJLyogKHByb2RpZCA1KSBtb2RlbSBvbmx5OiBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKyNkZWZpbmUgWElSX0NHCSAgICAxMwkvKiAocHJvZGlkIDEpIEdTTSBtb2RlbSBvbmx5OiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DQkUgICAgIDE0CS8qIChwcm9kaWQgMSkgY2FyZGJ1cyBldGhlcm5ldDogbm90IHN1cHBvcnRlZCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9ERVNDUklQVElPTigiWGlyY29tIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworSU5UX01PRFVMRV9QQVJNKGlmX3BvcnQsCTApOworSU5UX01PRFVMRV9QQVJNKGZ1bGxfZHVwbGV4LAkwKTsKK0lOVF9NT0RVTEVfUEFSTShkb19zb3VuZCwgCTEpOworSU5UX01PRFVMRV9QQVJNKGxvY2t1cF9oYWNrLAkwKTsgIC8qIGFudGkgbG9ja3VwIGhhY2sgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFdlIGRvIG5vdCBwcm9jZXNzIG1vcmUgdGhhbiB0aGVzZSBudW1iZXIgb2YgYnl0ZXMgZHVyaW5nIG9uZQorICogaW50ZXJydXB0LiAoT2YgY291cnNlIHdlIHJlY2VpdmUgY29tcGxldGUgcGFja2V0cywgc28gdGhpcyBpcyBub3QKKyAqIGFuIGV4YWN0IHZhbHVlKS4KKyAqIFNvbWV0aGluZyBiZXR3ZWVuIDIwMDAuLjIyMDAwOyBmaXJzdCB2YWx1ZSBnaXZlcyBiZXN0IGludGVycnVwdCBsYXRlbmN5LAorICogdGhlIHNlY29uZCBlbmFibGVzIHRoZSB1c2FnZSBvZiB0aGUgY29tcGxldGUgb24tY2hpcCBidWZmZXIuIFdlIHVzZSB0aGUKKyAqIGhpZ2ggdmFsdWUgYXMgdGhlIGluaXRpYWwgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBtYXhyeF9ieXRlcyA9IDIyMDAwOworCisvKiBNSUkgbWFuYWdlbWVudCBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBtaWlfaWRsZShraW9fYWRkcl90IGlvYWRkcik7CitzdGF0aWMgdm9pZCBtaWlfcHV0Yml0KGtpb19hZGRyX3QgaW9hZGRyLCB1bnNpZ25lZCBkYXRhKTsKK3N0YXRpYyBpbnQgIG1paV9nZXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIpOworc3RhdGljIHZvaWQgbWlpX3diaXRzKGtpb19hZGRyX3QgaW9hZGRyLCB1bnNpZ25lZCBkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBtaWlfcmQoa2lvX2FkZHJfdCBpb2FkZHIsIHVfY2hhciBwaHlhZGRyLCB1X2NoYXIgcGh5cmVnKTsKK3N0YXRpYyB2b2lkIG1paV93cihraW9fYWRkcl90IGlvYWRkciwgdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcsCisJCSAgIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pOworCisvKgorICogVGhlIGV2ZW50KCkgZnVuY3Rpb24gaXMgdGhpcyBkcml2ZXIncyBDYXJkIFNlcnZpY2VzIGV2ZW50IGhhbmRsZXIuCisgKiBJdCB3aWxsIGJlIGNhbGxlZCBieSBDYXJkIFNlcnZpY2VzIHdoZW4gYW4gYXBwcm9wcmlhdGUgY2FyZCBzdGF0dXMKKyAqIGV2ZW50IGlzIHJlY2VpdmVkLiAgVGhlIGNvbmZpZygpIGFuZCByZWxlYXNlKCkgZW50cnkgcG9pbnRzIGFyZQorICogdXNlZCB0byBjb25maWd1cmUgb3IgcmVsZWFzZSBhIHNvY2tldCwgaW4gcmVzcG9uc2UgdG8gY2FyZCBpbnNlcnRpb24KKyAqIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5IGFyZSBpbnZva2VkIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIuCisgKi8KKworc3RhdGljIGludCBoYXNfY2UyX3N0cmluZyhkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgdm9pZCB4aXJjMnBzX2NvbmZpZyhkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgdm9pZCB4aXJjMnBzX3JlbGVhc2UoZGV2X2xpbmtfdCAqIGxpbmspOworc3RhdGljIGludCB4aXJjMnBzX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKTsKKworLyoqKioqKioqKioqKioqKioKKyAqIFRoZSBhdHRhY2goKSBhbmQgZGV0YWNoKCkgZW50cnkgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveQorICogImluc3RhbmNlcyIgb2YgdGhlIGRyaXZlciwgd2hlcmUgZWFjaCBpbnN0YW5jZSByZXByZXNlbnRzIGV2ZXJ5dGhpbmcKKyAqIG5lZWRlZCB0byBtYW5hZ2Ugb25lIGFjdHVhbCBQQ01DSUEgY2FyZC4KKyAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqeGlyYzJwc19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCB4aXJjMnBzX2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKioqKioqKioqKioqKgorICogWW91J2xsIGFsc28gbmVlZCB0byBwcm90b3R5cGUgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGFjdHVhbGx5CisgKiBiZSB1c2VkIHRvIHRhbGsgdG8geW91ciBkZXZpY2UuICBTZWUgJ3BjbWVtX2NzJyBmb3IgYSBnb29kIGV4YW1wbGUKKyAqIG9mIGEgZnVsbHkgc2VsZi1zdWZmaWNpZW50IGRyaXZlcjsgdGhlIG90aGVyIGRyaXZlcnMgcmVseSBtb3JlIG9yCisgKiBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHhpcmMycHNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKgorICogVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICogZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KKyAqIGRhdGFiYXNlLgorICovCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gInhpcmMycHNfY3MiOworCisvKioqKioqKioqKioqKioqKgorICogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgZGV2aWNlLiAgRWFjaCBhY3R1YWwKKyAqIFBDTUNJQSBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQKKyAqIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyAqCisgKiBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUKKyAqIG1lbW9yeSBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yCisgKiBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisgKi8KKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKioqKioqKioqKioqKioqKgorICogQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAqIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgKiAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgKiBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisgKgorICogQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICogb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAqIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICogbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICogbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICogaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgKiBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAqIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorICovCisKK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CisgICAgZGV2X2xpbmtfdCBsaW5rOworICAgIGRldl9ub2RlX3Qgbm9kZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBpbnQgY2FyZF90eXBlOworICAgIGludCBwcm9iZV9wb3J0OworICAgIGludCBzaWxpY29uOyAvKiBzaWxpY29uIHJldmlzaW9uLiAwPW9sZCBDRTIsIDE9U2NpcHBlciwgND1Nb2hhd2sgKi8KKyAgICBpbnQgbW9oYXdrOyAgLyogYSBDRTMgdHlwZSBjYXJkICovCisgICAgaW50IGRpbmdvOwkgLyogYSBDRU01NiB0eXBlIGNhcmQgKi8KKyAgICBpbnQgbmV3X21paTsgLyogaGFzIGZ1bGwgMTBiYXNlVC8xMDBiYXNlVCBNSUkgKi8KKyAgICBpbnQgbW9kZW07CSAvKiBpcyBhIG11bHRpIGZ1bmN0aW9uIGNhcmQgKGkuZSB3aXRoIGEgbW9kZW0pICovCisgICAgdm9pZCBfX2lvbWVtICpkaW5nb19jY3I7IC8qIG9ubHkgdXNlZCBmb3IgQ0VNNTYgY2FyZHMgKi8KKyAgICB1bnNpZ25lZCBsYXN0X3B0cl92YWx1ZTsgLyogbGFzdCBwYWNrZXRzIHRyYW5zbWl0dGVkIHZhbHVlICovCisgICAgY29uc3QgY2hhciAqbWFuZl9zdHI7Cit9IGxvY2FsX2luZm9fdDsKKworLyoqKioqKioqKioqKioqKioKKyAqIFNvbWUgbW9yZSBwcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgZG9fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9hZGRyZXNzZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNldF9jYXJkX3R5cGUoZGV2X2xpbmtfdCAqbGluaywgY29uc3Qgdm9pZCAqcyk7CitzdGF0aWMgaW50IGRvX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgaW50IGRvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgdm9pZCBoYXJkcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnVsbCk7CitzdGF0aWMgaW50IGluaXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG9fcG93ZXJkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBkb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKj09PT09PT09PT09PT09PSBIZWxwZXIgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludAorZmlyc3RfdHVwbGUoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkpID09IDAgJiYKKwkJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpID09IDApCisJCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbmV4dF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgdHVwbGUpKSA9PSAwICYmCisJCQkoZXJyID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSA9PSAwKQorCQllcnIgPSBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgU2VsZWN0UGFnZShwZ25yKSAgIG91dGIoKHBnbnIpLCBpb2FkZHIgKyBYSVJDUkVHX1BSKQorI2RlZmluZSBHZXRCeXRlKHJlZykJICAgKCh1bnNpZ25lZClpbmIoaW9hZGRyICsgKHJlZykpKQorI2RlZmluZSBHZXRXb3JkKHJlZykJICAgKCh1bnNpZ25lZClpbncoaW9hZGRyICsgKHJlZykpKQorI2RlZmluZSBQdXRCeXRlKHJlZyx2YWx1ZSkgb3V0YigodmFsdWUpLCBpb2FkZHIrKHJlZykpCisjZGVmaW5lIFB1dFdvcmQocmVnLHZhbHVlKSBvdXR3KCh2YWx1ZSksIGlvYWRkcisocmVnKSkKKworLyo9PT09PT0gRnVuY3Rpb25zIHVzZWQgZm9yIGRlYnVnZ2luZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIGRlZmluZWQoUENNQ0lBX0RFQlVHKSAmJiAwIC8qIHJlYWRpbmcgcmVncyBtYXkgY2hhbmdlIHN5c3RlbSBzdGF0dXMgKi8KK3N0YXRpYyB2b2lkCitQcmludFJlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAocGNfZGVidWcgPiAxKSB7CisJaW50IGksIHBhZ2U7CisKKwlwcmludGsoS0RCR19YSVJDICJSZWdpc3RlciAgY29tbW9uOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCSAgICBwcmludGsoIiAlMi4yeCIsIEdldEJ5dGUoaSkpOworCXByaW50aygiXG4iKTsKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDw9IDg7IHBhZ2UrKykgeworCSAgICBwcmludGsoS0RCR19YSVJDICJSZWdpc3RlciBwYWdlICUyeDogIiwgcGFnZSk7CisJICAgIFNlbGVjdFBhZ2UocGFnZSk7CisJICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIEdldEJ5dGUoaSkpOworCSAgICBwcmludGsoIlxuIik7CisJfQorCWZvciAocGFnZT0weDQwIDsgcGFnZSA8PSAweDVmOyBwYWdlKyspIHsKKwkgICAgaWYgKHBhZ2UgPT0gMHg0MyB8fCAocGFnZSA+PSAweDQ2ICYmIHBhZ2UgPD0gMHg0ZikKKwkJfHwgKHBhZ2UgPj0gMHg1MSAmJiBwYWdlIDw9MHg1ZSkpCisJCWNvbnRpbnVlOworCSAgICBwcmludGsoS0RCR19YSVJDICJSZWdpc3RlciBwYWdlICUyeDogIiwgcGFnZSk7CisJICAgIFNlbGVjdFBhZ2UocGFnZSk7CisJICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIEdldEJ5dGUoaSkpOworCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KKworLyo9PT09PT09PT09PT09PSBNSUkgTWFuYWdlbWVudCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioKKyAqIFR1cm4gYXJvdW5kIGZvciByZWFkCisgKi8KK3N0YXRpYyB2b2lkCittaWlfaWRsZShraW9fYWRkcl90IGlvYWRkcikKK3sKKyAgICBQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MDR8MCk7IC8qIGRyaXZlIE1EQ0sgbG93ICovCisgICAgdWRlbGF5KDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgMHgwNHwxKTsgLyogYW5kIGRyaXZlIE1EQ0sgaGlnaCAqLworICAgIHVkZWxheSgxKTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFdyaXRlIGEgYml0IHRvIE1ESS9PCisgKi8KK3N0YXRpYyB2b2lkCittaWlfcHV0Yml0KGtpb19hZGRyX3QgaW9hZGRyLCB1bnNpZ25lZCBkYXRhKQoreworICAjaWYgMQorICAgIGlmIChkYXRhKSB7CisJUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDBjfDJ8MCk7IC8qIHNldCBNRElPICovCisJdWRlbGF5KDEpOworCVB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgMHgwY3wyfDEpOyAvKiBhbmQgZHJpdmUgTURDSyBoaWdoICovCisJdWRlbGF5KDEpOworICAgIH0gZWxzZSB7CisJUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDBjfDB8MCk7IC8qIGNsZWFyIE1ESU8gKi8KKwl1ZGVsYXkoMSk7CisJUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDBjfDB8MSk7IC8qIGFuZCBkcml2ZSBNRENLIGhpZ2ggKi8KKwl1ZGVsYXkoMSk7CisgICAgfQorICAjZWxzZQorICAgIGlmIChkYXRhKSB7CisJUHV0V29yZChYSVJDUkVHMl9HUFIyLTEsIDB4MGUwZSk7CisJdWRlbGF5KDEpOworCVB1dFdvcmQoWElSQ1JFRzJfR1BSMi0xLCAweDBmMGYpOworCXVkZWxheSgxKTsKKyAgICB9IGVsc2UgeworCVB1dFdvcmQoWElSQ1JFRzJfR1BSMi0xLCAweDBjMGMpOworCXVkZWxheSgxKTsKKwlQdXRXb3JkKFhJUkNSRUcyX0dQUjItMSwgMHgwZDBkKTsKKwl1ZGVsYXkoMSk7CisgICAgfQorICAjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIEdldCBhIGJpdCBmcm9tIE1ESS9PCisgKi8KK3N0YXRpYyBpbnQKK21paV9nZXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIpCit7CisgICAgdW5zaWduZWQgZDsKKworICAgIFB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgNHwwKTsgLyogZHJpdmUgTURDSyBsb3cgKi8KKyAgICB1ZGVsYXkoMSk7CisgICAgZCA9IEdldEJ5dGUoWElSQ1JFRzJfR1BSMik7IC8qIHJlYWQgTURJTyAqLworICAgIFB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgNHwxKTsgLyogZHJpdmUgTURDSyBoaWdoIGFnYWluICovCisgICAgdWRlbGF5KDEpOworICAgIHJldHVybiBkICYgMHgyMDsgLyogcmVhZCBNRElPICovCit9CisKK3N0YXRpYyB2b2lkCittaWlfd2JpdHMoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pCit7CisgICAgdW5zaWduZWQgbSA9IDEgPDwgKGxlbi0xKTsKKyAgICBmb3IgKDsgbTsgbSA+Pj0gMSkKKwltaWlfcHV0Yml0KGlvYWRkciwgZGF0YSAmIG0pOworfQorCitzdGF0aWMgdW5zaWduZWQKK21paV9yZChraW9fYWRkcl90IGlvYWRkciwJdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgZGF0YT0wLCBtOworCisgICAgU2VsZWN0UGFnZSgyKTsKKyAgICBmb3IgKGk9MDsgaSA8IDMyOyBpKyspCQkvKiAzMiBiaXQgcHJlYW1ibGUgKi8KKwltaWlfcHV0Yml0KGlvYWRkciwgMSk7CisgICAgbWlpX3diaXRzKGlvYWRkciwgMHgwNiwgNCk7IAkvKiBTdGFydCBhbmQgb3Bjb2RlIGZvciByZWFkICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5YWRkciwgNSk7CS8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5cmVnLCA1KTsJLyogUEhZIHJlZ2lzdGVyIHRvIHJlYWQgKi8KKyAgICBtaWlfaWRsZShpb2FkZHIpOwkJCS8qIHR1cm4gYXJvdW5kICovCisgICAgbWlpX2dldGJpdChpb2FkZHIpOworCisgICAgZm9yIChtID0gMTw8MTU7IG07IG0gPj49IDEpCisJaWYgKG1paV9nZXRiaXQoaW9hZGRyKSkKKwkgICAgZGF0YSB8PSBtOworICAgIG1paV9pZGxlKGlvYWRkcik7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCittaWlfd3Ioa2lvX2FkZHJfdCBpb2FkZHIsIHVfY2hhciBwaHlhZGRyLCB1X2NoYXIgcGh5cmVnLCB1bnNpZ25lZCBkYXRhLCBpbnQgbGVuKQoreworICAgIGludCBpOworCisgICAgU2VsZWN0UGFnZSgyKTsKKyAgICBmb3IgKGk9MDsgaSA8IDMyOyBpKyspCQkvKiAzMiBiaXQgcHJlYW1ibGUgKi8KKwltaWlfcHV0Yml0KGlvYWRkciwgMSk7CisgICAgbWlpX3diaXRzKGlvYWRkciwgMHgwNSwgNCk7IAkvKiBTdGFydCBhbmQgb3Bjb2RlIGZvciB3cml0ZSAqLworICAgIG1paV93Yml0cyhpb2FkZHIsIHBoeWFkZHIsIDUpOwkvKiBQSFkgYWRkcmVzcyB0byBiZSBhY2Nlc3NlZCAqLworICAgIG1paV93Yml0cyhpb2FkZHIsIHBoeXJlZywgNSk7CS8qIFBIWSBSZWdpc3RlciB0byB3cml0ZSAqLworICAgIG1paV9wdXRiaXQoaW9hZGRyLCAxKTsJCS8qIHR1cm4gYXJvdW5kICovCisgICAgbWlpX3B1dGJpdChpb2FkZHIsIDApOworICAgIG1paV93Yml0cyhpb2FkZHIsIGRhdGEsIGxlbik7CS8qIEFuZCB3cml0ZSB0aGUgZGF0YSAqLworICAgIG1paV9pZGxlKGlvYWRkcik7Cit9CisKKy8qPT09PT09PT09PT09PSBNYWluIGJ1bGsgb2YgZnVuY3Rpb25zCT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKgorICogeGlyYzJwc19hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICogbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgKiB3aXRoIENhcmQgU2VydmljZXMuCisgKgorICogVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgKiBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICogY2FyZCBpbnNlcnRpb24gZXZlbnQuCisgKi8KKworc3RhdGljIGRldl9saW5rX3QgKgoreGlyYzJwc19hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbDsKKyAgICBpbnQgZXJyOworCisgICAgREVCVUcoMCwgImF0dGFjaCgpXG4iKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKGxvY2FsX2luZm9fdCkpOworICAgIGlmICghZGV2KQorCSAgICByZXR1cm4gTlVMTDsKKyAgICBsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZsb2NhbC0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworICAgIGxpbmstPmlycS5IYW5kbGVyID0geGlyYzJwc19pbnRlcnJ1cHQ7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCisgICAgLyogRmlsbCBpbiBjYXJkIHNwZWNpZmljIGVudHJpZXMgKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZG9fc3RhcnRfeG1pdDsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmZG9fY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmRvX2dldF9zdGF0czsKKyAgICBkZXYtPmRvX2lvY3RsID0gJmRvX2lvY3RsOworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBkZXYtPm9wZW4gPSAmZG9fb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmZG9fc3RvcDsKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBkb190eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnhpcmMycHNfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgaWYgKChlcnIgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKSkpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCBlcnIpOworCXhpcmMycHNfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiB4aXJjMnBzX2F0dGFjaCAqLworCisvKioqKioqKioqKioqKioqKgorICogIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgKiAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgKiAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAqICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgKi8KKworc3RhdGljIHZvaWQKK3hpcmMycHNfZGV0YWNoKGRldl9saW5rX3QgKiBsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJkZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykKKwkgICAgYnJlYWs7CisgICAgaWYgKCEqbGlua3ApIHsKKwlERUJVRygwLCAiZGV0YWNoKDB4JXApOiBkZXZfbGluayBsb3N0XG4iLCBsaW5rKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CisgICAgICogYWN0dWFsbHkgZGVsZXRlIGl0IHlldC4JSW5zdGVhZCwgaXQgaXMgbWFya2VkIHNvIHRoYXQgd2hlbgorICAgICAqIHRoZSByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorICAgICAqIGRldGFjaCgpLgorICAgICAqLworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJeGlyYzJwc19yZWxlYXNlKGxpbmspOworCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGl0ICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiB4aXJjMnBzX2RldGFjaCAqLworCisvKioqKioqKioqKioqKioqKgorICogRGV0ZWN0IHRoZSB0eXBlIG9mIHRoZSBjYXJkLiBzIGlzIHRoZSBidWZmZXIgd2l0aCB0aGUgZGF0YSBvZiB0dXBsZSAweDIwCisgKiBSZXR1cm5zOiAwIDo9IG5vdCBzdXBwb3J0ZWQKKyAqCQkgICAgICAgbWVkaWFpZD0xMSBhbmQgcHJvZGlkPTQ3CisgKiBNZWRpYS1JZCBiaXRzOgorICogIEV0aGVybmV0CSAgICAweDAxCisgKiAgVG9rZW5yaW5nCSAgICAweDAyCisgKiAgQXJjbmV0CSAgICAweDA0CisgKiAgV2lyZWxlc3MJICAgIDB4MDgKKyAqICBNb2RlbQkgICAgMHgxMAorICogIEdTTSBvbmx5CSAgICAweDIwCisgKiBQcm9kLUlkIGJpdHM6CisgKiAgUG9ja2V0CSAgICAweDEwCisgKiAgRXh0ZXJuYWwJICAgIDB4MjAKKyAqICBDcmVkaXRjYXJkCSAgICAweDQwCisgKiAgQ2FyZGJ1cwkgICAgMHg4MAorICoKKyAqLworc3RhdGljIGludAorc2V0X2NhcmRfdHlwZShkZXZfbGlua190ICpsaW5rLCBjb25zdCB2b2lkICpzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgdW5zaWduZWQgY2lzcmV2ID0gKChjb25zdCB1bnNpZ25lZCBjaGFyICopcylbMl07CisgICNlbmRpZgorICAgIHVuc2lnbmVkIG1lZGlhaWQ9ICgoY29uc3QgdW5zaWduZWQgY2hhciAqKXMpWzNdOworICAgIHVuc2lnbmVkIHByb2RpZCA9ICgoY29uc3QgdW5zaWduZWQgY2hhciAqKXMpWzRdOworCisgICAgREVCVUcoMCwgImNpc3Jldj0lMDJ4IG1lZGlhaWQ9JTAyeCBwcm9kaWQ9JTAyeFxuIiwKKwkgIGNpc3JldiwgbWVkaWFpZCwgcHJvZGlkKTsKKworICAgIGxvY2FsLT5tb2hhd2sgPSAwOworICAgIGxvY2FsLT5kaW5nbyA9IDA7CisgICAgbG9jYWwtPm1vZGVtID0gMDsKKyAgICBsb2NhbC0+Y2FyZF90eXBlID0gWElSX1VOS05PV047CisgICAgaWYgKCEocHJvZGlkICYgMHg0MCkpIHsKKwlwcmludGsoS05PVF9YSVJDICJPb29wczogTm90IGEgY3JlZGl0Y2FyZFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghKG1lZGlhaWQgJiAweDAxKSkgeworCXByaW50ayhLTk9UX1hJUkMgIk5vdCBhbiBFdGhlcm5ldCBjYXJkXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1lZGlhaWQgJiAweDEwKSB7CisJbG9jYWwtPm1vZGVtID0gMTsKKwlzd2l0Y2gocHJvZGlkICYgMTUpIHsKKwkgIGNhc2UgMTogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRU0gICA7IGJyZWFrOworCSAgY2FzZSAyOiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTTIgIDsgYnJlYWs7CisJICBjYXNlIDM6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNMyAgOyBicmVhazsKKwkgIGNhc2UgNDogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRU0zMyA7IGJyZWFrOworCSAgY2FzZSA1OiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTTU2TTsKKwkJICBsb2NhbC0+bW9oYXdrID0gMTsKKwkJICBicmVhazsKKwkgIGNhc2UgNjoKKwkgIGNhc2UgNzogLyogNyBpcyB0aGUgUmVhbFBvcnQgMTAvNTYgKi8KKwkJICBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTTU2IDsKKwkJICBsb2NhbC0+bW9oYXdrID0gMTsKKwkJICBsb2NhbC0+ZGluZ28gPSAxOworCQkgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCXN3aXRjaChwcm9kaWQgJiAxNSkgeworCSAgY2FzZSAxOiBsb2NhbC0+Y2FyZF90eXBlID0gaGFzX2NlMl9zdHJpbmcobGluayk/IFhJUl9DRTIgOiBYSVJfQ0UgOworCQkgIGJyZWFrOworCSAgY2FzZSAyOiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFMjsgYnJlYWs7CisJICBjYXNlIDM6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0UzOworCQkgIGxvY2FsLT5tb2hhd2sgPSAxOworCQkgIGJyZWFrOworCX0KKyAgICB9CisgICAgaWYgKGxvY2FsLT5jYXJkX3R5cGUgPT0gWElSX0NFIHx8IGxvY2FsLT5jYXJkX3R5cGUgPT0gWElSX0NFTSkgeworCXByaW50ayhLTk9UX1hJUkMgIlNvcnJ5LCB0aGlzIGlzIGFuIG9sZCBDRSBjYXJkXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGxvY2FsLT5jYXJkX3R5cGUgPT0gWElSX1VOS05PV04pCisJcHJpbnRrKEtOT1RfWElSQyAidW5rbm93biBjYXJkIChtZWRpYWlkPSUwMnggcHJvZGlkPSUwMngpXG4iLAorCSAgICAgICBtZWRpYWlkLCBwcm9kaWQpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGVyZSBhcmUgc29tZSBDRTIgY2FyZHMgb3V0IHdoaWNoIGNsYWltIHRvIGJlIGEgQ0UgY2FyZC4KKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIGEgIkNFMiIgaW4gdGhlIDNyZCB2ZXJzaW9uIGZpZWxkLgorICogUmV0dXJuczogdHJ1ZSBpZiB0aGlzIGlzIGEgQ0UyCisgKi8KK3N0YXRpYyBpbnQKK2hhc19jZTJfc3RyaW5nKGRldl9saW5rX3QgKiBsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfY2hhciBidWZbMjU2XTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgaWYgKCFmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAmJiBwYXJzZS52ZXJzaW9uXzEubnMgPiAyKSB7CisJaWYgKHN0cnN0cihwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1syXSwgIkNFMiIpKQorCSAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiB4aXJjMnBzX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICogaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgKiBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkCit4aXJjMnBzX2NvbmZpZyhkZXZfbGlua190ICogbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICBpbnQgZXJyLCBpOworICAgIHVfY2hhciBidWZbNjRdOworICAgIGNpc3RwbF9sYW5fbm9kZV9pZF90ICpub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90KilwYXJzZS5mdW5jZS5kYXRhOworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CisKKyAgICBsb2NhbC0+ZGluZ29fY2NyID0gTlVMTDsKKworICAgIERFQlVHKDAsICJjb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyoKKyAgICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICAgKiByZWdpc3RlcnMuCisgICAgICovCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKworICAgIC8qIElzIHRoaXMgYSB2YWxpZAljYXJkICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKyAgICBpZiAoKGVycj1maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkpIHsKKwlwcmludGsoS05PVF9YSVJDICJtYW5maWQgbm90IGZvdW5kIGluIENJU1xuIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKworICAgIHN3aXRjaChwYXJzZS5tYW5maWQubWFuZikgeworICAgICAgY2FzZSBNQU5GSURfWElSQ09NOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJYaXJjb20iOworCWJyZWFrOworICAgICAgY2FzZSBNQU5GSURfQUNDVE9OOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJBY2N0b24iOworCWJyZWFrOworICAgICAgY2FzZSBNQU5GSURfQ09NUEFROgorICAgICAgY2FzZSBNQU5GSURfQ09NUEFRMjoKKwlsb2NhbC0+bWFuZl9zdHIgPSAiQ29tcGFxIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTUFORklEX0lOVEVMOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJJbnRlbCI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BTkZJRF9UT1NISUJBOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJUb3NoaWJhIjsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcHJpbnRrKEtOT1RfWElSQyAiVW5rbm93biBDYXJkIE1hbnVmYWN0dXJlciBJRDogMHglMDR4XG4iLAorCSAgICAgICAodW5zaWduZWQpcGFyc2UubWFuZmlkLm1hbmYpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgREVCVUcoMCwgImZvdW5kICVzIGNhcmRcbiIsIGxvY2FsLT5tYW5mX3N0cik7CisKKyAgICBpZiAoIXNldF9jYXJkX3R5cGUobGluaywgYnVmKSkgeworCXByaW50ayhLTk9UX1hJUkMgInRoaXMgY2FyZCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgLyogZ2V0IGNvbmZpZ3VyYXRpb24gc3R1ZmYgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIGlmICgoZXJyPWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKSkKKwlnb3RvIGNpc19lcnJvcjsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAgICBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBnZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgQ0lTICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOworICAgIGZvciAoZXJyID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7ICFlcnI7CisJCQkgICAgIGVyciA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpIHsKKwkvKiBPbmNlIEkgc2F3IHR3byBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQgZW50cmllczoKKwkgKiB0aGUgZmlyc3Qgb25lIHdpdGggYSBsZW5ndGggb2YgemVybyB0aGUgc2Vjb25kIGNvcnJlY3QgLQorCSAqIHNvIEkgc2tpcCBhbGwgZW50cmllcyB3aXRoIGxlbmd0aCAwICovCisJaWYgKHBhcnNlLmZ1bmNlLnR5cGUgPT0gQ0lTVFBMX0ZVTkNFX0xBTl9OT0RFX0lECisJICAgICYmICgoY2lzdHBsX2xhbl9ub2RlX2lkX3QgKilwYXJzZS5mdW5jZS5kYXRhKS0+bmIpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyKSB7IC8qIG5vdCBmb3VuZDogdHJ5IHRvIGdldCB0aGUgbm9kZS1pZCBmcm9tIHR1cGxlIDB4ODkgKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDg5OyAgLyogZGF0YSBsYXlvdXQgbG9va3MgbGlrZSB0dXBsZSAweDIyICovCisJaWYgKChlcnIgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSkgPT0gMCAmJgorCQkoZXJyID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSkgPT0gMCkgeworCSAgICBpZiAodHVwbGUuVHVwbGVEYXRhTGVuID09IDggJiYgKmJ1ZiA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQpCisJCW1lbWNweSgmcGFyc2UsIGJ1ZiwgOCk7CisJICAgIGVsc2UKKwkJZXJyID0gLTE7CisJfQorICAgIH0KKyAgICBpZiAoZXJyKSB7IC8qIGFub3RoZXIgdHJ5CShKYW1lcyBMZWhtZXIncyBDRTIgdmVyc2lvbiA0LjEpKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisJZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCQkgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkgeworCSAgICBpZiAocGFyc2UuZnVuY2UudHlwZSA9PSAweDAyICYmIHBhcnNlLmZ1bmNlLmRhdGFbMF0gPT0gMQorCQkmJiBwYXJzZS5mdW5jZS5kYXRhWzFdID09IDYgJiYgdHVwbGUuVHVwbGVEYXRhTGVuID09IDEzKSB7CisJCWJ1ZlsxXSA9IDQ7CisJCW1lbWNweSgmcGFyc2UsIGJ1ZisxLCA4KTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChlcnIpIHsKKwlwcmludGsoS05PVF9YSVJDICJub2RlLWlkIG5vdCBmb3VuZCBpbiBDSVNcbiIpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGE7CisgICAgaWYgKG5vZGVfaWQtPm5iICE9IDYpIHsKKwlwcmludGsoS05PVF9YSVJDICJtYWxmb3JtZWQgbm9kZS1pZCBpbiBDSVNcbiIpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgZm9yIChpPTA7IGkgPCA2OyBpKyspCisJZGV2LT5kZXZfYWRkcltpXSA9IG5vZGVfaWQtPmlkW2ldOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPTEwOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBpZiAobG9jYWwtPm1vZGVtKSB7CisJaW50IHBhc3M7CisKKwlpZiAoZG9fc291bmQpIHsKKwkgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJICAgIGxpbmstPmNvbmYuU3RhdHVzIHw9IENDU1JfQVVESU9fRU5BOworCX0KKwlsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRCA7CisJbGluay0+aW8uTnVtUG9ydHMyID0gODsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWlmIChsb2NhbC0+ZGluZ28pIHsKKwkgICAgLyogVGFrZSB0aGUgTW9kZW0gSU8gcG9ydCBmcm9tIHRoZSBDSVMgYW5kIHNjYW4gZm9yIGEgZnJlZQorCSAgICAgKiBFdGhlcm5ldCBwb3J0ICovCisJICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OyAvKiBubyBNYWtvIHN0dWZmIGFueW1vcmUgKi8KKwkgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJICAgIGZvciAoZXJyID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7ICFlcnI7CisJCQkJIGVyciA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpIHsKKwkJaWYgKGNmLT5pby5ud2luID4gMCAgJiYgIChjZi0+aW8ud2luWzBdLmJhc2UgJiAweGYpID09IDgpIHsKKwkJICAgIGZvciAoaW9hZGRyID0gMHgzMDA7IGlvYWRkciA8IDB4NDAwOyBpb2FkZHIgKz0gMHgxMCkgeworCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleCA7CisJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CisJCQlpZiAoIShlcnI9cGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKSkKKwkJCSAgICBnb3RvIHBvcnRfZm91bmQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE4OworCSAgICAvKiBXZSBkbyAyIHBhc3NlcyBoZXJlOiBUaGUgZmlyc3Qgb25lIHVzZXMgdGhlIHJlZ3VsYXIgbWFwcGluZyBhbmQKKwkgICAgICogdGhlIHNlY29uZCB0cmllcyBhZ2FpbiwgdGhlcmVieSBjb25zaWRlcmluZyB0aGF0IHRoZSAzMiBwb3J0cyBhcmUKKwkgICAgICogbWlycm9yZWQgZXZlcnkgMzIgYnl0ZXMuIEFjdHVhbGx5IHdlIHVzZSBhIG1pcnJvcmVkIHBvcnQgZm9yCisJICAgICAqIHRoZSBNYWtvIGlmIChvbiB0aGUgZmlyc3QgcGFzcykgdGhlIENPUiBiaXQgNSBpcyBzZXQuCisJICAgICAqLworCSAgICBmb3IgKHBhc3M9MDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwkJZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCQkgICAgIGVyciA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpeworCQkgICAgaWYgKGNmLT5pby5ud2luID4gMCAgJiYgIChjZi0+aW8ud2luWzBdLmJhc2UgJiAweGYpID09IDgpeworCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleCA7CisJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBsaW5rLT5pby5CYXNlUG9ydDIKKwkJCQkgICAgKyAocGFzcyA/IChjZi0+aW5kZXggJiAweDIwID8gLTI0OjgpCisJCQkJCSAgICA6IChjZi0+aW5kZXggJiAweDIwID8gICA4Oi0yNCkpOworCQkJaWYgKCEoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSkpCisJCQkgICAgZ290byBwb3J0X2ZvdW5kOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgLyogaWYgc3BlY2lhbCBvcHRpb246CisJICAgICAqIHRyeSB0byBjb25maWd1cmUgYXMgRXRoZXJuZXQgb25seS4KKwkgICAgICogLi4uLiAqLworCX0KKwlwcmludGsoS05PVF9YSVJDICJubyBwb3J0cyBhdmFpbGFibGVcbiIpOworICAgIH0gZWxzZSB7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgfD0gSVJRX1RZUEVfRVhDTFVTSVZFOworCWxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworCWZvciAoaW9hZGRyID0gMHgzMDA7IGlvYWRkciA8IDB4NDAwOyBpb2FkZHIgKz0gMHgxMCkgeworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CisJICAgIGlmICghKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpKQorCQlnb3RvIHBvcnRfZm91bmQ7CisJfQorCWxpbmstPmlvLkJhc2VQb3J0MSA9IDA7IC8qIGxldCBDUyBkZWNpZGUgKi8KKwlpZiAoKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpKSB7CisJICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisgICAgfQorICBwb3J0X2ZvdW5kOgorICAgIGlmIChlcnIpCisJIGdvdG8gY29uZmlnX2Vycm9yOworCisgICAgLyoqKioqKioqKioqKioqKioKKyAgICAgKiBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuCU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgICAgICogYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICAqLworICAgIGlmICgoZXJyPXBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKSkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElSUSwgZXJyKTsKKwlnb3RvIGNvbmZpZ19lcnJvcjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKgorICAgICAqIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgICovCisgICAgaWYgKChlcnI9cGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSkpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RDb25maWd1cmF0aW9uLCBlcnIpOworCWdvdG8gY29uZmlnX2Vycm9yOworICAgIH0KKworICAgIGlmIChsb2NhbC0+ZGluZ28pIHsKKwljb25mX3JlZ190IHJlZzsKKwl3aW5fcmVxX3QgcmVxOworCW1lbXJlcV90IG1lbTsKKworCS8qIFJlc2V0IHRoZSBtb2RlbSdzIEJBUiB0byB0aGUgY29ycmVjdCB2YWx1ZQorCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaW4gdGhlIFJlcXVlc3RDb25maWd1cmF0aW9uIGNhbGwsCisJICogdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZXRoZXJuZXQgcG9ydCAoQmFzZVBvcnQxKSBpcyB3cml0dGVuCisJICogdG8gdGhlIEJBUiByZWdpc3RlcnMgb2YgdGhlIG1vZGVtLgorCSAqLworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0lPQkFTRV8wOworCXJlZy5WYWx1ZSA9IGxpbmstPmlvLkJhc2VQb3J0MiAmIDB4ZmY7CisJaWYgKChlcnIgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGVycik7CisJICAgIGdvdG8gY29uZmlnX2Vycm9yOworCX0KKwlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisJcmVnLk9mZnNldCA9IENJU1JFR19JT0JBU0VfMTsKKwlyZWcuVmFsdWUgPSAobGluay0+aW8uQmFzZVBvcnQyID4+IDgpICYgMHhmZjsKKwlpZiAoKGVyciA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpKSkgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgZXJyKTsKKwkgICAgZ290byBjb25maWdfZXJyb3I7CisJfQorCisJLyogVGhlcmUgaXMgbm8gY29uZmlnIGVudHJ5IGZvciB0aGUgRXRoZXJuZXQgcGFydCB3aGljaAorCSAqIGlzIGF0IDB4MDgwMC4gU28gd2UgYWxsb2NhdGUgYSB3aW5kb3cgaW50byB0aGUgYXR0cmlidXRlCisJICogbWVtb3J5IGFuZCB3cml0ZSBkaXJlY3QgdG8gdGhlIENJUyByZWdpc3RlcnMKKwkgKi8KKwlyZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisJcmVxLkJhc2UgPSByZXEuU2l6ZSA9IDA7CisJcmVxLkFjY2Vzc1NwZWVkID0gMDsKKwlpZiAoKGVyciA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisJbG9jYWwtPmRpbmdvX2NjciA9IGlvcmVtYXAocmVxLkJhc2UsMHgxMDAwKSArIDB4MDgwMDsKKwltZW0uQ2FyZE9mZnNldCA9IDB4MDsKKwltZW0uUGFnZSA9IDA7CisJaWYgKChlcnIgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpKSB7CisJICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgTWFwTWVtUGFnZSwgZXJyKTsKKwkgICAgZ290byBjb25maWdfZXJyb3I7CisJfQorCisJLyogU2V0dXAgdGhlIENDUnM7IHRoZXJlIGFyZSBubyBpbmZvcyBpbiB0aGUgQ0lTIGFib3V0IHRoZSBFdGhlcm5ldAorCSAqIHBhcnQuCisJICovCisJd3JpdGViKDB4NDcsIGxvY2FsLT5kaW5nb19jY3IgKyBDSVNSRUdfQ09SKTsKKwlpb2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJd3JpdGViKGlvYWRkciAmIDB4ZmYJICAsIGxvY2FsLT5kaW5nb19jY3IgKyBDSVNSRUdfSU9CQVNFXzApOworCXdyaXRlYigoaW9hZGRyID4+IDgpJjB4ZmYgLCBsb2NhbC0+ZGluZ29fY2NyICsgQ0lTUkVHX0lPQkFTRV8xKTsKKworICAgICAgI2lmIDAKKwl7CisJICAgIHVfY2hhciB0bXA7CisJICAgIHByaW50ayhLRVJOX0lORk8gIkVDT1I6Iik7CisJICAgIGZvciAoaT0wOyBpIDwgNzsgaSsrKSB7CisJCXRtcCA9IHJlYWRiKGxvY2FsLT5kaW5nb19jY3IgKyBpKjIpOworCQlwcmludGsoIiAlMDJ4IiwgdG1wKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJICAgIHByaW50ayhLRVJOX0lORk8gIkRDT1I6Iik7CisJICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisJCXRtcCA9IHJlYWRiKGxvY2FsLT5kaW5nb19jY3IgKyAweDIwICsgaSoyKTsKKwkJcHJpbnRrKCIgJTAyeCIsIHRtcCk7CisJICAgIH0KKwkgICAgcHJpbnRrKCJcbiIpOworCSAgICBwcmludGsoS0VSTl9JTkZPICJTQ09SOiIpOworCSAgICBmb3IgKGk9MDsgaSA8IDEwOyBpKyspIHsKKwkJdG1wID0gcmVhZGIobG9jYWwtPmRpbmdvX2NjciArIDB4NDAgKyBpKjIpOworCQlwcmludGsoIiAlMDJ4IiwgdG1wKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJfQorICAgICAgI2VuZGlmCisKKwl3cml0ZWIoMHgwMSwgbG9jYWwtPmRpbmdvX2NjciArIDB4MjApOworCXdyaXRlYigweDBjLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyMik7CisJd3JpdGViKDB4MDAsIGxvY2FsLT5kaW5nb19jY3IgKyAweDI0KTsKKwl3cml0ZWIoMHgwMCwgbG9jYWwtPmRpbmdvX2NjciArIDB4MjYpOworCXdyaXRlYigweDAwLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyOCk7CisgICAgfQorCisgICAgLyogVGhlIGlmX3BvcnQgc3ltYm9sIGNhbiBiZSBzZXQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworICAgIGxvY2FsLT5wcm9iZV9wb3J0PTA7CisgICAgaWYgKCFpZl9wb3J0KSB7CisJbG9jYWwtPnByb2JlX3BvcnQgPSBkZXYtPmlmX3BvcnQgPSAxOworICAgIH0gZWxzZSBpZiAoKGlmX3BvcnQgPj0gMSAmJiBpZl9wb3J0IDw9IDIpIHx8CisJICAgICAgIChsb2NhbC0+bW9oYXdrICYmIGlmX3BvcnQ9PTQpKQorCWRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisgICAgZWxzZQorCXByaW50ayhLTk9UX1hJUkMgImludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworCisgICAgLyogd2UgY2FuIG5vdyByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIG5ldCBzdWJzeXN0ZW0gKi8KKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIGlmIChsb2NhbC0+ZGluZ28pCisJZG9fcmVzZXQoZGV2LCAxKTsgLyogYSBrbHVkZ2UgdG8gbWFrZSB0aGUgY2VtNTYgd29yayAqLworCisgICAgbGluay0+ZGV2ID0gJmxvY2FsLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmICgoZXJyPXJlZ2lzdGVyX25ldGRldihkZXYpKSkgeworCXByaW50ayhLTk9UX1hJUkMgInJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGNvbmZpZ19lcnJvcjsKKyAgICB9CisKKyAgICBzdHJjcHkobG9jYWwtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICAvKiBnaXZlIHNvbWUgaW5mb3MgYWJvdXQgdGhlIGhhcmR3YXJlICovCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzOiBwb3J0ICUjM2x4LCBpcnEgJWQsIGh3YWRkciIsCisJIGRldi0+bmFtZSwgbG9jYWwtPm1hbmZfc3RyLCh1X2xvbmcpZGV2LT5iYXNlX2FkZHIsIChpbnQpZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlYyUwMlgiLCBpPyc6JzonICcsIGRldi0+ZGV2X2FkZHJbaV0pOworICAgIHByaW50aygiXG4iKTsKKworICAgIHJldHVybjsKKworICBjb25maWdfZXJyb3I6CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICB4aXJjMnBzX3JlbGVhc2UobGluayk7CisgICAgcmV0dXJuOworCisgIGNpc19lcnJvcjoKKyAgICBwcmludGsoS05PVF9YSVJDICJ1bmFibGUgdG8gcGFyc2UgQ0lTXG4iKTsKKyAgZmFpbHVyZToKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworfSAvKiB4aXJjMnBzX2NvbmZpZyAqLworCisvKioqKioqKioqKioqKioqKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHhpcmMycHNfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgKiBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAqIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZAoreGlyYzJwc19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisKKyAgICBERUJVRygwLCAicmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBpZiAobGluay0+d2luKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKGxvY2FsLT5kaW5nbykKKwkgICAgaW91bm1hcChsb2NhbC0+ZGluZ29fY2NyIC0gMHgwODAwKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKworfSAvKiB4aXJjMnBzX3JlbGVhc2UgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAqIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgKiBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICogdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAqCisgKiBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYSBmbGFnCisgKiB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgKiBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIHRvIG1ha2Ugc3VyZQorICogdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAqLworCitzdGF0aWMgaW50Cit4aXJjMnBzX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIERFQlVHKDAsICJldmVudCglZClcbiIsIChpbnQpZXZlbnQpOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFOgorCURFQlVHKDAsICJyZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwl4aXJjMnBzX2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJZG9fcG93ZXJkb3duKGRldik7CisJICAgIH0KKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJZG9fcmVzZXQoZGV2LDEpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiB4aXJjMnBzX2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKgorICogVGhpcyBpcyB0aGUgSW50ZXJydXB0IHNlcnZpY2Ugcm91dGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAoreGlyYzJwc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIHVfY2hhciBzYXZlZF9wYWdlOworICAgIHVuc2lnbmVkIGJ5dGVzX3JjdmQ7CisgICAgdW5zaWduZWQgaW50X3N0YXR1cywgZXRoX3N0YXR1cywgcnhfc3RhdHVzLCB0eF9zdGF0dXM7CisgICAgdW5zaWduZWQgcnNyLCBwa3RsZW47CisgICAgdWxvbmcgc3RhcnRfdGlja3MgPSBqaWZmaWVzOyAvKiBmaXhtZTogamlmZmllcyByb2xsb3ZlciBldmVyeSA0OTcgZGF5cworCQkJCSAgKiBpcyB0aGlzIHNvbWV0aGluZyB0byB3b3JyeSBhYm91dD8KKwkJCQkgICogLS0gb24gYSBsYXB0b3A/CisJCQkJICAqLworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCXJldHVybiBJUlFfSEFORExFRDsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGlmIChscC0+bW9oYXdrKSB7IC8qIG11c3QgZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCisJUHV0Qnl0ZShYSVJDUkVHX0NSLCAwKTsKKyAgICB9CisKKyAgICBERUJVRyg2LCAiJXM6IGludGVycnVwdCAlZCBhdCAlI3guXG4iLCBkZXYtPm5hbWUsIGlycSwgaW9hZGRyKTsKKworICAgIHNhdmVkX3BhZ2UgPSBHZXRCeXRlKFhJUkNSRUdfUFIpOworICAgIC8qIFJlYWQgdGhlIElTUiB0byBzZWUgd2hhdHMgdGhlIGNhdXNlIGZvciB0aGUgaW50ZXJydXB0LgorICAgICAqIFRoaXMgYWxzbyBjbGVhcnMgdGhlIGludGVycnVwdCBmbGFncyBvbiBDRTIgY2FyZHMKKyAgICAgKi8KKyAgICBpbnRfc3RhdHVzID0gR2V0Qnl0ZShYSVJDUkVHX0lTUik7CisgICAgYnl0ZXNfcmN2ZCA9IDA7CisgIGxvb3BfZW50cnk6CisgICAgaWYgKGludF9zdGF0dXMgPT0gMHhmZikgeyAvKiBjYXJkIG1heSBiZSBlamVjdGVkICovCisJREVCVUcoMywgIiVzOiBpbnRlcnJ1cHQgJWQgZm9yIGRlYWQgY2FyZFxuIiwgZGV2LT5uYW1lLCBpcnEpOworCWdvdG8gbGVhdmU7CisgICAgfQorICAgIGV0aF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUdfRVNSKTsKKworICAgIFNlbGVjdFBhZ2UoMHg0MCk7CisgICAgcnhfc3RhdHVzICA9IEdldEJ5dGUoWElSQ1JFRzQwX1JYU1QwKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9SWFNUMCwgKH5yeF9zdGF0dXMgJiAweGZmKSk7CisgICAgdHhfc3RhdHVzID0gR2V0Qnl0ZShYSVJDUkVHNDBfVFhTVDApOworICAgIHR4X3N0YXR1cyB8PSBHZXRCeXRlKFhJUkNSRUc0MF9UWFNUMSkgPDwgODsKKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMCwgMCk7CisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfVFhTVDEsIDApOworCisgICAgREVCVUcoMywgIiVzOiBJU1I9JSMyLjJ4IEVTUj0lIzIuMnggUlNSPSUjMi4yeCBUU1I9JSM0LjR4XG4iLAorCSAgZGV2LT5uYW1lLCBpbnRfc3RhdHVzLCBldGhfc3RhdHVzLCByeF9zdGF0dXMsIHR4X3N0YXR1cyk7CisKKyAgICAvKioqKiogcmVjZWl2ZSBzZWN0aW9uICoqKioqKi8KKyAgICBTZWxlY3RQYWdlKDApOworICAgIHdoaWxlIChldGhfc3RhdHVzICYgRnVsbFBrdFJjdmQpIHsKKwlyc3IgPSBHZXRCeXRlKFhJUkNSRUcwX1JTUik7CisJaWYgKGJ5dGVzX3JjdmQgPiBtYXhyeF9ieXRlcyAmJiAocnNyICYgUGt0UnhPaykpIHsKKwkgICAgLyogdG9vIG1hbnkgYnl0ZXMgcmVjZWl2ZWQgZHVyaW5nIHRoaXMgaW50LCBkcm9wIHRoZSByZXN0IG9mIHRoZQorCSAgICAgKiBwYWNrZXRzICovCisJICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJICAgIERFQlVHKDIsICIlczogUlggZHJvcCwgdG9vIG11Y2ggZG9uZVxuIiwgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHJzciAmIFBrdFJ4T2spIHsKKwkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCSAgICBwa3RsZW4gPSBHZXRXb3JkKFhJUkNSRUcwX1JCQyk7CisJICAgIGJ5dGVzX3JjdmQgKz0gcGt0bGVuOworCisJICAgIERFQlVHKDUsICJyc3I9JSMwMnggcGFja2V0X2xlbmd0aD0ldVxuIiwgcnNyLCBwa3RsZW4pOworCisJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0bGVuKzMpOyAvKiAxIGV4dHJhIHNvIHdlIGNhbiB1c2UgaW5zdyAqLworCSAgICBpZiAoIXNrYikgeworCQlwcmludGsoS05PVF9YSVJDICJsb3cgbWVtb3J5LCBwYWNrZXQgZHJvcHBlZCAoc2l6ZT0ldSlcbiIsCisJCSAgICAgICBwa3RsZW4pOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCSAgICB9IGVsc2UgeyAvKiBva2F5IGdldCB0aGUgcGFja2V0ICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCWlmIChscC0+c2lsaWNvbiA9PSAwICkgeyAvKiB3b3JrIGFyb3VuZCBhIGhhcmR3YXJlIGJ1ZyAqLworCQkgICAgdW5zaWduZWQgcmhzYTsgLyogcmVjZWl2ZSBzdGFydCBhZGRyZXNzICovCisKKwkJICAgIFNlbGVjdFBhZ2UoNSk7CisJCSAgICByaHNhID0gR2V0V29yZChYSVJDUkVHNV9SSFNBMCk7CisJCSAgICBTZWxlY3RQYWdlKDApOworCQkgICAgcmhzYSArPSAzOyAvKiBza2lwIGNvbnRyb2wgaW5mb3MgKi8KKwkJICAgIGlmIChyaHNhID49IDB4ODAwMCkKKwkJCXJoc2EgPSAwOworCQkgICAgaWYgKHJoc2EgKyBwa3RsZW4gPiAweDgwMDApIHsKKwkJCXVuc2lnbmVkIGk7CisJCQl1X2NoYXIgKmJ1ZiA9IHNrYl9wdXQoc2tiLCBwa3RsZW4pOworCQkJZm9yIChpPTA7IGkgPCBwa3RsZW4gOyBpKyssIHJoc2ErKykgeworCQkJICAgIGJ1ZltpXSA9IEdldEJ5dGUoWElSQ1JFR19FRFApOworCQkJICAgIGlmIChyaHNhID09IDB4ODAwMCkgeworCQkJCXJoc2EgPSAwOworCQkJCWktLTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9IGVsc2UgeworCQkJaW5zdyhpb2FkZHIrWElSQ1JFR19FRFAsCisJCQkJc2tiX3B1dChza2IsIHBrdGxlbiksIChwa3RsZW4rMSk+PjEpOworCQkgICAgfQorCQl9CisJICAgICAgI2lmIDAKKwkJZWxzZSBpZiAobHAtPm1vaGF3aykgeworCQkgICAgLyogVG8gdXNlIHRoaXMgMzIgYml0IGFjY2VzcyB3ZSBzaG91bGQgdXNlCisJCSAgICAgKiBhIG1hbnVhbCBvcHRpbWl6ZWQgbG9vcAorCQkgICAgICogQWxzbyB0aGUgd29yZHMgYXJlIHN3YXBwZWQsIHdlIGNhbiBnZXQgbW9yZQorCQkgICAgICogcGVyZm9ybWFuY2UgYnkgdXNpbmcgMzIgYml0IGFjY2VzcyBhbmQgc3dhcHBpbmcKKwkJICAgICAqIHRoZSB3b3JkcyBpbiBhIHJlZ2lzdGVyLiBXaWxsIG5lZWQgdGhpcyBmb3IgY2FyZGJ1cworCQkgICAgICoKKwkJICAgICAqIE5vdGU6IGRvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIEFMTE9DX1NLQiB0byAuLiArMworCQkgICAgICovCisJCSAgICB1bnNpZ25lZCBpOworCQkgICAgdV9sb25nICpwID0gc2tiX3B1dChza2IsIHBrdGxlbik7CisJCSAgICByZWdpc3RlciB1X2xvbmcgYTsKKwkJICAgIGtpb19hZGRyX3QgZWRwcmVnID0gaW9hZGRyK1hJUkNSRUdfRURQLTI7CisJCSAgICBmb3IgKGk9MDsgaSA8IGxlbiA7IGkgKz0gNCwgcCsrKSB7CisJCQlhID0gaW5sKGVkcHJlZyk7CisJCQlfX2FzbV9fKCJyb3JsICQxNiwlMFxuXHQiCisJCQkJOiI9cSIgKGEpCisJCQkJOiAiMCIgKGEpKTsKKwkJCSpwID0gYTsKKwkJICAgIH0KKwkJfQorCSAgICAgICNlbmRpZgorCQllbHNlIHsKKwkJICAgIGluc3coaW9hZGRyK1hJUkNSRUdfRURQLCBza2JfcHV0KHNrYiwgcGt0bGVuKSwKKwkJCSAgICAocGt0bGVuKzEpPj4xKTsKKwkJfQorCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlza2ItPmRldiA9IGRldjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJaWYgKCEocnNyICYgUGh5UGt0KSkKKwkJICAgIGxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKwkgICAgfQorCX0gZWxzZSB7IC8qIGJhZCBwYWNrZXQgKi8KKwkgICAgREVCVUcoNSwgInJzcj0lIzAyeFxuIiwgcnNyKTsKKwl9CisJaWYgKHJzciAmIFBrdFRvb0xvbmcpIHsKKwkgICAgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCSAgICBERUJVRygzLCAiJXM6IFBhY2tldCB0b28gbG9uZ1xuIiwgZGV2LT5uYW1lKTsKKwl9CisJaWYgKHJzciAmIENSQ0VycikgeworCSAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgICBERUJVRygzLCAiJXM6IENSQyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwl9CisJaWYgKHJzciAmIEFsaWduRXJyKSB7CisJICAgIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOyAvKiBva2F5ID8gKi8KKwkgICAgREVCVUcoMywgIiVzOiBBbGlnbm1lbnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJfQorCisJLyogY2xlYXIgdGhlIHJlY2VpdmVkL2Ryb3BwZWQvZXJyb3IgcGFja2V0ICovCisJUHV0V29yZChYSVJDUkVHMF9ETywgMHg4MDAwKTsgLyogaXNzdWUgY21kOiBza2lwX3J4X3BhY2tldCAqLworCisJLyogZ2V0IHRoZSBuZXcgZXRoZXJuZXQgc3RhdHVzICovCisJZXRoX3N0YXR1cyA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOworICAgIH0KKyAgICBpZiAocnhfc3RhdHVzICYgMHgxMCkgeyAvKiBSZWNlaXZlIG92ZXJydW4gKi8KKwlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIENsZWFyUnhPdnJ1bik7CisJREVCVUcoMywgInJlY2VpdmUgb3ZlcnJ1biBjbGVhcmVkXG4iKTsKKyAgICB9CisKKyAgICAvKioqKiogdHJhbnNtaXQgc2VjdGlvbiAqKioqKiovCisgICAgaWYgKGludF9zdGF0dXMgJiBQa3RUeGVkKSB7CisJdW5zaWduZWQgbiwgbm47CisKKwluID0gbHAtPmxhc3RfcHRyX3ZhbHVlOworCW5uID0gR2V0Qnl0ZShYSVJDUkVHMF9QVFIpOworCWxwLT5sYXN0X3B0cl92YWx1ZSA9IG5uOworCWlmIChubiA8IG4pIC8qIHJvbGxvdmVyICovCisJICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzICs9IDI1NiAtIG47CisJZWxzZSBpZiAobiA9PSBubikgeyAvKiBoYXBwZW5zIHNvbWV0aW1lcyAtIGRvbid0IGtub3cgd2h5ICovCisJICAgIERFQlVHKDAsICJQVFIgbm90IGNoYW5nZWQ/XG4iKTsKKwl9IGVsc2UKKwkgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMgKz0gbHAtPmxhc3RfcHRyX3ZhbHVlIC0gbjsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIGlmICh0eF9zdGF0dXMgJiAweDAwMDIpIHsJLyogRXhlY2Vzc2l2ZSBjb2xsaXNzaW9ucyAqLworCURFQlVHKDAsICJ0eCByZXN0YXJ0ZWQgZHVlIHRvIGV4ZWNzc2l2ZSBjb2xsaXNzaW9uc1xuIik7CisJUHV0Qnl0ZShYSVJDUkVHX0NSLCBSZXN0YXJ0VHgpOyAgLyogcmVzdGFydCB0cmFuc21pdHRlciBwcm9jZXNzICovCisgICAgfQorICAgIGlmICh0eF9zdGF0dXMgJiAweDAwNDApCisJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisKKyAgICAvKiByZWNhbGN1bGF0ZSBvdXIgd29yayBjaHVuayBzbyB0aGF0IHdlIGxpbWl0IHRoZSBkdXJhdGlvbiBvZiB0aGlzCisgICAgICogSVNSIHRvIGFib3V0IDEvMTAgb2YgYSBzZWNvbmQuCisgICAgICogQ2FsY3VsYXRlIG9ubHkgaWYgd2UgcmVjZWl2ZWQgYSByZWFzb25hYmxlIGFtb3VudCBvZiBieXRlcy4KKyAgICAgKi8KKyAgICBpZiAoYnl0ZXNfcmN2ZCA+IDEwMDApIHsKKwl1X2xvbmcgZHVyYXRpb24gPSBqaWZmaWVzIC0gc3RhcnRfdGlja3M7CisKKwlpZiAoZHVyYXRpb24gPj0gSFovMTApIHsgLyogaWYgbW9yZSB0aGFuIGFib3V0IDEvMTAgc2Vjb25kICovCisJICAgIG1heHJ4X2J5dGVzID0gKGJ5dGVzX3JjdmQgKiAoSFovMTApKSAvIGR1cmF0aW9uOworCSAgICBpZiAobWF4cnhfYnl0ZXMgPCAyMDAwKQorCQltYXhyeF9ieXRlcyA9IDIwMDA7CisJICAgIGVsc2UgaWYgKG1heHJ4X2J5dGVzID4gMjIwMDApCisJCW1heHJ4X2J5dGVzID0gMjIwMDA7CisJICAgIERFQlVHKDEsICJzZXQgbWF4cng9JXUgKHJjdmQ9JXUgdGlja3M9JWx1KVxuIiwKKwkJICBtYXhyeF9ieXRlcywgYnl0ZXNfcmN2ZCwgZHVyYXRpb24pOworCX0gZWxzZSBpZiAoIWR1cmF0aW9uICYmIG1heHJ4X2J5dGVzIDwgMjIwMDApIHsKKwkgICAgLyogbm93IG11Y2ggZmFzdGVyICovCisJICAgIG1heHJ4X2J5dGVzICs9IDIwMDA7CisJICAgIGlmIChtYXhyeF9ieXRlcyA+IDIyMDAwKQorCQltYXhyeF9ieXRlcyA9IDIyMDAwOworCSAgICBERUJVRygxLCAic2V0IG1heHJ4PSV1XG4iLCBtYXhyeF9ieXRlcyk7CisJfQorICAgIH0KKworICBsZWF2ZToKKyAgICBpZiAobG9ja3VwX2hhY2spIHsKKwlpZiAoaW50X3N0YXR1cyAhPSAweGZmICYmIChpbnRfc3RhdHVzID0gR2V0Qnl0ZShYSVJDUkVHX0lTUikpICE9IDApCisJICAgIGdvdG8gbG9vcF9lbnRyeTsKKyAgICB9CisgICAgU2VsZWN0UGFnZShzYXZlZF9wYWdlKTsKKyAgICBQdXRCeXRlKFhJUkNSRUdfQ1IsIEVuYWJsZUludHIpOyAgLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgICAvKiBJbnN0ZWFkIG9mIGRyb3BwaW5nIHBhY2tldHMgZHVyaW5nIGEgcmVjZWl2ZSwgd2UgY291bGQKKyAgICAgKiBmb3JjZSBhbiBpbnRlcnJ1cHQgd2l0aCB0aGlzIGNvbW1hbmQ6CisgICAgICoJICBQdXRCeXRlKFhJUkNSRUdfQ1IsIEVuYWJsZUludHJ8Rm9yY2VJbnRyKTsKKyAgICAgKi8KKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIHhpcmMycHNfaW50ZXJydXB0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZAorZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dFxuIiwgZGV2LT5uYW1lKTsKKyAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgLyogcmVzZXQgdGhlIGNhcmQgKi8KKyAgICBkb19yZXNldChkZXYsMSk7CisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50Citkb19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgb2theTsKKyAgICB1bnNpZ25lZCBmcmVlc3BhY2U7CisgICAgdW5zaWduZWQgcGt0bGVuID0gc2tiPyBza2ItPmxlbiA6IDA7CisKKyAgICBERUJVRygxLCAiZG9fc3RhcnRfeG1pdChza2I9JXAsIGRldj0lcCkgbGVuPSV1XG4iLAorCSAgc2tiLCBkZXYsIHBrdGxlbik7CisKKworICAgIC8qIGFkanVzdCB0aGUgcGFja2V0IGxlbmd0aCB0byBtaW4uIHJlcXVpcmVkCisgICAgICogYW5kIGhvcGUgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaAorICAgICAqIHRvIHByb3ZpZGUgc29tZSByYW5kb20gZGF0YS4KKyAgICAgKiBmaXhtZTogRm9yIE1vaGF3ayB3ZSBjYW4gY2hhbmdlIHRoaXMgYnkgc2VuZGluZworICAgICAqIGEgbGFyZ2VyIHBhY2tldGxlbiB0aGFuIHdlIGFjdHVhbGx5IGhhdmU7IHRoZSBjaGlwIHdpbGwKKyAgICAgKiBwYWQgdGhpcyBpbiBoaXMgYnVmZmVyIHdpdGggcmFuZG9tIGJ5dGVzCisgICAgICovCisgICAgaWYgKHBrdGxlbiA8IEVUSF9aTEVOKQorICAgIHsKKyAgICAgICAgc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworICAgICAgICBpZiAoc2tiID09IE5VTEwpCisgICAgICAgIAlyZXR1cm4gMDsKKwlwa3RsZW4gPSBFVEhfWkxFTjsKKyAgICB9CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgU2VsZWN0UGFnZSgwKTsKKyAgICBQdXRXb3JkKFhJUkNSRUcwX1RSUywgKHVfc2hvcnQpcGt0bGVuKzIpOworICAgIGZyZWVzcGFjZSA9IEdldFdvcmQoWElSQ1JFRzBfVFNPKTsKKyAgICBva2F5ID0gZnJlZXNwYWNlICYgMHg4MDAwOworICAgIGZyZWVzcGFjZSAmPSAweDdmZmY7CisgICAgLyogVFJTIGRvZXNuJ3Qgd29yayAtIChpbmRlZWQgaXQgaXMgZWxpbWluYXRlZCB3aXRoIHNpbC1yZXYgMSkgKi8KKyAgICBva2F5ID0gcGt0bGVuICsyIDwgZnJlZXNwYWNlOworICAgIERFQlVHKDIgKyAob2theSA/IDIgOiAwKSwgIiVzOiBhdmFpbC4gdHggc3BhY2U9JXUlc1xuIiwKKwkgIGRldi0+bmFtZSwgZnJlZXNwYWNlLCBva2F5ID8gIiAob2theSkiOiIgKG5vdCBlbm91Z2gpIik7CisgICAgaWYgKCFva2F5KSB7IC8qIG5vdCBlbm91Z2ggc3BhY2UgKi8KKwlyZXR1cm4gMTsgIC8qIHVwcGVyIGxheWVyIG1heSBkZWNpZGUgdG8gcmVxdWV1ZSB0aGlzIHBhY2tldCAqLworICAgIH0KKyAgICAvKiBzZW5kIHRoZSBwYWNrZXQgKi8KKyAgICBQdXRXb3JkKFhJUkNSRUdfRURQLCAodV9zaG9ydClwa3RsZW4pOworICAgIG91dHN3KGlvYWRkcitYSVJDUkVHX0VEUCwgc2tiLT5kYXRhLCBwa3RsZW4+PjEpOworICAgIGlmIChwa3RsZW4gJiAxKQorCVB1dEJ5dGUoWElSQ1JFR19FRFAsIHNrYi0+ZGF0YVtwa3RsZW4tMV0pOworCisgICAgaWYgKGxwLT5tb2hhd2spCisJUHV0Qnl0ZShYSVJDUkVHX0NSLCBUcmFuc21pdFBhY2tldHxFbmFibGVJbnRyKTsKKworICAgIGRldl9rZnJlZV9za2IgKHNrYik7CisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IHBrdGxlbjsKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorZG9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAvKglscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IEdldEJ5dGUoPykgKi8KKyAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFNldCBhbGwgYWRkcmVzc2VzOiBUaGlzIGZpcnN0IG9uZSBpcyB0aGUgaW5kaXZpZHVhbCBhZGRyZXNzLAorICogdGhlIG5leHQgOSBhZGRyZXNzZXMgYXJlIHRha2VuIGZyb20gdGhlIG11bHRpY2FzdCBsaXN0IGFuZAorICogdGhlIHJlc3QgaXMgZmlsbGVkIHdpdGggdGhlIGluZGl2aWR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIHZvaWQKK3NldF9hZGRyZXNzZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworICAgIGNoYXIgKmFkZHI7CisgICAgaW50IGksaixrLG47CisKKyAgICBTZWxlY3RQYWdlKGs9MHg1MCk7CisgICAgZm9yIChpPTAsaj04LG49MDsgOyBpKyssIGorKykgeworCWlmIChpID4gNSkgeworCSAgICBpZiAoKytuID4gOSkKKwkJYnJlYWs7CisJICAgIGkgPSAwOworCX0KKwlpZiAoaiA+IDE1KSB7CisJICAgIGogPSA4OworCSAgICBrKys7CisJICAgIFNlbGVjdFBhZ2Uoayk7CisJfQorCisJaWYgKG4gJiYgbiA8PSBkZXYtPm1jX2NvdW50ICYmIGRtaSkgeworCSAgICBhZGRyID0gZG1pLT5kbWlfYWRkcjsKKwkgICAgZG1pID0gZG1pLT5uZXh0OworCX0gZWxzZQorCSAgICBhZGRyID0gZGV2LT5kZXZfYWRkcjsKKworCWlmIChscC0+bW9oYXdrKQorCSAgICBQdXRCeXRlKGosIGFkZHJbNS1pXSk7CisJZWxzZQorCSAgICBQdXRCeXRlKGosIGFkZHJbaV0pOworICAgIH0KKyAgICBTZWxlY3RQYWdlKDApOworfQorCisvKioqKioqKioqKioqKioqKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKiBXZSBjYW4gZmlsdGVyIHVwIHRvIDkgYWRkcmVzc2VzLCBpZiBtb3JlIGFyZSByZXF1ZXN0ZWQgd2Ugc2V0CisgKiBtdWx0aWNhc3QgcHJvbWlzY3VvdXMgbW9kZS4KKyAqLworCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIFNlbGVjdFBhZ2UoMHg0Mik7CisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeyAvKiBzbm9vcCAqLworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4MDYpOyAvKiBzZXQgTVBFIGFuZCBQTUUgKi8KKyAgICB9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiA5IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4MDYpOyAvKiBzZXQgTVBFICovCisgICAgfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50KSB7CisJLyogdGhlIGNoaXAgY2FuIGZpbHRlciA5IGFkZHJlc3NlcyBwZXJmZWN0bHkgKi8KKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDAwKTsKKwlTZWxlY3RQYWdlKDB4NDApOworCVB1dEJ5dGUoWElSQ1JFRzQwX0NNRDAsIE9mZmxpbmUpOworCXNldF9hZGRyZXNzZXMoZGV2KTsKKwlTZWxlY3RQYWdlKDB4NDApOworCVB1dEJ5dGUoWElSQ1JFRzQwX0NNRDAsIEVuYWJsZVJlY3YgfCBPbmxpbmUpOworICAgIH0gZWxzZSB7IC8qIHN0YW5kYXJkIHVzYWdlICovCisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHgwMCk7CisgICAgfQorICAgIFNlbGVjdFBhZ2UoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIERFQlVHKDAsICJkb19jb25maWcoJXApXG4iLCBkZXYpOworICAgIGlmIChtYXAtPnBvcnQgIT0gMjU1ICYmIG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpIHsKKwlpZiAobWFwLT5wb3J0ID4gNCkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFtYXAtPnBvcnQpIHsKKwkgICAgbG9jYWwtPnByb2JlX3BvcnQgPSAxOworCSAgICBkZXYtPmlmX3BvcnQgPSAxOworCX0gZWxzZSB7CisJICAgIGxvY2FsLT5wcm9iZV9wb3J0ID0gMDsKKwkgICAgZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoaW5nIHRvICVzIHBvcnRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisJZG9fcmVzZXQoZGV2LDEpOyAgLyogbm90IHRoZSBmaW5lIHdheSA6LSkgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBPcGVuIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIGludAorZG9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgICBERUJVRygwLCAiZG9fb3BlbiglcClcbiIsIGRldik7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBQQ01DSUEgY2FyZCBpcyBzdGlsbCBoZXJlLiAqLworICAgIC8qIFBoeXNpY2FsIGRldmljZSBwcmVzZW50IHNpZ25hdHVyZS4gKi8KKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIC8qIG9rYXkgKi8KKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIGRvX3Jlc2V0KGRldiwxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJ4aXJjMnBzX2NzIik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKK3N0YXRpYyBpbnQKK2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1MTYgKmRhdGEgPSAodTE2ICopJnJxLT5pZnJfaWZydTsKKworICAgIERFQlVHKDEsICIlczogaW9jdGwoJS0uNnMsICUjMDR4KSAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorCSAgZGV2LT5uYW1lLCBycS0+aWZyX2lmcm4uaWZybl9uYW1lLCBjbWQsCisJICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKKworICAgIGlmICghbG9jYWwtPm1vaGF3aykKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBzd2l0Y2goY21kKSB7CisgICAgICBjYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLworCWRhdGFbMF0gPSAwOwkJLyogd2UgaGF2ZSBvbmx5IHRoaXMgYWRkcmVzcyAqLworCS8qIGZhbGwgdHJvdWdoICovCisgICAgICBjYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4gKi8KKwlkYXRhWzNdID0gbWlpX3JkKGlvYWRkciwgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmKTsKKwlicmVhazsKKyAgICAgIGNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3RlciAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkgICAgcmV0dXJuIC1FUEVSTTsKKwltaWlfd3IoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0sIDE2KTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuIC1FT1BOT1RTVVBQOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2hhcmRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBTZWxlY3RQYWdlKDQpOworICAgIHVkZWxheSgxKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0X0dQUjEsIDApOwkgICAgIC8qIGNsZWFyIGJpdCAwOiBwb3dlciBkb3duICovCisgICAgbXNsZWVwKDQwKTsJCQkJICAgICAvKiB3YWl0IDQwIG1zZWMgKi8KKyAgICBpZiAobG9jYWwtPm1vaGF3aykKKwlQdXRCeXRlKFhJUkNSRUc0X0dQUjEsIDEpOwkgLyogc2V0IGJpdCAwOiBwb3dlciB1cCAqLworICAgIGVsc2UKKwlQdXRCeXRlKFhJUkNSRUc0X0dQUjEsIDEgfCA0KTsJIC8qIHNldCBiaXQgMDogcG93ZXIgdXAsIGJpdCAyOiBBSUMgKi8KKyAgICBtc2xlZXAoMjApOwkJCSAgICAgLyogd2FpdCAyMCBtc2VjICovCit9CisKK3N0YXRpYyB2b2lkCitkb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnVsbCkKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVuc2lnbmVkIHZhbHVlOworCisgICAgREVCVUcoMCwgIiVzOiBkb19yZXNldCglcCwlZClcbiIsIGRldj8gZGV2LT5uYW1lOiJldGg/IiwgZGV2LCBmdWxsKTsKKworICAgIGhhcmRyZXNldChkZXYpOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgU29mdFJlc2V0KTsgLyogc2V0ICovCisgICAgbXNsZWVwKDIwKTsJCQkgICAgIC8qIHdhaXQgMjAgbXNlYyAqLworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgMCk7CSAgICAgLyogY2xlYXIgKi8KKyAgICBtc2xlZXAoNDApOwkJCSAgICAgLyogd2FpdCA0MCBtc2VjICovCisgICAgaWYgKGxvY2FsLT5tb2hhd2spIHsKKwlTZWxlY3RQYWdlKDQpOworCS8qIHNldCBwaW4gR1AxIGFuZCBHUDIgdG8gb3V0cHV0ICAoMHgwYykKKwkgKiBzZXQgR1AxIHRvIGxvdyB0byBwb3dlciB1cCB0aGUgTUw2NjkyICgweDAwKQorCSAqIHNldCBHUDIgdG8gaGlnaCB0byBwb3dlciB1cCB0aGUgMTBNaHogY2hpcCAgKDB4MDIpCisJICovCisJUHV0Qnl0ZShYSVJDUkVHNF9HUFIwLCAweDBlKTsKKyAgICB9CisKKyAgICAvKiBnaXZlIHRoZSBjaXJjdWl0cyBzb21lIHRpbWUgdG8gcG93ZXIgdXAgKi8KKyAgICBtc2xlZXAoNTAwKTsJCQkvKiBhYm91dCA1MDBtcyAqLworCisgICAgbG9jYWwtPmxhc3RfcHRyX3ZhbHVlID0gMDsKKyAgICBsb2NhbC0+c2lsaWNvbiA9IGxvY2FsLT5tb2hhd2sgPyAoR2V0Qnl0ZShYSVJDUkVHNF9CT1YpICYgMHg3MCkgPj4gNAorCQkJCSAgIDogKEdldEJ5dGUoWElSQ1JFRzRfQk9WKSAmIDB4MzApID4+IDQ7CisKKyAgICBpZiAobG9jYWwtPnByb2JlX3BvcnQpIHsKKwlpZiAoIWxvY2FsLT5tb2hhd2spIHsKKwkgICAgU2VsZWN0UGFnZSg0KTsKKwkgICAgUHV0Qnl0ZShYSVJDUkVHNF9HUFIwLCA0KTsKKwkgICAgbG9jYWwtPnByb2JlX3BvcnQgPSAwOworCX0KKyAgICB9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAyKSB7IC8qIGVuYWJsZSAxMEJhc2UyICovCisJU2VsZWN0UGFnZSgweDQyKTsKKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweEMwKTsKKyAgICB9IGVsc2UgeyAvKiBlbmFibGUgMTBCYXNlVCAqLworCVNlbGVjdFBhZ2UoMHg0Mik7CisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHg4MCk7CisgICAgfQorICAgIG1zbGVlcCg0MCk7CQkJICAgICAvKiB3YWl0IDQwIG1zZWMgdG8gbGV0IGl0IGNvbXBsZXRlICovCisKKyAgI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZykgeworCVNlbGVjdFBhZ2UoMCk7CisJdmFsdWUgPSBHZXRCeXRlKFhJUkNSRUdfRVNSKTsJIC8qIHJlYWQgdGhlIEVTUiAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogRVNSIGlzOiAlIzAyeFxuIiwgZGV2LT5uYW1lLCB2YWx1ZSk7CisgICAgfQorICAjZW5kaWYKKworICAgIC8qIHNldHVwIHRoZSBFQ1IgKi8KKyAgICBTZWxlY3RQYWdlKDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzFfSU1SMCwgMHhmZik7IC8qIGFsbG93IGFsbCBpbnRzICovCisgICAgUHV0Qnl0ZShYSVJDUkVHMV9JTVIxLCAxCSk7IC8qIGFuZCBTZXQgVHhVbmRlcnJ1bkRldGVjdCAqLworICAgIHZhbHVlID0gR2V0Qnl0ZShYSVJDUkVHMV9FQ1IpOworICAjaWYgMAorICAgIGlmIChsb2NhbC0+bW9oYXdrKQorCXZhbHVlIHw9IERpc2FibGVMaW5rUHVsc2U7CisgICAgUHV0Qnl0ZShYSVJDUkVHMV9FQ1IsIHZhbHVlKTsKKyAgI2VuZGlmCisgICAgREVCVUcoMCwgIiVzOiBFQ1IgaXM6ICUjMDJ4XG4iLCBkZXYtPm5hbWUsIHZhbHVlKTsKKworICAgIFNlbGVjdFBhZ2UoMHg0Mik7CisgICAgUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMCwgMHgyMCk7IC8qIGRpc2FibGUgc291cmNlIGluc2VydGlvbiAqLworCisgICAgaWYgKGxvY2FsLT5zaWxpY29uICE9IDEpIHsKKwkvKiBzZXQgdGhlIGxvY2FsIG1lbW9yeSBkaXZpZGluZyBsaW5lLgorCSAqIFRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGNvZGUgc2F5IHRoYXQgdGhpcyBpcyBvbmx5CisJICogc2V0dGFibGUgd2l0aCB0aGUgc2NpcHBlciB2ZXJzaW9uIDIgd2hpY2ggaXMgcmV2aXNpb24gMC4KKwkgKiBBbHdheXMgZm9yIENFMyBjYXJkcworCSAqLworCVNlbGVjdFBhZ2UoMik7CisJUHV0V29yZChYSVJDUkVHMl9SQlMsIDB4MjAwMCk7CisgICAgfQorCisgICAgaWYgKGZ1bGwpCisJc2V0X2FkZHJlc3NlcyhkZXYpOworCisgICAgLyogSGFyZHdhcmUgd29ya2Fyb3VuZDoKKyAgICAgKiBUaGUgcmVjZWl2ZSBieXRlIHBvaW50ZXIgYWZ0ZXIgcmVzZXQgaXMgb2ZmIGJ5IDEgc28gd2UgbmVlZAorICAgICAqIHRvIG1vdmUgdGhlIG9mZnNldCBwb2ludGVyIGJhY2sgdG8gMC4KKyAgICAgKi8KKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dFdvcmQoWElSQ1JFRzBfRE8sIDB4MjAwMCk7IC8qIGNoYW5nZSBvZmZzZXQgY29tbWFuZCwgb2ZmPTAgKi8KKworICAgIC8qIHNldHVwIE1BQyBJTVJzIGFuZCBjbGVhciBzdGF0dXMgcmVnaXN0ZXJzICovCisgICAgU2VsZWN0UGFnZSgweDQwKTsJCSAgICAgLyogQml0IDcgLi4uIGJpdCAwICovCisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfUk1BU0swLCAweGZmKTsgLyogUk9LLCBSQUIsIHJzdiwgUk8sIENSQywgQUUsIFBUTCwgTVAgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UTUFTSzAsIDB4ZmYpOyAvKiBUT0ssIFRBQiwgU1FFLCBMTCwgVFUsIEpBQiwgRVhDLCBDUlMgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UTUFTSzEsIDB4YjApOyAvKiByc3YsIHJzdiwgUFRELCBFWFQsIHJzdixyc3YscnN2LCByc3YqLworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1JYU1QwLCAgMHgwMCk7IC8qIFJPSywgUkFCLCBSRU4sIFJPLCBDUkMsIEFFLCBQVEwsIE1QICovCisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfVFhTVDAsICAweDAwKTsgLyogVE9LLCBUQUIsIFNRRSwgTEwsIFRVLCBKQUIsIEVYQywgQ1JTICovCisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfVFhTVDEsICAweDAwKTsgLyogVEVOLCByc3YsIFBURCwgRVhULCByZXRyeV9jb3VudGVyOjQgICovCisKKyAgICBpZiAoZnVsbCAmJiBsb2NhbC0+bW9oYXdrICYmIGluaXRfbWlpKGRldikpIHsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDQgfHwgbG9jYWwtPmRpbmdvIHx8IGxvY2FsLT5uZXdfbWlpKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJICAgIFNlbGVjdFBhZ2UoMik7CisJICAgIFB1dEJ5dGUoWElSQ1JFRzJfTVNSLCBHZXRCeXRlKFhJUkNSRUcyX01TUikgfCAweDA4KTsKKwkgICAgbXNsZWVwKDIwKTsKKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogTUlJIGRldGVjdGVkOyB1c2luZyAxMG1ic1xuIiwKKwkJICAgZGV2LT5uYW1lKTsKKwkgICAgU2VsZWN0UGFnZSgweDQyKTsKKwkgICAgaWYgKGRldi0+aWZfcG9ydCA9PSAyKSAvKiBlbmFibGUgMTBCYXNlMiAqLworCQlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweEMwKTsKKwkgICAgZWxzZSAgLyogZW5hYmxlIDEwQmFzZVQgKi8KKwkJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHg4MCk7CisJICAgIG1zbGVlcCg0MCk7CQkJLyogd2FpdCA0MCBtc2VjIHRvIGxldCBpdCBjb21wbGV0ZSAqLworCX0KKwlpZiAoZnVsbF9kdXBsZXgpCisJICAgIFB1dEJ5dGUoWElSQ1JFRzFfRUNSLCBHZXRCeXRlKFhJUkNSRUcxX0VDUiB8IEZ1bGxEdXBsZXgpKTsKKyAgICB9IGVsc2UgeyAgLyogTm8gTUlJICovCisJU2VsZWN0UGFnZSgwKTsKKwl2YWx1ZSA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOwkgLyogcmVhZCB0aGUgRVNSICovCisJZGV2LT5pZl9wb3J0ID0gKHZhbHVlICYgTWVkaWFTZWxlY3QpID8gMSA6IDI7CisgICAgfQorCisgICAgLyogY29uZmlndXJlIHRoZSBMRURzICovCisgICAgU2VsZWN0UGFnZSgyKTsKKyAgICBpZiAoZGV2LT5pZl9wb3J0ID09IDEgfHwgZGV2LT5pZl9wb3J0ID09IDQpIC8qIFRQOiBMaW5rIGFuZCBBY3Rpdml0eSAqLworCVB1dEJ5dGUoWElSQ1JFRzJfTEVELCAweDNiKTsKKyAgICBlbHNlCQkJICAgICAgLyogQ29heDogTm90LUNvbGxpc2lvbiBhbmQgQWN0aXZpdHkgKi8KKwlQdXRCeXRlKFhJUkNSRUcyX0xFRCwgMHgzYSk7CisKKyAgICBpZiAobG9jYWwtPmRpbmdvKQorCVB1dEJ5dGUoMHgwYiwgMHgwNCk7IC8qIDEwMCBNYml0IExFRCAqLworCisgICAgLyogZW5hYmxlIHJlY2VpdmVyIGFuZCBwdXQgdGhlIG1hYyBvbmxpbmUgKi8KKyAgICBpZiAoZnVsbCkgeworCVNlbGVjdFBhZ2UoMHg0MCk7CisJUHV0Qnl0ZShYSVJDUkVHNDBfQ01EMCwgRW5hYmxlUmVjdiB8IE9ubGluZSk7CisgICAgfQorCisgICAgLyogc2V0dXAgRXRoZXJuZXQgSU1SIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworICAgIFNlbGVjdFBhZ2UoMSk7CisgICAgUHV0Qnl0ZShYSVJDUkVHMV9JTVIwLCAweGZmKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgU2VsZWN0UGFnZSgwKTsKKyAgICBQdXRCeXRlKFhJUkNSRUdfQ1IsIEVuYWJsZUludHIpOworICAgIGlmIChsb2NhbC0+bW9kZW0gJiYgIWxvY2FsLT5kaW5nbykgeyAvKiBkbyBzb21lIG1hZ2ljICovCisJaWYgKCEoR2V0Qnl0ZSgweDEwKSAmIDB4MDEpKQorCSAgICBQdXRCeXRlKDB4MTAsIDB4MTEpOyAvKiB1bm1hc2sgbWFzdGVyLWludCBiaXQgKi8KKyAgICB9CisKKyAgICBpZiAoZnVsbCkKKwlwcmludGsoS0VSTl9JTkZPICIlczogbWVkaWEgJXMsIHNpbGljb24gcmV2aXNpb24gJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSwgbG9jYWwtPnNpbGljb24pOworICAgIC8qIFdlIHNob3VsZCBzd2l0Y2ggYmFjayB0byBwYWdlIDAgdG8gYXZvaWQgYSBidWcgaW4gcmV2aXNpb24gMAorICAgICAqIHdoZXJlIHJlZ3Mgd2l0aCBvZmZzZXQgYmVsb3cgOCBjYW4ndCBiZSByZWFkIGFmdGVyIGFuIGFjY2VzcworICAgICAqIHRvIHRoZSBNQUMgcmVnaXN0ZXJzICovCisgICAgU2VsZWN0UGFnZSgwKTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemUgdGhlIE1lZGlhLUluZGVwZW5kZW50LUludGVyZmFjZQorICogUmV0dXJuczogVHJ1ZSBpZiB3ZSBoYXZlIGEgZ29vZCBNSUkKKyAqLworc3RhdGljIGludAoraW5pdF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVuc2lnbmVkIGNvbnRyb2wsIHN0YXR1cywgbGlua3BhcnRuZXI7CisgICAgaW50IGk7CisKKyAgICBpZiAoaWZfcG9ydCA9PSA0IHx8IGlmX3BvcnQgPT0gMSkgeyAvKiBmb3JjZSAxMDBCYXNlVCBvciAxMEJhc2VUICovCisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwlsb2NhbC0+cHJvYmVfcG9ydCA9IDA7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzID0gbWlpX3JkKGlvYWRkciwgIDAsIDEpOworICAgIGlmICgoc3RhdHVzICYgMHhmZjAwKSAhPSAweDc4MDApCisJcmV0dXJuIDA7IC8qIE5vIE1JSSAqLworCisgICAgbG9jYWwtPm5ld19taWkgPSAobWlpX3JkKGlvYWRkciwgMCwgMikgIT0gMHhmZmZmKTsKKyAgICAKKyAgICBpZiAobG9jYWwtPnByb2JlX3BvcnQpCisJY29udHJvbCA9IDB4MTAwMDsgLyogYXV0byBuZWcgKi8KKyAgICBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gNCkKKwljb250cm9sID0gMHgyMDAwOyAvKiBubyBhdXRvIG5lZywgMTAwbWJzIG1vZGUgKi8KKyAgICBlbHNlCisJY29udHJvbCA9IDB4MDAwMDsgLyogbm8gYXV0byBuZWcsIDEwbWJzIG1vZGUgKi8KKyAgICBtaWlfd3IoaW9hZGRyLCAgMCwgMCwgY29udHJvbCwgMTYpOworICAgIHVkZWxheSgxMDApOworICAgIGNvbnRyb2wgPSBtaWlfcmQoaW9hZGRyLCAwLCAwKTsKKworICAgIGlmIChjb250cm9sICYgMHgwNDAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBjYW4ndCB0YWtlIFBIWSBvdXQgb2YgaXNvbGF0aW9uIG1vZGVcbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisJbG9jYWwtPnByb2JlX3BvcnQgPSAwOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChsb2NhbC0+cHJvYmVfcG9ydCkgeworCS8qIGFjY29yZGluZyB0byB0aGUgRFA4Mzg0MEEgc3BlY3MgdGhlIGF1dG8gbmVnb3RpYXRpb24gcHJvY2VzcworCSAqIG1heSB0YWtlIHVwIHRvIDMuNSBzZWMsIHNvIHdlIHVzZSB0aGlzIGFsc28gZm9yIG91ciBNTDY2OTIKKwkgKiBGaXhtZTogQmV0dGVyIHRvIHVzZSBhIHRpbWVyIGhlcmUhCisJICovCisJZm9yIChpPTA7IGkgPCAzNTsgaSsrKSB7CisJICAgIG1zbGVlcCgxMDApOwkgLyogd2FpdCAxMDAgbXNlYyAqLworCSAgICBzdGF0dXMgPSBtaWlfcmQoaW9hZGRyLCAgMCwgMSk7CisJICAgIGlmICgoc3RhdHVzICYgMHgwMDIwKSAmJiAoc3RhdHVzICYgMHgwMDA0KSkKKwkJYnJlYWs7CisJfQorCisJaWYgKCEoc3RhdHVzICYgMHgwMDIwKSkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGZhaWxlZDsiCisJCSAgICIgdXNpbmcgMTBtYnNcbiIsIGRldi0+bmFtZSk7CisJICAgIGlmICghbG9jYWwtPm5ld19taWkpIHsKKwkJY29udHJvbCA9IDB4MDAwMDsKKwkJbWlpX3dyKGlvYWRkciwgIDAsIDAsIGNvbnRyb2wsIDE2KTsKKwkJdWRlbGF5KDEwMCk7CisJCVNlbGVjdFBhZ2UoMCk7CisJCWRldi0+aWZfcG9ydCA9IChHZXRCeXRlKFhJUkNSRUdfRVNSKSAmIE1lZGlhU2VsZWN0KSA/IDEgOiAyOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgbGlua3BhcnRuZXIgPSBtaWlfcmQoaW9hZGRyLCAwLCA1KTsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBsaW5rIHBhcnRuZXI6ICUwNHhcbiIsCisJCSAgIGRldi0+bmFtZSwgbGlua3BhcnRuZXIpOworCSAgICBpZiAobGlua3BhcnRuZXIgJiAweDAwODApIHsKKwkJZGV2LT5pZl9wb3J0ID0gNDsKKwkgICAgfSBlbHNlCisJCWRldi0+aWZfcG9ydCA9IDE7CisJfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZG9fcG93ZXJkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMCwgImRvX3Bvd2VyZG93biglcClcbiIsIGRldik7CisKKyAgICBTZWxlY3RQYWdlKDQpOworICAgIFB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMCk7CSAgICAgLyogY2xlYXIgYml0IDA6IHBvd2VyIGRvd24gKi8KKyAgICBTZWxlY3RQYWdlKDApOworfQorCitzdGF0aWMgaW50Citkb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgICAgREVCVUcoMCwgImRvX3N0b3AoJXApXG4iLCBkZXYpOworCisgICAgaWYgKCFsaW5rKQorCXJldHVybiAtRU5PREVWOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgU2VsZWN0UGFnZSgwKTsKKyAgICBQdXRCeXRlKFhJUkNSRUdfQ1IsIDApOyAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgU2VsZWN0UGFnZSgweDAxKTsKKyAgICBQdXRCeXRlKFhJUkNSRUcxX0lNUjAsIDB4MDApOyAvKiBmb3JiaWQgYWxsIGludHMgKi8KKyAgICBTZWxlY3RQYWdlKDQpOworICAgIFB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMCk7CS8qIGNsZWFyIGJpdCAwOiBwb3dlciBkb3duICovCisgICAgU2VsZWN0UGFnZSgwKTsKKworICAgIGxpbmstPm9wZW4tLTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHhpcmMycHNfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAieGlyYzJwc19jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHhpcmMycHNfYXR0YWNoLAorCS5kZXRhY2gJCT0geGlyYzJwc19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF94aXJjMnBzX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnhpcmMycHNfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X3hpcmMycHNfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnhpcmMycHNfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfeGlyYzJwc19jcyk7Cittb2R1bGVfZXhpdChleGl0X3hpcmMycHNfY3MpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfeGlyYzJwc19jcyhjaGFyICpzdHIpCit7CisJLyogaWZfcG9ydCwgZnVsbF9kdXBsZXgsIGRvX3NvdW5kLCBsb2NrdXBfaGFjaworCSAqLworCWludCBpbnRzWzEwXSA9IHsgLTEgfTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgOSwgaW50cyk7CisKKyNkZWZpbmUgTUFZQkVfU0VUKFgsWSkgaWYgKGludHNbMF0gPj0gWSAmJiBpbnRzW1ldICE9IC0xKSB7IFggPSBpbnRzW1ldOyB9CisJTUFZQkVfU0VUKGlmX3BvcnQsIDMpOworCU1BWUJFX1NFVChmdWxsX2R1cGxleCwgNCk7CisJTUFZQkVfU0VUKGRvX3NvdW5kLCA1KTsKKwlNQVlCRV9TRVQobG9ja3VwX2hhY2ssIDYpOworI3VuZGVmICBNQVlCRV9TRVQKKworCXJldHVybiAwOworfQorCitfX3NldHVwKCJ4aXJjMnBzX2NzPSIsIHNldHVwX3hpcmMycHNfY3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY25ldDMyLmMgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NDdlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpAQCAtMCwwICsxLDIzNTggQEAKKy8qIHBjbmV0MzIuYzogQW4gQU1EIFBDbmV0MzIgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisgKglDb3B5cmlnaHQgMTk5Ni0xOTk5IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKglEZXJpdmVkIGZyb20gdGhlIGxhbmNlIGRyaXZlciB3cml0dGVuIDE5OTMsMTk5NCwxOTk1IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICoJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICoJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCVRoaXMgZHJpdmVyIGlzIGZvciBQQ25ldDMyIGFuZCBQQ25ldFBDSSBiYXNlZCBldGhlcmNhcmRzCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIDIzIE9jdCwgMjAwMC4KKyAqICBGaXhlZCBhIGZldyBidWdzLCByZWxhdGVkIHRvIHJ1bm5pbmcgdGhlIGNvbnRyb2xsZXIgaW4gMzJiaXQgbW9kZS4KKyAqCisgKiAgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERSVl9OQU1FCSJwY25ldDMyIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4zMGkiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIwNi4yOC4yMDA0IgorI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGVcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyoKKyAqIFBDSSBkZXZpY2UgaWRlbnRpZmllcnMgZm9yICJuZXcgc3R5bGUiIExpbnV4IFBDSSBEZXZpY2UgRHJpdmVycworICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNuZXQzMl9wY2lfdGJsW10gPSB7CisgICAgeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfTEFOQ0VfSE9NRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorICAgIHsgUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisgICAgLyoKKyAgICAgKiBBZGFwdGVycyB0aGF0IHdlcmUgc29sZCB3aXRoIElCTSdzIFJTLzYwMDAgb3IgcFNlcmllcyBoYXJkd2FyZSBoYXZlCisgICAgICogdGhlIGluY29ycmVjdCB2ZW5kb3IgaWQuCisgICAgICovCisgICAgeyBQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgICBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgMCB9LAorICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBwY25ldDMyX3BjaV90YmwpOworCitzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworCisvKgorICogVkxCIEkvTyBhZGRyZXNzZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwY25ldDMyX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisJeyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMCB9OworCisKKworc3RhdGljIGludCBwY25ldDMyX2RlYnVnID0gMDsKK3N0YXRpYyBpbnQgdHhfc3RhcnQgPSAxOyAvKiBNYXBwaW5nIC0tIDA6MjAsIDE6NjQsIDI6MTI4LCAzOn4yMjAgKGRlcGVuZHMgb24gY2hpcCB2ZXJzKSAqLworc3RhdGljIGludCBwY25ldDMydmxiOwkgLyogY2hlY2sgZm9yIFZMQiBjYXJkcyA/ICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcGNuZXQzMl9kZXY7CisKK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjsKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMjAwOworCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9BVUkgICAgICAweDAwCisjZGVmaW5lIFBDTkVUMzJfUE9SVF8xMEJUICAgICAweDAxCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9HUFNJICAgICAweDAyCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9NSUkgICAgICAweDAzCisKKyNkZWZpbmUgUENORVQzMl9QT1JUX1BPUlRTRUwgIDB4MDMKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FTRUwgICAgIDB4MDQKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwMCAgICAgIDB4NDAKKyNkZWZpbmUgUENORVQzMl9QT1JUX0ZECSAgICAgIDB4ODAKKworI2RlZmluZSBQQ05FVDMyX0RNQV9NQVNLIDB4ZmZmZmZmZmYKKworI2RlZmluZSBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQgKGppZmZpZXMgKyAoMiAqIEhaKSkKKyNkZWZpbmUgUENORVQzMl9CTElOS19USU1FT1VUCShqaWZmaWVzICsgKEhaLzQpKQorCisvKgorICogdGFibGUgdG8gdHJhbnNsYXRlIG9wdGlvbiB2YWx1ZXMgZnJvbSB0dWxpcAorICogdG8gaW50ZXJuYWwgb3B0aW9ucworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBvcHRpb25zX21hcHBpbmdbXSA9IHsKKyAgICBQQ05FVDMyX1BPUlRfQVNFTCwJCQkgICAvKiAgMCBBdXRvLXNlbGVjdAkgICovCisgICAgUENORVQzMl9QT1JUX0FVSSwJCQkgICAvKiAgMSBCTkMvQVVJCSAgKi8KKyAgICBQQ05FVDMyX1BPUlRfQVVJLAkJCSAgIC8qICAyIEFVSS9CTkMJICAqLworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICAzIG5vdCBzdXBwb3J0ZWQJICAqLworICAgIFBDTkVUMzJfUE9SVF8xMEJUIHwgUENORVQzMl9QT1JUX0ZELCAgIC8qICA0IDEwYmFzZVQtRkQJICAqLworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICA1IG5vdCBzdXBwb3J0ZWQJICAqLworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICA2IG5vdCBzdXBwb3J0ZWQJICAqLworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICA3IG5vdCBzdXBwb3J0ZWQJICAqLworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICA4IG5vdCBzdXBwb3J0ZWQJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUksCQkJICAgLyogIDkgTUlJIDEwYmFzZVQJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfRkQsCSAgIC8qIDEwIE1JSSAxMGJhc2VULUZECSAgKi8KKyAgICBQQ05FVDMyX1BPUlRfTUlJLAkJCSAgIC8qIDExIE1JSSAoYXV0b3NlbCkJICAqLworICAgIFBDTkVUMzJfUE9SVF8xMEJULAkJCSAgIC8qIDEyIDEwQmFzZVQJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfMTAwLCAgIC8qIDEzIE1JSSAxMDBCYXNlVHgJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfMTAwIHwgUENORVQzMl9QT1JUX0ZELCAvKiAxNCBNSUkgMTAwQmFzZVR4LUZEICovCisgICAgUENORVQzMl9QT1JUX0FTRUwJCQkgICAvKiAxNSBub3Qgc3VwcG9ydGVkCSAgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHBjbmV0MzJfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisgICAgIkxvb3BiYWNrIHRlc3QgIChvZmZsaW5lKSIKK307CisjZGVmaW5lIFBDTkVUMzJfVEVTVF9MRU4gKHNpemVvZihwY25ldDMyX2dzdHJpbmdzX3Rlc3QpIC8gRVRIX0dTVFJJTkdfTEVOKQorCisjZGVmaW5lIFBDTkVUMzJfTlVNX1JFR1MgMTY4CisKKyNkZWZpbmUgTUFYX1VOSVRTIDgJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdOworc3RhdGljIGludCBob21lcG5hW01BWF9VTklUU107CisKKy8qCisgKgkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisgKgorICogVGhpcyBkcml2ZXIgdXNlcyB0aGUgc2FtZSBzb2Z0d2FyZSBzdHJ1Y3R1cmUgYXMgdGhlIG5vcm1hbCBsYW5jZQorICogZHJpdmVyLiBTbyBsb29rIGZvciBhIHZlcmJvc2UgZGVzY3JpcHRpb24gaW4gbGFuY2UuYy4gVGhlIGRpZmZlcmVuY2VzCisgKiB0byB0aGUgbm9ybWFsIGxhbmNlIGRyaXZlciBpcyB0aGUgdXNlIG9mIHRoZSAzMmJpdCBtb2RlIG9mIFBDbmV0MzIKKyAqIGFuZCBQQ25ldFBDSSBjaGlwcy4gQmVjYXVzZSB0aGVzZSBjaGlwcyBhcmUgMzJiaXQgY2hpcHMsIHRoZXJlIGlzIG5vCisgKiAxNk1CIGxpbWl0YXRpb24gYW5kIHdlIGRvbid0IG5lZWQgYm91bmNlIGJ1ZmZlcnMuCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiB2MC4wMTogIEluaXRpYWwgdmVyc2lvbgorICoJICAgb25seSB0ZXN0ZWQgb24gQWxwaGEgTm9uYW1lIEJvYXJkCisgKiB2MC4wMjogIGNoYW5nZWQgSVJRIGhhbmRsaW5nIGZvciBuZXcgaW50ZXJydXB0IHNjaGVtZSAoZGV2X2lkKQorICoJICAgdGVzdGVkIG9uIGEgQVNVUyBTUDNHCisgKiB2MC4xMDogIGZpeGVkIGFuIG9kZCBwcm9ibGVtIHdpdGggdGhlIDc5Qzk3NCBpbiBhIENvbXBhcSBEZXNrcHJvIFhMCisgKgkgICBsb29rcyBsaWtlIHRoZSA5NzQgZG9lc24ndCBsaWtlIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIGluIGEKKyAqCSAgIHNob3J0IHBlcmlvZCBvZiB0aW1lOyBub3cgd2UgZG8gYSByZWluaXQgb2YgdGhlIGxhbmNlOyB0aGUKKyAqCSAgIGJ1ZyB3YXMgdHJpZ2dlcmVkIGJ5IGRvaW5nIGlmY29uZmlnIGV0aDAgPGlwPiBicm9hZGNhc3QgPGFkZHI+CisgKgkgICBhbmQgaGFuZ3MgdGhlIG1hY2hpbmUgKHRoYW5rcyB0byBLbGF1cyBMaWVkbCBmb3IgZGVidWdnaW5nKQorICogdjAuMTI6ICBieSBzdWdnZXN0aW9uIGZyb20gRG9uYWxkIEJlY2tlcjogUmVuYW1lZCBkcml2ZXIgdG8gcGNuZXQzMiwKKyAqCSAgIG1hZGUgaXQgc3RhbmRhbG9uZSAobm8gbmVlZCBmb3IgbGFuY2UuYykKKyAqIHYwLjEzOiAgYWRkZWQgYWRkaXRpb25hbCBQQ0kgZGV0ZWN0aW5nIGZvciBzcGVjaWFsIFBDSSBkZXZpY2VzIChDb21wYXEpCisgKiB2MC4xNDogIHN0cmlwcGVkIGRvd24gYWRkaXRpb25hbCBQQ0kgcHJvYmUgKHRoYW5rcyB0byBEYXZpZCBDIE5pZW1pCisgKgkgICBhbmQgc3ZlbmVyaWNAeHM0YWxsLm5sIGZvciB0ZXN0aW5nIHRoaXMgb24gdGhlaXIgQ29tcGFxIGJveGVzKQorICogdjAuMTU6ICBhZGRlZCA3OUM5NjUgKFZMQikgcHJvYmUKKyAqCSAgIGFkZGVkIGludGVycnVwdCBzaGFyaW5nIGZvciBQQ0kgY2hpcHMKKyAqIHYwLjE2OiAgZml4ZWQgc2V0X211bHRpY2FzdF9saXN0IG9uIEFscGhhIG1hY2hpbmVzCisgKiB2MC4xNzogIHJlbW92ZWQgaGFjayBmcm9tIGRldi5jOyBub3cgcGNuZXQzMiB1c2VzIGV0aGlmX3Byb2JlIGluIFNwYWNlLmMKKyAqIHYwLjE5OiAgY2hhbmdlZCBzZXR0aW5nIG9mIGF1dG9zZWxlY3QgYml0CisgKiB2MC4yMDogIHJlbW92ZWQgYWRkaXRpb25hbCBDb21wYXEgUENJIHByb2JlOyB0aGVyZSBpcyBub3cgYSB3b3JraW5nIG9uZQorICoJICAgaW4gYXJjaC9pMzg2L2Jpb3MzMi5jCisgKiB2MC4yMTogIGFkZGVkIGVuZGlhbiBjb252ZXJzaW9uIGZvciBwcGMsIGZyb20gd29yayBieSBjb3J0QGNzLm5tdC5lZHUKKyAqIHYwLjIyOiAgYWRkZWQgcHJpbnRpbmcgb2Ygc3RhdHVzIHRvIHJpbmcgZHVtcAorICogdjAuMjM6ICBjaGFuZ2VkIGVuZXRfc3RhdGlzdGljcyB0byBuZXRfZGV2aXZlX3N0YXRzCisgKiB2MC45MDogIGFkZGVkIG11bHRpY2FzdCBmaWx0ZXIKKyAqCSAgIGFkZGVkIG1vZHVsZSBzdXBwb3J0CisgKgkgICBjaGFuZ2VkIGlycSBwcm9iZSB0byBuZXcgc3R5bGUKKyAqCSAgIGFkZGVkIFBDbmV0RmFzdCBjaGlwIGlkCisgKgkgICBhZGRlZCBmaXggZm9yIHJlY2VpdmUgc3RhbGxzIHdpdGggSW50ZWwgc2F0dXJuIGNoaXBzZXRzCisgKgkgICBhZGRlZCBpbi1wbGFjZSByeCBza2JzIGxpa2UgaW4gdGhlIHR1bGlwIGRyaXZlcgorICoJICAgbWlub3IgY2xlYW51cHMKKyAqIHYwLjkxOiAgYWRkZWQgUENuZXRGYXN0KyBjaGlwIGlkCisgKgkgICBiYWNrIHBvcnQgdG8gMi4wLngKKyAqIHYxLjAwOiAgYWRkZWQgc29tZSBzdHVmZiBmcm9tIERvbmFsZCBCZWNrZXIncyAyLjAuMzQgdmVyc2lvbgorICoJICAgYWRkZWQgc3VwcG9ydCBmb3IgYnl0ZSBjb3VudGVycyBpbiBuZXRfZGV2X3N0YXRzCisgKiB2MS4wMTogIGRvIHJpbmcgZHVtcHMsIG9ubHkgd2hlbiBkZWJ1Z2dpbmcgdGhlIGRyaXZlcgorICoJICAgaW5jcmVhc2VkIHRoZSB0cmFuc21pdCB0aW1lb3V0CisgKiB2MS4wMjogIGZpeGVkIG1lbW9yeSBsZWFrIGluIHBjbmV0MzJfaW5pdF9yaW5nKCkKKyAqIHYxLjEwOiAgd29ya2Fyb3VuZCBmb3Igc3RvcHBlZCB0cmFuc21pdHRlcgorICoJICAgYWRkZWQgcG9ydCBzZWxlY3Rpb24gZm9yIG1vZHVsZXMKKyAqCSAgIGRldGVjdCBzcGVjaWFsIFQxL0UxIFdBTiBjYXJkIGFuZCBzZXR1cCBwb3J0IHNlbGVjdGlvbgorICogdjEuMTE6ICBmaXhlZCB3cm9uZyBjaGVja2luZyBvZiBUeCBlcnJvcnMKKyAqIHYxLjIwOiAgYWRkZWQgY2hlY2sgb2YgcmV0dXJuIHZhbHVlIGttYWxsb2MgKGNwZXRlcnNvQGNzLndhc2hpbmd0b24uZWR1KQorICoJICAgYWRkZWQgc2F2ZSBvcmlnaW5hbCBrbWFsbG9jIGFkZHIgZm9yIGZyZWVpbmcgKG1jckBzb2xpZHVtLmNvbSkKKyAqCSAgIGFkZGVkIHN1cHBvcnQgZm9yIFBDbmV0SG9tZSBjaGlwIChqb2VATUlULkVEVSkKKyAqCSAgIHJld3JpdHRlbiBQQ0kgY2FyZCBkZXRlY3Rpb24KKyAqCSAgIGFkZGVkIGR3aW8gbW9kZSB0byBnZXQgZHJpdmVyIHdvcmtpbmcgb24gc29tZSBQUEMgbWFjaGluZXMKKyAqIHYxLjIxOiAgYWRkZWQgbWlpIHNlbGVjdGlvbiBhbmQgbWlpIGlvY3RsCisgKiB2MS4yMjogIGNoYW5nZWQgcGNpIHNjYW5uaW5nIGNvZGUgdG8gbWFrZSBQUEMgcGVvcGxlIGhhcHB5CisgKgkgICBmaXhlZCBzd2l0Y2hpbmcgdG8gMzJiaXQgbW9kZSBpbiBwY25ldDMyX29wZW4oKSAodGhhbmtzCisgKgkgICB0byBNaWNoYWVsIFJpY2hhcmQgPG1jckBzb2xpZHVtLmNvbT4gZm9yIG5vdGljaW5nIHRoaXMgb25lKQorICoJICAgYWRkZWQgc3ViIHZlbmRvci9kZXZpY2UgaWQgbWF0Y2hpbmcgKHRoYW5rcyBhZ2FpbiB0bworICoJICAgTWljaGFlbCBSaWNoYXJkIDxtY3JAc29saWR1bS5jb20+KQorICoJICAgYWRkZWQgY2hpcCBpZCBmb3IgNzljOTczLzk3NSAodGhhbmtzIHRvIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+KQorICogdjEuMjMgICBmaXhlZCBzbWFsbCBidWcsIHdoZW4gbWFudWFsIHNlbGVjdGluZyBNSUkgc3BlZWQvZHVwbGV4CisgKiB2MS4yNCAgIEFwcGxpZWQgVGhvbWFzJyBwYXRjaCB0byB1c2UgVHhTdGFydFBvaW50IGFuZCB0aHVzIGRlY3JlYXNlIFR4RklGTworICoJICAgdW5kZXJmbG93cy4JQWRkZWQgdHhfc3RhcnRfcHQgbW9kdWxlIHBhcmFtZXRlci4gSW5jcmVhc2VkCisgKgkgICBUWF9SSU5HX1NJWkUgZnJvbSAxNiB0byAzMi4JQWRkZWQgI2lmZGVmJ2QgY29kZSB0byB1c2UgRFhTVUZMTworICoJICAgZm9yIEZBU1RbK10gY2hpcHNldHMuIDxrYWZAZmMuaHAuY29tPgorICogdjEuMjRhYyBBZGRlZCBTTVAgc3BpbmxvY2tpbmcgLSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogdjEuMjVrZiBBZGRlZCBObyBJbnRlcnJ1cHQgb24gc3VjY2Vzc2Z1bCBUeCBmb3Igc29tZSBUeCdzIDxrYWZAZmMuaHAuY29tPgorICogdjEuMjYgICBDb252ZXJ0ZWQgdG8gcGNpX2FsbG9jX2NvbnNpc3RlbnQsIEphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphbWV5QGNybC5kZWMuY29tPgorICogLQkgICBGaXhlZCBhIGZldyBidWdzLCByZWxhdGVkIHRvIHJ1bm5pbmcgdGhlIGNvbnRyb2xsZXIgaW4gMzJiaXQgbW9kZS4KKyAqCSAgIDIzIE9jdCwgMjAwMC4gIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorICoJICAgQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogdjEuMjZwICBGaXggb29wcyBvbiBybW1vZCtpbnNtb2Q7IHBsdWcgaS9vIHJlc291cmNlIGxlYWsgLSBQYXVsIEdvcnRtYWtlcgorICogdjEuMjcgICBpbXByb3ZlZCBDU1IvUFJPTSBhZGRyZXNzIGRldGVjdGlvbiwgbG90cyBvZiBjbGVhbnVwcywKKyAqIAkgICBuZXcgcGNuZXQzMnZsYiBtb2R1bGUgb3B0aW9uLCBIUC1QQVJJU0Mgc3VwcG9ydCwKKyAqIAkgICBhZGRlZCBtb2R1bGUgcGFyYW1ldGVyIGRlc2NyaXB0aW9ucywKKyAqIAkgICBpbml0aWFsIGV0aHRvb2wgc3VwcG9ydCAtIEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KKyAqIHYxLjI3YSAgU3VuIEZlYiAxMCAyMDAyIEdvIFRhbmlndWNoaSA8Z29AdHVyYm9saW51eC5jby5qcD4KKyAqCSAgIHVzZSBhbGxvY19ldGhlcmRldiBhbmQgcmVnaXN0ZXJfbmV0ZGV2CisgKgkgICBmaXggcGNpIHByb2JlIG5vdCBpbmNyZW1lbnQgY2FyZHNfZm91bmQKKyAqCSAgIEZEIGF1dG8gbmVnb3RpYXRlIGVycm9yIHdvcmthcm91bmQgZm9yIHhTZXJpZXMyNTAKKyAqCSAgIGNsZWFuIHVwIGFuZCB1c2luZyBuZXcgbWlpIG1vZHVsZQorICogdjEuMjdiICBTZXAgMzAgMjAwMiBLZW50IFlvZGVyIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqIAkgICBBZGRlZCB0aW1lciBmb3IgY2FibGUgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VzLgorICogdjEuMjggICAyMCBGZWIgMjAwNCBEb24gRnJ5IDxicmF6aWxudXRAdXMuaWJtLmNvbT4KKyAqCSAgIEpvbiBNYXNvbiA8am9ubWFzb25AdXMuaWJtLmNvbT4sIENoaW5tYXkgQWxiYWwgPGFsYmFsQGluLmlibS5jb20+CisgKgkgICBOb3cgdXNlcyBldGh0b29sX29wcywgbmV0aWZfbXNnXyogYW5kIGdlbmVyaWNfbWlpX2lvY3RsLgorICoJICAgRml4ZXMgYm9ndXMgJ0J1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZScsIHBjaV9bdW5dbWFwX3NpbmdsZQorICoJICAgbGVuZ3RoIGVycm9ycywgYW5kIHRyYW5zbWl0IGhhbmdzLiAgQ2xlYW5zIHVwIGFmdGVyIGVycm9ycyBpbiBvcGVuLgorICoJICAgSmltIExld2lzIDxqa2xld2lzQHVzLmlibS5jb20+IGFkZGVkIGV0aGVybmV0IGxvb3BiYWNrIHRlc3QuCisgKgkgICBUaG9tYXMgTXVuY2sgU3RlZW5ob2xkdCA8dG11c0B0bXVzLmRrPiBub24tbWlpIGlvY3RsIGNvcnJlY3Rpb25zLgorICogdjEuMjkgICA2IEFwciAyMDA0IEppbSBMZXdpcyA8amtsZXdpc0B1cy5pYm0uY29tPiBhZGRlZCBwaHlzaWNhbAorICoJICAgaWRlbnRpZmljYXRpb24gY29kZSAoYmxpbmsgbGVkJ3MpIGFuZCByZWdpc3RlciBkdW1wLgorICoJICAgRG9uIEZyeSBhZGRlZCB0aW1lciBmb3IgOTcxLzk3MiBzbyBza2J1ZnMgZG9uJ3QgcmVtYWluIG9uIHR4IHJpbmcKKyAqCSAgIGZvcmV2ZXIuCisgKiB2MS4zMCAgIDE4IE1heSAyMDA0IERvbiBGcnkgcmVtb3ZlZCB0aW1lciBhbmQgTGFzdCBUcmFuc21pdCBJbnRlcnJ1cHQKKyAqCSAgIChsdGludCkgYXMgdGhleSBhZGRlZCBjb21wbGV4aXR5IGFuZCBkaWRuJ3QgZ2l2ZSBnb29kIHRocm91Z2hwdXQuCisgKiB2MS4zMGEgIDIyIE1heSAyMDA0IERvbiBGcnkgbGltaXQgZnJhbWVzIHJlY2VpdmVkIGR1cmluZyBpbnRlcnJ1cHQuCisgKiB2MS4zMGIgIDI0IE1heSAyMDA0IERvbiBGcnkgZml4IGJvZ3VzIHR4IGNhcnJpZXIgZXJyb3JzIHdpdGggNzljOTczLAorICoJICAgYXNzaXN0ZWQgYnkgQnJ1Y2UgUGVucm9kIDxibXBlbnJvZEBlbmRydW50ZWNobm9sb2dpZXMuY29tPi4KKyAqIHYxLjMwYyAgMjUgTWF5IDIwMDQgRG9uIEZyeSBhZGRlZCBuZXRpZl93YWtlX3F1ZXVlIGFmdGVyIHBjbmV0MzJfcmVzdGFydC4KKyAqIHYxLjMwZCAgMDEgSnVuIDIwMDQgRG9uIEZyeSBkaXNjYXJkIG92ZXJzaXplIHJ4IHBhY2tldHMuCisgKiB2MS4zMGUgIDExIEp1biAyMDA0IERvbiBGcnkgcmVjb3ZlciBhZnRlciBmaWZvIGVycm9yIGFuZCByeCBoYW5nLgorICogdjEuMzBmICAxNiBKdW4gMjAwNCBEb24gRnJ5IGNsZWFudXAgSVJRIHRvIGFsbG93IDAgYW5kIDEgZm9yIFBDSSwKKyAqIAkgICBleHBhbmRpbmcgb24gc3VnZ2VzdGlvbnMgZnJvbSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+LAorICogCSAgIGFuZCBCcmlhbiBNdXJwaHkgPGJyaWFuQG11cnBoeS5kaz4uCisgKiB2MS4zMGcgIDIyIEp1biAyMDA0IFBhdHJpY2sgU2ltbW9ucyA8cHNpbW1vbnNAZmxhc2gubmV0PiBhZGRlZCBvcHRpb24KKyAqCSAgIGhvbWVwbmEgZm9yIHNlbGVjdGluZyBIb21lUE5BIG1vZGUgZm9yIFBDTmV0L0hvbWUgNzlDOTc4LgorICogdjEuMzBoICAyNCBKdW4gMjAwNCBEb24gRnJ5IGNvcnJlY3RseSBzZWxlY3QgYXV0bywgc3BlZWQsIGR1cGxleCBpbiBiY3IzMi4KKyAqIHYxLjMwaSAgMjggSnVuIDIwMDQgRG9uIEZyeSBjaGFuZ2UgdG8gdXNlIG1vZHVsZV9wYXJhbS4KKyAqLworCisKKy8qCisgKiBTZXQgdGhlIG51bWJlciBvZiBUeCBhbmQgUnggYnVmZmVycywgdXNpbmcgTG9nXzIoIyBidWZmZXJzKS4KKyAqIFJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDQgVHggYnVmZmVycywgYW5kIDE2IFJ4IGJ1ZmZlcnMuCisgKiBUaGF0IHRyYW5zbGF0ZXMgdG8gMiAoNCA9PSAyXl4yKSBhbmQgNCAoMTYgPT0gMl5eNCkuCisgKi8KKyNpZm5kZWYgUENORVQzMl9MT0dfVFhfQlVGRkVSUworI2RlZmluZSBQQ05FVDMyX0xPR19UWF9CVUZGRVJTIDQKKyNkZWZpbmUgUENORVQzMl9MT0dfUlhfQlVGRkVSUyA1CisjZW5kaWYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUJCSgxIDw8IChQQ05FVDMyX0xPR19UWF9CVUZGRVJTKSkKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkoVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUwkoKFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMpIDw8IDEyKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUMzJfTE9HX1JYX0JVRkZFUlMpKQorI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLCShSWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBSWF9SSU5HX0xFTl9CSVRTCSgoUENORVQzMl9MT0dfUlhfQlVGRkVSUykgPDwgNCkKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTQ0CisKKy8qIE9mZnNldHMgZnJvbSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZSBQQ05FVDMyX1dJT19SRFAJCTB4MTAKKyNkZWZpbmUgUENORVQzMl9XSU9fUkFQCQkweDEyCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JFU0VUCTB4MTQKKyNkZWZpbmUgUENORVQzMl9XSU9fQkRQCQkweDE2CisKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JEUAkweDEwCisjZGVmaW5lIFBDTkVUMzJfRFdJT19SQVAJMHgxNAorI2RlZmluZSBQQ05FVDMyX0RXSU9fUkVTRVQJMHgxOAorI2RlZmluZSBQQ05FVDMyX0RXSU9fQkRQCTB4MUMKKworI2RlZmluZSBQQ05FVDMyX1RPVEFMX1NJWkUJMHgyMAorCisvKiBUaGUgUENORVQzMiBSeCBhbmQgVHggcmluZyBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBwY25ldDMyX3J4X2hlYWQgeworICAgIHUzMiBiYXNlOworICAgIHMxNiBidWZfbGVuZ3RoOworICAgIHMxNiBzdGF0dXM7CisgICAgdTMyIG1zZ19sZW5ndGg7CisgICAgdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHBjbmV0MzJfdHhfaGVhZCB7CisgICAgdTMyIGJhc2U7CisgICAgczE2IGxlbmd0aDsKKyAgICBzMTYgc3RhdHVzOworICAgIHUzMiBtaXNjOworICAgIHUzMiByZXNlcnZlZDsKK307CisKKy8qIFRoZSBQQ05FVDMyIDMyLUJpdCBpbml0aWFsaXphdGlvbiBibG9jaywgZGVzY3JpYmVkIGluIGRhdGFib29rLiAqLworc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayB7CisgICAgdTE2IG1vZGU7CisgICAgdTE2IHRsZW5fcmxlbjsKKyAgICB1OAlwaHlzX2FkZHJbNl07CisgICAgdTE2IHJlc2VydmVkOworICAgIHUzMiBmaWx0ZXJbMl07CisgICAgLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGV4dHJhIGJpdHMuICovCisgICAgdTMyIHJ4X3Jpbmc7CisgICAgdTMyIHR4X3Jpbmc7Cit9OworCisvKiBQQ25ldDMyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0cnVjdCBwY25ldDMyX2FjY2VzcyB7CisgICAgdTE2ICgqcmVhZF9jc3IpKHVuc2lnbmVkIGxvbmcsIGludCk7CisgICAgdm9pZCAoKndyaXRlX2NzcikodW5zaWduZWQgbG9uZywgaW50LCB1MTYpOworICAgIHUxNiAoKnJlYWRfYmNyKSh1bnNpZ25lZCBsb25nLCBpbnQpOworICAgIHZvaWQgKCp3cml0ZV9iY3IpKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKyAgICB1MTYgKCpyZWFkX3JhcCkodW5zaWduZWQgbG9uZyk7CisgICAgdm9pZCAoKndyaXRlX3JhcCkodW5zaWduZWQgbG9uZywgdTE2KTsKKyAgICB2b2lkICgqcmVzZXQpKHVuc2lnbmVkIGxvbmcpOworfTsKKworLyoKKyAqIFRoZSBmaXJzdCB0aHJlZSBmaWVsZHMgb2YgcGNuZXQzMl9wcml2YXRlIGFyZSByZWFkIGJ5IHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqIHNvIHdlIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBieSBwY2lfYWxsb2NfY29uc2lzdGVudCgpLgorICovCitzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlIHsKKyAgICAvKiBUaGUgVHggYW5kIFJ4IHJpbmcgZW50cmllcyBtdXN0IGJlIGFsaWduZWQgb24gMTYtYnl0ZSBib3VuZGFyaWVzIGluIDMyYml0IG1vZGUuICovCisgICAgc3RydWN0IHBjbmV0MzJfcnhfaGVhZCAgICByeF9yaW5nW1JYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHBjbmV0MzJfdHhfaGVhZCAgICB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayBpbml0X2Jsb2NrOworICAgIGRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBETUEgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgdGhpcworCQkJCQkgICBvYmplY3QsIHJldHVybmVkIGJ5CisJCQkJCSAgIHBjaV9hbGxvY19jb25zaXN0ZW50ICovCisgICAgc3RydWN0IHBjaV9kZXYJKnBjaV9kZXY7CS8qIFBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgcGNpIGRldmljZQorCQkJCQkgICBzdHJ1Y3R1cmUgKi8KKyAgICBjb25zdCBjaGFyCQkqbmFtZTsKKyAgICAvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworICAgIHN0cnVjdCBza19idWZmCSp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisgICAgZG1hX2FkZHJfdAkJdHhfZG1hX2FkZHJbVFhfUklOR19TSVpFXTsKKyAgICBkbWFfYWRkcl90CQlyeF9kbWFfYWRkcltSWF9SSU5HX1NJWkVdOworICAgIHN0cnVjdCBwY25ldDMyX2FjY2VzcwlhOworICAgIHNwaW5sb2NrX3QJCWxvY2s7CQkvKiBHdWFyZCBsb2NrICovCisgICAgdW5zaWduZWQgaW50CWN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBpbnQJZGlydHlfcngsIGRpcnR5X3R4OyAvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIGNoYXIJCXR4X2Z1bGw7CisgICAgaW50CQkJb3B0aW9uczsKKyAgICB1bnNpZ25lZCBpbnQJc2hhcmVkX2lycToxLAkvKiBzaGFyZWQgaXJxIHBvc3NpYmxlICovCisJCQlkeHN1ZmxvOjEsCS8qIGRpc2FibGUgdHJhbnNtaXQgc3RvcCBvbiB1ZmxvICovCisJCQltaWk6MTsJCS8qIG1paSBwb3J0IGF2YWlsYWJsZSAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpuZXh0OworICAgIHN0cnVjdCBtaWlfaWZfaW5mbwltaWlfaWY7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJd2F0Y2hkb2dfdGltZXI7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJYmxpbmtfdGltZXI7CisgICAgdTMyCQkJbXNnX2VuYWJsZTsJLyogZGVidWcgbWVzc2FnZSBsZXZlbCAqLworfTsKKworc3RhdGljIHZvaWQgcGNuZXQzMl9wcm9iZV92bGJ1cyh2b2lkKTsKK3N0YXRpYyBpbnQgIHBjbmV0MzJfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworc3RhdGljIGludCAgcGNuZXQzMl9wcm9iZTEodW5zaWduZWQgbG9uZywgaW50LCBzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgIHBjbmV0MzJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgIHBjbmV0MzJfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCAgcGNuZXQzMl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCAgcGNuZXQzMl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgcGNuZXQzMl9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludCAgcGNuZXQzMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcGNuZXQzMl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBwY25ldDMyX2xvYWRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGNuZXQzMl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworc3RhdGljIHZvaWQgcGNuZXQzMl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sIGludCB2YWwpOworc3RhdGljIHZvaWQgcGNuZXQzMl9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjc3IwX2JpdHMpOworc3RhdGljIHZvaWQgcGNuZXQzMl9ldGh0b29sX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGhfdGVzdCwgdTY0ICpkYXRhKTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9sb29wYmFja190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ2NF90ICpkYXRhMSk7CitzdGF0aWMgaW50IHBjbmV0MzJfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7CitzdGF0aWMgdm9pZCBwY25ldDMyX2xlZF9ibGlua19jYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJdm9pZCAqcHRyKTsKKworZW51bSBwY2lfZmxhZ3NfYml0IHsKKyAgICBQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisgICAgUENJX0FERFIwPTB4MTA8PDAsIFBDSV9BRERSMT0weDEwPDwxLCBQQ0lfQUREUjI9MHgxMDw8MiwgUENJX0FERFIzPTB4MTA8PDMsCit9OworCisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9jc3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworICAgIG91dHcgKGluZGV4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgcmV0dXJuIGludyAoYWRkcitQQ05FVDMyX1dJT19SRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9jc3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworICAgIG91dHcgKGluZGV4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgb3V0dyAodmFsLCBhZGRyK1BDTkVUMzJfV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9iY3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworICAgIG91dHcgKGluZGV4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgcmV0dXJuIGludyAoYWRkcitQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9iY3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworICAgIG91dHcgKGluZGV4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgb3V0dyAodmFsLCBhZGRyK1BDTkVUMzJfV0lPX0JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9yYXAgKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKyAgICByZXR1cm4gaW53IChhZGRyK1BDTkVUMzJfV0lPX1JBUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3dyaXRlX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworICAgIG91dHcgKHZhbCwgYWRkcitQQ05FVDMyX1dJT19SQVApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb19yZXNldCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIGludyAoYWRkcitQQ05FVDMyX1dJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl93aW9fY2hlY2sgKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKyAgICBvdXR3ICg4OCwgYWRkcitQQ05FVDMyX1dJT19SQVApOworICAgIHJldHVybiAoaW53IChhZGRyK1BDTkVUMzJfV0lPX1JBUCkgPT0gODgpOworfQorCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfYWNjZXNzIHBjbmV0MzJfd2lvID0geworICAgIC5yZWFkX2Nzcgk9IHBjbmV0MzJfd2lvX3JlYWRfY3NyLAorICAgIC53cml0ZV9jc3IJPSBwY25ldDMyX3dpb193cml0ZV9jc3IsCisgICAgLnJlYWRfYmNyCT0gcGNuZXQzMl93aW9fcmVhZF9iY3IsCisgICAgLndyaXRlX2Jjcgk9IHBjbmV0MzJfd2lvX3dyaXRlX2JjciwKKyAgICAucmVhZF9yYXAJPSBwY25ldDMyX3dpb19yZWFkX3JhcCwKKyAgICAud3JpdGVfcmFwCT0gcGNuZXQzMl93aW9fd3JpdGVfcmFwLAorICAgIC5yZXNldAk9IHBjbmV0MzJfd2lvX3Jlc2V0Cit9OworCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX2NzciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgb3V0bCAoaW5kZXgsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7CisgICAgcmV0dXJuIChpbmwgKGFkZHIrUENORVQzMl9EV0lPX1JEUCkgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2R3aW9fd3JpdGVfY3NyICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCwgdTE2IHZhbCkKK3sKKyAgICBvdXRsIChpbmRleCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKKyAgICBvdXRsICh2YWwsIGFkZHIrUENORVQzMl9EV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfYmNyICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKyAgICBvdXRsIChpbmRleCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKKyAgICByZXR1cm4gKGlubCAoYWRkcitQQ05FVDMyX0RXSU9fQkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9iY3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworICAgIG91dGwgKGluZGV4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIG91dGwgKHZhbCwgYWRkcitQQ05FVDMyX0RXSU9fQkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9yYXAgKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKyAgICByZXR1cm4gKGlubCAoYWRkcitQQ05FVDMyX0RXSU9fUkFQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9yYXAgKHVuc2lnbmVkIGxvbmcgYWRkciwgdTE2IHZhbCkKK3sKKyAgICBvdXRsICh2YWwsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb19yZXNldCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIGlubCAoYWRkcitQQ05FVDMyX0RXSU9fUkVTRVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfZHdpb19jaGVjayAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIG91dGwgKDg4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIHJldHVybiAoKGlubCAoYWRkcitQQ05FVDMyX0RXSU9fUkFQKSAmIDB4ZmZmZikgPT0gODgpOworfQorCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfYWNjZXNzIHBjbmV0MzJfZHdpbyA9IHsKKyAgICAucmVhZF9jc3IJPSBwY25ldDMyX2R3aW9fcmVhZF9jc3IsCisgICAgLndyaXRlX2Nzcgk9IHBjbmV0MzJfZHdpb193cml0ZV9jc3IsCisgICAgLnJlYWRfYmNyCT0gcGNuZXQzMl9kd2lvX3JlYWRfYmNyLAorICAgIC53cml0ZV9iY3IJPSBwY25ldDMyX2R3aW9fd3JpdGVfYmNyLAorICAgIC5yZWFkX3JhcAk9IHBjbmV0MzJfZHdpb19yZWFkX3JhcCwKKyAgICAud3JpdGVfcmFwCT0gcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCwKKyAgICAucmVzZXQJPSBwY25ldDMyX2R3aW9fcmVzZXQKK307CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcGNuZXQzMl9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBkaXNhYmxlX2lycShkZXYtPmlycSk7CisgICAgcGNuZXQzMl9pbnRlcnJ1cHQoMCwgZGV2LCBOVUxMKTsKKyAgICBlbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgcGNuZXQzMl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgciA9IC1FT1BOT1RTVVBQOworCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwltaWlfZXRodG9vbF9nc2V0KCZscC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJciA9IDA7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IHIgPSAtRU9QTk9UU1VQUDsKKworICAgIGlmIChscC0+bWlpKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJciA9IG1paV9ldGh0b29sX3NzZXQoJmxwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKworICAgIHN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisgICAgc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisgICAgaWYgKGxwLT5wY2lfZGV2KQorCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGxwLT5wY2lfZGV2KSk7CisgICAgZWxzZQorCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJWTEIgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyB1MzIgcGNuZXQzMl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IHI7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBpZiAobHAtPm1paSkgeworCXIgPSBtaWlfbGlua19vaygmbHAtPm1paV9pZik7CisgICAgfSBlbHNlIHsKKwl1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsJLyogY2FyZCBiYXNlIEkvTyBhZGRyZXNzICovCisJciA9IChscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDQpICE9IDB4YzApOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB1MzIgcGNuZXQzMl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICByZXR1cm4gbHAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBscC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IHIgPSAtRU9QTk9UU1VQUDsKKworICAgIGlmIChscC0+bWlpKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJciA9IG1paV9ud2F5X3Jlc3RhcnQoJmxwLT5taWlfaWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKworICAgIGVyaW5nLT50eF9tYXhfcGVuZGluZyA9IFRYX1JJTkdfU0laRSAtIDE7CisgICAgZXJpbmctPnR4X3BlbmRpbmcgPSBscC0+Y3VyX3R4IC0gbHAtPmRpcnR5X3R4OworICAgIGVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IFJYX1JJTkdfU0laRSAtIDE7CisgICAgZXJpbmctPnJ4X3BlbmRpbmcgPSBscC0+Y3VyX3J4ICYgUlhfUklOR19NT0RfTUFTSzsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKyAgICBtZW1jcHkoZGF0YSwgcGNuZXQzMl9nc3RyaW5nc190ZXN0LCBzaXplb2YocGNuZXQzMl9nc3RyaW5nc190ZXN0KSk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9zZWxmX3Rlc3RfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByZXR1cm4gUENORVQzMl9URVNUX0xFTjsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9ldGh0b29sX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZXRodG9vbF90ZXN0ICp0ZXN0LCB1NjQgKmRhdGEpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgaW50IHJjOworCisgICAgaWYgKHRlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwlyYyA9IHBjbmV0MzJfbG9vcGJhY2tfdGVzdChkZXYsIGRhdGEpOworCWlmIChyYykgeworCSAgICBpZiAobmV0aWZfbXNnX2h3KGxwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMb29wYmFjayB0ZXN0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJICAgIHRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhscCkpCisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogTG9vcGJhY2sgdGVzdCBwYXNzZWQuXG4iLCBkZXYtPm5hbWUpOworICAgIH0gZWxzZSBpZiAobmV0aWZfbXNnX2h3KGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIHRlc3RzIHRvIHJ1biAoc3BlY2lmeSAnT2ZmbGluZScgb24gZXRodG9vbCkuIiwJICAgIGRldi0+bmFtZSk7Cit9IC8qIGVuZCBwY25ldDMyX2V0aHRvb2xfdGVzdCAqLworCitzdGF0aWMgaW50IHBjbmV0MzJfbG9vcGJhY2tfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1aW50NjRfdCAqZGF0YTEpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOwkvKiBhY2Nlc3MgdG8gcmVnaXN0ZXJzICovCisgICAgdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CS8qIGNhcmQgYmFzZSBJL08gYWRkcmVzcyAqLworICAgIHN0cnVjdCBza19idWZmICpza2I7CQkvKiBzayBidWZmICovCisgICAgaW50IHgsIGk7CQkJCS8qIGNvdW50ZXJzICovCisgICAgaW50IG51bWJ1ZmZzID0gNDsJCQkvKiBudW1iZXIgb2YgVFgvUlggYnVmZmVycyBhbmQgZGVzY3MgKi8KKyAgICB1MTYgc3RhdHVzID0gMHg4MzAwOwkJLyogVFggcmluZyBzdGF0dXMgKi8KKyAgICB1MTYgdGVzdHN0YXR1czsJCQkvKiB0ZXN0IG9mIHJpbmcgc3RhdHVzICovCisgICAgaW50IHJjOwkJCQkvKiByZXR1cm4gY29kZSAqLworICAgIGludCBzaXplOwkJCQkvKiBzaXplIG9mIHBhY2tldHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CQkvKiBzb3VyY2UgcGFja2V0IGRhdGEgKi8KKyAgICBzdGF0aWMgaW50IGRhdGFfbGVuID0gNjA7CQkvKiBsZW5ndGggb2Ygc291cmNlIHBhY2tldHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcgdGlja3M7CisKKyAgICAqZGF0YTEgPSAxOwkJCS8qIHN0YXR1cyBvZiB0ZXN0LCBkZWZhdWx0IHRvIGZhaWwgKi8KKyAgICByYyA9IDE7CQkJLyogZGVmYXVsdCB0byBmYWlsICovCisKKyAgICBpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCXBjbmV0MzJfY2xvc2UoZGV2KTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKyAgICBscC0+YS5yZXNldCAoaW9hZGRyKTsKKworICAgIC8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDIpOworCisgICAgbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKyAgICBscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAwOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDA7CisKKyAgICAvKiBwdXJnZSAmIGluaXQgcmluZ3MgYnV0IGRvbid0IGFjdHVhbGx5IHJlc3RhcnQgKi8KKyAgICBwY25ldDMyX3Jlc3RhcnQoZGV2LCAweDAwMDApOworCisgICAgbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDA0KTsJLyogU2V0IFNUT1AgYml0ICovCisKKyAgICAvKiBJbml0aWFsaXplIFRyYW5zbWl0IGJ1ZmZlcnMuICovCisgICAgc2l6ZSA9IGRhdGFfbGVuICsgMTU7CisgICAgZm9yICh4PTA7IHg8bnVtYnVmZnM7IHgrKykgeworCWlmICghKHNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSkpKSB7CisJICAgIGlmIChuZXRpZl9tc2dfaHcobHApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhbm5vdCBhbGxvY2F0ZSBza2IgYXQgbGluZTogJWQhXG4iLAorCQkgICAgZGV2LT5uYW1lLCBfX0xJTkVfXyk7CisJICAgIGdvdG8gY2xlYW5fdXA7CisJfSBlbHNlIHsKKwkgICAgcGFja2V0ID0gc2tiLT5kYXRhOworCSAgICBza2JfcHV0KHNrYiwgc2l6ZSk7CQkvKiBjcmVhdGUgc3BhY2UgZm9yIGRhdGEgKi8KKwkgICAgbHAtPnR4X3NrYnVmZlt4XSA9IHNrYjsKKwkgICAgbHAtPnR4X3JpbmdbeF0ubGVuZ3RoID0gbGUxNl90b19jcHUoLXNrYi0+bGVuKTsKKwkgICAgbHAtPnR4X3JpbmdbeF0ubWlzYyA9IDA7CisKKyAgICAgICAgICAgIC8qIHB1dCBEQSBhbmQgU0EgaW50byB0aGUgc2tiICovCisJICAgIGZvciAoaT0wOyBpPDY7IGkrKykKKwkJKnBhY2tldCsrID0gZGV2LT5kZXZfYWRkcltpXTsKKwkgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorCQkqcGFja2V0KysgPSBkZXYtPmRldl9hZGRyW2ldOworCSAgICAvKiB0eXBlICovCisJICAgICpwYWNrZXQrKyA9IDB4MDg7CisJICAgICpwYWNrZXQrKyA9IDB4MDY7CisJICAgIC8qIHBhY2tldCBudW1iZXIgKi8KKwkgICAgKnBhY2tldCsrID0geDsKKwkgICAgLyogZmlsbCBwYWNrZXQgd2l0aCBkYXRhICovCisJICAgIGZvciAoaT0wOyBpPGRhdGFfbGVuOyBpKyspCisJCSpwYWNrZXQrKyA9IGk7CisKKwkgICAgbHAtPnR4X2RtYV9hZGRyW3hdID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJICAgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkgICAgbHAtPnR4X3JpbmdbeF0uYmFzZSA9ICh1MzIpbGUzMl90b19jcHUobHAtPnR4X2RtYV9hZGRyW3hdKTsKKwkgICAgd21iKCk7IC8qIE1ha2Ugc3VyZSBvd25lciBjaGFuZ2VzIGFmdGVyIGFsbCBvdGhlcnMgYXJlIHZpc2libGUgKi8KKwkgICAgbHAtPnR4X3JpbmdbeF0uc3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHVzKTsKKwl9CisgICAgfQorCisgICAgeCA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMzIpOwkvKiBzZXQgaW50ZXJuYWwgbG9vcGJhY2sgaW4gQlNSMzIgKi8KKyAgICB4ID0geCB8IDB4MDAwMjsKKyAgICBhLT53cml0ZV9iY3IoaW9hZGRyLCAzMiwgeCk7CisKKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMTUsIDB4MDA0NCk7CS8qIHNldCBpbnQgbG9vcGJhY2sgaW4gQ1NSMTUgKi8KKworICAgIHRlc3RzdGF0dXMgPSBsZTE2X3RvX2NwdSgweDgwMDApOworICAgIGxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDAwMik7CQkvKiBTZXQgU1RSVCBiaXQgKi8KKworICAgIC8qIENoZWNrIHN0YXR1cyBvZiBkZXNjcmlwdG9ycyAqLworICAgIGZvciAoeD0wOyB4PG51bWJ1ZmZzOyB4KyspIHsKKwl0aWNrcyA9IDA7CisJcm1iKCk7CisJd2hpbGUgKChscC0+cnhfcmluZ1t4XS5zdGF0dXMgJiB0ZXN0c3RhdHVzKSAmJiAodGlja3MgPCAyMDApKSB7CisJICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJICAgIG1kZWxheSgxKTsKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJICAgIHJtYigpOworCSAgICB0aWNrcysrOworCX0KKwlpZiAodGlja3MgPT0gMjAwKSB7CisJICAgIGlmIChuZXRpZl9tc2dfaHcobHApKQorCQlwcmludGsoIiVzOiBEZXNjICVkIGZhaWxlZCB0byByZXNldCFcbiIsZGV2LT5uYW1lLHgpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDA0KTsJCS8qIFNldCBTVE9QIGJpdCAqLworICAgIHdtYigpOworICAgIGlmIChuZXRpZl9tc2dfaHcobHApICYmIG5ldGlmX21zZ19wa3RkYXRhKGxwKSkgeworCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggbG9vcGJhY2sgcGFja2V0czpcbiIsIGRldi0+bmFtZSk7CisKKwlmb3IgKHg9MDsgeDxudW1idWZmczsgeCsrKSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogUGFja2V0ICVkOlxuIiwgZGV2LT5uYW1lLCB4KTsKKwkgICAgc2tiID0gbHAtPnJ4X3NrYnVmZlt4XTsKKwkgICAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSB7CisJCXByaW50aygiJTAyeCAiLCAqKHNrYi0+ZGF0YStpKSk7CisJICAgIH0KKwkgICAgcHJpbnRrKCJcbiIpOworCX0KKyAgICB9CisKKyAgICB4ID0gMDsKKyAgICByYyA9IDA7CisgICAgd2hpbGUgKHg8bnVtYnVmZnMgJiYgIXJjKSB7CisJc2tiID0gbHAtPnJ4X3NrYnVmZlt4XTsKKwlwYWNrZXQgPSBscC0+dHhfc2tidWZmW3hdLT5kYXRhOworCWZvciAoaT0wOyBpPHNpemU7IGkrKykgeworCSAgICBpZiAoKihza2ItPmRhdGEraSkgIT0gcGFja2V0W2ldKSB7CisJCWlmIChuZXRpZl9tc2dfaHcobHApKQorCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFcnJvciBpbiBjb21wYXJlISAlMnggLSAlMDJ4ICUwMnhcbiIsCisJCQkgICAgZGV2LT5uYW1lLCBpLCAqKHNrYi0+ZGF0YStpKSwgcGFja2V0W2ldKTsKKwkJcmMgPSAxOworCQlicmVhazsKKwkgICAgfQorCX0KKwl4Kys7CisgICAgfQorICAgIGlmICghcmMpIHsKKwkqZGF0YTEgPSAwOworICAgIH0KKworY2xlYW5fdXA6CisgICAgeCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgMTUpICYgMHhGRkZGOworICAgIGEtPndyaXRlX2Nzcihpb2FkZHIsIDE1LCAoeCAmIH4weDAwNDQpKTsJLyogcmVzZXQgYml0cyA2IGFuZCAyICovCisKKyAgICB4ID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAzMik7CQkvKiByZXNldCBpbnRlcm5hbCBsb29wYmFjayAqLworICAgIHggPSB4ICYgfjB4MDAwMjsKKyAgICBhLT53cml0ZV9iY3IoaW9hZGRyLCAzMiwgeCk7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCXBjbmV0MzJfb3BlbihkZXYpOworICAgIH0gZWxzZSB7CisJbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDIwLCA0KTsJLyogcmV0dXJuIHRvIDE2Yml0IG1vZGUgKi8KKyAgICB9CisKKyAgICByZXR1cm4ocmMpOworfSAvKiBlbmQgcGNuZXQzMl9sb29wYmFja190ZXN0ICAqLworCitzdGF0aWMgdm9pZCBwY25ldDMyX2xlZF9ibGlua19jYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHN0cnVjdCBwY25ldDMyX2FjY2VzcyAqYSA9ICZscC0+YTsKKyAgICB1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZm9yIChpPTQ7IGk8ODsgaSsrKSB7CisJYS0+d3JpdGVfYmNyKGlvYWRkciwgaSwgYS0+cmVhZF9iY3IoaW9hZGRyLCBpKSBeIDB4NDAwMCk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBtb2RfdGltZXIoJmxwLT5ibGlua190aW1lciwgUENORVQzMl9CTElOS19USU1FT1VUKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOworICAgIHVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGksIHJlZ3NbNF07CisKKyAgICBpZiAoIWxwLT5ibGlua190aW1lci5mdW5jdGlvbikgeworCWluaXRfdGltZXIoJmxwLT5ibGlua190aW1lcik7CisJbHAtPmJsaW5rX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgcGNuZXQzMl9sZWRfYmxpbmtfY2FsbGJhY2s7CisJbHAtPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworICAgIH0KKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJjcnMgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGk9NDsgaTw4OyBpKyspIHsKKwlyZWdzW2ktNF0gPSBhLT5yZWFkX2Jjcihpb2FkZHIsIGkpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgbW9kX3RpbWVyKCZscC0+YmxpbmtfdGltZXIsIGppZmZpZXMpOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKyAgICBpZiAoKCFkYXRhKSB8fCAoZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKSkKKyAgICBkYXRhID0gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CisKKyAgICBzY2hlZHVsZV90aW1lb3V0KGRhdGEgKiBIWik7CisgICAgZGVsX3RpbWVyX3N5bmMoJmxwLT5ibGlua190aW1lcik7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYmNycyAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGZvciAoaT00OyBpPDg7IGkrKykgeworCWEtPndyaXRlX2Jjcihpb2FkZHIsIGksIHJlZ3NbaS00XSk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY25ldDMyX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJldHVybihQQ05FVDMyX05VTV9SRUdTICogc2l6ZW9mKHUxNikpOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJdm9pZCAqcHRyKQoreworICAgIGludCBpLCBjc3IwOworICAgIHUxNiAqYnVmZiA9IHB0cjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CisgICAgdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHRpY2tzOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGNzcjAgPSBhLT5yZWFkX2Nzcihpb2FkZHIsIDApOworICAgIGlmICghKGNzcjAgJiAweDAwMDQpKSB7CS8qIElmIG5vdCBzdG9wcGVkICovCisJLyogc2V0IFNVU1BFTkQgKFNQTkQpIC0gQ1NSNSBiaXQgMCAqLworCWEtPndyaXRlX2Nzcihpb2FkZHIsIDUsIDB4MDAwMSk7CisKKwkvKiBwb2xsIHdhaXRpbmcgZm9yIGJpdCB0byBiZSBzZXQgKi8KKwl0aWNrcyA9IDA7CisJd2hpbGUgKCEoYS0+cmVhZF9jc3IoaW9hZGRyLCA1KSAmIDB4MDAwMSkpIHsKKwkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgbWRlbGF5KDEpOworCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgdGlja3MrKzsKKwkgICAgaWYgKHRpY2tzID4gMjAwKSB7CisJCWlmIChuZXRpZl9tc2dfaHcobHApKQorCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFcnJvciBnZXR0aW5nIGludG8gc3VzcGVuZCFcbiIsCisJCQkgICAgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogcmVhZCBhZGRyZXNzIFBST00gKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSArPSAyKQorCSpidWZmKysgPSBpbncoaW9hZGRyICsgaSk7CisKKyAgICAvKiByZWFkIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgICBmb3IgKGk9MDsgaTw5MDsgaSsrKSB7CisJKmJ1ZmYrKyA9IGEtPnJlYWRfY3NyKGlvYWRkciwgaSk7CisgICAgfQorCisgICAgKmJ1ZmYrKyA9IGEtPnJlYWRfY3NyKGlvYWRkciwgMTEyKTsKKyAgICAqYnVmZisrID0gYS0+cmVhZF9jc3IoaW9hZGRyLCAxMTQpOworCisgICAgLyogcmVhZCBidXMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKyAgICBmb3IgKGk9MDsgaTwzNjsgaSsrKSB7CisJKmJ1ZmYrKyA9IGEtPnJlYWRfYmNyKGlvYWRkciwgaSk7CisgICAgfQorCisgICAgLyogcmVhZCBtaWkgcGh5IHJlZ2lzdGVycyAqLworICAgIGlmIChscC0+bWlpKSB7CisJZm9yIChpPTA7IGk8MzI7IGkrKykgeworCSAgICBscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgKChscC0+bWlpX2lmLnBoeV9pZCkgPDwgNSkgfCBpKTsKKwkgICAgKmJ1ZmYrKyA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzQpOworCX0KKyAgICB9CisKKyAgICBpZiAoIShjc3IwICYgMHgwMDA0KSkgewkvKiBJZiBub3Qgc3RvcHBlZCAqLworCS8qIGNsZWFyIFNVU1BFTkQgKFNQTkQpIC0gQ1NSNSBiaXQgMCAqLworCWEtPndyaXRlX2Nzcihpb2FkZHIsIDUsIDB4MDAwMCk7CisgICAgfQorCisgICAgaSA9IGJ1ZmYgLSAodTE2ICopcHRyOworICAgIGZvciAoOyBpIDwgUENORVQzMl9OVU1fUkVHUzsgaSsrKQorCSpidWZmKysgPSAwOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBwY25ldDMyX2V0aHRvb2xfb3BzID0geworICAgIC5nZXRfc2V0dGluZ3MJPSBwY25ldDMyX2dldF9zZXR0aW5ncywKKyAgICAuc2V0X3NldHRpbmdzCT0gcGNuZXQzMl9zZXRfc2V0dGluZ3MsCisgICAgLmdldF9kcnZpbmZvCT0gcGNuZXQzMl9nZXRfZHJ2aW5mbywKKyAgICAuZ2V0X21zZ2xldmVsCT0gcGNuZXQzMl9nZXRfbXNnbGV2ZWwsCisgICAgLnNldF9tc2dsZXZlbAk9IHBjbmV0MzJfc2V0X21zZ2xldmVsLAorICAgIC5ud2F5X3Jlc2V0CQk9IHBjbmV0MzJfbndheV9yZXNldCwKKyAgICAuZ2V0X2xpbmsJCT0gcGNuZXQzMl9nZXRfbGluaywKKyAgICAuZ2V0X3JpbmdwYXJhbQk9IHBjbmV0MzJfZ2V0X3JpbmdwYXJhbSwKKyAgICAuZ2V0X3R4X2NzdW0JPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorICAgIC5nZXRfc2cJCT0gZXRodG9vbF9vcF9nZXRfc2csCisgICAgLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorICAgIC5nZXRfc3RyaW5ncwk9IHBjbmV0MzJfZ2V0X3N0cmluZ3MsCisgICAgLnNlbGZfdGVzdF9jb3VudAk9IHBjbmV0MzJfc2VsZl90ZXN0X2NvdW50LAorICAgIC5zZWxmX3Rlc3QJCT0gcGNuZXQzMl9ldGh0b29sX3Rlc3QsCisgICAgLnBoeXNfaWQJCT0gcGNuZXQzMl9waHlzX2lkLAorICAgIC5nZXRfcmVnc19sZW4JPSBwY25ldDMyX2dldF9yZWdzX2xlbiwKKyAgICAuZ2V0X3JlZ3MJCT0gcGNuZXQzMl9nZXRfcmVncywKK307CisKKy8qIG9ubHkgcHJvYmVzIGZvciBub24tUENJIGRldmljZXMsIHRoZSByZXN0IGFyZSBoYW5kbGVkIGJ5CisgKiBwY2lfcmVnaXN0ZXJfZHJpdmVyIHZpYSBwY25ldDMyX3Byb2JlX3BjaSAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3BjbmV0MzJfcHJvYmVfdmxidXModm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgKnBvcnQsIGlvYWRkcjsKKworICAgIC8qIHNlYXJjaCBmb3IgUENuZXQzMiBWTEIgY2FyZHMgYXQga25vd24gYWRkcmVzc2VzICovCisgICAgZm9yIChwb3J0ID0gcGNuZXQzMl9wb3J0bGlzdDsgKGlvYWRkciA9ICpwb3J0KTsgcG9ydCsrKSB7CisJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgUENORVQzMl9UT1RBTF9TSVpFLCAicGNuZXQzMl9wcm9iZV92bGJ1cyIpKSB7CisJICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIHJlYWxseSBhIHBjbmV0IGNoaXAgb24gdGhhdCBpb2FkZHIgKi8KKwkgICAgaWYgKChpbmIoaW9hZGRyICsgMTQpID09IDB4NTcpICYmIChpbmIoaW9hZGRyICsgMTUpID09IDB4NTcpKSB7CisJCXBjbmV0MzJfcHJvYmUxKGlvYWRkciwgMCwgTlVMTCk7CisJICAgIH0gZWxzZSB7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgUENORVQzMl9UT1RBTF9TSVpFKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQKK3BjbmV0MzJfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKyAgICBpZiAoZXJyIDwgMCkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gZW5hYmxlIGRldmljZSAtLSBlcnI9JWRcbiIsIGVycik7CisJcmV0dXJuIGVycjsKKyAgICB9CisgICAgcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyAgICBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworICAgIGlmICghaW9hZGRyKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayAoS0VSTl9FUlIgUEZYICJjYXJkIGhhcyBubyBQQ0kgSU8gcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwZGV2LCBQQ05FVDMyX0RNQV9NQVNLKSkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIGlmIChyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFBDTkVUMzJfVE9UQUxfU0laRSwgInBjbmV0MzJfcHJvYmVfcGNpIikgPT0gTlVMTCkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJpbyBhZGRyZXNzIHJhbmdlIGFscmVhZHkgYWxsb2NhdGVkXG4iKTsKKwlyZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGVyciA9ICBwY25ldDMyX3Byb2JlMShpb2FkZHIsIDEsIHBkZXYpOworICAgIGlmIChlcnIgPCAwKSB7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qIHBjbmV0MzJfcHJvYmUxCisgKiAgQ2FsbGVkIGZyb20gYm90aCBwY25ldDMyX3Byb2JlX3ZsYnVzIGFuZCBwY25ldF9wcm9iZV9wY2kuCisgKiAgcGRldiB3aWxsIGJlIE5VTEwgd2hlbiBjYWxsZWQgZnJvbSBwY25ldDMyX3Byb2JlX3ZsYnVzLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcGNuZXQzMl9wcm9iZTEodW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBzaGFyZWQsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwOworICAgIGRtYV9hZGRyX3QgbHBfZG1hX2FkZHI7CisgICAgaW50IGksIG1lZGlhOworICAgIGludCBmZHgsIG1paSwgZnNldCwgZHhzdWZsbzsKKyAgICBpbnQgY2hpcF92ZXJzaW9uOworICAgIGNoYXIgKmNoaXBuYW1lOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gTlVMTDsKKyAgICB1OCBwcm9tYWRkcls2XTsKKyAgICBpbnQgcmV0ID0gLUVOT0RFVjsKKworICAgIC8qIHJlc2V0IHRoZSBjaGlwICovCisgICAgcGNuZXQzMl93aW9fcmVzZXQoaW9hZGRyKTsKKworICAgIC8qIE5PVEU6IDE2LWJpdCBjaGVjayBpcyBmaXJzdCwgb3RoZXJ3aXNlIHNvbWUgb2xkZXIgUENuZXQgY2hpcHMgZmFpbCAqLworICAgIGlmIChwY25ldDMyX3dpb19yZWFkX2Nzcihpb2FkZHIsIDApID09IDQgJiYgcGNuZXQzMl93aW9fY2hlY2soaW9hZGRyKSkgeworCWEgPSAmcGNuZXQzMl93aW87CisgICAgfSBlbHNlIHsKKwlwY25ldDMyX2R3aW9fcmVzZXQoaW9hZGRyKTsKKwlpZiAocGNuZXQzMl9kd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNCAmJiBwY25ldDMyX2R3aW9fY2hlY2soaW9hZGRyKSkgeworCSAgICBhID0gJnBjbmV0MzJfZHdpbzsKKwl9IGVsc2UKKwkgICAgZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisgICAgfQorCisgICAgY2hpcF92ZXJzaW9uID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4OCkgfCAoYS0+cmVhZF9jc3IoaW9hZGRyLDg5KSA8PCAxNik7CisgICAgaWYgKChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKSAmJiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19IVykpCisJcHJpbnRrKEtFUk5fSU5GTyAiICBQQ25ldCBjaGlwIHZlcnNpb24gaXMgJSN4LlxuIiwgY2hpcF92ZXJzaW9uKTsKKyAgICBpZiAoKGNoaXBfdmVyc2lvbiAmIDB4ZmZmKSAhPSAweDAwMykgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5zdXBwb3J0ZWQgY2hpcCB2ZXJzaW9uLlxuIik7CisJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKyAgICBmZHggPSBtaWkgPSBmc2V0ID0gZHhzdWZsbyA9IDA7CisgICAgY2hpcF92ZXJzaW9uID0gKGNoaXBfdmVyc2lvbiA+PiAxMikgJiAweGZmZmY7CisKKyAgICBzd2l0Y2ggKGNoaXBfdmVyc2lvbikgeworICAgIGNhc2UgMHgyNDIwOgorCWNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOyAvKiBQQ0kgKi8KKwlicmVhazsKKyAgICBjYXNlIDB4MjQzMDoKKwlpZiAoc2hhcmVkKQorCSAgICBjaGlwbmFtZSA9ICJQQ25ldC9QQ0kgNzlDOTcwIjsgLyogOTcwIGdpdmVzIHRoZSB3cm9uZyBjaGlwIGlkIGJhY2sgKi8KKwllbHNlCisJICAgIGNoaXBuYW1lID0gIlBDbmV0LzMyIDc5Qzk2NSI7IC8qIDQ4Ni9WTCBidXMgKi8KKwlicmVhazsKKyAgICBjYXNlIDB4MjYyMToKKwljaGlwbmFtZSA9ICJQQ25ldC9QQ0kgSUkgNzlDOTcwQSI7IC8qIFBDSSAqLworCWZkeCA9IDE7CisJYnJlYWs7CisgICAgY2FzZSAweDI2MjM6CisJY2hpcG5hbWUgPSAiUENuZXQvRkFTVCA3OUM5NzEiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOyBtaWkgPSAxOyBmc2V0ID0gMTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjYyNDoKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUKyA3OUM5NzIiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOyBtaWkgPSAxOyBmc2V0ID0gMTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjYyNToKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzMiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOyBtaWkgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI2OgorCWNoaXBuYW1lID0gIlBDbmV0L0hvbWUgNzlDOTc4IjsgLyogUENJICovCisJZmR4ID0gMTsKKwkvKgorCSAqIFRoaXMgaXMgYmFzZWQgb24gc3BlY3MgcHVibGlzaGVkIGF0IHd3dy5hbWQuY29tLiAgVGhpcyBzZWN0aW9uCisJICogYXNzdW1lcyB0aGF0IGEgY2FyZCB3aXRoIGEgNzlDOTc4IHdhbnRzIHRvIGdvIGludG8gc3RhbmRhcmQKKwkgKiBldGhlcm5ldCBtb2RlLiAgVGhlIDc5Qzk3OCBjYW4gYWxzbyBnbyBpbnRvIDFNYiBIb21lUE5BIG1vZGUsCisJICogYW5kIHRoZSBtb2R1bGUgb3B0aW9uIGhvbWVwbmE9MSBjYW4gc2VsZWN0IHRoaXMgaW5zdGVhZC4KKwkgKi8KKwltZWRpYSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgNDkpOworCW1lZGlhICY9IH4zOwkJLyogZGVmYXVsdCB0byAxME1iIGV0aGVybmV0ICovCisJaWYgKGNhcmRzX2ZvdW5kIDwgTUFYX1VOSVRTICYmIGhvbWVwbmFbY2FyZHNfZm91bmRdKQorCSAgICBtZWRpYSB8PSAxOyAJLyogc3dpdGNoIHRvIGhvbWUgd2lyaW5nIG1vZGUgKi8KKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgUEZYICJtZWRpYSBzZXQgdG8gJXNNYml0IG1vZGUuXG4iLCAKKwkJICAgIChtZWRpYSAmIDEpID8gIjEiIDogIjEwIik7CisJYS0+d3JpdGVfYmNyKGlvYWRkciwgNDksIG1lZGlhKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjYyNzoKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzUiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOyBtaWkgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI4OgorCWNoaXBuYW1lID0gIlBDbmV0L1BSTyA3OUM5NzYiOworCWZkeCA9IDE7IG1paSA9IDE7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBDbmV0IHZlcnNpb24gJSN4LCBubyBQQ25ldDMyIGNoaXAuXG4iLAorCQkgICAgY2hpcF92ZXJzaW9uKTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisKKyAgICAvKgorICAgICAqCU9uIHNlbGVjdGVkIGNoaXBzIHR1cm4gb24gdGhlIEJDUjE4Ok5PVUZMTyBiaXQuIFRoaXMgc3RvcHMgdHJhbnNtaXQKKyAgICAgKglzdGFydGluZyB1bnRpbCB0aGUgcGFja2V0IGlzIGxvYWRlZC4gU3RyaWtlIG9uZSBmb3IgcmVsaWFiaWxpdHksIGxvc2UKKyAgICAgKglvbmUgZm9yIGxhdGVuY3kgLSBhbHRob3VnaCBvbiBQQ0kgdGhpcyBpc250IGEgYmlnIGxvc3MuIE9sZGVyIGNoaXBzCisgICAgICoJaGF2ZSBGSUZPJ3Mgc21hbGxlciB0aGFuIGEgcGFja2V0LCBzbyB5b3UgY2FuJ3QgZG8gdGhpcy4KKyAgICAgKglUdXJuIG9uIEJDUjE4OkJ1cnN0UmRFbiBhbmQgQkNSMTg6QnVyc3RXckVuLgorICAgICAqLworCisgICAgaWYgKGZzZXQpIHsKKwlhLT53cml0ZV9iY3IoaW9hZGRyLCAxOCwgKGEtPnJlYWRfYmNyKGlvYWRkciwgMTgpIHwgMHgwODYwKSk7CisJYS0+d3JpdGVfY3NyKGlvYWRkciwgODAsIChhLT5yZWFkX2Nzcihpb2FkZHIsIDgwKSAmIDB4MEMwMCkgfCAweDBjMDApOworCWR4c3VmbG8gPSAxOworICAgIH0KKworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworICAgIGlmICghZGV2KSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCXJldCA9IC1FTk9NRU07CisJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisgICAgfQorICAgIFNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgYXQgJSMzbHgsIiwgY2hpcG5hbWUsIGlvYWRkcik7CisKKyAgICAvKiBJbiBtb3N0IGNoaXBzLCBhZnRlciBhIGNoaXAgcmVzZXQsIHRoZSBldGhlcm5ldCBhZGRyZXNzIGlzIHJlYWQgZnJvbSB0aGUKKyAgICAgKiBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgYmFzZSBhZGRyZXNzIGFuZCBwcm9ncmFtbWVkIGludG8gdGhlCisgICAgICogIlBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXJzIiBDU1IxMi0xNC4KKyAgICAgKiBBcyBhIHByZWNhdXRpb25hcnkgbWVhc3VyZSwgd2UgcmVhZCB0aGUgUFJPTSB2YWx1ZXMgYW5kIGNvbXBsYWluIGlmCisgICAgICogdGhleSBkaXNhZ3JlZSB3aXRoIHRoZSBDU1JzLiAgRWl0aGVyIHdheSwgd2UgdXNlIHRoZSBDU1IgdmFsdWVzLCBhbmQKKyAgICAgKiBkb3VibGUgY2hlY2sgdGhhdCB0aGV5IGFyZSB2YWxpZC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJdW5zaWduZWQgaW50IHZhbDsKKwl2YWwgPSBhLT5yZWFkX2Nzcihpb2FkZHIsIGkrMTIpICYgMHgwZmZmZjsKKwkvKiBUaGVyZSBtYXkgYmUgZW5kaWFubmVzcyBpc3N1ZXMgaGVyZS4gKi8KKwlkZXYtPmRldl9hZGRyWzIqaV0gPSB2YWwgJiAweDBmZjsKKwlkZXYtPmRldl9hZGRyWzIqaSsxXSA9ICh2YWwgPj4gOCkgJiAweDBmZjsKKyAgICB9CisKKyAgICAvKiByZWFkIFBST00gYWRkcmVzcyBhbmQgY29tcGFyZSB3aXRoIENTUiBhZGRyZXNzICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcm9tYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKTsKKworICAgIGlmIChtZW1jbXAocHJvbWFkZHIsIGRldi0+ZGV2X2FkZHIsIDYpCisJfHwgIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKyNpZm5kZWYgX19wb3dlcnBjX18KKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihwcm9tYWRkcikpIHsKKyNlbHNlCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpCisJICAgICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHJvbWFkZHIpKSB7CisjZW5kaWYKKwkgICAgaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpIHsKKwkJcHJpbnRrKCIgd2FybmluZzogQ1NSIGFkZHJlc3MgaW52YWxpZCxcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICIgICAgdXNpbmcgaW5zdGVhZCBQUk9NIGFkZHJlc3Mgb2YiKTsKKwkgICAgfQorCSAgICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgcHJvbWFkZHIsIDYpOworCX0KKyAgICB9CisKKyAgICAvKiBpZiB0aGUgZXRoZXJuZXQgYWRkcmVzcyBpcyBub3QgdmFsaWQsIGZvcmNlIHRvIDAwOjAwOjAwOjAwOjAwOjAwICovCisgICAgaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQorCW1lbXNldChkZXYtPmRldl9hZGRyLCAwLCBzaXplb2YoZGV2LT5kZXZfYWRkcikpOworCisgICAgaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpIHsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAgICBwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCisJLyogVmVyc2lvbiAweDI2MjMgYW5kIDB4MjYyNCAqLworCWlmICgoKGNoaXBfdmVyc2lvbiArIDEpICYgMHhmZmZlKSA9PSAweDI2MjQpIHsKKwkgICAgaSA9IGEtPnJlYWRfY3NyKGlvYWRkciwgODApICYgMHgwQzAwOyAgLyogQ2hlY2sgdHhfc3RhcnRfcHQgKi8KKwkgICAgcHJpbnRrKCJcbiIgS0VSTl9JTkZPICIgICAgdHhfc3RhcnRfcHQoMHglMDR4KToiLGkpOworCSAgICBzd2l0Y2goaT4+MTApIHsKKwkJY2FzZSAwOiBwcmludGsoIiAgMjAgYnl0ZXMsIik7IGJyZWFrOworCQljYXNlIDE6IHByaW50aygiICA2NCBieXRlcywiKTsgYnJlYWs7CisJCWNhc2UgMjogcHJpbnRrKCIgMTI4IGJ5dGVzLCIpOyBicmVhazsKKwkJY2FzZSAzOiBwcmludGsoIn4yMjAgYnl0ZXMsIik7IGJyZWFrOworCSAgICB9CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDE4KTsgIC8qIENoZWNrIEJ1cnN0L0J1cyBjb250cm9sICovCisJICAgIHByaW50aygiIEJDUjE4KCV4KToiLGkmMHhmZmZmKTsKKwkgICAgaWYgKGkgJiAoMTw8NSkpIHByaW50aygiQnVyc3RXckVuICIpOworCSAgICBpZiAoaSAmICgxPDw2KSkgcHJpbnRrKCJCdXJzdFJkRW4gIik7CisJICAgIGlmIChpICYgKDE8PDcpKSBwcmludGsoIkRXb3JkSU8gIik7CisJICAgIGlmIChpICYgKDE8PDExKSkgcHJpbnRrKCJOb1VGbG93ICIpOworCSAgICBpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNSk7CisJICAgIHByaW50aygiXG4iIEtFUk5fSU5GTyAiICAgIFNSQU1TSVpFPTB4JTA0eCwiLGk8PDgpOworCSAgICBpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNik7CisJICAgIHByaW50aygiIFNSQU1fQk5EPTB4JTA0eCwiLGk8PDgpOworCSAgICBpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNyk7CisJICAgIGlmIChpICYgKDE8PDE0KSkgcHJpbnRrKCJMb3dMYXRSeCIpOworCX0KKyAgICB9CisKKyAgICBkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKyAgICAvKiBwY2lfYWxsb2NfY29uc2lzdGVudCByZXR1cm5zIHBhZ2UtYWxpZ25lZCBtZW1vcnksIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGNoZWNrIHRoZSBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKGxwID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKCpscCksICZscF9kbWFfYWRkcikpID09IE5VTEwpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwlyZXQgPSAtRU5PTUVNOworCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworICAgIH0KKworICAgIG1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworICAgIGxwLT5kbWFfYWRkciA9IGxwX2RtYV9hZGRyOworICAgIGxwLT5wY2lfZGV2ID0gcGRldjsKKworICAgIHNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKyAgICBkZXYtPnByaXYgPSBscDsKKyAgICBscC0+bmFtZSA9IGNoaXBuYW1lOworICAgIGxwLT5zaGFyZWRfaXJxID0gc2hhcmVkOworICAgIGxwLT5taWlfaWYuZnVsbF9kdXBsZXggPSBmZHg7CisgICAgbHAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisgICAgbHAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworICAgIGxwLT5keHN1ZmxvID0gZHhzdWZsbzsKKyAgICBscC0+bWlpID0gbWlpOworICAgIGxwLT5tc2dfZW5hYmxlID0gcGNuZXQzMl9kZWJ1ZzsKKyAgICBpZiAoKGNhcmRzX2ZvdW5kID49IE1BWF9VTklUUykgfHwgKG9wdGlvbnNbY2FyZHNfZm91bmRdID4gc2l6ZW9mKG9wdGlvbnNfbWFwcGluZykpKQorCWxwLT5vcHRpb25zID0gUENORVQzMl9QT1JUX0FTRUw7CisgICAgZWxzZQorCWxwLT5vcHRpb25zID0gb3B0aW9uc19tYXBwaW5nW29wdGlvbnNbY2FyZHNfZm91bmRdXTsKKyAgICBscC0+bWlpX2lmLmRldiA9IGRldjsKKyAgICBscC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKyAgICBscC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCisgICAgaWYgKGZkeCAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpICYmCisJCSgoY2FyZHNfZm91bmQ+PU1BWF9VTklUUykgfHwgZnVsbF9kdXBsZXhbY2FyZHNfZm91bmRdKSkKKwlscC0+b3B0aW9ucyB8PSBQQ05FVDMyX1BPUlRfRkQ7CisKKyAgICBpZiAoIWEpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gYWNjZXNzIG1ldGhvZHNcbiIpOworCXJldCA9IC1FTk9ERVY7CisJZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworICAgIH0KKyAgICBscC0+YSA9ICphOworCisgICAgLyogZGV0ZWN0IHNwZWNpYWwgVDEvRTEgV0FOIGNhcmQgYnkgY2hlY2tpbmcgZm9yIE1BQyBhZGRyZXNzICovCisgICAgaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gMHgwMCAmJiBkZXYtPmRldl9hZGRyWzFdID09IDB4ZTAKKwkgICAgJiYgZGV2LT5kZXZfYWRkclsyXSA9PSAweDc1KQorCWxwLT5vcHRpb25zID0gUENORVQzMl9QT1JUX0ZEIHwgUENORVQzMl9QT1JUX0dQU0k7CisKKyAgICBscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoMHgwMDAzKTsJLyogRGlzYWJsZSBSeCBhbmQgVHguICovCisgICAgbHAtPmluaXRfYmxvY2sudGxlbl9ybGVuID0gbGUxNl90b19jcHUoVFhfUklOR19MRU5fQklUUyB8IFJYX1JJTkdfTEVOX0JJVFMpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICBscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7CisgICAgbHAtPmluaXRfYmxvY2sucnhfcmluZyA9ICh1MzIpbGUzMl90b19jcHUobHAtPmRtYV9hZGRyICsKKwkgICAgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgcnhfcmluZykpOworICAgIGxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAodTMyKWxlMzJfdG9fY3B1KGxwLT5kbWFfYWRkciArCisJICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHR4X3JpbmcpKTsKKworICAgIC8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KKyAgICBhLT53cml0ZV9iY3IoaW9hZGRyLCAyMCwgMik7CisKKyAgICBhLT53cml0ZV9jc3IoaW9hZGRyLCAxLCAobHAtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwKKwkJICAgIGluaXRfYmxvY2spKSAmIDB4ZmZmZik7CisgICAgYS0+d3JpdGVfY3NyKGlvYWRkciwgMiwgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsCisJCSAgICBpbml0X2Jsb2NrKSkgPj4gMTYpOworCisgICAgaWYgKHBkZXYpIHsJCS8qIHVzZSB0aGUgSVJRIHByb3ZpZGVkIGJ5IFBDSSAqLworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoIiBhc3NpZ25lZCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisgICAgfSBlbHNlIHsKKwl1bnNpZ25lZCBsb25nIGlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisKKwkvKgorCSAqIFRvIGF1dG8tSVJRIHdlIGVuYWJsZSB0aGUgaW5pdGlhbGl6YXRpb24tZG9uZSBhbmQgRE1BIGVycm9yCisJICogaW50ZXJydXB0cy4gRm9yIElTQSBib2FyZHMgd2UgZ2V0IGEgRE1BIGVycm9yLCBidXQgVkxCIGFuZCBQQ0kKKwkgKiBib2FyZHMgd2lsbCB3b3JrLgorCSAqLworCS8qIFRyaWdnZXIgYW4gaW5pdGlhbGl6YXRpb24ganVzdCBmb3IgdGhlIGludGVycnVwdC4gKi8KKwlhLT53cml0ZV9jc3IgKGlvYWRkciwgMCwgMHg0MSk7CisJbWRlbGF5ICgxKTsKKworCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZiAoaXJxX21hc2spOworCWlmICghZGV2LT5pcnEpIHsKKwkgICAgaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJCXByaW50aygiLCBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJICAgIHJldCA9IC1FTk9ERVY7CisJICAgIGdvdG8gZXJyX2ZyZWVfY29uc2lzdGVudDsKKwl9CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50aygiLCBwcm9iZWQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbWlpIHBoeV9pZCBzbyB0aGF0IHdlIGNhbiBxdWVyeSB0aGUgbGluayBzdGF0ZSAqLworICAgIGlmIChscC0+bWlpKQorCWxwLT5taWlfaWYucGh5X2lkID0gKChscC0+YS5yZWFkX2JjciAoaW9hZGRyLCAzMykpID4+IDUpICYgMHgxZjsKKworICAgIGluaXRfdGltZXIgKCZscC0+d2F0Y2hkb2dfdGltZXIpOworICAgIGxwLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKyAgICBscC0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSAmcGNuZXQzMl93YXRjaGRvZzsKKworICAgIC8qIFRoZSBQQ05FVDMyLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgZGV2LT5vcGVuID0gJnBjbmV0MzJfb3BlbjsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZwY25ldDMyX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5zdG9wID0gJnBjbmV0MzJfY2xvc2U7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmcGNuZXQzMl9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmcGNuZXQzMl9zZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgZGV2LT5kb19pb2N0bCA9ICZwY25ldDMyX2lvY3RsOworICAgIGRldi0+ZXRodG9vbF9vcHMgPSAmcGNuZXQzMl9ldGh0b29sX29wczsKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBwY25ldDMyX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9ICg1KkhaKTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBwY25ldDMyX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisgICAgLyogRmlsbCBpbiB0aGUgZ2VuZXJpYyBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCWdvdG8gZXJyX2ZyZWVfY29uc2lzdGVudDsKKworICAgIGlmIChwZGV2KSB7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisgICAgfSBlbHNlIHsKKwlscC0+bmV4dCA9IHBjbmV0MzJfZGV2OworCXBjbmV0MzJfZGV2ID0gZGV2OworICAgIH0KKworICAgIGlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGFzICVzXG4iLCBkZXYtPm5hbWUsIGxwLT5uYW1lKTsKKyAgICBjYXJkc19mb3VuZCsrOworCisgICAgLyogZW5hYmxlIExFRCB3cml0ZXMgKi8KKyAgICBhLT53cml0ZV9iY3IoaW9hZGRyLCAyLCBhLT5yZWFkX2Jjcihpb2FkZHIsIDIpIHwgMHgxMDAwKTsKKworICAgIHJldHVybiAwOworCitlcnJfZnJlZV9jb25zaXN0ZW50OgorICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKK2Vycl9mcmVlX25ldGRldjoKKyAgICBmcmVlX25ldGRldihkZXYpOworZXJyX3JlbGVhc2VfcmVnaW9uOgorICAgIHJlbGVhc2VfcmVnaW9uKGlvYWRkciwgUENORVQzMl9UT1RBTF9TSVpFKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHZhbDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmM7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnBjbmV0MzJfaW50ZXJydXB0LAorCQkgICAgbHAtPnNoYXJlZF9pcnEgPyBTQV9TSElSUSA6IDAsIGRldi0+bmFtZSwgKHZvaWQgKilkZXYpKSB7CisJcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgc3RhdGlvbiBhZGRyZXNzICovCisgICAgaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJcmMgPSAtRUlOVkFMOworCWdvdG8gZXJyX2ZyZWVfaXJxOworICAgIH0KKworICAgIC8qIFJlc2V0IHRoZSBQQ05FVDMyICovCisgICAgbHAtPmEucmVzZXQgKGlvYWRkcik7CisKKyAgICAvKiBzd2l0Y2ggcGNuZXQzMiB0byAzMmJpdCBtb2RlICovCisgICAgbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDIwLCAyKTsKKworICAgIGlmIChuZXRpZl9tc2dfaWZ1cChscCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY25ldDMyX29wZW4oKSBpcnEgJWQgdHgvcnggcmluZ3MgJSN4LyUjeCBpbml0ICUjeC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsCisJICAgICAgICh1MzIpIChscC0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCB0eF9yaW5nKSksCisJICAgICAgICh1MzIpIChscC0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCByeF9yaW5nKSksCisJICAgICAgICh1MzIpIChscC0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSkpOworCisgICAgLyogc2V0L3Jlc2V0IGF1dG9zZWxlY3QgYml0ICovCisgICAgdmFsID0gbHAtPmEucmVhZF9iY3IgKGlvYWRkciwgMikgJiB+MjsKKyAgICBpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkKKwl2YWwgfD0gMjsKKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMiwgdmFsKTsKKworICAgIC8qIGhhbmRsZSBmdWxsIGR1cGxleCBzZXR0aW5nICovCisgICAgaWYgKGxwLT5taWlfaWYuZnVsbF9kdXBsZXgpIHsKKwl2YWwgPSBscC0+YS5yZWFkX2JjciAoaW9hZGRyLCA5KSAmIH4zOworCWlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9GRCkgeworCSAgICB2YWwgfD0gMTsKKwkgICAgaWYgKGxwLT5vcHRpb25zID09IChQQ05FVDMyX1BPUlRfRkQgfCBQQ05FVDMyX1BPUlRfQVVJKSkKKwkJdmFsIHw9IDI7CisJfSBlbHNlIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9BU0VMKSB7CisJLyogd29ya2Fyb3VuZCBvZiB4U2VyaWVzMjUwLCB0dXJuIG9uIGZvciA3OUM5NzUgb25seSAqLworCSAgICBpID0gKChscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDg4KSB8CisJCQkobHAtPmEucmVhZF9jc3IoaW9hZGRyLDg5KSA8PCAxNikpID4+IDEyKSAmIDB4ZmZmZjsKKwkgICAgaWYgKGkgPT0gMHgyNjI3KQorCQl2YWwgfD0gMzsKKwl9CisJbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDksIHZhbCk7CisgICAgfQorCisgICAgLyogc2V0L3Jlc2V0IEdQU0kgYml0IGluIHRlc3QgcmVnaXN0ZXIgKi8KKyAgICB2YWwgPSBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAxMjQpICYgfjB4MTA7CisgICAgaWYgKChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA9PSBQQ05FVDMyX1BPUlRfR1BTSSkKKwl2YWwgfD0gMHgxMDsKKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMTI0LCB2YWwpOworCisgICAgLyogQWxsaWVkIFRlbGVzeW4gQVQgMjcwMC8yNzAxIEZYIGxvb3NlcyB0aGUgbGluaywgc28gc2tpcCB0aGF0ICovCisgICAgaWYgKGxwLT5wY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVQgJiYKKyAgICAgICAgKGxwLT5wY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJERVZJQ0VfSURfQVRfMjcwMEZYIHx8CisJIGxwLT5wY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJERVZJQ0VfSURfQVRfMjcwMUZYKSkgeworCXByaW50ayhLRVJOX0RFQlVHICIlczogU2tpcHBpbmcgUEhZIHNlbGVjdGlvbi5cbiIsIGRldi0+bmFtZSk7CisgICAgfSBlbHNlIHsKKwkvKgorCSAqIDI0IEp1biAyMDA0IGFjY29yZGluZyBBTUQsIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgUEhZLAorCSAqIERBTkFTIChvciBESVNQTSBmb3IgNzlDOTc2KSBtdXN0IGJlIHNldDsgdGhlbiBzZWxlY3QgdGhlIHNwZWVkLAorCSAqIGR1cGxleCwgYW5kL29yIGVuYWJsZSBhdXRvIG5lZ290aWF0aW9uLCBhbmQgY2xlYXIgREFOQVMKKwkgKi8KKwlpZiAobHAtPm1paSAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpKSB7CisJICAgIGxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMyLAorCQkJCWxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpIHwgMHgwMDgwKTsKKwkgICAgLyogZGlzYWJsZSBBdXRvIE5lZ290aWF0aW9uLCBzZXQgMTBNcGJzLCBIRCAqLworCSAgICB2YWwgPSBscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDMyKSAmIH4weGI4OworCSAgICBpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfRkQpCisJCXZhbCB8PSAweDEwOworCSAgICBpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfMTAwKQorCQl2YWwgfD0gMHgwODsKKwkgICAgbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDMyLCB2YWwpOworCX0gZWxzZSB7CisJICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9BU0VMKSB7CisJCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMyLAorCQkJbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgfCAweDAwODApOworCQkvKiBlbmFibGUgYXV0byBuZWdvdGlhdGUsIHNldHVwLCBkaXNhYmxlIGZkICovCisJCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpICYgfjB4OTg7CisJCXZhbCB8PSAweDIwOworCQlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMiwgdmFsKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyNpZmRlZiBET19EWFNVRkxPCisgICAgaWYgKGxwLT5keHN1ZmxvKSB7IC8qIERpc2FibGUgdHJhbnNtaXQgc3RvcCBvbiB1bmRlcmZsb3cgKi8KKwl2YWwgPSBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAzKTsKKwl2YWwgfD0gMHg0MDsKKwlscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMywgdmFsKTsKKyAgICB9CisjZW5kaWYKKworICAgIGxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPDwgNyk7CisgICAgcGNuZXQzMl9sb2FkX211bHRpY2FzdChkZXYpOworCisgICAgaWYgKHBjbmV0MzJfaW5pdF9yaW5nKGRldikpIHsKKwlyYyA9IC1FTk9NRU07CisJZ290byBlcnJfZnJlZV9yaW5nOworICAgIH0KKworICAgIC8qIFJlLWluaXRpYWxpemUgdGhlIFBDTkVUMzIsIGFuZCBzdGFydCBpdCB3aGVuIGRvbmUuICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDEsIChscC0+ZG1hX2FkZHIgKworCQlvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSkgJiAweGZmZmYpOworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAyLCAobHAtPmRtYV9hZGRyICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgaW5pdF9ibG9jaykpID4+IDE2KTsKKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCA0LCAweDA5MTUpOworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwMDEpOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworICAgIC8qIElmIHdlIGhhdmUgbWlpLCBwcmludCB0aGUgbGluayBzdGF0dXMgYW5kIHN0YXJ0IHRoZSB3YXRjaGRvZyAqLworICAgIGlmIChscC0+bWlpKSB7CisJbWlpX2NoZWNrX21lZGlhICgmbHAtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsobHApLCAxKTsKKwltb2RfdGltZXIgKCYobHAtPndhdGNoZG9nX3RpbWVyKSwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSsrIDwgMTAwKQorCWlmIChscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSAmIDB4MDEwMCkKKwkgICAgYnJlYWs7CisgICAgLyoKKyAgICAgKiBXZSB1c2VkIHRvIGNsZWFyIHRoZSBJbml0RG9uZSBiaXQsIDB4MDEwMCwgaGVyZSBidXQgTWFyayBTdG9ja3RvbgorICAgICAqIHJlcG9ydHMgdGhhdCBkb2luZyBzbyB0cmlnZ2VycyBhIGJ1ZyBpbiB0aGUgJzk3NC4KKyAgICAgKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMHgwMDQyKTsKKworICAgIGlmIChuZXRpZl9tc2dfaWZ1cChscCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY25ldDMyIG9wZW4gYWZ0ZXIgJWQgdGlja3MsIGluaXQgYmxvY2sgJSN4IGNzcjAgJTQuNHguXG4iLAorCQlkZXYtPm5hbWUsIGksICh1MzIpIChscC0+ZG1hX2FkZHIgKworCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgaW5pdF9ibG9jaykpLAorCQlscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDApKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gMDsJLyogQWx3YXlzIHN1Y2NlZWQgKi8KKworZXJyX2ZyZWVfcmluZzoKKyAgICAvKiBmcmVlIGFueSBhbGxvY2F0ZWQgc2tidWZmcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJaWYgKGxwLT5yeF9za2J1ZmZbaV0pIHsKKwkgICAgcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnJ4X2RtYV9hZGRyW2ldLCBQS1RfQlVGX1NaLTIsCisJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCSAgICBkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2J1ZmZbaV0pOworCX0KKwlscC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwlscC0+cnhfZG1hX2FkZHJbaV0gPSAwOworICAgIH0KKyAgICAvKgorICAgICAqIFN3aXRjaCBiYWNrIHRvIDE2Yml0IG1vZGUgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBkdW1iCisgICAgICogRE9TIHBhY2tldCBkcml2ZXIgYWZ0ZXIgYSB3YXJtIHJlYm9vdAorICAgICAqLworICAgIGxwLT5hLndyaXRlX2JjciAoaW9hZGRyLCAyMCwgNCk7CisKK2Vycl9mcmVlX2lycToKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIFRoZSBMQU5DRSBoYXMgYmVlbiBoYWx0ZWQgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlciAoYnVzbWFzdGVyIG1lbW9yeQorICogYXJiaXRyYXRpb24gZXJyb3IsIFR4IEZJRk8gdW5kZXJmbG93LCBkcml2ZXIgc3RvcHBlZCBpdCB0byByZWNvbmZpZ3VyZSwKKyAqIGV0Yy4pLiAgTW9kZXJuIExBTkNFIHZhcmlhbnRzIGFsd2F5cyByZWxvYWQgdGhlaXIgcmluZy1idWZmZXIKKyAqIGNvbmZpZ3VyYXRpb24gd2hlbiByZXN0YXJ0ZWQsIHNvIHdlIG11c3QgcmVpbml0aWFsaXplIG91ciByaW5nCisgKiBjb250ZXh0IGJlZm9yZSByZXN0YXJ0aW5nLiAgQXMgcGFydCBvZiB0aGlzIHJlaW5pdGlhbGl6YXRpb24sCisgKiBmaW5kIGFsbCBwYWNrZXRzIHN0aWxsIG9uIHRoZSBUeCByaW5nIGFuZCBwcmV0ZW5kIHRoYXQgdGhleSBoYWQgYmVlbgorICogc2VudCAoaW4gZWZmZWN0LCBkcm9wIHRoZSBwYWNrZXRzIG9uIHRoZSBmbG9vcikgLSB0aGUgaGlnaGVyLWxldmVsCisgKiBwcm90b2NvbHMgd2lsbCB0aW1lIG91dCBhbmQgcmV0cmFuc21pdC4gIEl0J2QgYmUgYmV0dGVyIHRvIHNodWZmbGUKKyAqIHRoZXNlIHNrYnMgdG8gYSB0ZW1wIGxpc3QgYW5kIHRoZW4gYWN0dWFsbHkgcmUtVHggdGhlbSBhZnRlcgorICogcmVzdGFydGluZyB0aGUgY2hpcCwgYnV0IEknbSB0b28gbGF6eSB0byBkbyBzbyByaWdodCBub3cuICBkcGxhdHRAM2RvLmNvbQorICovCisKK3N0YXRpYyB2b2lkCitwY25ldDMyX3B1cmdlX3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCWxwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CS8qIENQVSBvd25zIGJ1ZmZlciAqLworCXdtYigpOwkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCWlmIChscC0+dHhfc2tidWZmW2ldKSB7CisJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9kbWFfYWRkcltpXSwKKwkJICAgIGxwLT50eF9za2J1ZmZbaV0tPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJICAgIGRldl9rZnJlZV9za2JfYW55KGxwLT50eF9za2J1ZmZbaV0pOworCX0KKwlscC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwlscC0+dHhfZG1hX2FkZHJbaV0gPSAwOworICAgIH0KK30KKworCisvKiBJbml0aWFsaXplIHRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5ncy4gKi8KK3N0YXRpYyBpbnQKK3BjbmV0MzJfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBscC0+dHhfZnVsbCA9IDA7CisgICAgbHAtPmN1cl9yeCA9IGxwLT5jdXJfdHggPSAwOworICAgIGxwLT5kaXJ0eV9yeCA9IGxwLT5kaXJ0eV90eCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmID0gbHAtPnJ4X3NrYnVmZltpXTsKKwlpZiAocnhfc2tidWZmID09IE5VTEwpIHsKKwkgICAgaWYgKCEocnhfc2tidWZmID0gbHAtPnJ4X3NrYnVmZltpXSA9IGRldl9hbGxvY19za2IgKFBLVF9CVUZfU1opKSkgeworCQkvKiB0aGVyZSBpcyBub3QgbXVjaCwgd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQgKi8KKwkJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfRFJWKQorCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogcGNuZXQzMl9pbml0X3JpbmcgZGV2X2FsbG9jX3NrYiBmYWlsZWQuXG4iLAorCQkJICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBza2JfcmVzZXJ2ZSAocnhfc2tidWZmLCAyKTsKKwl9CisKKwlybWIoKTsKKwlpZiAobHAtPnJ4X2RtYV9hZGRyW2ldID09IDApCisJICAgIGxwLT5yeF9kbWFfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCByeF9za2J1ZmYtPnRhaWwsCisJCSAgICBQS1RfQlVGX1NaLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9ICh1MzIpbGUzMl90b19jcHUobHAtPnJ4X2RtYV9hZGRyW2ldKTsKKwlscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gbGUxNl90b19jcHUoMi1QS1RfQlVGX1NaKTsKKwl3bWIoKTsJLyogTWFrZSBzdXJlIG93bmVyIGNoYW5nZXMgYWZ0ZXIgYWxsIG90aGVycyBhcmUgdmlzaWJsZSAqLworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGxlMTZfdG9fY3B1KDB4ODAwMCk7CisgICAgfQorICAgIC8qIFRoZSBUeCBidWZmZXIgYWRkcmVzcyBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLCBidXQgd2UgZG8gbmVlZCB0byBjbGVhcgorICAgICAqIHRoZSB1cHBlciBvd25lcnNoaXAgYml0LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCWxwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CS8qIENQVSBvd25zIGJ1ZmZlciAqLworCXdtYigpOwkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCWxwLT50eF9yaW5nW2ldLmJhc2UgPSAwOworCWxwLT50eF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorCisgICAgbHAtPmluaXRfYmxvY2sudGxlbl9ybGVuID0gbGUxNl90b19jcHUoVFhfUklOR19MRU5fQklUUyB8IFJYX1JJTkdfTEVOX0JJVFMpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICBscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKHUzMilsZTMyX3RvX2NwdShscC0+ZG1hX2FkZHIgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCByeF9yaW5nKSk7CisgICAgbHAtPmluaXRfYmxvY2sudHhfcmluZyA9ICh1MzIpbGUzMl90b19jcHUobHAtPmRtYV9hZGRyICsKKwkgICAgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgdHhfcmluZykpOworICAgIHdtYigpOwkvKiBNYWtlIHN1cmUgYWxsIGNoYW5nZXMgYXJlIHZpc2libGUgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogdGhlIHBjbmV0MzIgaGFzIGJlZW4gaXNzdWVkIGEgc3RvcCBvciByZXNldC4gIFdhaXQgZm9yIHRoZSBzdG9wIGJpdAorICogdGhlbiBmbHVzaCB0aGUgcGVuZGluZyB0cmFuc21pdCBvcGVyYXRpb25zLCByZS1pbml0aWFsaXplIHRoZSByaW5nLAorICogYW5kIHRlbGwgdGhlIGNoaXAgdG8gaW5pdGlhbGl6ZS4KKyAqLworc3RhdGljIHZvaWQKK3BjbmV0MzJfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY3NyMF9iaXRzKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisKKyAgICAvKiB3YWl0IGZvciBzdG9wICovCisgICAgZm9yIChpPTA7IGk8MTAwOyBpKyspCisJaWYgKGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkgJiAweDAwMDQpCisJICAgYnJlYWs7CisKKyAgICBpZiAoaSA+PSAxMDAgJiYgbmV0aWZfbXNnX2RydihscCkpCisJcHJpbnRrKEtFUk5fRVJSICIlczogcGNuZXQzMl9yZXN0YXJ0IHRpbWVkIG91dCB3YWl0aW5nIGZvciBzdG9wLlxuIiwKKwkJZGV2LT5uYW1lKTsKKworICAgIHBjbmV0MzJfcHVyZ2VfdHhfcmluZyhkZXYpOworICAgIGlmIChwY25ldDMyX2luaXRfcmluZyhkZXYpKQorCXJldHVybjsKKworICAgIC8qIFJlSW5pdCBSaW5nICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDEpOworICAgIGkgPSAwOworICAgIHdoaWxlIChpKysgPCAxMDAwKQorCWlmIChscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSAmIDB4MDEwMCkKKwkgICAgYnJlYWs7CisKKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgY3NyMF9iaXRzKTsKK30KKworCitzdGF0aWMgdm9pZAorcGNuZXQzMl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIsIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgLyogVHJhbnNtaXR0ZXIgdGltZW91dCwgc2VyaW91cyBwcm9ibGVtcy4gKi8KKyAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19EUlYpCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTQuNHgsIHJlc2V0dGluZy5cbiIsCisJCWRldi0+bmFtZSwgbHAtPmEucmVhZF9jc3IoaW9hZGRyLCAwKSk7CisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDAwNCk7CisgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworICAgIGlmIChuZXRpZl9tc2dfdHhfZXJyKGxwKSkgeworCWludCBpOworCXByaW50ayhLRVJOX0RFQlVHICIgUmluZyBkYXRhIGR1bXA6IGRpcnR5X3R4ICVkIGN1cl90eCAlZCVzIGN1cl9yeCAlZC4iLAorCSAgIGxwLT5kaXJ0eV90eCwgbHAtPmN1cl90eCwgbHAtPnR4X2Z1bGwgPyAiIChmdWxsKSIgOiAiIiwKKwkgICBscC0+Y3VyX3J4KTsKKwlmb3IgKGkgPSAwIDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCXByaW50aygiJXMgJTA4eCAlMDR4ICUwOHggJTA0eCIsIGkgJiAxID8gIiIgOiAiXG4gIiwKKwkgICAgICAgbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbaV0uYmFzZSksCisJICAgICAgICgtbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCkpICYgMHhmZmZmLAorCSAgICAgICBsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5tc2dfbGVuZ3RoKSwKKwkgICAgICAgbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbaV0uc3RhdHVzKSk7CisJZm9yIChpID0gMCA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwlwcmludGsoIiVzICUwOHggJTA0eCAlMDh4ICUwNHgiLCBpICYgMSA/ICIiIDogIlxuICIsCisJICAgICAgIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJhc2UpLAorCSAgICAgICAoLWxlMTZfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmxlbmd0aCkpICYgMHhmZmZmLAorCSAgICAgICBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tpXS5taXNjKSwKKwkgICAgICAgbGUxNl90b19jcHUobHAtPnR4X3JpbmdbaV0uc3RhdHVzKSk7CisJcHJpbnRrKCJcbiIpOworICAgIH0KKyAgICBwY25ldDMyX3Jlc3RhcnQoZGV2LCAweDAwNDIpOworCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50CitwY25ldDMyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiBzdGF0dXM7CisgICAgaW50IGVudHJ5OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGlmIChuZXRpZl9tc2dfdHhfcXVldWVkKGxwKSkgeworCXByaW50ayhLRVJOX0RFQlVHICIlczogcGNuZXQzMl9zdGFydF94bWl0KCkgY2FsbGVkLCBjc3IwICU0LjR4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDApKTsKKyAgICB9CisKKyAgICAvKiBEZWZhdWx0IHN0YXR1cyAtLSB3aWxsIG5vdCBlbmFibGUgU3VjY2Vzc2Z1bC1UeERvbmUKKyAgICAgKiBpbnRlcnJ1cHQgd2hlbiB0aGF0IG9wdGlvbiBpcyBhdmFpbGFibGUgdG8gdXMuCisgICAgICovCisgICAgc3RhdHVzID0gMHg4MzAwOworCisgICAgLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKworICAgIC8qIE1hc2sgdG8gcmluZyBidWZmZXIgYm91bmRhcnkuICovCisgICAgZW50cnkgPSBscC0+Y3VyX3R4ICYgVFhfUklOR19NT0RfTUFTSzsKKworICAgIC8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBzdGF0dXMKKyAgICAgKiB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKyAgICBscC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gbGUxNl90b19jcHUoLXNrYi0+bGVuKTsKKworICAgIGxwLT50eF9yaW5nW2VudHJ5XS5taXNjID0gMHgwMDAwMDAwMDsKKworICAgIGxwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworICAgIGxwLT50eF9kbWFfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkgICAgUENJX0RNQV9UT0RFVklDRSk7CisgICAgbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPSAodTMyKWxlMzJfdG9fY3B1KGxwLT50eF9kbWFfYWRkcltlbnRyeV0pOworICAgIHdtYigpOyAvKiBNYWtlIHN1cmUgb3duZXIgY2hhbmdlcyBhZnRlciBhbGwgb3RoZXJzIGFyZSB2aXNpYmxlICovCisgICAgbHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGxlMTZfdG9fY3B1KHN0YXR1cyk7CisKKyAgICBscC0+Y3VyX3R4Kys7CisgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisgICAgLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwNDgpOworCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKyAgICBpZiAobHAtPnR4X3JpbmdbKGVudHJ5KzEpICYgVFhfUklOR19NT0RfTUFTS10uYmFzZSAhPSAwKSB7CisJbHAtPnR4X2Z1bGwgPSAxOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogVGhlIFBDTkVUMzIgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK3BjbmV0MzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHI7CisgICAgdTE2IGNzcjAscmFwOworICAgIGludCBib2d1c2NudCA9ICBtYXhfaW50ZXJydXB0X3dvcms7CisgICAgaW50IG11c3RfcmVzdGFydDsKKworICAgIGlmICghZGV2KSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfSU5UUikKKwkgICAgcHJpbnRrIChLRVJOX0RFQlVHICIlcygpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlycSk7CisJcmV0dXJuIElSUV9OT05FOworICAgIH0KKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGxwID0gZGV2LT5wcml2OworCisgICAgc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKyAgICByYXAgPSBscC0+YS5yZWFkX3JhcChpb2FkZHIpOworICAgIHdoaWxlICgoY3NyMCA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApKSAmIDB4OGYwMCAmJiAtLWJvZ3VzY250ID49IDApIHsKKwlpZiAoY3NyMCA9PSAweGZmZmYpIHsKKwkgICAgYnJlYWs7CQkJLyogUENNQ0lBIHJlbW92ZSBoYXBwZW5lZCAqLworCX0KKwkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwlscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgY3NyMCAmIH4weDAwNGYpOworCisJbXVzdF9yZXN0YXJ0ID0gMDsKKworCWlmIChuZXRpZl9tc2dfaW50cihscCkpCisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0ICBjc3IwPSUjMi4yeCBuZXcgY3NyPSUjMi4yeC5cbiIsCisJCSAgIGRldi0+bmFtZSwgY3NyMCwgbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMCkpOworCisJaWYgKGNzcjAgJiAweDA0MDApCQkvKiBSeCBpbnRlcnJ1cHQgKi8KKwkgICAgcGNuZXQzMl9yeChkZXYpOworCisJaWYgKGNzcjAgJiAweDAyMDApIHsJCS8qIFR4LWRvbmUgaW50ZXJydXB0ICovCisJICAgIHVuc2lnbmVkIGludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKwkgICAgaW50IGRlbHRhOworCisJICAgIHdoaWxlIChkaXJ0eV90eCAhPSBscC0+Y3VyX3R4KSB7CisJCWludCBlbnRyeSA9IGRpcnR5X3R4ICYgVFhfUklOR19NT0RfTUFTSzsKKwkJaW50IHN0YXR1cyA9IChzaG9ydClsZTE2X3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzIDwgMCkKKwkJICAgIGJyZWFrOwkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCWxwLT50eF9yaW5nW2VudHJ5XS5iYXNlID0gMDsKKworCQlpZiAoc3RhdHVzICYgMHg0MDAwKSB7CisJCSAgICAvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJICAgIGludCBlcnJfc3RhdHVzID0gbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLm1pc2MpOworCQkgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkgICAgaWYgKG5ldGlmX21zZ190eF9lcnIobHApKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggZXJyb3Igc3RhdHVzPSUwNHggZXJyX3N0YXR1cz0lMDh4XG4iLAorCQkJCWRldi0+bmFtZSwgc3RhdHVzLCBlcnJfc3RhdHVzKTsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgMHgwNDAwMDAwMCkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4MDgwMDAwMDApIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiAweDEwMDAwMDAwKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworI2lmbmRlZiBET19EWFNVRkxPCisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4NDAwMDAwMDApIHsKKwkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCisJCQkvKiBSZW1vdmUgdGhpcyB2ZXJib3NpdHkgbGF0ZXIhICovCisJCQlpZiAobmV0aWZfbXNnX3R4X2VycihscCkpCisJCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogVHggRklGTyBlcnJvciEgQ1NSMD0lNC40eFxuIiwKKwkJCQkgICAgZGV2LT5uYW1lLCBjc3IwKTsKKwkJCW11c3RfcmVzdGFydCA9IDE7CisJCSAgICB9CisjZWxzZQorCQkgICAgaWYgKGVycl9zdGF0dXMgJiAweDQwMDAwMDAwKSB7CisJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmICghIGxwLT5keHN1ZmxvKSB7ICAvKiBJZiBjb250cm9sbGVyIGRvZXNuJ3QgcmVjb3ZlciAuLi4gKi8KKwkJCSAgICAvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCSAgICAvKiBSZW1vdmUgdGhpcyB2ZXJib3NpdHkgbGF0ZXIhICovCisJCQkgICAgaWYgKG5ldGlmX21zZ190eF9lcnIobHApKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IEZJRk8gZXJyb3IhIENTUjA9JTQuNHhcbiIsCisJCQkJCWRldi0+bmFtZSwgY3NyMCk7CisJCQkgICAgbXVzdF9yZXN0YXJ0ID0gMTsKKwkJCX0KKwkJICAgIH0KKyNlbmRpZgorCQl9IGVsc2UgeworCQkgICAgaWYgKHN0YXR1cyAmIDB4MTgwMCkKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCSAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisKKwkJLyogV2UgbXVzdCBmcmVlIHRoZSBvcmlnaW5hbCBza2IgKi8KKwkJaWYgKGxwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCSAgICBwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+dHhfZG1hX2FkZHJbZW50cnldLAorCQkJbHAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCSAgICBkZXZfa2ZyZWVfc2tiX2lycShscC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCSAgICBscC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCSAgICBscC0+dHhfZG1hX2FkZHJbZW50cnldID0gMDsKKwkJfQorCQlkaXJ0eV90eCsrOworCSAgICB9CisKKwkgICAgZGVsdGEgPSAobHAtPmN1cl90eCAtIGRpcnR5X3R4KSAmIChUWF9SSU5HX01PRF9NQVNLICsgVFhfUklOR19TSVpFKTsKKwkgICAgaWYgKGRlbHRhID4gVFhfUklOR19TSVpFKSB7CisJCWlmIChuZXRpZl9tc2dfZHJ2KGxwKSkKKwkJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IG91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lZC5cbiIsCisJCQkgICAgZGV2LT5uYW1lLCBkaXJ0eV90eCwgbHAtPmN1cl90eCwgbHAtPnR4X2Z1bGwpOworCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCWRlbHRhIC09IFRYX1JJTkdfU0laRTsKKwkgICAgfQorCisJICAgIGlmIChscC0+dHhfZnVsbCAmJgorCQluZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJZGVsdGEgPCBUWF9SSU5HX1NJWkUgLSAyKSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJbHAtPnR4X2Z1bGwgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCSAgICB9CisJICAgIGxwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCX0KKworCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KKwlpZiAoY3NyMCAmIDB4NDAwMCkgbHAtPnN0YXRzLnR4X2Vycm9ycysrOyAvKiBUeCBiYWJibGUuICovCisJaWYgKGNzcjAgJiAweDEwMDApIHsKKwkgICAgLyoKKwkgICAgICogdGhpcyBoYXBwZW5zIHdoZW4gb3VyIHJlY2VpdmUgcmluZyBpcyBmdWxsLiBUaGlzIHNob3VsZG4ndAorCSAgICAgKiBiZSBhIHByb2JsZW0gYXMgd2Ugd2lsbCBzZWUgbm9ybWFsIHJ4IGludGVycnVwdHMgZm9yIHRoZSBmcmFtZXMKKwkgICAgICogaW4gdGhlIHJlY2VpdmUgcmluZy4gQnV0IHRoZXJlIGFyZSBzb21lIFBDSSBjaGlwc2V0cyAoSSBjYW4KKwkgICAgICogcmVwcm9kdWNlIHRoaXMgb24gU1AzRyB3aXRoIEludGVsIHNhdHVybiBjaGlwc2V0KSB3aGljaCBoYXZlCisJICAgICAqIHNvbWV0aW1lcyBwcm9ibGVtcyBhbmQgd2lsbCBmaWxsIHVwIHRoZSByZWNlaXZlIHJpbmcgd2l0aAorCSAgICAgKiBlcnJvciBkZXNjcmlwdG9ycy4gSW4gdGhpcyBzaXR1YXRpb24gd2UgZG9uJ3QgZ2V0IGEgcngKKwkgICAgICogaW50ZXJydXB0LCBidXQgYSBtaXNzZWQgZnJhbWUgaW50ZXJydXB0IHNvb25lciBvciBsYXRlci4KKwkgICAgICogU28gd2UgdHJ5IHRvIGNsZWFuIHVwIG91ciByZWNlaXZlIHJpbmcgaGVyZS4KKwkgICAgICovCisJICAgIHBjbmV0MzJfcngoZGV2KTsKKwkgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwl9CisJaWYgKGNzcjAgJiAweDA4MDApIHsKKwkgICAgaWYgKG5ldGlmX21zZ19kcnYobHApKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIGNzcjApOworCSAgICAvKiB1bmxpa2UgZm9yIHRoZSBsYW5jZSwgdGhlcmUgaXMgbm8gcmVzdGFydCBuZWVkZWQgKi8KKwl9CisKKwlpZiAobXVzdF9yZXN0YXJ0KSB7CisJICAgIC8qIHJlc2V0IHRoZSBjaGlwIHRvIGNsZWFyIHRoZSBlcnJvciBjb25kaXRpb24sIHRoZW4gcmVzdGFydCAqLworCSAgICBscC0+YS5yZXNldChpb2FkZHIpOworCSAgICBscC0+YS53cml0ZV9jc3IoaW9hZGRyLCA0LCAweDA5MTUpOworCSAgICBwY25ldDMyX3Jlc3RhcnQoZGV2LCAweDAwMDIpOworCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorICAgIH0KKworICAgIC8qIFNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwNDApOworICAgIGxwLT5hLndyaXRlX3JhcCAoaW9hZGRyLHJhcCk7CisKKyAgICBpZiAobmV0aWZfbXNnX2ludHIobHApKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzcjA9JSM0LjR4LlxuIiwKKwkJZGV2LT5uYW1lLCBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSk7CisKKyAgICBzcGluX3VubG9jaygmbHAtPmxvY2spOworCisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50CitwY25ldDMyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgaW50IGVudHJ5ID0gbHAtPmN1cl9yeCAmIFJYX1JJTkdfTU9EX01BU0s7CisgICAgaW50IGJvZ3VzY250ID0gUlhfUklOR19TSVpFIC8gMjsKKworICAgIC8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisgICAgd2hpbGUgKChzaG9ydClsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKSA+PSAwKSB7CisJaW50IHN0YXR1cyA9IChzaG9ydClsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKSA+PiA4OworCisJaWYgKHN0YXR1cyAhPSAweDAzKSB7CQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCSAgICAvKgorCSAgICAgKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkgICAgICogPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKKwkgICAgICogYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3bworCSAgICAgKiBidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuCisJICAgICAqLworCSAgICBpZiAoc3RhdHVzICYgMHgwMSkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlICovCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJICAgIGlmIChzdGF0dXMgJiAweDIwKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiAweDEwKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MDgpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiAweDA0KSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkgICAgbHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyAmPSBsZTE2X3RvX2NwdSgweDAzZmYpOworCX0gZWxzZSB7CisJICAgIC8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTJlLiAqLworCSAgICBzaG9ydCBwa3RfbGVuID0gKGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5tc2dfbGVuZ3RoKSAmIDB4ZmZmKS00OworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIC8qIERpc2NhcmQgb3ZlcnNpemUgZnJhbWVzLiAqLworCSAgICBpZiAodW5saWtlbHkocGt0X2xlbiA+IFBLVF9CVUZfU1ogLSAyKSkgeworCQlpZiAobmV0aWZfbXNnX2RydihscCkpCisJCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJbXBvc3NpYmxlIHBhY2tldCBzaXplICVkIVxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIH0gZWxzZSBpZiAocGt0X2xlbiA8IDYwKSB7CisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGxwKSkKKwkJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IFJ1bnQgcGFja2V0IVxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgICB9IGVsc2UgeworCQlpbnQgcnhfaW5fcGxhY2UgPSAwOworCisJCWlmIChwa3RfbGVuID4gcnhfY29weWJyZWFrKSB7CisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCSAgICBpZiAoKG5ld3NrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWikpKSB7CisJCQlza2JfcmVzZXJ2ZSAobmV3c2tiLCAyKTsKKwkJCXNrYiA9IGxwLT5yeF9za2J1ZmZbZW50cnldOworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSwKKwkJCQlQS1RfQlVGX1NaLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2JfcHV0IChza2IsIHBrdF9sZW4pOworCQkJbHAtPnJ4X3NrYnVmZltlbnRyeV0gPSBuZXdza2I7CisJCQluZXdza2ItPmRldiA9IGRldjsKKwkJCWxwLT5yeF9kbWFfYWRkcltlbnRyeV0gPQorCQkJICAgIHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBuZXdza2ItPnRhaWwsCisJCQkJICAgIFBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlID0gbGUzMl90b19jcHUobHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSk7CisJCQlyeF9pbl9wbGFjZSA9IDE7CisJCSAgICB9IGVsc2UKKwkJCXNrYiA9IE5VTEw7CisJCX0gZWxzZSB7CisJCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCX0KKworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJICAgIGludCBpOworCQkgICAgaWYgKG5ldGlmX21zZ19kcnYobHApKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlpZiAoKHNob3J0KWxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nWyhlbnRyeStpKQorCQkJCSAgICAmIFJYX1JJTkdfTU9EX01BU0tdLnN0YXR1cykgPCAwKQorCQkJICAgIGJyZWFrOworCisJCSAgICBpZiAoaSA+IFJYX1JJTkdfU0laRSAtMikgeworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgfD0gbGUxNl90b19jcHUoMHg4MDAwKTsKKwkJCXdtYigpOwkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCQkJbHAtPmN1cl9yeCsrOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CisJCWlmICghcnhfaW5fcGxhY2UpIHsKKwkJICAgIHNrYl9yZXNlcnZlKHNrYiwyKTsgLyogMTYgYnl0ZSBhbGlnbiAqLworCQkgICAgc2tiX3B1dChza2IscGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCQkgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGxwLT5wY2lfZGV2LAorCQkJCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSwKKwkJCQkJCVBLVF9CVUZfU1otMiwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCSAgICBldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKShscC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCksCisJCQkgICAgcGt0X2xlbiwwKTsKKwkJICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShscC0+cGNpX2RldiwKKwkJCQkJCSAgIGxwLT5yeF9kbWFfYWRkcltlbnRyeV0sCisJCQkJCQkgICBQS1RfQlVGX1NaLTIsCisJCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkgICAgfQorCX0KKwkvKgorCSAqIFRoZSBkb2NzIHNheSB0aGF0IHRoZSBidWZmZXIgbGVuZ3RoIGlzbid0IHRvdWNoZWQsIGJ1dCBBbmRyZXcgQm95ZAorCSAqIG9mIFFOWCByZXBvcnRzIHRoYXQgc29tZSByZXZzIG9mIHRoZSA3OUM5NjUgY2xlYXIgaXQuCisJICovCisJbHAtPnJ4X3JpbmdbZW50cnldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgyLVBLVF9CVUZfU1opOworCXdtYigpOyAvKiBNYWtlIHN1cmUgb3duZXIgY2hhbmdlcyBhZnRlciBhbGwgb3RoZXJzIGFyZSB2aXNpYmxlICovCisJbHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyB8PSBsZTE2X3RvX2NwdSgweDgwMDApOworCWVudHJ5ID0gKCsrbHAtPmN1cl9yeCkgJiBSWF9SSU5HX01PRF9NQVNLOworCWlmICgtLWJvZ3VzY250IDw9IDApIGJyZWFrOwkvKiBkb24ndCBzdGF5IGluIGxvb3AgZm9yZXZlciAqLworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwY25ldDMyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgZGVsX3RpbWVyX3N5bmMoJmxwLT53YXRjaGRvZ190aW1lcik7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMTEyKTsKKworICAgIGlmIChuZXRpZl9tc2dfaWZkb3duKGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSk7CisKKyAgICAvKiBXZSBzdG9wIHRoZSBQQ05FVDMyIGhlcmUgLS0gaXQgb2NjYXNpb25hbGx5IHBvbGxzIG1lbW9yeSBpZiB3ZSBkb24ndC4gKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMHgwMDA0KTsKKworICAgIC8qCisgICAgICogU3dpdGNoIGJhY2sgdG8gMTZiaXQgbW9kZSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGR1bWIKKyAgICAgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisgICAgICovCisgICAgbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDIwLCA0KTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgLyogZnJlZSBhbGwgYWxsb2NhdGVkIHNrYnVmZnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCXdtYigpOwkJLyogTWFrZSBzdXJlIGFkYXB0ZXIgc2VlcyBvd25lciBjaGFuZ2UgKi8KKwlpZiAobHAtPnJ4X3NrYnVmZltpXSkgeworCSAgICBwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+cnhfZG1hX2FkZHJbaV0sIFBLVF9CVUZfU1otMiwKKwkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJICAgIGRldl9rZnJlZV9za2IobHAtPnJ4X3NrYnVmZltpXSk7CisJfQorCWxwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT5yeF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ1BVIG93bnMgYnVmZmVyICovCisJd21iKCk7CQkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCWlmIChscC0+dHhfc2tidWZmW2ldKSB7CisJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9kbWFfYWRkcltpXSwKKwkJICAgIGxwLT50eF9za2J1ZmZbaV0tPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJICAgIGRldl9rZnJlZV9za2IobHAtPnR4X3NrYnVmZltpXSk7CisJfQorCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT50eF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorcGNuZXQzMl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiBzYXZlZF9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBzYXZlZF9hZGRyID0gbHAtPmEucmVhZF9yYXAoaW9hZGRyKTsKKyAgICBscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDExMik7CisgICAgbHAtPmEud3JpdGVfcmFwKGlvYWRkciwgc2F2ZWRfYWRkcik7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiB0YWtlbiBmcm9tIHRoZSBzdW5sYW5jZSBkcml2ZXIsIHdoaWNoIGl0IHRvb2sgZnJvbSB0aGUgZGVwY2EgZHJpdmVyICovCitzdGF0aWMgdm9pZCBwY25ldDMyX2xvYWRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBwY25ldDMyX2luaXRfYmxvY2sgKmliID0gJmxwLT5pbml0X2Jsb2NrOworICAgIHZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopJmliLT5maWx0ZXI7CisgICAgc3RydWN0IGRldl9tY19saXN0ICpkbWk9ZGV2LT5tY19saXN0OworICAgIGNoYXIgKmFkZHJzOworICAgIGludCBpOworICAgIHUzMiBjcmM7CisKKyAgICAvKiBzZXQgYWxsIG11bHRpY2FzdCBiaXRzICovCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwlpYi0+ZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwlpYi0+ZmlsdGVyWzFdID0gMHhmZmZmZmZmZjsKKwlyZXR1cm47CisgICAgfQorICAgIC8qIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisgICAgaWItPmZpbHRlclswXSA9IDA7CisgICAgaWItPmZpbHRlclsxXSA9IDA7CisKKyAgICAvKiBBZGQgYWRkcmVzc2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwlkbWkgICA9IGRtaS0+bmV4dDsKKworCS8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCWlmICghKCphZGRycyAmIDEpKQorCSAgICBjb250aW51ZTsKKworCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJY3JjID0gY3JjID4+IDI2OworCW1jYXN0X3RhYmxlIFtjcmMgPj4gNF0gPSBsZTE2X3RvX2NwdSgKKwkJbGUxNl90b19jcHUobWNhc3RfdGFibGUgW2NyYyA+PiA0XSkgfCAoMSA8PCAoY3JjICYgMHhmKSkpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZCBwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIsIGZsYWdzOworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpIHsKKwkvKiBMb2cgYW55IG5ldCB0YXBzLiAqLworCWlmIChuZXRpZl9tc2dfaHcobHApKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoMHg4MDAwIHwgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOworICAgIH0gZWxzZSB7CisJbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKwlwY25ldDMyX2xvYWRfbXVsdGljYXN0IChkZXYpOworICAgIH0KKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwMDQpOyAvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBsYW5jZS4gKi8KKyAgICBwY25ldDMyX3Jlc3RhcnQoZGV2LCAweDAwNDIpOyAvKiAgUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gKi8KKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBscC0+bG9jayBpcyBoZWxkICovCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiB2YWxfb3V0OworCisgICAgaWYgKCFscC0+bWlpKQorCXJldHVybiAwOworCisgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsICgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKyAgICB2YWxfb3V0ID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisKKyAgICByZXR1cm4gdmFsX291dDsKK30KKworLyogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgbHAtPmxvY2sgaXMgaGVsZCAqLworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgaWYgKCFscC0+bWlpKQorCXJldHVybjsKKworICAgIGxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMzLCAoKHBoeV9pZCAmIDB4MWYpIDw8IDUpIHwgKHJlZ19udW0gJiAweDFmKSk7CisgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzQsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgLyogU0lPQ1tHU11NSUl4eHggaW9jdGxzICovCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZscC0+bWlpX2lmLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKwlyYyA9IC1FT1BOT1RTVVBQOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAvKiBQcmludCB0aGUgbGluayBzdGF0dXMgaWYgaXQgaGFzIGNoYW5nZWQgKi8KKyAgICBpZiAobHAtPm1paSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCW1paV9jaGVja19tZWRpYSAoJmxwLT5taWlfaWYsIG5ldGlmX21zZ19saW5rKGxwKSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9CisKKyAgICBtb2RfdGltZXIgKCYobHAtPndhdGNoZG9nX3RpbWVyKSwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHBjbmV0MzJfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisgICAgaWYgKGRldikgeworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgUENORVQzMl9UT1RBTF9TSVpFKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBzaXplb2YoKmxwKSwgbHAsIGxwLT5kbWFfYWRkcik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjbmV0MzJfZHJpdmVyID0geworICAgIC5uYW1lCT0gRFJWX05BTUUsCisgICAgLnByb2JlCT0gcGNuZXQzMl9wcm9iZV9wY2ksCisgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHBjbmV0MzJfcmVtb3ZlX29uZSksCisgICAgLmlkX3RhYmxlCT0gcGNuZXQzMl9wY2lfdGJsLAorfTsKKworLyogQW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgcGFzc2VkIGluLi4uICovCitzdGF0aWMgaW50IGRlYnVnID0gLTE7CitzdGF0aWMgaW50IHR4X3N0YXJ0X3B0ID0gLTE7CitzdGF0aWMgaW50IHBjbmV0MzJfaGF2ZV9wY2k7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsIERSVl9OQU1FICIgZGVidWcgbGV2ZWwiKTsKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgRFJWX05BTUUgIiBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgRFJWX05BTUUgIiBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworbW9kdWxlX3BhcmFtKHR4X3N0YXJ0X3B0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0eF9zdGFydF9wdCwgRFJWX05BTUUgIiB0cmFuc21pdCBzdGFydCBwb2ludCAoMC0zKSIpOworbW9kdWxlX3BhcmFtKHBjbmV0MzJ2bGIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjbmV0MzJ2bGIsIERSVl9OQU1FICIgVmVzYSBsb2NhbCBidXMgKFZMQikgc3VwcG9ydCAoMC8xKSIpOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsIERSVl9OQU1FICIgaW5pdGlhbCBvcHRpb24gc2V0dGluZyhzKSAoMC0xNSkiKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsIERSVl9OQU1FICIgZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKKy8qIE1vZHVsZSBQYXJhbWV0ZXIgZm9yIEhvbWVQTkEgY2FyZHMgYWRkZWQgYnkgUGF0cmljayBTaW1tb25zLCAyMDA0ICovCittb2R1bGVfcGFyYW1fYXJyYXkoaG9tZXBuYSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaG9tZXBuYSwgRFJWX05BTUUgIiBtb2RlIGZvciA3OUM5NzggY2FyZHMgKDEgZm9yIEhvbWVQTkEsIDAgZm9yIEV0aGVybmV0LCBkZWZhdWx0IEV0aGVybmV0Iik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmRvZXJmZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBQQ25ldDMyIGFuZCBQQ25ldFBDSSBiYXNlZCBldGhlcmNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgUENORVQzMl9NU0dfREVGQVVMVCAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LKQorCitzdGF0aWMgaW50IF9faW5pdCBwY25ldDMyX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworICAgIHBjbmV0MzJfZGVidWcgPSBuZXRpZl9tc2dfaW5pdChkZWJ1ZywgUENORVQzMl9NU0dfREVGQVVMVCk7CisKKyAgICBpZiAoKHR4X3N0YXJ0X3B0ID49IDApICYmICh0eF9zdGFydF9wdCA8PSAzKSkKKwl0eF9zdGFydCA9IHR4X3N0YXJ0X3B0OworCisgICAgLyogZmluZCB0aGUgUENJIGRldmljZXMgKi8KKyAgICBpZiAoIXBjaV9tb2R1bGVfaW5pdCgmcGNuZXQzMl9kcml2ZXIpKQorCXBjbmV0MzJfaGF2ZV9wY2kgPSAxOworCisgICAgLyogc2hvdWxkIHdlIGZpbmQgYW55IHJlbWFpbmluZyBWTGJ1cyBkZXZpY2VzID8gKi8KKyAgICBpZiAocGNuZXQzMnZsYikKKwlwY25ldDMyX3Byb2JlX3ZsYnVzKCk7CisKKyAgICBpZiAoY2FyZHNfZm91bmQgJiYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpKQorCXByaW50ayhLRVJOX0lORk8gUEZYICIlZCBjYXJkc19mb3VuZC5cbiIsIGNhcmRzX2ZvdW5kKTsKKworICAgIHJldHVybiAocGNuZXQzMl9oYXZlX3BjaSArIGNhcmRzX2ZvdW5kKSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNuZXQzMl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKworICAgIHdoaWxlIChwY25ldDMyX2RldikgeworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gcGNuZXQzMl9kZXYtPnByaXY7CisJbmV4dF9kZXYgPSBscC0+bmV4dDsKKwl1bnJlZ2lzdGVyX25ldGRldihwY25ldDMyX2Rldik7CisJcmVsZWFzZV9yZWdpb24ocGNuZXQzMl9kZXYtPmJhc2VfYWRkciwgUENORVQzMl9UT1RBTF9TSVpFKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBzaXplb2YoKmxwKSwgbHAsIGxwLT5kbWFfYWRkcik7CisJZnJlZV9uZXRkZXYocGNuZXQzMl9kZXYpOworCXBjbmV0MzJfZGV2ID0gbmV4dF9kZXY7CisgICAgfQorCisgICAgaWYgKHBjbmV0MzJfaGF2ZV9wY2kpCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY25ldDMyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjbmV0MzJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGNuZXQzMl9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGxpcC5jIGIvZHJpdmVycy9uZXQvcGxpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjYyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wbGlwLmMKQEAgLTAsMCArMSwxNDI3IEBACisvKiAkSWQ6IHBsaXAuYyx2IDEuMy42LjIgMTk5Ny8wNC8xNiAxNTowNzo1NiBwaGlsIEV4cCAkICovCisvKiBQTElQOiBBIHBhcmFsbGVsIHBvcnQgIm5ldHdvcmsiIGRyaXZlciBmb3IgTGludXguICovCisvKiBUaGlzIGRyaXZlciBpcyBmb3IgcGFyYWxsZWwgcG9ydCB3aXRoIDUtYml0IGNhYmxlIChMYXBMaW5rIChSKSBjYWJsZSkuICovCisvKgorICogQXV0aG9yczoJRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4KKyAqCQlUb21teSBUaG9ybiA8dGhvcm5AZGFpbWkuYWF1LmRrPgorICoJCVRhbmFiZSBIaXJveWFzdSA8aGlyb0BzYW5wby50LnUtdG9reW8uYWMuanA+CisgKgkJQWxhbiBDb3ggPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKgkJUGV0ZXIgQmF1ZXIgPDEwMDEzNi4zNTMwQGNvbXB1c2VydmUuY29tPgorICoJCU5paWJlIFl1dGFrYSA8Z25paWJlQG1yaS5jby5qcD4KKyAqCQlOaW1yb2QgWmltZXJtYW4gPHppbWVybWFuQG1haWxhbmRuZXdzLmNvbT4KKyAqCisgKiBFbmhhbmNlbWVudHM6CisgKgkJTW9kdWxhcml6YXRpb24gYW5kIGlmcmVxL2lmbWFwIHN1cHBvcnQgYnkgQWxhbiBDb3guCisgKgkJUmV3cml0dGVuIGJ5IE5paWJlIFl1dGFrYS4KKyAqCQlwYXJwb3J0LXNoYXJpbmcgYXdhcmVuZXNzIGNvZGUgYnkgUGhpbGlwIEJsdW5kZWxsLgorICoJCVNNUCBsb2NraW5nIGJ5IE5paWJlIFl1dGFrYS4KKyAqCQlTdXBwb3J0IGZvciBwYXJhbGxlbCBwb3J0cyB3aXRoIG5vIElSUSAocG9sbCBtb2RlKSwKKyAqCQlNb2RpZmljYXRpb25zIHRvIHVzZSB0aGUgcGFyYWxsZWwgcG9ydCBBUEkgCisgKgkJYnkgTmltcm9kIFppbWVybWFuLgorICoKKyAqIEZpeGVzOgorICoJCU5paWJlIFl1dGFrYQorICoJCSAgLSBNb2R1bGUgaW5pdGlhbGl6YXRpb24uCisgKgkJICAtIE1UVSBmaXguCisgKgkJICAtIE1ha2Ugc3VyZSBvdGhlciBlbmQgaXMgT0ssIGJlZm9yZSBzZW5kaW5nIGEgcGFja2V0LgorICoJCSAgLSBGaXggaW1tZWRpYXRlIHRpbWVyIHByb2JsZW0uCisgKgorICoJCUFsIFZpcm8KKyAqCQkgIC0gQ2hhbmdlZCB7ZW5hYmxlLGRpc2FibGV9X2lycSBoYW5kbGluZyB0byBtYWtlIGl0IHdvcmsKKyAqCQkgICAgd2l0aCBuZXcgKCJzdGFjayIpIHNlbWFudGljcy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogT3JpZ2luYWwgdmVyc2lvbiBhbmQgdGhlIG5hbWUgJ1BMSVAnIGZyb20gRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4KKyAqIGluc3BpcmVkIGJ5IFJ1c3MgTmVsc29uJ3MgcGFyYWxsZWwgcG9ydCBwYWNrZXQgZHJpdmVyLgorICoKKyAqIE5PVEU6CisgKiAgICAgVGFuYWJlIEhpcm95YXN1IGhhZCBjaGFuZ2VkIHRoZSBwcm90b2NvbCwgYW5kIGl0IHdhcyBpbiBMaW51eCB2MS4wLgorICogICAgIEJlY2F1c2Ugb2YgdGhlIG5lY2Vzc2l0eSB0byBjb21tdW5pY2F0ZSB0byBET1MgbWFjaGluZXMgd2l0aCB0aGUKKyAqICAgICBDcnlud3IgcGFja2V0IGRyaXZlciwgUGV0ZXIgQmF1ZXIgY2hhbmdlZCB0aGUgcHJvdG9jb2wgYWdhaW4KKyAqICAgICBiYWNrIHRvIG9yaWdpbmFsIHByb3RvY29sLgorICoKKyAqICAgICBUaGlzIHZlcnNpb24gZm9sbG93cyBvcmlnaW5hbCBQTElQIHByb3RvY29sLgorICogICAgIFNvLCB0aGlzIFBMSVAgY2FuJ3QgY29tbXVuaWNhdGUgdGhlIFBMSVAgb2YgTGludXggdjEuMC4KKyAqLworCisvKgorICogICAgIFRvIHVzZSB3aXRoIERPUyBib3gsIHBsZWFzZSBkbyAoVHVybiBvbiBBUlAgc3dpdGNoKToKKyAqCSMgaWZjb25maWcgcGxpcFswLTJdIGFycAorICovCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiTkVUMyBQTElQIHZlcnNpb24gMi40LXBhcnBvcnQgZ25paWJlQG1yaS5jby5qcFxuIjsKKworLyoKKyAgU291cmNlczoKKwlJZGVhcyBhbmQgcHJvdG9jb2xzIGNhbWUgZnJvbSBSdXNzIE5lbHNvbidzIDxuZWxzb25AY3J5bndyLmNvbT4KKwkicGFyYWxsZWwuYXNtIiBwYXJhbGxlbCBwb3J0IHBhY2tldCBkcml2ZXIuCisKKyAgVGhlICJDcnlud3IiIHBhcmFsbGVsIHBvcnQgc3RhbmRhcmQgc3BlY2lmaWVzIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2w6CisgICAgVHJpZ2dlciBieSBzZW5kaW5nIG5pYmJsZSAnMHg4JyAodGhpcyBjYXVzZXMgaW50ZXJydXB0IG9uIG90aGVyIGVuZCkKKyAgICBjb3VudC1sb3cgb2N0ZXQKKyAgICBjb3VudC1oaWdoIG9jdGV0CisgICAgLi4uIGRhdGEgb2N0ZXRzCisgICAgY2hlY2tzdW0gb2N0ZXQKKyAgRWFjaCBvY3RldCBpcyBzZW50IGFzIDx3YWl0IGZvciByeC4gJzB4MT8nPiA8c2VuZCAweDEwKyhvY3RldCYweDBGKT4KKwkJCTx3YWl0IGZvciByeC4gJzB4MD8nPiA8c2VuZCAweDAwKygob2N0ZXQ+PjQpJjB4MEYpPgorCisgIFRoZSBwYWNrZXQgaXMgZW5jYXBzdWxhdGVkIGFzIGlmIGl0IHdlcmUgZXRoZXJuZXQuCisKKyAgVGhlIGNhYmxlIHVzZWQgaXMgYSBkZSBmYWN0byBzdGFuZGFyZCBwYXJhbGxlbCBudWxsIGNhYmxlIC0tIHNvbGQgYXMKKyAgYSAiTGFwTGluayIgY2FibGUgYnkgdmFyaW91cyBwbGFjZXMuICBZb3UnbGwgbmVlZCBhIDEyLWNvbmR1Y3RvciBjYWJsZSB0bworICBtYWtlIG9uZSB5b3Vyc2VsZi4gIFRoZSB3aXJpbmcgaXM6CisgICAgU0xDVElOCTE3IC0gMTcKKyAgICBHUk9VTkQJMjUgLSAyNQorICAgIEQwLT5FUlJPUgkyIC0gMTUJCTE1IC0gMgorICAgIEQxLT5TTENUCTMgLSAxMwkJMTMgLSAzCisgICAgRDItPlBBUE9VVAk0IC0gMTIJCTEyIC0gNAorICAgIEQzLT5BQ0sJNSAtIDEwCQkxMCAtIDUKKyAgICBENC0+QlVTWQk2IC0gMTEJCTExIC0gNgorICBEbyBub3QgY29ubmVjdCB0aGUgb3RoZXIgcGlucy4gIFRoZXkgYXJlCisgICAgRDUsRDYsRDcgYXJlIDcsOCw5CisgICAgU1RST0JFIGlzIDEsIEZFRUQgaXMgMTQsIElOSVQgaXMgMTYKKyAgICBleHRyYSBncm91bmRzIGFyZSAxOCwxOSwyMCwyMSwyMiwyMywyNAorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworLyogTWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyB0byBzdXBwb3J0LiAqLworI2RlZmluZSBQTElQX01BWCAgOAorCisvKiBVc2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisjZGVmaW5lIEVOQUJMRShpcnEpICBpZiAoaXJxICE9IC0xKSBlbmFibGVfaXJxKGlycSkKKyNkZWZpbmUgRElTQUJMRShpcnEpIGlmIChpcnEgIT0gLTEpIGRpc2FibGVfaXJxKGlycSkKKworLyogSW4gbWljcm8gc2Vjb25kICovCisjZGVmaW5lIFBMSVBfREVMQVlfVU5JVAkJICAgMQorCisvKiBDb25uZWN0aW9uIHRpbWUgb3V0ID0gUExJUF9UUklHR0VSX1dBSVQgKiBQTElQX0RFTEFZX1VOSVQgdXNlYyAqLworI2RlZmluZSBQTElQX1RSSUdHRVJfV0FJVAkgNTAwCisKKy8qIE5pYmJsZSB0aW1lIG91dCA9IFBMSVBfTklCQkxFX1dBSVQgKiBQTElQX0RFTEFZX1VOSVQgdXNlYyAqLworI2RlZmluZSBQTElQX05JQkJMRV9XQUlUICAgICAgICAzMDAwCisKKy8qIEJvdHRvbSBoYWx2ZXMgKi8KK3N0YXRpYyB2b2lkIHBsaXBfa2lja19iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBsaXBfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwbGlwX3RpbWVyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgcGxpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgREVWIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgcGxpcF90eF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHBsaXBfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgcGxpcF9oYXJkX2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKTsKK3N0YXRpYyBpbnQgcGxpcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwbGlwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwbGlwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGxpcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IHBsaXBfcHJlZW1wdCh2b2lkICpoYW5kbGUpOworc3RhdGljIHZvaWQgcGxpcF93YWtldXAodm9pZCAqaGFuZGxlKTsKKwwKK2VudW0gcGxpcF9jb25uZWN0aW9uX3N0YXRlIHsKKwlQTElQX0NOX05PTkU9MCwKKwlQTElQX0NOX1JFQ0VJVkUsCisJUExJUF9DTl9TRU5ELAorCVBMSVBfQ05fQ0xPU0lORywKKwlQTElQX0NOX0VSUk9SCit9OworCitlbnVtIHBsaXBfcGFja2V0X3N0YXRlIHsKKwlQTElQX1BLX0RPTkU9MCwKKwlQTElQX1BLX1RSSUdHRVIsCisJUExJUF9QS19MRU5HVEhfTFNCLAorCVBMSVBfUEtfTEVOR1RIX01TQiwKKwlQTElQX1BLX0RBVEEsCisJUExJUF9QS19DSEVDS1NVTQorfTsKKworZW51bSBwbGlwX25pYmJsZV9zdGF0ZSB7CisJUExJUF9OQl9CRUdJTiwKKwlQTElQX05CXzEsCisJUExJUF9OQl8yLAorfTsKKworc3RydWN0IHBsaXBfbG9jYWwgeworCWVudW0gcGxpcF9wYWNrZXRfc3RhdGUgc3RhdGU7CisJZW51bSBwbGlwX25pYmJsZV9zdGF0ZSBuaWJibGU7CisJdW5pb24geworCQlzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQkJdW5zaWduZWQgY2hhciBsc2I7CisJCQl1bnNpZ25lZCBjaGFyIG1zYjsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCQkJdW5zaWduZWQgY2hhciBtc2I7CisJCQl1bnNpZ25lZCBjaGFyIGxzYjsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggdGhlIGVuZGlhbm5lc3MgZGVmaW5lcyBpbiA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCQl9IGI7CisJCXVuc2lnbmVkIHNob3J0IGg7CisJfSBsZW5ndGg7CisJdW5zaWduZWQgc2hvcnQgYnl0ZTsKKwl1bnNpZ25lZCBjaGFyICBjaGVja3N1bTsKKwl1bnNpZ25lZCBjaGFyICBkYXRhOworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBlbmV0X3N0YXRzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBpbW1lZGlhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IGRlZmVycmVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aW1lcjsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCBzbmRfZGF0YTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCByY3ZfZGF0YTsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXY7CisJdW5zaWduZWQgbG9uZyAgdHJpZ2dlcjsKKwl1bnNpZ25lZCBsb25nICBuaWJibGU7CisJZW51bSBwbGlwX2Nvbm5lY3Rpb25fc3RhdGUgY29ubmVjdGlvbjsKKwl1bnNpZ25lZCBzaG9ydCB0aW1lb3V0X2NvdW50OworCWludCBpc19kZWZlcnJlZDsKKwlpbnQgcG9ydF9vd25lcjsKKwlpbnQgc2hvdWxkX3JlbGlucXVpc2g7CisJaW50ICgqb3JpZ19oYXJkX2hlYWRlcikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKKwlpbnQgKCpvcmlnX2hhcmRfaGVhZGVyX2NhY2hlKShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKTsKKwlzcGlubG9ja190IGxvY2s7CisJYXRvbWljX3Qga2lsbF90aW1lcjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGtpbGxlZF90aW1lcl9zZW07Cit9OworDAoraW5saW5lIHN0YXRpYyB2b2lkIGVuYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+aXJxICE9IC0xKQorCXsKKwkJc3RydWN0IHBhcnBvcnQgKnBvcnQgPQorCQkgICAoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5wYXJkZXYtPnBvcnQ7CisJCXBvcnQtPm9wcy0+ZW5hYmxlX2lycSAocG9ydCk7CisJfQorfQorCitpbmxpbmUgc3RhdGljIHZvaWQgZGlzYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+aXJxICE9IC0xKQorCXsKKwkJc3RydWN0IHBhcnBvcnQgKnBvcnQgPQorCQkgICAoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5wYXJkZXYtPnBvcnQ7CisJCXBvcnQtPm9wcy0+ZGlzYWJsZV9pcnEgKHBvcnQpOworCX0KK30KKworaW5saW5lIHN0YXRpYyB2b2lkIHdyaXRlX2RhdGEgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9CisJICAgKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+cGFyZGV2LT5wb3J0OworCisJcG9ydC0+b3BzLT53cml0ZV9kYXRhIChwb3J0LCBkYXRhKTsKK30KKworaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfc3RhdHVzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0KKwkgICAoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5wYXJkZXYtPnBvcnQ7CisKKwlyZXR1cm4gcG9ydC0+b3BzLT5yZWFkX3N0YXR1cyAocG9ydCk7Cit9CisMCisvKiBFbnRyeSBwb2ludCBvZiBQTElQIGRyaXZlci4KKyAgIFByb2JlIHRoZSBoYXJkd2FyZSwgYW5kIHJlZ2lzdGVyL2luaXRpYWxpemUgdGhlIGRyaXZlci4KKworICAgUExJUCBpcyByYXRoZXIgd2VpcmQsIGJlY2F1c2Ugb2YgdGhlIHdheSBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcGFycG9ydAorICAgc3lzdGVtLiAgSXQgaXMgX25vdF8gaW5pdGlhbGlzZWQgZnJvbSBTcGFjZS5jLiAgSW5zdGVhZCwgcGxpcF9pbml0KCkKKyAgIGlzIGNhbGxlZCwgYW5kIHRoYXQgZnVuY3Rpb24gbWFrZXMgdXAgYSAic3RydWN0IG5ldF9kZXZpY2UiIGZvciBlYWNoIHBvcnQsIGFuZAorICAgdGhlbiBjYWxscyB1cyBoZXJlLgorCisgICAqLworc3RhdGljIHZvaWQKK3BsaXBfaW5pdF9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUaGVuLCBvdmVycmlkZSBwYXJ0cyBvZiBpdCAqLworCWRldi0+aGFyZF9zdGFydF94bWl0CSA9IHBsaXBfdHhfcGFja2V0OworCWRldi0+b3BlbgkJID0gcGxpcF9vcGVuOworCWRldi0+c3RvcAkJID0gcGxpcF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyAJCSA9IHBsaXBfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwJCSA9IHBsaXBfaW9jdGw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlID0gTlVMTDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAJID0gMTA7CisJZGV2LT5mbGFncwkgICAgICAgICA9IElGRl9QT0lOVE9QT0lOVHxJRkZfTk9BUlA7CisJbWVtc2V0KGRldi0+ZGV2X2FkZHIsIDB4ZmMsIEVUSF9BTEVOKTsKKworCS8qIFNldCB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwlubC0+b3JpZ19oYXJkX2hlYWRlciAgICA9IGRldi0+aGFyZF9oZWFkZXI7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgICAgPSBwbGlwX2hhcmRfaGVhZGVyOworCisJbmwtPm9yaWdfaGFyZF9oZWFkZXJfY2FjaGUgPSBkZXYtPmhhcmRfaGVhZGVyX2NhY2hlOworCWRldi0+aGFyZF9oZWFkZXJfY2FjaGUgICAgID0gcGxpcF9oYXJkX2hlYWRlcl9jYWNoZTsKKworCisJbmwtPnBvcnRfb3duZXIgPSAwOworCisJLyogSW5pdGlhbGl6ZSBjb25zdGFudHMgKi8KKwlubC0+dHJpZ2dlcgk9IFBMSVBfVFJJR0dFUl9XQUlUOworCW5sLT5uaWJibGUJPSBQTElQX05JQkJMRV9XQUlUOworCisJLyogSW5pdGlhbGl6ZSB0YXNrIHF1ZXVlIHN0cnVjdHVyZXMgKi8KKwlJTklUX1dPUksoJm5sLT5pbW1lZGlhdGUsICh2b2lkICgqKSh2b2lkICopKXBsaXBfYmgsIGRldik7CisJSU5JVF9XT1JLKCZubC0+ZGVmZXJyZWQsICh2b2lkICgqKSh2b2lkICopKXBsaXBfa2lja19iaCwgZGV2KTsKKworCWlmIChkZXYtPmlycSA9PSAtMSkKKwkJSU5JVF9XT1JLKCZubC0+dGltZXIsICh2b2lkICgqKSh2b2lkICopKXBsaXBfdGltZXJfYmgsIGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmbmwtPmxvY2spOworfQorDAorLyogQm90dG9tIGhhbGYgaGFuZGxlciBmb3IgdGhlIGRlbGF5ZWQgcmVxdWVzdC4KKyAgIFRoaXMgcm91dGluZSBpcyBraWNrZWQgYnkgZG9fdGltZXIoKS4KKyAgIFJlcXVlc3QgYHBsaXBfYmgnIHRvIGJlIGludm9rZWQuICovCitzdGF0aWMgdm9pZAorcGxpcF9raWNrX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5sLT5pc19kZWZlcnJlZCkKKwkJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIGludGVybmFsIHJvdXRpbmVzICovCitzdGF0aWMgaW50IHBsaXBfbm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2xvY2FsICosCisJCSAgICAgc3RydWN0IHBsaXBfbG9jYWwgKiwgc3RydWN0IHBsaXBfbG9jYWwgKik7CitzdGF0aWMgaW50IHBsaXBfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkJICAgICAgIHN0cnVjdCBwbGlwX2xvY2FsICosIHN0cnVjdCBwbGlwX2xvY2FsICopOworc3RhdGljIGludCBwbGlwX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfbG9jYWwgKiwKKwkJCSAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfbG9jYWwgKiwKKwkJCQkgc3RydWN0IHBsaXBfbG9jYWwgKiwgc3RydWN0IHBsaXBfbG9jYWwgKik7CitzdGF0aWMgaW50IHBsaXBfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkgICAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9iaF90aW1lb3V0X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLAorCQkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2LAorCQkJCSBpbnQgZXJyb3IpOworCisjZGVmaW5lIE9LICAgICAgICAwCisjZGVmaW5lIFRJTUVPVVQgICAxCisjZGVmaW5lIEVSUk9SICAgICAyCisjZGVmaW5lIEhTX1RJTUVPVVQJMworCit0eXBlZGVmIGludCAoKnBsaXBfZnVuYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCQkgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdik7CisKK3N0YXRpYyBwbGlwX2Z1bmMgY29ubmVjdGlvbl9zdGF0ZV90YWJsZVtdID0KK3sKKwlwbGlwX25vbmUsCisJcGxpcF9yZWNlaXZlX3BhY2tldCwKKwlwbGlwX3NlbmRfcGFja2V0LAorCXBsaXBfY29ubmVjdGlvbl9jbG9zZSwKKwlwbGlwX2Vycm9yCit9OworCisvKiBCb3R0b20gaGFsZiBoYW5kbGVyIG9mIFBMSVAuICovCitzdGF0aWMgdm9pZAorcGxpcF9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kID0gJm5sLT5zbmRfZGF0YTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2ID0gJm5sLT5yY3ZfZGF0YTsKKwlwbGlwX2Z1bmMgZjsKKwlpbnQgcjsKKworCW5sLT5pc19kZWZlcnJlZCA9IDA7CisJZiA9IGNvbm5lY3Rpb25fc3RhdGVfdGFibGVbbmwtPmNvbm5lY3Rpb25dOworCWlmICgociA9ICgqZikoZGV2LCBubCwgc25kLCByY3YpKSAhPSBPSworCSAgICAmJiAociA9IHBsaXBfYmhfdGltZW91dF9lcnJvcihkZXYsIG5sLCBzbmQsIHJjdiwgcikpICE9IE9LKSB7CisJCW5sLT5pc19kZWZlcnJlZCA9IDE7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPmRlZmVycmVkLCAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwbGlwX3RpbWVyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmICghKGF0b21pY19yZWFkICgmbmwtPmtpbGxfdGltZXIpKSkgeworCQlwbGlwX2ludGVycnVwdCAoLTEsIGRldiwgTlVMTCk7CisKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+dGltZXIsIDEpOworCX0KKwllbHNlIHsKKwkJdXAgKCZubC0+a2lsbGVkX3RpbWVyX3NlbSk7CisJfQorfQorCitzdGF0aWMgaW50CitwbGlwX2JoX3RpbWVvdXRfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCSAgICAgIHN0cnVjdCBwbGlwX2xvY2FsICpzbmQsIHN0cnVjdCBwbGlwX2xvY2FsICpyY3YsCisJCSAgICAgIGludCBlcnJvcikKK3sKKwl1bnNpZ25lZCBjaGFyIGMwOworCS8qCisJICogVGhpcyBpcyB0cmlja3kuIElmIHdlIGdvdCBoZXJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiBzZW5kIChlaXRoZXIKKwkgKiB3aXRoIEVSUk9SIG9yIEhTX1RJTUVPVVQpIHdlIGhhdmUgSVJRIGVuYWJsZWQuIE90aGVyd2lzZSBpdCdzCisJICogYWxyZWFkeSBkaXNhYmxlZC4gV2l0aCB0aGUgb2xkIHZhcmlhbnQgb2Yge2VuYWJsZSxkaXNhYmxlfV9pcnEoKQorCSAqIGV4dHJhIGRpc2FibGVfaXJxKCkgd2FzIGEgbm8tb3AuIE5vdyBpdCBiZWNhbWUgbW9ydGFsIC0gaXQncworCSAqIHVuYmFsYW5jZWQgYW5kIHRodXMgd2UnbGwgbmV2ZXIgcmUtZW5hYmxlIElSUSAodW50aWwgcm1tb2QgcGxpcCwKKwkgKiB0aGF0IGlzKS4gU28gd2UgaGF2ZSB0byB0cmVhdCBIU19USU1FT1VUIGFuZCBFUlJPUiBmcm9tIHNlbmQKKwkgKiBpbiBhIHNwZWNpYWwgd2F5LgorCSAqLworCisJc3Bpbl9sb2NrX2lycSgmbmwtPmxvY2spOworCWlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX1NFTkQpIHsKKworCQlpZiAoZXJyb3IgIT0gRVJST1IpIHsgLyogVGltZW91dCAqLworCQkJbmwtPnRpbWVvdXRfY291bnQrKzsKKwkJCWlmICgoZXJyb3IgPT0gSFNfVElNRU9VVAorCQkJICAgICAmJiBubC0+dGltZW91dF9jb3VudCA8PSAxMCkKKwkJCSAgICB8fCBubC0+dGltZW91dF9jb3VudCA8PSAzKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCQl9CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZW91dCglZCwlMDJ4KVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHNuZC0+c3RhdGUsIGMwKTsKKwkJfSBlbHNlCisJCQllcnJvciA9IEhTX1RJTUVPVVQ7CisJCW5sLT5lbmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlubC0+ZW5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0gZWxzZSBpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9SRUNFSVZFKSB7CisJCWlmIChyY3YtPnN0YXRlID09IFBMSVBfUEtfVFJJR0dFUikgeworCQkJLyogVHJhbnNtaXNzaW9uIHdhcyBpbnRlcnJ1cHRlZC4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCQkJcmV0dXJuIE9LOworCQl9CisJCWlmIChlcnJvciAhPSBFUlJPUikgeyAvKiBUaW1lb3V0ICovCisJCQlpZiAoKytubC0+dGltZW91dF9jb3VudCA8PSAzKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCQl9CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVjZWl2ZSB0aW1lb3V0KCVkLCUwMngpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcmN2LT5zdGF0ZSwgYzApOworCQl9CisJCW5sLT5lbmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9CisJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfRE9ORTsKKwlpZiAocmN2LT5za2IpIHsKKwkJa2ZyZWVfc2tiKHJjdi0+c2tiKTsKKwkJcmN2LT5za2IgPSBOVUxMOworCX0KKwlzbmQtPnN0YXRlID0gUExJUF9QS19ET05FOworCWlmIChzbmQtPnNrYikgeworCQlkZXZfa2ZyZWVfc2tiKHNuZC0+c2tiKTsKKwkJc25kLT5za2IgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwlpZiAoZXJyb3IgPT0gSFNfVElNRU9VVCkgeworCQlESVNBQkxFKGRldi0+aXJxKTsKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwl9CisJZGlzYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fRVJST1I7CisJd3JpdGVfZGF0YSAoZGV2LCAweDAwKTsKKworCXJldHVybiBUSU1FT1VUOworfQorDAorc3RhdGljIGludAorcGxpcF9ub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCSAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfUkVDRUlWRSAtLS0gcmVjZWl2ZSBhIGJ5dGUodHdvIG5pYmJsZXMpCisgICBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIFRJTUVPVVQgb24gdGltZW91dCAqLworaW5saW5lIHN0YXRpYyBpbnQKK3BsaXBfcmVjZWl2ZSh1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICAgIGVudW0gcGxpcF9uaWJibGVfc3RhdGUgKm5zX3AsIHVuc2lnbmVkIGNoYXIgKmRhdGFfcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGMwLCBjMTsKKwl1bnNpZ25lZCBpbnQgY3g7CisKKwlzd2l0Y2ggKCpuc19wKSB7CisJY2FzZSBQTElQX05CX0JFR0lOOgorCQljeCA9IG5pYmJsZV90aW1lb3V0OworCQl3aGlsZSAoMSkgeworCQkJYzAgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJdWRlbGF5KFBMSVBfREVMQVlfVU5JVCk7CisJCQlpZiAoKGMwICYgMHg4MCkgPT0gMCkgeworCQkJCWMxID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCQlpZiAoYzAgPT0gYzEpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJfQorCQkqZGF0YV9wID0gKGMwID4+IDMpICYgMHgwZjsKKwkJd3JpdGVfZGF0YSAoZGV2LCAweDEwKTsgLyogc2VuZCBBQ0sgKi8KKwkJKm5zX3AgPSBQTElQX05CXzE7CisKKwljYXNlIFBMSVBfTkJfMToKKwkJY3ggPSBuaWJibGVfdGltZW91dDsKKwkJd2hpbGUgKDEpIHsKKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQkJaWYgKGMwICYgMHg4MCkgeworCQkJCWMxID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCQlpZiAoYzAgPT0gYzEpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJfQorCQkqZGF0YV9wIHw9IChjMCA8PCAxKSAmIDB4ZjA7CisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7IC8qIHNlbmQgQUNLICovCisJCSpuc19wID0gUExJUF9OQl9CRUdJTjsKKwljYXNlIFBMSVBfTkJfMjoKKwkJYnJlYWs7CisJfQorCXJldHVybiBPSzsKK30KKworLyoKKyAqCURldGVybWluZSB0aGUgcGFja2V0J3MgcHJvdG9jb2wgSUQuIFRoZSBydWxlIGhlcmUgaXMgdGhhdCB3ZSAKKyAqCWFzc3VtZSA4MDIuMyBpZiB0aGUgdHlwZSBmaWVsZCBpcyBzaG9ydCBlbm91Z2ggdG8gYmUgYSBsZW5ndGguCisgKglUaGlzIGlzIG5vcm1hbCBwcmFjdGljZSBhbmQgd29ya3MgZm9yIGFueSAnbm93IGluIHVzZScgcHJvdG9jb2wuCisgKgorICoJUExJUCBpcyBldGhlcm5ldCBpc2ggYnV0IHRoZSBkYWRkciBtaWdodCBub3QgYmUgdmFsaWQgaWYgdW5pY2FzdC4KKyAqCVBMSVAgZm9ydHVuYXRlbHkgaGFzIG5vIGJ1cyBhcmNoaXRlY3R1cmUgKGl0cyBQb2ludC10by1wb2ludCkuCisgKgorICoJV2UgY2FuJ3QgZml4IHRoZSBkYWRkciB0aGluZyBhcyB0aGF0IHF1aXJrIChtb3JlIGJ1ZykgaXMgZW1iZWRkZWQKKyAqCWluIGZhciB0b28gbWFueSBvbGQgc3lzdGVtcyBub3QgYWxsIGV2ZW4gcnVubmluZyBMaW51eC4KKyAqLworIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IHBsaXBfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwl1bnNpZ25lZCBjaGFyICpyYXdwOworCQorCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlldGggPSBldGhfaGRyKHNrYik7CisJCisJaWYoKmV0aC0+aF9kZXN0JjEpCisJeworCQlpZihtZW1jbXAoZXRoLT5oX2Rlc3QsZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKT09MCkKKwkJCXNrYi0+cGt0X3R5cGU9UEFDS0VUX0JST0FEQ0FTVDsKKwkJZWxzZQorCQkJc2tiLT5wa3RfdHlwZT1QQUNLRVRfTVVMVElDQVNUOworCX0KKwkKKwkvKgorCSAqCVRoaXMgQUxMTVVMVEkgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudCBieSAxLjQKKwkgKglzbyBkb24ndCBmb3JnZXQgdG8gcmVtb3ZlIGl0LgorCSAqLworCSAKKwlpZiAobnRvaHMoZXRoLT5oX3Byb3RvKSA+PSAxNTM2KQorCQlyZXR1cm4gZXRoLT5oX3Byb3RvOworCQkKKwlyYXdwID0gc2tiLT5kYXRhOworCQorCS8qCisJICoJVGhpcyBpcyBhIG1hZ2ljIGhhY2sgdG8gc3BvdCBJUFggcGFja2V0cy4gT2xkZXIgTm92ZWxsIGJyZWFrcworCSAqCXRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTEMKKwkgKglsYXllci4gV2UgbG9vayBmb3IgRkZGRiB3aGljaCBpc24ndCBhIHVzZWQgODAyLjIgU1NBUC9EU0FQLiBUaGlzCisJICoJd29uJ3Qgd29yayBmb3IgZmF1bHQgdG9sZXJhbnQgbmV0d2FyZSBidXQgZG9lcyBmb3IgdGhlIHJlc3QuCisJICovCisJaWYgKCoodW5zaWduZWQgc2hvcnQgKilyYXdwID09IDB4RkZGRikKKwkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKKwkJCisJLyoKKwkgKglSZWFsIDgwMi4yIExMQworCSAqLworCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7Cit9CisKKworLyogUExJUF9SRUNFSVZFX1BBQ0tFVCAtLS0gcmVjZWl2ZSBhIHBhY2tldCAqLworc3RhdGljIGludAorcGxpcF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJICAgIHN0cnVjdCBwbGlwX2xvY2FsICpzbmQsIHN0cnVjdCBwbGlwX2xvY2FsICpyY3YpCit7CisJdW5zaWduZWQgc2hvcnQgbmliYmxlX3RpbWVvdXQgPSBubC0+bmliYmxlOworCXVuc2lnbmVkIGNoYXIgKmxidWY7CisKKwlzd2l0Y2ggKHJjdi0+c3RhdGUpIHsKKwljYXNlIFBMSVBfUEtfVFJJR0dFUjoKKwkJRElTQUJMRShkZXYtPmlycSk7CisJCS8qIERvbid0IG5lZWQgdG8gc3luY2hyb25pemUgaXJxLCBhcyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSBpdCAqLworCQlkaXNhYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJd3JpdGVfZGF0YSAoZGV2LCAweDAxKTsgLyogc2VuZCBBQ0sgKi8KKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmUgc3RhcnRcbiIsIGRldi0+bmFtZSk7CisJCXJjdi0+c3RhdGUgPSBQTElQX1BLX0xFTkdUSF9MU0I7CisJCXJjdi0+bmliYmxlID0gUExJUF9OQl9CRUdJTjsKKworCWNhc2UgUExJUF9QS19MRU5HVEhfTFNCOgorCQlpZiAoc25kLT5zdGF0ZSAhPSBQTElQX1BLX0RPTkUpIHsKKwkJCWlmIChwbGlwX3JlY2VpdmUobmwtPnRyaWdnZXIsIGRldiwKKwkJCQkJICZyY3YtPm5pYmJsZSwgJnJjdi0+bGVuZ3RoLmIubHNiKSkgeworCQkJCS8qIGNvbGxpc2lvbiwgaGVyZSBkZXYtPnRidXN5ID09IDEgKi8KKwkJCQlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCQkJCW5sLT5pc19kZWZlcnJlZCA9IDE7CisJCQkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX1NFTkQ7CisJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCQkJCWVuYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKGRldik7CisJCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCQlyZXR1cm4gT0s7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocGxpcF9yZWNlaXZlKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkJCSAmcmN2LT5uaWJibGUsICZyY3YtPmxlbmd0aC5iLmxzYikpCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCX0KKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX01TQjsKKworCWNhc2UgUExJUF9QS19MRU5HVEhfTVNCOgorCQlpZiAocGxpcF9yZWNlaXZlKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkJICZyY3YtPm5pYmJsZSwgJnJjdi0+bGVuZ3RoLmIubXNiKSkKKwkJCXJldHVybiBUSU1FT1VUOworCQlpZiAocmN2LT5sZW5ndGguaCA+IGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4KKwkJICAgIHx8IHJjdi0+bGVuZ3RoLmggPCA4KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYm9ndXMgcGFja2V0IHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHJjdi0+bGVuZ3RoLmgpOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQlyY3YtPnNrYiA9IGRldl9hbGxvY19za2IocmN2LT5sZW5ndGguaCArIDIpOworCQlpZiAocmN2LT5za2IgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IHNxdWVlemUuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCXNrYl9yZXNlcnZlKHJjdi0+c2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCXNrYl9wdXQocmN2LT5za2IscmN2LT5sZW5ndGguaCk7CisJCXJjdi0+c2tiLT5kZXYgPSBkZXY7CisJCXJjdi0+c3RhdGUgPSBQTElQX1BLX0RBVEE7CisJCXJjdi0+Ynl0ZSA9IDA7CisJCXJjdi0+Y2hlY2tzdW0gPSAwOworCisJY2FzZSBQTElQX1BLX0RBVEE6CisJCWxidWYgPSByY3YtPnNrYi0+ZGF0YTsKKwkJZG8KKwkJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkJICZyY3YtPm5pYmJsZSwgJmxidWZbcmN2LT5ieXRlXSkpCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCXdoaWxlICgrK3Jjdi0+Ynl0ZSA8IHJjdi0+bGVuZ3RoLmgpOworCQlkbworCQkJcmN2LT5jaGVja3N1bSArPSBsYnVmWy0tcmN2LT5ieXRlXTsKKwkJd2hpbGUgKHJjdi0+Ynl0ZSk7CisJCXJjdi0+c3RhdGUgPSBQTElQX1BLX0NIRUNLU1VNOworCisJY2FzZSBQTElQX1BLX0NIRUNLU1VNOgorCQlpZiAocGxpcF9yZWNlaXZlKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkJICZyY3YtPm5pYmJsZSwgJnJjdi0+ZGF0YSkpCisJCQlyZXR1cm4gVElNRU9VVDsKKwkJaWYgKHJjdi0+ZGF0YSAhPSByY3YtPmNoZWNrc3VtKSB7CisJCQlubC0+ZW5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAobmV0X2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY2hlY2tzdW0gZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfRE9ORTsKKworCWNhc2UgUExJUF9QS19ET05FOgorCQkvKiBJbmZvcm0gdGhlIHVwcGVyIGxheWVyIGZvciB0aGUgYXJyaXZhbCBvZiBhIHBhY2tldC4gKi8KKwkJcmN2LT5za2ItPnByb3RvY29sPXBsaXBfdHlwZV90cmFucyhyY3YtPnNrYiwgZGV2KTsKKwkJbmV0aWZfcngocmN2LT5za2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlubC0+ZW5ldF9zdGF0cy5yeF9ieXRlcyArPSByY3YtPmxlbmd0aC5oOworCQlubC0+ZW5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCXJjdi0+c2tiID0gTlVMTDsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmUgZW5kXG4iLCBkZXYtPm5hbWUpOworCisJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uLiAqLworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCQlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJCWlmIChzbmQtPnN0YXRlICE9IFBMSVBfUEtfRE9ORSkgeworCQkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX1NFTkQ7CisJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCXNjaGVkdWxlX3dvcmsoJm5sLT5pbW1lZGlhdGUpOworCQkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJCUVOQUJMRShkZXYtPmlycSk7CisJCQlyZXR1cm4gT0s7CisJCX0gZWxzZSB7CisJCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fTk9ORTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCQkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJCUVOQUJMRShkZXYtPmlycSk7CisJCQlyZXR1cm4gT0s7CisJCX0KKwl9CisJcmV0dXJuIE9LOworfQorCisvKiBQTElQX1NFTkQgLS0tIHNlbmQgYSBieXRlICh0d28gbmliYmxlcykKKyAgIFJldHVybnMgT0sgb24gc3VjY2VzcywgVElNRU9VVCB3aGVuIHRpbWVvdXQgICAgKi8KK2lubGluZSBzdGF0aWMgaW50CitwbGlwX3NlbmQodW5zaWduZWQgc2hvcnQgbmliYmxlX3RpbWVvdXQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJICBlbnVtIHBsaXBfbmliYmxlX3N0YXRlICpuc19wLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciBjMDsKKwl1bnNpZ25lZCBpbnQgY3g7CisKKwlzd2l0Y2ggKCpuc19wKSB7CisJY2FzZSBQTElQX05CX0JFR0lOOgorCQl3cml0ZV9kYXRhIChkZXYsIGRhdGEgJiAweDBmKTsKKwkJKm5zX3AgPSBQTElQX05CXzE7CisKKwljYXNlIFBMSVBfTkJfMToKKwkJd3JpdGVfZGF0YSAoZGV2LCAweDEwIHwgKGRhdGEgJiAweDBmKSk7CisJCWN4ID0gbmliYmxlX3RpbWVvdXQ7CisJCXdoaWxlICgxKSB7CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlpZiAoKGMwICYgMHg4MCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICgtLWN4ID09IDApCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCQl1ZGVsYXkoUExJUF9ERUxBWV9VTklUKTsKKwkJfQorCQl3cml0ZV9kYXRhIChkZXYsIDB4MTAgfCAoZGF0YSA+PiA0KSk7CisJCSpuc19wID0gUExJUF9OQl8yOworCisJY2FzZSBQTElQX05CXzI6CisJCXdyaXRlX2RhdGEgKGRldiwgKGRhdGEgPj4gNCkpOworCQljeCA9IG5pYmJsZV90aW1lb3V0OworCQl3aGlsZSAoMSkgeworCQkJYzAgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJaWYgKGMwICYgMHg4MCkKKwkJCQlicmVhazsKKwkJCWlmICgtLWN4ID09IDApCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCQl1ZGVsYXkoUExJUF9ERUxBWV9VTklUKTsKKwkJfQorCQkqbnNfcCA9IFBMSVBfTkJfQkVHSU47CisJCXJldHVybiBPSzsKKwl9CisJcmV0dXJuIE9LOworfQorCisvKiBQTElQX1NFTkRfUEFDS0VUIC0tLSBzZW5kIGEgcGFja2V0ICovCitzdGF0aWMgaW50CitwbGlwX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwl1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCA9IG5sLT5uaWJibGU7CisJdW5zaWduZWQgY2hhciAqbGJ1ZjsKKwl1bnNpZ25lZCBjaGFyIGMwOworCXVuc2lnbmVkIGludCBjeDsKKworCWlmIChzbmQtPnNrYiA9PSBOVUxMIHx8IChsYnVmID0gc25kLT5za2ItPmRhdGEpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kIHNrYiBsb3N0XG4iLCBkZXYtPm5hbWUpOworCQlzbmQtPnN0YXRlID0gUExJUF9QS19ET05FOworCQlzbmQtPnNrYiA9IE5VTEw7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHNuZC0+c3RhdGUpIHsKKwljYXNlIFBMSVBfUEtfVFJJR0dFUjoKKwkJaWYgKChyZWFkX3N0YXR1cyhkZXYpICYgMHhmOCkgIT0gMHg4MCkKKwkJCXJldHVybiBIU19USU1FT1VUOworCisJCS8qIFRyaWdnZXIgcmVtb3RlIHJ4IGludGVycnVwdC4gKi8KKwkJd3JpdGVfZGF0YSAoZGV2LCAweDA4KTsKKwkJY3ggPSBubC0+dHJpZ2dlcjsKKwkJd2hpbGUgKDEpIHsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQkJc3Bpbl9sb2NrX2lycSgmbmwtPmxvY2spOworCQkJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fUkVDRUlWRSkgeworCQkJCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCQkJCS8qIEludGVycnVwdGVkLiAqLworCQkJCW5sLT5lbmV0X3N0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQlyZXR1cm4gT0s7CisJCQl9CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlpZiAoYzAgJiAweDA4KSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQkJRElTQUJMRShkZXYtPmlycSk7CisJCQkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkJCQlpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9SRUNFSVZFKSB7CisJCQkJCS8qIEludGVycnVwdGVkLgorCQkJCQkgICBXZSBkb24ndCBuZWVkIHRvIGVuYWJsZSBpcnEsCisJCQkJCSAgIGFzIGl0IGlzIHNvb24gZGlzYWJsZWQuICAgICovCisJCQkJCS8qIFllcywgd2UgZG8uIE5ldyB2YXJpYW50IG9mCisJCQkJCSAgIHtlbmFibGUsZGlzYWJsZX1faXJxICpjb3VudHMqCisJCQkJCSAgIHRoZW0uICAtLSBBViAgKi8KKwkJCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCQkJbmwtPmVuZXRfc3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlyZXR1cm4gT0s7CisJCQkJfQorCQkJCWRpc2FibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQkJCWlmIChuZXRfZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmQgc3RhcnRcbiIsIGRldi0+bmFtZSk7CisJCQkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX0xTQjsKKwkJCQlzbmQtPm5pYmJsZSA9IFBMSVBfTkJfQkVHSU47CisJCQkJbmwtPnRpbWVvdXRfY291bnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQlpZiAoLS1jeCA9PSAwKSB7CisJCQkJd3JpdGVfZGF0YSAoZGV2LCAweDAwKTsKKwkJCQlyZXR1cm4gSFNfVElNRU9VVDsKKwkJCX0KKwkJfQorCisJY2FzZSBQTElQX1BLX0xFTkdUSF9MU0I6CisJCWlmIChwbGlwX3NlbmQobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCSAgICAgICZzbmQtPm5pYmJsZSwgc25kLT5sZW5ndGguYi5sc2IpKQorCQkJcmV0dXJuIFRJTUVPVVQ7CisJCXNuZC0+c3RhdGUgPSBQTElQX1BLX0xFTkdUSF9NU0I7CisKKwljYXNlIFBMSVBfUEtfTEVOR1RIX01TQjoKKwkJaWYgKHBsaXBfc2VuZChuaWJibGVfdGltZW91dCwgZGV2LAorCQkJICAgICAgJnNuZC0+bmliYmxlLCBzbmQtPmxlbmd0aC5iLm1zYikpCisJCQlyZXR1cm4gVElNRU9VVDsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfREFUQTsKKwkJc25kLT5ieXRlID0gMDsKKwkJc25kLT5jaGVja3N1bSA9IDA7CisKKwljYXNlIFBMSVBfUEtfREFUQToKKwkJZG8KKwkJCWlmIChwbGlwX3NlbmQobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkgICAgICAmc25kLT5uaWJibGUsIGxidWZbc25kLT5ieXRlXSkpCisJCQkJcmV0dXJuIFRJTUVPVVQ7CisJCXdoaWxlICgrK3NuZC0+Ynl0ZSA8IHNuZC0+bGVuZ3RoLmgpOworCQlkbworCQkJc25kLT5jaGVja3N1bSArPSBsYnVmWy0tc25kLT5ieXRlXTsKKwkJd2hpbGUgKHNuZC0+Ynl0ZSk7CisJCXNuZC0+c3RhdGUgPSBQTElQX1BLX0NIRUNLU1VNOworCisJY2FzZSBQTElQX1BLX0NIRUNLU1VNOgorCQlpZiAocGxpcF9zZW5kKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkgICAgICAmc25kLT5uaWJibGUsIHNuZC0+Y2hlY2tzdW0pKQorCQkJcmV0dXJuIFRJTUVPVVQ7CisKKwkJbmwtPmVuZXRfc3RhdHMudHhfYnl0ZXMgKz0gc25kLT5za2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYihzbmQtPnNrYik7CisJCW5sLT5lbmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfRE9ORTsKKworCWNhc2UgUExJUF9QS19ET05FOgorCQkvKiBDbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCQlzbmQtPnNrYiA9IE5VTEw7CisJCWlmIChuZXRfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kIGVuZFxuIiwgZGV2LT5uYW1lKTsKKwkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX0NMT1NJTkc7CisJCW5sLT5pc19kZWZlcnJlZCA9IDE7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPmRlZmVycmVkLCAxKTsKKwkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJRU5BQkxFKGRldi0+aXJxKTsKKwkJcmV0dXJuIE9LOworCX0KKwlyZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfY29ubmVjdGlvbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJICAgICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fQ0xPU0lORykgeworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fTk9ORTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJaWYgKG5sLT5zaG91bGRfcmVsaW5xdWlzaCkgeworCQlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSBubC0+cG9ydF9vd25lciA9IDA7CisJCXBhcnBvcnRfcmVsZWFzZShubC0+cGFyZGV2KTsKKwl9CisJcmV0dXJuIE9LOworfQorCisvKiBQTElQX0VSUk9SIC0tLSB3YWl0IHRpbGwgb3RoZXIgZW5kIHNldHRsZWQgKi8KK3N0YXRpYyBpbnQKK3BsaXBfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRfc3RhdHVzKGRldik7CisJaWYgKChzdGF0dXMgJiAweGY4KSA9PSAweDgwKSB7CisJCWlmIChuZXRfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldCBpbnRlcmZhY2UuXG4iLCBkZXYtPm5hbWUpOworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fTk9ORTsKKwkJbmwtPnNob3VsZF9yZWxpbnF1aXNoID0gMDsKKwkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisJCWVuYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKGRldik7CisJCUVOQUJMRShkZXYtPmlycSk7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfSBlbHNlIHsKKwkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCX0KKworCXJldHVybiBPSzsKK30KKwwKKy8qIEhhbmRsZSB0aGUgcGFyYWxsZWwgcG9ydCBpbnRlcnJ1cHRzLiAqLworc3RhdGljIHZvaWQKK3BsaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbmw7CisJc3RydWN0IHBsaXBfbG9jYWwgKnJjdjsKKwl1bnNpZ25lZCBjaGFyIGMwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJwbGlwX2ludGVycnVwdDogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybjsKKwl9CisKKwlubCA9IG5ldGRldl9wcml2KGRldik7CisJcmN2ID0gJm5sLT5yY3ZfZGF0YTsKKworCXNwaW5fbG9ja19pcnEgKCZubC0+bG9jayk7CisKKwljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJaWYgKChjMCAmIDB4ZjgpICE9IDB4YzApIHsKKwkJaWYgKChkZXYtPmlycSAhPSAtMSkgJiYgKG5ldF9kZWJ1ZyA+IDEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2lycSAoJm5sLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuZXRfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdC5cbiIsIGRldi0+bmFtZSk7CisKKwlzd2l0Y2ggKG5sLT5jb25uZWN0aW9uKSB7CisJY2FzZSBQTElQX0NOX0NMT1NJTkc6CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJY2FzZSBQTElQX0NOX05PTkU6CisJY2FzZSBQTElQX0NOX1NFTkQ6CisJCXJjdi0+c3RhdGUgPSBQTElQX1BLX1RSSUdHRVI7CisJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9SRUNFSVZFOworCQlubC0+dGltZW91dF9jb3VudCA9IDA7CisJCXNjaGVkdWxlX3dvcmsoJm5sLT5pbW1lZGlhdGUpOworCQlicmVhazsKKworCWNhc2UgUExJUF9DTl9SRUNFSVZFOgorCQkvKiBNYXkgb2NjdXIgYmVjYXVzZSB0aGVyZSBpcyByYWNlIGNvbmRpdGlvbgorCQkgICBhcm91bmQgdGVzdCBhbmQgc2V0IG9mIGRldi0+aW50ZXJydXB0LgorCQkgICBJZ25vcmUgdGhpcyBpbnRlcnJ1cHQuICovCisJCWJyZWFrOworCisJY2FzZSBQTElQX0NOX0VSUk9SOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWNlaXZlIGludGVycnVwdCBpbiBlcnJvciBzdGF0ZVxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7Cit9CisMCitzdGF0aWMgaW50CitwbGlwX3R4X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kID0gJm5sLT5zbmRfZGF0YTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCXJldHVybiAxOworCisJLyogV2UgbWF5IG5lZWQgdG8gZ3JhYiB0aGUgYnVzICovCisJaWYgKCFubC0+cG9ydF9vd25lcikgeworCQlpZiAocGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkKKwkJCXJldHVybiAxOworCQlubC0+cG9ydF9vd25lciA9IDE7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkKKwlpZiAoc2tiLT5sZW4gPiBkZXYtPm10dSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwYWNrZXQgdG9vIGJpZywgJWQuXG4iLCBkZXYtPm5hbWUsIChpbnQpc2tiLT5sZW4pOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZCByZXF1ZXN0XG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycSgmbmwtPmxvY2spOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNuZC0+c2tiID0gc2tiOworCXNuZC0+bGVuZ3RoLmggPSBza2ItPmxlbjsKKwlzbmQtPnN0YXRlID0gUExJUF9QS19UUklHR0VSOworCWlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX05PTkUpIHsKKwkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX1NFTkQ7CisJCW5sLT50aW1lb3V0X2NvdW50ID0gMDsKKwl9CisJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwbGlwX3Jld3JpdGVfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRoaGRyICpldGgpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaWYgKChpbl9kZXY9ZGV2LT5pcF9wdHIpICE9IE5VTEwpIHsKKwkJLyogQW55IGFkZHJlc3Mgd2lsbCBkbyAtIHdlIHRha2UgdGhlIGZpcnN0ICovCisJCXN0cnVjdCBpbl9pZmFkZHIgKmlmYT1pbl9kZXYtPmlmYV9saXN0OworCQlpZiAoaWZhICE9IE5VTEwpIHsKKwkJCW1lbWNweShldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJCW1lbXNldChldGgtPmhfZGVzdCwgMHhmYywgMik7CisJCQltZW1jcHkoZXRoLT5oX2Rlc3QrMiwgJmlmYS0+aWZhX2FkZHJlc3MsIDQpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitwbGlwX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAorCSAgICAgICAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IG5sLT5vcmlnX2hhcmRfaGVhZGVyKHNrYiwgZGV2LCB0eXBlLCBkYWRkciwgc2FkZHIsIGxlbikpID49IDApCisJCXBsaXBfcmV3cml0ZV9hZGRyZXNzIChkZXYsIChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhoX2NhY2hlICpoaCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5laWdoLT5kZXYtPnByaXY7CisJaW50IHJldDsKKwkKKwlpZiAoKHJldCA9IG5sLT5vcmlnX2hhcmRfaGVhZGVyX2NhY2hlKG5laWdoLCBoaCkpID09IDApCisJeworCQlzdHJ1Y3QgZXRoaGRyICpldGg7CisKKwkJZXRoID0gKHN0cnVjdCBldGhoZHIqKSgoKHU4KiloaC0+aGhfZGF0YSkgKworCQkJCSAgICAgICBISF9EQVRBX09GRihzaXplb2YoKmV0aCkpKTsKKwkJcGxpcF9yZXdyaXRlX2FkZHJlc3MgKG5laWdoLT5kZXYsIGV0aCk7CisJfQorCQorCXJldHVybiByZXQ7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisKKyAgIFRoaXMgcm91dGluZSBnZXRzIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHBhcmFsbGVsIHBvcnQgYnkgYWxsb2NhdGluZworICAgaXRzIElSUSBsaW5lLgorICovCitzdGF0aWMgaW50CitwbGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJLyogR3JhYiB0aGUgcG9ydCAqLworCWlmICghbmwtPnBvcnRfb3duZXIpIHsKKwkJaWYgKHBhcnBvcnRfY2xhaW0obmwtPnBhcmRldikpIHJldHVybiAtRUFHQUlOOworCQlubC0+cG9ydF9vd25lciA9IDE7CisJfQorCisJbmwtPnNob3VsZF9yZWxpbnF1aXNoID0gMDsKKworCS8qIENsZWFyIHRoZSBkYXRhIHBvcnQuICovCisJd3JpdGVfZGF0YSAoZGV2LCAweDAwKTsKKworCS8qIEVuYWJsZSByeCBpbnRlcnJ1cHQuICovCisJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwlpZiAoZGV2LT5pcnEgPT0gLTEpCisJeworCQlhdG9taWNfc2V0ICgmbmwtPmtpbGxfdGltZXIsIDApOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT50aW1lciwgMSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKwlubC0+cmN2X2RhdGEuc3RhdGUgPSBubC0+c25kX2RhdGEuc3RhdGUgPSBQTElQX1BLX0RPTkU7CisJbmwtPnJjdl9kYXRhLnNrYiA9IG5sLT5zbmRfZGF0YS5za2IgPSBOVUxMOworCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCW5sLT5pc19kZWZlcnJlZCA9IDA7CisKKwkvKiBGaWxsIGluIHRoZSBNQUMtbGV2ZWwgaGVhZGVyLgorCSAgIFdlIHVzZWQgdG8gYWJ1c2UgZGV2LT5icm9hZGNhc3QgdG8gc3RvcmUgdGhlIHBvaW50LXRvLXBvaW50CisJICAgTUFDIGFkZHJlc3MsIGJ1dCB3ZSBubyBsb25nZXIgZG8gaXQuIEluc3RlYWQsIHdlIGZldGNoIHRoZQorCSAgIGludGVyZmFjZSBhZGRyZXNzIHdoZW5ldmVyIGl0IGlzIG5lZWRlZCwgd2hpY2ggaXMgY2hlYXAgZW5vdWdoCisJICAgYmVjYXVzZSB3ZSB1c2UgdGhlIGhoX2NhY2hlLiBBY3R1YWxseSwgYWJ1c2luZyBkZXYtPmJyb2FkY2FzdAorCSAgIGRpZG4ndCB3b3JrLCBiZWNhdXNlIHdoZW4gdXNpbmcgcGxpcF9vcGVuIHRoZSBwb2ludC10by1wb2ludAorCSAgIGFkZHJlc3MgaXNuJ3QgeWV0IGtub3duLgorCSAgIFBMSVAgZG9lc24ndCBoYXZlIGEgcmVhbCBNQUMgYWRkcmVzcywgYnV0IHdlIG5lZWQgaXQgdG8gYmUKKwkgICBET1MgY29tcGF0aWJsZSwgYW5kIHRvIHByb3Blcmx5IHN1cHBvcnQgdGFwcyAob3RoZXJ3aXNlLAorCSAgIHdoZW4gdGhlIGRldmljZSBhZGRyZXNzIGlzbid0IGlkZW50aWNhbCB0byB0aGUgYWRkcmVzcyBvZiBhCisJICAgcmVjZWl2ZWQgZnJhbWUsIHRoZSBrZXJuZWwgaW5jb3JyZWN0bHkgZHJvcHMgaXQpLiAgICAgICAgICAgICAqLworCisJaWYgKChpbl9kZXY9ZGV2LT5pcF9wdHIpICE9IE5VTEwpIHsKKwkJLyogQW55IGFkZHJlc3Mgd2lsbCBkbyAtIHdlIHRha2UgdGhlIGZpcnN0LiBXZSBhbHJlYWR5CisJCSAgIGhhdmUgdGhlIGZpcnN0IHR3byBieXRlcyBmaWxsZWQgd2l0aCAweGZjLCBmcm9tCisJCSAgIHBsaXBfaW5pdF9kZXYoKS4gKi8KKwkJc3RydWN0IGluX2lmYWRkciAqaWZhPWluX2Rldi0+aWZhX2xpc3Q7CisJCWlmIChpZmEgIT0gTlVMTCkgeworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIrMiwgJmlmYS0+aWZhX2xvY2FsLCA0KTsKKwkJfQorCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gcGxpcF9vcGVuICgpLiAqLworc3RhdGljIGludAorcGxpcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kID0gJm5sLT5zbmRfZGF0YTsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2ID0gJm5sLT5yY3ZfZGF0YTsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJRElTQUJMRShkZXYtPmlycSk7CisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCWlmIChkZXYtPmlycSA9PSAtMSkKKwl7CisJCWluaXRfTVVURVhfTE9DS0VEICgmbmwtPmtpbGxlZF90aW1lcl9zZW0pOworCQlhdG9taWNfc2V0ICgmbmwtPmtpbGxfdGltZXIsIDEpOworCQlkb3duICgmbmwtPmtpbGxlZF90aW1lcl9zZW0pOworCX0KKworI2lmZGVmIE5PVERFRgorCW91dGIoMHgwMCwgUEFSX0RBVEEoZGV2KSk7CisjZW5kaWYKKwlubC0+aXNfZGVmZXJyZWQgPSAwOworCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCWlmIChubC0+cG9ydF9vd25lcikgeworCQlwYXJwb3J0X3JlbGVhc2UobmwtPnBhcmRldik7CisJCW5sLT5wb3J0X293bmVyID0gMDsKKwl9CisKKwlzbmQtPnN0YXRlID0gUExJUF9QS19ET05FOworCWlmIChzbmQtPnNrYikgeworCQlkZXZfa2ZyZWVfc2tiKHNuZC0+c2tiKTsKKwkJc25kLT5za2IgPSBOVUxMOworCX0KKwlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCWlmIChyY3YtPnNrYikgeworCQlrZnJlZV9za2IocmN2LT5za2IpOworCQlyY3YtPnNrYiA9IE5VTEw7CisJfQorCisjaWZkZWYgTk9UREVGCisJLyogUmVzZXQuICovCisJb3V0YigweDAwLCBQQVJfQ09OVFJPTChkZXYpKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwbGlwX3ByZWVtcHQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiloYW5kbGU7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogU3RhbmQgb3VyIGdyb3VuZCBpZiBhIGRhdGFncmFtIGlzIG9uIHRoZSB3aXJlICovCisJaWYgKG5sLT5jb25uZWN0aW9uICE9IFBMSVBfQ05fTk9ORSkgeworCQlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlubC0+cG9ydF9vd25lciA9IDA7CS8qIFJlbWVtYmVyIHRoYXQgd2UgcmVsZWFzZWQgdGhlIGJ1cyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcGxpcF93YWtldXAodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiloYW5kbGU7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5sLT5wb3J0X293bmVyKSB7CisJCS8qIFdoeSBhcmUgd2UgYmVpbmcgd29rZW4gdXA/ICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogd2h5IGFtIEkgYmVpbmcgd29rZW4gdXA/XG4iLCBkZXYtPm5hbWUpOworCQlpZiAoIXBhcnBvcnRfY2xhaW0obmwtPnBhcmRldikpCisJCQkvKiBidXNfb3duZXIgaXMgYWxyZWFkeSBzZXQgKGJ1dCB3aHk/KSAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJJ20gYnJva2VuLlxuIiwgZGV2LT5uYW1lKTsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKwkKKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJLyogRG9uJ3QgbmVlZCB0aGUgcG9ydCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCQlyZXR1cm47CisKKwlpZiAoIXBhcnBvcnRfY2xhaW0obmwtPnBhcmRldikpIHsKKwkJbmwtPnBvcnRfb3duZXIgPSAxOworCQkvKiBDbGVhciB0aGUgZGF0YSBwb3J0LiAqLworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3BsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyID0gJm5sLT5lbmV0X3N0YXRzOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBsaXBjb25mICpwYyA9IChzdHJ1Y3QgcGxpcGNvbmYgKikgJnJxLT5pZnJfaWZydTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBMSVApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaChwYy0+cGNtZCkgeworCWNhc2UgUExJUF9HRVRfVElNRU9VVDoKKwkJcGMtPnRyaWdnZXIgPSBubC0+dHJpZ2dlcjsKKwkJcGMtPm5pYmJsZSAgPSBubC0+bmliYmxlOworCQlicmVhazsKKwljYXNlIFBMSVBfU0VUX1RJTUVPVVQ6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJbmwtPnRyaWdnZXIgPSBwYy0+dHJpZ2dlcjsKKwkJbmwtPm5pYmJsZSAgPSBwYy0+bmliYmxlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorDAorc3RhdGljIGludCBwYXJwb3J0W1BMSVBfTUFYXSA9IHsgWzAgLi4uIFBMSVBfTUFYLTFdID0gLTEgfTsKK3N0YXRpYyBpbnQgdGltaWQ7CisKK21vZHVsZV9wYXJhbV9hcnJheShwYXJwb3J0LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHRpbWlkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYXJwb3J0LCAiTGlzdCBvZiBwYXJwb3J0IGRldmljZSBudW1iZXJzIHRvIHVzZSBieSBwbGlwIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3BsaXBbUExJUF9NQVhdID0geyBOVUxMLCB9OworCitzdGF0aWMgaW5saW5lIGludAorcGxpcF9zZWFyY2hmb3IoaW50IGxpc3RbXSwgaW50IGEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFBMSVBfTUFYICYmIGxpc3RbaV0gIT0gLTE7IGkrKykgeworCQlpZiAobGlzdFtpXSA9PSBhKSByZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHBsaXBfYXR0YWNoKCkgaXMgY2FsbGVkIChieSB0aGUgcGFycG9ydCBjb2RlKSB3aGVuIGEgcG9ydCBpcworICogYXZhaWxhYmxlIHRvIHVzZS4gKi8KK3N0YXRpYyB2b2lkIHBsaXBfYXR0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlzdGF0aWMgaW50IHVuaXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubDsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJaWYgKChwYXJwb3J0WzBdID09IC0xICYmICghdGltaWQgfHwgIXBvcnQtPmRldmljZXMpKSB8fCAKKwkgICAgcGxpcF9zZWFyY2hmb3IocGFycG9ydCwgcG9ydC0+bnVtYmVyKSkgeworCQlpZiAodW5pdCA9PSBQTElQX01BWCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwbGlwOiB0b28gbWFueSBkZXZpY2VzXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNwcmludGYobmFtZSwgInBsaXAlZCIsIHVuaXQpOworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwbGlwOiBtZW1vcnkgc3F1ZWV6ZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXN0cmNweShkZXYtPm5hbWUsIG5hbWUpOworCisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT5pcnEgPSBwb3J0LT5pcnE7CisJCWRldi0+YmFzZV9hZGRyID0gcG9ydC0+YmFzZTsKKwkJaWYgKHBvcnQtPmlycSA9PSAtMSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAicGxpcDogJXMgaGFzIG5vIElSUS4gVXNpbmcgSVJRLWxlc3MgbW9kZSwiCisJCSAgICAgICAgICAgICAgICAgIndoaWNoIGlzIGZhaXJseSBpbmVmZmljaWVudCFcbiIsIHBvcnQtPm5hbWUpOworCQl9CisKKwkJbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCQlubC0+cGFyZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgbmFtZSwgcGxpcF9wcmVlbXB0LAorCQkJCQkJIHBsaXBfd2FrZXVwLCBwbGlwX2ludGVycnVwdCwgCisJCQkJCQkgMCwgZGV2KTsKKworCQlpZiAoIW5sLT5wYXJkZXYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBhcnBvcnRfcmVnaXN0ZXIgZmFpbGVkXG4iLCBuYW1lKTsKKwkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQkJcmV0dXJuOworCQl9CisKKwkJcGxpcF9pbml0X25ldGRldihkZXYpOworCisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbmV0d29yayByZWdpc3RlciBmYWlsZWRcbiIsIG5hbWUpOworCQkJZ290byBlcnJfcGFycG9ydF91bnJlZ2lzdGVyOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKwkJaWYgKGRldi0+aXJxICE9IC0xKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhcmFsbGVsIHBvcnQgYXQgJSMzbHgsICIKKwkJCQkJICJ1c2luZyBJUlEgJWQuXG4iLAorCQkJCSAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhcmFsbGVsIHBvcnQgYXQgJSMzbHgsICIKKwkJCQkJICJub3QgdXNpbmcgSVJRLlxuIiwKKwkJCQkJIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIpOworCQlkZXZfcGxpcFt1bml0KytdID0gZGV2OworCX0KKwlyZXR1cm47CisKK2Vycl9wYXJwb3J0X3VucmVnaXN0ZXI6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShubC0+cGFyZGV2KTsKK2Vycl9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybjsKK30KKworLyogcGxpcF9kZXRhY2goKSBpcyBjYWxsZWQgKGJ5IHRoZSBwYXJwb3J0IGNvZGUpIHdoZW4gYSBwb3J0IGlzCisgKiBubyBsb25nZXIgYXZhaWxhYmxlIHRvIHVzZS4gKi8KK3N0YXRpYyB2b2lkIHBsaXBfZGV0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgcGxpcF9kcml2ZXIgPSB7CisJLm5hbWUJPSAicGxpcCIsCisJLmF0dGFjaCA9IHBsaXBfYXR0YWNoLAorCS5kZXRhY2ggPSBwbGlwX2RldGFjaAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IHBsaXBfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIgKCZwbGlwX2RyaXZlcik7CisKKwlmb3IgKGk9MDsgaSA8IFBMSVBfTUFYOyBpKyspIHsKKwkJaWYgKChkZXYgPSBkZXZfcGxpcFtpXSkpIHsKKwkJCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlpZiAobmwtPnBvcnRfb3duZXIpCisJCQkJcGFycG9ydF9yZWxlYXNlKG5sLT5wYXJkZXYpOworCQkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShubC0+cGFyZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlkZXZfcGxpcFtpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKyNpZm5kZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgcGFycG9ydF9wdHI7CisKK3N0YXRpYyBpbnQgX19pbml0IHBsaXBfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzRdOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCS8qIFVnaC4gKi8KKwlpZiAoIXN0cm5jbXAoc3RyLCAicGFycG9ydCIsIDcpKSB7CisJCWludCBuID0gc2ltcGxlX3N0cnRvdWwoc3RyKzcsIE5VTEwsIDEwKTsKKwkJaWYgKHBhcnBvcnRfcHRyIDwgUExJUF9NQVgpCisJCQlwYXJwb3J0W3BhcnBvcnRfcHRyKytdID0gbjsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAicGxpcDogdG9vIG1hbnkgcG9ydHMsICVzIGlnbm9yZWQuXG4iLAorCQkJICAgICAgIHN0cik7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgInRpbWlkIikpIHsKKwkJdGltaWQgPSAxOworCX0gZWxzZSB7CisJCWlmIChpbnRzWzBdID09IDAgfHwgaW50c1sxXSA9PSAwKSB7CisJCQkvKiBkaXNhYmxlIGRyaXZlciBvbiAicGxpcD0iIG9yICJwbGlwPTAiICovCisJCQlwYXJwb3J0WzBdID0gLTI7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXJuaW5nOiAncGxpcD0weCV4JyBpZ25vcmVkXG4iLCAKKwkJCSAgICAgICBpbnRzWzFdKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicGxpcD0iLCBwbGlwX3NldHVwKTsKKworI2VuZGlmIC8qICFNT0RVTEUgKi8KKworc3RhdGljIGludCBfX2luaXQgcGxpcF9pbml0ICh2b2lkKQoreworCWlmIChwYXJwb3J0WzBdID09IC0yKQorCQlyZXR1cm4gMDsKKworCWlmIChwYXJwb3J0WzBdICE9IC0xICYmIHRpbWlkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBsaXA6IHdhcm5pbmcsIGlnbm9yaW5nIGB0aW1pZCcgc2luY2Ugc3BlY2lmaWMgcG9ydHMgZ2l2ZW4uXG4iKTsKKwkJdGltaWQgPSAwOworCX0KKworCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlciAoJnBsaXBfZHJpdmVyKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAicGxpcDogY291bGRuJ3QgcmVnaXN0ZXIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHBsaXBfaW5pdCk7Cittb2R1bGVfZXhpdChwbGlwX2NsZWFudXBfbW9kdWxlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZyAtZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtYyBwbGlwLmMiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jIGIvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiOWQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCkBAIC0wLDAgKzEsMTAzMyBAQAorLyoKKyAqIFBQUCBhc3luYyBzZXJpYWwgY2hhbm5lbCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAxOTk5IFBhdWwgTWFja2VycmFzLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZSBlbmNhcHN1bGF0aW9uIGFuZCBmcmFtaW5nIGZvciBzZW5kaW5nCisgKiBhbmQgcmVjZWl2aW5nIFBQUCBmcmFtZXMgb3ZlciBhc3luYyBzZXJpYWwgbGluZXMuICBJdCByZWxpZXMgb24KKyAqIHRoZSBnZW5lcmljIFBQUCBsYXllciB0byBnaXZlIGl0IGZyYW1lcyB0byBzZW5kIGFuZCB0byBwcm9jZXNzCisgKiByZWNlaXZlZCBmcmFtZXMuICBJdCBpbXBsZW1lbnRzIHRoZSBQUFAgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIFBhcnQgb2YgdGhlIGNvZGUgaW4gdGhpcyBkcml2ZXIgd2FzIGluc3BpcmVkIGJ5IHRoZSBvbGQgYXN5bmMtb25seQorICogUFBQIGRyaXZlciwgd3JpdHRlbiBieSBNaWNoYWVsIENhbGxhaGFuIGFuZCBBbCBMb25neWVhciwgYW5kCisgKiBzdWJzZXF1ZW50bHkgaGFja2VkIGJ5IFBhdWwgTWFja2VycmFzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgUFBQX1ZFUlNJT04JIjIuNC4yIgorCisjZGVmaW5lIE9CVUZTSVpFCTI1NgorCisvKiBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgbG9jYWwgc3RhdGUuICovCitzdHJ1Y3QgYXN5bmNwcHAgeworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50CWZsYWdzOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJcmJpdHM7CisJaW50CQltcnU7CisJc3BpbmxvY2tfdAl4bWl0X2xvY2s7CisJc3BpbmxvY2tfdAlyZWN2X2xvY2s7CisJdW5zaWduZWQgbG9uZwl4bWl0X2ZsYWdzOworCXUzMgkJeGFjY21bOF07CisJdTMyCQlyYWNjbTsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfc2VudDsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfcmN2ZDsKKworCXN0cnVjdCBza19idWZmCSp0cGt0OworCWludAkJdHBrdF9wb3M7CisJdTE2CQl0ZmNzOworCXVuc2lnbmVkIGNoYXIJKm9wdHI7CisJdW5zaWduZWQgY2hhcgkqb2xpbTsKKwl1bnNpZ25lZCBsb25nCWxhc3RfeG1pdDsKKworCXN0cnVjdCBza19idWZmCSpycGt0OworCWludAkJbGNwX2ZjczsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJxdWV1ZTsKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0c2s7CisKKwlhdG9taWNfdAlyZWZjbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBkZWFkX3NlbTsKKwlzdHJ1Y3QgcHBwX2NoYW5uZWwgY2hhbjsJLyogaW50ZXJmYWNlIHRvIGdlbmVyaWMgcHBwIGxheWVyICovCisJdW5zaWduZWQgY2hhcglvYnVmW09CVUZTSVpFXTsKK307CisKKy8qIEJpdCBudW1iZXJzIGluIHhtaXRfZmxhZ3MgKi8KKyNkZWZpbmUgWE1JVF9XQUtFVVAJMAorI2RlZmluZSBYTUlUX0ZVTEwJMQorI2RlZmluZSBYTUlUX0JVU1kJMgorCisvKiBTdGF0ZSBiaXRzICovCisjZGVmaW5lIFNDX1RPU1MJCTEKKyNkZWZpbmUgU0NfRVNDQVBFCTIKKyNkZWZpbmUgU0NfUFJFVl9FUlJPUgk0CisKKy8qIEJpdHMgaW4gcmJpdHMgKi8KKyNkZWZpbmUgU0NfUkNWX0JJVFMJKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQorCitzdGF0aWMgaW50IGZsYWdfdGltZSA9IEhaOworbW9kdWxlX3BhcmFtKGZsYWdfdGltZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxhZ190aW1lLCAicHBwX2FzeW5jOiBpbnRlcnZhbCBiZXR3ZWVuIGZsYWdnZWQgcGFja2V0cyAoaW4gY2xvY2sgdGlja3MpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTERJU0MoTl9QUFApOworCisvKgorICogUHJvdG90eXBlcy4KKyAqLworc3RhdGljIGludCBwcHBfYXN5bmNfZW5jb2RlKHN0cnVjdCBhc3luY3BwcCAqYXApOworc3RhdGljIGludCBwcHBfYXN5bmNfc2VuZChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBwcHBfYXN5bmNfcHVzaChzdHJ1Y3QgYXN5bmNwcHAgKmFwKTsKK3N0YXRpYyB2b2lkIHBwcF9hc3luY19mbHVzaF9vdXRwdXQoc3RydWN0IGFzeW5jcHBwICphcCk7CitzdGF0aWMgdm9pZCBwcHBfYXN5bmNfaW5wdXQoc3RydWN0IGFzeW5jcHBwICphcCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpOworc3RhdGljIGludCBwcHBfYXN5bmNfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcHBwX2FzeW5jX3Byb2Nlc3ModW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgdm9pZCBhc3luY19sY3BfcGVlayhzdHJ1Y3QgYXN5bmNwcHAgKmFwLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgaW50IGxlbiwgaW50IGluYm91bmQpOworCitzdGF0aWMgc3RydWN0IHBwcF9jaGFubmVsX29wcyBhc3luY19vcHMgPSB7CisJcHBwX2FzeW5jX3NlbmQsCisJcHBwX2FzeW5jX2lvY3RsCit9OworCisvKgorICogUm91dGluZXMgaW1wbGVtZW50aW5nIHRoZSBQUFAgbGluZSBkaXNjaXBsaW5lLgorICovCisKKy8qCisgKiBXZSBoYXZlIGEgcG90ZW50aWFsIHJhY2Ugb24gZGVyZWZlcmVuY2luZyB0dHktPmRpc2NfZGF0YSwKKyAqIGJlY2F1c2UgdGhlIHR0eSBsYXllciBwcm92aWRlcyBubyBsb2NraW5nIGF0IGFsbCAtIHRodXMgb25lCisgKiBjcHUgY291bGQgYmUgcnVubmluZyBwcHBfYXN5bmN0dHlfcmVjZWl2ZSB3aGlsZSBhbm90aGVyCisgKiBjYWxscyBwcHBfYXN5bmN0dHlfY2xvc2UsIHdoaWNoIHplcm9lcyB0dHktPmRpc2NfZGF0YSBhbmQKKyAqIGZyZWVzIHRoZSBtZW1vcnkgdGhhdCBwcHBfYXN5bmN0dHlfcmVjZWl2ZSBpcyB1c2luZy4gIFRoZSBiZXN0CisgKiB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlIGEgcndsb2NrIGluIHRoZSB0dHkgc3RydWN0LCBidXQgZm9yIG5vdworICogd2UgdXNlIGEgc2luZ2xlIGdsb2JhbCByd2xvY2sgZm9yIGFsbCB0dHlzIGluIHBwcCBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogRklYTUU6IHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUuIFRoZSBfY2xvc2UgcGF0aCBmb3IgdGhlIGxkaXNjIGlzIAorICogbm93IGd1YXJhbnRlZWQgdG8gYmUgc2FuZS4gCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGRpc2NfZGF0YV9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBhc3luY3BwcCAqYXBfZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcDsKKworCXJlYWRfbG9jaygmZGlzY19kYXRhX2xvY2spOworCWFwID0gdHR5LT5kaXNjX2RhdGE7CisJaWYgKGFwICE9IE5VTEwpCisJCWF0b21pY19pbmMoJmFwLT5yZWZjbnQpOworCXJlYWRfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJcmV0dXJuIGFwOworfQorCitzdGF0aWMgdm9pZCBhcF9wdXQoc3RydWN0IGFzeW5jcHBwICphcCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYXAtPnJlZmNudCkpCisJCXVwKCZhcC0+ZGVhZF9zZW0pOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSB0dHkgaXMgcHV0IGludG8gUFBQIGxpbmUgZGlzY2lwbGluZS4gQ2FsbGVkIGluIHByb2Nlc3MKKyAqIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9hc3luY3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcDsKKwlpbnQgZXJyOworCisJZXJyID0gLUVOT01FTTsKKwlhcCA9IGttYWxsb2Moc2l6ZW9mKCphcCksIEdGUF9LRVJORUwpOworCWlmIChhcCA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIGluaXRpYWxpemUgdGhlIGFzeW5jcHBwIHN0cnVjdHVyZSAqLworCW1lbXNldChhcCwgMCwgc2l6ZW9mKCphcCkpOworCWFwLT50dHkgPSB0dHk7CisJYXAtPm1ydSA9IFBQUF9NUlU7CisJc3Bpbl9sb2NrX2luaXQoJmFwLT54bWl0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhcC0+cmVjdl9sb2NrKTsKKwlhcC0+eGFjY21bMF0gPSB+MFU7CisJYXAtPnhhY2NtWzNdID0gMHg2MDAwMDAwMFU7CisJYXAtPnJhY2NtID0gfjBVOworCWFwLT5vcHRyID0gYXAtPm9idWY7CisJYXAtPm9saW0gPSBhcC0+b2J1ZjsKKwlhcC0+bGNwX2ZjcyA9IC0xOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXAtPnJxdWV1ZSk7CisJdGFza2xldF9pbml0KCZhcC0+dHNrLCBwcHBfYXN5bmNfcHJvY2VzcywgKHVuc2lnbmVkIGxvbmcpIGFwKTsKKworCWF0b21pY19zZXQoJmFwLT5yZWZjbnQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZhcC0+ZGVhZF9zZW0pOworCisJYXAtPmNoYW4ucHJpdmF0ZSA9IGFwOworCWFwLT5jaGFuLm9wcyA9ICZhc3luY19vcHM7CisJYXAtPmNoYW4ubXR1ID0gUFBQX01SVTsKKwllcnIgPSBwcHBfcmVnaXN0ZXJfY2hhbm5lbCgmYXAtPmNoYW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwl0dHktPmRpc2NfZGF0YSA9IGFwOworCisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZToKKwlrZnJlZShhcCk7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgdHR5IGlzIHB1dCBpbnRvIGFub3RoZXIgbGluZSBkaXNjaXBsaW5lCisgKiBvciBpdCBoYW5ncyB1cC4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgYW55IGNwdSBjdXJyZW50bHkKKyAqIGV4ZWN1dGluZyBpbiBhbnkgb2YgdGhlIG90aGVyIHBwcF9hc3luY3R0eV8qIHJvdXRpbmVzIHRvCisgKiBmaW5pc2ggYmVmb3JlIHdlIGNhbiBjYWxsIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwgYW5kIGZyZWUKKyAqIHRoZSBhc3luY3BwcCBzdHJ1Y3QuICBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgZnJvbQorICogcHJvY2VzcyBjb250ZXh0LCBub3QgaW50ZXJydXB0IG9yIHNvZnRpcnEgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9hc3luY3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY3BwcCAqYXA7CisKKwl3cml0ZV9sb2NrX2lycSgmZGlzY19kYXRhX2xvY2spOworCWFwID0gdHR5LT5kaXNjX2RhdGE7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCXdyaXRlX3VubG9ja19pcnEoJmRpc2NfZGF0YV9sb2NrKTsKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBoYXZlIG5vdyBlbnN1cmVkIHRoYXQgbm9ib2R5IGNhbiBzdGFydCB1c2luZyBhcCBmcm9tIG5vdworCSAqIG9uLCBidXQgd2UgaGF2ZSB0byB3YWl0IGZvciBhbGwgZXhpc3RpbmcgdXNlcnMgdG8gZmluaXNoLgorCSAqIE5vdGUgdGhhdCBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsIGVuc3VyZXMgdGhhdCBubyBjYWxscyB0bworCSAqIG91ciBjaGFubmVsIG9wcyAoaS5lLiBwcHBfYXN5bmNfc2VuZC9pb2N0bCkgYXJlIGluIHByb2dyZXNzCisJICogYnkgdGhlIHRpbWUgaXQgcmV0dXJucy4KKwkgKi8KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmFwLT5yZWZjbnQpKQorCQlkb3duKCZhcC0+ZGVhZF9zZW0pOworCXRhc2tsZXRfa2lsbCgmYXAtPnRzayk7CisKKwlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJaWYgKGFwLT5ycGt0ICE9IDApCisJCWtmcmVlX3NrYihhcC0+cnBrdCk7CisJc2tiX3F1ZXVlX3B1cmdlKCZhcC0+cnF1ZXVlKTsKKwlpZiAoYXAtPnRwa3QgIT0gMCkKKwkJa2ZyZWVfc2tiKGFwLT50cGt0KTsKKwlrZnJlZShhcCk7Cit9CisKKy8qCisgKiBDYWxsZWQgb24gdHR5IGhhbmd1cCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKgorICogV2FpdCBmb3IgSS9PIHRvIGRyaXZlciB0byBjb21wbGV0ZSBhbmQgdW5yZWdpc3RlciBQUFAgY2hhbm5lbC4KKyAqIFRoaXMgaXMgYWxyZWFkeSBkb25lIGJ5IHRoZSBjbG9zZSByb3V0aW5lLCBzbyBqdXN0IGNhbGwgdGhhdC4KKyAqLworc3RhdGljIGludCBwcHBfYXN5bmN0dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcHBwX2FzeW5jdHR5X2Nsb3NlKHR0eSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGRvZXMgbm90aGluZyAtIG5vIGRhdGEgaXMgZXZlciBhdmFpbGFibGUgdGhpcyB3YXkuCisgKiBQcHBkIHJlYWRzIGFuZCB3cml0ZXMgcGFja2V0cyB2aWEgL2Rldi9wcHAgaW5zdGVhZC4KKyAqLworc3RhdGljIHNzaXplX3QKK3BwcF9hc3luY3R0eV9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoKKyAqIFdyaXRlIG9uIHRoZSB0dHkgZG9lcyBub3RoaW5nLCB0aGUgcGFja2V0cyBhbGwgY29tZSBpbgorICogZnJvbSB0aGUgcHBwIGdlbmVyaWMgc3R1ZmYuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitwcHBfYXN5bmN0dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogQ2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCBvbmx5LiBNYXkgYmUgcmUtZW50ZXJlZCBieSBtdWx0aXBsZQorICogaW9jdGwgY2FsbGluZyB0aHJlYWRzLgorICovCisgCitzdGF0aWMgaW50CitwcHBfYXN5bmN0dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhc3luY3BwcCAqYXAgPSBhcF9nZXQodHR5KTsKKwlpbnQgZXJyLCB2YWw7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJaWYgKGFwID09IDApCisJCXJldHVybiAtRU5YSU87CisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0NIQU46CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKGFwID09IDApCisJCQlicmVhazsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHBwcF9jaGFubmVsX2luZGV4KCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHVU5JVDoKKwkJZXJyID0gLUVOWElPOworCQlpZiAoYXAgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwX3VuaXRfbnVtYmVyKCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgVENGTFNIOgorCQkvKiBmbHVzaCBvdXIgYnVmZmVycyBhbmQgdGhlIHNlcmlhbCBwb3J0J3MgYnVmZmVyICovCisJCWlmIChhcmcgPT0gVENJT0ZMVVNIIHx8IGFyZyA9PSBUQ09GTFVTSCkKKwkJCXBwcF9hc3luY19mbHVzaF9vdXRwdXQoYXApOworCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEZJT05SRUFEOgorCQl2YWwgPSAwOworCQlpZiAocHV0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9JT0NUTENNRDsKKwl9CisKKwlhcF9wdXQoYXApOworCXJldHVybiBlcnI7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludAorcHBwX2FzeW5jdHR5X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BwcF9hc3luY3R0eV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM1OworfQorCisvKgorICogVGhpcyBjYW4gbm93IGJlIGNhbGxlZCBmcm9tIGhhcmQgaW50ZXJydXB0IGxldmVsIGFzIHdlbGwKKyAqIGFzIHNvZnQgaW50ZXJydXB0IGxldmVsIG9yIG1haW5saW5lLgorICovCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgIGNoYXIgKmNmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCBhc3luY3BwcCAqYXAgPSBhcF9nZXQodHR5KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFwID09IDApCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOworCXBwcF9hc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJmFwLT5ycXVldWUpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKKwlhcF9wdXQoYXApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpCisJICAgICYmIHR0eS0+ZHJpdmVyLT51bnRocm90dGxlKQorCQl0dHktPmRyaXZlci0+dW50aHJvdHRsZSh0dHkpOworfQorCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY3BwcCAqYXAgPSBhcF9nZXQodHR5KTsKKworCWNsZWFyX2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJaWYgKGFwID09IDApCisJCXJldHVybjsKKwlzZXRfYml0KFhNSVRfV0FLRVVQLCAmYXAtPnhtaXRfZmxhZ3MpOworCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOworCWFwX3B1dChhcCk7Cit9CisKKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgcHBwX2xkaXNjID0geworCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkubWFnaWMJPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUJPSAicHBwIiwKKwkub3Blbgk9IHBwcF9hc3luY3R0eV9vcGVuLAorCS5jbG9zZQk9IHBwcF9hc3luY3R0eV9jbG9zZSwKKwkuaGFuZ3VwCT0gcHBwX2FzeW5jdHR5X2hhbmd1cCwKKwkucmVhZAk9IHBwcF9hc3luY3R0eV9yZWFkLAorCS53cml0ZQk9IHBwcF9hc3luY3R0eV93cml0ZSwKKwkuaW9jdGwJPSBwcHBfYXN5bmN0dHlfaW9jdGwsCisJLnBvbGwJPSBwcHBfYXN5bmN0dHlfcG9sbCwKKwkucmVjZWl2ZV9yb29tID0gcHBwX2FzeW5jdHR5X3Jvb20sCisJLnJlY2VpdmVfYnVmID0gcHBwX2FzeW5jdHR5X3JlY2VpdmUsCisJLndyaXRlX3dha2V1cCA9IHBwcF9hc3luY3R0eV93YWtldXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcHBwX2FzeW5jX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fUFBQLCAmcHBwX2xkaXNjKTsKKwlpZiAoZXJyICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiUFBQX2FzeW5jOiBlcnJvciAlZCByZWdpc3RlcmluZyBsaW5lIGRpc2MuXG4iLAorCQkgICAgICAgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBwcm92aWRlIHRoZSBQUFAgY2hhbm5lbCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9hc3luY19pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhc3luY3BwcCAqYXAgPSBjaGFuLT5wcml2YXRlOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBlcnIsIHZhbDsKKwl1MzIgYWNjbVs4XTsKKworCWVyciA9IC1FRkFVTFQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dGTEFHUzoKKwkJdmFsID0gYXAtPmZsYWdzIHwgYXAtPnJiaXRzOworCQlpZiAocHV0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJYXAtPmZsYWdzID0gdmFsICYgflNDX1JDVl9CSVRTOworCQlzcGluX2xvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJYXAtPnJiaXRzID0gdmFsICYgU0NfUkNWX0JJVFM7CisJCXNwaW5fdW5sb2NrX2lycSgmYXAtPnJlY3ZfbG9jayk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHQVNZTkNNQVA6CisJCWlmIChwdXRfdXNlcihhcC0+eGFjY21bMF0sICh1MzIgX191c2VyICopYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+eGFjY21bMF0sICh1MzIgX191c2VyICopYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dSQVNZTkNNQVA6CisJCWlmIChwdXRfdXNlcihhcC0+cmFjY20sICh1MzIgX191c2VyICopYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTUkFTWU5DTUFQOgorCQlpZiAoZ2V0X3VzZXIoYXAtPnJhY2NtLCAodTMyIF9fdXNlciAqKWFyZ3ApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFwLT54YWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjY20sIGFyZ3AsIHNpemVvZihhY2NtKSkpCisJCQlicmVhazsKKwkJYWNjbVsyXSAmPSB+MHg0MDAwMDAwMFU7CS8qIGNhbid0IGVzY2FwZSAweDVlICovCisJCWFjY21bM10gfD0gMHg2MDAwMDAwMFU7CQkvKiBtdXN0IGVzY2FwZSAweDdkLCAweDdlICovCisJCW1lbWNweShhcC0+eGFjY20sIGFjY20sIHNpemVvZihhcC0+eGFjY20pKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dNUlU6CisJCWlmIChwdXRfdXNlcihhcC0+bXJ1LCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NNUlU6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWlmICh2YWwgPCBQUFBfTVJVKQorCQkJdmFsID0gUFBQX01SVTsKKwkJYXAtPm1ydSA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhdCBzb2Z0aXJxIGxldmVsIHRvIGRlbGl2ZXIgcmVjZWl2ZWQgcGFja2V0cworICogdG8gdGhlIHBwcF9nZW5lcmljIGNvZGUsIGFuZCB0byB0ZWxsIHRoZSBwcHBfZ2VuZXJpYyBjb2RlCisgKiBpZiB3ZSBjYW4gYWNjZXB0IG1vcmUgb3V0cHV0IG5vdy4KKyAqLworc3RhdGljIHZvaWQgcHBwX2FzeW5jX3Byb2Nlc3ModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IChzdHJ1Y3QgYXN5bmNwcHAgKikgYXJnOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBwcm9jZXNzIHJlY2VpdmVkIHBhY2tldHMgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhcC0+cnF1ZXVlKSkgIT0gTlVMTCkgeworCQlpZiAoc2tiLT5jYlswXSkKKwkJCXBwcF9pbnB1dF9lcnJvcigmYXAtPmNoYW4sIDApOworCQlwcHBfaW5wdXQoJmFwLT5jaGFuLCBza2IpOworCX0KKworCS8qIHRyeSB0byBwdXNoIG1vcmUgc3R1ZmYgb3V0ICovCisJaWYgKHRlc3RfYml0KFhNSVRfV0FLRVVQLCAmYXAtPnhtaXRfZmxhZ3MpICYmIHBwcF9hc3luY19wdXNoKGFwKSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFByb2NlZHVyZXMgZm9yIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcuCisgKi8KKworLyoKKyAqIFByb2NlZHVyZSB0byBlbmNvZGUgdGhlIGRhdGEgZm9yIGFzeW5jIHNlcmlhbCB0cmFuc21pc3Npb24uCisgKiBEb2VzIG9jdGV0IHN0dWZmaW5nIChlc2NhcGluZyksIHB1dHMgdGhlIGFkZHJlc3MvY29udHJvbCBieXRlcworICogb24gaWYgQS9DIGNvbXByZXNzaW9uIGlzIGRpc2FibGVkLCBhbmQgZG9lcyBwcm90b2NvbCBjb21wcmVzc2lvbi4KKyAqIEFzc3VtZXMgYXAtPnRwa3QgIT0gMCBvbiBlbnRyeS4KKyAqIFJldHVybnMgMSBpZiB3ZSBmaW5pc2hlZCB0aGUgY3VycmVudCBmcmFtZSwgMCBvdGhlcndpc2UuCisgKi8KKworI2RlZmluZSBQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCkJZG8gewkJXAorCWlmICgoaXNsY3AgJiYgYyA8IDB4MjApIHx8IChhcC0+eGFjY21bYyA+PiA1XSAmICgxIDw8IChjICYgMHgxZikpKSkge1wKKwkJKmJ1ZisrID0gUFBQX0VTQ0FQRTsJCQlcCisJCSpidWYrKyA9IGMgXiAweDIwOwkJCVwKKwl9IGVsc2UJCQkJCQlcCisJCSpidWYrKyA9IGM7CQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQKK3BwcF9hc3luY19lbmNvZGUoc3RydWN0IGFzeW5jcHBwICphcCkKK3sKKwlpbnQgZmNzLCBpLCBjb3VudCwgYywgcHJvdG87CisJdW5zaWduZWQgY2hhciAqYnVmLCAqYnVmbGltOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGlzbGNwOworCisJYnVmID0gYXAtPm9idWY7CisJYXAtPm9saW0gPSBidWY7CisJYXAtPm9wdHIgPSBidWY7CisJaSA9IGFwLT50cGt0X3BvczsKKwlkYXRhID0gYXAtPnRwa3QtPmRhdGE7CisJY291bnQgPSBhcC0+dHBrdC0+bGVuOworCWZjcyA9IGFwLT50ZmNzOworCXByb3RvID0gKGRhdGFbMF0gPDwgOCkgKyBkYXRhWzFdOworCisJLyoKKwkgKiBMQ1AgcGFja2V0cyB3aXRoIGNvZGUgdmFsdWVzIGJldHdlZW4gMSAoY29uZmlndXJlLXJlcWVzdCkKKwkgKiBhbmQgNyAoY29kZS1yZWplY3QpIG11c3QgYmUgc2VudCBhcyB0aG91Z2ggbm8gb3B0aW9ucworCSAqIGhhZCBiZWVuIG5lZ290aWF0ZWQuCisJICovCisJaXNsY3AgPSBwcm90byA9PSBQUFBfTENQICYmIDEgPD0gZGF0YVsyXSAmJiBkYXRhWzJdIDw9IDc7CisKKwlpZiAoaSA9PSAwKSB7CisJCWlmIChpc2xjcCkKKwkJCWFzeW5jX2xjcF9wZWVrKGFwLCBkYXRhLCBjb3VudCwgMCk7CisKKwkJLyoKKwkJICogU3RhcnQgb2YgYSBuZXcgcGFja2V0IC0gaW5zZXJ0IHRoZSBsZWFkaW5nIEZMQUcKKwkJICogY2hhcmFjdGVyIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCWlmIChpc2xjcCB8fCBmbGFnX3RpbWUgPT0gMAorCQkgICAgfHwgamlmZmllcyAtIGFwLT5sYXN0X3htaXQgPj0gZmxhZ190aW1lKQorCQkJKmJ1ZisrID0gUFBQX0ZMQUc7CisJCWFwLT5sYXN0X3htaXQgPSBqaWZmaWVzOworCQlmY3MgPSBQUFBfSU5JVEZDUzsKKworCQkvKgorCQkgKiBQdXQgaW4gdGhlIGFkZHJlc3MvY29udHJvbCBieXRlcyBpZiBuZWNlc3NhcnkKKwkJICovCisJCWlmICgoYXAtPmZsYWdzICYgU0NfQ09NUF9BQykgPT0gMCB8fCBpc2xjcCkgeworCQkJUFVUX0JZVEUoYXAsIGJ1ZiwgMHhmZiwgaXNsY3ApOworCQkJZmNzID0gUFBQX0ZDUyhmY3MsIDB4ZmYpOworCQkJUFVUX0JZVEUoYXAsIGJ1ZiwgMHgwMywgaXNsY3ApOworCQkJZmNzID0gUFBQX0ZDUyhmY3MsIDB4MDMpOworCQl9CisJfQorCisJLyoKKwkgKiBPbmNlIHdlIHB1dCBpbiB0aGUgbGFzdCBieXRlLCB3ZSBuZWVkIHRvIHB1dCBpbiB0aGUgRkNTCisJICogYW5kIGNsb3NpbmcgZmxhZywgc28gbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IDcgYnl0ZXMKKwkgKiBvZiBmcmVlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAqLworCWJ1ZmxpbSA9IGFwLT5vYnVmICsgT0JVRlNJWkUgLSA2OworCXdoaWxlIChpIDwgY291bnQgJiYgYnVmIDwgYnVmbGltKSB7CisJCWMgPSBkYXRhW2krK107CisJCWlmIChpID09IDEgJiYgYyA9PSAwICYmIChhcC0+ZmxhZ3MgJiBTQ19DT01QX1BST1QpKQorCQkJY29udGludWU7CS8qIGNvbXByZXNzIHByb3RvY29sIGZpZWxkICovCisJCWZjcyA9IFBQUF9GQ1MoZmNzLCBjKTsKKwkJUFVUX0JZVEUoYXAsIGJ1ZiwgYywgaXNsY3ApOworCX0KKworCWlmIChpIDwgY291bnQpIHsKKwkJLyoKKwkJICogUmVtZW1iZXIgd2hlcmUgd2UgYXJlIHVwIHRvIGluIHRoaXMgcGFja2V0LgorCQkgKi8KKwkJYXAtPm9saW0gPSBidWY7CisJCWFwLT50cGt0X3BvcyA9IGk7CisJCWFwLT50ZmNzID0gZmNzOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgZmluaXNoZWQgdGhlIHBhY2tldC4gIEFkZCB0aGUgRkNTIGFuZCBmbGFnLgorCSAqLworCWZjcyA9IH5mY3M7CisJYyA9IGZjcyAmIDB4ZmY7CisJUFVUX0JZVEUoYXAsIGJ1ZiwgYywgaXNsY3ApOworCWMgPSAoZmNzID4+IDgpICYgMHhmZjsKKwlQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCk7CisJKmJ1ZisrID0gUFBQX0ZMQUc7CisJYXAtPm9saW0gPSBidWY7CisKKwlrZnJlZV9za2IoYXAtPnRwa3QpOworCWFwLT50cGt0ID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRyYW5zbWl0LXNpZGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIFNlbmQgYSBwYWNrZXQgdG8gdGhlIHBlZXIgb3ZlciBhbiBhc3luYyB0dHkgbGluZS4KKyAqIFJldHVybnMgMSBpZmYgdGhlIHBhY2tldCB3YXMgYWNjZXB0ZWQuCisgKiBJZiB0aGUgcGFja2V0IHdhcyBub3QgYWNjZXB0ZWQsIHdlIHdpbGwgY2FsbCBwcHBfb3V0cHV0X3dha2V1cAorICogYXQgc29tZSBsYXRlciB0aW1lLgorICovCitzdGF0aWMgaW50CitwcHBfYXN5bmNfc2VuZChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisKKwlwcHBfYXN5bmNfcHVzaChhcCk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncykpCisJCXJldHVybiAwOwkvKiBhbHJlYWR5IGZ1bGwgKi8KKwlhcC0+dHBrdCA9IHNrYjsKKwlhcC0+dHBrdF9wb3MgPSAwOworCisJcHBwX2FzeW5jX3B1c2goYXApOworCXJldHVybiAxOworfQorCisvKgorICogUHVzaCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgb3V0IHRvIHRoZSB0dHkuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9hc3luY19wdXNoKHN0cnVjdCBhc3luY3BwcCAqYXApCit7CisJaW50IGF2YWlsLCBzZW50LCBkb25lID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gYXAtPnR0eTsKKwlpbnQgdHR5X3N0dWZmZWQgPSAwOworCisJLyoKKwkgKiBXZSBjYW4gZ2V0IGNhbGxlZCByZWN1cnNpdmVseSBoZXJlIGlmIHRoZSB0dHkgd3JpdGUKKwkgKiBmdW5jdGlvbiBjYWxscyBvdXIgd2FrZXVwIGZ1bmN0aW9uLiAgVGhpcyBjYW4gaGFwcGVuCisJICogZm9yIGV4YW1wbGUgb24gYSBwdHkgd2l0aCBib3RoIHRoZSBtYXN0ZXIgYW5kIHNsYXZlCisJICogc2V0IHRvIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisJICogV2UgdXNlIHRoZSBYTUlUX0JVU1kgYml0IHRvIGRldGVjdCB0aGlzIGFuZCBnZXQgb3V0LAorCSAqIGxlYXZpbmcgdGhlIFhNSVRfV0FLRVVQIGJpdCBzZXQgdG8gdGVsbCB0aGUgb3RoZXIKKwkgKiBpbnN0YW5jZSB0aGF0IGl0IG1heSBub3cgYmUgYWJsZSB0byB3cml0ZSBtb3JlIG5vdy4KKwkgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChYTUlUX0JVU1ksICZhcC0+eG1pdF9mbGFncykpCisJCXJldHVybiAwOworCXNwaW5fbG9ja19iaCgmYXAtPnhtaXRfbG9jayk7CisJZm9yICg7OykgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFhNSVRfV0FLRVVQLCAmYXAtPnhtaXRfZmxhZ3MpKQorCQkJdHR5X3N0dWZmZWQgPSAwOworCQlpZiAoIXR0eV9zdHVmZmVkICYmIGFwLT5vcHRyIDwgYXAtPm9saW0pIHsKKwkJCWF2YWlsID0gYXAtPm9saW0gLSBhcC0+b3B0cjsKKwkJCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCQkJc2VudCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIGFwLT5vcHRyLCBhdmFpbCk7CisJCQlpZiAoc2VudCA8IDApCisJCQkJZ290byBmbHVzaDsJLyogZXJyb3IsIGUuZy4gbG9zcyBvZiBDRCAqLworCQkJYXAtPm9wdHIgKz0gc2VudDsKKwkJCWlmIChzZW50IDwgYXZhaWwpCisJCQkJdHR5X3N0dWZmZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFwLT5vcHRyID49IGFwLT5vbGltICYmIGFwLT50cGt0ICE9IDApIHsKKwkJCWlmIChwcHBfYXN5bmNfZW5jb2RlKGFwKSkgeworCQkJCS8qIGZpbmlzaGVkIHByb2Nlc3NpbmcgYXAtPnRwa3QgKi8KKwkJCQljbGVhcl9iaXQoWE1JVF9GVUxMLCAmYXAtPnhtaXRfZmxhZ3MpOworCQkJCWRvbmUgPSAxOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogV2UgaGF2ZW4ndCBtYWRlIGFueSBwcm9ncmVzcyB0aGlzIHRpbWUgYXJvdW5kLgorCQkgKiBDbGVhciBYTUlUX0JVU1kgdG8gbGV0IG90aGVyIGNhbGxlcnMgaW4sIGJ1dAorCQkgKiBhZnRlciBkb2luZyBzbyB3ZSBoYXZlIHRvIGNoZWNrIGlmIGFueW9uZSBzZXQKKwkJICogWE1JVF9XQUtFVVAgc2luY2Ugd2UgbGFzdCBjaGVja2VkIGl0LiAgSWYgdGhleQorCQkgKiBkaWQsIHdlIHNob3VsZCB0cnkgYWdhaW4gdG8gc2V0IFhNSVRfQlVTWSBhbmQgZ28KKwkJICogYXJvdW5kIGFnYWluIGluIGNhc2UgWE1JVF9CVVNZIHdhcyBzdGlsbCBzZXQgd2hlbgorCQkgKiB0aGUgb3RoZXIgY2FsbGVyIHRyaWVkLgorCQkgKi8KKwkJY2xlYXJfYml0KFhNSVRfQlVTWSwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJLyogYW55IG1vcmUgd29yayB0byBkbz8gaWYgbm90LCBleGl0IHRoZSBsb29wICovCisJCWlmICghKHRlc3RfYml0KFhNSVRfV0FLRVVQLCAmYXAtPnhtaXRfZmxhZ3MpCisJCSAgICAgIHx8ICghdHR5X3N0dWZmZWQgJiYgYXAtPnRwa3QgIT0gMCkpKQorCQkJYnJlYWs7CisJCS8qIG1vcmUgd29yayB0byBkbywgc2VlIGlmIHdlIGNhbiBkbyBpdCBub3cgKi8KKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoWE1JVF9CVVNZLCAmYXAtPnhtaXRfZmxhZ3MpKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlyZXR1cm4gZG9uZTsKKworZmx1c2g6CisJY2xlYXJfYml0KFhNSVRfQlVTWSwgJmFwLT54bWl0X2ZsYWdzKTsKKwlpZiAoYXAtPnRwa3QgIT0gMCkgeworCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCQlhcC0+dHBrdCA9IE5VTEw7CisJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCWRvbmUgPSAxOworCX0KKwlhcC0+b3B0ciA9IGFwLT5vbGltOworCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlyZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIEZsdXNoIG91dHB1dCBmcm9tIG91ciBpbnRlcm5hbCBidWZmZXJzLgorICogQ2FsbGVkIGZvciB0aGUgVENGTFNIIGlvY3RsLiBDYW4gYmUgZW50ZXJlZCBpbiBwYXJhbGxlbAorICogYnV0IHRoaXMgaXMgY292ZXJlZCBieSB0aGUgeG1pdF9sb2NrLgorICovCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jX2ZsdXNoX291dHB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCWludCBkb25lID0gMDsKKworCXNwaW5fbG9ja19iaCgmYXAtPnhtaXRfbG9jayk7CisJYXAtPm9wdHIgPSBhcC0+b2xpbTsKKwlpZiAoYXAtPnRwa3QgIT0gTlVMTCkgeworCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCQlhcC0+dHBrdCA9IE5VTEw7CisJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCWRvbmUgPSAxOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnhtaXRfbG9jayk7CisJaWYgKGRvbmUpCisJCXBwcF9vdXRwdXRfd2FrZXVwKCZhcC0+Y2hhbik7Cit9CisKKy8qCisgKiBSZWNlaXZlLXNpZGUgcm91dGluZXMuCisgKi8KKworLyogc2VlIGhvdyBtYW55IG9yZGluYXJ5IGNoYXJzIHRoZXJlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYnVmICovCitzdGF0aWMgaW5saW5lIGludAorc2Nhbl9vcmRpbmFyeShzdHJ1Y3QgYXN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgaSwgYzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCWMgPSBidWZbaV07CisJCWlmIChjID09IFBQUF9FU0NBUEUgfHwgYyA9PSBQUFBfRkxBRworCQkgICAgfHwgKGMgPCAweDIwICYmIChhcC0+cmFjY20gJiAoMSA8PCBjKSkgIT0gMCkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qIGNhbGxlZCB3aGVuIGEgZmxhZyBpcyBzZWVuIC0gZG8gZW5kLW9mLXBhY2tldCBwcm9jZXNzaW5nICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19pbnB1dF9wYWNrZXQoc3RydWN0IGFzeW5jcHBwICphcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGxlbiwgZmNzLCBwcm90bzsKKworCXNrYiA9IGFwLT5ycGt0OworCWlmIChhcC0+c3RhdGUgJiAoU0NfVE9TUyB8IFNDX0VTQ0FQRSkpCisJCWdvdG8gZXJyOworCisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CQkvKiAwLWxlbmd0aCBwYWNrZXQgKi8KKworCS8qIGNoZWNrIHRoZSBGQ1MgKi8KKwlwID0gc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gPCAzKQorCQlnb3RvIGVycjsJLyogdG9vIHNob3J0ICovCisJZmNzID0gUFBQX0lOSVRGQ1M7CisJZm9yICg7IGxlbiA+IDA7IC0tbGVuKQorCQlmY3MgPSBQUFBfRkNTKGZjcywgKnArKyk7CisJaWYgKGZjcyAhPSBQUFBfR09PREZDUykKKwkJZ290byBlcnI7CS8qIGJhZCBGQ1MgKi8KKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gMik7CisKKwkvKiBjaGVjayBmb3IgYWRkcmVzcy9jb250cm9sIGFuZCBwcm90b2NvbCBjb21wcmVzc2lvbiAqLworCXAgPSBza2ItPmRhdGE7CisJaWYgKHBbMF0gPT0gUFBQX0FMTFNUQVRJT05TICYmIHBbMV0gPT0gUFBQX1VJKSB7CisJCS8qIGNob3Agb2ZmIGFkZHJlc3MvY29udHJvbCAqLworCQlpZiAoc2tiLT5sZW4gPCAzKQorCQkJZ290byBlcnI7CisJCXAgPSBza2JfcHVsbChza2IsIDIpOworCX0KKwlwcm90byA9IHBbMF07CisJaWYgKHByb3RvICYgMSkgeworCQkvKiBwcm90b2NvbCBpcyBjb21wcmVzc2VkICovCisJCXNrYl9wdXNoKHNrYiwgMSlbMF0gPSAwOworCX0gZWxzZSB7CisJCWlmIChza2ItPmxlbiA8IDIpCisJCQlnb3RvIGVycjsKKwkJcHJvdG8gPSAocHJvdG8gPDwgOCkgKyBwWzFdOworCQlpZiAocHJvdG8gPT0gUFBQX0xDUCkKKwkJCWFzeW5jX2xjcF9wZWVrKGFwLCBwLCBza2ItPmxlbiwgMSk7CisJfQorCisJLyogcXVldWUgdGhlIGZyYW1lIHRvIGJlIHByb2Nlc3NlZCAqLworCXNrYi0+Y2JbMF0gPSBhcC0+c3RhdGU7CisJc2tiX3F1ZXVlX3RhaWwoJmFwLT5ycXVldWUsIHNrYik7CisJYXAtPnJwa3QgPSBOVUxMOworCWFwLT5zdGF0ZSA9IDA7CisJcmV0dXJuOworCisgZXJyOgorCS8qIGZyYW1lIGhhZCBhbiBlcnJvciwgcmVtZW1iZXIgdGhhdCwgcmVzZXQgU0NfVE9TUyAmIFNDX0VTQ0FQRSAqLworCWFwLT5zdGF0ZSA9IFNDX1BSRVZfRVJST1I7CisJaWYgKHNrYikKKwkJc2tiX3RyaW0oc2tiLCAwKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIHR0eSBkcml2ZXIgaGFzIGRhdGEgZm9yIHVzLiBSdW5zIHBhcmFsbGVsIHdpdGggdGhlCisgICBvdGhlciBsZGlzYyBmdW5jdGlvbnMgYnV0IHdpbGwgbm90IGJlIHJlLWVudGVyZWQgKi8KKworc3RhdGljIHZvaWQKK3BwcF9hc3luY19pbnB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCWNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgYywgaSwgaiwgbiwgcywgZjsKKwl1bnNpZ25lZCBjaGFyICpzcDsKKworCS8qIHVwZGF0ZSBiaXRzIHVzZWQgZm9yIDgtYml0IGNsZWFubmVzcyBkZXRlY3Rpb24gKi8KKwlpZiAofmFwLT5yYml0cyAmIFNDX1JDVl9CSVRTKSB7CisJCXMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJYyA9IGJ1ZltpXTsKKwkJCWlmIChmbGFncyAhPSAwICYmIGZsYWdzW2ldICE9IDApCisJCQkJY29udGludWU7CisJCQlzIHw9IChjICYgMHg4MCk/IFNDX1JDVl9CN18xOiBTQ19SQ1ZfQjdfMDsKKwkJCWMgPSAoKGMgPj4gNCkgXiBjKSAmIDB4ZjsKKwkJCXMgfD0gKDB4Njk5NiAmICgxIDw8IGMpKT8gU0NfUkNWX09ERFA6IFNDX1JDVl9FVk5QOworCQl9CisJCWFwLT5yYml0cyB8PSBzOworCX0KKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyogc2NhbiB0aHJvdWdoIGFuZCBzZWUgaG93IG1hbnkgY2hhcnMgd2UgY2FuIGRvIGluIGJ1bGsgKi8KKwkJaWYgKChhcC0+c3RhdGUgJiBTQ19FU0NBUEUpICYmIGJ1ZlswXSA9PSBQUFBfRVNDQVBFKQorCQkJbiA9IDE7CisJCWVsc2UKKwkJCW4gPSBzY2FuX29yZGluYXJ5KGFwLCBidWYsIGNvdW50KTsKKworCQlmID0gMDsKKwkJaWYgKGZsYWdzICE9IDAgJiYgKGFwLT5zdGF0ZSAmIFNDX1RPU1MpID09IDApIHsKKwkJCS8qIGNoZWNrIHRoZSBmbGFncyB0byBzZWUgaWYgYW55IGNoYXIgaGFkIGFuIGVycm9yICovCisJCQlmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorCQkJCWlmICgoZiA9IGZsYWdzW2pdKSAhPSAwKQorCQkJCQlicmVhazsKKwkJfQorCQlpZiAoZiAhPSAwKSB7CisJCQkvKiBzdGFydCB0b3NzaW5nICovCisJCQlhcC0+c3RhdGUgfD0gU0NfVE9TUzsKKworCQl9IGVsc2UgaWYgKG4gPiAwICYmIChhcC0+c3RhdGUgJiBTQ19UT1NTKSA9PSAwKSB7CisJCQkvKiBzdHVmZiB0aGUgY2hhcnMgaW4gdGhlIHNrYiAqLworCQkJc2tiID0gYXAtPnJwa3Q7CisJCQlpZiAoc2tiID09IDApIHsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGFwLT5tcnUgKyBQUFBfSERSTEVOICsgMik7CisJCQkJaWYgKHNrYiA9PSAwKQorCQkJCQlnb3RvIG5vbWVtOworCQkJCS8qIFRyeSB0byBnZXQgdGhlIHBheWxvYWQgNC1ieXRlIGFsaWduZWQgKi8KKwkJCQlpZiAoYnVmWzBdICE9IFBQUF9BTExTVEFUSU9OUykKKwkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyICsgKGJ1ZlswXSAmIDEpKTsKKwkJCQlhcC0+cnBrdCA9IHNrYjsKKwkJCX0KKwkJCWlmIChuID4gc2tiX3RhaWxyb29tKHNrYikpIHsKKwkJCQkvKiBwYWNrZXQgb3ZlcmZsb3dlZCBNUlUgKi8KKwkJCQlhcC0+c3RhdGUgfD0gU0NfVE9TUzsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBza2JfcHV0KHNrYiwgbik7CisJCQkJbWVtY3B5KHNwLCBidWYsIG4pOworCQkJCWlmIChhcC0+c3RhdGUgJiBTQ19FU0NBUEUpIHsKKwkJCQkJc3BbMF0gXj0gMHgyMDsKKwkJCQkJYXAtPnN0YXRlICY9IH5TQ19FU0NBUEU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG4gPj0gY291bnQpCisJCQlicmVhazsKKworCQljID0gYnVmW25dOworCQlpZiAoZmxhZ3MgIT0gTlVMTCAmJiBmbGFnc1tuXSAhPSAwKSB7CisJCQlhcC0+c3RhdGUgfD0gU0NfVE9TUzsKKwkJfSBlbHNlIGlmIChjID09IFBQUF9GTEFHKSB7CisJCQlwcm9jZXNzX2lucHV0X3BhY2tldChhcCk7CisJCX0gZWxzZSBpZiAoYyA9PSBQUFBfRVNDQVBFKSB7CisJCQlhcC0+c3RhdGUgfD0gU0NfRVNDQVBFOworCQl9IGVsc2UgaWYgKElfSVhPTihhcC0+dHR5KSkgeworCQkJaWYgKGMgPT0gU1RBUlRfQ0hBUihhcC0+dHR5KSkKKwkJCQlzdGFydF90dHkoYXAtPnR0eSk7CisJCQllbHNlIGlmIChjID09IFNUT1BfQ0hBUihhcC0+dHR5KSkKKwkJCQlzdG9wX3R0eShhcC0+dHR5KTsKKwkJfQorCQkvKiBvdGhlcndpc2UgaXQncyBhIGNoYXIgaW4gdGhlIHJlY3YgQUNDTSAqLworCQkrK247CisKKwkJYnVmICs9IG47CisJCWlmIChmbGFncyAhPSAwKQorCQkJZmxhZ3MgKz0gbjsKKwkJY291bnQgLT0gbjsKKwl9CisJcmV0dXJuOworCisgbm9tZW06CisJcHJpbnRrKEtFUk5fRVJSICJQUFBhc3luYzogbm8gbWVtb3J5IChpbnB1dCBwa3QpXG4iKTsKKwlhcC0+c3RhdGUgfD0gU0NfVE9TUzsKK30KKworLyoKKyAqIFdlIGxvb2sgYXQgTENQIGZyYW1lcyBnb2luZyBwYXN0IHNvIHRoYXQgd2UgY2FuIG5vdGljZQorICogYW5kIHJlYWN0IHRvIHRoZSBMQ1AgY29uZmlndXJlLWFjayBmcm9tIHRoZSBwZWVyLgorICogSW4gdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgcGVlciBoYXMgYmVlbiBzZW50IGEgY29uZmlndXJlLWFjaworICogYWxyZWFkeSwgTENQIGlzIHVwIG9uY2UgaXQgaGFzIHNlbnQgaXRzIGNvbmZpZ3VyZS1hY2sKKyAqIHNvIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgcGFja2V0IGNhbiBiZSBzZW50IHdpdGggdGhlCisgKiBjb25maWd1cmVkIExDUCBvcHRpb25zLiAgVGhpcyBhbGxvd3MgdXMgdG8gcHJvY2VzcyB0aGUgZm9sbG93aW5nCisgKiBwYWNrZXQgY29ycmVjdGx5IHdpdGhvdXQgcHBwZCBuZWVkaW5nIHRvIHJlc3BvbmQgcXVpY2tseS4KKyAqCisgKiBXZSBvbmx5IHJlc3BvbmQgdG8gdGhlIHJlY2VpdmVkIGNvbmZpZ3VyZS1hY2sgaWYgd2UgaGF2ZSBqdXN0CisgKiBzZW50IGEgY29uZmlndXJlLXJlcXVlc3QsIGFuZCB0aGUgY29uZmlndXJlLWFjayBjb250YWlucyB0aGUKKyAqIHNhbWUgZGF0YSAodGhpcyBpcyBjaGVja2VkIHVzaW5nIGEgMTYtYml0IGNyYyBvZiB0aGUgZGF0YSkuCisgKi8KKyNkZWZpbmUgQ09ORlJFUQkJMQkvKiBMQ1AgY29kZSBmaWVsZCB2YWx1ZXMgKi8KKyNkZWZpbmUgQ09ORkFDSwkJMgorI2RlZmluZSBMQ1BfTVJVCQkxCS8qIExDUCBvcHRpb24gbnVtYmVycyAqLworI2RlZmluZSBMQ1BfQVNZTkNNQVAJMgorCitzdGF0aWMgdm9pZCBhc3luY19sY3BfcGVlayhzdHJ1Y3QgYXN5bmNwcHAgKmFwLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgaW50IGxlbiwgaW50IGluYm91bmQpCit7CisJaW50IGRsZW4sIGZjcywgaSwgY29kZTsKKwl1MzIgdmFsOworCisJZGF0YSArPSAyOwkJLyogc2tpcCBwcm90b2NvbCBieXRlcyAqLworCWxlbiAtPSAyOworCWlmIChsZW4gPCA0KQkJLyogNCA9IGNvZGUsIElELCBsZW5ndGggKi8KKwkJcmV0dXJuOworCWNvZGUgPSBkYXRhWzBdOworCWlmIChjb2RlICE9IENPTkZBQ0sgJiYgY29kZSAhPSBDT05GUkVRKQorCQlyZXR1cm47CisJZGxlbiA9IChkYXRhWzJdIDw8IDgpICsgZGF0YVszXTsKKwlpZiAobGVuIDwgZGxlbikKKwkJcmV0dXJuOwkJLyogcGFja2V0IGdvdCB0cnVuY2F0ZWQgb3IgbGVuZ3RoIGlzIGJvZ3VzICovCisKKwlpZiAoY29kZSA9PSAoaW5ib3VuZD8gQ09ORkFDSzogQ09ORlJFUSkpIHsKKwkJLyoKKwkJICogc2VudCBjb25mcmVxIG9yIHJlY2VpdmVkIGNvbmZhY2s6CisJCSAqIGNhbGN1bGF0ZSB0aGUgY3JjIG9mIHRoZSBkYXRhIGZyb20gdGhlIElEIGZpZWxkIG9uLgorCQkgKi8KKwkJZmNzID0gUFBQX0lOSVRGQ1M7CisJCWZvciAoaSA9IDE7IGkgPCBkbGVuOyArK2kpCisJCQlmY3MgPSBQUFBfRkNTKGZjcywgZGF0YVtpXSk7CisKKwkJaWYgKCFpbmJvdW5kKSB7CisJCQkvKiBvdXRib3VuZCBjb25mcmVxIC0gcmVtZW1iZXIgdGhlIGNyYyBmb3IgbGF0ZXIgKi8KKwkJCWFwLT5sY3BfZmNzID0gZmNzOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogcmVjZWl2ZWQgY29uZmFjaywgY2hlY2sgdGhlIGNyYyAqLworCQlmY3MgXj0gYXAtPmxjcF9mY3M7CisJCWFwLT5sY3BfZmNzID0gLTE7CisJCWlmIChmY3MgIT0gMCkKKwkJCXJldHVybjsKKwl9IGVsc2UgaWYgKGluYm91bmQpCisJCXJldHVybjsJLyogbm90IGludGVyZXN0ZWQgaW4gcmVjZWl2ZWQgY29uZnJlcSAqLworCisJLyogcHJvY2VzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY29uZmFjayAqLworCWRhdGEgKz0gNDsKKwlkbGVuIC09IDQ7CisJLyogZGF0YVswXSBpcyBjb2RlLCBkYXRhWzFdIGlzIGxlbmd0aCAqLworCXdoaWxlIChkbGVuID49IDIgJiYgZGxlbiA+PSBkYXRhWzFdICYmIGRhdGFbMV0gPj0gMikgeworCQlzd2l0Y2ggKGRhdGFbMF0pIHsKKwkJY2FzZSBMQ1BfTVJVOgorCQkJdmFsID0gKGRhdGFbMl0gPDwgOCkgKyBkYXRhWzNdOworCQkJaWYgKGluYm91bmQpCisJCQkJYXAtPm1ydSA9IHZhbDsKKwkJCWVsc2UKKwkJCQlhcC0+Y2hhbi5tdHUgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBMQ1BfQVNZTkNNQVA6CisJCQl2YWwgPSAoZGF0YVsyXSA8PCAyNCkgKyAoZGF0YVszXSA8PCAxNikKKwkJCQkrIChkYXRhWzRdIDw8IDgpICsgZGF0YVs1XTsKKwkJCWlmIChpbmJvdW5kKQorCQkJCWFwLT5yYWNjbSA9IHZhbDsKKwkJCWVsc2UKKwkJCQlhcC0+eGFjY21bMF0gPSB2YWw7CisJCQlicmVhazsKKwkJfQorCQlkbGVuIC09IGRhdGFbMV07CisJCWRhdGEgKz0gZGF0YVsxXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcHBfYXN5bmNfY2xlYW51cCh2b2lkKQoreworCWlmICh0dHlfcmVnaXN0ZXJfbGRpc2MoTl9QUFAsIE5VTEwpICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHVucmVnaXN0ZXIgUFBQIGxpbmUgZGlzY2lwbGluZVxuIik7Cit9CisKK21vZHVsZV9pbml0KHBwcF9hc3luY19pbml0KTsKK21vZHVsZV9leGl0KHBwcF9hc3luY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMgYi9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2Q2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCkBAIC0wLDAgKzEsNjU5IEBACisvKgorICogID09RklMRVZFUlNJT04gOTgwMzE5PT0KKyAqCisgKiBwcHBfZGVmbGF0ZS5jIC0gaW50ZXJmYWNlIHRoZSB6bGliIHByb2NlZHVyZXMgZm9yIERlZmxhdGUgY29tcHJlc3Npb24KKyAqIGFuZCBkZWNvbXByZXNzaW9uIChhcyB1c2VkIGJ5IGd6aXApIHRvIHRoZSBQUFAgY29kZS4KKyAqIFRoaXMgdmVyc2lvbiBpcyBmb3IgdXNlIHdpdGggTGludXgga2VybmVsIDEuMy5YLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5LCBleHByZXNzIG9yIGltcGxpZWQuIFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkKKyAqIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgQkUgTElBQkxFIFRPIEFOWQorICogUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVMgTk8KKyAqIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLAorICogT1IgTU9ESUZJQ0FUSU9OUy4KKyAqCisgKiBGcm9tOiBkZWZsYXRlLmMsdiAxLjEgMTk5Ni8wMS8xOCAwMzoxNzo0OCBwYXVsdXMgRXhwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHAtY29tcC5oPgorCisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisvKgorICogU3RhdGUgZm9yIGEgRGVmbGF0ZSAoZGUpY29tcHJlc3Nvci4KKyAqLworc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlIHsKKyAgICBpbnQJCXNlcW5vOworICAgIGludAkJd19zaXplOworICAgIGludAkJdW5pdDsKKyAgICBpbnQJCW1ydTsKKyAgICBpbnQJCWRlYnVnOworICAgIHpfc3RyZWFtCXN0cm07CisgICAgc3RydWN0IGNvbXBzdGF0IHN0YXRzOworfTsKKworI2RlZmluZSBERUZMQVRFX09WSEQJMgkJLyogRGVmbGF0ZSBvdmVyaGVhZC9wYWNrZXQgKi8KKworc3RhdGljIHZvaWQJKnpfY29tcF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CitzdGF0aWMgdm9pZAkqel9kZWNvbXBfYWxsb2ModW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pOworc3RhdGljIHZvaWQJel9jb21wX2ZyZWUodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJel9kZWNvbXBfZnJlZSh2b2lkICpzdGF0ZSk7CitzdGF0aWMgaW50CXpfY29tcF9pbml0KHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJCSBpbnQgb3B0X2xlbiwKKwkJCQkgaW50IHVuaXQsIGludCBoZHJsZW4sIGludCBkZWJ1Zyk7CitzdGF0aWMgaW50CXpfZGVjb21wX2luaXQodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsCisJCQkJICAgaW50IG9wdF9sZW4sCisJCQkJICAgaW50IHVuaXQsIGludCBoZHJsZW4sIGludCBtcnUsIGludCBkZWJ1Zyk7CitzdGF0aWMgaW50CXpfY29tcHJlc3Modm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKnJwdHIsCisJCQkJdW5zaWduZWQgY2hhciAqb2J1ZiwKKwkJCQlpbnQgaXNpemUsIGludCBvc2l6ZSk7CitzdGF0aWMgdm9pZAl6X2luY29tcCh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGljbnQpOworc3RhdGljIGludAl6X2RlY29tcHJlc3Modm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmlidWYsCisJCQkJaW50IGlzaXplLCB1bnNpZ25lZCBjaGFyICpvYnVmLCBpbnQgb3NpemUpOworc3RhdGljIHZvaWQJel9jb21wX3Jlc2V0KHZvaWQgKnN0YXRlKTsKK3N0YXRpYyB2b2lkCXpfZGVjb21wX3Jlc2V0KHZvaWQgKnN0YXRlKTsKK3N0YXRpYyB2b2lkCXpfY29tcF9zdGF0cyh2b2lkICpzdGF0ZSwgc3RydWN0IGNvbXBzdGF0ICpzdGF0cyk7CisKKy8qKgorICoJel9jb21wX2ZyZWUgLSBmcmVlIHRoZSBtZW1vcnkgdXNlZCBieSBhIGNvbXByZXNzb3IKKyAqCUBhcmc6CXBvaW50ZXIgdG8gdGhlIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBjb21wcmVzc29yLgorICovCitzdGF0aWMgdm9pZCB6X2NvbXBfZnJlZSh2b2lkICphcmcpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJaWYgKHN0YXRlKSB7CisJCXpsaWJfZGVmbGF0ZUVuZCgmc3RhdGUtPnN0cm0pOworCQlpZiAoc3RhdGUtPnN0cm0ud29ya3NwYWNlKQorCQkJdmZyZWUoc3RhdGUtPnN0cm0ud29ya3NwYWNlKTsKKwkJa2ZyZWUoc3RhdGUpOworCX0KK30KKworLyoqCisgKgl6X2NvbXBfYWxsb2MgLSBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb21wcmVzc29yLgorICoJQG9wdGlvbnM6IHBvaW50ZXIgdG8gQ0NQIG9wdGlvbiBkYXRhCisgKglAb3B0X2xlbjogbGVuZ3RoIG9mIHRoZSBDQ1Agb3B0aW9uIGF0IEBvcHRpb25zLgorICoKKyAqCVRoZSBAb3B0aW9ucyBwb2ludGVyIHBvaW50cyB0byB0aGUgYSBidWZmZXIgY29udGFpbmluZyB0aGUKKyAqCUNDUCBvcHRpb24gZGF0YSBmb3IgdGhlIGNvbXByZXNzaW9uIGJlaW5nIG5lZ290aWF0ZWQuICBJdCBpcworICoJZm9ybWF0dGVkIGFjY29yZGluZyB0byBSRkMxOTc5LCBhbmQgZGVzY3JpYmVzIHRoZSB3aW5kb3cKKyAqCXNpemUgdGhhdCB0aGUgcGVlciBpcyByZXF1ZXN0aW5nIHRoYXQgd2UgdXNlIGluIGNvbXByZXNzaW5nCisgKglkYXRhIHRvIGJlIHNlbnQgdG8gaXQuCisgKgorICoJUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IsCisgKglvciBOVUxMIGlmIHdlIGNvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCAqel9jb21wX2FsbG9jKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGU7CisJaW50IHdfc2l6ZTsKKworCWlmIChvcHRfbGVuICE9IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgKG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURSAmJiBvcHRpb25zWzBdICE9IENJX0RFRkxBVEVfRFJBRlQpCisJICAgIHx8IG9wdGlvbnNbMV0gIT0gQ0lMRU5fREVGTEFURQorCSAgICB8fCBERUZMQVRFX01FVEhPRChvcHRpb25zWzJdKSAhPSBERUZMQVRFX01FVEhPRF9WQUwKKwkgICAgfHwgb3B0aW9uc1szXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRSkKKwkJcmV0dXJuIE5VTEw7CisJd19zaXplID0gREVGTEFURV9TSVpFKG9wdGlvbnNbMl0pOworCWlmICh3X3NpemUgPCBERUZMQVRFX01JTl9TSVpFIHx8IHdfc2l6ZSA+IERFRkxBVEVfTUFYX1NJWkUpCisJCXJldHVybiBOVUxMOworCisJc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksCisJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldCAoc3RhdGUsIDAsIHNpemVvZiAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlKSk7CisJc3RhdGUtPnN0cm0ubmV4dF9pbiAgID0gTlVMTDsKKwlzdGF0ZS0+d19zaXplICAgICAgICAgPSB3X3NpemU7CisJc3RhdGUtPnN0cm0ud29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2RlZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKKwlpZiAoc3RhdGUtPnN0cm0ud29ya3NwYWNlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoemxpYl9kZWZsYXRlSW5pdDIoJnN0YXRlLT5zdHJtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sCisJCQkgREVGTEFURV9NRVRIT0RfVkFMLCAtd19zaXplLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpCisJICAgICE9IFpfT0spCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0dXJuICh2b2lkICopIHN0YXRlOworCitvdXRfZnJlZToKKwl6X2NvbXBfZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJel9jb21wX2luaXQgLSBpbml0aWFsaXplIGEgcHJldmlvdXNseS1hbGxvY2F0ZWQgY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gdGhlIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBjb21wcmVzc29yCisgKglAb3B0aW9uczogcG9pbnRlciB0byB0aGUgQ0NQIG9wdGlvbiBkYXRhIGRlc2NyaWJpbmcgdGhlCisgKgkJY29tcHJlc3Npb24gdGhhdCB3YXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBwZWVyCisgKglAb3B0X2xlbjogbGVuZ3RoIG9mIHRoZSBDQ1Agb3B0aW9uIGRhdGEgYXQgQG9wdGlvbnMKKyAqCUB1bml0OglQUFAgdW5pdCBudW1iZXIgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMKKyAqCUBoZHJsZW46IGlnbm9yZWQgKHByZXNlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KQorICoJQGRlYnVnOglkZWJ1ZyBmbGFnOyBpZiBub24temVybywgZGVidWcgbWVzc2FnZXMgYXJlIHByaW50ZWQuCisgKgorICoJVGhlIENDUCBvcHRpb25zIGRlc2NyaWJlZCBieSBAb3B0aW9ucyBtdXN0IG1hdGNoIHRoZSBvcHRpb25zCisgKglzcGVjaWZpZWQgd2hlbiB0aGUgY29tcHJlc3NvciB3YXMgYWxsb2NhdGVkLiAgVGhlIGNvbXByZXNzb3IKKyAqCWhpc3RvcnkgaXMgcmVzZXQuICBSZXR1cm5zIDAgZm9yIGZhaWx1cmUgKENDUCBvcHRpb25zIGRvbid0CisgKgltYXRjaCkgb3IgMSBmb3Igc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCB6X2NvbXBfaW5pdCh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLAorCQkgICAgICAgaW50IHVuaXQsIGludCBoZHJsZW4sIGludCBkZWJ1ZykKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisKKwlpZiAob3B0X2xlbiA8IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgKG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURSAmJiBvcHRpb25zWzBdICE9IENJX0RFRkxBVEVfRFJBRlQpCisJICAgIHx8IG9wdGlvbnNbMV0gIT0gQ0lMRU5fREVGTEFURQorCSAgICB8fCBERUZMQVRFX01FVEhPRChvcHRpb25zWzJdKSAhPSBERUZMQVRFX01FVEhPRF9WQUwKKwkgICAgfHwgREVGTEFURV9TSVpFKG9wdGlvbnNbMl0pICE9IHN0YXRlLT53X3NpemUKKwkgICAgfHwgb3B0aW9uc1szXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRSkKKwkJcmV0dXJuIDA7CisKKwlzdGF0ZS0+c2Vxbm8gPSAwOworCXN0YXRlLT51bml0ICA9IHVuaXQ7CisJc3RhdGUtPmRlYnVnID0gZGVidWc7CisKKwl6bGliX2RlZmxhdGVSZXNldCgmc3RhdGUtPnN0cm0pOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJel9jb21wX3Jlc2V0IC0gcmVzZXQgYSBwcmV2aW91c2x5LWFsbG9jYXRlZCBjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHN0YXRlIGZvciB0aGUgY29tcHJlc3Nvci4KKyAqCisgKglUaGlzIGNsZWFycyB0aGUgaGlzdG9yeSBmb3IgdGhlIGNvbXByZXNzb3IgYW5kIG1ha2VzIGl0CisgKglyZWFkeSB0byBzdGFydCBlbWl0dGluZyBhIG5ldyBjb21wcmVzc2VkIHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgel9jb21wX3Jlc2V0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisKKwlzdGF0ZS0+c2Vxbm8gPSAwOworCXpsaWJfZGVmbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7Cit9CisKKy8qKgorICoJel9jb21wcmVzcyAtIGNvbXByZXNzIGEgUFBQIHBhY2tldCB3aXRoIERlZmxhdGUgY29tcHJlc3Npb24uCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBjb21wcmVzc29yCisgKglAcnB0cjoJdW5jb21wcmVzc2VkIHBhY2tldCAoaW5wdXQpCisgKglAb2J1ZjoJY29tcHJlc3NlZCBwYWNrZXQgKG91dHB1dCkKKyAqCUBpc2l6ZToJc2l6ZSBvZiB1bmNvbXByZXNzZWQgcGFja2V0CisgKglAb3NpemU6CXNwYWNlIGF2YWlsYWJsZSBhdCBAb2J1ZgorICoKKyAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBwYWNrZXQsIG9yIDAgaWYgdGhlCisgKglwYWNrZXQgaXMgaW5jb21wcmVzc2libGUuCisgKi8KK2ludCB6X2NvbXByZXNzKHZvaWQgKmFyZywgdW5zaWduZWQgY2hhciAqcnB0ciwgdW5zaWduZWQgY2hhciAqb2J1ZiwKKwkgICAgICAgaW50IGlzaXplLCBpbnQgb3NpemUpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCWludCByLCBwcm90bywgb2ZmLCBvbGVuLCBvYXZhaWw7CisJdW5zaWduZWQgY2hhciAqd3B0cjsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcHJvdG9jb2wgaXMgaW4gdGhlIHJhbmdlIHdlIGhhbmRsZS4KKwkgKi8KKwlwcm90byA9IFBQUF9QUk9UT0NPTChycHRyKTsKKwlpZiAocHJvdG8gPiAweDNmZmYgfHwgcHJvdG8gPT0gMHhmZCB8fCBwcm90byA9PSAweGZiKQorCQlyZXR1cm4gMDsKKworCS8qIERvbid0IGdlbmVyYXRlIGNvbXByZXNzZWQgcGFja2V0cyB3aGljaCBhcmUgbGFyZ2VyIHRoYW4KKwkgICB0aGUgdW5jb21wcmVzc2VkIHBhY2tldC4gKi8KKwlpZiAob3NpemUgPiBpc2l6ZSkKKwkJb3NpemUgPSBpc2l6ZTsKKworCXdwdHIgPSBvYnVmOworCisJLyoKKwkgKiBDb3B5IG92ZXIgdGhlIFBQUCBoZWFkZXIgYW5kIHN0b3JlIHRoZSAyLWJ5dGUgc2VxdWVuY2UgbnVtYmVyLgorCSAqLworCXdwdHJbMF0gPSBQUFBfQUREUkVTUyhycHRyKTsKKwl3cHRyWzFdID0gUFBQX0NPTlRST0wocnB0cik7CisJd3B0clsyXSA9IFBQUF9DT01QID4+IDg7CisJd3B0clszXSA9IFBQUF9DT01QOworCXdwdHIgKz0gUFBQX0hEUkxFTjsKKwl3cHRyWzBdID0gc3RhdGUtPnNlcW5vID4+IDg7CisJd3B0clsxXSA9IHN0YXRlLT5zZXFubzsKKwl3cHRyICs9IERFRkxBVEVfT1ZIRDsKKwlvbGVuID0gUFBQX0hEUkxFTiArIERFRkxBVEVfT1ZIRDsKKwlzdGF0ZS0+c3RybS5uZXh0X291dCA9IHdwdHI7CisJc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID0gb2F2YWlsID0gb3NpemUgLSBvbGVuOworCSsrc3RhdGUtPnNlcW5vOworCisJb2ZmID0gKHByb3RvID4gMHhmZikgPyAyIDogMzsJLyogc2tpcCAxc3QgcHJvdG8gYnl0ZSBpZiAwICovCisJcnB0ciArPSBvZmY7CisJc3RhdGUtPnN0cm0ubmV4dF9pbiA9IHJwdHI7CisJc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAoaXNpemUgLSBvZmYpOworCisJZm9yICg7OykgeworCQlyID0gemxpYl9kZWZsYXRlKCZzdGF0ZS0+c3RybSwgWl9QQUNLRVRfRkxVU0gpOworCQlpZiAociAhPSBaX09LKSB7CisJCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiel9jb21wcmVzczogZGVmbGF0ZSByZXR1cm5lZCAlZFxuIiwgcik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID09IDApIHsKKwkJCW9sZW4gKz0gb2F2YWlsOworCQkJc3RhdGUtPnN0cm0ubmV4dF9vdXQgPSBOVUxMOworCQkJc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID0gb2F2YWlsID0gMTAwMDAwMDsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOwkJLyogYWxsIGRvbmUgKi8KKwkJfQorCX0KKwlvbGVuICs9IG9hdmFpbCAtIHN0YXRlLT5zdHJtLmF2YWlsX291dDsKKworCS8qCisJICogU2VlIGlmIHdlIG1hbmFnZWQgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBwYWNrZXQuCisJICovCisJaWYgKG9sZW4gPCBpc2l6ZSkgeworCQlzdGF0ZS0+c3RhdHMuY29tcF9ieXRlcyArPSBvbGVuOworCQlzdGF0ZS0+c3RhdHMuY29tcF9wYWNrZXRzKys7CisJfSBlbHNlIHsKKwkJc3RhdGUtPnN0YXRzLmluY19ieXRlcyArPSBpc2l6ZTsKKwkJc3RhdGUtPnN0YXRzLmluY19wYWNrZXRzKys7CisJCW9sZW4gPSAwOworCX0KKwlzdGF0ZS0+c3RhdHMudW5jX2J5dGVzICs9IGlzaXplOworCXN0YXRlLT5zdGF0cy51bmNfcGFja2V0cysrOworCisJcmV0dXJuIG9sZW47Cit9CisKKy8qKgorICoJel9jb21wX3N0YXRzIC0gcmV0dXJuIGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgZm9yIGEgY29tcHJlc3NvcgorICoJCW9yIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzcGFjZSBmb3IgdGhlIChkZSljb21wcmVzc29yCisgKglAc3RhdHM6CXBvaW50ZXIgdG8gYSBzdHJ1Y3QgY29tcHN0YXQgdG8gcmVjZWl2ZSB0aGUgcmVzdWx0LgorICovCitzdGF0aWMgdm9pZCB6X2NvbXBfc3RhdHModm9pZCAqYXJnLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCSpzdGF0cyA9IHN0YXRlLT5zdGF0czsKK30KKworLyoqCisgKgl6X2RlY29tcF9mcmVlIC0gRnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgYSBkZWNvbXByZXNzb3IuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3BhY2UgZm9yIHRoZSBkZWNvbXByZXNzb3IuCisgKi8KK3N0YXRpYyB2b2lkIHpfZGVjb21wX2ZyZWUodm9pZCAqYXJnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCWlmIChzdGF0ZSkgeworCQl6bGliX2luZmxhdGVFbmQoJnN0YXRlLT5zdHJtKTsKKwkJaWYgKHN0YXRlLT5zdHJtLndvcmtzcGFjZSkKKwkJCWtmcmVlKHN0YXRlLT5zdHJtLndvcmtzcGFjZSk7CisJCWtmcmVlKHN0YXRlKTsKKwl9Cit9CisKKy8qKgorICoJel9kZWNvbXBfYWxsb2MgLSBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkZWNvbXByZXNzb3IuCisgKglAb3B0aW9uczogcG9pbnRlciB0byBDQ1Agb3B0aW9uIGRhdGEKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gYXQgQG9wdGlvbnMuCisgKgorICoJVGhlIEBvcHRpb25zIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBhIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICoJQ0NQIG9wdGlvbiBkYXRhIGZvciB0aGUgY29tcHJlc3Npb24gYmVpbmcgbmVnb3RpYXRlZC4gIEl0IGlzCisgKglmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIFJGQzE5NzksIGFuZCBkZXNjcmliZXMgdGhlIHdpbmRvdworICoJc2l6ZSB0aGF0IHdlIGFyZSByZXF1ZXN0aW5nIHRoZSBwZWVyIHRvIHVzZSBpbiBjb21wcmVzc2luZworICoJZGF0YSB0byBiZSBzZW50IHRvIHVzLgorICoKKyAqCVJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IsCisgKglvciBOVUxMIGlmIHdlIGNvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCAqel9kZWNvbXBfYWxsb2ModW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZTsKKwlpbnQgd19zaXplOworCisJaWYgKG9wdF9sZW4gIT0gQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gTlVMTDsKKwl3X3NpemUgPSBERUZMQVRFX1NJWkUob3B0aW9uc1syXSk7CisJaWYgKHdfc2l6ZSA8IERFRkxBVEVfTUlOX1NJWkUgfHwgd19zaXplID4gREVGTEFURV9NQVhfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0IChzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUpKTsKKwlzdGF0ZS0+d19zaXplICAgICAgICAgPSB3X3NpemU7CisJc3RhdGUtPnN0cm0ubmV4dF9vdXQgID0gTlVMTDsKKwlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksCisJCQkJCUdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlpZiAoc3RhdGUtPnN0cm0ud29ya3NwYWNlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoemxpYl9pbmZsYXRlSW5pdDIoJnN0YXRlLT5zdHJtLCAtd19zaXplKSAhPSBaX09LKQorCQlnb3RvIG91dF9mcmVlOworCXJldHVybiAodm9pZCAqKSBzdGF0ZTsKKworb3V0X2ZyZWU6CisJel9kZWNvbXBfZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJel9kZWNvbXBfaW5pdCAtIGluaXRpYWxpemUgYSBwcmV2aW91c2x5LWFsbG9jYXRlZCBkZWNvbXByZXNzb3IuCisgKglAYXJnOglwb2ludGVyIHRvIHRoZSBwcml2YXRlIHN0YXRlIGZvciB0aGUgZGVjb21wcmVzc29yCisgKglAb3B0aW9uczogcG9pbnRlciB0byB0aGUgQ0NQIG9wdGlvbiBkYXRhIGRlc2NyaWJpbmcgdGhlCisgKgkJY29tcHJlc3Npb24gdGhhdCB3YXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBwZWVyCisgKglAb3B0X2xlbjogbGVuZ3RoIG9mIHRoZSBDQ1Agb3B0aW9uIGRhdGEgYXQgQG9wdGlvbnMKKyAqCUB1bml0OglQUFAgdW5pdCBudW1iZXIgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMKKyAqCUBoZHJsZW46IGlnbm9yZWQgKHByZXNlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KQorICoJQG1ydToJbWF4aW11bSBsZW5ndGggb2YgZGVjb21wcmVzc2VkIHBhY2tldHMKKyAqCUBkZWJ1ZzoJZGVidWcgZmxhZzsgaWYgbm9uLXplcm8sIGRlYnVnIG1lc3NhZ2VzIGFyZSBwcmludGVkLgorICoKKyAqCVRoZSBDQ1Agb3B0aW9ucyBkZXNjcmliZWQgYnkgQG9wdGlvbnMgbXVzdCBtYXRjaCB0aGUgb3B0aW9ucworICoJc3BlY2lmaWVkIHdoZW4gdGhlIGRlY29tcHJlc3NvciB3YXMgYWxsb2NhdGVkLiAgVGhlIGRlY29tcHJlc3NvcgorICoJaGlzdG9yeSBpcyByZXNldC4gIFJldHVybnMgMCBmb3IgZmFpbHVyZSAoQ0NQIG9wdGlvbnMgZG9uJ3QKKyAqCW1hdGNoKSBvciAxIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHpfZGVjb21wX2luaXQodm9pZCAqYXJnLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbiwKKwkJCSBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IG1ydSwgaW50IGRlYnVnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCWlmIChvcHRfbGVuIDwgQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBERUZMQVRFX1NJWkUob3B0aW9uc1syXSkgIT0gc3RhdGUtPndfc2l6ZQorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gMDsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJc3RhdGUtPnVuaXQgID0gdW5pdDsKKwlzdGF0ZS0+ZGVidWcgPSBkZWJ1ZzsKKwlzdGF0ZS0+bXJ1ICAgPSBtcnU7CisKKwl6bGliX2luZmxhdGVSZXNldCgmc3RhdGUtPnN0cm0pOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJel9kZWNvbXBfcmVzZXQgLSByZXNldCBhIHByZXZpb3VzbHktYWxsb2NhdGVkIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3Nvci4KKyAqCisgKglUaGlzIGNsZWFycyB0aGUgaGlzdG9yeSBmb3IgdGhlIGRlY29tcHJlc3NvciBhbmQgbWFrZXMgaXQKKyAqCXJlYWR5IHRvIHJlY2VpdmUgYSBuZXcgY29tcHJlc3NlZCBzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIHpfZGVjb21wX3Jlc2V0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisKKwlzdGF0ZS0+c2Vxbm8gPSAwOworCXpsaWJfaW5mbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7Cit9CisKKy8qKgorICoJel9kZWNvbXByZXNzIC0gZGVjb21wcmVzcyBhIERlZmxhdGUtY29tcHJlc3NlZCBwYWNrZXQuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IKKyAqCUBpYnVmOglwb2ludGVyIHRvIGlucHV0IChjb21wcmVzc2VkKSBwYWNrZXQgZGF0YQorICoJQGlzaXplOglsZW5ndGggb2YgaW5wdXQgcGFja2V0CisgKglAb2J1ZjoJcG9pbnRlciB0byBzcGFjZSBmb3Igb3V0cHV0IChkZWNvbXByZXNzZWQpIHBhY2tldAorICoJQG9zaXplOglhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlIGF0IEBvYnVmCisgKgorICogQmVjYXVzZSBvZiBwYXRlbnQgcHJvYmxlbXMsIHdlIHJldHVybiBERUNPTVBfRVJST1IgZm9yIGVycm9ycworICogZm91bmQgYnkgaW5zcGVjdGluZyB0aGUgaW5wdXQgZGF0YSBhbmQgZm9yIHN5c3RlbSBwcm9ibGVtcywgYnV0CisgKiBERUNPTVBfRkFUQUxFUlJPUiBmb3IgYW55IGVycm9ycyB3aGljaCBjb3VsZCBwb3NzaWJseSBiZSBzYWlkIHRvCisgKiBiZSBiZWluZyBkZXRlY3RlZCAiYWZ0ZXIiIGRlY29tcHJlc3Npb24uICBGb3IgREVDT01QX0VSUk9SLAorICogd2UgY2FuIGlzc3VlIGEgQ0NQIHJlc2V0LXJlcXVlc3Q7IGZvciBERUNPTVBfRkFUQUxFUlJPUiwgd2UgbWF5IGJlCisgKiBpbmZyaW5naW5nIGEgcGF0ZW50IG9mIE1vdG9yb2xhJ3MgaWYgd2UgZG8sIHNvIHdlIHRha2UgQ0NQIGRvd24KKyAqIGluc3RlYWQuCisgKgorICogR2l2ZW4gdGhhdCB0aGUgZnJhbWUgaGFzIHRoZSBjb3JyZWN0IHNlcXVlbmNlIG51bWJlciBhbmQgYSBnb29kIEZDUywKKyAqIGVycm9ycyBzdWNoIGFzIGludmFsaWQgY29kZXMgaW4gdGhlIGlucHV0IG1vc3QgbGlrZWx5IGluZGljYXRlIGEKKyAqIGJ1Zywgc28gd2UgcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SIGZvciB0aGVtIGluIG9yZGVyIHRvIHR1cm4gb2ZmCisgKiBjb21wcmVzc2lvbiwgZXZlbiB0aG91Z2ggdGhleSBhcmUgZGV0ZWN0ZWQgYnkgaW5zcGVjdGluZyB0aGUgaW5wdXQuCisgKi8KK2ludCB6X2RlY29tcHJlc3Modm9pZCAqYXJnLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaXNpemUsCisJCSB1bnNpZ25lZCBjaGFyICpvYnVmLCBpbnQgb3NpemUpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCWludCBvbGVuLCBzZXEsIHI7CisJaW50IGRlY29kZV9wcm90bywgb3ZlcmZsb3c7CisJdW5zaWduZWQgY2hhciBvdmVyZmxvd19idWZbMV07CisKKwlpZiAoaXNpemUgPD0gUFBQX0hEUkxFTiArIERFRkxBVEVfT1ZIRCkgeworCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInpfZGVjb21wcmVzcyVkOiBzaG9ydCBwa3QgKCVkKVxuIiwKKwkJCSAgICAgICBzdGF0ZS0+dW5pdCwgaXNpemUpOworCQlyZXR1cm4gREVDT01QX0VSUk9SOworCX0KKworCS8qIENoZWNrIHRoZSBzZXF1ZW5jZSBudW1iZXIuICovCisJc2VxID0gKGlidWZbUFBQX0hEUkxFTl0gPDwgOCkgKyBpYnVmW1BQUF9IRFJMRU4rMV07CisJaWYgKHNlcSAhPSAoc3RhdGUtPnNlcW5vICYgMHhmZmZmKSkgeworCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInpfZGVjb21wcmVzcyVkOiBiYWQgc2VxICMgJWQsIGV4cGVjdGVkICVkXG4iLAorCQkJICAgICAgIHN0YXRlLT51bml0LCBzZXEsIHN0YXRlLT5zZXFubyAmIDB4ZmZmZik7CisJCXJldHVybiBERUNPTVBfRVJST1I7CisJfQorCSsrc3RhdGUtPnNlcW5vOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBQUFAgaGVhZGVyLiAgVGhlIHByb3RvY29sIGZpZWxkCisJICogY29tZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGRhdGEuCisJICovCisJb2J1ZlswXSA9IFBQUF9BRERSRVNTKGlidWYpOworCW9idWZbMV0gPSBQUFBfQ09OVFJPTChpYnVmKTsKKwlvYnVmWzJdID0gMDsKKworCS8qCisJICogU2V0IHVwIHRvIGNhbGwgaW5mbGF0ZS4gIFdlIHNldCBhdmFpbF9vdXQgdG8gMSBpbml0aWFsbHkgc28gd2UgY2FuCisJICogbG9vayBhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgb3V0cHV0IGFuZCBkZWNpZGUgd2hldGhlciB3ZSBoYXZlCisJICogYSAxLWJ5dGUgb3IgMi1ieXRlIHByb3RvY29sIGZpZWxkLgorCSAqLworCXN0YXRlLT5zdHJtLm5leHRfaW4gPSBpYnVmICsgUFBQX0hEUkxFTiArIERFRkxBVEVfT1ZIRDsKKwlzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IGlzaXplIC0gKFBQUF9IRFJMRU4gKyBERUZMQVRFX09WSEQpOworCXN0YXRlLT5zdHJtLm5leHRfb3V0ID0gb2J1ZiArIDM7CisJc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID0gMTsKKwlkZWNvZGVfcHJvdG8gPSAxOworCW92ZXJmbG93ID0gMDsKKworCS8qCisJICogQ2FsbCBpbmZsYXRlLCBzdXBwbHlpbmcgbW9yZSBpbnB1dCBvciBvdXRwdXQgYXMgbmVlZGVkLgorCSAqLworCWZvciAoOzspIHsKKwkJciA9IHpsaWJfaW5mbGF0ZSgmc3RhdGUtPnN0cm0sIFpfUEFDS0VUX0ZMVVNIKTsKKwkJaWYgKHIgIT0gWl9PSykgeworCQkJaWYgKHN0YXRlLT5kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IGluZmxhdGUgcmV0dXJuZWQgJWQgKCVzKVxuIiwKKwkJCQkgICAgICAgc3RhdGUtPnVuaXQsIHIsIChzdGF0ZS0+c3RybS5tc2c/IHN0YXRlLT5zdHJtLm1zZzogIiIpKTsKKwkJCXJldHVybiBERUNPTVBfRkFUQUxFUlJPUjsKKwkJfQorCQlpZiAoc3RhdGUtPnN0cm0uYXZhaWxfb3V0ICE9IDApCisJCQlicmVhazsJCS8qIGFsbCBkb25lICovCisJCWlmIChkZWNvZGVfcHJvdG8pIHsKKwkJCXN0YXRlLT5zdHJtLmF2YWlsX291dCA9IG9zaXplIC0gUFBQX0hEUkxFTjsKKwkJCWlmICgob2J1ZlszXSAmIDEpID09IDApIHsKKwkJCQkvKiAyLWJ5dGUgcHJvdG9jb2wgZmllbGQgKi8KKwkJCQlvYnVmWzJdID0gb2J1ZlszXTsKKwkJCQktLXN0YXRlLT5zdHJtLm5leHRfb3V0OworCQkJCSsrc3RhdGUtPnN0cm0uYXZhaWxfb3V0OworCQkJfQorCQkJZGVjb2RlX3Byb3RvID0gMDsKKwkJfSBlbHNlIGlmICghb3ZlcmZsb3cpIHsKKwkJCS8qCisJCQkgKiBXZSd2ZSBmaWxsZWQgdXAgdGhlIG91dHB1dCBidWZmZXI7IHRoZSBvbmx5IHdheSB0bworCQkJICogZmluZCBvdXQgd2hldGhlciBpbmZsYXRlIGhhcyBhbnkgbW9yZSBjaGFyYWN0ZXJzCisJCQkgKiBsZWZ0IGlzIHRvIGdpdmUgaXQgYW5vdGhlciBieXRlIG9mIG91dHB1dCBzcGFjZS4KKwkJCSAqLworCQkJc3RhdGUtPnN0cm0ubmV4dF9vdXQgPSBvdmVyZmxvd19idWY7CisJCQlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSAxOworCQkJb3ZlcmZsb3cgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKHN0YXRlLT5kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IHJhbiBvdXQgb2YgbXJ1XG4iLAorCQkJCSAgICAgICBzdGF0ZS0+dW5pdCk7CisJCQlyZXR1cm4gREVDT01QX0ZBVEFMRVJST1I7CisJCX0KKwl9CisKKwlpZiAoZGVjb2RlX3Byb3RvKSB7CisJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IGRpZG4ndCBnZXQgcHJvdG9cbiIsCisJCQkgICAgICAgc3RhdGUtPnVuaXQpOworCQlyZXR1cm4gREVDT01QX0VSUk9SOworCX0KKworCW9sZW4gPSBvc2l6ZSArIG92ZXJmbG93IC0gc3RhdGUtPnN0cm0uYXZhaWxfb3V0OworCXN0YXRlLT5zdGF0cy51bmNfYnl0ZXMgKz0gb2xlbjsKKwlzdGF0ZS0+c3RhdHMudW5jX3BhY2tldHMrKzsKKwlzdGF0ZS0+c3RhdHMuY29tcF9ieXRlcyArPSBpc2l6ZTsKKwlzdGF0ZS0+c3RhdHMuY29tcF9wYWNrZXRzKys7CisKKwlyZXR1cm4gb2xlbjsKK30KKworLyoqCisgKgl6X2luY29tcCAtIGFkZCBpbmNvbXByZXNzaWJsZSBpbnB1dCBkYXRhIHRvIHRoZSBoaXN0b3J5LgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHN0YXRlIGZvciB0aGUgZGVjb21wcmVzc29yCisgKglAaWJ1ZjoJcG9pbnRlciB0byBpbnB1dCBwYWNrZXQgZGF0YQorICoJQGljbnQ6CWxlbmd0aCBvZiBpbnB1dCBkYXRhLgorICovCitzdGF0aWMgdm9pZCB6X2luY29tcCh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpY250KQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKwlpbnQgcHJvdG8sIHI7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIHByb3RvY29sIGlzIG9uZSB3ZSBoYW5kbGUuCisJICovCisJcHJvdG8gPSBQUFBfUFJPVE9DT0woaWJ1Zik7CisJaWYgKHByb3RvID4gMHgzZmZmIHx8IHByb3RvID09IDB4ZmQgfHwgcHJvdG8gPT0gMHhmYikKKwkJcmV0dXJuOworCisJKytzdGF0ZS0+c2Vxbm87CisKKwkvKgorCSAqIFdlIHN0YXJ0IGF0IHRoZSBlaXRoZXIgdGhlIDFzdCBvciAybmQgYnl0ZSBvZiB0aGUgcHJvdG9jb2wgZmllbGQsCisJICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHByb3RvY29sIHZhbHVlIGlzIGNvbXByZXNzaWJsZS4KKwkgKi8KKwlzdGF0ZS0+c3RybS5uZXh0X2luID0gaWJ1ZiArIDM7CisJc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSBpY250IC0gMzsKKwlpZiAocHJvdG8gPiAweGZmKSB7CisJCS0tc3RhdGUtPnN0cm0ubmV4dF9pbjsKKwkJKytzdGF0ZS0+c3RybS5hdmFpbF9pbjsKKwl9CisKKwlyID0gemxpYl9pbmZsYXRlSW5jb21wKCZzdGF0ZS0+c3RybSk7CisJaWYgKHIgIT0gWl9PSykgeworCQkvKiBnYWshICovCisJCWlmIChzdGF0ZS0+ZGVidWcpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2luY29tcCVkOiBpbmZsYXRlSW5jb21wIHJldHVybmVkICVkICglcylcbiIsCisJCQkgICAgICAgc3RhdGUtPnVuaXQsIHIsIChzdGF0ZS0+c3RybS5tc2c/IHN0YXRlLT5zdHJtLm1zZzogIiIpKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBVcGRhdGUgc3RhdHMuCisJICovCisJc3RhdGUtPnN0YXRzLmluY19ieXRlcyArPSBpY250OworCXN0YXRlLT5zdGF0cy5pbmNfcGFja2V0cysrOworCXN0YXRlLT5zdGF0cy51bmNfYnl0ZXMgKz0gaWNudDsKKwlzdGF0ZS0+c3RhdHMudW5jX3BhY2tldHMrKzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBpbnRlcmZhY2UgdGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBhcmUgaW4gcHBwX2dlbmVyaWMuYyAqLworZXh0ZXJuIGludCAgcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IgICAoc3RydWN0IGNvbXByZXNzb3IgKmNwKTsKK2V4dGVybiB2b2lkIHBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IgKHN0cnVjdCBjb21wcmVzc29yICpjcCk7CisKKy8qCisgKiBQcm9jZWR1cmVzIGV4cG9ydGVkIHRvIGlmX3BwcC5jLgorICovCitzdGF0aWMgc3RydWN0IGNvbXByZXNzb3IgcHBwX2RlZmxhdGUgPSB7CisJLmNvbXByZXNzX3Byb3RvID0JQ0lfREVGTEFURSwKKwkuY29tcF9hbGxvYyA9CQl6X2NvbXBfYWxsb2MsCisJLmNvbXBfZnJlZSA9CQl6X2NvbXBfZnJlZSwKKwkuY29tcF9pbml0ID0JCXpfY29tcF9pbml0LAorCS5jb21wX3Jlc2V0ID0JCXpfY29tcF9yZXNldCwKKwkuY29tcHJlc3MgPQkJel9jb21wcmVzcywKKwkuY29tcF9zdGF0ID0JCXpfY29tcF9zdGF0cywKKwkuZGVjb21wX2FsbG9jID0JCXpfZGVjb21wX2FsbG9jLAorCS5kZWNvbXBfZnJlZSA9CQl6X2RlY29tcF9mcmVlLAorCS5kZWNvbXBfaW5pdCA9CQl6X2RlY29tcF9pbml0LAorCS5kZWNvbXBfcmVzZXQgPQkJel9kZWNvbXBfcmVzZXQsCisJLmRlY29tcHJlc3MgPQkJel9kZWNvbXByZXNzLAorCS5pbmNvbXAgPQkJel9pbmNvbXAsCisJLmRlY29tcF9zdGF0ID0JCXpfY29tcF9zdGF0cywKKwkub3duZXIgPQkJVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciBwcHBfZGVmbGF0ZV9kcmFmdCA9IHsKKwkuY29tcHJlc3NfcHJvdG8gPQlDSV9ERUZMQVRFX0RSQUZULAorCS5jb21wX2FsbG9jID0JCXpfY29tcF9hbGxvYywKKwkuY29tcF9mcmVlID0JCXpfY29tcF9mcmVlLAorCS5jb21wX2luaXQgPQkJel9jb21wX2luaXQsCisJLmNvbXBfcmVzZXQgPQkJel9jb21wX3Jlc2V0LAorCS5jb21wcmVzcyA9CQl6X2NvbXByZXNzLAorCS5jb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5kZWNvbXBfYWxsb2MgPQkJel9kZWNvbXBfYWxsb2MsCisJLmRlY29tcF9mcmVlID0JCXpfZGVjb21wX2ZyZWUsCisJLmRlY29tcF9pbml0ID0JCXpfZGVjb21wX2luaXQsCisJLmRlY29tcF9yZXNldCA9CQl6X2RlY29tcF9yZXNldCwKKwkuZGVjb21wcmVzcyA9CQl6X2RlY29tcHJlc3MsCisJLmluY29tcCA9CQl6X2luY29tcCwKKwkuZGVjb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5vd25lciA9CQlUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVmbGF0ZV9pbml0KHZvaWQpCit7ICAKKyAgICAgICAgaW50IGFuc3dlciA9IHBwcF9yZWdpc3Rlcl9jb21wcmVzc29yKCZwcHBfZGVmbGF0ZSk7CisgICAgICAgIGlmIChhbnN3ZXIgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiUFBQIERlZmxhdGUgQ29tcHJlc3Npb24gbW9kdWxlIHJlZ2lzdGVyZWRcbiIpOworCXBwcF9yZWdpc3Rlcl9jb21wcmVzc29yKCZwcHBfZGVmbGF0ZV9kcmFmdCk7CisgICAgICAgIHJldHVybiBhbnN3ZXI7Cit9CisgICAgIAorc3RhdGljIHZvaWQgX19leGl0IGRlZmxhdGVfY2xlYW51cCh2b2lkKQoreworCXBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlKTsKKwlwcHBfdW5yZWdpc3Rlcl9jb21wcmVzc29yKCZwcHBfZGVmbGF0ZV9kcmFmdCk7Cit9CisKK21vZHVsZV9pbml0KGRlZmxhdGVfaW5pdCk7Cittb2R1bGVfZXhpdChkZWZsYXRlX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTKCJwcHAtY29tcHJlc3MtIiBfX3N0cmluZ2lmeShDSV9ERUZMQVRFKSk7CitNT0RVTEVfQUxJQVMoInBwcC1jb21wcmVzcy0iIF9fc3RyaW5naWZ5KENJX0RFRkxBVEVfRFJBRlQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTZkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMjc0NiBAQAorLyoKKyAqIEdlbmVyaWMgUFBQIGxheWVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAyIFBhdWwgTWFja2VycmFzLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBnZW5lcmljIFBQUCBsYXllciBoYW5kbGVzIHRoZSBQUFAgbmV0d29yayBpbnRlcmZhY2VzLCB0aGUKKyAqIC9kZXYvcHBwIGRldmljZSwgcGFja2V0IGFuZCBWSiBjb21wcmVzc2lvbiwgYW5kIG11bHRpbGluay4KKyAqIEl0IHRhbGtzIHRvIFBQUCBgY2hhbm5lbHMnIHZpYSB0aGUgaW50ZXJmYWNlIGRlZmluZWQgaW4KKyAqIGluY2x1ZGUvbGludXgvcHBwX2NoYW5uZWwuaC4gIENoYW5uZWxzIHByb3ZpZGUgdGhlIGJhc2ljIG1lYW5zIGZvcgorICogc2VuZGluZyBhbmQgcmVjZWl2aW5nIFBQUCBmcmFtZXMgb24gc29tZSBraW5kIG9mIGNvbW11bmljYXRpb25zCisgKiBjaGFubmVsLgorICoKKyAqIFBhcnQgb2YgdGhlIGNvZGUgaW4gdGhpcyBkcml2ZXIgd2FzIGluc3BpcmVkIGJ5IHRoZSBvbGQgYXN5bmMtb25seQorICogUFBQIGRyaXZlciwgd3JpdHRlbiBieSBNaWNoYWVsIENhbGxhaGFuIGFuZCBBbCBMb25neWVhciwgYW5kCisgKiBzdWJzZXF1ZW50bHkgaGFja2VkIGJ5IFBhdWwgTWFja2VycmFzLgorICoKKyAqID09RklMRVZFUlNJT04gMjAwNDExMDg9PQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc2xoY192ai5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi40LjIiCisKKy8qCisgKiBOZXR3b3JrIHByb3RvY29scyB3ZSBzdXBwb3J0LgorICovCisjZGVmaW5lIE5QX0lQCTAJCS8qIEludGVybmV0IFByb3RvY29sIFY0ICovCisjZGVmaW5lIE5QX0lQVjYJMQkJLyogSW50ZXJuZXQgUHJvdG9jb2wgVjYgKi8KKyNkZWZpbmUgTlBfSVBYCTIJCS8qIElQWCBwcm90b2NvbCAqLworI2RlZmluZSBOUF9BVAkzCQkvKiBBcHBsZXRhbGsgcHJvdG9jb2wgKi8KKyNkZWZpbmUgTlBfTVBMU19VQyA0CQkvKiBNUExTIHVuaWNhc3QgKi8KKyNkZWZpbmUgTlBfTVBMU19NQyA1CQkvKiBNUExTIG11bHRpY2FzdCAqLworI2RlZmluZSBOVU1fTlAJNgkJLyogTnVtYmVyIG9mIE5Qcy4gKi8KKworI2RlZmluZSBNUEhEUkxFTgk2CS8qIG11bHRpbGluayBwcm90b2NvbCBoZWFkZXIgbGVuZ3RoICovCisjZGVmaW5lIE1QSERSTEVOX1NTTgk0CS8qIGRpdHRvIHdpdGggc2hvcnQgc2VxdWVuY2UgbnVtYmVycyAqLworI2RlZmluZSBNSU5fRlJBR19TSVpFCTY0CisKKy8qCisgKiBBbiBpbnN0YW5jZSBvZiAvZGV2L3BwcCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciBhIHBwcAorICogaW50ZXJmYWNlIHVuaXQgb3IgYSBwcHAgY2hhbm5lbC4gIEluIGJvdGggY2FzZXMsIGZpbGUtPnByaXZhdGVfZGF0YQorICogcG9pbnRzIHRvIG9uZSBvZiB0aGVzZS4KKyAqLworc3RydWN0IHBwcF9maWxlIHsKKwllbnVtIHsKKwkJSU5URVJGQUNFPTEsIENIQU5ORUwKKwl9CQlraW5kOworCXN0cnVjdCBza19idWZmX2hlYWQgeHE7CQkvKiBwcHBkIHRyYW5zbWl0IHF1ZXVlICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBycTsJCS8qIHJlY2VpdmUgcXVldWUgZm9yIHBwcGQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCByd2FpdDsJLyogZm9yIHBvbGwgb24gcmVhZGluZyAvZGV2L3BwcCAqLworCWF0b21pY190CXJlZmNudDsJCS8qICMgcmVmcyAoaW5jbCAvZGV2L3BwcCBhdHRhY2hlZCkgKi8KKwlpbnQJCWhkcmxlbjsJCS8qIHNwYWNlIHRvIGxlYXZlIGZvciBoZWFkZXJzICovCisJaW50CQlpbmRleDsJCS8qIGludGVyZmFjZSB1bml0IC8gY2hhbm5lbCBudW1iZXIgKi8KKwlpbnQJCWRlYWQ7CQkvKiB1bml0L2NoYW5uZWwgaGFzIGJlZW4gc2h1dCBkb3duICovCit9OworCisjZGVmaW5lIFBGX1RPX1gocGYsIFgpCQkoKFggKikoKGNoYXIgKikocGYpIC0gb2Zmc2V0b2YoWCwgZmlsZSkpKQorCisjZGVmaW5lIFBGX1RPX1BQUChwZikJCVBGX1RPX1gocGYsIHN0cnVjdCBwcHApCisjZGVmaW5lIFBGX1RPX0NIQU5ORUwocGYpCVBGX1RPX1gocGYsIHN0cnVjdCBjaGFubmVsKQorCisjZGVmaW5lIFJPVU5EVVAobiwgeCkJCSgoKG4pICsgKHgpIC0gMSkgLyAoeCkpCisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIG9uZSBwcHAgdW5pdC4KKyAqIEEgcHBwIHVuaXQgY29ycmVzcG9uZHMgdG8gYSBwcHAgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlCisgKiBhbmQgcmVwcmVzZW50cyBhIG11bHRpbGluayBidW5kbGUuCisgKiBJdCBjYW4gaGF2ZSAwIG9yIG1vcmUgcHBwIGNoYW5uZWxzIGNvbm5lY3RlZCB0byBpdC4KKyAqLworc3RydWN0IHBwcCB7CisJc3RydWN0IHBwcF9maWxlCWZpbGU7CQkvKiBzdHVmZiBmb3IgcmVhZC93cml0ZS9wb2xsIDAgKi8KKwlzdHJ1Y3QgZmlsZQkqb3duZXI7CQkvKiBmaWxlIHRoYXQgb3ducyB0aGlzIHVuaXQgNDggKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoYW5uZWxzOwkvKiBsaXN0IG9mIGF0dGFjaGVkIGNoYW5uZWxzIDRjICovCisJaW50CQluX2NoYW5uZWxzOwkvKiBob3cgbWFueSBjaGFubmVscyBhcmUgYXR0YWNoZWQgNTQgKi8KKwlzcGlubG9ja190CXJsb2NrOwkJLyogbG9jayBmb3IgcmVjZWl2ZSBzaWRlIDU4ICovCisJc3BpbmxvY2tfdAl3bG9jazsJCS8qIGxvY2sgZm9yIHRyYW5zbWl0IHNpZGUgNWMgKi8KKwlpbnQJCW1ydTsJCS8qIG1heCByZWNlaXZlIHVuaXQgNjAgKi8KKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CQkvKiBjb250cm9sIGJpdHMgNjQgKi8KKwl1bnNpZ25lZCBpbnQJeHN0YXRlOwkJLyogdHJhbnNtaXQgc3RhdGUgYml0cyA2OCAqLworCXVuc2lnbmVkIGludAlyc3RhdGU7CQkvKiByZWNlaXZlIHN0YXRlIGJpdHMgNmMgKi8KKwlpbnQJCWRlYnVnOwkJLyogZGVidWcgZmxhZ3MgNzAgKi8KKwlzdHJ1Y3Qgc2xjb21wcmVzcyAqdmo7CQkvKiBzdGF0ZSBmb3IgVkogaGVhZGVyIGNvbXByZXNzaW9uICovCisJZW51bSBOUG1vZGUJbnBtb2RlW05VTV9OUF07CS8qIHdoYXQgdG8gZG8gd2l0aCBlYWNoIG5ldCBwcm90byA3OCAqLworCXN0cnVjdCBza19idWZmCSp4bWl0X3BlbmRpbmc7CS8qIGEgcGFja2V0IHJlYWR5IHRvIGdvIG91dCA4OCAqLworCXN0cnVjdCBjb21wcmVzc29yICp4Y29tcDsJLyogdHJhbnNtaXQgcGFja2V0IGNvbXByZXNzb3IgOGMgKi8KKwl2b2lkCQkqeGNfc3RhdGU7CS8qIGl0cyBpbnRlcm5hbCBzdGF0ZSA5MCAqLworCXN0cnVjdCBjb21wcmVzc29yICpyY29tcDsJLyogcmVjZWl2ZSBkZWNvbXByZXNzb3IgOTQgKi8KKwl2b2lkCQkqcmNfc3RhdGU7CS8qIGl0cyBpbnRlcm5hbCBzdGF0ZSA5OCAqLworCXVuc2lnbmVkIGxvbmcJbGFzdF94bWl0OwkvKiBqaWZmaWVzIHdoZW4gbGFzdCBwa3Qgc2VudCA5YyAqLworCXVuc2lnbmVkIGxvbmcJbGFzdF9yZWN2OwkvKiBqaWZmaWVzIHdoZW4gbGFzdCBwa3QgcmN2ZCBhMCAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2UgYTQgKi8KKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCWludAkJbnhjaGFuOwkJLyogbmV4dCBjaGFubmVsIHRvIHNlbmQgc29tZXRoaW5nIG9uICovCisJdTMyCQlueHNlcTsJCS8qIG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIHNlbmQgKi8KKwlpbnQJCW1ycnU7CQkvKiBNUDogbWF4IHJlY29uc3QuIHJlY2VpdmUgdW5pdCAqLworCXUzMgkJbmV4dHNlcTsJLyogTVA6IHNlcSBubyBvZiBuZXh0IHBhY2tldCAqLworCXUzMgkJbWluc2VxOwkJLyogTVA6IG1pbiBvZiBtb3N0IHJlY2VudCBzZXFub3MgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIG1ycTsJLyogTVA6IHJlY2VpdmUgcmVjb25zdHJ1Y3Rpb24gcXVldWUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBzdGF0aXN0aWNzICovCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKnBhc3NfZmlsdGVyOwkvKiBmaWx0ZXIgZm9yIHBhY2tldHMgdG8gcGFzcyAqLworCXN0cnVjdCBzb2NrX2ZpbHRlciAqYWN0aXZlX2ZpbHRlcjsvKiBmaWx0ZXIgZm9yIHBrdHMgdG8gcmVzZXQgaWRsZSAqLworCXVuc2lnbmVkIHBhc3NfbGVuLCBhY3RpdmVfbGVuOworI2VuZGlmIC8qIENPTkZJR19QUFBfRklMVEVSICovCit9OworCisvKgorICogQml0cyBpbiBmbGFnczogU0NfTk9fVENQX0NDSUQsIFNDX0NDUF9PUEVOLCBTQ19DQ1BfVVAsIFNDX0xPT1BfVFJBRkZJQywKKyAqIFNDX01VTFRJTElOSywgU0NfTVBfU0hPUlRTRVEsIFNDX01QX1hTSE9SVFNFUSwgU0NfQ09NUF9UQ1AsIFNDX1JFSl9DT01QX1RDUC4KKyAqIEJpdHMgaW4gcnN0YXRlOiBTQ19ERUNPTVBfUlVOLCBTQ19EQ19FUlJPUiwgU0NfRENfRkVSUk9SLgorICogQml0cyBpbiB4c3RhdGU6IFNDX0NPTVBfUlVOCisgKi8KKyNkZWZpbmUgU0NfRkxBR19CSVRTCShTQ19OT19UQ1BfQ0NJRHxTQ19DQ1BfT1BFTnxTQ19DQ1BfVVB8U0NfTE9PUF9UUkFGRklDIFwKKwkJCSB8U0NfTVVMVElMSU5LfFNDX01QX1NIT1JUU0VRfFNDX01QX1hTSE9SVFNFUSBcCisJCQkgfFNDX0NPTVBfVENQfFNDX1JFSl9DT01QX1RDUCkKKworLyoKKyAqIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIFRoaXMgaW5jbHVkZXMgdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIG11bHRpbGluay4KKyAqLworc3RydWN0IGNoYW5uZWwgeworCXN0cnVjdCBwcHBfZmlsZQlmaWxlOwkJLyogc3R1ZmYgZm9yIHJlYWQvd3JpdGUvcG9sbCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpbmsgaW4gYWxsL25ld19jaGFubmVscyBsaXN0ICovCisJc3RydWN0IHBwcF9jaGFubmVsICpjaGFuOwkvKiBwdWJsaWMgY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgY2hhbl9zZW07CS8qIHByb3RlY3RzIGBjaGFuJyBkdXJpbmcgY2hhbiBpb2N0bCAqLworCXNwaW5sb2NrX3QJZG93bmw7CQkvKiBwcm90ZWN0cyBgY2hhbicsIGZpbGUueHEgZGVxdWV1ZSAqLworCXN0cnVjdCBwcHAJKnBwcDsJCS8qIHBwcCB1bml0IHdlJ3JlIGNvbm5lY3RlZCB0byAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2xpc3Q7CQkvKiBsaW5rIGluIGxpc3Qgb2YgY2hhbm5lbHMgcGVyIHVuaXQgKi8KKwlyd2xvY2tfdAl1cGw7CQkvKiBwcm90ZWN0cyBgcHBwJyAqLworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJdTgJCWF2YWlsOwkJLyogZmxhZyB1c2VkIGluIG11bHRpbGluayBzdHVmZiAqLworCXU4CQloYWRfZnJhZzsJLyogPj0gMSBmcmFnbWVudHMgaGF2ZSBiZWVuIHNlbnQgKi8KKwl1MzIJCWxhc3RzZXE7CS8qIE1QOiBsYXN0IHNlcXVlbmNlICMgcmVjZWl2ZWQgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworfTsKKworLyoKKyAqIFNNUCBsb2NraW5nIGlzc3VlczoKKyAqIEJvdGggdGhlIHBwcC5ybG9jayBhbmQgcHBwLndsb2NrIGxvY2tzIHByb3RlY3QgdGhlIHBwcC5jaGFubmVscworICogbGlzdCBhbmQgdGhlIHBwcC5uX2NoYW5uZWxzIGZpZWxkLCB5b3UgbmVlZCB0byB0YWtlIGJvdGggbG9ja3MKKyAqIGJlZm9yZSB5b3UgbW9kaWZ5IHRoZW0uCisgKiBUaGUgbG9jayBvcmRlcmluZyBpczogY2hhbm5lbC51cGwgLT4gcHBwLndsb2NrIC0+IHBwcC5ybG9jayAtPgorICogY2hhbm5lbC5kb3dubC4KKyAqLworCisvKgorICogQSBjYXJkbWFwIHJlcHJlc2VudHMgYSBtYXBwaW5nIGZyb20gdW5zaWduZWQgaW50ZWdlcnMgdG8gcG9pbnRlcnMsCisgKiBhbmQgcHJvdmlkZXMgYSBmYXN0ICJmaW5kIGxvd2VzdCB1bnVzZWQgbnVtYmVyIiBvcGVyYXRpb24uCisgKiBJdCB1c2VzIGEgYnJvYWQgKDMyLXdheSkgdHJlZSB3aXRoIGEgYml0bWFwIGF0IGVhY2ggbGV2ZWwuCisgKiBJdCBpcyBkZXNpZ25lZCB0byBiZSBzcGFjZS1lZmZpY2llbnQgZm9yIHNtYWxsIG51bWJlcnMgb2YgZW50cmllcworICogYW5kIHRpbWUtZWZmaWNpZW50IGZvciBsYXJnZSBudW1iZXJzIG9mIGVudHJpZXMuCisgKi8KKyNkZWZpbmUgQ0FSRE1BUF9PUkRFUgk1CisjZGVmaW5lIENBUkRNQVBfV0lEVEgJKDFVIDw8IENBUkRNQVBfT1JERVIpCisjZGVmaW5lIENBUkRNQVBfTUFTSwkoQ0FSRE1BUF9XSURUSCAtIDEpCisKK3N0cnVjdCBjYXJkbWFwIHsKKwlpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBpbnVzZTsKKwlzdHJ1Y3QgY2FyZG1hcCAqcGFyZW50OworCXZvaWQgKnB0cltDQVJETUFQX1dJRFRIXTsKK307CitzdGF0aWMgdm9pZCAqY2FyZG1hcF9nZXQoc3RydWN0IGNhcmRtYXAgKm1hcCwgdW5zaWduZWQgaW50IG5yKTsKK3N0YXRpYyB2b2lkIGNhcmRtYXBfc2V0KHN0cnVjdCBjYXJkbWFwICoqbWFwLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKnB0cik7CitzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRtYXBfZmluZF9maXJzdF9mcmVlKHN0cnVjdCBjYXJkbWFwICptYXApOworc3RhdGljIHZvaWQgY2FyZG1hcF9kZXN0cm95KHN0cnVjdCBjYXJkbWFwICoqbWFwKTsKKworLyoKKyAqIGFsbF9wcHBfc2VtIHByb3RlY3RzIHRoZSBhbGxfcHBwX3VuaXRzIG1hcHBpbmcuCisgKiBJdCBhbHNvIGVuc3VyZXMgdGhhdCBmaW5kaW5nIGEgcHBwIHVuaXQgaW4gdGhlIGFsbF9wcHBfdW5pdHMgbWFwCisgKiBhbmQgdXBkYXRpbmcgaXRzIGZpbGUucmVmY250IGZpZWxkIGlzIGF0b21pYy4KKyAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoYWxsX3BwcF9zZW0pOworc3RhdGljIHN0cnVjdCBjYXJkbWFwICphbGxfcHBwX3VuaXRzOworc3RhdGljIGF0b21pY190IHBwcF91bml0X2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qCisgKiBhbGxfY2hhbm5lbHNfbG9jayBwcm90ZWN0cyBhbGxfY2hhbm5lbHMgYW5kIGxhc3RfY2hhbm5lbF9pbmRleCwKKyAqIGFuZCB0aGUgYXRvbWljaXR5IG9mIGZpbmQgYSBjaGFubmVsIGFuZCB1cGRhdGluZyBpdHMgZmlsZS5yZWZjbnQKKyAqIGZpZWxkLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFsbF9jaGFubmVsc19sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoYWxsX2NoYW5uZWxzKTsKK3N0YXRpYyBMSVNUX0hFQUQobmV3X2NoYW5uZWxzKTsKK3N0YXRpYyBpbnQgbGFzdF9jaGFubmVsX2luZGV4Oworc3RhdGljIGF0b21pY190IGNoYW5uZWxfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyogR2V0IHRoZSBQUFAgcHJvdG9jb2wgbnVtYmVyIGZyb20gYSBza2IgKi8KKyNkZWZpbmUgUFBQX1BST1RPKHNrYikJKCgoc2tiKS0+ZGF0YVswXSA8PCA4KSArIChza2IpLT5kYXRhWzFdKQorCisvKiBXZSBsaW1pdCB0aGUgbGVuZ3RoIG9mIHBwcC0+ZmlsZS5ycSB0byB0aGlzIChhcmJpdHJhcnkpIHZhbHVlICovCisjZGVmaW5lIFBQUF9NQVhfUlFMRU4JMzIKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIG11bHRpbGluayBmcmFnbWVudHMgcXVldWVkIHVwLgorICogVGhpcyBoYXMgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGNvcGUgd2l0aCB0aGUgbWF4aW11bSBsYXRlbmN5IG9mCisgKiB0aGUgc2xvd2VzdCBjaGFubmVsIHJlbGF0aXZlIHRvIHRoZSBvdGhlcnMuICBTdHJpY3RseSBpdCBzaG91bGQKKyAqIGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCB0aGVpciBjaGFyYWN0ZXJpc3RpY3MuCisgKi8KKyNkZWZpbmUgUFBQX01QX01BWF9RTEVOCTEyOAorCisvKiBNdWx0aWxpbmsgaGVhZGVyIGJpdHMuICovCisjZGVmaW5lIEIJMHg4MAkJLyogdGhpcyBmcmFnbWVudCBiZWdpbnMgYSBwYWNrZXQgKi8KKyNkZWZpbmUgRQkweDQwCQkvKiB0aGlzIGZyYWdtZW50IGVuZHMgYSBwYWNrZXQgKi8KKworLyogQ29tcGFyZSBtdWx0aWxpbmsgc2VxdWVuY2UgbnVtYmVycyAoYXNzdW1lZCB0byBiZSAzMiBiaXRzIHdpZGUpICovCisjZGVmaW5lIHNlcV9iZWZvcmUoYSwgYikJKChzMzIpKChhKSAtIChiKSkgPCAwKQorI2RlZmluZSBzZXFfYWZ0ZXIoYSwgYikJCSgoczMyKSgoYSkgLSAoYikpID4gMCkKKworLyogUHJvdG90eXBlcy4gKi8KK3N0YXRpYyBpbnQgcHBwX3VuYXR0YWNoZWRfaW9jdGwoc3RydWN0IHBwcF9maWxlICpwZiwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApOworc3RhdGljIHZvaWQgcHBwX3NlbmRfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHBwcF9wdXNoKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfY2hhbm5lbF9wdXNoKHN0cnVjdCBjaGFubmVsICpwY2gpOworc3RhdGljIHZvaWQgcHBwX3JlY2VpdmVfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IGNoYW5uZWwgKnBjaCk7CitzdGF0aWMgdm9pZCBwcHBfcmVjZWl2ZV9lcnJvcihzdHJ1Y3QgcHBwICpwcHApOworc3RhdGljIHZvaWQgcHBwX3JlY2VpdmVfbm9ubXBfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcHBwX2RlY29tcHJlc3NfZnJhbWUoc3RydWN0IHBwcCAqcHBwLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKK3N0YXRpYyB2b2lkIHBwcF9yZWNlaXZlX21wX2ZyYW1lKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgY2hhbm5lbCAqcGNoKTsKK3N0YXRpYyB2b2lkIHBwcF9tcF9pbnNlcnQoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcHBwX21wX3JlY29uc3RydWN0KHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgaW50IHBwcF9tcF9leHBsb2RlKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KK3N0YXRpYyBpbnQgcHBwX3NldF9jb21wcmVzcyhzdHJ1Y3QgcHBwICpwcHAsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIHBwcF9jY3BfcGVlayhzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBpbmJvdW5kKTsKK3N0YXRpYyB2b2lkIHBwcF9jY3BfY2xvc2VkKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgc3RydWN0IGNvbXByZXNzb3IgKmZpbmRfY29tcHJlc3NvcihpbnQgdHlwZSk7CitzdGF0aWMgdm9pZCBwcHBfZ2V0X3N0YXRzKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHBwcF9zdGF0cyAqc3QpOworc3RhdGljIHN0cnVjdCBwcHAgKnBwcF9jcmVhdGVfaW50ZXJmYWNlKGludCB1bml0LCBpbnQgKnJldHApOworc3RhdGljIHZvaWQgaW5pdF9wcHBfZmlsZShzdHJ1Y3QgcHBwX2ZpbGUgKnBmLCBpbnQga2luZCk7CitzdGF0aWMgdm9pZCBwcHBfc2h1dGRvd25faW50ZXJmYWNlKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfZGVzdHJveV9pbnRlcmZhY2Uoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyBzdHJ1Y3QgcHBwICpwcHBfZmluZF91bml0KGludCB1bml0KTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqcHBwX2ZpbmRfY2hhbm5lbChpbnQgdW5pdCk7CitzdGF0aWMgaW50IHBwcF9jb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCwgaW50IHVuaXQpOworc3RhdGljIGludCBwcHBfZGlzY29ubmVjdF9jaGFubmVsKHN0cnVjdCBjaGFubmVsICpwY2gpOworc3RhdGljIHZvaWQgcHBwX2Rlc3Ryb3lfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoKTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnBwcF9jbGFzczsKKworLyogVHJhbnNsYXRlcyBhIFBQUCBwcm90b2NvbCBudW1iZXIgdG8gYSBOUCBpbmRleCAoTlAgPT0gbmV0d29yayBwcm90b2NvbCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByb3RvX3RvX25waW5kZXgoaW50IHByb3RvKQoreworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIFBQUF9JUDoKKwkJcmV0dXJuIE5QX0lQOworCWNhc2UgUFBQX0lQVjY6CisJCXJldHVybiBOUF9JUFY2OworCWNhc2UgUFBQX0lQWDoKKwkJcmV0dXJuIE5QX0lQWDsKKwljYXNlIFBQUF9BVDoKKwkJcmV0dXJuIE5QX0FUOworCWNhc2UgUFBQX01QTFNfVUM6CisJCXJldHVybiBOUF9NUExTX1VDOworCWNhc2UgUFBQX01QTFNfTUM6CisJCXJldHVybiBOUF9NUExTX01DOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVHJhbnNsYXRlcyBhbiBOUCBpbmRleCBpbnRvIGEgUFBQIHByb3RvY29sIG51bWJlciAqLworc3RhdGljIGNvbnN0IGludCBucGluZGV4X3RvX3Byb3RvW05VTV9OUF0gPSB7CisJUFBQX0lQLAorCVBQUF9JUFY2LAorCVBQUF9JUFgsCisJUFBQX0FULAorCVBQUF9NUExTX1VDLAorCVBQUF9NUExTX01DLAorfTsKKwkKKy8qIFRyYW5zbGF0ZXMgYW4gZXRoZXJ0eXBlIGludG8gYW4gTlAgaW5kZXggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV0aGVydHlwZV90b19ucGluZGV4KGludCBldGhlcnR5cGUpCit7CisJc3dpdGNoIChldGhlcnR5cGUpIHsKKwljYXNlIEVUSF9QX0lQOgorCQlyZXR1cm4gTlBfSVA7CisJY2FzZSBFVEhfUF9JUFY2OgorCQlyZXR1cm4gTlBfSVBWNjsKKwljYXNlIEVUSF9QX0lQWDoKKwkJcmV0dXJuIE5QX0lQWDsKKwljYXNlIEVUSF9QX1BQUFRBTEs6CisJY2FzZSBFVEhfUF9BVEFMSzoKKwkJcmV0dXJuIE5QX0FUOworCWNhc2UgRVRIX1BfTVBMU19VQzoKKwkJcmV0dXJuIE5QX01QTFNfVUM7CisJY2FzZSBFVEhfUF9NUExTX01DOgorCQlyZXR1cm4gTlBfTVBMU19NQzsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKiBUcmFuc2xhdGVzIGFuIE5QIGluZGV4IGludG8gYW4gZXRoZXJ0eXBlICovCitzdGF0aWMgY29uc3QgaW50IG5waW5kZXhfdG9fZXRoZXJ0eXBlW05VTV9OUF0gPSB7CisJRVRIX1BfSVAsCisJRVRIX1BfSVBWNiwKKwlFVEhfUF9JUFgsCisJRVRIX1BfUFBQVEFMSywKKwlFVEhfUF9NUExTX1VDLAorCUVUSF9QX01QTFNfTUMsCit9OworCisvKgorICogTG9ja2luZyBzaG9ydGhhbmQuCisgKi8KKyNkZWZpbmUgcHBwX3htaXRfbG9jayhwcHApCXNwaW5fbG9ja19iaCgmKHBwcCktPndsb2NrKQorI2RlZmluZSBwcHBfeG1pdF91bmxvY2socHBwKQlzcGluX3VubG9ja19iaCgmKHBwcCktPndsb2NrKQorI2RlZmluZSBwcHBfcmVjdl9sb2NrKHBwcCkJc3Bpbl9sb2NrX2JoKCYocHBwKS0+cmxvY2spCisjZGVmaW5lIHBwcF9yZWN2X3VubG9jayhwcHApCXNwaW5fdW5sb2NrX2JoKCYocHBwKS0+cmxvY2spCisjZGVmaW5lIHBwcF9sb2NrKHBwcCkJCWRvIHsgcHBwX3htaXRfbG9jayhwcHApOyBcCisJCQkJICAgICBwcHBfcmVjdl9sb2NrKHBwcCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHBwcF91bmxvY2socHBwKQkJZG8geyBwcHBfcmVjdl91bmxvY2socHBwKTsgXAorCQkJCSAgICAgcHBwX3htaXRfdW5sb2NrKHBwcCk7IH0gd2hpbGUgKDApCisKKy8qCisgKiAvZGV2L3BwcCBkZXZpY2Ugcm91dGluZXMuCisgKiBUaGUgL2Rldi9wcHAgZGV2aWNlIGlzIHVzZWQgYnkgcHBwZCB0byBjb250cm9sIHRoZSBwcHAgdW5pdC4KKyAqIEl0IHN1cHBvcnRzIHRoZSByZWFkLCB3cml0ZSwgaW9jdGwgYW5kIHBvbGwgZnVuY3Rpb25zLgorICogT3BlbiBpbnN0YW5jZXMgb2YgL2Rldi9wcHAgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6CisgKiB1bmF0dGFjaGVkLCBhdHRhY2hlZCB0byBhIHBwcCB1bml0LCBvciBhdHRhY2hlZCB0byBhIHBwcCBjaGFubmVsLgorICovCitzdGF0aWMgaW50IHBwcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogVGhpcyBjb3VsZCAoc2hvdWxkPykgYmUgZW5mb3JjZWQgYnkgdGhlIHBlcm1pc3Npb25zIG9uIC9kZXYvcHBwLgorCSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcHBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcHAgKnBwcDsKKworCWlmIChwZiAhPSAwKSB7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCWlmIChwZi0+a2luZCA9PSBJTlRFUkZBQ0UpIHsKKwkJCXBwcCA9IFBGX1RPX1BQUChwZik7CisJCQlpZiAoZmlsZSA9PSBwcHAtPm93bmVyKQorCQkJCXBwcF9zaHV0ZG93bl9pbnRlcmZhY2UocHBwKTsKKwkJfQorCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGYtPnJlZmNudCkpIHsKKwkJCXN3aXRjaCAocGYtPmtpbmQpIHsKKwkJCWNhc2UgSU5URVJGQUNFOgorCQkJCXBwcF9kZXN0cm95X2ludGVyZmFjZShQRl9UT19QUFAocGYpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0hBTk5FTDoKKwkJCQlwcHBfZGVzdHJveV9jaGFubmVsKFBGX1RPX0NIQU5ORUwocGYpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcHBwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJcmV0ID0gY291bnQ7CisKKwlpZiAocGYgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlhZGRfd2FpdF9xdWV1ZSgmcGYtPnJ3YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlza2IgPSBza2JfZGVxdWV1ZSgmcGYtPnJxKTsKKwkJaWYgKHNrYikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlpZiAocGYtPmRlYWQpCisJCQlicmVhazsKKwkJaWYgKHBmLT5raW5kID09IElOVEVSRkFDRSkgeworCQkJLyoKKwkJCSAqIFJldHVybiAwIChFT0YpIG9uIGFuIGludGVyZmFjZSB0aGF0IGhhcyBubworCQkJICogY2hhbm5lbHMgY29ubmVjdGVkLCB1bmxlc3MgaXQgaXMgbG9vcGluZworCQkJICogbmV0d29yayB0cmFmZmljIChkZW1hbmQgbW9kZSkuCisJCQkgKi8KKwkJCXN0cnVjdCBwcHAgKnBwcCA9IFBGX1RPX1BQUChwZik7CisJCQlpZiAocHBwLT5uX2NoYW5uZWxzID09IDAKKwkJCSAgICAmJiAocHBwLT5mbGFncyAmIFNDX0xPT1BfVFJBRkZJQykgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlyZXQgPSAtRUFHQUlOOworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlicmVhazsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcGYtPnJ3YWl0LCAmd2FpdCk7CisKKwlpZiAoc2tiID09IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVPVkVSRkxPVzsKKwlpZiAoc2tiLT5sZW4gPiBjb3VudCkKKwkJZ290byBvdXRmOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKQorCQlnb3RvIG91dGY7CisJcmV0ID0gc2tiLT5sZW47CisKKyBvdXRmOgorCWtmcmVlX3NrYihza2IpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBwcHBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHBwcF9maWxlICpwZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNzaXplX3QgcmV0OworCisJaWYgKHBmID09IDApCisJCXJldHVybiAtRU5YSU87CisJcmV0ID0gLUVOT01FTTsKKwlza2IgPSBhbGxvY19za2IoY291bnQgKyBwZi0+aGRybGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiID09IDApCisJCWdvdG8gb3V0OworCXNrYl9yZXNlcnZlKHNrYiwgcGYtPmhkcmxlbik7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoc2tiX3B1dChza2IsIGNvdW50KSwgYnVmLCBjb3VudCkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZwZi0+eHEsIHNrYik7CisKKwlzd2l0Y2ggKHBmLT5raW5kKSB7CisJY2FzZSBJTlRFUkZBQ0U6CisJCXBwcF94bWl0X3Byb2Nlc3MoUEZfVE9fUFBQKHBmKSk7CisJCWJyZWFrOworCWNhc2UgQ0hBTk5FTDoKKwkJcHBwX2NoYW5uZWxfcHVzaChQRl9UT19DSEFOTkVMKHBmKSk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGNvdW50OworCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBwcHBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrOworCisJaWYgKHBmID09IDApCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmaWxlLCAmcGYtPnJ3YWl0LCB3YWl0KTsKKwltYXNrID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJaWYgKHNrYl9wZWVrKCZwZi0+cnEpICE9IDApCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAocGYtPmRlYWQpCisJCW1hc2sgfD0gUE9MTEhVUDsKKwllbHNlIGlmIChwZi0+a2luZCA9PSBJTlRFUkZBQ0UpIHsKKwkJLyogc2VlIGNvbW1lbnQgaW4gcHBwX3JlYWQgKi8KKwkJc3RydWN0IHBwcCAqcHBwID0gUEZfVE9fUFBQKHBmKTsKKwkJaWYgKHBwcC0+bl9jaGFubmVscyA9PSAwCisJCSAgICAmJiAocHBwLT5mbGFncyAmIFNDX0xPT1BfVFJBRkZJQykgPT0gMCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworI2lmZGVmIENPTkZJR19QUFBfRklMVEVSCitzdGF0aWMgaW50IGdldF9maWx0ZXIodm9pZCBfX3VzZXIgKmFyZywgc3RydWN0IHNvY2tfZmlsdGVyICoqcCkKK3sKKwlzdHJ1Y3Qgc29ja19mcHJvZyB1cHJvZzsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmNvZGUgPSBOVUxMOworCWludCBsZW4sIGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXByb2csIGFyZywgc2l6ZW9mKHVwcm9nKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHVwcm9nLmxlbiA+IEJQRl9NQVhJTlNOUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXVwcm9nLmxlbikgeworCQkqcCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWxlbiA9IHVwcm9nLmxlbiAqIHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXIpOworCWNvZGUgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY29kZSwgdXByb2cuZmlsdGVyLCBsZW4pKSB7CisJCWtmcmVlKGNvZGUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPSBza19jaGtfZmlsdGVyKGNvZGUsIHVwcm9nLmxlbik7CisJaWYgKGVycikgeworCQlrZnJlZShjb2RlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkqcCA9IGNvZGU7CisJcmV0dXJuIHVwcm9nLmxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCitzdGF0aWMgaW50IHBwcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcHAgKnBwcDsKKwlpbnQgZXJyID0gLUVGQVVMVCwgdmFsLCB2YWwyLCBpOworCXN0cnVjdCBwcHBfaWRsZSBpZGxlOworCXN0cnVjdCBucGlvY3RsIG5waTsKKwlpbnQgdW5pdCwgY2ZsYWdzOworCXN0cnVjdCBzbGNvbXByZXNzICp2ajsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCWlmIChwZiA9PSAwKQorCQlyZXR1cm4gcHBwX3VuYXR0YWNoZWRfaW9jdGwocGYsIGZpbGUsIGNtZCwgYXJnKTsKKworCWlmIChjbWQgPT0gUFBQSU9DREVUQUNIKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBoZXJlLi4uIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkJICogaGFzIGJlZW4gZHVwJ2QsIHdlIGNvdWxkIGhhdmUgYW5vdGhlciBwcm9jZXNzIGluIHRoZQorCQkgKiBtaWRkbGUgb2YgYSBwb2xsIHVzaW5nIHRoZSBzYW1lIGZpbGUgKiwgc28gd2UgaGFkCisJCSAqIGJldHRlciBub3QgZnJlZSB0aGUgaW50ZXJmYWNlIGRhdGEgc3RydWN0dXJlcyAtCisJCSAqIGluc3RlYWQgd2UgZmFpbCB0aGUgaW9jdGwuICBFdmVuIGluIHRoaXMgY2FzZSwgd2UKKwkJICogc2h1dCBkb3duIHRoZSBpbnRlcmZhY2UgaWYgd2UgYXJlIHRoZSBvd25lciBvZiBpdC4KKwkJICogQWN0dWFsbHksIHdlIHNob3VsZCBnZXQgcmlkIG9mIFBQUElPQ0RFVEFDSCwgdXNlcmxhbmQKKwkJICogKGkuZS4gcHBwZCkgY291bGQgYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QgYnkgY2xvc2luZworCQkgKiB0aGlzIGZkIGFuZCByZW9wZW5pbmcgL2Rldi9wcHAuCisJCSAqLworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocGYtPmtpbmQgPT0gSU5URVJGQUNFKSB7CisJCQlwcHAgPSBQRl9UT19QUFAocGYpOworCQkJaWYgKGZpbGUgPT0gcHBwLT5vd25lcikKKwkJCQlwcHBfc2h1dGRvd25faW50ZXJmYWNlKHBwcCk7CisJCX0KKwkJaWYgKGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSA8PSAyKSB7CisJCQlwcHBfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJQUFBJT0NERVRBQ0ggZmlsZS0+Zl9jb3VudD0lZFxuIiwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmZmlsZS0+Zl9jb3VudCkpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChwZi0+a2luZCA9PSBDSEFOTkVMKSB7CisJCXN0cnVjdCBjaGFubmVsICpwY2ggPSBQRl9UT19DSEFOTkVMKHBmKTsKKwkJc3RydWN0IHBwcF9jaGFubmVsICpjaGFuOworCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUFBQSU9DQ09OTkVDVDoKKwkJCWlmIChnZXRfdXNlcih1bml0LCBwKSkKKwkJCQlicmVhazsKKwkJCWVyciA9IHBwcF9jb25uZWN0X2NoYW5uZWwocGNoLCB1bml0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBQSU9DRElTQ09OTjoKKwkJCWVyciA9IHBwcF9kaXNjb25uZWN0X2NoYW5uZWwocGNoKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkb3duX3JlYWQoJnBjaC0+Y2hhbl9zZW0pOworCQkJY2hhbiA9IHBjaC0+Y2hhbjsKKwkJCWVyciA9IC1FTk9UVFk7CisJCQlpZiAoY2hhbiAmJiBjaGFuLT5vcHMtPmlvY3RsKQorCQkJCWVyciA9IGNoYW4tPm9wcy0+aW9jdGwoY2hhbiwgY21kLCBhcmcpOworCQkJdXBfcmVhZCgmcGNoLT5jaGFuX3NlbSk7CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocGYtPmtpbmQgIT0gSU5URVJGQUNFKSB7CisJCS8qIGNhbid0IGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9FUlIgIlBQUDogbm90IGludGVyZmFjZSBvciBjaGFubmVsPz9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcHAgPSBQRl9UT19QUFAocGYpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NTTVJVOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlwcHAtPm1ydSA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJcHBwX2xvY2socHBwKTsKKwkJY2ZsYWdzID0gcHBwLT5mbGFncyAmIH52YWw7CisJCXBwcC0+ZmxhZ3MgPSB2YWwgJiBTQ19GTEFHX0JJVFM7CisJCXBwcF91bmxvY2socHBwKTsKKwkJaWYgKGNmbGFncyAmIFNDX0NDUF9PUEVOKQorCQkJcHBwX2NjcF9jbG9zZWQocHBwKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dGTEFHUzoKKwkJdmFsID0gcHBwLT5mbGFncyB8IHBwcC0+eHN0YXRlIHwgcHBwLT5yc3RhdGU7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NTQ09NUFJFU1M6CisJCWVyciA9IHBwcF9zZXRfY29tcHJlc3MocHBwLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1VOSVQ6CisJCWlmIChwdXRfdXNlcihwcHAtPmZpbGUuaW5kZXgsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NTREVCVUc6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCXBwcC0+ZGVidWcgPSB2YWw7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHREVCVUc6CisJCWlmIChwdXRfdXNlcihwcHAtPmRlYnVnLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR0lETEU6CisJCWlkbGUueG1pdF9pZGxlID0gKGppZmZpZXMgLSBwcHAtPmxhc3RfeG1pdCkgLyBIWjsKKwkJaWRsZS5yZWN2X2lkbGUgPSAoamlmZmllcyAtIHBwcC0+bGFzdF9yZWN2KSAvIEhaOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGxlLCBzaXplb2YoaWRsZSkpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NTTUFYQ0lEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQl2YWwyID0gMTU7CisJCWlmICgodmFsID4+IDE2KSAhPSAwKSB7CisJCQl2YWwyID0gdmFsID4+IDE2OworCQkJdmFsICY9IDB4ZmZmZjsKKwkJfQorCQl2aiA9IHNsaGNfaW5pdCh2YWwyKzEsIHZhbCsxKTsKKwkJaWYgKHZqID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBubyBtZW1vcnkgKFZKIGNvbXByZXNzb3IpXG4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlwcHBfbG9jayhwcHApOworCQlpZiAocHBwLT52aiAhPSAwKQorCQkJc2xoY19mcmVlKHBwcC0+dmopOworCQlwcHAtPnZqID0gdmo7CisJCXBwcF91bmxvY2socHBwKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dOUE1PREU6CisJY2FzZSBQUFBJT0NTTlBNT0RFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJm5waSwgYXJncCwgc2l6ZW9mKG5waSkpKQorCQkJYnJlYWs7CisJCWVyciA9IHByb3RvX3RvX25waW5kZXgobnBpLnByb3RvY29sKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKwkJaSA9IGVycjsKKwkJaWYgKGNtZCA9PSBQUFBJT0NHTlBNT0RFKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJbnBpLm1vZGUgPSBwcHAtPm5wbW9kZVtpXTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm5waSwgc2l6ZW9mKG5waSkpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcHBwLT5ucG1vZGVbaV0gPSBucGkubW9kZTsKKwkJCS8qIHdlIG1heSBiZSBhYmxlIHRvIHRyYW5zbWl0IG1vcmUgcGFja2V0cyBub3cgKD8/KSAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShwcHAtPmRldik7CisJCX0KKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCWNhc2UgUFBQSU9DU1BBU1M6CisJeworCQlzdHJ1Y3Qgc29ja19maWx0ZXIgKmNvZGU7CisJCWVyciA9IGdldF9maWx0ZXIoYXJncCwgJmNvZGUpOworCQlpZiAoZXJyID49IDApIHsKKwkJCXBwcF9sb2NrKHBwcCk7CisJCQlrZnJlZShwcHAtPnBhc3NfZmlsdGVyKTsKKwkJCXBwcC0+cGFzc19maWx0ZXIgPSBjb2RlOworCQkJcHBwLT5wYXNzX2xlbiA9IGVycjsKKwkJCXBwcF91bmxvY2socHBwKTsKKwkJCWVyciA9IDA7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgUFBQSU9DU0FDVElWRToKKwl7CisJCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZTsKKwkJZXJyID0gZ2V0X2ZpbHRlcihhcmdwLCAmY29kZSk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJcHBwX2xvY2socHBwKTsKKwkJCWtmcmVlKHBwcC0+YWN0aXZlX2ZpbHRlcik7CisJCQlwcHAtPmFjdGl2ZV9maWx0ZXIgPSBjb2RlOworCQkJcHBwLT5hY3RpdmVfbGVuID0gZXJyOworCQkJcHBwX3VubG9jayhwcHApOworCQkJZXJyID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KKworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJY2FzZSBQUFBJT0NTTVJSVToKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJcHBwX3JlY3ZfbG9jayhwcHApOworCQlwcHAtPm1ycnUgPSB2YWw7CisJCXBwcF9yZWN2X3VubG9jayhwcHApOworCQllcnIgPSAwOworCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RUWTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBwcF91bmF0dGFjaGVkX2lvY3RsKHN0cnVjdCBwcHBfZmlsZSAqcGYsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB1bml0LCBlcnIgPSAtRUZBVUxUOworCXN0cnVjdCBwcHAgKnBwcDsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2hhbjsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DTkVXVU5JVDoKKwkJLyogQ3JlYXRlIGEgbmV3IHBwcCB1bml0ICovCisJCWlmIChnZXRfdXNlcih1bml0LCBwKSkKKwkJCWJyZWFrOworCQlwcHAgPSBwcHBfY3JlYXRlX2ludGVyZmFjZSh1bml0LCAmZXJyKTsKKwkJaWYgKHBwcCA9PSAwKQorCQkJYnJlYWs7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZwcHAtPmZpbGU7CisJCXBwcC0+b3duZXIgPSBmaWxlOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwLT5maWxlLmluZGV4LCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DQVRUQUNIOgorCQkvKiBBdHRhY2ggdG8gYW4gZXhpc3RpbmcgcHBwIHVuaXQgKi8KKwkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJYnJlYWs7CisJCWRvd24oJmFsbF9wcHBfc2VtKTsKKwkJZXJyID0gLUVOWElPOworCQlwcHAgPSBwcHBfZmluZF91bml0KHVuaXQpOworCQlpZiAocHBwICE9IDApIHsKKwkJCWF0b21pY19pbmMoJnBwcC0+ZmlsZS5yZWZjbnQpOworCQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnBwcC0+ZmlsZTsKKwkJCWVyciA9IDA7CisJCX0KKwkJdXAoJmFsbF9wcHBfc2VtKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0FUVENIQU46CisJCWlmIChnZXRfdXNlcih1bml0LCBwKSkKKwkJCWJyZWFrOworCQlzcGluX2xvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwkJZXJyID0gLUVOWElPOworCQljaGFuID0gcHBwX2ZpbmRfY2hhbm5lbCh1bml0KTsKKwkJaWYgKGNoYW4gIT0gMCkgeworCQkJYXRvbWljX2luYygmY2hhbi0+ZmlsZS5yZWZjbnQpOworCQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmNoYW4tPmZpbGU7CisJCQllcnIgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RUWTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHBwX2RldmljZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBwcHBfcmVhZCwKKwkud3JpdGUJCT0gcHBwX3dyaXRlLAorCS5wb2xsCQk9IHBwcF9wb2xsLAorCS5pb2N0bAkJPSBwcHBfaW9jdGwsCisJLm9wZW4JCT0gcHBwX29wZW4sCisJLnJlbGVhc2UJPSBwcHBfcmVsZWFzZQorfTsKKworI2RlZmluZSBQUFBfTUFKT1IJMTA4CisKKy8qIENhbGxlZCBhdCBib290IHRpbWUgaWYgcHBwIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwKKyAgIG9yIGF0IG1vZHVsZSBsb2FkIHRpbWUgKGZyb20gaW5pdF9tb2R1bGUpIGlmIGNvbXBpbGVkIGFzIGEgbW9kdWxlLiAqLworc3RhdGljIGludCBfX2luaXQgcHBwX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUFBQIGdlbmVyaWMgZHJpdmVyIHZlcnNpb24gIiBQUFBfVkVSU0lPTiAiXG4iKTsKKwllcnIgPSByZWdpc3Rlcl9jaHJkZXYoUFBQX01BSk9SLCAicHBwIiwgJnBwcF9kZXZpY2VfZm9wcyk7CisJaWYgKCFlcnIpIHsKKwkJcHBwX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInBwcCIpOworCQlpZiAoSVNfRVJSKHBwcF9jbGFzcykpIHsKKwkJCWVyciA9IFBUUl9FUlIocHBwX2NsYXNzKTsKKwkJCWdvdG8gb3V0X2NocmRldjsKKwkJfQorCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChwcHBfY2xhc3MsIE1LREVWKFBQUF9NQUpPUiwgMCksIE5VTEwsICJwcHAiKTsKKwkJZXJyID0gZGV2ZnNfbWtfY2RldihNS0RFVihQUFBfTUFKT1IsIDApLAorCQkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLCAicHBwIik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbGFzczsKKwl9CisKK291dDoKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBQUFAgZGV2aWNlICglZClcbiIsIGVycik7CisJcmV0dXJuIGVycjsKKworb3V0X2NsYXNzOgorCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFBQUF9NQUpPUiwwKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBwX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoUFBQX01BSk9SLCAicHBwIik7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBOZXR3b3JrIGludGVyZmFjZSB1bml0IHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50CitwcHBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcHAgKnBwcCA9IChzdHJ1Y3QgcHBwICopIGRldi0+cHJpdjsKKwlpbnQgbnBpLCBwcm90bzsKKwl1bnNpZ25lZCBjaGFyICpwcDsKKworCW5waSA9IGV0aGVydHlwZV90b19ucGluZGV4KG50b2hzKHNrYi0+cHJvdG9jb2wpKTsKKwlpZiAobnBpIDwgMCkKKwkJZ290byBvdXRmOworCisJLyogRHJvcCwgYWNjZXB0IG9yIHJlamVjdCB0aGUgcGFja2V0ICovCisJc3dpdGNoIChwcHAtPm5wbW9kZVtucGldKSB7CisJY2FzZSBOUE1PREVfUEFTUzoKKwkJYnJlYWs7CisJY2FzZSBOUE1PREVfUVVFVUU6CisJCS8qIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIHdheSB0byB0ZWxsIHRoZSBuZXR3b3JrCisJCSAgIHN5c3RlbSB0byBxdWV1ZSB0aGlzIG9uZSB1cCBmb3IgbGF0ZXIuICovCisJCWdvdG8gb3V0ZjsKKwljYXNlIE5QTU9ERV9EUk9QOgorCWNhc2UgTlBNT0RFX0VSUk9SOgorCQlnb3RvIG91dGY7CisJfQorCisJLyogUHV0IHRoZSAyLWJ5dGUgUFBQIHByb3RvY29sIG51bWJlciBvbiB0aGUgZnJvbnQsCisJICAgbWFraW5nIHN1cmUgdGhlcmUgaXMgcm9vbSBmb3IgdGhlIGFkZHJlc3MgYW5kIGNvbnRyb2wgZmllbGRzLiAqLworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IFBQUF9IRFJMRU4pIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5zOworCisJCW5zID0gYWxsb2Nfc2tiKHNrYi0+bGVuICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4sIEdGUF9BVE9NSUMpOworCQlpZiAobnMgPT0gMCkKKwkJCWdvdG8gb3V0ZjsKKwkJc2tiX3Jlc2VydmUobnMsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJc2tiX2NvcHlfYml0cyhza2IsIDAsIHNrYl9wdXQobnMsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gbnM7CisJfQorCXBwID0gc2tiX3B1c2goc2tiLCAyKTsKKwlwcm90byA9IG5waW5kZXhfdG9fcHJvdG9bbnBpXTsKKwlwcFswXSA9IHByb3RvID4+IDg7CisJcHBbMV0gPSBwcm90bzsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlza2JfcXVldWVfdGFpbCgmcHBwLT5maWxlLnhxLCBza2IpOworCXBwcF94bWl0X3Byb2Nlc3MocHBwKTsKKwlyZXR1cm4gMDsKKworIG91dGY6CisJa2ZyZWVfc2tiKHNrYik7CisJKytwcHAtPnN0YXRzLnR4X2Ryb3BwZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitwcHBfbmV0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBwcCAqcHBwID0gKHN0cnVjdCBwcHAgKikgZGV2LT5wcml2OworCisJcmV0dXJuICZwcHAtPnN0YXRzOworfQorCitzdGF0aWMgaW50CitwcHBfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBwcHAgKnBwcCA9IGRldi0+cHJpdjsKKwlpbnQgZXJyID0gLUVGQVVMVDsKKwl2b2lkIF9fdXNlciAqYWRkciA9ICh2b2lkIF9fdXNlciAqKSBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YTsKKwlzdHJ1Y3QgcHBwX3N0YXRzIHN0YXRzOworCXN0cnVjdCBwcHBfY29tcF9zdGF0cyBjc3RhdHM7CisJY2hhciAqdmVyczsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR1BQUFNUQVRTOgorCQlwcHBfZ2V0X3N0YXRzKHBwcCwgJnN0YXRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR1BQUENTVEFUUzoKKwkJbWVtc2V0KCZjc3RhdHMsIDAsIHNpemVvZihjc3RhdHMpKTsKKwkJaWYgKHBwcC0+eGNfc3RhdGUgIT0gMCkKKwkJCXBwcC0+eGNvbXAtPmNvbXBfc3RhdChwcHAtPnhjX3N0YXRlLCAmY3N0YXRzLmMpOworCQlpZiAocHBwLT5yY19zdGF0ZSAhPSAwKQorCQkJcHBwLT5yY29tcC0+ZGVjb21wX3N0YXQocHBwLT5yY19zdGF0ZSwgJmNzdGF0cy5kKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmY3N0YXRzLCBzaXplb2YoY3N0YXRzKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUFBQVkVSOgorCQl2ZXJzID0gUFBQX1ZFUlNJT047CisJCWlmIChjb3B5X3RvX3VzZXIoYWRkciwgdmVycywgc3RybGVuKHZlcnMpICsgMSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBwcF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gUFBQX0hEUkxFTjsKKwlkZXYtPm10dSA9IFBQUF9NVFU7CisJZGV2LT5hZGRyX2xlbiA9IDA7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAzOworCWRldi0+dHlwZSA9IEFSUEhSRF9QUFA7CisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUCB8IElGRl9NVUxUSUNBU1Q7Cit9CisKKy8qCisgKiBUcmFuc21pdC1zaWRlIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBDYWxsZWQgdG8gZG8gYW55IHdvcmsgcXVldWVkIHVwIG9uIHRoZSB0cmFuc21pdCBzaWRlCisgKiB0aGF0IGNhbiBub3cgYmUgZG9uZS4KKyAqLworc3RhdGljIHZvaWQKK3BwcF94bWl0X3Byb2Nlc3Moc3RydWN0IHBwcCAqcHBwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlwcHBfeG1pdF9sb2NrKHBwcCk7CisJaWYgKHBwcC0+ZGV2ICE9IDApIHsKKwkJcHBwX3B1c2gocHBwKTsKKwkJd2hpbGUgKHBwcC0+eG1pdF9wZW5kaW5nID09IDAKKwkJICAgICAgICYmIChza2IgPSBza2JfZGVxdWV1ZSgmcHBwLT5maWxlLnhxKSkgIT0gMCkKKwkJCXBwcF9zZW5kX2ZyYW1lKHBwcCwgc2tiKTsKKwkJLyogSWYgdGhlcmUncyBubyB3b3JrIGxlZnQgdG8gZG8sIHRlbGwgdGhlIGNvcmUgbmV0CisJCSAgIGNvZGUgdGhhdCB3ZSBjYW4gYWNjZXB0IHNvbWUgbW9yZS4gKi8KKwkJaWYgKHBwcC0+eG1pdF9wZW5kaW5nID09IDAgJiYgc2tiX3BlZWsoJnBwcC0+ZmlsZS54cSkgPT0gMCkKKwkJCW5ldGlmX3dha2VfcXVldWUocHBwLT5kZXYpOworCX0KKwlwcHBfeG1pdF91bmxvY2socHBwKTsKK30KKworLyoKKyAqIENvbXByZXNzIGFuZCBzZW5kIGEgZnJhbWUuCisgKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIGxvY2tlZCB0aGUgeG1pdCBwYXRoLAorICogYW5kIHhtaXRfcGVuZGluZyBzaG91bGQgYmUgMC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9zZW5kX2ZyYW1lKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcHJvdG8gPSBQUFBfUFJPVE8oc2tiKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgKmNwOworCisJaWYgKHByb3RvIDwgMHg4MDAwKSB7CisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKKwkJLyogY2hlY2sgaWYgd2Ugc2hvdWxkIHBhc3MgdGhpcyBwYWNrZXQgKi8KKwkJLyogdGhlIGZpbHRlciBpbnN0cnVjdGlvbnMgYXJlIGNvbnN0cnVjdGVkIGFzc3VtaW5nCisJCSAgIGEgZm91ci1ieXRlIFBQUCBoZWFkZXIgb24gZWFjaCBwYWNrZXQgKi8KKwkJKnNrYl9wdXNoKHNrYiwgMikgPSAxOworCQlpZiAocHBwLT5wYXNzX2ZpbHRlcgorCQkgICAgJiYgc2tfcnVuX2ZpbHRlcihza2IsIHBwcC0+cGFzc19maWx0ZXIsCisJCQkJICAgICBwcHAtPnBhc3NfbGVuKSA9PSAwKSB7CisJCQlpZiAocHBwLT5kZWJ1ZyAmIDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUDogb3V0Ym91bmQgZnJhbWUgbm90IHBhc3NlZFxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBpZiB0aGlzIHBhY2tldCBwYXNzZXMgdGhlIGFjdGl2ZSBmaWx0ZXIsIHJlY29yZCB0aGUgdGltZSAqLworCQlpZiAoIShwcHAtPmFjdGl2ZV9maWx0ZXIKKwkJICAgICAgJiYgc2tfcnVuX2ZpbHRlcihza2IsIHBwcC0+YWN0aXZlX2ZpbHRlciwKKwkJCQkgICAgICAgcHBwLT5hY3RpdmVfbGVuKSA9PSAwKSkKKwkJCXBwcC0+bGFzdF94bWl0ID0gamlmZmllczsKKwkJc2tiX3B1bGwoc2tiLCAyKTsKKyNlbHNlCisJCS8qIGZvciBkYXRhIHBhY2tldHMsIHJlY29yZCB0aGUgdGltZSAqLworCQlwcHAtPmxhc3RfeG1pdCA9IGppZmZpZXM7CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KKwl9CisKKwkrK3BwcC0+c3RhdHMudHhfcGFja2V0czsKKwlwcHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuIC0gMjsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIFBQUF9JUDoKKwkJaWYgKHBwcC0+dmogPT0gMCB8fCAocHBwLT5mbGFncyAmIFNDX0NPTVBfVENQKSA9PSAwKQorCQkJYnJlYWs7CisJCS8qIHRyeSB0byBkbyBWSiBUQ1AgaGVhZGVyIGNvbXByZXNzaW9uICovCisJCW5ld19za2IgPSBhbGxvY19za2Ioc2tiLT5sZW4gKyBwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMiwKKwkJCQkgICAgR0ZQX0FUT01JQyk7CisJCWlmIChuZXdfc2tiID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBubyBtZW1vcnkgKFZKIGNvbXAgcGt0KVxuIik7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJc2tiX3Jlc2VydmUobmV3X3NrYiwgcHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiAtIDIpOworCQljcCA9IHNrYi0+ZGF0YSArIDI7CisJCWxlbiA9IHNsaGNfY29tcHJlc3MocHBwLT52aiwgY3AsIHNrYi0+bGVuIC0gMiwKKwkJCQkgICAgbmV3X3NrYi0+ZGF0YSArIDIsICZjcCwKKwkJCQkgICAgIShwcHAtPmZsYWdzICYgU0NfTk9fVENQX0NDSUQpKTsKKwkJaWYgKGNwID09IHNrYi0+ZGF0YSArIDIpIHsKKwkJCS8qIGRpZG4ndCBjb21wcmVzcyAqLworCQkJa2ZyZWVfc2tiKG5ld19za2IpOworCQl9IGVsc2UgeworCQkJaWYgKGNwWzBdICYgU0xfVFlQRV9DT01QUkVTU0VEX1RDUCkgeworCQkJCXByb3RvID0gUFBQX1ZKQ19DT01QOworCQkJCWNwWzBdICY9IH5TTF9UWVBFX0NPTVBSRVNTRURfVENQOworCQkJfSBlbHNlIHsKKwkJCQlwcm90byA9IFBQUF9WSkNfVU5DT01QOworCQkJCWNwWzBdID0gc2tiLT5kYXRhWzJdOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBuZXdfc2tiOworCQkJY3AgPSBza2JfcHV0KHNrYiwgbGVuICsgMik7CisJCQljcFswXSA9IDA7CisJCQljcFsxXSA9IHByb3RvOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQUFBfQ0NQOgorCQkvKiBwZWVrIGF0IG91dGJvdW5kIENDUCBmcmFtZXMgKi8KKwkJcHBwX2NjcF9wZWVrKHBwcCwgc2tiLCAwKTsKKwkJYnJlYWs7CisJfQorCisJLyogdHJ5IHRvIGRvIHBhY2tldCBjb21wcmVzc2lvbiAqLworCWlmICgocHBwLT54c3RhdGUgJiBTQ19DT01QX1JVTikgJiYgcHBwLT54Y19zdGF0ZSAhPSAwCisJICAgICYmIHByb3RvICE9IFBQUF9MQ1AgJiYgcHJvdG8gIT0gUFBQX0NDUCkgeworCQluZXdfc2tiID0gYWxsb2Nfc2tiKHBwcC0+ZGV2LT5tdHUgKyBwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19za2IgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IG5vIG1lbW9yeSAoY29tcCBwa3QpXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlpZiAocHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiA+IFBQUF9IRFJMRU4pCisJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLAorCQkJCSAgICBwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gUFBQX0hEUkxFTik7CisKKwkJLyogY29tcHJlc3NvciBzdGlsbCBleHBlY3RzIEEvQyBieXRlcyBpbiBoZHIgKi8KKwkJbGVuID0gcHBwLT54Y29tcC0+Y29tcHJlc3MocHBwLT54Y19zdGF0ZSwgc2tiLT5kYXRhIC0gMiwKKwkJCQkJICAgbmV3X3NrYi0+ZGF0YSwgc2tiLT5sZW4gKyAyLAorCQkJCQkgICBwcHAtPmRldi0+bXR1ICsgUFBQX0hEUkxFTik7CisJCWlmIChsZW4gPiAwICYmIChwcHAtPmZsYWdzICYgU0NfQ0NQX1VQKSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBuZXdfc2tiOworCQkJc2tiX3B1dChza2IsIGxlbik7CisJCQlza2JfcHVsbChza2IsIDIpOwkvKiBwdWxsIG9mZiBBL0MgYnl0ZXMgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIGRpZG4ndCBjb21wcmVzcywgb3IgQ0NQIG5vdCB1cCB5ZXQgKi8KKwkJCWtmcmVlX3NrYihuZXdfc2tiKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgYXJlIHdhaXRpbmcgZm9yIHRyYWZmaWMgKGRlbWFuZCBkaWFsbGluZyksCisJICogcXVldWUgaXQgdXAgZm9yIHBwcGQgdG8gcmVjZWl2ZS4KKwkgKi8KKwlpZiAocHBwLT5mbGFncyAmIFNDX0xPT1BfVFJBRkZJQykgeworCQlpZiAocHBwLT5maWxlLnJxLnFsZW4gPiBQUFBfTUFYX1JRTEVOKQorCQkJZ290byBkcm9wOworCQlza2JfcXVldWVfdGFpbCgmcHBwLT5maWxlLnJxLCBza2IpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBwcC0+ZmlsZS5yd2FpdCk7CisJCXJldHVybjsKKwl9CisKKwlwcHAtPnhtaXRfcGVuZGluZyA9IHNrYjsKKwlwcHBfcHVzaChwcHApOworCXJldHVybjsKKworIGRyb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJKytwcHAtPnN0YXRzLnR4X2Vycm9yczsKK30KKworLyoKKyAqIFRyeSB0byBzZW5kIHRoZSBmcmFtZSBpbiB4bWl0X3BlbmRpbmcuCisgKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIHRoZSB4bWl0IHBhdGggbG9ja2VkLgorICovCitzdGF0aWMgdm9pZAorcHBwX3B1c2goc3RydWN0IHBwcCAqcHBwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGNoYW5uZWwgKnBjaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHBwLT54bWl0X3BlbmRpbmc7CisKKwlpZiAoc2tiID09IDApCisJCXJldHVybjsKKworCWxpc3QgPSAmcHBwLT5jaGFubmVsczsKKwlpZiAobGlzdF9lbXB0eShsaXN0KSkgeworCQkvKiBub3doZXJlIHRvIHNlbmQgdGhlIHBhY2tldCwganVzdCBkcm9wIGl0ICovCisJCXBwcC0+eG1pdF9wZW5kaW5nID0gTlVMTDsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHBwcC0+ZmxhZ3MgJiBTQ19NVUxUSUxJTkspID09IDApIHsKKwkJLyogbm90IGRvaW5nIG11bHRpbGluazogc2VuZCBpdCBkb3duIHRoZSBmaXJzdCBjaGFubmVsICovCisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisKKwkJc3Bpbl9sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwkJaWYgKHBjaC0+Y2hhbikgeworCQkJaWYgKHBjaC0+Y2hhbi0+b3BzLT5zdGFydF94bWl0KHBjaC0+Y2hhbiwgc2tiKSkKKwkJCQlwcHAtPnhtaXRfcGVuZGluZyA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQkvKiBjaGFubmVsIGdvdCB1bnJlZ2lzdGVyZWQgKi8KKwkJCWtmcmVlX3NrYihza2IpOworCQkJcHBwLT54bWl0X3BlbmRpbmcgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJLyogTXVsdGlsaW5rOiBmcmFnbWVudCB0aGUgcGFja2V0IG92ZXIgYXMgbWFueSBsaW5rcworCSAgIGFzIGNhbiB0YWtlIHRoZSBwYWNrZXQgYXQgdGhlIG1vbWVudC4gKi8KKwlpZiAoIXBwcF9tcF9leHBsb2RlKHBwcCwgc2tiKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisKKwlwcHAtPnhtaXRfcGVuZGluZyA9IE5VTEw7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworLyoKKyAqIERpdmlkZSBhIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBpbnRvIGZyYWdtZW50cyBhbmQKKyAqIHNlbmQgdGhlbSBvdXQgdGhlIGluZGl2aWR1YWwgbGlua3MuCisgKi8KK3N0YXRpYyBpbnQgcHBwX21wX2V4cGxvZGUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuY2gsIGxlbiwgZnJhZ3NpemU7CisJaW50IGksIGJpdHMsIGhkcmxlbiwgbXR1OworCWludCBmbGVuLCBmbmI7CisJdW5zaWduZWQgY2hhciAqcCwgKnE7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoOworCXN0cnVjdCBza19idWZmICpmcmFnOworCXN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbjsKKworCW5jaCA9IDA7CisJaGRybGVuID0gKHBwcC0+ZmxhZ3MgJiBTQ19NUF9YU0hPUlRTRVEpPyBNUEhEUkxFTl9TU046IE1QSERSTEVOOworCWxpc3QgPSAmcHBwLT5jaGFubmVsczsKKwl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmcHBwLT5jaGFubmVscykgeworCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJCW5jaCArPSBwY2gtPmF2YWlsID0gKHNrYl9xdWV1ZV9sZW4oJnBjaC0+ZmlsZS54cSkgPT0gMCk7CisJCS8qCisJCSAqIElmIGEgY2hhbm5lbCBoYXNuJ3QgaGFkIGEgZnJhZ21lbnQgeWV0LCBpdCBoYXMgdG8gZ2V0CisJCSAqIG9uZSBiZWZvcmUgd2Ugc2VuZCBhbnkgZnJhZ21lbnRzIG9uIGxhdGVyIGNoYW5uZWxzLgorCQkgKiBJZiBpdCBjYW4ndCB0YWtlIGEgZnJhZ21lbnQgbm93LCBkb24ndCBnaXZlIGFueQorCQkgKiB0byBzdWJzZXF1ZW50IGNoYW5uZWxzLgorCQkgKi8KKwkJaWYgKCFwY2gtPmhhZF9mcmFnICYmICFwY2gtPmF2YWlsKSB7CisJCQl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmcHBwLT5jaGFubmVscykgeworCQkJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKwkJCQlwY2gtPmF2YWlsID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChuY2ggPT0gMCkKKwkJcmV0dXJuIDA7CS8qIGNhbid0IHRha2Ugbm93LCBsZWF2ZSBpdCBpbiB4bWl0X3BlbmRpbmcgKi8KKworCS8qIERvIHByb3RvY29sIGZpZWxkIGNvbXByZXNzaW9uIChYWFggdGhpcyBzaG91bGQgYmUgb3B0aW9uYWwpICovCisJcCA9IHNrYi0+ZGF0YTsKKwlsZW4gPSBza2ItPmxlbjsKKwlpZiAoKnAgPT0gMCkgeworCQkrK3A7CisJCS0tbGVuOworCX0KKworCS8qIGRlY2lkZSBvbiBmcmFnbWVudCBzaXplICovCisJZnJhZ3NpemUgPSBsZW47CisJaWYgKG5jaCA+IDEpIHsKKwkJaW50IG1heGNoID0gUk9VTkRVUChsZW4sIE1JTl9GUkFHX1NJWkUpOworCQlpZiAobmNoID4gbWF4Y2gpCisJCQluY2ggPSBtYXhjaDsKKwkJZnJhZ3NpemUgPSBST1VORFVQKGZyYWdzaXplLCBuY2gpOworCX0KKworCS8qIHNraXAgdG8gdGhlIGNoYW5uZWwgYWZ0ZXIgdGhlIG9uZSB3ZSBsYXN0IHVzZWQKKwkgICBhbmQgc3RhcnQgYXQgdGhhdCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHBwLT5ueGNoYW47ICsraSkgeworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGxpc3QgPT0gJnBwcC0+Y2hhbm5lbHMpIHsKKwkJCWkgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjcmVhdGUgYSBmcmFnbWVudCBmb3IgZWFjaCBjaGFubmVsICovCisJYml0cyA9IEI7CisJZG8geworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGxpc3QgPT0gJnBwcC0+Y2hhbm5lbHMpIHsKKwkJCWkgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOworCQkrK2k7CisJCWlmICghcGNoLT5hdmFpbCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNoZWNrIHRoZSBjaGFubmVsJ3MgbXR1IGFuZCB3aGV0aGVyIGl0IGlzIHN0aWxsIGF0dGFjaGVkLiAqLworCQlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOworCQlpZiAocGNoLT5jaGFuID09IDAgfHwgKG10dSA9IHBjaC0+Y2hhbi0+bXR1KSA8IGhkcmxlbikgeworCQkJLyogY2FuJ3QgdXNlIHRoaXMgY2hhbm5lbCAqLworCQkJc3Bpbl91bmxvY2tfYmgoJnBjaC0+ZG93bmwpOworCQkJcGNoLT5hdmFpbCA9IDA7CisJCQlpZiAoLS1uY2ggPT0gMCkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBjcmVhdGUgbXVsdGlwbGUgZnJhZ21lbnRzIGZvciB0aGlzIGNoYW5uZWwKKwkJICogaWYgZnJhZ3NpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBjaGFubmVsJ3MgbXR1LgorCQkgKi8KKwkJaWYgKGZyYWdzaXplID4gbGVuKQorCQkJZnJhZ3NpemUgPSBsZW47CisJCWZvciAoZmxlbiA9IGZyYWdzaXplOyBmbGVuID4gMDsgZmxlbiAtPSBmbmIpIHsKKwkJCWZuYiA9IGZsZW47CisJCQlpZiAoZm5iID4gbXR1ICsgMiAtIGhkcmxlbikKKwkJCQlmbmIgPSBtdHUgKyAyIC0gaGRybGVuOworCQkJaWYgKGZuYiA+PSBsZW4pCisJCQkJYml0cyB8PSBFOworCQkJZnJhZyA9IGFsbG9jX3NrYihmbmIgKyBoZHJsZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKGZyYWcgPT0gMCkKKwkJCQlnb3RvIG5vc2tiOworCQkJcSA9IHNrYl9wdXQoZnJhZywgZm5iICsgaGRybGVuKTsKKwkJCS8qIG1ha2UgdGhlIE1QIGhlYWRlciAqLworCQkJcVswXSA9IFBQUF9NUCA+PiA4OworCQkJcVsxXSA9IFBQUF9NUDsKKwkJCWlmIChwcHAtPmZsYWdzICYgU0NfTVBfWFNIT1JUU0VRKSB7CisJCQkJcVsyXSA9IGJpdHMgKyAoKHBwcC0+bnhzZXEgPj4gOCkgJiAweGYpOworCQkJCXFbM10gPSBwcHAtPm54c2VxOworCQkJfSBlbHNlIHsKKwkJCQlxWzJdID0gYml0czsKKwkJCQlxWzNdID0gcHBwLT5ueHNlcSA+PiAxNjsKKwkJCQlxWzRdID0gcHBwLT5ueHNlcSA+PiA4OworCQkJCXFbNV0gPSBwcHAtPm54c2VxOworCQkJfQorCisJCQkvKiBjb3B5IHRoZSBkYXRhIGluICovCisJCQltZW1jcHkocSArIGhkcmxlbiwgcCwgZm5iKTsKKworCQkJLyogdHJ5IHRvIHNlbmQgaXQgZG93biB0aGUgY2hhbm5lbCAqLworCQkJY2hhbiA9IHBjaC0+Y2hhbjsKKwkJCWlmICghY2hhbi0+b3BzLT5zdGFydF94bWl0KGNoYW4sIGZyYWcpKQorCQkJCXNrYl9xdWV1ZV90YWlsKCZwY2gtPmZpbGUueHEsIGZyYWcpOworCQkJcGNoLT5oYWRfZnJhZyA9IDE7CisJCQlwICs9IGZuYjsKKwkJCWxlbiAtPSBmbmI7CisJCQkrK3BwcC0+bnhzZXE7CisJCQliaXRzID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJfSB3aGlsZSAobGVuID4gMCk7CisJcHBwLT5ueGNoYW4gPSBpOworCisJcmV0dXJuIDE7CisKKyBub3NrYjoKKwlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJaWYgKHBwcC0+ZGVidWcgJiAxKQorCQlwcmludGsoS0VSTl9FUlIgIlBQUDogbm8gbWVtb3J5IChmcmFnbWVudClcbiIpOworCSsrcHBwLT5zdGF0cy50eF9lcnJvcnM7CisJKytwcHAtPm54c2VxOworCXJldHVybiAxOwkvKiBhYmFuZG9uIHRoZSBmcmFtZSAqLworfQorI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisKKy8qCisgKiBUcnkgdG8gc2VuZCBkYXRhIG91dCBvbiBhIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfY2hhbm5lbF9wdXNoKHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcHBwICpwcHA7CisKKwlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOworCWlmIChwY2gtPmNoYW4gIT0gMCkgeworCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA+IDApIHsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwY2gtPmZpbGUueHEpOworCQkJaWYgKCFwY2gtPmNoYW4tPm9wcy0+c3RhcnRfeG1pdChwY2gtPmNoYW4sIHNrYikpIHsKKwkJCQkvKiBwdXQgdGhlIHBhY2tldCBiYWNrIGFuZCB0cnkgYWdhaW4gbGF0ZXIgKi8KKwkJCQlza2JfcXVldWVfaGVhZCgmcGNoLT5maWxlLnhxLCBza2IpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogY2hhbm5lbCBnb3QgZGVyZWdpc3RlcmVkICovCisJCXNrYl9xdWV1ZV9wdXJnZSgmcGNoLT5maWxlLnhxKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnBjaC0+ZG93bmwpOworCS8qIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyBmcm9tIHRoZSBhdHRhY2hlZCB1bml0IHRvIGJlIHNlbnQgKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA9PSAwKSB7CisJCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCQlwcHAgPSBwY2gtPnBwcDsKKwkJaWYgKHBwcCAhPSAwKQorCQkJcHBwX3htaXRfcHJvY2VzcyhwcHApOworCQlyZWFkX3VubG9ja19iaCgmcGNoLT51cGwpOworCX0KK30KKworLyoKKyAqIFJlY2VpdmUtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKiBtaXN1c2UgYSBmZXcgZmllbGRzIG9mIHRoZSBza2IgZm9yIE1QIHJlY29uc3RydWN0aW9uICovCisjZGVmaW5lIHNlcXVlbmNlCXByaW9yaXR5CisjZGVmaW5lIEJFYml0cwkJY2JbMF0KKworc3RhdGljIGlubGluZSB2b2lkCitwcHBfZG9fcmVjdihzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJcHBwX3JlY3ZfbG9jayhwcHApOworCS8qIHBwcC0+ZGV2ID09IDAgbWVhbnMgaW50ZXJmYWNlIGlzIGNsb3NpbmcgZG93biAqLworCWlmIChwcHAtPmRldiAhPSAwKQorCQlwcHBfcmVjZWl2ZV9mcmFtZShwcHAsIHNrYiwgcGNoKTsKKwllbHNlCisJCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWN2X3VubG9jayhwcHApOworfQorCit2b2lkCitwcHBfaW5wdXQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisJaW50IHByb3RvOworCisJaWYgKHBjaCA9PSAwIHx8IHNrYi0+bGVuID09IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisJCisJcHJvdG8gPSBQUFBfUFJPVE8oc2tiKTsKKwlyZWFkX2xvY2tfYmgoJnBjaC0+dXBsKTsKKwlpZiAocGNoLT5wcHAgPT0gMCB8fCBwcm90byA+PSAweGMwMDAgfHwgcHJvdG8gPT0gUFBQX0NDUEZSQUcpIHsKKwkJLyogcHV0IGl0IG9uIHRoZSBjaGFubmVsIHF1ZXVlICovCisJCXNrYl9xdWV1ZV90YWlsKCZwY2gtPmZpbGUucnEsIHNrYik7CisJCS8qIGRyb3Agb2xkIGZyYW1lcyBpZiBxdWV1ZSB0b28gbG9uZyAqLworCQl3aGlsZSAocGNoLT5maWxlLnJxLnFsZW4gPiBQUFBfTUFYX1JRTEVOCisJCSAgICAgICAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnBjaC0+ZmlsZS5ycSkpICE9IDApCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwY2gtPmZpbGUucndhaXQpOworCX0gZWxzZSB7CisJCXBwcF9kb19yZWN2KHBjaC0+cHBwLCBza2IsIHBjaCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7Cit9CisKKy8qIFB1dCBhIDAtbGVuZ3RoIHNrYiBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBhcyBhbiBlcnJvciBpbmRpY2F0aW9uICovCit2b2lkCitwcHBfaW5wdXRfZXJyb3Ioc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoID0gY2hhbi0+cHBwOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAocGNoID09IDApCisJCXJldHVybjsKKworCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCWlmIChwY2gtPnBwcCAhPSAwKSB7CisJCXNrYiA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYiAhPSAwKSB7CisJCQlza2ItPmxlbiA9IDA7CQkvKiBwcm9iYWJseSB1bm5lY2Vzc2FyeSAqLworCQkJc2tiLT5jYlswXSA9IGNvZGU7CisJCQlwcHBfZG9fcmVjdihwY2gtPnBwcCwgc2tiLCBwY2gpOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7Cit9CisKKy8qCisgKiBXZSBjb21lIGluIGhlcmUgdG8gcHJvY2VzcyBhIHJlY2VpdmVkIGZyYW1lLgorICogVGhlIHJlY2VpdmUgc2lkZSBvZiB0aGUgcHBwIHVuaXQgaXMgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZAorcHBwX3JlY2VpdmVfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2hhbm5lbCAqcGNoKQoreworCWlmIChza2ItPmxlbiA+PSAyKSB7CisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwkJLyogWFhYIGRvIGNoYW5uZWwtbGV2ZWwgZGVjb21wcmVzc2lvbiBoZXJlICovCisJCWlmIChQUFBfUFJPVE8oc2tiKSA9PSBQUFBfTVApCisJCQlwcHBfcmVjZWl2ZV9tcF9mcmFtZShwcHAsIHNrYiwgcGNoKTsKKwkJZWxzZQorI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJCQlwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShwcHAsIHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPiAwKQorCQkvKiBub3RlOiBhIDAtbGVuZ3RoIHNrYiBpcyB1c2VkIGFzIGFuIGVycm9yIGluZGljYXRpb24gKi8KKwkJKytwcHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlwcHBfcmVjZWl2ZV9lcnJvcihwcHApOworfQorCitzdGF0aWMgdm9pZAorcHBwX3JlY2VpdmVfZXJyb3Ioc3RydWN0IHBwcCAqcHBwKQoreworCSsrcHBwLT5zdGF0cy5yeF9lcnJvcnM7CisJaWYgKHBwcC0+dmogIT0gMCkKKwkJc2xoY190b3NzKHBwcC0+dmopOworfQorCitzdGF0aWMgdm9pZAorcHBwX3JlY2VpdmVfbm9ubXBfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpuczsKKwlpbnQgcHJvdG8sIGxlbiwgbnBpOworCisJLyoKKwkgKiBEZWNvbXByZXNzIHRoZSBmcmFtZSwgaWYgY29tcHJlc3NlZC4KKwkgKiBOb3RlIHRoYXQgc29tZSBkZWNvbXByZXNzb3JzIG5lZWQgdG8gc2VlIHVuY29tcHJlc3NlZCBmcmFtZXMKKwkgKiB0aGF0IGNvbWUgaW4gYXMgd2VsbCBhcyBjb21wcmVzc2VkIGZyYW1lcy4KKwkgKi8KKwlpZiAocHBwLT5yY19zdGF0ZSAhPSAwICYmIChwcHAtPnJzdGF0ZSAmIFNDX0RFQ09NUF9SVU4pCisJICAgICYmIChwcHAtPnJzdGF0ZSAmIChTQ19EQ19GRVJST1IgfCBTQ19EQ19FUlJPUikpID09IDApCisJCXNrYiA9IHBwcF9kZWNvbXByZXNzX2ZyYW1lKHBwcCwgc2tiKTsKKworCXByb3RvID0gUFBQX1BST1RPKHNrYik7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX1ZKQ19DT01QOgorCQkvKiBkZWNvbXByZXNzIFZKIGNvbXByZXNzZWQgcGFja2V0cyAqLworCQlpZiAocHBwLT52aiA9PSAwIHx8IChwcHAtPmZsYWdzICYgU0NfUkVKX0NPTVBfVENQKSkKKwkJCWdvdG8gZXJyOworCisJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDEyNCkgeworCQkJLyogY29weSB0byBhIG5ldyBza19idWZmIHdpdGggbW9yZSB0YWlscm9vbSAqLworCQkJbnMgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuICsgMTI4KTsKKwkJCWlmIChucyA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIlBQUDogbm8gbWVtb3J5IChWSiBkZWNvbXApXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKG5zLCAyKTsKKwkJCXNrYl9jb3B5X2JpdHMoc2tiLCAwLCBza2JfcHV0KG5zLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJc2tiID0gbnM7CisJCX0KKwkJZWxzZSBpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2ItPmxlbikpCisJCQlnb3RvIGVycjsKKworCQlsZW4gPSBzbGhjX3VuY29tcHJlc3MocHBwLT52aiwgc2tiLT5kYXRhICsgMiwgc2tiLT5sZW4gLSAyKTsKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiBWSiBkZWNvbXByZXNzaW9uIGVycm9yXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWxlbiArPSAyOworCQlpZiAobGVuID4gc2tiLT5sZW4pCisJCQlza2JfcHV0KHNrYiwgbGVuIC0gc2tiLT5sZW4pOworCQllbHNlIGlmIChsZW4gPCBza2ItPmxlbikKKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJcHJvdG8gPSBQUFBfSVA7CisJCWJyZWFrOworCisJY2FzZSBQUFBfVkpDX1VOQ09NUDoKKwkJaWYgKHBwcC0+dmogPT0gMCB8fCAocHBwLT5mbGFncyAmIFNDX1JFSl9DT01QX1RDUCkpCisJCQlnb3RvIGVycjsKKwkJCisJCS8qIFVudGlsIHdlIGZpeCB0aGUgZGVjb21wcmVzc29yIG5lZWQgdG8gbWFrZSBzdXJlCisJCSAqIGRhdGEgcG9ydGlvbiBpcyBsaW5lYXIuCisJCSAqLworCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2ItPmxlbikpIAorCQkJZ290byBlcnI7CisKKwkJaWYgKHNsaGNfcmVtZW1iZXIocHBwLT52aiwgc2tiLT5kYXRhICsgMiwgc2tiLT5sZW4gLSAyKSA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBQUDogVkogdW5jb21wcmVzc2VkIGVycm9yXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXByb3RvID0gUFBQX0lQOworCQlicmVhazsKKworCWNhc2UgUFBQX0NDUDoKKwkJcHBwX2NjcF9wZWVrKHBwcCwgc2tiLCAxKTsKKwkJYnJlYWs7CisJfQorCisJKytwcHAtPnN0YXRzLnJ4X3BhY2tldHM7CisJcHBwLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbiAtIDI7CisKKwlucGkgPSBwcm90b190b19ucGluZGV4KHByb3RvKTsKKwlpZiAobnBpIDwgMCkgeworCQkvKiBjb250cm9sIG9yIHVua25vd24gZnJhbWUgLSBwYXNzIGl0IHRvIHBwcGQgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJnBwcC0+ZmlsZS5ycSwgc2tiKTsKKwkJLyogbGltaXQgcXVldWUgbGVuZ3RoIGJ5IGRyb3BwaW5nIG9sZCBmcmFtZXMgKi8KKwkJd2hpbGUgKHBwcC0+ZmlsZS5ycS5xbGVuID4gUFBQX01BWF9SUUxFTgorCQkgICAgICAgJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZwcHAtPmZpbGUucnEpKSAhPSAwKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCS8qIHdha2UgdXAgYW55IHByb2Nlc3MgcG9sbGluZyBvciBibG9ja2luZyBvbiByZWFkICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKworCX0gZWxzZSB7CisJCS8qIG5ldHdvcmsgcHJvdG9jb2wgZnJhbWUgLSBnaXZlIGl0IHRvIHRoZSBrZXJuZWwgKi8KKworI2lmZGVmIENPTkZJR19QUFBfRklMVEVSCisJCS8qIGNoZWNrIGlmIHRoZSBwYWNrZXQgcGFzc2VzIHRoZSBwYXNzIGFuZCBhY3RpdmUgZmlsdGVycyAqLworCQkvKiB0aGUgZmlsdGVyIGluc3RydWN0aW9ucyBhcmUgY29uc3RydWN0ZWQgYXNzdW1pbmcKKwkJICAgYSBmb3VyLWJ5dGUgUFBQIGhlYWRlciBvbiBlYWNoIHBhY2tldCAqLworCQkqc2tiX3B1c2goc2tiLCAyKSA9IDA7CisJCWlmIChwcHAtPnBhc3NfZmlsdGVyCisJCSAgICAmJiBza19ydW5fZmlsdGVyKHNrYiwgcHBwLT5wYXNzX2ZpbHRlciwKKwkJCQkgICAgIHBwcC0+cGFzc19sZW4pID09IDApIHsKKwkJCWlmIChwcHAtPmRlYnVnICYgMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiBpbmJvdW5kIGZyYW1lIG5vdCBwYXNzZWRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCEocHBwLT5hY3RpdmVfZmlsdGVyCisJCSAgICAgICYmIHNrX3J1bl9maWx0ZXIoc2tiLCBwcHAtPmFjdGl2ZV9maWx0ZXIsCisJCQkJICAgICAgIHBwcC0+YWN0aXZlX2xlbikgPT0gMCkpCisJCQlwcHAtPmxhc3RfcmVjdiA9IGppZmZpZXM7CisJCXNrYl9wdWxsKHNrYiwgMik7CisjZWxzZQorCQlwcHAtPmxhc3RfcmVjdiA9IGppZmZpZXM7CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KKworCQlpZiAoKHBwcC0+ZGV2LT5mbGFncyAmIElGRl9VUCkgPT0gMAorCQkgICAgfHwgcHBwLT5ucG1vZGVbbnBpXSAhPSBOUE1PREVfUEFTUykgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0gZWxzZSB7CisJCQlza2JfcHVsbChza2IsIDIpOwkvKiBjaG9wIG9mZiBwcm90b2NvbCAqLworCQkJc2tiLT5kZXYgPSBwcHAtPmRldjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhucGluZGV4X3RvX2V0aGVydHlwZVtucGldKTsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+aW5wdXRfZGV2ID0gcHBwLT5kZXY7CisJCQluZXRpZl9yeChza2IpOworCQkJcHBwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJfQorCXJldHVybjsKKworIGVycjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlwcHBfcmVjZWl2ZV9lcnJvcihwcHApOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcHBwX2RlY29tcHJlc3NfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBwcm90byA9IFBQUF9QUk9UTyhza2IpOworCXN0cnVjdCBza19idWZmICpuczsKKwlpbnQgbGVuOworCisJLyogVW50aWwgd2UgZml4IGFsbCB0aGUgZGVjb21wcmVzc29yJ3MgbmVlZCB0byBtYWtlIHN1cmUKKwkgKiBkYXRhIHBvcnRpb24gaXMgbGluZWFyLgorCSAqLworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKKwkJZ290byBlcnI7CisKKwlpZiAocHJvdG8gPT0gUFBQX0NPTVApIHsKKwkJbnMgPSBkZXZfYWxsb2Nfc2tiKHBwcC0+bXJ1ICsgUFBQX0hEUkxFTik7CisJCWlmIChucyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBwcF9kZWNvbXByZXNzX2ZyYW1lOiBubyBtZW1vcnlcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogdGhlIGRlY29tcHJlc3NvciBzdGlsbCBleHBlY3RzIHRoZSBBL0MgYnl0ZXMgaW4gdGhlIGhkciAqLworCQlsZW4gPSBwcHAtPnJjb21wLT5kZWNvbXByZXNzKHBwcC0+cmNfc3RhdGUsIHNrYi0+ZGF0YSAtIDIsCisJCQkJc2tiLT5sZW4gKyAyLCBucy0+ZGF0YSwgcHBwLT5tcnUgKyBQUFBfSERSTEVOKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCS8qIFBhc3MgdGhlIGNvbXByZXNzZWQgZnJhbWUgdG8gcHBwZCBhcyBhbgorCQkJICAgZXJyb3IgaW5kaWNhdGlvbi4gKi8KKwkJCWlmIChsZW4gPT0gREVDT01QX0ZBVEFMRVJST1IpCisJCQkJcHBwLT5yc3RhdGUgfD0gU0NfRENfRkVSUk9SOworCQkJa2ZyZWVfc2tiKG5zKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5zOworCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJc2tiX3B1bGwoc2tiLCAyKTsJLyogcHVsbCBvZmYgdGhlIEEvQyBieXRlcyAqLworCisJfSBlbHNlIHsKKwkJLyogVW5jb21wcmVzc2VkIGZyYW1lIC0gcGFzcyB0byBkZWNvbXByZXNzb3Igc28gaXQKKwkJICAgY2FuIHVwZGF0ZSBpdHMgZGljdGlvbmFyeSBpZiBuZWNlc3NhcnkuICovCisJCWlmIChwcHAtPnJjb21wLT5pbmNvbXApCisJCQlwcHAtPnJjb21wLT5pbmNvbXAocHBwLT5yY19zdGF0ZSwgc2tiLT5kYXRhIC0gMiwKKwkJCQkJICAgc2tiLT5sZW4gKyAyKTsKKwl9CisKKwlyZXR1cm4gc2tiOworCisgZXJyOgorCXBwcC0+cnN0YXRlIHw9IFNDX0RDX0VSUk9SOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7CisJcmV0dXJuIHNrYjsKK30KKworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisvKgorICogUmVjZWl2ZSBhIG11bHRpbGluayBmcmFtZS4KKyAqIFdlIHB1dCBpdCBvbiB0aGUgcmVjb25zdHJ1Y3Rpb24gcXVldWUgYW5kIHRoZW4gcHVsbCBvZmYKKyAqIGFzIG1hbnkgY29tcGxldGVkIGZyYW1lcyBhcyB3ZSBjYW4uCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJdTMyIG1hc2ssIHNlcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCWludCBtcGhkcmxlbiA9IChwcHAtPmZsYWdzICYgU0NfTVBfU0hPUlRTRVEpPyBNUEhEUkxFTl9TU046IE1QSERSTEVOOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgbXBoZHJsZW4gKyAxKSB8fCBwcHAtPm1ycnUgPT0gMCkKKwkJZ290byBlcnI7CQkvKiBubyBnb29kLCB0aHJvdyBpdCBhd2F5ICovCisKKwkvKiBEZWNvZGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBiZWdpbi9lbmQgYml0cyAqLworCWlmIChwcHAtPmZsYWdzICYgU0NfTVBfU0hPUlRTRVEpIHsKKwkJc2VxID0gKChza2ItPmRhdGFbMl0gJiAweDBmKSA8PCA4KSB8IHNrYi0+ZGF0YVszXTsKKwkJbWFzayA9IDB4ZmZmOworCX0gZWxzZSB7CisJCXNlcSA9IChza2ItPmRhdGFbM10gPDwgMTYpIHwgKHNrYi0+ZGF0YVs0XSA8PCA4KXwgc2tiLT5kYXRhWzVdOworCQltYXNrID0gMHhmZmZmZmY7CisJfQorCXNrYi0+QkViaXRzID0gc2tiLT5kYXRhWzJdOworCXNrYl9wdWxsKHNrYiwgbXBoZHJsZW4pOwkvKiBwdWxsIG9mZiBQUFAgYW5kIE1QIGhlYWRlcnMgKi8KKworCS8qCisJICogRG8gcHJvdG9jb2wgSUQgZGVjb21wcmVzc2lvbiBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgZWFjaCBwYWNrZXQuCisJICovCisJaWYgKChza2ItPkJFYml0cyAmIEIpICYmIChza2ItPmRhdGFbMF0gJiAxKSkKKwkJKnNrYl9wdXNoKHNrYiwgMSkgPSAwOworCisJLyoKKwkgKiBFeHBhbmQgc2VxdWVuY2UgbnVtYmVyIHRvIDMyIGJpdHMsIG1ha2luZyBpdCBhcyBjbG9zZQorCSAqIGFzIHBvc3NpYmxlIHRvIHBwcC0+bWluc2VxLgorCSAqLworCXNlcSB8PSBwcHAtPm1pbnNlcSAmIH5tYXNrOworCWlmICgoaW50KShwcHAtPm1pbnNlcSAtIHNlcSkgPiAoaW50KShtYXNrID4+IDEpKQorCQlzZXEgKz0gbWFzayArIDE7CisJZWxzZSBpZiAoKGludCkoc2VxIC0gcHBwLT5taW5zZXEpID4gKGludCkobWFzayA+PiAxKSkKKwkJc2VxIC09IG1hc2sgKyAxOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJc2tiLT5zZXF1ZW5jZSA9IHNlcTsKKwlwY2gtPmxhc3RzZXEgPSBzZXE7CisKKwkvKgorCSAqIElmIHRoaXMgcGFja2V0IGNvbWVzIGJlZm9yZSB0aGUgbmV4dCBvbmUgd2Ugd2VyZSBleHBlY3RpbmcsCisJICogZHJvcCBpdC4KKwkgKi8KKwlpZiAoc2VxX2JlZm9yZShzZXEsIHBwcC0+bmV4dHNlcSkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCSsrcHBwLT5zdGF0cy5yeF9kcm9wcGVkOworCQlwcHBfcmVjZWl2ZV9lcnJvcihwcHApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBSZWV2YWx1YXRlIG1pbnNlcSwgdGhlIG1pbmltdW0gb3ZlciBhbGwgY2hhbm5lbHMgb2YgdGhlCisJICogbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQgb24gZWFjaCBjaGFubmVsLiAgQmVjYXVzZSBvZgorCSAqIHRoZSBpbmNyZWFzaW5nIHNlcXVlbmNlIG51bWJlciBydWxlLCB3ZSBrbm93IHRoYXQgYW55IGZyYWdtZW50CisJICogYmVmb3JlIGBtaW5zZXEnIHdoaWNoIGhhc24ndCBhcnJpdmVkIGlzIG5ldmVyIGdvaW5nIHRvIGFycml2ZS4KKwkgKiBUaGUgbGlzdCBvZiBjaGFubmVscyBjYW4ndCBjaGFuZ2UgYmVjYXVzZSB3ZSBoYXZlIHRoZSByZWNlaXZlCisJICogc2lkZSBvZiB0aGUgcHBwIHVuaXQgbG9ja2VkLgorCSAqLworCWZvciAobCA9IHBwcC0+Y2hhbm5lbHMubmV4dDsgbCAhPSAmcHBwLT5jaGFubmVsczsgbCA9IGwtPm5leHQpIHsKKwkJc3RydWN0IGNoYW5uZWwgKmNoID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOworCQlpZiAoc2VxX2JlZm9yZShjaC0+bGFzdHNlcSwgc2VxKSkKKwkJCXNlcSA9IGNoLT5sYXN0c2VxOworCX0KKwlpZiAoc2VxX2JlZm9yZShwcHAtPm1pbnNlcSwgc2VxKSkKKwkJcHBwLT5taW5zZXEgPSBzZXE7CisKKwkvKiBQdXQgdGhlIGZyYWdtZW50IG9uIHRoZSByZWNvbnN0cnVjdGlvbiBxdWV1ZSAqLworCXBwcF9tcF9pbnNlcnQocHBwLCBza2IpOworCisJLyogSWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgbG9uZywgZG9uJ3Qgd2FpdCBhbnkgbG9uZ2VyIGZvciBwYWNrZXRzCisJICAgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcXVldWUuICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnBwcC0+bXJxKSA+PSBQUFBfTVBfTUFYX1FMRU4KKwkgICAgJiYgc2VxX2JlZm9yZShwcHAtPm1pbnNlcSwgcHBwLT5tcnEubmV4dC0+c2VxdWVuY2UpKQorCQlwcHAtPm1pbnNlcSA9IHBwcC0+bXJxLm5leHQtPnNlcXVlbmNlOworCisJLyogUHVsbCBjb21wbGV0ZWQgcGFja2V0cyBvZmYgdGhlIHF1ZXVlIGFuZCByZWNlaXZlIHRoZW0uICovCisJd2hpbGUgKChza2IgPSBwcHBfbXBfcmVjb25zdHJ1Y3QocHBwKSkgIT0gMCkKKwkJcHBwX3JlY2VpdmVfbm9ubXBfZnJhbWUocHBwLCBza2IpOworCisJcmV0dXJuOworCisgZXJyOgorCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBmcmFnbWVudCBvbiB0aGUgTVAgcmVjb25zdHJ1Y3Rpb24gcXVldWUuCisgKiBUaGUgcXVldWUgaXMgb3JkZXJlZCBieSBpbmNyZWFzaW5nIHNlcXVlbmNlIG51bWJlci4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9tcF9pbnNlcnQoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpwOworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSAmcHBwLT5tcnE7CisJdTMyIHNlcSA9IHNrYi0+c2VxdWVuY2U7CisKKwkvKiBOLkIuIHdlIGRvbid0IG5lZWQgdG8gbG9jayB0aGUgbGlzdCBsb2NrIGJlY2F1c2Ugd2UgaGF2ZSB0aGUKKwkgICBwcHAgdW5pdCByZWNlaXZlLXNpZGUgbG9jay4gKi8KKwlmb3IgKHAgPSBsaXN0LT5uZXh0OyBwICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKWxpc3Q7IHAgPSBwLT5uZXh0KQorCQlpZiAoc2VxX2JlZm9yZShzZXEsIHAtPnNlcXVlbmNlKSkKKwkJCWJyZWFrOworCV9fc2tiX2luc2VydChza2IsIHAtPnByZXYsIHAsIGxpc3QpOworfQorCisvKgorICogUmVjb25zdHJ1Y3QgYSBwYWNrZXQgZnJvbSB0aGUgTVAgZnJhZ21lbnQgcXVldWUuCisgKiBXZSBnbyB0aHJvdWdoIGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVycyB1bnRpbCB3ZSBmaW5kIGEKKyAqIGNvbXBsZXRlIHBhY2tldCwgb3Igd2UgZ2V0IHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIGEgZnJhZ21lbnQKKyAqIHdoaWNoIGhhc24ndCBhcnJpdmVkIGJ1dCBtaWdodCBzdGlsbCBkbyBzby4KKyAqLworc3RydWN0IHNrX2J1ZmYgKgorcHBwX21wX3JlY29uc3RydWN0KHN0cnVjdCBwcHAgKnBwcCkKK3sKKwl1MzIgc2VxID0gcHBwLT5uZXh0c2VxOworCXUzMiBtaW5zZXEgPSBwcHAtPm1pbnNlcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnBwcC0+bXJxOworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgKnRhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJaW50IGxvc3QgPSAwLCBsZW4gPSAwOworCisJaWYgKHBwcC0+bXJydSA9PSAwKQkvKiBkbyBub3RoaW5nIHVudGlsIG1ycnUgaXMgc2V0ICovCisJCXJldHVybiBOVUxMOworCWhlYWQgPSBsaXN0LT5uZXh0OworCXRhaWwgPSBOVUxMOworCWZvciAocCA9IGhlYWQ7IHAgIT0gKHN0cnVjdCBza19idWZmICopIGxpc3Q7IHAgPSBuZXh0KSB7CisJCW5leHQgPSBwLT5uZXh0OworCQlpZiAoc2VxX2JlZm9yZShwLT5zZXF1ZW5jZSwgc2VxKSkgeworCQkJLyogdGhpcyBjYW4ndCBoYXBwZW4sIGFueXdheSBpZ25vcmUgdGhlIHNrYiAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJwcHBfbXBfcmVjb25zdHJ1Y3QgYmFkIHNlcSAldSA8ICV1XG4iLAorCQkJICAgICAgIHAtPnNlcXVlbmNlLCBzZXEpOworCQkJaGVhZCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocC0+c2VxdWVuY2UgIT0gc2VxKSB7CisJCQkvKiBGcmFnbWVudCBgc2VxJyBpcyBtaXNzaW5nLiAgSWYgaXQgaXMgYWZ0ZXIKKwkJCSAgIG1pbnNlcSwgaXQgbWlnaHQgYXJyaXZlIGxhdGVyLCBzbyBzdG9wIGhlcmUuICovCisJCQlpZiAoc2VxX2FmdGVyKHNlcSwgbWluc2VxKSkKKwkJCQlicmVhazsKKwkJCS8qIEZyYWdtZW50IGBzZXEnIGlzIGxvc3QsIGtlZXAgZ29pbmcuICovCisJCQlsb3N0ID0gMTsKKwkJCXNlcSA9IHNlcV9iZWZvcmUobWluc2VxLCBwLT5zZXF1ZW5jZSk/CisJCQkJbWluc2VxICsgMTogcC0+c2VxdWVuY2U7CisJCQluZXh0ID0gcDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgYWxsIHRoZSBmcmFnbWVudHMgZnJvbQorCQkgKiBwcHAtPm5leHRzZXEgdG8gc2VxIGFyZSBlaXRoZXIgcHJlc2VudCBvciBsb3N0LgorCQkgKiBBbHNvLCB0aGVyZSBhcmUgbm8gY29tcGxldGUgcGFja2V0cyBpbiB0aGUgcXVldWUKKwkJICogdGhhdCBoYXZlIG5vIG1pc3NpbmcgZnJhZ21lbnRzIGFuZCBlbmQgYmVmb3JlIHRoaXMKKwkJICogZnJhZ21lbnQuCisJCSAqLworCisJCS8qIEIgYml0IHNldCBpbmRpY2F0ZXMgdGhpcyBmcmFnbWVudCBzdGFydHMgYSBwYWNrZXQgKi8KKwkJaWYgKHAtPkJFYml0cyAmIEIpIHsKKwkJCWhlYWQgPSBwOworCQkJbG9zdCA9IDA7CisJCQlsZW4gPSAwOworCQl9CisKKwkJbGVuICs9IHAtPmxlbjsKKworCQkvKiBHb3QgYSBjb21wbGV0ZSBwYWNrZXQgeWV0PyAqLworCQlpZiAobG9zdCA9PSAwICYmIChwLT5CRWJpdHMgJiBFKSAmJiAoaGVhZC0+QkViaXRzICYgQikpIHsKKwkJCWlmIChsZW4gPiBwcHAtPm1ycnUgKyAyKSB7CisJCQkJKytwcHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUDogcmVjb25zdHJ1Y3RlZCBwYWNrZXQiCisJCQkJICAgICAgICIgaXMgdG9vIGxvbmcgKCVkKVxuIiwgbGVuKTsKKwkJCX0gZWxzZSBpZiAocCA9PSBoZWFkKSB7CisJCQkJLyogZnJhZ21lbnQgaXMgY29tcGxldGUgcGFja2V0IC0gcmV1c2Ugc2tiICovCisJCQkJdGFpbCA9IHA7CisJCQkJc2tiID0gc2tiX2dldChwKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKHNrYiA9IGRldl9hbGxvY19za2IobGVuKSkgPT0gTlVMTCkgeworCQkJCSsrcHBwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJQUFA6IG5vIG1lbW9yeSBmb3IgIgorCQkJCSAgICAgICAicmVjb25zdHJ1Y3RlZCBwYWNrZXQiKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFpbCA9IHA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcHAtPm5leHRzZXEgPSBzZXEgKyAxOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgZW5kaW5nIGZyYWdtZW50IG9mIGEgcGFja2V0LAorCQkgKiBhbmQgd2UgaGF2ZW4ndCBmb3VuZCBhIGNvbXBsZXRlIHZhbGlkIHBhY2tldCB5ZXQsCisJCSAqIHdlIGNhbiBkaXNjYXJkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBmcmFnbWVudC4KKwkJICovCisJCWlmIChwLT5CRWJpdHMgJiBFKQorCQkJaGVhZCA9IG5leHQ7CisKKwkJKytzZXE7CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIGNvbXBsZXRlIHBhY2tldCwgY29weSBpdCBhbGwgaW50byBvbmUgc2tiLiAqLworCWlmICh0YWlsICE9IE5VTEwpIHsKKwkJLyogSWYgd2UgaGF2ZSBkaXNjYXJkZWQgYW55IGZyYWdtZW50cywKKwkJICAgc2lnbmFsIGEgcmVjZWl2ZSBlcnJvci4gKi8KKwkJaWYgKGhlYWQtPnNlcXVlbmNlICE9IHBwcC0+bmV4dHNlcSkgeworCQkJaWYgKHBwcC0+ZGVidWcgJiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG1pc3NlZCBwa3RzICV1Li4ldVxuIiwKKwkJCQkgICAgICAgcHBwLT5uZXh0c2VxLCBoZWFkLT5zZXF1ZW5jZS0xKTsKKwkJCSsrcHBwLT5zdGF0cy5yeF9kcm9wcGVkOworCQkJcHBwX3JlY2VpdmVfZXJyb3IocHBwKTsKKwkJfQorCisJCWlmIChoZWFkICE9IHRhaWwpCisJCQkvKiBjb3B5IHRvIGEgc2luZ2xlIHNrYiAqLworCQkJZm9yIChwID0gaGVhZDsgcCAhPSB0YWlsLT5uZXh0OyBwID0gcC0+bmV4dCkKKwkJCQlza2JfY29weV9iaXRzKHAsIDAsIHNrYl9wdXQoc2tiLCBwLT5sZW4pLCBwLT5sZW4pOworCQlwcHAtPm5leHRzZXEgPSB0YWlsLT5zZXF1ZW5jZSArIDE7CisJCWhlYWQgPSB0YWlsLT5uZXh0OworCX0KKworCS8qIERpc2NhcmQgYWxsIHRoZSBza2J1ZmZzIHRoYXQgd2UgaGF2ZSBjb3BpZWQgdGhlIGRhdGEgb3V0IG9mCisJICAgb3IgdGhhdCB3ZSBjYW4ndCB1c2UuICovCisJd2hpbGUgKChwID0gbGlzdC0+bmV4dCkgIT0gaGVhZCkgeworCQlfX3NrYl91bmxpbmsocCwgbGlzdCk7CisJCWtmcmVlX3NrYihwKTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisKKy8qCisgKiBDaGFubmVsIGludGVyZmFjZS4KKyAqLworCisvKgorICogQ3JlYXRlIGEgbmV3LCB1bmF0dGFjaGVkIHBwcCBjaGFubmVsLgorICovCitpbnQKK3BwcF9yZWdpc3Rlcl9jaGFubmVsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoOworCisJcGNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGNoID09IDApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwY2gsIDAsIHNpemVvZihzdHJ1Y3QgY2hhbm5lbCkpOworCXBjaC0+cHBwID0gTlVMTDsKKwlwY2gtPmNoYW4gPSBjaGFuOworCWNoYW4tPnBwcCA9IHBjaDsKKwlpbml0X3BwcF9maWxlKCZwY2gtPmZpbGUsIENIQU5ORUwpOworCXBjaC0+ZmlsZS5oZHJsZW4gPSBjaGFuLT5oZHJsZW47CisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwlwY2gtPmxhc3RzZXEgPSAtMTsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworCWluaXRfcndzZW0oJnBjaC0+Y2hhbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZwY2gtPmRvd25sKTsKKwlyd2xvY2tfaW5pdCgmcGNoLT51cGwpOworCXNwaW5fbG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCXBjaC0+ZmlsZS5pbmRleCA9ICsrbGFzdF9jaGFubmVsX2luZGV4OworCWxpc3RfYWRkKCZwY2gtPmxpc3QsICZuZXdfY2hhbm5lbHMpOworCWF0b21pY19pbmMoJmNoYW5uZWxfY291bnQpOworCXNwaW5fdW5sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIGEgY2hhbm5lbC4KKyAqLworaW50IHBwcF9jaGFubmVsX2luZGV4KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoID0gY2hhbi0+cHBwOworCisJaWYgKHBjaCAhPSAwKQorCQlyZXR1cm4gcGNoLT5maWxlLmluZGV4OworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgUFBQIHVuaXQgbnVtYmVyIHRvIHdoaWNoIGEgY2hhbm5lbCBpcyBjb25uZWN0ZWQuCisgKi8KK2ludCBwcHBfdW5pdF9udW1iZXIoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisJaW50IHVuaXQgPSAtMTsKKworCWlmIChwY2ggIT0gMCkgeworCQlyZWFkX2xvY2tfYmgoJnBjaC0+dXBsKTsKKwkJaWYgKHBjaC0+cHBwICE9IDApCisJCQl1bml0ID0gcGNoLT5wcHAtPmZpbGUuaW5kZXg7CisJCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisJfQorCXJldHVybiB1bml0OworfQorCisvKgorICogRGlzY29ubmVjdCBhIGNoYW5uZWwgZnJvbSB0aGUgZ2VuZXJpYyBsYXllci4KKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LgorICovCit2b2lkCitwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoID0gY2hhbi0+cHBwOworCisJaWYgKHBjaCA9PSAwKQorCQlyZXR1cm47CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJY2hhbi0+cHBwID0gTlVMTDsKKworCS8qCisJICogVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSByZXR1cm5lZCBmcm9tIGFueSBjYWxscyBpbnRvIHRoZQorCSAqIHRoZSBjaGFubmVsJ3Mgc3RhcnRfeG1pdCBvciBpb2N0bCByb3V0aW5lIGJlZm9yZSB3ZSBwcm9jZWVkLgorCSAqLworCWRvd25fd3JpdGUoJnBjaC0+Y2hhbl9zZW0pOworCXNwaW5fbG9ja19iaCgmcGNoLT5kb3dubCk7CisJcGNoLT5jaGFuID0gTlVMTDsKKwlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJdXBfd3JpdGUoJnBjaC0+Y2hhbl9zZW0pOworCXBwcF9kaXNjb25uZWN0X2NoYW5uZWwocGNoKTsKKwlzcGluX2xvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwlsaXN0X2RlbCgmcGNoLT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCXBjaC0+ZmlsZS5kZWFkID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBjaC0+ZmlsZS5yd2FpdCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBjaC0+ZmlsZS5yZWZjbnQpKQorCQlwcHBfZGVzdHJveV9jaGFubmVsKHBjaCk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBmcm9tIGEgY2hhbm5lbCB3aGVuIGl0IGNhbiBhY2NlcHQgbW9yZSB0byB0cmFuc21pdC4KKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhdCBCSC9zb2Z0aXJxIGxldmVsLCBub3QgaW50ZXJydXB0IGxldmVsLgorICovCit2b2lkCitwcHBfb3V0cHV0X3dha2V1cChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaCA9IGNoYW4tPnBwcDsKKworCWlmIChwY2ggPT0gMCkKKwkJcmV0dXJuOworCXBwcF9jaGFubmVsX3B1c2gocGNoKTsKK30KKworLyoKKyAqIENvbXByZXNzaW9uIGNvbnRyb2wuCisgKi8KKworLyogUHJvY2VzcyB0aGUgUFBQSU9DU0NPTVBSRVNTIGlvY3RsLiAqLworc3RhdGljIGludAorcHBwX3NldF9jb21wcmVzcyhzdHJ1Y3QgcHBwICpwcHAsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisJc3RydWN0IGNvbXByZXNzb3IgKmNwLCAqb2NvbXA7CisJc3RydWN0IHBwcF9vcHRpb25fZGF0YSBkYXRhOworCXZvaWQgKnN0YXRlLCAqb3N0YXRlOworCXVuc2lnbmVkIGNoYXIgY2NwX29wdGlvbltDQ1BfTUFYX09QVElPTl9MRU5HVEhdOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihkYXRhKSkKKwkgICAgfHwgKGRhdGEubGVuZ3RoIDw9IENDUF9NQVhfT1BUSU9OX0xFTkdUSAorCQkmJiBjb3B5X2Zyb21fdXNlcihjY3Bfb3B0aW9uLCAodm9pZCBfX3VzZXIgKikgZGF0YS5wdHIsIGRhdGEubGVuZ3RoKSkpCisJCWdvdG8gb3V0OworCWVyciA9IC1FSU5WQUw7CisJaWYgKGRhdGEubGVuZ3RoID4gQ0NQX01BWF9PUFRJT05fTEVOR1RICisJICAgIHx8IGNjcF9vcHRpb25bMV0gPCAyIHx8IGNjcF9vcHRpb25bMV0gPiBkYXRhLmxlbmd0aCkKKwkJZ290byBvdXQ7CisKKwljcCA9IGZpbmRfY29tcHJlc3NvcihjY3Bfb3B0aW9uWzBdKTsKKyNpZmRlZiBDT05GSUdfS01PRAorCWlmIChjcCA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJwcHAtY29tcHJlc3MtJWQiLCBjY3Bfb3B0aW9uWzBdKTsKKwkJY3AgPSBmaW5kX2NvbXByZXNzb3IoY2NwX29wdGlvblswXSk7CisJfQorI2VuZGlmIC8qIENPTkZJR19LTU9EICovCisJaWYgKGNwID09IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT0JVRlM7CisJaWYgKGRhdGEudHJhbnNtaXQpIHsKKwkJc3RhdGUgPSBjcC0+Y29tcF9hbGxvYyhjY3Bfb3B0aW9uLCBkYXRhLmxlbmd0aCk7CisJCWlmIChzdGF0ZSAhPSAwKSB7CisJCQlwcHBfeG1pdF9sb2NrKHBwcCk7CisJCQlwcHAtPnhzdGF0ZSAmPSB+U0NfQ09NUF9SVU47CisJCQlvY29tcCA9IHBwcC0+eGNvbXA7CisJCQlvc3RhdGUgPSBwcHAtPnhjX3N0YXRlOworCQkJcHBwLT54Y29tcCA9IGNwOworCQkJcHBwLT54Y19zdGF0ZSA9IHN0YXRlOworCQkJcHBwX3htaXRfdW5sb2NrKHBwcCk7CisJCQlpZiAob3N0YXRlICE9IDApIHsKKwkJCQlvY29tcC0+Y29tcF9mcmVlKG9zdGF0ZSk7CisJCQkJbW9kdWxlX3B1dChvY29tcC0+b3duZXIpOworCQkJfQorCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQltb2R1bGVfcHV0KGNwLT5vd25lcik7CisKKwl9IGVsc2UgeworCQlzdGF0ZSA9IGNwLT5kZWNvbXBfYWxsb2MoY2NwX29wdGlvbiwgZGF0YS5sZW5ndGgpOworCQlpZiAoc3RhdGUgIT0gMCkgeworCQkJcHBwX3JlY3ZfbG9jayhwcHApOworCQkJcHBwLT5yc3RhdGUgJj0gflNDX0RFQ09NUF9SVU47CisJCQlvY29tcCA9IHBwcC0+cmNvbXA7CisJCQlvc3RhdGUgPSBwcHAtPnJjX3N0YXRlOworCQkJcHBwLT5yY29tcCA9IGNwOworCQkJcHBwLT5yY19zdGF0ZSA9IHN0YXRlOworCQkJcHBwX3JlY3ZfdW5sb2NrKHBwcCk7CisJCQlpZiAob3N0YXRlICE9IDApIHsKKwkJCQlvY29tcC0+ZGVjb21wX2ZyZWUob3N0YXRlKTsKKwkJCQltb2R1bGVfcHV0KG9jb21wLT5vd25lcik7CisJCQl9CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCW1vZHVsZV9wdXQoY3AtPm93bmVyKTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIExvb2sgYXQgYSBDQ1AgcGFja2V0IGFuZCB1cGRhdGUgb3VyIHN0YXRlIGFjY29yZGluZ2x5LgorICogV2UgYXNzdW1lIHRoZSBjYWxsZXIgaGFzIHRoZSB4bWl0IG9yIHJlY3YgcGF0aCBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfY2NwX3BlZWsoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaW5ib3VuZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpkcDsKKwlpbnQgbGVuOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgQ0NQX0hEUkxFTiArIDIpKQorCQlyZXR1cm47CS8qIG5vIGhlYWRlciAqLworCWRwID0gc2tiLT5kYXRhICsgMjsKKworCXN3aXRjaCAoQ0NQX0NPREUoZHApKSB7CisJY2FzZSBDQ1BfQ09ORlJFUToKKworCQkvKiBBIENvbmZSZXEgc3RhcnRzIG5lZ290aWF0aW9uIG9mIGNvbXByZXNzaW9uIAorCQkgKiBpbiBvbmUgZGlyZWN0aW9uIG9mIHRyYW5zbWlzc2lvbiwKKwkJICogYW5kIGhlbmNlIGJyaW5ncyBpdCBkb3duLi4uYnV0IHdoaWNoIHdheT8KKwkJICoKKwkJICogUmVtZW1iZXI6CisJCSAqIEEgQ29uZlJlcSBpbmRpY2F0ZXMgd2hhdCB0aGUgc2VuZGVyIHdvdWxkIGxpa2UgdG8gcmVjZWl2ZQorCQkgKi8KKwkJaWYoaW5ib3VuZCkKKwkJCS8qIEhlIGlzIHByb3Bvc2luZyB3aGF0IEkgc2hvdWxkIHNlbmQgKi8KKwkJCXBwcC0+eHN0YXRlICY9IH5TQ19DT01QX1JVTjsKKwkJZWxzZQkKKwkJCS8qIEkgYW0gcHJvcG9zaW5nIHRvIHdoYXQgaGUgc2hvdWxkIHNlbmQgKi8KKwkJCXBwcC0+cnN0YXRlICY9IH5TQ19ERUNPTVBfUlVOOworCQkKKwkJYnJlYWs7CisJCQorCWNhc2UgQ0NQX1RFUk1SRVE6CisJY2FzZSBDQ1BfVEVSTUFDSzoKKwkJLyoKKwkJICogQ0NQIGlzIGdvaW5nIGRvd24sIGJvdGggZGlyZWN0aW9ucyBvZiB0cmFuc21pc3Npb24gCisJCSAqLworCQlwcHAtPnJzdGF0ZSAmPSB+U0NfREVDT01QX1JVTjsKKwkJcHBwLT54c3RhdGUgJj0gflNDX0NPTVBfUlVOOworCQlicmVhazsKKworCWNhc2UgQ0NQX0NPTkZBQ0s6CisJCWlmICgocHBwLT5mbGFncyAmIChTQ19DQ1BfT1BFTiB8IFNDX0NDUF9VUCkpICE9IFNDX0NDUF9PUEVOKQorCQkJYnJlYWs7CisJCWxlbiA9IENDUF9MRU5HVEgoZHApOworCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBsZW4gKyAyKSkKKwkJCXJldHVybjsJCS8qIHRvbyBzaG9ydCAqLworCQlkcCArPSBDQ1BfSERSTEVOOworCQlsZW4gLT0gQ0NQX0hEUkxFTjsKKwkJaWYgKGxlbiA8IENDUF9PUFRfTUlOTEVOIHx8IGxlbiA8IENDUF9PUFRfTEVOR1RIKGRwKSkKKwkJCWJyZWFrOworCQlpZiAoaW5ib3VuZCkgeworCQkJLyogd2Ugd2lsbCBzdGFydCByZWNlaXZpbmcgY29tcHJlc3NlZCBwYWNrZXRzICovCisJCQlpZiAocHBwLT5yY19zdGF0ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHBwcC0+cmNvbXAtPmRlY29tcF9pbml0KHBwcC0+cmNfc3RhdGUsIGRwLCBsZW4sCisJCQkJCXBwcC0+ZmlsZS5pbmRleCwgMCwgcHBwLT5tcnUsIHBwcC0+ZGVidWcpKSB7CisJCQkJcHBwLT5yc3RhdGUgfD0gU0NfREVDT01QX1JVTjsKKwkJCQlwcHAtPnJzdGF0ZSAmPSB+KFNDX0RDX0VSUk9SIHwgU0NfRENfRkVSUk9SKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHdlIHdpbGwgc29vbiBzdGFydCBzZW5kaW5nIGNvbXByZXNzZWQgcGFja2V0cyAqLworCQkJaWYgKHBwcC0+eGNfc3RhdGUgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChwcHAtPnhjb21wLT5jb21wX2luaXQocHBwLT54Y19zdGF0ZSwgZHAsIGxlbiwKKwkJCQkJcHBwLT5maWxlLmluZGV4LCAwLCBwcHAtPmRlYnVnKSkKKwkJCQlwcHAtPnhzdGF0ZSB8PSBTQ19DT01QX1JVTjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ0NQX1JFU0VUQUNLOgorCQkvKiByZXNldCB0aGUgW2RlXWNvbXByZXNzb3IgKi8KKwkJaWYgKChwcHAtPmZsYWdzICYgU0NfQ0NQX1VQKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChpbmJvdW5kKSB7CisJCQlpZiAocHBwLT5yY19zdGF0ZSAmJiAocHBwLT5yc3RhdGUgJiBTQ19ERUNPTVBfUlVOKSkgeworCQkJCXBwcC0+cmNvbXAtPmRlY29tcF9yZXNldChwcHAtPnJjX3N0YXRlKTsKKwkJCQlwcHAtPnJzdGF0ZSAmPSB+U0NfRENfRVJST1I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocHBwLT54Y19zdGF0ZSAmJiAocHBwLT54c3RhdGUgJiBTQ19DT01QX1JVTikpCisJCQkJcHBwLT54Y29tcC0+Y29tcF9yZXNldChwcHAtPnhjX3N0YXRlKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIEZyZWUgdXAgY29tcHJlc3Npb24gcmVzb3VyY2VzLiAqLworc3RhdGljIHZvaWQKK3BwcF9jY3BfY2xvc2VkKHN0cnVjdCBwcHAgKnBwcCkKK3sKKwl2b2lkICp4c3RhdGUsICpyc3RhdGU7CisJc3RydWN0IGNvbXByZXNzb3IgKnhjb21wLCAqcmNvbXA7CisKKwlwcHBfbG9jayhwcHApOworCXBwcC0+ZmxhZ3MgJj0gfihTQ19DQ1BfT1BFTiB8IFNDX0NDUF9VUCk7CisJcHBwLT54c3RhdGUgPSAwOworCXhjb21wID0gcHBwLT54Y29tcDsKKwl4c3RhdGUgPSBwcHAtPnhjX3N0YXRlOworCXBwcC0+eGNfc3RhdGUgPSBOVUxMOworCXBwcC0+cnN0YXRlID0gMDsKKwlyY29tcCA9IHBwcC0+cmNvbXA7CisJcnN0YXRlID0gcHBwLT5yY19zdGF0ZTsKKwlwcHAtPnJjX3N0YXRlID0gTlVMTDsKKwlwcHBfdW5sb2NrKHBwcCk7CisKKwlpZiAoeHN0YXRlKSB7CisJCXhjb21wLT5jb21wX2ZyZWUoeHN0YXRlKTsKKwkJbW9kdWxlX3B1dCh4Y29tcC0+b3duZXIpOworCX0KKwlpZiAocnN0YXRlKSB7CisJCXJjb21wLT5kZWNvbXBfZnJlZShyc3RhdGUpOworCQltb2R1bGVfcHV0KHJjb21wLT5vd25lcik7CisJfQorfQorCisvKiBMaXN0IG9mIGNvbXByZXNzb3JzLiAqLworc3RhdGljIExJU1RfSEVBRChjb21wcmVzc29yX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb21wcmVzc29yX2xpc3RfbG9jayk7CisKK3N0cnVjdCBjb21wcmVzc29yX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGNvbXByZXNzb3IgKmNvbXA7Cit9OworCitzdGF0aWMgc3RydWN0IGNvbXByZXNzb3JfZW50cnkgKgorZmluZF9jb21wX2VudHJ5KGludCBwcm90bykKK3sKKwlzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9ICZjb21wcmVzc29yX2xpc3Q7CisKKwl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmY29tcHJlc3Nvcl9saXN0KSB7CisJCWNlID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSwgbGlzdCk7CisJCWlmIChjZS0+Y29tcC0+Y29tcHJlc3NfcHJvdG8gPT0gcHJvdG8pCisJCQlyZXR1cm4gY2U7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBSZWdpc3RlciBhIGNvbXByZXNzb3IgKi8KK2ludAorcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3Ioc3RydWN0IGNvbXByZXNzb3IgKmNwKQoreworCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKKwlpbnQgcmV0OworCXNwaW5fbG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCXJldCA9IC1FRVhJU1Q7CisJaWYgKGZpbmRfY29tcF9lbnRyeShjcC0+Y29tcHJlc3NfcHJvdG8pICE9IDApCisJCWdvdG8gb3V0OworCXJldCA9IC1FTk9NRU07CisJY2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSksIEdGUF9BVE9NSUMpOworCWlmIChjZSA9PSAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSAwOworCWNlLT5jb21wID0gY3A7CisJbGlzdF9hZGQoJmNlLT5saXN0LCAmY29tcHJlc3Nvcl9saXN0KTsKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBVbnJlZ2lzdGVyIGEgY29tcHJlc3NvciAqLwordm9pZAorcHBwX3VucmVnaXN0ZXJfY29tcHJlc3NvcihzdHJ1Y3QgY29tcHJlc3NvciAqY3ApCit7CisJc3RydWN0IGNvbXByZXNzb3JfZW50cnkgKmNlOworCisJc3Bpbl9sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7CisJY2UgPSBmaW5kX2NvbXBfZW50cnkoY3AtPmNvbXByZXNzX3Byb3RvKTsKKwlpZiAoY2UgIT0gMCAmJiBjZS0+Y29tcCA9PSBjcCkgeworCQlsaXN0X2RlbCgmY2UtPmxpc3QpOworCQlrZnJlZShjZSk7CisJfQorCXNwaW5fdW5sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7Cit9CisKKy8qIEZpbmQgYSBjb21wcmVzc29yLiAqLworc3RhdGljIHN0cnVjdCBjb21wcmVzc29yICoKK2ZpbmRfY29tcHJlc3NvcihpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqY2U7CisJc3RydWN0IGNvbXByZXNzb3IgKmNwID0gTlVMTDsKKworCXNwaW5fbG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCWNlID0gZmluZF9jb21wX2VudHJ5KHR5cGUpOworCWlmIChjZSAhPSAwKSB7CisJCWNwID0gY2UtPmNvbXA7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoY3AtPm93bmVyKSkKKwkJCWNwID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwlyZXR1cm4gY3A7Cit9CisKKy8qCisgKiBNaXNjZWxsZW5lb3VzIHN0dWZmLgorICovCisKK3N0YXRpYyB2b2lkCitwcHBfZ2V0X3N0YXRzKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHBwcF9zdGF0cyAqc3QpCit7CisJc3RydWN0IHNsY29tcHJlc3MgKnZqID0gcHBwLT52ajsKKworCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOworCXN0LT5wLnBwcF9pcGFja2V0cyA9IHBwcC0+c3RhdHMucnhfcGFja2V0czsKKwlzdC0+cC5wcHBfaWVycm9ycyA9IHBwcC0+c3RhdHMucnhfZXJyb3JzOworCXN0LT5wLnBwcF9pYnl0ZXMgPSBwcHAtPnN0YXRzLnJ4X2J5dGVzOworCXN0LT5wLnBwcF9vcGFja2V0cyA9IHBwcC0+c3RhdHMudHhfcGFja2V0czsKKwlzdC0+cC5wcHBfb2Vycm9ycyA9IHBwcC0+c3RhdHMudHhfZXJyb3JzOworCXN0LT5wLnBwcF9vYnl0ZXMgPSBwcHAtPnN0YXRzLnR4X2J5dGVzOworCWlmICh2aiA9PSAwKQorCQlyZXR1cm47CisJc3QtPnZqLnZqc19wYWNrZXRzID0gdmotPnNsc19vX2NvbXByZXNzZWQgKyB2ai0+c2xzX29fdW5jb21wcmVzc2VkOworCXN0LT52ai52anNfY29tcHJlc3NlZCA9IHZqLT5zbHNfb19jb21wcmVzc2VkOworCXN0LT52ai52anNfc2VhcmNoZXMgPSB2ai0+c2xzX29fc2VhcmNoZXM7CisJc3QtPnZqLnZqc19taXNzZXMgPSB2ai0+c2xzX29fbWlzc2VzOworCXN0LT52ai52anNfZXJyb3JpbiA9IHZqLT5zbHNfaV9lcnJvcjsKKwlzdC0+dmoudmpzX3Rvc3NlZCA9IHZqLT5zbHNfaV90b3NzZWQ7CisJc3QtPnZqLnZqc191bmNvbXByZXNzZWRpbiA9IHZqLT5zbHNfaV91bmNvbXByZXNzZWQ7CisJc3QtPnZqLnZqc19jb21wcmVzc2VkaW4gPSB2ai0+c2xzX2lfY29tcHJlc3NlZDsKK30KKworLyoKKyAqIFN0dWZmIGZvciBoYW5kbGluZyB0aGUgbGlzdHMgb2YgcHBwIHVuaXRzIGFuZCBjaGFubmVscworICogYW5kIGZvciBpbml0aWFsaXphdGlvbi4KKyAqLworCisvKgorICogQ3JlYXRlIGEgbmV3IHBwcCBpbnRlcmZhY2UgdW5pdC4gIEZhaWxzIGlmIGl0IGNhbid0IGFsbG9jYXRlIG1lbW9yeQorICogb3IgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHVuaXQgd2l0aCB0aGUgcmVxdWVzdGVkIG51bWJlci4KKyAqIHVuaXQgPT0gLTEgbWVhbnMgYWxsb2NhdGUgYSBuZXcgbnVtYmVyLgorICovCitzdGF0aWMgc3RydWN0IHBwcCAqCitwcHBfY3JlYXRlX2ludGVyZmFjZShpbnQgdW5pdCwgaW50ICpyZXRwKQoreworCXN0cnVjdCBwcHAgKnBwcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQgaTsKKworCXBwcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwcCkKKwkJZ290byBvdXQ7CisJZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICIiLCBwcHBfc2V0dXApOworCWlmICghZGV2KQorCQlnb3RvIG91dDE7CisJbWVtc2V0KHBwcCwgMCwgc2l6ZW9mKHN0cnVjdCBwcHApKTsKKworCXBwcC0+bXJ1ID0gUFBQX01SVTsKKwlpbml0X3BwcF9maWxlKCZwcHAtPmZpbGUsIElOVEVSRkFDRSk7CisJcHBwLT5maWxlLmhkcmxlbiA9IFBQUF9IRFJMRU4gLSAyOwkvKiBkb24ndCBjb3VudCBwcm90byBieXRlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fTlA7ICsraSkKKwkJcHBwLT5ucG1vZGVbaV0gPSBOUE1PREVfUEFTUzsKKwlJTklUX0xJU1RfSEVBRCgmcHBwLT5jaGFubmVscyk7CisJc3Bpbl9sb2NrX2luaXQoJnBwcC0+cmxvY2spOworCXNwaW5fbG9ja19pbml0KCZwcHAtPndsb2NrKTsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCXBwcC0+bWluc2VxID0gLTE7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHBwLT5tcnEpOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJcHBwLT5kZXYgPSBkZXY7CisJZGV2LT5wcml2ID0gcHBwOworCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBwcHBfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHBwcF9uZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IHBwcF9uZXRfaW9jdGw7CisKKwlyZXQgPSAtRUVYSVNUOworCWRvd24oJmFsbF9wcHBfc2VtKTsKKwlpZiAodW5pdCA8IDApCisJCXVuaXQgPSBjYXJkbWFwX2ZpbmRfZmlyc3RfZnJlZShhbGxfcHBwX3VuaXRzKTsKKwllbHNlIGlmIChjYXJkbWFwX2dldChhbGxfcHBwX3VuaXRzLCB1bml0KSAhPSBOVUxMKQorCQlnb3RvIG91dDI7CS8qIHVuaXQgYWxyZWFkeSBleGlzdHMgKi8KKworCS8qIEluaXRpYWxpemUgdGhlIG5ldyBwcHAgdW5pdCAqLworCXBwcC0+ZmlsZS5pbmRleCA9IHVuaXQ7CisJc3ByaW50ZihkZXYtPm5hbWUsICJwcHAlZCIsIHVuaXQpOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBjb3VsZG4ndCByZWdpc3RlciBkZXZpY2UgJXMgKCVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCWF0b21pY19pbmMoJnBwcF91bml0X2NvdW50KTsKKwljYXJkbWFwX3NldCgmYWxsX3BwcF91bml0cywgdW5pdCwgcHBwKTsKKwl1cCgmYWxsX3BwcF9zZW0pOworCSpyZXRwID0gMDsKKwlyZXR1cm4gcHBwOworCitvdXQyOgorCXVwKCZhbGxfcHBwX3NlbSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK291dDE6CisJa2ZyZWUocHBwKTsKK291dDoKKwkqcmV0cCA9IHJldDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBwcHBfZmlsZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitpbml0X3BwcF9maWxlKHN0cnVjdCBwcHBfZmlsZSAqcGYsIGludCBraW5kKQoreworCXBmLT5raW5kID0ga2luZDsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwZi0+eHEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBmLT5ycSk7CisJYXRvbWljX3NldCgmcGYtPnJlZmNudCwgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGYtPnJ3YWl0KTsKK30KKworLyoKKyAqIFRha2UgZG93biBhIHBwcCBpbnRlcmZhY2UgdW5pdCAtIGNhbGxlZCB3aGVuIHRoZSBvd25pbmcgZmlsZQorICogKHRoZSBvbmUgdGhhdCBjcmVhdGVkIHRoZSB1bml0KSBpcyBjbG9zZWQgb3IgZGV0YWNoZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9zaHV0ZG93bl9pbnRlcmZhY2Uoc3RydWN0IHBwcCAqcHBwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlkb3duKCZhbGxfcHBwX3NlbSk7CisJcHBwX2xvY2socHBwKTsKKwlkZXYgPSBwcHAtPmRldjsKKwlwcHAtPmRldiA9IE5VTEw7CisJcHBwX3VubG9jayhwcHApOworCS8qIFRoaXMgd2lsbCBjYWxsIGRldl9jbG9zZSgpIGZvciB1cy4gKi8KKwlpZiAoZGV2KSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCWNhcmRtYXBfc2V0KCZhbGxfcHBwX3VuaXRzLCBwcHAtPmZpbGUuaW5kZXgsIE5VTEwpOworCXBwcC0+ZmlsZS5kZWFkID0gMTsKKwlwcHAtPm93bmVyID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBwcC0+ZmlsZS5yd2FpdCk7CisJdXAoJmFsbF9wcHBfc2VtKTsKK30KKworLyoKKyAqIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgcHBwIHVuaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkIG9uY2UKKyAqIHRoZXJlIGFyZSBubyBjaGFubmVscyBjb25uZWN0ZWQgdG8gdGhlIHVuaXQgYW5kIG5vIGZpbGUgc3RydWN0cworICogdGhhdCByZWZlcmVuY2UgdGhlIHVuaXQuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9kZXN0cm95X2ludGVyZmFjZShzdHJ1Y3QgcHBwICpwcHApCit7CisJYXRvbWljX2RlYygmcHBwX3VuaXRfY291bnQpOworCisJaWYgKCFwcHAtPmZpbGUuZGVhZCB8fCBwcHAtPm5fY2hhbm5lbHMpIHsKKwkJLyogImNhbid0IGhhcHBlbiIgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJwcHA6IGRlc3Ryb3lpbmcgcHBwIHN0cnVjdCAlcCBidXQgZGVhZD0lZCAiCisJCSAgICAgICAibl9jaGFubmVscz0lZCAhXG4iLCBwcHAsIHBwcC0+ZmlsZS5kZWFkLAorCQkgICAgICAgcHBwLT5uX2NoYW5uZWxzKTsKKwkJcmV0dXJuOworCX0KKworCXBwcF9jY3BfY2xvc2VkKHBwcCk7CisJaWYgKHBwcC0+dmopIHsKKwkJc2xoY19mcmVlKHBwcC0+dmopOworCQlwcHAtPnZqID0gTlVMTDsKKwl9CisJc2tiX3F1ZXVlX3B1cmdlKCZwcHAtPmZpbGUueHEpOworCXNrYl9xdWV1ZV9wdXJnZSgmcHBwLT5maWxlLnJxKTsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCXNrYl9xdWV1ZV9wdXJnZSgmcHBwLT5tcnEpOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKKwlpZiAocHBwLT5wYXNzX2ZpbHRlcikgeworCQlrZnJlZShwcHAtPnBhc3NfZmlsdGVyKTsKKwkJcHBwLT5wYXNzX2ZpbHRlciA9IE5VTEw7CisJfQorCWlmIChwcHAtPmFjdGl2ZV9maWx0ZXIpIHsKKwkJa2ZyZWUocHBwLT5hY3RpdmVfZmlsdGVyKTsKKwkJcHBwLT5hY3RpdmVfZmlsdGVyID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KKworCWtmcmVlKHBwcCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW4gZXhpc3RpbmcgcHBwIHVuaXQuCisgKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIGxvY2tlZCB0aGUgYWxsX3BwcF9zZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwICoKK3BwcF9maW5kX3VuaXQoaW50IHVuaXQpCit7CisJcmV0dXJuIGNhcmRtYXBfZ2V0KGFsbF9wcHBfdW5pdHMsIHVuaXQpOworfQorCisvKgorICogTG9jYXRlIGFuIGV4aXN0aW5nIHBwcCBjaGFubmVsLgorICogVGhlIGNhbGxlciBzaG91bGQgaGF2ZSBsb2NrZWQgdGhlIGFsbF9jaGFubmVsc19sb2NrLgorICogRmlyc3Qgd2UgbG9vayBpbiB0aGUgbmV3X2NoYW5uZWxzIGxpc3QsIHRoZW4gaW4gdGhlCisgKiBhbGxfY2hhbm5lbHMgbGlzdC4gIElmIGZvdW5kIGluIHRoZSBuZXdfY2hhbm5lbHMgbGlzdCwKKyAqIHdlIG1vdmUgaXQgdG8gdGhlIGFsbF9jaGFubmVscyBsaXN0LiAgVGhpcyBpcyBmb3Igc3BlZWQKKyAqIHdoZW4gd2UgaGF2ZSBhIGxvdCBvZiBjaGFubmVscyBpbiB1c2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqCitwcHBfZmluZF9jaGFubmVsKGludCB1bml0KQoreworCXN0cnVjdCBjaGFubmVsICpwY2g7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWxpc3QgPSAmbmV3X2NoYW5uZWxzOworCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZuZXdfY2hhbm5lbHMpIHsKKwkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgbGlzdCk7CisJCWlmIChwY2gtPmZpbGUuaW5kZXggPT0gdW5pdCkgeworCQkJbGlzdF9kZWwoJnBjaC0+bGlzdCk7CisJCQlsaXN0X2FkZCgmcGNoLT5saXN0LCAmYWxsX2NoYW5uZWxzKTsKKwkJCXJldHVybiBwY2g7CisJCX0KKwl9CisJbGlzdCA9ICZhbGxfY2hhbm5lbHM7CisJd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJmFsbF9jaGFubmVscykgeworCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBsaXN0KTsKKwkJaWYgKHBjaC0+ZmlsZS5pbmRleCA9PSB1bml0KQorCQkJcmV0dXJuIHBjaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDb25uZWN0IGEgUFBQIGNoYW5uZWwgdG8gYSBQUFAgaW50ZXJmYWNlIHVuaXQuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9jb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCwgaW50IHVuaXQpCit7CisJc3RydWN0IHBwcCAqcHBwOworCWludCByZXQgPSAtRU5YSU87CisJaW50IGhkcmxlbjsKKworCWRvd24oJmFsbF9wcHBfc2VtKTsKKwlwcHAgPSBwcHBfZmluZF91bml0KHVuaXQpOworCWlmIChwcHAgPT0gMCkKKwkJZ290byBvdXQ7CisJd3JpdGVfbG9ja19iaCgmcGNoLT51cGwpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKHBjaC0+cHBwICE9IDApCisJCWdvdG8gb3V0bDsKKworCXBwcF9sb2NrKHBwcCk7CisJaWYgKHBjaC0+ZmlsZS5oZHJsZW4gPiBwcHAtPmZpbGUuaGRybGVuKQorCQlwcHAtPmZpbGUuaGRybGVuID0gcGNoLT5maWxlLmhkcmxlbjsKKwloZHJsZW4gPSBwY2gtPmZpbGUuaGRybGVuICsgMjsJLyogZm9yIHByb3RvY29sIGJ5dGVzICovCisJaWYgKHBwcC0+ZGV2ICYmIGhkcmxlbiA+IHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pCisJCXBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBoZHJsZW47CisJbGlzdF9hZGRfdGFpbCgmcGNoLT5jbGlzdCwgJnBwcC0+Y2hhbm5lbHMpOworCSsrcHBwLT5uX2NoYW5uZWxzOworCXBjaC0+cHBwID0gcHBwOworCWF0b21pY19pbmMoJnBwcC0+ZmlsZS5yZWZjbnQpOworCXBwcF91bmxvY2socHBwKTsKKwlyZXQgPSAwOworCisgb3V0bDoKKwl3cml0ZV91bmxvY2tfYmgoJnBjaC0+dXBsKTsKKyBvdXQ6CisJdXAoJmFsbF9wcHBfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGlzY29ubmVjdCBhIGNoYW5uZWwgZnJvbSBpdHMgcHBwIHVuaXQuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9kaXNjb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlzdHJ1Y3QgcHBwICpwcHA7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZwY2gtPnVwbCk7CisJcHBwID0gcGNoLT5wcHA7CisJcGNoLT5wcHAgPSBOVUxMOworCXdyaXRlX3VubG9ja19iaCgmcGNoLT51cGwpOworCWlmIChwcHAgIT0gMCkgeworCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgcHBwIHVuaXQncyBsaXN0ICovCisJCXBwcF9sb2NrKHBwcCk7CisJCWxpc3RfZGVsKCZwY2gtPmNsaXN0KTsKKwkJaWYgKC0tcHBwLT5uX2NoYW5uZWxzID09IDApCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBwcC0+ZmlsZS5yd2FpdCk7CisJCXBwcF91bmxvY2socHBwKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBwcC0+ZmlsZS5yZWZjbnQpKQorCQkJcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKHBwcCk7CisJCWVyciA9IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGcmVlIHVwIHRoZSByZXNvdXJjZXMgdXNlZCBieSBhIHBwcCBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZCBwcHBfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJYXRvbWljX2RlYygmY2hhbm5lbF9jb3VudCk7CisKKwlpZiAoIXBjaC0+ZmlsZS5kZWFkKSB7CisJCS8qICJjYW4ndCBoYXBwZW4iICovCisJCXByaW50ayhLRVJOX0VSUiAicHBwOiBkZXN0cm95aW5nIHVuZGVhZCBjaGFubmVsICVwICFcbiIsCisJCSAgICAgICBwY2gpOworCQlyZXR1cm47CisJfQorCXNrYl9xdWV1ZV9wdXJnZSgmcGNoLT5maWxlLnhxKTsKKwlza2JfcXVldWVfcHVyZ2UoJnBjaC0+ZmlsZS5ycSk7CisJa2ZyZWUocGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcF9jbGVhbnVwKHZvaWQpCit7CisJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWlmIChhdG9taWNfcmVhZCgmcHBwX3VuaXRfY291bnQpIHx8IGF0b21pY19yZWFkKCZjaGFubmVsX2NvdW50KSkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IHJlbW92aW5nIG1vZHVsZSBidXQgdW5pdHMgcmVtYWluIVxuIik7CisJY2FyZG1hcF9kZXN0cm95KCZhbGxfcHBwX3VuaXRzKTsKKwlpZiAodW5yZWdpc3Rlcl9jaHJkZXYoUFBQX01BSk9SLCAicHBwIikgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIFBQUCBkZXZpY2VcbiIpOworCWRldmZzX3JlbW92ZSgicHBwIik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUFBQX01BSk9SLCAwKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBwX2NsYXNzKTsKK30KKworLyoKKyAqIENhcmRtYXAgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkICpjYXJkbWFwX2dldChzdHJ1Y3QgY2FyZG1hcCAqbWFwLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJc3RydWN0IGNhcmRtYXAgKnA7CisJaW50IGk7CisKKwlmb3IgKHAgPSBtYXA7IHAgIT0gTlVMTDsgKSB7CisJCWlmICgoaSA9IG5yID4+IHAtPnNoaWZ0KSA+PSBDQVJETUFQX1dJRFRIKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChwLT5zaGlmdCA9PSAwKQorCQkJcmV0dXJuIHAtPnB0cltpXTsKKwkJbnIgJj0gfihDQVJETUFQX01BU0sgPDwgcC0+c2hpZnQpOworCQlwID0gcC0+cHRyW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2FyZG1hcF9zZXQoc3RydWN0IGNhcmRtYXAgKipwbWFwLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcDsKKwlpbnQgaTsKKworCXAgPSAqcG1hcDsKKwlpZiAocCA9PSBOVUxMIHx8IChuciA+PiBwLT5zaGlmdCkgPj0gQ0FSRE1BUF9XSURUSCkgeworCQlkbyB7CisJCQkvKiBuZWVkIGEgbmV3IHRvcCBsZXZlbCAqLworCQkJc3RydWN0IGNhcmRtYXAgKm5wID0ga21hbGxvYyhzaXplb2YoKm5wKSwgR0ZQX0tFUk5FTCk7CisJCQltZW1zZXQobnAsIDAsIHNpemVvZigqbnApKTsKKwkJCW5wLT5wdHJbMF0gPSBwOworCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJCW5wLT5zaGlmdCA9IHAtPnNoaWZ0ICsgQ0FSRE1BUF9PUkRFUjsKKwkJCQlwLT5wYXJlbnQgPSBucDsKKwkJCX0gZWxzZQorCQkJCW5wLT5zaGlmdCA9IDA7CisJCQlwID0gbnA7CisJCX0gd2hpbGUgKChuciA+PiBwLT5zaGlmdCkgPj0gQ0FSRE1BUF9XSURUSCk7CisJCSpwbWFwID0gcDsKKwl9CisJd2hpbGUgKHAtPnNoaWZ0ID4gMCkgeworCQlpID0gKG5yID4+IHAtPnNoaWZ0KSAmIENBUkRNQVBfTUFTSzsKKwkJaWYgKHAtPnB0cltpXSA9PSBOVUxMKSB7CisJCQlzdHJ1Y3QgY2FyZG1hcCAqbnAgPSBrbWFsbG9jKHNpemVvZigqbnApLCBHRlBfS0VSTkVMKTsKKwkJCW1lbXNldChucCwgMCwgc2l6ZW9mKCpucCkpOworCQkJbnAtPnNoaWZ0ID0gcC0+c2hpZnQgLSBDQVJETUFQX09SREVSOworCQkJbnAtPnBhcmVudCA9IHA7CisJCQlwLT5wdHJbaV0gPSBucDsKKwkJfQorCQlpZiAocHRyID09IE5VTEwpCisJCQljbGVhcl9iaXQoaSwgJnAtPmludXNlKTsKKwkJcCA9IHAtPnB0cltpXTsKKwl9CisJaSA9IG5yICYgQ0FSRE1BUF9NQVNLOworCXAtPnB0cltpXSA9IHB0cjsKKwlpZiAocHRyICE9IE5VTEwpCisJCXNldF9iaXQoaSwgJnAtPmludXNlKTsKKwllbHNlCisJCWNsZWFyX2JpdChpLCAmcC0+aW51c2UpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRtYXBfZmluZF9maXJzdF9mcmVlKHN0cnVjdCBjYXJkbWFwICptYXApCit7CisJc3RydWN0IGNhcmRtYXAgKnA7CisJdW5zaWduZWQgaW50IG5yID0gMDsKKwlpbnQgaTsKKworCWlmICgocCA9IG1hcCkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZm9yICg7OykgeworCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdCgmcC0+aW51c2UsIENBUkRNQVBfV0lEVEgpOworCQlpZiAoaSA+PSBDQVJETUFQX1dJRFRIKSB7CisJCQlpZiAocC0+cGFyZW50ID09IE5VTEwpCisJCQkJcmV0dXJuIENBUkRNQVBfV0lEVEggPDwgcC0+c2hpZnQ7CisJCQlwID0gcC0+cGFyZW50OworCQkJaSA9IChuciA+PiBwLT5zaGlmdCkgJiBDQVJETUFQX01BU0s7CisJCQlzZXRfYml0KGksICZwLT5pbnVzZSk7CisJCQljb250aW51ZTsKKwkJfQorCQluciA9IChuciAmICh+Q0FSRE1BUF9NQVNLIDw8IHAtPnNoaWZ0KSkgfCAoaSA8PCBwLT5zaGlmdCk7CisJCWlmIChwLT5zaGlmdCA9PSAwIHx8IHAtPnB0cltpXSA9PSBOVUxMKQorCQkJcmV0dXJuIG5yOworCQlwID0gcC0+cHRyW2ldOworCX0KK30KKworc3RhdGljIHZvaWQgY2FyZG1hcF9kZXN0cm95KHN0cnVjdCBjYXJkbWFwICoqcG1hcCkKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcCwgKm5wOworCWludCBpOworCisJZm9yIChwID0gKnBtYXA7IHAgIT0gTlVMTDsgcCA9IG5wKSB7CisJCWlmIChwLT5zaGlmdCAhPSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQ0FSRE1BUF9XSURUSDsgKytpKQorCQkJCWlmIChwLT5wdHJbaV0gIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA8IENBUkRNQVBfV0lEVEgpIHsKKwkJCQlucCA9IHAtPnB0cltpXTsKKwkJCQlwLT5wdHJbaV0gPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCW5wID0gcC0+cGFyZW50OworCQlrZnJlZShwKTsKKwl9CisJKnBtYXAgPSBOVUxMOworfQorCisvKiBNb2R1bGUvaW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KKworbW9kdWxlX2luaXQocHBwX2luaXQpOworbW9kdWxlX2V4aXQocHBwX2NsZWFudXApOworCitFWFBPUlRfU1lNQk9MKHBwcF9yZWdpc3Rlcl9jaGFubmVsKTsKK0VYUE9SVF9TWU1CT0wocHBwX3VucmVnaXN0ZXJfY2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKHBwcF9jaGFubmVsX2luZGV4KTsKK0VYUE9SVF9TWU1CT0wocHBwX3VuaXRfbnVtYmVyKTsKK0VYUE9SVF9TWU1CT0wocHBwX2lucHV0KTsKK0VYUE9SVF9TWU1CT0wocHBwX2lucHV0X2Vycm9yKTsKK0VYUE9SVF9TWU1CT0wocHBwX291dHB1dF93YWtldXApOworRVhQT1JUX1NZTUJPTChwcHBfcmVnaXN0ZXJfY29tcHJlc3Nvcik7CitFWFBPUlRfU1lNQk9MKHBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoUFBQX01BSk9SKTsKK01PRFVMRV9BTElBUygiL2Rldi9wcHAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDE1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogUFBQIHN5bmNocm9ub3VzIHR0eSBjaGFubmVsIGRyaXZlciBmb3IgTGludXguCisgKgorICogVGhpcyBpcyBhIHBwcCBjaGFubmVsIGRyaXZlciB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdHR5IGRldmljZSBkcml2ZXJzCisgKiB0aGF0IGFyZSBmcmFtZSBvcmllbnRlZCwgc3VjaCBhcyBzeW5jaHJvbm91cyBIRExDIGRldmljZXMuCisgKgorICogQ29tcGxldGUgUFBQIGZyYW1lcyB3aXRob3V0IGVuY29kaW5nL2RlY29kaW5nIGFyZSBleGNoYW5nZWQgYmV0d2VlbgorICogdGhlIGNoYW5uZWwgZHJpdmVyIGFuZCB0aGUgZGV2aWNlIGRyaXZlci4KKyAqIAorICogVGhlIGFzeW5jIG1hcCBJT0NUTCBjb2RlcyBhcmUgaW1wbGVtZW50ZWQgdG8ga2VlcCB0aGUgdXNlciBtb2RlCisgKiBhcHBsaWNhdGlvbnMgaGFwcHkgaWYgdGhleSBjYWxsIHRoZW0uIFN5bmNocm9ub3VzIFBQUCBkb2VzIG5vdCB1c2UKKyAqIHRoZSBhc3luYyBtYXBzLgorICoKKyAqIENvcHlyaWdodCAxOTk5IFBhdWwgTWFja2VycmFzLgorICoKKyAqIEFsc28gdG91Y2hlZCBieSB0aGUgZ3J1YmJ5IGhhbmRzIG9mIFBhdWwgRnVsZ2h1bSBwYXVsa2ZAbWljcm9nYXRlLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZSBlbmNhcHN1bGF0aW9uIGFuZCBmcmFtaW5nIGZvciBzZW5kaW5nCisgKiBhbmQgcmVjZWl2aW5nIFBQUCBmcmFtZXMgb3ZlciBzeW5jIHNlcmlhbCBsaW5lcy4gIEl0IHJlbGllcyBvbgorICogdGhlIGdlbmVyaWMgUFBQIGxheWVyIHRvIGdpdmUgaXQgZnJhbWVzIHRvIHNlbmQgYW5kIHRvIHByb2Nlc3MKKyAqIHJlY2VpdmVkIGZyYW1lcy4gIEl0IGltcGxlbWVudHMgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogUGFydCBvZiB0aGUgY29kZSBpbiB0aGlzIGRyaXZlciB3YXMgaW5zcGlyZWQgYnkgdGhlIG9sZCBhc3luYy1vbmx5CisgKiBQUFAgZHJpdmVyLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gYW5kIEFsIExvbmd5ZWFyLCBhbmQKKyAqIHN1YnNlcXVlbnRseSBoYWNrZWQgYnkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogPT1GSUxFVkVSU0lPTiAyMDA0MDYxNj09CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgUFBQX1ZFUlNJT04JIjIuNC4yIgorCisvKiBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgbG9jYWwgc3RhdGUuICovCitzdHJ1Y3Qgc3luY3BwcCB7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJdW5zaWduZWQgaW50CXJiaXRzOworCWludAkJbXJ1OworCXNwaW5sb2NrX3QJeG1pdF9sb2NrOworCXNwaW5sb2NrX3QJcmVjdl9sb2NrOworCXVuc2lnbmVkIGxvbmcJeG1pdF9mbGFnczsKKwl1MzIJCXhhY2NtWzhdOworCXUzMgkJcmFjY207CisJdW5zaWduZWQgaW50CWJ5dGVzX3NlbnQ7CisJdW5zaWduZWQgaW50CWJ5dGVzX3JjdmQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqdHBrdDsKKwl1bnNpZ25lZCBsb25nCWxhc3RfeG1pdDsKKworCXN0cnVjdCBza19idWZmX2hlYWQgcnF1ZXVlOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRzazsKKworCWF0b21pY190CXJlZmNudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGRlYWRfc2VtOworCXN0cnVjdCBwcHBfY2hhbm5lbCBjaGFuOwkvKiBpbnRlcmZhY2UgdG8gZ2VuZXJpYyBwcHAgbGF5ZXIgKi8KK307CisKKy8qIEJpdCBudW1iZXJzIGluIHhtaXRfZmxhZ3MgKi8KKyNkZWZpbmUgWE1JVF9XQUtFVVAJMAorI2RlZmluZSBYTUlUX0ZVTEwJMQorCisvKiBCaXRzIGluIHJiaXRzICovCisjZGVmaW5lIFNDX1JDVl9CSVRTCShTQ19SQ1ZfQjdfMXxTQ19SQ1ZfQjdfMHxTQ19SQ1ZfT0REUHxTQ19SQ1ZfRVZOUCkKKworI2RlZmluZSBQUFBTWU5DX01BWF9SUUxFTgkzMgkvKiBhcmJpdHJhcnkgKi8KKworLyoKKyAqIFByb3RvdHlwZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogcHBwX3N5bmNfdHhtdW5nZShzdHJ1Y3Qgc3luY3BwcCAqYXAsIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBwcHBfc3luY19zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IHBwcF9zeW5jX2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcHBwX3N5bmNfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHBwcF9zeW5jX3B1c2goc3RydWN0IHN5bmNwcHAgKmFwKTsKK3N0YXRpYyB2b2lkIHBwcF9zeW5jX2ZsdXNoX291dHB1dChzdHJ1Y3Qgc3luY3BwcCAqYXApOworc3RhdGljIHZvaWQgcHBwX3N5bmNfaW5wdXQoc3RydWN0IHN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICBjaGFyICpmbGFncywgaW50IGNvdW50KTsKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgc3luY19vcHMgPSB7CisJcHBwX3N5bmNfc2VuZCwKKwlwcHBfc3luY19pb2N0bAorfTsKKworLyoKKyAqIFV0aWxpdHkgcHJvY2VkdXJlcyB0byBwcmludCBhIGJ1ZmZlciBpbiBoZXgvYXNjaWkKKyAqLworc3RhdGljIHZvaWQKK3BwcF9wcmludF9oZXggKHJlZ2lzdGVyIF9fdTggKiBvdXQsIGNvbnN0IF9fdTggKiBpbiwgaW50IGNvdW50KQoreworCXJlZ2lzdGVyIF9fdTggbmV4dF9jaDsKKwlzdGF0aWMgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQluZXh0X2NoID0gKmluKys7CisJCSpvdXQrKyA9IGhleFsobmV4dF9jaCA+PiA0KSAmIDB4MEZdOworCQkqb3V0KysgPSBoZXhbbmV4dF9jaCAmIDB4MEZdOworCQkrK291dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcHJpbnRfY2hhciAocmVnaXN0ZXIgX191OCAqIG91dCwgY29uc3QgX191OCAqIGluLCBpbnQgY291bnQpCit7CisJcmVnaXN0ZXIgX191OCBuZXh0X2NoOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW5leHRfY2ggPSAqaW4rKzsKKworCQlpZiAobmV4dF9jaCA8IDB4MjAgfHwgbmV4dF9jaCA+IDB4N2UpCisJCQkqb3V0KysgPSAnLic7CisJCWVsc2UgeworCQkJKm91dCsrID0gbmV4dF9jaDsKKwkJCWlmIChuZXh0X2NoID09ICclJykgICAvKiBwcmludGsvc3lzbG9nZCBoYXMgYSBidWcgISEgKi8KKwkJCQkqb3V0KysgPSAnJSc7CisJCX0KKwl9CisJKm91dCA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcHJpbnRfYnVmZmVyIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBfX3U4ICpidWYsIGludCBjb3VudCkKK3sKKwlfX3U4IGxpbmVbNDRdOworCisJaWYgKG5hbWUgIT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBwcF9zeW5jdHR5OiAlcywgY291bnQgPSAlZFxuIiwgbmFtZSwgY291bnQpOworCisJd2hpbGUgKGNvdW50ID4gOCkgeworCQltZW1zZXQgKGxpbmUsIDMyLCA0NCk7CisJCXBwcF9wcmludF9oZXggKGxpbmUsIGJ1ZiwgOCk7CisJCXBwcF9wcmludF9jaGFyICgmbGluZVs4ICogM10sIGJ1ZiwgOCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgbGluZSk7CisJCWNvdW50IC09IDg7CisJCWJ1ZiArPSA4OworCX0KKworCWlmIChjb3VudCA+IDApIHsKKwkJbWVtc2V0IChsaW5lLCAzMiwgNDQpOworCQlwcHBfcHJpbnRfaGV4IChsaW5lLCBidWYsIGNvdW50KTsKKwkJcHBwX3ByaW50X2NoYXIgKCZsaW5lWzggKiAzXSwgYnVmLCBjb3VudCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgbGluZSk7CisJfQorfQorCisKKy8qCisgKiBSb3V0aW5lcyBpbXBsZW1lbnRpbmcgdGhlIHN5bmNocm9ub3VzIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KKworLyoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcmFjZSBvbiBkZXJlZmVyZW5jaW5nIHR0eS0+ZGlzY19kYXRhLAorICogYmVjYXVzZSB0aGUgdHR5IGxheWVyIHByb3ZpZGVzIG5vIGxvY2tpbmcgYXQgYWxsIC0gdGh1cyBvbmUKKyAqIGNwdSBjb3VsZCBiZSBydW5uaW5nIHBwcF9zeW5jdHR5X3JlY2VpdmUgd2hpbGUgYW5vdGhlcgorICogY2FsbHMgcHBwX3N5bmN0dHlfY2xvc2UsIHdoaWNoIHplcm9lcyB0dHktPmRpc2NfZGF0YSBhbmQKKyAqIGZyZWVzIHRoZSBtZW1vcnkgdGhhdCBwcHBfc3luY3R0eV9yZWNlaXZlIGlzIHVzaW5nLiAgVGhlIGJlc3QKKyAqIHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgYSByd2xvY2sgaW4gdGhlIHR0eSBzdHJ1Y3QsIGJ1dCBmb3Igbm93CisgKiB3ZSB1c2UgYSBzaW5nbGUgZ2xvYmFsIHJ3bG9jayBmb3IgYWxsIHR0eXMgaW4gcHBwIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBGSVhNRTogRml4ZWQgaW4gdHR5X2lvIG5vd2RheXMuCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGRpc2NfZGF0YV9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBzeW5jcHBwICpzcF9nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXA7CisKKwlyZWFkX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlhcCA9IHR0eS0+ZGlzY19kYXRhOworCWlmIChhcCAhPSBOVUxMKQorCQlhdG9taWNfaW5jKCZhcC0+cmVmY250KTsKKwlyZWFkX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCXJldHVybiBhcDsKK30KKworc3RhdGljIHZvaWQgc3BfcHV0KHN0cnVjdCBzeW5jcHBwICphcCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYXAtPnJlZmNudCkpCisJCXVwKCZhcC0+ZGVhZF9zZW0pOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSB0dHkgaXMgcHV0IGludG8gc3luYy1QUFAgbGluZSBkaXNjaXBsaW5lLgorICovCitzdGF0aWMgaW50CitwcHBfc3luY19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwOworCWludCBlcnI7CisKKwlhcCA9IGttYWxsb2Moc2l6ZW9mKCphcCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKGFwID09IDApCisJCWdvdG8gb3V0OworCisJLyogaW5pdGlhbGl6ZSB0aGUgc3luY3BwcCBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoYXAsIDAsIHNpemVvZigqYXApKTsKKwlhcC0+dHR5ID0gdHR5OworCWFwLT5tcnUgPSBQUFBfTVJVOworCXNwaW5fbG9ja19pbml0KCZhcC0+eG1pdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYXAtPnJlY3ZfbG9jayk7CisJYXAtPnhhY2NtWzBdID0gfjBVOworCWFwLT54YWNjbVszXSA9IDB4NjAwMDAwMDBVOworCWFwLT5yYWNjbSA9IH4wVTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFwLT5ycXVldWUpOworCXRhc2tsZXRfaW5pdCgmYXAtPnRzaywgcHBwX3N5bmNfcHJvY2VzcywgKHVuc2lnbmVkIGxvbmcpIGFwKTsKKworCWF0b21pY19zZXQoJmFwLT5yZWZjbnQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZhcC0+ZGVhZF9zZW0pOworCisJYXAtPmNoYW4ucHJpdmF0ZSA9IGFwOworCWFwLT5jaGFuLm9wcyA9ICZzeW5jX29wczsKKwlhcC0+Y2hhbi5tdHUgPSBQUFBfTVJVOworCWFwLT5jaGFuLmhkcmxlbiA9IDI7CS8qIGZvciBBL0MgYnl0ZXMgKi8KKwllcnIgPSBwcHBfcmVnaXN0ZXJfY2hhbm5lbCgmYXAtPmNoYW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwl0dHktPmRpc2NfZGF0YSA9IGFwOworCisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZToKKwlrZnJlZShhcCk7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgdHR5IGlzIHB1dCBpbnRvIGFub3RoZXIgbGluZSBkaXNjaXBsaW5lCisgKiBvciBpdCBoYW5ncyB1cC4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgYW55IGNwdSBjdXJyZW50bHkKKyAqIGV4ZWN1dGluZyBpbiBhbnkgb2YgdGhlIG90aGVyIHBwcF9zeW5jdHR5Xyogcm91dGluZXMgdG8KKyAqIGZpbmlzaCBiZWZvcmUgd2UgY2FuIGNhbGwgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCBhbmQgZnJlZQorICogdGhlIHN5bmNwcHAgc3RydWN0LiAgVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGZyb20KKyAqIHByb2Nlc3MgY29udGV4dCwgbm90IGludGVycnVwdCBvciBzb2Z0aXJxIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfc3luY19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzeW5jcHBwICphcDsKKworCXdyaXRlX2xvY2tfaXJxKCZkaXNjX2RhdGFfbG9jayk7CisJYXAgPSB0dHktPmRpc2NfZGF0YTsKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2lycSgmZGlzY19kYXRhX2xvY2spOworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVuc3VyZWQgdGhhdCBub2JvZHkgY2FuIHN0YXJ0IHVzaW5nIGFwIGZyb20gbm93CisJICogb24sIGJ1dCB3ZSBoYXZlIHRvIHdhaXQgZm9yIGFsbCBleGlzdGluZyB1c2VycyB0byBmaW5pc2guCisJICogTm90ZSB0aGF0IHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwgZW5zdXJlcyB0aGF0IG5vIGNhbGxzIHRvCisJICogb3VyIGNoYW5uZWwgb3BzIChpLmUuIHBwcF9zeW5jX3NlbmQvaW9jdGwpIGFyZSBpbiBwcm9ncmVzcworCSAqIGJ5IHRoZSB0aW1lIGl0IHJldHVybnMuCisJICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZhcC0+cmVmY250KSkKKwkJZG93bigmYXAtPmRlYWRfc2VtKTsKKwl0YXNrbGV0X2tpbGwoJmFwLT50c2spOworCisJcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgmYXAtPmNoYW4pOworCXNrYl9xdWV1ZV9wdXJnZSgmYXAtPnJxdWV1ZSk7CisJaWYgKGFwLT50cGt0ICE9IDApCisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJa2ZyZWUoYXApOworfQorCisvKgorICogQ2FsbGVkIG9uIHR0eSBoYW5ndXAgaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFdhaXQgZm9yIEkvTyB0byBkcml2ZXIgdG8gY29tcGxldGUgYW5kIHVucmVnaXN0ZXIgUFBQIGNoYW5uZWwuCisgKiBUaGlzIGlzIGFscmVhZHkgZG9uZSBieSB0aGUgY2xvc2Ugcm91dGluZSwgc28ganVzdCBjYWxsIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgcHBwX3N5bmNfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcHBwX3N5bmNfY2xvc2UodHR5KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgZG9lcyBub3RoaW5nIC0gbm8gZGF0YSBpcyBldmVyIGF2YWlsYWJsZSB0aGlzIHdheS4KKyAqIFBwcGQgcmVhZHMgYW5kIHdyaXRlcyBwYWNrZXRzIHZpYSAvZGV2L3BwcCBpbnN0ZWFkLgorICovCitzdGF0aWMgc3NpemVfdAorcHBwX3N5bmNfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogV3JpdGUgb24gdGhlIHR0eSBkb2VzIG5vdGhpbmcsIHRoZSBwYWNrZXRzIGFsbCBjb21lIGluCisgKiBmcm9tIHRoZSBwcHAgZ2VuZXJpYyBzdHVmZi4KKyAqLworc3RhdGljIHNzaXplX3QKK3BwcF9zeW5jX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludAorcHBwX3N5bmN0dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gc3BfZ2V0KHR0eSk7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCWludCBlcnIsIHZhbDsKKworCWlmIChhcCA9PSAwKQorCQlyZXR1cm4gLUVOWElPOworCWVyciA9IC1FRkFVTFQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dDSEFOOgorCQllcnIgPSAtRU5YSU87CisJCWlmIChhcCA9PSAwKQorCQkJYnJlYWs7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihwcHBfY2hhbm5lbF9pbmRleCgmYXAtPmNoYW4pLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1VOSVQ6CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKGFwID09IDApCisJCQlicmVhazsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHBwcF91bml0X251bWJlcigmYXAtPmNoYW4pLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFRDRkxTSDoKKwkJLyogZmx1c2ggb3VyIGJ1ZmZlcnMgYW5kIHRoZSBzZXJpYWwgcG9ydCdzIGJ1ZmZlciAqLworCQlpZiAoYXJnID09IFRDSU9GTFVTSCB8fCBhcmcgPT0gVENPRkxVU0gpCisJCQlwcHBfc3luY19mbHVzaF9vdXRwdXQoYXApOworCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEZJT05SRUFEOgorCQl2YWwgPSAwOworCQlpZiAocHV0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9JT0NUTENNRDsKKwl9CisKKwlzcF9wdXQoYXApOworCXJldHVybiBlcnI7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludAorcHBwX3N5bmNfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHBwX3N5bmNfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiA2NTUzNTsKK30KKworLyoKKyAqIFRoaXMgY2FuIG5vdyBiZSBjYWxsZWQgZnJvbSBoYXJkIGludGVycnVwdCBsZXZlbCBhcyB3ZWxsCisgKiBhcyBzb2Z0IGludGVycnVwdCBsZXZlbCBvciBtYWlubGluZS4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9zeW5jX3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgIGNoYXIgKmNmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IHNwX2dldCh0dHkpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJcHBwX3N5bmNfaW5wdXQoYXAsIGJ1ZiwgY2ZsYWdzLCBjb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOworCWlmIChza2JfcXVldWVfbGVuKCZhcC0+cnF1ZXVlKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CisJc3BfcHV0KGFwKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKQorCSAgICAmJiB0dHktPmRyaXZlci0+dW50aHJvdHRsZSkKKwkJdHR5LT5kcml2ZXItPnVudGhyb3R0bGUodHR5KTsKK30KKworc3RhdGljIHZvaWQKK3BwcF9zeW5jX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IHNwX2dldCh0dHkpOworCisJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNldF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncyk7CisJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CisJc3BfcHV0KGFwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBwcHBfc3luY19sZGlzYyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkubWFnaWMJPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUJPSAicHBwc3luYyIsCisJLm9wZW4JPSBwcHBfc3luY19vcGVuLAorCS5jbG9zZQk9IHBwcF9zeW5jX2Nsb3NlLAorCS5oYW5ndXAJPSBwcHBfc3luY19oYW5ndXAsCisJLnJlYWQJPSBwcHBfc3luY19yZWFkLAorCS53cml0ZQk9IHBwcF9zeW5jX3dyaXRlLAorCS5pb2N0bAk9IHBwcF9zeW5jdHR5X2lvY3RsLAorCS5wb2xsCT0gcHBwX3N5bmNfcG9sbCwKKwkucmVjZWl2ZV9yb29tID0gcHBwX3N5bmNfcm9vbSwKKwkucmVjZWl2ZV9idWYgPSBwcHBfc3luY19yZWNlaXZlLAorCS53cml0ZV93YWtldXAgPSBwcHBfc3luY193YWtldXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcHBwX3N5bmNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TWU5DX1BQUCwgJnBwcF9zeW5jX2xkaXNjKTsKKwlpZiAoZXJyICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiUFBQX3N5bmM6IGVycm9yICVkIHJlZ2lzdGVyaW5nIGxpbmUgZGlzYy5cbiIsCisJCSAgICAgICBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIHByb3ZpZGUgdGhlIFBQUCBjaGFubmVsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludAorcHBwX3N5bmNfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXAgPSBjaGFuLT5wcml2YXRlOworCWludCBlcnIsIHZhbDsKKwl1MzIgYWNjbVs4XTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1MzIgX191c2VyICpwID0gYXJncDsKKworCWVyciA9IC1FRkFVTFQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dGTEFHUzoKKwkJdmFsID0gYXAtPmZsYWdzIHwgYXAtPnJiaXRzOworCQlpZiAocHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQlicmVhazsKKwkJYXAtPmZsYWdzID0gdmFsICYgflNDX1JDVl9CSVRTOworCQlzcGluX2xvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJYXAtPnJiaXRzID0gdmFsICYgU0NfUkNWX0JJVFM7CisJCXNwaW5fdW5sb2NrX2lycSgmYXAtPnJlY3ZfbG9jayk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHQVNZTkNNQVA6CisJCWlmIChwdXRfdXNlcihhcC0+eGFjY21bMF0sIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU0FTWU5DTUFQOgorCQlpZiAoZ2V0X3VzZXIoYXAtPnhhY2NtWzBdLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1JBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT5yYWNjbSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTUkFTWU5DTUFQOgorCQlpZiAoZ2V0X3VzZXIoYXAtPnJhY2NtLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1hBU1lOQ01BUDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBhcC0+eGFjY20sIHNpemVvZihhcC0+eGFjY20pKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NYQVNZTkNNQVA6CisJCWlmIChjb3B5X2Zyb21fdXNlcihhY2NtLCBhcmdwLCBzaXplb2YoYWNjbSkpKQorCQkJYnJlYWs7CisJCWFjY21bMl0gJj0gfjB4NDAwMDAwMDBVOwkvKiBjYW4ndCBlc2NhcGUgMHg1ZSAqLworCQlhY2NtWzNdIHw9IDB4NjAwMDAwMDBVOwkJLyogbXVzdCBlc2NhcGUgMHg3ZCwgMHg3ZSAqLworCQltZW1jcHkoYXAtPnhhY2NtLCBhY2NtLCBzaXplb2YoYXAtPnhhY2NtKSk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHTVJVOgorCQlpZiAocHV0X3VzZXIoYXAtPm1ydSwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTTVJVOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQlpZiAodmFsIDwgUFBQX01SVSkKKwkJCXZhbCA9IFBQUF9NUlU7CisJCWFwLT5tcnUgPSB2YWw7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RUWTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHNvZnRpcnEgbGV2ZWwgdG8gZGVsaXZlciByZWNlaXZlZCBwYWNrZXRzCisgKiB0byB0aGUgcHBwX2dlbmVyaWMgY29kZSwgYW5kIHRvIHRlbGwgdGhlIHBwcF9nZW5lcmljIGNvZGUKKyAqIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBvdXRwdXQgbm93LgorICovCitzdGF0aWMgdm9pZCBwcHBfc3luY19wcm9jZXNzKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IChzdHJ1Y3Qgc3luY3BwcCAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIHByb2Nlc3MgcmVjZWl2ZWQgcGFja2V0cyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFwLT5ycXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChza2ItPmxlbiA9PSAwKSB7CisJCQkvKiB6ZXJvIGxlbmd0aCBidWZmZXJzIGluZGljYXRlIGVycm9yICovCisJCQlwcHBfaW5wdXRfZXJyb3IoJmFwLT5jaGFuLCAwKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJCWVsc2UKKwkJCXBwcF9pbnB1dCgmYXAtPmNoYW4sIHNrYik7CisJfQorCisJLyogdHJ5IHRvIHB1c2ggbW9yZSBzdHVmZiBvdXQgKi8KKwlpZiAodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykgJiYgcHBwX3N5bmNfcHVzaChhcCkpCisJCXBwcF9vdXRwdXRfd2FrZXVwKCZhcC0+Y2hhbik7Cit9CisKKy8qCisgKiBQcm9jZWR1cmVzIGZvciBlbmNhcHN1bGF0aW9uIGFuZCBmcmFtaW5nLgorICovCisKK3N0cnVjdCBza19idWZmKgorcHBwX3N5bmNfdHhtdW5nZShzdHJ1Y3Qgc3luY3BwcCAqYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHByb3RvOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGlzbGNwOworCisJZGF0YSAgPSBza2ItPmRhdGE7CisJcHJvdG8gPSAoZGF0YVswXSA8PCA4KSArIGRhdGFbMV07CisKKwkvKiBMQ1AgcGFja2V0cyB3aXRoIGNvZGVzIGJldHdlZW4gMSAoY29uZmlndXJlLXJlcXVlc3QpCisJICogYW5kIDcgKGNvZGUtcmVqZWN0KSBtdXN0IGJlIHNlbnQgYXMgdGhvdWdoIG5vIG9wdGlvbnMKKwkgKiBoYXZlIGJlZW4gbmVnb3RpYXRlZC4KKwkgKi8KKwlpc2xjcCA9IHByb3RvID09IFBQUF9MQ1AgJiYgMSA8PSBkYXRhWzJdICYmIGRhdGFbMl0gPD0gNzsKKworCS8qIGNvbXByZXNzIHByb3RvY29sIGZpZWxkIGlmIG9wdGlvbiBlbmFibGVkICovCisJaWYgKGRhdGFbMF0gPT0gMCAmJiAoYXAtPmZsYWdzICYgU0NfQ09NUF9QUk9UKSAmJiAhaXNsY3ApCisJCXNrYl9wdWxsKHNrYiwxKTsKKworCS8qIHByZXBlbmQgYWRkcmVzcy9jb250cm9sIGZpZWxkcyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKGFwLT5mbGFncyAmIFNDX0NPTVBfQUMpID09IDAgfHwgaXNsY3ApIHsKKwkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgMikgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5wa3QgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuICsgMik7CisJCQlpZiAobnBrdCA9PSBOVUxMKSB7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShucGt0LDIpOworCQkJbWVtY3B5KHNrYl9wdXQobnBrdCxza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBucGt0OworCQl9CisJCXNrYl9wdXNoKHNrYiwyKTsKKwkJc2tiLT5kYXRhWzBdID0gUFBQX0FMTFNUQVRJT05TOworCQlza2ItPmRhdGFbMV0gPSBQUFBfVUk7CisJfQorCisJYXAtPmxhc3RfeG1pdCA9IGppZmZpZXM7CisKKwlpZiAoc2tiICYmIGFwLT5mbGFncyAmIFNDX0xPR19PVVRQS1QpCisJCXBwcF9wcmludF9idWZmZXIgKCJzZW5kIGJ1ZmZlciIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqIFRyYW5zbWl0LXNpZGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIFNlbmQgYSBwYWNrZXQgdG8gdGhlIHBlZXIgb3ZlciBhbiBzeW5jIHR0eSBsaW5lLgorICogUmV0dXJucyAxIGlmZiB0aGUgcGFja2V0IHdhcyBhY2NlcHRlZC4KKyAqIElmIHRoZSBwYWNrZXQgd2FzIG5vdCBhY2NlcHRlZCwgd2Ugd2lsbCBjYWxsIHBwcF9vdXRwdXRfd2FrZXVwCisgKiBhdCBzb21lIGxhdGVyIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zeW5jX3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisKKwlwcHBfc3luY19wdXNoKGFwKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CS8qIGFscmVhZHkgZnVsbCAqLworCXNrYiA9IHBwcF9zeW5jX3R4bXVuZ2UoYXAsIHNrYik7CisJaWYgKHNrYiAhPSBOVUxMKQorCQlhcC0+dHBrdCA9IHNrYjsKKwllbHNlCisJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisKKwlwcHBfc3luY19wdXNoKGFwKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFB1c2ggYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlIG91dCB0byB0aGUgdHR5LgorICovCitzdGF0aWMgaW50CitwcHBfc3luY19wdXNoKHN0cnVjdCBzeW5jcHBwICphcCkKK3sKKwlpbnQgc2VudCwgZG9uZSA9IDA7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGFwLT50dHk7CisJaW50IHR0eV9zdHVmZmVkID0gMDsKKworCWlmICghc3Bpbl90cnlsb2NrX2JoKCZhcC0+eG1pdF9sb2NrKSkKKwkJcmV0dXJuIDA7CisJZm9yICg7OykgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFhNSVRfV0FLRVVQLCAmYXAtPnhtaXRfZmxhZ3MpKQorCQkJdHR5X3N0dWZmZWQgPSAwOworCQlpZiAoIXR0eV9zdHVmZmVkICYmIGFwLT50cGt0ICE9IDApIHsKKwkJCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCQkJc2VudCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIGFwLT50cGt0LT5kYXRhLCBhcC0+dHBrdC0+bGVuKTsKKwkJCWlmIChzZW50IDwgMCkKKwkJCQlnb3RvIGZsdXNoOwkvKiBlcnJvciwgZS5nLiBsb3NzIG9mIENEICovCisJCQlpZiAoc2VudCA8IGFwLT50cGt0LT5sZW4pIHsKKwkJCQl0dHlfc3R1ZmZlZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCQkJYXAtPnRwa3QgPSBOVUxMOworCQkJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBoYXZlbid0IG1hZGUgYW55IHByb2dyZXNzICovCisJCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwkJaWYgKCEodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykKKwkJICAgICAgfHwgKCF0dHlfc3R1ZmZlZCAmJiBhcC0+dHBrdCAhPSAwKSkpCisJCQlicmVhazsKKwkJaWYgKCFzcGluX3RyeWxvY2tfYmgoJmFwLT54bWl0X2xvY2spKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBkb25lOworCitmbHVzaDoKKwlpZiAoYXAtPnRwa3QgIT0gMCkgeworCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCQlhcC0+dHBrdCA9IE5VTEw7CisJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCWRvbmUgPSAxOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnhtaXRfbG9jayk7CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBGbHVzaCBvdXRwdXQgZnJvbSBvdXIgaW50ZXJuYWwgYnVmZmVycy4KKyAqIENhbGxlZCBmb3IgdGhlIFRDRkxTSCBpb2N0bC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9zeW5jX2ZsdXNoX291dHB1dChzdHJ1Y3Qgc3luY3BwcCAqYXApCit7CisJaW50IGRvbmUgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlpZiAoYXAtPnRwa3QgIT0gTlVMTCkgeworCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCQlhcC0+dHBrdCA9IE5VTEw7CisJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCWRvbmUgPSAxOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnhtaXRfbG9jayk7CisJaWYgKGRvbmUpCisJCXBwcF9vdXRwdXRfd2FrZXVwKCZhcC0+Y2hhbik7Cit9CisKKy8qCisgKiBSZWNlaXZlLXNpZGUgcm91dGluZXMuCisgKi8KKworLyogY2FsbGVkIHdoZW4gdGhlIHR0eSBkcml2ZXIgaGFzIGRhdGEgZm9yIHVzLgorICoKKyAqIERhdGEgaXMgZnJhbWUgb3JpZW50ZWQ6IGVhY2ggY2FsbCB0byBwcHBfc3luY19pbnB1dCBpcyBjb25zaWRlcmVkCisgKiBhIHdob2xlIGZyYW1lLiBJZiB0aGUgMXN0IGZsYWcgYnl0ZSBpcyBub24temVybyB0aGVuIHRoZSB3aG9sZQorICogZnJhbWUgaXMgY29uc2lkZXJlZCB0byBiZSBpbiBlcnJvciBhbmQgaXMgdG9zc2VkLgorICovCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfaW5wdXQoc3RydWN0IHN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCWNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybjsKKworCWlmIChhcC0+ZmxhZ3MgJiBTQ19MT0dfSU5QS1QpCisJCXBwcF9wcmludF9idWZmZXIgKCJyZWNlaXZlIGJ1ZmZlciIsIGJ1ZiwgY291bnQpOworCisJLyogc3R1ZmYgdGhlIGNoYXJzIGluIHRoZSBza2IgKi8KKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoYXAtPm1ydSArIFBQUF9IRFJMRU4gKyAyKSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBQUHN5bmM6IG5vIG1lbW9yeSAoaW5wdXQgcGt0KVxuIik7CisJCWdvdG8gZXJyOworCX0KKwkvKiBUcnkgdG8gZ2V0IHRoZSBwYXlsb2FkIDQtYnl0ZSBhbGlnbmVkICovCisJaWYgKGJ1ZlswXSAhPSBQUFBfQUxMU1RBVElPTlMpCisJCXNrYl9yZXNlcnZlKHNrYiwgMiArIChidWZbMF0gJiAxKSk7CisKKwlpZiAoZmxhZ3MgIT0gMCAmJiAqZmxhZ3MpIHsKKwkJLyogZXJyb3IgZmxhZyBzZXQsIGlnbm9yZSBmcmFtZSAqLworCQlnb3RvIGVycjsKKwl9IGVsc2UgaWYgKGNvdW50ID4gc2tiX3RhaWxyb29tKHNrYikpIHsKKwkJLyogcGFja2V0IG92ZXJmbG93ZWQgTVJVICovCisJCWdvdG8gZXJyOworCX0KKworCXAgPSBza2JfcHV0KHNrYiwgY291bnQpOworCW1lbWNweShwLCBidWYsIGNvdW50KTsKKworCS8qIHN0cmlwIGFkZHJlc3MvY29udHJvbCBmaWVsZCBpZiBwcmVzZW50ICovCisJcCA9IHNrYi0+ZGF0YTsKKwlpZiAocFswXSA9PSBQUFBfQUxMU1RBVElPTlMgJiYgcFsxXSA9PSBQUFBfVUkpIHsKKwkJLyogY2hvcCBvZmYgYWRkcmVzcy9jb250cm9sICovCisJCWlmIChza2ItPmxlbiA8IDMpCisJCQlnb3RvIGVycjsKKwkJcCA9IHNrYl9wdWxsKHNrYiwgMik7CisJfQorCisJLyogZGVjb21wcmVzcyBwcm90b2NvbCBmaWVsZCBpZiBjb21wcmVzc2VkICovCisJaWYgKHBbMF0gJiAxKSB7CisJCS8qIHByb3RvY29sIGlzIGNvbXByZXNzZWQgKi8KKwkJc2tiX3B1c2goc2tiLCAxKVswXSA9IDA7CisJfSBlbHNlIGlmIChza2ItPmxlbiA8IDIpCisJCWdvdG8gZXJyOworCisJLyogcXVldWUgdGhlIGZyYW1lIHRvIGJlIHByb2Nlc3NlZCAqLworCXNrYl9xdWV1ZV90YWlsKCZhcC0+cnF1ZXVlLCBza2IpOworCXJldHVybjsKKworZXJyOgorCS8qIHF1ZXVlIHplcm8gbGVuZ3RoIHBhY2tldCBhcyBlcnJvciBpbmRpY2F0aW9uICovCisJaWYgKHNrYiB8fCAoc2tiID0gZGV2X2FsbG9jX3NrYigwKSkpIHsKKwkJc2tiX3RyaW0oc2tiLCAwKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmFwLT5ycXVldWUsIHNrYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3BwcF9zeW5jX2NsZWFudXAodm9pZCkKK3sKKwlpZiAodHR5X3JlZ2lzdGVyX2xkaXNjKE5fU1lOQ19QUFAsIE5VTEwpICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHVucmVnaXN0ZXIgU3luYyBQUFAgbGluZSBkaXNjaXBsaW5lXG4iKTsKK30KKworbW9kdWxlX2luaXQocHBwX3N5bmNfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBfc3luY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1NZTkNfUFBQKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9lLmMgYi9kcml2ZXJzL25ldC9wcHBvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMWE5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wcHBvZS5jCkBAIC0wLDAgKzEsMTE1MyBAQAorLyoqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgRXRoZXJuZXQgKFBQUG9YL1BQUG9FKSBTb2NrZXRzCisgKgorICogUFBQb1ggLS0tIEdlbmVyaWMgUFBQIGVuY2Fwc3VsYXRpb24gc29ja2V0IGZhbWlseQorICogUFBQb0UgLS0tIFBQUCBvdmVyIEV0aGVybmV0IChSRkMgMjUxNikKKyAqCisgKgorICogVmVyc2lvbjoJMC43LjAKKyAqCisgKiAyMjAxMDIgOglGaXggbW9kdWxlIHVzZSBjb3VudCBvbiBmYWlsdXJlIGluIHBwcG9lX2NyZWF0ZSwgcHBwb3hfc2sgLWFjbWUKKyAqIDAzMDcwMCA6CUZpeGVkIGNvbm5lY3QgbG9naWMgdG8gYWxsb3cgZm9yIGRpc2Nvbm5lY3QuCisgKiAyNzA3MDAgOglGaXhlZCBwb3RlbnRpYWwgU01QIHByb2JsZW1zOyB3ZSBtdXN0IHByb3RlY3QgYWdhaW5zdAorICoJCXNpbXVsdGFuZW91cyBpbnZvY2F0aW9uIG9mIHBwcF9pbnB1dAorICoJCWFuZCBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsLgorICogMDQwODAwIDoJUmVzcGVjdCByZWZlcmVuY2UgY291bnQgbWVjaGFuaXNtcyBvbiBuZXQtZGV2aWNlcy4KKyAqIDIwMDgwMCA6CWZpeCBrZnJlZShza2IpIGluIHBwcG9lX3JjdiAoYWNtZSkKKyAqCQlNb2R1bGUgcmVmZXJlbmNlIGNvdW50IGlzIGRlY3JlbWVudGVkIGluIHRoZSByaWdodCBzcG90IG5vdywKKyAqCQlndWFyZHMgYWdhaW5zdCBzb2NrX3B1dCBub3QgYWN0dWFsbHkgZnJlZWluZyB0aGUgc2sKKyAqCQlpbiBwcHBvZV9yZWxlYXNlLgorICogMDUxMDAwIDoJSW5pdGlhbGl6YXRpb24gY2xlYW51cC4KKyAqIDExMTEwMCA6CUZpeCByZWN2bXNnLgorICogMDUwMTAxIDoJRml4IFBBRFQgcHJvY2VzaW5nLgorICogMTQwNTAxIDoJVXNlIHBwcG9lX3Jjdl9jb3JlIHRvIGhhbmRsZSBhbGwgYmFja2xvZy4gKEFsZXhleSkKKyAqIDE3MDcwMSA6CURvIG5vdCBsb2NrX3NvY2sgd2l0aCByd2xvY2sgaGVsZC4gKERhdmVNKQorICoJCUlnbm9yZSBkaXNjb3ZlcnkgZnJhbWVzIGlmIHVzZXIgaGFzIHNvY2tldAorICoJCWxvY2tlZC4gKERhdmVNKQorICoJCUlnbm9yZSByZXR1cm4gdmFsdWUgb2YgZGV2X3F1ZXVlX3htaXQgaW4gX19wcHBvZV94bWl0CisgKgkJb3IgZWxzZSB3ZSBtYXkga2ZyZWUgYW4gU0tCIHR3aWNlLiAoRGF2ZU0pCisgKiAxOTA3MDEgOglXaGVuIGRvaW5nIGNvcGllcyBvZiBza2IncyBpbiBfX3BwcG9lX3htaXQsIGFsd2F5cyBkZWxldGUKKyAqCQl0aGUgb3JpZ2luYWwgc2tiIHRoYXQgd2FzIHBhc3NlZCBpbiBvbiBzdWNjZXNzLCBuZXZlciBvbgorICoJCWZhaWx1cmUuICBEZWxldGUgdGhlIGNvcHkgb2YgdGhlIHNrYiBvbiBmYWlsdXJlIHRvIGF2b2lkCisgKgkJYSBtZW1vcnkgbGVhay4KKyAqIDA4MTAwMSA6CU1pc2MuIGNsZWFudXAgKGxpY2VuY2Ugc3RyaW5nLCBub24tYmxvY2tpbmcsIHByZXZlbnQKKyAqCQlyZWZlcmVuY2Ugb2YgZGV2aWNlIG9uIGNsb3NlKS4KKyAqIDEyMTMwMSA6CU5ldyBwcHAgY2hhbm5lbHMgaW50ZXJmYWNlOyBjYW5ub3QgdW5yZWdpc3RlciBhIGNoYW5uZWwKKyAqCQlmcm9tIGludGVycnVwdHMuICBUaHVzLCB3ZSBtYXJrIHRoZSBzb2NrZXQgYXMgYSBaT01CSUUKKyAqCQlhbmQgZG8gdGhlIHVucmVnaXN0cmF0aW9uIGxhdGVyLgorICogMDgxMDAyIDoJc2VxX2ZpbGUgc3VwcG9ydCBmb3IgcHJvYyBzdHVmZiAtYWNtZQorICogMTExNjAyIDoJTWVyZ2UgYWxsIDIuNCBmaXhlcyBpbnRvIDIuNS8yLjYgdHJlZS4gIExhYmVsIDIuNS8yLjYKKyAqCQlhcyB2ZXJzaW9uIDAuNy4gIFNwYWNpbmcgY2xlYW51cC4KKyAqIEF1dGhvcjoJTWljaGFsIE9zdHJvd3NraSA8bW9zdHJvd3NAc3BlYWtlYXN5Lm5ldD4KKyAqIENvbnRyaWJ1dG9yczoKKyAqIAkJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgkJRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcG94Lmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgUFBQT0VfSEFTSF9CSVRTIDQKKyNkZWZpbmUgUFBQT0VfSEFTSF9TSVpFICgxPDxQUFBPRV9IQVNIX0JJVFMpCisKK3N0YXRpYyBzdHJ1Y3QgcHBwX2NoYW5uZWxfb3BzIHBwcG9lX2NoYW5fb3BzOworCitzdGF0aWMgaW50IHBwcG9lX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcHBwb2VfeG1pdChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBfX3BwcG9lX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcHBwb2Vfb3BzOworc3RhdGljIERFRklORV9SV0xPQ0socHBwb2VfaGFzaF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2VfY2hhbl9vcHM7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtcF8yX2FkZHIoc3RydWN0IHBwcG9lX2FkZHIgKmEsIHN0cnVjdCBwcHBvZV9hZGRyICpiKQoreworCXJldHVybiAoYS0+c2lkID09IGItPnNpZCAmJgorCQkobWVtY21wKGEtPnJlbW90ZSwgYi0+cmVtb3RlLCBFVEhfQUxFTikgPT0gMCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjbXBfYWRkcihzdHJ1Y3QgcHBwb2VfYWRkciAqYSwgdW5zaWduZWQgbG9uZyBzaWQsIGNoYXIgKmFkZHIpCit7CisJcmV0dXJuIChhLT5zaWQgPT0gc2lkICYmCisJCShtZW1jbXAoYS0+cmVtb3RlLGFkZHIsRVRIX0FMRU4pID09IDApKTsKK30KKworc3RhdGljIGludCBoYXNoX2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJY2hhciBoYXNoID0gMDsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiA7ICsraSkgeworCQlmb3IgKGogPSAwOyBqIDwgOC9QUFBPRV9IQVNIX0JJVFMgOyArK2opIHsKKwkJCWhhc2ggXj0gYWRkcltpXSA+PiAoIGogKiBQUFBPRV9IQVNIX0JJVFMgKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpIC8gUFBQT0VfSEFTSF9CSVRTIDsgKytpKQorCQloYXNoIF49IHNpZCA+PiAoaSpQUFBPRV9IQVNIX0JJVFMpOworCisJcmV0dXJuIGhhc2ggJiAoIFBQUE9FX0hBU0hfU0laRSAtIDEgKTsKK30KKworLyogemVyb2VkIGJlY2F1c2UgaXRzIGluIC5ic3MgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwb3hfc29jayAqaXRlbV9oYXNoX3RhYmxlW1BQUE9FX0hBU0hfU0laRV07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFNldC9nZXQvZGVsZXRlL3JlaGFzaCBpdGVtcyAgKGludGVybmFsIHZlcnNpb25zKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICpfX2dldF9pdGVtKHVuc2lnbmVkIGxvbmcgc2lkLCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCWludCBoYXNoID0gaGFzaF9pdGVtKHNpZCwgYWRkcik7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldDsKKworCXJldCA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKworCXdoaWxlIChyZXQgJiYgIWNtcF9hZGRyKCZyZXQtPnBwcG9lX3BhLCBzaWQsIGFkZHIpKQorCQlyZXQgPSByZXQtPm5leHQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fc2V0X2l0ZW0oc3RydWN0IHBwcG94X3NvY2sgKnBvKQoreworCWludCBoYXNoID0gaGFzaF9pdGVtKHBvLT5wcHBvZV9wYS5zaWQsIHBvLT5wcHBvZV9wYS5yZW1vdGUpOworCXN0cnVjdCBwcHBveF9zb2NrICpyZXQ7CisKKwlyZXQgPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJd2hpbGUgKHJldCkgeworCQlpZiAoY21wXzJfYWRkcigmcmV0LT5wcHBvZV9wYSwgJnBvLT5wcHBvZV9wYSkpCisJCQlyZXR1cm4gLUVBTFJFQURZOworCisJCXJldCA9IHJldC0+bmV4dDsKKwl9CisKKwlpZiAoIXJldCkgeworCQlwby0+bmV4dCA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKwkJaXRlbV9oYXNoX3RhYmxlW2hhc2hdID0gcG87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHBwb3hfc29jayAqX19kZWxldGVfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwgY2hhciAqYWRkcikKK3sKKwlpbnQgaGFzaCA9IGhhc2hfaXRlbShzaWQsIGFkZHIpOworCXN0cnVjdCBwcHBveF9zb2NrICpyZXQsICoqc3JjOworCisJcmV0ID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCXNyYyA9ICZpdGVtX2hhc2hfdGFibGVbaGFzaF07CisKKwl3aGlsZSAocmV0KSB7CisJCWlmIChjbXBfYWRkcigmcmV0LT5wcHBvZV9wYSwgc2lkLCBhZGRyKSkgeworCQkJKnNyYyA9IHJldC0+bmV4dDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3JjID0gJnJldC0+bmV4dDsKKwkJcmV0ID0gcmV0LT5uZXh0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFNldC9nZXQvZGVsZXRlL3JlaGFzaCBpdGVtcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb3hfc29jayAqZ2V0X2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsCisJCQkJCSB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKKworCXJlYWRfbG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwlwbyA9IF9fZ2V0X2l0ZW0oc2lkLCBhZGRyKTsKKwlpZiAocG8pCisJCXNvY2tfaG9sZChza19wcHBveChwbykpOworCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJcmV0dXJuIHBvOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBveF9zb2NrICpnZXRfaXRlbV9ieV9hZGRyKHN0cnVjdCBzb2NrYWRkcl9wcHBveCAqc3ApCit7CisJcmV0dXJuIGdldF9pdGVtKHNwLT5zYV9hZGRyLnBwcG9lLnNpZCwgc3AtPnNhX2FkZHIucHBwb2UucmVtb3RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2V0X2l0ZW0oc3RydWN0IHBwcG94X3NvY2sgKnBvKQoreworCWludCBpOworCisJaWYgKCFwbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCWkgPSBfX3NldF9pdGVtKHBvKTsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb3hfc29jayAqZGVsZXRlX2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldDsKKworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJcmV0ID0gX19kZWxldGVfaXRlbShzaWQsIGFkZHIpOworCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEhhbmRsZXIgZm9yIGRldmljZSBldmVudHMuCisgKiAgQ2VydGFpbiBkZXZpY2UgZXZlbnRzIHJlcXVpcmUgdGhhdCBzb2NrZXRzIGJlIHVuY29ubmVjdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgcHBwb2VfZmx1c2hfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGhhc2g7CisKKwlCVUdfT04oZGV2ID09IE5VTEwpOworCisJcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCWZvciAoaGFzaCA9IDA7IGhhc2ggPCBQUFBPRV9IQVNIX1NJWkU7IGhhc2grKykgeworCQlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisKKwkJd2hpbGUgKHBvICE9IE5VTEwpIHsKKwkJCWlmIChwby0+cHBwb2VfZGV2ID09IGRldikgeworCQkJCXN0cnVjdCBzb2NrICpzayA9IHNrX3BwcG94KHBvKTsKKworCQkJCXNvY2tfaG9sZChzayk7CisJCQkJcG8tPnBwcG9lX2RldiA9IE5VTEw7CisKKwkJCQkvKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvIFNLLCBub3cgZHJvcCB0aGUKKwkJCQkgKiBoYXNoIHRhYmxlIGxvY2sgc28gdGhhdCB3ZSBtYXkgYXR0ZW1wdAorCQkJCSAqIHRvIGxvY2sgdGhlIHNvY2tldCAod2hpY2ggY2FuIHNsZWVwKS4KKwkJCQkgKi8KKwkJCQlyZWFkX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKworCQkJCWxvY2tfc29jayhzayk7CisKKwkJCQlpZiAoc2stPnNrX3N0YXRlICYKKwkJCQkgICAgKFBQUE9YX0NPTk5FQ1RFRCB8IFBQUE9YX0JPVU5EKSkgeworCQkJCQlwcHBveF91bmJpbmRfc29jayhzayk7CisJCQkJCWRldl9wdXQoZGV2KTsKKwkJCQkJc2stPnNrX3N0YXRlID0gUFBQT1hfWk9NQklFOworCQkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJCQl9CisKKwkJCQlyZWxlYXNlX3NvY2soc2spOworCisJCQkJc29ja19wdXQoc2spOworCisJCQkJcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJCQkJLyogTm93IHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKKwkJCQkgKiBoYXNoIGNoYWluLiAgV2UgYWx3YXlzIE5VTEwgb3V0IHBwcG9lX2RldgorCQkJCSAqIHNvIHdlIGFyZSBndWFyYW50ZWVkIHRvIG1ha2UgZm9yd2FyZAorCQkJCSAqIHByb2dyZXNzLgorCQkJCSAqLworCQkJCXBvID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcG8gPSBwby0+bmV4dDsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKK30KKworc3RhdGljIGludCBwcHBvZV9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcHRyOworCisJLyogT25seSBsb29rIGF0IHNvY2tldHMgdGhhdCBhcmUgdXNpbmcgdGhpcyBzcGVjaWZpYyBkZXZpY2UuICovCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKwkJLyogQSBjaGFuZ2UgaW4gbXR1IGlzIGEgYmFkIHRoaW5nLCByZXF1aXJpbmcKKwkJICogTENQIHJlLW5lZ290aWF0aW9uLgorCQkgKi8KKworCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJY2FzZSBORVRERVZfRE9XTjoKKwkJLyogRmluZCBldmVyeSBzb2NrZXQgb24gdGhpcyBkZXZpY2UgYW5kIGtpbGwgaXQuICovCisJCXBwcG9lX2ZsdXNoX2RldihkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcHBvZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHBwcG9lX2RldmljZV9ldmVudCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERvIHRoZSByZWFsIHdvcmsgb2YgcmVjZWl2aW5nIGEgUFBQb0UgU2Vzc2lvbiBmcmFtZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX3Jjdl9jb3JlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvID0gTlVMTDsKKworCWlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9CT1VORCkgeworCQlzdHJ1Y3QgcHBwb2VfaGRyICpwaCA9IChzdHJ1Y3QgcHBwb2VfaGRyICopIHNrYi0+bmgucmF3OworCQlpbnQgbGVuID0gbnRvaHMocGgtPmxlbmd0aCk7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgcGgsIHNpemVvZigqcGgpKTsKKwkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIGxlbikpCisJCQlnb3RvIGFib3J0X2tmcmVlOworCisJCXBwcF9pbnB1dCgmcG8tPmNoYW4sIHNrYik7CisJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9SRUxBWSkgeworCQlyZWxheV9wbyA9IGdldF9pdGVtX2J5X2FkZHIoJnBvLT5wcHBvZV9yZWxheSk7CisKKwkJaWYgKHJlbGF5X3BvID09IE5VTEwpCisJCQlnb3RvIGFib3J0X2tmcmVlOworCisJCWlmICgoc2tfcHBwb3gocmVsYXlfcG8pLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkgPT0gMCkKKwkJCWdvdG8gYWJvcnRfcHV0OworCisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwkJaWYgKCFfX3BwcG9lX3htaXQoc2tfcHBwb3gocmVsYXlfcG8pLCBza2IpKQorCQkJZ290byBhYm9ydF9wdXQ7CisJfSBlbHNlIHsKKwkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwkJCWdvdG8gYWJvcnRfa2ZyZWU7CisJfQorCisJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCithYm9ydF9wdXQ6CisJc29ja19wdXQoc2tfcHBwb3gocmVsYXlfcG8pKTsKKworYWJvcnRfa2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVjZWl2ZSB3cmFwcGVyIGNhbGxlZCBpbiBCSCBjb250ZXh0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHBwb2VfcmN2KHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KQorCit7CisJc3RydWN0IHBwcG9lX2hkciAqcGg7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgcmV0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKSkKKwkJZ290byBkcm9wOworCisJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKSAKKwkJZ290byBvdXQ7CisKKwlwaCA9IChzdHJ1Y3QgcHBwb2VfaGRyICopIHNrYi0+bmgucmF3OworCisJcG8gPSBnZXRfaXRlbSgodW5zaWduZWQgbG9uZykgcGgtPnNpZCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CisJaWYgKCFwbykgCisJCWdvdG8gZHJvcDsKKworCXNrID0gc2tfcHBwb3gocG8pOworCWJoX2xvY2tfc29jayhzayk7CisKKwkvKiBTb2NrZXQgc3RhdGUgaXMgdW5rbm93biwgbXVzdCBwdXQgc2tiIGludG8gYmFja2xvZy4gKi8KKwlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSAhPSAwKSB7CisJCXNrX2FkZF9iYWNrbG9nKHNrLCBza2IpOworCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlyZXQgPSBwcHBvZV9yY3ZfY29yZShzaywgc2tiKTsKKwl9CisKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIHJldDsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVjZWl2ZSBhIFBQUG9FIERpc2NvdmVyeSBmcmFtZS4KKyAqIFRoaXMgaXMgc29sZWx5IGZvciBkZXRlY3Rpb24gb2YgUEFEVCBmcmFtZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX2Rpc2NfcmN2KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCisKK3sKKwlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpKQorCQlnb3RvIGFib3J0OworCisJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKSAKKwkJZ290byBvdXQ7CisKKwlwaCA9IChzdHJ1Y3QgcHBwb2VfaGRyICopIHNrYi0+bmgucmF3OworCWlmIChwaC0+Y29kZSAhPSBQQURUX0NPREUpCisJCWdvdG8gYWJvcnQ7CisKKwlwbyA9IGdldF9pdGVtKCh1bnNpZ25lZCBsb25nKSBwaC0+c2lkLCBldGhfaGRyKHNrYiktPmhfc291cmNlKTsKKwlpZiAocG8pIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gc2tfcHBwb3gocG8pOworCisJCWJoX2xvY2tfc29jayhzayk7CisKKwkJLyogSWYgdGhlIHVzZXIgaGFzIGxvY2tlZCB0aGUgc29ja2V0LCBqdXN0IGlnbm9yZQorCQkgKiB0aGUgcGFja2V0LiAgV2l0aCB0aGUgd2F5IHR3byByY3YgcHJvdG9jb2xzIGhvb2sgaW50bworCQkgKiBvbmUgc29ja2V0IGZhbWlseSB0eXBlLCB3ZSBjYW5ub3QgKGVhc2lseSkgZGlzdGluZ3Vpc2gKKwkJICogd2hhdCBraW5kIG9mIFNLQiBpdCBpcyBkdXJpbmcgYmFja2xvZyByY3YuCisJCSAqLworCQlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSA9PSAwKSB7CisJCQkvKiBXZSdyZSBubyBsb25nZXIgY29ubmVjdCBhdCB0aGUgUFBQT0UgbGF5ZXIsCisJCQkgKiBhbmQgbXVzdCB3YWl0IGZvciBwcHAgY2hhbm5lbCB0byBkaXNjb25uZWN0IHVzLgorCQkJICovCisJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9aT01CSUU7CisJCX0KKworCQliaF91bmxvY2tfc29jayhzayk7CisJCXNvY2tfcHV0KHNrKTsKKwl9CisKK2Fib3J0OgorCWtmcmVlX3NrYihza2IpOworb3V0OgorCXJldHVybiBORVRfUlhfU1VDQ0VTUzsgLyogTGllcy4uLiA6LSkgKi8KK30KKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBwcHBvZXNfcHR5cGUgPSB7CisJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1BQUF9TRVMpLAorCS5mdW5jCT0gcHBwb2VfcmN2LAorfTsKKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBwcHBvZWRfcHR5cGUgPSB7CisJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1BQUF9ESVNDKSwKKwkuZnVuYwk9IHBwcG9lX2Rpc2NfcmN2LAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBwcHBvZV9za19wcm90byA9IHsKKwkubmFtZQkgID0gIlBQUE9FIiwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHBwb3hfc29jayksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbml0aWFsaXplIGEgbmV3IHN0cnVjdCBzb2NrLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcHBvZV9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCXN0cnVjdCBzb2NrICpzazsKKworCXNrID0gc2tfYWxsb2MoUEZfUFBQT1gsIEdGUF9LRVJORUwsICZwcHBvZV9za19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCXNvY2stPm9wcyAgID0gJnBwcG9lX29wczsKKworCXNrLT5za19iYWNrbG9nX3JjdiA9IHBwcG9lX3Jjdl9jb3JlOworCXNrLT5za19zdGF0ZQkgICA9IFBQUE9YX05PTkU7CisJc2stPnNrX3R5cGUJICAgPSBTT0NLX1NUUkVBTTsKKwlzay0+c2tfZmFtaWx5CSAgID0gUEZfUFBQT1g7CisJc2stPnNrX3Byb3RvY29sCSAgID0gUFhfUFJPVE9fT0U7CisKKwllcnJvciA9IDA7CitvdXQ6CXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBwcHBvZV9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXJldHVybiAtRUJBREY7CisKKwlwcHBveF91bmJpbmRfc29jayhzayk7CisKKwkvKiBTaWduYWwgdGhlIGRlYXRoIG9mIHRoZSBzb2NrZXQuICovCisJc2stPnNrX3N0YXRlID0gUFBQT1hfREVBRDsKKworCXBvID0gcHBwb3hfc2soc2spOworCWlmIChwby0+cHBwb2VfcGEuc2lkKSB7CisJCWRlbGV0ZV9pdGVtKHBvLT5wcHBvZV9wYS5zaWQsIHBvLT5wcHBvZV9wYS5yZW1vdGUpOworCX0KKworCWlmIChwby0+cHBwb2VfZGV2KQorCQlkZXZfcHV0KHBvLT5wcHBvZV9kZXYpOworCisJcG8tPnBwcG9lX2RldiA9IE5VTEw7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29jay0+c2sgPSBOVUxMOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2VfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVzZXJ2YWRkciwKKwkJICBpbnQgc29ja2FkZHJfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCA9IChzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggKikgdXNlcnZhZGRyOworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX3NvY2soc2spOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChzcC0+c2FfcHJvdG9jb2wgIT0gUFhfUFJPVE9fT0UpCisJCWdvdG8gZW5kOworCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgYm91bmQgc29ja2V0cyAqLworCWVycm9yID0gLUVCVVNZOworCWlmICgoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSAmJiBzcC0+c2FfYWRkci5wcHBvZS5zaWQpCisJCWdvdG8gZW5kOworCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgZGlzY29ubmVjdGVkIHNvY2tldHMsIG9uIGF0dGVtcHRzIHRvIGRpc2Nvbm5lY3QgKi8KKwllcnJvciA9IC1FQUxSRUFEWTsKKwlpZiAoKHNrLT5za19zdGF0ZSAmIFBQUE9YX0RFQUQpICYmICFzcC0+c2FfYWRkci5wcHBvZS5zaWQgKQorCQlnb3RvIGVuZDsKKworCWVycm9yID0gMDsKKwlpZiAocG8tPnBwcG9lX3BhLnNpZCkgeworCQlwcHBveF91bmJpbmRfc29jayhzayk7CisKKwkJLyogRGVsZXRlIHRoZSBvbGQgYmluZGluZyAqLworCQlkZWxldGVfaXRlbShwby0+cHBwb2VfcGEuc2lkLHBvLT5wcHBvZV9wYS5yZW1vdGUpOworCisJCWlmKHBvLT5wcHBvZV9kZXYpCisJCQlkZXZfcHV0KHBvLT5wcHBvZV9kZXYpOworCisJCW1lbXNldChza19wcHBveChwbykgKyAxLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBveF9zb2NrKSAtIHNpemVvZihzdHJ1Y3Qgc29jaykpOworCisJCXNrLT5za19zdGF0ZSA9IFBQUE9YX05PTkU7CisJfQorCisJLyogRG9uJ3QgcmUtYmluZCBpZiBzaWQ9PTAgKi8KKwlpZiAoc3AtPnNhX2FkZHIucHBwb2Uuc2lkICE9IDApIHsKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNwLT5zYV9hZGRyLnBwcG9lLmRldik7CisKKwkJZXJyb3IgPSAtRU5PREVWOworCQlpZiAoIWRldikKKwkJCWdvdG8gZW5kOworCisJCXBvLT5wcHBvZV9kZXYgPSBkZXY7CisKKwkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCQlnb3RvIGVycl9wdXQ7CisKKwkJbWVtY3B5KCZwby0+cHBwb2VfcGEsCisJCSAgICAgICAmc3AtPnNhX2FkZHIucHBwb2UsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHBwcG9lX2FkZHIpKTsKKworCQllcnJvciA9IHNldF9pdGVtKHBvKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyX3B1dDsKKworCQlwby0+Y2hhbi5oZHJsZW4gPSAoc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpICsKKwkJCQkgICBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisKKwkJcG8tPmNoYW4ucHJpdmF0ZSA9IHNrOworCQlwby0+Y2hhbi5vcHMgPSAmcHBwb2VfY2hhbl9vcHM7CisKKwkJZXJyb3IgPSBwcHBfcmVnaXN0ZXJfY2hhbm5lbCgmcG8tPmNoYW4pOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycl9wdXQ7CisKKwkJc2stPnNrX3N0YXRlID0gUFBQT1hfQ09OTkVDVEVEOworCX0KKworCXBvLT5udW0gPSBzcC0+c2FfYWRkci5wcHBvZS5zaWQ7CisKKyBlbmQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyb3I7CitlcnJfcHV0OgorCWlmIChwby0+cHBwb2VfZGV2KSB7CisJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisJCXBvLT5wcHBvZV9kZXYgPSBOVUxMOworCX0KKwlnb3RvIGVuZDsKK30KKworCitzdGF0aWMgaW50IHBwcG9lX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJICBpbnQgKnVzb2NrYWRkcl9sZW4sIGludCBwZWVyKQoreworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BwcG94KTsKKwlzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggc3A7CisKKwlzcC5zYV9mYW1pbHkJPSBBRl9QUFBPWDsKKwlzcC5zYV9wcm90b2NvbAk9IFBYX1BST1RPX09FOworCW1lbWNweSgmc3Auc2FfYWRkci5wcHBvZSwgJnBwcG94X3NrKHNvY2stPnNrKS0+cHBwb2VfcGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcHBwb2VfYWRkcikpOworCisJbWVtY3B5KHVhZGRyLCAmc3AsIGxlbik7CisKKwkqdXNvY2thZGRyX2xlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2VfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCB2YWwgPSAwOworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dNUlU6CisJCWVyciA9IC1FTlhJTzsKKworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHBvLT5wcHBvZV9kZXYtPm10dSAtCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSAtCisJCQkgICAgIFBQUF9IRFJMRU4sCisJCQkgICAgIChpbnQgX191c2VyICopIGFyZykpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NNUlU6CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKCEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJCWJyZWFrOworCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChnZXRfdXNlcih2YWwsKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCisJCWlmICh2YWwgPCAocG8tPnBwcG9lX2Rldi0+bXR1CisJCQkgICAtIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKQorCQkJICAgLSBQUFBfSERSTEVOKSkKKwkJCWVyciA9IDA7CisJCWVsc2UKKwkJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NTRkxBR1M6CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZykpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUE9FSU9DU0ZXRDoKKwl7CisJCXN0cnVjdCBwcHBveF9zb2NrICpyZWxheV9wbzsKKworCQllcnIgPSAtRUJVU1k7CisJCWlmIChzay0+c2tfc3RhdGUgJiAoUFBQT1hfQk9VTkQgfCBQUFBPWF9aT01CSUUgfCBQUFBPWF9ERUFEKSkKKwkJCWJyZWFrOworCisJCWVyciA9IC1FTk9UQ09OTjsKKwkJaWYgKCEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJCWJyZWFrOworCisJCS8qIFBQUG9FIGFkZHJlc3MgZnJvbSB0aGUgdXNlciBzcGVjaWZpZXMgYW4gb3V0Ym91bmQKKwkJICAgUFBQb0UgYWRkcmVzcyB0byB3aGljaCBmcmFtZXMgYXJlIGZvcndhcmRlZCB0byAqLworCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBvLT5wcHBvZV9yZWxheSwKKwkJCQkgICAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9wcHBveCkpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKHBvLT5wcHBvZV9yZWxheS5zYV9mYW1pbHkgIT0gQUZfUFBQT1ggfHwKKwkJICAgIHBvLT5wcHBvZV9yZWxheS5zYV9wcm90b2NvbCE9IFBYX1BST1RPX09FKQorCQkJYnJlYWs7CisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgc29ja2V0IHJlZmVyZW5jZWQgYnkgdGhlIGFkZHJlc3MKKwkJICAgYWN0dWFsbHkgZXhpc3RzLiAqLworCQlyZWxheV9wbyA9IGdldF9pdGVtX2J5X2FkZHIoJnBvLT5wcHBvZV9yZWxheSk7CisKKwkJaWYgKCFyZWxheV9wbykKKwkJCWJyZWFrOworCisJCXNvY2tfcHV0KHNrX3BwcG94KHJlbGF5X3BvKSk7CisJCXNrLT5za19zdGF0ZSB8PSBQUFBPWF9SRUxBWTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUFBPRUlPQ0RGV0Q6CisJCWVyciA9IC1FQUxSRUFEWTsKKwkJaWYgKCEoc2stPnNrX3N0YXRlICYgUFBQT1hfUkVMQVkpKQorCQkJYnJlYWs7CisKKwkJc2stPnNrX3N0YXRlICY9IH5QUFBPWF9SRUxBWTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OjsKKwl9OworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHBwcG9lX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBwcHBvZV9oZHIgaGRyOworCXN0cnVjdCBwcHBvZV9oZHIgKnBoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciAqc3RhcnQ7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpIHx8ICEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkgeworCQllcnJvciA9IC1FTk9UQ09OTjsKKwkJZ290byBlbmQ7CisJfQorCisJaGRyLnZlciA9IDE7CisJaGRyLnR5cGUgPSAxOworCWhkci5jb2RlID0gMDsKKwloZHIuc2lkID0gcG8tPm51bTsKKworCWxvY2tfc29jayhzayk7CisKKwlkZXYgPSBwby0+cHBwb2VfZGV2OworCisJZXJyb3IgPSAtRU1TR1NJWkU7CisgCWlmICh0b3RhbF9sZW4gPiAoZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJCWdvdG8gZW5kOworCisKKwlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIHRvdGFsX2xlbiArIGRldi0+aGFyZF9oZWFkZXJfbGVuICsgMzIsCisJCQkgICAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMuICovCisJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlza2ItPmRldiA9IGRldjsKKworCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX1NFUyk7CisKKwlwaCA9IChzdHJ1Y3QgcHBwb2VfaGRyICopIHNrYl9wdXQoc2tiLCB0b3RhbF9sZW4gKyBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCXN0YXJ0ID0gKGNoYXIgKikgJnBoLT50YWdbMF07CisKKwllcnJvciA9IG1lbWNweV9mcm9taW92ZWMoc3RhcnQsIG0tPm1zZ19pb3YsIHRvdGFsX2xlbik7CisKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVuZDsKKwl9CisKKwllcnJvciA9IHRvdGFsX2xlbjsKKwlkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9QUFBfU0VTLAorCQkJIHBvLT5wcHBvZV9wYS5yZW1vdGUsIE5VTEwsIHRvdGFsX2xlbik7CisKKwltZW1jcHkocGgsICZoZHIsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CisKKwlwaC0+bGVuZ3RoID0gaHRvbnModG90YWxfbGVuKTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7CisKK2VuZDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogeG1pdCBmdW5jdGlvbiBmb3IgaW50ZXJuYWwgdXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19wcHBvZV94bWl0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvLT5wcHBvZV9kZXY7CisJc3RydWN0IHBwcG9lX2hkciBoZHI7CisJc3RydWN0IHBwcG9lX2hkciAqcGg7CisJaW50IGhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJaW50IGRhdGFfbGVuID0gc2tiLT5sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpIHx8ICEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJZ290byBhYm9ydDsKKworCWhkci52ZXIJPSAxOworCWhkci50eXBlID0gMTsKKwloZHIuY29kZSA9IDA7CisJaGRyLnNpZAk9IHBvLT5udW07CisJaGRyLmxlbmd0aCA9IGh0b25zKHNrYi0+bGVuKTsKKworCWlmICghZGV2KQorCQlnb3RvIGFib3J0OworCisJLyogQ29weSB0aGUgc2tiIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgaGVhZGVyLiAqLworCWlmIChoZWFkcm9vbSA8IChzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbikpIHsKKwkJc2tiMiA9IGRldl9hbGxvY19za2IoMzIrc2tiLT5sZW4gKworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpICsKKwkJCQkgICAgIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKworCQlpZiAoc2tiMiA9PSBOVUxMKQorCQkJZ290byBhYm9ydDsKKworCQlza2JfcmVzZXJ2ZShza2IyLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CisJCW1lbWNweShza2JfcHV0KHNrYjIsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfSBlbHNlIHsKKwkJLyogTWFrZSBhIGNsb25lIHNvIGFzIHRvIG5vdCBkaXN0dXJiIHRoZSBvcmlnaW5hbCBza2IsCisJCSAqIGdpdmUgZGV2X3F1ZXVlX3htaXQgc29tZXRoaW5nIGl0IGNhbiBmcmVlLgorCQkgKi8KKwkJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCX0KKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiX3B1c2goc2tiMiwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwltZW1jcHkocGgsICZoZHIsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CisJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1BQUF9TRVMpOworCisJc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKworCXNrYjItPmRldiA9IGRldjsKKworCWRldi0+aGFyZF9oZWFkZXIoc2tiMiwgZGV2LCBFVEhfUF9QUFBfU0VTLAorCQkJIHBvLT5wcHBvZV9wYS5yZW1vdGUsIE5VTEwsIGRhdGFfbGVuKTsKKworCS8qIFdlJ3JlIHRyYW5zbWl0dGluZyBza2IyLCBhbmQgYXNzdW1pbmcgdGhhdCBkZXZfcXVldWVfeG1pdAorCSAqIHdpbGwgZnJlZSBpdC4gIFRoZSBnZW5lcmljIHBwcCBsYXllciBob3dldmVyLCBpcyBleHBlY3RpbmcKKwkgKiB0aGF0IHdlIGdpdmUgYmFjayAnc2tiJyAobm90ICdza2IyJykgaW4gY2FzZSBvZiBmYWlsdXJlLAorCSAqIGJ1dCBmcmVlIGl0IGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKwkgKi8KKworCWlmIChkZXZfcXVldWVfeG1pdChza2IyKSA8IDApCisJCWdvdG8gYWJvcnQ7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMTsKKworYWJvcnQ6CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHhtaXQgZnVuY3Rpb24gY2FsbGVkIGJ5IGdlbmVyaWMgUFBQIGRyaXZlcgorICogc2VuZHMgUFBQIGZyYW1lIG92ZXIgUFBQb0Ugc29ja2V0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcHBvZV94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgY2hhbi0+cHJpdmF0ZTsKKwlyZXR1cm4gX19wcHBvZV94bWl0KHNrLCBza2IpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcHBwX2NoYW5uZWxfb3BzIHBwcG9lX2NoYW5fb3BzID0geyAKKwkuc3RhcnRfeG1pdCA9IHBwcG9lX3htaXQsIAorfTsKKworc3RhdGljIGludCBwcHBvZV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJaW50IGVycm9yID0gMDsKKwlpbnQgbGVuOworCXN0cnVjdCBwcHBvZV9oZHIgKnBoID0gTlVMTDsKKworCWlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9CT1VORCkgeworCQllcnJvciA9IC1FSU87CisJCWdvdG8gZW5kOworCX0KKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCisJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnJvcik7CisKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWdvdG8gZW5kOworCX0KKworCW0tPm1zZ19uYW1lbGVuID0gMDsKKworCWlmIChza2IpIHsKKwkJZXJyb3IgPSAwOworCQlwaCA9IChzdHJ1Y3QgcHBwb2VfaGRyICopIHNrYi0+bmgucmF3OworCQlsZW4gPSBudG9ocyhwaC0+bGVuZ3RoKTsKKworCQllcnJvciA9IG1lbWNweV90b2lvdmVjKG0tPm1zZ19pb3YsICh1bnNpZ25lZCBjaGFyICopICZwaC0+dGFnWzBdLCBsZW4pOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBkb19za2JfZnJlZTsKKwkJZXJyb3IgPSBsZW47CisJfQorCitkb19za2JfZnJlZToKKwlpZiAoc2tiKQorCQlrZnJlZV9za2Ioc2tiKTsKK2VuZDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBwcHBvZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisJY2hhciAqZGV2X25hbWU7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiSWQgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAgRGV2aWNlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcG8gPSB2OworCWRldl9uYW1lID0gcG8tPnBwcG9lX3BhLmRldjsKKworCXNlcV9wcmludGYoc2VxLCAiJTA4WCAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAlOHNcbiIsCisJCSAgIHBvLT5wcHBvZV9wYS5zaWQsCisJCSAgIHBvLT5wcHBvZV9wYS5yZW1vdGVbMF0sIHBvLT5wcHBvZV9wYS5yZW1vdGVbMV0sCisJCSAgIHBvLT5wcHBvZV9wYS5yZW1vdGVbMl0sIHBvLT5wcHBvZV9wYS5yZW1vdGVbM10sCisJCSAgIHBvLT5wcHBvZV9wYS5yZW1vdGVbNF0sIHBvLT5wcHBvZV9wYS5yZW1vdGVbNV0sIGRldl9uYW1lKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBwcG94X3NvY2sgKnBwcG9lX2dldF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBOVUxMOworCWludCBpID0gMDsKKworCWZvciAoOyBpIDwgUFBQT0VfSEFTSF9TSVpFOyBpKyspIHsKKwkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaV07CisJCXdoaWxlIChwbykgeworCQkJaWYgKCFwb3MtLSkKKwkJCQlnb3RvIG91dDsKKwkJCXBvID0gcG8tPm5leHQ7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHBvOworfQorCitzdGF0aWMgdm9pZCAqcHBwb2Vfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJcmV0dXJuIGwgPyBwcHBvZV9nZXRfaWR4KC0tbCkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpwcHBvZV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvOworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlwbyA9IHBwcG9lX2dldF9pZHgoMCk7CisJCWdvdG8gb3V0OworCX0KKwlwbyA9IHY7CisJaWYgKHBvLT5uZXh0KSAKKwkJcG8gPSBwby0+bmV4dDsKKwllbHNlIHsKKwkJaW50IGhhc2ggPSBoYXNoX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSk7CisKKwkJd2hpbGUgKCsraGFzaCA8IFBQUE9FX0hBU0hfU0laRSkgeworCQkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJCQlpZiAocG8pCisJCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHBvOworfQorCitzdGF0aWMgdm9pZCBwcHBvZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcHBvZV9zZXFfb3BzID0geworCS5zdGFydAkJPSBwcHBvZV9zZXFfc3RhcnQsCisJLm5leHQJCT0gcHBwb2Vfc2VxX25leHQsCisJLnN0b3AJCT0gcHBwb2Vfc2VxX3N0b3AsCisJLnNob3cJCT0gcHBwb2Vfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHBwcG9lX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcHBwb2Vfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBwcG9lX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcHBvZV9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHBwb2VfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwcHBvZSIsIFNfSVJVR08sIHByb2NfbmV0KTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+cHJvY19mb3BzID0gJnBwcG9lX3NlcV9mb3BzOworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX1BST0NfRlMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBwcG9lX3Byb2NfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogLT5pb2N0bCBhcmUgc2V0IGF0IHBwcG94X2NyZWF0ZSAqLworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwcHBvZV9vcHMgPSB7CisgICAgLmZhbWlseQkJPSBBRl9QUFBPWCwKKyAgICAub3duZXIJCT0gVEhJU19NT0RVTEUsCisgICAgLnJlbGVhc2UJCT0gcHBwb2VfcmVsZWFzZSwKKyAgICAuYmluZAkJPSBzb2NrX25vX2JpbmQsCisgICAgLmNvbm5lY3QJCT0gcHBwb2VfY29ubmVjdCwKKyAgICAuc29ja2V0cGFpcgkJPSBzb2NrX25vX3NvY2tldHBhaXIsCisgICAgLmFjY2VwdAkJPSBzb2NrX25vX2FjY2VwdCwKKyAgICAuZ2V0bmFtZQkJPSBwcHBvZV9nZXRuYW1lLAorICAgIC5wb2xsCQk9IGRhdGFncmFtX3BvbGwsCisgICAgLmxpc3RlbgkJPSBzb2NrX25vX2xpc3RlbiwKKyAgICAuc2h1dGRvd24JCT0gc29ja19ub19zaHV0ZG93biwKKyAgICAuc2V0c29ja29wdAkJPSBzb2NrX25vX3NldHNvY2tvcHQsCisgICAgLmdldHNvY2tvcHQJCT0gc29ja19ub19nZXRzb2Nrb3B0LAorICAgIC5zZW5kbXNnCQk9IHBwcG9lX3NlbmRtc2csCisgICAgLnJlY3Ztc2cJCT0gcHBwb2VfcmVjdm1zZywKKyAgICAubW1hcAkJPSBzb2NrX25vX21tYXAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHBwb3hfcHJvdG8gcHBwb2VfcHJvdG8gPSB7CisgICAgLmNyZWF0ZQk9IHBwcG9lX2NyZWF0ZSwKKyAgICAuaW9jdGwJPSBwcHBvZV9pb2N0bCwKKyAgICAub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcHBwb2VfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSBwcm90b19yZWdpc3RlcigmcHBwb2Vfc2tfcHJvdG8sIDApOworCisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKyAJZXJyID0gcmVnaXN0ZXJfcHBwb3hfcHJvdG8oUFhfUFJPVE9fT0UsICZwcHBvZV9wcm90byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9wcHBvZV9wcm90bzsKKworCWVyciA9IHBwcG9lX3Byb2NfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfcHBwb3hfcHJvdG87CisJCisJZGV2X2FkZF9wYWNrKCZwcHBvZXNfcHR5cGUpOworCWRldl9hZGRfcGFjaygmcHBwb2VkX3B0eXBlKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBwcG9lX25vdGlmaWVyKTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VucmVnaXN0ZXJfcHBwb3hfcHJvdG86CisJdW5yZWdpc3Rlcl9wcHBveF9wcm90byhQWF9QUk9UT19PRSk7CitvdXRfdW5yZWdpc3Rlcl9wcHBvZV9wcm90bzoKKwlwcm90b191bnJlZ2lzdGVyKCZwcHBvZV9za19wcm90byk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcHBvZV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9wcHBveF9wcm90byhQWF9QUk9UT19PRSk7CisJZGV2X3JlbW92ZV9wYWNrKCZwcHBvZXNfcHR5cGUpOworCWRldl9yZW1vdmVfcGFjaygmcHBwb2VkX3B0eXBlKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHBwb2Vfbm90aWZpZXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJwcHBvZSIsIHByb2NfbmV0KTsKKwlwcm90b191bnJlZ2lzdGVyKCZwcHBvZV9za19wcm90byk7Cit9CisKK21vZHVsZV9pbml0KHBwcG9lX2luaXQpOworbW9kdWxlX2V4aXQocHBwb2VfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhbCBPc3Ryb3dza2kgPG1vc3Ryb3dzQHNwZWFrZWFzeS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBQUCBvdmVyIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX1BQUE9YKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG94LmMgYi9kcml2ZXJzL25ldC9wcHBveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wcHBveC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBYL0V0aGVybmV0IChQUFBvWC9QUFBvRSkgU29ja2V0cworICoKKyAqIFBQUG9YIC0tLSBHZW5lcmljIFBQUCBlbmNhcHN1bGF0aW9uIHNvY2tldCBmYW1pbHkKKyAqIFBQUG9FIC0tLSBQUFAgb3ZlciBFdGhlcm5ldCAoUkZDIDI1MTYpCisgKgorICoKKyAqIFZlcnNpb246CTAuNS4yCisgKgorICogQXV0aG9yOglNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PgorICoKKyAqIDA1MTAwMCA6CUluaXRpYWxpemF0aW9uIGNsZWFudXAKKyAqCisgKiBMaWNlbnNlOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHN0cnVjdCBwcHBveF9wcm90byAqcHBwb3hfcHJvdG9zW1BYX01BWF9QUk9UTyArIDFdOworCitpbnQgcmVnaXN0ZXJfcHBwb3hfcHJvdG8oaW50IHByb3RvX251bSwgc3RydWN0IHBwcG94X3Byb3RvICpwcCkKK3sKKwlpZiAocHJvdG9fbnVtIDwgMCB8fCBwcm90b19udW0gPiBQWF9NQVhfUFJPVE8pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwcHBveF9wcm90b3NbcHJvdG9fbnVtXSkKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwlwcHBveF9wcm90b3NbcHJvdG9fbnVtXSA9IHBwOworCXJldHVybiAwOworfQorCit2b2lkIHVucmVnaXN0ZXJfcHBwb3hfcHJvdG8oaW50IHByb3RvX251bSkKK3sKKwlpZiAocHJvdG9fbnVtID49IDAgJiYgcHJvdG9fbnVtIDw9IFBYX01BWF9QUk9UTykKKwkJcHBwb3hfcHJvdG9zW3Byb3RvX251bV0gPSBOVUxMOworfQorCit2b2lkIHBwcG94X3VuYmluZF9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBDbGVhciBjb25uZWN0aW9uIHRvIHBwcCBkZXZpY2UsIGlmIGF0dGFjaGVkLiAqLworCisJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9CT1VORCB8IFBQUE9YX1pPTUJJRSkpIHsKKwkJcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgmcHBwb3hfc2soc2spLT5jaGFuKTsKKwkJc2stPnNrX3N0YXRlID0gUFBQT1hfREVBRDsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfcHBwb3hfcHJvdG8pOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKTsKK0VYUE9SVF9TWU1CT0wocHBwb3hfdW5iaW5kX3NvY2spOworCitzdGF0aWMgaW50IHBwcG94X2lvY3RsKHN0cnVjdCBzb2NrZXQqIHNvY2ssIHVuc2lnbmVkIGludCBjbWQsIAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCByYyA9IDA7CisKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dDSEFOOiB7CisJCWludCBpbmRleDsKKwkJcmMgPSAtRU5PVENPTk47CisJCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQlyYyA9IC1FSU5WQUw7CisJCWluZGV4ID0gcHBwX2NoYW5uZWxfaW5kZXgoJnBvLT5jaGFuKTsKKwkJaWYgKHB1dF91c2VyKGluZGV4ICwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCisJCXJjID0gMDsKKwkJc2stPnNrX3N0YXRlIHw9IFBQUE9YX0JPVU5EOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJaWYgKHBwcG94X3Byb3Rvc1tzay0+c2tfcHJvdG9jb2xdLT5pb2N0bCkKKwkJCXJjID0gcHBwb3hfcHJvdG9zW3NrLT5za19wcm90b2NvbF0tPmlvY3RsKHNvY2ssIGNtZCwKKwkJCQkJCQkJICBhcmcpOworCisJCWJyZWFrOworCX07CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IHBwcG94X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJaW50IHJjID0gLUVQUk9UT1RZUEU7CisKKwlpZiAocHJvdG9jb2wgPCAwIHx8IHByb3RvY29sID4gUFhfTUFYX1BST1RPKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAoIXBwcG94X3Byb3Rvc1twcm90b2NvbF0gfHwKKwkgICAgIXRyeV9tb2R1bGVfZ2V0KHBwcG94X3Byb3Rvc1twcm90b2NvbF0tPm93bmVyKSkKKwkJZ290byBvdXQ7CisKKwlyYyA9IHBwcG94X3Byb3Rvc1twcm90b2NvbF0tPmNyZWF0ZShzb2NrKTsKKwlpZiAoIXJjKSB7CisJCS8qIFdlIGdldCB0byBzZXQgdGhlIGlvY3RsIGhhbmRsZXIuICovCisJCS8qIEZvciBldmVyeXRoaW5nIGVsc2UsIHBwcG94IGlzIGp1c3QgYSBzaGVsbC4gKi8KKwkJc29jay0+b3BzLT5pb2N0bCA9IHBwcG94X2lvY3RsOworCX0KKwltb2R1bGVfcHV0KHBwcG94X3Byb3Rvc1twcm90b2NvbF0tPm93bmVyKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBwcHBveF9wcm90b19mYW1pbHkgPSB7CisJLmZhbWlseQk9IFBGX1BQUE9YLAorCS5jcmVhdGUJPSBwcHBveF9jcmVhdGUsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcHBveF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNvY2tfcmVnaXN0ZXIoJnBwcG94X3Byb3RvX2ZhbWlseSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcHBveF9leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX1BQUE9YKTsKK30KKworbW9kdWxlX2luaXQocHBwb3hfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBveF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFsIE9zdHJvd3NraSA8bW9zdHJvd3NAc3BlYWtlYXN5Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFBQIG92ZXIgRXRoZXJuZXQgZHJpdmVyIChnZW5lcmljIHNvY2tldCBsYXllcikiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGU0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC0wLDAgKzEsMjUyMyBAQAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyByODE2OS5jOiBBIFJlYWxUZWsgUlRMLTgxNjkgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4IGtlcm5lbCAyLjQueC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgSGlzdG9yeToKKyBGZWIgIDQgMjAwMgktIGNyZWF0ZWQgaW5pdGlhbGx5IGJ5IFNodUNoZW4gPHNodWNoZW5AcmVhbHRlay5jb20udHc+LgorIE1heSAyMCAyMDAyCS0gQWRkIGxpbmsgc3RhdHVzIGZvcmNlLW1vZGUgYW5kIFRCSSBtb2RlIHN1cHBvcnQuCisgICAgICAgIDIwMDQJLSBNYXNzaXZlIHVwZGF0ZXMuIFNlZSBrZXJuZWwgU0NNIHN5c3RlbSBmb3IgZGV0YWlscy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgMS4gW0RFUFJFQ0FURUQ6IHVzZSBldGh0b29sIGluc3RlYWRdIFRoZSBtZWRpYSBjYW4gYmUgZm9yY2VkIGluIDUgbW9kZXMuCisJIENvbW1hbmQ6ICdpbnNtb2QgcjgxNjkgbWVkaWEgPSBTRVRfTUVESUEnCisJIEV4OgkgICdpbnNtb2QgcjgxNjkgbWVkaWEgPSAweDA0JyB3aWxsIGZvcmNlIFBIWSB0byBvcGVyYXRlIGluIDEwME1wYnMgSGFsZi1kdXBsZXguCisJCisJIFNFVF9NRURJQSBjYW4gYmU6CisgCQlfMTBfSGFsZgk9IDB4MDEKKyAJCV8xMF9GdWxsCT0gMHgwMgorIAkJXzEwMF9IYWxmCT0gMHgwNAorIAkJXzEwMF9GdWxsCT0gMHgwOAorIAkJXzEwMDBfRnVsbAk9IDB4MTAKKyAgCisgIDIuIFN1cHBvcnQgVEJJIG1vZGUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWRVJTSU9OIDEuMQk8MjAwMi8xMC80PgorCisJVGhlIGJpdDQ6MCBvZiBNSUkgcmVnaXN0ZXIgNCBpcyBjYWxsZWQgInNlbGVjdG9yIGZpZWxkIiwgYW5kIGhhdmUgdG8gYmUKKwkwMDAwMWIgdG8gaW5kaWNhdGUgc3VwcG9ydCBvZiBJRUVFIHN0ZCA4MDIuMyBkdXJpbmcgTldheSBwcm9jZXNzIG9mCisJZXhjaGFuZ2luZyBMaW5rIENvZGUgV29yZCAoRkxQKS4gCisKK1ZFUlNJT04gMS4yCTwyMDAyLzExLzMwPgorCisJLSBMYXJnZSBzdHlsZSBjbGVhbnVwCisJLSBVc2UgZXRoZXJfY3JjIGluIHN0b2NrIGtlcm5lbCAobGludXgvY3JjMzIuaCkKKwktIENvcHkgbWNfZmlsdGVyIHNldHVwIGNvZGUgZnJvbSA4MTM5Y3AKKwkgIChpbmNsdWRlcyBhbiBvcHRpbWl6YXRpb24sIGFuZCBhdm9pZHMgc2V0X2JpdCB1c2UpCisKK1ZFUlNJT04gMS42TEsJPDIwMDQvMDQvMTQ+CisKKwktIE1lcmdlIG9mIFJlYWx0ZWsncyB2ZXJzaW9uIDEuNgorCS0gQ29udmVyc2lvbiB0byBETUEgQVBJCisJLSBTdXNwZW5kL3Jlc3VtZQorCS0gRW5kaWFubmVzcworCS0gTWlzYyBSeC9UeCBidWdzCisKK1ZFUlNJT04gMi4yTEsJPDIwMDUvMDEvMjU+CisKKwktIFJYIGNzdW0sIFRYIGNzdW0vU0csIFRTTworCS0gVkxBTgorCS0gYmFieSAoPCA3MjAwKSBKdW1ibyBmcmFtZXMgc3VwcG9ydAorCS0gTWVyZ2Ugb2YgUmVhbHRlaydzIHZlcnNpb24gMi4yIChuZXcgcGh5KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFJUTDgxNjlfVkVSU0lPTiAiMi4yTEsiCisjZGVmaW5lIE1PRFVMRU5BTUUgInI4MTY5IgorI2RlZmluZSBQRlggTU9EVUxFTkFNRSAiOiAiCisKKyNpZmRlZiBSVEw4MTY5X0RFQlVHCisjZGVmaW5lIGFzc2VydChleHByKSBcCisgICAgICAgIGlmKCEoZXhwcikpIHsJCQkJCVwKKwkgICAgICAgIHByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsCVwKKyAgICAgICAgCSNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CQlcCisgICAgICAgIH0KKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCWRvIHsgcHJpbnRrKFBGWCBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogUlRMODE2OV9ERUJVRyAqLworCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKHRwKSBcCisJKHRwLT5kaXJ0eV90eCArIE5VTV9UWF9ERVNDIC0gdHAtPmN1cl90eCAtIDEpCisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorI2RlZmluZSBydGw4MTY5X3J4X3NrYgkJCW5ldGlmX3JlY2VpdmVfc2tiCisjZGVmaW5lIHJ0bDgxNjlfcnhfaHdhY2NlbF9za2IJCXZsYW5faHdhY2NlbF9yeAorI2RlZmluZSBydGw4MTY5X3J4X3F1b3RhKGNvdW50LCBxdW90YSkJbWluKGNvdW50LCBxdW90YSkKKyNlbHNlCisjZGVmaW5lIHJ0bDgxNjlfcnhfc2tiCQkJbmV0aWZfcngKKyNkZWZpbmUgcnRsODE2OV9yeF9od2FjY2VsX3NrYgkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiCisjZGVmaW5lIHJ0bDgxNjlfcnhfcXVvdGEoY291bnQsIHF1b3RhKQljb3VudAorI2VuZGlmCisKKy8qIG1lZGlhIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgKK3N0YXRpYyBpbnQgbWVkaWFbTUFYX1VOSVRTXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CitzdGF0aWMgaW50IG51bV9tZWRpYSA9IDA7CisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJUTCBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworCisvKiBNQUMgYWRkcmVzcyBsZW5ndGggKi8KKyNkZWZpbmUgTUFDX0FERFJfTEVOCTYKKworI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk3CS8qIDcgbWVhbnMgTk8gdGhyZXNob2xkLCBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KKyNkZWZpbmUgVFhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIEVhcmx5VHhUaGxkIAkweDNGCS8qIDB4M0YgbWVhbnMgTk8gZWFybHkgdHJhbnNtaXQgKi8KKyNkZWZpbmUgUnhQYWNrZXRNYXhTaXplCTB4M0ZFOAkvKiAxNksgLSAxIC0gRVRIX0hMRU4gLSBWTEFOIC0gQ1JDLi4uICovCisjZGVmaW5lIFNhZmVNdHUJCTB4MWMyMAkvKiAuLi4gYWN0dWFsbHkgbGlmZSBzdWNrcyBiZXlvbmQgfjdrICovCisjZGVmaW5lIEludGVyRnJhbWVHYXAJMHgwMwkvKiAzIG1lYW5zIEludGVyRnJhbWVHYXAgPSB0aGUgc2hvcnRlc3Qgb25lICovCisKKyNkZWZpbmUgUjgxNjlfUkVHU19TSVpFCQkyNTYKKyNkZWZpbmUgUjgxNjlfTkFQSV9XRUlHSFQJNjQKKyNkZWZpbmUgTlVNX1RYX0RFU0MJNjQJLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5VTV9SWF9ERVNDCTI1NgkvKiBOdW1iZXIgb2YgUnggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUlhfQlVGX1NJWkUJMTUzNgkvKiBSeCBCdWZmZXIgc2l6ZSAqLworI2RlZmluZSBSODE2OV9UWF9SSU5HX0JZVEVTCShOVU1fVFhfREVTQyAqIHNpemVvZihzdHJ1Y3QgVHhEZXNjKSkKKyNkZWZpbmUgUjgxNjlfUlhfUklOR19CWVRFUwkoTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFJ4RGVzYykpCisKKyNkZWZpbmUgUlRMODE2OV9UWF9USU1FT1VUCSg2KkhaKQorI2RlZmluZSBSVEw4MTY5X1BIWV9USU1FT1VUCSgxMCpIWikKKworLyogd3JpdGUvcmVhZCBNTUlPIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUTF9XOChyZWcsIHZhbDgpCXdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1cxNihyZWcsIHZhbDE2KQl3cml0ZXcgKCh2YWwxNiksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfVzMyKHJlZywgdmFsMzIpCXdyaXRlbCAoKHZhbDMyKSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SOChyZWcpCQlyZWFkYiAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMTYocmVnKQkJcmVhZHcgKGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgcmVhZGwgKGlvYWRkciArIChyZWcpKSkKKworZW51bSBtYWNfdmVyc2lvbiB7CisJUlRMX0dJR0FfTUFDX1ZFUl9CID0gMHgwMCwKKwkvKiBSVExfR0lHQV9NQUNfVkVSX0MgPSAweDAzLCAqLworCVJUTF9HSUdBX01BQ19WRVJfRCA9IDB4MDEsCisJUlRMX0dJR0FfTUFDX1ZFUl9FID0gMHgwMiwKKwlSVExfR0lHQV9NQUNfVkVSX1ggPSAweDA0CS8qIEdyZWF0ZXIgdGhhbiBSVExfR0lHQV9NQUNfVkVSX0UgKi8KK307CisKK2VudW0gcGh5X3ZlcnNpb24geworCVJUTF9HSUdBX1BIWV9WRVJfQyA9IDB4MDMsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAwICovCisJUlRMX0dJR0FfUEhZX1ZFUl9EID0gMHgwNCwgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDAgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0UgPSAweDA1LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMCAqLworCVJUTF9HSUdBX1BIWV9WRVJfRiA9IDB4MDYsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAxICovCisJUlRMX0dJR0FfUEhZX1ZFUl9HID0gMHgwNywgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDIgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0ggPSAweDA4LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMyAqLworfTsKKworCisjZGVmaW5lIF9SKE5BTUUsTUFDLE1BU0spIFwKKwl7IC5uYW1lID0gTkFNRSwgLm1hY192ZXJzaW9uID0gTUFDLCAuUnhDb25maWdNYXNrID0gTUFTSyB9CisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggbWFjX3ZlcnNpb247CisJdTMyIFJ4Q29uZmlnTWFzazsJLyogQ2xlYXJzIHRoZSBiaXRzIHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgKi8KK30gcnRsX2NoaXBfaW5mb1tdID0geworCV9SKCJSVEw4MTY5IiwJCVJUTF9HSUdBX01BQ19WRVJfQiwgMHhmZjdlMTg4MCksCisJX1IoIlJUTDgxNjlzLzgxMTBzIiwJUlRMX0dJR0FfTUFDX1ZFUl9ELCAweGZmN2UxODgwKSwKKwlfUigiUlRMODE2OXMvODExMHMiLAlSVExfR0lHQV9NQUNfVkVSX0UsIDB4ZmY3ZTE4ODApLAorCV9SKCJSVEw4MTY5cy84MTEwcyIsCVJUTF9HSUdBX01BQ19WRVJfWCwgMHhmZjdlMTg4MCksCit9OworI3VuZGVmIF9SCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4MTY5X3BjaV90YmxbXSA9IHsKKwl7MHgxMGVjLCAweDgxNjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsweDExODYsIDB4NDMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGw4MTY5X3BjaV90YmwpOworCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKK3N0YXRpYyBpbnQgdXNlX2RhYzsKKworZW51bSBSVEw4MTY5X3JlZ2lzdGVycyB7CisJTUFDMCA9IDAsCQkvKiBFdGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworCU1BUjAgPSA4LAkJLyogTXVsdGljYXN0IGZpbHRlci4gKi8KKwlUeERlc2NTdGFydEFkZHJMb3cgPSAweDIwLAorCVR4RGVzY1N0YXJ0QWRkckhpZ2ggPSAweDI0LAorCVR4SERlc2NTdGFydEFkZHJMb3cgPSAweDI4LAorCVR4SERlc2NTdGFydEFkZHJIaWdoID0gMHgyYywKKwlGTEFTSCA9IDB4MzAsCisJRVJTUiA9IDB4MzYsCisJQ2hpcENtZCA9IDB4MzcsCisJVHhQb2xsID0gMHgzOCwKKwlJbnRyTWFzayA9IDB4M0MsCisJSW50clN0YXR1cyA9IDB4M0UsCisJVHhDb25maWcgPSAweDQwLAorCVJ4Q29uZmlnID0gMHg0NCwKKwlSeE1pc3NlZCA9IDB4NEMsCisJQ2ZnOTM0NiA9IDB4NTAsCisJQ29uZmlnMCA9IDB4NTEsCisJQ29uZmlnMSA9IDB4NTIsCisJQ29uZmlnMiA9IDB4NTMsCisJQ29uZmlnMyA9IDB4NTQsCisJQ29uZmlnNCA9IDB4NTUsCisJQ29uZmlnNSA9IDB4NTYsCisJTXVsdGlJbnRyID0gMHg1QywKKwlQSFlBUiA9IDB4NjAsCisJVEJJQ1NSID0gMHg2NCwKKwlUQklfQU5BUiA9IDB4NjgsCisJVEJJX0xQQVIgPSAweDZBLAorCVBIWXN0YXR1cyA9IDB4NkMsCisJUnhNYXhTaXplID0gMHhEQSwKKwlDUGx1c0NtZCA9IDB4RTAsCisJSW50ck1pdGlnYXRlID0gMHhFMiwKKwlSeERlc2NBZGRyTG93ID0gMHhFNCwKKwlSeERlc2NBZGRySGlnaCA9IDB4RTgsCisJRWFybHlUeFRocmVzID0gMHhFQywKKwlGdW5jRXZlbnQgPSAweEYwLAorCUZ1bmNFdmVudE1hc2sgPSAweEY0LAorCUZ1bmNQcmVzZXRTdGF0ZSA9IDB4RjgsCisJRnVuY0ZvcmNlRXZlbnQgPSAweEZDLAorfTsKKworZW51bSBSVEw4MTY5X3JlZ2lzdGVyX2NvbnRlbnQgeworCS8qIEludGVycnVwdFN0YXR1c0JpdHMgKi8KKwlTWVNFcnIgPSAweDgwMDAsCisJUENTVGltZW91dCA9IDB4NDAwMCwKKwlTV0ludCA9IDB4MDEwMCwKKwlUeERlc2NVbmF2YWlsID0gMHg4MCwKKwlSeEZJRk9PdmVyID0gMHg0MCwKKwlMaW5rQ2hnID0gMHgyMCwKKwlSeE92ZXJmbG93ID0gMHgxMCwKKwlUeEVyciA9IDB4MDgsCisJVHhPSyA9IDB4MDQsCisJUnhFcnIgPSAweDAyLAorCVJ4T0sgPSAweDAxLAorCisJLyogUnhTdGF0dXNEZXNjICovCisJUnhSRVMgPSAweDAwMjAwMDAwLAorCVJ4Q1JDID0gMHgwMDA4MDAwMCwKKwlSeFJVTlQgPSAweDAwMTAwMDAwLAorCVJ4UldUID0gMHgwMDQwMDAwMCwKKworCS8qIENoaXBDbWRCaXRzICovCisJQ21kUmVzZXQgPSAweDEwLAorCUNtZFJ4RW5iID0gMHgwOCwKKwlDbWRUeEVuYiA9IDB4MDQsCisJUnhCdWZFbXB0eSA9IDB4MDEsCisKKwkvKiBDZmc5MzQ2Qml0cyAqLworCUNmZzkzNDZfTG9jayA9IDB4MDAsCisJQ2ZnOTM0Nl9VbmxvY2sgPSAweEMwLAorCisJLyogcnhfbW9kZV9iaXRzICovCisJQWNjZXB0RXJyID0gMHgyMCwKKwlBY2NlcHRSdW50ID0gMHgxMCwKKwlBY2NlcHRCcm9hZGNhc3QgPSAweDA4LAorCUFjY2VwdE11bHRpY2FzdCA9IDB4MDQsCisJQWNjZXB0TXlQaHlzID0gMHgwMiwKKwlBY2NlcHRBbGxQaHlzID0gMHgwMSwKKworCS8qIFJ4Q29uZmlnQml0cyAqLworCVJ4Q2ZnRklGT1NoaWZ0ID0gMTMsCisJUnhDZmdETUFTaGlmdCA9IDgsCisKKwkvKiBUeENvbmZpZ0JpdHMgKi8KKwlUeEludGVyRnJhbWVHYXBTaGlmdCA9IDI0LAorCVR4RE1BU2hpZnQgPSA4LAkvKiBETUEgYnVyc3QgdmFsdWUgKDAtNykgaXMgc2hpZnQgdGhpcyBtYW55IGJpdHMgKi8KKworCS8qIFRCSUNTUiBwLjI4ICovCisJVEJJUmVzZXQJPSAweDgwMDAwMDAwLAorCVRCSUxvb3BiYWNrCT0gMHg0MDAwMDAwMCwKKwlUQklOd0VuYWJsZQk9IDB4MjAwMDAwMDAsCisJVEJJTndSZXN0YXJ0CT0gMHgxMDAwMDAwMCwKKwlUQklMaW5rT2sJPSAweDAyMDAwMDAwLAorCVRCSU53Q29tcGxldGUJPSAweDAxMDAwMDAwLAorCisJLyogQ1BsdXNDbWQgcC4zMSAqLworCVJ4VmxhbgkJPSAoMSA8PCA2KSwKKwlSeENoa1N1bQk9ICgxIDw8IDUpLAorCVBDSURBQwkJPSAoMSA8PCA0KSwKKwlQQ0lNdWxSVwk9ICgxIDw8IDMpLAorCisJLyogcnRsODE2OV9QSFlzdGF0dXMgKi8KKwlUQklfRW5hYmxlID0gMHg4MCwKKwlUeEZsb3dDdHJsID0gMHg0MCwKKwlSeEZsb3dDdHJsID0gMHgyMCwKKwlfMTAwMGJwc0YgPSAweDEwLAorCV8xMDBicHMgPSAweDA4LAorCV8xMGJwcyA9IDB4MDQsCisJTGlua1N0YXR1cyA9IDB4MDIsCisJRnVsbER1cCA9IDB4MDEsCisKKwkvKiBHSUdBQklUX1BIWV9yZWdpc3RlcnMgKi8KKwlQSFlfQ1RSTF9SRUcgPSAwLAorCVBIWV9TVEFUX1JFRyA9IDEsCisJUEhZX0FVVE9fTkVHT19SRUcgPSA0LAorCVBIWV8xMDAwX0NUUkxfUkVHID0gOSwKKworCS8qIEdJR0FCSVRfUEhZX1JFR19CSVQgKi8KKwlQSFlfUmVzdGFydF9BdXRvX05lZ28gPSAweDAyMDAsCisJUEhZX0VuYWJsZV9BdXRvX05lZ28gPSAweDEwMDAsCisKKwkvKiBQSFlfU1RBVF9SRUcgPSAxICovCisJUEhZX0F1dG9fTmVjb19Db21wID0gMHgwMDIwLAorCisJLyogUEhZX0FVVE9fTkVHT19SRUcgPSA0ICovCisJUEhZX0NhcF8xMF9IYWxmID0gMHgwMDIwLAorCVBIWV9DYXBfMTBfRnVsbCA9IDB4MDA0MCwKKwlQSFlfQ2FwXzEwMF9IYWxmID0gMHgwMDgwLAorCVBIWV9DYXBfMTAwX0Z1bGwgPSAweDAxMDAsCisKKwkvKiBQSFlfMTAwMF9DVFJMX1JFRyA9IDkgKi8KKwlQSFlfQ2FwXzEwMDBfRnVsbCA9IDB4MDIwMCwKKworCVBIWV9DYXBfTnVsbCA9IDB4MCwKKworCS8qIF9NZWRpYVR5cGUgKi8KKwlfMTBfSGFsZiA9IDB4MDEsCisJXzEwX0Z1bGwgPSAweDAyLAorCV8xMDBfSGFsZiA9IDB4MDQsCisJXzEwMF9GdWxsID0gMHgwOCwKKwlfMTAwMF9GdWxsID0gMHgxMCwKKworCS8qIF9UQklDU1JCaXQgKi8KKwlUQklMaW5rT0sgPSAweDAyMDAwMDAwLAorfTsKKworZW51bSBfRGVzY1N0YXR1c0JpdCB7CisJRGVzY093bgkJPSAoMSA8PCAzMSksIC8qIERlc2NyaXB0b3IgaXMgb3duZWQgYnkgTklDICovCisJUmluZ0VuZAkJPSAoMSA8PCAzMCksIC8qIEVuZCBvZiBkZXNjcmlwdG9yIHJpbmcgKi8KKwlGaXJzdEZyYWcJPSAoMSA8PCAyOSksIC8qIEZpcnN0IHNlZ21lbnQgb2YgYSBwYWNrZXQgKi8KKwlMYXN0RnJhZwk9ICgxIDw8IDI4KSwgLyogRmluYWwgc2VnbWVudCBvZiBhIHBhY2tldCAqLworCisJLyogVHggcHJpdmF0ZSAqLworCUxhcmdlU2VuZAk9ICgxIDw8IDI3KSwgLyogVENQIExhcmdlIFNlbmQgT2ZmbG9hZCAoVFNPKSAqLworCU1TU1NoaWZ0CT0gMTYsICAgICAgICAvKiBNU1MgdmFsdWUgcG9zaXRpb24gKi8KKwlNU1NNYXNrCQk9IDB4ZmZmLCAgICAgLyogTVNTIHZhbHVlICsgTGFyZ2VTZW5kIGJpdDogMTIgYml0cyAqLworCUlQQ1MJCT0gKDEgPDwgMTgpLCAvKiBDYWxjdWxhdGUgSVAgY2hlY2tzdW0gKi8KKwlVRFBDUwkJPSAoMSA8PCAxNyksIC8qIENhbGN1bGF0ZSBVRFAvSVAgY2hlY2tzdW0gKi8KKwlUQ1BDUwkJPSAoMSA8PCAxNiksIC8qIENhbGN1bGF0ZSBUQ1AvSVAgY2hlY2tzdW0gKi8KKwlUeFZsYW5UYWcJPSAoMSA8PCAxNyksIC8qIEFkZCBWTEFOIHRhZyAqLworCisJLyogUnggcHJpdmF0ZSAqLworCVBJRDEJCT0gKDEgPDwgMTgpLCAvKiBQcm90b2NvbCBJRCBiaXQgMS8yICovCisJUElEMAkJPSAoMSA8PCAxNyksIC8qIFByb3RvY29sIElEIGJpdCAyLzIgKi8KKworI2RlZmluZSBSeFByb3RvVURQCShQSUQxKQorI2RlZmluZSBSeFByb3RvVENQCShQSUQwKQorI2RlZmluZSBSeFByb3RvSVAJKFBJRDEgfCBQSUQwKQorI2RlZmluZSBSeFByb3RvTWFzawlSeFByb3RvSVAKKworCUlQRmFpbAkJPSAoMSA8PCAxNiksIC8qIElQIGNoZWNrc3VtIGZhaWxlZCAqLworCVVEUEZhaWwJCT0gKDEgPDwgMTUpLCAvKiBVRFAvSVAgY2hlY2tzdW0gZmFpbGVkICovCisJVENQRmFpbAkJPSAoMSA8PCAxNCksIC8qIFRDUC9JUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlSeFZsYW5UYWcJPSAoMSA8PCAxNiksIC8qIFZMQU4gdGFnIGF2YWlsYWJsZSAqLworfTsKKworI2RlZmluZSBSc3ZkTWFzawkweDNmZmZjMDAwCisKK3N0cnVjdCBUeERlc2MgeworCXUzMiBvcHRzMTsKKwl1MzIgb3B0czI7CisJdTY0IGFkZHI7Cit9OworCitzdHJ1Y3QgUnhEZXNjIHsKKwl1MzIgb3B0czE7CisJdTMyIG9wdHMyOworCXU2NCBhZGRyOworfTsKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwl1MzIJCWxlbjsKKwl1OAkJX19wYWRbc2l6ZW9mKHZvaWQgKikgLSBzaXplb2YodTMyKV07Cit9OworCitzdHJ1Y3QgcnRsODE2OV9wcml2YXRlIHsKKwl2b2lkIF9faW9tZW0gKm1taW9fYWRkcjsJLyogbWVtb3J5IG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CS8qIEluZGV4IG9mIFBDSSBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogc3RhdGlzdGljcyBvZiBuZXQgZGV2aWNlICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogc3BpbiBsb2NrIGZsYWcgKi8KKwlpbnQgY2hpcHNldDsKKwlpbnQgbWFjX3ZlcnNpb247CisJaW50IHBoeV92ZXJzaW9uOworCXUzMiBjdXJfcng7IC8qIEluZGV4IGludG8gdGhlIFJ4IGRlc2NyaXB0b3IgYnVmZmVyIG9mIG5leHQgUnggcGt0LiAqLworCXUzMiBjdXJfdHg7IC8qIEluZGV4IGludG8gdGhlIFR4IGRlc2NyaXB0b3IgYnVmZmVyIG9mIG5leHQgUnggcGt0LiAqLworCXUzMiBkaXJ0eV9yeDsKKwl1MzIgZGlydHlfdHg7CisJc3RydWN0IFR4RGVzYyAqVHhEZXNjQXJyYXk7CS8qIDI1Ni1hbGlnbmVkIFR4IGRlc2NyaXB0b3IgcmluZyAqLworCXN0cnVjdCBSeERlc2MgKlJ4RGVzY0FycmF5OwkvKiAyNTYtYWxpZ25lZCBSeCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlkbWFfYWRkcl90IFR4UGh5QWRkcjsKKwlkbWFfYWRkcl90IFJ4UGh5QWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqUnhfc2tidWZmW05VTV9SWF9ERVNDXTsJLyogUnggZGF0YSBidWZmZXJzICovCisJc3RydWN0IHJpbmdfaW5mbyB0eF9za2JbTlVNX1RYX0RFU0NdOwkvKiBUeCBkYXRhIGJ1ZmZlcnMgKi8KKwl1bnNpZ25lZCByeF9idWZfc3o7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdTE2IGNwX2NtZDsKKwl1MTYgaW50cl9tYXNrOworCWludCBwaHlfYXV0b19uZWdvX3JlZzsKKwlpbnQgcGh5XzEwMDBfY3RybF9yZWc7CisjaWZkZWYgQ09ORklHX1I4MTY5X1ZMQU4KKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisjZW5kaWYKKwlpbnQgKCpzZXRfc3BlZWQpKHN0cnVjdCBuZXRfZGV2aWNlICosIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KTsKKwl2b2lkICgqZ2V0X3NldHRpbmdzKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKik7CisJdm9pZCAoKnBoeV9yZXNldF9lbmFibGUpKHZvaWQgX19pb21lbSAqKTsKKwl1bnNpZ25lZCBpbnQgKCpwaHlfcmVzZXRfcGVuZGluZykodm9pZCBfX2lvbWVtICopOworCXVuc2lnbmVkIGludCAoKmxpbmtfb2spKHZvaWQgX19pb21lbSAqKTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsKK307CisKK01PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgYW5kIHRoZSBMaW51eCByODE2OSBjcmV3IDxuZXRkZXZAb3NzLnNnaS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWxUZWsgUlRMLTgxNjkgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZWRpYSwgaW50LCAmbnVtX21lZGlhLCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXNlX2RhYywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2RhYywgIkVuYWJsZSBQQ0kgREFDLiBVbnNhZmUgb24gMzIgYml0IFBDSSBzbG90LiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUlRMODE2OV9WRVJTSU9OKTsKKworc3RhdGljIGludCBydGw4MTY5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJ0bDgxNjlfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBydGw4MTY5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHJ0bDgxNjlfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODE2OV9od19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODE2OV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBydGw4MTY5X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxNjlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBydGw4MTY5X3J4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICosCisJCQkJdm9pZCBfX2lvbWVtICopOworc3RhdGljIGludCBydGw4MTY5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOworc3RhdGljIHZvaWQgcnRsODE2OV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZkZWYgQ09ORklHX1I4MTY5X05BUEkKK3N0YXRpYyBpbnQgcnRsODE2OV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdTE2IHJ0bDgxNjlfaW50cl9tYXNrID0KKwlTWVNFcnIgfCBMaW5rQ2hnIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfCBUeEVyciB8IFR4T0sgfCBSeEVyciB8IFJ4T0s7CitzdGF0aWMgY29uc3QgdTE2IHJ0bDgxNjlfbmFwaV9ldmVudCA9CisJUnhPSyB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyIHwgVHhPSyB8IFR4RXJyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBydGw4MTY5X3J4X2NvbmZpZyA9CisgICAgKFJYX0ZJRk9fVEhSRVNIIDw8IFJ4Q2ZnRklGT1NoaWZ0KSB8IChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKKyNkZWZpbmUgUEhZX0NhcF8xMF9IYWxmX09yX0xlc3MgUEhZX0NhcF8xMF9IYWxmCisjZGVmaW5lIFBIWV9DYXBfMTBfRnVsbF9Pcl9MZXNzIFBIWV9DYXBfMTBfRnVsbCB8IFBIWV9DYXBfMTBfSGFsZl9Pcl9MZXNzCisjZGVmaW5lIFBIWV9DYXBfMTAwX0hhbGZfT3JfTGVzcyBQSFlfQ2FwXzEwMF9IYWxmIHwgUEhZX0NhcF8xMF9GdWxsX09yX0xlc3MKKyNkZWZpbmUgUEhZX0NhcF8xMDBfRnVsbF9Pcl9MZXNzIFBIWV9DYXBfMTAwX0Z1bGwgfCBQSFlfQ2FwXzEwMF9IYWxmX09yX0xlc3MKKworc3RhdGljIHZvaWQgbWRpb193cml0ZSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IFJlZ0FkZHIsIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCVJUTF9XMzIoUEhZQVIsIDB4ODAwMDAwMDAgfCAoUmVnQWRkciAmIDB4RkYpIDw8IDE2IHwgdmFsdWUpOworCXVkZWxheSgxMDAwKTsKKworCWZvciAoaSA9IDIwMDA7IGkgPiAwOyBpLS0pIHsKKwkJLyogQ2hlY2sgaWYgdGhlIFJUTDgxNjkgaGFzIGNvbXBsZXRlZCB3cml0aW5nIHRvIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJCWlmICghKFJUTF9SMzIoUEhZQVIpICYgMHg4MDAwMDAwMCkpIAorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBSZWdBZGRyKQoreworCWludCBpLCB2YWx1ZSA9IC0xOworCisJUlRMX1czMihQSFlBUiwgMHgwIHwgKFJlZ0FkZHIgJiAweEZGKSA8PCAxNik7CisJdWRlbGF5KDEwMDApOworCisJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworCQkvKiBDaGVjayBpZiB0aGUgUlRMODE2OSBoYXMgY29tcGxldGVkIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJCWlmIChSVExfUjMyKFBIWUFSKSAmIDB4ODAwMDAwMDApIHsKKwkJCXZhbHVlID0gKGludCkgKFJUTF9SMzIoUEhZQVIpICYgMHhGRkZGKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaXJxX21hc2tfYW5kX2Fjayh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlSVExfVzE2KEludHJNYXNrLCAweDAwMDApOworCisJUlRMX1cxNihJbnRyU3RhdHVzLCAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2FzaWNfZG93bih2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlSVExfVzgoQ2hpcENtZCwgMHgwMCk7CisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisJUlRMX1IxNihDUGx1c0NtZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gUlRMX1IzMihUQklDU1IpICYgVEJJUmVzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmcodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJcmV0dXJuIG1kaW9fcmVhZChpb2FkZHIsIDApICYgMHg4MDAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0bDgxNjlfdGJpX2xpbmtfb2sodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJcmV0dXJuIFJUTF9SMzIoVEJJQ1NSKSAmIFRCSUxpbmtPazsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3htaWlfbGlua19vayh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gUlRMX1I4KFBIWXN0YXR1cykgJiBMaW5rU3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3RiaV9yZXNldF9lbmFibGUodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJUlRMX1czMihUQklDU1IsIFJUTF9SMzIoVEJJQ1NSKSB8IFRCSVJlc2V0KTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZSh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gKG1kaW9fcmVhZChpb2FkZHIsIFBIWV9DVFJMX1JFRykgfCAweDgwMDApICYgMHhmZmZmOworCW1kaW9fd3JpdGUoaW9hZGRyLCBQSFlfQ1RSTF9SRUcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCWlmICh0cC0+bGlua19vayhpb2FkZHIpKSB7CisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBsaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworCX0gZWxzZQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfbGlua19vcHRpb24oaW50IGlkeCwgdTggKmF1dG9uZWcsIHUxNiAqc3BlZWQsIHU4ICpkdXBsZXgpCit7CisJc3RydWN0IHsKKwkJdTE2IHNwZWVkOworCQl1OCBkdXBsZXg7CisJCXU4IGF1dG9uZWc7CisJCXU4IG1lZGlhOworCX0gbGlua19zZXR0aW5nc1tdID0geworCQl7IFNQRUVEXzEwLAlEVVBMRVhfSEFMRiwgQVVUT05FR19ESVNBQkxFLAlfMTBfSGFsZiB9LAorCQl7IFNQRUVEXzEwLAlEVVBMRVhfRlVMTCwgQVVUT05FR19ESVNBQkxFLAlfMTBfRnVsbCB9LAorCQl7IFNQRUVEXzEwMCwJRFVQTEVYX0hBTEYsIEFVVE9ORUdfRElTQUJMRSwJXzEwMF9IYWxmIH0sCisJCXsgU1BFRURfMTAwLAlEVVBMRVhfRlVMTCwgQVVUT05FR19ESVNBQkxFLAlfMTAwX0Z1bGwgfSwKKwkJeyBTUEVFRF8xMDAwLAlEVVBMRVhfRlVMTCwgQVVUT05FR19ESVNBQkxFLAlfMTAwMF9GdWxsIH0sCisJCS8qIE1ha2UgVEJJIGhhcHB5ICovCisJCXsgU1BFRURfMTAwMCwJRFVQTEVYX0ZVTEwsIEFVVE9ORUdfRU5BQkxFLAkweGZmIH0KKwl9LCAqcDsKKwl1bnNpZ25lZCBjaGFyIG9wdGlvbjsKKwkKKwlvcHRpb24gPSAoKGlkeCA8IE1BWF9VTklUUykgJiYgKGlkeCA+PSAwKSkgPyBtZWRpYVtpZHhdIDogMHhmZjsKKworCWlmICgob3B0aW9uICE9IDB4ZmYpICYmICFpZHgpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJtZWRpYSBvcHRpb24gaXMgZGVwcmVjYXRlZC5cbiIpOworCisJZm9yIChwID0gbGlua19zZXR0aW5nczsgcC0+bWVkaWEgIT0gMHhmZjsgcCsrKSB7CisJCWlmIChwLT5tZWRpYSA9PSBvcHRpb24pCisJCQlicmVhazsKKwl9CisJKmF1dG9uZWcgPSBwLT5hdXRvbmVnOworCSpzcGVlZCA9IHAtPnNwZWVkOworCSpkdXBsZXggPSBwLT5kdXBsZXg7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIE1PRFVMRU5BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBSVEw4MTY5X1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBSODE2OV9SRUdTX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWRfdGJpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKKworCXJlZyA9IFJUTF9SMzIoVEJJQ1NSKTsKKwlpZiAoKGF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSAmJiAoc3BlZWQgPT0gU1BFRURfMTAwMCkgJiYKKwkgICAgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCkpIHsKKwkJUlRMX1czMihUQklDU1IsIHJlZyAmIH4oVEJJTndFbmFibGUgfCBUQklOd1Jlc3RhcnQpKTsKKwl9IGVsc2UgaWYgKGF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCVJUTF9XMzIoVEJJQ1NSLCByZWcgfCBUQklOd0VuYWJsZSB8IFRCSU53UmVzdGFydCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCSAgICAgICAiJXM6IGluY29ycmVjdCBzcGVlZCBzZXR0aW5nIHJlZnVzZWQgaW4gVEJJIG1vZGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfc2V0X3NwZWVkX3htaWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGF1dG9fbmVnbywgZ2lnYV9jdHJsOworCisJYXV0b19uZWdvID0gbWRpb19yZWFkKGlvYWRkciwgUEhZX0FVVE9fTkVHT19SRUcpOworCWF1dG9fbmVnbyAmPSB+KFBIWV9DYXBfMTBfSGFsZiB8IFBIWV9DYXBfMTBfRnVsbCB8CisJCSAgICAgICBQSFlfQ2FwXzEwMF9IYWxmIHwgUEhZX0NhcF8xMDBfRnVsbCk7CisJZ2lnYV9jdHJsID0gbWRpb19yZWFkKGlvYWRkciwgUEhZXzEwMDBfQ1RSTF9SRUcpOworCWdpZ2FfY3RybCAmPSB+KFBIWV9DYXBfMTAwMF9GdWxsIHwgUEhZX0NhcF9OdWxsKTsKKworCWlmIChhdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWF1dG9fbmVnbyB8PSAoUEhZX0NhcF8xMF9IYWxmIHwgUEhZX0NhcF8xMF9GdWxsIHwKKwkJCSAgICAgIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsKTsKKwkJZ2lnYV9jdHJsIHw9IFBIWV9DYXBfMTAwMF9GdWxsOworCX0gZWxzZSB7CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMCkKKwkJCWF1dG9fbmVnbyB8PSBQSFlfQ2FwXzEwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGw7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMCkKKwkJCWF1dG9fbmVnbyB8PSBQSFlfQ2FwXzEwMF9IYWxmIHwgUEhZX0NhcF8xMDBfRnVsbDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCWdpZ2FfY3RybCB8PSBQSFlfQ2FwXzEwMDBfRnVsbDsKKworCQlpZiAoZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJYXV0b19uZWdvICY9IH4oUEhZX0NhcF8xMF9GdWxsIHwgUEhZX0NhcF8xMDBfRnVsbCk7CisJfQorCisJdHAtPnBoeV9hdXRvX25lZ29fcmVnID0gYXV0b19uZWdvOworCXRwLT5waHlfMTAwMF9jdHJsX3JlZyA9IGdpZ2FfY3RybDsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCBQSFlfQVVUT19ORUdPX1JFRywgYXV0b19uZWdvKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgUEhZXzEwMDBfQ1RSTF9SRUcsIGdpZ2FfY3RybCk7CisJbWRpb193cml0ZShpb2FkZHIsIFBIWV9DVFJMX1JFRywgUEhZX0VuYWJsZV9BdXRvX05lZ28gfAorCQkJCQkgUEhZX1Jlc3RhcnRfQXV0b19OZWdvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3NldF9zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICB1OCBhdXRvbmVnLCB1MTYgc3BlZWQsIHU4IGR1cGxleCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCXJldCA9IHRwLT5zZXRfc3BlZWQoZGV2LCBhdXRvbmVnLCBzcGVlZCwgZHVwbGV4KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgKHRwLT5waHlfMTAwMF9jdHJsX3JlZyAmIFBIWV9DYXBfMTAwMF9GdWxsKSkKKwkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIGppZmZpZXMgKyBSVEw4MTY5X1BIWV9USU1FT1VUKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCXJldCA9IHJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgY21kLT5hdXRvbmVnLCBjbWQtPnNwZWVkLCBjbWQtPmR1cGxleCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHJ0bDgxNjlfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gdHAtPmNwX2NtZCAmIFJ4Q2hrU3VtOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGF0YSkKKwkJdHAtPmNwX2NtZCB8PSBSeENoa1N1bTsKKwllbHNlCisJCXRwLT5jcF9jbWQgJj0gflJ4Q2hrU3VtOworCisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJUlRMX1IxNihDUGx1c0NtZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfVkxBTgorCitzdGF0aWMgaW5saW5lIHUzMiBydGw4MTY5X3R4X3ZsYW5fdGFnKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICh0cC0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSA/CisJCVR4VmxhblRhZyB8IHN3YWIxNih2bGFuX3R4X3RhZ19nZXQoc2tiKSkgOiAweDAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJdHAtPnZsZ3JwID0gZ3JwOworCWlmICh0cC0+dmxncnApCisJCXRwLT5jcF9jbWQgfD0gUnhWbGFuOworCWVsc2UKKwkJdHAtPmNwX2NtZCAmPSB+UnhWbGFuOworCVJUTF9XMTYoQ1BsdXNDbWQsIHRwLT5jcF9jbWQpOworCVJUTF9SMTYoQ1BsdXNDbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAodHAtPnZsZ3JwKQorCQl0cC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfcnhfdmxhbl9za2Ioc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHN0cnVjdCBSeERlc2MgKmRlc2MsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgb3B0czIgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMik7CisJaW50IHJldDsKKworCWlmICh0cC0+dmxncnAgJiYgKG9wdHMyICYgUnhWbGFuVGFnKSkgeworCQlydGw4MTY5X3J4X2h3YWNjZWxfc2tiKHNrYiwgdHAtPnZsZ3JwLAorCQkJCSAgICAgICBzd2FiMTYob3B0czIgJiAweGZmZmYpKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CisJZGVzYy0+b3B0czIgPSAwOworCXJldHVybiByZXQ7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfUjgxNjlfVkxBTiAqLworCitzdGF0aWMgaW5saW5lIHUzMiBydGw4MTY5X3R4X3ZsYW5fdGFnKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9yeF92bGFuX3NrYihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgc3RydWN0IFJ4RGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAtMTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ3NldF90Ymkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgc3RhdHVzOworCisJY21kLT5zdXBwb3J0ZWQgPQorCQlTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRTsKKwljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJc3RhdHVzID0gUlRMX1IzMihUQklDU1IpOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSAoc3RhdHVzICYgVEJJTndFbmFibGUpID8gIEFEVkVSVElTRURfQXV0b25lZyA6IDA7CisJY21kLT5hdXRvbmVnID0gISEoc3RhdHVzICYgVEJJTndFbmFibGUpOworCisJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsgLyogQWx3YXlzIHNldCAqLworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2dzZXRfeG1paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXU4IHN0YXR1czsKKworCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJICAgICAgICAgU1VQUE9SVEVEX1RQOworCisJY21kLT5hdXRvbmVnID0gMTsKKwljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUCB8IEFEVkVSVElTRURfQXV0b25lZzsKKworCWlmICh0cC0+cGh5X2F1dG9fbmVnb19yZWcgJiBQSFlfQ2FwXzEwX0hhbGYpCisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CisJaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIFBIWV9DYXBfMTBfRnVsbCkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgUEhZX0NhcF8xMDBfSGFsZikKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIFBIWV9DYXBfMTAwX0Z1bGwpCisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCWlmICh0cC0+cGh5XzEwMDBfY3RybF9yZWcgJiBQSFlfQ2FwXzEwMDBfRnVsbCkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCisJc3RhdHVzID0gUlRMX1I4KFBIWXN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgXzEwMDBicHNGKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwllbHNlIGlmIChzdGF0dXMgJiBfMTAwYnBzKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTAwOworCWVsc2UgaWYgKHN0YXR1cyAmIF8xMGJwcykKKwkJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCisJY21kLT5kdXBsZXggPSAoKHN0YXR1cyAmIF8xMDAwYnBzRikgfHwgKHN0YXR1cyAmIEZ1bGxEdXApKSA/CisJCSAgICAgIERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCXRwLT5nZXRfc2V0dGluZ3MoZGV2LCBjbWQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJICAgICB2b2lkICpwKQoreworICAgICAgICBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgaWYgKHJlZ3MtPmxlbiA+IFI4MTY5X1JFR1NfU0laRSkKKyAgICAgICAgCXJlZ3MtPmxlbiA9IFI4MTY5X1JFR1NfU0laRTsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgbWVtY3B5X2Zyb21pbyhwLCB0cC0+bW1pb19hZGRyLCByZWdzLT5sZW4pOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHJ0bDgxNjlfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHJ0bDgxNjlfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSBydGw4MTY5X2dldF9yZWdzX2xlbiwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3NldHRpbmdzCQk9IHJ0bDgxNjlfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gcnRsODE2OV9zZXRfc2V0dGluZ3MsCisJLmdldF9yeF9jc3VtCQk9IHJ0bDgxNjlfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IHJ0bDgxNjlfc2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtCQk9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvCQk9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKwkuZ2V0X3JlZ3MJCT0gcnRsODE2OV9nZXRfcmVncywKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfd3JpdGVfZ21paV9yZWdfYml0KHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcmVnLCBpbnQgYml0bnVtLAorCQkJCSAgICAgICBpbnQgYml0dmFsKQoreworCWludCB2YWw7CisKKwl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCByZWcpOworCXZhbCA9IChiaXR2YWwgPT0gMSkgPworCQl2YWwgfCAoYml0dmFsIDw8IGJpdG51bSkgOiAgdmFsICYgfigweDAwMDEgPDwgYml0bnVtKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgcmVnLCB2YWwgJiAweGZmZmYpOyAKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfbWFjX3ZlcnNpb24oc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWNvbnN0IHN0cnVjdCB7CisJCXUzMiBtYXNrOworCQlpbnQgbWFjX3ZlcnNpb247CisJfSBtYWNfaW5mb1tdID0geworCQl7IDB4MSA8PCAyOCwJUlRMX0dJR0FfTUFDX1ZFUl9YIH0sCisJCXsgMHgxIDw8IDI2LAlSVExfR0lHQV9NQUNfVkVSX0UgfSwKKwkJeyAweDEgPDwgMjMsCVJUTF9HSUdBX01BQ19WRVJfRCB9LCAKKwkJeyAweDAwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSX0IgfSAvKiBDYXRjaC1hbGwgKi8KKwl9LCAqcCA9IG1hY19pbmZvOworCXUzMiByZWc7CisKKwlyZWcgPSBSVExfUjMyKFR4Q29uZmlnKSAmIDB4N2M4MDAwMDA7CisJd2hpbGUgKChyZWcgJiBwLT5tYXNrKSAhPSBwLT5tYXNrKQorCQlwKys7CisJdHAtPm1hY192ZXJzaW9uID0gcC0+bWFjX3ZlcnNpb247Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcHJpbnRfbWFjX3ZlcnNpb24oc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHApCit7CisJc3RydWN0IHsKKwkJaW50IHZlcnNpb247CisJCWNoYXIgKm1zZzsKKwl9IG1hY19wcmludFtdID0geworCQl7IFJUTF9HSUdBX01BQ19WRVJfRSwgIlJUTF9HSUdBX01BQ19WRVJfRSIgfSwKKwkJeyBSVExfR0lHQV9NQUNfVkVSX0QsICJSVExfR0lHQV9NQUNfVkVSX0QiIH0sCisJCXsgUlRMX0dJR0FfTUFDX1ZFUl9CLCAiUlRMX0dJR0FfTUFDX1ZFUl9CIiB9LAorCQl7IDAsIE5VTEwgfQorCX0sICpwOworCisJZm9yIChwID0gbWFjX3ByaW50OyBwLT5tc2c7IHArKykgeworCQlpZiAodHAtPm1hY192ZXJzaW9uID09IHAtPnZlcnNpb24pIHsKKwkJCWRwcmludGsoIm1hY192ZXJzaW9uID09ICVzICglMDRkKVxuIiwgcC0+bXNnLAorCQkJCSAgcC0+dmVyc2lvbik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZHByaW50aygibWFjX3ZlcnNpb24gPT0gVW5rbm93blxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ2V0X3BoeV92ZXJzaW9uKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwljb25zdCBzdHJ1Y3QgeworCQl1MTYgbWFzazsKKwkJdTE2IHNldDsKKwkJaW50IHBoeV92ZXJzaW9uOworCX0gcGh5X2luZm9bXSA9IHsKKwkJeyAweDAwMGYsIDB4MDAwMiwgUlRMX0dJR0FfUEhZX1ZFUl9HIH0sCisJCXsgMHgwMDBmLCAweDAwMDEsIFJUTF9HSUdBX1BIWV9WRVJfRiB9LAorCQl7IDB4MDAwZiwgMHgwMDAwLCBSVExfR0lHQV9QSFlfVkVSX0UgfSwKKwkJeyAweDAwMDAsIDB4MDAwMCwgUlRMX0dJR0FfUEhZX1ZFUl9EIH0gLyogQ2F0Y2gtYWxsICovCisJfSwgKnAgPSBwaHlfaW5mbzsKKwl1MTYgcmVnOworCisJcmVnID0gbWRpb19yZWFkKGlvYWRkciwgMykgJiAweGZmZmY7CisJd2hpbGUgKChyZWcgJiBwLT5tYXNrKSAhPSBwLT5zZXQpCisJCXArKzsKKwl0cC0+cGh5X3ZlcnNpb24gPSBwLT5waHlfdmVyc2lvbjsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9wcmludF9waHlfdmVyc2lvbihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwlzdHJ1Y3QgeworCQlpbnQgdmVyc2lvbjsKKwkJY2hhciAqbXNnOworCQl1MzIgcmVnOworCX0gcGh5X3ByaW50W10gPSB7CisJCXsgUlRMX0dJR0FfUEhZX1ZFUl9HLCAiUlRMX0dJR0FfUEhZX1ZFUl9HIiwgMHgwMDAyIH0sCisJCXsgUlRMX0dJR0FfUEhZX1ZFUl9GLCAiUlRMX0dJR0FfUEhZX1ZFUl9GIiwgMHgwMDAxIH0sCisJCXsgUlRMX0dJR0FfUEhZX1ZFUl9FLCAiUlRMX0dJR0FfUEhZX1ZFUl9FIiwgMHgwMDAwIH0sCisJCXsgUlRMX0dJR0FfUEhZX1ZFUl9ELCAiUlRMX0dJR0FfUEhZX1ZFUl9EIiwgMHgwMDAwIH0sCisJCXsgMCwgTlVMTCwgMHgwMDAwIH0KKwl9LCAqcDsKKworCWZvciAocCA9IHBoeV9wcmludDsgcC0+bXNnOyBwKyspIHsKKwkJaWYgKHRwLT5waHlfdmVyc2lvbiA9PSBwLT52ZXJzaW9uKSB7CisJCQlkcHJpbnRrKCJwaHlfdmVyc2lvbiA9PSAlcyAoJTA0eClcbiIsIHAtPm1zZywgcC0+cmVnKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkcHJpbnRrKCJwaHlfdmVyc2lvbiA9PSBVbmtub3duXG4iKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9od19waHlfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlzdHJ1Y3QgeworCQl1MTYgcmVnc1s1XTsgLyogQmV3YXJlIG9mIGJpdC1zaWduIHByb3BhZ2F0aW9uICovCisJfSBwaHlfbWFnaWNbNV0gPSB7IHsKKwkJeyAweDAwMDAsCS8vdyA0IDE1IDEyIDAKKwkJICAweDAwYTEsCS8vdyAzIDE1IDAgMDBhMQorCQkgIDB4MDAwOCwJLy93IDIgMTUgMCAwMDA4CisJCSAgMHgxMDIwLAkvL3cgMSAxNSAwIDEwMjAKKwkJICAweDEwMDAgfSB9LHsJLy93IDAgMTUgMCAxMDAwCisJCXsgMHg3MDAwLAkvL3cgNCAxNSAxMiA3CisJCSAgMHhmZjQxLAkvL3cgMyAxNSAwIGZmNDEKKwkJICAweGRlNjAsCS8vdyAyIDE1IDAgZGU2MAorCQkgIDB4MDE0MCwJLy93IDEgMTUgMCAwMTQwCisJCSAgMHgwMDc3IH0gfSx7CS8vdyAwIDE1IDAgMDA3NworCQl7IDB4YTAwMCwJLy93IDQgMTUgMTIgYQorCQkgIDB4ZGYwMSwJLy93IDMgMTUgMCBkZjAxCisJCSAgMHhkZjIwLAkvL3cgMiAxNSAwIGRmMjAKKwkJICAweGZmOTUsCS8vdyAxIDE1IDAgZmY5NQorCQkgIDB4ZmEwMCB9IH0sewkvL3cgMCAxNSAwIGZhMDAKKwkJeyAweGIwMDAsCS8vdyA0IDE1IDEyIGIKKwkJICAweGZmNDEsCS8vdyAzIDE1IDAgZmY0MQorCQkgIDB4ZGUyMCwJLy93IDIgMTUgMCBkZTIwCisJCSAgMHgwMTQwLAkvL3cgMSAxNSAwIDAxNDAKKwkJICAweDAwYmIgfSB9LHsJLy93IDAgMTUgMCAwMGJiCisJCXsgMHhmMDAwLAkvL3cgNCAxNSAxMiBmCisJCSAgMHhkZjAxLAkvL3cgMyAxNSAwIGRmMDEKKwkJICAweGRmMjAsCS8vdyAyIDE1IDAgZGYyMAorCQkgIDB4ZmY5NSwJLy93IDEgMTUgMCBmZjk1CisJCSAgMHhiZjAwIH0JLy93IDAgMTUgMCBiZjAwCisJCX0KKwl9LCAqcCA9IHBoeV9tYWdpYzsKKwlpbnQgaTsKKworCXJ0bDgxNjlfcHJpbnRfbWFjX3ZlcnNpb24odHApOworCXJ0bDgxNjlfcHJpbnRfcGh5X3ZlcnNpb24odHApOworCisJaWYgKHRwLT5tYWNfdmVyc2lvbiA8PSBSVExfR0lHQV9NQUNfVkVSX0IpCisJCXJldHVybjsKKwlpZiAodHAtPnBoeV92ZXJzaW9uID49IFJUTF9HSUdBX1BIWV9WRVJfSCkKKwkJcmV0dXJuOworCisJZHByaW50aygiTUFDIHZlcnNpb24gIT0gMCAmJiBQSFkgdmVyc2lvbiA9PSAwIG9yIDFcbiIpOworCWRwcmludGsoIkRvIGZpbmFsX3JlZzIuY2ZnXG4iKTsKKworCS8qIFNoYXphbSAhICovCisKKwlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfWCkgeworCQltZGlvX3dyaXRlKGlvYWRkciwgMzEsIDB4MDAwMSk7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAgOSwgMHgyNzNhKTsKKwkJbWRpb193cml0ZShpb2FkZHIsIDE0LCAweDdiZmIpOworCQltZGlvX3dyaXRlKGlvYWRkciwgMjcsIDB4ODQxZSk7CisKKwkJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDIpOworCQltZGlvX3dyaXRlKGlvYWRkciwgIDEsIDB4OTBkMCk7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHBoeSBjb25maWcgZm9yIFJUTDgxNjlzIG1hY192ZXJzaW9uIEMgY2hpcCAqLworCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAxKTsJCQkvL3cgMzEgMiAwIDEKKwltZGlvX3dyaXRlKGlvYWRkciwgMjEsIDB4MTAwMCk7CQkJLy93IDIxIDE1IDAgMTAwMAorCW1kaW9fd3JpdGUoaW9hZGRyLCAyNCwgMHg2NWM3KTsJCQkvL3cgMjQgMTUgMCA2NWM3CisJcnRsODE2OV93cml0ZV9nbWlpX3JlZ19iaXQoaW9hZGRyLCA0LCAxMSwgMCk7CS8vdyA0IDExIDExIDAKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBoeV9tYWdpYyk7IGkrKywgcCsrKSB7CisJCWludCB2YWwsIHBvcyA9IDQ7CisKKwkJdmFsID0gKG1kaW9fcmVhZChpb2FkZHIsIHBvcykgJiAweDBmZmYpIHwgKHAtPnJlZ3NbMF0gJiAweGZmZmYpOworCQltZGlvX3dyaXRlKGlvYWRkciwgcG9zLCB2YWwpOworCQl3aGlsZSAoLS1wb3MgPj0gMCkKKwkJCW1kaW9fd3JpdGUoaW9hZGRyLCBwb3MsIHAtPnJlZ3NbNCAtIHBvc10gJiAweGZmZmYpOworCQlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAxKTsgLy93IDQgMTEgMTEgMQorCQlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAwKTsgLy93IDQgMTEgMTEgMAorCX0KKwltZGlvX3dyaXRlKGlvYWRkciwgMzEsIDB4MDAwMCk7IC8vdyAzMSAyIDAgMAorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3BoeV90aW1lcih1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfX29wYXF1ZTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnRwLT50aW1lcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gUlRMODE2OV9QSFlfVElNRU9VVDsKKworCWFzc2VydCh0cC0+bWFjX3ZlcnNpb24gPiBSVExfR0lHQV9NQUNfVkVSX0IpOworCWFzc2VydCh0cC0+cGh5X3ZlcnNpb24gPCBSVExfR0lHQV9QSFlfVkVSX0gpOworCisJaWYgKCEodHAtPnBoeV8xMDAwX2N0cmxfcmVnICYgUEhZX0NhcF8xMDAwX0Z1bGwpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlpZiAodHAtPnBoeV9yZXNldF9wZW5kaW5nKGlvYWRkcikpIHsKKwkJLyogCisJCSAqIEEgYnVzeSBsb29wIGNvdWxkIGJ1cm4gcXVpdGUgYSBmZXcgY3ljbGVzIG9uIG5vd2FkYXlzIENQVS4KKwkJICogTGV0J3MgZGVsYXkgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGltZXIgZm9yIGEgZmV3IHRpY2tzLgorCQkgKi8KKwkJdGltZW91dCA9IEhaLzEwOworCQlnb3RvIG91dF9tb2RfdGltZXI7CisJfQorCisJaWYgKHRwLT5saW5rX29rKGlvYWRkcikpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogUEhZIHJlc2V0IHVudGlsIGxpbmsgdXBcbiIsIGRldi0+bmFtZSk7CisKKwl0cC0+cGh5X3Jlc2V0X2VuYWJsZShpb2FkZHIpOworCitvdXRfbW9kX3RpbWVyOgorCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIHRpbWVvdXQpOworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfZGVsZXRlX3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZ0cC0+dGltZXI7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA8PSBSVExfR0lHQV9NQUNfVkVSX0IpIHx8CisJICAgICh0cC0+cGh5X3ZlcnNpb24gPj0gUlRMX0dJR0FfUEhZX1ZFUl9IKSkKKwkJcmV0dXJuOworCisJZGVsX3RpbWVyX3N5bmModGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9yZXF1ZXN0X3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZ0cC0+dGltZXI7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA8PSBSVExfR0lHQV9NQUNfVkVSX0IpIHx8CisJICAgICh0cC0+cGh5X3ZlcnNpb24gPj0gUlRMX0dJR0FfUEhZX1ZFUl9IKSkKKwkJcmV0dXJuOworCisJaW5pdF90aW1lcih0aW1lcik7CisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUlRMODE2OV9QSFlfVElNRU9VVDsKKwl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKShkZXYpOworCXRpbWVyLT5mdW5jdGlvbiA9IHJ0bDgxNjlfcGh5X3RpbWVyOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCitzdGF0aWMgdm9pZCBydGw4MTY5X25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCWRpc2FibGVfaXJxKHBkZXYtPmlycSk7CisJcnRsODE2OV9pbnRlcnJ1cHQocGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEocGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTY5X3JlbGVhc2VfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpb3VubWFwKGlvYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3J0bDgxNjlfaW5pdF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZfb3V0LAorCQkgICB2b2lkIF9faW9tZW0gKippb2FkZHJfb3V0KQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHA7CisJaW50IHJjID0gLUVOT01FTSwgaSwgYWNwaV9pZGxlX3N0YXRlID0gMCwgcG1fY2FwOworCisJYXNzZXJ0KGlvYWRkcl9vdXQgIT0gTlVMTCk7CisKKwkvKiBkZXYgemVyb2VkIGluIGFsbG9jX2V0aGVyZGV2ICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mICgqdHApKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jIG5ldyBldGhlcm5ldFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBlbmFibGUgZGV2aWNlIChpbmNsLiBQQ0kgUE0gd2FrZXVwIGFuZCBob3RwbHVnIHNldHVwKSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBlbmFibGUgZmFpbHVyZVxuIiwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJcmMgPSBwY2lfc2V0X213aShwZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKworCS8qIHNhdmUgcG93ZXIgc3RhdGUgYmVmb3JlIHBjaV9lbmFibGVfZGV2aWNlIG92ZXJ3cml0ZXMgaXQgKi8KKwlwbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmIChwbV9jYXApIHsKKwkJdTE2IHB3cl9jb21tYW5kOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBtX2NhcCArIFBDSV9QTV9DVFJMLCAmcHdyX2NvbW1hbmQpOworCQlhY3BpX2lkbGVfc3RhdGUgPSBwd3JfY29tbWFuZCAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDEgaXMgTU1JTyAqLworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAicmVnaW9uICMxIG5vdCBhbiBNTUlPIHJlc291cmNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X213aTsKKwl9CisJLyogY2hlY2sgZm9yIHdlaXJkL2Jyb2tlbiBQQ0kgcmVnaW9uIHJlcG9ydGluZyAqLworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgUjgxNjlfUkVHU19TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgUENJIHJlZ2lvbiBzaXplKHMpLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X213aTsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgTU9EVUxFTkFNRSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjb3VsZCBub3QgcmVxdWVzdCByZWdpb25zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X213aTsKKwl9CisKKwl0cC0+Y3BfY21kID0gUENJTXVsUlcgfCBSeENoa1N1bTsKKworCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spICYmIHVzZV9kYWMpIHsKKwkJdHAtPmNwX2NtZCB8PSBQQ0lEQUM7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCX0gZWxzZSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkRNQSBjb25maWd1cmF0aW9uIGZhaWxlZC5cbiIpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCQl9CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBpb3JlbWFwIE1NSU8gcmVnaW9uICovCisJaW9hZGRyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIFI4MTY5X1JFR1NfU0laRSk7CisJaWYgKGlvYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZW1hcCBNTUlPLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCS8qIFVubmVlZGVkID8gRG9uJ3QgbWVzcyB3aXRoIE1ycy4gTXVycGh5LiAqLworCXJ0bDgxNjlfaXJxX21hc2tfYW5kX2Fjayhpb2FkZHIpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlSVExfVzgoQ2hpcENtZCwgQ21kUmVzZXQpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgY2hpcCBoYXMgZmluaXNoZWQgdGhlIHJlc2V0LiAqLworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKChSVExfUjgoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCS8qIElkZW50aWZ5IGNoaXAgYXR0YWNoZWQgdG8gYm9hcmQgKi8KKwlydGw4MTY5X2dldF9tYWNfdmVyc2lvbih0cCwgaW9hZGRyKTsKKwlydGw4MTY5X2dldF9waHlfdmVyc2lvbih0cCwgaW9hZGRyKTsKKworCXJ0bDgxNjlfcHJpbnRfbWFjX3ZlcnNpb24odHApOworCXJ0bDgxNjlfcHJpbnRfcGh5X3ZlcnNpb24odHApOworCisJZm9yIChpID0gQVJSQVlfU0laRShydGxfY2hpcF9pbmZvKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gcnRsX2NoaXBfaW5mb1tpXS5tYWNfdmVyc2lvbikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IDApIHsKKwkJLyogVW5rbm93biBjaGlwOiBhc3N1bWUgYXJyYXkgZWxlbWVudCAjMCwgb3JpZ2luYWwgUlRMLTgxNjkgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCisJCSAgICAgICAiUENJIGRldmljZSAlczogdW5rbm93biBjaGlwIHZlcnNpb24sIGFzc3VtaW5nICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIHJ0bF9jaGlwX2luZm9bMF0ubmFtZSk7CisJCWkrKzsKKwl9CisJdHAtPmNoaXBzZXQgPSBpOworCisJKmlvYWRkcl9vdXQgPSBpb2FkZHI7CisJKmRldl9vdXQgPSBkZXY7CitvdXQ6CisJcmV0dXJuIHJjOworCitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfbXdpOgorCXBjaV9jbGVhcl9td2kocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycl9vdXQ6CisJKmlvYWRkcl9vdXQgPSBOVUxMOworCSpkZXZfb3V0ID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3J0bDgxNjlfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHA7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBOVUxMOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOworCXU4IGF1dG9uZWcsIGR1cGxleDsKKwl1MTYgc3BlZWQ7CisJaW50IGksIHJjOworCisJYXNzZXJ0KHBkZXYgIT0gTlVMTCk7CisJYXNzZXJ0KGVudCAhPSBOVUxMKTsKKworCWJvYXJkX2lkeCsrOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIgJXMgbG9hZGVkXG4iLAorCQkgICAgICAgTU9EVUxFTkFNRSwgUlRMODE2OV9WRVJTSU9OKTsKKwkJcHJpbnRlZF92ZXJzaW9uID0gMTsKKwl9CisKKwlyYyA9IHJ0bDgxNjlfaW5pdF9ib2FyZChwZGV2LCAmZGV2LCAmaW9hZGRyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlhc3NlcnQoaW9hZGRyICE9IE5VTEwpOworCisJaWYgKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkgeworCQl0cC0+c2V0X3NwZWVkID0gcnRsODE2OV9zZXRfc3BlZWRfdGJpOworCQl0cC0+Z2V0X3NldHRpbmdzID0gcnRsODE2OV9nc2V0X3RiaTsKKwkJdHAtPnBoeV9yZXNldF9lbmFibGUgPSBydGw4MTY5X3RiaV9yZXNldF9lbmFibGU7CisJCXRwLT5waHlfcmVzZXRfcGVuZGluZyA9IHJ0bDgxNjlfdGJpX3Jlc2V0X3BlbmRpbmc7CisJCXRwLT5saW5rX29rID0gcnRsODE2OV90YmlfbGlua19vazsKKworCQl0cC0+cGh5XzEwMDBfY3RybF9yZWcgPSBQSFlfQ2FwXzEwMDBfRnVsbDsgLyogSW1wbGllZCBieSBUQkkgKi8KKwl9IGVsc2UgeworCQl0cC0+c2V0X3NwZWVkID0gcnRsODE2OV9zZXRfc3BlZWRfeG1paTsKKwkJdHAtPmdldF9zZXR0aW5ncyA9IHJ0bDgxNjlfZ3NldF94bWlpOworCQl0cC0+cGh5X3Jlc2V0X2VuYWJsZSA9IHJ0bDgxNjlfeG1paV9yZXNldF9lbmFibGU7CisJCXRwLT5waHlfcmVzZXRfcGVuZGluZyA9IHJ0bDgxNjlfeG1paV9yZXNldF9wZW5kaW5nOworCQl0cC0+bGlua19vayA9IHJ0bDgxNjlfeG1paV9saW5rX29rOworCX0KKworCS8qIEdldCBNQUMgYWRkcmVzcy4gIEZJWE1FOiByZWFkIEVFUFJPTSAqLworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IFJUTF9SOChNQUMwICsgaSk7CisKKwlkZXYtPm9wZW4gPSBydGw4MTY5X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTY5X3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBydGw4MTY5X2dldF9zdGF0czsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmcnRsODE2OV9ldGh0b29sX29wcyk7CisJZGV2LT5zdG9wID0gcnRsODE2OV9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTY5X3R4X3RpbWVvdXQ7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBydGw4MTY5X3NldF9yeF9tb2RlOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBSVEw4MTY5X1RYX1RJTUVPVVQ7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9hZGRyOworCWRldi0+Y2hhbmdlX210dSA9IHJ0bDgxNjlfY2hhbmdlX210dTsKKworI2lmZGVmIENPTkZJR19SODE2OV9OQVBJCisJZGV2LT5wb2xsID0gcnRsODE2OV9wb2xsOworCWRldi0+d2VpZ2h0ID0gUjgxNjlfTkFQSV9XRUlHSFQ7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5BUEkgZW5hYmxlZFxuIik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SODE2OV9WTEFOCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gcnRsODE2OV92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IHJ0bDgxNjlfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHJ0bDgxNjlfbmV0cG9sbDsKKyNlbmRpZgorCisJdHAtPmludHJfbWFzayA9IDB4ZmZmZjsKKwl0cC0+cGNpX2RldiA9IHBkZXY7CisJdHAtPm1taW9fYWRkciA9IGlvYWRkcjsKKworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykgeworCQlydGw4MTY5X3JlbGVhc2VfYm9hcmQocGRldiwgZGV2LCBpb2FkZHIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJZGVudGlmaWVkIGNoaXAgdHlwZSBpcyAnJXMnLlxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5uYW1lKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JWx4LCAiCisJICAgICAgICIlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeCwgIgorCSAgICAgICAiSVJRICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIHJ0bF9jaGlwX2luZm9bZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0sIGRldi0+aXJxKTsKKworCXJ0bDgxNjlfaHdfcGh5X2NvbmZpZyhkZXYpOworCisJZHByaW50aygiU2V0IE1BQyBSZWcgQytDUiBPZmZzZXQgMHg4MmggPSAweDAxaFxuIik7CisJUlRMX1c4KDB4ODIsIDB4MDEpOworCisJaWYgKHRwLT5tYWNfdmVyc2lvbiA8IFJUTF9HSUdBX01BQ19WRVJfRSkgeworCQlkcHJpbnRrKCJTZXQgUENJIExhdGVuY3k9MHg0MFxuIik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg0MCk7CisJfQorCisJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSX0QpIHsKKwkJZHByaW50aygiU2V0IE1BQyBSZWcgQytDUiBPZmZzZXQgMHg4MmggPSAweDAxaFxuIik7CisJCVJUTF9XOCgweDgyLCAweDAxKTsKKwkJZHByaW50aygiU2V0IFBIWSBSZWcgMHgwYmggPSAweDAwaFxuIik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAweDBiLCAweDAwMDApOyAvL3cgMHgwYiAxNSAwIDAKKwl9CisKKwlydGw4MTY5X2xpbmtfb3B0aW9uKGJvYXJkX2lkeCwgJmF1dG9uZWcsICZzcGVlZCwgJmR1cGxleCk7CisKKwlydGw4MTY5X3NldF9zcGVlZChkZXYsIGF1dG9uZWcsIHNwZWVkLCBkdXBsZXgpOworCQorCWlmIChSVExfUjgoUEhZc3RhdHVzKSAmIFRCSV9FbmFibGUpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogVEJJIGF1dG8tbmVnb3RpYXRpbmdcbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitydGw4MTY5X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlhc3NlcnQoZGV2ICE9IE5VTEwpOworCWFzc2VydCh0cCAhPSBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcnRsODE2OV9yZWxlYXNlX2JvYXJkKHBkZXYsIGRldiwgdHAtPm1taW9fYWRkcik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgcnRsODE2OV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisJCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cywgc3RvcCBSeCBhbmQgVHggKi8KKwlSVExfVzE2KEludHJNYXNrLCAwKTsKKwlSVExfVzgoQ2hpcENtZCwgMCk7CisJCQorCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IFJUTF9SMzIoUnhNaXNzZWQpOworCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCSAgICByZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisKKwlyZXR1cm4gMDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2V0X3J4YnVmc2l6ZShzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IG10dSA9IGRldi0+bXR1OworCisJdHAtPnJ4X2J1Zl9zeiA9IChtdHUgPiBSWF9CVUZfU0laRSkgPyBtdHUgKyBFVEhfSExFTiArIDggOiBSWF9CVUZfU0laRTsKK30KKworc3RhdGljIGludCBydGw4MTY5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKwlpbnQgcmV0dmFsOworCisJcnRsODE2OV9zZXRfcnhidWZzaXplKHRwLCBkZXYpOworCisJcmV0dmFsID0KKwkgICAgcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJ0bDgxNjlfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IC1FTk9NRU07CisKKwkvKgorCSAqIFJ4IGFuZCBUeCBkZXNzY3JpcHRvcnMgbmVlZHMgMjU2IGJ5dGVzIGFsaWdubWVudC4KKwkgKiBwY2lfYWxsb2NfY29uc2lzdGVudCBwcm92aWRlcyBtb3JlLgorCSAqLworCXRwLT5UeERlc2NBcnJheSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFI4MTY5X1RYX1JJTkdfQllURVMsCisJCQkJCSAgICAgICAmdHAtPlR4UGh5QWRkcik7CisJaWYgKCF0cC0+VHhEZXNjQXJyYXkpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJdHAtPlJ4RGVzY0FycmF5ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfUlhfUklOR19CWVRFUywKKwkJCQkJICAgICAgICZ0cC0+UnhQaHlBZGRyKTsKKwlpZiAoIXRwLT5SeERlc2NBcnJheSkKKwkJZ290byBlcnJfZnJlZV90eDsKKworCXJldHZhbCA9IHJ0bDgxNjlfaW5pdF9yaW5nKGRldik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfcng7CisKKwlJTklUX1dPUksoJnRwLT50YXNrLCBOVUxMLCBkZXYpOworCisJcnRsODE2OV9od19zdGFydChkZXYpOworCisJcnRsODE2OV9yZXF1ZXN0X3RpbWVyKGRldik7CisKKwlydGw4MTY5X2NoZWNrX2xpbmtfc3RhdHVzKGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOworb3V0OgorCXJldHVybiByZXR2YWw7CisKK2Vycl9mcmVlX3J4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfUlhfUklOR19CWVRFUywgdHAtPlJ4RGVzY0FycmF5LAorCQkJICAgIHRwLT5SeFBoeUFkZHIpOworZXJyX2ZyZWVfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSODE2OV9UWF9SSU5HX0JZVEVTLCB0cC0+VHhEZXNjQXJyYXksCisJCQkgICAgdHAtPlR4UGh5QWRkcik7CitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaHdfcmVzZXQodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisKKwkvKiBSZXNldCB0aGUgY2hpcHNldCAqLworCVJUTF9XOChDaGlwQ21kLCBDbWRSZXNldCk7CisKKwkvKiBQQ0kgY29tbWl0ICovCisJUlRMX1I4KENoaXBDbWQpOworfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV9od19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIGk7CisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCVJUTF9XOChDaGlwQ21kLCBDbWRSZXNldCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlpZiAoKFJUTF9SOChDaGlwQ21kKSAmIENtZFJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwlSVExfVzgoQ2hpcENtZCwgQ21kVHhFbmIgfCBDbWRSeEVuYik7CisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJLyogRm9yIGdpZ2FiaXQgcnRsODE2OSwgTVRVICsgaGVhZGVyICsgQ1JDICsgVkxBTiAqLworCVJUTF9XMTYoUnhNYXhTaXplLCB0cC0+cnhfYnVmX3N6KTsKKworCS8qIFNldCBSeCBDb25maWcgcmVnaXN0ZXIgKi8KKwlpID0gcnRsODE2OV9yeF9jb25maWcgfAorCQkoUlRMX1IzMihSeENvbmZpZykgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2spOworCVJUTF9XMzIoUnhDb25maWcsIGkpOworCisJLyogU2V0IERNQSBidXJzdCBzaXplIGFuZCBJbnRlcmZyYW1lIEdhcCBUaW1lICovCisJUlRMX1czMihUeENvbmZpZywKKwkJKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSB8IChJbnRlckZyYW1lR2FwIDw8CisJCQkJCQlUeEludGVyRnJhbWVHYXBTaGlmdCkpOworCXRwLT5jcF9jbWQgfD0gUlRMX1IxNihDUGx1c0NtZCk7CisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSX0QpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl9FKSkgeworCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNldCBNQUMgUmVnIEMrQ1IgT2Zmc2V0IDB4RTAuICIKKwkJCSJCaXQtMyBhbmQgYml0LTE0IE1VU1QgYmUgMVxuIik7CisJCXRwLT5jcF9jbWQgfD0gKDEgPDwgMTQpIHwgUENJTXVsUlc7CisJCVJUTF9XMTYoQ1BsdXNDbWQsIHRwLT5jcF9jbWQpOworCX0KKworCS8qCisJICogVW5kb2N1bWVudGVkIGNvcm5lci4gU3VwcG9zZWRseToKKwkgKiAoVHhUaW1lciA8PCAxMikgfCAoVHhQYWNrZXRzIDw8IDgpIHwgKFJ4VGltZXIgPDwgNCkgfCBSeFBhY2tldHMKKwkgKi8KKwlSVExfVzE2KEludHJNaXRpZ2F0ZSwgMHgwMDAwKTsKKworCVJUTF9XMzIoVHhEZXNjU3RhcnRBZGRyTG93LCAoKHU2NCkgdHAtPlR4UGh5QWRkciAmIERNQV8zMkJJVF9NQVNLKSk7CisJUlRMX1czMihUeERlc2NTdGFydEFkZHJIaWdoLCAoKHU2NCkgdHAtPlR4UGh5QWRkciA+PiAzMikpOworCVJUTF9XMzIoUnhEZXNjQWRkckxvdywgKCh1NjQpIHRwLT5SeFBoeUFkZHIgJiBETUFfMzJCSVRfTUFTSykpOworCVJUTF9XMzIoUnhEZXNjQWRkckhpZ2gsICgodTY0KSB0cC0+UnhQaHlBZGRyID4+IDMyKSk7CisJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisJdWRlbGF5KDEwKTsKKworCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCisJcnRsODE2OV9zZXRfcnhfbW9kZShkZXYpOworCisJLyogbm8gZWFybHktcnggaW50ZXJydXB0cyAqLworCVJUTF9XMTYoTXVsdGlJbnRyLCBSVExfUjE2KE11bHRpSW50cikgJiAweEYwMDApOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChuZXdfbXR1IDwgRVRIX1pMRU4gfHwgbmV3X210dSA+IFNhZmVNdHUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gb3V0OworCisJcnRsODE2OV9kb3duKGRldik7CisKKwlydGw4MTY5X3NldF9yeGJ1ZnNpemUodHAsIGRldik7CisKKwlyZXQgPSBydGw4MTY5X2luaXRfcmluZyhkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisKKwlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisKKwlydGw4MTY5X3JlcXVlc3RfdGltZXIoZGV2KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X21ha2VfdW51c2FibGVfYnlfYXNpYyhzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCWRlc2MtPmFkZHIgPSAweDBiYWRiYWRiYWRiYWRiYWR1bGw7CisJZGVzYy0+b3B0czEgJj0gfmNwdV90b19sZTMyKERlc2NPd24gfCBSc3ZkTWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZnJlZV9yeF9za2Ioc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJc3RydWN0IHNrX2J1ZmYgKipza19idWZmLCBzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLCB0cC0+cnhfYnVmX3N6LAorCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZGV2X2tmcmVlX3NrYigqc2tfYnVmZik7CisJKnNrX2J1ZmYgPSBOVUxMOworCXJ0bDgxNjlfbWFrZV91bnVzYWJsZV9ieV9hc2ljKGRlc2MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9tYXJrX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgdTMyIHJ4X2J1Zl9zeikKK3sKKwl1MzIgZW9yID0gbGUzMl90b19jcHUoZGVzYy0+b3B0czEpICYgUmluZ0VuZDsKKworCWRlc2MtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093biB8IGVvciB8IHJ4X2J1Zl9zeik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X21hcF90b19hc2ljKHN0cnVjdCBSeERlc2MgKmRlc2MsIGRtYV9hZGRyX3QgbWFwcGluZywKKwkJCQkgICAgICAgdTMyIHJ4X2J1Zl9zeikKK3sKKwlkZXNjLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJd21iKCk7CisJcnRsODE2OV9tYXJrX3RvX2FzaWMoZGVzYywgcnhfYnVmX3N6KTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2FsbG9jX3J4X3NrYihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNrX2J1ZmYgKipza19idWZmLAorCQkJCXN0cnVjdCBSeERlc2MgKmRlc2MsIGludCByeF9idWZfc3opCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJaW50IHJldCA9IDA7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4X2J1Zl9zeiArIE5FVF9JUF9BTElHTik7CisJaWYgKCFza2IpCisJCWdvdG8gZXJyX291dDsKKworCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKwkqc2tfYnVmZiA9IHNrYjsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPnRhaWwsIHJ4X2J1Zl9zeiwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCXJ0bDgxNjlfbWFwX3RvX2FzaWMoZGVzYywgbWFwcGluZywgcnhfYnVmX3N6KTsKKworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9vdXQ6CisJcmV0ID0gLUVOT01FTTsKKwlydGw4MTY5X21ha2VfdW51c2FibGVfYnlfYXNpYyhkZXNjKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9yeF9jbGVhcihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCWlmICh0cC0+Unhfc2tidWZmW2ldKSB7CisJCQlydGw4MTY5X2ZyZWVfcnhfc2tiKHRwLCB0cC0+Unhfc2tidWZmICsgaSwKKwkJCQkJICAgIHRwLT5SeERlc2NBcnJheSArIGkpOworCQl9CisJfQorfQorCitzdGF0aWMgdTMyIHJ0bDgxNjlfcnhfZmlsbChzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHUzMiBzdGFydCwgdTMyIGVuZCkKK3sKKwl1MzIgY3VyOworCQorCWZvciAoY3VyID0gc3RhcnQ7IGVuZCAtIGN1ciA+IDA7IGN1cisrKSB7CisJCWludCByZXQsIGkgPSBjdXIgJSBOVU1fUlhfREVTQzsKKworCQlpZiAodHAtPlJ4X3NrYnVmZltpXSkKKwkJCWNvbnRpbnVlOworCQkJCisJCXJldCA9IHJ0bDgxNjlfYWxsb2Nfcnhfc2tiKHRwLT5wY2lfZGV2LCB0cC0+Unhfc2tidWZmICsgaSwKKwkJCQkJICAgdHAtPlJ4RGVzY0FycmF5ICsgaSwgdHAtPnJ4X2J1Zl9zeik7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjdXIgLSBzdGFydDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfbWFya19hc19sYXN0X2Rlc2NyaXB0b3Ioc3RydWN0IFJ4RGVzYyAqZGVzYykKK3sKKwlkZXNjLT5vcHRzMSB8PSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pbml0X3JpbmdfaW5kZXhlcyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl0cC0+ZGlydHlfdHggPSB0cC0+ZGlydHlfcnggPSB0cC0+Y3VyX3R4ID0gdHAtPmN1cl9yeCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHRwKTsKKworCW1lbXNldCh0cC0+dHhfc2tiLCAweDAsIE5VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pKTsKKwltZW1zZXQodHAtPlJ4X3NrYnVmZiwgMHgwLCBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisKKwlpZiAocnRsODE2OV9yeF9maWxsKHRwLCBkZXYsIDAsIE5VTV9SWF9ERVNDKSAhPSBOVU1fUlhfREVTQykKKwkJZ290byBlcnJfb3V0OworCisJcnRsODE2OV9tYXJrX2FzX2xhc3RfZGVzY3JpcHRvcih0cC0+UnhEZXNjQXJyYXkgKyBOVU1fUlhfREVTQyAtIDEpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcnRsODE2OV9yeF9jbGVhcih0cCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdW5tYXBfdHhfc2tiKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmluZ19pbmZvICp0eF9za2IsCisJCQkJIHN0cnVjdCBUeERlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHR4X3NrYi0+bGVuOworCisJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBsZTY0X3RvX2NwdShkZXNjLT5hZGRyKSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkZXNjLT5vcHRzMSA9IDB4MDA7CisJZGVzYy0+b3B0czIgPSAweDAwOworCWRlc2MtPmFkZHIgPSAweDAwOworCXR4X3NrYi0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV90eF9jbGVhcihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IHRwLT5kaXJ0eV90eDsgaSA8IHRwLT5kaXJ0eV90eCArIE5VTV9UWF9ERVNDOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGVudHJ5ID0gaSAlIE5VTV9UWF9ERVNDOworCQlzdHJ1Y3QgcmluZ19pbmZvICp0eF9za2IgPSB0cC0+dHhfc2tiICsgZW50cnk7CisJCXVuc2lnbmVkIGludCBsZW4gPSB0eF9za2ItPmxlbjsKKworCQlpZiAobGVuKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhfc2tiLT5za2I7CisKKwkJCXJ0bDgxNjlfdW5tYXBfdHhfc2tiKHRwLT5wY2lfZGV2LCB0eF9za2IsCisJCQkJCSAgICAgdHAtPlR4RGVzY0FycmF5ICsgZW50cnkpOworCQkJaWYgKHNrYikgeworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQl0eF9za2ItPnNrYiA9IE5VTEw7CisJCQl9CisJCQl0cC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCXRwLT5jdXJfdHggPSB0cC0+ZGlydHlfdHggPSAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3NjaGVkdWxlX3dvcmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAoKnRhc2spKHZvaWQgKikpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJUFJFUEFSRV9XT1JLKCZ0cC0+dGFzaywgdGFzaywgZGV2KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRwLT50YXNrLCA0KTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV93YWl0X2Zvcl9xdWllc2NlbmNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisKKwkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyBOQVBJIHRhc2sgdG8gY29tcGxldGUgKi8KKwluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKKworCXJ0bDgxNjlfaXJxX21hc2tfYW5kX2Fjayhpb2FkZHIpOworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9yZWluaXRfdGFzayh2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX2RhdGE7CisJaW50IHJldDsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcnRsODE2OV93YWl0X2Zvcl9xdWllc2NlbmNlKGRldik7CisJCXJ0bDgxNjlfY2xvc2UoZGV2KTsKKwl9CisKKwlyZXQgPSBydGw4MTY5X29wZW4oZGV2KTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKFBGWCBLRVJOX0VSUiAiJXM6IHJlaW5pdCBmYWlsdXJlIChzdGF0dXMgPSAlZCkuIgorCQkJICAgICAgICIgUmVzY2hlZHVsaW5nLlxuIiwgZGV2LT5uYW1lLCByZXQpOworCQl9CisJCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVpbml0X3Rhc2spOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9yZXNldF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBfZGF0YTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuOworCisJcnRsODE2OV93YWl0X2Zvcl9xdWllc2NlbmNlKGRldik7CisKKwlydGw4MTY5X3J4X2ludGVycnVwdChkZXYsIHRwLCB0cC0+bW1pb19hZGRyKTsKKwlydGw4MTY5X3R4X2NsZWFyKHRwKTsKKworCWlmICh0cC0+ZGlydHlfcnggPT0gdHAtPmN1cl9yeCkgeworCQlydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHRwKTsKKwkJcnRsODE2OV9od19zdGFydChkZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKFBGWCBLRVJOX0VNRVJHICIlczogUnggYnVmZmVycyBzaG9ydGFnZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl9CisJCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVzZXRfdGFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlydGw4MTY5X2h3X3Jlc2V0KHRwLT5tbWlvX2FkZHIpOworCisJLyogTGV0J3Mgd2FpdCBhIGJpdCB3aGlsZSBhbnkgKGFzeW5jKSBpcnEgbGFuZHMgb24gKi8KKwlydGw4MTY5X3NjaGVkdWxlX3dvcmsoZGV2LCBydGw4MTY5X3Jlc2V0X3Rhc2spOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfeG1pdF9mcmFncyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHUzMiBvcHRzMSkKK3sKKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICppbmZvID0gc2tiX3NoaW5mbyhza2IpOworCXVuc2lnbmVkIGludCBjdXJfZnJhZywgZW50cnk7CisJc3RydWN0IFR4RGVzYyAqdHhkOworCisJZW50cnkgPSB0cC0+Y3VyX3R4OworCWZvciAoY3VyX2ZyYWcgPSAwOyBjdXJfZnJhZyA8IGluZm8tPm5yX2ZyYWdzOyBjdXJfZnJhZysrKSB7CisJCXNrYl9mcmFnX3QgKmZyYWcgPSBpbmZvLT5mcmFncyArIGN1cl9mcmFnOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisJCXUzMiBzdGF0dXMsIGxlbjsKKwkJdm9pZCAqYWRkcjsKKworCQllbnRyeSA9IChlbnRyeSArIDEpICUgTlVNX1RYX0RFU0M7CisKKwkJdHhkID0gdHAtPlR4RGVzY0FycmF5ICsgZW50cnk7CisJCWxlbiA9IGZyYWctPnNpemU7CisJCWFkZHIgPSAoKHZvaWQgKikgcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpKSArIGZyYWctPnBhZ2Vfb2Zmc2V0OworCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBjaV9kZXYsIGFkZHIsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJLyogYW50aSBnY2MgMi45NS4zIGJ1Z3dhcmUgKHNpYykgKi8KKwkJc3RhdHVzID0gb3B0czEgfCBsZW4gfCAoUmluZ0VuZCAqICEoKGVudHJ5ICsgMSkgJSBOVU1fVFhfREVTQykpOworCisJCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihzdGF0dXMpOworCQl0eGQtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKKworCQl0cC0+dHhfc2tiW2VudHJ5XS5sZW4gPSBsZW47CisJfQorCisJaWYgKGN1cl9mcmFnKSB7CisJCXRwLT50eF9za2JbZW50cnldLnNrYiA9IHNrYjsKKwkJdHhkLT5vcHRzMSB8PSBjcHVfdG9fbGUzMihMYXN0RnJhZyk7CisJfQorCisJcmV0dXJuIGN1cl9mcmFnOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydGw4MTY5X3Rzb19jc3VtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykgeworCQl1MzIgbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKworCQlpZiAobXNzKQorCQkJcmV0dXJuIExhcmdlU2VuZCB8ICgobXNzICYgTVNTTWFzaykgPDwgTVNTU2hpZnQpOworCX0KKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCisJCWlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQlyZXR1cm4gSVBDUyB8IFRDUENTOworCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCQlyZXR1cm4gSVBDUyB8IFVEUENTOworCQlXQVJOX09OKDEpOwkvKiB3ZSBuZWVkIGEgV0FSTigpICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZnJhZ3MsIGVudHJ5ID0gdHAtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCXN0cnVjdCBUeERlc2MgKnR4ZCA9IHRwLT5UeERlc2NBcnJheSArIGVudHJ5OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTMyIHN0YXR1cywgbGVuOworCXUzMiBvcHRzMTsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAodW5saWtlbHkoVFhfQlVGRlNfQVZBSUwodHApIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBlcnJfc3RvcDsKKwl9CisKKwlpZiAodW5saWtlbHkobGUzMl90b19jcHUodHhkLT5vcHRzMSkgJiBEZXNjT3duKSkKKwkJZ290byBlcnJfc3RvcDsKKworCW9wdHMxID0gRGVzY093biB8IHJ0bDgxNjlfdHNvX2NzdW0oc2tiLCBkZXYpOworCisJZnJhZ3MgPSBydGw4MTY5X3htaXRfZnJhZ3ModHAsIHNrYiwgb3B0czEpOworCWlmIChmcmFncykgeworCQlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlvcHRzMSB8PSBGaXJzdEZyYWc7CisJfSBlbHNlIHsKKwkJbGVuID0gc2tiLT5sZW47CisKKwkJaWYgKHVubGlrZWx5KGxlbiA8IEVUSF9aTEVOKSkgeworCQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQkJaWYgKCFza2IpCisJCQkJZ290byBlcnJfdXBkYXRlX3N0YXRzOworCQkJbGVuID0gRVRIX1pMRU47CisJCX0KKworCQlvcHRzMSB8PSBGaXJzdEZyYWcgfCBMYXN0RnJhZzsKKwkJdHAtPnR4X3NrYltlbnRyeV0uc2tiID0gc2tiOworCX0KKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJdHAtPnR4X3NrYltlbnRyeV0ubGVuID0gbGVuOworCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCXR4ZC0+b3B0czIgPSBjcHVfdG9fbGUzMihydGw4MTY5X3R4X3ZsYW5fdGFnKHRwLCBza2IpKTsKKworCXdtYigpOworCisJLyogYW50aSBnY2MgMi45NS4zIGJ1Z3dhcmUgKHNpYykgKi8KKwlzdGF0dXMgPSBvcHRzMSB8IGxlbiB8IChSaW5nRW5kICogISgoZW50cnkgKyAxKSAlIE5VTV9UWF9ERVNDKSk7CisJdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKHN0YXR1cyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXRwLT5jdXJfdHggKz0gZnJhZ3MgKyAxOworCisJc21wX3dtYigpOworCisJUlRMX1c4KFR4UG9sbCwgMHg0MCk7CS8qIHNldCBwb2xsaW5nIGJpdCAqLworCisJaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA8IE1BWF9TS0JfRlJBR1MpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzbXBfcm1iKCk7CisJCWlmIChUWF9CVUZGU19BVkFJTCh0cCkgPj0gTUFYX1NLQl9GUkFHUykKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfc3RvcDoKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0ID0gMTsKK2Vycl91cGRhdGVfc3RhdHM6CisJdHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9wY2llcnJfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUxNiBwY2lfc3RhdHVzLCBwY2lfY21kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX3N0YXR1cyk7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUENJIGVycm9yIChjbWQgPSAweCUwNHgsIHN0YXR1cyA9IDB4JTA0eCkuXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHBjaV9jbWQsIHBjaV9zdGF0dXMpOworCisJLyoKKwkgKiBUaGUgcmVjb3Zlcnkgc2VxdWVuY2UgYmVsb3cgYWRtaXRzIGEgdmVyeSBlbGFib3JhdGVkIGV4cGxhbmF0aW9uOgorCSAqIC0gaXQgc2VlbXMgdG8gd29yazsKKwkgKiAtIEkgZGlkIG5vdCBzZWUgd2hhdCBlbHNlIGNvdWxkIGJlIGRvbmUuCisJICoKKwkgKiBGZWVsIGZyZWUgdG8gYWRqdXN0IHRvIHlvdXIgbmVlZHMuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELAorCQkJICAgICAgcGNpX2NtZCB8IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFkpOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsCisJCXBjaV9zdGF0dXMgJiAoUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfAorCQlQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgfAorCQlQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfCBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQpKTsKKworCS8qIFRoZSBpbmZhbW91cyBEQUMgZipja3VwIG9ubHkgaGFwcGVucyBhdCBib290IHRpbWUgKi8KKwlpZiAoKHRwLT5jcF9jbWQgJiBQQ0lEQUMpICYmICF0cC0+ZGlydHlfcnggJiYgIXRwLT5jdXJfcngpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBkaXNhYmxpbmcgUENJIERBQy5cbiIsIGRldi0+bmFtZSk7CisJCXRwLT5jcF9jbWQgJj0gflBDSURBQzsKKwkJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfSElHSERNQTsKKwkJcnRsODE2OV9zY2hlZHVsZV93b3JrKGRldiwgcnRsODE2OV9yZWluaXRfdGFzayk7CisJfQorCisJcnRsODE2OV9od19yZXNldChpb2FkZHIpOworfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV90eF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCSAgICAgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdW5zaWduZWQgaW50IGRpcnR5X3R4LCB0eF9sZWZ0OworCisJYXNzZXJ0KGRldiAhPSBOVUxMKTsKKwlhc3NlcnQodHAgIT0gTlVMTCk7CisJYXNzZXJ0KGlvYWRkciAhPSBOVUxMKTsKKworCWRpcnR5X3R4ID0gdHAtPmRpcnR5X3R4OworCXNtcF9ybWIoKTsKKwl0eF9sZWZ0ID0gdHAtPmN1cl90eCAtIGRpcnR5X3R4OworCisJd2hpbGUgKHR4X2xlZnQgPiAwKSB7CisJCXVuc2lnbmVkIGludCBlbnRyeSA9IGRpcnR5X3R4ICUgTlVNX1RYX0RFU0M7CisJCXN0cnVjdCByaW5nX2luZm8gKnR4X3NrYiA9IHRwLT50eF9za2IgKyBlbnRyeTsKKwkJdTMyIGxlbiA9IHR4X3NrYi0+bGVuOworCQl1MzIgc3RhdHVzOworCisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+VHhEZXNjQXJyYXlbZW50cnldLm9wdHMxKTsKKwkJaWYgKHN0YXR1cyAmIERlc2NPd24pCisJCQlicmVhazsKKworCQl0cC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQl0cC0+c3RhdHMudHhfcGFja2V0cysrOworCisJCXJ0bDgxNjlfdW5tYXBfdHhfc2tiKHRwLT5wY2lfZGV2LCB0eF9za2IsIHRwLT5UeERlc2NBcnJheSArIGVudHJ5KTsKKworCQlpZiAoc3RhdHVzICYgTGFzdEZyYWcpIHsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHR4X3NrYi0+c2tiKTsKKwkJCXR4X3NrYi0+c2tiID0gTlVMTDsKKwkJfQorCQlkaXJ0eV90eCsrOworCQl0eF9sZWZ0LS07CisJfQorCisJaWYgKHRwLT5kaXJ0eV90eCAhPSBkaXJ0eV90eCkgeworCQl0cC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJc21wX3dtYigpOworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICAoVFhfQlVGRlNfQVZBSUwodHApID49IE1BWF9TS0JfRlJBR1MpKSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X3J4X2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFJ4RGVzYyAqZGVzYykKK3sKKwl1MzIgb3B0czEgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMSk7CisJdTMyIHN0YXR1cyA9IG9wdHMxICYgUnhQcm90b01hc2s7CisKKwlpZiAoKChzdGF0dXMgPT0gUnhQcm90b1RDUCkgJiYgIShvcHRzMSAmIFRDUEZhaWwpKSB8fAorCSAgICAoKHN0YXR1cyA9PSBSeFByb3RvVURQKSAmJiAhKG9wdHMxICYgVURQRmFpbCkpIHx8CisJICAgICgoc3RhdHVzID09IFJ4UHJvdG9JUCkgJiYgIShvcHRzMSAmIElQRmFpbCkpKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCWVsc2UKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworfQorCitzdGF0aWMgaW5saW5lIGludCBydGw4MTY5X3RyeV9yeF9jb3B5KHN0cnVjdCBza19idWZmICoqc2tfYnVmZiwgaW50IHBrdF9zaXplLAorCQkJCSAgICAgIHN0cnVjdCBSeERlc2MgKmRlc2MsIGludCByeF9idWZfc3opCit7CisJaW50IHJldCA9IC0xOworCisJaWYgKHBrdF9zaXplIDwgcnhfY29weWJyZWFrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3Rfc2l6ZSArIE5FVF9JUF9BTElHTik7CisJCWlmIChza2IpIHsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBza19idWZmWzBdLT50YWlsLCBwa3Rfc2l6ZSwgMCk7CisJCQkqc2tfYnVmZiA9IHNrYjsKKwkJCXJ0bDgxNjlfbWFya190b19hc2ljKGRlc2MsIHJ4X2J1Zl9zeik7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3J0bDgxNjlfcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkgICAgIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXVuc2lnbmVkIGludCBjdXJfcngsIHJ4X2xlZnQ7CisJdW5zaWduZWQgaW50IGRlbHRhLCBjb3VudDsKKworCWFzc2VydChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0KHRwICE9IE5VTEwpOworCWFzc2VydChpb2FkZHIgIT0gTlVMTCk7CisKKwljdXJfcnggPSB0cC0+Y3VyX3J4OworCXJ4X2xlZnQgPSBOVU1fUlhfREVTQyArIHRwLT5kaXJ0eV9yeCAtIGN1cl9yeDsKKwlyeF9sZWZ0ID0gcnRsODE2OV9yeF9xdW90YShyeF9sZWZ0LCAodTMyKSBkZXYtPnF1b3RhKTsKKworCXdoaWxlIChyeF9sZWZ0ID4gMCkgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBjdXJfcnggJSBOVU1fUlhfREVTQzsKKwkJdTMyIHN0YXR1czsKKworCQlybWIoKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUodHAtPlJ4RGVzY0FycmF5W2VudHJ5XS5vcHRzMSk7CisKKwkJaWYgKHN0YXR1cyAmIERlc2NPd24pCisJCQlicmVhazsKKwkJaWYgKHN0YXR1cyAmIFJ4UkVTKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUnggRVJST1IhISFcbiIsIGRldi0+bmFtZSk7CisJCQl0cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgKFJ4UldUIHwgUnhSVU5UKSkKKwkJCQl0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJ4Q1JDKQorCQkJCXRwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgUnhEZXNjICpkZXNjID0gdHAtPlJ4RGVzY0FycmF5ICsgZW50cnk7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPlJ4X3NrYnVmZltlbnRyeV07CisJCQlpbnQgcGt0X3NpemUgPSAoc3RhdHVzICYgMHgwMDAwMUZGRikgLSA0OworCQkJdm9pZCAoKnBjaV9hY3Rpb24pKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsCisJCQkJc2l6ZV90LCBpbnQpID0gcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlOworCisJCQlydGw4MTY5X3J4X2NzdW0oc2tiLCBkZXNjKTsKKwkJCQorCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wY2lfZGV2LAorCQkJCWxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLCB0cC0+cnhfYnVmX3N6LAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCWlmIChydGw4MTY5X3RyeV9yeF9jb3B5KCZza2IsIHBrdF9zaXplLCBkZXNjLAorCQkJCQkJdHAtPnJ4X2J1Zl9zeikpIHsKKwkJCQlwY2lfYWN0aW9uID0gcGNpX3VubWFwX3NpbmdsZTsKKwkJCQl0cC0+Unhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisKKwkJCXBjaV9hY3Rpb24odHAtPnBjaV9kZXYsIGxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLAorCQkJCSAgIHRwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3B1dChza2IsIHBrdF9zaXplKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJCWlmIChydGw4MTY5X3J4X3ZsYW5fc2tiKHRwLCBkZXNjLCBza2IpIDwgMCkKKwkJCQlydGw4MTY5X3J4X3NrYihza2IpOworCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJdHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9zaXplOworCQkJdHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCQkKKwkJY3VyX3J4Kys7IAorCQlyeF9sZWZ0LS07CisJfQorCisJY291bnQgPSBjdXJfcnggLSB0cC0+Y3VyX3J4OworCXRwLT5jdXJfcnggPSBjdXJfcng7CisKKwlkZWx0YSA9IHJ0bDgxNjlfcnhfZmlsbCh0cCwgZGV2LCB0cC0+ZGlydHlfcngsIHRwLT5jdXJfcngpOworCWlmICghZGVsdGEgJiYgY291bnQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBSeCBidWZmZXIgYWxsb2NhdGVkXG4iLCBkZXYtPm5hbWUpOworCXRwLT5kaXJ0eV9yeCArPSBkZWx0YTsKKworCS8qCisJICogRklYTUU6IHVudGlsIHRoZXJlIGlzIHBlcmlvZGljIHRpbWVyIHRvIHRyeSBhbmQgcmVmaWxsIHRoZSByaW5nLAorCSAqIGEgdGVtcG9yYXJ5IHNob3J0YWdlIG1heSBkZWZpbml0ZWx5IGtpbGwgdGhlIFJ4IHByb2Nlc3MuCisJICogLSBkaXNhYmxlIHRoZSBhc2ljIHRvIHRyeSBhbmQgYXZvaWQgYW4gb3ZlcmZsb3cgYW5kIGtpY2sgaXQgYWdhaW4KKwkgKiAgIGFmdGVyIHJlZmlsbCA/CisJICogLSBob3cgZG8gb3RoZXJzIGRyaXZlciBoYW5kbGUgdGhpcyBjb25kaXRpb24gKFVoIG9oLi4uKS4KKwkgKi8KKwlpZiAodHAtPmRpcnR5X3J4ICsgTlVNX1JYX0RFU0MgPT0gdHAtPmN1cl9yeCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBSeCBidWZmZXJzIGV4aGF1c3RlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK3J0bDgxNjlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBib2d1c2NudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IHN0YXR1czsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlkbyB7CisJCXN0YXR1cyA9IFJUTF9SMTYoSW50clN0YXR1cyk7CisKKwkJLyogaG90cGx1Zy9tYWpvciBlcnJvci9ubyBtb3JlIHdvcmsvc2hhcmVkIGlycSAqLworCQlpZiAoKHN0YXR1cyA9PSAweEZGRkYpIHx8ICFzdGF0dXMpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcoZGV2KSkpIHsKKwkJCXJ0bDgxNjlfYXNpY19kb3duKGlvYWRkcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXR1cyAmPSB0cC0+aW50cl9tYXNrOworCQlSVExfVzE2KEludHJTdGF0dXMsCisJCQkoc3RhdHVzICYgUnhGSUZPT3ZlcikgPyAoc3RhdHVzIHwgUnhPdmVyZmxvdykgOiBzdGF0dXMpOworCisJCWlmICghKHN0YXR1cyAmIHJ0bDgxNjlfaW50cl9tYXNrKSkKKwkJCWJyZWFrOworCisJCWlmICh1bmxpa2VseShzdGF0dXMgJiBTWVNFcnIpKSB7CisJCQlydGw4MTY5X3BjaWVycl9pbnRlcnJ1cHQoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIExpbmtDaGcpCisJCQlydGw4MTY5X2NoZWNrX2xpbmtfc3RhdHVzKGRldiwgdHAsIGlvYWRkcik7CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorCQlSVExfVzE2KEludHJNYXNrLCBydGw4MTY5X2ludHJfbWFzayAmIH5ydGw4MTY5X25hcGlfZXZlbnQpOworCQl0cC0+aW50cl9tYXNrID0gfnJ0bDgxNjlfbmFwaV9ldmVudDsKKworCQlpZiAobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkpCisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdCAlMDR4IHRha2VuIGluIHBvbGxcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOwkKKwkJfQorCQlicmVhazsKKyNlbHNlCisJCS8qIFJ4IGludGVycnVwdCAqLworCQlpZiAoc3RhdHVzICYgKFJ4T0sgfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlcikpIHsKKwkJCXJ0bDgxNjlfcnhfaW50ZXJydXB0KGRldiwgdHAsIGlvYWRkcik7CisJCX0KKwkJLyogVHggaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiAoVHhPSyB8IFR4RXJyKSkKKwkJCXJ0bDgxNjlfdHhfaW50ZXJydXB0KGRldiwgdHAsIGlvYWRkcik7CisjZW5kaWYKKworCQlib2d1c2NudC0tOworCX0gd2hpbGUgKGJvZ3VzY250ID4gMCk7CisKKwlpZiAoYm9ndXNjbnQgPD0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJLyogQ2xlYXIgYWxsIGludGVycnVwdCBzb3VyY2VzLiAqLworCQlSVExfVzE2KEludHJTdGF0dXMsIDB4ZmZmZik7CisJfQorb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgQ09ORklHX1I4MTY5X05BUEkKK3N0YXRpYyBpbnQgcnRsODE2OV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXVuc2lnbmVkIGludCB3b3JrX2RvbmUsIHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCXdvcmtfZG9uZSA9IHJ0bDgxNjlfcnhfaW50ZXJydXB0KGRldiwgdHAsIGlvYWRkcik7CisJcnRsODE2OV90eF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKworCSpidWRnZXQgLT0gd29ya19kb25lOworCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJaWYgKHdvcmtfZG9uZSA8IHdvcmtfdG9fZG8pIHsKKwkJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKwkJdHAtPmludHJfbWFzayA9IDB4ZmZmZjsKKwkJLyoKKwkJICogMjAwNDA0MjY6IHRoZSBiYXJyaWVyIGlzIG5vdCBzdHJpY3RseSByZXF1aXJlZCBidXQgdGhlCisJCSAqIGJlaGF2aW9yIG9mIHRoZSBpcnEgaGFuZGxlciBjb3VsZCBiZSBsZXNzIHByZWRpY3RhYmxlCisJCSAqIHdpdGhvdXQgaXQuIEJ0dywgdGhlIGxhY2sgb2YgZmx1c2ggZm9yIHRoZSBwb3N0ZWQgcGNpCisJCSAqIHdyaXRlIGlzIHNhZmUgLSBGUgorCQkgKi8KKwkJc21wX3dtYigpOworCQlSVExfVzE2KEludHJNYXNrLCBydGw4MTY5X2ludHJfbWFzayk7CisJfQorCisJcmV0dXJuICh3b3JrX2RvbmUgPj0gd29ya190b19kbyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcnRsODE2OV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBpbnQgcG9sbF9sb2NrZWQgPSAwOworCisJcnRsODE2OV9kZWxldGVfdGltZXIoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKK2NvcmVfZG93bjoKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlydGw4MTY5X2FzaWNfZG93bihpb2FkZHIpOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMihSeE1pc3NlZCk7CisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisKKwlpZiAoIXBvbGxfbG9ja2VkKSB7CisJCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCQlwb2xsX2xvY2tlZCsrOworCX0KKworCS8qIEdpdmUgYSByYWNpbmcgaGFyZF9zdGFydF94bWl0IGEgZmV3IGN5Y2xlcyB0byBjb21wbGV0ZS4gKi8KKwlzeW5jaHJvbml6ZV9rZXJuZWwoKTsKKworCS8qCisJICogQW5kIG5vdyBmb3IgdGhlIDUwayQgcXVlc3Rpb246IGFyZSBJUlEgZGlzYWJsZWQgb3Igbm90ID8KKwkgKgorCSAqIFR3byBwYXRocyBsZWFkIGhlcmU6CisJICogMSkgZGV2LT5jbG9zZQorCSAqICAgIC0+IG5ldGlmX3J1bm5pbmcoKSBpcyBhdmFpbGFibGUgdG8gc3luYyB0aGUgY3VycmVudCBjb2RlIGFuZCB0aGUKKwkgKiAgICAgICBJUlEgaGFuZGxlci4gU2VlIHJ0bDgxNjlfaW50ZXJydXB0IGZvciBkZXRhaWxzLgorCSAqIDIpIGRldi0+Y2hhbmdlX210dQorCSAqICAgIC0+IHJ0bDgxNjlfcG9sbCBjYW4gbm90IGJlIGlzc3VlZCBhZ2FpbiBhbmQgcmUtZW5hYmxlIHRoZQorCSAqICAgICAgIGludGVycnVwdGlvbnMuIExldCdzIHNpbXBseSBpc3N1ZSB0aGUgSVJRIGRvd24gc2VxdWVuY2UgYWdhaW4uCisJICovCisJaWYgKFJUTF9SMTYoSW50ck1hc2spKQorCQlnb3RvIGNvcmVfZG93bjsKKworCXJ0bDgxNjlfdHhfY2xlYXIodHApOworCisJcnRsODE2OV9yeF9jbGVhcih0cCk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCisJcnRsODE2OV9kb3duKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFI4MTY5X1JYX1JJTkdfQllURVMsIHRwLT5SeERlc2NBcnJheSwKKwkJCSAgICB0cC0+UnhQaHlBZGRyKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFI4MTY5X1RYX1JJTkdfQllURVMsIHRwLT5UeERlc2NBcnJheSwKKwkJCSAgICB0cC0+VHhQaHlBZGRyKTsKKwl0cC0+VHhEZXNjQXJyYXkgPSBOVUxMOworCXRwLT5SeERlc2NBcnJheSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3J0bDgxNjlfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJaW50IGksIHJ4X21vZGU7CisJdTMyIHRtcCA9IDA7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyeF9tb2RlID0KKwkJICAgIEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5cyB8CisJCSAgICBBY2NlcHRBbGxQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCQkgICB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHBlcmZlY3RseSAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDA7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQkJcnhfbW9kZSB8PSBBY2NlcHRNdWx0aWNhc3Q7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCXRtcCA9IHJ0bDgxNjlfcnhfY29uZmlnIHwgcnhfbW9kZSB8CisJICAgICAgKFJUTF9SMzIoUnhDb25maWcpICYgcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uUnhDb25maWdNYXNrKTsKKworCVJUTF9XMzIoUnhDb25maWcsIHRtcCk7CisJUlRMX1czMihNQVIwICsgMCwgbWNfZmlsdGVyWzBdKTsKKwlSVExfVzMyKE1BUjAgKyA0LCBtY19maWx0ZXJbMV0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiAgcnRsODE2OV9nZXRfc3RhdHMgLSBHZXQgcnRsODE2OSByZWFkL3dyaXRlIHN0YXRpc3RpY3MKKyAqICBAZGV2OiBUaGUgRXRoZXJuZXQgRGV2aWNlIHRvIGdldCBzdGF0aXN0aWNzIGZvcgorICoKKyAqICBHZXQgVFgvUlggc3RhdGlzdGljcyBmb3IgcnRsODE2OQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxNjlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMihSeE1pc3NlZCk7CisJCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCX0KKwkJCisJcmV0dXJuICZ0cC0+c3RhdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTY5X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gTU9EVUxFTkFNRSwKKwkuaWRfdGFibGUJPSBydGw4MTY5X3BjaV90YmwsCisJLnByb2JlCQk9IHJ0bDgxNjlfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChydGw4MTY5X3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gcnRsODE2OV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcnRsODE2OV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitydGw4MTY5X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnRsODE2OV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitydGw4MTY5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydGw4MTY5X3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChydGw4MTY5X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJ0bDgxNjlfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcnJ1bm5lci5jIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTg2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ycnVubmVyLmMKQEAgLTAsMCArMSwxNzU2IEBACisvKgorICogcnJ1bm5lci5jOiBMaW51eCBkcml2ZXIgZm9yIHRoZSBFc3NlbnRpYWwgUm9hZFJ1bm5lciBISVBQSSBib2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMiBieSBKZXMgU29yZW5zZW4sIDxqZXNAd2lsZG9wZW5zb3VyY2UuY29tPi4KKyAqCisgKiBUaGFua3MgdG8gRXNzZW50aWFsIENvbW11bmljYXRpb24gZm9yIHByb3ZpZGluZyB1cyB3aXRoIGhhcmR3YXJlCisgKiBhbmQgdmVyeSBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb24gd2l0aG91dCB3aGljaCBJIHdvdWxkIG5vdCBoYXZlCisgKiBiZWVuIGFibGUgdG8gd3JpdGUgdGhpcyBkcml2ZXIuIEEgc3BlY2lhbCB0aGFuayB5b3UgdG8gSm9obiBHaWJib24KKyAqIGZvciBzb3J0aW5nIG91dCB0aGUgbGVnYWwgaXNzdWVzLCB3aXRoIHRoZSBOREEsIGFsbG93aW5nIHRoZSBjb2RlIHRvCisgKiBiZSByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhhbmtzIHRvIEpheWFyYW0gQmhhdCBmcm9tIE9EUy9Fc3NlbnRpYWwgZm9yIGZpeGluZyBzb21lIG9mIHRoZQorICogc3R1cGlkIGJ1Z3MgaW4gbXkgY29kZS4KKyAqCisgKiBTb2Z0bmV0IHN1cHBvcnQgYW5kIHZhcmlvdXMgb3RoZXIgcGF0Y2hlcyBmcm9tIFZhbCBIZW5zb24gb2YKKyAqIE9EUy9Fc3NlbnRpYWwuCisgKgorICogUENJIERNQSBtYXBwaW5nIGNvZGUgcGFydGx5IGJhc2VkIG9uIHdvcmsgYnkgRnJhbmNvaXMgUm9taWV1LgorICovCisKKworI2RlZmluZSBERUJVRyAxCisjZGVmaW5lIFJYX0RNQV9TS0JVRkYgMQorI2RlZmluZSBQS1RfQ09QWV9USFJFU0hPTEQgNTEyCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlwcGlkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIHJyX2lmX2J1c3koZGV2KSAgICAgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpCisjZGVmaW5lIHJyX2lmX3J1bm5pbmcoZGV2KSAgbmV0aWZfcnVubmluZyhkZXYpCisKKyNpbmNsdWRlICJycnVubmVyLmgiCisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisKK01PRFVMRV9BVVRIT1IoIkplcyBTb3JlbnNlbiA8amVzQHdpbGRvcGVuc291cmNlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXNzZW50aWFsIFJvYWRSdW5uZXIgSElQUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0gInJydW5uZXIuYzogdjAuNTAgMTEvMTEvMjAwMiAgSmVzIFNvcmVuc2VuIChqZXNAd2lsZG9wZW5zb3VyY2UuY29tKVxuIjsKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG5vdGVzOgorICoKKyAqIFRoZSBETUEgZW5naW5lIG9ubHkgYWxsb3dzIGZvciBETUEgd2l0aGluIHBoeXNpY2FsIDY0S0IgY2h1bmtzIG9mCisgKiBtZW1vcnkuIFRoZSBjdXJyZW50IGFwcHJvYWNoIG9mIHRoZSBkcml2ZXIgKGFuZCBzdGFjaykgaXMgdG8gdXNlCisgKiBsaW5lYXIgYmxvY2tzIG9mIG1lbW9yeSBmb3IgdGhlIHNrYnVmZnMuIEhvd2V2ZXIsIGFzIHRoZSBkYXRhIGJsb2NrCisgKiBpcyBhbHdheXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHNrYiBhbmQgc2ticyBhcmUgMl5uIGFsaWduZWQgc28gd2UKKyAqIGFyZSBndWFyYW50dGVkIHRvIGdldCB0aGUgd2hvbGUgYmxvY2sgd2l0aGluIG9uZSA2NEtCIGFsaWduIDY0S0IKKyAqIGNodW5rLgorICoKKyAqIE9uIHRoZSBsb25nIHRlcm0sIHJlbHlpbmcgb24gYmVpbmcgYWJsZSB0byBhbGxvY2F0ZSA2NEtCIGxpbmVhcgorICogY2h1bmtzIG9mIG1lbW9yeSBpcyBub3QgZmVhc2libGUgYW5kIHRoZSBza2IgaGFuZGxpbmcgY29kZSBhbmQgdGhlCisgKiBzdGFjayB3aWxsIG5lZWQgdG8ga25vdyBhYm91dCBJL08gdmVjdG9ycyBvciBzb21ldGhpbmcgc2ltaWxhci4KKyAqLworCisvKgorICogVGhlc2UgYXJlIGNoZWNrZWQgYXQgaW5pdCB0aW1lIHRvIHNlZSBpZiB0aGV5IGFyZSBhdCBsZWFzdCAyNTZLQgorICogYW5kIGluY3JlYXNlZCB0byAyNTZLQiBpZiB0aGV5IGFyZSBub3QuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBlbmRpbmcKKyAqIHVwIHdpdGggc29ja2V0IGJ1ZmZlcnMgc21hbGxlciB0aGFuIHRoZSBNVFUgc2l6ZSwKKyAqLworZXh0ZXJuIF9fdTMyIHN5c2N0bF93bWVtX21heDsKK2V4dGVybiBfX3UzMiBzeXNjdGxfcm1lbV9tYXg7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJyX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdGF0aWMgaW50IHZlcnNpb25fZGlzcDsKKwl1OCBwY2lfbGF0ZW5jeTsKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXZvaWQgKnRtcHB0cjsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCWludCByZXQgPSAtRU5PTUVNOworCisJZGV2ID0gYWxsb2NfaGlwcGlfZGV2KHNpemVvZihzdHJ1Y3QgcnJfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlnb3RvIG91dDM7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAicnJ1bm5lciIpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcnJwcml2LT5wY2lfZGV2ID0gcGRldjsKKworCXNwaW5fbG9ja19pbml0KCZycnByaXYtPmxvY2spOworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5vcGVuID0gJnJyX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcnJfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmcnJfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmcnJfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSAmcnJfaW9jdGw7CisKKwlkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCS8qIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGlmIGFkYXB0ZXIgaXMgZm91bmQgKi8KKwlpZiAoIXZlcnNpb25fZGlzcCkgeworCQkvKiBzZXQgZGlzcGxheSBmbGFnIHRvIFRSVUUgc28gdGhhdCAqLworCQkvKiB3ZSBvbmx5IGRpc3BsYXkgdGhpcyBzdHJpbmcgT05DRSAqLworCQl2ZXJzaW9uX2Rpc3AgPSAxOworCQlwcmludGsodmVyc2lvbik7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisJaWYgKHBjaV9sYXRlbmN5IDw9IDB4NTgpeworCQlwY2lfbGF0ZW5jeSA9IDB4NTg7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgcGNpX2xhdGVuY3kpOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVzc2VudGlhbCBSb2FkUnVubmVyIHNlcmlhbCBISVBQSSAiCisJICAgICAgICJhdCAweCUwOGx4LCBpcnEgJWksIFBDSSBsYXRlbmN5ICVpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgcGNpX2xhdGVuY3kpOworCisJLyoKKwkgKiBSZW1hcCB0aGUgcmVncyBpbnRvIGtlcm5lbCBzcGFjZS4KKwkgKi8KKworCXJycHJpdi0+cmVncyA9IGlvcmVtYXAoZGV2LT5iYXNlX2FkZHIsIDB4MTAwMCk7CisKKwlpZiAoIXJycHJpdi0+cmVncyl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICBVbmFibGUgdG8gbWFwIEkvTyByZWdpc3RlciwgIgorCQkJIlJvYWRSdW5uZXIgd2lsbCBiZSBkaXNhYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXRtcHB0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJcnJwcml2LT50eF9yaW5nID0gdG1wcHRyOworCXJycHJpdi0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCWlmICghdG1wcHRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXRtcHB0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJcnJwcml2LT5yeF9yaW5nID0gdG1wcHRyOworCXJycHJpdi0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCWlmICghdG1wcHRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXRtcHB0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIEVWVF9SSU5HX1NJWkUsICZyaW5nX2RtYSk7CisJcnJwcml2LT5ldnRfcmluZyA9IHRtcHB0cjsKKwlycnByaXYtPmV2dF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKCF0bXBwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEb24ndCBhY2Nlc3MgYW55IHJlZ2lzdGVyIGJlZm9yZSB0aGlzIHBvaW50IQorCSAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXdyaXRlbChyZWFkbCgmcnJwcml2LT5yZWdzLT5Ib3N0Q3RybCkgfCBOT19TV0FQLAorCQkmcnJwcml2LT5yZWdzLT5Ib3N0Q3RybCk7CisjZW5kaWYKKwkvKgorCSAqIE5lZWQgdG8gYWRkIGEgY2FzZSBmb3IgbGl0dGxlLWVuZGlhbiA2NC1iaXQgaG9zdHMgaGVyZS4KKwkgKi8KKworCXJyX2luaXQoZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gMDsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworCisgb3V0OgorCWlmIChycnByaXYtPnJ4X3JpbmcpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgcnJwcml2LT5yeF9yaW5nLCAKKwkJCQkgICAgcnJwcml2LT5yeF9yaW5nX2RtYSk7CisJaWYgKHJycHJpdi0+dHhfcmluZykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBycnByaXYtPnR4X3JpbmcsCisJCQkJICAgIHJycHJpdi0+dHhfcmluZ19kbWEpOworCWlmIChycnByaXYtPnJlZ3MpCisJCWlvdW5tYXAocnJwcml2LT5yZWdzKTsJCisJaWYgKHBkZXYpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KKyBvdXQyOgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0MzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnJfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IHJyX3ByaXZhdGUgKnJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlpZiAoIShyZWFkbCgmcnItPnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byB1bmxvYWQgcnVubmluZyBOSUNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChIQUxUX05JQywgJnJyLT5yZWdzLT5Ib3N0Q3RybCk7CisJCX0KKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIEVWVF9SSU5HX1NJWkUsIHJyLT5ldnRfcmluZywKKwkJCQkgICAgcnItPmV2dF9yaW5nX2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgcnItPnJ4X3JpbmcsCisJCQkJICAgIHJyLT5yeF9yaW5nX2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgcnItPnR4X3JpbmcsCisJCQkJICAgIHJyLT50eF9yaW5nX2RtYSk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWlvdW5tYXAocnItPnJlZ3MpOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKKworLyoKKyAqIENvbW1hbmRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNsb3csIHRodXMgdGhlcmUgaXMgbm8gcmVhc29uIHRvCisgKiBpbmxpbmUgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgcnJfaXNzdWVfY21kKHN0cnVjdCBycl9wcml2YXRlICpycnByaXYsIHN0cnVjdCBjbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXUzMiBpZHg7CisKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCS8qCisJICogVGhpcyBpcyB0ZW1wb3JhcnkgLSBpdCB3aWxsIGdvIGF3YXkgaW4gdGhlIGZpbmFsIHZlcnNpb24uCisJICogV2UgcHJvYmFibHkgYWxzbyB3YW50IHRvIG1ha2UgdGhpcyBmdW5jdGlvbiBpbmxpbmUuCisJICovCisJaWYgKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkgJiBOSUNfSEFMVEVEKXsKKwkJcHJpbnRrKCJpc3N1aW5nIGNvbW1hbmQgZm9yIGhhbHRlZCBOSUMsIGNvZGUgMHgleCwgIgorCQkgICAgICAgIkhvc3RDdHJsICUwOHhcbiIsIGNtZC0+Y29kZSwgcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSk7CisJCWlmIChyZWFkbCgmcmVncy0+TW9kZSkgJiBGQVRBTF9FUlIpCisJCQlwcmludGsoImVycm9yIGNvZGVzIEZhaWwxICUwMngsIEZhaWwyICUwMnhcbiIsCisJCQkgICAgICAgcmVhZGwoJnJlZ3MtPkZhaWwxKSwgcmVhZGwoJnJlZ3MtPkZhaWwyKSk7CisJfQorCisJaWR4ID0gcnJwcml2LT5pbmZvLT5jbWRfY3RybC5waTsKKworCXdyaXRlbCgqKHUzMiopKGNtZCksICZyZWdzLT5DbWRSaW5nW2lkeF0pOworCXdtYigpOworCisJaWR4ID0gKGlkeCAtIDEpICUgQ01EX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLnBpID0gaWR4OworCXdtYigpOworCisJaWYgKHJlYWRsKCZyZWdzLT5Nb2RlKSAmIEZBVEFMX0VSUikKKwkJcHJpbnRrKCJlcnJvciBjb2RlICUwMnhcbiIsIHJlYWRsKCZyZWdzLT5GYWlsMSkpOworfQorCisKKy8qCisgKiBSZXNldCB0aGUgYm9hcmQgaW4gYSBzZW5zaWJsZSBtYW5uZXIuIFRoZSBOSUMgaXMgYWxyZWFkeSBoYWx0ZWQKKyAqIHdoZW4gd2UgZ2V0IGhlcmUgYW5kIGEgc3Bpbi1sb2NrIGlzIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgcnJfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGVlcHJvbSAqaHcgPSBOVUxMOworCXUzMiBzdGFydF9wYzsKKwlpbnQgaTsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCXJyX2xvYWRfZmlybXdhcmUoZGV2KTsKKworCXdyaXRlbCgweDAxMDAwMDAwLCAmcmVncy0+VFhfc3RhdGUpOworCXdyaXRlbCgweGZmODAwMDAwLCAmcmVncy0+Ulhfc3RhdGUpOworCXdyaXRlbCgwLCAmcmVncy0+QXNzaXN0U3RhdGUpOworCXdyaXRlbChDTEVBUl9JTlRBLCAmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoMHgwMSwgJnJlZ3MtPkJya1B0KTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlRpbWVyKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlRpbWVyUmVmKTsKKwl3cml0ZWwoUkVTRVRfRE1BLCAmcmVncy0+RG1hUmVhZFN0YXRlKTsKKwl3cml0ZWwoUkVTRVRfRE1BLCAmcmVncy0+RG1hV3JpdGVTdGF0ZSk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFXcml0ZUhvc3RIaSk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFXcml0ZUhvc3RMbyk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkSG9zdEhpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVJlYWRIb3N0TG8pOworCXdyaXRlbCgwLCAmcmVncy0+RG1hUmVhZExlbik7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFXcml0ZUxlbik7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFXcml0ZUxjbCk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFXcml0ZUlQY2hlY2tzdW0pOworCXdyaXRlbCgwLCAmcmVncy0+RG1hUmVhZExjbCk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkSVBjaGVja3N1bSk7CisJd3JpdGVsKDAsICZyZWdzLT5QY2lTdGF0ZSk7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpICYmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOCisJd3JpdGVsKFNXQVBfREFUQSB8IFBUUjY0QklUIHwgUFRSX1dEX1NXQVAsICZyZWdzLT5Nb2RlKTsKKyNlbGlmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXdyaXRlbChTV0FQX0RBVEEgfCBQVFI2NEJJVCB8IFBUUl9XRF9OT1NXQVAsICZyZWdzLT5Nb2RlKTsKKyNlbHNlCisJd3JpdGVsKFNXQVBfREFUQSB8IFBUUjMyQklUIHwgUFRSX1dEX05PU1dBUCwgJnJlZ3MtPk1vZGUpOworI2VuZGlmCisKKyNpZiAwCisJLyoKKwkgKiBEb24ndCB3b3JyeSwgdGhpcyBpcyBqdXN0IGJsYWNrIG1hZ2ljLgorCSAqLworCXdyaXRlbCgweGRmMDAwLCAmcmVncy0+UnhCYXNlKTsKKwl3cml0ZWwoMHhkZjAwMCwgJnJlZ3MtPlJ4UHJkKTsKKwl3cml0ZWwoMHhkZjAwMCwgJnJlZ3MtPlJ4Q29uKTsKKwl3cml0ZWwoMHhjZTAwMCwgJnJlZ3MtPlR4QmFzZSk7CisJd3JpdGVsKDB4Y2UwMDAsICZyZWdzLT5UeFByZCk7CisJd3JpdGVsKDB4Y2UwMDAsICZyZWdzLT5UeENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5SeEluZFBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5SeEluZENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5SeEluZFJlZik7CisJd3JpdGVsKDAsICZyZWdzLT5UeEluZFBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5UeEluZENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5UeEluZFJlZik7CisJd3JpdGVsKDB4Y2MwMDAsICZyZWdzLT5wYWQxMFswXSk7CisJd3JpdGVsKDAsICZyZWdzLT5EckNtbmRQcm8pOworCXdyaXRlbCgwLCAmcmVncy0+RHJDbW5kQ29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3Q21uZFBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0NtbmRDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RHdDbW5kUmVmKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRyRGF0YVBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5EckRhdGFDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RHJEYXRhUmVmKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3RGF0YVBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0RhdGFDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RHdEYXRhUmVmKTsKKyNlbmRpZgorCisJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NYkV2ZW50KTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2ZW50KTsKKworCXdyaXRlbCgwLCAmcmVncy0+VHhQaSk7CisJd3JpdGVsKDAsICZyZWdzLT5JcFJ4UGkpOworCisJd3JpdGVsKDAsICZyZWdzLT5FdnRDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RXZ0UHJkKTsKKworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENNRF9SSU5HX0VOVFJJRVM7IGkrKykKKwkJd3JpdGVsKDAsICZyZWdzLT5DbWRSaW5nW2ldKTsKKworLyoKKyAqIFdoeSAzMiA/IGlzIHRoaXMgbm90IGNhY2hlIGxpbmUgc2l6ZSBkZXBlbmRlbnQ/CisgKi8KKwl3cml0ZWwoUkJVUlNUXzY0fFdCVVJTVF82NCwgJnJlZ3MtPlBjaVN0YXRlKTsKKwl3bWIoKTsKKworCXN0YXJ0X3BjID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICZody0+cm5jZF9pbmZvLkZ3U3RhcnQpOworCisjaWYgKERFQlVHID4gMSkKKwlwcmludGsoIiVzOiBFeGVjdXRpbmcgZmlybXdhcmUgYXQgYWRkcmVzcyAweCUwNnhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhcnRfcGMpOworI2VuZGlmCisKKwl3cml0ZWwoc3RhcnRfcGMgKyAweDgwMCwgJnJlZ3MtPlBjKTsKKwl3bWIoKTsKKwl1ZGVsYXkoNSk7CisKKwl3cml0ZWwoc3RhcnRfcGMsICZyZWdzLT5QYyk7CisJd21iKCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmVhZCBhIHN0cmluZyBmcm9tIHRoZSBFRVBST00uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnJfcmVhZF9lZXByb20oc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQl1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVncyA9IHJycHJpdi0+cmVnczsKKwl1MzIgbWlzYywgaW8sIGhvc3QsIGk7CisKKwlpbyA9IHJlYWRsKCZyZWdzLT5FeHRJbyk7CisJd3JpdGVsKDAsICZyZWdzLT5FeHRJbyk7CisJbWlzYyA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCXdyaXRlbCgwLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlob3N0ID0gcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsKKwl3cml0ZWwoaG9zdCB8IEhBTFRfTklDLCAmcmVncy0+SG9zdEN0cmwpOworCW1iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQl3cml0ZWwoKEVFUFJPTV9CQVNFICsgKChvZmZzZXQraSkgPDwgMykpLCAmcmVncy0+V2luQmFzZSk7CisJCW1iKCk7CisJCWJ1ZltpXSA9IChyZWFkbCgmcmVncy0+V2luRGF0YSkgPj4gMjQpICYgMHhmZjsKKwkJbWIoKTsKKwl9CisKKwl3cml0ZWwoaG9zdCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwl3cml0ZWwobWlzYywgJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKGlvLCAmcmVncy0+RXh0SW8pOworCW1iKCk7CisJcmV0dXJuIGk7Cit9CisKKworLyoKKyAqIFNob3J0Y3V0IHRvIHJlYWQgb25lIHdvcmQgKDQgYnl0ZXMpIG91dCBvZiB0aGUgRUVQUk9NIGFuZCBjb252ZXJ0CisgKiBpdCB0byBvdXIgQ1BVIGJ5dGUtb3JkZXIuCisgKi8KK3N0YXRpYyB1MzIgcnJfcmVhZF9lZXByb21fd29yZChzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJICAgIHZvaWQgKiBvZmZzZXQpCit7CisJdTMyIHdvcmQ7CisKKwlpZiAoKHJyX3JlYWRfZWVwcm9tKHJycHJpdiwgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0LAorCQkJICAgIChjaGFyICopJndvcmQsIDQpID09IDQpKQorCQlyZXR1cm4gYmUzMl90b19jcHUod29yZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBFRVBST00uCisgKgorICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBmaXJtd2FyZSBpcyBub3QgcnVubmluZy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB3cml0ZV9lZXByb20oc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVncyA9IHJycHJpdi0+cmVnczsKKwl1MzIgbWlzYywgaW8sIGRhdGEsIGksIGosIHJlYWR5LCBlcnJvciA9IDA7CisKKwlpbyA9IHJlYWRsKCZyZWdzLT5FeHRJbyk7CisJd3JpdGVsKDAsICZyZWdzLT5FeHRJbyk7CisJbWlzYyA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCXdyaXRlbChFTkFCTEVfRUVQUk9NX1dSSVRFLCAmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJd3JpdGVsKChFRVBST01fQkFTRSArICgob2Zmc2V0K2kpIDw8IDMpKSwgJnJlZ3MtPldpbkJhc2UpOworCQltYigpOworCQlkYXRhID0gYnVmW2ldIDw8IDI0OworCQkvKgorCQkgKiBPbmx5IHRyeSB0byB3cml0ZSB0aGUgZGF0YSBpZiBpdCBpcyBub3QgdGhlIHNhbWUKKwkJICogdmFsdWUgYWxyZWFkeS4KKwkJICovCisJCWlmICgocmVhZGwoJnJlZ3MtPldpbkRhdGEpICYgMHhmZjAwMDAwMCkgIT0gZGF0YSl7CisJCQl3cml0ZWwoZGF0YSwgJnJlZ3MtPldpbkRhdGEpOworCQkJcmVhZHkgPSAwOworCQkJaiA9IDA7CisJCQltYigpOworCQkJd2hpbGUoIXJlYWR5KXsKKwkJCQl1ZGVsYXkoMjApOworCQkJCWlmICgocmVhZGwoJnJlZ3MtPldpbkRhdGEpICYgMHhmZjAwMDAwMCkgPT0KKwkJCQkgICAgZGF0YSkKKwkJCQkJcmVhZHkgPSAxOworCQkJCW1iKCk7CisJCQkJaWYgKGorKyA+IDUwMDApeworCQkJCQlwcmludGsoImRhdGEgbWlzbWF0Y2g6ICUwOHgsICIKKwkJCQkJICAgICAgICJXaW5EYXRhICUwOHhcbiIsIGRhdGEsCisJCQkJCSAgICAgICByZWFkbCgmcmVncy0+V2luRGF0YSkpOworCQkJCQlyZWFkeSA9IDE7CisJCQkJCWVycm9yID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl3cml0ZWwobWlzYywgJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKGlvLCAmcmVncy0+RXh0SW8pOworCW1iKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgcnJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgZWVwcm9tICpodyA9IE5VTEw7CisJdTMyIHNyYW1fc2l6ZSwgcmV2OworCWludCBpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJcmV2ID0gcmVhZGwoJnJlZ3MtPkZ3UmV2KTsKKwlycnByaXYtPmZ3X3JldiA9IHJldjsKKwlpZiAocmV2ID4gMHgwMDAyMDAyNCkKKwkJcHJpbnRrKCIgIEZpcm13YXJlIHJldmlzaW9uOiAlaS4laS4laVxuIiwgKHJldiA+PiAxNiksCisJCSAgICAgICAoKHJldiA+PiA4KSAmIDB4ZmYpLCAocmV2ICYgMHhmZikpOworCWVsc2UgaWYgKHJldiA+PSAweDAwMDIwMDAwKSB7CisJCXByaW50aygiICBGaXJtd2FyZSByZXZpc2lvbjogJWkuJWkuJWkgKDIuMC4zNyBvciAiCisJCSAgICAgICAibGF0ZXIgaXMgcmVjb21tZW5kZWQpXG4iLCAocmV2ID4+IDE2KSwKKwkJICAgICAgICgocmV2ID4+IDgpICYgMHhmZiksIChyZXYgJiAweGZmKSk7CisJfWVsc2V7CisJCXByaW50aygiICBGaXJtd2FyZSByZXZpc2lvbiB0b28gb2xkOiAlaS4laS4laSwgcGxlYXNlICIKKwkJICAgICAgICJ1cGdyYWRlIHRvIDIuMC4zNyBvciBsYXRlci5cbiIsCisJCSAgICAgICAocmV2ID4+IDE2KSwgKChyZXYgPj4gOCkgJiAweGZmKSwgKHJldiAmIDB4ZmYpKTsKKwl9CisKKyNpZiAoREVCVUcgPiAyKQorCXByaW50aygiICBNYXhpbXVtIHJlY2VpdmUgcmluZ3MgJWlcbiIsIHJlYWRsKCZyZWdzLT5NYXhSeFJuZykpOworI2VuZGlmCisKKwkvKgorCSAqIFJlYWQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tLiAgVGhlIEhXIGFkZHJlc3MKKwkgKiBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBmb3IgSElQUEkgYnV0IGF3ZnVsbHkgY29udmVuaWVudC4KKwkgKiBUaGUgcG9pbnRlciBhcml0aG1ldGljIHRvIHB1dCBpdCBpbiBkZXZfYWRkciBpcyB1Z2x5LCBidXQKKwkgKiBEb25hbGQgQmVja2VyIGRvZXMgaXQgdGhpcyB3YXkgZm9yIHRoZSBHaWdFIHZlcnNpb24gb2YgdGhpcworCSAqIGNhcmQgYW5kIGl0J3Mgc2hvcnRlciBhbmQgbW9yZSBwb3J0YWJsZSB0aGFuIGFueQorCSAqIG90aGVyIG1ldGhvZCBJJ3ZlIHNlZW4uICAtVkFMCisJICovCisKKwkqKHUxNiAqKShkZXYtPmRldl9hZGRyKSA9CisJICBodG9ucyhycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgJmh3LT5tYW5mLkJvYXJkVUxBKSk7CisJKih1MzIgKikoZGV2LT5kZXZfYWRkcisyKSA9CisJICBodG9ubChycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgJmh3LT5tYW5mLkJvYXJkVUxBWzRdKSk7CisJCisJcHJpbnRrKCIgIE1BQzogIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMnhcbiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCisJc3JhbV9zaXplID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopOCk7CisJcHJpbnRrKCIgIFNSQU0gc2l6ZSAweCUwNnhcbiIsIHNyYW1fc2l6ZSk7CisKKwlpZiAoc3lzY3RsX3JtZW1fbWF4IDwgMjYyMTQ0KXsKKwkJcHJpbnRrKCIgIFJlY2VpdmUgc29ja2V0IGJ1ZmZlciBsaW1pdCB0b28gbG93ICglaSksICIKKwkJICAgICAgICJzZXR0aW5nIHRvIDI2MjE0NFxuIiwgc3lzY3RsX3JtZW1fbWF4KTsKKwkJc3lzY3RsX3JtZW1fbWF4ID0gMjYyMTQ0OworCX0KKworCWlmIChzeXNjdGxfd21lbV9tYXggPCAyNjIxNDQpeworCQlwcmludGsoIiAgVHJhbnNtaXQgc29ja2V0IGJ1ZmZlciBsaW1pdCB0b28gbG93ICglaSksICIKKwkJICAgICAgICJzZXR0aW5nIHRvIDI2MjE0NFxuIiwgc3lzY3RsX3dtZW1fbWF4KTsKKwkJc3lzY3RsX3dtZW1fbWF4ID0gMjYyMTQ0OworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnJfaW5pdDEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBteWppZiwgZmxhZ3M7CisJc3RydWN0IGNtZCBjbWQ7CisJdTMyIGhvc3RjdHJsOworCWludCBlY29kZSA9IDA7CisJc2hvcnQgaTsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWhvc3RjdHJsID0gcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsKKwl3cml0ZWwoaG9zdGN0cmwgfCBIQUxUX05JQyB8IFJSX0NMRUFSX0lOVCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwl3bWIoKTsKKworCWlmIChob3N0Y3RybCAmIFBBUklUWV9FUlIpeworCQlwcmludGsoIiVzOiBQYXJpdHkgZXJyb3IgaGFsdGluZyBOSUMgLSB0aGlzIGlzIHNlcmlvdXMhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCWVjb2RlID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzZXRfcnhhZGRyKHJlZ3MsIHJycHJpdi0+cnhfY3RybF9kbWEpOworCXNldF9pbmZvYWRkcihyZWdzLCBycnByaXYtPmluZm9fZG1hKTsKKworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwuZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXZlbnQpOworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwuZW50cmllcyA9IEVWVF9SSU5HX0VOVFJJRVM7CisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5tb2RlID0gMDsKKwlycnByaXYtPmluZm8tPmV2dF9jdHJsLnBpID0gMDsKKwlzZXRfcnJhZGRyKCZycnByaXYtPmluZm8tPmV2dF9jdHJsLnJuZ3B0ciwgcnJwcml2LT5ldnRfcmluZ19kbWEpOworCisJcnJwcml2LT5pbmZvLT5jbWRfY3RybC5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCBjbWQpOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwuZW50cmllcyA9IENNRF9SSU5HX0VOVFJJRVM7CisJcnJwcml2LT5pbmZvLT5jbWRfY3RybC5tb2RlID0gMDsKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLnBpID0gMTU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXdyaXRlbCgwLCAmcmVncy0+Q21kUmluZ1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXJycHJpdi0+dHhfcmluZ1tpXS5zaXplID0gMDsKKwkJc2V0X3JyYWRkcigmcnJwcml2LT50eF9yaW5nW2ldLmFkZHIsIDApOworCQlycnByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCXJycHJpdi0+aW5mby0+dHhfY3RybC5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKwlycnByaXYtPmluZm8tPnR4X2N0cmwuZW50cmllcyA9IFRYX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPnR4X2N0cmwubW9kZSA9IDA7CisJcnJwcml2LT5pbmZvLT50eF9jdHJsLnBpID0gMDsKKwlzZXRfcnJhZGRyKCZycnByaXYtPmluZm8tPnR4X2N0cmwucm5ncHRyLCBycnByaXYtPnR4X3JpbmdfZG1hKTsKKworCS8qCisJICogU2V0IGRpcnR5X3R4IGJlZm9yZSB3ZSBzdGFydCByZWNlaXZpbmcgaW50ZXJydXB0cywgb3RoZXJ3aXNlCisJICogdGhlIGludGVycnVwdCBoYW5kbGVyIG1pZ2h0IHRoaW5rIGl0IGlzIHN1cHBvc2VkIHRvIHByb2Nlc3MKKwkgKiB0eCBpbnRzIGJlZm9yZSB3ZSBhcmUgdXAgYW5kIHJ1bm5pbmcsIHdoaWNoIG1heSBjYXVzZSBhIG51bGwKKwkgKiBwb2ludGVyIGFjY2VzcyBpbiB0aGUgaW50IGhhbmRsZXIuCisJICovCisJcnJwcml2LT50eF9mdWxsID0gMDsKKwlycnByaXYtPmN1cl9yeCA9IDA7CisJcnJwcml2LT5kaXJ0eV9yeCA9IHJycHJpdi0+ZGlydHlfdHggPSAwOworCisJcnJfcmVzZXQoZGV2KTsKKworCS8qIFR1bmluZyB2YWx1ZXMgKi8KKwl3cml0ZWwoMHg1MDAwLCAmcmVncy0+Q29uUmV0cnkpOworCXdyaXRlbCgweDEwMCwgJnJlZ3MtPkNvblJldHJ5VG1yKTsKKwl3cml0ZWwoMHg1MDAwMDAsICZyZWdzLT5Db25UbW91dCk7CisgCXdyaXRlbCgweDYwLCAmcmVncy0+SW50clRtcik7CisJd3JpdGVsKDB4NTAwMDAwLCAmcmVncy0+VHhEYXRhTXZUaW1lb3V0KTsKKwl3cml0ZWwoMHgyMDAwMDAsICZyZWdzLT5SeERhdGFNdlRpbWVvdXQpOworIAl3cml0ZWwoMHg4MCwgJnJlZ3MtPldyaXRlRG1hVGhyZXNoKTsKKyAJd3JpdGVsKDB4ODAsICZyZWdzLT5SZWFkRG1hVGhyZXNoKTsKKworCXJycHJpdi0+ZndfcnVubmluZyA9IDA7CisJd21iKCk7CisKKwlob3N0Y3RybCAmPSB+KEhBTFRfTklDIHwgSU5WQUxJRF9JTlNUX0IgfCBQQVJJVFlfRVJSKTsKKwl3cml0ZWwoaG9zdGN0cmwsICZyZWdzLT5Ib3N0Q3RybCk7CisJd21iKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IGFkZHI7CisKKwkJcnJwcml2LT5yeF9yaW5nW2ldLm1vZGUgPSAwOworCQlza2IgPSBhbGxvY19za2IoZGV2LT5tdHUgKyBISVBQSV9ITEVOLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCSAgICAgICAiZm9yIHJlY2VpdmUgcmluZyAtIGhhbHRpbmcgTklDXG4iLCBkZXYtPm5hbWUpOworCQkJZWNvZGUgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlycnByaXYtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkgICAgICAgIGFkZHIgPSBwY2lfbWFwX3NpbmdsZShycnByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCWRldi0+bXR1ICsgSElQUElfSExFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJLyoKKwkJICogU2FuaXR5IHRlc3QgdG8gc2VlIGlmIHdlIGNvbmZsaWN0IHdpdGggdGhlIERNQQorCQkgKiBsaW1pdGF0aW9ucyBvZiB0aGUgUm9hZHJ1bm5lci4KKwkJICovCisJCWlmICgoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSkgJiAweGZmZikgPiB+NjUzMjApCisJCQlwcmludGsoInNrYiBhbGxvYyBlcnJvclxuIik7CisKKwkJc2V0X3JyYWRkcigmcnJwcml2LT5yeF9yaW5nW2ldLmFkZHIsIGFkZHIpOworCQlycnByaXYtPnJ4X3JpbmdbaV0uc2l6ZSA9IGRldi0+bXR1ICsgSElQUElfSExFTjsKKwl9CisKKwlycnByaXYtPnJ4X2N0cmxbNF0uZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJcnJwcml2LT5yeF9jdHJsWzRdLmVudHJpZXMgPSBSWF9SSU5HX0VOVFJJRVM7CisJcnJwcml2LT5yeF9jdHJsWzRdLm1vZGUgPSA4OworCXJycHJpdi0+cnhfY3RybFs0XS5waSA9IDA7CisJd21iKCk7CisJc2V0X3JyYWRkcigmcnJwcml2LT5yeF9jdHJsWzRdLnJuZ3B0ciwgcnJwcml2LT5yeF9yaW5nX2RtYSk7CisKKwl1ZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5vdyBzdGFydCB0aGUgRmlybVdhcmUuCisJICovCisJY21kLmNvZGUgPSBDX1NUQVJUX0ZXOworCWNtZC5yaW5nID0gMDsKKwljbWQuaW5kZXggPSAwOworCisJcnJfaXNzdWVfY21kKHJycHJpdiwgJmNtZCk7CisKKwkvKgorCSAqIEdpdmUgdGhlIEZpcm1XYXJlIHRpbWUgdG8gY2hldyBvbiB0aGUgYGdldCBydW5uaW5nJyBjb21tYW5kLgorCSAqLworCW15amlmID0gamlmZmllcyArIDUgKiBIWjsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgbXlqaWYpICYmICFycnByaXYtPmZ3X3J1bm5pbmcpCisJCWNwdV9yZWxheCgpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiBlY29kZTsKKworIGVycm9yOgorCS8qCisJICogV2UgbWlnaHQgaGF2ZSBnb3R0ZW4gaGVyZSBiZWNhdXNlIHdlIGFyZSBvdXQgb2YgbWVtb3J5LAorCSAqIG1ha2Ugc3VyZSB3ZSByZWxlYXNlIGV2ZXJ5dGhpbmcgd2UgYWxsb2NhdGVkIGJlZm9yZSBmYWlsaW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBycnByaXYtPnJ4X3NrYnVmZltpXTsKKworCQlpZiAoc2tiKSB7CisJICAgICAgICAJcGNpX3VubWFwX3NpbmdsZShycnByaXYtPnBjaV9kZXYsIAorCQkJCQkgcnJwcml2LT5yeF9yaW5nW2ldLmFkZHIuYWRkcmxvLCAKKwkJCQkJIGRldi0+bXR1ICsgSElQUElfSExFTiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlycnByaXYtPnJ4X3JpbmdbaV0uc2l6ZSA9IDA7CisJCQlzZXRfcnJhZGRyKCZycnByaXYtPnJ4X3JpbmdbaV0uYWRkciwgMCk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlycnByaXYtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGVjb2RlOworfQorCisKKy8qCisgKiBBbGwgZXZlbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNsb3cgKFJYL1RYIGludHMgZG8gbm90IGdlbmVyYXRlCisgKiBldmVudHMpIGFuZCBhcmUgaGFuZGxlZCBoZXJlLCBvdXRzaWRlIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLAorICogdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBoYW5kbGVyLgorICovCitzdGF0aWMgdTMyIHJyX2hhbmRsZV9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcHJvZGlkeCwgdTMyIGVpZHgpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXUzMiB0bXA7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwl3aGlsZSAocHJvZGlkeCAhPSBlaWR4KXsKKwkJc3dpdGNoIChycnByaXYtPmV2dF9yaW5nW2VpZHhdLmNvZGUpeworCQljYXNlIEVfTklDX1VQOgorCQkJdG1wID0gcmVhZGwoJnJlZ3MtPkZ3UmV2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGaXJtd2FyZSByZXZpc2lvbiAlaS4laS4laSAiCisJCQkgICAgICAgInVwIGFuZCBydW5uaW5nXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgKHRtcCA+PiAxNiksICgodG1wID4+IDgpICYgMHhmZiksICh0bXAgJiAweGZmKSk7CisJCQlycnByaXYtPmZ3X3J1bm5pbmcgPSAxOworCQkJd3JpdGVsKFJYX1JJTkdfRU5UUklFUyAtIDEsICZyZWdzLT5JcFJ4UGkpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX0xJTktfT046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogT3B0aWNhbCBsaW5rIE9OXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9MSU5LX09GRjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcHRpY2FsIGxpbmsgT0ZGXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9SWF9JRExFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJYIGRhdGEgbm90IG1vdmluZ1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfV0FUQ0hET0c6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIHdhdGNoZG9nIGlzIGhlcmUgdG8gc2VlICIKKwkJCSAgICAgICAidXNcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0lOVEVSTl9FUlI6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBISVBQSSBJbnRlcm5hbCBOSUMgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9IT1NUX0VSUjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3Qgc29mdHdhcmUgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCS8qCisJCSAqIFRYIGV2ZW50cy4KKwkJICovCisJCWNhc2UgRV9DT05fUkVKOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvbm5lY3Rpb24gcmVqZWN0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJycHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQljYXNlIEVfQ09OX1RNT1VUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvbm5lY3Rpb24gdGltZW91dFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9ESVNDX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBISVBQSSBkaXNjb25uZWN0IGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlycnByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlicmVhazsKKwkJY2FzZSBFX0lOVF9QUlRZOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSElQUEkgSW50ZXJuYWwgUGFyaXR5IGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfSURMRToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdHRlciBpZGxlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX1RYX0xJTktfRFJPUDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMaW5rIGxvc3QgZHVyaW5nIHRyYW5zbWl0XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlycnByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfSU5WX1JORzoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgc2VuZCByaW5nIGJsb2NrXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfSU5WX0JVRjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgc2VuZCBidWZmZXIgYWRkcmVzc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1RYX0lOVl9EU0M6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGRlc2NyaXB0b3IgYWRkcmVzc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJLyoKKwkJICogUlggZXZlbnRzLgorCQkgKi8KKwkJY2FzZSBFX1JYX1JOR19PVVQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZSByaW5nIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIEVfUlhfUEFSX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIHBhcml0eSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfUlhfTExSQ19FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBMTFJDIGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9QS1RfTE5fRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgcGFja2V0IGxlbmd0aCAiCisJCQkgICAgICAgImVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfRFRBX0NLU01fRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERhdGEgY2hlY2tzdW0gZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX1NIVF9CU1Q6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5leHBlY3RlZCBzaG9ydCBidXJzdCAiCisJCQkgICAgICAgImVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfU1RBVEVfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY3YuIHN0YXRlIHRyYW5zaXRpb24iCisJCQkgICAgICAgIiBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX1VORVhQX0RBVEE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5leHBlY3RlZCBkYXRhIGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9MU1RfTE5LX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMaW5rIGxvc3QgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX0ZSTV9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRnJhbW1pbmcgRXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX0ZMR19TWU5fRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZsYWcgc3luYy4gbG9zdCBkdXJpbmciCisJCQkgICAgICAgInBhY2tldFxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX1JYX0lOVl9CVUY6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHJlY2VpdmUgYnVmZmVyICIKKwkJCSAgICAgICAiYWRkcmVzc1xuIiwgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9SWF9JTlZfRFNDOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCByZWNlaXZlIGRlc2NyaXB0b3IgIgorCQkJICAgICAgICJhZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1JOR19CTEs6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHJpbmcgYmxvY2tcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWRyb3A6CisJCQkvKiBMYWJlbCBwYWNrZXQgdG8gYmUgZHJvcHBlZC4KKwkJCSAqIEFjdHVhbCBkcm9wcGluZyBvY2N1cnMgaW4gcngKKwkJCSAqIGhhbmRsaW5nLgorCQkJICoKKwkJCSAqIFRoZSBpbmRleCBvZiBwYWNrZXQgd2UgZ2V0IHRvIGRyb3AgaXMKKwkJCSAqIHRoZSBpbmRleCBvZiB0aGUgcGFja2V0IGZvbGxvd2luZworCQkJICogdGhlIGJhZCBwYWNrZXQuIC1rYmYKKwkJCSAqLworCQkJeworCQkJCXUxNiBpbmRleCA9IHJycHJpdi0+ZXZ0X3JpbmdbZWlkeF0uaW5kZXg7CisJCQkJaW5kZXggPSAoaW5kZXggKyAoUlhfUklOR19FTlRSSUVTIC0gMSkpICUKKwkJCQkJUlhfUklOR19FTlRSSUVTOworCQkJCXJycHJpdi0+cnhfcmluZ1tpbmRleF0ubW9kZSB8PQorCQkJCQkoUEFDS0VUX0JBRCB8IFBBQ0tFVF9FTkQpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5oYW5kbGVkIGV2ZW50IDB4JTAyeFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJycHJpdi0+ZXZ0X3JpbmdbZWlkeF0uY29kZSk7CisJCX0KKwkJZWlkeCA9IChlaWR4ICsgMSkgJSBFVlRfUklOR19FTlRSSUVTOworCX0KKworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSBlaWR4OworCXdtYigpOworCXJldHVybiBlaWR4OworfQorCisKK3N0YXRpYyB2b2lkIHJ4X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcnhsaW1pdCwgdTMyIGluZGV4KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlkbyB7CisJCXN0cnVjdCByeF9kZXNjICpkZXNjOworCQl1MzIgcGt0X2xlbjsKKworCQlkZXNjID0gJihycnByaXYtPnJ4X3JpbmdbaW5kZXhdKTsKKwkJcGt0X2xlbiA9IGRlc2MtPnNpemU7CisjaWYgKERFQlVHID4gMikKKwkJcHJpbnRrKCJpbmRleCAlaSwgcnhsaW1pdCAlaVxuIiwgaW5kZXgsIHJ4bGltaXQpOworCQlwcmludGsoImxlbiAleCwgbW9kZSAleFxuIiwgcGt0X2xlbiwgZGVzYy0+bW9kZSk7CisjZW5kaWYKKwkJaWYgKCAocnJwcml2LT5yeF9yaW5nW2luZGV4XS5tb2RlICYgUEFDS0VUX0JBRCkgPT0gUEFDS0VUX0JBRCl7CisJCQlycnByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gZGVmZXI7CisJCX0KKworCQlpZiAocGt0X2xlbiA+IDApeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnJ4X3NrYjsKKworCQkJcnhfc2tiID0gcnJwcml2LT5yeF9za2J1ZmZbaW5kZXhdOworCisJCQlpZiAocGt0X2xlbiA8IFBLVF9DT1BZX1RIUkVTSE9MRCkgeworCQkJCXNrYiA9IGFsbG9jX3NrYihwa3RfbGVuLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoc2tiID09IE5VTEwpeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIHNrYiAoJWkgYnl0ZXMpLCBkZWZlcnJpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCQlycnByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJZ290byBkZWZlcjsKKwkJCQl9IGVsc2UgeworCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocnJwcml2LT5wY2lfZGV2LAorCQkJCQkJCQkgICAgZGVzYy0+YWRkci5hZGRybG8sCisJCQkJCQkJCSAgICBwa3RfbGVuLAorCQkJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkgICAgICAgcnhfc2tiLT5kYXRhLCBwa3RfbGVuKTsKKworCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocnJwcml2LT5wY2lfZGV2LAorCQkJCQkJCQkgICAgICAgZGVzYy0+YWRkci5hZGRybG8sCisJCQkJCQkJCSAgICAgICBwa3RfbGVuLAorCQkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCQkJbmV3c2tiID0gYWxsb2Nfc2tiKGRldi0+bXR1ICsgSElQUElfSExFTiwKKwkJCQkJR0ZQX0FUT01JQyk7CisJCQkJaWYgKG5ld3NrYil7CisJCQkJCWRtYV9hZGRyX3QgYWRkcjsKKworCSAgICAgICAgCQkJcGNpX3VubWFwX3NpbmdsZShycnByaXYtPnBjaV9kZXYsIAorCQkJCQkJZGVzYy0+YWRkci5hZGRybG8sIGRldi0+bXR1ICsgCisJCQkJCQlISVBQSV9ITEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQlza2IgPSByeF9za2I7CisJCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQkJcnJwcml2LT5yeF9za2J1ZmZbaW5kZXhdID0gbmV3c2tiOworCSAgICAgICAgCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgCisJCQkJCQluZXdza2ItPmRhdGEsIAorCQkJCQkJZGV2LT5tdHUgKyBISVBQSV9ITEVOLCAKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCXNldF9ycmFkZHIoJmRlc2MtPmFkZHIsIGFkZHIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygiJXM6IE91dCBvZiBtZW1vcnksIGRlZmVycmluZyAiCisJCQkJCSAgICAgICAicGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQkJCQlycnByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJZ290byBkZWZlcjsKKwkJCQl9CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBoaXBwaV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJbmV0aWZfcngoc2tiKTsJCS8qIHNlbmQgaXQgdXAgKi8KKworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXJycHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJcnJwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJZGVmZXI6CisJCWRlc2MtPm1vZGUgPSAwOworCQlkZXNjLT5zaXplID0gZGV2LT5tdHUgKyBISVBQSV9ITEVOOworCisJCWlmICgoaW5kZXggJiA3KSA9PSA3KQorCQkJd3JpdGVsKGluZGV4LCAmcmVncy0+SXBSeFBpKTsKKworCQlpbmRleCA9IChpbmRleCArIDEpICUgUlhfUklOR19FTlRSSUVTOworCX0gd2hpbGUoaW5kZXggIT0gcnhsaW1pdCk7CisKKwlycnByaXYtPmN1cl9yeCA9IGluZGV4OworCXdtYigpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXUzMiBwcm9kaWR4LCByeGluZGV4LCBlaWR4LCB0eGNzbXIsIHJ4bGltaXQsIHR4Y29uOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJaWYgKCEocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIFJSX0lOVCkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcnJwcml2LT5sb2NrKTsKKworCXByb2RpZHggPSByZWFkbCgmcmVncy0+RXZ0UHJkKTsKKwl0eGNzbXIgPSAocHJvZGlkeCA+PiA4KSAmIDB4ZmY7CisJcnhsaW1pdCA9IChwcm9kaWR4ID4+IDE2KSAmIDB4ZmY7CisJcHJvZGlkeCAmPSAweGZmOworCisjaWYgKERFQlVHID4gMikKKwlwcmludGsoIiVzOiBpbnRlcnJ1cHQsIHByb2RpZHggPSAlaSwgZWlkeCA9ICVpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHByb2RpZHgsIHJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkpOworI2VuZGlmCisJLyoKKwkgKiBPcmRlciBoZXJlIGlzIGltcG9ydGFudC4gIFdlIG11c3QgaGFuZGxlIGV2ZW50cworCSAqIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlIGluIG9yZGVyIHRvIGNhdGNoCisJICogc3VjaCB0aGluZ3MgYXMgTExSQyBlcnJvcnMsIGV0YyAta2JmCisJICovCisKKwllaWR4ID0gcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waTsKKwlpZiAocHJvZGlkeCAhPSBlaWR4KQorCQllaWR4ID0gcnJfaGFuZGxlX2V2ZW50KGRldiwgcHJvZGlkeCwgZWlkeCk7CisKKwlyeGluZGV4ID0gcnJwcml2LT5jdXJfcng7CisJaWYgKHJ4aW5kZXggIT0gcnhsaW1pdCkKKwkJcnhfaW50KGRldiwgcnhsaW1pdCwgcnhpbmRleCk7CisKKwl0eGNvbiA9IHJycHJpdi0+ZGlydHlfdHg7CisJaWYgKHR4Y3NtciAhPSB0eGNvbikgeworCQlkbyB7CisJCQkvKiBEdWUgdG8gb2NjYXRpb25hbCBmaXJtd2FyZSBUWCBwcm9kdWNlci9jb25zdW1lciBvdXQKKwkJCSAqIG9mIHN5bmMuIGVycm9yIG5lZWQgdG8gY2hlY2sgZW50cnkgaW4gcmluZyAta2JmCisJCQkgKi8KKwkJCWlmKHJycHJpdi0+dHhfc2tidWZmW3R4Y29uXSl7CisJCQkJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJCWRlc2MgPSAmKHJycHJpdi0+dHhfcmluZ1t0eGNvbl0pOworCQkJCXNrYiA9IHJycHJpdi0+dHhfc2tidWZmW3R4Y29uXTsKKworCQkJCXJycHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCXJycHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwKKwkJCQkJCSBkZXNjLT5hZGRyLmFkZHJsbywgc2tiLT5sZW4sCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworCQkJCXJycHJpdi0+dHhfc2tidWZmW3R4Y29uXSA9IE5VTEw7CisJCQkJZGVzYy0+c2l6ZSA9IDA7CisJCQkJc2V0X3JyYWRkcigmcnJwcml2LT50eF9yaW5nW3R4Y29uXS5hZGRyLCAwKTsKKwkJCQlkZXNjLT5tb2RlID0gMDsKKwkJCX0KKwkJCXR4Y29uID0gKHR4Y29uICsgMSkgJSBUWF9SSU5HX0VOVFJJRVM7CisJCX0gd2hpbGUgKHR4Y3NtciAhPSB0eGNvbik7CisJCXdtYigpOworCisJCXJycHJpdi0+ZGlydHlfdHggPSB0eGNvbjsKKwkJaWYgKHJycHJpdi0+dHhfZnVsbCAmJiBycl9pZl9idXN5KGRldikgJiYKKwkJICAgICgoKHJycHJpdi0+aW5mby0+dHhfY3RybC5waSArIDEpICUgVFhfUklOR19FTlRSSUVTKQorCQkgICAgICE9IHJycHJpdi0+ZGlydHlfdHgpKXsKKwkJCXJycHJpdi0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisKKwllaWR4IHw9ICgodHhjc21yIDw8IDgpIHwgKHJ4bGltaXQgPDwgMTYpKTsKKwl3cml0ZWwoZWlkeCwgJnJlZ3MtPkV2dENvbik7CisJd21iKCk7CisKKwlzcGluX3VubG9jaygmcnJwcml2LT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycl9yYXpfdHgoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnJwcml2LT50eF9za2J1ZmZbaV07CisKKwkJaWYgKHNrYikgeworCQkJc3RydWN0IHR4X2Rlc2MgKmRlc2MgPSAmKHJycHJpdi0+dHhfcmluZ1tpXSk7CisKKwkgICAgICAgIAlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgZGVzYy0+YWRkci5hZGRybG8sCisJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGVzYy0+c2l6ZSA9IDA7CisJCQlzZXRfcnJhZGRyKCZkZXNjLT5hZGRyLCAwKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJycHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcnJfcmF6X3J4KHN0cnVjdCBycl9wcml2YXRlICpycnByaXYsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJycHJpdi0+cnhfc2tidWZmW2ldOworCisJCWlmIChza2IpIHsKKwkJCXN0cnVjdCByeF9kZXNjICpkZXNjID0gJihycnByaXYtPnJ4X3JpbmdbaV0pOworCisJICAgICAgICAJcGNpX3VubWFwX3NpbmdsZShycnByaXYtPnBjaV9kZXYsIGRlc2MtPmFkZHIuYWRkcmxvLAorCQkJCWRldi0+bXR1ICsgSElQUElfSExFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRlc2MtPnNpemUgPSAwOworCQkJc2V0X3JyYWRkcigmZGVzYy0+YWRkciwgMCk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlycnByaXYtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpeworCQlwcmludGsoIiVzOiBSZXN0YXJ0aW5nIG5pY1xuIiwgZGV2LT5uYW1lKTsKKwkJbWVtc2V0KHJycHJpdi0+cnhfY3RybCwgMCwgMjU2ICogc2l6ZW9mKHN0cnVjdCByaW5nX2N0cmwpKTsKKwkJbWVtc2V0KHJycHJpdi0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBycl9pbmZvKSk7CisJCXdtYigpOworCisJCXJyX3Jhel90eChycnByaXYsIGRldik7CisJCXJyX3Jhel9yeChycnByaXYsIGRldik7CisKKwkJaWYgKHJyX2luaXQxKGRldikpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorCXJycHJpdi0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCg1KkhaKTsKKwlhZGRfdGltZXIoJnJycHJpdi0+dGltZXIpOworfQorCisKK3N0YXRpYyBpbnQgcnJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcnJwcml2LT5wY2lfZGV2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJaW50IGVjb2RlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJaWYgKHJycHJpdi0+ZndfcmV2IDwgMHgwMDAyMDAwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJ5aW5nIHRvIGNvbmZpZ3VyZSBkZXZpY2Ugd2l0aCAiCisJCSAgICAgICAib2Jzb2xldGUgZmlybXdhcmVcbiIsIGRldi0+bmFtZSk7CisJCWVjb2RlID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCXJycHJpdi0+cnhfY3RybCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCSAgICAgICAyNTYgKiBzaXplb2Yoc3RydWN0IHJpbmdfY3RybCksCisJCQkJCSAgICAgICAmZG1hX2FkZHIpOworCWlmICghcnJwcml2LT5yeF9jdHJsKSB7CisJCWVjb2RlID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJcnJwcml2LT5yeF9jdHJsX2RtYSA9IGRtYV9hZGRyOworCW1lbXNldChycnByaXYtPnJ4X2N0cmwsIDAsIDI1NipzaXplb2Yoc3RydWN0IHJpbmdfY3RybCkpOworCisJcnJwcml2LT5pbmZvID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBycl9pbmZvKSwKKwkJCQkJICAgICZkbWFfYWRkcik7CisJaWYgKCFycnByaXYtPmluZm8pIHsKKwkJZWNvZGUgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwlycnByaXYtPmluZm9fZG1hID0gZG1hX2FkZHI7CisJbWVtc2V0KHJycHJpdi0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBycl9pbmZvKSk7CisJd21iKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAmcmVncy0+SG9zdEN0cmwpOworCXJlYWRsKCZyZWdzLT5Ib3N0Q3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJyX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVxdWVzdGVkIElSUSAlZCBpcyBidXN5XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCWVjb2RlID0gLUVBR0FJTjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKGVjb2RlID0gcnJfaW5pdDEoZGV2KSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIHN3aXRjaCB0byBjaGVjayBmb3IgbGluayBiZWF0IGFuZCBwZXJoYXBzIHN3aXRjaAorCSAgIHRvIGFuIGFsdGVybmF0ZSBtZWRpYSB0eXBlLiAqLworCWluaXRfdGltZXIoJnJycHJpdi0+dGltZXIpOworCXJycHJpdi0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCg1KkhaKTsgICAgICAgICAgIC8qIDUgc2VjLiB3YXRjaGRvZyAqLworCXJycHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlycnByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJnJyX3RpbWVyOyAgICAgICAgICAgICAgIC8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJnJycHJpdi0+dGltZXIpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiBlY29kZTsKKworIGVycm9yOgorCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsICZyZWdzLT5Ib3N0Q3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocnJwcml2LT5pbmZvKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBycl9pbmZvKSwgcnJwcml2LT5pbmZvLAorCQkJCSAgICBycnByaXYtPmluZm9fZG1hKTsKKwkJcnJwcml2LT5pbmZvID0gTlVMTDsKKwl9CisJaWYgKHJycHJpdi0+cnhfY3RybCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgcmluZ19jdHJsKSwKKwkJCQkgICAgcnJwcml2LT5yeF9jdHJsLCBycnByaXYtPnJ4X2N0cmxfZG1hKTsKKwkJcnJwcml2LT5yeF9jdHJsID0gTlVMTDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJcmV0dXJuIGVjb2RlOworfQorCisKK3N0YXRpYyB2b2lkIHJyX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTMyIGluZGV4LCBjb25zOworCXNob3J0IGk7CisJaW50IGxlbjsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCXByaW50aygiJXM6IGR1bXBpbmcgTklDIFRYIHJpbmdzXG4iLCBkZXYtPm5hbWUpOworCisJcHJpbnRrKCJSeFByZCAlMDh4LCBUeFByZCAlMDJ4LCBFdnRQcmQgJTA4eCwgVHhQaSAlMDJ4LCBUeEN0cmxQaSAlMDJ4XG4iLAorCSAgICAgICByZWFkbCgmcmVncy0+UnhQcmQpLCByZWFkbCgmcmVncy0+VHhQcmQpLAorCSAgICAgICByZWFkbCgmcmVncy0+RXZ0UHJkKSwgcmVhZGwoJnJlZ3MtPlR4UGkpLAorCSAgICAgICBycnByaXYtPmluZm8tPnR4X2N0cmwucGkpOworCisJcHJpbnRrKCJFcnJvciBjb2RlIDB4JXhcbiIsIHJlYWRsKCZyZWdzLT5GYWlsMSkpOworCisJaW5kZXggPSAoKChyZWFkbCgmcmVncy0+RXZ0UHJkKSA+PiA4KSAmIDB4ZmYgKSAtIDEpICUgRVZUX1JJTkdfRU5UUklFUzsKKwljb25zID0gcnJwcml2LT5kaXJ0eV90eDsKKwlwcmludGsoIlRYIHJpbmcgaW5kZXggJWksIFRYIGNvbnN1bWVyICVpXG4iLAorCSAgICAgICBpbmRleCwgY29ucyk7CisKKwlpZiAocnJwcml2LT50eF9za2J1ZmZbaW5kZXhdKXsKKwkJbGVuID0gbWluX3QoaW50LCAweDgwLCBycnByaXYtPnR4X3NrYnVmZltpbmRleF0tPmxlbik7CisJCXByaW50aygic2tidWZmIGZvciBpbmRleCAlaSBpcyB2YWxpZCAtIGR1bXBpbmcgZGF0YSAoMHgleCBieXRlcyAtIERNQSBsZW4gMHgleClcbiIsIGluZGV4LCBsZW4sIHJycHJpdi0+dHhfcmluZ1tpbmRleF0uc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKyl7CisJCQlpZiAoIShpICYgNykpCisJCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKCIlMDJ4ICIsICh1bnNpZ25lZCBjaGFyKSBycnByaXYtPnR4X3NrYnVmZltpbmRleF0tPmRhdGFbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAocnJwcml2LT50eF9za2J1ZmZbY29uc10peworCQlsZW4gPSBtaW5fdChpbnQsIDB4ODAsIHJycHJpdi0+dHhfc2tidWZmW2NvbnNdLT5sZW4pOworCQlwcmludGsoInNrYnVmZiBmb3IgY29ucyAlaSBpcyB2YWxpZCAtIGR1bXBpbmcgZGF0YSAoMHgleCBieXRlcyAtIHNrYnVmZiBsZW4gMHgleClcbiIsIGNvbnMsIGxlbiwgcnJwcml2LT50eF9za2J1ZmZbY29uc10tPmxlbik7CisJCXByaW50aygibW9kZSAweCV4LCBzaXplIDB4JXgsXG4gcGh5cyAlMDhMeCwgc2tidWZmLWFkZHIgJTA4bHgsIHRydWVzaXplIDB4JXhcbiIsCisJCSAgICAgICBycnByaXYtPnR4X3JpbmdbY29uc10ubW9kZSwKKwkJICAgICAgIHJycHJpdi0+dHhfcmluZ1tjb25zXS5zaXplLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnJwcml2LT50eF9yaW5nW2NvbnNdLmFkZHIuYWRkcmxvLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcnJwcml2LT50eF9za2J1ZmZbY29uc10tPmRhdGEsCisJCSAgICAgICAodW5zaWduZWQgaW50KXJycHJpdi0+dHhfc2tidWZmW2NvbnNdLT50cnVlc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKyl7CisJCQlpZiAoIShpICYgNykpCisJCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKCIlMDJ4ICIsICh1bnNpZ25lZCBjaGFyKXJycHJpdi0+dHhfcmluZ1tjb25zXS5zaXplKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCisJcHJpbnRrKCJkdW1waW5nIFRYIHJpbmcgaW5mbzpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX0VOVFJJRVM7IGkrKykKKwkJcHJpbnRrKCJtb2RlIDB4JXgsIHNpemUgMHgleCwgcGh5cy1hZGRyICUwOEx4XG4iLAorCQkgICAgICAgcnJwcml2LT50eF9yaW5nW2ldLm1vZGUsCisJCSAgICAgICBycnByaXYtPnR4X3JpbmdbaV0uc2l6ZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJycHJpdi0+dHhfcmluZ1tpXS5hZGRyLmFkZHJsbyk7CisKK30KKworCitzdGF0aWMgaW50IHJyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRtcDsKKwlzaG9ydCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJLyoKKwkgKiBMb2NrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNsZWFuaW5nIHVwIHdoaWxlIGFub3RoZXIgQ1BVCisJICogaXMgaGFuZGxpbmcgaW50ZXJydXB0cy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwl0bXAgPSByZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCWlmICh0bXAgJiBOSUNfSEFMVEVEKXsKKwkJcHJpbnRrKCIlczogTklDIGFscmVhZHkgaGFsdGVkXG4iLCBkZXYtPm5hbWUpOworCQlycl9kdW1wKGRldik7CisJfWVsc2V7CisJCXRtcCB8PSBIQUxUX05JQyB8IFJSX0NMRUFSX0lOVDsKKwkJd3JpdGVsKHRtcCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsKKwl9CisKKwlycnByaXYtPmZ3X3J1bm5pbmcgPSAwOworCisJZGVsX3RpbWVyX3N5bmMoJnJycHJpdi0+dGltZXIpOworCisJd3JpdGVsKDAsICZyZWdzLT5UeFBpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPklwUnhQaSk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5FdnRQcmQpOworCisJZm9yIChpID0gMDsgaSA8IENNRF9SSU5HX0VOVFJJRVM7IGkrKykKKwkJd3JpdGVsKDAsICZyZWdzLT5DbWRSaW5nW2ldKTsKKworCXJycHJpdi0+aW5mby0+dHhfY3RybC5lbnRyaWVzID0gMDsKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLnBpID0gMDsKKwlycnByaXYtPmluZm8tPmV2dF9jdHJsLnBpID0gMDsKKwlycnByaXYtPnJ4X2N0cmxbNF0uZW50cmllcyA9IDA7CisKKwlycl9yYXpfdHgocnJwcml2LCBkZXYpOworCXJyX3Jhel9yeChycnByaXYsIGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHJycHJpdi0+cGNpX2RldiwgMjU2ICogc2l6ZW9mKHN0cnVjdCByaW5nX2N0cmwpLAorCQkJICAgIHJycHJpdi0+cnhfY3RybCwgcnJwcml2LT5yeF9jdHJsX2RtYSk7CisJcnJwcml2LT5yeF9jdHJsID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocnJwcml2LT5wY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJyX2luZm8pLAorCQkJICAgIHJycHJpdi0+aW5mbywgcnJwcml2LT5pbmZvX2RtYSk7CisJcnJwcml2LT5pbmZvID0gTlVMTDsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBycl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVncyA9IHJycHJpdi0+cmVnczsKKwlzdHJ1Y3QgcmluZ19jdHJsICp0eGN0cmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW5kZXgsIGxlbiA9IHNrYi0+bGVuOworCXUzMiAqaWZpZWxkOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCisJaWYgKHJlYWRsKCZyZWdzLT5Nb2RlKSAmIEZBVEFMX0VSUikKKwkJcHJpbnRrKCJlcnJvciBjb2RlcyBGYWlsMSAlMDJ4LCBGYWlsMiAlMDJ4XG4iLAorCQkgICAgICAgcmVhZGwoJnJlZ3MtPkZhaWwxKSwgcmVhZGwoJnJlZ3MtPkZhaWwyKSk7CisKKwkvKgorCSAqIFdlIHByb2JhYmx5IG5lZWQgdG8gZGVhbCB3aXRoIHRidXN5IGhlcmUgdG8gcHJldmVudCBvdmVycnVucy4KKwkgKi8KKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDgpeworCQlwcmludGsoImluY29taW5nIHNrYiB0b28gc21hbGwgLSByZWFsbG9jYXRpbmdcbiIpOworCQlpZiAoIShuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyA4KSkpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJc2tiX3Jlc2VydmUobmV3X3NrYiwgOCk7CisJCXNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKwkJbWVtY3B5KG5ld19za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCX0KKworCWlmaWVsZCA9ICh1MzIgKilza2JfcHVzaChza2IsIDgpOworCisJaWZpZWxkWzBdID0gMDsKKwlpZmllbGRbMV0gPSBza2ItPnByaXZhdGUuaWZpZWxkOworCisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRoZSBsb2NrIGJlZm9yZSB3ZSBhcmUgYWN0dWFsbHkgZ29pbmcgdG8gc3RhcnQKKwkgKiBmaWRkbGluZyB3aXRoIHRoZSBjb250cm9sIGJsb2Nrcy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwl0eGN0cmwgPSAmcnJwcml2LT5pbmZvLT50eF9jdHJsOworCisJaW5kZXggPSB0eGN0cmwtPnBpOworCisJcnJwcml2LT50eF9za2J1ZmZbaW5kZXhdID0gc2tiOworCXNldF9ycmFkZHIoJnJycHJpdi0+dHhfcmluZ1tpbmRleF0uYWRkciwgcGNpX21hcF9zaW5nbGUoCisJCXJycHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLCBsZW4gKyA4LCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJcnJwcml2LT50eF9yaW5nW2luZGV4XS5zaXplID0gbGVuICsgODsgLyogaW5jbHVkZSBJRklFTEQgKi8KKwlycnByaXYtPnR4X3JpbmdbaW5kZXhdLm1vZGUgPSBQQUNLRVRfU1RBUlQgfCBQQUNLRVRfRU5EOworCXR4Y3RybC0+cGkgPSAoaW5kZXggKyAxKSAlIFRYX1JJTkdfRU5UUklFUzsKKwl3bWIoKTsKKwl3cml0ZWwodHhjdHJsLT5waSwgJnJlZ3MtPlR4UGkpOworCisJaWYgKHR4Y3RybC0+cGkgPT0gcnJwcml2LT5kaXJ0eV90eCl7CisJCXJycHJpdi0+dHhfZnVsbCA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4oJnJycHJpdi0+c3RhdHMpOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBmaXJtd2FyZSBvdXQgb2YgdGhlIEVFUFJPTSBhbmQgcHV0IGl0IGludG8gdGhlIFNSQU0KKyAqIChvciBmcm9tIHVzZXIgc3BhY2UgLSBsYXRlcikKKyAqCisgKiBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB0aGUgTklDIHRvIGJlIGhhbHRlZCBhbmQgaXMgcGVyZm9ybWVkIHdpdGgKKyAqIGludGVycnVwdHMgZGlzYWJsZWQgYW5kIHdpdGggdGhlIHNwaW5sb2NrIGhvbGQuCisgKi8KK3N0YXRpYyBpbnQgcnJfbG9hZF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBsb25nIGVwdHIsIHNlZ3B0cjsKKwlpbnQgaSwgajsKKwl1MzIgbG9jYWxjdHJsLCBzcHRyLCBsZW4sIHRtcDsKKwl1MzIgcDJsZW4sIHAyc2l6ZSwgbnJfc2VnLCByZXZpc2lvbiwgaW8sIHNyYW1fc2l6ZTsKKwlzdHJ1Y3QgZWVwcm9tICpodyA9IE5VTEw7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkgJiBOSUNfSEFMVEVEKSl7CisJCXByaW50aygiJXM6IFRyeWluZyB0byBsb2FkIGZpcm13YXJlIHRvIGEgcnVubmluZyBOSUMuXG4iLCAKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbG9jYWxjdHJsID0gcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOworCisJd3JpdGVsKDAsICZyZWdzLT5FdnRQcmQpOworCXdyaXRlbCgwLCAmcmVncy0+UnhQcmQpOworCXdyaXRlbCgwLCAmcmVncy0+VHhQcmQpOworCisJLyoKKwkgKiBGaXJzdCB3aXBlIHRoZSBlbnRpcmUgU1JBTSwgb3RoZXJ3aXNlIHdlIG1pZ2h0IHJ1biBpbnRvIGFsbAorCSAqIGtpbmRzIG9mIHRyb3VibGUgLi4uIHNpZ2gsIHRoaXMgdG9vayBhbG1vc3QgYWxsIGFmdGVybm9vbgorCSAqIHRvIHRyYWNrIGRvd24gOy0oCisJICovCisJaW8gPSByZWFkbCgmcmVncy0+RXh0SW8pOworCXdyaXRlbCgwLCAmcmVncy0+RXh0SW8pOworCXNyYW1fc2l6ZSA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKTgpOworCisJZm9yIChpID0gMjAwOyBpIDwgc3JhbV9zaXplIC8gNDsgaSsrKXsKKwkJd3JpdGVsKGkgKiA0LCAmcmVncy0+V2luQmFzZSk7CisJCW1iKCk7CisJCXdyaXRlbCgwLCAmcmVncy0+V2luRGF0YSk7CisJCW1iKCk7CisJfQorCXdyaXRlbChpbywgJnJlZ3MtPkV4dElvKTsKKwltYigpOworCisJZXB0ciA9ICh1bnNpZ25lZCBsb25nKXJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LAorCQkJCQkgICAgICAgJmh3LT5ybmNkX2luZm8uQWRkclJ1bkNvZGVTZWdzKTsKKwllcHRyID0gKChlcHRyICYgMHgxZmZmZmYpID4+IDMpOworCisJcDJsZW4gPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKikoMHg4Myo0KSk7CisJcDJsZW4gPSAocDJsZW4gPDwgMik7CisJcDJzaXplID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopKDB4ODQqNCkpOworCXAyc2l6ZSA9ICgocDJzaXplICYgMHgxZmZmZmYpID4+IDMpOworCisJaWYgKChlcHRyIDwgcDJzaXplKSB8fCAoZXB0ciA+IChwMnNpemUgKyBwMmxlbikpKXsKKwkJcHJpbnRrKCIlczogZXB0ciBpcyBpbnZhbGlkXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXZpc2lvbiA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAmaHctPm1hbmYuSGVhZGVyRm10KTsKKworCWlmIChyZXZpc2lvbiAhPSAxKXsKKwkJcHJpbnRrKCIlczogaW52YWxpZCBmaXJtd2FyZSBmb3JtYXQgKCVpKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmV2aXNpb24pOworCQlnb3RvIG91dDsKKwl9CisKKwlucl9zZWcgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwllcHRyICs9NDsKKyNpZiAoREVCVUcgPiAxKQorCXByaW50aygiJXM6IG5yX3NlZyAlaVxuIiwgZGV2LT5uYW1lLCBucl9zZWcpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnOyBpKyspeworCQlzcHRyID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopZXB0cik7CisJCWVwdHIgKz0gNDsKKwkJbGVuID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopZXB0cik7CisJCWVwdHIgKz0gNDsKKwkJc2VncHRyID0gKHVuc2lnbmVkIGxvbmcpcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopZXB0cik7CisJCXNlZ3B0ciA9ICgoc2VncHRyICYgMHgxZmZmZmYpID4+IDMpOworCQllcHRyICs9IDQ7CisjaWYgKERFQlVHID4gMSkKKwkJcHJpbnRrKCIlczogc2VnbWVudCAlaSwgc3JhbSBhZGRyZXNzICUwNngsIGxlbmd0aCAlMDR4LCBzZWdwdHIgJTA2eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaSwgc3B0ciwgbGVuLCBzZWdwdHIpOworI2VuZGlmCisJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKyl7CisJCQl0bXAgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKilzZWdwdHIpOworCQkJd3JpdGVsKHNwdHIsICZyZWdzLT5XaW5CYXNlKTsKKwkJCW1iKCk7CisJCQl3cml0ZWwodG1wLCAmcmVncy0+V2luRGF0YSk7CisJCQltYigpOworCQkJc2VncHRyICs9IDQ7CisJCQlzcHRyICs9IDQ7CisJCX0KKwl9CisKK291dDoKKwl3cml0ZWwobG9jYWxjdHJsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXVuc2lnbmVkIGNoYXIgKmltYWdlLCAqb2xkaW1hZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyb3IgPSAtRU9QTk9UU1VQUDsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2goY21kKXsKKwljYXNlIFNJT0NSUkdGVzoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKXsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQlpbWFnZSA9IGttYWxsb2MoRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIWltYWdlKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJICAgICAgICJmb3IgRUVQUk9NIGltYWdlXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCisJCWlmIChycnByaXYtPmZ3X3J1bm5pbmcpeworCQkJcHJpbnRrKCIlczogRmlybXdhcmUgYWxyZWFkeSBydW5uaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJZXJyb3IgPSAtRVBFUk07CisJCQlnb3RvIGdmX291dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJaSA9IHJyX3JlYWRfZWVwcm9tKHJycHJpdiwgMCwgaW1hZ2UsIEVFUFJPTV9CWVRFUyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQlpZiAoaSAhPSBFRVBST01fQllURVMpeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgcmVhZGluZyBFRVBST01cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJCWdvdG8gZ2Zfb3V0OworCQl9CisJCWVycm9yID0gY29weV90b191c2VyKHJxLT5pZnJfZGF0YSwgaW1hZ2UsIEVFUFJPTV9CWVRFUyk7CisJCWlmIChlcnJvcikKKwkJCWVycm9yID0gLUVGQVVMVDsKKwlnZl9vdXQ6CisJCWtmcmVlKGltYWdlKTsKKwkJcmV0dXJuIGVycm9yOworCQkKKwljYXNlIFNJT0NSUlBGVzoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKXsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQlpbWFnZSA9IGttYWxsb2MoRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlvbGRpbWFnZSA9IGttYWxsb2MoRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIWltYWdlIHx8ICFvbGRpbWFnZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkgICAgICAgImZvciBFRVBST00gaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIHdmX291dDsKKwkJfQorCisJCWVycm9yID0gY29weV9mcm9tX3VzZXIoaW1hZ2UsIHJxLT5pZnJfZGF0YSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKSB7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIHdmX291dDsKKwkJfQorCisJCWlmIChycnByaXYtPmZ3X3J1bm5pbmcpeworCQkJcHJpbnRrKCIlczogRmlybXdhcmUgYWxyZWFkeSBydW5uaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJZXJyb3IgPSAtRVBFUk07CisJCQlnb3RvIHdmX291dDsKKwkJfQorCisJCXByaW50aygiJXM6IFVwZGF0aW5nIEVFUFJPTSBmaXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCWVycm9yID0gd3JpdGVfZWVwcm9tKHJycHJpdiwgMCwgaW1hZ2UsIEVFUFJPTV9CWVRFUyk7CisJCWlmIChlcnJvcikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdyaXRpbmcgRUVQUk9NXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisKKwkJaSA9IHJyX3JlYWRfZWVwcm9tKHJycHJpdiwgMCwgb2xkaW1hZ2UsIEVFUFJPTV9CWVRFUyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJCWlmIChpICE9IEVFUFJPTV9CWVRFUykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHJlYWRpbmcgYmFjayBFRVBST00gIgorCQkJICAgICAgICJpbWFnZVxuIiwgZGV2LT5uYW1lKTsKKworCQllcnJvciA9IG1lbWNtcChpbWFnZSwgb2xkaW1hZ2UsIEVFUFJPTV9CWVRFUyk7CisJCWlmIChlcnJvcil7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB2ZXJpZnlpbmcgRUVQUk9NIGltYWdlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCX0KKwl3Zl9vdXQ6CisJCWlmIChvbGRpbWFnZSkKKwkJCWtmcmVlKG9sZGltYWdlKTsKKwkJaWYgKGltYWdlKQorCQkJa2ZyZWUoaW1hZ2UpOworCQlyZXR1cm4gZXJyb3I7CisJCQorCWNhc2UgU0lPQ1JSSUQ6CisJCXJldHVybiBwdXRfdXNlcigweDUyNTIzMDMyLCAoaW50IF9fdXNlciAqKXJxLT5pZnJfZGF0YSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGVycm9yOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJyX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfRVNTRU5USUFMLCBQQ0lfREVWSUNFX0lEX0VTU0VOVElBTF9ST0FEUlVOTkVSLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnJfZHJpdmVyID0geworCS5uYW1lCQk9ICJycnVubmVyIiwKKwkuaWRfdGFibGUJPSBycl9wY2lfdGJsLAorCS5wcm9iZQkJPSBycl9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJyX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZycl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJyX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkuLi8uLi9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1waXBlIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1tNDg2IC1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWp1bXBzPTIgLW1hbGlnbi1mdW5jdGlvbnM9MiAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1pbmNsdWRlIC4uLy4uL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAtYyBycnVubmVyLmMiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3JydW5uZXIuaCBiL2RyaXZlcnMvbmV0L3JydW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJhYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5oCkBAIC0wLDAgKzEsODQ4IEBACisjaWZuZGVmIF9SUlVOTkVSX0hfCisjZGVmaW5lIF9SUlVOTkVSX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2lmICgoQklUU19QRVJfTE9ORyAhPSAzMikgJiYgKEJJVFNfUEVSX0xPTkcgIT0gNjQpKQorI2Vycm9yICJCSVRTX1BFUl9MT05HIG5vdCBkZWZpbmVkIG9yIG5vdCB2YWxpZCIKKyNlbmRpZgorCisKK3N0cnVjdCBycl9yZWdzIHsKKworCXUzMglwYWQwWzE2XTsKKworCXUzMglIb3N0Q3RybDsKKwl1MzIJTG9jYWxDdHJsOworCXUzMglQYzsKKwl1MzIJQnJrUHQ7CisKKy8qIFRpbWVyIGluY3JlbWVudHMgZXZlcnkgMC45NyBtaWNyby1zZWNvbmRzICh1bnNpZ25lZCBpbnQpICovCisJdTMyCVRpbWVyX0hpOworCXUzMglUaW1lcjsKKwl1MzIJVGltZXJSZWY7CisJdTMyCVBjaVN0YXRlOworCisJdTMyCUV2ZW50OworCXUzMglNYkV2ZW50OworCisJdTMyCVdpbkJhc2U7CisJdTMyCVdpbkRhdGE7CisJdTMyCVJYX3N0YXRlOworCXUzMglUWF9zdGF0ZTsKKworCXUzMglPdmVyaGVhZDsKKwl1MzIJRXh0SW87CisKKwl1MzIJRG1hV3JpdGVIb3N0SGk7CisJdTMyCURtYVdyaXRlSG9zdExvOworCisJdTMyCXBhZDFbMl07CisKKwl1MzIJRG1hUmVhZEhvc3RIaTsKKwl1MzIJRG1hUmVhZEhvc3RMbzsKKworCXUzMglwYWQyOworCisJdTMyCURtYVJlYWRMZW47CisJdTMyCURtYVdyaXRlU3RhdGU7CisKKwl1MzIJRG1hV3JpdGVMY2w7CisJdTMyCURtYVdyaXRlSVBjaGVja3N1bTsKKwl1MzIJRG1hV3JpdGVMZW47CisJdTMyCURtYVJlYWRTdGF0ZTsKKwl1MzIJRG1hUmVhZExjbDsKKwl1MzIJRG1hUmVhZElQY2hlY2tzdW07CisJdTMyCXBhZDM7CisKKwl1MzIJUnhCYXNlOworCXUzMglSeFByZDsKKwl1MzIJUnhDb247CisKKwl1MzIJcGFkNDsKKworCXUzMglUeEJhc2U7CisJdTMyCVR4UHJkOworCXUzMglUeENvbjsKKworCXUzMglwYWQ1OworCisJdTMyCVJ4SW5kUHJvOworCXUzMglSeEluZENvbjsKKwl1MzIJUnhJbmRSZWY7CisKKwl1MzIJcGFkNjsKKworCXUzMglUeEluZFBybzsKKwl1MzIJVHhJbmRDb247CisJdTMyCVR4SW5kUmVmOworCisJdTMyCXBhZDdbMTddOworCisJdTMyCURyQ21uZFBybzsKKwl1MzIJRHJDbW5kQ29uOworCXUzMglEckNtbmRSZWY7CisKKwl1MzIJcGFkODsKKworCXUzMglEd0NtbmRQcm87CisJdTMyCUR3Q21uZENvbjsKKwl1MzIJRHdDbW5kUmVmOworCisJdTMyCUFzc2lzdFN0YXRlOworCisJdTMyCURyRGF0YVBybzsKKwl1MzIJRHJEYXRhQ29uOworCXUzMglEckRhdGFSZWY7CisKKwl1MzIJcGFkOTsKKworCXUzMglEd0RhdGFQcm87CisJdTMyCUR3RGF0YUNvbjsKKwl1MzIJRHdEYXRhUmVmOworCisJdTMyCXBhZDEwWzMzXTsKKworCXUzMglFdnRDb247CisKKwl1MzIJcGFkMTFbNV07CisKKwl1MzIJVHhQaTsKKwl1MzIJSXBSeFBpOworCisJdTMyCXBhZDExYVs4XTsKKworCXUzMglDbWRSaW5nWzE2XTsKKworLyogVGhlIFVMQSBpcyBpbiB0d28gcmVnaXN0ZXJzIHRoZSBoaWdoIG9yZGVyIHR3byBieXRlcyBvZiB0aGUgZmlyc3QKKyAqIHdvcmQgY29udGFpbiB0aGUgUnVuQ29kZSBmZWF0dXJlcy4KKyAqIHVsYTAJCXJlcwlyZXMJYnl0ZTAJYnl0ZTEKKyAqIHVsYTEJCWJ5dGUyCWJ5dGUzCWJ5dGU0CWJ5dGU1CisgKi8KKwl1MzIJVWxhMDsKKwl1MzIJVWxhMTsKKworCXUzMglSeFJpbmdIaTsKKwl1MzIJUnhSaW5nTG87CisKKwl1MzIJSW5mb1B0ckhpOworCXUzMglJbmZvUHRyTG87CisKKwl1MzIJTW9kZTsKKworCXUzMglDb25SZXRyeTsKKwl1MzIJQ29uUmV0cnlUbXI7CisKKwl1MzIJQ29uVG1vdXQ7CisJdTMyCUN0YXRUbXI7CisKKwl1MzIJTWF4UnhSbmc7CisKKwl1MzIJSW50clRtcjsKKwl1MzIJVHhEYXRhTXZUaW1lb3V0OworCXUzMglSeERhdGFNdlRpbWVvdXQ7CisKKwl1MzIJRXZ0UHJkOworCXUzMglUcmFjZUlkeDsKKworCXUzMglGYWlsMTsKKwl1MzIJRmFpbDI7CisKKwl1MzIJRHJ2UHJtOworCisJdTMyCUZpbHRlckxBOworCisJdTMyCUZ3UmV2OworCXUzMglGd1JlczE7CisJdTMyCUZ3UmVzMjsKKwl1MzIJRndSZXMzOworCisJdTMyCVdyaXRlRG1hVGhyZXNoOworCXUzMglSZWFkRG1hVGhyZXNoOworCisJdTMyCXBhZDEyWzMyNV07CisJdTMyCVdpbmRvd1s1MTJdOworfTsKKworLyoKKyAqIEhvc3QgY29udHJvbCByZWdpc3RlciBiaXRzLgorICovCisJCisjZGVmaW5lIFJSX0lOVAkJMHgwMQorI2RlZmluZSBSUl9DTEVBUl9JTlQJMHgwMgorI2RlZmluZSBOT19TV0FQCQkweDA0MDAwMDA0CisjZGVmaW5lIE5PX1NXQVAxCTB4MDAwMDAwMDQKKyNkZWZpbmUgUENJX1JFU0VUX05JQwkweDA4CisjZGVmaW5lIEhBTFRfTklDCTB4MTAKKyNkZWZpbmUgU1NURVBfTklDCTB4MjAKKyNkZWZpbmUgTUVNX1JFQURfTVVMVEkJMHg0MAorI2RlZmluZSBOSUNfSEFMVEVECTB4MTAwCisjZGVmaW5lIEhBTFRfSU5TVAkweDIwMAorI2RlZmluZSBQQVJJVFlfRVJSCTB4NDAwCisjZGVmaW5lIElOVkFMSURfSU5TVF9CCTB4ODAwCisjZGVmaW5lIFJSX1JFVl8yCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlJfUkVWX01BU0sJMHhmMDAwMDAwMAorCisvKgorICogTG9jYWwgY29udHJvbCByZWdpc3RlciBiaXRzLgorICovCisKKyNkZWZpbmUgSU5UQV9TVEFURQkJMHgwMQorI2RlZmluZSBDTEVBUl9JTlRBCQkweDAyCisjZGVmaW5lIEZBU1RfRUVQUk9NX0FDQ0VTUwkweDA4CisjZGVmaW5lIEVOQUJMRV9FWFRSQV9TUkFNCTB4MTAwCisjZGVmaW5lIEVOQUJMRV9FWFRSQV9ERVNDCTB4MjAwCisjZGVmaW5lIEVOQUJMRV9QQVJJVFkJCTB4NDAwCisjZGVmaW5lIEZPUkNFX0RNQV9QQVJJVFlfRVJST1IJMHg4MDAKKyNkZWZpbmUgRU5BQkxFX0VFUFJPTV9XUklURQkweDEwMDAKKyNkZWZpbmUgRU5BQkxFX0RBVEFfQ0FDSEUJMHgyMDAwCisjZGVmaW5lIFNSQU1fTE9fUEFSSVRZX0VSUgkweDQwMDAKKyNkZWZpbmUgU1JBTV9ISV9QQVJJVFlfRVJSCTB4ODAwMAorCisvKgorICogUENJIHN0YXRlIGJpdHMuCisgKi8KKworI2RlZmluZSBGT1JDRV9QQ0lfUkVTRVQJCTB4MDEKKyNkZWZpbmUgUFJPVklERV9MRU5HVEgJCTB4MDIKKyNkZWZpbmUgTUFTS19ETUFfUkVBRF9NQVgJMHgxQworI2RlZmluZSBSQlVSU1RfRElTQUJMRQkJMHgwMAorI2RlZmluZSBSQlVSU1RfNAkJMHgwNAorI2RlZmluZSBSQlVSU1RfMTYJCTB4MDgKKyNkZWZpbmUgUkJVUlNUXzMyCQkweDBDCisjZGVmaW5lIFJCVVJTVF82NAkJMHgxMAorI2RlZmluZSBSQlVSU1RfMTI4CQkweDE0CisjZGVmaW5lIFJCVVJTVF8yNTYJCTB4MTgKKyNkZWZpbmUgUkJVUlNUXzEwMjQJCTB4MUMKKyNkZWZpbmUgTUFTS19ETUFfV1JJVEVfTUFYCTB4RTAKKyNkZWZpbmUgV0JVUlNUX0RJU0FCTEUJCTB4MDAKKyNkZWZpbmUgV0JVUlNUXzQJCTB4MjAKKyNkZWZpbmUgV0JVUlNUXzE2CQkweDQwCisjZGVmaW5lIFdCVVJTVF8zMgkJMHg2MAorI2RlZmluZSBXQlVSU1RfNjQJCTB4ODAKKyNkZWZpbmUgV0JVUlNUXzEyOAkJMHhhMAorI2RlZmluZSBXQlVSU1RfMjU2CQkweGMwCisjZGVmaW5lIFdCVVJTVF8xMDI0CQkweGUwCisjZGVmaW5lIE1BU0tfTUlOX0RNQQkJMHhGRjAwCisjZGVmaW5lIEZJRk9fUkVUUllfRU5BQkxFCTB4MTAwMDAKKworLyoKKyAqIEV2ZW50IHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBETUFfV1JJVEVfRE9ORQkJMHgxMDAwMAorI2RlZmluZSBETUFfUkVBRF9ET05FCQkweDIwMDAwCisjZGVmaW5lIERNQV9XUklURV9FUlIJCTB4NDAwMDAKKyNkZWZpbmUgRE1BX1JFQURfRVJSCQkweDgwMDAwCisKKy8qCisgKiBSZWNlaXZlIHN0YXRlCisgKgorICogUm9hZFJ1bm5lciBISVBQSSBSZWNlaXZlIFN0YXRlIFJlZ2lzdGVyIGNvbnRyb2xzIGFuZCBtb25pdG9ycyB0aGUgCisgKiBISVBQSSByZWNlaXZlIGludGVyZmFjZSBpbiB0aGUgTklDLiBMb29rIGF0IGVyciBiaXRzIHdoZW4gYSBISVBQSQorICogcmVjZWl2ZSBFcnJvciBFdmVudCBvY2N1cnMuIAorICovCisKKyNkZWZpbmUgRU5BQkxFX05FV19DT04JCTB4MDEKKyNkZWZpbmUgUkVTRVRfUkVDVgkJMHgwMgorI2RlZmluZSBSRUNWX0FMTAkJMHgwMAorI2RlZmluZSBSRUNWXzFLCQkJMHgyMAorI2RlZmluZSBSRUNWXzJLCQkJMHg0MAorI2RlZmluZSBSRUNWXzRLCQkJMHg2MAorI2RlZmluZSBSRUNWXzhLCQkJMHg4MAorI2RlZmluZSBSRUNWXzE2SwkJMHhhMAorI2RlZmluZSBSRUNWXzMySwkJMHhjMAorI2RlZmluZSBSRUNWXzY0SwkJMHhlMAorCisvKgorICogVHJhbnNtaXQgc3RhdHVzLgorICovCisKKyNkZWZpbmUgRU5BX1hNSVQJCTB4MDEKKyNkZWZpbmUgUEVSTV9DT04JCTB4MDIKKworLyoKKyAqIERNQSB3cml0ZSBzdGF0ZQorICovCisKKyNkZWZpbmUgUkVTRVRfRE1BCQkweDAxCisjZGVmaW5lIE5PX1NXQVBfRE1BCQkweDAyCisjZGVmaW5lIERNQV9BQ1RJVkUJCTB4MDQKKyNkZWZpbmUgVEhSRVNIX01BU0sJCTB4MUYKKyNkZWZpbmUgRE1BX0VSUk9SX01BU0sJCTB4ZmYwMDAwMDAKKworLyoKKyAqIEdvb2RkaWVzIHN0b3JlZCBpbiB0aGUgVUxBIHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIFRSQUNFX09OX1dIQVRfQklUCTB4MDAwMjAwMDAgICAgLyogVHJhY2VzIG9uICovCisjZGVmaW5lIE9ORU1fQlVGX1dIQVRfQklUCTB4MDAwNDAwMDAgICAgLyogMU1lZyB2cyAyNTZLICovCisjZGVmaW5lIENIQVJfQVBJX1dIQVRfQklUCTB4MDAwODAwMDAgICAgLyogQ2hhciBBUEkgdnMgbmV0d29yayBvbmx5ICovCisjZGVmaW5lIENNRF9FVlRfV0hBVF9CSVQJMHgwMDIwMDAwMCAgICAvKiBDb21tYW5kIGV2ZW50ICovCisjZGVmaW5lIExPTkdfVFhfV0hBVF9CSVQJMHgwMDQwMDAwMAorI2RlZmluZSBMT05HX1JYX1dIQVRfQklUCTB4MDA4MDAwMDAKKyNkZWZpbmUgV0hBVF9CSVRfTUFTSwkJMHhGRkZEMDAwMCAgICAvKiBGZWF0dXJlIGJpdCBtYXNrICovCisKKy8qCisgKiBNb2RlIHN0YXR1cworICovCisKKyNkZWZpbmUgRVZFTlRfT1ZGTAkJMHg4MDAwMDAwMAorI2RlZmluZSBGQVRBTF9FUlIJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTE9PUF9CQUNLCQkweDAxCisjZGVmaW5lIE1PREVfUEgJCQkweDAyCisjZGVmaW5lIE1PREVfRlAJCQkweDAwCisjZGVmaW5lIFBUUjY0QklUCQkweDA0CisjZGVmaW5lIFBUUjMyQklUCQkweDAwCisjZGVmaW5lIFBUUl9XRF9TV0FQCQkweDA4CisjZGVmaW5lIFBUUl9XRF9OT1NXQVAJCTB4MDAKKyNkZWZpbmUgUE9TVF9XQVJOX0VWRU5UCQkweDEwCisjZGVmaW5lIEVSUl9URVJNCQkweDIwCisjZGVmaW5lIERJUkVDVF9DT05OCQkweDQwCisjZGVmaW5lIE5PX05JQ19XQVRDSERPRwkJMHg4MAorI2RlZmluZSBTV0FQX0RBVEEJCTB4MTAwCisjZGVmaW5lIFNXQVBfQ09OVFJPTAkJMHgyMDAKKyNkZWZpbmUgTklDX0hBTFRfT05fRVJSCQkweDQwMAorI2RlZmluZSBOSUNfTk9fUkVTVEFSVAkJMHg4MDAKKyNkZWZpbmUgSEFMRl9EVVBfVFgJCTB4MTAwMAorI2RlZmluZSBIQUxGX0RVUF9SWAkJMHgyMDAwCisKKworLyoKKyAqIEVycm9yIGNvZGVzCisgKi8KKworLyogSG9zdCBFcnJvciBDb2RlcyAtIHZhbHVlcyBvZiBmYWlsMSAqLworI2RlZmluZSBFUlJfVU5LTk9XTl9NQk9YCTB4MTAwMQorI2RlZmluZSBFUlJfVU5LTk9XTl9DTUQJCTB4MTAwMgorI2RlZmluZSBFUlJfTUFYX1JJTkcJCTB4MTAwMworI2RlZmluZSBFUlJfUklOR19DTE9TRUQJCTB4MTAwNAorI2RlZmluZSBFUlJfUklOR19PUEVOCQkweDEwMDUKKy8qIEZpcm13YXJlIGludGVybmFsIGVycm9ycyAqLworI2RlZmluZSBFUlJfRVZFTlRfUklOR19GVUxMCTB4MDEKKyNkZWZpbmUgRVJSX0RXX1BFTkRfQ01ORF9GVUxMCTB4MDIKKyNkZWZpbmUgRVJSX0RSX1BFTkRfQ01ORF9GVUxMCTB4MDMKKyNkZWZpbmUgRVJSX0RXX1BFTkRfREFUQV9GVUxMCTB4MDQKKyNkZWZpbmUgRVJSX0RSX1BFTkRfREFUQV9GVUxMCTB4MDUKKyNkZWZpbmUgRVJSX0lMTEVHQUxfSlVNUAkweDA2CisjZGVmaW5lIEVSUl9VTklNUExFTUVOVEVECTB4MDcKKyNkZWZpbmUgRVJSX1RYX0lORk9fRlVMTAkweDA4CisjZGVmaW5lIEVSUl9SWF9JTkZPX0ZVTEwJMHgwOQorI2RlZmluZSBFUlJfSUxMRUdBTF9NT0RFCTB4MEEKKyNkZWZpbmUgRVJSX01BSU5fVElNRU9VVAkweDBCCisjZGVmaW5lIEVSUl9FVkVOVF9CSVRTCQkweDBDCisjZGVmaW5lIEVSUl9VTlBFTkRfRlVMTAkJMHgwRAorI2RlZmluZSBFUlJfVElNRVJfUVVFVUVfRlVMTAkweDBFCisjZGVmaW5lIEVSUl9USU1FUl9RVUVVRV9FTVBUWQkweDBGCisjZGVmaW5lIEVSUl9USU1FUl9OT19GUkVFCTB4MTAKKyNkZWZpbmUgRVJSX0lOVFJfU1RBUlQJCTB4MTEKKyNkZWZpbmUgRVJSX0JBRF9TVEFSVFVQCQkweDEyCisjZGVmaW5lIEVSUl9OT19QS1RfRU5ECQkweDEzCisjZGVmaW5lIEVSUl9IQUxURURfT05fRVJSCTB4MTQKKy8qIEhhcmR3YXJlIE5JQyBFcnJvcnMgKi8KKyNkZWZpbmUgRVJSX1dSSVRFX0RNQQkJMHgwMTAxCisjZGVmaW5lIEVSUl9SRUFEX0RNQQkJMHgwMTAyCisjZGVmaW5lIEVSUl9FWFRfU0VSSUFMCQkweDAxMDMKKyNkZWZpbmUgRVJSX1RYX0lOVF9QQVJJVFkJMHgwMTA0CisKKworLyoKKyAqIEV2ZW50IGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFVlRfUklOR19FTlRSSUVTCTY0CisjZGVmaW5lIEVWVF9SSU5HX1NJWkUJCShFVlRfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBldmVudCkpCisKK3N0cnVjdCBldmVudCB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2ICAgICBpbmRleDsKKwl1OCAgICAgIHJpbmc7CisJdTggICAgICBjb2RlOworI2Vsc2UKKwl1OCAgICAgIGNvZGU7CisJdTggICAgICByaW5nOworCXUxNiAgICAgaW5kZXg7CisjZW5kaWYKKwl1MzIgICAgIHRpbWVzdGFtcDsKK307CisKKy8qCisgKiBHZW5lcmFsIEV2ZW50cworICovCisKKyNkZWZpbmUgRV9OSUNfVVAJMHgwMQorI2RlZmluZSBFX1dBVENIRE9HCTB4MDIKKworI2RlZmluZSBFX1NUQVRfVVBECTB4MDQKKyNkZWZpbmUgRV9JTlZBTF9DTUQJMHgwNQorI2RlZmluZSBFX1NFVF9DTURfQ09OUwkweDA2CisjZGVmaW5lIEVfTElOS19PTgkweDA3CisjZGVmaW5lIEVfTElOS19PRkYJMHgwOAorI2RlZmluZSBFX0lOVEVSTl9FUlIJMHgwOQorI2RlZmluZSBFX0hPU1RfRVJSCTB4MEEKKyNkZWZpbmUgRV9TVEFUU19VUERBVEUJMHgwQgorI2RlZmluZSBFX1JFSkVDVElORwkweDBDCisKKy8qCisgKiBTZW5kICBFdmVudHMKKyAqLworI2RlZmluZSBFX0NPTl9SRUoJMHgxMworI2RlZmluZSBFX0NPTl9UTU9VVAkweDE0CisjZGVmaW5lIEVfQ09OX05DX1RNT1VUCTB4MTUJLyogSSAgLCBDb25uZWN0aW9uIE5vIENhbXBvbiBUaW1lb3V0ICovCisjZGVmaW5lIEVfRElTQ19FUlIJMHgxNgorI2RlZmluZSBFX0lOVF9QUlRZCTB4MTcKKyNkZWZpbmUgRV9UWF9JRExFCTB4MTgKKyNkZWZpbmUgRV9UWF9MSU5LX0RST1AJMHgxOQorI2RlZmluZSBFX1RYX0lOVl9STkcJMHgxQQorI2RlZmluZSBFX1RYX0lOVl9CVUYJMHgxQgorI2RlZmluZSBFX1RYX0lOVl9EU0MJMHgxQworCisvKgorICogRGVzdGluYXRpb24gRXZlbnRzCisgKi8KKy8qCisgKiBHZW5lcmFsIFJlY2VpdmUgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9WQUxfUk5HCTB4MjAKKyNkZWZpbmUgRV9SWF9STkdfRU5FUgkweDIxCisjZGVmaW5lIEVfSU5WX1JORwkweDIyCisjZGVmaW5lIEVfUlhfUk5HX1NQQwkweDIzCisjZGVmaW5lIEVfUlhfUk5HX09VVAkweDI0CisjZGVmaW5lIEVfUEtUX0RJU0NBUkQJMHgyNQorI2RlZmluZSBFX0lORk9fRVZUCTB4MjcKKworLyoKKyAqIERhdGEgY29ycnVwdGVkIGV2ZW50cworICovCisjZGVmaW5lIEVfUlhfUEFSX0VSUgkweDJCCisjZGVmaW5lIEVfUlhfTExSQ19FUlIJMHgyQworI2RlZmluZSBFX0lQX0NLU01fRVJSCTB4MkQKKyNkZWZpbmUgRV9EVEFfQ0tTTV9FUlIJMHgyRQorI2RlZmluZSBFX1NIVF9CU1QJMHgyRgorCisvKgorICogRGF0YSBsb3N0IGV2ZW50cworICovCisjZGVmaW5lIEVfTFNUX0xOS19FUlIJMHgzMAorI2RlZmluZSBFX0ZMR19TWU5fRVJSCTB4MzEKKyNkZWZpbmUgRV9GUk1fRVJSCTB4MzIKKyNkZWZpbmUgRV9SWF9JRExFCTB4MzMKKyNkZWZpbmUgRV9QS1RfTE5fRVJSCTB4MzQKKyNkZWZpbmUgRV9TVEFURV9FUlIJMHgzNQorI2RlZmluZSBFX1VORVhQX0RBVEEJMHgzQworCisvKgorICogRmF0YWwgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9SWF9JTlZfQlVGCTB4MzYKKyNkZWZpbmUgRV9SWF9JTlZfRFNDCTB4MzcKKyNkZWZpbmUgRV9STkdfQkxLCTB4MzgKKworLyoKKyAqIFdhcm5pbmcgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9SWF9UTwkJMHgzOQorI2RlZmluZSBFX0JGUl9TUEMJMHgzQQorI2RlZmluZSBFX0lOVl9VTFAJMHgzQgorCisjZGVmaW5lIEVfTk9UX0lNUExFTUVOVEVEIDB4NDAKKworCisvKgorICogQ29tbWFuZHMKKyAqLworCisjZGVmaW5lIENNRF9SSU5HX0VOVFJJRVMJMTYKKworc3RydWN0IGNtZCB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2ICAgICBpbmRleDsKKwl1OCAgICAgIHJpbmc7CisJdTggICAgICBjb2RlOworI2Vsc2UKKwl1OCAgICAgIGNvZGU7CisJdTggICAgICByaW5nOworCXUxNiAgICAgaW5kZXg7CisjZW5kaWYKK307CisKKyNkZWZpbmUgQ19TVEFSVF9GVwkweDAxCisjZGVmaW5lIENfVVBEX1NUQVQJMHgwMgorI2RlZmluZSBDX1dBVENIRE9HCTB4MDUKKyNkZWZpbmUgQ19ERUxfUk5HCTB4MDkKKyNkZWZpbmUgQ19ORVdfUk5HCTB4MEEKKyNkZWZpbmUgQ19DT05OCQkweDBECisKKworLyoKKyAqIE1vZGUgYml0cworICovCisKKyNkZWZpbmUgIFBBQ0tFVF9CQUQJCTB4MDEgLyogUGFja2V0IGhhZCBsaW5rLWxheWVyIGVycm9yICovCisjZGVmaW5lICBJTlRFUlJVUFQJCTB4MDIKKyNkZWZpbmUgIFRYX0lQX0NLU1VNCQkweDA0CisjZGVmaW5lICBQQUNLRVRfRU5ECQkweDA4CisjZGVmaW5lICBQQUNLRVRfU1RBUlQJCTB4MTAKKyNkZWZpbmUgIFNBTUVfSUZJRUxECQkweDgwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXU2NCBhZGRybG87CisjZWxzZQorCXUzMiBhZGRyaGk7CisJdTMyIGFkZHJsbzsKKyNlbmRpZgorfSBycmFkZHI7CisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ycmFkZHIocnJhZGRyICpyYSwgZG1hX2FkZHJfdCBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgYmFkZHIgPSBhZGRyOworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXJhLT5hZGRybG8gPSBiYWRkcjsKKyNlbHNlCisgICAgLyogRG9uJ3QgYm90aGVyIHNldHRpbmcgemVybyBldmVyeSB0aW1lICovCisJcmEtPmFkZHJsbyA9IGJhZGRyOworI2VuZGlmCisJbWIoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3J4YWRkcihzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzLCB2b2xhdGlsZSBkbWFfYWRkcl90IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBiYWRkciA9IGFkZHI7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXdyaXRlbChiYWRkciAmIDB4ZmZmZmZmZmYsICZyZWdzLT5SeFJpbmdIaSk7CisJd3JpdGVsKGJhZGRyID4+IDMyLCAmcmVncy0+UnhSaW5nTG8pOworI2VsaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJd3JpdGVsKGJhZGRyID4+IDMyLCAmcmVncy0+UnhSaW5nSGkpOworCXdyaXRlbChiYWRkciAmIDB4ZmZmZmZmZmYsICZyZWdzLT5SeFJpbmdMbyk7CisjZWxzZQorCXdyaXRlbCgwLCAmcmVncy0+UnhSaW5nSGkpOworCXdyaXRlbChiYWRkciwgJnJlZ3MtPlJ4UmluZ0xvKTsKKyNlbmRpZgorCW1iKCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pbmZvYWRkcihzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzLCB2b2xhdGlsZSBkbWFfYWRkcl90IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBiYWRkciA9IGFkZHI7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXdyaXRlbChiYWRkciAmIDB4ZmZmZmZmZmYsICZyZWdzLT5JbmZvUHRySGkpOworCXdyaXRlbChiYWRkciA+PiAzMiwgJnJlZ3MtPkluZm9QdHJMbyk7CisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKwl3cml0ZWwoYmFkZHIgPj4gMzIsICZyZWdzLT5JbmZvUHRySGkpOworCXdyaXRlbChiYWRkciAmIDB4ZmZmZmZmZmYsICZyZWdzLT5JbmZvUHRyTG8pOworI2Vsc2UKKwl3cml0ZWwoMCwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKGJhZGRyLCAmcmVncy0+SW5mb1B0ckxvKTsKKyNlbmRpZgorCW1iKCk7Cit9CisKKworLyoKKyAqIFRYIHJpbmcKKyAqLworCisjaWZkZWYgQ09ORklHX1JPQURSVU5ORVJfTEFSR0VfUklOR1MKKyNkZWZpbmUgVFhfUklOR19FTlRSSUVTCTMyCisjZWxzZQorI2RlZmluZSBUWF9SSU5HX0VOVFJJRVMJMTYKKyNlbmRpZgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCShUWF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpKQorCitzdHJ1Y3QgdHhfZGVzY3sKKwlycmFkZHIJYWRkcjsKKwl1MzIJcmVzOworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglzaXplOworCXU4CXBhZDsKKwl1OAltb2RlOworI2Vsc2UKKwl1OAltb2RlOworCXU4CXBhZDsKKwl1MTYJc2l6ZTsKKyNlbmRpZgorfTsKKworCisjaWZkZWYgQ09ORklHX1JPQURSVU5ORVJfTEFSR0VfUklOR1MKKyNkZWZpbmUgUlhfUklOR19FTlRSSUVTCTMyCisjZWxzZQorI2RlZmluZSBSWF9SSU5HX0VOVFJJRVMgMTYKKyNlbmRpZgorI2RlZmluZSBSWF9UT1RBTF9TSVpFCShSWF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKQorCitzdHJ1Y3QgcnhfZGVzY3sKKwlycmFkZHIJYWRkcjsKKwl1MzIJcmVzOworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglzaXplOworCXU4CXBhZDsKKwl1OAltb2RlOworI2Vsc2UKKwl1OAltb2RlOworCXU4CXBhZDsKKwl1MTYJc2l6ZTsKKyNlbmRpZgorfTsKKworCisvKgorICogaW9jdGwncworICovCisKKyNkZWZpbmUgU0lPQ1JSUEZXCVNJT0NERVZQUklWQVRFCQkvKiBwdXQgZmlybXdhcmUgKi8KKyNkZWZpbmUgU0lPQ1JSR0ZXCVNJT0NERVZQUklWQVRFKzEJLyogZ2V0IGZpcm13YXJlICovCisjZGVmaW5lIFNJT0NSUklECVNJT0NERVZQUklWQVRFKzIJLyogaWRlbnRpZnkgKi8KKworCitzdHJ1Y3Qgc2VnX2hkciB7CisJdTMyCXNlZ19zdGFydDsKKwl1MzIJc2VnX2xlbjsKKwl1MzIJc2VnX2Vlc3RhcnQ7Cit9OworCisKKyNkZWZpbmUgRUVQUk9NX0JBU0UgMHg4MDAwMDAwMAorI2RlZmluZSBFRVBST01fV09SRFMgODE5MgorI2RlZmluZSBFRVBST01fQllURVMgKEVFUFJPTV9XT1JEUyAqIHNpemVvZih1MzIpKQorCitzdHJ1Y3QgZWVwcm9tX2Jvb3QgeworCXUzMglrZXkxOworCXUzMglrZXkyOworCXUzMglzcmFtX3NpemU7CisJc3RydWN0CXNlZ19oZHIgbG9hZGVyOworCXUzMglpbml0X2Noa3N1bTsKKwl1MzIJcmVzZXJ2ZWQxOworfTsKKworc3RydWN0IGVlcHJvbV9tYW5mIHsKKwl1MzIJSGVhZGVyRm10OworCXUzMglGaXJtd2FyZTsKKwl1MzIJQm9hcmRSZXZpc2lvbjsKKwl1MzIJUm9hZHJ1bm5lclJldjsKKwljaGFyCU9wdGljc1BhcnRbOF07CisJdTMyCU9wdGljc1JldjsKKwl1MzIJcGFkMTsKKwljaGFyCVNyYW1QYXJ0WzhdOworCXUzMglTcmFtUmV2OworCXUzMglwYWQyOworCWNoYXIJRWVwcm9tUGFydFs4XTsKKwl1MzIJRWVwcm9tUmV2OworCXUzMglFZXByb21TaXplOworCWNoYXIJUGFsUGFydFs4XTsKKwl1MzIJUGFsUmV2OworCXUzMglwYWQzOworCWNoYXIJUGFsQ29kZUZpbGVbMTJdOworCXUzMglQYWxDb2RlUmV2OworCWNoYXIJQm9hcmRVTEFbOF07CisJY2hhcglTZXJpYWxOb1s4XTsKKwljaGFyCU1mZ0RhdGVbOF07CisJY2hhcglNZmdUaW1lWzhdOworCWNoYXIJTW9kaWZ5RGF0ZVs4XTsKKwl1MzIJTW9kQ291bnQ7CisJdTMyCXBhZDRbMTNdOworfTsKKworCitzdHJ1Y3QgZWVwcm9tX3BoYXNlX2luZm8geworCWNoYXIJcGhhc2UxRmlsZVsxMl07CisJdTMyCXBoYXNlMVJldjsKKwljaGFyCXBoYXNlMURhdGVbOF07CisJY2hhcglwaGFzZTJGaWxlWzEyXTsKKwl1MzIJcGhhc2UyUmV2OworCWNoYXIJcGhhc2UyRGF0ZVs4XTsKKwl1MzIJcmVzZXJ2ZWQ3WzRdOworfTsKKworc3RydWN0IGVlcHJvbV9ybmNkX2luZm8geworCXUzMglGd1N0YXJ0OworCXUzMglGd1JldjsKKwljaGFyCUZ3RGF0ZVs4XTsKKwl1MzIJQWRkclJ1bkNvZGVTZWdzOworCXUzMglGaWxlTmFtZXM7CisJY2hhcglGaWxlWzEzXVs4XTsKK307CisKKworLyogUGhhc2UgMSByZWdpb24gKHN0YXJ0cyBhcmUgd29yZCBvZmZzZXQgMHg4MCkgKi8KK3N0cnVjdCBwaGFzZTFfaGRyeworCXUzMglqdW1wOworCXUzMglub29wOworCXN0cnVjdCBzZWdfaGRyIHBoYXNlMlNlZzsKK307CisKK3N0cnVjdCBlZXByb20geworCXN0cnVjdCBlZXByb21fYm9vdAlib290OworCXUzMgkJCXBhZDFbOF07CisJc3RydWN0IGVlcHJvbV9tYW5mCW1hbmY7CisJc3RydWN0IGVlcHJvbV9waGFzZV9pbmZvIHBoYXNlX2luZm87CisJc3RydWN0IGVlcHJvbV9ybmNkX2luZm8Jcm5jZF9pbmZvOworCXUzMgkJCXBhZDJbMTVdOworCXUzMgkJCWhkcl9jaGVja3N1bTsKKwlzdHJ1Y3QgcGhhc2UxX2hkcglwaGFzZTE7Cit9OworCisKK3N0cnVjdCBycl9zdGF0cyB7CisJdTMyCU5pY1RpbWVTdGFtcDsKKwl1MzIJUm5nQ3JlYXRlZDsKKwl1MzIJUm5nRGVsZXRlZDsKKwl1MzIJSW50ckdlbjsKKwl1MzIJTkV2dE92Zmw7CisJdTMyCUludkNtZDsKKwl1MzIJRG1hUmVhZEVycnM7CisJdTMyCURtYVdyaXRlRXJyczsKKwl1MzIJU3RhdFVwZHRUOworCXUzMglTdGF0VXBkdEM7CisJdTMyCVdhdGNoRG9nOworCXUzMglUcmFjZTsJCisKKwkvKiBTZXJpYWwgSElQUEkgKi8KKwl1MzIJTG5rUmR5RXN0OworCXUzMglHTGlua0VycjsKKwl1MzIJQWx0RmxnRXJyOworCXUzMglPdmhkQml0OFN5bmM7CisJdTMyCVJtdFNlclBydHlFcnI7CisJdTMyCVJtdFBhclBydHlFcnI7CisJdTMyCVJtdExvb3BCazsKKwl1MzIJcGFkMTsKKworCS8qIEhJUFBJIHR4ICovCisJdTMyCUNvbkVzdDsKKwl1MzIJQ29uUmVqUzsKKwl1MzIJQ29uUmV0cnk7CisJdTMyCUNvblRtT3V0OworCXUzMglTbmRDb25EaXNjb247CisJdTMyCVNuZFBhckVycjsKKwl1MzIJUGt0U250OworCXUzMglwYWQyWzJdOworCXUzMglTaEZCc3RTbnQ7CisJdTY0CUJ5dFNlbnQ7CisJdTMyCVR4VGltZW91dDsKKwl1MzIJcGFkM1szXTsKKworCS8qIEhJUFBJIHJ4ICovCisJdTMyCUNvbkFjYzsKKwl1MzIJQ29uUmVqZGlQcnR5OworCXUzMglDb25SZWpkNjRiOworCXUzMglDb25SZWpkQnVmOworCXUzMglSeENvbkRpc2NvbjsKKwl1MzIJUnhDb25Ob0RhdGE7CisJdTMyCVBrdFJ4OworCXUzMglwYWQ0WzJdOworCXUzMglTaEZCc3RSeDsKKwl1NjQJQnl0Ung7CisJdTMyCVJ4UGFyRXJyOworCXUzMglSeExMUkNlcnI7CisJdTMyCVJ4QnN0U1plcnI7CisJdTMyCVJ4U3RhdGVFcnI7CisJdTMyCVJ4UmR5RXJyOworCXUzMglSeEludlVMUDsKKwl1MzIJUnhTcGNCdWY7CisJdTMyCVJ4U3BjRGVzYzsKKwl1MzIJUnhSbmdTcGM7CisJdTMyCVJ4Um5nRnVsbDsKKwl1MzIJUnhQa3RMZW5FcnI7CisJdTMyCVJ4Q2tzbUVycjsKKwl1MzIJUnhQa3REcnA7CisJdTMyCVJuZ0xvd1NwYzsKKwl1MzIJUm5nRGF0YUNsb3NlOworCXUzMglSeFRpbWVvdXQ7CisJdTMyCVJ4SWRsZTsKK307CisKKworLyoKKyAqIFRoaXMgc3RydWN0IGlzIHNoYXJlZCB3aXRoIHRoZSBOSUMgZmlybXdhcmUuCisgKi8KK3N0cnVjdCByaW5nX2N0cmwgeworCXJyYWRkcglybmdwdHI7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CWVudHJpZXM7CisJdTgJcGFkOworCXU4CWVudHJ5X3NpemU7CisJdTE2CXBpOworCXUxNgltb2RlOworI2Vsc2UKKwl1OAllbnRyeV9zaXplOworCXU4CXBhZDsKKwl1MTYJZW50cmllczsKKwl1MTYJbW9kZTsKKwl1MTYJcGk7CisjZW5kaWYKK307CisKK3N0cnVjdCBycl9pbmZvIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBycl9zdGF0cyBzdGF0czsKKwkJdTMyIHN0YXRpWzEyOF07CisJfSBzOworCXN0cnVjdCByaW5nX2N0cmwJZXZ0X2N0cmw7CisJc3RydWN0IHJpbmdfY3RybAljbWRfY3RybDsKKwlzdHJ1Y3QgcmluZ19jdHJsCXR4X2N0cmw7CisJdTgJCQlwYWRbNDY0XTsKKwl1OAkJCXRyYWNlWzMwNzJdOworfTsKKworLyoKKyAqIFRoZSBsaW51eCBzdHJ1Y3R1cmUgZm9yIHRoZSBSb2FkUnVubmVyLgorICoKKyAqIFJYL1RYIGRlc2NyaXB0b3JzIGFyZSBwdXQgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHByb3Blcmx5CisgKiBhbGlnbmVkIGFuZCBkbyBub3QgY3Jvc3MgY2FjaGUtbGluZSBib3VuZGFyaWVzLgorICovCisKK3N0cnVjdCBycl9wcml2YXRlCit7CisJc3RydWN0IHJ4X2Rlc2MJCSpyeF9yaW5nOworCXN0cnVjdCB0eF9kZXNjCQkqdHhfcmluZzsKKwlzdHJ1Y3QgZXZlbnQJCSpldnRfcmluZzsKKwlkbWFfYWRkcl90IAkJdHhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCAJCXJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgCQlldnRfcmluZ19kbWE7CisJLyogQWxpZ25tZW50IG9rID8gKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkJKnJ4X3NrYnVmZltSWF9SSU5HX0VOVFJJRVNdOworCXN0cnVjdCBza19idWZmCQkqdHhfc2tidWZmW1RYX1JJTkdfRU5UUklFU107CisJc3RydWN0IHJyX3JlZ3MJCV9faW9tZW0gKnJlZ3M7CQkvKiBSZWdpc3RlciBiYXNlICovCisJc3RydWN0IHJpbmdfY3RybAkqcnhfY3RybDsJLyogUmVjZWl2ZSByaW5nIGNvbnRyb2wgKi8KKwlzdHJ1Y3QgcnJfaW5mbwkJKmluZm87CQkvKiBTaGFyZWQgaW5mbyBwYWdlICovCisJZG1hX2FkZHJfdCAJCXJ4X2N0cmxfZG1hOworCWRtYV9hZGRyX3QgCQlpbmZvX2RtYTsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCXUzMgkJCWN1cl9yeCwgY3VyX2NtZCwgY3VyX2V2dDsKKwl1MzIJCQlkaXJ0eV9yeCwgZGlydHlfdHg7CisJdTMyCQkJdHhfZnVsbDsKKwl1MzIJCQlmd19yZXY7CisJdm9sYXRpbGUgc2hvcnQJCWZ3X3J1bm5pbmc7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBjaV9kZXYJCSpwY2lfZGV2OworfTsKKworCisvKgorICogUHJvdG90eXBlcworICovCitzdGF0aWMgaW50IHJyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX2luaXQxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHJyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIGludCBycl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBycl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBycl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBycl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnJfcmVhZF9lZXByb20oc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpOworc3RhdGljIHUzMiBycl9yZWFkX2VlcHJvbV93b3JkKHN0cnVjdCBycl9wcml2YXRlICpycnByaXYsIHZvaWQgKiBvZmZzZXQpOworc3RhdGljIGludCBycl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSB2b2lkIHJyX3Jhel90eChzdHJ1Y3QgcnJfcHJpdmF0ZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBycl9yYXpfcngoc3RydWN0IHJyX3ByaXZhdGUgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CisjZW5kaWYgLyogX1JSVU5ORVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8tcmVncy5oIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5MmNhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8tcmVncy5oCkBAIC0wLDAgKzEsNzc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWdzLmg6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBTMklPIDEwR2JFIFNlcnZlciBOSUMKKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLgorCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICogcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICogYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAqIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhpcyBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUkVHU19ICisjZGVmaW5lIF9SRUdTX0gKKworI2RlZmluZSBUQkQgMAorCit0eXBlZGVmIHN0cnVjdCBfWEVOQV9kZXZfY29uZmlnIHsKKy8qIENvbnZlbnRpb246IG1IQUxfWFhYIGlzIG1hc2ssIHZIQUxfWFhYIGlzIHZhbHVlICovCisKKy8qIEdlbmVyYWwgQ29udHJvbC1TdGF0dXMgUmVnaXN0ZXJzICovCisJdTY0IGdlbmVyYWxfaW50X3N0YXR1czsKKyNkZWZpbmUgR0VOX0lOVFJfVFhQSUMgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIEdFTl9JTlRSX1RYRE1BICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBHRU5fSU5UUl9UWE1BQyAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgR0VOX0lOVFJfVFhYR1hTICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIEdFTl9JTlRSX1RYVFJBRkZJQyAgICAgICAgIEJJVCg4KQorI2RlZmluZSBHRU5fSU5UUl9SWFBJQyAgICAgICAgICAgICBCSVQoMzIpCisjZGVmaW5lIEdFTl9JTlRSX1JYRE1BICAgICAgICAgICAgIEJJVCgzMykKKyNkZWZpbmUgR0VOX0lOVFJfUlhNQUMgICAgICAgICAgICAgQklUKDM0KQorI2RlZmluZSBHRU5fSU5UUl9NQyAgICAgICAgICAgICAgICBCSVQoMzUpCisjZGVmaW5lIEdFTl9JTlRSX1JYWEdYUyAgICAgICAgICAgIEJJVCgzNikKKyNkZWZpbmUgR0VOX0lOVFJfUlhUUkFGRklDICAgICAgICAgQklUKDQwKQorI2RlZmluZSBHRU5fRVJST1JfSU5UUiAgICAgICAgICAgICBHRU5fSU5UUl9UWFBJQyB8IEdFTl9JTlRSX1JYUElDIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UUl9UWERNQSB8IEdFTl9JTlRSX1JYRE1BIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UUl9UWE1BQyB8IEdFTl9JTlRSX1JYTUFDIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UUl9UWFhHWFN8IEdFTl9JTlRSX1JYWEdYU3wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UUl9NQworCisJdTY0IGdlbmVyYWxfaW50X21hc2s7CisKKwl1OCB1bnVzZWQwWzB4MTAwIC0gMHgxMF07CisKKwl1NjQgc3dfcmVzZXQ7CisvKiBYR1hTIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHJlc2V0IG9ubHkgb25jZS4gKi8KKyNkZWZpbmUgU1dfUkVTRVRfWEVOQSAgICAgICAgICAgICAgdkJJVCgweEE1LDAsOCkKKyNkZWZpbmUgU1dfUkVTRVRfRkxBU0ggICAgICAgICAgICAgdkJJVCgweEE1LDgsOCkKKyNkZWZpbmUgU1dfUkVTRVRfRU9JICAgICAgICAgICAgICAgdkJJVCgweEE1LDE2LDgpCisjZGVmaW5lIFNXX1JFU0VUX0FMTCAgICAgICAgICAgICAgIChTV19SRVNFVF9YRU5BICAgICB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dfUkVTRVRfRkxBU0ggICAgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXX1JFU0VUX0VPSSkKKy8qIFRoZSBTV19SRVNFVCByZWdpc3RlciBtdXN0IHJlYWQgdGhpcyB2YWx1ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVzZXQuICovCisjZGVmaW5lCVNXX1JFU0VUX1JBV19WQUwJCQkweEE1MDAwMDAwCisKKworCXU2NCBhZGFwdGVyX3N0YXR1czsKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfVERNQV9SRUFEWSAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUkRNQV9SRUFEWSAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUEZDX1JFQURZICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfVE1BQ19CVUZfRU1QVFkgICAgICBCSVQoMykKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUElDX1FVSUVTQ0VOVCAgICAgICBCSVQoNSkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUk1BQ19SRU1PVEVfRkFVTFQgICBCSVQoNikKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUk1BQ19MT0NBTF9GQVVMVCAgICBCSVQoNykKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfSURMRSAgICAgICB2QklUKDB4RkYsOCw4KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UICAgIHZCSVQoMHhGRiwxNiw4KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19NQ19EUkFNX1JFQURZICAgICAgIEJJVCgyNCkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfTUNfUVVFVUVTX1JFQURZICAgICBCSVQoMjUpCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX01fUExMX0xPQ0sgICAgICAgICAgQklUKDMwKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19QX1BMTF9MT0NLICAgICAgICAgIEJJVCgzMSkKKworCXU2NCBhZGFwdGVyX2NvbnRyb2w7CisjZGVmaW5lIEFEQVBURVJfQ05UTF9FTiAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIEFEQVBURVJfRU9JX1RYX09OICAgICAgICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBBREFQVEVSX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgQURBUFRFUl9VRFBJKHZhbCkgICAgICAgICAgICAgICAgICB2QklUKHZhbCwzNiw0KQorI2RlZmluZSBBREFQVEVSX1dBSVRfSU5UICAgICAgICAgICAgICAgICAgIEJJVCg0OCkKKyNkZWZpbmUgQURBUFRFUl9FQ0NfRU4gICAgICAgICAgICAgICAgICAgICBCSVQoNTUpCisKKwl1NjQgc2Vycl9zb3VyY2U7CisjZGVmaW5lIFNFUlJfU09VUkNFX1BJQwkJCQkJQklUKDApCisjZGVmaW5lIFNFUlJfU09VUkNFX1RYRE1BCQkJCUJJVCgxKQorI2RlZmluZSBTRVJSX1NPVVJDRV9SWERNQQkJCQlCSVQoMikKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfTUFDICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfTUMgICAgICAgICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfWEdYUyAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUJU0VSUl9TT1VSQ0VfQU5ZCQkJCQkoU0VSUl9TT1VSQ0VfUElDCQl8IFwKKwkJCQkJCQkJCQlTRVJSX1NPVVJDRV9UWERNQQl8IFwKKwkJCQkJCQkJCQlTRVJSX1NPVVJDRV9SWERNQQl8IFwKKwkJCQkJCQkJCQlTRVJSX1NPVVJDRV9NQUMJCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX01DICAgICAgfCBcCisJCQkJCQkJCQkJU0VSUl9TT1VSQ0VfWEdYUykKKworCisJdTggdW51c2VkXzBbMHg4MDAgLSAweDEyMF07CisKKy8qIFBDSS1YIENvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJdTY0IHBpY19pbnRfc3RhdHVzOworCXU2NCBwaWNfaW50X21hc2s7CisjZGVmaW5lIFBJQ19JTlRfVFggICAgICAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUElDX0lOVF9GTFNIICAgICAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBQSUNfSU5UX01ESU8gICAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFBJQ19JTlRfSUlDICAgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUElDX0lOVF9HUElPICAgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBQSUNfSU5UX1JYICAgICAgICAgICAgICAgICAgICAgQklUKDMyKQorCisJdTY0IHR4cGljX2ludF9yZWc7CisJdTY0IHR4cGljX2ludF9tYXNrOworI2RlZmluZSBQQ0lYX0lOVF9SRUdfRUNDX1NHX0VSUiAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX0VDQ19EQl9FUlIgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19GTEFTSFJfUl9GU01fRVJSICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfRkxBU0hSX1dfRlNNX0VSUiAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX0lOSV9UWF9GU01fU0VSUiAgICAgICAgICAgQklUKDEwKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfSU5JX1RYT19GU01fRVJSICAgICAgICAgICBCSVQoMTEpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19UUlRfRlNNX1NFUlIgICAgICAgICAgICAgIEJJVCgxMykKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1NSVF9GU01fU0VSUiAgICAgICAgICAgICAgQklUKDE0KQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUElGUl9GU01fU0VSUiAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19XUkNfVFhfU0VORF9GU01fU0VSUiAgICAgIEJJVCgyMSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1JSQ19UWF9SRVFfRlNNX1NFUlIgICAgICAgQklUKDIzKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfSU5JX1JYX0ZTTV9TRVJSICAgICAgICAgICBCSVQoNDgpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19SQV9SWF9GU01fU0VSUiAgICAgICAgICAgIEJJVCg1MCkKKy8qCisjZGVmaW5lIFBDSVhfSU5UX1JFR19XUkNfUlhfU0VORF9GU01fU0VSUiAgICAgIEJJVCg1MikKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1JSQ19SWF9SRVFfRlNNX1NFUlIgICAgICAgQklUKDU0KQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUlJDX1JYX1NQTElUX0ZTTV9TRVJSICAgICBCSVQoNTgpCisqLworCXU2NCB0eHBpY19hbGFybXM7CisJdTY0IHJ4cGljX2ludF9yZWc7CisJdTY0IHJ4cGljX2ludF9tYXNrOworCXU2NCByeHBpY19hbGFybXM7CisKKwl1NjQgZmxzaF9pbnRfcmVnOworCXU2NCBmbHNoX2ludF9tYXNrOworI2RlZmluZSBQSUNfRkxTSF9JTlRfUkVHX0NZQ0xFX0ZTTV9FUlIgICAgICAgICBCSVQoNjMpCisjZGVmaW5lIFBJQ19GTFNIX0lOVF9SRUdfRVJSICAgICAgICAgICAgICAgICAgIEJJVCg2MikKKwl1NjQgZmxhc2hfYWxhcm1zOworCisJdTY0IG1kaW9faW50X3JlZzsKKwl1NjQgbWRpb19pbnRfbWFzazsKKyNkZWZpbmUgTURJT19JTlRfUkVHX01ESU9fQlVTX0VSUiAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIE1ESU9fSU5UX1JFR19EVFhfQlVTX0VSUiAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBNRElPX0lOVF9SRUdfTEFTSSAgICAgICAgICAgICAgICAgICAgICBCSVQoMzkpCisJdTY0IG1kaW9fYWxhcm1zOworCisJdTY0IGlpY19pbnRfcmVnOworCXU2NCBpaWNfaW50X21hc2s7CisjZGVmaW5lIElJQ19JTlRfUkVHX0JVU19GU01fRVJSICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBJSUNfSU5UX1JFR19CSVRfRlNNX0VSUiAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgSUlDX0lOVF9SRUdfQ1lDTEVfRlNNX0VSUiAgICAgICAgICAgICAgQklUKDYpCisjZGVmaW5lIElJQ19JTlRfUkVHX1JFUV9GU01fRVJSICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBJSUNfSU5UX1JFR19BQ0tfRVJSICAgICAgICAgICAgICAgICAgICBCSVQoOCkKKwl1NjQgaWljX2FsYXJtczsKKworCXU4IHVudXNlZDRbMHgwOF07CisKKwl1NjQgZ3Bpb19pbnRfcmVnOworCXU2NCBncGlvX2ludF9tYXNrOworCXU2NCBncGlvX2FsYXJtczsKKworCXU4IHVudXNlZDVbMHgzOF07CisKKwl1NjQgdHhfdHJhZmZpY19pbnQ7CisjZGVmaW5lIFRYX1RSQUZGSUNfSU5UX24obikgICAgICAgICAgICAgICAgICAgIEJJVChuKQorCXU2NCB0eF90cmFmZmljX21hc2s7CisKKwl1NjQgcnhfdHJhZmZpY19pbnQ7CisjZGVmaW5lIFJYX1RSQUZGSUNfSU5UX24obikgICAgICAgICAgICAgICAgICAgIEJJVChuKQorCXU2NCByeF90cmFmZmljX21hc2s7CisKKy8qIFBJQyBDb250cm9sIHJlZ2lzdGVycyAqLworCXU2NCBwaWNfY29udHJvbDsKKyNkZWZpbmUgUElDX0NOVExfUlhfQUxBUk1fTUFQXzEgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFBJQ19DTlRMX1NIQVJFRF9TUExJVFMobikgICAgICAgICAgICAgIHZCSVQobiwxMSw0KQorCisJdTY0IHN3YXBwZXJfY3RybDsKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1BJRl9SX0ZFICAgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9QSUZfUl9TRSAgICAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUElGX1dfRkUgICAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1BJRl9XX1NFICAgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWFBfRkUgICAgICAgICAgICAgICAgICAgIEJJVCgxNikKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYUF9TRSAgICAgICAgICAgICAgICAgICAgQklUKDE3KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhEX1JfRkUgICAgICAgICAgICAgICAgICBCSVQoMTgpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWERfUl9TRSAgICAgICAgICAgICAgICAgIEJJVCgxOSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRF9XX0ZFICAgICAgICAgICAgICAgICAgQklUKDIwKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhEX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoMjEpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWEZfUl9GRSAgICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRl9SX1NFICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhEX1JfRkUgICAgICAgICAgICAgICAgICBCSVQoMzIpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWERfUl9TRSAgICAgICAgICAgICAgICAgIEJJVCgzMykKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRF9XX0ZFICAgICAgICAgICAgICAgICAgQklUKDM0KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhEX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoMzUpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWEZfV19GRSAgICAgICAgICAgICAgICAgIEJJVCgzNikKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRl9XX1NFICAgICAgICAgICAgICAgICAgQklUKDM3KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfWE1TSV9GRSAgICAgICAgICAgICAgICAgICBCSVQoNDApCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9YTVNJX1NFICAgICAgICAgICAgICAgICAgIEJJVCg0MSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1NUQVRTX0ZFICAgICAgICAgICAgICAgICAgQklUKDQ4KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfU1RBVFNfU0UgICAgICAgICAgICAgICAgICBCSVQoNDkpCisKKwl1NjQgcGlmX3JkX3N3YXBwZXJfZmI7CisjZGVmaW5lIElGX1JEX1NXQVBQRVJfRkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIzNDU2Nzg5QUJDREVGCisKKwl1NjQgc2NoZWR1bGVkX2ludF9jdHJsOworI2RlZmluZSBTQ0hFRF9JTlRfQ1RSTF9USU1FUl9FTiAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgU0NIRURfSU5UX0NUUkxfT05FX1NIT1QgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFNDSEVEX0lOVF9DVFJMX0lOVDJNU0kgICAgICAgICAgICAgICAgIFRCRAorI2RlZmluZSBTQ0hFRF9JTlRfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICBUQkQKKworCXU2NCB0eHJlcXRpbWVvdXQ7CisjZGVmaW5lIFRYUkVRVE9fVkFMKHZhbCkJCQkJCQl2QklUKHZhbCwwLDMyKQorI2RlZmluZSBUWFJFUVRPX0VOCQkJCQkJCQlCSVQoNjMpCisKKwl1NjQgc3RhdHNyZXF0aW1lb3V0OworI2RlZmluZSBTVEFUUkVRVE9fVkFMKG4pICAgICAgICAgICAgICAgICAgICAgICBUQkQKKyNkZWZpbmUgU1RBVFJFUVRPX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDYzKQorCisJdTY0IHJlYWRfcmV0cnlfZGVsYXk7CisJdTY0IHJlYWRfcmV0cnlfYWNjZWxlcmF0aW9uOworCXU2NCB3cml0ZV9yZXRyeV9kZWxheTsKKwl1NjQgd3JpdGVfcmV0cnlfYWNjZWxlcmF0aW9uOworCisJdTY0IHhtc2lfY29udHJvbDsKKwl1NjQgeG1zaV9hY2Nlc3M7CisJdTY0IHhtc2lfYWRkcmVzczsKKwl1NjQgeG1zaV9kYXRhOworCisJdTY0IHJ4X21hdDsKKworCXU4IHVudXNlZDZbMHg4XTsKKworCXU2NCB0eF9tYXQwXzc7CisJdTY0IHR4X21hdDhfMTU7CisJdTY0IHR4X21hdDE2XzIzOworCXU2NCB0eF9tYXQyNF8zMTsKKwl1NjQgdHhfbWF0MzJfMzk7CisJdTY0IHR4X21hdDQwXzQ3OworCXU2NCB0eF9tYXQ0OF81NTsKKwl1NjQgdHhfbWF0NTZfNjM7CisKKwl1OCB1bnVzZWRfMVsweDEwXTsKKworCS8qIEF1dG9tYXRlZCBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gKi8KKwl1NjQgc3RhdF9jZmc7CisjZGVmaW5lIFNUQVRfQ0ZHX1NUQVRfRU4gICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBTVEFUX0NGR19PTkVfU0hPVF9FTiAgICAgICBCSVQoMSkKKyNkZWZpbmUgU1RBVF9DRkdfU1RBVF9OU19FTiAgICAgICAgQklUKDgpCisjZGVmaW5lIFNUQVRfQ0ZHX1NUQVRfUk8gICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBTVEFUX1RSU0ZfUEVSKG4pICAgICAgICAgICBUQkQKKyNkZWZpbmUJUEVSX1NFQwkJCQkJICAgMHgyMDhkNQorI2RlZmluZQlTRVRfVVBEVF9QRVJJT0QobikJCSAgIHZCSVQoKFBFUl9TRUMqbiksMzIsMzIpCisKKwl1NjQgc3RhdF9hZGRyOworCisJLyogR2VuZXJhbCBDb25maWd1cmF0aW9uICovCisJdTY0IG1kaW9fY29udHJvbDsKKworCXU2NCBkdHhfY29udHJvbDsKKworCXU2NCBpMmNfY29udHJvbDsKKyNkZWZpbmUJSTJDX0NPTlRST0xfREVWX0lEKGlkKQkJdkJJVChpZCwxLDMpCisjZGVmaW5lCUkyQ19DT05UUk9MX0FERFIoYWRkcikJCXZCSVQoYWRkciw1LDExKQorI2RlZmluZQlJMkNfQ09OVFJPTF9CWVRFX0NOVChjbnQpCXZCSVQoY250LDIyLDIpCisjZGVmaW5lCUkyQ19DT05UUk9MX1JFQUQJCQlCSVQoMjQpCisjZGVmaW5lCUkyQ19DT05UUk9MX05BQ0sJCQlCSVQoMjUpCisjZGVmaW5lCUkyQ19DT05UUk9MX0NOVExfU1RBUlQJCXZCSVQoMHhFLDI4LDQpCisjZGVmaW5lCUkyQ19DT05UUk9MX0NOVExfRU5EKHZhbCkJKHZhbCAmIHZCSVQoMHgxLDI4LDQpKQorI2RlZmluZQlJMkNfQ09OVFJPTF9HRVRfREFUQSh2YWwpCSh1MzIpKHZhbCAmIDB4RkZGRkZGRkYpCisjZGVmaW5lCUkyQ19DT05UUk9MX1NFVF9EQVRBKHZhbCkJdkJJVCh2YWwsMzIsMzIpCisKKwl1NjQgZ3Bpb19jb250cm9sOworI2RlZmluZSBHUElPX0NUUkxfR1BJT18wCQlCSVQoOCkKKworCXU4IHVudXNlZDdbMHg2MDBdOworCisvKiBUeERNQSByZWdpc3RlcnMgKi8KKwl1NjQgdHhkbWFfaW50X3N0YXR1czsKKwl1NjQgdHhkbWFfaW50X21hc2s7CisjZGVmaW5lIFRYRE1BX1BGQ19JTlQgICAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgVFhETUFfVERBX0lOVCAgICAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBUWERNQV9QQ0NfSU5UICAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFRYRE1BX1RUSV9JTlQgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgVFhETUFfTFNPX0lOVCAgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBUWERNQV9UUEFfSU5UICAgICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lIFRYRE1BX1NNX0lOVCAgICAgICAgICAgICAgICAgICBCSVQoNikKKwl1NjQgcGZjX2Vycl9yZWc7CisJdTY0IHBmY19lcnJfbWFzazsKKwl1NjQgcGZjX2Vycl9hbGFybTsKKworCXU2NCB0ZGFfZXJyX3JlZzsKKwl1NjQgdGRhX2Vycl9tYXNrOworCXU2NCB0ZGFfZXJyX2FsYXJtOworCisJdTY0IHBjY19lcnJfcmVnOworI2RlZmluZSBQQ0NfRkJfRUNDX0RCX0VSUgkJdkJJVCgweEZGLCAxNiwgOCkKKworCXU2NCBwY2NfZXJyX21hc2s7CisJdTY0IHBjY19lcnJfYWxhcm07CisKKwl1NjQgdHRpX2Vycl9yZWc7CisJdTY0IHR0aV9lcnJfbWFzazsKKwl1NjQgdHRpX2Vycl9hbGFybTsKKworCXU2NCBsc29fZXJyX3JlZzsKKwl1NjQgbHNvX2Vycl9tYXNrOworCXU2NCBsc29fZXJyX2FsYXJtOworCisJdTY0IHRwYV9lcnJfcmVnOworCXU2NCB0cGFfZXJyX21hc2s7CisJdTY0IHRwYV9lcnJfYWxhcm07CisKKwl1NjQgc21fZXJyX3JlZzsKKwl1NjQgc21fZXJyX21hc2s7CisJdTY0IHNtX2Vycl9hbGFybTsKKworCXU4IHVudXNlZDhbMHgxMDAgLSAweEI4XTsKKworLyogVHhETUEgYXJiaXRlciAqLworCXU2NCB0eF9kbWFfd3JhcF9zdGF0OworCisvKiBUeCBGSUZPIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgWF9NQVhfRklGT1MgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFhfRklGT19NQVhfTEVOICAgICAgICAgICAgICAgICAgICAgMHgxRkZGCS8qODE5MSAqLworCXU2NCB0eF9maWZvX3BhcnRpdGlvbl8wOworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9FTiAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8wX1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fMF9MRU4odmFsKSAgICAgICB2QklUKHZhbCwxOSwxMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fMV9QUkkodmFsKSAgICAgICB2QklUKHZhbCwzNywzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8xX0xFTih2YWwpICAgICAgIHZCSVQodmFsLDUxLDEzICApCisKKwl1NjQgdHhfZmlmb19wYXJ0aXRpb25fMTsKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fMl9QUkkodmFsKSAgICAgICB2QklUKHZhbCw1LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzJfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsMTksMTMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzNfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsMzcsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fM19MRU4odmFsKSAgICAgICB2QklUKHZhbCw1MSwxMykKKworCXU2NCB0eF9maWZvX3BhcnRpdGlvbl8yOworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl80X1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fNF9MRU4odmFsKSAgICAgICB2QklUKHZhbCwxOSwxMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fNV9QUkkodmFsKSAgICAgICB2QklUKHZhbCwzNywzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl81X0xFTih2YWwpICAgICAgIHZCSVQodmFsLDUxLDEzKQorCisJdTY0IHR4X2ZpZm9fcGFydGl0aW9uXzM7CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzZfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsNSwzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl82X0xFTih2YWwpICAgICAgIHZCSVQodmFsLDE5LDEzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl83X1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzdfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsNTEsMTMpCisKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fUFJJXzAgICAgICAgICAgICAgICAgIDAJLyogaGlnaGVzdCAqLworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfMiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfMyAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfNCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfNSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfNiAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfNyAgICAgICAgICAgICAgICAgNwkvKiBsb3dlc3QgKi8KKworCXU2NCB0eF93X3JvdW5kX3JvYmluXzA7CisJdTY0IHR4X3dfcm91bmRfcm9iaW5fMTsKKwl1NjQgdHhfd19yb3VuZF9yb2Jpbl8yOworCXU2NCB0eF93X3JvdW5kX3JvYmluXzM7CisJdTY0IHR4X3dfcm91bmRfcm9iaW5fNDsKKworCXU2NCB0dGlfY29tbWFuZF9tZW07CisjZGVmaW5lIFRUSV9DTURfTUVNX1dFICAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EICAgICAgICAgQklUKDE1KQorI2RlZmluZSBUVElfQ01EX01FTV9TVFJPQkVfQkVJTkdfRVhFQ1VURUQgIEJJVCgxNSkKKyNkZWZpbmUgVFRJX0NNRF9NRU1fT0ZGU0VUKG4pICAgICAgICAgICAgICB2QklUKG4sMjYsNikKKworCXU2NCB0dGlfZGF0YTFfbWVtOworI2RlZmluZSBUVElfREFUQTFfTUVNX1RYX1RJTUVSX1ZBTChuKSAgICAgIHZCSVQobiw2LDI2KQorI2RlZmluZSBUVElfREFUQTFfTUVNX1RYX1RJTUVSX0FDX0NJKG4pICAgIHZCSVQobiwzOCwyKQorI2RlZmluZSBUVElfREFUQTFfTUVNX1RYX1RJTUVSX0FDX0VOICAgICAgIEJJVCgzOCkKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9USU1FUl9DSV9FTiAgICAgICBCSVQoMzkpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19BKG4pICAgICAgICAgdkJJVChuLDQxLDcpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19CKG4pICAgICAgICAgdkJJVChuLDQ5LDcpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19DKG4pICAgICAgICAgdkJJVChuLDU3LDcpCisKKwl1NjQgdHRpX2RhdGEyX21lbTsKKyNkZWZpbmUgVFRJX0RBVEEyX01FTV9UWF9VRkNfQShuKSAgICAgICAgICB2QklUKG4sMCwxNikKKyNkZWZpbmUgVFRJX0RBVEEyX01FTV9UWF9VRkNfQihuKSAgICAgICAgICB2QklUKG4sMTYsMTYpCisjZGVmaW5lIFRUSV9EQVRBMl9NRU1fVFhfVUZDX0MobikgICAgICAgICAgdkJJVChuLDMyLDE2KQorI2RlZmluZSBUVElfREFUQTJfTUVNX1RYX1VGQ19EKG4pICAgICAgICAgIHZCSVQobiw0OCwxNikKKworLyogVHggUHJvdG9jb2wgYXNzaXN0ICovCisJdTY0IHR4X3BhX2NmZzsKKyNkZWZpbmUgVFhfUEFfQ0ZHX0lHTk9SRV9GUk1fRVJSICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgVFhfUEFfQ0ZHX0lHTk9SRV9TTkFQX09VSSAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgVFhfUEFfQ0ZHX0lHTk9SRV9MTENfQ1RSTCAgICAgICAgICBCSVQoMykKKyNkZWZpbmUJVFhfUEFfQ0ZHX0lHTk9SRV9MMl9FUlIJCQkgICBCSVQoNikKKworLyogUmVjZW50IGFkZCwgdXNlZCBvbmx5IGRlYnVnIHB1cnBvc2VzLiAqLworCXU2NCBwY2NfZW5hYmxlOworCisJdTggdW51c2VkOVsweDcwMCAtIDB4MTc4XTsKKworCXU2NCB0eGRtYV9kZWJ1Z19jdHJsOworCisJdTggdW51c2VkMTBbMHgxODAwIC0gMHgxNzA4XTsKKworLyogUnhETUEgUmVnaXN0ZXJzICovCisJdTY0IHJ4ZG1hX2ludF9zdGF0dXM7CisJdTY0IHJ4ZG1hX2ludF9tYXNrOworI2RlZmluZSBSWERNQV9JTlRfUkNfSU5UX00gICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFJYRE1BX0lOVF9SUEFfSU5UX00gICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUlhETUFfSU5UX1JEQV9JTlRfTSAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSWERNQV9JTlRfUlRJX0lOVF9NICAgICAgICAgICAgQklUKDMpCisKKwl1NjQgcmRhX2Vycl9yZWc7CisJdTY0IHJkYV9lcnJfbWFzazsKKwl1NjQgcmRhX2Vycl9hbGFybTsKKworCXU2NCByY19lcnJfcmVnOworCXU2NCByY19lcnJfbWFzazsKKwl1NjQgcmNfZXJyX2FsYXJtOworCisJdTY0IHByY19wY2l4X2Vycl9yZWc7CisJdTY0IHByY19wY2l4X2Vycl9tYXNrOworCXU2NCBwcmNfcGNpeF9lcnJfYWxhcm07CisKKwl1NjQgcnBhX2Vycl9yZWc7CisJdTY0IHJwYV9lcnJfbWFzazsKKwl1NjQgcnBhX2Vycl9hbGFybTsKKworCXU2NCBydGlfZXJyX3JlZzsKKwl1NjQgcnRpX2Vycl9tYXNrOworCXU2NCBydGlfZXJyX2FsYXJtOworCisJdTggdW51c2VkMTFbMHgxMDAgLSAweDg4XTsKKworLyogRE1BIGFyYml0ZXIgKi8KKwl1NjQgcnhfcXVldWVfcHJpb3JpdHk7CisjZGVmaW5lIFJYX1FVRVVFXzBfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCw1LDMpCisjZGVmaW5lIFJYX1FVRVVFXzFfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCwxMywzKQorI2RlZmluZSBSWF9RVUVVRV8yX1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsMjEsMykKKyNkZWZpbmUgUlhfUVVFVUVfM19QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDI5LDMpCisjZGVmaW5lIFJYX1FVRVVFXzRfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCwzNywzKQorI2RlZmluZSBSWF9RVUVVRV81X1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsNDUsMykKKyNkZWZpbmUgUlhfUVVFVUVfNl9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDUzLDMpCisjZGVmaW5lIFJYX1FVRVVFXzdfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCw2MSwzKQorCisjZGVmaW5lIFJYX1FVRVVFX1BSSV8wICAgICAgICAgICAgICAgICAwCS8qIGhpZ2hlc3QgKi8KKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzEgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzIgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzMgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzQgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzUgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzYgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzcgICAgICAgICAgICAgICAgIDcJLyogbG93ZXN0ICovCisKKwl1NjQgcnhfd19yb3VuZF9yb2Jpbl8wOworCXU2NCByeF93X3JvdW5kX3JvYmluXzE7CisJdTY0IHJ4X3dfcm91bmRfcm9iaW5fMjsKKwl1NjQgcnhfd19yb3VuZF9yb2Jpbl8zOworCXU2NCByeF93X3JvdW5kX3JvYmluXzQ7CisKKwkvKiBQZXItcmluZyBjb250cm9sbGVyIHJlZ3MgKi8KKyNkZWZpbmUgUlhfTUFYX1JJTkdTICAgICAgICAgICAgICAgIDgKKyNpZiAwCisjZGVmaW5lIFJYX01BWF9SSU5HU19TWiAgICAgICAgICAgICAweEZGRkYJLyogNjU1MzYgKi8KKyNkZWZpbmUgUlhfTUlOX1JJTkdTX1NaICAgICAgICAgICAgIDB4M0YJLyogNjMgKi8KKyNlbmRpZgorCXU2NCBwcmNfcnhkMF9uW1JYX01BWF9SSU5HU107CisJdTY0IHByY19jdHJsX25bUlhfTUFYX1JJTkdTXTsKKyNkZWZpbmUgUFJDX0NUUkxfUkNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFBSQ19DVFJMX1JJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgIChCSVQoMTQpfEJJVCgxNSkpCisjZGVmaW5lIFBSQ19DVFJMX1JJTkdfTU9ERV8xICAgICAgICAgICAgICAgICAgIHZCSVQoMCwxNCwyKQorI2RlZmluZSBQUkNfQ1RSTF9SSU5HX01PREVfMyAgICAgICAgICAgICAgICAgICB2QklUKDEsMTQsMikKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFXzUgICAgICAgICAgICAgICAgICAgdkJJVCgyLDE0LDIpCisjZGVmaW5lIFBSQ19DVFJMX1JJTkdfTU9ERV94ICAgICAgICAgICAgICAgICAgIHZCSVQoMywxNCwyKQorI2RlZmluZSBQUkNfQ1RSTF9OT19TTk9PUCAgICAgICAgICAgICAgICAgICAgICAoQklUKDIyKXxCSVQoMjMpKQorI2RlZmluZSBQUkNfQ1RSTF9OT19TTk9PUF9ERVNDICAgICAgICAgICAgICAgICBCSVQoMjIpCisjZGVmaW5lIFBSQ19DVFJMX05PX1NOT09QX0JVRkYgICAgICAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgUFJDX0NUUkxfUlhEX0JBQ0tPRkZfSU5URVJWQUwodmFsKSAgICAgdkJJVCh2YWwsNDAsMjQpCisKKwl1NjQgcHJjX2FsYXJtX2FjdGlvbjsKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SMF9TVE9QICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjBfU1RPUCAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1IxX1NUT1AgICAgICAgICAgICBCSVQoMTEpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjFfU1RPUCAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SMl9TVE9QICAgICAgICAgICAgQklUKDE5KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1IyX1NUT1AgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjNfU1RPUCAgICAgICAgICAgIEJJVCgyNykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SM19TVE9QICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1I0X1NUT1AgICAgICAgICAgICBCSVQoMzUpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjRfU1RPUCAgICAgICAgICAgIEJJVCgzOSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SNV9TVE9QICAgICAgICAgICAgQklUKDQzKQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1I1X1NUT1AgICAgICAgICAgICBCSVQoNDcpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjZfU1RPUCAgICAgICAgICAgIEJJVCg1MSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SNl9TVE9QICAgICAgICAgICAgQklUKDU1KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1I3X1NUT1AgICAgICAgICAgICBCSVQoNTkpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjdfU1RPUCAgICAgICAgICAgIEJJVCg2MykKKworLyogUmVjZWl2ZSB0cmFmZmljIGludGVycnVwdHMgKi8KKwl1NjQgcnRpX2NvbW1hbmRfbWVtOworI2RlZmluZSBSVElfQ01EX01FTV9XRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJUSV9DTURfTUVNX1NUUk9CRSAgICAgICAgICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFJUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFJUSV9DTURfTUVNX1NUUk9CRV9DTURfQkVJTkdfRVhFQ1VURUQgICBCSVQoMTUpCisjZGVmaW5lIFJUSV9DTURfTUVNX09GRlNFVChuKSAgICAgICAgICAgICAgICAgICB2QklUKG4sMjksMykKKworCXU2NCBydGlfZGF0YTFfbWVtOworI2RlZmluZSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX1ZBTChuKSAgICAgIHZCSVQobiwzLDI5KQorI2RlZmluZSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX0FDX0VOICAgICAgIEJJVCgzOCkKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9USU1FUl9DSV9FTiAgICAgICBCSVQoMzkpCisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVVJOR19BKG4pICAgICAgICAgdkJJVChuLDQxLDcpCisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVVJOR19CKG4pICAgICAgICAgdkJJVChuLDQ5LDcpCisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVVJOR19DKG4pICAgICAgICAgdkJJVChuLDU3LDcpCisKKwl1NjQgcnRpX2RhdGEyX21lbTsKKyNkZWZpbmUgUlRJX0RBVEEyX01FTV9SWF9VRkNfQShuKSAgICAgICAgICB2QklUKG4sMCwxNikKKyNkZWZpbmUgUlRJX0RBVEEyX01FTV9SWF9VRkNfQihuKSAgICAgICAgICB2QklUKG4sMTYsMTYpCisjZGVmaW5lIFJUSV9EQVRBMl9NRU1fUlhfVUZDX0MobikgICAgICAgICAgdkJJVChuLDMyLDE2KQorI2RlZmluZSBSVElfREFUQTJfTUVNX1JYX1VGQ19EKG4pICAgICAgICAgIHZCSVQobiw0OCwxNikKKworCXU2NCByeF9wYV9jZmc7CisjZGVmaW5lIFJYX1BBX0NGR19JR05PUkVfRlJNX0VSUiAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJYX1BBX0NGR19JR05PUkVfU05BUF9PVUkgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJYX1BBX0NGR19JR05PUkVfTExDX0NUUkwgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFJYX1BBX0NGR19JR05PUkVfTDJfRVJSICAgICAgICAgICAgQklUKDYpCisKKwl1OCB1bnVzZWQxMlsweDcwMCAtIDB4MUQ4XTsKKworCXU2NCByeGRtYV9kZWJ1Z19jdHJsOworCisJdTggdW51c2VkMTNbMHgyMDAwIC0gMHgxZjA4XTsKKworLyogTWVkaWEgQWNjZXNzIENvbnRyb2xsZXIgUmVnaXN0ZXIgKi8KKwl1NjQgbWFjX2ludF9zdGF0dXM7CisJdTY0IG1hY19pbnRfbWFzazsKKyNkZWZpbmUgTUFDX0lOVF9TVEFUVVNfVE1BQ19JTlQgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgTUFDX0lOVF9TVEFUVVNfUk1BQ19JTlQgICAgICAgICAgICBCSVQoMSkKKworCXU2NCBtYWNfdG1hY19lcnJfcmVnOworI2RlZmluZSBUTUFDX0VSUl9SRUdfVE1BQ19FQ0NfREJfRVJSICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVE1BQ19FUlJfUkVHX1RNQUNfVFhfQlVGX09WUk4gICAgICBCSVQoMjMpCisjZGVmaW5lIFRNQUNfRVJSX1JFR19UTUFDX1RYX0NSSV9FUlIgICAgICAgQklUKDMxKQorCXU2NCBtYWNfdG1hY19lcnJfbWFzazsKKwl1NjQgbWFjX3RtYWNfZXJyX2FsYXJtOworCisJdTY0IG1hY19ybWFjX2Vycl9yZWc7CisjZGVmaW5lIFJNQUNfRVJSX1JFR19SWF9CVUZGX09WUk4gICAgICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfRVJSX1JFR19SVFNfRUNDX0RCX0VSUiAgICAgICAgQklUKDE0KQorI2RlZmluZSBSTUFDX0VSUl9SRUdfRUNDX0RCX0VSUiAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUk1BQ19MSU5LX1NUQVRFX0NIQU5HRV9JTlQgICAgICAgICBCSVQoMzEpCisJdTY0IG1hY19ybWFjX2Vycl9tYXNrOworCXU2NCBtYWNfcm1hY19lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQxNFsweDEwMCAtIDB4NDBdOworCisJdTY0IG1hY19jZmc7CisjZGVmaW5lIE1BQ19DRkdfVE1BQ19FTkFCTEUgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIE1BQ19DRkdfUk1BQ19FTkFCTEUgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIE1BQ19DRkdfTEFOX05PVF9XQU4gICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIE1BQ19DRkdfVE1BQ19MT09QQkFDSyAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIE1BQ19DRkdfVE1BQ19BUFBFTkRfUEFEICAgICAgICAgQklUKDQpCisjZGVmaW5lIE1BQ19DRkdfUk1BQ19TVFJJUF9GQ1MgICAgICAgICAgQklUKDUpCisjZGVmaW5lIE1BQ19DRkdfUk1BQ19TVFJJUF9QQUQgICAgICAgICAgQklUKDYpCisjZGVmaW5lIE1BQ19DRkdfUk1BQ19QUk9NX0VOQUJMRSAgICAgICAgQklUKDcpCisjZGVmaW5lIE1BQ19STUFDX0RJU0NBUkRfUEZSTSAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIE1BQ19STUFDX0JDQVNUX0VOQUJMRSAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIE1BQ19STUFDX0FMTF9BRERSX0VOQUJMRSAgICAgICAgQklUKDEwKQorI2RlZmluZSBNQUNfUk1BQ19JTlZMRF9JUEdfVEhSKHZhbCkgICAgIHZCSVQodmFsLDE2LDgpCisKKwl1NjQgdG1hY19hdmdfaXBnOworI2RlZmluZSBUTUFDX0FWR19JUEcodmFsKSAgICAgICAgICAgdkJJVCh2YWwsMCw4KQorCisJdTY0IHJtYWNfbWF4X3B5bGRfbGVuOworI2RlZmluZSBSTUFDX01BWF9QWUxEX0xFTih2YWwpICAgICAgdkJJVCh2YWwsMiwxNCkKKyNkZWZpbmUgUk1BQ19NQVhfUFlMRF9MRU5fREVGICAgICAgIHZCSVQoMTUwMCwyLDE0KQorI2RlZmluZSBSTUFDX01BWF9QWUxEX0xFTl9KVU1CT19ERUYgdkJJVCg5NjAwLDIsMTQpCisKKwl1NjQgcm1hY19lcnJfY2ZnOworI2RlZmluZSBSTUFDX0VSUl9GQ1MgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBSTUFDX0VSUl9GQ1NfQUNDRVBUICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSTUFDX0VSUl9UT09fTE9ORyAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSTUFDX0VSUl9UT09fTE9OR19BQ0NFUFQgICAgICAgIEJJVCgxKQorI2RlZmluZSBSTUFDX0VSUl9SVU5UICAgICAgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSTUFDX0VSUl9SVU5UX0FDQ0VQVCAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSTUFDX0VSUl9MRU5fTUlTTUFUQ0ggICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBSTUFDX0VSUl9MRU5fTUlTTUFUQ0hfQUNDRVBUICAgIEJJVCgzKQorCisJdTY0IHJtYWNfY2ZnX2tleTsKKyNkZWZpbmUgUk1BQ19DRkdfS0VZKHZhbCkgICAgICAgICAgICAgICB2QklUKHZhbCwwLDE2KQorCisjZGVmaW5lIE1BWF9NQUNfQUREUkVTU0VTICAgICAgICAgICAxNgorI2RlZmluZSBNQVhfTUNfQUREUkVTU0VTICAgICAgICAgICAgMzIJLyogTXVsdGljYXN0IGFkZHJlc3NlcyAqLworI2RlZmluZSBNQUNfTUFDX0FERFJfU1RBUlRfT0ZGU0VUICAgMAorI2RlZmluZSBNQUNfTUNfQUREUl9TVEFSVF9PRkZTRVQgICAgMTYKKyNkZWZpbmUgTUFDX01DX0FMTF9NQ19BRERSX09GRlNFVCAgIDYzCS8qIGVuYWJsZXMgYWxsIG11bHRpY2FzdCBwa3RzICovCisJdTY0IHJtYWNfYWRkcl9jbWRfbWVtOworI2RlZmluZSBSTUFDX0FERFJfQ01EX01FTV9XRSAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX1JEICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9DTURfRVhFQ1VUSU5HICBCSVQoMTUpCisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX09GRlNFVChuKSAgICAgICAgICAgICB2QklUKG4sMjYsNikKKworCXU2NCBybWFjX2FkZHJfZGF0YTBfbWVtOworI2RlZmluZSBSTUFDX0FERFJfREFUQTBfTUVNX0FERFIobikgICAgdkJJVChuLDAsNDgpCisjZGVmaW5lIFJNQUNfQUREUl9EQVRBMF9NRU1fVVNFUiAgICAgICBCSVQoNDgpCisKKwl1NjQgcm1hY19hZGRyX2RhdGExX21lbTsKKyNkZWZpbmUgUk1BQ19BRERSX0RBVEExX01FTV9NQVNLKG4pICAgIHZCSVQobiwwLDQ4KQorCisJdTggdW51c2VkMTVbMHg4XTsKKworLyoKKyAgICAgICAgdTY0IHJtYWNfYWRkcl9jZmc7CisjZGVmaW5lIFJNQUNfQUREUl9VQ0FTVG5fRU4obikgICAgIG1CSVQoMClfbihuKQorI2RlZmluZSBSTUFDX0FERFJfTUNBU1RuX0VOKG4pICAgICBtQklUKDApX24obikKKyNkZWZpbmUgUk1BQ19BRERSX0JDQVNUX0VOICAgICAgICAgdkJJVCgwKV80OCAKKyNkZWZpbmUgUk1BQ19BRERSX0FMTF9BRERSX0VOICAgICAgdkJJVCgwKV80OSAKKyovCisJdTY0IHRtYWNfaXBnX2NmZzsKKworCXU2NCBybWFjX3BhdXNlX2NmZzsKKyNkZWZpbmUgUk1BQ19QQVVTRV9HRU4gICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfUEFVU0VfR0VOX0VOQUJMRSAgICAgIEJJVCgwKQorI2RlZmluZSBSTUFDX1BBVVNFX1JYICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUk1BQ19QQVVTRV9SWF9FTkFCTEUgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfUEFVU0VfSEdfUFRJTUVfREVGICAgIHZCSVQoMHhGRkZGLDE2LDE2KQorI2RlZmluZSBSTUFDX1BBVVNFX0hHX1BUSU1FKHZhbCkgICAgdkJJVCh2YWwsMTYsMTYpCisKKwl1NjQgcm1hY19yZWRfY2ZnOworCisJdTY0IHJtYWNfcmVkX3JhdGVfcTBxMzsKKwl1NjQgcm1hY19yZWRfcmF0ZV9xNHE3OworCisJdTY0IG1hY19saW5rX3V0aWw7CisjZGVmaW5lIE1BQ19UWF9MSU5LX1VUSUwgICAgICAgICAgIHZCSVQoMHhGRSwxLDcpCisjZGVmaW5lIE1BQ19UWF9MSU5LX1VUSUxfRElTQUJMRSAgIHZCSVQoMHhGLCA4LDQpCisjZGVmaW5lIE1BQ19UWF9MSU5LX1VUSUxfVkFMKCBuICkgIHZCSVQobiw4LDQpCisjZGVmaW5lIE1BQ19SWF9MSU5LX1VUSUwgICAgICAgICAgIHZCSVQoMHhGRSwzMyw3KQorI2RlZmluZSBNQUNfUlhfTElOS19VVElMX0RJU0FCTEUgICB2QklUKDB4Riw0MCw0KQorI2RlZmluZSBNQUNfUlhfTElOS19VVElMX1ZBTCggbiApICB2QklUKG4sNDAsNCkKKworI2RlZmluZSBNQUNfTElOS19VVElMX0RJU0FCTEUgICAgICBNQUNfVFhfTElOS19VVElMX0RJU0FCTEUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SWF9MSU5LX1VUSUxfRElTQUJMRQorCisJdTY0IHJtYWNfaW52YWxpZF9pcGc7CisKKy8qIHJ4IHRyYWZmaWMgc3RlZXJpbmcgKi8KKyNkZWZpbmUJTUFDX1JUU19GUk1fTEVOX1NFVChsZW4pCXZCSVQobGVuLDIsMTQpCisJdTY0IHJ0c19mcm1fbGVuX25bOF07CisKKwl1NjQgcnRzX3Fvc19zdGVlcmluZzsKKworI2RlZmluZSBNQVhfRElYX01BUCAgICAgICAgICAgICAgICAgICAgICAgICA0CisJdTY0IHJ0c19kaXhfbWFwX25bTUFYX0RJWF9NQVBdOworI2RlZmluZSBSVFNfRElYX01BUF9FVFlQRSh2YWwpICAgICAgICAgICAgIHZCSVQodmFsLDAsMTYpCisjZGVmaW5lIFJUU19ESVhfTUFQX1NDVyh2YWwpICAgICAgICAgICAgICAgQklUKHZhbCwyMSkKKworCXU2NCBydHNfcV9hbHRlcm5hdGVzOworCXU2NCBydHNfZGVmYXVsdF9xOworCisJdTY0IHJ0c19jdHJsOworI2RlZmluZSBSVFNfQ1RSTF9JR05PUkVfU05BUF9PVUkgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBSVFNfQ1RSTF9JR05PUkVfTExDX0NUUkwgICAgICAgICAgIEJJVCgzKQorCisJdTY0IHJ0c19wbl9jYW1fY3RybDsKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX1dFICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX1NUUk9CRV9ORVdfQ01EICAgICBCSVQoMTUpCisjZGVmaW5lIFJUU19QTl9DQU1fQ1RSTF9TVFJPQkVfQkVJTkdfRVhFQ1VURUQgICBCSVQoMTUpCisjZGVmaW5lIFJUU19QTl9DQU1fQ1RSTF9PRkZTRVQobikgICAgICAgICAgdkJJVChuLDI0LDgpCisJdTY0IHJ0c19wbl9jYW1fZGF0YTsKKyNkZWZpbmUgUlRTX1BOX0NBTV9EQVRBX1RDUF9TRUxFQ1QgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlRTX1BOX0NBTV9EQVRBX1BPUlQodmFsKSAgICAgICAgICB2QklUKHZhbCw4LDE2KQorI2RlZmluZSBSVFNfUE5fQ0FNX0RBVEFfU0NXKHZhbCkgICAgICAgICAgIHZCSVQodmFsLDI0LDgpCisKKwl1NjQgcnRzX2RzX21lbV9jdHJsOworI2RlZmluZSBSVFNfRFNfTUVNX0NUUkxfV0UgICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSVFNfRFNfTUVNX0NUUkxfU1RST0JFX05FV19DTUQgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX0RTX01FTV9DVFJMX1NUUk9CRV9DTURfQkVJTkdfRVhFQ1VURUQgICBCSVQoMTUpCisjZGVmaW5lIFJUU19EU19NRU1fQ1RSTF9PRkZTRVQobikgICAgICAgICAgdkJJVChuLDI2LDYpCisJdTY0IHJ0c19kc19tZW1fZGF0YTsKKyNkZWZpbmUgUlRTX0RTX01FTV9EQVRBKG4pICAgICAgICAgICAgICAgICB2QklUKG4sMCw4KQorCisJdTggdW51c2VkMTZbMHg3MDAgLSAweDIyMF07CisKKwl1NjQgbWFjX2RlYnVnX2N0cmw7CisjZGVmaW5lIE1BQ19EQkdfQUNUSVZJVFlfVkFMVUUJCSAgIDB4NDExMDQwNDAwMDAwMDAwVUxMCisKKwl1OCB1bnVzZWQxN1sweDI4MDAgLSAweDI3MDhdOworCisvKiBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKwl1NjQgbWNfaW50X3N0YXR1czsKKyNkZWZpbmUgTUNfSU5UX1NUQVRVU19NQ19JTlQgICAgICAgICAgICAgICBCSVQoMCkKKwl1NjQgbWNfaW50X21hc2s7CisjZGVmaW5lIE1DX0lOVF9NQVNLX01DX0lOVCAgICAgICAgICAgICAgICAgQklUKDApCisKKwl1NjQgbWNfZXJyX3JlZzsKKyNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfREJfRVJSX0wgICAgICAgICAgICBCSVQoMTQpCisjZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0RCX0VSUl9VICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBNQ19FUlJfUkVHX01JUklfQ1JJX0VSUl8wICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgTUNfRVJSX1JFR19NSVJJX0NSSV9FUlJfMSAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIE1DX0VSUl9SRUdfU01fRVJSICAgICAgICAgICAgICAgICAgQklUKDMxKQorCXU2NCBtY19lcnJfbWFzazsKKwl1NjQgbWNfZXJyX2FsYXJtOworCisJdTggdW51c2VkMThbMHgxMDAgLSAweDI4XTsKKworLyogTUMgY29uZmlndXJhdGlvbiAqLworCXU2NCByeF9xdWV1ZV9jZmc7CisjZGVmaW5lIFJYX1FVRVVFX0NGR19RMF9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDAsOCkKKyNkZWZpbmUgUlhfUVVFVUVfQ0ZHX1ExX1NaKG4pICAgICAgICAgICAgICB2QklUKG4sOCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTJfU1oobikgICAgICAgICAgICAgIHZCSVQobiwxNiw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTNfU1oobikgICAgICAgICAgICAgIHZCSVQobiwyNCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTRfU1oobikgICAgICAgICAgICAgIHZCSVQobiwzMiw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTVfU1oobikgICAgICAgICAgICAgIHZCSVQobiw0MCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTZfU1oobikgICAgICAgICAgICAgIHZCSVQobiw0OCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTdfU1oobikgICAgICAgICAgICAgIHZCSVQobiw1Niw4KQorCisJdTY0IG1jX3JsZHJhbV9tcnM7CisjZGVmaW5lCU1DX1JMRFJBTV9RVUVVRV9TSVpFX0VOQUJMRQkJCUJJVCgzOSkKKyNkZWZpbmUJTUNfUkxEUkFNX01SU19FTkFCTEUJCQkJQklUKDQ3KQorCisJdTY0IG1jX3JsZHJhbV9pbnRlcmxlYXZlOworCisJdTY0IG1jX3BhdXNlX3RocmVzaF9xMHEzOworCXU2NCBtY19wYXVzZV90aHJlc2hfcTRxNzsKKworCXU2NCBtY19yZWRfdGhyZXNoX3FbOF07CisKKwl1OCB1bnVzZWQxOVsweDIwMCAtIDB4MTY4XTsKKwl1NjQgbWNfcmxkcmFtX3JlZl9wZXI7CisJdTggdW51c2VkMjBbMHgyMjAgLSAweDIwOF07CisJdTY0IG1jX3JsZHJhbV90ZXN0X2N0cmw7CisjZGVmaW5lIE1DX1JMRFJBTV9URVNUX01PREUJCUJJVCg0NykKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfV1JJVEUJQklUKDcpCisjZGVmaW5lIE1DX1JMRFJBTV9URVNUX0dPCQlCSVQoMTUpCisjZGVmaW5lIE1DX1JMRFJBTV9URVNUX0RPTkUJCUJJVCgyMykKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfUEFTUwkJQklUKDMxKQorCisJdTggdW51c2VkMjFbMHgyNDAgLSAweDIyOF07CisJdTY0IG1jX3JsZHJhbV90ZXN0X2FkZDsKKwl1OCB1bnVzZWQyMlsweDI2MCAtIDB4MjQ4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfZDA7CisJdTggdW51c2VkMjNbMHgyODAgLSAweDI2OF07CisJdTY0IG1jX3JsZHJhbV90ZXN0X2QxOworCXU4IHVudXNlZDI0WzB4MzAwIC0gMHgyODhdOworCXU2NCBtY19ybGRyYW1fdGVzdF9kMjsKKwl1OCB1bnVzZWQyNVsweDcwMCAtIDB4MzA4XTsKKwl1NjQgbWNfZGVidWdfY3RybDsKKworCXU4IHVudXNlZDI2WzB4MzAwMCAtIDB4MmYwOF07CisKKy8qIFhHWEcgKi8KKwkvKiBYR1hTIGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKwl1NjQgeGd4c19pbnRfc3RhdHVzOworI2RlZmluZSBYR1hTX0lOVF9TVEFUVVNfVFhHWFMgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBYR1hTX0lOVF9TVEFUVVNfUlhHWFMgICAgICAgICAgICAgIEJJVCgxKQorCXU2NCB4Z3hzX2ludF9tYXNrOworI2RlZmluZSBYR1hTX0lOVF9NQVNLX1RYR1hTICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBYR1hTX0lOVF9NQVNLX1JYR1hTICAgICAgICAgICAgICAgIEJJVCgxKQorCisJdTY0IHhneHNfdHhneHNfZXJyX3JlZzsKKyNkZWZpbmUgVFhHWFNfRUNDX0RCX0VSUiAgICAgICAgICAgICAgICAgICBCSVQoMTUpCisJdTY0IHhneHNfdHhneHNfZXJyX21hc2s7CisJdTY0IHhneHNfdHhneHNfZXJyX2FsYXJtOworCisJdTY0IHhneHNfcnhneHNfZXJyX3JlZzsKKwl1NjQgeGd4c19yeGd4c19lcnJfbWFzazsKKwl1NjQgeGd4c19yeGd4c19lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQyN1sweDEwMCAtIDB4NDBdOworCisJdTY0IHhneHNfY2ZnOworCXU2NCB4Z3hzX3N0YXR1czsKKworCXU2NCB4Z3hzX2NmZ19rZXk7CisJdTY0IHhneHNfZWZpZm9fY2ZnOwkvKiBDSEFOR0VEICovCisJdTY0IHJ4Z3hzX2Jlcl8wOwkvKiBDSEFOR0VEICovCisJdTY0IHJ4Z3hzX2Jlcl8xOwkvKiBDSEFOR0VEICovCisKK30gWEVOQV9kZXZfY29uZmlnX3Q7CisKKyNkZWZpbmUgWEVOQV9SRUdfU1BBQ0UJc2l6ZW9mKFhFTkFfZGV2X2NvbmZpZ190KQorI2RlZmluZQlYRU5BX0VFUFJPTV9TUEFDRSAoMHgwMSA8PCAxMSkKKworI2VuZGlmCQkJCS8qIF9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIyNGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC0wLDAgKzEsNDk1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogczJpby5jOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgUzJJTyAxMEdiRSBTZXJ2ZXIgTklDCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KKworICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKyAqIHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKyAqIGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIENyZWRpdHM6CisgKiBKZWZmIEdhcnppawkJOiBGb3IgcG9pbnRpbmcgb3V0IHRoZSBpbXByb3BlciBlcnJvciBjb25kaXRpb24gCisgKgkJCSAgY2hlY2sgaW4gdGhlIHMyaW9feG1pdCByb3V0aW5lIGFuZCBhbHNvIHNvbWUgCisgKiAJCQkgIGlzc3VlcyBpbiB0aGUgVHggd2F0Y2ggZG9nIGZ1bmN0aW9uLiBBbHNvIGZvcgorICoJCQkgIHBhdGllbnRseSBhbnN3ZXJpbmcgYWxsIHRob3NlIGlubnVtZXJhYmxlIAorICoJCQkgIHF1ZXN0aW9ucyByZWdhcmluZyB0aGUgMi42IHBvcnRpbmcgaXNzdWVzLgorICogU3RlcGhlbiBIZW1taW5nZXIJOiBQcm92aWRpbmcgcHJvcGVyIDIuNiBwb3J0aW5nIG1lY2hhbmlzbSBmb3Igc29tZQorICoJCQkgIG1hY3JvcyBhdmFpbGFibGUgb25seSBpbiAyLjYgS2VybmVsLgorICogRnJhbmNvaXMgUm9taWV1CTogRm9yIHBvaW50aW5nIG91dCBhbGwgY29kZSBwYXJ0IHRoYXQgd2VyZSAKKyAqCQkJICBkZXByZWNhdGVkIGFuZCBhbHNvIHN0eWxpbmcgcmVsYXRlZCBjb21tZW50cy4KKyAqIEdyYW50IEdydW5kbGVyCTogRm9yIGhlbHBpbmcgbWUgZ2V0IHJpZCBvZiBzb21lIEFyY2hpdGVjdHVyZSAKKyAqCQkJICBkZXBlbmRlbnQgY29kZS4KKyAqIENocmlzdG9waGVyIEhlbGx3aWcJOiBTb21lIG1vcmUgMi42IHNwZWNpZmljIGlzc3VlcyBpbiB0aGUgZHJpdmVyLgorICoJCQkgIAkKKyAqIFRoZSBtb2R1bGUgbG9hZGFibGUgcGFyYW1ldGVycyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciBhbmQgYSBicmllZgorICogZXhwbGFpbmF0aW9uIG9mIGFsbCB0aGUgdmFyaWFibGVzLgorICogcnhfcmluZ19udW0gOiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2dyYW0gdGhlIG51bWJlciBvZiByZWNlaXZlIHJpbmdzIHVzZWQgCisgKiBpbiB0aGUgZHJpdmVyLiAgCQkJCQkKKyAqIHJ4X3JpbmdfbGVuOiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBlYWNoIHJpbmcgY2FuIGhhdmUuIFRoaXMgCisgKiBpcyBhbHNvIGFuIGFycmF5IG9mIHNpemUgOC4KKyAqIHR4X2ZpZm9fbnVtOiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBUeCBGSUZPcyB0aGF0cyB1c2VkIGludCB0aGUgZHJpdmVyLgorICogdHhfZmlmb19sZW46IFRoaXMgdG9vIGlzIGFuIGFycmF5IG9mIDguIEVhY2ggZWxlbWVudCBkZWZpbmVzIHRoZSBudW1iZXIgb2YgCisgKiBUeCBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb3JyZXNwb25kaW5nIEZJRk8uCisgKiBpbiBQQ0kgQ29uZmlndXJhdGlvbiBzcGFjZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIGxvY2FsIGluY2x1ZGUgKi8KKyNpbmNsdWRlICJzMmlvLmgiCisjaW5jbHVkZSAiczJpby1yZWdzLmgiCisKKy8qIFMyaW8gRHJpdmVyIG5hbWUgJiB2ZXJzaW9uLiAqLworc3RhdGljIGNoYXIgczJpb19kcml2ZXJfbmFtZVtdID0gInMyaW8iOworc3RhdGljIGNoYXIgczJpb19kcml2ZXJfdmVyc2lvbltdID0gIlZlcnNpb24gMS43LjcuMSI7CisKKy8qIAorICogQ2FyZHMgd2l0aCBmb2xsb3dpbmcgc3Vic3lzdGVtX2lkIGhhdmUgYSBsaW5rIHN0YXRlIGluZGljYXRpb24KKyAqIHByb2JsZW0sIDYwMEIsIDYwMEMsIDYwMEQsIDY0MEIsIDY0MEMgYW5kIDY0MEQuCisgKiBtYWNybyBiZWxvdyBpZGVudGlmaWVzIHRoZXNlIGNhcmRzIGdpdmVuIHRoZSBzdWJzeXN0ZW1faWQuCisgKi8KKyNkZWZpbmUgQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKHN1YmlkKSBcCisJCSgoKHN1YmlkID49IDB4NjAwQikgJiYgKHN1YmlkIDw9IDB4NjAwRCkpIHx8IFwKKwkJICgoc3ViaWQgPj0gMHg2NDBCKSAmJiAoc3ViaWQgPD0gMHg2NDBEKSkpID8gMSA6IDAKKworI2RlZmluZSBMSU5LX0lTX1VQKHZhbDY0KSAoISh2YWw2NCAmIChBREFQVEVSX1NUQVRVU19STUFDX1JFTU9URV9GQVVMVCB8IFwKKwkJCQkgICAgICBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUKSkpCisjZGVmaW5lIFRBU0tMRVRfSU5fVVNFIHRlc3RfYW5kX3NldF9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKQorI2RlZmluZSBQQU5JQwkxCisjZGVmaW5lIExPVwkyCitzdGF0aWMgaW5saW5lIGludCByeF9idWZmZXJfbGV2ZWwobmljX3QgKiBzcCwgaW50IHJ4Yl9zaXplLCBpbnQgcmluZykKK3sKKwlpbnQgbGV2ZWwgPSAwOworCWlmICgoc3AtPnBrdF9jbnRbcmluZ10gLSByeGJfc2l6ZSkgPiAxNikgeworCQlsZXZlbCA9IExPVzsKKwkJaWYgKChzcC0+cGt0X2NudFtyaW5nXSAtIHJ4Yl9zaXplKSA8IE1BWF9SWERTX1BFUl9CTE9DSykgeworCQkJbGV2ZWwgPSBQQU5JQzsKKwkJfQorCX0KKworCXJldHVybiBsZXZlbDsKK30KKworLyogRXRodG9vbCByZWxhdGVkIHZhcmlhYmxlcyBhbmQgTWFjcm9zLiAqLworc3RhdGljIGNoYXIgczJpb19nc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIlJlZ2lzdGVyIHRlc3RcdChvZmZsaW5lKSIsCisJIkVlcHJvbSB0ZXN0XHQob2ZmbGluZSkiLAorCSJMaW5rIHRlc3RcdChvbmxpbmUpIiwKKwkiUkxEUkFNIHRlc3RcdChvZmZsaW5lKSIsCisJIkJJU1QgVGVzdFx0KG9mZmxpbmUpIgorfTsKKworc3RhdGljIGNoYXIgZXRodG9vbF9zdGF0c19rZXlzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwl7InRtYWNfZnJtcyJ9LAorCXsidG1hY19kYXRhX29jdGV0cyJ9LAorCXsidG1hY19kcm9wX2ZybXMifSwKKwl7InRtYWNfbWNzdF9mcm1zIn0sCisJeyJ0bWFjX2Jjc3RfZnJtcyJ9LAorCXsidG1hY19wYXVzZV9jdHJsX2ZybXMifSwKKwl7InRtYWNfYW55X2Vycl9mcm1zIn0sCisJeyJ0bWFjX3ZsZF9pcF9vY3RldHMifSwKKwl7InRtYWNfdmxkX2lwIn0sCisJeyJ0bWFjX2Ryb3BfaXAifSwKKwl7InRtYWNfaWNtcCJ9LAorCXsidG1hY19yc3RfdGNwIn0sCisJeyJ0bWFjX3RjcCJ9LAorCXsidG1hY191ZHAifSwKKwl7InJtYWNfdmxkX2ZybXMifSwKKwl7InJtYWNfZGF0YV9vY3RldHMifSwKKwl7InJtYWNfZmNzX2Vycl9mcm1zIn0sCisJeyJybWFjX2Ryb3BfZnJtcyJ9LAorCXsicm1hY192bGRfbWNzdF9mcm1zIn0sCisJeyJybWFjX3ZsZF9iY3N0X2ZybXMifSwKKwl7InJtYWNfaW5fcm5nX2xlbl9lcnJfZnJtcyJ9LAorCXsicm1hY19sb25nX2ZybXMifSwKKwl7InJtYWNfcGF1c2VfY3RybF9mcm1zIn0sCisJeyJybWFjX2Rpc2NhcmRlZF9mcm1zIn0sCisJeyJybWFjX3VzaXplZF9mcm1zIn0sCisJeyJybWFjX29zaXplZF9mcm1zIn0sCisJeyJybWFjX2ZyYWdfZnJtcyJ9LAorCXsicm1hY19qYWJiZXJfZnJtcyJ9LAorCXsicm1hY19pcCJ9LAorCXsicm1hY19pcF9vY3RldHMifSwKKwl7InJtYWNfaGRyX2Vycl9pcCJ9LAorCXsicm1hY19kcm9wX2lwIn0sCisJeyJybWFjX2ljbXAifSwKKwl7InJtYWNfdGNwIn0sCisJeyJybWFjX3VkcCJ9LAorCXsicm1hY19lcnJfZHJwX3VkcCJ9LAorCXsicm1hY19wYXVzZV9jbnQifSwKKwl7InJtYWNfYWNjZXB0ZWRfaXAifSwKKwl7InJtYWNfZXJyX3RjcCJ9LAorfTsKKworI2RlZmluZSBTMklPX1NUQVRfTEVOIHNpemVvZihldGh0b29sX3N0YXRzX2tleXMpLyBFVEhfR1NUUklOR19MRU4KKyNkZWZpbmUgUzJJT19TVEFUX1NUUklOR1NfTEVOIFMySU9fU1RBVF9MRU4gKiBFVEhfR1NUUklOR19MRU4KKworI2RlZmluZSBTMklPX1RFU1RfTEVOCXNpemVvZihzMmlvX2dzdHJpbmdzKSAvIEVUSF9HU1RSSU5HX0xFTgorI2RlZmluZSBTMklPX1NUUklOR1NfTEVOCVMySU9fVEVTVF9MRU4gKiBFVEhfR1NUUklOR19MRU4KKworCisvKiAKKyAqIENvbnN0YW50cyB0byBiZSBwcm9ncmFtbWVkIGludG8gdGhlIFhlbmEncyByZWdpc3RlcnMsIHRvIGNvbmZpZ3VyZQorICogdGhlIFhBVUkuCisgKi8KKworI2RlZmluZSBTV0lUQ0hfU0lHTgkweEE1QTVBNUE1QTVBNUE1QTVVTEwKKyNkZWZpbmUJRU5EX1NJR04JMHgwCisKK3N0YXRpYyB1NjQgZGVmYXVsdF9tZGlvX2NmZ1tdID0geworCS8qIFJlc2V0IFBNQSBQTEwgKi8KKwkweEMwMDEwMTAwMDAwMDAwMDBVTEwsIDB4QzAwMTAxMDAwMDAwMDBFMFVMTCwKKwkweEMwMDEwMTAwMDA4MDAwRTRVTEwsCisJLyogUmVtb3ZlIFJlc2V0IGZyb20gUE1BIFBMTCAqLworCTB4QzAwMTAxMDAwMDAwMDAwMFVMTCwgMHhDMDAxMDEwMDAwMDAwMEUwVUxMLAorCTB4QzAwMTAxMDAwMDAwMDBFNFVMTCwKKwlFTkRfU0lHTgorfTsKKworc3RhdGljIHU2NCBkZWZhdWx0X2R0eF9jZmdbXSA9IHsKKwkweDgwMDAwNTE1MDAwMDAwMDBVTEwsIDB4ODAwMDA1MTUwMDAwMDBFMFVMTCwKKwkweDgwMDAwNTE1RDkzNTAwRTRVTEwsIDB4ODAwMTA1MTUwMDAwMDAwMFVMTCwKKwkweDgwMDEwNTE1MDAwMDAwRTBVTEwsIDB4ODAwMTA1MTUwMDFFMDBFNFVMTCwKKwkweDgwMDIwNTE1MDAwMDAwMDBVTEwsIDB4ODAwMjA1MTUwMDAwMDBFMFVMTCwKKwkweDgwMDIwNTE1RjIxMDAwRTRVTEwsCisJLyogU2V0IFBBRExPT1BCQUNLTiAqLworCTB4ODAwMjA1MTUwMDAwMDAwMFVMTCwgMHg4MDAyMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMjA1MTVCMjAwMDBFNFVMTCwgMHg4MDAzMDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwMzA1MTUwMDAwMDBFMFVMTCwgMHg4MDAzMDUxNUIyMDAwMEU0VUxMLAorCTB4ODAwNDA1MTUwMDAwMDAwMFVMTCwgMHg4MDA0MDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwNDA1MTVCMjAwMDBFNFVMTCwgMHg4MDA1MDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwNTA1MTUwMDAwMDBFMFVMTCwgMHg4MDA1MDUxNUIyMDAwMEU0VUxMLAorCVNXSVRDSF9TSUdOLAorCS8qIFJlbW92ZSBQQURMT09QQkFDS04gKi8KKwkweDgwMDIwNTE1MDAwMDAwMDBVTEwsIDB4ODAwMjA1MTUwMDAwMDBFMFVMTCwKKwkweDgwMDIwNTE1RjIwMDAwRTRVTEwsIDB4ODAwMzA1MTUwMDAwMDAwMFVMTCwKKwkweDgwMDMwNTE1MDAwMDAwRTBVTEwsIDB4ODAwMzA1MTVGMjAwMDBFNFVMTCwKKwkweDgwMDQwNTE1MDAwMDAwMDBVTEwsIDB4ODAwNDA1MTUwMDAwMDBFMFVMTCwKKwkweDgwMDQwNTE1RjIwMDAwRTRVTEwsIDB4ODAwNTA1MTUwMDAwMDAwMFVMTCwKKwkweDgwMDUwNTE1MDAwMDAwRTBVTEwsIDB4ODAwNTA1MTVGMjAwMDBFNFVMTCwKKwlFTkRfU0lHTgorfTsKKworCisvKiAKKyAqIENvbnN0YW50cyBmb3IgRml4aW5nIHRoZSBNYWNBZGRyZXNzIHByb2JsZW0gc2VlbiBtb3N0bHkgb24KKyAqIEFscGhhIG1hY2hpbmVzLgorICovCitzdGF0aWMgdTY0IGZpeF9tYWNbXSA9IHsKKwkweDAwNjAwMDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwNDA2MDAwMDAwMDAwMDBVTEwsIDB4MDAwMDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwMjA2MDAwMDAwMDAwMDBVTEwsIDB4MDAwMDYwMDAwMDAwMDAwMFVMTCwKKwkweDAwNDA2MDAwMDAwMDAwMDBVTEwsIDB4MDA2MDYwMDAwMDAwMDAwMFVMTCwKKwlFTkRfU0lHTgorfTsKKworLyogTW9kdWxlIExvYWRhYmxlIHBhcmFtZXRlcnMuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHR4X2ZpZm9fbnVtID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfZmlmb19sZW5bTUFYX1RYX0ZJRk9TXSA9CisgICAge1swIC4uLihNQVhfVFhfRklGT1MgLSAxKV0gPSAwIH07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ4X3JpbmdfbnVtID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfcmluZ19zeltNQVhfUlhfUklOR1NdID0KKyAgICB7WzAgLi4uKE1BWF9SWF9SSU5HUyAtIDEpXSA9IDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgU3RhdHNfcmVmcmVzaF90aW1lID0gNDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm1hY19wYXVzZV90aW1lID0gNjU1MzU7CitzdGF0aWMgdW5zaWduZWQgaW50IG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzID0gMTg3Oworc3RhdGljIHVuc2lnbmVkIGludCBtY19wYXVzZV90aHJlc2hvbGRfcTRxNyA9IDE4NzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2hhcmVkX3NwbGl0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG1hY191dGlsX3BlcmlvZCA9IDU7CitzdGF0aWMgdW5zaWduZWQgaW50IHJtYWNfdXRpbF9wZXJpb2QgPSA1OworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgdW5zaWduZWQgaW50IGluZGljYXRlX21heF9wa3RzOworI2VuZGlmCisKKy8qIAorICogUzJJTyBkZXZpY2UgdGFibGUuCisgKiBUaGlzIHRhYmxlIGxpc3RzIGFsbCB0aGUgZGV2aWNlcyB0aGF0IHRoaXMgZHJpdmVyIHN1cHBvcnRzLiAKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHMyaW9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9TMklPLCBQQ0lfREVWSUNFX0lEX1MySU9fV0lOLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZFTkRPUl9JRF9TMklPLCBQQ0lfREVWSUNFX0lEX1MySU9fVU5JLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZFTkRPUl9JRF9TMklPLCBQQ0lfREVWSUNFX0lEX0hFUkNfV0lOLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZFTkRPUl9JRF9TMklPLCBQQ0lfREVWSUNFX0lEX0hFUkNfVU5JLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgczJpb190YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgczJpb19kcml2ZXIgPSB7CisgICAgICAubmFtZSA9ICJTMklPIiwKKyAgICAgIC5pZF90YWJsZSA9IHMyaW9fdGJsLAorICAgICAgLnByb2JlID0gczJpb19pbml0X25pYywKKyAgICAgIC5yZW1vdmUgPSBfX2RldmV4aXRfcChzMmlvX3JlbV9uaWMpLAorfTsKKworLyogQSBzaW1wbGlmaWVyIG1hY3JvIHVzZWQgYm90aCBieSBpbml0IGFuZCBmcmVlIHNoYXJlZF9tZW0gRm5zKCkuICovCisjZGVmaW5lIFRYRF9NRU1fUEFHRV9DTlQobGVuLCBwZXJfZWFjaCkgKChsZW4rcGVyX2VhY2ggLSAxKSAvIHBlcl9lYWNoKQorCisvKioKKyAqIGluaXRfc2hhcmVkX21lbSAtIEFsbG9jYXRpb24gYW5kIEluaXRpYWxpemF0aW9uIG9mIE1lbW9yeQorICogQG5pYzogRGV2aWNlIHByaXZhdGUgdmFyaWFibGUuCisgKiBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbGwgdGhlIG1lbW9yeSBhcmVhcyBzaGFyZWQgCisgKiBiZXR3ZWVuIHRoZSBOSUMgYW5kIHRoZSBkcml2ZXIuIFRoaXMgaW5jbHVkZXMgVHggZGVzY3JpcHRvcnMsIAorICogUnggZGVzY3JpcHRvcnMgYW5kIHRoZSBzdGF0aXN0aWNzIGJsb2NrLgorICovCisKK3N0YXRpYyBpbnQgaW5pdF9zaGFyZWRfbWVtKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCXUzMiBzaXplOworCXZvaWQgKnRtcF92X2FkZHIsICp0bXBfdl9hZGRyX25leHQ7CisJZG1hX2FkZHJfdCB0bXBfcF9hZGRyLCB0bXBfcF9hZGRyX25leHQ7CisJUnhEX2Jsb2NrX3QgKnByZV9yeGRfYmxrID0gTlVMTDsKKwlpbnQgaSwgaiwgYmxrX2NudDsKKwlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCisJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgVFhETHMgaW4gRklPRnMgKi8KKwlzaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCXNpemUgKz0gY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW47CisJfQorCWlmIChzaXplID4gTUFYX0FWQUlMQUJMRV9UWERTKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRvdGFsIG51bWJlciBvZiBUeCBGSUZPcyAiLAorCQkJICBkZXYtPm5hbWUpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgImV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgIik7CisJCURCR19QUklOVChFUlJfREJHLCAidGhhdCBjYW4gYmUgdXNlZFxuIik7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCWxzdF9zaXplID0gKHNpemVvZihUeERfdCkgKiBjb25maWctPm1heF90eGRzKTsKKwlsc3RfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBsc3Rfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJaW50IGZpZm9fbGVuID0gY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW47CisJCWludCBsaXN0X2hvbGRlcl9zaXplID0gZmlmb19sZW4gKiBzaXplb2YobGlzdF9pbmZvX2hvbGRfdCk7CisJCW5pYy0+bGlzdF9pbmZvW2ldID0ga21hbGxvYyhsaXN0X2hvbGRlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuaWMtPmxpc3RfaW5mb1tpXSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAiTWFsbG9jIGZhaWxlZCBmb3IgbGlzdF9pbmZvXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChuaWMtPmxpc3RfaW5mb1tpXSwgMCwgbGlzdF9ob2xkZXJfc2l6ZSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJaW50IHBhZ2VfbnVtID0gVFhEX01FTV9QQUdFX0NOVChjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiwKKwkJCQkJCWxzdF9wZXJfcGFnZSk7CisJCW1hY19jb250cm9sLT50eF9jdXJyX3B1dF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCW1hY19jb250cm9sLT50eF9jdXJyX3B1dF9pbmZvW2ldLmZpZm9fbGVuID0KKwkJICAgIGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuIC0gMTsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV0uZmlmb19sZW4gPQorCQkgICAgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOworCQlmb3IgKGogPSAwOyBqIDwgcGFnZV9udW07IGorKykgeworCQkJaW50IGsgPSAwOworCQkJZG1hX2FkZHJfdCB0bXBfcDsKKwkJCXZvaWQgKnRtcF92OworCQkJdG1wX3YgPSBwY2lfYWxsb2NfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCQkJCQkgICAgIFBBR0VfU0laRSwgJnRtcF9wKTsKKwkJCWlmICghdG1wX3YpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkJICAicGNpX2FsbG9jX2NvbnNpc3RlbnQgIik7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJd2hpbGUgKGsgPCBsc3RfcGVyX3BhZ2UpIHsKKwkJCQlpbnQgbCA9IChqICogbHN0X3Blcl9wYWdlKSArIGs7CisJCQkJaWYgKGwgPT0gY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4pCisJCQkJCWdvdG8gZW5kX3R4ZF9hbGxvYzsKKwkJCQluaWMtPmxpc3RfaW5mb1tpXVtsXS5saXN0X3ZpcnRfYWRkciA9CisJCQkJICAgIHRtcF92ICsgKGsgKiBsc3Rfc2l6ZSk7CisJCQkJbmljLT5saXN0X2luZm9baV1bbF0ubGlzdF9waHlfYWRkciA9CisJCQkJICAgIHRtcF9wICsgKGsgKiBsc3Rfc2l6ZSk7CisJCQkJaysrOworCQkJfQorCQl9CisJfQorICAgICAgZW5kX3R4ZF9hbGxvYzoKKworCS8qIEFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIG9mIFJYRHMgaW4gUmluZ3MgKi8KKwlzaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWlmIChjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkICUgKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBSeEQgY291bnQgb2YgIiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiUmluZyVkIGlzIG5vdCBhIG11bHRpcGxlIG9mICIsCisJCQkJICBpKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiUnhEcyBwZXIgQmxvY2siKTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9CisJCXNpemUgKz0gY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZDsKKwkJbmljLT5ibG9ja19jb3VudFtpXSA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC8gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQluaWMtPnBrdF9jbnRbaV0gPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAtIG5pYy0+YmxvY2tfY291bnRbaV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5ibG9ja19pbmRleCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLnJpbmdfbGVuID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLSAxOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXS5ibG9ja19pbmRleCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLnJpbmdfbGVuID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLSAxOworCQlibGtfY250ID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLyAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCS8qICBBbGxvY2F0aW5nIGFsbCB0aGUgUnggYmxvY2tzICovCisJCWZvciAoaiA9IDA7IGogPCBibGtfY250OyBqKyspIHsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJCXNpemUgPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkgKiAoc2l6ZW9mKFJ4RF90KSk7CisjZWxzZQorCQkJc2l6ZSA9IFNJWkVfT0ZfQkxPQ0s7CisjZW5kaWYKKwkJCXRtcF92X2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChuaWMtPnBkZXYsIHNpemUsCisJCQkJCQkJICAmdG1wX3BfYWRkcik7CisJCQlpZiAodG1wX3ZfYWRkciA9PSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBJbiBjYXNlIG9mIGZhaWx1cmUsIGZyZWVfc2hhcmVkX21lbSgpIAorCQkJCSAqIGlzIGNhbGxlZCwgd2hpY2ggc2hvdWxkIGZyZWUgYW55IAorCQkJCSAqIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2VkIHRpbGwgdGhlIAorCQkJCSAqIGZhaWx1cmUgaGFwcGVuZWQuCisJCQkJICovCisJCQkJbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyID0KKwkJCQkgICAgdG1wX3ZfYWRkcjsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCW1lbXNldCh0bXBfdl9hZGRyLCAwLCBzaXplKTsKKwkJCW5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX3ZpcnRfYWRkciA9IHRtcF92X2FkZHI7CisJCQluaWMtPnJ4X2Jsb2Nrc1tpXVtqXS5ibG9ja19kbWFfYWRkciA9IHRtcF9wX2FkZHI7CisJCX0KKwkJLyogSW50ZXJsaW5raW5nIGFsbCBSeCBCbG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgeworCQkJdG1wX3ZfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX3ZpcnRfYWRkcjsKKwkJCXRtcF92X2FkZHJfbmV4dCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bKGogKyAxKSAlCisJCQkJCSAgICAgIGJsa19jbnRdLmJsb2NrX3ZpcnRfYWRkcjsKKwkJCXRtcF9wX2FkZHIgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtqXS5ibG9ja19kbWFfYWRkcjsKKwkJCXRtcF9wX2FkZHJfbmV4dCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bKGogKyAxKSAlCisJCQkJCSAgICAgIGJsa19jbnRdLmJsb2NrX2RtYV9hZGRyOworCisJCQlwcmVfcnhkX2JsayA9IChSeERfYmxvY2tfdCAqKSB0bXBfdl9hZGRyOworCQkJcHJlX3J4ZF9ibGstPnJlc2VydmVkXzEgPSBFTkRfT0ZfQkxPQ0s7CS8qIGxhc3QgUnhEIAorCQkJCQkJCQkgKiBtYXJrZXIuCisJCQkJCQkJCSAqLworI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQkJcHJlX3J4ZF9ibGstPnJlc2VydmVkXzJfcE5leHRfUnhEX2Jsb2NrID0KKwkJCSAgICAodW5zaWduZWQgbG9uZykgdG1wX3ZfYWRkcl9uZXh0OworI2VuZGlmCisJCQlwcmVfcnhkX2Jsay0+cE5leHRfUnhEX0Jsa19waHlzaWNhbCA9CisJCQkgICAgKHU2NCkgdG1wX3BfYWRkcl9uZXh0OworCQl9CisJfQorCisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwkvKiAKKwkgKiBBbGxvY2F0aW9uIG9mIFN0b3JhZ2VzIGZvciBidWZmZXIgYWRkcmVzc2VzIGluIDJCVUZGIG1vZGUKKwkgKiBhbmQgdGhlIGJ1ZmZlcnMgYXMgd2VsbC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWJsa19jbnQgPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAvIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJbmljLT5iYVtpXSA9IGttYWxsb2MoKHNpemVvZihidWZmQWRkX3QgKikgKiBibGtfY250KSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIW5pYy0+YmFbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgeworCQkJaW50IGsgPSAwOworCQkJbmljLT5iYVtpXVtqXSA9IGttYWxsb2MoKHNpemVvZihidWZmQWRkX3QpICoKKwkJCQkJCSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW5pYy0+YmFbaV1bal0pCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl3aGlsZSAoayAhPSBNQVhfUlhEU19QRVJfQkxPQ0spIHsKKwkJCQliYSA9ICZuaWMtPmJhW2ldW2pdW2tdOworCisJCQkJYmEtPmJhXzBfb3JnID0ga21hbGxvYworCQkJCSAgICAoQlVGMF9MRU4gKyBBTElHTl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIWJhLT5iYV8wX29yZykKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGJhLT5iYV8wX29yZzsKKwkJCQl0bXAgKz0gQUxJR05fU0laRTsKKwkJCQl0bXAgJj0gfigodW5zaWduZWQgbG9uZykgQUxJR05fU0laRSk7CisJCQkJYmEtPmJhXzAgPSAodm9pZCAqKSB0bXA7CisKKwkJCQliYS0+YmFfMV9vcmcgPSBrbWFsbG9jCisJCQkJICAgIChCVUYxX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOworCQkJCWlmICghYmEtPmJhXzFfb3JnKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgYmEtPmJhXzFfb3JnOworCQkJCXRtcCArPSBBTElHTl9TSVpFOworCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKKwkJCQliYS0+YmFfMSA9ICh2b2lkICopIHRtcDsKKwkJCQlrKys7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIEFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIG9mIFN0YXRpc3RpY3MgYmxvY2sgKi8KKwlzaXplID0gc2l6ZW9mKFN0YXRJbmZvX3QpOworCW1hY19jb250cm9sLT5zdGF0c19tZW0gPSBwY2lfYWxsb2NfY29uc2lzdGVudAorCSAgICAobmljLT5wZGV2LCBzaXplLCAmbWFjX2NvbnRyb2wtPnN0YXRzX21lbV9waHkpOworCisJaWYgKCFtYWNfY29udHJvbC0+c3RhdHNfbWVtKSB7CisJCS8qIAorCQkgKiBJbiBjYXNlIG9mIGZhaWx1cmUsIGZyZWVfc2hhcmVkX21lbSgpIGlzIGNhbGxlZCwgd2hpY2ggCisJCSAqIHNob3VsZCBmcmVlIGFueSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NlZCB0aWxsIHRoZSAKKwkJICogZmFpbHVyZSBoYXBwZW5lZC4KKwkJICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKwltYWNfY29udHJvbC0+c3RhdHNfbWVtX3N6ID0gc2l6ZTsKKworCXRtcF92X2FkZHIgPSBtYWNfY29udHJvbC0+c3RhdHNfbWVtOworCW1hY19jb250cm9sLT5zdGF0c19pbmZvID0gKFN0YXRJbmZvX3QgKikgdG1wX3ZfYWRkcjsKKwltZW1zZXQodG1wX3ZfYWRkciwgMCwgc2l6ZSk7CisKKwlEQkdfUFJJTlQoSU5JVF9EQkcsICIlczpSaW5nIE1lbSBQSFk6IDB4JWxseFxuIiwgZGV2LT5uYW1lLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRtcF9wX2FkZHIpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKiAgCisgKiBmcmVlX3NoYXJlZF9tZW0gLSBGcmVlIHRoZSBhbGxvY2F0ZWQgTWVtb3J5IAorICogQG5pYzogIERldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdG8gZnJlZSBhbGwgbWVtb3J5IGxvY2F0aW9ucyBhbGxvY2F0ZWQgYnkKKyAqIHRoZSBpbml0X3NoYXJlZF9tZW0oKSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0IHRvIHRoZSBrZXJuZWwuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9zaGFyZWRfbWVtKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCWludCBpLCBqLCBibGtfY250LCBzaXplOworCXZvaWQgKnRtcF92X2FkZHI7CisJZG1hX2FkZHJfdCB0bXBfcF9hZGRyOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKwlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKKworCisJaWYgKCFuaWMpCisJCXJldHVybjsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJbHN0X3NpemUgPSAoc2l6ZW9mKFR4RF90KSAqIGNvbmZpZy0+bWF4X3R4ZHMpOworCWxzdF9wZXJfcGFnZSA9IFBBR0VfU0laRSAvIGxzdF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlpbnQgcGFnZV9udW0gPSBUWERfTUVNX1BBR0VfQ05UKGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuLAorCQkJCQkJbHN0X3Blcl9wYWdlKTsKKwkJZm9yIChqID0gMDsgaiA8IHBhZ2VfbnVtOyBqKyspIHsKKwkJCWludCBtZW1fYmxrcyA9IChqICogbHN0X3Blcl9wYWdlKTsKKwkJCWlmICghbmljLT5saXN0X2luZm9baV1bbWVtX2Jsa3NdLmxpc3RfdmlydF9hZGRyKQorCQkJCWJyZWFrOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChuaWMtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgIG5pYy0+bGlzdF9pbmZvW2ldW21lbV9ibGtzXS4KKwkJCQkJICAgIGxpc3RfdmlydF9hZGRyLAorCQkJCQkgICAgbmljLT5saXN0X2luZm9baV1bbWVtX2Jsa3NdLgorCQkJCQkgICAgbGlzdF9waHlfYWRkcik7CisJCX0KKwkJa2ZyZWUobmljLT5saXN0X2luZm9baV0pOworCX0KKworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXNpemUgPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkgKiAoc2l6ZW9mKFJ4RF90KSk7CisjZWxzZQorCXNpemUgPSBTSVpFX09GX0JMT0NLOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlibGtfY250ID0gbmljLT5ibG9ja19jb3VudFtpXTsKKwkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgeworCQkJdG1wX3ZfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX3ZpcnRfYWRkcjsKKwkJCXRtcF9wX2FkZHIgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtqXS5ibG9ja19kbWFfYWRkcjsKKwkJCWlmICh0bXBfdl9hZGRyID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZSwKKwkJCQkJICAgIHRtcF92X2FkZHIsIHRtcF9wX2FkZHIpOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwkvKiBGcmVlaW5nIGJ1ZmZlciBzdG9yYWdlIGFkZHJlc3NlcyBpbiAyQlVGRiBtb2RlLiAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJYmxrX2NudCA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC8gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQlpZiAoIW5pYy0+YmFbaV0pCisJCQlnb3RvIGVuZF9mcmVlOworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQlpbnQgayA9IDA7CisJCQlpZiAoIW5pYy0+YmFbaV1bal0pIHsKKwkJCQlrZnJlZShuaWMtPmJhW2ldKTsKKwkJCQlnb3RvIGVuZF9mcmVlOworCQkJfQorCQkJd2hpbGUgKGsgIT0gTUFYX1JYRFNfUEVSX0JMT0NLKSB7CisJCQkJYnVmZkFkZF90ICpiYSA9ICZuaWMtPmJhW2ldW2pdW2tdOworCQkJCWlmICghYmEgfHwgIWJhLT5iYV8wX29yZyB8fCAhYmEtPmJhXzFfb3JnKQorCQkJCXsKKwkJCQkJa2ZyZWUobmljLT5iYVtpXSk7CisJCQkJCWtmcmVlKG5pYy0+YmFbaV1bal0pOworCQkJCQlpZihiYS0+YmFfMF9vcmcpCisJCQkJCQlrZnJlZShiYS0+YmFfMF9vcmcpOworCQkJCQlpZihiYS0+YmFfMV9vcmcpCisJCQkJCQlrZnJlZShiYS0+YmFfMV9vcmcpOworCQkJCQlnb3RvIGVuZF9mcmVlOworCQkJCX0KKwkJCQlrZnJlZShiYS0+YmFfMF9vcmcpOworCQkJCWtmcmVlKGJhLT5iYV8xX29yZyk7CisJCQkJaysrOworCQkJfQorCQkJa2ZyZWUobmljLT5iYVtpXVtqXSk7CisJCX0KKwkJa2ZyZWUobmljLT5iYVtpXSk7CisJfQorZW5kX2ZyZWU6CisjZW5kaWYKKworCWlmIChtYWNfY29udHJvbC0+c3RhdHNfbWVtKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LAorCQkJCSAgICBtYWNfY29udHJvbC0+c3RhdHNfbWVtX3N6LAorCQkJCSAgICBtYWNfY29udHJvbC0+c3RhdHNfbWVtLAorCQkJCSAgICBtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSk7CisJfQorfQorCisvKiogIAorICogIGluaXRfbmljIC0gSW5pdGlhbGl6YXRpb24gb2YgaGFyZHdhcmUgCisgKiAgQG5pYzogZGV2aWNlIHBlaXZhdGUgdmFyaWFibGUKKyAqICBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHNlcXVlbnRpYWxseSBjb25maWd1cmVzIGV2ZXJ5IGJsb2NrIAorICogIG9mIHRoZSBIL1cgZnJvbSB0aGVpciByZXNldCB2YWx1ZXMuIAorICogIFJldHVybiBWYWx1ZTogIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgCisgKiAgJy0xJyBvbiBmYWlsdXJlIChlbmRpYW4gc2V0dGluZ3MgaW5jb3JyZWN0KS4KKyAqLworCitzdGF0aWMgaW50IGluaXRfbmljKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisJdm9pZCBfX2lvbWVtICphZGQ7CisJdTMyIHRpbWU7CisJaW50IGksIGo7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCWludCBtZGlvX2NudCA9IDAsIGR0eF9jbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtZW1fc2hhcmU7CisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qIEluaXRpYWxpemUgc3dhcHBlciBjb250cm9sIHJlZ2lzdGVyICovCisJaWYgKHMyaW9fc2V0X3N3YXBwZXIobmljKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywiRVJST1I6IFNldHRpbmcgU3dhcHBlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUmVtb3ZlIFhHWFMgZnJvbSByZXNldCBzdGF0ZSAqLworCXZhbDY0ID0gMDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zd19yZXNldCk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+c3dfcmVzZXQpOworCW1zbGVlcCg1MDApOworCisJLyogIEVuYWJsZSBSZWNlaXZpbmcgYnJvYWRjYXN0cyAqLworCWFkZCA9ICZiYXIwLT5tYWNfY2ZnOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCXZhbDY0IHw9IE1BQ19STUFDX0JDQVNUX0VOQUJMRTsKKwl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCXdyaXRlbCgodTMyKSB2YWw2NCwgYWRkKTsKKwl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCXdyaXRlbCgodTMyKSAodmFsNjQgPj4gMzIpLCAoYWRkICsgNCkpOworCisJLyogUmVhZCByZWdpc3RlcnMgaW4gYWxsIGJsb2NrcyAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19pbnRfbWFzayk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfaW50X21hc2spOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnhneHNfaW50X21hc2spOworCisJLyogIFNldCBNVFUgKi8KKwl2YWw2NCA9IGRldi0+bXR1OworCXdyaXRlcSh2QklUKHZhbDY0LCAyLCAxNCksICZiYXIwLT5ybWFjX21heF9weWxkX2xlbik7CisKKwkvKiAKKwkgKiBDb25maWd1cmluZyB0aGUgWEFVSSBJbnRlcmZhY2Ugb2YgWGVuYS4gCisJICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVG8gQ29uZmlndXJlIHRoZSBYZW5hJ3MgWEFVSSwgb25lIGhhcyB0byB3cml0ZSBhIHNlcmllcyAKKwkgKiBvZiA2NCBiaXQgdmFsdWVzIGludG8gdHdvIHJlZ2lzdGVycyBpbiBhIHBhcnRpY3VsYXIgCisJICogc2VxdWVuY2UuIEhlbmNlIGEgbWFjcm8gJ1NXSVRDSF9TSUdOJyBoYXMgYmVlbiBkZWZpbmVkIAorCSAqIHdoaWNoIHdpbGwgYmUgZGVmaW5lZCBpbiB0aGUgYXJyYXkgb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMgCisJICogKGRlZmF1bHRfZHR4X2NmZyAmIGRlZmF1bHRfbWRpb19jZmcpIGF0IGFwcHJvcHJpYXRlIHBsYWNlcyAKKwkgKiB0byBzd2l0Y2ggd3JpdGluZyBmcm9tIG9uZSByZWdzaXRlciB0byBhbm90aGVyLiBXZSBjb250aW51ZSAKKwkgKiB3cml0aW5nIHRoZXNlIHZhbHVlcyB1bnRpbCB3ZSBlbmNvdW50ZXIgdGhlICdFTkRfU0lHTicgbWFjcm8uCisJICogRm9yIGV4YW1wbGUsIEFmdGVyIG1ha2luZyBhIHNlcmllcyBvZiAyMSB3cml0ZXMgaW50byAKKwkgKiBkdHhfY29udHJvbCByZWdpc3RlciB0aGUgJ1NXSVRDSF9TSUdOJyBhcHBlYXJzIGFuZCBoZW5jZSB3ZSAKKwkgKiBzdGFydCB3cml0aW5nIGludG8gbWRpb19jb250cm9sIHVudGlsIHdlIGVuY291bnRlciBFTkRfU0lHTi4KKwkgKi8KKwl3aGlsZSAoMSkgeworCSAgICAgIGR0eF9jZmc6CisJCXdoaWxlIChkZWZhdWx0X2R0eF9jZmdbZHR4X2NudF0gIT0gRU5EX1NJR04pIHsKKwkJCWlmIChkZWZhdWx0X2R0eF9jZmdbZHR4X2NudF0gPT0gU1dJVENIX1NJR04pIHsKKwkJCQlkdHhfY250Kys7CisJCQkJZ290byBtZGlvX2NmZzsKKwkJCX0KKwkJCVNQRUNJQUxfUkVHX1dSSVRFKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSwKKwkJCQkJICAmYmFyMC0+ZHR4X2NvbnRyb2wsIFVGKTsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmR0eF9jb250cm9sKTsKKwkJCWR0eF9jbnQrKzsKKwkJfQorCSAgICAgIG1kaW9fY2ZnOgorCQl3aGlsZSAoZGVmYXVsdF9tZGlvX2NmZ1ttZGlvX2NudF0gIT0gRU5EX1NJR04pIHsKKwkJCWlmIChkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSA9PSBTV0lUQ0hfU0lHTikgeworCQkJCW1kaW9fY250Kys7CisJCQkJZ290byBkdHhfY2ZnOworCQkJfQorCQkJU1BFQ0lBTF9SRUdfV1JJVEUoZGVmYXVsdF9tZGlvX2NmZ1ttZGlvX2NudF0sCisJCQkJCSAgJmJhcjAtPm1kaW9fY29udHJvbCwgVUYpOworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWRpb19jb250cm9sKTsKKwkJCW1kaW9fY250Kys7CisJCX0KKwkJaWYgKChkZWZhdWx0X2R0eF9jZmdbZHR4X2NudF0gPT0gRU5EX1NJR04pICYmCisJCSAgICAoZGVmYXVsdF9tZGlvX2NmZ1ttZGlvX2NudF0gPT0gRU5EX1NJR04pKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gZHR4X2NmZzsKKwkJfQorCX0KKworCS8qICBUeCBETUEgSW5pdGlhbGl6YXRpb24gKi8KKwl2YWw2NCA9IDA7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMSk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMik7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMyk7CisKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCXZhbDY0IHw9CisJCSAgICB2QklUKGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuIC0gMSwgKChpICogMzIpICsgMTkpLAorCQkJIDEzKSB8IHZCSVQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19wcmlvcml0eSwKKwkJCQkgICAgKChpICogMzIpICsgNSksIDMpOworCisJCWlmIChpID09IChjb25maWctPnR4X2ZpZm9fbnVtIC0gMSkpIHsKKwkJCWlmIChpICUgMiA9PSAwKQorCQkJCWkrKzsKKwkJfQorCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDE6CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwkJCXZhbDY0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8xKTsKKwkJCXZhbDY0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8yKTsKKwkJCXZhbDY0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRW5hYmxlIFR4IEZJRk8gcGFydGl0aW9uIDAuICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCk7CisJdmFsNjQgfD0gQklUKDApOwkvKiBUbyBlbmFibGUgdGhlIEZJRk8gcGFydGl0aW9uLiAqLworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzApOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCk7CisJREJHX1BSSU5UKElOSVRfREJHLCAiRmlmbyBwYXJ0aXRpb24gYXQ6IDB4JXAgaXM6IDB4JWxseFxuIiwKKwkJICAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsNjQpOworCisJLyogCisJICogSW5pdGlhbGl6YXRpb24gb2YgVHhfUEFfQ09ORklHIHJlZ2lzdGVyIHRvIGlnbm9yZSBwYWNrZXQgCisJICogaW50ZWdyaXR5IGNoZWNraW5nLgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnR4X3BhX2NmZyk7CisJdmFsNjQgfD0gVFhfUEFfQ0ZHX0lHTk9SRV9GUk1fRVJSIHwgVFhfUEFfQ0ZHX0lHTk9SRV9TTkFQX09VSSB8CisJICAgIFRYX1BBX0NGR19JR05PUkVfTExDX0NUUkwgfCBUWF9QQV9DRkdfSUdOT1JFX0wyX0VSUjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9wYV9jZmcpOworCisJLyogUnggRE1BIGludGlhbGl6YXRpb24uICovCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJdmFsNjQgfD0KKwkJICAgIHZCSVQoY29uZmlnLT5yeF9jZmdbaV0ucmluZ19wcmlvcml0eSwgKDUgKyAoaSAqIDgpKSwKKwkJCSAzKTsKKwl9CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfcXVldWVfcHJpb3JpdHkpOworCisJLyogCisJICogQWxsb2NhdGluZyBlcXVhbCBzaGFyZSBvZiBtZW1vcnkgdG8gYWxsIHRoZSAKKwkgKiBjb25maWd1cmVkIFJpbmdzLgorCSAqLworCXZhbDY0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtICsKKwkJCQkgICAgIDY0ICUgY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTBfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDE6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RMV9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgMjoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1EyX1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSAzOgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTNfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDQ6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RNF9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgNToKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1E1X1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSA2OgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTZfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDc6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RN19TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCX0KKwl9CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfcXVldWVfY2ZnKTsKKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgVHggcm91bmQgcm9iaW4gcmVnaXN0ZXJzIHRvIDAuCisJICogRmlsbGluZyBUeCBhbmQgUnggcm91bmQgcm9iaW4gcmVnaXN0ZXJzIGFzIHBlciB0aGUgCisJICogbnVtYmVyIG9mIEZJRk9zIGFuZCBSaW5ncyBpcyBzdGlsbCBUT0RPLgorCSAqLworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl8wKTsKKwl3cml0ZXEoMCwgJmJhcjAtPnR4X3dfcm91bmRfcm9iaW5fMSk7CisJd3JpdGVxKDAsICZiYXIwLT50eF93X3JvdW5kX3JvYmluXzIpOworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl8zKTsKKwl3cml0ZXEoMCwgJmJhcjAtPnR4X3dfcm91bmRfcm9iaW5fNCk7CisKKwkvKiAKKwkgKiBUT0RPCisJICogRGlzYWJsZSBSeCBzdGVlcmluZy4gSGFyZCBjb2RpbmcgYWxsIHBhY2tldHMgYmUgc3RlZXJlZCB0bworCSAqIFF1ZXVlIDAgZm9yIG5vdy4gCisJICovCisJdmFsNjQgPSAweDgwODA4MDgwODA4MDgwODBVTEw7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRzX3Fvc19zdGVlcmluZyk7CisKKwkvKiBVRFAgRml4ICovCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ0c19mcm1fbGVuX25baV0pOworCisJLyogU2V0IHJ0c19mcm1fbGVuIHJlZ2lzdGVyIGZvciBmaWZvIDAgKi8KKwl3cml0ZXEoTUFDX1JUU19GUk1fTEVOX1NFVChkZXYtPm10dSArIDIyKSwKKwkgICAgICAgJmJhcjAtPnJ0c19mcm1fbGVuX25bMF0pOworCisJLyogRW5hYmxlIHN0YXRpc3RpY3MgKi8KKwl3cml0ZXEobWFjX2NvbnRyb2wtPnN0YXRzX21lbV9waHksICZiYXIwLT5zdGF0X2FkZHIpOworCXZhbDY0ID0gU0VUX1VQRFRfUEVSSU9EKFN0YXRzX3JlZnJlc2hfdGltZSkgfAorCSAgICBTVEFUX0NGR19TVEFUX1JPIHwgU1RBVF9DRkdfU1RBVF9FTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zdGF0X2NmZyk7CisKKwkvKiAKKwkgKiBJbml0aWFsaXppbmcgdGhlIHNhbXBsaW5nIHJhdGUgZm9yIHRoZSBkZXZpY2UgdG8gY2FsY3VsYXRlIHRoZQorCSAqIGJhbmR3aWR0aCB1dGlsaXphdGlvbi4KKwkgKi8KKwl2YWw2NCA9IE1BQ19UWF9MSU5LX1VUSUxfVkFMKHRtYWNfdXRpbF9wZXJpb2QpIHwKKwkgICAgTUFDX1JYX0xJTktfVVRJTF9WQUwocm1hY191dGlsX3BlcmlvZCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWFjX2xpbmtfdXRpbCk7CisKKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgVHJhbnNtaXQgYW5kIFJlY2VpdmUgVHJhZmZpYyBJbnRlcnJ1cHQgCisJICogU2NoZW1lLgorCSAqLworCS8qIFRUSSBJbml0aWFsaXphdGlvbi4gRGVmYXVsdCBUeCB0aW1lciBnZXRzIHVzIGFib3V0CisJICogMjUwIGludGVycnVwdHMgcGVyIHNlYy4gQ29udGludW91cyBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkCisJICogYnkgZGVmYXVsdC4KKwkgKi8KKwl2YWw2NCA9IFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfVkFMKDB4MjA3OCkgfAorCSAgICBUVElfREFUQTFfTUVNX1RYX1VSTkdfQSgweEEpIHwKKwkgICAgVFRJX0RBVEExX01FTV9UWF9VUk5HX0IoMHgxMCkgfAorCSAgICBUVElfREFUQTFfTUVNX1RYX1VSTkdfQygweDMwKSB8IFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQUNfRU4gfAorCQlUVElfREFUQTFfTUVNX1RYX1RJTUVSX0NJX0VOOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR0aV9kYXRhMV9tZW0pOworCisJdmFsNjQgPSBUVElfREFUQTJfTUVNX1RYX1VGQ19BKDB4MTApIHwKKwkgICAgVFRJX0RBVEEyX01FTV9UWF9VRkNfQigweDIwKSB8CisJICAgIFRUSV9EQVRBMl9NRU1fVFhfVUZDX0MoMHg0MCkgfCBUVElfREFUQTJfTUVNX1RYX1VGQ19EKDB4ODApOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR0aV9kYXRhMl9tZW0pOworCisJdmFsNjQgPSBUVElfQ01EX01FTV9XRSB8IFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR0aV9jb21tYW5kX21lbSk7CisKKwkvKiAKKwkgKiBPbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLCB0aGUgU3Ryb2JlIGJpdCBvZiB0aGUgY29tbWFuZAorCSAqIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQuIFdlIHBvbGwgZm9yIHRoaXMgcGFydGljdWxhciBjb25kaXRpb24KKwkgKiBXZSB3YWl0IGZvciBhIG1heGltdW0gb2YgNTAwbXMgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUsCisJICogaWYgaXQncyBub3QgY29tcGxldGUgYnkgdGhlbiB3ZSByZXR1cm4gZXJyb3IuCisJICovCisJdGltZSA9IDA7CisJd2hpbGUgKFRSVUUpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHRpX2NvbW1hbmRfbWVtKTsKKwkJaWYgKCEodmFsNjQgJiBUVElfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCkpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0aW1lID4gMTApIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRUSSBpbml0IEZhaWxlZFxuIiwKKwkJCQkgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbXNsZWVwKDUwKTsKKwkJdGltZSsrOworCX0KKworCS8qIFJUSSBJbml0aWFsaXphdGlvbiAqLworCXZhbDY0ID0gUlRJX0RBVEExX01FTV9SWF9USU1FUl9WQUwoMHhGRkYpIHwKKwkgICAgUlRJX0RBVEExX01FTV9SWF9VUk5HX0EoMHhBKSB8CisJICAgIFJUSV9EQVRBMV9NRU1fUlhfVVJOR19CKDB4MTApIHwKKwkgICAgUlRJX0RBVEExX01FTV9SWF9VUk5HX0MoMHgzMCkgfCBSVElfREFUQTFfTUVNX1JYX1RJTUVSX0FDX0VOOworCisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRpX2RhdGExX21lbSk7CisKKwl2YWw2NCA9IFJUSV9EQVRBMl9NRU1fUlhfVUZDX0EoMHgxKSB8CisJICAgIFJUSV9EQVRBMl9NRU1fUlhfVUZDX0IoMHgyKSB8CisJICAgIFJUSV9EQVRBMl9NRU1fUlhfVUZDX0MoMHg0MCkgfCBSVElfREFUQTJfTUVNX1JYX1VGQ19EKDB4ODApOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ0aV9kYXRhMl9tZW0pOworCisJdmFsNjQgPSBSVElfQ01EX01FTV9XRSB8IFJUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ0aV9jb21tYW5kX21lbSk7CisKKwkvKiAKKwkgKiBPbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLCB0aGUgU3Ryb2JlIGJpdCBvZiB0aGUgY29tbWFuZAorCSAqIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQuIFdlIHBvbGwgZm9yIHRoaXMgcGFydGljdWxhciBjb25kaXRpb24KKwkgKiBXZSB3YWl0IGZvciBhIG1heGltdW0gb2YgNTAwbXMgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUsCisJICogaWYgaXQncyBub3QgY29tcGxldGUgYnkgdGhlbiB3ZSByZXR1cm4gZXJyb3IuCisJICovCisJdGltZSA9IDA7CisJd2hpbGUgKFRSVUUpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnRpX2NvbW1hbmRfbWVtKTsKKwkJaWYgKCEodmFsNjQgJiBUVElfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCkpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0aW1lID4gMTApIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFJUSSBpbml0IEZhaWxlZFxuIiwKKwkJCQkgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdGltZSsrOworCQltc2xlZXAoNTApOworCX0KKworCS8qIAorCSAqIEluaXRpYWxpemluZyBwcm9wZXIgdmFsdWVzIGFzIFBhdXNlIHRocmVzaG9sZCBpbnRvIGFsbCAKKwkgKiB0aGUgOCBRdWV1ZXMgb24gUnggc2lkZS4KKwkgKi8KKwl3cml0ZXEoMHhmZmJiZmZiYmZmYmJmZmJiVUxMLCAmYmFyMC0+bWNfcGF1c2VfdGhyZXNoX3EwcTMpOworCXdyaXRlcSgweGZmYmJmZmJiZmZiYmZmYmJVTEwsICZiYXIwLT5tY19wYXVzZV90aHJlc2hfcTRxNyk7CisKKwkvKiBEaXNhYmxlIFJNQUMgUEFEIFNUUklQUElORyAqLworCWFkZCA9ICZiYXIwLT5tYWNfY2ZnOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCXZhbDY0ICY9IH4oTUFDX0NGR19STUFDX1NUUklQX1BBRCk7CisJd3JpdGVxKFJNQUNfQ0ZHX0tFWSgweDRDMEQpLCAmYmFyMC0+cm1hY19jZmdfa2V5KTsKKwl3cml0ZWwoKHUzMikgKHZhbDY0KSwgYWRkKTsKKwl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCXdyaXRlbCgodTMyKSAodmFsNjQgPj4gMzIpLCAoYWRkICsgNCkpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCisJLyogCisJICogU2V0IHRoZSB0aW1lIHZhbHVlIHRvIGJlIGluc2VydGVkIGluIHRoZSBwYXVzZSBmcmFtZSAKKwkgKiBnZW5lcmF0ZWQgYnkgeGVuYS4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJdmFsNjQgJj0gfihSTUFDX1BBVVNFX0hHX1BUSU1FKDB4ZmZmZikpOworCXZhbDY0IHw9IFJNQUNfUEFVU0VfSEdfUFRJTUUobmljLT5tYWNfY29udHJvbC5ybWFjX3BhdXNlX3RpbWUpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJtYWNfcGF1c2VfY2ZnKTsKKworCS8qIAorCSAqIFNldCB0aGUgVGhyZXNob2xkIExpbWl0IGZvciBHZW5lcmF0aW5nIHRoZSBwYXVzZSBmcmFtZQorCSAqIElmIHRoZSBhbW91bnQgb2YgZGF0YSBpbiBhbnkgUXVldWUgZXhjZWVkcyByYXRpbyBvZgorCSAqIChtYWNfY29udHJvbC5tY19wYXVzZV90aHJlc2hvbGRfcTBxMyBvciBxNHE3KS8yNTYKKwkgKiBwYXVzZSBmcmFtZSBpcyBnZW5lcmF0ZWQKKwkgKi8KKwl2YWw2NCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl2YWw2NCB8PQorCQkgICAgKCgodTY0KSAweEZGMDAgfCBuaWMtPm1hY19jb250cm9sLgorCQkgICAgICBtY19wYXVzZV90aHJlc2hvbGRfcTBxMykKKwkJICAgICA8PCAoaSAqIDIgKiA4KSk7CisJfQorCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3BhdXNlX3RocmVzaF9xMHEzKTsKKworCXZhbDY0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbDY0IHw9CisJCSAgICAoKCh1NjQpIDB4RkYwMCB8IG5pYy0+bWFjX2NvbnRyb2wuCisJCSAgICAgIG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3KQorCQkgICAgIDw8IChpICogMiAqIDgpKTsKKwl9CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcGF1c2VfdGhyZXNoX3E0cTcpOworCisJLyogCisJICogVHhETUEgd2lsbCBzdG9wIFJlYWQgcmVxdWVzdCBpZiB0aGUgbnVtYmVyIG9mIHJlYWQgc3BsaXQgaGFzIAorCSAqIGV4Y2VlZGVkIHRoZSBsaW1pdCBwb2ludGVkIGJ5IHNoYXJlZF9zcGxpdHMKKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5waWNfY29udHJvbCk7CisJdmFsNjQgfD0gUElDX0NOVExfU0hBUkVEX1NQTElUUyhzaGFyZWRfc3BsaXRzKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5waWNfY29udHJvbCk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqICAKKyAqICBlbl9kaXNfYWJsZV9uaWNfaW50cnMgLSBFbmFibGUgb3IgRGlzYWJsZSB0aGUgaW50ZXJydXB0cyAKKyAqICBAbmljOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZSwKKyAqICBAbWFzazogQSBtYXNrIGluZGljYXRpbmcgd2hpY2ggSW50ciBibG9jayBtdXN0IGJlIG1vZGlmaWVkIGFuZCwKKyAqICBAZmxhZzogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgSW50cnMuCisgKiAgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgZGlzYWJsZSBvciBlbmFibGUgdGhlIGludGVycnVwdHMKKyAqICBkZXBlbmRpbmcgb24gdGhlIGZsYWcgYXJndW1lbnQuIFRoZSBtYXNrIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIAorICogIGVuYWJsZS9kaXNhYmxlIGFueSBJbnRyIGJsb2NrLiAKKyAqICBSZXR1cm4gVmFsdWU6IE5PTkUuCisgKi8KKworc3RhdGljIHZvaWQgZW5fZGlzX2FibGVfbmljX2ludHJzKHN0cnVjdCBzMmlvX25pYyAqbmljLCB1MTYgbWFzaywgaW50IGZsYWcpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwLCB0ZW1wNjQgPSAwOworCisJLyogIFRvcCBsZXZlbCBpbnRlcnJ1cHQgY2xhc3NpZmljYXRpb24gKi8KKwkvKiAgUElDIEludGVycnVwdHMgKi8KKwlpZiAoKG1hc2sgJiAoVFhfUElDX0lOVFIgfCBSWF9QSUNfSU5UUikpKSB7CisJCS8qICBFbmFibGUgUElDIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAqLworCQl2YWw2NCA9IFRYUElDX0lOVF9NIHwgUElDX1JYX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qICAKKwkJCSAqIERpc2FibGVkIGFsbCBQQ0lYLCBGbGFzaCwgTURJTywgSUlDIGFuZCBHUElPCisJCQkgKiBpbnRlcnJ1cHRzIGZvciBub3cuIAorCQkJICogVE9ETyAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+cGljX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogTm8gTVNJIFN1cHBvcnQgaXMgYXZhaWxhYmxlIHByZXNlbnRseSwgc28gVFRJIGFuZAorCQkJICogUlRJIGludGVycnVwdHMgYXJlIGFsc28gZGlzYWJsZWQuCisJCQkgKi8KKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgUElDIEludHJzIGluIHRoZSBnZW5lcmFsIAorCQkJICogaW50ciBtYXNrIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5waWNfaW50X21hc2spOworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdmFsNjQgfD0gdGVtcDY0OworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCX0KKwl9CisKKwkvKiAgRE1BIEludGVycnVwdHMgKi8KKwkvKiAgRW5hYmxpbmcvRGlzYWJsaW5nIFR4IERNQSBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBUWF9ETUFfSU5UUikgeworCQkvKiBFbmFibGUgVHhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyICovCisJCXZhbDY0ID0gVFhETUFfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBLZWVwIGFsbCBpbnRlcnJ1cHRzIG90aGVyIHRoYW4gUEZDIGludGVycnVwdCAKKwkJCSAqIGFuZCBQQ0MgaW50ZXJydXB0IGRpc2FibGVkIGluIERNQSBsZXZlbC4KKwkJCSAqLworCQkJdmFsNjQgPSBESVNBQkxFX0FMTF9JTlRSUyAmIH4oVFhETUFfUEZDX0lOVF9NIHwKKwkJCQkJCSAgICAgIFRYRE1BX1BDQ19JTlRfTSk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT50eGRtYV9pbnRfbWFzayk7CisJCQkvKiAKKwkJCSAqIEVuYWJsZSBvbmx5IHRoZSBNSVNDIGVycm9yIDEgaW50ZXJydXB0IGluIFBGQyBibG9jayAKKwkJCSAqLworCQkJdmFsNjQgPSBESVNBQkxFX0FMTF9JTlRSUyAmICh+UEZDX01JU0NfRVJSXzEpOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cGZjX2Vycl9tYXNrKTsKKwkJCS8qIAorCQkJICogRW5hYmxlIG9ubHkgdGhlIEZCX0VDQyBlcnJvciBpbnRlcnJ1cHQgaW4gUENDIGJsb2NrIAorCQkJICovCisJCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgKH5QQ0NfRkJfRUNDX0VSUik7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wY2NfZXJyX21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogCisJCQkgKiBEaXNhYmxlIFR4RE1BIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayAKKwkJCSAqIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT50eGRtYV9pbnRfbWFzayk7CisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5wZmNfZXJyX21hc2spOworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdmFsNjQgfD0gdGVtcDY0OworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCX0KKwl9CisKKwkvKiAgRW5hYmxpbmcvRGlzYWJsaW5nIFJ4IERNQSBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBSWF9ETUFfSU5UUikgeworCQkvKiAgRW5hYmxlIFJ4RE1BIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAqLworCQl2YWw2NCA9IFJYRE1BX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogQWxsIFJ4RE1BIGJsb2NrIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGZvciBub3cgCisJCQkgKiBUT0RPIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5yeGRtYV9pbnRfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAgCisJCQkgKiBEaXNhYmxlIFJ4RE1BIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayAKKwkJCSAqIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5yeGRtYV9pbnRfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBNQUMgSW50ZXJydXB0cyAqLworCS8qICBFbmFibGluZy9EaXNhYmxpbmcgTUFDIGludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIChUWF9NQUNfSU5UUiB8IFJYX01BQ19JTlRSKSkgeworCQl2YWw2NCA9IFRYTUFDX0lOVF9NIHwgUlhNQUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgTUFDIGJsb2NrIGVycm9yIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGZvciBub3cgCisJCQkgKiBleGNlcHQgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQuCisJCQkgKiBUT0RPCisJCQkgKi8KKwkJCXZhbDY0ID0gTUFDX0lOVF9TVEFUVVNfUk1BQ19JTlQ7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+bWFjX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5tYWNfaW50X21hc2spOworCisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfcm1hY19lcnJfbWFzayk7CisJCQl2YWw2NCAmPSB+KCh1NjQpIFJNQUNfTElOS19TVEFURV9DSEFOR0VfSU5UKTsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1hY19ybWFjX2Vycl9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgTUFDIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+bWFjX2ludF9tYXNrKTsKKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywKKwkJCSAgICAgICAmYmFyMC0+bWFjX3JtYWNfZXJyX21hc2spOworCisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBYR1hTIEludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIChUWF9YR1hTX0lOVFIgfCBSWF9YR1hTX0lOVFIpKSB7CisJCXZhbDY0ID0gVFhYR1hTX0lOVF9NIHwgUlhYR1hTX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogQWxsIFhHWFMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdworCQkJICogVE9ETyAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+eGd4c19pbnRfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAgCisJCQkgKiBEaXNhYmxlIE1DIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+eGd4c19pbnRfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBNZW1vcnkgQ29udHJvbGxlcihNQykgaW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgTUNfSU5UUikgeworCQl2YWw2NCA9IE1DX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogQWxsIE1DIGJsb2NrIGVycm9yIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGZvciBub3cKKwkJCSAqIFRPRE8gCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPm1jX2ludF9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qCisJCQkgKiBEaXNhYmxlIE1DIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlcgorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5tY19pbnRfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCisJLyogIFR4IHRyYWZmaWMgaW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgVFhfVFJBRkZJQ19JTlRSKSB7CisJCXZhbDY0ID0gVFhUUkFGRklDX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogRW5hYmxlIGFsbCB0aGUgVHggc2lkZSBpbnRlcnJ1cHRzCisJCQkgKiB3cml0aW5nIDAgRW5hYmxlcyBhbGwgNjQgVFggaW50ZXJydXB0IGxldmVscyAKKwkJCSAqLworCQkJd3JpdGVxKDB4MCwgJmJhcjAtPnR4X3RyYWZmaWNfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAKKwkJCSAqIERpc2FibGUgVHggVHJhZmZpYyBJbnRycyBpbiB0aGUgZ2VuZXJhbCBpbnRyIG1hc2sgCisJCQkgKiByZWdpc3Rlci4KKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+dHhfdHJhZmZpY19tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIFJ4IHRyYWZmaWMgaW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgUlhfVFJBRkZJQ19JTlRSKSB7CisJCXZhbDY0ID0gUlhUUkFGRklDX0lOVF9NOworCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKKwkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCS8qIHdyaXRpbmcgMCBFbmFibGVzIGFsbCA4IFJYIGludGVycnVwdCBsZXZlbHMgKi8KKwkJCXdyaXRlcSgweDAsICZiYXIwLT5yeF90cmFmZmljX21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogIAorCQkJICogRGlzYWJsZSBSeCBUcmFmZmljIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayAKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5yeF90cmFmZmljX21hc2spOworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdmFsNjQgfD0gdGVtcDY0OworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCX0KKwl9Cit9CisKKy8qKiAgCisgKiAgdmVyaWZ5X3hlbmFfcXVpZXNjZW5jZSAtIENoZWNrcyB3aGV0aGVyIHRoZSBIL1cgaXMgcmVhZHkgCisgKiAgQHZhbDY0IDogIFZhbHVlIHJlYWQgZnJvbSBhZGFwdGVyIHN0YXR1cyByZWdpc3Rlci4KKyAqICBAZmxhZyA6IGluZGljYXRlcyBpZiB0aGUgYWRhcHRlciBlbmFibGUgYml0IHdhcyBldmVyIHdyaXR0ZW4gb25jZQorICogIGJlZm9yZS4KKyAqICBEZXNjcmlwdGlvbjogUmV0dXJucyB3aGV0aGVyIHRoZSBIL1cgaXMgcmVhZHkgdG8gZ28gb3Igbm90LiBEZXBlbmRpbmcKKyAqICBvbiB3aGV0aGVyIGFkYXB0ZXIgZW5hYmxlIGJpdCB3YXMgd3JpdHRlbiBvciBub3QgdGhlIGNvbXBhcmlzb24gCisgKiAgZGlmZmVycyBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gcGFzc2VzIHRoZSBpbnB1dCBhcmd1bWVudCBmbGFnIHRvCisgKiAgaW5kaWNhdGUgdGhpcy4KKyAqICBSZXR1cm46IDEgSWYgeGVuYSBpcyBxdWllc2NlbmNlIAorICogICAgICAgICAgMCBJZiBYZW5hIGlzIG5vdCBxdWllc2NlbmNlCisgKi8KKworc3RhdGljIGludCB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHU2NCB2YWw2NCwgaW50IGZsYWcpCit7CisJaW50IHJldCA9IDA7CisJdTY0IHRtcDY0ID0gfigodTY0KSB2YWw2NCk7CisKKwlpZiAoIQorCSAgICAodG1wNjQgJgorCSAgICAgKEFEQVBURVJfU1RBVFVTX1RETUFfUkVBRFkgfCBBREFQVEVSX1NUQVRVU19SRE1BX1JFQURZIHwKKwkgICAgICBBREFQVEVSX1NUQVRVU19QRkNfUkVBRFkgfCBBREFQVEVSX1NUQVRVU19UTUFDX0JVRl9FTVBUWSB8CisJICAgICAgQURBUFRFUl9TVEFUVVNfUElDX1FVSUVTQ0VOVCB8IEFEQVBURVJfU1RBVFVTX01DX0RSQU1fUkVBRFkgfAorCSAgICAgIEFEQVBURVJfU1RBVFVTX01DX1FVRVVFU19SRUFEWSB8IEFEQVBURVJfU1RBVFVTX01fUExMX0xPQ0sgfAorCSAgICAgIEFEQVBURVJfU1RBVFVTX1BfUExMX0xPQ0spKSkgeworCQlpZiAoZmxhZyA9PSBGQUxTRSkgeworCQkJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFKSAmJgorCQkJICAgICgodmFsNjQgJiBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSA9PQorCQkJICAgICBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSkgeworCisJCQkJcmV0ID0gMTsKKworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCgodmFsNjQgJiBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFKSA9PQorCQkJICAgICBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFKSAmJgorCQkJICAgICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgfHwKKwkJCSAgICAgKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpID09CisJCQkgICAgICBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSkpIHsKKworCQkJCXJldCA9IDE7CisKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZml4X21hY19hZGRyZXNzIC0gIEZpeCBmb3IgTWFjIGFkZHIgcHJvYmxlbSBvbiBBbHBoYSBwbGF0Zm9ybXMKKyAqIEBzcDogUG9pbnRlciB0byBkZXZpY2Ugc3BlY2lmYyBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uIDogCisgKiBOZXcgcHJvY2VkdXJlIHRvIGNsZWFyIG1hYyBhZGRyZXNzIHJlYWRpbmcgIHByb2JsZW1zIG9uIEFscGhhIHBsYXRmb3JtcworICoKKyAqLworCitzdGF0aWMgdm9pZCBmaXhfbWFjX2FkZHJlc3MobmljX3QgKiBzcCkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0OworCWludCBpID0gMDsKKworCXdoaWxlIChmaXhfbWFjW2ldICE9IEVORF9TSUdOKSB7CisJCXdyaXRlcShmaXhfbWFjW2krK10sICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCX0KK30KKworLyoqCisgKiAgc3RhcnRfbmljIC0gVHVybnMgdGhlIGRldmljZSBvbiAgIAorICogIEBuaWMgOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgVGhpcyBmdW5jdGlvbiBhY3R1YWxseSB0dXJucyB0aGUgZGV2aWNlIG9uLiBCZWZvcmUgdGhpcyAgZnVuY3Rpb24gaXMgCisgKiAgY2FsbGVkLGFsbCBSZWdpc3RlcnMgYXJlIGNvbmZpZ3VyZWQgZnJvbSB0aGVpciByZXNldCBzdGF0ZXMgCisgKiAgYW5kIHNoYXJlZCBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ1dCB0aGUgTklDIGlzIHN0aWxsIHF1aWVzY2VudC4gT24gCisgKiAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgZGV2aWNlIGludGVycnVwdHMgYXJlIGNsZWFyZWQgYW5kIHRoZSBOSUMgaXMKKyAqICBsaXRlcmFsbHkgc3dpdGNoZWQgb24gYnkgd3JpdGluZyBpbnRvIHRoZSBhZGFwdGVyIGNvbnRyb2wgcmVnaXN0ZXIuCisgKiAgUmV0dXJuIFZhbHVlOiAKKyAqICBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzdGFydF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwl1MTYgaW50ZXJydXB0aWJsZSwgaTsKKwl1MTYgc3ViaWQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwkvKiAgUFJDIEluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQl3cml0ZXEoKHU2NCkgbmljLT5yeF9ibG9ja3NbaV1bMF0uYmxvY2tfZG1hX2FkZHIsCisJCSAgICAgICAmYmFyMC0+cHJjX3J4ZDBfbltpXSk7CisKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+cHJjX2N0cmxfbltpXSk7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJCXZhbDY0IHw9IFBSQ19DVFJMX1JDX0VOQUJMRUQ7CisjZWxzZQorCQl2YWw2NCB8PSBQUkNfQ1RSTF9SQ19FTkFCTEVEIHwgUFJDX0NUUkxfUklOR19NT0RFXzM7CisjZW5kaWYKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cHJjX2N0cmxfbltpXSk7CisJfQorCisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwkvKiBFbmFibGluZyAyIGJ1ZmZlciBtb2RlIGJ5IHdyaXRpbmcgaW50byBSeF9wYV9jZmcgcmVnLiAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJ4X3BhX2NmZyk7CisJdmFsNjQgfD0gUlhfUEFfQ0ZHX0lHTk9SRV9MMl9FUlI7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfcGFfY2ZnKTsKKyNlbmRpZgorCisJLyogCisJICogRW5hYmxpbmcgTUMtUkxEUkFNLiBBZnRlciBlbmFibGluZyB0aGUgZGV2aWNlLCB3ZSB0aW1lb3V0CisJICogZm9yIGFyb3VuZCAxMDBtcywgd2hpY2ggaXMgYXBwcm94aW1hdGVseSB0aGUgdGltZSByZXF1aXJlZAorCSAqIGZvciB0aGUgZGV2aWNlIHRvIGJlIHJlYWR5IGZvciBvcGVyYXRpb24uCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX21ycyk7CisJdmFsNjQgfD0gTUNfUkxEUkFNX1FVRVVFX1NJWkVfRU5BQkxFIHwgTUNfUkxEUkFNX01SU19FTkFCTEU7CisJU1BFQ0lBTF9SRUdfV1JJVEUodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fbXJzLCBVRik7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX21ycyk7CisKKwltc2xlZXAoMTAwKTsJCQkvKiBEZWxheSBieSBhcm91bmQgMTAwIG1zLiAqLworCisJLyogRW5hYmxpbmcgRUNDIFByb3RlY3Rpb24uICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwl2YWw2NCAmPSB+QURBUFRFUl9FQ0NfRU47CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKworCS8qIAorCSAqIENsZWFyaW5nIGFueSBwb3NzaWJsZSBMaW5rIHN0YXRlIGNoYW5nZSBpbnRlcnJ1cHRzIHRoYXQgCisJICogY291bGQgaGF2ZSBwb3BwZWQgdXAganVzdCBiZWZvcmUgRW5hYmxpbmcgdGhlIGNhcmQuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX3JtYWNfZXJyX3JlZyk7CisJaWYgKHZhbDY0KQorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKworCS8qIAorCSAqIFZlcmlmeSBpZiB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQsIGlmIHNvIGVuYWJsZSAKKwkgKiBpdC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7CisJaWYgKCF2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHZhbDY0LCBuaWMtPmRldmljZV9lbmFibGVkX29uY2UpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IGRldmljZSBpcyBub3QgcmVhZHksICIsIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiQWRhcHRlciBzdGF0dXMgcmVhZHM6IDB4JWxseFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsNjQpOworCQlyZXR1cm4gRkFJTFVSRTsKKwl9CisKKwkvKiAgRW5hYmxlIHNlbGVjdCBpbnRlcnJ1cHRzICovCisJaW50ZXJydXB0aWJsZSA9IFRYX1RSQUZGSUNfSU5UUiB8IFJYX1RSQUZGSUNfSU5UUiB8IFRYX01BQ19JTlRSIHwKKwkgICAgUlhfTUFDX0lOVFI7CisJZW5fZGlzX2FibGVfbmljX2ludHJzKG5pYywgaW50ZXJydXB0aWJsZSwgRU5BQkxFX0lOVFJTKTsKKworCS8qIAorCSAqIFdpdGggc29tZSBzd2l0Y2hlcywgbGluayBtaWdodCBiZSBhbHJlYWR5IHVwIGF0IHRoaXMgcG9pbnQuCisJICogQmVjYXVzZSBvZiB0aGlzIHdlaXJkIGJlaGF2aW9yLCB3aGVuIHdlIGVuYWJsZSBsYXNlciwgCisJICogd2UgbWF5IG5vdCBnZXQgbGluay4gV2UgbmVlZCB0byBoYW5kbGUgdGhpcy4gV2UgY2Fubm90IAorCSAqIGZpZ3VyZSBvdXQgd2hpY2ggc3dpdGNoIGlzIG1pc2JlaGF2aW5nLiBTbyB3ZSBhcmUgZm9yY2VkIHRvIAorCSAqIG1ha2UgYSBnbG9iYWwgY2hhbmdlLiAKKwkgKi8KKworCS8qIEVuYWJsaW5nIExhc2VyLiAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJdmFsNjQgfD0gQURBUFRFUl9FT0lfVFhfT047CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKworCS8qIFNYRS0wMDI6IEluaXRpYWxpemUgbGluayBhbmQgYWN0aXZpdHkgTEVEICovCisJc3ViaWQgPSBuaWMtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgfD0gMHgwMDAwODAwMDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCA9IDB4MDQxMTA0MDQwMDAwMDAwMFVMTDsKKwkJd3JpdGVxKHZhbDY0LCAodm9pZCBfX2lvbWVtICopIGJhcjAgKyAweDI3MDApOworCX0KKworCS8qIAorCSAqIERvbid0IHNlZSBsaW5rIHN0YXRlIGludGVycnVwdHMgb24gY2VydGFpbiBzd2l0Y2hlcywgc28gCisJICogZGlyZWN0bHkgc2NoZWR1bGluZyBhIGxpbmsgc3RhdGUgdGFzayBmcm9tIGhlcmUuCisJICovCisJc2NoZWR1bGVfd29yaygmbmljLT5zZXRfbGlua190YXNrKTsKKworCS8qIAorCSAqIEhlcmUgd2UgYXJlIHBlcmZvcm1pbmcgc29mdCByZXNldCBvbiBYR1hTIHRvIAorCSAqIGZvcmNlIGxpbmsgZG93bi4gU2luY2UgbGluayBpcyBhbHJlYWR5IHVwLCB3ZSB3aWxsIGdldAorCSAqIGxpbmsgc3RhdGUgY2hhbmdlIGludGVycnVwdCBhZnRlciB0aGlzIHJlc2V0CisJICovCisJU1BFQ0lBTF9SRUdfV1JJVEUoMHg4MDAxMDUxNTAwMUUwMDAwVUxMLCAmYmFyMC0+ZHR4X2NvbnRyb2wsIFVGKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5kdHhfY29udHJvbCk7CisJdWRlbGF5KDUwKTsKKwlTUEVDSUFMX1JFR19XUklURSgweDgwMDEwNTE1MDAxRTAwRTBVTEwsICZiYXIwLT5kdHhfY29udHJvbCwgVUYpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmR0eF9jb250cm9sKTsKKwl1ZGVsYXkoNTApOworCVNQRUNJQUxfUkVHX1dSSVRFKDB4ODAwNzA1MTUwMDFGMDBFNFVMTCwgJmJhcjAtPmR0eF9jb250cm9sLCBVRik7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+ZHR4X2NvbnRyb2wpOworCXVkZWxheSg1MCk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqIAorICogIGZyZWVfdHhfYnVmZmVycyAtIEZyZWUgYWxsIHF1ZXVlZCBUeCBidWZmZXJzIAorICogIEBuaWMgOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgRnJlZSBhbGwgcXVldWVkIFR4IGJ1ZmZlcnMuCisgKiAgUmV0dXJuIFZhbHVlOiB2b2lkIAorKi8KKworc3RhdGljIHZvaWQgZnJlZV90eF9idWZmZXJzKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCVR4RF90ICp0eGRwOworCWludCBpLCBqOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKwlpbnQgY250ID0gMDsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOyBqKyspIHsKKwkJCXR4ZHAgPSAoVHhEX3QgKikgbmljLT5saXN0X2luZm9baV1bal0uCisJCQkgICAgbGlzdF92aXJ0X2FkZHI7CisJCQlza2IgPQorCQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpIHR4ZHAtPgorCQkJCQkJSG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCW1lbXNldCh0eGRwLCAwLCBzaXplb2YoVHhEX3QpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCW1lbXNldCh0eGRwLCAwLCBzaXplb2YoVHhEX3QpKTsKKwkJCWNudCsrOworCQl9CisJCURCR19QUklOVChJTlRSX0RCRywKKwkJCSAgIiVzOmZvcmNpYmx5IGZyZWVpbmcgJWQgc2ticyBvbiBGSUZPJWRcbiIsCisJCQkgIGRldi0+bmFtZSwgY250LCBpKTsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwl9Cit9CisKKy8qKiAgCisgKiAgIHN0b3BfbmljIC0gIFRvIHN0b3AgdGhlIG5pYyAgCisgKiAgIEBuaWMgOyBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICAgRGVzY3JpcHRpb246IAorICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgZXhhY3RseSB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCB0aGUgc3RhcnRfbmljKCkgCisgKiAgIGZ1bmN0aW9uIGRvZXMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0b3AgdGhlIGRldmljZS4KKyAqICAgUmV0dXJuIFZhbHVlOgorICogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHN0b3BfbmljKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwl1MTYgaW50ZXJydXB0aWJsZSwgaTsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qICBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaW50ZXJydXB0aWJsZSA9IFRYX1RSQUZGSUNfSU5UUiB8IFJYX1RSQUZGSUNfSU5UUiB8IFRYX01BQ19JTlRSIHwKKwkgICAgUlhfTUFDX0lOVFI7CisJZW5fZGlzX2FibGVfbmljX2ludHJzKG5pYywgaW50ZXJydXB0aWJsZSwgRElTQUJMRV9JTlRSUyk7CisKKwkvKiAgRGlzYWJsZSBQUkNzICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKwkJdmFsNjQgJj0gfigodTY0KSBQUkNfQ1RSTF9SQ19FTkFCTEVEKTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cHJjX2N0cmxfbltpXSk7CisJfQorfQorCisvKiogIAorICogIGZpbGxfcnhfYnVmZmVycyAtIEFsbG9jYXRlcyB0aGUgUnggc2lkZSBza2JzIAorICogIEBuaWM6ICBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZQorICogIEByaW5nX25vOiByaW5nIG51bWJlciAKKyAqICBEZXNjcmlwdGlvbjogCisgKiAgVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBSeCBzaWRlIHNrYnMgYW5kIHB1dHMgdGhlIHBoeXNpY2FsCisgKiAgYWRkcmVzcyBvZiB0aGVzZSBidWZmZXJzIGludG8gdGhlIFJ4RCBidWZmZXIgcG9pbnRlcnMsIHNvIHRoYXQgdGhlIE5JQworICogIGNhbiBETUEgdGhlIHJlY2VpdmVkIGZyYW1lIGludG8gdGhlc2UgbG9jYXRpb25zLgorICogIFRoZSBOSUMgc3VwcG9ydHMgMyByZWNlaXZlIG1vZGVzLCB2aXoKKyAqICAxLiBzaW5nbGUgYnVmZmVyLAorICogIDIuIHRocmVlIGJ1ZmZlciBhbmQKKyAqICAzLiBGaXZlIGJ1ZmZlciBtb2Rlcy4KKyAqICBFYWNoIG1vZGUgZGVmaW5lcyBob3cgbWFueSBmcmFnbWVudHMgdGhlIHJlY2VpdmVkIGZyYW1lIHdpbGwgYmUgc3BsaXQgCisgKiAgdXAgaW50byBieSB0aGUgTklDLiBUaGUgZnJhbWUgaXMgc3BsaXQgaW50byBMMyBoZWFkZXIsIEw0IEhlYWRlciwgCisgKiAgTDQgcGF5bG9hZCBpbiB0aHJlZSBidWZmZXIgbW9kZSBhbmQgaW4gNSBidWZmZXIgbW9kZSwgTDQgcGF5bG9hZCBpdHNlbGYKKyAqICBpcyBzcGxpdCBpbnRvIDMgZnJhZ21lbnRzLiBBcyBvZiBub3cgb25seSBzaW5nbGUgYnVmZmVyIG1vZGUgaXMKKyAqICBzdXBwb3J0ZWQuCisgKiAgIFJldHVybiBWYWx1ZToKKyAqICBTVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgYW4gYXBwcm9wcmlhdGUgLXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBmaWxsX3J4X2J1ZmZlcnMoc3RydWN0IHMyaW9fbmljICpuaWMsIGludCByaW5nX25vKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCVJ4RF90ICpyeGRwOworCWludCBvZmYsIG9mZjEsIHNpemUsIGJsb2NrX25vLCBibG9ja19ubzE7CisJaW50IG9mZnNldCwgb2Zmc2V0MTsKKwl1MzIgYWxsb2NfdGFiID0gMDsKKwl1MzIgYWxsb2NfY250ID0gbmljLT5wa3RfY250W3Jpbmdfbm9dIC0KKwkgICAgYXRvbWljX3JlYWQoJm5pYy0+cnhfYnVmc19sZWZ0W3Jpbmdfbm9dKTsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlSeERfdCAqcnhkcG5leHQ7CisJaW50IG5leHRibGs7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJYnVmZkFkZF90ICpiYTsKKwlkbWFfYWRkcl90IHJ4ZHBwaHlzOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCXNpemUgPSBkZXYtPm10dSArIEhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFICsKKwkgICAgSEVBREVSXzgwMl8yX1NJWkUgKyBIRUFERVJfU05BUF9TSVpFOworCisJd2hpbGUgKGFsbG9jX3RhYiA8IGFsbG9jX2NudCkgeworCQlibG9ja19ubyA9IG1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLgorCQkgICAgYmxvY2tfaW5kZXg7CisJCWJsb2NrX25vMSA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW3Jpbmdfbm9dLgorCQkgICAgYmxvY2tfaW5kZXg7CisJCW9mZiA9IG1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLm9mZnNldDsKKwkJb2ZmMSA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW3Jpbmdfbm9dLm9mZnNldDsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJb2Zmc2V0ID0gYmxvY2tfbm8gKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkgKyBvZmY7CisJCW9mZnNldDEgPSBibG9ja19ubzEgKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkgKyBvZmYxOworI2Vsc2UKKwkJb2Zmc2V0ID0gYmxvY2tfbm8gKiAoTUFYX1JYRFNfUEVSX0JMT0NLKSArIG9mZjsKKwkJb2Zmc2V0MSA9IGJsb2NrX25vMSAqIChNQVhfUlhEU19QRVJfQkxPQ0spICsgb2ZmMTsKKyNlbmRpZgorCisJCXJ4ZHAgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXVtibG9ja19ub10uCisJCSAgICBibG9ja192aXJ0X2FkZHIgKyBvZmY7CisJCWlmICgob2Zmc2V0ID09IG9mZnNldDEpICYmIChyeGRwLT5Ib3N0X0NvbnRyb2wpKSB7CisJCQlEQkdfUFJJTlQoSU5UUl9EQkcsICIlczogR2V0IGFuZCBQdXQiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKElOVFJfREJHLCAiIGluZm8gZXF1YXRlZFxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlpZiAocnhkcC0+Q29udHJvbF8xID09IEVORF9PRl9CTE9DSykgeworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXgrKzsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLgorCQkJICAgIGJsb2NrX2luZGV4ICU9IG5pYy0+YmxvY2tfY291bnRbcmluZ19ub107CisJCQlibG9ja19ubyA9IG1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvCisJCQkgICAgW3Jpbmdfbm9dLmJsb2NrX2luZGV4OworCQkJb2ZmKys7CisJCQlvZmYgJT0gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0KKwkJCSAgICBvZmY7CisJCQlyeGRwID0gKFJ4RF90ICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+Q29udHJvbF8yKTsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBOZXh0IGJsb2NrIGF0OiAlcFxuIiwKKwkJCQkgIGRldi0+bmFtZSwgcnhkcCk7CisJCX0KKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5wdXRfbG9jaywgZmxhZ3MpOworCQluaWMtPnB1dF9wb3NbcmluZ19ub10gPQorCQkgICAgKGJsb2NrX25vICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArIG9mZjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5wdXRfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZWxzZQorCQlpZiAocnhkcC0+SG9zdF9Db250cm9sID09IEVORF9PRl9CTE9DSykgeworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXgrKzsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLgorCQkJICAgIGJsb2NrX2luZGV4ICU9IG5pYy0+YmxvY2tfY291bnRbcmluZ19ub107CisJCQlibG9ja19ubyA9IG1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvCisJCQkgICAgW3Jpbmdfbm9dLmJsb2NrX2luZGV4OworCQkJb2ZmID0gMDsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBibG9jayVkIGF0OiAweCVsbHhcbiIsCisJCQkJICBkZXYtPm5hbWUsIGJsb2NrX25vLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnhkcC0+Q29udHJvbF8xKTsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLm9mZnNldCA9CisJCQkgICAgb2ZmOworCQkJcnhkcCA9IG5pYy0+cnhfYmxvY2tzW3Jpbmdfbm9dW2Jsb2NrX25vXS4KKwkJCSAgICBibG9ja192aXJ0X2FkZHI7CisJCX0KKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5wdXRfbG9jaywgZmxhZ3MpOworCQluaWMtPnB1dF9wb3NbcmluZ19ub10gPSAoYmxvY2tfbm8gKgorCQkJCQkgKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArIG9mZjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5wdXRfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlpZiAocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKQorI2Vsc2UKKwkJaWYgKHJ4ZHAtPkNvbnRyb2xfMiAmIEJJVCgwKSkKKyNlbmRpZgorCQl7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS4KKwkJCSAgICBvZmZzZXQgPSBvZmY7CisJCQlnb3RvIGVuZDsKKwkJfQorI2lmZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCS8qIAorCQkgKiBSeERzIFNwYW5uaW5nIGNhY2hlIGxpbmVzIHdpbGwgYmUgcmVwbGVuaXNoZWQgb25seSAKKwkJICogaWYgdGhlIHN1Y2NlZWRpbmcgUnhEIGlzIGFsc28gb3duZWQgYnkgSG9zdC4gSXQgCisJCSAqIHdpbGwgYWx3YXlzIGJlIHRoZSAoKDgqaSkrMykgYW5kICgoOCppKSs2KSAKKwkJICogZGVzY3JpcHRvcnMgZm9yIHRoZSA0OCBieXRlIGRlc2NyaXB0b3IuIFRoZSBvZmZlbmRpbmcgCisJCSAqIGRlY3NyaXB0b3IgaXMgb2YtY291cnNlIHRoZSAzcmQgZGVzY3JpcHRvci4KKwkJICovCisJCXJ4ZHBwaHlzID0gbmljLT5yeF9ibG9ja3NbcmluZ19ub11bYmxvY2tfbm9dLgorCQkgICAgYmxvY2tfZG1hX2FkZHIgKyAob2ZmICogc2l6ZW9mKFJ4RF90KSk7CisJCWlmICgoKHU2NCkgKHJ4ZHBwaHlzKSkgJSAxMjggPiA4MCkgeworCQkJcnhkcG5leHQgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXVtibG9ja19ub10uCisJCQkgICAgYmxvY2tfdmlydF9hZGRyICsgKG9mZiArIDEpOworCQkJaWYgKHJ4ZHBuZXh0LT5Ib3N0X0NvbnRyb2wgPT0gRU5EX09GX0JMT0NLKSB7CisJCQkJbmV4dGJsayA9IChibG9ja19ubyArIDEpICUKKwkJCQkgICAgKG5pYy0+YmxvY2tfY291bnRbcmluZ19ub10pOworCQkJCXJ4ZHBuZXh0ID0gbmljLT5yeF9ibG9ja3NbcmluZ19ub10KKwkJCQkgICAgW25leHRibGtdLmJsb2NrX3ZpcnRfYWRkcjsKKwkJCX0KKwkJCWlmIChyeGRwbmV4dC0+Q29udHJvbF8yICYgQklUKDApKQorCQkJCWdvdG8gZW5kOworCQl9CisjZW5kaWYKKworI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUgKyBORVRfSVBfQUxJR04pOworI2Vsc2UKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihkZXYtPm10dSArIEFMSUdOX1NJWkUgKyBCVUYwX0xFTiArIDQpOworI2VuZGlmCisJCWlmICghc2tiKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBPdXQgb2YgIiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlIFNLQnNcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKyNpZm5kZWYJQ09ORklHXzJCVUZGX01PREUKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RF90KSk7CisJCXJ4ZHAtPkJ1ZmZlcjBfcHRyID0gcGNpX21hcF9zaW5nbGUKKwkJICAgIChuaWMtPnBkZXYsIHNrYi0+ZGF0YSwgc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcnhkcC0+Q29udHJvbF8yICY9ICh+TUFTS19CVUZGRVIwX1NJWkUpOworCQlyeGRwLT5Db250cm9sXzIgfD0gU0VUX0JVRkZFUjBfU0laRShzaXplKTsKKwkJcnhkcC0+SG9zdF9Db250cm9sID0gKHVuc2lnbmVkIGxvbmcpIChza2IpOworCQlyeGRwLT5Db250cm9sXzEgfD0gUlhEX09XTl9YRU5BOworCQlvZmYrKzsKKwkJb2ZmICU9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0gb2ZmOworI2Vsc2UKKwkJYmEgPSAmbmljLT5iYVtyaW5nX25vXVtibG9ja19ub11bb2ZmXTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBCVUYwX0xFTik7CisJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGE7CisJCXRtcCArPSBBTElHTl9TSVpFOworCQl0bXAgJj0gfkFMSUdOX1NJWkU7CisJCXNrYi0+ZGF0YSA9ICh2b2lkICopIHRtcDsKKwkJc2tiLT50YWlsID0gKHZvaWQgKikgdG1wOworCisJCW1lbXNldChyeGRwLCAwLCBzaXplb2YoUnhEX3QpKTsKKwkJcnhkcC0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZQorCQkgICAgKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBkZXYtPm10dSArIEJVRjBfTEVOICsgNCwKKwkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyeGRwLT5CdWZmZXIwX3B0ciA9CisJCSAgICBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsIGJhLT5iYV8wLCBCVUYwX0xFTiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyeGRwLT5CdWZmZXIxX3B0ciA9CisJCSAgICBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsIGJhLT5iYV8xLCBCVUYxX0xFTiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJ4ZHAtPkNvbnRyb2xfMiA9IFNFVF9CVUZGRVIyX1NJWkUoZGV2LT5tdHUgKyA0KTsKKwkJcnhkcC0+Q29udHJvbF8yIHw9IFNFVF9CVUZGRVIwX1NJWkUoQlVGMF9MRU4pOworCQlyeGRwLT5Db250cm9sXzIgfD0gU0VUX0JVRkZFUjFfU0laRSgxKTsJLyogZHVtbXkuICovCisJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBCSVQoMCk7CS8qIFNldCBCdWZmZXJfRW1wdHkgYml0LiAqLworCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAodTY0KSAoKHVuc2lnbmVkIGxvbmcpIChza2IpKTsKKwkJcnhkcC0+Q29udHJvbF8xIHw9IFJYRF9PV05fWEVOQTsKKwkJb2ZmKys7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLm9mZnNldCA9IG9mZjsKKyNlbmRpZgorCQlhdG9taWNfaW5jKCZuaWMtPnJ4X2J1ZnNfbGVmdFtyaW5nX25vXSk7CisJCWFsbG9jX3RhYisrOworCX0KKworICAgICAgZW5kOgorCXJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAqICBmcmVlX3J4X2J1ZmZlcnMgLSBGcmVlcyBhbGwgUnggYnVmZmVycyAgIAorICogIEBzcDogZGV2aWNlIHByaXZhdGUgdmFyaWFibGUuCisgKiAgRGVzY3JpcHRpb246IAorICogIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCBSeCBidWZmZXJzIGFsbG9jYXRlZCBieSBob3N0LgorICogIFJldHVybiBWYWx1ZToKKyAqICBOT05FLgorICovCisKK3N0YXRpYyB2b2lkIGZyZWVfcnhfYnVmZmVycyhzdHJ1Y3QgczJpb19uaWMgKnNwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+ZGV2OworCWludCBpLCBqLCBibGsgPSAwLCBvZmYsIGJ1Zl9jbnQgPSAwOworCVJ4RF90ICpyeGRwOworCXN0cnVjdCBza19idWZmICpza2I7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJYnVmZkFkZF90ICpiYTsKKyNlbmRpZgorCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlmb3IgKGogPSAwLCBibGsgPSAwOyBqIDwgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZDsgaisrKSB7CisJCQlvZmYgPSBqICUgKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQkJcnhkcCA9IHNwLT5yeF9ibG9ja3NbaV1bYmxrXS5ibG9ja192aXJ0X2FkZHIgKyBvZmY7CisKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJCWlmIChyeGRwLT5Db250cm9sXzEgPT0gRU5EX09GX0JMT0NLKSB7CisJCQkJcnhkcCA9CisJCQkJICAgIChSeERfdCAqKSAoKHVuc2lnbmVkIGxvbmcpIHJ4ZHAtPgorCQkJCQkgICAgICAgQ29udHJvbF8yKTsKKwkJCQlqKys7CisJCQkJYmxrKys7CisJCQl9CisjZWxzZQorCQkJaWYgKHJ4ZHAtPkhvc3RfQ29udHJvbCA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQlibGsrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSB7CisJCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeERfdCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlza2IgPQorCQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpIHJ4ZHAtPgorCQkJCQkJSG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IpIHsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJCSBkZXYtPm10dSArCisJCQkJCQkgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUKKwkJCQkJCSArIEhFQURFUl84MDJfMl9TSVpFICsKKwkJCQkJCSBIRUFERVJfU05BUF9TSVpFLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisjZWxzZQorCQkJCWJhID0gJnNwLT5iYVtpXVtibGtdW29mZl07CisJCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCQkgcnhkcC0+QnVmZmVyMF9wdHIsCisJCQkJCQkgQlVGMF9MRU4sCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJCSByeGRwLT5CdWZmZXIxX3B0ciwKKwkJCQkJCSBCVUYxX0xFTiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkJIHJ4ZHAtPkJ1ZmZlcjJfcHRyLAorCQkJCQkJIGRldi0+bXR1ICsgQlVGMF9MRU4gKyA0LAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisjZW5kaWYKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJYXRvbWljX2RlYygmc3AtPnJ4X2J1ZnNfbGVmdFtpXSk7CisJCQkJYnVmX2NudCsrOworCQkJfQorCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeERfdCkpOworCQl9CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLmJsb2NrX2luZGV4ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uYmxvY2tfaW5kZXggPSAwOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQlhdG9taWNfc2V0KCZzcC0+cnhfYnVmc19sZWZ0W2ldLCAwKTsKKwkJREJHX1BSSU5UKElOSVRfREJHLCAiJXM6RnJlZWQgMHgleCBSeCBCdWZmZXJzIG9uIHJpbmclZFxuIiwKKwkJCSAgZGV2LT5uYW1lLCBidWZfY250LCBpKTsKKwl9Cit9CisKKy8qKgorICogczJpb19wb2xsIC0gUnggaW50ZXJydXB0IGhhbmRsZXIgZm9yIE5BUEkgc3VwcG9ydAorICogQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBAYnVkZ2V0IDogVGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgd2VyZSBidWRnZXRlZCB0byBiZSBwcm9jZXNzZWQgCisgKiBkdXJpbmcgIG9uZSBwYXNzIHRocm91Z2ggdGhlICdQb2xsIiBmdW5jdGlvbi4KKyAqIERlc2NyaXB0aW9uOgorICogQ29tZXMgaW50byBwaWN0dXJlIG9ubHkgaWYgTkFQSSBzdXBwb3J0IGhhcyBiZWVuIGluY29ycG9yYXRlZC4gSXQgZG9lcworICogdGhlIHNhbWUgdGhpbmcgdGhhdCByeF9pbnRyX2hhbmRsZXIgZG9lcywgYnV0IG5vdCBpbiBhIGludGVycnVwdCBjb250ZXh0CisgKiBhbHNvIEl0IHdpbGwgcHJvY2VzcyBvbmx5IGEgZ2l2ZW4gbnVtYmVyIG9mIHBhY2tldHMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAwIG9uIHN1Y2Nlc3MgYW5kIDEgaWYgdGhlcmUgYXJlIE5vIFJ4IHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkLgorICovCisKKyNpZmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgaW50IHMyaW9fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwluaWNfdCAqbmljID0gZGV2LT5wcml2OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJaW50IHBrdHNfdG9fcHJvY2VzcyA9ICpidWRnZXQsIHBrdF9jbnQgPSAwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisJcnhfY3Vycl9nZXRfaW5mb190IGdldF9pbmZvLCBwdXRfaW5mbzsKKwlpbnQgaSwgZ2V0X2Jsb2NrLCBwdXRfYmxvY2ssIGdldF9vZmZzZXQsIHB1dF9vZmZzZXQsIHJpbmdfYnVmczsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwl1MTYgdmFsMTYsIGNrc3VtOworI2VuZGlmCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlSeERfdCAqcnhkcDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCWlmIChwa3RzX3RvX3Byb2Nlc3MgPiBkZXYtPnF1b3RhKQorCQlwa3RzX3RvX3Byb2Nlc3MgPSBkZXYtPnF1b3RhOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ4X3RyYWZmaWNfaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJZ2V0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXTsKKwkJZ2V0X2Jsb2NrID0gZ2V0X2luZm8uYmxvY2tfaW5kZXg7CisJCXB1dF9pbmZvID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV07CisJCXB1dF9ibG9jayA9IHB1dF9pbmZvLmJsb2NrX2luZGV4OworCQlyaW5nX2J1ZnMgPSBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOworCQlyeGRwID0gbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlnZXRfb2Zmc2V0ID0gKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQlwdXRfb2Zmc2V0ID0gKHB1dF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgcHV0X2luZm8ub2Zmc2V0OworCQl3aGlsZSAoKCEocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKSkgJiYKKwkJICAgICAgICgoKGdldF9vZmZzZXQgKyAxKSAlIHJpbmdfYnVmcykgIT0gcHV0X29mZnNldCkpIHsKKwkJCWlmICgtLXBrdHNfdG9fcHJvY2VzcyA8IDApIHsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCQkJaWYgKHJ4ZHAtPkNvbnRyb2xfMSA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQlyeGRwID0KKwkJCQkgICAgKFJ4RF90ICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+CisJCQkJCSAgICAgICBDb250cm9sXzIpOworCQkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJCWdldF9pbmZvLm9mZnNldCAlPQorCQkJCSAgICAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQkJZ2V0X2Jsb2NrKys7CisJCQkJZ2V0X2Jsb2NrICU9IG5pYy0+YmxvY2tfY291bnRbaV07CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIG9mZnNldCA9IGdldF9pbmZvLm9mZnNldDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgYmxvY2tfaW5kZXggPSBnZXRfYmxvY2s7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnZXRfb2Zmc2V0ID0KKwkJCSAgICAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJc2tiID0KKwkJCSAgICAoc3RydWN0IHNrX2J1ZmYgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT4KKwkJCQkJCUhvc3RfQ29udHJvbCk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBUaGUgc2tiIGlzICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIk51bGwgaW4gUnggSW50clxuIik7CisJCQkJZ290byBub19yeDsKKwkJCX0KKwkJCXZhbDY0ID0gUlhEX0dFVF9CVUZGRVIwX1NJWkUocnhkcC0+Q29udHJvbF8yKTsKKwkJCXZhbDE2ID0gKHUxNikgKHZhbDY0ID4+IDQ4KTsKKwkJCWNrc3VtID0gUlhEX0dFVF9MNF9DS1NVTShyeGRwLT5Db250cm9sXzEpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMF9wdHIsCisJCQkJCSBkZXYtPm10dSArCisJCQkJCSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSArCisJCQkJCSBIRUFERVJfODAyXzJfU0laRSArCisJCQkJCSBIRUFERVJfU05BUF9TSVpFLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJ4X29zbV9oYW5kbGVyKG5pYywgdmFsMTYsIHJ4ZHAsIGkpOworCQkJcGt0X2NudCsrOworCQkJZ2V0X2luZm8ub2Zmc2V0Kys7CisJCQlnZXRfaW5mby5vZmZzZXQgJT0gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQkJcnhkcCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9CisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQl9CisjZWxzZQorCQlnZXRfb2Zmc2V0ID0gKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQlwdXRfb2Zmc2V0ID0gKHB1dF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgcHV0X2luZm8ub2Zmc2V0OworCQl3aGlsZSAoKCghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9PV05fWEVOQSkpICYmCisJCQkhKHJ4ZHAtPkNvbnRyb2xfMiAmIEJJVCgwKSkpICYmCisJCSAgICAgICAoKChnZXRfb2Zmc2V0ICsgMSkgJSByaW5nX2J1ZnMpICE9IHB1dF9vZmZzZXQpKSB7CisJCQlpZiAoLS1wa3RzX3RvX3Byb2Nlc3MgPCAwKSB7CisJCQkJZ290byBub19yeDsKKwkJCX0KKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgIHJ4ZHAtPkhvc3RfQ29udHJvbCk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBUaGUgc2tiIGlzICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIk51bGwgaW4gUnggSW50clxuIik7CisJCQkJZ290byBub19yeDsKKwkJCX0KKworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMF9wdHIsCisJCQkJCSBCVUYwX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjFfcHRyLAorCQkJCQkgQlVGMV9MRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIyX3B0ciwKKwkJCQkJIGRldi0+bXR1ICsgQlVGMF9MRU4gKyA0LAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJhID0gJm5pYy0+YmFbaV1bZ2V0X2Jsb2NrXVtnZXRfaW5mby5vZmZzZXRdOworCisJCQlyeF9vc21faGFuZGxlcihuaWMsIHJ4ZHAsIGksIGJhKTsKKworCQkJZ2V0X2luZm8ub2Zmc2V0Kys7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPQorCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXJ4ZHAgPQorCQkJICAgIG5pYy0+cnhfYmxvY2tzW2ldW2dldF9ibG9ja10uYmxvY2tfdmlydF9hZGRyICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisKKwkJCWlmIChnZXRfaW5mby5vZmZzZXQgJiYKKwkJCSAgICAoIShnZXRfaW5mby5vZmZzZXQgJSBNQVhfUlhEU19QRVJfQkxPQ0spKSkgeworCQkJCWdldF9pbmZvLm9mZnNldCA9IDA7CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIG9mZnNldCA9IGdldF9pbmZvLm9mZnNldDsKKwkJCQlnZXRfYmxvY2srKzsKKwkJCQlnZXRfYmxvY2sgJT0gbmljLT5ibG9ja19jb3VudFtpXTsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgYmxvY2tfaW5kZXggPSBnZXRfYmxvY2s7CisJCQkJcnhkcCA9CisJCQkJICAgIG5pYy0+cnhfYmxvY2tzW2ldW2dldF9ibG9ja10uCisJCQkJICAgIGJsb2NrX3ZpcnRfYWRkcjsKKwkJCX0KKwkJCWdldF9vZmZzZXQgPQorCQkJICAgIChnZXRfYmxvY2sgKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlwa3RfY250Kys7CisJCX0KKyNlbmRpZgorCX0KKwlpZiAoIXBrdF9jbnQpCisJCXBrdF9jbnQgPSAxOworCisJZGV2LT5xdW90YSAtPSBwa3RfY250OworCSpidWRnZXQgLT0gcGt0X2NudDsKKwluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpZiAoZmlsbF9yeF9idWZmZXJzKG5pYywgaSkgPT0gLUVOT01FTSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczpPdXQgb2YgbWVtb3J5IiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiIGluIFJ4IFBvbGwhIVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBSZSBlbmFibGUgdGhlIFJ4IGludGVycnVwdHMuICovCisJZW5fZGlzX2FibGVfbmljX2ludHJzKG5pYywgUlhfVFJBRkZJQ19JTlRSLCBFTkFCTEVfSU5UUlMpOworCXJldHVybiAwOworCisgICAgICBub19yeDoKKwlkZXYtPnF1b3RhIC09IHBrdF9jbnQ7CisJKmJ1ZGdldCAtPSBwa3RfY250OworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpZiAoZmlsbF9yeF9idWZmZXJzKG5pYywgaSkgPT0gLUVOT01FTSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczpPdXQgb2YgbWVtb3J5IiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiIGluIFJ4IFBvbGwhIVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKyNlbHNlCisvKiogIAorICogIHJ4X2ludHJfaGFuZGxlciAtIFJ4IGludGVycnVwdCBoYW5kbGVyCisgKiAgQG5pYzogZGV2aWNlIHByaXZhdGUgdmFyaWFibGUuCisgKiAgRGVzY3JpcHRpb246IAorICogIElmIHRoZSBpbnRlcnJ1cHQgaXMgYmVjYXVzZSBvZiBhIHJlY2VpdmVkIGZyYW1lIG9yIGlmIHRoZSAKKyAqICByZWNlaXZlIHJpbmcgY29udGFpbnMgZnJlc2ggYXMgeWV0IHVuLXByb2Nlc3NlZCBmcmFtZXMsdGhpcyBmdW5jdGlvbiBpcworICogIGNhbGxlZC4gSXQgcGlja3Mgb3V0IHRoZSBSeEQgYXQgd2hpY2ggcGxhY2UgdGhlIGxhc3QgUnggcHJvY2Vzc2luZyBoYWQgCisgKiAgc3RvcHBlZCBhbmQgc2VuZHMgdGhlIHNrYiB0byB0aGUgT1NNJ3MgUnggaGFuZGxlciBhbmQgdGhlbiBpbmNyZW1lbnRzIAorICogIHRoZSBvZmZzZXQuCisgKiAgUmV0dXJuIFZhbHVlOgorICogIE5PTkUuCisgKi8KKworc3RhdGljIHZvaWQgcnhfaW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbmljLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgKmJhcjAgPSAoWEVOQV9kZXZfY29uZmlnX3QgKikgbmljLT5iYXIwOworCXJ4X2N1cnJfZ2V0X2luZm9fdCBnZXRfaW5mbywgcHV0X2luZm87CisJUnhEX3QgKnJ4ZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwl1MTYgdmFsMTYsIGNrc3VtOworI2VuZGlmCisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwlpbnQgZ2V0X2Jsb2NrLCBnZXRfb2Zmc2V0LCBwdXRfYmxvY2ssIHB1dF9vZmZzZXQsIHJpbmdfYnVmczsKKwlpbnQgaSwgcGt0X2NudCA9IDA7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJYnVmZkFkZF90ICpiYTsKKyNlbmRpZgorCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwkvKiAKKwkgKiByeF90cmFmZmljX2ludCByZWcgaXMgYW4gUjEgcmVnaXN0ZXIsIGhlbmNlIHdlIHJlYWQgYW5kIHdyaXRlIGJhY2sgCisJICogdGhlIHNhbWV2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgdG8gY2xlYXIgaXQuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ4X3RyYWZmaWNfaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJZ2V0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXTsKKwkJZ2V0X2Jsb2NrID0gZ2V0X2luZm8uYmxvY2tfaW5kZXg7CisJCXB1dF9pbmZvID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV07CisJCXB1dF9ibG9jayA9IHB1dF9pbmZvLmJsb2NrX2luZGV4OworCQlyaW5nX2J1ZnMgPSBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOworCQlyeGRwID0gbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlnZXRfb2Zmc2V0ID0gKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQlzcGluX2xvY2soJm5pYy0+cHV0X2xvY2spOworCQlwdXRfb2Zmc2V0ID0gbmljLT5wdXRfcG9zW2ldOworCQlzcGluX3VubG9jaygmbmljLT5wdXRfbG9jayk7CisJCXdoaWxlICgoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSAmJgorCQkgICAgICAgKCgoZ2V0X29mZnNldCArIDEpICUgcmluZ19idWZzKSAhPSBwdXRfb2Zmc2V0KSkgeworCQkJaWYgKHJ4ZHAtPkNvbnRyb2xfMSA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQlyeGRwID0gKFJ4RF90ICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+Q29udHJvbF8yKTsKKwkJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCQlnZXRfaW5mby5vZmZzZXQgJT0KKwkJCQkgICAgKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQkJCWdldF9ibG9jaysrOworCQkJCWdldF9ibG9jayAlPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBvZmZzZXQgPSBnZXRfaW5mby5vZmZzZXQ7CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIGJsb2NrX2luZGV4ID0gZ2V0X2Jsb2NrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZ2V0X29mZnNldCA9CisJCQkgICAgKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgIHJ4ZHAtPkhvc3RfQ29udHJvbCk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBUaGUgc2tiIGlzICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIk51bGwgaW4gUnggSW50clxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdmFsNjQgPSBSWERfR0VUX0JVRkZFUjBfU0laRShyeGRwLT5Db250cm9sXzIpOworCQkJdmFsMTYgPSAodTE2KSAodmFsNjQgPj4gNDgpOworCQkJY2tzdW0gPSBSWERfR0VUX0w0X0NLU1VNKHJ4ZHAtPkNvbnRyb2xfMSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIGRldi0+bXR1ICsKKwkJCQkJIEhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFICsKKwkJCQkJIEhFQURFUl84MDJfMl9TSVpFICsKKwkJCQkJIEhFQURFUl9TTkFQX1NJWkUsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhfb3NtX2hhbmRsZXIobmljLCB2YWwxNiwgcnhkcCwgaSk7CisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCWdldF9pbmZvLm9mZnNldCAlPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQlyeGRwID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlwa3RfY250Kys7CisJCQlpZiAoKGluZGljYXRlX21heF9wa3RzKQorCQkJICAgICYmIChwa3RfY250ID4gaW5kaWNhdGVfbWF4X3BrdHMpKQorCQkJCWJyZWFrOworCQl9CisjZWxzZQorCQlnZXRfb2Zmc2V0ID0gKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQlzcGluX2xvY2soJm5pYy0+cHV0X2xvY2spOworCQlwdXRfb2Zmc2V0ID0gbmljLT5wdXRfcG9zW2ldOworCQlzcGluX3VubG9jaygmbmljLT5wdXRfbG9jayk7CisJCXdoaWxlICgoKCEocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKSkgJiYKKwkJCSEocnhkcC0+Q29udHJvbF8yICYgQklUKDApKSkgJiYKKwkJICAgICAgICgoKGdldF9vZmZzZXQgKyAxKSAlIHJpbmdfYnVmcykgIT0gcHV0X29mZnNldCkpIHsKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgIHJ4ZHAtPkhvc3RfQ29udHJvbCk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBUaGUgc2tiIGlzICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIk51bGwgaW4gUnggSW50clxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIEJVRjBfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMV9wdHIsCisJCQkJCSBCVUYxX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjJfcHRyLAorCQkJCQkgZGV2LT5tdHUgKyBCVUYwX0xFTiArIDQsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJYmEgPSAmbmljLT5iYVtpXVtnZXRfYmxvY2tdW2dldF9pbmZvLm9mZnNldF07CisKKwkJCXJ4X29zbV9oYW5kbGVyKG5pYywgcnhkcCwgaSwgYmEpOworCisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9CisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJcnhkcCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKworCQkJaWYgKGdldF9pbmZvLm9mZnNldCAmJgorCQkJICAgICghKGdldF9pbmZvLm9mZnNldCAlIE1BWF9SWERTX1BFUl9CTE9DSykpKSB7CisJCQkJZ2V0X2luZm8ub2Zmc2V0ID0gMDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgb2Zmc2V0ID0gZ2V0X2luZm8ub2Zmc2V0OworCQkJCWdldF9ibG9jaysrOworCQkJCWdldF9ibG9jayAlPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBibG9ja19pbmRleCA9IGdldF9ibG9jazsKKwkJCQlyeGRwID0KKwkJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS4KKwkJCQkgICAgYmxvY2tfdmlydF9hZGRyOworCQkJfQorCQkJZ2V0X29mZnNldCA9CisJCQkgICAgKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXBrdF9jbnQrKzsKKwkJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpCisJCQkgICAgJiYgKHBrdF9jbnQgPiBpbmRpY2F0ZV9tYXhfcGt0cykpCisJCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZiAoKGluZGljYXRlX21heF9wa3RzKSAmJiAocGt0X2NudCA+IGluZGljYXRlX21heF9wa3RzKSkKKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorLyoqICAKKyAqICB0eF9pbnRyX2hhbmRsZXIgLSBUcmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlcgorICogIEBuaWMgOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZQorICogIERlc2NyaXB0aW9uOiAKKyAqICBJZiBhbiBpbnRlcnJ1cHQgd2FzIHJhaXNlZCB0byBpbmRpY2F0ZSBETUEgY29tcGxldGUgb2YgdGhlIAorICogIFR4IHBhY2tldCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIEl0IGlkZW50aWZpZXMgdGhlIGxhc3QgVHhEIAorICogIHdob3NlIGJ1ZmZlciB3YXMgZnJlZWQgYW5kIGZyZWVzIGFsbCBza2JzIHdob3NlIGRhdGEgaGF2ZSBhbHJlYWR5IAorICogIERNQSdlZCBpbnRvIHRoZSBOSUNzIGludGVybmFsIG1lbW9yeS4KKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgTk9ORQorICovCisKK3N0YXRpYyB2b2lkIHR4X2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKm5pYykKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbmljLT5kZXY7CisJdHhfY3Vycl9nZXRfaW5mb190IGdldF9pbmZvLCBwdXRfaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCVR4RF90ICp0eGRscDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCWludCBpOworCXUxNiBqLCBmcmdfY250OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJLyogCisJICogdHhfdHJhZmZpY19pbnQgcmVnIGlzIGFuIFIxIHJlZ2lzdGVyLCBoZW5jZSB3ZSByZWFkIGFuZCB3cml0ZSAKKwkgKiBiYWNrIHRoZSBzYW1ldmFsdWUgaW4gdGhlIHJlZ2lzdGVyIHRvIGNsZWFyIGl0LgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnR4X3RyYWZmaWNfaW50KTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF90cmFmZmljX2ludCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWdldF9pbmZvID0gbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV07CisJCXB1dF9pbmZvID0gbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV07CisJCXR4ZGxwID0gKFR4RF90ICopIG5pYy0+bGlzdF9pbmZvW2ldW2dldF9pbmZvLm9mZnNldF0uCisJCSAgICBsaXN0X3ZpcnRfYWRkcjsKKwkJd2hpbGUgKCghKHR4ZGxwLT5Db250cm9sXzEgJiBUWERfTElTVF9PV05fWEVOQSkpICYmCisJCSAgICAgICAoZ2V0X2luZm8ub2Zmc2V0ICE9IHB1dF9pbmZvLm9mZnNldCkgJiYKKwkJICAgICAgICh0eGRscC0+SG9zdF9Db250cm9sKSkgeworCQkJLyogQ2hlY2sgZm9yIFR4RCBlcnJvcnMgKi8KKwkJCWlmICh0eGRscC0+Q29udHJvbF8xICYgVFhEX1RfQ09ERSkgeworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBlcnI7CisJCQkJZXJyID0gdHhkbHAtPkNvbnRyb2xfMSAmIFRYRF9UX0NPREU7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIqKipUeEQgZXJyb3IgJWxseFxuIiwKKwkJCQkJICBlcnIpOworCQkJfQorCisJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJICB0eGRscC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE51bGwgc2tiICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImluIFR4IEZyZWUgSW50clxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJbmljLT50eF9wa3RfY291bnQrKzsKKworCQkJZnJnX2NudCA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwkJCS8qICBGb3IgdW5mcmFnbWVudGVkIHNrYiAqLworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgdHhkbHAtPkJ1ZmZlcl9Qb2ludGVyLAorCQkJCQkgc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlpZiAoZnJnX2NudCkgeworCQkJCVR4RF90ICp0ZW1wID0gdHhkbHA7CisJCQkJdHhkbHArKzsKKwkJCQlmb3IgKGogPSAwOyBqIDwgZnJnX2NudDsgaisrLCB0eGRscCsrKSB7CisJCQkJCXNrYl9mcmFnX3QgKmZyYWcgPQorCQkJCQkgICAgJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal07CisJCQkJCXBjaV91bm1hcF9wYWdlKG5pYy0+cGRldiwKKwkJCQkJCSAgICAgICAoZG1hX2FkZHJfdCkKKwkJCQkJCSAgICAgICB0eGRscC0+CisJCQkJCQkgICAgICAgQnVmZmVyX1BvaW50ZXIsCisJCQkJCQkgICAgICAgZnJhZy0+c2l6ZSwKKwkJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQl9CisJCQkJdHhkbHAgPSB0ZW1wOworCQkJfQorCQkJbWVtc2V0KHR4ZGxwLCAwLAorCQkJICAgICAgIChzaXplb2YoVHhEX3QpICogY29uZmlnLT5tYXhfdHhkcykpOworCisJCQkvKiBVcGRhdGluZyB0aGUgc3RhdGlzdGljcyBibG9jayAqLworCQkJbmljLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluaWMtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworCQkJZ2V0X2luZm8ub2Zmc2V0Kys7CisJCQlnZXRfaW5mby5vZmZzZXQgJT0gZ2V0X2luZm8uZmlmb19sZW4gKyAxOworCQkJdHhkbHAgPSAoVHhEX3QgKikgbmljLT5saXN0X2luZm9baV0KKwkJCSAgICBbZ2V0X2luZm8ub2Zmc2V0XS5saXN0X3ZpcnRfYWRkcjsKKwkJCW1hY19jb250cm9sLT50eF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9CisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQl9CisJfQorCisJc3Bpbl9sb2NrKCZuaWMtPnR4X2xvY2spOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlzcGluX3VubG9jaygmbmljLT50eF9sb2NrKTsKK30KKworLyoqICAKKyAqICBhbGFybV9pbnRyX2hhbmRsZXIgLSBBbGFybSBJbnRlcnJydXB0IGhhbmRsZXIKKyAqICBAbmljOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZQorICogIERlc2NyaXB0aW9uOiBJZiB0aGUgaW50ZXJydXB0IHdhcyBuZWl0aGVyIGJlY2F1c2Ugb2YgUnggcGFja2V0IG9yIFR4IAorICogIGNvbXBsZXRlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSWYgdGhlIGludGVycnVwdCB3YXMgdG8gaW5kaWNhdGUKKyAqICBhIGxvc3Mgb2YgbGluaywgdGhlIE9TTSBsaW5rIHN0YXR1cyBoYW5kbGVyIGlzIGludm9rZWQgZm9yIGFueSBvdGhlciAKKyAqICBhbGFybSBpbnRlcnJ1cHQgdGhlIGJsb2NrIHRoYXQgcmFpc2VkIHRoZSBpbnRlcnJ1cHQgaXMgZGlzcGxheWVkIAorICogIGFuZCBhIEgvVyByZXNldCBpcyBpc3N1ZWQuCisgKiAgUmV0dXJuIFZhbHVlOgorICogIE5PTkUKKyovCisKK3N0YXRpYyB2b2lkIGFsYXJtX2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKm5pYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIG5pYy0+ZGV2OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMCwgZXJyX3JlZyA9IDA7CisKKwkvKiBIYW5kbGluZyBsaW5rIHN0YXR1cyBjaGFuZ2UgZXJyb3IgSW50ciAqLworCWVycl9yZWcgPSByZWFkcSgmYmFyMC0+bWFjX3JtYWNfZXJyX3JlZyk7CisJd3JpdGVxKGVycl9yZWcsICZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKwlpZiAoZXJyX3JlZyAmIFJNQUNfTElOS19TVEFURV9DSEFOR0VfSU5UKSB7CisJCXNjaGVkdWxlX3dvcmsoJm5pYy0+c2V0X2xpbmtfdGFzayk7CisJfQorCisJLyogSW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IsIHRoZSBkZXZpY2Ugd2lsbCBiZSBSZXNldC4gKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5zZXJyX3NvdXJjZSk7CisJaWYgKHZhbDY0ICYgU0VSUl9TT1VSQ0VfQU5ZKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IERldmljZSBpbmRpY2F0ZXMgIiwgZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJzZXJpb3VzIGVycm9yISFcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNjaGVkdWxlX3dvcmsoJm5pYy0+cnN0X3RpbWVyX3Rhc2spOworCX0KKworCS8qCisJICogQWxzbyBhcyBtZW50aW9uZWQgaW4gdGhlIGxhdGVzdCBFcnJhdGEgc2hlZXRzIGlmIHRoZSBQQ0NfRkJfRUNDCisJICogRXJyb3Igb2NjdXJzLCB0aGUgYWRhcHRlciB3aWxsIGJlIHJlY3ljbGVkIGJ5IGRpc2FibGluZyB0aGUKKwkgKiBhZGFwdGVyIGVuYWJsZSBiaXQgYW5kIGVuYWJsaW5nIGl0IGFnYWluIGFmdGVyIHRoZSBkZXZpY2UgCisJICogYmVjb21lcyBRdWllc2NlbnQuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGNjX2Vycl9yZWcpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBjY19lcnJfcmVnKTsKKwlpZiAodmFsNjQgJiBQQ0NfRkJfRUNDX0RCX0VSUikgeworCQl1NjQgYWMgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwkJYWMgJj0gfihBREFQVEVSX0NOVExfRU4pOworCQl3cml0ZXEoYWMsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQlhYyA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQlzY2hlZHVsZV93b3JrKCZuaWMtPnNldF9saW5rX3Rhc2spOworCX0KKworCS8qIE90aGVyIHR5cGUgb2YgaW50ZXJydXB0cyBhcmUgbm90IGJlaW5nIGhhbmRsZWQgbm93LCAgVE9ETyAqLworfQorCisvKiogCisgKiAgd2FpdF9mb3JfY21kX2NvbXBsZXRlIC0gd2FpdHMgZm9yIGEgY29tbWFuZCB0byBjb21wbGV0ZS4KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgRGVzY3JpcHRpb246IEZ1bmN0aW9uIHRoYXQgd2FpdHMgZm9yIGEgY29tbWFuZCB0byBXcml0ZSBpbnRvIFJNQUMgCisgKiAgQUREUiBEQVRBIHJlZ2lzdGVycyB0byBiZSBjb21wbGV0ZWQgYW5kIHJldHVybnMgZWl0aGVyIHN1Y2Nlc3Mgb3IgCisgKiAgZXJyb3IgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlIG9yIG5vdC4gCisgKiAgUmV0dXJuIHZhbHVlOgorICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIEZBSUxVUkUgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHdhaXRfZm9yX2NtZF9jb21wbGV0ZShuaWNfdCAqIHNwKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlpbnQgcmV0ID0gRkFJTFVSRSwgY250ID0gMDsKKwl1NjQgdmFsNjQ7CisKKwl3aGlsZSAoVFJVRSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJCWlmICghKHZhbDY0ICYgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX0NNRF9FWEVDVVRJTkcpKSB7CisJCQlyZXQgPSBTVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDUwKTsKKwkJaWYgKGNudCsrID4gMTApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiogCisgKiAgczJpb19yZXNldCAtIFJlc2V0cyB0aGUgY2FyZC4gCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgRGVzY3JpcHRpb246IEZ1bmN0aW9uIHRvIFJlc2V0IHRoZSBjYXJkLiBUaGlzIGZ1bmN0aW9uIHRoZW4gYWxzbworICogIHJlc3RvcmVzIHRoZSBwcmV2aW91c2x5IHNhdmVkIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyBhcyAKKyAqICB0aGUgY2FyZCByZXNldCBhbHNvIHJlc2V0cyB0aGUgY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX3Jlc2V0KG5pY190ICogc3ApCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NDsKKwl1MTYgc3ViaWQ7CisKKwl2YWw2NCA9IFNXX1JFU0VUX0FMTDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zd19yZXNldCk7CisKKwkvKiAKKwkgKiBBdCB0aGlzIHN0YWdlLCBpZiB0aGUgUENJIHdyaXRlIGlzIGluZGVlZCBjb21wbGV0ZWQsIHRoZSAKKwkgKiBjYXJkIGlzIHJlc2V0IGFuZCBzbyBpcyB0aGUgUENJIENvbmZpZyBzcGFjZSBvZiB0aGUgZGV2aWNlLiAKKwkgKiBTbyBhIHJlYWQgY2Fubm90IGJlIGlzc3VlZCBhdCB0aGlzIHN0YWdlIG9uIGFueSBvZiB0aGUgCisJICogcmVnaXN0ZXJzIHRvIGVuc3VyZSB0aGUgd3JpdGUgaW50byAic3dfcmVzZXQiIHJlZ2lzdGVyCisJICogaGFzIGdvbmUgdGhyb3VnaC4KKwkgKiBRdWVzdGlvbjogSXMgdGhlcmUgYW55IHN5c3RlbSBjYWxsIHRoYXQgd2lsbCBleHBsaWNpdGx5IGZvcmNlCisJICogYWxsIHRoZSB3cml0ZSBjb21tYW5kcyBzdGlsbCBwZW5kaW5nIG9uIHRoZSBidXMgdG8gYmUgcHVzaGVkCisJICogdGhyb3VnaD8KKwkgKiBBcyBvZiBub3cgSSdhbSBqdXN0IGdpdmluZyBhIDI1MG1zIGRlbGF5IGFuZCBob3BpbmcgdGhhdCB0aGUKKwkgKiBQQ0kgd3JpdGUgdG8gc3dfcmVzZXQgcmVnaXN0ZXIgaXMgZG9uZSBieSB0aGlzIHRpbWUuCisJICovCisJbXNsZWVwKDI1MCk7CisKKwkvKiBSZXN0b3JlIHRoZSBQQ0kgc3RhdGUgc2F2ZWQgZHVyaW5nIGluaXRpYWxpemFyaW9uLiAqLworCXBjaV9yZXN0b3JlX3N0YXRlKHNwLT5wZGV2KTsKKwlzMmlvX2luaXRfcGNpKHNwKTsKKworCW1zbGVlcCgyNTApOworCisJLyogU1hFLTAwMjogQ29uZmlndXJlIGxpbmsgYW5kIGFjdGl2aXR5IExFRCB0byB0dXJuIGl0IG9mZiAqLworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgfD0gMHgwMDAwODAwMDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCA9IDB4MDQxMTA0MDQwMDAwMDAwMFVMTDsKKwkJd3JpdGVxKHZhbDY0LCAodm9pZCBfX2lvbWVtICopIGJhcjAgKyAweDI3MDApOworCX0KKworCXNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlID0gRkFMU0U7Cit9CisKKy8qKgorICogIHMyaW9fc2V0X3N3YXBwZXIgLSB0byBzZXQgdGhlIHN3YXBwZXIgY29udHJvbGUgb24gdGhlIGNhcmQgCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIAorICogIHBvaW50ZXIgdG8gdGhlIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogRnVuY3Rpb24gdG8gc2V0IHRoZSBzd2FwcGVyIGNvbnRyb2wgb24gdGhlIGNhcmQgCisgKiAgY29ycmVjdGx5IGRlcGVuZGluZyBvbiB0aGUgJ2VuZGlhbm5lc3MnIG9mIHRoZSBzeXN0ZW0uCisgKiAgUmV0dXJuIHZhbHVlOgorICogIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgRkFJTFVSRSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19zZXRfc3dhcHBlcihuaWNfdCAqIHNwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+ZGV2OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQsIHZhbHQsIHZhbHI7CisKKwkvKiAKKwkgKiBTZXQgcHJvcGVyIGVuZGlhbiBzZXR0aW5ncyBhbmQgdmVyaWZ5IHRoZSBzYW1lIGJ5IHJlYWRpbmcKKwkgKiB0aGUgUElGIEZlZWQtYmFjayByZWdpc3Rlci4KKwkgKi8KKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnBpZl9yZF9zd2FwcGVyX2ZiKTsKKwlpZiAodmFsNjQgIT0gMHgwMTIzNDU2Nzg5QUJDREVGVUxMKSB7CisJCWludCBpID0gMDsKKwkJdTY0IHZhbHVlW10gPSB7IDB4QzMwMDAwQzNDMzAwMDBDM1VMTCwgICAvKiBGRT0xLCBTRT0xICovCisJCQkJMHg4MTAwMDA4MTgxMDAwMDgxVUxMLCAgLyogRkU9MSwgU0U9MCAqLworCQkJCTB4NDIwMDAwNDI0MjAwMDA0MlVMTCwgIC8qIEZFPTAsIFNFPTEgKi8KKwkJCQkwfTsgICAgICAgICAgICAgICAgICAgICAvKiBGRT0wLCBTRT0wICovCisKKwkJd2hpbGUoaTw0KSB7CisJCQl3cml0ZXEodmFsdWVbaV0sICZiYXIwLT5zd2FwcGVyX2N0cmwpOworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGlmX3JkX3N3YXBwZXJfZmIpOworCQkJaWYgKHZhbDY0ID09IDB4MDEyMzQ1Njc4OUFCQ0RFRlVMTCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJfQorCQlpZiAoaSA9PSA0KSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBFbmRpYW4gc2V0dGluZ3MgYXJlIHdyb25nLCAiLAorCQkJCWRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgImZlZWRiYWNrIHJlYWQgJWxseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCQlyZXR1cm4gRkFJTFVSRTsKKwkJfQorCQl2YWxyID0gdmFsdWVbaV07CisJfSBlbHNlIHsKKwkJdmFsciA9IHJlYWRxKCZiYXIwLT5zd2FwcGVyX2N0cmwpOworCX0KKworCXZhbHQgPSAweDAxMjM0NTY3ODlBQkNERUZVTEw7CisJd3JpdGVxKHZhbHQsICZiYXIwLT54bXNpX2FkZHJlc3MpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisKKwlpZih2YWw2NCAhPSB2YWx0KSB7CisJCWludCBpID0gMDsKKwkJdTY0IHZhbHVlW10gPSB7IDB4MDBDM0MzMDAwMEMzQzMwMFVMTCwgIC8qIEZFPTEsIFNFPTEgKi8KKwkJCQkweDAwODE4MTAwMDA4MTgxMDBVTEwsICAvKiBGRT0xLCBTRT0wICovCisJCQkJMHgwMDQyNDIwMDAwNDI0MjAwVUxMLCAgLyogRkU9MCwgU0U9MSAqLworCQkJCTB9OyAgICAgICAgICAgICAgICAgICAgIC8qIEZFPTAsIFNFPTAgKi8KKworCQl3aGlsZShpPDQpIHsKKwkJCXdyaXRlcSgodmFsdWVbaV0gfCB2YWxyKSwgJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJCQl3cml0ZXEodmFsdCwgJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT54bXNpX2FkZHJlc3MpOworCQkJaWYodmFsNjQgPT0gdmFsdCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJfQorCQlpZihpID09IDQpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiV3JpdGUgZmFpbGVkLCBYbXNpX2FkZHIgIik7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgInJlYWRzOjB4JWxseFxuIix2YWw2NCk7CisJCQlyZXR1cm4gRkFJTFVSRTsKKwkJfQorCX0KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5zd2FwcGVyX2N0cmwpOworCXZhbDY0ICY9IDB4RkZGRjAwMDAwMDAwMDAwMFVMTDsKKworI2lmZGVmICBfX0JJR19FTkRJQU4KKwkvKiAKKwkgKiBUaGUgZGV2aWNlIGJ5IGRlZmF1bHQgc2V0IHRvIGEgYmlnIGVuZGlhbiBmb3JtYXQsIHNvIGEgCisJICogYmlnIGVuZGlhbiBkcml2ZXIgbmVlZCBub3Qgc2V0IGFueXRoaW5nLgorCSAqLworCXZhbDY0IHw9IChTV0FQUEVSX0NUUkxfVFhQX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWFBfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9SX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWERfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhGX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9SX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhGX1dfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1NUQVRTX0ZFIHwgU1dBUFBFUl9DVFJMX1NUQVRTX1NFKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zd2FwcGVyX2N0cmwpOworI2Vsc2UKKwkvKiAKKwkgKiBJbml0aWFsbHkgd2UgZW5hYmxlIGFsbCBiaXRzIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSBieSB0aGUKKwkgKiBkcml2ZXIsIHRoZW4gd2Ugc2VsZWN0aXZlbHkgZW5hYmxlIG9ubHkgdGhvc2UgYml0cyB0aGF0IAorCSAqIHdlIHdhbnQgdG8gc2V0LgorCSAqLworCXZhbDY0IHw9IChTV0FQUEVSX0NUUkxfVFhQX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWFBfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9SX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWERfUl9TRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1dfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9XX1NFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWEZfUl9GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9SX1NFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1dfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1JYRl9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9YTVNJX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9YTVNJX1NFIHwKKwkJIFNXQVBQRVJfQ1RSTF9TVEFUU19GRSB8IFNXQVBQRVJfQ1RSTF9TVEFUU19TRSk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+c3dhcHBlcl9jdHJsKTsKKyNlbmRpZgorCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnN3YXBwZXJfY3RybCk7CisKKwkvKiAKKwkgKiBWZXJpZnlpbmcgaWYgZW5kaWFuIHNldHRpbmdzIGFyZSBhY2N1cmF0ZSBieSByZWFkaW5nIGEgCisJICogZmVlZGJhY2sgcmVnaXN0ZXIuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGlmX3JkX3N3YXBwZXJfZmIpOworCWlmICh2YWw2NCAhPSAweDAxMjM0NTY3ODlBQkNERUZVTEwpIHsKKwkJLyogRW5kaWFuIHNldHRpbmdzIGFyZSBpbmNvcnJlY3QsIGNhbGxzIGZvciBhbm90aGVyIGRla2tvLiAqLworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBFbmRpYW4gc2V0dGluZ3MgYXJlIHdyb25nLCAiLAorCQkJICBkZXYtPm5hbWUpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgImZlZWRiYWNrIHJlYWQgJWxseFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsNjQpOworCQlyZXR1cm4gRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyAqIEZ1bmN0aW9ucyBkZWZpbmVkIGJlbG93IGNvbmNlcm4gdGhlIE9TIHBhcnQgb2YgdGhlIGRyaXZlciAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqICAKKyAqICBzMmlvX29wZW4gLSBvcGVuIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIKKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvcGVuIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuIEl0IG1haW5seSBjYWxscyBhCisgKiAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgUnggYnVmZmVycyBhbmQgaW5zZXJ0cyB0aGVtIGludG8gdGhlIGJ1ZmZlcgorICogIGRlc2NyaXB0b3JzIGFuZCB0aGVuIGVuYWJsZXMgdGhlIFJ4IHBhcnQgb2YgdGhlIE5JQy4gCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICAgZmlsZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWludCBlcnIgPSAwOworCisJLyogCisJICogTWFrZSBzdXJlIHlvdSBoYXZlIGxpbmsgb2ZmIGJ5IGRlZmF1bHQgZXZlcnkgdGltZSAKKwkgKiBOaWMgaXMgaW5pdGlhbGl6ZWQKKwkgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXNwLT5sYXN0X2xpbmtfc3RhdGUgPSBMSU5LX0RPV047CisKKwkvKiBJbml0aWFsaXplIEgvVyBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KKwlpZiAoczJpb19jYXJkX3VwKHNwKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBIL1cgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBBZnRlciBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgSC9XLCByZWdpc3RlciBJU1IgKi8KKwllcnIgPSByZXF1ZXN0X2lycSgoaW50KSBzcC0+aXJxLCBzMmlvX2lzciwgU0FfU0hJUlEsCisJCQkgIHNwLT5uYW1lLCBkZXYpOworCWlmIChlcnIpIHsKKwkJczJpb19yZXNldChzcCk7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IElTUiByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChzMmlvX3NldF9tYWNfYWRkcihkZXYsIGRldi0+ZGV2X2FkZHIpID09IEZBSUxVUkUpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJTZXQgTWFjIEFkZHJlc3MgRmFpbGVkXG4iKTsKKwkJczJpb19yZXNldChzcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9fY2xvc2UgLWNsb3NlIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIKKyAqICBAZGV2IDogZGV2aWNlIHBvaW50ZXIuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBpcyB0aGUgc3RvcCBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyLiBJdCBuZWVkcyB0byB1bmRvIGV4YWN0bHkKKyAqICB3aGF0ZXZlciB3YXMgZG9uZSBieSB0aGUgb3BlbiBlbnRyeSBwb2ludCx0aHVzIGl0J3MgdXN1YWxseSByZWZlcnJlZCB0bworICogIGFzIHRoZSBjbG9zZSBmdW5jdGlvbi5BbW9uZyBvdGhlciB0aGluZ3MgdGhpcyBmdW5jdGlvbiBtYWlubHkgc3RvcHMgdGhlCisgKiAgUnggc2lkZSBvZiB0aGUgTklDIGFuZCBmcmVlcyBhbGwgdGhlIFJ4IGJ1ZmZlcnMgaW4gdGhlIFJ4IHJpbmdzLgorICogIFJldHVybiB2YWx1ZToKKyAqICAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlICgtKXZlIGludGVnZXIgYXMgZGVmaW5lZCBpbiBlcnJuby5oCisgKiAgZmlsZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIFJlc2V0IGNhcmQsIGtpbGwgdGFza2xldCBhbmQgZnJlZSBUeCBhbmQgUnggYnVmZmVycy4gKi8KKwlzMmlvX2NhcmRfZG93bihzcCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlzcC0+ZGV2aWNlX2Nsb3NlX2ZsYWcgPSBUUlVFOwkvKiBEZXZpY2UgaXMgc2h1dCBkb3duLiAqLworCXJldHVybiAwOworfQorCisvKioKKyAqICBzMmlvX3htaXQgLSBUeCBlbnRyeSBwb2ludCBvZiB0ZSBkcml2ZXIKKyAqICBAc2tiIDogdGhlIHNvY2tldCBidWZmZXIgY29udGFpbmluZyB0aGUgVHggZGF0YS4KKyAqICBAZGV2IDogZGV2aWNlIHBvaW50ZXIuCisgKiAgRGVzY3JpcHRpb24gOgorICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIFR4IGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuIFMySU8gTklDIHN1cHBvcnRzCisgKiAgY2VydGFpbiBwcm90b2NvbCBhc3Npc3QgZmVhdHVyZXMgb24gVHggc2lkZSwgbmFtZWx5ICBDU08sIFMvRywgTFNPLgorICogIE5PVEU6IHdoZW4gZGV2aWNlIGNhbnQgcXVldWUgdGhlIHBrdCxqdXN0IHRoZSB0cmFuc19zdGFydCB2YXJpYWJsZSB3aWxsCisgKiAgbm90IGJlIHVwYWR0ZWQuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyAmIDEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHMyaW9feG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwl1MTYgZnJnX2NudCwgZnJnX2xlbiwgaSwgcXVldWUsIHF1ZXVlX2xlbiwgcHV0X29mZiwgZ2V0X29mZjsKKwlyZWdpc3RlciB1NjQgdmFsNjQ7CisJVHhEX3QgKnR4ZHA7CisJVHhGSUZPX2VsZW1lbnRfdCBfX2lvbWVtICp0eF9maWZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgTkVUSUZfRl9UU08KKwlpbnQgbXNzOworI2VuZGlmCisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCURCR19QUklOVChUWF9EQkcsICIlczogSW4gUzJJTyBUeCByb3V0aW5lXG4iLCBkZXYtPm5hbWUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCisJaWYgKGF0b21pY19yZWFkKCZzcC0+Y2FyZF9zdGF0ZSkgPT0gQ0FSRF9ET1dOKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IENhcmQgZ29pbmcgZG93biBmb3IgcmVzZXRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCXF1ZXVlID0gMDsKKwlwdXRfb2ZmID0gKHUxNikgbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9bcXVldWVdLm9mZnNldDsKKwlnZXRfb2ZmID0gKHUxNikgbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9bcXVldWVdLm9mZnNldDsKKwl0eGRwID0gKFR4RF90ICopIHNwLT5saXN0X2luZm9bcXVldWVdW3B1dF9vZmZdLmxpc3RfdmlydF9hZGRyOworCisJcXVldWVfbGVuID0gbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9bcXVldWVdLmZpZm9fbGVuICsgMTsKKwkvKiBBdm9pZCAicHV0IiBwb2ludGVyIGdvaW5nIGJleW9uZCAiZ2V0IiBwb2ludGVyICovCisJaWYgKHR4ZHAtPkhvc3RfQ29udHJvbCB8fCAoKChwdXRfb2ZmICsgMSkgJSBxdWV1ZV9sZW4pID09IGdldF9vZmYpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiRXJyb3IgaW4geG1pdCwgTm8gZnJlZSBUWERzLlxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgTkVUSUZfRl9UU08KKwltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCWlmIChtc3MpIHsKKwkJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9UQ1BfTFNPX0VOOworCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1RDUF9MU09fTVNTKG1zcyk7CisJfQorI2VuZGlmCisKKwlmcmdfY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlmcmdfbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCisJdHhkcC0+SG9zdF9Db250cm9sID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKKwl0eGRwLT5CdWZmZXJfUG9pbnRlciA9IHBjaV9tYXBfc2luZ2xlCisJICAgIChzcC0+cGRldiwgc2tiLT5kYXRhLCBmcmdfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJdHhkcC0+Q29udHJvbF8yIHw9CisJCSAgICAoVFhEX1RYX0NLT19JUFY0X0VOIHwgVFhEX1RYX0NLT19UQ1BfRU4gfAorCQkgICAgIFRYRF9UWF9DS09fVURQX0VOKTsKKwl9CisKKwl0eGRwLT5Db250cm9sXzIgfD0gY29uZmlnLT50eF9pbnRyX3R5cGU7CisKKwl0eGRwLT5Db250cm9sXzEgfD0gKFRYRF9CVUZGRVIwX1NJWkUoZnJnX2xlbikgfAorCQkJICAgIFRYRF9HQVRIRVJfQ09ERV9GSVJTVCk7CisJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9MSVNUX09XTl9YRU5BOworCisJLyogRm9yIGZyYWdtZW50ZWQgU0tCLiAqLworCWZvciAoaSA9IDA7IGkgPCBmcmdfY250OyBpKyspIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQl0eGRwKys7CisJCXR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID0gKHU2NCkgcGNpX21hcF9wYWdlCisJCSAgICAoc3AtPnBkZXYsIGZyYWctPnBhZ2UsIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkgICAgIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX0JVRkZFUjBfU0laRShmcmFnLT5zaXplKTsKKwl9CisJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9HQVRIRVJfQ09ERV9MQVNUOworCisJdHhfZmlmbyA9IG1hY19jb250cm9sLT50eF9GSUZPX3N0YXJ0W3F1ZXVlXTsKKwl2YWw2NCA9IHNwLT5saXN0X2luZm9bcXVldWVdW3B1dF9vZmZdLmxpc3RfcGh5X2FkZHI7CisJd3JpdGVxKHZhbDY0LCAmdHhfZmlmby0+VHhETF9Qb2ludGVyKTsKKworCXZhbDY0ID0gKFRYX0ZJRk9fTEFTVF9UWERfTlVNKGZyZ19jbnQpIHwgVFhfRklGT19GSVJTVF9MSVNUIHwKKwkJIFRYX0ZJRk9fTEFTVF9MSVNUKTsKKyNpZmRlZiBORVRJRl9GX1RTTworCWlmIChtc3MpCisJCXZhbDY0IHw9IFRYX0ZJRk9fU1BFQ0lBTF9GVU5DOworI2VuZGlmCisJd3JpdGVxKHZhbDY0LCAmdHhfZmlmby0+TGlzdF9Db250cm9sKTsKKworCS8qIFBlcmZvcm0gYSBQQ0kgcmVhZCB0byBmbHVzaCBwcmV2aW91cyB3cml0ZXMgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9zdGF0dXMpOworCisJcHV0X29mZisrOworCXB1dF9vZmYgJT0gbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9bcXVldWVdLmZpZm9fbGVuICsgMTsKKwltYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0ub2Zmc2V0ID0gcHV0X29mZjsKKworCS8qIEF2b2lkICJwdXQiIHBvaW50ZXIgZ29pbmcgYmV5b25kICJnZXQiIHBvaW50ZXIgKi8KKwlpZiAoKChwdXRfb2ZmICsgMSkgJSBxdWV1ZV9sZW4pID09IGdldF9vZmYpIHsKKwkJREJHX1BSSU5UKFRYX0RCRywKKwkJCSAgIk5vIGZyZWUgVHhEcyBmb3IgeG1pdCwgUHV0OiAweCV4IEdldDoweCV4XG4iLAorCQkJICBwdXRfb2ZmLCBnZXRfb2ZmKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb19pc3IgLSBJU1IgaGFuZGxlciBvZiB0aGUgZGV2aWNlIC4KKyAqICBAaXJxOiB0aGUgaXJxIG9mIHRoZSBkZXZpY2UuCisgKiAgQGRldl9pZDogYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGRldiBzdHJ1Y3R1cmUgb2YgdGhlIE5JQy4KKyAqICBAcHRfcmVnczogcG9pbnRlciB0byB0aGUgcmVnaXN0ZXJzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgKiAgRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBJU1IgaGFuZGxlciBvZiB0aGUgZGV2aWNlLiBJdCAKKyAqICBpZGVudGlmaWVzIHRoZSByZWFzb24gZm9yIHRoZSBpbnRlcnJ1cHQgYW5kIGNhbGxzIHRoZSByZWxldmFudCAKKyAqICBzZXJ2aWNlIHJvdXRpbmVzLiBBcyBhIGNvbnRvbmdlbmN5IG1lYXN1cmUsIHRoaXMgSVNSIGFsbG9jYXRlcyB0aGUgCisgKiAgcmVjdiBidWZmZXJzLCBpZiB0aGVpciBudW1iZXJzIGFyZSBiZWxvdyB0aGUgcGFuaWMgdmFsdWUgd2hpY2ggaXMKKyAqICBwcmVzZW50bHkgc2V0IHRvIDI1JSBvZiB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIHJjdiBidWZmZXJzIGFsbG9jYXRlZC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgIElSUV9IQU5ETEVEOiB3aWxsIGJlIHJldHVybmVkIGlmIElSUSB3YXMgaGFuZGxlZCBieSB0aGlzIHJvdXRpbmUgCisgKiAgIElSUV9OT05FOiB3aWxsIGJlIHJldHVybmVkIGlmIGludGVycnVwdCBpcyBub3QgZnJvbSBvdXIgZGV2aWNlCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzMmlvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlpbnQgaSwgcmV0OworI2VuZGlmCisJdTY0IHJlYXNvbiA9IDA7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJLyogCisJICogSWRlbnRpZnkgdGhlIGNhdXNlIGZvciBpbnRlcnJ1cHQgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlCisJICogaW50ZXJydXB0IGhhbmRsZXIuIENhdXNlcyBmb3IgdGhlIGludGVycnVwdCBjb3VsZCBiZTsKKwkgKiAxLiBSeCBvZiBwYWNrZXQuCisJICogMi4gVHggY29tcGxldGUuCisJICogMy4gTGluayBkb3duLgorCSAqIDQuIEVycm9yIGluIGFueSBmdW5jdGlvbmFsIGJsb2NrcyBvZiB0aGUgTklDLiAKKwkgKi8KKwlyZWFzb24gPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfc3RhdHVzKTsKKworCWlmICghcmVhc29uKSB7CisJCS8qIFRoZSBpbnRlcnJ1cHQgd2FzIG5vdCByYWlzZWQgYnkgWGVuYS4gKi8KKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIElmIEludHIgaXMgYmVjYXVzZSBvZiBUeCBUcmFmZmljICovCisJaWYgKHJlYXNvbiAmIEdFTl9JTlRSX1RYVFJBRkZJQykgeworCQl0eF9pbnRyX2hhbmRsZXIoc3ApOworCX0KKworCS8qIElmIEludHIgaXMgYmVjYXVzZSBvZiBhbiBlcnJvciAqLworCWlmIChyZWFzb24gJiAoR0VOX0VSUk9SX0lOVFIpKQorCQlhbGFybV9pbnRyX2hhbmRsZXIoc3ApOworCisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorCWlmIChyZWFzb24gJiBHRU5fSU5UUl9SWFRSQUZGSUMpIHsKKwkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJZW5fZGlzX2FibGVfbmljX2ludHJzKHNwLCBSWF9UUkFGRklDX0lOVFIsCisJCQkJCSAgICAgIERJU0FCTEVfSU5UUlMpOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9CisJfQorI2Vsc2UKKwkvKiBJZiBJbnRyIGlzIGJlY2F1c2Ugb2YgUnggVHJhZmZpYyAqLworCWlmIChyZWFzb24gJiBHRU5fSU5UUl9SWFRSQUZGSUMpIHsKKwkJcnhfaW50cl9oYW5kbGVyKHNwKTsKKwl9CisjZW5kaWYKKworCS8qIAorCSAqIElmIHRoZSBSeCBidWZmZXIgY291bnQgaXMgYmVsb3cgdGhlIHBhbmljIHRocmVzaG9sZCB0aGVuIAorCSAqIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXRzZWxmLCAKKwkgKiBlbHNlIHNjaGVkdWxlIGEgdGFza2xldCB0byByZWFsbG9jYXRlIHRoZSBidWZmZXJzLgorCSAqLworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpbnQgcnhiX3NpemUgPSBhdG9taWNfcmVhZCgmc3AtPnJ4X2J1ZnNfbGVmdFtpXSk7CisJCWludCBsZXZlbCA9IHJ4X2J1ZmZlcl9sZXZlbChzcCwgcnhiX3NpemUsIGkpOworCisJCWlmICgobGV2ZWwgPT0gUEFOSUMpICYmICghVEFTS0xFVF9JTl9VU0UpKSB7CisJCQlEQkdfUFJJTlQoSU5UUl9EQkcsICIlczogUnggQkQgaGl0ICIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5UUl9EQkcsICJQQU5JQyBsZXZlbHNcbiIpOworCQkJaWYgKChyZXQgPSBmaWxsX3J4X2J1ZmZlcnMoc3AsIGkpKSA9PSAtRU5PTUVNKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczpPdXQgb2YgbWVtb3J5IiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiIGluIElTUiEhXG4iKTsKKwkJCQljbGVhcl9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQljbGVhcl9iaXQoMCwgKCZzcC0+dGFza2xldF9zdGF0dXMpKTsKKwkJfSBlbHNlIGlmIChsZXZlbCA9PSBMT1cpIHsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJnNwLT50YXNrKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqICBzMmlvX2dldF9zdGF0cyAtIFVwZGF0ZXMgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4gCisgKiAgQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUgaW4gdGhlIHMyaW9fbmljIAorICogIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNhbWUuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzMmlvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwlzcC0+c3RhdHMudHhfZXJyb3JzID0gbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8tPnRtYWNfYW55X2Vycl9mcm1zOworCXNwLT5zdGF0cy5yeF9lcnJvcnMgPSBtYWNfY29udHJvbC0+c3RhdHNfaW5mby0+cm1hY19kcm9wX2ZybXM7CisJc3AtPnN0YXRzLm11bHRpY2FzdCA9IG1hY19jb250cm9sLT5zdGF0c19pbmZvLT5ybWFjX3ZsZF9tY3N0X2ZybXM7CisJc3AtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCSAgICBtYWNfY29udHJvbC0+c3RhdHNfaW5mby0+cm1hY19sb25nX2ZybXM7CisKKwlyZXR1cm4gKCZzcC0+c3RhdHMpOworfQorCisvKioKKyAqICBzMmlvX3NldF9tdWx0aWNhc3QgLSBlbnRyeSBwb2ludCBmb3IgbXVsdGljYXN0IGFkZHJlc3MgZW5hYmxlL2Rpc2FibGUuCisgKiAgQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgZHJpdmVyIGVudHJ5IHBvaW50IHdoaWNoIGdldHMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgCisgKiAgd2hlbmV2ZXIgbXVsdGljYXN0IGFkZHJlc3NlcyBtdXN0IGJlIGVuYWJsZWQvZGlzYWJsZWQuIFRoaXMgYWxzbyBnZXRzIAorICogIGNhbGxlZCB0byBzZXQvcmVzZXQgcHJvbWlzY3VvdXMgbW9kZS4gRGVwZW5kaW5nIG9uIHRoZSBkZWl2Y2UgZmxhZywgd2UKKyAqICBkZXRlcm1pbmUsIGlmIG11bHRpY2FzdCBhZGRyZXNzIG11c3QgYmUgZW5hYmxlZCBvciBpZiBwcm9taXNjdW91cyBtb2RlCisgKiAgaXMgdG8gYmUgZGlzYWJsZWQgZXRjLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCBqLCBwcmV2X2NudDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NCA9IDAsIG11bHRpX21hYyA9IDB4MDEwMjAzMDQwNTA2VUxMLCBtYXNrID0KKwkgICAgMHhmZWZmZmZmZmZmZmZVTEw7CisJdTY0IGRpc19hZGRyID0gMHhmZmZmZmZmZmZmZmZVTEwsIG1hY19hZGRyID0gMDsKKwl2b2lkIF9faW9tZW0gKmFkZDsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgKCFzcC0+bV9jYXN0X2ZsZykpIHsKKwkJLyogIEVuYWJsZSBhbGwgTXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKG11bHRpX21hYyksCisJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisJCXdyaXRlcShSTUFDX0FERFJfREFUQTFfTUVNX01BU0sobWFzayksCisJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGExX21lbSk7CisJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX05FV19DTUQgfAorCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKE1BQ19NQ19BTExfTUNfQUREUl9PRkZTRVQpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJCS8qIFdhaXQgdGlsbCBjb21tYW5kIGNvbXBsZXRlcyAqLworCQl3YWl0X2Zvcl9jbWRfY29tcGxldGUoc3ApOworCisJCXNwLT5tX2Nhc3RfZmxnID0gMTsKKwkJc3AtPmFsbF9tdWx0aV9wb3MgPSBNQUNfTUNfQUxMX01DX0FERFJfT0ZGU0VUOworCX0gZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmIChzcC0+bV9jYXN0X2ZsZykpIHsKKwkJLyogIERpc2FibGUgYWxsIE11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwkJd3JpdGVxKFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihkaXNfYWRkciksCisJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX05FV19DTUQgfAorCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKHNwLT5hbGxfbXVsdGlfcG9zKTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19hZGRyX2NtZF9tZW0pOworCQkvKiBXYWl0IHRpbGwgY29tbWFuZCBjb21wbGV0ZXMgKi8KKwkJd2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKTsKKworCQlzcC0+bV9jYXN0X2ZsZyA9IDA7CisJCXNwLT5hbGxfbXVsdGlfcG9zID0gMDsKKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKCFzcC0+cHJvbWlzY19mbGcpKSB7CisJCS8qICBQdXQgdGhlIE5JQyBpbnRvIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCQl2YWw2NCB8PSBNQUNfQ0ZHX1JNQUNfUFJPTV9FTkFCTEU7CisKKwkJd3JpdGVxKFJNQUNfQ0ZHX0tFWSgweDRDMEQpLCAmYmFyMC0+cm1hY19jZmdfa2V5KTsKKwkJd3JpdGVsKCh1MzIpIHZhbDY0LCBhZGQpOworCQl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCQl3cml0ZWwoKHUzMikgKHZhbDY0ID4+IDMyKSwgKGFkZCArIDQpKTsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfY2ZnKTsKKwkJc3AtPnByb21pc2NfZmxnID0gMTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZW50ZXJlZCBwcm9taXNjdW91cyBtb2RlXG4iLAorCQkJICBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAoIShkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmIChzcC0+cHJvbWlzY19mbGcpKSB7CisJCS8qICBSZW1vdmUgdGhlIE5JQyBmcm9tIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCQl2YWw2NCAmPSB+TUFDX0NGR19STUFDX1BST01fRU5BQkxFOworCisJCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJCXdyaXRlbCgodTMyKSB2YWw2NCwgYWRkKTsKKwkJd3JpdGVxKFJNQUNfQ0ZHX0tFWSgweDRDMEQpLCAmYmFyMC0+cm1hY19jZmdfa2V5KTsKKwkJd3JpdGVsKCh1MzIpICh2YWw2NCA+PiAzMiksIChhZGQgKyA0KSk7CisKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJCXNwLT5wcm9taXNjX2ZsZyA9IDA7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IGxlZnQgcHJvbWlzY3VvdXMgbW9kZVxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiAgVXBkYXRlIGluZGl2aWR1YWwgTV9DQVNUIGFkZHJlc3MgbGlzdCAqLworCWlmICgoIXNwLT5tX2Nhc3RfZmxnKSAmJiBkZXYtPm1jX2NvdW50KSB7CisJCWlmIChkZXYtPm1jX2NvdW50ID4KKwkJICAgIChNQVhfQUREUlNfU1VQUE9SVEVEIC0gTUFDX01DX0FERFJfU1RBUlRfT0ZGU0VUIC0gMSkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE5vIG1vcmUgUnggZmlsdGVycyAiLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiY2FuIGJlIGFkZGVkLCBwbGVhc2UgZW5hYmxlICIpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJBTExfTVVMVEkgaW5zdGVhZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwcmV2X2NudCA9IHNwLT5tY19hZGRyX2NvdW50OworCQlzcC0+bWNfYWRkcl9jb3VudCA9IGRldi0+bWNfY291bnQ7CisKKwkJLyogQ2xlYXIgb3V0IHRoZSBwcmV2aW91cyBsaXN0IG9mIE1jIGluIHRoZSBIL1cuICovCisJCWZvciAoaSA9IDA7IGkgPCBwcmV2X2NudDsgaSsrKSB7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKGRpc19hZGRyKSwKKwkJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEExX01FTV9NQVNLKDBVTEwpLAorCQkgICAgICAgCQkmYmFyMC0+cm1hY19hZGRyX2RhdGExX21lbSk7CisJCQl2YWw2NCA9IFJNQUNfQUREUl9DTURfTUVNX1dFIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUCisJCQkgICAgKE1BQ19NQ19BRERSX1NUQVJUX09GRlNFVCArIGkpOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19hZGRyX2NtZF9tZW0pOworCisJCQkvKiBXYWl0IGZvciBjb21tYW5kIGNvbXBsZXRlcyAqLworCQkJaWYgKHdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCkpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBBZGRpbmcgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTXVsdGljYXN0cyBmYWlsZWRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIENyZWF0ZSB0aGUgbmV3IFJ4IGZpbHRlciBsaXN0IGFuZCB1cGRhdGUgdGhlIHNhbWUgaW4gSC9XLiAqLworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQltZW1jcHkoc3AtPnVzcl9hZGRyc1tpXS5hZGRyLCBtY2xpc3QtPmRtaV9hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCWZvciAoaiA9IDA7IGogPCBFVEhfQUxFTjsgaisrKSB7CisJCQkJbWFjX2FkZHIgfD0gbWNsaXN0LT5kbWlfYWRkcltqXTsKKwkJCQltYWNfYWRkciA8PD0gODsKKwkJCX0KKwkJCW1hY19hZGRyID4+PSA4OworCQkJd3JpdGVxKFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihtYWNfYWRkciksCisJCQkgICAgICAgJmJhcjAtPnJtYWNfYWRkcl9kYXRhMF9tZW0pOworCQkJd3JpdGVxKFJNQUNfQUREUl9EQVRBMV9NRU1fTUFTSygwVUxMKSwKKwkJICAgICAgIAkJJmJhcjAtPnJtYWNfYWRkcl9kYXRhMV9tZW0pOworCisJCQl2YWw2NCA9IFJNQUNfQUREUl9DTURfTUVNX1dFIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCQkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUCisJCQkgICAgKGkgKyBNQUNfTUNfQUREUl9TVEFSVF9PRkZTRVQpOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19hZGRyX2NtZF9tZW0pOworCisJCQkvKiBXYWl0IGZvciBjb21tYW5kIGNvbXBsZXRlcyAqLworCQkJaWYgKHdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCkpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBBZGRpbmcgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTXVsdGljYXN0cyBmYWlsZWRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiAgczJpb19zZXRfbWFjX2FkZHIgLSBQcm9ncmFtcyB0aGUgWGZyYW1lIG1hYyBhZGRyZXNzIAorICogIEBkZXYgOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogIEBhZGRyOiBhIHVjaGFyIHBvaW50ZXIgdG8gdGhlIG5ldyBtYWMgYWRkcmVzcyB3aGljaCBpcyB0byBiZSBzZXQuCisgKiAgRGVzY3JpcHRpb24gOiBUaGlzIHByb2NlZHVyZSB3aWxsIHByb2dyYW0gdGhlIFhmcmFtZSB0byByZWNlaXZlIAorICogIGZyYW1lcyB3aXRoIG5ldyBNYWMgQWRkcmVzcworICogIFJldHVybiB2YWx1ZTogU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSAoLSl2ZSBpbnRlZ2VyIAorICogIGFzIGRlZmluZWQgaW4gZXJybm8uaCBmaWxlIG9uIGZhaWx1cmUuCisgKi8KKworaW50IHMyaW9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICogYWRkcikKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCwgbWFjX2FkZHIgPSAwOworCWludCBpOworCisJLyogCisJICogU2V0IHRoZSBuZXcgTUFDIGFkZHJlc3MgYXMgdGhlIG5ldyB1bmljYXN0IGZpbHRlciBhbmQgcmVmbGVjdCB0aGlzCisJICogY2hhbmdlIG9uIHRoZSBkZXZpY2UgYWRkcmVzcyByZWdpc3RlcmVkIHdpdGggdGhlIE9TLiBJdCB3aWxsIGJlCisJICogYXQgb2Zmc2V0IDAuIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCW1hY19hZGRyIDw8PSA4OworCQltYWNfYWRkciB8PSBhZGRyW2ldOworCX0KKworCXdyaXRlcShSTUFDX0FERFJfREFUQTBfTUVNX0FERFIobWFjX2FkZHIpLAorCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisKKwl2YWw2NCA9CisJICAgIFJNQUNfQUREUl9DTURfTUVNX1dFIHwgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX05FV19DTUQgfAorCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQoMCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19hZGRyX2NtZF9tZW0pOworCS8qIFdhaXQgdGlsbCBjb21tYW5kIGNvbXBsZXRlcyAqLworCWlmICh3YWl0X2Zvcl9jbWRfY29tcGxldGUoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IHNldF9tYWNfYWRkciBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAqIHMyaW9fZXRodG9vbF9zc2V0IC0gU2V0cyBkaWZmZXJlbnQgbGluayBwYXJhbWV0ZXJzLiAKKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlICAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBpbmZvOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGV0aHRvb2wgdG8gc2V0CisgKiBsaW5rIGluZm9ybWF0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBUaGUgZnVuY3Rpb24gc2V0cyBkaWZmZXJlbnQgbGluayBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9udG8gCisgKiB0aGUgTklDLgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfc3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmluZm8pCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWlmICgoaW5mby0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgfHwKKwkgICAgKGluZm8tPnNwZWVkICE9IFNQRUVEXzEwMDAwKSB8fCAoaW5mby0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSB7CisJCXMyaW9fY2xvc2Uoc3AtPmRldik7CisJCXMyaW9fb3BlbihzcC0+ZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2V0aHRvbF9nc2V0IC0gUmV0dXJuIGxpbmsgc3BlY2lmaWMgaW5mb3JtYXRpb24uIAorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHBvaW50ZXIgdG8gdGhlCisgKiAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBpbmZvIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sCisgKiB0byByZXR1cm4gbGluayBpbmZvcm1hdGlvbi4KKyAqIERlc2NyaXB0aW9uOgorICogUmV0dXJucyBsaW5rIHNwZWNpZmljIGluZm9ybWF0aW9uIGxpa2Ugc3BlZWQsIGR1cGxleCBldGMuLiB0byBldGh0b29sLgorICogUmV0dXJuIHZhbHVlIDoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmluZm8pCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWluZm8tPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwlpbmZvLT5hZHZlcnRpc2luZyA9IChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwlpbmZvLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkvKiBpbmZvLT50cmFuc2NlaXZlcj8/IFRPRE8gKi8KKworCWlmIChuZXRpZl9jYXJyaWVyX29rKHNwLT5kZXYpKSB7CisJCWluZm8tPnNwZWVkID0gMTAwMDA7CisJCWluZm8tPmR1cGxleCA9IERVUExFWF9GVUxMOworCX0gZWxzZSB7CisJCWluZm8tPnNwZWVkID0gLTE7CisJCWluZm8tPmR1cGxleCA9IC0xOworCX0KKworCWluZm8tPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX2dkcnZpbmZvIC0gUmV0dXJucyBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24uIAorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgKiBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAaW5mbyA6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgZXRodG9vbCB0bworICogcmV0dXJuIGRyaXZlciBpbmZvcm1hdGlvbi4KKyAqIERlc2NyaXB0aW9uOgorICogUmV0dXJucyBkcml2ZXIgc3BlY2VmaWMgaW5mb3JtYXRpb24gbGlrZSBuYW1lLCB2ZXJzaW9uIGV0Yy4uIHRvIGV0aHRvb2wuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgdm9pZAorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fZXRodG9vbF9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgczJpb19kcml2ZXJfbmFtZSwgc2l6ZW9mKHMyaW9fZHJpdmVyX25hbWUpKTsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sIHMyaW9fZHJpdmVyX3ZlcnNpb24sCisJCXNpemVvZihzMmlvX2RyaXZlcl92ZXJzaW9uKSk7CisJc3RybmNweShpbmZvLT5md192ZXJzaW9uLCAiIiwgMzIpOworCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHNwLT5wZGV2KSwgMzIpOworCWluZm8tPnJlZ2R1bXBfbGVuID0gWEVOQV9SRUdfU1BBQ0U7CisJaW5mby0+ZWVkdW1wX2xlbiA9IFhFTkFfRUVQUk9NX1NQQUNFOworCWluZm8tPnRlc3RpbmZvX2xlbiA9IFMySU9fVEVTVF9MRU47CisJaW5mby0+bl9zdGF0cyA9IFMySU9fU1RBVF9MRU47Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF9ncmVncyAtIGR1bXBzIHRoZSBlbnRpcmUgc3BhY2Ugb2YgWGZhbWUgaW50byB0aGUgYnVmZmVyLgorICogIEBzcDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgKiAgczJpb19uaWMgc3RydWN0dXJlLgorICogIEByZWdzIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sIGZvciAKKyAqICBkdW1waW5nIHRoZSByZWdpc3RlcnMuCisgKiAgQHJlZ19zcGFjZTogVGhlIGlucHV0IGFyZ3VtbmV0IGludG8gd2hpY2ggYWxsIHRoZSByZWdpc3RlcnMgYXJlIGR1bXBlZC4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBEdW1wcyB0aGUgZW50aXJlIHJlZ2lzdGVyIHNwYWNlIG9mIHhGcmFtZSBOSUMgaW50byB0aGUgdXNlciBnaXZlbgorICogIGJ1ZmZlciBhcmVhLgorICogUmV0dXJuIHZhbHVlIDoKKyAqIHZvaWQgLgorKi8KKworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dyZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqc3BhY2UpCit7CisJaW50IGk7CisJdTY0IHJlZzsKKwl1OCAqcmVnX3NwYWNlID0gKHU4ICopIHNwYWNlOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCXJlZ3MtPmxlbiA9IFhFTkFfUkVHX1NQQUNFOworCXJlZ3MtPnZlcnNpb24gPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKworCWZvciAoaSA9IDA7IGkgPCByZWdzLT5sZW47IGkgKz0gOCkgeworCQlyZWcgPSByZWFkcShzcC0+YmFyMCArIGkpOworCQltZW1jcHkoKHJlZ19zcGFjZSArIGkpLCAmcmVnLCA4KTsKKwl9Cit9CisKKy8qKgorICogIHMyaW9fcGh5X2lkICAtIHRpbWVyIGZ1bmN0aW9uIHRoYXQgYWx0ZXJuYXRlcyBhZGFwdGVyIExFRC4KKyAqICBAZGF0YSA6IGFkZHJlc3Mgb2YgdGhlIHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCAKKyAqICBpcyBhIHBvaW50ZXIgdG8gdGhlIHMyaW9fbmljIHN0cnVjdHVyZSwgcHJvdmlkZWQgYXMgYW4gdTMyLgorICogRGVzY3JpcHRpb246IFRoaXMgaXMgYWN0dWFsbHkgdGhlIHRpbWVyIGZ1bmN0aW9uIHRoYXQgYWx0ZXJuYXRlcyB0aGUgCisgKiBhZGFwdGVyIExFRCBiaXQgb2YgdGhlIGFkYXB0ZXIgY29udHJvbCBiaXQgdG8gc2V0L3Jlc2V0IGV2ZXJ5IHRpbWUgb24gCisgKiBpbnZvY2F0aW9uLiBUaGUgdGltZXIgaXMgc2V0IGZvciAxLzIgYSBzZWNvbmQsIGhlbmNlIHRoYSBOSUMgYmxpbmtzIAorICogIG9uY2UgZXZlcnkgc2Vjb25kLgorKi8KK3N0YXRpYyB2b2lkIHMyaW9fcGh5X2lkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwluaWNfdCAqc3AgPSAobmljX3QgKikgZGF0YTsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0ID0gMDsKKwl1MTYgc3ViaWQ7CisKKwlzdWJpZCA9IHNwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWlmICgoc3ViaWQgJiAweEZGKSA+PSAweDA3KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0IF49IEdQSU9fQ1RSTF9HUElPXzA7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJfSBlbHNlIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwkJdmFsNjQgXj0gQURBUFRFUl9MRURfT047CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJfQorCisJbW9kX3RpbWVyKCZzcC0+aWRfdGltZXIsIGppZmZpZXMgKyBIWiAvIDIpOworfQorCisvKioKKyAqIHMyaW9fZXRodG9vbF9pZG5pYyAtIFRvIHBoeXNpY2FsbHkgaWRlbnRpZnkgdGhlIG5pYyBvbiB0aGUgc3lzdGVtLgorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBpZCA6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIGlkZW50aWZpY2F0aW9uIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgCisgKiBldGh0b29sLgorICogRGVzY3JpcHRpb246IFVzZWQgdG8gcGh5c2ljYWxseSBpZGVudGlmeSB0aGUgTklDIG9uIHRoZSBzeXN0ZW0uCisgKiBUaGUgTGluayBMRUQgd2lsbCBibGluayBmb3IgYSB0aW1lIHNwZWNpZmllZCBieSB0aGUgdXNlciBmb3IgCisgKiBpZGVudGlmaWNhdGlvbi4KKyAqIE5PVEU6IFRoZSBMaW5rIGhhcyB0byBiZSBVcCB0byBiZSBhYmxlIHRvIGJsaW5rIHRoZSBMRUQuIEhlbmNlIAorICogaWRlbnRpZmljYXRpb24gaXMgcG9zc2libGUgb25seSBpZiBpdCdzIGxpbmsgaXMgdXAuCisgKiBSZXR1cm4gdmFsdWU6CisgKiBpbnQgLCByZXR1cm5zIDAgb24gc3VjY2VzcworICovCisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX2lkbmljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXU2NCB2YWw2NCA9IDAsIGxhc3RfZ3Bpb19jdHJsX3ZhbDsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXUxNiBzdWJpZDsKKworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJbGFzdF9ncGlvX2N0cmxfdmFsID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJaWYgKChzdWJpZCAmIDB4RkYpIDwgMHgwNykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQlpZiAoISh2YWw2NCAmIEFEQVBURVJfQ05UTF9FTikpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJBZGFwdGVyIExpbmsgZG93biwgY2Fubm90IGJsaW5rIExFRFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlpZiAoc3AtPmlkX3RpbWVyLmZ1bmN0aW9uID09IE5VTEwpIHsKKwkJaW5pdF90aW1lcigmc3AtPmlkX3RpbWVyKTsKKwkJc3AtPmlkX3RpbWVyLmZ1bmN0aW9uID0gczJpb19waHlfaWQ7CisJCXNwLT5pZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNwOworCX0KKwltb2RfdGltZXIoJnNwLT5pZF90aW1lciwgamlmZmllcyk7CisJaWYgKGRhdGEpCisJCW1zbGVlcChkYXRhICogMTAwMCk7CisJZWxzZQorCQltc2xlZXAoMHhGRkZGRkZGRik7CisJZGVsX3RpbWVyX3N5bmMoJnNwLT5pZF90aW1lcik7CisKKwlpZiAoQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKHN1YmlkKSkgeworCQl3cml0ZXEobGFzdF9ncGlvX2N0cmxfdmFsLCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJbGFzdF9ncGlvX2N0cmxfdmFsID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX2dldHBhdXNlX2RhdGEgLVBhdXNlIGZyYW1lIGZyYW1lIGdlbmVyYXRpb24gYW5kIHJlY2VwdGlvbi4KKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlICAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBlcCA6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIHBhdXNlIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgZXRodG9vbC4KKyAqIERlc2NyaXB0aW9uOgorICogUmV0dXJucyB0aGUgUGF1c2UgZnJhbWUgZ2VuZXJhdGlvbiBhbmQgcmVjZXB0aW9uIGNhcGFiaWxpdHkgb2YgdGhlIE5JQy4KKyAqIFJldHVybiB2YWx1ZToKKyAqICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIHMyaW9fZXRodG9vbF9nZXRwYXVzZV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwKQoreworCXU2NCB2YWw2NDsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCWlmICh2YWw2NCAmIFJNQUNfUEFVU0VfR0VOX0VOQUJMRSkKKwkJZXAtPnR4X3BhdXNlID0gVFJVRTsKKwlpZiAodmFsNjQgJiBSTUFDX1BBVVNFX1JYX0VOQUJMRSkKKwkJZXAtPnJ4X3BhdXNlID0gVFJVRTsKKwllcC0+YXV0b25lZyA9IEZBTFNFOworfQorCisvKioKKyAqIHMyaW9fZXRodG9vbF9zZXRwYXVzZV9kYXRhIC0gIHNldC9yZXNldCBwYXVzZSBmcmFtZSBnZW5lcmF0aW9uLgorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgKiAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBlcCA6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIHBhdXNlIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgZXRodG9vbC4KKyAqIERlc2NyaXB0aW9uOgorICogSXQgY2FuIGJlIHVzZWQgdG8gc2V0IG9yIHJlc2V0IFBhdXNlIGZyYW1lIGdlbmVyYXRpb24gb3IgcmVjZXB0aW9uCisgKiBzdXBwb3J0IG9mIHRoZSBOSUMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiBpbnQsIHJldHVybnMgMCBvbiBTdWNjZXNzCisgKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfc2V0cGF1c2VfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwKQoreworCXU2NCB2YWw2NDsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCWlmIChlcC0+dHhfcGF1c2UpCisJCXZhbDY0IHw9IFJNQUNfUEFVU0VfR0VOX0VOQUJMRTsKKwllbHNlCisJCXZhbDY0ICY9IH5STUFDX1BBVVNFX0dFTl9FTkFCTEU7CisJaWYgKGVwLT5yeF9wYXVzZSkKKwkJdmFsNjQgfD0gUk1BQ19QQVVTRV9SWF9FTkFCTEU7CisJZWxzZQorCQl2YWw2NCAmPSB+Uk1BQ19QQVVTRV9SWF9FTkFCTEU7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlYWRfZWVwcm9tIC0gcmVhZHMgNCBieXRlcyBvZiBkYXRhIGZyb20gdXNlciBnaXZlbiBvZmZzZXQuCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICAgICAgczJpb19uaWMgc3RydWN0dXJlLgorICogQG9mZiA6IG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAqIEBkYXRhIDogSXRzIGFuIG91dHB1dCBwYXJhbWV0ZXIgd2hlcmUgdGhlIGRhdGEgcmVhZCBhdCB0aGUgZ2l2ZW4KKyAqIAlvZmZzZXQgaXMgc3RvcmVkLgorICogRGVzY3JpcHRpb246CisgKiBXaWxsIHJlYWQgNCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIHVzZXIgZ2l2ZW4gb2Zmc2V0IGFuZCByZXR1cm4gdGhlIAorICogcmVhZCBkYXRhLgorICogTk9URTogV2lsbCBhbGxvdyB0byByZWFkIG9ubHkgcGFydCBvZiB0aGUgRUVQUk9NIHZpc2libGUgdGhyb3VnaCB0aGUKKyAqICAgSTJDIGJ1cy4KKyAqIFJldHVybiB2YWx1ZToKKyAqICAtMSBvbiBmYWlsdXJlIGFuZCAwIG9uIHN1Y2Nlc3MuCisgKi8KKworI2RlZmluZSBTMklPX0RFVl9JRAkJNQorc3RhdGljIGludCByZWFkX2VlcHJvbShuaWNfdCAqIHNwLCBpbnQgb2ZmLCB1MzIgKiBkYXRhKQoreworCWludCByZXQgPSAtMTsKKwl1MzIgZXhpdF9jbnQgPSAwOworCXU2NCB2YWw2NDsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IEkyQ19DT05UUk9MX0RFVl9JRChTMklPX0RFVl9JRCkgfCBJMkNfQ09OVFJPTF9BRERSKG9mZikgfAorCSAgICBJMkNfQ09OVFJPTF9CWVRFX0NOVCgweDMpIHwgSTJDX0NPTlRST0xfUkVBRCB8CisJICAgIEkyQ19DT05UUk9MX0NOVExfU1RBUlQ7CisJU1BFQ0lBTF9SRUdfV1JJVEUodmFsNjQsICZiYXIwLT5pMmNfY29udHJvbCwgTEYpOworCisJd2hpbGUgKGV4aXRfY250IDwgNSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5pMmNfY29udHJvbCk7CisJCWlmIChJMkNfQ09OVFJPTF9DTlRMX0VORCh2YWw2NCkpIHsKKwkJCSpkYXRhID0gSTJDX0NPTlRST0xfR0VUX0RBVEEodmFsNjQpOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCg1MCk7CisJCWV4aXRfY250Kys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgd3JpdGVfZWVwcm9tIC0gYWN0dWFsbHkgd3JpdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBkYXRhIHZhbHVlLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgICAgICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQG9mZiA6IG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAqICBAZGF0YSA6IFRoZSBkYXRhIHRoYXQgaXMgdG8gYmUgd3JpdHRlbgorICogIEBjbnQgOiBOdW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGRhdGEgdGhhdCBhcmUgYWN0dWFsbHkgdG8gYmUgd3JpdHRlbiBpbnRvIAorICogIHRoZSBFZXByb20uIChtYXggb2YgMykKKyAqIERlc2NyaXB0aW9uOgorICogIEFjdHVhbGx5IHdyaXRlcyB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGUgZGF0YSB2YWx1ZSBpbnRvIHRoZSBFZXByb20KKyAqICB0aHJvdWdoIHRoZSBJMkMgYnVzLgorICogUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHdyaXRlX2VlcHJvbShuaWNfdCAqIHNwLCBpbnQgb2ZmLCB1MzIgZGF0YSwgaW50IGNudCkKK3sKKwlpbnQgZXhpdF9jbnQgPSAwLCByZXQgPSAtMTsKKwl1NjQgdmFsNjQ7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCisJdmFsNjQgPSBJMkNfQ09OVFJPTF9ERVZfSUQoUzJJT19ERVZfSUQpIHwgSTJDX0NPTlRST0xfQUREUihvZmYpIHwKKwkgICAgSTJDX0NPTlRST0xfQllURV9DTlQoY250KSB8IEkyQ19DT05UUk9MX1NFVF9EQVRBKGRhdGEpIHwKKwkgICAgSTJDX0NPTlRST0xfQ05UTF9TVEFSVDsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPmkyY19jb250cm9sLCBMRik7CisKKwl3aGlsZSAoZXhpdF9jbnQgPCA1KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmkyY19jb250cm9sKTsKKwkJaWYgKEkyQ19DT05UUk9MX0NOVExfRU5EKHZhbDY0KSkgeworCQkJaWYgKCEodmFsNjQgJiBJMkNfQ09OVFJPTF9OQUNLKSkKKwkJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDUwKTsKKwkJZXhpdF9jbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBzMmlvX2V0aHRvb2xfZ2VlcHJvbSAgLSByZWFkcyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFZXByb20uCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgKiAgICAgICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQGVlcHJvbSA6IHBvaW50ZXIgdG8gdGhlIHVzZXIgbGV2ZWwgc3RydWN0dXJlIHByb3ZpZGVkIGJ5IGV0aHRvb2wsIAorICogIGNvbnRhaW5pbmcgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uLgorICogIEBkYXRhX2J1ZiA6IHVzZXIgZGVmaW5lZCB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gRWVwcm9tLgorICogIERlc2NyaXB0aW9uOiBSZWFkcyB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgRWVwcm9tIGF0IGdpdmVuIG9mZnNldAorICogIGZvciBhIGdpdmVuIGxlbmd0aC4gU3RvcmVzIHRoZXNlIHZhbHVlcyBpbnQgdGhlIGlucHV0IGFyZ3VtZW50IGRhdGEKKyAqICBidWZmZXIgJ2RhdGFfYnVmJyBhbmQgcmV0dXJucyB0aGVzZSB0byB0aGUgY2FsbGVyIChldGh0b29sLikKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgaW50ICAwIG9uIHN1Y2Nlc3MKKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9nZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICogZGF0YV9idWYpCit7CisJdTMyIGRhdGEsIGksIHZhbGlkOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCWVlcHJvbS0+bWFnaWMgPSBzcC0+cGRldi0+dmVuZG9yIHwgKHNwLT5wZGV2LT5kZXZpY2UgPDwgMTYpOworCisJaWYgKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSA+IChYRU5BX0VFUFJPTV9TUEFDRSkpCisJCWVlcHJvbS0+bGVuID0gWEVOQV9FRVBST01fU1BBQ0UgLSBlZXByb20tPm9mZnNldDsKKworCWZvciAoaSA9IDA7IGkgPCBlZXByb20tPmxlbjsgaSArPSA0KSB7CisJCWlmIChyZWFkX2VlcHJvbShzcCwgKGVlcHJvbS0+b2Zmc2V0ICsgaSksICZkYXRhKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSZWFkIG9mIEVFUFJPTSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdmFsaWQgPSBJTlYoZGF0YSk7CisJCW1lbWNweSgoZGF0YV9idWYgKyBpKSwgJnZhbGlkLCA0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF9zZWVwcm9tIC0gdHJpZXMgdG8gd3JpdGUgdGhlIHVzZXIgcHJvdmlkZWQgdmFsdWUgaW4gRWVwcm9tCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQGVlcHJvbSA6IHBvaW50ZXIgdG8gdGhlIHVzZXIgbGV2ZWwgc3RydWN0dXJlIHByb3ZpZGVkIGJ5IGV0aHRvb2wsIAorICogIGNvbnRhaW5pbmcgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uLgorICogIEBkYXRhX2J1ZiA7IHVzZXIgZGVmaW5lZCB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gRWVwcm9tLgorICogIERlc2NyaXB0aW9uOgorICogIFRyaWVzIHRvIHdyaXRlIHRoZSB1c2VyIHByb3ZpZGVkIHZhbHVlIGluIHRoZSBFZXByb20sIGF0IHRoZSBvZmZzZXQKKyAqICBnaXZlbiBieSB0aGUgdXNlci4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzLCAtRUZBVUxUIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfc2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAorCQkJCXU4ICogZGF0YV9idWYpCit7CisJaW50IGxlbiA9IGVlcHJvbS0+bGVuLCBjbnQgPSAwOworCXUzMiB2YWxpZCA9IDAsIGRhdGE7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJaWYgKGVlcHJvbS0+bWFnaWMgIT0gKHNwLT5wZGV2LT52ZW5kb3IgfCAoc3AtPnBkZXYtPmRldmljZSA8PCAxNikpKSB7CisJCURCR19QUklOVChFUlJfREJHLAorCQkJICAiRVRIVE9PTF9XUklURV9FRVBST00gRXJyOiBNYWdpYyB2YWx1ZSAiKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJpcyB3cm9uZywgSXRzIG5vdCAweCV4XG4iLAorCQkJICBlZXByb20tPm1hZ2ljKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJd2hpbGUgKGxlbikgeworCQlkYXRhID0gKHUzMikgZGF0YV9idWZbY250XSAmIDB4MDAwMDAwRkY7CisJCWlmIChkYXRhKSB7CisJCQl2YWxpZCA9ICh1MzIpIChkYXRhIDw8IDI0KTsKKwkJfSBlbHNlCisJCQl2YWxpZCA9IGRhdGE7CisKKwkJaWYgKHdyaXRlX2VlcHJvbShzcCwgKGVlcHJvbS0+b2Zmc2V0ICsgY250KSwgdmFsaWQsIDApKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkgICJFVEhUT09MX1dSSVRFX0VFUFJPTSBFcnI6IENhbm5vdCAiKTsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIndyaXRlIGludG8gdGhlIHNwZWNpZmllZCBvZmZzZXRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY250Kys7CisJCWxlbi0tOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHMyaW9fcmVnaXN0ZXJfdGVzdCAtIHJlYWRzIGFuZCB3cml0ZXMgaW50byBhbGwgY2xvY2sgZG9tYWlucy4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhIDogdmFyaWFibGUgdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUgdGVzdCBjb25kdWN0ZWQgYgorICogYnkgdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBhbmQgd3JpdGUgaW50byBhbGwgY2xvY2sgZG9tYWlucy4gVGhlIE5JQyBoYXMgMyBjbG9jayBkb21haW5zLAorICogc2VlIHRoYXQgcmVnaXN0ZXJzIGluIGFsbCB0aGUgdGhyZWUgcmVnaW9ucyBhcmUgYWNjZXNzaWJsZS4KKyAqIFJldHVybiB2YWx1ZToKKyAqIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fcmVnaXN0ZXJfdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NCA9IDA7CisJaW50IGZhaWwgPSAwOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGNjX2VuYWJsZSk7CisJaWYgKHZhbDY0ICE9IDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgeworCQlmYWlsID0gMTsKKwkJREJHX1BSSU5UKElORk9fREJHLCAiUmVhZCBUZXN0IGxldmVsIDEgZmFpbHNcbiIpOworCX0KKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfcGF1c2VfY2ZnKTsKKwlpZiAodmFsNjQgIT0gMHhjMDAwZmZmZjAwMDAwMDAwVUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICJSZWFkIFRlc3QgbGV2ZWwgMiBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfcXVldWVfY2ZnKTsKKwlpZiAodmFsNjQgIT0gMHgwODA4MDgwODA4MDgwODA4VUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICJSZWFkIFRlc3QgbGV2ZWwgMyBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eGd4c19lZmlmb19jZmcpOworCWlmICh2YWw2NCAhPSAweDAwMDAwMDAwMTkyMzE0MUVVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChJTkZPX0RCRywgIlJlYWQgVGVzdCBsZXZlbCA0IGZhaWxzXG4iKTsKKwl9CisKKwl2YWw2NCA9IDB4NUE1QTVBNUE1QTVBNUE1QVVMTDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT54bXNpX2RhdGEpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnhtc2lfZGF0YSk7CisJaWYgKHZhbDY0ICE9IDB4NUE1QTVBNUE1QTVBNUE1QVVMTCkgeworCQlmYWlsID0gMTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJXcml0ZSBUZXN0IGxldmVsIDEgZmFpbHNcbiIpOworCX0KKworCXZhbDY0ID0gMHhBNUE1QTVBNUE1QTVBNUE1VUxMOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnhtc2lfZGF0YSk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eG1zaV9kYXRhKTsKKwlpZiAodmFsNjQgIT0gMHhBNUE1QTVBNUE1QTVBNUE1VUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIldyaXRlIFRlc3QgbGV2ZWwgMiBmYWlsc1xuIik7CisJfQorCisJKmRhdGEgPSBmYWlsOworCXJldHVybiAwOworfQorCisvKioKKyAqIHMyaW9fZWVwcm9tX3Rlc3QgLSB0byB2ZXJpZnkgdGhhdCBFRXByb20gaW4gdGhlIHhlbmEgY2FuIGJlIHByb2dyYW1tZWQuIAorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhOnZhcmlhYmxlIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlIHRlc3QgY29uZHVjdGVkIGJ5CisgKiB0aGUgZHJpdmVyLgorICogRGVzY3JpcHRpb246CisgKiBWZXJpZnkgdGhhdCBFRVBST00gaW4gdGhlIHhlbmEgY2FuIGJlIHByb2dyYW1tZWQgdXNpbmcgSTJDX0NPTlRST0wgCisgKiByZWdpc3Rlci4KKyAqIFJldHVybiB2YWx1ZToKKyAqIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fZWVwcm9tX3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCWludCBmYWlsID0gMDsKKwl1MzIgcmV0X2RhdGE7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCAwICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDAsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgYXQgb2Zmc2V0IDRmMCAqLworCWlmICh3cml0ZV9lZXByb20oc3AsIDB4NEYwLCAweDAxMjM0NTY3LCAzKSkKKwkJZmFpbCA9IDE7CisJaWYgKHJlYWRfZWVwcm9tKHNwLCAweDRGMCwgJnJldF9kYXRhKSkKKwkJZmFpbCA9IDE7CisKKwlpZiAocmV0X2RhdGEgIT0gMHgwMTIzNDU2NykKKwkJZmFpbCA9IDE7CisKKwkvKiBSZXNldCB0aGUgRUVQUk9NIGRhdGEgZ28gRkZGRiAqLworCXdyaXRlX2VlcHJvbShzcCwgMHg0RjAsIDB4RkZGRkZGRkYsIDMpOworCisJLyogVGVzdCBXcml0ZSBSZXF1ZXN0IEVycm9yIGF0IG9mZnNldCAweDdjICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4MDdDLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkvKiBUZXN0IFdyaXRlIFJlcXVlc3QgYXQgb2Zmc2V0IDB4N2ZjICovCisJaWYgKHdyaXRlX2VlcHJvbShzcCwgMHg3RkMsIDB4MDEyMzQ1NjcsIDMpKQorCQlmYWlsID0gMTsKKwlpZiAocmVhZF9lZXByb20oc3AsIDB4N0ZDLCAmcmV0X2RhdGEpKQorCQlmYWlsID0gMTsKKworCWlmIChyZXRfZGF0YSAhPSAweDAxMjM0NTY3KQorCQlmYWlsID0gMTsKKworCS8qIFJlc2V0IHRoZSBFRVBST00gZGF0YSBnbyBGRkZGICovCisJd3JpdGVfZWVwcm9tKHNwLCAweDdGQywgMHhGRkZGRkZGRiwgMyk7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCAweDgwICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4MDgwLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCAweGZjICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4MEZDLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCAweDEwMCAqLworCWlmICghd3JpdGVfZWVwcm9tKHNwLCAweDEwMCwgMCwgMykpCisJCWZhaWwgPSAxOworCisJLyogVGVzdCBXcml0ZSBFcnJvciBhdCBvZmZzZXQgNGVjICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4NEVDLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkqZGF0YSA9IGZhaWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19iaXN0X3Rlc3QgLSBpbnZva2VzIHRoZSBNZW1CaXN0IHRlc3Qgb2YgdGhlIGNhcmQgLgorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgKiBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAZGF0YTp2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IGNvbmR1Y3RlZCBieSAKKyAqIHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgaW52b2tlcyB0aGUgTWVtQmlzdCB0ZXN0IG9mIHRoZSBjYXJkLiBXZSBnaXZlIGFyb3VuZAorICogMiBzZWNzIHRpbWUgZm9yIHRoZSBUZXN0IHRvIGNvbXBsZXRlLiBJZiBpdCdzIHN0aWxsIG5vdCBjb21wbGV0ZQorICogd2l0aGluIHRoaXMgcGVpb2QsIHdlIGNvbnNpZGVyIHRoYXQgdGhlIHRlc3QgZmFpbGVkLiAKKyAqIFJldHVybiB2YWx1ZToKKyAqIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fYmlzdF90ZXN0KG5pY190ICogc3AsIHVpbnQ2NF90ICogZGF0YSkKK3sKKwl1OCBiaXN0ID0gMDsKKwlpbnQgY250ID0gMCwgcmV0ID0gLTE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShzcC0+cGRldiwgUENJX0JJU1QsICZiaXN0KTsKKwliaXN0IHw9IFBDSV9CSVNUX1NUQVJUOworCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJX0JJU1QsIGJpc3QpOworCisJd2hpbGUgKGNudCA8IDIwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNwLT5wZGV2LCBQQ0lfQklTVCwgJmJpc3QpOworCQlpZiAoIShiaXN0ICYgUENJX0JJU1RfU1RBUlQpKSB7CisJCQkqZGF0YSA9IChiaXN0ICYgUENJX0JJU1RfQ09ERV9NQVNLKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMTAwKTsKKwkJY250Kys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzMmlvLWxpbmtfdGVzdCAtIHZlcmlmaWVzIHRoZSBsaW5rIHN0YXRlIG9mIHRoZSBuaWMgIAorICogQHNwIDsgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgCisgKiBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAZGF0YTogdmFyaWFibGUgdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUgdGVzdCBjb25kdWN0ZWQgYnkKKyAqIHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZSBmdW5jdGlvbiB2ZXJpZmllcyB0aGUgbGluayBzdGF0ZSBvZiB0aGUgTklDIGFuZCB1cGRhdGVzIHRoZSBpbnB1dCAKKyAqIGFyZ3VtZW50ICdkYXRhJyBhcHByb3ByaWF0ZWx5LgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgczJpb19saW5rX3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQ7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7CisJaWYgKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUk1BQ19MT0NBTF9GQVVMVCkKKwkJKmRhdGEgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19ybGRyYW1fdGVzdCAtIG9mZmxpbmUgdGVzdCBmb3IgYWNjZXNzIHRvIHRoZSBSbGRSYW0gY2hpcCBvbiB0aGUgTklDIAorICogQHNwIC0gcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgIAorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGRhdGEgLSB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IAorICogY29uZHVjdGVkIGJ5IHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGlzIG9uZSBvZiB0aGUgb2ZmbGluZSB0ZXN0IHRoYXQgdGVzdHMgdGhlIHJlYWQgYW5kIHdyaXRlIAorICogIGFjY2VzcyB0byB0aGUgUmxkUmFtIGNoaXAgb24gdGhlIE5JQy4KKyAqIFJldHVybiB2YWx1ZToKKyAqICAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBzMmlvX3JsZHJhbV90ZXN0KG5pY190ICogc3AsIHVpbnQ2NF90ICogZGF0YSkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0OworCWludCBjbnQsIGl0ZXJhdGlvbiA9IDAsIHRlc3RfcGFzcyA9IDA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCXZhbDY0ICY9IH5BREFQVEVSX0VDQ19FTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisJdmFsNjQgfD0gTUNfUkxEUkFNX1RFU1RfTU9ERTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1jX3JsZHJhbV9tcnMpOworCXZhbDY0IHw9IE1DX1JMRFJBTV9RVUVVRV9TSVpFX0VOQUJMRTsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV9tcnMsIFVGKTsKKworCXZhbDY0IHw9IE1DX1JMRFJBTV9NUlNfRU5BQkxFOworCVNQRUNJQUxfUkVHX1dSSVRFKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX21ycywgVUYpOworCisJd2hpbGUgKGl0ZXJhdGlvbiA8IDIpIHsKKwkJdmFsNjQgPSAweDU1NTU1NTU1YWFhYTAwMDBVTEw7CisJCWlmIChpdGVyYXRpb24gPT0gMSkgeworCQkJdmFsNjQgXj0gMHhGRkZGRkZGRkZGRkYwMDAwVUxMOworCQl9CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2QwKTsKKworCQl2YWw2NCA9IDB4YWFhYTVhNTU1NTU1MDAwMFVMTDsKKwkJaWYgKGl0ZXJhdGlvbiA9PSAxKSB7CisJCQl2YWw2NCBePSAweEZGRkZGRkZGRkZGRjAwMDBVTEw7CisJCX0KKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfZDEpOworCisJCXZhbDY0ID0gMHg1NWFhYWFhYWFhNWEwMDAwVUxMOworCQlpZiAoaXRlcmF0aW9uID09IDEpIHsKKwkJCXZhbDY0IF49IDB4RkZGRkZGRkZGRkZGMDAwMFVMTDsKKwkJfQorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9kMik7CisKKwkJdmFsNjQgPSAodTY0KSAoMHgwMDAwMDAzZmZmZmYwMDAwVUxMKTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfYWRkKTsKKworCisJCXZhbDY0ID0gTUNfUkxEUkFNX1RFU1RfTU9ERTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisKKwkJdmFsNjQgfD0KKwkJICAgIE1DX1JMRFJBTV9URVNUX01PREUgfCBNQ19STERSQU1fVEVTVF9XUklURSB8CisJCSAgICBNQ19STERSQU1fVEVTVF9HTzsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykgeworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisJCQlpZiAodmFsNjQgJiBNQ19STERSQU1fVEVTVF9ET05FKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDIwMCk7CisJCX0KKworCQlpZiAoY250ID09IDUpCisJCQlicmVhazsKKworCQl2YWw2NCA9IE1DX1JMRFJBTV9URVNUX01PREU7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2N0cmwpOworCisJCXZhbDY0IHw9IE1DX1JMRFJBTV9URVNUX01PREUgfCBNQ19STERSQU1fVEVTVF9HTzsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykgeworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisJCQlpZiAodmFsNjQgJiBNQ19STERSQU1fVEVTVF9ET05FKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDUwMCk7CisJCX0KKworCQlpZiAoY250ID09IDUpCisJCQlicmVhazsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwkJaWYgKHZhbDY0ICYgTUNfUkxEUkFNX1RFU1RfUEFTUykKKwkJCXRlc3RfcGFzcyA9IDE7CisKKwkJaXRlcmF0aW9uKys7CisJfQorCisJaWYgKCF0ZXN0X3Bhc3MpCisJCSpkYXRhID0gMTsKKwllbHNlCisJCSpkYXRhID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBzMmlvX2V0aHRvb2xfdGVzdCAtIGNvbmR1Y3RzIDYgdHNldHMgdG8gZGV0ZXJtaW5lIHRoZSBoZWFsdGggb2YgY2FyZC4KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAZXRodGVzdCA6IHBvaW50ZXIgdG8gYSBldGh0b29sIGNvbW1hbmQgc3BlY2lmaWMgc3RydWN0dXJlIHRoYXQgd2lsbCBiZQorICogIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICogIEBkYXRhIDogdmFyaWFibGUgdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUgdGVzdCAKKyAqIGNvbmR1Y3RlZCBieSB0aGUgZHJpdmVyLgorICogRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBjb25kdWN0cyA2IHRlc3RzICggNCBvZmZsaW5lIGFuZCAyIG9ubGluZSkgdG8gZGV0ZXJtaW5lCisgKiAgdGhlIGhlYWx0aCBvZiB0aGUgY2FyZC4KKyAqIFJldHVybiB2YWx1ZToKKyAqICB2b2lkCisgKi8KKworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aHRlc3QsCisJCQkgICAgICB1aW50NjRfdCAqIGRhdGEpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWludCBvcmlnX3N0YXRlID0gbmV0aWZfcnVubmluZyhzcC0+ZGV2KTsKKworCWlmIChldGh0ZXN0LT5mbGFncyA9PSBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisJCS8qIE9mZmxpbmUgVGVzdHMuICovCisJCWlmIChvcmlnX3N0YXRlKSB7CisJCQlzMmlvX2Nsb3NlKHNwLT5kZXYpOworCQkJczJpb19zZXRfc3dhcHBlcihzcCk7CisJCX0gZWxzZQorCQkJczJpb19zZXRfc3dhcHBlcihzcCk7CisKKwkJaWYgKHMyaW9fcmVnaXN0ZXJfdGVzdChzcCwgJmRhdGFbMF0pKQorCQkJZXRodGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCXMyaW9fcmVzZXQoc3ApOworCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKworCQlpZiAoczJpb19ybGRyYW1fdGVzdChzcCwgJmRhdGFbM10pKQorCQkJZXRodGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCXMyaW9fcmVzZXQoc3ApOworCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKworCQlpZiAoczJpb19lZXByb21fdGVzdChzcCwgJmRhdGFbMV0pKQorCQkJZXRodGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCWlmIChzMmlvX2Jpc3RfdGVzdChzcCwgJmRhdGFbNF0pKQorCQkJZXRodGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCWlmIChvcmlnX3N0YXRlKQorCQkJczJpb19vcGVuKHNwLT5kZXYpOworCisJCWRhdGFbMl0gPSAwOworCX0gZWxzZSB7CisJCS8qIE9ubGluZSBUZXN0cy4gKi8KKwkJaWYgKCFvcmlnX3N0YXRlKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkgICIlczogaXMgbm90IHVwLCBjYW5ub3QgcnVuIHRlc3RcbiIsCisJCQkJICBkZXYtPm5hbWUpOworCQkJZGF0YVswXSA9IC0xOworCQkJZGF0YVsxXSA9IC0xOworCQkJZGF0YVsyXSA9IC0xOworCQkJZGF0YVszXSA9IC0xOworCQkJZGF0YVs0XSA9IC0xOworCQl9CisKKwkJaWYgKHMyaW9fbGlua190ZXN0KHNwLCAmZGF0YVsyXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJZGF0YVswXSA9IDA7CisJCWRhdGFbMV0gPSAwOworCQlkYXRhWzNdID0gMDsKKwkJZGF0YVs0XSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzMmlvX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmVzdGF0cywKKwkJCQkgICB1NjQgKiB0bXBfc3RhdHMpCit7CisJaW50IGkgPSAwOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlTdGF0SW5mb190ICpzdGF0X2luZm8gPSBzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mbzsKKworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2RhdGFfb2N0ZXRzKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19kcm9wX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX21jc3RfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfYmNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19wYXVzZV9jdHJsX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2FueV9lcnJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnRtYWNfdmxkX2lwX29jdGV0cyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfdmxkX2lwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19kcm9wX2lwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19pY21wKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19yc3RfdGNwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+dG1hY190Y3ApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX3VkcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdmxkX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2RhdGFfb2N0ZXRzKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19mY3NfZXJyX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Ryb3BfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdmxkX21jc3RfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdmxkX2Jjc3RfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaW5fcm5nX2xlbl9lcnJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnJtYWNfbG9uZ19mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19wYXVzZV9jdHJsX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Rpc2NhcmRlZF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY191c2l6ZWRfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfb3NpemVkX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2ZyYWdfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfamFiYmVyX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2lwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19pcF9vY3RldHMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2hkcl9lcnJfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Ryb3BfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2ljbXApOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX3RjcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdWRwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19lcnJfZHJwX3VkcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfcGF1c2VfY250KTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19hY2NlcHRlZF9pcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZXJyX3RjcCk7Cit9CisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoWEVOQV9SRUdfU1BBQ0UpOworfQorCisKK3N0YXRpYyB1MzIgczJpb19ldGh0b29sX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCXJldHVybiAoc3AtPnJ4X2NzdW0pOworfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlpZiAoZGF0YSkKKwkJc3AtPnJ4X2NzdW0gPSAxOworCWVsc2UKKwkJc3AtPnJ4X2NzdW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczJpb19nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoWEVOQV9FRVBST01fU1BBQ0UpOworfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZWxmX3Rlc3RfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKFMySU9fVEVTVF9MRU4pOworfQorCitzdGF0aWMgdm9pZCBzMmlvX2V0aHRvb2xfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHUzMiBzdHJpbmdzZXQsIHU4ICogZGF0YSkKK3sKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCW1lbWNweShkYXRhLCBzMmlvX2dzdHJpbmdzLCBTMklPX1NUUklOR1NfTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShkYXRhLCAmZXRodG9vbF9zdGF0c19rZXlzLAorCQkgICAgICAgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworCX0KK30KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChTMklPX1NUQVRfTEVOKTsKK30KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfb3Bfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJaWYgKGRhdGEpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCWVsc2UKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9JUF9DU1VNOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IHMyaW9fZXRodG9vbF9nc2V0LAorCS5zZXRfc2V0dGluZ3MgPSBzMmlvX2V0aHRvb2xfc3NldCwKKwkuZ2V0X2RydmluZm8gPSBzMmlvX2V0aHRvb2xfZ2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IHMyaW9fZXRodG9vbF9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzID0gczJpb19ldGh0b29sX2dyZWdzLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9lZXByb21fbGVuID0gczJpb19nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbSA9IHMyaW9fZXRodG9vbF9nZWVwcm9tLAorCS5zZXRfZWVwcm9tID0gczJpb19ldGh0b29sX3NlZXByb20sCisJLmdldF9wYXVzZXBhcmFtID0gczJpb19ldGh0b29sX2dldHBhdXNlX2RhdGEsCisJLnNldF9wYXVzZXBhcmFtID0gczJpb19ldGh0b29sX3NldHBhdXNlX2RhdGEsCisJLmdldF9yeF9jc3VtID0gczJpb19ldGh0b29sX2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bSA9IHMyaW9fZXRodG9vbF9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IHMyaW9fZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAorI2lmZGVmIE5FVElGX0ZfVFNPCisJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gPSBldGh0b29sX29wX3NldF90c28sCisjZW5kaWYKKwkuc2VsZl90ZXN0X2NvdW50ID0gczJpb19ldGh0b29sX3NlbGZfdGVzdF9jb3VudCwKKwkuc2VsZl90ZXN0ID0gczJpb19ldGh0b29sX3Rlc3QsCisJLmdldF9zdHJpbmdzID0gczJpb19ldGh0b29sX2dldF9zdHJpbmdzLAorCS5waHlzX2lkID0gczJpb19ldGh0b29sX2lkbmljLAorCS5nZXRfc3RhdHNfY291bnQgPSBzMmlvX2V0aHRvb2xfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IHMyaW9fZ2V0X2V0aHRvb2xfc3RhdHMKK307CisKKy8qKgorICogIHMyaW9faW9jdGwgLSBFbnRyeSBwb2ludCBmb3IgdGhlIElvY3RsIAorICogIEBkZXYgOiAgRGV2aWNlIHBvaW50ZXIuCisgKiAgQGlmciA6ICBBbiBJT0NUTCBzcGVjZWZpYyBzdHJ1Y3R1cmUsIHRoYXQgY2FuIGNvbnRhaW4gYSBwb2ludGVyIHRvCisgKiAgYSBwcm9wcmlldGFyeSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBkcml2ZXIuCisgKiAgQGNtZCA6ICBUaGlzIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZGlmZmVyZW50IGNvbW1hbmRzIHRoYXQKKyAqICBjYW4gYmUgcGFzc2VkIHRvIHRoZSBJT0NUTCBmdW5jdGlvbnMuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBoYXMgc3VwcG9ydCBmb3IgZXRodG9vbCwgYWRkaW5nIG11bHRpcGxlIE1BQyBhZGRyZXNzZXMgb24gCisgKiAgdGhlIE5JQyBhbmQgc29tZSBEQkcgY29tbWFuZHMgZm9yIHRoZSB1dGlsIHRvb2wuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIEN1cnJlbnRseSB0aGUgSU9DVEwgc3VwcG9ydHMgbm8gb3BlcmF0aW9ucywgaGVuY2UgYnkgZGVmYXVsdCB0aGlzCisgKiAgZnVuY3Rpb24gcmV0dXJucyBPUCBOT1QgU1VQUE9SVEVEIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyoqCisgKiAgczJpb19jaGFuZ2VfbXR1IC0gZW50cnkgcG9pbnQgdG8gY2hhbmdlIE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogICBAZGV2IDogZGV2aWNlIHBvaW50ZXIuCisgKiAgIEBuZXdfbXR1IDogdGhlIG5ldyBNVFUgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqICAgRGVzY3JpcHRpb246IEEgZHJpdmVyIGVudHJ5IHBvaW50IHRvIGNoYW5nZSBNVFUgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqICAgQmVmb3JlIGNoYW5naW5nIHRoZSBNVFUgdGhlIGRldmljZSBtdXN0IGJlIHN0b3BwZWQuCisgKiAgUmV0dXJuIHZhbHVlOgorICogICAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlICgtKXZlIGludGVnZXIgYXMgZGVmaW5lZCBpbiBlcnJuby5oCisgKiAgIGZpbGUgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NDsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTXVzdCBiZSBzdG9wcGVkIHRvICIsIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiY2hhbmdlIGl0cyBNVFUgXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoKG5ld19tdHUgPCBNSU5fTVRVKSB8fCAobmV3X210dSA+IFMySU9fSlVNQk9fU0laRSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTVRVIHNpemUgaXMgaW52YWxpZC5cbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogU2V0IHRoZSBuZXcgTVRVIGludG8gdGhlIFBZTEQgcmVnaXN0ZXIgb2YgdGhlIE5JQyAqLworCXZhbDY0ID0gbmV3X210dTsKKwl3cml0ZXEodkJJVCh2YWw2NCwgMiwgMTQpLCAmYmFyMC0+cm1hY19tYXhfcHlsZF9sZW4pOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9fdGFza2xldCAtIEJvdHRvbSBoYWxmIG9mIHRoZSBJU1IuCisgKiAgQGRldl9hZHIgOiBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGluIGRtYV9hZGRyX3QgZm9ybWF0LgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgaXMgdGhlIHRhc2tsZXQgb3IgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBJU1IuIFRoaXMgaXMKKyAqICBhbiBleHRlbnNpb24gb2YgdGhlIElTUiB3aGljaCBpcyBzY2hlZHVsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBiZSBydW4gCisgKiAgd2hlbiB0aGUgbG9hZCBvbiB0aGUgQ1BVIGlzIGxvdy4gQWxsIGxvdyBwcmlvcml0eSB0YXNrcyBvZiB0aGUgSVNSIGNhbgorICogIGJlIHB1c2hlZCBpbnRvIHRoZSB0YXNrbGV0LiBGb3Igbm93IHRoZSB0YXNrbGV0IGlzIHVzZWQgb25seSB0byAKKyAqICByZXBsZW5pc2ggdGhlIFJ4IGJ1ZmZlcnMgaW4gdGhlIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycy4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkZXZfYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9hZGRyOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlpbnQgaSwgcmV0OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCWlmICghVEFTS0xFVF9JTl9VU0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQkJcmV0ID0gZmlsbF9yeF9idWZmZXJzKHNwLCBpKTsKKwkJCWlmIChyZXQgPT0gLUVOT01FTSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE91dCBvZiAiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJtZW1vcnkgaW4gdGFza2xldFxuIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAtRUZJTEwpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkJICAiJXM6IFJ4IFJpbmcgJWQgaXMgZnVsbFxuIiwKKwkJCQkJICBkZXYtPm5hbWUsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNsZWFyX2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpOworCX0KK30KKworLyoqCisgKiBzMmlvX3NldF9saW5rIC0gU2V0IHRoZSBMSW5rIHN0YXR1cworICogQGRhdGE6IGxvbmcgcG9pbnRlciB0byBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1ZQorICogRGVzY3JpcHRpb246IFNldHMgdGhlIGxpbmsgc3RhdHVzIGZvciB0aGUgYWRhcHRlcgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fc2V0X2xpbmsodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW5pY190ICpuaWMgPSAobmljX3QgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQ7CisJdTE2IHN1YmlkOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJihuaWMtPmxpbmtfc3RhdGUpKSkgeworCQkvKiBUaGUgY2FyZCBpcyBiZWluZyByZXNldCwgbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcgKi8KKwkJcmV0dXJuOworCX0KKworCXN1YmlkID0gbmljLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCS8qIAorCSAqIEFsbG93IGEgc21hbGwgZGVsYXkgZm9yIHRoZSBOSUNzIHNlbGYgaW5pdGlhdGVkIAorCSAqIGNsZWFudXAgdG8gY29tcGxldGUuCisJICovCisJbXNsZWVwKDEwMCk7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7CisJaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodmFsNjQsIG5pYy0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpIHsKKwkJaWYgKExJTktfSVNfVVAodmFsNjQpKSB7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJdmFsNjQgfD0gQURBUFRFUl9DTlRMX0VOOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwkJCWlmIChDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMoc3ViaWQpKSB7CisJCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl2YWw2NCB8PSBHUElPX0NUUkxfR1BJT18wOworCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsNjQgfD0gQURBUFRFUl9MRURfT047CisJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwkJCX0KKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwkJCWlmICghTElOS19JU19VUCh2YWw2NCkpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiIsIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgTGluayBkb3duIik7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJhZnRlciAiKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImVuYWJsaW5nICIpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiZGV2aWNlIFxuIik7CisJCQl9CisJCQlpZiAobmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlID09IEZBTFNFKSB7CisJCQkJbmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlID0gVFJVRTsKKwkJCX0KKwkJCXMyaW9fbGluayhuaWMsIExJTktfVVApOworCQl9IGVsc2UgeworCQkJaWYgKENBUkRTX1dJVEhfRkFVTFRZX0xJTktfSU5ESUNBVE9SUyhzdWJpZCkpIHsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJCXZhbDY0ICY9IH5HUElPX0NUUkxfR1BJT18wOworCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCX0KKwkJCXMyaW9fbGluayhuaWMsIExJTktfRE9XTik7CisJCX0KKwl9IGVsc2UgewkJLyogTklDIGlzIG5vdCBRdWllc2NlbnQuICovCisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEVycm9yOiAiLCBkZXYtPm5hbWUpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgImRldmljZSBpcyBub3QgUXVpZXNjZW50XG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKwljbGVhcl9iaXQoMCwgJihuaWMtPmxpbmtfc3RhdGUpKTsKK30KKworc3RhdGljIHZvaWQgczJpb19jYXJkX2Rvd24obmljX3QgKiBzcCkKK3sKKwlpbnQgY250ID0gMDsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCisJLyogSWYgczJpb19zZXRfbGluayB0YXNrIGlzIGV4ZWN1dGluZywgd2FpdCB0aWxsIGl0IGNvbXBsZXRlcy4gKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmKHNwLT5saW5rX3N0YXRlKSkpCisJCW1zbGVlcCg1MCk7CisJYXRvbWljX3NldCgmc3AtPmNhcmRfc3RhdGUsIENBUkRfRE9XTik7CisKKwkvKiBkaXNhYmxlIFR4IGFuZCBSeCB0cmFmZmljIG9uIHRoZSBOSUMgKi8KKwlzdG9wX25pYyhzcCk7CisKKwkvKiBLaWxsIHRhc2tsZXQuICovCisJdGFza2xldF9raWxsKCZzcC0+dGFzayk7CisKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIFF1aWVzY2VudCBhbmQgdGhlbiBSZXNldCB0aGUgTklDICovCisJZG8geworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7CisJCWlmICh2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHZhbDY0LCBzcC0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNsZWVwKDUwKTsKKwkJY250Kys7CisJCWlmIChjbnQgPT0gMTApIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgInMyaW9fY2xvc2U6RGV2aWNlIG5vdCBRdWllc2NlbnQgIik7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgImFkYXBlciBzdGF0dXMgcmVhZHMgMHglbGx4XG4iLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsNjQpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwlzMmlvX3Jlc2V0KHNwKTsKKworCS8qIEZyZWUgYWxsIHVudXNlZCBUeCBhbmQgUnggYnVmZmVycyAqLworCWZyZWVfdHhfYnVmZmVycyhzcCk7CisJZnJlZV9yeF9idWZmZXJzKHNwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KDAsICYoc3AtPmxpbmtfc3RhdGUpKTsKK30KKworc3RhdGljIGludCBzMmlvX2NhcmRfdXAobmljX3QgKiBzcCkKK3sKKwlpbnQgaSwgcmV0OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHNwLT5kZXY7CisKKwkvKiBJbml0aWFsaXplIHRoZSBIL1cgSS9PIHJlZ2lzdGVycyAqLworCWlmIChpbml0X25pYyhzcCkgIT0gMCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBIL1cgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiAKKwkgKiBJbml0aWFsaXppbmcgdGhlIFJ4IGJ1ZmZlcnMuIEZvciBub3cgd2UgYXJlIGNvbnNpZGVyaW5nIG9ubHkgMSAKKwkgKiBSeCByaW5nIGFuZCBpbml0aWFsaXppbmcgYnVmZmVycyBpbnRvIDMwIFJ4IGJsb2NrcworCSAqLworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJaWYgKChyZXQgPSBmaWxsX3J4X2J1ZmZlcnMoc3AsIGkpKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogT3V0IG9mIG1lbW9yeSBpbiBPcGVuXG4iLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCXMyaW9fcmVzZXQoc3ApOworCQkJZnJlZV9yeF9idWZmZXJzKHNwKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCURCR19QUklOVChJTkZPX0RCRywgIkJ1ZiBpbiByaW5nOiVkIGlzICVkOlxuIiwgaSwKKwkJCSAgYXRvbWljX3JlYWQoJnNwLT5yeF9idWZzX2xlZnRbaV0pKTsKKwl9CisKKwkvKiBTZXR0aW5nIGl0cyByZWNlaXZlIG1vZGUgKi8KKwlzMmlvX3NldF9tdWx0aWNhc3QoZGV2KTsKKworCS8qIEVuYWJsZSB0YXNrbGV0IGZvciB0aGUgZGV2aWNlICovCisJdGFza2xldF9pbml0KCZzcC0+dGFzaywgczJpb190YXNrbGV0LCAodW5zaWduZWQgbG9uZykgZGV2KTsKKworCS8qIEVuYWJsZSBSeCBUcmFmZmljIGFuZCBpbnRlcnJ1cHRzIG9uIHRoZSBOSUMgKi8KKwlpZiAoc3RhcnRfbmljKHNwKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTdGFydGluZyBOSUMgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQl0YXNrbGV0X2tpbGwoJnNwLT50YXNrKTsKKwkJczJpb19yZXNldChzcCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlmcmVlX3J4X2J1ZmZlcnMoc3ApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhdG9taWNfc2V0KCZzcC0+Y2FyZF9zdGF0ZSwgQ0FSRF9VUCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIHMyaW9fcmVzdGFydF9uaWMgLSBSZXNldHMgdGhlIE5JQy4KKyAqIEBkYXRhIDogbG9uZyBwb2ludGVyIHRvIHRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBpcyBzY2hlZHVsZWQgdG8gYmUgcnVuIGJ5IHRoZSBzMmlvX3R4X3dhdGNoZG9nCisgKiBmdW5jdGlvbiBhZnRlciAwLjUgc2VjcyB0byByZXNldCB0aGUgTklDLiBUaGUgaWRlYSBpcyB0byByZWR1Y2UgCisgKiB0aGUgcnVuIHRpbWUgb2YgdGhlIHdhdGNoIGRvZyByb3V0aW5lIHdoaWNoIGlzIHJ1biBob2xkaW5nIGEKKyAqIHNwaW4gbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX3Jlc3RhcnRfbmljKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJczJpb19jYXJkX2Rvd24oc3ApOworCWlmIChzMmlvX2NhcmRfdXAoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IERldmljZSBicmluZyB1cCBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiB3YXMgcmVzZXQgYnkgVHggd2F0Y2hkb2cgdGltZXJcbiIsCisJCSAgZGV2LT5uYW1lKTsKK30KKworLyoqIAorICogIHMyaW9fdHhfd2F0Y2hkb2cgLSBXYXRjaGRvZyBmb3IgdHJhbnNtaXQgc2lkZS4gCisgKiAgQGRldiA6IFBvaW50ZXIgdG8gbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBpZiB0aGUgVHggUXVldWUgaXMgc3RvcHBlZAorICogIGZvciBhIHByZS1kZWZpbmVkIGFtb3VudCBvZiB0aW1lIHdoZW4gdGhlIEludGVyZmFjZSBpcyBzdGlsbCB1cC4KKyAqICBJZiB0aGUgSW50ZXJmYWNlIGlzIGphbW1lZCBpbiBzdWNoIGEgc2l0dWF0aW9uLCB0aGUgaGFyZHdhcmUgaXMKKyAqICByZXNldCAoYnkgczJpb19jbG9zZSkgYW5kIHJlc3RhcnRlZCBhZ2FpbiAoYnkgczJpb19vcGVuKSB0bworICogIG92ZXJjb21lIGFueSBwcm9ibGVtIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGNhdXNlZCBpbiB0aGUgaGFyZHdhcmUuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX3R4X3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQlzY2hlZHVsZV93b3JrKCZzcC0+cnN0X3RpbWVyX3Rhc2spOworCX0KK30KKworLyoqCisgKiAgIHJ4X29zbV9oYW5kbGVyIC0gVG8gcGVyZm9ybSBzb21lIE9TIHJlbGF0ZWQgb3BlcmF0aW9ucyBvbiBTS0IuCisgKiAgIEBzcDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUscG9pbnRlciB0byBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgIEBza2IgOiB0aGUgc29ja2V0IGJ1ZmZlciBwb2ludGVyLgorICogICBAbGVuIDogbGVuZ3RoIG9mIHRoZSBwYWNrZXQKKyAqICAgQGNrc3VtIDogRkNTIGNoZWNrc3VtIG9mIHRoZSBmcmFtZS4KKyAqICAgQHJpbmdfbm8gOiB0aGUgcmluZyBmcm9tIHdoaWNoIHRoaXMgUnhEIHdhcyBleHRyYWN0ZWQuCisgKiAgIERlc2NyaXB0aW9uOiAKKyAqICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFR4IGludGVycnVwdCBzZXJpdmNlIHJvdXRpbmUgdG8gcGVyZm9ybQorICogICBzb21lIE9TIHJlbGF0ZWQgb3BlcmF0aW9ucyBvbiB0aGUgU0tCIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB1cHBlcgorICogICBsYXllcnMuIEl0IG1haW5seSBjaGVja3MgaWYgdGhlIGNoZWNrc3VtIGlzIE9LLCBpZiBzbyBhZGRzIGl0IHRvIHRoZQorICogICBTS0JzIGNrc3VtIHZhcmlhYmxlLCBpbmNyZW1lbnRzIHRoZSBSeCBwYWNrZXQgY291bnQgYW5kIHBhc3NlcyB0aGUgU0tCCisgKiAgIHRvIHRoZSB1cHBlciBsYXllci4gSWYgdGhlIGNoZWNrc3VtIGlzIHdyb25nLCBpdCBpbmNyZW1lbnRzIHRoZSBSeAorICogICBwYWNrZXQgZXJyb3IgY291bnQsIGZyZWVzIHRoZSBTS0IgYW5kIHJldHVybnMgZXJyb3IuCisgKiAgIFJldHVybiB2YWx1ZToKKyAqICAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsdXJlLgorICovCisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIHUxNiBsZW4sIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8pCisjZWxzZQorc3RhdGljIGludCByeF9vc21faGFuZGxlcihuaWNfdCAqIHNwLCBSeERfdCAqIHJ4ZHAsIGludCByaW5nX25vLAorCQkJICBidWZmQWRkX3QgKiBiYSkKKyNlbmRpZgoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0KKwkgICAgKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+SG9zdF9Db250cm9sKTsKKwl1MTYgbDNfY3N1bSwgbDRfY3N1bTsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCWludCBidWYwX2xlbiwgYnVmMl9sZW47CisJdW5zaWduZWQgY2hhciAqYnVmZjsKKyNlbmRpZgorCisJbDNfY3N1bSA9IFJYRF9HRVRfTDNfQ0tTVU0ocnhkcC0+Q29udHJvbF8xKTsKKwlpZiAoKHJ4ZHAtPkNvbnRyb2xfMSAmIFRDUF9PUl9VRFBfRlJBTUUpICYmIChzcC0+cnhfY3N1bSkpIHsKKwkJbDRfY3N1bSA9IFJYRF9HRVRfTDRfQ0tTVU0ocnhkcC0+Q29udHJvbF8xKTsKKwkJaWYgKChsM19jc3VtID09IEwzX0NLU1VNX09LKSAmJiAobDRfY3N1bSA9PSBMNF9DS1NVTV9PSykpIHsKKwkJCS8qIAorCQkJICogTklDIHZlcmlmaWVzIGlmIHRoZSBDaGVja3N1bSBvZiB0aGUgcmVjZWl2ZWQKKwkJCSAqIGZyYW1lIGlzIE9rIG9yIG5vdCBhbmQgYWNjb3JkaW5nbHkgcmV0dXJucworCQkJICogYSBmbGFnIGluIHRoZSBSeEQuCisJCQkgKi8KKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0gZWxzZSB7CisJCQkvKiAKKwkJCSAqIFBhY2tldCB3aXRoIGVycm9uZW91cyBjaGVja3N1bSwgbGV0IHRoZSAKKwkJCSAqIHVwcGVyIGxheWVycyBkZWFsIHdpdGggaXQuCisJCQkgKi8KKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJfQorCX0gZWxzZSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9CisKKwlpZiAocnhkcC0+Q29udHJvbF8xICYgUlhEX1RfQ09ERSkgeworCQl1bnNpZ25lZCBsb25nIGxvbmcgZXJyID0gcnhkcC0+Q29udHJvbF8xICYgUlhEX1RfQ09ERTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUnggZXJyb3IgVmFsdWU6IDB4JWxseFxuIiwKKwkJCSAgZGV2LT5uYW1lLCBlcnIpOworCX0KKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCWJ1ZjBfbGVuID0gUlhEX0dFVF9CVUZGRVIwX1NJWkUocnhkcC0+Q29udHJvbF8yKTsKKwlidWYyX2xlbiA9IFJYRF9HRVRfQlVGRkVSMl9TSVpFKHJ4ZHAtPkNvbnRyb2xfMik7CisjZW5kaWYKKworCXNrYi0+ZGV2ID0gZGV2OworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXNrYl9wdXQoc2tiLCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisjZWxzZQorCWJ1ZmYgPSBza2JfcHVzaChza2IsIGJ1ZjBfbGVuKTsKKwltZW1jcHkoYnVmZiwgYmEtPmJhXzAsIGJ1ZjBfbGVuKTsKKwlza2JfcHV0KHNrYiwgYnVmMl9sZW4pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TMklPX05BUEkKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworI2Vsc2UKKwluZXRpZl9yeChza2IpOworI2VuZGlmCisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNwLT5yeF9wa3RfY291bnQrKzsKKwlzcC0+c3RhdHMucnhfcGFja2V0cysrOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisjZWxzZQorCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBidWYwX2xlbiArIGJ1ZjJfbGVuOworI2VuZGlmCisKKwlhdG9taWNfZGVjKCZzcC0+cnhfYnVmc19sZWZ0W3Jpbmdfbm9dKTsKKwlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAwOworCXJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAqICBzMmlvX2xpbmsgLSBzdG9wcy9zdGFydHMgdGhlIFR4IHF1ZXVlLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgczJpb19uaWMgc3RydWN0dXJlLgorICogIEBsaW5rIDogaW5pZGljYXRlcyB3aGV0aGVyIGxpbmsgaXMgVVAvRE9XTi4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIHN0b3BzL3N0YXJ0cyB0aGUgVHggcXVldWUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxpbmsKKyAqICBzdGF0dXMgb2YgdGhlIE5JQyBpcyBpcyBkb3duIG9yIHVwLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgQWxhcm0gCisgKiAgaW50ZXJydXB0IGhhbmRsZXIgd2hlbmV2ZXIgYSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQgY29tZXMgdXAuIAorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fbGluayhuaWNfdCAqIHNwLCBpbnQgbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHNwLT5kZXY7CisKKwlpZiAobGluayAhPSBzcC0+bGFzdF9saW5rX3N0YXRlKSB7CisJCWlmIChsaW5rID09IExJTktfRE9XTikgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IExpbmsgVXBcbiIsIGRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCX0KKwl9CisJc3AtPmxhc3RfbGlua19zdGF0ZSA9IGxpbms7Cit9CisKKy8qKgorICogIHMyaW9faW5pdF9wY2kgLUluaXRpYWxpemF0aW9uIG9mIFBDSSBhbmQgUENJLVggY29uZmlndXJhdGlvbiByZWdpc3RlcnMgLiAKKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhIGZldyBvZiB0aGUgUENJIGFuZCBQQ0ktWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogIHdpdGggcmVjb21tZW5kZWQgdmFsdWVzLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkCisgKi8KKworc3RhdGljIHZvaWQgczJpb19pbml0X3BjaShuaWNfdCAqIHNwKQoreworCXUxNiBwY2lfY21kID0gMDsKKworCS8qIEVuYWJsZSBEYXRhIFBhcml0eSBFcnJvciBSZWNvdmVyeSBpbiBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyLiAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICYoc3AtPnBjaXhfY21kKSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICAoc3AtPnBjaXhfY21kIHwgMSkpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICYoc3AtPnBjaXhfY21kKSk7CisKKwkvKiBTZXQgdGhlIFBFcnIgUmVzcG9uc2UgYml0IGluIFBDSSBjb21tYW5kIHJlZ2lzdGVyLiAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJX0NPTU1BTkQsCisJCQkgICAgICAocGNpX2NtZCB8IFBDSV9DT01NQU5EX1BBUklUWSkpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCisJLyogU2V0IE1NUkIgY291bnQgdG8gMTAyNCBpbiBQQ0ktWCBDb21tYW5kIHJlZ2lzdGVyLiAqLworCXNwLT5wY2l4X2NtZCAmPSAweEZGRjM7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsIChzcC0+cGNpeF9jbWQgfCAoMHgxIDw8IDIpKSk7CS8qIE1NUkJDIDFLICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKKworCS8qICBTZXR0aW5nIE1heGltdW0gb3V0c3RhbmRpbmcgc3BsaXRzIGJhc2VkIG9uIHN5c3RlbSB0eXBlLiAqLworCXNwLT5wY2l4X2NtZCAmPSAweEZGOEY7CisKKwlzcC0+cGNpeF9jbWQgfD0gWEVOQV9NQVhfT1VUU1RBTkRJTkdfU1BMSVRTKDB4MSk7CS8qIDIgc3BsaXRzLiAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAgc3AtPnBjaXhfY21kKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAmKHNwLT5wY2l4X2NtZCkpOworCS8qIEZvcmNpYmx5IGRpc2FibGluZyByZWxheGVkIG9yZGVyaW5nIGNhcGFiaWxpdHkgb2YgdGhlIGNhcmQuICovCisJc3AtPnBjaXhfY21kICY9IDB4ZmZmZDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgIHNwLT5wY2l4X2NtZCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKK30KKworTU9EVUxFX0FVVEhPUigiUmFnaGF2ZW5kcmEgS291c2hpayA8cmFnaGF2ZW5kcmEua291c2hpa0BuZXRlcmlvbi5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0odHhfZmlmb19udW0sIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHhfZmlmb19sZW4sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfcmluZ19udW0sIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocnhfcmluZ19zeiwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShTdGF0c19yZWZyZXNoX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocm1hY19wYXVzZV90aW1lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNoYXJlZF9zcGxpdHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odG1hY191dGlsX3BlcmlvZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShybWFjX3V0aWxfcGVyaW9kLCBpbnQsIDApOworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCittb2R1bGVfcGFyYW0oaW5kaWNhdGVfbWF4X3BrdHMsIGludCwgMCk7CisjZW5kaWYKKy8qKgorICogIHMyaW9faW5pdF9uaWMgLSBJbml0aWFsaXphdGlvbiBvZiB0aGUgYWRhcHRlciAuIAorICogIEBwZGV2IDogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFBDSSByZWxhdGVkIGluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UuCisgKiAgQHByZTogTGlzdCBvZiBQQ0kgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciBsaXN0ZWQgaW4gczJpb190YmwuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSB0aGUgcGNpX2RlYyBzdHJ1Y3R1cmUuCisgKiAgQWxsIE9TIHJlbGF0ZWQgaW5pdGlhbGl6YXRpb24gaW5jbHVkaW5nIG1lbW9yeSBhbmQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgCisgKiAgaW5pdGxhaXphdGlvbiBvZiB0aGUgZGV2aWNlIHByaXZhdGUgdmFyaWFibGUgaXMgZG9uZS4gQWxzbyB0aGUgc3dhcHBlciAKKyAqICBjb250cm9sIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIGVuYWJsZSByZWFkIGFuZCB3cml0ZSBpbnRvIHRoZSBJL08gCisgKiAgcmVnaXN0ZXJzIG9mIHRoZSBkZXZpY2UuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzMmlvX2luaXRfbmljKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcHJlKQoreworCW5pY190ICpzcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWNoYXIgKmRldl9uYW1lID0gIlMySU8gMTBHRSBOSUMiOworCWludCBpLCBqLCByZXQ7CisJaW50IGRtYV9mbGFnID0gRkFMU0U7CisJdTMyIG1hY191cCwgbWFjX2Rvd247CisJdTY0IHZhbDY0ID0gMCwgdG1wNjQgPSAwOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBOVUxMOworCXUxNiBzdWJpZDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKworCURCR19QUklOVChFUlJfREJHLCAiTG9hZGluZyBTMklPIGRyaXZlciB3aXRoICVzXG4iLAorCQlzMmlvX2RyaXZlcl92ZXJzaW9uKTsKKworCWlmICgocmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCURCR19QUklOVChFUlJfREJHLAorCQkJICAiczJpb19pbml0X25pYzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJzMmlvX2luaXRfbmljOiBVc2luZyA2NGJpdCBETUFcbiIpOworCQlkbWFfZmxhZyA9IFRSVUU7CisKKwkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzaworCQkgICAgKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIlVuYWJsZSB0byBvYnRhaW4gNjRiaXQgRE1BIGZvciBcCisJCQkJCWNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTCkpIHsKKwkJREJHX1BSSU5UKElOSVRfREJHLCAiczJpb19pbml0X25pYzogVXNpbmcgMzJiaXQgRE1BXG4iKTsKKwl9IGVsc2UgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIHMyaW9fZHJpdmVyX25hbWUpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiUmVxdWVzdCBSZWdpb25zIGZhaWxlZFxuIiksCisJCSAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihuaWNfdCkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwkvKiAgUHJpdmF0ZSBtZW1iZXIgdmFyaWFibGUgaW5pdGlhbGl6ZWQgdG8gczJpbyBOSUMgc3RydWN0dXJlICovCisJc3AgPSBkZXYtPnByaXY7CisJbWVtc2V0KHNwLCAwLCBzaXplb2YobmljX3QpKTsKKwlzcC0+ZGV2ID0gZGV2OworCXNwLT5wZGV2ID0gcGRldjsKKwlzcC0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCXNwLT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CisJc3AtPmhpZ2hfZG1hX2ZsYWcgPSBkbWFfZmxhZzsKKwlzcC0+aXJxID0gcGRldi0+aXJxOworCXNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlID0gRkFMU0U7CisJc3RyY3B5KHNwLT5uYW1lLCBkZXZfbmFtZSk7CisKKwkvKiBJbml0aWFsaXplIHNvbWUgUENJL1BDSS1YIGZpZWxkcyBvZiB0aGUgTklDLiAqLworCXMyaW9faW5pdF9wY2koc3ApOworCisJLyogCisJICogU2V0dGluZyB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKiBNb3N0IG9mIHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBieSB0aGUgdXNlciBkdXJpbmcgCisJICogbW9kdWxlIGluc2VydGlvbiBhcyB0aGV5IGFyZSBtb2R1bGUgbG9hZGFibGUgcGFyYW1ldGVycy4gSWYgCisJICogdGhlc2UgcGFyYW1ldGVycyBhcmUgbm90IG5vdCBzcGVjaWZpZWQgZHVyaW5nIGxvYWQgdGltZSwgdGhleSAKKwkgKiBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKwkgKi8KKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwkvKiBUeCBzaWRlIHBhcmFtZXRlcnMuICovCisJdHhfZmlmb19sZW5bMF0gPSBERUZBVUxUX0ZJRk9fTEVOOwkvKiBEZWZhdWx0IHZhbHVlLiAqLworCWNvbmZpZy0+dHhfZmlmb19udW0gPSB0eF9maWZvX251bTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX0ZJRk9TOyBpKyspIHsKKwkJY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gPSB0eF9maWZvX2xlbltpXTsKKwkJY29uZmlnLT50eF9jZmdbaV0uZmlmb19wcmlvcml0eSA9IGk7CisJfQorCisJY29uZmlnLT50eF9pbnRyX3R5cGUgPSBUWERfSU5UX1RZUEVfVVRJTFo7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQljb25maWctPnR4X2NmZ1tpXS5mX25vX3Nub29wID0KKwkJICAgIChOT19TTk9PUF9UWEQgfCBOT19TTk9PUF9UWERfQlVGRkVSKTsKKwkJaWYgKGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuIDwgNjUpIHsKKwkJCWNvbmZpZy0+dHhfaW50cl90eXBlID0gVFhEX0lOVF9UWVBFX1BFUl9MSVNUOworCQkJYnJlYWs7CisJCX0KKwl9CisJY29uZmlnLT5tYXhfdHhkcyA9IE1BWF9TS0JfRlJBR1M7CisKKwkvKiBSeCBzaWRlIHBhcmFtZXRlcnMuICovCisJcnhfcmluZ19zelswXSA9IFNNQUxMX0JMS19DTlQ7CS8qIERlZmF1bHQgdmFsdWUuICovCisJY29uZmlnLT5yeF9yaW5nX251bSA9IHJ4X3JpbmdfbnVtOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUlhfUklOR1M7IGkrKykgeworCQljb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkID0gcnhfcmluZ19zeltpXSAqCisJCSAgICAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCWNvbmZpZy0+cnhfY2ZnW2ldLnJpbmdfcHJpb3JpdHkgPSBpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nX251bTsgaSsrKSB7CisJCWNvbmZpZy0+cnhfY2ZnW2ldLnJpbmdfb3JnID0gUklOR19PUkdfQlVGRjE7CisJCWNvbmZpZy0+cnhfY2ZnW2ldLmZfbm9fc25vb3AgPQorCQkgICAgKE5PX1NOT09QX1JYRCB8IE5PX1NOT09QX1JYRF9CVUZGRVIpOworCX0KKworCS8qICBTZXR0aW5nIE1hYyBDb250cm9sIHBhcmFtZXRlcnMgKi8KKwltYWNfY29udHJvbC0+cm1hY19wYXVzZV90aW1lID0gcm1hY19wYXVzZV90aW1lOworCW1hY19jb250cm9sLT5tY19wYXVzZV90aHJlc2hvbGRfcTBxMyA9IG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzOworCW1hY19jb250cm9sLT5tY19wYXVzZV90aHJlc2hvbGRfcTRxNyA9IG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3OworCisKKwkvKiBJbml0aWFsaXplIFJpbmcgYnVmZmVyIHBhcmFtZXRlcnMuICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykKKwkJYXRvbWljX3NldCgmc3AtPnJ4X2J1ZnNfbGVmdFtpXSwgMCk7CisKKwkvKiAgaW5pdGlhbGl6ZSB0aGUgc2hhcmVkIG1lbW9yeSB1c2VkIGJ5IHRoZSBOSUMgYW5kIHRoZSBob3N0ICovCisJaWYgKGluaXRfc2hhcmVkX21lbShzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG1lbV9hbGxvY19mYWlsZWQ7CisJfQorCisJc3AtPmJhcjAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmICghc3AtPmJhcjApIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUzJJTzogY2Fubm90IHJlbWFwIGlvIG1lbTFcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYmFyMF9yZW1hcF9mYWlsZWQ7CisJfQorCisJc3AtPmJhcjEgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKKwkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmICghc3AtPmJhcjEpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUzJJTzogY2Fubm90IHJlbWFwIGlvIG1lbTJcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYmFyMV9yZW1hcF9mYWlsZWQ7CisJfQorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgc3AtPmJhcjA7CisKKwkvKiBJbml0aWFsaXppbmcgdGhlIEJBUjEgYWRkcmVzcyBhcyB0aGUgc3RhcnQgb2YgdGhlIEZJRk8gcG9pbnRlci4gKi8KKwlmb3IgKGogPSAwOyBqIDwgTUFYX1RYX0ZJRk9TOyBqKyspIHsKKwkJbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbal0gPSAoVHhGSUZPX2VsZW1lbnRfdCBfX2lvbWVtICopCisJCSAgICAoc3AtPmJhcjEgKyAoaiAqIDB4MDAwMjAwMDApKTsKKwl9CisKKwkvKiAgRHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbiA9ICZzMmlvX29wZW47CisJZGV2LT5zdG9wID0gJnMyaW9fY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmczJpb194bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJnMyaW9fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnMyaW9fc2V0X211bHRpY2FzdDsKKwlkZXYtPmRvX2lvY3RsID0gJnMyaW9faW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gJnMyaW9fY2hhbmdlX210dTsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKwkvKgorCSAqIHdpbGwgdXNlIGV0aF9tYWNfYWRkcigpIGZvciAgZGV2LT5zZXRfbWFjX2FkZHJlc3MKKwkgKiBtYWMgYWRkcmVzcyB3aWxsIGJlIHNldCBldmVyeSB0aW1lIGRldi0+b3BlbigpIGlzIGNhbGxlZAorCSAqLworI2lmZGVmIENPTkZJR19TMklPX05BUEkKKwlkZXYtPnBvbGwgPSBzMmlvX3BvbGw7CisJZGV2LT53ZWlnaHQgPSA5MDsKKyNlbmRpZgorCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCWlmIChzcC0+aGlnaF9kbWFfZmxhZyA9PSBUUlVFKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKyNpZmRlZiBORVRJRl9GX1RTTworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisjZW5kaWYKKworCWRldi0+dHhfdGltZW91dCA9ICZzMmlvX3R4X3dhdGNoZG9nOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBXQVRDSF9ET0dfVElNRU9VVDsKKwlJTklUX1dPUksoJnNwLT5yc3RfdGltZXJfdGFzaywKKwkJICAodm9pZCAoKikodm9pZCAqKSkgczJpb19yZXN0YXJ0X25pYywgZGV2KTsKKwlJTklUX1dPUksoJnNwLT5zZXRfbGlua190YXNrLAorCQkgICh2b2lkICgqKSh2b2lkICopKSBzMmlvX3NldF9saW5rLCBzcCk7CisKKwlwY2lfc2F2ZV9zdGF0ZShzcC0+cGRldik7CisKKwkvKiBTZXR0aW5nIHN3YXBwZXIgY29udHJvbCBvbiB0aGUgTklDLCBmb3IgcHJvcGVyIHJlc2V0IG9wZXJhdGlvbiAqLworCWlmIChzMmlvX3NldF9zd2FwcGVyKHNwKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOnN3YXBwZXIgc2V0dGluZ3MgYXJlIHdyb25nXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIHNldF9zd2FwX2ZhaWxlZDsKKwl9CisKKwkvKiBGaXggZm9yIGFsbCAiRkZzIiBNQUMgYWRkcmVzcyBwcm9ibGVtcyBvYnNlcnZlZCBvbiBBbHBoYSBwbGF0Zm9ybXMgKi8KKwlmaXhfbWFjX2FkZHJlc3Moc3ApOworCXMyaW9fcmVzZXQoc3ApOworCisJLyoKKwkgKiBTZXR0aW5nIHN3YXBwZXIgY29udHJvbCBvbiB0aGUgTklDLCBzbyB0aGUgTUFDIGFkZHJlc3MgY2FuIGJlIHJlYWQuCisJICovCisJaWYgKHMyaW9fc2V0X3N3YXBwZXIoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLAorCQkJICAiJXM6IFMySU86IHN3YXBwZXIgc2V0dGluZ3MgYXJlIHdyb25nXG4iLAorCQkJICBkZXYtPm5hbWUpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIHNldF9zd2FwX2ZhaWxlZDsKKwl9CisKKwkvKiAgCisJICogTUFDIGFkZHJlc3MgaW5pdGlhbGl6YXRpb24uCisJICogRm9yIG5vdyBvbmx5IG9uZSBtYWMgYWRkcmVzcyB3aWxsIGJlIHJlYWQgYW5kIHVzZWQuCisJICovCisJYmFyMCA9IHNwLT5iYXIwOworCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fUkQgfCBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJICAgIFJNQUNfQUREUl9DTURfTUVNX09GRlNFVCgwICsgTUFDX01BQ19BRERSX1NUQVJUX09GRlNFVCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19hZGRyX2NtZF9tZW0pOworCXdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCk7CisKKwl0bXA2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwltYWNfZG93biA9ICh1MzIpIHRtcDY0OworCW1hY191cCA9ICh1MzIpICh0bXA2NCA+PiAzMik7CisKKwltZW1zZXQoc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkciwgMCwgc2l6ZW9mKEVUSF9BTEVOKSk7CisKKwlzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzNdID0gKHU4KSAobWFjX3VwKTsKKwlzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzJdID0gKHU4KSAobWFjX3VwID4+IDgpOworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMV0gPSAodTgpIChtYWNfdXAgPj4gMTYpOworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMF0gPSAodTgpIChtYWNfdXAgPj4gMjQpOworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbNV0gPSAodTgpIChtYWNfZG93biA+PiAxNik7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls0XSA9ICh1OCkgKG1hY19kb3duID4+IDI0KTsKKworCURCR19QUklOVChJTklUX0RCRywKKwkJICAiREVGQVVMVCBNQUMgQUREUjoweCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4XG4iLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMF0sCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsxXSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzJdLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbM10sCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls0XSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzVdKTsKKworCS8qICBTZXQgdGhlIGZhY3RvcnkgZGVmaW5lZCBNQUMgYWRkcmVzcyBpbml0aWFsbHkgICAqLworCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc3AtPmRlZl9tYWNfYWRkciwgRVRIX0FMRU4pOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB0YXNrbGV0IHN0YXR1cyBhbmQgbGluayBzdGF0ZSBmbGFncyAKKwkgKiBhbmQgdGhlIGNhcmQgc3RhdHRlIHBhcmFtZXRlcgorCSAqLworCWF0b21pY19zZXQoJihzcC0+Y2FyZF9zdGF0ZSksIDApOworCXNwLT50YXNrbGV0X3N0YXR1cyA9IDA7CisJc3AtPmxpbmtfc3RhdGUgPSAwOworCisKKwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyAqLworCXNwaW5fbG9ja19pbml0KCZzcC0+dHhfbG9jayk7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlzcGluX2xvY2tfaW5pdCgmc3AtPnB1dF9sb2NrKTsKKyNlbmRpZgorCisJLyogCisJICogU1hFLTAwMjogQ29uZmlndXJlIGxpbmsgYW5kIGFjdGl2aXR5IExFRCB0byBpbml0IHN0YXRlIAorCSAqIG9uIGRyaXZlciBsb2FkLiAKKwkgKi8KKwlzdWJpZCA9IHNwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWlmICgoc3ViaWQgJiAweEZGKSA+PSAweDA3KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0IHw9IDB4MDAwMDgwMDAwMDAwMDAwMFVMTDsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgPSAweDA0MTEwNDA0MDAwMDAwMDBVTEw7CisJCXdyaXRlcSh2YWw2NCwgKHZvaWQgX19pb21lbSAqKSBiYXIwICsgMHgyNzAwKTsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwl9CisKKwlzcC0+cnhfY3N1bSA9IDE7CS8qIFJ4IGNoa3N1bSB2ZXJpZnkgZW5hYmxlZCBieSBkZWZhdWx0ICovCisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVnaXN0ZXJfZmFpbGVkOworCX0KKworCS8qIAorCSAqIE1ha2UgTGluayBzdGF0ZSBhcyBvZmYgYXQgdGhpcyBwb2ludCwgd2hlbiB0aGUgTGluayBjaGFuZ2UgCisJICogaW50ZXJydXB0IGNvbWVzIHRoZSBzdGF0ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZCB0byAKKwkgKiB0aGUgcmlnaHQgc3RhdGUuCisJICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlzcC0+bGFzdF9saW5rX3N0YXRlID0gTElOS19ET1dOOworCisJcmV0dXJuIDA7CisKKyAgICAgIHJlZ2lzdGVyX2ZhaWxlZDoKKyAgICAgIHNldF9zd2FwX2ZhaWxlZDoKKwlpb3VubWFwKHNwLT5iYXIxKTsKKyAgICAgIGJhcjFfcmVtYXBfZmFpbGVkOgorCWlvdW5tYXAoc3AtPmJhcjApOworICAgICAgYmFyMF9yZW1hcF9mYWlsZWQ6CisgICAgICBtZW1fYWxsb2NfZmFpbGVkOgorCWZyZWVfc2hhcmVkX21lbShzcCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHMyaW9fcmVtX25pYyAtIEZyZWUgdGhlIFBDSSBkZXZpY2UgCisgKiBAcGRldjogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFBDSSByZWxhdGVkIGluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UuCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFBjaSBzdWJzeXN0ZW0gdG8gcmVsZWFzZSBhIAorICogUENJIGRldmljZSBhbmQgZnJlZSB1cCBhbGwgcmVzb3VyY2UgaGVsZCB1cCBieSB0aGUgZGV2aWNlLiBUaGlzIGNvdWxkCisgKiBiZSBpbiByZXNwb25zZSB0byBhIEhvdCBwbHVnIGV2ZW50IG9yIHdoZW4gdGhlIGRyaXZlciBpcyB0byBiZSByZW1vdmVkIAorICogZnJvbSBtZW1vcnkuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHMyaW9fcmVtX25pYyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0KKwkgICAgKHN0cnVjdCBuZXRfZGV2aWNlICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwluaWNfdCAqc3A7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJEcml2ZXIgRGF0YSBpcyBOVUxMISFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3AgPSBkZXYtPnByaXY7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWZyZWVfc2hhcmVkX21lbShzcCk7CisJaW91bm1hcChzcC0+YmFyMCk7CisJaW91bm1hcChzcC0+YmFyMSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworLyoqCisgKiBzMmlvX3N0YXJ0ZXIgLSBFbnRyeSBwb2ludCBmb3IgdGhlIGRyaXZlcgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgZHJpdmVyLiBJdCB2ZXJpZmllcworICogdGhlIG1vZHVsZSBsb2FkYWJsZSBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqLworCitpbnQgX19pbml0IHMyaW9fc3RhcnRlcih2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnMyaW9fZHJpdmVyKTsKK30KKworLyoqCisgKiBzMmlvX2Nsb3NlciAtIENsZWFudXAgcm91dGluZSBmb3IgdGhlIGRyaXZlciAKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuIEl0IHVucmVnaXN0ICogZXJzIHRoZSBkcml2ZXIuCisgKi8KKworc3RhdGljIHZvaWQgczJpb19jbG9zZXIodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnMyaW9fZHJpdmVyKTsKKwlEQkdfUFJJTlQoSU5JVF9EQkcsICJjbGVhbnVwIGRvbmVcbiIpOworfQorCittb2R1bGVfaW5pdChzMmlvX3N0YXJ0ZXIpOworbW9kdWxlX2V4aXQoczJpb19jbG9zZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5oIGIvZHJpdmVycy9uZXQvczJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTFjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmgKQEAgLTAsMCArMSw3NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHMyaW8uaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCisKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisgKiByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisgKiBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9TMklPX0gKKyNkZWZpbmUgX1MySU9fSAorCisjZGVmaW5lIFRCRCAwCisjZGVmaW5lIEJJVChsb2MpCQkoMHg4MDAwMDAwMDAwMDAwMDAwVUxMID4+IChsb2MpKQorI2RlZmluZSB2QklUKHZhbCwgbG9jLCBzeikJKCgodTY0KXZhbCkgPDwgKDY0LWxvYy1zeikpCisjZGVmaW5lIElOVihkKSAgKChkJjB4ZmYpPDwyNCkgfCAoKChkPj44KSYweGZmKTw8MTYpIHwgKCgoZD4+MTYpJjB4ZmYpPDw4KXwgKChkPj4yNCkmMHhmZikKKworI2lmbmRlZiBCT09MCisjZGVmaW5lIEJPT0wgICAgaW50CisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgMQorI2RlZmluZSBGQUxTRSAgIDAKKyNlbmRpZgorCisjdW5kZWYgU1VDQ0VTUworI2RlZmluZSBTVUNDRVNTIDAKKyNkZWZpbmUgRkFJTFVSRSAtMQorCisvKiBNYXhpbXVtIG91dHN0YW5kaW5nIHNwbGl0cyB0byBiZSBjb25maWd1cmVkIGludG8geGVuYS4gKi8KK3R5cGVkZWYgZW51bSB4ZW5hX21heF9vdXRzdGFuZGluZ19zcGxpdHMgeworCVhFTkFfT05FX1NQTElUX1RSQU5TQUNUSU9OID0gMCwKKwlYRU5BX1RXT19TUExJVF9UUkFOU0FDVElPTiA9IDEsCisJWEVOQV9USFJFRV9TUExJVF9UUkFOU0FDVElPTiA9IDIsCisJWEVOQV9GT1VSX1NQTElUX1RSQU5TQUNUSU9OID0gMywKKwlYRU5BX0VJR0hUX1NQTElUX1RSQU5TQUNUSU9OID0gNCwKKwlYRU5BX1RXRUxWRV9TUExJVF9UUkFOU0FDVElPTiA9IDUsCisJWEVOQV9TSVhURUVOX1NQTElUX1RSQU5TQUNUSU9OID0gNiwKKwlYRU5BX1RISVJUWVRXT19TUExJVF9UUkFOU0FDVElPTiA9IDcKK30geGVuYV9tYXhfb3V0c3RhbmRpbmdfc3BsaXRzOworI2RlZmluZSBYRU5BX01BWF9PVVRTVEFORElOR19TUExJVFMobikgKG4gPDwgNCkKKworLyogIE9TIGNvbmNlcm5lZCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBXQVRDSF9ET0dfVElNRU9VVCAgIAk1KkhaCisjZGVmaW5lIEVGSUxMICAgICAgIAkJCTB4MTIzNAorI2RlZmluZSBBTElHTl9TSVpFICAJCQkxMjcKKyNkZWZpbmUJUENJWF9DT01NQU5EX1JFR0lTVEVSCTB4NjIKKworLyoKKyAqIERlYnVnIHJlbGF0ZWQgdmFyaWFibGVzLgorICovCisvKiBkaWZmZXJlbnQgZGVidWcgbGV2ZWxzLiAqLworI2RlZmluZQlFUlJfREJHCQkwCisjZGVmaW5lCUlOSVRfREJHCTEKKyNkZWZpbmUJSU5GT19EQkcJMgorI2RlZmluZQlUWF9EQkcJCTMKKyNkZWZpbmUJSU5UUl9EQkcJNAorCisvKiBHbG9iYWwgdmFyaWFibGUgdGhhdCBkZWZpbmVzIHRoZSBwcmVzZW50IGRlYnVnIGxldmVsIG9mIHRoZSBkcml2ZXIuICovCitzdGF0aWMgaW50IGRlYnVnX2xldmVsID0gRVJSX0RCRzsJLyogRGVmYXVsdCBsZXZlbC4gKi8KKworLyogREVCVUcgbWVzc2FnZSBwcmludC4gKi8KKyNkZWZpbmUgREJHX1BSSU5UKGRiZ19sZXZlbCwgYXJncy4uLikgIGlmKCEoZGVidWdfbGV2ZWw8ZGJnX2xldmVsKSkgcHJpbnRrKGFyZ3MpCisKKy8qIFByb3RvY29sIGFzc2lzdCBmZWF0dXJlcyBvZiB0aGUgTklDICovCisjZGVmaW5lIEwzX0NLU1VNX09LIDB4RkZGRgorI2RlZmluZSBMNF9DS1NVTV9PSyAweEZGRkYKKyNkZWZpbmUgUzJJT19KVU1CT19TSVpFIDk2MDAKKworLyogVGhlIHN0YXRpc3RpY3MgYmxvY2sgb2YgWGVuYSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RhdF9ibG9jayB7CisvKiBUeCBNQUMgc3RhdGlzdGljcyBjb3VudGVycy4gKi8KKwl1MzIgdG1hY19kYXRhX29jdGV0czsKKwl1MzIgdG1hY19mcm1zOworCXU2NCB0bWFjX2Ryb3BfZnJtczsKKwl1MzIgdG1hY19iY3N0X2ZybXM7CisJdTMyIHRtYWNfbWNzdF9mcm1zOworCXU2NCB0bWFjX3BhdXNlX2N0cmxfZnJtczsKKwl1MzIgdG1hY191Y3N0X2ZybXM7CisJdTMyIHRtYWNfdHRsX29jdGV0czsKKwl1MzIgdG1hY19hbnlfZXJyX2ZybXM7CisJdTMyIHRtYWNfbnVjc3RfZnJtczsKKwl1NjQgdG1hY190dGxfbGVzc19mYl9vY3RldHM7CisJdTY0IHRtYWNfdmxkX2lwX29jdGV0czsKKwl1MzIgdG1hY19kcm9wX2lwOworCXUzMiB0bWFjX3ZsZF9pcDsKKwl1MzIgdG1hY19yc3RfdGNwOworCXUzMiB0bWFjX2ljbXA7CisJdTY0IHRtYWNfdGNwOworCXUzMiByZXNlcnZlZF8wOworCXUzMiB0bWFjX3VkcDsKKworLyogUnggTUFDIFN0YXRpc3RpY3MgY291bnRlcnMuICovCisJdTMyIHJtYWNfZGF0YV9vY3RldHM7CisJdTMyIHJtYWNfdmxkX2ZybXM7CisJdTY0IHJtYWNfZmNzX2Vycl9mcm1zOworCXU2NCBybWFjX2Ryb3BfZnJtczsKKwl1MzIgcm1hY192bGRfYmNzdF9mcm1zOworCXUzMiBybWFjX3ZsZF9tY3N0X2ZybXM7CisJdTMyIHJtYWNfb3V0X3JuZ19sZW5fZXJyX2ZybXM7CisJdTMyIHJtYWNfaW5fcm5nX2xlbl9lcnJfZnJtczsKKwl1NjQgcm1hY19sb25nX2ZybXM7CisJdTY0IHJtYWNfcGF1c2VfY3RybF9mcm1zOworCXU2NCBybWFjX3Vuc3VwX2N0cmxfZnJtczsKKwl1MzIgcm1hY19hY2NlcHRlZF91Y3N0X2ZybXM7CisJdTMyIHJtYWNfdHRsX29jdGV0czsKKwl1MzIgcm1hY19kaXNjYXJkZWRfZnJtczsKKwl1MzIgcm1hY19hY2NlcHRlZF9udWNzdF9mcm1zOworCXUzMiByZXNlcnZlZF8xOworCXUzMiBybWFjX2Ryb3BfZXZlbnRzOworCXU2NCBybWFjX3R0bF9sZXNzX2ZiX29jdGV0czsKKwl1NjQgcm1hY190dGxfZnJtczsKKwl1NjQgcmVzZXJ2ZWRfMjsKKwl1MzIgcm1hY191c2l6ZWRfZnJtczsKKwl1MzIgcmVzZXJ2ZWRfMzsKKwl1MzIgcm1hY19mcmFnX2ZybXM7CisJdTMyIHJtYWNfb3NpemVkX2ZybXM7CisJdTMyIHJlc2VydmVkXzQ7CisJdTMyIHJtYWNfamFiYmVyX2ZybXM7CisJdTY0IHJtYWNfdHRsXzY0X2ZybXM7CisJdTY0IHJtYWNfdHRsXzY1XzEyN19mcm1zOworCXU2NCByZXNlcnZlZF81OworCXU2NCBybWFjX3R0bF8xMjhfMjU1X2ZybXM7CisJdTY0IHJtYWNfdHRsXzI1Nl81MTFfZnJtczsKKwl1NjQgcmVzZXJ2ZWRfNjsKKwl1NjQgcm1hY190dGxfNTEyXzEwMjNfZnJtczsKKwl1NjQgcm1hY190dGxfMTAyNF8xNTE4X2ZybXM7CisJdTMyIHJtYWNfaXA7CisJdTMyIHJlc2VydmVkXzc7CisJdTY0IHJtYWNfaXBfb2N0ZXRzOworCXUzMiBybWFjX2Ryb3BfaXA7CisJdTMyIHJtYWNfaGRyX2Vycl9pcDsKKwl1MzIgcmVzZXJ2ZWRfODsKKwl1MzIgcm1hY19pY21wOworCXU2NCBybWFjX3RjcDsKKwl1MzIgcm1hY19lcnJfZHJwX3VkcDsKKwl1MzIgcm1hY191ZHA7CisJdTY0IHJtYWNfeGdtaWlfZXJyX3N5bTsKKwl1NjQgcm1hY19mcm1zX3EwOworCXU2NCBybWFjX2ZybXNfcTE7CisJdTY0IHJtYWNfZnJtc19xMjsKKwl1NjQgcm1hY19mcm1zX3EzOworCXU2NCBybWFjX2ZybXNfcTQ7CisJdTY0IHJtYWNfZnJtc19xNTsKKwl1NjQgcm1hY19mcm1zX3E2OworCXU2NCBybWFjX2ZybXNfcTc7CisJdTE2IHJtYWNfZnVsbF9xMzsKKwl1MTYgcm1hY19mdWxsX3EyOworCXUxNiBybWFjX2Z1bGxfcTE7CisJdTE2IHJtYWNfZnVsbF9xMDsKKwl1MTYgcm1hY19mdWxsX3E3OworCXUxNiBybWFjX2Z1bGxfcTY7CisJdTE2IHJtYWNfZnVsbF9xNTsKKwl1MTYgcm1hY19mdWxsX3E0OworCXUzMiByZXNlcnZlZF85OworCXUzMiBybWFjX3BhdXNlX2NudDsKKwl1NjQgcm1hY194Z21paV9kYXRhX2Vycl9jbnQ7CisJdTY0IHJtYWNfeGdtaWlfY3RybF9lcnJfY250OworCXUzMiBybWFjX2Vycl90Y3A7CisJdTMyIHJtYWNfYWNjZXB0ZWRfaXA7CisKKy8qIFBDSS9QQ0ktWCBSZWFkIHRyYW5zYWN0aW9uIHN0YXRpc3RpY3MuICovCisJdTMyIG5ld19yZF9yZXFfY250OworCXUzMiByZF9yZXFfY250OworCXUzMiByZF9ydHJ5X2NudDsKKwl1MzIgbmV3X3JkX3JlcV9ydHJ5X2NudDsKKworLyogUENJL1BDSS1YIFdyaXRlL1JlYWQgdHJhbnNhY3Rpb24gc3RhdGlzdGljcy4gKi8KKwl1MzIgd3JfcmVxX2NudDsKKwl1MzIgd3JfcnRyeV9yZF9hY2tfY250OworCXUzMiBuZXdfd3JfcmVxX3J0cnlfY250OworCXUzMiBuZXdfd3JfcmVxX2NudDsKKwl1MzIgd3JfZGlzY19jbnQ7CisJdTMyIHdyX3J0cnlfY250OworCisvKglQQ0kvUENJLVggV3JpdGUgLyBETUEgVHJhbnNhY3Rpb24gc3RhdGlzdGljcy4gKi8KKwl1MzIgdHhwX3dyX2NudDsKKwl1MzIgcmRfcnRyeV93cl9hY2tfY250OworCXUzMiB0eGRfd3JfY250OworCXUzMiB0eGRfcmRfY250OworCXUzMiByeGRfd3JfY250OworCXUzMiByeGRfcmRfY250OworCXUzMiByeGZfd3JfY250OworCXUzMiB0eGZfcmRfY250OworfSBTdGF0SW5mb190OworCisvKiBTdHJ1Y3R1cmVzIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgaW5pdCB0aW1lIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMgb2YgdGhlIE5JQy4KKyAqLworCisvKiBNYWludGFpbnMgUGVyIEZJRk8gcmVsYXRlZCBpbmZvcm1hdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IHR4X2ZpZm9fY29uZmlnIHsKKyNkZWZpbmUJTUFYX0FWQUlMQUJMRV9UWERTCTgxOTIKKwl1MzIgZmlmb19sZW47CQkvKiBzcGVjaWZpZXMgbGVuIG9mIEZJRk8gdXB0byA4MTkyLCBpZSBubyBvZiBUeERMcyAqLworLyogUHJpb3JpdHkgZGVmaW5pdGlvbiAqLworI2RlZmluZSBUWF9GSUZPX1BSSV8wICAgICAgICAgICAgICAgMAkvKkhpZ2hlc3QgKi8KKyNkZWZpbmUgVFhfRklGT19QUklfMSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFhfRklGT19QUklfMiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVFhfRklGT19QUklfMyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFhfRklGT19QUklfNCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVFhfRklGT19QUklfNSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVFhfRklGT19QUklfNiAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVFhfRklGT19QUklfNyAgICAgICAgICAgICAgIDcJLypsb3dlc3QgKi8KKwl1OCBmaWZvX3ByaW9yaXR5OwkvKiBzcGVjaWZpZXMgcG9pbnRlciBsZXZlbCBmb3IgRklGTyAqLworCS8qIHVzZXIgc2hvdWxkIG5vdCBzZXQgdHdvcyBmaWZvcyB3aXRoIHNhbWUgcHJpICovCisJdTggZl9ub19zbm9vcDsKKyNkZWZpbmUgTk9fU05PT1BfVFhEICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTk9fU05PT1BfVFhEX0JVRkZFUiAgICAgICAgICAweDAyCit9IHR4X2ZpZm9fY29uZmlnX3Q7CisKKworLyogTWFpbnRhaW5zIHBlciBSaW5nIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHJ4X3JpbmdfY29uZmlnIHsKKwl1MzIgbnVtX3J4ZDsJCS8qTm8gb2YgUnhEcyBwZXIgUnggUmluZyAqLworI2RlZmluZSBSWF9SSU5HX1BSSV8wICAgICAgICAgICAgICAgMAkvKiBoaWdoZXN0ICovCisjZGVmaW5lIFJYX1JJTkdfUFJJXzEgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJYX1JJTkdfUFJJXzIgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJYX1JJTkdfUFJJXzMgICAgICAgICAgICAgICAzCisjZGVmaW5lIFJYX1JJTkdfUFJJXzQgICAgICAgICAgICAgICA0CisjZGVmaW5lIFJYX1JJTkdfUFJJXzUgICAgICAgICAgICAgICA1CisjZGVmaW5lIFJYX1JJTkdfUFJJXzYgICAgICAgICAgICAgICA2CisjZGVmaW5lIFJYX1JJTkdfUFJJXzcgICAgICAgICAgICAgICA3CS8qIGxvd2VzdCAqLworCisJdTggcmluZ19wcmlvcml0eTsJLypTcGVjaWZpZXMgc2VydmljZSBwcmlvcml0eSBvZiByaW5nICovCisJLyogT1NNIHNob3VsZCBub3Qgc2V0IGFueSB0d28gcmluZ3Mgd2l0aCBzYW1lIHByaW9yaXR5ICovCisJdTggcmluZ19vcmc7CQkvKk9yZ2FuaXphdGlvbiBvZiByaW5nICovCisjZGVmaW5lIFJJTkdfT1JHX0JVRkYxCQkweDAxCisjZGVmaW5lIFJYX1JJTkdfT1JHX0JVRkYzCTB4MDMKKyNkZWZpbmUgUlhfUklOR19PUkdfQlVGRjUJMHgwNQorCisJdTggZl9ub19zbm9vcDsKKyNkZWZpbmUgTk9fU05PT1BfUlhEICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTk9fU05PT1BfUlhEX0JVRkZFUiAgICAgICAgIDB4MDIKK30gcnhfcmluZ19jb25maWdfdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgY29udGFpbnMgdmFsdWVzIG9mIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMgCisgKiBvZiB0aGUgSC9XIAorICovCitzdHJ1Y3QgY29uZmlnX3BhcmFtIHsKKy8qIFR4IFNpZGUgKi8KKwl1MzIgdHhfZmlmb19udW07CS8qTnVtYmVyIG9mIFR4IEZJRk9zICovCisjZGVmaW5lIE1BWF9UWF9GSUZPUyA4CisKKwl0eF9maWZvX2NvbmZpZ190IHR4X2NmZ1tNQVhfVFhfRklGT1NdOwkvKlBlci1UeCBGSUZPIGNvbmZpZyAqLworCXUzMiBtYXhfdHhkczsJCS8qTWF4IG5vLiBvZiBUeCBidWZmZXIgZGVzY3JpcHRvciBwZXIgVHhETCAqLworCXU2NCB0eF9pbnRyX3R5cGU7CisJLyogU3BlY2lmaWVzIGlmIFR4IEludHIgaXMgVVRJTFogb3IgUEVSX0xJU1QgdHlwZS4gKi8KKworLyogUnggU2lkZSAqLworCXUzMiByeF9yaW5nX251bTsJLypOdW1iZXIgb2YgcmVjZWl2ZSByaW5ncyAqLworI2RlZmluZSBNQVhfUlhfUklOR1MgOAorI2RlZmluZSBNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HICAxNTAKKworCXJ4X3JpbmdfY29uZmlnX3QgcnhfY2ZnW01BWF9SWF9SSU5HU107CS8qUGVyLVJ4IFJpbmcgY29uZmlnICovCisKKyNkZWZpbmUgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUgMTQKKyNkZWZpbmUgSEVBREVSXzgwMl8yX1NJWkUgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSEVBREVSX1NOQVBfU0laRSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSEVBREVSX1ZMQU5fU0laRSAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBNSU5fTVRVICAgICAgICAgICAgICAgICAgICAgICA0NgorI2RlZmluZSBNQVhfUFlMRCAgICAgICAgICAgICAgICAgICAgMTUwMAorI2RlZmluZSBNQVhfTVRVICAgICAgICAgICAgICAgICAgICAgKE1BWF9QWUxEKzE4KQorI2RlZmluZSBNQVhfTVRVX1ZMQU4gICAgICAgICAgICAgICAgKE1BWF9QWUxEKzIyKQorI2RlZmluZSBNQVhfUFlMRF9KVU1CTyAgICAgICAgICAgICAgOTYwMAorI2RlZmluZSBNQVhfTVRVX0pVTUJPICAgICAgICAgICAgICAgKE1BWF9QWUxEX0pVTUJPKzE4KQorI2RlZmluZSBNQVhfTVRVX0pVTUJPX1ZMQU4gICAgICAgICAgKE1BWF9QWUxEX0pVTUJPKzIyKQorfTsKKworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyBNQUMgQWRkcnMgKi8KK3R5cGVkZWYgc3RydWN0IG1hY19hZGRyIHsKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07Cit9IG1hY2FkZHJfdDsKKworLyogU3RydWN0dXJlIHRoYXQgcmVwcmVzZW50IGV2ZXJ5IEZJRk8gZWxlbWVudCBpbiB0aGUgQkFSMQorICogQWRkcmVzcyBsb2NhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IF9UeEZJRk9fZWxlbWVudCB7CisJdTY0IFR4RExfUG9pbnRlcjsKKworCXU2NCBMaXN0X0NvbnRyb2w7CisjZGVmaW5lIFRYX0ZJRk9fTEFTVF9UWERfTlVNKCB2YWwpICAgICB2QklUKHZhbCwwLDgpCisjZGVmaW5lIFRYX0ZJRk9fRklSU1RfTElTVCAgICAgICAgICAgICBCSVQoMTQpCisjZGVmaW5lIFRYX0ZJRk9fTEFTVF9MSVNUICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRYX0ZJRk9fRklSU1ROTEFTVF9MSVNUICAgICAgICB2QklUKDMsMTQsMikKKyNkZWZpbmUgVFhfRklGT19TUEVDSUFMX0ZVTkMgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgVFhfRklGT19EU19OT19TTk9PUCAgICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgVFhfRklGT19CVUZGX05PX1NOT09QICAgICAgICAgIEJJVCgzMCkKK30gVHhGSUZPX2VsZW1lbnRfdDsKKworLyogVHggZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9UeEQgeworCXU2NCBDb250cm9sXzE7CisvKiBiaXQgbWFzayAqLworI2RlZmluZSBUWERfTElTVF9PV05fWEVOQSAgICAgICBCSVQoNykKKyNkZWZpbmUgVFhEX1RfQ09ERSAgICAgICAgICAgICAgKEJJVCgxMil8QklUKDEzKXxCSVQoMTQpfEJJVCgxNSkpCisjZGVmaW5lIFRYRF9UX0NPREVfT0sodmFsKSAgICAgICh8KHZhbCAmIFRYRF9UX0NPREUpKQorI2RlZmluZSBHRVRfVFhEX1RfQ09ERSh2YWwpICAgICAoKHZhbCAmIFRYRF9UX0NPREUpPDwxMikKKyNkZWZpbmUgVFhEX0dBVEhFUl9DT0RFICAgICAgICAgKEJJVCgyMikgfCBCSVQoMjMpKQorI2RlZmluZSBUWERfR0FUSEVSX0NPREVfRklSU1QgICBCSVQoMjIpCisjZGVmaW5lIFRYRF9HQVRIRVJfQ09ERV9MQVNUICAgIEJJVCgyMykKKyNkZWZpbmUgVFhEX1RDUF9MU09fRU4gICAgICAgICAgQklUKDMwKQorI2RlZmluZSBUWERfVURQX0NPRl9FTiAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIFRYRF9UQ1BfTFNPX01TUyh2YWwpICAgIHZCSVQodmFsLDM0LDE0KQorI2RlZmluZSBUWERfQlVGRkVSMF9TSVpFKHZhbCkgICB2QklUKHZhbCw0OCwxNikKKworCXU2NCBDb250cm9sXzI7CisjZGVmaW5lIFRYRF9UWF9DS09fQ09OVFJPTCAgICAgIChCSVQoNSl8QklUKDYpfEJJVCg3KSkKKyNkZWZpbmUgVFhEX1RYX0NLT19JUFY0X0VOICAgICAgQklUKDUpCisjZGVmaW5lIFRYRF9UWF9DS09fVENQX0VOICAgICAgIEJJVCg2KQorI2RlZmluZSBUWERfVFhfQ0tPX1VEUF9FTiAgICAgICBCSVQoNykKKyNkZWZpbmUgVFhEX1ZMQU5fRU5BQkxFICAgICAgICAgQklUKDE1KQorI2RlZmluZSBUWERfVkxBTl9UQUcodmFsKSAgICAgICB2QklUKHZhbCwxNiwxNikKKyNkZWZpbmUgVFhEX0lOVF9OVU1CRVIodmFsKSAgICAgdkJJVCh2YWwsMzQsNikKKyNkZWZpbmUgVFhEX0lOVF9UWVBFX1BFUl9MSVNUICAgQklUKDQ3KQorI2RlZmluZSBUWERfSU5UX1RZUEVfVVRJTFogICAgICBCSVQoNDYpCisjZGVmaW5lIFRYRF9TRVRfTUFSS0VSICAgICAgICAgdkJJVCgweDYsMCw0KQorCisJdTY0IEJ1ZmZlcl9Qb2ludGVyOworCXU2NCBIb3N0X0NvbnRyb2w7CS8qIHJlc2VydmVkIGZvciBob3N0ICovCit9IFR4RF90OworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcGh5IGFuZCB2aXJ0IGFkZHIgb2YgZXZlcnkgVHhETC4gKi8KK3R5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19ob2xkIHsKKwlkbWFfYWRkcl90IGxpc3RfcGh5X2FkZHI7CisJdm9pZCAqbGlzdF92aXJ0X2FkZHI7Cit9IGxpc3RfaW5mb19ob2xkX3Q7CisKKy8qIFJ4IGRlc2NyaXB0b3Igc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfUnhEX3QgeworCXU2NCBIb3N0X0NvbnRyb2w7CS8qIHJlc2VydmVkIGZvciBob3N0ICovCisJdTY0IENvbnRyb2xfMTsKKyNkZWZpbmUgUlhEX09XTl9YRU5BICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJYRF9UX0NPREUgICAgICAgICAgICAgIChCSVQoMTIpfEJJVCgxMyl8QklUKDE0KXxCSVQoMTUpKQorI2RlZmluZSBSWERfRlJBTUVfUFJPVE8gICAgICAgICB2QklUKDB4RkZGRiwyNCw4KQorI2RlZmluZSBSWERfRlJBTUVfUFJPVE9fSVBWNCAgICBCSVQoMjcpCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UT19JUFY2ICAgIEJJVCgyOCkKKyNkZWZpbmUgUlhEX0ZSQU1FX1BST1RPX1RDUCAgICAgQklUKDMwKQorI2RlZmluZSBSWERfRlJBTUVfUFJPVE9fVURQICAgICBCSVQoMzEpCisjZGVmaW5lIFRDUF9PUl9VRFBfRlJBTUUgICAgICAgIChSWERfRlJBTUVfUFJPVE9fVENQIHwgUlhEX0ZSQU1FX1BST1RPX1VEUCkKKyNkZWZpbmUgUlhEX0dFVF9MM19DS1NVTSh2YWwpICAgKCh1MTYpKHZhbD4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgUlhEX0dFVF9MNF9DS1NVTSh2YWwpICAgKCh1MTYpKHZhbCkgJiAweEZGRkYpCisKKwl1NjQgQ29udHJvbF8yOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorI2RlZmluZSBNQVNLX0JVRkZFUjBfU0laRSAgICAgICB2QklUKDB4RkZGRiwwLDE2KQorI2RlZmluZSBTRVRfQlVGRkVSMF9TSVpFKHZhbCkgICB2QklUKHZhbCwwLDE2KQorI2Vsc2UKKyNkZWZpbmUgTUFTS19CVUZGRVIwX1NJWkUgICAgICAgdkJJVCgweEZGLDAsMTYpCisjZGVmaW5lIE1BU0tfQlVGRkVSMV9TSVpFICAgICAgIHZCSVQoMHhGRkZGLDE2LDE2KQorI2RlZmluZSBNQVNLX0JVRkZFUjJfU0laRSAgICAgICB2QklUKDB4RkZGRiwzMiwxNikKKyNkZWZpbmUgU0VUX0JVRkZFUjBfU0laRSh2YWwpICAgdkJJVCh2YWwsOCw4KQorI2RlZmluZSBTRVRfQlVGRkVSMV9TSVpFKHZhbCkgICB2QklUKHZhbCwxNiwxNikKKyNkZWZpbmUgU0VUX0JVRkZFUjJfU0laRSh2YWwpICAgdkJJVCh2YWwsMzIsMTYpCisjZW5kaWYKKworI2RlZmluZSBNQVNLX1ZMQU5fVEFHICAgICAgICAgICB2QklUKDB4RkZGRiw0OCwxNikKKyNkZWZpbmUgU0VUX1ZMQU5fVEFHKHZhbCkgICAgICAgdkJJVCh2YWwsNDgsMTYpCisjZGVmaW5lIFNFVF9OVU1fVEFHKHZhbCkgICAgICAgdkJJVCh2YWwsMTYsMzIpCisKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKyNkZWZpbmUgUlhEX0dFVF9CVUZGRVIwX1NJWkUoQ29udHJvbF8yKSAodTY0KSgoQ29udHJvbF8yICYgdkJJVCgweEZGRkYsMCwxNikpKQorI2Vsc2UKKyNkZWZpbmUgUlhEX0dFVF9CVUZGRVIwX1NJWkUoQ29udHJvbF8yKSAodTgpKChDb250cm9sXzIgJiBNQVNLX0JVRkZFUjBfU0laRSkgXAorCQkJCQkJCT4+IDQ4KQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjFfU0laRShDb250cm9sXzIpICh1MTYpKChDb250cm9sXzIgJiBNQVNLX0JVRkZFUjFfU0laRSkgXAorCQkJCQkJCT4+IDMyKQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjJfU0laRShDb250cm9sXzIpICh1MTYpKChDb250cm9sXzIgJiBNQVNLX0JVRkZFUjJfU0laRSkgXAorCQkJCQkJCT4+IDE2KQorI2RlZmluZSBCVUYwX0xFTgk0MAorI2RlZmluZSBCVUYxX0xFTgkxCisjZW5kaWYKKworCXU2NCBCdWZmZXIwX3B0cjsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXU2NCBCdWZmZXIxX3B0cjsKKwl1NjQgQnVmZmVyMl9wdHI7CisjZW5kaWYKK30gUnhEX3Q7CisKKy8qIFN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlIFJ4IGRlc2NyaXB0b3IgYmxvY2sgd2hpY2ggY29udGFpbnMgCisgKiAxMjggUnggZGVzY3JpcHRvcnMuCisgKi8KKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKK3R5cGVkZWYgc3RydWN0IF9SeERfYmxvY2sgeworI2RlZmluZSBNQVhfUlhEU19QRVJfQkxPQ0sgICAgICAgICAgICAgMTI3CisJUnhEX3QgcnhkW01BWF9SWERTX1BFUl9CTE9DS107CisKKwl1NjQgcmVzZXJ2ZWRfMDsKKyNkZWZpbmUgRU5EX09GX0JMT0NLICAgIDB4RkVGRkZGRkZGRkZGRkZGRlVMTAorCXU2NCByZXNlcnZlZF8xOwkJLyogMHhGRUZGRkZGRkZGRkZGRkZGIHRvIG1hcmsgbGFzdCAKKwkJCQkgKiBSeGQgaW4gdGhpcyBibGsgKi8KKwl1NjQgcmVzZXJ2ZWRfMl9wTmV4dF9SeERfYmxvY2s7CS8qIExvZ2ljYWwgcHRyIHRvIG5leHQgKi8KKwl1NjQgcE5leHRfUnhEX0Jsa19waHlzaWNhbDsJLyogQnVmZjBfcHRyLkluIGEgMzIgYml0IGFyY2gKKwkJCQkJICogdGhlIHVwcGVyIDMyIGJpdHMgc2hvdWxkIAorCQkJCQkgKiBiZSAwICovCit9IFJ4RF9ibG9ja190OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IF9SeERfYmxvY2sgeworI2RlZmluZSBNQVhfUlhEU19QRVJfQkxPQ0sgICAgICAgICAgICAgODUKKwlSeERfdCByeGRbTUFYX1JYRFNfUEVSX0JMT0NLXTsKKworI2RlZmluZSBFTkRfT0ZfQkxPQ0sgICAgMHhGRUZGRkZGRkZGRkZGRkZGVUxMCisJdTY0IHJlc2VydmVkXzE7CQkvKiAweEZFRkZGRkZGRkZGRkZGRkYgdG8gbWFyayBsYXN0IFJ4ZCAKKwkJCQkgKiBpbiB0aGlzIGJsayAqLworCXU2NCBwTmV4dF9SeERfQmxrX3BoeXNpY2FsOwkvKiBQaHkgcG9udGVyIHRvIG5leHQgYmxrLiAqLworfSBSeERfYmxvY2tfdDsKKyNkZWZpbmUgU0laRV9PRl9CTE9DSwk0MDk2CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHZpcnR1YWwgYWRkcmVzc2VzIG9mIEJ1ZjAgYW5kIEJ1ZjEgaW4gCisgKiAyYnVmIG1vZGUuICovCit0eXBlZGVmIHN0cnVjdCBidWZBZGQgeworCXZvaWQgKmJhXzBfb3JnOworCXZvaWQgKmJhXzFfb3JnOworCXZvaWQgKmJhXzA7CisJdm9pZCAqYmFfMTsKK30gYnVmZkFkZF90OworI2VuZGlmCisKKy8qIFN0cnVjdHVyZSB3aGljaCBzdG9yZXMgYWxsIHRoZSBNQUMgY29udHJvbCBwYXJhbWV0ZXJzICovCisKKy8qIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBSeEQgaW4gdGhlIHJpbmcgCisgKiBmcm9tIHdoaWNoIHRoZSBSeCBJbnRlcnJ1cHQgcHJvY2Vzc29yIGNhbiBzdGFydCBwaWNraW5nIAorICogdXAgdGhlIFJ4RHMgZm9yIHByb2Nlc3NpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9yeF9jdXJyX2dldF9pbmZvX3QgeworCXUzMiBibG9ja19pbmRleDsKKwl1MzIgb2Zmc2V0OworCXUzMiByaW5nX2xlbjsKK30gcnhfY3Vycl9nZXRfaW5mb190OworCit0eXBlZGVmIHJ4X2N1cnJfZ2V0X2luZm9fdCByeF9jdXJyX3B1dF9pbmZvX3Q7CisKKy8qIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBUeERsIGluIHRoZSBGSUZPCisgKiBmcm9tIHdoaWNoIHRoZSBUeCBJbnRlcnJ1cHQgcHJvY2Vzc29yIGNhbiBzdGFydCBwaWNraW5nIAorICogdXAgdGhlIFR4RExzIGZvciBzZW5kIGNvbXBsZXRlIGludGVycnVwdCBwcm9jZXNzaW5nLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIG9mZnNldDsKKwl1MzIgZmlmb19sZW47Cit9IHR4X2N1cnJfZ2V0X2luZm9fdDsKKwordHlwZWRlZiB0eF9jdXJyX2dldF9pbmZvX3QgdHhfY3Vycl9wdXRfaW5mb190OworCisvKiBJbmZvbWF0aW9uIHJlbGF0ZWQgdG8gdGhlIFR4IGFuZCBSeCBGSUZPcyBhbmQgUmluZ3Mgb2YgWGVuYQorICogaXMgbWFpbnRhaW5lZCBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWFjX2luZm8geworLyogcnggc2lkZSBzdHVmZiAqLworCS8qIFB1dCBwb2ludGVyIGluZm8gd2hpY2ggaW5kaWN0ZXMgd2hpY2ggUnhEIGhhcyB0byBiZSByZXBsZW5pc2hlZCAKKwkgKiB3aXRoIGEgbmV3IGJ1ZmZlci4KKwkgKi8KKwlyeF9jdXJyX3B1dF9pbmZvX3QgcnhfY3Vycl9wdXRfaW5mb1tNQVhfUlhfUklOR1NdOworCisJLyogR2V0IHBvaW50ZXIgaW5mbyB3aGljaCBpbmRpY3RlcyB3aGljaCBpcyB0aGUgbGFzdCBSeEQgdGhhdCB3YXMgCisJICogcHJvY2Vzc2VkIGJ5IHRoZSBkcml2ZXIuCisJICovCisJcnhfY3Vycl9nZXRfaW5mb190IHJ4X2N1cnJfZ2V0X2luZm9bTUFYX1JYX1JJTkdTXTsKKworCXUxNiBybWFjX3BhdXNlX3RpbWU7CisJdTE2IG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzOworCXUxNiBtY19wYXVzZV90aHJlc2hvbGRfcTRxNzsKKworLyogdHggc2lkZSBzdHVmZiAqLworCS8qIGxvZ2ljYWwgcG9pbnRlciBvZiBzdGFydCBvZiBlYWNoIFR4IEZJRk8gKi8KKwlUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKnR4X0ZJRk9fc3RhcnRbTUFYX1RYX0ZJRk9TXTsKKworLyogQ3VycmVudCBvZmZzZXQgd2l0aGluIHR4X0ZJRk9fc3RhcnQsIHdoZXJlIGRyaXZlciB3b3VsZCB3cml0ZSBuZXcgVHggZnJhbWUqLworCXR4X2N1cnJfcHV0X2luZm9fdCB0eF9jdXJyX3B1dF9pbmZvW01BWF9UWF9GSUZPU107CisJdHhfY3Vycl9nZXRfaW5mb190IHR4X2N1cnJfZ2V0X2luZm9bTUFYX1RYX0ZJRk9TXTsKKworCXZvaWQgKnN0YXRzX21lbTsJLyogb3JpZ25hbCBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW0gKi8KKwlkbWFfYWRkcl90IHN0YXRzX21lbV9waHk7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXQgYmxvY2sgKi8KKwl1MzIgc3RhdHNfbWVtX3N6OworCVN0YXRJbmZvX3QgKnN0YXRzX2luZm87CS8qIExvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhdCBibG9jayAqLworfSBtYWNfaW5mb190OworCisvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSB1c2VyIGRlZmluZWQgTUFDIGFkZHJlc3NlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgYWRkcltFVEhfQUxFTl07CisJaW50IHVzYWdlX2NudDsKK30gdXNyX2FkZHJfdDsKKworLyogU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIFBoeSBhbmQgdmlydCBhZGRyZXNzZXMgb2YgdGhlIEJsb2NrcyAqLwordHlwZWRlZiBzdHJ1Y3QgcnhfYmxvY2tfaW5mbyB7CisJUnhEX3QgKmJsb2NrX3ZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IGJsb2NrX2RtYV9hZGRyOworfSByeF9ibG9ja19pbmZvX3Q7CisKKy8qIERlZmF1bHQgVHVuYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZSBOSUMuICovCisjZGVmaW5lIERFRkFVTFRfRklGT19MRU4gNDA5NgorI2RlZmluZSBTTUFMTF9SWERfQ05UCTMwICogKE1BWF9SWERTX1BFUl9CTE9DSysxKQorI2RlZmluZSBMQVJHRV9SWERfQ05UCTEwMCAqIChNQVhfUlhEU19QRVJfQkxPQ0srMSkKKyNkZWZpbmUgU01BTExfQkxLX0NOVAkzMAorI2RlZmluZSBMQVJHRV9CTEtfQ05UCTEwMAorCisvKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgTklDICovCit0eXBlZGVmIHN0cnVjdCBzMmlvX25pYyB7CisjZGVmaW5lIE1BWF9NQUNfU1VQUE9SVEVEICAgMTYKKyNkZWZpbmUgTUFYX1NVUFBPUlRFRF9NVUxUSUNBU1RTIE1BWF9NQUNfU1VQUE9SVEVECisKKwltYWNhZGRyX3QgZGVmX21hY19hZGRyW01BWF9NQUNfU1VQUE9SVEVEXTsKKwltYWNhZGRyX3QgcHJlX21hY19hZGRyW01BWF9NQUNfU1VQUE9SVEVEXTsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXZvaWQgX19pb21lbSAqYmFyMDsKKwl2b2lkIF9faW9tZW0gKmJhcjE7CisJc3RydWN0IGNvbmZpZ19wYXJhbSBjb25maWc7CisJbWFjX2luZm9fdCBtYWNfY29udHJvbDsKKwlpbnQgaGlnaF9kbWFfZmxhZzsKKwlpbnQgZGV2aWNlX2Nsb3NlX2ZsYWc7CisJaW50IGRldmljZV9lbmFibGVkX29uY2U7CisKKwljaGFyIG5hbWVbMzJdOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGFza2xldF9zdGF0dXM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXUxNiB2ZW5kb3JfaWQ7CisJdTE2IGRldmljZV9pZDsKKwl1MTYgY2NtZDsKKwl1MzIgY2JhcjBfMTsKKwl1MzIgY2JhcjBfMjsKKwl1MzIgY2JhcjFfMTsKKwl1MzIgY2JhcjFfMjsKKwl1MzIgY2lycTsKKwl1OCBjYWNoZV9saW5lOworCXUzMiByb21fZXhwYW5zaW9uOworCXUxNiBwY2l4X2NtZDsKKwl1MzIgaXJxOworCWF0b21pY190IHJ4X2J1ZnNfbGVmdFtNQVhfUlhfUklOR1NdOworCisJc3BpbmxvY2tfdCB0eF9sb2NrOworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJc3BpbmxvY2tfdCBwdXRfbG9jazsKKyNlbmRpZgorCisjZGVmaW5lIFBST01JU0MgICAgIDEKKyNkZWZpbmUgQUxMX01VTFRJICAgMgorCisjZGVmaW5lIE1BWF9BRERSU19TVVBQT1JURUQgNjQKKwl1MTYgdXNyX2FkZHJfY291bnQ7CisJdTE2IG1jX2FkZHJfY291bnQ7CisJdXNyX2FkZHJfdCB1c3JfYWRkcnNbTUFYX0FERFJTX1NVUFBPUlRFRF07CisKKwl1MTYgbV9jYXN0X2ZsZzsKKwl1MTYgYWxsX211bHRpX3BvczsKKwl1MTYgcHJvbWlzY19mbGc7CisKKwl1MTYgdHhfcGt0X2NvdW50OworCXUxNiByeF9wa3RfY291bnQ7CisJdTE2IHR4X2Vycl9jb3VudDsKKwl1MTYgcnhfZXJyX2NvdW50OworCisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwkvKiBJbmRleCB0byB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHB1dCBwb2ludGVyIG9mIFJ4IHJpbmcuICovCisJaW50IHB1dF9wb3NbTUFYX1JYX1JJTkdTXTsKKyNlbmRpZgorCisJLyoKKwkgKiAgUGxhY2UgaG9sZGVycyBmb3IgdGhlIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiAKKwkgKiAgYWxsIHRoZSBSeCBCbG9ja3MKKwkgKi8KKwlyeF9ibG9ja19pbmZvX3QgcnhfYmxvY2tzW01BWF9SWF9SSU5HU11bTUFYX1JYX0JMT0NLU19QRVJfUklOR107CisJaW50IGJsb2NrX2NvdW50W01BWF9SWF9SSU5HU107CisJaW50IHBrdF9jbnRbTUFYX1JYX1JJTkdTXTsKKworCS8qIFBsYWNlIGhvbGRlciBvZiBhbGwgdGhlIFRYIExpc3QncyBQaHkgYW5kIFZpcnQgYWRkcmVzc2VzLiAqLworCWxpc3RfaW5mb19ob2xkX3QgKmxpc3RfaW5mb1tNQVhfVFhfRklGT1NdOworCisJLyogIElkIHRpbWVyLCB1c2VkIHRvIGJsaW5rIE5JQyB0byBwaHlzaWNhbGx5IGlkZW50aWZ5IE5JQy4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBpZF90aW1lcjsKKworCS8qICBSZXN0YXJ0IHRpbWVyLCB1c2VkIHRvIHJlc3RhcnQgTklDIGlmIHRoZSBkZXZpY2UgaXMgc3R1Y2sgYW5kCisJICogIGEgc2NoZWR1bGUgdGFzayB0aGF0IHdpbGwgc2V0IHRoZSBjb3JyZWN0IExpbmsgc3RhdGUgb25jZSB0aGUgCisJICogIE5JQydzIFBIWSBoYXMgc3RhYmlsaXplZCBhZnRlciBhIHN0YXRlIGNoYW5nZS4KKwkgKi8KKyNpZmRlZiBJTklUX1RRVUVVRQorCXN0cnVjdCB0cV9zdHJ1Y3QgcnN0X3RpbWVyX3Rhc2s7CisJc3RydWN0IHRxX3N0cnVjdCBzZXRfbGlua190YXNrOworI2Vsc2UKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnN0X3RpbWVyX3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHNldF9saW5rX3Rhc2s7CisjZW5kaWYKKworCS8qIEZsYWcgdGhhdCBjYW4gYmUgdXNlZCB0byB0dXJuIG9uIG9yIHR1cm4gb2ZmIHRoZSBSeCBjaGVja3N1bSAKKwkgKiBvZmZsb2FkIGZlYXR1cmUuCisJICovCisJaW50IHJ4X2NzdW07CisKKwkvKiAgYWZ0ZXIgYmxpbmssIHRoZSBhZGFwdGVyIG11c3QgYmUgcmVzdG9yZWQgd2l0aCBvcmlnaW5hbCAKKwkgKiAgdmFsdWVzLgorCSAqLworCXU2NCBhZGFwdF9jdHJsX29yZzsKKworCS8qIExhc3Qga25vd24gbGluayBzdGF0ZS4gKi8KKwl1MTYgbGFzdF9saW5rX3N0YXRlOworI2RlZmluZQlMSU5LX0RPV04JMQorI2RlZmluZQlMSU5LX1VQCQkyCisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIEJ1ZmZlciBBZGRyZXNzIHN0b3JlLiAqLworCWJ1ZmZBZGRfdCAqKmJhW01BWF9SWF9SSU5HU107CisjZW5kaWYKKwlpbnQgdGFza19mbGFnOworI2RlZmluZSBDQVJEX0RPV04gMQorI2RlZmluZSBDQVJEX1VQIDIKKwlhdG9taWNfdCBjYXJkX3N0YXRlOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbGlua19zdGF0ZTsKK30gbmljX3Q7CisKKyNkZWZpbmUgUkVTRVRfRVJST1IgMTsKKyNkZWZpbmUgQ01EX0VSUk9SICAgMjsKKworLyogIE9TIHJlbGF0ZWQgc3lzdGVtIGNhbGxzICovCisjaWZuZGVmIHJlYWRxCitzdGF0aWMgaW5saW5lIHU2NCByZWFkcSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTY0IHJldCA9IHJlYWRsKGFkZHIgKyA0KTsKKwlyZXQgPDw9IDMyOworCXJldCB8PSByZWFkbChhZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiB3cml0ZXEKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXEodTY0IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlbCgodTMyKSAodmFsKSwgYWRkcik7CisJd3JpdGVsKCh1MzIpICh2YWwgPj4gMzIpLCAoYWRkciArIDQpKTsKK30KKworLyogSW4gMzIgYml0IG1vZGVzLCBzb21lIHJlZ2lzdGVycyBoYXZlIHRvIGJlIHdyaXR0ZW4gaW4gYSAKKyAqIHBhcnRpY3VsYXIgb3JkZXIgdG8gZXhwZWN0IGNvcnJlY3QgaGFyZHdhcmUgb3BlcmF0aW9uLiBUaGUKKyAqIG1hY3JvIFNQRUNJQUxfUkVHX1dSSVRFIGlzIHVzZWQgdG8gcGVyZm9ybSBzdWNoIG9yZGVyZWQgCisgKiB3cml0ZXMuIERlZmluZXMgVUYgKFVwcGVyIEZpcnN0KSBhbmQgTEYgKExvd2VyIEZpcnN0KSB3aWxsIAorICogYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCB3cml0ZSBvcmRlci4KKyAqLworI2RlZmluZSBVRgkxCisjZGVmaW5lIExGCTIKK3N0YXRpYyBpbmxpbmUgdm9pZCBTUEVDSUFMX1JFR19XUklURSh1NjQgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvcmRlcikKK3sKKwlpZiAob3JkZXIgPT0gTEYpIHsKKwkJd3JpdGVsKCh1MzIpICh2YWwpLCBhZGRyKTsKKwkJd3JpdGVsKCh1MzIpICh2YWwgPj4gMzIpLCAoYWRkciArIDQpKTsKKwl9IGVsc2UgeworCQl3cml0ZWwoKHUzMikgKHZhbCA+PiAzMiksIChhZGRyICsgNCkpOworCQl3cml0ZWwoKHUzMikgKHZhbCksIGFkZHIpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIFNQRUNJQUxfUkVHX1dSSVRFKHZhbCwgYWRkciwgZHVtbXkpIHdyaXRlcSh2YWwsIGFkZHIpCisjZW5kaWYKKworLyogIEludGVycnVwdCByZWxhdGVkIHZhbHVlcyBvZiBYZW5hICovCisKKyNkZWZpbmUgRU5BQkxFX0lOVFJTICAgIDEKKyNkZWZpbmUgRElTQUJMRV9JTlRSUyAgIDIKKworLyogIEhpZ2hlc3QgbGV2ZWwgaW50ZXJydXB0IGJsb2NrcyAqLworI2RlZmluZSBUWF9QSUNfSU5UUiAgICAgKDB4MDAwMTw8MCkKKyNkZWZpbmUgVFhfRE1BX0lOVFIgICAgICgweDAwMDE8PDEpCisjZGVmaW5lIFRYX01BQ19JTlRSICAgICAoMHgwMDAxPDwyKQorI2RlZmluZSBUWF9YR1hTX0lOVFIgICAgKDB4MDAwMTw8MykKKyNkZWZpbmUgVFhfVFJBRkZJQ19JTlRSICgweDAwMDE8PDQpCisjZGVmaW5lIFJYX1BJQ19JTlRSICAgICAoMHgwMDAxPDw1KQorI2RlZmluZSBSWF9ETUFfSU5UUiAgICAgKDB4MDAwMTw8NikKKyNkZWZpbmUgUlhfTUFDX0lOVFIgICAgICgweDAwMDE8PDcpCisjZGVmaW5lIFJYX1hHWFNfSU5UUiAgICAoMHgwMDAxPDw4KQorI2RlZmluZSBSWF9UUkFGRklDX0lOVFIgKDB4MDAwMTw8OSkKKyNkZWZpbmUgTUNfSU5UUiAgICAgICAgICgweDAwMDE8PDEwKQorI2RlZmluZSBFTkFfQUxMX0lOVFJTICAgICggICBUWF9QSUNfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfRE1BX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX01BQ19JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9YR1hTX0lOVFIgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfVFJBRkZJQ19JTlRSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX1BJQ19JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWF9ETUFfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhfTUFDX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX1hHWFNfSU5UUiAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWF9UUkFGRklDX0lOVFIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNfSU5UUiApCisKKy8qICBJbnRlcnJ1cHQgbWFza3MgZm9yIHRoZSBnZW5lcmFsIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIERJU0FCTEVfQUxMX0lOVFJTICAgMHhGRkZGRkZGRkZGRkZGRkZGVUxMCisKKyNkZWZpbmUgVFhQSUNfSU5UX00gICAgICAgICBCSVQoMCkKKyNkZWZpbmUgVFhETUFfSU5UX00gICAgICAgICBCSVQoMSkKKyNkZWZpbmUgVFhNQUNfSU5UX00gICAgICAgICBCSVQoMikKKyNkZWZpbmUgVFhYR1hTX0lOVF9NICAgICAgICBCSVQoMykKKyNkZWZpbmUgVFhUUkFGRklDX0lOVF9NICAgICBCSVQoOCkKKyNkZWZpbmUgUElDX1JYX0lOVF9NICAgICAgICBCSVQoMzIpCisjZGVmaW5lIFJYRE1BX0lOVF9NICAgICAgICAgQklUKDMzKQorI2RlZmluZSBSWE1BQ19JTlRfTSAgICAgICAgIEJJVCgzNCkKKyNkZWZpbmUgTUNfSU5UX00gICAgICAgICAgICBCSVQoMzUpCisjZGVmaW5lIFJYWEdYU19JTlRfTSAgICAgICAgQklUKDM2KQorI2RlZmluZSBSWFRSQUZGSUNfSU5UX00gICAgIEJJVCg0MCkKKworLyogIFBJQyBsZXZlbCBJbnRlcnJ1cHRzIFRPRE8qLworCisvKiAgRE1BIGxldmVsIElucmVzc3VwdHMgKi8KKyNkZWZpbmUgVFhETUFfUEZDX0lOVF9NICAgICBCSVQoMCkKKyNkZWZpbmUgVFhETUFfUENDX0lOVF9NICAgICBCSVQoMikKKworLyogIFBGQyBibG9jayBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFBGQ19NSVNDX0VSUl8xICAgICAgQklUKDApCS8qIEludGVycnVwdCB0byBpbmRpY2F0ZSBGSUZPIGZ1bGwgKi8KKworLyogUENDIGJsb2NrIGludGVycnVwdHMuICovCisjZGVmaW5lCVBDQ19GQl9FQ0NfRVJSCSAgIHZCSVQoMHhmZiwgMTYsIDgpCS8qIEludGVycnVwdCB0byBpbmRpY2F0ZQorCQkJCQkJICAgUENDX0ZCX0VDQyBFcnJvci4gKi8KKworLyoKKyAqIFByb3RvdHlwZSBkZWNsYXJhdGlvbi4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgczJpb19pbml0X25pYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcHJlKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzMmlvX3JlbV9uaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworc3RhdGljIGludCBpbml0X3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpzcCk7CitzdGF0aWMgdm9pZCBmcmVlX3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpzcCk7CitzdGF0aWMgaW50IGluaXRfbmljKHN0cnVjdCBzMmlvX25pYyAqbmljKTsKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorc3RhdGljIHZvaWQgcnhfaW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqc3ApOworI2VuZGlmCitzdGF0aWMgdm9pZCB0eF9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpzcCk7CitzdGF0aWMgdm9pZCBhbGFybV9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpzcCk7CisKK3N0YXRpYyBpbnQgczJpb19zdGFydGVyKHZvaWQpOworc3RhdGljIHZvaWQgczJpb19jbG9zZXIodm9pZCk7CitzdGF0aWMgdm9pZCBzMmlvX3R4X3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgczJpb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpOworc3RhdGljIHZvaWQgczJpb19zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorc3RhdGljIGludCByeF9vc21faGFuZGxlcihuaWNfdCAqIHNwLCB1MTYgbGVuLCBSeERfdCAqIHJ4ZHAsIGludCByaW5nX25vKTsKKyNlbHNlCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8sCisJCQkgIGJ1ZmZBZGRfdCAqIGJhKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgczJpb19saW5rKG5pY190ICogc3AsIGludCBsaW5rKTsKK3N0YXRpYyB2b2lkIHMyaW9fcmVzZXQobmljX3QgKiBzcCk7CisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorc3RhdGljIGludCBzMmlvX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCitzdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKG5pY190ICogc3ApOworc3RhdGljIGludCBzMmlvX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqIGFkZHIpOworc3RhdGljIGlycXJldHVybl90IHMyaW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHU2NCB2YWw2NCwgaW50IGZsYWcpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgdm9pZCBzMmlvX3NldF9saW5rKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IHMyaW9fc2V0X3N3YXBwZXIobmljX3QgKiBzcCk7CitzdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihuaWNfdCAqIG5pYyk7CitzdGF0aWMgaW50IHMyaW9fY2FyZF91cChuaWNfdCAqIG5pYyk7CisKKyNlbmRpZgkJCQkvKiBfUzJJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYWE5NzMwLmMgYi9kcml2ZXJzL25ldC9zYWE5NzMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMTY3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiBTQUE5NzMwIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDaGFuZ2VzOgorICogQW5nZWxvIERlbGwnQWVyYSA8YnVmZmVyQGFudGlmb3JrLm9yZz4gOiBDb252ZXJzaW9uIHRvIHRoZSBuZXcgUENJIEFQSSAocGNpX2RyaXZlcikuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gdG8gc3BpbmxvY2tzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciBoYW5kbGluZyBmaXhlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL3Byb20uaD4KKworI2luY2x1ZGUgInNhYTk3MzAuaCIKKworI2lmZGVmIExBTl9TQUE5NzMwX0RFQlVHCitpbnQgbGFuX3NhYTk3MzBfZGVidWcgPSBMQU5fU0FBOTczMF9ERUJVRzsKKyNlbHNlCitpbnQgbGFuX3NhYTk3MzBfZGVidWc7CisjZW5kaWYKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUgInNhYTk3MzAiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzYWE5NzMwX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfUEhJTElQUywgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTkzNzAsCisgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2FhOTczMF9wY2lfdGJsKTsKKworLyogTm9uLXplcm8gb25seSBpZiB0aGUgY3VycmVudCBjYXJkIGlzIGEgUENJIHdpdGggQklPUy1zZXQgSVJRLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBwY2lfaXJxX2xpbmU7CisKKyNkZWZpbmUgSU5MKGEpICAgICBpbmwoKHVuc2lnbmVkIGxvbmcpYSkKKyNkZWZpbmUgT1VUTCh4LGEpICBvdXRsKHgsKHVuc2lnbmVkIGxvbmcpYSkKKworc3RhdGljIHZvaWQgZXZtX3NhYTk3MzBfZW5hYmxlX2xhbl9pbnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKSB8IEVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpOworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0U3RhdHVzMSkgfCBFVk1fTEFOX0lOVCwKKwkgICAgICZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0U3RhdHVzMSk7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKSB8IEVWTV9MQU5fSU5UIHwKKwkgICAgIEVWTV9NQVNURVJfRU4sICZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSk7Cit9CitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9kaXNhYmxlX2xhbl9pbnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKSAmIH5FVk1fTEFOX0lOVCwKKwkgICAgICZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKTsKKwlPVVRMKElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEpICYgfkVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKTsKK30KKworc3RhdGljIHZvaWQgZXZtX3NhYTk3MzBfY2xlYXJfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChFVk1fTEFOX0lOVCwgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKTsKK30KKworc3RhdGljIHZvaWQgZXZtX3NhYTk3MzBfYmxvY2tfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpICYgfkVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpOworfQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF91bmJsb2NrX2xhbl9pbnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKSB8IEVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3NhYTk3MzBfcmVncyhzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGksIGo7CisJcHJpbnRrKCJUeG1CdWZmZXJBID0gJXhcbiIsIGxwLT5UeG1CdWZmZXJbMF1bMF0pOworCXByaW50aygiVHhtQnVmZmVyQiA9ICV4XG4iLCBscC0+VHhtQnVmZmVyWzFdWzBdKTsKKwlwcmludGsoIlJjdkJ1ZmZlckEgPSAleFxuIiwgbHAtPlJjdkJ1ZmZlclswXVswXSk7CisJcHJpbnRrKCJSY3ZCdWZmZXJCID0gJXhcbiIsIGxwLT5SY3ZCdWZmZXJbMV1bMF0pOworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7IGorKykgeworCQkJcHJpbnRrKCJUeG1CdWZmZXJbJWRdWyVkXSA9ICV4XG4iLCBpLCBqLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KCoodW5zaWduZWQgaW50ICopCisJCQkJCSAgIGxwLT5UeG1CdWZmZXJbaV1bal0pKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFOyBqKyspIHsKKwkJCXByaW50aygiUmN2QnVmZmVyWyVkXVslZF0gPSAleFxuIiwgaSwgaiwKKwkJCSAgICAgICBsZTMyX3RvX2NwdSgqKHVuc2lnbmVkIGludCAqKQorCQkJCQkgICBscC0+UmN2QnVmZmVyW2ldW2pdKSk7CisJCX0KKwl9CisJcHJpbnRrKCJscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSkpOworCXByaW50aygibHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdFN0YXR1czEgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0U3RhdHVzMSkpOworCXByaW50aygibHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSkpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpKTsKKwlwcmludGsoImxwLT5OZXh0VHhtQnVmZmVySW5kZXggPSAleFxuIiwgbHAtPk5leHRUeG1CdWZmZXJJbmRleCk7CisJcHJpbnRrKCJscC0+TmV4dFR4bVBhY2tldEluZGV4ID0gJXhcbiIsIGxwLT5OZXh0VHhtUGFja2V0SW5kZXgpOworCXByaW50aygibHAtPlBlbmRpbmdUeG1CdWZmZXJJbmRleCA9ICV4XG4iLAorCSAgICAgICBscC0+UGVuZGluZ1R4bUJ1ZmZlckluZGV4KTsKKwlwcmludGsoImxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXggPSAleFxuIiwKKwkgICAgICAgbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkxhbkRtYUN0bCkpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1DdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhDdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhDdGwpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeFN0YXR1cyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeFN0YXR1cykpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4Q3RsID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4Q3RsKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhTdGF0dXMgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhTdGF0dXMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQ0FNX0RXT1JEUzsgaSsrKSB7CisJCU9VVEwoaSwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1BZGRyZXNzKTsKKwkJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtRGF0YSA9ICV4XG4iLAorCQkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtRGF0YSkpOworCX0KKwlwcmludGsoImxwLT5zdGF0cy50eF9wYWNrZXRzID0gJWx4XG4iLCBscC0+c3RhdHMudHhfcGFja2V0cyk7CisJcHJpbnRrKCJscC0+c3RhdHMudHhfZXJyb3JzID0gJWx4XG4iLCBscC0+c3RhdHMudHhfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy50eF9maWZvX2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLmNvbGxpc2lvbnMgPSAlbHhcbiIsIGxwLT5zdGF0cy5jb2xsaXNpb25zKTsKKworCXByaW50aygibHAtPnN0YXRzLnJ4X3BhY2tldHMgPSAlbHhcbiIsIGxwLT5zdGF0cy5yeF9wYWNrZXRzKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9lcnJvcnMgPSAlbHhcbiIsIGxwLT5zdGF0cy5yeF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAlbHhcbiIsIGxwLT5zdGF0cy5yeF9kcm9wcGVkKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gJWx4XG4iLCBscC0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyk7CisKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z1BDSU1hc3RlckFkZHIgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdQQ0lNYXN0ZXJBZGRyKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5UeFN0YXRlTWFjaGluZSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4U3RhdGVNYWNoaW5lKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5SeFN0YXRlTWFjaGluZSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4U3RhdGVNYWNoaW5lKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5UeEZpZm9Qb2ludGVycyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4Rmlmb1BvaW50ZXJzKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5SeEZpZm9Qb2ludGVycyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4Rmlmb1BvaW50ZXJzKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5DdGxTdGF0ZU1hY2hpbmUgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+RGVidWdMYW5DdGxTdGF0ZU1hY2hpbmUpKTsKK30KKworc3RhdGljIHZvaWQgbGFuX3NhYTk3MzBfYnVmZmVyX2luaXQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWludCBpLCBqOworCisJLyogSW5pdCBSWCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfUkNWX1FfU0laRTsgaisrKSB7CisJCQkqKHVuc2lnbmVkIGludCAqKSBscC0+UmN2QnVmZmVyW2ldW2pdID0KKwkJCSAgICBjcHVfdG9fbGUzMihSWFNGX1JFQURZIDw8CisJCQkJCVJYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisJCX0KKwl9CisKKwkvKiBJbml0IFRYIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9UWE1fUV9TSVpFOyBqKyspIHsKKwkJCSoodW5zaWduZWQgaW50ICopIGxwLT5UeG1CdWZmZXJbaV1bal0gPQorCQkJICAgIGNwdV90b19sZTMyKFRYU0ZfRU1QVFkgPDwKKwkJCQkJVFhfU1RBVF9DVExfT1dORVJfU0hGKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9hbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwl1bnNpZ25lZCBpbnQgbWVtX3NpemU7CisJdm9pZCAqUGE7CisJdW5zaWduZWQgaW50IGksIGosIFJjdkJ1ZmZlclNpemUsIFR4bUJ1ZmZlclNpemU7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zdGFydDsKKworCS8qIAorCSAqIEFsbG9jYXRlIGFsbCBSWCBhbmQgVFggcGFja2V0cyBpbiBvbmUgY2h1bmsuIAorCSAqIFRoZSBSeCBhbmQgVHggcGFja2V0cyBtdXN0IGJlIFBBQ0tFVF9TSVpFIGFsaWduZWQuCisJICovCisJbWVtX3NpemUgPSAoKExBTl9TQUE5NzMwX1JDVl9RX1NJWkUgKyBMQU5fU0FBOTczMF9UWE1fUV9TSVpFKSAqCisJCSAgICBMQU5fU0FBOTczMF9QQUNLRVRfU0laRSAqIExBTl9TQUE5NzMwX0JVRkZFUlMpICsKKwkgICAgTEFOX1NBQTk3MzBfUEFDS0VUX1NJWkU7CisJYnVmZmVyX3N0YXJ0ID0KKwkgICAgKHVuc2lnbmVkIGludCkga21hbGxvYyhtZW1fc2l6ZSwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCisJaWYgKCFidWZmZXJfc3RhcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogCisJICogU2V0IERNQSBidWZmZXIgdG8ga3NlZzEgKHVuY2FjaGVkKS4KKwkgKiBNYWtlIHN1cmUgdG8gZmx1c2ggYmVmb3JlIHVzaW5nIGl0IHVuY2FjaGVkLgorCSAqLworCVBhID0gKHZvaWQgKikgS1NFRzFBRERSKChidWZmZXJfc3RhcnQgKyBMQU5fU0FBOTczMF9QQUNLRVRfU0laRSkgJgorCQkJCX4oTEFOX1NBQTk3MzBfUEFDS0VUX1NJWkUgLSAxKSk7CisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykgUGEsIG1lbV9zaXplKTsKKworCS8qIEluaXRpYWxpemUgYnVmZmVyIHNwYWNlICovCisJUmN2QnVmZmVyU2l6ZSA9IExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFOworCVR4bUJ1ZmZlclNpemUgPSBMQU5fU0FBOTczMF9QQUNLRVRfU0laRTsKKwlscC0+RG1hUmN2UGFja2V0cyA9IExBTl9TQUE5NzMwX1JDVl9RX1NJWkU7CisJbHAtPkRtYVR4bVBhY2tldHMgPSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFOworCisJLyogSW5pdCBSWCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfUkNWX1FfU0laRTsgaisrKSB7CisJCQkqKHVuc2lnbmVkIGludCAqKSBQYSA9CisJCQkgICAgY3B1X3RvX2xlMzIoUlhTRl9SRUFEWSA8PAorCQkJCQlSWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCQkJbHAtPlJjdkJ1ZmZlcltpXVtqXSA9ICh1bnNpZ25lZCBpbnQpIFBhOworCQkJUGEgKz0gUmN2QnVmZmVyU2l6ZTsKKwkJfQorCX0KKworCS8qIEluaXQgVFggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7IGorKykgeworCQkJKih1bnNpZ25lZCBpbnQgKikgUGEgPQorCQkJICAgIGNwdV90b19sZTMyKFRYU0ZfRU1QVFkgPDwKKwkJCQkJVFhfU1RBVF9DVExfT1dORVJfU0hGKTsKKwkJCWxwLT5UeG1CdWZmZXJbaV1bal0gPSAodW5zaWduZWQgaW50KSBQYTsKKwkJCVBhICs9IFR4bUJ1ZmZlclNpemU7CisJCX0KKwl9CisKKwkvKiAKKwkgKiBTZXQgcnggYnVmZmVyIEEgYW5kIHJ4IGJ1ZmZlciBCIHRvIHBvaW50IHRvIHRoZSBmaXJzdCB0d28gYnVmZmVyIAorCSAqIHNwYWNlcy4KKwkgKi8KKwlPVVRMKFBIWVNBRERSKGxwLT5SY3ZCdWZmZXJbMF1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeEJ1ZmZBKTsKKwlPVVRMKFBIWVNBRERSKGxwLT5SY3ZCdWZmZXJbMV1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeEJ1ZmZCKTsKKworCS8qIEluaXRpYWxpemUgQnVmZmVyIEluZGV4ICovCisJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCA9IDA7CisJbHAtPk5leHRSY3ZUb1VzZUlzQSA9IDE7CisKKwkvKiBTZXQgY3VycmVudCBidWZmZXIgaW5kZXggJiBuZXh0IGF2YWlsYmxlIHBhY2tldCBpbmRleCAqLworCWxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5OZXh0VHhtQnVmZmVySW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXggPSAwOworCisJLyogCisJICogU2V0IHR4bV9idWZfYSBhbmQgdHhtX2J1Zl9iIHRvIHBvaW50IHRvIHRoZSBmaXJzdCB0d28gYnVmZmVyCisJICogc3BhY2UgCisJICovCisJT1VUTChQSFlTQUREUihscC0+VHhtQnVmZmVyWzBdWzBdKSwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhCdWZmQSk7CisJT1VUTChQSFlTQUREUihscC0+VHhtQnVmZmVyWzFdWzBdKSwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhCdWZmQik7CisKKwkvKiBTZXQgcGFja2V0IG51bWJlciAqLworCU9VVEwoKGxwLT5EbWFSY3ZQYWNrZXRzIDw8IFBLX0NPVU5UX1JYX0FfU0hGKSB8CisJICAgICAobHAtPkRtYVJjdlBhY2tldHMgPDwgUEtfQ09VTlRfUlhfQl9TSEYpIHwKKwkgICAgIChscC0+RG1hVHhtUGFja2V0cyA8PCBQS19DT1VOVF9UWF9BX1NIRikgfAorCSAgICAgKGxwLT5EbWFUeG1QYWNrZXRzIDw8IFBLX0NPVU5UX1RYX0JfU0hGKSwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+UGFja2V0Q291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY2FtX2xvYWQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgKk5ldHdvcmtBZGRyZXNzOworCisJTmV0d29ya0FkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKSAmbHAtPlBoeXNpY2FsQWRkcmVzc1swXVswXTsKKworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9DQU1fRFdPUkRTOyBpKyspIHsKKwkJLyogRmlyc3Qgc2V0IGFkZHJlc3MgdG8gd2hlcmUgZGF0YSBpcyB3cml0dGVuICovCisJCU9VVEwoaSwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1BZGRyZXNzKTsKKwkJT1VUTCgoTmV0d29ya0FkZHJlc3NbMF0gPDwgMjQpIHwgKE5ldHdvcmtBZGRyZXNzWzFdIDw8IDE2KQorCQkgICAgIHwgKE5ldHdvcmtBZGRyZXNzWzJdIDw8IDgpIHwgTmV0d29ya0FkZHJlc3NbM10sCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1EYXRhKTsKKwkJTmV0d29ya0FkZHJlc3MgKz0gNDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY2FtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAgPQorCSAgICAoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBpOworCisJLyogQ29weSBNQUMtYWRkcmVzcyBpbnRvIGFsbCBlbnRyaWVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9DQU1fRU5UUklFUzsgaSsrKSB7CisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSBscC0+UGh5c2ljYWxBZGRyZXNzW2ldLAorCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgZGV2LT5kZXZfYWRkciwgNik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfbWlpX2luaXQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWludCBpLCBsOworCisJLyogQ2hlY2sgbGluayBzdGF0dXMsIHNwaW4gaGVyZSB0aWxsIHN0YXRpb24gaXMgbm90IGJ1c3kuICovCisJaSA9IDA7CisJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKSAmIE1EX0NBX0JVU1kpIHsKKwkJaSsrOworCQlpZiAoaSA+IDEwMCkgeworCQkJcHJpbnRrKCJFcnJvcjogbGFuX3NhYTk3MzBfbWlpX2luaXQ6IHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1kZWxheSgxKTsJLyogd2FpdCAxIG1zLiAqLworCX0KKworCS8qIE5vdyBzZXQgdGhlIGNvbnRyb2wgYW5kIGFkZHJlc3MgcmVnaXN0ZXIuICovCisJT1VUTChNRF9DQV9CVVNZIHwgUEhZX1NUQVRVUyB8IFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKTsKKworCS8qIGNoZWNrIGxpbmsgc3RhdHVzLCBzcGluIGhlcmUgdGlsbCBzdGF0aW9uIGlzIG5vdCBidXN5ICovCisJaSA9IDA7CisJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKSAmIE1EX0NBX0JVU1kpIHsKKwkJaSsrOworCQlpZiAoaSA+IDEwMCkgeworCQkJcHJpbnRrKCJFcnJvcjogbGFuX3NhYTk3MzBfbWlpX2luaXQ6IHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1kZWxheSgxKTsJLyogd2FpdCAxIG1zLiAqLworCX0KKworCS8qIFdhaXQgZm9yIDEgbXMuICovCisJbWRlbGF5KDEpOworCisJLyogQ2hlY2sgdGhlIGxpbmsgc3RhdHVzLiAqLworCWlmIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdERhdGEpICYKKwkgICAgUEhZX1NUQVRVU19MSU5LX1VQKSB7CisJCS8qIExpbmsgaXMgdXAuICovCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIExpbmsgaXMgZG93biwgcmVzZXQgdGhlIFBIWSBmaXJzdC4gKi8KKworCQkvKiBzZXQgUEhZIGFkZHJlc3MgPSAnQ09OVFJPTCcgKi8KKwkJT1VUTChQSFlfQUREUkVTUyA8PCBNRF9DQV9QSFlfU0hGIHwgTURfQ0FfV1IgfCBQSFlfQ09OVFJPTCwKKwkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKTsKKworCQkvKiBXYWl0IGZvciAxIG1zLiAqLworCQltZGVsYXkoMSk7CisKKwkJLyogc2V0ICdDT05UUk9MJyA9IGZvcmNlIHJlc2V0IGFuZCByZW5lZ290aWF0ZSAqLworCQlPVVRMKFBIWV9DT05UUk9MX1JFU0VUIHwgUEhZX0NPTlRST0xfQVVUT19ORUcgfAorCQkgICAgIFBIWV9DT05UUk9MX1JFU1RBUlRfQVVUT19ORUcsCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdERhdGEpOworCisJCS8qIFdhaXQgZm9yIDUwIG1zLiAqLworCQltZGVsYXkoNTApOworCisJCS8qIHNldCAnQlVTWScgdG8gc3RhcnQgb3BlcmF0aW9uICovCisJCU9VVEwoTURfQ0FfQlVTWSB8IFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYgfCBNRF9DQV9XUiB8CisJCSAgICAgUEhZX0NPTlRST0wsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpOworCisJCS8qIGF3YWl0IGNvbXBsZXRpb24gKi8KKwkJaSA9IDA7CisJCXdoaWxlIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdEN0bCkgJgorCQkgICAgICAgTURfQ0FfQlVTWSkgeworCQkJaSsrOworCQkJaWYgKGkgPiAxMDApIHsKKwkJCQlwcmludGsKKwkJCQkgICAgKCJFcnJvcjogbGFuX3NhYTk3MzBfbWlpX2luaXQ6IHRpbWVvdXRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW1kZWxheSgxKTsJLyogd2FpdCAxIG1zLiAqLworCQl9CisKKwkJLyogV2FpdCBmb3IgMSBtcy4gKi8KKwkJbWRlbGF5KDEpOworCisJCWZvciAobCA9IDA7IGwgPCAyOyBsKyspIHsKKwkJCS8qIHNldCBQSFkgYWRkcmVzcyA9ICdTVEFUVVMnICovCisJCQlPVVRMKE1EX0NBX0JVU1kgfCBQSFlfQUREUkVTUyA8PCBNRF9DQV9QSFlfU0hGIHwKKwkJCSAgICAgUEhZX1NUQVRVUywKKwkJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdEN0bCk7CisKKwkJCS8qIGF3YWl0IGNvbXBsZXRpb24gKi8KKwkJCWkgPSAwOworCQkJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKSAmCisJCQkgICAgICAgTURfQ0FfQlVTWSkgeworCQkJCWkrKzsKKwkJCQlpZiAoaSA+IDEwMCkgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgiRXJyb3I6IGxhbl9zYWE5NzMwX21paV9pbml0OiB0aW1lb3V0XG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQltZGVsYXkoMSk7CS8qIHdhaXQgMSBtcy4gKi8KKwkJCX0KKworCQkJLyogd2FpdCBmb3IgMyBzZWMuICovCisJCQltZGVsYXkoMzAwMCk7CisKKwkJCS8qIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyAqLworCQkJaWYgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210RGF0YSkgJgorCQkJICAgIFBIWV9TVEFUVVNfTElOS19VUCkgeworCQkJCS8qIGxpbmsgaXMgdXAgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX2NvbnRyb2xfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJLyogSW5pdGlhbGl6ZSBETUEgY29udHJvbCByZWdpc3Rlci4gKi8KKwlPVVRMKChMQU5NQl9BTlkgPDwgRE1BX0NUTF9NQVhfWEZFUl9TSEYpIHwKKwkgICAgIChMQU5FTkRfTElUVExFIDw8IERNQV9DVExfRU5ESUFOX1NIRikgfAorCSAgICAgKExBTl9TQUE5NzMwX1JDVl9RX0lOVF9USFJFU0hPTEQgPDwgRE1BX0NUTF9SWF9JTlRfQ09VTlRfU0hGKQorCSAgICAgfCBETUFfQ1RMX1JYX0lOVF9UT19FTiB8IERNQV9DVExfUlhfSU5UX0VOIHwKKwkgICAgIERNQV9DVExfTUFDX1JYX0lOVF9FTiB8IERNQV9DVExfTUFDX1RYX0lOVF9FTiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKTsKKworCS8qIEluaXRpYWwgTUFDIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJT1VUTCgoTUFDQ01fTUlJIDw8IE1BQ19DT05UUk9MX0NPTk5fU0hGKSB8IE1BQ19DT05UUk9MX0ZVTExfRFVQLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5NYWNDdGwpOworCisJLyogSW5pdGlhbGl6ZSBDQU0gY29udHJvbCByZWdpc3Rlci4gKi8KKwlPVVRMKENBTV9DT05UUk9MX0NPTVBfRU4gfCBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUN0bCk7CisKKwkvKiAKKwkgKiBJbml0aWFsaXplIENBTSBlbmFibGUgcmVnaXN0ZXIsIG9ubHkgdHVybiBvbiBmaXJzdCBlbnRyeSwgc2hvdWxkCisJICogY29udGFpbiBvd24gYWRkci4gCisJICovCisJT1VUTCgweDAwMDEsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtRW5hYmxlKTsKKworCS8qIEluaXRpYWxpemUgVHggY29udHJvbCByZWdpc3RlciAqLworCU9VVEwoVFhfQ1RMX0VOX0NPTVAsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhDdGwpOworCisJLyogSW5pdGlhbGl6ZSBSY3YgY29udHJvbCByZWdpc3RlciAqLworCU9VVEwoUlhfQ1RMX1NUUklQX0NSQywgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeEN0bCk7CisKKwkvKiBSZXNldCBETUEgZW5naW5lICovCisJT1VUTChETUFfVEVTVF9TV19SRVNFVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFUZXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3N0b3Aoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWludCBpOworCisJLyogU3RvcCBETUEgZmlyc3QgKi8KKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkxhbkRtYUN0bCkgJgorCSAgICAgfihETUFfQ1RMX0VOX1RYX0RNQSB8IERNQV9DVExfRU5fUlhfRE1BKSwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKTsKKworCS8qIFNldCB0aGUgU1cgUmVzZXQgYml0cyBpbiBETUEgYW5kIE1BQyBjb250cm9sIHJlZ2lzdGVycyAqLworCU9VVEwoRE1BX1RFU1RfU1dfUkVTRVQsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+RG1hVGVzdCk7CisJT1VUTChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5NYWNDdGwpIHwgTUFDX0NPTlRST0xfUkVTRVQsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCk7CisKKwkvKiAKKwkgKiBXYWl0IGZvciBNQUMgcmVzZXQgdG8gaGF2ZSBmaW5pc2hlZC4gVGhlIHJlc2V0IGJpdCBpcyBhdXRvIGNsZWFyZWQKKwkgKiB3aGVuIHRoZSByZXNldCBpcyBkb25lLgorCSAqLworCWkgPSAwOworCXdoaWxlIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5NYWNDdGwpICYgTUFDX0NPTlRST0xfUkVTRVQpIHsKKwkJaSsrOworCQlpZiAoaSA+IDEwMCkgeworCQkJcHJpbnRrCisJCQkgICAgKCJFcnJvcjogbGFuX3NhOTczMF9zdG9wOiBNQUMgcmVzZXQgdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfZG1hX2luaXQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCS8qIFN0b3AgbGFuIGNvbnRyb2xsZXIuICovCisJbGFuX3NhYTk3MzBfc3RvcChscCk7CisKKwlPVVRMKExBTl9TQUE5NzMwX0RFRkFVTFRfVElNRV9PVVRfQ05ULAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UaW1lb3V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3N0YXJ0KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlsYW5fc2FhOTczMF9idWZmZXJfaW5pdChscCk7CisKKwkvKiBJbml0aWFsaXplIFJ4IEJ1ZmZlciBJbmRleCAqLworCWxwLT5OZXh0UmN2UGFja2V0SW5kZXggPSAwOworCWxwLT5OZXh0UmN2VG9Vc2VJc0EgPSAxOworCisJLyogU2V0IGN1cnJlbnQgYnVmZmVyIGluZGV4ICYgbmV4dCBhdmFpbGJsZSBwYWNrZXQgaW5kZXggKi8KKwlscC0+TmV4dFR4bVBhY2tldEluZGV4ID0gMDsKKwlscC0+TmV4dFR4bUJ1ZmZlckluZGV4ID0gMDsKKwlscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4ID0gMDsKKwlscC0+UGVuZGluZ1R4bUJ1ZmZlckluZGV4ID0gMDsKKworCU9VVEwoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKSB8IERNQV9DVExfRU5fVFhfRE1BIHwKKwkgICAgIERNQV9DVExfRU5fUlhfRE1BLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkxhbkRtYUN0bCk7CisKKwkvKiBGb3IgVHgsIHR1cm4gb24gTUFDIHRoZW4gRE1BICovCisJT1VUTChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCkgfCBUWF9DVExfVFhfRU4sCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4Q3RsKTsKKworCS8qIEZvciBSeCwgdHVybiBvbiBETUEgdGhlbiBNQUMgKi8KKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4Q3RsKSB8IFJYX0NUTF9SWF9FTiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwpOworCisJLyogU2V0IE9rMlVzZSB0byBsZXQgaGFyZHdhcmUgb3ducyB0aGUgYnVmZmVycyAqLworCU9VVEwoT0syVVNFX1JYX0EgfCBPSzJVU0VfUlhfQiB8IE9LMlVTRV9UWF9BIHwgT0syVVNFX1RYX0IsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9yZXN0YXJ0KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlsYW5fc2FhOTczMF9zdG9wKGxwKTsKKwlsYW5fc2FhOTczMF9zdGFydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50ICpwUGFja2V0OworCXVuc2lnbmVkIGludCB0eF9zdGF0dXM7CisKKwlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA1KQorCQlwcmludGsoImxhbl9zYWE5NzMwX3R4IGludGVycnVwdFxuIik7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQuICovCisJT1VUTChETUFfU1RBVFVTX01BQ19UWF9JTlQsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+RG1hU3RhdHVzKTsKKworCXdoaWxlICgxKSB7CisJCXBQYWNrZXQgPQorCQkgICAgKHVuc2lnbmVkIGludCAqKSBscC0+VHhtQnVmZmVyW2xwLT4KKwkJCQkJCSAgIFBlbmRpbmdUeG1CdWZmZXJJbmRleF0KKwkJICAgIFtscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4XTsKKworCQkvKiBHZXQgc3RhdHVzIG9mIGZpcnN0IHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwkJdHhfc3RhdHVzID0gbGUzMl90b19jcHUoKnBQYWNrZXQpOworCisJCS8qIENoZWNrIG93bmVyc2hpcC4gKi8KKwkJaWYgKCh0eF9zdGF0dXMgJiBUWF9TVEFUX0NUTF9PV05FUl9NU0spICE9CisJCSAgICAoVFhTRl9IV0RPTkUgPDwgVFhfU1RBVF9DVExfT1dORVJfU0hGKSkgYnJlYWs7CisKKwkJLyogQ2hlY2sgZm9yIGVycm9yLiAqLworCQlpZiAodHhfc3RhdHVzICYgVFhfU1RBVF9DVExfRVJST1JfTVNLKSB7CisJCQlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiAxKQorCQkJCXByaW50aygibGFuX3NhYTk3MzBfdHg6IHR4IGVycm9yID0gJXhcbiIsCisJCQkJICAgICAgIHR4X3N0YXR1cyk7CisKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJgorCQkJICAgIChUWF9TVEFUVVNfRVhfQ09MTCA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX0xBVEVfQ09MTCA8PAorCQkJICAgICBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkgbHAtPnN0YXRzLgorCSAgICAgdHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmCisJCQkgICAgKFRYX1NUQVRVU19MX0NBUlIgPDwgVFhfU1RBVF9DVExfU1RBVFVTX1NIRikpCisJCQkJICAgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmCisJCQkgICAgKFRYX1NUQVRVU19VTkRFUiA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX1NRX0VSUiA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0KKwkJCSAgICB0eF9zdGF0dXMgJiBUWF9TVEFUVVNfVFhfQ09MTF9NU0s7CisJCX0KKworCQkvKiBGcmVlIGJ1ZmZlci4gKi8KKwkJKnBQYWNrZXQgPQorCQkgICAgY3B1X3RvX2xlMzIoVFhTRl9FTVBUWSA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCisJCS8qIFVwZGF0ZSBwZW5kaW5nIGluZGV4IHBvaW50ZXIuICovCisJCWxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXgrKzsKKwkJaWYgKGxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXggPj0gTEFOX1NBQTk3MzBfVFhNX1FfU0laRSkgeworCQkJbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA9IDA7CisJCQlscC0+UGVuZGluZ1R4bUJ1ZmZlckluZGV4IF49IDE7CisJCX0KKwl9CisKKwkvKiBNYWtlIHN1cmUgQSBhbmQgQiBhcmUgYXZhaWxhYmxlIHRvIGhhcmR3YXJlLiAqLworCU9VVEwoT0syVVNFX1RYX0EgfCBPSzJVU0VfVFhfQiwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkvKiBUaGUgdHggYnVmZmVyIGlzIG5vIGxvbmdlciBmdWxsLiAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAgPQorCSAgICAoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWludCBsZW4gPSAwOworCXN0cnVjdCBza19idWZmICpza2IgPSAwOworCXVuc2lnbmVkIGludCByeF9zdGF0dXM7CisJaW50IEJ1ZmZlckluZGV4OworCWludCBQYWNrZXRJbmRleDsKKwl1bnNpZ25lZCBpbnQgKnBQYWNrZXQ7CisJdW5zaWduZWQgY2hhciAqcERhdGE7CisKKwlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA1KQorCQlwcmludGsoImxhbl9zYWE5NzMwX3J4IGludGVycnVwdFxuIik7CisKKwkvKiBDbGVhciByZWNlaXZlIGludGVycnVwdHMuICovCisJT1VUTChETUFfU1RBVFVTX01BQ19SWF9JTlQgfCBETUFfU1RBVFVTX1JYX0lOVCB8CisJICAgICBETUFfU1RBVFVTX1JYX1RPX0lOVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpOworCisJLyogQWRkcmVzcyBuZXh0IHBhY2tldCAqLworCWlmIChscC0+TmV4dFJjdlRvVXNlSXNBKQorCQlCdWZmZXJJbmRleCA9IDA7CisJZWxzZQorCQlCdWZmZXJJbmRleCA9IDE7CisJUGFja2V0SW5kZXggPSBscC0+TmV4dFJjdlBhY2tldEluZGV4OworCXBQYWNrZXQgPSAodW5zaWduZWQgaW50ICopIGxwLT5SY3ZCdWZmZXJbQnVmZmVySW5kZXhdW1BhY2tldEluZGV4XTsKKwlyeF9zdGF0dXMgPSBsZTMyX3RvX2NwdSgqcFBhY2tldCk7CisKKwkvKiBQcm9jZXNzIGVhY2ggcGFja2V0LiAqLworCXdoaWxlICgocnhfc3RhdHVzICYgUlhfU1RBVF9DVExfT1dORVJfTVNLKSA9PQorCSAgICAgICAoUlhTRl9IV0RPTkUgPDwgUlhfU1RBVF9DVExfT1dORVJfU0hGKSkgeworCQkvKiBDaGVjayB0aGUgcnggc3RhdHVzLiAqLworCQlpZiAocnhfc3RhdHVzICYgKFJYX1NUQVRVU19HT09EIDw8IFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKSB7CisJCQkvKiBSZWNlaXZlZCBwYWNrZXQgaXMgZ29vZC4gKi8KKwkJCWxlbiA9IChyeF9zdGF0dXMgJiBSWF9TVEFUX0NUTF9MRU5HVEhfTVNLKSA+PgorCQkJICAgIFJYX1NUQVRfQ1RMX0xFTkdUSF9TSEY7CisKKwkJCXBEYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcFBhY2tldDsKKwkJCXBEYXRhICs9IDQ7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCQkJaWYgKHNrYiA9PSAwKSB7CisJCQkJcHJpbnRrCisJCQkJICAgICgiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0gZWxzZSB7CisJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsJLyogbWFrZSByb29tICovCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCQkgKHVuc2lnbmVkIGNoYXIgKikgcERhdGEsCisJCQkJCQkgbGVuLCAwKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGdvdCBhbiBlcnJvciBwYWNrZXQuICovCisJCQlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiAyKQorCQkJCXByaW50aworCQkJCSAgICAoImxhbl9zYWE5NzMwX3J4OiBXZSBnb3QgYW4gZXJyb3IgcGFja2V0ID0gJXhcbiIsCisJCQkJICAgICByeF9zdGF0dXMpOworCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYKKwkJCSAgICAoUlhfU1RBVFVTX0NSQ19FUlIgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpCisJCQkJICAgIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYKKwkJCSAgICAoUlhfU1RBVFVTX0FMSUdOX0VSUiA8PAorCQkJICAgICBSWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkgbHAtPnN0YXRzLgorCSAgICAgcnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYKKwkJCSAgICAoUlhfU1RBVFVTX09WRVJGTE9XIDw8IFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfTE9OR19FUlIgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpCisJCQkJICAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKworCQkvKiBJbmRpY2F0ZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgYnVmZmVyLiAqLworCQkqcFBhY2tldCA9CisJCSAgICBjcHVfdG9fbGUzMihSWFNGX1JFQURZIDw8IFJYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisKKwkJLyogR28gdG8gbmV4dCBwYWNrZXQgaW4gc2VxdWVuY2UuICovCisJCWxwLT5OZXh0UmN2UGFja2V0SW5kZXgrKzsKKwkJaWYgKGxwLT5OZXh0UmN2UGFja2V0SW5kZXggPj0gTEFOX1NBQTk3MzBfUkNWX1FfU0laRSkgeworCQkJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCA9IDA7CisJCQlpZiAoQnVmZmVySW5kZXgpIHsKKwkJCQlscC0+TmV4dFJjdlRvVXNlSXNBID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJbHAtPk5leHRSY3ZUb1VzZUlzQSA9IDA7CisJCQl9CisJCX0KKwkJT1VUTChPSzJVU0VfUlhfQSB8IE9LMlVTRV9SWF9CLAorCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlKTsKKworCQkvKiBBZGRyZXNzIG5leHQgcGFja2V0ICovCisJCWlmIChscC0+TmV4dFJjdlRvVXNlSXNBKQorCQkJQnVmZmVySW5kZXggPSAwOworCQllbHNlCisJCQlCdWZmZXJJbmRleCA9IDE7CisJCVBhY2tldEluZGV4ID0gbHAtPk5leHRSY3ZQYWNrZXRJbmRleDsKKwkJcFBhY2tldCA9CisJCSAgICAodW5zaWduZWQgaW50ICopIGxwLT4KKwkJICAgIFJjdkJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdOworCQlyeF9zdGF0dXMgPSBsZTMyX3RvX2NwdSgqcFBhY2tldCk7CisJfQorCisJLyogTWFrZSBzdXJlIEEgYW5kIEIgYXJlIGF2YWlsYWJsZSB0byBoYXJkd2FyZS4gKi8KKwlPVVRMKE9LMlVTRV9SWF9BIHwgT0syVVNFX1JYX0IsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGFuX3NhYTk3MzBfaW50ZXJydXB0KGNvbnN0IGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA1KQorCQlwcmludGsoImxhbl9zYWE5NzMwX2ludGVycnVwdFxuIik7CisKKwkvKiBEaXNhYmxlIHRoZSBFVk0gTEFOIGludGVycnVwdC4gKi8KKwlldm1fc2FhOTczMF9ibG9ja19sYW5faW50KGxwKTsKKworCS8qIENsZWFyIHRoZSBFVk0gTEFOIGludGVycnVwdC4gKi8KKwlldm1fc2FhOTczMF9jbGVhcl9sYW5faW50KGxwKTsKKworCS8qIFNlcnZpY2UgcGVuZGluZyB0cmFuc21pdCBpbnRlcnJ1cHRzLiAqLworCWlmIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpICYgRE1BX1NUQVRVU19NQUNfVFhfSU5UKQorCQlsYW5fc2FhOTczMF90eChkZXYpOworCisJLyogU2VydmljZSBwZW5kaW5nIHJlY2VpdmUgaW50ZXJydXB0cy4gKi8KKwlpZiAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+RG1hU3RhdHVzKSAmCisJICAgIChETUFfU1RBVFVTX01BQ19SWF9JTlQgfCBETUFfU1RBVFVTX1JYX0lOVCB8CisJICAgICBETUFfU1RBVFVTX1JYX1RPX0lOVCkpIGxhbl9zYWE5NzMwX3J4KGRldik7CisKKwkvKiBFbmFibGUgdGhlIEVWTSBMQU4gaW50ZXJydXB0LiAqLworCWV2bV9zYWE5NzMwX3VuYmxvY2tfbGFuX2ludChscCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfb3Blbl9mYWlsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwkvKiBBc3NvY2lhdGUgSVJRIHdpdGggbGFuX3NhYTk3MzBfaW50ZXJydXB0ICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbGFuX3NhYTk3MzBfaW50ZXJydXB0LCAwLCAiU0FBOTczMCBFdGgiLAorCQkJZGV2KSkgeworCQlwcmludGsoImxhbl9zYWE5NzMwX29wZW46IENhbid0IGdldCBpcnEgJWRcbiIsIGRldi0+aXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogRW5hYmxlIHRoZSBMYW4gaW50ZXJydXB0IGluIHRoZSBldmVudCBtYW5hZ2VyLiAqLworCWV2bV9zYWE5NzMwX2VuYWJsZV9sYW5faW50KGxwKTsKKworCS8qIFN0YXJ0IHRoZSBMQU4gY29udHJvbGxlciAqLworCWlmIChsYW5fc2FhOTczMF9zdGFydChscCkpCisJCXJldHVybiAtMTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF93cml0ZShzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBza2JsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcGJEYXRhID0gc2tiLT5kYXRhOworCXVuc2lnbmVkIGludCBsZW4gPSBza2JsZW47CisJdW5zaWduZWQgY2hhciAqcGJQYWNrZXREYXRhOworCXVuc2lnbmVkIGludCB0eF9zdGF0dXM7CisJaW50IEJ1ZmZlckluZGV4OworCWludCBQYWNrZXRJbmRleDsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfd3JpdGU6IHNrYj0lMDh4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludCkgc2tiKTsKKworCUJ1ZmZlckluZGV4ID0gbHAtPk5leHRUeG1CdWZmZXJJbmRleDsKKwlQYWNrZXRJbmRleCA9IGxwLT5OZXh0VHhtUGFja2V0SW5kZXg7CisKKwl0eF9zdGF0dXMgPQorCSAgICBsZTMyX3RvX2NwdSgqKHVuc2lnbmVkIGludCAqKSBscC0+CisJCQlUeG1CdWZmZXJbQnVmZmVySW5kZXhdW1BhY2tldEluZGV4XSk7CisJaWYgKCh0eF9zdGF0dXMgJiBUWF9TVEFUX0NUTF9PV05FUl9NU0spICE9CisJICAgIChUWFNGX0VNUFRZIDw8IFRYX1NUQVRfQ1RMX09XTkVSX1NIRikpIHsKKwkJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gNCkKKwkJCXByaW50aworCQkJICAgICgibGFuX3NhYTk3MzBfd3JpdGU6IFR4IGJ1ZmZlciBub3QgYXZhaWxhYmxlOiB0eF9zdGF0dXMgPSAleFxuIiwKKwkJCSAgICAgdHhfc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxwLT5OZXh0VHhtUGFja2V0SW5kZXgrKzsKKwlpZiAobHAtPk5leHRUeG1QYWNrZXRJbmRleCA+PSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFKSB7CisJCWxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAwOworCQlscC0+TmV4dFR4bUJ1ZmZlckluZGV4IF49IDE7CisJfQorCisJcGJQYWNrZXREYXRhID0KKwkgICAgKHVuc2lnbmVkIGNoYXIgKikgbHAtPlR4bUJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdOworCXBiUGFja2V0RGF0YSArPSA0OworCisJLyogY29weSB0aGUgYml0cyAqLworCW1lbWNweShwYlBhY2tldERhdGEsIHBiRGF0YSwgbGVuKTsKKworCS8qIFNldCB0cmFuc21pdCBzdGF0dXMgZm9yIGhhcmR3YXJlICovCisJKih1bnNpZ25lZCBpbnQgKikgbHAtPlR4bUJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdID0KKwkgICAgY3B1X3RvX2xlMzIoKFRYU0ZfUkVBRFkgPDwgVFhfU1RBVF9DVExfT1dORVJfU0hGKSB8CisJCQkoVFhfU1RBVF9DVExfSU5UX0FGVEVSX1RYIDw8IFRYX1NUQVRfQ1RMX0ZSQU1FX1NIRikKKwkJCXwgKGxlbiA8PCBUWF9TVEFUX0NUTF9MRU5HVEhfU0hGKSk7CisKKwkvKiBTZXQgaGFyZHdhcmUgdHggYnVmZmVyLiAqLworCU9VVEwoT0syVVNFX1RYX0EgfCBPSzJVU0VfVFhfQiwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxhbl9zYWE5NzMwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAgPQorCSAgICAoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJLyogVHJhbnNtaXR0ZXIgdGltZW91dCwgc2VyaW91cyBwcm9ibGVtcyAqLworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0XG4iLCBkZXYtPm5hbWUpOworCS8qc2hvd19zYWE5NzMwX3JlZ3MobHApOyAqLworCWxhbl9zYWE5NzMwX3Jlc3RhcnQobHApOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc2tibGVuOworCWludCBsZW47CisKKwlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA0KQorCQlwcmludGsoIlNlbmQgcGFja2V0OiBza2I9JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgc2tiKTsKKworCXNrYmxlbiA9IHNrYi0+bGVuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlsZW4gPSAoc2tibGVuIDw9IEVUSF9aTEVOKSA/IEVUSF9aTEVOIDogc2tibGVuOworCisJaWYgKGxhbl9zYWE5NzMwX3dyaXRlKGxwLCBza2IsIHNrYmxlbikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKCJFcnJvciB3aGVuIHdyaXRpbmcgcGFja2V0IHRvIGNvbnRyb2xsZXI6IHNrYj0lMDh4XG4iLAorCQkgICAgICh1bnNpZ25lZCBpbnQpIHNrYik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDEpCisJCXByaW50aygibGFuX3NhYTk3MzBfY2xvc2U6XG4iKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIERpc2FibGUgdGhlIExhbiBpbnRlcnJ1cHQgaW4gdGhlIGV2ZW50IG1hbmFnZXIuICovCisJZXZtX3NhYTk3MzBfZGlzYWJsZV9sYW5faW50KGxwKTsKKworCS8qIFN0b3AgdGhlIGNvbnRyb2xsZXIgKi8KKwlpZiAobGFuX3NhYTk3MzBfc3RvcChscCkpCisJCXJldHVybiAtMTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCAodm9pZCAqKSBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuX3NhYTk3MzBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgbGFuX3NhYTk3MzBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwkvKiBTdG9wIHRoZSBjb250cm9sbGVyICovCisJbGFuX3NhYTk3MzBfc3RvcChscCk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIGFjY2VwdCBhbGwgcGFja2V0cyAqLworCQlPVVRMKENBTV9DT05UUk9MX0NPTVBfRU4gfCBDQU1fQ09OVFJPTF9TVEFUSU9OX0FDQyB8CisJCSAgICAgQ0FNX0NPTlRST0xfR1JPVVBfQUNDIHwgQ0FNX0NPTlRST0xfQlJPQURfQUNDLAorCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKTsKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJLyogYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworCQkJT1VUTChDQU1fQ09OVFJPTF9DT01QX0VOIHwgQ0FNX0NPTlRST0xfR1JPVVBfQUNDIHwKKwkJCSAgICAgQ0FNX0NPTlRST0xfQlJPQURfQUNDLAorCQkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUN0bCk7CisJCX0gZWxzZSB7CisJCQkvKiAKKwkJCSAqIFdpbGwgaGFuZGxlIHRoZSBtdWx0aWNhc3Qgc3R1ZmYgbGF0ZXIuIC1jYXJzdGVubAorCQkJICovCisJCX0KKwl9CisKKwlsYW5fc2FhOTczMF9yZXN0YXJ0KGxwKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2FhOTczMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisgICAgICAgIGlmIChkZXYpIHsKKyAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCWlmIChkZXYtPnByaXYpCisJCQlrZnJlZShkZXYtPnByaXYpOworCisgICAgICAgICAgICAgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyAgICAgICAgICAgICAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyAgICAgICAgICAgICAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgICAgIH0KK30KKworCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHA7CisJdW5zaWduZWQgY2hhciBldGhlcm5ldF9hZGRyWzZdOworCWludCByZXQgPSAwOworCisJZGV2LT5vcGVuID0gbGFuX3NhYTk3MzBfb3Blbl9mYWlsOworCisJaWYgKGdldF9ldGhlcm5ldF9hZGRyKGV0aGVybmV0X2FkZHIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgZXRoZXJuZXRfYWRkciwgNik7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJCisJLyogCisJICogTWFrZSBjZXJ0YWluIHRoZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgY29udHJvbGxlciBhcmUgYWxpZ25lZCAKKwkgKiBhbmQgRE1BYmxlLiAKKwkgKi8KKwkvKgorCSAqICBYWFg6IHRoYXQgaXMgb2J2aW91c2x5IGJyb2tlbiAtIGtmcmVlKCkgd29uJ3QgYmUgaGFwcHkgd2l0aCB1cy4KKwkgKi8KKwlscCA9IChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSAoKCh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICBrbWFsbG9jKHNpemVvZigqbHApICsgNywKKwkJCQkJCSAgICAgIEdGUF9ETUEgfCBHRlBfS0VSTkVMKQorCQkJCQkgICAgICArIDcpICYgfjcpOworCisJaWYgKCFscCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPnByaXYgPSBscDsKKwltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKworCS8qIFNldCBTQUE5NzMwIExBTiBiYXNlIGFkZHJlc3MuICovCisJbHAtPmxhbl9zYWE5NzMwX3JlZ3MgPSAodF9sYW5fc2FhOTczMF9yZWdtYXAgKikgKGlvYWRkciArCisJCQkJCQkJIFNBQTk3MzBfTEFOX1JFR1NfQUREUik7CisKKwkvKiBTZXQgU0FBOTczMCBFVk0gYmFzZSBhZGRyZXNzLiAqLworCWxwLT5ldm1fc2FhOTczMF9yZWdzID0gKHRfZXZtX3NhYTk3MzBfcmVnbWFwICopIChpb2FkZHIgKworCQkJCQkJCSBTQUE5NzMwX0VWTV9SRUdTX0FERFIpOworCisJLyogQWxsb2NhdGUgTEFOIFJYL1RYIGZyYW1lIGJ1ZmZlciBzcGFjZS4gKi8KKwkvKiBGSVhNRTogYSBsZWFrICovCisJaWYgKChyZXQgPSBsYW5fc2FhOTczMF9hbGxvY2F0ZV9idWZmZXJzKGxwKSkpCisJCWdvdG8gb3V0OworCisJLyogU3RvcCBMQU4gY29udHJvbGxlci4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX3N0b3AobHApKSkgCisJCWdvdG8gb3V0OworCQorCS8qIEluaXRpYWxpemUgQ0FNIHJlZ2lzdGVycy4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2NhbV9pbml0KGRldikpKQorCQlnb3RvIG91dDsKKworCS8qIEluaXRpYWxpemUgTUlJIHJlZ2lzdGVycy4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX21paV9pbml0KGxwKSkpCisJCWdvdG8gb3V0OworCisJLyogSW5pdGlhbGl6ZSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2NvbnRyb2xfaW5pdChscCkpKSAKKwkJZ290byBvdXQ7CisgICAgICAgIAorCS8qIExvYWQgQ0FNIHJlZ2lzdGVycy4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2NhbV9sb2FkKGxwKSkpIAorCQlnb3RvIG91dDsKKwkKKwkvKiBJbml0aWFsaXplIERNQSBjb250ZXh0IHJlZ2lzdGVycy4gKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2RtYV9pbml0KGxwKSkpCisJCWdvdG8gb3V0OworCQorCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJCQorCWRldi0+b3BlbiA9IGxhbl9zYWE5NzMwX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBsYW5fc2FhOTczMF9zdGFydF94bWl0OworCWRldi0+c3RvcCA9IGxhbl9zYWE5NzMwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gbGFuX3NhYTk3MzBfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbGFuX3NhYTk3MzBfc2V0X211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBsYW5fc2FhOTczMF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAoSFogPj4gMSk7CisJZGV2LT5kbWEgPSAwOworCQorCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworCisgb3V0OgorCWlmIChkZXYtPnByaXYpCisJCWtmcmVlKGRldi0+cHJpdik7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYWE5NzMwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50IHBjaV9pb2FkZHI7CisJaW50IGVycjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDEpCisJCXByaW50aygic2FhOTczMC5jOiBQQ0kgYmlvcyBpcyBwcmVzZW50LCBjaGVja2luZyBmb3IgZGV2aWNlcy4uLlxuIik7CisKKwllcnIgPSAtRU5PTUVNOworCWRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UsIGFib3J0aW5nLlxuIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQxOworICAgICAgICB9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBvdXQyOworCX0KKworCXBjaV9pcnFfbGluZSA9IHBkZXYtPmlycTsKKwkvKiBMQU4gYmFzZSBhZGRyZXNzIGluIGxvY2F0ZWQgYXQgQkFSIDEuICovCisKKwlwY2lfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcHJpbnRrKCJGb3VuZCBTQUE5NzMwIChQQ0kpIGF0ICUjeCwgaXJxICVkLlxuIiwKKwkgICAgICAgcGNpX2lvYWRkciwgcGNpX2lycV9saW5lKTsKKworCWVyciA9IGxhbl9zYWE5NzMwX2luaXQoZGV2LCBwY2lfaW9hZGRyLCBwY2lfaXJxX2xpbmUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKCJMYW4gaW5pdCBmYWlsZWQiKTsKKwkJZ290byBvdXQyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJcmV0dXJuIDA7CisJCitvdXQyOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDE6CisJZnJlZV9uZXRkZXYoZGV2KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzYWE5NzMwX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlICAgICAgID0gc2FhOTczMF9wY2lfdGJsLAorCS5wcm9iZSAgICAgICAgICA9IHNhYTk3MzBfaW5pdF9vbmUsCisJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3Aoc2FhOTczMF9yZW1vdmVfb25lKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgc2FhOTczMF9pbml0KHZvaWQpCit7CisgICAgICAgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNhYTk3MzBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhYTk3MzBfY2xlYW51cCh2b2lkKQoreworICAgICAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhYTk3MzBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2FhOTczMF9pbml0KTsKK21vZHVsZV9leGl0KHNhYTk3MzBfY2xlYW51cCk7CisKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYWE5NzMwLmggYi9kcml2ZXJzL25ldC9zYWE5NzMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZGE2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuaApAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqIFNBQTk3MzAgZXRoZXJuZXQgZHJpdmVyIGRlc2NyaXB0aW9uLgorICoKKyAqLworI2lmbmRlZiBfU0FBOTczMF9ICisjZGVmaW5lIF9TQUE5NzMwX0gKKworCisvKiBOdW1iZXIgb2YgNi1ieXRlIGVudHJpZXMgaW4gdGhlIENBTS4gKi8KKyNkZWZpbmUgTEFOX1NBQTk3MzBfQ0FNX0VOVFJJRVMgICAgICAgICAgICAgIDEwCisjZGVmaW5lCUxBTl9TQUE5NzMwX0NBTV9EV09SRFMgICAgICAgICAgICAgICAoKExBTl9TQUE5NzMwX0NBTV9FTlRSSUVTKjYpLzQpCisKKy8qIFRYIGFuZCBSWCBwYWNrZXQgc2l6ZTogZml4ZWQgdG8gMjA0OCBieXRlcywgYWNjb3JkaW5nIHRvIEhXIHJlcXVpcmVtZW50cy4gKi8KKyNkZWZpbmUgTEFOX1NBQTk3MzBfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIDIwNDgKKworLyogCisgKiBOdW1iZXIgb2YgVFggYnVmZmVycyA9IG51bWJlciBvZiBSWCBidWZmZXJzID0gMiwgd2hpY2ggaXMgZml4ZWQgYWNjb3JkaW5nIAorICogdG8gSFcgcmVxdWlyZW1lbnRzLiAKKyAqLworI2RlZmluZSBMQU5fU0FBOTczMF9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBOdW1iZXIgb2YgUlggcGFja2V0cyBwZXIgUlggYnVmZmVyLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogTnVtYmVyIG9mIFRYIHBhY2tldHMgcGVyIFRYIGJ1ZmZlci4gKi8KKyNkZWZpbmUgTEFOX1NBQTk3MzBfVFhNX1FfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qCisgKiBXZSBnZXQgYW4gaW50ZXJydXB0IGZvciBlYWNoIExBTl9TQUE5NzMwX0RFRkFVTFRfUkNWX1FfSU5UX1RIUkVTSE9MRCAKKyAqIHBhY2tldHMgcmVjZWl2ZWQuIAorICogSWYgaG93ZXZlciB3ZSByZWNlaXZlIGxlc3MgdGhhbiAgTEFOX1NBQTk3MzBfREVGQVVMVF9SQ1ZfUV9JTlRfVEhSRVNIT0xECisgKiBwYWNrZXRzLCB0aGUgaGFyZHdhcmUgY2FuIHRpbWVvdXQgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUgYW5kIHN0aWxsIHRlbGwgCisgKiB1cyBwYWNrZXRzIGhhdmUgYXJyaXZlZC4KKyAqIFRoZSB0aW1lb3V0IHZhbHVlIGluIHVuaXQgb2YgMzIgUENJIGNsb2NrcyAoMzNNaHopLgorICogVGhlIHZhbHVlIDIwMCBhcHByb3hpbWF0ZXMgMC4wMDAyIHNlY29uZHMuCisgKi8KKyNkZWZpbmUgTEFOX1NBQTk3MzBfUkNWX1FfSU5UX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEFOX1NBQTk3MzBfREVGQVVMVF9USU1FX09VVF9DTlQgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgUlhTRl9ORElTICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJYU0ZfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSWFNGX0hXRE9ORSAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBUWFNGX0VNUFRZICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFhTRl9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRYU0ZfSFdET05FICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIExBTkVORF9MSVRUTEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMQU5FTkRfQklHXzIxNDMgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEFORU5EX0JJR180MzIxICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTEFOTUJfQU5ZICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExBTk1CXzggICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMQU5NQl8zMiAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEFOTUJfNjQgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgTUFDQ01fQVVUT01BVElDICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BQ0NNXzEwTUIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNQUNDTV9NSUkgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyogCisgKiBQSFkgZGVmaW5pdGlvbnMgZm9yIEJhc2ljIHJlZ2lzdGVycyBvZiBRUzY2MTIgKHVzZWQgb24gTUlQUyBBVExBUyBib2FyZCkgCisgKi8KKyNkZWZpbmUgUEhZX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUEhZX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUEhZX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgUEhZX0NPTlRST0xfUkVTRVQgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUEhZX0NPTlRST0xfQVVUT19ORUcgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUEhZX0NPTlRST0xfUkVTVEFSVF9BVVRPX05FRyAgICAweDAyMDAKKyNkZWZpbmUgUEhZX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAweDAKKworLyogUEtfQ09VTlQgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBLX0NPVU5UX1RYX0FfU0hGICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgUEtfQ09VTlRfVFhfQV9NU0sgICAgICAgICAgICAgICAoMHhmZiA8PCBQS19DT1VOVF9UWF9BX1NIRikKKyNkZWZpbmUgUEtfQ09VTlRfVFhfQl9TSEYgICAgICAgICAgICAgICAxNgorI2RlZmluZSBQS19DT1VOVF9UWF9CX01TSyAgICAgICAgICAgICAgICgweGZmIDw8IFBLX0NPVU5UX1RYX0JfU0hGKQorI2RlZmluZSBQS19DT1VOVF9SWF9BX1NIRiAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUEtfQ09VTlRfUlhfQV9NU0sgICAgICAgICAgICAgICAoMHhmZiA8PCBQS19DT1VOVF9SWF9BX1NIRikKKyNkZWZpbmUgUEtfQ09VTlRfUlhfQl9TSEYgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLX0NPVU5UX1JYX0JfTVNLICAgICAgICAgICAgICAgKDB4ZmYgPDwgUEtfQ09VTlRfUlhfQl9TSEYpCisKKy8qIE9LMlVTRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgT0syVVNFX1RYX0EgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgT0syVVNFX1RYX0IgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgT0syVVNFX1JYX0EgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgT0syVVNFX1JYX0IgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogTEFOIERNQSBDT05UUk9MIHJlZ2lzdGVyLiAqLworI2RlZmluZSBETUFfQ1RMX0JMS19JTlQgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRE1BX0NUTF9NQVhfWEZFUl9TSEYgICAgICAgICAgICAxOAorI2RlZmluZSBETUFfQ1RMX01BWF9YRkVSX01TSyAgICAgICAgICAgICgweDMgPDwgTEFOX0RNQV9DVExfTUFYX1hGRVJfU0hGKQorI2RlZmluZSBETUFfQ1RMX0VORElBTl9TSEYgICAgICAgICAgICAgIDE2CisjZGVmaW5lIERNQV9DVExfRU5ESUFOX01TSyAgICAgICAgICAgICAgKDB4MyA8PCBMQU5fRE1BX0NUTF9FTkRJQU5fU0hGKQorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9DT1VOVF9TSEYgICAgICAgIDgKKyNkZWZpbmUgRE1BX0NUTF9SWF9JTlRfQ09VTlRfTVNLICAgICAgICAoMHhmZiA8PCBMQU5fRE1BX0NUTF9SWF9JTlRfQ09VTlRfU0hGKQorI2RlZmluZSBETUFfQ1RMX0VOX1RYX0RNQSAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRE1BX0NUTF9FTl9SWF9ETUEgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIERNQV9DVExfUlhfSU5UX0JVRkZVTF9FTiAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9UT19FTiAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRE1BX0NUTF9SWF9JTlRfRU4gICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9DVExfVFhfSU5UX0VOICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBETUFfQ1RMX01BQ19UWF9JTlRfRU4gICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRE1BX0NUTF9NQUNfUlhfSU5UX0VOICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIERNQSBTVEFUVVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIERNQV9TVEFUVVNfQkFEX0FERFJfU0hGICAgICAgICAgMTYKKyNkZWZpbmUgRE1BX1NUQVRVU19CQURfQUREUl9NU0sgICAgICAgICAoMHhmIDw8IERNQV9TVEFUVVNfQkFEX0FERFJfU0hGKQorI2RlZmluZSBETUFfU1RBVFVTX1JYX1BLVFNfUkVDRUlWRURfU0hGIDgKKyNkZWZpbmUgRE1BX1NUQVRVU19SWF9QS1RTX1JFQ0VJVkVEX01TSyAoMHhmZiA8PCBETUFfU1RBVFVTX1JYX1BLVFNfUkVDRUlWRURfU0hGKQorI2RlZmluZSBETUFfU1RBVFVTX1RYX0VOX1NZTkMgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRE1BX1NUQVRVU19SWF9CVUZfQV9GVUwgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIERNQV9TVEFUVVNfUlhfQlVGX0JfRlVMICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBETUFfU1RBVFVTX1JYX1RPX0lOVCAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRE1BX1NUQVRVU19SWF9JTlQgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9TVEFUVVNfVFhfSU5UICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBETUFfU1RBVFVTX01BQ19UWF9JTlQgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRE1BX1NUQVRVU19NQUNfUlhfSU5UICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIERNQSBURVNUL1BBTklDIFNXSVRIRVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIERNQV9URVNUX0xPT1BCQUNLICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBETUFfVEVTVF9TV19SRVNFVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogTUFDIENPTlRST0wgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0VOX01JU1NfUk9MTCAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBNQUNfQ09OVFJPTF9NSVNTX1JPTEwgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTUFDX0NPTlRST0xfTE9PUDEwICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE1BQ19DT05UUk9MX0NPTk5fU0hGICAgICAgICAgICAgNQorI2RlZmluZSBNQUNfQ09OVFJPTF9DT05OX01TSyAgICAgICAgICAgICgweDMgPDwgTUFDX0NPTlRST0xfQ09OTl9TSEYpCisjZGVmaW5lIE1BQ19DT05UUk9MX01BQ19MT09QICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBNQUNfQ09OVFJPTF9GVUxMX0RVUCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTUFDX0NPTlRST0xfUkVTRVQgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1BQ19DT05UUk9MX0hBTFRfSU1NICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBNQUNfQ09OVFJPTF9IQUxUX1JFUSAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogQ0FNIENPTlRST0wgcmVnaXN0ZXIuICovCisjZGVmaW5lIENBTV9DT05UUk9MX0NPTVBfRU4gICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDQU1fQ09OVFJPTF9ORUdfQ0FNICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ0FNX0NPTlRST0xfQlJPQURfQUNDICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIENBTV9DT05UUk9MX0dST1VQX0FDQyAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBDQU1fQ09OVFJPTF9TVEFUSU9OX0FDQyAgICAgICAgIDB4MDAwMDAwMDEKKworLyogVFJBTlNNSVQgQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgVFhfQ1RMX0VOX0NPTVAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFRYX0NUTF9FTl9UWF9QQVIgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUWF9DVExfRU5fTEFURV9DT0xMICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVFhfQ1RMX0VOX0VYX0NPTEwgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFRYX0NUTF9FTl9MX0NBUlIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBUWF9DVExfRU5fRVhfREVGRVIgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVFhfQ1RMX0VOX1VOREVSICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFRYX0NUTF9NSUkxMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUWF9DVExfU0RfUEFVU0UgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFhfQ1RMX05PX0VYX0RFRjAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRYX0NUTF9GX0JBQ0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBUWF9DVExfTk9fQ1JDICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFhfQ1RMX05PX1BBRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFRYX0NUTF9UWF9IQUxUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBUWF9DVExfVFhfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogVFJBTlNNSVQgU1RBVFVTIHJlZ2lzdGVyLiAqLworI2RlZmluZSBUWF9TVEFUVVNfU1FfRVJSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0hBTFRFRCAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFRYX1NUQVRVU19DT01QICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBUWF9TVEFUVVNfVFhfUEFSICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX0xBVEVfQ09MTCAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFRYX1NUQVRVU19UWDEwX1NUQVQgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBUWF9TVEFUVVNfTF9DQVJSICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgVFhfU1RBVFVTX0VYX0RFRkVSICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFRYX1NUQVRVU19VTkRFUiAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBUWF9TVEFUVVNfSU5fVFggICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgVFhfU1RBVFVTX1BBVVNFRCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFRYX1NUQVRVU19UWF9ERUZFUlJFRCAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBUWF9TVEFUVVNfRVhfQ09MTCAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0NPTExfU0hGICAgICAgICAgICAwCisjZGVmaW5lIFRYX1NUQVRVU19UWF9DT0xMX01TSyAgICAgICAgICAgKDB4ZiA8PCBUWF9TVEFUVVNfVFhfQ09MTF9TSEYpCisKKy8qIFJFQ0VJVkUgQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUlhfQ1RMX0VOX0dPT0QgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFJYX0NUTF9FTl9SWF9QQVIgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBSWF9DVExfRU5fTE9OR19FUlIgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgUlhfQ1RMX0VOX09WRVIgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFJYX0NUTF9FTl9DUkNfRVJSICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBSWF9DVExfRU5fQUxJR04gICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgUlhfQ1RMX0lHTk9SRV9DUkMgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFJYX0NUTF9QQVNTX0NUTCAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBSWF9DVExfU1RSSVBfQ1JDICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUlhfQ1RMX1NIT1JUX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFJYX0NUTF9MT05HX0VOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBSWF9DVExfUlhfSEFMVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUlhfQ1RMX1JYX0VOICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIFJFQ0VJVkUgU1RBVFVTIHJlZ2lzdGVyLiAqLworI2RlZmluZSBSWF9TVEFUVVNfUlhfSEFMVEVEICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUlhfU1RBVFVTX0dPT0QgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFJYX1NUQVRVU19SWF9QQVIgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBSWF9TVEFUVVNfTE9OR19FUlIgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgUlhfU1RBVFVTX09WRVJGTE9XICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFJYX1NUQVRVU19DUkNfRVJSICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBSWF9TVEFUVVNfQUxJR05fRVJSICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgUlhfU1RBVFVTX1JYMTBfU1RBVCAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFJYX1NUQVRVU19JTlRfUlggICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBSWF9TVEFUVVNfQ1RMX1JFQ0QgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKworLyogTURfQ0EgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1EX0NBX1BSRV9TVVAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBNRF9DQV9CVVNZICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgTURfQ0FfV1IgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE1EX0NBX1BIWV9TSEYgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNRF9DQV9QSFlfTVNLICAgICAgICAgICAgICAgICAgICgweDFmIDw8IE1EX0NBX1BIWV9TSEYpCisjZGVmaW5lIE1EX0NBX0FERFJfU0hGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRF9DQV9BRERSX01TSyAgICAgICAgICAgICAgICAgICgweDFmIDw8IE1EX0NBX0FERFJfU0hGKQorCisvKiBUeCBTdGF0dXMvQ29udHJvbC4gKi8KKyNkZWZpbmUgVFhfU1RBVF9DVExfT1dORVJfU0hGICAgICAgICAgICAzMAorI2RlZmluZSBUWF9TVEFUX0NUTF9PV05FUl9NU0sgICAgICAgICAgICgweDMgPDwgVFhfU1RBVF9DVExfT1dORVJfU0hGKQorI2RlZmluZSBUWF9TVEFUX0NUTF9GUkFNRV9TSEYgICAgICAgICAgIDI3CisjZGVmaW5lIFRYX1NUQVRfQ1RMX0ZSQU1FX01TSyAgICAgICAgICAgKDB4NyA8PCBUWF9TVEFUX0NUTF9GUkFNRV9TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYgICAgICAgICAgMTEKKyNkZWZpbmUgVFhfU1RBVF9DVExfU1RBVFVTX01TSyAgICAgICAgICAoMHgxZmZmZiA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKQorI2RlZmluZSBUWF9TVEFUX0NUTF9MRU5HVEhfU0hGICAgICAgICAgIDAKKyNkZWZpbmUgVFhfU1RBVF9DVExfTEVOR1RIX01TSyAgICAgICAgICAoMHg3ZmYgPDwgVFhfU1RBVF9DVExfTEVOR1RIX1NIRikKKworI2RlZmluZSBUWF9TVEFUX0NUTF9FUlJPUl9NU0sgICAgICAgICAgICgoVFhfU1RBVFVTX1NRX0VSUiAgICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfVFhfSEFMVEVEICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9QQVIgICAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX0xBVEVfQ09MTCAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfTF9DQVJSICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19FWF9ERUZFUiAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX1VOREVSICAgICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfUEFVU0VEICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9ERUZFUlJFRCB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX0VYX0NPTEwgICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfVFhfQ09MTF9NU0spICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0lOVF9BRlRFUl9UWCAgICAgICAgMHg0CisKKy8qIFJ4IFN0YXR1cy9Db250cm9sLiAqLworI2RlZmluZSBSWF9TVEFUX0NUTF9PV05FUl9TSEYgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1NUQVRfQ1RMX09XTkVSX01TSyAgICAgICAgICAgKDB4MyA8PCBSWF9TVEFUX0NUTF9PV05FUl9TSEYpCisjZGVmaW5lIFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYgICAgICAgICAgMTEKKyNkZWZpbmUgUlhfU1RBVF9DVExfU1RBVFVTX01TSyAgICAgICAgICAoMHhmZmZmIDw8IFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYpCisjZGVmaW5lIFJYX1NUQVRfQ1RMX0xFTkdUSF9TSEYgICAgICAgICAgMAorI2RlZmluZSBSWF9TVEFUX0NUTF9MRU5HVEhfTVNLICAgICAgICAgICgweDdmZiA8PCBSWF9TVEFUX0NUTF9MRU5HVEhfU0hGKQorCisKKworLyogVGhlIFNBQTk3MzAgKExBTikgY29udHJvbGxlciByZWdpc3RlciBtYXAsIGFzIHNlZW4gdmlhIHRoZSBQQ0ktYnVzLiAqLworI2RlZmluZSBTQUE5NzMwX0xBTl9SRUdTX0FERFIgICAweDIwNDAwCisKK3N0cnVjdCBsYW5fc2FhOTczMF9yZWdtYXAgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUeEJ1ZmZBOwkJCS8qIDB4MjA0MDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVHhCdWZmQjsJCQkvKiAweDIwNDA0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4QnVmZkE7CQkJLyogMHgyMDQwOCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBSeEJ1ZmZCOwkJCS8qIDB4MjA0MGMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUGFja2V0Q291bnQ7CQkvKiAweDIwNDEwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IE9rMlVzZTsJCQkvKiAweDIwNDE0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IExhbkRtYUN0bDsJCS8qIDB4MjA0MTggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVGltZW91dDsJCQkvKiAweDIwNDFjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERtYVN0YXR1czsJCS8qIDB4MjA0MjAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRG1hVGVzdDsJCQkvKiAweDIwNDI0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBmaWxsZXIyMDQyOFsweDIwNDMwIC0gMHgyMDQyOF07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFBhdXNlQ291bnQ7CQkvKiAweDIwNDMwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJlbW90ZVBhdXNlQ291bnQ7CQkvKiAweDIwNDM0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBmaWxsZXIyMDQzOFsweDIwNDQwIC0gMHgyMDQzOF07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IE1hY0N0bDsJCQkvKiAweDIwNDQwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IENhbUN0bDsJCQkvKiAweDIwNDQ0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFR4Q3RsOwkJCS8qIDB4MjA0NDggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVHhTdGF0dXM7CQkJLyogMHgyMDQ0YyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBSeEN0bDsJCQkvKiAweDIwNDUwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4U3RhdHVzOwkJCS8qIDB4MjA0NTQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgU3RhdGlvbk1nbXREYXRhOwkJLyogMHgyMDQ1OCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBTdGF0aW9uTWdtdEN0bDsJCS8qIDB4MjA0NWMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtQWRkcmVzczsJCS8qIDB4MjA0NjAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtRGF0YTsJCQkvKiAweDIwNDY0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IENhbUVuYWJsZTsJCS8qIDB4MjA0NjggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGZpbGxlcjIwNDZjWzB4MjA1MDAgLSAweDIwNDZjXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdQQ0lNYXN0ZXJBZGRyOwkvKiAweDIwNTAwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERlYnVnTGFuVHhTdGF0ZU1hY2hpbmU7CS8qIDB4MjA1MDQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5SeFN0YXRlTWFjaGluZTsJLyogMHgyMDUwOCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z0xhblR4Rmlmb1BvaW50ZXJzOwkvKiAweDIwNTBjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERlYnVnTGFuUnhGaWZvUG9pbnRlcnM7CS8qIDB4MjA1MTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5DdGxTdGF0ZU1hY2hpbmU7CS8qIDB4MjA1MTQgKi8KK307Cit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBsYW5fc2FhOTczMF9yZWdtYXAgdF9sYW5fc2FhOTczMF9yZWdtYXA7CisKKworLyogRVZNIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgRVZNX0xBTl9JTlQgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEVWTV9NQVNURVJfRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBUaGUgU0FBOTczMCAoRVZNKSBjb250cm9sbGVyIHJlZ2lzdGVyIG1hcCwgYXMgc2VlbiB2aWEgdGhlIFBDSS1idXMuICovCisjZGVmaW5lIFNBQTk3MzBfRVZNX1JFR1NfQUREUiAgIDB4MDIwMDAKKworc3RydWN0IGV2bV9zYWE5NzMwX3JlZ21hcCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdFN0YXR1czE7CQkvKiAweDIwMDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0RW5hYmxlMTsJCS8qIDB4MjAwNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRNb25pdG9yMTsJLyogMHgyMDA4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IENvdW50ZXI7CQkJLyogMHgyMDBjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IENvdW50ZXJUaHJlc2hvbGQ7CQkvKiAweDIwMTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ291bnRlckNvbnRyb2w7CQkvKiAweDIwMTQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgR3Bpb0NvbnRyb2wxOwkJLyogMHgyMDE4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdFN0YXR1czI7CQkvKiAweDIwMWMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0RW5hYmxlMjsJCS8qIDB4MjAyMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRNb25pdG9yMjsJLyogMHgyMDI0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEdwaW9Db250cm9sMjsJCS8qIDB4MjAyOCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRCbG9jazE7CQkvKiAweDIwMmMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0QmxvY2syOwkJLyogMHgyMDMwICovCit9OwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgZXZtX3NhYTk3MzBfcmVnbWFwIHRfZXZtX3NhYTk3MzBfcmVnbWFwOworCisKK3N0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlIHsKKwkvKiBQb2ludGVyIGZvciB0aGUgU0FBOTczMCBMQU4gY29udHJvbGxlciByZWdpc3RlciBzZXQuICovCisJdF9sYW5fc2FhOTczMF9yZWdtYXAgKmxhbl9zYWE5NzMwX3JlZ3M7CisKKwkvKiBQb2ludGVyIHRvIHRoZSBTQUE5NzMwIEVWTSByZWdpc3Rlci4gKi8KKwl0X2V2bV9zYWE5NzMwX3JlZ21hcCAqZXZtX3NhYTk3MzBfcmVnczsKKworCS8qIFRSVUUgaWYgdGhlIG5leHQgYnVmZmVyIHRvIHdyaXRlIGlzIFJ4QnVmZkEsICBGQUxTRSBpZiBSeEJ1ZmZCLiAqLworCXVuc2lnbmVkIGNoYXIgTmV4dFJjdlRvVXNlSXNBOworCS8qIFJjdiBidWZmZXIgSW5kZXguICovCisJdW5zaWduZWQgY2hhciBOZXh0UmN2UGFja2V0SW5kZXg7CisKKwkvKiBJbmRleCBvZiBuZXh0IHBhY2tldCB0byB1c2UgaW4gdGhhdCBidWZmZXIuICovCisJdW5zaWduZWQgY2hhciBOZXh0VHhtUGFja2V0SW5kZXg7CisJLyogTmV4dCBidWZmZXIgaW5kZXguICovCisJdW5zaWduZWQgY2hhciBOZXh0VHhtQnVmZmVySW5kZXg7CisKKwkvKiBJbmRleCBvZiBmaXJzdCBwZW5kaW5nIHBhY2tldCByZWFkeSB0byBzZW5kLiAqLworCXVuc2lnbmVkIGNoYXIgUGVuZGluZ1R4bVBhY2tldEluZGV4OworCS8qIFBlbmRpbmcgYnVmZmVyIGluZGV4LiAqLworCXVuc2lnbmVkIGNoYXIgUGVuZGluZ1R4bUJ1ZmZlckluZGV4OworCisJdW5zaWduZWQgY2hhciBEbWFSY3ZQYWNrZXRzOworCXVuc2lnbmVkIGNoYXIgRG1hVHhtUGFja2V0czsKKworCXVuc2lnbmVkIGNoYXIgUmN2QUluZGV4OwkvKiBpbmRleCBpbnRvIFJjdkJ1ZmZlclNwYWNlW10gZm9yIEJsayBBICovCisJdW5zaWduZWQgY2hhciBSY3ZCSW5kZXg7CS8qIGluZGV4IGludG8gUmN2QnVmZmVyU3BhY2VbXSBmb3IgQmxrIEIgKi8KKworCXVuc2lnbmVkIGludAorCSAgICBUeG1CdWZmZXJbTEFOX1NBQTk3MzBfQlVGRkVSU11bTEFOX1NBQTk3MzBfVFhNX1FfU0laRV07CisJdW5zaWduZWQgaW50CisJICAgIFJjdkJ1ZmZlcltMQU5fU0FBOTczMF9CVUZGRVJTXVtMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVHhCdWZmZXJGcmVlW0xBTl9TQUE5NzMwX0JVRkZFUlNdOworCisJdW5zaWduZWQgY2hhciBQaHlzaWNhbEFkZHJlc3NbTEFOX1NBQTk3MzBfQ0FNX0VOVFJJRVNdWzZdOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2VuZGlmIC8qIF9TQUE5NzMwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1MzY5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyogc2IxMDAwLmM6IEEgR2VuZXJhbCBJbnN0cnVtZW50cyBTQjEwMDAgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk4IGJ5IEZyYW5jbyBWZW50dXJpLgorCisJQ29weXJpZ2h0IDE5OTggYnkgRnJhbmNvIFZlbnR1cmkuCisJQ29weXJpZ2h0IDE5OTQsMTk5NSBieSBEb25hbGQgQmVja2VyLgorCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBHZW5lcmFsIEluc3RydW1lbnRzIFNCMTAwMCAoaW50ZXJuYWwgU1VSRmJvYXJkKQorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBmdmVudHVyaUBtZWRpYW9uZS5uZXQKKworCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorCWFuZC9vciAgbW9kaWZ5IGl0IHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbAorCVB1YmxpYyAgTGljZW5zZSBhcyAgcHVibGlzaGVkICBieSAgdGhlICBGcmVlICBTb2Z0d2FyZQorCUZvdW5kYXRpb247ICBlaXRoZXIgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgIChhdAorCXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCUNoYW5nZXM6CisKKwk5ODExMTUgU3RldmVuIEhpcnNjaCA8c2hpcnNjaEBhZGVscGhpYS5uZXQ+CisKKwlMaW51cyBjaGFuZ2VkIHRoZSB0aW1lciBpbnRlcmZhY2UuICBTaG91bGQgd29yayBvbiBhbGwgcmVjZW50CisJZGV2ZWxvcG1lbnQga2VybmVscy4KKworCTk4MDYwOCBTdGV2ZW4gSGlyc2NoIDxzaGlyc2NoQGFkZWxwaGlhLm5ldD4KKworCVNtYWxsIGNoYW5nZXMgdG8gbWFrZSBpdCB3b3JrIHdpdGggMi4xLngga2VybmVscy4gSG9wZWZ1bGx5LAorCW5vdGhpbmcgbWFqb3Igd2lsbCBjaGFuZ2UgYmVmb3JlIG9mZmljaWFsIHJlbGVhc2Ugb2YgTGludXggMi4yLgorCQorCU1lcmdlZCB3aXRoIDIuMiAtIEFsYW4gQ294CisqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPSAic2IxMDAwLmM6djEuMS4yIDYvMDEvOTggKGZ2ZW50dXJpQG1lZGlhb25lLm5ldClcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2NhYmxlbW9kZW0uaD4gLyogZm9yIFNJT0dDTS9TSU9TQ00gc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgdWRlbGF5KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgU0IxMDAwX0RFQlVHCitzdGF0aWMgaW50IHNiMTAwMF9kZWJ1ZyA9IFNCMTAwMF9ERUJVRzsKKyNlbHNlCitzdGF0aWMgaW50IHNiMTAwMF9kZWJ1ZyA9IDE7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBTQjEwMDBfSU9fRVhURU5UID0gODsKKy8qIFNCMTAwMCBNYXhpbXVtIFJlY2VpdmUgVW5pdCAqLworc3RhdGljIGNvbnN0IGludCBTQjEwMDBfTVJVID0gMTUwMDsgLyogb2N0ZWN0cyAqLworCisjZGVmaW5lIE5QSURTIDQKK3N0cnVjdCBzYjEwMDBfcHJpdmF0ZSB7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYltOUElEU107CisJc2hvcnQgcnhfZGxlbltOUElEU107CisJdW5zaWduZWQgaW50IHJ4X2ZyYW1lczsKKwlzaG9ydCByeF9lcnJvcl9jb3VudDsKKwlzaG9ydCByeF9lcnJvcl9kcGNfY291bnQ7CisJdW5zaWduZWQgY2hhciByeF9zZXNzaW9uX2lkW05QSURTXTsKKwl1bnNpZ25lZCBjaGFyIHJ4X2ZyYW1lX2lkW05QSURTXTsKKwl1bnNpZ25lZCBjaGFyIHJ4X3BrdF90eXBlW05QSURTXTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKK307CisKKy8qIHByb3RvdHlwZXMgZm9yIExpbnV4IGludGVyZmFjZSAqLworZXh0ZXJuIGludCBzYjEwMDBfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNiMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzYjEwMDBfZGV2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IHNiMTAwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHNiMTAwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNiMTAwMF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2IxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8qIFNCMTAwMCBoYXJkd2FyZSByb3V0aW5lcyB0byBiZSB1c2VkIGR1cmluZyBvcGVuL2NvbmZpZ3VyYXRpb24gcGhhc2VzICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmljZWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOworc3RhdGljIGlubGluZSBpbnQgY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyKGNvbnN0IGludCBpb2FkZHJbXSwKKwljb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IGNhcmRfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCXVuc2lnbmVkIGNoYXIgaW5bXSk7CitzdGF0aWMgaW5saW5lIGludCBjYXJkX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSwgdW5zaWduZWQgY2hhciBpbltdKTsKKworLyogU0IxMDAwIGhhcmR3YXJlIHJvdXRpbmVzIHRvIGJlIHVzZWQgZHVyaW5nIGZyYW1lIHJ4IGludGVycnVwdCAqLworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX3dhaXRfZm9yX3JlYWR5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLAorCWNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSB2b2lkIHNiMTAwMF9zZW5kX2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgb3V0W10pOworc3RhdGljIGlubGluZSB2b2lkIHNiMTAwMF9yZWFkX3N0YXR1cyhjb25zdCBpbnQgaW9hZGRyW10sIHVuc2lnbmVkIGNoYXIgaW5bXSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CisKKy8qIFNCMTAwMCBjb21tYW5kcyBmb3Igb3Blbi9jb25maWd1cmF0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfcmVzZXQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF9jaGVja19DUkMoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLAorCWNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLAorCWNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX2FjdGl2YXRlKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW50IHNiMTAwMF9nZXRfZmlybXdhcmVfdmVyc2lvbihjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgY2hhciB2ZXJzaW9uW10sIGludCBkb19lbmQpOworc3RhdGljIGludCBzYjEwMDBfZ2V0X2ZyZXF1ZW5jeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJaW50KiBmcmVxdWVuY3kpOworc3RhdGljIGludCBzYjEwMDBfc2V0X2ZyZXF1ZW5jeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJaW50IGZyZXF1ZW5jeSk7CitzdGF0aWMgaW50IHNiMTAwMF9nZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJc2hvcnQgUElEW10pOworc3RhdGljIGludCBzYjEwMDBfc2V0X1BJRHMoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCWNvbnN0IHNob3J0IFBJRFtdKTsKKworLyogU0IxMDAwIGNvbW1hbmRzIGZvciBmcmFtZSByeCBpbnRlcnJ1cHQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYjEwMDBfZXJyb3JfZHBjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgc2IxMDAwX3BucF9pZHNbXSA9IHsKKwl7ICJHSUMxMDAwIiwgMCB9LAorCXsgIiIsIDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBzYjEwMDBfcG5wX2lkcyk7CisKK3N0YXRpYyBpbnQKK3NiMTAwMF9wcm9iZV9vbmUoc3RydWN0IHBucF9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIHNob3J0IGlvYWRkclsyXSwgaXJxOworCXVuc2lnbmVkIGludCBzZXJpYWxfbnVtYmVyOworCWludCBlcnJvciA9IC1FTk9ERVY7CisJCisJaWYgKHBucF9kZXZpY2VfYXR0YWNoKHBkZXYpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHBucF9hY3RpdmF0ZV9kZXYocGRldikgPCAwKQorCQlnb3RvIG91dF9kZXRhY2g7CisKKwlpZiAoIXBucF9wb3J0X3ZhbGlkKHBkZXYsIDApIHx8ICFwbnBfcG9ydF92YWxpZChwZGV2LCAxKSkKKwkJZ290byBvdXRfZGlzYWJsZTsKKwlpZiAoIXBucF9pcnFfdmFsaWQocGRldiwgMCkpCisJCWdvdG8gb3V0X2Rpc2FibGU7CisJCQorCXNlcmlhbF9udW1iZXIgPSBwZGV2LT5jYXJkLT5zZXJpYWw7CisJCQorCWlvYWRkclswXSA9IHBucF9wb3J0X3N0YXJ0KHBkZXYsIDApOworCWlvYWRkclsxXSA9IHBucF9wb3J0X3N0YXJ0KHBkZXYsIDApOworCQkKKwlpcnEgPSBwbnBfaXJxKHBkZXYsIDApOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHJbMF0sIDE2LCAic2IxMDAwIikpCisJCWdvdG8gb3V0X2Rpc2FibGU7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHJbMV0sIDE2LCAic2IxMDAwIikpCisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uMDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc2IxMDAwX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwkJIAorCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyWzBdOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJZGV2LT5tZW1fc3RhcnQgPSBpb2FkZHJbMV07CisJZGV2LT5pcnEgPSBpcnE7CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc2IxMDAwIGF0ICglIzMuM2x4LCUjMy4zbHgpLCAiCisJCQkiUy9OICUjOC44eCwgSVJRICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwKKwkJCWRldi0+bWVtX3N0YXJ0LCBzZXJpYWxfbnVtYmVyLCBkZXYtPmlycSk7CisKKwkvKgorCSAqIFRoZSBTQjEwMDAgaXMgYW4gcngtb25seSBjYWJsZSBtb2RlbSBkZXZpY2UuICBUaGUgdXBsaW5rIGlzIGEgbW9kZW0KKwkgKiBhbmQgd2UgZG8gbm90IHdhbnQgdG8gYXJwIG9uIGl0LgorCSAqLworCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlR8SUZGX05PQVJQOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOworCisJLyogVGhlIFNCMTAwMC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbgkJPSBzYjEwMDBfb3BlbjsKKwlkZXYtPmRvX2lvY3RsCQk9IHNiMTAwMF9kZXZfaW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBzYjEwMDBfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AJCT0gc2IxMDAwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzCQk9IHNiMTAwMF9zdGF0czsKKworCS8qIGhhcmR3YXJlIGFkZHJlc3MgaXMgMDowOnNlcmlhbF9udW1iZXIgKi8KKwlkZXYtPmRldl9hZGRyWzJdCT0gc2VyaWFsX251bWJlciA+PiAyNCAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclszXQk9IHNlcmlhbF9udW1iZXIgPj4gMTYgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNF0JPSBzZXJpYWxfbnVtYmVyID4+ICA4ICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdCT0gc2VyaWFsX251bWJlciA+PiAgMCAmIDB4ZmY7CisKKwlwbnBfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWVycm9yID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworIG91dF9yZWxlYXNlX3JlZ2lvbnM6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyWzFdLCAxNik7Cisgb3V0X3JlbGVhc2VfcmVnaW9uMDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMF0sIDE2KTsKKyBvdXRfZGlzYWJsZToKKwlwbnBfZGlzYWJsZV9kZXYocGRldik7Cisgb3V0X2RldGFjaDoKKwlwbnBfZGV2aWNlX2RldGFjaChwZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitzYjEwMDBfcmVtb3ZlX29uZShzdHJ1Y3QgcG5wX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG5wX2dldF9kcnZkYXRhKHBkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMTYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCAxNik7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIHNiMTAwMF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNiMTAwMCIsCisJLmlkX3RhYmxlCT0gc2IxMDAwX3BucF9pZHMsCisJLnByb2JlCQk9IHNiMTAwMF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBzYjEwMDBfcmVtb3ZlX29uZSwKK307CisKKwwKKy8qCisgKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgb3Blbi9jb25maWd1cmF0aW9uIHBoYXNlcworICovCisKK3N0YXRpYyBjb25zdCBpbnQgVGltZU91dEppZmZpZXMgPSAoODc1ICogSFopIC8gMTAwOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmljZWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisJcmV0dXJuOworfQorCisvKiBDYXJkIFdhaXQgRm9yIEJ1c3kgQ2xlYXIgKGNhbm5vdCBiZSB1c2VkIGR1cmluZyBhbiBpbnRlcnJ1cHQpICovCitzdGF0aWMgaW5saW5lIGludAorY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJYSA9IGluYihpb2FkZHJbMF0gKyA3KTsKKwl0aW1lb3V0ID0gamlmZmllcyArIFRpbWVPdXRKaWZmaWVzOworCXdoaWxlIChhICYgMHg4MCB8fCBhICYgMHg0MCkgeworCQkvKiBhIGxpdHRsZSBzbGVlcCAqLworCQl5aWVsZCgpOworCisJCWEgPSBpbmIoaW9hZGRyWzBdICsgNyk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyIHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgV2FpdCBGb3IgUmVhZHkgKGNhbm5vdCBiZSB1c2VkIGR1cmluZyBhbiBpbnRlcnJ1cHQpICovCitzdGF0aWMgaW5saW5lIGludAorY2FyZF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIGNoYXIgaW5bXSkKK3sKKwl1bnNpZ25lZCBjaGFyIGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJYSA9IGluYihpb2FkZHJbMV0gKyA2KTsKKwl0aW1lb3V0ID0gamlmZmllcyArIFRpbWVPdXRKaWZmaWVzOworCXdoaWxlIChhICYgMHg4MCB8fCAhKGEgJiAweDQwKSkgeworCQkvKiBhIGxpdHRsZSBzbGVlcCAqLworCQl5aWVsZCgpOworCisJCWEgPSBpbmIoaW9hZGRyWzFdICsgNik7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZF93YWl0X2Zvcl9yZWFkeSB0aW1lb3V0XG4iLAorCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKworCWluWzFdID0gaW5iKGlvYWRkclswXSArIDEpOworCWluWzJdID0gaW5iKGlvYWRkclswXSArIDIpOworCWluWzNdID0gaW5iKGlvYWRkclswXSArIDMpOworCWluWzRdID0gaW5iKGlvYWRkclswXSArIDQpOworCWluWzBdID0gaW5iKGlvYWRkclswXSArIDUpOworCWluWzZdID0gaW5iKGlvYWRkclswXSArIDYpOworCWluWzVdID0gaW5iKGlvYWRkclsxXSArIDYpOworCXJldHVybiAwOworfQorCisvKiBDYXJkIFNlbmQgQ29tbWFuZCAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjYXJkX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSwgdW5zaWduZWQgY2hhciBpbltdKQoreworCWludCBzdGF0dXMsIHg7CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfd2FpdF9mb3JfYnVzeV9jbGVhcihpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlvdXRiKDB4YTAsIGlvYWRkclswXSArIDYpOworCW91dGIob3V0WzJdLCBpb2FkZHJbMF0gKyAxKTsKKwlvdXRiKG91dFszXSwgaW9hZGRyWzBdICsgMik7CisJb3V0YihvdXRbNF0sIGlvYWRkclswXSArIDMpOworCW91dGIob3V0WzVdLCBpb2FkZHJbMF0gKyA0KTsKKwlvdXRiKG91dFsxXSwgaW9hZGRyWzBdICsgNSk7CisJb3V0YigweGEwLCBpb2FkZHJbMF0gKyA2KTsKKwlvdXRiKG91dFswXSwgaW9hZGRyWzBdICsgNyk7CisJaWYgKG91dFswXSAhPSAweDIwICYmIG91dFswXSAhPSAweDMwKSB7CisJCWlmICgoc3RhdHVzID0gY2FyZF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUsIGluKSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlpbmIoaW9hZGRyWzBdICsgNyk7CisJCWlmIChzYjEwMDBfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYXJkX3NlbmRfY29tbWFuZCAiCisJCQkJIm91dDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICAiCisJCQkJImluOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLCBuYW1lLAorCQkJCW91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sCisJCQkJaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwgaW5bNl0pOworCX0gZWxzZSB7CisJCWlmIChzYjEwMDBfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYXJkX3NlbmRfY29tbWFuZCAiCisJCQkJIm91dDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLCBuYW1lLAorCQkJCW91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0pOworCX0KKworCWlmIChvdXRbMV0gPT0gMHgxYikgeworCQl4ID0gKG91dFsyXSA9PSAweDAyKTsKKwl9IGVsc2UgeworCQlpZiAob3V0WzBdID49IDB4ODAgJiYgaW5bMF0gIT0gKG91dFsxXSB8IDB4ODApKQorCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisMCisvKgorICogU0IxMDAwIGhhcmR3YXJlIHJvdXRpbmVzIHRvIGJlIHVzZWQgZHVyaW5nIGZyYW1lIHJ4IGludGVycnVwdAorICovCitzdGF0aWMgY29uc3QgaW50IFNiMTAwMFRpbWVPdXRKaWZmaWVzID0gNyAqIEhaOworCisvKiBDYXJkIFdhaXQgRm9yIFJlYWR5ICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzYjEwMDBfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgU2IxMDAwVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGluYihpb2FkZHJbMV0gKyA2KSAmIDB4ODApIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzYjEwMDBfd2FpdF9mb3JfcmVhZHkgdGltZW91dFxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKwl9CisJdGltZW91dCA9IGppZmZpZXMgKyBTYjEwMDBUaW1lT3V0SmlmZmllczsKKwl3aGlsZSAoIShpbmIoaW9hZGRyWzFdICsgNikgJiAweDQwKSkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNiMTAwMF93YWl0X2Zvcl9yZWFkeSB0aW1lb3V0XG4iLAorCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKwlpbmIoaW9hZGRyWzBdICsgNyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgV2FpdCBGb3IgUmVhZHkgQ2xlYXIgKHRvIGJlIHVzZWQgZHVyaW5nIGZyYW1lIHJ4KSAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBTYjEwMDBUaW1lT3V0SmlmZmllczsKKwl3aGlsZSAoaW5iKGlvYWRkclsxXSArIDYpICYgMHg4MCkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhciB0aW1lb3V0XG4iLAorCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKwl0aW1lb3V0ID0gamlmZmllcyArIFNiMTAwMFRpbWVPdXRKaWZmaWVzOworCXdoaWxlIChpbmIoaW9hZGRyWzFdICsgNikgJiAweDQwKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyIHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDYXJkIFNlbmQgQ29tbWFuZCAodG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcngpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NiMTAwMF9zZW5kX2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgb3V0W10pCit7CisJb3V0YihvdXRbMl0sIGlvYWRkclswXSArIDEpOworCW91dGIob3V0WzNdLCBpb2FkZHJbMF0gKyAyKTsKKwlvdXRiKG91dFs0XSwgaW9hZGRyWzBdICsgMyk7CisJb3V0YihvdXRbNV0sIGlvYWRkclswXSArIDQpOworCW91dGIob3V0WzFdLCBpb2FkZHJbMF0gKyA1KTsKKwlvdXRiKG91dFswXSwgaW9hZGRyWzBdICsgNyk7CisJaWYgKHNiMTAwMF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2IxMDAwX3NlbmRfY29tbWFuZCBvdXQ6ICUwMnglMDJ4JTAyeCUwMngiCisJCQkiJTAyeCUwMnhcbiIsIG5hbWUsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0pOworCXJldHVybjsKK30KKworLyogQ2FyZCBSZWFkIFN0YXR1cyAodG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcngpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NiMTAwMF9yZWFkX3N0YXR1cyhjb25zdCBpbnQgaW9hZGRyW10sIHVuc2lnbmVkIGNoYXIgaW5bXSkKK3sKKwlpblsxXSA9IGluYihpb2FkZHJbMF0gKyAxKTsKKwlpblsyXSA9IGluYihpb2FkZHJbMF0gKyAyKTsKKwlpblszXSA9IGluYihpb2FkZHJbMF0gKyAzKTsKKwlpbls0XSA9IGluYihpb2FkZHJbMF0gKyA0KTsKKwlpblswXSA9IGluYihpb2FkZHJbMF0gKyA1KTsKKwlyZXR1cm47Cit9CisKKy8qIElzc3VlIFJlYWQgQ29tbWFuZCAodG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcngpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NiMTAwMF9pc3N1ZV9yZWFkX2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHgyMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMH07CisKKwlzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoaW9hZGRyLCBuYW1lKTsKKwlvdXRiKDB4YTAsIGlvYWRkclswXSArIDYpOworCXNiMTAwMF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCk7CisJcmV0dXJuOworfQorCisMCisvKgorICogU0IxMDAwIGNvbW1hbmRzIGZvciBvcGVuL2NvbmZpZ3VyYXRpb24KKyAqLworLyogcmVzZXQgU0IxMDAwIGNhcmQgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzYjEwMDBfcmVzZXQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHBvcnQsIHN0YXR1czsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJcG9ydCA9IGlvYWRkclsxXSArIDY7CisJb3V0YigweDQsIHBvcnQpOworCWluYihwb3J0KTsKKwl1ZGVsYXkoMTAwMCk7CisJb3V0YigweDAsIHBvcnQpOworCWluYihwb3J0KTsKKwluaWNlZGVsYXkoNjAwMDApOworCW91dGIoMHg0LCBwb3J0KTsKKwlpbmIocG9ydCk7CisJdWRlbGF5KDEwMDApOworCW91dGIoMHgwLCBwb3J0KTsKKwlpbmIocG9ydCk7CisJdWRlbGF5KDApOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChzdFszXSAhPSAweGYwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworLyogY2hlY2sgU0IxMDAwIGZpcm13YXJlIENSQyAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9jaGVja19DUkMoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IGNyYywgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwkvKiBjaGVjayBDUkMgKi8KKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHN0WzFdICE9IHN0WzNdIHx8IHN0WzJdICE9IHN0WzRdKQorCQlyZXR1cm4gLUVJTzsKKwljcmMgPSBzdFsxXSA8PCA4IHwgc3RbMl07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwlyZXR1cm4gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHN0YXR1czsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MWIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDEsIHN0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9hY3RpdmF0ZShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCW5pY2VkZWxheSg1MDAwMCk7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RbM10gIT0gMHhmMSkgeworICAgIAlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdWRlbGF5KDEwMDApOworICAgIHJldHVybiBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSk7Cit9CisKKy8qIGdldCBTQjEwMDAgZmlybXdhcmUgdmVyc2lvbiAqLworc3RhdGljIGludAorc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb25bXSwgaW50IGRvX2VuZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWludCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCWlmICgoc3RhdHVzID0gc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHN0WzBdICE9IDB4YTMpCisJCXJldHVybiAtRUlPOworCXZlcnNpb25bMF0gPSBzdFsxXTsKKwl2ZXJzaW9uWzFdID0gc3RbMl07CisJaWYgKGRvX2VuZCkKKwkJcmV0dXJuIHNiMTAwMF9lbmRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogZ2V0IFNCMTAwMCBmcmVxdWVuY3kgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9nZXRfZnJlcXVlbmN5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwgaW50KiBmcmVxdWVuY3kpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwkqZnJlcXVlbmN5ID0gKChzdFsxXSA8PCA4IHwgc3RbMl0pIDw8IDggfCBzdFszXSkgPDwgOCB8IHN0WzRdOworCXJldHVybiBzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworfQorCisvKiBzZXQgU0IxMDAwIGZyZXF1ZW5jeSAqLworc3RhdGljIGludAorc2IxMDAwX3NldF9mcmVxdWVuY3koY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgZnJlcXVlbmN5KQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJY29uc3QgaW50IEZyZXF1ZW5jeUxvd2VyTGltaXQgPSA1NzAwMDsKKwljb25zdCBpbnQgRnJlcXVlbmN5VXBwZXJMaW1pdCA9IDgwNDAwMDsKKworCWlmIChmcmVxdWVuY3kgPCBGcmVxdWVuY3lMb3dlckxpbWl0IHx8IGZyZXF1ZW5jeSA+IEZyZXF1ZW5jeVVwcGVyTGltaXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZnJlcXVlbmN5IGNob3NlbiAoJWQga0h6KSBpcyBub3QgaW4gdGhlIHJhbmdlICIKKwkJCSJbJWQsJWRdIGtIelxuIiwgbmFtZSwgZnJlcXVlbmN5LCBGcmVxdWVuY3lMb3dlckxpbWl0LAorCQkJRnJlcXVlbmN5VXBwZXJMaW1pdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCUNvbW1hbmQwWzVdID0gZnJlcXVlbmN5ICYgMHhmZjsKKwlmcmVxdWVuY3kgPj49IDg7CisJQ29tbWFuZDBbNF0gPSBmcmVxdWVuY3kgJiAweGZmOworCWZyZXF1ZW5jeSA+Pj0gODsKKwlDb21tYW5kMFszXSA9IGZyZXF1ZW5jeSAmIDB4ZmY7CisJZnJlcXVlbmN5ID4+PSA4OworCUNvbW1hbmQwWzJdID0gZnJlcXVlbmN5ICYgMHhmZjsKKwlyZXR1cm4gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpOworfQorCisvKiBnZXQgU0IxMDAwIFBJRHMgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9nZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIHNob3J0IFBJRFtdKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHN0YXR1czsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHg4MCwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMls2XSA9IHsweDgwLCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQzWzZdID0gezB4ODAsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJdWRlbGF5KDEwMDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlQSURbMF0gPSBzdFsxXSA8PCA4IHwgc3RbMl07CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDEsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJUElEWzFdID0gc3RbMV0gPDwgOCB8IHN0WzJdOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQyLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCVBJRFsyXSA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMywgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlQSURbM10gPSBzdFsxXSA8PCA4IHwgc3RbMl07CisKKwlyZXR1cm4gc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKK30KKworLyogc2V0IFNCMTAwMCBQSURzICovCitzdGF0aWMgaW50CitzYjEwMDBfc2V0X1BJRHMoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBzaG9ydCBQSURbXSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCXNob3J0IHA7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHg4MCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJdW5zaWduZWQgY2hhciBDb21tYW5kMls2XSA9IHsweDgwLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwl1bnNpZ25lZCBjaGFyIENvbW1hbmQzWzZdID0gezB4ODAsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDRbNl0gPSB7MHg4MCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJcCA9IFBJRFswXTsKKwlDb21tYW5kMFszXSA9IHAgJiAweGZmOworCXAgPj49IDg7CisJQ29tbWFuZDBbMl0gPSBwICYgMHhmZjsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlwID0gUElEWzFdOworCUNvbW1hbmQxWzNdID0gcCAmIDB4ZmY7CisJcCA+Pj0gODsKKwlDb21tYW5kMVsyXSA9IHAgJiAweGZmOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXAgPSBQSURbMl07CisJQ29tbWFuZDJbM10gPSBwICYgMHhmZjsKKwlwID4+PSA4OworCUNvbW1hbmQyWzJdID0gcCAmIDB4ZmY7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQyLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJcCA9IFBJRFszXTsKKwlDb21tYW5kM1szXSA9IHAgJiAweGZmOworCXAgPj49IDg7CisJQ29tbWFuZDNbMl0gPSBwICYgMHhmZjsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDMsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDQsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHNiMTAwMF9lbmRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSk7Cit9CisKKwwKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX3ByaW50X3N0YXR1c19idWZmZXIoY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgY2hhciBzdFtdLAorCXVuc2lnbmVkIGNoYXIgYnVmZmVyW10sIGludCBzaXplKQoreworCWludCBpLCBqLCBrOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGF0dXM6ICUwMnggJTAyeFxuIiwgbmFtZSwgc3RbMF0sIHN0WzFdKTsKKwlpZiAoYnVmZmVyWzI0XSA9PSAweDA4ICYmIGJ1ZmZlclsyNV0gPT0gMHgwMCAmJiBidWZmZXJbMjZdID09IDB4NDUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsZW5ndGg6ICVkIHByb3RvY29sOiAlZCBmcm9tOiAlZC4lZC4lZC4lZDolZCAiCisJCQkidG8gJWQuJWQuJWQuJWQ6JWRcbiIsIG5hbWUsIGJ1ZmZlclsyOF0gPDwgOCB8IGJ1ZmZlclsyOV0sCisJCQlidWZmZXJbMzVdLCBidWZmZXJbMzhdLCBidWZmZXJbMzldLCBidWZmZXJbNDBdLCBidWZmZXJbNDFdLAorICAgICAgICAgICAgYnVmZmVyWzQ2XSA8PCA4IHwgYnVmZmVyWzQ3XSwKKwkJCWJ1ZmZlcls0Ml0sIGJ1ZmZlcls0M10sIGJ1ZmZlcls0NF0sIGJ1ZmZlcls0NV0sCisgICAgICAgICAgICBidWZmZXJbNDhdIDw8IDggfCBidWZmZXJbNDldKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwLCBrID0gMDsgaSA8IChzaXplICsgNykgLyA4OyBpKyspIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMiLCBuYW1lLCBpID8gIiAgICAgICAiIDogImJ1ZmZlcjoiKTsKKwkJCWZvciAoaiA9IDA7IGogPCA4ICYmIGsgPCBzaXplOyBqKyssIGsrKykKKwkJCQlwcmludGsoIiAlMDJ4IiwgYnVmZmVyW2tdKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBTQjEwMDAgY29tbWFuZHMgZm9yIGZyYW1lIHJ4IGludGVycnVwdAorICovCisvKiByZWNlaXZlIGEgc2luZ2xlIGZyYW1lIGFuZCBhc3NlbWJsZSBkYXRhZ3JhbQorICogKHRoaXMgaXMgdGhlIGhlYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgcm91dGluZSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisjZGVmaW5lIEZSQU1FU0laRSAxODQKKwl1bnNpZ25lZCBjaGFyIHN0WzJdLCBidWZmZXJbRlJBTUVTSVpFXSwgc2Vzc2lvbl9pZCwgZnJhbWVfaWQ7CisJc2hvcnQgZGxlbjsKKwlpbnQgaW9hZGRyLCBuczsKKwl1bnNpZ25lZCBpbnQgc2tic2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZscC0+c3RhdHM7CisKKwkvKiBTQjEwMDAgZnJhbWUgY29uc3RhbnRzICovCisJY29uc3QgaW50IEZyYW1lU2l6ZSA9IEZSQU1FU0laRTsKKwljb25zdCBpbnQgTmV3RGF0YWdyYW1IZWFkZXJTa2lwID0gODsKKwljb25zdCBpbnQgTmV3RGF0YWdyYW1IZWFkZXJTaXplID0gTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgMTg7CisJY29uc3QgaW50IE5ld0RhdGFncmFtRGF0YVNpemUgPSBGcmFtZVNpemUgLSBOZXdEYXRhZ3JhbUhlYWRlclNpemU7CisJY29uc3QgaW50IENvbnREYXRhZ3JhbUhlYWRlclNraXAgPSA3OworCWNvbnN0IGludCBDb250RGF0YWdyYW1IZWFkZXJTaXplID0gQ29udERhdGFncmFtSGVhZGVyU2tpcCArIDE7CisJY29uc3QgaW50IENvbnREYXRhZ3JhbURhdGFTaXplID0gRnJhbWVTaXplIC0gQ29udERhdGFncmFtSGVhZGVyU2l6ZTsKKwljb25zdCBpbnQgVHJhaWxlclNpemUgPSA0OworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpbnN3KGlvYWRkciwgKHVuc2lnbmVkIHNob3J0Kikgc3QsIDEpOworI2lmZGVmIFhYWERFQlVHCitwcmludGsoImNtMDogcmVjZWl2ZWQ6ICUwMnggJTAyeFxuIiwgc3RbMF0sIHN0WzFdKTsKKyNlbmRpZiAvKiBYWFhERUJVRyAqLworCWxwLT5yeF9mcmFtZXMrKzsKKworCS8qIGRlY2lkZSBpZiBpdCBpcyBhIGdvb2Qgb3IgYmFkIGZyYW1lICovCisJZm9yIChucyA9IDA7IG5zIDwgTlBJRFM7IG5zKyspIHsKKwkJc2Vzc2lvbl9pZCA9IGxwLT5yeF9zZXNzaW9uX2lkW25zXTsKKwkJZnJhbWVfaWQgPSBscC0+cnhfZnJhbWVfaWRbbnNdOworCQlpZiAoc3RbMF0gPT0gc2Vzc2lvbl9pZCkgeworCQkJaWYgKHN0WzFdID09IGZyYW1lX2lkIHx8ICghZnJhbWVfaWQgJiYgKHN0WzFdICYgMHhmMCkgPT0gMHgzMCkpIHsKKwkJCQlnb3RvIGdvb2RfZnJhbWU7CisJCQl9IGVsc2UgaWYgKChzdFsxXSAmIDB4ZjApID09IDB4MzAgJiYgKHN0WzBdICYgMHg0MCkpIHsKKwkJCQlnb3RvIHNraXBwZWRfZnJhbWU7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gYmFkX2ZyYW1lOworCQkJfQorCQl9IGVsc2UgaWYgKHN0WzBdID09IChzZXNzaW9uX2lkIHwgMHg0MCkpIHsKKwkJCWlmICgoc3RbMV0gJiAweGYwKSA9PSAweDMwKSB7CisJCQkJZ290byBza2lwcGVkX2ZyYW1lOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIGJhZF9mcmFtZTsKKwkJCX0KKwkJfQorCX0KKwlnb3RvIGJhZF9mcmFtZTsKKworc2tpcHBlZF9mcmFtZToKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJc2tiID0gbHAtPnJ4X3NrYltuc107CisJaWYgKHNiMTAwMF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtaXNzaW5nIGZyYW1lKHMpOiBnb3QgJTAyeCAlMDJ4ICIKKwkJCSJleHBlY3RpbmcgJTAyeCAlMDJ4XG4iLCBkZXYtPm5hbWUsIHN0WzBdLCBzdFsxXSwKKwkJCXNrYiA/IHNlc3Npb25faWQgOiBzZXNzaW9uX2lkIHwgMHg0MCwgZnJhbWVfaWQpOworCWlmIChza2IpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlza2IgPSBOVUxMOworCX0KKworZ29vZF9mcmFtZToKKwlscC0+cnhfZnJhbWVfaWRbbnNdID0gMHgzMCB8ICgoc3RbMV0gKyAxKSAmIDB4MGYpOworCS8qIG5ldyBkYXRhZ3JhbSAqLworCWlmIChzdFswXSAmIDB4NDApIHsKKwkJLyogZ2V0IGRhdGEgbGVuZ3RoICovCisJCWluc3coaW9hZGRyLCBidWZmZXIsIE5ld0RhdGFncmFtSGVhZGVyU2l6ZSAvIDIpOworI2lmZGVmIFhYWERFQlVHCitwcmludGsoImNtMDogSVAgaWRlbnRpZmljYXRpb246ICUwMnglMDJ4ICBmcmFnbWVudCBvZmZzZXQ6ICUwMnglMDJ4XG4iLCBidWZmZXJbMzBdLCBidWZmZXJbMzFdLCBidWZmZXJbMzJdLCBidWZmZXJbMzNdKTsKKyNlbmRpZiAvKiBYWFhERUJVRyAqLworCQlpZiAoYnVmZmVyWzBdICE9IE5ld0RhdGFncmFtSGVhZGVyU2tpcCkgeworCQkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5ldyBkYXRhZ3JhbSBoZWFkZXIgc2tpcCBlcnJvcjogIgorCQkJCQkiZ290ICUwMnggZXhwZWN0aW5nICUwMnhcbiIsIGRldi0+bmFtZSwgYnVmZmVyWzBdLAorCQkJCQlOZXdEYXRhZ3JhbUhlYWRlclNraXApOworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWluc3coaW9hZGRyLCBidWZmZXIsIE5ld0RhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJCWdvdG8gYmFkX2ZyYW1lX25leHQ7CisJCX0KKwkJZGxlbiA9ICgoYnVmZmVyW05ld0RhdGFncmFtSGVhZGVyU2tpcCArIDNdICYgMHgwZikgPDwgOCB8CisJCQlidWZmZXJbTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgNF0pIC0gMTc7CisJCWlmIChkbGVuID4gU0IxMDAwX01SVSkgeworCQkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRhdGFncmFtIGxlbmd0aCAoJWQpIGdyZWF0ZXIgIgorCQkJCQkidGhhbiBNUlUgKCVkKVxuIiwgZGV2LT5uYW1lLCBkbGVuLCBTQjEwMDBfTVJVKTsKKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBOZXdEYXRhZ3JhbURhdGFTaXplIC8gMik7CisJCQlnb3RvIGJhZF9mcmFtZV9uZXh0OworCQl9CisJCWxwLT5yeF9kbGVuW25zXSA9IGRsZW47CisJCS8qIGNvbXB1dGUgc2l6ZSB0byBhbGxvY2F0ZSBmb3IgZGF0YWdyYW0gKi8KKwkJc2tic2l6ZSA9IGRsZW4gKyBGcmFtZVNpemU7CisJCWlmICgoc2tiID0gYWxsb2Nfc2tiKHNrYnNpemUsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXMgbG9uZyAiCisJCQkJCSJza2J1ZmZcbiIsIGRldi0+bmFtZSwgc2tic2l6ZSk7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgTmV3RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQkJZ290byBkcm9wcGVkX2ZyYW1lOworCQl9CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSAodW5zaWduZWQgc2hvcnQpIGJ1ZmZlcltOZXdEYXRhZ3JhbUhlYWRlclNraXAgKyAxNl07CisJCWluc3coaW9hZGRyLCBza2JfcHV0KHNrYiwgTmV3RGF0YWdyYW1EYXRhU2l6ZSksCisJCQlOZXdEYXRhZ3JhbURhdGFTaXplIC8gMik7CisJCWxwLT5yeF9za2JbbnNdID0gc2tiOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbnVhdGlvbiBvZiBwcmV2aW91cyBkYXRhZ3JhbSAqLworCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBDb250RGF0YWdyYW1IZWFkZXJTaXplIC8gMik7CisJCWlmIChidWZmZXJbMF0gIT0gQ29udERhdGFncmFtSGVhZGVyU2tpcCkgeworCQkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvbnQgZGF0YWdyYW0gaGVhZGVyIHNraXAgZXJyb3I6ICIKKwkJCQkJImdvdCAlMDJ4IGV4cGVjdGluZyAlMDJ4XG4iLCBkZXYtPm5hbWUsIGJ1ZmZlclswXSwKKwkJCQkJQ29udERhdGFncmFtSGVhZGVyU2tpcCk7CisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgQ29udERhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJCWdvdG8gYmFkX2ZyYW1lX25leHQ7CisJCX0KKwkJc2tiID0gbHAtPnJ4X3NrYltuc107CisJCWluc3coaW9hZGRyLCBza2JfcHV0KHNrYiwgQ29udERhdGFncmFtRGF0YVNpemUpLAorCQkJQ29udERhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJZGxlbiA9IGxwLT5yeF9kbGVuW25zXTsKKwl9CisJaWYgKHNrYi0+bGVuIDwgZGxlbiArIFRyYWlsZXJTaXplKSB7CisJCWxwLT5yeF9zZXNzaW9uX2lkW25zXSAmPSB+MHg0MDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGF0YWdyYW0gY29tcGxldGVkOiBzZW5kIHRvIHVwcGVyIGxldmVsICovCisJc2tiX3RyaW0oc2tiLCBkbGVuKTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc3RhdHMtPnJ4X2J5dGVzKz1kbGVuOworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJbHAtPnJ4X3NrYltuc10gPSBOVUxMOworCWxwLT5yeF9zZXNzaW9uX2lkW25zXSB8PSAweDQwOworCXJldHVybiAwOworCitiYWRfZnJhbWU6CisJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgRnJhbWVTaXplIC8gMik7CisJaWYgKHNiMTAwMF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmFtZSBlcnJvcjogZ290ICUwMnggJTAyeFxuIiwKKwkJCWRldi0+bmFtZSwgc3RbMF0sIHN0WzFdKTsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CitiYWRfZnJhbWVfbmV4dDoKKwlpZiAoc2IxMDAwX2RlYnVnID4gMikKKwkJc2IxMDAwX3ByaW50X3N0YXR1c19idWZmZXIoZGV2LT5uYW1lLCBzdCwgYnVmZmVyLCBGcmFtZVNpemUpOworZHJvcHBlZF9mcmFtZToKKwlzdGF0cy0+cnhfZXJyb3JzKys7CisJaWYgKG5zIDwgTlBJRFMpIHsKKwkJaWYgKChza2IgPSBscC0+cnhfc2tiW25zXSkpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWxwLT5yeF9za2JbbnNdID0gTlVMTDsKKwkJfQorCQlscC0+cnhfc2Vzc2lvbl9pZFtuc10gfD0gMHg0MDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NiMTAwMF9lcnJvcl9kcGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGNoYXIgc3RbNV07CisJaW50IGlvYWRkclsyXTsKKwlzdHJ1Y3Qgc2IxMDAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IGludCBFcnJvckRwY0NvdW50ZXJJbml0aWFsaXplID0gMjAwOworCisJaW9hZGRyWzBdID0gZGV2LT5iYXNlX2FkZHI7CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlpb2FkZHJbMV0gPSBkZXYtPm1lbV9zdGFydDsKKwluYW1lID0gZGV2LT5uYW1lOworCisJc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGlvYWRkciwgbmFtZSk7CisJc2IxMDAwX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwKTsKKwlzYjEwMDBfd2FpdF9mb3JfcmVhZHkoaW9hZGRyLCBuYW1lKTsKKwlzYjEwMDBfcmVhZF9zdGF0dXMoaW9hZGRyLCBzdCk7CisJaWYgKHN0WzFdICYgMHgxMCkKKwkJbHAtPnJ4X2Vycm9yX2RwY19jb3VudCA9IEVycm9yRHBjQ291bnRlckluaXRpYWxpemU7CisJcmV0dXJuOworfQorCisMCisvKgorICogTGludXggaW50ZXJmYWNlIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50CitzYjEwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoYXIgKm5hbWU7CisJaW50IGlvYWRkclsyXSwgc3RhdHVzOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHVuc2lnbmVkIHNob3J0IEZpcm13YXJlVmVyc2lvbltdID0gezB4MDEsIDB4MDF9OworCisJaW9hZGRyWzBdID0gZGV2LT5iYXNlX2FkZHI7CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlpb2FkZHJbMV0gPSBkZXYtPm1lbV9zdGFydDsKKwluYW1lID0gZGV2LT5uYW1lOworCisJLyogaW5pdGlhbGl6ZSBzYjEwMDAgKi8KKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9yZXNldChpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwluaWNlZGVsYXkoMjAwMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9jaGVja19DUkMoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBpbml0aWFsaXplIHByaXZhdGUgZGF0YSBiZWZvcmUgYm9hcmQgY2FuIGNhdGNoIGludGVycnVwdHMgKi8KKwlscC0+cnhfc2tiWzBdID0gTlVMTDsKKwlscC0+cnhfc2tiWzFdID0gTlVMTDsKKwlscC0+cnhfc2tiWzJdID0gTlVMTDsKKwlscC0+cnhfc2tiWzNdID0gTlVMTDsKKwlscC0+cnhfZGxlblswXSA9IDA7CisJbHAtPnJ4X2RsZW5bMV0gPSAwOworCWxwLT5yeF9kbGVuWzJdID0gMDsKKwlscC0+cnhfZGxlblszXSA9IDA7CisJbHAtPnJ4X2ZyYW1lcyA9IDA7CisJbHAtPnJ4X2Vycm9yX2NvdW50ID0gMDsKKwlscC0+cnhfZXJyb3JfZHBjX2NvdW50ID0gMDsKKwlscC0+cnhfc2Vzc2lvbl9pZFswXSA9IDB4NTA7CisJbHAtPnJ4X3Nlc3Npb25faWRbMF0gPSAweDQ4OworCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg0NDsKKwlscC0+cnhfc2Vzc2lvbl9pZFswXSA9IDB4NDI7CisJbHAtPnJ4X2ZyYW1lX2lkWzBdID0gMDsKKwlscC0+cnhfZnJhbWVfaWRbMV0gPSAwOworCWxwLT5yeF9mcmFtZV9pZFsyXSA9IDA7CisJbHAtPnJ4X2ZyYW1lX2lkWzNdID0gMDsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzYjEwMDBfaW50ZXJydXB0LCAwLCAic2IxMDAwIiwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcGVuaW5nLCBJUlEgJWRcbiIsIG5hbWUsIGRldi0+aXJxKTsKKworCS8qIEFjdGl2YXRlIGJvYXJkIGFuZCBjaGVjayBmaXJtd2FyZSB2ZXJzaW9uICovCisJdWRlbGF5KDEwMDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX2FjdGl2YXRlKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCXVkZWxheSgwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9nZXRfZmlybXdhcmVfdmVyc2lvbihpb2FkZHIsIG5hbWUsIHZlcnNpb24sIDApKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAodmVyc2lvblswXSAhPSBGaXJtd2FyZVZlcnNpb25bMF0gfHwgdmVyc2lvblsxXSAhPSBGaXJtd2FyZVZlcnNpb25bMV0pCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmb3VuZCBmaXJtd2FyZSB2ZXJzaW9uICV4LiUwMnggIgorCQkJIihzaG91bGQgYmUgJXguJTAyeClcbiIsIG5hbWUsIHZlcnNpb25bMF0sIHZlcnNpb25bMV0sCisJCQlGaXJtd2FyZVZlcnNpb25bMF0sIEZpcm13YXJlVmVyc2lvblsxXSk7CisKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CQkJCQkvKiBBbHdheXMgc3VjY2VlZCAqLworfQorCitzdGF0aWMgaW50IHNiMTAwMF9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJY2hhciogbmFtZTsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb25bMl07CisJc2hvcnQgUElEWzRdOworCWludCBpb2FkZHJbMl0sIHN0YXR1cywgZnJlcXVlbmN5OworCXVuc2lnbmVkIGludCBzdGF0c1s1XTsKKwlzdHJ1Y3Qgc2IxMDAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKGRldiAmJiBkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dDTVNUQVRTOgkJLyogZ2V0IHN0YXRpc3RpY3MgKi8KKwkJc3RhdHNbMF0gPSBscC0+c3RhdHMucnhfYnl0ZXM7CisJCXN0YXRzWzFdID0gbHAtPnJ4X2ZyYW1lczsKKwkJc3RhdHNbMl0gPSBscC0+c3RhdHMucnhfcGFja2V0czsKKwkJc3RhdHNbM10gPSBscC0+c3RhdHMucnhfZXJyb3JzOworCQlzdGF0c1s0XSA9IGxwLT5zdGF0cy5yeF9kcm9wcGVkOworCQlpZihjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgc3RhdHMsIHNpemVvZihzdGF0cykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN0YXR1cyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0NNRklSTVdBUkU6CQkvKiBnZXQgZmlybXdhcmUgdmVyc2lvbiAqLworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9nZXRfZmlybXdhcmVfdmVyc2lvbihpb2FkZHIsIG5hbWUsIHZlcnNpb24sIDEpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWlmKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0NNRlJFUVVFTkNZOgkJLyogZ2V0IGZyZXF1ZW5jeSAqLworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9nZXRfZnJlcXVlbmN5KGlvYWRkciwgbmFtZSwgJmZyZXF1ZW5jeSkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYocHV0X3VzZXIoZnJlcXVlbmN5LCAoaW50IF9fdXNlciAqKSBpZnItPmlmcl9kYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NDTUZSRVFVRU5DWToJCS8qIHNldCBmcmVxdWVuY3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYoZ2V0X3VzZXIoZnJlcXVlbmN5LCAoaW50IF9fdXNlciAqKSBpZnItPmlmcl9kYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zZXRfZnJlcXVlbmN5KGlvYWRkciwgbmFtZSwgZnJlcXVlbmN5KSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dDTVBJRFM6CQkJLyogZ2V0IFBJRHMgKi8KKwkJaWYgKChzdGF0dXMgPSBzYjEwMDBfZ2V0X1BJRHMoaW9hZGRyLCBuYW1lLCBQSUQpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWlmKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBQSUQsIHNpemVvZihQSUQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NDTVBJRFM6CQkJLyogc2V0IFBJRHMgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYoY29weV9mcm9tX3VzZXIoUElELCBpZnItPmlmcl9kYXRhLCBzaXplb2YoUElEKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKChzdGF0dXMgPSBzYjEwMDBfc2V0X1BJRHMoaW9hZGRyLCBuYW1lLCBQSUQpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCS8qIHNldCBzZXNzaW9uX2lkLCBmcmFtZV9pZCBhbmQgcGt0X3R5cGUgdG9vICovCisJCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg1MCB8IChQSURbMF0gJiAweDBmKTsKKwkJbHAtPnJ4X3Nlc3Npb25faWRbMV0gPSAweDQ4OworCQlscC0+cnhfc2Vzc2lvbl9pZFsyXSA9IDB4NDQ7CisJCWxwLT5yeF9zZXNzaW9uX2lkWzNdID0gMHg0MjsKKwkJbHAtPnJ4X2ZyYW1lX2lkWzBdID0gMDsKKwkJbHAtPnJ4X2ZyYW1lX2lkWzFdID0gMDsKKwkJbHAtPnJ4X2ZyYW1lX2lkWzJdID0gMDsKKwkJbHAtPnJ4X2ZyYW1lX2lkWzNdID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogdHJhbnNtaXQgZnVuY3Rpb246IGRvIG5vdGhpbmcgc2luY2UgU0IxMDAwIGNhbid0IHNlbmQgYW55dGhpbmcgb3V0ICovCitzdGF0aWMgaW50CitzYjEwMDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cnlpbmcgdG8gdHJhbnNtaXQhISFcbiIsIGRldi0+bmFtZSk7CisJLyogc2IxMDAwIGNhbid0IHhtaXQgZGF0YWdyYW1zICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKiBTQjEwMDAgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2IxMDAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgY2hhciBzdDsKKwlpbnQgaW9hZGRyWzJdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDJjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQxWzZdID0gezB4ODAsIDB4MmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IGludCBNYXhSeEVycm9yQ291bnQgPSA2OworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2IxMDAwX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwKKwkJCWlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwkvKiBpcyBpdCBhIGdvb2QgaW50ZXJydXB0PyAqLworCXN0ID0gaW5iKGlvYWRkclsxXSArIDYpOworCWlmICghKHN0ICYgMHgwOCAmJiBzdCAmIDB4MjApKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBpbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisKKwlzdCA9IGluYihpb2FkZHJbMF0gKyA3KTsKKwlpZiAoc2IxMDAwX3J4KGRldikpCisJCWxwLT5yeF9lcnJvcl9jb3VudCsrOworI2lmZGVmIFNCMTAwMF9ERUxBWQorCXVkZWxheShTQjEwMDBfREVMQVkpOworI2VuZGlmIC8qIFNCMTAwMF9ERUxBWSAqLworCXNiMTAwMF9pc3N1ZV9yZWFkX2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKKwlpZiAoc3QgJiAweDAxKSB7CisJCXNiMTAwMF9lcnJvcl9kcGMoZGV2KTsKKwkJc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworCX0KKwlpZiAobHAtPnJ4X2Vycm9yX2RwY19jb3VudCAmJiAhKC0tbHAtPnJ4X2Vycm9yX2RwY19jb3VudCkpIHsKKwkJc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGlvYWRkciwgbmFtZSk7CisJCXNiMTAwMF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCk7CisJCXNiMTAwMF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUpOworCQlzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJfQorCWlmIChscC0+cnhfZXJyb3JfY291bnQgPj0gTWF4UnhFcnJvckNvdW50KSB7CisJCXNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihpb2FkZHIsIG5hbWUpOworCQlzYjEwMDBfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDEpOworCQlzYjEwMDBfd2FpdF9mb3JfcmVhZHkoaW9hZGRyLCBuYW1lKTsKKwkJc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworCQlscC0+cnhfZXJyb3JfY291bnQgPSAwOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYjEwMDBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2IxMDAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIGludCBzYjEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgaW9hZGRyWzJdOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNiMTAwMF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBzYjEwMDAuXG4iLCBkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlvYWRkclswXSA9IGRldi0+YmFzZV9hZGRyOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJaW9hZGRyWzFdID0gZGV2LT5tZW1fc3RhcnQ7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkvKiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB3ZSBjYW4ndCByZS1pbnNtb2QgaXQgbGF0ZXIuICovCisJcmVsZWFzZV9yZWdpb24oaW9hZGRyWzFdLCBTQjEwMDBfSU9fRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMF0sIFNCMTAwMF9JT19FWFRFTlQpOworCisJLyogZnJlZSByeF9za2IncyBpZiBuZWVkZWQgKi8KKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJaWYgKGxwLT5yeF9za2JbaV0pIHsKKwkJCWRldl9rZnJlZV9za2IobHAtPnJ4X3NrYltpXSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyYW5jbyBWZW50dXJpIDxmdmVudHVyaUBtZWRpYW9uZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyYWwgSW5zdHJ1bWVudHMgU0IxMDAwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdAorc2IxMDAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmc2IxMDAwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorc2IxMDAwX2V4aXQodm9pZCkKK3sKKwlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJnNiMTAwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYjEwMDBfaW5pdCk7Cittb2R1bGVfZXhpdChzYjEwMDBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyZTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpAQCAtMCwwICsxLDI5MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIEJyb2FkY29tIFNpQnl0ZSBTT0MgYnVpbHQtaW4KKyAqIEV0aGVybmV0IGNvbnRyb2xsZXJzLiBXcml0dGVuIGJ5IE1pdGNoIExpY2h0ZW5iZXJnIGF0IEJyb2FkY29tIENvcnAuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKy8qIFRoaXMgaXMgb25seSBoZXJlIHVudGlsIHRoZSBmaXJtd2FyZSBpcyByZWFkeS4gIEluIHRoYXQgY2FzZSwKKyAgIHRoZSBmaXJtd2FyZSBsZWF2ZXMgdGhlIGV0aGVybmV0IGFkZHJlc3MgaW4gdGhlIHJlZ2lzdGVyIGZvciB1cy4gKi8KKyNpZmRlZiBDT05GSUdfU0lCWVRFX1NUQU5EQUxPTkUKKyNkZWZpbmUgU0JNQUNfRVRIMF9IV0FERFIgIjQwOjAwOjAwOjAwOjAxOjAwIgorI2RlZmluZSBTQk1BQ19FVEgxX0hXQUREUiAiNDA6MDA6MDA6MDA6MDE6MDEiCisjZGVmaW5lIFNCTUFDX0VUSDJfSFdBRERSICI0MDowMDowMDowMDowMTowMiIKKyNlbmRpZgorCisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCisjaWYgMAorc3RhdGljIGNoYXIgdmVyc2lvbjFbXSBfX2RldmluaXRkYXRhID0KKyJzYjEyNTAtbWFjLmM6MS4wMCAxLzExLzIwMDEgV3JpdHRlbiBieSBNaXRjaCBMaWNodGVuYmVyZ1xuIjsKKyNlbmRpZgorCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworI2RlZmluZSBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKworI2RlZmluZSBNQVhfVU5JVFMgMwkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworCitNT0RVTEVfQVVUSE9SKCJNaXRjaCBMaWNodGVuYmVyZyAoQnJvYWRjb20gQ29ycC4pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIFNpQnl0ZSBTT0MgR0IgRXRoZXJuZXQgZHJpdmVyIik7CisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlcgorICAgbW9kdWxlIGlzIGxvYWRlZC4gKi8KKworLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworc3RhdGljIGludCBkZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbWVzc2FnZXMiKTsKKworLyogbWlpIHN0YXR1cyBtc2dzICovCitzdGF0aWMgaW50IG5vaXN5X21paSA9IDE7Cittb2R1bGVfcGFyYW0obm9pc3lfbWlpLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhub2lzeV9taWksICJNSUkgc3RhdHVzIG1lc3NhZ2VzIik7CisKKy8qIFVzZWQgdG8gcGFzcyB0aGUgbWVkaWEgdHlwZSwgZXRjLgorICAgQm90aCAnb3B0aW9uc1tdJyBhbmQgJ2Z1bGxfZHVwbGV4W10nIHNob3VsZCBleGlzdCBmb3IgZHJpdmVyCisgICBpbnRlcm9wZXJhYmlsaXR5LgorICAgVGhlIG1lZGlhIHR5cGUgaXMgdXN1YWxseSBwYXNzZWQgaW4gJ29wdGlvbnNbXScuCisqLworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMX07Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1VOSVRTKSk7CisKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xfTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9VTklUUykpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKK3N0YXRpYyBpbnQgaW50X3BrdGNudCA9IDA7Cittb2R1bGVfcGFyYW0oaW50X3BrdGNudCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50X3BrdGNudCwgIlBhY2tldCBjb3VudCIpOworCitzdGF0aWMgaW50IGludF90aW1lb3V0ID0gMDsKK21vZHVsZV9wYXJhbShpbnRfdGltZW91dCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50X3RpbWVvdXQsICJUaW1lb3V0IHZhbHVlIik7CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9tYWMuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9pbnQuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9zY2QuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNpbXBsZSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzYm1hY19wb3J0X3Q7CisKK3R5cGVkZWYgZW51bSB7IHNibWFjX3NwZWVkX2F1dG8sIHNibWFjX3NwZWVkXzEwLAorCSAgICAgICBzYm1hY19zcGVlZF8xMDAsIHNibWFjX3NwZWVkXzEwMDAgfSBzYm1hY19zcGVlZF90OworCit0eXBlZGVmIGVudW0geyBzYm1hY19kdXBsZXhfYXV0bywgc2JtYWNfZHVwbGV4X2hhbGYsCisJICAgICAgIHNibWFjX2R1cGxleF9mdWxsIH0gc2JtYWNfZHVwbGV4X3Q7CisKK3R5cGVkZWYgZW51bSB7IHNibWFjX2ZjX2F1dG8sIHNibWFjX2ZjX2Rpc2FibGVkLCBzYm1hY19mY19mcmFtZSwKKwkgICAgICAgc2JtYWNfZmNfY29sbGlzaW9uLCBzYm1hY19mY19jYXJyaWVyIH0gc2JtYWNfZmNfdDsKKwordHlwZWRlZiBlbnVtIHsgc2JtYWNfc3RhdGVfdW5pbml0LCBzYm1hY19zdGF0ZV9vZmYsIHNibWFjX3N0YXRlX29uLCAKKwkgICAgICAgc2JtYWNfc3RhdGVfYnJva2VuIH0gc2JtYWNfc3RhdGVfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKyNkZWZpbmUgU0JETUFfTkVYVEJVRihkLGYpICgoKChkKS0+ZisxKSA9PSAoZCktPnNiZG1hX2RzY3J0YWJsZV9lbmQpID8gXAorCQkJICAoZCktPnNiZG1hX2RzY3J0YWJsZSA6IChkKS0+ZisxKQorCisKKyNkZWZpbmUgTlVNQ0FDSEVCTEtTKHgpICgoKHgpK1NNUF9DQUNIRV9CWVRFUy0xKS9TTVBfQ0FDSEVfQllURVMpCisKKyNkZWZpbmUgU0JNQUNfUkVBRENTUih0KQlfX3Jhd19yZWFkcSgodW5zaWduZWQgbG9uZyl0KQorI2RlZmluZSBTQk1BQ19XUklURUNTUih0LHYpCV9fcmF3X3dyaXRlcSh2LCAodW5zaWduZWQgbG9uZyl0KQorIAorCisjZGVmaW5lIFNCTUFDX01BWF9UWERFU0NSCTMyCisjZGVmaW5lIFNCTUFDX01BWF9SWERFU0NSCTMyCisKKyNkZWZpbmUgRVRIRVJfQUxJR04JMgorI2RlZmluZSBFVEhFUl9BRERSX0xFTgk2CisjZGVmaW5lIEVORVRfUEFDS0VUX1NJWkUJMTUxOCAKKy8qI2RlZmluZSBFTkVUX1BBQ0tFVF9TSVpFCTkyMTYgKi8gCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRE1BIERlc2NyaXB0b3Igc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3R5cGVkZWYgc3RydWN0IHNiZG1hZHNjcl9zIHsKKwl1aW50NjRfdCAgZHNjcl9hOworCXVpbnQ2NF90ICBkc2NyX2I7Cit9IHNiZG1hZHNjcl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGFkZHJfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBETUEgQ29udHJvbGxlciBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2JtYWNkbWFfcyB7CisJCisJLyogCisJICogVGhpcyBzdHVmZiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjaGFubmVsIGFuZCB0aGUgcmVnaXN0ZXJzCisJICogYXNzb2NpYXRlZCB3aXRoIGl0LgorCSAqLworCQorCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2JkbWFfZXRoOwkgICAgICAgIC8qIGJhY2sgcG9pbnRlciB0byBhc3NvY2lhdGVkIE1BQyAqLworCWludCAgICAgICAgICAgICAgc2JkbWFfY2hhbm5lbDsJLyogY2hhbm5lbCBudW1iZXIgKi8KKwlpbnQJCSBzYmRtYV90eGRpcjsgICAgICAgLyogZGlyZWN0aW9uICgxPXRyYW5zbWl0KSAqLworCWludAkJIHNiZG1hX21heGRlc2NyOwkvKiB0b3RhbCAjIG9mIGRlc2NyaXB0b3JzIGluIHJpbmcgKi8KKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwlpbnQJCSBzYmRtYV9pbnRfcGt0Y250OyAgLyogIyBkZXNjcmlwdG9ycyByeC90eCBiZWZvcmUgaW50ZXJydXB0Ki8KKwlpbnQJCSBzYmRtYV9pbnRfdGltZW91dDsgLyogIyB1c2VjIHJ4L3R4IGludGVycnVwdCAqLworI2VuZGlmCisKKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2NvbmZpZzA7CS8qIERNQSBjb25maWcgcmVnaXN0ZXIgMCAqLworCXNibWFjX3BvcnRfdCAgICAgc2JkbWFfY29uZmlnMTsJLyogRE1BIGNvbmZpZyByZWdpc3RlciAxICovCisJc2JtYWNfcG9ydF90ICAgICBzYmRtYV9kc2NyYmFzZTsJLyogRGVzY3JpcHRvciBiYXNlIGFkZHJlc3MgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2RzY3JjbnQ7ICAgICAvKiBEZXNjcmlwdG9yIGNvdW50IHJlZ2lzdGVyICovCisJc2JtYWNfcG9ydF90ICAgICBzYmRtYV9jdXJkc2NyOwkvKiBjdXJyZW50IGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQorCS8qCisJICogVGhpcyBzdHVmZiBpcyBmb3IgbWFpbnRlbmFuY2Ugb2YgdGhlIHJpbmcKKwkgKi8KKwkKKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2RzY3J0YWJsZTsJLyogYmFzZSBvZiBkZXNjcmlwdG9yIHRhYmxlICovCisJc2JkbWFkc2NyX3QgICAgICpzYmRtYV9kc2NydGFibGVfZW5kOyAvKiBlbmQgb2YgZGVzY3JpcHRvciB0YWJsZSAqLworCQorCXN0cnVjdCBza19idWZmICoqc2JkbWFfY3R4dGFibGU7ICAgIC8qIGNvbnRleHQgdGFibGUsIG9uZSBwZXIgZGVzY3IgKi8KKwkKKwlwYWRkcl90ICAgICAgICAgIHNiZG1hX2RzY3J0YWJsZV9waHlzOyAvKiBhbmQgYWxzbyB0aGUgcGh5cyBhZGRyICovCisJc2JkbWFkc2NyX3QgICAgICpzYmRtYV9hZGRwdHI7CS8qIG5leHQgZHNjciBmb3Igc3cgdG8gYWRkICovCisJc2JkbWFkc2NyX3QgICAgICpzYmRtYV9yZW1wdHI7CS8qIG5leHQgZHNjciBmb3Igc3cgdG8gcmVtb3ZlICovCit9IHNibWFjZG1hX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFdGhlcm5ldCBzb2Z0YyBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RydWN0IHNibWFjX3NvZnRjIHsKKwkKKwkvKgorCSAqIExpbnV4LXNwZWNpZmljIHRoaW5ncworCSAqLworCQorCXN0cnVjdCBuZXRfZGV2aWNlICpzYm1fZGV2OwkJLyogcG9pbnRlciB0byBsaW51eCBkZXZpY2UgKi8KKwlzcGlubG9ja190IHNibV9sb2NrOwkJLyogc3BpbiBsb2NrICovCisJc3RydWN0IHRpbWVyX2xpc3Qgc2JtX3RpbWVyOyAgICAgCS8qIGZvciBtb25pdG9yaW5nIE1JSSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHNibV9zdGF0czsgCisJaW50IHNibV9kZXZmbGFnczsJCQkvKiBjdXJyZW50IGRldmljZSBmbGFncyAqLworCisJaW50CSAgICAgc2JtX3BoeV9vbGRibXNyOworCWludAkgICAgIHNibV9waHlfb2xkYW5scGFyOworCWludAkgICAgIHNibV9waHlfb2xkazFzdHNyOworCWludAkgICAgIHNibV9waHlfb2xkbGlua3N0YXQ7CisJaW50IHNibV9idWZmZXJzaXplOworCQorCXVuc2lnbmVkIGNoYXIgc2JtX3BoeXNbMl07CisJCisJLyoKKwkgKiBDb250cm9sbGVyLXNwZWNpZmljIHRoaW5ncworCSAqLworCQorCXVuc2lnbmVkIGxvbmcJc2JtX2Jhc2U7ICAgICAgICAgIC8qIE1BQydzIGJhc2UgYWRkcmVzcyAqLworCXNibWFjX3N0YXRlX3QgICAgc2JtX3N0YXRlOyAgICAgICAgIC8qIGN1cnJlbnQgc3RhdGUgKi8KKwkKKwlzYm1hY19wb3J0X3QgICAgIHNibV9tYWNlbmFibGU7CS8qIE1BQyBFbmFibGUgUmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9tYWNjZmc7CS8qIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJc2JtYWNfcG9ydF90ICAgICBzYm1fZmlmb2NmZzsJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJc2JtYWNfcG9ydF90ICAgICBzYm1fZnJhbWVjZmc7CS8qIEZyYW1lIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9yeGZpbHRlcjsJLyogcmVjZWl2ZSBmaWx0ZXIgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9pc3I7CQkvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisJc2JtYWNfcG9ydF90ICAgICBzYm1faW1yOwkJLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9tZGlvOwkJLyogTURJTyByZWdpc3RlciAqLworCQorCXNibWFjX3NwZWVkX3QgICAgc2JtX3NwZWVkOwkJLyogY3VycmVudCBzcGVlZCAqLworCXNibWFjX2R1cGxleF90ICAgc2JtX2R1cGxleDsJLyogY3VycmVudCBkdXBsZXggKi8KKwlzYm1hY19mY190ICAgICAgIHNibV9mYzsJCS8qIGN1cnJlbnQgZmxvdyBjb250cm9sIHNldHRpbmcgKi8KKwkKKwl1bnNpZ25lZCBjaGFyICAgIHNibV9od2FkZHJbRVRIRVJfQUREUl9MRU5dOworCQorCXNibWFjZG1hX3QgICAgICAgc2JtX3R4ZG1hOwkJLyogZm9yIG5vdywgb25seSB1c2UgY2hhbm5lbCAwICovCisJc2JtYWNkbWFfdCAgICAgICBzYm1fcnhkbWE7CisJaW50ICAgICAgICAgICAgICByeF9od19jaGVja3N1bTsKKwlpbnQgCQkgc2JlX2lkeDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFeHRlcm5zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYmRtYV9pbml0Y3R4KHNibWFjZG1hX3QgKmQsCisJCQkgIHN0cnVjdCBzYm1hY19zb2Z0YyAqcywKKwkJCSAgaW50IGNoYW4sCisJCQkgIGludCB0eHJ4LAorCQkJICBpbnQgbWF4ZGVzY3IpOworc3RhdGljIHZvaWQgc2JkbWFfY2hhbm5lbF9zdGFydChzYm1hY2RtYV90ICpkLCBpbnQgcnh0eCk7CitzdGF0aWMgaW50IHNiZG1hX2FkZF9yY3ZidWZmZXIoc2JtYWNkbWFfdCAqZCxzdHJ1Y3Qgc2tfYnVmZiAqbSk7CitzdGF0aWMgaW50IHNiZG1hX2FkZF90eGJ1ZmZlcihzYm1hY2RtYV90ICpkLHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyB2b2lkIHNiZG1hX2VtcHR5cmluZyhzYm1hY2RtYV90ICpkKTsKK3N0YXRpYyB2b2lkIHNiZG1hX2ZpbGxyaW5nKHNibWFjZG1hX3QgKmQpOworc3RhdGljIHZvaWQgc2JkbWFfcnhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQpOworc3RhdGljIHZvaWQgc2JkbWFfdHhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQpOworc3RhdGljIGludCBzYm1hY19pbml0Y3R4KHN0cnVjdCBzYm1hY19zb2Z0YyAqcyk7CitzdGF0aWMgdm9pZCBzYm1hY19jaGFubmVsX3N0YXJ0KHN0cnVjdCBzYm1hY19zb2Z0YyAqcyk7CitzdGF0aWMgdm9pZCBzYm1hY19jaGFubmVsX3N0b3Aoc3RydWN0IHNibWFjX3NvZnRjICpzKTsKK3N0YXRpYyBzYm1hY19zdGF0ZV90IHNibWFjX3NldF9jaGFubmVsX3N0YXRlKHN0cnVjdCBzYm1hY19zb2Z0YyAqLHNibWFjX3N0YXRlX3QpOworc3RhdGljIHZvaWQgc2JtYWNfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLGludCBvbm9mZik7CitzdGF0aWMgdWludDY0X3Qgc2JtYWNfYWRkcjJyZWcodW5zaWduZWQgY2hhciAqcHRyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYm1hY19pbnRyKGludCBpcnEsdm9pZCAqZGV2X2luc3RhbmNlLHN0cnVjdCBwdF9yZWdzICpyZ3MpOworc3RhdGljIGludCBzYm1hY19zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNibWFjX3NldG11bHRpKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MpOworc3RhdGljIGludCBzYm1hY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZHgpOworc3RhdGljIGludCBzYm1hY19zZXRfc3BlZWQoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX3NwZWVkX3Qgc3BlZWQpOworc3RhdGljIGludCBzYm1hY19zZXRfZHVwbGV4KHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxzYm1hY19kdXBsZXhfdCBkdXBsZXgsc2JtYWNfZmNfdCBmYyk7CisKK3N0YXRpYyBpbnQgc2JtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNibWFjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBzYm1hY190eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2JtYWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2JtYWNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNibWFjX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2JtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNibWFjX21paV9wb2xsKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgbm9pc3kpOworCitzdGF0aWMgdm9pZCBzYm1hY19taWlfc3luYyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpOworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3NlbmRkYXRhKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyx1bnNpZ25lZCBpbnQgZGF0YSwgaW50IGJpdGNudCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNibWFjX21paV9yZWFkKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgcGh5YWRkcixpbnQgcmVnaWR4KTsKK3N0YXRpYyB2b2lkIHNibWFjX21paV93cml0ZShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsaW50IHBoeWFkZHIsaW50IHJlZ2lkeCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVndmFsKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEdsb2JhbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHVpbnQ2NF90IHNibWFjX29yaWdfaHdhZGRyW01BWF9VTklUU107CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBNRElPIGNvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lCU1JSV9DT01NQU5EX1NUQVJUCTB4MDEKKyNkZWZpbmUJTUlJX0NPTU1BTkRfUkVBRAkweDAyCisjZGVmaW5lCU1JSV9DT01NQU5EX1dSSVRFCTB4MDEKKyNkZWZpbmUJTUlJX0NPTU1BTkRfQUNLCQkweDAyCisKKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgMHg4MDAwCisjZGVmaW5lIEJNQ1JfTE9PUEJBQ0sgIDB4NDAwMAorI2RlZmluZSBCTUNSX1NQRUVEMCAgICAweDIwMDAKKyNkZWZpbmUgQk1DUl9BTkVOQUJMRSAgMHgxMDAwCisjZGVmaW5lIEJNQ1JfUE9XRVJET1dOIDB4MDgwMAorI2RlZmluZSBCTUNSX0lTT0xBVEUgICAweDA0MDAKKyNkZWZpbmUgQk1DUl9SRVNUQVJUQU4gMHgwMjAwCisjZGVmaW5lIEJNQ1JfRFVQTEVYICAgIDB4MDEwMAorI2RlZmluZSBCTUNSX0NPTFRFU1QgICAweDAwODAKKyNkZWZpbmUgQk1DUl9TUEVFRDEgICAgMHgwMDQwCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAwCUJNQ1JfU1BFRUQxCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAJQk1DUl9TUEVFRDAKKyNkZWZpbmUgQk1DUl9TUEVFRDEwIAkwCisKKyNkZWZpbmUgQk1TUl8xMDBCVDQJMHg4MDAwCisjZGVmaW5lIEJNU1JfMTAwQlRfRkRYCTB4NDAwMAorI2RlZmluZSBCTVNSXzEwMEJUX0hEWCAgMHgyMDAwCisjZGVmaW5lIEJNU1JfMTBCVF9GRFggICAweDEwMDAKKyNkZWZpbmUgQk1TUl8xMEJUX0hEWCAgIDB4MDgwMAorI2RlZmluZSBCTVNSXzEwMEJUMl9GRFggMHgwNDAwCisjZGVmaW5lIEJNU1JfMTAwQlQyX0hEWCAweDAyMDAKKyNkZWZpbmUgQk1TUl8xMDAwQlRfWFNSCTB4MDEwMAorI2RlZmluZSBCTVNSX1BSRVNVUAkweDAwNDAKKyNkZWZpbmUgQk1TUl9BTkNPTVBMVAkweDAwMjAKKyNkZWZpbmUgQk1TUl9SRU1GQVVMVAkweDAwMTAKKyNkZWZpbmUgQk1TUl9BVVRPTkVHCTB4MDAwOAorI2RlZmluZSBCTVNSX0xJTktTVEFUCTB4MDAwNAorI2RlZmluZSBCTVNSX0pBQkRFVEVDVAkweDAwMDIKKyNkZWZpbmUgQk1TUl9FWFRDQVBBQgkweDAwMDEKKworI2RlZmluZSBQSFlJRFIxIAkweDIwMDAKKyNkZWZpbmUgUEhZSURSMgkJMHg1QzYwCisKKyNkZWZpbmUgQU5BUl9OUAkJMHg4MDAwCisjZGVmaW5lIEFOQVJfUkYJCTB4MjAwMAorI2RlZmluZSBBTkFSX0FTWVBBVVNFCTB4MDgwMAorI2RlZmluZSBBTkFSX1BBVVNFCTB4MDQwMAorI2RlZmluZSBBTkFSX1Q0CQkweDAyMDAKKyNkZWZpbmUgQU5BUl9UWEZECTB4MDEwMAorI2RlZmluZSBBTkFSX1RYSEQJMHgwMDgwCisjZGVmaW5lIEFOQVJfMTBGRAkweDAwNDAKKyNkZWZpbmUgQU5BUl8xMEhECTB4MDAyMAorI2RlZmluZSBBTkFSX1BTQgkweDAwMDEKKworI2RlZmluZSBBTkxQQVJfTlAJMHg4MDAwCisjZGVmaW5lIEFOTFBBUl9BQ0sJMHg0MDAwCisjZGVmaW5lIEFOTFBBUl9SRgkweDIwMDAKKyNkZWZpbmUgQU5MUEFSX0FTWVBBVVNFCTB4MDgwMAorI2RlZmluZSBBTkxQQVJfUEFVU0UJMHgwNDAwCisjZGVmaW5lIEFOTFBBUl9UNAkweDAyMDAKKyNkZWZpbmUgQU5MUEFSX1RYRkQJMHgwMTAwCisjZGVmaW5lIEFOTFBBUl9UWEhECTB4MDA4MAorI2RlZmluZSBBTkxQQVJfMTBGRAkweDAwNDAKKyNkZWZpbmUgQU5MUEFSXzEwSEQJMHgwMDIwCisjZGVmaW5lIEFOTFBBUl9QU0IJMHgwMDAxCS8qIDgwMi4zICovCisKKyNkZWZpbmUgQU5FUl9QREYJMHgwMDEwCisjZGVmaW5lIEFORVJfTFBOUEFCTEUJMHgwMDA4CisjZGVmaW5lIEFORVJfTlBBQkxFCTB4MDAwNAorI2RlZmluZSBBTkVSX1BBR0VSWAkweDAwMDIKKyNkZWZpbmUgQU5FUl9MUEFOQUJMRQkweDAwMDEKKworI2RlZmluZSBBTk5QVFJfTlAJMHg4MDAwCisjZGVmaW5lIEFOTlBUUl9NUAkweDIwMDAKKyNkZWZpbmUgQU5OUFRSX0FDSzIJMHgxMDAwCisjZGVmaW5lIEFOTlBUUl9UT0dUWAkweDA4MDAKKyNkZWZpbmUgQU5OUFRSX0NPREUJMHgwMDA4CisKKyNkZWZpbmUgQU5OUFJSX05QCTB4ODAwMAorI2RlZmluZSBBTk5QUlJfTVAJMHgyMDAwCisjZGVmaW5lIEFOTlBSUl9BQ0szCTB4MTAwMAorI2RlZmluZSBBTk5QUlJfVE9HVFgJMHgwODAwCisjZGVmaW5lIEFOTlBSUl9DT0RFCTB4MDAwOAorCisjZGVmaW5lIEsxVENSX1RFU1RNT0RFCTB4MDAwMAorI2RlZmluZSBLMVRDUl9NU01DRQkweDEwMDAKKyNkZWZpbmUgSzFUQ1JfTVNDVgkweDA4MDAKKyNkZWZpbmUgSzFUQ1JfUlBUUgkweDA0MDAKKyNkZWZpbmUgSzFUQ1JfMTAwMEJUX0ZEWCAweDIwMAorI2RlZmluZSBLMVRDUl8xMDAwQlRfSERYIDB4MTAwCisKKyNkZWZpbmUgSzFTVFNSX01TTUNGTFQJMHg4MDAwCisjZGVmaW5lIEsxU1RTUl9NU0NGR1JFUwkweDQwMDAKKyNkZWZpbmUgSzFTVFNSX0xSU1RBVAkweDIwMDAKKyNkZWZpbmUgSzFTVFNSX1JSU1RBVAkweDEwMDAKKyNkZWZpbmUgSzFTVFNSX0xQMUtGRAkweDA4MDAKKyNkZWZpbmUgSzFTVFNSX0xQMUtIRCAgIDB4MDQwMAorI2RlZmluZSBLMVNUU1JfTFBBU01ESVIJMHgwMjAwCisKKyNkZWZpbmUgSzFTQ1JfMUtYX0ZEWAkweDgwMDAKKyNkZWZpbmUgSzFTQ1JfMUtYX0hEWAkweDQwMDAKKyNkZWZpbmUgSzFTQ1JfMUtUX0ZEWAkweDIwMDAKKyNkZWZpbmUgSzFTQ1JfMUtUX0hEWAkweDEwMDAKKworI2RlZmluZSBTVFJBUF9QSFkxCTB4MDgwMAorI2RlZmluZSBTVFJBUF9OQ01PREUJMHgwNDAwCisjZGVmaW5lIFNUUkFQX01BTk1TQ0ZHCTB4MDIwMAorI2RlZmluZSBTVFJBUF9BTkVOQUJMRQkweDAxMDAKKyNkZWZpbmUgU1RSQVBfTVNWQUwJMHgwMDgwCisjZGVmaW5lIFNUUkFQXzFLSERYQURWCTB4MDAxMAorI2RlZmluZSBTVFJBUF8xS0ZEWEFEVgkweDAwMDgKKyNkZWZpbmUgU1RSQVBfMTAwQURWCTB4MDAwNAorI2RlZmluZSBTVFJBUF9TUEVFRFNFTAkweDAwMDAKKyNkZWZpbmUgU1RSQVBfU1BFRUQxMDAJMHgwMDAxCisKKyNkZWZpbmUgUEhZU1VQX1NQRUVEMTAwMCAweDEwCisjZGVmaW5lIFBIWVNVUF9TUEVFRDEwMCAgMHgwOAorI2RlZmluZSBQSFlTVVBfU1BFRUQxMCAgIDB4MDAKKyNkZWZpbmUgUEhZU1VQX0xJTktVUAkgMHgwNAorI2RlZmluZSBQSFlTVVBfRkRYICAgICAgIDB4MDIKKworI2RlZmluZQlNSUlfQk1DUgkweDAwIAkvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIgKHJ3KSAqLworI2RlZmluZQlNSUlfQk1TUgkweDAxCS8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyIChybykgKi8KKyNkZWZpbmUgTUlJX0sxU1RTUgkweDBBCS8qIDFLIFN0YXR1cyBSZWdpc3RlciAocm8pICovCisjZGVmaW5lCU1JSV9BTkxQQVIJMHgwNQkvKiBBdXRvbmVnb3RpYXRpb24gbG5rIHBhcnRuZXIgYWJpbGl0aWVzIChydykgKi8KKworCisjZGVmaW5lIE1fTUFDX01ESU9fRElSX09VVFBVVAkwCQkvKiBmb3IgY2xhcml0eSAqLworCisjZGVmaW5lIEVOQUJMRSAJCTEKKyNkZWZpbmUgRElTQUJMRQkJMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX01JSV9TWU5DKHMpCisgKiAgCisgKiAgU3luY2hyb25pemUgd2l0aCB0aGUgTUlJIC0gc2VuZCBhIHBhdHRlcm4gb2YgYml0cyB0byB0aGUgTUlJCisgKiAgdGhhdCB3aWxsIGd1YXJhbnRlZSB0aGF0IGl0IGlzIHJlYWR5IHRvIGFjY2VwdCBhIGNvbW1hbmQuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX21paV9zeW5jKHN0cnVjdCBzYm1hY19zb2Z0YyAqcykKK3sKKwlpbnQgY250OworCXVpbnQ2NF90IGJpdHM7CisJaW50IG1hY19tZGlvX2dlbmM7CisKKwltYWNfbWRpb19nZW5jID0gU0JNQUNfUkVBRENTUihzLT5zYm1fbWRpbykgJiBNX01BQ19HRU5DOworCQorCWJpdHMgPSBNX01BQ19NRElPX0RJUl9PVVRQVVQgfCBNX01BQ19NRElPX09VVDsKKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJZm9yIChjbnQgPSAwOyBjbnQgPCAzMjsgY250KyspIHsKKwkJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sYml0cyB8IE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX01JSV9TRU5EREFUQShzLGRhdGEsYml0Y250KQorICogIAorICogIFNlbmQgc29tZSBiaXRzIHRvIHRoZSBNSUkuICBUaGUgYml0cyB0byBiZSBzZW50IGFyZSByaWdodC0KKyAqICBqdXN0aWZpZWQgaW4gdGhlICdkYXRhJyBwYXJhbWV0ZXIuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgZGF0YSAtIGRhdGEgdG8gc2VuZAorICogIAkgICBiaXRjbnQgLSBudW1iZXIgb2YgYml0cyB0byBzZW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX21paV9zZW5kZGF0YShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsdW5zaWduZWQgaW50IGRhdGEsIGludCBiaXRjbnQpCit7CisJaW50IGk7CisJdWludDY0X3QgYml0czsKKwl1bnNpZ25lZCBpbnQgY3VybWFzazsKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisJCisJYml0cyA9IE1fTUFDX01ESU9fRElSX09VVFBVVDsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJY3VybWFzayA9IDEgPDwgKGJpdGNudCAtIDEpOworCQorCWZvciAoaSA9IDA7IGkgPCBiaXRjbnQ7IGkrKykgeworCQlpZiAoZGF0YSAmIGN1cm1hc2spCisJCQliaXRzIHw9IE1fTUFDX01ESU9fT1VUOworCQllbHNlIGJpdHMgJj0gfk1fTUFDX01ESU9fT1VUOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBNX01BQ19NREMgfCBtYWNfbWRpb19nZW5jKTsKKwkJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sYml0cyB8IG1hY19tZGlvX2dlbmMpOworCQljdXJtYXNrID4+PSAxOworCX0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfTUlJX1JFQUQocyxwaHlhZGRyLHJlZ2lkeCkKKyAqICAKKyAqICBSZWFkIGEgUEhZIHJlZ2lzdGVyLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIHBoeWFkZHIgLSBQSFkncyBhZGRyZXNzCisgKiAgCSAgIHJlZ2lkeCA9IGluZGV4IG9mIHJlZ2lzdGVyIHRvIHJlYWQKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICB2YWx1ZSByZWFkLCBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHNibWFjX21paV9yZWFkKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgcGh5YWRkcixpbnQgcmVnaWR4KQoreworCWludCBpZHg7CisJaW50IGVycm9yOworCWludCByZWd2YWw7CisJaW50IG1hY19tZGlvX2dlbmM7CisKKwkvKgorCSAqIFN5bmNocm9uaXplIG91cnNlbHZlcyBzbyB0aGF0IHRoZSBQSFkga25vd3MgdGhlIG5leHQKKwkgKiB0aGluZyBjb21pbmcgZG93biBpcyBhIGNvbW1hbmQKKwkgKi8KKwkKKwlzYm1hY19taWlfc3luYyhzKTsKKwkKKwkvKgorCSAqIFNlbmQgdGhlIGRhdGEgdG8gdGhlIFBIWS4gIFRoZSBzZXF1ZW5jZSBpcworCSAqIGEgInN0YXJ0IiBjb21tYW5kICgyIGJpdHMpCisJICogYSAicmVhZCIgY29tbWFuZCAoMiBiaXRzKQorCSAqIHRoZSBQSFkgYWRkciAoNSBiaXRzKQorCSAqIHRoZSByZWdpc3RlciBpbmRleCAoNSBiaXRzKQorCSAqLworCQorCXNibWFjX21paV9zZW5kZGF0YShzLE1JSV9DT01NQU5EX1NUQVJULCAyKTsKKwlzYm1hY19taWlfc2VuZGRhdGEocyxNSUlfQ09NTUFORF9SRUFELCAyKTsKKwlzYm1hY19taWlfc2VuZGRhdGEocyxwaHlhZGRyLCA1KTsKKwlzYm1hY19taWlfc2VuZGRhdGEocyxyZWdpZHgsIDUpOworCQorCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisJCisJLyogCisJICogU3dpdGNoIHRoZSBwb3J0IGFyb3VuZCB3aXRob3V0IGEgY2xvY2sgdHJhbnNpdGlvbi4KKwkgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9JTlBVVCB8IG1hY19tZGlvX2dlbmMpOworCQorCS8qCisJICogU2VuZCBvdXQgYSBjbG9jayBwdWxzZSB0byBzaWduYWwgd2Ugd2FudCB0aGUgc3RhdHVzCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sCisJCSAgICAgICBNX01BQ19NRElPX0RJUl9JTlBVVCB8IE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLE1fTUFDX01ESU9fRElSX0lOUFVUIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJLyogCisJICogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBQSFkgd2lsbCBzaWduYWwgJzEnIGJhY2sKKwkgKi8KKwllcnJvciA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21kaW8pICYgTV9NQUNfTURJT19JTjsKKwkKKwkvKiAKKwkgKiBJc3N1ZSBhbiAnaWRsZScgY2xvY2sgcHVsc2UsIGJ1dCBrZWVwIHRoZSBkaXJlY3Rpb24KKwkgKiB0aGUgc2FtZS4KKwkgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJICAgICAgIE1fTUFDX01ESU9fRElSX0lOUFVUIHwgTV9NQUNfTURDIHwgbWFjX21kaW9fZ2VuYyk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sTV9NQUNfTURJT19ESVJfSU5QVVQgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwlyZWd2YWwgPSAwOworCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgMTY7IGlkeCsrKSB7CisJCXJlZ3ZhbCA8PD0gMTsKKwkJCisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlpZiAoU0JNQUNfUkVBRENTUihzLT5zYm1fbWRpbykgJiBNX01BQ19NRElPX0lOKQorCQkJCXJlZ3ZhbCB8PSAxOworCQl9CisJCQorCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJCSAgICAgICBNX01BQ19NRElPX0RJUl9JTlBVVHxNX01BQ19NREMgfCBtYWNfbWRpb19nZW5jKTsKKwkJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sCisJCQkgICAgICAgTV9NQUNfTURJT19ESVJfSU5QVVQgfCBtYWNfbWRpb19nZW5jKTsKKwl9CisJCisJLyogU3dpdGNoIGJhY2sgdG8gb3V0cHV0ICovCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sTV9NQUNfTURJT19ESVJfT1VUUFVUIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJaWYgKGVycm9yID09IDApCisJCXJldHVybiByZWd2YWw7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19NSUlfV1JJVEUocyxwaHlhZGRyLHJlZ2lkeCxyZWd2YWwpCisgKiAgCisgKiAgV3JpdGUgYSB2YWx1ZSB0byBhIFBIWSByZWdpc3Rlci4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICBwaHlhZGRyIC0gUEhZIHRvIHVzZQorICogIAkgICByZWdpZHggLSByZWdpc3RlciB3aXRoaW4gdGhlIFBIWQorICogIAkgICByZWd2YWwgLSBkYXRhIHRvIHdyaXRlIHRvIHJlZ2lzdGVyCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19taWlfd3JpdGUoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBwaHlhZGRyLGludCByZWdpZHgsCisJCQkgICAgdW5zaWduZWQgaW50IHJlZ3ZhbCkKK3sKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCXNibWFjX21paV9zeW5jKHMpOworCQorCXNibWFjX21paV9zZW5kZGF0YShzLE1JSV9DT01NQU5EX1NUQVJULDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLE1JSV9DT01NQU5EX1dSSVRFLDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLHBoeWFkZHIsIDUpOworCXNibWFjX21paV9zZW5kZGF0YShzLHJlZ2lkeCwgNSk7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfQUNLLDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLHJlZ3ZhbCwxNik7CisKKwltYWNfbWRpb19nZW5jID0gU0JNQUNfUkVBRENTUihzLT5zYm1fbWRpbykgJiBNX01BQ19HRU5DOworCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sTV9NQUNfTURJT19ESVJfT1VUUFVUIHwgbWFjX21kaW9fZ2VuYyk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX0lOSVRDVFgoZCxzLGNoYW4sdHhyeCxtYXhkZXNjcikKKyAqICAKKyAqICBJbml0aWFsaXplIGEgRE1BIGNoYW5uZWwgY29udGV4dC4gIFNpbmNlIHRoZXJlIGFyZSBwb3RlbnRpYWxseQorICogIGVpZ2h0IERNQSBjaGFubmVscyBwZXIgTUFDLCBpdCdzIG5pY2UgdG8gZG8gdGhpcyBpbiBhIHN0YW5kYXJkCisgKiAgd2F5LiAgCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBzYm1hY2RtYV90IHN0cnVjdHVyZSAoRE1BIGNoYW5uZWwgY29udGV4dCkKKyAqICAJICAgcyAtIHNibWFjX3NvZnRjIHN0cnVjdHVyZSAocG9pbnRlciB0byBhIE1BQykKKyAqICAJICAgY2hhbiAtIGNoYW5uZWwgbnVtYmVyICgwLi4xIHJpZ2h0IG5vdykKKyAqICAJICAgdHhyeCAtIElkZW50aWZpZXMgRE1BX1RYIG9yIERNQV9SWCBmb3IgY2hhbm5lbCBkaXJlY3Rpb24KKyAqICAgICAgbWF4ZGVzY3IgLSBudW1iZXIgb2YgZGVzY3JpcHRvcnMKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2luaXRjdHgoc2JtYWNkbWFfdCAqZCwKKwkJCSAgc3RydWN0IHNibWFjX3NvZnRjICpzLAorCQkJICBpbnQgY2hhbiwKKwkJCSAgaW50IHR4cngsCisJCQkgIGludCBtYXhkZXNjcikKK3sKKwkvKiAKKwkgKiBTYXZlIGF3YXkgaW50ZXJlc3Rpbmcgc3R1ZmYgaW4gdGhlIHN0cnVjdHVyZSAKKwkgKi8KKwkKKwlkLT5zYmRtYV9ldGggICAgICAgPSBzOworCWQtPnNiZG1hX2NoYW5uZWwgICA9IGNoYW47CisJZC0+c2JkbWFfdHhkaXIgICAgID0gdHhyeDsKKwkKKyNpZiAwCisJLyogUk1PTiBjbGVhcmluZyAqLworCXMtPnNiZV9pZHggPShzLT5zYm1fYmFzZSAtIEFfTUFDX0JBU0VfMCkvTUFDX1NQQUNJTkc7CisjZW5kaWYKKworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX0JZVEVTKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX0NPTExJU0lPTlMpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fTEFURV9DT0wpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fRVhfQ09MKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX0ZDU19FUlJPUikpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9UWF9BQk9SVCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9UWF9CQUQpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fVFhfR09PRCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9UWF9SVU5UKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX09WRVJTSVpFKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0JZVEVTKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX01DQVNUKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0JDQVNUKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0JBRCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9HT09EKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX1JVTlQpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfT1ZFUlNJWkUpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfRkNTX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0xFTkdUSF9FUlJPUikpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9DT0RFX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0FMSUdOX0VSUk9SKSksIDApOworCisJLyogCisJICogaW5pdGlhbGl6ZSByZWdpc3RlciBwb2ludGVycyAKKwkgKi8KKwkKKwlkLT5zYmRtYV9jb25maWcwID0gCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfQ09ORklHMCk7CisJZC0+c2JkbWFfY29uZmlnMSA9IAorCQlzLT5zYm1fYmFzZSArIFJfTUFDX0RNQV9SRUdJU1RFUih0eHJ4LGNoYW4sUl9NQUNfRE1BX0NPTkZJRzEpOworCWQtPnNiZG1hX2RzY3JiYXNlID0gCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfRFNDUl9CQVNFKTsKKwlkLT5zYmRtYV9kc2NyY250ID0gCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfRFNDUl9DTlQpOworCWQtPnNiZG1hX2N1cmRzY3IgPSAJCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfQ1VSX0RTQ1JBRERSKTsKKwkKKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJpbmcKKwkgKi8KKwkKKwlkLT5zYmRtYV9tYXhkZXNjciA9IG1heGRlc2NyOworCQorCWQtPnNiZG1hX2RzY3J0YWJsZSA9IChzYmRtYWRzY3JfdCAqKSAKKwkJa21hbGxvYyhkLT5zYmRtYV9tYXhkZXNjcipzaXplb2Yoc2JkbWFkc2NyX3QpLCBHRlBfS0VSTkVMKTsKKwkKKwltZW1zZXQoZC0+c2JkbWFfZHNjcnRhYmxlLDAsZC0+c2JkbWFfbWF4ZGVzY3Iqc2l6ZW9mKHNiZG1hZHNjcl90KSk7CisJCisJZC0+c2JkbWFfZHNjcnRhYmxlX2VuZCA9IGQtPnNiZG1hX2RzY3J0YWJsZSArIGQtPnNiZG1hX21heGRlc2NyOworCQorCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzID0gdmlydF90b19waHlzKGQtPnNiZG1hX2RzY3J0YWJsZSk7CisJCisJLyoKKwkgKiBBbmQgY29udGV4dCB0YWJsZQorCSAqLworCQorCWQtPnNiZG1hX2N0eHRhYmxlID0gKHN0cnVjdCBza19idWZmICoqKSAKKwkJa21hbGxvYyhkLT5zYmRtYV9tYXhkZXNjcipzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKiksIEdGUF9LRVJORUwpOworCQorCW1lbXNldChkLT5zYmRtYV9jdHh0YWJsZSwwLGQtPnNiZG1hX21heGRlc2NyKnNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisJCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJLyoKKwkgKiBTZXR1cCBSeC9UeCBETUEgY29hbGVzY2luZyBkZWZhdWx0cworCSAqLworCisJaWYgKCBpbnRfcGt0Y250ICkgeworCQlkLT5zYmRtYV9pbnRfcGt0Y250ID0gaW50X3BrdGNudDsKKwl9IGVsc2UgeworCQlkLT5zYmRtYV9pbnRfcGt0Y250ID0gMTsKKwl9CisJCisJaWYgKCBpbnRfdGltZW91dCApIHsKKwkJZC0+c2JkbWFfaW50X3RpbWVvdXQgPSBpbnRfdGltZW91dDsKKwl9IGVsc2UgeworCQlkLT5zYmRtYV9pbnRfdGltZW91dCA9IDA7CisJfQorI2VuZGlmCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9DSEFOTkVMX1NUQVJUKGQpCisgKiAgCisgKiAgSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzIGZvciBhIERNQSBjaGFubmVsLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBkIC0gRE1BIGNoYW5uZWwgdG8gaW5pdCAoY29udGV4dCBtdXN0IGJlIHByZXZpb3VzbHkgaW5pdCdkCisgKiAgICAgICAgIHJ4dHggLSBETUFfUlggb3IgRE1BX1RYIGRlcGVuZGluZyBvbiB3aGF0IHR5cGUgb2YgY2hhbm5lbAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfY2hhbm5lbF9zdGFydChzYm1hY2RtYV90ICpkLCBpbnQgcnh0eCApCit7CisJLyoKKwkgKiBUdXJuIG9uIHRoZSBETUEgY2hhbm5lbAorCSAqLworCQorI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzEsCisJCSAgICAgICBWX0RNQV9JTlRfVElNRU9VVChkLT5zYmRtYV9pbnRfdGltZW91dCkgfAorCQkgICAgICAgMCk7CisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMCwKKwkJICAgICAgIE1fRE1BX0VPUF9JTlRfRU4gfAorCQkgICAgICAgVl9ETUFfUklOR1NaKGQtPnNiZG1hX21heGRlc2NyKSB8CisJCSAgICAgICBWX0RNQV9JTlRfUEtUQ05UKGQtPnNiZG1hX2ludF9wa3RjbnQpIHwKKwkJICAgICAgIDApOworI2Vsc2UKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcxLDApOworCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzAsCisJCSAgICAgICBWX0RNQV9SSU5HU1ooZC0+c2JkbWFfbWF4ZGVzY3IpIHwKKwkJICAgICAgIDApOworI2VuZGlmCisKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9kc2NyYmFzZSxkLT5zYmRtYV9kc2NydGFibGVfcGh5cyk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgcmluZyBwb2ludGVycworCSAqLworCisJZC0+c2JkbWFfYWRkcHRyID0gZC0+c2JkbWFfZHNjcnRhYmxlOworCWQtPnNiZG1hX3JlbXB0ciA9IGQtPnNiZG1hX2RzY3J0YWJsZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9DSEFOTkVMX1NUT1AoZCkKKyAqICAKKyAqICBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgZm9yIGEgRE1BIGNoYW5uZWwuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCB0byBpbml0IChjb250ZXh0IG11c3QgYmUgcHJldmlvdXNseSBpbml0J2QKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2NoYW5uZWxfc3RvcChzYm1hY2RtYV90ICpkKQoreworCS8qCisJICogVHVybiBvZmYgdGhlIERNQSBjaGFubmVsCisJICovCisJCisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMSwwKTsKKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9kc2NyYmFzZSwwKTsKKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcwLDApOworCQorCS8qCisJICogWmVybyByaW5nIHBvaW50ZXJzCisJICovCisJCisJZC0+c2JkbWFfYWRkcHRyID0gMDsKKwlkLT5zYmRtYV9yZW1wdHIgPSAwOworfQorCitzdGF0aWMgdm9pZCBzYmRtYV9hbGlnbl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYixpbnQgcG93ZXIyLGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgbmV3YWRkcjsKKwkKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKKwkKKwluZXdhZGRyID0gKGFkZHIgKyBwb3dlcjIgLSAxKSAmIH4ocG93ZXIyIC0gMSk7CisJCisJc2tiX3Jlc2VydmUoc2tiLG5ld2FkZHItYWRkcitvZmZzZXQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfQUREX1JDVkJVRkZFUihkLHNiKQorICogIAorICogIEFkZCBhIGJ1ZmZlciB0byB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLiAgIEZvciByZWNlaXZlIGNoYW5uZWxzLAorICogIHRoaXMgcXVldWVzIGEgYnVmZmVyIGZvciBpbmJvdW5kIHBhY2tldHMuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCBkZXNjcmlwdG9yCisgKiAJICAgc2IgLSBza19idWZmIHRvIGFkZCwgb3IgTlVMTCBpZiB3ZSBzaG91bGQgYWxsb2NhdGUgb25lCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgMCBpZiBidWZmZXIgY291bGQgbm90IGJlIGFkZGVkIChyaW5nIGlzIGZ1bGwpCisgKiAgCSAgIDEgaWYgYnVmZmVyIGFkZGVkIHN1Y2Nlc3NmdWxseQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3JjdmJ1ZmZlcihzYm1hY2RtYV90ICpkLHN0cnVjdCBza19idWZmICpzYikKK3sKKwlzYmRtYWRzY3JfdCAqZHNjOworCXNiZG1hZHNjcl90ICpuZXh0ZHNjOworCXN0cnVjdCBza19idWZmICpzYl9uZXcgPSBOVUxMOworCWludCBwa3RzaXplID0gRU5FVF9QQUNLRVRfU0laRTsKKwkKKwkvKiBnZXQgcG9pbnRlciB0byBvdXIgY3VycmVudCBwbGFjZSBpbiB0aGUgcmluZyAqLworCQorCWRzYyA9IGQtPnNiZG1hX2FkZHB0cjsKKwluZXh0ZHNjID0gU0JETUFfTkVYVEJVRihkLHNiZG1hX2FkZHB0cik7CisJCisJLyoKKwkgKiBmaWd1cmUgb3V0IGlmIHRoZSByaW5nIGlzIGZ1bGwgLSBpZiB0aGUgbmV4dCBkZXNjcmlwdG9yCisJICogaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIHJlbW92ZSBmcm9tCisJICogdGhlIHJpbmcsIHRoZSByaW5nIGlzIGZ1bGwKKwkgKi8KKwkKKwlpZiAobmV4dGRzYyA9PSBkLT5zYmRtYV9yZW1wdHIpIHsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJLyogCisJICogQWxsb2NhdGUgYSBza19idWZmIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAKKwkgKiBJZiB3ZSBkbyBoYXZlIGFuIHNrX2J1ZmYsIHJlc2V0IGl0IHNvIHRoYXQgaXQncyBlbXB0eS4KKwkgKgorCSAqIE5vdGU6IHNrX2J1ZmZzIGRvbid0IHNlZW0gdG8gYmUgZ3VhcmFudGVlZCB0byBoYXZlIGFueSBzb3J0CisJICogb2YgYWxpZ25tZW50IHdoZW4gdGhleSBhcmUgYWxsb2NhdGVkLiAgVGhlcmVmb3JlLCBhbGxvY2F0ZSBlbm91Z2gKKwkgKiBleHRyYSBzcGFjZSB0byBtYWtlIHN1cmUgdGhhdDoKKwkgKgorCSAqICAgIDEuIHRoZSBkYXRhIGRvZXMgbm90IHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSBjYWNoZSBsaW5lLgorCSAqICAgIDIuIFRoZSBkYXRhIGRvZXMgbm90IGVuZCBpbiB0aGUgbWlkZGxlIG9mIGEgY2FjaGUgbGluZQorCSAqICAgIDMuIFRoZSBidWZmZXIgY2FuIGJlIGFsaWduZWQgc3VjaCB0aGF0IHRoZSBJUCBhZGRyZXNzZXMgYXJlIAorCSAqICAgICAgIG5hdHVyYWxseSBhbGlnbmVkLgorCSAqCisJICogIFJlbWVtYmVyLCB0aGUgU09DcyBNQUMgd3JpdGVzIHdob2xlIGNhY2hlIGxpbmVzIGF0IGEgdGltZSwKKwkgKiAgd2l0aG91dCByZWFkaW5nIHRoZSBvbGQgY29udGVudHMgZmlyc3QuICBTbywgaWYgdGhlIHNrX2J1ZmYncworCSAqICBkYXRhIHBvcnRpb24gc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgYSBjYWNoZSBsaW5lLCB0aGUgU09DCisJICogIERNQSB3aWxsIHRyYXNoIHRoZSBiZWdpbm5pbmcgKGFuZCBlbmRpbmcpIHBvcnRpb25zLgorCSAqLworCQorCWlmIChzYiA9PSBOVUxMKSB7CisJCXNiX25ldyA9IGRldl9hbGxvY19za2IoRU5FVF9QQUNLRVRfU0laRSArIFNNUF9DQUNIRV9CWVRFUyAqIDIgKyBFVEhFUl9BTElHTik7CisJCWlmIChzYl9uZXcgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNrX2J1ZmYgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkgICAgICAgZC0+c2JkbWFfZXRoLT5zYm1fZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCisJCXNiZG1hX2FsaWduX3NrYihzYl9uZXcsIFNNUF9DQUNIRV9CWVRFUywgRVRIRVJfQUxJR04pOworCisJCS8qIG1hcmsgc2tidWZmIG93bmVkIGJ5IG91ciBkZXZpY2UgKi8KKwkJc2JfbmV3LT5kZXYgPSBkLT5zYmRtYV9ldGgtPnNibV9kZXY7CisJfQorCWVsc2UgeworCQlzYl9uZXcgPSBzYjsKKwkJLyogCisJCSAqIG5vdGhpbmcgc3BlY2lhbCB0byByZWluaXQgYnVmZmVyLCBpdCdzIGFscmVhZHkgYWxpZ25lZAorCQkgKiBhbmQgc2ItPmRhdGEgYWxyZWFkeSBwb2ludHMgdG8gYSBnb29kIHBsYWNlLgorCQkgKi8KKwl9CisJCisJLyoKKwkgKiBmaWxsIGluIHRoZSBkZXNjcmlwdG9yIAorCSAqLworCQorI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCS8qCisJICogRG8gbm90IGludGVycnVwdCBwZXIgRE1BIHRyYW5zZmVyLgorCSAqLworCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+dGFpbCkgfAorCQlWX0RNQV9EU0NSQV9BX1NJWkUoTlVNQ0FDSEVCTEtTKHBrdHNpemUrRVRIRVJfQUxJR04pKSB8CisJCTA7CisjZWxzZQorCWRzYy0+ZHNjcl9hID0gdmlydF90b19waHlzKHNiX25ldy0+dGFpbCkgfAorCQlWX0RNQV9EU0NSQV9BX1NJWkUoTlVNQ0FDSEVCTEtTKHBrdHNpemUrRVRIRVJfQUxJR04pKSB8CisJCU1fRE1BX0RTQ1JBX0lOVEVSUlVQVDsKKyNlbmRpZgorCisJLyogcmVjZWl2aW5nOiBubyBvcHRpb25zICovCisJZHNjLT5kc2NyX2IgPSAwOworCQorCS8qCisJICogZmlsbCBpbiB0aGUgY29udGV4dCAKKwkgKi8KKwkKKwlkLT5zYmRtYV9jdHh0YWJsZVtkc2MtZC0+c2JkbWFfZHNjcnRhYmxlXSA9IHNiX25ldzsKKwkKKwkvKiAKKwkgKiBwb2ludCBhdCBuZXh0IHBhY2tldCAKKwkgKi8KKwkKKwlkLT5zYmRtYV9hZGRwdHIgPSBuZXh0ZHNjOworCQorCS8qIAorCSAqIEdpdmUgdGhlIGJ1ZmZlciB0byB0aGUgRE1BIGVuZ2luZS4KKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9kc2NyY250LDEpOworCQorCXJldHVybiAwOwkJCQkJLyogd2UgZGlkIGl0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfQUREX1RYQlVGRkVSKGQsc2IpCisgKiAgCisgKiAgQWRkIGEgdHJhbnNtaXQgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwsIGNhdXNpbmcgYQorICogIHRyYW5zbWl0IHRvIHN0YXJ0LgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBkIC0gRE1BIGNoYW5uZWwgZGVzY3JpcHRvcgorICogCSAgIHNiIC0gc2tfYnVmZiB0byBhZGQKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAwIHRyYW5zbWl0IHF1ZXVlZCBzdWNjZXNzZnVsbHkKKyAqICAJICAgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCitzdGF0aWMgaW50IHNiZG1hX2FkZF90eGJ1ZmZlcihzYm1hY2RtYV90ICpkLHN0cnVjdCBza19idWZmICpzYikKK3sKKwlzYmRtYWRzY3JfdCAqZHNjOworCXNiZG1hZHNjcl90ICpuZXh0ZHNjOworCXVpbnQ2NF90IHBoeXM7CisJdWludDY0X3QgbmNiOworCWludCBsZW5ndGg7CisJCisJLyogZ2V0IHBvaW50ZXIgdG8gb3VyIGN1cnJlbnQgcGxhY2UgaW4gdGhlIHJpbmcgKi8KKwkKKwlkc2MgPSBkLT5zYmRtYV9hZGRwdHI7CisJbmV4dGRzYyA9IFNCRE1BX05FWFRCVUYoZCxzYmRtYV9hZGRwdHIpOworCQorCS8qCisJICogZmlndXJlIG91dCBpZiB0aGUgcmluZyBpcyBmdWxsIC0gaWYgdGhlIG5leHQgZGVzY3JpcHRvcgorCSAqIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhhdCB3ZSdyZSBnb2luZyB0byByZW1vdmUgZnJvbQorCSAqIHRoZSByaW5nLCB0aGUgcmluZyBpcyBmdWxsCisJICovCisJCisJaWYgKG5leHRkc2MgPT0gZC0+c2JkbWFfcmVtcHRyKSB7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwkKKwkvKgorCSAqIFVuZGVyIExpbnV4LCBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gY29weS9jb2FsZXNjZSBidWZmZXJzCisJICogbGlrZSBpdCBpcyBvbiBOZXRCU0QuICBXZSB0aGluayB0aGV5J3JlIGFsbCBjb250aWd1b3VzLAorCSAqIGJ1dCB0aGF0IG1heSBub3QgYmUgdHJ1ZSBmb3IgR0JFLgorCSAqLworCQorCWxlbmd0aCA9IHNiLT5sZW47CisJCisJLyoKKwkgKiBmaWxsIGluIHRoZSBkZXNjcmlwdG9yLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgY2FjaGUKKwkgKiBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IgaXMgdGhlIG51bWJlciBvZiBibG9ja3MKKwkgKiAqc3Bhbm5lZCosIHNvIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBvZmZzZXQgKGlmIGFueSkKKwkgKiB3aGlsZSBkb2luZyB0aGUgY2FsY3VsYXRpb24uCisJICovCisJCisJcGh5cyA9IHZpcnRfdG9fcGh5cyhzYi0+ZGF0YSk7CisJbmNiID0gTlVNQ0FDSEVCTEtTKGxlbmd0aCsocGh5cyAmIChTTVBfQ0FDSEVfQllURVMgLSAxKSkpOworCisJZHNjLT5kc2NyX2EgPSBwaHlzIHwgCisJCVZfRE1BX0RTQ1JBX0FfU0laRShuY2IpIHwKKyNpZm5kZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJCU1fRE1BX0RTQ1JBX0lOVEVSUlVQVCB8CisjZW5kaWYKKwkJTV9ETUFfRVRIVFhfU09QOworCQorCS8qIHRyYW5zbWl0dGluZzogc2V0IG91dGJvdW5kIG9wdGlvbnMgYW5kIGxlbmd0aCAqLworCisJZHNjLT5kc2NyX2IgPSBWX0RNQV9EU0NSQl9PUFRJT05TKEtfRE1BX0VUSFRYX0FQUEVORENSQ19BUFBFTkRQQUQpIHwKKwkJVl9ETUFfRFNDUkJfUEtUX1NJWkUobGVuZ3RoKTsKKwkKKwkvKgorCSAqIGZpbGwgaW4gdGhlIGNvbnRleHQgCisJICovCisJCisJZC0+c2JkbWFfY3R4dGFibGVbZHNjLWQtPnNiZG1hX2RzY3J0YWJsZV0gPSBzYjsKKwkKKwkvKiAKKwkgKiBwb2ludCBhdCBuZXh0IHBhY2tldCAKKwkgKi8KKwkKKwlkLT5zYmRtYV9hZGRwdHIgPSBuZXh0ZHNjOworCQorCS8qIAorCSAqIEdpdmUgdGhlIGJ1ZmZlciB0byB0aGUgRE1BIGVuZ2luZS4KKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9kc2NyY250LDEpOworCQorCXJldHVybiAwOwkJCQkJLyogd2UgZGlkIGl0ICovCit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfRU1QVFlSSU5HKGQpCisgKiAgCisgKiAgRnJlZSBhbGwgYWxsb2NhdGVkIHNrX2J1ZmZzIG9uIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWw7CisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgIC0gRE1BIGNoYW5uZWwKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2VtcHR5cmluZyhzYm1hY2RtYV90ICpkKQoreworCWludCBpZHg7CisJc3RydWN0IHNrX2J1ZmYgKnNiOworCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgZC0+c2JkbWFfbWF4ZGVzY3I7IGlkeCsrKSB7CisJCXNiID0gZC0+c2JkbWFfY3R4dGFibGVbaWR4XTsKKwkJaWYgKHNiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNiKTsKKwkJCWQtPnNiZG1hX2N0eHRhYmxlW2lkeF0gPSBOVUxMOworCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfRklMTFJJTkcoZCkKKyAqICAKKyAqICBGaWxsIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwgKG11c3QgYmUgcmVjZWl2ZSBjaGFubmVsKQorICogIHdpdGggc2tfYnVmZnMKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIERNQSBjaGFubmVsCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYmRtYV9maWxscmluZyhzYm1hY2RtYV90ICpkKQoreworCWludCBpZHg7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBTQk1BQ19NQVhfUlhERVNDUi0xOyBpZHgrKykgeworCQlpZiAoc2JkbWFfYWRkX3JjdmJ1ZmZlcihkLE5VTEwpICE9IDApCisJCQlicmVhazsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9SWF9QUk9DRVNTKHNjLGQpCisgKiAgCisgKiAgUHJvY2VzcyAiY29tcGxldGVkIiByZWNlaXZlIGJ1ZmZlcnMgb24gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4gIAorICogIE5vdGUgdGhhdCB0aGlzIGlzbid0IHJlYWxseSBpZGVhbCBmb3IgcHJpb3JpdHkgY2hhbm5lbHMsIHNpbmNlCisgKiAgaXQgcHJvY2Vzc2VzIGFsbCBvZiB0aGUgcGFja2V0cyBvbiBhIGdpdmVuIGNoYW5uZWwgYmVmb3JlIAorICogIHJldHVybmluZy4gCisgKgorICogIElucHV0IHBhcmFtZXRlcnM6IAorICoJICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIGNvbnRleHQKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX3J4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkKQoreworCWludCBjdXJpZHg7CisJaW50IGh3aWR4OworCXNiZG1hZHNjcl90ICpkc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNiOworCWludCBsZW47CisJCisJZm9yICg7OykgeworCQkvKiAKKwkJICogZmlndXJlIG91dCB3aGVyZSB3ZSBhcmUgKGFzIGFuIGluZGV4KSBhbmQgd2hlcmUKKwkJICogdGhlIGhhcmR3YXJlIGlzIChhbHNvIGFzIGFuIGluZGV4KQorCQkgKgorCQkgKiBUaGlzIGNvdWxkIGJlIGRvbmUgZmFzdGVyIGlmIChmb3IgZXhhbXBsZSkgdGhlIAorCQkgKiBkZXNjcmlwdG9yIHRhYmxlIHdhcyBwYWdlLWFsaWduZWQgYW5kIGNvbnRpZ3VvdXMgaW4KKwkJICogYm90aCB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBtZW1vcnkgLS0geW91IGNvdWxkIHRoZW4KKwkJICoganVzdCBjb21wYXJlIHRoZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzCisJCSAqIChzYmRtYV9yZW1wdHIpIGFuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyAoc2JkbWFfY3VyZHNjciBDU1IpCisJCSAqLworCQkKKwkJY3VyaWR4ID0gZC0+c2JkbWFfcmVtcHRyIC0gZC0+c2JkbWFfZHNjcnRhYmxlOworCQlod2lkeCA9IChpbnQpICgoKFNCTUFDX1JFQURDU1IoZC0+c2JkbWFfY3VyZHNjcikgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKwkJCQlkLT5zYmRtYV9kc2NydGFibGVfcGh5cykgLyBzaXplb2Yoc2JkbWFkc2NyX3QpKTsKKwkJCisJCS8qCisJCSAqIElmIHRoZXkncmUgdGhlIHNhbWUsIHRoYXQgbWVhbnMgd2UndmUgcHJvY2Vzc2VkIGFsbAorCQkgKiBvZiB0aGUgZGVzY3JpcHRvcnMgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgb25lIHRoYXQKKwkJICogdGhlIGhhcmR3YXJlIGlzIHdvcmtpbmcgb24gcmlnaHQgbm93LgorCQkgKi8KKwkJCisJCWlmIChjdXJpZHggPT0gaHdpZHgpCisJCQlicmVhazsKKwkJCisJCS8qCisJCSAqIE90aGVyd2lzZSwgZ2V0IHRoZSBwYWNrZXQncyBza19idWZmIHB0ciBiYWNrCisJCSAqLworCQkKKwkJZHNjID0gJihkLT5zYmRtYV9kc2NydGFibGVbY3VyaWR4XSk7CisJCXNiID0gZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XTsKKwkJZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XSA9IE5VTEw7CisJCQorCQlsZW4gPSAoaW50KUdfRE1BX0RTQ1JCX1BLVF9TSVpFKGRzYy0+ZHNjcl9iKSAtIDQ7CisJCQorCQkvKgorCQkgKiBDaGVjayBwYWNrZXQgc3RhdHVzLiAgSWYgZ29vZCwgcHJvY2VzcyBpdC4KKwkJICogSWYgbm90LCBzaWxlbnRseSBkcm9wIGl0IGFuZCBwdXQgaXQgYmFjayBvbiB0aGUKKwkJICogcmVjZWl2ZSByaW5nLgorCQkgKi8KKwkJCisJCWlmICghKGRzYy0+ZHNjcl9hICYgTV9ETUFfRVRIUlhfQkFEKSkgeworCQkJCisJCQkvKgorCQkJICogQWRkIGEgbmV3IGJ1ZmZlciB0byByZXBsYWNlIHRoZSBvbGQgb25lLiAgSWYgd2UgZmFpbAorCQkJICogdG8gYWxsb2NhdGUgYSBidWZmZXIsIHdlJ3JlIGdvaW5nIHRvIGRyb3AgdGhpcworCQkJICogcGFja2V0IGFuZCBwdXQgaXQgcmlnaHQgYmFjayBvbiB0aGUgcmVjZWl2ZSByaW5nLgorCQkJICovCisJCQkKKwkJCWlmIChzYmRtYV9hZGRfcmN2YnVmZmVyKGQsTlVMTCkgPT0gLUVOT0JVRlMpIHsKKwkJCQlzYy0+c2JtX3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzYmRtYV9hZGRfcmN2YnVmZmVyKGQsc2IpOyAvKiByZS1hZGQgb2xkIGJ1ZmZlciAqLworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNldCBsZW5ndGggaW50byB0aGUgcGFja2V0CisJCQkJICovCisJCQkJc2tiX3B1dChzYixsZW4pOworCQkJCQorCQkJCS8qCisJCQkJICogQnVmZmVyIGhhcyBiZWVuIHJlcGxhY2VkIG9uIHRoZQorCQkJCSAqIHJlY2VpdmUgcmluZy4gIFBhc3MgdGhlIGJ1ZmZlciB0bworCQkJCSAqIHRoZSBrZXJuZWwKKwkJCQkgKi8KKwkJCQlzYy0+c2JtX3N0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCQlzYy0+c2JtX3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlzYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzYixkLT5zYmRtYV9ldGgtPnNibV9kZXYpOworCQkJCS8qIENoZWNrIGh3IElQdjQvVENQIGNoZWNrc3VtIGlmIHN1cHBvcnRlZCAqLworCQkJCWlmIChzYy0+cnhfaHdfY2hlY2tzdW0gPT0gRU5BQkxFKSB7CisJCQkJCWlmICghKChkc2MtPmRzY3JfYSkgJiBNX0RNQV9FVEhSWF9CQURJUDRDUykgJiYKKwkJCQkJICAgICEoKGRzYy0+ZHNjcl9hKSAmIE1fRE1BX0VUSFJYX0JBRFRDUENTKSkgeworCQkJCQkJc2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJCQkJLyogZG9uJ3QgbmVlZCB0byBzZXQgc2ItPmNzdW0gKi8KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCW5ldGlmX3J4KHNiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWNrZXQgd2FzIG1hbmdsZWQgc29tZWhvdy4gIEp1c3QgZHJvcCBpdCBhbmQKKwkJCSAqIHB1dCBpdCBiYWNrIG9uIHRoZSByZWNlaXZlIHJpbmcuCisJCQkgKi8KKwkJCXNjLT5zYm1fc3RhdHMucnhfZXJyb3JzKys7CisJCQlzYmRtYV9hZGRfcmN2YnVmZmVyKGQsc2IpOworCQl9CisJCQorCQkKKwkJLyogCisJCSAqIC4uIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IGJ1ZmZlci4KKwkJICovCisJCQorCQlkLT5zYmRtYV9yZW1wdHIgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfcmVtcHRyKTsKKwkJCisJfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9UWF9QUk9DRVNTKHNjLGQpCisgKiAgCisgKiAgUHJvY2VzcyAiY29tcGxldGVkIiB0cmFuc21pdCBidWZmZXJzIG9uIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuICAKKyAqICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCB3aXRoaW4gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKiAgTm90ZSB0aGF0IHRoaXMgaXNuJ3QgcmVhbGx5IGlkZWFsIGZvciBwcmlvcml0eSBjaGFubmVscywgc2luY2UKKyAqICBpdCBwcm9jZXNzZXMgYWxsIG9mIHRoZSBwYWNrZXRzIG9uIGEgZ2l2ZW4gY2hhbm5lbCBiZWZvcmUgCisgKiAgcmV0dXJuaW5nLiAKKyAqCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgICAgIHNjIC0gc29mdGMgc3RydWN0dXJlCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCBjb250ZXh0CisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYmRtYV90eF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCkKK3sKKwlpbnQgY3VyaWR4OworCWludCBod2lkeDsKKwlzYmRtYWRzY3JfdCAqZHNjOworCXN0cnVjdCBza19idWZmICpzYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzYy0+c2JtX2xvY2spLCBmbGFncyk7CisJCisJZm9yICg7OykgeworCQkvKiAKKwkJICogZmlndXJlIG91dCB3aGVyZSB3ZSBhcmUgKGFzIGFuIGluZGV4KSBhbmQgd2hlcmUKKwkJICogdGhlIGhhcmR3YXJlIGlzIChhbHNvIGFzIGFuIGluZGV4KQorCQkgKgorCQkgKiBUaGlzIGNvdWxkIGJlIGRvbmUgZmFzdGVyIGlmIChmb3IgZXhhbXBsZSkgdGhlIAorCQkgKiBkZXNjcmlwdG9yIHRhYmxlIHdhcyBwYWdlLWFsaWduZWQgYW5kIGNvbnRpZ3VvdXMgaW4KKwkJICogYm90aCB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBtZW1vcnkgLS0geW91IGNvdWxkIHRoZW4KKwkJICoganVzdCBjb21wYXJlIHRoZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzCisJCSAqIChzYmRtYV9yZW1wdHIpIGFuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyAoc2JkbWFfY3VyZHNjciBDU1IpCisJCSAqLworCQkKKwkJY3VyaWR4ID0gZC0+c2JkbWFfcmVtcHRyIC0gZC0+c2JkbWFfZHNjcnRhYmxlOworCQlod2lkeCA9IChpbnQpICgoKFNCTUFDX1JFQURDU1IoZC0+c2JkbWFfY3VyZHNjcikgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKwkJCQlkLT5zYmRtYV9kc2NydGFibGVfcGh5cykgLyBzaXplb2Yoc2JkbWFkc2NyX3QpKTsKKworCQkvKgorCQkgKiBJZiB0aGV5J3JlIHRoZSBzYW1lLCB0aGF0IG1lYW5zIHdlJ3ZlIHByb2Nlc3NlZCBhbGwKKwkJICogb2YgdGhlIGRlc2NyaXB0b3JzIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhlIG9uZSB0aGF0CisJCSAqIHRoZSBoYXJkd2FyZSBpcyB3b3JraW5nIG9uIHJpZ2h0IG5vdy4KKwkJICovCisJCQorCQlpZiAoY3VyaWR4ID09IGh3aWR4KQorCQkJYnJlYWs7CisJCQorCQkvKgorCQkgKiBPdGhlcndpc2UsIGdldCB0aGUgcGFja2V0J3Mgc2tfYnVmZiBwdHIgYmFjaworCQkgKi8KKwkJCisJCWRzYyA9ICYoZC0+c2JkbWFfZHNjcnRhYmxlW2N1cmlkeF0pOworCQlzYiA9IGQtPnNiZG1hX2N0eHRhYmxlW2N1cmlkeF07CisJCWQtPnNiZG1hX2N0eHRhYmxlW2N1cmlkeF0gPSBOVUxMOworCQkKKwkJLyoKKwkJICogU3RhdHMKKwkJICovCisJCQorCQlzYy0+c2JtX3N0YXRzLnR4X2J5dGVzICs9IHNiLT5sZW47CisJCXNjLT5zYm1fc3RhdHMudHhfcGFja2V0cysrOworCQkKKwkJLyoKKwkJICogZm9yIHRyYW5zbWl0cywgd2UganVzdCBmcmVlIGJ1ZmZlcnMuCisJCSAqLworCQkKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2IpOworCQkKKwkJLyogCisJCSAqIC4uIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IGJ1ZmZlci4KKwkJICovCisKKwkJZC0+c2JkbWFfcmVtcHRyID0gU0JETUFfTkVYVEJVRihkLHNiZG1hX3JlbXB0cik7CisJCQorCX0KKwkKKwkvKgorCSAqIERlY2lkZSBpZiB3ZSBzaG91bGQgd2FrZSB1cCB0aGUgcHJvdG9jb2wgb3Igbm90LgorCSAqIE90aGVyIGRyaXZlcnMgc2VlbSB0byBkbyB0aGlzIHdoZW4gd2UgcmVhY2ggYSBsb3cKKwkgKiB3YXRlcm1hcmsgb24gdGhlIHRyYW5zbWl0IHF1ZXVlLgorCSAqLworCQorCW5ldGlmX3dha2VfcXVldWUoZC0+c2JkbWFfZXRoLT5zYm1fZGV2KTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc2MtPnNibV9sb2NrKSwgZmxhZ3MpOworCQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19JTklUQ1RYKHMpCisgKiAgCisgKiAgSW5pdGlhbGl6ZSBhbiBFdGhlcm5ldCBjb250ZXh0IHN0cnVjdHVyZSAtIHRoaXMgaXMgY2FsbGVkCisgKiAgb25jZSBwZXIgTUFDIG9uIHRoZSAxMjUwLiAgTWVtb3J5IGlzIGFsbG9jYXRlZCBoZXJlLCBzbyBkb24ndAorICogIGNhbGwgaXQgYWdhaW4gZnJvbSBpbnNpZGUgdGhlIGlvY3RsIHJvdXRpbmVzIHRoYXQgYnJpbmcgdGhlCisgKiAgaW50ZXJmYWNlIHVwL2Rvd24KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIGNvbnRleHQgc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX2luaXRjdHgoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCQorCS8qIAorCSAqIGZpZ3VyZSBvdXQgdGhlIGFkZHJlc3NlcyBvZiBzb21lIHBvcnRzIAorCSAqLworCQorCXMtPnNibV9tYWNlbmFibGUgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0VOQUJMRTsKKwlzLT5zYm1fbWFjY2ZnICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19DRkc7CisJcy0+c2JtX2ZpZm9jZmcgICA9IHMtPnNibV9iYXNlICsgUl9NQUNfVEhSU0hfQ0ZHOworCXMtPnNibV9mcmFtZWNmZyAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0ZSQU1FQ0ZHOworCXMtPnNibV9yeGZpbHRlciAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0FERklMVEVSX0NGRzsKKwlzLT5zYm1faXNyICAgICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19TVEFUVVM7CisJcy0+c2JtX2ltciAgICAgICA9IHMtPnNibV9iYXNlICsgUl9NQUNfSU5UX01BU0s7CisJcy0+c2JtX21kaW8gICAgICA9IHMtPnNibV9iYXNlICsgUl9NQUNfTURJTzsKKworCXMtPnNibV9waHlzWzBdICAgPSAxOworCXMtPnNibV9waHlzWzFdICAgPSAwOworCisJcy0+c2JtX3BoeV9vbGRibXNyID0gMDsKKwlzLT5zYm1fcGh5X29sZGFubHBhciA9IDA7CisJcy0+c2JtX3BoeV9vbGRrMXN0c3IgPSAwOworCXMtPnNibV9waHlfb2xkbGlua3N0YXQgPSAwOworCQorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgRE1BIGNoYW5uZWxzLiAgUmlnaHQgbm93LCBvbmx5IG9uZSBwZXIgTUFDIGlzIHVzZWQKKwkgKiBOb3RlOiBPbmx5IGRvIHRoaXMgX29uY2VfLCBhcyBpdCBhbGxvY2F0ZXMgbWVtb3J5IGZyb20gdGhlIGtlcm5lbCEKKwkgKi8KKwkKKwlzYmRtYV9pbml0Y3R4KCYocy0+c2JtX3R4ZG1hKSxzLDAsRE1BX1RYLFNCTUFDX01BWF9UWERFU0NSKTsKKwlzYmRtYV9pbml0Y3R4KCYocy0+c2JtX3J4ZG1hKSxzLDAsRE1BX1JYLFNCTUFDX01BWF9SWERFU0NSKTsKKwkKKwkvKgorCSAqIGluaXRpYWwgc3RhdGUgaXMgT0ZGCisJICovCisJCisJcy0+c2JtX3N0YXRlID0gc2JtYWNfc3RhdGVfb2ZmOworCQorCS8qCisJICogSW5pdGlhbCBzcGVlZCBpcyAoWFhYIFRFTVApIDEwTUJpdC9zIEhEWCBubyBGQworCSAqLworCQorCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfaGFsZjsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19kaXNhYmxlZDsKKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzYmRtYV91bmluaXRjdHgoc3RydWN0IHNibWFjZG1hX3MgKmQpCit7CisJaWYgKGQtPnNiZG1hX2RzY3J0YWJsZSkgeworCQlrZnJlZShkLT5zYmRtYV9kc2NydGFibGUpOworCQlkLT5zYmRtYV9kc2NydGFibGUgPSBOVUxMOworCX0KKwkKKwlpZiAoZC0+c2JkbWFfY3R4dGFibGUpIHsKKwkJa2ZyZWUoZC0+c2JkbWFfY3R4dGFibGUpOworCQlkLT5zYmRtYV9jdHh0YWJsZSA9IE5VTEw7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNibWFjX3VuaW5pdGN0eChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjKQoreworCXNiZG1hX3VuaW5pdGN0eCgmKHNjLT5zYm1fdHhkbWEpKTsKKwlzYmRtYV91bmluaXRjdHgoJihzYy0+c2JtX3J4ZG1hKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19DSEFOTkVMX1NUQVJUKHMpCisgKiAgCisgKiAgU3RhcnQgcGFja2V0IHByb2Nlc3Npbmcgb24gdGhpcyBNQUMuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX2NoYW5uZWxfc3RhcnQoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCXVpbnQ2NF90IHJlZzsKKwlzYm1hY19wb3J0X3QgcG9ydDsKKwl1aW50NjRfdCBjZmcsZmlmbyxmcmFtZWNmZzsKKwlpbnQgaWR4LCB0aF92YWx1ZTsKKwkKKwkvKgorCSAqIERvbid0IGRvIHRoaXMgaWYgcnVubmluZworCSAqLworCisJaWYgKHMtPnNibV9zdGF0ZSA9PSBzYm1hY19zdGF0ZV9vbikKKwkJcmV0dXJuOworCQorCS8qCisJICogQnJpbmcgdGhlIGNvbnRyb2xsZXIgb3V0IG9mIHJlc2V0LCBidXQgbGVhdmUgaXQgb2ZmLgorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tYWNlbmFibGUsMCk7CisJCisJLyoKKwkgKiBJZ25vcmUgYWxsIHJlY2VpdmVkIHBhY2tldHMKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fcnhmaWx0ZXIsMCk7CisJCisJLyogCisJICogQ2FsY3VsYXRlIHZhbHVlcyBmb3IgdmFyaW91cyBjb250cm9sIHJlZ2lzdGVycy4KKwkgKi8KKwkKKwljZmcgPSBNX01BQ19SRVRSWV9FTiB8CisJCU1fTUFDX1RYX0hPTERfU09QX0VOIHwgCisJCVZfTUFDX1RYX1BBVVNFX0NOVF8xNksgfAorCQlNX01BQ19BUF9TVEFUX0VOIHwKKwkJTV9NQUNfRkFTVF9TWU5DIHwKKwkJTV9NQUNfU1NfRU4gfAorCQkwOworCQorCS8qIAorCSAqIEJlIHN1cmUgdGhhdCBSRF9USFJTSCtXUl9USFJTSCA8PSAzMiBmb3IgcGFzczEgcGFycworCSAqIGFuZCBtYWtlIHN1cmUgdGhhdCBSRF9USFJTSCArIFdSX1RIUlNIIDw9MTI4IGZvciBwYXNzMiBhbmQgYWJvdmUKKwkgKiBVc2UgYSBsYXJnZXIgUkRfVEhSU0ggZm9yIGdpZ2FiaXQKKwkgKi8KKwlpZiAocGVyaXBoX3JldiA+PSAyKSAKKwkJdGhfdmFsdWUgPSA2NDsKKwllbHNlIAorCQl0aF92YWx1ZSA9IDI4OworCisJZmlmbyA9IFZfTUFDX1RYX1dSX1RIUlNIKDQpIHwJLyogTXVzdCBiZSAnNCcgb3IgJzgnICovCisJCSgocy0+c2JtX3NwZWVkID09IHNibWFjX3NwZWVkXzEwMDApCisJCSA/IFZfTUFDX1RYX1JEX1RIUlNIKHRoX3ZhbHVlKSA6IFZfTUFDX1RYX1JEX1RIUlNIKDQpKSB8CisJCVZfTUFDX1RYX1JMX1RIUlNIKDQpIHwKKwkJVl9NQUNfUlhfUExfVEhSU0goNCkgfAorCQlWX01BQ19SWF9SRF9USFJTSCg0KSB8CS8qIE11c3QgYmUgJzQnICovCisJCVZfTUFDX1JYX1BMX1RIUlNIKDQpIHwKKwkJVl9NQUNfUlhfUkxfVEhSU0goOCkgfAorCQkwOworCisJZnJhbWVjZmcgPSBWX01BQ19NSU5fRlJBTUVTWl9ERUZBVUxUIHwKKwkJVl9NQUNfTUFYX0ZSQU1FU1pfREVGQVVMVCB8CisJCVZfTUFDX0JBQ0tPRkZfU0VMKDEpOworCisJLyoKKwkgKiBDbGVhciBvdXQgdGhlIGhhc2ggYWRkcmVzcyBtYXAgCisJICovCisJCisJcG9ydCA9IHMtPnNibV9iYXNlICsgUl9NQUNfSEFTSF9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0hBU0hfQ09VTlQ7IGlkeCsrKSB7CisJCVNCTUFDX1dSSVRFQ1NSKHBvcnQsMCk7CisJCXBvcnQgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKwl9CisJCisJLyoKKwkgKiBDbGVhciBvdXQgdGhlIGV4YWN0LW1hdGNoIHRhYmxlCisJICovCisJCisJcG9ydCA9IHMtPnNibV9iYXNlICsgUl9NQUNfQUREUl9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0FERFJfQ09VTlQ7IGlkeCsrKSB7CisJCVNCTUFDX1dSSVRFQ1NSKHBvcnQsMCk7CisJCXBvcnQgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKwl9CisJCisJLyoKKwkgKiBDbGVhciBvdXQgdGhlIERNQSBDaGFubmVsIG1hcHBpbmcgdGFibGUgcmVnaXN0ZXJzCisJICovCisJCisJcG9ydCA9IHMtPnNibV9iYXNlICsgUl9NQUNfQ0hVUDBfQkFTRTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BQ19DSE1BUF9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKworCisJcG9ydCA9IHMtPnNibV9iYXNlICsgUl9NQUNfQ0hMTzBfQkFTRTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BQ19DSE1BUF9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKwkKKwkvKgorCSAqIFByb2dyYW0gdGhlIGhhcmR3YXJlIGFkZHJlc3MuICBJdCBnb2VzIGludG8gdGhlIGhhcmR3YXJlLWFkZHJlc3MKKwkgKiByZWdpc3RlciBhcyB3ZWxsIGFzIHRoZSBmaXJzdCBmaWx0ZXIgcmVnaXN0ZXIuCisJICovCisJCisJcmVnID0gc2JtYWNfYWRkcjJyZWcocy0+c2JtX2h3YWRkcik7CisJCisJcG9ydCA9IHMtPnNibV9iYXNlICsgUl9NQUNfQUREUl9CQVNFOworCVNCTUFDX1dSSVRFQ1NSKHBvcnQscmVnKTsKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19FVEhFUk5FVF9BRERSOworCisjaWZkZWYgQ09ORklHX1NCMV9QQVNTXzFfV09SS0FST1VORFMKKwkvKgorCSAqIFBhc3MxIFNPQ3MgZG8gbm90IHJlY2VpdmUgcGFja2V0cyBhZGRyZXNzZWQgdG8gdGhlCisJICogZGVzdGluYXRpb24gYWRkcmVzcyBpbiB0aGUgUl9NQUNfRVRIRVJORVRfQUREUiByZWdpc3Rlci4KKwkgKiBTZXQgdGhlIHZhbHVlIHRvIHplcm8uCisJICovCisJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKyNlbHNlCisJU0JNQUNfV1JJVEVDU1IocG9ydCxyZWcpOworI2VuZGlmCisJCisJLyoKKwkgKiBTZXQgdGhlIHJlY2VpdmUgZmlsdGVyIGZvciBubyBwYWNrZXRzLCBhbmQgd3JpdGUgdmFsdWVzCisJICogdG8gdGhlIHZhcmlvdXMgY29uZmlnIHJlZ2lzdGVycworCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9yeGZpbHRlciwwKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1faW1yLDApOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9mcmFtZWNmZyxmcmFtZWNmZyk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ZpZm9jZmcsZmlmbyk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2NmZyxjZmcpOworCQorCS8qCisJICogSW5pdGlhbGl6ZSBETUEgY2hhbm5lbHMgKHJpbmdzIHNob3VsZCBiZSBvayBub3cpCisJICovCisJCisJc2JkbWFfY2hhbm5lbF9zdGFydCgmKHMtPnNibV9yeGRtYSksIERNQV9SWCk7CisJc2JkbWFfY2hhbm5lbF9zdGFydCgmKHMtPnNibV90eGRtYSksIERNQV9UWCk7CisJCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIHNwZWVkLCBkdXBsZXgsIGFuZCBmbG93IGNvbnRyb2wKKwkgKi8KKworCXNibWFjX3NldF9zcGVlZChzLHMtPnNibV9zcGVlZCk7CisJc2JtYWNfc2V0X2R1cGxleChzLHMtPnNibV9kdXBsZXgscy0+c2JtX2ZjKTsKKwkKKwkvKgorCSAqIEZpbGwgdGhlIHJlY2VpdmUgcmluZworCSAqLworCQorCXNiZG1hX2ZpbGxyaW5nKCYocy0+c2JtX3J4ZG1hKSk7CisJCisJLyogCisJICogVHVybiBvbiB0aGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGUgZW5hYmxlIHJlZ2lzdGVyCisJICovICAgICAgCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2VuYWJsZSwKKwkJICAgICAgIE1fTUFDX1JYRE1BX0VOMCB8CisJCSAgICAgICBNX01BQ19UWERNQV9FTjAgfAorCQkgICAgICAgTV9NQUNfUlhfRU5BQkxFIHwKKwkJICAgICAgIE1fTUFDX1RYX0VOQUJMRSk7CisJCisJCisKKworI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCS8qCisJICogQWNjZXB0IGFueSBUWCBpbnRlcnJ1cHQgYW5kIEVPUCBjb3VudC90aW1lciBSWCBpbnRlcnJ1cHRzIG9uIGNoIDAKKwkgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1faW1yLAorCQkgICAgICAgKChNX01BQ19JTlRfRU9QX0NPVU5UIHwgTV9NQUNfSU5UX0VPUF9USU1FUikgPDwgU19NQUNfVFhfQ0gwKSB8CisJCSAgICAgICAoKE1fTUFDX0lOVF9FT1BfQ09VTlQgfCBNX01BQ19JTlRfRU9QX1RJTUVSKSA8PCBTX01BQ19SWF9DSDApKTsKKyNlbHNlCisJLyoKKwkgKiBBY2NlcHQgYW55IGtpbmQgb2YgaW50ZXJydXB0IG9uIFRYIGFuZCBSWCBETUEgY2hhbm5lbCAwCisJICovCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ltciwKKwkJICAgICAgIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19UWF9DSDApIHwKKwkJICAgICAgIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApKTsKKyNlbmRpZgorCQorCS8qIAorCSAqIEVuYWJsZSByZWNlaXZpbmcgdW5pY2FzdHMgYW5kIGJyb2FkY2FzdHMgCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX3J4ZmlsdGVyLE1fTUFDX1VDQVNUX0VOIHwgTV9NQUNfQkNBU1RfRU4pOworCQorCS8qCisJICogd2UncmUgcnVubmluZyBub3cuIAorCSAqLworCQorCXMtPnNibV9zdGF0ZSA9IHNibWFjX3N0YXRlX29uOworCQorCS8qIAorCSAqIFByb2dyYW0gbXVsdGljYXN0IGFkZHJlc3NlcyAKKwkgKi8KKwkKKwlzYm1hY19zZXRtdWx0aShzKTsKKwkKKwkvKiAKKwkgKiBJZiBjaGFubmVsIHdhcyBpbiBwcm9taXNjdW91cyBtb2RlIGJlZm9yZSwgdHVybiB0aGF0IG9uIAorCSAqLworCQorCWlmIChzLT5zYm1fZGV2ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlzYm1hY19wcm9taXNjdW91c19tb2RlKHMsMSk7CisJfQorCQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfQ0hBTk5FTF9TVE9QKHMpCisgKiAgCisgKiAgU3RvcCBwYWNrZXQgcHJvY2Vzc2luZyBvbiB0aGlzIE1BQy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfY2hhbm5lbF9zdG9wKHN0cnVjdCBzYm1hY19zb2Z0YyAqcykKK3sKKwkvKiBkb24ndCBkbyB0aGlzIGlmIGFscmVhZHkgc3RvcHBlZCAqLworCQorCWlmIChzLT5zYm1fc3RhdGUgPT0gc2JtYWNfc3RhdGVfb2ZmKQorCQlyZXR1cm47CisJCisJLyogZG9uJ3QgYWNjZXB0IGFueSBwYWNrZXRzLCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX3J4ZmlsdGVyLDApOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9pbXIsMCk7CisJCisJLyogVHVybiBvZmYgdGlja2VyICovCisJCisJLyogWFhYICovCisJCisJLyogdHVybiBvZmYgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2VuYWJsZSwwKTsKKwkKKwkvKiBXZSdyZSBzdG9wcGVkIG5vdy4gKi8KKwkKKwlzLT5zYm1fc3RhdGUgPSBzYm1hY19zdGF0ZV9vZmY7CisJCisJLyoKKwkgKiBTdG9wIERNQSBjaGFubmVscyAocmluZ3Mgc2hvdWxkIGJlIG9rIG5vdykKKwkgKi8KKwkKKwlzYmRtYV9jaGFubmVsX3N0b3AoJihzLT5zYm1fcnhkbWEpKTsKKwlzYmRtYV9jaGFubmVsX3N0b3AoJihzLT5zYm1fdHhkbWEpKTsKKwkKKwkvKiBFbXB0eSB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZ3MgKi8KKwkKKwlzYmRtYV9lbXB0eXJpbmcoJihzLT5zYm1fcnhkbWEpKTsKKwlzYmRtYV9lbXB0eXJpbmcoJihzLT5zYm1fdHhkbWEpKTsKKwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRfQ0hBTk5FTF9TVEFURShzdGF0ZSkKKyAqICAKKyAqICBTZXQgdGhlIGNoYW5uZWwncyBzdGF0ZSBPTiBvciBPRkYKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc3RhdGUgLSBuZXcgc3RhdGUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBvbGQgc3RhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBzYm1hY19zdGF0ZV90IHNibWFjX3NldF9jaGFubmVsX3N0YXRlKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MsCisJCQkJCSAgICAgc2JtYWNfc3RhdGVfdCBzdGF0ZSkKK3sKKwlzYm1hY19zdGF0ZV90IG9sZHN0YXRlID0gc2MtPnNibV9zdGF0ZTsKKwkKKwkvKgorCSAqIElmIHNhbWUgYXMgcHJldmlvdXMgc3RhdGUsIHJldHVybgorCSAqLworCQorCWlmIChzdGF0ZSA9PSBvbGRzdGF0ZSkgeworCQlyZXR1cm4gb2xkc3RhdGU7CisJfQorCQorCS8qCisJICogSWYgbmV3IHN0YXRlIGlzIE9OLCB0dXJuIGNoYW5uZWwgb24gCisJICovCisJCisJaWYgKHN0YXRlID09IHNibWFjX3N0YXRlX29uKSB7CisJCXNibWFjX2NoYW5uZWxfc3RhcnQoc2MpOworCX0KKwllbHNlIHsKKwkJc2JtYWNfY2hhbm5lbF9zdG9wKHNjKTsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm4gcHJldmlvdXMgc3RhdGUKKwkgKi8KKwkKKwlyZXR1cm4gb2xkc3RhdGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19QUk9NSVNDVU9VU19NT0RFKHNjLG9ub2ZmKQorICogIAorICogIFR1cm4gb24gb3Igb2ZmIHByb21pc2N1b3VzIG1vZGUKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc2MgLSBzb2Z0YworICogICAgICBvbm9mZiAtIDEgdG8gdHVybiBvbiwgMCB0byB0dXJuIG9mZgorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLGludCBvbm9mZikKK3sKKwl1aW50NjRfdCByZWc7CisJCisJaWYgKHNjLT5zYm1fc3RhdGUgIT0gc2JtYWNfc3RhdGVfb24pCisJCXJldHVybjsKKwkKKwlpZiAob25vZmYpIHsKKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnIHw9IE1fTUFDX0FMTFBLVF9FTjsKKwkJU0JNQUNfV1JJVEVDU1Ioc2MtPnNibV9yeGZpbHRlcixyZWcpOworCX0JCisJZWxzZSB7CisJCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJCXJlZyAmPSB+TV9NQUNfQUxMUEtUX0VOOworCQlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1NFVElQSERSX09GRlNFVChzYyxvbm9mZikKKyAqICAKKyAqICBTZXQgdGhlIGlwaGRyIG9mZnNldCBhcyAxNSBhc3N1bWluZyBldGhlcm5ldCBlbmNhcHN1bGF0aW9uCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHNjIC0gc29mdGMKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX3NldF9pcGhkcl9vZmZzZXQoc3RydWN0IHNibWFjX3NvZnRjICpzYykKK3sKKwl1aW50NjRfdCByZWc7CisJCisJLyogSGFyZCBjb2RlIHRoZSBvZmYgc2V0IHRvIDE1IGZvciBub3cgKi8KKwlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCXJlZyAmPSB+TV9NQUNfSVBIRFJfT0ZGU0VUIHwgVl9NQUNfSVBIRFJfT0ZGU0VUKDE1KTsKKwlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJCisJLyogcmVhZCBzeXN0ZW0gaWRlbnRpZmljYXRpb24gdG8gZGV0ZXJtaW5lIHJldmlzaW9uICovCisJaWYgKHBlcmlwaF9yZXYgPj0gMikgeworCQlzYy0+cnhfaHdfY2hlY2tzdW0gPSBFTkFCTEU7CisJfSBlbHNlIHsKKwkJc2MtPnJ4X2h3X2NoZWNrc3VtID0gRElTQUJMRTsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19BRERSMlJFRyhwdHIpCisgKiAgCisgKiAgQ29udmVydCBzaXggYnl0ZXMgaW50byB0aGUgNjQtYml0IHJlZ2lzdGVyIHZhbHVlIHRoYXQKKyAqICB3ZSB0eXBpY2FsbHkgd3JpdGUgaW50byB0aGUgU0JNQUMncyBhZGRyZXNzL21jYXN0IHJlZ2lzdGVycworICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBwdHIgLSBwb2ludGVyIHRvIDYgYnl0ZXMKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICByZWdpc3RlciB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdWludDY0X3Qgc2JtYWNfYWRkcjJyZWcodW5zaWduZWQgY2hhciAqcHRyKQoreworCXVpbnQ2NF90IHJlZyA9IDA7CisJCisJcHRyICs9IDY7CisJCisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCXJlZyA8PD0gODsKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwlyZWcgPDw9IDg7CisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCXJlZyA8PD0gODsKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwkKKwlyZXR1cm4gcmVnOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU0VUX1NQRUVEKHMsc3BlZWQpCisgKiAgCisgKiAgQ29uZmlndXJlIExBTiBzcGVlZCBmb3IgdGhlIHNwZWNpZmllZCBNQUMuCisgKiAgV2FybmluZzogbXVzdCBiZSBjYWxsZWQgd2hlbiBNQUMgaXMgb2ZmIQorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIHNwZWVkIC0gc3BlZWQgdG8gc2V0IE1BQyB0byAoc2VlIHNibWFjX3NwZWVkX3QgZW51bSkKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAxIGlmIHN1Y2Nlc3NmdWwKKyAqICAgICAgMCBpbmRpY2F0ZXMgaW52YWxpZCBwYXJhbWV0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfc2V0X3NwZWVkKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxzYm1hY19zcGVlZF90IHNwZWVkKQoreworCXVpbnQ2NF90IGNmZzsKKwl1aW50NjRfdCBmcmFtZWNmZzsKKworCS8qCisJICogU2F2ZSBuZXcgY3VycmVudCB2YWx1ZXMKKwkgKi8KKwkKKwlzLT5zYm1fc3BlZWQgPSBzcGVlZDsKKwkKKwlpZiAocy0+c2JtX3N0YXRlID09IHNibWFjX3N0YXRlX29uKQorCQlyZXR1cm4gMDsJLyogc2F2ZSBmb3IgbmV4dCByZXN0YXJ0ICovCisKKwkvKgorCSAqIFJlYWQgY3VycmVudCByZWdpc3RlciB2YWx1ZXMgCisJICovCisJCisJY2ZnID0gU0JNQUNfUkVBRENTUihzLT5zYm1fbWFjY2ZnKTsKKwlmcmFtZWNmZyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX2ZyYW1lY2ZnKTsKKwkKKwkvKgorCSAqIE1hc2sgb3V0IHRoZSBzdHVmZiB3ZSB3YW50IHRvIGNoYW5nZQorCSAqLworCQorCWNmZyAmPSB+KE1fTUFDX0JVUlNUX0VOIHwgTV9NQUNfU1BFRURfU0VMKTsKKwlmcmFtZWNmZyAmPSB+KE1fTUFDX0lGR19SWCB8IE1fTUFDX0lGR19UWCB8IE1fTUFDX0lGR19USFJTSCB8CisJCSAgICAgIE1fTUFDX1NMT1RfU0laRSk7CisJCisJLyoKKwkgKiBOb3cgYWRkIGluIHRoZSBuZXcgYml0cworCSAqLworCQorCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIHNibWFjX3NwZWVkXzEwOgorCQlmcmFtZWNmZyB8PSBWX01BQ19JRkdfUlhfMTAgfAorCQkJVl9NQUNfSUZHX1RYXzEwIHwKKwkJCUtfTUFDX0lGR19USFJTSF8xMCB8CisJCQlWX01BQ19TTE9UX1NJWkVfMTA7CisJCWNmZyB8PSBWX01BQ19TUEVFRF9TRUxfMTBNQlBTOworCQlicmVhazsKKwkJCisJY2FzZSBzYm1hY19zcGVlZF8xMDA6CisJCWZyYW1lY2ZnIHw9IFZfTUFDX0lGR19SWF8xMDAgfAorCQkJVl9NQUNfSUZHX1RYXzEwMCB8CisJCQlWX01BQ19JRkdfVEhSU0hfMTAwIHwKKwkJCVZfTUFDX1NMT1RfU0laRV8xMDA7CisJCWNmZyB8PSBWX01BQ19TUEVFRF9TRUxfMTAwTUJQUyA7CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX3NwZWVkXzEwMDA6CisJCWZyYW1lY2ZnIHw9IFZfTUFDX0lGR19SWF8xMDAwIHwKKwkJCVZfTUFDX0lGR19UWF8xMDAwIHwKKwkJCVZfTUFDX0lGR19USFJTSF8xMDAwIHwKKwkJCVZfTUFDX1NMT1RfU0laRV8xMDAwOworCQljZmcgfD0gVl9NQUNfU1BFRURfU0VMXzEwMDBNQlBTIHwgTV9NQUNfQlVSU1RfRU47CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX3NwZWVkX2F1dG86CQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwkKKwkvKgorCSAqIFNlbmQgdGhlIGJpdHMgYmFjayB0byB0aGUgaGFyZHdhcmUgCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ZyYW1lY2ZnLGZyYW1lY2ZnKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjY2ZnLGNmZyk7CisJCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU0VUX0RVUExFWChzLGR1cGxleCxmYykKKyAqICAKKyAqICBTZXQgRXRoZXJuZXQgZHVwbGV4IGFuZCBmbG93IGNvbnRyb2wgb3B0aW9ucyBmb3IgdGhpcyBNQUMKKyAqICBXYXJuaW5nOiBtdXN0IGJlIGNhbGxlZCB3aGVuIE1BQyBpcyBvZmYhCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgZHVwbGV4IC0gZHVwbGV4IHNldHRpbmcgKHNlZSBzYm1hY19kdXBsZXhfdCkKKyAqICAJICAgZmMgLSBmbG93IGNvbnRyb2wgc2V0dGluZyAoc2VlIHNibWFjX2ZjX3QpCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgMSBpZiBvaworICogIAkgICAwIGlmIGFuIGludmFsaWQgcGFyYW1ldGVyIGNvbWJpbmF0aW9uIHdhcyBzcGVjaWZpZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCBzYm1hY19zZXRfZHVwbGV4KHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxzYm1hY19kdXBsZXhfdCBkdXBsZXgsc2JtYWNfZmNfdCBmYykKK3sKKwl1aW50NjRfdCBjZmc7CisJCisJLyoKKwkgKiBTYXZlIG5ldyBjdXJyZW50IHZhbHVlcworCSAqLworCQorCXMtPnNibV9kdXBsZXggPSBkdXBsZXg7CisJcy0+c2JtX2ZjID0gZmM7CisJCisJaWYgKHMtPnNibV9zdGF0ZSA9PSBzYm1hY19zdGF0ZV9vbikKKwkJcmV0dXJuIDA7CS8qIHNhdmUgZm9yIG5leHQgcmVzdGFydCAqLworCQorCS8qCisJICogUmVhZCBjdXJyZW50IHJlZ2lzdGVyIHZhbHVlcyAKKwkgKi8KKwkKKwljZmcgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tYWNjZmcpOworCQorCS8qCisJICogTWFzayBvZmYgdGhlIHN0dWZmIHdlJ3JlIGFib3V0IHRvIGNoYW5nZQorCSAqLworCQorCWNmZyAmPSB+KE1fTUFDX0ZDX1NFTCB8IE1fTUFDX0ZDX0NNRCB8IE1fTUFDX0hEWF9FTik7CisJCisJCisJc3dpdGNoIChkdXBsZXgpIHsKKwljYXNlIHNibWFjX2R1cGxleF9oYWxmOgorCQlzd2l0Y2ggKGZjKSB7CisJCWNhc2Ugc2JtYWNfZmNfZGlzYWJsZWQ6CisJCQljZmcgfD0gTV9NQUNfSERYX0VOIHwgVl9NQUNfRkNfQ01EX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBzYm1hY19mY19jb2xsaXNpb246CisJCQljZmcgfD0gTV9NQUNfSERYX0VOIHwgVl9NQUNfRkNfQ01EX0VOQUJMRUQ7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2NhcnJpZXI6CisJCQljZmcgfD0gTV9NQUNfSERYX0VOIHwgVl9NQUNfRkNfQ01EX0VOQUJfRkFMU0VDQVJSOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBzYm1hY19mY19hdXRvOgkJLyogWFhYIG5vdCBpbXBsZW1lbnRlZCAqLworCQkJLyogZmFsbCB0aHJvdWdoICovCQkJCQkgICAKKwkJY2FzZSBzYm1hY19mY19mcmFtZToJCS8qIG5vdCB2YWxpZCBpbiBoYWxmIGR1cGxleCAqLworCQlkZWZhdWx0OgkJCS8qIGludmFsaWQgc2VsZWN0aW9uICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBzYm1hY19kdXBsZXhfZnVsbDoKKwkJc3dpdGNoIChmYykgeworCQljYXNlIHNibWFjX2ZjX2Rpc2FibGVkOgorCQkJY2ZnIHw9IFZfTUFDX0ZDX0NNRF9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2Ugc2JtYWNfZmNfZnJhbWU6CisJCQljZmcgfD0gVl9NQUNfRkNfQ01EX0VOQUJMRUQ7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2NvbGxpc2lvbjoJLyogbm90IHZhbGlkIGluIGZ1bGwgZHVwbGV4ICovCisJCWNhc2Ugc2JtYWNfZmNfY2FycmllcjoJCS8qIG5vdCB2YWxpZCBpbiBmdWxsIGR1cGxleCAqLworCQljYXNlIHNibWFjX2ZjX2F1dG86CQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCQkvKiBmYWxsIHRocm91Z2ggKi8JCQkJCSAgIAorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzYm1hY19kdXBsZXhfYXV0bzoKKwkJLyogWFhYIG5vdCBpbXBsZW1lbnRlZCAqLworCQlicmVhazsKKwl9CisJCisJLyoKKwkgKiBTZW5kIHRoZSBiaXRzIGJhY2sgdG8gdGhlIGhhcmR3YXJlIAorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tYWNjZmcsY2ZnKTsKKwkKKwlyZXR1cm4gMTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19JTlRSKCkKKyAqICAKKyAqICBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgTUFDIGludGVycnVwdHMKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgTUFDIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzYm1hY19pbnRyKGludCBpcnEsdm9pZCAqZGV2X2luc3RhbmNlLHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJdWludDY0X3QgaXNyOworCWludCBoYW5kbGVkID0gMDsKKworCWZvciAoOzspIHsKKwkJCisJCS8qCisJCSAqIFJlYWQgdGhlIElTUiAodGhpcyBjbGVhcnMgdGhlIGJpdHMgaW4gdGhlIHJlYWwKKwkJICogcmVnaXN0ZXIsIGV4Y2VwdCBmb3IgY291bnRlciBhZGRyKQorCQkgKi8KKwkJCisJCWlzciA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9pc3IpICYgfk1fTUFDX0NPVU5URVJfQUREUjsKKwkJCisJCWlmIChpc3IgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCQkKKwkJLyoKKwkJICogVHJhbnNtaXRzIG9uIGNoYW5uZWwgMAorCQkgKi8KKwkJCisJCWlmIChpc3IgJiAoTV9NQUNfSU5UX0NIQU5ORUwgPDwgU19NQUNfVFhfQ0gwKSkgeworCQkJc2JkbWFfdHhfcHJvY2VzcyhzYywmKHNjLT5zYm1fdHhkbWEpKTsKKwkJfQorCQkKKwkJLyoKKwkJICogUmVjZWl2ZXMgb24gY2hhbm5lbCAwCisJCSAqLworCisJCS8qCisJCSAqIEl0J3MgaW1wb3J0YW50IHRvIHRlc3QgYWxsIHRoZSBiaXRzIChvciBhdCBsZWFzdCB0aGUKKwkJICogRU9QX1NFRU4gYml0KSB3aGVuIGRlY2lkaW5nIHRvIGRvIHRoZSBSWCBwcm9jZXNzCisJCSAqIHBhcnRpY3VsYXJseSB3aGVuIGNvYWxlc2NpbmcsIHRvIG1ha2Ugc3VyZSB3ZQorCQkgKiB0YWtlIGNhcmUgb2YgdGhlIGZvbGxvd2luZzoKKwkJICoKKwkJICogSWYgeW91IGhhdmUgc29tZSBwYWNrZXRzIHdhaXRpbmcgKGhhdmUgYmVlbiByZWNlaXZlZAorCQkgKiBidXQgbm8gaW50ZXJydXB0KSBhbmQgZ2V0IGEgVFggaW50ZXJydXB0IGJlZm9yZQorCQkgKiB0aGUgUlggdGltZXIgb3IgY291bnRlciBleHBpcmVzLCByZWFkaW5nIHRoZSBJU1IKKwkJICogYWJvdmUgd2lsbCBjbGVhciB0aGUgdGltZXIgYW5kIGNvdW50ZXIsIGFuZCB5b3UKKwkJICogd29uJ3QgZ2V0IGFub3RoZXIgaW50ZXJydXB0IHVudGlsIGEgcGFja2V0IHNob3dzCisJCSAqIHVwIHRvIHN0YXJ0IHRoZSB0aW1lciBhZ2Fpbi4gIFRlc3RpbmcKKwkJICogRU9QX1NFRU4gaGVyZSB0YWtlcyBjYXJlIG9mIHRoaXMgY2FzZS4KKwkJICogKEVPUF9TRUVOIGlzIHBhcnQgb2YgTV9NQUNfSU5UX0NIQU5ORUwgPDwgU19NQUNfUlhfQ0gwKQorCQkgKi8KKwkJIAorCQkKKwkJaWYgKGlzciAmIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApKSB7CisJCQlzYmRtYV9yeF9wcm9jZXNzKHNjLCYoc2MtPnNibV9yeGRtYSkpOworCQl9CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU1RBUlRfVFgoc2tiLGRldikKKyAqICAKKyAqICBTdGFydCBvdXRwdXQgb24gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuICBCYXNpY2FsbHksIHdlIAorICogIHF1ZXVlIGFzIG1hbnkgYnVmZmVycyBhcyB3ZSBjYW4gdW50aWwgdGhlIHJpbmcgZmlsbHMgdXAsIG9yCisgKiAgd2UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBxdWV1ZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICAKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgaW50IHNibWFjX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJCisJLyogbG9jayBldGggaXJxICovCisJc3Bpbl9sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisJCisJLyoKKwkgKiBQdXQgdGhlIGJ1ZmZlciBvbiB0aGUgdHJhbnNtaXQgcmluZy4gIElmIHdlIAorCSAqIGRvbid0IGhhdmUgcm9vbSwgc3RvcCB0aGUgcXVldWUuCisJICovCisJCisJaWYgKHNiZG1hX2FkZF90eGJ1ZmZlcigmKHNjLT5zYm1fdHhkbWEpLHNrYikpIHsKKwkJLyogWFhYIHNhdmUgc2tiIHRoYXQgd2UgY291bGQgbm90IHNlbmQgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJnNjLT5zYm1fbG9jayk7CisKKwkJcmV0dXJuIDE7CisJfQorCQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQorCXNwaW5fdW5sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU0VUTVVMVEkoc2MpCisgKiAgCisgKiAgUmVwcm9ncmFtIHRoZSBtdWx0aWNhc3QgdGFibGUgaW50byB0aGUgaGFyZHdhcmUsIGdpdmVuCisgKiAgdGhlIGxpc3Qgb2YgbXVsdGljYXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyZmFjZQorICogIHN0cnVjdHVyZS4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc2MgLSBzb2Z0YworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfc2V0bXVsdGkoc3RydWN0IHNibWFjX3NvZnRjICpzYykKK3sKKwl1aW50NjRfdCByZWc7CisJc2JtYWNfcG9ydF90IHBvcnQ7CisJaW50IGlkeDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2MtPnNibV9kZXY7CisJCisJLyogCisJICogQ2xlYXIgb3V0IGVudGlyZSBtdWx0aWNhc3QgdGFibGUuICBXZSBkbyB0aGlzIGJ5IG51a2luZworCSAqIHRoZSBlbnRpcmUgaGFzaCB0YWJsZSBhbmQgYWxsIHRoZSBkaXJlY3QgbWF0Y2hlcyBleGNlcHQKKwkgKiB0aGUgZmlyc3Qgb25lLCB3aGljaCBpcyB1c2VkIGZvciBvdXIgc3RhdGlvbiBhZGRyZXNzIAorCSAqLworCQorCWZvciAoaWR4ID0gMTsgaWR4IDwgTUFDX0FERFJfQ09VTlQ7IGlkeCsrKSB7CisJCXBvcnQgPSBzYy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0UrKGlkeCpzaXplb2YodWludDY0X3QpKTsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsJCisJfQorCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0hBU0hfQ09VTlQ7IGlkeCsrKSB7CisJCXBvcnQgPSBzYy0+c2JtX2Jhc2UgKyBSX01BQ19IQVNIX0JBU0UrKGlkeCpzaXplb2YodWludDY0X3QpKTsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsJCisJfQorCQorCS8qCisJICogQ2xlYXIgdGhlIGZpbHRlciB0byBzYXkgd2UgZG9uJ3Qgd2FudCBhbnkgbXVsdGljYXN0cy4KKwkgKi8KKwkKKwlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCXJlZyAmPSB+KE1fTUFDX01DQVNUX0lOViB8IE1fTUFDX01DQVNUX0VOKTsKKwlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJLyogCisJCSAqIEVuYWJsZSBBTEwgbXVsdGljYXN0cy4gIERvIHRoaXMgYnkgaW52ZXJ0aW5nIHRoZSAKKwkJICogbXVsdGljYXN0IGVuYWJsZSBiaXQuIAorCQkgKi8KKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnIHw9IChNX01BQ19NQ0FTVF9JTlYgfCBNX01BQ19NQ0FTVF9FTik7CisJCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwkJcmV0dXJuOworCX0KKwkKKworCS8qIAorCSAqIFByb2dhbSBuZXcgbXVsdGljYXN0IGVudHJpZXMuICBGb3Igbm93LCBvbmx5IHVzZSB0aGUKKwkgKiBwZXJmZWN0IGZpbHRlci4gIEluIHRoZSBmdXR1cmUgd2UnbGwgbmVlZCB0byB1c2UgdGhlCisJICogaGFzaCBmaWx0ZXIgaWYgdGhlIHBlcmZlY3QgZmlsdGVyIG92ZXJmbG93cworCSAqLworCQorCS8qIFhYWCBvbmx5IHVzaW5nIHBlcmZlY3QgZmlsdGVyIGZvciBub3csIG5lZWQgdG8gdXNlIGhhc2gKKwkgKiBYWFggaWYgdGhlIHRhYmxlIG92ZXJmbG93cyAqLworCQorCWlkeCA9IDE7CQkvKiBza2lwIHN0YXRpb24gYWRkcmVzcyAqLworCW1jbGlzdCA9IGRldi0+bWNfbGlzdDsKKwl3aGlsZSAobWNsaXN0ICYmIChpZHggPCBNQUNfQUREUl9DT1VOVCkpIHsKKwkJcmVnID0gc2JtYWNfYWRkcjJyZWcobWNsaXN0LT5kbWlfYWRkcik7CisJCXBvcnQgPSBzYy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0UrKGlkeCAqIHNpemVvZih1aW50NjRfdCkpOworCQlTQk1BQ19XUklURUNTUihwb3J0LHJlZyk7CisJCWlkeCsrOworCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7CisJfQorCQorCS8qCQorCSAqIEVuYWJsZSB0aGUgImFjY2VwdCBtdWx0aWNhc3QgYml0cyIgaWYgd2UgcHJvZ3JhbW1lZCBhdCBsZWFzdCBvbmUKKwkgKiBtdWx0aWNhc3QuIAorCSAqLworCQorCWlmIChpZHggPiAxKSB7CisJCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJCXJlZyB8PSBNX01BQ19NQ0FTVF9FTjsKKwkJU0JNQUNfV1JJVEVDU1Ioc2MtPnNibV9yeGZpbHRlcixyZWcpOworCX0KK30KKworCisKKyNpZiBkZWZpbmVkKFNCTUFDX0VUSDBfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDFfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDJfSFdBRERSKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19QQVJTRV9YRElHSVQoc3RyKQorICogIAorICogIFBhcnNlIGEgaGV4IGRpZ2l0LCByZXR1cm5pbmcgaXRzIHZhbHVlCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHN0ciAtIGNoYXJhY3RlcgorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIGhleCB2YWx1ZSwgb3IgLTEgaWYgaW52YWxpZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX3BhcnNlX3hkaWdpdChjaGFyIHN0cikKK3sKKwlpbnQgZGlnaXQ7CisJCisJaWYgKChzdHIgPj0gJzAnKSAmJiAoc3RyIDw9ICc5JykpCisJCWRpZ2l0ID0gc3RyIC0gJzAnOworCWVsc2UgaWYgKChzdHIgPj0gJ2EnKSAmJiAoc3RyIDw9ICdmJykpCisJCWRpZ2l0ID0gc3RyIC0gJ2EnICsgMTA7CisJZWxzZSBpZiAoKHN0ciA+PSAnQScpICYmIChzdHIgPD0gJ0YnKSkKKwkJZGlnaXQgPSBzdHIgLSAnQScgKyAxMDsKKwllbHNlCisJCXJldHVybiAtMTsKKwkKKwlyZXR1cm4gZGlnaXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfUEFSU0VfSFdBRERSKHN0cixod2FkZHIpCisgKiAgCisgKiAgQ29udmVydCBhIHN0cmluZyBpbiB0aGUgZm9ybSB4eDp4eDp4eDp4eDp4eDp4eCBpbnRvIGEgNi1ieXRlCisgKiAgRXRoZXJuZXQgYWRkcmVzcy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc3RyIC0gc3RyaW5nCisgKiAgCSAgIGh3YWRkciAtIHBvaW50ZXIgdG8gaGFyZHdhcmUgYWRkcmVzcworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIDAgaWYgb2ssIGVsc2UgLTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCBzYm1hY19wYXJzZV9od2FkZHIoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpod2FkZHIpCit7CisJaW50IGRpZ2l0MSxkaWdpdDI7CisJaW50IGlkeCA9IDY7CisJCisJd2hpbGUgKCpzdHIgJiYgKGlkeCA+IDApKSB7CisJCWRpZ2l0MSA9IHNibWFjX3BhcnNlX3hkaWdpdCgqc3RyKTsKKwkJaWYgKGRpZ2l0MSA8IDApCisJCQlyZXR1cm4gLTE7CisJCXN0cisrOworCQlpZiAoISpzdHIpCisJCQlyZXR1cm4gLTE7CisJCQorCQlpZiAoKCpzdHIgPT0gJzonKSB8fCAoKnN0ciA9PSAnLScpKSB7CisJCQlkaWdpdDIgPSBkaWdpdDE7CisJCQlkaWdpdDEgPSAwOworCQl9CisJCWVsc2UgeworCQkJZGlnaXQyID0gc2JtYWNfcGFyc2VfeGRpZ2l0KCpzdHIpOworCQkJaWYgKGRpZ2l0MiA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJc3RyKys7CisJCX0KKwkJCisJCSpod2FkZHIrKyA9IChkaWdpdDEgPDwgNCkgfCBkaWdpdDI7CisJCWlkeC0tOworCQkKKwkJaWYgKCpzdHIgPT0gJy0nKQorCQkJc3RyKys7CisJCWlmICgqc3RyID09ICc6JykKKwkJCXN0cisrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNiMTI1MF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpfZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAobmV3X210dSA+ICBFTkVUX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlfZGV2LT5tdHUgPSBuZXdfbXR1OworCXByaW50ayhLRVJOX0lORk8gImNoYW5naW5nIHRoZSBtdHUgdG8gJWRcbiIsIG5ld19tdHUpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0lOSVQoZGV2KQorICogIAorICogIEF0dGFjaCByb3V0aW5lIC0gaW5pdCBoYXJkd2FyZSBhbmQgaG9vayBvdXJzZWx2ZXMgaW50byBsaW51eAorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBkZXYgLSBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIHN0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjOworCXVuc2lnbmVkIGNoYXIgKmVhZGRyOworCXVpbnQ2NF90IGVhX3JlZzsKKwlpbnQgaTsKKwlpbnQgZXJyOworCQorCXNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwkvKiBEZXRlcm1pbmUgY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8KKwkKKwlzYy0+c2JtX2Jhc2UgPSBJT0FERFIoZGV2LT5iYXNlX2FkZHIpOworCXNjLT5zYm1fZGV2ID0gZGV2OworCXNjLT5zYmVfaWR4ID0gaWR4OworCQorCWVhZGRyID0gc2MtPnNibV9od2FkZHI7CisJCisJLyogCisJICogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gIFRoZSBmaXJ3bWFyZSBsZWZ0IHRoaXMgcHJvZ3JhbW1lZAorCSAqIGZvciB1cyBpbiB0aGUgZXRoZXJuZXQgYWRkcmVzcyByZWdpc3RlciBmb3IgZWFjaCBtYWMuCisJICovCisJCisJZWFfcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX2Jhc2UgKyBSX01BQ19FVEhFUk5FVF9BRERSKTsKKwlTQk1BQ19XUklURUNTUihzYy0+c2JtX2Jhc2UgKyBSX01BQ19FVEhFUk5FVF9BRERSLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWVhZGRyW2ldID0gKHVpbnQ4X3QpIChlYV9yZWcgJiAweEZGKTsKKwkJZWFfcmVnID4+PSA4OworCX0KKwkKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBlYWRkcltpXTsKKwl9CisJCisJCisJLyoKKwkgKiBJbml0IHBhY2tldCBzaXplIAorCSAqLworCQorCXNjLT5zYm1fYnVmZmVyc2l6ZSA9IEVORVRfUEFDS0VUX1NJWkUgKyBTTVBfQ0FDSEVfQllURVMgKiAyICsgRVRIRVJfQUxJR047CisKKwkvKiAKKwkgKiBJbml0aWFsaXplIGNvbnRleHQgKGdldCBwb2ludGVycyB0byByZWdpc3RlcnMgYW5kIHN0dWZmKSwgdGhlbgorCSAqIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHRhYmxlcy4KKwkgKi8KKwkKKwlzYm1hY19pbml0Y3R4KHNjKTsKKwkKKwkvKgorCSAqIFNldCB1cCBMaW51eCBkZXZpY2UgY2FsbGlucworCSAqLworCQorCXNwaW5fbG9ja19pbml0KCYoc2MtPnNibV9sb2NrKSk7CisJCisJZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBzYm1hY19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gc2JtYWNfc3RhcnRfdHg7CisJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBzYm1hY19jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IHNibWFjX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNibWFjX3NldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgICAgICAgICAgID0gc2JtYWNfbWlpX2lvY3RsOworCWRldi0+dHhfdGltZW91dCAgICAgICAgID0gc2JtYWNfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisKKwlkZXYtPmNoYW5nZV9tdHUgICAgICAgICA9IHNiMTI1MF9jaGFuZ2VfbXR1OworCisJLyogVGhpcyBpcyBuZWVkZWQgZm9yIFBBU1MyIGZvciBSeCBIL1cgY2hlY2tzdW0gZmVhdHVyZSAqLworCXNibWFjX3NldF9pcGhkcl9vZmZzZXQoc2MpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5pbml0OworCisJaWYgKHBlcmlwaF9yZXYgPj0gMikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZW5hYmxpbmcgVENQIHJjdiBjaGVja3N1bVxuIiwKKwkJCXNjLT5zYm1fZGV2LT5uYW1lKTsKKwl9CisKKwkvKgorCSAqIERpc3BsYXkgRXRoZXJuZXQgYWRkcmVzcyAodGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBjb25maWcKKwkgKiBwcm9jZXNzIHNvIHdlIG5lZWQgdG8gZmluaXNoIG9mZiB0aGUgY29uZmlnIG1lc3NhZ2UgdGhhdAorCSAqIHdhcyBiZWluZyBkaXNwbGF5ZWQpCisJICovCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiJXM6IFNpQnl0ZSBFdGhlcm5ldCBhdCAweCUwOGxYLCBhZGRyZXNzOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwgCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsCisJICAgICAgIGVhZGRyWzBdLGVhZGRyWzFdLGVhZGRyWzJdLGVhZGRyWzNdLGVhZGRyWzRdLGVhZGRyWzVdKTsKKwkKKworCXJldHVybiAwOworCitvdXRfdW5pbml0OgorCXNibWFjX3VuaW5pdGN0eChzYyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgc2JtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmIChkZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzYm1hY19vcGVuKCkgaXJxICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJfQorCQorCS8qIAorCSAqIG1hcC9yb3V0ZSBpbnRlcnJ1cHQgKGNsZWFyIHN0YXR1cyBmaXJzdCwgaW4gY2FzZSBzb21ldGhpbmcKKwkgKiB3ZWlyZCBpcyBwZW5kaW5nOyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBtYWMgcmVnaXN0ZXJzCisJICogeWV0KQorCSAqLworCisJU0JNQUNfUkVBRENTUihzYy0+c2JtX2lzcik7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc2JtYWNfaW50ciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qCisJICogQ29uZmlndXJlIGRlZmF1bHQgc3BlZWQgCisJICovCisKKwlzYm1hY19taWlfcG9sbChzYyxub2lzeV9taWkpOworCQorCS8qCisJICogVHVybiBvbiB0aGUgY2hhbm5lbAorCSAqLworCisJc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc2Msc2JtYWNfc3RhdGVfb24pOworCQorCS8qCisJICogWFhYIFN0YXRpb24gYWRkcmVzcyBpcyBpbiBkZXYtPmRldl9hZGRyCisJICovCisJCisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSAwOyAKKwkKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXNibWFjX3NldF9yeF9tb2RlKGRldik7CisJCisJLyogU2V0IHRoZSB0aW1lciB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCWluaXRfdGltZXIoJnNjLT5zYm1fdGltZXIpOworCXNjLT5zYm1fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAyICogSFovMTAwOworCXNjLT5zYm1fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlzYy0+c2JtX3RpbWVyLmZ1bmN0aW9uID0gJnNibWFjX3RpbWVyOworCWFkZF90aW1lcigmc2MtPnNibV90aW1lcik7CisJCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHNibWFjX21paV9wb2xsKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgbm9pc3kpCit7CisgICAgaW50IGJtc3IsYm1jcixrMXN0c3IsYW5scGFyOworICAgIGludCBjaGc7CisgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICBjaGFyICpwID0gYnVmZmVyOworCisgICAgLyogUmVhZCB0aGUgbW9kZSBzdGF0dXMgYW5kIG1vZGUgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgYm1zciA9IHNibWFjX21paV9yZWFkKHMscy0+c2JtX3BoeXNbMF0sTUlJX0JNU1IpOworICAgIGJtY3IgPSBzYm1hY19taWlfcmVhZChzLHMtPnNibV9waHlzWzBdLE1JSV9CTUNSKTsKKworICAgIC8qIGdldCB0aGUgbGluayBwYXJ0bmVyIHN0YXR1cyAqLworICAgIGFubHBhciA9IHNibWFjX21paV9yZWFkKHMscy0+c2JtX3BoeXNbMF0sTUlJX0FOTFBBUik7CisKKyAgICAvKiBpZiBzdXBwb3J0ZWQsIHJlYWQgdGhlIDEwMDBiYXNlVCByZWdpc3RlciAqLworICAgIGlmIChibXNyICYgQk1TUl8xMDAwQlRfWFNSKSB7CisJazFzdHNyID0gc2JtYWNfbWlpX3JlYWQocyxzLT5zYm1fcGh5c1swXSxNSUlfSzFTVFNSKTsKKwl9CisgICAgZWxzZSB7CisJazFzdHNyID0gMDsKKwl9CisKKyAgICBjaGcgPSAwOworCisgICAgaWYgKChibXNyICYgQk1TUl9MSU5LU1RBVCkgPT0gMCkgeworCS8qCisJICogSWYgbGluayBzdGF0dXMgaXMgZG93biwgY2xlYXIgb3V0IG9sZCBpbmZvIHNvIHRoYXQgd2hlbgorCSAqIGl0IGNvbWVzIGJhY2sgdXAgaXQgd2lsbCBmb3JjZSB1cyB0byByZWNvbmZpZ3VyZSBzcGVlZAorCSAqLworCXMtPnNibV9waHlfb2xkYm1zciA9IDA7CisJcy0+c2JtX3BoeV9vbGRhbmxwYXIgPSAwOworCXMtPnNibV9waHlfb2xkazFzdHNyID0gMDsKKwlyZXR1cm4gMDsKKwl9CisKKyAgICBpZiAoKHMtPnNibV9waHlfb2xkYm1zciAhPSBibXNyKSB8fAorCShzLT5zYm1fcGh5X29sZGFubHBhciAhPSBhbmxwYXIpIHx8CisJKHMtPnNibV9waHlfb2xkazFzdHNyICE9IGsxc3RzcikpIHsKKwlpZiAoZGVidWcgPiAxKSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogYm1zcjoleC8leCBhbmxwYXI6JXgvJXggIGsxc3RzcjoleC8leFxuIiwKKwkgICAgICAgcy0+c2JtX2Rldi0+bmFtZSwKKwkgICAgICAgcy0+c2JtX3BoeV9vbGRibXNyLGJtc3IsCisJICAgICAgIHMtPnNibV9waHlfb2xkYW5scGFyLGFubHBhciwKKwkgICAgICAgcy0+c2JtX3BoeV9vbGRrMXN0c3IsazFzdHNyKTsKKwkgICAgfQorCXMtPnNibV9waHlfb2xkYm1zciA9IGJtc3I7CisJcy0+c2JtX3BoeV9vbGRhbmxwYXIgPSBhbmxwYXI7CisJcy0+c2JtX3BoeV9vbGRrMXN0c3IgPSBrMXN0c3I7CisJY2hnID0gMTsKKwl9CisKKyAgICBpZiAoY2hnID09IDApCisJICAgIHJldHVybiAwOworCisgICAgcCArPSBzcHJpbnRmKHAsIkxpbmsgc3BlZWQ6ICIpOworCisgICAgaWYgKGsxc3RzciAmIEsxU1RTUl9MUDFLRkQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDAwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfZnVsbDsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19mcmFtZTsKKwlwICs9IHNwcmludGYocCwiMTAwMEJhc2VUIEZEWCIpOworCX0KKyAgICBlbHNlIGlmIChrMXN0c3IgJiBLMVNUU1JfTFAxS0hEKSB7CisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTAwMDsKKwlzLT5zYm1fZHVwbGV4ID0gc2JtYWNfZHVwbGV4X2hhbGY7CisJcy0+c2JtX2ZjID0gc2JtYWNfZmNfZGlzYWJsZWQ7CisJcCArPSBzcHJpbnRmKHAsIjEwMDBCYXNlVCBIRFgiKTsKKwl9CisgICAgZWxzZSBpZiAoYW5scGFyICYgQU5MUEFSX1RYRkQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9mdWxsOworCXMtPnNibV9mYyA9IChhbmxwYXIgJiBBTkxQQVJfUEFVU0UpID8gc2JtYWNfZmNfZnJhbWUgOiBzYm1hY19mY19kaXNhYmxlZDsKKwlwICs9IHNwcmludGYocCwiMTAwQmFzZVQgRkRYIik7CisJfQorICAgIGVsc2UgaWYgKGFubHBhciAmIEFOTFBBUl9UWEhEKSB7CisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTAwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfaGFsZjsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19kaXNhYmxlZDsKKwlwICs9IHNwcmludGYocCwiMTAwQmFzZVQgSERYIik7CisJfQorICAgIGVsc2UgaWYgKGFubHBhciAmIEFOTFBBUl8xMEZEKSB7CisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9mdWxsOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2ZyYW1lOworCXAgKz0gc3ByaW50ZihwLCIxMEJhc2VUIEZEWCIpOworCX0KKyAgICBlbHNlIGlmIChhbmxwYXIgJiBBTkxQQVJfMTBIRCkgeworCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfaGFsZjsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19jb2xsaXNpb247CisJcCArPSBzcHJpbnRmKHAsIjEwQmFzZVQgSERYIik7CisJfQorICAgIGVsc2UgeworCXAgKz0gc3ByaW50ZihwLCJVbmtub3duIik7CisJfQorCisgICAgaWYgKG5vaXN5KSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIixzLT5zYm1fZGV2LT5uYW1lLGJ1ZmZlcik7CisJICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHNibWFjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgbmV4dF90aWNrID0gSFo7CisJaW50IG1paV9zdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwkvKiBtYWtlIElGRl9SVU5OSU5HIGZvbGxvdyB0aGUgTUlJIHN0YXR1cyBiaXQgIkxpbmsgZXN0YWJsaXNoZWQiICovCisJbWlpX3N0YXR1cyA9IHNibWFjX21paV9yZWFkKHNjLCBzYy0+c2JtX3BoeXNbMF0sIE1JSV9CTVNSKTsKKwkKKwlpZiAoIChtaWlfc3RhdHVzICYgQk1TUl9MSU5LU1RBVCkgIT0gKHNjLT5zYm1fcGh5X29sZGxpbmtzdGF0KSApIHsKKyAgICAJICAgICAgICBzYy0+c2JtX3BoeV9vbGRsaW5rc3RhdCA9IG1paV9zdGF0dXMgJiBCTVNSX0xJTktTVEFUOworCQlpZiAobWlpX3N0YXR1cyAmIEJNU1JfTElOS1NUQVQpIHsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJfQorCQllbHNlIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CQorCQl9CisJfQorCQorCS8qCisJICogUG9sbCB0aGUgUEhZIHRvIHNlZSB3aGF0IHNwZWVkIHdlIHNob3VsZCBiZSBydW5uaW5nIGF0CisJICovCisKKwlpZiAoc2JtYWNfbWlpX3BvbGwoc2Msbm9pc3lfbWlpKSkgeworCQlpZiAoc2MtPnNibV9zdGF0ZSAhPSBzYm1hY19zdGF0ZV9vZmYpIHsKKwkJCS8qCisJCQkgKiBzb21ldGhpbmcgY2hhbmdlZCwgcmVzdGFydCB0aGUgY2hhbm5lbAorCQkJICovCisJCQlpZiAoZGVidWcgPiAxKSB7CisJCQkJcHJpbnRrKCIlczogcmVzdGFydGluZyBjaGFubmVsIGJlY2F1c2Ugc3BlZWQgY2hhbmdlZFxuIiwKKwkJCQkgICAgICAgc2MtPnNibV9kZXYtPm5hbWUpOworCQkJfQorCQkJc2JtYWNfY2hhbm5lbF9zdG9wKHNjKTsKKwkJCXNibWFjX2NoYW5uZWxfc3RhcnQoc2MpOworCQl9CisJfQorCQorCXNwaW5fdW5sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisJCisJc2MtPnNibV90aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJnNjLT5zYm1fdGltZXIpOworfQorCisKK3N0YXRpYyB2b2lkIHNibWFjX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJCisJc3Bpbl9sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisJCisJCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc2MtPnNibV9zdGF0cy50eF9lcnJvcnMrKzsKKwkKKwlzcGluX3VubG9ja19pcnEgKCZzYy0+c2JtX2xvY2spOworCisJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXRcbiIsZGV2LT5uYW1lKTsKK30KKworCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYm1hY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwkKKwkvKiBYWFggdXBkYXRlIG90aGVyIHN0YXRzIGhlcmUgKi8KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gJnNjLT5zYm1fc3RhdHM7Cit9CisKKworCitzdGF0aWMgdm9pZCBzYm1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1zZ19mbGFnID0gMDsKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwlpZiAoKGRldi0+ZmxhZ3MgXiBzYy0+c2JtX2RldmZsYWdzKSAmIElGRl9QUk9NSVNDKSB7CisJCS8qCisJCSAqIFByb21pc2N1b3VzIGNoYW5nZWQuCisJCSAqLworCQkKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkKKwkJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCQltc2dfZmxhZyA9IDE7CisJCQlzYm1hY19wcm9taXNjdW91c19tb2RlKHNjLDEpOworCQl9CisJCWVsc2UgeworCQkJbXNnX2ZsYWcgPSAyOworCQkJc2JtYWNfcHJvbWlzY3VvdXNfbW9kZShzYywwKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwkKKwlpZiAobXNnX2ZsYWcpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSAlc2FibGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwobXNnX2ZsYWc9PTEpPyJlbiI6ImRpcyIpOworCX0KKwkKKwkvKgorCSAqIFByb2dyYW0gdGhlIG11bHRpY2FzdHMuICBEbyB0aGlzIGV2ZXJ5IHRpbWUuCisJICovCisJCisJc2JtYWNfc2V0bXVsdGkoc2MpOworCQorfQorCitzdGF0aWMgaW50IHNibWFjX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnNibV9sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gMDsKKwkKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DREVWUFJJVkFURToJCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgUEhZIGluIHVzZS4gKi8KKwkJZGF0YVswXSA9IHNjLT5zYm1fcGh5c1swXSAmIDB4MWY7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMToJCS8qIFJlYWQgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIuICovCisJCWRhdGFbM10gPSBzYm1hY19taWlfcmVhZChzYywgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSsyOgkJLyogV3JpdGUgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXR2YWwgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGVidWcgPiAxKSB7CisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNibWFjX21paV9pb2N0bDogd3JpdGUgJTAyWCAlMDJYICUwMlhcbiIsZGV2LT5uYW1lLAorCQkgICAgICAgZGF0YVswXSxkYXRhWzFdLGRhdGFbMl0pOworCQkgICAgfQorCQlzYm1hY19taWlfd3JpdGUoc2MsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNibWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxOworCisJc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc2Msc2JtYWNfc3RhdGVfb2ZmKTsKKworCWRlbF90aW1lcl9zeW5jKCZzYy0+c2JtX3RpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZFxuIixkZXYtPm5hbWUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCisJaXJxID0gZGV2LT5pcnE7CisJc3luY2hyb25pemVfaXJxKGlycSk7CisJZnJlZV9pcnEoaXJxLCBkZXYpOworCisJc2JkbWFfZW1wdHlyaW5nKCYoc2MtPnNibV90eGRtYSkpOworCXNiZG1hX2VtcHR5cmluZygmKHNjLT5zYm1fcnhkbWEpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKyNpZiBkZWZpbmVkKFNCTUFDX0VUSDBfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDFfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDJfSFdBRERSKQorc3RhdGljIHZvaWQKK3NibWFjX3NldHVwX2h3YWRkcihpbnQgY2hhbixjaGFyICphZGRyKQoreworCXVpbnQ4X3QgZWFkZHJbNl07CisJdWludDY0X3QgdmFsOworCXNibWFjX3BvcnRfdCBwb3J0OworCisJcG9ydCA9IEFfTUFDX0NIQU5ORUxfQkFTRShjaGFuKTsKKwlzYm1hY19wYXJzZV9od2FkZHIoYWRkcixlYWRkcik7CisJdmFsID0gc2JtYWNfYWRkcjJyZWcoZWFkZHIpOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpLHZhbCk7CisJdmFsID0gU0JNQUNfUkVBRENTUihJT0FERFIocG9ydCtSX01BQ19FVEhFUk5FVF9BRERSKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfc2JtYWNbTUFYX1VOSVRTXTsKKworc3RhdGljIGludCBfX2luaXQKK3NibWFjX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNibWFjX3BvcnRfdCBwb3J0OworCWludCBjaGlwX21heF91bml0czsKKwkKKwkvKgorCSAqIEZvciBicmluZ3VwIHdoZW4gbm90IHVzaW5nIHRoZSBmaXJtd2FyZSwgd2UgY2FuIHByZS1maWxsCisJICogdGhlIE1BQyBhZGRyZXNzZXMgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworCSAqIHNwZWNpZmllZCBpbiB0aGlzIGZpbGUgKG9yIG1heWJlIGZyb20gdGhlIGNvbmZpZyBmaWxlPykKKwkgKi8KKyNpZmRlZiBTQk1BQ19FVEgwX0hXQUREUgorCXNibWFjX3NldHVwX2h3YWRkcigwLFNCTUFDX0VUSDBfSFdBRERSKTsKKyNlbmRpZgorI2lmZGVmIFNCTUFDX0VUSDFfSFdBRERSCisJc2JtYWNfc2V0dXBfaHdhZGRyKDEsU0JNQUNfRVRIMV9IV0FERFIpOworI2VuZGlmCisjaWZkZWYgU0JNQUNfRVRIMl9IV0FERFIKKwlzYm1hY19zZXR1cF9od2FkZHIoMixTQk1BQ19FVEgyX0hXQUREUik7CisjZW5kaWYKKworCS8qCisJICogV2FsayB0aHJvdWdoIHRoZSBFdGhlcm5ldCBjb250cm9sbGVycyBhbmQgZmluZAorCSAqIHRob3NlIHdobyBoYXZlIHRoZWlyIE1BQyBhZGRyZXNzZXMgc2V0LgorCSAqLworCXN3aXRjaCAoc29jX3R5cGUpIHsKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTEyNTA6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xMjUwX0FMVDoKKwkJY2hpcF9tYXhfdW5pdHMgPSAzOworCQlicmVhazsKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTExMjA6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xMTI1OgorCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMTEyNUg6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xMjUwX0FMVDI6IC8qIEh5YnJpZCAqLworCQljaGlwX21heF91bml0cyA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNoaXBfbWF4X3VuaXRzID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChjaGlwX21heF91bml0cyA+IE1BWF9VTklUUykKKwkJY2hpcF9tYXhfdW5pdHMgPSBNQVhfVU5JVFM7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNoaXBfbWF4X3VuaXRzOyBpZHgrKykgeworCisJICAgICAgICAvKgorCSAgICAgICAgICogVGhpcyBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBNQUMuCisJCSAqLworCisJICAgICAgICBwb3J0ID0gQV9NQUNfQ0hBTk5FTF9CQVNFKGlkeCk7CisKKwkJLyoJCisJCSAqIFRoZSBSX01BQ19FVEhFUk5FVF9BRERSIHJlZ2lzdGVyIHdpbGwgYmUgc2V0IHRvIHNvbWUgbm9uemVybworCQkgKiB2YWx1ZSBmb3IgdXMgYnkgdGhlIGZpcm13YXJlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGlzIE1BQy4KKwkJICogSWYgd2UgZmluZCBhIHplcm8sIHNraXAgdGhpcyBNQUMuCisJCSAqLworCisJCXNibWFjX29yaWdfaHdhZGRyW2lkeF0gPSBTQk1BQ19SRUFEQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpKTsKKwkJaWYgKHNibWFjX29yaWdfaHdhZGRyW2lkeF0gPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNibWFjOiBub3QgY29uZmlndXJpbmcgTUFDIGF0ICIKKwkJCSAgICAgICAiJWx4XG4iLCBwb3J0KTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogT2theSwgY29vbC4gIEluaXRpYWxpemUgdGhpcyBNQUMuCisJCSAqLworCisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc2JtYWNfc29mdGMpKTsKKwkJaWYgKCFkZXYpIAorCQkJcmV0dXJuIC1FTk9NRU07CS8qIHJldHVybiBFTk9NRU0gKi8KKworCQlwcmludGsoS0VSTl9ERUJVRyAic2JtYWM6IGNvbmZpZ3VyaW5nIE1BQyBhdCAlbHhcbiIsIHBvcnQpOworCisJCWRldi0+aXJxID0gS19JTlRfTUFDXzAgKyBpZHg7CisJCWRldi0+YmFzZV9hZGRyID0gcG9ydDsKKwkJZGV2LT5tZW1fZW5kID0gMDsKKwkJaWYgKHNibWFjX2luaXQoZGV2LCBpZHgpKSB7CisJCQlwb3J0ID0gQV9NQUNfQ0hBTk5FTF9CQVNFKGlkeCk7CisJCQlTQk1BQ19XUklURUNTUihJT0FERFIocG9ydCtSX01BQ19FVEhFUk5FVF9BRERSKSwKKwkJCQkgICAgICAgc2JtYWNfb3JpZ19od2FkZHJbaWR4XSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJY29udGludWU7CisJCX0KKwkJZGV2X3NibWFjW2lkeF0gPSBkZXY7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdAorc2JtYWNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9VTklUUzsgaWR4KyspIHsKKwkJc3RydWN0IHNibWFjX3NvZnRjICpzYzsKKwkJZGV2ID0gZGV2X3NibWFjW2lkeF07CisJCWlmICghZGV2KQorCQkJY29udGludWU7CisKKwkJc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlzYm1hY191bmluaXRjdHgoc2MpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoc2JtYWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2JtYWNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkY2EzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKQEAgLTAsMCArMSw3NjkgQEAKKy8qIHNlZXE4MDA1LmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlCYXNlZCBvbiBza2VsZXRvbi5jLAorCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorCVNlZSB0aGUgc2tlbGV0b24uYyBmaWxlIGZvciBmdXJ0aGVyIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBoYW1pc2hAem90LmFwYW5hLm9yZy5hdQorCisJVGhpcyBmaWxlIGlzIGEgbmV0d29yayBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU0VFUSA4MDA1IGNoaXBzZXQgYW5kCisJdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJInNlZXE4MDA1LmM6djEuMDAgOC8wNy85NSBIYW1pc2ggQ29sZW1hbiAoaGFtaXNoQHpvdC5hcGFuYS5vcmcuYXUpXG4iOworCisvKgorICBTb3VyY2VzOgorICAJU0VFUSA4MDA1IGRhdGFib29rCisgIAkKKyAgVmVyc2lvbiBoaXN0b3J5OgorICAJMS4wMAlQdWJsaWMgcmVsZWFzZS4gY29zbWV0aWMgY2hhbmdlcyAobm8gd2FybmluZ3Mgbm93KQorICAJMC42OAlUdXJuaW5nIHBlci0gcGFja2V0LGludGVycnVwdCBkZWJ1ZyBtZXNzYWdlcyBvZmYgLSB0ZXN0aW5nIGZvciByZWxlYXNlLgorICAJMC42Nwl0aW1pbmcgcHJvYmxlbXMvYmFkIGJ1ZmZlciByZWFkcyBzZWVtIHRvIGJlIGZpeGVkIG5vdworICAJMC42MwkqIUAkIHByb3RvY29sPWV0aF90eXBlX3RyYW5zIC0tIG5vdyBwYWNrZXRzIGZsb3cKKyAgCTAuNTYJU2VuZCB3b3JraW5nCisgIAkwLjQ4CVJlY2VpdmUgd29ya2luZworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAic2VlcTgwMDUuaCIKKworLyogRmlyc3QsIGEgZmV3IGRlZmluaXRpb25zIHRoYXQgdGhlIGJyYXZlIG1pZ2h0IGNoYW5nZS4gKi8KKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNlZXE4MDA1X3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisgICB7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwfTsKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBzaG9ydCByZWNlaXZlX3B0cjsJCS8qIFdoYXQgYWRkcmVzcyBpbiBwYWNrZXQgbWVtb3J5IGRvIHdlIGV4cGVjdCBhIHJlY3ZfcGt0X2hlYWRlcj8gKi8KKwlsb25nIG9wZW5fdGltZTsJCQkJLyogVXNlbGVzcyBleGFtcGxlIGxvY2FsIGluZm8uICovCit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBJRGluZyB0aGUgYm9hcmQuICovCisjZGVmaW5lIFNBX0FERFIwIDB4MDAKKyNkZWZpbmUgU0FfQUREUjEgMHg4MAorI2RlZmluZSBTQV9BRERSMiAweDRiCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludCBzZWVxODAwNV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50IHNlZXE4MDA1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZWVxODAwNV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzZWVxODAwNV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZWVxODAwNV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBzZWVxODAwNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2VlcTgwMDVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNlZXE4MDA1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCisjZGVmaW5lIHR4X2RvbmUoZGV2KQkoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX1RYX09OKQorc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiB2b2lkIHNlZXE4MDA1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCk7CitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9mb3JfYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICAgKi8KKworc3RhdGljIGludCBpbyA9IDB4MzIwOworc3RhdGljIGludCBpcnEgPSAxMDsKKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgc2VlcTgwMDVfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfQorCisJaWYgKGlvID4gMHgxZmYpIHsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBzZWVxODAwNV9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IHNlZXE4MDA1X3BvcnRsaXN0OyAqcG9ydDsgcG9ydCsrKSB7CisJCQlpZiAoc2VlcTgwMDVfcHJvYmUxKGRldiwgKnBvcnQpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VFUTgwMDVfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gIExpbnV4IGhhcyBhIGhpc3Rvcnkgb2YgZnJpZW5kbHkgZGV2aWNlCisgICBwcm9iZXMgb24gdGhlIElTQSBidXMuICBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAgIHZlcmlmaWVzIHRoYXQgdGhlIGNvcnJlY3QgZGV2aWNlIGV4aXN0cyBhbmQgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgc2VlcTgwMDVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlpbnQgaSxqOworCXVuc2lnbmVkIGNoYXIgU0FfcHJvbVszMl07CisJaW50IG9sZF9jZmcxOworCWludCBvbGRfY2ZnMjsKKwlpbnQgb2xkX3N0YXQ7CisJaW50IG9sZF9kbWFhcjsKKwlpbnQgb2xkX3JlYXI7CisJaW50IHJldHZhbDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBTRUVRODAwNV9JT19FWFRFTlQsICJzZWVxODAwNSIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChuZXRfZGVidWc+MSkKKwkJcHJpbnRrKCJzZWVxODAwNTogcHJvYmluZyBhdCAweCV4XG4iLGlvYWRkcik7CisKKwlvbGRfc3RhdCA9IGludyhTRUVRX1NUQVRVUyk7CQkJCQkvKiByZWFkIHN0YXR1cyByZWdpc3RlciAqLworCWlmIChvbGRfc3RhdCA9PSAweGZmZmYpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CQkJCQkJLyogYXNzdW1lIHRoYXQgMHhmZmZmID09IG5vIGRldmljZSAqLworCX0KKwlpZiAoIChvbGRfc3RhdCAmIDB4MTgwMCkgIT0gMHgxODAwICkgewkJCQkvKiBhc3N1bWUgdGhhdCB1bnVzZWQgYml0cyBhcmUgMSwgYXMgbXkgbWFudWFsIHNheXMgKi8KKwkJaWYgKG5ldF9kZWJ1Zz4xKSB7CisJCQlwcmludGsoInNlZXE4MDA1OiByZXNlcnZlZCBzdGF0IGJpdHMgIT0gMHgxODAwXG4iKTsKKwkJCXByaW50aygiICAgICAgICAgID09IDB4JTA0eFxuIixvbGRfc3RhdCk7CisJCX0KKwkgCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCW9sZF9yZWFyID0gaW53KFNFRVFfUkVBKTsKKwlpZiAob2xkX3JlYXIgPT0gMHhmZmZmKSB7CisJCW91dHcoMCxTRUVRX1JFQSk7CisJCWlmIChpbncoU0VFUV9SRUEpID09IDB4ZmZmZikgewkJCQkvKiBhc3N1bWUgdGhhdCAweGZmZmYgPT0gbm8gZGV2aWNlICovCisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKChvbGRfcmVhciAmIDB4ZmYwMCkgIT0gMHhmZjAwKSB7CQkJLyogYXNzdW1lIHRoYXQgdW51c2VkIGJpdHMgYXJlIDEgKi8KKwkJaWYgKG5ldF9kZWJ1Zz4xKSB7CisJCQlwcmludGsoInNlZXE4MDA1OiB1bnVzZWQgcmVhciBiaXRzICE9IDB4ZmYwMFxuIik7CisJCQlwcmludGsoIiAgICAgICAgICA9PSAweCUwNHhcbiIsb2xkX3JlYXIpOworCQl9CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwkKKwlvbGRfY2ZnMiA9IGludyhTRUVRX0NGRzIpOwkJCQkJLyogcmVhZCBDRkcyIHJlZ2lzdGVyICovCisJb2xkX2NmZzEgPSBpbncoU0VFUV9DRkcxKTsKKwlvbGRfZG1hYXIgPSBpbncoU0VFUV9ETUFBUik7CisJCisJaWYgKG5ldF9kZWJ1Zz40KSB7CisJCXByaW50aygic2VlcTgwMDU6IHN0YXQgPSAweCUwNHhcbiIsb2xkX3N0YXQpOworCQlwcmludGsoInNlZXE4MDA1OiBjZmcxID0gMHglMDR4XG4iLG9sZF9jZmcxKTsKKwkJcHJpbnRrKCJzZWVxODAwNTogY2ZnMiA9IDB4JTA0eFxuIixvbGRfY2ZnMik7CisJCXByaW50aygic2VlcTgwMDU6IHJhZXIgPSAweCUwNHhcbiIsb2xkX3JlYXIpOworCQlwcmludGsoInNlZXE4MDA1OiBkbWFhcj0gMHglMDR4XG4iLG9sZF9kbWFhcik7CisJfQorCQorCW91dHcoIFNFRVFDTURfRklGT19XUklURSB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsJLyogc2V0dXAgZm9yIHJlYWRpbmcgUFJPTSAqLworCW91dHcoIDAsIFNFRVFfRE1BQVIpOwkJCQkJCS8qIHNldCBzdGFydGluZyBQUk9NIGFkZHJlc3MgKi8KKwlvdXR3KCBTRUVRQ0ZHMV9CVUZGRVJfUFJPTSwgU0VFUV9DRkcxKTsJCQkJLyogc2V0IGJ1ZmZlciB0byBsb29rIGF0IFBST00gKi8KKworCisJaj0wOworCWZvcihpPTA7IGkgPDMyOyBpKyspIHsKKwkJais9IFNBX3Byb21baV0gPSBpbncoU0VFUV9CVUZGRVIpICYgMHhmZjsKKwl9CisKKyNpZiAwCisJLyogdW50ZXN0ZWQgYmVjYXVzZSBJIG9ubHkgaGF2ZSB0aGUgb25lIGNhcmQgKi8KKwlpZiAoIChqJjB4ZmYpICE9IDAgKSB7CQkJCQkJLyogY2hlY2tzdW0gYXBwZWFycyB0byBiZSA4Yml0ID0gMCAqLworCQlpZiAobmV0X2RlYnVnPjEpIHsJCQkJCS8qIGNoZWNrIHRoaXMgYmVmb3JlIGRlY2lkaW5nIHRoYXQgd2UgaGF2ZSBhIGNhcmQgKi8KKwkJCXByaW50aygic2VlcTgwMDU6IHByb20gc3VtIGVycm9yXG4iKTsKKwkJfQorCQlvdXR3KCBvbGRfc3RhdCwgU0VFUV9TVEFUVVMpOworCQlvdXR3KCBvbGRfZG1hYXIsIFNFRVFfRE1BQVIpOworCQlvdXR3KCBvbGRfY2ZnMSwgU0VFUV9DRkcxKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisKKwlvdXR3KCBTRUVRQ0ZHMl9SRVNFVCwgU0VFUV9DRkcyKTsJCQkJLyogcmVzZXQgdGhlIGNhcmQgKi8KKwl1ZGVsYXkoNSk7CisJb3V0dyggU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOworCQorCWlmIChuZXRfZGVidWcpIHsKKwkJcHJpbnRrKCJzZWVxODAwNTogcHJvbSBzdW0gPSAweCUwOHhcbiIsaik7CisJCWZvcihqPTA7IGo8MzI7IGorPTE2KSB7CisJCQlwcmludGsoInNlZXE4MDA1OiBwcm9tICUwMng6ICIsaik7CisJCQlmb3IoaT0wO2k8MTY7aSsrKSB7CisJCQkJcHJpbnRrKCIlMDJ4ICIsU0FfcHJvbVtqfGldKTsKKwkJCX0KKwkJCXByaW50aygiICIpOworCQkJZm9yKGk9MDtpPDE2O2krKykgeworCQkJCWlmICgoU0FfcHJvbVtqfGldPjMxKSYmKFNBX3Byb21banxpXTwxMjcpKSB7CisJCQkJCXByaW50aygiJWMiLCBTQV9wcm9tW2p8aV0pOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygiICIpOworCQkJCX0KKwkJCX0KKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKworI2lmIDAJCisJLyogCisJICogdGVzdGluZyB0aGUgcGFja2V0IGJ1ZmZlciBtZW1vcnkgZG9lc24ndCB3b3JrIHlldAorCSAqIGJ1dCBhbGwgb3RoZXIgYnVmZmVyIGFjY2Vzc2VzIGRvIAorCSAqCQkJLSBmaXhpbmcgaXMgbm90IGEgcHJpb3JpdHkKKwkgKi8KKwlpZiAobmV0X2RlYnVnPjEpIHsJCQkJCS8qIHRlc3QgcGFja2V0IGJ1ZmZlciBtZW1vcnkgKi8KKwkJcHJpbnRrKCJzZWVxODAwNTogdGVzdGluZyBwYWNrZXQgYnVmZmVyIC4uLiAiKTsKKwkJb3V0dyggU0VFUUNGRzFfQlVGRkVSX0JVRkZFUiwgU0VFUV9DRkcxKTsKKwkJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOworCQlvdXR3KCAwICwgU0VFUV9ETUFBUik7CisJCWZvcihpPTA7aTwzMjc2ODtpKyspIHsKKwkJCW91dHcoMHg1YTVhLCBTRUVRX0JVRkZFUik7CisJCX0KKwkJaj1qaWZmaWVzK0haOworCQl3aGlsZSAoICgoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX0ZJRk9fRU1QVFkpICE9IFNFRVFTVEFUX0ZJRk9fRU1QVFkpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGopICkKKwkJCW1iKCk7CisJCW91dHcoIDAgLCBTRUVRX0RNQUFSKTsKKwkJd2hpbGUgKCAoKGludyhTRUVRX1NUQVRVUykgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSAhPSBTRUVRU1RBVF9XSU5ET1dfSU5UKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBqK0haKSkKKwkJCW1iKCk7CisJCWlmICggKGludyhTRUVRX1NUQVRVUykgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSA9PSBTRUVRU1RBVF9XSU5ET1dfSU5UKQorCQkJb3V0dyggU0VFUUNNRF9XSU5ET1dfSU5UX0FDSyB8IChpbncoU0VFUV9TVEFUVVMpJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCQlvdXR3KCBTRUVRQ01EX0ZJRk9fUkVBRCB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsKKwkJaj0wOworCQlmb3IoaT0wO2k8MzI3Njg7aSsrKSB7CisJCQlpZiAoaW53KFNFRVFfQlVGRkVSKSAhPSAweDVhNWEpCisJCQkJaisrOworCQl9CisJCWlmIChqKSB7CisJCQlwcmludGsoIiVpXG4iLGopOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJvay5cbiIpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAobmV0X2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogJXMgZm91bmQgYXQgJSMzeCwgIiwgZGV2LT5uYW1lLCAic2VlcTgwMDUiLCBpb2FkZHIpOworCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJLyogUmV0cmlldmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baSs2XSk7CisKKwlpZiAoZGV2LT5pcnEgPT0gMHhmZikKKwkJOwkJCS8qIERvIG5vdGhpbmc6IGEgdXNlci1sZXZlbCBwcm9ncmFtIHdpbGwgc2V0IGl0LiAqLworCWVsc2UgaWYgKGRldi0+aXJxIDwgMikgewkvKiAiQXV0by1JUlEiICovCisJCXVuc2lnbmVkIGxvbmcgY29va2llID0gcHJvYmVfaXJxX29uKCk7CisJCQorCQlvdXR3KCBTRUVRQ01EX1JYX0lOVF9FTiB8IFNFRVFDTURfU0VUX1JYX09OIHwgU0VFUUNNRF9TRVRfUlhfT0ZGLCBTRUVRX0NNRCApOworCisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihjb29raWUpOworCQkKKwkJaWYgKG5ldF9kZWJ1ZyA+PSAyKQorCQkJcHJpbnRrKCIgYXV0b2lycSBpcyAlZFxuIiwgZGV2LT5pcnEpOworCX0gZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikKKwkgIC8qIEZpeHVwIGZvciB1c2VycyB0aGF0IGRvbid0IGtub3cgdGhhdCBJUlEgMiBpcyByZWFsbHkgSVJRIDksCisJICAgKiBvciBkb24ndCBrbm93IHdoaWNoIG9uZSB0byBzZXQuIAorCSAgICovCisJICBkZXYtPmlycSA9IDk7CisKKyNpZiAwCisJeworCQkgaW50IGlycXZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc2VlcTgwMDVfaW50ZXJydXB0LCAwLCAic2VlcTgwMDUiLCBkZXYpOworCQkgaWYgKGlycXZhbCkgeworCQkJIHByaW50ayAoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoaXJxdmFsPSVkKS5cbiIsIGRldi0+bmFtZSwKKwkJCQkJIGRldi0+aXJxLCBpcnF2YWwpOworCQkJIHJldHZhbCA9IC1FQUdBSU47CisJCQkgZ290byBvdXQ7CisJCSB9CisJfQorI2VuZGlmCisJZGV2LT5vcGVuCQk9IHNlZXE4MDA1X29wZW47CisJZGV2LT5zdG9wCQk9IHNlZXE4MDA1X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IHNlZXE4MDA1X3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dAkJPSBzZWVxODAwNV90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWi8yMDsKKwlkZXYtPmdldF9zdGF0cwkJPSBzZWVxODAwNV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU0VFUTgwMDVfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisMCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgICAqLworc3RhdGljIGludCBzZWVxODAwNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJeworCQkgaW50IGlycXZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc2VlcTgwMDVfaW50ZXJydXB0LCAwLCAic2VlcTgwMDUiLCBkZXYpOworCQkgaWYgKGlycXZhbCkgeworCQkJIHByaW50ayAoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoaXJxdmFsPSVkKS5cbiIsIGRldi0+bmFtZSwKKwkJCQkJIGRldi0+aXJxLCBpcnF2YWwpOworCQkJIHJldHVybiAtRUFHQUlOOworCQkgfQorCX0KKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCXNlZXE4MDA1X2luaXQoZGV2LCAxKTsKKworCWxwLT5vcGVuX3RpbWUgPSBqaWZmaWVzOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VlcTgwMDVfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJICAgdHhfZG9uZShkZXYpID8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJc2VlcTgwMDVfaW5pdChkZXYsIDEpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBzZWVxODAwNV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCWJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwloYXJkd2FyZV9zZW5kX3BhY2tldChkZXYsIGJ1ZiwgbGVuZ3RoKTsgCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCS8qIFlvdSBtaWdodCBuZWVkIHRvIGNsZWFuIHVwIGFuZCByZWNvcmQgVHggc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7Cit9CisMCisvKgorICogd2FpdF9mb3JfYnVmZmVyCisgKgorICogVGhpcyByb3V0aW5lIHdhaXRzIGZvciB0aGUgU0VFUSBjaGlwIHRvIGFzc2VydCB0aGF0IHRoZSBGSUZPIGlzIHJlYWR5CisgKiBieSBjaGVja2luZyBmb3IgYSB3aW5kb3cgaW50ZXJydXB0LCBhbmQgdGhlbiBjbGVhcmluZyBpdC4gVGhpcyBoYXMgdG8KKyAqIG9jY3VyIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciEKKyAqLworaW5saW5lIHZvaWQgd2FpdF9mb3JfYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgc3RhdHVzOworCQorCXRtcCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAoICggKChzdGF0dXM9aW53KFNFRVFfU1RBVFVTKSkgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSAhPSBTRUVRU1RBVF9XSU5ET1dfSU5UKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0bXApKQorCQljcHVfcmVsYXgoKTsKKwkJCisJaWYgKCAoc3RhdHVzICYgU0VFUVNUQVRfV0lORE9XX0lOVCkgPT0gU0VFUVNUQVRfV0lORE9XX0lOVCkKKwkJb3V0dyggU0VFUUNNRF9XSU5ET1dfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworfQorDAorLyogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzZWVxODAwNV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXMsIGJvZ3VzY291bnQgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJZG8geworCQlpZiAobmV0X2RlYnVnID4yKSB7CisJCQlwcmludGsoIiVzOiBpbnQsIHN0YXR1cz0weCUwNHhcbiIsZGV2LT5uYW1lLHN0YXR1cyk7CisJCX0KKwkJCisJCWlmIChzdGF0dXMgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCW91dHcoIFNFRVFDTURfV0lORE9XX0lOVF9BQ0sgfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkJCWlmIChuZXRfZGVidWcpIHsKKwkJCQlwcmludGsoIiVzOiB3aW5kb3cgaW50IVxuIixkZXYtPm5hbWUpOworCQkJfQorCQl9CisJCWlmIChzdGF0dXMgJiBTRUVRU1RBVF9UWF9JTlQpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJb3V0dyggU0VFUUNNRF9UWF9JTlRfQUNLIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQl9CisJCWlmIChzdGF0dXMgJiBTRUVRU1RBVF9SWF9JTlQpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJLyogR290IGEgcGFja2V0KHMpLiAqLworCQkJc2VlcTgwMDVfcngoZGV2KTsKKwkJfQorCQlzdGF0dXMgPSBpbncoU0VFUV9TVEFUVVMpOworCX0gd2hpbGUgKCAoKytib2d1c2NvdW50IDwgMTApICYmIChzdGF0dXMgJiBTRUVRU1RBVF9BTllfSU5UKSkgOworCisJaWYobmV0X2RlYnVnPjIpIHsKKwkJcHJpbnRrKCIlczogZW9pXG4iLGRldi0+bmFtZSk7CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkIHNlZXE4MDA1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBib2d1c2NvdW50ID0gMTA7CisJaW50IHBrdF9oZHI7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJZG8geworCQlpbnQgbmV4dF9wYWNrZXQ7CisJCWludCBwa3RfbGVuOworCQlpbnQgaTsKKwkJaW50IHN0YXR1czsKKworCQlzdGF0dXMgPSBpbncoU0VFUV9TVEFUVVMpOworCSAgCW91dHcoIGxwLT5yZWNlaXZlX3B0ciwgU0VFUV9ETUFBUik7CisJCW91dHcoU0VFUUNNRF9GSUZPX1JFQUQgfCBTRUVRQ01EX1JYX0lOVF9BQ0sgfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkgIAl3YWl0X2Zvcl9idWZmZXIoZGV2KTsKKwkgIAluZXh0X3BhY2tldCA9IG50b2hzKGludyhTRUVRX0JVRkZFUikpOworCSAgCXBrdF9oZHIgPSBpbncoU0VFUV9CVUZGRVIpOworCSAgCQorCQlpZiAobmV0X2RlYnVnPjIpIHsKKwkJCXByaW50aygiJXM6IDB4JTA0eCByZWN2IG5leHQ9MHglMDR4LCBoZHI9MHglMDR4XG4iLGRldi0+bmFtZSxscC0+cmVjZWl2ZV9wdHIsbmV4dF9wYWNrZXQscGt0X2hkcik7CisJCX0KKwkJCQorCQlpZiAoKG5leHRfcGFja2V0ID09IDApIHx8ICgocGt0X2hkciAmIFNFRVFQS1RIX0NIQUlOKT09MCkpIHsJLyogUmVhZCBhbGwgdGhlIGZyYW1lcz8gKi8KKwkJCXJldHVybjsJCQkJCQkJLyogRG9uZSBmb3Igbm93ICovCisJCX0KKwkJCQorCQlpZiAoKHBrdF9oZHIgJiBTRUVRUEtUU19ET05FKT09MCkKKwkJCWJyZWFrOworCQkJCisJCWlmIChuZXh0X3BhY2tldCA8IGxwLT5yZWNlaXZlX3B0cikgeworCQkJcGt0X2xlbiA9IChuZXh0X3BhY2tldCArIDB4MTAwMDAgLSAoKERFRkFVTFRfVEVBKzEpPDw4KSkgLSBscC0+cmVjZWl2ZV9wdHIgLSA0OworCQl9IGVsc2UgeworCQkJcGt0X2xlbiA9IG5leHRfcGFja2V0IC0gbHAtPnJlY2VpdmVfcHRyIC0gNDsKKwkJfQorCQkKKwkJaWYgKG5leHRfcGFja2V0IDwgKChERUZBVUxUX1RFQSsxKTw8OCkpIHsJCQkvKiBpcyB0aGUgbmV4dF9wYWNrZXQgYWRkcmVzcyBzYW5lPyAqLworCQkJcHJpbnRrKCIlczogcmVjdiBwYWNrZXQgcmluZyBjb3JydXB0LCByZXNldHRpbmcgYm9hcmRcbiIsZGV2LT5uYW1lKTsKKwkJCXNlZXE4MDA1X2luaXQoZGV2LDEpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlscC0+cmVjZWl2ZV9wdHIgPSBuZXh0X3BhY2tldDsKKwkJCisJCWlmIChuZXRfZGVidWc+MikgeworCQkJcHJpbnRrKCIlczogcmVjdiBsZW49MHglMDR4XG4iLGRldi0+bmFtZSxwa3RfbGVuKTsKKwkJfQorCisJCWlmIChwa3RfaGRyICYgU0VFUVBLVFNfQU5ZX0VSUk9SKSB7CQkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChwa3RfaGRyICYgU0VFUVBLVFNfU0hPUlQpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChwa3RfaGRyICYgU0VFUVBLVFNfRFJJQikgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19PVkVSU0laRSkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocGt0X2hkciAmIFNFRVFQS1RTX0NSQ19FUlIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiBza2lwIG92ZXIgdGhpcyBwYWNrZXQgKi8KKwkJCW91dHcoIFNFRVFDTURfRklGT19XUklURSB8IFNFRVFDTURfRE1BX0lOVF9BQ0sgfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkJCW91dHcoIChscC0+cmVjZWl2ZV9wdHIgJiAweGZmMDApPj44LCBTRUVRX1JFQSk7CisJCX0gZWxzZSB7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQl1bnNpZ25lZCBjaGFyICpidWY7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBhbGlnbiBkYXRhIG9uIDE2IGJ5dGUgKi8KKwkJCWJ1ZiA9IHNrYl9wdXQoc2tiLHBrdF9sZW4pOworCQkJCisJCQlpbnN3KFNFRVFfQlVGRkVSLCBidWYsIChwa3RfbGVuICsgMSkgPj4gMSk7CisJCQkKKwkJCWlmIChuZXRfZGVidWc+MikgeworCQkJCWNoYXIgKiBwID0gYnVmOworCQkJCXByaW50aygiJXM6IHJlY3YgIixkZXYtPm5hbWUpOworCQkJCWZvcihpPTA7aTwxNDtpKyspIHsKKwkJCQkJcHJpbnRrKCIlMDJ4ICIsKihwKyspJjB4ZmYpOworCQkJCX0KKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisKKwkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCX0gd2hpbGUgKCgtLWJvZ3VzY291bnQpICYmIChwa3RfaGRyICYgU0VFUVBLVEhfQ0hBSU4pKTsKKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgbmV0aWZfcngoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4gKi8KKwlyZXR1cm47Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQgc2VlcTgwMDVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPm9wZW5fdGltZSA9IDA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4IGhlcmUuICovCisJb3V0dyggU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgaGVyZS4gKi8KKworCXJldHVybiAwOworCit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLglUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yCisgICBjbG9zZWQuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNlZXE4MDA1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKwkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvKgorICogSSBfY291bGRfIGRvIHVwIHRvIDYgYWRkcmVzc2VzIGhlcmUsIGJ1dCB3b24ndCAoeWV0PykKKyAqLworCisjaWYgMAorCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKy8qCisgKiBobW0sIG5vdCBldmVuIHN1cmUgaWYgbXkgbWF0Y2hpbmcgd29ya3MgX2FueXdheV8gLSBzZWVtIHRvIGJlIHJlY2VpdmluZworICogX2V2ZXJ5dGhpbmdfIC4gLiAuCisgKi8KKyAKKwlpZiAobnVtX2FkZHJzKSB7CQkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJb3V0dyggKGludyhTRUVRX0NGRzEpICYgflNFRVFDRkcxX01BVENIX01BU0spfCBTRUVRQ0ZHMV9NQVRDSF9BTEwsICBTRUVRX0NGRzEpOworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwl9IGVsc2UgewkJCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZSAqLworCQlvdXR3KCAoaW53KFNFRVFfQ0ZHMSkgJiB+U0VFUUNGRzFfTUFUQ0hfTUFTSyl8IFNFRVFDRkcxX01BVENIX0JST0FELCBTRUVRX0NGRzEpOworCX0KKyNlbmRpZgorfQorCit2b2lkIHNlZXE4MDA1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCQorCW91dHcoU0VFUUNGRzJfUkVTRVQsIFNFRVFfQ0ZHMik7CS8qIHJlc2V0IGRldmljZSAqLworCXVkZWxheSg1KTsKKwkKKwlvdXR3KCBTRUVRQ01EX0ZJRk9fV1JJVEUgfCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJb3V0dyggMCwgU0VFUV9ETUFBUik7CQkJLyogbG9hZCBzdGFydCBhZGRyZXNzIGludG8gYm90aCBsb3cgYW5kIGhpZ2ggYnl0ZSAqLworLyoJd2FpdF9mb3JfYnVmZmVyKGRldik7ICovCQkvKiBJIHRoaW5rIHRoYXQgeW91IG9ubHkgbmVlZCBhIHdhaXQgZm9yIG1lbW9yeSBidWZmZXIgKi8KKwlvdXR3KCBTRUVRQ0ZHMV9CVUZGRVJfTUFDMCwgU0VFUV9DRkcxKTsKKwkKKwlmb3IoaT0wO2k8NjtpKyspIHsJCQkvKiBzZXQgU3RhdGlvbiBhZGRyZXNzICovCisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgU0VFUV9CVUZGRVIpOworCQl1ZGVsYXkoMik7CisJfQorCQorCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9URUEsIFNFRVFfQ0ZHMSk7CS8qIHNldCB4bWl0IGVuZCBhcmVhIHBvaW50ZXIgdG8gMTZLICovCisJb3V0YiggREVGQVVMVF9URUEsIFNFRVFfQlVGRkVSKTsJLyogdGhpcyBnaXZlcyB1cyAxNksgb2Ygc2VuZCBidWZmZXIgYW5kIDQ4SyBvZiByZWN2IGJ1ZmZlciAqLworCQorCWxwLT5yZWNlaXZlX3B0ciA9IChERUZBVUxUX1RFQSsxKTw8ODsJLyogc28gd2UgY2FuIGZpbmQgb3VyIHBhY2tldF9oZWFkZXIgKi8KKwlvdXR3KCBscC0+cmVjZWl2ZV9wdHIsIFNFRVFfUlBSKTsJLyogUmVjZWl2ZSBQb2ludGVyIFJlZ2lzdGVyIGlzIHNldCB0byByZWN2IGJ1ZmZlciBtZW1vcnkgKi8KKwkKKwlvdXR3KCAweDAwZmYsIFNFRVFfUkVBKTsJCS8qIFJlY2VpdmUgQXJlYSBFbmQgKi8KKworCWlmIChuZXRfZGVidWc+NCkgeworCQlwcmludGsoIiVzOiBTQTAgPSAiLGRldi0+bmFtZSk7CisKKwkJb3V0dyggU0VFUUNNRF9GSUZPX1JFQUQgfCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJCW91dHcoIDAsIFNFRVFfRE1BQVIpOworCQlvdXR3KCBTRUVRQ0ZHMV9CVUZGRVJfTUFDMCwgU0VFUV9DRkcxKTsKKwkJCisJCWZvcihpPTA7aTw2O2krKykgeworCQkJcHJpbnRrKCIlMDJ4ICIsaW5iKFNFRVFfQlVGRkVSKSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKwkKKwlvdXR3KCBTRUVRQ0ZHMV9NQUMwX0VOIHwgU0VFUUNGRzFfTUFUQ0hfQlJPQUQgfCBTRUVRQ0ZHMV9CVUZGRVJfQlVGRkVSLCBTRUVRX0NGRzEpOworCW91dHcoIFNFRVFDRkcyX0FVVE9fUkVBIHwgU0VFUUNGRzJfQ1RSTE8sIFNFRVFfQ0ZHMik7CisJb3V0dyggU0VFUUNNRF9TRVRfUlhfT04gfCBTRUVRQ01EX1RYX0lOVF9FTiB8IFNFRVFDTURfUlhfSU5UX0VOLCBTRUVRX0NNRCk7CisKKwlpZiAobmV0X2RlYnVnPjQpIHsKKwkJaW50IG9sZF9jZmcxOworCQlvbGRfY2ZnMSA9IGludyhTRUVRX0NGRzEpOworCQlwcmludGsoIiVzOiBzdGF0ID0gMHglMDR4XG4iLGRldi0+bmFtZSxpbncoU0VFUV9TVEFUVVMpKTsKKwkJcHJpbnRrKCIlczogY2ZnMSA9IDB4JTA0eFxuIixkZXYtPm5hbWUsb2xkX2NmZzEpOworCQlwcmludGsoIiVzOiBjZmcyID0gMHglMDR4XG4iLGRldi0+bmFtZSxpbncoU0VFUV9DRkcyKSk7CisJCXByaW50aygiJXM6IHJhZXIgPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX1JFQSkpOworCQlwcmludGsoIiVzOiBkbWFhcj0gMHglMDR4XG4iLGRldi0+bmFtZSxpbncoU0VFUV9ETUFBUikpOworCQkKKwl9Cit9CQorCisKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBzdGF0dXMgPSBpbncoU0VFUV9TVEFUVVMpOworCWludCB0cmFuc21pdF9wdHIgPSAwOworCWludCB0bXA7CisKKwlpZiAobmV0X2RlYnVnPjQpIHsKKwkJcHJpbnRrKCIlczogc2VuZCAweCUwNHhcbiIsZGV2LT5uYW1lLGxlbmd0aCk7CisJfQorCQorCS8qIFNldCBGSUZPIHRvIHdyaXRlbW9kZSBhbmQgc2V0IHBhY2tldC1idWZmZXIgYWRkcmVzcyAqLworCW91dHcoIFNFRVFDTURfRklGT19XUklURSB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCW91dHcoIHRyYW5zbWl0X3B0ciwgU0VFUV9ETUFBUik7CisJCisJLyogb3V0cHV0IFNFRVEgUGFja2V0IGhlYWRlciBiYXJmYWdlICovCisJb3V0dyggaHRvbnMobGVuZ3RoICsgNCksIFNFRVFfQlVGRkVSKTsKKwlvdXR3KCBTRUVRUEtUSF9YTUlUIHwgU0VFUVBLVEhfREFUQV9GT0xMT1dTIHwgU0VFUVBLVEhfWE1JVF9JTlRfRU4sIFNFRVFfQlVGRkVSICk7CisJCisJLyogYmxhdCB0aGUgYnVmZmVyICovCisJb3V0c3coIFNFRVFfQlVGRkVSLCBidWYsIChsZW5ndGggKzEpID4+IDEpOworCS8qIHBhcmFub2lhICEhICovCisJb3V0dyggMCwgU0VFUV9CVUZGRVIpOworCW91dHcoIDAsIFNFRVFfQlVGRkVSKTsKKwkKKwkvKiBzZXQgYWRkcmVzcyBvZiBzdGFydCBvZiB0cmFuc21pdCBjaGFpbiAqLworCW91dHcoIHRyYW5zbWl0X3B0ciwgU0VFUV9UUFIpOworCQorCS8qIGRyYWluIEZJRk8gKi8KKwl0bXAgPSBqaWZmaWVzOworCXdoaWxlICggKCgoc3RhdHVzPWludyhTRUVRX1NUQVRVUykpICYgU0VFUVNUQVRfRklGT19FTVBUWSkgPT0gMCkgJiYgKGppZmZpZXMgLSB0bXAgPCBIWikpCisJCW1iKCk7CisJCisJLyogZG9pdCAhICovCisJb3V0dyggU0VFUUNNRF9XSU5ET1dfSU5UX0FDSyB8IFNFRVFDTURfU0VUX1RYX09OIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJCit9CisKKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9zZWVxOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJTRUVRIDgwMDUgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJTRUVRIDgwMDUgSVJRIG51bWJlciIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlkZXZfc2VlcSA9IHNlZXE4MDA1X3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9zZWVxKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X3NlZXEpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X3NlZXEpOworCXJlbGVhc2VfcmVnaW9uKGRldl9zZWVxLT5iYXNlX2FkZHIsIFNFRVE4MDA1X0lPX0VYVEVOVCk7CisJZnJlZV9uZXRkZXYoZGV2X3NlZXEpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtbTQ4NiAtYyBza2VsZXRvbi5jIgorICogIHZlcnNpb24tY29udHJvbDogdAorICogIGtlcHQtbmV3LXZlcnNpb25zOiA1CisgKiAgdGFiLXdpZHRoOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmggYi9kcml2ZXJzL25ldC9zZWVxODAwNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWJhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zZWVxODAwNS5oCkBAIC0wLDAgKzEsMTU2IEBACisvKiAKKyAqIGRlZmluZXMsIGV0YyBmb3IgdGhlIHNlZXE4MDA1CisgKi8KKyAKKy8qCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR1BMLgorICoKKyAqIFRoaXMgc3R5bGUgYW5kIGxheW91dCBvZiB0aGlzIGZpbGUgaXMgYWxzbyBjb3BpZWQKKyAqIGZyb20gbWFueSBvZiB0aGUgb3RoZXIgbGludXggbmV0d29yayBkZXZpY2UgZHJpdmVycy4KKyAqLworCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgZXRoZXJjYXJkLiAqLworI2RlZmluZSBTRUVRODAwNV9JT19FWFRFTlQJMTYKKworI2RlZmluZSBTRUVRX0IJCShpb2FkZHIpCisKKyNkZWZpbmUJU0VFUV9DTUQJKFNFRVFfQikJCS8qIFdyaXRlIG9ubHkgKi8KKyNkZWZpbmUJU0VFUV9TVEFUVVMJKFNFRVFfQikJCS8qIFJlYWQgb25seSAqLworI2RlZmluZSBTRUVRX0NGRzEJKFNFRVFfQiArIDIpCisjZGVmaW5lIFNFRVFfQ0ZHMgkoU0VFUV9CICsgNCkKKyNkZWZpbmUJU0VFUV9SRUEJKFNFRVFfQiArIDYpCQkvKiBSZWNlaXZlIEVuZCBBcmVhIFJlZ2lzdGVyICovCisjZGVmaW5lIFNFRVFfUlBSCShTRUVRX0IgKyAxMCkJCS8qIFJlY2VpdmUgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlTRUVRX1RQUgkoU0VFUV9CICsgMTIpCQkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNFRVFfRE1BQVIJKFNFRVFfQiArIDE0KQkJLyogRE1BIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9CVUZGRVIJKFNFRVFfQiArIDgpCQkvKiBCdWZmZXIgV2luZG93IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJREVGQVVMVF9URUEJKDB4M2YpCisKKyNkZWZpbmUgU0VFUUNNRF9ETUFfSU5UX0VOCSgweDAwMDEpCS8qIERNQSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNFRVFDTURfUlhfSU5UX0VOCSgweDAwMDIpCS8qIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBTRUVRQ01EX1RYX0lOVF9FTgkoMHgwMDA0KQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNFRVFDTURfV0lORE9XX0lOVF9FTgkoMHgwMDA4KQkvKiBXaGF0IHRoZSBoZWxsIGlzIHRoaXMgZm9yPz8gKi8KKyNkZWZpbmUgU0VFUUNNRF9JTlRfTUFTSwkoMHgwMDBmKQorCisjZGVmaW5lIFNFRVFDTURfRE1BX0lOVF9BQ0sJKDB4MDAxMCkJLyogRE1BIGFjayAqLworI2RlZmluZSBTRUVRQ01EX1JYX0lOVF9BQ0sJKDB4MDAyMCkKKyNkZWZpbmUgU0VFUUNNRF9UWF9JTlRfQUNLCSgweDAwNDApCisjZGVmaW5lCVNFRVFDTURfV0lORE9XX0lOVF9BQ0sJKDB4MDA4MCkKKyNkZWZpbmUgU0VFUUNNRF9BQ0tfQUxMCQkoMHgwMGYwKQorCisjZGVmaW5lIFNFRVFDTURfU0VUX0RNQV9PTgkoMHgwMTAwKQkvKiBFbmFibGVzIERNQSBSZXF1ZXN0IGxvZ2ljICovCisjZGVmaW5lIFNFRVFDTURfU0VUX1JYX09OCSgweDAyMDApCS8qIEVuYWJsZXMgUGFja2V0IFJYICovCisjZGVmaW5lIFNFRVFDTURfU0VUX1RYX09OCSgweDA0MDApCS8qIFN0YXJ0cyBUWCBydW4gKi8KKyNkZWZpbmUgU0VFUUNNRF9TRVRfRE1BX09GRgkoMHgwODAwKQorI2RlZmluZSBTRUVRQ01EX1NFVF9SWF9PRkYJKDB4MTAwMCkKKyNkZWZpbmUgU0VFUUNNRF9TRVRfVFhfT0ZGCSgweDIwMDApCisjZGVmaW5lIFNFRVFDTURfU0VUX0FMTF9PRkYJKDB4MzgwMCkJLyogc2V0IGFsbCBsb2dpYyBvZmYgKi8KKworI2RlZmluZSBTRUVRQ01EX0ZJRk9fUkVBRAkoMHg0MDAwKQkvKiBTZXQgRklGTyB0byByZWFkIG1vZGUgKHJlYWQgZnJvbSBCdWZmZXIpICovCisjZGVmaW5lIFNFRVFDTURfRklGT19XUklURQkoMHg4MDAwKQkvKiBTZXQgRklGTyB0byB3cml0ZSBtb2RlICovCisKKyNkZWZpbmUgU0VFUVNUQVRfRE1BX0lOVF9FTgkoMHgwMDAxKQkvKiBTdGF0dXMgb2YgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBTRUVRU1RBVF9SWF9JTlRfRU4JKDB4MDAwMikKKyNkZWZpbmUgU0VFUVNUQVRfVFhfSU5UX0VOCSgweDAwMDQpCisjZGVmaW5lIFNFRVFTVEFUX1dJTkRPV19JTlRfRU4JKDB4MDAwOCkKKworI2RlZmluZQlTRUVRU1RBVF9ETUFfSU5UCSgweDAwMTApCS8qIEludGVycnVwdCBmbGFnZ2VkICovCisjZGVmaW5lIFNFRVFTVEFUX1JYX0lOVAkJKDB4MDAyMCkKKyNkZWZpbmUgU0VFUVNUQVRfVFhfSU5UCQkoMHgwMDQwKQorI2RlZmluZQlTRUVRU1RBVF9XSU5ET1dfSU5UCSgweDAwODApCisjZGVmaW5lIFNFRVFTVEFUX0FOWV9JTlQJKDB4MDBmMCkKKworI2RlZmluZSBTRUVRU1RBVF9ETUFfT04JCSgweDAxMDApCS8qIERNQSBsb2dpYyBvbiAqLworI2RlZmluZSBTRUVRU1RBVF9SWF9PTgkJKDB4MDIwMCkJLyogUGFja2V0IFJYIG9uICovCisjZGVmaW5lIFNFRVFTVEFUX1RYX09OCQkoMHgwNDAwKQkvKiBUWCBydW5uaW5nICovCisKKyNkZWZpbmUgU0VFUVNUQVRfRklGT19GVUxMCSgweDIwMDApCisjZGVmaW5lIFNFRVFTVEFUX0ZJRk9fRU1QVFkJKDB4NDAwMCkKKyNkZWZpbmUgU0VFUVNUQVRfRklGT19ESVIJKDB4ODAwMCkJLyogMT1yZWFkLCAwPXdyaXRlICovCisKKyNkZWZpbmUgU0VFUUNGRzFfQlVGRkVSX01BU0sJKDB4MDAwZikJLyogZGVmaW5lIHdoYXQgbWFwcyBpbnRvIHRoZSBCVUZGRVIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUUNGRzFfQlVGRkVSX01BQzAJKDB4MDAwMCkJLyogTUFDIHN0YXRpb24gYWRkcmVzc2VzIDAtNSAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDMQkoMHgwMDAxKQorI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDMgkoMHgwMDAyKQorI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDMwkoMHgwMDAzKQorI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDNAkoMHgwMDA0KQorI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDNQkoMHgwMDA1KQorI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfUFJPTQkoMHgwMDA2KQkvKiBUaGUgQWRkcmVzcy9DRkcgUFJPTSAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfVEVBCSgweDAwMDcpCS8qIFRyYW5zbWl0IGVuZCBhcmVhICovCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9CVUZGRVIJKDB4MDAwOCkJLyogUGFja2V0IGJ1ZmZlciBtZW1vcnkgKi8KKyNkZWZpbmUgU0VFUUNGRzFfQlVGRkVSX0lOVF9WRUMJKDB4MDAwOSkJLyogSW50ZXJydXB0IFZlY3RvciAqLworCisjZGVmaW5lIFNFRVFDRkcxX0RNQV9JTlRWTF9NQVNLCSgweDAwMzApCisjZGVmaW5lIFNFRVFDRkcxX0RNQV9DT05UCSgweDAwMDApCisjZGVmaW5lIFNFRVFDRkcxX0RNQV84MDBucwkoMHgwMDEwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfMTYwMG5zCSgweDAwMjApCisjZGVmaW5lIFNFRVFDRkcxX0RNQV8zMjAwbnMJKDB4MDAzMCkKKworI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOX01BU0sJKDB4MDBjMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0xFTjEJKDB4MDAwMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0xFTjIJKDB4MDA0MCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0xFTjQJKDB4MDA4MCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0xFTjgJKDB4MDBjMCkKKworI2RlZmluZSBTRUVRQ0ZHMV9NQUNfTUFTSwkoMHgzZjAwKQkvKiBEaXMvZW5hYmxlIGJpdHMgZm9yIE1BQyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0VFUUNGRzFfTUFDMF9FTgkoMHgwMTAwKQorI2RlZmluZSBTRUVRQ0ZHMV9NQUMxX0VOCSgweDAyMDApCisjZGVmaW5lIFNFRVFDRkcxX01BQzJfRU4JKDB4MDQwMCkKKyNkZWZpbmUgU0VFUUNGRzFfTUFDM19FTgkoMHgwODAwKQorI2RlZmluZQlTRUVRQ0ZHMV9NQUM0X0VOCSgweDEwMDApCisjZGVmaW5lIFNFRVFDRkcxX01BQzVfRU4JKDB4MjAwMCkKKworI2RlZmluZQlTRUVRQ0ZHMV9NQVRDSF9NQVNLCSgweGMwMDApCS8qIFBhY2tldCBtYXRjaGluZyBsb2dpYyBjZmcgYml0cyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQVRDSF9TUEVDSUZJQwkoMHgwMDAwKQkvKiBvbmx5IG1hdGNoaW5nIE1BQyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0VFUUNGRzFfTUFUQ0hfQlJPQUQJKDB4NDAwMCkJLyogbWF0Y2hpbmcgYW5kIGJyb2FkY2FzdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0VFUUNGRzFfTUFUQ0hfTVVMVEkJKDB4ODAwMCkJLyogbWF0Y2hpbmcsIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0ICovCisjZGVmaW5lIFNFRVFDRkcxX01BVENIX0FMTAkoMHhjMDAwKQkvKiBQcm9taXNjdW91cyBtb2RlICovCisKKyNkZWZpbmUgU0VFUUNGRzFfREVGQVVMVAkoU0VFUUNGRzFfQlVGRkVSX0JVRkZFUiB8IFNFRVFDRkcxX01BQzBfRU4gfCBTRUVRQ0ZHMV9NQVRDSF9CUk9BRCkKKworI2RlZmluZSBTRUVRQ0ZHMl9CWVRFX1NXQVAJKDB4MDAwMSkJLyogMD1JbnRlbCBieXRlLW9yZGVyICovCisjZGVmaW5lIFNFRVFDRkcyX0FVVE9fUkVBCSgweDAwMDIpCS8qIGlmIHNldCwgUmVjZWl2ZSBFbmQgQXJlYSB3aWxsIGJlIHVwZGF0ZWQgd2hlbiByZWFkaW5nIGZyb20gQnVmZmVyICovCisKKyNkZWZpbmUgU0VFUUNGRzJfQ1JDX0VSUl9FTgkoMHgwMDA4KQkvKiBlbmFibGVzIHJlY2VpdmluZyBvZiBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyAqLworI2RlZmluZSBTRUVRQ0ZHMl9EUklCQkxFX0VOCSgweDAwMTApCS8qIGVuYWJsZXMgcmVjZWl2aW5nIG9mIG5vbi1hbGlnbmVkIHBhY2tldHMgKi8KKyNkZWZpbmUgU0VFUUNGRzJfU0hPUlRfRU4JKDB4MDAyMCkJLyogZW5hYmxlcyByZWNlaXZpbmcgb2Ygc2hvcnQgcGFja2V0cyAqLworCisjZGVmaW5lCVNFRVFDRkcyX1NMT1RTRUwJKDB4MDA0MCkJLyogMD0gc3RhbmRhcmQgSUVFRTgwMi4zLCAxPSBzbWFsbGVyLGZhc3Rlciwgbm9uLXN0YW5kYXJkICovCisjZGVmaW5lIFNFRVFDRkcyX05PX1BSRUFNCSgweDAwODApCS8qIDE9IHVzZXIgc3VwcGxpZXMgWG1pdCBwcmVhbWJsZSBieXRlcyAqLworI2RlZmluZSBTRUVRQ0ZHMl9BRERSX0xFTgkoMHgwMTAwKQkvKiAxPSAyYnl0ZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0VFUUNGRzJfUkVDX0NSQwkoMHgwMjAwKQkvKiAwPSByZWNlaXZlZCBwYWNrZXRzIHdpbGwgaGF2ZSBDUkMgc3RyaXBwZWQgZnJvbSB0aGVtICovCisjZGVmaW5lIFNFRVFDRkcyX1hNSVRfTk9fQ1JDCSgweDA0MDApCS8qIGRvbid0IHhtaXQgQ1JDIHdpdGggZWFjaCBwYWNrZXQgKHVzZXIgc3VwcGxpZXMgaXQpICovCisjZGVmaW5lIFNFRVFDRkcyX0xPT1BCQUNLCSgweDA4MDApCisjZGVmaW5lIFNFRVFDRkcyX0NUUkxPCQkoMHgxMDAwKQorI2RlZmluZSBTRUVRQ0ZHMl9SRVNFVAkJKDB4ODAwMCkJLyogc29mdHdhcmUgSGFyZC1yZXNldCBiaXQgKi8KKworc3RydWN0IHNlZXFfcGt0X2hkciB7CisJdW5zaWduZWQgc2hvcnQJbmV4dDsJCQkvKiBhZGRyZXNzIG9mIG5leHQgcGFja2V0IGhlYWRlciAqLworCXVuc2lnbmVkIGNoYXIJYmFiYmxlX2ludDoxLAkJLyogZW5hYmxlIGludCBvbiA+MTUxNCBieXRlIHBhY2tldCAqLworCQkJY29sbF9pbnQ6MSwJCS8qIGVuYWJsZSBpbnQgb24gY29sbGlzaW9uICovCisJCQljb2xsXzE2X2ludDoxLAkJLyogZW5hYmxlIGludCBvbiA+MTUgY29sbGlzaW9uICovCisJCQl4bWl0X2ludDoxLAkJLyogZW5hYmxlIGludCBvbiBzdWNjZXNzIChvciB4bWl0IHdpdGggPDE1IGNvbGxpc2lvbikgKi8KKwkJCXVudXNlZDoxLAorCQkJZGF0YV9mb2xsb3dzOjEsCQkvKiBpZiBub3Qgc2V0LCBwcm9jZXNzIHRoaXMgYXMgYSBoZWFkZXIgYW5kIHBvaW50ZXIgb25seSAqLworCQkJY2hhaW5fY29udDoxLAkJLyogaWYgc2V0LCBtb3JlIGhlYWRlcnMgaW4gY2hhaW4gCQlvbmx5IGNtZCBiaXQgdmFsaWQgaW4gcmVjdiBoZWFkZXIgKi8KKwkJCXhtaXRfcmVjdjoxOwkJLyogaWYgc2V0LCBhIHhtaXQgcGFja2V0LCBlbHNlIGEgcmVjZWl2ZSBwYWNrZXQuKi8KKwl1bnNpZ25lZCBjaGFyCXN0YXR1czsKK307CisKKyNkZWZpbmUgU0VFUVBLVEhfQkFCX0lOVF9FTgkoMHgwMSkJCS8qIHhtaXQgb25seSAqLworI2RlZmluZSBTRUVRUEtUSF9DT0xfSU5UX0VOCSgweDAyKQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0NPTDE2X0lOVF9FTgkoMHgwNCkJCS8qIHhtaXQgb25seSAqLworI2RlZmluZSBTRUVRUEtUSF9YTUlUX0lOVF9FTgkoMHgwOCkJCS8qIHhtaXQgb25seSAqLworI2RlZmluZSBTRUVRUEtUSF9EQVRBX0ZPTExPV1MJKDB4MjApCQkvKiBzdXBwb3NlZGx5IGluIHhtaXQgb25seSAqLworI2RlZmluZSBTRUVRUEtUSF9DSEFJTgkJKDB4NDApCQkvKiBtb3JlIGhlYWRlcnMgZm9sbG93ICovCisjZGVmaW5lIFNFRVFQS1RIX1hNSVQJCSgweDgwKQorCisjZGVmaW5lIFNFRVFQS1RTX0JBQkJMRQkJKDB4MDEwMCkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX09WRVJTSVpFCSgweDAxMDApCS8qIHJlY3Ygb25seSAqLworI2RlZmluZSBTRUVRUEtUU19DT0xMSVNJT04JKDB4MDIwMCkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0NSQ19FUlIJKDB4MDIwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0NPTEwxNgkJKDB4MDQwMCkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0RSSUIJCSgweDA0MDApCS8qIHJlY3Ygb25seSAqLworI2RlZmluZSBTRUVRUEtUU19TSE9SVAkJKDB4MDgwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0RPTkUJCSgweDgwMDApCisjZGVmaW5lIFNFRVFQS1RTX0FOWV9FUlJPUgkoMHgwZjAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2dpc2VlcS5jIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzNiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBzZ2lzZWVxLmM6IFNlZXE4MDAzIGV0aGVybmV0IGRyaXZlciBmb3IgU0dJIG1hY2hpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRtQGVuZ3Iuc2dpLmNvbSkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2lwMjIuaD4KKyNpbmNsdWRlIDxhc20vc2dpYWxpYi5oPgorCisjaW5jbHVkZSAic2dpc2VlcS5oIgorCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICJzZ2lzZWVxLmM6IERhdmlkIFMuIE1pbGxlciAoZG1AZW5nci5zZ2kuY29tKVxuIjsKKworc3RhdGljIGNoYXIgKnNnaXNlZXFzdHIgPSAiU0dJIFNlZXE4MDAzIjsKKworLyoKKyAqIElmIHlvdSB3YW50IHNwZWVkLCB5b3UgZG8gc29tZXRoaW5nIHNpbGx5LCBpdCBhbHdheXMgaGFzIHdvcmtlZCBmb3IgbWUuICBTbywKKyAqIHdpdGggdGhhdCBpbiBtaW5kLCBJJ3ZlIGRlY2lkZWQgdG8gbWFrZSB0aGlzIGRyaXZlciBsb29rIGNvbXBsZXRlbHkgbGlrZSBhCisgKiBzdHVwaWQgTGFuY2UgZnJvbSBhIGRyaXZlciBhcmNoaXRlY3R1cmUgcGVyc3BlY3RpdmUuICBPbmx5IGRpZmZlcmVuY2UgaXMgdGhhdAorICogaGVyZSBvdXIgInJpbmcgYnVmZmVyIiBsb29rcyBhbmQgYWN0cyBsaWtlIGEgcmVhbCBMYW5jZSBvbmUgZG9lcyBidXQgaXMKKyAqIGxheWVkIG91dCBsaWtlIGhvdyB0aGUgSFBDIERNQSBhbmQgdGhlIFNlZXEgd2FudCBpdCB0by4gIFlvdSdkIGJlIHN1cnByaXNlZAorICogaG93IGEgc3R1cGlkIGlkZWEgbGlrZSB0aGlzIGNhbiBwYXkgb2ZmIGluIHBlcmZvcm1hbmNlLCBub3QgdG8gbWVudGlvbgorICogbWFraW5nIHRoaXMgZHJpdmVyIDIsMDAwIHRpbWVzIGVhc2llciB0byB3cml0ZS4gOy0pCisgKi8KKworLyogVHVuZSB0aGVzZSBpZiB3ZSB0ZW5kIHRvIHJ1biBvdXQgb2Z0ZW4gZXRjLiAqLworI2RlZmluZSBTRUVRX1JYX0JVRkZFUlMgIDE2CisjZGVmaW5lIFNFRVFfVFhfQlVGRkVSUyAgMTYKKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgIDE1ODQKKworI2RlZmluZSBORVhUX1JYKGkpICAoKChpKSArIDEpICYgKFNFRVFfUlhfQlVGRkVSUyAtIDEpKQorI2RlZmluZSBORVhUX1RYKGkpICAoKChpKSArIDEpICYgKFNFRVFfVFhfQlVGRkVSUyAtIDEpKQorI2RlZmluZSBQUkVWX1JYKGkpICAoKChpKSAtIDEpICYgKFNFRVFfUlhfQlVGRkVSUyAtIDEpKQorI2RlZmluZSBQUkVWX1RYKGkpICAoKChpKSAtIDEpICYgKFNFRVFfVFhfQlVGRkVSUyAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKHNwKSAoKHNwLT50eF9vbGQgPD0gc3AtPnR4X25ldykgPyBcCisJCQkgICAgc3AtPnR4X29sZCArIChTRUVRX1RYX0JVRkZFUlMgLSAxKSAtIHNwLT50eF9uZXcgOiBcCisJCQkgICAgc3AtPnR4X29sZCAtIHNwLT50eF9uZXcgLSAxKQorCisjZGVmaW5lIERFQlVHCisKK3N0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgeworCXZvbGF0aWxlIHN0cnVjdCBocGNfZG1hX2Rlc2MgcmRtYTsKKwl2b2xhdGlsZSBzaWduZWQgaW50IGJ1Zl92YWRkcjsKK307CisKK3N0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgeworCXZvbGF0aWxlIHN0cnVjdCBocGNfZG1hX2Rlc2MgdGRtYTsKKwl2b2xhdGlsZSBzaWduZWQgaW50IGJ1Zl92YWRkcjsKK307CisKKy8qCisgKiBXYXJuaW5nOiBUaGlzIHN0cnVjdHVyZSBpcyBsYXllZCBvdXQgaW4gYSBjZXJ0YWluIHdheSBiZWNhdXNlIEhQQyBkbWEKKyAqICAgICAgICAgIGRlc2NyaXB0b3JzIG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBTbyBkb24ndCB0b3VjaCB0aGlzIHdpdGhvdXQKKyAqICAgICAgICAgIHNvbWUgY2FyZS4KKyAqLworc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayB7IC8qIE5vdGUgdGhlIG5hbWUgOy0pICovCisJc3RydWN0IHNnaXNlZXFfcnhfZGVzYyByeHZlY3RvcltTRUVRX1JYX0JVRkZFUlNdOworCXN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgdHh2ZWN0b3JbU0VFUV9UWF9CVUZGRVJTXTsKK307CisKK3N0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgeworCXN0cnVjdCBzZ2lzZWVxX2luaXRfYmxvY2sgKnNyaW5nczsKKworCS8qIFB0cnMgdG8gdGhlIGRlc2NyaXB0b3JzIGluIHVuY2FjaGVkIHNwYWNlLiAqLworCXN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKnJ4X2Rlc2M7CisJc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqdHhfZGVzYzsKKworCWNoYXIgKm5hbWU7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3M7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3M7CisKKwkvKiBSaW5nIGVudHJ5IGNvdW50ZXJzLiAqLworCXVuc2lnbmVkIGludCByeF9uZXcsIHR4X25ldzsKKwl1bnNpZ25lZCBpbnQgcnhfb2xkLCB0eF9vbGQ7CisKKwlpbnQgaXNfZWRsYzsKKwl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisJdW5zaWduZWQgY2hhciBtb2RlOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisJc3BpbmxvY2tfdCB0eF9sb2NrOworfTsKKworLyogQSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgc2VlcSBkZXZpY2VzLCBmb3IgcmVtb3ZpbmcgdGhlIGRyaXZlciBtb2R1bGUuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnJvb3Rfc2dpc2VlcV9kZXY7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBocGMzX2V0aF9yZXNldChzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncykKK3sKKwlocmVncy0+cnhfcmVzZXQgPSBIUEMzX0VSWFJTVF9DUkVTRVQgfCBIUEMzX0VSWFJTVF9DTFJJUlE7CisJdWRlbGF5KDIwKTsKKwlocmVncy0+cnhfcmVzZXQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfaHBjM19hbmRfc2VlcShzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncywKKwkJCQkgICAgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJaHJlZ3MtPnJ4X2N0cmwgPSBocmVncy0+dHhfY3RybCA9IDA7CisJaHBjM19ldGhfcmVzZXQoaHJlZ3MpOworfQorCisjZGVmaW5lIFJTVEFUX0dPX0JJVFMgKFNFRVFfUkNNRF9JR09PRCB8IFNFRVFfUkNNRF9JRU9GIHwgU0VFUV9SQ01EX0lTSE9SVCB8IFwKKwkJICAgICAgIFNFRVFfUkNNRF9JRFJJQiB8IFNFRVFfUkNNRF9JQ1JDKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VlcV9nbyhzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCSAgIHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzLAorCQkJICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJc3JlZ3MtPnJzdGF0ID0gc3AtPm1vZGUgfCBSU1RBVF9HT19CSVRTOworCWhyZWdzLT5yeF9jdHJsID0gSFBDM19FUlhDVFJMX0FDVElWRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2dpc2VlcV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisJaW50IGk7CisKKwlzcmVncy0+dHN0YXQgPSBTRUVRX1RDTURfUkIwOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXNyZWdzLT5ydy5ldGhfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07Cit9CisKK3N0YXRpYyBpbnQgc2dpc2VlcV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJc3Bpbl9sb2NrX2lycSgmc3AtPnR4X2xvY2spOworCV9fc2dpc2VlcV9zZXRfbWFjX2FkZHJlc3MoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJnNwLT50eF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFRDTlRJTkZPX0lOSVQgKEhQQ0RNQV9FT1ggfCBIUENETUFfRVRYRCkKKyNkZWZpbmUgUkNOVENGR19JTklUICAoSFBDRE1BX09XTiB8IEhQQ0RNQV9FT1JQIHwgSFBDRE1BX1hJRSkKKyNkZWZpbmUgUkNOVElORk9fSU5JVCAoUkNOVENGR19JTklUIHwgKFBLVF9CVUZfU1ogJiBIUENETUFfQkNOVCkpCisKK3N0YXRpYyBpbnQgc2VlcV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3AtPnJ4X25ldyA9IHNwLT50eF9uZXcgPSAwOworCXNwLT5yeF9vbGQgPSBzcC0+dHhfb2xkID0gMDsKKworCV9fc2dpc2VlcV9zZXRfbWFjX2FkZHJlc3MoZGV2KTsKKworCS8qIFNldHVwIHR4IHJpbmcuICovCisJZm9yKGkgPSAwOyBpIDwgU0VFUV9UWF9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKCFzcC0+dHhfZGVzY1tpXS50ZG1hLnBidWYpIHsKKwkJCXVuc2lnbmVkIGxvbmcgYnVmZmVyOworCisJCQlidWZmZXIgPSAodW5zaWduZWQgbG9uZykga21hbGxvYyhQS1RfQlVGX1NaLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghYnVmZmVyKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJc3AtPnR4X2Rlc2NbaV0uYnVmX3ZhZGRyID0gQ0tTRUcxQUREUihidWZmZXIpOworCQkJc3AtPnR4X2Rlc2NbaV0udGRtYS5wYnVmID0gQ1BIWVNBRERSKGJ1ZmZlcik7CisJCX0KKwkJc3AtPnR4X2Rlc2NbaV0udGRtYS5jbnRpbmZvID0gVENOVElORk9fSU5JVDsKKwl9CisKKwkvKiBBbmQgbm93IHRoZSByeCByaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCBTRUVRX1JYX0JVRkZFUlM7IGkrKykgeworCQlpZiAoIXNwLT5yeF9kZXNjW2ldLnJkbWEucGJ1ZikgeworCQkJdW5zaWduZWQgbG9uZyBidWZmZXI7CisKKwkJCWJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nKSBrbWFsbG9jKFBLVF9CVUZfU1osIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmZXIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzcC0+cnhfZGVzY1tpXS5idWZfdmFkZHIgPSBDS1NFRzFBRERSKGJ1ZmZlcik7CisJCQlzcC0+cnhfZGVzY1tpXS5yZG1hLnBidWYgPSBDUEhZU0FERFIoYnVmZmVyKTsKKwkJfQorCQlzcC0+cnhfZGVzY1tpXS5yZG1hLmNudGluZm8gPSBSQ05USU5GT19JTklUOworCX0KKwlzcC0+cnhfZGVzY1tpIC0gMV0ucmRtYS5jbnRpbmZvIHw9IEhQQ0RNQV9FT1I7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKmdwcml2Oworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZGV2OworCit2b2lkIHNnaXNlZXFfZHVtcF9yaW5ncyh2b2lkKQoreworCXN0YXRpYyBpbnQgb25jZTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjICpyID0gZ3ByaXYtPnJ4X2Rlc2M7CisJc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqdCA9IGdwcml2LT50eF9kZXNjOworCXN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzID0gZ3ByaXYtPmhyZWdzOworCWludCBpOworCisJaWYgKG9uY2UpCisJCXJldHVybjsKKwlvbmNlKys7CisJcHJpbnRrKCJSSU5HIERVTVA6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0VFUV9SWF9CVUZGRVJTOyBpKyspIHsKKwkJcHJpbnRrKCJSWCBbJWRdOiBAKCVwKSBbJTA4eCwlMDh4LCUwOHhdICIsCisJCSAgICAgICBpLCAoJnJbaV0pLCByW2ldLnJkbWEucGJ1ZiwgcltpXS5yZG1hLmNudGluZm8sCisJCSAgICAgICByW2ldLnJkbWEucG5leHQpOworCQlpICs9IDE7CisJCXByaW50aygiLS0gWyVkXTogQCglcCkgWyUwOHgsJTA4eCwlMDh4XVxuIiwKKwkJICAgICAgIGksICgmcltpXSksIHJbaV0ucmRtYS5wYnVmLCByW2ldLnJkbWEuY250aW5mbywKKwkJICAgICAgIHJbaV0ucmRtYS5wbmV4dCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBTRUVRX1RYX0JVRkZFUlM7IGkrKykgeworCQlwcmludGsoIlRYIFslZF06IEAoJXApIFslMDh4LCUwOHgsJTA4eF0gIiwKKwkJICAgICAgIGksICgmdFtpXSksIHRbaV0udGRtYS5wYnVmLCB0W2ldLnRkbWEuY250aW5mbywKKwkJICAgICAgIHRbaV0udGRtYS5wbmV4dCk7CisJCWkgKz0gMTsKKwkJcHJpbnRrKCItLSBbJWRdOiBAKCVwKSBbJTA4eCwlMDh4LCUwOHhdXG4iLAorCQkgICAgICAgaSwgKCZ0W2ldKSwgdFtpXS50ZG1hLnBidWYsIHRbaV0udGRtYS5jbnRpbmZvLAorCQkgICAgICAgdFtpXS50ZG1hLnBuZXh0KTsKKwl9CisJcHJpbnRrKCJJTkZPOiBbcnhfbmV3ID0gJWQgcnhfb2xkPSVkXSBbdHhfbmV3ID0gJWQgdHhfb2xkID0gJWRdXG4iLAorCSAgICAgICBncHJpdi0+cnhfbmV3LCBncHJpdi0+cnhfb2xkLCBncHJpdi0+dHhfbmV3LCBncHJpdi0+dHhfb2xkKTsKKwlwcmludGsoIlJSRUdTOiByeF9jYnB0clslMDh4XSByeF9uZHB0clslMDh4XSByeF9jdHJsWyUwOHhdXG4iLAorCSAgICAgICBocmVncy0+cnhfY2JwdHIsIGhyZWdzLT5yeF9uZHB0ciwgaHJlZ3MtPnJ4X2N0cmwpOworCXByaW50aygiVFJFR1M6IHR4X2NicHRyWyUwOHhdIHR4X25kcHRyWyUwOHhdIHR4X2N0cmxbJTA4eF1cbiIsCisJICAgICAgIGhyZWdzLT50eF9jYnB0ciwgaHJlZ3MtPnR4X25kcHRyLCBocmVncy0+dHhfY3RybCk7Cit9CisjZW5kaWYKKworI2RlZmluZSBUU1RBVF9JTklUX1NFRVEgKFNFRVFfVENNRF9JUFR8U0VFUV9UQ01EX0kxNnxTRUVRX1RDTURfSUN8U0VFUV9UQ01EX0lVRikKKyNkZWZpbmUgVFNUQVRfSU5JVF9FRExDICgoVFNUQVRfSU5JVF9TRUVRKSB8IFNFRVFfVENNRF9SQjIpCisjZGVmaW5lIFJETUFDRkdfSU5JVCAgICAoSFBDM19FUlhEQ0ZHX0ZSWERDIHwgSFBDM19FUlhEQ0ZHX0ZFT1AgfCBIUEMzX0VSWERDRkdfRklSUSkKKworc3RhdGljIGludCBpbml0X3NlZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AsCisJCSAgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBzcC0+aHJlZ3M7CisJaW50IGVycjsKKworCXJlc2V0X2hwYzNfYW5kX3NlZXEoaHJlZ3MsIHNyZWdzKTsKKwllcnIgPSBzZWVxX2luaXRfcmluZyhkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXR1cCB0byBmaWVsZCB0aGUgcHJvcGVyIGludGVycnVwdCB0eXBlcy4gKi8KKwlpZiAoc3AtPmlzX2VkbGMpIHsKKwkJc3JlZ3MtPnRzdGF0ID0gVFNUQVRfSU5JVF9FRExDOworCQlzcmVncy0+cncud3JlZ3MuY29udHJvbCA9IHNwLT5jb250cm9sOworCQlzcmVncy0+cncud3JlZ3MuZnJhbWVfZ2FwID0gMDsKKwl9IGVsc2UgeworCQlzcmVncy0+dHN0YXQgPSBUU1RBVF9JTklUX1NFRVE7CisJfQorCisJaHJlZ3MtPnJ4X2Rjb25maWcgfD0gUkRNQUNGR19JTklUOworCisJaHJlZ3MtPnJ4X25kcHRyID0gQ1BIWVNBRERSKHNwLT5yeF9kZXNjKTsKKwlocmVncy0+dHhfbmRwdHIgPSBDUEhZU0FERFIoc3AtPnR4X2Rlc2MpOworCisJc2VlcV9nbyhzcCwgaHJlZ3MsIHNyZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlY29yZF9yeF9lcnJvcnMoc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzKQoreworCWlmIChzdGF0dXMgJiBTRUVRX1JTVEFUX09WRVJGIHx8CisJICAgIHN0YXR1cyAmIFNFRVFfUlNUQVRfU0ZSQU1FKQorCQlzcC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgU0VFUV9SU1RBVF9DRVJST1IpCisJCXNwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFNFRVFfUlNUQVRfREVSUk9SKQorCQlzcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFNFRVFfUlNUQVRfUkVPRikKKwkJc3AtPnN0YXRzLnJ4X2Vycm9ycysrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhfbWF5YmVfcmVzdGFydChzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCQkgICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkJICAgIHN0cnVjdCBzZ2lzZWVxX3JlZ3MgKnNyZWdzKQoreworCWlmICghKGhyZWdzLT5yeF9jdHJsICYgSFBDM19FUlhDVFJMX0FDVElWRSkpIHsKKwkJaHJlZ3MtPnJ4X25kcHRyID0gQ1BIWVNBRERSKHNwLT5yeF9kZXNjICsgc3AtPnJ4X25ldyk7CisJCXNlZXFfZ28oc3AsIGhyZWdzLCBzcmVncyk7CisJfQorfQorCisjZGVmaW5lIGZvcl9lYWNoX3J4KHJkLCBzcCkgZm9yKChyZCkgPSAmKHNwKS0+cnhfZGVzY1soc3ApLT5yeF9uZXddOyBcCisJCQkJISgocmQpLT5yZG1hLmNudGluZm8gJiBIUENETUFfT1dOKTsgXAorCQkJCShyZCkgPSAmKHNwKS0+cnhfZGVzY1soc3ApLT5yeF9uZXddKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2dpc2VlcV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCSAgICAgIHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzLAorCQkJICAgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJc3RydWN0IHNnaXNlZXFfcnhfZGVzYyAqcmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CisJdW5zaWduZWQgY2hhciBwa3Rfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgKnBrdF9wb2ludGVyID0gMDsKKwlpbnQgbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgb3JpZ19lbmQgPSBQUkVWX1JYKHNwLT5yeF9uZXcpOworCisJLyogU2VydmljZSBldmVyeSByZWNlaXZlZCBwYWNrZXQuICovCisJZm9yX2VhY2hfcngocmQsIHNwKSB7CisJCWxlbiA9IFBLVF9CVUZfU1ogLSAocmQtPnJkbWEuY250aW5mbyAmIEhQQ0RNQV9CQ05UKSAtIDM7CisJCXBrdF9wb2ludGVyID0gKHVuc2lnbmVkIGNoYXIgKikobG9uZylyZC0+YnVmX3ZhZGRyOworCQlwa3Rfc3RhdHVzID0gcGt0X3BvaW50ZXJbbGVuICsgMl07CisKKwkJaWYgKHBrdF9zdGF0dXMgJiBTRUVRX1JTVEFUX0ZJRykgeworCQkJLyogUGFja2V0IGlzIE9LLiAqLworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKHNrYikgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJCQkvKiBDb3B5IG91dCBvZiBrc2VnMSB0byBhdm9pZCBzaWxseSBjYWNoZSBmbHVzaC4gKi8KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcGt0X3BvaW50ZXIgKyAyLCBsZW4sIDApOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJCQkvKiBXZSBkb24ndCB3YW50IHRvIHJlY2VpdmUgb3VyIG93biBwYWNrZXRzICovCisJCQkJaWYgKG1lbWNtcChldGhfaGRyKHNrYiktPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJc3AtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBTaWxlbnRseSBkcm9wIG15IG93biBwYWNrZXRzICovCisJCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcmludGsgKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZWNvcmRfcnhfZXJyb3JzKHNwLCBwa3Rfc3RhdHVzKTsKKwkJfQorCisJCS8qIFJldHVybiB0aGUgZW50cnkgdG8gdGhlIHJpbmcgcG9vbC4gKi8KKwkJcmQtPnJkbWEuY250aW5mbyA9IFJDTlRJTkZPX0lOSVQ7CisJCXNwLT5yeF9uZXcgPSBORVhUX1JYKHNwLT5yeF9uZXcpOworCX0KKwlzcC0+cnhfZGVzY1tvcmlnX2VuZF0ucmRtYS5jbnRpbmZvICY9IH4oSFBDRE1BX0VPUik7CisJc3AtPnJ4X2Rlc2NbUFJFVl9SWChzcC0+cnhfbmV3KV0ucmRtYS5jbnRpbmZvIHw9IEhQQ0RNQV9FT1I7CisJcnhfbWF5YmVfcmVzdGFydChzcCwgaHJlZ3MsIHNyZWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHR4X21heWJlX3Jlc2V0X2NvbGxpc2lvbnMoc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AsCisJCQkJCSAgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJaWYgKHNwLT5pc19lZGxjKSB7CisJCXNyZWdzLT5ydy53cmVncy5jb250cm9sID0gc3AtPmNvbnRyb2wgJiB+KFNFRVFfQ1RSTF9YQ05UKTsKKwkJc3JlZ3MtPnJ3LndyZWdzLmNvbnRyb2wgPSBzcC0+Y29udHJvbDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBraWNrX3R4KHN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKnRkLAorCQkJICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MpCit7CisJLyogSWYgdGhlIEhQQyBhaW50IGRvaW4gbm90aGluLCBhbmQgdGhlcmUgYXJlIG1vcmUgcGFja2V0cworCSAqIHdpdGggRVRYRCBjbGVhcmVkIGFuZCBYSVUgc2V0IHdlIG11c3QgbWFrZSB2ZXJ5IGNlcnRhaW4KKwkgKiB0aGF0IHdlIHJlc3RhcnQgdGhlIEhQQyBlbHNlIHdlIHJpc2sgbG9ja2luZyB1cCB0aGUKKwkgKiBhZGFwdGVyLiAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIG9ubHkgc2FmZSBpZmYgdGhlIEhQQ0RNQQorCSAqIGlzIG5vdCBhY3RpdmUhCisJICovCisJd2hpbGUgKCh0ZC0+dGRtYS5jbnRpbmZvICYgKEhQQ0RNQV9YSVUgfCBIUENETUFfRVRYRCkpID09CisJICAgICAgKEhQQ0RNQV9YSVUgfCBIUENETUFfRVRYRCkpCisJCXRkID0gKHN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKikobG9uZykgQ0tTRUcxQUREUih0ZC0+dGRtYS5wbmV4dCk7CisJaWYgKHRkLT50ZG1hLmNudGluZm8gJiBIUENETUFfWElVKSB7CisJCWhyZWdzLT50eF9uZHB0ciA9IENQSFlTQUREUih0ZCk7CisJCWhyZWdzLT50eF9jdHJsID0gSFBDM19FVFhDVFJMX0FDVElWRTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ2lzZWVxX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJICAgICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkgICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0ZDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGhyZWdzLT50eF9jdHJsOworCWludCBqOworCisJdHhfbWF5YmVfcmVzZXRfY29sbGlzaW9ucyhzcCwgc3JlZ3MpOworCisJaWYgKCEoc3RhdHVzICYgKEhQQzNfRVRYQ1RSTF9BQ1RJVkUgfCBTRUVRX1RTVEFUX1BUUkFOUykpKSB7CisJCS8qIE9vcHMsIEhQQyBkZXRlY3RlZCBzb21lIHNvcnQgb2YgZXJyb3IuICovCisJCWlmIChzdGF0dXMgJiBTRUVRX1RTVEFUX1IxNikKKwkJCXNwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgU0VFUV9UU1RBVF9VRkxPVykKKwkJCXNwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgU0VFUV9UU1RBVF9MQ0xTKQorCQkJc3AtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwl9CisKKwkvKiBBY2sgJ2VtLi4uICovCisJZm9yIChqID0gc3AtPnR4X29sZDsgaiAhPSBzcC0+dHhfbmV3OyBqID0gTkVYVF9UWChqKSkgeworCQl0ZCA9ICZzcC0+dHhfZGVzY1tqXTsKKworCQlpZiAoISh0ZC0+dGRtYS5jbnRpbmZvICYgKEhQQ0RNQV9YSVUpKSkKKwkJCWJyZWFrOworCQlpZiAoISh0ZC0+dGRtYS5jbnRpbmZvICYgKEhQQ0RNQV9FVFhEKSkpIHsKKwkJCWlmICghKHN0YXR1cyAmIEhQQzNfRVRYQ1RSTF9BQ1RJVkUpKSB7CisJCQkJaHJlZ3MtPnR4X25kcHRyID0gQ1BIWVNBRERSKHRkKTsKKwkJCQlocmVncy0+dHhfY3RybCA9IEhQQzNfRVRYQ1RSTF9BQ1RJVkU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlzcC0+c3RhdHMudHhfcGFja2V0cysrOworCQlzcC0+dHhfb2xkID0gTkVYVF9UWChzcC0+dHhfb2xkKTsKKwkJdGQtPnRkbWEuY250aW5mbyAmPSB+KEhQQ0RNQV9YSVUgfCBIUENETUFfWElFKTsKKwkJdGQtPnRkbWEuY250aW5mbyB8PSBIUENETUFfRU9YOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHNnaXNlZXFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzID0gc3AtPmhyZWdzOworCXN0cnVjdCBzZ2lzZWVxX3JlZ3MgKnNyZWdzID0gc3AtPnNyZWdzOworCisJc3Bpbl9sb2NrKCZzcC0+dHhfbG9jayk7CisKKwkvKiBBY2sgdGhlIElSUSBhbmQgc2V0IHNvZnR3YXJlIHN0YXRlLiAqLworCWhyZWdzLT5yeF9yZXNldCA9IEhQQzNfRVJYUlNUX0NMUklSUTsKKworCS8qIEFsd2F5cyBjaGVjayBmb3IgcmVjZWl2ZWQgcGFja2V0cy4gKi8KKwlzZ2lzZWVxX3J4KGRldiwgc3AsIGhyZWdzLCBzcmVncyk7CisKKwkvKiBPbmx5IGNoZWNrIGZvciB0eCBhY2tzIGlmIHdlIGhhdmUgc29tZXRoaW5nIHF1ZXVlZC4gKi8KKwlpZiAoc3AtPnR4X29sZCAhPSBzcC0+dHhfbmV3KQorCQlzZ2lzZWVxX3R4KGRldiwgc3AsIGhyZWdzLCBzcmVncyk7CisKKwlpZiAoKFRYX0JVRkZTX0FWQUlMKHNwKSA+IDApICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZzcC0+dHhfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2dpc2VlcV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzZ2lzZWVxX3JlZ3MgKnNyZWdzID0gc3AtPnNyZWdzOworCXVuc2lnbmVkIGludCBpcnEgPSBkZXYtPmlycTsKKwlpbnQgZXJyOworCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc2dpc2VlcV9pbnRlcnJ1cHQsIDAsIHNnaXNlZXFzdHIsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTZWVxODAwMzogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5pcnEpOworCQllcnIgPSAtRUFHQUlOOworCX0KKworCWVyciA9IGluaXRfc2VlcShkZXYsIHNwLCBzcmVncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9pcnE7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNnaXNlZXFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBTaHV0ZG93biB0aGUgU2VlcS4gKi8KKwlyZXNldF9ocGMzX2FuZF9zZWVxKHNwLT5ocmVncywgc3JlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNnaXNlZXFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisJaW50IGVycjsKKworCWVyciA9IGluaXRfc2VlcShkZXYsIHNwLCBzcmVncyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNnaXNlZXFfbXlfcmVzZXQodm9pZCkKK3sKKwlwcmludGsoIlJFU0VUIVxuIik7CisJc2dpc2VlcV9yZXNldChnZGV2KTsKK30KKworc3RhdGljIGludCBzZ2lzZWVxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBzcC0+aHJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0ZDsKKwlpbnQgc2tibGVuLCBsZW4sIGVudHJ5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisKKwkvKiBTZXR1cC4uLiAqLworCXNrYmxlbiA9IHNrYi0+bGVuOworCWxlbiA9IChza2JsZW4gPD0gRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2JsZW47CisJc3AtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwllbnRyeSA9IHNwLT50eF9uZXc7CisJdGQgPSAmc3AtPnR4X2Rlc2NbZW50cnldOworCisJLyogQ3JlYXRlIGVudHJ5LiAgVGhlcmUgYXJlIHNvIG1hbnkgcmFjZXMgd2l0aCBhZGRpbmcgYSBuZXcKKwkgKiBkZXNjcmlwdG9yIHRvIHRoZSBjaGFpbjoKKwkgKiAxKSBBc3N1bWUgdGhhdCB0aGUgSFBDIGlzIG9mZiBwcm9jZXNzaW5nIGEgRE1BIGNoYWluIHdoaWxlCisJICogICAgd2UgYXJlIGNoYW5naW5nIGFsbCBvZiB0aGUgZm9sbG93aW5nLgorCSAqIDIpIERvIG5vIGFsbG93IHRoZSBIUEMgdG8gbG9vayBhdCBhIG5ldyBkZXNjcmlwdG9yIHVudGlsCisJICogICAgd2UgaGF2ZSBjb21wbGV0ZWx5IHNldCB1cCBpdCdzIHN0YXRlLiAgVGhpcyBtZWFucywgZG8KKwkgKiAgICBub3QgY2xlYXIgSFBDRE1BX0VPWCBpbiB0aGUgY3VycmVudCBsYXN0IGRlc2NyaXRwdG9yCisJICogICAgdW50aWwgdGhlIG9uZSB3ZSBhcmUgYWRkaW5nIGxvb2tzIGNvbnNpc3RlbnQgYW5kIGNvdWxkCisJICogICAgYmUgcHJvY2Vzc2VzIHJpZ2h0IG5vdy4KKwkgKiAzKSBUaGUgdHggaW50ZXJydXB0IGNvZGUgbXVzdCBub3RpY2Ugd2hlbiB3ZSd2ZSBhZGRlZCBhIG5ldworCSAqICAgIGVudHJ5IGFuZCB0aGUgSFBDIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBiZWZvcmUgd2UKKwkgKiAgICBhZGRlZCB0aGlzIG5ldyBlbnRyeSBhbmQgcmVzdGFydGVkIGl0LgorCSAqLworCW1lbWNweSgoY2hhciAqKShsb25nKXRkLT5idWZfdmFkZHIsIHNrYi0+ZGF0YSwgc2tibGVuKTsKKwlpZiAobGVuICE9IHNrYmxlbikKKwkJbWVtc2V0KChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciArIHNrYi0+bGVuLCAwLCBsZW4tc2tibGVuKTsKKwl0ZC0+dGRtYS5jbnRpbmZvID0gKGxlbiAmIEhQQ0RNQV9CQ05UKSB8CisJICAgICAgICAgICAgICAgICAgIEhQQ0RNQV9YSVUgfCBIUENETUFfRU9YUCB8IEhQQ0RNQV9YSUUgfCBIUENETUFfRU9YOworCWlmIChzcC0+dHhfb2xkICE9IHNwLT50eF9uZXcpIHsKKwkJc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqYmFja2VuZDsKKworCQliYWNrZW5kID0gJnNwLT50eF9kZXNjW1BSRVZfVFgoc3AtPnR4X25ldyldOworCQliYWNrZW5kLT50ZG1hLmNudGluZm8gJj0gfkhQQ0RNQV9FT1g7CisJfQorCXNwLT50eF9uZXcgPSBORVhUX1RYKHNwLT50eF9uZXcpOyAvKiBBZHZhbmNlLiAqLworCisJLyogTWF5YmUga2ljayB0aGUgSFBDIGJhY2sgaW50byBtb3Rpb24uICovCisJaWYgKCEoaHJlZ3MtPnR4X2N0cmwgJiBIUEMzX0VUWENUUkxfQUNUSVZFKSkKKwkJa2lja190eCgmc3AtPnR4X2Rlc2Nbc3AtPnR4X29sZF0sIGhyZWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWlmICghVFhfQlVGRlNfQVZBSUwoc3ApKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisJc2dpc2VlcV9yZXNldChkZXYpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNnaXNlZXFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZzcC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNnaXNlZXFfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgb2xkbW9kZSA9IHNwLT5tb2RlOworCisJaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlzcC0+bW9kZSA9IFNFRVFfUkNNRF9SQU5ZOworCWVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50KQorCQlzcC0+bW9kZSA9IFNFRVFfUkNNRF9SQk1DQVNUOworCWVsc2UKKwkJc3AtPm1vZGUgPSBTRUVRX1JDTURfUkJDQVNUOworCisJLyogWFhYIEkga25vdyB0aGlzIHN1Y2tzLCBidXQgaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIHJlcHJvZ3JhbQorCSAqIFhYWCB0aGUgcmVjZWl2ZXI/IEF0IGxlYXN0LCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gdG9vIG9mdGVuLgorCSAqLworCisJaWYgKG9sZG1vZGUgIT0gc3AtPm1vZGUpCisJCXNnaXNlZXFfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3R4X3Jpbmcoc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqYnVmLCBpbnQgbmJ1ZnMpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCAobmJ1ZnMgLSAxKSkgeworCQlidWZbaV0udGRtYS5wbmV4dCA9IENQSFlTQUREUihidWYgKyBpICsgMSk7CisJCWJ1ZltpXS50ZG1hLnBidWYgPSAwOworCQlpKys7CisJfQorCWJ1ZltpXS50ZG1hLnBuZXh0ID0gQ1BIWVNBRERSKGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9yeF9yaW5nKHN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKmJ1ZiwgaW50IG5idWZzKQoreworCWludCBpID0gMDsKKworCXdoaWxlIChpIDwgKG5idWZzIC0gMSkpIHsKKwkJYnVmW2ldLnJkbWEucG5leHQgPSBDUEhZU0FERFIoYnVmICsgaSArIDEpOworCQlidWZbaV0ucmRtYS5wYnVmID0gMDsKKwkJaSsrOworCX0KKwlidWZbaV0ucmRtYS5wYnVmID0gMDsKKwlidWZbaV0ucmRtYS5wbmV4dCA9IENQSFlTQUREUihidWYpOworfQorCisjZGVmaW5lIEFMSUdORUQoeCkgICgoKCh1bnNpZ25lZCBsb25nKSh4KSkgKyAweGYpICYgfigweGYpKQorCitzdGF0aWMgaW50IHNnaXNlZXFfaW5pdChzdHJ1Y3QgaHBjM19yZWdzKiByZWdzLCBpbnQgaXJxKQoreworCXN0cnVjdCBzZ2lzZWVxX2luaXRfYmxvY2sgKnNyOworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVyciwgaTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU2dpc2VlcTogRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIE1ha2UgcHJpdmF0ZSBkYXRhIHBhZ2UgYWxpZ25lZCAqLworCXNyID0gKHN0cnVjdCBzZ2lzZWVxX2luaXRfYmxvY2sgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghc3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTZ2lzZWVxOiBQYWdlIGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKwlzcC0+c3JpbmdzID0gc3I7CisKKyNkZWZpbmUgRUFERFJfTlZPRlMgICAgIDI1MAorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgdG1wID0gaXAyMl9udnJhbV9yZWFkKEVBRERSX05WT0ZTIC8gMiArIGkpOworCisJCWRldi0+ZGV2X2FkZHJbMiAqIGldICAgICA9IHRtcCA+PiA4OworCQlkZXYtPmRldl9hZGRyWzIgKiBpICsgMV0gPSB0bXAgJiAweGZmOworCX0KKworI2lmZGVmIERFQlVHCisJZ3ByaXYgPSBzcDsKKwlnZGV2ID0gZGV2OworI2VuZGlmCisJc3AtPnNyZWdzID0gKHN0cnVjdCBzZ2lzZWVxX3JlZ3MgKikgJmhwYzNjMC0+ZXRoX2V4dFswXTsKKwlzcC0+aHJlZ3MgPSAmaHBjM2MwLT5ldGhyZWdzOworCXNwLT5uYW1lID0gc2dpc2VlcXN0cjsKKwlzcC0+bW9kZSA9IFNFRVFfUkNNRF9SQkNBU1Q7CisKKwlzcC0+cnhfZGVzYyA9IChzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjICopCisJICAgICAgICAgICAgICBDS1NFRzFBRERSKEFMSUdORUQoJnNwLT5zcmluZ3MtPnJ4dmVjdG9yWzBdKSk7CisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykmc3AtPnNyaW5ncy0+cnh2ZWN0b3IsCisJICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3AtPnNyaW5ncy0+cnh2ZWN0b3IpKTsKKwlzcC0+dHhfZGVzYyA9IChzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICopCisJICAgICAgICAgICAgICBDS1NFRzFBRERSKEFMSUdORUQoJnNwLT5zcmluZ3MtPnR4dmVjdG9yWzBdKSk7CisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykmc3AtPnNyaW5ncy0+dHh2ZWN0b3IsCisJICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3AtPnNyaW5ncy0+dHh2ZWN0b3IpKTsKKworCS8qIEEgY291cGxlIGNhbGN1bGF0aW9ucyBub3csIHNhdmVzIG1hbnkgY3ljbGVzIGxhdGVyLiAqLworCXNldHVwX3J4X3Jpbmcoc3AtPnJ4X2Rlc2MsIFNFRVFfUlhfQlVGRkVSUyk7CisJc2V0dXBfdHhfcmluZyhzcC0+dHhfZGVzYywgU0VFUV9UWF9CVUZGRVJTKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwLiAqLworCWhwYzNfZXRoX3Jlc2V0KHNwLT5ocmVncyk7CisKKwlzcC0+aXNfZWRsYyA9ICEoc3AtPnNyZWdzLT5ydy5ycmVncy5jb2xsaXNpb25fdHhbMF0gJiAweGZmKTsKKwlpZiAoc3AtPmlzX2VkbGMpCisJCXNwLT5jb250cm9sID0gU0VFUV9DVFJMX1hDTlQgfCBTRUVRX0NUUkxfQUNDTlQgfAorCQkJICAgICAgU0VFUV9DVFJMX1NGTEFHIHwgU0VFUV9DVFJMX0VTSE9SVCB8CisJCQkgICAgICBTRUVRX0NUUkxfRU5DQVJSOworCisJZGV2LT5vcGVuCQk9IHNnaXNlZXFfb3BlbjsKKwlkZXYtPnN0b3AJCT0gc2dpc2VlcV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNnaXNlZXFfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gKDIwMCAqIEhaKSAvIDEwMDA7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2dpc2VlcV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSBzZ2lzZWVxX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MJPSBzZ2lzZWVxX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmlycQkJPSBpcnE7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTZ2lzZWVxOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX3BhZ2U7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNHSSBTZWVxODAwMyAiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJc3AtPm5leHRfbW9kdWxlID0gcm9vdF9zZ2lzZWVxX2RldjsKKwlyb290X3NnaXNlZXFfZGV2ID0gZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9wYWdlOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc3ApOworZXJyX291dF9mcmVlX2RldjoKKwlrZnJlZShkZXYpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNnaXNlZXFfcHJvYmUodm9pZCkKK3sKKwlwcmludGsodmVyc2lvbik7CisKKwkvKiBPbiBib2FyZCBhZGFwdGVyIG9uIDFzdCBIUEMgaXMgYWx3YXlzIHByZXNlbnQgKi8KKwlyZXR1cm4gc2dpc2VlcV9pbml0KGhwYzNjMCwgU0dJX0VORVRfSVJRKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNnaXNlZXFfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0LCAqZGV2OworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwOworCWludCBpcnE7CisKKwlmb3IgKGRldiA9IHJvb3Rfc2dpc2VlcV9kZXY7IGRldjsgZGV2ID0gbmV4dCkgeworCQlzcCA9IChzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICopIG5ldGRldl9wcml2KGRldik7CisJCW5leHQgPSBzcC0+bmV4dF9tb2R1bGU7CisJCWlycSA9IGRldi0+aXJxOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlmcmVlX2lycShpcnEsIGRldik7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc3ApOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoc2dpc2VlcV9wcm9iZSk7Cittb2R1bGVfZXhpdChzZ2lzZWVxX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmggYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjY2E2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIHNnaXNlZXEuaDogRGVmaW5lcyBmb3IgdGhlIFNlZXE4MDAzIGV0aGVybmV0IGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZG1AZW5nci5zZ2kuY29tKQorICovCisjaWZuZGVmIF9TR0lTRUVRX0gKKyNkZWZpbmUgX1NHSVNFRVFfSAorCitzdHJ1Y3Qgc2dpc2VlcV93cmVncyB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG11bHRpY2FzZV9oaWdoWzJdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBmcmFtZV9nYXA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2dpc2VlcV9ycmVncyB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNvbGxpc2lvbl90eFsyXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29sbGlzaW9uX2FsbFsyXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX3VudXNlZDA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJmbGFnczsgCit9OworCitzdHJ1Y3Qgc2dpc2VlcV9yZWdzIHsKKwl1bmlvbiB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGludCBldGhfYWRkcls2XTsKKwkJdm9sYXRpbGUgdW5zaWduZWQgaW50IG11bHRpY2FzdF9sb3dbNl07CisJCXN0cnVjdCBzZ2lzZWVxX3dyZWdzIHdyZWdzOworCQlzdHJ1Y3Qgc2dpc2VlcV9ycmVncyBycmVnczsKKwl9IHJ3OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByc3RhdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdHN0YXQ7Cit9OworCisvKiBTZWVxODAwMyByZWNlaXZlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1JTVEFUX09WRVJGICAgMHgwMDEgLyogT3ZlcmZsb3cgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9DRVJST1IgIDB4MDAyIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBTRUVRX1JTVEFUX0RFUlJPUiAgMHgwMDQgLyogRHJpYmJsZSBlcnJvciAqLworI2RlZmluZSBTRUVRX1JTVEFUX1NGUkFNRSAgMHgwMDggLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9SRU9GICAgIDB4MDEwIC8qIFJlY2VpdmVkIGVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTRUVRX1JTVEFUX0ZJRyAgICAgMHgwMjAgLyogRnJhbWUgaXMgZ29vZCAqLworI2RlZmluZSBTRUVRX1JTVEFUX1RJTUVPICAgMHgwNDAgLyogVGltZW91dCwgb3IgbGF0ZSByZWNlaXZlICovCisjZGVmaW5lIFNFRVFfUlNUQVRfV0hJQ0ggICAweDA4MCAvKiBXaGljaCBzdGF0dXMsIDE9b2xkIDA9bmV3ICovCisjZGVmaW5lIFNFRVFfUlNUQVRfTElUVExFICAweDEwMCAvKiBETUEgaXMgZG9uZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAqLworI2RlZmluZSBTRUVRX1JTVEFUX1NETUEgICAgMHgyMDAgLyogRE1BIGhhcyBzdGFydGVkICovCisjZGVmaW5lIFNFRVFfUlNUQVRfQURNQSAgICAweDQwMCAvKiBETUEgaXMgYWN0aXZlICovCisjZGVmaW5lIFNFRVFfUlNUQVRfUk9WRVJGICAweDgwMCAvKiBSZWNlaXZlIGJ1ZmZlciBvdmVyZmxvdyAqLworCisvKiBTZWVxODAwMyByZWNlaXZlIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX1JESVNBQiAgIDB4MDAwIC8qIERpc2FibGUgcmVjZWl2ZXIgb24gdGhlIFNlZXE4MDAzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JT1ZFUkYgICAweDAwMSAvKiBJUlEgb24gYnVmZmVyIG92ZXJmbG93cyAqLworI2RlZmluZSBTRUVRX1JDTURfSUNSQyAgICAgMHgwMDIgLyogSVJRIG9uIENSQyBlcnJvcnMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX0lEUklCICAgIDB4MDA0IC8qIElSUSBvbiBkcmliYmxlIGVycm9ycyAqLworI2RlZmluZSBTRUVRX1JDTURfSVNIT1JUICAgMHgwMDggLyogSVJRIG9uIHNob3J0IGZyYW1lcyAqLworI2RlZmluZSBTRUVRX1JDTURfSUVPRiAgICAgMHgwMTAgLyogSVJRIG9uIGVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTRUVRX1JDTURfSUdPT0QgICAgMHgwMjAgLyogSVJRIG9uIGdvb2QgZnJhbWVzICovCisjZGVmaW5lIFNFRVFfUkNNRF9SQU5ZICAgICAweDA0MCAvKiBSZWNlaXZlIGFueSBmcmFtZSAqLworI2RlZmluZSBTRUVRX1JDTURfUkJDQVNUICAgMHgwODAgLyogUmVjZWl2ZSBicm9hZGNhc3RzICovCisjZGVmaW5lIFNFRVFfUkNNRF9SQk1DQVNUICAweDBjMCAvKiBSZWNlaXZlIGJyb2FkY2FzdHMvbXVsdGljYXN0cyAqLworCisvKiBTZWVxODAwMyB0cmFuc21pdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9VRkxPVyAgIDB4MDAxIC8qIFRyYW5zbWl0IGJ1ZmZlciB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9DTFMgICAgIDB4MDAyIC8qIENvbGxpc2lvbiBkZXRlY3RlZCAqLworI2RlZmluZSBTRUVRX1RTVEFUX1IxNiAgICAgMHgwMDQgLyogRGlkIDE2IHJldHJpZXMgdG8gdHggYSBmcmFtZSAqLworI2RlZmluZSBTRUVRX1RTVEFUX1BUUkFOUyAgMHgwMDggLyogUGFja2V0IHdhcyB0cmFuc21pdHRlZCBvayAqLworI2RlZmluZSBTRUVRX1RTVEFUX0xDTFMgICAgMHgwMTAgLyogTGF0ZSBjb2xsaXNpb24gb2NjdXJyZWQgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9XSElDSCAgIDB4MDgwIC8qIFdoaWNoIHN0YXR1cywgMT1vbGQgMD1uZXcgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9UTEUgICAgIDB4MTAwIC8qIERNQSBpcyBkb25lIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisjZGVmaW5lIFNFRVFfVFNUQVRfU0RNQSAgICAweDIwMCAvKiBETUEgaGFzIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9BRE1BICAgIDB4NDAwIC8qIERNQSBpcyBhY3RpdmUgKi8KKworLyogU2VlcTgwMDMgdHJhbnNtaXQgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1RDTURfUkIwICAgICAgMHgwMCAvKiBSZWdpc3RlciBiYW5rIHplcm8gdy9zdGF0aW9uIGFkZHIgKi8KKyNkZWZpbmUgU0VFUV9UQ01EX0lVRiAgICAgIDB4MDEgLyogSVJRIG9uIHR4IHVuZGVyZmxvdyAqLworI2RlZmluZSBTRUVRX1RDTURfSUMgICAgICAgMHgwMiAvKiBJUlEgb24gY29sbGlzaW9ucyAqLworI2RlZmluZSBTRUVRX1RDTURfSTE2ICAgICAgMHgwNCAvKiBJUlEgYWZ0ZXIgMTYgZmFpbGVkIGF0dGVtcHRzIHRvIHR4IGZyYW1lICovCisjZGVmaW5lIFNFRVFfVENNRF9JUFQgICAgICAweDA4IC8qIElSUSB3aGVuIHBhY2tldCBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKyNkZWZpbmUgU0VFUV9UQ01EX1JCMSAgICAgIDB4MjAgLyogUmVnaXN0ZXIgYmFuayBvbmUgdy9tdWx0aS1jYXN0IGxvdyBieXRlICovIAorI2RlZmluZSBTRUVRX1RDTURfUkIyICAgICAgMHg0MCAvKiBSZWdpc3RlciBiYW5rIHR3byB3L211bHRpLWNhc3QgaGlnaCBieXRlICovCisKKy8qIFNlZXE4MDAzIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9DVFJMX1hDTlQgICAgIDB4MDEKKyNkZWZpbmUgU0VFUV9DVFJMX0FDQ05UICAgIDB4MDIKKyNkZWZpbmUgU0VFUV9DVFJMX1NGTEFHICAgIDB4MDQKKyNkZWZpbmUgU0VFUV9DVFJMX0VNVUxUSSAgIDB4MDgKKyNkZWZpbmUgU0VFUV9DVFJMX0VTSE9SVCAgIDB4MTAKKyNkZWZpbmUgU0VFUV9DVFJMX0VOQ0FSUiAgIDB4MjAKKworLyogU2VlcTgwMDMgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIFNHSSBIb2xseXdvb2QgSFBDLiAqLworI2RlZmluZSBTRUVRX0hQSU9fUDFCSVRTICAweDAwMDAwMDAxIC8qIGN5Y2xlcyB0byBzdGF5IGluIFAxIHBoYXNlIGZvciBQSU8gKi8KKyNkZWZpbmUgU0VFUV9IUElPX1AyQklUUyAgMHgwMDAwMDA2MCAvKiBjeWNsZXMgdG8gc3RheSBpbiBQMiBwaGFzZSBmb3IgUElPICovCisjZGVmaW5lIFNFRVFfSFBJT19QM0JJVFMgIDB4MDAwMDAxMDAgLyogY3ljbGVzIHRvIHN0YXkgaW4gUDMgcGhhc2UgZm9yIFBJTyAqLworI2RlZmluZSBTRUVRX0hETUFfRDFCSVRTICAweDAwMDAwMDA2IC8qIGN5Y2xlcyB0byBzdGF5IGluIEQxIHBoYXNlIGZvciBETUEgKi8KKyNkZWZpbmUgU0VFUV9IRE1BX0QyQklUUyAgMHgwMDAwMDAyMCAvKiBjeWNsZXMgdG8gc3RheSBpbiBEMiBwaGFzZSBmb3IgRE1BICovCisjZGVmaW5lIFNFRVFfSERNQV9EM0JJVFMgIDB4MDAwMDAwMDAgLyogY3ljbGVzIHRvIHN0YXkgaW4gRDMgcGhhc2UgZm9yIERNQSAqLworI2RlZmluZSBTRUVRX0hETUFfVElNRU8gICAweDAwMDMwMDAwIC8qIGN5Y2xlcyBmb3IgRE1BIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX05PUk0gICAgMHgwMDAwMDAwMCAvKiBOb3JtYWwgb3BlcmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX1JFU0VUICAgMHgwMDAwMDAwMSAvKiBSZXNldCBTZWVxODAwMyBhbmQgSFBDIGludGVyZmFjZSAqLworI2RlZmluZSBTRUVRX0hDVExfSVBFTkQgICAweDAwMDAwMDAyIC8qIElSUSBpcyBwZW5kaW5nIGZvciB0aGUgY2hpcCAqLworI2RlZmluZSBTRUVRX0hDVExfSVBHICAgICAweDAwMDAxMDAwIC8qIEludGVyLXBhY2tldCBnYXAgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX1JGSVggICAgMHgwMDAwMjAwMCAvKiBBdCByeGRjLCBjbGVhciBlbmQtb2YtcGFja2V0ICovCisjZGVmaW5lIFNFRVFfSENUTF9FRklYICAgIDB4MDAwMDQwMDAgLyogZml4ZXMgaW50ciBzdGF0dXMgYml0IHNldHRpbmdzICovCisjZGVmaW5lIFNFRVFfSENUTF9JRklYICAgIDB4MDAwMDgwMDAgLyogZW5hYmxlIHN0YXJ0dXAgdGltZW91dHMgKi8KKworI2VuZGlmIC8qICEoX1NHSVNFRVFfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoYXBlci5jIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4Y2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NoYXBlci5jCkBAIC0wLDAgKzEsNzU1IEBACisvKgorICoJCQlTaW1wbGUgdHJhZmZpYyBzaGFwZXIgZm9yIExpbnV4IE5FVDMuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCQorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCQorICoKKyAqCQorICoJQWxnb3JpdGhtOgorICoKKyAqCVF1ZXVlIEZyYW1lOgorICoJCUNvbXB1dGUgdGltZSBsZW5ndGggb2YgZnJhbWUgYXQgcmVndWxhdGVkIHNwZWVkCisgKgkJQWRkIGZyYW1lIHRvIHF1ZXVlIGF0IGFwcHJvcHJpYXRlIHBvaW50CisgKgkJQWRqdXN0IHRpbWUgbGVuZ3RoIGNvbXB1dGF0aW9uIGZvciBmb2xsb3d1cCBmcmFtZXMKKyAqCQlBbnkgZnJhbWUgdGhhdCBmYWxscyBvdXRzaWRlIG9mIGl0cyBib3VuZGFyaWVzIGlzIGZyZWVkCisgKgorICoJV2Ugd29yayB0byB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworICoKKyAqCQlTSEFQRVJfUUxFTglNYXhpbXVtIHF1ZXVlZCBmcmFtZXMKKyAqCQlTSEFQRVJfTEFURU5DWQlCb3VuZGluZyBsYXRlbmN5IG9uIGEgZnJhbWUuIExlYXZpbmcgdGhpcyBsYXRlbmN5CisgKgkJCQl3aW5kb3cgZHJvcHMgdGhlIGZyYW1lLiBUaGlzIHN0b3BzIHVzIHF1ZXVlaW5nIAorICoJCQkJZnJhbWVzIGZvciBhIGxvbmcgdGltZSBhbmQgY29uZnVzaW5nIGEgcmVtb3RlCisgKgkJCQlob3N0LgorICoJCVNIQVBFUl9NQVhTTElQCU1heGltdW0gdGltZSBhIHByaW9yaXR5IGZyYW1lIG1heSBqdW1wIGZvcndhcmQuCisgKgkJCQlUaGF0IGJvdW5kcyB0aGUgcGVuYWx0eSB3ZSB3aWxsIGluZmxpY3Qgb24gbG93CisgKgkJCQlwcmlvcml0eSB0cmFmZmljLgorICoJCVNIQVBFUl9CVVJTVAlUaW1lIHJhbmdlIHdlIGNhbGwgIm5vdyIgaW4gb3JkZXIgdG8gcmVkdWNlCisgKgkJCQlzeXN0ZW0gbG9hZC4gVGhlIG1vcmUgd2UgbWFrZSB0aGlzIHRoZSBidXJzdGllcgorICoJCQkJdGhlIGJlaGF2aW91ciwgdGhlIGJldHRlciBsb2NhbCBwZXJmb3JtYW5jZSB5b3UKKyAqCQkJCWdldCB0aHJvdWdoIHBhY2tldCBjbHVzdGVyaW5nIG9uIHJvdXRlcnMgYW5kIHRoZQorICoJCQkJd29yc2UgdGhlIHJlbW90ZSBlbmQgZ2V0cyB0byBqdWRnZSBydHRzLgorICoKKyAqCVRoaXMgaXMgZGVzaWduZWQgdG8gaGFuZGxlIGxvd2VyIHNwZWVkIGxpbmtzICggPCAyMDBLL3NlY29uZCBvciBzbykuIFdlCisgKglydW4gb2ZmIGEgMTAwLTE1MEh6IGJhc2UgY2xvY2sgdHlwaWNhbGx5LiBUaGlzIGdpdmVzIHVzIGEgcmVzb2x1dGlvbiBhdAorICoJMjAwS2JpdC9zZWNvbmQgb2YgYWJvdXQgMktiaXQgb3IgMjU2IGJ5dGVzLiBBYm92ZSB0aGF0IG91ciB0aW1lcgorICoJcmVzb2x1dGlvbiBtYXkgc3RhcnQgdG8gY2F1c2UgbXVjaCBtb3JlIGJ1cnN0aW5lc3MgaW4gdGhlIHRyYWZmaWMuIFdlCisgKgljb3VsZCBhdm9pZCBhIGxvdCBvZiB0aGF0IGJ5IGNhbGxpbmcga2lja19zaGFwZXIoKSBhdCB0aGUgZW5kIG9mIHRoZSAKKyAqCXRpZWQgZGV2aWNlIHRyYW5zbWlzc2lvbnMuIElmIHlvdSBydW4gYWJvdmUgYWJvdXQgMTAwSyBzZWNvbmQgeW91IAorICoJbWF5IG5lZWQgdG8gdHVuZSB0aGUgc3VwcG9zZWQgc3BlZWQgcmF0ZSBmb3IgdGhlIHJpZ2h0IHZhbHVlcy4KKyAqCisgKglCVUdTOgorICoJCURvd25pbmcgdGhlIGludGVyZmFjZSB1bmRlciB0aGUgc2hhcGVyIGJlZm9yZSB0aGUgc2hhcGVyCisgKgkJd2lsbCByZW5kZXIgeW91ciBtYWNoaW5lIGRlZnVuY3QuIERvbid0IGZvciBub3cgc2hhcGUgb3ZlcgorICoJCVBQUCBvciBTTElQIHRoZXJlZm9yZSEKKyAqCQlUaGlzIHdpbGwgYmUgZml4ZWQgaW4gQkVUQTQKKyAqCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKgorICogICAgICAgICAgICAgIGJoX2F0b21pYygpIFNNUCByYWNlcyBmaXhlcyBhbmQgcmV3cml0dGVuIHRoZSBsb2NraW5nIGNvZGUgdG8KKyAqICAgICAgICAgICAgICBiZSBTTVAgc2FmZSBhbmQgaXJxLW1hc2sgZnJpZW5kbHkuCisgKiAgICAgICAgICAgICAgTk9URTogd2UgY2FuJ3QgdXNlIHN0YXJ0X2JoX2F0b21pYygpIGluIGtpY2tfc2hhcGVyKCkKKyAqICAgICAgICAgICAgICBiZWNhdXNlIGl0J3MgZ29pbmcgdG8gYmUgcmVjYWxsZWQgZnJvbSBhbiBpcnEgaGFuZGxlciwKKyAqICAgICAgICAgICAgICBhbmQgc3luY2hyb25pemVfYmgoKSBpcyBhIG5vbm8gaWYgY2FsbGVkIGZyb20gaXJxIGNvbnRleHQuCisgKgkJCQkJCTE5OTkgIEFuZHJlYSBBcmNhbmdlbGkKKyAqCisgKiAgICAgICAgICAgICAgRGV2aWNlIHN0YXRpc3RpY3MgKHR4X3Bha2V0cywgdHhfYnl0ZXMsCisgKiAgICAgICAgICAgICAgdHhfZHJvcHM6IHF1ZXVlX292ZXJfdGltZSBhbmQgY29sbGlzaW9uczogbWF4X3F1ZXVlX2V4Y2VkZWQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTk5LzA2LzE4IEpvcmRpIE11cmdvIDxzYXZhZ2VAYXBvc3RvbHMub3JnPgorICoKKyAqCQlVc2Ugc2tiLT5jYiBmb3IgcHJpdmF0ZSBkYXRhLgorICoJCQkJIDIwMDAvMDMgQW5kaSBLbGVlbgorICovCisgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3NoYXBlci5oPgorCisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworc3RydWN0IHNoYXBlcl9jYiB7IAorCXVuc2lnbmVkIGxvbmcJc2hhcGVjbG9jazsJCS8qIFRpbWUgaXQgc2hvdWxkIGdvIG91dCAqLworCXVuc2lnbmVkIGxvbmcJc2hhcGVzdGFtcDsJCS8qIFN0YW1wIGZvciBzaGFwZXIgICAgKi8KKwlfX3UzMgkJc2hhcGVsYXRlbmN5OwkJLyogTGF0ZW5jeSBvbiBmcmFtZSAqLworCV9fdTMyCQlzaGFwZWxlbjsJCS8qIEZyYW1lIGxlbmd0aCBpbiBjbG9ja3MgKi8KKwlfX3UxNgkJc2hhcGVwZW5kOwkJLyogUGVuZGluZyAqLworfTsgCisjZGVmaW5lIFNIQVBFUkNCKHNrYikgKChzdHJ1Y3Qgc2hhcGVyX2NiICopICgoc2tiKS0+Y2IpKQorCitzdGF0aWMgaW50IHNoX2RlYnVnOwkJLyogRGVidWcgZmxhZyAqLworCisjZGVmaW5lIFNIQVBFUl9CQU5ORVIJIkN5bXJ1TmV0IFRyYWZmaWMgU2hhcGVyIEJFVEEgMC4wNCBmb3IgTGludXggMi4xXG4iCisKKy8qCisgKglMb2NraW5nCisgKi8KKyAKK3N0YXRpYyBpbnQgc2hhcGVyX2xvY2soc3RydWN0IHNoYXBlciAqc2gpCit7CisJLyoKKwkgKglMb2NrIGluIGFuIGludGVycnVwdCBtdXN0IGZhaWwKKwkgKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmc2gtPmxvY2tlZCkpCisJeworCQlpZiAoIWluX2ludGVycnVwdCgpKQorCQkJc2xlZXBfb24oJnNoLT53YWl0X3F1ZXVlKTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJCQkKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXBlcl9raWNrKHN0cnVjdCBzaGFwZXIgKnNoKTsKKworc3RhdGljIHZvaWQgc2hhcGVyX3VubG9jayhzdHJ1Y3Qgc2hhcGVyICpzaCkKK3sKKwljbGVhcl9iaXQoMCwgJnNoLT5sb2NrZWQpOworCXdha2VfdXAoJnNoLT53YWl0X3F1ZXVlKTsKKwlzaGFwZXJfa2ljayhzaCk7Cit9CisKKy8qCisgKglDb21wdXRlIGNsb2NrcyBvbiBhIGJ1ZmZlcgorICovCisgIAorc3RhdGljIGludCBzaGFwZXJfY2xvY2tzKHN0cnVjdCBzaGFwZXIgKnNoYXBlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAJaW50IHQ9c2tiLT5sZW4vc2hhcGVyLT5ieXRlc3BlcnRpY2s7CisgCXJldHVybiB0OworfQorCisvKgorICoJU2V0IHRoZSBzcGVlZCBvZiBhIHNoYXBlci4gV2UgY29tcHV0ZSB0aGlzIGluIGJ5dGVzIHBlciB0aWNrIHNpbmNlCisgKgl0aGF0cyBob3cgdGhlIG1hY2hpbmUgd2FudHMgdG8gcnVuLiBRdW90ZWQgaW5wdXQgaXMgaW4gYml0cyBwZXIgc2Vjb25kCisgKglhcyBpcyB0cmFkaXRpb25hbCAobm90ZSBub3QgQkFVRCkuIFdlIGFzc3VtZSA4IGJpdCBieXRlcy4gCisgKi8KKyAgCitzdGF0aWMgdm9pZCBzaGFwZXJfc2V0c3BlZWQoc3RydWN0IHNoYXBlciAqc2hhcGVyLCBpbnQgYml0c3BlcnNlYykKK3sKKwlzaGFwZXItPmJpdHNwZXJzZWM9Yml0c3BlcnNlYzsKKwlzaGFwZXItPmJ5dGVzcGVydGljaz0oYml0c3BlcnNlYy9IWikvODsKKwlpZighc2hhcGVyLT5ieXRlc3BlcnRpY2spCisJCXNoYXBlci0+Ynl0ZXNwZXJ0aWNrKys7Cit9CisKKy8qCisgKglUaHJvdyBhIGZyYW1lIGF0IGEgc2hhcGVyLgorICovCisgIAorc3RhdGljIGludCBzaGFwZXJfcWZyYW1lKHN0cnVjdCBzaGFwZXIgKnNoYXBlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAJc3RydWN0IHNrX2J1ZmYgKnB0cjsKKyAgIAorIAkvKgorIAkgKglHZXQgcmVhZHkgdG8gd29yayBvbiB0aGlzIHNoYXBlci4gTG9jayBtYXkgZmFpbCBpZiBpdHMKKyAJICoJYW4gaW50ZXJydXB0IGFuZCBsb2NrZWQuCisgCSAqLworIAkgCisgCWlmKCFzaGFwZXJfbG9jayhzaGFwZXIpKQorIAkJcmV0dXJuIC0xOworIAlwdHI9c2hhcGVyLT5zZW5kcS5wcmV2OworIAkKKyAJLyoKKyAJICoJU2V0IHVwIG91ciBwYWNrZXQgZGV0YWlscworIAkgKi8KKyAJIAorIAlTSEFQRVJDQihza2IpLT5zaGFwZWxhdGVuY3k9MDsKKyAJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jaz1zaGFwZXItPnJlY292ZXJ5OworIAlpZih0aW1lX2JlZm9yZShTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLCBqaWZmaWVzKSkKKyAJCVNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2s9amlmZmllczsKKyAJc2tiLT5wcmlvcml0eT0wOwkvKiBzaG9ydCB0ZXJtIGJ1ZyBmaXggKi8KKyAJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVzdGFtcD1qaWZmaWVzOworIAkKKyAJLyoKKyAJICoJVGltZSBzbG90cyBmb3IgdGhpcyBwYWNrZXQuCisgCSAqLworIAkgCisgCVNIQVBFUkNCKHNrYiktPnNoYXBlbGVuPSBzaGFwZXJfY2xvY2tzKHNoYXBlcixza2IpOworIAkKKyNpZmRlZiBTSEFQRVJfQ09NUExFWCAvKiBhbmQgYnJva2VuLi4gKi8KKworIAl3aGlsZShwdHIgJiYgcHRyIT0oc3RydWN0IHNrX2J1ZmYgKikmc2hhcGVyLT5zZW5kcSkKKyAJeworIAkJaWYocHRyLT5wcmk8c2tiLT5wcmkgCisgCQkJJiYgamlmZmllcyAtIFNIQVBFUkNCKHB0ciktPnNoYXBlY2xvY2sgPCBTSEFQRVJfTUFYU0xJUCkKKyAJCXsKKyAJCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wPXB0ci0+cHJldjsKKworIAkJCS8qCisgCQkJICoJSXQgZ29lcyBiZWZvcmUgdXMgdGhlcmVmb3JlIHdlIHNsaXAgdGhlIGxlbmd0aAorIAkJCSAqCW9mIHRoZSBuZXcgZnJhbWUuCisgCQkJICovCisKKyAJCQlTSEFQRVJDQihwdHIpLT5zaGFwZWNsb2NrKz1TSEFQRVJDQihza2IpLT5zaGFwZWxlbjsKKyAJCQlTSEFQRVJDQihwdHIpLT5zaGFwZWxhdGVuY3krPVNIQVBFUkNCKHNrYiktPnNoYXBlbGVuOworCisgCQkJLyoKKyAJCQkgKglUaGUgcGFja2V0IG1heSBoYXZlIHNsaXBwZWQgc28gZmFyIGJhY2sgaXQKKyAJCQkgKglmZWxsIG9mZi4KKyAJCQkgKi8KKyAJCQlpZihTSEFQRVJDQihwdHIpLT5zaGFwZWxhdGVuY3kgPiBTSEFQRVJfTEFURU5DWSkKKyAJCQl7CisgCQkJCXNrYl91bmxpbmsocHRyKTsKKyAJCQkJZGV2X2tmcmVlX3NrYihwdHIpOworIAkJCX0KKyAJCQlwdHI9dG1wOworIAkJfQorIAkJZWxzZQorIAkJCWJyZWFrOworIAl9CisgCWlmKHB0cj09TlVMTCB8fCBwdHI9PShzdHJ1Y3Qgc2tfYnVmZiAqKSZzaGFwZXItPnNlbmRxKQorIAkJc2tiX3F1ZXVlX2hlYWQoJnNoYXBlci0+c2VuZHEsc2tiKTsKKyAJZWxzZQorIAl7CisgCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wOworIAkJLyoKKyAJCSAqCVNldCB0aGUgcGFja2V0IGNsb2NrIG91dCB0aW1lIGFjY29yZGluZyB0byB0aGUKKyAJCSAqCWZyYW1lcyBhaGVhZC4gSW0gc3VyZSBhIGJpdCBvZiB0aG91Z2h0IGNvdWxkIGRyb3AKKyAJCSAqCXRoaXMgbG9vcC4KKyAJCSAqLworIAkJZm9yKHRtcD1za2JfcGVlaygmc2hhcGVyLT5zZW5kcSk7IHRtcCE9TlVMTCAmJiB0bXAhPXB0cjsgdG1wPXRtcC0+bmV4dCkKKyAJCQlTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrKz10bXAtPnNoYXBlbGVuOworIAkJc2tiX2FwcGVuZChwdHIsc2tiKTsKKyAJfQorI2Vsc2UKKwl7CisJCXN0cnVjdCBza19idWZmICp0bXA7CisJCS8qCisJCSAqCVVwIG91ciBzaGFwZSBjbG9jayBieSB0aGUgdGltZSBwZW5kaW5nIG9uIHRoZSBxdWV1ZQorCQkgKgkoU2hvdWxkIGtlZXAgdGhpcyBpbiB0aGUgc2hhcGVyIGFzIGEgdmFyaWFibGUuLikKKwkJICovCisJCWZvcih0bXA9c2tiX3BlZWsoJnNoYXBlci0+c2VuZHEpOyB0bXAhPU5VTEwgJiYgCisJCQl0bXAhPShzdHJ1Y3Qgc2tfYnVmZiAqKSZzaGFwZXItPnNlbmRxOyB0bXA9dG1wLT5uZXh0KQorCQkJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jays9U0hBUEVSQ0IodG1wKS0+c2hhcGVsZW47CisJCS8qCisJCSAqCVF1ZXVlIG92ZXIgdGltZS4gU3BpbGwgcGFja2V0LgorCQkgKi8KKwkJaWYoU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jay1qaWZmaWVzID4gU0hBUEVSX0xBVEVOQ1kpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXNoYXBlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9IGVsc2UKKwkJCXNrYl9xdWV1ZV90YWlsKCZzaGFwZXItPnNlbmRxLCBza2IpOworCX0KKyNlbmRpZiAJCisJaWYoc2hfZGVidWcpCisgCQlwcmludGsoIkZyYW1lIHF1ZXVlZC5cbiIpOworIAlpZihza2JfcXVldWVfbGVuKCZzaGFwZXItPnNlbmRxKT5TSEFQRVJfUUxFTikKKyAJeworIAkJcHRyPXNrYl9kZXF1ZXVlKCZzaGFwZXItPnNlbmRxKTsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHB0cik7CisgICAgICAgICAgICAgICAgc2hhcGVyLT5zdGF0cy5jb2xsaXNpb25zKys7CisgCX0KKyAJc2hhcGVyX3VubG9jayhzaGFwZXIpOworIAlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRyYW5zbWl0IGZyb20gYSBzaGFwZXIKKyAqLworIAorc3RhdGljIHZvaWQgc2hhcGVyX3F1ZXVlX3htaXQoc3RydWN0IHNoYXBlciAqc2hhcGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpuZXdza2I9c2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYoc2hfZGVidWcpCisJCXByaW50aygiS2ljayBmcmFtZSBvbiAlcFxuIixuZXdza2IpOworCWlmKG5ld3NrYikKKwl7CisJCW5ld3NrYi0+ZGV2PXNoYXBlci0+ZGV2OworCQluZXdza2ItPnByaW9yaXR5PTI7CisJCWlmKHNoX2RlYnVnKQorCQkJcHJpbnRrKCJLaWNrIG5ldyBmcmFtZSB0byAlcywgJWRcbiIsCisJCQkJc2hhcGVyLT5kZXYtPm5hbWUsbmV3c2tiLT5wcmlvcml0eSk7CisJCWRldl9xdWV1ZV94bWl0KG5ld3NrYik7CisKKyAgICAgICAgICAgICAgICBzaGFwZXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlzaGFwZXItPnN0YXRzLnR4X3BhY2tldHMrKzsKKworICAgICAgICAgICAgICAgIGlmKHNoX2RlYnVnKQorCQkJcHJpbnRrKCJLaWNrZWQgbmV3IGZyYW1lIG91dC5cbiIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCisvKgorICoJVGltZXIgaGFuZGxlciBmb3Igc2hhcGluZyBjbG9jaworICovCisgCitzdGF0aWMgdm9pZCBzaGFwZXJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzaGFwZXIgKnNoPShzdHJ1Y3Qgc2hhcGVyICopZGF0YTsKKwlzaGFwZXJfa2ljayhzaCk7Cit9CisKKy8qCisgKglLaWNrIGEgc2hhcGVyIHF1ZXVlIGFuZCB0cnkgYW5kIGRvIHNvbWV0aGluZyBzZW5zaWJsZSB3aXRoIHRoZSAKKyAqCXF1ZXVlLiAKKyAqLworCitzdGF0aWMgdm9pZCBzaGFwZXJfa2ljayhzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkKKwkvKgorCSAqCVNoYXBlciB1bmxvY2sgd2lsbCBraWNrCisJICovCisJIAorCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzaGFwZXItPmxvY2tlZCkpCisJeworCQlpZihzaF9kZWJ1ZykKKwkJCXByaW50aygiU2hhcGVyIGxvY2tlZC5cbiIpOworCQltb2RfdGltZXIoJnNoYXBlci0+dGltZXIsIGppZmZpZXMpOworCQlyZXR1cm47CisJfQorCisJCQorCS8qCisJICoJV2FsayB0aGUgbGlzdCAobWF5IGJlIGVtcHR5KQorCSAqLworCSAKKwl3aGlsZSgoc2tiPXNrYl9wZWVrKCZzaGFwZXItPnNlbmRxKSkhPU5VTEwpCisJeworCQkvKgorCQkgKglFYWNoIHBhY2tldCBkdWUgdG8gZ28gb3V0IGJ5IG5vdyAod2l0aGluIGFuIGVycm9yCisJCSAqCW9mIFNIQVBFUl9CVVJTVCkgZ2V0cyBraWNrZWQgb250byB0aGUgbGluayAKKwkJICovCisJCSAKKwkJaWYoc2hfZGVidWcpCisJCQlwcmludGsoIkNsb2NrID0gJWxkLCBqaWZmaWVzID0gJWxkXG4iLCBTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLCBqaWZmaWVzKTsKKwkJaWYodGltZV9iZWZvcmVfZXEoU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jaywgamlmZmllcyArIFNIQVBFUl9CVVJTVCkpCisJCXsKKwkJCS8qCisJCQkgKglQdWxsIHRoZSBmcmFtZSBhbmQgZ2V0IGludGVycnVwdHMgYmFjayBvbi4KKwkJCSAqLworCQkJIAorCQkJc2tiX3VubGluayhza2IpOworCQkJaWYgKHNoYXBlci0+cmVjb3ZlcnkgPCAKKwkJCSAgICBTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrICsgU0hBUEVSQ0Ioc2tiKS0+c2hhcGVsZW4pCisJCQkJc2hhcGVyLT5yZWNvdmVyeSA9IFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2sgKyBTSEFQRVJDQihza2IpLT5zaGFwZWxlbjsKKwkJCS8qCisJCQkgKglQYXNzIG9uIHRvIHRoZSBwaHlzaWNhbCB0YXJnZXQgZGV2aWNlIHZpYQorCQkJICoJb3VyIGxvdyBsZXZlbCBwYWNrZXQgdGhyb3dlci4KKwkJCSAqLworCQkJCisJCQlTSEFQRVJDQihza2IpLT5zaGFwZXBlbmQ9MDsKKwkJCXNoYXBlcl9xdWV1ZV94bWl0KHNoYXBlciwgc2tiKTsJLyogRmlyZSAqLworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCS8qCisJICoJTmV4dCBraWNrLgorCSAqLworCSAKKwlpZihza2IhPU5VTEwpCisJCW1vZF90aW1lcigmc2hhcGVyLT50aW1lciwgU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jayk7CisKKwljbGVhcl9iaXQoMCwgJnNoYXBlci0+bG9ja2VkKTsKK30KKworCisvKgorICoJRmx1c2ggdGhlIHNoYXBlciBxdWV1ZXMgb24gYSBjbG9zZWRvd24KKyAqLworIAorc3RhdGljIHZvaWQgc2hhcGVyX2ZsdXNoKHN0cnVjdCBzaGFwZXIgKnNoYXBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworIAlpZighc2hhcGVyX2xvY2soc2hhcGVyKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic2hhcGVyOiBzaGFwZXJfZmx1c2goKSBjYWxsZWQgYnkgYW4gaXJxIVxuIik7CisgCQlyZXR1cm47CisJfQorCXdoaWxlKChza2I9c2tiX2RlcXVldWUoJnNoYXBlci0+c2VuZHEpKSE9TlVMTCkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCXNoYXBlcl91bmxvY2soc2hhcGVyKTsKK30KKworLyoKKyAqCUJyaW5nIHRoZSBpbnRlcmZhY2UgdXAuIFdlIGp1c3QgZGlzYWxsb3cgdGhpcyB1bnRpbCBhIAorICoJYmluZC4KKyAqLworCitzdGF0aWMgaW50IHNoYXBlcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoYXBlciAqc2hhcGVyPWRldi0+cHJpdjsKKwkKKwkvKgorCSAqCUNhbid0IG9wZW4gdW50aWwgYXR0YWNoZWQuCisJICoJQWxzbyBjYW4ndCBvcGVuIHVudGlsIHNwZWVkIGlzIHNldCwgb3Igd2UnbGwgZ2V0CisJICoJYSBkaXZpc2lvbiBieSB6ZXJvLgorCSAqLworCSAKKwlpZihzaGFwZXItPmRldj09TlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYoc2hhcGVyLT5iaXRzcGVyc2VjPT0wKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNsb3NpbmcgYSBzaGFwZXIgZmx1c2hlcyB0aGUgcXVldWVzLgorICovCisgCitzdGF0aWMgaW50IHNoYXBlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaGFwZXIgKnNoYXBlcj1kZXYtPnByaXY7CisJc2hhcGVyX2ZsdXNoKHNoYXBlcik7CisJZGVsX3RpbWVyX3N5bmMoJnNoYXBlci0+dGltZXIpOworCXJldHVybiAwOworfQorCisvKgorICoJUmV2ZWN0b3JlZCBjYWxscy4gV2UgYWx0ZXIgdGhlIHBhcmFtZXRlcnMgYW5kIGNhbGwgdGhlIGZ1bmN0aW9ucworICoJZm9yIG91ciBhdHRhY2hlZCBkZXZpY2UuIFRoaXMgZW5hYmxlcyB1cyB0byBiYW5kd2lkdGggYWxsb2NhdGUgYWZ0ZXIKKyAqCUFSUCBhbmQgb3RoZXIgcmVzb2x1dGlvbnMgYW5kIG5vdCBiZWZvcmUuCisgKi8KKworCitzdGF0aWMgaW50IHNoYXBlcl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCXJldHVybiBzaGFwZXJfcWZyYW1lKHNoLCBza2IpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNoYXBlcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgCXN0cnVjdCBzaGFwZXIgKnNoPWRldi0+cHJpdjsKKwlyZXR1cm4gJnNoLT5zdGF0czsKK30KKworc3RhdGljIGludCBzaGFwZXJfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXN0cnVjdCBzaGFwZXIgKnNoPWRldi0+cHJpdjsKKwlpbnQgdjsKKwlpZihzaF9kZWJ1ZykKKwkJcHJpbnRrKCJTaGFwZXIgaGVhZGVyXG4iKTsKKwlza2ItPmRldj1zaC0+ZGV2OworCXY9c2gtPmhhcmRfaGVhZGVyKHNrYixzaC0+ZGV2LHR5cGUsZGFkZHIsc2FkZHIsbGVuKTsKKwlza2ItPmRldj1kZXY7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgc2hhcGVyX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNoYXBlciAqc2g9c2tiLT5kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj1za2ItPmRldjsKKwlpbnQgdjsKKwlpZihzaF9kZWJ1ZykKKwkJcHJpbnRrKCJTaGFwZXIgcmVidWlsZCBoZWFkZXJcbiIpOworCXNrYi0+ZGV2PXNoLT5kZXY7CisJdj1zaC0+cmVidWlsZF9oZWFkZXIoc2tiKTsKKwlza2ItPmRldj1kZXY7CisJcmV0dXJuIHY7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHNoYXBlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCkKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1uZWlnaC0+ZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICp0bXA7CisJaW50IHJldDsKKwlpZihzaF9kZWJ1ZykKKwkJcHJpbnRrKCJTaGFwZXIgaGVhZGVyIGNhY2hlIGJpbmRcbiIpOworCXRtcD1uZWlnaC0+ZGV2OworCW5laWdoLT5kZXY9c2gtPmRldjsKKwlyZXQ9c2gtPmhhcmRfaGVhZGVyX2NhY2hlKG5laWdoLGhoKTsKKwluZWlnaC0+ZGV2PXRtcDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaGFwZXJfY2FjaGVfdXBkYXRlKHN0cnVjdCBoaF9jYWNoZSAqaGgsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciBjYWNoZSB1cGRhdGVcbiIpOworCXNoLT5oZWFkZXJfY2FjaGVfdXBkYXRlKGhoLCBzaC0+ZGV2LCBoYWRkcik7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JTkVUCisKK3N0YXRpYyBpbnQgc2hhcGVyX25laWdoX3NldHVwKHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlpZiAobi0+bnVkX3N0YXRlID09IE5VRF9OT05FKSB7CisJCW4tPm9wcyA9ICZhcnBfYnJva2VuX29wczsKKwkJbi0+b3V0cHV0ID0gbi0+b3BzLT5vdXRwdXQ7CisJfQorI2VuZGlmCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYXBlcl9uZWlnaF9zZXR1cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJaWYgKHAtPnRibC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcC0+bmVpZ2hfc2V0dXAgPSBzaGFwZXJfbmVpZ2hfc2V0dXA7CisJCXAtPnVjYXN0X3Byb2JlcyA9IDA7CisJCXAtPm1jYXN0X3Byb2JlcyA9IDA7CisJfQorI2VuZGlmCQorCXJldHVybiAwOworfQorCisjZWxzZSAvKiAhKENPTkZJR19JTkVUKSAqLworCitzdGF0aWMgaW50IHNoYXBlcl9uZWlnaF9zZXR1cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBzaGFwZXJfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpzaGRldiwgc3RydWN0IHNoYXBlciAqc2gsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2gtPmRldiA9IGRldjsKKwlzaC0+aGFyZF9zdGFydF94bWl0PWRldi0+aGFyZF9zdGFydF94bWl0OworCXNoLT5nZXRfc3RhdHM9ZGV2LT5nZXRfc3RhdHM7CisJaWYoZGV2LT5oYXJkX2hlYWRlcikKKwl7CisJCXNoLT5oYXJkX2hlYWRlcj1kZXYtPmhhcmRfaGVhZGVyOworCQlzaGRldi0+aGFyZF9oZWFkZXIgPSBzaGFwZXJfaGVhZGVyOworCX0KKwllbHNlCisJCXNoZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCQorCWlmKGRldi0+cmVidWlsZF9oZWFkZXIpCisJeworCQlzaC0+cmVidWlsZF9oZWFkZXIJPSBkZXYtPnJlYnVpbGRfaGVhZGVyOworCQlzaGRldi0+cmVidWlsZF9oZWFkZXIJPSBzaGFwZXJfcmVidWlsZF9oZWFkZXI7CisJfQorCWVsc2UKKwkJc2hkZXYtPnJlYnVpbGRfaGVhZGVyCT0gTlVMTDsKKwkKKyNpZiAwCisJaWYoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSkKKwl7CisJCXNoLT5oYXJkX2hlYWRlcl9jYWNoZQk9IGRldi0+aGFyZF9oZWFkZXJfY2FjaGU7CisJCXNoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZT0gc2hhcGVyX2NhY2hlOworCX0KKwllbHNlCisJeworCQlzaGRldi0+aGFyZF9oZWFkZXJfY2FjaGU9IE5VTEw7CisJfQorCQkJCisJaWYoZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlKQorCXsKKwkJc2gtPmhlYWRlcl9jYWNoZV91cGRhdGUJPSBkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGU7CisJCXNoZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlID0gc2hhcGVyX2NhY2hlX3VwZGF0ZTsKKwl9CisJZWxzZQorCQlzaGRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gTlVMTDsKKyNlbHNlCisJc2hkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBOVUxMOworCXNoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSA9IE5VTEw7CisjZW5kaWYKKwlzaGRldi0+bmVpZ2hfc2V0dXAgPSBzaGFwZXJfbmVpZ2hfc2V0dXBfZGV2OworCQorCXNoZGV2LT5oYXJkX2hlYWRlcl9sZW49ZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJc2hkZXYtPnR5cGU9ZGV2LT50eXBlOworCXNoZGV2LT5hZGRyX2xlbj1kZXYtPmFkZHJfbGVuOworCXNoZGV2LT5tdHU9ZGV2LT5tdHU7CisJc2gtPmJpdHNwZXJzZWM9MDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGFwZXJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzaGFwZXJjb25mICpzcz0gKHN0cnVjdCBzaGFwZXJjb25mICopJmlmci0+aWZyX2lmcnU7CisJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCQorCWlmKHNzLT5zc19jbWQgPT0gU0hBUEVSX1NFVF9ERVYgfHwgc3MtPnNzX2NtZCA9PSBTSEFQRVJfU0VUX1NQRUVEKQorCXsKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKwkKKwlzd2l0Y2goc3MtPnNzX2NtZCkKKwl7CisJCWNhc2UgU0hBUEVSX1NFVF9ERVY6CisJCXsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICp0aGVtPV9fZGV2X2dldF9ieV9uYW1lKHNzLT5zc19uYW1lKTsKKwkJCWlmKHRoZW09PU5VTEwpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpZihzaC0+ZGV2KQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlyZXR1cm4gc2hhcGVyX2F0dGFjaChkZXYsZGV2LT5wcml2LCB0aGVtKTsKKwkJfQorCQljYXNlIFNIQVBFUl9HRVRfREVWOgorCQkJaWYoc2gtPmRldj09TlVMTCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXN0cmNweShzcy0+c3NfbmFtZSwgc2gtPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTSEFQRVJfU0VUX1NQRUVEOgorCQkJc2hhcGVyX3NldHNwZWVkKHNoLHNzLT5zc19zcGVlZCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTSEFQRVJfR0VUX1NQRUVEOgorCQkJc3MtPnNzX3NwZWVkPXNoLT5iaXRzcGVyc2VjOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNoYXBlcl9pbml0X3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaCA9IGRldi0+cHJpdjsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNoLT5zZW5kcSk7CisJaW5pdF90aW1lcigmc2gtPnRpbWVyKTsKKwlzaC0+dGltZXIuZnVuY3Rpb249c2hhcGVyX3RpbWVyOworCXNoLT50aW1lci5kYXRhPSh1bnNpZ25lZCBsb25nKXNoOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNoLT53YWl0X3F1ZXVlKTsKK30KKworLyoKKyAqCUFkZCBhIHNoYXBlciBkZXZpY2UgdG8gdGhlIHN5c3RlbQorICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgc2hhcGVyX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKglTZXQgdXAgdGhlIHNoYXBlci4KKwkgKi8KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXNoYXBlcl9pbml0X3ByaXYoZGV2KTsKKworCWRldi0+b3BlbgkJPSBzaGFwZXJfb3BlbjsKKwlkZXYtPnN0b3AJCT0gc2hhcGVyX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IHNoYXBlcl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzIAkJPSBzaGFwZXJfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKKwkKKwkvKgorCSAqCUludGlhbGlzZSB0aGUgcGFja2V0IHF1ZXVlcworCSAqLworCSAKKwkvKgorCSAqCUhhbmRsZXJzIGZvciB3aGVuIHdlIGF0dGFjaCB0byBhIGRldmljZS4KKwkgKi8KKworCWRldi0+aGFyZF9oZWFkZXIgCT0gc2hhcGVyX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyIAk9IHNoYXBlcl9yZWJ1aWxkX2hlYWRlcjsKKyNpZiAwCisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZQk9IHNoYXBlcl9jYWNoZTsKKwlkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGU9IHNoYXBlcl9jYWNoZV91cGRhdGU7CisjZW5kaWYKKwlkZXYtPm5laWdoX3NldHVwCT0gc2hhcGVyX25laWdoX3NldHVwX2RldjsKKwlkZXYtPmRvX2lvY3RsCQk9IHNoYXBlcl9pb2N0bDsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CisJZGV2LT50eXBlCQk9IEFSUEhSRF9FVEhFUjsJLyogaW5pdGlhbGx5ICovCisJZGV2LT5zZXRfbWFjX2FkZHJlc3MJPSBOVUxMOworCWRldi0+bXR1CQk9IDE1MDA7CisJZGV2LT5hZGRyX2xlbgkJPSAwOworCWRldi0+dHhfcXVldWVfbGVuCT0gMTA7CisJZGV2LT5mbGFncwkJPSAwOworfQorIAorc3RhdGljIGludCBzaGFwZXJzID0gMTsKKyNpZmRlZiBNT0RVTEUKKworbW9kdWxlX3BhcmFtKHNoYXBlcnMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNoYXBlcnMsICJUcmFmZmljIHNoYXBlcjogbWF4aW11bSBudW1iZXIgb2Ygc2hhcGVycyIpOworCisjZWxzZSAvKiBNT0RVTEUgKi8KKworc3RhdGljIGludCBfX2luaXQgc2V0X251bV9zaGFwZXJzKGNoYXIgKnN0cikKK3sKKwlzaGFwZXJzID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJzaGFwZXJzPSIsIHNldF9udW1fc2hhcGVycyk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2czsKKworc3RhdGljIHVuc2lnbmVkIGludCBzaGFwZXJzX3JlZ2lzdGVyZWQgPSAwOworCitzdGF0aWMgaW50IF9faW5pdCBzaGFwZXJfaW5pdCh2b2lkKQoreworCWludCBpOworCXNpemVfdCBhbGxvY19zaXplOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciBuYW1lW0lGTkFNU0laXTsKKworCWlmIChzaGFwZXJzIDwgMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhbGxvY19zaXplID0gc2l6ZW9mKCpkZXYpICogc2hhcGVyczsKKwlkZXZzID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChkZXZzLCAwLCBhbGxvY19zaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaGFwZXJzOyBpKyspIHsKKworCQlzbnByaW50ZihuYW1lLCBJRk5BTVNJWiwgInNoYXBlciVkIiwgaSk7CisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHNoYXBlciksIG5hbWUsCisJCQkJICAgc2hhcGVyX3NldHVwKTsKKwkJaWYgKCFkZXYpIAorCQkJYnJlYWs7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKworCQlkZXZzW2ldID0gZGV2OworCQlzaGFwZXJzX3JlZ2lzdGVyZWQrKzsKKwl9CisKKwlpZiAoIXNoYXBlcnNfcmVnaXN0ZXJlZCkgeworCQlrZnJlZShkZXZzKTsKKwkJZGV2cyA9IE5VTEw7CisJfQorCisJcmV0dXJuIChzaGFwZXJzX3JlZ2lzdGVyZWQgPyAwIDogLUVOT0RFVik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaGFwZXJfZXhpdCAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaGFwZXJzX3JlZ2lzdGVyZWQ7IGkrKykgeworCQlpZiAoZGV2c1tpXSkgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2c1tpXSk7CisJCQlmcmVlX25ldGRldihkZXZzW2ldKTsKKwkJfQorCX0KKworCWtmcmVlKGRldnMpOworCWRldnMgPSBOVUxMOworfQorCittb2R1bGVfaW5pdChzaGFwZXJfaW5pdCk7Cittb2R1bGVfZXhpdChzaGFwZXJfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5jIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5ZDlhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCkBAIC0wLDAgKzEsMjM3MCBAQAorLyogc2lzOTAwLmM6IEEgU2lTIDkwMC83MDE2IFBDSSBGYXN0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgICBDb3B5cmlnaHQgMTk5OSBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtIENvcnBvcmF0aW9uIAorICAgUmV2aXNpb246CTEuMDguMDggSmFuLiAyMiAyMDA1CisgICAKKyAgIE1vZGlmaWVkIGZyb20gdGhlIGRyaXZlciB3aGljaCBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlci4KKyAgIAorICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgIERyaXZlcnMgYmFzZWQgb24gdGhpcyBza2VsZXRvbiBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QgcmV0YWluCisgICB0aGUgYXV0aG9yc2hpcCAoaW1wbGljaXQgY29weXJpZ2h0KSBub3RpY2UuCisgICAKKyAgIFJlZmVyZW5jZXM6CisgICBTaVMgNzAxNiBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIENvbnRyb2xsZXIgd2l0aCBPbk5vdyBTdXBwb3J0LAorICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxNCwgMTk5OAorICAgU2lTIDkwMCBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIFNpbmdsZSBDaGlwIHdpdGggT25Ob3cgU3VwcG9ydCwKKyAgIHByZWxpbWluYXJ5IFJldi4gMS4wIE5vdi4gMTAsIDE5OTgKKyAgIFNpUyA3MDE0IFNpbmdsZSBDaGlwIDEwMEJBU0UtVFgvMTBCQVNFLVQgUGh5c2ljYWwgTGF5ZXIgU29sdXRpb24sCisgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE4LCAxOTk4CisKKyAgIFJldiAxLjA4LjA4IEphbi4gMjIgMjAwNSBEYW5pZWxlIFZlbnphbm8gdXNlIG5ldGlmX21zZyBmb3IgZGVidWdnaW5nIG1lc3NhZ2VzCisgICBSZXYgMS4wOC4wNyBOb3YuICAyIDIwMDMgRGFuaWVsZSBWZW56YW5vIDx3ZWJ2ZW56YUBsaWJlcm8uaXQ+IGFkZCBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0CisgICBSZXYgMS4wOC4wNiBTZXAuIDI0IDIwMDIgTXVmYXNhIFlhbmcgYnVnIGZpeCBmb3IgVHggdGltZW91dCAmIGFkZCBTaVM5NjMgc3VwcG9ydAorICAgUmV2IDEuMDguMDUgSnVuLiAgNiAyMDAyIE11ZmFzYSBZYW5nIGJ1ZyBmaXggZm9yIHJlYWRfZWVwcm9tICYgVHggZGVzY3JpcHRvciBvdmVyLWJvdW5kYXJ5CisgICBSZXYgMS4wOC4wNCBBcHIuIDI1IDIwMDIgTXVmYXNhIFlhbmcgPG11ZmFzYUBzaXMuY29tLnR3PiBhZGRlZCBTaVM5NjIgc3VwcG9ydAorICAgUmV2IDEuMDguMDMgRmViLiAgMSAyMDAyIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4gdXBkYXRlIHRvIHVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9uCisgICBSZXYgMS4wOC4wMiBOb3YuIDMwIDIwMDEgSHVpLUZlbiBIc3Ugd29ya2Fyb3VuZCBmb3IgRURCICYgYnVnIGZpeCBmb3IgZGhjcCBwcm9ibGVtCisgICBSZXYgMS4wOC4wMSBBdWcuIDI1IDIwMDEgSHVpLUZlbiBIc3UgdXBkYXRlIGZvciA2MzBFVCAmIHdvcmthcm91bmQgZm9yIElDUzE4OTMgUEhZCisgICBSZXYgMS4wOC4wMCBKdW4uIDExIDIwMDEgSHVpLUZlbiBIc3Ugd29ya2Fyb3VuZCBmb3IgUlRMODIwMSBQSFkgYW5kIHNvbWUgYnVnIGZpeAorICAgUmV2IDEuMDcuMTEgQXByLiAgMiAyMDAxIEh1aS1GZW4gSHN1IHVwZGF0ZXMgUENJIGRyaXZlcnMgdG8gdXNlIHRoZSBuZXcgcGNpX3NldF9kbWFfbWFzayBmb3Iga2VybmVsIDIuNC4zCisgICBSZXYgMS4wNy4xMCBNYXIuICAxIDIwMDEgSHVpLUZlbiBIc3UgPGhmaHN1QHNpcy5jb20udHc+IHNvbWUgYnVnIGZpeCAmIDYzNU0vQiBzdXBwb3J0IAorICAgUmV2IDEuMDcuMDkgRmViLiAgOSAyMDAxIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+IFBDSSBlbmFibGUgY2xlYW51cAorICAgUmV2IDEuMDcuMDggSmFuLiAgOCAyMDAxIExlaS1DaHVuIENoYW5nIGFkZGVkIFJUTDgyMDEgUEhZIHN1cHBvcnQKKyAgIFJldiAxLjA3LjA3IE5vdi4gMjkgMjAwMCBMZWktQ2h1biBDaGFuZyBhZGRlZCBrZXJuZWwtZG9jIGV4dHJhY3RhYmxlIGRvY3VtZW50YXRpb24gYW5kIDYzMCB3b3JrYXJvdW5kIGZpeAorICAgUmV2IDEuMDcuMDYgTm92LiAgNyAyMDAwIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4gc29tZSBidWcgZml4IGFuZCBjbGVhbmluZworICAgUmV2IDEuMDcuMDUgTm92LiAgNiAyMDAwIG1ldGFwaXJhdDxtZXRhcGlyYXRAZ214LmRlPiBjb250cmlidXRlIG1lZGlhIHR5cGUgc2VsZWN0IGJ5IGlmY29uZmlnCisgICBSZXYgMS4wNy4wNCBTZXAuICA2IDIwMDAgTGVpLUNodW4gQ2hhbmcgYWRkZWQgSUNTMTg5MyBQSFkgc3VwcG9ydAorICAgUmV2IDEuMDcuMDMgQXVnLiAyNCAyMDAwIExlaS1DaHVuIENoYW5nIChsY2NoYW5nQHNpcy5jb20udHcpIG1vZGlmaWVkIDYzMEUgZXFhdWxpemVyIHdvcmthcm91bmQgcnVsZQorICAgUmV2IDEuMDcuMDEgQXVnLiAwOCAyMDAwIE9sbGllIExobyBtaW5vciB1cGRhdGUgZm9yIFNpUyA2MzBFIGFuZCBTaVMgNjMwRSBBMQorICAgUmV2IDEuMDcgICAgTWFyLiAwNyAyMDAwIE9sbGllIExobyBidWcgZml4IGluIFJ4IGJ1ZmZlciByaW5nCisgICBSZXYgMS4wNi4wNCBGZWIuIDExIDIwMDAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiBzb2Z0bmV0IGFuZCBpbml0IGZvciBrZXJuZWwgMi40CisgICBSZXYgMS4wNi4wMyBEZWMuIDIzIDE5OTkgT2xsaWUgTGhvIFRoaXJkIHJlbGVhc2UKKyAgIFJldiAxLjA2LjAyIE5vdi4gMjMgMTk5OSBPbGxpZSBMaG8gYnVnIGluIG1hYyBwcm9iaW5nIGZpeGVkCisgICBSZXYgMS4wNi4wMSBOb3YuIDE2IDE5OTkgT2xsaWUgTGhvIENSQyBjYWxjdWxhdGlvbiBwcm92aWRlIGJ5IEpvc2VwaCBaYmljaWFrIChpbTE0dTJjQHByaW1lbmV0LmNvbSkKKyAgIFJldiAxLjA2IE5vdi4gNCAxOTk5IE9sbGllIExobyAob2xsaWVAc2lzLmNvbS50dykgU2Vjb25kIHJlbGVhc2UKKyAgIFJldiAxLjA1LjA1IE9jdC4gMjkgMTk5OSBPbGxpZSBMaG8gKG9sbGllQHNpcy5jb20udHcpIFNpbmdsZSBidWZmZXIgVHgvUngKKyAgIENoaW4tU2hhbiBMaSAobGNzQHNpcy5jb20udHcpIEFkZGVkIEFNRCBBbTc5YzkwMSBIb21lUE5BIFBIWSBzdXBwb3J0CisgICBSZXYgMS4wNSBBdWcuIDcgMTk5OSBKaW0gSHVhbmcgKGNtaHVhbmdAc2lzLmNvbS50dykgSW5pdGlhbCByZWxlYXNlCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+ICAgICAgLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogVXNlciBzcGFjZSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyAqLworCisjaW5jbHVkZSAic2lzOTAwLmgiCisKKyNkZWZpbmUgU0lTOTAwX01PRFVMRV9OQU1FICJzaXM5MDAiCisjZGVmaW5lIFNJUzkwMF9EUlZfVkVSU0lPTiAidjEuMDguMDggSmFuLiAyMiAyMDA1IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gInNpczkwMC5jOiAiIFNJUzkwMF9EUlZfVkVSU0lPTiAiXG4iOworCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDQwOworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMTI4OworCitzdGF0aWMgaW50IHNpczkwMF9kZWJ1ZyA9IC0xOyAvKiBVc2UgU0lTOTAwX0RFRl9NU0cgYXMgdmFsdWUgKi8KKworI2RlZmluZSBTSVM5MDBfREVGX01TRyBcCisJKE5FVElGX01TR19EUlYJCXwgXAorCSBORVRJRl9NU0dfTElOSwkJfCBcCisJIE5FVElGX01TR19SWF9FUlIJfCBcCisJIE5FVElGX01TR19UWF9FUlIpCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDQqSFopCisvKiBTaVMgOTAwIGlzIGNhcGFibGUgb2YgMzIgYml0cyBCTSBETUEgKi8KKyNkZWZpbmUgU0lTOTAwX0RNQV9NQVNLIDB4ZmZmZmZmZmYKKworZW51bSB7CisJU0lTXzkwMCA9IDAsCisJU0lTXzcwMTYKK307CitzdGF0aWMgY2hhciAqIGNhcmRfbmFtZXNbXSA9IHsKKwkiU2lTIDkwMCBQQ0kgRmFzdCBFdGhlcm5ldCIsCisJIlNpUyA3MDE2IFBDSSBGYXN0IEV0aGVybmV0IgorfTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXM5MDBfcGNpX3RibCBbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV85MDAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNJU185MDB9LAorCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzcwMTYsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNJU183MDE2fSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBzaXM5MDBfcGNpX3RibCk7CisKK3N0YXRpYyB2b2lkIHNpczkwMF9yZWFkX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKKworc3RhdGljIHN0cnVjdCBtaWlfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICogbmFtZTsKKwl1MTYgcGh5X2lkMDsKKwl1MTYgcGh5X2lkMTsKKwl1OCAgcGh5X3R5cGVzOworI2RlZmluZQlIT01FIAkweDAwMDEKKyNkZWZpbmUgTEFOCTB4MDAwMgorI2RlZmluZSBNSVgJMHgwMDAzCisjZGVmaW5lIFVOS05PV04JMHgwCit9IG1paV9jaGlwX3RhYmxlW10gPSB7CisJeyAiU2lTIDkwMCBJbnRlcm5hbCBNSUkgUEhZIiwgCQkweDAwMWQsIDB4ODAwMCwgTEFOIH0sCisJeyAiU2lTIDcwMTQgUGh5c2ljYWwgTGF5ZXIgU29sdXRpb24iLCAJMHgwMDE2LCAweGY4MzAsIExBTiB9LAorCXsgIkFsdGltYXRhIEFDMTAxTEYgUEhZIiwgICAgICAgICAgICAgICAweDAwMjIsIDB4NTUyMCwgTEFOIH0sCisJeyAiQU1EIDc5QzkwMSAxMEJBU0UtVCBQSFkiLCAgCQkweDAwMDAsIDB4NkI3MCwgTEFOIH0sCisJeyAiQU1EIDc5QzkwMSBIb21lUE5BIFBIWSIsCQkweDAwMDAsIDB4NkI5MCwgSE9NRX0sCisJeyAiSUNTIExBTiBQSFkiLAkJCTB4MDAxNSwgMHhGNDQwLCBMQU4gfSwKKwl7ICJOUyA4Mzg1MSBQSFkiLAkJCTB4MjAwMCwgMHg1QzIwLCBNSVggfSwKKwl7ICJOUyA4Mzg0NyBQSFkiLCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwLCAweDVDMzAsIE1JWCB9LAorCXsgIlJlYWx0ZWsgUlRMODIwMSBQSFkiLAkJMHgwMDAwLCAweDgyMDAsIExBTiB9LAorCXsgIlZJQSA2MTAzIFBIWSIsCQkJMHgwMTAxLCAweDhmMjAsIExBTiB9LAorCXtOVUxMLH0sCit9OworCitzdHJ1Y3QgbWlpX3BoeSB7CisJc3RydWN0IG1paV9waHkgKiBuZXh0OworCWludCBwaHlfYWRkcjsKKwl1MTYgcGh5X2lkMDsKKwl1MTYgcGh5X2lkMTsKKwl1MTYgc3RhdHVzOworCXU4ICBwaHlfdHlwZXM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfQnVmZmVyRGVzYyB7CisJdTMyIGxpbms7CisJdTMyIGNtZHN0czsKKwl1MzIgYnVmcHRyOworfSBCdWZmZXJEZXNjOworCitzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldjsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBtaWlfcGh5ICogbWlpOworCXN0cnVjdCBtaWlfcGh5ICogZmlyc3RfbWlpOyAvKiByZWNvcmQgdGhlIGZpcnN0IG1paSBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3BoeTsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOyAvKiBMaW5rIHN0YXR1cyBkZXRlY3Rpb24gdGltZXIuICovCisJdTggYXV0b25nX2NvbXBsZXRlOyAvKiAxOiBhdXRvLW5lZ290aWF0ZSBjb21wbGV0ZSAgKi8KKworCXUzMiBtc2dfZW5hYmxlOworCisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7IC8qIHByb2R1Y2VyL2NvbXN1bWVyIHBvaW50ZXJzIGZvciBUeC9SeCByaW5nICovCisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQvcmVjZWl2ZS1pbi1wbGFjZSBwYWNrZXQgYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltOVU1fVFhfREVTQ107CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltOVU1fUlhfREVTQ107CisJQnVmZmVyRGVzYyAqdHhfcmluZzsKKwlCdWZmZXJEZXNjICpyeF9yaW5nOworCisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCisJdW5zaWduZWQgaW50IHR4X2Z1bGw7IC8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXU4IGhvc3RfYnJpZGdlX3JldjsKKwl1OCBjaGlwc2V0X3JldjsKK307CisKK01PRFVMRV9BVVRIT1IoIkppbSBIdWFuZyA8Y21odWFuZ0BzaXMuY29tLnR3PiwgT2xsaWUgTGhvIDxvbGxpZUBzaXMuY29tLnR3PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaVMgOTAwIFBDSSBGYXN0IEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oc2lzOTAwX2RlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAiU2lTIDkwMC83MDE2IG1heGltdW0gbnVtYmVyIG9mIGZpbHRlcmVkIG11bHRpY2FzdCBhZGRyZXNzZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiU2lTIDkwMC83MDE2IG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhzaXM5MDBfZGVidWcsICJTaVMgOTAwLzcwMTYgYml0bWFwcGVkIGRlYnVnZ2luZyBtZXNzYWdlIGxldmVsIik7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgc2lzOTAwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBpbnQgc2lzOTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIGludCBzaXM5MDBfbWlpX3Byb2JlIChzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2luaXRfcnhmaWx0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CitzdGF0aWMgdTE2IHJlYWRfZWVwcm9tKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHUxNiBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWwpOworc3RhdGljIHZvaWQgc2lzOTAwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBzaXM5MDBfY2hlY2tfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHN0cnVjdCBtaWlfcGh5ICptaWlfcGh5KTsKK3N0YXRpYyB2b2lkIHNpczkwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczkwMF9pbml0X3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2luaXRfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaW50IHNpczkwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyBpbnQgc2lzOTAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczkwMF9maW5pc2hfeG1pdCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIGlycXJldHVybl90IHNpczkwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHNpczkwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaW50IG1paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNpczkwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHUxNiBzaXM5MDBfbWNhc3RfYml0bnIodTggKmFkZHIsIHU4IHJldmlzaW9uKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczkwMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM2MzBfc2V0X2VxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1OCByZXZpc2lvbik7CitzdGF0aWMgaW50IHNpczkwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyB1MTYgc2lzOTAwX2RlZmF1bHRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM5MDBfc2V0X2NhcGFiaWxpdHkoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ICxzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKK3N0YXRpYyB1MTYgc2lzOTAwX3Jlc2V0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9hZGRyKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9hdXRvX25lZ290aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9hZGRyKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfbW9kZSAobG9uZyBpb2FkZHIsIGludCBzcGVlZCwgaW50IGR1cGxleCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNpczkwMF9ldGh0b29sX29wczsKKworLyoqCisgKglzaXM5MDBfZ2V0X21hY19hZGRyIC0gR2V0IE1BQyBhZGRyZXNzIGZvciBzdGFuZCBhbG9uZSBTaVM5MDAgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IgCisgKgorICoJT2xkZXIgU2lTOTAwIGFuZCBmcmllbmRzLCB1c2UgRUVQUk9NIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIHJlYWRfZWVwcm9tKCkgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc2lzOTAwX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWxvbmcgaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOworCXUxNiBzaWduYXR1cmU7CisJaW50IGk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBzYW5lIEVFUFJPTSAqLworCXNpZ25hdHVyZSA9ICh1MTYpIHJlYWRfZWVwcm9tKGlvYWRkciwgRUVQUk9NU2lnbmF0dXJlKTsgICAgCisJaWYgKHNpZ25hdHVyZSA9PSAweGZmZmYgfHwgc2lnbmF0dXJlID09IDB4MDAwMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIEVFUlBPTSByZWFkICV4XG4iLCAKKwkJCXBjaV9uYW1lKHBjaV9kZXYpLCBzaWduYXR1cmUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBnZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCSAgICAgICAgKCh1MTYgKikobmV0X2Rldi0+ZGV2X2FkZHIpKVtpXSA9IHJlYWRfZWVwcm9tKGlvYWRkciwgaStFRVBST01NQUNBZGRyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXNpczYzMGVfZ2V0X21hY19hZGRyIC0gR2V0IE1BQyBhZGRyZXNzIGZvciBTaVM2MzBFIG1vZGVsCisgKglAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yIAorICoKKyAqCVNpUzYzMEUgbW9kZWwsIHVzZSBBUEMgQ01PUyBSQU0gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKglBUEMgQ01PUyBSQU0gaXMgYWNjZXNzZWQgdGhyb3VnaCBJU0EgYnJpZGdlLgorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM2MzBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlID0gTlVMTDsKKwl1OCByZWc7CisJaW50IGk7CisKKwlpc2FfYnJpZGdlID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwMDA4LCBpc2FfYnJpZGdlKTsKKwlpZiAoIWlzYV9icmlkZ2UpCisJCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCAweDAwMTgsIGlzYV9icmlkZ2UpOworCWlmICghaXNhX2JyaWRnZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuIG5vdCBmaW5kIElTQSBicmlkZ2VcbiIsCisJCSAgICAgICBwY2lfbmFtZShwY2lfZGV2KSk7CisJCXJldHVybiAwOworCX0KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCAmcmVnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgcmVnIHwgMHg0MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCW91dGIoMHgwOSArIGksIDB4NzApOworCQkoKHU4ICopKG5ldF9kZXYtPmRldl9hZGRyKSlbaV0gPSBpbmIoMHg3MSk7IAorCX0KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgcmVnICYgfjB4NDApOworCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOworCisJcmV0dXJuIDE7Cit9CisKKworLyoqCisgKglzaXM2MzVfZ2V0X21hY19hZGRyIC0gR2V0IE1BQyBhZGRyZXNzIGZvciBTSVM2MzUgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IgCisgKgorICoJU2lTNjM1IG1vZGVsLCBzZXQgTUFDIFJlbG9hZCBCaXQgdG8gbG9hZCBNYWMgYWRkcmVzcyBmcm9tIEFQQworICoJdG8gcmZkci4gcmZkciBpcyBhY2Nlc3NlZCB0aHJvdWdoIHJmY3IuIE1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byAKKyAqCUBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM2MzVfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJdTMyIHJmY3JTYXZlOworCXUzMiBpOworCisJcmZjclNhdmUgPSBpbmwocmZjciArIGlvYWRkcik7CisKKwlvdXRsKHJmY3JTYXZlIHwgUkVMT0FELCBpb2FkZHIgKyBjcik7CisJb3V0bCgwLCBpb2FkZHIgKyBjcik7CisKKwkvKiBkaXNhYmxlIHBhY2tldCBmaWx0ZXJpbmcgYmVmb3JlIHNldHRpbmcgZmlsdGVyICovCisJb3V0bChyZmNyU2F2ZSAmIH5SRkVOLCByZmNyICsgaW9hZGRyKTsKKworCS8qIGxvYWQgTUFDIGFkZHIgdG8gZmlsdGVyIGRhdGEgcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKKwkJb3V0bCgoaSA8PCBSRkFERFJfc2hpZnQpLCBpb2FkZHIgKyByZmNyKTsKKwkJKiggKCh1MTYgKiluZXRfZGV2LT5kZXZfYWRkcikgKyBpKSA9IGludyhpb2FkZHIgKyByZmRyKTsKKwl9CisKKwkvKiBlbmFibGUgcGFja2V0IGZpbHRlcmluZyAqLworCW91dGwocmZjclNhdmUgfCBSRkVOLCByZmNyICsgaW9hZGRyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXNpczk2eF9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzk2MiBvciBTaVM5NjMgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IgCisgKgorICoJU2lTOTYyIG9yIFNpUzk2MyBtb2RlbCwgdXNlIEVFUFJPTSB0byBzdG9yZSBNQUMgYWRkcmVzcy4gQW5kIEVFUFJPTSAKKyAqCWlzIHNoYXJlZCBieQorICoJTEFOIGFuZCAxMzk0LiBXaGVuIGFjY2VzcyBFRVBST00sIHNlbmQgRUVSRVEgc2lnbmFsIHRvIGhhcmR3YXJlIGZpcnN0IAorICoJYW5kIHdhaXQgZm9yIEVFR05ULiBJZiBFRUdOVCBpcyBPTiwgRUVQUk9NIGlzIHBlcm1pdHRlZCB0byBiZSBhY2Nlc3MgCisgKglieSBMQU4sIG90aGVyd2lzZSBpcyBub3QuIEFmdGVyIE1BQyBhZGRyZXNzIGlzIHJlYWQgZnJvbSBFRVBST00sIHNlbmQKKyAqCUVFRE9ORSBzaWduYWwgdG8gcmVmdXNlIEVFUFJPTSBhY2Nlc3MgYnkgTEFOLiAKKyAqCVRoZSBFRVBST00gbWFwIG9mIFNpUzk2MiBvciBTaVM5NjMgaXMgZGlmZmVyZW50IHRvIFNpUzkwMC4gCisgKglUaGUgc2lnbmF0dXJlIGZpZWxkIGluIFNpUzk2MiBvciBTaVM5NjMgc3BlYyBpcyBtZWFuaW5nbGVzcy4gCisgKglNQUMgYWRkcmVzcyBpcyByZWFkIGludG8gQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczk2eF9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBtZWFyOworCXUzMiB3YWl0dGltZSA9IDA7CisJaW50IGk7CisJCisJb3V0bChFRVJFUSwgZWVfYWRkcik7CisJd2hpbGUod2FpdHRpbWUgPCAyMDAwKSB7CisJCWlmKGlubChlZV9hZGRyKSAmIEVFR05UKSB7CisKKwkJCS8qIGdldCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCSAgICAgICAgKCh1MTYgKikobmV0X2Rldi0+ZGV2X2FkZHIpKVtpXSA9IHJlYWRfZWVwcm9tKGlvYWRkciwgaStFRVBST01NQUNBZGRyKTsKKworCQkJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQl1ZGVsYXkoMSk7CQorCQkJd2FpdHRpbWUgKys7CisJCX0KKwl9CisJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9wcm9iZSAtIFByb2JlIGZvciBzaXM5MDAgZGV2aWNlCisgKglAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKglAcGNpX2lkOiB0aGUgcGNpIGRldmljZSBJRAorICoKKyAqCUNoZWNrIGFuZCBwcm9iZSBzaXM5MDAgbmV0IGRldmljZSBmb3IgQHBjaV9kZXYuCisgKglHZXQgbWFjIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBjaGlwIHJldmlzaW9uLCAKKyAqCWFuZCBhc3NpZ24gU2lTOTAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKglpZTogc2lzOTAwX29wZW4oKSwgc2lzOTAwX3N0YXJ0X3htaXQoKSwgc2lzOTAwX2Nsb3NlKCksIGV0Yy4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM5MDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJZG1hX2FkZHJfdCByaW5nX2RtYTsKKwl2b2lkICpyaW5nX3NwYWNlOworCWxvbmcgaW9hZGRyOworCWludCBpLCByZXQ7CisJY2hhciAqY2FyZF9uYW1lID0gY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXTsKKwljb25zdCBjaGFyICpkZXZfbmFtZSA9IHBjaV9uYW1lKHBjaV9kZXYpOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCS8qIHNldHVwIHZhcmlvdXMgYml0cyBpbiBQQ0kgY29tbWFuZCByZWdpc3RlciAqLworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWlmKHJldCkgcmV0dXJuIHJldDsKKwkKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBTSVM5MDBfRE1BX01BU0spOworCWlmKGkpeworCQlwcmludGsoS0VSTl9FUlIgInNpczkwMC5jOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIKKwkJCSIzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiBpOworCX0KKwkKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKwkKKwluZXRfZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzaXM5MDBfcHJpdmF0ZSkpOworCWlmICghbmV0X2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihuZXRfZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmcGNpX2Rldi0+ZGV2KTsKKworCS8qIFdlIGRvIGEgcmVxdWVzdF9yZWdpb24oKSB0byByZWdpc3RlciAvcHJvYy9pb3BvcnRzIGluZm8uICovCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOwkKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsICJzaXM5MDAiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKKwlzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbmV0X2Rldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCW5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKKwlzaXNfcHJpdi0+cGNpX2RldiA9IHBjaV9kZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNpc19wcml2LT5sb2NrKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfY2xlYXJkZXY7CisJfQorCXNpc19wcml2LT50eF9yaW5nID0gKEJ1ZmZlckRlc2MgKilyaW5nX3NwYWNlOworCXNpc19wcml2LT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwX3R4OworCX0KKwlzaXNfcHJpdi0+cnhfcmluZyA9IChCdWZmZXJEZXNjICopcmluZ19zcGFjZTsKKwlzaXNfcHJpdi0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKwkJCisJLyogVGhlIFNpUzkwMC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCW5ldF9kZXYtPm9wZW4gPSAmc2lzOTAwX29wZW47CisJbmV0X2Rldi0+aGFyZF9zdGFydF94bWl0ID0gJnNpczkwMF9zdGFydF94bWl0OworCW5ldF9kZXYtPnN0b3AgPSAmc2lzOTAwX2Nsb3NlOworCW5ldF9kZXYtPmdldF9zdGF0cyA9ICZzaXM5MDBfZ2V0X3N0YXRzOworCW5ldF9kZXYtPnNldF9jb25maWcgPSAmc2lzOTAwX3NldF9jb25maWc7CisJbmV0X2Rldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCW5ldF9kZXYtPmRvX2lvY3RsID0gJm1paV9pb2N0bDsKKwluZXRfZGV2LT50eF90aW1lb3V0ID0gc2lzOTAwX3R4X3RpbWVvdXQ7CisJbmV0X2Rldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCW5ldF9kZXYtPmV0aHRvb2xfb3BzID0gJnNpczkwMF9ldGh0b29sX29wczsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgICAgIG5ldF9kZXYtPnBvbGxfY29udHJvbGxlciA9ICZzaXM5MDBfcG9sbDsKKyNlbmRpZgorCisJaWYgKHNpczkwMF9kZWJ1ZyA+IDApCisJCXNpc19wcml2LT5tc2dfZW5hYmxlID0gc2lzOTAwX2RlYnVnOworCWVsc2UKKwkJc2lzX3ByaXYtPm1zZ19lbmFibGUgPSBTSVM5MDBfREVGX01TRzsKKwkJCisJLyogR2V0IE1hYyBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgY2hpcCByZXZpc2lvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJihzaXNfcHJpdi0+Y2hpcHNldF9yZXYpKTsKKwlpZihuZXRpZl9tc2dfcHJvYmUoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRldGVjdGVkIHJldmlzaW9uICUyLjJ4LCAiCisJCQkJInRyeWluZyB0byBnZXQgTUFDIGFkZHJlc3MuLi5cbiIsCisJCQkJZGV2X25hbWUsIHNpc19wcml2LT5jaGlwc2V0X3Jldik7CisJCisJcmV0ID0gMDsKKwlpZiAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzYzMEVfOTAwX1JFVikKKwkJcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpX2RldiwgbmV0X2Rldik7CisJZWxzZSBpZiAoKHNpc19wcml2LT5jaGlwc2V0X3JldiA+IDB4ODEpICYmIChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPD0gMHg5MCkgKQorCQlyZXQgPSBzaXM2MzVfZ2V0X21hY19hZGRyKHBjaV9kZXYsIG5ldF9kZXYpOworCWVsc2UgaWYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM5NnhfOTAwX1JFVikKKwkJcmV0ID0gc2lzOTZ4X2dldF9tYWNfYWRkcihwY2lfZGV2LCBuZXRfZGV2KTsKKwllbHNlCisJCXJldCA9IHNpczkwMF9nZXRfbWFjX2FkZHIocGNpX2RldiwgbmV0X2Rldik7CisKKwlpZiAocmV0ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCByZWFkIE1BQyBhZGRyZXNzLlxuIiwgZGV2X25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl91bm1hcF9yeDsKKwl9CisJCisJLyogNjMwRVQgOiBzZXQgdGhlIG1paSBhY2Nlc3MgbW9kZSBhcyBzb2Z0d2FyZS1tb2RlICovCisJaWYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM2MzBFVF85MDBfUkVWKQorCQlvdXRsKEFDQ0VTU01PREUgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKwkvKiBwcm9iZSBmb3IgbWlpIHRyYW5zY2VpdmVyICovCisJaWYgKHNpczkwMF9taWlfcHJvYmUobmV0X2RldikgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgcHJvYmluZyBNSUkgZGV2aWNlLlxuIiwKKwkJICAgICAgIGRldl9uYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5tYXBfcng7CisJfQorCisJLyogc2F2ZSBvdXIgaG9zdCBicmlkZ2UgcmV2aXNpb24gKi8KKwlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzYzMCwgTlVMTCk7CisJaWYgKGRldikgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYpOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bm1hcF9yeDsKKworCS8qIHByaW50IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgb3VyIE5JQyAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlI2x4LCBJUlEgJWQsICIsIG5ldF9kZXYtPm5hbWUsCisJICAgICAgIGNhcmRfbmFtZSwgaW9hZGRyLCBuZXRfZGV2LT5pcnEpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgKHU4KW5ldF9kZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LlxuIiwgbmV0X2Rldi0+ZGV2X2FkZHJbaV0pOworCisJcmV0dXJuIDA7CisKKyBlcnJfdW5tYXBfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBSWF9UT1RBTF9TSVpFLCBzaXNfcHJpdi0+cnhfcmluZywKKwkJc2lzX3ByaXYtPnJ4X3JpbmdfZG1hKTsKKyBlcnJfdW5tYXBfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBUWF9UT1RBTF9TSVpFLCBzaXNfcHJpdi0+dHhfcmluZywKKwkJc2lzX3ByaXYtPnR4X3JpbmdfZG1hKTsKKyBlcnJfb3V0X2NsZWFyZGV2OgorIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKKyBlcnJfb3V0OgorCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJc2lzOTAwX21paV9wcm9iZSAtIFByb2JlIE1JSSBQSFkgZm9yIHNpczkwMAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHByb2JlIGZvcgorICoJCisgKglTZWFyY2ggZm9yIHRvdGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzLgorICoJSWRlbnRpZnkgYW5kIHNldCBjdXJyZW50IHBoeSBpZiBmb3VuZCBvbmUsCisgKglyZXR1cm4gZXJyb3IgaWYgaXQgZmFpbGVkIHRvIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNpczkwMF9taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqIHNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwljb25zdCBjaGFyICpkZXZfbmFtZSA9IHBjaV9uYW1lKHNpc19wcml2LT5wY2lfZGV2KTsKKwl1MTYgcG9sbF9iaXQgPSBNSUlfU1RBVF9MSU5LLCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyA1ICogSFo7CisJaW50IHBoeV9hZGRyOworCisJc2lzX3ByaXYtPm1paSA9IE5VTEw7CisKKwkvKiBzZWFyY2ggZm9yIHRvdGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzICovCisJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgMzI7IHBoeV9hZGRyKyspIHsJCisJCXN0cnVjdCBtaWlfcGh5ICogbWlpX3BoeSA9IE5VTEw7CisJCXUxNiBtaWlfc3RhdHVzOworCQlpbnQgaTsKKworCQltaWlfcGh5ID0gTlVMTDsKKwkJZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwkJaWYgKG1paV9zdGF0dXMgPT0gMHhmZmZmIHx8IG1paV9zdGF0dXMgPT0gMHgwMDAwKSB7CisJCQlpZiAobmV0aWZfbXNnX3Byb2JlKHNpc19wcml2KSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1JSSBhdCBhZGRyZXNzICVkIgorCQkJCQkJIiBub3QgYWNjZXNzaWJsZVxuIiwKKwkJCQkJCWRldl9uYW1lLCBwaHlfYWRkcik7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYgKChtaWlfcGh5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1paV9waHkpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IGFsbG9jYXRlIG1lbSBmb3Igc3RydWN0IG1paV9waHlcbiIpOworCQkJbWlpX3BoeSA9IHNpc19wcml2LT5maXJzdF9taWk7CisJCQl3aGlsZSAobWlpX3BoeSkgeworCQkJCXN0cnVjdCBtaWlfcGh5ICpwaHk7CisJCQkJcGh5ID0gbWlpX3BoeTsKKwkJCQltaWlfcGh5ID0gbWlpX3BoeS0+bmV4dDsKKwkJCQlrZnJlZShwaHkpOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCW1paV9waHktPnBoeV9pZDAgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9QSFlfSUQwKTsKKwkJbWlpX3BoeS0+cGh5X2lkMSA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9JRDEpOwkJCisJCW1paV9waHktPnBoeV9hZGRyID0gcGh5X2FkZHI7CisJCW1paV9waHktPnN0YXR1cyA9IG1paV9zdGF0dXM7CisJCW1paV9waHktPm5leHQgPSBzaXNfcHJpdi0+bWlpOworCQlzaXNfcHJpdi0+bWlpID0gbWlpX3BoeTsKKwkJc2lzX3ByaXYtPmZpcnN0X21paSA9IG1paV9waHk7CisKKwkJZm9yIChpID0gMDsgbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMTsgaSsrKQorCQkJaWYgKChtaWlfcGh5LT5waHlfaWQwID09IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDAgKSAmJgorCQkJICAgICgobWlpX3BoeS0+cGh5X2lkMSAmIDB4RkZGMCkgPT0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMSkpeworCQkJCW1paV9waHktPnBoeV90eXBlcyA9IG1paV9jaGlwX3RhYmxlW2ldLnBoeV90eXBlczsKKwkJCQlpZiAobWlpX2NoaXBfdGFibGVbaV0ucGh5X3R5cGVzID09IE1JWCkKKwkJCQkJbWlpX3BoeS0+cGh5X3R5cGVzID0KKwkJCQkJICAgIChtaWlfc3RhdHVzICYgKE1JSV9TVEFUX0NBTl9UWF9GRFggfCBNSUlfU1RBVF9DQU5fVFgpKSA/IExBTiA6IEhPTUU7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHRyYW5zY2VpdmVyIGZvdW5kICIKKwkJCQkJCQkiYXQgYWRkcmVzcyAlZC5cbiIsCisJCQkJCQkJZGV2X25hbWUsCisJCQkJCQkJbWlpX2NoaXBfdGFibGVbaV0ubmFtZSwKKwkJCQkJCQlwaHlfYWRkcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJaWYoICFtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gUEhZIHRyYW5zY2VpdmVyIGZvdW5kIGF0IGFkZHJlc3MgJWQuXG4iLAorCQkJICAgICAgIGRldl9uYW1lLCBwaHlfYWRkcik7CisJCQltaWlfcGh5LT5waHlfdHlwZXMgPSBVTktOT1dOOworCQl9CisJfQorCQorCWlmIChzaXNfcHJpdi0+bWlpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iLCBkZXZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHNlbGVjdCBkZWZhdWx0IFBIWSBmb3IgbWFjICovCisJc2lzX3ByaXYtPm1paSA9IE5VTEw7CisJc2lzOTAwX2RlZmF1bHRfcGh5KCBuZXRfZGV2ICk7CisKKwkvKiBSZXNldCBwaHkgaWYgZGVmYXVsdCBwaHkgaXMgaW50ZXJuYWwgc2lzOTAwICovCisgICAgICAgIGlmICgoc2lzX3ByaXYtPm1paS0+cGh5X2lkMCA9PSAweDAwMUQpICYmCisJICAgICgoc2lzX3ByaXYtPm1paS0+cGh5X2lkMSYweEZGRjApID09IDB4ODAwMCkpCisgICAgICAgIAlzdGF0dXMgPSBzaXM5MDBfcmVzZXRfcGh5KG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5KTsKKyAgICAgICAgCisgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIElDUzE4OTMgUEhZICovCisgICAgICAgIGlmICgoc2lzX3ByaXYtPm1paS0+cGh5X2lkMCA9PSAweDAwMTUpICYmCisgICAgICAgICAgICAoKHNpc19wcml2LT5taWktPnBoeV9pZDEmMHhGRkYwKSA9PSAweEY0NDApKQorICAgICAgICAgICAgCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIDB4MDAxOCwgMHhEMjAwKTsKKworCWlmKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspeworCQl3aGlsZSAocG9sbF9iaXQpIHsKKwkJCXlpZWxkKCk7CisKKwkJCXBvbGxfYml0IF49IChtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpICYgcG9sbF9iaXQpOworCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXQgcGh5IGFuZCBsaW5rIGRvd24gbm93XG4iLAorCQkJCSAgICAgICBkZXZfbmFtZSk7CisJCQkJcmV0dXJuIC1FVElNRTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTNjMwRV85MDBfUkVWKSB7CisJCS8qIFNpUyA2MzBFIGhhcyBzb21lIGJ1Z3Mgb24gZGVmYXVsdCB2YWx1ZSBvZiBQSFkgcmVnaXN0ZXJzICovCisJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9BTkFEViwgMHgwNWUxKTsKKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX0NPTkZJRzEsIDB4MjIpOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09ORklHMiwgMHhmZjAwKTsKKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX01BU0ssIDB4ZmZjMCk7CisJCS8vbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX0NPTlRST0wsIDB4MTAwMCk7CQorCX0KKworCWlmIChzaXNfcHJpdi0+bWlpLT5zdGF0dXMgJiBNSUlfU1RBVF9MSU5LKQorCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCWVsc2UKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglzaXM5MDBfZGVmYXVsdF9waHkgLSBTZWxlY3QgZGVmYXVsdCBQSFkgZm9yIHNpczkwMCBtYWMuCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKgorICoJU2VsZWN0IGZpcnN0IGRldGVjdGVkIFBIWSB3aXRoIGxpbmsgYXMgZGVmYXVsdC4KKyAqCUlmIG5vIG9uZSBpcyBsaW5rIG9uLCBzZWxlY3QgUEhZIHdob3NlIHR5cGVzIGlzIEhPTUUgYXMgZGVmYXVsdC4KKyAqCUlmIEhPTUUgZG9lc24ndCBleGlzdCwgc2VsZWN0IExBTi4KKyAqLworCitzdGF0aWMgdTE2IHNpczkwMF9kZWZhdWx0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICogc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworIAlzdHJ1Y3QgbWlpX3BoeSAqcGh5ID0gTlVMTCwgKnBoeV9ob21lID0gTlVMTCwgCisJCSpkZWZhdWx0X3BoeSA9IE5VTEwsICpwaHlfbGFuID0gTlVMTDsKKwl1MTYgc3RhdHVzOworCisgICAgICAgIGZvciAocGh5PXNpc19wcml2LT5maXJzdF9taWk7IHBoeTsgcGh5PXBoeS0+bmV4dCkgeworCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCQkvKiBMaW5rIE9OICYgTm90IHNlbGVjdCBkZWZhdWx0IFBIWSAmIG5vdCBnaG9zdCBQSFkgKi8KKwkJIGlmICgoc3RhdHVzICYgTUlJX1NUQVRfTElOSykgJiYgIWRlZmF1bHRfcGh5ICYmCisJCQkJCShwaHktPnBoeV90eXBlcyAhPSBVTktOT1dOKSkKKwkJIAlkZWZhdWx0X3BoeSA9IHBoeTsKKwkJIGVsc2UgeworCQkJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeS0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCW1kaW9fd3JpdGUobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wsCisJCQkJc3RhdHVzIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX0lTT0xBVEUpOworCQkJaWYgKHBoeS0+cGh5X3R5cGVzID09IEhPTUUpCisJCQkJcGh5X2hvbWUgPSBwaHk7CisJCQllbHNlIGlmKHBoeS0+cGh5X3R5cGVzID09IExBTikKKwkJCQlwaHlfbGFuID0gcGh5OworCQkgfQorCX0KKworCWlmICghZGVmYXVsdF9waHkgJiYgcGh5X2hvbWUpCisJCWRlZmF1bHRfcGh5ID0gcGh5X2hvbWU7CisJZWxzZSBpZiAoIWRlZmF1bHRfcGh5ICYmIHBoeV9sYW4pCisJCWRlZmF1bHRfcGh5ID0gcGh5X2xhbjsKKwllbHNlIGlmICghZGVmYXVsdF9waHkpCisJCWRlZmF1bHRfcGh5ID0gc2lzX3ByaXYtPmZpcnN0X21paTsKKworCWlmIChzaXNfcHJpdi0+bWlpICE9IGRlZmF1bHRfcGh5KSB7CisJCXNpc19wcml2LT5taWkgPSBkZWZhdWx0X3BoeTsKKwkJc2lzX3ByaXYtPmN1cl9waHkgPSBkZWZhdWx0X3BoeS0+cGh5X2FkZHI7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyB0cmFuc2NlaXZlciBmb3VuZCBhdCBhZGRyZXNzICVkIGFzIGRlZmF1bHRcbiIsCisJCSAgICAgICBwY2lfbmFtZShzaXNfcHJpdi0+cGNpX2RldiksIHNpc19wcml2LT5jdXJfcGh5KTsKKwl9CisJCisJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09OVFJPTCk7CisJc3RhdHVzICY9ICh+TUlJX0NOVExfSVNPTEFURSk7CisKKwltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09OVFJPTCwgc3RhdHVzKTsJCisJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfU1RBVFVTKTsKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCisJcmV0dXJuIHN0YXR1czsJCit9CisKKworLyoqCisgKiAJc2lzOTAwX3NldF9jYXBhYmlsaXR5IC0gc2V0IHRoZSBtZWRpYSBjYXBhYmlsaXR5IG9mIG5ldHdvcmsgYWRhcHRlci4KKyAqCUBuZXRfZGV2IDogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKglAcGh5IDogZGVmYXVsdCBQSFkKKyAqCisgKglTZXQgdGhlIG1lZGlhIGNhcGFiaWxpdHkgb2YgbmV0d29yayBhZGFwdGVyIGFjY29yZGluZyB0bworICoJbWlpIHN0YXR1cyByZWdpc3Rlci4gSXQncyBuZWNlc3NhcnkgYmVmb3JlIGF1dG8tbmVnb3RpYXRlLgorICovCisgCitzdGF0aWMgdm9pZCBzaXM5MDBfc2V0X2NhcGFiaWxpdHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IGNhcDsKKwl1MTYgc3RhdHVzOworCQorCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJCisJY2FwID0gTUlJX05XQVlfQ1NNQV9DRCB8CisJCSgocGh5LT5zdGF0dXMgJiBNSUlfU1RBVF9DQU5fVFhfRkRYKT8gTUlJX05XQVlfVFhfRkRYOjApIHwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWCkgICAgPyBNSUlfTldBWV9UWDowKSB8CisJCSgocGh5LT5zdGF0dXMgJiBNSUlfU1RBVF9DQU5fVF9GRFgpID8gTUlJX05XQVlfVF9GRFg6MCl8CisJCSgocGh5LT5zdGF0dXMgJiBNSUlfU1RBVF9DQU5fVCkgICAgID8gTUlJX05XQVlfVDowKTsKKworCW1kaW9fd3JpdGUobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX0FOQURWLCBjYXApOworfQorCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKSAgaW5sKGVlX2FkZHIpCisKKy8qKgorICoJcmVhZF9lZXByb20gLSBSZWFkIFNlcmlhbCBFRVBST00KKyAqCUBpb2FkZHI6IGJhc2UgaS9vIGFkZHJlc3MKKyAqCUBsb2NhdGlvbjogdGhlIEVFUFJPTSBsb2NhdGlvbiB0byByZWFkCisgKgorICoJUmVhZCBTZXJpYWwgRUVQUk9NIHRocm91Z2ggRUVQUk9NIEFjY2VzcyBSZWdpc3Rlci4KKyAqCU5vdGUgdGhhdCBsb2NhdGlvbiBpcyBpbiB3b3JkICgxNiBiaXRzKSB1bml0CisgKi8KKworc3RhdGljIHUxNiBfX2RldmluaXQgcmVhZF9lZXByb20obG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKwl1MTYgcmV0dmFsID0gMDsKKwlsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBtZWFyOworCXUzMiByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVyZWFkOworCisJb3V0bCgwLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKwlvdXRsKEVFQ1MsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCAoOSkgYml0cyBvdXQuICovCisJZm9yIChpID0gODsgaSA+PSAwOyBpLS0pIHsKKwkJdTMyIGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRURJIHwgRUVDUyA6IEVFQ1M7CisJCW91dGwoZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCQlvdXRsKGRhdGF2YWwgfCBFRUNMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKwlvdXRsKEVFQ1MsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCisJLyogcmVhZCB0aGUgMTYtYml0cyBkYXRhIGluICovCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChFRUNTLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGwoRUVDUyB8IEVFQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZV9hZGRyKSAmIEVFRE8pID8gMSA6IDApOworCQllZXByb21fZGVsYXkoKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJb3V0bCgwLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKworCXJldHVybiAocmV0dmFsKTsKK30KKworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKKyAgIHNlcmlhbCBNRElPIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIGNvbW1hbmQgYml0cyBhbmQgZGF0YSBiaXRzIGFyZQorICAgc2VuZCBvdXQgc2VwYXJhdGVseSAqLworI2RlZmluZSBtZGlvX2RlbGF5KCkgICAgaW5sKG1kaW9fYWRkcikKKworc3RhdGljIHZvaWQgbWRpb19pZGxlKGxvbmcgbWRpb19hZGRyKQoreworCW91dGwoTURJTyB8IE1ERElSLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKwlvdXRsKE1ESU8gfCBNRERJUiB8IE1EQywgbWRpb19hZGRyKTsKK30KKworLyogU3luY3Jvbml6ZSB0aGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGJ5IHNoaWZ0aW5nIDMyIG9uZSBiaXRzIG91dC4gKi8KK3N0YXRpYyB2b2lkIG1kaW9fcmVzZXQobG9uZyBtZGlvX2FkZHIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0bChNRERJUiB8IE1ESU8sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChNRERJUiB8IE1ESU8gfCBNREMsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqCW1kaW9fcmVhZCAtIHJlYWQgTUlJIFBIWSByZWdpc3RlcgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQKKyAqCUBwaHlfaWQ6IHRoZSBwaHkgYWRkcmVzcyB0byByZWFkCisgKglAbG9jYXRpb246IHRoZSBwaHkgcmVnaWVzdGVyIGlkIHRvIHJlYWQKKyAqCisgKglSZWFkIE1JSSByZWdpc3RlcnMgdGhyb3VnaCBNRElPIGFuZCBNREMKKyAqCXVzaW5nIE1ESU8gbWFuYWdlbWVudCBmcmFtZSBzdHJ1Y3R1cmUgYW5kIHByb3RvY29sKGRlZmluZWQgYnkgSVNPL0lFQykuCisgKglQbGVhc2Ugc2VlIFNpUzcwMTQgb3IgSUNTIHNwZWMKKyAqLworCitzdGF0aWMgdTE2IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCWxvbmcgbWRpb19hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyICsgbWVhcjsKKwlpbnQgbWlpX2NtZCA9IE1JSXJlYWR8KHBoeV9pZDw8TUlJcG1kU2hpZnQpfChsb2NhdGlvbjw8TUlJcmVnU2hpZnQpOworCXUxNiByZXR2YWwgPSAwOworCWludCBpOworCisJbWRpb19yZXNldChtZGlvX2FkZHIpOworCW1kaW9faWRsZShtZGlvX2FkZHIpOworCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRERJUiB8IE1ESU8gOiBNRERJUjsKKwkJb3V0bChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKworCS8qIFJlYWQgdGhlIDE2IGRhdGEgYml0cy4gKi8KKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRsKDAsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKG1kaW9fYWRkcikgJiBNRElPKSA/IDEgOiAwKTsKKwkJb3V0bChNREMsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJb3V0bCgweDAwLCBtZGlvX2FkZHIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgltZGlvX3dyaXRlIC0gd3JpdGUgTUlJIFBIWSByZWdpc3RlcgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHdyaXRlCisgKglAcGh5X2lkOiB0aGUgcGh5IGFkZHJlc3MgdG8gd3JpdGUKKyAqCUBsb2NhdGlvbjogdGhlIHBoeSByZWdpZXN0ZXIgaWQgdG8gd3JpdGUKKyAqCUB2YWx1ZTogdGhlIHJlZ2lzdGVyIHZhbHVlIHRvIHdyaXRlIHdpdGgKKyAqCisgKglXcml0ZSBNSUkgcmVnaXN0ZXJzIHdpdGggQHZhbHVlIHRocm91Z2ggTURJTyBhbmQgTURDCisgKgl1c2luZyBNRElPIG1hbmFnZW1lbnQgZnJhbWUgc3RydWN0dXJlIGFuZCBwcm90b2NvbChkZWZpbmVkIGJ5IElTTy9JRUMpCisgKglwbGVhc2Ugc2VlIFNpUzcwMTQgb3IgSUNTIHNwZWMKKyAqLworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsdWUpCit7CisJbG9uZyBtZGlvX2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHIgKyBtZWFyOworCWludCBtaWlfY21kID0gTUlJd3JpdGV8KHBoeV9pZDw8TUlJcG1kU2hpZnQpfChsb2NhdGlvbjw8TUlJcmVnU2hpZnQpOworCWludCBpOworCisJbWRpb19yZXNldChtZGlvX2FkZHIpOworCW1kaW9faWRsZShtZGlvX2FkZHIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRERJUiB8IE1ESU8gOiBNRERJUjsKKwkJb3V0YihkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGIoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwltZGlvX2RlbGF5KCk7CisKKwkvKiBTaGlmdCB0aGUgdmFsdWUgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHZhbHVlICYgKDEgPDwgaSkpID8gTURESVIgfCBNRElPIDogTURESVI7CisJCW91dGwoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKGRhdGF2YWwgfCBNREMsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJbWRpb19kZWxheSgpOworCisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlvdXRiKDAsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0YihNREMsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJb3V0bCgweDAwLCBtZGlvX2FkZHIpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICoJc2lzOTAwX3Jlc2V0X3BoeSAtIHJlc2V0IHNpczkwMCBtaWkgcGh5LgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHdyaXRlCisgKglAcGh5X2FkZHI6IGRlZmF1bHQgcGh5IGFkZHJlc3MKKyAqCisgKglTb21lIHNwZWNpZmljIHBoeSBjYW4ndCB3b3JrIHByb3Blcmx5IHdpdGhvdXQgcmVzZXQuCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQKKyAqCWxpbmsgc3RhdHVzIGNoYW5nZSBmcm9tIE9OIHRvIERPV04uCisgKi8KKworc3RhdGljIHUxNiBzaXM5MDBfcmVzZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJaW50IGkgPSAwOworCXUxNiBzdGF0dXM7CisKKwl3aGlsZSAoaSsrIDwgMikKKwkJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCW1kaW9fd3JpdGUoIG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgTUlJX0NOVExfUkVTRVQgKTsKKwkKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticworICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQorICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KKyovCitzdGF0aWMgdm9pZCBzaXM5MDBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzaXM5MDBfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qKgorICoJc2lzOTAwX29wZW4gLSBvcGVuIHNpczkwMCBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBvcGVuCisgKgorICoJRG8gc29tZSBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnQgbmV0IGludGVyZmFjZS4KKyAqCWVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzZXQgc2lzOTAwIHRpbWVyLgorICovCisKK3N0YXRpYyBpbnQKK3NpczkwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWludCByZXQ7CisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCXNpczkwMF9yZXNldChuZXRfZGV2KTsKKworCS8qIEVxdWFsaXplciB3b3JrYXJvdW5kIFJ1bGUgKi8KKwlzaXM2MzBfc2V0X2VxKG5ldF9kZXYsIHNpc19wcml2LT5jaGlwc2V0X3Jldik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShuZXRfZGV2LT5pcnEsICZzaXM5MDBfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCQkJCW5ldF9kZXYtPm5hbWUsIG5ldF9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzaXM5MDBfaW5pdF9yeGZpbHRlcihuZXRfZGV2KTsKKworCXNpczkwMF9pbml0X3R4X3JpbmcobmV0X2Rldik7CisJc2lzOTAwX2luaXRfcnhfcmluZyhuZXRfZGV2KTsKKworCXNldF9yeF9tb2RlKG5ldF9kZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBFREIgKi8KKwlzaXM5MDBfc2V0X21vZGUoaW9hZGRyLCBIV19TUEVFRF8xMF9NQlBTLCBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEKTsKKworCS8qIEVuYWJsZSBhbGwga25vd24gaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKChSeFNPVlJ8UnhPUk58UnhFUlJ8UnhPS3xUeFVSTnxUeEVSUnxUeElETEUpLCBpb2FkZHIgKyBpbXIpOworCW91dGwoUnhFTkEgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisJb3V0bChJRSwgaW9hZGRyICsgaWVyKTsKKworCXNpczkwMF9jaGVja19tb2RlKG5ldF9kZXYsIHNpc19wcml2LT5taWkpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBzd2l0Y2ggdG8gY2hlY2sgZm9yIGxpbmsgYmVhdCBhbmQgcGVyaGFwcyBzd2l0Y2gKKwkgICB0byBhbiBhbHRlcm5hdGUgbWVkaWEgdHlwZS4gKi8KKwlpbml0X3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCXNpc19wcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCXNpc19wcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbmV0X2RldjsKKwlzaXNfcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmc2lzOTAwX3RpbWVyOworCWFkZF90aW1lcigmc2lzX3ByaXYtPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9pbml0X3J4ZmlsdGVyIC0gSW5pdGlhbGl6ZSB0aGUgUnggZmlsdGVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gaW5pdGlhbGl6ZSBmb3IKKyAqCisgKglTZXQgcmVjZWl2ZSBmaWx0ZXIgYWRkcmVzcyB0byBvdXIgTUFDIGFkZHJlc3MKKyAqCWFuZCBlbmFibGUgcGFja2V0IGZpbHRlcmluZy4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2luaXRfcnhmaWx0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1MzIgcmZjclNhdmU7CisJdTMyIGk7CisKKwlyZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworCS8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKwlvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisJLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworCQl1MzIgdzsKKworCQl3ID0gKHUzMikgKigodTE2ICopKG5ldF9kZXYtPmRldl9hZGRyKStpKTsKKwkJb3V0bCgoaSA8PCBSRkFERFJfc2hpZnQpLCBpb2FkZHIgKyByZmNyKTsKKwkJb3V0bCh3LCBpb2FkZHIgKyByZmRyKTsKKworCQlpZiAobmV0aWZfbXNnX2h3KHNpc19wcml2KSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIEZpbHRlciBBZGRyc3NbJWRdPSV4XG4iLAorCQkJICAgICAgIG5ldF9kZXYtPm5hbWUsIGksIGlubChpb2FkZHIgKyByZmRyKSk7CisJCX0KKwl9CisKKwkvKiBlbmFibGUgcGFja2V0IGZpbHRlcmluZyAqLworCW91dGwocmZjclNhdmUgfCBSRkVOLCByZmNyICsgaW9hZGRyKTsKK30KKworLyoqCisgKglzaXM5MDBfaW5pdF90eF9yaW5nIC0gSW5pdGlhbGl6ZSB0aGUgVHggZGVzY3JpcHRvciByaW5nCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gaW5pdGlhbGl6ZSBmb3IKKyAqCisgKglJbml0aWFsaXplIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmcsIAorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaW5pdF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWludCBpOworCisJc2lzX3ByaXYtPnR4X2Z1bGwgPSAwOworCXNpc19wcml2LT5kaXJ0eV90eCA9IHNpc19wcml2LT5jdXJfdHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspIHsKKwkJc2lzX3ByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisKKwkJc2lzX3ByaXYtPnR4X3JpbmdbaV0ubGluayA9IHNpc19wcml2LT50eF9yaW5nX2RtYSArCisJCQkoKGkrMSklTlVNX1RYX0RFU0MpKnNpemVvZihCdWZmZXJEZXNjKTsKKwkJc2lzX3ByaXYtPnR4X3JpbmdbaV0uY21kc3RzID0gMDsKKwkJc2lzX3ByaXYtPnR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwl9CisKKwkvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKwlvdXRsKHNpc19wcml2LT50eF9yaW5nX2RtYSwgaW9hZGRyICsgdHhkcCk7CisJaWYgKG5ldGlmX21zZ19odyhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJTguOHhcbiIsCisJCSAgICAgICBuZXRfZGV2LT5uYW1lLCBpbmwoaW9hZGRyICsgdHhkcCkpOworfQorCisvKioKKyAqCXNpczkwMF9pbml0X3J4X3JpbmcgLSBJbml0aWFsaXplIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmcKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBpbml0aWFsaXplIGZvcgorICoKKyAqCUluaXRpYWxpemUgdGhlIFJ4IGRlc2NyaXB0b3IgcmluZywgCisgKglhbmQgcHJlLWFsbG9jYXRlIHJlY2V2aWUgYnVmZmVycyAoc29ja2V0IGJ1ZmZlcikKKyAqLworCitzdGF0aWMgdm9pZCAKK3NpczkwMF9pbml0X3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlzaXNfcHJpdi0+Y3VyX3J4ID0gMDsKKwlzaXNfcHJpdi0+ZGlydHlfcnggPSAwOworCisJLyogaW5pdCBSWCBkZXNjcmlwdG9yICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKwkJc2lzX3ByaXYtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisKKwkJc2lzX3ByaXYtPnJ4X3JpbmdbaV0ubGluayA9IHNpc19wcml2LT5yeF9yaW5nX2RtYSArCisJCQkoKGkrMSklTlVNX1JYX0RFU0MpKnNpemVvZihCdWZmZXJEZXNjKTsKKwkJc2lzX3ByaXYtPnJ4X3JpbmdbaV0uY21kc3RzID0gMDsKKwkJc2lzX3ByaXYtPnJ4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBzb2NrIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZfU0laRSkpID09IE5VTEwpIHsKKwkJCS8qIG5vdCBlbm91Z2ggbWVtb3J5IGZvciBza2J1ZmYsIHRoaXMgbWFrZXMgYSAiaG9sZSIKKwkJCSAgIG9uIHRoZSBidWZmZXIgcmluZywgaXQgaXMgbm90IGNsZWFyIGhvdyB0aGUKKwkJCSAgIGhhcmR3YXJlIHdpbGwgcmVhY3QgdG8gdGhpcyBraW5kIG9mIGRlZ2VuZXJhdGVkCisJCQkgICBidWZmZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCXNrYi0+ZGV2ID0gbmV0X2RldjsKKwkJc2lzX3ByaXYtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJc2lzX3ByaXYtPnJ4X3JpbmdbaV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CisgICAgICAgICAgICAgICAgc2lzX3ByaXYtPnJ4X3JpbmdbaV0uYnVmcHRyID0gcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnRhaWwsIFJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKwlzaXNfcHJpdi0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KSAoaSAtIE5VTV9SWF9ERVNDKTsKKworCS8qIGxvYWQgUmVjZWl2ZSBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisJb3V0bChzaXNfcHJpdi0+cnhfcmluZ19kbWEsIGlvYWRkciArIHJ4ZHApOworCWlmIChuZXRpZl9tc2dfaHcoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICU4Ljh4XG4iLAorCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgaW5sKGlvYWRkciArIHJ4ZHApKTsKK30KKworLyoqCisgKglzaXM2MzBfc2V0X2VxIC0gc2V0IHBoeSBlcXVhbGl6ZXIgdmFsdWUgZm9yIDYzMCBMQU4KKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBzZXQgZXF1YWxpemVyIHZhbHVlCisgKglAcmV2aXNpb246IDYzMCBMQU4gcmV2aXNpb24gbnVtYmVyCisgKgorICoJNjMwRSBlcXVhbGl6ZXIgd29ya2Fyb3VuZCBydWxlKEN5cnVzIEh1YW5nIDA4LzE1KQorICoJUEhZIHJlZ2lzdGVyIDE0aChUZXN0KQorICoJQml0IDE0OiAwIC0tIEF1dG9tYXRpY2FsbHkgZGVjdGVjdCAoZGVmYXVsdCkKKyAqCQkxIC0tIE1hbnVhbGx5IHNldCBFcXVhbGl6ZXIgZmlsdGVyCisgKglCaXQgMTM6IDAgLS0gKERlZmF1bHQpCisgKgkJMSAtLSBTcGVlZCB1cCBjb252ZXJnZW5jZSBvZiBlcXVhbGl6ZXIgc2V0dGluZworICoJQml0IDkgOiAwIC0tIChEZWZhdWx0KQorICoJCTEgLS0gRGlzYWJsZSBCYXNlbGluZSBXYW5kZXIKKyAqCUJpdCAzfjcgICAtLSBFcXVhbGl6ZXIgZmlsdGVyIHNldHRpbmcKKyAqCUxpbmsgT046IFNldCBCaXQgOSwgMTMgdG8gMSwgQml0IDE0IHRvIDAKKyAqCVRoZW4gY2FsY3VsYXRlIGVxdWFsaXplciB2YWx1ZQorICoJVGhlbiBzZXQgZXF1YWxpemVyIHZhbHVlLCBhbmQgc2V0IEJpdCAxNCB0byAxLCBCaXQgOSB0byAwCisgKglMaW5rIE9mZjpTZXQgQml0IDEzIHRvIDEsIEJpdCAxNCB0byAwCisgKglDYWxjdWxhdGUgRXF1YWxpemVyIHZhbHVlOgorICoJV2hlbiBMaW5rIGlzIE9OIGFuZCBCaXQgMTQgaXMgMCwgU0lTOTAwUEhZIHdpbGwgYXV0by1kZWN0ZWN0IHByb3BlciBlcXVhbGl6ZXIgdmFsdWUuCisgKglXaGVuIHRoZSBlcXVhbGl6ZXIgaXMgc3RhYmxlLCB0aGlzIHZhbHVlIGlzIG5vdCBhIGZpeGVkIHZhbHVlLiBJdCB3aWxsIGJlIHdpdGhpbgorICoJYSBzbWFsbCByYW5nZShlZy4gN345KS4gVGhlbiB3ZSBnZXQgYSBtaW5pbXVtIGFuZCBhIG1heGltdW0gdmFsdWUoZWcuIG1pbj03LCBtYXg9OSkKKyAqCTAgPD0gbWF4IDw9IDQgIC0tPiBzZXQgZXF1YWxpemVyIHRvIG1heAorICoJNSA8PSBtYXggPD0gMTQgLS0+IHNldCBlcXVhbGl6ZXIgdG8gbWF4KzEgb3Igc2V0IGVxdWFsaXplciB0byBtYXgrMiBpZiBtYXggPT0gbWluCisgKgltYXggPj0gMTUgICAgICAtLT4gc2V0IGVxdWFsaXplciB0byBtYXgrNSBvciBzZXQgZXF1YWxpemVyIHRvIG1heCs2IGlmIG1heCA9PSBtaW4KKyAqLworCitzdGF0aWMgdm9pZCBzaXM2MzBfc2V0X2VxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1OCByZXZpc2lvbikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwl1MTYgcmVnMTRoLCBlcV92YWx1ZT0wLCBtYXhfdmFsdWU9MCwgbWluX3ZhbHVlPTA7CisJaW50IGksIG1heGNvdW50PTEwOworCisJaWYgKCAhKHJldmlzaW9uID09IFNJUzYzMEVfOTAwX1JFViB8fCByZXZpc2lvbiA9PSBTSVM2MzBFQTFfOTAwX1JFViB8fAorCSAgICAgICByZXZpc2lvbiA9PSBTSVM2MzBBXzkwMF9SRVYgfHwgcmV2aXNpb24gPT0gIFNJUzYzMEVUXzkwMF9SRVYpICkKKwkJcmV0dXJuOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0X2RldikpIHsKKwkJcmVnMTRoID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTVik7CisJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWLAorCQkJCQkoMHgyMjAwIHwgcmVnMTRoKSAmIDB4QkZGRik7CisJCWZvciAoaT0wOyBpIDwgbWF4Y291bnQ7IGkrKykgeworCQkJZXFfdmFsdWUgPSAoMHgwMEY4ICYgbWRpb19yZWFkKG5ldF9kZXYsCisJCQkJCXNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTVikpID4+IDM7CisJCQlpZiAoaSA9PSAwKQorCQkJCW1heF92YWx1ZT1taW5fdmFsdWU9ZXFfdmFsdWU7CisJCQltYXhfdmFsdWUgPSAoZXFfdmFsdWUgPiBtYXhfdmFsdWUpID8KKwkJCQkJCWVxX3ZhbHVlIDogbWF4X3ZhbHVlOworCQkJbWluX3ZhbHVlID0gKGVxX3ZhbHVlIDwgbWluX3ZhbHVlKSA/CisJCQkJCQllcV92YWx1ZSA6IG1pbl92YWx1ZTsKKwkJfQorCQkvKiA2MzBFIHJ1bGUgdG8gZGV0ZXJtaW5lIHRoZSBlcXVhbGl6ZXIgdmFsdWUgKi8KKwkJaWYgKHJldmlzaW9uID09IFNJUzYzMEVfOTAwX1JFViB8fCByZXZpc2lvbiA9PSBTSVM2MzBFQTFfOTAwX1JFViB8fAorCQkgICAgcmV2aXNpb24gPT0gU0lTNjMwRVRfOTAwX1JFVikgeworCQkJaWYgKG1heF92YWx1ZSA8IDUpCisJCQkJZXFfdmFsdWUgPSBtYXhfdmFsdWU7CisJCQllbHNlIGlmIChtYXhfdmFsdWUgPj0gNSAmJiBtYXhfdmFsdWUgPCAxNSkKKwkJCQllcV92YWx1ZSA9IChtYXhfdmFsdWUgPT0gbWluX3ZhbHVlKSA/CisJCQkJCQltYXhfdmFsdWUrMiA6IG1heF92YWx1ZSsxOworCQkJZWxzZSBpZiAobWF4X3ZhbHVlID49IDE1KQorCQkJCWVxX3ZhbHVlPShtYXhfdmFsdWUgPT0gbWluX3ZhbHVlKSA/CisJCQkJCQltYXhfdmFsdWUrNiA6IG1heF92YWx1ZSs1OworCQl9CisJCS8qIDYzMEIwJkIxIHJ1bGUgdG8gZGV0ZXJtaW5lIHRoZSBlcXVhbGl6ZXIgdmFsdWUgKi8KKwkJaWYgKHJldmlzaW9uID09IFNJUzYzMEFfOTAwX1JFViAmJiAKKwkJICAgIChzaXNfcHJpdi0+aG9zdF9icmlkZ2VfcmV2ID09IFNJUzYzMEIwIHx8IAorCQkgICAgIHNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYgPT0gU0lTNjMwQjEpKSB7CisJCQlpZiAobWF4X3ZhbHVlID09IDApCisJCQkJZXFfdmFsdWUgPSAzOworCQkJZWxzZQorCQkJCWVxX3ZhbHVlID0gKG1heF92YWx1ZSArIG1pbl92YWx1ZSArIDEpLzI7CisJCX0KKwkJLyogd3JpdGUgZXF1YWxpemVyIHZhbHVlIGFuZCBzZXR0aW5nICovCisJCXJlZzE0aCA9IG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1JFU1YpOworCQlyZWcxNGggPSAocmVnMTRoICYgMHhGRjA3KSB8ICgoZXFfdmFsdWUgPDwgMykgJiAweDAwRjgpOworCQlyZWcxNGggPSAocmVnMTRoIHwgMHg2MDAwKSAmIDB4RkRGRjsKKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1JFU1YsIHJlZzE0aCk7CisJfSBlbHNlIHsKKwkJcmVnMTRoID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTVik7CisJCWlmIChyZXZpc2lvbiA9PSBTSVM2MzBBXzkwMF9SRVYgJiYgCisJCSAgICAoc2lzX3ByaXYtPmhvc3RfYnJpZGdlX3JldiA9PSBTSVM2MzBCMCB8fCAKKwkJICAgICBzaXNfcHJpdi0+aG9zdF9icmlkZ2VfcmV2ID09IFNJUzYzMEIxKSkgCisJCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTViwKKwkJCQkJCShyZWcxNGggfCAweDIyMDApICYgMHhCRkZGKTsKKwkJZWxzZQorCQkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1JFU1YsCisJCQkJCQkocmVnMTRoIHwgMHgyMDAwKSAmIDB4QkZGRik7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKglzaXM5MDBfdGltZXIgLSBzaXM5MDAgdGltZXIgcm91dGluZQorICoJQGRhdGE6IHBvaW50ZXIgdG8gc2lzOTAwIG5ldCBkZXZpY2UKKyAqCisgKglPbiBlYWNoIHRpbWVyIHRpY2tzIHdlIGNoZWNrIHR3byB0aGluZ3MsIAorICoJbGluayBzdGF0dXMgKE9OL09GRikgYW5kIGxpbmsgbW9kZSAoMTAvMTAwL0Z1bGwvSGFsZikKKyAqLworCitzdGF0aWMgdm9pZCBzaXM5MDBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX3BoeSAqbWlpX3BoeSA9IHNpc19wcml2LT5taWk7CisJc3RhdGljIGludCBuZXh0X3RpY2sgPSA1KkhaOworCXUxNiBzdGF0dXM7CisKKwlpZiAoIXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUpeworCQlpbnQgc3BlZWQsIGR1cGxleCA9IDA7CisKKwkJc2lzOTAwX3JlYWRfbW9kZShuZXRfZGV2LCAmc3BlZWQsICZkdXBsZXgpOworCQlpZiAoZHVwbGV4KXsKKwkJCXNpczkwMF9zZXRfbW9kZShuZXRfZGV2LT5iYXNlX2FkZHIsIHNwZWVkLCBkdXBsZXgpOworCQkJc2lzNjMwX3NldF9lcShuZXRfZGV2LCBzaXNfcHJpdi0+Y2hpcHNldF9yZXYpOworCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJCX0KKworCQlzaXNfcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfU1RBVFVTKTsKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCisJLyogTGluayBPRkYgLT4gT04gKi8KKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0X2RldikpIHsKKwlMb29rRm9yTGluazoKKwkJLyogU2VhcmNoIGZvciBuZXcgUEhZICovCisJCXN0YXR1cyA9IHNpczkwMF9kZWZhdWx0X3BoeShuZXRfZGV2KTsKKwkJbWlpX3BoeSA9IHNpc19wcml2LT5taWk7CisKKwkJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspeworCQkJc2lzOTAwX2NoZWNrX21vZGUobmV0X2RldiwgbWlpX3BoeSk7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCQl9CisJfSBlbHNlIHsKKwkvKiBMaW5rIE9OIC0+IE9GRiAqLworICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspKXsKKyAgICAgICAgICAgICAgICAJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCQlpZihuZXRpZl9tc2dfbGluayhzaXNfcHJpdikpCisgICAgICAgICAgICAgICAgCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgTGluayBPZmZcbiIsIG5ldF9kZXYtPm5hbWUpOworCisgICAgICAgICAgICAgICAgCS8qIENoYW5nZSBtb2RlIGlzc3VlICovCisgICAgICAgICAgICAgICAgCWlmICgobWlpX3BoeS0+cGh5X2lkMCA9PSAweDAwMUQpICYmIAorCQkJICAgICgobWlpX3BoeS0+cGh5X2lkMSAmIDB4RkZGMCkgPT0gMHg4MDAwKSkKKyAgICAgICAgICAgICAgIAkJCXNpczkwMF9yZXNldF9waHkobmV0X2RldiwgIHNpc19wcml2LT5jdXJfcGh5KTsKKyAgCisJCQlzaXM2MzBfc2V0X2VxKG5ldF9kZXYsIHNpc19wcml2LT5jaGlwc2V0X3Jldik7CisgIAorICAgICAgICAgICAgICAgIAlnb3RvIExvb2tGb3JMaW5rOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlzaXNfcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisJYWRkX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworfQorCisvKioKKyAqCXNpczkwMF9jaGVja19tb2RlIC0gY2hlY2sgdGhlIG1lZGlhIG1vZGUgZm9yIHNpczkwMAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGJlIGNoZWNrZWQKKyAqCUBtaWlfcGh5OiB0aGUgbWlpIHBoeQorICoKKyAqCU9sZGVyIGRyaXZlciBnZXRzIHRoZSBtZWRpYSBtb2RlIGZyb20gbWlpIHN0YXR1cyBvdXRwdXQKKyAqCXJlZ2lzdGVyLiBOb3cgd2Ugc2V0IG91ciBtZWRpYSBjYXBhYmlsaXR5IGFuZCBhdXRvLW5lZ290aWF0ZQorICoJdG8gZ2V0IHRoZSB1cHBlciBib3VuZCBvZiBzcGVlZCBhbmQgZHVwbGV4IGJldHdlZW4gdHdvIGVuZHMuCisgKglJZiB0aGUgdHlwZXMgb2YgbWlpIHBoeSBpcyBIT01FLCBpdCBkb2Vzbid0IG5lZWQgdG8gYXV0by1uZWdvdGlhdGUKKyAqCWFuZCBhdXRvbmdfY29tcGxldGUgc2hvdWxkIGJlIHNldCB0byAxLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9jaGVja19tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBzdHJ1Y3QgbWlpX3BoeSAqbWlpX3BoeSkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlpbnQgc3BlZWQsIGR1cGxleDsKKworCWlmIChtaWlfcGh5LT5waHlfdHlwZXMgPT0gTEFOKSB7CisJCW91dGwofkVYRCAmIGlubChpb2FkZHIgKyBjZmcpLCBpb2FkZHIgKyBjZmcpOworCQlzaXM5MDBfc2V0X2NhcGFiaWxpdHkobmV0X2RldiAsIG1paV9waHkpOworCQlzaXM5MDBfYXV0b19uZWdvdGlhdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHkpOworCX0gZWxzZSB7CisJCW91dGwoRVhEIHwgaW5sKGlvYWRkciArIGNmZyksIGlvYWRkciArIGNmZyk7CisJCXNwZWVkID0gSFdfU1BFRURfSE9NRTsKKwkJZHVwbGV4ID0gRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRDsKKwkJc2lzOTAwX3NldF9tb2RlKGlvYWRkciwgc3BlZWQsIGR1cGxleCk7CisJCXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUgPSAxOworCX0KK30KKworLyoqCisgKglzaXM5MDBfc2V0X21vZGUgLSBTZXQgdGhlIG1lZGlhIG1vZGUgb2YgbWFjIHJlZ2lzdGVyLgorICoJQGlvYWRkcjogdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZQorICoJQHNwZWVkIDogdGhlIHRyYW5zbWl0IHNwZWVkIHRvIGJlIGRldGVybWluZWQKKyAqCUBkdXBsZXg6IHRoZSBkdXBsZXggbW9kZSB0byBiZSBkZXRlcm1pbmVkCisgKgorICoJU2V0IHRoZSBtZWRpYSBtb2RlIG9mIG1hYyByZWdpc3RlciB0eGNmZy9yeGNmZyBhY2NvcmRpbmcgdG8KKyAqCXNwZWVkIGFuZCBkdXBsZXggb2YgcGh5LiBCaXQgRURCX01BU1RFUl9FTiBpbmRpY2F0ZXMgdGhlIEVEQgorICoJYnVzIGlzIHVzZWQgaW5zdGVhZCBvZiBQQ0kgYnVzLiBXaGVuIHRoaXMgYml0IGlzIHNldCAxLCB0aGUKKyAqCU1heCBETUEgQnVyc3QgU2l6ZSBmb3IgVFgvUlggRE1BIHNob3VsZCBiZSBubyBsYXJnZXIgdGhhbiAxNgorICoJZG91YmxlIHdvcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfbW9kZSAobG9uZyBpb2FkZHIsIGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwl1MzIgdHhfZmxhZ3MgPSAwLCByeF9mbGFncyA9IDA7CisKKwlpZiAoaW5sKGlvYWRkciArIGNmZykgJiBFREJfTUFTVEVSX0VOKSB7CisJCXR4X2ZsYWdzID0gVHhBVFAgfCAoRE1BX0JVUlNUXzY0IDw8IFR4TVhETUFfc2hpZnQpIHwKKwkJCQkJKFRYX0ZJTExfVEhSRVNIIDw8IFR4RklMTFRfc2hpZnQpOworCQlyeF9mbGFncyA9IERNQV9CVVJTVF82NCA8PCBSeE1YRE1BX3NoaWZ0OworCX0gZWxzZSB7CisJCXR4X2ZsYWdzID0gVHhBVFAgfCAoRE1BX0JVUlNUXzUxMiA8PCBUeE1YRE1BX3NoaWZ0KSB8CisJCQkJCShUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKwkJcnhfZmxhZ3MgPSBETUFfQlVSU1RfNTEyIDw8IFJ4TVhETUFfc2hpZnQ7CisJfQorCisJaWYgKHNwZWVkID09IEhXX1NQRUVEX0hPTUUgfHwgc3BlZWQgPT0gSFdfU1BFRURfMTBfTUJQUykgeworCQlyeF9mbGFncyB8PSAoUnhEUk5UXzEwIDw8IFJ4RFJOVF9zaGlmdCk7CisJCXR4X2ZsYWdzIHw9IChUeERSTlRfMTAgPDwgVHhEUk5UX3NoaWZ0KTsKKwl9IGVsc2UgeworCQlyeF9mbGFncyB8PSAoUnhEUk5UXzEwMCA8PCBSeERSTlRfc2hpZnQpOworCQl0eF9mbGFncyB8PSAoVHhEUk5UXzEwMCA8PCBUeERSTlRfc2hpZnQpOworCX0KKworCWlmIChkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCkgeworCQl0eF9mbGFncyB8PSAoVHhDU0kgfCBUeEhCSSk7CisJCXJ4X2ZsYWdzIHw9IFJ4QVRYOworCX0KKworCW91dGwgKHR4X2ZsYWdzLCBpb2FkZHIgKyB0eGNmZyk7CisJb3V0bCAocnhfZmxhZ3MsIGlvYWRkciArIHJ4Y2ZnKTsKK30KKworLyoqCisgKglzaXM5MDBfYXV0b19uZWdvdGlhdGUgLSBTZXQgdGhlIEF1dG8tTmVnb3RpYXRpb24gRW5hYmxlL1Jlc2V0IGJpdC4KKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byByZWFkIG1vZGUgZm9yCisgKglAcGh5X2FkZHI6IG1paSBwaHkgYWRkcmVzcworICoKKyAqCUlmIHRoZSBhZGFwdGVyIGlzIGxpbmstb24sIHNldCB0aGUgYXV0by1uZWdvdGlhdGUgZW5hYmxlL3Jlc2V0IGJpdC4KKyAqCWF1dG9uZ19jb21wbGV0ZSBzaG91bGQgYmUgc2V0IHRvIDAgd2hlbiBzdGFydGluZyBhdXRvLW5lZ290aWF0aW9uLgorICoJYXV0b25nX2NvbXBsZXRlIHNob3VsZCBiZSBzZXQgdG8gMSBpZiB3ZSBkaWRuJ3Qgc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKyAqCXNpczkwMF90aW1lciB3aWxsIHdhaXQgZm9yIGxpbmsgb24gYWdhaW4gaWYgYXV0b25nX2NvbXBsZXRlID0gMC4KKyAqLworCitzdGF0aWMgdm9pZCBzaXM5MDBfYXV0b19uZWdvdGlhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfYWRkcikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlpbnQgaSA9IDA7CisJdTMyIHN0YXR1czsKKwkKKwl3aGlsZSAoaSsrIDwgMikKKwkJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCWlmICghKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspKXsKKwkJaWYobmV0aWZfbXNnX2xpbmsoc2lzX3ByaXYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIExpbmsgT2ZmXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSA9IDE7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQlyZXR1cm47CisJfQorCisJLyogKFJlKXN0YXJ0IEF1dG9OZWdvdGlhdGUgKi8KKwltZGlvX3dyaXRlKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwKKwkJICAgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPKTsKKwlzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlID0gMDsKK30KKworCisvKioKKyAqCXNpczkwMF9yZWFkX21vZGUgLSByZWFkIG1lZGlhIG1vZGUgZm9yIHNpczkwMCBpbnRlcm5hbCBwaHkKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byByZWFkIG1vZGUgZm9yCisgKglAc3BlZWQgIDogdGhlIHRyYW5zbWl0IHNwZWVkIHRvIGJlIGRldGVybWluZWQKKyAqCUBkdXBsZXggOiB0aGUgZHVwbGV4IG1vZGUgdG8gYmUgZGV0ZXJtaW5lZAorICoKKyAqCVRoZSBjYXBhYmlsaXR5IG9mIHJlbW90ZSBlbmQgd2lsbCBiZSBwdXQgaW4gbWlpIHJlZ2lzdGVyIGF1dG9yZWMKKyAqCWFmdGVyIGF1dG8tbmVnb3RpYXRpb24uIFVzZSBBTkQgb3BlcmF0aW9uIHRvIGdldCB0aGUgdXBwZXIgYm91bmQKKyAqCW9mIHNwZWVkIGFuZCBkdXBsZXggYmV0d2VlbiB0d28gZW5kcy4KKyAqLworCitzdGF0aWMgdm9pZCBzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX3BoeSAqcGh5ID0gc2lzX3ByaXYtPm1paTsKKwlpbnQgcGh5X2FkZHIgPSBzaXNfcHJpdi0+Y3VyX3BoeTsKKwl1MzIgc3RhdHVzOworCXUxNiBhdXRvYWR2LCBhdXRvcmVjOworCWludCBpID0gMDsKKworCXdoaWxlIChpKysgPCAyKQorCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKCEoc3RhdHVzICYgTUlJX1NUQVRfTElOSykpCisJCXJldHVybjsKKworCS8qIEF1dG9OZWdvdGlhdGUgY29tcGxldGVkICovCisJYXV0b2FkdiA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWKTsKKwlhdXRvcmVjID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQU5MUEFSKTsKKwlzdGF0dXMgPSBhdXRvYWR2ICYgYXV0b3JlYzsKKwkKKwkqc3BlZWQgPSBIV19TUEVFRF8xMF9NQlBTOworCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCisJaWYgKHN0YXR1cyAmIChNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCkpCisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworCWlmIChzdGF0dXMgJiAoIE1JSV9OV0FZX1RYX0ZEWCB8IE1JSV9OV0FZX1RfRkRYKSkKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJCisJc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSA9IDE7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBSZWFsdGVrIFJUTDgyMDEgUEhZIGlzc3VlICovCisJaWYgKChwaHktPnBoeV9pZDAgPT0gMHgwMDAwKSAmJiAoKHBoeS0+cGh5X2lkMSAmIDB4RkZGMCkgPT0gMHg4MjAwKSkgeworCQlpZiAobWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCkgJiBNSUlfQ05UTF9GRFgpCisJCQkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwkJaWYgKG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgMHgwMDE5KSAmIDB4MDEpCisJCQkqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKwl9CisKKwlpZihuZXRpZl9tc2dfbGluayhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZWRpYSBMaW5rIE9uICVzICVzLWR1cGxleCBcbiIsCisJICAgICAgIAkJCQluZXRfZGV2LT5uYW1lLAorCSAgICAgICAJCQkJKnNwZWVkID09IEhXX1NQRUVEXzEwMF9NQlBTID8KKwkgICAgICAgCQkJCQkiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKwkgICAgICAgCQkJCSpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisJICAgICAgIAkJCQkJImZ1bGwiIDogImhhbGYiKTsKK30KKworLyoqCisgKglzaXM5MDBfdHhfdGltZW91dCAtIHNpczkwMCB0cmFuc21pdCB0aW1lb3V0IHJvdXRpbmUKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byB0cmFuc21pdAorICoKKyAqCXByaW50IHRyYW5zbWl0IHRpbWVvdXQgc3RhdHVzCisgKglkaXNhYmxlIGludGVycnVwdHMgYW5kIGRvIHNvbWUgdGFza3MKKyAqLworCitzdGF0aWMgdm9pZCBzaXM5MDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaWYobmV0aWZfbXNnX3R4X2VycihzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lb3V0LCBzdGF0dXMgJTguOHggJTguOHggXG4iLAorCSAgICAgICAJCW5ldF9kZXYtPm5hbWUsIGlubChpb2FkZHIgKyBjciksIGlubChpb2FkZHIgKyBpc3IpKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgweDAwMDAsIGlvYWRkciArIGltcik7CisKKwkvKiB1c2Ugc3BpbmxvY2sgdG8gcHJldmVudCBpbnRlcnJ1cHQgaGFuZGxlciBhY2Nlc3NpbmcgYnVmZmVyIHJpbmcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2lzX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIGRpc2NhcmQgdW5zZW50IHBhY2tldHMgKi8KKwlzaXNfcHJpdi0+ZGlydHlfdHggPSBzaXNfcHJpdi0+Y3VyX3R4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2lzX3ByaXYtPnR4X3NrYnVmZltpXTsKKworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCAKKwkJCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5idWZwdHIsIHNrYi0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXNpc19wcml2LT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQkJc2lzX3ByaXYtPnR4X3JpbmdbaV0uY21kc3RzID0gMDsKKwkJCXNpc19wcml2LT50eF9yaW5nW2ldLmJ1ZnB0ciA9IDA7CisJCQlzaXNfcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCXNpc19wcml2LT50eF9mdWxsID0gMDsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2lzX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCW5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLworCW91dGwoc2lzX3ByaXYtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyB0eGRwKTsKKworCS8qIEVuYWJsZSBhbGwga25vd24gaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKChSeFNPVlJ8UnhPUk58UnhFUlJ8UnhPS3xUeFVSTnxUeEVSUnxUeElETEUpLCBpb2FkZHIgKyBpbXIpOworCXJldHVybjsKK30KKworLyoqCisgKglzaXM5MDBfc3RhcnRfeG1pdCAtIHNpczkwMCBzdGFydCB0cmFuc21pdCByb3V0aW5lCisgKglAc2tiOiBzb2NrZXQgYnVmZmVyIHBvaW50ZXIgdG8gcHV0IHRoZSBkYXRhIGJlaW5nIHRyYW5zbWl0dGVkCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gdHJhbnNtaXQgd2l0aAorICoKKyAqCVNldCB0aGUgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IsIAorICoJYW5kIHdyaXRlIFR4RU5BIHRvIGVuYWJsZSB0cmFuc21pdCBzdGF0ZSBtYWNoaW5lLgorICoJdGVsbCB1cHBlciBsYXllciBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwKKyAqLworCitzdGF0aWMgaW50CitzaXM5MDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgIGVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50ICBpbmRleF9jdXJfdHgsIGluZGV4X2RpcnR5X3R4OworCXVuc2lnbmVkIGludCAgY291bnRfZGlydHlfdHg7CisKKwkvKiBEb24ndCB0cmFuc21pdCBkYXRhIGJlZm9yZSB0aGUgY29tcGxldGUgb2YgYXV0by1uZWdvdGlhdGlvbiAqLworCWlmKCFzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNpc19wcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IHNpc19wcml2LT5jdXJfdHggJSBOVU1fVFhfREVTQzsKKwlzaXNfcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKworCS8qIHNldCB0aGUgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IgYW5kIGVuYWJsZSBUcmFuc21pdCBTdGF0ZSBNYWNoaW5lICovCisJc2lzX3ByaXYtPnR4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IHBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LAorCQlza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uY21kc3RzID0gKE9XTiB8IHNrYi0+bGVuKTsKKwlvdXRsKFR4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisJc2lzX3ByaXYtPmN1cl90eCArKzsKKwlpbmRleF9jdXJfdHggPSBzaXNfcHJpdi0+Y3VyX3R4OworCWluZGV4X2RpcnR5X3R4ID0gc2lzX3ByaXYtPmRpcnR5X3R4OworCisJZm9yIChjb3VudF9kaXJ0eV90eCA9IDA7IGluZGV4X2N1cl90eCAhPSBpbmRleF9kaXJ0eV90eDsgaW5kZXhfZGlydHlfdHgrKykKKwkJY291bnRfZGlydHlfdHggKys7CisKKwlpZiAoaW5kZXhfY3VyX3R4ID09IGluZGV4X2RpcnR5X3R4KSB7CisJCS8qIGRpcnR5X3R4IGlzIG1ldCBpbiB0aGUgY3ljbGUgb2YgY3VyX3R4LCBidWZmZXIgZnVsbCAqLworCQlzaXNfcHJpdi0+dHhfZnVsbCA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJfSBlbHNlIGlmIChjb3VudF9kaXJ0eV90eCA8IE5VTV9UWF9ERVNDKSB7IAorCQkvKiBUeXBpY2FsIHBhdGgsIHRlbGwgdXBwZXIgbGF5ZXIgdGhhdCBtb3JlIHRyYW5zbWlzc2lvbiBpcyBwb3NzaWJsZSAqLworCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwl9IGVsc2UgeworCQkvKiBidWZmZXIgZnVsbCwgdGVsbCB1cHBlciBsYXllciBubyBtb3JlIHRyYW5zbWlzc2lvbiAqLworCQlzaXNfcHJpdi0+dHhfZnVsbCA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2lzX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCW5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZWQgVHggcGFja2V0IGF0ICVwIHNpemUgJWQgIgorCQkgICAgICAgInRvIHNsb3QgJWQuXG4iLAorCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuLCBlbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXM5MDBfaW50ZXJydXB0IC0gc2lzOTAwIGludGVycnVwdCBoYW5kbGVyCisgKglAaXJxOiB0aGUgaXJxIG51bWJlcgorICoJQGRldl9pbnN0YW5jZTogdGhlIGNsaWVudCBkYXRhIG9iamVjdAorICoJQHJlZ3M6IHNuYXBzaG90IG9mIHByb2Nlc3NvciBjb250ZXh0CisgKgorICoJVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yaywgCisgKglhbmQgY2xlYW5zIHVwIGFmdGVyIHRoZSBUeCB0aHJlYWQKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lzOTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWludCBib2d1c2NudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1MzIgc3RhdHVzOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnNpc19wcml2LT5sb2NrKTsKKworCWRvIHsKKwkJc3RhdHVzID0gaW5sKGlvYWRkciArIGlzcik7CisKKwkJaWYgKChzdGF0dXMgJiAoSElCRVJSfFR4VVJOfFR4RVJSfFR4SURMRXxSeE9STnxSeEVSUnxSeE9LKSkgPT0gMCkKKwkJCS8qIG5vdGhpbmcgaW50cmVzdGluZyBoYXBwZW5lZCAqLworCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCisJCS8qIHdoeSBkb3cndCB3ZSBicmVhayBhZnRlciBUeC9SeCBjYXNlID8/IGtleXdvcmQ6IGZ1bGwtZHVwbGV4ICovCisJCWlmIChzdGF0dXMgJiAoUnhPUk4gfCBSeEVSUiB8IFJ4T0spKQorCQkJLyogUnggaW50ZXJydXB0ICovCisJCQlzaXM5MDBfcngobmV0X2Rldik7CisKKwkJaWYgKHN0YXR1cyAmIChUeFVSTiB8IFR4RVJSIHwgVHhJRExFKSkKKwkJCS8qIFR4IGludGVycnVwdCAqLworCQkJc2lzOTAwX2ZpbmlzaF94bWl0KG5ldF9kZXYpOworCisJCS8qIHNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbmVkICEhISAqLworCQlpZiAoc3RhdHVzICYgSElCRVJSKSB7CisJCQlpZihuZXRpZl9tc2dfaW50cihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFibm9ybWFsIGludGVycnVwdCwiCisJCQkJCSJzdGF0dXMgJSM4Ljh4LlxuIiwgbmV0X2Rldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJaWYobmV0aWZfbXNnX2ludHIoc2lzX3ByaXYpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJCQkiaW50ZXJydXB0IHN0YXR1cyA9ICUjOC44eC5cbiIsCisJCQkJCW5ldF9kZXYtPm5hbWUsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYobmV0aWZfbXNnX2ludHIoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCAiCisJCSAgICAgICAiaW50ZXJydXB0IHN0YXR1cyA9IDB4JSM4Ljh4LlxuIiwKKwkJICAgICAgIG5ldF9kZXYtPm5hbWUsIGlubChpb2FkZHIgKyBpc3IpKTsKKwkKKwlzcGluX3VubG9jayAoJnNpc19wcml2LT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoqCisgKglzaXM5MDBfcnggLSBzaXM5MDAgcmVjZWl2ZSByb3V0aW5lCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgZGF0YQorICoKKyAqCVByb2Nlc3MgcmVjZWl2ZSBpbnRlcnJ1cHQgZXZlbnRzLCAKKyAqCXB1dCBidWZmZXIgdG8gaGlnaGVyIGxheWVyIGFuZCByZWZpbGwgYnVmZmVyIHBvb2wKKyAqCU5vdGU6IFRoaXMgZnVjbnRpb24gaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyLCAKKyAqCWRvbid0IGRvICJ0b28gbXVjaCIgd29yayBoZXJlCisgKi8KKworc3RhdGljIGludCBzaXM5MDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IGVudHJ5ID0gc2lzX3ByaXYtPmN1cl9yeCAlIE5VTV9SWF9ERVNDOworCXUzMiByeF9zdGF0dXMgPSBzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzOworCisJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAic2lzOTAwX3J4LCBjdXJfcng6JTQuNGQsIGRpcnR5X3J4OiU0LjRkICIKKwkJICAgICAgICJzdGF0dXM6MHglOC44eFxuIiwKKwkJICAgICAgIHNpc19wcml2LT5jdXJfcngsIHNpc19wcml2LT5kaXJ0eV9yeCwgcnhfc3RhdHVzKTsKKworCXdoaWxlIChyeF9zdGF0dXMgJiBPV04pIHsKKwkJdW5zaWduZWQgaW50IHJ4X3NpemU7CisKKwkJcnhfc2l6ZSA9IChyeF9zdGF0dXMgJiBEU0laRSkgLSBDUkNfU0laRTsKKworCQlpZiAocnhfc3RhdHVzICYgKEFCT1JUfE9WRVJSVU58VE9PTE9OR3xSVU5UfFJYSVNFUlJ8Q1JDRVJSfEZBRVJSKSkgeworCQkJLyogY29ycnVwdGVkIHBhY2tldCByZWNlaXZlZCAqLworCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2lzX3ByaXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ29ycnVwdGVkIHBhY2tldCAiCisJCQkJICAgICAgICJyZWNlaXZlZCwgYnVmZmVyIHN0YXR1cyA9IDB4JTguOHguXG4iLAorCQkJCSAgICAgICBuZXRfZGV2LT5uYW1lLCByeF9zdGF0dXMpOworCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHJ4X3N0YXR1cyAmIE9WRVJSVU4pCisJCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYgKFRPT0xPTkd8UlVOVCkpCisJCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJiAoUlhJU0VSUiB8IEZBRVJSKSkKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYgQ1JDRVJSKSAKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJLyogcmVzZXQgYnVmZmVyIGRlc2NyaXB0b3Igc3RhdGUgKi8KKwkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICogc2tiOworCisJCQkvKiBUaGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZHVlIHRvCisJCQkgICBzb21lIHVua25vdyBidWdzLCBpdCBpcyBwb3NzaWJsZSB0aGF0CisJCQkgICB3ZSBhcmUgd29ya2luZyBvbiBOVUxMIHNrX2J1ZmYgOi0oICovCisJCQlpZiAoc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNpc19wcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5VTEwgcG9pbnRlciAiIAorCQkJCQkJImVuY291bnRlcmVkIGluIFJ4IHJpbmcsIHNraXBwaW5nXG4iLAorCQkJCQkJbmV0X2Rldi0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIsIFJYX0JVRl9TSVpFLCAKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJLyogZ2l2ZSB0aGUgc29ja2V0IGJ1ZmZlciB0byB1cHBlciBsYXllcnMgKi8KKwkJCXNrYiA9IHNpc19wcml2LT5yeF9za2J1ZmZbZW50cnldOworCQkJc2tiX3B1dChza2IsIHJ4X3NpemUpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0X2Rldik7CisJCQluZXRpZl9yeChza2IpOworCisJCQkvKiBzb21lIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCQkJaWYgKChyeF9zdGF0dXMgJiBCQ0FTVCkgPT0gTUNBU1QpCisJCQkJc2lzX3ByaXYtPnN0YXRzLm11bHRpY2FzdCsrOworCQkJbmV0X2Rldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlzaXNfcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcnhfc2l6ZTsKKwkJCXNpc19wcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkJCS8qIHJlZmlsbCB0aGUgUnggYnVmZmVyLCB3aGF0IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2h0CisJCQkgKiBtZW1vcnkgZm9yIG5ldyBzb2NrZXQgYnVmZmVyID8/ICovCisJCQlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGX1NJWkUpKSA9PSBOVUxMKSB7CisJCQkJLyogbm90IGVub3VnaCBtZW1vcnkgZm9yIHNrYnVmZiwgdGhpcyBtYWtlcyBhCisJCQkJICogImhvbGUiIG9uIHRoZSBidWZmZXIgcmluZywgaXQgaXMgbm90IGNsZWFyCisJCQkJICogaG93IHRoZSBoYXJkd2FyZSB3aWxsIHJlYWN0IHRvIHRoaXMga2luZAorCQkJCSAqIG9mIGRlZ2VuZXJhdGVkIGJ1ZmZlciAqLworCQkJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHNpc19wcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCIKKwkJCQkJCSJkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkJCW5ldF9kZXYtPm5hbWUpOworCQkJCXNpc19wcml2LT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQkvKiByZXNldCBidWZmZXIgZGVzY3JpcHRvciBzdGF0ZSAqLworCQkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSAwOworCQkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPSAwOworCQkJCXNpc19wcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IG5ldF9kZXY7CisJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICAJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IAorCQkJCXBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCBza2ItPnRhaWwsIAorCQkJCQlSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNpc19wcml2LT5kaXJ0eV9yeCsrOworCQl9CisJCXNpc19wcml2LT5jdXJfcngrKzsKKwkJZW50cnkgPSBzaXNfcHJpdi0+Y3VyX3J4ICUgTlVNX1JYX0RFU0M7CisJCXJ4X3N0YXR1cyA9IHNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHM7CisJfSAvLyB3aGlsZQorCisJLyogcmVmaWxsIHRoZSBSeCBidWZmZXIsIHdoYXQgaWYgdGhlIHJhdGUgb2YgcmVmaWxsaW5nIGlzIHNsb3dlcgorCSAqIHRoYW4gY29uc3VtaW5nID8/ICovCisJZm9yICg7c2lzX3ByaXYtPmN1cl9yeCAtIHNpc19wcml2LT5kaXJ0eV9yeCA+IDA7IHNpc19wcml2LT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJZW50cnkgPSBzaXNfcHJpdi0+ZGlydHlfcnggJSBOVU1fUlhfREVTQzsKKworCQlpZiAoc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRl9TSVpFKSkgPT0gTlVMTCkgeworCQkJCS8qIG5vdCBlbm91Z2ggbWVtb3J5IGZvciBza2J1ZmYsIHRoaXMgbWFrZXMgYQorCQkJCSAqICJob2xlIiBvbiB0aGUgYnVmZmVyIHJpbmcsIGl0IGlzIG5vdCBjbGVhcgorCQkJCSAqIGhvdyB0aGUgaGFyZHdhcmUgd2lsbCByZWFjdCB0byB0aGlzIGtpbmQKKwkJCQkgKiBvZiBkZWdlbmVyYXRlZCBidWZmZXIgKi8KKwkJCQlpZiAobmV0aWZfbXNnX3J4X2VycihzaXNfcHJpdikpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwiCisJCQkJCQkiZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJCQluZXRfZGV2LT5uYW1lKTsKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiLT5kZXYgPSBuZXRfZGV2OworCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CisgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQorCQkJCXBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCQkJCVJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisJfQorCS8qIHJlLWVuYWJsZSB0aGUgcG90ZW50aWFsbHkgaWRsZSByZWNlaXZlIHN0YXRlIG1hdGNoaW5lICovCisJb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXM5MDBfZmluaXNoX3htaXQgLSBmaW5pc2ggdXAgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBiZSB0cmFuc21pdHRlZCBvbgorICoKKyAqCUNoZWNrIGZvciBlcnJvciBjb25kaXRpb24gYW5kIGZyZWUgc29ja2V0IGJ1ZmZlciBldGMgCisgKglzY2hlZHVsZSBmb3IgbW9yZSB0cmFuc21pc3Npb24gYXMgbmVlZGVkCisgKglOb3RlOiBUaGlzIGZ1Y250aW9uIGlzIGNhbGxlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciwgCisgKglkb24ndCBkbyAidG9vIG11Y2giIHdvcmsgaGVyZQorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9maW5pc2hfeG1pdCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisKKwlmb3IgKDsgc2lzX3ByaXYtPmRpcnR5X3R4ICE9IHNpc19wcml2LT5jdXJfdHg7IHNpc19wcml2LT5kaXJ0eV90eCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGludCBlbnRyeTsKKwkJdTMyIHR4X3N0YXR1czsKKworCQllbnRyeSA9IHNpc19wcml2LT5kaXJ0eV90eCAlIE5VTV9UWF9ERVNDOworCQl0eF9zdGF0dXMgPSBzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uY21kc3RzOworCisJCWlmICh0eF9zdGF0dXMgJiBPV04pIHsKKwkJCS8qIFRoZSBwYWNrZXQgaXMgbm90IHRyYW5zbWl0dGVkIHlldCAob3duZWQgYnkgaGFyZHdhcmUpICEKKwkJCSAqIE5vdGU6IHRoZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIG9ubHkgd2hlbiBUeCBNYWNoaW5lCisJCQkgKiBpcyBpZGxlLCBzbyB0aGlzIGlzIGFuIGFsbW9zdCBpbXBvc3NpYmxlIGNhc2UgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHR4X3N0YXR1cyAmIChBQk9SVCB8IFVOREVSUlVOIHwgT1dDT0xMKSkgeworCQkJLyogcGFja2V0IHVuc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkICovCisJCQlpZiAobmV0aWZfbXNnX3R4X2VycihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCAiCisJCQkJICAgICAgICJlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkJCXNpc19wcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBVTkRFUlJVTikKKwkJCQlzaXNfcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBBQk9SVCkKKwkJCQlzaXNfcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBOT0NBUlJJRVIpCisJCQkJc2lzX3ByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgT1dDT0xMKQorCQkJCXNpc19wcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQkvKiBwYWNrZXQgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkICovCisJCQlzaXNfcHJpdi0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhfc3RhdHVzICYgQ09MQ05UKSA+PiAxNjsKKwkJCXNpc19wcml2LT5zdGF0cy50eF9ieXRlcyArPSB0eF9zdGF0dXMgJiBEU0laRTsKKwkJCXNpc19wcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlza2IgPSBzaXNfcHJpdi0+dHhfc2tidWZmW2VudHJ5XTsKKwkJcGNpX3VubWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwgCisJCQlzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uYnVmcHRyLCBza2ItPmxlbiwKKwkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlzaXNfcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5idWZwdHIgPSAwOworCQlzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uY21kc3RzID0gMDsKKwl9CisKKwlpZiAoc2lzX3ByaXYtPnR4X2Z1bGwgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRfZGV2KSAmJgorCSAgICBzaXNfcHJpdi0+Y3VyX3R4IC0gc2lzX3ByaXYtPmRpcnR5X3R4IDwgTlVNX1RYX0RFU0MgLSA0KSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0eF9mdWxsIGFuZCBzY2hlZHVsZQorCQkgKiBtb3JlIHRyYW5zbWlzc2lvbiBieSBuZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpICovCisJCXNpc19wcml2LT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAobmV0X2Rldik7CisJfQorfQorCisvKioKKyAqCXNpczkwMF9jbG9zZSAtIGNsb3NlIHNpczkwMCBkZXZpY2UgCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gYmUgY2xvc2VkCisgKgorICoJRGlzYWJsZSBpbnRlcnJ1cHRzLCBzdG9wIHRoZSBUeCBhbmQgUnggU3RhdHVzIE1hY2hpbmUgCisgKglmcmVlIFR4IGFuZCBSWCBzb2NrZXQgYnVmZmVyCisgKi8KKworc3RhdGljIGludCBzaXM5MDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoMHgwMDAwLCBpb2FkZHIgKyBpbXIpOworCW91dGwoMHgwMDAwLCBpb2FkZHIgKyBpZXIpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBTdGF0dXMgTWFjaGluZSAqLworCW91dGwoUnhESVMgfCBUeERJUyB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKworCWRlbF90aW1lcigmc2lzX3ByaXYtPnRpbWVyKTsKKworCWZyZWVfaXJxKG5ldF9kZXYtPmlycSwgbmV0X2Rldik7CisKKwkvKiBGcmVlIFR4IGFuZCBSWCBza2J1ZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlza2IgPSBzaXNfcHJpdi0+cnhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCAKKwkJCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIsCisJCQkJUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQlza2IgPSBzaXNfcHJpdi0+dHhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCAKKwkJCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5idWZwdHIsIHNrYi0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2lzX3ByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBHcmVlbiEgUHV0IHRoZSBjaGlwIGluIGxvdy1wb3dlciBtb2RlLiAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX2dldF9kcnZpbmZvIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlcgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHByb2JlCisgKglAaW5mbzogY29udGFpbmVyIGZvciBpbmZvIHJldHVybmVkCisgKgorICoJUHJvY2VzcyBldGh0b29sIGNvbW1hbmQgc3VjaCBhcyAiZWh0b29sIC1pIiB0byBzaG93IGluZm9ybWF0aW9uCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNpczkwMF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworIAlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBTSVM5MDBfTU9EVUxFX05BTUUpOworCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgU0lTOTAwX0RSVl9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShzaXNfcHJpdi0+cGNpX2RldikpOworfQorCitzdGF0aWMgdTMyIHNpczkwMF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJcmV0dXJuIHNpc19wcml2LT5tc2dfZW5hYmxlOworfQorICAKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzaXNfcHJpdi0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNpczkwMF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gCT0gc2lzOTAwX2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJPSBzaXM5MDBfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSBzaXM5MDBfc2V0X21zZ2xldmVsLAorfTsKKworLyoqCisgKgltaWlfaW9jdGwgLSBwcm9jZXNzIE1JSSBpL28gY29udHJvbCBjb21tYW5kIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGNvbW1hbmQgZm9yCisgKglAcnE6IHBhcmFtZXRlciBmb3IgY29tbWFuZAorICoJQGNtZDogdGhlIGkvbyBjb21tYW5kCisgKgorICoJUHJvY2VzcyBNSUkgY29tbWFuZCBsaWtlIHJlYWQvd3JpdGUgTUlJIHJlZ2lzdGVyCisgKi8KKworc3RhdGljIGludCBtaWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWRhdGEtPnBoeV9pZCA9IHNpc19wcml2LT5taWktPnBoeV9hZGRyOworCQkvKiBGYWxsIFRocm91Z2ggKi8KKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWRhdGEtPnZhbF9vdXQgPSBtZGlvX3JlYWQobmV0X2RldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKioKKyAqCXNpczkwMF9nZXRfc3RhdHMgLSBHZXQgc2lzOTAwIHJlYWQvd3JpdGUgc3RhdGlzdGljcyAKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgc3RhdGlzdGljcyBmb3IKKyAqCisgKglnZXQgdHgvcnggc3RhdGlzdGljcyBmb3Igc2lzOTAwCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3NpczkwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisKKwlyZXR1cm4gJnNpc19wcml2LT5zdGF0czsKK30KKworLyoqCisgKglzaXM5MDBfc2V0X2NvbmZpZyAtIFNldCBtZWRpYSB0eXBlIGJ5IG5ldF9kZXZpY2Uuc2V0X2NvbmZpZyAKKyAqCUBkZXY6IHRoZSBuZXQgZGV2aWNlIGZvciBtZWRpYSB0eXBlIGNoYW5nZQorICoJQG1hcDogaWZtYXAgcGFzc2VkIGJ5IGlmY29uZmlnCisgKgorICoJU2V0IG1lZGlhIHR5cGUgdG8gMTBiYXNlVCwgMTAwYmFzZVQgb3IgMChmb3IgYXV0bykgYnkgaWZjb25maWcKKyAqCXdlIHN1cHBvcnQgb25seSBwb3J0IGNoYW5nZXMuIEFsbCBvdGhlciBydW50aW1lIGNvbmZpZ3VyYXRpb24KKyAqCWNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkCisgKi8KKworc3RhdGljIGludCBzaXM5MDBfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sgICAgCisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX3BoeSAqbWlpX3BoeSA9IHNpc19wcml2LT5taWk7CisgICAgICAgIAorCXUxNiBzdGF0dXM7CisKKwlpZiAoKG1hcC0+cG9ydCAhPSAodV9jaGFyKSgtMSkpICYmIChtYXAtPnBvcnQgIT0gZGV2LT5pZl9wb3J0KSkgeworCQkvKiB3ZSBzd2l0Y2ggb24gdGhlIGlmbWFwLT5wb3J0IGZpZWxkLiBJIGNvdWxkbid0IGZpbmQgYW55dGhpbmcKKwkJICogbGlrZSBhIGRlZmluaXRpb24gb3Igc3RhbmRhcmQgZm9yIHRoZSB2YWx1ZXMgb2YgdGhhdCBmaWVsZC4KKwkJICogSSB0aGluayB0aGUgbWVhbmluZyBvZiB0aG9zZSB2YWx1ZXMgaXMgZGV2aWNlIHNwZWNpZmljLiBCdXQKKwkJICogc2luY2UgSSB3b3VsZCBsaWtlIHRvIGNoYW5nZSB0aGUgbWVkaWEgdHlwZSB2aWEgdGhlIGlmY29uZmlnCisJCSAqIGNvbW1hbmQgSSB1c2UgdGhlIGRlZmluaXRpb24gZnJvbSBsaW51eC9uZXRkZXZpY2UuaCAKKwkJICogKHdoaWNoIHNlZW1zIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBpZnBvcnQocGNtY2lhKSBkZWZpbml0aW9uKSAqLworCQlzd2l0Y2gobWFwLT5wb3J0KXsKKwkJY2FzZSBJRl9QT1JUX1VOS05PV046IC8qIHVzZSBhdXRvIGhlcmUgKi8gICAKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkJCS8qIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIG1lZGlhIHR5cGUsIHNvIHRoZSBMaW5rCisJCQkgKiB3aWxsIGJlIHRlbXBvcmFyeSBkb3duIGFuZCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhhdAorCQkJICogaGVyZS4gV2hlbiB0aGUgTGluayBjb21lcyB1cCBhZ2FpbiwgaXQgd2lsbCBiZQorCQkJICogc2Vuc2VkIGJ5IHRoZSBzaXNfdGltZXIgcHJvY2VkdXJlLCB3aGljaCBhbHNvIGRvZXMKKwkJCSAqIGFsbCB0aGUgcmVzdCBmb3IgdXMgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgICAgICAgICAgCisJCQkvKiByZWFkIGN1cnJlbnQgc3RhdGUgKi8KKwkJCXN0YXR1cyA9IG1kaW9fcmVhZChkZXYsIG1paV9waHktPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisgICAgICAgICAgICAgICAgCisJCQkvKiBlbmFibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgcmVzZXQgdGhlIG5lZ290aW9hdGlvbgorCQkJICogKEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGUgYXV0byBuZWdhdGlvdGlhdGlvbgorCQkJICogcmVzZXQgcmVhbGx5IG1lYW5zLCBidXQgaXQgc291bmRzIGZvciBtZSByaWdodCB0bworCQkJICogZG8gb25lIGhlcmUpICovCisJCQltZGlvX3dyaXRlKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsCisJCQkJICAgTUlJX0NPTlRST0wsIHN0YXR1cyB8IE1JSV9DTlRMX0FVVE8gfCBNSUlfQ05UTF9SU1RfQVVUTyk7CisKKwkJCWJyZWFrOworICAgICAgICAgICAgCisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOiAvKiAxMEJhc2VUICovICAgICAgICAgCisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisgICAgICAgICAgICAgICAgCisJCQkvKiB3ZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZSBtZWRpYSB0eXBlLCBzbyB0aGUgTGluaworCQkJICogd2lsbCBiZSB0ZW1wb3JhcnkgZG93biBhbmQgd2UgbmVlZCB0byByZWZsZWN0IHRoYXQKKwkJCSAqIGhlcmUuIFdoZW4gdGhlIExpbmsgY29tZXMgdXAgYWdhaW4sIGl0IHdpbGwgYmUKKwkJCSAqIHNlbnNlZCBieSB0aGUgc2lzX3RpbWVyIHByb2NlZHVyZSwgd2hpY2ggYWxzbyBkb2VzCisJCQkgKiBhbGwgdGhlIHJlc3QgZm9yIHVzICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICAKKwkJCS8qIHNldCBTcGVlZCB0byAxME1icHMgKi8KKwkJCS8qIHJlYWQgY3VycmVudCBzdGF0ZSAqLworCQkJc3RhdHVzID0gbWRpb19yZWFkKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIGRpc2FibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgZm9yY2UgMTBNQml0IG1vZGUqLworCQkJbWRpb193cml0ZShkZXYsIG1paV9waHktPnBoeV9hZGRyLAorCQkJCSAgIE1JSV9DT05UUk9MLCBzdGF0dXMgJiB+KE1JSV9DTlRMX1NQRUVEIHwKKwkJCQkJTUlJX0NOVExfQVVUTykpOworCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUOiAvKiAxMDBCYXNlVCAqLworCQljYXNlIElGX1BPUlRfMTAwQkFTRVRYOiAvKiAxMDBCYXNlVHggKi8gCisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisgICAgICAgICAgICAgICAgCisJCQkvKiB3ZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZSBtZWRpYSB0eXBlLCBzbyB0aGUgTGluaworCQkJICogd2lsbCBiZSB0ZW1wb3JhcnkgZG93biBhbmQgd2UgbmVlZCB0byByZWZsZWN0IHRoYXQKKwkJCSAqIGhlcmUuIFdoZW4gdGhlIExpbmsgY29tZXMgdXAgYWdhaW4sIGl0IHdpbGwgYmUKKwkJCSAqIHNlbnNlZCBieSB0aGUgc2lzX3RpbWVyIHByb2NlZHVyZSwgd2hpY2ggYWxzbyBkb2VzCisJCQkgKiBhbGwgdGhlIHJlc3QgZm9yIHVzICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICAgICAgICAgIAorCQkJLyogc2V0IFNwZWVkIHRvIDEwME1icHMgKi8KKwkJCS8qIGRpc2FibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgZW5hYmxlIDEwME1CaXQgTW9kZSAqLworCQkJc3RhdHVzID0gbWRpb19yZWFkKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCW1kaW9fd3JpdGUoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwKKwkJCQkgICBNSUlfQ09OVFJPTCwgKHN0YXR1cyAmIH5NSUlfQ05UTF9TUEVFRCkgfAorCQkJCSAgIE1JSV9DTlRMX1NQRUVEKTsKKyAgICAgICAgICAgICAgICAKKwkJCWJyZWFrOworICAgICAgICAgICAgCisJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOiAvKiAxMEJhc2UyICovCisJCWNhc2UgSUZfUE9SVF9BVUk6IC8qIEFVSSAqLworCQljYXNlIElGX1BPUlRfMTAwQkFTRUZYOiAvKiAxMDBCYXNlRnggKi8KKyAgICAgICAgICAgICAgICAJLyogVGhlc2UgTW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKGFyZSB0aGV5PykqLworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9tY2FzdF9iaXRuciAtIGNvbXB1dGUgaGFzaHRhYmxlIGluZGV4IAorICoJQGFkZHI6IG11bHRpY2FzdCBhZGRyZXNzCisgKglAcmV2aXNpb246IHJldmlzaW9uIGlkIG9mIGNoaXAKKyAqCisgKglTaVMgOTAwIHVzZXMgdGhlIG1vc3Qgc2lnaWZpY2FudCA3IGJpdHMgdG8gaW5kZXggYSAxMjggYml0cyBtdWx0aWNhc3QKKyAqCWhhc2ggdGFibGUsIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24gYSBsaXR0bGUgYml0IGRpZmZlcmVudCBmcm9tIG90aGVyIGRyaXZlcnMKKyAqCVNpUyA5MDAgQjAgJiA2MzUgTS9CIHVzZXMgdGhlIG1vc3Qgc2lnbmlmaWNhdCA4IGJpdHMgdG8gaW5kZXggMjU2IGJpdHMKKyAqICAgCW11bHRpY2FzdCBoYXNoIHRhYmxlLiAKKyAqLworCitzdGF0aWMgaW5saW5lIHUxNiBzaXM5MDBfbWNhc3RfYml0bnIodTggKmFkZHIsIHU4IHJldmlzaW9uKQoreworCisJdTMyIGNyYyA9IGV0aGVyX2NyYyg2LCBhZGRyKTsKKworCS8qIGxlYXZlIDggb3IgNyBtb3N0IHNpZ2luaWZhbnQgYml0cyAqLworCWlmICgocmV2aXNpb24gPj0gU0lTNjM1QV85MDBfUkVWKSB8fCAocmV2aXNpb24gPT0gU0lTOTAwQl85MDBfUkVWKSkKKwkJcmV0dXJuICgoaW50KShjcmMgPj4gMjQpKTsKKwllbHNlCisJCXJldHVybiAoKGludCkoY3JjID4+IDI1KSk7Cit9CisKKy8qKgorICoJc2V0X3J4X21vZGUgLSBTZXQgU2lTOTAwIHJlY2VpdmUgbW9kZSAKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBiZSBzZXQKKyAqCisgKglTZXQgU2lTOTAwIHJlY2VpdmUgbW9kZSBmb3IgcHJvbWlzY3VvdXMsIG11bHRpY2FzdCwgb3IgYnJvYWRjYXN0IG1vZGUuCisgKglBbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBtdWx0aWNhc3QgZmlsdGVyLgorICoJTXVsdGljYXN0IGhhc2ggdGFibGUgY2hhbmdlcyBmcm9tIDEyOCB0byAyNTYgYml0cyBmb3IgNjM1TS9CICYgOTAwQjAuCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICogc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXUxNiBtY19maWx0ZXJbMTZdID0gezB9OwkvKiAyNTYvMTI4IGJpdHMgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KKwlpbnQgaSwgdGFibGVfZW50cmllczsKKwl1MzIgcnhfbW9kZTsKKworCS8qIDYzNSBIYXNoIFRhYmxlIGVudGlyZXMgPSAyNTYoMl4xNikgKi8KKwlpZigoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID49IFNJUzYzNUFfOTAwX1JFVikgfHwKKwkJCShzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTOTAwQl85MDBfUkVWKSkKKwkJdGFibGVfZW50cmllcyA9IDE2OworCWVsc2UKKwkJdGFibGVfZW50cmllcyA9IDg7CisKKwlpZiAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBBY2NlcHQgYW55IGtpbmRzIG9mIHBhY2tldHMgKi8KKwkJcnhfbW9kZSA9IFJGUHJvbWlzY3VvdXM7CisJCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9lbnRyaWVzOyBpKyspCisJCQltY19maWx0ZXJbaV0gPSAweGZmZmY7CisJfSBlbHNlIGlmICgobmV0X2Rldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KSB8fAorCQkgICAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIHRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0ICovCisJCXJ4X21vZGUgPSBSRkFBQiB8IFJGQUFNOworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKQorCQkJbWNfZmlsdGVyW2ldID0gMHhmZmZmOworCX0gZWxzZSB7CisJCS8qIEFjY2VwdCBCcm9hZGNhc3QgcGFja2V0LCBkZXN0aW5hdGlvbiBhZGRyZXNzIG1hdGNocyBvdXIKKwkJICogTUFDIGFkZHJlc3MsIHVzZSBSZWNlaXZlIEZpbHRlciB0byByZWplY3QgdW53YW50ZWQgTUNBU1QKKwkJICogcGFja2V0cyAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IFJGQUFCOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBuZXRfZGV2LT5tY19saXN0OworCQkJbWNsaXN0ICYmIGkgPCBuZXRfZGV2LT5tY19jb3VudDsKKwkJCWkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl1bnNpZ25lZCBpbnQgYml0X25yID0KKwkJCQlzaXM5MDBfbWNhc3RfYml0bnIobWNsaXN0LT5kbWlfYWRkciwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNF0gfD0gKDEgPDwgKGJpdF9uciAmIDB4ZikpOworCQl9CisJfQorCisJLyogdXBkYXRlIE11bHRpY2FzdCBIYXNoIFRhYmxlIGluIFJlY2VpdmUgRmlsdGVyICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2VudHJpZXM7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIHdoeSBwbHVzIDB4MDQgPz8sIFRoYXQgbWFrZXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGhhc2ggdGFibGUuICovCisJCW91dGwoKHUzMikoMHgwMDAwMDAwNCtpKSA8PCBSRkFERFJfc2hpZnQsIGlvYWRkciArIHJmY3IpOworCQlvdXRsKG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgcmZkcik7CisJfQorCisJb3V0bChSRkVOIHwgcnhfbW9kZSwgaW9hZGRyICsgcmZjcik7CisKKwkvKiBzaXM5MDAgaXMgY2FwYWJsZSBvZiBsb29waW5nIGJhY2sgcGFja2V0cyBhdCBNQUMgbGV2ZWwgZm9yCisJICogZGVidWdnaW5nIHB1cnBvc2UgKi8KKwlpZiAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkJdTMyIGNyX3NhdmVkOworCQkvKiBXZSBtdXN0IGRpc2FibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgbG9vcGJhY2sgbW9kZSAqLworCQljcl9zYXZlZCA9IGlubChpb2FkZHIgKyBjcik7CisJCW91dGwoY3Jfc2F2ZWQgfCBUeERJUyB8IFJ4RElTLCBpb2FkZHIgKyBjcik7CisJCS8qIGVuYWJsZSBsb29wYmFjayAqLworCQlvdXRsKGlubChpb2FkZHIgKyB0eGNmZykgfCBUeE1MQiwgaW9hZGRyICsgdHhjZmcpOworCQlvdXRsKGlubChpb2FkZHIgKyByeGNmZykgfCBSeEFUWCwgaW9hZGRyICsgcnhjZmcpOworCQkvKiByZXN0b3JlIGNyICovCisJCW91dGwoY3Jfc2F2ZWQsIGlvYWRkciArIGNyKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICoJc2lzOTAwX3Jlc2V0IC0gUmVzZXQgc2lzOTAwIE1BQyAKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byByZXNldAorICoKKyAqCXJlc2V0IHNpczkwMCBNQUMgYW5kIHdhaXQgdW50aWwgZmluaXNoZWQKKyAqCXJlc2V0IHRocm91Z2ggY29tbWFuZCByZWdpc3RlcgorICoJY2hhbmdlIGJhY2tvZmYgYWxnb3JpdGhtIGZvciA5MDBCMCAmIDYzNSBNL0IKKyAqLworCitzdGF0aWMgdm9pZCBzaXM5MDBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICogc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWludCBpID0gMDsKKwl1MzIgc3RhdHVzID0gVHhSQ01QIHwgUnhSQ01QOworCisJb3V0bCgwLCBpb2FkZHIgKyBpZXIpOworCW91dGwoMCwgaW9hZGRyICsgaW1yKTsKKwlvdXRsKDAsIGlvYWRkciArIHJmY3IpOworCisJb3V0bChSeFJFU0VUIHwgVHhSRVNFVCB8IFJFU0VUIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCQorCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwl3aGlsZSAoc3RhdHVzICYmIChpKysgPCAxMDAwKSkgeworCQlzdGF0dXMgXj0gKGlubChpc3IgKyBpb2FkZHIpICYgc3RhdHVzKTsKKwl9CisKKwlpZiggKHNpc19wcml2LT5jaGlwc2V0X3JldiA+PSBTSVM2MzVBXzkwMF9SRVYpIHx8CisJCQkoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzkwMEJfOTAwX1JFVikgKQorCQlvdXRsKFBFU0VMIHwgUk5EX0NOVCwgaW9hZGRyICsgY2ZnKTsKKwllbHNlCisJCW91dGwoUEVTRUwsIGlvYWRkciArIGNmZyk7Cit9CisKKy8qKgorICoJc2lzOTAwX3JlbW92ZSAtIFJlbW92ZSBzaXM5MDAgZGV2aWNlIAorICoJQHBjaV9kZXY6IHRoZSBwY2kgZGV2aWNlIHRvIGJlIHJlbW92ZWQKKyAqCisgKglyZW1vdmUgYW5kIHJlbGVhc2UgU2lTOTAwIG5ldCBkZXZpY2UKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2lzOTAwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IG1paV9waHkgKnBoeSA9IE5VTEw7CisKKwl3aGlsZSAoc2lzX3ByaXYtPmZpcnN0X21paSkgeworCQlwaHkgPSBzaXNfcHJpdi0+Zmlyc3RfbWlpOworCQlzaXNfcHJpdi0+Zmlyc3RfbWlpID0gcGh5LT5uZXh0OworCQlrZnJlZShwaHkpOworCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUlhfVE9UQUxfU0laRSwgc2lzX3ByaXYtPnJ4X3JpbmcsCisJCXNpc19wcml2LT5yeF9yaW5nX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBUWF9UT1RBTF9TSVpFLCBzaXNfcHJpdi0+dHhfcmluZywKKwkJc2lzX3ByaXYtPnR4X3JpbmdfZG1hKTsKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHNpczkwMF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisKKwlpZighbmV0aWZfcnVubmluZyhuZXRfZGV2KSkKKwkJcmV0dXJuIDA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IFN0YXR1cyBNYWNoaW5lICovCisJb3V0bChSeERJUyB8IFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDNob3QpOworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzOTAwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKworCWlmKCFuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKQorCQlyZXR1cm4gMDsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwlzaXM5MDBfaW5pdF9yeGZpbHRlcihuZXRfZGV2KTsKKworCXNpczkwMF9pbml0X3R4X3JpbmcobmV0X2Rldik7CisJc2lzOTAwX2luaXRfcnhfcmluZyhuZXRfZGV2KTsKKworCXNldF9yeF9tb2RlKG5ldF9kZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKworCS8qIFdvcmthcm91bmQgZm9yIEVEQiAqLworCXNpczkwMF9zZXRfbW9kZShpb2FkZHIsIEhXX1NQRUVEXzEwX01CUFMsIEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisJb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKwlvdXRsKElFLCBpb2FkZHIgKyBpZXIpOworCisJc2lzOTAwX2NoZWNrX21vZGUobmV0X2Rldiwgc2lzX3ByaXYtPm1paSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNpczkwMF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IFNJUzkwMF9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBzaXM5MDBfcGNpX3RibCwKKwkucHJvYmUJCT0gc2lzOTAwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2lzOTAwX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzaXM5MDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNpczkwMF9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXM5MDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2lzOTAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lzOTAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXM5MDBfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNpczkwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzaXM5MDBfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXM5MDAuaCBiL2RyaXZlcnMvbmV0L3NpczkwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2MwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zaXM5MDAuaApAQCAtMCwwICsxLDI3OSBAQAorLyogc2lzOTAwLmggRGVmaW5pdGlvbnMgZm9yIFNpUyBldGhlcm5ldCBjb250cm9sbGVycyBpbmNsdWRpbmcgNzAxNC83MDE2IGFuZCA5MDAgCisgKiBDb3B5cmlnaHQgMTk5OSBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtIENvcnBvcmF0aW9uCisgKiBSZWZlcmVuY2VzOgorICogICBTaVMgNzAxNiBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIENvbnRyb2xsZXIgd2l0aCBPbk5vdyBTdXBwb3J0LAorICoJcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxNCwgMTk5OAorICogICBTaVMgOTAwIEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gU2luZ2xlIENoaXAgd2l0aCBPbk5vdyBTdXBwb3J0LAorICoJcHJlbGltaW5hcnkgUmV2LiAxLjAgTm92LiAxMCwgMTk5OAorICogICBTaVMgNzAxNCBTaW5nbGUgQ2hpcCAxMDBCQVNFLVRYLzEwQkFTRS1UIFBoeXNpY2FsIExheWVyIFNvbHV0aW9uLAorICoJcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxOCwgMTk5OAorICogICBodHRwOi8vd3d3LnNpcy5jb20udHcvc3VwcG9ydC9kYXRhYm9vay5odG0KKyAqLworCisvKgorICogU2lTIDcwMTYgYW5kIFNpUyA5MDAgZXRoZXJuZXQgY29udHJvbGxlciByZWdpc3RlcnMKKyAqLworCisvKiBUaGUgSS9PIGV4dGVudCwgU2lTIDkwMCBuZWVkcyAyNTYgYnl0ZXMgb2YgaW8gYWRkcmVzcyAqLworI2RlZmluZSBTSVM5MDBfVE9UQUxfU0laRSAweDEwMAorCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gc2lzOTAwX3JlZ2lzdGVycyB7CisJY3I9MHgwLCAgICAgICAgICAgICAgICAgLy9Db21tYW5kIFJlZ2lzdGVyCisJY2ZnPTB4NCwgICAgICAgICAgICAgICAgLy9Db25maWd1cmF0aW9uIFJlZ2lzdGVyCisJbWVhcj0weDgsICAgICAgICAgICAgICAgLy9FRVBST00gQWNjZXNzIFJlZ2lzdGVyCisJcHRzY3I9MHhjLCAgICAgICAgICAgICAgLy9QQ0kgVGVzdCBDb250cm9sIFJlZ2lzdGVyCisJaXNyPTB4MTAsICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisJaW1yPTB4MTQsICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorCWllcj0weDE4LCAgICAgICAgICAgICAgIC8vSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgorCWVwYXI9MHgxOCwgICAgICAgICAgICAgIC8vRW5oYW5jZWQgUEhZIEFjY2VzcyBSZWdpc3RlcgorCXR4ZHA9MHgyMCwgICAgICAgICAgICAgIC8vVHJhbnNtaXQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCisgICAgICAgIHR4Y2ZnPTB4MjQsICAgICAgICAgICAgIC8vVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgICAgICByeGRwPTB4MzAsICAgICAgICAgICAgICAvL1JlY2VpdmUgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCisgICAgICAgIHJ4Y2ZnPTB4MzQsICAgICAgICAgICAgIC8vUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgICAgIGZsY3RybD0weDM4LCAgICAgICAgICAgIC8vRmxvdyBDb250cm9sIFJlZ2lzdGVyCisgICAgICAgIHJ4bGVuPTB4M2MsICAgICAgICAgICAgIC8vUmVjZWl2ZSBQYWNrZXQgTGVuZ3RoIFJlZ2lzdGVyCisgICAgICAgIHJmY3I9MHg0OCwgICAgICAgICAgICAgIC8vUmVjZWl2ZSBGaWx0ZXIgQ29udHJvbCBSZWdpc3RlcgorICAgICAgICByZmRyPTB4NEMsICAgICAgICAgICAgICAvL1JlY2VpdmUgRmlsdGVyIERhdGEgUmVnaXN0ZXIKKyAgICAgICAgcG1jdHJsPTB4QjAsICAgICAgICAgICAgLy9Qb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgICAgcG1lcj0weEI0ICAgICAgICAgICAgICAgLy9Qb3dlciBNYW5hZ2VtZW50IFdha2UtdXAgRXZlbnQgUmVnaXN0ZXIKK307CisKKy8qIFN5bWJvbGljIG5hbWVzIGZvciBiaXRzIGluIHZhcmlvdXMgcmVnaXN0ZXJzICovCitlbnVtIHNpczkwMF9jb21tYW5kX3JlZ2lzdGVyX2JpdHMgeworCVJFTE9BRCAgPSAweDAwMDAwNDAwLCBBQ0NFU1NNT0RFID0gMHgwMDAwMDIwMCwvKiBFVCAqLworCVJFU0VUICAgPSAweDAwMDAwMTAwLCBTV0kgPSAweDAwMDAwMDgwLCBSeFJFU0VUID0gMHgwMDAwMDAyMCwKKwlUeFJFU0VUID0gMHgwMDAwMDAxMCwgUnhESVMgPSAweDAwMDAwMDA4LCBSeEVOQSA9IDB4MDAwMDAwMDQsCisJVHhESVMgICA9IDB4MDAwMDAwMDIsIFR4RU5BID0gMHgwMDAwMDAwMQorfTsKKworZW51bSBzaXM5MDBfY29uZmlndXJhdGlvbl9yZWdpc3Rlcl9iaXRzIHsKKwlERVNDUkZNVCA9IDB4MDAwMDAxMDAgLyogNzAxNiBzcGVjaWZpYyAqLywgUkVRQUxHID0gMHgwMDAwMDA4MCwKKwlTQiAgICA9IDB4MDAwMDAwNDAsIFBPVyA9IDB4MDAwMDAwMjAsIEVYRCA9IDB4MDAwMDAwMTAsIAorCVBFU0VMID0gMHgwMDAwMDAwOCwgTFBNID0gMHgwMDAwMDAwNCwgQkVNID0gMHgwMDAwMDAwMSwKKwkvKiA2MzUgJiA5MDBCIFNwZWNpZmljICovCisJUk5EX0NOVCA9IDB4MDAwMDA0MDAsIEZBSVJfQkFDS09GRiA9IDB4MDAwMDAyMDAsCisJRURCX01BU1RFUl9FTiA9IDB4MDAwMDIwMDAKK307CisKK2VudW0gc2lzOTAwX2VlcHJvbV9hY2Nlc3NfcmVpZ3N0ZXJfYml0cyB7CisJTURDICA9IDB4MDAwMDAwNDAsIE1ERElSID0gMHgwMDAwMDAyMCwgTURJTyA9IDB4MDAwMDAwMTAsIC8qIDcwMTYgc3BlY2lmaWMgKi8gCisJRUVDUyA9IDB4MDAwMDAwMDgsIEVFQ0xLID0gMHgwMDAwMDAwNCwgRUVETyA9IDB4MDAwMDAwMDIsCisJRUVESSA9IDB4MDAwMDAwMDEKK307CisKK2VudW0gc2lzOTAwX2ludGVycnVwdF9yZWdpc3Rlcl9iaXRzIHsKKwlXS0VWVCAgPSAweDEwMDAwMDAwLCBUeFBBVVNFRU5EID0gMHgwODAwMDAwMCwgVHhQQVVTRSA9IDB4MDQwMDAwMDAsCisJVHhSQ01QID0gMHgwMjAwMDAwMCwgUnhSQ01QID0gMHgwMTAwMDAwMCwgRFBFUlIgPSAweDAwODAwMDAwLAorCVNTRVJSICA9IDB4MDA0MDAwMDAsIFJNQUJUICA9IDB4MDAyMDAwMDAsIFJUQUJUID0gMHgwMDEwMDAwMCwKKwlSeFNPVlIgPSAweDAwMDEwMDAwLCBISUJFUlIgPSAweDAwMDA4MDAwLCBTV0lOVCA9IDB4MDAwMDEwMDAsCisJTUlCSU5UID0gMHgwMDAwMDgwMCwgVHhVUk4gID0gMHgwMDAwMDQwMCwgVHhJRExFICA9IDB4MDAwMDAyMDAsCisJVHhFUlIgID0gMHgwMDAwMDEwMCwgVHhERVNDID0gMHgwMDAwMDA4MCwgVHhPSyAgPSAweDAwMDAwMDQwLAorCVJ4T1JOICA9IDB4MDAwMDAwMjAsIFJ4SURMRSA9IDB4MDAwMDAwMTAsIFJ4RUFSTFkgPSAweDAwMDAwMDA4LAorCVJ4RVJSICA9IDB4MDAwMDAwMDQsIFJ4REVTQyA9IDB4MDAwMDAwMDIsIFJ4T0sgID0gMHgwMDAwMDAwMQorfTsKKworZW51bSBzaXM5MDBfaW50ZXJydXB0X2VuYWJsZV9yZWlnc3Rlcl9iaXRzIHsKKwlJRSA9IDB4MDAwMDAwMDEKK307CisKKy8qIG1heGltdW0gZG1hIGJ1cnN0IGZvciB0cmFuc21pc3Npb24gYW5kIHJlY2VpdmUgKi8KKyNkZWZpbmUgTUFYX0RNQV9SQU5HRQk3CS8qIGFjdHVhbGx5IDAgbWVhbnMgTUFYSU1VTSAhISAqLworI2RlZmluZSBUeE1YRE1BX3NoaWZ0ICAgCTIwCisjZGVmaW5lIFJ4TVhETUFfc2hpZnQgICAgMjAKKworZW51bSBzaXM5MDBfdHhfcnhfZG1heworCURNQV9CVVJTVF81MTIgPSAwLAlETUFfQlVSU1RfNjQgPSA1Cit9OworCisvKiB0cmFuc21pdCBGSUZPIHRocmVzaG9sZHMgKi8KKyNkZWZpbmUgVFhfRklMTF9USFJFU0ggICAxNgkvKiAxLzQgRklGTyBzaXplICovCisjZGVmaW5lIFR4RklMTFRfc2hpZnQgICAJOAorI2RlZmluZSBUeERSTlRfc2hpZnQgICAgCTAKKyNkZWZpbmUgVHhEUk5UXzEwMCAgICAgIAk0OAkvKiAzLzQgRklGTyBzaXplICovCisjZGVmaW5lIFR4RFJOVF8xMAkJMTYgCS8qIDEvMiBGSUZPIHNpemUgKi8KKworZW51bSBzaXM5MDBfdHJhbnNtaXRfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworCVR4Q1NJID0gMHg4MDAwMDAwMCwgVHhIQkkgPSAweDQwMDAwMDAwLCBUeE1MQiA9IDB4MjAwMDAwMDAsCisJVHhBVFAgPSAweDEwMDAwMDAwLCBUeElGRyA9IDB4MEMwMDAwMDAsIFR4RklMTFQgPSAweDAwMDAzRjAwLAorCVR4RFJOVCA9IDB4MDAwMDAwM0YKK307CisKKy8qIHJlY2V2aWUgRklGTyB0aHJlc2hvbGRzICovCisjZGVmaW5lIFJ4RFJOVF9zaGlmdCAgICAgMQorI2RlZmluZSBSeERSTlRfMTAwCTE2CS8qIDEvMiBGSUZPIHNpemUgKi8KKyNkZWZpbmUgUnhEUk5UXzEwCQkyNCAJLyogMy80IEZJRk8gc2l6ZSAqLworCitlbnVtIHNpczkwMF9yZXZlaXZlX2NvbmZpZ19yZWdpc3Rlcl9iaXRzIHsKKwlSeEFFUCAgPSAweDgwMDAwMDAwLCBSeEFSUCA9IDB4NDAwMDAwMDAsIFJ4QVRYID0gMHgxMDAwMDAwMCwKKwlSeEFKQUIgPSAweDA4MDAwMDAwLCBSeERSTlQgPSAweDAwMDAwMDdGCit9OworCisjZGVmaW5lIFJGQUFfc2hpZnQgICAgICAyOAorI2RlZmluZSBSRkFERFJfc2hpZnQgICAgMTYKKworZW51bSBzaXM5MDBfcmVjZWl2ZV9maWx0ZXJfY29udHJvbF9yZWdpc3Rlcl9iaXRzIHsKKwlSRkVOICA9IDB4ODAwMDAwMDAsIFJGQUFCID0gMHg0MDAwMDAwMCwgUkZBQU0gPSAweDIwMDAwMDAwLAorCVJGQUFQID0gMHgxMDAwMDAwMCwgUkZQcm9taXNjdW91cyA9IChSRkFBQnxSRkFBTXxSRkFBUCkKK307CisKK2VudW0gc2lzOTAwX3JldmVpdmVfZmlsdGVyX2RhdGFfbWFzayB7CisJUkZEQVQgPSAgMHgwMDAwRkZGRgorfTsKKworLyogRUVQUk9NIEFkZHJlc3NlcyAqLworZW51bSBzaXM5MDBfZWVwcm9tX2FkZHJlc3MgeworCUVFUFJPTVNpZ25hdHVyZSA9IDB4MDAsIEVFUFJPTVZlbmRvcklEID0gMHgwMiwgRUVQUk9NRGV2aWNlSUQgPSAweDAzLAorCUVFUFJPTU1BQ0FkZHIgICA9IDB4MDgsIEVFUFJPTUNoZWNrc3VtID0gMHgwYgorfTsKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuIFJlZmVyIHRvIE5NOTNDeHggZGF0YXNoZWV0ICovCitlbnVtIHNpczkwMF9lZXByb21fY29tbWFuZCB7CisJRUVyZWFkICAgICA9IDB4MDE4MCwgRUV3cml0ZSAgICA9IDB4MDE0MCwgRUVlcmFzZSA9IDB4MDFDMCwgCisJRUV3cml0ZUVuYWJsZSA9IDB4MDEzMCwgRUV3cml0ZURpc2FibGUgPSAweDAxMDAsCisJRUVlcmFzZUFsbCA9IDB4MDEyMCwgRUV3cml0ZUFsbCA9IDB4MDExMCwgCisJRUVhZGRyTWFzayA9IDB4MDEzRiwgRUVjbWRTaGlmdCA9IDE2Cit9OworCisvKiBGb3IgU2lTOTYyIG9yIFNpUzk2MywgcmVxdWVzdCB0aGUgZWVwcm9tIHNvZnR3YXJlIGFjY2VzcyAqLworZW51bSBzaXM5NnhfZWVwcm9tX2NvbW1hbmQgeworCUVFUkVRID0gMHgwMDAwMDQwMCwgRUVET05FID0gMHgwMDAwMDIwMCwgRUVHTlQgPSAweDAwMDAwMTAwCit9OworCisvKiBNYW5hZ2VtZW50IERhdGEgSS9PIChtZGlvKSBmcmFtZSAqLworI2RlZmluZSBNSUlyZWFkICAgICAgICAgMHg2MDAwCisjZGVmaW5lIE1JSXdyaXRlICAgICAgICAweDUwMDIKKyNkZWZpbmUgTUlJcG1kU2hpZnQgICAgIDcKKyNkZWZpbmUgTUlJcmVnU2hpZnQgICAgIDIKKyNkZWZpbmUgTUlJY21kTGVuICAgICAgIDE2CisjZGVmaW5lIE1JSWNtZFNoaWZ0ICAgICAxNgorCisvKiBCdWZmZXIgRGVzY3JpcHRvciBTdGF0dXMqLworZW51bSBzaXM5MDBfYnVmZmVyX3N0YXR1cyB7CisJT1dOICAgID0gMHg4MDAwMDAwMCwgTU9SRSAgID0gMHg0MDAwMDAwMCwgSU5UUiA9IDB4MjAwMDAwMDAsCisJU1VQQ1JDID0gMHgxMDAwMDAwMCwgSU5DQ1JDID0gMHgxMDAwMDAwMCwKKwlPSyAgICAgPSAweDA4MDAwMDAwLCBEU0laRSAgPSAweDAwMDAwRkZGCit9OworLyogU3RhdHVzIGZvciBUWCBCdWZmZXJzICovCitlbnVtIHNpczkwMF90eF9idWZmZXJfc3RhdHVzIHsKKwlBQk9SVCAgID0gMHgwNDAwMDAwMCwgVU5ERVJSVU4gPSAweDAyMDAwMDAwLCBOT0NBUlJJRVIgPSAweDAxMDAwMDAwLAorCURFRkVSRCAgPSAweDAwODAwMDAwLCBFWENERUZFUiA9IDB4MDA0MDAwMDAsIE9XQ09MTCAgICA9IDB4MDAyMDAwMDAsCisJRVhDQ09MTCA9IDB4MDAxMDAwMDAsIENPTENOVCAgID0gMHgwMDBGMDAwMAorfTsKKworZW51bSBzaXM5MDBfcnhfYnVmZXJfc3RhdHVzIHsKKwlPVkVSUlVOID0gMHgwMjAwMDAwMCwgREVTVCA9IDB4MDA4MDAwMDAsICAgICBCQ0FTVCA9IDB4MDE4MDAwMDAsCisJTUNBU1QgICA9IDB4MDEwMDAwMDAsIFVOSU1BVENIID0gMHgwMDgwMDAwMCwgVE9PTE9ORyA9IDB4MDA0MDAwMDAsCisJUlVOVCAgICA9IDB4MDAyMDAwMDAsIFJYSVNFUlIgID0gMHgwMDEwMDAwMCwgQ1JDRVJSICA9IDB4MDAwODAwMDAsCisJRkFFUlIgICA9IDB4MDAwNDAwMDAsIExPT1BCSyAgID0gMHgwMDAyMDAwMCwgUlhDT0wgICA9IDB4MDAwMTAwMDAKK307CisKKy8qIE1JSSByZWdpc3RlciBvZmZzZXRzICovCitlbnVtIG1paV9yZWdpc3RlcnMgeworCU1JSV9DT05UUk9MID0gMHgwMDAwLCBNSUlfU1RBVFVTID0gMHgwMDAxLCBNSUlfUEhZX0lEMCA9IDB4MDAwMiwKKwlNSUlfUEhZX0lEMSA9IDB4MDAwMywgTUlJX0FOQURWICA9IDB4MDAwNCwgTUlJX0FOTFBBUiAgPSAweDAwMDUsCisJTUlJX0FORVhUICAgPSAweDAwMDYKK307CisKKy8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gU2lTIDkwMCAqLworZW51bSBzaXNfbWlpX3JlZ2lzdGVycyB7CisJTUlJX0NPTkZJRzEgPSAweDAwMTAsIE1JSV9DT05GSUcyID0gMHgwMDExLCBNSUlfU1RTT1VUID0gMHgwMDEyLAorCU1JSV9NQVNLICAgID0gMHgwMDEzLCBNSUlfUkVTViAgICA9IDB4MDAxNAorfTsKKworLyogbWlpIHJlZ2lzdGVycyBzcGVjaWZpYyB0byBJQ1MgMTg5MyAqLworZW51bSBpY3NfbWlpX3JlZ2lzdGVycyB7CisJTUlJX0VYVENUUkwgID0gMHgwMDEwLCBNSUlfUVBEU1RTID0gMHgwMDExLCBNSUlfMTBCVE9QID0gMHgwMDEyLAorCU1JSV9FWFRDVFJMMiA9IDB4MDAxMworfTsKKworLyogbWlpIHJlZ2lzdGVycyBzcGVjaWZpYyB0byBBTUQgNzlDOTAxICovCitlbnVtIGFtZF9taWlfcmVnaXN0ZXJzIHsKKwlNSUlfU1RBVFVTX1NVTU1BUlkgPSAweDAwMTgKK307CisKKy8qIE1JSSBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucy4gKi8KK2VudW0gbWlpX2NvbnRyb2xfcmVnaXN0ZXJfYml0cyB7CisJTUlJX0NOVExfRkRYICAgICA9IDB4MDEwMCwgTUlJX0NOVExfUlNUX0FVVE8gPSAweDAyMDAsIAorCU1JSV9DTlRMX0lTT0xBVEUgPSAweDA0MDAsIE1JSV9DTlRMX1BXUkRXTiAgID0gMHgwODAwLAorCU1JSV9DTlRMX0FVVE8gICAgPSAweDEwMDAsIE1JSV9DTlRMX1NQRUVEICAgID0gMHgyMDAwLAorCU1JSV9DTlRMX0xQQksgICAgPSAweDQwMDAsIE1JSV9DTlRMX1JFU0VUICAgID0gMHg4MDAwCit9OworCisvKiBNSUkgU3RhdHVzIHJlZ2lzdGVyIGJpdCAgKi8KK2VudW0gbWlpX3N0YXR1c19yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfU1RBVF9FWFQgICAgPSAweDAwMDEsIE1JSV9TVEFUX0pBQiAgICAgICAgPSAweDAwMDIsIAorCU1JSV9TVEFUX0xJTksgICA9IDB4MDAwNCwgTUlJX1NUQVRfQ0FOX0FVVE8gICA9IDB4MDAwOCwgCisJTUlJX1NUQVRfRkFVTFQgID0gMHgwMDEwLCBNSUlfU1RBVF9BVVRPX0RPTkUgID0gMHgwMDIwLAorCU1JSV9TVEFUX0NBTl9UICA9IDB4MDgwMCwgTUlJX1NUQVRfQ0FOX1RfRkRYICA9IDB4MTAwMCwKKwlNSUlfU1RBVF9DQU5fVFggPSAweDIwMDAsIE1JSV9TVEFUX0NBTl9UWF9GRFggPSAweDQwMDAsCisJTUlJX1NUQVRfQ0FOX1Q0ID0gMHg4MDAwCit9OworCisjZGVmaW5lCQlNSUlfSUQxX09VSV9MTwkJMHhGQzAwCS8qIGxvdyBiaXRzIG9mIE9VSSBtYXNrICovCisjZGVmaW5lCQlNSUlfSUQxX01PREVMCQkweDAzRjAJLyogbW9kZWwgbnVtYmVyICovCisjZGVmaW5lCQlNSUlfSUQxX1JFVgkJMHgwMDBGCS8qIG1vZGVsIG51bWJlciAqLworCisvKiBNSUkgTldBWSBSZWdpc3RlciBCaXRzIC4uLgorICAgdmFsaWQgZm9yIHRoZSBBTkFSIChBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQpIGFuZAorICAgQU5MUEFSIChBdXRvLU5lZ290aWF0aW9uIExpbmsgUGFydG5lcikgcmVnaXN0ZXJzICovCitlbnVtIG1paV9ud2F5X3JlZ2lzdGVyX2JpdHMgeworCU1JSV9OV0FZX05PREVfU0VMID0gMHgwMDFmLCBNSUlfTldBWV9DU01BX0NEID0gMHgwMDAxLAorCU1JSV9OV0FZX1QJICA9IDB4MDAyMCwgTUlJX05XQVlfVF9GRFggICA9IDB4MDA0MCwKKwlNSUlfTldBWV9UWCAgICAgICA9IDB4MDA4MCwgTUlJX05XQVlfVFhfRkRYICA9IDB4MDEwMCwKKwlNSUlfTldBWV9UNCAgICAgICA9IDB4MDIwMCwgTUlJX05XQVlfUEFVU0UgICA9IDB4MDQwMCwKKwlNSUlfTldBWV9SRiAgICAgICA9IDB4MjAwMCwgTUlJX05XQVlfQUNLICAgICA9IDB4NDAwMCwKKwlNSUlfTldBWV9OUCAgICAgICA9IDB4ODAwMAorfTsKKworZW51bSBtaWlfc3Rzb3V0X3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVFNPVVRfTElOS19GQUlMID0gMHg0MDAwLAorCU1JSV9TVFNPVVRfU1BEICAgICAgID0gMHgwMDgwLCBNSUlfU1RTT1VUX0RQTFggPSAweDAwNDAKK307CisKK2VudW0gbWlpX3N0c2ljc19yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfU1RTSUNTX1NQRCAgPSAweDgwMDAsIE1JSV9TVFNJQ1NfRFBMWCA9IDB4NDAwMCwKKwlNSUlfU1RTSUNTX0xJTktTVFMgPSAweDAwMDEKK307CisKK2VudW0gbWlpX3N0c3N1bV9yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfU1RTU1VNX0xJTksgPSAweDAwMDgsIE1JSV9TVFNTVU1fRFBMWCA9IDB4MDAwNCwKKwlNSUlfU1RTU1VNX0FVVE8gPSAweDAwMDIsIE1JSV9TVFNTVU1fU1BEICA9IDB4MDAwMQorfTsKKworZW51bSBzaXM5MDBfcmV2aXNpb25faWQgeworCVNJUzYzMEFfOTAwX1JFViA9IDB4ODAsCQlTSVM2MzBFXzkwMF9SRVYgPSAweDgxLAorCVNJUzYzMFNfOTAwX1JFViA9IDB4ODIsCQlTSVM2MzBFQTFfOTAwX1JFViA9IDB4ODMsCisJU0lTNjMwRVRfOTAwX1JFViA9IDB4ODQsCVNJUzYzNUFfOTAwX1JFViA9IDB4OTAsCisJU0lTOTZ4XzkwMF9SRVYgPSAwWDkxLAkJU0lTOTAwQl85MDBfUkVWID0gMHgwMworfTsKKworZW51bSBzaXM2MzBfcmV2aXNpb25faWQgeworCVNJUzYzMEEwICAgID0gMHgwMCwgU0lTNjMwQTEgICAgICA9IDB4MDEsCisJU0lTNjMwQjAgICAgPSAweDEwLCBTSVM2MzBCMSAgICAgID0gMHgxMQorfTsKKworI2RlZmluZSBGRFhfQ0FQQUJMRV9EVVBMRVhfVU5LTk9XTiAgICAgIDAKKyNkZWZpbmUgRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRCAgICAgICAxCisjZGVmaW5lIEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgICAgICAgMgorCisjZGVmaW5lIEhXX1NQRUVEX1VOQ09ORklHCQkwCisjZGVmaW5lIEhXX1NQRUVEX0hPTUUJCTEKKyNkZWZpbmUgSFdfU1BFRURfMTBfTUJQUyAgICAgICAgCTEwCisjZGVmaW5lIEhXX1NQRUVEXzEwMF9NQlBTICAgICAgIAkxMDAKKyNkZWZpbmUgSFdfU1BFRURfREVGQVVMVCAgICAgICAgCShIV19TUEVFRF8xMDBfTUJQUykKKworI2RlZmluZSBDUkNfU0laRSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BQ19IRUFERVJfU0laRSAgICAgICAgIDE0CisKKyNkZWZpbmUgVFhfQlVGX1NJWkUgICAgIDE1MzYKKyNkZWZpbmUgUlhfQlVGX1NJWkUgICAgIDE1MzYKKworI2RlZmluZSBOVU1fVFhfREVTQyAgICAgMTYgICAgICAJLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBOVU1fUlhfREVTQyAgICAgMTYgICAgICAgCS8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlOVU1fVFhfREVTQypzaXplb2YoQnVmZmVyRGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlOVU1fUlhfREVTQypzaXplb2YoQnVmZmVyRGVzYykKKworLyogUENJIHN0dWZmLCBzaG91bGQgYmUgbW92ZSB0byBwY2kuaCAqLworI2RlZmluZSBTSVM2MzBfVkVORE9SX0lEICAgICAgICAweDEwMzkKKyNkZWZpbmUgU0lTNjMwX0RFVklDRV9JRCAgICAgICAgMHgwNjMwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzgzMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDg5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgU3lzS29ubmVjdCBTSy05OHh4IGRldmljZSBkcml2ZXIuCisjCisKKworIworIyBTdGFuZGFsb25lIGRyaXZlciBwYXJhbXMKKyMgU0tQQVJBTSArPSAtRFNLX0tFUk5FTF8yNAorIyBTS1BBUkFNICs9IC1EU0tfS0VSTkVMXzI0XzI2CisjIFNLUEFSQU0gKz0gLURTS19LRVJORUxfMjYKKyMgU0tQQVJBTSArPSAtRFNLX0tFUk5FTF8yMl8yNAorCitvYmotJChDT05GSUdfU0s5OExJTikgKz0gc2s5OGxpbi5vCitzazk4bGluLW9ianMgICAgOj0JXAorCQlza2dlLm8JCVwKKwkJc2tldGh0b29sLm8JXAorCQlza2RpbS5vCQlcCisJCXNrYWRkci5vCVwKKwkJc2tnZWh3dC5vCVwKKwkJc2tnZWluaXQubwlcCisJCXNrZ2Vwbm1pLm8JXAorCQlza2dlc2lycS5vCVwKKwkJc2tpMmMubwkJXAorCQlza2xtODAubwlcCisJCXNrcXVldWUubwlcCisJCXNrcmxtdC5vCVwKKwkJc2t0aW1lci5vCVwKKwkJc2t2cGQubwkJXAorCQlza3htYWMyLm8JXAorCQlza3Byb2MubwlcCisJCXNrY3N1bS5vCisKKyMgREJHREVGID0gIFwKKyMgLURERUJVRworCitpZmRlZiBERUJVRworREJHREVGICs9ICBcCistRFNLX0RFQlVHX0NIS01PRD0weDAwMDAwMDAwTCBcCistRFNLX0RFQlVHX0NIS0NBVD0weDAwMDAwMDAwTAorZW5kaWYKKworCisjICoqKiogcG9zc2libGUgZGVidWcgbW9kdWxlcyBmb3IgU0tfREVCVUdfQ0hLTU9EICoqKioqKioqKioqKioqKioqCisjIFNLX0RCR01PRF9NRVJSICAgICAgICAweDAwMDAwMDAxTCAgICAgLyogZ2VuZXJhbCBtb2R1bGUgZXJyb3IgaW5kaWNhdGlvbiAqLworIyBTS19EQkdNT0RfSFdNICAgICAgICAgMHgwMDAwMDAwMkwgICAgIC8qIEhhcmR3YXJlIGluaXQgbW9kdWxlICovCisjIFNLX0RCR01PRF9STE1UICAgICAgICAweDAwMDAwMDA0TCAgICAgLyogUkxNVCBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX1ZQRCAgICAgICAgIDB4MDAwMDAwMDhMICAgICAvKiBWUEQgbW9kdWxlICovCisjIFNLX0RCR01PRF9JMkMgICAgICAgICAweDAwMDAwMDEwTCAgICAgLyogSTJDIG1vZHVsZSAqLworIyBTS19EQkdNT0RfUE5NSSAgICAgICAgMHgwMDAwMDAyMEwgICAgIC8qIFBOTUkgbW9kdWxlICovCisjIFNLX0RCR01PRF9DU1VNICAgICAgICAweDAwMDAwMDQwTCAgICAgLyogQ1NVTSBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX0FERFIgICAgICAgIDB4MDAwMDAwODBMICAgICAvKiBBRERSIG1vZHVsZSAqLworIyBTS19EQkdNT0RfRFJWICAgICAgICAgMHgwMDAxMDAwMEwgICAgIC8qIERSViBtb2R1bGUgKi8KKworIyAqKioqIHBvc3NpYmxlIGRlYnVnIGNhdGVnb3JpZXMgZm9yIFNLX0RFQlVHX0NIS0NBVCAqKioqKioqKioqKioqKgorIyAqKiogY29tbW9uIG1vZHVsZXMgKioqCisjIFNLX0RCR0NBVF9JTklUICAgICAgICAweDAwMDAwMDAxTCAgICAgbW9kdWxlL2RyaXZlciBpbml0aWFsaXphdGlvbgorIyBTS19EQkdDQVRfQ1RSTCAgICAgICAgMHgwMDAwMDAwMkwgICAgIGNvbnRyb2xsaW5nOiBhZGQvcm12IE1DQS9NQUMgYW5kIG90aGVyIGNvbnRyb2xzIChJT0NUTCkKKyMgU0tfREJHQ0FUX0VSUiAgICAgICAgIDB4MDAwMDAwMDRMICAgICBlcnJvciBoYW5kbGluZyBwYXRocworIyBTS19EQkdDQVRfVFggICAgICAgICAgMHgwMDAwMDAwOEwgICAgIHRyYW5zbWl0IHBhdGgKKyMgU0tfREJHQ0FUX1JYICAgICAgICAgIDB4MDAwMDAwMTBMICAgICByZWNlaXZlIHBhdGgKKyMgU0tfREJHQ0FUX0lSUSAgICAgICAgIDB4MDAwMDAwMjBMICAgICBnZW5lcmFsIElSUSBoYW5kbGluZworIyBTS19EQkdDQVRfUVVFVUUgICAgICAgMHgwMDAwMDA0MEwgICAgIGFueSBxdWV1ZSBtYW5hZ2VtZW50CisjIFNLX0RCR0NBVF9EVU1QICAgICAgICAweDAwMDAwMDgwTCAgICAgbGFyZ2UgZGF0YSBvdXRwdXQgZS5nLiBoZXggZHVtcAorIyBTS19EQkdDQVRfRkFUQUwgICAgICAgMHgwMDAwMDEwMEwgICAgIGxhcmdlIGRhdGEgb3V0cHV0IGUuZy4gaGV4IGR1bXAKKworIyAqKiogZHJpdmVyIChmaWxlIHNrZ2UuYykgKioqCisjIFNLX0RCR0NBVF9EUlZfRU5UUlkgICAgICAgICAgIDB4MDAwMTAwMDAgICAgICBlbnRyeSBwb2ludHMKKyMgU0tfREJHQ0FUX0RSVl8/Pz8gICAgICAgICAgICAgMHgwMDAyMDAwMCAgICAgIG5vdCB1c2VkCisjIFNLX0RCR0NBVF9EUlZfTUNBICAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgICBtdWx0aWNhc3QKKyMgU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUyAgICAgMHgwMDA4MDAwMCAgICAgIHR4IHBhdGgKKyMgU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUyAgICAgMHgwMDEwMDAwMCAgICAgIHJ4IHBhdGgKKyMgU0tfREJHQ0FUX0RSVl9QUk9HUkVTUyAgICAgICAgMHgwMDIwMDAwMCAgICAgIGdlbmVyYWwgcnVudGltZQorIyBTS19EQkdDQVRfRFJWXz8/PyAgICAgICAgICAgICAweDAwNDAwMDAwICAgICAgbm90IHVzZWQKKyMgU0tfREJHQ0FUX0RSVl9QUk9NICAgICAgICAgICAgMHgwMDgwMDAwMCAgICAgIHByb21pc2N1b3VzIG1vZGUKKyMgU0tfREJHQ0FUX0RSVl9UWF9GUkFNRSAgICAgICAgMHgwMTAwMDAwMCAgICAgIGRpc3BsYXkgdHggZnJhbWVzCisjIFNLX0RCR0NBVF9EUlZfRVJST1IgICAgICAgICAgIDB4MDIwMDAwMDAgICAgICBlcnJvciBjb25kaXRpb25zCisjIFNLX0RCR0NBVF9EUlZfSU5UX1NSQyAgICAgICAgIDB4MDQwMDAwMDAgICAgICBpbnRlcnJ1cHRzIHNvdXJjZXMKKyMgU0tfREJHQ0FUX0RSVl9FVkVOVCAgICAgICAgICAgMHgwODAwMDAwMCAgICAgIGRyaXZlciBldmVudHMKKworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9uZXQvc2s5OGxpbiAtRFNLX0RJQUdfU1VQUE9SVCAtRFNLX1VTRV9DU1VNIC1ER0VORVNJUyAtRFlVS09OICQoREJHREVGKSAkKFNLUEFSQU0pCisKK2NsZWFuOgorCXJtIC1mIGNvcmUgKi5vICouYSAqLnMKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9sbTgwLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvbG04MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmRiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvbG04MC5oCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJbG04MC5oCQorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS42ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA1LzEzIDE3OjI2OjUyICQKKyAqIFB1cnBvc2U6CUNvbnRhaW5zIGFsbCBkZWZpbmVzIGZvciB0aGUgTE04MCBDaGlwCisgKgkJKE5hdGlvbmFsIFNlbWljb25kdWN0b3IpLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX0xNODBfSAorI2RlZmluZSBfX0lOQ19MTTgwX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTE04MCByZWdpc3RlciBkZWZpbml0aW9uCisgKgorICogQWxsIHJlZ2lzdGVycyBhcmUgOCBiaXQgd2lkZQorICovCisjZGVmaW5lIExNODBfQ0ZHCQkJMHgwMAkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIExNODBfSVNSQ18xCQkJMHgwMQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTE04MF9JU1JDXzIJCQkweDAyCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBMTTgwX0lNU0tfMQkJCTB4MDMJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBMTTgwX0lNU0tfMgkJCTB4MDQJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBMTTgwX0ZBTl9DVFJMCQkweDA1CS8qIEZhbiBEZXZpc29yL1JTVCMvT1MjIFJlZ2lzdGVyICovCisjZGVmaW5lIExNODBfVEVNUF9DVFJMCQkweDA2CS8qIE9TIyBDb25maWcsIFRlbXAgUmVzLiBSZWcgKi8KKwkvKiAweDA3IC0gMHgxZiByZXNlcnZlZAkqLworCS8qIGN1cnJlbnQgdmFsdWVzICovCisjZGVmaW5lIExNODBfVlQwX0lOCQkJMHgyMAkvKiBjdXJyZW50IFZvbHRhZ2UgMCB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUMV9JTgkJCTB4MjEJLyogY3VycmVudCBWb2x0YWdlIDEgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDJfSU4JCQkweDIyCS8qIGN1cnJlbnQgVm9sdGFnZSAyIHZhbHVlICovCisjZGVmaW5lIExNODBfVlQzX0lOCQkJMHgyMwkvKiBjdXJyZW50IFZvbHRhZ2UgMyB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUNF9JTgkJCTB4MjQJLyogY3VycmVudCBWb2x0YWdlIDQgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDVfSU4JCQkweDI1CS8qIGN1cnJlbnQgVm9sdGFnZSA1IHZhbHVlICovCisjZGVmaW5lIExNODBfVlQ2X0lOCQkJMHgyNgkvKiBjdXJyZW50IFZvbHRhZ2UgNiB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1RFTVBfSU4JCTB4MjcJLyogY3VycmVudCBUZW1wZXJhdHVyZSB2YWx1ZSAqLworI2RlZmluZSBMTTgwX0ZBTjFfSU4JCTB4MjgJLyogY3VycmVudCBGYW4gMSBjb3VudCAqLworI2RlZmluZSBMTTgwX0ZBTjJfSU4JCTB4MjkJLyogY3VycmVudCBGYW4gMiBjb3VudCAqLworCS8qIGxpbWl0IHZhbHVlcyAqLworI2RlZmluZSBMTTgwX1ZUMF9ISUdIX0xJTQkweDJhCS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDAgKi8KKyNkZWZpbmUgTE04MF9WVDBfTE9XX0xJTQkweDJiCS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMCAqLworI2RlZmluZSBMTTgwX1ZUMV9ISUdIX0xJTQkweDJjCS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDEgKi8KKyNkZWZpbmUgTE04MF9WVDFfTE9XX0xJTQkweDJkCS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworI2RlZmluZSBMTTgwX1ZUMl9ISUdIX0xJTQkweDJlCS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDIgKi8KKyNkZWZpbmUgTE04MF9WVDJfTE9XX0xJTQkweDJmCS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMiAqLworI2RlZmluZSBMTTgwX1ZUM19ISUdIX0xJTQkweDMwCS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDMgKi8KKyNkZWZpbmUgTE04MF9WVDNfTE9XX0xJTQkweDMxCS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMyAqLworI2RlZmluZSBMTTgwX1ZUNF9ISUdIX0xJTQkweDMyCS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDQgKi8KKyNkZWZpbmUgTE04MF9WVDRfTE9XX0xJTQkweDMzCS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworI2RlZmluZSBMTTgwX1ZUNV9ISUdIX0xJTQkweDM0CS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDUgKi8KKyNkZWZpbmUgTE04MF9WVDVfTE9XX0xJTQkweDM1CS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNSAqLworI2RlZmluZSBMTTgwX1ZUNl9ISUdIX0xJTQkweDM2CS8qIGhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDYgKi8KKyNkZWZpbmUgTE04MF9WVDZfTE9XX0xJTQkweDM3CS8qIGxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNiAqLworI2RlZmluZSBMTTgwX1RIT1RfTElNX1VQCTB4MzgJLyogaG90IHRlbXBlcmF0dXJlIGxpbWl0IChoaWdoKSAqLworI2RlZmluZSBMTTgwX1RIT1RfTElNX0xPCTB4MzkJLyogaG90IHRlbXBlcmF0dXJlIGxpbWl0IChsb3cpICovCisjZGVmaW5lIExNODBfVE9TX0xJTV9VUAkJMHgzYQkvKiBPUyB0ZW1wZXJhdHVyZSBsaW1pdCAoaGlnaCkgKi8KKyNkZWZpbmUgTE04MF9UT1NfTElNX0xPCQkweDNiCS8qIE9TIHRlbXBlcmF0dXJlIGxpbWl0IChsb3cpICovCisjZGVmaW5lIExNODBfRkFOMV9DT1VOVF9MSU0JMHgzYwkvKiBGYW4gMSBjb3VudCBsaW1pdCAoaGlnaCkgKi8KKyNkZWZpbmUgTE04MF9GQU4yX0NPVU5UX0xJTQkweDNkCS8qIEZhbiAyIGNvdW50IGxpbWl0IChsb3cpICovCisJLyogMHgzZSAtIDB4M2YgcmVzZXJ2ZWQJKi8KKworLyoKKyAqIExNODAgYml0IGRlZmluaXRpb25zCisgKi8KKworLyoJTE04MF9DRkcJCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9DRkdfU1RBUlQJCSgxPDwwKQkvKiBzdGFydCBtb25pdG9yaW5nIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTTgwX0NGR19JTlRfRU5BCSgxPDwxKQkvKiBlbmFibGVzIHRoZSBJTlQjIEludGVycnVwdCBvdXRwdXQgKi8KKyNkZWZpbmUgTE04MF9DRkdfSU5UX1BPTAkoMTw8MikJLyogSU5UIyBwb2w6IDAgYWN0IGxvdywgMSBhY3QgaGlnaCAqLworI2RlZmluZSBMTTgwX0NGR19JTlRfQ0xSCSgxPDwzKQkvKiBkaXNhYmxlcyBJTlQjL1JTVF9PVVQjL09TIyBvdXRwdXRzICovCisjZGVmaW5lIExNODBfQ0ZHX1JFU0VUCQkoMTw8NCkJLyogc2lnbmFscyBhIHJlc2V0ICovCisjZGVmaW5lIExNODBfQ0ZHX0NIQVNTX0NMUgkoMTw8NSkJLyogY2xlYXJzIENoYXNzaXMgSW50cnVzaW9uIChDSSkgcGluICovCisjZGVmaW5lIExNODBfQ0ZHX0dQTwkJKDE8PDYpCS8qIGRyaXZlcyB0aGUgR1BPIyBwaW4gKi8KKyNkZWZpbmUgTE04MF9DRkdfSU5JVAkJKDE8PDcpCS8qIHJlc3RvcmUgcG93ZXIgb24gZGVmYXVsdHMgKi8KKworLyoJTE04MF9JU1JDXzEJCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworLyoJTE04MF9JTVNLXzEJCUludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTE04MF9JU19WVDAJCQkoMTw8MCkJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgMCAqLworI2RlZmluZSBMTTgwX0lTX1ZUMQkJCSgxPDwxKQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSAxICovCisjZGVmaW5lIExNODBfSVNfVlQyCQkJKDE8PDIpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDIgKi8KKyNkZWZpbmUgTE04MF9JU19WVDMJCQkoMTw8MykJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgMyAqLworI2RlZmluZSBMTTgwX0lTX1ZUNAkJCSgxPDw0KQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSA0ICovCisjZGVmaW5lIExNODBfSVNfVlQ1CQkJKDE8PDUpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDUgKi8KKyNkZWZpbmUgTE04MF9JU19WVDYJCQkoMTw8NikJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgNiAqLworI2RlZmluZSBMTTgwX0lTX0lOVF9JTgkJKDE8PDcpCS8qIHN0YXRlIG9mIElOVF9JTiMgKi8KKworLyoJTE04MF9JU1JDXzIJCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMiAqLworLyoJTE04MF9JTVNLXzIJCUludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgTE04MF9JU19URU1QCQkoMTw8MCkJLyogSE9UIHRlbXBlcmF0dXJlIGxpbWl0IGV4Y2VlZGVkICovCisjZGVmaW5lIExNODBfSVNfQlRJCQkJKDE8PDEpCS8qIHN0YXRlIG9mIEJUSSMgcGluICovCisjZGVmaW5lIExNODBfSVNfRkFOMQkJKDE8PDIpCS8qIGNvdW50IGxpbWl0IGV4Y2VlZGVkIGZvciBGYW4gMSAqLworI2RlZmluZSBMTTgwX0lTX0ZBTjIJCSgxPDwzKQkvKiBjb3VudCBsaW1pdCBleGNlZWRlZCBmb3IgRmFuIDIgKi8KKyNkZWZpbmUgTE04MF9JU19DSQkJCSgxPDw0KQkvKiBDaGFzc2lzIEludHJ1c2lvbiBvY2N1cmVkICovCisjZGVmaW5lIExNODBfSVNfT1MJCQkoMTw8NSkJLyogT1MgdGVtcGVyYXR1cmUgbGltaXQgZXhjZWVkZWQgKi8KKwkvKiBiaXQgNiBhbmQgNyBhcmUgcmVzZXJ2ZWQgaW4gTE04MF9JU1JDXzIgKi8KKyNkZWZpbmUgTE04MF9JU19IVF9JUlFfTUQJKDE8PDYpCS8qIEhvdCB0ZW1wZXJhdHVyZSBpbnRlcnJ1cHQgbW9kZSAqLworI2RlZmluZSBMTTgwX0lTX09UX0lSUV9NRAkoMTw8NykJLyogT1MgdGVtcGVyYXR1cmUgaW50ZXJydXB0IG1vZGUgKi8KKworLyoJTE04MF9GQU5fQ1RSTAkJRmFuIERldmlzb3IvUlNUIy9PUyMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9GQU4xX01EX1NFTAkoMTw8MCkJLyogRmFuIDEgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgTE04MF9GQU4yX01EX1NFTAkoMTw8MSkJLyogRmFuIDIgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgTE04MF9GQU4xX1BSTV9DVEwJKDM8PDIpCS8qIEZhbiAxIHNwZWVkIGNvbnRyb2wgKi8KKyNkZWZpbmUgTE04MF9GQU4yX1BSTV9DVEwJKDM8PDQpCS8qIEZhbiAyIHNwZWVkIGNvbnRyb2wgKi8KKyNkZWZpbmUgTE04MF9GQU5fT1NfRU5BCQkoMTw8NikJLyogZW5hYmxlIE9TIG1vZGUgb24gUlNUX09VVCMvT1MjIHBpbnMqLworI2RlZmluZSBMTTgwX0ZBTl9SU1RfRU5BCSgxPDw3KQkvKiBzZXRzIFJTVF9PVVQjL09TIyBwaW5zIGluIFJTVCBtb2RlICovCisKKy8qCUxNODBfVEVNUF9DVFJMCQlPUyMgQ29uZmlnLCBUZW1wIFJlcy4gUmVnICovCisjZGVmaW5lIExNODBfVEVNUF9PU19TVEFUCSgxPDwwKQkvKiBtaXJyb3JzIHRoZSBzdGF0ZSBvZiBSU1RfT1VUIy9PUyMgKi8KKyNkZWZpbmUgTE04MF9URU1QX09TX1BPTAkoMTw8MSkJLyogc2VsZWN0IE9TIyBwb2xhcml0eSAqLworI2RlZmluZSBMTTgwX1RFTVBfT1NfTU9ERQkoMTw8MikJLyogc2VsZWN0cyBJbnRlcnJ1cHQgbW9kZSAqLworI2RlZmluZSBMTTgwX1RFTVBfUkVTCQkoMTw8MykJLyogc2VsZWN0cyA5IG9yIDExIGJpdCB0ZW1wIHJlc3VsdXRpb24qLworI2RlZmluZSBMTTgwX1RFTVBfTFNCCQkoMHhmPDw0KS8qIDQgTFNCcyBvZiAxMSBiaXQgdGVtcCBkYXRhICovCisjZGVmaW5lIExNODBfVEVNUF9MU0JfOQkJKDE8PDcpCS8qIExTQiBvZiA5IGJpdCB0ZW1wZXJhdHVyZSBkYXRhICovCisKKwkvKiAweDA3IC0gMHgxZiByZXNlcnZlZAkqLworLyoJTE04MF9WVDBfSU4JCWN1cnJlbnQgVm9sdGFnZSAwIHZhbHVlICovCisvKglMTTgwX1ZUMV9JTgkJY3VycmVudCBWb2x0YWdlIDEgdmFsdWUgKi8KKy8qCUxNODBfVlQyX0lOCQljdXJyZW50IFZvbHRhZ2UgMiB2YWx1ZSAqLworLyoJTE04MF9WVDNfSU4JCWN1cnJlbnQgVm9sdGFnZSAzIHZhbHVlICovCisvKglMTTgwX1ZUNF9JTgkJY3VycmVudCBWb2x0YWdlIDQgdmFsdWUgKi8KKy8qCUxNODBfVlQ1X0lOCQljdXJyZW50IFZvbHRhZ2UgNSB2YWx1ZSAqLworLyoJTE04MF9WVDZfSU4JCWN1cnJlbnQgVm9sdGFnZSA2IHZhbHVlICovCisvKglMTTgwX1RFTVBfSU4JCWN1cnJlbnQgdGVtcGVyYXR1cmUgdmFsdWUgKi8KKy8qCUxNODBfRkFOMV9JTgkJY3VycmVudCBGYW4gMSBjb3VudCAqLworLyoJTE04MF9GQU4yX0lOCQljdXJyZW50IEZhbiAyIGNvdW50ICovCisvKglMTTgwX1ZUMF9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAwICovCisvKglMTTgwX1ZUMF9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMCAqLworLyoJTE04MF9WVDFfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworLyoJTE04MF9WVDFfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDEgKi8KKy8qCUxNODBfVlQyX0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDIgKi8KKy8qCUxNODBfVlQyX0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAyICovCisvKglMTTgwX1ZUM19ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAzICovCisvKglMTTgwX1ZUM19MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMyAqLworLyoJTE04MF9WVDRfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworLyoJTE04MF9WVDRfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDQgKi8KKy8qCUxNODBfVlQ1X0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDUgKi8KKy8qCUxNODBfVlQ1X0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA1ICovCisvKglMTTgwX1ZUNl9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA2ICovCisvKglMTTgwX1ZUNl9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNiAqLworLyoJTE04MF9USE9UX0xJTV9VUAlob3QgdGVtcGVyYXR1cmUgbGltaXQgKGhpZ2gpICovCisvKglMTTgwX1RIT1RfTElNX0xPCWhvdCB0ZW1wZXJhdHVyZSBsaW1pdCAobG93KSAqLworLyoJTE04MF9UT1NfTElNX1VQCQlPUyB0ZW1wZXJhdHVyZSBsaW1pdCAoaGlnaCkgKi8KKy8qCUxNODBfVE9TX0xJTV9MTwkJT1MgdGVtcGVyYXR1cmUgbGltaXQgKGxvdykgKi8KKy8qCUxNODBfRkFOMV9DT1VOVF9MSU0JRmFuIDEgY291bnQgbGltaXQgKGhpZ2gpICovCisvKglMTTgwX0ZBTjJfQ09VTlRfTElNCUZhbiAyIGNvdW50IGxpbWl0IChsb3cpICovCisJLyogMHgzZSAtIDB4M2YgcmVzZXJ2ZWQJKi8KKworI2RlZmluZSBMTTgwX0FERFIJCTB4MjgJLyogTE04MCBkZWZhdWx0IGFkZHIgKi8KKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYJLyogX19JTkNfTE04MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2thZGRyLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2thZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyZWE0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaApAQCAtMCwwICsxLDMzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrYWRkci5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBBRERSLU1vZHVsCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMjkgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMTMgMTY6NTc6MjQgJAorICogUHVycG9zZToJSGVhZGVyIGZpbGUgZm9yIEFkZHJlc3MgTWFuYWdlbWVudCAoTUMsIFVDLCBQcm9tKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gbWFuYWdlIG11bHRpY2FzdCBhZGRyZXNzZXMgYW5kIHByb21pc2N1b3VzIG1vZGUKKyAqIG9uIEdFbmVzaXMgYWRhcHRlcnMuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCS4uLgorICoJInNrdHlwZXMuaCIKKyAqCSJza3F1ZXVlLmgiCisgKgkic2thZGRyLmgiCisgKgkuLi4KKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tBRERSX0gKKyNkZWZpbmUgX19JTkNfU0tBRERSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBjcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTS19NQUNfQUREUl9MRU4JCQkJNgkvKiBMZW5ndGggb2YgTUFDIGFkZHJlc3MuICovCisjZGVmaW5lCVNLX01BWF9BRERSUwkJCQkxNAkvKiAjQWRkcnMgZm9yIGV4YWN0IG1hdGNoLiAqLworCisvKiAtLS0tLSBDb21tb24gcmV0dXJuIHZhbHVlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX0FERFJfU1VDQ0VTUwkJCQkwCS8qIEZ1bmN0aW9uIHJldHVybmVkIHN1Y2Nlc3NmdWxseS4gKi8KKyNkZWZpbmUgU0tfQUREUl9JTExFR0FMX1BPUlQJCQkxMDAJLyogUG9ydCBudW1iZXIgdG9vIGhpZ2guICovCisjZGVmaW5lIFNLX0FERFJfVE9PX0VBUkxZCQkJMTAxCS8qIEZ1bmN0aW9uIGNhbGxlZCB0b28gZWFybHkuICovCisKKy8qIC0tLS0tIENsZWFyL0FkZCBmbGFnIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19BRERSX1BFUk1BTkVOVAkJCTEJLyogUkxNVCBBZGRyZXNzICovCisKKy8qIC0tLS0tIEFkZGl0aW9uYWwgQ2xlYXIgZmxhZyBiaXRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfTUNfU1dfT05MWQkJCQkyCS8qIERvIG5vdCB1cGRhdGUgSFcgd2hlbiBjbGVhcmluZy4gKi8KKworLyogLS0tLS0gT3ZlcnJpZGUgZmxhZyBiaXRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9MT0dJQ0FMX0FERFJFU1MJCTAKKyNkZWZpbmUgU0tfQUREUl9WSVJUVUFMX0FERFJFU1MJCShTS19BRERSX0xPR0lDQUxfQUREUkVTUykJLyogb2xkICovCisjZGVmaW5lIFNLX0FERFJfUEhZU0lDQUxfQUREUkVTUwkxCisjZGVmaW5lIFNLX0FERFJfQ0xFQVJfTE9HSUNBTAkJMgorI2RlZmluZSBTS19BRERSX1NFVF9MT0dJQ0FMCQkJNAorCisvKiAtLS0tLSBPdmVycmlkZSByZXR1cm4gdmFsdWVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9PVkVSUklERV9TVUNDRVNTCShTS19BRERSX1NVQ0NFU1MpCisjZGVmaW5lIFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MJMQorI2RlZmluZSBTS19BRERSX01VTFRJQ0FTVF9BRERSRVNTCTIKKworLyogLS0tLS0gUGFydGl0aW9uaW5nIG9mIGV4Y2FjdCBtYXRjaCB0YWJsZSAtLS0tLSAqLworCisjZGVmaW5lIFNLX0FERFJfRVhBQ1RfTUFUQ0hFUwkJMTYJLyogI0V4YWN0IG1hdGNoIGVudHJpZXMuICovCisKKyNkZWZpbmUgU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UCTEKKyNkZWZpbmUgU0tfQUREUl9MQVNUX01BVENIX1JMTVQJCTIKKyNkZWZpbmUgU0tfQUREUl9GSVJTVF9NQVRDSF9EUlYJCTMKKyNkZWZpbmUgU0tfQUREUl9MQVNUX01BVENIX0RSVgkJKFNLX0FERFJfRVhBQ1RfTUFUQ0hFUyAtIDEpCisKKy8qIC0tLS0tIFNrQWRkck1jQWRkL1NrQWRkck1jVXBkYXRlIHJldHVybiB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19NQ19GSUxURVJJTkdfRVhBQ1QJCTAJLyogRXhhY3QgZmlsdGVyaW5nLiAqLworI2RlZmluZSBTS19NQ19GSUxURVJJTkdfSU5FWEFDVAkJMQkvKiBJbmV4YWN0IGZpbHRlcmluZy4gKi8KKworLyogLS0tLS0gQWRkaXRpb25hbCBTa0FkZHJNY0FkZCByZXR1cm4gdmFsdWVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfTUNfSUxMRUdBTF9BRERSRVNTCQkyCS8qIElsbGVnYWwgYWRkcmVzcy4gKi8KKyNkZWZpbmUgU0tfTUNfSUxMRUdBTF9QT1JUCQkJMwkvKiBJbGxlZ2FsIHBvcnQgKG5vdCB0aGUgYWN0aXZlIG9uZSkuICovCisjZGVmaW5lIFNLX01DX1JMTVRfT1ZFUkZMT1cJCQk0CS8qIFRvbyBtYW55IFJMTVQgbWMgYWRkcmVzc2VzLiAqLworCisvKiBQcm9taXNjdW91cyBtb2RlIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19QUk9NX01PREVfTk9ORQkJCTAJLyogTm9ybWFsIHJlY2VpdmUuICovCisjZGVmaW5lIFNLX1BST01fTU9ERV9MTEMJCQkxCS8qIFJlY2VpdmUgYWxsIExMQyBmcmFtZXMuICovCisjZGVmaW5lIFNLX1BST01fTU9ERV9BTExfTUMJCQkyCS8qIFJlY2VpdmUgYWxsIG11bHRpY2FzdCBmcmFtZXMuICovCisvKiAjZGVmaW5lIFNLX1BST01fTU9ERV9OT05fTExDCQk0ICovCS8qIFJlY2VpdmUgYWxsIG5vbi1MTEMgZnJhbWVzLiAqLworCisvKiBNYWNyb3MgKi8KKworI2lmZGVmIE9MRF9TVFVGRgorI2lmbmRlZiBTS19BRERSX0VRVUFMCisvKgorICogIiYiIGluc3RlYWQgb2YgIiYmIiBhbGxvd3MgYmV0dGVyIG9wdGltaXphdGlvbiBvbiBJQS02NC4KKyAqIFRoZSByZXBsYWNlbWVudCBpcyBzYWZlIGhlcmUsIGFzIGFsbCBieXRlcyBleGlzdC4KKyAqLworI2lmbmRlZiBTS19BRERSX0RXT1JEX0NPTVBBUkUKKyNkZWZpbmUgU0tfQUREUl9FUVVBTChBMSxBMikJKCBcCisJKCgoU0tfVTggKikoQTEpKVs1XSA9PSAoKFNLX1U4ICopKEEyKSlbNV0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbNF0gPT0gKChTS19VOCAqKShBMikpWzRdKSAmIFwKKwkoKChTS19VOCAqKShBMSkpWzNdID09ICgoU0tfVTggKikoQTIpKVszXSkgJiBcCisJKCgoU0tfVTggKikoQTEpKVsyXSA9PSAoKFNLX1U4ICopKEEyKSlbMl0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbMV0gPT0gKChTS19VOCAqKShBMikpWzFdKSAmIFwKKwkoKChTS19VOCAqKShBMSkpWzBdID09ICgoU0tfVTggKikoQTIpKVswXSkpCisjZWxzZQkvKiBTS19BRERSX0RXT1JEX0NPTVBBUkUgKi8KKyNkZWZpbmUgU0tfQUREUl9FUVVBTChBMSxBMikJKCBcCisJKCooU0tfVTMyICopJigoKFNLX1U4ICopKEExKSlbMl0pID09ICooU0tfVTMyICopJigoKFNLX1U4ICopKEEyKSlbMl0pKSAmIFwKKwkoKihTS19VMzIgKikmKCgoU0tfVTggKikoQTEpKVswXSkgPT0gKihTS19VMzIgKikmKCgoU0tfVTggKikoQTIpKVswXSkpKQorI2VuZGlmCS8qIFNLX0FERFJfRFdPUkRfQ09NUEFSRSAqLworI2VuZGlmCS8qIFNLX0FERFJfRVFVQUwgKi8KKyNlbmRpZiAvKiAwICovCisKKyNpZm5kZWYgU0tfQUREUl9FUVVBTAorI2lmbmRlZiBTS19BRERSX0RXT1JEX0NPTVBBUkUKKyNkZWZpbmUgU0tfQUREUl9FUVVBTChBMSxBMikJKCBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbNV0gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVs1XSkgJiBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbNF0gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVs0XSkgJiBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbM10gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVszXSkgJiBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbMl0gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVsyXSkgJiBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbMV0gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVsxXSkgJiBcCisJKCgoU0tfVTggU0tfRkFSICopKEExKSlbMF0gPT0gKChTS19VOCBTS19GQVIgKikoQTIpKVswXSkpCisjZWxzZQkvKiBTS19BRERSX0RXT1JEX0NPTVBBUkUgKi8KKyNkZWZpbmUgU0tfQUREUl9FUVVBTChBMSxBMikJKCBcCisJKCooU0tfVTE2IFNLX0ZBUiAqKSYoKChTS19VOCBTS19GQVIgKikoQTEpKVs0XSkgPT0gXAorCSooU0tfVTE2IFNLX0ZBUiAqKSYoKChTS19VOCBTS19GQVIgKikoQTIpKVs0XSkpICYmIFwKKwkoKihTS19VMzIgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMSkpWzBdKSA9PSBcCisJKihTS19VMzIgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzBdKSkpCisjZW5kaWYJLyogU0tfQUREUl9EV09SRF9DT01QQVJFICovCisjZW5kaWYJLyogU0tfQUREUl9FUVVBTCAqLworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBzX01hY0FkZHIgeworCVNLX1U4CWFbU0tfTUFDX0FERFJfTEVOXTsKK30gU0tfTUFDX0FERFI7CisKKworLyogU0tfRklMVEVSIGlzIHVzZWQgdG8gZW5zdXJlIGFsaWdubWVudCBvZiB0aGUgZmlsdGVyLiAqLwordHlwZWRlZiB1bmlvbiBzX0luZXhhY3RGaWx0ZXIgeworCVNLX1U4CUJ5dGVzWzhdOworCVNLX1U2NAlWYWw7CS8qIER1bW15IGVudHJ5IGZvciBhbGlnbm1lbnQgb25seS4gKi8KK30gU0tfRklMVEVSNjQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19BZGRyTmV0IFNLX0FERFJfTkVUOworCisKK3R5cGVkZWYgc3RydWN0IHNfQWRkclBvcnQgeworCisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfTUFDX0FERFIJQ3VycmVudE1hY0FkZHJlc3M7CS8qIEN1cnJlbnQgcGh5c2ljYWwgTUFDIEFkZHJlc3MuICovCisJU0tfTUFDX0FERFIJUGVybWFuZW50TWFjQWRkcmVzczsJLyogUGVybWFuZW50IHBoeXNpY2FsIE1BQyBBZGRyZXNzLiAqLworCWludAkJUHJvbU1vZGU7CQkvKiBQcm9taXNjdW91cyBNb2RlLiAqLworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKworCVNLX01BQ19BRERSCVByZXZpb3VzTWFjQWRkcmVzczsJLyogUHJldi4gcGh5cy4gTUFDIEFkZHJlc3MuICovCisJU0tfQk9PTAkJQ3VycmVudE1hY0FkZHJlc3NTZXQ7CS8qIEN1cnJlbnRNYWNBZGRyZXNzIGlzIHNldC4gKi8KKwlTS19VOAkJQWxpZ24wMTsKKworCVNLX1UzMgkJRmlyc3RFeGFjdE1hdGNoUmxtdDsKKwlTS19VMzIJCU5leHRFeGFjdE1hdGNoUmxtdDsKKwlTS19VMzIJCUZpcnN0RXhhY3RNYXRjaERydjsKKwlTS19VMzIJCU5leHRFeGFjdE1hdGNoRHJ2OworCVNLX01BQ19BRERSCUV4YWN0W1NLX0FERFJfRVhBQ1RfTUFUQ0hFU107CisJU0tfRklMVEVSNjQJSW5leGFjdEZpbHRlcjsJCQkvKiBGb3IgNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJU0tfRklMVEVSNjQJSW5leGFjdFJsbXRGaWx0ZXI7CQkvKiBGb3IgNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJU0tfRklMVEVSNjQJSW5leGFjdERydkZpbHRlcjsJCS8qIEZvciA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KK30gU0tfQUREUl9QT1JUOworCisKK3N0cnVjdCBzX0FkZHJOZXQgeworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX01BQ19BRERSCQlDdXJyZW50TWFjQWRkcmVzczsJLyogTG9naWNhbCBNQUMgQWRkcmVzcy4gKi8KKwlTS19NQUNfQUREUgkJUGVybWFuZW50TWFjQWRkcmVzczsJLyogTG9naWNhbCBNQUMgQWRkcmVzcy4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBwYXJ0IC0tLS0tICovCisKKwlTS19VMzIJCQlBY3RpdmVQb3J0OwkJLyogVmlldyBvZiBtb2R1bGUgQUREUi4gKi8KKwlTS19CT09MCQkJQ3VycmVudE1hY0FkZHJlc3NTZXQ7CS8qIEN1cnJlbnRNYWNBZGRyZXNzIGlzIHNldC4gKi8KKwlTS19VOAkJCUFsaWduMDE7CisJU0tfVTE2CQkJQWxpZ24wMjsKK307CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19BZGRyIHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX0FERFJfTkVUCQlOZXRbU0tfTUFYX05FVFNdOworCVNLX0FERFJfUE9SVAlQb3J0W1NLX01BWF9NQUNTXTsKKworLyogLS0tLS0gUHJpdmF0ZSBwYXJ0IC0tLS0tICovCit9IFNLX0FERFI7CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0tfS1JfUFJPVE8KKworLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IFNrQWRkciAqLworCisvKiBBTlNJL0MrKyBjb21wbGlhbnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitleHRlcm4JaW50CVNrQWRkckluaXQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAlMZXZlbCk7CisKK2V4dGVybglpbnQJU2tBZGRyTWNDbGVhcigKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjTWNDbGVhcigKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJHbWFjTWNDbGVhcigKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJNY0FkZCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCVBvcnROdW1iZXIsCisJU0tfTUFDX0FERFIJKnBNYywKKwlpbnQJCUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjTWNBZGQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfVTMyCQlQb3J0TnVtYmVyLAorCVNLX01BQ19BRERSCSpwTWMsCisJaW50CQlGbGFncyk7CisKK2V4dGVybglpbnQJU2tBZGRyR21hY01jQWRkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCVNLX1UzMgkJUG9ydE51bWJlciwKKwlTS19NQUNfQUREUgkqcE1jLAorCWludAkJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkck1jVXBkYXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlcik7CisKK2V4dGVybglpbnQJU2tBZGRyWG1hY01jVXBkYXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlcik7CisKK2V4dGVybglpbnQJU2tBZGRyR21hY01jVXBkYXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlcik7CisKK2V4dGVybglpbnQJU2tBZGRyT3ZlcnJpZGUoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfVTMyCQlQb3J0TnVtYmVyLAorCVNLX01BQ19BRERSCVNLX0ZBUiAqcE5ld0FkZHIsCisJaW50CQlGbGFncyk7CisKK2V4dGVybglpbnQJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyLAorCWludAlOZXdQcm9tTW9kZSk7CisKK2V4dGVybglpbnQJU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJTmV3UHJvbU1vZGUpOworCitleHRlcm4JaW50CVNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CU5ld1Byb21Nb2RlKTsJCisKKyNpZm5kZWYgU0tfU0xJTQorZXh0ZXJuCWludAlTa0FkZHJTd2FwKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJRnJvbVBvcnROdW1iZXIsCisJU0tfVTMyCVRvUG9ydE51bWJlcik7CisjZW5kaWYKKworI2Vsc2UJLyogZGVmaW5lZChTS19LUl9QUk9UTykpICovCisKKy8qIE5vbi1BTlNJL0MrKyBjb21wbGlhbnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCisjZXJyb3IgS1Itc3R5bGUgcHJvdG90eXBlcyBhcmUgbm90IHlldCBwcm92aWRlZC4KKworI2VuZGlmCS8qIGRlZmluZWQoU0tfS1JfUFJPVE8pKSAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19TS0FERFJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrY3N1bS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrY3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTRhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tjc3VtLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2NzdW0uaAorICogUHJvamVjdDoJR0VuZXNpcyAtIFN5c0tvbm5lY3QgU0stTkVUIEdpZ2FiaXQgRXRoZXJuZXQgKFNLLTk4eHgpCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTAgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDgvMjAgMTM6NTk6NTcgJAorICogUHVycG9zZToJU3RvcmUvdmVyaWZ5IEludGVybmV0IGNoZWNrc3VtIGluIHNlbmQvcmVjZWl2ZSBwYWNrZXRzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAxIFN5c0tvbm5lY3QgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBQdWJsaWMgaGVhZGVyIGZpbGUgZm9yIHRoZSAiR0VuZXNpcyIgY29tbW9uIG1vZHVsZSAiQ1NVTSIuCisgKgorICogIkdFbmVzaXMiIGlzIGFuIGFiYnJldmlhdGlvbiBvZiAiR2lnYWJpdCBFdGhlcm5ldCBOZXR3b3JrIFN5c3RlbSBpbiBTaWxpY29uIgorICogYW5kIGlzIHRoZSBjb2RlIG5hbWUgb2YgdGhpcyBTeXNLb25uZWN0IHByb2plY3QuCisgKgorICogQ29tcGlsYXRpb24gT3B0aW9uczoKKyAqCisgKglTS19VU0VfQ1NVTSAtIERlZmluZSBpZiBDU1VNIGlzIHRvIGJlIHVzZWQuIE90aGVyd2lzZSwgQ1NVTSB3aWxsIGJlIGFuCisgKgllbXB0eSBtb2R1bGUuCisgKgorICoJU0tDU19PVkVSV1JJVEVfUFJPVE8gLSBEZWZpbmUgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHByb3RvY29sIGlkCisgKglkZWZpbml0aW9ucy4gSW4gdGhpcyBjYXNlLCBhbGwgU0tDU19QUk9UT194eHggZGVmaW5pdGlvbnMgbXVzdCBiZSBtYWRlCisgKglleHRlcm5hbC4KKyAqCisgKglTS0NTX09WRVJXUklURV9TVEFUVVMgLSBEZWZpbmUgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHJldHVybiBzdGF0dXMKKyAqCWRlZmluaXRpb25zLiBJbiB0aGlzIGNhc2UsIGFsbCBTS0NTX1NUQVRVU194eHggZGVmaW5pdGlvbnMgbXVzdCBiZSBtYWRlCisgKglleHRlcm5hbC4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCSJoL3NrY3N1bS5oIgorICoJICJoL3NrdHlwZXMuaCIKKyAqCSAiaC9za3F1ZXVlLmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0NTVU1fSAorI2RlZmluZSBfX0lOQ19TS0NTVU1fSAorCisjaW5jbHVkZSAiaC9za3R5cGVzLmgiCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEZWZpbmUgdGhlIGRlZmF1bHQgYml0IGZsYWdzIGZvciAnU0tDU19QQUNLRVRfSU5GTy5Qcm90b2NvbEZsYWdzJyAgaWYgbm8gdXNlcgorICogb3ZlcndyaXRlLgorICovCisjaWZuZGVmIFNLQ1NfT1ZFUldSSVRFX1BST1RPCS8qIFVzZXIgb3ZlcndyaXRlPyAqLworI2RlZmluZSBTS0NTX1BST1RPX0lQCTB4MQkvKiBJUCAoSW50ZXJuZXQgUHJvdG9jb2wgdmVyc2lvbiA0KSAqLworI2RlZmluZSBTS0NTX1BST1RPX1RDUAkweDIJLyogVENQIChUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCkgKi8KKyNkZWZpbmUgU0tDU19QUk9UT19VRFAJMHg0CS8qIFVEUCAoVXNlciBEYXRhZ3JhbSBQcm90b2NvbCkgKi8KKworLyogSW5kaWNlcyBmb3IgcHJvdG9jb2wgc3RhdGlzdGljcy4gKi8KKyNkZWZpbmUgU0tDU19QUk9UT19TVEFUU19JUAkwCisjZGVmaW5lIFNLQ1NfUFJPVE9fU1RBVFNfVURQCTEKKyNkZWZpbmUgU0tDU19QUk9UT19TVEFUU19UQ1AJMgorI2RlZmluZSBTS0NTX05VTV9QUk9UT0NPTFMJMwkvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHByb3RvY29scy4gKi8KKyNlbmRpZgkvKiAhU0tDU19PVkVSV1JJVEVfUFJPVE8gKi8KKworLyoKKyAqIERlZmluZSB0aGUgZGVmYXVsdCBTS0NTX1NUQVRVUyB0eXBlIGFuZCB2YWx1ZXMgaWYgbm8gdXNlciBvdmVyd3JpdGUuCisgKgorICoJU0tDU19TVEFUVVNfVU5LTk9XTl9JUF9WRVJTSU9OIC0gTm90IGFuIElQIHY0IGZyYW1lLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUiAtIElQIGNoZWNrc3VtIGVycm9yLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9UQ1AgLSBJUCBjaGVja3N1bSBlcnJvciBpbiBUQ1AgZnJhbWUuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUCAtIElQIGNoZWNrc3VtIGVycm9yIGluIFVEUCBmcmFtZQorICoJU0tDU19TVEFUVVNfSVBfRlJBR01FTlQgLSBJUCBmcmFnbWVudCAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyAtIElQIGNoZWNrc3VtIG9rIChub3QgYSBUQ1Agb3IgVURQIGZyYW1lKS4KKyAqCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIC0gVENQIGNoZWNrc3VtIGVycm9yIChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19VRFBfQ1NVTV9FUlJPUiAtIFVEUCBjaGVja3N1bSBlcnJvciAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgLSBJUCBhbmQgVENQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfVURQX0NTVU1fT0sgLSBJUCBhbmQgVURQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFAgLSBJUCBjaGVja3N1bSBPSyBhbmQgbm8gVURQIGNoZWNrc3VtLiAKKyAqLworI2lmbmRlZiBTS0NTX09WRVJXUklURV9TVEFUVVMJLyogVXNlciBvdmVyd3JpdGU/ICovCisjZGVmaW5lIFNLQ1NfU1RBVFVTCWludAkvKiBEZWZpbmUgc3RhdHVzIHR5cGUuICovCisKKyNkZWZpbmUgU0tDU19TVEFUVVNfVU5LTk9XTl9JUF9WRVJTSU9OCTEKKyNkZWZpbmUgU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUgkJMgorI2RlZmluZSBTS0NTX1NUQVRVU19JUF9GUkFHTUVOVAkJCTMKKyNkZWZpbmUgU0tDU19TVEFUVVNfSVBfQ1NVTV9PSwkJCTQKKyNkZWZpbmUgU0tDU19TVEFUVVNfVENQX0NTVU1fRVJST1IJCTUKKyNkZWZpbmUgU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IJCTYKKyNkZWZpbmUgU0tDU19TVEFUVVNfVENQX0NTVU1fT0sJCQk3CisjZGVmaW5lIFNLQ1NfU1RBVFVTX1VEUF9DU1VNX09LCQkJOAorLyogbmVlZGVkIGZvciBNaWNyb3NvZnQgKi8KKyNkZWZpbmUgU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9VRFAJOQorI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1RDUAkxMAorLyogVURQIGNoZWNrc3VtIG1heSBiZSBvbWl0dGVkICovCisjZGVmaW5lIFNLQ1NfU1RBVFVTX0lQX0NTVU1fT0tfTk9fVURQCTExCisjZW5kaWYJLyogIVNLQ1NfT1ZFUldSSVRFX1NUQVRVUyAqLworCisvKiBDbGVhciBwcm90b2NvbCBzdGF0aXN0aWNzIGV2ZW50LiAqLworI2RlZmluZSBTS19DU1VNX0VWRU5UX0NMRUFSX1BST1RPX1NUQVRTCTEKKworLyoKKyAqIEFkZCB0d28gdmFsdWVzIGluIG9uZSdzIGNvbXBsZW1lbnQuCisgKgorICogTm90ZTogT25lIG9mIHRoZSB0d28gaW5wdXQgdmFsdWVzIG1heSBiZSAibG9uZ2VyIiB0aGFuIDE2LWJpdCwgYnV0IHRoZW4gdGhlCisgKiByZXN1bHRpbmcgc3VtIG1heSBiZSAxNyBiaXRzIGxvbmcuIEluIHRoaXMgY2FzZSwgYWRkIHplcm8gdG8gdGhlIHJlc3VsdCB1c2luZworICogU0tDU19PQ19BREQoKSBhZ2Fpbi4KKyAqCisgKglSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTIKKyAqLworI2RlZmluZSBTS0NTX09DX0FERChSZXN1bHQsIFZhbHVlMSwgVmFsdWUyKSB7CQkJCVwKKwl1bnNpZ25lZCBsb25nIFN1bTsJCQkJCQlcCisJCQkJCQkJCQlcCisJU3VtID0gKHVuc2lnbmVkIGxvbmcpIChWYWx1ZTEpICsgKHVuc2lnbmVkIGxvbmcpIChWYWx1ZTIpOwlcCisJLyogQWRkLWluIGFueSBjYXJyeS4gKi8JCQkJCQlcCisJKFJlc3VsdCkgPSAoU3VtICYgMHhmZmZmKSArIChTdW0gPj4gMTYpOwkJCVwKK30KKworLyoKKyAqIFN1YnRyYWN0IHR3byB2YWx1ZXMgaW4gb25lJ3MgY29tcGxlbWVudC4KKyAqCisgKglSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTIKKyAqLworI2RlZmluZSBTS0NTX09DX1NVQihSZXN1bHQsIFZhbHVlMSwgVmFsdWUyKQlcCisJU0tDU19PQ19BREQoKFJlc3VsdCksIChWYWx1ZTEpLCB+KFZhbHVlMikgJiAweGZmZmYpCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS0NTX1BST1RPX1NUQVRTIC0gVGhlIENTVU0gcHJvdG9jb2wgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKgorICogVGhlcmUgaXMgb25lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIGZvciBlYWNoIHByb3RvY29sIHN1cHBvcnRlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Dc1Byb3RvY29sU3RhdGlzdGljcyB7CisJU0tfVTY0IFJ4T2tDdHM7CQkvKiBSZWNlaXZlIGNoZWNrc3VtIG9rLiAqLworCVNLX1U2NCBSeFVuYWJsZUN0czsJLyogVW5hYmxlIHRvIHZlcmlmeSByZWNlaXZlIGNoZWNrc3VtLiAqLworCVNLX1U2NCBSeEVyckN0czsJLyogUmVjZWl2ZSBjaGVja3N1bSBlcnJvci4gKi8KKwlTS19VNjQgVHhPa0N0czsJCS8qIFRyYW5zbWl0IGNoZWNrc3VtIG9rLiAqLworCVNLX1U2NCBUeFVuYWJsZUN0czsJLyogVW5hYmxlIHRvIGNhbGN1bGF0ZSBjaGVja3N1bSBpbiBody4gKi8KK30gU0tDU19QUk9UT19TVEFUUzsKKworLyoKKyAqIHNfQ3N1bSAtIFRoZSBDU1VNIG1vZHVsZSBjb250ZXh0IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Dc3VtIHsKKwkvKiBFbmFibGVkIHJlY2VpdmUgU0tfUFJPVE9fWFhYIGJpdCBmbGFncy4gKi8KKwl1bnNpZ25lZCBSZWNlaXZlRmxhZ3NbU0tfTUFYX05FVFNdOworI2lmZGVmIFRYX0NTVU0KKwl1bnNpZ25lZCBUcmFuc21pdEZsYWdzW1NLX01BWF9ORVRTXTsKKyNlbmRpZiAvKiBUWF9DU1VNICovCisKKwkvKiBUaGUgcHJvdG9jb2wgc3RhdGlzdGljcyBzdHJ1Y3R1cmU7IG9uZSBwZXIgc3VwcG9ydGVkIHByb3RvY29sLiAqLworCVNLQ1NfUFJPVE9fU1RBVFMgUHJvdG9TdGF0c1tTS19NQVhfTkVUU11bU0tDU19OVU1fUFJPVE9DT0xTXTsKK30gU0tfQ1NVTTsKKworLyoKKyAqIFNLQ1NfUEFDS0VUX0lORk8gLSBUaGUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Dc1BhY2tldEluZm8geworCS8qIEJpdCBmaWVsZCBzcGVjaWZpeWluZyB0aGUgZGVzaXJlZC9mb3VuZCBwcm90b2NvbHMuICovCisJdW5zaWduZWQgUHJvdG9jb2xGbGFnczsKKworCS8qIExlbmd0aCBvZiBjb21wbGV0ZSBJUCBoZWFkZXIsIGluY2x1ZGluZyBhbnkgb3B0aW9uIGZpZWxkcy4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckxlbmd0aDsKKworCS8qIElQIGhlYWRlciBjaGVja3N1bS4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckNoZWNrc3VtOworCisJLyogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIFBzZXVkb0hlYWRlckNoZWNrc3VtOworfSBTS0NTX1BBQ0tFVF9JTkZPOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNLX0NTX0NBTENVTEFURV9DSEVDS1NVTQorZXh0ZXJuIHVuc2lnbmVkIFNrQ3NDYWxjdWxhdGVDaGVja3N1bSgKKwl2b2lkCQkqcERhdGEsCisJdW5zaWduZWQJTGVuZ3RoKTsKKyNlbmRpZiAvKiBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0gKi8KKworZXh0ZXJuIGludCBTa0NzRXZlbnQoCisJU0tfQUMJCSpwQWMsCisJU0tfSU9DCQlJb2MsCisJU0tfVTMyCQlFdmVudCwKKwlTS19FVlBBUkEJUGFyYW0pOworCitleHRlcm4gU0tDU19TVEFUVVMgU2tDc0dldFJlY2VpdmVJbmZvKAorCVNLX0FDCQkqcEFjLAorCXZvaWQJCSpwSXBIZWFkZXIsCisJdW5zaWduZWQJQ2hlY2tzdW0xLAorCXVuc2lnbmVkCUNoZWNrc3VtMiwKKwlpbnQJCQlOZXROdW1iZXIpOworCitleHRlcm4gdm9pZCBTa0NzR2V0U2VuZEluZm8oCisJU0tfQUMJCQkJKnBBYywKKwl2b2lkCQkJCSpwSXBIZWFkZXIsCisJU0tDU19QQUNLRVRfSU5GTwkqcFBhY2tldEluZm8sCisJaW50CQkJCQlOZXROdW1iZXIpOworCitleHRlcm4gdm9pZCBTa0NzU2V0UmVjZWl2ZUZsYWdzKAorCVNLX0FDCQkqcEFjLAorCXVuc2lnbmVkCVJlY2VpdmVGbGFncywKKwl1bnNpZ25lZAkqcENoZWNrc3VtMU9mZnNldCwKKwl1bnNpZ25lZAkqcENoZWNrc3VtMk9mZnNldCwKKwlpbnQJCQlOZXROdW1iZXIpOworCisjZW5kaWYJLyogX19JTkNfU0tDU1VNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RlYnVnLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYmExNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkZWJ1Zy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2RlYnVnLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTQgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMTMgMTc6MjY6MDAgJAorICogUHVycG9zZToJU0sgc3BlY2lmaWMgREVCVUcgc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLREVCVUdfSAorI2RlZmluZSBfX0lOQ19TS0RFQlVHX0gKKworI2lmZGVmCURFQlVHCisjaWZuZGVmIFNLX0RCR19NU0cKKyNkZWZpbmUgU0tfREJHX01TRyhwQUMsY29tcCxjYXQsYXJnKSBcCisJCWlmICggKChjb21wKSAmIFNLX0RCR19DSEtNT0QocEFDKSkgJiYgCVwKKwkJICAgICAgKChjYXQpICYgU0tfREJHX0NIS0NBVChwQUMpKSApIHsgCVwKKwkJCVNLX0RCR19QUklOVEYgYXJnIDsJCVwKKwkJfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBTS19EQkdfTVNHKHBBQyxjb21wLGxldixhcmcpCisjZW5kaWYKKworLyogUExTIE5PVEU6CisgKiA9PT09PT09PT0KKyAqIER1ZSB0byBhbnkgcmVzdHJpY3Rpb25zIG9mIGtlcm5lbCBwcmludGYgcm91dGluZXMgZG8gbm90IHVzZSBvdGhlcgorICogZm9ybWF0IGlkZW50aWZpZXJzIGFzOiAleCAlZCAlYyAlcyAuCisgKiBOZXZlciB1c2UgYW55IGNvbWJpbmVkIGZvcm1hdCBpZGVudGlmaWVycyBzdWNoIGFzOiAlbHggJWxkIGluIHlvdXIKKyAqIHByaW50ZiAtIGFyZ3VtZW50IChhcmcpIGJlY2F1c2Ugc29tZSBPUyBzcGVjaWZpYyBrZXJuZWwgcHJpbnRmcyBtYXkKKyAqIG9ubHkgc3VwcG9ydCBzb21lIGJhc2ljIGlkZW50aWZpZXJzLgorICovCisKKy8qIERlYnVnIG1vZHVsZXMgKi8KKworI2RlZmluZSBTS19EQkdNT0RfTUVSUgkweDAwMDAwMDAxTAkvKiBnZW5lcmFsIG1vZHVsZSBlcnJvciBpbmRpY2F0aW9uICovCisjZGVmaW5lIFNLX0RCR01PRF9IV00JMHgwMDAwMDAwMkwJLyogSGFyZHdhcmUgaW5pdCBtb2R1bGUgKi8KKyNkZWZpbmUgU0tfREJHTU9EX1JMTVQJMHgwMDAwMDAwNEwJLyogUkxNVCBtb2R1bGUgKi8KKyNkZWZpbmUgU0tfREJHTU9EX1ZQRAkweDAwMDAwMDA4TAkvKiBWUEQgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9JMkMJMHgwMDAwMDAxMEwJLyogSTJDIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfUE5NSQkweDAwMDAwMDIwTAkvKiBQTk1JIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfQ1NVTQkweDAwMDAwMDQwTAkvKiBDU1VNIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfQUREUgkweDAwMDAwMDgwTAkvKiBBRERSIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfUEVDUAkweDAwMDAwMTAwTAkvKiBQRUNQIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfUE9XTQkweDAwMDAwMjAwTAkvKiBQb3dlciBNYW5hZ2VtZW50IG1vZHVsZSAqLworCisvKiBEZWJ1ZyBldmVudHMgKi8KKworI2RlZmluZSBTS19EQkdDQVRfSU5JVAkweDAwMDAwMDAxTAkvKiBtb2R1bGUvZHJpdmVyIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIFNLX0RCR0NBVF9DVFJMCTB4MDAwMDAwMDJMCS8qIGNvbnRyb2xsaW5nIGRldmljZXMgKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0VSUgkweDAwMDAwMDA0TAkvKiBlcnJvciBoYW5kbGluZyBwYXRocyAqLworI2RlZmluZSBTS19EQkdDQVRfVFgJMHgwMDAwMDAwOEwJLyogdHJhbnNtaXQgcGF0aCAqLworI2RlZmluZSBTS19EQkdDQVRfUlgJMHgwMDAwMDAxMEwJLyogcmVjZWl2ZSBwYXRoICovCisjZGVmaW5lIFNLX0RCR0NBVF9JUlEJMHgwMDAwMDAyMEwJLyogZ2VuZXJhbCBJUlEgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU0tfREJHQ0FUX1FVRVVFCTB4MDAwMDAwNDBMCS8qIGFueSBxdWV1ZSBtYW5hZ2VtZW50ICovCisjZGVmaW5lIFNLX0RCR0NBVF9EVU1QCTB4MDAwMDAwODBMCS8qIGxhcmdlIGRhdGEgb3V0cHV0IGUuZy4gaGV4IGR1bXAgKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0ZBVEFMCTB4MDAwMDAxMDBMCS8qIGZhdGFsIGVycm9yICovCisKKyNlbmRpZgkvKiBfX0lOQ19TS0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjFzdC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2MXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4NDQwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjFzdC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tkcnYxc3QuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjQgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTEvMTIgMTQ6Mjg6MTQgJAorICogUHVycG9zZToJRmlyc3QgaGVhZGVyIGZpbGUgZm9yIGRyaXZlciBhbmQgYWxsIG90aGVyIG1vZHVsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBpcyB0aGUgZmlyc3QgaW5jbHVkZSBmaWxlIG9mIHRoZSBkcml2ZXIsIHdoaWNoIGluY2x1ZGVzIGFsbAorICogbmVjY2Vzc2FyeSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGFuZCBzb21lIG9mIHRoZSBHRW5lc2lzIGhlYWRlciBmaWxlcy4KKyAqIEl0IGFsc28gZGVmaW5lcyBzb21lIGJhc2ljIGl0ZW1zLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJc2VlIHNrZ2UuYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tEUlYxU1RfSAorI2RlZmluZSBfX0lOQ19TS0RSVjFTVF9ICisKKy8qIENoZWNrIGtlcm5lbCB2ZXJzaW9uICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCit0eXBlZGVmIHN0cnVjdCBzX0FDCVNLX0FDOworCisvKiBTZXQgY2FyZCB2ZXJzaW9ucyAqLworI2RlZmluZSBTS19GQVIKKworLyogb3ZlcnJpZGUgc29tZSBkZWZhdWx0IGZ1bmN0aW9ucyB3aXRoIG9wdGltaXplZCBsaW51eCBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBTS19QTk1JX1NUT1JFX1UxNihwLHYpCQltZW1jcHkoKGNoYXIqKShwKSwoY2hhciopJih2KSwyKQorI2RlZmluZSBTS19QTk1JX1NUT1JFX1UzMihwLHYpCQltZW1jcHkoKGNoYXIqKShwKSwoY2hhciopJih2KSw0KQorI2RlZmluZSBTS19QTk1JX1NUT1JFX1U2NChwLHYpCQltZW1jcHkoKGNoYXIqKShwKSwoY2hhciopJih2KSw4KQorI2RlZmluZSBTS19QTk1JX1JFQURfVTE2KHAsdikJCW1lbWNweSgoY2hhciopJih2KSwoY2hhciopKHApLDIpCisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMzIocCx2KQkJbWVtY3B5KChjaGFyKikmKHYpLChjaGFyKikocCksNCkKKyNkZWZpbmUgU0tfUE5NSV9SRUFEX1U2NChwLHYpCQltZW1jcHkoKGNoYXIqKSYodiksKGNoYXIqKShwKSw4KQorCisjZGVmaW5lIFNLX0FERFJfRVFVQUwoYTEsYTIpCQkoIW1lbWNtcChhMSxhMiw2KSkKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNkZWZpbmUgU0tfQ1NfQ0FMQ1VMQVRFX0NIRUNLU1VNCisjaWZuZGVmIENPTkZJR19YODZfNjQKKyNkZWZpbmUgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKHAsbCkJKCh+aXBfY29tcHV0ZV9jc3VtKHAsIGwpKSAmIDB4ZmZmZikKKyNlbHNlCisjZGVmaW5lIFNrQ3NDYWxjdWxhdGVDaGVja3N1bShwLGwpCSgofmlwX2Zhc3RfY3N1bShwLCBsKSkgJiAweGZmZmYpCisjZW5kaWYKKworI2luY2x1ZGUJImgvc2t0eXBlcy5oIgorI2luY2x1ZGUJImgvc2tlcnJvci5oIgorI2luY2x1ZGUJImgvc2tkZWJ1Zy5oIgorI2luY2x1ZGUJImgvbG04MC5oIgorI2luY2x1ZGUJImgveG1hY19paS5oIgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFNLX0xJVFRMRV9FTkRJQU4KKyNlbHNlCisjZGVmaW5lIFNLX0JJR19FTkRJQU4KKyNlbmRpZgorCisjZGVmaW5lIFNLX05FVF9ERVZJQ0UJbmV0X2RldmljZQorCisKKy8qIHdlIHVzZSBnZXRocnRpbWUoKSwgcmV0dXJuIHVuaXQ6IG5hbm9zZWNvbmRzICovCisjZGVmaW5lIFNLX1RJQ0tTX1BFUl9TRUMJMTAwCisKKyNkZWZpbmUJU0tfTUVNX01BUFBFRF9JTworCisvLyAjZGVmaW5lIFNLX1JMTVRfU0xPV19MT09LQUhFQUQKKworI2RlZmluZSBTS19NQVhfTUFDUwkJMgorI2RlZmluZSBTS19NQVhfTkVUUwkJMgorCisjZGVmaW5lIFNLX0lPQwkJCWNoYXIgX19pb21lbSAqCisKK3R5cGVkZWYgc3RydWN0IHNfRHJ2UmxtdE1idWYgU0tfTUJVRjsKKworI2RlZmluZQlTS19DT05TVDY0CUlOVDY0X0MKKyNkZWZpbmUJU0tfQ09OU1RVNjQJVUlOVDY0X0MKKworI2RlZmluZSBTS19NRU1DUFkoZGVzdCxzcmMsc2l6ZSkJbWVtY3B5KGRlc3Qsc3JjLHNpemUpCisjZGVmaW5lIFNLX01FTUNNUChzMSxzMixzaXplKQkJbWVtY21wKHMxLHMyLHNpemUpCisjZGVmaW5lIFNLX01FTVNFVChkZXN0LHZhbCxzaXplKQltZW1zZXQoZGVzdCx2YWwsc2l6ZSkKKyNkZWZpbmUgU0tfU1RSTEVOKHBTdHIpCQkJc3RybGVuKChjaGFyKikocFN0cikpCisjZGVmaW5lIFNLX1NUUk5DUFkocERlc3QscFNyYyxzaXplKQlzdHJuY3B5KChjaGFyKikocERlc3QpLChjaGFyKikocFNyYyksc2l6ZSkKKyNkZWZpbmUgU0tfU1RSQ01QKHBTdHIxLHBTdHIyKQkJc3RyY21wKChjaGFyKikocFN0cjEpLChjaGFyKikocFN0cjIpKQorCisvKiBtYWNyb3MgdG8gYWNjZXNzIHRoZSBhZGFwdGVyICovCisjZGVmaW5lIFNLX09VVDgoYixhLHYpCQl3cml0ZWIoKHYpLCAoKGIpKyhhKSkpCQorI2RlZmluZSBTS19PVVQxNihiLGEsdikJCXdyaXRldygodiksICgoYikrKGEpKSkJCisjZGVmaW5lIFNLX09VVDMyKGIsYSx2KQkJd3JpdGVsKCh2KSwgKChiKSsoYSkpKQkKKyNkZWZpbmUgU0tfSU44KGIsYSxwdikJCSgqKHB2KSA9IHJlYWRiKChiKSsoYSkpKQorI2RlZmluZSBTS19JTjE2KGIsYSxwdikJCSgqKHB2KSA9IHJlYWR3KChiKSsoYSkpKQorI2RlZmluZSBTS19JTjMyKGIsYSxwdikJCSgqKHB2KSA9IHJlYWRsKChiKSsoYSkpKQorCisjZGVmaW5lIGludDhfdAkJY2hhcgorI2RlZmluZSBpbnQxNl90CQlzaG9ydAorI2RlZmluZSBpbnQzMl90CQlsb25nCisjZGVmaW5lIGludDY0X3QJCWxvbmcgbG9uZworI2RlZmluZSB1aW50OF90CQl1X2NoYXIKKyNkZWZpbmUgdWludDE2X3QJdV9zaG9ydAorI2RlZmluZSB1aW50MzJfdAl1X2xvbmcKKyNkZWZpbmUgdWludDY0X3QJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIHRfc2NhbGFyX3QJaW50CisjZGVmaW5lIHRfdXNjYWxhcl90CXVuc2lnbmVkIGludAorI2RlZmluZSB1aW50cHRyX3QJdW5zaWduZWQgbG9uZworCisjZGVmaW5lIF9fQ09OQ0FUX18oQSxCKSBBIyNCCisKKyNkZWZpbmUgSU5UMzJfQyhhKQkJX19DT05DQVRfXyhhLEwpCisjZGVmaW5lIElOVDY0X0MoYSkJCV9fQ09OQ0FUX18oYSxMTCkKKyNkZWZpbmUgVUlOVDMyX0MoYSkJCV9fQ09OQ0FUX18oYSxVTCkKKyNkZWZpbmUgVUlOVDY0X0MoYSkJCV9fQ09OQ0FUX18oYSxVTEwpCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBTS19EQkdfUFJJTlRGCQlwcmludGsKKyNpZm5kZWYgU0tfREVCVUdfQ0hLTU9ECisjZGVmaW5lIFNLX0RFQlVHX0NIS01PRAkJMAorI2VuZGlmCisjaWZuZGVmIFNLX0RFQlVHX0NIS0NBVAorI2RlZmluZSBTS19ERUJVR19DSEtDQVQJCTAKKyNlbmRpZgorLyogdGhvc2UgY29tZSBmcm9tIHRoZSBtYWtlZmlsZSAqLworI2RlZmluZSBTS19EQkdfQ0hLTU9EKHBBQykJKFNLX0RFQlVHX0NIS01PRCkKKyNkZWZpbmUgU0tfREJHX0NIS0NBVChwQUMpCShTS19ERUJVR19DSEtDQVQpCisKK2V4dGVybiB2b2lkIFNrRGJnUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pOworCisjZGVmaW5lIFNLX0RCR01PRF9EUlYJCQkweDAwMDEwMDAwCisKKy8qKioqIHBvc3NpYmxlIGRyaXZlciBkZWJ1ZyBjYXRlZ29yaWVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTS19EQkdDQVRfRFJWX0VOVFJZCQkweDAwMDEwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfU0FQCQkweDAwMDIwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfTUNBCQkweDAwMDQwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MJMHgwMDA4MDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTCTB4MDAxMDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9QUk9HUkVTUwkJMHgwMDIwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX01TRwkJMHgwMDQwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1BST00JCTB4MDA4MDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9UWF9GUkFNRQkJMHgwMTAwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX0VSUk9SCQkweDAyMDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfSU5UX1NSQwkJMHgwNDAwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX0VWRU5UCQkweDA4MDAwMDAwCisKKyNlbmRpZgorCisjZGVmaW5lIFNLX0VSUl9MT0cJCVNrRXJyb3JMb2cKKworZXh0ZXJuIHZvaWQgU2tFcnJvckxvZyhTS19BQyosIGludCwgaW50LCBjaGFyKik7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkcnYybmQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmNlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkcnYybmQuaApAQCAtMCwwICsxLDQ1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZHJ2Mm5kLmgKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMi8xMSAxNjowNDo0NSAkCisgKiBQdXJwb3NlOglTZWNvbmQgaGVhZGVyIGZpbGUgZm9yIGRyaXZlciBhbmQgYWxsIG90aGVyIG1vZHVsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBpcyB0aGUgc2Vjb25kIGluY2x1ZGUgZmlsZSBvZiB0aGUgZHJpdmVyLCB3aGljaCBpbmNsdWRlcyBhbGwgb3RoZXIKKyAqIG5lY2Nlc3NhcnkgZmlsZXMgYW5kIGRlZmluZXMgYWxsIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyB1c2VkIGJ5IHRoZQorICogZHJpdmVyIGFuZCB0aGUgY29tbW9uIG1vZHVsZXMuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKglzZWUgc2tnZS5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0RSVjJORF9ICisjZGVmaW5lIF9fSU5DX1NLRFJWMk5EX0gKKworI2luY2x1ZGUgImgvc2txdWV1ZS5oIgorI2luY2x1ZGUgImgvc2tnZWh3dC5oIgorI2luY2x1ZGUgImgvc2t0aW1lci5oIgorI2luY2x1ZGUgImgvc2tpMmMuaCIKKyNpbmNsdWRlICJoL3NrZ2Vwbm1pLmgiCisjaW5jbHVkZSAiaC9za3ZwZC5oIgorI2luY2x1ZGUgImgvc2tnZWh3LmgiCisjaW5jbHVkZSAiaC9za2dlaW5pdC5oIgorI2luY2x1ZGUgImgvc2thZGRyLmgiCisjaW5jbHVkZSAiaC9za2dlc2lycS5oIgorI2luY2x1ZGUgImgvc2tjc3VtLmgiCisjaW5jbHVkZSAiaC9za3JsbXQuaCIKKyNpbmNsdWRlICJoL3NrZ2VkcnYuaCIKKworCitleHRlcm4gU0tfTUJVRgkJKlNrRHJ2QWxsb2NSbG10TWJ1ZihTS19BQyosIFNLX0lPQywgdW5zaWduZWQpOworZXh0ZXJuIHZvaWQJCVNrRHJ2RnJlZVJsbXRNYnVmKFNLX0FDKiwgU0tfSU9DLCBTS19NQlVGKik7CitleHRlcm4gU0tfVTY0CQlTa09zR2V0VGltZShTS19BQyopOworZXh0ZXJuIGludAkJU2tQY2lSZWFkQ2ZnRFdvcmQoU0tfQUMqLCBpbnQsIFNLX1UzMiopOworZXh0ZXJuIGludAkJU2tQY2lSZWFkQ2ZnV29yZChTS19BQyosIGludCwgU0tfVTE2Kik7CitleHRlcm4gaW50CQlTa1BjaVJlYWRDZmdCeXRlKFNLX0FDKiwgaW50LCBTS19VOCopOworZXh0ZXJuIGludAkJU2tQY2lXcml0ZUNmZ0RXb3JkKFNLX0FDKiwgaW50LCBTS19VMzIpOworZXh0ZXJuIGludAkJU2tQY2lXcml0ZUNmZ1dvcmQoU0tfQUMqLCBpbnQsIFNLX1UxNik7CitleHRlcm4gaW50CQlTa1BjaVdyaXRlQ2ZnQnl0ZShTS19BQyosIGludCwgU0tfVTgpOworZXh0ZXJuIGludAkJU2tEcnZFdmVudChTS19BQyosIFNLX0lPQyBJb0MsIFNLX1UzMiwgU0tfRVZQQVJBKTsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorZXh0ZXJuIGludAkJU2tEcnZFbnRlckRpYWdNb2RlKFNLX0FDICpwQWMpOworZXh0ZXJuIGludAkJU2tEcnZMZWF2ZURpYWdNb2RlKFNLX0FDICpwQWMpOworI2VuZGlmCisKK3N0cnVjdCBzX0RydlJsbXRNYnVmIHsKKwlTS19NQlVGCQkqcE5leHQ7CQkvKiBQb2ludGVyIHRvIG5leHQgUkxNVCBNYnVmLiAqLworCVNLX1U4CQkqcERhdGE7CQkvKiBEYXRhIGJ1ZmZlciAodmlydHVhbGx5IGNvbnRpZy4pLiAqLworCXVuc2lnbmVkCVNpemU7CQkvKiBEYXRhIGJ1ZmZlciBzaXplLiAqLworCXVuc2lnbmVkCUxlbmd0aDsJCS8qIExlbmd0aCBvZiBwYWNrZXQgKDw9IFNpemUpLiAqLworCVNLX1UzMgkJUG9ydElkeDsJLyogUmVjZWl2aW5nL3RyYW5zbWl0dGluZyBwb3J0LiAqLworI2lmZGVmIFNLX1JMTVRfTUJVRl9QUklWQVRFCisJU0tfUkxNVF9NQlVGCVJsbXQ7CQkvKiBQcml2YXRlIHBhcnQgZm9yIFJMTVQuICovCisjZW5kaWYgIC8qIFNLX1JMTVRfTUJVRl9QUklWQVRFICovCisJc3RydWN0IHNrX2J1ZmYJKnBPczsJCS8qIFBvaW50ZXIgdG8gbWVzc2FnZSBibG9jayAqLworfTsKKworCisvKgorICogVGltZSBtYWNyb3MKKyAqLworI2lmIFNLX1RJQ0tTX1BFUl9TRUMgPT0gMTAwCisjZGVmaW5lIFNLX1BOTUlfSFVORFJFRFNfU0VDKHQpCSh0KQorI2Vsc2UKKyNkZWZpbmUgU0tfUE5NSV9IVU5EUkVEU19TRUModCkJKCgoKHVuc2lnbmVkIGxvbmcpdCkgKiAxMDApIC8gXAorCQkJCQkJCQkJCShTS19USUNLU19QRVJfU0VDKSkKKyNlbmRpZgorCisvKgorICogTmV3IFNrT3NHZXRUaW1lCisgKi8KKyNkZWZpbmUgU2tPc0dldFRpbWVDdXJyZW50KHBBQywgcFVzZWMpIHtcCisJc3RydWN0IHRpbWV2YWwgdDtcCisJZG9fZ2V0dGltZW9mZGF5KCZ0KTtcCisJKnBVc2VjID0gKCgoKHQudHZfc2VjKSAqIDEwMDAwMDBMKSt0LnR2X3VzZWMpLzEwMDAwKTtcCit9CisKKworLyoKKyAqIGlvY3RsIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUJCVNLX0lPQ1RMX0JBU0UJCShTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUJCVNLX0lPQ1RMX0dFVE1JQgkJKFNLX0lPQ1RMX0JBU0UgKyAwKQorI2RlZmluZQkJU0tfSU9DVExfU0VUTUlCCQkoU0tfSU9DVExfQkFTRSArIDEpCisjZGVmaW5lCQlTS19JT0NUTF9QUkVTRVRNSUIJKFNLX0lPQ1RMX0JBU0UgKyAyKQorI2RlZmluZQkJU0tfSU9DVExfR0VOCQkoU0tfSU9DVExfQkFTRSArIDMpCisjZGVmaW5lCQlTS19JT0NUTF9ESUFHCQkoU0tfSU9DVExfQkFTRSArIDQpCisKK3R5cGVkZWYgc3RydWN0IHNfSU9DVEwJU0tfR0VfSU9DVEw7CisKK3N0cnVjdCBzX0lPQ1RMIHsKKwljaGFyIF9fdXNlciAqCXBEYXRhOworCXVuc2lnbmVkIGludAlMZW47Cit9OworCisKKy8qCisgKiBkZWZpbmUgc2l6ZXMgb2YgZGVzY3JpcHRvciByaW5ncyBpbiBieXRlcworICovCisKKyNkZWZpbmUJCVRYX1JJTkdfU0laRQkoOCoxMDI0KQorI2RlZmluZQkJUlhfUklOR19TSVpFCSgyNCoxMDI0KQorCisvKgorICogQnVmZmVyIHNpemUgZm9yIGV0aGVybmV0IHBhY2tldHMKKyAqLworI2RlZmluZQlFVEhfQlVGX1NJWkUJMTU0MAorI2RlZmluZQlFVEhfTUFYX01UVQkxNTE0CisjZGVmaW5lIEVUSF9NSU5fTVRVCTYwCisjZGVmaW5lIEVUSF9NVUxUSUNBU1RfQklUCTB4MDEKKyNkZWZpbmUgU0tfSlVNQk9fTVRVCTkwMDAKKworLyoKKyAqIHRyYW5zbWl0IHByaW9yaXR5IHNlbGVjdHMgdGhlIHF1ZXVlOiBMT1c9YXN5bmNocm9uLCBISUdIPXN5bmNocm9uCisgKi8KKyNkZWZpbmUgVFhfUFJJT19MT1cJMAorI2RlZmluZSBUWF9QUklPX0hJR0gJMQorCisvKgorICogYWxpZ25tZW50IG9mIHJ4L3R4IGRlc2NyaXB0b3JzCisgKi8KKyNkZWZpbmUgREVTQ1JfQUxJR04JNjQKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBwbm1pLiBUT0RPCisgKi8KKyNkZWZpbmUgU0tfRFJJVkVSX1JFU0VUKHBBQywgSW9DKQkwCisjZGVmaW5lIFNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpCTAKKyNkZWZpbmUgU0tfRFJJVkVSX1NFTEZURVNUKHBBQywgSW9DKQkwCisvKiBGb3IgZ2V0IG10dSB5b3UgbXVzdCBhZGQgYW4gb3duIGZ1bmN0aW9uICovCisjZGVmaW5lIFNLX0RSSVZFUl9HRVRfTVRVKHBBYyxJb0MsaSkJMAorI2RlZmluZSBTS19EUklWRVJfU0VUX01UVShwQWMsSW9DLGksdikJMAorI2RlZmluZSBTS19EUklWRVJfUFJFU0VUX01UVShwQWMsSW9DLGksdikJMAorCisvKgorKiogSW50ZXJpbSBkZWZpbml0aW9uIG9mIFNLX0RSVl9USU1FUiBwbGFjZWQgaW4gdGhpcyBmaWxlIHVudGlsIAorKiogY29tbW9uIG1vZHVsZXMgaGF2ZSBib29uIGZpbmFsbGl6ZWQKKyovCisjZGVmaW5lIFNLX0RSVl9USU1FUgkJCTExIAorI2RlZmluZQlTS19EUlZfTU9ERVJBVElPTl9USU1FUgkJMQorI2RlZmluZSBTS19EUlZfTU9ERVJBVElPTl9USU1FUl9MRU5HVEggIDEwMDAwMDAgIC8qIDEgc2Vjb25kICovCisjZGVmaW5lIFNLX0RSVl9SWF9DTEVBTlVQX1RJTUVSCQkyCisjZGVmaW5lIFNLX0RSVl9SWF9DTEVBTlVQX1RJTUVSX0xFTkdUSAkxMDAwMDAwCSAvKiAxMDAgbWlsbGlzZWNzICovCisKKy8qCisqKiBEZWZpbml0aW9ucyByZWdhcmRpbmcgdHJhbnNtaXR0aW5nIGZyYW1lcyAKKyoqIGFueSBjYWxjdWxhdGluZyBhbnkgY2hlY2tzdW0uCisqLworI2RlZmluZSBDX0xFTl9FVEhFUk1BQ19IRUFERVJfREVTVF9BRERSIDYKKyNkZWZpbmUgQ19MRU5fRVRIRVJNQUNfSEVBREVSX1NSQ19BRERSICA2CisjZGVmaW5lIENfTEVOX0VUSEVSTUFDX0hFQURFUl9MRU5UWVBFICAgMgorI2RlZmluZSBDX0xFTl9FVEhFUk1BQ19IRUFERVIgICAgICAgICAgICggKENfTEVOX0VUSEVSTUFDX0hFQURFUl9ERVNUX0FERFIpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENfTEVOX0VUSEVSTUFDX0hFQURFUl9TUkNfQUREUikgICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENfTEVOX0VUSEVSTUFDX0hFQURFUl9MRU5UWVBFKSApCisKKyNkZWZpbmUgQ19MRU5fRVRIRVJNVFVfTUlOU0laRSAgICAgICAgICA0NgorI2RlZmluZSBDX0xFTl9FVEhFUk1UVV9NQVhTSVpFX1NURCAgICAgIDE1MDAKKyNkZWZpbmUgQ19MRU5fRVRIRVJNVFVfTUFYU0laRV9KVU1CTyAgICA5MDAwCisKKyNkZWZpbmUgQ19MRU5fRVRIRVJORVRfTUlOU0laRSAgICAgICAgICAoIChDX0xFTl9FVEhFUk1BQ19IRUFERVIpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENfTEVOX0VUSEVSTVRVX01JTlNJWkUpICkKKworI2RlZmluZSBDX09GRlNFVF9JUEhFQURFUiAgICAgICAgICAgICAgIENfTEVOX0VUSEVSTUFDX0hFQURFUgorI2RlZmluZSBDX09GRlNFVF9JUEhFQURFUl9JUFBST1RPICAgICAgIDkKKyNkZWZpbmUgQ19PRkZTRVRfVENQSEVBREVSX1RDUENTICAgICAgICAxNgorI2RlZmluZSBDX09GRlNFVF9VRFBIRUFERVJfVURQQ1MgICAgICAgIDYKKworI2RlZmluZSBDX09GRlNFVF9JUFBST1RPICAgICAgICAgICAgICAgICggKENfTEVOX0VUSEVSTUFDX0hFQURFUikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19PRkZTRVRfSVBIRUFERVJfSVBQUk9UTykgKQorCisjZGVmaW5lIENfUFJPVE9fSURfVURQICAgICAgICAgICAgICAgICAgMTcgICAgICAgLyogcmVmZXIgdG8gUkZDIDc5MCBvciBTdGV2ZW5zJyAgICovCisjZGVmaW5lIENfUFJPVE9fSURfVENQICAgICAgICAgICAgICAgICAgNiAgICAgICAgLyogVENQL0lQIGlsbHVzdHJhdGVkIGZvciBkZXRhaWxzICovCisKKy8qIFRYIGFuZCBSWCBkZXNjcmlwdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc19SeEQgUlhEOyAvKiB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yICovCisKK3N0cnVjdCBzX1J4RCB7CisJdm9sYXRpbGUgU0tfVTMyCVJCQ29udHJvbDsJLyogUmVjZWl2ZSBCdWZmZXIgQ29udHJvbCAqLworCVNLX1UzMgkJVk5leHRSeGQ7CS8qIE5leHQgcmVjZWl2ZSBkZXNjcmlwdG9yLGxvdyBkd29yZCAqLworCVNLX1UzMgkJVkRhdGFMb3c7CS8qIFJlY2VpdmUgYnVmZmVyIEFkZHIsIGxvdyBkd29yZCAqLworCVNLX1UzMgkJVkRhdGFIaWdoOwkvKiBSZWNlaXZlIGJ1ZmZlciBBZGRyLCBoaWdoIGR3b3JkICovCisJU0tfVTMyCQlGcmFtZVN0YXQ7CS8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzIHdvcmQgKi8KKwlTS19VMzIJCVRpbWVTdGFtcDsJLyogVGltZSBzdGFtcCBmcm9tIFhNQUMgKi8KKwlTS19VMzIJCVRjcFN1bXM7CS8qIFRDUCBTdW0gMiAvIFRDUCBTdW0gMSAqLworCVNLX1UzMgkJVGNwU3VtU3RhcnRzOwkvKiBUQ1AgU3VtIFN0YXJ0IDIgLyBUQ1AgU3VtIFN0YXJ0IDEgKi8KKwlSWEQJCSpwTmV4dFJ4ZDsJLyogUG9pbnRlciB0byBuZXh0IFJ4ZCAqLworCXN0cnVjdCBza19idWZmCSpwTUJ1ZjsJCS8qIFBvaW50ZXIgdG8gTGludXgnIHNvY2tldCBidWZmZXIgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHNfVHhEIFRYRDsgLyogdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKworc3RydWN0IHNfVHhEIHsKKwl2b2xhdGlsZSBTS19VMzIJVEJDb250cm9sOwkvKiBUcmFuc21pdCBCdWZmZXIgQ29udHJvbCAqLworCVNLX1UzMgkJVk5leHRUeGQ7CS8qIE5leHQgdHJhbnNtaXQgZGVzY3JpcHRvcixsb3cgZHdvcmQgKi8KKwlTS19VMzIJCVZEYXRhTG93OwkvKiBUcmFuc21pdCBCdWZmZXIgQWRkciwgbG93IGR3b3JkICovCisJU0tfVTMyCQlWRGF0YUhpZ2g7CS8qIFRyYW5zbWl0IEJ1ZmZlciBBZGRyLCBoaWdoIGR3b3JkICovCisJU0tfVTMyCQlGcmFtZVN0YXQ7CS8qIFRyYW5zbWl0IEZyYW1lIFN0YXR1cyBXb3JkICovCisJU0tfVTMyCQlUY3BTdW1PZnM7CS8qIFJlc2VydmVkIC8gVENQIFN1bSBPZmZzZXQgKi8KKwlTS19VMTYJCVRjcFN1bVN0OwkvKiBUQ1AgU3VtIFN0YXJ0ICovCisJU0tfVTE2CQlUY3BTdW1XcjsJLyogVENQIFN1bSBXcml0ZSAqLworCVNLX1UzMgkJVGNwUmVzZXJ2ZWQ7CS8qIG5vdCB1c2VkICovCisJVFhECQkqcE5leHRUeGQ7CS8qIFBvaW50ZXIgdG8gbmV4dCBUeGQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqcE1CdWY7CQkvKiBQb2ludGVyIHRvIExpbnV4JyBzb2NrZXQgYnVmZmVyICovCit9OworCisvKiBVc2VkIGludGVycnVwdCBiaXRzIGluIHRoZSBpbnRlcnJ1cHRzIHNvdXJjZSByZWdpc3RlciAqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRFJJVkVSX0lSUVMJKChJU19JUlFfU1cpICAgfCBcCisJCQkoSVNfUjFfRikgICAgICB8KElTX1IyX0YpICB8IFwKKwkJCShJU19YUzFfRikgICAgIHwoSVNfWEExX0YpIHwgXAorCQkJKElTX1hTMl9GKSAgICAgfChJU19YQTJfRikpCisKKyNkZWZpbmUgU1BFQ0lBTF9JUlFTCSgoSVNfSFdfRVJSKSAgIHwoSVNfSTJDX1JFQURZKSAgfCBcCisJCQkoSVNfRVhUX1JFRykgICB8KElTX1RJTUlOVCkgICAgIHwgXAorCQkJKElTX1BBX1RPX1JYMSkgfChJU19QQV9UT19SWDIpICB8IFwKKwkJCShJU19QQV9UT19UWDEpIHwoSVNfUEFfVE9fVFgyKSAgfCBcCisJCQkoSVNfTUFDMSkgICAgICB8KElTX0xOS19TWU5DX00xKXwgXAorCQkJKElTX01BQzIpICAgICAgfChJU19MTktfU1lOQ19NMil8IFwKKwkJCShJU19SMV9DKSAgICAgIHwoSVNfUjJfQykgICAgICAgfCBcCisJCQkoSVNfWFMxX0MpICAgICB8KElTX1hBMV9DKSAgICAgIHwgXAorCQkJKElTX1hTMl9DKSAgICAgfChJU19YQTJfQykpCisKKyNkZWZpbmUgSVJRX01BU0sJKChJU19JUlFfU1cpICAgfCBcCisJCQkoSVNfUjFfQikgICAgICB8KElTX1IxX0YpICAgICB8KElTX1IyX0IpIHwoSVNfUjJfRikgfCBcCisJCQkoSVNfWFMxX0IpICAgICB8KElTX1hTMV9GKSAgICB8KElTX1hBMV9CKXwoSVNfWEExX0YpfCBcCisJCQkoSVNfWFMyX0IpICAgICB8KElTX1hTMl9GKSAgICB8KElTX1hBMl9CKXwoSVNfWEEyX0YpfCBcCisJCQkoSVNfSFdfRVJSKSAgICB8KElTX0kyQ19SRUFEWSl8IFwKKwkJCShJU19FWFRfUkVHKSAgIHwoSVNfVElNSU5UKSAgIHwgXAorCQkJKElTX1BBX1RPX1JYMSkgfChJU19QQV9UT19SWDIpfCBcCisJCQkoSVNfUEFfVE9fVFgxKSB8KElTX1BBX1RPX1RYMil8IFwKKwkJCShJU19NQUMxKSAgICAgIHwoSVNfTUFDMikgICAgIHwgXAorCQkJKElTX1IxX0MpICAgICAgfChJU19SMl9DKSAgICAgfCBcCisJCQkoSVNfWFMxX0MpICAgICB8KElTX1hBMV9DKSAgICB8IFwKKwkJCShJU19YUzJfQykgICAgIHwoSVNfWEEyX0MpKQorCisjZGVmaW5lIElSUV9IV0VfTUFTSwkoSVNfRVJSX01TSykgLyogZW5hYmxlIGFsbCBIVyBpcnFzICovCisKK3R5cGVkZWYgc3RydWN0IHNfRGV2TmV0IERFVl9ORVQ7CisKK3N0cnVjdCBzX0Rldk5ldCB7CisJaW50ICAgICAgICAgICAgIFBvcnROcjsKKwlpbnQgICAgICAgICAgICAgTmV0TnI7CisJaW50ICAgICAgICAgICAgIE10dTsKKwlpbnQgICAgICAgICAgICAgVXA7CisJU0tfQUMgICAqcEFDOworfTsgIAorCit0eXBlZGVmIHN0cnVjdCBzX1R4UG9ydAkJVFhfUE9SVDsKKworc3RydWN0IHNfVHhQb3J0IHsKKwkvKiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5ncyAqLworCWNhZGRyX3QJCXBUeERlc2NyUmluZzsJLyogZGVzY3JpcHRvciBhcmVhIG1lbW9yeSAqLworCVNLX1U2NAkJVlR4RGVzY3JSaW5nOwkvKiBkZXNjci4gYXJlYSBidXMgdmlydC4gYWRkci4gKi8KKwlUWEQJCSpwVHhkUmluZ0hlYWQ7CS8qIEhlYWQgb2YgVHggcmluZ3MgKi8KKwlUWEQJCSpwVHhkUmluZ1RhaWw7CS8qIFRhaWwgb2YgVHggcmluZ3MgKi8KKwlUWEQJCSpwVHhkUmluZ1ByZXY7CS8qIGRlc2NyaXB0b3Igc2VudCBwcmV2aW91c2x5ICovCisJaW50CQlUeGRSaW5nRnJlZTsJLyogIyBvZiBmcmVlIGVudHJ5cyAqLworCXNwaW5sb2NrX3QJVHhEZXNSaW5nTG9jazsJLyogc2VyaWFsaXplIGRlc2NyaXB0b3IgYWNjZXNzZXMgKi8KKwlTS19JT0MJCUh3QWRkcjsJCS8qIGJtdSByZWdpc3RlcnMgYWRkcmVzcyAqLworCWludAkJUG9ydEluZGV4OwkvKiBpbmRleCBudW1iZXIgb2YgcG9ydCAoMCBvciAxKSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19SeFBvcnQJCVJYX1BPUlQ7CisKK3N0cnVjdCBzX1J4UG9ydCB7CisJLyogdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5ncyAqLworCWNhZGRyX3QJCXBSeERlc2NyUmluZzsJLyogZGVzY3JpcHRvciBhcmVhIG1lbW9yeSAqLworCVNLX1U2NAkJVlJ4RGVzY3JSaW5nOyAgIC8qIGRlc2NyLiBhcmVhIGJ1cyB2aXJ0LiBhZGRyLiAqLworCVJYRAkJKnBSeGRSaW5nSGVhZDsJLyogSGVhZCBvZiBSeCByaW5ncyAqLworCVJYRAkJKnBSeGRSaW5nVGFpbDsJLyogVGFpbCBvZiBSeCByaW5ncyAqLworCVJYRAkJKnBSeGRSaW5nUHJldjsJLyogZGVzY3JpcHRvciBnaXZlbiB0byBCTVUgcHJldmlvdXNseSAqLworCWludAkJUnhkUmluZ0ZyZWU7CS8qICMgb2YgZnJlZSBlbnRyeXMgKi8KKwlzcGlubG9ja190CVJ4RGVzUmluZ0xvY2s7CS8qIHNlcmlhbGl6ZSBkZXNjcmlwdG9yIGFjY2Vzc2VzICovCisJaW50CQlSeEZpbGxMaW1pdDsJLyogbGltaXQgZm9yIGJ1ZmZlcnMgaW4gcmluZyAqLworCVNLX0lPQwkJSHdBZGRyOwkJLyogYm11IHJlZ2lzdGVycyBhZGRyZXNzICovCisJaW50CQlQb3J0SW5kZXg7CS8qIGluZGV4IG51bWJlciBvZiBwb3J0ICgwIG9yIDEpICovCit9OworCisvKiBEZWZpbml0aW9ucyBuZWVkZWQgZm9yIGludGVycnVwdCBtb2RlcmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVJRX0VPRl9BU19UWCAgICAgKChJU19YQTFfRikgICAgIHwgKElTX1hBMl9GKSkKKyNkZWZpbmUgSVJRX0VPRl9TWV9UWCAgICAgKChJU19YUzFfRikgICAgIHwgKElTX1hTMl9GKSkKKyNkZWZpbmUgSVJRX01BU0tfVFhfT05MWSAgKChJUlFfRU9GX0FTX1RYKXwgKElSUV9FT0ZfU1lfVFgpKQorI2RlZmluZSBJUlFfTUFTS19SWF9PTkxZICAoKElTX1IxX0YpICAgICAgfCAoSVNfUjJfRikpCisjZGVmaW5lIElSUV9NQVNLX1NQX09OTFkgIChTUEVDSUFMX0lSUVMpCisjZGVmaW5lIElSUV9NQVNLX1RYX1JYICAgICgoSVJRX01BU0tfVFhfT05MWSl8IChJUlFfTUFTS19SWF9PTkxZKSkKKyNkZWZpbmUgSVJRX01BU0tfU1BfUlggICAgKChTUEVDSUFMX0lSUVMpICAgIHwgKElSUV9NQVNLX1JYX09OTFkpKQorI2RlZmluZSBJUlFfTUFTS19TUF9UWCAgICAoKFNQRUNJQUxfSVJRUykgICAgfCAoSVJRX01BU0tfVFhfT05MWSkpCisjZGVmaW5lIElSUV9NQVNLX1JYX1RYX1NQICgoU1BFQ0lBTF9JUlFTKSAgICB8IChJUlFfTUFTS19UWF9SWCkpCisKKyNkZWZpbmUgQ19JTlRfTU9EX05PTkUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ19JTlRfTU9EX1NUQVRJQyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ19JTlRfTU9EX0RZTkFNSUMgICAgICAgICAgICAgIDQKKworI2RlZmluZSBDX0NMS19GUkVRX0dFTkVTSVMgICAgICA1MzIxNTAwMCAvKiBzaG9ydGVyOiA1My4xMjUgTUh6ICAqLworI2RlZmluZSBDX0NMS19GUkVRX1lVS09OICAgICAgICA3ODIxNTAwMCAvKiBzaG9ydGVyOiA3OC4xMjUgTUh6ICAqLworCisjZGVmaW5lIENfSU5UU19QRVJfU0VDX0RFRkFVTFQgICAgICAyMDAwIAorI2RlZmluZSBDX0lOVF9NT0RfRU5BQkxFX1BFUkNFTlRBR0UgICA1MCAvKiBpZiBoaWdoZXIgNTAlIGVuYWJsZSAqLworI2RlZmluZSBDX0lOVF9NT0RfRElTQUJMRV9QRVJDRU5UQUdFICA1MCAvKiBpZiBsb3dlciA1MCUgZGlzYWJsZSAqLworI2RlZmluZSBDX0lOVF9NT0RfSVBTX0xPV0VSX1JBTkdFICAgICAzMAorI2RlZmluZSBDX0lOVF9NT0RfSVBTX1VQUEVSX1JBTkdFICAgICA0MDAwMAorCisKK3R5cGVkZWYgc3RydWN0IHNfRHluSXJxTW9kSW5mbyAgRElNX0lORk87CitzdHJ1Y3Qgc19EeW5JcnFNb2RJbmZvIHsKKwl1bnNpZ25lZCBsb25nICAgUHJldlRpbWVWYWw7CisJdW5zaWduZWQgaW50ICAgIFByZXZTeXNMb2FkOworCXVuc2lnbmVkIGludCAgICBQcmV2VXNlZFRpbWU7CisJdW5zaWduZWQgaW50ICAgIFByZXZUb3RhbFRpbWU7CisJaW50ICAgICAgICAgICAgIFByZXZVc2VkRGVzY3JSYXRpbzsKKwlpbnQgICAgICAgICAgICAgTmJyUHJvY2Vzc2VkRGVzY3I7CisgICAgICAgIFNLX1U2NCAgICAgICAgICBQcmV2UG9ydDBSeEludHJDdHM7CisgICAgICAgIFNLX1U2NCAgICAgICAgICBQcmV2UG9ydDFSeEludHJDdHM7CisgICAgICAgIFNLX1U2NCAgICAgICAgICBQcmV2UG9ydDBUeEludHJDdHM7CisgICAgICAgIFNLX1U2NCAgICAgICAgICBQcmV2UG9ydDFUeEludHJDdHM7CisJU0tfQk9PTCAgICAgICAgIE1vZEp1c3RFbmFibGVkOyAgICAgLyogTW9kZXJhdGlvbiBqdXN0IGVuYWJsZWQgeWVzL25vICovCisKKwlpbnQgICAgICAgICAgICAgTWF4TW9kSW50c1BlclNlYzsgICAgICAgICAgICAvKiBNb2RlcmF0aW9uIFRocmVzaG9sZCAqLworCWludCAgICAgICAgICAgICBNYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdDsgIC8qIFVwcGVyIGxpbWl0IGZvciBESU0gICovCisJaW50ICAgICAgICAgICAgIE1heE1vZEludHNQZXJTZWNMb3dlckxpbWl0OyAgLyogTG93ZXIgbGltaXQgZm9yIERJTSAgKi8KKworCWxvbmcgICAgICAgICAgICBNYXNrSXJxTW9kZXJhdGlvbjsgICAvKiBNb2RJcnFUeXBlIChlZy4gJ1R4UngnKSAgICAgICovCisJU0tfQk9PTCAgICAgICAgIERpc3BsYXlTdGF0czsgICAgICAgIC8qIFN0YXRzIHllcy9ubyAgICAgICAgICAgICAgICAgKi8KKwlTS19CT09MICAgICAgICAgQXV0b1NpemluZzsgICAgICAgICAgLyogUmVzaXplIERJTS10aW1lciBvbi9vZmYgICAgICAqLworCWludCAgICAgICAgICAgICBJbnRNb2RUeXBlU2VsZWN0OyAgICAvKiBFbmFibGVJbnRNb2QgKGVnLiAnZHluYW1pYycpICovCisKKwlTS19USU1FUiAgICAgICAgTW9kVGltZXI7IC8qIGp1c3Qgc29tZSB0aW1lciAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QZXJTdHJtCVBFUl9TVFJNOworCisjZGVmaW5lIFNLX0FMTE9DX0lSUQkweDAwMDAwMDAxCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKyNkZWZpbmUJRElBR19BQ1RJVkUJCTEKKyNkZWZpbmUJRElBR19OT1RBQ1RJVkUJCTAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyIGJvYXJkIHN0cnVjdHVyZSAvIEFkYXB0ZXIgQ29udGV4dCBzdHJ1Y3R1cmU6CisgKglBbGxvY2F0ZWQgd2l0aGluIGF0dGFjaCg5ZSkgYW5kIGZyZWVkIHdpdGhpbiBkZXRhY2goOWUpLgorICoJQ29udGFpbnMgYWxsICdwZXIgZGV2aWNlJyBuZWNlc3NhcnkgaGFuZGxlcywgZmxhZ3MsIGxvY2tzIGV0Yy46CisgKi8KK3N0cnVjdCBzX0FDICB7CisJU0tfR0VJTklUCUdJbmk7CQkvKiBHRSBpbml0IHN0cnVjdCAqLworCVNLX1BOTUkJCVBubWk7CQkvKiBQTk1JIGRhdGEgc3RydWN0ICovCisJU0tfVlBECQl2cGQ7CQkvKiB2cGQgZGF0YSBzdHJ1Y3QgKi8KKwlTS19RVUVVRQlFdmVudDsJCS8qIEV2ZW50IHF1ZXVlICovCisJU0tfSFdUCQlId3Q7CQkvKiBIYXJkd2FyZSBUaW1lciBjb250cm9sIHN0cnVjdCAqLworCVNLX1RJTUNUUkwJVGltOwkJLyogU29mdHdhcmUgVGltZXIgY29udHJvbCBzdHJ1Y3QgKi8KKwlTS19JMkMJCUkyYzsJCS8qIEkyQyByZWxldmFudCBkYXRhIHN0cnVjdHVyZSAqLworCVNLX0FERFIJCUFkZHI7CQkvKiBmb3IgQWRkcmVzcyBtb2R1bGUgKi8KKwlTS19DU1VNCQlDc3VtOwkJLyogZm9yIGNoZWNrc3VtIG1vZHVsZSAqLworCVNLX1JMTVQJCVJsbXQ7CQkvKiBmb3IgcmxtdCBtb2R1bGUgKi8KKwlzcGlubG9ja190CVNsb3dQYXRoTG9jazsJLyogTm9ybWFsIElSUSBsb2NrICovCisJc3RydWN0IHRpbWVyX2xpc3QgQmxpbmtUaW1lcjsJLyogZm9yIExFRCBibGlua2luZyAqLworCWludAkJTGVkc09uOworCVNLX1BOTUlfU1RSVUNUX0RBVEEgUG5taVN0cnVjdDsJLyogc3RydWN0dXJlIHRvIGdldCBhbGwgUG5taS1EYXRhICovCisJaW50CQkJUmxtdE1vZGU7CS8qIGxpbmsgY2hlY2sgbW9kZSB0byBzZXQgKi8KKwlpbnQJCQlSbG10TmV0czsJLyogTnVtYmVyIG9mIG5ldHMgKi8KKwkKKwlTS19JT0MJCUlvQmFzZTsJCS8qIHJlZ2lzdGVyIHNldCBvZiBhZGFwdGVyICovCisJaW50CQlCb2FyZExldmVsOwkvKiBsZXZlbCBvZiBhY3RpdmUgaHcgaW5pdCAoMC0yKSAqLworCWNoYXIJCURldmljZVN0cls4MF07CS8qIGFkYXB0ZXIgc3RyaW5nIGZyb20gdnBkICovCisJU0tfVTMyCQlBbGxvY0ZsYWc7CS8qIGZsYWcgYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgcGNpX2RldgkqUGNpRGV2OwkvKiBmb3IgYWNjZXNzIHRvIHBjaSBjb25maWcgc3BhY2UgKi8KKwlTS19VMzIJCVBjaURldklkOwkvKiBwY2kgZGV2aWNlIGlkICovCisJc3RydWN0IFNLX05FVF9ERVZJQ0UJKmRldlsyXTsJLyogcG9pbnRlciB0byBkZXZpY2Ugc3RydWN0ICovCisJY2hhcgkJTmFtZVszMF07CS8qIGRyaXZlciBuYW1lICovCisKKwlpbnQJCVJ4QnVmU2l6ZTsJLyogbGVuZ3RoIG9mIHJlY2VpdmUgYnVmZmVycyAqLworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbGludXggJ25ldHN0YXQgLWknIHN0YXRpc3RpY3MgKi8KKwlpbnQJCUluZGV4OwkJLyogaW50ZXJuYWwgYm9hcmQgaW5kZXggbnVtYmVyICovCisKKwkvKiBhZGFwdGVyIFJBTSBzaXplcyBmb3IgcXVldWVzIG9mIGFjdGl2ZSBwb3J0ICovCisJaW50CQlSeFF1ZXVlU2l6ZTsJLyogbWVtb3J5IHVzZWQgZm9yIHJlY2VpdmUgcXVldWUgKi8KKwlpbnQJCVR4U1F1ZXVlU2l6ZTsJLyogbWVtb3J5IHVzZWQgZm9yIHN5bmMuIHR4IHF1ZXVlICovCisJaW50CQlUeEFRdWV1ZVNpemU7CS8qIG1lbW9yeSB1c2VkIGZvciBhc3luYy4gdHggcXVldWUgKi8KKworCWludAkJUHJvbWlzY0NvdW50OwkvKiBwcm9taXNjdW91cyBtb2RlIGNvdW50ZXIgICovCisJaW50CQlBbGxNdWx0aUNvdW50OyAgLyogYWxsbXVsdGljYXN0IG1vZGUgY291bnRlciAqLworCWludAkJTXVsdGljQ291bnQ7CS8qIG51bWJlciBvZiBkaWZmZXJlbnQgTUMgICAgKi8KKwkJCQkJLyogIGFkZHJlc3NlcyBmb3IgdGhpcyBib2FyZCAqLworCQkJCQkvKiAgKG1heSBiZSBtb3JlIHRoYW4gSFcgY2FuKSovCisKKwlpbnQJCUhXUmV2aXNpb247CS8qIEhhcmR3YXJlIHJldmlzaW9uICovCisJaW50CQlBY3RpdmVQb3J0OwkvKiB0aGUgYWN0aXZlIFhNQUMgcG9ydCAqLworCWludAkJTWF4UG9ydHM7CQkvKiBudW1iZXIgb2YgYWN0aXZhdGVkIHBvcnRzICovCisJaW50CQlUeERlc2NyUGVyUmluZzsJLyogIyBvZiBkZXNjcmlwdG9ycyBwZXIgdHggcmluZyAqLworCWludAkJUnhEZXNjclBlclJpbmc7CS8qICMgb2YgZGVzY3JpcHRvcnMgcGVyIHJ4IHJpbmcgKi8KKworCWNhZGRyX3QJCXBEZXNjck1lbTsJLyogUG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciBhcmVhICovCisJZG1hX2FkZHJfdAlwRGVzY3JNZW1ETUE7CS8qIFBDSSBETUEgYWRkcmVzcyBvZiBhcmVhICovCisKKwkvKiB0aGUgcG9ydCBzdHJ1Y3R1cmVzIHdpdGggZGVzY3JpcHRvciByaW5ncyAqLworCVRYX1BPUlQJCVR4UG9ydFtTS19NQVhfTUFDU11bMl07CisJUlhfUE9SVAkJUnhQb3J0W1NLX01BWF9NQUNTXTsKKworCXVuc2lnbmVkIGludAlDc09mczE7CQkvKiBmb3IgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJQ3NPZnMyOwkJLyogZm9yIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisJU0tfVTMyCQlDc09mczsJCS8qIGZvciBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCisJU0tfQk9PTAkJQ2hlY2tRdWV1ZTsJLyogY2hlY2sgZXZlbnQgcXVldWUgc29vbiAqLworCVNLX1RJTUVSICAgICAgICBEcnZDbGVhbnVwVGltZXI7LyogdG8gY2hlY2sgZm9yIHBlbmRpbmcgZGVzY3JpcHRvcnMgKi8KKwlESU1fSU5GTyAgICAgICAgRHluSXJxTW9kSW5mbzsgIC8qIGFsbCBkYXRhIHJlbGF0ZWQgdG8gRElNICovCisKKwkvKiBPbmx5IGZvciB0ZXN0cyAqLworCWludAkJUG9ydFVwOworCWludAkJUG9ydERvd247CisJaW50CQlDaGlwc2V0VHlwZTsJLyogIENoaXBzZXQgZmFtaWx5IHR5cGUgCisJCQkJCSAqICAwID09IEdlbmVzaXMgZmFtaWx5IHN1cHBvcnQKKwkJCQkJICogIDEgPT0gWXVrb24gZmFtaWx5IHN1cHBvcnQKKwkJCQkJICovCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJU0tfVTMyCQlEaWFnTW9kZUFjdGl2ZTsJCS8qIGlzIGRpYWcgYWN0aXZlPwkqLworCVNLX0JPT0wJCURpYWdGbG93Q3RybDsJCS8qIGZvciBjb250cm9sIHB1cnBvc2VzCSovCisJU0tfUE5NSV9TVFJVQ1RfREFUQSBQbm1pQmFja3VwOwkJLyogYmFja3VwIHN0cnVjdHVyZSBmb3IgYWxsIFBubWktRGF0YSAqLworCVNLX0JPT0wgICAgICAgICBXYXNJZlVwW1NLX01BWF9NQUNTXTsgICAvKiBmb3IgT3BlbkNsb3NlIHdoaWxlIAorCQkJCQkJICogRElBRyBpcyBidXN5IHdpdGggTklDIAorCQkJCQkJICovCisjZW5kaWYKKworfTsKKworCisjZW5kaWYgLyogX19JTkNfU0tEUlYyTkRfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tlcnJvci5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA2MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZXJyb3IuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tlcnJvci5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMTMgMTc6MjU6MTMgJAorICogUHVycG9zZToJU0sgc3BlY2lmaWMgRXJyb3IgbG9nIHN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSU5DX1NLRVJST1JfSF8KKyNkZWZpbmUgX0lOQ19TS0VSUk9SX0hfCisKKy8qCisgKiBEZWZpbmUgRXJyb3IgQ2xhc3NlcworICovCisjZGVmaW5lCVNLX0VSUkNMX09USEVSCQkoMCkJCS8qIE90aGVyIGVycm9yICovCisjZGVmaW5lCVNLX0VSUkNMX0NPTkZJRwkJKDFMPDwwKQkvKiBDb25maWd1cmF0aW9uIGVycm9yICovCisjZGVmaW5lCVNLX0VSUkNMX0lOSVQJCSgxTDw8MSkJLyogSW5pdGlhbGl6YXRpb24gZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfTk9SRVMJCSgxTDw8MikJLyogT3V0IG9mIFJlc291cmNlcyBlcnJvciAqLworI2RlZmluZQlTS19FUlJDTF9TVwkJCSgxTDw8MykJLyogSW50ZXJuYWwgU29mdHdhcmUgZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfSFcJCQkoMUw8PDQpCS8qIEhhcmR3YXJlIEZhaWx1cmUgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfQ09NTQkJKDFMPDw1KQkvKiBDb21tdW5pY2F0aW9uIGVycm9yICovCisKKworLyoKKyAqIERlZmluZSBFcnJvciBDb2RlIEJhc2VzCisgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9STE1UCQkgMTAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBSTE1UICovCisjZGVmaW5lCVNLX0VSUkJBU0VfSFdJTklUCSAyMDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIEhXSW5pdCAqLworI2RlZmluZQlTS19FUlJCQVNFX1ZQRAkJIDMwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgVlBEICovCisjZGVmaW5lCVNLX0VSUkJBU0VfUE5NSQkJIDQwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgUE5NSSAqLworI2RlZmluZQlTS19FUlJCQVNFX0NTVU0JCSA1MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIENoZWNrc3VtICovCisjZGVmaW5lCVNLX0VSUkJBU0VfU0lSUQkJIDYwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgU3BlY2lhbCBJUlEgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9JMkMJCSA3MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIEkyQyBtb2R1bGUgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9RVUVVRQkgODAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBTY2hlZHVsZXIgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9BRERSCQkgOTAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBBZGRyZXNzIG1vZHVsZSAqLworI2RlZmluZSBTS19FUlJCQVNFX1BFQ1AJCTEwMDAgICAgLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIFBFQ1AgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9EUlYJCTExMDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIERyaXZlciAqLworCisjZW5kaWYJLyogX0lOQ19TS0VSUk9SX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWRydi5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZkNGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VkcnYuaApAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZWRydi5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjEwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA3LzA0IDEyOjI1OjAxICQKKyAqIFB1cnBvc2U6CUludGVyZmFjZSB3aXRoIHRoZSBkcml2ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0dFRFJWX0hfCisjZGVmaW5lIF9fSU5DX1NLR0VEUlZfSF8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERlZmluZSB0aGUgZHJpdmVyIGV2ZW50cy4KKyAqIFVzdWFsbHkgdGhlIGV2ZW50cyBhcmUgZGVmaW5lZCBieSB0aGUgZGVzdGluYXRpb24gbW9kdWxlLgorICogSW4gY2FzZSBvZiB0aGUgZHJpdmVyIHdlIHB1dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZXZlbnRzIGhlcmUuCisgKi8KKyNkZWZpbmUgU0tfRFJWX1BPUlRfUkVTRVQJCSAxCS8qIFRoZSBwb3J0IG5lZWRzIHRvIGJlIHJlc2V0ICovCisjZGVmaW5lIFNLX0RSVl9ORVRfVVAgICAJCSAyCS8qIFRoZSBuZXQgaXMgb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgU0tfRFJWX05FVF9ET1dOCQkJIDMJLyogVGhlIG5ldCBpcyBkb3duICovCisjZGVmaW5lIFNLX0RSVl9TV0lUQ0hfU09GVAkJIDQJLyogUG9ydHMgc3dpdGNoIHdpdGggYm90aCBsaW5rcyBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgU0tfRFJWX1NXSVRDSF9IQVJECQkgNQkvKiBQb3J0IHN3aXRjaCBkdWUgdG8gbGluayBmYWlsdXJlICovCisjZGVmaW5lIFNLX0RSVl9STE1UX1NFTkQJCSA2CS8qIFNlbmQgYSBSTE1UIHBhY2tldCAqLworI2RlZmluZSBTS19EUlZfQURBUF9GQUlMCQkgNwkvKiBUaGUgd2hvbGUgYWRhcHRlciBmYWlscyAqLworI2RlZmluZSBTS19EUlZfUE9SVF9GQUlMCQkgOAkvKiBPbmUgcG9ydCBmYWlscyAqLworI2RlZmluZSBTS19EUlZfU1dJVENIX0lOVEVSTgkgOQkvKiBQb3J0IHN3aXRjaCBieSB0aGUgZHJpdmVyIGl0c2VsZiAqLworI2RlZmluZSBTS19EUlZfUE9XRVJfRE9XTgkJMTAJLyogUG93ZXIgZG93biBtb2RlICovCisjZGVmaW5lIFNLX0RSVl9USU1FUgkJCTExCS8qIFRpbWVyIGZvciBmcmVlIHVzZSAqLworI2lmZGVmIFNLX05PX1JMTVQKKyNkZWZpbmUgU0tfRFJWX0xJTktfVVAgIAkJMTIJLyogTGluayBVcCBldmVudCBmb3IgZHJpdmVyICovCisjZGVmaW5lIFNLX0RSVl9MSU5LX0RPV04JCTEzCS8qIExpbmsgRG93biBldmVudCBmb3IgZHJpdmVyICovCisjZW5kaWYKKyNkZWZpbmUgU0tfRFJWX0RPV05TSElGVF9ERVQJMTQJLyogRG93bnNoaWZ0IDQtUGFpciAvIDItUGFpciAoWVVLT04gb25seSkgKi8KKyNlbmRpZiAvKiBfX0lOQ19TS0dFRFJWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWh3LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyODJiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHcuaApAQCAtMCwwICsxLDIxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlaHcuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41NiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8yMyAwOTowMTowMCAkCisgKiBQdXJwb3NlOglEZWZpbmVzIGFuZCBNYWNyb3MgZm9yIHRoZSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgUHJvZHVjdCBGYW1pbHkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0dFSFdfSAorI2RlZmluZSBfX0lOQ19TS0dFSFdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQklUXzMxCQkoMVVMIDw8IDMxKQorI2RlZmluZSBCSVRfMzAJCSgxTCA8PCAzMCkKKyNkZWZpbmUgQklUXzI5CQkoMUwgPDwgMjkpCisjZGVmaW5lIEJJVF8yOAkJKDFMIDw8IDI4KQorI2RlZmluZSBCSVRfMjcJCSgxTCA8PCAyNykKKyNkZWZpbmUgQklUXzI2CQkoMUwgPDwgMjYpCisjZGVmaW5lIEJJVF8yNQkJKDFMIDw8IDI1KQorI2RlZmluZSBCSVRfMjQJCSgxTCA8PCAyNCkKKyNkZWZpbmUgQklUXzIzCQkoMUwgPDwgMjMpCisjZGVmaW5lIEJJVF8yMgkJKDFMIDw8IDIyKQorI2RlZmluZSBCSVRfMjEJCSgxTCA8PCAyMSkKKyNkZWZpbmUgQklUXzIwCQkoMUwgPDwgMjApCisjZGVmaW5lIEJJVF8xOQkJKDFMIDw8IDE5KQorI2RlZmluZSBCSVRfMTgJCSgxTCA8PCAxOCkKKyNkZWZpbmUgQklUXzE3CQkoMUwgPDwgMTcpCisjZGVmaW5lIEJJVF8xNgkJKDFMIDw8IDE2KQorI2RlZmluZSBCSVRfMTUJCSgxTCA8PCAxNSkKKyNkZWZpbmUgQklUXzE0CQkoMUwgPDwgMTQpCisjZGVmaW5lIEJJVF8xMwkJKDFMIDw8IDEzKQorI2RlZmluZSBCSVRfMTIJCSgxTCA8PCAxMikKKyNkZWZpbmUgQklUXzExCQkoMUwgPDwgMTEpCisjZGVmaW5lIEJJVF8xMAkJKDFMIDw8IDEwKQorI2RlZmluZSBCSVRfOQkJKDFMIDw8IDkpCisjZGVmaW5lIEJJVF84CQkoMUwgPDwgOCkKKyNkZWZpbmUgQklUXzcJCSgxTCA8PCA3KQorI2RlZmluZSBCSVRfNgkJKDFMIDw8IDYpCisjZGVmaW5lIEJJVF81CQkoMUwgPDwgNSkKKyNkZWZpbmUgQklUXzQJCSgxTCA8PCA0KQorI2RlZmluZSBCSVRfMwkJKDFMIDw8IDMpCisjZGVmaW5lIEJJVF8yCQkoMUwgPDwgMikKKyNkZWZpbmUgQklUXzEJCSgxTCA8PCAxKQorI2RlZmluZSBCSVRfMAkJMUwKKworI2RlZmluZSBCSVRfMTVTCQkoMVUgPDwgMTUpCisjZGVmaW5lIEJJVF8xNFMJCSgxIDw8IDE0KQorI2RlZmluZSBCSVRfMTNTCQkoMSA8PCAxMykKKyNkZWZpbmUgQklUXzEyUwkJKDEgPDwgMTIpCisjZGVmaW5lIEJJVF8xMVMJCSgxIDw8IDExKQorI2RlZmluZSBCSVRfMTBTCQkoMSA8PCAxMCkKKyNkZWZpbmUgQklUXzlTCQkoMSA8PCA5KQorI2RlZmluZSBCSVRfOFMJCSgxIDw8IDgpCisjZGVmaW5lIEJJVF83UyAJCSgxIDw8IDcpCisjZGVmaW5lIEJJVF82UwkJKDEgPDwgNikKKyNkZWZpbmUgQklUXzVTCQkoMSA8PCA1KQorI2RlZmluZSBCSVRfNFMJCSgxIDw8IDQpCisjZGVmaW5lIEJJVF8zUwkJKDEgPDwgMykKKyNkZWZpbmUgQklUXzJTCQkoMSA8PCAyKQorI2RlZmluZSBCSVRfMVMJCSgxIDw8IDEpCisjZGVmaW5lIEJJVF8wUwkJMQorCisjZGVmaW5lIFNISUZUMzEoeCkJKCh4KSA8PCAzMSkKKyNkZWZpbmUgU0hJRlQzMCh4KQkoKHgpIDw8IDMwKQorI2RlZmluZSBTSElGVDI5KHgpCSgoeCkgPDwgMjkpCisjZGVmaW5lIFNISUZUMjgoeCkJKCh4KSA8PCAyOCkKKyNkZWZpbmUgU0hJRlQyNyh4KQkoKHgpIDw8IDI3KQorI2RlZmluZSBTSElGVDI2KHgpCSgoeCkgPDwgMjYpCisjZGVmaW5lIFNISUZUMjUoeCkJKCh4KSA8PCAyNSkKKyNkZWZpbmUgU0hJRlQyNCh4KQkoKHgpIDw8IDI0KQorI2RlZmluZSBTSElGVDIzKHgpCSgoeCkgPDwgMjMpCisjZGVmaW5lIFNISUZUMjIoeCkJKCh4KSA8PCAyMikKKyNkZWZpbmUgU0hJRlQyMSh4KQkoKHgpIDw8IDIxKQorI2RlZmluZSBTSElGVDIwKHgpCSgoeCkgPDwgMjApCisjZGVmaW5lIFNISUZUMTkoeCkJKCh4KSA8PCAxOSkKKyNkZWZpbmUgU0hJRlQxOCh4KQkoKHgpIDw8IDE4KQorI2RlZmluZSBTSElGVDE3KHgpCSgoeCkgPDwgMTcpCisjZGVmaW5lIFNISUZUMTYoeCkJKCh4KSA8PCAxNikKKyNkZWZpbmUgU0hJRlQxNSh4KQkoKHgpIDw8IDE1KQorI2RlZmluZSBTSElGVDE0KHgpCSgoeCkgPDwgMTQpCisjZGVmaW5lIFNISUZUMTMoeCkJKCh4KSA8PCAxMykKKyNkZWZpbmUgU0hJRlQxMih4KQkoKHgpIDw8IDEyKQorI2RlZmluZSBTSElGVDExKHgpCSgoeCkgPDwgMTEpCisjZGVmaW5lIFNISUZUMTAoeCkJKCh4KSA8PCAxMCkKKyNkZWZpbmUgU0hJRlQ5KHgpCSgoeCkgPDwgOSkKKyNkZWZpbmUgU0hJRlQ4KHgpCSgoeCkgPDwgOCkKKyNkZWZpbmUgU0hJRlQ3KHgpCSgoeCkgPDwgNykKKyNkZWZpbmUgU0hJRlQ2KHgpCSgoeCkgPDwgNikKKyNkZWZpbmUgU0hJRlQ1KHgpCSgoeCkgPDwgNSkKKyNkZWZpbmUgU0hJRlQ0KHgpCSgoeCkgPDwgNCkKKyNkZWZpbmUgU0hJRlQzKHgpCSgoeCkgPDwgMykKKyNkZWZpbmUgU0hJRlQyKHgpCSgoeCkgPDwgMikKKyNkZWZpbmUgU0hJRlQxKHgpCSgoeCkgPDwgMSkKKyNkZWZpbmUgU0hJRlQwKHgpCSgoeCkgPDwgMCkKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gU3BhY2UgaGVhZGVyCisgKiBTaW5jZSB0aGlzIG1vZHVsZSBpcyB1c2VkIGZvciBkaWZmZXJlbnQgT1MnLCB0aG9zZSBtYXkgYmUKKyAqIGR1cGxpY2F0ZSBvbiBzb21lIG9mIHRoZW0gKGUuZy4gTGludXgpLiBCdXQgdG8ga2VlcCB0aGUKKyAqIGNvbW1vbiBzb3VyY2UsIHdlIGhhdmUgdG8gbGl2ZSB3aXRoIHRoaXMuLi4KKyAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lECTB4MDAJLyogMTYgYml0CVZlbmRvciBJRCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lECTB4MDIJLyogMTYgYml0CURldmljZSBJRCAqLworI2RlZmluZSBQQ0lfQ09NTUFORAkJMHgwNAkvKiAxNiBiaXQJQ29tbWFuZCAqLworI2RlZmluZSBQQ0lfU1RBVFVTCQkweDA2CS8qIDE2IGJpdAlTdGF0dXMgKi8KKyNkZWZpbmUgUENJX1JFVl9JRAkJMHgwOAkvKiAgOCBiaXQJUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgUENJX0NMQVNTX0NPREUJMHgwOQkvKiAyNCBiaXQJQ2xhc3MgQ29kZSAqLworI2RlZmluZSBQQ0lfQ0FDSEVfTFNaCTB4MGMJLyogIDggYml0CUNhY2hlIExpbmUgU2l6ZSAqLworI2RlZmluZSBQQ0lfTEFUX1RJTQkJMHgwZAkvKiAgOCBiaXQJTGF0ZW5jeSBUaW1lciAqLworI2RlZmluZSBQQ0lfSEVBREVSX1QJMHgwZQkvKiAgOCBiaXQJSGVhZGVyIFR5cGUgKi8KKyNkZWZpbmUgUENJX0JJU1QJCTB4MGYJLyogIDggYml0CUJ1aWx0LWluIHNlbGZ0ZXN0ICovCisjZGVmaW5lIFBDSV9CQVNFXzFTVAkweDEwCS8qIDMyIGJpdAkxc3QgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9CQVNFXzJORAkweDE0CS8qIDMyIGJpdAkybmQgQmFzZSBhZGRyZXNzICovCisJLyogQnl0ZSAweDE4Li4weDJiOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfU1VCX1ZJRAkJMHgyYwkvKiAxNiBiaXQJU3Vic3lzdGVtIFZlbmRvciBJRCAqLworI2RlZmluZSBQQ0lfU1VCX0lECQkweDJlCS8qIDE2IGJpdAlTdWJzeXN0ZW0gSUQgKi8KKyNkZWZpbmUgUENJX0JBU0VfUk9NCTB4MzAJLyogMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9DQVBfUFRSCQkweDM0CS8qICA4IGJpdCAJQ2FwYWJpbGl0aWVzIFB0ciAqLworCS8qIEJ5dGUgMHgzNS4uMHgzYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lSUV9MSU5FCTB4M2MJLyogIDggYml0CUludGVycnVwdCBMaW5lICovCisjZGVmaW5lIFBDSV9JUlFfUElOCQkweDNkCS8qICA4IGJpdAlJbnRlcnJ1cHQgUGluICovCisjZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qICA4IGJpdAlNaW5fR250ICovCisjZGVmaW5lIFBDSV9NQVhfTEFUCQkweDNmCS8qICA4IGJpdAlNYXhfTGF0ICovCisJLyogRGV2aWNlIERlcGVuZGVudCBSZWdpb24gKi8KKyNkZWZpbmUgUENJX09VUl9SRUdfMQkweDQwCS8qIDMyIGJpdCAJT3VyIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUENJX09VUl9SRUdfMgkweDQ0CS8qIDMyIGJpdCAJT3VyIFJlZ2lzdGVyIDIgKi8KKwkvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lvbiAqLworI2RlZmluZSBQQ0lfUE1fQ0FQX0lECTB4NDgJLyogIDggYml0IAlQb3dlciBNYW5hZ2VtZW50IENhcC4gSUQgKi8KKyNkZWZpbmUgUENJX1BNX05JVEVNCTB4NDkJLyogIDggYml0IAlOZXh0IEl0ZW0gUHRyICovCisjZGVmaW5lIFBDSV9QTV9DQVBfUkVHCTB4NGEJLyogMTYgYml0IAlQb3dlciBNYW5hZ2VtZW50IENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfUE1fQ1RMX1NUUwkweDRjCS8qIDE2IGJpdCAJUG93ZXIgTWFuYWcuIENvbnRyb2wvU3RhdHVzICovCisJLyogQnl0ZSAweDRlOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fREFUX1JFRwkweDRmCS8qICA4IGJpdCAJUG93ZXIgTWFuYWcuIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiBWUEQgUmVnaW9uICovCisjZGVmaW5lIFBDSV9WUERfQ0FQX0lECTB4NTAJLyogIDggYml0IAlWUEQgQ2FwLiBJRCAqLworI2RlZmluZSBQQ0lfVlBEX05JVEVNCTB4NTEJLyogIDggYml0IAlOZXh0IEl0ZW0gUHRyICovCisjZGVmaW5lIFBDSV9WUERfQURSX1JFRwkweDUyCS8qIDE2IGJpdCAJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1ZQRF9EQVRfUkVHCTB4NTQJLyogMzIgYml0IAlWUEQgRGF0YSBSZWdpc3RlciAqLworCS8qIEJ5dGUgMHg1OC4uMHg1OToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1NFUl9MRF9DVFJMCTB4NWEJLyogMTYgYml0IAlTRUVQUk9NIExvYWRlciBDdHJsIChZVUtPTiBvbmx5KSAqLworCS8qIEJ5dGUgMHg1Yy4uMHhmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqIEkyQyBBZGRyZXNzIChQQ0kgQ29uZmlnKQorICoKKyAqIE5vdGU6IFRoZSB0ZW1wZXJhdHVyZSBhbmQgdm9sdGFnZSBzZW5zb3JzIGFyZSByZWxvY2F0ZWQgb24gYSBkaWZmZXJlbnQKKyAqCSBJMkMgYnVzLgorICovCisjZGVmaW5lIEkyQ19BRERSX1ZQRAkweGEwCS8qIEkyQyBhZGRyZXNzIGZvciB0aGUgVlBEIEVFUFJPTSAqLworCisvKgorICogRGVmaW5lIEJpdHMgYW5kIFZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzCisgKi8KKy8qCVBDSV9DT01NQU5ECTE2IGJpdAlDb21tYW5kICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JTlRfRElTCQlCSVRfMTBTCQkvKiBJbnRlcnJ1cHQgSU5UeCMgZGlzYWJsZSAoUENJIDIuMykgKi8KKyNkZWZpbmUgUENJX0ZCVEVOCQlCSVRfOVMJCS8qIEZhc3QgQmFjay1Uby1CYWNrIGVuYWJsZSAqLworI2RlZmluZSBQQ0lfU0VSUkVOCQlCSVRfOFMJCS8qIFNFUlIgZW5hYmxlICovCisjZGVmaW5lIFBDSV9BRFNURVAJCUJJVF83UwkJLyogQWRkcmVzcyBTdGVwcGluZyAqLworI2RlZmluZSBQQ0lfUEVSUkVOCQlCSVRfNlMJCS8qIFBhcml0eSBSZXBvcnQgUmVzcG9uc2UgZW5hYmxlICovCisjZGVmaW5lIFBDSV9WR0FfU05PT1AJQklUXzVTCQkvKiBWR0EgcGFsZXR0ZSBzbm9vcCAqLworI2RlZmluZSBQQ0lfTVdJRU4JCUJJVF80UwkJLyogTWVtb3J5IHdyaXRlIGFuIGludiBjeWNsIGVuYSAqLworI2RlZmluZSBQQ0lfU0NZQ0VOCQlCSVRfM1MJCS8qIFNwZWNpYWwgQ3ljbGUgZW5hYmxlICovCisjZGVmaW5lIFBDSV9CTUVOCQlCSVRfMlMJCS8qIEJ1cyBNYXN0ZXIgZW5hYmxlICovCisjZGVmaW5lIFBDSV9NRU1FTgkJQklUXzFTCQkvKiBNZW1vcnkgU3BhY2UgQWNjZXNzIGVuYWJsZSAqLworI2RlZmluZSBQQ0lfSU9FTgkJQklUXzBTCQkvKiBJL08gU3BhY2UgQWNjZXNzIGVuYWJsZSAqLworCisjZGVmaW5lIFBDSV9DT01NQU5EX1ZBTAkoUENJX0ZCVEVOIHwgUENJX1NFUlJFTiB8IFBDSV9QRVJSRU4gfCBQQ0lfTVdJRU4gfFwKKwkJCQkJCSBQQ0lfQk1FTiB8IFBDSV9NRU1FTiB8IFBDSV9JT0VOKQorCisvKglQQ0lfU1RBVFVTCTE2IGJpdAlTdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BFUlIJCUJJVF8xNVMJCS8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBQQ0lfU0VSUgkJQklUXzE0UwkJLyogU2lnbmFsZWQgU0VSUiAqLworI2RlZmluZSBQQ0lfUk1BQk9SVAkJQklUXzEzUwkJLyogUmVjZWl2ZWQgTWFzdGVyIEFib3J0ICovCisjZGVmaW5lIFBDSV9SVEFCT1JUCQlCSVRfMTJTCQkvKiBSZWNlaXZlZCBUYXJnZXQgQWJvcnQgKi8KKwkJCQkJCQkJLyogQml0IDExOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfREVWU0VMCQkoMzw8OSkJCS8qIEJpdCAxMC4uIDk6CURFVlNFTCBUaW1pbmcgKi8KKyNkZWZpbmUgUENJX0RFVl9GQVNUCSgwPDw5KQkJLyoJCWZhc3QgKi8KKyNkZWZpbmUgUENJX0RFVl9NRURJVU0JKDE8PDkpCQkvKgkJbWVkaXVtICovCisjZGVmaW5lIFBDSV9ERVZfU0xPVwkoMjw8OSkJCS8qCQlzbG93ICovCisjZGVmaW5lIFBDSV9EQVRBUEVSUglCSVRfOFMJCS8qIERBVEEgUGFyaXR5IGVycm9yIGRldGVjdGVkICovCisjZGVmaW5lIFBDSV9GQjJCQ0FQCQlCSVRfN1MJCS8qIEZhc3QgQmFjay10by1CYWNrIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUENJX1VERgkJCUJJVF82UwkJLyogVXNlciBEZWZpbmVkIEZlYXR1cmVzICovCisjZGVmaW5lIFBDSV82Nk1IWkNBUAlCSVRfNVMJCS8qIDY2IE1IeiBQQ0kgYnVzIGNsb2NrIGNhcGFibGUgKi8KKyNkZWZpbmUgUENJX05FV0NBUAkJQklUXzRTCQkvKiBOZXcgY2FwLiBsaXN0IGltcGxlbWVudGVkICovCisjZGVmaW5lIFBDSV9JTlRfU1RBVAlCSVRfM1MJCS8qIEludGVycnVwdCBJTlR4IyBTdGF0dXMgKFBDSSAyLjMpICovCisJCQkJCQkJCS8qIEJpdCAgMi4uIDA6CXJlc2VydmVkICovCisKKyNkZWZpbmUgUENJX0VSUkJJVFMJKFBDSV9QRVJSIHwgUENJX1NFUlIgfCBQQ0lfUk1BQk9SVCB8IFBDSV9SVEFCT1JUIHxcCisJCQlQQ0lfREFUQVBFUlIpCisKKy8qCVBDSV9DTEFTU19DT0RFCTI0IGJpdAlDbGFzcyBDb2RlICovCisvKglCeXRlIDI6CQlCYXNlIENsYXNzCQkoMDIpICovCisvKglCeXRlIDE6CQlTdWJDbGFzcwkJKDAwKSAqLworLyoJQnl0ZSAwOgkJUHJvZ3JhbW1pbmcgSW50ZXJmYWNlCSgwMCkgKi8KKworLyoJUENJX0NBQ0hFX0xTWgk4IGJpdAlDYWNoZSBMaW5lIFNpemUgKi8KKy8qCVBvc3NpYmxlIHZhbHVlczogMCwyLDQsOCwxNiwzMiw2NCwxMjgJKi8KKworLyoJUENJX0hFQURFUl9UCTggYml0CUhlYWRlciBUeXBlICovCisjZGVmaW5lIFBDSV9IRF9NRl9ERVYJQklUXzdTCS8qIDA9IHNpbmdsZSwgMT0gbXVsdGktZnVuYyBkZXYgKi8KKyNkZWZpbmUgUENJX0hEX1RZUEUJCTB4N2YJLyogQml0IDYuLjA6CUhlYWRlciBMYXlvdXQgMD0gbm9ybWFsICovCisKKy8qCVBDSV9CSVNUCTggYml0CUJ1aWx0LWluIHNlbGZ0ZXN0ICovCisvKglCdWlsdC1pbiBTZWxmIHRlc3Qgbm90IHN1cHBvcnRlZCAob3B0aW9uYWwpICovCisKKy8qCVBDSV9CQVNFXzFTVAkzMiBiaXQJMXN0IEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBQQ0lfTUVNU0laRQkJMHg0MDAwTAkJLyogdXNlIDE2IGtCIE1lbW9yeSBCYXNlICovCisjZGVmaW5lIFBDSV9NRU1CQVNFX01TSyAweGZmZmZjMDAwTAkvKiBCaXQgMzEuLjE0OglNZW1vcnkgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9NRU1TSVpFX01TSyAweDAwMDAzZmYwTAkvKiBCaXQgMTMuLiA0OglNZW1vcnkgU2l6ZSBSZXEuICovCisjZGVmaW5lIFBDSV9QUkVGRU4JCUJJVF8zCQkvKiBQcmVmZXRjaGFibGUgKi8KKyNkZWZpbmUgUENJX01FTV9UWVAJCSgzTDw8MikJCS8qIEJpdAkyLi4gMToJTWVtb3J5IFR5cGUgKi8KKyNkZWZpbmUgUENJX01FTTMyQklUCSgwTDw8MSkJCS8qIEJhc2UgYWRkciBhbnl3aGVyZSBpbiAzMiBCaXQgcmFuZ2UgKi8KKyNkZWZpbmUgUENJX01FTTFNCQkoMUw8PDEpCQkvKiBCYXNlIGFkZHIgYmVsb3cgMSBNZWdhQnl0ZSAqLworI2RlZmluZSBQQ0lfTUVNNjRCSVQJKDJMPDwxKQkJLyogQmFzZSBhZGRyIGFueXdoZXJlIGluIDY0IEJpdCByYW5nZSAqLworI2RlZmluZSBQQ0lfTUVNU1BBQ0UJQklUXzAJCS8qIE1lbW9yeSBTcGFjZSBJbmRpY2F0b3IgKi8KKworLyoJUENJX0JBU0VfMk5ECTMyIGJpdAkybmQgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9JT0JBU0UJCTB4ZmZmZmZmMDBMCS8qIEJpdCAzMS4uIDg6CUkvTyBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0lPU0laRQkJMHgwMDAwMDBmY0wJLyogQml0CTcuLiAyOglJL08gU2l6ZSBSZXF1aXJlbWVudHMgKi8KKwkJCQkJCQkJCS8qIEJpdAkxOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfSU9TUEFDRQkJQklUXzAJCS8qIEkvTyBTcGFjZSBJbmRpY2F0b3IgKi8KKworLyoJUENJX0JBU0VfUk9NCTMyIGJpdAlFeHBhbnNpb24gUk9NIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBQQ0lfUk9NQkFTRV9NU0sJMHhmZmZlMDAwMEwJLyogQml0IDMxLi4xNzoJUk9NIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBQQ0lfUk9NQkFTRV9TSVoJKDB4MWNMPDwxNCkJLyogQml0IDE2Li4xNDoJVHJlYXQgYXMgQmFzZSBvciBTaXplICovCisjZGVmaW5lIFBDSV9ST01TSVpFCQkoMHgzOEw8PDExKQkvKiBCaXQgMTMuLjExOglST00gU2l6ZSBSZXF1aXJlbWVudHMgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMC4uIDE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01FTgkJQklUXzAJCS8qIEFkZHJlc3MgRGVjb2RlIGVuYWJsZSAqLworCisvKiBEZXZpY2UgRGVwZW5kZW50IFJlZ2lvbiAqLworLyoJUENJX09VUl9SRUdfMQkJMzIgYml0CU91ciBSZWdpc3RlciAxICovCisJCQkJCQkJCQkvKiBCaXQgMzEuLjI5OglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUEhZX0NPTUEJQklUXzI4CQkvKiBTZXQgUEhZIHRvIENvbWEgTW9kZSAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1RFU1RfQ0FMCUJJVF8yNwkJLyogVGVzdCBQQ0kgYnVmZmVyIGNhbGliLiAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX0VOX0NBTAkJQklUXzI2CQkvKiBFbmFibGUgUENJIGJ1ZmZlciBjYWxpYi4gKFlVS09OIG9ubHkpICovCisjZGVmaW5lIFBDSV9WSU8JCQlCSVRfMjUJCS8qIFBDSSBJL08gVm9sdGFnZSwgMCA9IDMuM1YsIDEgPSA1ViAqLworI2RlZmluZSBQQ0lfRElTX0JPT1QJQklUXzI0CQkvKiBEaXNhYmxlIEJPT1QgdmlhIFJPTSAqLworI2RlZmluZSBQQ0lfRU5fSU8JCUJJVF8yMwkJLyogTWFwcGluZyB0byBJL08gc3BhY2UgKi8KKyNkZWZpbmUgUENJX0VOX0ZQUk9NCUJJVF8yMgkJLyogRW5hYmxlIEZMQVNIIG1hcHBpbmcgdG8gbWVtb3J5ICovCisJCQkJCQkJCQkvKgkJMSA9IE1hcCBGbGFzaCB0byBtZW1vcnkgKi8KKwkJCQkJCQkJCS8qCQkwID0gRGlzYWJsZSBhZGRyLiBkZWMgKi8KKyNkZWZpbmUgUENJX1BBR0VTSVpFCSgzTDw8MjApCS8qIEJpdCAyMS4uMjA6CUZMQVNIIFBhZ2UgU2l6ZQkqLworI2RlZmluZSBQQ0lfUEFHRV8xNgkJKDBMPDwyMCkJLyoJCTE2IGsgcGFnZXMJKi8KKyNkZWZpbmUgUENJX1BBR0VfMzJLCSgxTDw8MjApCS8qCQkzMiBrIHBhZ2VzCSovCisjZGVmaW5lIFBDSV9QQUdFXzY0SwkoMkw8PDIwKQkvKgkJNjQgayBwYWdlcwkqLworI2RlZmluZSBQQ0lfUEFHRV8xMjhLCSgzTDw8MjApCS8qCQkxMjggayBwYWdlcwkqLworCQkJCQkJCQkJLyogQml0IDE5OglyZXNlcnZlZAkqLworI2RlZmluZSBQQ0lfUEFHRVJFRwkJKDdMPDwxNikJLyogQml0IDE4Li4xNjoJUGFnZSBSZWdpc3RlcgkqLworI2RlZmluZSBQQ0lfTk9UQVIJCUJJVF8xNQkJLyogTm8gdHVybmFyb3VuZCBjeWNsZSAqLworI2RlZmluZSBQQ0lfRk9SQ0VfQkUJQklUXzE0CQkvKiBBc3NlcnQgYWxsIEJFcyBvbiBNUiAqLworI2RlZmluZSBQQ0lfRElTX01STAkJQklUXzEzCQkvKiBEaXNhYmxlIE1lbSBSZWFkIExpbmUgKi8KKyNkZWZpbmUgUENJX0RJU19NUk0JCUJJVF8xMgkJLyogRGlzYWJsZSBNZW0gUmVhZCBNdWx0aXBsZSAqLworI2RlZmluZSBQQ0lfRElTX01XSQkJQklUXzExCQkvKiBEaXNhYmxlIE1lbSBXcml0ZSAmIEludmFsaWRhdGUgKi8KKyNkZWZpbmUgUENJX0RJU0NfQ0xTCUJJVF8xMAkJLyogRGlzYzogY2FjaGVMc3ogYm91bmQgKi8KKyNkZWZpbmUgUENJX0JVUlNUX0RJUwlCSVRfOQkJLyogQnVyc3QgRGlzYWJsZSAqLworI2RlZmluZSBQQ0lfRElTX1BDSV9DTEsJQklUXzgJCS8qIERpc2FibGUgUENJIGNsb2NrIGRyaXZpbmcgKi8KKyNkZWZpbmUgUENJX1NLRVdfREFTCSgweGZMPDw0KQkvKiBCaXQJNy4uIDQ6CVNrZXcgQ3RybCwgREFTIEV4dCAqLworI2RlZmluZSBQQ0lfU0tFV19CQVNFCTB4ZkwJCS8qIEJpdAkzLi4gMDoJU2tldyBDdHJsLCBCYXNlCSovCisKKworLyoJUENJX09VUl9SRUdfMgkJMzIgYml0CU91ciBSZWdpc3RlciAyICovCisjZGVmaW5lIFBDSV9WUERfV1JfVEhSCSgweGZmTDw8MjQpCS8qIEJpdCAzMS4uMjQ6CVZQRCBXcml0ZSBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgUENJX0RFVl9TRUwJCSgweDdmTDw8MTcpCS8qIEJpdCAyMy4uMTc6CUVFUFJPTSBEZXZpY2UgU2VsZWN0ICovCisjZGVmaW5lIFBDSV9WUERfUk9NX1NaCSg3TDw8MTQpCS8qIEJpdCAxNi4uMTQ6CVZQRCBST00gU2l6ZQkqLworCQkJCQkJCQkJLyogQml0IDEzLi4xMjoJcmVzZXJ2ZWQJKi8KKyNkZWZpbmUgUENJX1BBVENIX0RJUgkoMHhmTDw8OCkJLyogQml0IDExLi4gODoJRXh0IFBhdGNoZXMgZGlyIDMuLjAgKi8KKyNkZWZpbmUgUENJX1BBVENIX0RJUl8zCUJJVF8xMQorI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzIJQklUXzEwCisjZGVmaW5lIFBDSV9QQVRDSF9ESVJfMQlCSVRfOQorI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzAJQklUXzgKKyNkZWZpbmUgUENJX0VYVF9QQVRDSFMJKDB4Zkw8PDQpCS8qIEJpdAk3Li4gNDoJRXh0ZW5kZWQgUGF0Y2hlcyAzLi4wICovCisjZGVmaW5lIFBDSV9FWFRfUEFUQ0hfMwlCSVRfNworI2RlZmluZSBQQ0lfRVhUX1BBVENIXzIJQklUXzYKKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8xCUJJVF81CisjZGVmaW5lIFBDSV9FWFRfUEFUQ0hfMAlCSVRfNAorI2RlZmluZSBQQ0lfRU5fRFVNTVlfUkQJQklUXzMJCS8qIEVuYWJsZSBEdW1teSBSZWFkICovCisjZGVmaW5lIFBDSV9SRVZfREVTQwlCSVRfMgkJLyogUmV2ZXJzZSBEZXNjLiBCeXRlcyAqLworCQkJCQkJCQkJLyogQml0CTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9VU0VEQVRBNjQJQklUXzAJCS8qIFVzZSA2NEJpdCBEYXRhIGJ1cyBleHQgKi8KKworCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lvbiAqLworLyoJUENJX1BNX0NBUF9SRUcJCTE2IGJpdAlQb3dlciBNYW5hZ2VtZW50IENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfUE1FX1NVUF9NU0sJKDB4MWY8PDExKQkvKiBCaXQgMTUuLjExOglQTSBFdmVudCBTdXBwb3J0IE1hc2sgKi8KKyNkZWZpbmUgUENJX1BNRV9EM0NfU1VQCUJJVF8xNVMJCS8qIFBNRSBmcm9tIEQzY29sZCBTdXBwb3J0IChpZiBWYXV4KSAqLworI2RlZmluZSBQQ0lfUE1FX0QzSF9TVVAJQklUXzE0UwkJLyogUE1FIGZyb20gRDNob3QgU3VwcG9ydCAqLworI2RlZmluZSBQQ0lfUE1FX0QyX1NVUAlCSVRfMTNTCQkvKiBQTUUgZnJvbSBEMiBTdXBwb3J0ICovCisjZGVmaW5lIFBDSV9QTUVfRDFfU1VQCUJJVF8xMlMJCS8qIFBNRSBmcm9tIEQxIFN1cHBvcnQgKi8KKyNkZWZpbmUgUENJX1BNRV9EMF9TVVAJQklUXzExUwkJLyogUE1FIGZyb20gRDAgU3VwcG9ydCAqLworI2RlZmluZSBQQ0lfUE1fRDJfU1VQCUJJVF8xMFMJCS8qIEQyIFN1cHBvcnQgaW4gMzMgTUh6IG1vZGUgKi8KKyNkZWZpbmUgUENJX1BNX0QxX1NVUAlCSVRfOVMJCS8qIEQxIFN1cHBvcnQgKi8KKwkJCQkJCQkJCS8qIEJpdAk4Li4gNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1BNX0RTSQkJQklUXzVTCQkvKiBEZXZpY2UgU3BlY2lmaWMgSW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgUENJX1BNX0FQUwkJQklUXzRTCQkvKiBBdXhpYWxpYXJ5IFBvd2VyIFNvdXJjZSAqLworI2RlZmluZSBQQ0lfUE1FX0NMT0NLCUJJVF8zUwkJLyogUE0gRXZlbnQgQ2xvY2sgKi8KKyNkZWZpbmUgUENJX1BNX1ZFUl9NU0sJCTcJCS8qIEJpdAkyLi4gMDoJUE0gUENJIFNwZWMuIHZlcnNpb24gKi8KKworLyoJUENJX1BNX0NUTF9TVFMJCTE2IGJpdAlQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wvU3RhdHVzICovCisjZGVmaW5lIFBDSV9QTUVfU1RBVFVTCUJJVF8xNVMJCS8qIFBNRSBTdGF0dXMgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIFBDSV9QTV9EQVRfU0NMCSgzPDwxMykJCS8qIEJpdCAxNC4uMTM6CURhdGEgUmVnLiBzY2FsaW5nIGZhY3RvciAqLworI2RlZmluZSBQQ0lfUE1fREFUX1NFTAkoMHhmPDw5KQkvKiBCaXQgMTIuLiA5OglQTSBkYXRhIHNlbGVjdG9yIGZpZWxkICovCisjZGVmaW5lIFBDSV9QTUVfRU4JCUJJVF84UwkJLyogRW5hYmxlIFBNRSMgZ2VuZXJhdGlvbiAoWVVLT04gb25seSkgKi8KKwkJCQkJCQkJCS8qIEJpdAk3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX01TSwkzCQkvKiBCaXQJMS4uIDA6CVBvd2VyIE1hbmFnZW1lbnQgU3RhdGUgKi8KKworI2RlZmluZSBQQ0lfUE1fU1RBVEVfRDAJCTAJCS8qIEQwOglPcGVyYXRpb25hbCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QxCQkxCQkvKiBEMToJKFlVS09OIG9ubHkpICovCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMgkJMgkJLyogRDI6CShZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ0lfUE1fU1RBVEVfRDMgCTMJCS8qIEQzOglIT1QsIFBvd2VyIERvd24gYW5kIFJlc2V0ICovCisKKy8qIFZQRCBSZWdpb24gKi8KKy8qCVBDSV9WUERfQURSX1JFRwkJMTYgYml0CVZQRCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9WUERfRkxBRwlCSVRfMTVTCQkvKiBzdGFydHMgVlBEIHJkL3dyIGN5Y2xlICovCisjZGVmaW5lIFBDSV9WUERfQURSX01TSwkweDdmZmZMCQkvKiBCaXQgMTQuLiAwOglWUEQgYWRkcmVzcyBtYXNrICovCisKKy8qCUNvbnRyb2wgUmVnaXN0ZXIgRmlsZSAoQWRkcmVzcyBNYXApICovCisKKy8qCisgKglCYW5rIDAKKyAqLworI2RlZmluZSBCMF9SQVAJCQkweDAwMDAJLyogIDggYml0CVJlZ2lzdGVyIEFkZHJlc3MgUG9ydCAqLworCS8qIDB4MDAwMSAtIDB4MDAwMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjBfQ1RTVAkJCTB4MDAwNAkvKiAxNiBiaXQJQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfTEVECQkJMHgwMDA2CS8qICA4IEJpdAlMRUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfUE9XRVJfQ1RSTAkweDAwMDcJLyogIDggQml0CVBvd2VyIENvbnRyb2wgcmVnIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBCMF9JU1JDCQkJMHgwMDA4CS8qIDMyIGJpdAlJbnRlcnJ1cHQgU291cmNlIFJlZ2lzdGVyICovCisjZGVmaW5lIEIwX0lNU0sJCQkweDAwMGMJLyogMzIgYml0CUludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIEIwX0hXRV9JU1JDCQkweDAwMTAJLyogMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBTcmMgUmVnICovCisjZGVmaW5lIEIwX0hXRV9JTVNLCQkweDAwMTQJLyogMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBNYXNrIFJlZyAqLworI2RlZmluZSBCMF9TUF9JU1JDCQkweDAwMTgJLyogMzIgYml0CVNwZWNpYWwgSW50ZXJydXB0IFNvdXJjZSBSZWcgKi8KKwkvKiAweDAwMWM6CQlyZXNlcnZlZCAqLworCisvKiBCMCBYTUFDIDEgcmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisjZGVmaW5lIEIwX1hNMV9JTVNLCQkweDAwMjAJLyogMTYgYml0IHIvdwlYTUFDIDEgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIqLworCS8qIDB4MDAyMiAtIDB4MDAyNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjBfWE0xX0lTUkMJCTB4MDAyOAkvKiAxNiBiaXQgcm8JWE1BQyAxIEludGVycnVwdCBTdGF0dXMgUmVnICovCisJLyogMHgwMDJhIC0gMHgwMDJmOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTFfUEhZX0FERFIgMHgwMDMwCS8qIDE2IGJpdCByL3cJWE1BQyAxIFBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJLyogMHgwMDMyIC0gMHgwMDMzOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTFfUEhZX0RBVEEgMHgwMDM0CS8qIDE2IGJpdCByL3cJWE1BQyAxIFBIWSBEYXRhIFJlZ2lzdGVyICovCisJLyogMHgwMDM2IC0gMHgwMDNmOglyZXNlcnZlZCAqLworCisvKiBCMCBYTUFDIDIgcmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisjZGVmaW5lIEIwX1hNMl9JTVNLCQkweDAwNDAJLyogMTYgYml0IHIvdwlYTUFDIDIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIqLworCS8qIDB4MDA0MiAtIDB4MDA0NzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjBfWE0yX0lTUkMJCTB4MDA0OAkvKiAxNiBiaXQgcm8JWE1BQyAyIEludGVycnVwdCBTdGF0dXMgUmVnICovCisJLyogMHgwMDRhIC0gMHgwMDRmOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTJfUEhZX0FERFIgMHgwMDUwCS8qIDE2IGJpdCByL3cJWE1BQyAyIFBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJLyogMHgwMDUyIC0gMHgwMDUzOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTJfUEhZX0RBVEEgMHgwMDU0CS8qIDE2IGJpdCByL3cJWE1BQyAyIFBIWSBEYXRhIFJlZ2lzdGVyICovCisJLyogMHgwMDU2IC0gMHgwMDVmOglyZXNlcnZlZCAqLworCisvKiBCTVUgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXJzICovCisjZGVmaW5lIEIwX1IxX0NTUgkJMHgwMDYwCS8qIDMyIGJpdAlCTVUgQ3RybC9TdGF0IFJ4IFF1ZXVlIDEgKi8KKyNkZWZpbmUgQjBfUjJfQ1NSCQkweDAwNjQJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMiAqLworI2RlZmluZSBCMF9YUzFfQ1NSCQkweDAwNjgJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAxICovCisjZGVmaW5lIEIwX1hBMV9DU1IJCTB4MDA2YwkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAxKi8KKyNkZWZpbmUgQjBfWFMyX0NTUgkJMHgwMDcwCS8qIDMyIGJpdAlCTVUgQ3RybC9TdGF0IFN5bmMgVHggUXVldWUgMiAqLworI2RlZmluZSBCMF9YQTJfQ1NSCQkweDAwNzQJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgQXN5bmMgVHggUXVldWUgMiovCisJLyogMHgwMDc4IC0gMHgwMDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAxCisgKgktIGNvbXBsZXRlbHkgZW1wdHkgKHRoaXMgaXMgdGhlIFJBUCBCbG9jayB3aW5kb3cpCisgKglOb3RlOiBpZiBSQVAgPSAxIHRoaXMgcGFnZSBpcyByZXNlcnZlZAorICovCisKKy8qCisgKglCYW5rIDIKKyAqLworLyogTkEgcmVnID0gNDggYml0IE5ldHdvcmsgQWRkcmVzcyBSZWdpc3RlciwgM3gxNiBvciA4eDggYml0IHJlYWRhYmxlICovCisjZGVmaW5lIEIyX01BQ18xCQkweDAxMDAJLyogTkEgcmVnCSBNQUMgQWRkcmVzcyAxICovCisJLyogMHgwMTA2IC0gMHgwMTA3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9NQUNfMgkJMHgwMTA4CS8qIE5BIHJlZwkgTUFDIEFkZHJlc3MgMiAqLworCS8qIDB4MDEwZSAtIDB4MDEwZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfTUFDXzMJCTB4MDExMAkvKiBOQSByZWcJIE1BQyBBZGRyZXNzIDMgKi8KKwkvKiAweDAxMTYgLSAweDAxMTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0NPTk5fVFlQCQkweDAxMTgJLyogIDggYml0CUNvbm5lY3RvciB0eXBlICovCisjZGVmaW5lIEIyX1BNRF9UWVAJCTB4MDExOQkvKiAgOCBiaXQJUE1EIHR5cGUgKi8KKyNkZWZpbmUgQjJfTUFDX0NGRwkJMHgwMTFhCS8qICA4IGJpdAlNQUMgQ29uZmlndXJhdGlvbiAvIENoaXAgUmV2aXNpb24gKi8KKyNkZWZpbmUgQjJfQ0hJUF9JRAkJMHgwMTFiCS8qICA4IGJpdCAJQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KKwkvKiBFcHJvbSByZWdpc3RlcnMgYXJlIGN1cnJlbnRseSBvZiBubyB1c2UgKi8KKyNkZWZpbmUgQjJfRV8wCQkJMHgwMTFjCS8qICA4IGJpdAlFUFJPTSBCeXRlIDAgKGV4dC4gU1JBTSBzaXplICovCisjZGVmaW5lIEIyX0VfMQkJCTB4MDExZAkvKiAgOCBiaXQJRVBST00gQnl0ZSAxIChQSFkgdHlwZSkgKi8KKyNkZWZpbmUgQjJfRV8yCQkJMHgwMTFlCS8qICA4IGJpdAlFUFJPTSBCeXRlIDIgKi8KKyNkZWZpbmUgQjJfRV8zCQkJMHgwMTFmCS8qICA4IGJpdAlFUFJPTSBCeXRlIDMgKi8KKyNkZWZpbmUgQjJfRkFSCQkJMHgwMTIwCS8qIDMyIGJpdAlGbGFzaC1Qcm9tIEFkZHIgUmVnL0NudCAqLworI2RlZmluZSBCMl9GRFAJCQkweDAxMjQJLyogIDggYml0CUZsYXNoLVByb20gRGF0YSBQb3J0ICovCisJLyogMHgwMTI1IC0gMHgwMTI3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9MRF9DVFJMCQkweDAxMjgJLyogIDggYml0CUVQUk9NIGxvYWRlciBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0xEX1RFU1QJCTB4MDEyOQkvKiAgOCBiaXQJRVBST00gbG9hZGVyIHRlc3QgcmVnaXN0ZXIgKi8KKwkvKiAweDAxMmEgLSAweDAxMmY6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1RJX0lOSQkJMHgwMTMwCS8qIDMyIGJpdAlUaW1lciBJbml0IFZhbHVlICovCisjZGVmaW5lIEIyX1RJX1ZBTAkJMHgwMTM0CS8qIDMyIGJpdAlUaW1lciBWYWx1ZSAqLworI2RlZmluZSBCMl9USV9DVFJMCQkweDAxMzgJLyogIDggYml0CVRpbWVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQjJfVElfVEVTVAkJMHgwMTM5CS8qICA4IEJpdAlUaW1lciBUZXN0ICovCisJLyogMHgwMTNhIC0gMHgwMTNmOglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9JUlFNX0lOSQkJMHgwMTQwCS8qIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBJbml0IFJlZy4qLworI2RlZmluZSBCMl9JUlFNX1ZBTAkJMHgwMTQ0CS8qIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBWYWx1ZSAqLworI2RlZmluZSBCMl9JUlFNX0NUUkwJMHgwMTQ4CS8qICA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBDb250cm9sICovCisjZGVmaW5lIEIyX0lSUU1fVEVTVAkweDAxNDkJLyogIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKyNkZWZpbmUgQjJfSVJRTV9NU0sgCTB4MDE0YwkvKiAzMiBiaXQJSVJRIE1vZGVyYXRpb24gTWFzayAqLworI2RlZmluZSBCMl9JUlFNX0hXRV9NU0sgMHgwMTUwCS8qIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBIVyBFcnJvciBNYXNrICovCisJLyogMHgwMTU0IC0gMHgwMTU3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9UU1RfQ1RSTDEJMHgwMTU4CS8qICA4IGJpdAlUZXN0IENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBCMl9UU1RfQ1RSTDIJMHgwMTU5CS8qICA4IGJpdAlUZXN0IENvbnRyb2wgUmVnaXN0ZXIgMiAqLworCS8qIDB4MDE1YSAtIDB4MDE1YjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfR1BfSU8JCTB4MDE1YwkvKiAzMiBiaXQJR2VuZXJhbCBQdXJwb3NlIEkvTyBSZWdpc3RlciAqLworI2RlZmluZSBCMl9JMkNfQ1RSTAkJMHgwMTYwCS8qIDMyIGJpdAlJMkMgSFcgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBCMl9JMkNfREFUQQkJMHgwMTY0CS8qIDMyIGJpdAlJMkMgSFcgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBCMl9JMkNfSVJRCQkweDAxNjgJLyogMzIgYml0CUkyQyBIVyBJUlEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjJfSTJDX1NXCQkweDAxNmMJLyogMzIgYml0CUkyQyBTVyBQb3J0IFJlZ2lzdGVyICovCisKKy8qIEJsaW5rIFNvdXJjZSBDb3VudGVyIChHRU5FU0lTIG9ubHkpICovCisjZGVmaW5lIEIyX0JTQ19JTkkJCTB4MDE3MAkvKiAzMiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgSW5pdCBWYWwgKi8KKyNkZWZpbmUgQjJfQlNDX1ZBTAkJMHgwMTc0CS8qIDMyIGJpdAlCbGluayBTb3VyY2UgQ291bnRlciBWYWx1ZSAqLworI2RlZmluZSBCMl9CU0NfQ1RSTAkJMHgwMTc4CS8qICA4IGJpdAlCbGluayBTb3VyY2UgQ291bnRlciBDb250cm9sICovCisjZGVmaW5lIEIyX0JTQ19TVEFUCQkweDAxNzkJLyogIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFN0YXR1cyAqLworI2RlZmluZSBCMl9CU0NfVFNUCQkweDAxN2EJLyogMTYgYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFRlc3QgUmVnICovCisJLyogMHgwMTdjIC0gMHgwMTdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAzCisgKi8KKy8qIFJBTSBSYW5kb20gUmVnaXN0ZXJzICovCisjZGVmaW5lIEIzX1JBTV9BRERSCQkweDAxODAJLyogMzIgYml0CVJBTSBBZGRyZXNzLCB0byByZWFkIG9yIHdyaXRlICovCisjZGVmaW5lIEIzX1JBTV9EQVRBX0xPCTB4MDE4NAkvKiAzMiBiaXQJUkFNIERhdGEgV29yZCAobG93IGRXb3JkKSAqLworI2RlZmluZSBCM19SQU1fREFUQV9ISQkweDAxODgJLyogMzIgYml0CVJBTSBEYXRhIFdvcmQgKGhpZ2ggZFdvcmQpICovCisJLyogMHgwMThjIC0gMHgwMThmOglyZXNlcnZlZCAqLworCisvKiBSQU0gSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworLyoKKyAqIFRoZSBIVy1TcGVjLiBjYWxscyB0aGlzIHJlZ2lzdGVycyBUaW1lb3V0IFZhbHVlIDAuLjExLiBCdXQgdGhpcyBuYW1lcyBhcmUKKyAqIG5vdCB1c2FibGUgaW4gU1cuIFBsZWFzZSBub3RpY2UgdGhlc2UgYXJlIE5PVCByZWFsIHRpbWVvdXRzLCB0aGVzZSBhcmUKKyAqIHRoZSBudW1iZXIgb2YgcVdvcmRzIHRyYW5zZmVycmVkIGNvbnRpbnVvdXNseS4KKyAqLworI2RlZmluZSBCM19SSV9XVE9fUjEJMHgwMTkwCS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFIxCQkoVE8wKSAqLworI2RlZmluZSBCM19SSV9XVE9fWEExCTB4MDE5MQkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBYQTEJKFRPMSkgKi8KKyNkZWZpbmUgQjNfUklfV1RPX1hTMQkweDAxOTIJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgWFMxCShUTzIpICovCisjZGVmaW5lIEIzX1JJX1JUT19SMQkweDAxOTMJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgUjEJCShUTzMpICovCisjZGVmaW5lIEIzX1JJX1JUT19YQTEJMHgwMTk0CS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFhBMQkoVE80KSAqLworI2RlZmluZSBCM19SSV9SVE9fWFMxCTB4MDE5NQkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBYUzEJKFRPNSkgKi8KKyNkZWZpbmUgQjNfUklfV1RPX1IyCTB4MDE5NgkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBSMgkJKFRPNikgKi8KKyNkZWZpbmUgQjNfUklfV1RPX1hBMgkweDAxOTcJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgWEEyCShUTzcpICovCisjZGVmaW5lIEIzX1JJX1dUT19YUzIJMHgwMTk4CS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFhTMgkoVE84KSAqLworI2RlZmluZSBCM19SSV9SVE9fUjIJMHgwMTk5CS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFIyCQkoVE85KSAqLworI2RlZmluZSBCM19SSV9SVE9fWEEyCTB4MDE5YQkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBYQTIJKFRPMTApKi8KKyNkZWZpbmUgQjNfUklfUlRPX1hTMgkweDAxOWIJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgWFMyCShUTzExKSovCisjZGVmaW5lIEIzX1JJX1RPX1ZBTAkweDAxOWMJLyogIDggYml0CUN1cnJlbnQgVGltZW91dCBDb3VudCBWYWwgKi8KKwkvKiAweDAxOWQgLSAweDAxOWY6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1JJX0NUUkwJCTB4MDFhMAkvKiAxNiBiaXQJUkFNIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEIzX1JJX1RFU1QJCTB4MDFhMgkvKiAgOCBiaXQJUkFNIEludGVyZmFjZSBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwMWEzIC0gMHgwMWFmOglyZXNlcnZlZCAqLworCisvKiBNQUMgQXJiaXRlciBSZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKy8qIHRoZXNlIGFyZSB0aGUgbm8uIG9mIHFXb3JkIHRyYW5zZmVycmVkIGNvbnRpbnVvdXNseSBhbmQgTk9UIHJlYWwgdGltZW91dHMgKi8KKyNkZWZpbmUgQjNfTUFfVE9JTklfUlgxCTB4MDFiMAkvKiAgOCBiaXQJVGltZW91dCBJbml0IFZhbCBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1RPSU5JX1JYMgkweDAxYjEJLyogIDggYml0CVRpbWVvdXQgSW5pdCBWYWwgUnggUGF0aCBNQUMgMiAqLworI2RlZmluZSBCM19NQV9UT0lOSV9UWDEJMHgwMWIyCS8qICA4IGJpdAlUaW1lb3V0IEluaXQgVmFsIFR4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfVE9JTklfVFgyCTB4MDFiMwkvKiAgOCBiaXQJVGltZW91dCBJbml0IFZhbCBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPVkFMX1JYMQkweDAxYjQJLyogIDggYml0CVRpbWVvdXQgVmFsdWUgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9UT1ZBTF9SWDIJMHgwMWI1CS8qICA4IGJpdAlUaW1lb3V0IFZhbHVlIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfVE9WQUxfVFgxCTB4MDFiNgkvKiAgOCBiaXQJVGltZW91dCBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPVkFMX1RYMgkweDAxYjcJLyogIDggYml0CVRpbWVvdXQgVmFsdWUgVHggUGF0aCBNQUMgMiAqLworI2RlZmluZSBCM19NQV9UT19DVFJMCTB4MDFiOAkvKiAxNiBiaXQJTUFDIEFyYml0ZXIgVGltZW91dCBDdHJsIFJlZyAqLworI2RlZmluZSBCM19NQV9UT19URVNUCTB4MDFiYQkvKiAxNiBiaXQJTUFDIEFyYml0ZXIgVGltZW91dCBUZXN0IFJlZyAqLworCS8qIDB4MDFiYyAtIDB4MDFiZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfTUFfUkNJTklfUlgxCTB4MDFjMAkvKiAgOCBiaXQJUmVjb3ZlcnkgSW5pdCBWYWwgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9SQ0lOSV9SWDIJMHgwMWMxCS8qICA4IGJpdAlSZWNvdmVyeSBJbml0IFZhbCBSeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDSU5JX1RYMQkweDAxYzIJLyogIDggYml0CVJlY292ZXJ5IEluaXQgVmFsIFR4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfUkNJTklfVFgyCTB4MDFjMwkvKiAgOCBiaXQJUmVjb3ZlcnkgSW5pdCBWYWwgVHggUGF0aCBNQUMgMiAqLworI2RlZmluZSBCM19NQV9SQ1ZBTF9SWDEJMHgwMWM0CS8qICA4IGJpdAlSZWNvdmVyeSBWYWx1ZSBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1JDVkFMX1JYMgkweDAxYzUJLyogIDggYml0CVJlY292ZXJ5IFZhbHVlIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfUkNWQUxfVFgxCTB4MDFjNgkvKiAgOCBiaXQJUmVjb3ZlcnkgVmFsdWUgVHggUGF0aCBNQUMgMiAqLworI2RlZmluZSBCM19NQV9SQ1ZBTF9UWDIJMHgwMWM3CS8qICA4IGJpdAlSZWNvdmVyeSBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDX0NUUkwJMHgwMWM4CS8qIDE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBDdHJsIFJlZyAqLworI2RlZmluZSBCM19NQV9SQ19URVNUCTB4MDFjYQkvKiAxNiBiaXQJTUFDIEFyYml0ZXIgUmVjb3ZlcnkgVGVzdCBSZWcgKi8KKwkvKiAweDAxY2MgLSAweDAxY2Y6CXJlc2VydmVkICovCisKKy8qIFBhY2tldCBBcmJpdGVyIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSAqLworLyogdGhlc2UgYXJlIHJlYWwgdGltZW91dHMgKi8KKyNkZWZpbmUgQjNfUEFfVE9JTklfUlgxCTB4MDFkMAkvKiAxNiBiaXQJVGltZW91dCBJbml0IFZhbCBSeCBQYXRoIE1BQyAxICovCisJLyogMHgwMWQyIC0gMHgwMWQzOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT0lOSV9SWDIJMHgwMWQ0CS8qIDE2IGJpdAlUaW1lb3V0IEluaXQgVmFsIFJ4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZDYgLSAweDAxZDc6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPSU5JX1RYMQkweDAxZDgJLyogMTYgYml0CVRpbWVvdXQgSW5pdCBWYWwgVHggUGF0aCBNQUMgMSAqLworCS8qIDB4MDFkYSAtIDB4MDFkYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfUEFfVE9JTklfVFgyCTB4MDFkYwkvKiAxNiBiaXQJVGltZW91dCBJbml0IFZhbCBUeCBQYXRoIE1BQyAyICovCisJLyogMHgwMWRlIC0gMHgwMWRmOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT1ZBTF9SWDEJMHgwMWUwCS8qIDE2IGJpdAlUaW1lb3V0IFZhbCBSeCBQYXRoIE1BQyAxICovCisJLyogMHgwMWUyIC0gMHgwMWUzOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT1ZBTF9SWDIJMHgwMWU0CS8qIDE2IGJpdAlUaW1lb3V0IFZhbCBSeCBQYXRoIE1BQyAyICovCisJLyogMHgwMWU2IC0gMHgwMWU3OglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT1ZBTF9UWDEJMHgwMWU4CS8qIDE2IGJpdAlUaW1lb3V0IFZhbCBUeCBQYXRoIE1BQyAxICovCisJLyogMHgwMWVhIC0gMHgwMWViOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT1ZBTF9UWDIJMHgwMWVjCS8qIDE2IGJpdAlUaW1lb3V0IFZhbCBUeCBQYXRoIE1BQyAyICovCisJLyogMHgwMWVlIC0gMHgwMWVmOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9DVFJMCTB4MDFmMAkvKiAxNiBiaXQJUGFja2V0IEFyYml0ZXIgQ3RybCBSZWdpc3RlciAqLworI2RlZmluZSBCM19QQV9URVNUCTB4MDFmMgkvKiAxNiBiaXQJUGFja2V0IEFyYml0ZXIgVGVzdCBSZWdpc3RlciAqLworCS8qIDB4MDFmNCAtIDB4MDFmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgNCAtIDUKKyAqLworLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzICovCisjZGVmaW5lIFRYQV9JVElfSU5JCQkweDAyMDAJLyogMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBJbml0IFZhbCovCisjZGVmaW5lIFRYQV9JVElfVkFMCQkweDAyMDQJLyogMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBWYWx1ZSAqLworI2RlZmluZSBUWEFfTElNX0lOSQkJMHgwMjA4CS8qIDMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBJbml0IFZhbCAqLworI2RlZmluZSBUWEFfTElNX1ZBTAkJMHgwMjBjCS8qIDMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBWYWx1ZSAqLworI2RlZmluZSBUWEFfQ1RSTAkJMHgwMjEwCS8qICA4IGJpdAlUeCBBcmJpdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhBX1RFU1QJCTB4MDIxMQkvKiAgOCBiaXQJVHggQXJiaXRlciBUZXN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFRYQV9TVEFUCQkweDAyMTIJLyogIDggYml0CVR4IEFyYml0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisJLyogMHgwMjEzIC0gMHgwMjdmOglyZXNlcnZlZCAqLworCS8qIDB4MDI4MCAtIDB4MDI5MjoJTUFDIDIgKi8KKwkvKiAweDAyMTMgLSAweDAyN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDYKKyAqLworLyogRXh0ZXJuYWwgcmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisjZGVmaW5lIEI2X0VYVF9SRUcJCTB4MDMwMAorCisvKgorICoJQmFuayA3CisgKi8KKy8qIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZpbGUgKGxvd2VyIGhhbGYpICovCisjZGVmaW5lIEI3X0NGR19TUEMJCTB4MDM4MAorCisvKgorICoJQmFuayA4IC0gMTUKKyAqLworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWUgUmVnaXN0ZXJzLCB1c2UgUV9BRERSKCkgdG8gYWNjZXNzICovCisjZGVmaW5lIEI4X1FfUkVHUwkJMHgwNDAwCisKKy8qIFF1ZXVlIFJlZ2lzdGVyIE9mZnNldHMsIHVzZSBRX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgUV9ECQkweDAwCS8qIDgqMzIJYml0CUN1cnJlbnQgRGVzY3JpcHRvciAqLworI2RlZmluZSBRX0RBX0wJMHgyMAkvKiAzMiBiaXQJQ3VycmVudCBEZXNjcmlwdG9yIEFkZHJlc3MgTG93IGRXb3JkICovCisjZGVmaW5lIFFfREFfSAkweDI0CS8qIDMyIGJpdAlDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyBIaWdoIGRXb3JkICovCisjZGVmaW5lIFFfQUNfTAkweDI4CS8qIDMyIGJpdAlDdXJyZW50IEFkZHJlc3MgQ291bnRlciBMb3cgZFdvcmQgKi8KKyNkZWZpbmUgUV9BQ19ICTB4MmMJLyogMzIgYml0CUN1cnJlbnQgQWRkcmVzcyBDb3VudGVyIEhpZ2ggZFdvcmQgKi8KKyNkZWZpbmUgUV9CQwkweDMwCS8qIDMyIGJpdAlDdXJyZW50IEJ5dGUgQ291bnRlciAqLworI2RlZmluZSBRX0NTUgkweDM0CS8qIDMyIGJpdAlCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUV9GCQkweDM4CS8qIDMyIGJpdAlGbGFnIFJlZ2lzdGVyICovCisjZGVmaW5lIFFfVDEJMHgzYwkvKiAzMiBiaXQJVGVzdCBSZWdpc3RlciAxICovCisjZGVmaW5lIFFfVDFfVFIJMHgzYwkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFRyYW5zZmVyIFNNICovCisjZGVmaW5lIFFfVDFfV1IJMHgzZAkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFdyaXRlIERlc2NyaXB0b3IgU00gKi8KKyNkZWZpbmUgUV9UMV9SRAkweDNlCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgUmVhZCBEZXNjcmlwdG9yIFNNICovCisjZGVmaW5lIFFfVDFfU1YJMHgzZgkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFN1cGVydmlzb3IgU00gKi8KKyNkZWZpbmUgUV9UMgkweDQwCS8qIDMyIGJpdAlUZXN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgUV9UMwkweDQ0CS8qIDMyIGJpdAlUZXN0IFJlZ2lzdGVyIDMJKi8KKwkvKiAweDQ4IC0gMHg3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMTYgLSAyMworICovCisvKiBSQU0gQnVmZmVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBCMTZfUkFNX1JFR1MJMHgwODAwCisKKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXIgT2Zmc2V0cywgdXNlIFJCX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgUkJfU1RBUlQJCTB4MDAJLyogMzIgYml0CVJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBSQl9FTkQJCQkweDA0CS8qIDMyIGJpdAlSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisjZGVmaW5lIFJCX1dQCQkJMHgwOAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBXcml0ZSBQb2ludGVyICovCisjZGVmaW5lIFJCX1JQCQkJMHgwYwkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBSZWFkIFBvaW50ZXIgKi8KKyNkZWZpbmUgUkJfUlhfVVRQUAkJMHgxMAkvKiAzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisjZGVmaW5lIFJCX1JYX0xUUFAJCTB4MTQJLyogMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgUGF1c2UgUGFjayAqLworI2RlZmluZSBSQl9SWF9VVEhQCQkweDE4CS8qIDMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworI2RlZmluZSBSQl9SWF9MVEhQCQkweDFjCS8qIDMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworCS8qIDB4MTAgLSAweDFmOglyZXNlcnZlZCBhdCBUeCBSQU0gQnVmZmVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQl9QQwkJCTB4MjAJLyogMzIgYml0CVJBTSBCdWZmZXIgUGFja2V0IENvdW50ZXIgKi8KKyNkZWZpbmUgUkJfTEVWCQkJMHgyNAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBMZXZlbCBSZWdpc3RlciAqLworI2RlZmluZSBSQl9DVFJMCQkJMHgyOAkvKiAgOCBiaXQJUkFNIEJ1ZmZlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJCX1RTVDEJCQkweDI5CS8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSQl9UU1QyCQkJMHgyQQkvKiAgOCBiaXQJUkFNIEJ1ZmZlciBUZXN0IFJlZ2lzdGVyIDIgKi8KKwkvKiAweDJjIC0gMHg3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjQKKyAqLworLyoKKyAqIFJlY2VpdmUgTUFDIEZJRk8sIFJlY2VpdmUgTEVELCBhbmQgTGlua19TeW5jIHJlZ3MgKEdFTkVTSVMgb25seSkKKyAqIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzCisgKi8KKyNkZWZpbmUgUlhfTUZGX0VBCQkweDBjMDAJLyogMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgUlhfTUZGX1dQCQkweDBjMDQJLyogMzIgYml0IAlSZWNlaXZlIE1BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKwkvKiAweDBjMDggLSAweDBjMGI6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX01GRl9SUAkJMHgwYzBjCS8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworI2RlZmluZSBSWF9NRkZfUEMJCTB4MGMxMAkvKiAzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBQYWNrZXQgQ250ICovCisjZGVmaW5lIFJYX01GRl9MRVYJCTB4MGMxNAkvKiAzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBMZXZlbCAqLworI2RlZmluZSBSWF9NRkZfQ1RSTDEJMHgwYzE4CS8qIDE2IGJpdAlSZWNlaXZlIE1BQyBGSUZPIENvbnRyb2wgUmVnIDEqLworI2RlZmluZSBSWF9NRkZfU1RBVF9UTwkweDBjMWEJLyogIDggYml0CVJlY2VpdmUgTUFDIFN0YXR1cyBUaW1lb3V0ICovCisjZGVmaW5lIFJYX01GRl9USVNUX1RPCTB4MGMxYgkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgVGltZSBTdGFtcCBUaW1lb3V0ICovCisjZGVmaW5lIFJYX01GRl9DVFJMMgkweDBjMWMJLyogIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMiovCisjZGVmaW5lIFJYX01GRl9UU1QxCQkweDBjMWQJLyogIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWcgMSAqLworI2RlZmluZSBSWF9NRkZfVFNUMgkJMHgwYzFlCS8qICA4IGJpdAlSZWNlaXZlIE1BQyBGSUZPIFRlc3QgUmVnIDIgKi8KKwkvKiAweDBjMWY6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0xFRF9JTkkJCTB4MGMyMAkvKiAzMiBiaXQJUmVjZWl2ZSBMRUQgQ250IEluaXQgVmFsdWUgKi8KKyNkZWZpbmUgUlhfTEVEX1ZBTAkJMHgwYzI0CS8qIDMyIGJpdAlSZWNlaXZlIExFRCBDbnQgQ3VycmVudCBWYWx1ZSAqLworI2RlZmluZSBSWF9MRURfQ1RSTAkJMHgwYzI4CS8qICA4IGJpdAlSZWNlaXZlIExFRCBDbnQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUlhfTEVEX1RTVAkJMHgwYzI5CS8qICA4IGJpdAlSZWNlaXZlIExFRCBDbnQgVGVzdCBSZWdpc3RlciAqLworCS8qIDB4MGMyYSAtIDB4MGMyZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTE5LX1NZTkNfSU5JCTB4MGMzMAkvKiAzMiBiaXQJTGluayBTeW5jIENudCBJbml0IFZhbHVlICovCisjZGVmaW5lIExOS19TWU5DX1ZBTAkweDBjMzQJLyogMzIgYml0CUxpbmsgU3luYyBDbnQgQ3VycmVudCBWYWx1ZSAqLworI2RlZmluZSBMTktfU1lOQ19DVFJMCTB4MGMzOAkvKiAgOCBiaXQJTGluayBTeW5jIENudCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIExOS19TWU5DX1RTVAkweDBjMzkJLyogIDggYml0CUxpbmsgU3luYyBDbnQgVGVzdCBSZWdpc3RlciAqLworCS8qIDB4MGMzYSAtIDB4MGMzYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTE5LX0xFRF9SRUcJCTB4MGMzYwkvKiAgOCBiaXQJTGluayBMRUQgUmVnaXN0ZXIgKi8KKwkvKiAweDBjM2QgLSAweDBjM2Y6CXJlc2VydmVkICovCisKKy8qIFJlY2VpdmUgR01BQyBGSUZPIChZVUtPTiBvbmx5KSwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgUlhfR01GX0VBCQkweDBjNDAJLyogMzIgYml0CVJ4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworI2RlZmluZSBSWF9HTUZfQUZfVEhSCTB4MGM0NAkvKiAzMiBiaXQJUnggR01BQyBGSUZPIEFsbW9zdCBGdWxsIFRocmVzaC4gKi8KKyNkZWZpbmUgUlhfR01GX0NUUkxfVAkweDBjNDgJLyogMzIgYml0CVJ4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKyNkZWZpbmUgUlhfR01GX0ZMX01TSwkweDBjNGMJLyogMzIgYml0CVJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrICovCisjZGVmaW5lIFJYX0dNRl9GTF9USFIJMHgwYzUwCS8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gRmx1c2ggVGhyZXNob2xkICovCisJLyogMHgwYzU0IC0gMHgwYzVmOglyZXNlcnZlZCAqLworI2RlZmluZSBSWF9HTUZfV1AJCTB4MGM2MAkvKiAzMiBiaXQgCVJ4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisJLyogMHgwYzY0IC0gMHgwYzY3OglyZXNlcnZlZCAqLworI2RlZmluZSBSWF9HTUZfV0xFVgkJMHgwYzY4CS8qIDMyIGJpdCAJUnggR01BQyBGSUZPIFdyaXRlIExldmVsICovCisJLyogMHgwYzZjIC0gMHgwYzZmOglyZXNlcnZlZCAqLworI2RlZmluZSBSWF9HTUZfUlAJCTB4MGM3MAkvKiAzMiBiaXQgCVJ4IEdNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKwkvKiAweDBjNzQgLSAweDBjNzc6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9STEVWCQkweDBjNzgJLyogMzIgYml0IAlSeCBHTUFDIEZJRk8gUmVhZCBMZXZlbCAqLworCS8qIDB4MGM3YyAtIDB4MGM3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjUKKyAqLworCS8qIDB4MGM4MCAtIDB4MGNiZjoJTUFDIDIgKi8KKwkvKiAweDBjYzAgLSAweDBjZmY6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDI2CisgKi8KKy8qCisgKiBUcmFuc21pdCBNQUMgRklGTyBhbmQgVHJhbnNtaXQgTEVEIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSwKKyAqIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzCisgKi8KKyNkZWZpbmUgVFhfTUZGX0VBCQkweDBkMDAJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIEVuZCBBZGRyZXNzICovCisjZGVmaW5lIFRYX01GRl9XUAkJMHgwZDA0CS8qIDMyIGJpdCAJVHJhbnNtaXQgTUFDIEZJRk8gV1IgUG9pbnRlciAqLworI2RlZmluZSBUWF9NRkZfV1NQCQkweDBkMDgJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIFdSIFNoYWRvdyBQdHIgKi8KKyNkZWZpbmUgVFhfTUZGX1JQCQkweDBkMGMJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIFJEIFBvaW50ZXIgKi8KKyNkZWZpbmUgVFhfTUZGX1BDCQkweDBkMTAJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIFBhY2tldCBDbnQgKi8KKyNkZWZpbmUgVFhfTUZGX0xFVgkJMHgwZDE0CS8qIDMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBMZXZlbCAqLworI2RlZmluZSBUWF9NRkZfQ1RSTDEJMHgwZDE4CS8qIDE2IGJpdAlUcmFuc21pdCBNQUMgRklGTyBDdHJsIFJlZyAxICovCisjZGVmaW5lIFRYX01GRl9XQUYJCTB4MGQxYQkvKiAgOCBiaXQJVHJhbnNtaXQgTUFDIFdhaXQgYWZ0ZXIgZmx1c2ggKi8KKwkvKiAweDBjMWI6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX01GRl9DVFJMMgkweDBkMWMJLyogIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIEN0cmwgUmVnIDIgKi8KKyNkZWZpbmUgVFhfTUZGX1RTVDEJCTB4MGQxZAkvKiAgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gVGVzdCBSZWcgMSAqLworI2RlZmluZSBUWF9NRkZfVFNUMgkJMHgwZDFlCS8qICA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZyAyICovCisJLyogMHgwZDFmOglyZXNlcnZlZCAqLworI2RlZmluZSBUWF9MRURfSU5JCQkweDBkMjAJLyogMzIgYml0CVRyYW5zbWl0IExFRCBDbnQgSW5pdCBWYWx1ZSAqLworI2RlZmluZSBUWF9MRURfVkFMCQkweDBkMjQJLyogMzIgYml0CVRyYW5zbWl0IExFRCBDbnQgQ3VycmVudCBWYWwgKi8KKyNkZWZpbmUgVFhfTEVEX0NUUkwJCTB4MGQyOAkvKiAgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBDb250cm9sIFJlZyAqLworI2RlZmluZSBUWF9MRURfVFNUCQkweDBkMjkJLyogIDggYml0CVRyYW5zbWl0IExFRCBDbnQgVGVzdCBSZWcgKi8KKwkvKiAweDBkMmEgLSAweDBkM2Y6CXJlc2VydmVkICovCisKKy8qIFRyYW5zbWl0IEdNQUMgRklGTyAoWVVLT04gb25seSksIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzICovCisjZGVmaW5lIFRYX0dNRl9FQQkJMHgwZDQwCS8qIDMyIGJpdAlUeCBHTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfR01GX0FFX1RIUgkweDBkNDQJLyogMzIgYml0CVR4IEdNQUMgRklGTyBBbG1vc3QgRW1wdHkgVGhyZXNoLiovCisjZGVmaW5lIFRYX0dNRl9DVFJMX1QJMHgwZDQ4CS8qIDMyIGJpdAlUeCBHTUFDIEZJRk8gQ29udHJvbC9UZXN0ICovCisJLyogMHgwZDRjIC0gMHgwZDVmOglyZXNlcnZlZCAqLworI2RlZmluZSBUWF9HTUZfV1AJCTB4MGQ2MAkvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisjZGVmaW5lIFRYX0dNRl9XU1AJCTB4MGQ2NAkvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBTaGFkb3cgUHRyLiAqLworI2RlZmluZSBUWF9HTUZfV0xFVgkJMHgwZDY4CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIExldmVsICovCisJLyogMHgwZDZjIC0gMHgwZDZmOglyZXNlcnZlZCAqLworI2RlZmluZSBUWF9HTUZfUlAJCTB4MGQ3MAkvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKyNkZWZpbmUgVFhfR01GX1JTVFAJCTB4MGQ3NAkvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZXN0YXJ0IFBvaW50ZXIgKi8KKyNkZWZpbmUgVFhfR01GX1JMRVYJCTB4MGQ3OAkvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIExldmVsICovCisJLyogMHgwZDdjIC0gMHgwZDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyNworICovCisJLyogMHgwZDgwIC0gMHgwZGJmOglNQUMgMiAqLworCS8qIDB4MGRhYSAtIDB4MGRmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjgKKyAqLworLyogRGVzY3JpcHRvciBQb2xsIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBCMjhfRFBUX0lOSQkJMHgwZTAwCS8qIDI0IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgSW5pdCBWYWwgKi8KKyNkZWZpbmUgQjI4X0RQVF9WQUwJCTB4MGUwNAkvKiAyNCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN1cnIgVmFsICovCisjZGVmaW5lIEIyOF9EUFRfQ1RSTAkweDBlMDgJLyogIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBDdHJsIFJlZyAqLworCS8qIDB4MGUwOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjI4X0RQVF9UU1QJCTB4MGUwYQkvKiAgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIFRlc3QgUmVnICovCisJLyogMHgwZTBiOglyZXNlcnZlZCAqLworCisvKiBUaW1lIFN0YW1wIFRpbWVyIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKwkvKiAweDBlMTA6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfVElfU1RfVkFMCTB4MGUxNAkvKiAzMiBiaXQJVGltZSBTdGFtcCBUaW1lciBDdXJyIFZhbCAqLworI2RlZmluZSBHTUFDX1RJX1NUX0NUUkwJMHgwZTE4CS8qICA4IGJpdAlUaW1lIFN0YW1wIFRpbWVyIEN0cmwgUmVnICovCisJLyogMHgwZTE5OglyZXNlcnZlZCAqLworI2RlZmluZSBHTUFDX1RJX1NUX1RTVAkweDBlMWEJLyogIDggYml0CVRpbWUgU3RhbXAgVGltZXIgVGVzdCBSZWcgKi8KKwkvKiAweDBlMWIgLSAweDBlN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDI5CisgKi8KKwkvKiAweDBlODAgLSAweDBlZmM6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMwCisgKi8KKy8qIEdNQUMgYW5kIEdQSFkgQ29udHJvbCBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIEdNQUNfQ1RSTAkJMHgwZjAwCS8qIDMyIGJpdAlHTUFDIENvbnRyb2wgUmVnICovCisjZGVmaW5lIEdQSFlfQ1RSTAkJMHgwZjA0CS8qIDMyIGJpdAlHUEhZIENvbnRyb2wgUmVnICovCisjZGVmaW5lIEdNQUNfSVJRX1NSQwkweDBmMDgJLyogIDggYml0CUdNQUMgSW50ZXJydXB0IFNvdXJjZSBSZWcgKi8KKwkvKiAweDBmMDkgLSAweDBmMGI6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfSVJRX01TSwkweDBmMGMJLyogIDggYml0CUdNQUMgSW50ZXJydXB0IE1hc2sgUmVnICovCisJLyogMHgwZjBkIC0gMHgwZjBmOglyZXNlcnZlZCAqLworI2RlZmluZSBHTUFDX0xJTktfQ1RSTAkweDBmMTAJLyogMTYgYml0CUxpbmsgQ29udHJvbCBSZWcgKi8KKwkvKiAweDBmMTQgLSAweDBmMWY6CXJlc2VydmVkICovCisKKy8qIFdha2UtdXAgRnJhbWUgUGF0dGVybiBNYXRjaCBDb250cm9sIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKworI2RlZmluZSBXT0xfUkVHX09GRlMJMHgyMAkvKiBIVy1CdWc6IEFkZHJlc3MgaXMgKyAweDIwIGFnYWluc3Qgc3BlYy4gKi8KKworI2RlZmluZSBXT0xfQ1RSTF9TVEFUCTB4MGYyMAkvKiAxNiBiaXQJV09MIENvbnRyb2wvU3RhdHVzIFJlZyAqLworI2RlZmluZSBXT0xfTUFUQ0hfQ1RMCTB4MGYyMgkvKiAgOCBiaXQJV09MIE1hdGNoIENvbnRyb2wgUmVnICovCisjZGVmaW5lIFdPTF9NQVRDSF9SRVMJMHgwZjIzCS8qICA4IGJpdAlXT0wgTWF0Y2ggUmVzdWx0IFJlZyAqLworI2RlZmluZSBXT0xfTUFDX0FERFJfTE8JMHgwZjI0CS8qIDMyIGJpdAlXT0wgTUFDIEFkZHJlc3MgTG93ICovCisjZGVmaW5lIFdPTF9NQUNfQUREUl9ISQkweDBmMjgJLyogMTYgYml0CVdPTCBNQUMgQWRkcmVzcyBIaWdoICovCisjZGVmaW5lIFdPTF9QQVRUX1JQVFIJMHgwZjJjCS8qICA4IGJpdAlXT0wgUGF0dGVybiBSZWFkIFB0ciAqLworCisvKiB1c2UgdGhpcyBtYWNybyB0byBhY2Nlc3MgYWJvdmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdPTF9SRUcoUmVnKQkoKFJlZykgKyAocEFDLT5HSW5pLkdJV29sT2ZmcykpCisKKworLyogV09MIFBhdHRlcm4gTGVuZ3RoIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKworI2RlZmluZSBXT0xfUEFUVF9MRU5fTE8JMHgwZjMwCQkvKiAzMiBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDMuLjAgKi8KKyNkZWZpbmUgV09MX1BBVFRfTEVOX0hJCTB4MGYzNAkJLyogMjQgYml0CVdPTCBQYXR0ZXJuIExlbmd0aCA2Li40ICovCisKKy8qIFdPTCBQYXR0ZXJuIENvdW50ZXIgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisjZGVmaW5lIFdPTF9QQVRUX0NOVF8wCTB4MGYzOAkJLyogMzIgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgMy4uMCAqLworI2RlZmluZSBXT0xfUEFUVF9DTlRfNAkweDBmM2MJCS8qIDI0IGJpdAlXT0wgUGF0dGVybiBDb3VudGVyIDYuLjQgKi8KKwkvKiAweDBmNDAgLSAweDBmN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMxCisgKi8KKy8qIDB4MGY4MCAtIDB4MGZmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMzIJLSAzMworICovCisjZGVmaW5lIFdPTF9QQVRUX1JBTV8xCTB4MTAwMAkvKiAgV09MIFBhdHRlcm4gUkFNIExpbmsgMSAqLworCisvKgorICoJQmFuayAweDIyIC0gMHgzZgorICovCisvKiAweDExMDAgLSAweDFmZmY6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDB4NDAgLSAweDRmCisgKi8KKyNkZWZpbmUgQkFTRV9YTUFDXzEJCTB4MjAwMAkvKiBYTUFDIDEgcmVnaXN0ZXJzICovCisKKy8qCisgKglCYW5rIDB4NTAgLSAweDVmCisgKi8KKworI2RlZmluZSBCQVNFX0dNQUNfMQkJMHgyODAwCS8qIEdNQUMgMSByZWdpc3RlcnMgKi8KKworLyoKKyAqCUJhbmsgMHg2MCAtIDB4NmYKKyAqLworI2RlZmluZSBCQVNFX1hNQUNfMgkJMHgzMDAwCS8qIFhNQUMgMiByZWdpc3RlcnMgKi8KKworLyoKKyAqCUJhbmsgMHg3MCAtIDB4N2YKKyAqLworI2RlZmluZSBCQVNFX0dNQUNfMgkJMHgzODAwCS8qIEdNQUMgMiByZWdpc3RlcnMgKi8KKworLyoKKyAqCUNvbnRyb2wgUmVnaXN0ZXIgQml0IERlZmluaXRpb25zOgorICovCisvKglCMF9SQVAJCTggYml0CVJlZ2lzdGVyIEFkZHJlc3MgUG9ydCAqLworCQkJCQkJCQkvKiBCaXQgNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkFQX1JBUAkJCTB4M2YJLyogQml0IDYuLjA6CTAgPSBibG9jayAwLC4uLDZmID0gYmxvY2sgNmYgKi8KKworLyoJQjBfQ1RTVAkJCTE2IGJpdAlDb250cm9sL1N0YXR1cyByZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBDU19DTEtfUlVOX0hPVAlCSVRfMTNTCQkvKiBDTEtfUlVOIGhvdCBtLiAoWVVLT04tTGl0ZSBvbmx5KSAqLworI2RlZmluZSBDU19DTEtfUlVOX1JTVAlCSVRfMTJTCQkvKiBDTEtfUlVOIHJlc2V0ICAoWVVLT04tTGl0ZSBvbmx5KSAqLworI2RlZmluZSBDU19DTEtfUlVOX0VOQQlCSVRfMTFTCQkvKiBDTEtfUlVOIGVuYWJsZSAoWVVLT04tTGl0ZSBvbmx5KSAqLworI2RlZmluZSBDU19WQVVYX0FWQUlMCUJJVF8xMFMJCS8qIFZBVVggYXZhaWxhYmxlIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBDU19CVVNfQ0xPQ0sJQklUXzlTCQkvKiBCdXMgQ2xvY2sgMC8xID0gMzMvNjYgTUh6ICovCisjZGVmaW5lIENTX0JVU19TTE9UX1NaCUJJVF84UwkJLyogU2xvdCBTaXplIDAvMSA9IDMyLzY0IGJpdCBzbG90ICovCisjZGVmaW5lIENTX1NUX1NXX0lSUQlCSVRfN1MJCS8qIFNldCBJUlEgU1cgUmVxdWVzdCAqLworI2RlZmluZSBDU19DTF9TV19JUlEJQklUXzZTCQkvKiBDbGVhciBJUlEgU1cgUmVxdWVzdCAqLworI2RlZmluZSBDU19TVE9QX0RPTkUJQklUXzVTCQkvKiBTdG9wIE1hc3RlciBpcyBmaW5pc2hlZCAqLworI2RlZmluZSBDU19TVE9QX01BU1QJQklUXzRTCQkvKiBDb21tYW5kIEJpdCB0byBzdG9wIHRoZSBtYXN0ZXIgKi8KKyNkZWZpbmUgQ1NfTVJTVF9DTFIJCUJJVF8zUwkJLyogQ2xlYXIgTWFzdGVyIHJlc2V0CSovCisjZGVmaW5lIENTX01SU1RfU0VUCQlCSVRfMlMJCS8qIFNldCBNYXN0ZXIgcmVzZXQJKi8KKyNkZWZpbmUgQ1NfUlNUX0NMUgkJQklUXzFTCQkvKiBDbGVhciBTb2Z0d2FyZSByZXNldAkqLworI2RlZmluZSBDU19SU1RfU0VUCQlCSVRfMFMJCS8qIFNldCAgIFNvZnR3YXJlIHJlc2V0CSovCisKKy8qCUIwX0xFRAkJCSA4IEJpdAlMRUQgcmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0ICA3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEVEX1NUQVRfT04JCUJJVF8xUwkJLyogU3RhdHVzIExFRCBvbgkqLworI2RlZmluZSBMRURfU1RBVF9PRkYJQklUXzBTCQkvKiBTdGF0dXMgTEVEIG9mZgkqLworCisvKglCMF9QT1dFUl9DVFJMCSA4IEJpdAlQb3dlciBDb250cm9sIHJlZyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENfVkFVWF9FTkEJCUJJVF83CQkvKiBTd2l0Y2ggVkFVWCBFbmFibGUgICovCisjZGVmaW5lIFBDX1ZBVVhfRElTCQlCSVRfNiAgICAgICAvKiBTd2l0Y2ggVkFVWCBEaXNhYmxlICovCisjZGVmaW5lIFBDX1ZDQ19FTkEJCUJJVF81ICAgICAgIC8qIFN3aXRjaCBWQ0MgRW5hYmxlICAqLworI2RlZmluZSBQQ19WQ0NfRElTCQlCSVRfNCAgICAgICAvKiBTd2l0Y2ggVkNDIERpc2FibGUgKi8KKyNkZWZpbmUgUENfVkFVWF9PTgkJQklUXzMgICAgICAgLyogU3dpdGNoIFZBVVggT24gICovCisjZGVmaW5lIFBDX1ZBVVhfT0ZGCQlCSVRfMiAgICAgICAvKiBTd2l0Y2ggVkFVWCBPZmYgKi8KKyNkZWZpbmUgUENfVkNDX09OCQlCSVRfMSAgICAgICAvKiBTd2l0Y2ggVkNDIE9uICAqLworI2RlZmluZSBQQ19WQ0NfT0ZGCQlCSVRfMCAgICAgICAvKiBTd2l0Y2ggVkNDIE9mZiAqLworCisvKglCMF9JU1JDCQkJMzIgYml0CUludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXIgKi8KKy8qCUIwX0lNU0sJCQkzMiBiaXQJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKy8qCUIwX1NQX0lTUkMJCTMyIGJpdAlTcGVjaWFsIEludGVycnVwdCBTb3VyY2UgUmVnICovCisvKglCMl9JUlFNX01TSyAJMzIgYml0CUlSUSBNb2RlcmF0aW9uIE1hc2sgKi8KKyNkZWZpbmUgSVNfQUxMX01TSwkJMHhiZmZmZmZmZlVMCS8qIEFsbCBJbnRlcnJ1cHQgYml0cyAqLworI2RlZmluZSBJU19IV19FUlIJCUJJVF8zMQkJLyogSW50ZXJydXB0IEhXIEVycm9yICovCisJCQkJCQkJCS8qIEJpdCAzMDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgSVNfUEFfVE9fUlgxCUJJVF8yOQkJLyogUGFja2V0IEFyYiBUaW1lb3V0IFJ4MSAqLworI2RlZmluZSBJU19QQV9UT19SWDIJQklUXzI4CQkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgUngyICovCisjZGVmaW5lIElTX1BBX1RPX1RYMQlCSVRfMjcJCS8qIFBhY2tldCBBcmIgVGltZW91dCBUeDEgKi8KKyNkZWZpbmUgSVNfUEFfVE9fVFgyCUJJVF8yNgkJLyogUGFja2V0IEFyYiBUaW1lb3V0IFR4MiAqLworI2RlZmluZSBJU19JMkNfUkVBRFkJQklUXzI1CQkvKiBJUlEgb24gZW5kIG9mIEkyQyBUeCAqLworI2RlZmluZSBJU19JUlFfU1cJCUJJVF8yNAkJLyogU1cgZm9yY2VkIElSUQkqLworI2RlZmluZSBJU19FWFRfUkVHCQlCSVRfMjMJCS8qIElSUSBmcm9tIExNODAgb3IgUEhZIChHRU5FU0lTIG9ubHkpICovCisJCQkJCQkJCQkvKiBJUlEgZnJvbSBQSFkgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIElTX1RJTUlOVAkJQklUXzIyCQkvKiBJUlEgZnJvbSBUaW1lcgkqLworI2RlZmluZSBJU19NQUMxCQkJQklUXzIxCQkvKiBJUlEgZnJvbSBNQUMgMQkqLworI2RlZmluZSBJU19MTktfU1lOQ19NMQlCSVRfMjAJCS8qIExpbmsgU3luYyBDbnQgd3JhcCBNQUMgMSAqLworI2RlZmluZSBJU19NQUMyCQkJQklUXzE5CQkvKiBJUlEgZnJvbSBNQUMgMgkqLworI2RlZmluZSBJU19MTktfU1lOQ19NMglCSVRfMTgJCS8qIExpbmsgU3luYyBDbnQgd3JhcCBNQUMgMiAqLworLyogUmVjZWl2ZSBRdWV1ZSAxICovCisjZGVmaW5lIElTX1IxX0IJCQlCSVRfMTcJCS8qIFFfUjEgRW5kIG9mIEJ1ZmZlciAqLworI2RlZmluZSBJU19SMV9GCQkJQklUXzE2CQkvKiBRX1IxIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBJU19SMV9DCQkJQklUXzE1CQkvKiBRX1IxIEVuY29kaW5nIEVycm9yICovCisvKiBSZWNlaXZlIFF1ZXVlIDIgKi8KKyNkZWZpbmUgSVNfUjJfQgkJCUJJVF8xNAkJLyogUV9SMiBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1IyX0YJCQlCSVRfMTMJCS8qIFFfUjIgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1IyX0MJCQlCSVRfMTIJCS8qIFFfUjIgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIFN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDEgKi8KKyNkZWZpbmUgSVNfWFMxX0IJCUJJVF8xMQkJLyogUV9YUzEgRW5kIG9mIEJ1ZmZlciAqLworI2RlZmluZSBJU19YUzFfRgkJQklUXzEwCQkvKiBRX1hTMSBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfWFMxX0MJCUJJVF85CQkvKiBRX1hTMSBFbmNvZGluZyBFcnJvciAqLworLyogQXN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDEgKi8KKyNkZWZpbmUgSVNfWEExX0IJCUJJVF84CQkvKiBRX1hBMSBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hBMV9GCQlCSVRfNwkJLyogUV9YQTEgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1hBMV9DCQlCSVRfNgkJLyogUV9YQTEgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIFN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDIgKi8KKyNkZWZpbmUgSVNfWFMyX0IJCUJJVF81CQkvKiBRX1hTMiBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hTMl9GCQlCSVRfNAkJLyogUV9YUzIgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1hTMl9DCQlCSVRfMwkJLyogUV9YUzIgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisjZGVmaW5lIElTX1hBMl9CCQlCSVRfMgkJLyogUV9YQTIgRW5kIG9mIEJ1ZmZlciAqLworI2RlZmluZSBJU19YQTJfRgkJQklUXzEJCS8qIFFfWEEyIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBJU19YQTJfQwkJQklUXzAJCS8qIFFfWEEyIEVuY29kaW5nIEVycm9yICovCisKKworLyoJQjBfSFdFX0lTUkMJCTMyIGJpdAlIVyBFcnJvciBJbnRlcnJ1cHQgU3JjIFJlZyAqLworLyoJQjBfSFdFX0lNU0sJCTMyIGJpdAlIVyBFcnJvciBJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKy8qCUIyX0lSUU1fSFdFX01TSwkzMiBiaXQJSVJRIE1vZGVyYXRpb24gSFcgRXJyb3IgTWFzayAqLworI2RlZmluZSBJU19FUlJfTVNLCQkweDAwMDAwZmZmTAkvKiAJCUFsbCBFcnJvciBiaXRzICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIElTX0lSUV9USVNUX09WCUJJVF8xMwkvKiBUaW1lIFN0YW1wIFRpbWVyIE92ZXJmbG93IChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBJU19JUlFfU0VOU09SCUJJVF8xMgkvKiBJUlEgZnJvbSBTZW5zb3IgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIElTX0lSUV9NU1RfRVJSCUJJVF8xMQkvKiBJUlEgbWFzdGVyIGVycm9yIGRldGVjdGVkICovCisjZGVmaW5lIElTX0lSUV9TVEFUCQlCSVRfMTAJLyogSVJRIHN0YXR1cyBleGNlcHRpb24gKi8KKyNkZWZpbmUgSVNfTk9fU1RBVF9NMQlCSVRfOQkvKiBObyBSeCBTdGF0dXMgZnJvbSBNQUMgMSAqLworI2RlZmluZSBJU19OT19TVEFUX00yCUJJVF84CS8qIE5vIFJ4IFN0YXR1cyBmcm9tIE1BQyAyICovCisjZGVmaW5lIElTX05PX1RJU1RfTTEJQklUXzcJLyogTm8gVGltZSBTdGFtcCBmcm9tIE1BQyAxICovCisjZGVmaW5lIElTX05PX1RJU1RfTTIJQklUXzYJLyogTm8gVGltZSBTdGFtcCBmcm9tIE1BQyAyICovCisjZGVmaW5lIElTX1JBTV9SRF9QQVIJQklUXzUJLyogUkFNIFJlYWQgIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19SQU1fV1JfUEFSCUJJVF80CS8qIFJBTSBXcml0ZSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgSVNfTTFfUEFSX0VSUglCSVRfMwkvKiBNQUMgMSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgSVNfTTJfUEFSX0VSUglCSVRfMgkvKiBNQUMgMiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgSVNfUjFfUEFSX0VSUglCSVRfMQkvKiBRdWV1ZSBSMSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgSVNfUjJfUEFSX0VSUglCSVRfMAkvKiBRdWV1ZSBSMiBQYXJpdHkgRXJyb3IgKi8KKworLyoJQjJfQ09OTl9UWVAJCSA4IGJpdAlDb25uZWN0b3IgdHlwZSAqLworLyoJQjJfUE1EX1RZUAkJIDggYml0CVBNRCB0eXBlICovCisvKglWYWx1ZXMgb2YgY29ubmVjdG9yIGFuZCBQTUQgdHlwZSBjb21wbHkgdG8gU3lzS29ubmVjdCBpbnRlcm5hbCBzdGQgKi8KKworLyoJQjJfTUFDX0NGRwkJIDggYml0CU1BQyBDb25maWd1cmF0aW9uIC8gQ2hpcCBSZXZpc2lvbiAqLworI2RlZmluZSBDRkdfQ0hJUF9SX01TSwkoMHhmPDw0KQkvKiBCaXQgNy4uIDQ6IENoaXAgUmV2aXNpb24gKi8KKwkJCQkJCQkJCS8qIEJpdCAzLi4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ0ZHX0RJU19NMl9DTEsJQklUXzFTCQkvKiBEaXNhYmxlIENsb2NrIGZvciAybmQgTUFDICovCisjZGVmaW5lIENGR19TTkdfTUFDCQlCSVRfMFMJCS8qIE1BQyBDb25maWc6IDA9MiBNQUNzIC8gMT0xIE1BQyovCisKKy8qCUIyX0NISVBfSUQJCSA4IGJpdCAJQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KKyNkZWZpbmUgQ0hJUF9JRF9HRU5FU0lTCQkweDBhCS8qIENoaXAgSUQgZm9yIEdFTkVTSVMgKi8KKyNkZWZpbmUgQ0hJUF9JRF9ZVUtPTgkJMHhiMAkvKiBDaGlwIElEIGZvciBZVUtPTiAqLworI2RlZmluZSBDSElQX0lEX1lVS09OX0xJVEUJMHhiMQkvKiBDaGlwIElEIGZvciBZVUtPTi1MaXRlIChSZXYuIEExLUEzKSAqLworI2RlZmluZSBDSElQX0lEX1lVS09OX0xQCTB4YjIJLyogQ2hpcCBJRCBmb3IgWVVLT04tTFAgKi8KKworI2RlZmluZSBDSElQX1JFVl9ZVV9MSVRFX0ExCTMJCS8qIENoaXAgUmV2LiBmb3IgWVVLT04tTGl0ZSBBMSxBMiAqLworI2RlZmluZSBDSElQX1JFVl9ZVV9MSVRFX0EzCTcJCS8qIENoaXAgUmV2LiBmb3IgWVVLT04tTGl0ZSBBMyAqLworCisvKglCMl9GQVIJCQkzMiBiaXQJRmxhc2gtUHJvbSBBZGRyIFJlZy9DbnQgKi8KKyNkZWZpbmUgRkFSX0FERFIJCTB4MWZmZmZMCS8qIEJpdCAxNi4uIDA6CUZQUk9NIEFkZHJlc3MgbWFzayAqLworCisvKglCMl9MRF9DVFJMCQkgOCBiaXQJRVBST00gbG9hZGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qCUJpdHMgYXJlIGN1cnJlbnRseSByZXNlcnZlZCAqLworCisvKglCMl9MRF9URVNUCQkgOCBiaXQJRVBST00gbG9hZGVyIHRlc3QgcmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA0OglyZXNlcnZlZCAqLworI2RlZmluZSBMRF9UX09OCQkJQklUXzNTCS8qIExvYWRlciBUZXN0IG1vZGUgb24gKi8KKyNkZWZpbmUgTERfVF9PRkYJCUJJVF8yUwkvKiBMb2FkZXIgVGVzdCBtb2RlIG9mZiAqLworI2RlZmluZSBMRF9UX1NURVAJCUJJVF8xUwkvKiBEZWNyZW1lbnQgRlBST00gYWRkci4gQ291bnRlciAqLworI2RlZmluZSBMRF9TVEFSVAkJQklUXzBTCS8qIFN0YXJ0IGxvYWRpbmcgRlBST00gKi8KKworLyoKKyAqCVRpbWVyIFNlY3Rpb24KKyAqLworLyoJQjJfVElfQ1RSTAkJIDggYml0CVRpbWVyIGNvbnRyb2wgKi8KKy8qCUIyX0lSUU1fQ1RSTAkgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbCAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIFRJTV9TVEFSVAkJQklUXzJTCS8qIFN0YXJ0IFRpbWVyICovCisjZGVmaW5lIFRJTV9TVE9QCQlCSVRfMVMJLyogU3RvcCAgVGltZXIgKi8KKyNkZWZpbmUgVElNX0NMUl9JUlEJCUJJVF8wUwkvKiBDbGVhciBUaW1lciBJUlEgKCFJUlFNKSAqLworCisvKglCMl9USV9URVNUCQkgOCBCaXQJVGltZXIgVGVzdCAqLworLyoJQjJfSVJRTV9URVNUCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBUZXN0ICovCisvKglCMjhfRFBUX1RTVAkJIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBUZXN0IFJlZyAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIFRJTV9UX09OCQlCSVRfMlMJLyogVGVzdCBtb2RlIG9uICovCisjZGVmaW5lIFRJTV9UX09GRgkJQklUXzFTCS8qIFRlc3QgbW9kZSBvZmYgKi8KKyNkZWZpbmUgVElNX1RfU1RFUAkJQklUXzBTCS8qIFRlc3Qgc3RlcCAqLworCisvKglCMjhfRFBUX0lOSQkzMiBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEluaXQgVmFsICovCisvKglCMjhfRFBUX1ZBTAkzMiBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN1cnIgVmFsICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMjQ6CXJlc2VydmVkICovCisjZGVmaW5lIERQVF9NU0sJCTB4MDBmZmZmZmZMCS8qIEJpdCAyMy4uIDA6CURlc2MgUG9sbCBUaW1lciBCaXRzICovCisKKy8qCUIyOF9EUFRfQ1RSTAkgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN0cmwgUmVnICovCisJCQkJCQkJCS8qIEJpdCAgNy4uIDI6CXJlc2VydmVkICovCisjZGVmaW5lIERQVF9TVEFSVAkJQklUXzFTCS8qIFN0YXJ0IERlc2NyaXB0b3IgUG9sbCBUaW1lciAqLworI2RlZmluZSBEUFRfU1RPUAkJQklUXzBTCS8qIFN0b3AgIERlc2NyaXB0b3IgUG9sbCBUaW1lciAqLworCisvKglCMl9FXzMJCQkgOCBiaXQgCWxvd2VyIDQgYml0cyB1c2VkIGZvciBIVyBzZWxmIHRlc3QgcmVzdWx0ICovCisjZGVmaW5lIEIyX0UzX1JFU19NQVNLCTB4MGYKKworLyoJQjJfVFNUX0NUUkwxCSA4IGJpdAlUZXN0IENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX01SCUJJVF83UwkvKiBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgUkQgKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9NVwlCSVRfNlMJLyogZm9yY2UgREFUQVBFUlIgb24gTVNUIFdSICovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfVFIJQklUXzVTCS8qIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBSRCAqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX1RXCUJJVF80UwkvKiBmb3JjZSBEQVRBUEVSUiBvbiBUUkcgV1IgKi8KKyNkZWZpbmUgVFNUX0ZSQ19BUEVSUl9NCQlCSVRfM1MJLyogZm9yY2UgQUREUlBFUlIgb24gTVNUICovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfVAkJQklUXzJTCS8qIGZvcmNlIEFERFJQRVJSIG9uIFRSRyAqLworI2RlZmluZSBUU1RfQ0ZHX1dSSVRFX09OCUJJVF8xUwkvKiBFbmFibGUgIENvbmZpZyBSZWcgV1IgKi8KKyNkZWZpbmUgVFNUX0NGR19XUklURV9PRkYJQklUXzBTCS8qIERpc2FibGUgQ29uZmlnIFJlZyBXUiAqLworCisvKglCMl9UU1RfQ1RSTDIJIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAyICovCisJCQkJCQkJCQkvKiBCaXQgNy4uIDQ6CXJlc2VydmVkICovCisJCQkvKiBmb3JjZSB0aGUgZm9sbG93aW5nIGVycm9yIG9uIHRoZSBuZXh0IG1hc3RlciByZWFkL3dyaXRlCSovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVI2NAlCSVRfM1MJLyogRGF0YVBFUlIgUkQgNjQJKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9NVzY0CUJJVF8yUwkvKiBEYXRhUEVSUiBXUiA2NAkqLworI2RlZmluZSBUU1RfRlJDX0FQRVJSXzFNNjQJQklUXzFTCS8qIEFkZHJQRVJSIG9uIDEuIHBoYXNlICovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMk02NAlCSVRfMFMJLyogQWRkclBFUlIgb24gMi4gcGhhc2UgKi8KKworLyoJQjJfR1BfSU8JCTMyIGJpdAlHZW5lcmFsIFB1cnBvc2UgSS9PIFJlZ2lzdGVyICovCisJCQkJCQkJLyogQml0IDMxLi4yNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR1BfRElSXzkJQklUXzI1CS8qIElPXzkgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl84CUJJVF8yNAkvKiBJT184IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfNwlCSVRfMjMJLyogSU9fNyBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzYJQklUXzIyCS8qIElPXzYgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl81CUJJVF8yMQkvKiBJT181IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfNAlCSVRfMjAJLyogSU9fNCBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzMJQklUXzE5CS8qIElPXzMgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl8yCUJJVF8xOAkvKiBJT18yIGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfMQlCSVRfMTcJLyogSU9fMSBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzAJQklUXzE2CS8qIElPXzAgZGlyZWN0LCAwPUluLzE9T3V0ICovCisJCQkJCQkvKiBCaXQgMTUuLjEwOglyZXNlcnZlZCAqLworI2RlZmluZSBHUF9JT185CQlCSVRfOQkvKiBJT185IHBpbiAqLworI2RlZmluZSBHUF9JT184CQlCSVRfOAkvKiBJT184IHBpbiAqLworI2RlZmluZSBHUF9JT183CQlCSVRfNwkvKiBJT183IHBpbiAqLworI2RlZmluZSBHUF9JT182CQlCSVRfNgkvKiBJT182IHBpbiAqLworI2RlZmluZSBHUF9JT181CQlCSVRfNQkvKiBJT181IHBpbiAqLworI2RlZmluZSBHUF9JT180CQlCSVRfNAkvKiBJT180IHBpbiAqLworI2RlZmluZSBHUF9JT18zCQlCSVRfMwkvKiBJT18zIHBpbiAqLworI2RlZmluZSBHUF9JT18yCQlCSVRfMgkvKiBJT18yIHBpbiAqLworI2RlZmluZSBHUF9JT18xCQlCSVRfMQkvKiBJT18xIHBpbiAqLworI2RlZmluZSBHUF9JT18wCQlCSVRfMAkvKiBJT18wIHBpbiAqLworCisvKglCMl9JMkNfQ1RSTAkJMzIgYml0CUkyQyBIVyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEkyQ19GTEFHCQlCSVRfMzEJCS8qIFN0YXJ0IHJlYWQvd3JpdGUgaWYgV1IgKi8KKyNkZWZpbmUgSTJDX0FERFIJCSgweDdmZmZMPDwxNikJLyogQml0IDMwLi4xNjoJQWRkciB0byBiZSBSRC9XUiAqLworI2RlZmluZSBJMkNfREVWX1NFTAkJKDB4N2ZMPDw5KQkJLyogQml0IDE1Li4gOToJSTJDIERldmljZSBTZWxlY3QgKi8KKwkJCQkJCQkJLyogQml0CTguLiA1OglyZXNlcnZlZAkqLworI2RlZmluZSBJMkNfQlVSU1RfTEVOCUJJVF80CQkvKiBCdXJzdCBMZW4sIDEvNCBieXRlcyAqLworI2RlZmluZSBJMkNfREVWX1NJWkUJKDc8PDEpCQkvKiBCaXQJMy4uIDE6CUkyQyBEZXZpY2UgU2l6ZQkqLworI2RlZmluZSBJMkNfMDI1S19ERVYJKDA8PDEpCQkvKgkJMDogMjU2IEJ5dGVzIG9yIHNtYWwuICovCisjZGVmaW5lIEkyQ18wNUtfREVWCQkoMTw8MSkJCS8qIAkJMTogNTEyCUJ5dGVzCSovCisjZGVmaW5lIEkyQ18xS19ERVYJCSgyPDwxKQkJLyoJCTI6IDEwMjQgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzJLX0RFVgkJKDM8PDEpCQkvKgkJMzogMjA0OAlCeXRlcwkqLworI2RlZmluZSBJMkNfNEtfREVWCQkoNDw8MSkJCS8qCQk0OiA0MDk2IEJ5dGVzCSovCisjZGVmaW5lIEkyQ184S19ERVYJCSg1PDwxKQkJLyoJCTU6IDgxOTIgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzE2S19ERVYJCSg2PDwxKQkJLyoJCTY6IDE2Mzg0IEJ5dGVzCSovCisjZGVmaW5lIEkyQ18zMktfREVWCQkoNzw8MSkJCS8qCQk3OiAzMjc2OCBCeXRlcwkqLworI2RlZmluZSBJMkNfU1RPUAkJQklUXzAJCS8qIEludGVycnVwdCBJMkMgdHJhbnNmZXIgKi8KKworLyoJQjJfSTJDX0lSUQkJMzIgYml0CUkyQyBIVyBJUlEgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4gMQlyZXNlcnZlZCAqLworI2RlZmluZSBJMkNfQ0xSX0lSUQkJQklUXzAJLyogQ2xlYXIgSTJDIElSUSAqLworCisvKglCMl9JMkNfU1cJCTMyIGJpdCAoOCBiaXQgYWNjZXNzKQlJMkMgSFcgU1cgUG9ydCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgIDcuLiAzOglyZXNlcnZlZCAqLworI2RlZmluZSBJMkNfREFUQV9ESVIJQklUXzJTCQkvKiBkaXJlY3Rpb24gb2YgSTJDX0RBVEEgKi8KKyNkZWZpbmUgSTJDX0RBVEEJCUJJVF8xUwkJLyogSTJDIERhdGEgUG9ydAkqLworI2RlZmluZSBJMkNfQ0xLCQkJQklUXzBTCQkvKiBJMkMgQ2xvY2sgUG9ydAkqLworCisvKgorICogSTJDIEFkZHJlc3MKKyAqLworI2RlZmluZSBJMkNfU0VOU19BRERSCUxNODBfQUREUgkvKiBJMkMgU2Vuc29yIEFkZHJlc3MsIChWb2x0IGFuZCBUZW1wKSovCisKKworLyoJQjJfQlNDX0NUUkwJCSA4IGJpdAlCbGluayBTb3VyY2UgQ291bnRlciBDb250cm9sICovCisJCQkJCQkJLyogQml0ICA3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQlNDX1NUQVJUCUJJVF8xUwkJLyogU3RhcnQgQmxpbmsgU291cmNlIENvdW50ZXIgKi8KKyNkZWZpbmUgQlNDX1NUT1AJQklUXzBTCQkvKiBTdG9wICBCbGluayBTb3VyY2UgQ291bnRlciAqLworCisvKglCMl9CU0NfU1RBVAkJIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFN0YXR1cyAqLworCQkJCQkJCS8qIEJpdCAgNy4uIDE6CXJlc2VydmVkICovCisjZGVmaW5lIEJTQ19TUkMJCUJJVF8wUwkJLyogQmxpbmsgU291cmNlLCAwPU9mZiAvIDE9T24gKi8KKworLyoJQjJfQlNDX1RTVAkJMTYgYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFRlc3QgUmVnICovCisjZGVmaW5lIEJTQ19UX09OCUJJVF8yUwkJLyogVGVzdCBtb2RlIG9uICovCisjZGVmaW5lIEJTQ19UX09GRglCSVRfMVMJCS8qIFRlc3QgbW9kZSBvZmYgKi8KKyNkZWZpbmUgQlNDX1RfU1RFUAlCSVRfMFMJCS8qIFRlc3Qgc3RlcCAqLworCisKKy8qCUIzX1JBTV9BRERSCQkzMiBiaXQJUkFNIEFkZHJlc3MsIHRvIHJlYWQgb3Igd3JpdGUgKi8KKwkJCQkJLyogQml0IDMxLi4xOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkFNX0FEUl9SQU4JMHgwMDA3ZmZmZkwJLyogQml0IDE4Li4gMDoJUkFNIEFkZHJlc3MgUmFuZ2UgKi8KKworLyogUkFNIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKy8qCUIzX1JJX0NUUkwJCTE2IGJpdAlSQU0gSWZhY2UgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjEwOglyZXNlcnZlZCAqLworI2RlZmluZSBSSV9DTFJfUkRfUEVSUglCSVRfOVMJLyogQ2xlYXIgSVJRIFJBTSBSZWFkIFBhcml0eSBFcnIgKi8KKyNkZWZpbmUgUklfQ0xSX1dSX1BFUlIJQklUXzhTCS8qIENsZWFyIElSUSBSQU0gV3JpdGUgUGFyaXR5IEVyciovCisJCQkJCQkJCS8qIEJpdAk3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUklfUlNUX0NMUgkJQklUXzFTCS8qIENsZWFyIFJBTSBJbnRlcmZhY2UgUmVzZXQgKi8KKyNkZWZpbmUgUklfUlNUX1NFVAkJQklUXzBTCS8qIFNldCAgIFJBTSBJbnRlcmZhY2UgUmVzZXQgKi8KKworLyoJQjNfUklfVEVTVAkJIDggYml0CVJBTSBJZmFjZSBUZXN0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIFJJX1RfRVYJCQlCSVRfM1MJLyogVGltZW91dCBFdmVudCBvY2N1cmVkICovCisjZGVmaW5lIFJJX1RfT04JCQlCSVRfMlMJLyogVGltZW91dCBUaW1lciBUZXN0IE9uICovCisjZGVmaW5lIFJJX1RfT0ZGCQlCSVRfMVMJLyogVGltZW91dCBUaW1lciBUZXN0IE9mZiAqLworI2RlZmluZSBSSV9UX1NURVAJCUJJVF8wUwkvKiBUaW1lb3V0IFRpbWVyIFN0ZXAgKi8KKworLyogTUFDIEFyYml0ZXIgUmVnaXN0ZXJzICovCisvKglCM19NQV9UT19DVFJMCTE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IEN0cmwgUmVnICovCisJCQkJCQkJCS8qIEJpdCAxNS4uIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIE1BX0ZPRV9PTgkJQklUXzNTCS8qIFhNQUMgRmFzdCBPdXRwdXQgRW5hYmxlIE9OICovCisjZGVmaW5lIE1BX0ZPRV9PRkYJCUJJVF8yUwkvKiBYTUFDIEZhc3QgT3V0cHV0IEVuYWJsZSBPRkYgKi8KKyNkZWZpbmUgTUFfUlNUX0NMUgkJQklUXzFTCS8qIENsZWFyIE1BQyBBcmJpdGVyIFJlc2V0ICovCisjZGVmaW5lIE1BX1JTVF9TRVQJCUJJVF8wUwkvKiBTZXQgICBNQUMgQXJiaXRlciBSZXNldCAqLworCisvKglCM19NQV9SQ19DVFJMCTE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBDdHJsIFJlZyAqLworCQkJCQkJCQkvKiBCaXQgMTUuLiA4OglyZXNlcnZlZCAqLworI2RlZmluZSBNQV9FTkFfUkVDX1RYMglCSVRfN1MJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBUWDIgKi8KKyNkZWZpbmUgTUFfRElTX1JFQ19UWDIJQklUXzZTCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgVFgyICovCisjZGVmaW5lIE1BX0VOQV9SRUNfVFgxCUJJVF81UwkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFRYMSAqLworI2RlZmluZSBNQV9ESVNfUkVDX1RYMQlCSVRfNFMJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBUWDEgKi8KKyNkZWZpbmUgTUFfRU5BX1JFQ19SWDIJQklUXzNTCS8qIEVuYWJsZSAgUmVjb3ZlcnkgVGltZXIgUlgyICovCisjZGVmaW5lIE1BX0RJU19SRUNfUlgyCUJJVF8yUwkvKiBEaXNhYmxlIFJlY292ZXJ5IFRpbWVyIFJYMiAqLworI2RlZmluZSBNQV9FTkFfUkVDX1JYMQlCSVRfMVMJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBSWDEgKi8KKyNkZWZpbmUgTUFfRElTX1JFQ19SWDEJQklUXzBTCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgUlgxICovCisKKy8qIFBhY2tldCBBcmJpdGVyIFJlZ2lzdGVycyAqLworLyoJQjNfUEFfQ1RSTAkJMTYgYml0CVBhY2tldCBBcmJpdGVyIEN0cmwgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEFfQ0xSX1RPX1RYMglCSVRfMTNTCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBUWDIgKi8KKyNkZWZpbmUgUEFfQ0xSX1RPX1RYMQlCSVRfMTJTCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBUWDEgKi8KKyNkZWZpbmUgUEFfQ0xSX1RPX1JYMglCSVRfMTFTCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDIgKi8KKyNkZWZpbmUgUEFfQ0xSX1RPX1JYMQlCSVRfMTBTCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDEgKi8KKyNkZWZpbmUgUEFfRU5BX1RPX1RYMglCSVRfOVMJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFRYMiAqLworI2RlZmluZSBQQV9ESVNfVE9fVFgyCUJJVF84UwkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgVFgyICovCisjZGVmaW5lIFBBX0VOQV9UT19UWDEJQklUXzdTCS8qIEVuYWJsZSAgVGltZW91dCBUaW1lciBUWDEgKi8KKyNkZWZpbmUgUEFfRElTX1RPX1RYMQlCSVRfNlMJLyogRGlzYWJsZSBUaW1lb3V0IFRpbWVyIFRYMSAqLworI2RlZmluZSBQQV9FTkFfVE9fUlgyCUJJVF81UwkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgUlgyICovCisjZGVmaW5lIFBBX0RJU19UT19SWDIJQklUXzRTCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBSWDIgKi8KKyNkZWZpbmUgUEFfRU5BX1RPX1JYMQlCSVRfM1MJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFJYMSAqLworI2RlZmluZSBQQV9ESVNfVE9fUlgxCUJJVF8yUwkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgUlgxICovCisjZGVmaW5lIFBBX1JTVF9DTFIJCUJJVF8xUwkvKiBDbGVhciBNQUMgQXJiaXRlciBSZXNldCAqLworI2RlZmluZSBQQV9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgTUFDIEFyYml0ZXIgUmVzZXQgKi8KKworI2RlZmluZSBQQV9FTkFfVE9fQUxMCShQQV9FTkFfVE9fUlgxIHwgUEFfRU5BX1RPX1JYMiB8XAorCQkJCQkJUEFfRU5BX1RPX1RYMSB8IFBBX0VOQV9UT19UWDIpCisKKy8qIFJ4L1R4IFBhdGggcmVsYXRlZCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXJzICovCisvKglCM19NQV9UT19URVNUCTE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IFRlc3QgUmVnICovCisvKglCM19NQV9SQ19URVNUCTE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBUZXN0IFJlZyAqLworLyoJQjNfUEFfVEVTVAkJMTYgYml0CVBhY2tldCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKy8qCQkJQml0IDE1LCAxMSwgNywgYW5kIDMgYXJlIHJlc2VydmVkIGluIEIzX1BBX1RFU1QgKi8KKyNkZWZpbmUgVFgyX1RfRVYJQklUXzE1UwkJLyogVFgyIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCisjZGVmaW5lIFRYMl9UX09OCUJJVF8xNFMJCS8qIFRYMiBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWDJfVF9PRkYJQklUXzEzUwkJLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCisjZGVmaW5lIFRYMl9UX1NURVAJQklUXzEyUwkJLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBTdGVwICovCisjZGVmaW5lIFRYMV9UX0VWCUJJVF8xMVMJCS8qIFRYMSBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLworI2RlZmluZSBUWDFfVF9PTglCSVRfMTBTCQkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgVFgxX1RfT0ZGCUJJVF85UwkJLyogVFgxIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCisjZGVmaW5lIFRYMV9UX1NURVAJQklUXzhTCQkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgUlgyX1RfRVYJQklUXzdTCQkvKiBSWDIgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgUlgyX1RfT04JQklUXzZTCQkvKiBSWDIgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUlgyX1RfT0ZGCUJJVF81UwkJLyogUlgyIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCisjZGVmaW5lIFJYMl9UX1NURVAJQklUXzRTCQkvKiBSWDIgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgUlgxX1RfRVYJQklUXzNTCQkvKiBSWDEgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgUlgxX1RfT04JQklUXzJTCQkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUlgxX1RfT0ZGCUJJVF8xUwkJLyogUlgxIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCisjZGVmaW5lIFJYMV9UX1NURVAJQklUXzBTCQkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KKworCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKy8qCVRYQV9JVElfSU5JCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIEluaXQgVmFsICovCisvKglUWEFfSVRJX1ZBTAkJMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBWYWx1ZSAqLworLyoJVFhBX0xJTV9JTkkJCTMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBJbml0IFZhbCAqLworLyoJVFhBX0xJTV9WQUwJCTMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBWYWx1ZSAqLworCQkJCQkJCQkvKiBCaXQgMzEuLjI0OglyZXNlcnZlZCAqLworI2RlZmluZSBUWEFfTUFYX1ZBTAkweDAwZmZmZmZmVUwvKiBCaXQgMjMuLiAwOglNYXggVFhBIFRpbWVyL0NudCBWYWwgKi8KKworLyoJVFhBX0NUUkwJCSA4IGJpdAlUeCBBcmJpdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhBX0VOQV9GU1lOQwlCSVRfN1MJLyogRW5hYmxlICBmb3JjZSBvZiBzeW5jIFR4IHF1ZXVlICovCisjZGVmaW5lIFRYQV9ESVNfRlNZTkMJQklUXzZTCS8qIERpc2FibGUgZm9yY2Ugb2Ygc3luYyBUeCBxdWV1ZSAqLworI2RlZmluZSBUWEFfRU5BX0FMTE9DCUJJVF81UwkvKiBFbmFibGUgIGFsbG9jIG9mIGZyZWUgYmFuZHdpZHRoICovCisjZGVmaW5lIFRYQV9ESVNfQUxMT0MJQklUXzRTCS8qIERpc2FibGUgYWxsb2Mgb2YgZnJlZSBiYW5kd2lkdGggKi8KKyNkZWZpbmUgVFhBX1NUQVJUX1JDCUJJVF8zUwkvKiBTdGFydCBzeW5jIFJhdGUgQ29udHJvbCAqLworI2RlZmluZSBUWEFfU1RPUF9SQwkJQklUXzJTCS8qIFN0b3AgIHN5bmMgUmF0ZSBDb250cm9sICovCisjZGVmaW5lIFRYQV9FTkFfQVJCCQlCSVRfMVMJLyogRW5hYmxlICBUeCBBcmJpdGVyICovCisjZGVmaW5lIFRYQV9ESVNfQVJCCQlCSVRfMFMJLyogRGlzYWJsZSBUeCBBcmJpdGVyICovCisKKy8qCVRYQV9URVNUCQkgOCBiaXQJVHggQXJiaXRlciBUZXN0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCA3Li4gNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFhBX0lOVF9UX09OCUJJVF81UwkvKiBUeCBBcmIgSW50ZXJ2YWwgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWEFfSU5UX1RfT0ZGCUJJVF80UwkvKiBUeCBBcmIgSW50ZXJ2YWwgVGltZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgVFhBX0lOVF9UX1NURVAJQklUXzNTCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBTdGVwICovCisjZGVmaW5lIFRYQV9MSU1fVF9PTglCSVRfMlMJLyogVHggQXJiIExpbWl0IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgVFhBX0xJTV9UX09GRglCSVRfMVMJLyogVHggQXJiIExpbWl0IFRpbWVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFRYQV9MSU1fVF9TVEVQCUJJVF8wUwkvKiBUeCBBcmIgTGltaXQgVGltZXIgU3RlcCAqLworCisvKglUWEFfU1RBVAkJIDggYml0CVR4IEFyYml0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFhBX1BSSU9fWFMJCUJJVF8wUwkvKiBzeW5jIHF1ZXVlIGhhcyBwcmlvIHRvIHNlbmQgKi8KKworLyoJUV9CQwkJCTMyIGJpdAlDdXJyZW50IEJ5dGUgQ291bnRlciAqLworCQkJCQkJCQkvKiBCaXQgMzEuLjE2OglyZXNlcnZlZCAqLworI2RlZmluZSBCQ19NQVgJCQkweGZmZmYJLyogQml0IDE1Li4gMDoJQnl0ZSBjb3VudGVyICovCisKKy8qIEJNVSBDb250cm9sIFN0YXR1cyBSZWdpc3RlcnMgKi8KKy8qCUIwX1IxX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMSAqLworLyoJQjBfUjJfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAyICovCisvKglCMF9YQTFfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBTeW5jIFR4IFF1ZXVlIDEgKi8KKy8qCUIwX1hTMV9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IEFzeW5jIFR4IFF1ZXVlIDEgKi8KKy8qCUIwX1hBMl9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFN5bmMgVHggUXVldWUgMiAqLworLyoJQjBfWFMyX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgQXN5bmMgVHggUXVldWUgMiAqLworLyoJUV9DU1IJCQkzMiBiaXQJQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMjU6CXJlc2VydmVkICovCisjZGVmaW5lIENTUl9TVl9JRExFCQlCSVRfMjQJCS8qIEJNVSBTTSBJZGxlICovCisJCQkJCQkJCS8qIEJpdCAyMy4uMjI6CXJlc2VydmVkICovCisjZGVmaW5lIENTUl9ERVNDX0NMUglCSVRfMjEJCS8qIENsZWFyIFJlc2V0IGZvciBEZXNjciAqLworI2RlZmluZSBDU1JfREVTQ19TRVQJQklUXzIwCQkvKiBTZXQgICBSZXNldCBmb3IgRGVzY3IgKi8KKyNkZWZpbmUgQ1NSX0ZJRk9fQ0xSCUJJVF8xOQkJLyogQ2xlYXIgUmVzZXQgZm9yIEZJRk8gKi8KKyNkZWZpbmUgQ1NSX0ZJRk9fU0VUCUJJVF8xOAkJLyogU2V0ICAgUmVzZXQgZm9yIEZJRk8gKi8KKyNkZWZpbmUgQ1NSX0hQSV9SVU4JCUJJVF8xNwkJLyogUmVsZWFzZSBIUEkgU00gKi8KKyNkZWZpbmUgQ1NSX0hQSV9SU1QJCUJJVF8xNgkJLyogUmVzZXQgICBIUEkgU00gdG8gSWRsZSAqLworI2RlZmluZSBDU1JfU1ZfUlVOCQlCSVRfMTUJCS8qIFJlbGVhc2UgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZSBDU1JfU1ZfUlNUCQlCSVRfMTQJCS8qIFJlc2V0ICAgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZSBDU1JfRFJFQURfUlVOCUJJVF8xMwkJLyogUmVsZWFzZSBEZXNjciBSZWFkIFNNICovCisjZGVmaW5lIENTUl9EUkVBRF9SU1QJQklUXzEyCQkvKiBSZXNldCAgIERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUgQ1NSX0RXUklURV9SVU4JQklUXzExCQkvKiBSZWxlYXNlIERlc2NyIFdyaXRlIFNNICovCisjZGVmaW5lIENTUl9EV1JJVEVfUlNUCUJJVF8xMAkJLyogUmVzZXQgICBEZXNjciBXcml0ZSBTTSAqLworI2RlZmluZSBDU1JfVFJBTlNfUlVOCUJJVF85CQkvKiBSZWxlYXNlIFRyYW5zZmVyIFNNICovCisjZGVmaW5lIENTUl9UUkFOU19SU1QJQklUXzgJCS8qIFJlc2V0ICAgVHJhbnNmZXIgU00gKi8KKyNkZWZpbmUgQ1NSX0VOQV9QT0wJCUJJVF83CQkvKiBFbmFibGUgIERlc2NyIFBvbGxpbmcgKi8KKyNkZWZpbmUgQ1NSX0RJU19QT0wJCUJJVF82CQkvKiBEaXNhYmxlIERlc2NyIFBvbGxpbmcgKi8KKyNkZWZpbmUgQ1NSX1NUT1AJCUJJVF81CQkvKiBTdG9wICBSeC9UeCBRdWV1ZSAqLworI2RlZmluZSBDU1JfU1RBUlQJCUJJVF80CQkvKiBTdGFydCBSeC9UeCBRdWV1ZSAqLworI2RlZmluZSBDU1JfSVJRX0NMX1AJQklUXzMJCS8qIChSeCkJQ2xlYXIgUGFyaXR5IElSUSAqLworI2RlZmluZSBDU1JfSVJRX0NMX0IJQklUXzIJCS8qIENsZWFyIEVPQiBJUlEgKi8KKyNkZWZpbmUgQ1NSX0lSUV9DTF9GCUJJVF8xCQkvKiBDbGVhciBFT0YgSVJRICovCisjZGVmaW5lIENTUl9JUlFfQ0xfQwlCSVRfMAkJLyogQ2xlYXIgRVJSIElSUSAqLworCisjZGVmaW5lIENTUl9TRVRfUkVTRVQJKENTUl9ERVNDX1NFVCB8IENTUl9GSUZPX1NFVCB8IENTUl9IUElfUlNUIHxcCisJCQkJCQlDU1JfU1ZfUlNUIHwgQ1NSX0RSRUFEX1JTVCB8IENTUl9EV1JJVEVfUlNUIHxcCisJCQkJCQlDU1JfVFJBTlNfUlNUKQorI2RlZmluZSBDU1JfQ0xSX1JFU0VUCShDU1JfREVTQ19DTFIgfCBDU1JfRklGT19DTFIgfCBDU1JfSFBJX1JVTiB8XAorCQkJCQkJQ1NSX1NWX1JVTiB8IENTUl9EUkVBRF9SVU4gfCBDU1JfRFdSSVRFX1JVTiB8XAorCQkJCQkJQ1NSX1RSQU5TX1JVTikKKworLyoJUV9GCQkJCTMyIGJpdAlGbGFnIFJlZ2lzdGVyICovCisJCQkJCQkJCQkvKiBCaXQgMzEuLjI4OglyZXNlcnZlZCAqLworI2RlZmluZSBGX0FMTV9GVUxMCQlCSVRfMjcJCS8qIFJ4IEZJRk86IGFsbW9zdCBmdWxsICovCisjZGVmaW5lIEZfRU1QVFkJCQlCSVRfMjcJCS8qIFR4IEZJRk86IGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgRl9GSUZPX0VPRgkJQklUXzI2CQkvKiBUYWcgKEVPRiBGbGFnKSBiaXQgaW4gRklGTyAqLworI2RlZmluZSBGX1dNX1JFQUNIRUQJQklUXzI1CQkvKiBXYXRlcm1hcmsgcmVhY2hlZCAqLworCQkJCQkJCQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRl9GSUZPX0xFVkVMCSgweDFmTDw8MTYpCS8qIEJpdCAyMy4uMTY6CSMgb2YgUXdvcmRzIGluIEZJRk8gKi8KKwkJCQkJCQkJCS8qIEJpdCAxNS4uMTE6IAlyZXNlcnZlZCAqLworI2RlZmluZSBGX1dBVEVSX01BUksJMHgwMDA3ZmZMCS8qIEJpdCAxMC4uIDA6CVdhdGVybWFyayAqLworCisvKglRX1QxCQkJMzIgYml0CVRlc3QgUmVnaXN0ZXIgMSAqLworLyoJCUhvbGRzIGZvdXIgU3RhdGUgTWFjaGluZSBjb250cm9sIEJ5dGVzICovCisjZGVmaW5lIFNNX0NUUkxfU1ZfTVNLCSgweGZmTDw8MjQpCS8qIEJpdCAzMS4uMjQ6CUNvbnRyb2wgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZSBTTV9DVFJMX1JEX01TSwkoMHhmZkw8PDE2KQkvKiBCaXQgMjMuLjE2OglDb250cm9sIFJlYWQgRGVzYyBTTSAqLworI2RlZmluZSBTTV9DVFJMX1dSX01TSwkoMHhmZkw8PDgpCS8qIEJpdCAxNS4uIDg6CUNvbnRyb2wgV3JpdGUgRGVzYyBTTSAqLworI2RlZmluZSBTTV9DVFJMX1RSX01TSwkweGZmTAkJLyogQml0CTcuLiAwOglDb250cm9sIFRyYW5zZmVyIFNNICovCisKKy8qCVFfVDFfVFIJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFRyYW5zZmVyIFNNICovCisvKglRX1QxX1dSCQkJIDggYml0CVRlc3QgUmVnaXN0ZXIgMSBXcml0ZSBEZXNjcmlwdG9yIFNNICovCisvKglRX1QxX1JECQkJIDggYml0CVRlc3QgUmVnaXN0ZXIgMSBSZWFkIERlc2NyaXB0b3IgU00gKi8KKy8qCVFfVDFfU1YJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFN1cGVydmlzb3IgU00gKi8KKworLyogVGhlIGNvbnRyb2wgc3RhdHVzIGJ5dGUgb2YgZWFjaCBtYWNoaW5lIGxvb2tzIGxpa2UgLi4uICovCisjZGVmaW5lIFNNX1NUQVRFCQkweGYwCS8qIEJpdCA3Li4gNDoJU3RhdGUgd2hpY2ggc2hhbGwgYmUgbG9hZGVkICovCisjZGVmaW5lIFNNX0xPQUQJCQlCSVRfM1MJLyogTG9hZCB0aGUgU00gd2l0aCBTTV9TVEFURSAqLworI2RlZmluZSBTTV9URVNUX09OCQlCSVRfMlMJLyogU3dpdGNoIG9uIFNNIFRlc3QgTW9kZSAqLworI2RlZmluZSBTTV9URVNUX09GRgkJQklUXzFTCS8qIEdvIG9mZiB0aGUgVGVzdCBNb2RlICovCisjZGVmaW5lIFNNX1NURVAJCQlCSVRfMFMJLyogU3RlcCB0aGUgU3RhdGUgTWFjaGluZSAqLworLyogVGhlIGVuY29kaW5nIG9mIHRoZSBzdGF0ZXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGlhZ25vc3RpY3MgVG9vbCAqLworCisvKglRX1QyCQkJMzIgYml0CVRlc3QgUmVnaXN0ZXIgMgkqLworCQkJCQkJCQkvKiBCaXQgMzEuLiA4OglyZXNlcnZlZCAqLworI2RlZmluZSBUMl9BQ19UX09OCQlCSVRfNwkvKiBBZGRyZXNzIENvdW50ZXIgVGVzdCBNb2RlIG9uICovCisjZGVmaW5lIFQyX0FDX1RfT0ZGCQlCSVRfNgkvKiBBZGRyZXNzIENvdW50ZXIgVGVzdCBNb2RlIG9mZiAqLworI2RlZmluZSBUMl9CQ19UX09OCQlCSVRfNQkvKiBCeXRlIENvdW50ZXIgVGVzdCBNb2RlIG9uICovCisjZGVmaW5lIFQyX0JDX1RfT0ZGCQlCSVRfNAkvKiBCeXRlIENvdW50ZXIgVGVzdCBNb2RlIG9mZiAqLworI2RlZmluZSBUMl9TVEVQMDQJCUJJVF8zCS8qIEluYyBBQy9EZWMgQkMgYnkgNCAqLworI2RlZmluZSBUMl9TVEVQMDMJCUJJVF8yCS8qIEluYyBBQy9EZWMgQkMgYnkgMyAqLworI2RlZmluZSBUMl9TVEVQMDIJCUJJVF8xCS8qIEluYyBBQy9EZWMgQkMgYnkgMiAqLworI2RlZmluZSBUMl9TVEVQMDEJCUJJVF8wCS8qIEluYyBBQy9EZWMgQkMgYnkgMSAqLworCisvKglRX1QzCQkJMzIgYml0CVRlc3QgUmVnaXN0ZXIgMwkqLworCQkJCQkJCQkvKiBCaXQgMzEuLiA3OglyZXNlcnZlZCAqLworI2RlZmluZSBUM19NVVhfTVNLCQkoNzw8NCkJLyogQml0ICA2Li4gNDoJTXV4IFBvc2l0aW9uICovCisJCQkJCQkJCS8qIEJpdCAgMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVDNfVlJBTV9NU0sJCTcJCS8qIEJpdCAgMi4uIDA6CVZpcnR1YWwgUkFNIEJ1ZmZlciBBZGRyZXNzICovCisKKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXIgT2Zmc2V0cywgdXNlIFJCX0FERFIoUXVldWUsIE9mZnMpIHRvIGFjY2VzcyAqLworLyoJUkJfU1RBUlQJCTMyIGJpdAlSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKy8qCVJCX0VORAkJCTMyIGJpdAlSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisvKglSQl9XUAkJCTMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KKy8qCVJCX1JQCQkJMzIgYml0CVJBTSBCdWZmZXIgUmVhZCBQb2ludGVyICovCisvKglSQl9SWF9VVFBQCQkzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisvKglSQl9SWF9MVFBQCQkzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisvKglSQl9SWF9VVEhQCQkzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKy8qCVJCX1JYX0xUSFAJCTMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworLyoJUkJfUEMJCQkzMiBiaXQJUkFNIEJ1ZmZlciBQYWNrZXQgQ291bnRlciAqLworLyoJUkJfTEVWCQkJMzIgYml0CVJBTSBCdWZmZXIgTGV2ZWwgUmVnaXN0ZXIgKi8KKwkJCQkvKiBCaXQgMzEuLjE5OglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9NU0sJMHgwMDA3ZmZmZgkvKiBCaXQgMTguLiAwOglSQU0gQnVmZmVyIFBvaW50ZXIgQml0cyAqLworCisvKglSQl9UU1QyCQkJIDggYml0CVJBTSBCdWZmZXIgVGVzdCBSZWdpc3RlciAyICovCisJCQkJCQkJCS8qIEJpdCA3Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkJfUENfREVDCQlCSVRfM1MJLyogUGFja2V0IENvdW50ZXIgRGVjcmVtICovCisjZGVmaW5lIFJCX1BDX1RfT04JCUJJVF8yUwkvKiBQYWNrZXQgQ291bnRlciBUZXN0IE9uICovCisjZGVmaW5lIFJCX1BDX1RfT0ZGCQlCSVRfMVMJLyogUGFja2V0IENvdW50ZXIgVHN0IE9mZiAqLworI2RlZmluZSBSQl9QQ19JTkMJCUJJVF8wUwkvKiBQYWNrZXQgQ291bnRlciBJbmNyZW0gKi8KKworLyoJUkJfVFNUMQkJCSA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMSAqLworCQkJCQkJCS8qIEJpdCA3OglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9XUF9UX09OCQlCSVRfNlMJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIFJCX1dQX1RfT0ZGCQlCSVRfNVMJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9mZiAqLworI2RlZmluZSBSQl9XUF9JTkMJCUJJVF80UwkvKiBXcml0ZSBQb2ludGVyIEluY3JlbSAqLworCQkJCQkJCQkvKiBCaXQgMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkJfUlBfVF9PTgkJQklUXzJTCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIFJCX1JQX1RfT0ZGCQlCSVRfMVMJLyogUmVhZCBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFJCX1JQX0RFQwkJQklUXzBTCS8qIFJlYWQgUG9pbnRlciBEZWNyZW1lbnQgKi8KKworLyoJUkJfQ1RSTAkJCSA4IGJpdAlSQU0gQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9FTkFfU1RGV0QJQklUXzVTCS8qIEVuYWJsZSAgU3RvcmUgJiBGb3J3YXJkICovCisjZGVmaW5lIFJCX0RJU19TVEZXRAlCSVRfNFMJLyogRGlzYWJsZSBTdG9yZSAmIEZvcndhcmQgKi8KKyNkZWZpbmUgUkJfRU5BX09QX01ECUJJVF8zUwkvKiBFbmFibGUgIE9wZXJhdGlvbiBNb2RlICovCisjZGVmaW5lIFJCX0RJU19PUF9NRAlCSVRfMlMJLyogRGlzYWJsZSBPcGVyYXRpb24gTW9kZSAqLworI2RlZmluZSBSQl9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgUkFNIEJ1ZiBTVE0gUmVzZXQgKi8KKyNkZWZpbmUgUkJfUlNUX1NFVAkJQklUXzBTCS8qIFNldCAgIFJBTSBCdWYgU1RNIFJlc2V0ICovCisKKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgTUFDIEZJRk8gUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisKKy8qCVJYX01GRl9FQQkJMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKy8qCVJYX01GRl9XUAkJMzIgYml0IAlSZWNlaXZlIE1BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKy8qCVJYX01GRl9SUAkJMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisvKglSWF9NRkZfUEMJCTMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIFBhY2tldCBDb3VudGVyICovCisvKglSWF9NRkZfTEVWCQkzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBMZXZlbCAqLworLyoJVFhfTUZGX0VBCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKy8qCVRYX01GRl9XUAkJMzIgYml0IAlUcmFuc21pdCBNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisvKglUWF9NRkZfV1NQCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gV1IgU2hhZG93IFBvaW50ZXIgKi8KKy8qCVRYX01GRl9SUAkJMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworLyoJVFhfTUZGX1BDCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUGFja2V0IENudCAqLworLyoJVFhfTUZGX0xFVgkJMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIExldmVsICovCisJCQkJCQkJCS8qIEJpdCAzMS4uIDY6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9NU0sJCQkweDAwN2ZMCS8qIEJpdAk1Li4gMDoJTUFDIEZJRk8gQWRkcmVzcy9QdHIgQml0cyAqLworCisvKglSWF9NRkZfQ1RSTDEJMTYgYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMSAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfRU5BX1JEWV9QQVQJQklUXzEzUwkJLyogRW5hYmxlICBSZWFkeSBQYXRjaCAqLworI2RlZmluZSBNRkZfRElTX1JEWV9QQVQJQklUXzEyUwkJLyogRGlzYWJsZSBSZWFkeSBQYXRjaCAqLworI2RlZmluZSBNRkZfRU5BX1RJTV9QQVQJQklUXzExUwkJLyogRW5hYmxlICBUaW1pbmcgUGF0Y2ggKi8KKyNkZWZpbmUgTUZGX0RJU19USU1fUEFUCUJJVF8xMFMJCS8qIERpc2FibGUgVGltaW5nIFBhdGNoICovCisjZGVmaW5lIE1GRl9FTkFfQUxNX0ZVTAlCSVRfOVMJCS8qIEVuYWJsZSAgQWxtb3N0RnVsbCBTaWduICovCisjZGVmaW5lIE1GRl9ESVNfQUxNX0ZVTAlCSVRfOFMJCS8qIERpc2FibGUgQWxtb3N0RnVsbCBTaWduICovCisjZGVmaW5lIE1GRl9FTkFfUEFVU0UJQklUXzdTCQkvKiBFbmFibGUgIFBhdXNlIFNpZ25hbGluZyAqLworI2RlZmluZSBNRkZfRElTX1BBVVNFCUJJVF82UwkJLyogRGlzYWJsZSBQYXVzZSBTaWduYWxpbmcgKi8KKyNkZWZpbmUgTUZGX0VOQV9GTFVTSAlCSVRfNVMJCS8qIEVuYWJsZSAgRnJhbWUgRmx1c2hpbmcgKi8KKyNkZWZpbmUgTUZGX0RJU19GTFVTSAlCSVRfNFMJCS8qIERpc2FibGUgRnJhbWUgRmx1c2hpbmcgKi8KKyNkZWZpbmUgTUZGX0VOQV9USVNUCUJJVF8zUwkJLyogRW5hYmxlICBUaW1lIFN0YW1wIEdlbmVyICovCisjZGVmaW5lIE1GRl9ESVNfVElTVAlCSVRfMlMJCS8qIERpc2FibGUgVGltZSBTdGFtcCBHZW5lciAqLworI2RlZmluZSBNRkZfQ0xSX0lOVElTVAlCSVRfMVMJCS8qIENsZWFyIElSUSBObyBUaW1lIFN0YW1wICovCisjZGVmaW5lIE1GRl9DTFJfSU5TVEFUCUJJVF8wUwkJLyogQ2xlYXIgSVJRIE5vIFN0YXR1cyAqLworCisjZGVmaW5lIE1GRl9SWF9DVFJMX0RFRiBNRkZfRU5BX1RJTV9QQVQKKworLyoJVFhfTUZGX0NUUkwxCTE2IGJpdAlUcmFuc21pdCBNQUMgRklGTyBDb250cm9sIFJlZyAxICovCisjZGVmaW5lIE1GRl9DTFJfUEVSUglCSVRfMTVTCQkvKiBDbGVhciBQYXJpdHkgRXJyb3IgSVJRICovCisJCQkJCQkJCS8qIEJpdCAxNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX0VOQV9QS1RfUkVDCUJJVF8xM1MJCS8qIEVuYWJsZSAgUGFja2V0IFJlY292ZXJ5ICovCisjZGVmaW5lIE1GRl9ESVNfUEtUX1JFQyBCSVRfMTJTCQkvKiBEaXNhYmxlIFBhY2tldCBSZWNvdmVyeSAqLworLyoJTUZGX0VOQV9USU1fUEFUCSAoc2VlIFJYX01GRl9DVFJMMSkgQml0IDExOglFbmFibGUgIFRpbWluZyBQYXRjaCAqLworLyoJTUZGX0RJU19USU1fUEFUCSAoc2VlIFJYX01GRl9DVFJMMSkgQml0IDEwOglEaXNhYmxlIFRpbWluZyBQYXRjaCAqLworLyoJTUZGX0VOQV9BTE1fRlVMCSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA5OglFbmFibGUgIEFsbW9zdCBGdWxsIFNpZ24gKi8KKy8qCU1GRl9ESVNfQUxNX0ZVTAkgKHNlZSBSWF9NRkZfQ1RSTDEpIEJpdAkgODoJRGlzYWJsZSBBbG1vc3QgRnVsbCBTaWduICovCisjZGVmaW5lIE1GRl9FTkFfVzRFCQlCSVRfN1MJCS8qIEVuYWJsZSAgV2FpdCBmb3IgRW1wdHkgKi8KKyNkZWZpbmUgTUZGX0RJU19XNEUJCUJJVF82UwkJLyogRGlzYWJsZSBXYWl0IGZvciBFbXB0eSAqLworLyoJTUZGX0VOQV9GTFVTSAkgKHNlZSBSWF9NRkZfQ1RSTDEpIEJpdAkgNToJRW5hYmxlICBGcmFtZSBGbHVzaGluZyAqLworLyoJTUZGX0RJU19GTFVTSAkgKHNlZSBSWF9NRkZfQ1RSTDEpIEJpdAkgNDoJRGlzYWJsZSBGcmFtZSBGbHVzaGluZyAqLworI2RlZmluZSBNRkZfRU5BX0xPT1BCCUJJVF8zUwkJLyogRW5hYmxlICBMb29wYmFjayAqLworI2RlZmluZSBNRkZfRElTX0xPT1BCCUJJVF8yUwkJLyogRGlzYWJsZSBMb29wYmFjayAqLworI2RlZmluZSBNRkZfQ0xSX01BQ19SU1QJQklUXzFTCQkvKiBDbGVhciBYTUFDIFJlc2V0ICovCisjZGVmaW5lIE1GRl9TRVRfTUFDX1JTVAlCSVRfMFMJCS8qIFNldCAgIFhNQUMgUmVzZXQgKi8KKworI2RlZmluZSBNRkZfVFhfQ1RSTF9ERUYJKE1GRl9FTkFfUEtUX1JFQyB8IE1GRl9FTkFfVElNX1BBVCB8IE1GRl9FTkFfRkxVU0gpCisKKy8qCVJYX01GRl9UU1QyCSAJIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAyICovCisvKglUWF9NRkZfVFNUMgkgCSA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDIgKi8KKwkJCQkJCQkJLyogQml0IDc6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9XU1BfVF9PTglCSVRfNlMJLyogVHg6IFdyaXRlIFNoYWRvdyBQdHIgVGVzdE9uICovCisjZGVmaW5lIE1GRl9XU1BfVF9PRkYJQklUXzVTCS8qIFR4OiBXcml0ZSBTaGFkb3cgUHRyIFRzdE9mZiAqLworI2RlZmluZSBNRkZfV1NQX0lOQwkJQklUXzRTCS8qIFR4OiBXcml0ZSBTaGFkb3cgUHRyIEluY3JlbWVudCAqLworI2RlZmluZSBNRkZfUENfREVDCQlCSVRfM1MJLyogUGFja2V0IENvdW50ZXIgRGVjcmVtZW50ICovCisjZGVmaW5lIE1GRl9QQ19UX09OCQlCSVRfMlMJLyogUGFja2V0IENvdW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBNRkZfUENfVF9PRkYJQklUXzFTCS8qIFBhY2tldCBDb3VudGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIE1GRl9QQ19JTkMJCUJJVF8wUwkvKiBQYWNrZXQgQ291bnRlciBJbmNyZW1lbnQgKi8KKworLyoJUlhfTUZGX1RTVDEJIAkgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDEgKi8KKy8qCVRYX01GRl9UU1QxCSAJIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnaXN0ZXIgMSAqLworCQkJCQkvKiBCaXQgNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX1dQX1RfT04JCUJJVF82UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgTUZGX1dQX1RfT0ZGCUJJVF81UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIE1GRl9XUF9JTkMJCUJJVF80UwkvKiBXcml0ZSBQb2ludGVyIEluY3JlbSAqLworCQkJCQkJCS8qIEJpdCAzOglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfUlBfVF9PTgkJQklUXzJTCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIE1GRl9SUF9UX09GRglCSVRfMVMJLyogUmVhZCBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIE1GRl9SUF9ERUMJCUJJVF8wUwkvKiBSZWFkIFBvaW50ZXIgRGVjcmVtZW50ICovCisKKy8qCVJYX01GRl9DVFJMMgkgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAyICovCisvKglUWF9NRkZfQ1RSTDIJIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIENvbnRyb2wgUmVnIDIgKi8KKwkJCQkJCQkJLyogQml0IDcuLjQ6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9FTkFfT1BfTUQJQklUXzNTCS8qIEVuYWJsZSAgT3BlcmF0aW9uIE1vZGUgKi8KKyNkZWZpbmUgTUZGX0RJU19PUF9NRAlCSVRfMlMJLyogRGlzYWJsZSBPcGVyYXRpb24gTW9kZSAqLworI2RlZmluZSBNRkZfUlNUX0NMUgkJQklUXzFTCS8qIENsZWFyIE1BQyBGSUZPIFJlc2V0ICovCisjZGVmaW5lIE1GRl9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgTUFDIEZJRk8gUmVzZXQgKi8KKworCisvKglMaW5rIExFRCBDb3VudGVyIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSAqLworCisvKglSWF9MRURfQ1RSTAkJIDggYml0CVJlY2VpdmUgTEVEIENudCBDb250cm9sIFJlZyAqLworLyoJVFhfTEVEX0NUUkwJCSA4IGJpdAlUcmFuc21pdCBMRUQgQ250IENvbnRyb2wgUmVnICovCisvKglMTktfU1lOQ19DVFJMCSA4IGJpdAlMaW5rIFN5bmMgQ250IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJCQkJCQkvKiBCaXQgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF9TVEFSVAkJQklUXzJTCS8qIFN0YXJ0IFRpbWVyICovCisjZGVmaW5lIExFRF9TVE9QCQlCSVRfMVMJLyogU3RvcCBUaW1lciAqLworI2RlZmluZSBMRURfU1RBVEUJCUJJVF8wUwkvKiBSeC9UeDogTEVEIFN0YXRlLCAxPUxFRCBvbiAqLworI2RlZmluZSBMRURfQ0xSX0lSUQkJQklUXzBTCS8qIExuazogCUNsZWFyIExpbmsgSVJRICovCisKKy8qCVJYX0xFRF9UU1QJCSA4IGJpdAlSZWNlaXZlIExFRCBDbnQgVGVzdCBSZWdpc3RlciAqLworLyoJVFhfTEVEX1RTVAkJIDggYml0CVRyYW5zbWl0IExFRCBDbnQgVGVzdCBSZWdpc3RlciAqLworLyoJTE5LX1NZTkNfVFNUCSA4IGJpdAlMaW5rIFN5bmMgQ250IFRlc3QgUmVnaXN0ZXIgKi8KKwkJCQkJCQkvKiBCaXQgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF9UX09OCQlCSVRfMlMJLyogTEVEIENvdW50ZXIgVGVzdCBtb2RlIE9uICovCisjZGVmaW5lIExFRF9UX09GRgkJQklUXzFTCS8qIExFRCBDb3VudGVyIFRlc3QgbW9kZSBPZmYgKi8KKyNkZWZpbmUgTEVEX1RfU1RFUAkJQklUXzBTCS8qIExFRCBDb3VudGVyIFN0ZXAgKi8KKworLyoJTE5LX0xFRF9SRUcJIAkgOCBiaXQJTGluayBMRUQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBMRURfQkxLX09OCQlCSVRfNVMJLyogTGluayBMRUQgQmxpbmtpbmcgT24gKi8KKyNkZWZpbmUgTEVEX0JMS19PRkYJCUJJVF80UwkvKiBMaW5rIExFRCBCbGlua2luZyBPZmYgKi8KKyNkZWZpbmUgTEVEX1NZTkNfT04JCUJJVF8zUwkvKiBVc2UgU3luYyBXaXJlIHRvIHN3aXRjaCBMRUQgKi8KKyNkZWZpbmUgTEVEX1NZTkNfT0ZGCUJJVF8yUwkvKiBEaXNhYmxlIFN5bmMgV2lyZSBJbnB1dCAqLworI2RlZmluZSBMRURfT04JCQlCSVRfMVMJLyogc3dpdGNoIExFRCBvbiAqLworI2RlZmluZSBMRURfT0ZGCQkJQklUXzBTCS8qIHN3aXRjaCBMRUQgb2ZmICovCisKKy8qCVJlY2VpdmUgYW5kIFRyYW5zbWl0IEdNQUMgRklGTyBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisKKy8qCVJYX0dNRl9FQQkJMzIgYml0CVJ4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJUlhfR01GX0FGX1RIUgkzMiBiaXQJUnggR01BQyBGSUZPIEFsbW9zdCBGdWxsIFRocmVzaC4gKi8KKy8qCVJYX0dNRl9XUAkJMzIgYml0IAlSeCBHTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworLyoJUlhfR01GX1dMRVYJCTMyIGJpdCAJUnggR01BQyBGSUZPIFdyaXRlIExldmVsICovCisvKglSWF9HTUZfUlAJCTMyIGJpdCAJUnggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworLyoJUlhfR01GX1JMRVYJCTMyIGJpdCAJUnggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKy8qCVRYX0dNRl9FQQkJMzIgYml0CVR4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJVFhfR01GX0FFX1RIUgkzMiBiaXQJVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2guKi8KKy8qCVRYX0dNRl9XUAkJMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworLyoJVFhfR01GX1dTUAkJMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgU2hhZG93IFB0ci4gKi8KKy8qCVRYX0dNRl9XTEVWCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBMZXZlbCAqLworLyoJVFhfR01GX1JQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKy8qCVRYX0dNRl9SU1RQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBSZXN0YXJ0IFBvaW50ZXIgKi8KKy8qCVRYX0dNRl9STEVWCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIExldmVsICovCisKKy8qCVJYX0dNRl9DVFJMX1QJMzIgYml0CVJ4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKwkJCQkJCS8qIEJpdHMgMzEuLjE1OglyZXNlcnZlZCAqLworI2RlZmluZSBHTUZfV1BfVFNUX09OCUJJVF8xNAkJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIEdNRl9XUF9UU1RfT0ZGCUJJVF8xMwkJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9mZiAqLworI2RlZmluZSBHTUZfV1BfU1RFUAkJQklUXzEyCQkvKiBXcml0ZSBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCisJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisjZGVmaW5lIEdNRl9SUF9UU1RfT04JQklUXzEwCQkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBHTUZfUlBfVFNUX09GRglCSVRfOQkJLyogUmVhZCBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIEdNRl9SUF9TVEVQCQlCSVRfOAkJLyogUmVhZCBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCisjZGVmaW5lIEdNRl9SWF9GX0ZMX09OCUJJVF83CQkvKiBSeCBGSUZPIEZsdXNoIE1vZGUgT24gKi8KKyNkZWZpbmUgR01GX1JYX0ZfRkxfT0ZGCUJJVF82CQkvKiBSeCBGSUZPIEZsdXNoIE1vZGUgT2ZmICovCisjZGVmaW5lIEdNRl9DTElfUlhfRk8JQklUXzUJCS8qIENsZWFyIElSUSBSeCBGSUZPIE92ZXJydW4gKi8KKyNkZWZpbmUgR01GX0NMSV9SWF9GQwlCSVRfNAkJLyogQ2xlYXIgSVJRIFJ4IEZyYW1lIENvbXBsZXRlICovCisjZGVmaW5lIEdNRl9PUEVSX09OCQlCSVRfMwkJLyogT3BlcmF0aW9uYWwgTW9kZSBPbiAqLworI2RlZmluZSBHTUZfT1BFUl9PRkYJQklUXzIJCS8qIE9wZXJhdGlvbmFsIE1vZGUgT2ZmICovCisjZGVmaW5lIEdNRl9SU1RfQ0xSCQlCSVRfMQkJLyogQ2xlYXIgR01BQyBGSUZPIFJlc2V0ICovCisjZGVmaW5lIEdNRl9SU1RfU0VUCQlCSVRfMAkJLyogU2V0ICAgR01BQyBGSUZPIFJlc2V0ICovCisKKy8qCVRYX0dNRl9DVFJMX1QJMzIgYml0CVR4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKwkJCQkJCS8qIEJpdHMgMzEuLjE5OglyZXNlcnZlZCAqLworI2RlZmluZSBHTUZfV1NQX1RTVF9PTglCSVRfMTgJCS8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgR01GX1dTUF9UU1RfT0ZGCUJJVF8xNwkJLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgR01GX1dTUF9TVEVQCUJJVF8xNgkJLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKwkJCQkJCS8qIEJpdHMgMTUuLjc6IHNhbWUgYXMgZm9yIFJYX0dNRl9DVFJMX1QgKi8KKyNkZWZpbmUgR01GX0NMSV9UWF9GVQlCSVRfNgkJLyogQ2xlYXIgSVJRIFR4IEZJRk8gVW5kZXJydW4gKi8KKyNkZWZpbmUgR01GX0NMSV9UWF9GQwlCSVRfNQkJLyogQ2xlYXIgSVJRIFR4IEZyYW1lIENvbXBsZXRlICovCisjZGVmaW5lIEdNRl9DTElfVFhfUEUJQklUXzQJCS8qIENsZWFyIElSUSBUeCBQYXJpdHkgRXJyb3IgKi8KKwkJCQkJCS8qIEJpdHMgMy4uMDogc2FtZSBhcyBmb3IgUlhfR01GX0NUUkxfVCAqLworCisjZGVmaW5lIEdNRl9SWF9DVFJMX0RFRgkJKEdNRl9PUEVSX09OIHwgR01GX1JYX0ZfRkxfT04pCisjZGVmaW5lIEdNRl9UWF9DVFJMX0RFRgkJR01GX09QRVJfT04KKworI2RlZmluZSBSWF9HTUZfRkxfVEhSX0RFRgkweDBhCS8qIFJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgZGVmYXVsdCAqLworCisvKglHTUFDX1RJX1NUX0NUUkwJIDggYml0CVRpbWUgU3RhbXAgVGltZXIgQ3RybCBSZWcgKFlVS09OIG9ubHkpICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01UX1NUX1NUQVJUCUJJVF8yUwkJLyogU3RhcnQgVGltZSBTdGFtcCBUaW1lciAqLworI2RlZmluZSBHTVRfU1RfU1RPUAkJQklUXzFTCQkvKiBTdG9wICBUaW1lIFN0YW1wIFRpbWVyICovCisjZGVmaW5lIEdNVF9TVF9DTFJfSVJRCUJJVF8wUwkJLyogQ2xlYXIgVGltZSBTdGFtcCBUaW1lciBJUlEgKi8KKworLyoJR01BQ19DVFJMCQkzMiBiaXQJR01BQyBDb250cm9sIFJlZyAoWVVLT04gb25seSkgKi8KKwkJCQkJCS8qIEJpdHMgMzEuLiA4OglyZXNlcnZlZCAqLworI2RlZmluZSBHTUNfSF9CVVJTVF9PTglCSVRfNwkJLyogSGFsZiBEdXBsZXggQnVyc3QgTW9kZSBPbiAqLworI2RlZmluZSBHTUNfSF9CVVJTVF9PRkYJQklUXzYJCS8qIEhhbGYgRHVwbGV4IEJ1cnN0IE1vZGUgT2ZmICovCisjZGVmaW5lIEdNQ19GX0xPT1BCX09OCUJJVF81CQkvKiBGSUZPIExvb3BiYWNrIE9uICovCisjZGVmaW5lIEdNQ19GX0xPT1BCX09GRglCSVRfNAkJLyogRklGTyBMb29wYmFjayBPZmYgKi8KKyNkZWZpbmUgR01DX1BBVVNFX09OCUJJVF8zCQkvKiBQYXVzZSBPbiAqLworI2RlZmluZSBHTUNfUEFVU0VfT0ZGCUJJVF8yCQkvKiBQYXVzZSBPZmYgKi8KKyNkZWZpbmUgR01DX1JTVF9DTFIJCUJJVF8xCQkvKiBDbGVhciBHTUFDIFJlc2V0ICovCisjZGVmaW5lIEdNQ19SU1RfU0VUCQlCSVRfMAkJLyogU2V0ICAgR01BQyBSZXNldCAqLworCisvKglHUEhZX0NUUkwJCTMyIGJpdAlHUEhZIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAzMS4uMjk6CXJlc2VydmVkICovCisjZGVmaW5lIEdQQ19TRUxfQkRUCQlCSVRfMjgJLyogU2VsZWN0IEJpLURpci4gVHJhbnNmZXIgZm9yIE1EQy9NRElPICovCisjZGVmaW5lIEdQQ19JTlRfUE9MX0hJCUJJVF8yNwkvKiBJUlEgUG9sYXJpdHkgaXMgQWN0aXZlIEhJR0ggKi8KKyNkZWZpbmUgR1BDXzc1X09ITQkJQklUXzI2CS8qIFVzZSA3NSBPaG0gVGVybWluYXRpb24gaW5zdGVhZCBvZiA1MCAqLworI2RlZmluZSBHUENfRElTX0ZDCQlCSVRfMjUJLyogRGlzYWJsZSBBdXRvbWF0aWMgRmliZXIvQ29wcGVyIERldGVjdGlvbiAqLworI2RlZmluZSBHUENfRElTX1NMRUVQCUJJVF8yNAkvKiBEaXNhYmxlIEVuZXJneSBEZXRlY3QgKi8KKyNkZWZpbmUgR1BDX0hXQ0ZHX01fMwlCSVRfMjMJLyogSFdDRkdfTU9ERVszXSAqLworI2RlZmluZSBHUENfSFdDRkdfTV8yCUJJVF8yMgkvKiBIV0NGR19NT0RFWzJdICovCisjZGVmaW5lIEdQQ19IV0NGR19NXzEJQklUXzIxCS8qIEhXQ0ZHX01PREVbMV0gKi8KKyNkZWZpbmUgR1BDX0hXQ0ZHX01fMAlCSVRfMjAJLyogSFdDRkdfTU9ERVswXSAqLworI2RlZmluZSBHUENfQU5FR18wCQlCSVRfMTkJLyogQU5FR1swXSAqLworI2RlZmluZSBHUENfRU5BX1hDCQlCSVRfMTgJLyogRW5hYmxlIE1ESSBjcm9zc292ZXIgKi8KKyNkZWZpbmUgR1BDX0RJU18xMjUJCUJJVF8xNwkvKiBEaXNhYmxlIDEyNSBNSHogY2xvY2sgKi8KKyNkZWZpbmUgR1BDX0FORUdfMwkJQklUXzE2CS8qIEFORUdbM10gKi8KKyNkZWZpbmUgR1BDX0FORUdfMgkJQklUXzE1CS8qIEFORUdbMl0gKi8KKyNkZWZpbmUgR1BDX0FORUdfMQkJQklUXzE0CS8qIEFORUdbMV0gKi8KKyNkZWZpbmUgR1BDX0VOQV9QQVVTRQlCSVRfMTMJLyogRW5hYmxlIFBhdXNlIChTWU1fT1JfUkVNKSAqLworI2RlZmluZSBHUENfUEhZQUREUl80CUJJVF8xMgkvKiBCaXQgNCBvZiBQaHkgQWRkciAqLworI2RlZmluZSBHUENfUEhZQUREUl8zCUJJVF8xMQkvKiBCaXQgMyBvZiBQaHkgQWRkciAqLworI2RlZmluZSBHUENfUEhZQUREUl8yCUJJVF8xMAkvKiBCaXQgMiBvZiBQaHkgQWRkciAqLworI2RlZmluZSBHUENfUEhZQUREUl8xCUJJVF85CS8qIEJpdCAxIG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzAJQklUXzgJLyogQml0IDAgb2YgUGh5IEFkZHIgKi8KKwkJCQkJCS8qIEJpdHMgIDcuLjI6CXJlc2VydmVkICovCisjZGVmaW5lIEdQQ19SU1RfQ0xSCQlCSVRfMQkvKiBDbGVhciBHUEhZIFJlc2V0ICovCisjZGVmaW5lIEdQQ19SU1RfU0VUCQlCSVRfMAkvKiBTZXQgICBHUEhZIFJlc2V0ICovCisKKyNkZWZpbmUgR1BDX0hXQ0ZHX0dNSUlfQ09QCShHUENfSFdDRkdfTV8zIHwgR1BDX0hXQ0ZHX01fMiB8IFwKKwkJCQkJCQkgR1BDX0hXQ0ZHX01fMSB8IEdQQ19IV0NGR19NXzApCisKKyNkZWZpbmUgR1BDX0hXQ0ZHX0dNSUlfRklCCSgJCQkJIEdQQ19IV0NGR19NXzIgfCBcCisJCQkJCQkJIEdQQ19IV0NGR19NXzEgfCBHUENfSFdDRkdfTV8wKQorCisjZGVmaW5lIEdQQ19BTkVHX0FEVl9BTExfTQkoR1BDX0FORUdfMyB8IEdQQ19BTkVHXzIgfCBcCisJCQkJCQkJIEdQQ19BTkVHXzEgfCBHUENfQU5FR18wKQorCisvKiBmb3JjZWQgc3BlZWQgYW5kIGR1cGxleCBtb2RlIChkb24ndCBtaXggd2l0aCBvdGhlciBBTkVHIGJpdHMpICovCisjZGVmaW5lIEdQQ19GUkMxME1CSVRfSEFMRgkwCisjZGVmaW5lIEdQQ19GUkMxME1CSVRfRlVMTAlHUENfQU5FR18wCisjZGVmaW5lIEdQQ19GUkMxMDBNQklUX0hBTEYJR1BDX0FORUdfMQorI2RlZmluZSBHUENfRlJDMTAwTUJJVF9GVUxMCShHUENfQU5FR18wIHwgR1BDX0FORUdfMSkKKworLyogYXV0by1uZWdvdGlhdGlvbiB3aXRoIGxpbWl0ZWQgYWR2ZXJ0aXNlZCBzcGVlZHMgKi8KKy8qIG1peCBvbmx5IHdpdGggbWFzdGVyL3NsYXZlIHNldHRpbmdzIChmb3IgY29wcGVyKSAqLworI2RlZmluZSBHUENfQURWXzEwMDBfSEFMRglHUENfQU5FR18yCisjZGVmaW5lIEdQQ19BRFZfMTAwMF9GVUxMCUdQQ19BTkVHXzMKKyNkZWZpbmUgR1BDX0FEVl9BTEwJCQkoR1BDX0FORUdfMiB8IEdQQ19BTkVHXzMpCisKKy8qIG1hc3Rlci9zbGF2ZSBzZXR0aW5ncyAqLworLyogb25seSBmb3IgY29wcGVyIHdpdGggMTAwMCBNYnBzICovCisjZGVmaW5lIEdQQ19GT1JDRV9NQVNURVIJMAorI2RlZmluZSBHUENfRk9SQ0VfU0xBVkUJCUdQQ19BTkVHXzAKKyNkZWZpbmUgR1BDX1BSRUZfTUFTVEVSCQlHUENfQU5FR18xCisjZGVmaW5lIEdQQ19QUkVGX1NMQVZFCQkoR1BDX0FORUdfMSB8IEdQQ19BTkVHXzApCisKKy8qCUdNQUNfSVJRX1NSQwkgOCBiaXQJR01BQyBJbnRlcnJ1cHQgU291cmNlIFJlZyAoWVVLT04gb25seSkgKi8KKy8qCUdNQUNfSVJRX01TSwkgOCBiaXQJR01BQyBJbnRlcnJ1cHQgTWFzayAgIFJlZyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgR01fSVNfVFhfQ09fT1YJQklUXzUJCS8qIFRyYW5zbWl0IENvdW50ZXIgT3ZlcmZsb3cgSVJRICovCisjZGVmaW5lIEdNX0lTX1JYX0NPX09WCUJJVF80CQkvKiBSZWNlaXZlIENvdW50ZXIgT3ZlcmZsb3cgSVJRICovCisjZGVmaW5lIEdNX0lTX1RYX0ZGX1VSCUJJVF8zCQkvKiBUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCisjZGVmaW5lIEdNX0lTX1RYX0NPTVBMCUJJVF8yCQkvKiBGcmFtZSBUcmFuc21pc3Npb24gQ29tcGxldGUgKi8KKyNkZWZpbmUgR01fSVNfUlhfRkZfT1IJQklUXzEJCS8qIFJlY2VpdmUgRklGTyBPdmVycnVuICovCisjZGVmaW5lIEdNX0lTX1JYX0NPTVBMCUJJVF8wCQkvKiBGcmFtZSBSZWNlcHRpb24gQ29tcGxldGUgKi8KKworI2RlZmluZSBHTUFDX0RFRl9NU0sJKEdNX0lTX1RYX0NPX09WIHwgR01fSVNfUlhfQ09fT1YgfCBcCisJCQkJCQlHTV9JU19UWF9GRl9VUikKKworLyoJR01BQ19MSU5LX0NUUkwJMTYgYml0CUdNQUMgTGluayBDb250cm9sIFJlZyAoWVVLT04gb25seSkgKi8KKwkJCQkJCS8qIEJpdHMgMTUuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBHTUxDX1JTVF9DTFIJQklUXzFTCQkvKiBDbGVhciBHTUFDIExpbmsgUmVzZXQgKi8KKyNkZWZpbmUgR01MQ19SU1RfU0VUCUJJVF8wUwkJLyogU2V0ICAgR01BQyBMaW5rIFJlc2V0ICovCisKKworLyoJV09MX0NUUkxfU1RBVAkxNiBiaXQJV09MIENvbnRyb2wvU3RhdHVzIFJlZyAqLworI2RlZmluZSBXT0xfQ1RMX0xJTktfQ0hHX09DQwkJCUJJVF8xNVMKKyNkZWZpbmUgV09MX0NUTF9NQUdJQ19QS1RfT0NDCQkJQklUXzE0UworI2RlZmluZSBXT0xfQ1RMX1BBVFRFUk5fT0NDCQkJCUJJVF8xM1MKKworI2RlZmluZSBXT0xfQ1RMX0NMRUFSX1JFU1VMVAkJCUJJVF8xMlMKKworI2RlZmluZSBXT0xfQ1RMX0VOQV9QTUVfT05fTElOS19DSEcJCUJJVF8xMVMKKyNkZWZpbmUgV09MX0NUTF9ESVNfUE1FX09OX0xJTktfQ0hHCQlCSVRfMTBTCisjZGVmaW5lIFdPTF9DVExfRU5BX1BNRV9PTl9NQUdJQ19QS1QJQklUXzlTCisjZGVmaW5lIFdPTF9DVExfRElTX1BNRV9PTl9NQUdJQ19QS1QJQklUXzhTCisjZGVmaW5lIFdPTF9DVExfRU5BX1BNRV9PTl9QQVRURVJOCQlCSVRfN1MKKyNkZWZpbmUgV09MX0NUTF9ESVNfUE1FX09OX1BBVFRFUk4JCUJJVF82UworCisjZGVmaW5lIFdPTF9DVExfRU5BX0xJTktfQ0hHX1VOSVQJCUJJVF81UworI2RlZmluZSBXT0xfQ1RMX0RJU19MSU5LX0NIR19VTklUCQlCSVRfNFMKKyNkZWZpbmUgV09MX0NUTF9FTkFfTUFHSUNfUEtUX1VOSVQJCUJJVF8zUworI2RlZmluZSBXT0xfQ1RMX0RJU19NQUdJQ19QS1RfVU5JVAkJQklUXzJTCisjZGVmaW5lIFdPTF9DVExfRU5BX1BBVFRFUk5fVU5JVAkJQklUXzFTCisjZGVmaW5lIFdPTF9DVExfRElTX1BBVFRFUk5fVU5JVAkJQklUXzBTCisKKyNkZWZpbmUgV09MX0NUTF9ERUZBVUxUCQkJCVwKKwkoV09MX0NUTF9ESVNfUE1FX09OX0xJTktfQ0hHIHwJXAorCVdPTF9DVExfRElTX1BNRV9PTl9QQVRURVJOIHwJXAorCVdPTF9DVExfRElTX1BNRV9PTl9NQUdJQ19QS1QgfAlcCisJV09MX0NUTF9ESVNfTElOS19DSEdfVU5JVCB8CQlcCisJV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUIHwJCVwKKwlXT0xfQ1RMX0RJU19NQUdJQ19QS1RfVU5JVCkKKworLyoJV09MX01BVENIX0NUTAkgOCBiaXQJV09MIE1hdGNoIENvbnRyb2wgUmVnICovCisjZGVmaW5lIFdPTF9DVExfUEFUVF9FTkEoeCkJCQkJKEJJVF8wIDw8ICh4KSkKKworI2RlZmluZSBTS19OVU1fV09MX1BBVFRFUk4JCTcKKyNkZWZpbmUgU0tfUEFUVEVSTl9QRVJfV09SRAkJNAorI2RlZmluZSBTS19CSVRNQVNLX1BBVFRFUk4JCTcKKyNkZWZpbmUgU0tfUE9XX1BBVFRFUk5fTEVOR1RICTEyOAorCisjZGVmaW5lIFdPTF9MRU5HVEhfTVNLCQkweDdmCisjZGVmaW5lIFdPTF9MRU5HVEhfU0hJRlQJOAorCisKKy8qIFJlY2VpdmUgYW5kIFRyYW5zbWl0IERlc2NyaXB0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBzdHJ1Y3QgKi8KK3R5cGVkZWYJc3RydWN0IHNfSHdUeGQgeworCVNLX1UzMiB2b2xhdGlsZQlUeEN0cmw7CS8qIFRyYW5zbWl0IEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisJU0tfVTMyCVR4TmV4dDsJCQkvKiBQaHlzaWNhbCBBZGRyZXNzIFBvaW50ZXIgdG8gdGhlIG5leHQgVHhEICovCisJU0tfVTMyCVR4QWRyTG87CQkvKiBQaHlzaWNhbCBUeCBCdWZmZXIgQWRkcmVzcyBsb3dlciBkd29yZCAqLworCVNLX1UzMglUeEFkckhpOwkJLyogUGh5c2ljYWwgVHggQnVmZmVyIEFkZHJlc3MgdXBwZXIgZHdvcmQgKi8KKwlTS19VMzIJVHhTdGF0OwkJCS8qIFRyYW5zbWl0IEZyYW1lIFN0YXR1cyBXb3JkICovCisjaWZuZGVmCVNLX1VTRV9SRVZfREVTQworCVNLX1UxNglUeFRjcE9mZnM7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgVmFsdWUgKi8KKwlTS19VMTYJVHhSZXMxOwkJCS8qIDE2IGJpdCByZXNlcnZlZCBmaWVsZCAqLworCVNLX1UxNglUeFRjcFdwOwkJLyogVENQIENoZWNrc3VtIFdyaXRlIFBvc2l0aW9uICovCisJU0tfVTE2CVR4VGNwU3A7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gKi8KKyNlbHNlCS8qIFNLX1VTRV9SRVZfREVTQyAqLworCVNLX1UxNglUeFJlczE7CQkJLyogMTYgYml0IHJlc2VydmVkIGZpZWxkICovCisJU0tfVTE2CVR4VGNwT2ZmczsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBWYWx1ZSAqLworCVNLX1UxNglUeFRjcFNwOwkJLyogVENQIENoZWNrc3VtIENhbGN1bGF0aW9uIFN0YXJ0IFBvc2l0aW9uICovCisJU0tfVTE2CVR4VGNwV3A7CQkvKiBUQ1AgQ2hlY2tzdW0gV3JpdGUgUG9zaXRpb24gKi8KKyNlbmRpZgkvKiBTS19VU0VfUkVWX0RFU0MgKi8KKwlTS19VMzIgIFR4UmVzMjsJCQkvKiAzMiBiaXQgcmVzZXJ2ZWQgZmllbGQgKi8KK30gU0tfSFdUWEQ7CisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciBzdHJ1Y3QgKi8KK3R5cGVkZWYJc3RydWN0IHNfSHdSeGQgeworCVNLX1UzMiB2b2xhdGlsZSBSeEN0cmw7CS8qIFJlY2VpdmUgQnVmZmVyIENvbnRyb2wgRmllbGQgKi8KKwlTS19VMzIJUnhOZXh0OwkJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUG9pbnRlciB0byB0aGUgbmV4dCBSeEQgKi8KKwlTS19VMzIJUnhBZHJMbzsJCS8qIFBoeXNpY2FsIFJ4IEJ1ZmZlciBBZGRyZXNzIGxvd2VyIGR3b3JkICovCisJU0tfVTMyCVJ4QWRySGk7CQkvKiBQaHlzaWNhbCBSeCBCdWZmZXIgQWRkcmVzcyB1cHBlciBkd29yZCAqLworCVNLX1UzMglSeFN0YXQ7CQkJLyogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgV29yZCAqLworCVNLX1UzMglSeFRpU3Q7CQkJLyogUmVjZWl2ZSBUaW1lIFN0YW1wIChmcm9tIFhNQUMgb24gR0VORVNJUykgKi8KKyNpZm5kZWYJU0tfVVNFX1JFVl9ERVNDCisJU0tfVTE2CVJ4VGNwU3VtMTsJCS8qIFRDUCBDaGVja3N1bSAxICovCisJU0tfVTE2CVJ4VGNwU3VtMjsJCS8qIFRDUCBDaGVja3N1bSAyICovCisJU0tfVTE2CVJ4VGNwU3AxOwkJLyogVENQIENoZWNrc3VtIENhbGN1bGF0aW9uIFN0YXJ0IFBvc2l0aW9uIDEgKi8KKwlTS19VMTYJUnhUY3BTcDI7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMiAqLworI2Vsc2UJLyogU0tfVVNFX1JFVl9ERVNDICovCisJU0tfVTE2CVJ4VGNwU3VtMjsJCS8qIFRDUCBDaGVja3N1bSAyICovCisJU0tfVTE2CVJ4VGNwU3VtMTsJCS8qIFRDUCBDaGVja3N1bSAxICovCisJU0tfVTE2CVJ4VGNwU3AyOwkJLyogVENQIENoZWNrc3VtIENhbGN1bGF0aW9uIFN0YXJ0IFBvc2l0aW9uIDIgKi8KKwlTS19VMTYJUnhUY3BTcDE7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMSAqLworI2VuZGlmCS8qIFNLX1VTRV9SRVZfREVTQyAqLworfSBTS19IV1JYRDsKKworLyoKKyAqIERyaXZlcnMgd2hpY2ggdXNlIHRoZSByZXZlcnNlIGRlc2NyaXB0b3IgZmVhdHVyZSAoUENJX09VUl9SRUdfMikKKyAqIHNob3VsZCBzZXQgdGhlIGRlZmluZSBTS19VU0VfUkVWX0RFU0MuCisgKiBTdHJ1Y3R1cmVzIGFyZSAnbm9ybWFseScgbm90IGVuZGlhbmVzcyBkZXBlbmRlbnQuIEJ1dCBpbgorICogdGhpcyBjYXNlIHRoZSBTS19VMTYgZmllbGRzIGFyZSBib3VuZCB0byBiaXQgcG9zaXRpb25zIGluc2lkZSB0aGUKKyAqIGRlc2NyaXB0b3IuIFJ4VGNwU3VtMSBlLmcuIG11c3Qgc3RhcnQgYXQgYml0IDAgd2l0aGluIHRoZSA2LnRoIERXb3JkLgorICogVGhlIGJpdCBwb3NpdGlvbnMgaW5zaWRlIGEgRFdvcmQgYXJlIG9mIGNvdXJzZSBlbmRpYW5lc3MgZGVwZW5kZW50IGFuZAorICogc3dhcHMgaWYgdGhlIERXb3JkIGlzIHN3YXBwZWQgYnkgdGhlIGhhcmR3YXJlLgorICovCisKKworLyogRGVzY3JpcHRvciBCaXQgRGVmaW5pdGlvbiAqLworLyoJVHhDdHJsCQlUcmFuc21pdCBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLworLyoJUnhDdHJsCQlSZWNlaXZlICBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLworI2RlZmluZSBCTVVfT1dOCQkJQklUXzMxCS8qIE9XTiBiaXQ6IDA9aG9zdC8xPUJNVSAqLworI2RlZmluZSBCTVVfU1RGCQkJQklUXzMwCS8qIFN0YXJ0IG9mIEZyYW1lICovCisjZGVmaW5lIEJNVV9FT0YJCQlCSVRfMjkJLyogRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIEJNVV9JUlFfRU9CCQlCSVRfMjgJLyogUmVxICJFbmQgb2YgQnVmZmVyIiBJUlEgKi8KKyNkZWZpbmUgQk1VX0lSUV9FT0YJCUJJVF8yNwkvKiBSZXEgIkVuZCBvZiBGcmFtZSIgSVJRICovCisvKiBUeEN0cmwgc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBCTVVfU1RGV0QJCUJJVF8yNgkvKiAoVHgpCVN0b3JlICYgRm9yd2FyZCBGcmFtZSAqLworI2RlZmluZSBCTVVfTk9fRkNTCQlCSVRfMjUJLyogKFR4KSBEaXNhYmxlIE1BQyBGQ1MgKENSQykgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBCTVVfU1cJCQlCSVRfMjQJLyogKFR4KQkxIGJpdCByZXMuIGZvciBTVyB1c2UgKi8KKy8qIFJ4Q3RybCBzcGVjaWZpYyBiaXRzICovCisjZGVmaW5lIEJNVV9ERVZfMAkJQklUXzI2CS8qIChSeCkJVHJhbnNmZXIgZGF0YSB0byBEZXYwICovCisjZGVmaW5lIEJNVV9TVEFUX1ZBTAlCSVRfMjUJLyogKFJ4KQlSeCBTdGF0dXMgVmFsaWQgKi8KKyNkZWZpbmUgQk1VX1RJU1RfVkFMCUJJVF8yNAkvKiAoUngpCVJ4IFRpbWVTdGFtcCBWYWxpZCAqLworCQkJCQkJCQkvKiBCaXQgMjMuLjE2OglCTVUgQ2hlY2sgT3Bjb2RlcyAqLworI2RlZmluZSBCTVVfQ0hFQ0sJCSgweDU1TDw8MTYpCS8qIERlZmF1bHQgQk1VIGNoZWNrICovCisjZGVmaW5lIEJNVV9UQ1BfQ0hFQ0sJKDB4NTZMPDwxNikJLyogRGVzY3Igd2l0aCBUQ1AgZXh0ICovCisjZGVmaW5lIEJNVV9VRFBfQ0hFQ0sJKDB4NTdMPDwxNikJLyogRGVzY3Igd2l0aCBVRFAgZXh0IChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBCTVVfQkJDCQkJMHhmZmZmTAkvKiBCaXQgMTUuLiAwOglCdWZmZXIgQnl0ZSBDb3VudGVyICovCisKKy8qCVR4U3RhdAkJVHJhbnNtaXQgRnJhbWUgU3RhdHVzIFdvcmQgKi8KKy8qCVJ4U3RhdAkJUmVjZWl2ZSBGcmFtZSBTdGF0dXMgV29yZCAqLworLyoKKyAqTm90ZTogVHhTdGF0IGlzIHJlc2VydmVkIGZvciBBU0lDIGxvb3BiYWNrIG1vZGUgb25seQorICoKKyAqCVRoZSBCaXRzIG9mIHRoZSBTdGF0dXMgd29yZHMgYXJlIGRlZmluZWQgaW4geG1hY19paS5oCisgKgkoc2VlIFhNUl9GUyBiaXRzKQorICovCisKKy8qIG1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWVzICovCisjZGVmaW5lIFFfUjEJMHgwMDAwCQkvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKyNkZWZpbmUgUV9SMgkweDAwODAJCS8qIFJlY2VpdmUgUXVldWUgMiAqLworI2RlZmluZSBRX1hTMQkweDAyMDAJCS8qIFN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDEgKi8KKyNkZWZpbmUgUV9YQTEJMHgwMjgwCQkvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBRX1hTMgkweDAzMDAJCS8qIFN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDIgKi8KKyNkZWZpbmUgUV9YQTIJMHgwMzgwCQkvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworCisvKgorICoJTWFjcm8gUV9BRERSKCkKKyAqCisgKglVc2UgdGhpcyBtYWNybyB0byBhY2Nlc3MgdGhlIFJlY2VpdmUgYW5kIFRyYW5zbWl0IFF1ZXVlIFJlZ2lzdGVycy4KKyAqCisgKiBwYXJhOgorICoJUXVldWUJUXVldWUgdG8gYWNjZXNzLgorICoJCQkJVmFsdWVzOiBRX1IxLCBRX1IyLCBRX1hTMSwgUV9YQTEsIFFfWFMyLCBhbmQgUV9YQTIKKyAqCU9mZnMJUXVldWUgcmVnaXN0ZXIgb2Zmc2V0LgorICoJCQkJVmFsdWVzOiBRX0QsIFFfREFfTCAuLi4gUV9UMiwgUV9UMworICoKKyAqIHVzYWdlCVNLX0lOMzIocEFDLCBRX0FERFIoUV9SMiwgUV9CQyksIHBWYWwpCisgKi8KKyNkZWZpbmUgUV9BRERSKFF1ZXVlLCBPZmZzKQkoQjhfUV9SRUdTICsgKFF1ZXVlKSArIChPZmZzKSkKKworLyoKKyAqCU1hY3JvIFJCX0FERFIoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyB0aGUgUkFNIEJ1ZmZlciBSZWdpc3RlcnMuCisgKgorICogcGFyYToKKyAqCVF1ZXVlCVF1ZXVlIHRvIGFjY2Vzcy4KKyAqCQkJCVZhbHVlczogUV9SMSwgUV9SMiwgUV9YUzEsIFFfWEExLCBRX1hTMiwgYW5kIFFfWEEyCisgKglPZmZzCVF1ZXVlIHJlZ2lzdGVyIG9mZnNldC4KKyAqCQkJCVZhbHVlczogUkJfU1RBUlQsIFJCX0VORCAuLi4gUkJfTEVWLCBSQl9DVFJMCisgKgorICogdXNhZ2UJU0tfSU4zMihwQUMsIFJCX0FERFIoUV9SMiwgUkJfUlApLCBwVmFsKQorICovCisjZGVmaW5lIFJCX0FERFIoUXVldWUsIE9mZnMpCShCMTZfUkFNX1JFR1MgKyAoUXVldWUpICsgKE9mZnMpKQorCisKKy8qIE1BQyBSZWxhdGVkIFJlZ2lzdGVycyAqLworI2RlZmluZSBNQUNfMQkJMAkvKiBiZWxvbmdzIHRvIHRoZSBwb3J0IG5lYXIgdGhlIHNsb3QgKi8KKyNkZWZpbmUgTUFDXzIJCTEJLyogYmVsb25ncyB0byB0aGUgcG9ydCBmYXIgYXdheSBmcm9tIHRoZSBzbG90ICovCisKKy8qCisgKglNYWNybyBNUl9BRERSKCkKKyAqCisgKglVc2UgdGhpcyBtYWNybyB0byBhY2Nlc3MgYSBNQUMgUmVsYXRlZCBSZWdpc3RlcnMgaW5zaWRlIHRoZSBBU0lDLgorICoKKyAqIHBhcmE6CisgKglNYWMJCU1BQyB0byBhY2Nlc3MuCisgKgkJCQlWYWx1ZXM6IE1BQ18xLCBNQUNfMgorICoJT2ZmcwlNQUMgcmVnaXN0ZXIgb2Zmc2V0LgorICoJCQkJVmFsdWVzOiBSWF9NRkZfRUEsIFJYX01GRl9XUCAuLi4gTE5LX0xFRF9SRUcsCisgKgkJCQkJCVRYX01GRl9FQSwgVFhfTUZGX1dQIC4uLiBUWF9MRURfVFNUCisgKgorICogdXNhZ2UJU0tfSU4zMihwQUMsIE1SX0FERFIoTUFDXzEsIFRYX01GRl9FQSksIHBWYWwpCisgKi8KKyNkZWZpbmUgTVJfQUREUihNYWMsIE9mZnMpCSgoKE1hYykgPDwgNykgKyAoT2ZmcykpCisKKyNpZmRlZglTS19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFhNX1dPUkRfTE8JMAorI2RlZmluZSBYTV9XT1JEX0hJCTEKKyNlbHNlCS8qICFTS19MSVRUTEVfRU5ESUFOICovCisjZGVmaW5lIFhNX1dPUkRfTE8JMQorI2RlZmluZSBYTV9XT1JEX0hJCTAKKyNlbmRpZgkvKiAhU0tfTElUVExFX0VORElBTiAqLworCisKKy8qCisgKiBtYWNyb3MgdG8gYWNjZXNzIHRoZSBYTUFDIChHRU5FU0lTIG9ubHkpCisgKgorICogWE1fSU4xNigpLAkJdG8gcmVhZCBhIDE2IGJpdCByZWdpc3RlciAoZS5nLiBYTV9NTVVfQ01EKQorICogWE1fT1VUMTYoKSwJCXRvIHdyaXRlIGEgMTYgYml0IHJlZ2lzdGVyIChlLmcuIFhNX01NVV9DTUQpCisgKiBYTV9JTjMyKCksCQl0byByZWFkIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIFhNX1RYX0VWX0NOVCkKKyAqIFhNX09VVDMyKCksCQl0byB3cml0ZSBhIDMyIGJpdCByZWdpc3RlciAoZS5nLiBYTV9UWF9FVl9DTlQpCisgKiBYTV9JTkFERFIoKSwJCXRvIHJlYWQgYSBuZXR3b3JrIGFkZHJlc3MgcmVnaXN0ZXIgKGUuZy4gWE1fU1JDX0NISykKKyAqIFhNX09VVEFERFIoKSwJdG8gd3JpdGUgYSBuZXR3b3JrIGFkZHJlc3MgcmVnaXN0ZXIgKGUuZy4gWE1fU1JDX0NISykKKyAqIFhNX0lOSEFTSCgpLAkJdG8gcmVhZCB0aGUgWE1fSFNNX0NISyByZWdpc3RlcgorICogWE1fT1VUSEFTSCgpCQl0byB3cml0ZSB0aGUgWE1fSFNNX0NISyByZWdpc3RlcgorICoKKyAqIHBhcmE6CisgKglNYWMJCVhNQUMgdG8gYWNjZXNzCQl2YWx1ZXM6IE1BQ18xIG9yIE1BQ18yCisgKglJb0MJCUkvTyBjb250ZXh0IG5lZWRlZCBmb3IgU0sgSS9PIG1hY3JvcworICoJUmVnCQlYTUFDIFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUKKyAqCShwKVZhbAlWYWx1ZSBvciBwb2ludGVyIHRvIHRoZSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgcmVhZCBvciB3cml0dGVuCisgKgorICogdXNhZ2U6CVhNX09VVDE2KElvQywgTUFDXzEsIFhNX01NVV9DTUQsIFZhbHVlKTsKKyAqLworCisjZGVmaW5lIFhNQShNYWMsIFJlZykJCQkJCQkJCQlcCisJKChCQVNFX1hNQUNfMSArIChNYWMpICogKEJBU0VfWE1BQ18yIC0gQkFTRV9YTUFDXzEpKSB8ICgoUmVnKSA8PCAxKSkKKworI2RlZmluZSBYTV9JTjE2KElvQywgTWFjLCBSZWcsIHBWYWwpCQkJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChwVmFsKSkKKworI2RlZmluZSBYTV9PVVQxNihJb0MsIE1hYywgUmVnLCBWYWwpCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAoVmFsKSkKKworI2RlZmluZSBYTV9JTjMyKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9MT10pOwkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksCQkJCQlcCisJCShTS19VMTYgU0tfRkFSKikmKChTS19VMTYgU0tfRkFSKikocFZhbCkpW1hNX1dPUkRfSEldKTsJCVwKK30KKworI2RlZmluZSBYTV9PVVQzMihJb0MsIE1hYywgUmVnLCBWYWwpIHsJCQkJCQkJCQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgKFNLX1UxNikoKFZhbCkgJiAweGZmZmZMKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrMikpLCAoU0tfVTE2KSgoKFZhbCkgPj4gMTYpICYgMHhmZmZmTCkpO1wKK30KKworLyogUmVtZW1iZXI6IHdlIGFyZSBhbHdheXMgd3JpdGluZyB0byAvIHJlYWRpbmcgZnJvbSBMSVRUTEUgRU5ESUFOIG1lbW9yeSAqLworCisjZGVmaW5lIFhNX0lOQUREUihJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VMTYJV29yZDsJCQkJCQkJCQkJXAorCVNLX1U4CSpwQnl0ZTsJCQkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4ICopJigoU0tfVTggKikocFZhbCkpWzBdOwkJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVsxXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrMikpLCAmV29yZCk7CQkJXAorCXBCeXRlWzJdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbM10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzQpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVs0XSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzVdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorfQorCisjZGVmaW5lIFhNX09VVEFERFIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTgJU0tfRkFSICpwQnl0ZTsJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCBTS19GQVIgKikmKChTS19VOCBTS19GQVIgKikocFZhbCkpWzBdOwlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVswXSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzFdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMl0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVszXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzRdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworI2RlZmluZSBYTV9JTkhBU0goSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTE2CVdvcmQ7CQkJCQkJCQkJCVwKKwlTS19VOAlTS19GQVIgKnBCeXRlOwkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4IFNLX0ZBUiAqKSYoKFNLX1U4IFNLX0ZBUiAqKShwVmFsKSlbMF07CVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVswXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzFdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMl0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVszXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzRdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbNV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzYpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVs2XSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzddID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorfQorCisjZGVmaW5lIFhNX09VVEhBU0goSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTgJU0tfRkFSICpwQnl0ZTsJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCBTS19GQVIgKikmKChTS19VOCBTS19GQVIgKikocFZhbCkpWzBdOwlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVswXSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzFdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMl0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVszXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzRdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzYpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs2XSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzddKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCit9CisKKy8qCisgKiBtYWNyb3MgdG8gYWNjZXNzIHRoZSBHTUFDIChZVUtPTiBvbmx5KQorICoKKyAqIEdNX0lOMTYoKSwJCXRvIHJlYWQgIGEgMTYgYml0IHJlZ2lzdGVyIChlLmcuIEdNX0dQX1NUQVQpCisgKiBHTV9PVVQxNigpLAkJdG8gd3JpdGUgYSAxNiBiaXQgcmVnaXN0ZXIgKGUuZy4gR01fR1BfQ1RSTCkKKyAqIEdNX0lOMzIoKSwJCXRvIHJlYWQgIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIEdNXykKKyAqIEdNX09VVDMyKCksCQl0byB3cml0ZSBhIDMyIGJpdCByZWdpc3RlciAoZS5nLiBHTV8pCisgKiBHTV9JTkFERFIoKSwJCXRvIHJlYWQgIGEgbmV0d29yayBhZGRyZXNzIHJlZ2lzdGVyIChlLmcuIEdNX1NSQ19BRERSXzFMKQorICogR01fT1VUQUREUigpLAl0byB3cml0ZSBhIG5ldHdvcmsgYWRkcmVzcyByZWdpc3RlciAoZS5nLiBHTV9TUkNfQUREUl8yTCkKKyAqIEdNX0lOSEFTSCgpLAkJdG8gcmVhZCAgdGhlIEdNX01DX0FERFJfSDEgcmVnaXN0ZXIKKyAqIEdNX09VVEhBU0goKQkJdG8gd3JpdGUgdGhlIEdNX01DX0FERFJfSDEgcmVnaXN0ZXIKKyAqCisgKiBwYXJhOgorICoJTWFjCQlHTUFDIHRvIGFjY2VzcwkJdmFsdWVzOiBNQUNfMSBvciBNQUNfMgorICoJSW9DCQlJL08gY29udGV4dCBuZWVkZWQgZm9yIFNLIEkvTyBtYWNyb3MKKyAqCVJlZwkJR01BQyBSZWdpc3RlciB0byByZWFkIG9yIHdyaXRlCisgKgkocClWYWwJVmFsdWUgb3IgcG9pbnRlciB0byB0aGUgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIHJlYWQgb3Igd3JpdHRlbgorICoKKyAqIHVzYWdlOglHTV9PVVQxNihJb0MsIE1BQ18xLCBHTV9HUF9DVFJMLCBWYWx1ZSk7CisgKi8KKworI2RlZmluZSBHTUEoTWFjLCBSZWcpCQkJCQkJCQkJXAorCSgoQkFTRV9HTUFDXzEgKyAoTWFjKSAqIChCQVNFX0dNQUNfMiAtIEJBU0VfR01BQ18xKSkgfCAoUmVnKSkKKworI2RlZmluZSBHTV9JTjE2KElvQywgTWFjLCBSZWcsIHBWYWwpCQkJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksIChwVmFsKSkKKworI2RlZmluZSBHTV9PVVQxNihJb0MsIE1hYywgUmVnLCBWYWwpCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAoVmFsKSkKKworI2RlZmluZSBHTV9JTjMyKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9MT10pOwkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksCQkJCQlcCisJCShTS19VMTYgU0tfRkFSKikmKChTS19VMTYgU0tfRkFSKikocFZhbCkpW1hNX1dPUkRfSEldKTsJCVwKK30KKworI2RlZmluZSBHTV9PVVQzMihJb0MsIE1hYywgUmVnLCBWYWwpIHsJCQkJCQkJCQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKFNLX1UxNikoKFZhbCkgJiAweGZmZmZMKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KSgoKFZhbCkgPj4gMTYpICYgMHhmZmZmTCkpO1wKK30KKworI2RlZmluZSBHTV9JTkFERFIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTE2CVdvcmQ7CQkJCQkJCQkJCVwKKwlTS19VOAkqcEJ5dGU7CQkJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCAqKSYoKFNLX1U4ICopKHBWYWwpKVswXTsJCQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAmV29yZCk7CQkJXAorCXBCeXRlWzBdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbMV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVsyXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzNdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys4KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbNF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVs1XSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKK30KKworI2RlZmluZSBHTV9PVVRBRERSKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJXAorCVNLX1U4CVNLX0ZBUiAqcEJ5dGU7CQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggU0tfRkFSICopJigoU0tfVTggU0tfRkFSICopKHBWYWwpKVswXTsJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKFNLX1UxNikJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMF0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsxXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzJdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbM10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzgpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs0XSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzVdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCit9CisKKyNkZWZpbmUgR01fSU5IQVNIKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJXAorCVNLX1UxNglXb3JkOwkJCQkJCQkJCQlcCisJU0tfVTgJKnBCeXRlOwkJCQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggKikmKChTS19VOCAqKShwVmFsKSlbMF07CQkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVswXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzFdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMl0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVszXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrOCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzRdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbNV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzEyKSksICZXb3JkKTsJCVwKKwlwQnl0ZVs2XSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzddID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorfQorCisjZGVmaW5lIEdNX09VVEhBU0goSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTgJKnBCeXRlOwkJCQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggKikmKChTS19VOCAqKShwVmFsKSlbMF07CQkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksIChTS19VMTYpCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzBdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsyXSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzNdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys4KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNF0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs1XSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrMTIpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs2XSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzddKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCit9CisKKy8qCisgKiBEaWZmZXJlbnQgTUFDIFR5cGVzCisgKi8KKyNkZWZpbmUgU0tfTUFDX1hNQUMJCTAJLyogWGFxdGkgWE1BQyBJSSAqLworI2RlZmluZSBTS19NQUNfR01BQwkJMQkvKiBNYXJ2ZWxsIEdNQUMgKi8KKworLyoKKyAqIERpZmZlcmVudCBQSFkgVHlwZXMKKyAqLworI2RlZmluZSBTS19QSFlfWE1BQwkJCTAJLyogaW50ZWdyYXRlZCBpbiBYTUFDIElJICovCisjZGVmaW5lIFNLX1BIWV9CQ09NCQkJMQkvKiBCcm9hZGNvbSBCQ001NDAwICovCisjZGVmaW5lIFNLX1BIWV9MT05FCQkJMgkvKiBMZXZlbCBPbmUgTFhUMTAwMCAqLworI2RlZmluZSBTS19QSFlfTkFUCQkJMwkvKiBOYXRpb25hbCBEUDgzODkxICovCisjZGVmaW5lIFNLX1BIWV9NQVJWX0NPUFBFUgk0CS8qIE1hcnZlbGwgODhFMTAxMVMgKi8KKyNkZWZpbmUgU0tfUEhZX01BUlZfRklCRVIJNQkvKiBNYXJ2ZWxsIDg4RTEwMTFTIHdvcmtpbmcgb24gZmliZXIgKi8KKworLyoKKyAqIFBIWSBhZGRyZXNzZXMgKGJpdHMgMTIuLjggb2YgUEhZIGFkZHJlc3MgcmVnKQorICovCisjZGVmaW5lIFBIWV9BRERSX1hNQUMJKDA8PDgpCisjZGVmaW5lIFBIWV9BRERSX0JDT00JKDE8PDgpCisjZGVmaW5lIFBIWV9BRERSX0xPTkUJKDM8PDgpCisjZGVmaW5lIFBIWV9BRERSX05BVAkoMDw8OCkKKworLyogR1BIWSBhZGRyZXNzIChiaXRzIDE1Li4xMSBvZiBTTUkgY29udHJvbCByZWcpICovCisjZGVmaW5lIFBIWV9BRERSX01BUlYJMAorCisvKgorICogbWFjcm9zIHRvIGFjY2VzcyB0aGUgUEhZCisgKgorICogUEhZX1JFQUQoKQkJcmVhZCBhIDE2IGJpdCB2YWx1ZSBmcm9tIHRoZSBQSFkKKyAqIFBIWV9XUklURSgpCQl3cml0ZSBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgUEhZCisgKgorICogcGFyYToKKyAqIAlJb0MJCUkvTyBjb250ZXh0IG5lZWRlZCBmb3IgU0sgSS9PIG1hY3JvcworICogCXBQb3J0CVBvaW50ZXIgdG8gcG9ydCBzdHJ1Y3QgZm9yIFBoeUFkZHIKKyAqIAlNYWMJCVhNQUMgdG8gYWNjZXNzCQl2YWx1ZXM6IE1BQ18xIG9yIE1BQ18yCisgKiAJUGh5UmVnCVBIWSBSZWdpc3RlciB0byByZWFkIG9yIHdyaXRlCisgKiAJKHApVmFsCVZhbHVlIG9yIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHdoaWNoIHNob3VsZCBiZSByZWFkIG9yCisgKgkJCXdyaXR0ZW4uCisgKgorICogdXNhZ2U6CVBIWV9SRUFEKElvQywgcFBvcnQsIE1BQ18xLCBQSFlfQ1RSTCwgVmFsdWUpOworICogV2FybmluZzogYSBQSFlfUkVBRCBvbiBhbiB1bmluaXRpYWxpemVkIFBIWSAoUEhZIHN0aWxsIGluIHJlc2V0KSBuZXZlcgorICogICAgICAgICAgY29tZXMgYmFjay4gVGhpcyBpcyBjaGVja2VkIGluIERFQlVHIG1vZGUuCisgKi8KKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgUEhZX1JFQUQoSW9DLCBwUG9ydCwgTWFjLCBQaHlSZWcsIHBWYWwpIHsJCQkJCQlcCisJU0tfVTE2IE1tdTsgIAkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJXAorCVhNX09VVDE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0FERFIsIChQaHlSZWcpIHwgKHBQb3J0KS0+UGh5QWRkcik7CVwKKwlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJCVwKKwlpZiAoKHBQb3J0KS0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgewkJCQkJCQkJXAorCQlkbyB7ICAJCQkJCQkJCQkJCQkJCQlcCisJCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fTU1VX0NNRCwgJk1tdSk7CQkJCQlcCisJCX0gd2hpbGUgKChNbXUgJiBYTV9NTVVfUEhZX1JEWSkgPT0gMCk7CQkJCQkJCVwKKwkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX1BIWV9EQVRBLCAocFZhbCkpOwkJCQkJCVwKKwl9ICAJCQkJCQkJCQkJCQkJCQkJCVwKK30KKyNlbHNlCisjZGVmaW5lIFBIWV9SRUFEKElvQywgcFBvcnQsIE1hYywgUGh5UmVnLCBwVmFsKSB7CQkJCQkJXAorCVNLX1UxNiBNbXU7ICAJCQkJCQkJCQkJCQkJCVwKKwlpbnQgX19pID0gMDsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCVwKKwlYTV9PVVQxNigoSW9DKSwgKE1hYyksIFhNX1BIWV9BRERSLCAoUGh5UmVnKSB8IChwUG9ydCktPlBoeUFkZHIpOwlcCisJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX1BIWV9EQVRBLCAocFZhbCkpOwkJCQkJCQlcCisJaWYgKChwUG9ydCktPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsJCQkJCQkJCVwKKwkJZG8geyAgCQkJCQkJCQkJCQkJCQkJXAorCQkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX01NVV9DTUQsICZNbXUpOwkJCQkJXAorCQkJX19pKys7CQkJCQkJCQkJCQkJCQlcCisJCQlpZiAoX19pID4gMTAwMDAwKSB7CQkJCQkJCQkJCQlcCisJCQkJU0tfREJHX1BSSU5URigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwkJXAorCQkJCVNLX0RCR19QUklOVEYoIlBIWV9SRUFEIG9uIHVuaW5pdGlhbGl6ZWQgUEhZXG4iKTsJCVwKKwkJCQlTS19EQkdfUFJJTlRGKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CQlcCisJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQlcCisJCX0gd2hpbGUgKChNbXUgJiBYTV9NTVVfUEhZX1JEWSkgPT0gMCk7CQkJCQkJCVwKKwkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX1BIWV9EQVRBLCAocFZhbCkpOwkJCQkJCVwKKwl9ICAJCQkJCQkJCQkJCQkJCQkJCVwKK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisjZGVmaW5lIFBIWV9XUklURShJb0MsIHBQb3J0LCBNYWMsIFBoeVJlZywgVmFsKSB7CQkJCQkJXAorCVNLX1UxNiBNbXU7CQkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgocFBvcnQpLT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CQkJCQkJCQlcCisJCWRvIHsgIAkJCQkJCQkJCQkJCQkJCVwKKwkJCVhNX0lOMTYoKElvQyksIChNYWMpLCBYTV9NTVVfQ01ELCAmTW11KTsJCQkJCVwKKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfQlVTWSkgIT0gMCk7CQkJCQkJCVwKKwl9ICAJCQkJCQkJCQkJCQkJCQkJCVwKKwlYTV9PVVQxNigoSW9DKSwgKE1hYyksIFhNX1BIWV9BRERSLCAoUGh5UmVnKSB8IChwUG9ydCktPlBoeUFkZHIpOwlcCisJWE1fT1VUMTYoKElvQyksIChNYWMpLCBYTV9QSFlfREFUQSwgKFZhbCkpOwkJCQkJCQlcCisJaWYgKChwUG9ydCktPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsJCQkJCQkJCVwKKwkJZG8geyAgCQkJCQkJCQkJCQkJCQkJXAorCQkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX01NVV9DTUQsICZNbXUpOwkJCQkJXAorCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9CVVNZKSAhPSAwKTsJCQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorfQorCisvKgorICoJTWFjcm8gUENJX0MoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyBQQ0kgY29uZmlnIHJlZ2lzdGVyIGZyb20gdGhlIEkvTyBzcGFjZS4KKyAqCisgKiBwYXJhOgorICoJQWRkcglQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlciB0byBhY2Nlc3MuCisgKgkJCVZhbHVlczoJUENJX1ZFTkRPUl9JRCAuLi4gUENJX1ZQRF9BRFJfUkVHLAorICoKKyAqIHVzYWdlCVNLX0lOMTYocEFDLCBQQ0lfQyhQQ0lfVkVORE9SX0lEKSwgcFZhbCk7CisgKi8KKyNkZWZpbmUgUENJX0MoQWRkcikJKEI3X0NGR19TUEMgKyAoQWRkcikpCS8qIFBDSSBDb25maWcgU3BhY2UgKi8KKworLyoKKyAqCU1hY3JvIFNLX0hXX0FERFIoQmFzZSwgQWRkcikKKyAqCisgKglDYWxjdWxhdGVzIHRoZSBlZmZlY3RpdmUgSFcgYWRkcmVzcworICoKKyAqIHBhcmE6CisgKglCYXNlCUkvTyBvciBtZW1vcnkgYmFzZSBhZGRyZXNzCisgKglBZGRyCUFkZHJlc3Mgb2Zmc2V0CisgKgorICogdXNhZ2U6CU1heSBiZSB1c2VkIGluIFNLX0lOeHggYW5kIFNLX09VVHh4IG1hY3JvcworICoJCSNkZWZpbmUgU0tfSU44KHBBQywgQWRkciwgcFZhbCkgLi4uXAorICoJCQkqcFZhbCA9IChTS19VOClpbnAoU0tfSFdfQUREUihwQUMtPkh3LklvcCwgQWRkcikpKQorICovCisjaWZkZWYgU0tfTUVNX01BUFBFRF9JTworI2RlZmluZSBTS19IV19BRERSKEJhc2UsIEFkZHIpCSgoQmFzZSkgKyAoQWRkcikpCisjZWxzZSAgLyogU0tfTUVNX01BUFBFRF9JTyAqLworI2RlZmluZSBTS19IV19BRERSKEJhc2UsIEFkZHIpCVwKKwkJCSgoQmFzZSkgKyAoKChBZGRyKSAmIDB4N2YpIHwgKCgoQWRkcikgPj4gNyA+IDApID8gMHg4MCA6IDApKSkKKyNlbmRpZiAvKiBTS19NRU1fTUFQUEVEX0lPICovCisKKyNkZWZpbmUgU1pfTE9ORwkoc2l6ZW9mKFNLX1UzMikpCisKKy8qCisgKglNYWNybyBTS19IV0FDX0xJTktfTEVEKCkKKyAqCisgKglVc2UgdGhpcyBtYWNybyB0byBzZXQgdGhlIGxpbmsgTEVEIG1vZGUuCisgKiBwYXJhOgorICoJcEFDCQlQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QKKyAqCUlvQwkJSS9PIGNvbnRleHQgbmVlZGVkIGZvciBTSyBJL08gbWFjcm9zCisgKiAgUG9ydAlQb3J0IG51bWJlcgorICoJTW9kZQlNb2RlIHRvIHNldCBmb3IgdGhpcyBMRUQKKyAqLworI2RlZmluZSBTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQb3J0LCBNb2RlKSBcCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgTE5LX0xFRF9SRUcpLCBNb2RlKTsKKworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19TS0dFSFdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vod3QuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMDAxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHd0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNraHd0LmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEV2ZW50IFNjaGVkdWxlciBNb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS43ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDEyOjU1OjA4ICQKKyAqIFB1cnBvc2U6CURlZmluZXMgZm9yIHRoZSBoYXJkd2FyZSB0aW1lciBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tHRUhXVC5ICWNvbnRhaW5zIGFsbCBkZWZpbmVzIGFuZCB0eXBlcyBmb3IgdGhlIHRpbWVyIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYJX1NLR0VIV1RfSF8KKyNkZWZpbmUgX1NLR0VIV1RfSF8KKworLyoKKyAqIFNLIEhhcmR3YXJlIFRpbWVyCisgKiAtIG5lZWRlZCB3aGVyZXZlciB0aGUgSFdUIG1vZHVsZSBpcyB1c2VkCisgKiAtIHVzZSBpbiBBZGFwdGVycyBjb250ZXh0IG5hbWUgcEFDLT5Id3QKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19Id3QgeworCVNLX1UzMgkJVFN0YXJ0OwkvKiBIV1Qgc3RhcnQgKi8KKwlTS19VMzIJCVRTdG9wOwkvKiBIV1Qgc3RvcCAqLworCWludAkJVEFjdGl2ZTsJLyogSFdUOiBmbGFnIDogYWN0aXZlL2luYWN0aXZlICovCit9IFNLX0hXVDsKKworZXh0ZXJuIHZvaWQgU2tId3RJbml0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworZXh0ZXJuIHZvaWQgU2tId3RTdGFydChTS19BQyAqcEFDLCBTS19JT0MgSW9jLCBTS19VMzIgVGltZSk7CitleHRlcm4gdm9pZCBTa0h3dFN0b3AoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CitleHRlcm4gU0tfVTMyIFNrSHd0UmVhZChTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKK2V4dGVybiB2b2lkIFNrSHd0SXNyKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworI2VuZGlmCS8qIF9TS0dFSFdUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWkyYy5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VpMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI2ZjZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VpMmMuaApAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2VpMmMuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgVFdTSS1Nb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4yNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8yMCAwOTowNjowNSAkCisgKiBQdXJwb3NlOglTcGVjaWFsIGRlZmluZXMgZm9yIFRXU0kKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLR0VJMkMuSAljb250YWlucyBhbGwgU0stOTh4eCBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUgVFdTSSBoYW5kbGluZworICovCisKKyNpZm5kZWYgX0lOQ19TS0dFSTJDX0hfCisjZGVmaW5lIF9JTkNfU0tHRUkyQ19IXworCisvKgorICogTWFjcm9zIHRvIGFjY2VzcyB0aGUgQjJfSTJDX0NUUkwKKyAqLworI2RlZmluZSBTS19JMkNfQ1RMKElvQywgZmxhZywgZGV2LCBkZXZfc2l6ZSwgcmVnLCBidXJzdCkgXAorCVNLX09VVDMyKElvQywgQjJfSTJDX0NUUkwsXAorCQkoZmxhZyA/IDB4ODAwMDAwMDBVTCA6IDB4MEwpIHwgXAorCQkoKChTS19VMzIpcmVnIDw8IDE2KSAmIEkyQ19BRERSKSB8IFwKKwkJKCgoU0tfVTMyKWRldiA8PCA5KSAmIEkyQ19ERVZfU0VMKSB8IFwKKwkJKGRldl9zaXplICYgSTJDX0RFVl9TSVpFKSB8IFwKKwkJKChidXJzdCA8PCA0KSAmIEkyQ19CVVJTVF9MRU4pKQorCisjZGVmaW5lIFNLX0kyQ19TVE9QKElvQykgewkJCQlcCisJU0tfVTMyCUkyY0N0cmw7CQkJCVwKKwlTS19JTjMyKElvQywgQjJfSTJDX0NUUkwsICZJMmNDdHJsKTsJCVwKKwlTS19PVVQzMihJb0MsIEIyX0kyQ19DVFJMLCBJMmNDdHJsIHwgSTJDX1NUT1ApOwlcCit9CisKKyNkZWZpbmUgU0tfSTJDX0dFVF9DVEwoSW9DLCBwSTJjQ3RybCkJU0tfSU4zMihJb0MsIEIyX0kyQ19DVFJMLCBwSTJjQ3RybCkKKworLyoKKyAqIE1hY3JvcyB0byBhY2Nlc3MgdGhlIFRXU0kgU1cgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0tfSTJDX1NFVF9CSVQoSW9DLCBTZXRCaXRzKSB7CQkJXAorCVNLX1U4CU9yZ0JpdHM7CQkJCVwKKwlTS19JTjgoSW9DLCBCMl9JMkNfU1csICZPcmdCaXRzKTsJCVwKKwlTS19PVVQ4KElvQywgQjJfSTJDX1NXLCBPcmdCaXRzIHwgKFNLX1U4KShTZXRCaXRzKSk7CVwKK30KKworI2RlZmluZSBTS19JMkNfQ0xSX0JJVChJb0MsIENsckJpdHMpIHsJCQlcCisJU0tfVTgJT3JnQml0czsJCQkJXAorCVNLX0lOOChJb0MsIEIyX0kyQ19TVywgJk9yZ0JpdHMpOwkJXAorCVNLX09VVDgoSW9DLCBCMl9JMkNfU1csIE9yZ0JpdHMgJiB+KChTS19VOCkoQ2xyQml0cykpKTsJXAorfQorCisjZGVmaW5lIFNLX0kyQ19HRVRfU1coSW9DLCBwSTJjU3cpCVNLX0lOOChJb0MsIEIyX0kyQ19TVywgcEkyY1N3KQorCisvKgorICogZGVmaW5lIHRoZSBwb3NzaWJsZSBzZW5zb3Igc3RhdGVzCisgKi8KKyNkZWZpbmUJU0tfU0VOX0lETEUJCTAJLyogSWRsZTogc2Vuc29yIG5vdCByZWFkICovCisjZGVmaW5lCVNLX1NFTl9WQUxVRQkxCS8qIFZhbHVlIFJlYWQgY3ljbGUgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBTEVYVAkyCS8qIEV4dGVuZGVkIFZhbHVlIFJlYWQgY3ljbGUgKi8KKworLyoKKyAqIENvbnZlcnNpb24gZmFjdG9yIHRvIGNvbnZlcnQgcmVhZCBWb2x0YWdlIHNlbnNvciB0byBtaWxsaSBWb2x0CisgKiBDb252ZXJzaW9uIGZhY3RvciB0byBjb252ZXJ0IHJlYWQgVGVtcGVyYXR1cmUgc2Vuc29yIHRvIDEwdGggZGVncmVlIENlbHNpdXMKKyAqLworI2RlZmluZQlTS19MTTgwX1ZUX0xTQgkJMjIJLyogMjJtViBMU0IgcmVzb2x1dGlvbiAqLworI2RlZmluZQlTS19MTTgwX1RFTVBfTFNCCTEwCS8qIDEgZGVncmVlIExTQiByZXNvbHV0aW9uICovCisjZGVmaW5lCVNLX0xNODBfVEVNUEVYVF9MU0IJIDUJLyogMC41IGRlZ3JlZSBMU0IgcmVzb2x1dGlvbiBmb3IgZXh0LiB2YWwuICovCisKKy8qCisgKiBmb3JtdWxhOiBjb3VudGVyID0gKDIyNTAwKjYwKS8ocnBtICogZGl2aXNvciAqIHB1bHNlcy8yKQorICogYXNzdW1pbmc6IDY1MDBycG0sIDQgcHVsc2VzLCBkaXZpc29yIDEKKyAqLworI2RlZmluZSBTS19MTTgwX0ZBTl9GQUtUT1IJKCgyMjUwMEwqNjApLygxKjIpKQorCisvKgorICogRGVmaW5lIHNlbnNvciBtYW5hZ2VtZW50IGRhdGEKKyAqIE1heGltdW0gaXMgcmVhY2hlZCBvbiBHZW5lc2lzIGNvcHBlciBkdWFsIHBvcnQgYW5kIFl1a29uLTY0CisgKiBCb2FyZCBzcGVjaWZpYyBtYXhpbXVtIGlzIGluIHBBQy0+STJjLk1heFNlbnMKKyAqLworI2RlZmluZQlTS19NQVhfU0VOU09SUwk4CS8qIG1heGltYWwgbm8uIG9mIGluc3RhbGxlZCBzZW5zb3JzICovCisjZGVmaW5lCVNLX01JTl9TRU5TT1JTCTUJLyogbWluaW1hbCBuby4gb2YgaW5zdGFsbGVkIHNlbnNvcnMgKi8KKworLyoKKyAqIFRvIHdhdGNoIHRoZSBzdGF0ZSBtYWNoaW5lIChTTSkgdXNlIHRoZSB0aW1lciBpbiB0d28gd2F5cworICogaW5zdGVhZCBvZiBvbmUgYXMgaGl0aGVydG8KKyAqLworI2RlZmluZQlTS19USU1FUl9XQVRDSF9TTQkJMAkvKiBXYXRjaCB0aGUgU00gdG8gZmluaXNoIGluIGEgc3BlYy4gdGltZSAqLworI2RlZmluZQlTS19USU1FUl9ORVdfR0FVR0lORwkxCS8qIFN0YXJ0IGEgbmV3IGdhdWdpbmcgd2hlbiB0aW1lciBleHBpcmVzICovCisKKy8qCisgKiBEZWZpbmVzIGZvciB0aGUgaW5kaXZpZHVhbCB0aHJlc2hvbGRzCisgKi8KKworLyogVGVtcGVyYXR1cmUgc2Vuc29yICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0hJR0hfRVJSCTgwMAkvKiBUZW1wZXJhdHVyZSBIaWdoIEVyciAgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0hJR0hfV0FSTgk3MDAJLyogVGVtcGVyYXR1cmUgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVEVNUF9MT1dfV0FSTgkxMDAJLyogVGVtcGVyYXR1cmUgTG93ICBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVEVNUF9MT1dfRVJSCQkgIDAJLyogVGVtcGVyYXR1cmUgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKiBWQ0Mgd2hpY2ggc2hvdWxkIGJlIDUgViAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0hJR0hfRVJSCQk1NTg4CS8qIFZvbHRhZ2UgUENJIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV81Vl9ISUdIX1dBUk4JCTUzNDYJLyogVm9sdGFnZSBQQ0kgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0xPV19XQVJOCQk0NjY0CS8qIFZvbHRhZ2UgUENJIExvdyAgV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV81Vl9MT1dfRVJSCQk0NDIyCS8qIFZvbHRhZ2UgUENJIExvdyAgRXJyICBUaHJlc2hvbGQgKi8KKworLyoKKyAqIFZJTyBtYXkgYmUgNSBWIG9yIDMuMyBWLiBJbml0aWFsaXphdGlvbiB0YWtlcyB0d28gcGFydHM6CisgKiAxLiBJbml0aWFsaXplIGxvd2VzdCBsb3dlciBsaW1pdCBhbmQgaGlnaGVzdCBoaWdoZXIgbGltaXQuCisgKiAyLiBBZnRlciB0aGUgZmlyc3QgdmFsdWUgaXMgcmVhZCBjb3JyZWN0IHRoZSB1cHBlciBvciB0aGUgbG93ZXIgbGltaXQgdG8KKyAqICAgIHRoZSBhcHByb3ByaWF0ZSBDIGNvbnN0YW50LgorICoKKyAqIFdhcm5pbmcgbGltaXRzIGFyZSArLTUlIG9mIHRoZSBleGVwZWN0ZWQgdm9sdGFnZS4KKyAqIEVycm9yIGxpbWl0cyBhcmUgKy0xMCUgb2YgdGhlIGV4cGVjdGVkIHZvbHRhZ2UuCisgKi8KKworLyogQnVnIGZpeCBBRjogMTYuQXVnLjIwMDE6IENvcnJlY3QgdGhlIGluaXQgYmFzZSBvZiBMTTgwIHNlbnNvciAqLworCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fNVZfSElHSF9FUlIJNTU2NgkvKiArIDEwJSBWIFBDSS1JTyBIaWdoIEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9ISUdIX1dBUk4JNTMyNAkvKiArICA1JSBWIFBDSS1JTyBIaWdoIFdhcm4gVGhyZXNob2xkICovCisJCQkJCS8qCQk1MDAwCW1Wb2x0ICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fNVZfTE9XX1dBUk4JNDY4NgkvKiAtICA1JSBWIFBDSS1JTyBMb3cgV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9MT1dfRVJSCTQ0NDQJLyogLSAxMCUgViBQQ0ktSU8gTG93IEVyciBUaHJlc2hvbGQgKi8KKworI2RlZmluZQlTS19TRU5fUENJX0lPX1JBTkdFX0xJTUlURVIJNDAwMAkvKiA0MDAwIG1WIHJhbmdlIGRlbGltaXRlciAqLworCisvKiBjb3JyZWN0aW9uIHZhbHVlcyBmb3IgdGhlIHNlY29uZCBwYXNzICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fM1YzX0hJR0hfRVJSCTM4NTAJLyogKyAxNSUgViBQQ0ktSU8gSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fM1YzX0hJR0hfV0FSTgkzNjc0CS8qICsgMTAlIFYgUENJLUlPIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKwkJCQkJLyoJCTMzMDAJbVZvbHQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfTE9XX1dBUk4JMjkyNgkvKiAtIDEwJSBWIFBDSS1JTyBMb3cgV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfTE9XX0VSUgkyNzcyCS8qIC0gMTUlIFYgUENJLUlPIExvdyBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogVkREIHZvbHRhZ2UKKyAqLworI2RlZmluZQlTS19TRU5fVkREX0hJR0hfRVJSCQkzNjMwCS8qIFZvbHRhZ2UgQVNJQyBIaWdoIEVyciAgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WRERfSElHSF9XQVJOCTM0NzYJLyogVm9sdGFnZSBBU0lDIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZERF9MT1dfV0FSTgkJMzE0NgkvKiBWb2x0YWdlIEFTSUMgTG93ICBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkREX0xPV19FUlIJCTI5NzAJLyogVm9sdGFnZSBBU0lDIExvdyAgRXJyICBUaHJlc2hvbGQgKi8KKworLyoKKyAqIFBIWSBQTEwgM1YzIHZvbHRhZ2UKKyAqLworI2RlZmluZQlTS19TRU5fUExMXzNWM19ISUdIX0VSUgkJMzYzMAkvKiBWb2x0YWdlIFBNQSBIaWdoIEVyciAgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QTExfM1YzX0hJR0hfV0FSTgkzNDc2CS8qIFZvbHRhZ2UgUE1BIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BMTF8zVjNfTE9XX1dBUk4JCTMxNDYJLyogVm9sdGFnZSBQTUEgTG93ICBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUExMXzNWM19MT1dfRVJSCQkyOTcwCS8qIFZvbHRhZ2UgUE1BIExvdyAgRXJyICBUaHJlc2hvbGQgKi8KKworLyoKKyAqIFZBVVggKFlVS09OIG9ubHkpCisgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBVVhfM1YzX0hJR0hfRVJSCTM2MzAJLyogVm9sdGFnZSBWQVVYIEhpZ2ggRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfSElHSF9XQVJOCTM0NzYJLyogVm9sdGFnZSBWQVVYIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBVVhfM1YzX0xPV19XQVJOCTMxNDYJLyogVm9sdGFnZSBWQVVYIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfTE9XX0VSUgkJMjk3MAkvKiBWb2x0YWdlIFZBVVggTG93IEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBVVhfMFZfV0FSTl9FUlIJCSAgIDAJLyogaWYgVkFVWCBub3QgcHJlc2VudCAqLworI2RlZmluZQlTS19TRU5fVkFVWF9SQU5HRV9MSU1JVEVSCTEwMDAJLyogMTAwMCBtViByYW5nZSBkZWxpbWl0ZXIgKi8KKworLyoKKyAqIFBIWSAyVjUgdm9sdGFnZQorICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0hJR0hfRVJSCQkyNzUwCS8qIFZvbHRhZ2UgUEhZIEhpZ2ggRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUEhZXzJWNV9ISUdIX1dBUk4JMjY0MAkvKiBWb2x0YWdlIFBIWSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0xPV19XQVJOCQkyMzc2CS8qIFZvbHRhZ2UgUEhZIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUEhZXzJWNV9MT1dfRVJSCQkyMjIyCS8qIFZvbHRhZ2UgUEhZIExvdyBFcnIgVGhyZXNob2xkICovCisKKy8qCisgKiBBU0lDIENvcmUgMVY1IHZvbHRhZ2UgKFlVS09OIG9ubHkpCisgKi8KKyNkZWZpbmUJU0tfU0VOX0NPUkVfMVY1X0hJR0hfRVJSCTE2NTAJLyogVm9sdGFnZSBBU0lDIENvcmUgSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9DT1JFXzFWNV9ISUdIX1dBUk4JMTU3NQkvKiBWb2x0YWdlIEFTSUMgQ29yZSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9DT1JFXzFWNV9MT1dfV0FSTgkxNDI1CS8qIFZvbHRhZ2UgQVNJQyBDb3JlIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fQ09SRV8xVjVfTE9XX0VSUiAJMTM1MAkvKiBWb2x0YWdlIEFTSUMgQ29yZSBMb3cgRXJyIFRocmVzaG9sZCAqLworCisvKgorICogRkFOIDEgc3BlZWQKKyAqLworLyogYXNzdW1pbmc6IDY1MDBycG0gKy0xNSUsIDQgcHVsc2VzLAorICogd2FybmluZyBhdDoJODAgJQorICogZXJyb3IgYXQ6CTcwICUKKyAqIG5vIHVwcGVyIGxpbWl0CisgKi8KKyNkZWZpbmUJU0tfU0VOX0ZBTl9ISUdIX0VSUgkJMjAwMDAJLyogRkFOIFNwZWVkIEhpZ2ggRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fRkFOX0hJR0hfV0FSTgkyMDAwMAkvKiBGQU4gU3BlZWQgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fRkFOX0xPV19XQVJOCQkgNTIwMAkvKiBGQU4gU3BlZWQgTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9GQU5fTE9XX0VSUgkJIDQ1NTAJLyogRkFOIFNwZWVkIExvdyBFcnIgVGhyZXNob2xkICovCisKKy8qCisgKiBTb21lIFZvbHRhZ2VzIG5lZWQgZHluYW1pYyB0aHJlc2hvbGRzCisgKi8KKyNkZWZpbmUJU0tfU0VOX0RZTl9JTklUX05PTkUJCSAwICAvKiBObyBkeW5hbWljIGluaXQgb2YgdGhyZXNob2xkcyAqLworI2RlZmluZQlTS19TRU5fRFlOX0lOSVRfUENJX0lPCQkxMCAgLyogSW5pdCBQQ0ktSU8gd2l0aCBuZXcgdGhyZXNob2xkcyAqLworI2RlZmluZQlTS19TRU5fRFlOX0lOSVRfVkFVWAkJMTEgIC8qIEluaXQgVkFVWCB3aXRoIG5ldyB0aHJlc2hvbGRzICovCisKK2V4dGVybglpbnQgU2tMbTgwUmVhZFNlbnNvcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19TRU5TT1IgKnBTZW4pOworI2VuZGlmCS8qIG5fSU5DX1NLR0VJMkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vpbml0LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODRmNDdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vpbml0LmgKQEAgLTAsMCArMSw4NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlaW5pdC5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjgzICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDE0OjA3OjM3ICQKKyAqIFB1cnBvc2U6CVN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgZm9yIHRoZSBHRSBJbml0IE1vZHVsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLR0VJTklUX0hfCisjZGVmaW5lIF9fSU5DX1NLR0VJTklUX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTS19URVNUX1ZBTAkJMHgxMTMzNTU3N1VMCisKKy8qIG1vZGlmeWluZyBMaW5rIExFRCBiZWhhdmlvdXIgKHVzZWQgd2l0aCBTa0dlTGlua0xFRCgpKSAqLworI2RlZmluZSBTS19MTktfT0ZGCQlMRURfT0ZGCisjZGVmaW5lIFNLX0xOS19PTgkJKExFRF9PTiB8IExFRF9CTEtfT0ZGIHwgTEVEX1NZTkNfT0ZGKQorI2RlZmluZSBTS19MTktfQkxJTksJKExFRF9PTiB8IExFRF9CTEtfT04gIHwgTEVEX1NZTkNfT04pCisjZGVmaW5lIFNLX0xOS19QRVJNCQkoTEVEX09OIHwgTEVEX0JMS19PRkYgfCBMRURfU1lOQ19PTikKKyNkZWZpbmUgU0tfTE5LX1RTVAkJKExFRF9PTiB8IExFRF9CTEtfT04gIHwgTEVEX1NZTkNfT0ZGKQorCisvKiBwYXJhbWV0ZXIgJ01vZGUnIHdoZW4gY2FsbGluZyBTS19IV0FDX0xJTktfTEVEKCkgKi8KKyNkZWZpbmUgU0tfTEVEX09GRgkJTEVEX09GRgorI2RlZmluZSBTS19MRURfQUNUSVZFCShMRURfT04gfCBMRURfQkxLX09GRiB8IExFRF9TWU5DX09GRikKKyNkZWZpbmUgU0tfTEVEX1NUQU5EQlkJKExFRF9PTiB8IExFRF9CTEtfT04gIHwgTEVEX1NZTkNfT0ZGKQorCisvKiBhZGRyZXNzaW5nIExFRCBSZWdpc3RlcnMgaW4gU2tHZVhtaXRMRUQoKSAqLworI2RlZmluZSBYTUlUX0xFRF9JTkkJMAorI2RlZmluZSBYTUlUX0xFRF9DTlQJKFJYX0xFRF9WQUwgLSBSWF9MRURfSU5JKQorI2RlZmluZSBYTUlUX0xFRF9DVFJMCShSWF9MRURfQ1RSTC0gUlhfTEVEX0lOSSkKKyNkZWZpbmUgWE1JVF9MRURfVFNUCShSWF9MRURfVFNUIC0gUlhfTEVEX0lOSSkKKworLyogcGFyYW1ldGVyICdNb2RlJyB3aGVuIGNhbGxpbmcgU2tHZVhtaXRMRUQoKSAqLworI2RlZmluZSBTS19MRURfRElTCTAKKyNkZWZpbmUgU0tfTEVEX0VOQQkxCisjZGVmaW5lIFNLX0xFRF9UU1QJMgorCisvKiBDb3VudGVyIGFuZCBUaW1lciBjb25zdGFudHMsIGZvciBhIGhvc3QgY2xvY2sgb2YgNjIuNSBNSHogKi8KKyNkZWZpbmUgU0tfWE1JVF9EVVIJCTB4MDAyZmFmMDhVTAkvKiAgNTAgbXMgKi8KKyNkZWZpbmUgU0tfQkxLX0RVUgkJMHgwMWRjZDY1MFVMCS8qIDUwMCBtcyAqLworCisjZGVmaW5lIFNLX0RQT0xMX0RFRgkweDAwZWU2YjI4VUwJLyogMjUwIG1zIGF0IDYyLjUgTUh6ICovCisKKyNkZWZpbmUgU0tfRFBPTExfTUFYCTB4MDBmZmZmZmZVTAkvKiAyNjggbXMgYXQgNjIuNSBNSHogKi8KKwkJCQkJCQkJCQkvKiAyMTUgbXMgYXQgNzguMTIgTUh6ICovCisKKyNkZWZpbmUgU0tfRkFDVF82MgkJMTAwCQkJLyogaXMgZ2l2ZW4gaW4gcGVyY2VudCAqLworI2RlZmluZSBTS19GQUNUXzUzCQkgODUgICAgICAgICAvKiBvbiBHRU5FU0lTOgk1My4xMiBNSHogKi8KKyNkZWZpbmUgU0tfRkFDVF83OAkJMTI1CQkJLyogb24gWVVLT046CTc4LjEyIE1IeiAqLworCisvKiBUaW1lb3V0IHZhbHVlcyAqLworI2RlZmluZSBTS19NQUNfVE9fNTMJNzIJCQkvKiBNQUMgYXJiaXRlciB0aW1lb3V0ICovCisjZGVmaW5lIFNLX1BLVF9UT181MwkweDIwMDAJCS8qIFBhY2tldCBhcmJpdGVyIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0tfUEtUX1RPX01BWAkweGZmZmYJCS8qIE1heGltdW0gdmFsdWUgKi8KKyNkZWZpbmUgU0tfUklfVE9fNTMJCTM2CQkJLyogUkFNIGludGVyZmFjZSB0aW1lb3V0ICovCisKKyNkZWZpbmUgU0tfUEhZX0FDQ19UTwk2MDAwMDAJCS8qIFBIWSBhY2Nlc3MgdGltZW91dCAqLworCisvKiBSQU0gQnVmZmVyIEhpZ2ggUGF1c2UgVGhyZXNob2xkIHZhbHVlcyAqLworI2RlZmluZSBTS19SQl9VTFBQCQkoIDggKiAxMDI0KQkvKiBVcHBlciBMZXZlbCBpbiBrQi84ICovCisjZGVmaW5lIFNLX1JCX0xMUFBfUwkoMTAgKiAxMDI0KQkvKiBMb3dlciBMZXZlbCBmb3Igc21hbGwgUXVldWVzICovCisjZGVmaW5lIFNLX1JCX0xMUFBfQgkoMTYgKiAxMDI0KQkvKiBMb3dlciBMZXZlbCBmb3IgYmlnIFF1ZXVlcyAqLworCisjaWZuZGVmIFNLX0JNVV9SWF9XTQorI2RlZmluZSBTS19CTVVfUlhfV00JMHg2MDAJCS8qIEJNVSBSeCBXYXRlcm1hcmsgKi8KKyNlbmRpZgorI2lmbmRlZiBTS19CTVVfVFhfV00KKyNkZWZpbmUgU0tfQk1VX1RYX1dNCTB4NjAwCQkvKiBCTVUgVHggV2F0ZXJtYXJrICovCisjZW5kaWYKKworLyogWE1BQyBJSSBSeCBIaWdoIFdhdGVybWFyayAqLworI2RlZmluZSBTS19YTV9SWF9ISV9XTQkweDA1YWEJCS8qIDE0NTAgKi8KKworLyogWE1BQyBJSSBUeCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgU0tfWE1fVEhSX1JFREwJMHgwMWZiCQkvKiAuLiBmb3IgcmVkdW5kYW50IGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfWE1fVEhSX1NMCTB4MDFmYgkJLyogLi4gZm9yIHNpbmdsZSBsaW5rIGFkYXB0ZXJzICovCisjZGVmaW5lIFNLX1hNX1RIUl9NVUxMCTB4MDFmYgkJLyogLi4gZm9yIG11bHRpcGxlIGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfWE1fVEhSX0pVTUJPCTB4MDNmYwkJLyogLi4gZm9yIGp1bWJvIGZyYW1lIHVzYWdlICovCisKKy8qIHZhbHVlcyBmb3IgR0lQb3J0VXNhZ2UgKi8KKyNkZWZpbmUgU0tfUkVEX0xJTksJCTEJCS8qIHJlZHVuZGFudCBsaW5rIHVzYWdlICovCisjZGVmaW5lIFNLX01VTF9MSU5LCQkyCQkvKiBtdWx0aXBsZSBsaW5rIHVzYWdlICovCisjZGVmaW5lIFNLX0pVTUJPX0xJTksJMwkJLyogZHJpdmVyIHVzZXMganVtYm8gZnJhbWVzICovCisKKy8qIE1pbmltdW0gUkFNIEJ1ZmZlciBSeCBRdWV1ZSBTaXplICovCisjZGVmaW5lIFNLX01JTl9SWFFfU0laRQkxNgkJLyogMTYga0IgKi8KKworLyogTWluaW11bSBSQU0gQnVmZmVyIFR4IFF1ZXVlIFNpemUgKi8KKyNkZWZpbmUgU0tfTUlOX1RYUV9TSVpFCTE2CQkvKiAxNiBrQiAqLworCisvKiBRdWV1ZSBTaXplIHVuaXRzICovCisjZGVmaW5lIFFaX1VOSVRTCQkweDcKKyNkZWZpbmUgUVpfU1RFUAkJCTgKKworLyogUGVyY2VudGFnZSBvZiBxdWV1ZSBzaXplIGZyb20gd2hvbGUgbWVtb3J5ICovCisvKiA4MCAlIGZvciByZWNlaXZlICovCisjZGVmaW5lIFJBTV9RVU9UQV9SWAk4MEwKKy8qIDAlIGZvciBzeW5jIHRyYW5zZmVyICovCisjZGVmaW5lCVJBTV9RVU9UQV9TWU5DCTBMCisvKiB0aGUgcmVzdCAoMjAlKSBpcyB0YWtlbiBmb3IgYXN5bmMgdHJhbnNmZXIgKi8KKworLyogR2V0IHRoZSByb3VuZGVkIHF1ZXVlIHNpemUgaW4gQnl0ZXMgaW4gOGsgc3RlcHMgKi8KKyNkZWZpbmUgUk9VTkRfUVVFVUVfU0laRShTaXplSW5CeXRlcykJCQkJCVwKKwkoKCgodW5zaWduZWQgbG9uZykgKFNpemVJbkJ5dGVzKSArIChRWl9TVEVQKjEwMjRMKS0xKSAvIDEwMjQpICYJXAorCX4oUVpfU1RFUC0xKSkKKworLyogR2V0IHRoZSByb3VuZGVkIHF1ZXVlIHNpemUgaW4gS0J5dGVzIGluIDhrIHN0ZXBzICovCisjZGVmaW5lIFJPVU5EX1FVRVVFX1NJWkVfS0IoS2lsb2J5dGVzKSBcCisJUk9VTkRfUVVFVUVfU0laRSgoS2lsb2J5dGVzKSAqIDEwMjRMKQorCisvKiBUeXBlcyBvZiBSQU0gQnVmZmVyIFF1ZXVlcyAqLworI2RlZmluZSBTS19SWF9TUkFNX1EJMQkvKiBzbWFsbCByZWNlaXZlIHF1ZXVlICovCisjZGVmaW5lIFNLX1JYX0JSQU1fUQkyCS8qIGJpZyByZWNlaXZlIHF1ZXVlICovCisjZGVmaW5lIFNLX1RYX1JBTV9RCQkzCS8qIHNtYWxsIG9yIGJpZyB0cmFuc21pdCBxdWV1ZSAqLworCisvKiBwYXJhbWV0ZXIgJ0Rpcicgd2hlbiBjYWxsaW5nIFNrR2VTdG9wUG9ydCgpICovCisjZGVmaW5lIFNLX1NUT1BfVFgJMQkvKiBTdG9wcyB0aGUgdHJhbnNtaXQgcGF0aCwgcmVzZXRzIHRoZSBYTUFDICovCisjZGVmaW5lIFNLX1NUT1BfUlgJMgkvKiBTdG9wcyB0aGUgcmVjZWl2ZSBwYXRoICovCisjZGVmaW5lIFNLX1NUT1BfQUxMCTMJLyogU3RvcHMgUnggYW5kIFR4IHBhdGgsIHJlc2V0cyB0aGUgWE1BQyAqLworCisvKiBwYXJhbWV0ZXIgJ1JzdE1vZGUnIHdoZW4gY2FsbGluZyBTa0dlU3RvcFBvcnQoKSAqLworI2RlZmluZSBTS19TT0ZUX1JTVAkxCS8qIHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBTS19IQVJEX1JTVAkyCS8qIHBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCAqLworCisvKiBJbml0IExldmVscyAqLworI2RlZmluZSBTS19JTklUX0RBVEEJMAkvKiBJbml0IGxldmVsIDA6IGluaXQgZGF0YSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIFNLX0lOSVRfSU8JCTEJLyogSW5pdCBsZXZlbCAxOiBpbml0IHdpdGggSU9zICovCisjZGVmaW5lIFNLX0lOSVRfUlVOCQkyCS8qIEluaXQgbGV2ZWwgMjogaW5pdCBmb3IgcnVuIHRpbWUgKi8KKworLyogTGluayBNb2RlIFBhcmFtZXRlciAqLworI2RlZmluZSBTS19MTU9ERV9IQUxGCQkxCS8qIEhhbGYgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfRlVMTAkJMgkvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0FVVE9IQUxGCTMJLyogQXV0b0hhbGYgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQVVUT0ZVTEwJNAkvKiBBdXRvRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9BVVRPQk9USAk1CS8qIEF1dG9Cb3RoIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0FVVE9TRU5TRQk2CS8qIGNvbmZpZ3VyZWQgbW9kZSBhdXRvIHNlbnNpbmcgKi8KKyNkZWZpbmUgU0tfTE1PREVfSU5ERVRFUk1JTkFURUQJNwkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBBdXRvLW5lZ290aWF0aW9uIHRpbWVvdXQgaW4gMTAwbXMgZ3JhbnVsYXJpdHkgKi8KKyNkZWZpbmUgU0tfQU5EX01BWF9UTwkJNgkvKiBXYWl0IDYwMCBtc2VjIGJlZm9yZSBsaW5rIGNvbWVzIHVwICovCisKKy8qIEF1dG8tbmVnb3RpYXRpb24gZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUgU0tfQU5EX09LCQkJMAkvKiBubyBlcnJvciAqLworI2RlZmluZSBTS19BTkRfT1RIRVIJCTEJLyogb3RoZXIgZXJyb3IgdGhhbiBiZWxvdyAqLworI2RlZmluZSBTS19BTkRfRFVQX0NBUAkJMgkvKiBEdXBsZXggY2FwYWJpbGl0aWVzIGVycm9yICovCisKKworLyogTGluayBTcGVlZCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0NBUF9BVVRPCQkJKDE8PDApCS8qIEF1dG9tYXRpYyByZXNvbHV0aW9uICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfMTBNQlBTCQkoMTw8MSkJLyogMTAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfQ0FQXzEwME1CUFMJCSgxPDwyKQkvKiAxMDAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfQ0FQXzEwMDBNQlBTCQkoMTw8MykJLyogMTAwMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfSU5ERVRFUk1JTkFURUQgKDE8PDQpIC8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIExpbmsgU3BlZWQgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX0xTUEVFRF9BVVRPCQkJCTEJLyogQXV0b21hdGljIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgU0tfTFNQRUVEXzEwTUJQUwkJCTIJLyogMTAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfMTAwTUJQUwkJCTMJLyogMTAwIE1icHMgKi8KKyNkZWZpbmUgU0tfTFNQRUVEXzEwMDBNQlBTCQkJNAkvKiAxMDAwIE1icHMgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0lOREVURVJNSU5BVEVECTUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTGluayBTcGVlZCBDdXJyZW50IFN0YXRlICovCisjZGVmaW5lIFNLX0xTUEVFRF9TVEFUX1VOS05PV04JCTEKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfMTBNQlBTCQkyCisjZGVmaW5lIFNLX0xTUEVFRF9TVEFUXzEwME1CUFMgCQkzCisjZGVmaW5lIFNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTCQk0CisjZGVmaW5lIFNLX0xTUEVFRF9TVEFUX0lOREVURVJNSU5BVEVEIDUKKworCisvKiBMaW5rIENhcGFiaWxpdHkgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9IQUxGCQkoMTw8MCkJLyogSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9DQVBfRlVMTAkJKDE8PDEpCS8qIEZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQ0FQX0FVVE9IQUxGCSgxPDwyKQkvKiBBdXRvSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9DQVBfQVVUT0ZVTEwJKDE8PDMpCS8qIEF1dG9GdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9JTkRFVEVSTUlOQVRFRCAoMTw8NCkgLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTGluayBNb2RlIEN1cnJlbnQgU3RhdGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfU1RBVF9VTktOT1dOCTEJLyogVW5rbm93biBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX0hBTEYJCTIJLyogSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX0ZVTEwJCTMJLyogRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGCTQJLyogSGFsZiBEdXBsZXggTW9kZSBvYnRhaW5lZCBieSBBdXRvLU5lZyAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMCTUJLyogRnVsbCBEdXBsZXggTW9kZSBvYnRhaW5lZCBieSBBdXRvLU5lZyAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX0lOREVURVJNSU5BVEVEIDYJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogRmxvdyBDb250cm9sIE1vZGUgUGFyYW1ldGVyIChhbmQgY2FwYWJpbGl0aWVzKSAqLworI2RlZmluZSBTS19GTE9XX01PREVfTk9ORQkJMQkvKiBObyBGbG93LUNvbnRyb2wgKi8KKyNkZWZpbmUgU0tfRkxPV19NT0RFX0xPQ19TRU5ECTIJLyogTG9jYWwgc3RhdGlvbiBzZW5kcyBQQVVTRSAqLworI2RlZmluZSBTS19GTE9XX01PREVfU1lNTUVUUklDCTMJLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSAqLworI2RlZmluZSBTS19GTE9XX01PREVfU1lNX09SX1JFTQk0CS8qIEJvdGggc3RhdGlvbnMgbWF5IHNlbmQgUEFVU0Ugb3IKKwkJCQkJICoganVzdCB0aGUgcmVtb3RlIHN0YXRpb24gbWF5IHNlbmQgUEFVU0UKKwkJCQkJICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9JTkRFVEVSTUlOQVRFRCA1CS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIEZsb3cgQ29udHJvbCBTdGF0dXMgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9OT05FCQkxCS8qIE5vIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBTS19GTE9XX1NUQVRfUkVNX1NFTkQJMgkvKiBSZW1vdGUgU3RhdGlvbiBzZW5kcyBQQVVTRSAqLworI2RlZmluZSBTS19GTE9XX1NUQVRfTE9DX1NFTkQJMwkvKiBMb2NhbCBzdGF0aW9uIHNlbmRzIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9TWU1NRVRSSUMJNAkvKiBCb3RoIHN0YXRpb24gbWF5IHNlbmQgUEFVU0UgKi8KKyNkZWZpbmUgU0tfRkxPV19TVEFUX0lOREVURVJNSU5BVEVEIDUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTWFzdGVyL1NsYXZlIE1vZGUgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFNLX01TX0NBUF9BVVRPCQkoMTw8MCkJLyogQXV0b21hdGljIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgU0tfTVNfQ0FQX01BU1RFUgkoMTw8MSkJLyogVGhpcyBzdGF0aW9uIGlzIG1hc3RlciAqLworI2RlZmluZSBTS19NU19DQVBfU0xBVkUJCSgxPDwyKQkvKiBUaGlzIHN0YXRpb24gaXMgc2xhdmUgKi8KKyNkZWZpbmUgU0tfTVNfQ0FQX0lOREVURVJNSU5BVEVEICgxPDwzKQkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBTZXQgTWFzdGVyL1NsYXZlIE1vZGUgUGFyYW1ldGVyIChhbmQgY2FwYWJpbGl0aWVzKSAqLworI2RlZmluZSBTS19NU19NT0RFX0FVVE8JCTEJLyogQXV0b21hdGljIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgU0tfTVNfTU9ERV9NQVNURVIJMgkvKiBUaGlzIHN0YXRpb24gaXMgbWFzdGVyICovCisjZGVmaW5lIFNLX01TX01PREVfU0xBVkUJMwkvKiBUaGlzIHN0YXRpb24gaXMgc2xhdmUgKi8KKyNkZWZpbmUgU0tfTVNfTU9ERV9JTkRFVEVSTUlOQVRFRCA0CS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIE1hc3Rlci9TbGF2ZSBTdGF0dXMgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX01TX1NUQVRfVU5TRVQJMQkvKiBUaGUgTS9TIHN0YXR1cyBpcyBub3Qgc2V0ICovCisjZGVmaW5lIFNLX01TX1NUQVRfTUFTVEVSCTIJLyogVGhpcyBzdGF0aW9uIGlzIG1hc3RlciAqLworI2RlZmluZSBTS19NU19TVEFUX1NMQVZFCTMJLyogVGhpcyBzdGF0aW9uIGlzIHNsYXZlICovCisjZGVmaW5lIFNLX01TX1NUQVRfRkFVTFQJNAkvKiBNL1MgcmVzb2x1dGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9JTkRFVEVSTUlOQVRFRCA1CS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIHBhcmFtZXRlciAnTW9kZScgd2hlbiBjYWxsaW5nIFNrWG1TZXRSeENtZCgpICovCisjZGVmaW5lIFNLX1NUUklQX0ZDU19PTgkJKDE8PDApCS8qIEVuYWJsZSAgRkNTIHN0cmlwcGluZyBvZiBSeCBmcmFtZXMgKi8KKyNkZWZpbmUgU0tfU1RSSVBfRkNTX09GRgkoMTw8MSkJLyogRGlzYWJsZSBGQ1Mgc3RyaXBwaW5nIG9mIFJ4IGZyYW1lcyAqLworI2RlZmluZSBTS19TVFJJUF9QQURfT04JCSgxPDwyKQkvKiBFbmFibGUgIHBhZCBieXRlIHN0cmlwcGluZyBvZiBSeCBmciAqLworI2RlZmluZSBTS19TVFJJUF9QQURfT0ZGCSgxPDwzKQkvKiBEaXNhYmxlIHBhZCBieXRlIHN0cmlwcGluZyBvZiBSeCBmciAqLworI2RlZmluZSBTS19MRU5FUlJfT0tfT04JCSgxPDw0KQkvKiBEb24ndCBjaGsgZnIgZm9yIGluIHJhbmdlIGxlbiBlcnJvciAqLworI2RlZmluZSBTS19MRU5FUlJfT0tfT0ZGCSgxPDw1KQkvKiBDaGVjayBmcmFtZXMgZm9yIGluIHJhbmdlIGxlbiBlcnJvciAqLworI2RlZmluZSBTS19CSUdfUEtfT0tfT04JCSgxPDw2KQkvKiBEb24ndCBzZXQgUnggRXJyb3IgYml0IGZvciBiaWcgZnJhbWVzICovCisjZGVmaW5lIFNLX0JJR19QS19PS19PRkYJKDE8PDcpCS8qIFNldCBSeCBFcnJvciBiaXQgZm9yIGJpZyBmcmFtZXMgKi8KKyNkZWZpbmUgU0tfU0VMRl9SWF9PTgkJKDE8PDgpCS8qIEVuYWJsZSAgUnggb2Ygb3duIHBhY2tldHMgKi8KKyNkZWZpbmUgU0tfU0VMRl9SWF9PRkYJCSgxPDw5KQkvKiBEaXNhYmxlIFJ4IG9mIG93biBwYWNrZXRzICovCisKKy8qIHBhcmFtZXRlciAnUGFyYScgd2hlbiBjYWxsaW5nIFNrTWFjU2V0UnhUeEVuKCkgKi8KKyNkZWZpbmUgU0tfTUFDX0xPT1BCX09OCQkoMTw8MCkJLyogRW5hYmxlICBNQUMgTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBTS19NQUNfTE9PUEJfT0ZGCSgxPDwxKQkvKiBEaXNhYmxlIE1BQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIFNLX1BIWV9MT09QQl9PTgkJKDE8PDIpCS8qIEVuYWJsZSAgUEhZIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgU0tfUEhZX0xPT1BCX09GRgkoMTw8MykJLyogRGlzYWJsZSBQSFkgTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBTS19QSFlfRlVMTERfT04JCSgxPDw0KQkvKiBFbmFibGUgIEdNSUkgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgU0tfUEhZX0ZVTExEX09GRgkoMTw8NSkJLyogRGlzYWJsZSBHTUlJIEZ1bGwgRHVwbGV4ICovCisKKy8qIFN0YXRlcyBvZiBQU3RhdGUgKi8KKyNkZWZpbmUgU0tfUFJUX1JFU0VUCTAJLyogdGhlIHBvcnQgaXMgcmVzZXQgKi8KKyNkZWZpbmUgU0tfUFJUX1NUT1AJCTEJLyogdGhlIHBvcnQgaXMgc3RvcHBlZCAoc2ltaWxhciB0byBTVyByZXNldCkgKi8KKyNkZWZpbmUgU0tfUFJUX0lOSVQJCTIJLyogdGhlIHBvcnQgaXMgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgU0tfUFJUX1JVTgkJMwkvKiB0aGUgcG9ydCBoYXMgYW4gYWN0aXZlIGxpbmsgKi8KKworLyogUEhZIHBvd2VyIGRvd24gbW9kZXMgKi8KKyNkZWZpbmUgUEhZX1BNX09QRVJBVElPTkFMX01PREUJCTAJLyogUEhZIG9wZXJhdGlvbmFsIG1vZGUgKi8KKyNkZWZpbmUgUEhZX1BNX0RFRVBfU0xFRVAJCQkxCS8qIGNvbWEgbW9kZSAtLT4gbWluaW1hbCBwb3dlciAqLworI2RlZmluZSBQSFlfUE1fSUVFRV9QT1dFUl9ET1dOCQkyCS8qIElFRUUgMjIuMi40LjEuNSBjb21wbC4gcG93ZXIgZG93biAqLworI2RlZmluZSBQSFlfUE1fRU5FUkdZX0RFVEVDVAkJMwkvKiBlbmVyZ3kgZGV0ZWN0ICovCisjZGVmaW5lIFBIWV9QTV9FTkVSR1lfREVURUNUX1BMVVMJNAkvKiBlbmVyZ3kgZGV0ZWN0IHBsdXMgKi8KKworLyogRGVmYXVsdCByZWNlaXZlIGZyYW1lIGxpbWl0IGZvciBXb3JrYXJvdW5kIG9mIFhNQUMgRXJyYXRhICovCisjZGVmaW5lIFNLX0RFRl9SWF9XQV9MSU0JU0tfQ09OU1RVNjQoMTAwKQorCisvKiB2YWx1ZXMgZm9yIEdJTGVkQmxpbmtDdHJsIChMRUQgQmxpbmsgQ29udHJvbCkgKi8KKyNkZWZpbmUgU0tfQUNUX0xFRF9CTElOSwkoMTw8MCkJLyogQWN0aXZlIExFRCBibGlua2luZyAqLworI2RlZmluZSBTS19EVVBfTEVEX05PUk1BTAkoMTw8MSkJLyogRHVwbGV4IExFRCBub3JtYWwgKi8KKyNkZWZpbmUgU0tfTEVEX0xJTksxMDBfT04JKDE8PDIpCS8qIExpbmsgMTAwTSBMRUQgb24gKi8KKworLyogTGluayBQYXJ0bmVyIFN0YXR1cyAqLworI2RlZmluZSBTS19MSVBBX1VOS05PV04JMAkvKiBMaW5rIHBhcnRuZXIgaXMgaW4gdW5rbm93biBzdGF0ZSAqLworI2RlZmluZSBTS19MSVBBX01BTlVBTAkxCS8qIExpbmsgcGFydG5lciBpcyBpbiBkZXRlY3RlZCBtYW51YWwgc3RhdGUgKi8KKyNkZWZpbmUgU0tfTElQQV9BVVRPCTIJLyogTGluayBwYXJ0bmVyIGlzIGluIGF1dG8tbmVnb3RpYXRpb24gc3RhdGUgKi8KKworLyogTWF4aW11bSBSZXN0YXJ0cyBiZWZvcmUgcmVzdGFydCBpcyBpZ25vcmVkICgzQ29tIFdBKSAqLworI2RlZmluZSBTS19NQVhfTFJFU1RBUlQJMwkvKiBNYXguIDMgdGltZXMgdGhlIGxpbmsgaXMgcmVzdGFydGVkICovCisKKy8qIE1heC4gQXV0by1uZWcuIHRpbWVvdXRzIGJlZm9yZSBsaW5rIGRldGVjdGlvbiBpbiBzZW5zZSBtb2RlIGlzIHJlc2V0ICovCisjZGVmaW5lIFNLX01BWF9BTkVHX1RPCTEwCS8qIE1heC4gMTAgdGltZXMgdGhlIHNlbnNlIG1vZGUgaXMgcmVzZXQgKi8KKworLyogc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1BQyBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19HZU1hY0Z1bmMgeworCWludCAgKCpwRm5NYWNVcGRhdGVTdGF0cykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IFBvcnQpOworCWludCAgKCpwRm5NYWNTdGF0aXN0aWMpKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHVuc2lnbmVkIGludCBQb3J0LAorCQkJCQkJCVNLX1UxNiBTdGF0QWRkciwgU0tfVTMyIFNLX0ZBUiAqcFZhbCk7CisJaW50ICAoKnBGbk1hY1Jlc2V0Q291bnRlcikoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IFBvcnQpOworCWludCAgKCpwRm5NYWNPdmVyZmxvdykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IFBvcnQsCisJCQkJCQkgICBTS19VMTYgSVN0YXR1cywgU0tfVTY0IFNLX0ZBUiAqcFZhbCk7Cit9IFNLX0dFTUFDRlVOQzsKKworLyoKKyAqIFBvcnQgU3RydWN0dXJlCisgKi8KK3R5cGVkZWYJc3RydWN0IHNfR2VQb3J0IHsKKyNpZm5kZWYgU0tfRElBRworCVNLX1RJTUVSCVBXYVRpbWVyOwkvKiBXb3JrYXJvdW5kIFRpbWVyICovCisJU0tfVElNRVIJSGFsZkR1cENoa1RpbWVyOworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKwlTS19VMzIJUFByZXZTaG9ydHM7CS8qIFByZXZpb3VzIFNob3J0IENvdW50ZXIgY2hlY2tpbmcgKi8KKwlTS19VMzIJUFByZXZGY3M7CQkvKiBQcmV2aW91cyBGQ1MgRXJyb3IgQ291bnRlciBjaGVja2luZyAqLworCVNLX1U2NAlQUHJldlJ4OwkJLyogUHJldmlvdXMgUnhPayBDb3VudGVyIGNoZWNraW5nICovCisJU0tfVTY0CVBSeExpbTsJCQkvKiBQcmV2aW91cyBSeE9rIENvdW50ZXIgY2hlY2tpbmcgKi8KKwlTS19VNjQJTGFzdE9jdGV0czsJCS8qIEZvciBoYWxmIGR1cGxleCBoYW5nIGNoZWNrICovCisJaW50CQlQTGlua1Jlc0N0OwkJLyogTGluayBSZXN0YXJ0IENvdW50ZXIgKi8KKwlpbnQJCVBBdXRvTmVnVGltZU91dDsvKiBBdXRvLW5lZ290aWF0aW9uIHRpbWVvdXQgY3VycmVudCB2YWx1ZSAqLworCWludAkJUEF1dG9OZWdUT0N0OwkvKiBBdXRvLW5lZ290aWF0aW9uIFRpbWVvdXQgQ291bnRlciAqLworCWludAkJUFJ4UVNpemU7CQkvKiBQb3J0IFJ4IFF1ZXVlIFNpemUgaW4ga0IgKi8KKwlpbnQJCVBYU1FTaXplOwkJLyogUG9ydCBTeW5jaHJvbm91cyAgVHJhbnNtaXQgUXVldWUgU2l6ZSBpbiBrQiAqLworCWludAkJUFhBUVNpemU7CQkvKiBQb3J0IEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSBTaXplIGluIGtCICovCisJU0tfVTMyCVBSeFFSYW1TdGFydDsJLyogUmVjZWl2ZSBRdWV1ZSBSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKwlTS19VMzIJUFJ4UVJhbUVuZDsJCS8qIFJlY2VpdmUgUXVldWUgUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworCVNLX1UzMglQWHNRUmFtU3RhcnQ7CS8qIFN5bmMgVHggUXVldWUgUkFNIEJ1ZmZlciBTdGFydCBBZGRyZXNzICovCisJU0tfVTMyCVBYc1FSYW1FbmQ7CQkvKiBTeW5jIFR4IFF1ZXVlIFJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKwlTS19VMzIJUFhhUVJhbVN0YXJ0OwkvKiBBc3luYyBUeCBRdWV1ZSBSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKwlTS19VMzIJUFhhUVJhbUVuZDsJCS8qIEFzeW5jIFR4IFF1ZXVlIFJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKwlTS19VMzIJUFJ4T3ZlckNudDsJCS8qIFJlY2VpdmUgT3ZlcmZsb3cgQ291bnRlciAqLworCWludAkJUFJ4UU9mZjsJCS8qIFJ4IFF1ZXVlIEFkZHJlc3MgT2Zmc2V0ICovCisJaW50CQlQWHNRT2ZmOwkJLyogU3luY2hyb25vdXMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJCVBYYVFPZmY7CQkvKiBBc3luY2hyb25vdXMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJCVBoeVR5cGU7CQkvKiBQSFkgdXNlZCBvbiB0aGlzIHBvcnQgKi8KKwlpbnQJCVBTdGF0ZTsJCQkvKiBQb3J0IHN0YXR1cyAocmVzZXQsIHN0b3AsIGluaXQsIHJ1bikgKi8KKwlTS19VMTYJUGh5SWQxOwkJCS8qIFBIWSBJZDEgb24gdGhpcyBwb3J0ICovCisJU0tfVTE2CVBoeUFkZHI7CQkvKiBNRElPL01EQyBQSFkgYWRkcmVzcyAqLworCVNLX1UxNglQSXNhdmU7CQkJLyogU2F2ZWQgSW50ZXJydXB0IHN0YXR1cyB3b3JkICovCisJU0tfVTE2CVBTc2F2ZTsJCQkvKiBTYXZlZCBQSFkgc3RhdHVzIHdvcmQgKi8KKwlTS19VMTYJUEdtQU5lZ0FkdjsJCS8qIFNhdmVkIEdQaHkgQXV0b05lZ0FkdmVydGlzbWVudCByZWdpc3RlciAqLworCVNLX0JPT0wJUEhXTGlua1VwOwkJLyogVGhlIGhhcmR3YXJlIExpbmsgaXMgdXAgKHdpcmluZykgKi8KKwlTS19CT09MCVBMaW5rQnJva2VuOwkvKiBJcyBMaW5rIGJyb2tlbiA/ICovCisJU0tfQk9PTAlQQ2hlY2tQYXI7CQkvKiBEbyB3ZSBjaGVjayBmb3IgcGFyaXR5IGVycm9ycyA/ICovCisJU0tfQk9PTAlIYWxmRHVwVGltZXJBY3RpdmU7CisJU0tfVTgJUExpbmtDYXA7CQkvKiBMaW5rIENhcGFiaWxpdGllcyAqLworCVNLX1U4CVBMaW5rTW9kZUNvbmY7CS8qIExpbmsgTW9kZSBjb25maWd1cmVkICovCisJU0tfVTgJUExpbmtNb2RlOwkJLyogTGluayBNb2RlIGN1cnJlbnRseSB1c2VkICovCisJU0tfVTgJUExpbmtNb2RlU3RhdHVzOy8qIExpbmsgTW9kZSBTdGF0dXMgKi8KKwlTS19VOAlQTGlua1NwZWVkQ2FwOwkvKiBMaW5rIFNwZWVkIENhcGFiaWxpdGllcygxMC8xMDAvMTAwMCBNYnBzKSAqLworCVNLX1U4CVBMaW5rU3BlZWQ7CQkvKiBjb25maWd1cmVkIExpbmsgU3BlZWQgKDEwLzEwMC8xMDAwIE1icHMpICovCisJU0tfVTgJUExpbmtTcGVlZFVzZWQ7CS8qIGN1cnJlbnQgTGluayBTcGVlZCAoMTAvMTAwLzEwMDAgTWJwcykgKi8KKwlTS19VOAlQRmxvd0N0cmxDYXA7CS8qIEZsb3cgQ29udHJvbCBDYXBhYmlsaXRpZXMgKi8KKwlTS19VOAlQRmxvd0N0cmxNb2RlOwkvKiBGbG93IENvbnRyb2wgTW9kZSAqLworCVNLX1U4CVBGbG93Q3RybFN0YXR1czsvKiBGbG93IENvbnRyb2wgU3RhdHVzICovCisJU0tfVTgJUE1TQ2FwOwkJCS8qIE1hc3Rlci9TbGF2ZSBDYXBhYmlsaXRpZXMgKi8KKwlTS19VOAlQTVNNb2RlOwkJLyogTWFzdGVyL1NsYXZlIE1vZGUgKi8KKwlTS19VOAlQTVNTdGF0dXM7CQkvKiBNYXN0ZXIvU2xhdmUgU3RhdHVzICovCisJU0tfQk9PTAlQQXV0b05lZ0ZhaWw7CS8qIEF1dG8tbmVnb3RpYXRpb24gZmFpbCBmbGFnICovCisJU0tfVTgJUExpcGFBdXRvTmVnOwkvKiBBdXRvLW5lZ290aWF0aW9uIHBvc3NpYmxlIHdpdGggTGluayBQYXJ0bmVyICovCisJU0tfVTgJUENhYmxlTGVuOwkJLyogQ2FibGUgTGVuZ3RoICovCisJU0tfVTgJUE1kaVBhaXJMZW5bNF07CS8qIE1ESVswLi4zXSBQYWlyIExlbmd0aCAqLworCVNLX1U4CVBNZGlQYWlyU3RzWzRdOwkvKiBNRElbMC4uM10gUGFpciBEaWFnbm9zdGljIFN0YXR1cyAqLworCVNLX1U4CVBQaHlQb3dlclN0YXRlOwkvKiBQSFkgY3VycmVudCBwb3dlciBzdGF0ZSAqLworCWludAkJUE1hY0NvbFRocmVzOwkvKiBNQUMgQ29sbGlzaW9uIFRocmVzaG9sZCAqLworCWludAkJUE1hY0phbUxlbjsJCS8qIE1BQyBKYW0gbGVuZ3RoICovCisJaW50CQlQTWFjSmFtSXBnVmFsOwkvKiBNQUMgSmFtIElQRyAqLworCWludAkJUE1hY0phbUlwZ0RhdGE7CS8qIE1BQyBJUEcgSmFtIHRvIERhdGEgKi8KKwlpbnQJCVBNYWNJcGdEYXRhOwkvKiBNQUMgRGF0YSBJUEcgKi8KKwlTS19CT09MIFBNYWNMaW1pdDQ7CQkvKiByZXNldCBjb2xsaXNpb24gY291bnRlciBhbmQgYmFja29mZiBhbGdvcml0aG0gKi8KK30gU0tfR0VQT1JUOworCisvKgorICogR2lnYWJpdCBFdGhlcm5ldCBJbml0aWFsaXphdGlvbiBTdHJ1Y3QKKyAqIChoYXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFkYXB0ZXIgY29udGV4dCkKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19HZUluaXQgeworCWludAkJCUdJQ2hpcElkOwkJLyogQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KKwlpbnQJCQlHSUNoaXBSZXY7CQkvKiBDaGlwIFJldmlzaW9uIE51bWJlciAqLworCVNLX1U4CQlHSVBjaUh3UmV2OwkJLyogUENJIEhXIFJldmlzaW9uIE51bWJlciAqLworCVNLX0JPT0wJCUdJR2VuZXNpczsJCS8qIEdlbmVzaXMgYWRhcHRlciA/ICovCisJU0tfQk9PTAkJR0lZdWtvbjsJCS8qIFlVS09OLUExL0J4IGNoaXAgKi8KKwlTS19CT09MCQlHSVl1a29uTGl0ZTsJLyogWVVLT04tTGl0ZSBjaGlwICovCisJU0tfQk9PTAkJR0lDb3BwZXJUeXBlOwkvKiBDb3BwZXIgVHlwZSBhZGFwdGVyID8gKi8KKwlTS19CT09MCQlHSVBjaVNsb3Q2NDsJLyogNjQtYml0IFBDSSBTbG90ICovCisJU0tfQk9PTAkJR0lQY2lDbG9jazY2OwkvKiA2NiBNSHogUENJIENsb2NrICovCisJU0tfQk9PTAkJR0lWYXV4QXZhaWw7CS8qIFZBVVggYXZhaWxhYmxlIChZVUtPTikgKi8KKwlTS19CT09MCQlHSVl1a29uMzJCaXQ7CS8qIDMyLUJpdCBZVUtPTiBhZGFwdGVyICovCisJU0tfVTE2CQlHSUxlZEJsaW5rQ3RybDsJLyogTEVEIEJsaW5rIENvbnRyb2wgKi8KKwlpbnQJCQlHSU1hY3NGb3VuZDsJLyogTnVtYmVyIG9mIE1BQ3MgZm91bmQgb24gdGhpcyBhZGFwdGVyICovCisJaW50CQkJR0lNYWNUeXBlOwkJLyogTUFDIFR5cGUgdXNlZCBvbiB0aGlzIGFkYXB0ZXIgKi8KKwlpbnQJCQlHSUhzdENsa0ZhY3Q7CS8qIEhvc3QgQ2xvY2sgRmFjdG9yICg2Mi41IC8gSHN0Q2xrICogMTAwKSAqLworCWludAkJCUdJUG9ydFVzYWdlOwkvKiBEcml2ZXIgUG9ydCBVc2FnZSAqLworCWludAkJCUdJTGV2ZWw7CQkvKiBJbml0aWFsaXphdGlvbiBMZXZlbCBjb21wbGV0ZWQgKi8KKwlpbnQJCQlHSVJhbVNpemU7CQkvKiBUaGUgUkFNIHNpemUgb2YgdGhlIGFkYXB0ZXIgaW4ga0IgKi8KKwlpbnQJCQlHSVdvbE9mZnM7CQkvKiBXT0wgUmVnaXN0ZXIgT2Zmc2V0IChIVy1CdWcgaW4gUmV2LiBBKSAqLworCVNLX1UzMgkJR0lSYW1PZmZzOwkJLyogUkFNIEFkZHJlc3MgT2Zmc2V0IGZvciBhZGRyIGNhbGN1bGF0aW9uICovCisJU0tfVTMyCQlHSVBvbGxUaW1lclZhbDsJLyogRGVzY3IuIFBvbGwgVGltZXIgSW5pdCBWYWwgKEhzdENsayB0aWNrcykgKi8KKwlTS19VMzIJCUdJVmFsSXJxTWFzazsJLyogVmFsdWUgZm9yIEludGVycnVwdCBNYXNrICovCisJU0tfVTMyCQlHSVRpbWVTdGFtcENudDsJLyogVGltZSBTdGFtcCBIaWdoIENvdW50ZXIgKFlVS09OIG9ubHkpICovCisJU0tfR0VQT1JUCUdQW1NLX01BWF9NQUNTXTsvKiBQb3J0IERlcGVuZGVudCBJbmZvcm1hdGlvbiAqLworCVNLX0dFTUFDRlVOQyBHSUZ1bmM7CQkvKiBNQUMgZGVwZWRlbnQgZnVuY3Rpb25zICovCit9IFNLX0dFSU5JVDsKKworLyoKKyAqIEVycm9yIG51bWJlcnMgYW5kIG1lc3NhZ2VzIGZvciBza3htYWMyLmMgYW5kIHNrZ2Vpbml0LmMKKyAqLworI2RlZmluZSBTS0VSUl9IV0lfRTAwMQkJKFNLX0VSUkJBU0VfSFdJTklUKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwMU1TRwkiU2tYbUNsckV4YWN0QWRkcigpIGhhcyBnb3QgaWxsZWdhbCBwYXJhbWV0ZXJzIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwMgkJKFNLRVJSX0hXSV9FMDAxKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAyTVNHCSJTa0dlSW5pdCgpOiBMZXZlbCAxIGNhbGwgbWlzc2luZyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDMJCShTS0VSUl9IV0lfRTAwMisxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwM01TRwkiU2tHZUluaXQoKSBjYWxsZWQgd2l0aCBpbGxlZ2FsIGluaXQgTGV2ZWwiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA0CQkoU0tFUlJfSFdJX0UwMDMrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDRNU0cJIlNrR2VJbml0UG9ydCgpOiBRdWV1ZSBTaXplIGlsbGVnYWwgY29uZmlndXJlZCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDUJCShTS0VSUl9IV0lfRTAwNCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwNU1TRwkiU2tHZUluaXRQb3J0KCk6IGNhbm5vdCBpbml0IHJ1bm5pbmcgcG9ydHMiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA2CQkoU0tFUlJfSFdJX0UwMDUrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDZNU0cJIlNrR2VNYWNJbml0KCk6IFBTdGF0ZSBkb2VzIG5vdCBtYXRjaCBIVyBzdGF0ZSIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDcJCShTS0VSUl9IV0lfRTAwNisxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwN01TRwkiU2tYbUluaXREdXBNZCgpIGNhbGxlZCB3aXRoIGludmFsaWQgRHVwIE1vZGUiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA4CQkoU0tFUlJfSFdJX0UwMDcrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDhNU0cJIlNrWG1TZXRSeENtZCgpIGNhbGxlZCB3aXRoIGludmFsaWQgTW9kZSIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDkJCShTS0VSUl9IV0lfRTAwOCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwOU1TRwkiU2tHZUNmZ1N5bmMoKSBjYWxsZWQgYWx0aG91Z2ggUFhTUVNpemUgemVybyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTAJCShTS0VSUl9IV0lfRTAwOSsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxME1TRwkiU2tHZUNmZ1N5bmMoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDExCQkoU0tFUlJfSFdJX0UwMTArMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTFNU0cJIlNrR2VJbml0UG9ydCgpOiBSZWNlaXZlIFF1ZXVlIFNpemUgdG9vIHNtYWxsIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxMgkJKFNLRVJSX0hXSV9FMDExKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEyTVNHCSJTa0dlSW5pdFBvcnQoKTogaW52YWxpZCBRdWV1ZSBTaXplIHNwZWNpZmllZCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTMJCShTS0VSUl9IV0lfRTAxMisxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxM01TRwkiU2tHZUluaXRQb3J0KCk6IGNmZyBjaGFuZ2VkIGZvciBydW5uaW5nIHF1ZXVlIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxNAkJKFNLRVJSX0hXSV9FMDEzKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE0TVNHCSJTa0dlSW5pdFBvcnQoKTogdW5rbm93biBHSVBvcnRVc2FnZSBzcGVjaWZpZWQiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE1CQkoU0tFUlJfSFdJX0UwMTQrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTVNU0cJIklsbGVnYWwgTGluayBtb2RlIHBhcmFtZXRlciIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTYJCShTS0VSUl9IV0lfRTAxNSsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxNk1TRwkiSWxsZWdhbCBGbG93IGNvbnRyb2wgbW9kZSBwYXJhbWV0ZXIiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE3CQkoU0tFUlJfSFdJX0UwMTYrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTdNU0cJIklsbGVnYWwgdmFsdWUgc3BlY2lmaWVkIGZvciBHSVBvbGxUaW1lclZhbCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTgJCShTS0VSUl9IV0lfRTAxNysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxOE1TRwkiRkFUQUw6IFNrR2VTdG9wUG9ydCgpIGRvZXMgbm90IHRlcm1pbmF0ZSAoVHgpIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxOQkJKFNLRVJSX0hXSV9FMDE4KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE5TVNHCSJJbGxlZ2FsIFNwZWVkIHBhcmFtZXRlciIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjAJCShTS0VSUl9IV0lfRTAxOSsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAyME1TRwkiSWxsZWdhbCBNYXN0ZXIvU2xhdmUgcGFyYW1ldGVyIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyMQkJKFNLRVJSX0hXSV9FMDIwKzEpCisjZGVmaW5lCVNLRVJSX0hXSV9FMDIxTVNHCSJNYWNVcGRhdGVTdGF0cygpOiBjYW5ub3QgdXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyIgorI2RlZmluZQlTS0VSUl9IV0lfRTAyMgkJKFNLRVJSX0hXSV9FMDIxKzEpCisjZGVmaW5lCVNLRVJSX0hXSV9FMDIyTVNHCSJNYWNTdGF0aXN0aWMoKTogaWxsZWdhbCBzdGF0aXN0aWMgYmFzZSBhZGRyZXNzIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyMwkJKFNLRVJSX0hXSV9FMDIyKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIzTVNHCSJTa0dlSW5pdFBvcnQoKTogVHJhbnNtaXQgUXVldWUgU2l6ZSB0b28gc21hbGwiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDI0CQkoU0tFUlJfSFdJX0UwMjMrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjRNU0cJIkZBVEFMOiBTa0dlU3RvcFBvcnQoKSBkb2VzIG5vdCB0ZXJtaW5hdGUgKFJ4KSIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjUJCShTS0VSUl9IV0lfRTAyNCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAyNU1TRwkiIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCVNLX0tSX1BST1RPCisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNrZ2Vpbml0LmMKKyAqLworZXh0ZXJuIHZvaWQJU2tHZVBvbGxSeEQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCVBvbGxSeEQpOworCitleHRlcm4gdm9pZAlTa0dlUG9sbFR4RCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wgUG9sbFR4RCk7CisKK2V4dGVybiB2b2lkCVNrR2VZZWxsb3dMRUQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJU3RhdGUpOworCitleHRlcm4gaW50CVNrR2VDZmdTeW5jKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfVTMyCUludFRpbWUsCisJU0tfVTMyCUxpbUNvdW50LAorCWludAkJU3luY01vZGUpOworCitleHRlcm4gdm9pZAlTa0dlTG9hZExua1N5bmNDbnQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19VMzIJQ250VmFsKTsKKworZXh0ZXJuIHZvaWQJU2tHZVN0b3BQb3J0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlEaXIsCisJaW50CQlSc3RNb2RlKTsKKworZXh0ZXJuIGludAlTa0dlSW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlMZXZlbCk7CisKK2V4dGVybiB2b2lkCVNrR2VEZUluaXQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DKTsKKworZXh0ZXJuIGludAlTa0dlSW5pdFBvcnQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrR2VYbWl0TEVEKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCUxlZCwKKwlpbnQJCU1vZGUpOworCitleHRlcm4gdm9pZAlTa0dlSW5pdFJhbUlmYWNlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQyk7CisKK2V4dGVybiBpbnQJU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygKKwlTS19BQwkqcEFDLAorCWludAkJQWN0aXZlUG9ydCwKKwlTS19CT09MCUR1YWxOZXQpOworCisvKgorICogcHVibGljIGZ1bmN0aW9ucyBpbiBza3htYWMyLmMKKyAqLworZXh0ZXJuIHZvaWQgU2tNYWNSeFR4RGlzYWJsZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNTb2Z0UnN0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa01hY0hhcmRSc3QoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjQ2xlYXJSc3QoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrWG1Jbml0TWFjKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa0dtSW5pdE1hYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQgU2tNYWNJbml0UGh5KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlEb0xvb3ApOworCitleHRlcm4gdm9pZCBTa01hY0lycURpc2FibGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hUeEZpZm8oCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hSeEZpZm8oCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjSXJxKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gaW50CVNrTWFjQXV0b05lZ0RvbmUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjQXV0b05lZ0xpcGFQaHkoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19VMTYJSVN0YXR1cyk7CisKK2V4dGVybiB2b2lkICBTa01hY1NldFJ4VHhFbigKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCWludAkJUGFyYSk7CisKK2V4dGVybiBpbnQgIFNrTWFjUnhUeEVuYWJsZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNQcm9taXNjTW9kZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJRW5hYmxlKTsKKworZXh0ZXJuIHZvaWQJU2tNYWNIYXNoaW5nKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlFbmFibGUpOworCitleHRlcm4gdm9pZAlTa1htUGh5UmVhZCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCWludAkJQWRkciwKKwlTS19VMTYJU0tfRkFSICpwVmFsKTsKKworZXh0ZXJuIHZvaWQJU2tYbVBoeVdyaXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglWYWwpOworCitleHRlcm4gdm9pZAlTa0dtUGh5UmVhZCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCWludAkJQWRkciwKKwlTS19VMTYJU0tfRkFSICpwVmFsKTsKKworZXh0ZXJuIHZvaWQJU2tHbVBoeVdyaXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglWYWwpOworCitleHRlcm4gdm9pZAlTa1htQ2xyRXhhY3RBZGRyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlTdGFydE51bSwKKwlpbnQJCVN0b3BOdW0pOworCitleHRlcm4gdm9pZAlTa1htSW5pdER1cE1kKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa1htSW5pdFBhdXNlTWQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrWG1BdXRvTmVnTGlwYVhtYWMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19VMTYJSVN0YXR1cyk7CisKK2V4dGVybiBpbnQgU2tYbVVwZGF0ZVN0YXRzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCk7CisKK2V4dGVybiBpbnQgU2tHbVVwZGF0ZVN0YXRzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCk7CisKK2V4dGVybiBpbnQgU2tYbU1hY1N0YXRpc3RpYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQsCisJU0tfVTE2CVN0YXRBZGRyLAorCVNLX1UzMglTS19GQVIgKnBWYWwpOworCitleHRlcm4gaW50IFNrR21NYWNTdGF0aXN0aWMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0LAorCVNLX1UxNglTdGF0QWRkciwKKwlTS19VMzIJU0tfRkFSICpwVmFsKTsKKworZXh0ZXJuIGludCBTa1htUmVzZXRDb3VudGVyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCk7CisKK2V4dGVybiBpbnQgU2tHbVJlc2V0Q291bnRlcigKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQpOworCitleHRlcm4gaW50IFNrWG1PdmVyZmxvd1N0YXR1cygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQsCisJU0tfVTE2ICBJU3RhdHVzLAorCVNLX1U2NAlTS19GQVIgKnBTdGF0dXMpOworCitleHRlcm4gaW50IFNrR21PdmVyZmxvd1N0YXR1cygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQsCisJU0tfVTE2CU1hY1N0YXR1cywKKwlTS19VNjQJU0tfRkFSICpwU3RhdHVzKTsKKworZXh0ZXJuIGludCBTa0dtQ2FibGVEaWFnU3RhdHVzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlTdGFydFRlc3QpOworCitleHRlcm4gaW50IFNrR21FbnRlckxvd1Bvd2VyTW9kZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1U4CU1vZGUpOworCitleHRlcm4gaW50IFNrR21MZWF2ZUxvd1Bvd2VyTW9kZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworI2lmZGVmIFNLX0RJQUcKK2V4dGVybiB2b2lkCVNrR2VQaHlSZWFkKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNgkqcFZhbCk7CisKK2V4dGVybiB2b2lkCVNrR2VQaHlXcml0ZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCWludAkJQWRkciwKKwlTS19VMTYJVmFsKTsKKworZXh0ZXJuIHZvaWQJU2tNYWNTZXRSeENtZCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCWludAkJTW9kZSk7CitleHRlcm4gdm9pZAlTa01hY0NyY0dlbmVyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlFbmFibGUpOworZXh0ZXJuIHZvaWQJU2tNYWNUaW1lU3RhbXAoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CitleHRlcm4gdm9pZAlTa1htU2VuZENvbnQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CisjZW5kaWYgLyogU0tfRElBRyAqLworCisjZWxzZQkvKiBTS19LUl9QUk9UTyAqLworCisvKgorICogcHVibGljIGZ1bmN0aW9ucyBpbiBza2dlaW5pdC5jCisgKi8KK2V4dGVybiB2b2lkCVNrR2VQb2xsUnhEKCk7CitleHRlcm4gdm9pZAlTa0dlUG9sbFR4RCgpOworZXh0ZXJuIHZvaWQJU2tHZVllbGxvd0xFRCgpOworZXh0ZXJuIGludAlTa0dlQ2ZnU3luYygpOworZXh0ZXJuIHZvaWQJU2tHZUxvYWRMbmtTeW5jQ250KCk7CitleHRlcm4gdm9pZAlTa0dlU3RvcFBvcnQoKTsKK2V4dGVybiBpbnQJU2tHZUluaXQoKTsKK2V4dGVybiB2b2lkCVNrR2VEZUluaXQoKTsKK2V4dGVybiBpbnQJU2tHZUluaXRQb3J0KCk7CitleHRlcm4gdm9pZAlTa0dlWG1pdExFRCgpOworZXh0ZXJuIHZvaWQJU2tHZUluaXRSYW1JZmFjZSgpOworZXh0ZXJuIGludAlTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzKCk7CisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNreG1hYzIuYworICovCitleHRlcm4gdm9pZCBTa01hY1J4VHhEaXNhYmxlKCk7CitleHRlcm4gdm9pZAlTa01hY1NvZnRSc3QoKTsKK2V4dGVybiB2b2lkCVNrTWFjSGFyZFJzdCgpOworZXh0ZXJuIHZvaWQJU2tNYWNDbGVhclJzdCgpOworZXh0ZXJuIHZvaWQgU2tNYWNJbml0UGh5KCk7CitleHRlcm4gaW50ICBTa01hY1J4VHhFbmFibGUoKTsKK2V4dGVybiB2b2lkIFNrTWFjUHJvbWlzY01vZGUoKTsKK2V4dGVybiB2b2lkIFNrTWFjSGFzaGluZygpOworZXh0ZXJuIHZvaWQgU2tNYWNJcnFEaXNhYmxlKCk7CitleHRlcm4gdm9pZAlTa01hY0ZsdXNoVHhGaWZvKCk7CitleHRlcm4gdm9pZAlTa01hY0ZsdXNoUnhGaWZvKCk7CitleHRlcm4gdm9pZAlTa01hY0lycSgpOworZXh0ZXJuIGludAlTa01hY0F1dG9OZWdEb25lKCk7CitleHRlcm4gdm9pZAlTa01hY0F1dG9OZWdMaXBhUGh5KCk7CitleHRlcm4gdm9pZCBTa01hY1NldFJ4VHhFbigpOworZXh0ZXJuIHZvaWQJU2tYbUluaXRNYWMoKTsKK2V4dGVybiB2b2lkCVNrWG1QaHlSZWFkKCk7CitleHRlcm4gdm9pZAlTa1htUGh5V3JpdGUoKTsKK2V4dGVybiB2b2lkCVNrR21Jbml0TWFjKCk7CitleHRlcm4gdm9pZAlTa0dtUGh5UmVhZCgpOworZXh0ZXJuIHZvaWQJU2tHbVBoeVdyaXRlKCk7CitleHRlcm4gdm9pZAlTa1htQ2xyRXhhY3RBZGRyKCk7CitleHRlcm4gdm9pZAlTa1htSW5pdER1cE1kKCk7CitleHRlcm4gdm9pZAlTa1htSW5pdFBhdXNlTWQoKTsKK2V4dGVybiB2b2lkCVNrWG1BdXRvTmVnTGlwYVhtYWMoKTsKK2V4dGVybiBpbnQJU2tYbVVwZGF0ZVN0YXRzKCk7CitleHRlcm4gaW50CVNrR21VcGRhdGVTdGF0cygpOworZXh0ZXJuIGludAlTa1htTWFjU3RhdGlzdGljKCk7CitleHRlcm4gaW50CVNrR21NYWNTdGF0aXN0aWMoKTsKK2V4dGVybiBpbnQJU2tYbVJlc2V0Q291bnRlcigpOworZXh0ZXJuIGludAlTa0dtUmVzZXRDb3VudGVyKCk7CitleHRlcm4gaW50CVNrWG1PdmVyZmxvd1N0YXR1cygpOworZXh0ZXJuIGludAlTa0dtT3ZlcmZsb3dTdGF0dXMoKTsKK2V4dGVybiBpbnQJU2tHbUNhYmxlRGlhZ1N0YXR1cygpOworZXh0ZXJuIGludAlTa0dtRW50ZXJMb3dQb3dlck1vZGUoKTsKK2V4dGVybiBpbnQJU2tHbUxlYXZlTG93UG93ZXJNb2RlKCk7CisKKyNpZmRlZiBTS19ESUFHCitleHRlcm4gdm9pZAlTa0dlUGh5UmVhZCgpOworZXh0ZXJuIHZvaWQJU2tHZVBoeVdyaXRlKCk7CitleHRlcm4gdm9pZAlTa01hY1NldFJ4Q21kKCk7CitleHRlcm4gdm9pZAlTa01hY0NyY0dlbmVyKCk7CitleHRlcm4gdm9pZAlTa01hY1RpbWVTdGFtcCgpOworZXh0ZXJuIHZvaWQJU2tYbVNlbmRDb250KCk7CisjZW5kaWYgLyogU0tfRElBRyAqLworCisjZW5kaWYJLyogU0tfS1JfUFJPVE8gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLR0VJTklUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXBubTIuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5tMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDMwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXBubTIuaApAQCAtMCwwICsxLDMzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZXBubTIuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjM2ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA1LzIzIDEyOjQ1OjEzICQKKyAqIFB1cnBvc2U6CURlZmluZXMgZm9yIFByaXZhdGUgTmV0d29yayBNYW5hZ2VtZW50IEludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TS0dFUE5NMl9IXworI2RlZmluZSBfU0tHRVBOTTJfSF8KKworLyoKKyAqIEdlbmVyYWwgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX0NISVBTRVRfWE1BQwkxCS8qIFhNQUMxMTgwMEZQICovCisjZGVmaW5lIFNLX1BOTUlfQ0hJUFNFVF9ZVUtPTgkyCS8qIFlVS09OICovCisKKyNkZWZpbmUJU0tfUE5NSV9CVVNfUENJCQkxCS8qIFBDSSBidXMqLworCisvKgorICogQWN0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfQUNUX0lETEUJCTEKKyNkZWZpbmUgU0tfUE5NSV9BQ1RfUkVTRVQJCTIKKyNkZWZpbmUgU0tfUE5NSV9BQ1RfU0VMRlRFU1QJMworI2RlZmluZSBTS19QTk1JX0FDVF9SRVNFVENOVAk0CisKKy8qCisgKiBWUEQgcmVsZWF0ZWQgZGVmaW5lcworICovCisKKyNkZWZpbmUgU0tfUE5NSV9WUERfUlcJCTEKKyNkZWZpbmUgU0tfUE5NSV9WUERfUk8JCTIKKworI2RlZmluZSBTS19QTk1JX1ZQRF9PSwkJCTAKKyNkZWZpbmUgU0tfUE5NSV9WUERfTk9URk9VTkQJMQorI2RlZmluZSBTS19QTk1JX1ZQRF9DVVQJCQkyCisjZGVmaW5lIFNLX1BOTUlfVlBEX1RJTUVPVVQJCTMKKyNkZWZpbmUgU0tfUE5NSV9WUERfRlVMTAkJNAorI2RlZmluZSBTS19QTk1JX1ZQRF9OT1dSSVRFCQk1CisjZGVmaW5lIFNLX1BOTUlfVlBEX0ZBVEFMCQk2CisKKyNkZWZpbmUgU0tfUE5NSV9WUERfSUdOT1JFCTAKKyNkZWZpbmUgU0tfUE5NSV9WUERfQ1JFQVRFCTEKKyNkZWZpbmUgU0tfUE5NSV9WUERfREVMRVRFCTIKKworCisvKgorICogUkxNVCByZWxhdGVkIGRlZmluZXMKKyAqLworI2RlZmluZSBTS19QTk1JX0RFRl9STE1UX0NIR19USFJFUwkyNDAJLyogNCBjaGFuZ2VzIHBlciBtaW51dGUgKi8KKworCisvKgorICogVkNUIGludGVybmFsIHN0YXR1cyB2YWx1ZXMKKyAqLworI2RlZmluZSBTS19QTk1JX1ZDVF9QRU5ESU5HCTMyCisjZGVmaW5lIFNLX1BOTUlfVkNUX1RFU1RfRE9ORQk2NAorI2RlZmluZSBTS19QTk1JX1ZDVF9MSU5LCTEyOAorCisvKgorICogSW50ZXJuYWwgdGFibGUgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX0dFVAkJMAorI2RlZmluZSBTS19QTk1JX1BSRVNFVAkxCisjZGVmaW5lIFNLX1BOTUlfU0VUCQkyCisKKyNkZWZpbmUgU0tfUE5NSV9STwkJMAorI2RlZmluZSBTS19QTk1JX1JXCQkxCisjZGVmaW5lIFNLX1BOTUlfV08JCTIKKwordHlwZWRlZiBzdHJ1Y3Qgc19PaWRUYWJFbnRyeSB7CisJU0tfVTMyCQkJSWQ7CisJU0tfVTMyCQkJSW5zdGFuY2VObzsKKwl1bnNpZ25lZCBpbnQJU3RydWN0U2l6ZTsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCWludAkJCQlBY2Nlc3M7CisJaW50CQkJCSgqIEZ1bmMpKFNLX0FDICpwQWMsIFNLX0lPQyBwSW8sIGludCBhY3Rpb24sCisJCQkJCQkJIFNLX1UzMiBJZCwgY2hhciogcEJ1ZiwgdW5zaWduZWQgaW50KiBwTGVuLAorCQkJCQkJCSBTS19VMzIgSW5zdGFuY2UsIHVuc2lnbmVkIGludCBUYWJsZUluZGV4LAorCQkJCQkJCSBTS19VMzIgTmV0TnVtYmVyKTsKKwlTS19VMTYJCQlQYXJhbTsKK30gU0tfUE5NSV9UQUJfRU5UUlk7CisKKworLyoKKyAqIFRyYXAgbGVuZ3RocworICovCisjZGVmaW5lIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOCQkJMTcKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1NFTlNPUl9MRU5fQkFTRQk0NgorI2RlZmluZSBTS19QTk1JX1RSQVBfUkxNVF9DSEFOR0VfTEVOCTIzCisjZGVmaW5lIFNLX1BOTUlfVFJBUF9STE1UX1BPUlRfTEVOCQkyMworCisvKgorICogTnVtYmVyIG9mIE1BQyB0eXBlcyBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBTS19QTk1JX01BQ19UWVBFUwkoU0tfTUFDX0dNQUMgKyAxKQorCisvKgorICogTUFDIHN0YXRpc3RpYyBkYXRhIGxpc3QgKG92ZXJhbGwgc2V0IGZvciBNQUMgdHlwZXMgdXNlZCkKKyAqLworZW51bSBTS19NQUNTVEFUUyB7CisJU0tfUE5NSV9IVFgJCQkJPSAwLAorCVNLX1BOTUlfSFRYX09DVEVULAorCVNLX1BOTUlfSFRYX09DVEVUSElHSCAJPSBTS19QTk1JX0hUWF9PQ1RFVCwKKwlTS19QTk1JX0hUWF9PQ1RFVExPVywKKwlTS19QTk1JX0hUWF9CUk9BRENBU1QsCisJU0tfUE5NSV9IVFhfTVVMVElDQVNULAorCVNLX1BOTUlfSFRYX1VOSUNBU1QsCisJU0tfUE5NSV9IVFhfQlVSU1QsCisJU0tfUE5NSV9IVFhfUE1BQ0MsCisJU0tfUE5NSV9IVFhfTUFDQywKKwlTS19QTk1JX0hUWF9DT0wsCisJU0tfUE5NSV9IVFhfU0lOR0xFX0NPTCwKKwlTS19QTk1JX0hUWF9NVUxUSV9DT0wsCisJU0tfUE5NSV9IVFhfRVhDRVNTX0NPTCwKKwlTS19QTk1JX0hUWF9MQVRFX0NPTCwKKwlTS19QTk1JX0hUWF9ERUZGRVJBTCwKKwlTS19QTk1JX0hUWF9FWENFU1NfREVGLAorCVNLX1BOTUlfSFRYX1VOREVSUlVOLAorCVNLX1BOTUlfSFRYX0NBUlJJRVIsCisJU0tfUE5NSV9IVFhfVVRJTFVOREVSLAorCVNLX1BOTUlfSFRYX1VUSUxPVkVSLAorCVNLX1BOTUlfSFRYXzY0LAorCVNLX1BOTUlfSFRYXzEyNywKKwlTS19QTk1JX0hUWF8yNTUsCisJU0tfUE5NSV9IVFhfNTExLAorCVNLX1BOTUlfSFRYXzEwMjMsCisJU0tfUE5NSV9IVFhfTUFYLAorCVNLX1BOTUlfSFRYX0xPTkdGUkFNRVMsCisJU0tfUE5NSV9IVFhfU1lOQywKKwlTS19QTk1JX0hUWF9TWU5DX09DVEVULAorCVNLX1BOTUlfSFRYX1JFU0VSVkVELAorCQorCVNLX1BOTUlfSFJYLAorCVNLX1BOTUlfSFJYX09DVEVULAorCVNLX1BOTUlfSFJYX09DVEVUSElHSAk9IFNLX1BOTUlfSFJYX09DVEVULAorCVNLX1BOTUlfSFJYX09DVEVUTE9XLAorCVNLX1BOTUlfSFJYX0JBRE9DVEVULAorCVNLX1BOTUlfSFJYX0JBRE9DVEVUSElHSCA9IFNLX1BOTUlfSFJYX0JBRE9DVEVULAorCVNLX1BOTUlfSFJYX0JBRE9DVEVUTE9XLAorCVNLX1BOTUlfSFJYX0JST0FEQ0FTVCwKKwlTS19QTk1JX0hSWF9NVUxUSUNBU1QsCisJU0tfUE5NSV9IUlhfVU5JQ0FTVCwKKwlTS19QTk1JX0hSWF9QTUFDQywKKwlTS19QTk1JX0hSWF9NQUNDLAorCVNLX1BOTUlfSFJYX1BNQUNDX0VSUiwKKwlTS19QTk1JX0hSWF9NQUNDX1VOS1dOLAorCVNLX1BOTUlfSFJYX0JVUlNULAorCVNLX1BOTUlfSFJYX01JU1NFRCwKKwlTS19QTk1JX0hSWF9GUkFNSU5HLAorCVNLX1BOTUlfSFJYX1VOREVSU0laRSwKKwlTS19QTk1JX0hSWF9PVkVSRkxPVywKKwlTS19QTk1JX0hSWF9KQUJCRVIsCisJU0tfUE5NSV9IUlhfQ0FSUklFUiwKKwlTS19QTk1JX0hSWF9JUkxFTkdUSCwKKwlTS19QTk1JX0hSWF9TWU1CT0wsCisJU0tfUE5NSV9IUlhfU0hPUlRTLAorCVNLX1BOTUlfSFJYX1JVTlQsCisJU0tfUE5NSV9IUlhfVE9PX0xPTkcsCisJU0tfUE5NSV9IUlhfRkNTLAorCVNLX1BOTUlfSFJYX0NFWFQsCisJU0tfUE5NSV9IUlhfVVRJTFVOREVSLAorCVNLX1BOTUlfSFJYX1VUSUxPVkVSLAorCVNLX1BOTUlfSFJYXzY0LAorCVNLX1BOTUlfSFJYXzEyNywKKwlTS19QTk1JX0hSWF8yNTUsCisJU0tfUE5NSV9IUlhfNTExLAorCVNLX1BOTUlfSFJYXzEwMjMsCisJU0tfUE5NSV9IUlhfTUFYLAorCVNLX1BOTUlfSFJYX0xPTkdGUkFNRVMsCisJCisJU0tfUE5NSV9IUlhfUkVTRVJWRUQsCisJCisJU0tfUE5NSV9NQVhfSURYCQkvKiBOT1RFOiBFbnN1cmUgU0tfUE5NSV9DTlRfTk8gaXMgc2V0IHRvIHRoaXMgdmFsdWUgKi8KK307CisKKy8qCisgKiBNQUMgc3BlY2lmaWMgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBzX1BubWlTdGF0QWRkciB7CisJU0tfVTE2CQlSZWc7CQkvKiBNQUMgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgdmFsdWUgKi8KKwlTS19CT09MCQlHZXRPZmZzZXQ7CS8qIFRSVUU6IE9mZnNldCBtYW5hZ2VkIGJ5IFBOTUkgKGNhbGwgR2V0U3RhdFZhbCgpKSovCit9IFNLX1BOTUlfU1RBVEFERFI7CisKKworLyoKKyAqIFNLX1BOTUlfU1RSVUNUX0RBVEEgY29weSBvZmZzZXQgZXZhbHVhdGlvbiBtYWNyb3MKKyAqLworI2RlZmluZSBTS19QTk1JX09GRihlKQkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfU1RSVUNUX0RBVEEgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfTUFJX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9WUERfT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1ZQRCAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9TRU5fT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1NFTlNPUiAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9DSEtfT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX0NIRUNLU1VNICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1NUQV9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfU1RBVCAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9DTkZfT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX0NPTkYgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfUkxNX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9STE1UICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX01PTl9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfUkxNVF9NT05JVE9SICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1RSUF9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfVFJBUCAqKTApLT5lKSkKKworI2RlZmluZSBTS19QTk1JX1NFVF9TVEFUKGIscyxvKQl7U0tfVTMyCVZhbDMyOyBjaGFyICpwVmFsOyBcCisJCQkJCVZhbDMyID0gKHMpOyBcCisJCQkJCXBWYWwgPSAoY2hhciAqKShiKSArICgoU0tfVTMyKShTS19VUFRSKSBcCisJCQkJCQkmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT4gXAorCQkJCQkJUmV0dXJuU3RhdHVzLkVycm9yU3RhdHVzKSk7IFwKKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIocFZhbCwgVmFsMzIpOyBcCisJCQkJCVZhbDMyID0gKG8pOyBcCisJCQkJCXBWYWwgPSAoY2hhciAqKShiKSArICgoU0tfVTMyKShTS19VUFRSKSBcCisJCQkJCQkmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT4gXAorCQkJCQkJUmV0dXJuU3RhdHVzLkVycm9yT2Zmc2V0KSk7IFwKKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIocFZhbCwgVmFsMzIpO30KKworLyoKKyAqIFRpbWUgbWFjcm9zCisgKi8KKyNpZm5kZWYgU0tfUE5NSV9IVU5EUkVEU19TRUMKKyNpZiBTS19USUNLU19QRVJfU0VDID09IDEwMAorI2RlZmluZSBTS19QTk1JX0hVTkRSRURTX1NFQyh0KQkodCkKKyNlbHNlCisjZGVmaW5lIFNLX1BOTUlfSFVORFJFRFNfU0VDKHQpCSgoKHQpICogMTAwKSAvIChTS19USUNLU19QRVJfU0VDKSkKKyNlbmRpZiAvKiAhU0tfVElDS1NfUEVSX1NFQyAqLworI2VuZGlmIC8qICFTS19QTk1JX0hVTkRSRURTX1NFQyAqLworCisvKgorICogTWFjcm9zIHRvIHdvcmsgYXJvdW5kIGFsaWdubWVudCBwcm9ibGVtcworICovCisjaWZuZGVmIFNLX1BOTUlfU1RPUkVfVTE2CisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTE2KHAsdikJeyooY2hhciAqKShwKSA9ICooKGNoYXIgKikmKHYpKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMSkgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMSk7fQorI2VuZGlmCisKKyNpZm5kZWYgU0tfUE5NSV9TVE9SRV9VMzIKKyNkZWZpbmUgU0tfUE5NSV9TVE9SRV9VMzIocCx2KQl7KihjaGFyICopKHApID0gKigoY2hhciAqKSYodikpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAxKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAxKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMikgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMik7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDMpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpO30KKyNlbmRpZgorCisjaWZuZGVmIFNLX1BOTUlfU1RPUkVfVTY0CisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTY0KHAsdikJeyooY2hhciAqKShwKSA9ICooKGNoYXIgKikmKHYpKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMSkgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMSk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDIpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDIpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAzKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAzKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgNCkgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgNCk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDUpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDUpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyA2KSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyA2KTsgXAorCQkJCQkqKChjaGFyICopKHApICsgNykgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgNyk7fQorI2VuZGlmCisKKyNpZm5kZWYgU0tfUE5NSV9SRUFEX1UxNgorI2RlZmluZSBTS19QTk1JX1JFQURfVTE2KHAsdikJeyooKGNoYXIgKikmKHYpKSA9ICooY2hhciAqKShwKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMSkgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMSk7fQorI2VuZGlmCisKKyNpZm5kZWYgU0tfUE5NSV9SRUFEX1UzMgorI2RlZmluZSBTS19QTk1JX1JFQURfVTMyKHAsdikJeyooKGNoYXIgKikmKHYpKSA9ICooY2hhciAqKShwKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMSkgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMSk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDIpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDIpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAzKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAzKTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1JFQURfVTY0CisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VNjQocCx2KQl7KigoY2hhciAqKSYodikpID0gKihjaGFyICopKHApOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAxKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAxKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMikgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMik7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDMpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyA0KSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyA0KTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgNSkgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgNSk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDYpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDYpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyA3KSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyA3KTt9CisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgRGVidWcKKyAqLworI2lmZGVmIERFQlVHCisKKyNkZWZpbmUgU0tfUE5NSV9DSEVDS0ZMQUdTKHZTdCkJe2lmIChwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgPiAwIHx8IFwKKwkJCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyA+IDAgfHwgXAorCQkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnID4gMCkgeyBcCisJCQkJCQlTS19EQkdfTVNHKHBBQywgXAorCQkJCQkJU0tfREJHTU9EX1BOTUksIFwKKwkJCQkJCVNLX0RCR0NBVF9DVFJMLAlcCisJCQkJCQkoIlBOTUk6IEVSUjogJXMgTWFjVUZsYWc9JWQsIFJsbXRVRmxhZz0lZCwgU2lycVVGbGFnPSVkXG4iLCBcCisJCQkJCQl2U3QsIFwKKwkJCQkJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZywgXAorCQkJCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZywgXAorCQkJCQkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZykpfX0KKworI2Vsc2UJLyogIURFQlVHICovCisKKyNkZWZpbmUgU0tfUE5NSV9DSEVDS0ZMQUdTKHZTdCkJLyogTm90aGluZyAqLworCisjZW5kaWYJLyogIURFQlVHICovCisKKyNlbmRpZgkvKiBfU0tHRVBOTTJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5taS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyNzczZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5taS5oCkBAIC0wLDAgKzEsOTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlcG5taS5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNjIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDgvMTUgMTI6MzE6NTIgJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgUHJpdmF0ZSBOZXR3b3JrIE1hbmFnZW1lbnQgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NLR0VQTk1JX0hfCisjZGVmaW5lIF9TS0dFUE5NSV9IXworCisvKgorICogSW5jbHVkZSBkZXBlbmRlbmNpZXMKKyAqLworI2luY2x1ZGUgImgvc2t0eXBlcy5oIgorI2luY2x1ZGUgImgvc2tlcnJvci5oIgorI2luY2x1ZGUgImgvc2t0aW1lci5oIgorI2luY2x1ZGUgImgvc2tpMmMuaCIKKyNpbmNsdWRlICJoL3NrYWRkci5oIgorI2luY2x1ZGUgImgvc2tybG10LmgiCisjaW5jbHVkZSAiaC9za3ZwZC5oIgorCisvKgorICogTWFuYWdlbWVudCBEYXRhYmFzZSBWZXJzaW9uCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9NREJfVkVSU0lPTgkJMHgwMDAzMDAwMQkvKiAzLjEgKi8KKworCisvKgorICogRXZlbnQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TSVJRX09WRVJGTE9XCQkxCS8qIENvdW50ZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfU0VOX1dBUl9MT1cJCQkyCS8qIExvd2VyIHdhciB0aHJlcyBleGNlZWRlZCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TRU5fV0FSX1VQUAkJCTMJLyogVXBwZXIgd2FyIHRocmVzIGV4Y2VlZGVkICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1NFTl9FUlJfTE9XCQkJNAkvKiBMb3dlciBlcnIgdGhyZXMgZXhjZWVkZWQgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfU0VOX0VSUl9VUFAJCQk1CS8qIFVwcGVyIGVyciB0aHJlcyBleGNlZWRlZCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9DSEdfRVNUX1RJTUVSCQk2CS8qIFRpbWVyIGV2ZW50IGZvciBSTE1UIENoZyAqLworI2RlZmluZSBTS19QTk1JX0VWVF9VVElMSVpBVElPTl9USU1FUgk3CS8qIFRpbWVyIGV2ZW50IGZvciBVdGlsaXphLiAqLworI2RlZmluZSBTS19QTk1JX0VWVF9DTEVBUl9DT1VOVEVSCQk4CS8qIENsZWFyIHN0YXRpc3RpYyBjb3VudGVycyAqLworI2RlZmluZSBTS19QTk1JX0VWVF9YTUFDX1JFU0VUCQkJOQkvKiBYTUFDIHdpbGwgYmUgcmVzZXQgKi8KKworI2RlZmluZSBTS19QTk1JX0VWVF9STE1UX1BPUlRfVVAJCTEwCS8qIFBvcnQgY2FtZSBsb2dpY2FsbHkgdXAgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9QT1JUX0RPV04JCTExCS8qIFBvcnQgd2VudCBsb2dpY2FsbHkgZG93biAqLworI2RlZmluZSBTS19QTk1JX0VWVF9STE1UX1NFR01FTlRBVElPTgkxMwkvKiBUd28gU1Agcm9vdCBicmlkZ2VzIGZvdW5kICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04JMTQJLyogUG9ydCB3ZW50IGxvZ2ljYWxseSBkb3duICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQCQkxNQkvKiBQb3J0IGNhbWUgbG9naWNhbGx5IHVwICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfU0VUX05FVFMJCTE2CS8qIDEuIFBhcmFtZXRlciBpcyBudW1iZXIgb2YgbmV0cworCQkJCQkJCQkJCQkJMSA9IHNpbmdsZSBuZXQ7IDIgPSBkdWFsIG5ldCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9WQ1RfUkVTRVQJCTE3CS8qIFZDVCBwb3J0IHJlc2V0IHRpbWVyIGV2ZW50IHN0YXJ0ZWQgd2l0aCBTRVQuICovCisKKworLyoKKyAqIFJldHVybiB2YWx1ZXMKKyAqLworI2RlZmluZSBTS19QTk1JX0VSUl9PSwkJCQkwCisjZGVmaW5lIFNLX1BOTUlfRVJSX0dFTkVSQUwJCQkxCisjZGVmaW5lIFNLX1BOTUlfRVJSX1RPT19TSE9SVAkJMgorI2RlZmluZSBTS19QTk1JX0VSUl9CQURfVkFMVUUJCTMKKyNkZWZpbmUgU0tfUE5NSV9FUlJfUkVBRF9PTkxZCQk0CisjZGVmaW5lIFNLX1BOTUlfRVJSX1VOS05PV05fT0lECQk1CisjZGVmaW5lIFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVAk2CisjZGVmaW5lIFNLX1BOTUlfRVJSX1VOS05PV05fTkVUIAk3CisjZGVmaW5lIFNLX1BOTUlfRVJSX05PVF9TVVBQT1JURUQJMTAKKworCisvKgorICogUmV0dXJuIHZhbHVlcyBvZiBkcml2ZXIgcmVzZXQgZnVuY3Rpb24gU0tfRFJJVkVSX1JFU0VUKCkgYW5kCisgKiBkcml2ZXIgZXZlbnQgZnVuY3Rpb24gU0tfRFJJVkVSX0VWRU5UKCkKKyAqLworI2RlZmluZSBTS19QTk1JX0VSUl9PSwkJCTAKKyNkZWZpbmUgU0tfUE5NSV9FUlJfRkFJTAkJMQorCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIG9mIGRyaXZlciB0ZXN0IGZ1bmN0aW9uIFNLX0RSSVZFUl9TRUxGVEVTVCgpCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9UU1RfVU5LTk9XTgkJKDEgPDwgMCkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfVFJBTkNFSVZFUgkJKDEgPDwgMSkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfQVNJQwkJKDEgPDwgMikKKyNkZWZpbmUgU0tfUE5NSV9UU1RfU0VOU09SCQkoMSA8PCAzKQorI2RlZmluZSBTS19QTk1JX1RTVF9QT1dFUk1HTVQJCSgxIDw8IDQpCisjZGVmaW5lIFNLX1BOTUlfVFNUX1BDSQkJCSgxIDw8IDUpCisjZGVmaW5lIFNLX1BOTUlfVFNUX01BQwkJCSgxIDw8IDYpCisKKworLyoKKyAqIFJMTVQgc3BlY2lmaWMgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX1JMTVRfU1RBVFVTX1NUQU5EQlkJMQorI2RlZmluZSBTS19QTk1JX1JMTVRfU1RBVFVTX0FDVElWRQkyCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9TVEFUVVNfRVJST1IJMworCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9MU1RBVF9QSFlfRE9XTgkxCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9MU1RBVF9BVVRPTkVHCTIKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0xPR19ET1dOCTMKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0xPR19VUAk0CisjZGVmaW5lIFNLX1BOTUlfUkxNVF9MU1RBVF9JTkRFVEVSTUlOQVRFRCA1CisKKyNkZWZpbmUgU0tfUE5NSV9STE1UX01PREVfQ0hLX0xJTksJKFNLX1JMTVRfQ0hFQ0tfTElOSykKKyNkZWZpbmUgU0tfUE5NSV9STE1UX01PREVfQ0hLX1JYCShTS19STE1UX0NIRUNLX0xPQ19MSU5LKQorI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfU1BUCShTS19STE1UX0NIRUNLX1NFRykKKy8qICNkZWZpbmUgU0tfUE5NSV9STE1UX01PREVfQ0hLX0VYICovCisKKy8qCisgKiBPSUQgZGVmaW5pdGlvbgorICovCisjaWZuZGVmIF9ORElTXwkvKiBDaGVjaywgd2hldGhlciBORElTIGFscmVhZHkgaW5jbHVkZWQgT0lEcyAqLworCisjZGVmaW5lIE9JRF9HRU5fWE1JVF9PSwkJCQkJMHgwMDAyMDEwMQorI2RlZmluZSBPSURfR0VOX1JDVl9PSwkJCQkJMHgwMDAyMDEwMgorI2RlZmluZSBPSURfR0VOX1hNSVRfRVJST1IJCQkJMHgwMDAyMDEwMworI2RlZmluZSBPSURfR0VOX1JDVl9FUlJPUgkJCQkweDAwMDIwMTA0CisjZGVmaW5lIE9JRF9HRU5fUkNWX05PX0JVRkZFUgkJCTB4MDAwMjAxMDUKKworLyogI2RlZmluZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1hNSVQJMHgwMDAyMDIwMSAqLworI2RlZmluZSBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlUCTB4MDAwMjAyMDIKKy8qICNkZWZpbmUgT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfWE1JVAkweDAwMDIwMjAzICovCisjZGVmaW5lIE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlUCTB4MDAwMjAyMDQKKy8qICNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVAkweDAwMDIwMjA1ICovCisjZGVmaW5lIE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlUCTB4MDAwMjAyMDYKKy8qICNkZWZpbmUgT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19SQ1YJMHgwMDAyMDIwNyAqLworI2RlZmluZSBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19SQ1YJCTB4MDAwMjAyMDgKKy8qICNkZWZpbmUgT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfUkNWCTB4MDAwMjAyMDkgKi8KKyNkZWZpbmUgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1JDVgkweDAwMDIwMjBBCisvKiAjZGVmaW5lIE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDVgkweDAwMDIwMjBCICovCisjZGVmaW5lIE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19SQ1YJMHgwMDAyMDIwQworI2RlZmluZSBPSURfR0VOX1JDVl9DUkNfRVJST1IJCQkweDAwMDIwMjBECisjZGVmaW5lIE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RICTB4MDAwMjAyMEUKKworI2RlZmluZSBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1MJCTB4MDEwMTAxMDEKKyNkZWZpbmUgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUwkJMHgwMTAxMDEwMgorLyogI2RlZmluZSBPSURfODAyXzNfTVVMVElDQVNUX0xJU1QJCTB4MDEwMTAxMDMgKi8KKy8qICNkZWZpbmUgT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFCTB4MDEwMTAxMDQgKi8KKy8qICNkZWZpbmUgT0lEXzgwMl8zX01BQ19PUFRJT05TCQkweDAxMDEwMTA1ICovCisJCQkKKyNkZWZpbmUgT0lEXzgwMl8zX1JDVl9FUlJPUl9BTElHTk1FTlQJMHgwMTAyMDEwMQorI2RlZmluZSBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OCTB4MDEwMjAxMDIKKyNkZWZpbmUgT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TCTB4MDEwMjAxMDMKKyNkZWZpbmUgT0lEXzgwMl8zX1hNSVRfREVGRVJSRUQJCQkweDAxMDIwMjAxCisjZGVmaW5lIE9JRF84MDJfM19YTUlUX01BWF9DT0xMSVNJT05TCTB4MDEwMjAyMDIKKyNkZWZpbmUgT0lEXzgwMl8zX1JDVl9PVkVSUlVOCQkJMHgwMTAyMDIwMworI2RlZmluZSBPSURfODAyXzNfWE1JVF9VTkRFUlJVTgkJCTB4MDEwMjAyMDQKKyNkZWZpbmUgT0lEXzgwMl8zX1hNSVRfVElNRVNfQ1JTX0xPU1QJMHgwMTAyMDIwNgorI2RlZmluZSBPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlMJMHgwMTAyMDIwNworCisvKgorICogUG5QIGFuZCBQTSBPSURzCisgKi8KKyNpZmRlZiBTS19QT1dFUl9NR01UCisjZGVmaW5lIE9JRF9QTlBfQ0FQQUJJTElUSUVTCQkJMHhGRDAxMDEwMAorI2RlZmluZSBPSURfUE5QX1NFVF9QT1dFUgkJCQkweEZEMDEwMTAxCisjZGVmaW5lIE9JRF9QTlBfUVVFUllfUE9XRVIJCQkJMHhGRDAxMDEwMgorI2RlZmluZSBPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk4JCTB4RkQwMTAxMDMKKyNkZWZpbmUgT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOCTB4RkQwMTAxMDQKKyNkZWZpbmUgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUAkJCTB4RkQwMTAxMDYKKyNlbmRpZiAvKiBTS19QT1dFUl9NR01UICovCisKKyNlbmRpZiAvKiBfTkRJU18gKi8KKworI2RlZmluZSBPSURfU0tHRV9NREJfVkVSU0lPTgkJCTB4RkYwMTAxMDAKKyNkZWZpbmUgT0lEX1NLR0VfU1VQUE9SVEVEX0xJU1QJCQkweEZGMDEwMTAxCisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9GUkVFX0JZVEVTCQkJMHhGRjAxMDEwMgorI2RlZmluZSBPSURfU0tHRV9WUERfRU5UUklFU19MSVNUCQkweEZGMDEwMTAzCisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9FTlRSSUVTX05VTUJFUgkJMHhGRjAxMDEwNAorI2RlZmluZSBPSURfU0tHRV9WUERfS0VZCQkJCTB4RkYwMTAxMDUKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX1ZBTFVFCQkJCTB4RkYwMTAxMDYKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0FDQ0VTUwkJCQkweEZGMDEwMTA3CisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9BQ1RJT04JCQkJMHhGRjAxMDEwOAorCQkJCisjZGVmaW5lIE9JRF9TS0dFX1BPUlRfTlVNQkVSCQkJMHhGRjAxMDExMAorI2RlZmluZSBPSURfU0tHRV9ERVZJQ0VfVFlQRQkJCTB4RkYwMTAxMTEKKyNkZWZpbmUgT0lEX1NLR0VfRFJJVkVSX0RFU0NSCQkJMHhGRjAxMDExMgorI2RlZmluZSBPSURfU0tHRV9EUklWRVJfVkVSU0lPTgkJCTB4RkYwMTAxMTMKKyNkZWZpbmUgT0lEX1NLR0VfSFdfREVTQ1IJCQkJMHhGRjAxMDExNAorI2RlZmluZSBPSURfU0tHRV9IV19WRVJTSU9OCQkJCTB4RkYwMTAxMTUKKyNkZWZpbmUgT0lEX1NLR0VfQ0hJUFNFVAkJCQkweEZGMDEwMTE2CisjZGVmaW5lIE9JRF9TS0dFX0FDVElPTgkJCQkJMHhGRjAxMDExNworI2RlZmluZSBPSURfU0tHRV9SRVNVTFQJCQkJCTB4RkYwMTAxMTgKKyNkZWZpbmUgT0lEX1NLR0VfQlVTX1RZUEUJCQkJMHhGRjAxMDExOQorI2RlZmluZSBPSURfU0tHRV9CVVNfU1BFRUQJCQkJMHhGRjAxMDExQQorI2RlZmluZSBPSURfU0tHRV9CVVNfV0lEVEgJCQkJMHhGRjAxMDExQgorLyogMHhGRjAxMDExQyB1bnVzZWQgKi8KKyNkZWZpbmUgT0lEX1NLR0VfRElBR19BQ1RJT04JCQkweEZGMDEwMTFECisjZGVmaW5lIE9JRF9TS0dFX0RJQUdfUkVTVUxUCQkJMHhGRjAxMDExRQorI2RlZmluZSBPSURfU0tHRV9NVFUJCQkJCTB4RkYwMTAxMUYKKyNkZWZpbmUgT0lEX1NLR0VfUEhZU19DVVJfQUREUgkJCTB4RkYwMTAxMjAKKyNkZWZpbmUgT0lEX1NLR0VfUEhZU19GQUNfQUREUgkJCTB4RkYwMTAxMjEKKyNkZWZpbmUgT0lEX1NLR0VfUE1ECQkJCQkweEZGMDEwMTIyCisjZGVmaW5lIE9JRF9TS0dFX0NPTk5FQ1RPUgkJCQkweEZGMDEwMTIzCisjZGVmaW5lIE9JRF9TS0dFX0xJTktfQ0FQCQkJCTB4RkYwMTAxMjQKKyNkZWZpbmUgT0lEX1NLR0VfTElOS19NT0RFCQkJCTB4RkYwMTAxMjUKKyNkZWZpbmUgT0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUwkJMHhGRjAxMDEyNgorI2RlZmluZSBPSURfU0tHRV9MSU5LX1NUQVRVUwkJCTB4RkYwMTAxMjcKKyNkZWZpbmUgT0lEX1NLR0VfRkxPV0NUUkxfQ0FQCQkJMHhGRjAxMDEyOAorI2RlZmluZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFCQkJMHhGRjAxMDEyOQorI2RlZmluZSBPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVMJCTB4RkYwMTAxMkEKKyNkZWZpbmUgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVAJCTB4RkYwMTAxMkIKKyNkZWZpbmUgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFCQkweEZGMDEwMTJDCisjZGVmaW5lIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTCTB4RkYwMTAxMkQKKyNkZWZpbmUgT0lEX1NLR0VfTVVMVElDQVNUX0xJU1QJCQkweEZGMDEwMTJFCisjZGVmaW5lIE9JRF9TS0dFX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUgkweEZGMDEwMTJGCisKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUAkJCQkJMHhGRjAxMDEzMAorI2RlZmluZSBPSURfU0tHRV9UUkFQX05VTUJFUgkJCTB4RkYwMTAxMzEKKworI2RlZmluZSBPSURfU0tHRV9STE1UX01PREUJCQkJMHhGRjAxMDE0MAorI2RlZmluZSBPSURfU0tHRV9STE1UX1BPUlRfTlVNQkVSCQkweEZGMDEwMTQxCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUE9SVF9BQ1RJVkUJCTB4RkYwMTAxNDIKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRAkweEZGMDEwMTQzCisjZGVmaW5lIE9JRF9TS0dFX0lOVEVSTUVESUFURV9TVVBQT1JUCTB4RkYwMTAxNjAKKworI2RlZmluZSBPSURfU0tHRV9TUEVFRF9DQVAJCQkJMHhGRjAxMDE3MAorI2RlZmluZSBPSURfU0tHRV9TUEVFRF9NT0RFCQkJCTB4RkYwMTAxNzEKKyNkZWZpbmUgT0lEX1NLR0VfU1BFRURfU1RBVFVTCQkJMHhGRjAxMDE3MgorCisjZGVmaW5lIE9JRF9TS0dFX0JPQVJETEVWRUwJCQkJMHhGRjAxMDE4MAorCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9OVU1CRVIJCQkweEZGMDIwMTAwCQkJCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9JTkRFWAkJCTB4RkYwMjAxMDEKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0RFU0NSCQkJMHhGRjAyMDEwMgorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfVFlQRQkJCTB4RkYwMjAxMDMKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1ZBTFVFCQkJMHhGRjAyMDEwNAorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX0xPVwkweEZGMDIwMTA1CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfVVBQCTB4RkYwMjAxMDYKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19MT1cJMHhGRjAyMDEwNworI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX1VQUAkweEZGMDIwMTA4CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9TVEFUVVMJCQkweEZGMDIwMTA5CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9XQVJfQ1RTCQkJMHhGRjAyMDEwQQorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfRVJSX0NUUwkJCTB4RkYwMjAxMEIKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1dBUl9USU1FCQkweEZGMDIwMTBDCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9FUlJfVElNRQkJMHhGRjAyMDEwRAorCisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX05VTUJFUgkJCTB4RkYwMjAxMTAKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fUlhfT0tfQ1RTCQkweEZGMDIwMTExCisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1JYX1VOQUJMRV9DVFMJMHhGRjAyMDExMgorI2RlZmluZSBPSURfU0tHRV9DSEtTTV9SWF9FUlJfQ1RTCQkweEZGMDIwMTEzCisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1RYX09LX0NUUwkJMHhGRjAyMDExNAorI2RlZmluZSBPSURfU0tHRV9DSEtTTV9UWF9VTkFCTEVfQ1RTCTB4RkYwMjAxMTUKKworI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYCQkJCTB4RkYwMjAxMjAKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMJCQkweEZGMDIwMTIxCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfQlJPQURDQVNUCQkweEZGMDIwMTIyCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfTVVMVElDQVNUCQkweEZGMDIwMTIzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfVU5JQ0FTVAkJMHhGRjAyMDEyNAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0xPTkdGUkFNRVMJCTB4RkYwMjAxMjUKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9CVVJTVAkJCTB4RkYwMjAxMjYKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9QRkxPV0MJCQkweEZGMDIwMTI3CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfRkxPV0MJCQkweEZGMDIwMTI4CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfU0lOR0xFX0NPTAkJMHhGRjAyMDEyOQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX01VTFRJX0NPTAkJMHhGRjAyMDEyQQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0VYQ0VTU19DT0wJCTB4RkYwMjAxMkIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9MQVRFX0NPTAkJMHhGRjAyMDEyQworI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0RFRkZFUkFMCQkweEZGMDIwMTJECisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfRVhDRVNTX0RFRgkJMHhGRjAyMDEyRQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1VOREVSUlVOCQkweEZGMDIwMTJGCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfQ0FSUklFUgkJMHhGRjAyMDEzMAorLyogI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1VUSUwJCTB4RkYwMjAxMzEgKi8KKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF82NAkJCQkweEZGMDIwMTMyCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfMTI3CQkJMHhGRjAyMDEzMworI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYXzI1NQkJCTB4RkYwMjAxMzQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF81MTEJCQkweEZGMDIwMTM1CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfMTAyMwkJCTB4RkYwMjAxMzYKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9NQVgJCQkweEZGMDIwMTM3CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfU1lOQwkJCTB4RkYwMjAxMzgKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9TWU5DX09DVEVUUwkweEZGMDIwMTM5CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlgJCQkJMHhGRjAyMDEzQQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX09DVEVUUwkJCTB4RkYwMjAxM0IKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9CUk9BRENBU1QJCTB4RkYwMjAxM0MKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9NVUxUSUNBU1QJCTB4RkYwMjAxM0QKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9VTklDQVNUCQkweEZGMDIwMTNFCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfUEZMT1dDCQkJMHhGRjAyMDEzRgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZMT1dDCQkJMHhGRjAyMDE0MAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1BGTE9XQ19FUlIJCTB4RkYwMjAxNDEKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9GTE9XQ19VTktXTgkweEZGMDIwMTQyCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfQlVSU1QJCQkweEZGMDIwMTQzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfTUlTU0VECQkJMHhGRjAyMDE0NAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZSQU1JTkcJCTB4RkYwMjAxNDUKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9PVkVSRkxPVwkJMHhGRjAyMDE0NgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0pBQkJFUgkJCTB4RkYwMjAxNDcKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9DQVJSSUVSCQkweEZGMDIwMTQ4CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfSVJfTEVOR1RICQkweEZGMDIwMTQ5CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfU1lNQk9MCQkJMHhGRjAyMDE0QQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1NIT1JUUwkJCTB4RkYwMjAxNEIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9SVU5UCQkJMHhGRjAyMDE0QworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0NFWFQJCQkweEZGMDIwMTRECisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfVE9PX0xPTkcJCTB4RkYwMjAxNEUKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9GQ1MJCQkweEZGMDIwMTRGCisvKiAjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfVVRJTAkJMHhGRjAyMDE1MCAqLworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzY0CQkJCTB4RkYwMjAxNTEKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF8xMjcJCQkweEZGMDIwMTUyCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfMjU1CQkJMHhGRjAyMDE1MworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzUxMQkJCTB4RkYwMjAxNTQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF8xMDIzCQkJMHhGRjAyMDE1NQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX01BWAkJCTB4RkYwMjAxNTYKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9MT05HRlJBTUVTCQkweEZGMDIwMTU3CisKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9DSEFOR0VfQ1RTCQkweEZGMDIwMTYwCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RJTUUJCTB4RkYwMjAxNjEKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9DSEFOR0VfRVNUSU0JCTB4RkYwMjAxNjIKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVEhSRVMJCTB4RkYwMjAxNjMKKworI2RlZmluZSBPSURfU0tHRV9STE1UX1BPUlRfSU5ERVgJCTB4RkYwMjAxNjQKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9TVEFUVVMJCQkweEZGMDIwMTY1CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfVFhfSEVMTE9fQ1RTCQkweEZGMDIwMTY2CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUlhfSEVMTE9fQ1RTCQkweEZGMDIwMTY3CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfVFhfU1BfUkVRX0NUUwkJMHhGRjAyMDE2OAorI2RlZmluZSBPSURfU0tHRV9STE1UX1JYX1NQX0NUUwkJCTB4RkYwMjAxNjkKKworI2RlZmluZSBPSURfU0tHRV9STE1UX01PTklUT1JfTlVNQkVSCTB4RkYwMTAxNTAKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0lOREVYCQkweEZGMDEwMTUxCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRERSCQkweEZGMDEwMTUyCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9FUlJTCQkweEZGMDEwMTUzCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9USU1FU1RBTVAJMHhGRjAxMDE1NAorI2RlZmluZSBPSURfU0tHRV9STE1UX01PTklUT1JfQURNSU4JCTB4RkYwMTAxNTUKKworI2RlZmluZSBPSURfU0tHRV9UWF9TV19RVUVVRV9MRU4JCTB4RkYwMjAxNzAKKyNkZWZpbmUgT0lEX1NLR0VfVFhfU1dfUVVFVUVfTUFYCQkweEZGMDIwMTcxCisjZGVmaW5lIE9JRF9TS0dFX1RYX1JFVFJZCQkJCTB4RkYwMjAxNzIKKyNkZWZpbmUgT0lEX1NLR0VfUlhfSU5UUl9DVFMJCQkweEZGMDIwMTczCisjZGVmaW5lIE9JRF9TS0dFX1RYX0lOVFJfQ1RTCQkJMHhGRjAyMDE3NAorI2RlZmluZSBPSURfU0tHRV9SWF9OT19CVUZfQ1RTCQkJMHhGRjAyMDE3NQorI2RlZmluZSBPSURfU0tHRV9UWF9OT19CVUZfQ1RTCQkJMHhGRjAyMDE3NgorI2RlZmluZSBPSURfU0tHRV9UWF9VU0VEX0RFU0NSX05PCQkweEZGMDIwMTc3CisjZGVmaW5lIE9JRF9TS0dFX1JYX0RFTElWRVJFRF9DVFMJCTB4RkYwMjAxNzgKKyNkZWZpbmUgT0lEX1NLR0VfUlhfT0NURVRTX0RFTElWX0NUUwkweEZGMDIwMTc5CisjZGVmaW5lIE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUwkJMHhGRjAyMDE3QQorI2RlZmluZSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFMJCTB4RkYwMjAxN0IKKyNkZWZpbmUgT0lEX1NLR0VfSU5fRVJST1JTX0NUUwkJCTB4RkYwMjAxN0MKKyNkZWZpbmUgT0lEX1NLR0VfT1VUX0VSUk9SX0NUUwkJCTB4RkYwMjAxN0QKKyNkZWZpbmUgT0lEX1NLR0VfRVJSX1JFQ09WRVJZX0NUUwkJMHhGRjAyMDE3RQorI2RlZmluZSBPSURfU0tHRV9TWVNVUFRJTUUJCQkJMHhGRjAyMDE3RgorCisjZGVmaW5lIE9JRF9TS0dFX0FMTF9EQVRBCQkJCTB4RkYwMjAxOTAKKworLyogRGVmaW5lcyBmb3IgVkNULiAqLworI2RlZmluZSBPSURfU0tHRV9WQ1RfR0VUCQkJCTB4RkYwMjAyMDAKKyNkZWZpbmUgT0lEX1NLR0VfVkNUX1NFVAkJCQkweEZGMDIwMjAxCisjZGVmaW5lIE9JRF9TS0dFX1ZDVF9TVEFUVVMJCQkJMHhGRjAyMDIwMgorCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisvKiBEZWZpbmVzIGZvciBkcml2ZXIgRElBRyBtb2RlLiAqLworI2RlZmluZSBPSURfU0tHRV9ESUFHX01PREUJCQkJMHhGRjAyMDIwNAorI2VuZGlmIC8qIFNLX0RJQUdfU1VQUE9SVCAqLworCisvKiBOZXcgT0lEcyAqLworI2RlZmluZSBPSURfU0tHRV9EUklWRVJfUkVMREFURQkJCTB4RkYwMjAyMTAKKyNkZWZpbmUgT0lEX1NLR0VfRFJJVkVSX0ZJTEVOQU1FCQkweEZGMDIwMjExCisjZGVmaW5lIE9JRF9TS0dFX0NISVBJRAkJCQkJMHhGRjAyMDIxMgorI2RlZmluZSBPSURfU0tHRV9SQU1TSVpFCQkJCTB4RkYwMjAyMTMKKyNkZWZpbmUgT0lEX1NLR0VfVkFVWEFWQUlMCQkJCTB4RkYwMjAyMTQKKyNkZWZpbmUgT0lEX1NLR0VfUEhZX1RZUEUJCQkJMHhGRjAyMDIxNQorI2RlZmluZSBPSURfU0tHRV9QSFlfTFBfTU9ERQkJCTB4RkYwMjAyMTYKKworLyogVkNUIHN0cnVjdCB0byBzdG9yZSBhIGJhY2t1cCBjb3B5IG9mIFZDVCBkYXRhIGFmdGVyIGEgcG9ydCByZXNldC4gKi8KK3R5cGVkZWYgc3RydWN0IHNfUG5taVZjdCB7CisJU0tfVTgJCQlWY3RTdGF0dXM7CisJU0tfVTgJCQlQQ2FibGVMZW47CisJU0tfVTMyCQkJUE1kaVBhaXJMZW5bNF07CisJU0tfVTgJCQlQTWRpUGFpclN0c1s0XTsKK30gU0tfUE5NSV9WQ1Q7CisKKworLyogVkNUIHN0YXR1cyB2YWx1ZXMgKHRvIGJlIGdpdmVuIHRvIENQQSB2aWEgT0lEX1NLR0VfVkNUX1NUQVRVUykuICovCisjZGVmaW5lIFNLX1BOTUlfVkNUX05PTkUJCTAKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfT0xEX1ZDVF9EQVRBCTEKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBCTIKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfT0xEX0RTUF9EQVRBCTQKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTkVXX0RTUF9EQVRBCTgKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfUlVOTklORwkJMTYKKworCisvKiBWQ1QgY2FibGUgdGVzdCBzdGF0dXMuICovCisjZGVmaW5lIFNLX1BOTUlfVkNUX05PUk1BTF9DQUJMRQkJMAorI2RlZmluZSBTS19QTk1JX1ZDVF9TSE9SVF9DQUJMRQkJCTEKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfT1BFTl9DQUJMRQkJCTIKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfVEVTVF9GQUlMCQkJMworI2RlZmluZSBTS19QTk1JX1ZDVF9JTVBFREFOQ0VfTUlTTUFUQ0gJCTQKKworI2RlZmluZQlPSURfU0tHRV9UUkFQX1NFTl9XQVJfTE9XCQk1MDAKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUF9TRU5fV0FSX1VQUAkJNTAxCisjZGVmaW5lCU9JRF9TS0dFX1RSQVBfU0VOX0VSUl9MT1cJCTUwMgorI2RlZmluZSBPSURfU0tHRV9UUkFQX1NFTl9FUlJfVVBQCQk1MDMKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUF9STE1UX0NIQU5HRV9USFJFUwk1MjAKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUF9STE1UX0NIQU5HRV9QT1JUCTUyMQorI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfUE9SVF9ET1dOCTUyMgorI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfUE9SVF9VUAkJNTIzCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfUkxNVF9TRUdNRU5UQVRJT04JNTI0CisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKy8qIERlZmluZXMgZm9yIGRyaXZlciBESUFHIG1vZGUuICovCisjZGVmaW5lIFNLX0RJQUdfQVRUQUNIRUQJMgorI2RlZmluZSBTS19ESUFHX1JVTk5JTkcJCTEKKyNkZWZpbmUgU0tfRElBR19JRExFCQkwCisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisKKy8qCisgKiBHZW5lcmljIFBOTUkgSU9DVEwgc3ViY29tbWFuZCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlTS19HRVRfU0lOR0xFX1ZBUgkJMQorI2RlZmluZQlTS19TRVRfU0lOR0xFX1ZBUgkJMgorI2RlZmluZQlTS19QUkVTRVRfU0lOR0xFX1ZBUgkzCisjZGVmaW5lCVNLX0dFVF9GVUxMX01JQgkJCTQKKyNkZWZpbmUJU0tfU0VUX0ZVTExfTUlCCQkJNQorI2RlZmluZQlTS19QUkVTRVRfRlVMTF9NSUIJCTYKKworCisvKgorICogRGVmaW5lIGVycm9yIG51bWJlcnMgYW5kIG1lc3NhZ2VzIGZvciBzeXNsb2cKKyAqLworI2RlZmluZSBTS19QTk1JX0VSUjAwMQkJKFNLX0VSUkJBU0VfUE5NSSArIDEpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAxTVNHCSJTa1BubWlHZXRTdHJ1Y3Q6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAwMgkJKFNLX0VSUkJBU0VfUE5NSSArIDIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAyTVNHCSJTa1BubWlHZXRTdHJ1Y3Q6IENhbm5vdCByZWFkIFZQRCBrZXlzIgorI2RlZmluZSBTS19QTk1JX0VSUjAwMwkJKFNLX0VSUkJBU0VfUE5NSSArIDMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAzTVNHCSJPaWRTdHJ1Y3Q6IENhbGxlZCB3aXRoIHdyb25nIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDQJCShTS19FUlJCQVNFX1BOTUkgKyA0KQorI2RlZmluZSBTS19QTk1JX0VSUjAwNE1TRwkiT2lkU3RydWN0OiBDYWxsZWQgd2l0aCB3cm9uZyBhY3Rpb24iCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA1CQkoU0tfRVJSQkFTRV9QTk1JICsgNSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDVNU0cJIlBlcmZvcm06IENhbm5vdCByZXNldCBkcml2ZXIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA2CQkoU0tfRVJSQkFTRV9QTk1JICsgNikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDZNU0cJIlBlcmZvcm06IFVua25vd24gT0lEIGFjdGlvbiBjb21tYW5kIgorI2RlZmluZSBTS19QTk1JX0VSUjAwNwkJKFNLX0VSUkJBU0VfUE5NSSArIDcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA3TVNHCSJHZW5lcmFsOiBEcml2ZXIgZGVzY3JpcHRpb24gbm90IGluaXRpYWxpemVkIgorI2RlZmluZSBTS19QTk1JX0VSUjAwOAkJKFNLX0VSUkJBU0VfUE5NSSArIDgpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA4TVNHCSJBZGRyOiBUcmllZCB0byBnZXQgdW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA5CQkoU0tfRVJSQkFTRV9QTk1JICsgOSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDlNU0cJIkFkZHI6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAxMAkJKFNLX0VSUkJBU0VfUE5NSSArIDEwKQorI2RlZmluZSBTS19QTk1JX0VSUjAxME1TRwkiQ3N1bVN0YXQ6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAxMQkJKFNLX0VSUkJBU0VfUE5NSSArIDExKQorI2RlZmluZSBTS19QTk1JX0VSUjAxMU1TRwkiU2Vuc29yU3RhdDogU2Vuc29yIGRlc2NyIHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMTIJCShTS19FUlJCQVNFX1BOTUkgKyAxMikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMTJNU0cJIlNlbnNvclN0YXQ6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAxMwkJKFNLX0VSUkJBU0VfUE5NSSArIDEzKQorI2RlZmluZSBTS19QTk1JX0VSUjAxM01TRwkiIgorI2RlZmluZSBTS19QTk1JX0VSUjAxNAkJKFNLX0VSUkJBU0VfUE5NSSArIDE0KQorI2RlZmluZSBTS19QTk1JX0VSUjAxNE1TRwkiVnBkOiBDYW5ub3QgcmVhZCBWUEQga2V5cyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMTUJCShTS19FUlJCQVNFX1BOTUkgKyAxNSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMTVNU0cJIlZwZDogSW50ZXJuYWwgYXJyYXkgZm9yIFZQRCBrZXlzIHRvIHNtYWxsIgorI2RlZmluZSBTS19QTk1JX0VSUjAxNgkJKFNLX0VSUkJBU0VfUE5NSSArIDE2KQorI2RlZmluZSBTS19QTk1JX0VSUjAxNk1TRwkiVnBkOiBLZXkgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAxNwkJKFNLX0VSUkJBU0VfUE5NSSArIDE3KQorI2RlZmluZSBTS19QTk1JX0VSUjAxN01TRwkiVnBkOiBJbnZhbGlkIFZQRCBzdGF0dXMgcG9pbnRlciIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMTgJCShTS19FUlJCQVNFX1BOTUkgKyAxOCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMThNU0cJIlZwZDogVlBEIGRhdGEgbm90IHZhbGlkIgorI2RlZmluZSBTS19QTk1JX0VSUjAxOQkJKFNLX0VSUkJBU0VfUE5NSSArIDE5KQorI2RlZmluZSBTS19QTk1JX0VSUjAxOU1TRwkiVnBkOiBWUEQgZW50cmllcyBsaXN0IHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjEJCShTS19FUlJCQVNFX1BOTUkgKyAyMSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjFNU0cJIlZwZDogVlBEIGRhdGEgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAyMgkJKFNLX0VSUkJBU0VfUE5NSSArIDIyKQorI2RlZmluZSBTS19QTk1JX0VSUjAyMk1TRwkiVnBkOiBWUEQgZGF0YSBzdHJpbmcgdG9vIGxvbmcgc2hvdWxkIGJlIGVycm9yZWQgYmVmb3JlIgorI2RlZmluZSBTS19QTk1JX0VSUjAyMwkJKFNLX0VSUkJBU0VfUE5NSSArIDIzKQorI2RlZmluZSBTS19QTk1JX0VSUjAyM01TRwkiVnBkOiBVbmtub3duIE9JRCBpbiBnZXQgYWN0aW9uIgorI2RlZmluZSBTS19QTk1JX0VSUjAyNAkJKFNLX0VSUkJBU0VfUE5NSSArIDI0KQorI2RlZmluZSBTS19QTk1JX0VSUjAyNE1TRwkiVnBkOiBVbmtub3duIE9JRCBpbiBwcmVzZXQvc2V0IGFjdGlvbiIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjUJCShTS19FUlJCQVNFX1BOTUkgKyAyNSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjVNU0cJIlZwZDogQ2Fubm90IHdyaXRlIFZQRCBhZnRlciBtb2RpZnkgZW50cnkiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI2CQkoU0tfRVJSQkFTRV9QTk1JICsgMjYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI2TVNHCSJWcGQ6IENhbm5vdCB1cGRhdGUgVlBEIgorI2RlZmluZSBTS19QTk1JX0VSUjAyNwkJKFNLX0VSUkJBU0VfUE5NSSArIDI3KQorI2RlZmluZSBTS19QTk1JX0VSUjAyN01TRwkiVnBkOiBDYW5ub3QgZGVsZXRlIFZQRCBlbnRyeSIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjgJCShTS19FUlJCQVNFX1BOTUkgKyAyOCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjhNU0cJIlZwZDogQ2Fubm90IHVwZGF0ZSBWUEQgYWZ0ZXIgZGVsZXRlIGVudHJ5IgorI2RlZmluZSBTS19QTk1JX0VSUjAyOQkJKFNLX0VSUkJBU0VfUE5NSSArIDI5KQorI2RlZmluZSBTS19QTk1JX0VSUjAyOU1TRwkiR2VuZXJhbDogRHJpdmVyIGRlc2NyaXB0aW9uIHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzAJCShTS19FUlJCQVNFX1BOTUkgKyAzMCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzBNU0cJIkdlbmVyYWw6IERyaXZlciB2ZXJzaW9uIG5vdCBpbml0aWFsaXplZCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzEJCShTS19FUlJCQVNFX1BOTUkgKyAzMSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzFNU0cJIkdlbmVyYWw6IERyaXZlciB2ZXJzaW9uIHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzIJCShTS19FUlJCQVNFX1BOTUkgKyAzMikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzJNU0cJIkdlbmVyYWw6IENhbm5vdCByZWFkIFZQRCBOYW1lIGZvciBIVyBkZXNjciIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzMJCShTS19FUlJCQVNFX1BOTUkgKyAzMykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzNNU0cJIkdlbmVyYWw6IEhXIGRlc2NyaXB0aW9uIHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzQJCShTS19FUlJCQVNFX1BOTUkgKyAzNCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzRNU0cJIkdlbmVyYWw6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAzNQkJKFNLX0VSUkJBU0VfUE5NSSArIDM1KQorI2RlZmluZSBTS19QTk1JX0VSUjAzNU1TRwkiUmxtdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM2CQkoU0tfRVJSQkFTRV9QTk1JICsgMzYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM2TVNHCSIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM3CQkoU0tfRVJSQkFTRV9QTk1JICsgMzcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM3TVNHCSJSbG10OiBTS19STE1UX01PREVfQ0hBTkdFIGV2ZW50IHJldHVybiBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzgJCShTS19FUlJCQVNFX1BOTUkgKyAzOCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzhNU0cJIlJsbXQ6IFNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFIGV2ZW50IHJldHVybiBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzkJCShTS19FUlJCQVNFX1BOTUkgKyAzOSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzlNU0cJIlJsbXRTdGF0OiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDAJCShTS19FUlJCQVNFX1BOTUkgKyA0MCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDBNU0cJIlBvd2VyTWFuYWdlbWVudDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQxCQkoU0tfRVJSQkFTRV9QTk1JICsgNDEpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQxTVNHCSJNYWNQcml2YXRlQ29uZjogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQyCQkoU0tfRVJSQkFTRV9QTk1JICsgNDIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQyTVNHCSJNYWNQcml2YXRlQ29uZjogU0tfSFdFVl9TRVRfUk9MRSByZXR1cm5lZCBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDMJCShTS19FUlJCQVNFX1BOTUkgKyA0MykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDNNU0cJIk1hY1ByaXZhdGVDb25mOiBTS19IV0VWX1NFVF9MTU9ERSByZXR1cm5lZCBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDQJCShTS19FUlJCQVNFX1BOTUkgKyA0NCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDRNU0cJIk1hY1ByaXZhdGVDb25mOiBTS19IV0VWX1NFVF9GTE9XTU9ERSByZXR1cm5lZCBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDUJCShTS19FUlJCQVNFX1BOTUkgKyA0NSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDVNU0cJIk1hY1ByaXZhdGVDb25mOiBTS19IV0VWX1NFVF9TUEVFRCByZXR1cm5lZCBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDYJCShTS19FUlJCQVNFX1BOTUkgKyA0NikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDZNU0cJIk1vbml0b3I6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NwkJKFNLX0VSUkJBU0VfUE5NSSArIDQ3KQorI2RlZmluZSBTS19QTk1JX0VSUjA0N01TRwkiU2lycVVwZGF0ZTogRXZlbnQgZnVuY3Rpb24gcmV0dXJucyBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDgJCShTS19FUlJCQVNFX1BOTUkgKyA0OCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDhNU0cJIlJsbXRVcGRhdGU6IEV2ZW50IGZ1bmN0aW9uIHJldHVybnMgbm90IDAiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ5CQkoU0tfRVJSQkFTRV9QTk1JICsgNDkpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ5TVNHCSJTa1BubWlJbml0OiBJbnZhbGlkIHNpemUgb2YgJ0NvdW50ZXJPZmZzZXQnIHN0cnVjdCEhIgorI2RlZmluZSBTS19QTk1JX0VSUjA1MAkJKFNLX0VSUkJBU0VfUE5NSSArIDUwKQorI2RlZmluZSBTS19QTk1JX0VSUjA1ME1TRwkiU2tQbm1pSW5pdDogSW52YWxpZCBzaXplIG9mICdTdGF0QWRkcicgdGFibGUhISIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTEJCShTS19FUlJCQVNFX1BOTUkgKyA1MSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTFNU0cJIlNrUG5taUV2ZW50OiBQb3J0IHN3aXRjaCBzdXNwaWNpb3VzIgorI2RlZmluZSBTS19QTk1JX0VSUjA1MgkJKFNLX0VSUkJBU0VfUE5NSSArIDUyKQorI2RlZmluZSBTS19QTk1JX0VSUjA1Mk1TRwkiIgorI2RlZmluZSBTS19QTk1JX0VSUjA1MwkJKFNLX0VSUkJBU0VfUE5NSSArIDUzKQorI2RlZmluZSBTS19QTk1JX0VSUjA1M01TRwkiR2VuZXJhbDogRHJpdmVyIHJlbGVhc2UgZGF0ZSBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU0CQkoU0tfRVJSQkFTRV9QTk1JICsgNTQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU0TVNHCSJHZW5lcmFsOiBEcml2ZXIgcmVsZWFzZSBkYXRlIHN0cmluZyB0b28gbG9uZyIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTUJCShTS19FUlJCQVNFX1BOTUkgKyA1NSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTVNU0cJIkdlbmVyYWw6IERyaXZlciBmaWxlIG5hbWUgbm90IGluaXRpYWxpemVkIgorI2RlZmluZSBTS19QTk1JX0VSUjA1NgkJKFNLX0VSUkJBU0VfUE5NSSArIDU2KQorI2RlZmluZSBTS19QTk1JX0VSUjA1Nk1TRwkiR2VuZXJhbDogRHJpdmVyIGZpbGUgbmFtZSBzdHJpbmcgdG9vIGxvbmciCisKKy8qCisgKiBNYW5hZ2VtZW50IGNvdW50ZXIgbWFjcm9zIGNhbGxlZCBieSB0aGUgZHJpdmVyCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9TRVRfRFJJVkVSX0RFU0NSKHBBQyx2KQkoKHBBQyktPlBubWkucERyaXZlckRlc2NyaXB0aW9uID0gXAorCShjaGFyICopKHYpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX0RSSVZFUl9WRVIocEFDLHYpCSgocEFDKS0+UG5taS5wRHJpdmVyVmVyc2lvbiA9IFwKKwkoY2hhciAqKSh2KSkKKworI2RlZmluZSBTS19QTk1JX1NFVF9EUklWRVJfUkVMREFURShwQUMsdikJKChwQUMpLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSA9IFwKKwkoY2hhciAqKSh2KSkKKworI2RlZmluZSBTS19QTk1JX1NFVF9EUklWRVJfRklMRU5BTUUocEFDLHYpCSgocEFDKS0+UG5taS5wRHJpdmVyRmlsZU5hbWUgPSBcCisJKGNoYXIgKikodikpCisKKyNkZWZpbmUgU0tfUE5NSV9DTlRfVFhfUVVFVUVfTEVOKHBBQyx2LHApIFwKKwl7IFwKKwkJKHBBQyktPlBubWkuUG9ydFtwXS5UeFN3UXVldWVMZW4gPSAoU0tfVTY0KSh2KTsgXAorCQlpZiAoKHBBQyktPlBubWkuUG9ydFtwXS5UeFN3UXVldWVMZW4gPiAocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZU1heCkgeyBcCisJCQkocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZU1heCA9IChwQUMpLT5Qbm1pLlBvcnRbcF0uVHhTd1F1ZXVlTGVuOyBcCisJCX0gXAorCX0KKyNkZWZpbmUgU0tfUE5NSV9DTlRfVFhfUkVUUlkocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5UeFJldHJ5Q3RzKSsrKQorI2RlZmluZSBTS19QTk1JX0NOVF9SWF9JTlRSKHBBQyxwKQkoKChwQUMpLT5Qbm1pLlBvcnRbcF0uUnhJbnRyQ3RzKSsrKQorI2RlZmluZSBTS19QTk1JX0NOVF9UWF9JTlRSKHBBQyxwKQkoKChwQUMpLT5Qbm1pLlBvcnRbcF0uVHhJbnRyQ3RzKSsrKQorI2RlZmluZSBTS19QTk1JX0NOVF9OT19SWF9CVUYocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5SeE5vQnVmQ3RzKSsrKQorI2RlZmluZSBTS19QTk1JX0NOVF9OT19UWF9CVUYocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5UeE5vQnVmQ3RzKSsrKQorI2RlZmluZSBTS19QTk1JX0NOVF9VU0VEX1RYX0RFU0NSKHBBQyx2LHApIFwKKwkoKHBBQyktPlBubWkuUG9ydFtwXS5UeFVzZWREZXNjck5vPShTS19VNjQpKHYpKTsKKyNkZWZpbmUgU0tfUE5NSV9DTlRfUlhfT0NURVRTX0RFTElWRVJFRChwQUMsdixwKSBcCisJeyBcCisJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlJ4RGVsaXZlcmVkQ3RzKSsrOyBcCisJCShwQUMpLT5Qbm1pLlBvcnRbcF0uUnhPY3RldHNEZWxpdmVyZWRDdHMgKz0gKFNLX1U2NCkodik7IFwKKwl9CisjZGVmaW5lIFNLX1BOTUlfQ05UX0VSUl9SRUNPVkVSWShwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLkVyclJlY292ZXJ5Q3RzKSsrKTsKKworI2RlZmluZSBTS19QTk1JX0NOVF9TWU5DX09DVEVUUyhwQUMscCx2KSBcCisJeyBcCisJCWlmICgocCkgPCBTS19NQVhfTUFDUykgeyBcCisJCQkoKHBBQyktPlBubWkuUG9ydFtwXS5TdGF0U3luY0N0cykrKzsgXAorCQkJKHBBQyktPlBubWkuUG9ydFtwXS5TdGF0U3luY09jdGV0c0N0cyArPSAoU0tfVTY0KSh2KTsgXAorCQl9IFwKKwl9CisKKyNkZWZpbmUgU0tfUE5NSV9DTlRfUlhfTE9OR0ZSQU1FUyhwQUMscCkgXAorCXsgXAorCQlpZiAoKHApIDwgU0tfTUFYX01BQ1MpIHsgXAorCQkJKChwQUMpLT5Qbm1pLlBvcnRbcF0uU3RhdFJ4TG9uZ0ZyYW1lQ3RzKyspOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9GUkFNRVRPT0xPTkcocEFDLHApIFwKKwl7IFwKKwkJaWYgKChwKSA8IFNLX01BWF9NQUNTKSB7IFwKKwkJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRSeEZyYW1lVG9vTG9uZ0N0cysrKTsgXAorCQl9IFwKKwl9CisKKyNkZWZpbmUgU0tfUE5NSV9DTlRfUlhfUE1BQ0NfRVJSKHBBQyxwKSBcCisJeyBcCisJCWlmICgocCkgPCBTS19NQVhfTUFDUykgeyBcCisJCQkoKHBBQyktPlBubWkuUG9ydFtwXS5TdGF0UnhQTWFjY0VycisrKTsgXAorCQl9IFwKKwl9CisKKy8qCisgKiBDb252ZXJzaW9uIE1hY3JvcworICovCisjZGVmaW5lIFNLX1BOTUlfUE9SVF9JTlNUMkxPRyhpKQkoKHVuc2lnbmVkIGludCkoaSkgLSAxKQorI2RlZmluZSBTS19QTk1JX1BPUlRfTE9HMklOU1QobCkJKCh1bnNpZ25lZCBpbnQpKGwpICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX1BIWVMyTE9HKHApCSgodW5zaWduZWQgaW50KShwKSArIDEpCisjZGVmaW5lIFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsbCkJKCh1bnNpZ25lZCBpbnQpKGwpIC0gMSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX1BIWVMySU5TVChwQUMscCkJXAorCShwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPyAyIDogKCh1bnNpZ25lZCBpbnQpKHApICsgMikpCisjZGVmaW5lIFNLX1BOTUlfUE9SVF9JTlNUMlBIWVMocEFDLGkpCSgodW5zaWduZWQgaW50KShpKSAtIDIpCisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgU2tQbm1pR2V0U3RydWN0IGFuZCBTa1BubWlTZXRTdHJ1Y3QKKyAqLworI2RlZmluZSBTS19QTk1JX1ZQRF9LRVlfU0laRQk1CisjZGVmaW5lIFNLX1BOTUlfVlBEX0JVRlNJWkUJCShWUERfU0laRSkKKyNkZWZpbmUgU0tfUE5NSV9WUERfRU5UUklFUwkJKFZQRF9TSVpFIC8gNCkKKyNkZWZpbmUgU0tfUE5NSV9WUERfREFUQUxFTgkJMTI4IC8qICBOdW1iZXIgb2YgZGF0YSBieXRlcyAqLworCisjZGVmaW5lIFNLX1BOTUlfTVVMVElDQVNUX0xJU1RMRU4JNjQKKyNkZWZpbmUgU0tfUE5NSV9TRU5TT1JfRU5UUklFUwkJKFNLX01BWF9TRU5TT1JTKQorI2RlZmluZSBTS19QTk1JX0NIRUNLU1VNX0VOVFJJRVMJMworI2RlZmluZSBTS19QTk1JX01BQ19FTlRSSUVTCQkJKFNLX01BWF9NQUNTICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9NT05JVE9SX0VOVFJJRVMJCTIwCisjZGVmaW5lIFNLX1BOTUlfVFJBUF9FTlRSSUVTCQkxMAorI2RlZmluZSBTS19QTk1JX1RSQVBMRU4JCQkJMTI4CisjZGVmaW5lIFNLX1BOTUlfU1RSSU5HTEVOMQkJCTgwCisjZGVmaW5lIFNLX1BOTUlfU1RSSU5HTEVOMgkJCTI1CisjZGVmaW5lIFNLX1BOTUlfVFJBUF9RVUVVRV9MRU4JCTUxMgorCit0eXBlZGVmIHN0cnVjdCBzX1BubWlWcGQgeworCWNoYXIJCQlWcGRLZXlbU0tfUE5NSV9WUERfS0VZX1NJWkVdOworCWNoYXIJCQlWcGRWYWx1ZVtTS19QTk1JX1ZQRF9EQVRBTEVOXTsKKwlTS19VOAkJCVZwZEFjY2VzczsKKwlTS19VOAkJCVZwZEFjdGlvbjsKK30gU0tfUE5NSV9WUEQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVNlbnNvciB7CisJU0tfVTgJCQlTZW5zb3JJbmRleDsKKwljaGFyCQkJU2Vuc29yRGVzY3JbU0tfUE5NSV9TVFJJTkdMRU4yXTsKKwlTS19VOAkJCVNlbnNvclR5cGU7CisJU0tfVTMyCQkJU2Vuc29yVmFsdWU7CisJU0tfVTMyCQkJU2Vuc29yV2FybmluZ1RocmVzaG9sZExvdzsKKwlTS19VMzIJCQlTZW5zb3JXYXJuaW5nVGhyZXNob2xkSGlnaDsKKwlTS19VMzIJCQlTZW5zb3JFcnJvclRocmVzaG9sZExvdzsKKwlTS19VMzIJCQlTZW5zb3JFcnJvclRocmVzaG9sZEhpZ2g7CisJU0tfVTgJCQlTZW5zb3JTdGF0dXM7CisJU0tfVTY0CQkJU2Vuc29yV2FybmluZ0N0czsKKwlTS19VNjQJCQlTZW5zb3JFcnJvckN0czsKKwlTS19VNjQJCQlTZW5zb3JXYXJuaW5nVGltZXN0YW1wOworCVNLX1U2NAkJCVNlbnNvckVycm9yVGltZXN0YW1wOworfSBTS19QTk1JX1NFTlNPUjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pQ2hlY2tzdW0geworCVNLX1U2NAkJCUNoZWNrc3VtUnhPa0N0czsKKwlTS19VNjQJCQlDaGVja3N1bVJ4VW5hYmxlQ3RzOworCVNLX1U2NAkJCUNoZWNrc3VtUnhFcnJDdHM7CisJU0tfVTY0CQkJQ2hlY2tzdW1UeE9rQ3RzOworCVNLX1U2NAkJCUNoZWNrc3VtVHhVbmFibGVDdHM7Cit9IFNLX1BOTUlfQ0hFQ0tTVU07CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVN0YXQgeworCVNLX1U2NAkJCVN0YXRUeE9rQ3RzOworCVNLX1U2NAkJCVN0YXRUeE9jdGV0c09rQ3RzOworCVNLX1U2NAkJCVN0YXRUeEJyb2FkY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRUeE11bHRpY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRUeFVuaWNhc3RPa0N0czsKKwlTS19VNjQJCQlTdGF0VHhMb25nRnJhbWVzQ3RzOworCVNLX1U2NAkJCVN0YXRUeEJ1cnN0Q3RzOworCVNLX1U2NAkJCVN0YXRUeFBhdXNlTWFjQ3RybEN0czsKKwlTS19VNjQJCQlTdGF0VHhNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0czsKKwlTS19VNjQJCQlTdGF0VHhNdWx0aXBsZUNvbGxpc2lvbkN0czsKKwlTS19VNjQJCQlTdGF0VHhFeGNlc3NpdmVDb2xsaXNpb25DdHM7CisJU0tfVTY0CQkJU3RhdFR4TGF0ZUNvbGxpc2lvbkN0czsKKwlTS19VNjQJCQlTdGF0VHhEZWZlcnJhbEN0czsKKwlTS19VNjQJCQlTdGF0VHhFeGNlc3NpdmVEZWZlcnJhbEN0czsKKwlTS19VNjQJCQlTdGF0VHhGaWZvVW5kZXJydW5DdHM7CisJU0tfVTY0CQkJU3RhdFR4Q2FycmllckN0czsKKwlTS19VNjQJCQlEdW1teTE7IC8qIFN0YXRUeFV0aWxpemF0aW9uICovCisJU0tfVTY0CQkJU3RhdFR4NjRDdHM7CisJU0tfVTY0CQkJU3RhdFR4MTI3Q3RzOworCVNLX1U2NAkJCVN0YXRUeDI1NUN0czsKKwlTS19VNjQJCQlTdGF0VHg1MTFDdHM7CisJU0tfVTY0CQkJU3RhdFR4MTAyM0N0czsKKwlTS19VNjQJCQlTdGF0VHhNYXhDdHM7CisJU0tfVTY0CQkJU3RhdFR4U3luY0N0czsKKwlTS19VNjQJCQlTdGF0VHhTeW5jT2N0ZXRzQ3RzOworCVNLX1U2NAkJCVN0YXRSeE9rQ3RzOworCVNLX1U2NAkJCVN0YXRSeE9jdGV0c09rQ3RzOworCVNLX1U2NAkJCVN0YXRSeEJyb2FkY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRSeE11bHRpY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRSeFVuaWNhc3RPa0N0czsKKwlTS19VNjQJCQlTdGF0UnhMb25nRnJhbWVzQ3RzOworCVNLX1U2NAkJCVN0YXRSeFBhdXNlTWFjQ3RybEN0czsKKwlTS19VNjQJCQlTdGF0UnhNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRSeFBhdXNlTWFjQ3RybEVycm9yQ3RzOworCVNLX1U2NAkJCVN0YXRSeE1hY0N0cmxVbmtub3duQ3RzOworCVNLX1U2NAkJCVN0YXRSeEJ1cnN0Q3RzOworCVNLX1U2NAkJCVN0YXRSeE1pc3NlZEN0czsKKwlTS19VNjQJCQlTdGF0UnhGcmFtaW5nQ3RzOworCVNLX1U2NAkJCVN0YXRSeEZpZm9PdmVyZmxvd0N0czsKKwlTS19VNjQJCQlTdGF0UnhKYWJiZXJDdHM7CisJU0tfVTY0CQkJU3RhdFJ4Q2FycmllckN0czsKKwlTS19VNjQJCQlTdGF0UnhJUkxlbmd0aEN0czsKKwlTS19VNjQJCQlTdGF0UnhTeW1ib2xDdHM7CisJU0tfVTY0CQkJU3RhdFJ4U2hvcnRzQ3RzOworCVNLX1U2NAkJCVN0YXRSeFJ1bnRDdHM7CisJU0tfVTY0CQkJU3RhdFJ4Q2V4dEN0czsKKwlTS19VNjQJCQlTdGF0UnhUb29Mb25nQ3RzOworCVNLX1U2NAkJCVN0YXRSeEZjc0N0czsKKwlTS19VNjQJCQlEdW1teTI7IC8qIFN0YXRSeFV0aWxpemF0aW9uICovCisJU0tfVTY0CQkJU3RhdFJ4NjRDdHM7CisJU0tfVTY0CQkJU3RhdFJ4MTI3Q3RzOworCVNLX1U2NAkJCVN0YXRSeDI1NUN0czsKKwlTS19VNjQJCQlTdGF0Ung1MTFDdHM7CisJU0tfVTY0CQkJU3RhdFJ4MTAyM0N0czsKKwlTS19VNjQJCQlTdGF0UnhNYXhDdHM7Cit9IFNLX1BOTUlfU1RBVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pQ29uZiB7CisJY2hhcgkJCUNvbmZNYWNDdXJyZW50QWRkcls2XTsKKwljaGFyCQkJQ29uZk1hY0ZhY3RvcnlBZGRyWzZdOworCVNLX1U4CQkJQ29uZlBNRDsKKwlTS19VOAkJCUNvbmZDb25uZWN0b3I7CisJU0tfVTMyCQkJQ29uZlBoeVR5cGU7CisJU0tfVTMyCQkJQ29uZlBoeU1vZGU7CisJU0tfVTgJCQlDb25mTGlua0NhcGFiaWxpdHk7CisJU0tfVTgJCQlDb25mTGlua01vZGU7CisJU0tfVTgJCQlDb25mTGlua01vZGVTdGF0dXM7CisJU0tfVTgJCQlDb25mTGlua1N0YXR1czsKKwlTS19VOAkJCUNvbmZGbG93Q3RybENhcGFiaWxpdHk7CisJU0tfVTgJCQlDb25mRmxvd0N0cmxNb2RlOworCVNLX1U4CQkJQ29uZkZsb3dDdHJsU3RhdHVzOworCVNLX1U4CQkJQ29uZlBoeU9wZXJhdGlvbkNhcGFiaWxpdHk7CisJU0tfVTgJCQlDb25mUGh5T3BlcmF0aW9uTW9kZTsKKwlTS19VOAkJCUNvbmZQaHlPcGVyYXRpb25TdGF0dXM7CisJU0tfVTgJCQlDb25mU3BlZWRDYXBhYmlsaXR5OworCVNLX1U4CQkJQ29uZlNwZWVkTW9kZTsKKwlTS19VOAkJCUNvbmZTcGVlZFN0YXR1czsKK30gU0tfUE5NSV9DT05GOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlSbG10IHsKKwlTS19VMzIJCQlSbG10SW5kZXg7CisJU0tfVTMyCQkJUmxtdFN0YXR1czsKKwlTS19VNjQJCQlSbG10VHhIZWxsb0N0czsKKwlTS19VNjQJCQlSbG10UnhIZWxsb0N0czsKKwlTS19VNjQJCQlSbG10VHhTcEhlbGxvUmVxQ3RzOworCVNLX1U2NAkJCVJsbXRSeFNwSGVsbG9DdHM7Cit9IFNLX1BOTUlfUkxNVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pUmxtdE1vbml0b3IgeworCVNLX1UzMgkJCVJsbXRNb25pdG9ySW5kZXg7CisJY2hhcgkJCVJsbXRNb25pdG9yQWRkcls2XTsKKwlTS19VNjQJCQlSbG10TW9uaXRvckVycm9yQ3RzOworCVNLX1U2NAkJCVJsbXRNb25pdG9yVGltZXN0YW1wOworCVNLX1U4CQkJUmxtdE1vbml0b3JBZG1pbjsKK30gU0tfUE5NSV9STE1UX01PTklUT1I7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVJlcXVlc3RTdGF0dXMgeworCVNLX1UzMgkJCUVycm9yU3RhdHVzOworCVNLX1UzMgkJCUVycm9yT2Zmc2V0OworfSBTS19QTk1JX1JFUVVFU1RfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlTdHJ1Y0RhdGEgeworCVNLX1UzMgkJCU1nbXREQlZlcnNpb247CisJU0tfUE5NSV9SRVFVRVNUX1NUQVRVUwlSZXR1cm5TdGF0dXM7CisJU0tfVTMyCQkJVnBkRnJlZUJ5dGVzOworCWNoYXIJCQlWcGRFbnRyaWVzTGlzdFtTS19QTk1JX1ZQRF9FTlRSSUVTICogU0tfUE5NSV9WUERfS0VZX1NJWkVdOworCVNLX1UzMgkJCVZwZEVudHJpZXNOdW1iZXI7CisJU0tfUE5NSV9WUEQJCVZwZFtTS19QTk1JX1ZQRF9FTlRSSUVTXTsKKwlTS19VMzIJCQlQb3J0TnVtYmVyOworCVNLX1UzMgkJCURldmljZVR5cGU7CisJY2hhcgkJCURyaXZlckRlc2NyW1NLX1BOTUlfU1RSSU5HTEVOMV07CisJY2hhcgkJCURyaXZlclZlcnNpb25bU0tfUE5NSV9TVFJJTkdMRU4yXTsKKwljaGFyCQkJRHJpdmVyUmVsZWFzZURhdGVbU0tfUE5NSV9TVFJJTkdMRU4xXTsKKwljaGFyCQkJRHJpdmVyRmlsZU5hbWVbU0tfUE5NSV9TVFJJTkdMRU4xXTsKKwljaGFyCQkJSHdEZXNjcltTS19QTk1JX1NUUklOR0xFTjFdOworCWNoYXIJCQlId1ZlcnNpb25bU0tfUE5NSV9TVFJJTkdMRU4yXTsKKwlTS19VMTYJCQlDaGlwc2V0OworCVNLX1UzMgkJCUNoaXBJZDsKKwlTS19VOAkJCVZhdXhBdmFpbDsKKwlTS19VMzIJCQlSYW1TaXplOworCVNLX1UzMgkJCU10dVNpemU7CisJU0tfVTMyCQkJQWN0aW9uOworCVNLX1UzMgkJCVRlc3RSZXN1bHQ7CisJU0tfVTgJCQlCdXNUeXBlOworCVNLX1U4CQkJQnVzU3BlZWQ7CisJU0tfVTgJCQlCdXNXaWR0aDsKKwlTS19VOAkJCVNlbnNvck51bWJlcjsKKwlTS19QTk1JX1NFTlNPUglTZW5zb3JbU0tfUE5NSV9TRU5TT1JfRU5UUklFU107CisJU0tfVTgJCQlDaGVja3N1bU51bWJlcjsKKwlTS19QTk1JX0NIRUNLU1VNCUNoZWNrc3VtW1NLX1BOTUlfQ0hFQ0tTVU1fRU5UUklFU107CisJU0tfUE5NSV9TVEFUCVN0YXRbU0tfUE5NSV9NQUNfRU5UUklFU107CisJU0tfUE5NSV9DT05GCUNvbmZbU0tfUE5NSV9NQUNfRU5UUklFU107CisJU0tfVTgJCQlSbG10TW9kZTsKKwlTS19VMzIJCQlSbG10UG9ydE51bWJlcjsKKwlTS19VOAkJCVJsbXRQb3J0QWN0aXZlOworCVNLX1U4CQkJUmxtdFBvcnRQcmVmZXJyZWQ7CisJU0tfVTY0CQkJUmxtdENoYW5nZUN0czsKKwlTS19VNjQJCQlSbG10Q2hhbmdlVGltZTsKKwlTS19VNjQJCQlSbG10Q2hhbmdlRXN0aW1hdGU7CisJU0tfVTY0CQkJUmxtdENoYW5nZVRocmVzaG9sZDsKKwlTS19QTk1JX1JMTVQJUmxtdFtTS19NQVhfTUFDU107CisJU0tfVTMyCQkJUmxtdE1vbml0b3JOdW1iZXI7CisJU0tfUE5NSV9STE1UX01PTklUT1IJUmxtdE1vbml0b3JbU0tfUE5NSV9NT05JVE9SX0VOVFJJRVNdOworCVNLX1UzMgkJCVRyYXBOdW1iZXI7CisJU0tfVTgJCQlUcmFwW1NLX1BOTUlfVFJBUF9RVUVVRV9MRU5dOworCVNLX1U2NAkJCVR4U3dRdWV1ZUxlbjsKKwlTS19VNjQJCQlUeFN3UXVldWVNYXg7CisJU0tfVTY0CQkJVHhSZXRyeUN0czsKKwlTS19VNjQJCQlSeEludHJDdHM7CisJU0tfVTY0CQkJVHhJbnRyQ3RzOworCVNLX1U2NAkJCVJ4Tm9CdWZDdHM7CisJU0tfVTY0CQkJVHhOb0J1ZkN0czsKKwlTS19VNjQJCQlUeFVzZWREZXNjck5vOworCVNLX1U2NAkJCVJ4RGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4SHdFcnJvcnNDdHM7CisJU0tfVTY0CQkJVHhId0Vycm9yc0N0czsKKwlTS19VNjQJCQlJbkVycm9yc0N0czsKKwlTS19VNjQJCQlPdXRFcnJvcnNDdHM7CisJU0tfVTY0CQkJRXJyUmVjb3ZlcnlDdHM7CisJU0tfVTY0CQkJU3lzVXBUaW1lOworfSBTS19QTk1JX1NUUlVDVF9EQVRBOworCisjZGVmaW5lIFNLX1BOTUlfU1RSVUNUX1NJWkUJKHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSkKKyNkZWZpbmUgU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUJKCh1bnNpZ25lZCBpbnQpKFNLX1VQVFIpXAorCQkJCSAmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT5WcGRGcmVlQnl0ZXMpKQorCQkJCQkJCQkJCQkJCQkvKgorCQkJCQkJCQkJCQkJCQkgKiBSZXR1cm5TdGF0dXMgZmllbGQKKwkJCQkJCQkJCQkJCQkJICogbXVzdCBiZSBsb2NhdGVkCisJCQkJCQkJCQkJCQkJCSAqIGJlZm9yZSBWcGRGcmVlQnl0ZXMKKwkJCQkJCQkJCQkJCQkJICovCisKKy8qCisgKiBWYXJpb3VzIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9NQVhfUFJPVE9TCQkzCisKKyNkZWZpbmUgU0tfUE5NSV9DTlRfTk8JCQk2NgkvKiBNdXN0IGhhdmUgdGhlIHZhbHVlIG9mIHRoZSBlbnVtCisJCQkJCQkJCQkgKiBTS19QTk1JX01BWF9JRFguIERlZmluZSBTS19QTk1JX0NIRUNLCisJCQkJCQkJCQkgKiBmb3IgY2hlY2sgd2hpbGUgaW5pdCBwaGFzZSAxCisJCQkJCQkJCQkgKi8KKworLyoKKyAqIEVzdGltYXRlIGRhdGEgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfUG5taUVzdGltYXRlIHsKKwl1bnNpZ25lZCBpbnQJRXN0VmFsdWVJbmRleDsKKwlTS19VNjQJCQlFc3RWYWx1ZVs3XTsKKwlTS19VNjQJCQlFc3RpbWF0ZTsKKwlTS19USU1FUgkJRXN0VGltZXI7Cit9IFNLX1BOTUlfRVNUSU1BVEU7CisKKworLyoKKyAqIFZDVCB0aW1lciBkYXRhIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBzX1ZjdFRpbWVyIHsKKwlTS19USU1FUgkJVmN0VGltZXI7Cit9IFNLX1BOTUlfVkNUX1RJTUVSOworCisKKy8qCisgKiBQTk1JIHNwZWNpZmljIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pUG9ydCB7CisJU0tfVTY0CQkJU3RhdFN5bmNDdHM7CisJU0tfVTY0CQkJU3RhdFN5bmNPY3RldHNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TG9uZ0ZyYW1lQ3RzOworCVNLX1U2NAkJCVN0YXRSeEZyYW1lVG9vTG9uZ0N0czsKKwlTS19VNjQJCQlTdGF0UnhQTWFjY0VycjsKKwlTS19VNjQJCQlUeFN3UXVldWVMZW47CisJU0tfVTY0CQkJVHhTd1F1ZXVlTWF4OworCVNLX1U2NAkJCVR4UmV0cnlDdHM7CisJU0tfVTY0CQkJUnhJbnRyQ3RzOworCVNLX1U2NAkJCVR4SW50ckN0czsKKwlTS19VNjQJCQlSeE5vQnVmQ3RzOworCVNLX1U2NAkJCVR4Tm9CdWZDdHM7CisJU0tfVTY0CQkJVHhVc2VkRGVzY3JObzsKKwlTS19VNjQJCQlSeERlbGl2ZXJlZEN0czsKKwlTS19VNjQJCQlSeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwlTS19VNjQJCQlSeEh3RXJyb3JzQ3RzOworCVNLX1U2NAkJCVR4SHdFcnJvcnNDdHM7CisJU0tfVTY0CQkJSW5FcnJvcnNDdHM7CisJU0tfVTY0CQkJT3V0RXJyb3JzQ3RzOworCVNLX1U2NAkJCUVyclJlY292ZXJ5Q3RzOworCVNLX1U2NAkJCVJ4U2hvcnRaZXJvTWFyazsKKwlTS19VNjQJCQlDb3VudGVyT2Zmc2V0W1NLX1BOTUlfQ05UX05PXTsKKwlTS19VMzIJCQlDb3VudGVySGlnaFtTS19QTk1JX0NOVF9OT107CisJU0tfQk9PTAkJCUFjdGl2ZUZsYWc7CisJU0tfVTgJCQlBbGlnblszXTsKK30gU0tfUE5NSV9QT1JUOworCisKK3R5cGVkZWYgc3RydWN0IHNfUG5taURhdGEgeworCVNLX1BOTUlfUE9SVAlQb3J0CVtTS19NQVhfTUFDU107CisJU0tfUE5NSV9QT1JUCUJ1ZlBvcnQJW1NLX01BWF9NQUNTXTsgLyogMjAwMi0wOS0xMyBwd2ViZXIgICovCisJU0tfVTY0CQkJVmlydHVhbENvdW50ZXJPZmZzZXRbU0tfUE5NSV9DTlRfTk9dOworCVNLX1UzMgkJCVRlc3RSZXN1bHQ7CisJY2hhcgkJCUh3VmVyc2lvblsxMF07CisJU0tfVTE2CQkJQWxpZ24wMTsKKworCWNoYXIJCQkqcERyaXZlckRlc2NyaXB0aW9uOworCWNoYXIJCQkqcERyaXZlclZlcnNpb247CisJY2hhcgkJCSpwRHJpdmVyUmVsZWFzZURhdGU7CisJY2hhcgkJCSpwRHJpdmVyRmlsZU5hbWU7CisKKwlpbnQJCQkJTWFjVXBkYXRlZEZsYWc7CisJaW50CQkJCVJsbXRVcGRhdGVkRmxhZzsKKwlpbnQJCQkJU2lycVVwZGF0ZWRGbGFnOworCisJU0tfVTY0CQkJUmxtdENoYW5nZUN0czsKKwlTS19VNjQJCQlSbG10Q2hhbmdlVGltZTsKKwlTS19QTk1JX0VTVElNQVRFCVJsbXRDaGFuZ2VFc3RpbWF0ZTsKKwlTS19VNjQJCQlSbG10Q2hhbmdlVGhyZXNob2xkOworCisJU0tfVTY0CQkJU3RhcnRVcFRpbWU7CisJU0tfVTMyCQkJRGV2aWNlVHlwZTsKKwljaGFyCQkJUGNpQnVzU3BlZWQ7CisJY2hhcgkJCVBjaUJ1c1dpZHRoOworCWNoYXIJCQlDaGlwc2V0OworCWNoYXIJCQlQTUQ7CisJY2hhcgkJCUNvbm5lY3RvcjsKKwlTS19CT09MCQkJRHVhbE5ldEFjdGl2ZUZsYWc7CisJU0tfVTE2CQkJQWxpZ24wMjsKKworCWNoYXIJCQlUcmFwQnVmW1NLX1BOTUlfVFJBUF9RVUVVRV9MRU5dOworCXVuc2lnbmVkIGludAlUcmFwQnVmRnJlZTsKKwl1bnNpZ25lZCBpbnQJVHJhcFF1ZXVlQmVnOworCXVuc2lnbmVkIGludAlUcmFwUXVldWVFbmQ7CisJdW5zaWduZWQgaW50CVRyYXBCdWZQYWQ7CisJdW5zaWduZWQgaW50CVRyYXBVbmlxdWU7CisJU0tfVTgJCVZjdFN0YXR1c1tTS19NQVhfTUFDU107CisJU0tfUE5NSV9WQ1QJVmN0QmFja3VwW1NLX01BWF9NQUNTXTsKKwlTS19QTk1JX1ZDVF9USU1FUiBWY3RUaW1lb3V0W1NLX01BWF9NQUNTXTsKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwlTS19VMzIJCQlEaWFnQXR0YWNoZWQ7CisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCit9IFNLX1BOTUk7CisKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworZXh0ZXJuIGludCBTa1BubWlJbml0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBMZXZlbCk7CitleHRlcm4gaW50IFNrUG5taUdldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIHZvaWQqIHBCdWYsCisJdW5zaWduZWQgaW50KiBwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taVByZVNldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsCisJdm9pZCogcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taVNldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIHZvaWQqIHBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taUdldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkKiBwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pUHJlU2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQqIHBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworZXh0ZXJuIGludCBTa1BubWlTZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taUV2ZW50KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBFdmVudCwKKwlTS19FVlBBUkEgUGFyYW0pOworZXh0ZXJuIGludCBTa1BubWlHZW5Jb2N0bChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkICogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKiBwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlc2lycS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VzaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4NmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlc2lycS5oCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZXNpcnEuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zMCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNy8wNCAxMjozNDoxMyAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBHaWdhYml0IEV0aGVybmV0IHNwZWNpYWwgSVJRIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JTkNfU0tHRVNJUlFfSF8KKyNkZWZpbmUgX0lOQ19TS0dFU0lSUV9IXworCisvKiBEZWZpbmUgcmV0dXJuIGNvZGVzIG9mIFNrR2VQb3J0Q2hlY2tVcCBhbmQgQ2hlY2tTaG9ydCAqLworI2RlZmluZQlTS19IV19QU19OT05FCQkwCS8qIE5vIGFjdGlvbiBuZWVkZWQgKi8KKyNkZWZpbmUJU0tfSFdfUFNfUkVTVEFSVAkxCS8qIFJlc3RhcnQgbmVlZGVkICovCisjZGVmaW5lCVNLX0hXX1BTX0xJTksJCTIJLyogTGluayBVcCBhY3Rpb25zIG5lZWRlZCAqLworCisvKgorICogRGVmaW5lIHRoZSBFdmVudCB0aGUgc3BlY2lhbCBJUlEvSU5JIG1vZHVsZSBjYW4gaGFuZGxlCisgKi8KKyNkZWZpbmUgU0tfSFdFVl9XQVRJTQkJCTEJLyogVGltZW91dCBmb3IgV0EgRXJyYXRhICMyIFhNQUMgKi8KKyNkZWZpbmUgU0tfSFdFVl9QT1JUX1NUQVJUCQkyCS8qIFBvcnQgU3RhcnQgRXZlbnQgYnkgUkxNVCAqLworI2RlZmluZSBTS19IV0VWX1BPUlRfU1RPUAkJMwkvKiBQb3J0IFN0b3AgRXZlbnQgYnkgUkxNVCAqLworI2RlZmluZSBTS19IV0VWX0NMRUFSX1NUQVQJCTQJLyogQ2xlYXIgU3RhdGlzdGljcyBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfVVBEQVRFX1NUQVQJCTUJLyogVXBkYXRlIFN0YXRpc3RpY3MgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9MTU9ERQkJNgkvKiBTZXQgTGluayBNb2RlIGJ5IFBOTUkgKi8KKyNkZWZpbmUgU0tfSFdFVl9TRVRfRkxPV01PREUJNwkvKiBTZXQgRmxvdyBDb250cm9sIE1vZGUgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9ST0xFCQk4CS8qIFNldCBNYXN0ZXIvU2xhdmUgKFJvbGUpIGJ5IFBOTUkgKi8KKyNkZWZpbmUgU0tfSFdFVl9TRVRfU1BFRUQJCTkJLyogU2V0IExpbmsgU3BlZWQgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX0hBTEZEVVBfQ0hLCQkxMAkvKiBIYWxmIER1cGxleCBIYW5ndXAgV29ya2Fyb3VuZCAqLworCisjZGVmaW5lIFNLX1dBX0FDVF9USU1FCQkoNTAwMDAwMFVMKQkvKiA1IHNlYyAqLworI2RlZmluZSBTS19XQV9JTkFfVElNRQkJKDEwMDAwMFVMKQkvKiAxMDAgbXNlYyAqLworCisjZGVmaW5lIFNLX0hBTEZEVVBfQ0hLX1RJTUUJKDEwMDAwVUwpCS8qIDEwIG1zZWMgKi8KKworLyoKKyAqIERlZmluZSB0aGUgZXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMKKyAqLworI2RlZmluZSBTS0VSUl9TSVJRX0UwMDEJCShTS19FUlJCQVNFX1NJUlErMCkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDAxTVNHCSJVbmtub3duIGV2ZW50IgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDIJCShTS0VSUl9TSVJRX0UwMDErMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDAyTVNHCSJQYWNrZXQgdGltZW91dCBSWDEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwMwkJKFNLRVJSX1NJUlFfRTAwMisxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDNNU0cJIlBhY2tldCB0aW1lb3V0IFJYMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA0CQkoU0tFUlJfU0lSUV9FMDAzKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwNE1TRwkiTUFDIDEgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA1CQkoU0tFUlJfU0lSUV9FMDA0KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwNU1TRwkiTUFDIDIgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA2CQkoU0tFUlJfU0lSUV9FMDA1KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwNk1TRwkiQ0hFQ0sgZmFpbHVyZSBSMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA3CQkoU0tFUlJfU0lSUV9FMDA2KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwN01TRwkiQ0hFQ0sgZmFpbHVyZSBSMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA4CQkoU0tFUlJfU0lSUV9FMDA3KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwOE1TRwkiQ0hFQ0sgZmFpbHVyZSBYUzEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwOQkJKFNLRVJSX1NJUlFfRTAwOCsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDlNU0cJIkNIRUNLIGZhaWx1cmUgWEExIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTAJCShTS0VSUl9TSVJRX0UwMDkrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEwTVNHCSJDSEVDSyBmYWlsdXJlIFhTMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDExCQkoU0tFUlJfU0lSUV9FMDEwKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMU1TRwkiQ0hFQ0sgZmFpbHVyZSBYQTIiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMgkJKFNLRVJSX1NJUlFfRTAxMSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTJNU0cJInVuZXhwZWN0ZWQgSVJRIE1hc3RlciBlcnJvciIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEzCQkoU0tFUlJfU0lSUV9FMDEyKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxM01TRwkidW5leHBlY3RlZCBJUlEgU3RhdHVzIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTQJCShTS0VSUl9TSVJRX0UwMTMrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE0TVNHCSJQYXJpdHkgZXJyb3Igb24gUkFNIChyZWFkKSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE1CQkoU0tFUlJfU0lSUV9FMDE0KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNU1TRwkiUGFyaXR5IGVycm9yIG9uIFJBTSAod3JpdGUpIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTYJCShTS0VSUl9TSVJRX0UwMTUrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE2TVNHCSJQYXJpdHkgZXJyb3IgTUFDIDEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNwkJKFNLRVJSX1NJUlFfRTAxNisxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTdNU0cJIlBhcml0eSBlcnJvciBNQUMgMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE4CQkoU0tFUlJfU0lSUV9FMDE3KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxOE1TRwkiUGFyaXR5IGVycm9yIFJYIDEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxOQkJKFNLRVJSX1NJUlFfRTAxOCsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTlNU0cJIlBhcml0eSBlcnJvciBSWCAyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjAJCShTS0VSUl9TSVJRX0UwMTkrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIwTVNHCSJNQUMgdHJhbnNtaXQgRklGTyB1bmRlcnJ1biIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIxCQkoU0tFUlJfU0lSUV9FMDIwKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMU1TRwkiU3B1cmlvdXMgVFdTSSBpbnRlcnJ1cHQiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMgkJKFNLRVJSX1NJUlFfRTAyMSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjJNU0cJIkNhYmxlIHBhaXIgc3dhcCBlcnJvciIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIzCQkoU0tFUlJfU0lSUV9FMDIyKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyM01TRwkiQXV0by1uZWdvdGlhdGlvbiBlcnJvciIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI0CQkoU0tFUlJfU0lSUV9FMDIzKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyNE1TRwkiRklGTyBvdmVyZmxvdyBlcnJvciIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI1CQkoU0tFUlJfU0lSUV9FMDI0KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyNU1TRwkiMiBQYWlyIERvd25zaGlmdCBkZXRlY3RlZCIKKworZXh0ZXJuIHZvaWQgU2tHZVNpcnFJc3IoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIElzdGF0dXMpOworZXh0ZXJuIGludCAgU2tHZVNpcnFFdmVudChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgRXZlbnQsIFNLX0VWUEFSQSBQYXJhKTsKK2V4dGVybiB2b2lkIFNrSFdMaW5rVXAoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IFBvcnQpOworZXh0ZXJuIHZvaWQgU2tIV0xpbmtEb3duKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBQb3J0KTsKKworI2VuZGlmCS8qIF9JTkNfU0tHRVNJUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2kyYy5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NraTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4YmI0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2kyYy5oCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tpMmMuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgVFdTSS1Nb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8yMCAwOTowNjozMCAkCisgKiBQdXJwb3NlOglEZWZpbmVzIHRvIGFjY2VzcyBWb2x0YWdlIGFuZCBUZW1wZXJhdHVyZSBTZW5zb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLSTJDLkgJY29udGFpbnMgYWxsIEkyQyBzcGVjaWZpYyBkZWZpbmVzCisgKi8KKworI2lmbmRlZiBfU0tJMkNfSF8KKyNkZWZpbmUgX1NLSTJDX0hfCisKK3R5cGVkZWYgc3RydWN0ICBzX1NlbnNvciBTS19TRU5TT1I7CisKKyNpbmNsdWRlICJoL3NrZ2VpMmMuaCIKKworLyoKKyAqIERlZmluZSB0aGUgSTJDIGV2ZW50cy4KKyAqLworI2RlZmluZSBTS19JMkNFVl9JUlEJMQkvKiBJUlEgaGFwcGVuZWQgRXZlbnQgKi8KKyNkZWZpbmUgU0tfSTJDRVZfVElNCTIJLyogVGltZW91dCBldmVudCAqLworI2RlZmluZSBTS19JMkNFVl9DTEVBUgkzCS8qIENsZWFyIE1JQiBWYWx1ZXMgKi8KKworLyoKKyAqIERlZmluZSBSRUFEIGFuZCBXUklURSBDb25zdGFudHMuCisgKi8KKyNkZWZpbmUgSTJDX1JFQUQJMAorI2RlZmluZSBJMkNfV1JJVEUJMQorI2RlZmluZSBJMkNfQlVSU1QJMQorI2RlZmluZSBJMkNfU0lOR0xFCTAKKworI2RlZmluZSBTS0VSUl9JMkNfRTAwMQkJKFNLX0VSUkJBU0VfSTJDKzApCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAxTVNHCSJTZW5zb3IgaW5kZXggdW5rbm93biIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDIJCShTS0VSUl9JMkNfRTAwMSsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwMk1TRwkiVFdTSTogdHJhbnNmZXIgZG9lcyBub3QgY29tcGxldGUiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAzCQkoU0tFUlJfSTJDX0UwMDIrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDNNU0cJIkxNODA6IE5BSyBvbiBkZXZpY2Ugc2VuZCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDQJCShTS0VSUl9JMkNfRTAwMysxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwNE1TRwkiTE04MDogTkFLIG9uIHJlZ2lzdGVyIHNlbmQiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA1CQkoU0tFUlJfSTJDX0UwMDQrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDVNU0cJIkxNODA6IE5BSyBvbiBkZXZpY2UgKDIpIHNlbmQiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA2CQkoU0tFUlJfSTJDX0UwMDUrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDZNU0cJIlVua25vd24gZXZlbnQiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA3CQkoU0tFUlJfSTJDX0UwMDYrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDdNU0cJIkxNODAgcmVhZCBvdXQgb2Ygc3RhdGUiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA4CQkoU0tFUlJfSTJDX0UwMDcrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDhNU0cJIlVuZXhwZWN0ZWQgc2Vuc29yIHJlYWQgY29tcGxldGVkIgorI2RlZmluZSBTS0VSUl9JMkNfRTAwOQkJKFNLRVJSX0kyQ19FMDA4KzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA5TVNHCSJXQVJOSU5HOiB0ZW1wZXJhdHVyZSBzZW5zb3Igb3V0IG9mIHJhbmdlIgorI2RlZmluZSBTS0VSUl9JMkNfRTAxMAkJKFNLRVJSX0kyQ19FMDA5KzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEwTVNHCSJXQVJOSU5HOiB2b2x0YWdlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDExCQkoU0tFUlJfSTJDX0UwMTArMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTFNU0cJIkVSUk9SOiB0ZW1wZXJhdHVyZSBzZW5zb3Igb3V0IG9mIHJhbmdlIgorI2RlZmluZSBTS0VSUl9JMkNfRTAxMgkJKFNLRVJSX0kyQ19FMDExKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEyTVNHCSJFUlJPUjogdm9sdGFnZSBzZW5zb3Igb3V0IG9mIHJhbmdlIgorI2RlZmluZSBTS0VSUl9JMkNfRTAxMwkJKFNLRVJSX0kyQ19FMDEyKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEzTVNHCSJFUlJPUjogY291bGRuJ3QgaW5pdCBzZW5zb3IiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDE0CQkoU0tFUlJfSTJDX0UwMTMrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTRNU0cJIldBUk5JTkc6IGZhbiBzZW5zb3Igb3V0IG9mIHJhbmdlIgorI2RlZmluZSBTS0VSUl9JMkNfRTAxNQkJKFNLRVJSX0kyQ19FMDE0KzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDE1TVNHCSJFUlJPUjogZmFuIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDE2CQkoU0tFUlJfSTJDX0UwMTUrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTZNU0cJIlRXU0k6IGFjdGl2ZSB0cmFuc2ZlciBkb2VzIG5vdCBjb21wbGV0ZSIKKworLyoKKyAqIERlZmluZSBUaW1lb3V0IHZhbHVlcworICovCisjZGVmaW5lIFNLX0kyQ19USU1fTE9ORwkJMjAwMDAwMEwJLyogMiBzZWNvbmRzICovCisjZGVmaW5lIFNLX0kyQ19USU1fU0hPUlQJIDEwMDAwMEwJLyogMTAwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBTS19JMkNfVElNX1dBVENICTEwMDAwMDBMCS8qIDEgc2Vjb25kICovCisKKy8qCisgKiBEZWZpbmUgdHJhcCBhbmQgZXJyb3IgbG9nIGhvbGQgdGltZXMKKyAqLworI2lmbmRlZglTS19TRU5fRVJSX1RSX0hPTEQKKyNkZWZpbmUgU0tfU0VOX0VSUl9UUl9IT0xECQkoNCpTS19USUNLU19QRVJfU0VDKQorI2VuZGlmCisjaWZuZGVmCVNLX1NFTl9FUlJfTE9HX0hPTEQKKyNkZWZpbmUgU0tfU0VOX0VSUl9MT0dfSE9MRAkJKDYwKlNLX1RJQ0tTX1BFUl9TRUMpCisjZW5kaWYKKyNpZm5kZWYJU0tfU0VOX1dBUk5fVFJfSE9MRAorI2RlZmluZSBTS19TRU5fV0FSTl9UUl9IT0xECQkoMTUqU0tfVElDS1NfUEVSX1NFQykKKyNlbmRpZgorI2lmbmRlZglTS19TRU5fV0FSTl9MT0dfSE9MRAorI2RlZmluZSBTS19TRU5fV0FSTl9MT0dfSE9MRAkoMTUqNjAqU0tfVElDS1NfUEVSX1NFQykKKyNlbmRpZgorCisvKgorICogRGVmaW5lcyBmb3IgU2VuVHlwZQorICovCisjZGVmaW5lIFNLX1NFTl9VTktOT1dOCTAKKyNkZWZpbmUgU0tfU0VOX1RFTVAJCTEKKyNkZWZpbmUgU0tfU0VOX1ZPTFQJCTIKKyNkZWZpbmUgU0tfU0VOX0ZBTgkJMworCisvKgorICogRGVmaW5lIGZvciB0aGUgU2VuRXJyb3JGbGFnCisgKi8KKyNkZWZpbmUgU0tfU0VOX0VSUl9OT1RfUFJFU0VOVAkwCS8qIEVycm9yIEZsYWc6IFNlbnNvciBub3QgcHJlc2VudCAqLworI2RlZmluZSBTS19TRU5fRVJSX09LCQkJMQkvKiBFcnJvciBGbGFnOiBPLksuICovCisjZGVmaW5lIFNLX1NFTl9FUlJfV0FSTgkJCTIJLyogRXJyb3IgRmxhZzogV2FybmluZyAqLworI2RlZmluZSBTS19TRU5fRVJSX0VSUgkJCTMJLyogRXJyb3IgRmxhZzogRXJyb3IgKi8KKyNkZWZpbmUgU0tfU0VOX0VSUl9GQVVMVFkJCTQJLyogRXJyb3IgRmxhZzogRmF1bHR5ICovCisKKy8qCisgKiBEZWZpbmUgdGhlIFNlbnNvciBzdHJ1Y3QKKyAqLworc3RydWN0CXNfU2Vuc29yIHsKKwljaGFyCSpTZW5EZXNjOwkJCS8qIERlc2NyaXB0aW9uICovCisJaW50CQlTZW5UeXBlOwkJCS8qIFZvbHRhZ2Ugb3IgVGVtcGVyYXR1cmUgKi8KKwlTS19JMzIJU2VuVmFsdWU7CQkJLyogQ3VycmVudCB2YWx1ZSBvZiB0aGUgc2Vuc29yICovCisJU0tfSTMyCVNlblRocmVFcnJIaWdoOwkJLyogSGlnaCBlcnJvciBUaHJlc2hob2xkIG9mIHRoaXMgc2Vuc29yICovCisJU0tfSTMyCVNlblRocmVXYXJuSGlnaDsJLyogSGlnaCB3YXJuaW5nIFRocmVzaGhvbGQgb2YgdGhpcyBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZUVyckxvdzsJCS8qIExvd2VyIGVycm9yIFRocmVzaG9sZCBvZiB0aGUgc2Vuc29yICovCisJU0tfSTMyCVNlblRocmVXYXJuTG93OwkJLyogTG93ZXIgd2FybmluZyBUaHJlc2hvbGQgb2YgdGhlIHNlbnNvciAqLworCWludAkJU2VuRXJyRmxhZzsJCQkvKiBTZW5zb3IgaW5kaWNhdGVkIGFuIGVycm9yICovCisJU0tfQk9PTAlTZW5Jbml0OwkJCS8qIElzIHNlbnNvciBpbml0aWFsaXplZCA/ICovCisJU0tfVTY0CVNlbkVyckN0czsJCQkvKiBFcnJvciB0cmFwIGNvdW50ZXIgKi8KKwlTS19VNjQJU2VuV2FybkN0czsJCQkvKiBXYXJuaW5nIHRyYXAgY291bnRlciAqLworCVNLX1U2NAlTZW5CZWdFcnJUUzsJCS8qIEJlZ2luIGVycm9yIHRpbWVzdGFtcCAqLworCVNLX1U2NAlTZW5CZWdXYXJuVFM7CQkvKiBCZWdpbiB3YXJuaW5nIHRpbWVzdGFtcCAqLworCVNLX1U2NAlTZW5MYXN0RXJyVHJhcFRTOwkvKiBMYXN0IGVycm9yIHRyYXAgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkxhc3RFcnJMb2dUUzsJLyogTGFzdCBlcnJvciBsb2cgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkxhc3RXYXJuVHJhcFRTOwkvKiBMYXN0IHdhcm5pbmcgdHJhcCB0aW1lc3RhbXAgKi8KKwlTS19VNjQJU2VuTGFzdFdhcm5Mb2dUUzsJLyogTGFzdCB3YXJuaW5nIGxvZyB0aW1lc3RhbXAgKi8KKwlpbnQJCVNlblN0YXRlOwkJCS8qIFNlbnNvciBTdGF0ZSAoc2VlIEhXIHNwZWNpZmljIGluY2x1ZGUpICovCisJaW50CQkoKlNlblJlYWQpKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHN0cnVjdCBzX1NlbnNvciAqcFNlbik7CisJCQkJCQkJCS8qIFNlbnNvcnMgcmVhZCBmdW5jdGlvbiAqLworCVNLX1UxNglTZW5SZWc7CQkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgZm9yIHRoaXMgc2Vuc29yICovCisJU0tfVTgJU2VuRGV2OwkJCQkvKiBEZXZpY2UgU2VsZWN0aW9uIGZvciB0aGlzIHNlbnNvciAqLworfTsKKwordHlwZWRlZglzdHJ1Y3QJc19JMmMgeworCVNLX1NFTlNPUglTZW5UYWJsZVtTS19NQVhfU0VOU09SU107CS8qIFNlbnNvciBUYWJsZSAqLworCWludAkJCUN1cnJTZW5zOwkvKiBXaGljaCBzZW5zb3IgaXMgY3VycmVudGx5IHF1ZXJpZWQgKi8KKwlpbnQJCQlNYXhTZW5zOwkvKiBNYXguIG51bWJlciBvZiBzZW5zb3JzICovCisJaW50CQkJVGltZXJNb2RlOwkvKiBVc2UgdGhlIHRpbWVyIGFsc28gdG8gd2F0Y2ggdGhlIHN0YXRlIG1hY2hpbmUgKi8KKwlpbnQJCQlJbml0TGV2ZWw7CS8qIEluaXRpYWxpemVkIExldmVsICovCisjaWZuZGVmIFNLX0RJQUcKKwlpbnQJCQlEdW1teVJlYWRzOwkvKiBOdW1iZXIgb2Ygbm9uLWNoZWNrZWQgZHVtbXkgcmVhZHMgKi8KKwlTS19USU1FUglTZW5UaW1lcjsJLyogU2Vuc29ycyB0aW1lciAqLworI2VuZGlmIC8qICFTS19ESUFHICovCit9IFNLX0kyQzsKKworZXh0ZXJuIGludCBTa0kyY0luaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IExldmVsKTsKK2V4dGVybiBpbnQgU2tJMmNXcml0ZShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgRGF0YSwgaW50IERldiwgaW50IFNpemUsCisJCQkJCSAgIGludCBSZWcsIGludCBCdXJzdCk7CitleHRlcm4gaW50IFNrSTJjUmVhZFNlbnNvcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19TRU5TT1IgKnBTZW4pOworI2lmZGVmIFNLX0RJQUcKK2V4dGVybglTS19VMzIgU2tJMmNSZWFkKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBEZXYsIGludCBTaXplLCBpbnQgUmVnLAorCQkJCQkJIGludCBCdXJzdCk7CisjZWxzZSAvKiAhU0tfRElBRyAqLworZXh0ZXJuIGludCBTa0kyY0V2ZW50KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBFdmVudCwgU0tfRVZQQVJBIFBhcmEpOworZXh0ZXJuIHZvaWQgU2tJMmNXYWl0SXJxKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MpOworZXh0ZXJuIHZvaWQgU2tJMmNJc3IoU0tfQUMgKnBBQywgU0tfSU9DIElvQyk7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKyNlbmRpZiAvKiBuX1NLSTJDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcXVldWUuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjNDBkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3F1ZXVlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrcXVldWUuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjE2ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDEyOjUwOjMyICQKKyAqIFB1cnBvc2U6CURlZmluZXMgZm9yIHRoZSBFdmVudCBxdWV1ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS1FVRVVFLkgJY29udGFpbnMgYWxsIGRlZmluZXMgYW5kIHR5cGVzIGZvciB0aGUgZXZlbnQgcXVldWUKKyAqLworCisjaWZuZGVmIF9TS1FVRVVFX0hfCisjZGVmaW5lIF9TS1FVRVVFX0hfCisKKworLyoKKyAqIGRlZmluZSB0aGUgZXZlbnQgY2xhc3NlcyB0byBiZSBzZXJ2ZWQKKyAqLworI2RlZmluZQlTS0dFX0RSVgkxCS8qIERyaXZlciBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX1JMTVQJMgkvKiBSTE1UIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfSTJDCTMJLyogSTJDIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfUE5NSQk0CS8qIFBOTUkgRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9DU1VNCTUJLyogQ2hlY2tzdW0gRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9IV0FDCTYJLyogSGFyZHdhcmUgQWNjZXNzIEV2ZW50IENsYXNzICovCisKKyNkZWZpbmUJU0tHRV9TV1QJOQkvKiBTb2Z0d2FyZSBUaW1lciBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX0xBQ1AJMTAJLyogTEFDUCBBZ2dyZWdhdGlvbiBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX1JTRgkxMQkvKiBSU0YgQWdncmVnYXRpb24gRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9NQVJLRVIJMTIJLyogTUFSS0VSIEFnZ3JlZ2F0aW9uIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfRkQJCTEzCS8qIEZEIERpc3RyaWJ1dG9yIEV2ZW50IENsYXNzICovCisKKy8qCisgKiBkZWZpbmUgZXZlbnQgcXVldWUgYXMgY2lyY3VsYXIgYnVmZmVyCisgKi8KKyNkZWZpbmUgU0tfTUFYX0VWRU5UCTY0CisKKy8qCisgKiBQYXJhbWV0ZXIgdW5pb24gZm9yIHRoZSBQYXJhIHN0dWZmCisgKi8KK3R5cGVkZWYJdW5pb24gdV9FdlBhcmEgeworCXZvaWQJKnBQYXJhUHRyOwkvKiBQYXJhbWV0ZXIgUG9pbnRlciAqLworCVNLX1U2NAlQYXJhNjQ7CQkvKiBQYXJhbWV0ZXIgNjRiaXQgdmVyc2lvbiAqLworCVNLX1UzMglQYXJhMzJbMl07CS8qIFBhcmFtZXRlciBBcnJheSBvZiAzMmJpdCBwYXJhbWV0ZXJzICovCit9IFNLX0VWUEFSQTsKKworLyoKKyAqIEV2ZW50IFF1ZXVlCisgKglza3F1ZXVlLmMKKyAqIGV2ZW50cyBhcmUgY2xhc3MvdmFsdWUgcGFpcnMKKyAqCWNsYXNzCWlzIGFkZHJlc3NlZSwgZS5nLiBSTE1ULCBQTk1JIGV0Yy4KKyAqCXZhbHVlCWlzIGNvbW1hbmQsIGUuZy4gbGluZSBzdGF0ZSBjaGFuZ2UsIHJpbmcgb3AgY2hhbmdlIGV0Yy4KKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19FdmVudEVsZW0geworCVNLX1UzMgkJQ2xhc3M7CQkJLyogRXZlbnQgY2xhc3MgKi8KKwlTS19VMzIJCUV2ZW50OwkJCS8qIEV2ZW50IHZhbHVlICovCisJU0tfRVZQQVJBCVBhcmE7CQkJLyogRXZlbnQgcGFyYW1ldGVyICovCit9IFNLX0VWRU5URUxFTTsKKwordHlwZWRlZglzdHJ1Y3Qgc19RdWV1ZSB7CisJU0tfRVZFTlRFTEVNCUV2UXVldWVbU0tfTUFYX0VWRU5UXTsKKwlTS19FVkVOVEVMRU0JKkV2UHV0OworCVNLX0VWRU5URUxFTQkqRXZHZXQ7Cit9IFNLX1FVRVVFOworCitleHRlcm4Jdm9pZCBTa0V2ZW50SW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9jLCBpbnQgTGV2ZWwpOworZXh0ZXJuCXZvaWQgU2tFdmVudFF1ZXVlKFNLX0FDICpwQUMsIFNLX1UzMiBDbGFzcywgU0tfVTMyIEV2ZW50LAorCVNLX0VWUEFSQSBQYXJhKTsKK2V4dGVybglpbnQgU2tFdmVudERpc3BhdGNoZXIoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CisKKworLyogRGVmaW5lIEVycm9yIE51bWJlcnMgYW5kIG1lc3NhZ2VzICovCisjZGVmaW5lCVNLRVJSX1FfRTAwMQkoU0tfRVJSQkFTRV9RVUVVRSswKQorI2RlZmluZQlTS0VSUl9RX0UwMDFNU0cJIkV2ZW50IHF1ZXVlIG92ZXJmbG93IgorI2RlZmluZQlTS0VSUl9RX0UwMDIJKFNLRVJSX1FfRTAwMSsxKQorI2RlZmluZQlTS0VSUl9RX0UwMDJNU0cJIlVuZGVmaW5lZCBldmVudCBjbGFzcyIKKyNlbmRpZgkvKiBfU0tRVUVVRV9IXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tybG10LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tybG10LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3JsbXQuaApAQCAtMCwwICsxLDQzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrcmxtdC5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMzcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDQvMTUgMDk6NDM6NDMgJAorICogUHVycG9zZToJSGVhZGVyIGZpbGUgZm9yIFJlZHVuZGFudCBMaW5rIE1hbmFnZW1lblQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgaXMgdGhlIGhlYWRlciBmaWxlIGZvciBSZWR1bmRhbnQgTGluayBNYW5hZ2VtZW5ULgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJInNrZHJ2MXN0LmgiCisgKgkuLi4KKyAqCSJza3R5cGVzLmgiCisgKgkic2txdWV1ZS5oIgorICoJInNrYWRkci5oIgorICoJInNrcmxtdC5oIgorICoJLi4uCisgKgkic2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLUkxNVF9ICisjZGVmaW5lIF9fSU5DX1NLUkxNVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogY3BsdXNwbHVzICovCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJU0tfUkxNVF9ORVRfRE9XTl9URU1QCTEJLyogTkVUX0RPV04gZHVlIHRvIGxhc3QgcG9ydCBkb3duLiAqLworI2RlZmluZQlTS19STE1UX05FVF9ET1dOX0ZJTkFMCTIJLyogTkVUX0RPV04gZHVlIHRvIFJMTVRfU1RPUC4gKi8KKworLyogLS0tLS0gRGVmYXVsdCBxdWV1ZSBzaXplcyAtIG11c3QgYmUgbXVsdGlwbGVzIG9mIDggS0IgLS0tLS0gKi8KKworLyogTGVzcyB0aGFuIDggS0IgZnJlZSBpbiBSWCBxdWV1ZSA9PiBwYXVzZSBmcmFtZXMuICovCisjZGVmaW5lIFNLX1JMTVRfU1RBTkRCWV9RUlhTSVpFCTEyOAkvKiBTaXplIG9mIHJ4IHN0YW5kYnkgcXVldWUgaW4gS0IuICovCisjZGVmaW5lIFNLX1JMTVRfU1RBTkRCWV9RWEFTSVpFCTMyCS8qIFNpemUgb2YgYXN5bmMgc3RhbmRieSBxdWV1ZSBpbiBLQi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFOREJZX1FYU1NJWkUJMAkvKiBTaXplIG9mIHN5bmMgc3RhbmRieSBxdWV1ZSBpbiBLQi4gKi8KKworI2RlZmluZSBTS19STE1UX01BWF9UWF9CVUZfU0laRQk2MAkvKiBNYXhpbXVtIFJMTVQgdHJhbnNtaXQgc2l6ZS4gKi8KKworLyogLS0tLS0gUE9SVCBzdGF0ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1BTX0lOSVQJCQkwCS8qIFBvcnQgc3RhdGU6IEluaXQuICovCisjZGVmaW5lIFNLX1JMTVRfUFNfTElOS19ET1dOCTEJLyogUG9ydCBzdGF0ZTogTGluayBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1BTX0RPV04JCQkyCS8qIFBvcnQgc3RhdGU6IFBvcnQgZG93bi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QU19HT0lOR19VUAkJMwkvKiBQb3J0IHN0YXRlOiBHb2luZyB1cC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QU19VUAkJCTQJLyogUG9ydCBzdGF0ZTogVXAuICovCisKKy8qIC0tLS0tIFJMTVQgc3RhdGVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9SU19JTklUCQkJMAkvKiBSTE1UIHN0YXRlOiBJbml0LiAqLworI2RlZmluZSBTS19STE1UX1JTX05FVF9ET1dOCQkxCS8qIFJMTVQgc3RhdGU6IE5ldCBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1JTX05FVF9VUAkJMgkvKiBSTE1UIHN0YXRlOiBOZXQgdXAuICovCisKKy8qIC0tLS0tIFBPUlQgZXZlbnRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9MSU5LX1VQCQkJMTAwMQkvKiBMaW5rIGNhbWUgdXAuICovCisjZGVmaW5lIFNLX1JMTVRfTElOS19ET1dOCQkxMDAyCS8qIExpbmsgd2VudCBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRfQUREUgkJMTAwMwkvKiBQb3J0IGFkZHJlc3MgY2hhbmdlZC4gKi8KKworLyogLS0tLS0gUkxNVCBldmVudHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1NUQVJUCQkJMjAwMQkvKiBTdGFydCBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1NUT1AJCQkyMDAyCS8qIFN0b3AgUkxNVC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQJMjAwMwkvKiBQYWNrZXQgd2FzIHJlY2VpdmVkIGZvciBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1NUQVRTX0NMRUFSCQkyMDA0CS8qIENsZWFyIHN0YXRpc3RpY3MuICovCisjZGVmaW5lIFNLX1JMTVRfU1RBVFNfVVBEQVRFCTIwMDUJLyogVXBkYXRlIHN0YXRpc3RpY3MuICovCisjZGVmaW5lIFNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFCTIwMDYJLyogQ2hhbmdlIHByZWZlcnJlZCBwb3J0LiAqLworI2RlZmluZSBTS19STE1UX01PREVfQ0hBTkdFCQkyMDA3CS8qIE5ldyBSbG10TW9kZS4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TRVRfTkVUUwkJMjAwOAkvKiBOdW1iZXIgb2YgTmV0cyAoMSBvciAyKS4gKi8KKworLyogLS0tLS0gUkxNVCBtb2RlIGJpdHMgLS0tLS0gKi8KKworLyoKKyAqIENBVVRJT046CVRoZXNlIGRlZmluZXMgYXJlIHByaXZhdGUgdG8gUkxNVC4KKyAqCQkJUGxlYXNlIHVzZSB0aGUgUkxNVCBtb2RlIGRlZmluZXMgYmVsb3cuCisgKi8KKworI2RlZmluZSBTS19STE1UX0NIRUNLX0xJTksJCSAgMQkJLyogQ2hlY2sgTGluay4gKi8KKyNkZWZpbmUgU0tfUkxNVF9DSEVDS19MT0NfTElOSwkgIDIJCS8qIENoZWNrIG90aGVyIGxpbmsgb24gc2FtZSBhZGFwdGVyLiAqLworI2RlZmluZSBTS19STE1UX0NIRUNLX1NFRwkJICA0CQkvKiBDaGVjayBzZWdtZW50YXRpb24uICovCisKKyNpZm5kZWYgUkxNVF9DSEVDS19SRU1PVEUKKyNkZWZpbmUgU0tfUkxNVF9DSEVDS19PVEhFUlMJU0tfUkxNVF9DSEVDS19MT0NfTElOSworI2Vsc2UJLyogUkxNVF9DSEVDS19SRU1PVEUgKi8KKyNkZWZpbmUgU0tfUkxNVF9DSEVDS19SRU1fTElOSwkgIDgJCS8qIENoZWNrIGxpbmsocykgb24gb3RoZXIgYWRhcHRlcihzKS4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NQVhfUkVNT1RFX1BPUlRTX0NIRUNLRUQJMworI2RlZmluZSBTS19STE1UX0NIRUNLX09USEVSUwlcCisJCShTS19STE1UX0NIRUNLX0xPQ19MSU5LIHwgU0tfUkxNVF9DSEVDS19SRU1fTElOSykKKyNlbmRpZgkvKiBSTE1UX0NIRUNLX1JFTU9URSAqLworCisjaWZuZGVmIFNLX1JMTVRfRU5BQkxFX1RSQU5TUEFSRU5UCisjZGVmaW5lIFNLX1JMTVRfVFJBTlNQQVJFTlQJCSAgMAkJLyogUkxNVCB0cmFuc3BhcmVudCAtIGluYWN0aXZlLiAqLworI2Vsc2UJLyogU0tfUkxNVF9FTkFCTEVfVFJBTlNQQVJFTlQgKi8KKyNkZWZpbmUgU0tfUkxNVF9UUkFOU1BBUkVOVAkJMTI4CQkvKiBSTE1UIHRyYW5zcGFyZW50LiAqLworI2VuZGlmCS8qIFNLX1JMTVRfRU5BQkxFX1RSQU5TUEFSRU5UICovCisKKy8qIC0tLS0tIFJMTVQgbW9kZXMgLS0tLS0gKi8KKworLyogQ2hlY2sgTGluayBTdGF0ZS4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NT0RFX0NMUwkoU0tfUkxNVF9DSEVDS19MSU5LKQorCisvKiBDaGVjayBMb2NhbCBQb3J0czogY2hlY2sgb3RoZXIgbGlua3Mgb24gdGhlIHNhbWUgYWRhcHRlci4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NT0RFX0NMUAkoU0tfUkxNVF9DSEVDS19MSU5LIHwgU0tfUkxNVF9DSEVDS19MT0NfTElOSykKKworLyogQ2hlY2sgTG9jYWwgUG9ydHMgYW5kIFNlZ21lbnRhdGlvbiBTdGF0dXMuICovCisjZGVmaW5lIFNLX1JMTVRfTU9ERV9DTFBTUwlcCisJCShTS19STE1UX0NIRUNLX0xJTksgfCBTS19STE1UX0NIRUNLX0xPQ19MSU5LIHwgU0tfUkxNVF9DSEVDS19TRUcpCisKKyNpZmRlZiBSTE1UX0NIRUNLX1JFTU9URQorLyogQ2hlY2sgTG9jYWwgYW5kIFJlbW90ZSBQb3J0czogY2hlY2sgbGlua3MgKGxvY2FsIG9yIHJlbW90ZSkuICovCisJTmFtZSBvZiBkZWZpbmUgVEJEIQorI2RlZmluZSBTS19STE1UX01PREVfQ1JQCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBTS19STE1UX0NIRUNLX1JFTV9MSU5LKQorCisvKiBDaGVjayBMb2NhbCBhbmQgUmVtb3RlIFBvcnRzIGFuZCBTZWdtZW50YXRpb24gU3RhdHVzLiAqLworCU5hbWUgb2YgZGVmaW5lIFRCRCEKKyNkZWZpbmUgU0tfUkxNVF9NT0RFX0NSUFNTCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBcCisJCVNLX1JMTVRfQ0hFQ0tfUkVNX0xJTksgfCBTS19STE1UX0NIRUNLX1NFRykKKyNlbmRpZgkvKiBSTE1UX0NIRUNLX1JFTU9URSAqLworCisvKiAtLS0tLSBSTE1UIGxvb2thaGVhZCByZXN1bHQgYml0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfUlhfUkxNVAkJCTEJLyogR2l2ZSBwYWNrZXQgdG8gUkxNVC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9SWF9QUk9UT0NPTAkJMgkvKiBHaXZlIHBhY2tldCB0byBwcm90b2NvbC4gKi8KKworLyogTWFjcm9zICovCisKKyNpZiAwCitTS19BQwkJKnBBQwkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIJCVBvcnROdW0JCS8qIHJlY2VpdmluZyBwb3J0ICovCit1bnNpZ25lZAlQa3RMZW4JCS8qIHJlY2VpdmVkIHBhY2tldCdzIGxlbmd0aCAqLworU0tfQk9PTAkJSXNCYwkJLyogRmxhZzogcGFja2V0IGlzIGJyb2FkY2FzdCAqLwordW5zaWduZWQJKnBPZmZzZXQJLyogb2Zmcy4gb2YgYnl0ZXMgdG8gcHJlc2VudCB0byBTS19STE1UX0xPT0tBSEVBRCAqLwordW5zaWduZWQJKnBOdW1CeXRlcwkvKiAjQnl0ZXMgdG8gcHJlc2VudCB0byBTS19STE1UX0xPT0tBSEVBRCAqLworI2VuZGlmCS8qIDAgKi8KKworI2RlZmluZSBTS19STE1UX1BSRV9MT09LQUhFQUQocEFDLFBvcnROdW0sUGt0TGVuLElzQmMscE9mZnNldCxwTnVtQnl0ZXMpIHsgXAorCVNLX0FDCSpfcEFDOyBcCisJU0tfVTMyCV9Qb3J0TnVtOyBcCisJX3BBQyA9IChwQUMpOyBcCisJX1BvcnROdW0gPSAoU0tfVTMyKShQb3J0TnVtKTsgXAorCS8qIF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uUGFja2V0c1J4Kys7ICovIFwKKwlfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLlBhY2tldHNQZXJUaW1lU2xvdCsrOyBcCisgICAgaWYgKF9wQUMtPlJsbXQuUmxtdE9mZikgeyBcCisJCSoocE51bUJ5dGVzKSA9IDA7IFwKKyAgICB9IFwKKyAgICBlbHNlIHtcCisgICAgICAgIGlmICgoX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9UUkFOU1BBUkVOVCkgIT0gMCkgeyBcCisgICAgCQkqKHBOdW1CeXRlcykgPSAwOyBcCisgICAgCX0gXAorICAgIAllbHNlIGlmIChJc0JjKSB7IFwKKyAgICAJCWlmIChfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLk5ldC0+UmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUykgeyBcCisgICAgCQkJKihwTnVtQnl0ZXMpID0gNjsgXAorICAgIAkJCSoocE9mZnNldCkgPSA2OyBcCisgICAgCQl9IFwKKyAgICAJCWVsc2UgeyBcCisgICAgCQkJKihwTnVtQnl0ZXMpID0gMDsgXAorICAgIAkJfSBcCisgICAgCX0gXAorICAgIAllbHNlIHsgXAorICAgIAkJaWYgKChQa3RMZW4pID4gU0tfUkxNVF9NQVhfVFhfQlVGX1NJWkUpIHsgXAorICAgIAkJCS8qIF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uRGF0YVBhY2tldHNQZXJUaW1lU2xvdCsrOyAqLyBcCisgICAgCQkJKihwTnVtQnl0ZXMpID0gMDsgXAorICAgIAkJfSBcCisgICAgCQllbHNlIHsgXAorICAgIAkJCSoocE51bUJ5dGVzKSA9IDY7IFwKKyAgICAJCQkqKHBPZmZzZXQpID0gMDsgXAorICAgIAkJfSBcCisgICAgCX0gXAorICAgIH0gXAorfQorCisjaWYgMAorU0tfQUMJCSpwQUMJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtCQkvKiByZWNlaXZpbmcgcG9ydCAqLworU0tfVTgJCSpwTGFQYWNrZXQsCS8qIHJlY2VpdmVkIHBhY2tldCdzIGRhdGEgKHBvaW50cyB0byBwT2Zmc2V0KSAqLworU0tfQk9PTAkJSXNCYwkJLyogRmxhZzogcGFja2V0IGlzIGJyb2FkY2FzdCAqLworU0tfQk9PTAkJSXNNYwkJLyogRmxhZzogcGFja2V0IGlzIG11bHRpY2FzdCAqLwordW5zaWduZWQJKnBGb3JSbG10CS8qIFJlc3VsdDogYml0cyBTS19STE1UX1JYX1JMTVQsIFNLX1JMTVRfUlhfUFJPVE9DT0wgKi8KK1NLX1JMTVRfTE9PS0FIRUFEKCkgZXhwZWN0cyAqcE51bUJ5dGVzIGZyb20KK3BhY2tldCBvZmZzZXQgKnBPZmZzZXQgKHMuYS4pIGF0ICpwTGFQYWNrZXQuCisKK0lmIHlvdSB1c2UgU0tfUkxNVF9MT09LQUhFQUQgaW4gYSBwYXRoIHdoZXJlIHlvdSBhbHJlYWR5IGtub3cgaWYgdGhlIHBhY2tldCBpcworQkMsIE1DLCBvciBVQywgeW91IHNob3VsZCB1c2UgY29uc3RhbnRzIGZvciBJc0JjIGFuZCBJc01jLCBzbyB0aGF0IHlvdXIgY29tcGlsZXIKK2NhbiB0cmFzaCB1bm5lZWRlZCBwYXJ0cyBvZiB0aGUgaWYgY29uc3RydWN0aW9uLgorI2VuZGlmCS8qIDAgKi8KKworI2RlZmluZSBTS19STE1UX0xPT0tBSEVBRChwQUMsUG9ydE51bSxwTGFQYWNrZXQsSXNCYyxJc01jLHBGb3JSbG10KSB7IFwKKwlTS19BQwkqX3BBQzsgXAorCVNLX1UzMglfUG9ydE51bTsgXAorCVNLX1U4CSpfcExhUGFja2V0OyBcCisJX3BBQyA9IChwQUMpOyBcCisJX1BvcnROdW0gPSAoU0tfVTMyKShQb3J0TnVtKTsgXAorCV9wTGFQYWNrZXQgPSAoU0tfVTggKikocExhUGFja2V0KTsgXAorCWlmIChJc0JjKSB7XAorCQlpZiAoIVNLX0FERFJfRVFVQUwoX3BMYVBhY2tldCwgX3BBQy0+QWRkci5OZXRbX3BBQy0+UmxtdC5Qb3J0WyBcCisJCQlfUG9ydE51bV0uTmV0LT5OZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7IFwKKwkJCV9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uQmNUaW1lU3RhbXAgPSBTa09zR2V0VGltZShfcEFDKTsgXAorCQkJX3BBQy0+UmxtdC5DaGVja1N3aXRjaCA9IFNLX1RSVUU7IFwKKwkJfSBcCisJCS8qIF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uRGF0YVBhY2tldHNQZXJUaW1lU2xvdCsrOyAqLyBcCisJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9QUk9UT0NPTDsgXAorCX0gXAorCWVsc2UgaWYgKElzTWMpIHsgXAorCQlpZiAoU0tfQUREUl9FUVVBTChfcExhUGFja2V0LCBCcmlkZ2VNY0FkZHIuYSkpIHsgXAorCQkJX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5CcGR1UGFja2V0c1BlclRpbWVTbG90Kys7IFwKKwkJCWlmIChfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgeyBcCisJCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1JMTVQgfCBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJCQl9IFwKKwkJCWVsc2UgeyBcCisJCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJCQl9IFwKKwkJfSBcCisJCWVsc2UgaWYgKFNLX0FERFJfRVFVQUwoX3BMYVBhY2tldCwgU2tSbG10TWNBZGRyLmEpKSB7IFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9STE1UOyBcCisJCX0gXAorCQllbHNlIHsgXAorCQkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9QUk9UT0NPTDsgXAorCQl9IFwKKwl9IFwKKwllbHNlIHsgXAorCQlpZiAoU0tfQUREUl9FUVVBTCggXAorCQkJX3BMYVBhY2tldCwgXAorCQkJX3BBQy0+QWRkci5Qb3J0W19Qb3J0TnVtXS5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeyBcCisJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUkxNVDsgXAorCQl9IFwKKwkJZWxzZSB7IFwKKwkJCS8qIF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uRGF0YVBhY2tldHNQZXJUaW1lU2xvdCsrOyAqLyBcCisJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUFJPVE9DT0w7IFwKKwkJfSBcCisJfSBcCit9CisKKyNpZmRlZiBTS19STE1UX0ZBU1RfTE9PS0FIRUFECitFcnJvcjogU0tfUkxNVF9GQVNUX0xPT0tBSEVBRCBubyBsb25nZXIgdXNlZC4gVXNlIG5ldyBtYWNyb3MgZm9yIGxvb2thaGVhZC4KKyNlbmRpZgkvKiBTS19STE1UX0ZBU1RfTE9PS0FIRUFEICovCisjaWZkZWYgU0tfUkxNVF9TTE9XX0xPT0tBSEVBRAorRXJyb3I6IFNLX1JMTVRfU0xPV19MT09LQUhFQUQgbm8gbG9uZ2VyIHVzZWQuIFVzZSBuZXcgbWFjcm9zIGZvciBsb29rYWhlYWQuCisjZW5kaWYJLyogU0tfUkxNVF9TTE9XX0xPT0tBSEVBRCAqLworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgU0tfUkxNVF9NQlVGX1BSSVZBVEUKK3R5cGVkZWYgc3RydWN0IHNfUmxtdE1idWYgeworCXNvbWUgY29udGVudAorfSBTS19STE1UX01CVUY7CisjZW5kaWYJLyogU0tfUkxNVF9NQlVGX1BSSVZBVEUgKi8KKworCisjaWZkZWYgU0tfTEFfSU5GTwordHlwZWRlZiBzdHJ1Y3Qgc19SbG10X1BhY2tldEluZm8geworCXVuc2lnbmVkCVBhY2tldExlbmd0aDsJCQkvKiBMZW5ndGggb2YgcGFja2V0LiAqLworCXVuc2lnbmVkCVBhY2tldFR5cGU7CQkJCS8qIERpcmVjdGVkL011bHRpY2FzdC9Ccm9hZGNhc3QuICovCit9IFNLX1JMTVRfUElORk87CisjZW5kaWYJLyogU0tfTEFfSU5GTyAqLworCisKK3R5cGVkZWYgc3RydWN0IHNfUm9vdElkIHsKKwlTS19VOAkJSWRbOF07CQkJCQkvKiBSb290IEJyaWRnZSBJZC4gKi8KK30gU0tfUkxNVF9ST09UX0lEOworCisKK3R5cGVkZWYgc3RydWN0IHNfcG9ydCB7CisJU0tfTUFDX0FERFIJQ2hlY2tBZGRyOworCVNLX0JPT0wJCVN1c3BlY3RUeDsKK30gU0tfUE9SVF9DSEVDSzsKKworCit0eXBlZGVmIHN0cnVjdCBzX1JsbXROZXQgU0tfUkxNVF9ORVQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19SbG10UG9ydCB7CisKKy8qIC0tLS0tIFB1YmxpYyBwYXJ0IChyZWFkLW9ubHkpIC0tLS0tICovCisKKwlTS19VOAkJCVBvcnRTdGF0ZTsJCQkJLyogQ3VycmVudCBzdGF0ZSBvZiB0aGlzIHBvcnQuICovCisKKwkvKiBGb3IgUE5NSSAqLworCVNLX0JPT0wJCQlMaW5rRG93bjsKKwlTS19CT09MCQkJUG9ydERvd247CisJU0tfVTgJCQlBbGlnbjAxOworCisJU0tfVTMyCQkJUG9ydE51bWJlcjsJCQkJLyogTnVtYmVyIG9mIHBvcnQgb24gYWRhcHRlci4gKi8KKwlTS19STE1UX05FVCAqCU5ldDsJCQkJCS8qIE5ldCBwb3J0IGJlbG9uZ3MgdG8uICovCisKKwlTS19VNjQJCQlUeEhlbGxvQ3RzOworCVNLX1U2NAkJCVJ4SGVsbG9DdHM7CisJU0tfVTY0CQkJVHhTcEhlbGxvUmVxQ3RzOworCVNLX1U2NAkJCVJ4U3BIZWxsb0N0czsKKworLyogLS0tLS0gUHJpdmF0ZSBwYXJ0IC0tLS0tICovCisKKy8qCVNLX1U2NAkJCVBhY2tldHNSeDsgKi8JCQkJLyogVG90YWwgcGFja2V0cyByZWNlaXZlZC4gKi8KKwlTS19VMzIJCQlQYWNrZXRzUGVyVGltZVNsb3Q7CQkvKiBQYWNrZXRzIHJ4ZWQgYmV0d2VlbiBUT3MuICovCisvKglTS19VMzIJCQlEYXRhUGFja2V0c1BlclRpbWVTbG90OyAqLwkvKiBEYXRhIHBhY2tldHMgLi4uICovCisJU0tfVTMyCQkJQnBkdVBhY2tldHNQZXJUaW1lU2xvdDsJLyogQlBEVSBwYWNrZXRzIHJ4ZWQgaW4gVFMuICovCisJU0tfVTY0CQkJQmNUaW1lU3RhbXA7CQkJLyogVGltZSBvZiBsYXN0IEJDIHJlY2VpdmUuICovCisJU0tfVTY0CQkJR3VUaW1lU3RhbXA7CQkJLyogVGltZSBvZiBlbnRlcmluZyBHT0lOR19VUC4gKi8KKworCVNLX1RJTUVSCQlVcFRpbWVyOwkJCQkvKiBUaW1lciBzdHJ1Y3QgTGluay9Qb3J0IHVwLiAqLworCVNLX1RJTUVSCQlEb3duUnhUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QgZG93biByeC4gKi8KKwlTS19USU1FUgkJRG93blR4VGltZXI7CQkJLyogVGltZXIgc3RydWN0IGRvd24gdHguICovCisKKwlTS19VMzIJCQlDaGVja2luZ1N0YXRlOwkJCS8qIENoZWNraW5nIFN0YXRlLiAqLworCisJU0tfQUREUl9QT1JUICoJQWRkclBvcnQ7CisKKwlTS19VOAkJCVJhbmRvbVs0XTsJCQkJLyogUmFuZG9tIHZhbHVlLiAqLworCXVuc2lnbmVkCQlQb3J0c0NoZWNrZWQ7CQkJLyogI3BvcnRzIGNoZWNrZWQuICovCisJdW5zaWduZWQJCVBvcnRzU3VzcGVjdDsJCQkvKiAjcG9ydHMgY2hlY2tlZCB0aGF0IGFyZSBzLiAqLworCVNLX1BPUlRfQ0hFQ0sJUG9ydENoZWNrWzFdOworLyoJU0tfUE9SVF9DSEVDSwlQb3J0Q2hlY2tbU0tfTUFYX01BQ1MgLSAxXTsgKi8KKworCVNLX0JPT0wJCQlQb3J0U3RhcnRlZDsJCQkvKiBQb3J0IGlzIHN0YXJ0ZWQuICovCisJU0tfQk9PTAkJCVBvcnROb1J4OwkJCQkvKiBOb1J4IGZvciA+PSAxIHRpbWUgc2xvdC4gKi8KKwlTS19CT09MCQkJUm9vdElkU2V0OworCVNLX1JMTVRfUk9PVF9JRAlSb290OwkJCQkJLyogUm9vdCBCcmlkZ2UgSWQuICovCit9IFNLX1JMTVRfUE9SVDsKKworCitzdHJ1Y3Qgc19SbG10TmV0IHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX1UzMgkJCU5ldE51bWJlcjsJCQkvKiBOdW1iZXIgb2YgbmV0LiAqLworCisJU0tfUkxNVF9QT1JUICoJUG9ydFtTS19NQVhfTUFDU107CS8qIFBvcnRzIHRoYXQgYmVsb25nIHRvIHRoaXMgbmV0LiAqLworCVNLX1UzMgkJCU51bVBvcnRzOwkJCS8qIE51bWJlciBvZiBwb3J0cy4gKi8KKwlTS19VMzIJCQlQcmVmUG9ydDsJCQkvKiBQcmVmZXJyZWQgcG9ydC4gKi8KKworCS8qIEZvciBQTk1JICovCisKKwlTS19VMzIJCQlDaGdCY1ByaW87CQkJLyogQ2hhbmdlIFByaW9yaXR5IG9mIGxhc3QgYnJvYWRjYXN0IHJlY2VpdmVkICovCisJU0tfVTMyCQkJUmxtdE1vZGU7CQkJLyogQ2hlY2sgLi4uICovCisJU0tfVTMyCQkJQWN0aXZlUG9ydDsJCQkvKiBBY3RpdmUgcG9ydC4gKi8KKwlTS19VMzIJCQlQcmVmZXJlbmNlOwkJLyogMHhGRkZGRkZGRjogQXV0b21hdGljLiAqLworCisJU0tfVTgJCQlSbG10U3RhdGU7CQkJLyogQ3VycmVudCBSTE1UIHN0YXRlLiAqLworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKwlTS19CT09MCQkJUm9vdElkU2V0OworCVNLX1UxNgkJCUFsaWduMDE7CisKKwlpbnQJCQkJTGlua3NVcDsJCQkvKiAjTGlua3MgdXAuICovCisJaW50CQkJCVBvcnRzVXA7CQkJLyogI1BvcnRzIHVwLiAqLworCVNLX1UzMgkJCVRpbWVvdXRWYWx1ZTsJCS8qIFJMTVQgdGltZW91dCB2YWx1ZS4gKi8KKworCVNLX1UzMgkJCUNoZWNraW5nU3RhdGU7CQkvKiBDaGVja2luZyBTdGF0ZS4gKi8KKwlTS19STE1UX1JPT1RfSUQJUm9vdDsJCQkJLyogUm9vdCBCcmlkZ2UgSWQuICovCisKKwlTS19USU1FUgkJTG9jVGltZXI7CQkJLyogVGltZXIgc3RydWN0LiAqLworCVNLX1RJTUVSCQlTZWdUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QuICovCit9OworCisKK3R5cGVkZWYgc3RydWN0IHNfUmxtdCB7CisKKy8qIC0tLS0tIFB1YmxpYyBwYXJ0IChyZWFkLW9ubHkpIC0tLS0tICovCisKKwlTS19VMzIJCQlOdW1OZXRzOwkJCS8qIE51bWJlciBvZiBuZXRzLiAqLworCVNLX1UzMgkJCU5ldHNTdGFydGVkOwkJLyogTnVtYmVyIG9mIG5ldHMgc3RhcnRlZC4gKi8KKwlTS19STE1UX05FVAkJTmV0W1NLX01BWF9ORVRTXTsJLyogQXJyYXkgb2YgYXZhaWxhYmxlIG5ldHMuICovCisJU0tfUkxNVF9QT1JUCVBvcnRbU0tfTUFYX01BQ1NdOwkvKiBBcnJheSBvZiBhdmFpbGFibGUgcG9ydHMuICovCisKKy8qIC0tLS0tIFByaXZhdGUgcGFydCAtLS0tLSAqLworCVNLX0JPT0wJCQlDaGVja1N3aXRjaDsKKwlTS19CT09MCQkJUmxtdE9mZjsgICAgICAgICAgICAvKiBzZXQgdG8gemVybyBpZiB0aGUgTWFjIGFkZHJlc3NlcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZXF1YWwgb3IgdGhlIHNlY29uZCBvbmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgemVybyAqLworCVNLX1UxNgkJCUFsaWduMDE7CisKK30gU0tfUkxNVDsKKworCitleHRlcm4JU0tfTUFDX0FERFIJQnJpZGdlTWNBZGRyOworZXh0ZXJuCVNLX01BQ19BRERSCVNrUmxtdE1jQWRkcjsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFNLX0tSX1BST1RPCisKKy8qIEZ1bmN0aW9ucyBwcm92aWRlZCBieSBTa1JsbXQgKi8KKworLyogQU5TSS9DKysgY29tcGxpYW50IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworZXh0ZXJuCXZvaWQJU2tSbG10SW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlMZXZlbCk7CisKK2V4dGVybglpbnQJU2tSbG10RXZlbnQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfVTMyCQlFdmVudCwKKwlTS19FVlBBUkEJUGFyYSk7CisKKyNlbHNlCS8qIGRlZmluZWQoU0tfS1JfUFJPVE8pICovCisKKy8qIE5vbi1BTlNJL0MrKyBjb21wbGlhbnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCisjZXJyb3IgS1Itc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBlcyBhcmUgbm90IHlldCBwcm92aWRlZC4KKworI2VuZGlmCS8qIGRlZmluZWQoU0tfS1JfUFJPVE8pKSAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19TS1JMTVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdGltZXIuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlNmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3RpbWVyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrdGltZXIuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjExICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDEyOjU4OjE4ICQKKyAqIFB1cnBvc2U6CURlZmluZXMgZm9yIHRoZSB0aW1lciBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tUSU1FUi5ICWNvbnRhaW5zIGFsbCBkZWZpbmVzIGFuZCB0eXBlcyBmb3IgdGhlIHRpbWVyIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYJX1NLVElNRVJfSF8KKyNkZWZpbmUgX1NLVElNRVJfSF8KKworI2luY2x1ZGUgImgvc2txdWV1ZS5oIgorCisvKgorICogU0sgdGltZXIKKyAqIC0gbmVlZGVkIHdoZXJldmVyIGEgdGltZXIgaXMgdXNlZC4gUHV0IHRoaXMgaW4geW91ciBkYXRhIHN0cnVjdHVyZQorICogICB3aGVyZXZlciB5b3Ugd2FudC4KKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19UaW1lciBTS19USU1FUjsKKworc3RydWN0IHNfVGltZXIgeworCVNLX1RJTUVSCSpUbU5leHQ7CS8qIGxpbmtlZCBsaXN0ICovCisJU0tfVTMyCQlUbUNsYXNzOwkvKiBUaW1lciBFdmVudCBjbGFzcyAqLworCVNLX1UzMgkJVG1FdmVudDsJLyogVGltZXIgRXZlbnQgdmFsdWUgKi8KKwlTS19FVlBBUkEJVG1QYXJhOwkJLyogVGltZXIgRXZlbnQgcGFyYW1ldGVyICovCisJU0tfVTMyCQlUbURlbHRhOwkvKiBkZWx0YSB0aW1lICovCisJaW50CQkJVG1BY3RpdmU7CS8qIGZsYWc6IGFjdGl2ZS9pbmFjdGl2ZSAqLworfTsKKworLyoKKyAqIFRpbWVyIGNvbnRyb2wgc3RydWN0LgorICogLSB1c2UgaW4gQWRhcHRlcnMgY29udGV4dCBuYW1lIHBBQy0+VGltCisgKi8KK3R5cGVkZWYJc3RydWN0IHNfVGltQ3RybCB7CisJU0tfVElNRVIJKlN0UXVldWU7CS8qIEhlYWQgb2YgVGltZXIgcXVldWUgKi8KK30gU0tfVElNQ1RSTDsKKworZXh0ZXJuIHZvaWQgU2tUaW1lckluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvYywgaW50IExldmVsKTsKK2V4dGVybiB2b2lkIFNrVGltZXJTdG9wKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIFNLX1RJTUVSICpwVGltZXIpOworZXh0ZXJuIHZvaWQgU2tUaW1lclN0YXJ0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIFNLX1RJTUVSICpwVGltZXIsCisJU0tfVTMyIFRpbWUsIFNLX1UzMiBDbGFzcywgU0tfVTMyIEV2ZW50LCBTS19FVlBBUkEgUGFyYSk7CitleHRlcm4gdm9pZCBTa1RpbWVyRG9uZShTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKKyNlbmRpZgkvKiBfU0tUSU1FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdHlwZXMuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlZGM5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3R5cGVzLmgKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrdHlwZXMuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDcgMDg6MTY6NTEgJAorICogUHVycG9zZToJRGVmaW5lIGRhdGEgdHlwZXMgZm9yIExpbnV4CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBJbiB0aGlzIGZpbGUsIGFsbCBkYXRhIHR5cGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgY29tbW9uIG1vZHVsZXMKKyAqIGFyZSBtYXBwZWQgdG8gTGludXggZGF0YSB0eXBlcy4KKyAqIAorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tUWVBFU19ICisjZGVmaW5lIF9fSU5DX1NLVFlQRVNfSAorCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERhdGEgdHlwZXMgd2l0aCBhIHNwZWNpZmljIHNpemUuICdJJyA9IHNpZ25lZCwgJ1UnID0gdW5zaWduZWQuCisgKi8KKyNkZWZpbmUgU0tfSTgJczgKKyNkZWZpbmUgU0tfVTgJdTgKKyNkZWZpbmUgU0tfSTE2CXMxNgorI2RlZmluZSBTS19VMTYJdTE2CisjZGVmaW5lIFNLX0kzMglzMzIKKyNkZWZpbmUgU0tfVTMyCXUzMgorI2RlZmluZSBTS19JNjQJczY0CisjZGVmaW5lIFNLX1U2NAl1NjQKKworI2RlZmluZSBTS19VUFRSCXVsb25nCQkvKiBjYXN0aW5nIHBvaW50ZXIgPC0+IGludGVncmFsICovCisKKy8qCisqIEJvb2xlYW4gdHlwZS4KKyovCisjZGVmaW5lIFNLX0JPT0wJCVNLX1U4CisjZGVmaW5lIFNLX0ZBTFNFCTAKKyNkZWZpbmUgU0tfVFJVRQkJKCFTS19GQUxTRSkKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdmVyc2lvbi5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTcyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2ZXJzaW9uLmgKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXZlcnNpb24uaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjUgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDcgMDg6MTY6NTEgJAorICogUHVycG9zZToJU0sgc3BlY2lmaWMgRXJyb3IgbG9nIHN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0gIkAoIykgKEMpIFN5c0tvbm5lY3QgR21iSC4iOworc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEJ1aWxkTnVtYmVyW10gPQorCSJAKCMpU0stQlVJTEQ6IDYuMjMgUEw6IDAxIjsgCisjZW5kaWYJLyogIWRlZmluZWQobGludCkgKi8KKworI2RlZmluZSBCT09UX1NUUklORwkic2s5OGxpbjogTmV0d29yayBEZXZpY2UgRHJpdmVyIHY2LjIzXG4iIFwKKwkJCSIoQylDb3B5cmlnaHQgMTk5OS0yMDA0IE1hcnZlbGwoUikuIgorCisjZGVmaW5lIFZFUl9TVFJJTkcJIjYuMjMiCisjZGVmaW5lIERSSVZFUl9GSUxFX05BTUUJInNrOThsaW4iCisjZGVmaW5lIERSSVZFUl9SRUxfREFURQkJIkZlYi0xMy0yMDA0IgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3ZwZC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdnBkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3ZwZC5oCkBAIC0wLDAgKzEsMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t2cGQuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjE1ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzAxLzEzIDEwOjM5OjM4ICQKKyAqIFB1cnBvc2U6CURlZmluZXMgYW5kIE1hY3JvcyBmb3IgVlBEIGhhbmRsaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDMgU3lzS29ubmVjdCBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIHNrdnBkLmgJY29udGFpbnMgRGlhZ25vc3RpYyBzcGVjaWZpYyBkZWZpbmVzIGZvciBWUEQgaGFuZGxpbmcKKyAqLworCisjaWZuZGVmIF9fSU5DX1NLVlBEX0hfCisjZGVmaW5lIF9fSU5DX1NLVlBEX0hfCisKKy8qCisgKiBEZWZpbmUgUmVzb3VyY2UgVHlwZSBJZGVudGlmaWVycyBhbmQgVlBEIGtleXdvcmRzCisgKi8KKyNkZWZpbmUJUkVTX0lECQkweDgyCS8qIFJlc291cmNlIFR5cGUgSUQgU3RyaW5nIChQcm9kdWN0IE5hbWUpICovCisjZGVmaW5lIFJFU19WUERfUgkweDkwCS8qIHN0YXJ0IG9mIFZQRCByZWFkIG9ubHkgYXJlYSAqLworI2RlZmluZSBSRVNfVlBEX1cJMHg5MQkvKiBzdGFydCBvZiBWUEQgcmVhZC93cml0ZSBhcmVhICovCisjZGVmaW5lIFJFU19FTkQJCTB4NzgJLyogUmVzb3VyY2UgVHlwZSBFbmQgVGFnICovCisKKyNpZm5kZWYgVlBEX05BTUUKKyNkZWZpbmUgVlBEX05BTUUJIk5hbWUiCS8qIFByb2R1Y3QgTmFtZSwgVlBEIG5hbWUgb2YgUkVTX0lEICovCisjZW5kaWYJLyogVlBEX05BTUUgKi8KKyNkZWZpbmUgVlBEX1BOCQkiUE4iCS8qIEFkYXB0ZXIgUGFydCBOdW1iZXIgKi8KKyNkZWZpbmUJVlBEX0VDCQkiRUMiCS8qIEFkYXB0ZXIgRW5naW5lZXJpbmcgTGV2ZWwgKi8KKyNkZWZpbmUgVlBEX01OCQkiTU4iCS8qIE1hbnVmYWN0dXJlIElEICovCisjZGVmaW5lIFZQRF9TTgkJIlNOIgkvKiBTZXJpYWwgTnVtYmVyICovCisjZGVmaW5lIFZQRF9DUAkJIkNQIgkvKiBFeHRlbmRlZCBDYXBhYmlsaXR5ICovCisjZGVmaW5lIFZQRF9SVgkJIlJWIgkvKiBDaGVja3N1bSBhbmQgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJVlBEX1lBCQkiWUEiCS8qIEFzc2V0IFRhZyBJZGVudGlmaWVyICovCisjZGVmaW5lIFZQRF9WTAkJIlZMIgkvKiBGaXJzdCBFcnJvciBMb2cgTWVzc2FnZSAoU0sgc3BlY2lmaWMpICovCisjZGVmaW5lIFZQRF9WRgkJIlZGIgkvKiBTZWNvbmQgRXJyb3IgTG9nIE1lc3NhZ2UgKFNLIHNwZWNpZmljKSAqLworI2RlZmluZSBWUERfUlcJCSJSVyIJLyogUmVtYWluaW5nIFJlYWQgLyBXcml0ZSBBcmVhICovCisKKy8qICd0eXBlJyB2YWx1ZXMgZm9yIHZwZF9zZXR1cF9wYXJhKCkgKi8KKyNkZWZpbmUgVlBEX1JPX0tFWQkxCS8qIFJPIGtleXMgYXJlICJQTiIsICJFQyIsICJNTiIsICJTTiIsICJSViIgKi8KKyNkZWZpbmUgVlBEX1JXX0tFWQkyCS8qIFJXIGtleXMgYXJlICJZeCIsICJWeCIsIGFuZCAiUlciICovCisKKy8qICdvcCcgdmFsdWVzIGZvciB2cGRfc2V0dXBfcGFyYSgpICovCisjZGVmaW5lCUFERF9LRVkJCTEJLyogYWRkIHRoZSBrZXkgYXQgdGhlIHBvcyAiUlYiIG9yICJSVyIgKi8KKyNkZWZpbmUgT1dSX0tFWQkJMgkvKiBvdmVyd3JpdGUga2V5IGlmIGFscmVhZHkgZXhpc3RzICovCisKKy8qCisgKiBEZWZpbmUgUkVBRCBhbmQgV1JJVEUgQ29uc3RhbnRzLgorICovCisKKyNkZWZpbmUgVlBEX0RFVl9JRF9HRU5FU0lTIAkweDQzMDAKKworI2RlZmluZQlWUERfU0laRV9ZVUtPTgkJMjU2CisjZGVmaW5lCVZQRF9TSVpFX0dFTkVTSVMJNTEyCisjZGVmaW5lCVZQRF9TSVpFCQkJNTEyCisjZGVmaW5lIFZQRF9SRUFECTB4MDAwMAorI2RlZmluZSBWUERfV1JJVEUJMHg4MDAwCisKKyNkZWZpbmUgVlBEX1NUT1AocEFDLElvQykJVlBEX09VVDE2KHBBQyxJb0MsUENJX1ZQRF9BRFJfUkVHLFZQRF9XUklURSkKKworI2RlZmluZSBWUERfR0VUX1JFU19MRU4ocCkJKCh1bnNpZ25lZCBpbnQpIFwKKwkJCQkJKCogKFNLX1U4ICopJihwKVsxXSkgfFwKKwkJCQkJKCgqIChTS19VOCAqKSYocClbMl0pIDw8IDgpKQorI2RlZmluZSBWUERfR0VUX1ZQRF9MRU4ocCkJKCh1bnNpZ25lZCBpbnQpKCogKFNLX1U4ICopJihwKVsyXSkpCisjZGVmaW5lIFZQRF9HRVRfVkFMKHApCQkoKGNoYXIgKikmKHApWzNdKQorCisjZGVmaW5lIFZQRF9NQVhfTEVOCTUwCisKKy8qIFZQRCBzdGF0dXMgKi8KKwkvKiBiaXQgNy4uMSByZXNlcnZlZCAqLworI2RlZmluZSBWUERfVkFMSUQJKDE8PDApCS8qIFZQRCBkYXRhIGJ1ZmZlciwgdnBkX2ZyZWVfcm8sICovCisJCQkJCQkJLyogYW5kIHZwZF9mcmVlX3J3IHZhbGlkCSAqLworCisvKgorICogVlBEIHN0cnVjdHMKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc192cGRfc3RhdHVzIHsKKwl1bnNpZ25lZCBzaG9ydAlBbGlnbjAxOwkJCS8qIEFsaWdubWVudCAqLworCXVuc2lnbmVkIHNob3J0CXZwZF9zdGF0dXM7CQkJLyogVlBEIHN0YXR1cywgZGVzY3JpcHRpb24gc2VlIGFib3ZlICovCisJaW50CQkJCXZwZF9mcmVlX3JvOwkJLyogdW51c2VkIGJ5dGVzIGluIHJlYWQgb25seSBhcmVhICovCisJaW50CQkJCXZwZF9mcmVlX3J3OwkJLyogYnl0ZXMgYXZhaWxhYmxlIGluIHJlYWQvd3JpdGUgYXJlYSAqLworfSBTS19WUERfU1RBVFVTOworCit0eXBlZGVmCXN0cnVjdCBzX3ZwZCB7CisJU0tfVlBEX1NUQVRVUwl2OwkJCQkJLyogVlBEIHN0YXR1cyBzdHJ1Y3R1cmUgKi8KKwljaGFyCQkJdnBkX2J1ZltWUERfU0laRV07CS8qIFZQRCBidWZmZXIgKi8KKwlpbnQJCQkJcm9tX3NpemU7CQkJLyogVlBEIFJPTSBTaXplIGZyb20gUENJX09VUl9SRUdfMiAqLworCWludAkJCQl2cGRfc2l6ZTsJCQkvKiBzYXZlZCBWUEQtc2l6ZSAqLworfSBTS19WUEQ7CisKK3R5cGVkZWYJc3RydWN0IHNfdnBkX3BhcmEgeworCXVuc2lnbmVkIGludAlwX2xlbjsJLyogcGFyYW1ldGVyIGxlbmd0aCAqLworCWNoYXIJCQkqcF92YWw7CS8qIHBvaW50cyB0byB0aGUgdmFsdWUgKi8KK30gU0tfVlBEX1BBUkE7CisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgTGFyZ2UgUmVzb3VyY2UgVHlwZSBJZGVudGlmaWVycworICovCisKKy8qIHdhcyByZW1vdmVkIGJlY2F1c2Ugb2YgYWxpZ25tZW50IHByb2JsZW1zICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgVlBEIGtleXdvcmRzCisgKi8KK3R5cGVkZWYJc3RydWN0IHNfdnBkX2tleSB7CisJY2hhcgkJCXBfa2V5WzJdOwkvKiAyIGJ5dGVzIElEIHN0cmluZyAqLworCXVuc2lnbmVkIGNoYXIJcF9sZW47CQkvKiAxIGJ5dGUgbGVuZ3RoICovCisJY2hhcgkJCXBfdmFsOwkJLyogc3RhcnQgb2YgdGhlIHZhbHVlIHN0cmluZyAqLworfSBTS19WUERfS0VZOworCisKKy8qCisgKiBTeXN0ZW0gc3BlY2lmaWMgVlBEIG1hY3JvcworICovCisjaWZuZGVmIFNLRElBRworI2lmbmRlZiBWUERfRE9fSU8KKyNkZWZpbmUgVlBEX09VVDgocEFDLElvQyxBZGRyLFZhbCkJKHZvaWQpU2tQY2lXcml0ZUNmZ0J5dGUocEFDLEFkZHIsVmFsKQorI2RlZmluZSBWUERfT1VUMTYocEFDLElvQyxBZGRyLFZhbCkJKHZvaWQpU2tQY2lXcml0ZUNmZ1dvcmQocEFDLEFkZHIsVmFsKQorI2RlZmluZSBWUERfT1VUMzIocEFDLElvQyxBZGRyLFZhbCkJKHZvaWQpU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQyxBZGRyLFZhbCkKKyNkZWZpbmUgVlBEX0lOOChwQUMsSW9DLEFkZHIscFZhbCkJKHZvaWQpU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsQWRkcixwVmFsKQorI2RlZmluZSBWUERfSU4xNihwQUMsSW9DLEFkZHIscFZhbCkJKHZvaWQpU2tQY2lSZWFkQ2ZnV29yZChwQUMsQWRkcixwVmFsKQorI2RlZmluZSBWUERfSU4zMihwQUMsSW9DLEFkZHIscFZhbCkJKHZvaWQpU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLEFkZHIscFZhbCkKKyNlbHNlCS8qIFZQRF9ET19JTyAqLworI2RlZmluZSBWUERfT1VUOChwQUMsSW9DLEFkZHIsVmFsKQlTS19PVVQ4KElvQyxQQ0lfQyhBZGRyKSxWYWwpCisjZGVmaW5lIFZQRF9PVVQxNihwQUMsSW9DLEFkZHIsVmFsKQlTS19PVVQxNihJb0MsUENJX0MoQWRkciksVmFsKQorI2RlZmluZSBWUERfT1VUMzIocEFDLElvQyxBZGRyLFZhbCkJU0tfT1VUMzIoSW9DLFBDSV9DKEFkZHIpLFZhbCkKKyNkZWZpbmUgVlBEX0lOOChwQUMsSW9DLEFkZHIscFZhbCkJU0tfSU44KElvQyxQQ0lfQyhBZGRyKSxwVmFsKQorI2RlZmluZSBWUERfSU4xNihwQUMsSW9DLEFkZHIscFZhbCkJU0tfSU4xNihJb0MsUENJX0MoQWRkcikscFZhbCkKKyNkZWZpbmUgVlBEX0lOMzIocEFDLElvQyxBZGRyLHBWYWwpCVNLX0lOMzIoSW9DLFBDSV9DKEFkZHIpLHBWYWwpCisjZW5kaWYJLyogVlBEX0RPX0lPICovCisjZWxzZQkvKiBTS0RJQUcgKi8KKyNkZWZpbmUgVlBEX09VVDgocEFDLElvYyxBZGRyLFZhbCkgewkJCVwKKwkJaWYgKChwQUMpLT5EZ1QuRGdVc2VDZmdDeWNsZSkJCQlcCisJCQlTa1BjaVdyaXRlQ2ZnQnl0ZShwQUMsQWRkcixWYWwpOwlcCisJCWVsc2UJCQkJCQkJCQlcCisJCQlTS19PVVQ4KHBBQyxQQ0lfQyhBZGRyKSxWYWwpOwkJXAorCQl9CisjZGVmaW5lIFZQRF9PVVQxNihwQUMsSW9jLEFkZHIsVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpV3JpdGVDZmdXb3JkKHBBQyxBZGRyLFZhbCk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCVNLX09VVDE2KHBBQyxQQ0lfQyhBZGRyKSxWYWwpOwkJXAorCQl9CisjZGVmaW5lIFZQRF9PVVQzMihwQUMsSW9jLEFkZHIsVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpV3JpdGVDZmdEV29yZChwQUMsQWRkcixWYWwpOwlcCisJCWVsc2UJCQkJCQlcCisJCQlTS19PVVQzMihwQUMsUENJX0MoQWRkciksVmFsKTsgCQlcCisJCX0KKyNkZWZpbmUgVlBEX0lOOChwQUMsSW9jLEFkZHIscFZhbCkgewkJCVwKKwkJaWYgKChwQUMpLT5EZ1QuRGdVc2VDZmdDeWNsZSkgCQkJXAorCQkJU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsQWRkcixwVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfSU44KHBBQyxQQ0lfQyhBZGRyKSxwVmFsKTsgCQlcCisJCX0KKyNkZWZpbmUgVlBEX0lOMTYocEFDLElvYyxBZGRyLHBWYWwpIHsJCQlcCisJCWlmICgocEFDKS0+RGdULkRnVXNlQ2ZnQ3ljbGUpIAkJCVwKKwkJCVNrUGNpUmVhZENmZ1dvcmQocEFDLEFkZHIscFZhbCk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCVNLX0lOMTYocEFDLFBDSV9DKEFkZHIpLHBWYWwpOyAJCVwKKwkJfQorI2RlZmluZSBWUERfSU4zMihwQUMsSW9jLEFkZHIscFZhbCkgewkJCVwKKwkJaWYgKChwQUMpLT5EZ1QuRGdVc2VDZmdDeWNsZSkJCQlcCisJCQlTa1BjaVJlYWRDZmdEV29yZChwQUMsQWRkcixwVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfSU4zMihwQUMsUENJX0MoQWRkcikscFZhbCk7CQlcCisJCX0KKyNlbmRpZgkvKiBuU0tESUFHICovCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJU0tfS1JfUFJPVE8KKyNpZmRlZiBTS0RJQUcKK2V4dGVybiBTS19VMzIJVnBkUmVhZERXb3JkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWludAkJCWFkZHIpOworI2VuZGlmCS8qIFNLRElBRyAqLworCitleHRlcm4gaW50CVZwZFNldHVwUGFyYSgKKwlTS19BQwkJKnBBQywKKwljb25zdCBjaGFyCSprZXksCisJY29uc3QgY2hhcgkqYnVmLAorCWludAkJCWxlbiwKKwlpbnQJCQl0eXBlLAorCWludAkJCW9wKTsKKworZXh0ZXJuIFNLX1ZQRF9TVEFUVVMJKlZwZFN0YXQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MpOworCitleHRlcm4gaW50CVZwZEtleXMoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJY2hhcgkJKmJ1ZiwKKwlpbnQJCQkqbGVuLAorCWludAkJCSplbGVtZW50cyk7CisKK2V4dGVybiBpbnQJVnBkUmVhZCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljb25zdCBjaGFyCSprZXksCisJY2hhcgkJKmJ1ZiwKKwlpbnQJCQkqbGVuKTsKKworZXh0ZXJuIFNLX0JPT0wJVnBkTWF5V3JpdGUoCisJY2hhcgkJKmtleSk7CisKK2V4dGVybiBpbnQJVnBkV3JpdGUoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJY29uc3QgY2hhcgkqa2V5LAorCWNvbnN0IGNoYXIJKmJ1Zik7CisKK2V4dGVybiBpbnQJVnBkRGVsZXRlKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNoYXIJCSprZXkpOworCitleHRlcm4gaW50CVZwZFVwZGF0ZSgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQyk7CisKK2V4dGVybiB2b2lkCVZwZEVyckxvZygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqbXNnKTsKKworI2lmZGVmCVNLRElBRworZXh0ZXJuIGludAlWcGRSZWFkQmxvY2soCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJY2hhcgkJKmJ1ZiwKKwlpbnQJCQlhZGRyLAorCWludAkJCWxlbik7CisKK2V4dGVybiBpbnQJVnBkV3JpdGVCbG9jaygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqYnVmLAorCWludAkJCWFkZHIsCisJaW50CQkJbGVuKTsKKyNlbmRpZgkvKiBTS0RJQUcgKi8KKyNlbHNlCS8qIFNLX0tSX1BST1RPICovCitleHRlcm4gU0tfVTMyCVZwZFJlYWREV29yZCgpOworZXh0ZXJuIGludAlWcGRTZXR1cFBhcmEoKTsKK2V4dGVybiBTS19WUERfU1RBVFVTCSpWcGRTdGF0KCk7CitleHRlcm4gaW50CVZwZEtleXMoKTsKK2V4dGVybiBpbnQJVnBkUmVhZCgpOworZXh0ZXJuIFNLX0JPT0wJVnBkTWF5V3JpdGUoKTsKK2V4dGVybiBpbnQJVnBkV3JpdGUoKTsKK2V4dGVybiBpbnQJVnBkRGVsZXRlKCk7CitleHRlcm4gaW50CVZwZFVwZGF0ZSgpOworZXh0ZXJuIHZvaWQJVnBkRXJyTG9nKCk7CisjZW5kaWYJLyogU0tfS1JfUFJPVE8gKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLVlBEX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gveG1hY19paS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3htYWNfaWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjE5ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3htYWNfaWkuaApAQCAtMCwwICsxLDE1NzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOgl4bWFjX2lpLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNTIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDIgMTY6MzU6NTAgJAorICogUHVycG9zZToJRGVmaW5lcyBhbmQgTWFjcm9zIGZvciBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19YTUFDX0gKKyNkZWZpbmUgX19JTkNfWE1BQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFhNQUMgSUkgcmVnaXN0ZXJzCisgKgorICogVGhlIFhNQUMgcmVnaXN0ZXJzIGFyZSAxNiBvciAzMiBiaXRzIHdpZGUuCisgKiBUaGUgWE1BQ3MgaG9zdCBwcm9jZXNzb3IgaW50ZXJmYWNlIGlzIHNldCB0byAxNiBiaXQgbW9kZSwKKyAqIHRoZXJlZm9yZSBBTEwgcmVnaXN0ZXJzIHdpbGwgYmUgYWRkcmVzc2VkIHdpdGggMTYgYml0IGFjY2Vzc2VzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBwcm92aWRlZCB0byBhY2Nlc3MgdGhlIFhNQUMgcmVnaXN0ZXJzCisgKiBYTV9JTjE2KCksIFhNX09VVDE2LCBYTV9JTjMyKCksIFhNX09VVDMyKCksIFhNX0lOQURSKCksIFhNX09VVEFEUigpLAorICogWE1fSU5IQVNIKCksIGFuZCBYTV9PVVRIQVNIKCkuCisgKiBUaGUgbWFjcm9zIGFyZSBkZWZpbmVkIGluIFNrR2VIdy5oLgorICoKKyAqIE5vdGU6CU5BIHJlZwk9IE5ldHdvcmsgQWRkcmVzcyBlLmcgREEsIFNBIGV0Yy4KKyAqCisgKi8KKyNkZWZpbmUgWE1fTU1VX0NNRAkJMHgwMDAwCS8qIDE2IGJpdCByL3cJTU1VIENvbW1hbmQgUmVnaXN0ZXIgKi8KKwkvKiAweDAwMDQ6CQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9QT0ZGCQkJMHgwMDA4CS8qIDMyIGJpdCByL3cJUGFja2V0IE9mZnNldCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9CVVJTVAkJMHgwMDBjCS8qIDMyIGJpdCByL3cJQnVyc3QgUmVnaXN0ZXIgZm9yIGhhbGYgZHVwbGV4Ki8KKyNkZWZpbmUgWE1fMUxfVkxBTl9UQUcJMHgwMDEwCS8qIDE2IGJpdCByL3cJT25lIExldmVsIFZMQU4gVGFnIElEICovCisjZGVmaW5lIFhNXzJMX1ZMQU5fVEFHCTB4MDAxNAkvKiAxNiBiaXQgci93CVR3byBMZXZlbCBWTEFOIFRhZyBJRCAqLworCS8qIDB4MDAxOCAtIDB4MDAxZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhfQ01ECQkweDAwMjAJLyogMTYgYml0IHIvdwlUcmFuc21pdCBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RYX1JUX0xJTQkweDAwMjQJLyogMTYgYml0IHIvdwlUcmFuc21pdCBSZXRyeSBMaW1pdCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9UWF9TVElNRQkJMHgwMDI4CS8qIDE2IGJpdCByL3cJVHJhbnNtaXQgU2xvdHRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fVFhfSVBHCQkweDAwMmMJLyogMTYgYml0IHIvdwlUcmFuc21pdCBJbnRlciBQYWNrZXQgR2FwICovCisjZGVmaW5lIFhNX1JYX0NNRAkJMHgwMDMwCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1BIWV9BRERSCQkweDAwMzQJLyogMTYgYml0IHIvdwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBYTV9QSFlfREFUQQkJMHgwMDM4CS8qIDE2IGJpdCByL3cJUEhZIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiAweDAwM2M6IAkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fR1BfUE9SVAkJMHgwMDQwCS8qIDMyIGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIFBvcnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSU1TSwkJCTB4MDA0NAkvKiAxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0lTUkMJCQkweDAwNDgJLyogMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0hXX0NGRwkJMHgwMDRjCS8qIDE2IGJpdCByL3cJSGFyZHdhcmUgQ29uZmlnIFJlZ2lzdGVyICovCisJLyogMHgwMDUwIC0gMHgwMDVlOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9MT19XTQkJMHgwMDYwCS8qIDE2IGJpdCByL3cJVHggRklGTyBMb3cgV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9UWF9ISV9XTQkJMHgwMDYyCS8qIDE2IGJpdCByL3cJVHggRklGTyBIaWdoIFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgWE1fVFhfVEhSCQkweDAwNjQJLyogMTYgYml0IHIvdwlUeCBSZXF1ZXN0IFRocmVzaG9sZCAqLworI2RlZmluZSBYTV9IVF9USFIJCTB4MDA2NgkvKiAxNiBiaXQgci93CUhvc3QgUmVxdWVzdCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgWE1fUEFVU0VfREEJCTB4MDA2OAkvKiBOQSByZWcgci93CVBhdXNlIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwkvKiAweDAwNmU6IAkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fQ1RMX1BBUkEJCTB4MDA3MAkvKiAzMiBiaXQgci93CUNvbnRyb2wgUGFyYW1ldGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX01BQ19PUENPREUJMHgwMDc0CS8qIDE2IGJpdCByL3cJT3Bjb2RlIGZvciBNQUMgY29udHJvbCBmcmFtZXMgKi8KKyNkZWZpbmUgWE1fTUFDX1BUSU1FCTB4MDA3NgkvKiAxNiBiaXQgci93CVBhdXNlIHRpbWUgZm9yIE1BQyBjdHJsIGZyYW1lcyovCisjZGVmaW5lIFhNX1RYX1NUQVQJCTB4MDA3OAkvKiAzMiBiaXQgci9vCVR4IFN0YXR1cyBMSUZPIFJlZ2lzdGVyICovCisKKwkvKiAweDAwODAgLSAweDAwZmM6CTE2IE5BIHJlZyByL3cJRXhhY3QgTWF0Y2ggQWRkcmVzcyBSZWdpc3RlcnMgKi8KKwkvKiAJCQkJdXNlIHRoZSBYTV9FWE0oKSBtYWNybyB0byBhZGRyZXNzICovCisjZGVmaW5lIFhNX0VYTV9TVEFSVAkweDAwODAJLyogci93CVN0YXJ0IEFkZHJlc3Mgb2YgdGhlIEVYTSBSZWdzICovCisKKwkvKgorCSAqIFhNX0VYTShSZWcpCisJICoKKwkgKiByZXR1cm5zIHRoZSBYTUFDIGFkZHJlc3Mgb2Zmc2V0IG9mIHNwZWNpZmllZCBFeGFjdCBNYXRjaCBBZGRyIFJlZworCSAqCisJICogcGFyYToJUmVnCUVYTSByZWdpc3RlciB0byBhZGRyCSgwIC4uIDE1KQorCSAqCisJICogdXNhZ2U6CVhNX0lOQUREUihJb0MsIE1BQ18xLCBYTV9FWE0oaSksICZ2YWxbaV0pOworCSAqLworI2RlZmluZSBYTV9FWE0oUmVnKQkoWE1fRVhNX1NUQVJUICsgKChSZWcpIDw8IDMpKQorCisjZGVmaW5lIFhNX1NSQ19DSEsJCTB4MDEwMAkvKiBOQSByZWcgci93CVNvdXJjZSBDaGVjayBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1NBCQkJMHgwMTA4CS8qIE5BIHJlZyByL3cJU3RhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0hTTQkJCTB4MDExMAkvKiA2NCBiaXQgci93CUhhc2ggTWF0Y2ggQWRkcmVzcyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgWE1fUlhfTE9fV00JCTB4MDExOAkvKiAxNiBiaXQgci93CVJlY2VpdmUgTG93IFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgWE1fUlhfSElfV00JCTB4MDExYQkvKiAxNiBiaXQgci93CVJlY2VpdmUgSGlnaCBXYXRlciBNYXJrICovCisjZGVmaW5lIFhNX1JYX1RIUgkJMHgwMTFjCS8qIDMyIGJpdCByL3cJUmVjZWl2ZSBSZXF1ZXN0IFRocmVzaG9sZCAqLworI2RlZmluZSBYTV9ERVZfSUQJCTB4MDEyMAkvKiAzMiBiaXQgci9vCURldmljZSBJRCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9NT0RFCQkJMHgwMTI0CS8qIDMyIGJpdCByL3cJTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBYTV9MU0EJCQkweDAxMjgJLyogTkEgcmVnIHIvbwlMYXN0IFNvdXJjZSBSZWdpc3RlciAqLworCS8qIDB4MDEyZToJCXJlc2VydmVkICovCisjZGVmaW5lIFhNX1RTX1JFQUQJCTB4MDEzMAkvKiAzMiBiaXQgci9vCVRpbWUgU3RhbXAgUmVhZCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9UU19MT0FECQkweDAxMzQJLyogMzIgYml0IHIvbwlUaW1lIFN0YW1wIExvYWQgVmFsdWUgKi8KKwkvKiAweDAxMzggLSAweDAxZmU6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1NUQVRfQ01ECTB4MDIwMAkvKiAxNiBiaXQgci93CVN0YXRpc3RpY3MgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9SWF9DTlRfRVYJMHgwMjA0CS8qIDMyIGJpdCByL28JUnggQ291bnRlciBFdmVudCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9UWF9DTlRfRVYJMHgwMjA4CS8qIDMyIGJpdCByL28JVHggQ291bnRlciBFdmVudCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9SWF9FVl9NU0sJMHgwMjBjCS8qIDMyIGJpdCByL3cJUnggQ291bnRlciBFdmVudCBNYXNrICovCisjZGVmaW5lIFhNX1RYX0VWX01TSwkweDAyMTAJLyogMzIgYml0IHIvdwlUeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKwkvKiAweDAyMDQgLSAweDAyN2U6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1RYRl9PSwkJMHgwMjgwCS8qIDMyIGJpdCByL28JRnJhbWVzIFRyYW5zbWl0dGVkIE9LIENvbnV0ZXIgKi8KKyNkZWZpbmUgWE1fVFhPX09LX0hJCTB4MDI4NAkvKiAzMiBiaXQgci9vCU9jdGV0cyBUcmFuc21pdHRlZCBPSyBIaWdoIENudCovCisjZGVmaW5lIFhNX1RYT19PS19MTwkweDAyODgJLyogMzIgYml0IHIvbwlPY3RldHMgVHJhbnNtaXR0ZWQgT0sgTG93IENudCAqLworI2RlZmluZSBYTV9UWEZfQkNfT0sJMHgwMjhjCS8qIDMyIGJpdCByL28JQnJvYWRjYXN0IEZyYW1lcyBYbWl0dGVkIE9LICovCisjZGVmaW5lIFhNX1RYRl9NQ19PSwkweDAyOTAJLyogMzIgYml0IHIvbwlNdWx0aWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgWE1fVFhGX1VDX09LCTB4MDI5NAkvKiAzMiBiaXQgci9vCVVuaWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgWE1fVFhGX0xPTkcJCTB4MDI5OAkvKiAzMiBiaXQgci9vCVR4IExvbmcgRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEVfQlVSU1QJMHgwMjljCS8qIDMyIGJpdCByL28JVHggQnVyc3QgRXZlbnQgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfTVBBVVNFCTB4MDJhMAkvKiAzMiBiaXQgci9vCVR4IFBhdXNlIE1BQyBDdHJsIEZyYW1lIENudCAqLworI2RlZmluZSBYTV9UWEZfTUNUUkwJMHgwMmE0CS8qIDMyIGJpdCByL28JVHggTUFDIEN0cmwgRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfU05HX0NPTAkweDAyYTgJLyogMzIgYml0IHIvbwlUeCBTaW5nbGUgQ29sbGlzaW9uIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGX01VTF9DT0wJMHgwMmFjCS8qIDMyIGJpdCByL28JVHggTXVsdGlwbGUgQ29sbGlzaW9uIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGX0FCT19DT0wJMHgwMmIwCS8qIDMyIGJpdCByL28JVHggYWJvcnRlZCBkdWUgdG8gRXhjZXMuIENvbC4gKi8KKyNkZWZpbmUgWE1fVFhGX0xBVF9DT0wJMHgwMmI0CS8qIDMyIGJpdCByL28JVHggTGF0ZSBDb2xsaXNpb24gQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfREVGCQkweDAyYjgJLyogMzIgYml0IHIvbwlUeCBEZWZlcnJlZCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9FWF9ERUYJMHgwMmJjCS8qIDMyIGJpdCByL28JVHggRXhjZXNzaXZlIERlZmVyYWxsIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhFX0ZJRk9fVVIJMHgwMmMwCS8qIDMyIGJpdCByL28JVHggRklGTyBVbmRlcnJ1biBFdmVudCBDbnQgKi8KKyNkZWZpbmUgWE1fVFhFX0NTX0VSUgkweDAyYzQJLyogMzIgYml0IHIvbwlUeCBDYXJyaWVyIFNlbnNlIEVycm9yIENudCAqLworI2RlZmluZSBYTV9UWFBfVVRJTAkJMHgwMmM4CS8qIDMyIGJpdCByL28JVHggVXRpbGl6YXRpb24gaW4gJSAqLworCS8qIDB4MDJjYyAtIDB4MDJjZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhGXzY0QgkJMHgwMmQwCS8qIDMyIGJpdCByL28JNjQgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl8xMjdCCQkweDAyZDQJLyogMzIgYml0IHIvbwk2NS0xMjcgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl8yNTVCCQkweDAyZDgJLyogMzIgYml0IHIvbwkxMjgtMjU1IEJ5dGUgVHggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfNTExQgkJMHgwMmRjCS8qIDMyIGJpdCByL28JMjU2LTUxMSBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGXzEwMjNCCTB4MDJlMAkvKiAzMiBiaXQgci9vCTUxMi0xMDIzIEJ5dGUgVHggRnJhbWUgQ291bnRlciovCisjZGVmaW5lIFhNX1RYRl9NQVhfU1oJMHgwMmU0CS8qIDMyIGJpdCByL28JMTAyNC1NYXhTaXplIEJ5dGUgVHggRnJhbWUgQ250Ki8KKwkvKiAweDAyZTggLSAweDAyZmU6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1JYRl9PSwkJMHgwMzAwCS8qIDMyIGJpdCByL28JRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIFhNX1JYT19PS19ISQkweDAzMDQJLyogMzIgYml0IHIvbwlPY3RldHMgUmVjZWl2ZWQgT0sgSGlnaCBDbnQgKi8KKyNkZWZpbmUgWE1fUlhPX09LX0xPCTB4MDMwOAkvKiAzMiBiaXQgci9vCU9jdGV0cyBSZWNlaXZlZCBPSyBMb3cgQ291bnRlciovCisjZGVmaW5lIFhNX1JYRl9CQ19PSwkweDAzMGMJLyogMzIgYml0IHIvbwlCcm9hZGNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIFhNX1JYRl9NQ19PSwkweDAzMTAJLyogMzIgYml0IHIvbwlNdWx0aWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIFhNX1JYRl9VQ19PSwkweDAzMTQJLyogMzIgYml0IHIvbwlVbmljYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBYTV9SWEZfTVBBVVNFCTB4MDMxOAkvKiAzMiBiaXQgci9vCVJ4IFBhdXNlIE1BQyBDdHJsIEZyYW1lIENudCAqLworI2RlZmluZSBYTV9SWEZfTUNUUkwJMHgwMzFjCS8qIDMyIGJpdCByL28JUnggTUFDIEN0cmwgRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEZfSU5WX01QCTB4MDMyMAkvKiAzMiBiaXQgci9vCVJ4IGludmFsaWQgUGF1c2UgRnJhbWUgQ250ICovCisjZGVmaW5lIFhNX1JYRl9JTlZfTU9DCTB4MDMyNAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1lcyB3aXRoIGludi4gTUFDIE9wY29kZSovCisjZGVmaW5lIFhNX1JYRV9CVVJTVAkweDAzMjgJLyogMzIgYml0IHIvbwlSeCBCdXJzdCBFdmVudCBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRV9GTUlTUwkweDAzMmMJLyogMzIgYml0IHIvbwlSeCBNaXNzZWQgRnJhbWVzIEV2ZW50IENudCAqLworI2RlZmluZSBYTV9SWEZfRlJBX0VSUgkweDAzMzAJLyogMzIgYml0IHIvbwlSeCBGcmFtaW5nIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhFX0ZJRk9fT1YJMHgwMzM0CS8qIDMyIGJpdCByL28JUnggRklGTyBvdmVyZmxvdyBFdmVudCBDbnQgKi8KKyNkZWZpbmUgWE1fUlhGX0pBQl9QS1QJMHgwMzM4CS8qIDMyIGJpdCByL28JUnggSmFiYmVyIFBhY2tldCBGcmFtZSBDbnQgKi8KKyNkZWZpbmUgWE1fUlhFX0NBUl9FUlIJMHgwMzNjCS8qIDMyIGJpdCByL28JUnggQ2FycmllciBFdmVudCBFcnJvciBDbnQgKi8KKyNkZWZpbmUgWE1fUlhGX0xFTl9FUlIJMHgwMzQwCS8qIDMyIGJpdCByL28JUnggaW4gUmFuZ2UgTGVuZ3RoIEVycm9yICovCisjZGVmaW5lIFhNX1JYRV9TWU1fRVJSCTB4MDM0NAkvKiAzMiBiaXQgci9vCVJ4IFN5bWJvbCBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRV9TSFRfRVJSCTB4MDM0OAkvKiAzMiBiaXQgci9vCVJ4IFNob3J0IEV2ZW50IEVycm9yIENudCAqLworI2RlZmluZSBYTV9SWEVfUlVOVAkJMHgwMzRjCS8qIDMyIGJpdCByL28JUnggUnVudCBFdmVudCBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl9MTkdfRVJSCTB4MDM1MAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1lIHRvbyBMb25nIEVycm9yIENudCAqLworI2RlZmluZSBYTV9SWEZfRkNTX0VSUgkweDAzNTQJLyogMzIgYml0IHIvbwlSeCBGcmFtZSBDaGVjayBTZXEuIEVycm9yIENudCAqLworCS8qIDB4MDM1OCAtIDB4MDM1YToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhGX0NFWF9FUlIJMHgwMzVjCS8qIDMyIGJpdCByL28JUnggQ2FycmllciBFeHQgRXJyb3IgRnJhbWUgQ250Ki8KKyNkZWZpbmUgWE1fUlhQX1VUSUwJCTB4MDM2MAkvKiAzMiBiaXQgci9vCVJ4IFV0aWxpemF0aW9uIGluICUgKi8KKwkvKiAweDAzNjQgLSAweDAzNjY6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1JYRl82NEIJCTB4MDM2OAkvKiAzMiBiaXQgci9vCTY0IEJ5dGUgUnggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEZfMTI3QgkJMHgwMzZjCS8qIDMyIGJpdCByL28JNjUtMTI3IEJ5dGUgUnggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEZfMjU1QgkJMHgwMzcwCS8qIDMyIGJpdCByL28JMTI4LTI1NSBCeXRlIFJ4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhGXzUxMUIJCTB4MDM3NAkvKiAzMiBiaXQgci9vCTI1Ni01MTEgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl8xMDIzQgkweDAzNzgJLyogMzIgYml0IHIvbwk1MTItMTAyMyBCeXRlIFJ4IEZyYW1lIENvdW50ZXIqLworI2RlZmluZSBYTV9SWEZfTUFYX1NaCTB4MDM3YwkvKiAzMiBiaXQgci9vCTEwMjQtTWF4U2l6ZSBCeXRlIFJ4IEZyYW1lIENudCovCisJLyogMHgwMmU4IC0gMHgwMmZlOglyZXNlcnZlZCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogWE1BQyBCaXQgRGVmaW5pdGlvbnMKKyAqCisgKiBJZiB0aGUgYml0IGFjY2VzcyBiZWhhdmlvdXIgZGlmZmVycyBmcm9tIHRoZSByZWdpc3RlciBhY2Nlc3MgYmVoYXZpb3VyCisgKiAoci93LCByL28pIHRoaXMgaXMgZG9jdW1lbnRlZCBhZnRlciB0aGUgYml0IG51bWJlci4KKyAqIFRoZSBmb2xsb3dpbmcgYml0IGFjY2VzcyBiZWhhdmlvdXJzIGFyZSB1c2VkOgorICoJKHNjKQlzZWxmIGNsZWFyaW5nCisgKgkocm8pCXJlYWQgb25seQorICovCisKKy8qCVhNX01NVV9DTUQJMTYgYml0IHIvdwlNTVUgQ29tbWFuZCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjEzOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9NTVVfUEhZX1JEWQkoMTw8MTIpCS8qIEJpdCAxMjoJUEhZIFJlYWQgUmVhZHkgKi8KKyNkZWZpbmUgWE1fTU1VX1BIWV9CVVNZCSgxPDwxMSkJLyogQml0IDExOglQSFkgQnVzeSAqLworI2RlZmluZSBYTV9NTVVfSUdOX1BGCSgxPDwxMCkJLyogQml0IDEwOglJZ25vcmUgUGF1c2UgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTU1VX01BQ19MQgkoMTw8OSkJLyogQml0ICA5OglFbmFibGUgTUFDIExvb3BiYWNrICovCisJCQkJCQkJCS8qIEJpdCAgODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fTU1VX0ZSQ19DT0wJKDE8PDcpCS8qIEJpdCAgNzoJRm9yY2UgQ29sbGlzaW9uICovCisjZGVmaW5lIFhNX01NVV9TSU1fQ09MCSgxPDw2KQkvKiBCaXQgIDY6CVNpbXVsYXRlIENvbGxpc2lvbiAqLworI2RlZmluZSBYTV9NTVVfTk9fUFJFCSgxPDw1KQkvKiBCaXQgIDU6CU5vIE1ESU8gUHJlYW1ibGUgKi8KKyNkZWZpbmUgWE1fTU1VX0dNSUlfRkQJKDE8PDQpCS8qIEJpdCAgNDoJR01JSSB1c2VzIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFhNX01NVV9SQVRfQ1RSTAkoMTw8MykJLyogQml0ICAzOglFbmFibGUgUmF0ZSBDb250cm9sICovCisjZGVmaW5lIFhNX01NVV9HTUlJX0xPT1AgKDE8PDIpCS8qIEJpdCAgMjoJUEhZIGlzIGluIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgWE1fTU1VX0VOQV9SWAkoMTw8MSkJLyogQml0ICAxOglFbmFibGUgUmVjZWl2ZXIgKi8KKyNkZWZpbmUgWE1fTU1VX0VOQV9UWAkoMTw8MCkJLyogQml0ICAwOglFbmFibGUgVHJhbnNtaXR0ZXIgKi8KKworCisvKglYTV9UWF9DTUQJMTYgYml0IHIvdwlUcmFuc21pdCBDb21tYW5kIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhfQksyQksJCSgxPDw2KQkvKiBCaXQgIDY6CUlnbm9yIENhcnJpZXIgU2Vuc2UgKFR4IEJrMkJrKSovCisjZGVmaW5lIFhNX1RYX0VOQ19CWVAJKDE8PDUpCS8qIEJpdCAgNToJU2V0IEVuY29kZXIgaW4gQnlwYXNzIE1vZGUgKi8KKyNkZWZpbmUgWE1fVFhfU0FNX0xJTkUJKDE8PDQpCS8qIEJpdCAgNDogKHNjKQlTdGFydCB1dGlsaXphdGlvbiBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBYTV9UWF9OT19HSUdfTUQJKDE8PDMpCS8qIEJpdCAgMzoJRGlzYWJsZSBDYXJyaWVyIEV4dGVuc2lvbiAqLworI2RlZmluZSBYTV9UWF9OT19QUkUJKDE8PDIpCS8qIEJpdCAgMjoJRGlzYWJsZSBQcmVhbWJsZSBHZW5lcmF0aW9uICovCisjZGVmaW5lIFhNX1RYX05PX0NSQwkoMTw8MSkJLyogQml0ICAxOglEaXNhYmxlIENSQyBHZW5lcmF0aW9uICovCisjZGVmaW5lIFhNX1RYX0FVVE9fUEFECSgxPDwwKQkvKiBCaXQgIDA6CUVuYWJsZSBBdXRvbWF0aWMgUGFkZGluZyAqLworCisKKy8qCVhNX1RYX1JUX0xJTQkxNiBiaXQgci93CVRyYW5zbWl0IFJldHJ5IExpbWl0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlRfTElNX01TSwkweDFmCS8qIEJpdCAgNC4uMDoJVHggUmV0cnkgTGltaXQgKi8KKworCisvKglYTV9UWF9TVElNRQkxNiBiaXQgci93CVRyYW5zbWl0IFNsb3R0aW1lIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fU1RJTUVfTVNLCTB4N2YJLyogQml0ICA2Li4wOglUeCBTbG90dGltZSBiaXRzICovCisKKworLyoJWE1fVFhfSVBHCTE2IGJpdCByL3cJVHJhbnNtaXQgSW50ZXIgUGFja2V0IEdhcCAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjg6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX0lQR19NU0sJCTB4ZmYJLyogQml0ICA3Li4wOglJUEcgdmFsdWUgYml0cyAqLworCisKKy8qCVhNX1JYX0NNRAkxNiBiaXQgci93CVJlY2VpdmUgQ29tbWFuZCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjk6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1JYX0xFTkVSUl9PSyAoMTw8OCkJLyogQml0ICA4CWRvbid0IHNldCBSeCBFcnIgYml0IGZvciAqLworCQkJCQkJCQkvKgkJaW5yYW5nZSBlcnJvciBwYWNrZXRzICovCisjZGVmaW5lIFhNX1JYX0JJR19QS19PSwkoMTw8NykJLyogQml0ICA3CWRvbid0IHNldCBSeCBFcnIgYml0IGZvciAqLworCQkJCQkJCQkvKgkJanVtYm8gcGFja2V0cyAqLworI2RlZmluZSBYTV9SWF9JUEdfQ0FQCSgxPDw2KQkvKiBCaXQgIDYJcmVwbC4gdHlwZSBmaWVsZCB3aXRoIElQRyAqLworI2RlZmluZSBYTV9SWF9UUF9NRAkJKDE8PDUpCS8qIEJpdCAgNToJRW5hYmxlIHRyYW5zcGFyZW50IE1vZGUgKi8KKyNkZWZpbmUgWE1fUlhfU1RSSVBfRkNTCSgxPDw0KQkvKiBCaXQgIDQ6CUVuYWJsZSBGQ1MgU3RyaXBwaW5nICovCisjZGVmaW5lIFhNX1JYX1NFTEZfUlgJKDE8PDMpCS8qIEJpdCAgMzogCUVuYWJsZSBSeCBvZiBvd24gcGFja2V0cyAqLworI2RlZmluZSBYTV9SWF9TQU1fTElORQkoMTw8MikJLyogQml0ICAyOiAoc2MpCVN0YXJ0IHV0aWxpemF0aW9uIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIFhNX1JYX1NUUklQX1BBRAkoMTw8MSkJLyogQml0ICAxOglTdHJpcCBwYWQgYnl0ZXMgb2YgUnggZnJhbWVzICovCisjZGVmaW5lIFhNX1JYX0RJU19DRVhUCSgxPDwwKQkvKiBCaXQgIDA6CURpc2FibGUgY2FycmllciBleHQuIGNoZWNrICovCisKKworLyoJWE1fUEhZX0FERFIJMTYgYml0IHIvdwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjU6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1BIWV9BRERSX1NaCTB4MWYJLyogQml0ICA0Li4wOglQSFkgQWRkcmVzcyBiaXRzICovCisKKworLyoJWE1fR1BfUE9SVAkzMiBiaXQgci93CUdlbmVyYWwgUHVycG9zZSBQb3J0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAzMS4uNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fR1BfQU5JUAkJKDFMPDw2KQkvKiBCaXQgIDY6IChybykJQXV0by1OZWcuIGluIHByb2dyZXNzICovCisjZGVmaW5lIFhNX0dQX0ZSQ19JTlQJKDFMPDw1KQkvKiBCaXQgIDU6IChzYykJRm9yY2UgSW50ZXJydXB0ICovCisJCQkJCQkJCS8qIEJpdCAgNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fR1BfUkVTX01BQwkoMUw8PDMpCS8qIEJpdCAgMzogKHNjKQlSZXNldCBNQUMgYW5kIEZJRk9zICovCisjZGVmaW5lIFhNX0dQX1JFU19TVEFUCSgxTDw8MikJLyogQml0ICAyOiAoc2MpCVJlc2V0IHRoZSBzdGF0aXN0aWNzIG1vZHVsZSAqLworCQkJCQkJCQkvKiBCaXQgIDE6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX0dQX0lOUF9BU1MJKDFMPDwwKQkvKiBCaXQgIDA6IChybykgR1AgSW5wdXQgUGluIGFzc2VydGVkICovCisKKworLyoJWE1fSU1TSwkJMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworLyoJWE1fSVNSQwkJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fSVNfTE5LX0FFCSgxPDwxNCkgLyogQml0IDE0OglMaW5rIEFzeW5jaHJvbm91cyBFdmVudCAqLworI2RlZmluZSBYTV9JU19UWF9BQk9SVAkoMTw8MTMpIC8qIEJpdCAxMzoJVHJhbnNtaXQgQWJvcnQsIGxhdGUgQ29sLiBldGMgKi8KKyNkZWZpbmUgWE1fSVNfRlJDX0lOVAkoMTw8MTIpIC8qIEJpdCAxMjoJRm9yY2UgSU5UIGJpdCBzZXQgaW4gR1AgKi8KKyNkZWZpbmUgWE1fSVNfSU5QX0FTUwkoMTw8MTEpCS8qIEJpdCAxMToJSW5wdXQgQXNzZXJ0ZWQsIEdQIGJpdCAwIHNldCAqLworI2RlZmluZSBYTV9JU19MSVBBX1JDCSgxPDwxMCkJLyogQml0IDEwOglMaW5rIFBhcnRuZXIgcmVxdWVzdHMgY29uZmlnICovCisjZGVmaW5lIFhNX0lTX1JYX1BBR0UJKDE8PDkpCS8qIEJpdCAgOToJUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBYTV9JU19UWF9QQUdFCSgxPDw4KQkvKiBCaXQgIDg6CU5leHQgUGFnZSBMb2FkZWQgZm9yIFRyYW5zbWl0ICovCisjZGVmaW5lIFhNX0lTX0FORAkJKDE8PDcpCS8qIEJpdCAgNzoJQXV0by1OZWdvdGlhdGlvbiBEb25lICovCisjZGVmaW5lIFhNX0lTX1RTQ19PVgkoMTw8NikJLyogQml0ICA2OglUaW1lIFN0YW1wIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1fSVNfUlhDX09WCSgxPDw1KQkvKiBCaXQgIDU6CVJ4IENvdW50ZXIgRXZlbnQgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1fSVNfVFhDX09WCSgxPDw0KQkvKiBCaXQgIDQ6CVR4IENvdW50ZXIgRXZlbnQgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1fSVNfUlhGX09WCSgxPDwzKQkvKiBCaXQgIDM6CVJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19UWEZfVVIJKDE8PDIpCS8qIEJpdCAgMjoJVHJhbnNtaXQgRklGTyBVbmRlcnJ1biAqLworI2RlZmluZSBYTV9JU19UWF9DT01QCSgxPDwxKQkvKiBCaXQgIDE6CUZyYW1lIFR4IENvbXBsZXRlICovCisjZGVmaW5lIFhNX0lTX1JYX0NPTVAJKDE8PDApCS8qIEJpdCAgMDoJRnJhbWUgUnggQ29tcGxldGUgKi8KKworI2RlZmluZSBYTV9ERUZfTVNLCSh+KFhNX0lTX0lOUF9BU1MgfCBYTV9JU19MSVBBX1JDIHwgWE1fSVNfUlhfUEFHRSB8XAorCQkJWE1fSVNfQU5EIHwgWE1fSVNfUlhDX09WIHwgWE1fSVNfVFhDX09WIHwgWE1fSVNfVFhGX1VSKSkKKworCisvKglYTV9IV19DRkcJMTYgYml0IHIvdwlIYXJkd2FyZSBDb25maWcgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fSFdfR0VOX0VPUAkoMTw8MykJLyogQml0ICAzOglnZW5lcmF0ZSBFbmQgb2YgUGFja2V0IHB1bHNlICovCisjZGVmaW5lIFhNX0hXX0NPTTRTSUcJKDE8PDIpCS8qIEJpdCAgMjoJdXNlIENvbW1hIERldGVjdCBmb3IgU2lnLiBEZXQuKi8KKwkJCQkJCQkJLyogQml0ICAxOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9IV19HTUlJX01ECSgxPDwwKQkvKiBCaXQgIDA6CUdNSUkgSW50ZXJmYWNlIHNlbGVjdGVkICovCisKKworLyoJWE1fVFhfTE9fV00JMTYgYml0IHIvdwlUeCBGSUZPIExvdyBXYXRlciBNYXJrICovCisvKglYTV9UWF9ISV9XTQkxNiBiaXQgci93CVR4IEZJRk8gSGlnaCBXYXRlciBNYXJrICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTAJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhfV01fTVNLCTB4MDFmZgkvKiBCaXQgIDkuLiAwCVR4IEZJRk8gV2F0ZXJtYXJrIGJpdHMgKi8KKworLyoJWE1fVFhfVEhSCTE2IGJpdCByL3cJVHggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKy8qCVhNX0hUX1RIUgkxNiBiaXQgci93CUhvc3QgUmVxdWVzdCBUaHJlc2hvbGQgKi8KKy8qCVhNX1JYX1RIUgkxNiBiaXQgci93CVJ4IFJlcXVlc3QgVGhyZXNob2xkICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTEJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVEhSX01TSwkJMHgwM2ZmCS8qIEJpdCAxMC4uIDAJUngvVHggUmVxdWVzdCBUaHJlc2hvbGQgYml0cyAqLworCisKKy8qCVhNX1RYX1NUQVQJMzIgYml0IHIvbwlUeCBTdGF0dXMgTElGTyBSZWdpc3RlciAqLworI2RlZmluZSBYTV9TVF9WQUxJRAkJKDFVTDw8MzEpCS8qIEJpdCAzMToJU3RhdHVzIFZhbGlkICovCisjZGVmaW5lIFhNX1NUX0JZVEVfQ05UCSgweDNmZmZMPDwxNykJLyogQml0IDMwLi4xNzoJVHggZnJhbWUgTGVuZ3RoICovCisjZGVmaW5lIFhNX1NUX1JFVFJZX0NOVAkoMHgxZkw8PDEyKQkvKiBCaXQgMTYuLjEyOglSZXRyeSBDb3VudCAqLworI2RlZmluZSBYTV9TVF9FWF9DT0wJKDFMPDwxMSkJLyogQml0IDExOglFeGNlc3NpdmUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBYTV9TVF9FWF9ERUYJKDFMPDwxMCkJLyogQml0IDEwOglFeGNlc3NpdmUgRGVmZXJyYWwgKi8KKyNkZWZpbmUgWE1fU1RfQlVSU1QJCSgxTDw8OSkJCS8qIEJpdCAgOToJcC4geG1pdHRlZCBpbiBidXJzdCBtZCovCisjZGVmaW5lIFhNX1NUX0RFRkVSCQkoMUw8PDgpCQkvKiBCaXQgIDg6CXBhY2tldCB3YXMgZGVmZXJlZCAqLworI2RlZmluZSBYTV9TVF9CQwkJKDFMPDw3KQkJLyogQml0ICA3OglCcm9hZGNhc3QgcGFja2V0ICovCisjZGVmaW5lIFhNX1NUX01DCQkoMUw8PDYpCQkvKiBCaXQgIDY6CU11bHRpY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgWE1fU1RfVUMJCSgxTDw8NSkJCS8qIEJpdCAgNToJVW5pY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgWE1fU1RfVFhfVVIJCSgxTDw8NCkJCS8qIEJpdCAgNDoJRklGTyBVbmRlcnJ1biBvY2N1cmVkICovCisjZGVmaW5lIFhNX1NUX0NTX0VSUgkoMUw8PDMpCQkvKiBCaXQgIDM6CUNhcnJpZXIgU2Vuc2UgRXJyb3IgKi8KKyNkZWZpbmUgWE1fU1RfTEFUX0NPTAkoMUw8PDIpCQkvKiBCaXQgIDI6CUxhdGUgQ29sbGlzaW9uIEVycm9yICovCisjZGVmaW5lIFhNX1NUX01VTF9DT0wJKDFMPDwxKQkJLyogQml0ICAxOglNdWx0aXBsZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFhNX1NUX1NHTl9DT0wJKDFMPDwwKQkJLyogQml0ICAwOglTaW5nbGUgQ29sbGlzaW9uICovCisKKy8qCVhNX1JYX0xPX1dNCTE2IGJpdCByL3cJUmVjZWl2ZSBMb3cgV2F0ZXIgTWFyayAqLworLyoJWE1fUlhfSElfV00JMTYgYml0IHIvdwlSZWNlaXZlIEhpZ2ggV2F0ZXIgTWFyayAqLworCQkJCQkJCQkJLyogQml0IDE1Li4xMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhfV01fTVNLCTB4MDNmZgkJLyogQml0IDExLi4gMDoJUnggRklGTyBXYXRlcm1hcmsgYml0cyAqLworCisKKy8qCVhNX0RFVl9JRAkzMiBiaXQgci9vCURldmljZSBJRCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9ERVZfT1VJCSgweDAwZmZmZmZmVUw8PDgpCS8qIEJpdCAzMS4uODoJRGV2aWNlIE9VSSAqLworI2RlZmluZSBYTV9ERVZfUkVWCSgweDA3TCA8PCA1KQkJLyogQml0ICA3Li41OglDaGlwIFJldiBOdW0gKi8KKworCisvKglYTV9NT0RFCQkzMiBiaXQgci93CU1vZGUgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjc6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX01EX0VOQV9SRUoJKDFMPDwyNikJLyogQml0IDI2OglFbmFibGUgRnJhbWUgUmVqZWN0ICovCisjZGVmaW5lIFhNX01EX1NQT0VfRQkoMUw8PDI1KQkvKiBCaXQgMjU6CVNlbmQgUGF1c2Ugb24gRWRnZSAqLworCQkJCQkJCQkJLyogCQlleHRlcm4gZ2VuZXJhdGVkICovCisjZGVmaW5lIFhNX01EX1RYX1JFUAkoMUw8PDI0KQkvKiBCaXQgMjQ6CVRyYW5zbWl0IFJlcGVhdGVyIE1vZGUgKi8KKyNkZWZpbmUgWE1fTURfU1BPRkZfSQkoMUw8PDIzKQkvKiBCaXQgMjM6CVNlbmQgUGF1c2Ugb24gRklGTyBmdWxsICovCisJCQkJCQkJCQkvKgkJaW50ZXJuIGdlbmVyYXRlZCAqLworI2RlZmluZSBYTV9NRF9MRV9TVFcJKDFMPDwyMikJLyogQml0IDIyOglSeCBTdGF0IFdvcmQgaW4gTGl0dGxlIEVuZGlhbiAqLworI2RlZmluZSBYTV9NRF9UWF9DT05UCSgxTDw8MjEpCS8qIEJpdCAyMToJU2VuZCBDb250aW51b3VzICovCisjZGVmaW5lIFhNX01EX1RYX1BBVVNFCSgxTDw8MjApCS8qIEJpdCAyMDogKHNjKQlTZW5kIFBhdXNlIEZyYW1lICovCisjZGVmaW5lIFhNX01EX0FUUwkJKDFMPDwxOSkJLyogQml0IDE5OglBcHBlbmQgVGltZSBTdGFtcCAqLworI2RlZmluZSBYTV9NRF9TUE9MX0kJKDFMPDwxOCkJLyogQml0IDE4OglTZW5kIFBhdXNlIG9uIExvdyAqLworCQkJCQkJCQkJLyoJCWludGVybiBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgWE1fTURfU1BPSF9JCSgxTDw8MTcpCS8qIEJpdCAxNzoJU2VuZCBQYXVzZSBvbiBIaWdoICovCisJCQkJCQkJCQkvKgkJaW50ZXJuIGdlbmVyYXRlZCAqLworI2RlZmluZSBYTV9NRF9DQVAJCSgxTDw8MTYpCS8qIEJpdCAxNjoJQ2hlY2sgQWRkcmVzcyBQYWlyICovCisjZGVmaW5lIFhNX01EX0VOQV9IQVNICSgxTDw8MTUpCS8qIEJpdCAxNToJRW5hYmxlIEhhc2hpbmcgKi8KKyNkZWZpbmUgWE1fTURfQ1NBCQkoMUw8PDE0KQkvKiBCaXQgMTQ6CUNoZWNrIFN0YXRpb24gQWRkcmVzcyAqLworI2RlZmluZSBYTV9NRF9DQUEJCSgxTDw8MTMpCS8qIEJpdCAxMzoJQ2hlY2sgQWRkcmVzcyBBcnJheSAqLworI2RlZmluZSBYTV9NRF9SWF9NQ1RSTAkoMUw8PDEyKQkvKiBCaXQgMTI6CVJ4IE1BQyBDb250cm9sIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX1JVTlQJKDFMPDwxMSkJLyogQml0IDExOglSeCBSdW50IEZyYW1lcyAqLworI2RlZmluZSBYTV9NRF9SWF9JUkxFCSgxTDw8MTApCS8qIEJpdCAxMDoJUnggaW4gUmFuZ2UgTGVuIEVyciBGcmFtZSAqLworI2RlZmluZSBYTV9NRF9SWF9MT05HCSgxTDw8OSkJCS8qIEJpdCAgOToJUnggTG9uZyBGcmFtZSAqLworI2RlZmluZSBYTV9NRF9SWF9DUkNFCSgxTDw8OCkJCS8qIEJpdCAgODoJUnggQ1JDIEVycm9yIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX0VSUgkoMUw8PDcpCQkvKiBCaXQgIDc6CVJ4IEVycm9yIEZyYW1lICovCisjZGVmaW5lIFhNX01EX0RJU19VQwkoMUw8PDYpCQkvKiBCaXQgIDY6CURpc2FibGUgUnggVW5pY2FzdCAqLworI2RlZmluZSBYTV9NRF9ESVNfTUMJKDFMPDw1KQkJLyogQml0ICA1OglEaXNhYmxlIFJ4IE11bHRpY2FzdCAqLworI2RlZmluZSBYTV9NRF9ESVNfQkMJKDFMPDw0KQkJLyogQml0ICA0OglEaXNhYmxlIFJ4IEJyb2FkY2FzdCAqLworI2RlZmluZSBYTV9NRF9FTkFfUFJPTQkoMUw8PDMpCQkvKiBCaXQgIDM6CUVuYWJsZSBQcm9taXNjdW91cyAqLworI2RlZmluZSBYTV9NRF9FTkFfQkUJKDFMPDwyKQkJLyogQml0ICAyOglFbmFibGUgQmlnIEVuZGlhbiAqLworI2RlZmluZSBYTV9NRF9GVEYJCSgxTDw8MSkJCS8qIEJpdCAgMTogKHNjKQlGbHVzaCBUeCBGSUZPICovCisjZGVmaW5lIFhNX01EX0ZSRgkJKDFMPDwwKQkJLyogQml0ICAwOiAoc2MpCUZsdXNoIFJ4IEZJRk8gKi8KKworI2RlZmluZSBYTV9QQVVTRV9NT0RFCShYTV9NRF9TUE9FX0UgfCBYTV9NRF9TUE9MX0kgfCBYTV9NRF9TUE9IX0kpCisjZGVmaW5lIFhNX0RFRl9NT0RFCQkoWE1fTURfUlhfUlVOVCB8IFhNX01EX1JYX0lSTEUgfCBYTV9NRF9SWF9MT05HIHxcCisJCQkJWE1fTURfUlhfQ1JDRSB8IFhNX01EX1JYX0VSUiB8IFhNX01EX0NTQSB8IFhNX01EX0NBQSkKKworLyoJWE1fU1RBVF9DTUQJMTYgYml0IHIvdwlTdGF0aXN0aWNzIENvbW1hbmQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE2Li42OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9TQ19TTlBfUlhDCSgxPDw1KQkvKiBCaXQgIDU6IChzYykJU25hcCBSeCBDb3VudGVycyAqLworI2RlZmluZSBYTV9TQ19TTlBfVFhDCSgxPDw0KQkvKiBCaXQgIDQ6IChzYykJU25hcCBUeCBDb3VudGVycyAqLworI2RlZmluZSBYTV9TQ19DUF9SWEMJKDE8PDMpCS8qIEJpdCAgMzogCUNvcHkgUnggQ291bnRlcnMgQ29udGludW91c2x5ICovCisjZGVmaW5lIFhNX1NDX0NQX1RYQwkoMTw8MikJLyogQml0ICAyOglDb3B5IFR4IENvdW50ZXJzIENvbnRpbnVvdXNseSAqLworI2RlZmluZSBYTV9TQ19DTFJfUlhDCSgxPDwxKQkvKiBCaXQgIDE6IChzYykJQ2xlYXIgUnggQ291bnRlcnMgKi8KKyNkZWZpbmUgWE1fU0NfQ0xSX1RYQwkoMTw8MCkJLyogQml0ICAwOiAoc2MpIENsZWFyIFR4IENvdW50ZXJzICovCisKKworLyoJWE1fUlhfQ05UX0VWCTMyIGJpdCByL28JUnggQ291bnRlciBFdmVudCBSZWdpc3RlciAqLworLyoJWE1fUlhfRVZfTVNLCTMyIGJpdCByL3cJUnggQ291bnRlciBFdmVudCBNYXNrICovCisjZGVmaW5lIFhNUl9NQVhfU1pfT1YJKDFVTDw8MzEpCS8qIEJpdCAzMToJMTAyNC1NYXhTaXplIFJ4IENudCBPdiovCisjZGVmaW5lIFhNUl8xMDIzQl9PVgkoMUw8PDMwKQkvKiBCaXQgMzA6CTUxMi0xMDIzQnl0ZSBSeCBDbnQgT3YqLworI2RlZmluZSBYTVJfNTExQl9PVgkJKDFMPDwyOSkJLyogQml0IDI5OgkyNTYtNTExIEJ5dGUgUnggQ250IE92Ki8KKyNkZWZpbmUgWE1SXzI1NUJfT1YJCSgxTDw8MjgpCS8qIEJpdCAyODoJMTI4LTI1NSBCeXRlIFJ4IENudCBPdiovCisjZGVmaW5lIFhNUl8xMjdCX09WCQkoMUw8PDI3KQkvKiBCaXQgMjc6CTY1LTEyNyBCeXRlIFJ4IENudCBPdiAqLworI2RlZmluZSBYTVJfNjRCX09WCQkoMUw8PDI2KQkvKiBCaXQgMjY6CTY0IEJ5dGUgUnggQ250IE92ICovCisjZGVmaW5lIFhNUl9VVElMX09WCQkoMUw8PDI1KQkvKiBCaXQgMjU6CVJ4IFV0aWwgQ250IE92ZXJmbG93ICovCisjZGVmaW5lIFhNUl9VVElMX1VSCQkoMUw8PDI0KQkvKiBCaXQgMjQ6CVJ4IFV0aWwgQ250IFVuZGVycnVuICovCisjZGVmaW5lIFhNUl9DRVhfRVJSX09WCSgxTDw8MjMpCS8qIEJpdCAyMzoJQ0VYVCBFcnIgQ250IE92ICovCisJCQkJCQkJCQkvKiBCaXQgMjI6CXJlc2VydmVkICovCisjZGVmaW5lIFhNUl9GQ1NfRVJSX09WCSgxTDw8MjEpCS8qIEJpdCAyMToJUnggRkNTIEVycm9yIENudCBPdiAqLworI2RlZmluZSBYTVJfTE5HX0VSUl9PVgkoMUw8PDIwKQkvKiBCaXQgMjA6CVJ4IHRvbyBMb25nIEVyciBDbnQgT3YqLworI2RlZmluZSBYTVJfUlVOVF9PVgkJKDFMPDwxOSkJLyogQml0IDE5OglSdW50IEV2ZW50IENudCBPdiAqLworI2RlZmluZSBYTVJfU0hUX0VSUl9PVgkoMUw8PDE4KQkvKiBCaXQgMTg6CVJ4IFNob3J0IEV2IEVyciBDbnQgT3YqLworI2RlZmluZSBYTVJfU1lNX0VSUl9PVgkoMUw8PDE3KQkvKiBCaXQgMTc6CVJ4IFN5bSBFcnIgQ250IE92ICovCisJCQkJCQkJCQkvKiBCaXQgMTY6CXJlc2VydmVkICovCisjZGVmaW5lIFhNUl9DQVJfRVJSX09WCSgxTDw8MTUpCS8qIEJpdCAxNToJUnggQ2FyciBFdiBFcnIgQ250IE92ICovCisjZGVmaW5lIFhNUl9KQUJfUEtUX09WCSgxTDw8MTQpCS8qIEJpdCAxNDoJUnggSmFiYiBQYWNrZXQgQ250IE92ICovCisjZGVmaW5lIFhNUl9GSUZPX09WCQkoMUw8PDEzKQkvKiBCaXQgMTM6CVJ4IEZJRk8gT3YgRXYgQ250IE92ICovCisjZGVmaW5lIFhNUl9GUkFfRVJSX09WCSgxTDw8MTIpCS8qIEJpdCAxMjoJUnggRnJhbWluZyBFcnIgQ250IE92ICovCisjZGVmaW5lIFhNUl9GTUlTU19PVgkoMUw8PDExKQkvKiBCaXQgMTE6CVJ4IE1pc3NlZCBFdiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0JVUlNUCQkoMUw8PDEwKQkvKiBCaXQgMTA6CVJ4IEJ1cnN0IEV2ZW50IENudCBPdiAqLworI2RlZmluZSBYTVJfSU5WX01PQwkJKDFMPDw5KQkJLyogQml0ICA5OglSeCB3aXRoIGludi4gTUFDIE9DIE92Ki8KKyNkZWZpbmUgWE1SX0lOVl9NUAkJKDFMPDw4KQkJLyogQml0ICA4OglSeCBpbnYgUGF1c2UgRnJhbWUgT3YgKi8KKyNkZWZpbmUgWE1SX01DVFJMX09WCSgxTDw8NykJCS8qIEJpdCAgNzoJUnggTUFDIEN0cmwtRiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX01QQVVTRV9PVgkoMUw8PDYpCQkvKiBCaXQgIDY6CVJ4IFBhdXNlIE1BQyBDdHJsLUYgT3YqLworI2RlZmluZSBYTVJfVUNfT0tfT1YJKDFMPDw1KQkJLyogQml0ICA1OglSeCBVbmljYXN0IEZyYW1lIENudE92Ki8KKyNkZWZpbmUgWE1SX01DX09LX09WCSgxTDw8NCkJCS8qIEJpdCAgNDoJUnggTXVsdGljYXN0IENudCBPdiAqLworI2RlZmluZSBYTVJfQkNfT0tfT1YJKDFMPDwzKQkJLyogQml0ICAzOglSeCBCcm9hZGNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNUl9PS19MT19PVgkoMUw8PDIpCQkvKiBCaXQgIDI6CU9jdGV0cyBSeCBPSyBMb3cgQ250T3YqLworI2RlZmluZSBYTVJfT0tfSElfT1YJKDFMPDwxKQkJLyogQml0ICAxOglPY3RldHMgUnggT0sgSGkgQ250IE92Ki8KKyNkZWZpbmUgWE1SX09LX09WCQkoMUw8PDApCQkvKiBCaXQgIDA6CUZyYW1lcyBSZWNlaXZlZCBPayBPdiAqLworCisjZGVmaW5lIFhNUl9ERUZfTVNLCQkoWE1SX09LX0xPX09WIHwgWE1SX09LX0hJX09WKQorCisvKglYTV9UWF9DTlRfRVYJMzIgYml0IHIvbwlUeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisvKglYTV9UWF9FVl9NU0sJMzIgYml0IHIvdwlUeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjY6CXJlc2VydmVkICovCisjZGVmaW5lIFhNVF9NQVhfU1pfT1YJKDFMPDwyNSkJLyogQml0IDI1OgkxMDI0LU1heFNpemUgVHggQ250IE92Ki8KKyNkZWZpbmUgWE1UXzEwMjNCX09WCSgxTDw8MjQpCS8qIEJpdCAyNDoJNTEyLTEwMjNCeXRlIFR4IENudCBPdiovCisjZGVmaW5lIFhNVF81MTFCX09WCQkoMUw8PDIzKQkvKiBCaXQgMjM6CTI1Ni01MTEgQnl0ZSBUeCBDbnQgT3YqLworI2RlZmluZSBYTVRfMjU1Ql9PVgkJKDFMPDwyMikJLyogQml0IDIyOgkxMjgtMjU1IEJ5dGUgVHggQ250IE92Ki8KKyNkZWZpbmUgWE1UXzEyN0JfT1YJCSgxTDw8MjEpCS8qIEJpdCAyMToJNjUtMTI3IEJ5dGUgVHggQ250IE92ICovCisjZGVmaW5lIFhNVF82NEJfT1YJCSgxTDw8MjApCS8qIEJpdCAyMDoJNjQgQnl0ZSBUeCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX1VUSUxfT1YJCSgxTDw8MTkpCS8qIEJpdCAxOToJVHggVXRpbCBDbnQgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1UX1VUSUxfVVIJCSgxTDw8MTgpCS8qIEJpdCAxODoJVHggVXRpbCBDbnQgVW5kZXJydW4gKi8KKyNkZWZpbmUgWE1UX0NTX0VSUl9PVgkoMUw8PDE3KQkvKiBCaXQgMTc6CVR4IENhcnIgU2VuIEVyciBDbnQgT3YqLworI2RlZmluZSBYTVRfRklGT19VUl9PVgkoMUw8PDE2KQkvKiBCaXQgMTY6CVR4IEZJRk8gVXIgRXYgQ250IE92ICovCisjZGVmaW5lIFhNVF9FWF9ERUZfT1YJKDFMPDwxNSkJLyogQml0IDE1OglUeCBFeCBEZWZlcmFsbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0RFRgkJCSgxTDw8MTQpCS8qIEJpdCAxNDoJVHggRGVmZXJyZWQgQ250IE92ICovCisjZGVmaW5lIFhNVF9MQVRfQ09MX09WCSgxTDw8MTMpCS8qIEJpdCAxMzoJVHggTGF0ZSBDb2wgQ250IE92ICovCisjZGVmaW5lIFhNVF9BQk9fQ09MX09WCSgxTDw8MTIpCS8qIEJpdCAxMjoJVHggYWJvIGR1ZXRvIEV4IENvbCBPdiovCisjZGVmaW5lIFhNVF9NVUxfQ09MX09WCSgxTDw8MTEpCS8qIEJpdCAxMToJVHggTXVsdCBDb2wgQ250IE92ICovCisjZGVmaW5lIFhNVF9TTkdfQ09MCQkoMUw8PDEwKQkvKiBCaXQgMTA6CVR4IFNpbmdsZSBDb2wgQ250IE92ICovCisjZGVmaW5lIFhNVF9NQ1RSTF9PVgkoMUw8PDkpCQkvKiBCaXQgIDk6CVR4IE1BQyBDdHJsIENvdW50ZXIgT3YqLworI2RlZmluZSBYTVRfTVBBVVNFCQkoMUw8PDgpCQkvKiBCaXQgIDg6CVR4IFBhdXNlIE1BQyBDdHJsLUYgT3YqLworI2RlZmluZSBYTVRfQlVSU1QJCSgxTDw8NykJCS8qIEJpdCAgNzoJVHggQnVyc3QgRXZlbnQgQ250IE92ICovCisjZGVmaW5lIFhNVF9MT05HCQkoMUw8PDYpCQkvKiBCaXQgIDY6CVR4IExvbmcgRnJhbWUgQ250IE92ICovCisjZGVmaW5lIFhNVF9VQ19PS19PVgkoMUw8PDUpCQkvKiBCaXQgIDU6CVR4IFVuaWNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNVF9NQ19PS19PVgkoMUw8PDQpCQkvKiBCaXQgIDQ6CVR4IE11bHRpY2FzdCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0JDX09LX09WCSgxTDw8MykJCS8qIEJpdCAgMzoJVHggQnJvYWRjYXN0IENudCBPdiAqLworI2RlZmluZSBYTVRfT0tfTE9fT1YJKDFMPDwyKQkJLyogQml0ICAyOglPY3RldHMgVHggT0sgTG93IENudE92Ki8KKyNkZWZpbmUgWE1UX09LX0hJX09WCSgxTDw8MSkJCS8qIEJpdCAgMToJT2N0ZXRzIFR4IE9LIEhpIENudCBPdiovCisjZGVmaW5lIFhNVF9PS19PVgkJKDFMPDwwKQkJLyogQml0ICAwOglGcmFtZXMgVHggT2sgT3YgKi8KKworI2RlZmluZSBYTVRfREVGX01TSwkJKFhNVF9PS19MT19PViB8IFhNVF9PS19ISV9PVikKKworLyoKKyAqIFJlY2VpdmUgRnJhbWUgU3RhdHVzIEVuY29kaW5nCisgKi8KKyNkZWZpbmUgWE1SX0ZTX0xFTgkoMHgzZmZmVUw8PDE4KQkvKiBCaXQgMzEuLjE4OglSeCBGcmFtZSBMZW5ndGggKi8KKyNkZWZpbmUgWE1SX0ZTXzJMX1ZMQU4JKDFMPDwxNykJLyogQml0IDE3Ogl0YWdnZWQgd2ggMkxldiBWTEFOIElEKi8KKyNkZWZpbmUgWE1SX0ZTXzFMX1ZMQU4JKDFMPDwxNikJLyogQml0IDE2Ogl0YWdnZWQgd2ggMUxldiBWTEFOIElEKi8KKyNkZWZpbmUgWE1SX0ZTX0JDCQkoMUw8PDE1KQkvKiBCaXQgMTU6CUJyb2FkY2FzdCBGcmFtZSAqLworI2RlZmluZSBYTVJfRlNfTUMJCSgxTDw8MTQpCS8qIEJpdCAxNDoJTXVsdGljYXN0IEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19VQwkJKDFMPDwxMykJLyogQml0IDEzOglVbmljYXN0IEZyYW1lICovCisJCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFhNUl9GU19CVVJTVAkoMUw8PDExKQkvKiBCaXQgMTE6CUJ1cnN0IE1vZGUgKi8KKyNkZWZpbmUgWE1SX0ZTX0NFWF9FUlIJKDFMPDwxMCkJLyogQml0IDEwOglDYXJyaWVyIEV4dC4gRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTXzgwMl8zCSgxTDw8OSkJCS8qIEJpdCAgOToJODAyLjMgRnJhbWUgKi8KKyNkZWZpbmUgWE1SX0ZTX0NPTF9FUlIJKDFMPDw4KQkJLyogQml0ICA4OglDb2xsaXNpb24gRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX0NBUl9FUlIJKDFMPDw3KQkJLyogQml0ICA3OglDYXJyaWVyIEV2ZW50IEVycm9yICovCisjZGVmaW5lIFhNUl9GU19MRU5fRVJSCSgxTDw8NikJCS8qIEJpdCAgNjoJSW4tUmFuZ2UgTGVuZ3RoIEVycm9yICovCisjZGVmaW5lIFhNUl9GU19GUkFfRVJSCSgxTDw8NSkJCS8qIEJpdCAgNToJRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfUlVOVAkJKDFMPDw0KQkJLyogQml0ICA0OglSdW50IEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19MTkdfRVJSCSgxTDw8MykJCS8qIEJpdCAgMzoJR2lhbnQgKEp1bWJvKSBGcmFtZSAqLworI2RlZmluZSBYTVJfRlNfRkNTX0VSUgkoMUw8PDIpCQkvKiBCaXQgIDI6CUZyYW1lIENoZWNrIFNlcXUgRXJyICovCisjZGVmaW5lIFhNUl9GU19FUlIJCSgxTDw8MSkJCS8qIEJpdCAgMToJRnJhbWUgRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX01DVFJMCSgxTDw8MCkJCS8qIEJpdCAgMDoJTUFDIENvbnRyb2wgUGFja2V0ICovCisKKy8qCisgKiBYTVJfRlNfRVJSIHdpbGwgYmUgc2V0IGlmCisgKglYTVJfRlNfRkNTX0VSUiwgWE1SX0ZTX0xOR19FUlIsIFhNUl9GU19SVU5ULAorICoJWE1SX0ZTX0ZSQV9FUlIsIFhNUl9GU19MRU5fRVJSLCBvciBYTVJfRlNfQ0VYX0VSUgorICogaXMgc2V0LiBYTVJfRlNfTE5HX0VSUiBhbmQgWE1SX0ZTX0xFTl9FUlIgd2lsbCBpc3N1ZQorICogWE1SX0ZTX0VSUiB1bmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBSZWNlaXZlIENvbW1hbmQKKyAqIFJlZ2lzdGVyIGlzIHNldC4KKyAqLworI2RlZmluZSBYTVJfRlNfQU5ZX0VSUglYTVJfRlNfRVJSCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogWE1BQy1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciB0aGUgWE1BQworICovCisjZGVmaW5lIFBIWV9YTUFDX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfWE1BQ19TVEFUCQkweDAxCS8qIDE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfWE1BQ19JRDAJCTB4MDIJLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX0lEMQkJMHgwMwkvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQVVORV9BRFYJMHgwNAkvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9YTUFDX0FVTkVfTFAJMHgwNQkvKiAxNiBiaXQgci9vCUxpbmsgUGFydG5lciBBYmkgUmVnICovCisjZGVmaW5lIFBIWV9YTUFDX0FVTkVfRVhQCTB4MDYJLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfWE1BQ19ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX05FUEdfTFAJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiAweDA5IC0gMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9YTUFDX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX1JFU19BQkkJMHgxMAkvKiAxNiBiaXQgci9vCVBIWSBSZXNvbHZlZCBBYmlsaXR5ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQnJvYWRjb20tUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQworICovCisjZGVmaW5lIFBIWV9CQ09NX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfQkNPTV9TVEFUCQkweDAxCS8qIDE2IGJpdCByL28JUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfQkNPTV9JRDAJCTB4MDIJLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX0lEMQkJMHgwMwkvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0JDT01fQVVORV9BRFYJMHgwNAkvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9CQ09NX0FVTkVfTFAJMHgwNQkvKiAxNiBiaXQgci9vCUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9BVU5FX0VYUAkweDA2CS8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fTkVQRwkJMHgwNwkvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfQkNPTV9ORVBHX0xQCTB4MDgJLyogMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICovCisJLyogQnJvYWRjb20tc3BlY2lmaWMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBIWV9CQ09NXzEwMDBUX0NUUkwJMHgwOQkvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ3RybCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fMTAwMFRfU1RBVAkweDBhCS8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisJLyogMHgwYiAtIDB4MGU6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQkNPTV9FWFRfU1RBVAkweDBmCS8qIDE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9QX0VYVF9DVFJMCTB4MTAJLyogMTYgYml0IHIvdwlQSFkgRXh0ZW5kZWQgQ3RybCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fUF9FWFRfU1RBVAkweDExCS8qIDE2IGJpdCByL28JUEhZIEV4dGVuZGVkIFN0YXQgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX1JFX0NUUgkJMHgxMgkvKiAxNiBiaXQgci93CVJlY2VpdmUgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBQSFlfQkNPTV9GQ19DVFIJCTB4MTMJLyogMTYgYml0IHIvdwlGYWxzZSBDYXJyaWVyIFNlbnNlIENudCAqLworI2RlZmluZSBQSFlfQkNPTV9STk9fQ1RSCTB4MTQJLyogMTYgYml0IHIvdwlSZWNlaXZlciBOT1RfT0sgQ250ICovCisJLyogMHgxNSAtIDB4MTc6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQkNPTV9BVVhfQ1RSTAkweDE4CS8qIDE2IGJpdCByL3cJQXV4aWxpYXJ5IENvbnRyb2wgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX0FVWF9TVEFUCTB4MTkJLyogMTYgYml0IHIvbwlBdXhpbGlhcnkgU3RhdCBTdW1tYXJ5ICovCisjZGVmaW5lIFBIWV9CQ09NX0lOVF9TVEFUCTB4MWEJLyogMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9JTlRfTUFTSwkweDFiCS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnICovCisJLyogMHgxYzoJCXJlc2VydmVkICovCisJLyogMHgxZCAtIDB4MWY6CQl0ZXN0IHJlZ2lzdGVycyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1hcnZlbC1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciBHTUFDCisgKi8KKyNkZWZpbmUgUEhZX01BUlZfQ1RSTAkJMHgwMAkvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9NQVJWX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvbwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9NQVJWX0lEMAkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfSUQxCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTUFSVl9BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX01BUlZfQVVORV9MUAkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0FVTkVfRVhQCTB4MDYJLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9NQVJWX05FUEdfTFAJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBNYXJ2ZWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBIWV9NQVJWXzEwMDBUX0NUUkwJMHgwOQkvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ3RybCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfMTAwMFRfU1RBVAkweDBhCS8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisJLyogMHgwYiAtIDB4MGU6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfU1RBVAkweDBmCS8qIDE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9QSFlfQ1RSTAkweDEwCS8qIDE2IGJpdCByL3cJUEhZIFNwZWNpZmljIEN0cmwgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX1BIWV9TVEFUCTB4MTEJLyogMTYgYml0IHIvbwlQSFkgU3BlY2lmaWMgU3RhdCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfSU5UX01BU0sJMHgxMgkvKiAxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9JTlRfU1RBVAkweDEzCS8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfRVhUX0NUUkwJMHgxNAkvKiAxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgKi8KKyNkZWZpbmUgUEhZX01BUlZfUlhFX0NOVAkweDE1CS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIFBIWV9NQVJWX0VYVF9BRFIJMHgxNgkvKiAxNiBiaXQgci93CUV4dC4gQWQuIGZvciBDYWJsZSBEaWFnLiAqLworCS8qIDB4MTc6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTUFSVl9MRURfQ1RSTAkweDE4CS8qIDE2IGJpdCByL3cJTEVEIENvbnRyb2wgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0xFRF9PVkVSCTB4MTkJLyogMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfQ1RSTF8yCTB4MWEJLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsIDIgKi8KKyNkZWZpbmUgUEhZX01BUlZfRVhUX1BfU1RBVAkweDFiCS8qIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlYy4gU3RhdCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfQ0FCTEVfRElBRwkweDFjCS8qIDE2IGJpdCByL28JQ2FibGUgRGlhZ25vc3RpYyBSZWcgKi8KKwkvKiAweDFkIC0gMHgxZjoJCXJlc2VydmVkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTGV2ZWwgT25lLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIFhNQUMKKyAqLworI2RlZmluZSBQSFlfTE9ORV9DVFJMCQkweDAwCS8qIDE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0xPTkVfU1RBVAkJMHgwMQkvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0xPTkVfSUQwCQkweDAyCS8qIDE2IGJpdCByL28JUEhZIElEMCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9JRDEJCTB4MDMJLyogMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9MT05FX0FVTkVfQURWCTB4MDQJLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTE9ORV9BVU5FX0xQCTB4MDUJLyogMTYgYml0IHIvbwlMaW5rIFBhcnQgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9MT05FX05FUEcJCTB4MDcJLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0xPTkVfTkVQR19MUAkweDA4CS8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCS8qIExldmVsIE9uZS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX0xPTkVfMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyovCisjZGVmaW5lIFBIWV9MT05FXzEwMDBUX1NUQVQJMHgwYQkvKiAxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworCS8qIDB4MGIgLTB4MGU6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTE9ORV9FWFRfU1RBVAkweDBmCS8qIDE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9QT1JUX0NGRwkweDEwCS8qIDE2IGJpdCByL3cJUG9ydCBDb25maWd1cmF0aW9uIFJlZyovCisjZGVmaW5lIFBIWV9MT05FX1FfU1RBVAkJMHgxMQkvKiAxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfSU5UX0VOQUIJMHgxMgkvKiAxNiBiaXQgci93CUludGVycnVwdCBFbmFibGUgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX0lOVF9TVEFUCTB4MTMJLyogMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9MRURfQ0ZHCTB4MTQJLyogMTYgYml0IHIvdwlMRUQgQ29uZmlndXJhdGlvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfUE9SVF9DVFJMCTB4MTUJLyogMTYgYml0IHIvdwlQb3J0IENvbnRyb2wgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX0NJTQkJMHgxNgkvKiAxNiBiaXQgci9vCUNJTSBSZWcgKi8KKwkvKiAweDE3IC0weDFjOgkJcmVzZXJ2ZWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBOYXRpb25hbC1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciBYTUFDCisgKi8KKyNkZWZpbmUgUEhZX05BVF9DVFJMCQkweDAwCS8qIDE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9TVEFUCQkweDAxCS8qIDE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX0lEMAkJCTB4MDIJLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfSUQxCQkJMHgwMwkvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX05BVF9BVU5FX0xQCQkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICovCisjZGVmaW5lIFBIWV9OQVRfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9OQVRfTkVQRwkJMHgwNwkvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX05FUEdfTFAJCTB4MDgJLyogMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyIFJlZyAqLworCS8qIE5hdGlvbmFsLXNwZWNpZmljIHJlZ2lzdGVycyAqLworI2RlZmluZSBQSFlfTkFUXzEwMDBUX0NUUkwJMHgwOQkvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX05BVF8xMDAwVF9TVEFUCTB4MGEJLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwkvKiAweDBiIC0weDBlOgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05BVF9FWFRfU1RBVAkweDBmCS8qIDE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfRVhUX0NUUkwxCTB4MTAJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKi8KKyNkZWZpbmUgUEhZX05BVF9RX1NUQVQxCQkweDExCS8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzEgKi8KKyNkZWZpbmUgUEhZX05BVF8xMEJfT1AJCTB4MTIJLyogMTYgYml0IHIvbwkxMEJhc2UtVCBPcGVyYXRpb25zIFJlZyAqLworI2RlZmluZSBQSFlfTkFUX0VYVF9DVFJMMgkweDEzCS8qIDE2IGJpdCByL28JRXh0ZW5kZWQgQ29udHJvbCBSZWcxICovCisjZGVmaW5lIFBIWV9OQVRfUV9TVEFUMgkJMHgxNAkvKiAxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcyICovCisJLyogMHgxNSAtMHgxODoJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9OQVRfUEhZX0FERFIJMHgxOQkvKiAxNiBiaXQgci9vCVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFBIWSBiaXQgZGVmaW5pdGlvbnMKKyAqIEJpdHMgZGVmaW5lZCBhcyBQSFlfWF8uLi4sIFBIWV9CXy4uLiwgUEhZX0xfLi4uIG9yIFBIWV9OXy4uLiBhcmUKKyAqIFhNQUMvQnJvYWRjb20vTGV2ZWxPbmUvTmF0aW9uYWwvTWFydmVsbC1zcGVjaWZpYy4KKyAqIEFsbCBvdGhlciBhcmUgZ2VuZXJhbC4KKyAqLworCisvKioqKiogIFBIWV9YTUFDX0NUUkwJMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0JDT01fQ1RSTAkxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfTUFSVl9DVFJMCTE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfQ1RSTAkxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfQ1RfUkVTRVQJKDE8PDE1KQkvKiBCaXQgMTU6IChzYykJY2xlYXIgYWxsIFBIWSByZWxhdGVkIHJlZ3MgKi8KKyNkZWZpbmUgUEhZX0NUX0xPT1AJCSgxPDwxNCkJLyogQml0IDE0OgllbmFibGUgTG9vcGJhY2sgb3ZlciBQSFkgKi8KKyNkZWZpbmUgUEhZX0NUX1NQU19MU0IJKDE8PDEzKSAvKiBCaXQgMTM6IChCQyxMMSkgU3BlZWQgc2VsZWN0LCBsb3dlciBiaXQgKi8KKyNkZWZpbmUgUEhZX0NUX0FORQkJKDE8PDEyKQkvKiBCaXQgMTI6CUF1dG8tTmVnb3RpYXRpb24gRW5hYmxlZCAqLworI2RlZmluZSBQSFlfQ1RfUERPV04JKDE8PDExKQkvKiBCaXQgMTE6IChCQyxMMSkgUG93ZXIgRG93biBNb2RlICovCisjZGVmaW5lIFBIWV9DVF9JU09MCQkoMTw8MTApCS8qIEJpdCAxMDogKEJDLEwxKSBJc29sYXRlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0NUX1JFX0NGRwkoMTw8OSkJLyogQml0ICA5OiAoc2MpIFJlc3RhcnQgQXV0by1OZWdvdGlhdGlvbiAqLworI2RlZmluZSBQSFlfQ1RfRFVQX01ECSgxPDw4KQkvKiBCaXQgIDg6CUR1cGxleCBNb2RlICovCisjZGVmaW5lIFBIWV9DVF9DT0xfVFNUCSgxPDw3KQkvKiBCaXQgIDc6IChCQyxMMSkgQ29sbGlzaW9uIFRlc3QgZW5hYmxlZCAqLworI2RlZmluZSBQSFlfQ1RfU1BTX01TQgkoMTw8NikJLyogQml0ICA2OiAoQkMsTDEpIFNwZWVkIHNlbGVjdCwgdXBwZXIgYml0ICovCisJCQkJCQkJCS8qIEJpdCAgNS4uMDoJcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQSFlfQ1RfU1AxMDAwCVBIWV9DVF9TUFNfTVNCCS8qIGVuYWJsZSBzcGVlZCBvZiAxMDAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX0NUX1NQMTAwCVBIWV9DVF9TUFNfTFNCCS8qIGVuYWJsZSBzcGVlZCBvZiAgMTAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX0NUX1NQMTAJCSgwKQkJCQkvKiBlbmFibGUgc3BlZWQgb2YgICAxMCBNYnBzICovCisKKworLyoqKioqICBQSFlfWE1BQ19TVEFUCTE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0JDT01fU1RBVAkxNiBiaXQgci93CVBIWSBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9NQVJWX1NUQVQJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfTE9ORV9TVEFUCTE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKwkJCQkJCQkJLyogQml0IDE1Li45OglyZXNlcnZlZCAqLworCQkJCS8qCShCQy9MMSkgMTAwLzEwIE1icHMgY2FwIGJpdHMgaWdub3JlZCovCisjZGVmaW5lIFBIWV9TVF9FWFRfU1QJKDE8PDgpCS8qIEJpdCAgODoJRXh0ZW5kZWQgU3RhdHVzIFByZXNlbnQgKi8KKwkJCQkJCQkJLyogQml0ICA3OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfU1RfUFJFX1NVUAkoMTw8NikJLyogQml0ICA2OiAoQkMvTDEpIHByZWFtYmxlIHN1cHByZXNzaW9uICovCisjZGVmaW5lIFBIWV9TVF9BTl9PVkVSCSgxPDw1KQkvKiBCaXQgIDU6CUF1dG8tTmVnb3RpYXRpb24gT3ZlciAqLworI2RlZmluZSBQSFlfU1RfUkVNX0ZMVAkoMTw8NCkJLyogQml0ICA0OglSZW1vdGUgRmF1bHQgQ29uZGl0aW9uIE9jY3VyZWQgKi8KKyNkZWZpbmUgUEhZX1NUX0FOX0NBUAkoMTw8MykJLyogQml0ICAzOglBdXRvLU5lZ290aWF0aW9uIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUEhZX1NUX0xTWU5DCSgxPDwyKQkvKiBCaXQgIDI6CUxpbmsgU3luY2hyb25pemVkICovCisjZGVmaW5lIFBIWV9TVF9KQUJfREVUCSgxPDwxKQkvKiBCaXQgIDE6IChCQy9MMSkgSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIFBIWV9TVF9FWFRfUkVHCSgxPDwwKQkvKiBCaXQgIDA6CUV4dGVuZGVkIFJlZ2lzdGVyIGF2YWlsYWJsZSAqLworCisKKy8qKioqKglQSFlfWE1BQ19JRDEJCTE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworLyoqKioqCVBIWV9CQ09NX0lEMQkJMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisvKioqKioJUEhZX01BUlZfSUQxCQkxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKy8qKioqKglQSFlfTE9ORV9JRDEJCTE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfSTFfT1VJX01TSwkoMHgzZjw8MTApCS8qIEJpdCAxNS4uMTA6CU9yZ2FuaXphdGlvbiBVbmlxdWUgSUQgKi8KKyNkZWZpbmUgUEhZX0kxX01PRF9OVU0JKDB4M2Y8PDQpCS8qIEJpdCAgOS4uIDQ6CU1vZGVsIE51bWJlciAqLworI2RlZmluZSBQSFlfSTFfUkVWX01TSwkweDBmCQkvKiBCaXQgIDMuLiAwOglSZXZpc2lvbiBOdW1iZXIgKi8KKworLyogZGlmZmVyZW50IEJyb2FkY29tIFBIWSBJZHMgKi8KKyNkZWZpbmUgUEhZX0JDT01fSUQxX0ExCQkweDYwNDEKKyNkZWZpbmUgUEhZX0JDT01fSUQxX0IyCQkweDYwNDMKKyNkZWZpbmUgUEhZX0JDT01fSUQxX0MwCQkweDYwNDQKKyNkZWZpbmUgUEhZX0JDT01fSUQxX0M1CQkweDYwNDcKKworCisvKioqKiogIFBIWV9YTUFDX0FVTkVfQURWCTE2IGJpdCByL3cJQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50ICoqKioqLworLyoqKioqICBQSFlfWE1BQ19BVU5FX0xQCTE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICoqKioqLworI2RlZmluZSBQSFlfQU5fTlhUX1BHCSgxPDwxNSkJLyogQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLworI2RlZmluZSBQSFlfWF9BTl9BQ0sJKDE8PDE0KQkvKiBCaXQgMTQ6IChybykJQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX1hfQU5fUkZCCSgzPDwxMikJLyogQml0IDEzLi4xMjoJUmVtb3RlIEZhdWx0IEJpdHMgKi8KKwkJCQkJCQkJLyogQml0IDExLi4gOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX1hfQU5fUEFVU0UJKDM8PDcpCS8qIEJpdCAgOC4uIDc6CVBhdXNlIEJpdHMgKi8KKyNkZWZpbmUgUEhZX1hfQU5fSEQJCSgxPDw2KQkvKiBCaXQgIDY6CUhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9YX0FOX0ZECQkoMTw8NSkJLyogQml0ICA1OglGdWxsIER1cGxleCAqLworCQkJCQkJCQkvKiBCaXQgIDQuLiAwOglyZXNlcnZlZCAqLworCisvKioqKiogIFBIWV9CQ09NX0FVTkVfQURWCTE2IGJpdCByL3cJQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50ICoqKioqLworLyoqKioqICBQSFlfQkNPTV9BVU5FX0xQCTE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICoqKioqLworLyoJUEhZX0FOX05YVF9QRwkJKHNlZSBYTUFDKSBCaXQgMTU6CVJlcXVlc3QgTmV4dCBQYWdlICovCisJCQkJCQkJCS8qIEJpdCAxNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfQU5fUkYJCSgxPDwxMykJLyogQml0IDEzOglSZW1vdGUgRmF1bHQgKi8KKwkJCQkJCQkJLyogQml0IDEyOglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BTl9BU1AJKDE8PDExKQkvKiBCaXQgMTE6CUFzeW1tZXRyaWMgUGF1c2UgKi8KKyNkZWZpbmUgUEhZX0JfQU5fUEMJCSgxPDwxMCkJLyogQml0IDEwOglQYXVzZSBDYXBhYmxlICovCisJCQkJCQkJCS8qIEJpdCAgOS4uNToJMTAwLzEwIEJUIGNhcCBiaXRzIGluZ25vcmVkICovCisjZGVmaW5lIFBIWV9CX0FOX1NFTAkweDFmCS8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLworCisvKioqKiogIFBIWV9MT05FX0FVTkVfQURWCTE2IGJpdCByL3cJQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50ICoqKioqLworLyoqKioqICBQSFlfTE9ORV9BVU5FX0xQCTE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICoqKioqLworLyoJUEhZX0FOX05YVF9QRwkJKHNlZSBYTUFDKSBCaXQgMTU6CVJlcXVlc3QgTmV4dCBQYWdlICovCisJCQkJCQkJCS8qIEJpdCAxNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0xfQU5fUkYJCSgxPDwxMykJLyogQml0IDEzOglSZW1vdGUgRmF1bHQgKi8KKwkJCQkJCQkJLyogQml0IDEyOglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9BTl9BU1AJKDE8PDExKQkvKiBCaXQgMTE6CUFzeW1tZXRyaWMgUGF1c2UgKi8KKyNkZWZpbmUgUEhZX0xfQU5fUEMJCSgxPDwxMCkJLyogQml0IDEwOglQYXVzZSBDYXBhYmxlICovCisJCQkJCQkJCS8qIEJpdCAgOS4uNToJMTAwLzEwIEJUIGNhcCBiaXRzIGluZ25vcmVkICovCisjZGVmaW5lIFBIWV9MX0FOX1NFTAkweDFmCS8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLworCisvKioqKiogIFBIWV9OQVRfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9OQVRfQVVORV9MUAkJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisvKglQSFlfQU5fTlhUX1BHCQkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTl9BTl9SRgkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9OX0FOXzEwMEYJKDE8PDExKQkvKiBCaXQgMTE6CTEwMEJhc2UtVDIgRkQgU3VwcG9ydCAqLworI2RlZmluZSBQSFlfTl9BTl8xMDBICSgxPDwxMCkJLyogQml0IDEwOgkxMDBCYXNlLVQyIEhEIFN1cHBvcnQgKi8KKwkJCQkJCQkJLyogQml0ICA5Li41OgkxMDAvMTAgQlQgY2FwIGJpdHMgaW5nbm9yZWQgKi8KKyNkZWZpbmUgUEhZX05fQU5fU0VMCTB4MWYJLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisKKy8qIGZpZWxkIHR5cGUgZGVmaW5pdGlvbiBmb3IgUEhZX3hfQU5fU0VMICovCisjZGVmaW5lIFBIWV9TRUxfVFlQRQkweDAxCS8qIDAwMDAxID0gRXRoZXJuZXQgKi8KKworLyoqKioqICBQSFlfWE1BQ19BVU5FX0VYUAkxNiBiaXQgci9vCUF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uIFJlZyAqKioqKi8KKwkJCQkJCQkJLyogQml0IDE1Li40OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQU5FX0xQX05QCSgxPDwzKQkvKiBCaXQgIDM6CUxpbmsgUGFydG5lciBjYW4gTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9BTkVfTE9DX05QCSgxPDwyKQkvKiBCaXQgIDI6CUxvY2FsIFBIWSBjYW4gTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9BTkVfUlhfUEcJKDE8PDEpCS8qIEJpdCAgMToJUGFnZSBSZWNlaXZlZCAqLworCQkJCQkJCQkvKiBCaXQgIDA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fQVVORV9FWFAJMTYgYml0IHIvbwlBdXRvLU5lZ290aWF0aW9uIEV4cGFuc2lvbiBSZWcgKioqKiovCisvKioqKiogIFBIWV9MT05FX0FVTkVfRVhQCTE2IGJpdCByL28JQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnICoqKioqLworLyoqKioqICBQSFlfTUFSVl9BVU5FX0VYUAkxNiBiaXQgci9vCUF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uIFJlZyAqKioqKi8KKwkJCQkJCQkJLyogQml0IDE1Li41OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQU5FX1BBUl9ERgkoMTw8NCkJLyogQml0ICA0OglQYXJhbGxlbCBEZXRlY3Rpb24gRmF1bHQgKi8KKy8qCVBIWV9BTkVfTFBfTlAJCShzZWUgWE1BQykgQml0ICAzOglMaW5rIFBhcnRuZXIgY2FuIE5leHQgUGFnZSAqLworLyoJUEhZX0FORV9MT0NfTlAJCShzZWUgWE1BQykgQml0ICAyOglMb2NhbCBQSFkgY2FuIE5leHQgUGFnZSAqLworLyoJUEhZX0FORV9SWF9QRwkJKHNlZSBYTUFDKSBCaXQgIDE6CVBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX0FORV9MUF9DQVAJKDE8PDApCS8qIEJpdCAgMDoJTGluayBQYXJ0bmVyIEF1dG8tTmVnLiBDYXAuICovIAkKKworLyoqKioqICBQSFlfWE1BQ19ORVBHCQkxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0JDT01fTkVQRwkJMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9MT05FX05FUEcJCTE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfWE1BQ19ORVBHX0xQCTE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqKioqKi8KKy8qKioqKiAgUEhZX0JDT01fTkVQR19MUAkxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKioqKiovCisvKioqKiogIFBIWV9MT05FX05FUEdfTFAJMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICoqKioqLworI2RlZmluZSBQSFlfTlBfTU9SRQkJKDE8PDE1KQkvKiBCaXQgMTU6CU1vcmUsIE5leHQgUGFnZXMgdG8gZm9sbG93ICovCisjZGVmaW5lIFBIWV9OUF9BQ0sxCQkoMTw8MTQpCS8qIEJpdCAxNDogKHJvKQlBY2sxLCBmb3IgcmVjZWl2aW5nIGEgbWVzc2FnZSAqLworI2RlZmluZSBQSFlfTlBfTVNHX1ZBTAkoMTw8MTMpCS8qIEJpdCAxMzoJTWVzc2FnZSBQYWdlIHZhbGlkICovCisjZGVmaW5lIFBIWV9OUF9BQ0syCQkoMTw8MTIpCS8qIEJpdCAxMjoJQWNrMiwgY29tcGx5IHdpdGggbXNnIGNvbnRlbnQgKi8KKyNkZWZpbmUgUEhZX05QX1RPRwkJKDE8PDExKQkvKiBCaXQgMTE6CVRvZ2dsZSBCaXQsIGVuc3VyZSBzeW5jICovCisjZGVmaW5lIFBIWV9OUF9NU0cJCTB4MDdmZgkvKiBCaXQgMTAuLjA6CU1lc3NhZ2UgZnJvbS90byBMaW5rIFBhcnRuZXIgKi8KKworLyoKKyAqIFhNQUMtU3BlY2lmaWMKKyAqLworLyoqKioqICBQSFlfWE1BQ19FWFRfU1RBVAkxNiBiaXQgci93CUV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKyNkZWZpbmUgUEhZX1hfRVhfRkQJCSgxPDwxNSkJLyogQml0IDE1OglEZXZpY2UgU3VwcG9ydHMgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX1hfRVhfSEQJCSgxPDwxNCkJLyogQml0IDE0OglEZXZpY2UgU3VwcG9ydHMgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJLyogQml0IDEzLi4wOglyZXNlcnZlZCAqLworCisvKioqKiogIFBIWV9YTUFDX1JFU19BQkkJMTYgYml0IHIvbwlQSFkgUmVzb2x2ZWQgQWJpbGl0eSAqKioqKi8KKwkJCQkJCQkJLyogQml0IDE1Li45OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfWF9SU19QQVVTRQkoMzw8NykJLyogQml0ICA4Li43OglzZWxlY3RlZCBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1JTX0hECQkoMTw8NikJLyogQml0ICA2OglIYWxmIER1cGxleCBNb2RlIHNlbGVjdGVkICovCisjZGVmaW5lIFBIWV9YX1JTX0ZECQkoMTw8NSkJLyogQml0ICA1OglGdWxsIER1cGxleCBNb2RlIHNlbGVjdGVkICovCisjZGVmaW5lIFBIWV9YX1JTX0FCTE1JUyAoMTw8NCkJLyogQml0ICA0OglkdXBsZXggb3IgcGF1c2UgY2FwIG1pc21hdGNoICovCisjZGVmaW5lIFBIWV9YX1JTX1BBVU1JUyAoMTw8MykJLyogQml0ICAzOglwYXVzZSBjYXBhYmlsaXR5IG1pc21hdGNoICovCisJCQkJCQkJCS8qIEJpdCAgMi4uMDoJcmVzZXJ2ZWQgKi8KKy8qCisgKiBSZW1vdGUgRmF1bHQgQml0cyAoUEhZX1hfQU5fUkZCKSBlbmNvZGluZworICovCisjZGVmaW5lIFhfUkZCX09LCQkoMDw8MTIpCS8qIEJpdCAxMy4uMTIJTm8gZXJyb3JzLCBMaW5rIE9LICovCisjZGVmaW5lIFhfUkZCX0xGCQkoMTw8MTIpCS8qIEJpdCAxMy4uMTIJTGluayBGYWlsdXJlICovCisjZGVmaW5lIFhfUkZCX09GRgkJKDI8PDEyKQkvKiBCaXQgMTMuLjEyCU9mZmxpbmUgKi8KKyNkZWZpbmUgWF9SRkJfQU5fRVJSCSgzPDwxMikJLyogQml0IDEzLi4xMglBdXRvLU5lZ290aWF0aW9uIEVycm9yICovCisKKy8qCisgKiBQYXVzZSBCaXRzIChQSFlfWF9BTl9QQVVTRSBhbmQgUEhZX1hfUlNfUEFVU0UpIGVuY29kaW5nCisgKi8KKyNkZWZpbmUgUEhZX1hfUF9OT19QQVVTRQkoMDw8NykJLyogQml0ICA4Li43OglubyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1BfU1lNX01ECQkoMTw8NykJLyogQml0ICA4Li43OglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfWF9QX0FTWU1fTUQJCSgyPDw3KQkvKiBCaXQgIDguLjc6CWFzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfWF9QX0JPVEhfTUQJCSgzPDw3KQkvKiBCaXQgIDguLjc6CWJvdGggUGF1c2UgTW9kZSAqLworCisKKy8qCisgKiBCcm9hZGNvbS1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9CQ09NXzEwMDBUX0NUUkwJMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl8xMDAwQ19URVNUCSg3PDwxMykJLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLworI2RlZmluZSBQSFlfQl8xMDAwQ19NU0UJCSgxPDwxMikJLyogQml0IDEyOglNYXN0ZXIvU2xhdmUgRW5hYmxlICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX01TQwkJKDE8PDExKQkvKiBCaXQgMTE6CU0vUyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX1JECQkoMTw8MTApCS8qIEJpdCAxMDoJUmVwZWF0ZXIvRFRFICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX0FGRAkJKDE8PDkpCS8qIEJpdCAgOToJQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX0FIRAkJKDE8PDgpCS8qIEJpdCAgODoJQWR2ZXJ0aXNlIEhhbGYgRHVwbGV4ICovCisJCQkJCQkJCQkvKiBCaXQgIDcuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTVNGCQkoMTw8MTUpCS8qIEJpdCAxNToJTWFzdGVyL1NsYXZlIEZhdWx0ICovCisjZGVmaW5lIFBIWV9CXzEwMDBTX01TUgkJKDE8PDE0KQkvKiBCaXQgMTQ6CU1hc3Rlci9TbGF2ZSBSZXN1bHQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTFJTCQkoMTw8MTMpCS8qIEJpdCAxMzoJTG9jYWwgUmVjZWl2ZXIgU3RhdHVzICovCisjZGVmaW5lIFBIWV9CXzEwMDBTX1JSUwkJKDE8PDEyKQkvKiBCaXQgMTI6CVJlbW90ZSBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTFBfRkQJKDE8PDExKQkvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTFBfSEQJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfSUVDCQkweGZmCS8qIEJpdCAgNy4uMDoJSWRsZSBFcnJvciBDb3VudCAqLworCisvKioqKiogIFBIWV9CQ09NX0VYVF9TVEFUCTE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfQl9FU19YX0ZEX0NBUAkoMTw8MTUpCS8qIEJpdCAxNToJMTAwMEJhc2UtWCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9CX0VTX1hfSERfQ0FQCSgxPDwxNCkJLyogQml0IDE0OgkxMDAwQmFzZS1YIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0JfRVNfVF9GRF9DQVAJKDE8PDEzKQkvKiBCaXQgMTM6CTEwMDBCYXNlLVQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfQl9FU19UX0hEX0NBUAkoMTw8MTIpCS8qIEJpdCAxMjoJMTAwMEJhc2UtVCBIRCBjYXBhYmxlICovCisJCQkJCQkJCQkvKiBCaXQgMTEuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fUF9FWFRfQ1RSTAkxNiBiaXQgci93CVBIWSBFeHRlbmRlZCBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0JfUEVDX01BQ19QSFkJKDE8PDE1KQkvKiBCaXQgMTU6CTEwQklUL0dNSS1JbnRlcmZhY2UgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0RJU19DUk9TUwkoMTw8MTQpCS8qIEJpdCAxNDoJRGlzYWJsZSBNREkgQ3Jvc3NvdmVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19UWF9ESVMJKDE8PDEzKQkvKiBCaXQgMTM6CVR4IG91dHB1dCBEaXNhYmxlZCAqLworI2RlZmluZSBQSFlfQl9QRUNfSU5UX0RJUwkoMTw8MTIpCS8qIEJpdCAxMjoJSW50ZXJydXB0cyBEaXNhYmxlZCAqLworI2RlZmluZSBQSFlfQl9QRUNfRl9JTlQJCSgxPDwxMSkJLyogQml0IDExOglGb3JjZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0JZXzQ1CQkoMTw8MTApCS8qIEJpdCAxMDoJQnlwYXNzIDRCNUItRGVjb2RlciAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfU0NSCSgxPDw5KQkvKiBCaXQgIDk6CUJ5cGFzcyBTY3JhbWJsZXIgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0JZX01MVDMJKDE8PDgpCS8qIEJpdCAgODoJQnlwYXNzIE1MVDMgRW5jb2RlciAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfUlhBCSgxPDw3KQkvKiBCaXQgIDc6CUJ5cGFzcyBSeCBBbGlnbm0uICovCisjZGVmaW5lIFBIWV9CX1BFQ19SRVNfU0NSCSgxPDw2KQkvKiBCaXQgIDY6CVJlc2V0IFNjcmFtYmxlciAqLworI2RlZmluZSBQSFlfQl9QRUNfRU5fTFRSCSgxPDw1KQkvKiBCaXQgIDU6CUVuYSBMRUQgVHJhZmZpYyBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BFQ19MRURfT04JKDE8PDQpCS8qIEJpdCAgNDoJRm9yY2UgTEVEJ3Mgb24gKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0xFRF9PRkYJKDE8PDMpCS8qIEJpdCAgMzoJRm9yY2UgTEVEJ3Mgb2ZmICovCisjZGVmaW5lIFBIWV9CX1BFQ19FWF9JUEcJKDE8PDIpCS8qIEJpdCAgMjoJRXh0ZW5kIFR4IElQRyBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BFQ18zX0xFRAkJKDE8PDEpCS8qIEJpdCAgMToJVGhyZWUgTGluayBMRUQgbW9kZSAqLworI2RlZmluZSBQSFlfQl9QRUNfSElHSF9MQQkoMTw8MCkJLyogQml0ICAwOglHTUlJIEZJRk8gRWxhc3RpY3kgKi8KKworLyoqKioqICBQSFlfQkNPTV9QX0VYVF9TVEFUCTE2IGJpdCByL28JUEhZIEV4dGVuZGVkIFN0YXR1cyBSZWcgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9QRVNfQ1JPU1NfU1RBVAkoMTw8MTMpCS8qIEJpdCAxMzoJTURJIENyb3Nzb3ZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0lOVF9TVEFUCSgxPDwxMikJLyogQml0IDEyOglJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIFBIWV9CX1BFU19SUlMJCSgxPDwxMSkJLyogQml0IDExOglSZW1vdGUgUmVjZWl2ZXIgU3RhdC4gKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xSUwkJKDE8PDEwKQkvKiBCaXQgMTA6CUxvY2FsIFJlY2VpdmVyIFN0YXQuICovCisjZGVmaW5lIFBIWV9CX1BFU19MT0NLRUQJKDE8PDkpCS8qIEJpdCAgOToJTG9ja2VkICovCisjZGVmaW5lIFBIWV9CX1BFU19MUwkJKDE8PDgpCS8qIEJpdCAgODoJTGluayBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1JGCQkoMTw8NykJLyogQml0ICA3OglSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0NFX0VSCQkoMTw8NikJLyogQml0ICA2OglDYXJyaWVyIEV4dCBFcnJvciAqLworI2RlZmluZSBQSFlfQl9QRVNfQkFEX1NTRAkoMTw8NSkJLyogQml0ICA1OglCYWQgU1NEICovCisjZGVmaW5lIFBIWV9CX1BFU19CQURfRVNECSgxPDw0KQkvKiBCaXQgIDQ6CUJhZCBFU0QgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1JYX0VSCQkoMTw8MykJLyogQml0ICAzOglSZWNlaXZlIEVycm9yICovCisjZGVmaW5lIFBIWV9CX1BFU19UWF9FUgkJKDE8PDIpCS8qIEJpdCAgMjoJVHJhbnNtaXQgRXJyb3IgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xPQ0tfRVIJKDE8PDEpCS8qIEJpdCAgMToJTG9jayBFcnJvciAqLworI2RlZmluZSBQSFlfQl9QRVNfTUxUM19FUgkoMTw8MCkJLyogQml0ICAwOglNTFQzIGNvZGUgRXJyb3IgKi8KKworLyoqKioqICBQSFlfQkNPTV9GQ19DVFIJCTE2IGJpdCByL3cJRmFsc2UgQ2FycmllciBDb3VudGVyICoqKioqLworCQkJCQkJCQkJLyogQml0IDE1Li44OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9GQ19DVFIJCTB4ZmYJLyogQml0ICA3Li4wOglGYWxzZSBDYXJyaWVyIENvdW50ZXIgKi8KKworLyoqKioqICBQSFlfQkNPTV9STk9fQ1RSCTE2IGJpdCByL3cJUmVjZWl2ZSBOT1RfT0sgQ291bnRlciAqKioqKi8KKyNkZWZpbmUgUEhZX0JfUkNfTE9DX01TSwkweGZmMDAJLyogQml0IDE1Li44OglMb2NhbCBSeCBOT1RfT0sgY250ICovCisjZGVmaW5lIFBIWV9CX1JDX1JFTV9NU0sJMHgwMGZmCS8qIEJpdCAgNy4uMDoJUmVtb3RlIFJ4IE5PVF9PSyBjbnQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVVhfQ1RSTAkxNiBiaXQgci93CUF1eGlsaWFyeSBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0JfQUNfTF9TUUUJCSgxPDwxNSkJLyogQml0IDE1OglMb3cgU3F1ZWxjaCAqLworI2RlZmluZSBQSFlfQl9BQ19MT05HX1BBQ0sJKDE8PDE0KQkvKiBCaXQgMTQ6CVJ4IExvbmcgUGFja2V0cyAqLworI2RlZmluZSBQSFlfQl9BQ19FUl9DVFJMCSgzPDwxMikJLyogQml0IDEzLi4xMjoJRWRnZXJhdGUgQ29udHJvbCAqLworCQkJCQkJCQkJLyogQml0IDExOglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BQ19UWF9UU1QJCSgxPDwxMCkgLyogQml0IDEwOglUeCB0ZXN0IGJpdCwgYWx3YXlzIDEgKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FDX0RJU19QUkYJKDE8PDcpCS8qIEJpdCAgNzoJZGlzIHBhcnQgcmVzcCBmaWx0ZXIgKi8KKwkJCQkJCQkJCS8qIEJpdCAgNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfQUNfRElTX1BNCQkoMTw8NSkJLyogQml0ICA1OglkaXMgcG93ZXIgbWFuYWdlbWVudCAqLworCQkJCQkJCQkJLyogQml0ICA0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BQ19ESUFHCQkoMTw8MykJLyogQml0ICAzOglEaWFnbm9zdGljIE1vZGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAgMi4uIDA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fQVVYX1NUQVQJMTYgYml0IHIvbwlBdXhpbGlhcnkgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0JfQVNfQU5fQwkJKDE8PDE1KQkvKiBCaXQgMTU6CUF1dG9OZWcgY29tcGxldGUgKi8KKyNkZWZpbmUgUEhZX0JfQVNfQU5fQ0EJCSgxPDwxNCkJLyogQml0IDE0OglBTiBDb21wbGV0ZSBBY2sgKi8KKyNkZWZpbmUgUEhZX0JfQVNfQU5BQ0tfRAkoMTw8MTMpCS8qIEJpdCAxMzoJQU4gQWNrIERldGVjdCAqLworI2RlZmluZSBQSFlfQl9BU19BTkFCX0QJCSgxPDwxMikJLyogQml0IDEyOglBTiBBYmlsaXR5IERldGVjdCAqLworI2RlZmluZSBQSFlfQl9BU19OUFcJCSgxPDwxMSkJLyogQml0IDExOglBTiBOZXh0IFBhZ2UgV2FpdCAqLworI2RlZmluZSBQSFlfQl9BU19BTl9SRVNfTVNLCSg3PDw4KQkvKiBCaXQgMTAuLjg6CUFOIEhEQyAqLworI2RlZmluZSBQSFlfQl9BU19QREYJCSgxPDw3KQkvKiBCaXQgIDc6CVBhcmFsbGVsIERldGVjdC4gRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0JfQVNfUkYJCQkoMTw8NikJLyogQml0ICA2OglSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0JfQVNfQU5QX1IJCSgxPDw1KQkvKiBCaXQgIDU6CUFOIFBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfQVNfTFBfQU5BQgkoMTw8NCkJLyogQml0ICA0OglMUCBBTiBBYmlsaXR5ICovCisjZGVmaW5lIFBIWV9CX0FTX0xQX05QQUIJKDE8PDMpCS8qIEJpdCAgMzoJTFAgTmV4dCBQYWdlIEFiaWxpdHkgKi8KKyNkZWZpbmUgUEhZX0JfQVNfTFMJCQkoMTw8MikJLyogQml0ICAyOglMaW5rIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl9BU19QUlIJCSgxPDwxKQkvKiBCaXQgIDE6CVBhdXNlIFJlc29sdXRpb24tUnggKi8KKyNkZWZpbmUgUEhZX0JfQVNfUFJUCQkoMTw8MCkJLyogQml0ICAwOglQYXVzZSBSZXNvbHV0aW9uLVR4ICovCisKKyNkZWZpbmUgUEhZX0JfQVNfUEFVU0VfTVNLCShQSFlfQl9BU19QUlIgfCBQSFlfQl9BU19QUlQpCisKKy8qKioqKiAgUEhZX0JDT01fSU5UX1NUQVQJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX0JDT01fSU5UX01BU0sJMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWcgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTU6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0lTX1BTRQkJKDE8PDE0KQkvKiBCaXQgMTQ6CVBhaXIgU3dhcCBFcnJvciAqLworI2RlZmluZSBQSFlfQl9JU19NRFhJX1NDCSgxPDwxMykJLyogQml0IDEzOglNRElYIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfSENUCQkoMTw8MTIpCS8qIEJpdCAxMjoJY291bnRlciBhYm92ZSAzMmsgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTENUCQkoMTw8MTEpCS8qIEJpdCAxMToJY291bnRlciBhYm92ZSAxMjggKi8KKyNkZWZpbmUgUEhZX0JfSVNfQU5fUFIJCSgxPDwxMCkJLyogQml0IDEwOglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFBIWV9CX0lTX05PX0hEQ0wJKDE8PDkpCS8qIEJpdCAgOToJTm8gSENEIExpbmsgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTk9fSERDCQkoMTw8OCkJLyogQml0ICA4OglObyBIQ0QgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTkVHX1VTSERDCSgxPDw3KQkvKiBCaXQgIDc6CU5lZ290aWF0ZWQgVW5zdXAuIEhDRCAqLworI2RlZmluZSBQSFlfQl9JU19TQ1JfU19FUgkoMTw8NikJLyogQml0ICA2OglTY3JhbWJsZXIgU3luYyBFcnJvciAqLworI2RlZmluZSBQSFlfQl9JU19SUlNfQ0hBTkdFCSgxPDw1KQkvKiBCaXQgIDU6CVJlbW90ZSBSeCBTdGF0IENoYW5nZSAqLworI2RlZmluZSBQSFlfQl9JU19MUlNfQ0hBTkdFCSgxPDw0KQkvKiBCaXQgIDQ6CUxvY2FsIFJ4IFN0YXQgQ2hhbmdlICovCisjZGVmaW5lIFBIWV9CX0lTX0RVUF9DSEFOR0UJKDE8PDMpCS8qIEJpdCAgMzoJRHVwbGV4IE1vZGUgQ2hhbmdlICovCisjZGVmaW5lIFBIWV9CX0lTX0xTUF9DSEFOR0UJKDE8PDIpCS8qIEJpdCAgMjoJTGluayBTcGVlZCBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTFNUX0NIQU5HRQkoMTw8MSkJLyogQml0ICAxOglMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9CX0lTX0NSQ19FUgkJKDE8PDApCS8qIEJpdCAgMDoJQ1JDIEVycm9yICovCisKKyNkZWZpbmUgUEhZX0JfREVGX01TSwkofihQSFlfQl9JU19BTl9QUiB8IFBIWV9CX0lTX0xTVF9DSEFOR0UpKQorCisvKiBQYXVzZSBCaXRzIChQSFlfQl9BTl9BU1AgYW5kIFBIWV9CX0FOX1BDKSBlbmNvZGluZyAqLworI2RlZmluZSBQSFlfQl9QX05PX1BBVVNFCSgwPDwxMCkJLyogQml0IDExLi4xMDoJbm8gUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfQl9QX1NZTV9NRAkJKDE8PDEwKQkvKiBCaXQgMTEuLjEwOglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfQl9QX0FTWU1fTUQJCSgyPDwxMCkJLyogQml0IDExLi4xMDoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BfQk9USF9NRAkJKDM8PDEwKQkvKiBCaXQgMTEuLjEwOglib3RoIFBhdXNlIE1vZGUgKi8KKworLyoKKyAqIFJlc29sdmVkIER1cGxleCBtb2RlIGFuZCBDYXBhYmlsaXRpZXMgKEF1eCBTdGF0dXMgU3VtbWFyeSBSZWcpCisgKi8KKyNkZWZpbmUgUEhZX0JfUkVTXzEwMDBGRAkoNzw8OCkJLyogQml0IDEwLi44OgkxMDAwQmFzZS1UIEZ1bGwgRHVwLiAqLworI2RlZmluZSBQSFlfQl9SRVNfMTAwMEhECSg2PDw4KQkvKiBCaXQgMTAuLjg6CTEwMDBCYXNlLVQgSGFsZiBEdXAuICovCisvKiBvdGhlcnM6IDEwMC8xMDogaW52YWxpZCBmb3IgdXMgKi8KKworLyoKKyAqIExldmVsIE9uZS1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9MT05FXzEwMDBUX0NUUkwJMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF8xMDAwQ19URVNUCSg3PDwxMykJLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLworI2RlZmluZSBQSFlfTF8xMDAwQ19NU0UJCSgxPDwxMikJLyogQml0IDEyOglNYXN0ZXIvU2xhdmUgRW5hYmxlICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX01TQwkJKDE8PDExKQkvKiBCaXQgMTE6CU0vUyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX1JECQkoMTw8MTApCS8qIEJpdCAxMDoJUmVwZWF0ZXIvRFRFICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX0FGRAkJKDE8PDkpCS8qIEJpdCAgOToJQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX0FIRAkJKDE8PDgpCS8qIEJpdCAgODoJQWR2ZXJ0aXNlIEhhbGYgRHVwbGV4ICovCisJCQkJCQkJCQkvKiBCaXQgIDcuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0xPTkVfMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTVNGCQkoMTw8MTUpCS8qIEJpdCAxNToJTWFzdGVyL1NsYXZlIEZhdWx0ICovCisjZGVmaW5lIFBIWV9MXzEwMDBTX01TUgkJKDE8PDE0KQkvKiBCaXQgMTQ6CU1hc3Rlci9TbGF2ZSBSZXN1bHQgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTFJTCQkoMTw8MTMpCS8qIEJpdCAxMzoJTG9jYWwgUmVjZWl2ZXIgU3RhdHVzICovCisjZGVmaW5lIFBIWV9MXzEwMDBTX1JSUwkJKDE8PDEyKQkvKiBCaXQgMTI6CVJlbW90ZSBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTFBfRkQJKDE8PDExKQkvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTFBfSEQJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfSUVDCQkweGZmCS8qIEJpdCAgNy4uMDoJSWRsZSBFcnJvciBDb3VudCAqLworCisvKioqKiogIFBIWV9MT05FX0VYVF9TVEFUCTE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfTF9FU19YX0ZEX0NBUAkoMTw8MTUpCS8qIEJpdCAxNToJMTAwMEJhc2UtWCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9MX0VTX1hfSERfQ0FQCSgxPDwxNCkJLyogQml0IDE0OgkxMDAwQmFzZS1YIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0xfRVNfVF9GRF9DQVAJKDE8PDEzKQkvKiBCaXQgMTM6CTEwMDBCYXNlLVQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTF9FU19UX0hEX0NBUAkoMTw8MTIpCS8qIEJpdCAxMjoJMTAwMEJhc2UtVCBIRCBjYXBhYmxlICovCisJCQkJCQkJCQkvKiBCaXQgMTEuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0xPTkVfUE9SVF9DRkcJMTYgYml0IHIvdwlQb3J0IENvbmZpZ3VyYXRpb24gUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9QQ19SRVBfTU9ERQkoMTw8MTUpCS8qIEJpdCAxNToJUmVwZWF0ZXIgTW9kZSAqLworCQkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9QQ19UWF9ESVMJCSgxPDwxMykJLyogQml0IDEzOglUeCBvdXRwdXQgRGlzYWJsZWQgKi8KKyNkZWZpbmUgUEhZX0xfUENfQllfU0NSCQkoMTw8MTIpCS8qIEJpdCAxMjoJQnlwYXNzIFNjcmFtYmxlciAqLworI2RlZmluZSBQSFlfTF9QQ19CWV80NQkJKDE8PDExKQkvKiBCaXQgMTE6CUJ5cGFzcyA0QjVCLURlY29kZXIgKi8KKyNkZWZpbmUgUEhZX0xfUENfSkFCX0RJUwkoMTw8MTApCS8qIEJpdCAxMDoJSmFiYmVyIERpc2FibGVkICovCisjZGVmaW5lIFBIWV9MX1BDX1NRRQkJKDE8PDkpCS8qIEJpdCAgOToJRW5hYmxlIEhlYXJ0YmVhdCAqLworI2RlZmluZSBQSFlfTF9QQ19UUF9MT09QCSgxPDw4KQkvKiBCaXQgIDg6CVRQIExvb3BiYWNrICovCisjZGVmaW5lIFBIWV9MX1BDX1NTUwkJKDE8PDcpCS8qIEJpdCAgNzoJU21hcnQgU3BlZWQgU2VsZWN0aW9uICovCisjZGVmaW5lIFBIWV9MX1BDX0ZJRk9fU0laRQkoMTw8NikJLyogQml0ICA2OglGSUZPIFNpemUgKi8KKyNkZWZpbmUgUEhZX0xfUENfUFJFX0VOCQkoMTw8NSkJLyogQml0ICA1OglQcmVhbWJsZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX0xfUENfQ0lNCQkoMTw8NCkJLyogQml0ICA0OglDYXJyaWVyIEludGVncml0eSBNb24gKi8KKyNkZWZpbmUgUEhZX0xfUENfMTBfU0VSCQkoMTw8MykJLyogQml0ICAzOglVc2UgU2VyaWFsIE91dHB1dCAqLworI2RlZmluZSBQSFlfTF9QQ19BTklTT0wJCSgxPDwyKQkvKiBCaXQgIDI6CVVuaXNvbGF0ZSBQb3J0ICovCisjZGVmaW5lIFBIWV9MX1BDX1RFTl9CSVQJKDE8PDEpCS8qIEJpdCAgMToJMTBiaXQgaWZhY2UgbW9kZSBvbiAqLworI2RlZmluZSBQSFlfTF9QQ19BTFRDTE9DSwkoMTw8MCkJLyogQml0ICAwOiAocm8pCUFMVENMT0NLIE1vZGUgb24gKi8KKworLyoqKioqICBQSFlfTE9ORV9RX1NUQVQJCTE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0xfUVNfRF9SQVRFCQkoMzw8MTQpCS8qIEJpdCAxNS4uMTQ6CURhdGEgUmF0ZSAqLworI2RlZmluZSBQSFlfTF9RU19UWF9TVEFUCSgxPDwxMykJLyogQml0IDEzOglUcmFuc21pdHRpbmcgKi8KKyNkZWZpbmUgUEhZX0xfUVNfUlhfU1RBVAkoMTw8MTIpCS8qIEJpdCAxMjoJUmVjZWl2aW5nICovCisjZGVmaW5lIFBIWV9MX1FTX0NPTF9TVEFUCSgxPDwxMSkJLyogQml0IDExOglDb2xsaXNpb24gKi8KKyNkZWZpbmUgUEhZX0xfUVNfTF9TVEFUCQkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBpcyB1cCAqLworI2RlZmluZSBQSFlfTF9RU19EVVBfTU9ECSgxPDw5KQkvKiBCaXQgIDk6CUZ1bGwvSGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX0xfUVNfQU4JCQkoMTw8OCkJLyogQml0ICA4OglBdXRvTmVnIGlzIE9uICovCisjZGVmaW5lIFBIWV9MX1FTX0FOX0MJCSgxPDw3KQkvKiBCaXQgIDc6CUFOIGlzIENvbXBsZXRlICovCisjZGVmaW5lIFBIWV9MX1FTX0xMRQkJKDc8PDQpCS8qIEJpdCAgNjoJTGluZSBMZW5ndGggRXN0aW0uICovCisjZGVmaW5lIFBIWV9MX1FTX1BBVVNFCQkoMTw8MykJLyogQml0ICAzOglMUCBhZHZlcnRpc2VkIFBhdXNlICovCisjZGVmaW5lIFBIWV9MX1FTX0FTX1BBVVNFCSgxPDwyKQkvKiBCaXQgIDI6CUxQIGFkdi4gYXN5bS4gUGF1c2UgKi8KKyNkZWZpbmUgUEhZX0xfUVNfSVNPTEFURQkoMTw8MSkJLyogQml0ICAxOglDSU0gSXNvbGF0ZWQgKi8KKyNkZWZpbmUgUEhZX0xfUVNfRVZFTlQJCSgxPDwwKQkvKiBCaXQgIDA6CUV2ZW50IGhhcyBvY2N1cnJlZCAqLworCisvKioqKiogIFBIWV9MT05FX0lOVF9FTkFCCTE2IGJpdCByL3cJSW50ZXJydXB0IEVuYWJsZSBSZWcgKioqKiovCisvKioqKiogIFBIWV9MT05FX0lOVF9TVEFUCTE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9JU19BTl9GCQkoMTw8MTMpCS8qIEJpdCAxMzoJQXV0by1OZWdvdGlhdGlvbiBmYXVsdCAqLworCQkJCQkJCQkJLyogQml0IDEyOglub3QgZGVzY3JpYmVkICovCisjZGVmaW5lIFBIWV9MX0lTX0NST1NTCQkoMTw8MTEpCS8qIEJpdCAxMToJQ3Jvc3NvdmVyIHVzZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfUE9MCQkoMTw8MTApCS8qIEJpdCAxMDoJUG9sYXJpdHkgY29ycmVjdC4gdXNlZCAqLworI2RlZmluZSBQSFlfTF9JU19TUwkJCSgxPDw5KQkvKiBCaXQgIDk6CVNtYXJ0IFNwZWVkIERvd25ncmFkZSAqLworI2RlZmluZSBQSFlfTF9JU19DRlVMTAkJKDE8PDgpCS8qIEJpdCAgODoJQ291bnRlciBGdWxsICovCisjZGVmaW5lIFBIWV9MX0lTX0FOX0MJCSgxPDw3KQkvKiBCaXQgIDc6CUF1dG9OZWcgQ29tcGxldGUgKi8KKyNkZWZpbmUgUEhZX0xfSVNfU1BFRUQJCSgxPDw2KQkvKiBCaXQgIDY6CVNwZWVkIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfRFVQCQkoMTw8NSkJLyogQml0ICA1OglEdXBsZXggQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTF9JU19MUwkJCSgxPDw0KQkvKiBCaXQgIDQ6CUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfSVNPTAkJKDE8PDMpCS8qIEJpdCAgMzoJSXNvbGF0ZSBPY2N1cmVkICovCisjZGVmaW5lIFBIWV9MX0lTX01ESU5UCQkoMTw8MikJLyogQml0ICAyOiAocm8pCVNUQVQ6IE1JSSBJbnQgUGVuZGluZyAqLworI2RlZmluZSBQSFlfTF9JU19JTlRFTgkJKDE8PDEpCS8qIEJpdCAgMToJRU5BQjogRW5hYmxlIElSUXMgKi8KKyNkZWZpbmUgUEhZX0xfSVNfRk9SQ0UJCSgxPDwwKQkvKiBCaXQgIDA6CUVOQUI6IEZvcmNlIEludGVycnVwdCAqLworCisvKiBpbnQuIG1hc2sgKi8KKyNkZWZpbmUgUEhZX0xfREVGX01TSwkJKFBIWV9MX0lTX0xTIHwgUEhZX0xfSVNfSVNPTCB8IFBIWV9MX0lTX0lOVEVOKQorCisvKioqKiogIFBIWV9MT05FX0xFRF9DRkcJMTYgYml0IHIvdwlMRUQgQ29uZmlndXJhdGlvbiBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MX0xDX0xFREMJCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJQ29sL0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19MRURSCQkoMzw8MTIpCS8qIEJpdCAxMy4uMTI6CVJ4L0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19MRURUCQkoMzw8MTApCS8qIEJpdCAxMS4uMTA6CVR4L0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19MRURHCQkoMzw8OCkJLyogQml0ICA5Li44OglHaWdhL0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19MRURTCQkoMzw8NikJLyogQml0ICA3Li42OgkxMC0xMDAvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFREwJCSgzPDw0KQkvKiBCaXQgIDUuLjQ6CUxpbmsvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFREYJCSgzPDwyKQkvKiBCaXQgIDMuLjI6CUR1cGxleC9CbGluay9Pbi9PZmYgKi8KKyNkZWZpbmUgUEhZX0xfTENfUFNUUkVDSAkoMTw8MSkJLyogQml0ICAxOglTdHJlY2ggTEVEIFB1bHNlcyAqLworI2RlZmluZSBQSFlfTF9MQ19GUkVRCQkoMTw8MCkJLyogQml0ICAwOgkzMC8xMDAgbXMgKi8KKworLyoqKioqICBQSFlfTE9ORV9QT1JUX0NUUkwJMTYgYml0IHIvdwlQb3J0IENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9QQ19UWF9UQ0xLCSgxPDwxNSkJLyogQml0IDE1OglFbmFibGUgVFhfVENMSyAqLworCQkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9QQ19BTFRfTlAJCSgxPDwxMykJLyogQml0IDE0OglBbHRlcm5hdGUgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9MX1BDX0dNSUlfQUxUCSgxPDwxMikJLyogQml0IDEzOglBbHRlcm5hdGUgR01JSSBkcml2ZXIgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0xfUENfVEVOX0NSUwkoMTw8MTApCS8qIEJpdCAxMDoJRXh0ZW5kIENSUyovCisJCQkJCQkJCQkvKiBCaXQgIDkuLjA6CW5vdCBkZXNjcmliZWQgKi8KKworLyoqKioqICBQSFlfTE9ORV9DSU0JCTE2IGJpdCByL28JQ0lNIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0xfQ0lNX0lTT0wJCSgyNTU8PDgpLyogQml0IDE1Li44OglJc29sYXRlIENvdW50ICovCisjZGVmaW5lIFBIWV9MX0NJTV9GQUxTRV9DQVIJKDI1NTw8MCkvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnQgKi8KKworCisvKgorICogUGF1c2UgQml0cyAoUEhZX0xfQU5fQVNQIGFuZCBQSFlfTF9BTl9QQykgZW5jb2RpbmcKKyAqLworI2RlZmluZSBQSFlfTF9QX05PX1BBVVNFCSgwPDwxMCkJLyogQml0IDExLi4xMDoJbm8gUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTF9QX1NZTV9NRAkJKDE8PDEwKQkvKiBCaXQgMTEuLjEwOglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTF9QX0FTWU1fTUQJCSgyPDwxMCkJLyogQml0IDExLi4xMDoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9MX1BfQk9USF9NRAkJKDM8PDEwKQkvKiBCaXQgMTEuLjEwOglib3RoIFBhdXNlIE1vZGUgKi8KKworCisvKgorICogTmF0aW9uYWwtU3BlY2lmaWMKKyAqLworLyoqKioqICBQSFlfTkFUXzEwMDBUX0NUUkwJMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfTl8xMDAwQ19URVNUCSg3PDwxMykJLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLworI2RlZmluZSBQSFlfTl8xMDAwQ19NU0UJCSgxPDwxMikJLyogQml0IDEyOglNYXN0ZXIvU2xhdmUgRW5hYmxlICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX01TQwkJKDE8PDExKQkvKiBCaXQgMTE6CU0vUyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX1JECQkoMTw8MTApCS8qIEJpdCAxMDoJUmVwZWF0ZXIvRFRFICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX0FGRAkJKDE8PDkpCS8qIEJpdCAgOToJQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX0FIRAkJKDE8PDgpCS8qIEJpdCAgODoJQWR2ZXJ0aXNlIEhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX0FQQwkJKDE8PDcpCS8qIEJpdCAgNzoJQXN5bW1ldHJpYyBQYXVzZSBDYXAuICovCisJCQkJCQkJCQkvKiBCaXQgIDYuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX05BVF8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfTl8xMDAwU19NU0YJCSgxPDwxNSkJLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfTVNSCQkoMTw8MTQpCS8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworI2RlZmluZSBQSFlfTl8xMDAwU19MUlMJCSgxPDwxMykJLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfUlJTCQkoMTw8MTIpCS8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyovCisjZGVmaW5lIFBIWV9OXzEwMDBTX0xQX0ZECSgxPDwxMSkJLyogQml0IDExOglMaW5rIFBhcnRuZXIgY2FuIEZEICovCisjZGVmaW5lIFBIWV9OXzEwMDBTX0xQX0hECSgxPDwxMCkJLyogQml0IDEwOglMaW5rIFBhcnRuZXIgY2FuIEhEICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX0xQX0FQQwkoMTw8OSkJLyogQml0ICA5OglMUCBBc3ltLiBQYXVzZSBDYXAuICovCisJCQkJCQkJCQkvKiBCaXQgIDg6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9OXzEwMDBTX0lFQwkJMHhmZgkvKiBCaXQgIDcuLjA6CUlkbGUgRXJyb3IgQ291bnQgKi8KKworLyoqKioqICBQSFlfTkFUX0VYVF9TVEFUCTE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfTl9FU19YX0ZEX0NBUAkoMTw8MTUpCS8qIEJpdCAxNToJMTAwMEJhc2UtWCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9OX0VTX1hfSERfQ0FQCSgxPDwxNCkJLyogQml0IDE0OgkxMDAwQmFzZS1YIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX05fRVNfVF9GRF9DQVAJKDE8PDEzKQkvKiBCaXQgMTM6CTEwMDBCYXNlLVQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTl9FU19UX0hEX0NBUAkoMTw8MTIpCS8qIEJpdCAxMjoJMTAwMEJhc2UtVCBIRCBjYXBhYmxlICovCisJCQkJCQkJCQkvKiBCaXQgMTEuLjA6CXJlc2VydmVkICovCisKKy8qIHRvZG86IHRob3NlIGFyZSBzdGlsbCBtaXNzaW5nICovCisvKioqKiogIFBIWV9OQVRfRVhUX0NUUkwxCTE2IGJpdCByL28JRXh0ZW5kZWQgQ29udHJvbCBSZWcxICoqKioqLworLyoqKioqICBQSFlfTkFUX1FfU1RBVDEJCTE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzEgKioqKiovCisvKioqKiogIFBIWV9OQVRfMTBCX09QCQkxNiBiaXQgci9vCTEwQmFzZS1UIE9wZXJhdGlvbnMgUmVnICoqKioqLworLyoqKioqICBQSFlfTkFUX0VYVF9DVFJMMgkxNiBiaXQgci9vCUV4dGVuZGVkIENvbnRyb2wgUmVnMSAqKioqKi8KKy8qKioqKiAgUEhZX05BVF9RX1NUQVQyCQkxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcyICoqKioqLworLyoqKioqICBQSFlfTkFUX1BIWV9BRERSCTE2IGJpdCByL28JUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKioqKiovCisKKy8qCisgKiBNYXJ2ZWxsLVNwZWNpZmljCisgKi8KKy8qKioqKiAgUEhZX01BUlZfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0FVTkVfTFAJMTYgYml0IHIvdwlMaW5rIFBhcnQgQWJpbGl0eSBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0FOX05YVF9QRwkJQklUXzE1CS8qIFJlcXVlc3QgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9NX0FOX0FDSwkJQklUXzE0CS8qIChybykJQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fUkYJCQlCSVRfMTMJLyogUmVtb3RlIEZhdWx0ICovCisJCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX0FOX0FTUAkJQklUXzExCS8qIEFzeW1tZXRyaWMgUGF1c2UgKi8KKyNkZWZpbmUgUEhZX01fQU5fUEMJCQlCSVRfMTAJLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCisjZGVmaW5lIFBIWV9NX0FOXzEwMF9GRAkJQklUXzgJLyogQWR2ZXJ0aXNlIDEwMEJhc2UtVFggRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX01fQU5fMTAwX0hECQlCSVRfNwkvKiBBZHZlcnRpc2UgMTAwQmFzZS1UWCBIYWxmIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9BTl8xMF9GRAkJQklUXzYJLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9BTl8xMF9IRAkJQklUXzUJLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBIYWxmIER1cGxleCAqLworCisvKiBzcGVjaWFsIGRlZmluZXMgZm9yIEZJQkVSICg4OEUxMDExUyBvbmx5KSAqLworI2RlZmluZSBQSFlfTV9BTl9BU1BfWAkJQklUXzgJLyogQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfTV9BTl9QQ19YCQlCSVRfNwkvKiBNQUMgUGF1c2UgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fMTAwMFhfQUhECUJJVF82CS8qIEFkdmVydGlzZSAxMDAwMEJhc2UtWCBIYWxmIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9BTl8xMDAwWF9BRkQJQklUXzUJLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEZ1bGwgRHVwbGV4ICovCisKKy8qIFBhdXNlIEJpdHMgKFBIWV9NX0FOX0FTUF9YIGFuZCBQSFlfTV9BTl9QQ19YKSBlbmNvZGluZyAqLworI2RlZmluZSBQSFlfTV9QX05PX1BBVVNFX1gJKDA8PDcpCS8qIEJpdCAgOC4uIDc6CW5vIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX01fUF9TWU1fTURfWAkoMTw8NykJLyogQml0ICA4Li4gNzoJc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX01fUF9BU1lNX01EX1gJKDI8PDcpCS8qIEJpdCAgOC4uIDc6CWFzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTV9QX0JPVEhfTURfWAkoMzw8NykJLyogQml0ICA4Li4gNzoJYm90aCBQYXVzZSBNb2RlICovCisKKy8qKioqKiAgUEhZX01BUlZfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9NXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hbnVhbCBNYXN0ZXIvU2xhdmUgRW5hYmxlICovCisjZGVmaW5lIFBIWV9NXzEwMDBDX01TQwkJKDE8PDExKQkvKiBCaXQgMTE6CU0vUyBDb25maWd1cmF0aW9uICgxPU1hc3RlcikgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfTVBECQkoMTw8MTApCS8qIEJpdCAxMDoJTXVsdGktUG9ydCBEZXZpY2UgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTUFSVl9QSFlfQ1RSTAkxNiBiaXQgci93CVBIWSBTcGVjaWZpYyBDdHJsIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fUENfVFhfRkZEX01TSwkoMzw8MTQpCS8qIEJpdCAxNS4uMTQ6CVR4IEZJRk8gRGVwdGggTWFzayAqLworI2RlZmluZSBQSFlfTV9QQ19SWF9GRkRfTVNLCSgzPDwxMikJLyogQml0IDEzLi4xMjoJUnggRklGTyBEZXB0aCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BDX0FTU19DUlNfVFgJKDE8PDExKQkvKiBCaXQgMTE6CUFzc2VydCBDUlMgb24gVHJhbnNtaXQgKi8KKyNkZWZpbmUgUEhZX01fUENfRkxfR09PRAkoMTw8MTApCS8qIEJpdCAxMDoJRm9yY2UgTGluayBHb29kICovCisjZGVmaW5lIFBIWV9NX1BDX0VOX0RFVF9NU0sJKDM8PDgpCS8qIEJpdCAgOS4uIDg6CUVuZXJneSBEZXRlY3QgTWFzayAqLworI2RlZmluZSBQSFlfTV9QQ19FTkFfRVhUX0QJKDE8PDcpCS8qIEJpdCAgNzoJRW5hYmxlIEV4dC4gRGlzdGFuY2UgKDEwQlQpICovCisjZGVmaW5lIFBIWV9NX1BDX01ESVhfTVNLCSgzPDw1KQkvKiBCaXQgIDYuLiA1OglNREkvTURJWCBDb25maWcuIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fUENfRElTXzEyNUNMSwkoMTw8NCkJLyogQml0ICA0OglEaXNhYmxlIDEyNSBDTEsgKi8KKyNkZWZpbmUgUEhZX01fUENfTUFDX1BPV19VUAkoMTw8MykJLyogQml0ICAzOglNQUMgUG93ZXIgdXAgKi8KKyNkZWZpbmUgUEhZX01fUENfU1FFX1RfRU5BCSgxPDwyKQkvKiBCaXQgIDI6CVNRRSBUZXN0IEVuYWJsZWQgKi8KKyNkZWZpbmUgUEhZX01fUENfUE9MX1JfRElTCSgxPDwxKQkvKiBCaXQgIDE6CVBvbGFyaXR5IFJldmVyc2FsIERpc2FibGVkICovCisjZGVmaW5lIFBIWV9NX1BDX0RJU19KQUJCRVIJKDE8PDApCS8qIEJpdCAgMDoJRGlzYWJsZSBKYWJiZXIgKi8KKworI2RlZmluZSBQSFlfTV9QQ19FTl9ERVQJCQlTSElGVDgoMikJLyogRW5lcmd5IERldGVjdCAoTW9kZSAxKSAqLworI2RlZmluZSBQSFlfTV9QQ19FTl9ERVRfUExVUwlTSElGVDgoMykJLyogRW5lcmd5IERldGVjdCBQbHVzIChNb2RlIDIpICovCisKKyNkZWZpbmUgUEhZX01fUENfTURJX1hNT0RFKHgpCVNISUZUNSh4KQkKKyNkZWZpbmUgUEhZX01fUENfTUFOX01ESQkwICAgIAkvKiAwMCA9IE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBQSFlfTV9QQ19NQU5fTURJWAkxCQkvKiAwMSA9IE1hbnVhbCBNRElYIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX01fUENfRU5BX0FVVE8JMwkJLyogMTEgPSBFbmFibGUgQXV0b21hdGljIENyb3Nzb3ZlciAqLworCisvKioqKiogIFBIWV9NQVJWX1BIWV9TVEFUCTE2IGJpdCByL28JUEhZIFNwZWNpZmljIFN0YXR1cyBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX1BTX1NQRUVEX01TSwkoMzw8MTQpCS8qIEJpdCAxNS4uMTQ6CVNwZWVkIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfMTAwMAkoMTw8MTUpCS8qICAgICAgIDEwID0gMTAwMCBNYnBzICovCisjZGVmaW5lIFBIWV9NX1BTX1NQRUVEXzEwMAkoMTw8MTQpCS8qICAgICAgIDAxID0gIDEwMCBNYnBzICovCisjZGVmaW5lIFBIWV9NX1BTX1NQRUVEXzEwCTAJCS8qICAgICAgIDAwID0gICAxMCBNYnBzICovCisjZGVmaW5lIFBIWV9NX1BTX0ZVTExfRFVQCSgxPDwxMykJLyogQml0IDEzOglGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9QU19QQUdFX1JFQwkoMTw8MTIpCS8qIEJpdCAxMjoJUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfTV9QU19TUERVUF9SRVMJKDE8PDExKQkvKiBCaXQgMTE6CVNwZWVkICYgRHVwbGV4IFJlc29sdmVkICovCisjZGVmaW5lIFBIWV9NX1BTX0xJTktfVVAJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgVXAgKi8KKyNkZWZpbmUgUEhZX01fUFNfQ0FCTEVfTVNLCSgzPDw3KQkvKiBCaXQgIDkuLiA3OglDYWJsZSBMZW5ndGggTWFzayAqLworI2RlZmluZSBQSFlfTV9QU19NRElfWF9TVEFUCSgxPDw2KQkvKiBCaXQgIDY6CU1ESSBDcm9zc292ZXIgU3RhdCAoMT1NRElYKSAqLworI2RlZmluZSBQSFlfTV9QU19ET1dOU19TVEFUCSgxPDw1KQkvKiBCaXQgIDU6CURvd25zaGlmdCBTdGF0dXMgKDE9ZG93bnNoLikgKi8KKyNkZWZpbmUgUEhZX01fUFNfRU5ERVRfU1RBVAkoMTw8NCkJLyogQml0ICA0OglFbmVyZ3kgRGV0ZWN0IFN0YXR1cyAoMT1hY3QpICovCisjZGVmaW5lIFBIWV9NX1BTX1RYX1BfRU4JKDE8PDMpCS8qIEJpdCAgMzoJVHggUGF1c2UgRW5hYmxlZCAqLworI2RlZmluZSBQSFlfTV9QU19SWF9QX0VOCSgxPDwyKQkvKiBCaXQgIDI6CVJ4IFBhdXNlIEVuYWJsZWQgKi8KKyNkZWZpbmUgUEhZX01fUFNfUE9MX1JFVgkoMTw8MSkJLyogQml0ICAxOglQb2xhcml0eSBSZXZlcnNlZCAqLworI2RlZmluZSBQSFlfTV9QQ19KQUJCRVIJCSgxPDwwKQkvKiBCaXQgIDA6CUphYmJlciAqLworCisjZGVmaW5lIFBIWV9NX1BTX1BBVVNFX01TSwkoUEhZX01fUFNfVFhfUF9FTiB8IFBIWV9NX1BTX1JYX1BfRU4pCisKKy8qKioqKiAgUEhZX01BUlZfSU5UX01BU0sJMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWcgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0lOVF9TVEFUCTE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0lTX0FOX0VSUk9SCSgxPDwxNSkJLyogQml0IDE1OglBdXRvLU5lZ290aWF0aW9uIEVycm9yICovCisjZGVmaW5lIFBIWV9NX0lTX0xTUF9DSEFOR0UJKDE8PDE0KQkvKiBCaXQgMTQ6CUxpbmsgU3BlZWQgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTV9JU19EVVBfQ0hBTkdFCSgxPDwxMykJLyogQml0IDEzOglEdXBsZXggTW9kZSBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0FOX1BSCQkoMTw8MTIpCS8qIEJpdCAxMjoJUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfTV9JU19BTl9DT01QTAkoMTw8MTEpCS8qIEJpdCAxMToJQXV0by1OZWdvdGlhdGlvbiBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfTFNUX0NIQU5HRQkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTV9JU19TWU1CX0VSUk9SCSgxPDw5KQkvKiBCaXQgIDk6CVN5bWJvbCBFcnJvciAqLworI2RlZmluZSBQSFlfTV9JU19GQUxTRV9DQVJSCSgxPDw4KQkvKiBCaXQgIDg6CUZhbHNlIENhcnJpZXIgKi8KKyNkZWZpbmUgUEhZX01fSVNfRklGT19FUlJPUgkoMTw8NykJLyogQml0ICA3OglGSUZPIE92ZXJmbG93L1VuZGVycnVuIEVycm9yICovCisjZGVmaW5lIFBIWV9NX0lTX01ESV9DSEFOR0UJKDE8PDYpCS8qIEJpdCAgNjoJTURJIENyb3Nzb3ZlciBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0RPV05TSF9ERVQJKDE8PDUpCS8qIEJpdCAgNToJRG93bnNoaWZ0IERldGVjdGVkICovCisjZGVmaW5lIFBIWV9NX0lTX0VORF9DSEFOR0UJKDE8PDQpCS8qIEJpdCAgNDoJRW5lcmd5IERldGVjdCBDaGFuZ2VkICovCisJCQkJCQkJCQkvKiBCaXQgIDMuLjI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX0lTX1BPTF9DSEFOR0UJKDE8PDEpCS8qIEJpdCAgMToJUG9sYXJpdHkgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTV9JU19KQUJCRVIJCSgxPDwwKQkvKiBCaXQgIDA6CUphYmJlciAqLworCisjZGVmaW5lIFBIWV9NX0RFRl9NU0sJCShQSFlfTV9JU19BTl9FUlJPUiB8IFBIWV9NX0lTX0FOX1BSIHwgXAorCQkJCQkJCVBIWV9NX0lTX0xTVF9DSEFOR0UgfCBQSFlfTV9JU19GSUZPX0VSUk9SKQorCisvKioqKiogIFBIWV9NQVJWX0VYVF9DVFJMCTE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAqKioqKi8KKyNkZWZpbmUgUEhZX01fRUNfTV9EU0NfTVNLCSgzPDwxMCkJLyogQml0IDExLi4xMDoJTWFzdGVyIGRvd25zaGlmdCBjb3VudGVyICovCisjZGVmaW5lIFBIWV9NX0VDX1NfRFNDX01TSwkoMzw8OCkJLyogQml0ICA5Li4gODoJU2xhdmUgIGRvd25zaGlmdCBjb3VudGVyICovCisjZGVmaW5lIFBIWV9NX0VDX01BQ19TX01TSwkoNzw8NCkJLyogQml0ICA2Li4gNDoJRGVmLiBNQUMgaW50ZXJmYWNlIHNwZWVkICovCisjZGVmaW5lIFBIWV9NX0VDX0ZJQl9BTl9FTkEJKDE8PDMpCS8qIEJpdCAgMzoJRmliZXIgQXV0by1OZWcuIEVuYWJsZSAqLworCisjZGVmaW5lIFBIWV9NX0VDX01fRFNDKHgpCQlTSElGVDEwKHgpCS8qIDAwPTF4OyAwMT0yeDsgMTA9M3g7IDExPTR4ICovCisjZGVmaW5lIFBIWV9NX0VDX1NfRFNDKHgpCQlTSElGVDgoeCkJLyogMDA9ZGlzOyAwMT0xeDsgMTA9Mng7IDExPTN4ICovCisjZGVmaW5lIFBIWV9NX0VDX01BQ19TKHgpCQlTSElGVDQoeCkJLyogMDFYPTA7IDExMD0yLjU7IDExMT0yNSAoTUh6KSAqLworCisjZGVmaW5lIE1BQ19UWF9DTEtfMF9NSFoJMgorI2RlZmluZSBNQUNfVFhfQ0xLXzJfNV9NSFoJNgorI2RlZmluZSBNQUNfVFhfQ0xLXzI1X01IWgk3CisKKy8qKioqKiAgUEhZX01BUlZfTEVEX0NUUkwJMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0xFRENfRElTX0xFRAkoMTw8MTUpCS8qIEJpdCAxNToJRGlzYWJsZSBMRUQgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19QVUxTX01TSwkoNzw8MTIpCS8qIEJpdCAxNC4uMTI6ICBQdWxzZSBTdHJldGNoIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19GX0lOVAkoMTw8MTEpCS8qIEJpdCAxMToJRm9yY2UgSW50ZXJydXB0ICovCisjZGVmaW5lIFBIWV9NX0xFRENfQkxfUl9NU0sJKDc8PDgpCS8qIEJpdCAxMC4uIDg6ICBCbGluayBSYXRlIE1hc2sgKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uIDU6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX0xFRENfTElOS19NU0sJKDM8PDMpCS8qIEJpdCAgNC4uIDM6CUxpbmsgQ29udHJvbCBNYXNrICovCisjZGVmaW5lIFBIWV9NX0xFRENfRFBfQ1RSTAkoMTw8MikJLyogQml0ICAyOglEdXBsZXggQ29udHJvbCAqLworI2RlZmluZSBQSFlfTV9MRURDX1JYX0NUUkwJKDE8PDEpCS8qIEJpdCAgMToJUnggYWN0aXZpdHkgLyBMaW5rICovCisjZGVmaW5lIFBIWV9NX0xFRENfVFhfQ1RSTAkoMTw8MCkJLyogQml0ICAwOglUeCBhY3Rpdml0eSAvIExpbmsgKi8KKworI2RlZmluZSBQSFlfTV9MRURfUFVMU19EVVIoeCkJU0hJRlQxMih4KQkvKiBQdWxzZSBTdHJldGNoIER1cmF0aW9uICovCisKKyNkZWZpbmUJUFVMU19OT19TVFIJCTAJCS8qIG5vIHB1bHNlIHN0cmV0Y2hpbmcgKi8KKyNkZWZpbmUJUFVMU18yMU1TCQkxCQkvKiAyMSBtcyB0byA0MiBtcyAqLworI2RlZmluZSBQVUxTXzQyTVMJCTIJCS8qIDQyIG1zIHRvIDg0IG1zICovCisjZGVmaW5lIFBVTFNfODRNUwkJMwkJLyogODQgbXMgdG8gMTcwIG1zICovCisjZGVmaW5lIFBVTFNfMTcwTVMJCTQJCS8qIDE3MCBtcyB0byAzNDAgbXMgKi8KKyNkZWZpbmUgUFVMU18zNDBNUwkJNQkJLyogMzQwIG1zIHRvIDY3MCBtcyAqLworI2RlZmluZSBQVUxTXzY3ME1TCQk2CQkvKiA2NzAgbXMgdG8gMS4zIHMgKi8KKyNkZWZpbmUgUFVMU18xMzAwTVMJCTcJCS8qIDEuMyBzIHRvIDIuNyBzICovCisKKyNkZWZpbmUgUEhZX01fTEVEX0JMSU5LX1JUKHgpCVNISUZUOCh4KQkvKiBCbGluayBSYXRlICovCisKKyNkZWZpbmUgQkxJTktfNDJNUwkJMAkJLyogNDIgbXMgKi8KKyNkZWZpbmUgQkxJTktfODRNUwkJMQkJLyogODQgbXMgKi8KKyNkZWZpbmUgQkxJTktfMTcwTVMJCTIJCS8qIDE3MCBtcyAqLworI2RlZmluZSBCTElOS18zNDBNUwkJMwkJLyogMzQwIG1zICovCisjZGVmaW5lIEJMSU5LXzY3ME1TCQk0CQkvKiA2NzAgbXMgKi8KKwkJCQkJCQkJLyogdmFsdWVzIDUgLSA3OiByZXNlcnZlZCAqLworCisvKioqKiogIFBIWV9NQVJWX0xFRF9PVkVSCTE2IGJpdCByL3cJTWFudWFsIExFRCBPdmVycmlkZSBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19EVVAoeCkJCVNISUZUMTAoeCkJLyogQml0IDExLi4xMDogIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fMTAoeCkJCVNISUZUOCh4KQkvKiBCaXQgIDkuLiA4OiAgTGluayAxMCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fMTAwKHgpCQlTSElGVDYoeCkJLyogQml0ICA3Li4gNjogIExpbmsgMTAwICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMDAwKHgpCVNISUZUNCh4KQkvKiBCaXQgIDUuLiA0OiAgTGluayAxMDAwICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19SWCh4KQkJU0hJRlQyKHgpCS8qIEJpdCAgMy4uIDI6ICBSeCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fVFgoeCkJCVNISUZUMCh4KQkvKiBCaXQgIDEuLiAwOiAgVHggKi8KKworI2RlZmluZSBNT19MRURfTk9STQkJCTAKKyNkZWZpbmUgTU9fTEVEX0JMSU5LCQkxCisjZGVmaW5lIE1PX0xFRF9PRkYJCQkyCisjZGVmaW5lIE1PX0xFRF9PTgkJCTMKKworLyoqKioqICBQSFlfTUFSVl9FWFRfQ1RSTF8yCTE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAyICoqKioqLworCQkJCQkJCQkJLyogQml0IDE1Li4gNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZJX0lNUEVECSgxPDw2KQkvKiBCaXQgIDY6CUZpYmVyIElucHV0ICBJbXBlZGFuY2UgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZPX0lNUEVECSgxPDw1KQkvKiBCaXQgIDU6CUZpYmVyIE91dHB1dCBJbXBlZGFuY2UgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZPX01fQ0xLCSgxPDw0KQkvKiBCaXQgIDQ6CUZpYmVyIE1vZGUgQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lIFBIWV9NX0VDMl9GT19CT09TVAkoMTw8MykJLyogQml0ICAzOglGaWJlciBPdXRwdXQgQm9vc3QgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZPX0FNX01TSwk3CQkvKiBCaXQgIDIuLiAwOglGaWJlciBPdXRwdXQgQW1wbGl0dWRlICovCisKKy8qKioqKglQSFlfTUFSVl9FWFRfUF9TVEFUIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgU3RhdHVzICoqKioqLworI2RlZmluZSBQSFlfTV9GQ19BVVRPX1NFTAkoMTw8MTUpCS8qIEJpdCAxNToJRmliZXIvQ29wcGVyIEF1dG8gU2VsLiBkaXMuICovCisjZGVmaW5lIFBIWV9NX0ZDX0FOX1JFR19BQ0MgKDE8PDE0KSAvKiBCaXQgMTQ6CUZpYmVyL0NvcHBlciBBdXRvbmVnLiByZWcgYWNjICovCisjZGVmaW5lIFBIWV9NX0ZDX1JFU1VMVVRJT04gKDE8PDEzKQkvKiBCaXQgMTM6CUZpYmVyL0NvcHBlciBSZXN1bHV0aW9uICovCisjZGVmaW5lIFBIWV9NX1NFUl9JRl9BTl9CUCAgKDE8PDEyKSAvKiBCaXQgMTI6CVNlciBJRiBhdXRvbmVnLiBieXBhc3MgZW5hYmxlICovCisjZGVmaW5lIFBIWV9NX1NFUl9JRl9CUF9TVAkoMTw8MTEpIC8qIEJpdCAxMToJU2VyIElGIGF1dG9uZWcuIGJ5cGFzcyBzdGF0dXMgKi8KKyNkZWZpbmUgUEhZX01fSVJRX1BPTEFSSVRZCSgxPDwxMCkgLyogQml0IDEwOglJUlEgcG9sYXJpdHkgKi8KKwkJCQkJCQkJCS8qIEJpdCA5Li40OiByZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTV9VTkRPQzEJCSgxPDwgNykgLyogdW5kb2N1bWVudGVkIGJpdCAhISAqLworI2RlZmluZSBQSFlfTV9NT0RFX01BU0sJCSgweGY8PDApLyogQml0IDMuLjA6IGNvcHkgb2YgSFdDRkcgTU9ERVszOjBdICovCisKKworLyoqKioqICBQSFlfTUFSVl9DQUJMRV9ESUFHCTE2IGJpdCByL28JQ2FibGUgRGlhZ25vc3RpYyBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0NBQkRfRU5BX1RFU1QJKDE8PDE1KQkvKiBCaXQgMTU6CUVuYWJsZSBUZXN0ICovCisjZGVmaW5lIFBIWV9NX0NBQkRfU1RBVF9NU0sJKDM8PDEzKQkvKiBCaXQgMTQuLjEzOglTdGF0dXMgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMi4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX0NBQkRfRElTVF9NU0sJMHhmZgkvKiBCaXQgIDcuLiAwOglEaXN0YW5jZSAqLworCisvKiB2YWx1ZXMgZm9yIENhYmxlIERpYWdub3N0aWMgU3RhdHVzICgxMT1mYWlsOyAwMD1PSzsgMTA9b3BlbjsgMDE9c2hvcnQpICovCisjZGVmaW5lIENBQkRfU1RBVF9OT1JNQUwJMAorI2RlZmluZSBDQUJEX1NUQVRfU0hPUlQJCTEKKyNkZWZpbmUgQ0FCRF9TVEFUX09QRU4JCTIKKyNkZWZpbmUgQ0FCRF9TVEFUX0ZBSUwJCTMKKworCisvKgorICogR01BQyByZWdpc3RlcnMKKyAqCisgKiBUaGUgR01BQyByZWdpc3RlcnMgYXJlIDE2IG9yIDMyIGJpdHMgd2lkZS4KKyAqIFRoZSBHTUFDcyBob3N0IHByb2Nlc3NvciBpbnRlcmZhY2UgaXMgMTYgYml0cyB3aWRlLAorICogdGhlcmVmb3JlIEFMTCByZWdpc3RlcnMgd2lsbCBiZSBhZGRyZXNzZWQgd2l0aCAxNiBiaXQgYWNjZXNzZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHByb3ZpZGVkIHRvIGFjY2VzcyB0aGUgR01BQyByZWdpc3RlcnMKKyAqIEdNX0lOMTYoKSwgR01fT1VUMTYsIEdNX0lOMzIoKSwgR01fT1VUMzIoKSwgR01fSU5BRFIoKSwgR01fT1VUQURSKCksCisgKiBHTV9JTkhBU0goKSwgYW5kIEdNX09VVEhBU0goKS4KKyAqIFRoZSBtYWNyb3MgYXJlIGRlZmluZWQgaW4gU2tHZUh3LmguCisgKgorICogTm90ZToJTkEgcmVnCT0gTmV0d29yayBBZGRyZXNzIGUuZyBEQSwgU0EgZXRjLgorICoKKyAqLworCisvKiBQb3J0IFJlZ2lzdGVycyAqLworI2RlZmluZSBHTV9HUF9TVEFUCQkweDAwMDAJCS8qIDE2IGJpdCByL28JR2VuZXJhbCBQdXJwb3NlIFN0YXR1cyAqLworI2RlZmluZSBHTV9HUF9DVFJMCQkweDAwMDQJCS8qIDE2IGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgKi8KKyNkZWZpbmUgR01fVFhfQ1RSTAkJMHgwMDA4CQkvKiAxNiBiaXQgci93CVRyYW5zbWl0IENvbnRyb2wgUmVnLiAqLworI2RlZmluZSBHTV9SWF9DVFJMCQkweDAwMGMJCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBDb250cm9sIFJlZy4gKi8KKyNkZWZpbmUgR01fVFhfRkxPV19DVFJMCTB4MDAxMAkJLyogMTYgYml0IHIvdwlUcmFuc21pdCBGbG93LUNvbnRyb2wgKi8KKyNkZWZpbmUgR01fVFhfUEFSQU0JCTB4MDAxNAkJLyogMTYgYml0IHIvdwlUcmFuc21pdCBQYXJhbWV0ZXIgUmVnLiAqLworI2RlZmluZSBHTV9TRVJJQUxfTU9ERQkweDAwMTgJCS8qIDE2IGJpdCByL3cJU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KKworLyogU291cmNlIEFkZHJlc3MgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzFMCTB4MDAxYwkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAxIChsb3cpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzFNCTB4MDAyMAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAxIChtaWRkbGUpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzFICTB4MDAyNAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAxIChoaWdoKSAqLworI2RlZmluZSBHTV9TUkNfQUREUl8yTAkweDAwMjgJCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMiAobG93KSAqLworI2RlZmluZSBHTV9TUkNfQUREUl8yTQkweDAwMmMJCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMiAobWlkZGxlKSAqLworI2RlZmluZSBHTV9TUkNfQUREUl8ySAkweDAwMzAJCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMiAoaGlnaCkgKi8KKworLyogTXVsdGljYXN0IEFkZHJlc3MgSGFzaCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fTUNfQUREUl9IMQkweDAwMzQJCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCAxICovCisjZGVmaW5lIEdNX01DX0FERFJfSDIJMHgwMDM4CQkvKiAxNiBiaXQgci93CU11bHRpY2FzdCBBZGRyZXNzIEhhc2ggMiAqLworI2RlZmluZSBHTV9NQ19BRERSX0gzCTB4MDAzYwkJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDMgKi8KKyNkZWZpbmUgR01fTUNfQUREUl9INAkweDAwNDAJCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCA0ICovCisKKy8qIEludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX1RYX0lSUV9TUkMJMHgwMDQ0CQkvKiAxNiBiaXQgci9vCVR4IE92ZXJmbG93IElSUSBTb3VyY2UgKi8KKyNkZWZpbmUgR01fUlhfSVJRX1NSQwkweDAwNDgJCS8qIDE2IGJpdCByL28JUnggT3ZlcmZsb3cgSVJRIFNvdXJjZSAqLworI2RlZmluZSBHTV9UUl9JUlFfU1JDCTB4MDA0YwkJLyogMTYgYml0IHIvbwlUeC9SeCBPdmVyLiBJUlEgU291cmNlICovCisKKy8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVycyAqLworI2RlZmluZSBHTV9UWF9JUlFfTVNLCTB4MDA1MAkJLyogMTYgYml0IHIvdwlUeCBPdmVyZmxvdyBJUlEgTWFzayAqLworI2RlZmluZSBHTV9SWF9JUlFfTVNLCTB4MDA1NAkJLyogMTYgYml0IHIvdwlSeCBPdmVyZmxvdyBJUlEgTWFzayAqLworI2RlZmluZSBHTV9UUl9JUlFfTVNLCTB4MDA1OAkJLyogMTYgYml0IHIvdwlUeC9SeCBPdmVyLiBJUlEgTWFzayAqLworCisvKiBTZXJpYWwgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFNNSSkgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX1NNSV9DVFJMCQkweDAwODAJCS8qIDE2IGJpdCByL3cJU01JIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fU01JX0RBVEEJCTB4MDA4NAkJLyogMTYgYml0IHIvdwlTTUkgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBHTV9QSFlfQUREUgkJMHgwMDg4CQkvKiAxNiBiaXQgci93CUdQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworCisvKiBNSUIgQ291bnRlcnMgKi8KKyNkZWZpbmUgR01fTUlCX0NOVF9CQVNFCTB4MDEwMAkJLyogQmFzZSBBZGRyZXNzIG9mIE1JQiBDb3VudGVycyAqLworI2RlZmluZSBHTV9NSUJfQ05UX1NJWkUJNDQJCQkvKiBOdW1iZXIgb2YgTUlCIENvdW50ZXJzICovCisKKy8qCisgKiBNSUIgQ291bnRlcnMgYmFzZSBhZGRyZXNzIGRlZmluaXRpb25zIChsb3cgd29yZCkgLQorICogdXNlIG9mZnNldCA0IGZvciBhY2Nlc3MgdG8gaGlnaCB3b3JkCSgzMiBiaXQgci9vKQorICovCisjZGVmaW5lIEdNX1JYRl9VQ19PSyBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMCkJLyogVW5pY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgR01fUlhGX0JDX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyA4KQkvKiBCcm9hZGNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIEdNX1JYRl9NUEFVU0UgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE2KQkvKiBQYXVzZSBNQUMgQ3RybCBGcmFtZXMgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgR01fUlhGX01DX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNCkJLyogTXVsdGljYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBHTV9SWEZfRkNTX0VSUiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzIpCS8qIFJ4IEZyYW1lIENoZWNrIFNlcS4gRXJyb3IgKi8KKwkvKiBHTV9NSUJfQ05UX0JBU0UgKyA0MDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01fUlhPX09LX0xPIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyA0OCkJLyogT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyAqLworI2RlZmluZSBHTV9SWE9fT0tfSEkgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDU2KQkvKiBPY3RldHMgUmVjZWl2ZWQgT0sgSGlnaCAqLworI2RlZmluZSBHTV9SWE9fRVJSX0xPIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyA2NCkJLyogT2N0ZXRzIFJlY2VpdmVkIEludmFsaWQgTG93ICovCisjZGVmaW5lIEdNX1JYT19FUlJfSEkgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDcyKQkvKiBPY3RldHMgUmVjZWl2ZWQgSW52YWxpZCBIaWdoICovCisjZGVmaW5lIEdNX1JYRl9TSFQgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDgwKQkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgR01fUlhFX0ZSQUcgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDg4KQkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgd2l0aCBGQ1MgRXJyICovCisjZGVmaW5lIEdNX1JYRl82NEIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDk2KQkvKiA2NCBCeXRlIFJ4IEZyYW1lICovCisjZGVmaW5lIEdNX1JYRl8xMjdCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMDQpCS8qIDY1LTEyNyBCeXRlIFJ4IEZyYW1lICovCisjZGVmaW5lIEdNX1JYRl8yNTVCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMTIpCS8qIDEyOC0yNTUgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfNTExQiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTIwKQkvKiAyNTYtNTExIEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzEwMjNCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMjgpCS8qIDUxMi0xMDIzIEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzE1MThCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMzYpCS8qIDEwMjQtMTUxOCBCeXRlIFJ4IEZyYW1lICovCisjZGVmaW5lIEdNX1JYRl9NQVhfU1ogXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE0NCkJLyogMTUxOS1NYXhTaXplIEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGX0xOR19FUlIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE1MikJLyogUnggRnJhbWUgdG9vIExvbmcgRXJyb3IgKi8KKyNkZWZpbmUgR01fUlhGX0pBQl9QS1QgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE2MCkJLyogUnggSmFiYmVyIFBhY2tldCBGcmFtZSAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDE2ODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01fUlhFX0ZJRk9fT1YgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE3NikJLyogUnggRklGTyBvdmVyZmxvdyBFdmVudCAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDE4NDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01fVFhGX1VDX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxOTIpCS8qIFVuaWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgR01fVFhGX0JDX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMDApCS8qIEJyb2FkY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBHTV9UWEZfTVBBVVNFIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMDgpCS8qIFBhdXNlIE1BQyBDdHJsIEZyYW1lcyBYbWl0dGVkICovCisjZGVmaW5lIEdNX1RYRl9NQ19PSyBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjE2KQkvKiBNdWx0aWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgR01fVFhPX09LX0xPIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMjQpCS8qIE9jdGV0cyBUcmFuc21pdHRlZCBPSyBMb3cgKi8KKyNkZWZpbmUgR01fVFhPX09LX0hJIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMzIpCS8qIE9jdGV0cyBUcmFuc21pdHRlZCBPSyBIaWdoICovCisjZGVmaW5lIEdNX1RYRl82NEIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI0MCkJLyogNjQgQnl0ZSBUeCBGcmFtZSAqLworI2RlZmluZSBHTV9UWEZfMTI3QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjQ4KQkvKiA2NS0xMjcgQnl0ZSBUeCBGcmFtZSAqLworI2RlZmluZSBHTV9UWEZfMjU1QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjU2KQkvKiAxMjgtMjU1IEJ5dGUgVHggRnJhbWUgKi8KKyNkZWZpbmUgR01fVFhGXzUxMUIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI2NCkJLyogMjU2LTUxMSBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8xMDIzQiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjcyKQkvKiA1MTItMTAyMyBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8xNTE4QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjgwKQkvKiAxMDI0LTE1MTggQnl0ZSBUeCBGcmFtZSAqLworI2RlZmluZSBHTV9UWEZfTUFYX1NaIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyODgpCS8qIDE1MTktTWF4U2l6ZSBCeXRlIFR4IEZyYW1lICovCisJLyogR01fTUlCX0NOVF9CQVNFICsgMjk2OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9UWEZfQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMDQpCS8qIFR4IENvbGxpc2lvbiAqLworI2RlZmluZSBHTV9UWEZfTEFUX0NPTCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzEyKQkvKiBUeCBMYXRlIENvbGxpc2lvbiAqLworI2RlZmluZSBHTV9UWEZfQUJPX0NPTCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzIwKQkvKiBUeCBhYm9ydGVkIGR1ZSB0byBFeGNlcy4gQ29sLiAqLworI2RlZmluZSBHTV9UWEZfTVVMX0NPTCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzI4KQkvKiBUeCBNdWx0aXBsZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgR01fVFhGX1NOR19DT0wgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDMzNikJLyogVHggU2luZ2xlIENvbGxpc2lvbiAqLworI2RlZmluZSBHTV9UWEVfRklGT19VUiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzQ0KQkvKiBUeCBGSUZPIFVuZGVycnVuIEV2ZW50ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR01BQyBCaXQgRGVmaW5pdGlvbnMKKyAqCisgKiBJZiB0aGUgYml0IGFjY2VzcyBiZWhhdmlvdXIgZGlmZmVycyBmcm9tIHRoZSByZWdpc3RlciBhY2Nlc3MgYmVoYXZpb3VyCisgKiAoci93LCByL28pIHRoaXMgaXMgZG9jdW1lbnRlZCBhZnRlciB0aGUgYml0IG51bWJlci4KKyAqIFRoZSBmb2xsb3dpbmcgYml0IGFjY2VzcyBiZWhhdmlvdXJzIGFyZSB1c2VkOgorICoJKHNjKQlzZWxmIGNsZWFyaW5nCisgKgkoci9vKQlyZWFkIG9ubHkKKyAqLworCisvKglHTV9HUF9TVEFUCTE2IGJpdCByL28JR2VuZXJhbCBQdXJwb3NlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBHTV9HUFNSX1NQRUVECQkoMTw8MTUpIC8qIEJpdCAxNToJUG9ydCBTcGVlZCAoMSA9IDEwMCBNYnBzKSAqLworI2RlZmluZSBHTV9HUFNSX0RVUExFWAkJKDE8PDE0KSAvKiBCaXQgMTQ6CUR1cGxleCBNb2RlICgxID0gRnVsbCkgKi8KKyNkZWZpbmUgR01fR1BTUl9GQ19UWF9ESVMJKDE8PDEzKSAvKiBCaXQgMTM6CVR4IEZsb3ctQ29udHJvbCBNb2RlIERpc2FibGVkICovCisjZGVmaW5lIEdNX0dQU1JfTElOS19VUAkJKDE8PDEyKQkvKiBCaXQgMTI6CUxpbmsgVXAgU3RhdHVzICovCisjZGVmaW5lIEdNX0dQU1JfUEFVU0UJCSgxPDwxMSkJLyogQml0IDExOglQYXVzZSBTdGF0ZSAqLworI2RlZmluZSBHTV9HUFNSX1RYX0FDVElWRQkoMTw8MTApCS8qIEJpdCAxMDoJVHggaW4gUHJvZ3Jlc3MgKi8KKyNkZWZpbmUgR01fR1BTUl9FWENfQ09MCQkoMTw8OSkJLyogQml0ICA5OglFeGNlc3NpdmUgQ29sbGlzaW9ucyBPY2N1cmVkICovCisjZGVmaW5lIEdNX0dQU1JfTEFUX0NPTAkJKDE8PDgpCS8qIEJpdCAgODoJTGF0ZSBDb2xsaXNpb25zIE9jY3VyZWQgKi8KKwkJCQkJCQkJLyogQml0ICA3Li42OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9HUFNSX1BIWV9TVF9DSAkoMTw8NSkJLyogQml0ICA1OglQSFkgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBHTV9HUFNSX0dJR19TUEVFRAkoMTw8NCkJLyogQml0ICA0OglHaWdhYml0IFNwZWVkICgxID0gMTAwMCBNYnBzKSAqLworI2RlZmluZSBHTV9HUFNSX1BBUlRfTU9ERQkoMTw8MykJLyogQml0ICAzOglQYXJ0aXRpb24gbW9kZSAqLworI2RlZmluZSBHTV9HUFNSX0ZDX1JYX0RJUwkoMTw8MikJLyogQml0ICAyOglSeCBGbG93LUNvbnRyb2wgTW9kZSBEaXNhYmxlZCAqLworI2RlZmluZSBHTV9HUFNSX1BST01fRU4JCSgxPDwxKQkvKiBCaXQgIDE6CVByb21pc2N1b3VzIE1vZGUgRW5hYmxlZCAqLworCQkJCQkJCQkvKiBCaXQgIDA6CXJlc2VydmVkICovCisJCisvKglHTV9HUF9DVFJMCTE2IGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9HUENSX1BST01fRU5BCSgxPDwxNCkJLyogQml0IDE0OglFbmFibGUgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX0ZDX1RYX0RJUwkoMTw8MTMpIC8qIEJpdCAxMzoJRGlzYWJsZSBUeCBGbG93LUNvbnRyb2wgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX1RYX0VOQQkJKDE8PDEyKSAvKiBCaXQgMTI6CUVuYWJsZSBUcmFuc21pdCAqLworI2RlZmluZSBHTV9HUENSX1JYX0VOQQkJKDE8PDExKSAvKiBCaXQgMTE6CUVuYWJsZSBSZWNlaXZlICovCisjZGVmaW5lIEdNX0dQQ1JfQlVSU1RfRU5BCSgxPDwxMCkJLyogQml0IDEwOglFbmFibGUgQnVyc3QgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX0xPT1BfRU5BCSgxPDw5KQkvKiBCaXQgIDk6CUVuYWJsZSBNQUMgTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX1BBUlRfRU5BCSgxPDw4KQkvKiBCaXQgIDg6CUVuYWJsZSBQYXJ0aXRpb24gTW9kZSAqLworI2RlZmluZSBHTV9HUENSX0dJR1NfRU5BCSgxPDw3KQkvKiBCaXQgIDc6CUdpZ2FiaXQgU3BlZWQgKDEwMDAgTWJwcykgKi8KKyNkZWZpbmUgR01fR1BDUl9GTF9QQVNTCQkoMTw8NikJLyogQml0ICA2OglGb3JjZSBMaW5rIFBhc3MgKi8KKyNkZWZpbmUgR01fR1BDUl9EVVBfRlVMTAkoMTw8NSkJLyogQml0ICA1OglGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfRkNfUlhfRElTCSgxPDw0KQkvKiBCaXQgIDQ6CURpc2FibGUgUnggRmxvdy1Db250cm9sIE1vZGUgKi8KKyNkZWZpbmUgR01fR1BDUl9TUEVFRF8xMDAJKDE8PDMpICAvKiBCaXQgIDM6CVBvcnQgU3BlZWQgMTAwIE1icHMgKi8KKyNkZWZpbmUgR01fR1BDUl9BVV9EVVBfRElTCSgxPDwyKQkvKiBCaXQgIDI6CURpc2FibGUgQXV0by1VcGRhdGUgRHVwbGV4ICovCisjZGVmaW5lIEdNX0dQQ1JfQVVfRkNUX0RJUwkoMTw8MSkJLyogQml0ICAxOglEaXNhYmxlIEF1dG8tVXBkYXRlIEZsb3ctQy4gKi8KKyNkZWZpbmUgR01fR1BDUl9BVV9TUERfRElTCSgxPDwwKQkvKiBCaXQgIDA6CURpc2FibGUgQXV0by1VcGRhdGUgU3BlZWQgKi8KKworI2RlZmluZSBHTV9HUENSX1NQRUVEXzEwMDAJKEdNX0dQQ1JfR0lHU19FTkEgfCBHTV9HUENSX1NQRUVEXzEwMCkKKyNkZWZpbmUgR01fR1BDUl9BVV9BTExfRElTCShHTV9HUENSX0FVX0RVUF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVMgfFwKKwkJCQkJCQkgR01fR1BDUl9BVV9TUERfRElTKQorCQorLyoJR01fVFhfQ1RSTAkJCQkxNiBiaXQgci93CVRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fVFhDUl9GT1JDRV9KQU0JKDE8PDE1KQkvKiBCaXQgMTU6CUZvcmNlIEphbSAvIEZsb3ctQ29udHJvbCAqLworI2RlZmluZSBHTV9UWENSX0NSQ19ESVMJCSgxPDwxNCkJLyogQml0IDE0OglEaXNhYmxlIGluc2VydGlvbiBvZiBDUkMgKi8KKyNkZWZpbmUgR01fVFhDUl9QQURfRElTCQkoMTw8MTMpCS8qIEJpdCAxMzoJRGlzYWJsZSBwYWRkaW5nIG9mIHBhY2tldHMgKi8KKyNkZWZpbmUgR01fVFhDUl9DT0xfVEhSX01TSwkoMTw8MTApCS8qIEJpdCAxMi4uMTA6CUNvbGxpc2lvbiBUaHJlc2hvbGQgKi8KKworI2RlZmluZSBUWF9DT0xfVEhSKHgpCQkoU0hJRlQxMCh4KSAmIEdNX1RYQ1JfQ09MX1RIUl9NU0spCisKKyNkZWZpbmUgVFhfQ09MX0RFRgkJCTB4MDQKKwkKKy8qCUdNX1JYX0NUUkwJCQkJMTYgYml0IHIvdwlSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fUlhDUl9VQ0ZfRU5BCQkoMTw8MTUpCS8qIEJpdCAxNToJRW5hYmxlIFVuaWNhc3QgZmlsdGVyaW5nICovCisjZGVmaW5lIEdNX1JYQ1JfTUNGX0VOQQkJKDE8PDE0KQkvKiBCaXQgMTQ6CUVuYWJsZSBNdWx0aWNhc3QgZmlsdGVyaW5nICovCisjZGVmaW5lIEdNX1JYQ1JfQ1JDX0RJUwkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW92ZSA0LWJ5dGUgQ1JDICovCisjZGVmaW5lIEdNX1JYQ1JfUEFTU19GQwkJKDE8PDEyKQkvKiBCaXQgMTI6CVBhc3MgRkMgcGFja2V0cyB0byBGSUZPICovCisJCisvKglHTV9UWF9QQVJBTQkJCQkxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWdpc3RlciAqLworI2RlZmluZSBHTV9UWFBBX0pBTUxFTl9NU0sJKDB4MDM8PDE0KQkvKiBCaXQgMTUuLjE0OglKYW0gTGVuZ3RoICovCisjZGVmaW5lIEdNX1RYUEFfSkFNSVBHX01TSwkoMHgxZjw8OSkJLyogQml0IDEzLi45OglKYW0gSVBHICovCisjZGVmaW5lIEdNX1RYUEFfSkFNREFUX01TSwkoMHgxZjw8NCkJLyogQml0ICA4Li40OglJUEcgSmFtIHRvIERhdGEgKi8KKwkJCQkJCQkJLyogQml0ICAzLi4wOglyZXNlcnZlZCAqLworCisjZGVmaW5lIFRYX0pBTV9MRU5fVkFMKHgpCShTSElGVDE0KHgpICYgR01fVFhQQV9KQU1MRU5fTVNLKQorI2RlZmluZSBUWF9KQU1fSVBHX1ZBTCh4KQkoU0hJRlQ5KHgpICYgR01fVFhQQV9KQU1JUEdfTVNLKQorI2RlZmluZSBUWF9JUEdfSkFNX0RBVEEoeCkJKFNISUZUNCh4KSAmIEdNX1RYUEFfSkFNREFUX01TSykKKworI2RlZmluZSBUWF9KQU1fTEVOX0RFRgkJMHgwMworI2RlZmluZSBUWF9KQU1fSVBHX0RFRgkJMHgwYgorI2RlZmluZSBUWF9JUEdfSkFNX0RFRgkJMHgxYworCisvKglHTV9TRVJJQUxfTU9ERQkJCTE2IGJpdCByL3cJU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fU01PRF9EQVRBQkxfTVNLCSgweDFmPDwxMSkJLyogQml0IDE1Li4xMToJRGF0YSBCbGluZGVyIChyL28pICovCisjZGVmaW5lIEdNX1NNT0RfTElNSVRfNAkJKDE8PDEwKQkvKiBCaXQgMTA6CTQgY29uc2VjdXRpdmUgVHggdHJpYWxzICovCisjZGVmaW5lIEdNX1NNT0RfVkxBTl9FTkEJKDE8PDkpCS8qIEJpdCAgOToJRW5hYmxlIFZMQU4gIChNYXguIEZyYW1lIExlbikgKi8KKyNkZWZpbmUgR01fU01PRF9KVU1CT19FTkEJKDE8PDgpCS8qIEJpdCAgODoJRW5hYmxlIEp1bWJvIChNYXguIEZyYW1lIExlbikgKi8KKwkJCQkJCQkJLyogQml0ICA3Li41OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9TTU9EX0lQR19NU0sJCTB4MWYJLyogQml0IDQuLjA6CUludGVyLVBhY2tldCBHYXAgKElQRykgKi8KKwkKKyNkZWZpbmUgREFUQV9CTElORF9WQUwoeCkJKFNISUZUMTEoeCkgJiBHTV9TTU9EX0RBVEFCTF9NU0spCisjZGVmaW5lIERBVEFfQkxJTkRfREVGCQkweDA0CisKKyNkZWZpbmUgSVBHX0RBVEFfVkFMKHgpCQkoeCAmIEdNX1NNT0RfSVBHX01TSykKKyNkZWZpbmUgSVBHX0RBVEFfREVGCQkweDFlCisKKy8qCUdNX1NNSV9DVFJMCQkJCTE2IGJpdCByL3cJU01JIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fU01JX0NUX1BIWV9BX01TSwkoMHgxZjw8MTEpCS8qIEJpdCAxNS4uMTE6CVBIWSBEZXZpY2UgQWRkcmVzcyAqLworI2RlZmluZSBHTV9TTUlfQ1RfUkVHX0FfTVNLCSgweDFmPDw2KQkvKiBCaXQgMTAuLiA2OglQSFkgUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBHTV9TTUlfQ1RfT1BfUkQJCSgxPDw1KQkvKiBCaXQgIDU6CU9wQ29kZSBSZWFkICgwPVdyaXRlKSovCisjZGVmaW5lIEdNX1NNSV9DVF9SRF9WQUwJKDE8PDQpCS8qIEJpdCAgNDoJUmVhZCBWYWxpZCAoUmVhZCBjb21wbGV0ZWQpICovCisjZGVmaW5lIEdNX1NNSV9DVF9CVVNZCQkoMTw8MykJLyogQml0ICAzOglCdXN5IChPcGVyYXRpb24gaW4gcHJvZ3Jlc3MpICovCisJCQkJCQkJCS8qIEJpdCAgIDIuLjA6CXJlc2VydmVkICovCisJCisjZGVmaW5lIEdNX1NNSV9DVF9QSFlfQUQoeCkJKFNISUZUMTEoeCkgJiBHTV9TTUlfQ1RfUEhZX0FfTVNLKQorI2RlZmluZSBHTV9TTUlfQ1RfUkVHX0FEKHgpCShTSElGVDYoeCkgJiBHTV9TTUlfQ1RfUkVHX0FfTVNLKQorCisJLyoJR01fUEhZX0FERFIJCQkJMTYgYml0IHIvdwlHUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0ICAxNS4uNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01fUEFSX01JQl9DTFIJCSgxPDw1KQkvKiBCaXQgIDU6CVNldCBNSUIgQ2xlYXIgQ291bnRlciBNb2RlICovCisjZGVmaW5lIEdNX1BBUl9NSUJfVFNUCQkoMTw8NCkJLyogQml0ICA0OglNSUIgTG9hZCBDb3VudGVyIChUZXN0IE1vZGUpICovCisJCQkJCQkJCS8qIEJpdCAgIDMuLjA6CXJlc2VydmVkICovCisJCisvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBFbmNvZGluZyAqLworI2RlZmluZSBHTVJfRlNfTEVOCSgweGZmZmZVTDw8MTYpCS8qIEJpdCAzMS4uMTY6CVJ4IEZyYW1lIExlbmd0aCAqLworCQkJCQkJCQkvKiBCaXQgIDE1Li4xNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01SX0ZTX1ZMQU4JCSgxTDw8MTMpCS8qIEJpdCAxMzoJVkxBTiBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX0pBQkJFUgkoMUw8PDEyKQkvKiBCaXQgMTI6CUphYmJlciBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX1VOX1NJWkUJKDFMPDwxMSkJLyogQml0IDExOglVbmRlcnNpemUgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19NQwkJKDFMPDwxMCkJLyogQml0IDEwOglNdWx0aWNhc3QgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19CQwkJKDFMPDw5KQkJLyogQml0ICA5OglCcm9hZGNhc3QgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19SWF9PSwkoMUw8PDgpCQkvKiBCaXQgIDg6CVJlY2VpdmUgT0sgKEdvb2QgUGFja2V0KSAqLworI2RlZmluZSBHTVJfRlNfR09PRF9GQwkoMUw8PDcpCQkvKiBCaXQgIDc6CUdvb2QgRmxvdy1Db250cm9sIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfQkFEX0ZDCSgxTDw8NikJCS8qIEJpdCAgNjoJQmFkICBGbG93LUNvbnRyb2wgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19NSUlfRVJSCSgxTDw8NSkJCS8qIEJpdCAgNToJTUlJIEVycm9yICovCisjZGVmaW5lIEdNUl9GU19MT05HX0VSUgkoMUw8PDQpCQkvKiBCaXQgIDQ6CVRvbyBMb25nIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfRlJBR01FTlQJKDFMPDwzKQkJLyogQml0ICAzOglGcmFnbWVudCAqLworCQkJCQkJCQkvKiBCaXQgIDI6CXJlc2VydmVkICovCisjZGVmaW5lIEdNUl9GU19DUkNfRVJSCSgxTDw8MSkJCS8qIEJpdCAgMToJQ1JDIEVycm9yICovCisjZGVmaW5lIEdNUl9GU19SWF9GRl9PVgkoMUw8PDApCQkvKiBCaXQgIDA6CVJ4IEZJRk8gT3ZlcmZsb3cgKi8KKworLyoKKyAqIEdNUl9GU19BTllfRVJSIChhbmFsb2dvdXMgdG8gWE1SX0ZTX0FOWV9FUlIpCisgKi8KKyNkZWZpbmUgR01SX0ZTX0FOWV9FUlIJKEdNUl9GU19DUkNfRVJSIHwgXAorCQkJR01SX0ZTX0xPTkdfRVJSIHwgXAorCQkJR01SX0ZTX01JSV9FUlIgfCBcCisJCQlHTVJfRlNfQkFEX0ZDIHwgXAorCQkJR01SX0ZTX0dPT0RfRkMgfCBcCisJCQlHTVJfRlNfSkFCQkVSKQorCisvKiBSeCBHTUFDIEZJRk8gRmx1c2ggTWFzayAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgUlhfRkZfRkxfREVGX01TSwkoR01SX0ZTX0NSQ19FUlIgfCBcCisJCQlHTVJfRlNfUlhfRkZfT1YgfCBcCisJCQlHTVJfRlNfTUlJX0VSUiB8IFwKKwkJCUdNUl9GU19CQURfRkMgfCBcCisJCQlHTVJfRlNfR09PRF9GQyB8IFwKKwkJCUdNUl9GU19VTl9TSVpFIHwgXAorCQkJR01SX0ZTX0pBQkJFUikKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYJLyogX19JTkNfWE1BQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrYWRkci5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2UyNWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2FkZHIuYwpAQCAtMCwwICsxLDE3NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2FkZHIuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQUREUi1Nb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNi8wMiAxMzo0NjoxNSAkCisgKiBQdXJwb3NlOglNYW5hZ2UgQWRkcmVzc2VzIChNdWx0aWNhc3QgYW5kIFVuaWNhc3QpIGFuZCBQcm9taXNjdW91cyBNb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBtYW5hZ2UgbXVsdGljYXN0IGFkZHJlc3NlcywgYWRkcmVzcyBvdmVycmlkZSwKKyAqIGFuZCBwcm9taXNjdW91cyBtb2RlIG9uIEdFbmVzaXMgYW5kIFl1a29uIGFkYXB0ZXJzLgorICoKKyAqIEFkZHJlc3MgTGF5b3V0OgorICoJcG9ydCBhZGRyZXNzOgkJcGh5c2ljYWwgTUFDIGFkZHJlc3MKKyAqCTFzdCBleGFjdCBtYXRjaDoJbG9naWNhbCBNQUMgYWRkcmVzcyAoR0VuZXNpcyBvbmx5KQorICoJMm5kIGV4YWN0IG1hdGNoOglSTE1UIG11bHRpY2FzdCAoR0VuZXNpcyBvbmx5KQorICoJZXhhY3QgbWF0Y2ggMy0xMzoJT1Mtc3BlY2lmaWMgbXVsdGljYXN0cyAoR0VuZXNpcyBvbmx5KQorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJInNrZHJ2MXN0LmgiCisgKgkic2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrYWRkci5jLHYgMS41MiAyMDAzLzA2LzAyIDEzOjQ2OjE1IHRzY2hpbGxpIEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYgLyogREVCVUcgfHwhTElOVCB8fCAhU0tfU0xJTSAqLworCisjZGVmaW5lIF9fU0tBRERSX0MKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBjcGx1c3BsdXMgKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBYTUFDX1BPTFkJMHhFREI4ODMyMFVMCS8qIENSQzMyLVBvbHkgLSBYTUFDOiBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEdNQUNfUE9MWQkweDA0QzExREI3TAkvKiBDUkMxNi1Qb2x5IC0gR01BQzogTGl0dGxlIEVuZGlhbiAqLworI2RlZmluZSBIQVNIX0JJVFMJNgkJCQkvKiAjYml0cyBpbiBoYXNoICovCisjZGVmaW5lCVNLX01DX0JJVAkweDAxCisKKy8qIEVycm9yIG51bWJlcnMgYW5kIG1lc3NhZ2VzLiAqLworCisjZGVmaW5lIFNLRVJSX0FERFJfRTAwMQkJKFNLX0VSUkJBU0VfQUREUiArIDApCisjZGVmaW5lIFNLRVJSX0FERFJfRTAwMU1TRwkiQmFkIEZsYWdzLiIKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAyCQkoU0tFUlJfQUREUl9FMDAxICsgMSkKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAyTVNHCSJOZXcgRXJyb3IuIgorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOb25lLiAqLworCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiA2NC1iaXQgaGFzaCB2YWx1ZXMgd2l0aCBhbGwgYml0cyBzZXQuICovCisKK3N0YXRpYyBjb25zdCBTS19VMTYJT25lc0hhc2hbNF0gPSB7MHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGfTsKKworLyogbG9jYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIERFQlVHCitzdGF0aWMgaW50CU5leHQwW1NLX01BWF9NQUNTXSA9IHswfTsKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRySW5pdCAtIGluaXRpYWxpemUgZGF0YSwgc2V0IHN0YXRlIHRvIGluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKglTS19JTklUX0RBVEEKKyAqCT09PT09PT09PT09PQorICoKKyAqCVRoaXMgcm91dGluZSBjbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZXMgYW5kIHJlc2V0cyBwcm9taXNjdW91cyBtb2RlLgorICoJU29tZSBlbnRyaWVzIGFyZSByZXNlcnZlZCBmb3IgdGhlICJsb2dpY2FsIE1BQyBhZGRyZXNzIiwgdGhlCisgKglTSy1STE1UIG11bHRpY2FzdCBhZGRyZXNzLCBhbmQgdGhlIEJQRFUgbXVsdGljYXN0IGFkZHJlc3MuCisgKgorICoKKyAqCVNLX0lOSVRfSU8KKyAqCT09PT09PT09PT0KKyAqCisgKglBbGwgcGVybWFuZW50IE1BQyBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSBFUFJPTS4KKyAqCUlmIHRoZSBjdXJyZW50IE1BQyBhZGRyZXNzZXMgYXJlIG5vdCBhbHJlYWR5IHNldCBpbiBzb2Z0d2FyZSwKKyAqCXRoZXkgYXJlIHNldCB0byB0aGUgdmFsdWVzIG9mIHRoZSBwZXJtYW5lbnQgYWRkcmVzc2VzLgorICoJVGhlIGN1cnJlbnQgYWRkcmVzc2VzIGFyZSB3cml0dGVuIHRvIHRoZSBjb3JyZXNwb25kaW5nIE1BQy4KKyAqCisgKgorICoJU0tfSU5JVF9SVU4KKyAqCT09PT09PT09PT09CisgKgorICoJTm90aGluZy4KKyAqCisgKiBDb250ZXh0OgorICoJaW5pdCwgcGFnZWFibGUKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKi8KK2ludAlTa0FkZHJJbml0KAorU0tfQUMJKnBBQywJLyogdGhlIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIGNvbnRleHQgKi8KK2ludAkJTGV2ZWwpCS8qIGluaXRpYWxpemF0aW9uIGxldmVsICovCit7CisJaW50CQkJajsKKwlTS19VMzIJCWk7CisJU0tfVTgJCSpJbkFkZHI7CisJU0tfVTE2CQkqT3V0QWRkcjsKKwlTS19BRERSX1BPUlQJKnBBUG9ydDsKKworCXN3aXRjaCAoTGV2ZWwpIHsKKwljYXNlIFNLX0lOSVRfREFUQToKKwkJU0tfTUVNU0VUKChjaGFyICopICZwQUMtPkFkZHIsIChTS19VOCkgMCwKKyAgICAgICAgICAgIChTS19VMTYpIHNpemVvZihTS19BRERSKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9NQUNTOyBpKyspIHsKKwkJCXBBUG9ydCA9ICZwQUMtPkFkZHIuUG9ydFtpXTsKKwkJCXBBUG9ydC0+UHJvbU1vZGUgPSBTS19QUk9NX01PREVfTk9ORTsKKwkJCQorCQkJcEFQb3J0LT5GaXJzdEV4YWN0TWF0Y2hSbG10ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UOworCQkJcEFQb3J0LT5GaXJzdEV4YWN0TWF0Y2hEcnYgPSBTS19BRERSX0ZJUlNUX01BVENIX0RSVjsKKwkJCXBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hSbG10ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UOworCQkJcEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydiA9IFNLX0FERFJfRklSU1RfTUFUQ0hfRFJWOworCQl9CisjaWZkZWYgeERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCQlpZiAocEFDLT5BZGRyLlBvcnRbaV0uTmV4dEV4YWN0TWF0Y2hSbG10IDwKKwkJCQlTS19BRERSX0ZJUlNUX01BVENIX1JMTVQpIHsKKwkJCQlOZXh0MFtpXSB8PSA0OworCQkJfQorCQl9CisjZW5kaWYJLyogREVCVUcgKi8KKwkJLyogcEFDLT5BZGRyLkluaXREb25lID0gU0tfSU5JVF9EQVRBOyAqLworCQlicmVhazsKKworICAgIGNhc2UgU0tfSU5JVF9JTzoKKyNpZm5kZWYgU0tfTk9fUkxNVAorCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX05FVFM7IGkrKykgeworCQkJcEFDLT5BZGRyLk5ldFtpXS5BY3RpdmVQb3J0ID0gcEFDLT5SbG10Lk5ldFtpXS5BY3RpdmVQb3J0OworCQl9CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKyNpZmRlZiB4REVCVUcKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9NQUNTOyBpKyspIHsKKwkJCWlmIChwQUMtPkFkZHIuUG9ydFtpXS5OZXh0RXhhY3RNYXRjaFJsbXQgPAorCQkJCVNLX0FERFJfRklSU1RfTUFUQ0hfUkxNVCkgeworCQkJCU5leHQwW2ldIHw9IDg7CisJCQl9CisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQkKKwkJLyogUmVhZCBwZXJtYW5lbnQgbG9naWNhbCBNQUMgYWRkcmVzcyBmcm9tIENvbnRyb2wgUmVnaXN0ZXIgRmlsZS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IFNLX01BQ19BRERSX0xFTjsgaisrKSB7CisJCQlJbkFkZHIgPSAoU0tfVTggKikgJnBBQy0+QWRkci5OZXRbMF0uUGVybWFuZW50TWFjQWRkcmVzcy5hW2pdOworCQkJU0tfSU44KElvQywgQjJfTUFDXzEgKyBqLCBJbkFkZHIpOworCQl9CisKKwkJaWYgKCFwQUMtPkFkZHIuTmV0WzBdLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkvKiBTZXQgdGhlIGN1cnJlbnQgbG9naWNhbCBNQUMgYWRkcmVzcyB0byB0aGUgcGVybWFuZW50IG9uZS4gKi8KKwkJCXBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3MgPQorCQkJCXBBQy0+QWRkci5OZXRbMF0uUGVybWFuZW50TWFjQWRkcmVzczsKKwkJCXBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3NTZXQgPSBTS19UUlVFOworCQl9CisKKwkJLyogU2V0IHRoZSBjdXJyZW50IGxvZ2ljYWwgTUFDIGFkZHJlc3MuICovCisJCXBBQy0+QWRkci5Qb3J0W3BBQy0+QWRkci5OZXRbMF0uQWN0aXZlUG9ydF0uRXhhY3RbMF0gPQorCQkJcEFDLT5BZGRyLk5ldFswXS5DdXJyZW50TWFjQWRkcmVzczsKKyNpZiBTS19NQVhfTkVUUyA+IDEKKwkJLyogU2V0IGxvZ2ljYWwgTUFDIGFkZHJlc3MgZm9yIG5ldCAyIHRvIChsb2cgfCAzKS4gKi8KKwkJaWYgKCFwQUMtPkFkZHIuTmV0WzFdLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQlwQUMtPkFkZHIuTmV0WzFdLlBlcm1hbmVudE1hY0FkZHJlc3MgPQorCQkJCXBBQy0+QWRkci5OZXRbMF0uUGVybWFuZW50TWFjQWRkcmVzczsKKwkJCXBBQy0+QWRkci5OZXRbMV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzVdIHw9IDM7CisJCQkvKiBTZXQgdGhlIGN1cnJlbnQgbG9naWNhbCBNQUMgYWRkcmVzcyB0byB0aGUgcGVybWFuZW50IG9uZS4gKi8KKwkJCXBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3MgPQorCQkJCXBBQy0+QWRkci5OZXRbMV0uUGVybWFuZW50TWFjQWRkcmVzczsKKwkJCXBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3NTZXQgPSBTS19UUlVFOworCQl9CisjZW5kaWYJLyogU0tfTUFYX05FVFMgPiAxICovCisKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJQZXJtYW5lbnQgTUFDIEFkZHJlc3MgKE5ldCVkKTogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQkJCWksCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMl0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNV0pKQorCQkJCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9JTklULAorCQkJCSgiTG9naWNhbCBNQUMgQWRkcmVzcyAoTmV0JWQpOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJaSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVs1XSkpCisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W2ldOworCisJCQkvKiBSZWFkIHBlcm1hbmVudCBwb3J0IGFkZHJlc3NlcyBmcm9tIENvbnRyb2wgUmVnaXN0ZXIgRmlsZS4gKi8KKwkJCWZvciAoaiA9IDA7IGogPCBTS19NQUNfQUREUl9MRU47IGorKykgeworCQkJCUluQWRkciA9IChTS19VOCAqKSAmcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbal07CisJCQkJU0tfSU44KElvQywgQjJfTUFDXzIgKyA4ICogaSArIGosIEluQWRkcik7CisJCQl9CisKKwkJCWlmICghcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzc1NldCkgeworCQkJCS8qCisJCQkJICogU2V0IHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBwaHlzaWNhbCBNQUMgYWRkcmVzcworCQkJCSAqIG9mIHRoaXMgcG9ydCB0byBpdHMgcGVybWFuZW50IE1BQyBhZGRyZXNzLgorCQkJCSAqLworCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MgPSBwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3M7CisJCQkJcEFQb3J0LT5QcmV2aW91c01hY0FkZHJlc3MgPSBwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3M7CisJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzc1NldCA9IFNLX1RSVUU7CisJCQl9CisKKwkJCS8qIFNldCBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMF07CisjaWZkZWYgR0VORVNJUworCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlYTV9PVVRBRERSKElvQywgaSwgWE1fU0EsIE91dEFkZHIpOworCQkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKyNpZmRlZiBZVUtPTgorCQkJaWYgKCFwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJR01fT1VUQUREUihJb0MsIGksIEdNX1NSQ19BRERSXzFMLCBPdXRBZGRyKTsKKwkJCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworI2lmZGVmIERFQlVHCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9JTklULAorCQkJCSgiU2tBZGRySW5pdDogUGVybWFuZW50IFBoeXNpY2FsIE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzFdLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzRdLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVs1XSkpCisJCQkKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJTa0FkZHJJbml0OiBQaHlzaWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVswXSwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzFdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMl0sCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVszXSwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzRdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNV0pKQorI2VuZGlmIC8qIERFQlVHICovCisJCX0KKwkJLyogcEFDLT5BZGRyLkluaXREb25lID0gU0tfSU5JVF9JTzsgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNLX0lOSVRfUlVOOgorI2lmZGVmIHhERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJaWYgKHBBQy0+QWRkci5Qb3J0W2ldLk5leHRFeGFjdE1hdGNoUmxtdCA8CisJCQkJU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UKSB7CisJCQkJTmV4dDBbaV0gfD0gMTY7CisJCQl9CisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJCS8qIHBBQy0+QWRkci5Jbml0RG9uZSA9IFNLX0lOSVRfUlVOOyAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CS8qIGVycm9yICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRySW5pdCAqLworCisjaWZuZGVmIFNLX1NMSU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkck1jQ2xlYXIgLSBjbGVhciB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUuCisgKgorICoJSWYgbm90IHN1cHByZXNzZWQgYnkgRmxhZyBTS19NQ19TV19PTkxZLCB0aGUgaGFyZHdhcmUgaXMgdXBkYXRlZAorICoJaW1tZWRpYXRlbHkuCisgKgorICoJSXQgY2FsbHMgZWl0aGVyIFNrQWRkclhtYWNNY0NsZWFyIG9yIFNrQWRkckdtYWNNY0NsZWFyLCBhY2NvcmRpbmcKKyAqCXRvIHRoZSBhZGFwdGVyIGluIHVzZS4gVGhlIHJlYWwgd29yayBpcyBkb25lIHRoZXJlLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBzdGFydGluZyB3aXRoIFNLX0lOSVRfREFUQSB3aXRoIGZsYWcgU0tfTUNfU1dfT05MWQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPIHdpdGhvdXQgbGltaXRhdGlvbgorICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJNY0NsZWFyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlciwJLyogSW5kZXggb2YgYWZmZWN0ZWQgcG9ydCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybSwgc3ctb25seSAqLworeworCWludCBSZXR1cm5Db2RlOworCQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkclhtYWNNY0NsZWFyKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBGbGFncyk7CisJfQorCWVsc2UgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyR21hY01jQ2xlYXIocEFDLCBJb0MsIFBvcnROdW1iZXIsIEZsYWdzKTsKKwl9CisKKwlyZXR1cm4gKFJldHVybkNvZGUpOworCit9CS8qIFNrQWRkck1jQ2xlYXIgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyWG1hY01jQ2xlYXIgLSBjbGVhciB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCShlaXRoZXIgZW50cnkgMiBvciBlbnRyaWVzIDMtMTYgYW5kIEluZXhhY3RGaWx0ZXIpIG9mIHRoZSBnaXZlbiBwb3J0LgorICoJSWYgbm90IHN1cHByZXNzZWQgYnkgRmxhZyBTS19NQ19TV19PTkxZLCB0aGUgaGFyZHdhcmUgaXMgdXBkYXRlZAorICoJaW1tZWRpYXRlbHkuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIHN0YXJ0aW5nIHdpdGggU0tfSU5JVF9EQVRBIHdpdGggZmxhZyBTS19NQ19TV19PTkxZCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8gd2l0aG91dCBsaW1pdGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkclhtYWNNY0NsZWFyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlciwJLyogSW5kZXggb2YgYWZmZWN0ZWQgcG9ydCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybSwgc3ctb25seSAqLworeworCWludCBpOworCisJaWYgKEZsYWdzICYgU0tfQUREUl9QRVJNQU5FTlQpIHsJLyogcGVybWFuZW50ID0+IFJMTVQgKi8KKworCQkvKiBDbGVhciBSTE1UIG11bHRpY2FzdCBhZGRyZXNzZXMuICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCA9IFNLX0FERFJfRklSU1RfTUFUQ0hfUkxNVDsKKwl9CisJZWxzZSB7CS8qIG5vdCBwZXJtYW5lbnQgPT4gRFJWICovCisKKwkJLyogQ2xlYXIgSW5leGFjdEZpbHRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0gMDsKKwkJfQorCisJCS8qIENsZWFyIERSViBtdWx0aWNhc3QgYWRkcmVzc2VzLiAqLworCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9EUlY7CisJfQorCisJaWYgKCEoRmxhZ3MgJiBTS19NQ19TV19PTkxZKSkgeworCQkodm9pZCkgU2tBZGRyWG1hY01jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisKKwlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCit9CS8qIFNrQWRkclhtYWNNY0NsZWFyICovCisKKyNlbmRpZiAvKiAhU0tfU0xJTSAqLworCisjaWZuZGVmIFNLX1NMSU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkckdtYWNNY0NsZWFyIC0gY2xlYXIgdGhlIG11bHRpY2FzdCB0YWJsZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNsZWFycyB0aGUgbXVsdGljYXN0IGhhc2hpbmcgdGFibGUgKEluZXhhY3RGaWx0ZXIpCisgKgkoZWl0aGVyIHRoZSBSTE1UIG9yIHRoZSBkcml2ZXIgYml0cykgb2YgdGhlIGdpdmVuIHBvcnQuCisgKgorICoJSWYgbm90IHN1cHByZXNzZWQgYnkgRmxhZyBTS19NQ19TV19PTkxZLCB0aGUgaGFyZHdhcmUgaXMgdXBkYXRlZAorICoJaW1tZWRpYXRlbHkuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIHN0YXJ0aW5nIHdpdGggU0tfSU5JVF9EQVRBIHdpdGggZmxhZyBTS19NQ19TV19PTkxZCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8gd2l0aG91dCBsaW1pdGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkckdtYWNNY0NsZWFyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlciwJLyogSW5kZXggb2YgYWZmZWN0ZWQgcG9ydCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybSwgc3ctb25seSAqLworeworCWludCBpOworCisjaWZkZWYgREVCVUcKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkoIkdNQUMgSW5leGFjdEZpbHRlciAobm90IGNsZWFyZWQpOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzBdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1sxXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzNdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s0XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzZdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s3XSkpCisjZW5kaWYJLyogREVCVUcgKi8KKworCS8qIENsZWFyIEluZXhhY3RGaWx0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAwOworCX0KKwkKKwlpZiAoRmxhZ3MgJiBTS19BRERSX1BFUk1BTkVOVCkgewkvKiBwZXJtYW5lbnQgPT4gUkxNVCAqLworCQkKKwkJLyogQ29weSBEUlYgYml0cyB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldIHw9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1tpXTsKKwkJCQorCQkJLyogQ2xlYXIgSW5leGFjdFJsbXRGaWx0ZXIuICovCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1tpXSA9IDA7CisKKwkJfQkJCisJfQorCWVsc2UgewkvKiBub3QgcGVybWFuZW50ID0+IERSViAqLworCQkKKwkJLyogQ29weSBSTE1UIGJpdHMgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXSB8PQorCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW2ldOworCQkJCisJCQkvKiBDbGVhciBJbmV4YWN0RHJ2RmlsdGVyLiAqLworCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1tpXSA9IDA7CisJCX0KKwl9CisJCisjaWZkZWYgREVCVUcKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkoIkdNQUMgSW5leGFjdEZpbHRlciAoY2xlYXJlZCk6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1syXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s1XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCQorCWlmICghKEZsYWdzICYgU0tfTUNfU1dfT05MWSkpIHsKKwkJKHZvaWQpIFNrQWRkckdtYWNNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorCQorCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKworfQkvKiBTa0FkZHJHbWFjTWNDbGVhciAqLworCisjaWZuZGVmIFNLX0FERFJfQ0hFQVQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1hY01jSGFzaCAtIGhhc2ggbXVsdGljYXN0IGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgYSBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqCUEgQ1JDMzIgYWxnb3JpdGhtIGlzIHVzZWQuCisgKgorICogTm90ZXM6CisgKglUaGUgY29kZSB3YXMgYWRhcHRlZCBmcm9tIHRoZSBYYVF0aSBkYXRhIHNoZWV0LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoKKyAqIFJldHVybnM6CisgKglIYXNoIHZhbHVlIG9mIG11bHRpY2FzdCBhZGRyZXNzLgorICovCitTS19VMzIgU2tYbWFjTWNIYXNoKAordW5zaWduZWQgY2hhciAqcE1jKQkvKiBNdWx0aWNhc3QgYWRkcmVzcyAqLworeworCVNLX1UzMiBJZHg7CisJU0tfVTMyIEJpdDsKKwlTS19VMzIgRGF0YTsKKwlTS19VMzIgQ3JjOworCisJQ3JjID0gMHhGRkZGRkZGRlVMOworCWZvciAoSWR4ID0gMDsgSWR4IDwgU0tfTUFDX0FERFJfTEVOOyBJZHgrKykgeworCQlEYXRhID0gKnBNYysrOworCQlmb3IgKEJpdCA9IDA7IEJpdCA8IDg7IEJpdCsrLCBEYXRhID4+PSAxKSB7CisJCQlDcmMgPSAoQ3JjID4+IDEpIF4gKCgoQ3JjIF4gRGF0YSkgJiAxKSA/IFhNQUNfUE9MWSA6IDApOworCQl9CisJfQorCisJcmV0dXJuIChDcmMgJiAoKDEgPDwgSEFTSF9CSVRTKSAtIDEpKTsKKworfQkvKiBTa1htYWNNY0hhc2ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbWFjTWNIYXNoIC0gaGFzaCBtdWx0aWNhc3QgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciBhIG11bHRpY2FzdCBhZGRyZXNzLgorICoJQSBDUkMxNiBhbGdvcml0aG0gaXMgdXNlZC4KKyAqCisgKiBOb3RlczoKKyAqCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgorICogUmV0dXJuczoKKyAqCUhhc2ggdmFsdWUgb2YgbXVsdGljYXN0IGFkZHJlc3MuCisgKi8KK1NLX1UzMiBTa0dtYWNNY0hhc2goCit1bnNpZ25lZCBjaGFyICpwTWMpCS8qIE11bHRpY2FzdCBhZGRyZXNzICovCit7CisJU0tfVTMyIERhdGE7CisJU0tfVTMyIFRtcERhdGE7CisJU0tfVTMyIENyYzsKKwlpbnQgQnl0ZTsKKwlpbnQgQml0OworCisJQ3JjID0gMHhGRkZGRkZGRlVMOworCWZvciAoQnl0ZSA9IDA7IEJ5dGUgPCA2OyBCeXRlKyspIHsKKwkJLyogR2V0IG5leHQgYnl0ZS4gKi8KKwkJRGF0YSA9IChTS19VMzIpIHBNY1tCeXRlXTsKKwkJCisJCS8qIENoYW5nZSBiaXQgb3JkZXIgaW4gYnl0ZS4gKi8KKwkJVG1wRGF0YSA9IERhdGE7CisJCWZvciAoQml0ID0gMDsgQml0IDwgODsgQml0KyspIHsKKwkJCWlmIChUbXBEYXRhICYgMUwpIHsKKwkJCQlEYXRhIHw9ICAxTCA8PCAoNyAtIEJpdCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlEYXRhICY9IH4oMUwgPDwgKDcgLSBCaXQpKTsKKwkJCX0KKwkJCVRtcERhdGEgPj49IDE7CisJCX0KKwkJCisJCUNyYyBePSAoRGF0YSA8PCAyNCk7CisJCWZvciAoQml0ID0gMDsgQml0IDwgODsgQml0KyspIHsKKwkJCWlmIChDcmMgJiAweDgwMDAwMDAwKSB7CisJCQkJQ3JjID0gKENyYyA8PCAxKSBeIEdNQUNfUE9MWTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUNyYyA8PD0gMTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gKENyYyAmICgoMSA8PCBIQVNIX0JJVFMpIC0gMSkpOworCit9CS8qIFNrR21hY01jSGFzaCAqLworCisjZW5kaWYJLyogIVNLX0FERFJfQ0hFQVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkck1jQWRkIC0gYWRkIGEgbXVsdGljYXN0IGFkZHJlc3MgdG8gYSBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgZW5hYmxlcyByZWNlcHRpb24gZm9yIGEgZ2l2ZW4gYWRkcmVzcyBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY01jQWRkIG9yIFNrQWRkckdtYWNNY0FkZCwgYWNjb3JkaW5nIHRvIHRoZQorICoJYWRhcHRlciBpbiB1c2UuIFRoZSByZWFsIHdvcmsgaXMgZG9uZSB0aGVyZS4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9EQVRBCisgKgorICogUmV0dXJuczoKKyAqCVNLX01DX0ZJTFRFUklOR19FWEFDVAorICoJU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QKKyAqCVNLX01DX0lMTEVHQUxfQUREUkVTUworICoJU0tfTUNfSUxMRUdBTF9QT1JUCisgKglTS19NQ19STE1UX09WRVJGTE9XCisgKi8KK2ludAlTa0FkZHJNY0FkZCgKK1NLX0FDCQkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJCVBvcnROdW1iZXIsCS8qIFBvcnQgTnVtYmVyICovCitTS19NQUNfQUREUgkqcE1jLAkJLyogbXVsdGljYXN0IGFkZHJlc3MgdG8gYmUgYWRkZWQgKi8KK2ludAkJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtYW5lbnQgKi8KK3sKKwlpbnQgUmV0dXJuQ29kZTsKKwkKKwlpZiAoUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCQorCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJYbWFjTWNBZGQocEFDLCBJb0MsIFBvcnROdW1iZXIsIHBNYywgRmxhZ3MpOworCX0KKwllbHNlIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkckdtYWNNY0FkZChwQUMsIElvQywgUG9ydE51bWJlciwgcE1jLCBGbGFncyk7CisJfQorCisJcmV0dXJuIChSZXR1cm5Db2RlKTsKKworfQkvKiBTa0FkZHJNY0FkZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjTWNBZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcyB0byBhIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBmb3IgYSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBnaXZlbiBwb3J0LgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqCVRoZSBtdWx0aWNhc3QgYml0IGlzIG9ubHkgY2hlY2tlZCBpZiB0aGVyZSBhcmUgbm8gZnJlZSBleGFjdCBtYXRjaAorICoJZW50cmllcy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9EQVRBCisgKgorICogUmV0dXJuczoKKyAqCVNLX01DX0ZJTFRFUklOR19FWEFDVAorICoJU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QKKyAqCVNLX01DX0lMTEVHQUxfQUREUkVTUworICoJU0tfTUNfUkxNVF9PVkVSRkxPVworICovCitpbnQJU2tBZGRyWG1hY01jQWRkKAorU0tfQUMJCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogUG9ydCBOdW1iZXIgKi8KK1NLX01BQ19BRERSCSpwTWMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyB0byBiZSBhZGRlZCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybWFuZW50ICovCit7CisJaW50CWk7CisJU0tfVTgJSW5leGFjdDsKKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCVNLX1UzMiBIYXNoQml0OworI2VuZGlmCS8qICFkZWZpbmVkKFNLX0FERFJfQ0hFQVQpICovCisKKwlpZiAoRmxhZ3MgJiBTS19BRERSX1BFUk1BTkVOVCkgewkvKiBwZXJtYW5lbnQgPT4gUkxNVCAqLworI2lmZGVmIHhERUJVRworCQlpZiAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10IDwKKwkJCVNLX0FERFJfRklSU1RfTUFUQ0hfUkxNVCkgeworCQkJTmV4dDBbUG9ydE51bWJlcl0gfD0gMTsKKwkJCXJldHVybiAoU0tfTUNfUkxNVF9PVkVSRkxPVyk7CisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQkKKwkJaWYgKHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCA+CisJCQlTS19BRERSX0xBU1RfTUFUQ0hfUkxNVCkgeworCQkJcmV0dXJuIChTS19NQ19STE1UX09WRVJGTE9XKTsKKwkJfQorCisJCS8qIFNldCBhIFJMTVQgbXVsdGljYXN0IGFkZHJlc3MuICovCisKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQrK10gPSAqcE1jOworCisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisKKyNpZmRlZiB4REVCVUcKKwlpZiAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPAorCQlTS19BRERSX0ZJUlNUX01BVENIX0RSVikgeworCQkJTmV4dDBbUG9ydE51bWJlcl0gfD0gMjsKKwkJcmV0dXJuIChTS19NQ19STE1UX09WRVJGTE9XKTsKKwl9CisjZW5kaWYJLyogREVCVUcgKi8KKwkKKwlpZiAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPD0gU0tfQUREUl9MQVNUX01BVENIX0RSVikgeworCisJCS8qIFNldCBleGFjdCBtYXRjaCBlbnRyeS4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydisrXSA9ICpwTWM7CisKKwkJLyogQ2xlYXIgSW5leGFjdEZpbHRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0gMDsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKCEocE1jLT5hWzBdICYgU0tfTUNfQklUKSkgeworCQkJLyogSGFzaGluZyBvbmx5IHBvc3NpYmxlIHdpdGggbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQkJcmV0dXJuIChTS19NQ19JTExFR0FMX0FERFJFU1MpOworCQl9CisjaWZuZGVmIFNLX0FERFJfQ0hFQVQKKwkJLyogQ29tcHV0ZSBoYXNoIHZhbHVlIG9mIGFkZHJlc3MuICovCisJCUhhc2hCaXQgPSA2MyAtIFNrWG1hY01jSGFzaCgmcE1jLT5hWzBdKTsKKworCQkvKiBBZGQgYml0IHRvIEluZXhhY3RGaWx0ZXIuICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbSGFzaEJpdCAvIDhdIHw9CisJCQkxIDw8IChIYXNoQml0ICUgOCk7CisjZWxzZQkvKiBTS19BRERSX0NIRUFUICovCisJCS8qIFNldCBhbGwgYml0cyBpbiBJbmV4YWN0RmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0gMHhGRjsKKwkJfQorI2VuZGlmCS8qIFNLX0FERFJfQ0hFQVQgKi8KKwl9CisKKwlmb3IgKEluZXhhY3QgPSAwLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQlJbmV4YWN0IHw9IHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJfQorCisJaWYgKEluZXhhY3QgPT0gMCAmJiBwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5Qcm9tTW9kZSA9PSAwKSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCX0KKworfQkvKiBTa0FkZHJYbWFjTWNBZGQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyR21hY01jQWRkIC0gYWRkIGEgbXVsdGljYXN0IGFkZHJlc3MgdG8gYSBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgZW5hYmxlcyByZWNlcHRpb24gZm9yIGEgZ2l2ZW4gYWRkcmVzcyBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9EQVRBCisgKgorICogUmV0dXJuczoKKyAqCVNLX01DX0ZJTFRFUklOR19JTkVYQUNUCisgKglTS19NQ19JTExFR0FMX0FERFJFU1MKKyAqLworaW50CVNrQWRkckdtYWNNY0FkZCgKK1NLX0FDCQkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJCVBvcnROdW1iZXIsCS8qIFBvcnQgTnVtYmVyICovCitTS19NQUNfQUREUgkqcE1jLAkJLyogbXVsdGljYXN0IGFkZHJlc3MgdG8gYmUgYWRkZWQgKi8KK2ludAkJRmxhZ3MpCQkvKiBwZXJtYW5lbnQvbm9uLXBlcm1hbmVudCAqLworeworCWludAlpOworI2lmbmRlZiBTS19BRERSX0NIRUFUCisJU0tfVTMyIEhhc2hCaXQ7CisjZW5kaWYJLyogIWRlZmluZWQoU0tfQUREUl9DSEVBVCkgKi8KKwkJCisJaWYgKCEocE1jLT5hWzBdICYgU0tfTUNfQklUKSkgeworCQkvKiBIYXNoaW5nIG9ubHkgcG9zc2libGUgd2l0aCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCXJldHVybiAoU0tfTUNfSUxMRUdBTF9BRERSRVNTKTsKKwl9CisJCisjaWZuZGVmIFNLX0FERFJfQ0hFQVQKKwkKKwkvKiBDb21wdXRlIGhhc2ggdmFsdWUgb2YgYWRkcmVzcy4gKi8KKwlIYXNoQml0ID0gU2tHbWFjTWNIYXNoKCZwTWMtPmFbMF0pOworCQorCWlmIChGbGFncyAmIFNLX0FERFJfUEVSTUFORU5UKSB7CS8qIHBlcm1hbmVudCA9PiBSTE1UICovCisJCQorCQkvKiBBZGQgYml0IHRvIEluZXhhY3RSbG10RmlsdGVyLiAqLworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1tIYXNoQml0IC8gOF0gfD0KKwkJCTEgPDwgKEhhc2hCaXQgJSA4KTsKKwkJCisJCS8qIENvcHkgYml0IHRvIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gfD0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1tpXTsKKwkJfQorI2lmZGVmIERFQlVHCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0UmxtdEZpbHRlcjogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1sxXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzJdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1s0XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzVdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1s3XSkpCisjZW5kaWYJLyogREVCVUcgKi8KKwl9CisJZWxzZSB7CS8qIG5vdCBwZXJtYW5lbnQgPT4gRFJWICovCisJCQorCQkvKiBBZGQgYml0IHRvIEluZXhhY3REcnZGaWx0ZXIuICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbSGFzaEJpdCAvIDhdIHw9CisJCQkxIDw8IChIYXNoQml0ICUgOCk7CisJCQorCQkvKiBDb3B5IGJpdCB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldIHw9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1tpXTsKKwkJfQorI2lmZGVmIERFQlVHCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0RHJ2RmlsdGVyOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzBdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1sxXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbMl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzNdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1s0XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbNV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzZdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1s3XSkpCisjZW5kaWYJLyogREVCVUcgKi8KKwl9CisJCisjZWxzZQkvKiBTS19BRERSX0NIRUFUICovCisJCisJLyogU2V0IGFsbCBiaXRzIGluIEluZXhhY3RGaWx0ZXIuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0gMHhGRjsKKwl9CisjZW5kaWYJLyogU0tfQUREUl9DSEVBVCAqLworCQkKKwlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19JTkVYQUNUKTsKKwkKK30JLyogU2tBZGRyR21hY01jQWRkICovCisKKyNlbmRpZiAvKiAhU0tfU0xJTSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyTWNVcGRhdGUgLSB1cGRhdGUgdGhlIEhXIE1DIGFkZHJlc3MgdGFibGUgYW5kIHNldCB0aGUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBvZiB0aGUgYWRkcmVzc2VzIGNvbnRhaW5lZCBpbiBhIGxvY2FsCisgKgl0YWJsZSBmb3IgYSBnaXZlbiBwb3J0LgorICoJSXQgYWxzbyBwcm9ncmFtcyB0aGUgcG9ydCdzIGN1cnJlbnQgcGh5c2ljYWwgTUFDIGFkZHJlc3MuCisgKgorICoJSXQgY2FsbHMgZWl0aGVyIFNrQWRkclhtYWNNY1VwZGF0ZSBvciBTa0FkZHJHbWFjTWNVcGRhdGUsIGFjY29yZGluZworICoJdG8gdGhlIGFkYXB0ZXIgaW4gdXNlLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgdGhlcmUuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkck1jVXBkYXRlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogUG9ydCBOdW1iZXIgKi8KK3sKKwlpbnQgUmV0dXJuQ29kZSA9IDA7CisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pIHx8IGRlZmluZWQoREVCVUcpKQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisjZW5kaWYgLyogIVNLX1NMSU0gfHwgREVCVUcgKi8KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyWG1hY01jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCisJaWYgKCFwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJHbWFjTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30JLyogU2tBZGRyTWNVcGRhdGUgKi8KKworCisjaWZkZWYgR0VORVNJUworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyWG1hY01jVXBkYXRlIC0gdXBkYXRlIHRoZSBIVyBNQyBhZGRyZXNzIHRhYmxlIGFuZCBzZXQgdGhlIE1BQyBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgZW5hYmxlcyByZWNlcHRpb24gb2YgdGhlIGFkZHJlc3NlcyBjb250YWluZWQgaW4gYSBsb2NhbAorICoJdGFibGUgZm9yIGEgZ2l2ZW4gcG9ydC4KKyAqCUl0IGFsc28gcHJvZ3JhbXMgdGhlIHBvcnQncyBjdXJyZW50IHBoeXNpY2FsIE1BQyBhZGRyZXNzLgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX01DX0ZJTFRFUklOR19FWEFDVAorICoJU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJYbWFjTWNVcGRhdGUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBQb3J0IE51bWJlciAqLworeworCVNLX1UzMgkJaTsKKwlTS19VOAkJSW5leGFjdDsKKwlTS19VMTYJCSpPdXRBZGRyOworCVNLX0FERFJfUE9SVAkqcEFQb3J0OworCisJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNrQWRkclhtYWNNY1VwZGF0ZSBvbiBQb3J0ICV1LlxuIiwgUG9ydE51bWJlcikpCisJCisJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdOworCisjaWZkZWYgREVCVUcKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiTmV4dDAgb24gUG9ydCAlZDogJWRcbiIsIFBvcnROdW1iZXIsIE5leHQwW1BvcnROdW1iZXJdKSkKKyNlbmRpZiAvKiBERUJVRyAqLworCisJLyogU3RhcnQgd2l0aCAwIHRvIGFsc28gcHJvZ3JhbSB0aGUgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQ7IGkrKykgeworCQkvKiBTZXQgZXhhY3QgbWF0Y2ggYWRkcmVzcyBpIG9uIFhNQUMgKi8KKwkJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+RXhhY3RbaV0uYVswXTsKKwkJWE1fT1VUQUREUihJb0MsIFBvcnROdW1iZXIsIFhNX0VYTShpKSwgT3V0QWRkcik7CisJfQorCisJLyogQ2xlYXIgb3RoZXIgcGVybWFuZW50IGV4YWN0IG1hdGNoIGFkZHJlc3NlcyBvbiBYTUFDICovCisJaWYgKHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hSbG10IDw9IFNLX0FERFJfTEFTVF9NQVRDSF9STE1UKSB7CisJCQorCQlTa1htQ2xyRXhhY3RBZGRyKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdCwKKwkJCVNLX0FERFJfTEFTVF9NQVRDSF9STE1UKTsKKwl9CisKKwlmb3IgKGkgPSBwQVBvcnQtPkZpcnN0RXhhY3RNYXRjaERydjsgaSA8IHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hEcnY7IGkrKykgeworCQlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5FeGFjdFtpXS5hWzBdOworCQlYTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgWE1fRVhNKGkpLCBPdXRBZGRyKTsKKwl9CisKKwkvKiBDbGVhciBvdGhlciBub24tcGVybWFuZW50IGV4YWN0IG1hdGNoIGFkZHJlc3NlcyBvbiBYTUFDICovCisJaWYgKHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hEcnYgPD0gU0tfQUREUl9MQVNUX01BVENIX0RSVikgeworCQkKKwkJU2tYbUNsckV4YWN0QWRkcihwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydiwKKwkJCVNLX0FERFJfTEFTVF9NQVRDSF9EUlYpOworCX0KKworCWZvciAoSW5leGFjdCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUluZXhhY3QgfD0gcEFQb3J0LT5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldOworCX0KKworCWlmIChwQVBvcnQtPlByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgeworCQkKKwkJLyogU2V0IGFsbCBiaXRzIGluIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworCQlYTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgWE1fSFNNLCAmT25lc0hhc2gpOworCQkKKwkJLyogRW5hYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoSW5leGFjdCAhPSAwKSB7CisJCQorCQkvKiBTZXQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJWE1fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIFhNX0hTTSwgJnBBUG9ydC0+SW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIHsKKwkJLyogRGlzYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfRkFMU0UpOworCX0KKworCWlmIChwQVBvcnQtPlByb21Nb2RlICE9IFNLX1BST01fTU9ERV9OT05FKSB7CisJCSh2b2lkKSBTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBJb0MsIFBvcnROdW1iZXIsIHBBUG9ydC0+UHJvbU1vZGUpOworCX0KKworCS8qIFNldCBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdOworCQorCVhNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9TQSwgT3V0QWRkcik7CisKKyNpZmRlZiB4REVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQ7IGkrKykgeworCQlTS19VOAkJSW5BZGRyOFs2XTsKKwkJU0tfVTE2CQkqSW5BZGRyOworCisJCS8qIEdldCBleGFjdCBtYXRjaCBhZGRyZXNzIGkgZnJvbSBwb3J0IFBvcnROdW1iZXIuICovCisJCUluQWRkciA9IChTS19VMTYgKikgJkluQWRkcjhbMF07CisJCQorCQlYTV9JTkFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9FWE0oaSksIEluQWRkcik7CisJCQorCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrQWRkclhtYWNNY1VwZGF0ZTogTUMgYWRkcmVzcyAlZCBvbiBQb3J0ICV1OiAiLAorCQkJICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAtLSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlpLAorCQkJCVBvcnROdW1iZXIsCisJCQkJSW5BZGRyOFswXSwKKwkJCQlJbkFkZHI4WzFdLAorCQkJCUluQWRkcjhbMl0sCisJCQkJSW5BZGRyOFszXSwKKwkJCQlJbkFkZHI4WzRdLAorCQkJCUluQWRkcjhbNV0sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzBdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVsxXSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbMl0sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzNdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVs0XSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbNV0pKQorCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJLyogRGV0ZXJtaW5lIHJldHVybiB2YWx1ZS4gKi8KKwlpZiAoSW5leGFjdCA9PSAwICYmIHBBUG9ydC0+UHJvbU1vZGUgPT0gMCkgeworCQlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19FWEFDVCk7CisJfQorCWVsc2UgeworCQlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19JTkVYQUNUKTsKKwl9CisJCit9CS8qIFNrQWRkclhtYWNNY1VwZGF0ZSAqLworCisjZW5kaWYgIC8qIEdFTkVTSVMgKi8KKworI2lmZGVmIFlVS09OCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJHbWFjTWNVcGRhdGUgLSB1cGRhdGUgdGhlIEhXIE1DIGFkZHJlc3MgdGFibGUgYW5kIHNldCB0aGUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBvZiB0aGUgYWRkcmVzc2VzIGNvbnRhaW5lZCBpbiBhIGxvY2FsCisgKgl0YWJsZSBmb3IgYSBnaXZlbiBwb3J0LgorICoJSXQgYWxzbyBwcm9ncmFtcyB0aGUgcG9ydCdzIGN1cnJlbnQgcGh5c2ljYWwgTUFDIGFkZHJlc3MuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkckdtYWNNY1VwZGF0ZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFBvcnQgTnVtYmVyICovCit7CisjaWZuZGVmIFNLX1NMSU0KKwlTS19VMzIJCWk7CisJU0tfVTgJCUluZXhhY3Q7CisjZW5kaWYJLyogbm90IFNLX1NMSU0gKi8KKwlTS19VMTYJCSpPdXRBZGRyOworCVNLX0FERFJfUE9SVAkqcEFQb3J0OworCisJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNrQWRkckdtYWNNY1VwZGF0ZSBvbiBQb3J0ICV1LlxuIiwgUG9ydE51bWJlcikpCisJCisJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdOworCisjaWZkZWYgREVCVUcKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiTmV4dDAgb24gUG9ydCAlZDogJWRcbiIsIFBvcnROdW1iZXIsIE5leHQwW1BvcnROdW1iZXJdKSkKKyNlbmRpZiAvKiBERUJVRyAqLworCQorI2lmbmRlZiBTS19TTElNCisJZm9yIChJbmV4YWN0ID0gMCwgaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJSW5leGFjdCB8PSBwQVBvcnQtPkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJfQorCQorCS8qIFNldCA2NC1iaXQgaGFzaCByZWdpc3RlciB0byBJbmV4YWN0RmlsdGVyLiAqLworCUdNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBHTV9NQ19BRERSX0gxLAorCQkmcEFQb3J0LT5JbmV4YWN0RmlsdGVyLkJ5dGVzWzBdKTsKKwkKKwlpZiAocEFQb3J0LT5Qcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpIHsJCQkJCisJCQorCQkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJCUdNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBHTV9NQ19BRERSX0gxLCAmT25lc0hhc2gpOworCQkKKwkJLyogRW5hYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSB7CQorCQkvKiBFbmFibGUgSGFzaGluZy4gKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJCisJaWYgKHBBUG9ydC0+UHJvbU1vZGUgIT0gU0tfUFJPTV9NT0RFX05PTkUpIHsKKwkJKHZvaWQpIFNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5Qcm9tTW9kZSk7CisJfQorI2Vsc2UgLyogU0tfU0xJTSAqLworCisJLyogU2V0IGFsbCBiaXRzIGluIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworCUdNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBHTV9NQ19BRERSX0gxLCAmT25lc0hhc2gpOworCisJLyogRW5hYmxlIEhhc2hpbmcgKi8KKwlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCQorCSh2b2lkKSBTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBJb0MsIFBvcnROdW1iZXIsIHBBUG9ydC0+UHJvbU1vZGUpOworCQorI2VuZGlmIC8qIFNLX1NMSU0gKi8KKwkKKwkvKiBTZXQgcG9ydCdzIGN1cnJlbnQgcGh5c2ljYWwgTUFDIGFkZHJlc3MuICovCisJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVswXTsKKwlHTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgR01fU1JDX0FERFJfMUwsIE91dEFkZHIpOworCQorCS8qIFNldCBwb3J0J3MgY3VycmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkV4YWN0WzBdLmFbMF07CisJR01fT1VUQUREUihJb0MsIFBvcnROdW1iZXIsIEdNX1NSQ19BRERSXzJMLCBPdXRBZGRyKTsKKwkKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyR21hY01jVXBkYXRlOiBQZXJtYW5lbnQgUGh5c2ljYWwgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzBdLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzFdLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzJdLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzNdLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzRdLAorCQkJcEFQb3J0LT5FeGFjdFswXS5hWzVdKSkKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNrQWRkckdtYWNNY1VwZGF0ZTogUGh5c2ljYWwgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzFdLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzRdLAorCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzVdKSkKKyNlbmRpZiAvKiBERUJVRyAqLworCQorI2lmbmRlZiBTS19TTElNCisJLyogRGV0ZXJtaW5lIHJldHVybiB2YWx1ZS4gKi8KKwlpZiAoSW5leGFjdCA9PSAwICYmIHBBUG9ydC0+UHJvbU1vZGUgPT0gMCkgeworCQlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19FWEFDVCk7CisJfQorCWVsc2UgeworCQlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19JTkVYQUNUKTsKKwl9CisjZWxzZSAvKiBTS19TTElNICovCisJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfSU5FWEFDVCk7CisjZW5kaWYgLyogU0tfU0xJTSAqLworCQorfQkvKiBTa0FkZHJHbWFjTWNVcGRhdGUgKi8KKworI2VuZGlmIC8qIFlVS09OICovCisKKyNpZm5kZWYgU0tfTk9fTUFPCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJPdmVycmlkZSAtIG92ZXJyaWRlIGEgcG9ydCdzIE1BQyBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgb3ZlcnJpZGVzIHRoZSBNQUMgYWRkcmVzcyBvZiBvbmUgcG9ydC4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KKyAqCVNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MgaWYgZHVwbGljYXRlIE1BQyBhZGRyZXNzLgorICoJU0tfQUREUl9NVUxUSUNBU1RfQUREUkVTUyBpZiBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0IGFkZHJlc3MuCisgKglTS19BRERSX1RPT19FQVJMWSBpZiBTS19JTklUX0lPIHdhcyBub3QgZXhlY3V0ZWQgYmVmb3JlLgorICovCitpbnQJU2tBZGRyT3ZlcnJpZGUoCitTS19BQwkJKnBBQywJCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJCUlvQywJCQkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJCQkvKiBQb3J0IE51bWJlciAqLworU0tfTUFDX0FERFIJU0tfRkFSICpwTmV3QWRkciwJLyogbmV3IE1BQyBhZGRyZXNzICovCitpbnQJCQlGbGFncykJCQkJLyogbG9naWNhbC9waHlzaWNhbCBNQUMgYWRkcmVzcyAqLworeworI2lmbmRlZiBTS19OT19STE1UCisJU0tfRVZQQVJBCVBhcmE7CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKwlTS19VMzIJCU5ldE51bWJlcjsKKwlTS19VMzIJCWk7CisJU0tfVTE2CQlTS19GQVIgKk91dEFkZHI7CisKKyNpZm5kZWYgU0tfTk9fUkxNVAorCU5ldE51bWJlciA9IHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyOworI2Vsc2UKKwlOZXROdW1iZXIgPSAwOworI2VuZGlmIC8qIFNLX05PX1JMTVQgKi8KKyNpZiAoIWRlZmluZWQoU0tfU0xJTSkgfHwgZGVmaW5lZChERUJVRykpCisJaWYgKFBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKyNlbmRpZiAvKiAhU0tfU0xJTSB8fCBERUJVRyAqLworCWlmIChwTmV3QWRkciAhPSBOVUxMICYmIChwTmV3QWRkci0+YVswXSAmIFNLX01DX0JJVCkgIT0gMCkgeworCQlyZXR1cm4gKFNLX0FERFJfTVVMVElDQVNUX0FERFJFU1MpOworCX0KKworCWlmICghcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCXJldHVybiAoU0tfQUREUl9UT09fRUFSTFkpOworCX0KKworCWlmIChGbGFncyAmIFNLX0FERFJfU0VUX0xPR0lDQUwpIHsJLyogQWN0aXZhdGUgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJLyogUGFyYW1ldGVyICpwTmV3QWRkciBpcyBpZ25vcmVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmICghcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfVE9PX0VBUkxZKTsKKwkJCX0KKwkJfQorI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFNldCBQb3J0TnVtYmVyIHRvIG51bWJlciBvZiBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbTmV0TnVtYmVyXS4KKwkJCVBvcnRbcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkV4YWN0WzBdID0KKwkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzczsKKworCQkvKiBXcml0ZSBhZGRyZXNzIHRvIGZpcnN0IGV4YWN0IG1hdGNoIGVudHJ5IG9mIGFjdGl2ZSBwb3J0LiAqLworCQkodm9pZCkgU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKwllbHNlIGlmIChGbGFncyAmIFNLX0FERFJfQ0xFQVJfTE9HSUNBTCkgeworCQkvKiBEZWFjdGl2YXRlIGxvZ2ljYWwgTUFDIGFkZHJlc3MuICovCisJCS8qIFBhcmFtZXRlciAqcE5ld0FkZHIgaXMgaWdub3JlZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlpZiAoIXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJCQl9CisJCX0KKyNpZm5kZWYgU0tfTk9fUkxNVAorCQkvKiBTZXQgUG9ydE51bWJlciB0byBudW1iZXIgb2YgbmV0J3MgYWN0aXZlIHBvcnQuICovCisJCVBvcnROdW1iZXIgPSBwQUMtPlJsbXQuTmV0W05ldE51bWJlcl0uCisJCQlQb3J0W3BBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5BY3RpdmVQb3J0XS0+UG9ydE51bWJlcjsKKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyBpKysgKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFswXS5hW2ldID0gMDsKKwkJfQorCisJCS8qIFdyaXRlIGFkZHJlc3MgdG8gZmlyc3QgZXhhY3QgbWF0Y2ggZW50cnkgb2YgYWN0aXZlIHBvcnQuICovCisJCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorCWVsc2UgaWYgKEZsYWdzICYgU0tfQUREUl9QSFlTSUNBTF9BRERSRVNTKSB7CS8qIFBoeXNpY2FsIE1BQyBhZGRyZXNzLiAqLworCQlpZiAoU0tfQUREUl9FUVVBTChwTmV3QWRkci0+YSwKKwkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeworCQkJcmV0dXJuIChTS19BRERSX0RVUExJQ0FURV9BRERSRVNTKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJaWYgKCFwQUMtPkFkZHIuUG9ydFtpXS5DdXJyZW50TWFjQWRkcmVzc1NldCkgeworCQkJCXJldHVybiAoU0tfQUREUl9UT09fRUFSTFkpOworCQkJfQorCisJCQlpZiAoU0tfQUREUl9FUVVBTChwTmV3QWRkci0+YSwKKwkJCQlwQUMtPkFkZHIuUG9ydFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeworCQkJCWlmIChpID09IFBvcnROdW1iZXIpIHsKKwkJCQkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmV0dXJuIChTS19BRERSX0RVUExJQ0FURV9BRERSRVNTKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5QcmV2aW91c01hY0FkZHJlc3MgPQorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3M7CisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzID0gKnBOZXdBZGRyOworCisJCS8qIENoYW5nZSBwb3J0J3MgcGh5c2ljYWwgTUFDIGFkZHJlc3MuICovCisJCU91dEFkZHIgPSAoU0tfVTE2IFNLX0ZBUiAqKSBwTmV3QWRkcjsKKyNpZmRlZiBHRU5FU0lTCisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQlYTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgWE1fU0EsIE91dEFkZHIpOworCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCisJCWlmICghcEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJR01fT1VUQUREUihJb0MsIFBvcnROdW1iZXIsIEdNX1NSQ19BRERSXzFMLCBPdXRBZGRyKTsKKwkJfQorI2VuZGlmIC8qIFlVS09OICovCisKKyNpZm5kZWYgU0tfTk9fUkxNVAorCQkvKiBSZXBvcnQgYWRkcmVzcyBjaGFuZ2UgdG8gUkxNVC4gKi8KKwkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQlQYXJhLlBhcmEzMlswXSA9IC0xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfUE9SVF9BRERSLCBQYXJhKTsKKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworCX0KKwllbHNlIHsJLyogTG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJaWYgKFNLX0FERFJfRVFVQUwocE5ld0FkZHItPmEsCisJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYSkpIHsKKwkJCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkJfQorCQkKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlpZiAoIXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJCQl9CisKKwkJCWlmIChTS19BRERSX0VRVUFMKHBOZXdBZGRyLT5hLAorCQkJCXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQkJcmV0dXJuIChTS19BRERSX0RVUExJQ0FURV9BRERSRVNTKTsKKwkJCX0KKwkJfQorCQkKKwkJLyoKKwkJICogSW4gY2FzZSB0aGF0IHRoZSBwaHlzaWNhbCBhbmQgdGhlIGxvZ2ljYWwgTUFDIGFkZHJlc3NlcyBhcmUgZXF1YWwKKwkJICogd2UgbXVzdCBhbHNvIGNoYW5nZSB0aGUgcGh5c2ljYWwgTUFDIGFkZHJlc3MgaGVyZS4KKwkJICogSW4gdGhpcyBjYXNlIHdlIGhhdmUgYW4gYWRhcHRlciB3aGljaCBpbml0aWFsbHkgd2FzIHByb2dyYW1tZWQgd2l0aAorCQkgKiB0d28gaWRlbnRpY2FsIE1BQyBhZGRyZXNzZXMuCisJCSAqLworCQlpZiAoU0tfQUREUl9FUVVBTChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hLAorCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkV4YWN0WzBdLmEpKSB7CisJCQkKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByZXZpb3VzTWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3M7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcyA9ICpwTmV3QWRkcjsKKwkJCQorI2lmbmRlZiBTS19OT19STE1UCisJCQkvKiBSZXBvcnQgYWRkcmVzcyBjaGFuZ2UgdG8gUkxNVC4gKi8KKwkJCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJCVBhcmEuUGFyYTMyWzBdID0gLTE7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfUE9SVF9BRERSLCBQYXJhKTsKKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworCQl9CisJCQorI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFNldCBQb3J0TnVtYmVyIHRvIG51bWJlciBvZiBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbTmV0TnVtYmVyXS4KKwkJCVBvcnRbcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcyA9ICpwTmV3QWRkcjsKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbMF0gPSAqcE5ld0FkZHI7CisjaWZkZWYgREVCVUcKKwkJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX0FERFIsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTa0FkZHJPdmVycmlkZTogUGVybWFuZW50IE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs1XSkpCisJCQorCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrQWRkck92ZXJyaWRlOiBOZXcgbG9naWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbMl0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbNV0pKQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAgICAgLyogV3JpdGUgYWRkcmVzcyB0byBmaXJzdCBleGFjdCBtYXRjaCBlbnRyeSBvZiBhY3RpdmUgcG9ydC4gKi8KKwkJKHZvaWQpIFNrQWRkck1jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisKKwlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCit9CS8qIFNrQWRkck92ZXJyaWRlICovCisKKworI2VuZGlmIC8qIFNLX05PX01BTyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UgLSBzZXQgcHJvbWlzY3VvdXMgbW9kZSBmb3IgZ2l2ZW4gcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIG1hbmFnZXMgcHJvbWlzY3VvdXMgbW9kZToKKyAqCS0gbm9uZQorICoJLSBhbGwgTExDIGZyYW1lcworICoJLSBhbGwgTUMgZnJhbWVzCisgKgorICoJSXQgY2FsbHMgZWl0aGVyIFNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZSBvcgorICoJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlLCBhY2NvcmRpbmcgdG8gdGhlIGFkYXB0ZXIgaW4gdXNlLgorICoJVGhlIHJlYWwgd29yayBpcyBkb25lIHRoZXJlLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkJLyogcG9ydCB3aG9zZSBwcm9taXNjdW91cyBtb2RlIGNoYW5nZXMgKi8KK2ludAkJTmV3UHJvbU1vZGUpCS8qIG5ldyBwcm9taXNjdW91cyBtb2RlICovCit7CisJaW50IFJldHVybkNvZGUgPSAwOworI2lmICghZGVmaW5lZChTS19TTElNKSB8fCBkZWZpbmVkKERFQlVHKSkKKwlpZiAoUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorI2VuZGlmIC8qICFTS19TTElNIHx8IERFQlVHICovCisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9CisJCQlTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBJb0MsIFBvcnROdW1iZXIsIE5ld1Byb21Nb2RlKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCisJaWYgKCFwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVJldHVybkNvZGUgPQorCQkJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBOZXdQcm9tTW9kZSk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwlyZXR1cm4gKFJldHVybkNvZGUpOworCit9CS8qIFNrQWRkclByb21pc2N1b3VzQ2hhbmdlICovCisKKyNpZmRlZiBHRU5FU0lTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UgLSBzZXQgcHJvbWlzY3VvdXMgbW9kZSBmb3IgZ2l2ZW4gcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIG1hbmFnZXMgcHJvbWlzY3VvdXMgbW9kZToKKyAqCS0gbm9uZQorICoJLSBhbGwgTExDIGZyYW1lcworICoJLSBhbGwgTUMgZnJhbWVzCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkJLyogcG9ydCB3aG9zZSBwcm9taXNjdW91cyBtb2RlIGNoYW5nZXMgKi8KK2ludAkJTmV3UHJvbU1vZGUpCS8qIG5ldyBwcm9taXNjdW91cyBtb2RlICovCit7CisJaW50CQkJaTsKKwlTS19CT09MCQlJbmV4YWN0TW9kZUJpdDsKKwlTS19VOAkJSW5leGFjdDsKKwlTS19VOAkJSHdJbmV4YWN0OworCVNLX0ZJTFRFUjY0CUh3SW5leGFjdEZpbHRlcjsKKwlTS19VMTYJCUxvTW9kZTsJCS8qIExvd2VyIDE2IGJpdHMgb2YgWE1BQyBNb2RlIFJlZ2lzdGVyLiAqLworCWludAkJCUN1clByb21Nb2RlID0gU0tfUFJPTV9NT0RFX05PTkU7CisKKwkvKiBSZWFkIEN1clByb21Nb2RlIGZyb20gSGFyZHdhcmUuICovCisJWE1fSU4xNihJb0MsIFBvcnROdW1iZXIsIFhNX01PREUsICZMb01vZGUpOworCisJaWYgKChMb01vZGUgJiBYTV9NRF9FTkFfUFJPTSkgIT0gMCkgeworCQkvKiBQcm9taXNjdW91cyBtb2RlISAqLworCQlDdXJQcm9tTW9kZSB8PSBTS19QUk9NX01PREVfTExDOworCX0KKwkKKwlmb3IgKEluZXhhY3QgPSAweEZGLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQlJbmV4YWN0ICY9IHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJfQorCWlmIChJbmV4YWN0ID09IDB4RkYpIHsKKwkJQ3VyUHJvbU1vZGUgfD0gKHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQyk7CisJfQorCWVsc2UgeworCQkvKiBHZXQgSW5leGFjdE1vZGVCaXQgKGJpdCBYTV9NRF9FTkFfSEFTSCBpbiBtb2RlIHJlZ2lzdGVyKSAqLworCQlYTV9JTjE2KElvQywgUG9ydE51bWJlciwgWE1fTU9ERSwgJkxvTW9kZSk7CisJCQorCQlJbmV4YWN0TW9kZUJpdCA9IChMb01vZGUgJiBYTV9NRF9FTkFfSEFTSCkgIT0gMDsKKworCQkvKiBSZWFkIDY0LWJpdCBoYXNoIHJlZ2lzdGVyIGZyb20gWE1BQyAqLworCQlYTV9JTkhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sICZId0luZXhhY3RGaWx0ZXIuQnl0ZXNbMF0pOworCisJCWZvciAoSHdJbmV4YWN0ID0gMHhGRiwgaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCUh3SW5leGFjdCAmPSBId0luZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJCX0KKworCQlpZiAoSW5leGFjdE1vZGVCaXQgJiYgKEh3SW5leGFjdCA9PSAweEZGKSkgeworCQkJQ3VyUHJvbU1vZGUgfD0gU0tfUFJPTV9NT0RFX0FMTF9NQzsKKwkJfQorCX0KKworCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlID0gTmV3UHJvbU1vZGU7CisKKwlpZiAoTmV3UHJvbU1vZGUgPT0gQ3VyUHJvbU1vZGUpIHsKKwkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCX0KKworCWlmICgoTmV3UHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSAmJgorCQkhKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykpIHsJLyogQWxsIE1DLiAqLworCQkKKwkJLyogU2V0IGFsbCBiaXRzIGluIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworCQlYTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgWE1fSFNNLCAmT25lc0hhc2gpOworCisJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCWVsc2UgaWYgKChDdXJQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpICYmCisJCSEoTmV3UHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSkgewkvKiBOb3JtIE1DLiAqLworCQlmb3IgKEluZXhhY3QgPSAwLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQkJSW5leGFjdCB8PSBwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldOworCQl9CisJCWlmIChJbmV4YWN0ID09IDApIHsKKwkJCS8qIERpc2FibGUgSGFzaGluZyAqLworCQkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBTZXQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJCVhNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sCisJCQkJJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0pOworCisJCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwkJfQorCX0KKworCWlmICgoTmV3UHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSAmJgorCQkhKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykpIHsJLyogUHJvbS4gTExDICovCisJCS8qIFNldCB0aGUgTUFDIGluIFByb21pc2N1b3VzIE1vZGUgKi8KKwkJU2tNYWNQcm9taXNjTW9kZShwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCWVsc2UgaWYgKChDdXJQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpICYmCisJCSEoTmV3UHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSkgewkvKiBOb3JtLiBMTEMuICovCisJCS8qIENsZWFyIFByb21pc2N1b3VzIE1vZGUgKi8KKwkJU2tNYWNQcm9taXNjTW9kZShwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfRkFMU0UpOworCX0KKwkKKwlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCit9CS8qIFNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZSAqLworCisjZW5kaWYgLyogR0VORVNJUyAqLworCisjaWZkZWYgWVVLT04KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZSAtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBnaXZlbiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgbWFuYWdlcyBwcm9taXNjdW91cyBtb2RlOgorICoJLSBub25lCisgKgktIGFsbCBMTEMgZnJhbWVzCisgKgktIGFsbCBNQyBmcmFtZXMKKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIsCQkvKiBwb3J0IHdob3NlIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlcyAqLworaW50CQlOZXdQcm9tTW9kZSkJLyogbmV3IHByb21pc2N1b3VzIG1vZGUgKi8KK3sKKwlTS19VMTYJCVJlY2VpdmVDb250cm9sOwkvKiBHTUFDIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCWludAkJQ3VyUHJvbU1vZGUgPSBTS19QUk9NX01PREVfTk9ORTsKKworCS8qIFJlYWQgQ3VyUHJvbU1vZGUgZnJvbSBIYXJkd2FyZS4gKi8KKwlHTV9JTjE2KElvQywgUG9ydE51bWJlciwgR01fUlhfQ1RSTCwgJlJlY2VpdmVDb250cm9sKTsKKworCWlmICgoUmVjZWl2ZUNvbnRyb2wgJiAoR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKSkgPT0gMCkgeworCQkvKiBQcm9taXNjdW91cyBtb2RlISAqLworCQlDdXJQcm9tTW9kZSB8PSBTS19QUk9NX01PREVfTExDOworCX0KKworCWlmICgoUmVjZWl2ZUNvbnRyb2wgJiBHTV9SWENSX01DRl9FTkEpID09IDApIHsKKwkJLyogQWxsIE11bHRpY2FzdCBtb2RlISAqLworCQlDdXJQcm9tTW9kZSB8PSAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKTsKKwl9CisKKwlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5Qcm9tTW9kZSA9IE5ld1Byb21Nb2RlOworCisJaWYgKE5ld1Byb21Nb2RlID09IEN1clByb21Nb2RlKSB7CisJCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwl9CisJCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSkgewkvKiBBbGwgTUMgKi8KKwkJCisJCS8qIFNldCBhbGwgYml0cyBpbiA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwkJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsICZPbmVzSGFzaCk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwkKKwlpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpKSB7CS8qIE5vcm0uIE1DICovCisKKwkJLyogU2V0IDY0LWJpdCBoYXNoIHJlZ2lzdGVyIHRvIEluZXhhY3RGaWx0ZXIuICovCisJCUdNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBHTV9NQ19BRERSX0gxLAorCQkJJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0pOworCisJCS8qIEVuYWJsZSBIYXNoaW5nLiAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKworCWlmICgoTmV3UHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSAmJgorCQkhKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykpIHsJLyogUHJvbS4gTExDICovCisJCQorCQkvKiBTZXQgdGhlIE1BQyB0byBQcm9taXNjdW91cyBNb2RlLiAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpKSB7CS8qIE5vcm0uIExMQyAqLworCQkKKwkJLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZS4gKi8KKwkJU2tNYWNQcm9taXNjTW9kZShwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfRkFMU0UpOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlICovCisKKyNlbmRpZiAvKiBZVUtPTiAqLworCisjaWZuZGVmIFNLX1NMSU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkclN3YXAgLSBzd2FwIGFkZHJlc3MgaW5mbworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHN3YXBzIGFkZHJlc3MgaW5mbyBvZiB0d28gcG9ydHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyU3dhcCgKK1NLX0FDCSpwQUMsCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJRnJvbVBvcnROdW1iZXIsCQkvKiBQb3J0MSBJbmRleCAqLworU0tfVTMyCVRvUG9ydE51bWJlcikJCS8qIFBvcnQyIEluZGV4ICovCit7CisJaW50CQkJaTsKKwlTS19VOAkJQnl0ZTsKKwlTS19NQUNfQUREUglNYWNBZGRyOworCVNLX1UzMgkJRFdvcmQ7CisKKwlpZiAoRnJvbVBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKworCWlmIChUb1BvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKworCWlmIChwQUMtPlJsbXQuUG9ydFtGcm9tUG9ydE51bWJlcl0uTmV0ICE9IHBBQy0+UmxtdC5Qb3J0W1RvUG9ydE51bWJlcl0uTmV0KSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKworCS8qCisJICogU3dhcDoKKwkgKiAtIEV4YWN0IE1hdGNoIEVudHJpZXMgKEdFbmVzaXMgYW5kIFl1a29uKQorCSAqICAgWXVrb24gdXNlcyBmaXJzdCBlbnRyeSBmb3IgdGhlIGxvZ2ljYWwgTUFDCisJICogICBhZGRyZXNzIChzdG9yZWQgaW4gdGhlIHNlY29uZCBHTUFDIHJlZ2lzdGVyKS4KKwkgKiAtIEZpcnN0RXhhY3RNYXRjaFJsbXQgKEdFbmVzaXMgb25seSkKKwkgKiAtIE5leHRFeGFjdE1hdGNoUmxtdCAoR0VuZXNpcyBvbmx5KQorCSAqIC0gRmlyc3RFeGFjdE1hdGNoRHJ2IChHRW5lc2lzIG9ubHkpCisJICogLSBOZXh0RXhhY3RNYXRjaERydiAoR0VuZXNpcyBvbmx5KQorCSAqIC0gNjQtYml0IGZpbHRlciAoSW5leGFjdEZpbHRlcikKKwkgKiAtIFByb21pc2N1b3VzIE1vZGUKKwkgKiBvZiBwb3J0cy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBTS19BRERSX0VYQUNUX01BVENIRVM7IGkrKykgeworCQlNYWNBZGRyID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkV4YWN0W2ldOworCQlwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uRXhhY3RbaV0gPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5FeGFjdFtpXTsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5FeGFjdFtpXSA9IE1hY0FkZHI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlCeXRlID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0KKwkJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldID0gQnl0ZTsKKwl9CisJCisJaSA9IHBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5Qcm9tTW9kZTsKKwlwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uUHJvbU1vZGUgPSBwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLlByb21Nb2RlOworCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uUHJvbU1vZGUgPSBpOworCQorCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaFJsbXQ7CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hSbG10ID0KKwkJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uRmlyc3RFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hSbG10ID0gRFdvcmQ7CisJCQorCQlEV29yZCA9IHBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQ7CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQ7CisJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10ID0gRFdvcmQ7CisJCQorCQlEV29yZCA9IHBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hEcnY7CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hEcnYgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hEcnY7CisJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uRmlyc3RFeGFjdE1hdGNoRHJ2ID0gRFdvcmQ7CisJCQorCQlEV29yZCA9IHBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2ID0KKwkJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnY7CisJCXBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPSBEV29yZDsKKwl9CisJCisJLyogQ0FVVElPTjogU29sdXRpb24gd29ya3MgaWYgb25seSBwb3J0cyBvZiBvbmUgYWRhcHRlciBhcmUgaW4gdXNlLiAqLworCWZvciAoaSA9IDA7IChTS19VMzIpIGkgPCBwQUMtPlJsbXQuTmV0W3BBQy0+UmxtdC5Qb3J0W1RvUG9ydE51bWJlcl0uCisJCU5ldC0+TmV0TnVtYmVyXS5OdW1Qb3J0czsgaSsrKSB7CisJCWlmIChwQUMtPlJsbXQuTmV0W3BBQy0+UmxtdC5Qb3J0W1RvUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXJdLgorCQkJUG9ydFtpXS0+UG9ydE51bWJlciA9PSBUb1BvcnROdW1iZXIpIHsKKwkJCXBBQy0+QWRkci5OZXRbcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcl0uCisJCQkJQWN0aXZlUG9ydCA9IGk7CisJCQkvKiAyMDAwMTIwNyBSQTogV2FzICJUb1BvcnROdW1iZXI7Ii4gKi8KKwkJfQorCX0KKwkKKwkodm9pZCkgU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIEZyb21Qb3J0TnVtYmVyKTsKKwkodm9pZCkgU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIFRvUG9ydE51bWJlcik7CisKKwlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCit9CS8qIFNrQWRkclN3YXAgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tjc3VtLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrY3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTZlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrY3N1bS5jCkBAIC0wLDAgKzEsODcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tjc3VtLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOC8yMCAxMzo1NTo1MyAkCisgKiBQdXJwb3NlOglTdG9yZS92ZXJpZnkgSW50ZXJuZXQgY2hlY2tzdW0gaW4gc2VuZC9yZWNlaXZlIHBhY2tldHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDMgU3lzS29ubmVjdCBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFNLX1VTRV9DU1VNCS8qIENoZWNrIGlmIENTVU0gaXMgdG8gYmUgdXNlZC4gKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tjc3VtLmMsdiAxLjEyIDIwMDMvMDgvMjAgMTM6NTU6NTMgbXNjaG1pZCBFeHAgJCAoQykgU3lzS29ubmVjdC4iOworI2VuZGlmCS8qICFsaW50ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGlzIHRoZSAiR0VuZXNpcyIgY29tbW9uIG1vZHVsZSAiQ1NVTSIuCisgKgorICogVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSwgc3RvcmUsIGFuZCB2ZXJpZnkgdGhlCisgKiBJbnRlcm5ldCBDaGVja3N1bSBvZiBJUCwgVENQLCBhbmQgVURQIGZyYW1lcy4KKyAqCisgKiAiR0VuZXNpcyIgaXMgYW4gYWJicmV2aWF0aW9uIG9mICJHaWdhYml0IEV0aGVybmV0IE5ldHdvcmsgU3lzdGVtIGluIFNpbGljb24iCisgKiBhbmQgaXMgdGhlIGNvZGUgbmFtZSBvZiB0aGlzIFN5c0tvbm5lY3QgcHJvamVjdC4KKyAqCisgKiBDb21waWxhdGlvbiBPcHRpb25zOgorICoKKyAqCVNLX1VTRV9DU1VNIC0gRGVmaW5lIGlmIENTVU0gaXMgdG8gYmUgdXNlZC4gT3RoZXJ3aXNlLCBDU1VNIHdpbGwgYmUgYW4KKyAqCWVtcHR5IG1vZHVsZS4KKyAqCisgKglTS0NTX09WRVJXUklURV9QUk9UTyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcHJvdG9jb2wgaWQKKyAqCWRlZmluaXRpb25zLiBJbiB0aGlzIGNhc2UsIGFsbCBTS0NTX1BST1RPX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqCVNLQ1NfT1ZFUldSSVRFX1NUQVRVUyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcmV0dXJuIHN0YXR1cworICoJZGVmaW5pdGlvbnMuIEluIHRoaXMgY2FzZSwgYWxsIFNLQ1NfU1RBVFVTX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJImgvc2tkcnYxc3QuaCIKKyAqCSJoL3NrY3N1bS5oIgorICoJImgvc2t0eXBlcy5oIgorICoJImgvc2txdWV1ZS5oIgorICoJImgvc2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tjc3VtLmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgc2l6ZSBvZiBhbiBFdGhlcm5ldCBNQUMgaGVhZGVyLiAqLworI2RlZmluZSBTS0NTX0VUSEVSTkVUX01BQ19IRUFERVJfU0laRQkJCSg2KzYrMikKKworLyogVGhlIHNpemUgb2YgdGhlIHVzZWQgdG9wb2xvZ3kncyBNQUMgaGVhZGVyLiAqLworI2RlZmluZQlTS0NTX01BQ19IRUFERVJfU0laRQlTS0NTX0VUSEVSTkVUX01BQ19IRUFERVJfU0laRQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgSVAgaGVhZGVyIHdpdGhvdXQgYW55IG9wdGlvbiBmaWVsZHMuICovCisjZGVmaW5lIFNLQ1NfSVBfSEVBREVSX1NJWkUJCQkJCQkyMAorCisvKgorICogRmllbGQgb2Zmc2V0cyB3aXRoaW4gdGhlIElQIGhlYWRlci4KKyAqLworCisvKiAiSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24iIGFuZCAiTGVuZ3RoIi4gKi8KKyNkZWZpbmUgU0tDU19PRlNfSVBfSEVBREVSX1ZFUlNJT05fQU5EX0xFTkdUSAkwCisKKy8qICJUb3RhbCBMZW5ndGgiLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9UT1RBTF9MRU5HVEgJCQkJMgorCisvKiAiRmxhZ3MiICJGcmFnbWVudCBPZmZzZXQiLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9GTEFHU19BTkRfRlJBR01FTlRfT0ZGU0VUCTYKKworLyogIk5leHQgTGV2ZWwgUHJvdG9jb2wiIGlkZW50aWZpZXIuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX05FWFRfTEVWRUxfUFJPVE9DT0wJCQk5CisKKy8qIFNvdXJjZSBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9TT1VSQ0VfQUREUkVTUwkJCQkxMgorCisvKiBEZXN0aW5hdGlvbiBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTCQkJMTYKKworCisvKgorICogRmllbGQgb2Zmc2V0cyB3aXRoaW4gdGhlIFVEUCBoZWFkZXIuCisgKi8KKworLyogVURQIGNoZWNrc3VtLiAqLworI2RlZmluZSBTS0NTX09GU19VRFBfQ0hFQ0tTVU0JCQkJCTYKKworLyogSVAgIk5leHQgTGV2ZWwgUHJvdG9jb2wiIGlkZW50aWZpZXJzIChzZWUgUkZDIDc5MCkuICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fSURfVENQCQk2CS8qIFRyYW5zcG9ydCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fSURfVURQCQkxNwkvKiBVc2VyIERhdGFncmFtIFByb3RvY29sICovCisKKy8qIElQICJEb24ndCBGcmFnbWVudCIgYml0LiAqLworI2RlZmluZSBTS0NTX0lQX0RPTlRfRlJBR01FTlQJU0tDU19IVE9OMTYoMHg0MDAwKQorCisvKiBBZGQgYSBieXRlIG9mZnNldCB0byBhIHBvaW50ZXIuICovCisjZGVmaW5lIFNLQ1NfSURYKHBQdHIsIE9mcykJKCh2b2lkICopICgoY2hhciAqKSAocFB0cikgKyAoT2ZzKSkpCisKKy8qCisgKiBNYWNyb3MgdGhhdCBjb252ZXJ0IGhvc3QgdG8gbmV0d29yayByZXByZXNlbnRhdGlvbiBhbmQgdmljZSB2ZXJzYSwgaS5lLgorICogbGl0dGxlL2JpZyBlbmRpYW4gY29udmVyc2lvbiBvbiBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzIG9ubHkuCisgKi8KKyNpZmRlZiBTS19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFNLQ1NfSFRPTjE2KFZhbDE2KQkoKCh1bnNpZ25lZCkgKFZhbDE2KSA+PiA4KSB8ICgoKFZhbDE2KSAmIDB4ZmYpIDw8IDgpKQorI2VuZGlmCS8qIFNLX0xJVFRMRV9FTkRJQU4gKi8KKyNpZmRlZiBTS19CSUdfRU5ESUFOCisjZGVmaW5lIFNLQ1NfSFRPTjE2KFZhbDE2KQkoVmFsMTYpCisjZW5kaWYJLyogU0tfQklHX0VORElBTiAqLworI2RlZmluZSBTS0NTX05UT0gxNihWYWwxNikJU0tDU19IVE9OMTYoVmFsMTYpCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0NzR2V0U2VuZEluZm8gLSBnZXQgY2hlY2tzdW0gaW5mb3JtYXRpb24gZm9yIGEgc2VuZCBwYWNrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldCBhbGwgY2hlY2tzdW0gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHNlbmQgYSBUQ1Agb3IgVURQIHBhY2tldC4gVGhlCisgKglmdW5jdGlvbiBjaGVja3MgdGhlIElQIGhlYWRlciBwYXNzZWQgdG8gaXQuIElmIHRoZSBoaWdoLWxldmVsIHByb3RvY29sCisgKglpcyBlaXRoZXIgVENQIG9yIFVEUCB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIGFuZAorICoJcmV0dXJuZWQuCisgKgorICoJVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgSVAgaGVhZGVyIChpbmNsdWRpbmcgYW55CisgKglJUCBvcHRpb24gZmllbGRzKSwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgSVAgZGF0YQorICoJd2hpY2ggaW4gdHVybiBpcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBUQ1Agb3IgVURQIGhlYWRlci4KKyAqCisgKglUaGUgZnVuY3Rpb24gYWxzbyByZXR1cm5zIHRoZSBUQ1Agb3IgVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0sIHdoaWNoCisgKglzaG91bGQgYmUgdXNlZCBhcyB0aGUgc3RhcnQgdmFsdWUgZm9yIHRoZSBoYXJkd2FyZSBjaGVja3N1bSBjYWxjdWxhdGlvbi4KKyAqCShOb3RlIHRoYXQgYW55IGFjdHVhbCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIGNhbiBuZXZlciBjYWxjdWxhdGUgdG8KKyAqCXplcm8uKQorICoKKyAqIE5vdGU6CisgKglUaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgR0VORVNJUyBBU0lDIHdoaWNoIG1heSBsZWFkIHRvIHdyb25nIGNoZWNrc3Vtcy4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBBIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJcElwSGVhZGVyIC0gUG9pbnRlciB0byBJUCBoZWFkZXIuIE11c3QgYmUgYXQgbGVhc3QgdGhlIElQIGhlYWRlciAqbm90KgorICoJaW5jbHVkaW5nIGFueSBvcHRpb24gZmllbGRzLCBpLmUuIGF0IGxlYXN0IDIwIGJ5dGVzLgorICoKKyAqCU5vdGU6IFRoaXMgcG9pbnRlciB3aWxsIGJlIHVzZWQgdG8gYWRkcmVzcyA4LSwgMTYtLCBhbmQgMzItYml0CisgKgl2YXJpYWJsZXMgd2l0aCB0aGUgcmVzcGVjdGl2ZSBhbGlnbm1lbnQgb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgcG9pbnRlci4KKyAqCVRodXMsIHRoZSBwb2ludGVyIHNob3VsZCBwb2ludCB0byBhIDMyLWJpdCBhbGlnbmVkIGFkZHJlc3MuIElmIHRoZQorICoJdGFyZ2V0IHN5c3RlbSBjYW5ub3QgYWRkcmVzcyAzMi1iaXQgdmFyaWFibGVzIG9uIG5vbiAzMi1iaXQgYWxpZ25lZAorICoJYWRkcmVzc2VzLCB0aGVuIHRoZSBwb2ludGVyICptdXN0KiBwb2ludCB0byBhIDMyLWJpdCBhbGlnbmVkIGFkZHJlc3MuCisgKgorICoJcFBhY2tldEluZm8gLSBBIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoaXMKKyAqCXBhY2tldC4gQmVmb3JlIGNhbGxpbmcgdGhpcyBTa0NzR2V0U2VuZEluZm8oKSwgdGhlIGZvbGxvd2luZyBmaWVsZCBtdXN0CisgKgliZSBpbml0aWFsaXplZDoKKyAqCisgKgkJUHJvdG9jb2xGbGFncyAtIEluaXRpYWxpemUgd2l0aCBhbnkgY29tYmluYXRpb24gb2YKKyAqCQlTS0NTX1BST1RPX1hYWCBiaXQgZmxhZ3MuIFNrQ3NHZXRTZW5kSW5mbygpIHdpbGwgb25seSB3b3JrIG9uCisgKgkJdGhlIHByb3RvY29scyBzcGVjaWZpZWQgaGVyZS4gQW55IHByb3RvY29sKHMpIG5vdCBzcGVjaWZpZWQKKyAqCQloZXJlIHdpbGwgYmUgaWdub3JlZC4KKyAqCisgKgkJTm90ZTogT25seSBvbmUgY2hlY2tzdW0gY2FuIGJlIGNhbGN1bGF0ZWQgaW4gaGFyZHdhcmUuIFRodXMsIGlmCisgKgkJU0tDU19QUk9UT19JUCBpcyBzcGVjaWZpZWQgaW4gdGhlICdQcm90b2NvbEZsYWdzJywKKyAqCQlTa0NzR2V0U2VuZEluZm8oKSBtdXN0IGNhbGN1bGF0ZSB0aGUgSVAgaGVhZGVyIGNoZWNrc3VtIGluCisgKgkJc29mdHdhcmUuIEl0IG1pZ2h0IGJlIGEgYmV0dGVyIGlkZWEgdG8gaGF2ZSB0aGUgY2FsbGluZworICoJCXByb3RvY29sIHN0YWNrIGNhbGN1bGF0ZSB0aGUgSVAgaGVhZGVyIGNoZWNrc3VtLgorICoKKyAqIFJldHVybnM6IE4vQQorICoJT24gcmV0dXJuLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBpbiAncFBhY2tldEluZm8nIG1heSBvciBtYXkgbm90IGhhdmUKKyAqCWJlZW4gZmlsbGVkIHdpdGggaW5mb3JtYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcHJvdG9jb2wocykgZm91bmQgaW4gdGhlCisgKglwYWNrZXQ6CisgKgorICoJUHJvdG9jb2xGbGFncyAtIFJldHVybnMgdGhlIFNLQ1NfUFJPVE9fWFhYIGJpdCBmbGFncyBvZiB0aGUgcHJvdG9jb2wocykKKyAqCXRoYXQgd2VyZSBib3RoIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyIGFuZCBhY3R1YWxseSBmb3VuZCBpbiB0aGUgcGFja2V0LgorICoJUHJvdG9jb2wocykgbm90IHNwZWNpZmllZCBieSB0aGUgY2FsbGVyIGFuZC9vciBub3QgZm91bmQgaW4gdGhlIHBhY2tldAorICoJd2lsbCBoYXZlIHRoZWlyIHJlc3BlY3RpdmUgU0tDU19QUk9UT19YWFggYml0IGZsYWdzIHJlc2V0LgorICoKKyAqCU5vdGU6IEZvciBJUCBmcmFnbWVudHMsIFRDUCBhbmQgVURQIHBhY2tldCBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkLgorICoKKyAqCUlwSGVhZGVyTGVuZ3RoIC0gVGhlIHRvdGFsIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY29tcGxldGUgSVAgaGVhZGVyCisgKglpbmNsdWRpbmcgYW55IG9wdGlvbiBmaWVsZHMgaXMgcmV0dXJuZWQgaGVyZS4gVGhpcyBpcyB0aGUgc3RhcnQgb2Zmc2V0CisgKglvZiB0aGUgSVAgZGF0YSwgaS5lLiB0aGUgVENQIG9yIFVEUCBoZWFkZXIgaWYgcHJlc2VudC4KKyAqCisgKglJcEhlYWRlckNoZWNrc3VtIC0gSWYgSVAgaGFzIGJlZW4gc3BlY2lmaWVkIGluIHRoZSAnUHJvdG9jb2xGbGFncycsIHRoZQorICoJMTYtYml0IEludGVybmV0IENoZWNrc3VtIG9mIHRoZSBJUCBoZWFkZXIgaXMgcmV0dXJuZWQgaGVyZS4gVGhpcyB2YWx1ZQorICoJaXMgdG8gYmUgc3RvcmVkIGludG8gdGhlIHBhY2tldCdzICdJUCBIZWFkZXIgQ2hlY2tzdW0nIGZpZWxkLgorICoKKyAqCVBzZXVkb0hlYWRlckNoZWNrc3VtIC0gSWYgdGhpcyBpcyBhIFRDUCBvciBVRFAgcGFja2V0IGFuZCBpZiBUQ1Agb3IgVURQCisgKgloYXMgYmVlbiBzcGVjaWZpZWQgaW4gdGhlICdQcm90b2NvbEZsYWdzJywgdGhlIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bQorICoJb2YgdGhlIFRDUCBvciBVRFAgcHNldWRvIGhlYWRlciBpcyByZXR1cm5lZCBoZXJlLgorICovCit2b2lkIFNrQ3NHZXRTZW5kSW5mbygKK1NLX0FDCQkJCSpwQWMsCQkJLyogQWRhcHRlciBjb250ZXh0IHN0cnVjdC4gKi8KK3ZvaWQJCQkJKnBJcEhlYWRlciwJCS8qIElQIGhlYWRlci4gKi8KK1NLQ1NfUEFDS0VUX0lORk8JKnBQYWNrZXRJbmZvLAkvKiBQYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0LiAqLworaW50CQkJCQlOZXROdW1iZXIpCQkvKiBOZXQgbnVtYmVyICovCit7CisJLyogSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24gZm91bmQgaW4gSVAgaGVhZGVyLiAqLworCXVuc2lnbmVkIEludGVybmV0SGVhZGVyVmVyc2lvbjsKKworCS8qIExlbmd0aCBvZiB0aGUgSVAgaGVhZGVyIGFzIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckxlbmd0aDsKKworCS8qIEJpdCBmaWVsZCBzcGVjaWZpeWluZyB0aGUgZGVzaXJlZC9mb3VuZCBwcm90b2NvbHMuICovCisJdW5zaWduZWQgUHJvdG9jb2xGbGFnczsKKworCS8qIE5leHQgbGV2ZWwgcHJvdG9jb2wgaWRlbnRpZmllciBmb3VuZCBpbiBJUCBoZWFkZXIuICovCisJdW5zaWduZWQgTmV4dExldmVsUHJvdG9jb2w7CisKKwkvKiBMZW5ndGggb2YgSVAgZGF0YSBwb3J0aW9uLiAqLworCXVuc2lnbmVkIElwRGF0YUxlbmd0aDsKKworCS8qIFRDUC9VRFAgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gKi8KKwl1bnNpZ25lZCBsb25nIFBzZXVkb0hlYWRlckNoZWNrc3VtOworCisJLyogUG9pbnRlciB0byBuZXh0IGxldmVsIHByb3RvY29sIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAqLworCVNLQ1NfUFJPVE9fU1RBVFMgKk5leHRMZXZlbFByb3RvU3RhdHM7CisKKwkvKiBUZW1wb3JhcnkgdmFyaWFibGUuICovCisJdW5zaWduZWQgVG1wOworCisJVG1wID0gKihTS19VOCAqKQorCQlTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX0hFQURFUl9WRVJTSU9OX0FORF9MRU5HVEgpOworCisJLyogR2V0IHRoZSBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAoSUhWKS4gKi8KKwkvKiBOb3RlOiBUaGUgSUhWIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgZm91ciBiaXRzLiAqLworCisJSW50ZXJuZXRIZWFkZXJWZXJzaW9uID0gVG1wID4+IDQ7CisKKwkvKiBDaGVjayB0aGUgSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24uICovCisJLyogTm90ZTogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBJUCB2ZXJzaW9uIDQuICovCisKKwlpZiAoSW50ZXJuZXRIZWFkZXJWZXJzaW9uICE9IDQpIHsJLyogSVB2ND8gKi8KKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1RYLAorCQkJKCJUeDogVW5rbm93biBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAldS5cbiIsCisJCQlJbnRlcm5ldEhlYWRlclZlcnNpb24pKTsKKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSAwOworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlR4VW5hYmxlQ3RzKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIElQIGhlYWRlciBsZW5ndGggKElITCkuICovCisJLyoKKwkgKiBOb3RlOiBUaGUgSUhMIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgZm91ciBiaXRzIGFzIHRoZSBudW1iZXIgb2YKKwkgKiA0LWJ5dGUgd29yZHMuCisJICovCisKKwlJcEhlYWRlckxlbmd0aCA9IChUbXAgJiAweGYpICogNDsKKwlwUGFja2V0SW5mby0+SXBIZWFkZXJMZW5ndGggPSBJcEhlYWRlckxlbmd0aDsKKworCS8qIENoZWNrIHRoZSBJUCBoZWFkZXIgbGVuZ3RoLiAqLworCisJLyogMDQtQXVnLTE5OTggc3cgLSBSZWFsbHkgY2hlY2sgdGhlIElITD8gTmVjZXNzYXJ5PyAqLworCisJaWYgKElwSGVhZGVyTGVuZ3RoIDwgNSo0KSB7CisJCVNLX0RCR19NU0cocEFjLCBTS19EQkdNT0RfQ1NVTSwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9UWCwKKwkJCSgiVHg6IEludmFsaWQgSVAgSGVhZGVyIExlbmd0aCAldS5cbiIsIElwSGVhZGVyTGVuZ3RoKSk7CisJCXBQYWNrZXRJbmZvLT5Qcm90b2NvbEZsYWdzID0gMDsKKwkJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5UeFVuYWJsZUN0cysrOworCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBpcyBhbiBJUHY0IGZyYW1lIHdpdGggYSBoZWFkZXIgb2YgdmFsaWQgbGVuZ3RoLiAqLworCisJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5UeE9rQ3RzKys7CisKKwkvKiBDaGVjayBpZiB3ZSBzaG91bGQgY2FsY3VsYXRlIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0uICovCisKKwlQcm90b2NvbEZsYWdzID0gcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3M7CisKKwlpZiAoUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fSVApIHsKKwkJcFBhY2tldEluZm8tPklwSGVhZGVyQ2hlY2tzdW0gPQorCQkJU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKHBJcEhlYWRlciwgSXBIZWFkZXJMZW5ndGgpOworCX0KKworCS8qIEdldCB0aGUgbmV4dCBsZXZlbCBwcm90b2NvbCBpZGVudGlmaWVyLiAqLworCisJTmV4dExldmVsUHJvdG9jb2wgPQorCQkqKFNLX1U4ICopIFNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfTkVYVF9MRVZFTF9QUk9UT0NPTCk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoaXMgaXMgYSBUQ1Agb3IgVURQIGZyYW1lIGFuZCBpZiB3ZSBzaG91bGQgY2FsY3VsYXRlIHRoZQorCSAqIFRDUC9VRFAgcHNldWRvIGhlYWRlciBjaGVja3N1bS4KKwkgKgorCSAqIEFsc28gY2xlYXIgYWxsIHByb3RvY29sIGJpdCBmbGFncyBvZiBwcm90b2NvbHMgbm90IHByZXNlbnQgaW4gdGhlCisJICogZnJhbWUuCisJICovCisKKwlpZiAoKFByb3RvY29sRmxhZ3MgJiBTS0NTX1BST1RPX1RDUCkgIT0gMCAmJgorCQlOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCkgeworCQkvKiBUQ1AvSVAgZnJhbWUuICovCisJCVByb3RvY29sRmxhZ3MgJj0gU0tDU19QUk9UT19UQ1AgfCBTS0NTX1BST1RPX0lQOworCQlOZXh0TGV2ZWxQcm90b1N0YXRzID0KKwkJCSZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfVENQXTsKKwl9CisJZWxzZSBpZiAoKFByb3RvY29sRmxhZ3MgJiBTS0NTX1BST1RPX1VEUCkgIT0gMCAmJgorCQlOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1VEUCkgeworCQkvKiBVRFAvSVAgZnJhbWUuICovCisJCVByb3RvY29sRmxhZ3MgJj0gU0tDU19QUk9UT19VRFAgfCBTS0NTX1BST1RPX0lQOworCQlOZXh0TGV2ZWxQcm90b1N0YXRzID0KKwkJCSZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfVURQXTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIEVpdGhlciBub3QgYSBUQ1Agb3IgVURQIGZyYW1lIGFuZC9vciBUQ1AvVURQIHByb2Nlc3Npbmcgbm90CisJCSAqIHNwZWNpZmllZC4KKwkJICovCisJCXBQYWNrZXRJbmZvLT5Qcm90b2NvbEZsYWdzID0gUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fSVA7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGFuIElQIGZyYWdtZW50LiAqLworCisJLyoKKwkgKiBOb3RlOiBBbiBJUCBmcmFnbWVudCBoYXMgYSBub24temVybyAiRnJhZ21lbnQgT2Zmc2V0IiBmaWVsZCBhbmQvb3IKKwkgKiB0aGUgIk1vcmUgRnJhZ21lbnRzIiBiaXQgc2V0LiBUaHVzLCBpZiBib3RoIHRoZSAiRnJhZ21lbnQgT2Zmc2V0IgorCSAqIGFuZCB0aGUgIk1vcmUgRnJhZ21lbnRzIiBhcmUgemVybywgaXQgaXMgKm5vdCogYSBmcmFnbWVudC4gV2UgY2FuCisJICogZWFzaWx5IGNoZWNrIGJvdGggYXQgdGhlIHNhbWUgdGltZSBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSAxNi1iaXQKKwkgKiB3b3JkLgorCSAqLworCisJaWYgKCgqKFNLX1UxNiAqKQorCQlTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX0ZMQUdTX0FORF9GUkFHTUVOVF9PRkZTRVQpICYKKwkJflNLQ1NfSVBfRE9OVF9GUkFHTUVOVCkgIT0gMCkgeworCQkvKiBJUCBmcmFnbWVudDsgaWdub3JlIGFsbCBvdGhlciBwcm90b2NvbHMuICovCisJCXBQYWNrZXRJbmZvLT5Qcm90b2NvbEZsYWdzID0gUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fSVA7CisJCU5leHRMZXZlbFByb3RvU3RhdHMtPlR4VW5hYmxlQ3RzKys7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLgorCSAqLworCisJLyogR2V0IHRvdGFsIGxlbmd0aCBvZiBJUCBoZWFkZXIgYW5kIGRhdGEuICovCisKKwlJcERhdGFMZW5ndGggPQorCQkqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX1RPVEFMX0xFTkdUSCk7CisKKwkvKiBHZXQgbGVuZ3RoIG9mIElQIGRhdGEgcG9ydGlvbi4gKi8KKworCUlwRGF0YUxlbmd0aCA9IFNLQ1NfTlRPSDE2KElwRGF0YUxlbmd0aCkgLSBJcEhlYWRlckxlbmd0aDsKKworCS8qIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBwc2V1ZG8gaGVhZGVyIGZpZWxkcyAoMTYtYml0KS4gKi8KKworCVBzZXVkb0hlYWRlckNoZWNrc3VtID0KKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX1NPVVJDRV9BRERSRVNTICsgMCkgKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAyKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMCkgKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfREVTVElOQVRJT05fQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KE5leHRMZXZlbFByb3RvY29sKSArCisJCSh1bnNpZ25lZCBsb25nKSBTS0NTX0hUT04xNihJcERhdGFMZW5ndGgpOworCQorCS8qIEFkZC1pbiBhbnkgY2Fycmllcy4gKi8KKworCVNLQ1NfT0NfQUREKFBzZXVkb0hlYWRlckNoZWNrc3VtLCBQc2V1ZG9IZWFkZXJDaGVja3N1bSwgMCk7CisKKwkvKiBBZGQtaW4gYW55IG5ldyBjYXJyeS4gKi8KKworCVNLQ1NfT0NfQUREKHBQYWNrZXRJbmZvLT5Qc2V1ZG9IZWFkZXJDaGVja3N1bSwgUHNldWRvSGVhZGVyQ2hlY2tzdW0sIDApOworCisJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSBQcm90b2NvbEZsYWdzOworCU5leHRMZXZlbFByb3RvU3RhdHMtPlR4T2tDdHMrKzsJLyogU3VjY2Vzcy4gKi8KK30JLyogU2tDc0dldFNlbmRJbmZvICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NHZXRSZWNlaXZlSW5mbyAtIHZlcmlmeSBjaGVja3N1bSBpbmZvcm1hdGlvbiBmb3IgYSByZWNlaXZlZCBwYWNrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVZlcmlmeSBhIHJlY2VpdmVkIGZyYW1lJ3MgY2hlY2tzdW0uIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RhdHVzIGNvZGUKKyAqCXJlZmxlY3RpbmcgdGhlIHJlc3VsdCBvZiB0aGUgdmVyaWZpY2F0aW9uLgorICoKKyAqIE5vdGU6CisgKglCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHlvdSBoYXZlIHRvIHZlcmlmeSB0aGF0IHRoZSBmcmFtZSBpcworICoJbm90IHBhZGRlZCBhbmQgQ2hlY2tzdW0xIGFuZCBDaGVja3N1bTIgYXJlIGJpZ2dlciB0aGFuIDEuCisgKgorICogQXJndW1lbnRzOgorICoJcEFjIC0gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXBJcEhlYWRlciAtIFBvaW50ZXIgdG8gSVAgaGVhZGVyLiBNdXN0IGJlIGF0IGxlYXN0IHRoZSBsZW5ndGggaW4gYnl0ZXMKKyAqCW9mIHRoZSByZWNlaXZlZCBJUCBoZWFkZXIgaW5jbHVkaW5nIGFueSBvcHRpb24gZmllbGRzLiBGb3IgVURQIHBhY2tldHMsCisgKgk4IGFkZGl0aW9uYWwgYnl0ZXMgYXJlIG5lZWRlZCB0byBhY2Nlc3MgdGhlIFVEUCBjaGVja3N1bS4KKyAqCisgKglOb3RlOiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgSVAgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgZm91cgorICoJYml0cyBvZiB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlIElQIGhlYWRlciBhcyB0aGUgbnVtYmVyIG9mIDQtYnl0ZSB3b3JkcywKKyAqCXNvIGl0IG11c3QgYmUgbXVsdGlwbGllZCBieSBmb3VyIHRvIGdldCB0aGUgbGVuZ3RoIGluIGJ5dGVzLiBUaHVzLCB0aGUKKyAqCW1heGltdW0gSVAgaGVhZGVyIGxlbmd0aCBpcyAxNSAqIDQgPSA2MCBieXRlcy4KKyAqCisgKglDaGVja3N1bTEgLSBUaGUgZmlyc3QgMTYtYml0IEludGVybmV0IENoZWNrc3VtIGNhbGN1bGF0ZWQgYnkgdGhlCisgKgloYXJkd2FyZSBzdGFydGluZyBhdCB0aGUgb2Zmc2V0IHJldHVybmVkIGJ5IFNrQ3NTZXRSZWNlaXZlRmxhZ3MoKS4KKyAqCisgKglDaGVja3N1bTIgLSBUaGUgc2Vjb25kIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bSBjYWxjdWxhdGVkIGJ5IHRoZQorICoJaGFyZHdhcmUgc3RhcnRpbmcgYXQgdGhlIG9mZnNldCByZXR1cm5lZCBieSBTa0NzU2V0UmVjZWl2ZUZsYWdzKCkuCisgKgorICogUmV0dXJuczoKKyAqCVNLQ1NfU1RBVFVTX1VOS05PV05fSVBfVkVSU0lPTiAtIE5vdCBhbiBJUCB2NCBmcmFtZS4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1IgLSBJUCBjaGVja3N1bSBlcnJvci4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQIC0gSVAgY2hlY2tzdW0gZXJyb3IgaW4gVENQIGZyYW1lLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9VRFAgLSBJUCBjaGVja3N1bSBlcnJvciBpbiBVRFAgZnJhbWUKKyAqCVNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UIC0gSVAgZnJhZ21lbnQgKElQIGNoZWNrc3VtIG9rKS4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fT0sgLSBJUCBjaGVja3N1bSBvayAobm90IGEgVENQIG9yIFVEUCBmcmFtZSkuCisgKglTS0NTX1NUQVRVU19UQ1BfQ1NVTV9FUlJPUiAtIFRDUCBjaGVja3N1bSBlcnJvciAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IgLSBVRFAgY2hlY2tzdW0gZXJyb3IgKElQIGNoZWNrc3VtIG9rKS4KKyAqCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX09LIC0gSVAgYW5kIFRDUCBjaGVja3N1bSBvay4KKyAqCVNLQ1NfU1RBVFVTX1VEUF9DU1VNX09LIC0gSVAgYW5kIFVEUCBjaGVja3N1bSBvay4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fT0tfTk9fVURQIC0gSVAgY2hlY2tzdW0gT0sgYW5kIG5vIFVEUCBjaGVja3N1bS4KKyAqCisgKglOb3RlOiBJZiBTS0NTX09WRVJXUklURV9TVEFUVVMgaXMgZGVmaW5lZCwgdGhlIFNLQ1NfU1RBVFVTX1hYWCB2YWx1ZXMKKyAqCXJldHVybmVkIGhlcmUgY2FuIGJlIGRlZmluZWQgaW4gc29tZSBoZWFkZXIgZmlsZSBieSB0aGUgbW9kdWxlIHVzaW5nIENTVU0uCisgKglJbiB0aGlzIHdheSwgdGhlIGNhbGxpbmcgbW9kdWxlIGNhbiBhc3NpZ24gcmV0dXJuIHZhbHVlcyBmb3IgaXRzIG93biBuZWVkcywKKyAqCWUuZy4gYnkgYXNzaWduaW5nIGJpdCBmbGFncyB0byB0aGUgaW5kaXZpZHVhbCBwcm90b2NvbHMuCisgKi8KK1NLQ1NfU1RBVFVTIFNrQ3NHZXRSZWNlaXZlSW5mbygKK1NLX0FDCQkqcEFjLAkJLyogQWRhcHRlciBjb250ZXh0IHN0cnVjdC4gKi8KK3ZvaWQJCSpwSXBIZWFkZXIsCS8qIElQIGhlYWRlci4gKi8KK3Vuc2lnbmVkCUNoZWNrc3VtMSwJLyogSGFyZHdhcmUgY2hlY2tzdW0gMS4gKi8KK3Vuc2lnbmVkCUNoZWNrc3VtMiwJLyogSGFyZHdhcmUgY2hlY2tzdW0gMi4gKi8KK2ludAkJCU5ldE51bWJlcikJLyogTmV0IG51bWJlciAqLworeworCS8qIEludGVybmV0IEhlYWRlciBWZXJzaW9uIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBJbnRlcm5ldEhlYWRlclZlcnNpb247CisKKwkvKiBMZW5ndGggb2YgdGhlIElQIGhlYWRlciBhcyBmb3VuZCBpbiBJUCBoZWFkZXIuICovCisJdW5zaWduZWQgSXBIZWFkZXJMZW5ndGg7CisKKwkvKiBMZW5ndGggb2YgSVAgZGF0YSBwb3J0aW9uLiAqLworCXVuc2lnbmVkIElwRGF0YUxlbmd0aDsKKworCS8qIElQIGhlYWRlciBjaGVja3N1bS4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckNoZWNrc3VtOworCisJLyogSVAgaGVhZGVyIG9wdGlvbnMgY2hlY2tzdW0sIGlmIGFueS4gKi8KKwl1bnNpZ25lZCBJcE9wdGlvbnNDaGVja3N1bTsKKworCS8qIElQIGRhdGEgY2hlY2tzdW0sIGkuZS4gVENQL1VEUCBjaGVja3N1bS4gKi8KKwl1bnNpZ25lZCBJcERhdGFDaGVja3N1bTsKKworCS8qIE5leHQgbGV2ZWwgcHJvdG9jb2wgaWRlbnRpZmllciBmb3VuZCBpbiBJUCBoZWFkZXIuICovCisJdW5zaWduZWQgTmV4dExldmVsUHJvdG9jb2w7CisKKwkvKiBUaGUgY2hlY2tzdW0gb2YgdGhlICJuZXh0IGxldmVsIHByb3RvY29sIiwgaS5lLiBUQ1Agb3IgVURQLiAqLworCXVuc2lnbmVkIGxvbmcgTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bTsKKworCS8qIFBvaW50ZXIgdG8gbmV4dCBsZXZlbCBwcm90b2NvbCBzdGF0aXN0aWNzIHN0cnVjdHVyZS4gKi8KKwlTS0NTX1BST1RPX1NUQVRTICpOZXh0TGV2ZWxQcm90b1N0YXRzOworCisJLyogVGVtcG9yYXJ5IHZhcmlhYmxlLiAqLworCXVuc2lnbmVkIFRtcDsKKworCVRtcCA9ICooU0tfVTggKikKKwkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9IRUFERVJfVkVSU0lPTl9BTkRfTEVOR1RIKTsKKworCS8qIEdldCB0aGUgSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24gKElIVikuICovCisJLyogTm90ZTogVGhlIElIViBpcyBzdG9yZWQgaW4gdGhlIHVwcGVyIGZvdXIgYml0cy4gKi8KKworCUludGVybmV0SGVhZGVyVmVyc2lvbiA9IFRtcCA+PiA0OworCisJLyogQ2hlY2sgdGhlIEludGVybmV0IEhlYWRlciBWZXJzaW9uLiAqLworCS8qIE5vdGU6IFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgSVAgdmVyc2lvbiA0LiAqLworCisJaWYgKEludGVybmV0SGVhZGVyVmVyc2lvbiAhPSA0KSB7CS8qIElQdjQ/ICovCisJCVNLX0RCR19NU0cocEFjLCBTS19EQkdNT0RfQ1NVTSwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9SWCwKKwkJCSgiUng6IFVua25vd24gSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24gJXUuXG4iLAorCQkJSW50ZXJuZXRIZWFkZXJWZXJzaW9uKSk7CisJCXBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19JUF0uUnhVbmFibGVDdHMrKzsKKwkJcmV0dXJuIChTS0NTX1NUQVRVU19VTktOT1dOX0lQX1ZFUlNJT04pOworCX0KKworCS8qIEdldCB0aGUgSVAgaGVhZGVyIGxlbmd0aCAoSUhMKS4gKi8KKwkvKgorCSAqIE5vdGU6IFRoZSBJSEwgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBmb3VyIGJpdHMgYXMgdGhlIG51bWJlciBvZgorCSAqIDQtYnl0ZSB3b3Jkcy4KKwkgKi8KKworCUlwSGVhZGVyTGVuZ3RoID0gKFRtcCAmIDB4ZikgKiA0OworCisJLyogQ2hlY2sgdGhlIElQIGhlYWRlciBsZW5ndGguICovCisKKwkvKiAwNC1BdWctMTk5OCBzdyAtIFJlYWxseSBjaGVjayB0aGUgSUhMPyBOZWNlc3Nhcnk/ICovCisKKwlpZiAoSXBIZWFkZXJMZW5ndGggPCA1KjQpIHsKKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1JYLAorCQkJKCJSeDogSW52YWxpZCBJUCBIZWFkZXIgTGVuZ3RoICV1LlxuIiwgSXBIZWFkZXJMZW5ndGgpKTsKKwkJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5SeEVyckN0cysrOworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1IpOworCX0KKworCS8qIFRoaXMgaXMgYW4gSVB2NCBmcmFtZSB3aXRoIGEgaGVhZGVyIG9mIHZhbGlkIGxlbmd0aC4gKi8KKworCS8qIEdldCB0aGUgSVAgaGVhZGVyIGFuZCBkYXRhIGNoZWNrc3VtLiAqLworCisJSXBEYXRhQ2hlY2tzdW0gPSBDaGVja3N1bTI7CisKKwkvKgorCSAqIFRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorCSAqCisJICoJSXBIZWFkZXJDaGVja3N1bSA9IENoZWNrc3VtMSAtIENoZWNrc3VtMgorCSAqLworCisJU0tDU19PQ19TVUIoSXBIZWFkZXJDaGVja3N1bSwgQ2hlY2tzdW0xLCBDaGVja3N1bTIpOworCisJLyogQ2hlY2sgaWYgYW55IElQIGhlYWRlciBvcHRpb25zLiAqLworCisJaWYgKElwSGVhZGVyTGVuZ3RoID4gU0tDU19JUF9IRUFERVJfU0laRSkgeworCisJCS8qIEdldCB0aGUgSVAgb3B0aW9ucyBjaGVja3N1bS4gKi8KKworCQlJcE9wdGlvbnNDaGVja3N1bSA9IFNrQ3NDYWxjdWxhdGVDaGVja3N1bSgKKwkJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19JUF9IRUFERVJfU0laRSksCisJCQlJcEhlYWRlckxlbmd0aCAtIFNLQ1NfSVBfSEVBREVSX1NJWkUpOworCisJCS8qIEFkanVzdCB0aGUgSVAgaGVhZGVyIGFuZCBJUCBkYXRhIGNoZWNrc3Vtcy4gKi8KKworCQlTS0NTX09DX0FERChJcEhlYWRlckNoZWNrc3VtLCBJcEhlYWRlckNoZWNrc3VtLCBJcE9wdGlvbnNDaGVja3N1bSk7CisKKwkJU0tDU19PQ19TVUIoSXBEYXRhQ2hlY2tzdW0sIElwRGF0YUNoZWNrc3VtLCBJcE9wdGlvbnNDaGVja3N1bSk7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgSVAgaGVhZGVyIGNoZWNrc3VtIGlzIG9rLgorCSAqCisJICogTk9URTogV2UgbXVzdCBjaGVjayB0aGUgSVAgaGVhZGVyIGNoZWNrc3VtIGV2ZW4gaWYgdGhlIGNhbGxlciBqdXN0IHdhbnRzCisJICogdXMgdG8gY2hlY2sgdXBwZXItbGF5ZXIgY2hlY2tzdW1zLCBiZWNhdXNlIHdlIGNhbm5vdCBkbyBhbnkgZnVydGhlcgorCSAqIHByb2Nlc3Npbmcgb2YgdGhlIHBhY2tldCB3aXRob3V0IGEgdmFsaWQgSVAgY2hlY2tzdW0uCisJICovCisJCisJLyogR2V0IHRoZSBuZXh0IGxldmVsIHByb3RvY29sIGlkZW50aWZpZXIuICovCisJCisJTmV4dExldmVsUHJvdG9jb2wgPSAqKFNLX1U4ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfTkVYVF9MRVZFTF9QUk9UT0NPTCk7CisKKwlpZiAoSXBIZWFkZXJDaGVja3N1bSAhPSAweGZmZmYpIHsKKwkJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5SeEVyckN0cysrOworCQkvKiB0aGUgTkRJUyB0ZXN0ZXIgd2FudHMgdG8ga25vdyB0aGUgdXBwZXIgbGV2ZWwgcHJvdG9jb2wgdG9vICovCisJCWlmIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCkgeworCQkJcmV0dXJuKFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQKTsKKwkJfQorCQllbHNlIGlmIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1VEUCkgeworCQkJcmV0dXJuKFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVURQKTsKKwkJfQorCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1IpOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFRDUCBvciBVRFAgZnJhbWUgYW5kIGlmIHdlIHNob3VsZCBjYWxjdWxhdGUgdGhlCisJICogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLgorCSAqCisJICogQWxzbyBjbGVhciBhbGwgcHJvdG9jb2wgYml0IGZsYWdzIG9mIHByb3RvY29scyBub3QgcHJlc2VudCBpbiB0aGUKKwkgKiBmcmFtZS4KKwkgKi8KKworCWlmICgocEFjLT5Dc3VtLlJlY2VpdmVGbGFnc1tOZXROdW1iZXJdICYgU0tDU19QUk9UT19UQ1ApICE9IDAgJiYKKwkJTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9UQ1ApIHsKKwkJLyogVENQL0lQIGZyYW1lLiAqLworCQlOZXh0TGV2ZWxQcm90b1N0YXRzID0KKwkJCSZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfVENQXTsKKwl9CisJZWxzZSBpZiAoKHBBYy0+Q3N1bS5SZWNlaXZlRmxhZ3NbTmV0TnVtYmVyXSAmIFNLQ1NfUFJPVE9fVURQKSAhPSAwICYmCisJCU5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVURQKSB7CisJCS8qIFVEUC9JUCBmcmFtZS4gKi8KKwkJTmV4dExldmVsUHJvdG9TdGF0cyA9CisJCQkmcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX1VEUF07CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBFaXRoZXIgbm90IGEgVENQIG9yIFVEUCBmcmFtZSBhbmQvb3IgVENQL1VEUCBwcm9jZXNzaW5nIG5vdAorCQkgKiBzcGVjaWZpZWQuCisJCSAqLworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0NTVU1fT0spOworCX0KKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYW4gSVAgZnJhZ21lbnQuICovCisKKwkvKgorCSAqIE5vdGU6IEFuIElQIGZyYWdtZW50IGhhcyBhIG5vbi16ZXJvICJGcmFnbWVudCBPZmZzZXQiIGZpZWxkIGFuZC9vcgorCSAqIHRoZSAiTW9yZSBGcmFnbWVudHMiIGJpdCBzZXQuIFRodXMsIGlmIGJvdGggdGhlICJGcmFnbWVudCBPZmZzZXQiCisJICogYW5kIHRoZSAiTW9yZSBGcmFnbWVudHMiIGFyZSB6ZXJvLCBpdCBpcyAqbm90KiBhIGZyYWdtZW50LiBXZSBjYW4KKwkgKiBlYXNpbHkgY2hlY2sgYm90aCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lIDE2LWJpdAorCSAqIHdvcmQuCisJICovCisKKwlpZiAoKCooU0tfVTE2ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfRkxBR1NfQU5EX0ZSQUdNRU5UX09GRlNFVCkgJgorCQl+U0tDU19JUF9ET05UX0ZSQUdNRU5UKSAhPSAwKSB7CisJCS8qIElQIGZyYWdtZW50OyBpZ25vcmUgYWxsIG90aGVyIHByb3RvY29scy4gKi8KKwkJTmV4dExldmVsUHJvdG9TdGF0cy0+UnhVbmFibGVDdHMrKzsKKwkJcmV0dXJuIChTS0NTX1NUQVRVU19JUF9GUkFHTUVOVCk7CisJfQorCisJLyoKKwkgKiAwOC1NYXktMjAwMCByYQorCSAqCisJICogRnJvbSBSRkMgNzY4IChVRFApCisJICogSWYgdGhlIGNvbXB1dGVkIGNoZWNrc3VtIGlzIHplcm8sIGl0IGlzIHRyYW5zbWl0dGVkIGFzIGFsbCBvbmVzICh0aGUKKwkgKiBlcXVpdmFsZW50IGluIG9uZSdzIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuICBBbiBhbGwgemVybyB0cmFuc21pdHRlZAorCSAqIGNoZWNrc3VtIHZhbHVlIG1lYW5zIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGdlbmVyYXRlZCBubyBjaGVja3N1bSAoZm9yCisJICogZGVidWdnaW5nIG9yIGZvciBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzIHRoYXQgZG9uJ3QgY2FyZSkuCisJICovCisKKwlpZiAoTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9VRFAgJiYKKwkJKihTS19VMTYqKVNLQ1NfSURYKHBJcEhlYWRlciwgSXBIZWFkZXJMZW5ndGggKyA2KSA9PSAweDAwMDApIHsKKworCQlOZXh0TGV2ZWxQcm90b1N0YXRzLT5SeE9rQ3RzKys7CisJCQorCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0NTVU1fT0tfTk9fVURQKTsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgVENQL1VEUCBjaGVja3N1bS4KKwkgKi8KKworCS8qIEdldCB0b3RhbCBsZW5ndGggb2YgSVAgaGVhZGVyIGFuZCBkYXRhLiAqLworCisJSXBEYXRhTGVuZ3RoID0KKwkJKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9UT1RBTF9MRU5HVEgpOworCisJLyogR2V0IGxlbmd0aCBvZiBJUCBkYXRhIHBvcnRpb24uICovCisKKwlJcERhdGFMZW5ndGggPSBTS0NTX05UT0gxNihJcERhdGFMZW5ndGgpIC0gSXBIZWFkZXJMZW5ndGg7CisKKwlOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtID0KKworCQkvKiBDYWxjdWxhdGUgdGhlIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICovCisKKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX1NPVVJDRV9BRERSRVNTICsgMCkgKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAyKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMCkgKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfREVTVElOQVRJT05fQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KE5leHRMZXZlbFByb3RvY29sKSArCisJCSh1bnNpZ25lZCBsb25nKSBTS0NTX0hUT04xNihJcERhdGFMZW5ndGgpICsKKworCQkvKiBBZGQgdGhlIFRDUC9VRFAgaGVhZGVyIGNoZWNrc3VtLiAqLworCisJCSh1bnNpZ25lZCBsb25nKSBJcERhdGFDaGVja3N1bTsKKworCS8qIEFkZC1pbiBhbnkgY2Fycmllcy4gKi8KKworCVNLQ1NfT0NfQUREKE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIDApOworCisJLyogQWRkLWluIGFueSBuZXcgY2FycnkuICovCisKKwlTS0NTX09DX0FERChOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtLCBOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtLCAwKTsKKworCS8qIENoZWNrIGlmIHRoZSBUQ1AvVURQIGNoZWNrc3VtIGlzIG9rLiAqLworCisJaWYgKCh1bnNpZ25lZCkgTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bSA9PSAweGZmZmYpIHsKKworCQkvKiBUQ1AvVURQIGNoZWNrc3VtIG9rLiAqLworCisJCU5leHRMZXZlbFByb3RvU3RhdHMtPlJ4T2tDdHMrKzsKKworCQlyZXR1cm4gKE5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVENQID8KKwkJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX09LIDogU0tDU19TVEFUVVNfVURQX0NTVU1fT0spOworCX0KKwkKKwkvKiBUQ1AvVURQIGNoZWNrc3VtIGVycm9yLiAqLworCisJTmV4dExldmVsUHJvdG9TdGF0cy0+UnhFcnJDdHMrKzsKKworCXJldHVybiAoTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9UQ1AgPworCQlTS0NTX1NUQVRVU19UQ1BfQ1NVTV9FUlJPUiA6IFNLQ1NfU1RBVFVTX1VEUF9DU1VNX0VSUk9SKTsKK30JLyogU2tDc0dldFJlY2VpdmVJbmZvICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NTZXRSZWNlaXZlRmxhZ3MgLSBzZXQgY2hlY2tzdW0gcmVjZWl2ZSBmbGFncworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YXJpb3VzIHJlY2VpdmUgZmxhZ3MuIEFjY29yZGluZyB0byB0aGUKKyAqCXByb3RvY29sIGZsYWdzIHNldCBieSB0aGUgY2FsbGVyLCB0aGUgc3RhcnQgb2Zmc2V0cyB3aXRoaW4gcmVjZWl2ZWQKKyAqCXBhY2tldHMgb2YgdGhlIHR3byBoYXJkd2FyZSBjaGVja3N1bXMgYXJlIHJldHVybmVkLiBUaGVzZSBvZmZzZXRzIG11c3QKKyAqCWJlIHN0b3JlZCBpbiBhbGwgcmVjZWl2ZSBkZXNjcmlwdG9ycy4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJUmVjZWl2ZUZsYWdzIC0gQW55IGNvbWJpbmF0aW9uIG9mIFNLX1BST1RPX1hYWCBmbGFncyBvZiB0aGUgcHJvdG9jb2xzCisgKglmb3Igd2hpY2ggdGhlIGNhbGxlciB3YW50cyBjaGVja3N1bSBpbmZvcm1hdGlvbiBvbiByZWNlaXZlZCBmcmFtZXMuCisgKgorICoJcENoZWNrc3VtMU9mZnNldCAtIFRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGZpcnN0IHJlY2VpdmUgZGVzY3JpcHRvcgorICoJaGFyZHdhcmUgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZCBmb3IgcmVjZWl2ZWQgZnJhbWVzIGlzIHJldHVybmVkCisgKgloZXJlLgorICoKKyAqCXBDaGVja3N1bTJPZmZzZXQgLSBUaGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzZWNvbmQgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKgloYXJkd2FyZSBjaGVja3N1bSB0byBiZSBjYWxjdWxhdGVkIGZvciByZWNlaXZlZCBmcmFtZXMgaXMgcmV0dXJuZWQKKyAqCWhlcmUuCisgKgorICogUmV0dXJuczogTi9BCisgKglSZXR1cm5zIHRoZSB0d28gaGFyZHdhcmUgY2hlY2tzdW0gc3RhcnQgb2Zmc2V0cy4KKyAqLwordm9pZCBTa0NzU2V0UmVjZWl2ZUZsYWdzKAorU0tfQUMJCSpwQWMsCQkJCS8qIEFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QuICovCit1bnNpZ25lZAlSZWNlaXZlRmxhZ3MsCQkvKiBOZXcgcmVjZWl2ZSBmbGFncy4gKi8KK3Vuc2lnbmVkCSpwQ2hlY2tzdW0xT2Zmc2V0LAkvKiBPZmZzZXQgZm9yIGhhcmR3YXJlIGNoZWNrc3VtIDEuICovCit1bnNpZ25lZAkqcENoZWNrc3VtMk9mZnNldCwJLyogT2Zmc2V0IGZvciBoYXJkd2FyZSBjaGVja3N1bSAyLiAqLworaW50CQkJTmV0TnVtYmVyKQoreworCS8qIFNhdmUgdGhlIHJlY2VpdmUgZmxhZ3MuICovCisKKwlwQWMtPkNzdW0uUmVjZWl2ZUZsYWdzW05ldE51bWJlcl0gPSBSZWNlaXZlRmxhZ3M7CisKKwkvKiBGaXJzdCBjaGVja3N1bSBzdGFydCBvZmZzZXQgaXMgdGhlIElQIGhlYWRlci4gKi8KKwkqcENoZWNrc3VtMU9mZnNldCA9IFNLQ1NfTUFDX0hFQURFUl9TSVpFOworCisJLyoKKwkgKiBTZWNvbmQgY2hlY2tzdW0gc3RhcnQgb2Zmc2V0IGlzIHRoZSBJUCBkYXRhLiBOb3RlIHRoYXQgdGhpcyBtYXkgdmFyeQorCSAqIGlmIHRoZXJlIGFyZSBhbnkgSVAgaGVhZGVyIG9wdGlvbnMgaW4gdGhlIGFjdHVhbCBwYWNrZXQuCisJICovCisJKnBDaGVja3N1bTJPZmZzZXQgPSBTS0NTX01BQ19IRUFERVJfU0laRSArIFNLQ1NfSVBfSEVBREVSX1NJWkU7Cit9CS8qIFNrQ3NTZXRSZWNlaXZlRmxhZ3MgKi8KKworI2lmbmRlZiBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NDYWxjdWxhdGVDaGVja3N1bSAtIGNhbGN1bGF0ZSBjaGVja3N1bSBmb3Igc3BlY2lmaWVkIGRhdGEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gZm9yIHRoZSBzcGVjaWZpZWQKKyAqCWRhdGEuCisgKgorICogQXJndW1lbnRzOgorICoJcERhdGEgLSBQb2ludGVyIHRvIGRhdGEgZm9yIHdoaWNoIHRoZSBjaGVja3N1bSBzaGFsbCBiZSBjYWxjdWxhdGVkLgorICoJTm90ZTogVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFsaWduZWQgb24gYSAxNi1iaXQgYm91bmRhcnkuCisgKgorICoJTGVuZ3RoIC0gTGVuZ3RoIGluIGJ5dGVzIG9mIGRhdGEgdG8gY2hlY2tzdW0uCisgKgorICogUmV0dXJuczoKKyAqCVRoZSAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gZm9yIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAqCisgKglOb3RlOiBUaGUgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBpbiB0aGUgbWFjaGluZSdzIG5hdHVyYWwgYnl0ZSBvcmRlciwKKyAqCWkuZS4gbGl0dGxlIHZzLiBiaWcgZW5kaWFuLiBUaHVzLCB0aGUgcmVzdWx0aW5nIGNoZWNrc3VtIGlzIGRpZmZlcmVudAorICoJZm9yIHRoZSBzYW1lIGlucHV0IGRhdGEgb24gbGl0dGxlIGFuZCBiaWcgZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqCUhvd2V2ZXIsIHdoZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBuZXR3b3JrIHBhY2tldCwgdGhlIGJ5dGUgb3JkZXIgaXMKKyAqCWFsd2F5cyBpbiBjb3JyZWN0IG5ldHdvcmsgb3JkZXIuCisgKi8KK3Vuc2lnbmVkIFNrQ3NDYWxjdWxhdGVDaGVja3N1bSgKK3ZvaWQJCSpwRGF0YSwJCS8qIERhdGEgdG8gY2hlY2tzdW0uICovCit1bnNpZ25lZAlMZW5ndGgpCQkvKiBMZW5ndGggb2YgZGF0YS4gKi8KK3sKKwlTS19VMTYgKnBVMTY7CQkvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGFzIDE2LWJpdCB3b3Jkcy4gKi8KKwl1bnNpZ25lZCBsb25nIENoZWNrc3VtOwkvKiBDaGVja3N1bTsgbXVzdCBiZSBhdCBsZWFzdCAzMiBiaXRzLiAqLworCisJLyogU3VtIHVwIGFsbCAxNi1iaXQgd29yZHMuICovCisKKwlwVTE2ID0gKFNLX1UxNiAqKSBwRGF0YTsKKwlmb3IgKENoZWNrc3VtID0gMDsgTGVuZ3RoID4gMTsgTGVuZ3RoIC09IDIpIHsKKwkJQ2hlY2tzdW0gKz0gKnBVMTYrKzsKKwl9CisKKwkvKiBJZiB0aGlzIGlzIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIGFkZC1pbiB0aGUgbGFzdCBieXRlLiAqLworCisJaWYgKExlbmd0aCA+IDApIHsKKyNpZmRlZiBTS19CSUdfRU5ESUFOCisJCS8qIEFkZCB0aGUgbGFzdCBieXRlIGFzIHRoZSBoaWdoIGJ5dGUuICovCisJCUNoZWNrc3VtICs9ICgodW5zaWduZWQpICooU0tfVTggKikgcFUxNikgPDwgODsKKyNlbHNlCS8qICFTS19CSUdfRU5ESUFOICovCisJCS8qIEFkZCB0aGUgbGFzdCBieXRlIGFzIHRoZSBsb3cgYnl0ZS4gKi8KKwkJQ2hlY2tzdW0gKz0gKihTS19VOCAqKSBwVTE2OworI2VuZGlmCS8qICFTS19CSUdfRU5ESUFOICovCisJfQorCisJLyogQWRkLWluIGFueSBjYXJyaWVzLiAqLworCisJU0tDU19PQ19BREQoQ2hlY2tzdW0sIENoZWNrc3VtLCAwKTsKKworCS8qIEFkZC1pbiBhbnkgbmV3IGNhcnJ5LiAqLworCisJU0tDU19PQ19BREQoQ2hlY2tzdW0sIENoZWNrc3VtLCAwKTsKKworCS8qIE5vdGU6IEFsbCBiaXRzIGJleW9uZCB0aGUgMTYtYml0IGxpbWl0IGFyZSBub3cgemVyby4gKi8KKworCXJldHVybiAoKHVuc2lnbmVkKSBDaGVja3N1bSk7Cit9CS8qIFNrQ3NDYWxjdWxhdGVDaGVja3N1bSAqLworCisjZW5kaWYgLyogU0tfQ1NfQ0FMQ1VMQVRFX0NIRUNLU1VNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0NzRXZlbnQgLSB0aGUgQ1NVTSBldmVudCBkaXNwYXRjaGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGlzIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgQ1NVTSBtb2R1bGUuCisgKgorICogQXJndW1lbnRzOgorICoJcEFjIC0gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQuCisgKgorICoJSW9jIC0gSS9PIGNvbnRleHQuCisgKgorICoJRXZlbnQgLQkgRXZlbnQgaWQuCisgKgorICoJUGFyYW0gLSBFdmVudCBkZXBlbmRlbnQgcGFyYW1ldGVyLgorICoKKyAqIFJldHVybnM6CisgKglUaGUgMTYtYml0IEludGVybmV0IENoZWNrc3VtIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEuCisgKgorICoJTm90ZTogVGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIG1hY2hpbmUncyBuYXR1cmFsIGJ5dGUgb3JkZXIsCisgKglpLmUuIGxpdHRsZSB2cy4gYmlnIGVuZGlhbi4gVGh1cywgdGhlIHJlc3VsdGluZyBjaGVja3N1bSBpcyBkaWZmZXJlbnQKKyAqCWZvciB0aGUgc2FtZSBpbnB1dCBkYXRhIG9uIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKglIb3dldmVyLCB3aGVuIHdyaXR0ZW4gYmFjayB0byB0aGUgbmV0d29yayBwYWNrZXQsIHRoZSBieXRlIG9yZGVyIGlzCisgKglhbHdheXMgaW4gY29ycmVjdCBuZXR3b3JrIG9yZGVyLgorICovCitpbnQgU2tDc0V2ZW50KAorU0tfQUMJCSpwQWMsCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0LiAqLworU0tfSU9DCQlJb2MsCS8qIEkvTyBjb250ZXh0LiAqLworU0tfVTMyCQlFdmVudCwJLyogRXZlbnQgaWQuICovCitTS19FVlBBUkEJUGFyYW0pCS8qIEV2ZW50IGRlcGVuZGVudCBwYXJhbWV0ZXIuICovCit7CisJaW50IFByb3RvSW5kZXg7CisJaW50CU5ldE51bWJlcjsKKworCXN3aXRjaCAoRXZlbnQpIHsKKwkvKgorCSAqIENsZWFyIHByb3RvY29sIHN0YXRpc3RpY3MuCisJICoKKwkgKiBQYXJhbSAtIFByb3RvY29sIGluZGV4LCBvciAtMSBmb3IgYWxsIHByb3RvY29scy4KKwkgKgkJIC0gTmV0IG51bWJlci4KKwkgKi8KKwljYXNlIFNLX0NTVU1fRVZFTlRfQ0xFQVJfUFJPVE9fU1RBVFM6CisKKwkJUHJvdG9JbmRleCA9IChpbnQpUGFyYW0uUGFyYTMyWzFdOworCQlOZXROdW1iZXIgPSAoaW50KVBhcmFtLlBhcmEzMlswXTsKKwkJaWYgKFByb3RvSW5kZXggPCAwKSB7CS8qIENsZWFyIGZvciBhbGwgcHJvdG9jb2xzLiAqLworCQkJaWYgKE5ldE51bWJlciA+PSAwKSB7CisJCQkJU0tfTUVNU0VUKCZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdWzBdLCAwLAorCQkJCQlzaXplb2YocEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXSkpOworCQkJfQorCQl9CisJCWVsc2UgewkJCQkJLyogQ2xlYXIgZm9yIGluZGl2aWR1YWwgcHJvdG9jb2wuICovCisJCQlTS19NRU1TRVQoJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bUHJvdG9JbmRleF0sIDAsCisJCQkJc2l6ZW9mKHBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bUHJvdG9JbmRleF0pKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsJLyogU3VjY2Vzcy4gKi8KK30JLyogU2tDc0V2ZW50ICovCisKKyNlbmRpZgkvKiBTS19VU0VfQ1NVTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKQEAgLTAsMCArMSw3NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2RpbS5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMS8yOCAxMjo1NTo0MCAkCisgKiBQdXJwb3NlOglBbGwgZnVuY3Rpb25zIHRvIG1haW50YWluIGludGVycnVwdCBtb2RlcmF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIG1hbmFnZSB0aGUgZHluYW1pYyBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBvbiBib3RoICAgCisgKiBHRW5lc2lzIGFuZCBZdWtvbiBhZGFwdGVycy4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCSJza2RydjFzdC5oIgorICoJInNrZHJ2Mm5kLmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tkaW0uYyx2IDEuNSAyMDAzLzExLzI4IDEyOjU1OjQwIHJyb2VzbGVyIEV4cCAkIChDKSBTeXNLb25uZWN0LiI7CisjZW5kaWYKKworI2RlZmluZSBfX1NLQUREUl9DCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2Vycm9yIEMrKyBpcyBub3QgeWV0IHN1cHBvcnRlZC4KK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogSW5jbHVkZXMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLRFJWMVNUX0gKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjZW5kaWYKKworI2lmbmRlZiBfX0lOQ19TS0RSVjJORF9ICisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorI2VuZGlmCisKKyNpbmNsdWRlCTxsaW51eC9rZXJuZWxfc3RhdC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIERlZmluZXMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIFR5cGVkZWZzCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgR2V0Q3VycmVudFN5c3RlbUxvYWQoU0tfQUMgKnBBQyk7CitzdGF0aWMgU0tfVTY0ICAgICAgIEdldElzckNhbGxzKFNLX0FDICpwQUMpOworc3RhdGljIFNLX0JPT0wgICAgICBJc0ludE1vZEVuYWJsZWQoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIFNldEN1cnJJbnRDdHIoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIEVuYWJsZUludE1vZChTS19BQyAqcEFDKTsgCitzdGF0aWMgdm9pZCAgICAgICAgIERpc2FibGVJbnRNb2QoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIFJlc2l6ZURpbVRpbWVyRHVyYXRpb24oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQgICAgICAgICBEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgRGlzcGxheURlc2NyUmF0aW8oU0tfQUMgKnBBQyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogR2xvYmFsIHZhcmlhYmxlcworKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogTG9jYWwgdmFyaWFibGVzCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBHbG9iYWwgZnVuY3Rpb25zIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBTa0RpbU1vZGVyYXRlCisqKiBEZXNjcmlwdGlvbiAgOiBDYWxsZWQgaW4gZXZlcnkgSVNSIHRvIGNoZWNrIGlmIG1vZGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZAorKiogICAgICAgICAgICAgICAgb3Igbm90IGZvciB0aGUgY3VycmVudCBudW1iZXIgb2YgaW50ZXJydXB0cworKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAKK1NrRGltTW9kZXJhdGUoU0tfQUMgKnBBQykgeworICAgIHVuc2lnbmVkIGludCBDdXJyU3lzTG9hZCAgICA9IDA7ICAvKiBleHByZXNzZWQgaW4gcGVyY2VudCAqLworICAgIHVuc2lnbmVkIGludCBMb2FkSW5jcmVhc2UgICA9IDA7ICAvKiBleHByZXNzZWQgaW4gcGVyY2VudCAqLworICAgIFNLX1U2NCAgICAgICBUaHJlc2hvbGRJbnRzICA9IDA7CisgICAgU0tfVTY0ICAgICAgIElzckNhbGxzUGVyU2VjID0gMDsKKworI2RlZmluZSBNX0RJTUlORk8gcEFDLT5EeW5JcnFNb2RJbmZvCisKKyAgICBpZiAoIUlzSW50TW9kRW5hYmxlZChwQUMpKSB7CisgICAgICAgIGlmIChNX0RJTUlORk8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfRFlOQU1JQykgeworICAgICAgICAgICAgQ3VyclN5c0xvYWQgPSBHZXRDdXJyZW50U3lzdGVtTG9hZChwQUMpOworICAgICAgICAgICAgaWYgKEN1cnJTeXNMb2FkID4gNzUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICoqIE1vcmUgdGhhbiA3NSUgdG90YWwgc3lzdGVtIGxvYWQhIEVuYWJsZSB0aGUgbW9kZXJhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgKiogdG8gc2hpZWxkIHRoZSBzeXN0ZW0gYWdhaW5zdCB0b28gbWFueSBpbnRlcnJ1cHRzLgorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBFbmFibGVJbnRNb2QocEFDKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ3VyclN5c0xvYWQgPiBNX0RJTUlORk8uUHJldlN5c0xvYWQpIHsKKyAgICAgICAgICAgICAgICBMb2FkSW5jcmVhc2UgPSAoQ3VyclN5c0xvYWQgLSBNX0RJTUlORk8uUHJldlN5c0xvYWQpOworICAgICAgICAgICAgICAgIGlmIChMb2FkSW5jcmVhc2UgPiAoKE1fRElNSU5GTy5QcmV2U3lzTG9hZCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENfSU5UX01PRF9FTkFCTEVfUEVSQ0VOVEFHRSkgLyAxMDApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJyU3lzTG9hZCA+IDEwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICoqIE1vcmUgdGhhbiA1MCUgaW5jcmVhc2Ugd2l0aCByZXNwZWN0IHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICoqIHByZXZpb3VzIGxvYWQgb2YgdGhlIHN5c3RlbS4gTW9zdCBsaWtlbHkgdGhpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICoqIGlzIGR1ZSB0byBvdXIgSVNSLXByb2MuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGVJbnRNb2QocEFDKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBOZWl0aGVyIHRvbyBtdWNoIHN5c3RlbSBsb2FkIGF0IGFsbCBub3IgdG9vIG11Y2ggaW5jcmVhc2UKKyAgICAgICAgICAgICAgICAqKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHByZXZpb3VzIHN5c3RlbSBsb2FkLiBIZW5jZSwgd2UgY2FuIGxlYXZlCisgICAgICAgICAgICAgICAgKiogdGhlIElTUi1oYW5kbGluZyBsaWtlIGl0IGlzIHdpdGhvdXQgZW5hYmxpbmcgbW9kZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgTV9ESU1JTkZPLlByZXZTeXNMb2FkID0gQ3VyclN5c0xvYWQ7CisgICAgICAgIH0gICAKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgICAgIFRocmVzaG9sZEludHMgID0gKChNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENfSU5UX01PRF9ESVNBQkxFX1BFUkNFTlRBR0UpIC8gMTAwKTsKKyAgICAgICAgICAgIElzckNhbGxzUGVyU2VjID0gR2V0SXNyQ2FsbHMocEFDKTsKKyAgICAgICAgICAgIGlmIChJc3JDYWxsc1BlclNlYyA8PSBUaHJlc2hvbGRJbnRzKSB7CisgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgKiogVGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHdpdGhpbiB0aGUgbGFzdCBzZWNvbmQgaXMgCisgICAgICAgICAgICAgICAgKiogbG93ZXIgdGhhbiB0aGUgZGlzYWJsZV9wZXJjZW50YWdlIG9mIHRoZSBkZXNyaWVkIAorICAgICAgICAgICAgICAgICoqIG1heHJhdGUuIFRoZXJlZm9yZSB3ZSBjYW4gZGlzYWJsZSB0aGUgbW9kZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIERpc2FibGVJbnRNb2QocEFDKTsKKyAgICAgICAgICAgICAgICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyA9IAorICAgICAgICAgICAgICAgICAgIChNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlY1VwcGVyTGltaXQgKworICAgICAgICAgICAgICAgICAgICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQpIC8gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBUaGUgbnVtYmVyIG9mIGludGVycnVwdHMgcGVyIHNlYyBpcyB0aGUgc2FtZSBhcyBleHBlY3RlZC4KKyAgICAgICAgICAgICAgICAqKiBFdmFsdWxhdGUgdGhlIGRlc2NyaXB0b3ItcmF0aW8uIElmIGl0IGhhcyBjaGFuZ2VkLCBhIHJlc2l6ZSAKKyAgICAgICAgICAgICAgICAqKiBpbiB0aGUgbW9kZXJhdGlvbiB0aW1lciBtaWdodCBiZSB1c2VmdWxsCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoTV9ESU1JTkZPLkF1dG9TaXppbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzaXplRGltVGltZXJEdXJhdGlvbihwQUMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgKiogU29tZSBpbmZvcm1hdGlvbiB0byB0aGUgbG9nLi4uCisgICAgKi8KKyAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICBEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uVHlwZShwQUMpOworICAgICAgICBEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhwQUMpOworICAgICAgICBEaXNwbGF5RGVzY3JSYXRpbyhwQUMpOworICAgIH0KKworICAgIE1fRElNSU5GTy5OYnJQcm9jZXNzZWREZXNjciA9IDA7IAorICAgIFNldEN1cnJJbnRDdHIocEFDKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFNrRGltU3RhcnRNb2RlcmF0aW9uVGltZXIKKyoqIERlc2NyaXB0aW9uICA6IFN0YXJ0cyB0aGUgYXVkaXQtdGltZXIgZm9yIHRoZSBkeW5hbWljIGludGVycnVwdCBtb2RlcmF0aW9uCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQgKCEpCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIAorU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcihTS19BQyAqcEFDKSB7CisgICAgU0tfRVZQQVJBICAgIEV2ZW50UGFyYW07ICAgLyogRXZlbnQgc3RydWN0IGZvciB0aW1lciBldmVudCAqLworIAorICAgIFNLX01FTVNFVCgoY2hhciAqKSAmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKyAgICBFdmVudFBhcmFtLlBhcmEzMlswXSA9IFNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSOworICAgIFNrVGltZXJTdGFydChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5EeW5JcnFNb2RJbmZvLk1vZFRpbWVyLAorICAgICAgICAgICAgICAgICBTS19EUlZfTU9ERVJBVElPTl9USU1FUl9MRU5HVEgsCisgICAgICAgICAgICAgICAgIFNLR0VfRFJWLCBTS19EUlZfVElNRVIsIEV2ZW50UGFyYW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQKKyoqIERlc2NyaXB0aW9uICA6IEVpdGhlciBlbmFibGVzIG9yIGRpc2FibGVzIG1vZGVyYXRpb24KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIGFkYXB0ZXIgaXMgb3BlbmVkCisqKiAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBEaXNhYmxlIGZ1bmN0aW9uLCBiZWNhdXNlIHdoZW4gYWxsIGludGVycnVwdHMgCisqKiAgICAgICAgICAgICAgICBtaWdodCBiZSBkaXNhYmxlLCB0aGUgbW9kZXJhdGlvbiB0aW1lciBoYXMgbm8gbWVhbmluZyBhdCBhbGwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQoU0tfQUMgKnBBQykgeworCisgICAgaWYgKE1fRElNSU5GTy5JbnRNb2RUeXBlU2VsZWN0ID09IENfSU5UX01PRF9TVEFUSUMpIHsKKyAgICAgICAgRW5hYmxlSW50TW9kKHBBQyk7ICAgLyogbm90aWZpY2F0aW9uIHByaW50IGluIHRoaXMgZnVuY3Rpb24gKi8KKyAgICB9IGVsc2UgaWYgKE1fRElNSU5GTy5JbnRNb2RUeXBlU2VsZWN0ID09IENfSU5UX01PRF9EWU5BTUlDKSB7CisgICAgICAgIFNrRGltU3RhcnRNb2RlcmF0aW9uVGltZXIocEFDKTsKKyAgICAgICAgaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgICAgIHByaW50aygiRHluYW1pYyBtb2RlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWRcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgICAgIHByaW50aygiTm8gbW9kZXJhdGlvbiBoYXMgYmVlbiBlbmFibGVkXG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncworKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgcmVnYXJpbmcgaW50ZXJydXB0IG1vZGVyYXRpb24KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgCitTa0RpbURpc3BsYXlNb2RlcmF0aW9uU2V0dGluZ3MoU0tfQUMgKnBBQykgeworICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKHBBQyk7CisgICAgRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvbk1hc2socEFDKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBMb2NhbCBmdW5jdGlvbnMgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IEdldEN1cnJlbnRTeXN0ZW1Mb2FkCisqKiBEZXNjcmlwdGlvbiAgOiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3lzdGVtIGxvYWQgb2YgdGhlIHN5c3RlbS4gVGhpcyBsb2FkCisqKiAgICAgICAgICAgICAgICBpcyBldmFsdWF0ZWQgZm9yIGFsbCBwcm9jZXNzb3JzIHdpdGhpbiB0aGUgc3lzdGVtLgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB1bnNpZ25lZCBpbnQ6IGxvYWQgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2UKKyoqIE5vdGVzICAgICAgICA6IFRoZSBwb3NzaWJsZSByYW5nZSBiZWluZyByZXR1cm5lZCBpcyBmcm9tIDAgdXAgdG8gMTAwLgorKiogICAgICAgICAgICAgICAgV2hlcmVhcyAwIG1lYW5zICdubyBsb2FkIGF0IGFsbCcgYW5kIDEwMCAnc3lzdGVtIGZ1bGx5IGxvYWRlZCcKKyoqICAgICAgICAgICAgICAgIEl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgYWN0dWFsbHkgY2F1c2VzIHRoZSBzeXN0ZW0KKyoqICAgICAgICAgICAgICAgIHRvIGJlIGluIDEwMCUsIGJ1dCBtYXliZSB0aGF0IGlzIGR1ZSB0byB0b28gbXVjaCBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorR2V0Q3VycmVudFN5c3RlbUxvYWQoU0tfQUMgKnBBQykgeworCXVuc2lnbmVkIGxvbmcgamlmICAgICAgICAgPSBqaWZmaWVzOworCXVuc2lnbmVkIGludCAgVXNlclRpbWUgICAgPSAwOworCXVuc2lnbmVkIGludCAgU3lzdGVtVGltZSAgPSAwOworCXVuc2lnbmVkIGludCAgTmljZVRpbWUgICAgPSAwOworCXVuc2lnbmVkIGludCAgSWRsZVRpbWUgICAgPSAwOworCXVuc2lnbmVkIGludCAgVG90YWxUaW1lICAgPSAwOworCXVuc2lnbmVkIGludCAgVXNlZFRpbWUgICAgPSAwOworCXVuc2lnbmVkIGludCAgU3lzdGVtTG9hZCAgPSAwOworCisJLyogdW5zaWduZWQgaW50ICBOYnJDcHUgICAgICA9IDA7ICovCisKKwkvKgorCSoqIFRoZSBmb2xsb3dpbmcgbGluZXMgaGF2ZSBiZWVuIGNvbW1lbnRlZCBvdXQsIGJlY2F1c2UKKwkqKiBmcm9tIGtlcm5lbCAyLjUuNDQgb253YXJkcywgdGhlIGtlcm5lbC1vd25lZCBzdHJ1Y3R1cmUKKwkqKgorCSoqICAgICAgc3RydWN0IGtlcm5lbF9zdGF0IGtzdGF0CisJKioKKwkqKiBpcyBub3QgbWFya2VkIGFzIGFuIGV4cG9ydGVkIHN5bWJvbCBpbiB0aGUgZmlsZQorCSoqCisJKiogICAgICBrZXJuZWwva3N5bXMuYyAKKwkqKgorCSoqIEFzIGEgY29uc2VxdWVuY2UsIHVzaW5nIHRoaXMgZHJpdmVyIGFzIEtMTSBpcyBub3QgcG9zc2libGUKKwkqKiBhbmQgYW55IGFjY2VzcyBvZiB0aGUgc3RydWN0dXJlIGtlcm5lbF9zdGF0IHZpYSB0aGUgCisJKiogZGVkaWNhdGVkIG1hY3JvcyBrc3RhdF9jcHUoaSkuY3B1c3RhdC54eHggaXMgdG8gYmUgYXZvaWRlZC4KKwkqKgorCSoqIFRoZSBrc3RhdC1pbmZvcm1hdGlvbiBtaWdodCBiZSBhZGRlZCBhZ2FpbiBpbiBmdXR1cmUgCisJKiogdmVyc2lvbnMgb2YgdGhlIDIuNS54eCBrZXJuZWwsIGJ1dCBmb3IgdGhlIHRpbWUgYmVpbmcsIAorCSoqIG51bWJlciBvZiBpbnRlcnJ1cHRzIHdpbGwgc2VydmUgYXMgaW5kaWNhdGlvbiBob3cgbXVjaCAKKwkqKiBsb2FkIHdlIGN1cnJlbnRseSBoYXZlLi4uIAorCSoqCisJKiogZm9yIChOYnJDcHUgPSAwOyBOYnJDcHUgPCBudW1fb25saW5lX2NwdXMoKTsgTmJyQ3B1KyspIHsKKwkqKglVc2VyVGltZSAgID0gVXNlclRpbWUgICArIGtzdGF0X2NwdShOYnJDcHUpLmNwdXN0YXQudXNlcjsKKwkqKglOaWNlVGltZSAgID0gTmljZVRpbWUgICArIGtzdGF0X2NwdShOYnJDcHUpLmNwdXN0YXQubmljZTsKKwkqKglTeXN0ZW1UaW1lID0gU3lzdGVtVGltZSArIGtzdGF0X2NwdShOYnJDcHUpLmNwdXN0YXQuc3lzdGVtOworCSoqIH0KKwkqLworCVNLX1U2NCBUaHJlc2hvbGRJbnRzICA9IDA7CisJU0tfVTY0IElzckNhbGxzUGVyU2VjID0gMDsKKworCVRocmVzaG9sZEludHMgID0gKChNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyAqCisJCQkgICBDX0lOVF9NT0RfRU5BQkxFX1BFUkNFTlRBR0UpICsgMTAwKTsKKwlJc3JDYWxsc1BlclNlYyA9IEdldElzckNhbGxzKHBBQyk7CisJaWYgKElzckNhbGxzUGVyU2VjID49IFRocmVzaG9sZEludHMpIHsKKwkgICAgLyoKKwkgICAgKiogV2UgZG8gbm90IGtub3cgaG93IG11Y2ggdGhlIHJlYWwgQ1BVLWxvYWQgaXMhCisJICAgICoqIFJldHVybiA4MCUgYXMgYSBkZWZhdWx0IGluIG9yZGVyIHRvIGFjdGl2YXRlIERJTQorCSAgICAqLworCSAgICBTeXN0ZW1Mb2FkID0gODA7CisJICAgIHJldHVybiAoU3lzdGVtTG9hZCk7ICAKKwl9IAorCisJVXNlZFRpbWUgID0gVXNlclRpbWUgKyBOaWNlVGltZSArIFN5c3RlbVRpbWU7CisKKwlJZGxlVGltZSAgPSBqaWYgKiBudW1fb25saW5lX2NwdXMoKSAtIFVzZWRUaW1lOworCVRvdGFsVGltZSA9IFVzZWRUaW1lICsgSWRsZVRpbWU7CisKKwlTeXN0ZW1Mb2FkID0gKCAxMDAgKiAoVXNlZFRpbWUgIC0gTV9ESU1JTkZPLlByZXZVc2VkVGltZSkgKSAvCisJCQkJCQkoVG90YWxUaW1lIC0gTV9ESU1JTkZPLlByZXZUb3RhbFRpbWUpOworCisJaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKwkJcHJpbnRrKCJDdXJyZW50IHN5c3RlbSBsb2FkIGlzOiAldVxuIiwgU3lzdGVtTG9hZCk7CisJfQorCisJTV9ESU1JTkZPLlByZXZUb3RhbFRpbWUgPSBUb3RhbFRpbWU7CisJTV9ESU1JTkZPLlByZXZVc2VkVGltZSAgPSBVc2VkVGltZTsKKworCXJldHVybiAoU3lzdGVtTG9hZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBHZXRJc3JDYWxscworKiogRGVzY3JpcHRpb24gIDogRGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBtb2RlcmF0aW9uIG1hc2ssIHRoaXMgZnVuY3Rpb24gd2lsbAorKiogICAgICAgICAgICAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBoYW5kbGVkIGluIHRoZSBwcmV2aW91cyB0aW1lLQorKiogICAgICAgICAgICAgICAgZnJhbWUuIFRoaXMgZXZhbHVhdGVkIG51bWJlciBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBudW1iZXIgCisqKiAgICAgICAgICAgICAgICBvZiBpbnRlcnJ1cHRzIHN0b3JlZCBpbiBQTk1JLWNvbnRleHQgYW5kIHRoZSBwcmV2aW91cyBzdG9yZWQgCisqKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzLgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiBpbnQ6ICAgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIGJlaW5nIGV4ZWN1dGVkIGluIHRoZSBsYXN0CisqKiAgICAgICAgICAgICAgICAgICAgICAgdGltZWZyYW1lCisqKiBOb3RlcyAgICAgICAgOiBJdCBtYWtlcyBvbmx5IHNlbnNlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgd2hlbiBkeW5hbWljIAorKiogICAgICAgICAgICAgICAgaW50ZXJydXB0IG1vZGVyYXRpb24gaXMgYXBwbGllZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFNLX1U2NAorR2V0SXNyQ2FsbHMoU0tfQUMgKnBBQykgeworICAgIFNLX1U2NCAgIFJ4UG9ydDBJbnREaWZmID0gMDsKKyAgICBTS19VNjQgICBSeFBvcnQxSW50RGlmZiA9IDA7CisgICAgU0tfVTY0ICAgVHhQb3J0MEludERpZmYgPSAwOworICAgIFNLX1U2NCAgIFR4UG9ydDFJbnREaWZmID0gMDsKKworICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPT0gSVJRX01BU0tfVFhfT05MWSkgeworICAgICAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgICAgIFR4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uVHhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFUeEludHJDdHM7CisgICAgICAgIH0KKyAgICAgICAgVHhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5UeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwVHhJbnRyQ3RzOworICAgIH0gZWxzZSBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID09IElSUV9NQVNLX1JYX09OTFkpIHsKKyAgICAgICAgaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSB7CisgICAgICAgICAgICBSeFBvcnQxSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzFdLlJ4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQxUnhJbnRyQ3RzOworICAgICAgICB9CisgICAgICAgIFJ4UG9ydDBJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFJ4SW50ckN0czsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgICAgIFJ4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFSeEludHJDdHM7CisgICAgICAgICAgICBUeFBvcnQxSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzFdLlR4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQxVHhJbnRyQ3RzOworICAgICAgICB9IAorICAgICAgICBSeFBvcnQwSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzBdLlJ4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBSeEludHJDdHM7CisgICAgICAgIFR4UG9ydDBJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFR4SW50ckN0czsKKyAgICB9CisKKyAgICByZXR1cm4gKFJ4UG9ydDBJbnREaWZmICsgUnhQb3J0MUludERpZmYgKyBUeFBvcnQwSW50RGlmZiArIFR4UG9ydDFJbnREaWZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IEdldFJ4Q2FsbHMKKyoqIERlc2NyaXB0aW9uICA6IFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBhIHJlY2VpdmUgaW50ZXItCisqKiAgICAgICAgICAgICAgICBydXB0IHdhcyBwcm9jZXNzZWQuIFRoaXMgaXMgbmVlZGVkIHRvIGV2YWx1YXRlIGFueSByZXNpemluZyAKKyoqICAgICAgICAgICAgICAgIGZhY3Rvci4KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogU0tfVTY0OiB0aGUgbnVtYmVyIG9mIFJYLWludHMgYmVpbmcgcHJvY2Vzc2VkCisqKiBOb3RlcyAgICAgICAgOiBJdCBtYWtlcyBvbmx5IHNlbnNlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgd2hlbiBkeW5hbWljIAorKiogICAgICAgICAgICAgICAgaW50ZXJydXB0IG1vZGVyYXRpb24gaXMgYXBwbGllZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFNLX1U2NAorR2V0UnhDYWxscyhTS19BQyAqcEFDKSB7CisgICAgU0tfVTY0ICAgUnhQb3J0MEludERpZmYgPSAwOworICAgIFNLX1U2NCAgIFJ4UG9ydDFJbnREaWZmID0gMDsKKworICAgIGlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworICAgICAgICBSeFBvcnQxSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzFdLlJ4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFSeEludHJDdHM7CisgICAgfQorICAgIFJ4UG9ydDBJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwUnhJbnRyQ3RzOworCisgICAgcmV0dXJuIChSeFBvcnQwSW50RGlmZiArIFJ4UG9ydDFJbnREaWZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFNldEN1cnJJbnRDdHIKKyoqIERlc2NyaXB0aW9uICA6IFdpbGwgc3RvcmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9yZiBvY2N1cmVkIGludGVycnVwdHMgaW4gdGhlIAorKiogICAgICAgICAgICAgICAgYWRhcHRlciBjb250ZXh0LiBUaGlzIGlzIG5lZWRlZCB0byBldmFsdWF0ZWQgdGhlIG51bWJlciBvZiAKKyoqICAgICAgICAgICAgICAgIGludGVycnVwdHMgd2l0aGluIGEgY3VycmVudCB0aW1lZnJhbWUuCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQgKCEpCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorU2V0Q3VyckludEN0cihTS19BQyAqcEFDKSB7CisgICAgaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSB7CisgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFSeEludHJDdHMgPSBwQUMtPlBubWkuUG9ydFsxXS5SeEludHJDdHM7CisgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFUeEludHJDdHMgPSBwQUMtPlBubWkuUG9ydFsxXS5UeEludHJDdHM7CisgICAgfSAKKyAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwUnhJbnRyQ3RzID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzOworICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBUeEludHJDdHMgPSBwQUMtPlBubWkuUG9ydFswXS5UeEludHJDdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBJc0ludE1vZEVuYWJsZWQoKQorKiogRGVzY3JpcHRpb24gIDogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlcnJ1cHRzIG1vZGVyYXRpb24KKyoqICAgICAgICAgICAgICAgIGNvbW1hbmQgcmVnaXN0ZXIuIEl0cyBjb250ZW50IGRldGVybWluZXMgd2hldGhlciBhbnkgCisqKiAgICAgICAgICAgICAgICBtb2RlcmF0aW9uIGlzIHJ1bm5pbmcgb3Igbm90LgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiBTS19UUlVFICA6IGlmIG1vZCB0aW1lciBydW5uaW5nCisqKiAgICAgICAgICAgICAgICBTS19GQUxTRSA6IGlmIG5vIG1vZGVyYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0tfQk9PTAorSXNJbnRNb2RFbmFibGVkKFNLX0FDICpwQUMpIHsKKyAgICB1bnNpZ25lZCBsb25nIEN0ckNtZDsKKworICAgIFNLX0lOMzIocEFDLT5Jb0Jhc2UsIEIyX0lSUU1fQ1RSTCwgJkN0ckNtZCk7CisgICAgaWYgKChDdHJDbWQgJiBUSU1fU1RBUlQpID09IFRJTV9TVEFSVCkgeworICAgICAgIHJldHVybiBTS19UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgcmV0dXJuIFNLX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IEVuYWJsZUludE1vZCgpCisqKiBEZXNjcmlwdGlvbiAgOiBFbmFibGVzIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiB1c2luZyB0aGUgdmFsdWVzIHN0b3JlZCBpbgorKiogICAgICAgICAgICAgICAgaW4gdGhlIHBBQy0+RHluSW50TW9kIGRhdGEgc3RydWN0dXJlCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IC0KKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitFbmFibGVJbnRNb2QoU0tfQUMgKnBBQykgeworICAgIHVuc2lnbmVkIGxvbmcgTW9kQmFzZTsKKworICAgIGlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisgICAgICAgTW9kQmFzZSA9IENfQ0xLX0ZSRVFfR0VORVNJUyAvIHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjOworICAgIH0gZWxzZSB7CisgICAgICAgTW9kQmFzZSA9IENfQ0xLX0ZSRVFfWVVLT04gLyBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYzsKKyAgICB9CisKKyAgICBTS19PVVQzMihwQUMtPklvQmFzZSwgQjJfSVJRTV9JTkksICBNb2RCYXNlKTsKKyAgICBTS19PVVQzMihwQUMtPklvQmFzZSwgQjJfSVJRTV9NU0ssICBwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24pOworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0NUUkwsIFRJTV9TVEFSVCk7CisgICAgaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgcHJpbnRrKCJFbmFibGVkIGludGVycnVwdCBtb2RlcmF0aW9uICglaSBpbnRzL3NlYylcbiIsCisgICAgICAgICAgICAgICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzYWJsZUludE1vZCgpCisqKiBEZXNjcmlwdGlvbiAgOiBEaXNibGVzIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpbmRlcGVuZGVudCBvZiB3aGF0IGludGVyLQorKiogICAgICAgICAgICAgICAgcnVwdHMgYXJlIHJ1bm5pbmcgb3Igbm90CisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IC0KKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIAorRGlzYWJsZUludE1vZChTS19BQyAqcEFDKSB7CisKKyAgICBTS19PVVQzMihwQUMtPklvQmFzZSwgQjJfSVJRTV9DVFJMLCBUSU1fU1RPUCk7CisgICAgaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgcHJpbnRrKCJEaXNhYmxlZCBpbnRlcnJ1cHQgbW9kZXJhdGlvblxuIik7CisgICAgfQorfSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFJlc2l6ZURpbVRpbWVyRHVyYXRpb24oKTsKKyoqIERlc2NyaXB0aW9uICA6IENoZWNrcyB0aGUgY3VycmVudCB1c2VkIGRlc2NyaXB0b3IgcmF0aW8gYW5kIHJlc2l6ZXMgdGhlIAorKiogICAgICAgICAgICAgICAgZHVyYXRpb24gdGltZXIgKGxvbmdlci9zbWFsbGVyKSBpZiBwb3NzaWJsZS4gCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IC0KKyoqIE5vdGVzICAgICAgICA6IFRoZXJlIGFyZSBib3RoIG1heGltdW0gYW5kIG1pbmltdW0gdGltZXIgZHVyYXRpb24gdmFsdWUuIAorKiogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW50ZXJydXB0IG1vZGVyYXRpb24gaXMgYWxyZWFkeQorKiogICAgICAgICAgICAgICAgZW5hYmxlZCEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIAorUmVzaXplRGltVGltZXJEdXJhdGlvbihTS19BQyAqcEFDKSB7CisgICAgU0tfQk9PTCBJbmNyZWFzZVRpbWVyRHVyYXRpb247CisgICAgaW50ICAgICBUb3RhbE1heE5ickRlc2NyOworICAgIGludCAgICAgVXNlZERlc2NyUmF0aW87CisgICAgaW50ICAgICBSYXRpb0RpZmZBYnM7CisgICAgaW50ICAgICBSYXRpb0RpZmZSZWw7CisgICAgaW50ICAgICBOZXdNYXhNb2RJbnRzUGVyU2VjOworICAgIGludCAgICAgTW9kQWRqVmFsdWU7CisgICAgbG9uZyAgICBNb2RCYXNlOworCisgICAgLyoKKyAgICAqKiBDaGVjayBmaXJzdCBpZiB3ZSBhcmUgYWxsb3dlZCB0byBwZXJmb3JtIGFueSBtb2RpZmljYXRpb24KKyAgICAqLworICAgIGlmIChJc0ludE1vZEVuYWJsZWQocEFDKSkgeyAKKyAgICAgICAgaWYgKE1fRElNSU5GTy5JbnRNb2RUeXBlU2VsZWN0ICE9IENfSU5UX01PRF9EWU5BTUlDKSB7CisgICAgICAgICAgICByZXR1cm47IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKE1fRElNSU5GTy5Nb2RKdXN0RW5hYmxlZCkgeworICAgICAgICAgICAgICAgIE1fRElNSU5GTy5Nb2RKdXN0RW5hYmxlZCA9IFNLX0ZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgKiogSWYgd2UgZ290IHVudGlsIGhlcmUsIHdlIGhhdmUgdG8gZXZhbHVhdGUgdGhlIGFtb3VudCBvZiB0aGUKKyAgICAqKiBkZXNjcmlwdG9yIHJhdGlvIGNoYW5nZS4uLgorICAgICovCisgICAgVG90YWxNYXhOYnJEZXNjciA9IHBBQy0+UnhEZXNjclBlclJpbmcgKiBHZXRSeENhbGxzKHBBQyk7CisgICAgVXNlZERlc2NyUmF0aW8gICA9IChNX0RJTUlORk8uTmJyUHJvY2Vzc2VkRGVzY3IgKiAxMDApIC8gVG90YWxNYXhOYnJEZXNjcjsKKworICAgIGlmIChVc2VkRGVzY3JSYXRpbyA+IE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW8pIHsKKyAgICAgICAgUmF0aW9EaWZmQWJzID0gKFVzZWREZXNjclJhdGlvIC0gTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyk7CisgICAgICAgIFJhdGlvRGlmZlJlbCA9IChSYXRpb0RpZmZBYnMgKiAxMDApIC8gVXNlZERlc2NyUmF0aW87CisgICAgICAgIE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW8gPSBVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgSW5jcmVhc2VUaW1lckR1cmF0aW9uID0gU0tfRkFMU0U7ICAvKiBpbiBvdGhlciB3b3JkczogREVDUkVBU0UgKi8KKyAgICB9IGVsc2UgaWYgKFVzZWREZXNjclJhdGlvIDwgTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbykgeworICAgICAgICBSYXRpb0RpZmZBYnMgPSAoTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyAtIFVzZWREZXNjclJhdGlvKTsKKyAgICAgICAgUmF0aW9EaWZmUmVsID0gKFJhdGlvRGlmZkFicyAqIDEwMCkgLyBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvOworICAgICAgICBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvID0gVXNlZERlc2NyUmF0aW87CisgICAgICAgIEluY3JlYXNlVGltZXJEdXJhdGlvbiA9IFNLX1RSVUU7ICAgLyogaW4gb3RoZXIgd29yZHM6IElOQ1JFQVNFICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgUmF0aW9EaWZmQWJzID0gKE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW8gLSBVc2VkRGVzY3JSYXRpbyk7CisgICAgICAgIFJhdGlvRGlmZlJlbCA9IChSYXRpb0RpZmZBYnMgKiAxMDApIC8gTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyA9IFVzZWREZXNjclJhdGlvOworICAgICAgICBJbmNyZWFzZVRpbWVyRHVyYXRpb24gPSBTS19UUlVFOyAgIC8qIGluIG90aGVyIHdvcmRzOiBJTkNSRUFTRSAqLworICAgIH0KKworICAgIC8qCisgICAgKiogTm93IHdlIGNhbiBkZXRlcm1pbmUgdGhlIGNoYW5nZSBpbiBwZXJjZW50CisgICAgKi8KKyAgICBpZiAoKFJhdGlvRGlmZlJlbCA+PSAwKSAmJiAoUmF0aW9EaWZmUmVsIDw9IDUpICkgeworICAgICAgIE1vZEFkalZhbHVlID0gMTsgIC8qICAxJSBjaGFuZ2UgLSBtYXliZSBzb21lIG90aGVyIHZhbHVlIGluIGZ1dHVyZSAqLworICAgIH0gZWxzZSBpZiAoKFJhdGlvRGlmZlJlbCA+IDUpICYmIChSYXRpb0RpZmZSZWwgPD0gMTApICkgeworICAgICAgIE1vZEFkalZhbHVlID0gMTsgIC8qICAxJSBjaGFuZ2UgLSBtYXliZSBzb21lIG90aGVyIHZhbHVlIGluIGZ1dHVyZSAqLworICAgIH0gZWxzZSBpZiAoKFJhdGlvRGlmZlJlbCA+IDEwKSAmJiAoUmF0aW9EaWZmUmVsIDw9IDE1KSApIHsKKyAgICAgICBNb2RBZGpWYWx1ZSA9IDE7ICAvKiAgMSUgY2hhbmdlIC0gbWF5YmUgc29tZSBvdGhlciB2YWx1ZSBpbiBmdXR1cmUgKi8KKyAgICB9IGVsc2UgeworICAgICAgIE1vZEFkalZhbHVlID0gMTsgIC8qICAxJSBjaGFuZ2UgLSBtYXliZSBzb21lIG90aGVyIHZhbHVlIGluIGZ1dHVyZSAqLworICAgIH0KKworICAgIGlmIChJbmNyZWFzZVRpbWVyRHVyYXRpb24pIHsKKyAgICAgICBOZXdNYXhNb2RJbnRzUGVyU2VjID0gIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICogTW9kQWRqVmFsdWUpIC8gMTAwOworICAgIH0gZWxzZSB7CisgICAgICAgTmV3TWF4TW9kSW50c1BlclNlYyA9ICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyAqIE1vZEFkalZhbHVlKSAvIDEwMDsKKyAgICB9CisKKyAgICAvKiAKKyAgICAqKiBDaGVjayBpZiB3ZSBleGNlZWQgYm91bmRhcmllcy4uLgorICAgICovCisgICAgaWYgKCAoTmV3TWF4TW9kSW50c1BlclNlYyA+IE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdCkgfHwKKyAgICAgICAgIChOZXdNYXhNb2RJbnRzUGVyU2VjIDwgTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWNMb3dlckxpbWl0KSkgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJDYW5ub3QgY2hhbmdlIE1vZFRpbSBmcm9tICVpIHRvICVpIGludHMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjLCBOZXdNYXhNb2RJbnRzUGVyU2VjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE1fRElNSU5GTy5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgICAgIHByaW50aygiUmVzaXplZCBNb2RUaW0gZnJvbSAlaSB0byAlaSBpbnRzL3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYywgTmV3TWF4TW9kSW50c1BlclNlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlYyA9IE5ld01heE1vZEludHNQZXJTZWM7CisKKyAgICBpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfR0VORVNJUykgeworICAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9HRU5FU0lTIC8gcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTW9kQmFzZSA9IENfQ0xLX0ZSRVFfWVVLT04gLyBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYzsKKyAgICB9CisKKyAgICAvKiAKKyAgICAqKiBXZSBkbyBub3QgbmVlZCB0byB0b3VjaCBhbnkgb3RoZXIgcmVnaXN0ZXJzCisgICAgKi8KKyAgICBTS19PVVQzMihwQUMtPklvQmFzZSwgQjJfSVJRTV9JTkksIE1vZEJhc2UpOworfSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKCkKKyoqIERlc2NyaXB0aW9uICA6IERpc3BsYXlzIHdoYXQgdHlwZSBvZiBtb2RlcmF0aW9uIHdlIGhhdmUKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCEKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uVHlwZShTS19BQyAqcEFDKSB7CisKKyAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cykgeworICAgICAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX1NUQVRJQykgeworICAgICAgICAgICAgIHByaW50aygiU3RhdGljIGludCBtb2RlcmF0aW9uIHJ1bnMgd2l0aCAlaSBJTlRTL3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMpOworICAgICAgICB9IGVsc2UgaWYgKHBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID09IENfSU5UX01PRF9EWU5BTUlDKSB7CisgICAgICAgICAgICAgaWYgKElzSW50TW9kRW5hYmxlZChwQUMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJEeW5hbWljIGludCBtb2RlcmF0aW9uIHJ1bnMgd2l0aCAlaSBJTlRTL3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJEeW5hbWljIGludCBtb2RlcmF0aW9uIGN1cnJlbnRseSBub3QgYXBwbGllZFxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHByaW50aygiTm8gaW50ZXJydXB0IG1vZGVyYXRpb24gc2VsZWN0ZWQhXG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25NYXNrKCkKKyoqIERlc2NyaXB0aW9uICA6IERpc3BsYXlzIHdoYXQgaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQhCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvbk1hc2soU0tfQUMgKnBBQykgeworCisgICAgaWYgKHBBQy0+RHluSXJxTW9kSW5mby5EaXNwbGF5U3RhdHMpIHsKKyAgICAgICAgaWYgKHBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ICE9IENfSU5UX01PRF9OT05FKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfVFhfT05MWTogCisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJPbmx5IFR4LWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19SWF9PTkxZOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIk9ubHkgUngtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1NQX09OTFk6IAorICAgICAgICAgICAgICAgICAgIHByaW50aygiT25seSBzcGVjaWFsLWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19UWF9SWDogCisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJUeC0gYW5kIFJ4LWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19TUF9SWDogCisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJTcGVjaWFsLSBhbmQgUngtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1NQX1RYOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIlNwZWNpYWwtIGFuZCBUeC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfUlhfVFhfU1A6CisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJBbGwgUngtLCBUeCBhbmQgc3BlY2lhbC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJEb24ndCBrbm93IHdoYXQgaXMgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50aygiTm8gc3BlY2lmaWMgaW50ZXJydXB0cyBtYXNrZWQgZm9yIG1vZGVyYXRpb25cbiIpOworICAgICAgICB9CisgICAgfSAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IERpc3BsYXlEZXNjclJhdGlvCisqKiBEZXNjcmlwdGlvbiAgOiBMaWtlIHRoZSBuYW1lIHN0YXRlcy4uLgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkIQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK0Rpc3BsYXlEZXNjclJhdGlvKFNLX0FDICpwQUMpIHsKKyAgICBpbnQgVG90YWxNYXhOYnJEZXNjciA9IDA7CisKKyAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cykgeworICAgICAgICBUb3RhbE1heE5ickRlc2NyID0gcEFDLT5SeERlc2NyUGVyUmluZyAqIEdldFJ4Q2FsbHMocEFDKTsKKyAgICAgICAgcHJpbnRrKCJSYXRpbyBkZXNjcmlwdG9yczogJWkvJWlcbiIsCisgICAgICAgICAgICAgICBNX0RJTUlORk8uTmJyUHJvY2Vzc2VkRGVzY3IsIFRvdGFsTWF4TmJyRGVzY3IpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBFbmQgb2YgZmlsZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjYzOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2V0aHRvb2wuYwpAQCAtMCwwICsxLDU1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6ICAgICAgICBza2V0aHRvb2wuYworICogUHJvamVjdDogICAgIEdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246ICAgICAkUmV2aXNpb246IDEuNyAkCisgKiBEYXRlOiAgICAgICAgJERhdGU6IDIwMDQvMDkvMjkgMTM6MzI6MDcgJAorICogUHVycG9zZTogICAgIEFsbCBmdW5jdGlvbnMgcmVnYXJkaW5nIGV0aHRvb2wgaGFuZGxpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDA0IE1hcnZlbGwuCisgKgorICoJRHJpdmVyIGZvciBNYXJ2ZWxsIFl1a29uLzIgY2hpcHNldCBhbmQgU3lzS29ubmVjdCBHaWdhYml0IEV0aGVybmV0IAorICogICAgICBTZXJ2ZXIgQWRhcHRlcnMuCisgKgorICoJQXV0aG9yOiBSYWxwaCBSb2VzbGVyIChycm9lc2xlckBzeXNrb25uZWN0LmRlKQorICoJICAgICAgICBNaXJrbyBMaW5kbmVyIChtbGluZG5lckBzeXNrb25uZWN0LmRlKQorICoKKyAqCUFkZHJlc3MgYWxsIHF1ZXN0aW9uIHRvOiBsaW51eEBzeXNrb25uZWN0LmRlCisgKgorICoJVGhlIHRlY2huaWNhbCBtYW51YWwgZm9yIHRoZSBhZGFwdGVycyBpcyBhdmFpbGFibGUgZnJvbSBTeXNLb25uZWN0J3MKKyAqCXdlYiBwYWdlczogd3d3LnN5c2tvbm5lY3QuY29tCisgKgkKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKyNpbmNsdWRlICJoL3NrdmVyc2lvbi5oIgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlZmluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1VQUF9DT1BQRVJfQUxMIChTVVBQT1JURURfMTBiYXNlVF9IYWxmICB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfVFApCisKKyNkZWZpbmUgQURWX0NPUFBFUl9BTEwgIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiAgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGZ8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX1RQKQorCisjZGVmaW5lIFNVUFBfRklCUkVfQUxMICAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9GSUJSRSAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfQXV0b25lZykKKworI2RlZmluZSBBRFZfRklCUkVfQUxMICAgKEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF9GSUJSRSAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX0F1dG9uZWcpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvY2FsIEZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCWdldFNldHRpbmdzIC0gcmV0cmlldmVzIHRoZSBjdXJyZW50IHNldHRpbmdzIG9mIHRoZSBzZWxlY3RlZCBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBzZWxlY3RlZCBhZGFwdGVyIGlzIHJldHVybmVkLgorICoJVGhpcyBjb25maWd1cmF0aW9uIGludm9sdmVzIGEpc3BlZWQsIGIpZHVwbGV4IGFuZCBjKWF1dG9uZWcgcGx1cworICoJYSBudW1iZXIgb2Ygb3RoZXIgdmFyaWFibGVzLgorICoKKyAqIFJldHVybnM6ICAgIGFsd2F5cyAwCisgKgorICovCitzdGF0aWMgaW50IGdldFNldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwljb25zdCBERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcG9ydCA9IHBOZXQtPlBvcnROcjsKKwljb25zdCBTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCWNvbnN0IFNLX0dFUE9SVCAqcFBvcnQgPSAmcEFDLT5HSW5pLkdQW3BvcnRdOworCisJc3RhdGljIGludCBEdXBsZXhBdXRvTmVnQ29uZk1hcFs5XVszXT0geworCQl7IC0xICAgICAgICAgICAgICAgICAgICAgLCAtMSAgICAgICAgICwgLTEgICAgICAgICAgICAgIH0sCisJCXsgMCAgICAgICAgICAgICAgICAgICAgICAsIC0xICAgICAgICAgLCAtMSAgICAgICAgICAgICAgfSwKKwkJeyBTS19MTU9ERV9IQUxGICAgICAgICAgICwgRFVQTEVYX0hBTEYsIEFVVE9ORUdfRElTQUJMRSB9LAorCQl7IFNLX0xNT0RFX0ZVTEwgICAgICAgICAgLCBEVVBMRVhfRlVMTCwgQVVUT05FR19ESVNBQkxFIH0sCisJCXsgU0tfTE1PREVfQVVUT0hBTEYgICAgICAsIERVUExFWF9IQUxGLCBBVVRPTkVHX0VOQUJMRSAgfSwKKwkJeyBTS19MTU9ERV9BVVRPRlVMTCAgICAgICwgRFVQTEVYX0ZVTEwsIEFVVE9ORUdfRU5BQkxFICB9LAorCQl7IFNLX0xNT0RFX0FVVE9CT1RIICAgICAgLCBEVVBMRVhfRlVMTCwgQVVUT05FR19FTkFCTEUgIH0sCisJCXsgU0tfTE1PREVfQVVUT1NFTlNFICAgICAsIC0xICAgICAgICAgLCAtMSAgICAgICAgICAgICAgfSwKKwkJeyBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRCwgLTEgICAgICAgICAsIC0xICAgICAgICAgICAgICB9CisJfTsKKwlzdGF0aWMgaW50IFNwZWVkQ29uZk1hcFs2XVsyXSA9IHsKKwkJeyAwICAgICAgICAgICAgICAgICAgICAgICAsIC0xICAgICAgICAgfSwKKwkJeyBTS19MU1BFRURfQVVUTyAgICAgICAgICAsIC0xICAgICAgICAgfSwKKwkJeyBTS19MU1BFRURfMTBNQlBTICAgICAgICAsIFNQRUVEXzEwICAgfSwKKwkJeyBTS19MU1BFRURfMTAwTUJQUyAgICAgICAsIFNQRUVEXzEwMCAgfSwKKwkJeyBTS19MU1BFRURfMTAwME1CUFMgICAgICAsIFNQRUVEXzEwMDAgfSwKKwkJeyBTS19MU1BFRURfSU5ERVRFUk1JTkFURUQsIC0xICAgICAgICAgfQorCX07CisJc3RhdGljIGludCBBZHZTcGVlZE1hcFs2XVsyXSA9IHsKKwkJeyAwICAgICAgICAgICAgICAgICAgICAgICAsIC0xICAgICAgICAgfSwKKwkJeyBTS19MU1BFRURfQVVUTyAgICAgICAgICAsIC0xICAgICAgICAgfSwKKwkJeyBTS19MU1BFRURfMTBNQlBTICAgICAgICAsIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICAgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB9LAorCQl7IFNLX0xTUEVFRF8xMDBNQlBTICAgICAgICwgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmICB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB9LAorCQl7IFNLX0xTUEVFRF8xMDAwTUJQUyAgICAgICwgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGx9LAorCQl7IFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRCwgLTEgICAgICAgICB9CisJfTsKKworCWVjbWQtPnBoeV9hZGRyZXNzID0gcG9ydDsKKwllY21kLT5zcGVlZCAgICAgICA9IFNwZWVkQ29uZk1hcFtwUG9ydC0+UExpbmtTcGVlZFVzZWRdWzFdOworCWVjbWQtPmR1cGxleCAgICAgID0gRHVwbGV4QXV0b05lZ0NvbmZNYXBbcFBvcnQtPlBMaW5rTW9kZVN0YXR1c11bMV07CisJZWNtZC0+YXV0b25lZyAgICAgPSBEdXBsZXhBdXRvTmVnQ29uZk1hcFtwUG9ydC0+UExpbmtNb2RlU3RhdHVzXVsyXTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlpZiAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSkgeworCQllY21kLT5wb3J0ICAgICAgICA9IFBPUlRfVFA7CisJCWVjbWQtPnN1cHBvcnRlZCAgID0gKFNVUFBfQ09QUEVSX0FMTHxTVVBQT1JURURfQXV0b25lZyk7CisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTBiYXNlVF9IYWxmKTsKKwkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpOworCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYpOworCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpOworCQl9IGVsc2UgeworCQkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSB7CisJCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKTsKKwkJCX0gCisjaWZkZWYgQ0hJUF9JRF9ZVUtPTl9GRQorCQkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OX0ZFKSB7CisJCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKTsKKwkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCQkJfQorI2VuZGlmCisJCX0KKwkJaWYgKHBBQy0+R0luaS5HUFswXS5QTGlua1NwZWVkICE9IFNLX0xTUEVFRF9BVVRPKSB7CisJCQllY21kLT5hZHZlcnRpc2luZyA9IEFkdlNwZWVkTWFwW3BQb3J0LT5QTGlua1NwZWVkXVsxXTsKKwkJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikgeworCQkJCWVjbWQtPmFkdmVydGlzaW5nICY9IH4oU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKTsKKwkJCX0gCisJCX0gZWxzZSB7CisJCQllY21kLT5hZHZlcnRpc2luZyA9IGVjbWQtPnN1cHBvcnRlZDsKKwkJfQorCisJCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSAKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwl9IGVsc2UgeworCQllY21kLT5wb3J0ICAgICAgICA9IFBPUlRfRklCUkU7CisJCWVjbWQtPnN1cHBvcnRlZCAgID0gU1VQUF9GSUJSRV9BTEw7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWX0ZJQlJFX0FMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNSUIgaW5mcmFzdHJ1Y3R1cmUgdXNlcyBpbnN0YW5jZSB2YWx1ZSBzdGFydGluZyBhdCAxCisgKiBiYXNlZCBvbiBib2FyZCBhbmQgcG9ydC4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcG5taUluc3RhbmNlKGNvbnN0IERFVl9ORVQgKnBOZXQpCit7CisJcmV0dXJuIDEgKyAocE5ldC0+cEFDLT5SbG10TmV0cyA9PSAyKSArIHBOZXQtPlBvcnROcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2V0U2V0dGluZ3MgLSBjb25maWd1cmVzIHRoZSBzZXR0aW5ncyBvZiBhIHNlbGVjdGVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVBvc3NpYmxlIHNldHRpbmdzIHRoYXQgbWF5IGJlIGFsdGVyZWQgYXJlIGEpc3BlZWQsIGIpZHVwbGV4IG9yIAorICoJYylhdXRvbmVnb3RpYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqCTA6CWV2ZXJ5dGhpbmcgZmluZSwgbm8gZXJyb3IKKyAqCTwwOgl0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsdXJlIAorICovCitzdGF0aWMgaW50IHNldFNldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCXUzMiBpbnN0YW5jZTsKKwljaGFyIGJ1Zls0XTsKKwlpbnQgbGVuID0gMTsKKworCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiBlY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAgCisJICAgICYmIGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFICYmIGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQorCQkqYnVmID0gKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgCisJCQk/IFNLX0xNT0RFX0ZVTEwgOiBTS19MTU9ERV9IQUxGOworCWVsc2UKKwkJKmJ1ZiA9IChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIAorCQkJPyBTS19MTU9ERV9BVVRPRlVMTCA6IFNLX0xNT0RFX0FVVE9IQUxGOworCQorCWluc3RhbmNlID0gcG5taUluc3RhbmNlKHBOZXQpOworCWlmIChTa1BubWlTZXRWYXIocEFDLCBwQUMtPklvQmFzZSwgT0lEX1NLR0VfTElOS19NT0RFLCAKKwkJCSAgICZidWYsICZsZW4sIGluc3RhbmNlLCBwTmV0LT5OZXROcikgIT0gU0tfUE5NSV9FUlJfT0spCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKGVjbWQtPnNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDAwOgorCQkqYnVmID0gU0tfTFNQRUVEXzEwMDBNQlBTOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJKmJ1ZiA9IFNLX0xTUEVFRF8xMDBNQlBTOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwOgorCQkqYnVmID0gU0tfTFNQRUVEXzEwTUJQUzsKKwl9CisKKwlpZiAoU2tQbm1pU2V0VmFyKHBBQywgcEFDLT5Jb0Jhc2UsIE9JRF9TS0dFX1NQRUVEX01PREUsIAorCQkJICZidWYsICZsZW4sIGluc3RhbmNlLCBwTmV0LT5OZXROcikgIT0gU0tfUE5NSV9FUlJfT0spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlnZXREcml2ZXJJbmZvIC0gcmV0dXJucyBnZW5lcmljIGRyaXZlciBhbmQgYWRhcHRlciBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2VuZXJpYyBkcml2ZXIgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgdmlhIHRoaXMgZnVuY3Rpb24sIHN1Y2ggYXMKKyAqCXRoZSBuYW1lIG9mIHRoZSBkcml2ZXIsIGl0cyB2ZXJzaW9uIGFuZCBhbmQgZmlybXdhcmUgdmVyc2lvbi4KKyAqCUluIGFkZGl0aW9uIHRvIHRoaXMsIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgYWRhcHRlciBpcyAKKyAqCXJldHVybmVkIGFzIGEgYnVzIGluZm8gc3RyaW5nIChlLmcuICcwMTowNS4wJykuCisgKgkKKyAqIFJldHVybnM6CU4vQQorICoKKyAqLworc3RhdGljIHZvaWQgZ2V0RHJpdmVySW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCWNvbnN0IERFVl9ORVQJKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IFNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJY2hhciB2ZXJzWzMyXTsKKworCXNucHJpbnRmKHZlcnMsIHNpemVvZih2ZXJzKS0xLCBWRVJfU1RSSU5HICIodiVkLiVkKSIsCisJCShwQUMtPkdJbmkuR0lQY2lId1JldiA+PiA0KSAmIDB4ZiwgcEFDLT5HSW5pLkdJUGNpSHdSZXYgJiAweGYpOworCisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9GSUxFX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgdmVycyk7CisJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwQUMtPlBjaURldiksIEVUSFRPT0xfQlVTSU5GT19MRU4pOworfQorCisvKgorICogRXRodG9vbCBzdGF0aXN0aWNzIHN1cHBvcnQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFN0cmluZ3NTdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJInJ4X3BhY2tldHMiLAkidHhfcGFja2V0cyIsCisJInJ4X2J5dGVzIiwJInR4X2J5dGVzIiwKKwkicnhfZXJyb3JzIiwJInR4X2Vycm9ycyIsCQorCSJyeF9kcm9wcGVkIiwJInR4X2Ryb3BwZWQiLAorCSJtdWx0aWNhc3RzIiwJImNvbGxpc2lvbnMiLAkKKwkicnhfbGVuZ3RoX2Vycm9ycyIsCQkicnhfYnVmZmVyX292ZXJmbG93X2Vycm9ycyIsCisJInJ4X2NyY19lcnJvcnMiLAkJInJ4X2ZyYW1lX2Vycm9ycyIsCisJInJ4X3Rvb19zaG9ydF9lcnJvcnMiLAkJInJ4X3Rvb19sb25nX2Vycm9ycyIsCisJInJ4X2NhcnJpZXJfZXh0ZW5zaW9uX2Vycm9ycyIsCSJyeF9zeW1ib2xfZXJyb3JzIiwKKwkicnhfbGxjX21hY19zaXplX2Vycm9ycyIsCSJyeF9jYXJyaWVyX2Vycm9ycyIsCQorCSJyeF9qYWJiZXJfZXJyb3JzIiwJCSJyeF9taXNzZWRfZXJyb3JzIiwKKwkidHhfYWJvcnRfY29sbGlzaW9uX2Vycm9ycyIsCSJ0eF9jYXJyaWVyX2Vycm9ycyIsCisJInR4X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcnMiLAkidHhfaGVhcnRiZWF0X2Vycm9ycyIsCisJInR4X3dpbmRvd19lcnJvcnMiLAorfTsKKworc3RhdGljIGludCBnZXRTdGF0c0NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoU3RyaW5nc1N0YXRzKTsKK30KKworc3RhdGljIHZvaWQgZ2V0U3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlzd2l0Y2goc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShkYXRhLCAqU3RyaW5nc1N0YXRzLCBzaXplb2YoU3RyaW5nc1N0YXRzKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0RXRodG9vbFN0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJY29uc3QgREVWX05FVAkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3QgU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwljb25zdCBTS19QTk1JX1NUUlVDVF9EQVRBICpwUG5taVN0cnVjdCA9ICZwQUMtPlBubWlTdHJ1Y3Q7CisKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4T2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeE9rQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhPY3RldHNPa0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4T2N0ZXRzT2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5JbkVycm9yc0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+UnhOb0J1ZkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlR4Tm9CdWZDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeE11bHRpY2FzdE9rQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeFJ1bnRDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeEZpZm9PdmVyZmxvd0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4RmNzQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhGcmFtaW5nQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhTaG9ydHNDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeFRvb0xvbmdDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeENleHRDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeFN5bWJvbEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4SVJMZW5ndGhDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeENhcnJpZXJDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeEphYmJlckN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4TWlzc2VkQ3RzOworCSpkYXRhKysgPSBwQUMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhDYXJyaWVyQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhGaWZvVW5kZXJydW5DdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeENhcnJpZXJDdHM7CisJKmRhdGErKyA9IHBBQy0+c3RhdHMudHhfd2luZG93X2Vycm9yczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJdG9nZ2xlTGVkcyAtIENoYW5nZXMgdGhlIExFRCBzdGF0ZSBvZiBhbiBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWxsIExFRHMgb2YgYW4gYWRhcHRlciBzbworICoJdGhhdCBpdCBjYW4gYmUgbG9jYXRlZCBieSBhIHVzZXIuIAorICoKKyAqIFJldHVybnM6CU4vQQorICoKKyAqLworc3RhdGljIHZvaWQgdG9nZ2xlTGVkcyhERVZfTkVUICpwTmV0LCBpbnQgb24pCit7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwlpbnQgcG9ydCA9IHBOZXQtPlBvcnROcjsKKwl2b2lkIF9faW9tZW0gKmlvID0gcEFDLT5Jb0Jhc2U7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlTS19PVVQ4KGlvLCBNUl9BRERSKHBvcnQsTE5LX0xFRF9SRUcpLCAKKwkJCW9uID8gU0tfTE5LX09OIDogU0tfTE5LX09GRik7CisJCVNrR2VZZWxsb3dMRUQocEFDLCBpbywgCisJCQkgICAgICBvbiA/IChMRURfT04gPj4gMSkgOiAoTEVEX09GRiA+PiAxKSk7CisJCVNrR2VYbWl0TEVEKHBBQywgaW8sIE1SX0FERFIocG9ydCxSWF9MRURfSU5JKSwKKwkJCSAgICBvbiA/IFNLX0xFRF9UU1QgOiBTS19MRURfRElTKTsKKworCQlpZiAocEFDLT5HSW5pLkdQW3BvcnRdLlBoeVR5cGUgPT0gU0tfUEhZX0JDT00pCisJCQlTa1htUGh5V3JpdGUocEFDLCBpbywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgCisJCQkJICAgICBvbiA/IFBIWV9CX1BFQ19MRURfT04gOiBQSFlfQl9QRUNfTEVEX09GRik7CisJCWVsc2UgaWYgKHBBQy0+R0luaS5HUFtwb3J0XS5QaHlUeXBlID09IFNLX1BIWV9MT05FKQorCQkJU2tYbVBoeVdyaXRlKHBBQywgaW8sIHBvcnQsIFBIWV9MT05FX0xFRF9DRkcsCisJCQkJICAgICBvbiA/IDB4MDgwMCA6IFBIWV9MX0xDX0xFRFQpOworCQllbHNlCisJCQlTa0dlWG1pdExFRChwQUMsIGlvLCBNUl9BRERSKHBvcnQsVFhfTEVEX0lOSSksCisJCQkJICAgIG9uID8gU0tfTEVEX1RTVCA6IFNLX0xFRF9ESVMpOworCX0gZWxzZSB7CisJCWNvbnN0IHUxNiBZdWtMZWRPbiA9IChQSFlfTV9MRURfTU9fRFVQKE1PX0xFRF9PTikgIHwKKwkJCQkgICAgICBQSFlfTV9MRURfTU9fMTAoTU9fTEVEX09OKSAgIHwKKwkJCQkgICAgICBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PTikgIHwKKwkJCQkgICAgICBQSFlfTV9MRURfTU9fMTAwMChNT19MRURfT04pIHwgCisJCQkJICAgICAgUEhZX01fTEVEX01PX1JYKE1PX0xFRF9PTikpOworCQljb25zdCB1MTYgIFl1a0xlZE9mZiA9IChQSFlfTV9MRURfTU9fRFVQKE1PX0xFRF9PRkYpICB8CisJCQkJCVBIWV9NX0xFRF9NT18xMChNT19MRURfT0ZGKSAgIHwKKwkJCQkJUEhZX01fTEVEX01PXzEwMChNT19MRURfT0ZGKSAgfAorCQkJCQlQSFlfTV9MRURfTU9fMTAwMChNT19MRURfT0ZGKSB8IAorCQkJCQlQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09GRikpOworCQorCisJCVNrR21QaHlXcml0ZShwQUMsaW8scG9ydCxQSFlfTUFSVl9MRURfQ1RSTCwwKTsKKwkJU2tHbVBoeVdyaXRlKHBBQyxpbyxwb3J0LFBIWV9NQVJWX0xFRF9PVkVSLCAKKwkJCSAgICAgb24gPyBZdWtMZWRPbiA6IFl1a0xlZE9mZik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJc2tHZUJsaW5rVGltZXIgLSBDaGFuZ2VzIHRoZSBMRUQgc3RhdGUgb2YgYW4gYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFsbCBMRURzIG9mIGFuIGFkYXB0ZXIgc28KKyAqCXRoYXQgaXQgY2FuIGJlIGxvY2F0ZWQgYnkgYSB1c2VyLiBJZiB0aGUgcmVxdWVzdGVkIHRpbWUgaW50ZXJ2YWwgZm9yCisgKgl0aGlzIHRlc3QgaGFzIGVsYXBzZWQsIHRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgCisgKgl0ZW1wb3JhcmlseSBzZXR1cCBkdXJpbmcgdGhlIGxvY2F0ZSBOSUMgdGVzdC4gVGhpcyBpbnZvbHZlcyBvZiBjb3Vyc2UKKyAqCWFsc28gY2xvc2luZyBvciBvcGVuaW5nIGFueSBhZGFwdGVyIHNvIHRoYXQgdGhlIGluaXRpYWwgYm9hcmQgc3RhdGUgCisgKglpcyByZWNvdmVyZWQuCisgKgorICogUmV0dXJuczoJTi9BCisgKgorICovCit2b2lkIFNrR2VCbGlua1RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJREVWX05FVCAqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKworCXRvZ2dsZUxlZHMocE5ldCwgcEFDLT5MZWRzT24pOworCisJcEFDLT5MZWRzT24gPSAhcEFDLT5MZWRzT247CisJbW9kX3RpbWVyKCZwQUMtPkJsaW5rVGltZXIsIGppZmZpZXMgKyBIWi80KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCWxvY2F0ZURldmljZSAtIHN0YXJ0IHRoZSBsb2NhdGUgTklDIGZlYXR1cmUgb2YgdGhlIGVsZWN0ZWQgYWRhcHRlciAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpZiB0aGUgdXNlciB3YW50IHRvIGxvY2F0ZSBhIHBhcnRpY3VsYXIgTklDLgorICoJQWxsIExFRHMgYXJlIHJlZ3VsYXJseSBzd2l0Y2hlZCBvbiBhbmQgb2ZmLCBzbyB0aGUgTklDIGNhbiBlYXNpbHkKKyAqCWJlIGlkZW50aWZpZWQuCisgKgorICogUmV0dXJuczoJCisgKgk9PTA6CWV2ZXJ5dGhpbmcgZmluZSwgbm8gZXJyb3IsIGxvY2F0ZU5JQyB0ZXN0IHdhcyBzdGFydGVkCisgKgkhPTA6CW9uZSBsb2NhdGVOSUMgdGVzdCBydW5zIGFscmVhZHkKKyAqCisgKi8KK3N0YXRpYyBpbnQgbG9jYXRlRGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisKKwlpZighZGF0YSB8fCBkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCisJCWRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKKworCS8qIHN0YXJ0IGJsaW5raW5nICovCisJcEFDLT5MZWRzT24gPSAwOworCW1vZF90aW1lcigmcEFDLT5CbGlua1RpbWVyLCBqaWZmaWVzKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CisJZGVsX3RpbWVyX3N5bmMoJnBBQy0+QmxpbmtUaW1lcik7CisJdG9nZ2xlTGVkcyhwTmV0LCAwKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJZ2V0UGF1c2VQYXJhbXMgLSByZXRyaWV2ZXMgdGhlIHBhdXNlIHBhcmFtZXRlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUFsbCBjdXJyZW50IHBhdXNlIHBhcmFtZXRlcnMgb2YgYSBzZWxlY3RlZCBhZGFwdGVyIGFyZSBwbGFjZWQgCisgKglpbiB0aGUgcGFzc2VkIGV0aHRvb2xfcGF1c2VwYXJhbSBzdHJ1Y3R1cmUgYW5kIGFyZSByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGdldFBhdXNlUGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkgCit7CisJREVWX05FVAkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwlTS19HRVBPUlQgKnBQb3J0ID0gJnBBQy0+R0luaS5HUFtwTmV0LT5Qb3J0TnJdOworCisJZXBhdXNlLT5yeF9wYXVzZSA9IChwUG9ydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfU1lNTUVUUklDKSB8fAorCQkgIChwUG9ydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfU1lNX09SX1JFTSk7CisKKwllcGF1c2UtPnR4X3BhdXNlID0gZXBhdXNlLT5yeF9wYXVzZSB8fCAocFBvcnQtPlBGbG93Q3RybE1vZGUgPT0gU0tfRkxPV19NT0RFX0xPQ19TRU5EKTsKKwllcGF1c2UtPmF1dG9uZWcgPSBlcGF1c2UtPnJ4X3BhdXNlIHx8IGVwYXVzZS0+dHhfcGF1c2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNldFBhdXNlUGFyYW1zIC0gY29uZmlndXJlcyB0aGUgcGF1c2UgcGFyYW1ldGVycyBvZiBhbiBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFJ4IG9yIFR4IHBhdXNlIHBhcmFtZXRlcnMgCisgKgorICogUmV0dXJuczoKKyAqCT09MDoJZXZlcnl0aGluZyBmaW5lLCBubyBlcnJvcgorICoJIT0wOgl0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsdXJlIAorICovCitzdGF0aWMgaW50IHNldFBhdXNlUGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLCBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJREVWX05FVAkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwlTS19HRVBPUlQgKnBQb3J0ID0gJnBBQy0+R0luaS5HUFtwTmV0LT5Qb3J0TnJdOworCXUzMglpbnN0YW5jZSA9IHBubWlJbnN0YW5jZShwTmV0KTsKKwlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtIG9sZDsKKwl1OAlvbGRzcGVlZCA9IHBQb3J0LT5QTGlua1NwZWVkVXNlZDsKKwljaGFyCWJ1Zls0XTsKKwlpbnQJbGVuID0gMTsKKwlpbnQgcmV0OworCisJLyoKKwkqKiB3ZSBoYXZlIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBzZXR0aW5ncyB0byBzZWUgaWYgCisJKiogdGhlIG9wZXJhdG9yIHJlcXVlc3RlZCBhbnkgbW9kaWZpY2F0aW9uIG9mIHRoZSBmbG93IAorCSoqIGNvbnRyb2wgcGFyYW1ldGVycy4uLgorCSovCisJZ2V0UGF1c2VQYXJhbXMoZGV2LCAmb2xkKTsKKworCS8qCisJKiogcGVyZm9ybSBtb2RpZmljYXRpb25zIHJlZ2FyZGluZyB0aGUgY2hhbmdlcyAKKwkqKiByZXF1ZXN0ZWQgYnkgdGhlIG9wZXJhdG9yCisJKi8KKwlpZiAoZXBhdXNlLT5hdXRvbmVnICE9IG9sZC5hdXRvbmVnKSAKKwkJKmJ1ZiA9IGVwYXVzZS0+YXV0b25lZyA/IFNLX0ZMT1dfTU9ERV9OT05FIDogU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwllbHNlIHsKKwkJaWYgKGVwYXVzZS0+cnhfcGF1c2UgJiYgZXBhdXNlLT50eF9wYXVzZSkgCisJCQkqYnVmID0gU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJZWxzZSBpZiAoZXBhdXNlLT5yeF9wYXVzZSAmJiAhZXBhdXNlLT50eF9wYXVzZSkKKwkJCSpidWYgPSAgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCWVsc2UgaWYgKCFlcGF1c2UtPnJ4X3BhdXNlICYmIGVwYXVzZS0+dHhfcGF1c2UpCisJCQkqYnVmID0gIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDsKKwkJZWxzZQorCQkJKmJ1ZiA9IFNLX0ZMT1dfTU9ERV9OT05FOworCX0KKworCXJldCA9IFNrUG5taVNldFZhcihwQUMsIHBBQy0+SW9CYXNlLCBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFLAorCQkJICZidWYsICZsZW4sIGluc3RhbmNlLCBwTmV0LT5OZXROcik7CisKKwlpZiAocmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0NUUkwsCisJCQkgICAoImV0aHRvb2wgKHNrOThsaW4pOiBlcnJvciBjaGFuZ2luZyByeC90eCBwYXVzZSAoJWkpXG4iLCByZXQpKTsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkqKiBJdCBtYXkgYmUgdGhhdCBhdXRvbmVnIGhhcyBiZWVuIGRpc2FibGVkISBUaGVyZWZvcmUKKwkqKiBzZXQgdGhlIHNwZWVkIHRvIHRoZSBwcmV2aW91c2x5IHVzZWQgdmFsdWUuLi4KKwkqLworCWlmICghZXBhdXNlLT5hdXRvbmVnKSB7CisJCWxlbiA9IDE7CisJCXJldCA9IFNrUG5taVNldFZhcihwQUMsIHBBQy0+SW9CYXNlLCBPSURfU0tHRV9TUEVFRF9NT0RFLCAKKwkJCQkgICAmb2xkc3BlZWQsICZsZW4sIGluc3RhbmNlLCBwTmV0LT5OZXROcik7CisJCWlmIChyZXQgIT0gU0tfUE5NSV9FUlJfT0spIAorCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkgICAoImV0aHRvb2wgKHNrOThsaW4pOiBlcnJvciBzZXR0aW5nIHNwZWVkICglaSlcbiIsIHJldCkpOworCX0KKyBlcnI6CisgICAgICAgIHJldHVybiByZXQgPyAtRUlPIDogMDsKK30KKworc3RydWN0IGV0aHRvb2xfb3BzIFNrR2VFdGh0b29sT3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gZ2V0U2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBzZXRTZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gZ2V0RHJpdmVySW5mbywKKwkuZ2V0X3N0cmluZ3MJCT0gZ2V0U3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50CT0gZ2V0U3RhdHNDb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBnZXRFdGh0b29sU3RhdHMsCisJLnBoeXNfaWQJCT0gbG9jYXRlRGV2aWNlLAorCS5nZXRfcGF1c2VwYXJhbQkJPSBnZXRQYXVzZVBhcmFtcywKKwkuc2V0X3BhdXNlcGFyYW0JCT0gc2V0UGF1c2VQYXJhbXMsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI4MjdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKQEAgLTAsMCArMSw1MTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZS5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNDUgJAorICogRGF0ZTogICAgICAgCSREYXRlOiAyMDA0LzAyLzEyIDE0OjQxOjAyICQKKyAqIFB1cnBvc2U6CVRoZSBtYWluIGRyaXZlciBzb3VyY2UgbW9kdWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCURyaXZlciBmb3IgTWFydmVsbCBZdWtvbiBjaGlwc2V0IGFuZCBTeXNLb25uZWN0IEdpZ2FiaXQgRXRoZXJuZXQgCisgKiAgICAgIFNlcnZlciBBZGFwdGVycy4KKyAqCisgKglDcmVhdGVkIDEwLUZlYi0xOTk5LCBiYXNlZCBvbiBMaW51eCcgYWNlbmljLmMsIDNjNTl4LmMgYW5kCisgKglTeXNLb25uZWN0cyBHRW5lc2lzIFNvbGFyaXMgZHJpdmVyCisgKglBdXRob3I6IENocmlzdG9waCBHb29zIChjZ29vc0BzeXNrb25uZWN0LmRlKQorICoJICAgICAgICBNaXJrbyBMaW5kbmVyIChtbGluZG5lckBzeXNrb25uZWN0LmRlKQorICoKKyAqCUFkZHJlc3MgYWxsIHF1ZXN0aW9uIHRvOiBsaW51eEBzeXNrb25uZWN0LmRlCisgKgorICoJVGhlIHRlY2huaWNhbCBtYW51YWwgZm9yIHRoZSBhZGFwdGVycyBpcyBhdmFpbGFibGUgZnJvbSBTeXNLb25uZWN0J3MKKyAqCXdlYiBwYWdlczogd3d3LnN5c2tvbm5lY3QuY29tCisgKglHb3RvICJTdXBwb3J0IiBhbmQgc2VhcmNoIEtub3dsZWRnZSBCYXNlIGZvciAibWFudWFsIi4KKyAqCQorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUG9zc2libGUgY29tcGlsZXIgb3B0aW9ucyAoI2RlZmluZSB4eHggLyAtRHh4eCk6CisgKgorICoJZGVidWdnaW5nIGNhbiBiZSBlbmFibGUgYnkgY2hhbmdpbmcgU0tfREVCVUdfQ0hLTU9EIGFuZAorICoJU0tfREVCVUdfQ0hLQ0FUIGluIG1ha2VmaWxlIChkZXNjcmliZWQgdGhlcmUpLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKglUaGlzIGlzIHRoZSBtYWluIG1vZHVsZSBvZiB0aGUgTGludXggR0UgZHJpdmVyLgorICoJCisgKglBbGwgc291cmNlIGZpbGVzIGV4Y2VwdCBza2dlLmMsIHNrZHJ2MXN0LmgsIHNrZHJ2Mm5kLmggYW5kIHNrdHlwZXMuaAorICoJYXJlIHBhcnQgb2YgU3lzS29ubmVjdCdzIENPTU1PTiBNT0RVTEVTIGZvciB0aGUgU0stOTh4eCBhZGFwdGVycy4KKyAqCVRob3NlIGFyZSB1c2VkIGZvciBkcml2ZXJzIG9uIG11bHRpcGxlIE9TJywgc28gc29tZSB0aGluZyBtYXkgc2VlbQorICoJdW5uZWNlc3NhcnkgY29tcGxpY2F0ZWQgb24gTGludXguIFBsZWFzZSBkbyBub3QgdHJ5IHRvICdjbGVhbiB1cCcKKyAqCXRoZW0gd2l0aG91dCBWRVJZIGdvb2QgcmVhc29ucywgYmVjYXVzZSB0aGlzIHdpbGwgbWFrZSBpdCBtb3JlCisgKglkaWZmaWN1bHQgdG8ga2VlcCB0aGUgTGludXggZHJpdmVyIGluIHN5bmNocm9uaXNhdGlvbiB3aXRoIHRoZQorICoJb3RoZXIgdmVyc2lvbnMuCisgKgorICogSW5jbHVkZSBmaWxlIGhpZXJhcmNoeToKKyAqCisgKgk8bGludXgvbW9kdWxlLmg+CisgKgorICoJImgvc2tkcnYxc3QuaCIKKyAqCQk8bGludXgvdHlwZXMuaD4KKyAqCQk8bGludXgva2VybmVsLmg+CisgKgkJPGxpbnV4L3N0cmluZy5oPgorICoJCTxsaW51eC9lcnJuby5oPgorICoJCTxsaW51eC9pb3BvcnQuaD4KKyAqCQk8bGludXgvc2xhYi5oPgorICoJCTxsaW51eC9pbnRlcnJ1cHQuaD4KKyAqCQk8bGludXgvcGNpLmg+CisgKgkJPGxpbnV4L2JpdG9wcy5oPgorICoJCTxhc20vYnl0ZW9yZGVyLmg+CisgKgkJPGFzbS9pby5oPgorICoJCTxsaW51eC9uZXRkZXZpY2UuaD4KKyAqCQk8bGludXgvZXRoZXJkZXZpY2UuaD4KKyAqCQk8bGludXgvc2tidWZmLmg+CisgKgkgICAgdGhvc2UgdGhyZWUgZGVwZW5kaW5nIG9uIGtlcm5lbCB2ZXJzaW9uIHVzZWQ6CisgKgkJPGxpbnV4L2Jpb3MzMi5oPgorICoJCTxsaW51eC9pbml0Lmg+CisgKgkJPGFzbS91YWNjZXNzLmg+CisgKgkJPG5ldC9jaGVja3N1bS5oPgorICoKKyAqCQkiaC9za2Vycm9yLmgiCisgKgkJImgvc2tkZWJ1Zy5oIgorICoJCSJoL3NrdHlwZXMuaCIKKyAqCQkiaC9sbTgwLmgiCisgKgkJImgveG1hY19paS5oIgorICoKKyAqICAgICAgImgvc2tkcnYybmQuaCIKKyAqCQkiaC9za3F1ZXVlLmgiCisgKgkJImgvc2tnZWh3dC5oIgorICoJCSJoL3NrdGltZXIuaCIKKyAqCQkiaC9za2kyYy5oIgorICoJCSJoL3NrZ2Vwbm1pLmgiCisgKgkJImgvc2t2cGQuaCIKKyAqCQkiaC9za2dlaHcuaCIKKyAqCQkiaC9za2dlaW5pdC5oIgorICoJCSJoL3NrYWRkci5oIgorICoJCSJoL3NrZ2VzaXJxLmgiCisgKgkJImgvc2tjc3VtLmgiCisgKgkJImgvc2tybG10LmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUJImgvc2t2ZXJzaW9uLmgiCisKKyNpbmNsdWRlCTxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlCTxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIAk8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZQkiaC9za2RydjFzdC5oIgorI2luY2x1ZGUJImgvc2tkcnYybmQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZWZpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZm9yIGRlYnVnaW5nIG9uIHg4NiBvbmx5ICovCisvKiAjZGVmaW5lIEJSRUFLUE9JTlQoKSBhc20oIiBpbnQgJDMiKTsgKi8KKworLyogdXNlIHRoZSB0cmFuc21pdCBodyBjaGVja3N1bSBkcml2ZXIgZnVuY3Rpb25hbGl0eSAqLworI2RlZmluZSBVU0VfU0tfVFhfQ0hFQ0tTVU0KKworLyogdXNlIHRoZSByZWNlaXZlIGh3IGNoZWNrc3VtIGRyaXZlciBmdW5jdGlvbmFsaXR5ICovCisjZGVmaW5lIFVTRV9TS19SWF9DSEVDS1NVTQorCisvKiB1c2UgdGhlIHNjYXR0ZXItZ2F0aGVyIGZ1bmN0aW9uYWxpdHkgd2l0aCBzZW5kZmlsZSgpICovCisjZGVmaW5lIFNLX1pFUk9DT1BZCisKKy8qIHVzZSBvZiBhIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCAqLworI2RlZmluZSBVU0VfVFhfQ09NUExFVEUKKworLyoKKyAqIHRocmVzaG9sZCBmb3IgY29weWluZyBzbWFsbCByZWNlaXZlIGZyYW1lcworICogc2V0IHRvIDAgdG8gYXZvaWQgY29weWluZywgc2V0IHRvIDkwMDEgdG8gY29weSBhbGwgZnJhbWVzCisgKi8KKyNkZWZpbmUgU0tfQ09QWV9USFJFU0hPTEQJNTAKKworLyogbnVtYmVyIG9mIGFkYXB0ZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKyNkZWZpbmUgU0tfTUFYX0NBUkRfUEFSQU0JMTYKKworCisKKy8qCisgKiB1c2UgdGhvc2UgZGVmaW5lcyBmb3IgYSBjb21waWxlLWluIHZlcnNpb24gb2YgdGhlIGRyaXZlciBpbnN0ZWFkCisgKiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycworICovCisvLyAjZGVmaW5lIExJTktfU1BFRURfQQl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIExJTktfU1BFRURfQgl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIEFVVE9fTkVHX0EJeyJTZW5zZSIsIH0KKy8vICNkZWZpbmUgQVVUT19ORUdfQgl7IlNlbnNlIiwgfQorLy8gI2RlZmluZSBEVVBfQ0FQX0EJeyJCb3RoIiwgfQorLy8gI2RlZmluZSBEVVBfQ0FQX0IJeyJCb3RoIiwgfQorLy8gI2RlZmluZSBGTE9XX0NUUkxfQQl7IlN5bU9yUmVtIiwgfQorLy8gI2RlZmluZSBGTE9XX0NUUkxfQgl7IlN5bU9yUmVtIiwgfQorLy8gI2RlZmluZSBST0xFX0EJeyJBdXRvIiwgfQorLy8gI2RlZmluZSBST0xFX0IJeyJBdXRvIiwgfQorLy8gI2RlZmluZSBQUkVGX1BPUlQJeyJBIiwgfQorLy8gI2RlZmluZSBDT05fVFlQRSAJeyJBdXRvIiwgfQorLy8gI2RlZmluZSBSTE1UX01PREUJeyJDaGVja0xpbmtTdGF0ZSIsIH0KKworI2RlZmluZSBERVZfS0ZSRUVfU0tCKHNrYikgZGV2X2tmcmVlX3NrYihza2IpCisjZGVmaW5lIERFVl9LRlJFRV9TS0JfSVJRKHNrYikgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKQorI2RlZmluZSBERVZfS0ZSRUVfU0tCX0FOWShza2IpIGRldl9rZnJlZV9za2JfYW55KHNrYikKKworCisvKiBTZXQgYmxpbmsgbW9kZSovCisjZGVmaW5lIE9FTV9DT05GSUdfVkFMVUUgKAlTS19BQ1RfTEVEX0JMSU5LIHwgXAorCQkJCVNLX0RVUF9MRURfTk9STUFMIHwgXAorCQkJCVNLX0xFRF9MSU5LMTAwX09OKQorCisKKy8qIElzciByZXR1cm4gdmFsdWUgKi8KKyNkZWZpbmUgU2tJc3JSZXRWYXIJaXJxcmV0dXJuX3QKKyNkZWZpbmUgU2tJc3JSZXROb25lCUlSUV9OT05FCisjZGVmaW5lIFNrSXNyUmV0SGFuZGxlZAlJUlFfSEFORExFRAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCUZyZWVSZXNvdXJjZXMoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VCb2FyZEluaXQoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiwgU0tfQUMgKnBBQyk7CitzdGF0aWMgU0tfQk9PTAlCb2FyZEFsbG9jTWVtKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQJQm9hcmRGcmVlTWVtKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQJQm9hcmRJbml0TWVtKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQJU2V0dXBSaW5nKFNLX0FDKiwgdm9pZCosIHVpbnRwdHJfdCwgUlhEKiosIFJYRCoqLCBSWEQqKiwgaW50KiwgU0tfQk9PTCk7CitzdGF0aWMgU2tJc3JSZXRWYXIJU2tHZUlzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpOworc3RhdGljIFNrSXNyUmV0VmFyCVNrR2VJc3JPbmVQb3J0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncyk7CitzdGF0aWMgaW50CVNrR2VPcGVuKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpOworc3RhdGljIGludAlTa0dlQ2xvc2Uoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VYbWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpOworc3RhdGljIGludAlTa0dlU2V0TWFjQWRkcihzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCB2b2lkICpwKTsKK3N0YXRpYyB2b2lkCVNrR2VTZXRSeE1vZGUoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKlNrR2VTdGF0cyhzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBpbnQJU2tHZUlvY3RsKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQJR2V0Q29uZmlndXJhdGlvbihTS19BQyopOworc3RhdGljIHZvaWQJUHJvZHVjdFN0cihTS19BQyopOworc3RhdGljIGludAlYbWl0RnJhbWUoU0tfQUMqLCBUWF9QT1JUKiwgc3RydWN0IHNrX2J1ZmYqKTsKK3N0YXRpYyB2b2lkCUZyZWVUeERlc2NyaXB0b3JzKFNLX0FDKnBBQywgVFhfUE9SVCopOworc3RhdGljIHZvaWQJRmlsbFJ4UmluZyhTS19BQyosIFJYX1BPUlQqKTsKK3N0YXRpYyBTS19CT09MCUZpbGxSeERlc2NyaXB0b3IoU0tfQUMqLCBSWF9QT1JUKik7CitzdGF0aWMgdm9pZAlSZWNlaXZlSXJxKFNLX0FDKiwgUlhfUE9SVCosIFNLX0JPT0wpOworc3RhdGljIHZvaWQJQ2xlYXJBbmRTdGFydFJ4KFNLX0FDKiwgaW50KTsKK3N0YXRpYyB2b2lkCUNsZWFyVHhJcnEoU0tfQUMqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZAlDbGVhclJ4UmluZyhTS19BQyosIFJYX1BPUlQqKTsKK3N0YXRpYyB2b2lkCUNsZWFyVHhSaW5nKFNLX0FDKiwgVFhfUE9SVCopOworc3RhdGljIGludAlTa0dlQ2hhbmdlTXR1KHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIGludCBuZXdfbXR1KTsKK3N0YXRpYyB2b2lkCVBvcnRSZUluaXRCbXUoU0tfQUMqLCBpbnQpOworc3RhdGljIGludAlTa0dlSW9jTWliKERFVl9ORVQqLCB1bnNpZ25lZCBpbnQsIGludCk7CitzdGF0aWMgaW50CVNrR2VJbml0UENJKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQJU3RhcnREcnZDbGVhbnVwVGltZXIoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlTdG9wRHJ2Q2xlYW51cFRpbWVyKFNLX0FDICpwQUMpOworc3RhdGljIGludAlYbWl0RnJhbWVTRyhTS19BQyosIFRYX1BPUlQqLCBzdHJ1Y3Qgc2tfYnVmZiopOworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCitzdGF0aWMgU0tfVTMyICAgUGFyc2VEZXZpY2VOYnJGcm9tU2xvdE5hbWUoY29uc3QgY2hhciAqU2xvdE5hbWUpOworc3RhdGljIGludCAgICAgIFNrRHJ2SW5pdEFkYXB0ZXIoU0tfQUMgKnBBQywgaW50IGRldk5icik7CitzdGF0aWMgaW50ICAgICAgU2tEcnZEZUluaXRBZGFwdGVyKFNLX0FDICpwQUMsIGludCBkZXZOYnIpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXh0ZXJuIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IGNoYXIgCVNLUm9vdE5hbWVbXSA9ICJzazk4bGluIjsKK3N0YXRpYyBzdHJ1Y3QJCXByb2NfZGlyX2VudHJ5ICpwU2tSb290RGlyOworZXh0ZXJuIHN0cnVjdAlmaWxlX29wZXJhdGlvbnMgc2tfcHJvY19mb3BzOworCitzdGF0aWMgaW5saW5lIHZvaWQgU2tHZVByb2NDcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlOworCisJaWYgKHBTa1Jvb3REaXIgJiYgCisJICAgIChwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgU19JUlVHTywgcFNrUm9vdERpcikpKSB7CisJCXBlLT5wcm9jX2ZvcHMgPSAmc2tfcHJvY19mb3BzOworCQlwZS0+ZGF0YSA9IGRldjsKKwkJcGUtPm93bmVyID0gVEhJU19NT0RVTEU7CisJfQorfQorIAorc3RhdGljIGlubGluZSB2b2lkIFNrR2VQcm9jUmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKHBTa1Jvb3REaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcFNrUm9vdERpcik7Cit9CisKK2V4dGVybiB2b2lkIFNrRGltRW5hYmxlTW9kZXJhdGlvbklmTmVlZGVkKFNLX0FDICpwQUMpOwkKK2V4dGVybiB2b2lkIFNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhTS19BQyAqcEFDKTsKK2V4dGVybiB2b2lkIFNrRGltU3RhcnRNb2RlcmF0aW9uVGltZXIoU0tfQUMgKnBBQyk7CitleHRlcm4gdm9pZCBTa0RpbU1vZGVyYXRlKFNLX0FDICpwQUMpOworZXh0ZXJuIHZvaWQgU2tHZUJsaW5rVGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZAlEdW1wTXNnKHN0cnVjdCBza19idWZmKiwgY2hhciopOworc3RhdGljIHZvaWQJRHVtcERhdGEoY2hhciosIGludCk7CitzdGF0aWMgdm9pZAlEdW1wTG9uZyhjaGFyKiwgaW50KTsKKyNlbmRpZgorCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTS19CT09MIERvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19UUlVFOworZXh0ZXJuICBzdHJ1Y3QgZXRodG9vbF9vcHMgU2tHZUV0aHRvb2xPcHM7CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnRwdHJfdCBUeFF1ZXVlQWRkcltTS19NQVhfTUFDU11bMl0gPSB7ezB4NjgwLCAweDYwMH0sezB4NzgwLCAweDcwMH19Oworc3RhdGljIHVpbnRwdHJfdCBSeFF1ZXVlQWRkcltTS19NQVhfTUFDU10gPSB7MHg0MDAsIDB4NDgwfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VJbml0UENJIC0gSW5pdCB0aGUgUENJIHJlc291cmNlcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBQQ0kgcmVzb3VyY2VzIGFuZCBJTworICoKKyAqIFJldHVybnM6IE4vQQorICoJCisgKi8KK2ludCBTa0dlSW5pdFBDSShTS19BQyAqcEFDKQoreworCXN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYgPSBwQUMtPmRldlswXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBBQy0+UGNpRGV2OworCWludCByZXR2YWw7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikgIT0gMCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlkZXYtPm1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBwQUMtPk5hbWUpICE9IDApIHsKKwkJcmV0dmFsID0gMjsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKyNpZmRlZiBTS19CSUdfRU5ESUFOCisJLyoKKwkgKiBPbiBiaWcgZW5kaWFuIG1hY2hpbmVzLCB3ZSB1c2UgdGhlIGFkYXB0ZXIncyBhaWJpbGl0eSBvZgorCSAqIHJlYWRpbmcgdGhlIGRlc2NyaXB0b3JzIGFzIGJpZyBlbmRpYW4uCisJICovCisJeworCQlTS19VMzIJCW91cjI7CisJCVNrUGNpUmVhZENmZ0RXb3JkKHBBQywgUENJX09VUl9SRUdfMiwgJm91cjIpOworCQlvdXIyIHw9IFBDSV9SRVZfREVTQzsKKwkJU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQywgUENJX09VUl9SRUdfMiwgb3VyMik7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFJlbWFwIHRoZSByZWdzIGludG8ga2VybmVsIHNwYWNlLgorCSAqLworCXBBQy0+SW9CYXNlID0gaW9yZW1hcF9ub2NhY2hlKGRldi0+bWVtX3N0YXJ0LCAweDQwMDApOworCisJaWYgKCFwQUMtPklvQmFzZSl7CisJCXJldHZhbCA9IDM7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJcmV0dXJuIDA7CisKKyBvdXRfcmVsZWFzZToKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworIG91dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlGcmVlUmVzb3VyY2VzIC0gcmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHRoZSBJUlEsIHVubWFwcyB0aGUgSU8gYW5kCisgKglmcmVlcyB0aGUgZGVzcmlwdG9yIHJpbmcuCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworc3RhdGljIHZvaWQgRnJlZVJlc291cmNlcyhzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworU0tfVTMyIEFsbG9jRmxhZzsKK0RFVl9ORVQJCSpwTmV0OworU0tfQUMJCSpwQUM7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJQWxsb2NGbGFnID0gcEFDLT5BbGxvY0ZsYWc7CisJaWYgKHBBQy0+UGNpRGV2KSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocEFDLT5QY2lEZXYpOworCX0KKwlpZiAoQWxsb2NGbGFnICYgU0tfQUxMT0NfSVJRKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCX0KKwlpZiAocEFDLT5Jb0Jhc2UpIHsKKwkJaW91bm1hcChwQUMtPklvQmFzZSk7CisJfQorCWlmIChwQUMtPnBEZXNjck1lbSkgeworCQlCb2FyZEZyZWVNZW0ocEFDKTsKKwl9CisJCit9IC8qIEZyZWVSZXNvdXJjZXMgKi8KKworTU9EVUxFX0FVVEhPUigiTWlya28gTGluZG5lciA8bWxpbmRuZXJAc3lza29ubmVjdC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3lzS29ubmVjdCBTSy1ORVQgR2lnYWJpdCBFdGhlcm5ldCBTSy05OHh4IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgTElOS19TUEVFRF9BCitzdGF0aWMgY2hhciAqU3BlZWRfQVtTS19NQVhfQ0FSRF9QQVJBTV0gPSBMSU5LX1NQRUVEOworI2Vsc2UKK3N0YXRpYyBjaGFyICpTcGVlZF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgTElOS19TUEVFRF9CCitzdGF0aWMgY2hhciAqU3BlZWRfQltTS19NQVhfQ0FSRF9QQVJBTV0gPSBMSU5LX1NQRUVEOworI2Vsc2UKK3N0YXRpYyBjaGFyICpTcGVlZF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgQVVUT19ORUdfQQorc3RhdGljIGNoYXIgKkF1dG9OZWdfQVtTS19NQVhfQ0FSRF9QQVJBTV0gPSBBVVRPX05FR19BOworI2Vsc2UKK3N0YXRpYyBjaGFyICpBdXRvTmVnX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBEVVBfQ0FQX0EKK3N0YXRpYyBjaGFyICpEdXBDYXBfQVtTS19NQVhfQ0FSRF9QQVJBTV0gPSBEVVBfQ0FQX0E7CisjZWxzZQorc3RhdGljIGNoYXIgKkR1cENhcF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgRkxPV19DVFJMX0EKK3N0YXRpYyBjaGFyICpGbG93Q3RybF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IEZMT1dfQ1RSTF9BOworI2Vsc2UKK3N0YXRpYyBjaGFyICpGbG93Q3RybF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgUk9MRV9BCitzdGF0aWMgY2hhciAqUm9sZV9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IFJPTEVfQTsKKyNlbHNlCitzdGF0aWMgY2hhciAqUm9sZV9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgQVVUT19ORUdfQgorc3RhdGljIGNoYXIgKkF1dG9OZWdfQltTS19NQVhfQ0FSRF9QQVJBTV0gPSBBVVRPX05FR19COworI2Vsc2UKK3N0YXRpYyBjaGFyICpBdXRvTmVnX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBEVVBfQ0FQX0IKK3N0YXRpYyBjaGFyICpEdXBDYXBfQltTS19NQVhfQ0FSRF9QQVJBTV0gPSBEVVBfQ0FQX0I7CisjZWxzZQorc3RhdGljIGNoYXIgKkR1cENhcF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgRkxPV19DVFJMX0IKK3N0YXRpYyBjaGFyICpGbG93Q3RybF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IEZMT1dfQ1RSTF9COworI2Vsc2UKK3N0YXRpYyBjaGFyICpGbG93Q3RybF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgUk9MRV9CCitzdGF0aWMgY2hhciAqUm9sZV9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IFJPTEVfQjsKKyNlbHNlCitzdGF0aWMgY2hhciAqUm9sZV9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgQ09OX1RZUEUKK3N0YXRpYyBjaGFyICpDb25UeXBlW1NLX01BWF9DQVJEX1BBUkFNXSA9IENPTl9UWVBFOworI2Vsc2UKK3N0YXRpYyBjaGFyICpDb25UeXBlW1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgUFJFRl9QT1JUCitzdGF0aWMgY2hhciAqUHJlZlBvcnRbU0tfTUFYX0NBUkRfUEFSQU1dID0gUFJFRl9QT1JUOworI2Vsc2UKK3N0YXRpYyBjaGFyICpQcmVmUG9ydFtTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworI2lmZGVmIFJMTVRfTU9ERQorc3RhdGljIGNoYXIgKlJsbXRNb2RlW1NLX01BWF9DQVJEX1BBUkFNXSA9IFJMTVRfTU9ERTsKKyNlbHNlCitzdGF0aWMgY2hhciAqUmxtdE1vZGVbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgICBJbnRzUGVyU2VjW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpNb2RlcmF0aW9uW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpNb2RlcmF0aW9uTWFza1tTS19NQVhfQ0FSRF9QQVJBTV07CitzdGF0aWMgY2hhciAqQXV0b1NpemluZ1tTS19NQVhfQ0FSRF9QQVJBTV07CitzdGF0aWMgY2hhciAqU3RhdHNbU0tfTUFYX0NBUkRfUEFSQU1dOworCittb2R1bGVfcGFyYW1fYXJyYXkoU3BlZWRfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFNwZWVkX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShBdXRvTmVnX0EsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShBdXRvTmVnX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShEdXBDYXBfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KER1cENhcF9CLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoRmxvd0N0cmxfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KEZsb3dDdHJsX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShSb2xlX0EsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShSb2xlX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShDb25UeXBlLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoUHJlZlBvcnQsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShSbG10TW9kZSwgY2hhcnAsIE5VTEwsIDApOworLyogdXNlZCBmb3IgaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KK21vZHVsZV9wYXJhbV9hcnJheShJbnRzUGVyU2VjLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KE1vZGVyYXRpb24sIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShTdGF0cywgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KE1vZGVyYXRpb25NYXNrLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoQXV0b1NpemluZywgY2hhcnAsIE5VTEwsIDApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUJvYXJkSW5pdCAtIGRvIGxldmVsIDAgYW5kIDEgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGJvYXJkIGhhcmR3YXJlIGZvciBydW5uaW5nLiBUaGUgZGVzcmlwdG9yCisgKglyaW5nIGlzIHNldCB1cCwgdGhlIElSUSBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzCisgKglhcmUgZXhhbWluZWQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2luaXQgU2tHZUJvYXJkSW5pdChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBTS19BQyAqcEFDKQoreworc2hvcnQJaTsKK3Vuc2lnbmVkIGxvbmcgRmxhZ3M7CitjaGFyCSpEZXNjclN0cmluZyA9ICJzazk4bGluOiBEcml2ZXIgZm9yIExpbnV4IjsgLyogdGhpcyBpcyBnaXZlbiB0byBQTk1JICovCitjaGFyCSpWZXJTdHIJPSBWRVJfU1RSSU5HOworaW50CVJldDsJCQkvKiByZXR1cm4gY29kZSBvZiByZXF1ZXN0X2lycSAqLworU0tfQk9PTAlEdWFsTmV0OworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIklvQmFzZTogJTA4bFhcbiIsICh1bnNpZ25lZCBsb25nKXBBQy0+SW9CYXNlKSk7CisJZm9yIChpPTA7IGk8U0tfTUFYX01BQ1M7IGkrKykgeworCQlwQUMtPlR4UG9ydFtpXVswXS5Id0FkZHIgPSBwQUMtPklvQmFzZSArIFR4UXVldWVBZGRyW2ldWzBdOworCQlwQUMtPlR4UG9ydFtpXVswXS5Qb3J0SW5kZXggPSBpOworCQlwQUMtPlJ4UG9ydFtpXS5Id0FkZHIgPSBwQUMtPklvQmFzZSArIFJ4UXVldWVBZGRyW2ldOworCQlwQUMtPlJ4UG9ydFtpXS5Qb3J0SW5kZXggPSBpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG11dGV4ZXMgKi8KKwlmb3IgKGk9MDsgaTxTS19NQVhfTUFDUzsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZwQUMtPlR4UG9ydFtpXVswXS5UeERlc1JpbmdMb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBBQy0+UnhQb3J0W2ldLlJ4RGVzUmluZ0xvY2spOworCX0KKwlzcGluX2xvY2tfaW5pdCgmcEFDLT5TbG93UGF0aExvY2spOworCisJLyogc2V0dXAgcGh5X2lkIGJsaW5rIHRpbWVyICovCisJcEFDLT5CbGlua1RpbWVyLmZ1bmN0aW9uID0gU2tHZUJsaW5rVGltZXI7CisJcEFDLT5CbGlua1RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCWluaXRfdGltZXIoJnBBQy0+QmxpbmtUaW1lcik7CisKKwkvKiBsZXZlbCAwIGluaXQgY29tbW9uIG1vZHVsZXMgaGVyZSAqLworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCS8qIERvZXMgYSBSRVNFVCBvbiBib2FyZCAuLi4qLworCWlmIChTa0dlSW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpICE9IDApIHsKKwkJcHJpbnRrKCJIV0luaXQgKDApIGZhaWxlZC5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCVNrSTJjSW5pdCggIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisJU2tFdmVudEluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa1BubWlJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCVNrQWRkckluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisJU2tSbG10SW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa1RpbWVySW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCisJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCXBBQy0+UnhCdWZTaXplICA9IEVUSF9CVUZfU0laRTsKKworCVNLX1BOTUlfU0VUX0RSSVZFUl9ERVNDUihwQUMsIERlc2NyU3RyaW5nKTsKKwlTS19QTk1JX1NFVF9EUklWRVJfVkVSKHBBQywgVmVyU3RyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwkvKiBsZXZlbCAxIGluaXQgY29tbW9uIG1vZHVsZXMgaGVyZSAoSFcgaW5pdCkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlpZiAoU2tHZUluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTykgIT0gMCkgeworCQlwcmludGsoInNrOThsaW46IEhXSW5pdCAoMSkgZmFpbGVkLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCXJldHVybigtRUFHQUlOKTsKKwl9CisJU2tJMmNJbml0KCAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tFdmVudEluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tQbm1pSW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tBZGRySW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tSbG10SW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tUaW1lckluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisKKwkvKiBTZXQgY2hpcHNldCB0eXBlIHN1cHBvcnQgKi8KKwlwQUMtPkNoaXBzZXRUeXBlID0gMDsKKwlpZiAoKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSB8fAorCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fTElURSkpIHsKKwkJcEFDLT5DaGlwc2V0VHlwZSA9IDE7CisJfQorCisJR2V0Q29uZmlndXJhdGlvbihwQUMpOworCWlmIChwQUMtPlJsbXROZXRzID09IDIpIHsKKwkJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfTVVMX0xJTks7CisJfQorCisJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9JTzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCisJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSB7CisJCSBSZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgU2tHZUlzciwgU0FfU0hJUlEsIHBBQy0+TmFtZSwgZGV2KTsKKwl9IGVsc2UgaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAxKSB7CisJCVJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBTa0dlSXNyT25lUG9ydCwgU0FfU0hJUlEsCisJCQlwQUMtPk5hbWUsIGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2s5OGxpbjogSWxsZWdhbCBudW1iZXIgb2YgcG9ydHM6ICVkXG4iLAorCQkgICAgICAgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaWYgKFJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzazk4bGluOiBSZXF1ZXN0ZWQgSVJRICVkIGlzIGJ1c3kuXG4iLAorCQkgICAgICAgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcEFDLT5BbGxvY0ZsYWcgfD0gU0tfQUxMT0NfSVJROworCisJLyogQWxsb2MgbWVtb3J5IGZvciB0aGlzIGJvYXJkIChNZW0gZm9yIFJ4RC9UeEQpIDogKi8KKwlpZighQm9hcmRBbGxvY01lbShwQUMpKSB7CisJCXByaW50aygiTm8gbWVtb3J5IGZvciBkZXNjcmlwdG9yIHJpbmdzLlxuIik7CisgICAgICAgCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCisJU2tDc1NldFJlY2VpdmVGbGFncyhwQUMsCisJCVNLQ1NfUFJPVE9fSVAgfCBTS0NTX1BST1RPX1RDUCB8IFNLQ1NfUFJPVE9fVURQLAorCQkmcEFDLT5Dc09mczEsICZwQUMtPkNzT2ZzMiwgMCk7CisJcEFDLT5Dc09mcyA9IChwQUMtPkNzT2ZzMiA8PCAxNikgfCBwQUMtPkNzT2ZzMTsKKworCUJvYXJkSW5pdE1lbShwQUMpOworCS8qIHRzY2hpbGxpbmc6IE5ldyBjb21tb24gZnVuY3Rpb24gd2l0aCBtaW5pbXVtIHNpemUgY2hlY2suICovCisJRHVhbE5ldCA9IFNLX0ZBTFNFOworCWlmIChwQUMtPlJsbXROZXRzID09IDIpIHsKKwkJRHVhbE5ldCA9IFNLX1RSVUU7CisJfQorCQorCWlmIChTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzKAorCQlwQUMsCisJCXBBQy0+QWN0aXZlUG9ydCwKKwkJRHVhbE5ldCkpIHsKKwkJQm9hcmRGcmVlTWVtKHBBQyk7CisJCXByaW50aygic2s5OGxpbjogU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuKC1FQUdBSU4pOworCX0KKworCXJldHVybiAoMCk7Cit9IC8qIFNrR2VCb2FyZEluaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJQm9hcmRBbGxvY01lbSAtIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHJpbmdzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBhbGwgZGVzY3JpcHRvciByaW5ncy4KKyAqCUVhY2ggcmluZyBpcyBhbGlnbmVkIGZvciB0aGUgZGVzcmlwdG9yIGFsaWdubWVudCBhbmQgbm8gcmluZworICoJaGFzIGEgNCBHQnl0ZSBib3VuZGFyeSBpbiBpdCAoYmVjYXVzZSB0aGUgdXBwZXIgMzIgYml0IG11c3QKKyAqCWJlIGNvbnN0YW50IGZvciBhbGwgZGVzY3JpcHRpb3JzIGluIG9uZSByaW5ncykuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1RSVUUsIGlmIGFsbCBtZW1vcnkgY291bGQgYmUgYWxsb2NhdGVkCisgKglTS19GQUxTRSwgaWYgbm90CisgKi8KK3N0YXRpYyBTS19CT09MIEJvYXJkQWxsb2NNZW0oCitTS19BQwkqcEFDKQoreworY2FkZHJfdAkJcERlc2NyTWVtOwkvKiBwb2ludGVyIHRvIGRlc2NyaXB0b3IgbWVtb3J5IGFyZWEgKi8KK3NpemVfdAkJQWxsb2NMZW5ndGg7CS8qIGxlbmd0aCBvZiBjb21wbGV0ZSBkZXNjcmlwdG9yIGFyZWEgKi8KK2ludAkJaTsJCS8qIGxvb3AgY291bnRlciAqLwordW5zaWduZWQgbG9uZwlCdXNBZGRyOworCisJCisJLyogcmluZ3MgcGx1cyBvbmUgZm9yIGFsaWdubWVudCAoZG8gbm90IGNyb3NzIDQgR0IgYm91bmRhcnkpICovCisJLyogUlhfUklOR19TSVpFIGlzIGFzc3VtZWQgYmlnZ2VyIHRoYW4gVFhfUklOR19TSVpFICovCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJQWxsb2NMZW5ndGggPSAoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIHBBQy0+R0luaS5HSU1hY3NGb3VuZCArIDg7CisjZWxzZQorCUFsbG9jTGVuZ3RoID0gKFJYX1JJTkdfU0laRSArIFRYX1JJTkdfU0laRSkgKiBwQUMtPkdJbmkuR0lNYWNzRm91bmQKKwkJKyBSWF9SSU5HX1NJWkUgKyA4OworI2VuZGlmCisKKwlwRGVzY3JNZW0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChwQUMtPlBjaURldiwgQWxsb2NMZW5ndGgsCisJCQkJCSAmcEFDLT5wRGVzY3JNZW1ETUEpOworCisJaWYgKHBEZXNjck1lbSA9PSBOVUxMKSB7CisJCXJldHVybiAoU0tfRkFMU0UpOworCX0KKwlwQUMtPnBEZXNjck1lbSA9IHBEZXNjck1lbTsKKwlCdXNBZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBBQy0+cERlc2NyTWVtRE1BOworCisJLyogRGVzY3JpcHRvcnMgbmVlZCA4IGJ5dGUgYWxpZ25tZW50LCBhbmQgdGhpcyBpcyBlbnN1cmVkCisJICogYnkgcGNpX2FsbG9jX2NvbnNpc3RlbnQuCisJICovCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkJKCJUWCVkL0E6IHBEZXNjck1lbTogJWxYLCAgIFBoeXNEZXNjck1lbTogJWxYXG4iLAorCQkJaSwgKHVuc2lnbmVkIGxvbmcpIHBEZXNjck1lbSwKKwkJCUJ1c0FkZHIpKTsKKwkJcEFDLT5UeFBvcnRbaV1bMF0ucFR4RGVzY3JSaW5nID0gcERlc2NyTWVtOworCQlwQUMtPlR4UG9ydFtpXVswXS5WVHhEZXNjclJpbmcgPSBCdXNBZGRyOworCQlwRGVzY3JNZW0gKz0gVFhfUklOR19TSVpFOworCQlCdXNBZGRyICs9IFRYX1JJTkdfU0laRTsKKwkKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkJKCJSWCVkOiBwRGVzY3JNZW06ICVsWCwgICBQaHlzRGVzY3JNZW06ICVsWFxuIiwKKwkJCWksICh1bnNpZ25lZCBsb25nKSBwRGVzY3JNZW0sCisJCQkodW5zaWduZWQgbG9uZylCdXNBZGRyKSk7CisJCXBBQy0+UnhQb3J0W2ldLnBSeERlc2NyUmluZyA9IHBEZXNjck1lbTsKKwkJcEFDLT5SeFBvcnRbaV0uVlJ4RGVzY3JSaW5nID0gQnVzQWRkcjsKKwkJcERlc2NyTWVtICs9IFJYX1JJTkdfU0laRTsKKwkJQnVzQWRkciArPSBSWF9SSU5HX1NJWkU7CisJfSAvKiBmb3IgKi8KKwkKKwlyZXR1cm4gKFNLX1RSVUUpOworfSAvKiBCb2FyZEFsbG9jTWVtICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglCb2FyZEZyZWVNZW0gLSByZXZlcnNlIG9mIEJvYXJkQWxsb2NNZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgaW4gQm9hcmRBbGxvY01lbTogYWRhcHRlciBjb250ZXh0LAorICoJZGVzY3JpcHRvciByaW5ncywgbG9ja3MuCisgKgorICogUmV0dXJuczoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIEJvYXJkRnJlZU1lbSgKK1NLX0FDCQkqcEFDKQoreworc2l6ZV90CQlBbGxvY0xlbmd0aDsJLyogbGVuZ3RoIG9mIGNvbXBsZXRlIGRlc2NyaXB0b3IgYXJlYSAqLworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIkJvYXJkRnJlZU1lbVxuIikpOworI2lmIChCSVRTX1BFUl9MT05HID09IDMyKQorCUFsbG9jTGVuZ3RoID0gKFJYX1JJTkdfU0laRSArIFRYX1JJTkdfU0laRSkgKiBwQUMtPkdJbmkuR0lNYWNzRm91bmQgKyA4OworI2Vsc2UKKwlBbGxvY0xlbmd0aCA9IChSWF9SSU5HX1NJWkUgKyBUWF9SSU5HX1NJWkUpICogcEFDLT5HSW5pLkdJTWFjc0ZvdW5kCisJCSsgUlhfUklOR19TSVpFICsgODsKKyNlbmRpZgorCisJcGNpX2ZyZWVfY29uc2lzdGVudChwQUMtPlBjaURldiwgQWxsb2NMZW5ndGgsCisJCQkgICAgcEFDLT5wRGVzY3JNZW0sIHBBQy0+cERlc2NyTWVtRE1BKTsKKwlwQUMtPnBEZXNjck1lbSA9IE5VTEw7Cit9IC8qIEJvYXJkRnJlZU1lbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlCb2FyZEluaXRNZW0gLSBpbml0aWF0ZSB0aGUgZGVzY3JpcHRvciByaW5ncworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBkZXNjcmlwdG9yIHJpbmdzIHVwIGluIG1lbW9yeS4KKyAqCVRoZSBhZGFwdGVyIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGRlc2NyaXB0b3Igc3RhcnQgYWRkcmVzc2VzLgorICoKKyAqIFJldHVybnM6CU4vQQorICovCitzdGF0aWMgdm9pZCBCb2FyZEluaXRNZW0oCitTS19BQwkqcEFDKQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworeworaW50CWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KK2ludAlSeERlc2NyU2l6ZTsJLyogdGhlIHNpemUgb2YgYSByeCBkZXNjcmlwdG9yIHJvdW5kZWQgdXAgdG8gYWxpZ25tZW50Ki8KK2ludAlUeERlc2NyU2l6ZTsJLyogdGhlIHNpemUgb2YgYSB0eCBkZXNjcmlwdG9yIHJvdW5kZWQgdXAgdG8gYWxpZ25tZW50Ki8KKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJCb2FyZEluaXRNZW1cbiIpKTsKKworCVJ4RGVzY3JTaXplID0gKCgoc2l6ZW9mKFJYRCkgLSAxKSAvIERFU0NSX0FMSUdOKSArIDEpICogREVTQ1JfQUxJR047CisJcEFDLT5SeERlc2NyUGVyUmluZyA9IFJYX1JJTkdfU0laRSAvIFJ4RGVzY3JTaXplOworCVR4RGVzY3JTaXplID0gKCgoc2l6ZW9mKFRYRCkgLSAxKSAvIERFU0NSX0FMSUdOKSArIDEpICogREVTQ1JfQUxJR047CisJcEFDLT5UeERlc2NyUGVyUmluZyA9IFRYX1JJTkdfU0laRSAvIFJ4RGVzY3JTaXplOworCQorCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCVNldHVwUmluZygKKwkJCXBBQywKKwkJCXBBQy0+VHhQb3J0W2ldWzBdLnBUeERlc2NyUmluZywKKwkJCXBBQy0+VHhQb3J0W2ldWzBdLlZUeERlc2NyUmluZywKKwkJCShSWEQqKikmcEFDLT5UeFBvcnRbaV1bMF0ucFR4ZFJpbmdIZWFkLAorCQkJKFJYRCoqKSZwQUMtPlR4UG9ydFtpXVswXS5wVHhkUmluZ1RhaWwsCisJCQkoUlhEKiopJnBBQy0+VHhQb3J0W2ldWzBdLnBUeGRSaW5nUHJldiwKKwkJCSZwQUMtPlR4UG9ydFtpXVswXS5UeGRSaW5nRnJlZSwKKwkJCVNLX1RSVUUpOworCQlTZXR1cFJpbmcoCisJCQlwQUMsCisJCQlwQUMtPlJ4UG9ydFtpXS5wUnhEZXNjclJpbmcsCisJCQlwQUMtPlJ4UG9ydFtpXS5WUnhEZXNjclJpbmcsCisJCQkmcEFDLT5SeFBvcnRbaV0ucFJ4ZFJpbmdIZWFkLAorCQkJJnBBQy0+UnhQb3J0W2ldLnBSeGRSaW5nVGFpbCwKKwkJCSZwQUMtPlJ4UG9ydFtpXS5wUnhkUmluZ1ByZXYsCisJCQkmcEFDLT5SeFBvcnRbaV0uUnhkUmluZ0ZyZWUsCisJCQlTS19GQUxTRSk7CisJfQorfSAvKiBCb2FyZEluaXRNZW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2V0dXBSaW5nIC0gY3JlYXRlIG9uZSBkZXNjcmlwdG9yIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY3JlYXRlcyBvbmUgZGVzY3JpcHRvciByaW5nIGluIHRoZSBnaXZlbiBtZW1vcnkgYXJlYS4KKyAqCVRoZSBoZWFkLCB0YWlsIGFuZCBudW1iZXIgb2YgZnJlZSBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyBhcmUgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIFNldHVwUmluZygKK1NLX0FDCQkqcEFDLAordm9pZAkJKnBNZW1BcmVhLAkvKiBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBhcmVhIGZvciB0aGUgcmluZyAqLwordWludHB0cl90CVZNZW1BcmVhLAkvKiB0aGUgdmlydHVhbCBidXMgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGFyZWEgKi8KK1JYRAkJKipwcFJpbmdIZWFkLAkvKiBhZGRyZXNzIHdoZXJlIHRoZSBoZWFkIHNob3VsZCBiZSB3cml0dGVuICovCitSWEQJCSoqcHBSaW5nVGFpbCwJLyogYWRkcmVzcyB3aGVyZSB0aGUgdGFpbCBzaG91bGQgYmUgd3JpdHRlbiAqLworUlhECQkqKnBwUmluZ1ByZXYsCS8qIGFkZHJlc3Mgd2hlcmUgdGhlIHRhaWwgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KK2ludAkJKnBSaW5nRnJlZSwJLyogYWRkcmVzcyB3aGVyZSB0aGUgIyBvZiBmcmVlIGRlc2NyLiBnb2VzICovCitTS19CT09MCQlJc1R4KQkJLyogZmxhZzogaXMgdGhpcyBhIHR4IHJpbmcgKi8KK3sKK2ludAlpOwkJLyogbG9vcCBjb3VudGVyICovCitpbnQJRGVzY3JTaXplOwkvKiB0aGUgc2l6ZSBvZiBhIGRlc2NyaXB0b3Igcm91bmRlZCB1cCB0byBhbGlnbm1lbnQqLworaW50CURlc2NyTnVtOwkvKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcGVyIHJpbmcgKi8KK1JYRAkqcERlc2NyOwkvKiBwb2ludGVyIHRvIGEgZGVzY3JpcHRvciAocmVjZWl2ZSBvciB0cmFuc21pdCkgKi8KK1JYRAkqcE5leHREZXNjcjsJLyogcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yICovCitSWEQJKnBQcmV2RGVzY3I7CS8qIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIGRlc2NyaXB0b3IgKi8KK3VpbnRwdHJfdCBWTmV4dERlc2NyOwkvKiB0aGUgdmlydHVhbCBidXMgYWRkcmVzcyBvZiB0aGUgbmV4dCBkZXNjcmlwdG9yICovCisKKwlpZiAoSXNUeCA9PSBTS19UUlVFKSB7CisJCURlc2NyU2l6ZSA9ICgoKHNpemVvZihUWEQpIC0gMSkgLyBERVNDUl9BTElHTikgKyAxKSAqCisJCQlERVNDUl9BTElHTjsKKwkJRGVzY3JOdW0gPSBUWF9SSU5HX1NJWkUgLyBEZXNjclNpemU7CisJfSBlbHNlIHsKKwkJRGVzY3JTaXplID0gKCgoc2l6ZW9mKFJYRCkgLSAxKSAvIERFU0NSX0FMSUdOKSArIDEpICoKKwkJCURFU0NSX0FMSUdOOworCQlEZXNjck51bSA9IFJYX1JJTkdfU0laRSAvIERlc2NyU2l6ZTsKKwl9CisJCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkoIkRlc2NyaXB0b3Igc2l6ZTogJWQgICBEZXNjcmlwdG9yIE51bWJlcjogJWRcbiIsCisJCURlc2NyU2l6ZSxEZXNjck51bSkpOworCQorCXBEZXNjciA9IChSWEQqKSBwTWVtQXJlYTsKKwlwUHJldkRlc2NyID0gTlVMTDsKKwlwTmV4dERlc2NyID0gKFJYRCopICgoKGNoYXIqKXBEZXNjcikgKyBEZXNjclNpemUpOworCVZOZXh0RGVzY3IgPSBWTWVtQXJlYSArIERlc2NyU2l6ZTsKKwlmb3IoaT0wOyBpPERlc2NyTnVtOyBpKyspIHsKKwkJLyogc2V0IHRoZSBwb2ludGVycyByaWdodCAqLworCQlwRGVzY3ItPlZOZXh0UnhkID0gVk5leHREZXNjciAmIDB4ZmZmZmZmZmZVTEw7CisJCXBEZXNjci0+cE5leHRSeGQgPSBwTmV4dERlc2NyOworCQlwRGVzY3ItPlRjcFN1bVN0YXJ0cyA9IHBBQy0+Q3NPZnM7CisKKwkJLyogYWR2YW5jZSBvbmUgc3RlcCAqLworCQlwUHJldkRlc2NyID0gcERlc2NyOworCQlwRGVzY3IgPSBwTmV4dERlc2NyOworCQlwTmV4dERlc2NyID0gKFJYRCopICgoKGNoYXIqKXBEZXNjcikgKyBEZXNjclNpemUpOworCQlWTmV4dERlc2NyICs9IERlc2NyU2l6ZTsKKwl9CisJcFByZXZEZXNjci0+cE5leHRSeGQgPSAoUlhEKikgcE1lbUFyZWE7CisJcFByZXZEZXNjci0+Vk5leHRSeGQgPSBWTWVtQXJlYTsKKwlwRGVzY3IgPSAoUlhEKikgcE1lbUFyZWE7CisJKnBwUmluZ0hlYWQgPSAoUlhEKikgcE1lbUFyZWE7CisJKnBwUmluZ1RhaWwgPSAqcHBSaW5nSGVhZDsKKwkqcHBSaW5nUHJldiA9IHBQcmV2RGVzY3I7CisJKnBSaW5nRnJlZSA9IERlc2NyTnVtOworfSAvKiBTZXR1cFJpbmcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJUG9ydFJlSW5pdEJtdSAtIHJlLWluaXRpYXRlIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGZvciBvbmUgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWluaXRpYWxpemVzIHRoZSBkZXNjcmlwdG9yIHJpbmdzIG9mIG9uZSBwb3J0CisgKglpbiBtZW1vcnkuIFRoZSBwb3J0IG11c3QgYmUgc3RvcHBlZCBiZWZvcmUuCisgKglUaGUgSFcgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciBzdGFydCBhZGRyZXNzZXMuCisgKgorICogUmV0dXJuczoKKyAqCW5vbmUKKyAqLworc3RhdGljIHZvaWQgUG9ydFJlSW5pdEJtdSgKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworaW50CVBvcnRJbmRleCkJLyogaW5kZXggb2YgdGhlIHBvcnQgZm9yIHdoaWNoIHRvIHJlLWluaXQgKi8KK3sKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiUG9ydFJlSW5pdEJtdSAiKSk7CisKKwkvKiBzZXQgYWRkcmVzcyBvZiBmaXJzdCBkZXNjcmlwdG9yIG9mIHJpbmcgaW4gQk1VICovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIFR4UXVldWVBZGRyW1BvcnRJbmRleF1bVFhfUFJJT19MT1ddKyBRX0RBX0wsCisJCSh1aW50MzJfdCkoKChjYWRkcl90KQorCQkocEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4ZFJpbmdIZWFkKSAtCisJCXBBQy0+VHhQb3J0W1BvcnRJbmRleF1bVFhfUFJJT19MT1ddLnBUeERlc2NyUmluZyArCisJCXBBQy0+VHhQb3J0W1BvcnRJbmRleF1bVFhfUFJJT19MT1ddLlZUeERlc2NyUmluZykgJgorCQkweEZGRkZGRkZGKSk7CisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIFR4UXVldWVBZGRyW1BvcnRJbmRleF1bVFhfUFJJT19MT1ddKyBRX0RBX0gsCisJCSh1aW50MzJfdCkoKChjYWRkcl90KQorCQkocEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4ZFJpbmdIZWFkKSAtCisJCXBBQy0+VHhQb3J0W1BvcnRJbmRleF1bVFhfUFJJT19MT1ddLnBUeERlc2NyUmluZyArCisJCXBBQy0+VHhQb3J0W1BvcnRJbmRleF1bVFhfUFJJT19MT1ddLlZUeERlc2NyUmluZykgPj4gMzIpKTsKKwlTS19PVVQzMihwQUMtPklvQmFzZSwgUnhRdWV1ZUFkZHJbUG9ydEluZGV4XStRX0RBX0wsCisJCSh1aW50MzJfdCkoKChjYWRkcl90KShwQUMtPlJ4UG9ydFtQb3J0SW5kZXhdLnBSeGRSaW5nSGVhZCkgLQorCQlwQUMtPlJ4UG9ydFtQb3J0SW5kZXhdLnBSeERlc2NyUmluZyArCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0uVlJ4RGVzY3JSaW5nKSAmIDB4RkZGRkZGRkYpKTsKKwlTS19PVVQzMihwQUMtPklvQmFzZSwgUnhRdWV1ZUFkZHJbUG9ydEluZGV4XStRX0RBX0gsCisJCSh1aW50MzJfdCkoKChjYWRkcl90KShwQUMtPlJ4UG9ydFtQb3J0SW5kZXhdLnBSeGRSaW5nSGVhZCkgLQorCQlwQUMtPlJ4UG9ydFtQb3J0SW5kZXhdLnBSeERlc2NyUmluZyArCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0uVlJ4RGVzY3JSaW5nKSA+PiAzMikpOworfSAvKiBQb3J0UmVJbml0Qm11ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSXNyIC0gaGFuZGxlIGFkYXB0ZXIgaW50ZXJydXB0cworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGludGVycnVwdCByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGFkYXB0ZXIKKyAqCWdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuIEl0IG1heSBhbHNvIGJlIGNhbGxlZCBpZiBhbm90aGVyIGRldmljZQorICoJc2hhcmVzIHRoaXMgaW50ZXJydXB0IHZlY3RvciB3aXRoIHRoZSBkcml2ZXIuCisgKgorICogUmV0dXJuczogTi9BCisgKgorICovCitzdGF0aWMgU2tJc3JSZXRWYXIgU2tHZUlzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CitzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2ID0gKHN0cnVjdCBTS19ORVRfREVWSUNFICopZGV2X2lkOworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKK1NLX1UzMgkJSW50U3JjOwkJLyogaW50ZXJydXB0cyBzb3VyY2UgcmVnaXN0ZXIgY29udGVudHMgKi8JCisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJCisJLyoKKwkgKiBDaGVjayBhbmQgcHJvY2VzcyBpZiBpdHMgb3VyIGludGVycnVwdAorCSAqLworCVNLX0lOMzIocEFDLT5Jb0Jhc2UsIEIwX1NQX0lTUkMsICZJbnRTcmMpOworCWlmIChJbnRTcmMgPT0gMCkgeworCQlyZXR1cm4gU2tJc3JSZXROb25lOworCX0KKworCXdoaWxlICgoKEludFNyYyAmIElSUV9NQVNLKSAmIH5TUEVDSUFMX0lSUVMpICE9IDApIHsKKyNpZiAwIC8qIHNvZnR3YXJlIGlycSBjdXJyZW50bHkgbm90IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX0lSUV9TVykgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIlNvZnR3YXJlIElSUVxuIikpOworCQl9CisjZW5kaWYKKwkJaWYgKEludFNyYyAmIElTX1IxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgUlgxIElSUVxuIikpOworCQkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFswXSwgU0tfVFJVRSk7CisJCQlTS19QTk1JX0NOVF9SWF9JTlRSKHBBQywgMCk7CisJCX0KKwkJaWYgKEludFNyYyAmIElTX1IyX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgUlgyIElSUVxuIikpOworCQkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFsxXSwgU0tfVFJVRSk7CisJCQlTS19QTk1JX0NOVF9SWF9JTlRSKHBBQywgMSk7CisJCX0KKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUgLyogb25seSBpZiB0eCBjb21wbGV0ZSBpbnRlcnJ1cHQgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWEExX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgQVMgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDApOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsICZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10pOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJfQorCQlpZiAoSW50U3JjICYgSVNfWEEyX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgQVMgVFgyIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDEpOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFsxXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsICZwQUMtPlR4UG9ydFsxXVtUWF9QUklPX0xPV10pOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJfQorI2lmIDAgLyogb25seSBpZiBzeW5jLiBxdWV1ZXMgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWFMxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgU1kgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDEpOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0hJR0hdLlR4RGVzUmluZ0xvY2spOworCQkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCAwLCBUWF9QUklPX0hJR0gpOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlDbGVhclR4SXJxKHBBQywgMCwgVFhfUFJJT19ISUdIKTsKKwkJfQorCQlpZiAoSW50U3JjICYgSVNfWFMyX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgU1kgVFgyIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDEpOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFsxXVtUWF9QUklPX0hJR0hdLlR4RGVzUmluZ0xvY2spOworCQkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCAxLCBUWF9QUklPX0hJR0gpOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlDbGVhclR4SXJxKHBBQywgMSwgVFhfUFJJT19ISUdIKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQkvKiBkbyBhbGwgSU8gYXQgb25jZSAqLworCQlpZiAoSW50U3JjICYgSVNfUjFfRikKKwkJCUNsZWFyQW5kU3RhcnRSeChwQUMsIDApOworCQlpZiAoSW50U3JjICYgSVNfUjJfRikKKwkJCUNsZWFyQW5kU3RhcnRSeChwQUMsIDEpOworI2lmZGVmIFVTRV9UWF9DT01QTEVURSAvKiBvbmx5IGlmIHR4IGNvbXBsZXRlIGludGVycnVwdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YQTFfRikKKwkJCUNsZWFyVHhJcnEocEFDLCAwLCBUWF9QUklPX0xPVyk7CisJCWlmIChJbnRTcmMgJiBJU19YQTJfRikKKwkJCUNsZWFyVHhJcnEocEFDLCAxLCBUWF9QUklPX0xPVyk7CisjZW5kaWYKKwkJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfSVNSQywgJkludFNyYyk7CisJfSAvKiB3aGlsZSAoSW50U3JjICYgSVJRX01BU0sgIT0gMCkgKi8KKworCUludFNyYyAmPSBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrOworCWlmICgoSW50U3JjICYgU1BFQ0lBTF9JUlFTKSB8fCBwQUMtPkNoZWNrUXVldWUpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkoIlNQRUNJQUwgSVJRIERQLUNhcmRzID0+ICV4XG4iLCBJbnRTcmMpKTsKKwkJcEFDLT5DaGVja1F1ZXVlID0gU0tfRkFMU0U7CisJCXNwaW5fbG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCQlpZiAoSW50U3JjICYgU1BFQ0lBTF9JUlFTKQorCQkJU2tHZVNpcnFJc3IocEFDLCBwQUMtPklvQmFzZSwgSW50U3JjKTsKKworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2soJnBBQy0+U2xvd1BhdGhMb2NrKTsKKwl9CisJLyoKKwkgKiBkbyBpdCBhbGwgYWdhaW4gaXMgY2FzZSB3ZSBjbGVhcmVkIGFuIGludGVycnVwdCB0aGF0CisJICogY2FtZSBpbiBhZnRlciBoYW5kbGluZyB0aGUgcmluZyAoT1VUcyBtYXkgYmUgZGVsYXllZAorCSAqIGluIGhhcmR3YXJlIGJ1ZmZlcnMsIGJ1dCBhcmUgdGhyb3VnaCBhZnRlciBJTikKKwkgKgorCSAqIHJyb2VzbGVyOiBoYXMgYmVlbiBjb21tZW50ZWQgb3V0IGFuZCBzaGlmdGVkIHRvCisJICogICAgICAgICAgIFNrR2VEcnZFdmVudCgpLCBiZWNhdXNlIGl0IGlzIHRpbWVyCisJICogICAgICAgICAgIGd1YXJkZWQgbm93CisJICoKKwlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzBdLCBTS19UUlVFKTsKKwlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzFdLCBTS19UUlVFKTsKKwkgKi8KKworCWlmIChwQUMtPkNoZWNrUXVldWUpIHsKKwkJcEFDLT5DaGVja1F1ZXVlID0gU0tfRkFMU0U7CisJCXNwaW5fbG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2soJnBBQy0+U2xvd1BhdGhMb2NrKTsKKwl9CisKKwkvKiBJUlEgaXMgcHJvY2Vzc2VkIC0gRW5hYmxlIElSUXMgYWdhaW4qLworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrKTsKKworCQlyZXR1cm4gU2tJc3JSZXRIYW5kbGVkOworfSAvKiBTa0dlSXNyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSXNyT25lUG9ydCAtIGhhbmRsZSBhZGFwdGVyIGludGVycnVwdHMgZm9yIHNpbmdsZSBwb3J0IGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgbmV0d29yayBhZGFwdGVyCisgKglnZW5lcmF0ZXMgYW4gaW50ZXJydXB0LiBJdCBtYXkgYWxzbyBiZSBjYWxsZWQgaWYgYW5vdGhlciBkZXZpY2UKKyAqCXNoYXJlcyB0aGlzIGludGVycnVwdCB2ZWN0b3Igd2l0aCB0aGUgZHJpdmVyLgorICoJVGhpcyBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgYnV0IGhhbmRsZXMgb25seSBvbmUgcG9ydC4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCisgKi8KK3N0YXRpYyBTa0lzclJldFZhciBTa0dlSXNyT25lUG9ydChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CitzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2ID0gKHN0cnVjdCBTS19ORVRfREVWSUNFICopZGV2X2lkOworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKK1NLX1UzMgkJSW50U3JjOwkJLyogaW50ZXJydXB0cyBzb3VyY2UgcmVnaXN0ZXIgY29udGVudHMgKi8JCisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJCisJLyoKKwkgKiBDaGVjayBhbmQgcHJvY2VzcyBpZiBpdHMgb3VyIGludGVycnVwdAorCSAqLworCVNLX0lOMzIocEFDLT5Jb0Jhc2UsIEIwX1NQX0lTUkMsICZJbnRTcmMpOworCWlmIChJbnRTcmMgPT0gMCkgeworCQlyZXR1cm4gU2tJc3JSZXROb25lOworCX0KKwkKKwl3aGlsZSAoKChJbnRTcmMgJiBJUlFfTUFTSykgJiB+U1BFQ0lBTF9JUlFTKSAhPSAwKSB7CisjaWYgMCAvKiBzb2Z0d2FyZSBpcnEgY3VycmVudGx5IG5vdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19JUlFfU1cpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJTb2Z0d2FyZSBJUlFcbiIpKTsKKwkJfQorI2VuZGlmCisJCWlmIChJbnRTcmMgJiBJU19SMV9GKSB7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJCSgiRU9GIFJYMSBJUlFcbiIpKTsKKwkJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX1RSVUUpOworCQkJU0tfUE5NSV9DTlRfUlhfSU5UUihwQUMsIDApOworCQl9CisjaWZkZWYgVVNFX1RYX0NPTVBMRVRFIC8qIG9ubHkgaWYgdHggY29tcGxldGUgaW50ZXJydXB0IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX1hBMV9GKSB7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJCSgiRU9GIEFTIFRYMSBJUlFcbiIpKTsKKwkJCVNLX1BOTUlfQ05UX1RYX0lOVFIocEFDLCAwKTsKKwkJCXNwaW5fbG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCAmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19MT1ddKTsKKwkJCXNwaW5fdW5sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCX0KKyNpZiAwIC8qIG9ubHkgaWYgc3luYy4gcXVldWVzIHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX1hTMV9GKSB7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJCSgiRU9GIFNZIFRYMSBJUlFcbiIpKTsKKwkJCVNLX1BOTUlfQ05UX1RYX0lOVFIocEFDLCAwKTsKKwkJCXNwaW5fbG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19ISUdIXS5UeERlc1JpbmdMb2NrKTsKKwkJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgMCwgVFhfUFJJT19ISUdIKTsKKwkJCXNwaW5fdW5sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0hJR0hdLlR4RGVzUmluZ0xvY2spOworCQkJQ2xlYXJUeElycShwQUMsIDAsIFRYX1BSSU9fSElHSCk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJLyogZG8gYWxsIElPIGF0IG9uY2UgKi8KKwkJaWYgKEludFNyYyAmIElTX1IxX0YpCisJCQlDbGVhckFuZFN0YXJ0UngocEFDLCAwKTsKKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUgLyogb25seSBpZiB0eCBjb21wbGV0ZSBpbnRlcnJ1cHQgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWEExX0YpCisJCQlDbGVhclR4SXJxKHBBQywgMCwgVFhfUFJJT19MT1cpOworI2VuZGlmCisJCVNLX0lOMzIocEFDLT5Jb0Jhc2UsIEIwX0lTUkMsICZJbnRTcmMpOworCX0gLyogd2hpbGUgKEludFNyYyAmIElSUV9NQVNLICE9IDApICovCisJCisJSW50U3JjICY9IHBBQy0+R0luaS5HSVZhbElycU1hc2s7CisJaWYgKChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpIHx8IHBBQy0+Q2hlY2tRdWV1ZSkgeworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCSgiU1BFQ0lBTCBJUlEgU1AtQ2FyZHMgPT4gJXhcbiIsIEludFNyYykpOworCQlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJCWlmIChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpCisJCQlTa0dlU2lycUlzcihwQUMsIHBBQy0+SW9CYXNlLCBJbnRTcmMpOworCisJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCQlzcGluX3VubG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCX0KKwkvKgorCSAqIGRvIGl0IGFsbCBhZ2FpbiBpcyBjYXNlIHdlIGNsZWFyZWQgYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBjYW1lIGluIGFmdGVyIGhhbmRsaW5nIHRoZSByaW5nIChPVVRzIG1heSBiZSBkZWxheWVkCisJICogaW4gaGFyZHdhcmUgYnVmZmVycywgYnV0IGFyZSB0aHJvdWdoIGFmdGVyIElOKQorCSAqCisJICogcnJvZXNsZXI6IGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgYW5kIHNoaWZ0ZWQgdG8KKwkgKiAgICAgICAgICAgU2tHZURydkV2ZW50KCksIGJlY2F1c2UgaXQgaXMgdGltZXIKKwkgKiAgICAgICAgICAgZ3VhcmRlZCBub3cKKwkgKgorCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX1RSVUUpOworCSAqLworCisJLyogSVJRIGlzIHByb2Nlc3NlZCAtIEVuYWJsZSBJUlFzIGFnYWluKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgcEFDLT5HSW5pLkdJVmFsSXJxTWFzayk7CisKKwkJcmV0dXJuIFNrSXNyUmV0SGFuZGxlZDsKK30gLyogU2tHZUlzck9uZVBvcnQgKi8KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlUG9sbENvbnRyb2xsZXIgLSBwb2xsaW5nIHJlY2VpdmUsIGZvciBuZXRjb25zb2xlCisgKgorICogRGVzY3JpcHRpb246CisgKglQb2xsaW5nIHJlY2VpdmUgLSB1c2VkIGJ5IG5ldGNvbnNvbGUgYW5kIG90aGVyIGRpYWdub3N0aWMgdG9vbHMKKyAqCXRvIGFsbG93IG5ldHdvcmsgaS9vIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tHZVBvbGxDb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCVNrR2VJc3IoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlT3BlbiAtIGhhbmRsZSBzdGFydCBvZiBpbml0aWFsaXplZCBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgaW5pdGlhbGl6ZWQgYWRhcHRlci4KKyAqCVRoZSBib2FyZCBsZXZlbCB2YXJpYWJsZSBpcyBzZXQgYW5kIHRoZSBhZGFwdGVyIGlzCisgKglicm91Z2h0IHRvIGZ1bGwgZnVuY3Rpb25hbGl0eS4KKyAqCVRoZSBkZXZpY2UgZmxhZ3MgYXJlIHNldCBmb3Igb3BlcmF0aW9uLgorICoJRG8gYWxsIG5lY2Vzc2FyeSBsZXZlbCAyIGluaXRpYWxpemF0aW9uLCBlbmFibGUgaW50ZXJydXB0cyBhbmQKKyAqCWdpdmUgc3RhcnQgY29tbWFuZCB0byBSTE1ULgorICoKKyAqIFJldHVybnM6CisgKgkwIG9uIHN1Y2Nlc3MKKyAqCSE9IDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlT3BlbigKK3N0cnVjdCBTS19ORVRfREVWSUNFCSpkZXYpCit7CisJREVWX05FVAkJCSpwTmV0OworCVNLX0FDCQkJKnBBQzsKKwl1bnNpZ25lZCBsb25nCUZsYWdzOwkJLyogZm9yIHNwaW4gbG9jayAqLworCWludAkJCQlpOworCVNLX0VWUEFSQQkJRXZQYXJhOwkJLyogYW4gZXZlbnQgcGFyYW1ldGVyIHVuaW9uICovCisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VPcGVuOiBwQUM9MHglbFg6XG4iLCAodW5zaWduZWQgbG9uZylwQUMpKTsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCWlmIChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfQUNUSVZFKSB7CisJCWlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfUlVOTklORykgeworCQkJcmV0dXJuICgtMSk7ICAgLyogc3RpbGwgaW4gdXNlIGJ5IGRpYWc7IGRlbnkgYWN0aW9ucyAqLworCQl9IAorCX0KKyNlbmRpZgorCisJLyogU2V0IGJsaW5rIG1vZGUgKi8KKwlpZiAoKHBBQy0+UGNpRGV2LT52ZW5kb3IgPT0gMHgxMTg2KSB8fCAocEFDLT5QY2lEZXYtPnZlbmRvciA9PSAweDExYWIgKSkKKwkJcEFDLT5HSW5pLkdJTGVkQmxpbmtDdHJsID0gT0VNX0NPTkZJR19WQUxVRTsKKworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9EQVRBKSB7CisJCS8qIGxldmVsIDEgaW5pdCBjb21tb24gbW9kdWxlcyBoZXJlICovCisJCWlmIChTa0dlSW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKSAhPSAwKSB7CisJCQlwcmludGsoIiVzOiBIV0luaXQgKDEpIGZhaWxlZC5cbiIsIHBBQy0+ZGV2W3BOZXQtPlBvcnROcl0tPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJU2tJMmNJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJU2tFdmVudEluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa1BubWlJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJU2tBZGRySW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCVNrUmxtdEluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa1RpbWVySW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCXBBQy0+Qm9hcmRMZXZlbCA9IFNLX0lOSVRfSU87CisJfQorCisJaWYgKHBBQy0+Qm9hcmRMZXZlbCAhPSBTS19JTklUX1JVTikgeworCQkvKiB0c2NoaWxsaW5nOiBMZXZlbCAyIGluaXQgbW9kdWxlcyBoZXJlLCBjaGVjayByZXR1cm4gdmFsdWUuICovCisJCWlmIChTa0dlSW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTikgIT0gMCkgeworCQkJcHJpbnRrKCIlczogSFdJbml0ICgyKSBmYWlsZWQuXG4iLCBwQUMtPmRldltwTmV0LT5Qb3J0TnJdLT5uYW1lKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCVNrSTJjSW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlTa0V2ZW50SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlTa1BubWlJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrQWRkckluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwkJU2tSbG10SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlTa1RpbWVySW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX1JVTjsKKwl9CisKKwlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkvKiBFbmFibGUgdHJhbnNtaXQgZGVzY3JpcHRvciBwb2xsaW5nLiAqLworCQlTa0dlUG9sbFR4RChwQUMsIHBBQy0+SW9CYXNlLCBpLCBTS19UUlVFKTsKKwkJRmlsbFJ4UmluZyhwQUMsICZwQUMtPlJ4UG9ydFtpXSk7CisJfQorCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMSk7CisKKwlTdGFydERydkNsZWFudXBUaW1lcihwQUMpOworCVNrRGltRW5hYmxlTW9kZXJhdGlvbklmTmVlZGVkKHBBQyk7CQorCVNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhwQUMpOworCisJcEFDLT5HSW5pLkdJVmFsSXJxTWFzayAmPSBJUlFfTUFTSzsKKworCS8qIGVuYWJsZSBJbnRlcnJ1cHRzICovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIHBBQy0+R0luaS5HSVZhbElycU1hc2spOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9IV0VfSU1TSywgSVJRX0hXRV9NQVNLKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCisJaWYgKChwQUMtPlJsbXRNb2RlICE9IDApICYmIChwQUMtPk1heFBvcnRzID09IDApKSB7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXROZXRzOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TRVRfTkVUUywKKwkJCUV2UGFyYSk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXRNb2RlOworCQlFdlBhcmEuUGFyYTMyWzFdID0gMDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX01PREVfQ0hBTkdFLAorCQkJRXZQYXJhKTsKKwl9CisKKwlFdlBhcmEuUGFyYTMyWzBdID0gcE5ldC0+TmV0TnI7CisJRXZQYXJhLlBhcmEzMlsxXSA9IC0xOworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCisJcEFDLT5NYXhQb3J0cysrOworCXBOZXQtPlVwID0gMTsKKworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VPcGVuIHN1Y2VlZGVkXG4iKSk7CisKKwlyZXR1cm4gKDApOworfSAvKiBTa0dlT3BlbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUNsb3NlIC0gU3RvcCBpbml0aWFsaXplZCBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglDbG9zZSBpbml0aWFsaXplZCBhZGFwdGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gb24gc3VjY2VzcworICoJZXJyb3IgY29kZSAtIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tHZUNsb3NlKAorc3RydWN0IFNLX05FVF9ERVZJQ0UJKmRldikKK3sKKwlERVZfTkVUCQkqcE5ldDsKKwlERVZfTkVUCQkqbmV3UHRyTmV0OworCVNLX0FDCQkqcEFDOworCisJdW5zaWduZWQgbG9uZwlGbGFnczsJCS8qIGZvciBzcGluIGxvY2sgKi8KKwlpbnQJCWk7CisJaW50CQlQb3J0SWR4OworCVNLX0VWUEFSQQlFdlBhcmE7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZUNsb3NlOiBwQUM9MHglbFggIiwgKHVuc2lnbmVkIGxvbmcpcEFDKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwlpZiAocEFDLT5EaWFnTW9kZUFjdGl2ZSA9PSBESUFHX0FDVElWRSkgeworCQlpZiAocEFDLT5EaWFnRmxvd0N0cmwgPT0gU0tfRkFMU0UpIHsKKwkJCS8qIAorCQkJKiogbm90aWZ5IHRoYXQgdGhlIGludGVyZmFjZSB3aGljaCBoYXMgYmVlbiBjbG9zZWQKKwkJCSoqIGJ5IG9wZXJhdG9yIGludGVyYWN0aW9uIG11c3Qgbm90IGJlIHN0YXJ0ZWQgdXAgCisJCQkqKiBhZ2FpbiB3aGVuIHRoZSBESUFHIGhhcyBmaW5pc2hlZC4gCisJCQkqLworCQkJbmV3UHRyTmV0ID0gbmV0ZGV2X3ByaXYocEFDLT5kZXZbMF0pOworCQkJaWYgKG5ld1B0ck5ldCA9PSBwTmV0KSB7CisJCQkJcEFDLT5XYXNJZlVwWzBdID0gU0tfRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCXBBQy0+V2FzSWZVcFsxXSA9IFNLX0ZBTFNFOworCQkJfQorCQkJcmV0dXJuIDA7IC8qIHJldHVybiB0byBzeXN0ZW0gZXZlcnl0aGluZyBpcyBmaW5lLi4uICovCisJCX0gZWxzZSB7CisJCQlwQUMtPkRpYWdGbG93Q3RybCA9IFNLX0ZBTFNFOworCQl9CisJfQorI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAocEFDLT5SbG10TmV0cyA9PSAxKQorCQlQb3J0SWR4ID0gcEFDLT5BY3RpdmVQb3J0OworCWVsc2UKKwkJUG9ydElkeCA9IHBOZXQtPk5ldE5yOworCisgICAgICAgIFN0b3BEcnZDbGVhbnVwVGltZXIocEFDKTsKKworCS8qCisJICogQ2xlYXIgbXVsdGljYXN0IHRhYmxlLCBwcm9taXNjdW91cyBtb2RlIC4uLi4KKwkgKi8KKwlTa0FkZHJNY0NsZWFyKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsIDApOworCVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCVNLX1BST01fTU9ERV9OT05FKTsKKworCWlmIChwQUMtPk1heFBvcnRzID09IDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgMCk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSBwTmV0LT5OZXROcjsKKwkJRXZQYXJhLlBhcmEzMlsxXSA9IC0xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RPUCwgRXZQYXJhKTsKKwkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJLyogc3RvcCB0aGUgaGFyZHdhcmUgKi8KKwkJU2tHZURlSW5pdChwQUMsIHBBQy0+SW9CYXNlKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCX0gZWxzZSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSBwTmV0LT5OZXROcjsKKwkJRXZQYXJhLlBhcmEzMlsxXSA9IC0xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RPUCwgRXZQYXJhKTsKKwkJU2tQbm1pRXZlbnQocEFDLCBwQUMtPklvQmFzZSwgU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCwgRXZQYXJhKTsKKwkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCQorCQkvKiBTdG9wIHBvcnQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+VHhQb3J0W3BOZXQtPlBvcnROcl0KKwkJCVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywgRmxhZ3MpOworCQlTa0dlU3RvcFBvcnQocEFDLCBwQUMtPklvQmFzZSwgcE5ldC0+UG9ydE5yLAorCQkJU0tfU1RPUF9BTEwsIFNLX0hBUkRfUlNUKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXQorCQkJW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJfQorCisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMSkgeworCQkvKiBjbGVhciBhbGwgZGVzY3JpcHRvciByaW5ncyAqLworCQlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFtpXSwgU0tfVFJVRSk7CisJCQlDbGVhclJ4UmluZyhwQUMsICZwQUMtPlJ4UG9ydFtpXSk7CisJCQlDbGVhclR4UmluZyhwQUMsICZwQUMtPlR4UG9ydFtpXVtUWF9QUklPX0xPV10pOworCQl9CisJfSBlbHNlIHsKKwkJLyogY2xlYXIgcG9ydCBkZXNjcmlwdG9yIHJpbmdzICovCisJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbcE5ldC0+UG9ydE5yXSwgU0tfVFJVRSk7CisJCUNsZWFyUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W3BOZXQtPlBvcnROcl0pOworCQlDbGVhclR4UmluZyhwQUMsICZwQUMtPlR4UG9ydFtwTmV0LT5Qb3J0TnJdW1RYX1BSSU9fTE9XXSk7CisJfQorCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VDbG9zZTogZG9uZSAiKSk7CisKKwlTS19NRU1TRVQoJihwQUMtPlBubWlCYWNrdXApLCAwLCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCVNLX01FTUNQWSgmKHBBQy0+UG5taUJhY2t1cCksICYocEFDLT5Qbm1pU3RydWN0KSwgCisJCQlzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCisJcEFDLT5NYXhQb3J0cy0tOworCXBOZXQtPlVwID0gMDsKKworCXJldHVybiAoMCk7Cit9IC8qIFNrR2VDbG9zZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlWG1pdCAtIExpbnV4IGZyYW1lIHRyYW5zbWl0IGZ1bmN0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgc3lzdGVtIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCBmcmFtZXMgb250byB0aGUgd2lyZS4KKyAqCUl0IHB1dHMgdGhlIGZyYW1lIGluIHRoZSB0eCBkZXNjcmlwdG9yIHJpbmcuIElmIHRoZSByaW5nIGlzCisgKglmdWxsIHRoZW4sIHRoZSAndGJ1c3knIGZsYWcgaXMgc2V0LgorICoKKyAqIFJldHVybnM6CisgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCisgKgkhPTAsIG9uIGVycm9yCisgKiBXQVJOSU5HOiByZXR1cm5pbmcgMSBpbiAndGJ1c3knIGNhc2UgY2F1c2VkIHN5c3RlbSBjcmFzaGVzIChkb3VibGUKKyAqCWFsbG9jYXRlZCBza2IncykgISEhCisgKi8KK3N0YXRpYyBpbnQgU2tHZVhtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldikKK3sKK0RFVl9ORVQJCSpwTmV0OworU0tfQUMJCSpwQUM7CitpbnQJCQlSYzsJLyogcmV0dXJuIGNvZGUgb2YgWG1pdEZyYW1lICovCisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisKKwlpZiAoKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB8fAorCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfR0VORVNJUykpIHsKKwkJLyogRG9uJ3QgYWN0aXZhdGUgc2NhdHRlci1nYXRoZXIgYW5kIGhhcmR3YXJlIGNoZWNrc3VtICovCisKKwkJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMikKKwkJCVJjID0gWG1pdEZyYW1lKAorCQkJCXBBQywKKwkJCQkmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXVtUWF9QUklPX0xPV10sCisJCQkJc2tiKTsKKwkJZWxzZQorCQkJUmMgPSBYbWl0RnJhbWUoCisJCQkJcEFDLAorCQkJCSZwQUMtPlR4UG9ydFtwQUMtPkFjdGl2ZVBvcnRdW1RYX1BSSU9fTE9XXSwKKwkJCQlza2IpOworCX0gZWxzZSB7CisJCS8qIHNjYXR0ZXItZ2F0aGVyIGFuZCBoYXJkd2FyZSBUQ1AgY2hlY2tzdW1taW5nIGFuYWJsZWQqLworCQlpZiAocEFDLT5SbG10TmV0cyA9PSAyKQorCQkJUmMgPSBYbWl0RnJhbWVTRygKKwkJCQlwQUMsCisJCQkJJnBBQy0+VHhQb3J0W3BOZXQtPlBvcnROcl1bVFhfUFJJT19MT1ddLAorCQkJCXNrYik7CisJCWVsc2UKKwkJCVJjID0gWG1pdEZyYW1lU0coCisJCQkJcEFDLAorCQkJCSZwQUMtPlR4UG9ydFtwQUMtPkFjdGl2ZVBvcnRdW1RYX1BSSU9fTE9XXSwKKwkJCQlza2IpOworCX0KKworCS8qIFRyYW5zbWl0dGVyIG91dCBvZiByZXNvdXJjZXM/ICovCisJaWYgKFJjIDw9IDApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCS8qIElmIG5vdCB0YWtlbiwgZ2l2ZSBidWZmZXIgb3duZXJzaGlwIGJhY2sgdG8gdGhlCisJICogcXVldWVpbmcgbGF5ZXIuCisJICovCisJaWYgKFJjIDwgMCkKKwkJcmV0dXJuICgxKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAoMCk7Cit9IC8qIFNrR2VYbWl0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVhtaXRGcmFtZSAtIGZpbGwgb25lIHNvY2tldCBidWZmZXIgaW50byB0aGUgdHJhbnNtaXQgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwdXRzIGEgbWVzc2FnZSBpbnRvIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcKKyAqCWlmIHRoZXJlIGlzIGEgZGVzY3JpcHRvcnMgbGVmdC4KKyAqCUxpbnV4IHNrYidzIGNvbnNpc3Qgb2Ygb25seSBvbmUgY29udGludW91cyBidWZmZXIuCisgKglUaGUgZmlyc3Qgc3RlcCBsb2NrcyB0aGUgcmluZy4gSXQgaXMgaGVsZCBsb2NrZWQKKyAqCWFsbCB0aW1lIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggU1dJVENIXy4uL1BPUlRfUkVTRVQuCisgKglUaGVuIHRoZSBkZXNjcmlwdG9yaXMgYWxsb2NhdGVkLgorICoJVGhlIHNlY29uZCBwYXJ0IGlzIGxpbmtpbmcgdGhlIGJ1ZmZlciB0byB0aGUgZGVzY3JpcHRvci4KKyAqCUF0IHRoZSB2ZXJ5IGxhc3QsIHRoZSBDb250cm9sIGZpZWxkIG9mIHRoZSBkZXNjcmlwdG9yCisgKglpcyBtYWRlIHZhbGlkIGZvciB0aGUgQk1VIGFuZCBhIHN0YXJ0IFRYIGNvbW1hbmQgaXMgZ2l2ZW4KKyAqCWlmIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOgorICoJPiAwIC0gb24gc3VjY2VzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZXNzYWdlCisgKgk9IDAgLSBvbiByZXNvdXJjZSBzaG9ydGFnZTogdGhpcyBmcmFtZSBzZW50IG9yIGRyb3BwZWQsIG5vdworICoJCXRoZSByaW5nIGlzIGZ1bGwgKCAtPiBzZXQgdGJ1c3kpCisgKgk8IDAgLSBvbiBmYWlsdXJlOiBvdGhlciBwcm9ibGVtcyAoIC0+IHJldHVybiBmYWlsdXJlIHRvIHVwcGVyIGxheWVycykKKyAqLworc3RhdGljIGludCBYbWl0RnJhbWUoCitTS19BQyAJCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgICAgICAgICAgKi8KK1RYX1BPUlQJCSpwVHhQb3J0LAkvKiBwb2ludGVyIHRvIHN0cnVjdCBvZiBwb3J0IHRvIHNlbmQgdG8gKi8KK3N0cnVjdCBza19idWZmCSpwTWVzc2FnZSkJLyogcG9pbnRlciB0byBzZW5kLW1lc3NhZ2UgICAgICAgICAgICAgICovCit7CisJVFhECQkqcFR4ZDsJCS8qIHRoZSByeGQgdG8gZmlsbCAqLworCVRYRAkJKnBPbGRUeGQ7CisJdW5zaWduZWQgbG9uZwkgRmxhZ3M7CisJU0tfVTY0CQkgUGh5c0FkZHI7CisJaW50CSAJIFByb3RvY29sOworCWludAkJIElwSGVhZGVyTGVuZ3RoOworCWludAkJIEJ5dGVzU2VuZCA9IHBNZXNzYWdlLT5sZW47CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsICgiWCIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisjaWZuZGVmIFVTRV9UWF9DT01QTEVURQorCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgcFR4UG9ydCk7CisjZW5kaWYKKwlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgPT0gMCkgeworCQkvKiAKKwkJKiogbm8gZW5vdWdoIGZyZWUgZGVzY3JpcHRvcnMgaW4gcmluZyBhdCB0aGUgbW9tZW50LgorCQkqKiBNYXliZSBmcmVlJ2luZyBzb21lIG9sZCBvbmUgaGVscD8KKwkJKi8KKwkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKwkJaWYgKHBUeFBvcnQtPlR4ZFJpbmdGcmVlID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwkJCVNLX1BOTUlfQ05UX05PX1RYX0JVRihwQUMsIHBUeFBvcnQtPlBvcnRJbmRleCk7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUywKKwkJCQkoIlhtaXRGcmFtZSBmYWlsZWRcbiIpKTsKKwkJCS8qIAorCQkJKiogdGhlIGRlc2lyZWQgbWVzc2FnZSBjYW4gbm90IGJlIHNlbnQKKwkJCSoqIEJlY2F1c2UgdGJ1c3kgc2VlbXMgdG8gYmUgc2V0LCB0aGUgbWVzc2FnZSAKKwkJCSoqIHNob3VsZCBub3QgYmUgZnJlZWQgaGVyZS4gSXQgd2lsbCBiZSB1c2VkIAorCQkJKiogYnkgdGhlIHNjaGVkdWxlciBvZiB0aGUgZXRoZXJuZXQgaGFuZGxlciAKKwkJCSovCisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKworCS8qCisJKiogSWYgdGhlIHBhc3NlZCBzb2NrZXQgYnVmZmVyIGlzIG9mIHNtYWxsZXIgTVRVLXNpemUgdGhhbiA2MCwKKwkqKiBjb3B5IGV2ZXJ5dGhpbmcgaW50byBuZXcgYnVmZmVyIGFuZCBmaWxsIGFsbCBieXRlcyBiZXR3ZWVuCisJKiogdGhlIG9yaWdpbmFsIHBhY2tldCBlbmQgYW5kIHRoZSBuZXcgcGFja2V0IGVuZCBvZiA2MCB3aXRoIDB4MDAuCisJKiogVGhpcyBpcyB0byByZXNvbHZlIGZhdWx0eSBwYWRkaW5nIGJ5IHRoZSBIVyB3aXRoIDB4YWEgYnl0ZXMuCisJKi8KKwlpZiAoQnl0ZXNTZW5kIDwgQ19MRU5fRVRIRVJORVRfTUlOU0laRSkgeworCQlpZiAoKHBNZXNzYWdlID0gc2tiX3BhZHRvKHBNZXNzYWdlLCBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFKSkgPT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcE1lc3NhZ2UtPmxlbiA9IENfTEVOX0VUSEVSTkVUX01JTlNJWkU7CisJfQorCisJLyogCisJKiogYWR2YW5jZSBoZWFkIGNvdW50ZXIgYmVoaW5kIGRlc2NyaXB0b3IgbmVlZGVkIGZvciB0aGlzIGZyYW1lLCAKKwkqKiBzbyB0aGF0IG5lZWRlZCBkZXNjcmlwdG9yIGlzIHJlc2VydmVkIGZyb20gdGhhdCBvbi4gVGhlIG5leHQKKwkqKiBhY3Rpb24gd2lsbCBiZSB0byBhZGQgdGhlIHBhc3NlZCBidWZmZXIgdG8gdGhlIFRYLWRlc2NyaXB0b3IKKwkqLworCXBUeGQgPSBwVHhQb3J0LT5wVHhkUmluZ0hlYWQ7CisJcFR4UG9ydC0+cFR4ZFJpbmdIZWFkID0gcFR4ZC0+cE5leHRUeGQ7CisJcFR4UG9ydC0+VHhkUmluZ0ZyZWUtLTsKKworI2lmZGVmIFNLX0RVTVBfVFgKKwlEdW1wTXNnKHBNZXNzYWdlLCAiWG1pdEZyYW1lIik7CisjZW5kaWYKKworCS8qIAorCSoqIEZpcnN0IHN0ZXAgaXMgdG8gbWFwIHRoZSBkYXRhIHRvIGJlIHNlbnQgdmlhIHRoZSBhZGFwdGVyIG9udG8KKwkqKiB0aGUgRE1BIG1lbW9yeS4gS2VybmVsIDIuMiB1c2VzIHZpcnRfdG9fYnVzKCksIGJ1dCBrZXJuZWxzIDIuNAorCSoqIGFuZCAyLjYgbmVlZCB0byB1c2UgcGNpX21hcF9wYWdlKCkgZm9yIHRoYXQgbWFwcGluZy4KKwkqLworCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJCQl2aXJ0X3RvX3BhZ2UocE1lc3NhZ2UtPmRhdGEpLAorCQkJCQkoKHVuc2lnbmVkIGxvbmcpIHBNZXNzYWdlLT5kYXRhICYgflBBR0VfTUFTSyksCisJCQkJCXBNZXNzYWdlLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeGQtPlZEYXRhTG93ICA9IChTS19VMzIpIChQaHlzQWRkciAmIDB4ZmZmZmZmZmYpOworCXBUeGQtPlZEYXRhSGlnaCA9IChTS19VMzIpIChQaHlzQWRkciA+PiAzMik7CisJcFR4ZC0+cE1CdWYgICAgID0gcE1lc3NhZ2U7CisKKwlpZiAocE1lc3NhZ2UtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQlQcm90b2NvbCA9ICgoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBQUk9UT10gJiAweGZmKTsKKwkJaWYgKChQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCkgJiYgCisJCQkocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSAmJgorCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgeworCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1RDUF9DSEVDSzsKKwkJfSBlbHNlIHsKKwkJCXBUeGQtPlRCQ29udHJvbCA9IEJNVV9VRFBfQ0hFQ0s7CisJCX0KKworCQlJcEhlYWRlckxlbmd0aCAgPSAoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBIRUFERVJdOworCQlJcEhlYWRlckxlbmd0aCAgPSAoSXBIZWFkZXJMZW5ndGggJiAweGYpICogNDsKKwkJcFR4ZC0+VGNwU3VtT2ZzID0gMDsgLyogUEgtQ2hlY2tzdW0gYWxyZWFkeSBjYWxjdWxhdGVkICovCisJCXBUeGQtPlRjcFN1bVN0ICA9IENfTEVOX0VUSEVSTUFDX0hFQURFUiArIElwSGVhZGVyTGVuZ3RoICsgCisJCQkJCQkJKFByb3RvY29sID09IENfUFJPVE9fSURfVURQID8KKwkJCQkJCQlDX09GRlNFVF9VRFBIRUFERVJfVURQQ1MgOiAKKwkJCQkJCQlDX09GRlNFVF9UQ1BIRUFERVJfVENQQ1MpOworCQlwVHhkLT5UY3BTdW1XciAgPSBDX0xFTl9FVEhFUk1BQ19IRUFERVIgKyBJcEhlYWRlckxlbmd0aDsKKworCQlwVHhkLT5UQkNvbnRyb2wgfD0gQk1VX09XTiB8IEJNVV9TVEYgfCAKKwkJCQkgICBCTVVfU1cgIHwgQk1VX0VPRiB8CisjaWZkZWYgVVNFX1RYX0NPTVBMRVRFCisJCQkJICAgQk1VX0lSUV9FT0YgfAorI2VuZGlmCisJCQkJICAgcE1lc3NhZ2UtPmxlbjsKKyAgICAgICAgfSBlbHNlIHsKKwkJcFR4ZC0+VEJDb250cm9sID0gQk1VX09XTiB8IEJNVV9TVEYgfCBCTVVfQ0hFQ0sgfCAKKwkJCQkgIEJNVV9TVyAgfCBCTVVfRU9GIHwKKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUKKwkJCQkgICBCTVVfSVJRX0VPRiB8CisjZW5kaWYKKwkJCXBNZXNzYWdlLT5sZW47CisJfQorCisJLyogCisJKiogSWYgcHJldmlvdXMgZGVzY3JpcHRvciBhbHJlYWR5IGRvbmUsIGdpdmUgVFggc3RhcnQgY21kIAorCSovCisJcE9sZFR4ZCA9IHhjaGcoJnBUeFBvcnQtPnBUeGRSaW5nUHJldiwgcFR4ZCk7CisJaWYgKChwT2xkVHhkLT5UQkNvbnRyb2wgJiBCTVVfT1dOKSA9PSAwKSB7CisJCVNLX09VVDgocFR4UG9ydC0+SHdBZGRyLCBRX0NTUiwgQ1NSX1NUQVJUKTsKKwl9CQorCisJLyogCisJKiogYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsb2NrLCB0aGUgc2tiIG1heSBpbW1lZGlhdGVseSBiZSBmcmVlJ2QgCisJKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJaWYgKHBUeFBvcnQtPlR4ZFJpbmdGcmVlICE9IDApIHsKKwkJcmV0dXJuIChCeXRlc1NlbmQpOworCX0gZWxzZSB7CisJCXJldHVybiAoMCk7CisJfQorCit9IC8qIFhtaXRGcmFtZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJWG1pdEZyYW1lU0cgLSBmaWxsIG9uZSBzb2NrZXQgYnVmZmVyIGludG8gdGhlIHRyYW5zbWl0IHJpbmcKKyAqICAgICAgICAgICAgICAgICh1c2UgU0cgYW5kIFRDUC9VRFAgaGFyZHdhcmUgY2hlY2tzdW1taW5nKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwdXRzIGEgbWVzc2FnZSBpbnRvIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcKKyAqCWlmIHRoZXJlIGlzIGEgZGVzY3JpcHRvcnMgbGVmdC4KKyAqCisgKiBSZXR1cm5zOgorICoJPiAwIC0gb24gc3VjY2VzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZXNzYWdlCisgKgk9IDAgLSBvbiByZXNvdXJjZSBzaG9ydGFnZTogdGhpcyBmcmFtZSBzZW50IG9yIGRyb3BwZWQsIG5vdworICoJCXRoZSByaW5nIGlzIGZ1bGwgKCAtPiBzZXQgdGJ1c3kpCisgKgk8IDAgLSBvbiBmYWlsdXJlOiBvdGhlciBwcm9ibGVtcyAoIC0+IHJldHVybiBmYWlsdXJlIHRvIHVwcGVyIGxheWVycykKKyAqLworc3RhdGljIGludCBYbWl0RnJhbWVTRygKK1NLX0FDIAkJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgICAgICAgICAqLworVFhfUE9SVAkJKnBUeFBvcnQsCS8qIHBvaW50ZXIgdG8gc3RydWN0IG9mIHBvcnQgdG8gc2VuZCB0byAqLworc3RydWN0IHNrX2J1ZmYJKnBNZXNzYWdlKQkvKiBwb2ludGVyIHRvIHNlbmQtbWVzc2FnZSAgICAgICAgICAgICAgKi8KK3sKKworCVRYRAkJKnBUeGQ7CisJVFhECQkqcFR4ZEZzdDsKKwlUWEQJCSpwVHhkTHN0OworCWludCAJIAkgQ3VyckZyYWc7CisJaW50CQkgQnl0ZXNTZW5kOworCWludAkJIElwSGVhZGVyTGVuZ3RoOyAKKwlpbnQJCSBQcm90b2NvbDsKKwlza2JfZnJhZ190CSpza19mcmFnOworCVNLX1U2NAkJIFBoeXNBZGRyOworCXVuc2lnbmVkIGxvbmcJIEZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKyNpZm5kZWYgVVNFX1RYX0NPTVBMRVRFCisJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKyNlbmRpZgorCWlmICgoc2tiX3NoaW5mbyhwTWVzc2FnZSktPm5yX2ZyYWdzICsxKSA+IHBUeFBvcnQtPlR4ZFJpbmdGcmVlKSB7CisJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgcFR4UG9ydCk7CisJCWlmICgoc2tiX3NoaW5mbyhwTWVzc2FnZSktPm5yX2ZyYWdzICsgMSkgPiBwVHhQb3J0LT5UeGRSaW5nRnJlZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworCQkJU0tfUE5NSV9DTlRfTk9fVFhfQlVGKHBBQywgcFR4UG9ydC0+UG9ydEluZGV4KTsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkJCSgiWG1pdEZyYW1lU0cgZmFpbGVkIC0gUmluZyBmdWxsXG4iKSk7CisJCQkJLyogdGhpcyBtZXNzYWdlIGNhbiBub3QgYmUgc2VudCBub3cgKi8KKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwlwVHhkICAgICAgPSBwVHhQb3J0LT5wVHhkUmluZ0hlYWQ7CisJcFR4ZEZzdCAgID0gcFR4ZDsKKwlwVHhkTHN0ICAgPSBwVHhkOworCUJ5dGVzU2VuZCA9IDA7CisJUHJvdG9jb2wgID0gMDsKKworCS8qIAorCSoqIE1hcCB0aGUgZmlyc3QgZnJhZ21lbnQgKGhlYWRlcikgaW50byB0aGUgRE1BLXNwYWNlCisJKi8KKwlQaHlzQWRkciA9IChTS19VNjQpIHBjaV9tYXBfcGFnZShwQUMtPlBjaURldiwKKwkJCXZpcnRfdG9fcGFnZShwTWVzc2FnZS0+ZGF0YSksCisJCQkoKHVuc2lnbmVkIGxvbmcpIHBNZXNzYWdlLT5kYXRhICYgflBBR0VfTUFTSyksCisJCQlza2JfaGVhZGxlbihwTWVzc2FnZSksCisJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworCXBUeGQtPlZEYXRhTG93ICA9IChTS19VMzIpIChQaHlzQWRkciAmIDB4ZmZmZmZmZmYpOworCXBUeGQtPlZEYXRhSGlnaCA9IChTS19VMzIpIChQaHlzQWRkciA+PiAzMik7CisKKwkvKiAKKwkqKiBEb2VzIHRoZSBIVyBuZWVkIHRvIGV2YWx1YXRlIGNoZWNrc3VtIGZvciBUQ1Agb3IgVURQIHBhY2tldHM/IAorCSovCisJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1NURiB8IEJNVV9TVEZXRCB8IHNrYl9oZWFkbGVuKHBNZXNzYWdlKTsKKwkJLyogCisJCSoqIFdlIGhhdmUgdG8gdXNlIHRoZSBvcGNvZGUgZm9yIHRjcCBoZXJlLCAgYmVjYXVzZSB0aGUKKwkJKiogb3Bjb2RlIGZvciB1ZHAgaXMgbm90IHdvcmtpbmcgaW4gdGhlIGhhcmR3YXJlIHlldCAKKwkJKiogKFJldmlzaW9uIDIuMCkKKwkJKi8KKwkJUHJvdG9jb2wgPSAoKFNLX1U4KXBNZXNzYWdlLT5kYXRhW0NfT0ZGU0VUX0lQUFJPVE9dICYgMHhmZik7CisJCWlmICgoUHJvdG9jb2wgPT0gQ19QUk9UT19JRF9VRFApICYmIAorCQkJKHBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgJiYKKwkJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikpIHsKKwkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfVENQX0NIRUNLOworCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9VRFBfQ0hFQ0s7CisJCX0KKworCQlJcEhlYWRlckxlbmd0aCAgPSAoKFNLX1U4KXBNZXNzYWdlLT5kYXRhW0NfT0ZGU0VUX0lQSEVBREVSXSAmIDB4ZikqNDsKKwkJcFR4ZC0+VGNwU3VtT2ZzID0gMDsgLyogUEgtQ2hlY2tzdW0gYWxyZWFkeSBjbGFjdWxhdGVkICovCisJCXBUeGQtPlRjcFN1bVN0ICA9IENfTEVOX0VUSEVSTUFDX0hFQURFUiArIElwSGVhZGVyTGVuZ3RoICsKKwkJCQkJCShQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCA/CisJCQkJCQlDX09GRlNFVF9VRFBIRUFERVJfVURQQ1MgOgorCQkJCQkJQ19PRkZTRVRfVENQSEVBREVSX1RDUENTKTsKKwkJcFR4ZC0+VGNwU3VtV3IgID0gQ19MRU5fRVRIRVJNQUNfSEVBREVSICsgSXBIZWFkZXJMZW5ndGg7CisJfSBlbHNlIHsKKwkJcFR4ZC0+VEJDb250cm9sID0gQk1VX0NIRUNLIHwgQk1VX1NXIHwgQk1VX1NURiB8CisJCQkJCXNrYl9oZWFkbGVuKHBNZXNzYWdlKTsKKwl9CisKKwlwVHhkID0gcFR4ZC0+cE5leHRUeGQ7CisJcFR4UG9ydC0+VHhkUmluZ0ZyZWUtLTsKKwlCeXRlc1NlbmQgKz0gc2tiX2hlYWRsZW4ocE1lc3NhZ2UpOworCisJLyogCisJKiogQnJvd3NlIG92ZXIgYWxsIFNHIGZyYWdtZW50cyBhbmQgbWFwIGVhY2ggb2YgdGhlbSBpbnRvIHRoZSBETUEgc3BhY2UKKwkqLworCWZvciAoQ3VyckZyYWcgPSAwOyBDdXJyRnJhZyA8IHNrYl9zaGluZm8ocE1lc3NhZ2UpLT5ucl9mcmFnczsgQ3VyckZyYWcrKykgeworCQlza19mcmFnID0gJnNrYl9zaGluZm8ocE1lc3NhZ2UpLT5mcmFnc1tDdXJyRnJhZ107CisJCS8qIAorCQkqKiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3BlciB2YWx1ZSBpbiBlbnRyeQorCQkqLworCQlQaHlzQWRkciA9IChTS19VNjQpIHBjaV9tYXBfcGFnZShwQUMtPlBjaURldiwKKwkJCQkJCSBza19mcmFnLT5wYWdlLAorCQkJCQkJIHNrX2ZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkJIHNrX2ZyYWctPnNpemUsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJcFR4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJCXBUeGQtPlZEYXRhSGlnaCA9IChTS19VMzIpIChQaHlzQWRkciA+PiAzMik7CisJCXBUeGQtPnBNQnVmICAgICA9IHBNZXNzYWdlOworCQkKKwkJLyogCisJCSoqIERvZXMgdGhlIEhXIG5lZWQgdG8gZXZhbHVhdGUgY2hlY2tzdW0gZm9yIFRDUCBvciBVRFAgcGFja2V0cz8gCisJCSovCisJCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfT1dOIHwgQk1VX1NXIHwgQk1VX1NURldEOworCQkJLyogCisJCQkqKiBXZSBoYXZlIHRvIHVzZSB0aGUgb3Bjb2RlIGZvciB0Y3AgaGVyZSBiZWNhdXNlIHRoZSAKKwkJCSoqIG9wY29kZSBmb3IgdWRwIGlzIG5vdCB3b3JraW5nIGluIHRoZSBoYXJkd2FyZSB5ZXQgCisJCQkqKiAocmV2aXNpb24gMi4wKQorCQkJKi8KKwkJCWlmICgoUHJvdG9jb2wgPT0gQ19QUk9UT19JRF9VRFApICYmIAorCQkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCisJCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgeworCQkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfVENQX0NIRUNLOworCQkJfSBlbHNlIHsKKwkJCQlwVHhkLT5UQkNvbnRyb2wgfD0gQk1VX1VEUF9DSEVDSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBUeGQtPlRCQ29udHJvbCA9IEJNVV9DSEVDSyB8IEJNVV9TVyB8IEJNVV9PV047CisJCX0KKworCQkvKiAKKwkJKiogRG8gd2UgaGF2ZSB0aGUgbGFzdCBmcmFnbWVudD8gCisJCSovCisJCWlmKCAoQ3VyckZyYWcrMSkgPT0gc2tiX3NoaW5mbyhwTWVzc2FnZSktPm5yX2ZyYWdzICkgIHsKKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUKKwkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfRU9GIHwgQk1VX0lSUV9FT0YgfCBza19mcmFnLT5zaXplOworI2Vsc2UKKwkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfRU9GIHwgc2tfZnJhZy0+c2l6ZTsKKyNlbmRpZgorCQkJcFR4ZEZzdC0+VEJDb250cm9sIHw9IEJNVV9PV04gfCBCTVVfU1c7CisKKwkJfSBlbHNlIHsKKwkJCXBUeGQtPlRCQ29udHJvbCB8PSBza19mcmFnLT5zaXplOworCQl9CisJCXBUeGRMc3QgPSBwVHhkOworCQlwVHhkICAgID0gcFR4ZC0+cE5leHRUeGQ7CisJCXBUeFBvcnQtPlR4ZFJpbmdGcmVlLS07CisJCUJ5dGVzU2VuZCArPSBza19mcmFnLT5zaXplOworCX0KKworCS8qIAorCSoqIElmIHByZXZpb3VzIGRlc2NyaXB0b3IgYWxyZWFkeSBkb25lLCBnaXZlIFRYIHN0YXJ0IGNtZCAKKwkqLworCWlmICgocFR4UG9ydC0+cFR4ZFJpbmdQcmV2LT5UQkNvbnRyb2wgJiBCTVVfT1dOKSA9PSAwKSB7CisJCVNLX09VVDgocFR4UG9ydC0+SHdBZGRyLCBRX0NTUiwgQ1NSX1NUQVJUKTsKKwl9CisKKwlwVHhQb3J0LT5wVHhkUmluZ1ByZXYgPSBwVHhkTHN0OworCXBUeFBvcnQtPnBUeGRSaW5nSGVhZCA9IHBUeGQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisKKwlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgPiAwKSB7CisJCXJldHVybiAoQnl0ZXNTZW5kKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKDApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZyZWVUeERlc2NyaXB0b3JzIC0gcmVsZWFzZSBkZXNjcmlwdG9ycyBmcm9tIHRoZSBkZXNjcmlwdG9yIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgZGVzY3JpcHRvcnMgZnJvbSBhIHRyYW5zbWl0IHJpbmcgaWYgdGhleQorICoJaGF2ZSBiZWVuIHNlbnQgYnkgdGhlIEJNVS4KKyAqCUlmIGEgZGVzY3JpcHRvcnMgaXMgc2VudCwgaXQgY2FuIGJlIGZyZWVkIGFuZCB0aGUgbWVzc2FnZSBjYW4KKyAqCWJlIGZyZWVkLCB0b28uCisgKglUaGUgU09GVFdBUkUgY29udHJvbGxhYmxlIGJpdCBpcyB1c2VkIHRvIHByZXZlbnQgcnVubmluZyBhcm91bmQgYQorICoJY29tcGxldGVseSBmcmVlIHJpbmcgZm9yIGV2ZXIuIElmIHRoaXMgYml0IGlzIG5vIHNldCBpbiB0aGUKKyAqCWZyYW1lIChieSBYbWl0RnJhbWUpLCB0aGlzIGZyYW1lIGhhcyBuZXZlciBiZWVuIHNlbnQgb3IgaXMKKyAqCWFscmVhZHkgZnJlZWQuCisgKglUaGUgVHggZGVzY3JpcHRvciByaW5nIGxvY2sgbXVzdCBiZSBoZWxkIHdoaWxlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhISEKKyAqCisgKiBSZXR1cm5zOgorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBGcmVlVHhEZXNjcmlwdG9ycygKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK1RYX1BPUlQJKnBUeFBvcnQpCS8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9ydCBzdHJ1Y3R1cmUgKi8KK3sKK1RYRAkqcFR4ZDsJCS8qIHBvaW50ZXIgdG8gdGhlIGNoZWNrZWQgZGVzY3JpcHRvciAqLworVFhECSpwTmV3VGFpbDsJLyogcG9pbnRlciB0byAnZW5kJyBvZiB0aGUgcmluZyAqLworU0tfVTMyCUNvbnRyb2w7CS8qIFRCQ29udHJvbCBmaWVsZCBvZiBkZXNjcmlwdG9yICovCitTS19VNjQJUGh5c0FkZHI7CS8qIGFkZHJlc3Mgb2YgRE1BIG1hcHBpbmcgKi8KKworCXBOZXdUYWlsID0gcFR4UG9ydC0+cFR4ZFJpbmdUYWlsOworCXBUeGQgICAgID0gcE5ld1RhaWw7CisJLyoKKwkqKiBsb29wIGZvcmV2ZXI7IGV4aXRzIGlmIEJNVV9TVyBiaXQgbm90IHNldCBpbiBzdGFydCBmcmFtZQorCSoqIG9yIEJNVV9PV04gYml0IHNldCBpbiBhbnkgZnJhbWUKKwkqLworCXdoaWxlICgxKSB7CisJCUNvbnRyb2wgPSBwVHhkLT5UQkNvbnRyb2w7CisJCWlmICgoQ29udHJvbCAmIEJNVV9TVykgPT0gMCkgeworCQkJLyoKKwkJCSoqIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBiaXQgaXMgc2V0IGluIGZpcnN0CisJCQkqKiBmcmFnbWVudCB3aGVuIGdpdmVuIHRvIEJNVS4gTm90IHNldCBtZWFucyB0aGF0CisJCQkqKiB0aGlzIGZyYWdtZW50IHdhcyBuZXZlciBzZW50IG9yIGlzIGFscmVhZHkKKwkJCSoqIGZyZWVkICggLT4gcmluZyBjb21wbGV0ZWx5IGZyZWUgbm93KS4KKwkJCSovCisJCQlwVHhQb3J0LT5wVHhkUmluZ1RhaWwgPSBwVHhkOworCQkJbmV0aWZfd2FrZV9xdWV1ZShwQUMtPmRldltwVHhQb3J0LT5Qb3J0SW5kZXhdKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoQ29udHJvbCAmIEJNVV9PV04pIHsKKwkJCXBUeFBvcnQtPnBUeGRSaW5nVGFpbCA9IHBUeGQ7CisJCQlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgPiAwKSB7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShwQUMtPmRldltwVHhQb3J0LT5Qb3J0SW5kZXhdKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLyogCisJCSoqIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nLCBiZWNhdXNlIHVudGlsIG5vdCB1bm1hcHBlZAorCQkqKiB0aGlzIGJ1ZmZlciBpcyBjb25zaWRlcmVkIGJlaW5nIHVuZGVyIGNvbnRyb2wgb2YgdGhlCisJCSoqIGFkYXB0ZXIgY2FyZCEKKwkJKi8KKwkJUGh5c0FkZHIgPSAoKFNLX1U2NCkgcFR4ZC0+VkRhdGFIaWdoKSA8PCAoU0tfVTY0KSAzMjsKKwkJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFR4ZC0+VkRhdGFMb3c7CisJCXBjaV91bm1hcF9wYWdlKHBBQy0+UGNpRGV2LCBQaHlzQWRkciwKKwkJCQkgcFR4ZC0+cE1CdWYtPmxlbiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJaWYgKENvbnRyb2wgJiBCTVVfRU9GKQorCQkJREVWX0tGUkVFX1NLQl9BTlkocFR4ZC0+cE1CdWYpOwkvKiBmcmVlIG1lc3NhZ2UgKi8KKworCQlwVHhQb3J0LT5UeGRSaW5nRnJlZSsrOworCQlwVHhkLT5UQkNvbnRyb2wgJj0gfkJNVV9TVzsKKwkJcFR4ZCA9IHBUeGQtPnBOZXh0VHhkOyAvKiBwb2ludCBiZWhpbmQgZnJhZ21lbnQgd2l0aCBFT0YgKi8KKwl9IC8qIHdoaWxlKGZvcmV2ZXIpICovCit9IC8qIEZyZWVUeERlc2NyaXB0b3JzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlGaWxsUnhSaW5nIC0gZmlsbCB0aGUgcmVjZWl2ZSByaW5nIHdpdGggdmFsaWQgZGVzY3JpcHRvcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIHJlY2VpdmUgcmluZyBkZXNjcmlwdG9ycyB3aXRoIGRhdGEKKyAqCXNlZ21lbnRzIGFuZCBtYWtlcyB0aGVtIHZhbGlkIGZvciB0aGUgQk1VLgorICoJVGhlIGFjdGl2ZSByaW5nIGlzIGZpbGxlZCBjb21wbGV0ZWx5LCBpZiBwb3NzaWJsZS4KKyAqCVRoZSBub24tYWN0aXZlIHJpbmcgaXMgZmlsbGVkIG9ubHkgcGFydGlhbCB0byBzYXZlIG1lbW9yeS4KKyAqCisgKiBEZXNjcmlwdGlvbiBvZiByeCByaW5nIHN0cnVjdHVyZToKKyAqCWhlYWQgLSBwb2ludHMgdG8gdGhlIGRlc2NyaXB0b3Igd2hpY2ggd2lsbCBiZSB1c2VkIG5leHQgYnkgdGhlIEJNVQorICoJdGFpbCAtIHBvaW50cyB0byB0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIGdpdmUgdG8gdGhlIEJNVQorICoJCisgKiBSZXR1cm5zOglOL0EKKyAqLworc3RhdGljIHZvaWQgRmlsbFJ4UmluZygKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0ICovCitSWF9QT1JUCQkqcFJ4UG9ydCkJLyogcHRyIHRvIHBvcnQgc3RydWN0IGZvciB3aGljaCB0aGUgcmluZworCQkJCSAgIHNob3VsZCBiZSBmaWxsZWQgKi8KK3sKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFJ4UG9ydC0+UnhEZXNSaW5nTG9jaywgRmxhZ3MpOworCXdoaWxlIChwUnhQb3J0LT5SeGRSaW5nRnJlZSA+IHBSeFBvcnQtPlJ4RmlsbExpbWl0KSB7CisJCWlmKCFGaWxsUnhEZXNjcmlwdG9yKHBBQywgcFJ4UG9ydCkpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFJ4UG9ydC0+UnhEZXNSaW5nTG9jaywgRmxhZ3MpOworfSAvKiBGaWxsUnhSaW5nICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZpbGxSeERlc2NyaXB0b3IgLSBmaWxsIG9uZSBidWZmZXIgaW50byB0aGUgcmVjZWl2ZSByaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IHJlY2VpdmUgYnVmZmVyIGFuZAorICoJcHV0cyBpdCBpbnRvIHRoZSBuZXh0IGRlc2NyaXB0b3IuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1RSVUUgLSBhIGJ1ZmZlciB3YXMgYWRkZWQgdG8gdGhlIHJpbmcKKyAqCVNLX0ZBTFNFIC0gYSBidWZmZXIgY291bGQgbm90IGJlIGFkZGVkCisgKi8KK3N0YXRpYyBTS19CT09MIEZpbGxSeERlc2NyaXB0b3IoCitTS19BQwkJKnBBQywJCS8qIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QgKi8KK1JYX1BPUlQJCSpwUnhQb3J0KQkvKiBwdHIgdG8gcG9ydCBzdHJ1Y3Qgb2YgcmluZyB0byBmaWxsICovCit7CitzdHJ1Y3Qgc2tfYnVmZgkqcE1zZ0Jsb2NrOwkvKiBwb2ludGVyIHRvIGEgbmV3IG1lc3NhZ2UgYmxvY2sgKi8KK1JYRAkJKnBSeGQ7CQkvKiB0aGUgcnhkIHRvIGZpbGwgKi8KK1NLX1UxNgkJTGVuZ3RoOwkJLyogZGF0YSBmcmFnbWVudCBsZW5ndGggKi8KK1NLX1U2NAkJUGh5c0FkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSByeCBidWZmZXIgKi8KKworCXBNc2dCbG9jayA9IGFsbG9jX3NrYihwQUMtPlJ4QnVmU2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHBNc2dCbG9jayA9PSBOVUxMKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCVNLX0RCR0NBVF9EUlZfRU5UUlksCisJCQkoIiVzOiBBbGxvY2F0aW9uIG9mIHJ4IGJ1ZmZlciBmYWlsZWQgIVxuIiwKKwkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0tPm5hbWUpKTsKKwkJU0tfUE5NSV9DTlRfTk9fUlhfQlVGKHBBQywgcFJ4UG9ydC0+UG9ydEluZGV4KTsKKwkJcmV0dXJuKFNLX0ZBTFNFKTsKKwl9CisJc2tiX3Jlc2VydmUocE1zZ0Jsb2NrLCAyKTsgLyogdG8gYWxpZ24gSVAgZnJhbWVzICovCisJLyogc2tiIGFsbG9jYXRlZCBvaywgc28gYWRkIGJ1ZmZlciAqLworCXBSeGQgPSBwUnhQb3J0LT5wUnhkUmluZ1RhaWw7CisJcFJ4UG9ydC0+cFJ4ZFJpbmdUYWlsID0gcFJ4ZC0+cE5leHRSeGQ7CisJcFJ4UG9ydC0+UnhkUmluZ0ZyZWUtLTsKKwlMZW5ndGggPSBwQUMtPlJ4QnVmU2l6ZTsKKwlQaHlzQWRkciA9IChTS19VNjQpIHBjaV9tYXBfcGFnZShwQUMtPlBjaURldiwKKwkJdmlydF90b19wYWdlKHBNc2dCbG9jay0+ZGF0YSksCisJCSgodW5zaWduZWQgbG9uZykgcE1zZ0Jsb2NrLT5kYXRhICYKKwkJflBBR0VfTUFTSyksCisJCXBBQy0+UnhCdWZTaXplIC0gMiwKKwkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCXBSeGQtPlZEYXRhTG93ICA9IChTS19VMzIpIChQaHlzQWRkciAmIDB4ZmZmZmZmZmYpOworCXBSeGQtPlZEYXRhSGlnaCA9IChTS19VMzIpIChQaHlzQWRkciA+PiAzMik7CisJcFJ4ZC0+cE1CdWYgICAgID0gcE1zZ0Jsb2NrOworCXBSeGQtPlJCQ29udHJvbCA9IEJNVV9PV04gICAgICAgfCAKKwkJCSAgQk1VX1NURiAgICAgICB8IAorCQkJICBCTVVfSVJRX0VPRiAgIHwgCisJCQkgIEJNVV9UQ1BfQ0hFQ0sgfCAKKwkJCSAgTGVuZ3RoOworCXJldHVybiAoU0tfVFJVRSk7CisKK30gLyogRmlsbFJ4RGVzY3JpcHRvciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlSZVF1ZXVlUnhCdWZmZXIgLSBmaWxsIG9uZSBidWZmZXIgYmFjayBpbnRvIHRoZSByZWNlaXZlIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZpbGwgYSBnaXZlbiBidWZmZXIgYmFjayBpbnRvIHRoZSByeCByaW5nLiBUaGUgYnVmZmVyCisgKgloYXMgYmVlbiBwcmV2aW91c2x5IGFsbG9jYXRlZCBhbmQgYWxpZ25lZCwgYW5kIGl0cyBwaHlzLgorICoJYWRkcmVzcyBjYWxjdWxhdGVkLCBzbyB0aGlzIGlzIG5vIG1vcmUgbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBSZVF1ZXVlUnhCdWZmZXIoCitTS19BQwkJKnBBQywJCS8qIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QgKi8KK1JYX1BPUlQJCSpwUnhQb3J0LAkvKiBwdHIgdG8gcG9ydCBzdHJ1Y3Qgb2YgcmluZyB0byBmaWxsICovCitzdHJ1Y3Qgc2tfYnVmZgkqcE1zZywJCS8qIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAqLworU0tfVTMyCQlQaHlzSGlnaCwJLyogcGh5cyBhZGRyZXNzIGhpZ2ggZHdvcmQgKi8KK1NLX1UzMgkJUGh5c0xvdykJLyogcGh5cyBhZGRyZXNzIGxvdyBkd29yZCAqLworeworUlhECQkqcFJ4ZDsJCS8qIHRoZSByeGQgdG8gZmlsbCAqLworU0tfVTE2CQlMZW5ndGg7CQkvKiBkYXRhIGZyYWdtZW50IGxlbmd0aCAqLworCisJcFJ4ZCA9IHBSeFBvcnQtPnBSeGRSaW5nVGFpbDsKKwlwUnhQb3J0LT5wUnhkUmluZ1RhaWwgPSBwUnhkLT5wTmV4dFJ4ZDsKKwlwUnhQb3J0LT5SeGRSaW5nRnJlZS0tOworCUxlbmd0aCA9IHBBQy0+UnhCdWZTaXplOworCisJcFJ4ZC0+VkRhdGFMb3cgID0gUGh5c0xvdzsKKwlwUnhkLT5WRGF0YUhpZ2ggPSBQaHlzSGlnaDsKKwlwUnhkLT5wTUJ1ZiAgICAgPSBwTXNnOworCXBSeGQtPlJCQ29udHJvbCA9IEJNVV9PV04gICAgICAgfCAKKwkJCSAgQk1VX1NURiAgICAgICB8CisJCQkgIEJNVV9JUlFfRU9GICAgfCAKKwkJCSAgQk1VX1RDUF9DSEVDSyB8IAorCQkJICBMZW5ndGg7CisJcmV0dXJuOworfSAvKiBSZVF1ZXVlUnhCdWZmZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVJlY2VpdmVJcnEgLSBoYW5kbGUgYSByZWNlaXZlIElSUQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJlY2VpdmUgSVJRIGlzIHNldC4KKyAqCUl0IHdhbGtzIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZyBhbmQgc2VuZHMgdXAgYWxsCisgKglmcmFtZXMgdGhhdCBhcmUgY29tcGxldGUuCisgKgorICogUmV0dXJuczoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIFJlY2VpdmVJcnEoCisJU0tfQUMJCSpwQUMsCQkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KKwlSWF9QT1JUCQkqcFJ4UG9ydCwJCS8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBwb3J0IHN0cnVjdCAqLworCVNLX0JPT0wJCVNsb3dQYXRoTG9jaykJLyogaW5kaWNhdGVzIGlmIFNsb3dQYXRoTG9jayBpcyBuZWVkZWQgKi8KK3sKK1JYRAkJCQkqcFJ4ZDsJCQkvKiBwb2ludGVyIHRvIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KK1NLX1UzMgkJCUNvbnRyb2w7CQkvKiBjb250cm9sIGZpZWxkIG9mIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBza19idWZmCSpwTXNnOwkJCS8qIHBvaW50ZXIgdG8gbWVzc2FnZSBob2xkaW5nIGZyYW1lICovCitzdHJ1Y3Qgc2tfYnVmZgkqcE5ld01zZzsJCS8qIHBvaW50ZXIgdG8gYSBuZXcgbWVzc2FnZSBmb3IgY29weWluZyBmcmFtZSAqLworaW50CQkJCUZyYW1lTGVuZ3RoOwkvKiB0b3RhbCBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUgKi8KK2ludAkJCQlJcEZyYW1lTGVuZ3RoOworU0tfTUJVRgkJCSpwUmxtdE1idWY7CQkvKiBwdHIgdG8gYSBidWZmZXIgZm9yIGdpdmluZyBhIGZyYW1lIHRvIHJsbXQgKi8KK1NLX0VWUEFSQQkJRXZQYXJhOwkJCS8qIGFuIGV2ZW50IHBhcmFtZXRlciB1bmlvbiAqLwkKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CQkJLyogZm9yIHNwaW4gbG9jayAqLworaW50CQkJCVBvcnRJbmRleCA9IHBSeFBvcnQtPlBvcnRJbmRleDsKK3Vuc2lnbmVkIGludAlPZmZzZXQ7Cit1bnNpZ25lZCBpbnQJTnVtQnl0ZXM7Cit1bnNpZ25lZCBpbnQJRm9yUmxtdDsKK1NLX0JPT0wJCQlJc0JjOworU0tfQk9PTAkJCUlzTWM7CitTS19CT09MICBJc0JhZEZyYW1lOyAJCQkvKiBCYWQgZnJhbWUgKi8KKworU0tfVTMyCQkJRnJhbWVTdGF0OwordW5zaWduZWQgc2hvcnQJQ3N1bTE7Cit1bnNpZ25lZCBzaG9ydAlDc3VtMjsKK3Vuc2lnbmVkIHNob3J0CVR5cGU7CitpbnQJCQkJUmVzdWx0OworU0tfVTY0CQkJUGh5c0FkZHI7CisKK3J4X3N0YXJ0OgkKKwkvKiBkbyBmb3JldmVyOyBleGl0IGlmIEJNVV9PV04gZm91bmQgKi8KKwlmb3IgKCBwUnhkID0gcFJ4UG9ydC0+cFJ4ZFJpbmdIZWFkIDsKKwkJICBwUnhQb3J0LT5SeGRSaW5nRnJlZSA8IHBBQy0+UnhEZXNjclBlclJpbmcgOworCQkgIHBSeGQgPSBwUnhkLT5wTmV4dFJ4ZCwKKwkJICBwUnhQb3J0LT5wUnhkUmluZ0hlYWQgPSBwUnhkLAorCQkgIHBSeFBvcnQtPlJ4ZFJpbmdGcmVlICsrKSB7CisKKwkJLyoKKwkJICogRm9yIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhpcyBsb29wCisJCSAqIEdvIHRocm91Z2ggZXZlcnkgZGVzY3JpcHRvciBiZWdpbm5pbmcgYXQgdGhlIGhlYWQKKwkJICogUGxlYXNlIG5vdGU6IHRoZSByaW5nIG1pZ2h0IGJlIGNvbXBsZXRlbHkgcmVjZWl2ZWQgc28gdGhlIE9XTiBiaXQKKwkJICogc2V0IGlzIG5vdCBhIGdvb2QgY3JpcnRlcmlhIHRvIGxlYXZlIHRoYXQgbG9vcC4KKwkJICogVGhlcmVmb3JlIHRoZSBSaW5nRnJlZSBjb3VudGVyIGlzIHVzZWQuCisJCSAqIE9uIGVudHJ5IG9mIHRoaXMgbG9vcCBwUnhkIGlzIGEgcG9pbnRlciB0byB0aGUgUnhkIHRoYXQgbmVlZHMKKwkJICogdG8gYmUgY2hlY2tlZCBuZXh0LgorCQkgKi8KKworCQlDb250cm9sID0gcFJ4ZC0+UkJDb250cm9sOworCQorCQkvKiBjaGVjayBpZiB0aGlzIGRlc2NyaXB0b3IgaXMgcmVhZHkgKi8KKwkJaWYgKChDb250cm9sICYgQk1VX09XTikgIT0gMCkgeworCQkJLyogdGhpcyBkZXNjcmlwdG9yIGlzIG5vdCB5ZXQgcmVhZHkgKi8KKwkJCS8qIFRoaXMgaXMgdGhlIHVzdWFsIGVuZCBvZiB0aGUgbG9vcCAqLworCQkJLyogV2UgZG9uJ3QgbmVlZCB0byBzdGFydCB0aGUgcmluZyBhZ2FpbiAqLworCQkJRmlsbFJ4UmluZyhwQUMsIHBSeFBvcnQpOworCQkJcmV0dXJuOworCQl9CisgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLk5iclByb2Nlc3NlZERlc2NyKys7CisKKwkJLyogZ2V0IGxlbmd0aCBvZiBmcmFtZSBhbmQgY2hlY2sgaXQgKi8KKwkJRnJhbWVMZW5ndGggPSBDb250cm9sICYgQk1VX0JCQzsKKwkJaWYgKEZyYW1lTGVuZ3RoID4gcEFDLT5SeEJ1ZlNpemUpIHsKKwkJCWdvdG8gcnhfZmFpbGVkOworCQl9CisKKwkJLyogY2hlY2sgZm9yIFNURiBhbmQgRU9GICovCisJCWlmICgoQ29udHJvbCAmIChCTVVfU1RGIHwgQk1VX0VPRikpICE9IChCTVVfU1RGIHwgQk1VX0VPRikpIHsKKwkJCWdvdG8gcnhfZmFpbGVkOworCQl9CisKKwkJLyogaGVyZSB3ZSBoYXZlIGEgY29tcGxldGUgZnJhbWUgaW4gdGhlIHJpbmcgKi8KKwkJcE1zZyA9IHBSeGQtPnBNQnVmOworCisJCUZyYW1lU3RhdCA9IHBSeGQtPkZyYW1lU3RhdDsKKworCQkvKiBjaGVjayBmb3IgZnJhbWUgbGVuZ3RoIG1pc21hdGNoICovCisjZGVmaW5lIFhNUl9GU19MRU5fU0hJRlQgICAgICAgIDE4CisjZGVmaW5lIEdNUl9GU19MRU5fU0hJRlQgICAgICAgIDE2CisJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJCQlpZiAoRnJhbWVMZW5ndGggIT0gKFNLX1UzMikgKEZyYW1lU3RhdCA+PiBYTVJfRlNfTEVOX1NISUZUKSkgeworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJza2dlOiBGcmFtZSBsZW5ndGggbWlzbWF0Y2ggKCV1LyV1KS5cbiIsCisJCQkJCUZyYW1lTGVuZ3RoLAorCQkJCQkoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IFhNUl9GU19MRU5fU0hJRlQpKSk7CisJCQkJZ290byByeF9mYWlsZWQ7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoRnJhbWVMZW5ndGggIT0gKFNLX1UzMikgKEZyYW1lU3RhdCA+PiBHTVJfRlNfTEVOX1NISUZUKSkgeworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJza2dlOiBGcmFtZSBsZW5ndGggbWlzbWF0Y2ggKCV1LyV1KS5cbiIsCisJCQkJCUZyYW1lTGVuZ3RoLAorCQkJCQkoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IFhNUl9GU19MRU5fU0hJRlQpKSk7CisJCQkJZ290byByeF9mYWlsZWQ7CisJCQl9CisJCX0KKworCQkvKiBTZXQgUnggU3RhdHVzICovCisJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJCQlJc0JjID0gKEZyYW1lU3RhdCAmIFhNUl9GU19CQykgIT0gMDsKKwkJCUlzTWMgPSAoRnJhbWVTdGF0ICYgWE1SX0ZTX01DKSAhPSAwOworCQkJSXNCYWRGcmFtZSA9IChGcmFtZVN0YXQgJgorCQkJCShYTVJfRlNfQU5ZX0VSUiB8IFhNUl9GU18yTF9WTEFOKSkgIT0gMDsKKwkJfSBlbHNlIHsKKwkJCUlzQmMgPSAoRnJhbWVTdGF0ICYgR01SX0ZTX0JDKSAhPSAwOworCQkJSXNNYyA9IChGcmFtZVN0YXQgJiBHTVJfRlNfTUMpICE9IDA7CisJCQlJc0JhZEZyYW1lID0gKCgoRnJhbWVTdGF0ICYgR01SX0ZTX0FOWV9FUlIpICE9IDApIHx8CisJCQkJCQkJKChGcmFtZVN0YXQgJiBHTVJfRlNfUlhfT0spID09IDApKTsKKwkJfQorCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgMCwKKwkJCSgiUmVjZWl2ZWQgZnJhbWUgb2YgbGVuZ3RoICVkIG9uIHBvcnQgJWRcbiIsCisJCQlGcmFtZUxlbmd0aCwgUG9ydEluZGV4KSk7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgMCwKKwkJCSgiTnVtYmVyIG9mIGZyZWUgcnggZGVzY3JpcHRvcnM6ICVkXG4iLAorCQkJcFJ4UG9ydC0+UnhkUmluZ0ZyZWUpKTsKKy8qIER1bXBNc2cocE1zZywgIlJ4Iik7CSovCisKKwkJaWYgKChDb250cm9sICYgQk1VX1NUQVRfVkFMKSAhPSBCTVVfU1RBVF9WQUwgfHwgKElzQmFkRnJhbWUpKSB7CisjaWYgMAorCQkJKEZyYW1lU3RhdCAmIChYTVJfRlNfQU5ZX0VSUiB8IFhNUl9GU18yTF9WTEFOKSkgIT0gMCkgeworI2VuZGlmCisJCQkvKiB0aGVyZSBpcyBhIHJlY2VpdmUgZXJyb3IgaW4gdGhpcyBmcmFtZSAqLworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfUlhfUFJPR1JFU1MsCisJCQkJKCJza2dlOiBFcnJvciBpbiByZWNlaXZlZCBmcmFtZSwgZHJvcHBlZCFcbiIKKwkJCQkiQ29udHJvbDogJXhcblJ4U3RhdDogJXhcbiIsCisJCQkJQ29udHJvbCwgRnJhbWVTdGF0KSk7CisKKwkJCVJlUXVldWVSeEJ1ZmZlcihwQUMsIHBSeFBvcnQsIHBNc2csCisJCQkJcFJ4ZC0+VkRhdGFIaWdoLCBwUnhkLT5WRGF0YUxvdyk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogaWYgc2hvcnQgZnJhbWUgdGhlbiBjb3B5IGRhdGEgdG8gcmVkdWNlIG1lbW9yeSB3YXN0ZQorCQkgKi8KKwkJaWYgKChGcmFtZUxlbmd0aCA8IFNLX0NPUFlfVEhSRVNIT0xEKSAmJgorCQkJKChwTmV3TXNnID0gYWxsb2Nfc2tiKEZyYW1lTGVuZ3RoKzIsIEdGUF9BVE9NSUMpKSAhPSBOVUxMKSkgeworCQkJLyoKKwkJCSAqIFNob3J0IGZyYW1lIGRldGVjdGVkIGFuZCBhbGxvY2F0aW9uIHN1Y2Nlc3NmdWxsCisJCQkgKi8KKwkJCS8qIHVzZSBuZXcgc2tiIGFuZCBjb3B5IGRhdGEgKi8KKwkJCXNrYl9yZXNlcnZlKHBOZXdNc2csIDIpOworCQkJc2tiX3B1dChwTmV3TXNnLCBGcmFtZUxlbmd0aCk7CisJCQlQaHlzQWRkciA9ICgoU0tfVTY0KSBwUnhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpMzI7CisJCQlQaHlzQWRkciB8PSAoU0tfVTY0KSBwUnhkLT5WRGF0YUxvdzsKKworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHBBQy0+UGNpRGV2LAorCQkJCQkJICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKKwkJCQkJCSAgICBGcmFtZUxlbmd0aCwKKwkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZXRoX2NvcHlfYW5kX3N1bShwTmV3TXNnLCBwTXNnLT5kYXRhLAorCQkJCUZyYW1lTGVuZ3RoLCAwKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwQUMtPlBjaURldiwKKwkJCQkJCSAgICAgICAoZG1hX2FkZHJfdCkgUGh5c0FkZHIsCisJCQkJCQkgICAgICAgRnJhbWVMZW5ndGgsCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCVJlUXVldWVSeEJ1ZmZlcihwQUMsIHBSeFBvcnQsIHBNc2csCisJCQkJcFJ4ZC0+VkRhdGFIaWdoLCBwUnhkLT5WRGF0YUxvdyk7CisKKwkJCXBNc2cgPSBwTmV3TXNnOworCisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogaWYgbGFyZ2UgZnJhbWUsIG9yIFNLQiBhbGxvY2F0aW9uIGZhaWxlZCwgcGFzcworCQkJICogdGhlIFNLQiBkaXJlY3RseSB0byB0aGUgbmV0d29ya2luZworCQkJICovCisKKwkJCVBoeXNBZGRyID0gKChTS19VNjQpIHBSeGQtPlZEYXRhSGlnaCkgPDwgKFNLX1U2NCkzMjsKKwkJCVBoeXNBZGRyIHw9IChTS19VNjQpIHBSeGQtPlZEYXRhTG93OworCisJCQkvKiByZWxlYXNlIHRoZSBETUEgbWFwcGluZyAqLworCQkJcGNpX3VubWFwX3NpbmdsZShwQUMtPlBjaURldiwKKwkJCQkJIFBoeXNBZGRyLAorCQkJCQkgcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogc2V0IGxlbmd0aCBpbiBtZXNzYWdlICovCisJCQlza2JfcHV0KHBNc2csIEZyYW1lTGVuZ3RoKTsKKwkJCS8qIGhhcmR3YXJlIGNoZWNrc3VtICovCisJCQlUeXBlID0gbnRvaHMoKigoc2hvcnQqKSZwTXNnLT5kYXRhWzEyXSkpOworCisjaWZkZWYgVVNFX1NLX1JYX0NIRUNLU1VNCisJCQlpZiAoVHlwZSA9PSAweDgwMCkgeworCQkJCUNzdW0xPWxlMTZfdG9fY3B1KHBSeGQtPlRjcFN1bXMgJiAweGZmZmYpOworCQkJCUNzdW0yPWxlMTZfdG9fY3B1KChwUnhkLT5UY3BTdW1zID4+IDE2KSAmIDB4ZmZmZik7CisJCQkJSXBGcmFtZUxlbmd0aCA9IChpbnQpIG50b2hzKCh1bnNpZ25lZCBzaG9ydCkKKwkJCQkJCQkJKCh1bnNpZ25lZCBzaG9ydCAqKSBwTXNnLT5kYXRhKVs4XSk7CisKKwkJCQkvKgorCQkJCSAqIFRlc3Q6IElmIGZyYW1lIGlzIHBhZGRlZCwgYSBjaGVjayBpcyBub3QgcG9zc2libGUhCisJCQkJICogRnJhbWUgbm90IHBhZGRlZD8gTGVuZ3RoIGRpZmZlcmVuY2UgbXVzdCBiZSAxNCAoMHhlKSEKKwkJCQkgKi8KKwkJCQlpZiAoKEZyYW1lTGVuZ3RoIC0gSXBGcmFtZUxlbmd0aCkgIT0gMHhlKSB7CisJCQkJLyogRnJhbWUgcGFkZGVkID0+IFRDUCBvZmZsb2FkIG5vdCBwb3NzaWJsZSEgKi8KKwkJCQkJcE1zZy0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCQl9IGVsc2UgeworCQkJCS8qIEZyYW1lIG5vdCBwYWRkZWQgPT4gVENQIG9mZmxvYWQhICovCisJCQkJCWlmICgoKChDc3VtMSAmIDB4ZmZmZSkgJiYgKENzdW0yICYgMHhmZmZlKSkgJiYKKwkJCQkJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSkgfHwKKwkJCQkJCShwQUMtPkNoaXBzZXRUeXBlKSkgeworCQkJCQkJUmVzdWx0ID0gU2tDc0dldFJlY2VpdmVJbmZvKHBBQywKKwkJCQkJCQkmcE1zZy0+ZGF0YVsxNF0sCisJCQkJCQkJQ3N1bTEsIENzdW0yLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOworCQkJCQkJaWYgKFJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyB8fAorCQkJCQkJCVJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX09LIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfVURQX0NTVU1fT0spIHsKKwkJCQkJCQkJcE1zZy0+aXBfc3VtbWVkID0KKwkJCQkJCQkJQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19UQ1BfQ1NVTV9FUlJPUiB8fAorCQkJCQkJCVJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX1VEUF9DU1VNX0VSUk9SIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9VRFAgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1RDUCB8fAorCQkJCQkJCVJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1IgKSB7CisJCQkJCQkJLyogSFcgQ2hlY2tzdW0gZXJyb3IgKi8KKwkJCQkJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJCQkoInNrZ2U6IENSQyBlcnJvci4gRnJhbWUgZHJvcHBlZCFcbiIpKTsKKwkJCQkJCQlnb3RvIHJ4X2ZhaWxlZDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXBNc2ctPmlwX3N1bW1lZCA9CisJCQkJCQkJCUNIRUNLU1VNX05PTkU7CisJCQkJCQl9CisJCQkJCX0vKiBjaGVja3N1bUNvbnRyb2wgY2FsY3VsYXRpb24gdmFsaWQgKi8KKwkJCQl9IC8qIEZyYW1lIGxlbmd0aCBjaGVjayAqLworCQkJfSAvKiBJUCBmcmFtZSAqLworI2Vsc2UKKwkJCXBNc2ctPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CQorI2VuZGlmCisJCX0gLyogZnJhbWUgPiBTS19DT1BZX1RSRVNIT0xEICovCisJCQorCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCTEsKCJWIikpOworCQlGb3JSbG10ID0gU0tfUkxNVF9SWF9QUk9UT0NPTDsKKyNpZiAwCisJCUlzQmMgPSAoRnJhbWVTdGF0ICYgWE1SX0ZTX0JDKT09WE1SX0ZTX0JDOworI2VuZGlmCisJCVNLX1JMTVRfUFJFX0xPT0tBSEVBRChwQUMsIFBvcnRJbmRleCwgRnJhbWVMZW5ndGgsCisJCQlJc0JjLCAmT2Zmc2V0LCAmTnVtQnl0ZXMpOworCQlpZiAoTnVtQnl0ZXMgIT0gMCkgeworI2lmIDAKKwkJCUlzTWMgPSAoRnJhbWVTdGF0ICYgWE1SX0ZTX01DKT09WE1SX0ZTX01DOworI2VuZGlmCisJCQlTS19STE1UX0xPT0tBSEVBRChwQUMsIFBvcnRJbmRleCwKKwkJCQkmcE1zZy0+ZGF0YVtPZmZzZXRdLAorCQkJCUlzQmMsIElzTWMsICZGb3JSbG10KTsKKwkJfQorCQlpZiAoRm9yUmxtdCA9PSBTS19STE1UX1JYX1BST1RPQ09MKSB7CisJCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwJMSwoIlciKSk7CisJCQkvKiBzZW5kIHVwIG9ubHkgZnJhbWVzIGZyb20gYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgoUG9ydEluZGV4ID09IHBBQy0+QWN0aXZlUG9ydCkgfHwKKwkJCQkocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQkJCS8qIGZyYW1lIGZvciB1cHBlciBsYXllciAqLworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgMSwoIlUiKSk7CisjaWZkZWYgeERFQlVHCisJCQkJRHVtcE1zZyhwTXNnLCAiUngiKTsKKyNlbmRpZgorCQkJCVNLX1BOTUlfQ05UX1JYX09DVEVUU19ERUxJVkVSRUQocEFDLAorCQkJCQlGcmFtZUxlbmd0aCwgcFJ4UG9ydC0+UG9ydEluZGV4KTsKKworCQkJCXBNc2ctPmRldiA9IHBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF07CisJCQkJcE1zZy0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwTXNnLAorCQkJCQlwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdKTsKKwkJCQluZXRpZl9yeChwTXNnKTsKKwkJCQlwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdLT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIGRyb3AgZnJhbWUgKi8KKwkJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJCVNLX0RCR0NBVF9EUlZfUlhfUFJPR1JFU1MsCisJCQkJCSgiRCIpKTsKKwkJCQlERVZfS0ZSRUVfU0tCKHBNc2cpOworCQkJfQorCQkJCisJCX0gLyogaWYgbm90IGZvciBybG10ICovCisJCWVsc2UgeworCQkJLyogcGFja2V0IGZvciBybG10ICovCisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywgKCJSIikpOworCQkJcFJsbXRNYnVmID0gU2tEcnZBbGxvY1JsbXRNYnVmKHBBQywKKwkJCQlwQUMtPklvQmFzZSwgRnJhbWVMZW5ndGgpOworCQkJaWYgKHBSbG10TWJ1ZiAhPSBOVUxMKSB7CisJCQkJcFJsbXRNYnVmLT5wTmV4dCA9IE5VTEw7CisJCQkJcFJsbXRNYnVmLT5MZW5ndGggPSBGcmFtZUxlbmd0aDsKKwkJCQlwUmxtdE1idWYtPlBvcnRJZHggPSBQb3J0SW5kZXg7CisJCQkJRXZQYXJhLnBQYXJhUHRyID0gcFJsbXRNYnVmOworCQkJCW1lbWNweSgoY2hhciopKHBSbG10TWJ1Zi0+cERhdGEpLAorCQkJCQkgICAoY2hhciopKHBNc2ctPmRhdGEpLAorCQkJCQkgICBGcmFtZUxlbmd0aCk7CisKKwkJCQkvKiBTbG93UGF0aExvY2sgbmVlZGVkPyAqLworCQkJCWlmIChTbG93UGF0aExvY2sgPT0gU0tfVFJVRSkgeworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULAorCQkJCQkJU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQsCisJCQkJCQlFdlBhcmEpOworCQkJCQlwQUMtPkNoZWNrUXVldWUgPSBTS19UUlVFOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQkJCX0gZWxzZSB7CisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwKKwkJCQkJCVNLX1JMTVRfUEFDS0VUX1JFQ0VJVkVELAorCQkJCQkJRXZQYXJhKTsKKwkJCQkJcEFDLT5DaGVja1F1ZXVlID0gU0tfVFJVRTsKKwkJCQl9CisKKwkJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJCVNLX0RCR0NBVF9EUlZfUlhfUFJPR1JFU1MsCisJCQkJCSgiUSIpKTsKKwkJCX0KKwkJCWlmICgocEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XS0+ZmxhZ3MgJgorCQkJCShJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpICE9IDAgfHwKKwkJCQkoRm9yUmxtdCAmIFNLX1JMTVRfUlhfUFJPVE9DT0wpID09CisJCQkJU0tfUkxNVF9SWF9QUk9UT0NPTCkgeworCQkJCXBNc2ctPmRldiA9IHBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF07CisJCQkJcE1zZy0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwTXNnLAorCQkJCQlwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdKTsKKwkJCQluZXRpZl9yeChwTXNnKTsKKwkJCQlwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdLT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURFVl9LRlJFRV9TS0IocE1zZyk7CisJCQl9CisKKwkJfSAvKiBpZiBwYWNrZXQgZm9yIHJsbXQgKi8KKwl9IC8qIGZvciAuLi4gc2Nhbm5pbmcgdGhlIFJYRCByaW5nICovCisKKwkvKiBSWEQgcmluZyBpcyBlbXB0eSAtPiBmaWxsIGFuZCByZXN0YXJ0ICovCisJRmlsbFJ4UmluZyhwQUMsIHBSeFBvcnQpOworCS8qIGRvIG5vdCBzdGFydCBpZiBjYWxsZWQgZnJvbSBDbG9zZSAqLworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPiBTS19JTklUX0RBVEEpIHsKKwkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgUG9ydEluZGV4KTsKKwl9CisJcmV0dXJuOworCityeF9mYWlsZWQ6CisJLyogcmVtb3ZlIGVycm9yIGZyYW1lICovCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VSUk9SLAorCQkoIlNjaHJvdHRkZXNjcmlwdG9yLCBsZW5ndGg6IDB4JXhcbiIsIEZyYW1lTGVuZ3RoKSk7CisKKwkvKiByZWxlYXNlIHRoZSBETUEgbWFwcGluZyAqLworCisJUGh5c0FkZHIgPSAoKFNLX1U2NCkgcFJ4ZC0+VkRhdGFIaWdoKSA8PCAoU0tfVTY0KTMyOworCVBoeXNBZGRyIHw9IChTS19VNjQpIHBSeGQtPlZEYXRhTG93OworCXBjaV91bm1hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJIFBoeXNBZGRyLAorCQkJIHBBQy0+UnhCdWZTaXplIC0gMiwKKwkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCURFVl9LRlJFRV9TS0JfSVJRKHBSeGQtPnBNQnVmKTsKKwlwUnhkLT5wTUJ1ZiA9IE5VTEw7CisJcFJ4UG9ydC0+UnhkUmluZ0ZyZWUrKzsKKwlwUnhQb3J0LT5wUnhkUmluZ0hlYWQgPSBwUnhkLT5wTmV4dFJ4ZDsKKwlnb3RvIHJ4X3N0YXJ0OworCit9IC8qIFJlY2VpdmVJcnEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJQ2xlYXJBbmRTdGFydFJ4IC0gZ2l2ZSBhIHN0YXJ0IHJlY2VpdmUgY29tbWFuZCB0byBCTVUsIGNsZWFyIElSUQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHN0YXJ0IGNvbW1hbmQgYW5kIGEgY2xlYXIgaW50ZXJydXB0CisgKgljb21tYW5kIGZvciBvbmUgcmVjZWl2ZSBxdWV1ZSB0byB0aGUgQk1VLgorICoKKyAqIFJldHVybnM6IE4vQQorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBDbGVhckFuZFN0YXJ0UngoCitTS19BQwkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0ICovCitpbnQJUG9ydEluZGV4KQkvKiBpbmRleCBvZiB0aGUgcmVjZWl2ZSBwb3J0IChYTUFDKSAqLworeworCVNLX09VVDgocEFDLT5Jb0Jhc2UsCisJCVJ4UXVldWVBZGRyW1BvcnRJbmRleF0rUV9DU1IsCisJCUNTUl9TVEFSVCB8IENTUl9JUlFfQ0xfRik7Cit9IC8qIENsZWFyQW5kU3RhcnRSeCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlDbGVhclR4SXJxIC0gZ2l2ZSBhIGNsZWFyIHRyYW5zbWl0IElSUSBjb21tYW5kIHRvIEJNVQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGNsZWFyIHR4IElSUSBjb21tYW5kIGZvciBvbmUKKyAqCXRyYW5zbWl0IHF1ZXVlIHRvIHRoZSBCTVUuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIENsZWFyVHhJcnEoCitTS19BQwkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0ICovCitpbnQJUG9ydEluZGV4LAkvKiBpbmRleCBvZiB0aGUgdHJhbnNtaXQgcG9ydCAoWE1BQykgKi8KK2ludAlQcmlvKQkJLyogcHJpb3JpdHkgb3Igbm9ybWFsIHF1ZXVlICovCit7CisJU0tfT1VUOChwQUMtPklvQmFzZSwgCisJCVR4UXVldWVBZGRyW1BvcnRJbmRleF1bUHJpb10rUV9DU1IsCisJCUNTUl9JUlFfQ0xfRik7Cit9IC8qIENsZWFyVHhJcnEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJQ2xlYXJSeFJpbmcgLSByZW1vdmUgYWxsIGJ1ZmZlcnMgZnJvbSB0aGUgcmVjZWl2ZSByaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYWxsIHJlY2VpdmUgYnVmZmVycyBmcm9tIHRoZSByaW5nLgorICoJVGhlIHJlY2VpdmUgQk1VIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBDbGVhclJ4UmluZygKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworUlhfUE9SVAkqcFJ4UG9ydCkJLyogcG9pbnRlciB0byByeCBwb3J0IHN0cnVjdCAqLworeworUlhECQkqcFJ4ZDsJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBkZXNjcmlwdG9yICovCit1bnNpZ25lZCBsb25nCUZsYWdzOworU0tfVTY0CQlQaHlzQWRkcjsKKworCWlmIChwUnhQb3J0LT5SeGRSaW5nRnJlZSA9PSBwQUMtPlJ4RGVzY3JQZXJSaW5nKSB7CisJCXJldHVybjsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBSeFBvcnQtPlJ4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwlwUnhkID0gcFJ4UG9ydC0+cFJ4ZFJpbmdIZWFkOworCWRvIHsKKwkJaWYgKHBSeGQtPnBNQnVmICE9IE5VTEwpIHsKKworCQkJUGh5c0FkZHIgPSAoKFNLX1U2NCkgcFJ4ZC0+VkRhdGFIaWdoKSA8PCAoU0tfVTY0KTMyOworCQkJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFJ4ZC0+VkRhdGFMb3c7CisJCQlwY2lfdW5tYXBfcGFnZShwQUMtPlBjaURldiwKKwkJCQkJIFBoeXNBZGRyLAorCQkJCQkgcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCURFVl9LRlJFRV9TS0IocFJ4ZC0+cE1CdWYpOworCQkJcFJ4ZC0+cE1CdWYgPSBOVUxMOworCQl9CisJCXBSeGQtPlJCQ29udHJvbCAmPSBCTVVfT1dOOworCQlwUnhkID0gcFJ4ZC0+cE5leHRSeGQ7CisJCXBSeFBvcnQtPlJ4ZFJpbmdGcmVlKys7CisJfSB3aGlsZSAocFJ4ZCAhPSBwUnhQb3J0LT5wUnhkUmluZ1RhaWwpOworCXBSeFBvcnQtPnBSeGRSaW5nVGFpbCA9IHBSeFBvcnQtPnBSeGRSaW5nSGVhZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwUnhQb3J0LT5SeERlc1JpbmdMb2NrLCBGbGFncyk7Cit9IC8qIENsZWFyUnhSaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUNsZWFyVHhSaW5nIC0gcmVtb3ZlIGFsbCBidWZmZXJzIGZyb20gdGhlIHRyYW5zbWl0IHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgdHJhbnNtaXQgYnVmZmVycyBmcm9tIHRoZSByaW5nLgorICoJVGhlIHRyYW5zbWl0IEJNVSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICoJYW5kIHRyYW5zbWl0dGluZyBhdCB0aGUgdXBwZXIgbGV2ZWwgbXVzdCBiZSBkaXNhYmxlZC4KKyAqCVRoZSBCTVUgb3duIGJpdCBvZiBhbGwgZGVzY3JpcHRvcnMgaXMgY2xlYXJlZCwgdGhlIHJlc3QgaXMKKyAqCWRvbmUgYnkgY2FsbGluZyBGcmVlVHhEZXNjcmlwdG9ycy4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgQ2xlYXJUeFJpbmcoCitTS19BQwkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1RYX1BPUlQJKnBUeFBvcnQpCS8qIHBvaW50ZXIgdG8gdHggcHJ0IHN0cnVjdCAqLworeworVFhECQkqcFR4ZDsJCS8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVzY3JpcHRvciAqLworaW50CQlpOwordW5zaWduZWQgbG9uZwlGbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJcFR4ZCA9IHBUeFBvcnQtPnBUeGRSaW5nSGVhZDsKKwlmb3IgKGk9MDsgaTxwQUMtPlR4RGVzY3JQZXJSaW5nOyBpKyspIHsKKwkJcFR4ZC0+VEJDb250cm9sICY9IH5CTVVfT1dOOworCQlwVHhkID0gcFR4ZC0+cE5leHRUeGQ7CisJfQorCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgcFR4UG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworfSAvKiBDbGVhclR4UmluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZVNldE1hY0FkZHIgLSBTZXQgdGhlIGhhcmR3YXJlIE1BQyBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIE1BQyBhZGRyZXNzIHVzZWQgYnkgdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlU2V0TWFjQWRkcihzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCB2b2lkICpwKQoreworCitERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKK1NLX0FDCSpwQUMgPSBwTmV0LT5wQUM7CisKK3N0cnVjdCBzb2NrYWRkcgkqYWRkciA9IHA7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworCQorCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlU2V0TWFjQWRkciBzdGFydHMgbm93Li4uXG4iKSk7CisJaWYobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsZGV2LT5hZGRyX2xlbik7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlpZiAocEFDLT5SbG10TmV0cyA9PSAyKQorCQlTa0FkZHJPdmVycmlkZShwQUMsIHBBQy0+SW9CYXNlLCBwTmV0LT5OZXROciwKKwkJCShTS19NQUNfQUREUiopZGV2LT5kZXZfYWRkciwgU0tfQUREUl9WSVJUVUFMX0FERFJFU1MpOworCWVsc2UKKwkJU2tBZGRyT3ZlcnJpZGUocEFDLCBwQUMtPklvQmFzZSwgcEFDLT5BY3RpdmVQb3J0LAorCQkJKFNLX01BQ19BRERSKilkZXYtPmRldl9hZGRyLCBTS19BRERSX1ZJUlRVQUxfQUREUkVTUyk7CisKKwkKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCXJldHVybiAwOworfSAvKiBTa0dlU2V0TWFjQWRkciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlU2V0UnhNb2RlIC0gc2V0IHJlY2VpdmUgbW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSByZWNlaXZlIG1vZGUgb2YgYW4gYWRhcHRlci4gVGhlIGFkYXB0ZXIKKyAqCXN1cHBvcnRzIHByb21pc2N1b3VzIG1vZGUsIGFsbG11bHRpY2FzdCBtb2RlIGFuZCBhIG51bWJlciBvZgorICoJbXVsdGljYXN0IGFkZHJlc3Nlcy4gSWYgbW9yZSBtdWx0aWNhc3QgYWRkcmVzc2VzIHRoZSBhdmFpbGFibGUKKyAqCWFyZSBzZWxlY3RlZCwgYSBoYXNoIGZ1bmN0aW9uIGluIHRoZSBoYXJkd2FyZSBpcyB1c2VkLgorICoKKyAqIFJldHVybnM6CisgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCisgKgkhPTAsIG9uIGVycm9yCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VTZXRSeE1vZGUoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldikKK3sKKworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKKworc3RydWN0IGRldl9tY19saXN0CSpwTWNMaXN0OworaW50CQkJaTsKK2ludAkJCVBvcnRJZHg7Cit1bnNpZ25lZCBsb25nCQlGbGFnczsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlU2V0UnhNb2RlIHN0YXJ0cyBub3cuLi4gIikpOworCisJcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJcEFDID0gcE5ldC0+cEFDOworCWlmIChwQUMtPlJsbXROZXRzID09IDEpCisJCVBvcnRJZHggPSBwQUMtPkFjdGl2ZVBvcnQ7CisJZWxzZQorCQlQb3J0SWR4ID0gcE5ldC0+TmV0TnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiUFJPTUlTQ1VPVVMgbW9kZVxuIikpOworCQlTa0FkZHJQcm9taXNjdW91c0NoYW5nZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LAorCQkJU0tfUFJPTV9NT0RFX0xMQyk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiQUxMTVVMVEkgbW9kZVxuIikpOworCQlTa0FkZHJQcm9taXNjdW91c0NoYW5nZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LAorCQkJU0tfUFJPTV9NT0RFX0FMTF9NQyk7CisJfSBlbHNlIHsKKwkJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCwKKwkJCVNLX1BST01fTU9ERV9OT05FKTsKKwkJU2tBZGRyTWNDbGVhcihwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LCAwKTsKKworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCQkoIk51bWJlciBvZiBNQyBlbnRyaWVzOiAlZCAiLCBkZXYtPm1jX2NvdW50KSk7CisJCQorCQlwTWNMaXN0ID0gZGV2LT5tY19saXN0OworCQlmb3IgKGk9MDsgaTxkZXYtPm1jX2NvdW50OyBpKyssIHBNY0xpc3QgPSBwTWNMaXN0LT5uZXh0KSB7CisJCQlTa0FkZHJNY0FkZChwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LAorCQkJCShTS19NQUNfQUREUiopcE1jTGlzdC0+ZG1pX2FkZHIsIDApOworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX01DQSwKKwkJCQkoIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzBdLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzFdLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzJdLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzNdLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzRdLAorCQkJCXBNY0xpc3QtPmRtaV9hZGRyWzVdKSk7CisJCX0KKwkJU2tBZGRyTWNVcGRhdGUocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCisJcmV0dXJuOworfSAvKiBTa0dlU2V0UnhNb2RlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VDaGFuZ2VNdHUgLSBzZXQgdGhlIE1UVSB0byBhbm90aGVyIHZhbHVlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBNVFUgc2l6ZSBpcyBjaGFuZ2VkCisgKgkoaWZjb25maWcgbXR1IHh4eCBkZXYgZXRoWCkuIElmIHRoZSBNVFUgaXMgYmlnZ2VyIHRoYW4gc3RhbmRhcmQKKyAqCWV0aGVybmV0IE1UVSBzaXplLCBsb25nIGZyYW1lIHN1cHBvcnQgaXMgYWN0aXZhdGVkLgorICoKKyAqIFJldHVybnM6CisgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCisgKgkhPTAsIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tHZUNoYW5nZU10dShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBpbnQgTmV3TXR1KQoreworREVWX05FVAkJKnBOZXQ7CitERVZfTkVUCQkqcE90aGVyTmV0OworU0tfQUMJCSpwQUM7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworaW50CQlpOworU0tfRVZQQVJBIAlFdlBhcmE7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZUNoYW5nZU10dSBzdGFydHMgbm93Li4uXG4iKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgID0gcE5ldC0+cEFDOworCisJaWYgKChOZXdNdHUgPCA2OCkgfHwgKE5ld010dSA+IFNLX0pVTUJPX01UVSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYocEFDLT5Cb2FyZExldmVsICE9IFNLX0lOSVRfUlVOKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCWlmIChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfQUNUSVZFKSB7CisJCWlmIChwQUMtPkRpYWdGbG93Q3RybCA9PSBTS19GQUxTRSkgeworCQkJcmV0dXJuIC0xOyAvKiBzdGlsbCBpbiB1c2UsIGRlbnkgYW55IGFjdGlvbnMgb2YgTVRVICovCisJCX0gZWxzZSB7CisJCQlwQUMtPkRpYWdGbG93Q3RybCA9IFNLX0ZBTFNFOworCQl9CisJfQorI2VuZGlmCisKKwlwTmV0LT5NdHUgPSBOZXdNdHU7CisJcE90aGVyTmV0ID0gbmV0ZGV2X3ByaXYocEFDLT5kZXZbMSAtIHBOZXQtPk5ldE5yXSk7CisJaWYgKChwT3RoZXJOZXQtPk10dT4xNTAwKSAmJiAoTmV3TXR1PD0xNTAwKSAmJiAocE90aGVyTmV0LT5VcD09MSkpIHsKKwkJcmV0dXJuKDApOworCX0KKworCXBBQy0+UnhCdWZTaXplID0gTmV3TXR1ICsgMzI7CisJZGV2LT5tdHUgPSBOZXdNdHU7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiTmV3IE1UVTogJWRcbiIsIE5ld010dSkpOworCisJLyogCisJKiogUHJldmVudCBhbnkgcmVjb25maWd1cmF0aW9uIHdoaWxlIGNoYW5naW5nIHRoZSBNVFUgCisJKiogYnkgZGlzYWJsaW5nIGFueSBpbnRlcnJ1cHRzIAorCSovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCisJLyogCisJKiogTm90aWZ5IFJMTVQgdGhhdCBhbnkgcG9ydHMgYXJlIHRvIGJlIHN0b3BwZWQKKwkqLworCUV2UGFyYS5QYXJhMzJbMF0gPSAgMDsKKwlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMiApICYmIChwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlFdlBhcmEuUGFyYTMyWzBdID0gIDE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCX0gZWxzZSB7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCX0KKworCS8qCisJKiogQWZ0ZXIgY2FsbGluZyB0aGUgU2tFdmVudERpc3BhdGNoZXIoKSwgUkxNVCBpcyBhd2FyZSBhYm91dAorCSoqIHRoZSBzdG9wcGVkIHBvcnRzIC0+IGNvbmZpZ3VyYXRpb24gY2FuIHRha2UgcGxhY2UhCisJKi8KKwlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKworCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCXNwaW5fbG9jaygmcEFDLT5UeFBvcnRbaV1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQluZXRpZl9zdG9wX3F1ZXVlKHBBQy0+ZGV2W2ldKTsKKworCX0KKworCS8qCisJKiogRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIE1UVSBzaXplIGNoYW5nZSwgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIAorCSoqIFJYIGJ1ZmZlcnMgbmVlZCB0byBiZSBhbGxvY2F0ZWQKKwkqLworCWlmIChOZXdNdHUgPiAxNTAwKSB7CisJICAgIC8qIAorCSAgICAqKiBVc2UgbGVzcyByeCBidWZmZXJzIAorCSAgICAqLworCSAgICBmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJICAgIHBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gIHBBQy0+UnhEZXNjclBlclJpbmcgLQorCQkJCQkJIChwQUMtPlJ4RGVzY3JQZXJSaW5nIC8gNCk7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoaSA9PSBwQUMtPkFjdGl2ZVBvcnQpIHsKKwkJCXBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gcEFDLT5SeERlc2NyUGVyUmluZyAtIAorCQkJCQkJICAgIChwQUMtPlJ4RGVzY3JQZXJSaW5nIC8gNCk7CisJCSAgICB9IGVsc2UgeworCQkJcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSBwQUMtPlJ4RGVzY3JQZXJSaW5nIC0gCisJCQkJCQkgICAgKHBBQy0+UnhEZXNjclBlclJpbmcgLyAxMCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8qIAorCSAgICAqKiBVc2UgdGhlIG5vcm1hbCBhbW91bnQgb2YgcnggYnVmZmVycyAKKwkgICAgKi8KKwkgICAgZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMiApICYmIChwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCSAgICBwQUMtPlJ4UG9ydFtpXS5SeEZpbGxMaW1pdCA9IDE7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoaSA9PSBwQUMtPkFjdGl2ZVBvcnQpIHsKKwkJCXBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gMTsKKwkJICAgIH0gZWxzZSB7CisJCQlwQUMtPlJ4UG9ydFtpXS5SeEZpbGxMaW1pdCA9IHBBQy0+UnhEZXNjclBlclJpbmcgLQorCQkJCQkJICAgIChwQUMtPlJ4RGVzY3JQZXJSaW5nIC8gNCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwkKKwlTa0dlRGVJbml0KHBBQywgcEFDLT5Jb0Jhc2UpOworCisJLyoKKwkqKiBlbmFibGUvZGlzYWJsZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBsb25nIGZyYW1lcworCSovCisJaWYgKE5ld010dSA+IDE1MDApIHsKKy8vIHBBQy0+SnVtYm9BY3RpdmF0ZWQgPSBTS19UUlVFOyAvKiBpcyBuZXZlciBzZXQgYmFjayAhISEgKi8KKwkJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfSlVNQk9fTElOSzsKKwl9IGVsc2UgeworCSAgICBpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfTVVMX0xJTks7CisJICAgIH0gZWxzZSB7CisJCXBBQy0+R0luaS5HSVBvcnRVc2FnZSA9IFNLX1JFRF9MSU5LOworCSAgICB9CisJfQorCisJU2tHZUluaXQoICAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tJMmNJbml0KCAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tFdmVudEluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tQbm1pSW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tBZGRySW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tSbG10SW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJU2tUaW1lckluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCisJLyoKKwkqKiB0c2NoaWxsaW5nOgorCSoqIFNwZWVkIGFuZCBvdGhlcnMgYXJlIHNldCBiYWNrIHRvIGRlZmF1bHQgaW4gbGV2ZWwgMSBpbml0IQorCSovCisJR2V0Q29uZmlndXJhdGlvbihwQUMpOworCQorCVNrR2VJbml0KCAgIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tFdmVudEluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrUG5taUluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa0FkZHJJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tSbG10SW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrVGltZXJJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKworCS8qCisJKiogY2xlYXIgYW5kIHJlaW5pdCB0aGUgcnggcmluZ3MgaGVyZQorCSovCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFtpXSwgU0tfVFJVRSk7CisJCUNsZWFyUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKwkJRmlsbFJ4UmluZyhwQUMsICZwQUMtPlJ4UG9ydFtpXSk7CisKKwkJLyogCisJCSoqIEVuYWJsZSB0cmFuc21pdCBkZXNjcmlwdG9yIHBvbGxpbmcKKwkJKi8KKwkJU2tHZVBvbGxUeEQocEFDLCBwQUMtPklvQmFzZSwgaSwgU0tfVFJVRSk7CisJCUZpbGxSeFJpbmcocEFDLCAmcEFDLT5SeFBvcnRbaV0pOworCX07CisKKwlTa0dlWWVsbG93TEVEKHBBQywgcEFDLT5Jb0Jhc2UsIDEpOworCVNrRGltRW5hYmxlTW9kZXJhdGlvbklmTmVlZGVkKHBBQyk7CQorCVNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhwQUMpOworCisJbmV0aWZfc3RhcnRfcXVldWUocEFDLT5kZXZbcE5ldC0+UG9ydE5yXSk7CisJZm9yIChpPXBBQy0+R0luaS5HSU1hY3NGb3VuZC0xOyBpPj0wOyBpLS0pIHsKKwkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0W2ldW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwl9CisKKwkvKiAKKwkqKiBFbmFibGUgSW50ZXJydXB0cyBhZ2FpbiAKKwkqLworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrKTsKKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSFdFX0lNU0ssIElSUV9IV0VfTUFTSyk7CisKKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RBUlQsIEV2UGFyYSk7CisJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisKKwkvKiAKKwkqKiBOb3RpZnkgUkxNVCBhYm91dCB0aGUgY2hhbmdpbmcgYW5kIHJlc3RhcnRpbmcgb25lIChvciBtb3JlKSBwb3J0cworCSovCisJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMiApICYmIChwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXROZXRzOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TRVRfTkVUUywgRXZQYXJhKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBOZXQtPlBvcnROcjsKKwkJRXZQYXJhLlBhcmEzMlsxXSA9IC0xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RBUlQsIEV2UGFyYSk7CisJCQkKKwkJaWYgKHBPdGhlck5ldC0+VXApIHsKKwkJCUV2UGFyYS5QYXJhMzJbMF0gPSBwT3RoZXJOZXQtPlBvcnROcjsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwkJfQorCX0gZWxzZSB7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwl9CisKKwlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQorCS8qCisJKiogV2hpbGUgdGVzdGluZyB0aGlzIGRyaXZlciB3aXRoIGxhdGVzdCBrZXJuZWwgMi41ICgyLjUuNzApLCBpdCAKKwkqKiBzZWVtcyBhcyBpZiB1cHBlciBsYXllcnMgaGF2ZSBhIHByb2JsZW0gdG8gaGFuZGxlIGEgc3VjY2Vzc2Z1bAorCSoqIHJldHVybiB2YWx1ZSBvZiAnMCcuIElmIHN1Y2ggYSB6ZXJvIGlzIHJldHVybmVkLCB0aGUgY29tcGxldGUgCisJKiogc3lzdGVtIGhhbmdzIGZvciBzZXZlcmFsIG1pbnV0ZXMgKCEpLCB3aGljaCBpcyBpbiBhY2NlcHRhYmxlLgorCSoqCisJKiogQ3VycmVudGx5IGl0IGlzIG5vdCBjbGVhciwgd2hhdCB0aGUgZXhhY3QgcmVhc29uIGZvciB0aGlzIHByb2JsZW0KKwkqKiBpcy4gVGhlIGltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIDIuNSBpcyB0byByZXR1cm4gdGhlIGRlc2lyZWQgCisJKiogbmV3IE1UVSBzaXplIGlmIGFsbCBuZWVkZWQgY2hhbmdlcyBmb3IgdGhlIG5ldyBNVFUgc2l6ZSB3aGVyZSAKKwkqKiBwZXJmb3JtZWQuIEluIGtlcm5lbHMgMi4yIGFuZCAyLjQsIGEgemVybyB2YWx1ZSBpcyByZXR1cm5lZCwKKwkqKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY2hhbmdlIG9mIHRoZSBtdHUtc2l6ZS4KKwkqLworCXJldHVybiBOZXdNdHU7CisKK30gLyogU2tHZUNoYW5nZU10dSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlU3RhdHMgLSByZXR1cm4gZXRoZXJuZXQgZGV2aWNlIHN0YXRpc3RpY3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJuIHN0YXRpc3RpYyBkYXRhIGFib3V0IHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqCXRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorICoKKyAqIFJldHVybnM6CisgKglwb2ludGVyIHRvIHRoZSBzdGF0aXN0aWMgc3RydWN0dXJlLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlNrR2VTdGF0cyhzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworREVWX05FVCAqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CitTS19BQwkqcEFDID0gcE5ldC0+cEFDOworU0tfUE5NSV9TVFJVQ1RfREFUQSAqcFBubWlTdHJ1Y3Q7ICAgICAgIC8qIHN0cnVjdHVyZSBmb3IgYWxsIFBubWktRGF0YSAqLworU0tfUE5NSV9TVEFUICAgICpwUG5taVN0YXQ7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdmlydHVhbCBYTUFDIHN0YXQuIGRhdGEgKi8KK1NLX1BOTUlfQ09ORiAgICAqcFBubWlDb25mOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHZpcnR1YWwgbGluayBjb25maWcuICovCit1bnNpZ25lZCBpbnQgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBwbm1pIHN0cnVjdCAqLwordW5zaWduZWQgbG9uZwlGbGFnczsJCQkvKiBmb3Igc3BpbiBsb2NrICovCisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZVN0YXRzIHN0YXJ0cyBub3cuLi5cbiIpKTsKKwlwUG5taVN0cnVjdCA9ICZwQUMtPlBubWlTdHJ1Y3Q7CisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKyAgICAgICAgaWYgKChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfTk9UQUNUSVZFKSAmJgorICAgICAgICAgICAgICAgIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9SVU4pKSB7CisjZW5kaWYKKyAgICAgICAgU0tfTUVNU0VUKHBQbm1pU3RydWN0LCAwLCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKyAgICAgICAgU2l6ZSA9IFNLX1BOTUlfU1RSVUNUX1NJWkU7CisJCVNrUG5taUdldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCBwUG5taVN0cnVjdCwgJlNpemUsIHBOZXQtPk5ldE5yKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwl9CisjZW5kaWYKKworICAgICAgICBwUG5taVN0YXQgPSAmcFBubWlTdHJ1Y3QtPlN0YXRbMF07CisgICAgICAgIHBQbm1pQ29uZiA9ICZwUG5taVN0cnVjdC0+Q29uZlswXTsKKworCXBBQy0+c3RhdHMucnhfcGFja2V0cyA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5SeERlbGl2ZXJlZEN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy50eF9wYWNrZXRzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhPa0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9ieXRlcyA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5SeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwlwQUMtPnN0YXRzLnR4X2J5dGVzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhPY3RldHNPa0N0czsKKwkKKyAgICAgICAgaWYgKHBOZXQtPk10dSA8PSAxNTAwKSB7CisgICAgICAgICAgICAgICAgcEFDLT5zdGF0cy5yeF9lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgJiAweEZGRkZGRkZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBBQy0+c3RhdHMucnhfZXJyb3JzID0gKFNLX1UzMikgKChwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgcFBubWlTdGF0LT5TdGF0UnhUb29Mb25nQ3RzKSAmIDB4RkZGRkZGRkYpOworCX0KKworCisJaWYgKHBBQy0+R0luaS5HUFswXS5QaHlUeXBlID09IFNLX1BIWV9YTUFDICYmIHBBQy0+SFdSZXZpc2lvbiA8IDEyKQorCQlwQUMtPnN0YXRzLnJ4X2Vycm9ycyA9IHBBQy0+c3RhdHMucnhfZXJyb3JzIC0gcFBubWlTdGF0LT5TdGF0UnhTaG9ydHNDdHM7CisKKwlwQUMtPnN0YXRzLnR4X2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAoU0tfVTMyKSBwUG5taVN0cnVjdC0+UnhOb0J1ZkN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy50eF9kcm9wcGVkID0gKFNLX1UzMikgcFBubWlTdHJ1Y3QtPlR4Tm9CdWZDdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMubXVsdGljYXN0ID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhNdWx0aWNhc3RPa0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5jb2xsaXNpb25zID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMgJiAweEZGRkZGRkZGOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworCXBBQy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4UnVudEN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4Rmlmb092ZXJmbG93Q3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeEZjc0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeEZyYW1pbmdDdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeEZpZm9PdmVyZmxvd0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhNaXNzZWRDdHMgJiAweEZGRkZGRkZGOworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJcEFDLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IChTS19VMzIpIDA7CisJcEFDLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFR4Q2FycmllckN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFR4Rmlmb1VuZGVycnVuQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeENhcnJpZXJDdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IChTS19VMzIpIDA7CisKKwlyZXR1cm4oJnBBQy0+c3RhdHMpOworfSAvKiBTa0dlU3RhdHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUlvY3RsIC0gSU8tY29udHJvbCBmdW5jdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgYW4gaW9jdGwgaXMgaXNzdWVkIG9uIHRoZSBkZXZpY2UuCisgKglUaGVyZSBhcmUgdGhyZWUgc3ViZnVuY3Rpb24gZm9yIHJlYWRpbmcsIHdyaXRpbmcgYW5kIHRlc3Qtd3JpdGluZworICoJdGhlIHByaXZhdGUgTUlCIGRhdGEgc3RydWN0dXJlICh1c2VmdWxsIGZvciBTeXNLb25uZWN0LWludGVybmFsIHRvb2xzKS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCwgaWYgZXZlcnl0aGluZyBpcyBvaworICoJIT0wLCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrR2VJb2N0bChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKK3ZvaWQJCSpwTWVtQnVmOworc3RydWN0IHBjaV9kZXYgICpwZGV2ID0gTlVMTDsKK1NLX0dFX0lPQ1RMCUlvY3RsOwordW5zaWduZWQgaW50CUVyciA9IDA7CitpbnQJCVNpemUgPSAwOworaW50ICAgICAgICAgICAgIFJldCA9IDA7Cit1bnNpZ25lZCBpbnQJTGVuZ3RoID0gMDsKK2ludAkJSGVhZGVyTGVuZ3RoID0gc2l6ZW9mKFNLX1UzMikgKyBzaXplb2YoU0tfVTMyKTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlSW9jdGwgc3RhcnRzIG5vdy4uLlxuIikpOworCisJcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJcEFDID0gcE5ldC0+cEFDOworCQorCWlmKGNvcHlfZnJvbV91c2VyKCZJb2N0bCwgcnEtPmlmcl9kYXRhLCBzaXplb2YoU0tfR0VfSU9DVEwpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTS19JT0NUTF9TRVRNSUI6CisJY2FzZSBTS19JT0NUTF9QUkVTRVRNSUI6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKyAJY2FzZSBTS19JT0NUTF9HRVRNSUI6CisJCWlmKGNvcHlfZnJvbV91c2VyKCZwQUMtPlBubWlTdHJ1Y3QsIElvY3RsLnBEYXRhLAorCQkJSW9jdGwuTGVuPHNpemVvZihwQUMtPlBubWlTdHJ1Y3QpPworCQkJSW9jdGwuTGVuIDogc2l6ZW9mKHBBQy0+UG5taVN0cnVjdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlTaXplID0gU2tHZUlvY01pYihwTmV0LCBJb2N0bC5MZW4sIGNtZCk7CisJCWlmKGNvcHlfdG9fdXNlcihJb2N0bC5wRGF0YSwgJnBBQy0+UG5taVN0cnVjdCwKKwkJCUlvY3RsLkxlbjxTaXplPyBJb2N0bC5MZW4gOiBTaXplKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSW9jdGwuTGVuID0gU2l6ZTsKKwkJaWYoY29weV90b191c2VyKHJxLT5pZnJfZGF0YSwgJklvY3RsLCBzaXplb2YoU0tfR0VfSU9DVEwpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTS19JT0NUTF9HRU46CisJCWlmIChJb2N0bC5MZW4gPCAoc2l6ZW9mKHBBQy0+UG5taVN0cnVjdCkgKyBIZWFkZXJMZW5ndGgpKSB7CisJCQlMZW5ndGggPSBJb2N0bC5MZW47CisJCX0gZWxzZSB7CisJCQlMZW5ndGggPSBzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aDsKKwkJfQorCQlpZiAoTlVMTCA9PSAocE1lbUJ1ZiA9IGttYWxsb2MoTGVuZ3RoLCBHRlBfS0VSTkVMKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmKGNvcHlfZnJvbV91c2VyKHBNZW1CdWYsIElvY3RsLnBEYXRhLCBMZW5ndGgpKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KKwkJaWYgKChSZXQgPSBTa1BubWlHZW5Jb2N0bChwQUMsIHBBQy0+SW9CYXNlLCBwTWVtQnVmLCAmTGVuZ3RoLCAwKSkgPCAwKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KKwkJaWYoY29weV90b191c2VyKElvY3RsLnBEYXRhLCBwTWVtQnVmLCBMZW5ndGgpICkgeworCQkJRXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmF1bHRfZ2VuOworCQl9CisJCUlvY3RsLkxlbiA9IExlbmd0aDsKKwkJaWYoY29weV90b191c2VyKHJxLT5pZnJfZGF0YSwgJklvY3RsLCBzaXplb2YoU0tfR0VfSU9DVEwpKSkgeworCQkJRXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmF1bHRfZ2VuOworCQl9CitmYXVsdF9nZW46CisJCWtmcmVlKHBNZW1CdWYpOyAvKiBjbGVhbnVwIGV2ZXJ5dGhpbmcgKi8KKwkJYnJlYWs7CisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisgICAgICAgY2FzZSBTS19JT0NUTF9ESUFHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJCWlmIChJb2N0bC5MZW4gPCAoc2l6ZW9mKHBBQy0+UG5taVN0cnVjdCkgKyBIZWFkZXJMZW5ndGgpKSB7CisJCQlMZW5ndGggPSBJb2N0bC5MZW47CisJCX0gZWxzZSB7CisJCQlMZW5ndGggPSBzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aDsKKwkJfQorCQlpZiAoTlVMTCA9PSAocE1lbUJ1ZiA9IGttYWxsb2MoTGVuZ3RoLCBHRlBfS0VSTkVMKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmKGNvcHlfZnJvbV91c2VyKHBNZW1CdWYsIElvY3RsLnBEYXRhLCBMZW5ndGgpKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9kaWFnOworCQl9CisJCXBkZXYgPSBwQUMtPlBjaURldjsKKwkJTGVuZ3RoID0gMyAqIHNpemVvZihTS19VMzIpOyAgLyogRXJyb3IsIEJ1cyBhbmQgRGV2aWNlICovCisJCS8qIAorCQkqKiBXaGlsZSBjb2RpbmcgdGhpcyBuZXcgSU9DVEwgaW50ZXJmYWNlLCBvbmx5IGEgZmV3IGxpbmVzIG9mIGNvZGUKKwkJKiogYXJlIHRvIHRvIGJlIGFkZGVkLiBUaGVyZWZvcmUgbm8gZGVkaWNhdGVkIGZ1bmN0aW9uIGhhcyBiZWVuIAorCQkqKiBhZGRlZC4gSWYgbW9yZSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkLCBhIHNlcGFyYXRlIGZ1bmN0aW9uIAorCQkqKiBzaG91bGQgYmUgdXNlZC4uLgorCQkqLworCQkqICgoU0tfVTMyICopcE1lbUJ1ZikgPSAwOworCQkqICgoU0tfVTMyICopcE1lbUJ1ZiArIDEpID0gcGRldi0+YnVzLT5udW1iZXI7CisJCSogKChTS19VMzIgKilwTWVtQnVmICsgMikgPSBQYXJzZURldmljZU5ickZyb21TbG90TmFtZShwY2lfbmFtZShwZGV2KSk7CisJCWlmKGNvcHlfdG9fdXNlcihJb2N0bC5wRGF0YSwgcE1lbUJ1ZiwgTGVuZ3RoKSApIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2RpYWc7CisJCX0KKwkJSW9jdGwuTGVuID0gTGVuZ3RoOworCQlpZihjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmSW9jdGwsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9kaWFnOworCQl9CitmYXVsdF9kaWFnOgorCQlrZnJlZShwTWVtQnVmKTsgLyogY2xlYW51cCBldmVyeXRoaW5nICovCisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJRXJyID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuKEVycik7CisKK30gLyogU2tHZUlvY3RsICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VJb2NNaWIgLSBoYW5kbGUgYSBHZXRNaWIsIFNldE1pYi0gb3IgUHJlc2V0TWliLWlvY3RsIG1lc3NhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVhZHMvd3JpdGVzIHRoZSBNSUIgZGF0YSB1c2luZyBQTk1JIChQcml2YXRlIE5ldHdvcmsKKyAqCU1hbmFnZW1lbnQgSW50ZXJmYWNlKS4KKyAqCVRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgbXVzdCBiZSBwcm92aWRlZCB3aXRoIHRoZQorICoJaW9jdGwgY2FsbCBhbmQgaXMgZ2l2ZW4gdG8gdGhlIGRyaXZlciBpbiB0aGUgZm9ybSBvZgorICoJYSB1c2VyIHNwYWNlIGFkZHJlc3MuCisgKglDb3B5aW5nIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgZGF0YSBhcmVhIGludG8ga2VybmVsIG1lc3NhZ2VzCisgKglhbmQgYmFjayBpcyBkb25lIGJ5IGNvcHlfZnJvbV91c2VyIGFuZCBjb3B5X3RvX3VzZXIgY2FsbHMgaW4KKyAqCVNrR2VJb2N0bC4KKyAqCisgKiBSZXR1cm5zOgorICoJcmV0dXJuZWQgc2l6ZSBmcm9tIFBOTUkgY2FsbAorICovCitzdGF0aWMgaW50IFNrR2VJb2NNaWIoCitERVZfTkVUCQkqcE5ldCwJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQJU2l6ZSwJLyogbGVuZ3RoIG9mIGlvY3RsIGRhdGEgKi8KK2ludAkJbW9kZSkJLyogZmxhZyBmb3Igc2V0L3ByZXNldCAqLworewordW5zaWduZWQgbG9uZwlGbGFnczsJLyogZm9yIHNwaW4gbG9jayAqLworU0tfQUMJCSpwQUM7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZUlvY01pYiBzdGFydHMgbm93Li4uXG4iKSk7CisJcEFDID0gcE5ldC0+cEFDOworCS8qIGFjY2VzcyBNSUIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgU0tfSU9DVExfR0VUTUlCOgorCQlTa1BubWlHZXRTdHJ1Y3QocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+UG5taVN0cnVjdCwgJlNpemUsCisJCQlwTmV0LT5OZXROcik7CisJCWJyZWFrOworCWNhc2UgU0tfSU9DVExfUFJFU0VUTUlCOgorCQlTa1BubWlQcmVTZXRTdHJ1Y3QocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+UG5taVN0cnVjdCwgJlNpemUsCisJCQlwTmV0LT5OZXROcik7CisJCWJyZWFrOworCWNhc2UgU0tfSU9DVExfU0VUTUlCOgorCQlTa1BubWlTZXRTdHJ1Y3QocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+UG5taVN0cnVjdCwgJlNpemUsCisJCQlwTmV0LT5OZXROcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJNSUIgZGF0YSBhY2Nlc3Mgc3VjY2VlZGVkXG4iKSk7CisJcmV0dXJuIChTaXplKTsKK30gLyogU2tHZUlvY01pYiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlHZXRDb25maWd1cmF0aW9uIC0gcmVhZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIHBlci1hZGFwdGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbQorICoJdGhlIG9wdGlvbnMgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiBSZXR1cm5zOgorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBHZXRDb25maWd1cmF0aW9uKAorU0tfQUMJKnBBQykJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdHVyZSAqLworeworU0tfSTMyCVBvcnQ7CQkvKiBwcmVmZXJyZWQgcG9ydCAqLworU0tfQk9PTAlBdXRvU2V0OworU0tfQk9PTCBEdXBTZXQ7CitpbnQJTGlua1NwZWVkICAgICAgICAgID0gU0tfTFNQRUVEX0FVVE87CS8qIExpbmsgc3BlZWQgKi8KK2ludAlBdXRvTmVnICAgICAgICAgICAgPSAxOwkJCS8qIGF1dG9uZWcgb2ZmICgwKSBvciBvbiAoMSkgKi8KK2ludAlEdXBsZXhDYXAgICAgICAgICAgPSAwOwkJCS8qIDA9Ym90aCwxPWZ1bGwsMj1oYWxmICovCitpbnQJRmxvd0N0cmwgICAgICAgICAgID0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CS8qIEZsb3dDb250cm9sICAqLworaW50CU1TTW9kZSAgICAgICAgICAgICA9IFNLX01TX01PREVfQVVUTzsJLyogbWFzdGVyL3NsYXZlIG1vZGUgICAgKi8KKworU0tfQk9PTCBJc0NvblR5cGVEZWZpbmVkICAgPSBTS19UUlVFOworU0tfQk9PTCBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19UUlVFOworU0tfQk9PTCBJc0Zsb3dDdHJsRGVmaW5lZCAgPSBTS19UUlVFOworU0tfQk9PTCBJc1JvbGVEZWZpbmVkICAgICAgPSBTS19UUlVFOworU0tfQk9PTCBJc01vZGVEZWZpbmVkICAgICAgPSBTS19UUlVFOworLyoKKyAqCVRoZSB0d28gcGFyYW1ldGVycyBBdXRvTmVnLiBhbmQgRHVwbGV4Q2FwLiBtYXAgdG8gb25lIGNvbmZpZ3VyYXRpb24KKyAqCXBhcmFtZXRlci4gVGhlIG1hcHBpbmcgaXMgZGVzY3JpYmVkIGJ5IHRoaXMgdGFibGU6CisgKglEdXBsZXhDYXAgLT4JfAlib3RoCXwJZnVsbAl8CWhhbGYJfAorICoJQXV0b05lZwkJfAkJfAkJfAkJfAorICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCU9mZgkJfCAgICBpbGxlZ2FsCXwJRnVsbAl8CUhhbGYJfAorICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCU9uCQl8ICAgQXV0b0JvdGgJfCAgIEF1dG9GdWxsCXwgICBBdXRvSGFsZgl8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJU2Vuc2UJCXwgICBBdXRvU2Vuc2UJfCAgIEF1dG9TZW5zZQl8ICAgQXV0b1NlbnNlCXwKKyAqLworaW50CUNhcGFiaWxpdGllc1szXVszXSA9CisJCXsgeyAgICAgICAgICAgICAgICAtMSwgU0tfTE1PREVfRlVMTCAgICAgLCBTS19MTU9ERV9IQUxGICAgICB9LAorCQkgIHtTS19MTU9ERV9BVVRPQk9USCAsIFNLX0xNT0RFX0FVVE9GVUxMICwgU0tfTE1PREVfQVVUT0hBTEYgfSwKKwkJICB7U0tfTE1PREVfQVVUT1NFTlNFLCBTS19MTU9ERV9BVVRPU0VOU0UsIFNLX0xNT0RFX0FVVE9TRU5TRX0gfTsKKworI2RlZmluZSBEQ19CT1RICTAKKyNkZWZpbmUgRENfRlVMTCAxCisjZGVmaW5lIERDX0hBTEYgMgorI2RlZmluZSBBTl9PRkYJMAorI2RlZmluZSBBTl9PTgkxCisjZGVmaW5lIEFOX1NFTlMJMgorI2RlZmluZSBNX0N1cnJQb3J0IHBBQy0+R0luaS5HUFtQb3J0XQorCisKKwkvKgorCSoqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QgZm9yIGJvdGggcG9ydHMhCisJKi8KKwlmb3IgKFBvcnQgPSAwOyBQb3J0IDwgU0tfTUFYX01BQ1M7IFBvcnQrKykgeworCQlNX0N1cnJQb3J0LlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQU5fT05dW0RDX0JPVEhdOworCQlNX0N1cnJQb3J0LlBGbG93Q3RybE1vZGUgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfQVVUTzsKKwl9CisKKwkvKgorCSoqIENoZWNrIG1lcmdlZCBwYXJhbWV0ZXIgQ29uVHlwZS4gSWYgaXQgaGFzIG5vdCBiZWVuIHVzZWQsCisJKiogdmVyaWZ5IGFueSBvdGhlciBwYXJhbWV0ZXIgKGUuZy4gQXV0b05lZykgYW5kIHVzZSBkZWZhdWx0IHZhbHVlcy4gCisJKioKKwkqKiBTdGF0aW5nIGJvdGggQ29uVHlwZSBhbmQgb3RoZXIgbG93bGV2ZWwgbGluayBwYXJhbWV0ZXJzIGlzIGFsc28KKwkqKiBwb3NzaWJsZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIHBhc3NlZCBDb25UeXBlLXBhcmFtZXRlciBpcyAKKwkqKiBvdmVyd3JpdHRlbiBieSB0aGUgbG93bGV2ZWwgbGluayBwYXJhbWV0ZXIuCisJKioKKwkqKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkIGZvciBhIG1lcmdlZCBDb25UeXBlLXBhcmFtZXRlcjoKKwkqKgorCSoqIENvblR5cGUgICBEdXBDYXAgICBBdXRvTmVnICAgRmxvd0N0cmwgICAgICBSb2xlICAgICAgU3BlZWQKKwkqKiAtLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0tLSAgIC0tLS0tCisJKiogIEF1dG8gICAgICBCb3RoICAgICAgT24gICAgICBTeW1PclJlbSAgICAgIEF1dG8gICAgICAgQXV0bworCSoqICAxMDBGRCAgICAgRnVsbCAgICAgIE9mZiAgICAgICBOb25lICAgICAgPGlnbm9yZWQ+ICAgIDEwMAorCSoqICAxMDBIRCAgICAgSGFsZiAgICAgIE9mZiAgICAgICBOb25lICAgICAgPGlnbm9yZWQ+ICAgIDEwMAorCSoqICAxMEZEICAgICAgRnVsbCAgICAgIE9mZiAgICAgICBOb25lICAgICAgPGlnbm9yZWQ+ICAgIDEwCisJKiogIDEwSEQgICAgICBIYWxmICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAKKwkqKiAKKwkqKiBUaGlzIENvblR5cGUgcGFyYW1ldGVyIGlzIHVzZWQgZm9yIGFsbCBwb3J0cyBvZiB0aGUgYWRhcHRlciEKKwkqLworICAgICAgICBpZiAoIChDb25UeXBlICE9IE5VTEwpICAgICAgICAgICAgICAgICYmIAorCSAgICAgKHBBQy0+SW5kZXggPCBTS19NQVhfQ0FSRF9QQVJBTSkgJiYKKwkgICAgIChDb25UeXBlW3BBQy0+SW5kZXhdICE9IE5VTEwpICkgeworCisJCQkvKiBDaGVjayBjaGlwc2V0IGZhbWlseSAqLworCQkJaWYgKCghcEFDLT5DaGlwc2V0VHlwZSkgJiYgCisJCQkJKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCJBdXRvIikhPTApICYmCisJCQkJKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCIiKSE9MCkpIHsKKwkJCQkvKiBTZXQgdGhlIHNwZWVkIHBhcmFtZXRlciBiYWNrICovCisJCQkJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgIiAKKwkJCQkJCQkiZm9yIENvblR5cGUuIgorCQkJCQkJCSIgVXNpbmcgQXV0by5cbiIsIAorCQkJCQkJCUNvblR5cGVbcEFDLT5JbmRleF0pOworCisJCQkJCXNwcmludGYoQ29uVHlwZVtwQUMtPkluZGV4XSwgIkF1dG8iKTsJCisJCQl9CisKKwkJCQlpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCQlJc0NvblR5cGVEZWZpbmVkID0gU0tfRkFMU0U7IC8qIE5vIENvblR5cGUgZGVmaW5lZCAqLworCQkJCX0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PTl1bRENfQk9USF07CisJCQlNX0N1cnJQb3J0LlBGbG93Q3RybE1vZGUgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJCU1fQ3VyclBvcnQuUE1TTW9kZSAgICAgICA9IFNLX01TX01PREVfQVVUTzsKKwkJCU1fQ3VyclBvcnQuUExpbmtTcGVlZCAgICA9IFNLX0xTUEVFRF9BVVRPOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIjEwMEZEIik9PTApIHsKKwkJICAgIGZvciAoUG9ydCA9IDA7IFBvcnQgPCBTS19NQVhfTUFDUzsgUG9ydCsrKSB7CisJCQlNX0N1cnJQb3J0LlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQU5fT0ZGXVtEQ19GVUxMXTsKKwkJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQkJTV9DdXJyUG9ydC5QTGlua1NwZWVkICAgID0gU0tfTFNQRUVEXzEwME1CUFM7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiMTAwSEQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0hBTEZdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCIxMEZEIik9PTApIHsKKwkJICAgIGZvciAoUG9ydCA9IDA7IFBvcnQgPCBTS19NQVhfTUFDUzsgUG9ydCsrKSB7CisJCQlNX0N1cnJQb3J0LlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQU5fT0ZGXVtEQ19GVUxMXTsKKwkJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQkJTV9DdXJyUG9ydC5QTGlua1NwZWVkICAgID0gU0tfTFNQRUVEXzEwTUJQUzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCIxMEhEIik9PTApIHsKKwkJICAgIGZvciAoUG9ydCA9IDA7IFBvcnQgPCBTS19NQVhfTUFDUzsgUG9ydCsrKSB7CisJCQlNX0N1cnJQb3J0LlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQU5fT0ZGXVtEQ19IQUxGXTsKKwkJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQkJTV9DdXJyUG9ydC5QTGlua1NwZWVkICAgID0gU0tfTFNQRUVEXzEwTUJQUzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIENvblR5cGVcbiIsIAorCQkJQ29uVHlwZVtwQUMtPkluZGV4XSk7CisJCSAgICBJc0NvblR5cGVEZWZpbmVkID0gU0tfRkFMU0U7IC8qIFdyb25nIENvblR5cGUgZGVmaW5lZCAqLworCQl9CisgICAgICAgIH0gZWxzZSB7CisJICAgIElzQ29uVHlwZURlZmluZWQgPSBTS19GQUxTRTsgLyogTm8gQ29uVHlwZSBkZWZpbmVkICovCisJfQorCisJLyoKKwkqKiBQYXJzZSBhbnkgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBwb3J0IEE6CisJKiogYSkgYW55IExpbmtTcGVlZCBzdGF0ZWQ/CisJKi8KKwlpZiAoU3BlZWRfQSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJU3BlZWRfQVtwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoU3BlZWRfQVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChTcGVlZF9BW3BBQy0+SW5kZXhdLCJBdXRvIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF9BVVRPOworCQl9IGVsc2UgaWYgKHN0cmNtcChTcGVlZF9BW3BBQy0+SW5kZXhdLCIxMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTBNQlBTOworCQl9IGVsc2UgaWYgKHN0cmNtcChTcGVlZF9BW3BBQy0+SW5kZXhdLCIxMDAiKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwME1CUFM7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIjEwMDAiKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwMDBNQlBTOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgU3BlZWRfQVxuIiwKKwkJCVNwZWVkX0FbcEFDLT5JbmRleF0pOworCQkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwl9CisKKwkvKiAKKwkqKiBDaGVjayBzcGVlZCBwYXJhbWV0ZXI6IAorCSoqICAgIE9ubHkgY29wcGVyIHR5cGUgYWRhcHRlciBhbmQgR0UgVjIgY2FyZHMgCisJKi8KKwlpZiAoKCghcEFDLT5DaGlwc2V0VHlwZSkgfHwgKHBBQy0+R0luaS5HSUNvcHBlclR5cGUgIT0gU0tfVFJVRSkpICYmCisJCSgoTGlua1NwZWVkICE9IFNLX0xTUEVFRF9BVVRPKSAmJgorCQkoTGlua1NwZWVkICE9IFNLX0xTUEVFRF8xMDAwTUJQUykpKSB7CisJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBmb3IgU3BlZWRfQS4gIgorCQkJIk5vdCBhIGNvcHBlciBjYXJkIG9yIEdFIFYyIGNhcmRcbiAgICBVc2luZyAiCisJCQkic3BlZWQgMTAwMFxuIik7CisJCUxpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDAwTUJQUzsKKwl9CisJCisJLyoJCisJKiogRGVjaWRlIHdoZXRoZXIgdG8gc2V0IG5ldyBjb25maWcgdmFsdWUgaWYgc29tZXRoaWcgdmFsaWQgaGFzCisJKiogYmVlbiByZWNlaXZlZC4KKwkqLworCWlmIChJc0xpbmtTcGVlZERlZmluZWQpIHsKKwkJcEFDLT5HSW5pLkdQWzBdLlBMaW5rU3BlZWQgPSBMaW5rU3BlZWQ7CisJfSAKKworCS8qIAorCSoqIGIpIEFueSBBdXRvbmVnb3RpYXRpb24gYW5kIER1cGxleENhcGFiaWxpdGllcyBzZXQ/CisJKiogICAgUGxlYXNlIG5vdGUgdGhhdCBib3RoIGJlbG9uZyB0b2dldGhlci4uLgorCSovCisJQXV0b05lZyA9IEFOX09OOyAvKiB0c2NoaWxsaW5nOiBEZWZhdWx0OiBBdXRvbmVnb3RpYXRpb24gb24hICovCisJQXV0b1NldCA9IFNLX0ZBTFNFOworCWlmIChBdXRvTmVnX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUF1dG9OZWdfQVtwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCUF1dG9TZXQgPSBTS19UUlVFOworCQlpZiAoc3RyY21wKEF1dG9OZWdfQVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIEF1dG9TZXQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCJPbiIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fT047CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQVtwQUMtPkluZGV4XSwiT2ZmIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9PRkY7CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQVtwQUMtPkluZGV4XSwiU2Vuc2UiKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX1NFTlM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBBdXRvTmVnX0FcbiIsCisJCQlBdXRvTmVnX0FbcEFDLT5JbmRleF0pOworCQl9CisJfQorCisJRHVwbGV4Q2FwID0gRENfQk9USDsKKwlEdXBTZXQgICAgPSBTS19GQUxTRTsKKwlpZiAoRHVwQ2FwX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUR1cENhcF9BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJRHVwU2V0ID0gU0tfVFJVRTsKKwkJaWYgKHN0cmNtcChEdXBDYXBfQVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIER1cFNldCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQVtwQUMtPkluZGV4XSwiQm90aCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19CT1RIOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQVtwQUMtPkluZGV4XSwiRnVsbCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19GVUxMOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQVtwQUMtPkluZGV4XSwiSGFsZiIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19IQUxGOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRHVwQ2FwX0FcbiIsCisJCQlEdXBDYXBfQVtwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwkvKiAKKwkqKiBDaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgCisJKi8KKwlpZiAoKExpbmtTcGVlZCA9PSBTS19MU1BFRURfMTAwME1CUFMpICYmCisJCSgoRHVwbGV4Q2FwID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpIHx8CisJCShEdXBsZXhDYXAgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSkgJiYKKwkJKHBBQy0+Q2hpcHNldFR5cGUpKSB7CisJCSAgICBwcmludGsoInNrOThsaW46IEhhbGYgRHVwbGV4IG5vdCBwb3NzaWJsZSB3aXRoIEdpZ2FiaXQgc3BlZWQhXG4iCisJCQkJCSIgICAgVXNpbmcgRnVsbCBEdXBsZXguXG4iKTsKKwkJCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKworCWlmICggQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9TRU5TICYmIER1cFNldCkgeworCQlwcmludGsoInNrOThsaW4sIFBvcnQgQTogRHVwbGV4Q2FwYWJpbGl0aWVzIgorCQkJIiBpZ25vcmVkIHVzaW5nIFNlbnNlIG1vZGVcbiIpOworCX0KKworCWlmIChBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX09GRiAmJiBEdXBTZXQgJiYgRHVwbGV4Q2FwPT1EQ19CT1RIKXsKKwkJcHJpbnRrKCJzazk4bGluOiBQb3J0IEE6IElsbGVnYWwgY29tYmluYXRpb24iCisJCQkiIG9mIHZhbHVlcyBBdXRvTmVnLiBhbmQgRHVwbGV4Q2FwLlxuICAgIFVzaW5nICIKKwkJCSJGdWxsIER1cGxleFxuIik7CisJCUR1cGxleENhcCA9IERDX0ZVTEw7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmICFEdXBTZXQpIHsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisJCisJaWYgKCFBdXRvU2V0ICYmIER1cFNldCkgeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQTogRHVwbGV4IHNldHRpbmcgbm90IgorCQkJIiBwb3NzaWJsZSBpblxuICAgIGRlZmF1bHQgQXV0b05lZ290aWF0aW9uIG1vZGUiCisJCQkiIChTZW5zZSkuXG4gICAgVXNpbmcgQXV0b05lZ290aWF0aW9uIE9uXG4iKTsKKwkJQXV0b05lZyA9IEFOX09OOworCX0KKwkKKwkvKiAKKwkqKiBzZXQgdGhlIGRlc2lyZWQgbW9kZSAKKwkqLworCWlmIChBdXRvU2V0IHx8IER1cFNldCkgeworCSAgICBwQUMtPkdJbmkuR1BbMF0uUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBdXRvTmVnXVtEdXBsZXhDYXBdOworCX0KKwkKKwkvKiAKKwkqKiBjKSBBbnkgRmxvd2NvbnRyb2wtcGFyYW1ldGVyIHNldD8KKwkqLworCWlmIChGbG93Q3RybF9BICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlGbG93Q3RybF9BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChGbG93Q3RybF9BW3BBQy0+SW5kZXhdLCIiKSA9PSAwKSB7CisJCSAgICBJc0Zsb3dDdHJsRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChGbG93Q3RybF9BW3BBQy0+SW5kZXhdLCJTeW1PclJlbSIpID09IDApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIlN5bSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIkxvY1NlbmQiKT09MCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfTE9DX1NFTkQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIk5vbmUiKT09MCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfTk9ORTsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIEZsb3dDdHJsX0FcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBGbG93Q3RybF9BW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCSAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJaWYgKElzRmxvd0N0cmxEZWZpbmVkKSB7CisJICAgIGlmICgoQXV0b05lZyA9PSBBTl9PRkYpICYmIChGbG93Q3RybCAhPSBTS19GTE9XX01PREVfTk9ORSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBQb3J0IEE6IEZsb3dDb250cm9sIgorCQkJIiBpbXBvc3NpYmxlIHdpdGhvdXQgQXV0b05lZ290aWF0aW9uLCIKKwkJCSIgZGlzYWJsZWRcbiIpOworCQlGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCSAgICB9CisJICAgIHBBQy0+R0luaS5HUFswXS5QRmxvd0N0cmxNb2RlID0gRmxvd0N0cmw7CisJfQorCisJLyoKKwkqKiBkKSBXaGF0IGlzIHdpdGggdGhlIFJvbGVQYXJhbWV0ZXI/CisJKi8KKwlpZiAoUm9sZV9BICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlSb2xlX0FbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFJvbGVfQVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0FbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgTVNNb2RlID0gU0tfTVNfTU9ERV9BVVRPOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0FbcEFDLT5JbmRleF0sIk1hc3RlciIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX01BU1RFUjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUm9sZV9BW3BBQy0+SW5kZXhdLCJTbGF2ZSIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX1NMQVZFOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgUm9sZV9BXG4iLAorCQkJUm9sZV9BW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzUm9sZURlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCWlmIChJc1JvbGVEZWZpbmVkID09IFNLX1RSVUUpIHsKKwkgICAgcEFDLT5HSW5pLkdQWzBdLlBNU01vZGUgPSBNU01vZGU7CisJfQorCQorCisJCisJLyogCisJKiogUGFyc2UgYW55IHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgcG9ydCBCOgorCSoqIGEpIGFueSBMaW5rU3BlZWQgc3RhdGVkPworCSovCisJSXNDb25UeXBlRGVmaW5lZCAgID0gU0tfVFJVRTsKKwlJc0xpbmtTcGVlZERlZmluZWQgPSBTS19UUlVFOworCUlzRmxvd0N0cmxEZWZpbmVkICA9IFNLX1RSVUU7CisJSXNNb2RlRGVmaW5lZCAgICAgID0gU0tfVFJVRTsKKworCWlmIChTcGVlZF9CICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlTcGVlZF9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChTcGVlZF9CW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0JbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0JbcEFDLT5JbmRleF0sIjEwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xME1CUFM7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0JbcEFDLT5JbmRleF0sIjEwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiMTAwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwME1CUFM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBTcGVlZF9CXG4iLAorCQkJU3BlZWRfQltwQUMtPkluZGV4XSk7CisJCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCS8qIAorCSoqIENoZWNrIHNwZWVkIHBhcmFtZXRlcjoKKwkqKiAgICBPbmx5IGNvcHBlciB0eXBlIGFkYXB0ZXIgYW5kIEdFIFYyIGNhcmRzIAorCSovCisJaWYgKCgoIXBBQy0+Q2hpcHNldFR5cGUpIHx8IChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlICE9IFNLX1RSVUUpKSAmJgorCQkoKExpbmtTcGVlZCAhPSBTS19MU1BFRURfQVVUTykgJiYKKwkJKExpbmtTcGVlZCAhPSBTS19MU1BFRURfMTAwME1CUFMpKSkgeworCQlwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgZm9yIFNwZWVkX0IuICIKKwkJCSJOb3QgYSBjb3BwZXIgY2FyZCBvciBHRSBWMiBjYXJkXG4gICAgVXNpbmcgIgorCQkJInNwZWVkIDEwMDBcbiIpOworCQlMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwME1CUFM7CisJfQorCisJLyogICAgICAKKwkqKiBEZWNpZGUgd2hldGhlciB0byBzZXQgbmV3IGNvbmZpZyB2YWx1ZSBpZiBzb21ldGhpZyB2YWxpZCBoYXMKKwkqKiBiZWVuIHJlY2VpdmVkLgorCSovCisgICAgICAgIGlmIChJc0xpbmtTcGVlZERlZmluZWQpIHsKKwkgICAgcEFDLT5HSW5pLkdQWzFdLlBMaW5rU3BlZWQgPSBMaW5rU3BlZWQ7CisJfQorCisJLyogCisJKiogYikgQW55IEF1dG9uZWdvdGlhdGlvbiBhbmQgRHVwbGV4Q2FwYWJpbGl0aWVzIHNldD8KKwkqKiAgICBQbGVhc2Ugbm90ZSB0aGF0IGJvdGggYmVsb25nIHRvZ2V0aGVyLi4uCisJKi8KKwlBdXRvTmVnID0gQU5fU0VOUzsgLyogZGVmYXVsdDogZG8gYXV0byBTZW5zZSAqLworCUF1dG9TZXQgPSBTS19GQUxTRTsKKwlpZiAoQXV0b05lZ19CICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlBdXRvTmVnX0JbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlBdXRvU2V0ID0gU0tfVFJVRTsKKwkJaWYgKHN0cmNtcChBdXRvTmVnX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBBdXRvU2V0ID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiT24iKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX09OOworCQl9IGVsc2UgaWYgKHN0cmNtcChBdXRvTmVnX0JbcEFDLT5JbmRleF0sIk9mZiIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fT0ZGOworCQl9IGVsc2UgaWYgKHN0cmNtcChBdXRvTmVnX0JbcEFDLT5JbmRleF0sIlNlbnNlIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9TRU5TOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgQXV0b05lZ19CXG4iLAorCQkJQXV0b05lZ19CW3BBQy0+SW5kZXhdKTsKKwkJfQorCX0KKworCUR1cGxleENhcCA9IERDX0JPVEg7CisJRHVwU2V0ICAgID0gU0tfRkFMU0U7CisJaWYgKER1cENhcF9CICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlEdXBDYXBfQltwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCUR1cFNldCA9IFNLX1RSVUU7CisJCWlmIChzdHJjbXAoRHVwQ2FwX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBEdXBTZXQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRHVwQ2FwX0JbcEFDLT5JbmRleF0sIkJvdGgiKT09MCkgeworCQkgICAgRHVwbGV4Q2FwID0gRENfQk9USDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRHVwQ2FwX0JbcEFDLT5JbmRleF0sIkZ1bGwiKT09MCkgeworCQkgICAgRHVwbGV4Q2FwID0gRENfRlVMTDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRHVwQ2FwX0JbcEFDLT5JbmRleF0sIkhhbGYiKT09MCkgeworCQkgICAgRHVwbGV4Q2FwID0gRENfSEFMRjsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIER1cENhcF9CXG4iLAorCQkJRHVwQ2FwX0JbcEFDLT5JbmRleF0pOworCQl9CisJfQorCisJCisJLyogCisJKiogQ2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIAorCSovCisJaWYgKChMaW5rU3BlZWQgPT0gU0tfTFNQRUVEXzEwMDBNQlBTKSAmJgorCQkoKER1cGxleENhcCA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGKSB8fAorCQkoRHVwbGV4Q2FwID09IFNLX0xNT0RFX1NUQVRfSEFMRikpICYmCisJCShwQUMtPkNoaXBzZXRUeXBlKSkgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBIYWxmIER1cGxleCBub3QgcG9zc2libGUgd2l0aCBHaWdhYml0IHNwZWVkIVxuIgorCQkJCQkiICAgIFVzaW5nIEZ1bGwgRHVwbGV4LlxuIik7CisJCQkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisKKwlpZiAoQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9TRU5TICYmIER1cFNldCkgeworCQlwcmludGsoInNrOThsaW4sIFBvcnQgQjogRHVwbGV4Q2FwYWJpbGl0aWVzIgorCQkJIiBpZ25vcmVkIHVzaW5nIFNlbnNlIG1vZGVcbiIpOworCX0KKworCWlmIChBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX09GRiAmJiBEdXBTZXQgJiYgRHVwbGV4Q2FwPT1EQ19CT1RIKXsKKwkJcHJpbnRrKCJzazk4bGluOiBQb3J0IEI6IElsbGVnYWwgY29tYmluYXRpb24iCisJCQkiIG9mIHZhbHVlcyBBdXRvTmVnLiBhbmQgRHVwbGV4Q2FwLlxuICAgIFVzaW5nICIKKwkJCSJGdWxsIER1cGxleFxuIik7CisJCUR1cGxleENhcCA9IERDX0ZVTEw7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmICFEdXBTZXQpIHsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisJCisJaWYgKCFBdXRvU2V0ICYmIER1cFNldCkgeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQjogRHVwbGV4IHNldHRpbmcgbm90IgorCQkJIiBwb3NzaWJsZSBpblxuICAgIGRlZmF1bHQgQXV0b05lZ290aWF0aW9uIG1vZGUiCisJCQkiIChTZW5zZSkuXG4gICAgVXNpbmcgQXV0b05lZ290aWF0aW9uIE9uXG4iKTsKKwkJQXV0b05lZyA9IEFOX09OOworCX0KKworCS8qIAorCSoqIHNldCB0aGUgZGVzaXJlZCBtb2RlIAorCSovCisJaWYgKEF1dG9TZXQgfHwgRHVwU2V0KSB7CisJICAgIHBBQy0+R0luaS5HUFsxXS5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0F1dG9OZWddW0R1cGxleENhcF07CisJfQorCisJLyoKKwkqKiBjKSBBbnkgRmxvd0N0cmwgcGFyYW1ldGVyIHNldD8KKwkqLworCWlmIChGbG93Q3RybF9CICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlGbG93Q3RybF9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChGbG93Q3RybF9CW3BBQy0+SW5kZXhdLCIiKSA9PSAwKSB7CisJCSAgICBJc0Zsb3dDdHJsRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChGbG93Q3RybF9CW3BBQy0+SW5kZXhdLCJTeW1PclJlbSIpID09IDApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIlN5bSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIkxvY1NlbmQiKT09MCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfTE9DX1NFTkQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIk5vbmUiKT09MCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfTk9ORTsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIEZsb3dDdHJsX0JcbiIsCisJCQlGbG93Q3RybF9CW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCQlJc0Zsb3dDdHJsRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCWlmIChJc0Zsb3dDdHJsRGVmaW5lZCkgeworCSAgICBpZiAoKEF1dG9OZWcgPT0gQU5fT0ZGKSAmJiAoRmxvd0N0cmwgIT0gU0tfRkxPV19NT0RFX05PTkUpKSB7CisJCXByaW50aygic2s5OGxpbjogUG9ydCBCOiBGbG93Q29udHJvbCIKKwkJCSIgaW1wb3NzaWJsZSB3aXRob3V0IEF1dG9OZWdvdGlhdGlvbiwiCisJCQkiIGRpc2FibGVkXG4iKTsKKwkJRmxvd0N0cmwgPSBTS19GTE9XX01PREVfTk9ORTsKKwkgICAgfQorCSAgICBwQUMtPkdJbmkuR1BbMV0uUEZsb3dDdHJsTW9kZSA9IEZsb3dDdHJsOworCX0KKworCS8qCisJKiogZCkgV2hhdCBpcyB0aGUgUm9sZVBhcmFtZXRlcj8KKwkqLworCWlmIChSb2xlX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVJvbGVfQltwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoUm9sZV9CW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgTVNNb2RlID0gU0tfTVNfTU9ERV9BVVRPOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIk1hc3RlciIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX01BU1RFUjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUm9sZV9CW3BBQy0+SW5kZXhdLCJTbGF2ZSIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX1NMQVZFOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgUm9sZV9CXG4iLAorCQkJUm9sZV9CW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzUm9sZURlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgIElzUm9sZURlZmluZWQgPSBTS19GQUxTRTsKKwl9CisKKwlpZiAoSXNSb2xlRGVmaW5lZCkgeworCSAgICBwQUMtPkdJbmkuR1BbMV0uUE1TTW9kZSA9IE1TTW9kZTsKKwl9CisJCisJLyoKKwkqKiBFdmFsdWF0ZSBzZXR0aW5ncyBmb3IgYm90aCBwb3J0cworCSovCisJcEFDLT5BY3RpdmVQb3J0ID0gMDsKKwlpZiAoUHJlZlBvcnQgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVByZWZQb3J0W3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChQcmVmUG9ydFtwQUMtPkluZGV4XSwiIikgPT0gMCkgeyAvKiBBdXRvICovCisJCQlwQUMtPkFjdGl2ZVBvcnQgICAgICAgICAgICAgPSAgMDsKKwkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZmVyZW5jZSA9IC0xOyAvKiBhdXRvICovCisJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZQb3J0ICAgPSAgMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUHJlZlBvcnRbcEFDLT5JbmRleF0sIkEiKSA9PSAwKSB7CisJCQkvKgorCQkJKiogZG8gbm90IHNldCBBY3RpdmVQb3J0IGhlcmUsIHRodXMgYSBwb3J0CisJCQkqKiBzd2l0Y2ggaXMgaXNzdWVkIGFmdGVyIG5ldCB1cC4KKwkJCSovCisJCQlQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmZXJlbmNlID0gUG9ydDsKKwkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQgICA9IFBvcnQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKFByZWZQb3J0W3BBQy0+SW5kZXhdLCJCIikgPT0gMCkgeworCQkJLyoKKwkJCSoqIGRvIG5vdCBzZXQgQWN0aXZlUG9ydCBoZXJlLCB0aHVzIGEgcG9ydAorCQkJKiogc3dpdGNoIGlzIGlzc3VlZCBhZnRlciBuZXQgdXAuCisJCQkqLworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAxKSB7CisJCQkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiQlwiIGZvciBQcmVmUG9ydC5cbiIKKwkJCQkJIiAgICAgIFBvcnQgQiBub3QgYXZhaWxhYmxlIG9uIHNpbmdsZSBwb3J0IGFkYXB0ZXJzLlxuIik7CisKKwkJCQlwQUMtPkFjdGl2ZVBvcnQgICAgICAgICAgICAgPSAgMDsKKwkJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZlcmVuY2UgPSAtMTsgLyogYXV0byAqLworCQkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQgICA9ICAwOworCQkJfSBlbHNlIHsKKwkJCQlQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworCQkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZmVyZW5jZSA9IFBvcnQ7CisJCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAgID0gUG9ydDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIFByZWZQb3J0XG4iLAorCQkJUHJlZlBvcnRbcEFDLT5JbmRleF0pOworCQl9CisJfQorCisJcEFDLT5SbG10TmV0cyA9IDE7CisKKwlpZiAoUmxtdE1vZGUgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVJsbXRNb2RlW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIiIpID09IDApIHsKKwkJCXBBQy0+UmxtdE1vZGUgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIkNoZWNrTGlua1N0YXRlIikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IFNLX1JMTVRfQ0hFQ0tfTElOSzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUmxtdE1vZGVbcEFDLT5JbmRleF0sICJDaGVja0xvY2FsUG9ydCIpID09IDApIHsKKwkJCXBBQy0+UmxtdE1vZGUgPSBTS19STE1UX0NIRUNLX0xJTksgfAorCQkJCQlTS19STE1UX0NIRUNLX0xPQ19MSU5LOworCQl9IGVsc2UgaWYgKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIkNoZWNrU2VnIikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IFNLX1JMTVRfQ0hFQ0tfTElOSyAgICAgfAorCQkJCQlTS19STE1UX0NIRUNLX0xPQ19MSU5LIHwKKwkJCQkJU0tfUkxNVF9DSEVDS19TRUc7CisJCX0gZWxzZSBpZiAoKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIkR1YWxOZXQiKSA9PSAwKSAmJgorCQkJKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSkgeworCQkJcEFDLT5SbG10TW9kZSA9IFNLX1JMTVRfQ0hFQ0tfTElOSzsKKwkJCXBBQy0+UmxtdE5ldHMgPSAyOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IiCisJCQkiIFJsbXRNb2RlLCB1c2luZyBkZWZhdWx0XG4iLCAKKwkJCVJsbXRNb2RlW3BBQy0+SW5kZXhdKTsKKwkJCXBBQy0+UmxtdE1vZGUgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJcEFDLT5SbG10TW9kZSA9IDA7CisJfQorCQorCS8qCisJKiogQ2hlY2sgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHBhcmFtZXRlcnMKKwkqLworCWlmIChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfTk9ORTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbltwQUMtPkluZGV4XSwgIlN0YXRpYyIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX1NUQVRJQzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbltwQUMtPkluZGV4XSwgIkR5bmFtaWMiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9IENfSU5UX01PRF9EWU5BTUlDOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiTm9uZSIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX05PTkU7CisJCX0gZWxzZSB7CisJICAgCQlwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBNb2RlcmF0aW9uLlxuIgorCQkJCSIgICAgICBEaXNhYmxlIGludGVycnVwdCBtb2RlcmF0aW9uLlxuIiwKKwkJCQlNb2RlcmF0aW9uW3BBQy0+SW5kZXhdKTsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX05PTkU7CisJCX0KKwl9IGVsc2UgeworCQlwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9IENfSU5UX01PRF9OT05FOworCX0KKworCWlmIChTdGF0c1twQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoU3RhdHNbcEFDLT5JbmRleF0sICJZZXMiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzID0gU0tfVFJVRTsKKwkJfSBlbHNlIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5EaXNwbGF5U3RhdHMgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCXBBQy0+RHluSXJxTW9kSW5mby5EaXNwbGF5U3RhdHMgPSBTS19GQUxTRTsKKwl9CisKKwlpZiAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiUngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9PTkxZOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlR4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfVFhfT05MWTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX09OTFk7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiUnhTcCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX1JYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlNwUngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19TUF9SWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFR4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfVFhfUlg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHhSeCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1RYX1JYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlR4U3AiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19TUF9UWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcFR4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfU1BfVFg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiUnhUeFNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiUnhTcFR4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHhSeFNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHhTcFJ4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiU3BUeFJ4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiU3BSeFR4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfVFhfU1A7CisJCX0gZWxzZSB7IC8qIHNvbWUgcnViYmlzaCAqLworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfUlhfT05MWTsKKwkJfQorCX0gZWxzZSB7ICAvKiBvcGVyYXRvciBoYXMgc3RhdGVkIG5vdGhpbmcgKi8KKwkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfVFhfUlg7CisJfQorCisJaWYgKEF1dG9TaXppbmdbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKEF1dG9TaXppbmdbcEFDLT5JbmRleF0sICJPbiIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5BdXRvU2l6aW5nID0gU0tfRkFMU0U7CisJCX0gZWxzZSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uQXV0b1NpemluZyA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsgIC8qIG9wZXJhdG9yIGhhcyBzdGF0ZWQgbm90aGluZyAqLworCQlwQUMtPkR5bklycU1vZEluZm8uQXV0b1NpemluZyA9IFNLX0ZBTFNFOworCX0KKworCWlmIChJbnRzUGVyU2VjW3BBQy0+SW5kZXhdICE9IDApIHsKKwkJaWYgKChJbnRzUGVyU2VjW3BBQy0+SW5kZXhdPCBDX0lOVF9NT0RfSVBTX0xPV0VSX1JBTkdFKSB8fCAKKwkJCShJbnRzUGVyU2VjW3BBQy0+SW5kZXhdID4gQ19JTlRfTU9EX0lQU19VUFBFUl9SQU5HRSkpIHsKKwkgICAJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVkXCIgZm9yIEludHNQZXJTZWMuIChSYW5nZTogJWQgLSAlZClcbiIKKwkJCQkiICAgICAgVXNpbmcgZGVmYXVsdCB2YWx1ZSBvZiAlaS5cbiIsIAorCQkJCUludHNQZXJTZWNbcEFDLT5JbmRleF0sCisJCQkJQ19JTlRfTU9EX0lQU19MT1dFUl9SQU5HRSwKKwkJCQlDX0lOVF9NT0RfSVBTX1VQUEVSX1JBTkdFLAorCQkJCUNfSU5UU19QRVJfU0VDX0RFRkFVTFQpOworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMgPSBDX0lOVFNfUEVSX1NFQ19ERUZBVUxUOworCQl9IGVsc2UgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMgPSBJbnRzUGVyU2VjW3BBQy0+SW5kZXhdOworCQl9CisJfSBlbHNlIHsKKwkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMgPSBDX0lOVFNfUEVSX1NFQ19ERUZBVUxUOworCX0KKworCS8qCisJKiogRXZhbHVhdGUgdXBwZXIgYW5kIGxvd2VyIG1vZGVyYXRpb24gdGhyZXNob2xkCisJKi8KKwlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlY1VwcGVyTGltaXQgPQorCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyArCisJCShwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyAvIDIpOworCisJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWNMb3dlckxpbWl0ID0KKwkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMgLQorCQkocEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMgLyAyKTsKKworCXBBQy0+RHluSXJxTW9kSW5mby5QcmV2VGltZVZhbCA9IGppZmZpZXM7ICAvKiBpbml0aWFsIHZhbHVlICovCisKKworfSAvKiBHZXRDb25maWd1cmF0aW9uICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVByb2R1Y3RTdHIgLSByZXR1cm4gYSBhZGFwdGVyIGlkZW50aWZpY2F0aW9uIHN0cmluZyBmcm9tIHZwZAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgcHJvZHVjdCBuYW1lIHN0cmluZyBmcm9tIHRoZSB2cGQgYXJlYQorICoJYW5kIHB1dHMgaXQgdGhlIGZpZWxkIHBBQy0+RGV2aWNlU3RyaW5nLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBQcm9kdWN0U3RyKAorU0tfQUMJKnBBQwkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KKykKK3sKK2ludAlTdHJMZW4gPSA4MDsJCS8qIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBkZWZpbmVkIGluIFNLX0FDICovCitjaGFyCUtleXdvcmRbXSA9IFZQRF9OQU1FOwkvKiB2cGQgcHJvZHVjdG5hbWUgaWRlbnRpZmllciAqLworaW50CVJldHVybkNvZGU7CQkvKiByZXR1cm4gY29kZSBmcm9tIHZwZF9yZWFkICovCit1bnNpZ25lZCBsb25nIEZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJUmV0dXJuQ29kZSA9IFZwZFJlYWQocEFDLCBwQUMtPklvQmFzZSwgS2V5d29yZCwgcEFDLT5EZXZpY2VTdHIsCisJCSZTdHJMZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJaWYgKFJldHVybkNvZGUgIT0gMCkgeworCQkvKiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgdnBkIGRhdGEgKi8KKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VSUk9SLAorCQkJKCJFcnJvciByZWFkaW5nIFZQRCBkYXRhOiAlZFxuIiwgUmV0dXJuQ29kZSkpOworCQlwQUMtPkRldmljZVN0clswXSA9ICdcMCc7CisJfQorfSAvKiBQcm9kdWN0U3RyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgU3RhcnREcnZDbGVhbnVwVGltZXIgLSBTdGFydCB0aW1lciB0byBjaGVjayBmb3IgZGVzY3JpcHRvcnMgd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWdodCBiZSBwbGFjZWQgaW4gZGVzY3JpcHRvciByaW5nLCBidXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlbnQgYmVlbiBoYW5kbGVkIHVwIHRvIG5vdworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGEgSFctdGltZXIgZm8gdGhlIFl1a29uIGNhcmQuIFRoZSBhY3Rpb25zIHRvCisgKiAgICAgIHBlcmZvcm0gd2hlbiB0aGlzIHRpbWVyIGV4cGlyZXMsIGFyZSBsb2NhdGVkIGluIHRoZSBTa0RydkV2ZW50KCkuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkCitTdGFydERydkNsZWFudXBUaW1lcihTS19BQyAqcEFDKSB7CisgICAgU0tfRVZQQVJBICAgIEV2ZW50UGFyYW07ICAgLyogRXZlbnQgc3RydWN0IGZvciB0aW1lciBldmVudCAqLworCisgICAgU0tfTUVNU0VUKChjaGFyICopICZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworICAgIEV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfRFJWX1JYX0NMRUFOVVBfVElNRVI7CisgICAgU2tUaW1lclN0YXJ0KHBBQywgcEFDLT5Jb0Jhc2UsICZwQUMtPkRydkNsZWFudXBUaW1lciwKKyAgICAgICAgICAgICAgICAgU0tfRFJWX1JYX0NMRUFOVVBfVElNRVJfTEVOR1RILAorICAgICAgICAgICAgICAgICBTS0dFX0RSViwgU0tfRFJWX1RJTUVSLCBFdmVudFBhcmFtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBTdG9wRHJ2Q2xlYW51cFRpbWVyIC0gU3RvcCB0aW1lciB0byBjaGVjayBmb3IgZGVzY3JpcHRvcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyBhIEhXLXRpbWVyIGZvIHRoZSBZdWtvbiBjYXJkLiBUaGUgYWN0aW9ucyB0bworICogICAgICBwZXJmb3JtIHdoZW4gdGhpcyB0aW1lciBleHBpcmVzLCBhcmUgbG9jYXRlZCBpbiB0aGUgU2tEcnZFdmVudCgpLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZAorU3RvcERydkNsZWFudXBUaW1lcihTS19BQyAqcEFDKSB7CisgICAgU2tUaW1lclN0b3AocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+RHJ2Q2xlYW51cFRpbWVyKTsKKyAgICBTS19NRU1TRVQoKGNoYXIgKikgJnBBQy0+RHJ2Q2xlYW51cFRpbWVyLCAwLCBzaXplb2YoU0tfVElNRVIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmdW5jdGlvbnMgZm9yIGNvbW1vbiBtb2R1bGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2QWxsb2NSbG10TWJ1ZiAtIGFsbG9jYXRlIGFuIFJMTVQgbWJ1ZgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHJldHVybnMgYW4gUkxNVCBtYnVmIG9yIE5VTEwuIFRoZSBSTE1UIE1idWYgc3RydWN0dXJlCisgKglpcyBlbWJlZGRlZCBpbnRvIGEgc29ja2V0IGJ1ZmYgZGF0YSBhcmVhLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lCisgKgorICogUmV0dXJuczoKKyAqCU5VTEwgb3IgcG9pbnRlciB0byBNYnVmLgorICovCitTS19NQlVGICpTa0RydkFsbG9jUmxtdE1idWYoCitTS19BQwkJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIHRoZSBJTy1jb250ZXh0ICovCit1bnNpZ25lZAlCdWZmZXJTaXplKQkvKiBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgYnVmZmVyICovCit7CitTS19NQlVGCQkqcFJsbXRNYnVmOwkvKiBwb2ludGVyIHRvIGEgbmV3IHJsbXQtbWJ1ZiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBza19idWZmCSpwTXNnQmxvY2s7CS8qIHBvaW50ZXIgdG8gYSBuZXcgbWVzc2FnZSBibG9jayAqLworCisJcE1zZ0Jsb2NrID0gYWxsb2Nfc2tiKEJ1ZmZlclNpemUgKyBzaXplb2YoU0tfTUJVRiksIEdGUF9BVE9NSUMpOworCWlmIChwTXNnQmxvY2sgPT0gTlVMTCkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlwUmxtdE1idWYgPSAoU0tfTUJVRiopIHBNc2dCbG9jay0+ZGF0YTsKKwlza2JfcmVzZXJ2ZShwTXNnQmxvY2ssIHNpemVvZihTS19NQlVGKSk7CisJcFJsbXRNYnVmLT5wTmV4dCA9IE5VTEw7CisJcFJsbXRNYnVmLT5wT3MgPSBwTXNnQmxvY2s7CisJcFJsbXRNYnVmLT5wRGF0YSA9IHBNc2dCbG9jay0+ZGF0YTsJLyogRGF0YSBidWZmZXIuICovCisJcFJsbXRNYnVmLT5TaXplID0gQnVmZmVyU2l6ZTsJCS8qIERhdGEgYnVmZmVyIHNpemUuICovCisJcFJsbXRNYnVmLT5MZW5ndGggPSAwOwkJLyogTGVuZ3RoIG9mIHBhY2tldCAoPD0gU2l6ZSkuICovCisJcmV0dXJuIChwUmxtdE1idWYpOworCit9IC8qIFNrRHJ2QWxsb2NSbG10TWJ1ZiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2RnJlZVJsbXRNYnVmIC0gZnJlZSBhbiBSTE1UIG1idWYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBmcmVlcyBvbmUgb3IgbW9yZSBSTE1UIG1idWYocykuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUKKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCit2b2lkICBTa0RydkZyZWVSbG10TWJ1ZigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogdGhlIElPLWNvbnRleHQgKi8KK1NLX01CVUYJCSpwTWJ1ZikJCS8qIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBidWZmZXIgKi8KK3sKK1NLX01CVUYJCSpwRnJlZU1idWY7CitTS19NQlVGCQkqcE5leHRNYnVmOworCisJcEZyZWVNYnVmID0gcE1idWY7CisJZG8geworCQlwTmV4dE1idWYgPSBwRnJlZU1idWYtPnBOZXh0OworCQlERVZfS0ZSRUVfU0tCX0FOWShwRnJlZU1idWYtPnBPcyk7CisJCXBGcmVlTWJ1ZiA9IHBOZXh0TWJ1ZjsKKwl9IHdoaWxlICggcEZyZWVNYnVmICE9IE5VTEwgKTsKK30gLyogU2tEcnZGcmVlUmxtdE1idWYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa09zR2V0VGltZSAtIHByb3ZpZGUgYSB0aW1lIHZhbHVlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgcHJvdmlkZXMgYSB0aW1lIHZhbHVlLiBUaGUgdW5pdCBpcyAxL0haIChkZWZpbmVkIGJ5IExpbnV4KS4KKyAqCUl0IGlzIG5vdCB1c2VkIGZvciBhYnNvbHV0ZSB0aW1lLCBidXQgb25seSBmb3IgdGltZSBkaWZmZXJlbmNlcy4KKyAqCisgKgorICogUmV0dXJuczoKKyAqCVRpbWUgdmFsdWUKKyAqLworU0tfVTY0IFNrT3NHZXRUaW1lKFNLX0FDICpwQUMpCit7CisJU0tfVTY0CVByaXZhdGVKaWZmaWVzOworCVNrT3NHZXRUaW1lQ3VycmVudChwQUMsICZQcml2YXRlSmlmZmllcyk7CisJcmV0dXJuIFByaXZhdGVKaWZmaWVzOworfSAvKiBTa09zR2V0VGltZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpUmVhZENmZ0RXb3JkIC0gcmVhZCBhIDMyIGJpdCB2YWx1ZSBmcm9tIHBjaSBjb25maWcgc3BhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSByZWFkcyBhIDMyIGJpdCB2YWx1ZSBmcm9tIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVJlYWRDZmdEV29yZCgKK1NLX0FDICpwQUMsCQkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UzMiAqcFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocEFDLT5QY2lEZXYsIFBjaUFkZHIsIHBWYWwpOworCXJldHVybigwKTsKK30gLyogU2tQY2lSZWFkQ2ZnRFdvcmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BjaVJlYWRDZmdXb3JkIC0gcmVhZCBhIDE2IGJpdCB2YWx1ZSBmcm9tIHBjaSBjb25maWcgc3BhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSByZWFkcyBhIDE2IGJpdCB2YWx1ZSBmcm9tIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVJlYWRDZmdXb3JkKAorU0tfQUMgKnBBQywJLyogQWRhcHRlciBDb250cm9sIHN0cnVjdHVyZSBwb2ludGVyICovCitpbnQgUGNpQWRkciwJCS8qIFBDSSByZWdpc3RlciBhZGRyZXNzICovCitTS19VMTYgKnBWYWwpCQkvKiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlICovCit7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocEFDLT5QY2lEZXYsIFBjaUFkZHIsIHBWYWwpOworCXJldHVybigwKTsKK30gLyogU2tQY2lSZWFkQ2ZnV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpUmVhZENmZ0J5dGUgLSByZWFkIGEgOCBiaXQgdmFsdWUgZnJvbSBwY2kgY29uZmlnIHNwYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgcmVhZHMgYSA4IGJpdCB2YWx1ZSBmcm9tIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVJlYWRDZmdCeXRlKAorU0tfQUMgKnBBQywJLyogQWRhcHRlciBDb250cm9sIHN0cnVjdHVyZSBwb2ludGVyICovCitpbnQgUGNpQWRkciwJCS8qIFBDSSByZWdpc3RlciBhZGRyZXNzICovCitTS19VOCAqcFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwQUMtPlBjaURldiwgUGNpQWRkciwgcFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVJlYWRDZmdCeXRlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQY2lXcml0ZUNmZ0RXb3JkIC0gd3JpdGUgYSAzMiBiaXQgdmFsdWUgdG8gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHdyaXRlcyBhIDMyIGJpdCB2YWx1ZSB0byB0aGUgcGNpIGNvbmZpZ3VyYXRpb24KKyAqCXNwYWNlLgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gaW5kaWNhdGUgZXZlcnl0aGluZyB3b3JrZWQgb2suCisgKgkhPSAwIC0gZXJyb3IgaW5kaWNhdGlvbgorICovCitpbnQgU2tQY2lXcml0ZUNmZ0RXb3JkKAorU0tfQUMgKnBBQywJLyogQWRhcHRlciBDb250cm9sIHN0cnVjdHVyZSBwb2ludGVyICovCitpbnQgUGNpQWRkciwJCS8qIFBDSSByZWdpc3RlciBhZGRyZXNzICovCitTS19VMzIgVmFsKQkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgcmVhZCB2YWx1ZSAqLworeworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocEFDLT5QY2lEZXYsIFBjaUFkZHIsIFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVdyaXRlQ2ZnRFdvcmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BjaVdyaXRlQ2ZnV29yZCAtIHdyaXRlIGEgMTYgYml0IHZhbHVlIHRvIHBjaSBjb25maWcgc3BhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSB3cml0ZXMgYSAxNiBiaXQgdmFsdWUgdG8gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4gVGhlIGZsYWcgUGNpQ29uZmlnVXAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbmZpZyBzcGFjZQorICoJaXMgYWNjZXNpYmxlIG9yIG11c3QgYmUgc2V0IHVwIGZpcnN0LgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gaW5kaWNhdGUgZXZlcnl0aGluZyB3b3JrZWQgb2suCisgKgkhPSAwIC0gZXJyb3IgaW5kaWNhdGlvbgorICovCitpbnQgU2tQY2lXcml0ZUNmZ1dvcmQoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UxNiBWYWwpCQkvKiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlICovCit7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBBQy0+UGNpRGV2LCBQY2lBZGRyLCBWYWwpOworCXJldHVybigwKTsKK30gLyogU2tQY2lXcml0ZUNmZ1dvcmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BjaVdyaXRlQ2ZnV29yZCAtIHdyaXRlIGEgOCBiaXQgdmFsdWUgdG8gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHdyaXRlcyBhIDggYml0IHZhbHVlIHRvIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuIFRoZSBmbGFnIFBjaUNvbmZpZ1VwIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25maWcgc3BhY2UKKyAqCWlzIGFjY2VzaWJsZSBvciBtdXN0IGJlIHNldCB1cCBmaXJzdC4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpV3JpdGVDZmdCeXRlKAorU0tfQUMgKnBBQywJLyogQWRhcHRlciBDb250cm9sIHN0cnVjdHVyZSBwb2ludGVyICovCitpbnQgUGNpQWRkciwJCS8qIFBDSSByZWdpc3RlciBhZGRyZXNzICovCitTS19VOCBWYWwpCQkvKiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlICovCit7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBBQy0+UGNpRGV2LCBQY2lBZGRyLCBWYWwpOworCXJldHVybigwKTsKK30gLyogU2tQY2lXcml0ZUNmZ0J5dGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0RydkV2ZW50IC0gaGFuZGxlIGRyaXZlciBldmVudHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgZnJvbSBhbGwgbW9kdWxlcyBkaXJlY3RlZCB0byB0aGUgZHJpdmVyCisgKgorICogQ29udGV4dDoKKyAqCUlzIGNhbGxlZCB1bmRlciBwcm90ZWN0aW9uIG9mIHNsb3cgcGF0aCBsb2NrLgorICoKKyAqIFJldHVybnM6CisgKgkwIGlmIGV2ZXJ5dGhpbmcgb2sKKyAqCTwgMCAgb24gZXJyb3IKKyAqCQorICovCitpbnQgU2tEcnZFdmVudCgKK1NLX0FDICpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIGlvLWNvbnRleHQgKi8KK1NLX1UzMiBFdmVudCwJCS8qIGV2ZW50LWlkICovCitTS19FVlBBUkEgUGFyYW0pCS8qIGV2ZW50LXBhcmFtZXRlciAqLworeworU0tfTUJVRgkJKnBSbG10TWJ1ZjsJLyogcG9pbnRlciB0byBhIHJsbXQtbWJ1ZiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBza19idWZmCSpwTXNnOwkJLyogcG9pbnRlciB0byBhIG1lc3NhZ2UgYmxvY2sgKi8KK2ludAkJRnJvbVBvcnQ7CS8qIHRoZSBwb3J0IGZyb20gd2hpY2ggd2Ugc3dpdGNoIGF3YXkgKi8KK2ludAkJVG9Qb3J0OwkJLyogdGhlIHBvcnQgd2Ugc3dpdGNoIHRvICovCitTS19FVlBBUkEJTmV3UGFyYTsJLyogcGFyYW1ldGVyIGZvciBmdXJ0aGVyIGV2ZW50cyAqLworaW50CQlTdGF0OwordW5zaWduZWQgbG9uZwlGbGFnczsKK1NLX0JPT0wJCUR1YWxOZXQ7CisKKwlzd2l0Y2ggKEV2ZW50KSB7CisJY2FzZSBTS19EUlZfQURBUF9GQUlMOgorCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIkFEQVBURVIgRkFJTCBFVkVOVFxuIikpOworCQlwcmludGsoIiVzOiBBZGFwdGVyIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJLyogY2dvb3MgKi8KKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfUE9SVF9GQUlMOgorCQlGcm9tUG9ydCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIEZBSUwgRVZFTlQsIFBvcnQ6ICVkXG4iLCBGcm9tUG9ydCkpOworCQlpZiAoRnJvbVBvcnQgPT0gMCkgeworCQkJcHJpbnRrKCIlczogUG9ydCBBIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiJXM6IFBvcnQgQiBmYWlsZWQuXG4iLCBwQUMtPmRldlsxXS0+bmFtZSk7CisJCX0KKwkJLyogY2dvb3MgKi8KKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfUE9SVF9SRVNFVDoJIC8qIFNLX1UzMiBQb3J0SWR4ICovCisJCS8qIGFjdGlvbiBsaXN0IDQgKi8KKwkJRnJvbVBvcnQgPSBQYXJhbS5QYXJhMzJbMF07CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiUE9SVCBSRVNFVCBFVkVOVCwgUG9ydDogJWQgIiwgRnJvbVBvcnQpKTsKKwkJTmV3UGFyYS5QYXJhNjQgPSBGcm9tUG9ydDsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQsIE5ld1BhcmEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisKKwkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBGcm9tUG9ydCwgU0tfU1RPUF9BTEwsIFNLX0hBUkRfUlNUKTsKKwkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzBdXS0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJCisJCS8qIGNsZWFyIHJ4IHJpbmcgZnJvbSByZWNlaXZlZCBmcmFtZXMgKi8KKwkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFtGcm9tUG9ydF0sIFNLX0ZBTFNFKTsKKwkJCisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCQorCQkvKiB0c2NoaWxsaW5nOiBIYW5kbGluZyBvZiByZXR1cm4gdmFsdWUgaW5zZXJ0ZWQuICovCisJCWlmIChTa0dlSW5pdFBvcnQocEFDLCBJb0MsIEZyb21Qb3J0KSkgeworCQkJaWYgKEZyb21Qb3J0ID09IDApIHsKKwkJCQlwcmludGsoIiVzOiBTa0dlSW5pdFBvcnQgQSBmYWlsZWQuXG4iLCBwQUMtPmRldlswXS0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiJXM6IFNrR2VJbml0UG9ydCBCIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzFdLT5uYW1lKTsKKwkJCX0KKwkJfQorCQlTa0FkZHJNY1VwZGF0ZShwQUMsSW9DLCBGcm9tUG9ydCk7CisJCVBvcnRSZUluaXRCbXUocEFDLCBGcm9tUG9ydCk7CisJCVNrR2VQb2xsVHhEKHBBQywgSW9DLCBGcm9tUG9ydCwgU0tfVFJVRSk7CisJCUNsZWFyQW5kU3RhcnRSeChwQUMsIEZyb21Qb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0tfRFJWX05FVF9VUDoJIC8qIFNLX1UzMiBQb3J0SWR4ICovCisJCS8qIGFjdGlvbiBsaXN0IDUgKi8KKwkJRnJvbVBvcnQgPSBQYXJhbS5QYXJhMzJbMF07CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiTkVUIFVQIEVWRU5ULCBQb3J0OiAlZCAiLCBQYXJhbS5QYXJhMzJbMF0pKTsKKwkJLyogTWFjIHVwZGF0ZSAqLworCQlTa0FkZHJNY1VwZGF0ZShwQUMsSW9DLCBGcm9tUG9ydCk7CisKKwkJaWYgKERvUHJpbnRJbnRlcmZhY2VDaGFuZ2UpIHsKKwkJcHJpbnRrKCIlczogbmV0d29yayBjb25uZWN0aW9uIHVwIHVzaW5nIgorCQkJIiBwb3J0ICVjXG4iLCBwQUMtPmRldltQYXJhbS5QYXJhMzJbMF1dLT5uYW1lLCAnQScrUGFyYW0uUGFyYTMyWzBdKTsKKworCQkvKiB0c2NoaWxsaW5nOiBWYWx1ZXMgY2hhbmdlZCBhY2NvcmRpbmcgdG8gTGlua1NwZWVkVXNlZC4gKi8KKwkJU3RhdCA9IHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUExpbmtTcGVlZFVzZWQ7CisJCWlmIChTdGF0ID09IFNLX0xTUEVFRF9TVEFUXzEwTUJQUykgeworCQkJcHJpbnRrKCIgICAgc3BlZWQ6ICAgICAgICAgICAxMFxuIik7CisJCX0gZWxzZSBpZiAoU3RhdCA9PSBTS19MU1BFRURfU1RBVF8xMDBNQlBTKSB7CisJCQlwcmludGsoIiAgICBzcGVlZDogICAgICAgICAgIDEwMFxuIik7CisJCX0gZWxzZSBpZiAoU3RhdCA9PSBTS19MU1BFRURfU1RBVF8xMDAwTUJQUykgeworCQkJcHJpbnRrKCIgICAgc3BlZWQ6ICAgICAgICAgICAxMDAwXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiICAgIHNwZWVkOiAgICAgICAgICAgdW5rbm93blxuIik7CisJCX0KKworCisJCVN0YXQgPSBwQUMtPkdJbmkuR1BbRnJvbVBvcnRdLlBMaW5rTW9kZVN0YXR1czsKKwkJaWYgKFN0YXQgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRiB8fAorCQkJU3RhdCA9PSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMKSB7CisJCQlwcmludGsoIiAgICBhdXRvbmVnb3RpYXRpb246IHllc1xuIik7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoIiAgICBhdXRvbmVnb3RpYXRpb246IG5vXG4iKTsKKwkJfQorCQlpZiAoU3RhdCA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGIHx8CisJCQlTdGF0ID09IFNLX0xNT0RFX1NUQVRfSEFMRikgeworCQkJcHJpbnRrKCIgICAgZHVwbGV4IG1vZGU6ICAgICBoYWxmXG4iKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50aygiICAgIGR1cGxleCBtb2RlOiAgICAgZnVsbFxuIik7CisJCX0KKwkJU3RhdCA9IHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUEZsb3dDdHJsU3RhdHVzOworCQlpZiAoU3RhdCA9PSBTS19GTE9XX1NUQVRfUkVNX1NFTkQgKSB7CisJCQlwcmludGsoIiAgICBmbG93Y3RybDogICAgICAgIHJlbW90ZSBzZW5kXG4iKTsKKwkJfQorCQllbHNlIGlmIChTdGF0ID09IFNLX0ZMT1dfU1RBVF9MT0NfU0VORCApeworCQkJcHJpbnRrKCIgICAgZmxvd2N0cmw6ICAgICAgICBsb2NhbCBzZW5kXG4iKTsKKwkJfQorCQllbHNlIGlmIChTdGF0ID09IFNLX0ZMT1dfU1RBVF9TWU1NRVRSSUMgKXsKKwkJCXByaW50aygiICAgIGZsb3djdHJsOiAgICAgICAgc3ltbWV0cmljXG4iKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50aygiICAgIGZsb3djdHJsOiAgICAgICAgbm9uZVxuIik7CisJCX0KKwkJCisJCS8qIHRzY2hpbGxpbmc6IENoZWNrIGFnYWluc3QgQ29wcGVyVHlwZSBub3cuICovCisJCWlmICgocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSA9PSBTS19UUlVFKSAmJgorCQkJKHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUExpbmtTcGVlZFVzZWQgPT0KKwkJCVNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTKSkgeworCQkJU3RhdCA9IHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUE1TU3RhdHVzOworCQkJaWYgKFN0YXQgPT0gU0tfTVNfU1RBVF9NQVNURVIgKSB7CisJCQkJcHJpbnRrKCIgICAgcm9sZTogICAgICAgICAgICBtYXN0ZXJcbiIpOworCQkJfQorCQkJZWxzZSBpZiAoU3RhdCA9PSBTS19NU19TVEFUX1NMQVZFICkgeworCQkJCXByaW50aygiICAgIHJvbGU6ICAgICAgICAgICAgc2xhdmVcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKCIgICAgcm9sZTogICAgICAgICAgICA/Pz9cbiIpOworCQkJfQorCQl9CisKKwkJLyogCisJCSAgIERpc3BsYXkgZGltIChkeW5hbWljIGludGVycnVwdCBtb2RlcmF0aW9uKSAKKwkJICAgaW5mb3JtYXRpb25zCisJCSAqLworCQlpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX1NUQVRJQykKKwkJCXByaW50aygiICAgIGlycSBtb2RlcmF0aW9uOiAgc3RhdGljICglZCBpbnRzL3NlYylcbiIsCisJCQkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjKTsKKwkJZWxzZSBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpCisJCQlwcmludGsoIiAgICBpcnEgbW9kZXJhdGlvbjogIGR5bmFtaWMgKCVkIGludHMvc2VjKVxuIiwKKwkJCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMpOworCQllbHNlCisJCQlwcmludGsoIiAgICBpcnEgbW9kZXJhdGlvbjogIGRpc2FibGVkXG4iKTsKKworCisjaWZkZWYgU0tfWkVST0NPUFkKKwkJaWYgKHBBQy0+Q2hpcHNldFR5cGUpCisjaWZkZWYgVVNFX1NLX1RYX0NIRUNLU1VNCisJCQlwcmludGsoIiAgICBzY2F0dGVyLWdhdGhlcjogIGVuYWJsZWRcbiIpOworI2Vsc2UKKwkJCXByaW50aygiICAgIHR4LWNoZWNrc3VtOiAgICAgZGlzYWJsZWRcbiIpOworI2VuZGlmCisJCWVsc2UKKwkJCXByaW50aygiICAgIHNjYXR0ZXItZ2F0aGVyOiAgZGlzYWJsZWRcbiIpOworI2Vsc2UKKwkJCXByaW50aygiICAgIHNjYXR0ZXItZ2F0aGVyOiAgZGlzYWJsZWRcbiIpOworI2VuZGlmCisKKyNpZm5kZWYgVVNFX1NLX1JYX0NIRUNLU1VNCisJCQlwcmludGsoIiAgICByeC1jaGVja3N1bTogICAgIGRpc2FibGVkXG4iKTsKKyNlbmRpZgorCisJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisJCisJCWlmICgoUGFyYW0uUGFyYTMyWzBdICE9IHBBQy0+QWN0aXZlUG9ydCkgJiYKKwkJCShwQUMtPlJsbXROZXRzID09IDEpKSB7CisJCQlOZXdQYXJhLlBhcmEzMlswXSA9IHBBQy0+QWN0aXZlUG9ydDsKKwkJCU5ld1BhcmEuUGFyYTMyWzFdID0gUGFyYW0uUGFyYTMyWzBdOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9TV0lUQ0hfSU5URVJOLAorCQkJCU5ld1BhcmEpOworCQl9CisKKwkJLyogSW5mb3JtIHRoZSB3b3JsZCB0aGF0IGxpbmsgcHJvdG9jb2wgaXMgdXAuICovCisJCXBBQy0+ZGV2W1BhcmFtLlBhcmEzMlswXV0tPmZsYWdzIHw9IElGRl9SVU5OSU5HOworCisJCWJyZWFrOworCWNhc2UgU0tfRFJWX05FVF9ET1dOOgkgLyogU0tfVTMyIFJlYXNvbiAqLworCQkvKiBhY3Rpb24gbGlzdCA3ICovCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiTkVUIERPV04gRVZFTlQgIikpOworCQlpZiAoRG9QcmludEludGVyZmFjZUNoYW5nZSkgeworCQkJcHJpbnRrKCIlczogbmV0d29yayBjb25uZWN0aW9uIGRvd25cbiIsIAorCQkJCXBBQy0+ZGV2W1BhcmFtLlBhcmEzMlsxXV0tPm5hbWUpOworCQl9IGVsc2UgeworCQkJRG9QcmludEludGVyZmFjZUNoYW5nZSA9IFNLX1RSVUU7CisJCX0KKwkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzFdXS0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCQlicmVhazsKKwljYXNlIFNLX0RSVl9TV0lUQ0hfSEFSRDogLyogU0tfVTMyIEZyb21Qb3J0SWR4IFNLX1UzMiBUb1BvcnRJZHggKi8KKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIFNXSVRDSCBIQVJEICIpKTsKKwljYXNlIFNLX0RSVl9TV0lUQ0hfU09GVDogLyogU0tfVTMyIEZyb21Qb3J0SWR4IFNLX1UzMiBUb1BvcnRJZHggKi8KKwkvKiBhY3Rpb24gbGlzdCA2ICovCisJCXByaW50aygiJXM6IHN3aXRjaGluZyB0byBwb3J0ICVjXG4iLCBwQUMtPmRldlswXS0+bmFtZSwKKwkJCSdBJytQYXJhbS5QYXJhMzJbMV0pOworCWNhc2UgU0tfRFJWX1NXSVRDSF9JTlRFUk46IC8qIFNLX1UzMiBGcm9tUG9ydElkeCBTS19VMzIgVG9Qb3J0SWR4ICovCisJCUZyb21Qb3J0ID0gUGFyYW0uUGFyYTMyWzBdOworCQlUb1BvcnQgPSBQYXJhbS5QYXJhMzJbMV07CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiUE9SVCBTV0lUQ0ggRVZFTlQsIEZyb206ICVkICBUbzogJWQgKFByZWYgJWQpICIsCisJCQlGcm9tUG9ydCwgVG9Qb3J0LCBwQUMtPlJsbXQuTmV0WzBdLlByZWZQb3J0KSk7CisJCU5ld1BhcmEuUGFyYTY0ID0gRnJvbVBvcnQ7CisJCVNrUG5taUV2ZW50KHBBQywgSW9DLCBTS19QTk1JX0VWVF9YTUFDX1JFU0VULCBOZXdQYXJhKTsKKwkJTmV3UGFyYS5QYXJhNjQgPSBUb1BvcnQ7CisJCVNrUG5taUV2ZW50KHBBQywgSW9DLCBTS19QTk1JX0VWVF9YTUFDX1JFU0VULCBOZXdQYXJhKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIEZyb21Qb3J0LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIFRvUG9ydCwgU0tfU1RPUF9BTEwsIFNLX1NPRlRfUlNUKTsKKwkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W0Zyb21Qb3J0XSwgU0tfRkFMU0UpOyAvKiBjbGVhcnMgcnggcmluZyAqLworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W1RvUG9ydF0sIFNLX0ZBTFNFKTsgLyogY2xlYXJzIHJ4IHJpbmcgKi8KKwkJCisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10pOworCQlDbGVhclR4UmluZyhwQUMsICZwQUMtPlR4UG9ydFtUb1BvcnRdW1RYX1BSSU9fTE9XXSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFtUb1BvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJcEFDLT5BY3RpdmVQb3J0ID0gVG9Qb3J0OworI2lmIDAKKwkJU2V0UXVldWVTaXplcyhwQUMpOworI2Vsc2UKKwkJLyogdHNjaGlsbGluZzogTmV3IGNvbW1vbiBmdW5jdGlvbiB3aXRoIG1pbmltdW0gc2l6ZSBjaGVjay4gKi8KKwkJRHVhbE5ldCA9IFNLX0ZBTFNFOworCQlpZiAocEFDLT5SbG10TmV0cyA9PSAyKSB7CisJCQlEdWFsTmV0ID0gU0tfVFJVRTsKKwkJfQorCQkKKwkJaWYgKFNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoCisJCQlwQUMsCisJCQlwQUMtPkFjdGl2ZVBvcnQsCisJCQlEdWFsTmV0KSkgeworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJCUZsYWdzKTsKKwkJCXByaW50aygiU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcyBmYWlsZWQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJLyogdHNjaGlsbGluZzogSGFuZGxpbmcgb2YgcmV0dXJuIHZhbHVlcyBpbnNlcnRlZC4gKi8KKwkJaWYgKFNrR2VJbml0UG9ydChwQUMsIElvQywgRnJvbVBvcnQpIHx8CisJCQlTa0dlSW5pdFBvcnQocEFDLCBJb0MsIFRvUG9ydCkpIHsKKwkJCXByaW50aygiJXM6IFNrR2VJbml0UG9ydCBmYWlsZWQuXG4iLCBwQUMtPmRldlswXS0+bmFtZSk7CisJCX0KKwkJaWYgKEV2ZW50ID09IFNLX0RSVl9TV0lUQ0hfU09GVCkgeworCQkJU2tNYWNSeFR4RW5hYmxlKHBBQywgSW9DLCBGcm9tUG9ydCk7CisJCX0KKwkJU2tNYWNSeFR4RW5hYmxlKHBBQywgSW9DLCBUb1BvcnQpOworCQlTa0FkZHJTd2FwKHBBQywgSW9DLCBGcm9tUG9ydCwgVG9Qb3J0KTsKKwkJU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIEZyb21Qb3J0KTsKKwkJU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIFRvUG9ydCk7CisJCVBvcnRSZUluaXRCbXUocEFDLCBGcm9tUG9ydCk7CisJCVBvcnRSZUluaXRCbXUocEFDLCBUb1BvcnQpOworCQlTa0dlUG9sbFR4RChwQUMsIElvQywgRnJvbVBvcnQsIFNLX1RSVUUpOworCQlTa0dlUG9sbFR4RChwQUMsIElvQywgVG9Qb3J0LCBTS19UUlVFKTsKKwkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgRnJvbVBvcnQpOworCQlDbGVhckFuZFN0YXJ0UngocEFDLCBUb1BvcnQpOworCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQlicmVhazsKKwljYXNlIFNLX0RSVl9STE1UX1NFTkQ6CSAvKiBTS19NQlVGICpwTWIgKi8KKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJSTFMgIikpOworCQlwUmxtdE1idWYgPSAoU0tfTUJVRiopIFBhcmFtLnBQYXJhUHRyOworCQlwTXNnID0gKHN0cnVjdCBza19idWZmKikgcFJsbXRNYnVmLT5wT3M7CisJCXNrYl9wdXQocE1zZywgcFJsbXRNYnVmLT5MZW5ndGgpOworCQlpZiAoWG1pdEZyYW1lKHBBQywgJnBBQy0+VHhQb3J0W3BSbG10TWJ1Zi0+UG9ydElkeF1bVFhfUFJJT19MT1ddLAorCQkJcE1zZykgPCAwKQorCisJCQlERVZfS0ZSRUVfU0tCX0FOWShwTXNnKTsKKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfVElNRVI6CisJCWlmIChQYXJhbS5QYXJhMzJbMF0gPT0gU0tfRFJWX01PREVSQVRJT05fVElNRVIpIHsKKwkJCS8qCisJCQkqKiBleHBpcmF0aW9uIG9mIHRoZSBtb2RlcmF0aW9uIHRpbWVyIGltcGxpZXMgdGhhdAorCQkJKiogZHluYW1pYyBtb2RlcmF0aW9uIGlzIHRvIGJlIGFwcGxpZWQKKwkJCSovCisJCQlTa0RpbVN0YXJ0TW9kZXJhdGlvblRpbWVyKHBBQyk7CisJCQlTa0RpbU1vZGVyYXRlKHBBQyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cykgeworCQkJICAgIFNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhwQUMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUGFyYW0uUGFyYTMyWzBdID09IFNLX0RSVl9SWF9DTEVBTlVQX1RJTUVSKSB7CisJCQkvKgorCQkJKiogY2hlY2sgaWYgd2UgbmVlZCB0byBjaGVjayBmb3IgZGVzY3JpcHRvcnMgd2hpY2gKKwkJCSoqIGhhdmVuJ3QgYmVlbiBoYW5kbGVkIHRoZSBsYXN0IG1pbGxpc2VjcworCQkJKi8KKwkJCVN0YXJ0RHJ2Q2xlYW51cFRpbWVyKHBBQyk7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKwkJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzFdLCBTS19GQUxTRSk7CisJCQl9CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzBdLCBTS19GQUxTRSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkV4cGlyYXRpb24gb2YgdW5rbm93biB0aW1lclxuIik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJKCJFTkQgRVZFTlQgIikpOworCQorCXJldHVybiAoMCk7Cit9IC8qIFNrRHJ2RXZlbnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0Vycm9yTG9nIC0gbG9nIGVycm9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBsb2dzIGVycm9ycyB0byB0aGUgc3lzdGVtIGJ1ZmZlciBhbmQgdG8gdGhlIGNvbnNvbGUKKyAqCisgKiBSZXR1cm5zOgorICoJMCBpZiBldmVyeXRoaW5nIG9rCisgKgk8IDAgIG9uIGVycm9yCisgKgkKKyAqLwordm9pZCBTa0Vycm9yTG9nKAorU0tfQUMJKnBBQywKK2ludAlFcnJDbGFzcywKK2ludAlFcnJOdW0sCitjaGFyCSpwRXJyb3JNc2cpCit7CitjaGFyCUNsYXNzU3RyWzgwXTsKKworCXN3aXRjaCAoRXJyQ2xhc3MpIHsKKwljYXNlIFNLX0VSUkNMX09USEVSOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJPdGhlciBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX0NPTkZJRzoKKwkJc3RyY3B5KENsYXNzU3RyLCAiQ29uZmlndXJhdGlvbiBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX0lOSVQ6CisJCXN0cmNweShDbGFzc1N0ciwgIkluaXRpYWxpemF0aW9uIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfTk9SRVM6CisJCXN0cmNweShDbGFzc1N0ciwgIk91dCBvZiByZXNvdXJjZXMgZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBTS19FUlJDTF9TVzoKKwkJc3RyY3B5KENsYXNzU3RyLCAiaW50ZXJuYWwgU29mdHdhcmUgZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBTS19FUlJDTF9IVzoKKwkJc3RyY3B5KENsYXNzU3RyLCAiSGFyZHdhcmUgZmFpbHVyZSIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX0NPTU06CisJCXN0cmNweShDbGFzc1N0ciwgIkNvbW11bmljYXRpb24gZXJyb3IiKTsKKwkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiAtLSBFUlJPUiAtLVxuICAgICAgICBDbGFzczogICVzXG4iCisJCSIgICAgICAgIE5yOiAgMHgleFxuICAgICAgICBNc2c6ICAlc1xuIiwgcEFDLT5kZXZbMF0tPm5hbWUsCisJCUNsYXNzU3RyLCBFcnJOdW0sIHBFcnJvck1zZyk7CisKK30gLyogU2tFcnJvckxvZyAqLworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2RW50ZXJEaWFnTW9kZSAtIGhhbmRsZXMgRElBRyBhdHRhY2ggcmVxdWVzdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aWZ5IHRoZSBrZXJuZWwgdG8gTk9UIGFjY2VzcyB0aGUgY2FyZCBhbnkgbG9uZ2VyIGR1ZSB0byBESUFHCisgKglEZWluaXRpYWxpemUgdGhlIENhcmQKKyAqCisgKiBSZXR1cm5zOgorICoJaW50CisgKi8KK2ludCBTa0RydkVudGVyRGlhZ01vZGUoCitTS19BQyAgICpwQWMpICAgLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK3sKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYocEFjLT5kZXZbMF0pOworCVNLX0FDICAgKnBBQyAgPSBwTmV0LT5wQUM7CisKKwlTS19NRU1DUFkoJihwQWMtPlBubWlCYWNrdXApLCAmKHBBYy0+UG5taVN0cnVjdCksIAorCQkJc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKworCXBBQy0+RGlhZ01vZGVBY3RpdmUgPSBESUFHX0FDVElWRTsKKwlpZiAocEFDLT5Cb2FyZExldmVsID4gU0tfSU5JVF9EQVRBKSB7CisJCWlmIChwTmV0LT5VcCkgeworCQkJcEFDLT5XYXNJZlVwWzBdID0gU0tfVFJVRTsKKwkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfVFJVRTsgLyogZm9yIFNrR2VDbG9zZSAgICAgICovCisJCQlEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfRkFMU0U7CisJCQlTa0RydkRlSW5pdEFkYXB0ZXIocEFDLCAwKTsgIC8qIHBlcmZvcm1zIFNrR2VDbG9zZSAqLworCQl9IGVsc2UgeworCQkJcEFDLT5XYXNJZlVwWzBdID0gU0tfRkFMU0U7CisJCX0KKwkJaWYgKHBOZXQgIT0gbmV0ZGV2X3ByaXYocEFDLT5kZXZbMV0pKSB7CisJCQlwTmV0ID0gbmV0ZGV2X3ByaXYocEFDLT5kZXZbMV0pOworCQkJaWYgKHBOZXQtPlVwKSB7CisJCQkJcEFDLT5XYXNJZlVwWzFdID0gU0tfVFJVRTsKKwkJCQlwQUMtPkRpYWdGbG93Q3RybCA9IFNLX1RSVUU7IC8qIGZvciBTa0dlQ2xvc2UgKi8KKwkJCQlEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfRkFMU0U7CisJCQkJU2tEcnZEZUluaXRBZGFwdGVyKHBBQywgMSk7ICAvKiBkbyBTa0dlQ2xvc2UgICovCisJCQl9IGVsc2UgeworCQkJCXBBQy0+V2FzSWZVcFsxXSA9IFNLX0ZBTFNFOworCQkJfQorCQl9CisJCXBBQy0+Qm9hcmRMZXZlbCA9IFNLX0lOSVRfREFUQTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0RydkxlYXZlRGlhZ01vZGUgLSBoYW5kbGVzIERJQUcgZGV0YWNoIHJlcXVlc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vdGlmeSB0aGUga2VybmVsIHRvIG1heSBhY2Nlc3MgdGhlIGNhcmQgYWdhaW4gYWZ0ZXIgdXNlIGJ5IERJQUcKKyAqCUluaXRpYWxpemUgdGhlIENhcmQKKyAqCisgKiBSZXR1cm5zOgorICogCWludAorICovCitpbnQgU2tEcnZMZWF2ZURpYWdNb2RlKAorU0tfQUMgICAqcEFjKSAgIC8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIGNvbnRleHQgKi8KK3sgCisJU0tfTUVNQ1BZKCYocEFjLT5Qbm1pU3RydWN0KSwgJihwQWMtPlBubWlCYWNrdXApLCAKKwkJCXNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisJcEFjLT5EaWFnTW9kZUFjdGl2ZSAgICA9IERJQUdfTk9UQUNUSVZFOworCXBBYy0+UG5taS5EaWFnQXR0YWNoZWQgPSBTS19ESUFHX0lETEU7CisgICAgICAgIGlmIChwQWMtPldhc0lmVXBbMF0gPT0gU0tfVFJVRSkgeworICAgICAgICAgICAgICAgIHBBYy0+RGlhZ0Zsb3dDdHJsID0gU0tfVFJVRTsgLyogZm9yIFNrR2VDbG9zZSAqLworCQlEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfRkFMU0U7CisgICAgICAgICAgICAgICAgU2tEcnZJbml0QWRhcHRlcihwQWMsIDApOyAgICAvKiBmaXJzdCBkZXZpY2UgICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHBBYy0+V2FzSWZVcFsxXSA9PSBTS19UUlVFKSB7CisgICAgICAgICAgICAgICAgcEFjLT5EaWFnRmxvd0N0cmwgPSBTS19UUlVFOyAvKiBmb3IgU2tHZUNsb3NlICovCisJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKyAgICAgICAgICAgICAgICBTa0RydkluaXRBZGFwdGVyKHBBYywgMSk7ICAgIC8qIHNlY29uZCBkZXZpY2UgKi8KKyAgICAgICAgfQorCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUGFyc2VEZXZpY2VOYnJGcm9tU2xvdE5hbWUgLSBFdmFsdWF0ZSBQQ0kgZGV2aWNlIG51bWJlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogCVRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBQQ0kgc2xvdCBuYW1lIGluZm9ybWF0aW9uIHN0cmluZyBhbmQgd2lsbAorICoJcmV0cmlldmUgdGhlIGRldmNpZSBudW1iZXIgb3V0IG9mIGl0LiBUaGUgc2xvdF9uYW1lIG1haW50aWFuZWQgYnkKKyAqCWxpbnV4IGlzIGluIHRoZSBmb3JtIG9mICcwMjowYS4wJywgd2hlcmVhcyB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgCisgKglyZXByZXNlbnQgdGhlIGJ1cyBudW1iZXIgaW4gaGV4IChpbiB0aGUgc2FtcGxlIGFib3ZlIHRoaXMgaXMgCisgKglwY2kgYnVzIDB4MDIpIGFuZCB0aGUgbmV4dCB0d28gY2hhcmFjdGVycyB0aGUgZGV2aWNlIG51bWJlciAoMHgwYSkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1UzMjogVGhlIGRldmljZSBudW1iZXIgZnJvbSB0aGUgUENJIHNsb3QgbmFtZQorICovIAorCitzdGF0aWMgU0tfVTMyIFBhcnNlRGV2aWNlTmJyRnJvbVNsb3ROYW1lKAorY29uc3QgY2hhciAqU2xvdE5hbWUpICAgLyogcG9pbnRlciB0byBwY2kgc2xvdCBuYW1lIGVnLiAnMDI6MGEuMCcgKi8KK3sKKwljaGFyCSpDdXJyQ2hhclBvcwk9IChjaGFyICopIFNsb3ROYW1lOworCWludAlGaXJzdE5pYmJsZQk9IC0xOworCWludAlTZWNvbmROaWJibGUJPSAtMTsKKwlTS19VMzIJUmVzdWx0CQk9ICAwOworCisJd2hpbGUgKCpDdXJyQ2hhclBvcyAhPSAnXDAnKSB7CisJCWlmICgqQ3VyckNoYXJQb3MgPT0gJzonKSB7IAorCQkJd2hpbGUgKCpDdXJyQ2hhclBvcyAhPSAnLicpIHsKKwkJCQlDdXJyQ2hhclBvcysrOyAgCisJCQkJaWYgKAkoKkN1cnJDaGFyUG9zID49ICcwJykgJiYgCisJCQkJCSgqQ3VyckNoYXJQb3MgPD0gJzknKSkgeworCQkJCQlpZiAoRmlyc3ROaWJibGUgPT0gLTEpIHsKKwkJCQkJCS8qIGRlYy4gdmFsdWUgZm9yICcwJyAqLworCQkJCQkJRmlyc3ROaWJibGUgPSAqQ3VyckNoYXJQb3MgLSA0ODsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVNlY29uZE5pYmJsZSA9ICpDdXJyQ2hhclBvcyAtIDQ4OworCQkJCQl9ICAKKwkJCQl9IGVsc2UgaWYgKAkoKkN1cnJDaGFyUG9zID49ICdhJykgJiYgCisJCQkJCQkoKkN1cnJDaGFyUG9zIDw9ICdmJykgICkgeworCQkJCQlpZiAoRmlyc3ROaWJibGUgPT0gLTEpIHsKKwkJCQkJCUZpcnN0TmliYmxlID0gKkN1cnJDaGFyUG9zIC0gODc7IAorCQkJCQl9IGVsc2UgeworCQkJCQkJU2Vjb25kTmliYmxlID0gKkN1cnJDaGFyUG9zIC0gODc7IAorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUmVzdWx0ID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCVJlc3VsdCA9IEZpcnN0TmliYmxlOworCQkJUmVzdWx0ID0gUmVzdWx0IDw8IDQ7IC8qIGZpcnN0IG5pYmJsZSBpcyBoaWdoZXIgb25lICovCisJCQlSZXN1bHQgPSBSZXN1bHQgfCBTZWNvbmROaWJibGU7CisJCX0KKwkJQ3VyckNoYXJQb3MrKzsgICAvKiBuZXh0IGNoYXJhY3RlciAqLworCX0KKwlyZXR1cm4gKFJlc3VsdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZEZUluaXRBZGFwdGVyIC0gZGVpbml0aWFsaXplIGFkYXB0ZXIgKHRoaXMgZnVuY3Rpb24gaXMgb25seSAKKyAqCQkJCWNhbGxlZCBpZiBEaWFnIGF0dGFjaGVzIHRvIHRoYXQgY2FyZCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNsb3NlIGluaXRpYWxpemVkIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBvbiBzdWNjZXNzCisgKgllcnJvciBjb2RlIC0gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0RydkRlSW5pdEFkYXB0ZXIoCitTS19BQyAgICpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgICovCitpbnQgICAgICBkZXZOYnIpCS8qIHdoYXQgZGV2aWNlIGlzIHRvIGJlIGhhbmRsZWQgKi8KK3sKKwlzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2OworCisJZGV2ID0gcEFDLT5kZXZbZGV2TmJyXTsKKworCS8qIE9uIExpbnV4IDIuNiB0aGUgbmV0d29yayBkcml2ZXIgZG9lcyBOT1QgbWVzcyB3aXRoIHJlZmVyZW5jZQorCSoqIGNvdW50cy4gIFRoZSBkcml2ZXIgTVVTVCBiZSBhYmxlIHRvIGJlIHVubG9hZGVkIGF0IGFueSB0aW1lCisJKiogZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBob3RwbHVnLgorCSovCisJaWYgKFNrR2VDbG9zZShkZXYpICE9IDApIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7CisKK30gLyogU2tEcnZEZUluaXRBZGFwdGVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0RydkluaXRBZGFwdGVyIC0gSW5pdGlhbGl6ZSBhZGFwdGVyICh0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgCisgKgkJCQljYWxsZWQgaWYgRGlhZyBkZWF0dGFjaGVzIGZyb20gdGhhdCBjYXJkKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2xvc2UgaW5pdGlhbGl6ZWQgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIG9uIHN1Y2Nlc3MKKyAqCWVycm9yIGNvZGUgLSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrRHJ2SW5pdEFkYXB0ZXIoCitTS19BQyAgICpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgICovCitpbnQgICAgICBkZXZOYnIpCS8qIHdoYXQgZGV2aWNlIGlzIHRvIGJlIGhhbmRsZWQgKi8KK3sKKwlzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2OworCisJZGV2ID0gcEFDLT5kZXZbZGV2TmJyXTsKKworCWlmIChTa0dlT3BlbihkZXYpICE9IDApIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkqKiBVc2UgY29ycmVjdCBNVFUgc2l6ZSBhbmQgaW5kaWNhdGUgdG8ga2VybmVsIFRYIHF1ZXVlIGNhbiBiZSBzdGFydGVkCisJKi8gCisJaWYgKFNrR2VDaGFuZ2VNdHUoZGV2LCBkZXYtPm10dSkgIT0gMCkgeworCQlyZXR1cm4gKC0xKTsKKwl9IAorCXJldHVybiAoMCk7CisKK30gLyogU2tEcnZJbml0QWRhcHRlciAqLworCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICJkZWJ1ZyBvbmx5IiBzZWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRHVtcE1zZyAtIHByaW50IGEgZnJhbWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIGZyYW1lcyB0byB0aGUgc3lzdGVtIGxvZ2ZpbGUvdG8gdGhlIGNvbnNvbGUuCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworc3RhdGljIHZvaWQgRHVtcE1zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpzdHIpCit7CisJaW50CW1zZ2xlbjsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoIkR1bXBNc2coKTogTlVMTC1NZXNzYWdlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2ItPmRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoIkR1bXBNc2coKTogTWVzc2FnZSBlbXB0eVxuIik7CisJCXJldHVybjsKKwl9CisKKwltc2dsZW4gPSBza2ItPmxlbjsKKwlpZiAobXNnbGVuID4gNjQpCisJCW1zZ2xlbiA9IDY0OworCisJcHJpbnRrKCItLS0gQmVnaW4gb2YgbWVzc2FnZSBmcm9tICVzICwgbGVuICVkIChmcm9tICVkKSAtLS0tXG4iLCBzdHIsIG1zZ2xlbiwgc2tiLT5sZW4pOworCisJRHVtcERhdGEoKGNoYXIgKilza2ItPmRhdGEsIG1zZ2xlbik7CisKKwlwcmludGsoIi0tLS0tLS0gRW5kIG9mIG1lc3NhZ2UgLS0tLS0tLS0tXG4iKTsKK30gLyogRHVtcE1zZyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRHVtcERhdGEgLSBwcmludCBhIGRhdGEgYXJlYQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwcmludHMgYSBhcmVhIG9mIGRhdGEgdG8gdGhlIHN5c3RlbSBsb2dmaWxlL3RvIHRoZQorICoJY29uc29sZS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCQorICovCitzdGF0aWMgdm9pZCBEdW1wRGF0YShjaGFyICpwLCBpbnQgc2l6ZSkKK3sKK3JlZ2lzdGVyIGludCAgICBpOworaW50CWhhZGRyLCBhZGRyOworY2hhcgloZXhfYnVmZmVyWzE4MF07CitjaGFyCWFzY19idWZmZXJbMTgwXTsKK2NoYXIJSEVYQ0hBUltdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisJYWRkciA9IDA7CisJaGFkZHIgPSAwOworCWhleF9idWZmZXJbMF0gPSAwOworCWFzY19idWZmZXJbMF0gPSAwOworCWZvciAoaT0wOyBpIDwgc2l6ZTsgKSB7CisJCWlmICgqcCA+PSAnMCcgJiYgKnAgPD0neicpCisJCQlhc2NfYnVmZmVyW2FkZHJdID0gKnA7CisJCWVsc2UKKwkJCWFzY19idWZmZXJbYWRkcl0gPSAnLic7CisJCWFkZHIrKzsKKwkJYXNjX2J1ZmZlclthZGRyXSA9IDA7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsoKnAgJiAweGYwKSA+PiA0XTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWypwICYgMHgwZl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gJyAnOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IDA7CisJCXArKzsKKwkJaSsrOworCQlpZiAoaSUxNiA9PSAwKSB7CisJCQlwcmludGsoIiVzICAlc1xuIiwgaGV4X2J1ZmZlciwgYXNjX2J1ZmZlcik7CisJCQlhZGRyID0gMDsKKwkJCWhhZGRyID0gMDsKKwkJfQorCX0KK30gLyogRHVtcERhdGEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEdW1wTG9uZyAtIHByaW50IGEgZGF0YSBhcmVhIGFzIGxvbmcgdmFsdWVzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBhIGFyZWEgb2YgZGF0YSB0byB0aGUgc3lzdGVtIGxvZ2ZpbGUvdG8gdGhlCisgKgljb25zb2xlLgorICoKKyAqIFJldHVybnM6IE4vQQorICoJCisgKi8KK3N0YXRpYyB2b2lkIER1bXBMb25nKGNoYXIgKnBjLCBpbnQgc2l6ZSkKK3sKK3JlZ2lzdGVyIGludCAgICBpOworaW50CWhhZGRyLCBhZGRyOworY2hhcgloZXhfYnVmZmVyWzE4MF07CitjaGFyCWFzY19idWZmZXJbMTgwXTsKK2NoYXIJSEVYQ0hBUltdID0gIjAxMjM0NTY3ODlBQkNERUYiOworbG9uZwkqcDsKK2ludAlsOworCisJYWRkciA9IDA7CisJaGFkZHIgPSAwOworCWhleF9idWZmZXJbMF0gPSAwOworCWFzY19idWZmZXJbMF0gPSAwOworCXAgPSAobG9uZyopIHBjOworCWZvciAoaT0wOyBpIDwgc2l6ZTsgKSB7CisJCWwgPSAobG9uZykgKnA7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAyOCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gMjQpICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDIwKSAmIDB4Zl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAxNikgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gMTIpICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDgpICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDQpICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSW2wgJiAweDBmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSAnICc7CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gMDsKKwkJcCsrOworCQlpKys7CisJCWlmIChpJTggPT0gMCkgeworCQkJcHJpbnRrKCIlNHggJXNcbiIsIChpLTgpKjQsIGhleF9idWZmZXIpOworCQkJaGFkZHIgPSAwOworCQl9CisJfQorCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKK30gLyogRHVtcExvbmcgKi8KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNrZ2VfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCVNLX0FDCQkJKnBBQzsKKwlERVZfTkVUCQkJKnBOZXQgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYgPSBOVUxMOworCXN0YXRpYyBpbnQgYm9hcmRzX2ZvdW5kID0gMDsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKyAKKwkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSAmJgorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmYpKQorCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKworCisJaWYgKChkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoREVWX05FVCkpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGV0aGVyZGV2ICIKKwkJICAgICAgICJzdHJ1Y3R1cmUhXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJcE5ldC0+cEFDID0ga21hbGxvYyhzaXplb2YoU0tfQUMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBOZXQtPnBBQykgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBhZGFwdGVyICIKKwkJICAgICAgICJzdHJ1Y3R1cmUhXG4iKTsKKwkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisJfQorCisJbWVtc2V0KHBOZXQtPnBBQywgMCwgc2l6ZW9mKFNLX0FDKSk7CisJcEFDID0gcE5ldC0+cEFDOworCXBBQy0+UGNpRGV2ID0gcGRldjsKKwlwQUMtPlBjaURldklkID0gcGRldi0+ZGV2aWNlOworCXBBQy0+ZGV2WzBdID0gZGV2OworCXBBQy0+ZGV2WzFdID0gZGV2OworCXNwcmludGYocEFDLT5OYW1lLCAiU3lzS29ubmVjdCBTSy05OHh4Iik7CisJcEFDLT5DaGVja1F1ZXVlID0gU0tfRkFMU0U7CisKKwlwTmV0LT5NdHUgPSAxNTAwOworCXBOZXQtPlVwID0gMDsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwllcnJvciA9IFNrR2VJbml0UENJKHBBQyk7CisJaWYgKGVycm9yKSB7CisJCXByaW50aygiU0tHRTogUENJIHNldHVwIGZhaWxlZDogJWlcbiIsIGVycm9yKTsKKwkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9CQkmU2tHZU9wZW47CisJZGV2LT5zdG9wID0JCSZTa0dlQ2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPQkmU2tHZVhtaXQ7CisJZGV2LT5nZXRfc3RhdHMgPQkmU2tHZVN0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlNrR2VTZXRSeE1vZGU7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPQkmU2tHZVNldE1hY0FkZHI7CisJZGV2LT5kb19pb2N0bCA9CQkmU2tHZUlvY3RsOworCWRldi0+Y2hhbmdlX210dSA9CSZTa0dlQ2hhbmdlTXR1OworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPQkmU2tHZVBvbGxDb250cm9sbGVyOworI2VuZGlmCisJZGV2LT5mbGFncyAmPSAJCX5JRkZfUlVOTklORzsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZTa0dlRXRodG9vbE9wcyk7CisKKyNpZmRlZiBTS19aRVJPQ09QWQorI2lmZGVmIFVTRV9TS19UWF9DSEVDS1NVTQorCWlmIChwQUMtPkNoaXBzZXRUeXBlKSB7CisJCS8qIFVzZSBvbmx5IGlmIHl1a29uIGhhcmR3YXJlICovCisJCS8qIFNLIGFuZCBaRVJPQ09QWSAtIGZseSBiYWJ5Li4uICovCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisJcEFDLT5JbmRleCA9IGJvYXJkc19mb3VuZCsrOworCisJaWYgKFNrR2VCb2FyZEluaXQoZGV2LCBwQUMpKQorCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKworCS8qIFJlZ2lzdGVyIG5ldCBkZXZpY2UgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTS0dFOiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOworCX0KKworCS8qIFByaW50IGFkYXB0ZXIgc3BlY2lmaWMgc3RyaW5nIGZyb20gdnBkICovCisJUHJvZHVjdFN0cihwQUMpOworCXByaW50aygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIHBBQy0+RGV2aWNlU3RyKTsKKworCS8qIFByaW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlwcmludGsoIiAgICAgIFByZWZQb3J0OiVjICBSbG10TW9kZTolc1xuIiwKKwkJJ0EnICsgcEFDLT5SbG10Lk5ldFswXS5Qb3J0W3BBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnRdLT5Qb3J0TnVtYmVyLAorCQkocEFDLT5SbG10TW9kZT09MCkgID8gIkNoZWNrIExpbmsgU3RhdGUiIDoKKwkJKChwQUMtPlJsbXRNb2RlPT0xKSA/ICJDaGVjayBMaW5rIFN0YXRlIiA6CisJCSgocEFDLT5SbG10TW9kZT09MykgPyAiQ2hlY2sgTG9jYWwgUG9ydCIgOgorCQkoKHBBQy0+UmxtdE1vZGU9PTcpID8gIkNoZWNrIFNlZ21lbnRhdGlvbiIgOgorCQkoKHBBQy0+UmxtdE1vZGU9PTE3KSA/ICJEdWFsIENoZWNrIExpbmsgU3RhdGUiIDoiRXJyb3IiKSkpKSk7CisKKwlTa0dlWWVsbG93TEVEKHBBQywgcEFDLT5Jb0Jhc2UsIDEpOworCisKKwltZW1jcHkoJmRldi0+ZGV2X2FkZHIsICZwQUMtPkFkZHIuTmV0WzBdLkN1cnJlbnRNYWNBZGRyZXNzLCA2KTsKKworCVNrR2VQcm9jQ3JlYXRlKGRldik7CisKKwlwTmV0LT5Qb3J0TnIgPSAwOworCXBOZXQtPk5ldE5yICA9IDA7CisKKwlib2FyZHNfZm91bmQrKzsKKworCS8qIE1vcmUgdGhlbiBvbmUgcG9ydCBmb3VuZCAqLworCWlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIgKSAmJiAocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQlpZiAoKGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihERVZfTkVUKSkpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGV0aGVyZGV2ICIKKwkJCQkic3RydWN0dXJlIVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXBBQy0+ZGV2WzFdICAgPSBkZXY7CisJCXBOZXQgICAgICAgICAgPSBuZXRkZXZfcHJpdihkZXYpOworCQlwTmV0LT5Qb3J0TnIgID0gMTsKKwkJcE5ldC0+TmV0TnIgICA9IDE7CisJCXBOZXQtPnBBQyAgICAgPSBwQUM7CisJCXBOZXQtPk10dSAgICAgPSAxNTAwOworCQlwTmV0LT5VcCAgICAgID0gMDsKKworCQlkZXYtPm9wZW4gICAgICAgICAgICAgICA9ICZTa0dlT3BlbjsKKwkJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSAmU2tHZUNsb3NlOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9ICZTa0dlWG1pdDsKKwkJZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSAmU2tHZVN0YXRzOworCQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZTa0dlU2V0UnhNb2RlOworCQlkZXYtPnNldF9tYWNfYWRkcmVzcyAgICA9ICZTa0dlU2V0TWFjQWRkcjsKKwkJZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSAmU2tHZUlvY3RsOworCQlkZXYtPmNoYW5nZV9tdHUgICAgICAgICA9ICZTa0dlQ2hhbmdlTXR1OworCQlkZXYtPmZsYWdzICAgICAgICAgICAgICY9IH5JRkZfUlVOTklORzsKKwkJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwkJU0VUX0VUSFRPT0xfT1BTKGRldiwgJlNrR2VFdGh0b29sT3BzKTsKKworI2lmZGVmIFNLX1pFUk9DT1BZCisjaWZkZWYgVVNFX1NLX1RYX0NIRUNLU1VNCisJCWlmIChwQUMtPkNoaXBzZXRUeXBlKSB7CisJCQkvKiBTRyBhbmQgWkVST0NPUFkgLSBmbHkgYmFieS4uLiAqLworCQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCQl9CisjZW5kaWYKKyNlbmRpZgorCisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTS0dFOiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJcEFDLT5kZXZbMV0gPSBwQUMtPmRldlswXTsKKwkJfSBlbHNlIHsKKwkJCVNrR2VQcm9jQ3JlYXRlKGRldik7CisJCQltZW1jcHkoJmRldi0+ZGV2X2FkZHIsCisJCQkJCSZwQUMtPkFkZHIuTmV0WzFdLkN1cnJlbnRNYWNBZGRyZXNzLCA2KTsKKwkKKwkJCXByaW50aygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIHBBQy0+RGV2aWNlU3RyKTsKKwkJCXByaW50aygiICAgICAgUHJlZlBvcnQ6QiAgUmxtdE1vZGU6RHVhbCBDaGVjayBMaW5rIFN0YXRlXG4iKTsKKwkJfQorCX0KKworCS8qIFNhdmUgdGhlIGhhcmR3YXJlIHJldmlzaW9uICovCisJcEFDLT5IV1JldmlzaW9uID0gKCgocEFDLT5HSW5pLkdJUGNpSHdSZXYgPj4gNCkgJiAweDBGKSoxMCkgKworCQkocEFDLT5HSW5pLkdJUGNpSHdSZXYgJiAweDBGKTsKKworCS8qIFNldCBkcml2ZXIgZ2xvYmFscyAqLworCXBBQy0+UG5taS5wRHJpdmVyRmlsZU5hbWUgICAgPSBEUklWRVJfRklMRV9OQU1FOworCXBBQy0+UG5taS5wRHJpdmVyUmVsZWFzZURhdGUgPSBEUklWRVJfUkVMX0RBVEU7CisKKwltZW1zZXQoJnBBQy0+UG5taUJhY2t1cCwgMCwgc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKwltZW1jcHkoJnBBQy0+UG5taUJhY2t1cCwgJnBBQy0+UG5taVN0cnVjdCwgc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworCisgb3V0X2ZyZWVfcmVzb3VyY2VzOgorCUZyZWVSZXNvdXJjZXMoZGV2KTsKKyBvdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBza2dlX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCXN0cnVjdCBuZXRfZGV2aWNlICpvdGhlcmRldiA9IHBBQy0+ZGV2WzFdOworCisJU2tHZVByb2NSZW1vdmUoZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChvdGhlcmRldiAhPSBkZXYpCisJCVNrR2VQcm9jUmVtb3ZlKG90aGVyZGV2KTsKKworCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMCk7CisKKwlpZiAocEFDLT5Cb2FyZExldmVsID09IFNLX0lOSVRfUlVOKSB7CisJCVNLX0VWUEFSQSBFdlBhcmE7CisJCXVuc2lnbmVkIGxvbmcgRmxhZ3M7CisKKwkJLyogYm9hcmQgaXMgc3RpbGwgYWxpdmUgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSAwOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlFdlBhcmEuUGFyYTMyWzBdID0gMTsKKwkJRXZQYXJhLlBhcmEzMlsxXSA9IC0xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RPUCwgRXZQYXJhKTsKKwkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgMCk7CisJCVNrR2VEZUluaXQocEFDLCBwQUMtPklvQmFzZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCXBBQy0+Qm9hcmRMZXZlbCA9IFNLX0lOSVRfREFUQTsKKwkJLyogV2UgZG8gTk9UIGNoZWNrIGhlcmUsIGlmIElSUSB3YXMgcGVuZGluZywgb2YgY291cnNlKi8KKwl9CisKKwlpZiAocEFDLT5Cb2FyZExldmVsID09IFNLX0lOSVRfSU8pIHsKKwkJLyogYm9hcmQgaXMgc3RpbGwgYWxpdmUgKi8KKwkJU2tHZURlSW5pdChwQUMsIHBBQy0+SW9CYXNlKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCX0KKworCUZyZWVSZXNvdXJjZXMoZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCWlmIChvdGhlcmRldiAhPSBkZXYpCisJCWZyZWVfbmV0ZGV2KG90aGVyZGV2KTsKKwlrZnJlZShwQUMpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2tnZV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTcwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDgwZWIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg0MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4NDMyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0YzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDMyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorI2lmIDAJLyogZG9uJ3QgaGFuZGxlIFl1a29uMiBjYXJkcyBhdCB0aGUgbW9tZW50IC0tIG1saW5kbmVyQHN5c2tvbm5lY3QuZGUgKi8KKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorI2VuZGlmCisJeyBQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NTAwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DTkVULCAweDQzNGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgMHgxMDMyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsIDB4MTA2NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNrZ2VfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBza2dlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2s5OGxpbiIsCisJLmlkX3RhYmxlCT0gc2tnZV9wY2lfdGJsLAorCS5wcm9iZQkJPSBza2dlX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNrZ2VfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBza2dlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlwU2tSb290RGlyID0gcHJvY19ta2RpcihTS1Jvb3ROYW1lLCBwcm9jX25ldCk7CisJaWYgKHBTa1Jvb3REaXIpIAorCQlwU2tSb290RGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCQorCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2tnZV9kcml2ZXIpOworCWlmIChlcnJvcikKKwkJcHJvY19uZXRfcmVtb3ZlKFNLUm9vdE5hbWUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNrZ2VfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2tnZV9kcml2ZXIpOworCXByb2NfbmV0X3JlbW92ZShTS1Jvb3ROYW1lKTsKKworfQorCittb2R1bGVfaW5pdChza2dlX2luaXQpOworbW9kdWxlX2V4aXQoc2tnZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWh3dC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaHd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2NzA5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWh3dC5jCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZWh3dC5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTUgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTM6NDE6MjMgJAorICogUHVycG9zZToJSGFyZHdhcmUgVGltZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRXZlbnQgcXVldWUgYW5kIGRpc3BhdGNoZXIKKyAqLworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2dlaHd0LmMsdiAxLjE1IDIwMDMvMDkvMTYgMTM6NDE6MjMgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sLSBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworI2lmZGVmIF9fQzJNQU5fXworLyoKKyAqICAgSGFyZHdhcmUgVGltZXIgZnVuY3Rpb24gcXVldWUgbWFuYWdlbWVudC4KKyAqLworaW50cm8oKQore30KKyNlbmRpZgorCisvKgorICogUHJvdG90eXBlcyBvZiBsb2NhbCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0tfSFdUX01BWAkoNjUwMDApCisKKy8qIGNvcnJlY3Rpb24gZmFjdG9yICovCisjZGVmaW5lCVNLX0hXVF9GQUMJKDEwMDAgKiAoU0tfVTMyKXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDApCisKKy8qCisgKiBJbml0aWFsaXplIGhhcmR3YXJlIHRpbWVyLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIGR1cmluZyBpbml0IGxldmVsIDEuCisgKi8KK3ZvaWQJU2tId3RJbml0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvYykJLyogSW9Db250ZXh0ICovCit7CisJcEFDLT5Id3QuVFN0YXJ0ID0gMCA7CisJcEFDLT5Id3QuVFN0b3AJPSAwIDsKKwlwQUMtPkh3dC5UQWN0aXZlID0gU0tfRkFMU0U7CisKKwlTa0h3dFN0b3AocEFDLCBJb2MpOworfQorCisvKgorICoKKyAqIFN0YXJ0IGhhcmR3YXJlIHRpbWVyIChjbG9jayB0aWNrcyBhcmUgMTZ1cykuCisgKgorICovCit2b2lkCVNrSHd0U3RhcnQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jLAkvKiBJb0NvbnRleHQgKi8KK1NLX1UzMglUaW1lKQkvKiBUaW1lIGluIHVuaXRzIG9mIDE2dXMgdG8gbG9hZCB0aGUgdGltZXIgd2l0aC4gKi8KK3sKKwlTS19VMzIJQ250OworCisJaWYgKFRpbWUgPiBTS19IV1RfTUFYKQorCQlUaW1lID0gU0tfSFdUX01BWDsKKworCXBBQy0+SHd0LlRTdGFydCA9IFRpbWU7CisJcEFDLT5Id3QuVFN0b3AgPSAwTDsKKworCUNudCA9IFRpbWU7CisKKwkvKgorCSAqIGlmIHRpbWUgPCAxNiB1cworCSAqCXRpbWUgPSAxNiB1cworCSAqLworCWlmICghQ250KSB7CisJCUNudCsrOworCX0KKworCVNLX09VVDMyKElvYywgQjJfVElfSU5JLCBDbnQgKiBTS19IV1RfRkFDKTsKKwkKKwlTS19PVVQxNihJb2MsIEIyX1RJX0NUUkwsIFRJTV9TVEFSVCk7CS8qIFN0YXJ0IHRpbWVyLiAqLworCisJcEFDLT5Id3QuVEFjdGl2ZSA9IFNLX1RSVUU7Cit9CisKKy8qCisgKiBTdG9wIGhhcmR3YXJlIHRpbWVyLgorICogYW5kIGNsZWFyIHRoZSB0aW1lciBJUlEKKyAqLwordm9pZAlTa0h3dFN0b3AoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlTS19PVVQxNihJb2MsIEIyX1RJX0NUUkwsIFRJTV9TVE9QKTsKKwkKKwlTS19PVVQxNihJb2MsIEIyX1RJX0NUUkwsIFRJTV9DTFJfSVJRKTsKKworCXBBQy0+SHd0LlRBY3RpdmUgPSBTS19GQUxTRTsKK30KKworCisvKgorICoJU3RvcCBoYXJkd2FyZSB0aW1lciBhbmQgcmVhZCB0aW1lIGVsYXBzZWQgc2luY2UgbGFzdCBzdGFydC4KKyAqCisgKiByZXR1cm5zCisgKglUaGUgZWxhcHNlZCB0aW1lIHNpbmNlIGxhc3Qgc3RhcnQgaW4gdW5pdHMgb2YgMTZ1cy4KKyAqCisgKi8KK1NLX1UzMglTa0h3dFJlYWQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlTS19VMzIJVFJlYWQ7CisJU0tfVTMyCUlTdGF0dXM7CisKKwlpZiAocEFDLT5Id3QuVEFjdGl2ZSkgeworCQkKKwkJU2tId3RTdG9wKHBBQywgSW9jKTsKKworCQlTS19JTjMyKElvYywgQjJfVElfVkFMLCAmVFJlYWQpOworCQlUUmVhZCAvPSBTS19IV1RfRkFDOworCisJCVNLX0lOMzIoSW9jLCBCMF9JU1JDLCAmSVN0YXR1cyk7CisKKwkJLyogQ2hlY2sgaWYgdGltZXIgZXhwaXJlZCAob3Igd3JhcGVkIGFyb3VuZCkgKi8KKwkJaWYgKChUUmVhZCA+IHBBQy0+SHd0LlRTdGFydCkgfHwgKElTdGF0dXMgJiBJU19USU1JTlQpKSB7CisJCQkKKwkJCVNrSHd0U3RvcChwQUMsIElvYyk7CisJCQkKKwkJCXBBQy0+SHd0LlRTdG9wID0gcEFDLT5Id3QuVFN0YXJ0OworCQl9CisJCWVsc2UgeworCQkJCisJCQlwQUMtPkh3dC5UU3RvcCA9IHBBQy0+SHd0LlRTdGFydCAtIFRSZWFkOworCQl9CisJfQorCXJldHVybihwQUMtPkh3dC5UU3RvcCk7Cit9CisKKy8qCisgKiBpbnRlcnJ1cHQgc291cmNlPSB0aW1lcgorICovCit2b2lkCVNrSHd0SXNyKAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvYykJLyogSW9Db250ZXh0ICovCit7CisJU2tId3RTdG9wKHBBQywgSW9jKTsKKwkKKwlwQUMtPkh3dC5UU3RvcCA9IHBBQy0+SHd0LlRTdGFydDsKKwkKKwlTa1RpbWVyRG9uZShwQUMsIElvYyk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vpbml0LmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0NDgzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWluaXQuYwpAQCAtMCwwICsxLDIxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlaW5pdC5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjk3ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzAyIDE2OjQ1OjMxICQKKyAqIFB1cnBvc2U6CUNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBsb2NhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrZ2Vpbml0LmMsdiAxLjk3IDIwMDMvMTAvMDIgMTY6NDU6MzEgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCitzdHJ1Y3Qgc19RT2ZmVGFiIHsKKwlpbnQJUnhRT2ZmOwkJLyogUmVjZWl2ZSBRdWV1ZSBBZGRyZXNzIE9mZnNldCAqLworCWludAlYc1FPZmY7CQkvKiBTeW5jIFR4IFF1ZXVlIEFkZHJlc3MgT2Zmc2V0ICovCisJaW50CVhhUU9mZjsJCS8qIEFzeW5jIFR4IFF1ZXVlIEFkZHJlc3MgT2Zmc2V0ICovCit9Oworc3RhdGljIHN0cnVjdCBzX1FPZmZUYWIgUU9mZlRhYltdID0geworCXtRX1IxLCBRX1hTMSwgUV9YQTF9LCB7UV9SMiwgUV9YUzIsIFFfWEEyfQorfTsKKworc3RydWN0IHNfQ29uZmlnIHsKKwljaGFyCVNjYW5TdHJpbmdbOF07CisJU0tfVTMyCVZhbHVlOworfTsKKworc3RhdGljIHN0cnVjdCBzX0NvbmZpZyBPZW1Db25maWcgPSB7CisJeydPJywnRScsJ00nLCdfJywnQycsJ28nLCduJywnZid9LAorI2lmZGVmIFNLX09FTV9DT05GSUcKKwlPRU1fQ09ORklHX1ZBTFVFLAorI2Vsc2UKKwkwLAorI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVBvbGxSeEQoKSAtIEVuYWJsZSAvIERpc2FibGUgRGVzY3JpcHRvciBQb2xsaW5nIG9mIFJ4RCBSaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglFbmFibGUgb3IgZGlzYWJsZSB0aGUgZGVzY3JpcHRvciBwb2xsaW5nIG9mIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IKKyAqCXJpbmcgKFJ4RCkgZm9yIHBvcnQgJ1BvcnQnLgorICoJVGhlIG5ldyBjb25maWd1cmF0aW9uIGlzICpub3QqIHNhdmVkIG92ZXIgYW55IFNrR2VTdG9wUG9ydCgpIGFuZAorICoJU2tHZUluaXRQb3J0KCkgY2FsbHMuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlUG9sbFJ4RCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MIFBvbGxSeEQpCS8qIFNLX1RSVUUgKGVuYWJsZSBwb2wuKSwgU0tfRkFMU0UgKGRpc2FibGUgcG9sLikgKi8KK3sKKwlTS19HRVBPUlQgKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBSeFFPZmYsIFFfQ1NSKSwgKFBvbGxSeEQpID8KKwkJQ1NSX0VOQV9QT0wgOiBDU1JfRElTX1BPTCk7Cit9CS8qIFNrR2VQb2xsUnhEICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VQb2xsVHhEKCkgLSBFbmFibGUgLyBEaXNhYmxlIERlc2NyaXB0b3IgUG9sbGluZyBvZiBUeEQgUmluZ3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZXNjcmlwdG9yIHBvbGxpbmcgb2YgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IKKyAqCXJpbmcocykgKFR4RCkgZm9yIHBvcnQgJ1BvcnQnLgorICoJVGhlIG5ldyBjb25maWd1cmF0aW9uIGlzICpub3QqIHNhdmVkIG92ZXIgYW55IFNrR2VTdG9wUG9ydCgpIGFuZAorICoJU2tHZUluaXRQb3J0KCkgY2FsbHMuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlUG9sbFR4RCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MIFBvbGxUeEQpCS8qIFNLX1RSVUUgKGVuYWJsZSBwb2wuKSwgU0tfRkFMU0UgKGRpc2FibGUgcG9sLikgKi8KK3sKKwlTS19HRVBPUlQgKnBQcnQ7CisJU0tfVTMyCURXb3JkOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlEV29yZCA9IChTS19VMzIpKFBvbGxUeEQgPyBDU1JfRU5BX1BPTCA6IENTUl9ESVNfUE9MKTsKKworCWlmIChwUHJ0LT5QWFNRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgRFdvcmQpOworCX0KKwkKKwlpZiAocFBydC0+UFhBUVNpemUgIT0gMCkgeworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIERXb3JkKTsKKwl9Cit9CS8qIFNrR2VQb2xsVHhEICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VZZWxsb3dMRUQoKSAtIFN3aXRjaCB0aGUgeWVsbG93IExFRCBvbiBvciBvZmYuCisgKgorICogRGVzY3JpcHRpb246CisgKglTd2l0Y2ggdGhlIHllbGxvdyBMRUQgb24gb3Igb2ZmLgorICoKKyAqIE5vdGU6CisgKglUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIgU2tHZUluaXQoTGV2ZWwgMSkuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlWWVsbG93TEVEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJU3RhdGUpCQkvKiB5ZWxsb3cgTEVEIHN0YXRlLCAwID0gT0ZGLCAwICE9IE9OICovCit7CisJaWYgKFN0YXRlID09IDApIHsKKwkJLyogU3dpdGNoIHllbGxvdyBMRUQgT0ZGICovCisJCVNLX09VVDgoSW9DLCBCMF9MRUQsIExFRF9TVEFUX09GRik7CisJfQorCWVsc2UgeworCQkvKiBTd2l0Y2ggeWVsbG93IExFRCBPTiAqLworCQlTS19PVVQ4KElvQywgQjBfTEVELCBMRURfU1RBVF9PTik7CisJfQorfQkvKiBTa0dlWWVsbG93TEVEICovCisKKworI2lmICghZGVmaW5lZChTS19TTElNKSB8fCBkZWZpbmVkKEdFTkVTSVMpKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VYbWl0TEVEKCkgLSBNb2RpZnkgdGhlIE9wZXJhdGlvbmFsIE1vZGUgb2YgYSB0cmFuc21pc3Npb24gTEVELgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIFJ4IG9yIFR4IExFRCB3aGljaCBpcyBzcGVjaWZpZWQgYnkgJ0xlZCcgd2lsbCBiZQorICoJZW5hYmxlZCwgZGlzYWJsZWQgb3Igc3dpdGNoZWQgb24gaW4gdGVzdCBtb2RlLgorICoKKyAqIE5vdGU6CisgKgknTGVkJyBtdXN0IGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2Zmc2V0IG9mIHRoZSBMRURzIElOSSByZWdpc3Rlci4KKyAqCisgKiBVc2FnZToKKyAqCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFRYX0xFRF9JTkkpLCBTS19MRURfRU5BKTsKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VYbWl0TEVEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJTGVkLAkJLyogb2Zmc2V0IHRvIHRoZSBMRUQgSW5pdCBWYWx1ZSByZWdpc3RlciAqLworaW50CQlNb2RlKQkJLyogTW9kZSBtYXkgYmUgU0tfTEVEX0RJUywgU0tfTEVEX0VOQSwgU0tfTEVEX1RTVCAqLworeworCVNLX1UzMglMZWRJbmk7CisKKwlzd2l0Y2ggKE1vZGUpIHsKKwljYXNlIFNLX0xFRF9FTkE6CisJCUxlZEluaSA9IFNLX1hNSVRfRFVSICogKFNLX1UzMilwQUMtPkdJbmkuR0lIc3RDbGtGYWN0IC8gMTAwOworCQlTS19PVVQzMihJb0MsIExlZCArIFhNSVRfTEVEX0lOSSwgTGVkSW5pKTsKKwkJU0tfT1VUOChJb0MsIExlZCArIFhNSVRfTEVEX0NUUkwsIExFRF9TVEFSVCk7CisJCWJyZWFrOworCWNhc2UgU0tfTEVEX1RTVDoKKwkJU0tfT1VUOChJb0MsIExlZCArIFhNSVRfTEVEX1RTVCwgTEVEX1RfT04pOworCQlTS19PVVQzMihJb0MsIExlZCArIFhNSVRfTEVEX0NOVCwgMTAwKTsKKwkJU0tfT1VUOChJb0MsIExlZCArIFhNSVRfTEVEX0NUUkwsIExFRF9TVEFSVCk7CisJCWJyZWFrOworCWNhc2UgU0tfTEVEX0RJUzoKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBEbyBOT1Qgc3RvcCB0aGUgTEVEIFRpbWVyIGhlcmUuIFRoZSBMRUQgbWlnaHQgYmUKKwkJICogaW4gb24gc3RhdGUuIEJ1dCBpdCBuZWVkcyB0byBnbyBvZmYuCisJCSAqLworCQlTS19PVVQzMihJb0MsIExlZCArIFhNSVRfTEVEX0NOVCwgMCk7CisJCVNLX09VVDgoSW9DLCBMZWQgKyBYTUlUX0xFRF9UU1QsIExFRF9UX09GRik7CisJCWJyZWFrOworCX0KKwkJCQorCS8qCisJICogMTAwMEJUOiBUaGUgVHJhbnNtaXQgTEVEIGlzIGRyaXZlbiBieSB0aGUgUEhZLgorCSAqIEJ1dCB0aGUgZGVmYXVsdCBMRUQgY29uZmlndXJhdGlvbiBpcyB1c2VkIGZvcgorCSAqIExldmVsIE9uZSBhbmQgQnJvYWRjb20gUEhZcy4KKwkgKiAoQnJvYWRjb206IEl0IG1heSBiZSB0aGF0IFBIWV9CX1BFQ19FTl9MVFIgaGFzIHRvIGJlIHNldC4pCisJICogKEluIHRoaXMgY2FzZSBpdCBoYXMgdG8gYmUgYWRkZWQgaGVyZS4gQnV0IHdlIHdpbGwgc2VlLiBYWFgpCisJICovCit9CS8qIFNrR2VYbWl0TEVEICovCisjZW5kaWYJLyogIVNLX1NMSU0gfHwgR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEb0NhbGNBZGRyKCkgLSBDYWxjdWxhdGVzIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBhZGRyZXNzIG9mIGEgcXVldWUuCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIGFkZHJlc3Mgb2YgYSBxdWV1ZS4KKyAqICBBZnRlcndhcmRzIHRoZSAnU3RhcnRWYWwnIGlzIGluY3JlbWVudGVkIHRvIHRoZSBuZXh0IHN0YXJ0IHBvc2l0aW9uLgorICoJSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMKKyAqCXdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjb25maWd1cmVkIHZhbHVlcyBhbmQgYW4KKyAqCWVycm9yIHdpbGwgYmUgcmV0dXJuZWQsIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4KKyAqCUlmIHRoZSBwb3J0IGlzIG5vdCBpbml0aWFsaXplZCB0aGUgdmFsdWVzIHdpbGwgYmUgd3JpdHRlbiB0bworICoJKlN0YXJ0QWRyIGFuZCAqRW5kQWRkci4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJc3VjY2VzcworICoJMToJY29uZmlndXJhdGlvbiBlcnJvcgorICovCitzdGF0aWMgaW50IERvQ2FsY0FkZHIoCitTS19BQwkJKnBBQywgCQkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfR0VQT1JUCVNLX0ZBUiAqcFBydCwJCS8qIHBvcnQgaW5kZXggKi8KK2ludAkJCVF1U2l6ZSwJCQkJLyogc2l6ZSBvZiB0aGUgcXVldWUgdG8gY29uZmlndXJlIGluIGtCICovCitTS19VMzIJCVNLX0ZBUiAqU3RhcnRWYWwsCS8qIHN0YXJ0IHZhbHVlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICovCitTS19VMzIJCVNLX0ZBUiAqUXVTdGFydEFkZHIsLyogc3RhcnQgYWRkciB0byBjYWxjdWxhdGUgKi8KK1NLX1UzMgkJU0tfRkFSICpRdUVuZEFkZHIpCS8qIGVuZCBhZGRyZXNzIHRvIGNhbGN1bGF0ZSAqLworeworCVNLX1UzMglFbmRWYWw7CisJU0tfVTMyCU5leHRTdGFydDsKKwlpbnQJCVJ0djsKKworCVJ0diA9IDA7CisJaWYgKFF1U2l6ZSA9PSAwKSB7CisJCUVuZFZhbCA9ICpTdGFydFZhbDsKKwkJTmV4dFN0YXJ0ID0gRW5kVmFsOworCX0KKwllbHNlIHsKKwkJRW5kVmFsID0gKlN0YXJ0VmFsICsgKChTS19VMzIpUXVTaXplICogMTAyNCkgLSAxOworCQlOZXh0U3RhcnQgPSBFbmRWYWwgKyAxOworCX0KKworCWlmIChwUHJ0LT5QU3RhdGUgPj0gU0tfUFJUX0lOSVQpIHsKKwkJaWYgKCpTdGFydFZhbCAhPSAqUXVTdGFydEFkZHIgfHwgRW5kVmFsICE9ICpRdUVuZEFkZHIpIHsKKwkJCVJ0diA9IDE7CisJCX0KKwl9CisJZWxzZSB7CisJCSpRdVN0YXJ0QWRkciA9ICpTdGFydFZhbDsKKwkJKlF1RW5kQWRkciA9IEVuZFZhbDsKKwl9CisKKwkqU3RhcnRWYWwgPSBOZXh0U3RhcnQ7CisJcmV0dXJuKFJ0dik7Cit9CS8qIERvQ2FsY0FkZHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoKSAtIGFsbG9jYXRlIGRlZmF1bHQgcXVldWUgc2l6ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gYXNzaWducyB0aGUgbWVtb3J5IHRvIHRoZSBkaWZmZXJlbnQgcXVldWVzIGFuZCBwb3J0cy4KKyAqCVdoZW4gRHVhbE5ldCBpcyBzZXQgdG8gU0tfVFJVRSBhbGwgcG9ydHMgZ2V0IHRoZSBzYW1lIGFtb3VudCBvZiBtZW1vcnkuCisgKiAgT3RoZXJ3aXNlIHRoZSBmaXJzdCBwb3J0IGdldHMgbW9zdCBvZiB0aGUgbWVtb3J5IGFuZCBhbGwgdGhlCisgKglvdGhlciBwb3J0cyBqdXN0IHRoZSByZXF1aXJlZCBtaW5pbXVtLgorICoJVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBwQUMtPkdJbmkuR0lSYW1TaXplIGFuZAorICoJcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIGhhdmUgYmVlbiBpbml0aWFsaXplZCwgdXN1YWxseSB0aGlzIGhhcHBlbnMKKyAqCWF0IGluaXQgbGV2ZWwgMQorICoKKyAqIFJldHVybnM6CisgKgkwIC0gb2sKKyAqCTEgLSBpbnZhbGlkIGlucHV0IHZhbHVlcworICoJMiAtIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KKworaW50IFNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgY29udGV4dCAqLworaW50CQlBY3RpdmVQb3J0LAkJLyogQWN0aXZlIFBvcnQgaW4gUkxNVCBtb2RlICovCitTS19CT09MCUR1YWxOZXQpCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK3sKKwlpbnQJaTsKKwlpbnQJVXNlZEtpbG9ieXRlczsJCQkvKiBtZW1vcnkgYWxyZWFkeSBhc3NpZ25lZCAqLworCWludAlBY3RpdmVQb3J0S2lsb2J5dGVzOwkvKiBtZW1vcnkgYXZhaWxhYmxlIGZvciBhY3RpdmUgcG9ydCAqLworCVNLX0dFUE9SVCAqcEdlUG9ydDsKKworCVVzZWRLaWxvYnl0ZXMgPSAwOworCisJaWYgKEFjdGl2ZVBvcnQgPj0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSU5JVCwKKwkJCSgiU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlczogQWN0aXZlUG9ydCAoJWQpIGludmFsaWRcbiIsCisJCQlBY3RpdmVQb3J0KSk7CisJCXJldHVybigxKTsKKwl9CisJaWYgKCgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kICogKFNLX01JTl9SWFFfU0laRSArIFNLX01JTl9UWFFfU0laRSkpICsKKwkJKChSQU1fUVVPVEFfU1lOQyA9PSAwKSA/IDAgOiBTS19NSU5fVFhRX1NJWkUpKSA+IHBBQy0+R0luaS5HSVJhbVNpemUpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JTklULAorCQkJKCJTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzOiBOb3QgZW5vdWdoIG1lbW9yeSAoJWQpXG4iLAorCQkJIHBBQy0+R0luaS5HSVJhbVNpemUpKTsKKwkJcmV0dXJuKDIpOworCX0KKworCWlmIChEdWFsTmV0KSB7CisJCS8qIGV2ZXJ5IHBvcnQgZ2V0cyB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5ICovCisJCUFjdGl2ZVBvcnRLaWxvYnl0ZXMgPSBwQUMtPkdJbmkuR0lSYW1TaXplIC8gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKworCQkJcEdlUG9ydCA9ICZwQUMtPkdJbmkuR1BbaV07CisJCQkKKwkJCS8qIHRha2UgYXdheSB0aGUgbWluaW11bSBtZW1vcnkgZm9yIGFjdGl2ZSBxdWV1ZXMgKi8KKwkJCUFjdGl2ZVBvcnRLaWxvYnl0ZXMgLT0gKFNLX01JTl9SWFFfU0laRSArIFNLX01JTl9UWFFfU0laRSk7CisKKwkJCS8qIHJlY2VpdmUgcXVldWUgZ2V0cyB0aGUgbWluaW11bSArIDgwJSBvZiB0aGUgcmVzdCAqLworCQkJcEdlUG9ydC0+UFJ4UVNpemUgPSAoaW50KSAoUk9VTkRfUVVFVUVfU0laRV9LQigoCisJCQkJQWN0aXZlUG9ydEtpbG9ieXRlcyAqICh1bnNpZ25lZCBsb25nKSBSQU1fUVVPVEFfUlgpIC8gMTAwKSkKKwkJCQkrIFNLX01JTl9SWFFfU0laRTsKKworCQkJQWN0aXZlUG9ydEtpbG9ieXRlcyAtPSAocEdlUG9ydC0+UFJ4UVNpemUgLSBTS19NSU5fUlhRX1NJWkUpOworCisJCQkvKiBzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZSAqLworCQkJcEdlUG9ydC0+UFhTUVNpemUgPSAwOworCisJCQkvKiBhc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUgKi8KKwkJCXBHZVBvcnQtPlBYQVFTaXplID0gKGludCkgUk9VTkRfUVVFVUVfU0laRV9LQihBY3RpdmVQb3J0S2lsb2J5dGVzICsKKwkJCQlTS19NSU5fVFhRX1NJWkUpOworCQl9CisJfQorCWVsc2UgewkKKwkJLyogUmxtdCBNb2RlIG9yIHNpbmdsZSBsaW5rIGFkYXB0ZXIgKi8KKworCQkvKiBTZXQgc3RhbmRieSBxdWV1ZSBzaXplIGRlZmF1bHRzIGZvciBhbGwgc3RhbmRieSBwb3J0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKworCQkJaWYgKGkgIT0gQWN0aXZlUG9ydCkgeworCQkJCXBHZVBvcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCisJCQkJcEdlUG9ydC0+UFJ4UVNpemUgPSBTS19NSU5fUlhRX1NJWkU7CisJCQkJcEdlUG9ydC0+UFhBUVNpemUgPSBTS19NSU5fVFhRX1NJWkU7CisJCQkJcEdlUG9ydC0+UFhTUVNpemUgPSAwOworCisJCQkJLyogQ291bnQgdXNlZCBSQU0gKi8KKwkJCQlVc2VkS2lsb2J5dGVzICs9IHBHZVBvcnQtPlBSeFFTaXplICsgcEdlUG9ydC0+UFhBUVNpemU7CisJCQl9CisJCX0KKwkJLyogd2hhdCdzIGxlZnQ/ICovCisJCUFjdGl2ZVBvcnRLaWxvYnl0ZXMgPSBwQUMtPkdJbmkuR0lSYW1TaXplIC0gVXNlZEtpbG9ieXRlczsKKworCQkvKiBhc3NpZ24gaXQgdG8gdGhlIGFjdGl2ZSBwb3J0ICovCisJCS8qIGZpcnN0IHRha2UgYXdheSB0aGUgbWluaW11bSBtZW1vcnkgKi8KKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyAtPSAoU0tfTUlOX1JYUV9TSVpFICsgU0tfTUlOX1RYUV9TSVpFKTsKKwkJcEdlUG9ydCA9ICZwQUMtPkdJbmkuR1BbQWN0aXZlUG9ydF07CisKKwkJLyogcmVjZWl2ZSBxdWV1ZSBnZXQncyB0aGUgbWluaW11bSArIDgwJSBvZiB0aGUgcmVzdCAqLworCQlwR2VQb3J0LT5QUnhRU2l6ZSA9IChpbnQpIChST1VORF9RVUVVRV9TSVpFX0tCKChBY3RpdmVQb3J0S2lsb2J5dGVzICoKKwkJCSh1bnNpZ25lZCBsb25nKSBSQU1fUVVPVEFfUlgpIC8gMTAwKSkgKyBTS19NSU5fUlhRX1NJWkU7CisKKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyAtPSAocEdlUG9ydC0+UFJ4UVNpemUgLSBTS19NSU5fUlhRX1NJWkUpOworCisJCS8qIHN5bmNocm9ub3VzIHRyYW5zbWl0IHF1ZXVlICovCisJCXBHZVBvcnQtPlBYU1FTaXplID0gMDsKKworCQkvKiBhc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUgKi8KKwkJcEdlUG9ydC0+UFhBUVNpemUgPSAoaW50KSBST1VORF9RVUVVRV9TSVpFX0tCKEFjdGl2ZVBvcnRLaWxvYnl0ZXMpICsKKwkJCVNLX01JTl9UWFFfU0laRTsKKwl9CisjaWZkZWYgVkNQVQorCVZDUFVwcmludGYoMCwgIlBSeFFTaXplPSV1LCBQWFNRU2l6ZT0ldSwgUFhBUVNpemU9JXVcbiIsCisJCXBHZVBvcnQtPlBSeFFTaXplLCBwR2VQb3J0LT5QWFNRU2l6ZSwgcEdlUG9ydC0+UFhBUVNpemUpOworI2VuZGlmIC8qIFZDUFUgKi8KKworCXJldHVybigwKTsKK30JLyogU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUNoZWNrUVNpemUoKSAtIENoZWNrcyB0aGUgQWRhcHRlcnMgUXVldWUgU2l6ZSBDb25maWd1cmF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBRdWV1ZSBTaXplIENvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCisgKglpbiB0aGUgdmFyaWFibGVzIFBSeFFTaXplLCBQWFNRU2l6ZSwgYW5kIFBYQVFTaXplIG9mIGFsbAorICoJdXNlZCBwb3J0cy4KKyAqCVRoaXMgcmVxdWlyZW1lbnRzIG11c3QgYmUgZnVsbGZpbGxlZCB0byBoYXZlIGEgdmFsaWQgY29uZmlndXJhdGlvbjoKKyAqCQktIFRoZSBzaXplIG9mIGFsbCBxdWV1ZXMgbXVzdCBub3QgZXhjZWVkIEdJUmFtU2l6ZS4KKyAqCQktIFRoZSBxdWV1ZSBzaXplcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB1bml0cyBvZiA4IGtCLgorICoJCS0gVGhlIHNpemUgb2YgUnggcXVldWVzIG9mIGF2YWlsYWJsZSBwb3J0cyBtdXN0IG5vdCBiZQorICoJCSAgc21hbGxlciB0aGFuIDE2IGtCLgorICoJCS0gVGhlIHNpemUgb2YgYXQgbGVhc3Qgb25lIFR4IHF1ZXVlIChzeW5jaC4gb3IgYXN5bmNoLikKKyAqICAgICAgICBvZiBhdmFpbGFibGUgcG9ydHMgbXVzdCBub3QgYmUgc21hbGxlciB0aGFuIDE2IGtCCisgKiAgICAgICAgd2hlbiBKdW1ibyBGcmFtZXMgYXJlIHVzZWQuCisgKgkJLSBUaGUgUkFNIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIG11c3Qgbm90IGJlIGNoYW5nZWQKKyAqCQkgIGZvciBwb3J0cyB3aGljaCBhcmUgYWxyZWFkeSBpbml0aWFsaXplZC4KKyAqCUZ1cnRoZXJtb3JlIFNrR2VDaGVja1FTaXplKCkgZGVmaW5lcyB0aGUgU3RhcnQgYW5kIEVuZCBBZGRyZXNzZXMKKyAqICBvZiBhbGwgcG9ydHMgYW5kIHN0b3JlcyB0aGVtIGludG8gdGhlIEhXQUMgcG9ydAlzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuczoKKyAqCTA6CVF1ZXVlIFNpemUgQ29uZmlndXJhdGlvbiB2YWxpZAorICoJMToJUXVldWUgU2l6ZSBDb25maWd1cmF0aW9uIGludmFsaWQKKyAqLworc3RhdGljIGludCBTa0dlQ2hlY2tRU2l6ZSgKK1NLX0FDCSAqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitpbnQJCSBQb3J0KQkJLyogcG9ydCBpbmRleCAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKwlpbnQJaTsKKwlpbnQJUnR2OworCWludAlSdHYyOworCVNLX1UzMglTdGFydEFkZHI7CisjaWZuZGVmIFNLX1NMSU0KKwlpbnQJVXNlZE1lbTsJLyogdG90YWwgbWVtb3J5IHVzZWQgKG1heC4gZm91bmQgcG9ydHMpICovCisjZW5kaWYJCisKKwlSdHYgPSAwOworCQorI2lmbmRlZiBTS19TTElNCisKKwlVc2VkTWVtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJcFBydCA9ICZwQUMtPkdJbmkuR1BbaV07CisKKwkJaWYgKChwUHJ0LT5QUnhRU2l6ZSAmIFFaX1VOSVRTKSAhPSAwIHx8CisJCQkocFBydC0+UFhTUVNpemUgJiBRWl9VTklUUykgIT0gMCB8fAorCQkJKHBQcnQtPlBYQVFTaXplICYgUVpfVU5JVFMpICE9IDApIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMiwgU0tFUlJfSFdJX0UwMTJNU0cpOworCQkJcmV0dXJuKDEpOworCQl9CisKKwkJaWYgKGkgPT0gUG9ydCAmJiBwUHJ0LT5QUnhRU2l6ZSA8IFNLX01JTl9SWFFfU0laRSkgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMSwgU0tFUlJfSFdJX0UwMTFNU0cpOworCQkJcmV0dXJuKDEpOworCQl9CisJCQorCQkvKgorCQkgKiB0aGUgc2l6ZSBvZiBhdCBsZWFzdCBvbmUgVHggcXVldWUgKHN5bmNoLiBvciBhc3luY2guKSBoYXMgdG8gYmUgPiAwLgorCQkgKiBpZiBKdW1ibyBGcmFtZXMgYXJlIHVzZWQsIHRoaXMgc2l6ZSBoYXMgdG8gYmUgPj0gMTYga0IuCisJCSAqLworCQlpZiAoKGkgPT0gUG9ydCAmJiBwUHJ0LT5QWFNRU2l6ZSA9PSAwICYmIHBQcnQtPlBYQVFTaXplID09IDApIHx8CisJCQkocEFDLT5HSW5pLkdJUG9ydFVzYWdlID09IFNLX0pVTUJPX0xJTksgJiYKKyAgICAgICAgICAgICgocFBydC0+UFhTUVNpemUgPiAwICYmIHBQcnQtPlBYU1FTaXplIDwgU0tfTUlOX1RYUV9TSVpFKSB8fAorCQkJIChwUHJ0LT5QWEFRU2l6ZSA+IDAgJiYgcFBydC0+UFhBUVNpemUgPCBTS19NSU5fVFhRX1NJWkUpKSkpIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDIzLCBTS0VSUl9IV0lfRTAyM01TRyk7CisJCQkJcmV0dXJuKDEpOworCQl9CisJCQorCQlVc2VkTWVtICs9IHBQcnQtPlBSeFFTaXplICsgcFBydC0+UFhTUVNpemUgKyBwUHJ0LT5QWEFRU2l6ZTsKKwl9CisJCisJaWYgKFVzZWRNZW0gPiBwQUMtPkdJbmkuR0lSYW1TaXplKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMTIsIFNLRVJSX0hXSV9FMDEyTVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKyNlbmRpZgkvKiAhU0tfU0xJTSAqLworCisJLyogTm93IHN0YXJ0IGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KKwlTdGFydEFkZHIgPSBwQUMtPkdJbmkuR0lSYW1PZmZzOworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtpXTsKKworCQkvKiBDYWxjdWxhdGUvQ2hlY2sgdmFsdWVzIGZvciB0aGUgcmVjZWl2ZSBxdWV1ZSAqLworCQlSdHYyID0gRG9DYWxjQWRkcihwQUMsIHBQcnQsIHBQcnQtPlBSeFFTaXplLCAmU3RhcnRBZGRyLAorCQkJJnBQcnQtPlBSeFFSYW1TdGFydCwgJnBQcnQtPlBSeFFSYW1FbmQpOworCQlSdHYgfD0gUnR2MjsKKworCQkvKiBDYWxjdWxhdGUvQ2hlY2sgdmFsdWVzIGZvciB0aGUgc3luY2hyb25vdXMgVHggcXVldWUgKi8KKwkJUnR2MiA9IERvQ2FsY0FkZHIocEFDLCBwUHJ0LCBwUHJ0LT5QWFNRU2l6ZSwgJlN0YXJ0QWRkciwKKwkJCSZwUHJ0LT5QWHNRUmFtU3RhcnQsICZwUHJ0LT5QWHNRUmFtRW5kKTsKKwkJUnR2IHw9IFJ0djI7CisKKwkJLyogQ2FsY3VsYXRlL0NoZWNrIHZhbHVlcyBmb3IgdGhlIGFzeW5jaHJvbm91cyBUeCBxdWV1ZSAqLworCQlSdHYyID0gRG9DYWxjQWRkcihwQUMsIHBQcnQsIHBQcnQtPlBYQVFTaXplLCAmU3RhcnRBZGRyLAorCQkJJnBQcnQtPlBYYVFSYW1TdGFydCwgJnBQcnQtPlBYYVFSYW1FbmQpOworCQlSdHYgfD0gUnR2MjsKKworCQlpZiAoUnR2KSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDEzLCBTS0VSUl9IV0lfRTAxM01TRyk7CisJCQlyZXR1cm4oMSk7CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR2VDaGVja1FTaXplICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSW5pdE1hY0FyYigpIC0gSW5pdGlhbGl6ZSB0aGUgTUFDIEFyYml0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIE1BQyBBcmJpdGVyLgorICoJSXQgbXVzdCBub3QgYmUgY2FsbGVkIGlmIHRoZXJlIGlzIHN0aWxsIGFuCisgKglpbml0aWFsaXplZCBvciBhY3RpdmUgcG9ydC4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdE1hY0FyYigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MpCQkvKiBJTyBjb250ZXh0ICovCit7CisJLyogcmVsZWFzZSBsb2NhbCByZXNldCAqLworCVNLX09VVDE2KElvQywgQjNfTUFfVE9fQ1RSTCwgTUFfUlNUX0NMUik7CisKKwkvKiBjb25maWd1cmUgdGltZW91dCB2YWx1ZXMgKi8KKwlTS19PVVQ4KElvQywgQjNfTUFfVE9JTklfUlgxLCBTS19NQUNfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19NQV9UT0lOSV9SWDIsIFNLX01BQ19UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX01BX1RPSU5JX1RYMSwgU0tfTUFDX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfVE9JTklfVFgyLCBTS19NQUNfVE9fNTMpOworCisJU0tfT1VUOChJb0MsIEIzX01BX1JDSU5JX1JYMSwgMCk7CisJU0tfT1VUOChJb0MsIEIzX01BX1JDSU5JX1JYMiwgMCk7CisJU0tfT1VUOChJb0MsIEIzX01BX1JDSU5JX1RYMSwgMCk7CisJU0tfT1VUOChJb0MsIEIzX01BX1JDSU5JX1RYMiwgMCk7CisKKwkvKiByZWNvdmVyeSB2YWx1ZXMgYXJlIG5lZWRlZCBmb3IgWE1BQyBJSSBSZXYuIEIyIG9ubHkgKi8KKwkvKiBGYXN0IE91dHB1dCBFbmFibGUgTW9kZSB3YXMgaW50ZW5kZWQgdG8gdXNlIHdpdGggUmV2LiBCMiwgYnV0IG5vdz8gKi8KKworCS8qCisJICogVGhlcmUgaXMgbm8gc3RhcnQgb3IgZW5hYmxlIGJ1dHRvbiB0byBwdXNoLCB0aGVyZWZvcmUKKwkgKiB0aGUgTUFDIGFyYml0ZXIgaXMgY29uZmlndXJlZCBhbmQgZW5hYmxlZCBub3cuCisJICovCit9CS8qIFNrR2VJbml0TWFjQXJiICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0UGt0QXJiKCkgLSBJbml0aWFsaXplIHRoZSBQYWNrZXQgQXJiaXRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUGFja2V0IEFyYml0ZXIuCisgKglJdCBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4KKyAqCWluaXRpYWxpemVkIG9yIGFjdGl2ZSBwb3J0LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VJbml0UGt0QXJiKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9SU1RfQ0xSKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lb3V0IHZhbHVlcyAqLworCVNLX09VVDE2KElvQywgQjNfUEFfVE9JTklfUlgxLCBTS19QS1RfVE9fTUFYKTsKKwlTS19PVVQxNihJb0MsIEIzX1BBX1RPSU5JX1JYMiwgU0tfUEtUX1RPX01BWCk7CisJU0tfT1VUMTYoSW9DLCBCM19QQV9UT0lOSV9UWDEsIFNLX1BLVF9UT19NQVgpOworCVNLX09VVDE2KElvQywgQjNfUEFfVE9JTklfVFgyLCBTS19QS1RfVE9fTUFYKTsKKworCS8qCisJICogZW5hYmxlIHRpbWVvdXQgdGltZXJzIGlmIGp1bWJvIGZyYW1lcyBub3QgdXNlZAorCSAqIE5PVEU6IHRoZSBwYWNrZXQgYXJiaXRlciB0aW1lb3V0IGludGVycnVwdCBpcyBuZWVkZWQgZm9yCisJICogaGFsZiBkdXBsZXggaGFuZ3VwIHdvcmthcm91bmQKKwkgKi8KKwlpZiAocEFDLT5HSW5pLkdJUG9ydFVzYWdlICE9IFNLX0pVTUJPX0xJTkspIHsKKwkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAxKSB7CisJCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0VOQV9UT19UWDEpOworCQl9CisJCWVsc2UgeworCQkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9FTkFfVE9fVFgxIHwgUEFfRU5BX1RPX1RYMik7CisJCX0KKwl9Cit9CS8qIFNrR2VJbml0UGt0QXJiICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSW5pdE1hY0ZpZm8oKSAtIEluaXRpYWxpemUgdGhlIE1BQyBGSUZPcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5pdGlhbGl6ZSBhbGwgTUFDIEZJRk9zIG9mIHRoZSBzcGVjaWZpZWQgcG9ydAorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VJbml0TWFjRmlmbygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTE2CVdvcmQ7CisjaWZkZWYgVkNQVQorCVNLX1UzMglEV29yZDsKKyNlbmRpZiAvKiBWQ1BVICovCisJLyoKKwkgKiBGb3IgZWFjaCBGSUZPOgorCSAqCS0gcmVsZWFzZSBsb2NhbCByZXNldAorCSAqCS0gdXNlIGRlZmF1bHQgdmFsdWUgZm9yIE1BQyBGSUZPIHNpemUKKwkgKgktIHNldHVwIGRlZmF1bHRzIGZvciB0aGUgY29udHJvbCByZWdpc3RlcgorCSAqCS0gZW5hYmxlIHRoZSBGSUZPCisJICovCisJCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIENvbmZpZ3VyZSBSeCBNQUMgRklGTyAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX0NMUik7CisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfUlhfQ1RSTF9ERUYpOworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfRU5BX09QX01EKTsKKwkKKwkJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9UWF9DVFJMX0RFRik7CisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCQorCQkvKiBFbmFibGUgZnJhbWUgZmx1c2hpbmcgaWYganVtYm8gZnJhbWVzIHVzZWQgKi8KKwkJaWYgKHBBQy0+R0luaS5HSVBvcnRVc2FnZSA9PSBTS19KVU1CT19MSU5LKSB7CisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9GTFVTSCk7CisJCX0KKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIHNldCBSeCBHTUFDIEZJRk8gRmx1c2ggTWFzayAqLworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0ZMX01TSyksIChTS19VMTYpUlhfRkZfRkxfREVGX01TSyk7CisJCQorCQlXb3JkID0gKFNLX1UxNilHTUZfUlhfQ1RSTF9ERUY7CisKKwkJLyogZGlzYWJsZSBSeCBHTUFDIEZJRk8gRmx1c2ggZm9yIFlVS09OLUxpdGUgUmV2LiBBMCBvbmx5ICovCisJCWlmIChwQUMtPkdJbmkuR0lZdWtvbkxpdGUgJiYgcEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHsKKworCQkJV29yZCAmPSB+R01GX1JYX0ZfRkxfT047CisJCX0KKwkJCisJCS8qIENvbmZpZ3VyZSBSeCBNQUMgRklGTyAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9SU1RfQ0xSKTsKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFJYX0dNRl9DVFJMX1QpLCBXb3JkKTsKKwkJCisJCS8qIHNldCBSeCBHTUFDIEZJRk8gRmx1c2ggVGhyZXNob2xkIChkZWZhdWx0OiAweDBhIC0+IDU2IGJ5dGVzKSAqLworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0ZMX1RIUiksIFJYX0dNRl9GTF9USFJfREVGKTsKKwkJCisJCS8qIENvbmZpZ3VyZSBUeCBNQUMgRklGTyAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9SU1RfQ0xSKTsKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTE2KUdNRl9UWF9DVFJMX0RFRik7CisJCQorI2lmZGVmIFZDUFUKKwkJU0tfSU4zMihJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0FGX1RIUiksICZEV29yZCk7CisJCVNLX0lOMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9BRV9USFIpLCAmRFdvcmQpOworI2VuZGlmIC8qIFZDUFUgKi8KKwkJCisJCS8qIHNldCBUeCBHTUFDIEZJRk8gQWxtb3N0IEVtcHR5IFRocmVzaG9sZCAqLworLyoJCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBUWF9HTUZfQUVfVEhSKSwgMCk7ICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tHZUluaXRNYWNGaWZvICovCisKKyNpZmRlZglTS19MTktfU1lOQ19DTlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlTG9hZExua1N5bmNDbnQoKSAtIExvYWQgdGhlIExpbmsgU3luYyBDb3VudGVyIGFuZCBzdGFydHMgY291bnRpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBMaW5rIFN5bmMgQ291bnRlciBvZiB0aGUgc3BlY2lmaWVkCisgKglwb3J0IGFuZCBlbmFibGVzIHRoZSBnZW5lcmF0aW9uIG9mIGFuIExpbmsgU3luYyBJUlEuCisgKglUaGUgTGluayBTeW5jIENvdW50ZXIgbWF5IGJlIHVzZWQgdG8gZGV0ZWN0IGFuIGFjdGl2ZSBsaW5rLAorICoJaWYgYXV0b25lZ290aWF0aW9uIGlzIG5vdCB1c2VkLgorICoKKyAqIE5vdGU6CisgKglvIFRvIGVuc3VyZSByZWNlaXZpbmcgdGhlIExpbmsgU3luYyBFdmVudCB0aGUgTGlua1N5bmNDb3VudGVyCisgKgkgIHNob3VsZCBiZSBpbml0aWFsaXplZCBCRUZPUkUgY2xlYXJpbmcgdGhlIFhNQUMncyByZXNldCEKKyAqCW8gRW5hYmxlIElTX0xOS19TWU5DX00xIGFuZCBJU19MTktfU1lOQ19NMiBhZnRlciBjYWxsaW5nIHRoaXMKKyAqCSAgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlTG9hZExua1N5bmNDbnQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTMyCUNudFZhbCkJCS8qIENvdW50ZXIgdmFsdWUgKi8KK3sKKwlTS19VMzIJT3JnSU1zazsKKwlTS19VMzIJTmV3SU1zazsKKwlTS19VMzIJSVNyYzsKKwlTS19CT09MCUlycVBlbmQ7CisKKwkvKiBzdG9wIGNvdW50ZXIgKi8KKwlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBMTktfU1lOQ19DVFJMKSwgTEVEX1NUT1ApOworCisJLyoKKwkgKiBBU0lDIHByb2JsZW06CisJICogRWFjaCB0aW1lIHN0YXJ0aW5nIHRoZSBMaW5rIFN5bmMgQ291bnRlciBhbiBJUlEgaXMgZ2VuZXJhdGVkCisJICogYnkgdGhlIGFkYXB0ZXIuIFNlZSBwcm9ibGVtIHJlcG9ydCBlbnRyeSBmcm9tIDIxLjA3Ljk4CisJICoKKwkgKiBXb3JrYXJvdW5kOglEaXNhYmxlIExpbmsgU3luYyBJUlEgYW5kIGNsZWFyIHRoZSB1bmV4cGVjZWQgSVJRCisJICoJCWlmIG5vIElSUSBpcyBhbHJlYWR5IHBlbmRpbmcuCisJICovCisJSXJxUGVuZCA9IFNLX0ZBTFNFOworCVNLX0lOMzIoSW9DLCBCMF9JU1JDLCAmSVNyYyk7CisJU0tfSU4zMihJb0MsIEIwX0lNU0ssICZPcmdJTXNrKTsKKwlpZiAoUG9ydCA9PSBNQUNfMSkgeworCQlOZXdJTXNrID0gT3JnSU1zayAmIH5JU19MTktfU1lOQ19NMTsKKwkJaWYgKChJU3JjICYgSVNfTE5LX1NZTkNfTTEpICE9IDApIHsKKwkJCUlycVBlbmQgPSBTS19UUlVFOworCQl9CisJfQorCWVsc2UgeworCQlOZXdJTXNrID0gT3JnSU1zayAmIH5JU19MTktfU1lOQ19NMjsKKwkJaWYgKChJU3JjICYgSVNfTE5LX1NZTkNfTTIpICE9IDApIHsKKwkJCUlycVBlbmQgPSBTS19UUlVFOworCQl9CisJfQorCWlmICghSXJxUGVuZCkgeworCQlTS19PVVQzMihJb0MsIEIwX0lNU0ssIE5ld0lNc2spOworCX0KKworCS8qIGxvYWQgY291bnRlciAqLworCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBMTktfU1lOQ19JTkkpLCBDbnRWYWwpOworCisJLyogc3RhcnQgY291bnRlciAqLworCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0NUUkwpLCBMRURfU1RBUlQpOworCisJaWYgKCFJcnFQZW5kKSB7CisJCS8qIGNsZWFyIHRoZSB1bmV4cGVjdGVkIElSUSwgYW5kIHJlc3RvcmUgdGhlIGludGVycnVwdCBtYXNrICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0NUUkwpLCBMRURfQ0xSX0lSUSk7CisJCVNLX09VVDMyKElvQywgQjBfSU1TSywgT3JnSU1zayk7CisJfQorfQkvKiBTa0dlTG9hZExua1N5bmNDbnQqLworI2VuZGlmCS8qIFNLX0xOS19TWU5DX0NOVCAqLworCisjaWYgZGVmaW5lZChTS19ESUFHKSB8fCBkZWZpbmVkKFNLX0NGR19TWU5DKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VDZmdTeW5jKCkgLSBDb25maWd1cmUgc3luY2hyb25vdXMgYmFuZHdpZHRoIGZvciB0aGlzIHBvcnQuCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBzeW5jaHJvbm91cyBiYW5kd2lkdGgKKyAqCXRvIHRoZSBzcGVjaWZpZWQgcG9ydC4gVGhpcyBtYXkgYmUgZG9uZSBhbnkgdGltZSBhZnRlcgorICoJaW5pdGlhbGl6aW5nIHRoZSBwb3J0LiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlIE5PVCBzYXZlZAorICoJaW4gdGhlIEhXQUMgcG9ydCBzdHJ1Y3R1cmUgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYW55CisgKgl0aW1lIHdoZW4gc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIHRoZSBwb3J0LgorICoJQW55IHZhbHVlcyBmb3IgdGhlIHN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBpZ25vcmVkCisgKglpZiB0aGUgc2l6ZSBvZiB0aGUgc3luY2hyb25vdXMgcXVldWUgaXMgemVybyEKKyAqCisgKglUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3luY2hyb25vdXMgc2VydmljZSBpcworICoJVFhBX0VOQV9GU1lOQy4gVGhpcyBtZWFucyBpZiB0aGUgc2l6ZSBvZgorICoJdGhlIHN5bmNocm9ub3VzIHF1ZXVlIGlzIHVuZXF1YWwgemVybyBidXQgbm8gc3BlY2lmaWMKKyAqCXN5bmNocm9ub3VzIGJhbmR3aWR0aCBpcyBjb25maWd1cmVkLCB0aGUgc3luY2hyb25vdXMgcXVldWUKKyAqCXdpbGwgYWx3YXlzIGhhdmUgdGhlICd1bmxpbWl0ZWQnIHRyYW5zbWl0IHByaW9yaXR5IQorICoKKyAqCVRoaXMgbW9kZSB3aWxsIGJlIHJlc3RvcmVkIGlmIHRoZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggaXMKKyAqCWRlYWxsb2NhdGVkICgnSW50VGltZScgPSAwIGFuZCAnTGltQ291bnQnID0gMCkuCisgKgorICogUmV0dXJuczoKKyAqCTA6CXN1Y2Nlc3MKKyAqCTE6CXBhcmFtZXRlciBjb25maWd1cmF0aW9uIGVycm9yCisgKgkyOgl0cnkgdG8gY29uZmlndXJlIHF1YWxpdHkgb2Ygc2VydmljZSBhbHRob3VnaCBubworICoJCXN5bmNocm9ub3VzIHF1ZXVlIGlzIGNvbmZpZ3VyZWQKKyAqLworaW50IFNrR2VDZmdTeW5jKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX1UzMglJbnRUaW1lLAkvKiBJbnRlcnZhbCBUaW1lciBWYWx1ZSBpbiB1bml0cyBvZiA4bnMgKi8KK1NLX1UzMglMaW1Db3VudCwJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGR1cmluZyBJbnRUaW1lICovCitpbnQJCVN5bmNNb2RlKQkvKiBTeW5jIE1vZGU6IFRYQV9FTkFfQUxMT0MgfCBUWEFfRElTX0FMTE9DIHwgMCAqLworeworCWludCBSdHY7CisKKwlSdHYgPSAwOworCisJLyogY2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKwlpZiAoTGltQ291bnQgPiBJbnRUaW1lIHx8CisJCShMaW1Db3VudCA9PSAwICYmIEludFRpbWUgIT0gMCkgfHwKKwkJKExpbUNvdW50ICE9IDAgJiYgSW50VGltZSA9PSAwKSkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMTAsIFNLRVJSX0hXSV9FMDEwTVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKwkKKwlpZiAocEFDLT5HSW5pLkdQW1BvcnRdLlBYU1FTaXplID09IDApIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAwOSwgU0tFUlJfSFdJX0UwMDlNU0cpOworCQlyZXR1cm4oMik7CisJfQorCQorCS8qIGNhbGN1bGF0ZSByZWdpc3RlciB2YWx1ZXMgKi8KKwlJbnRUaW1lID0gKEludFRpbWUgLyAyKSAqIHBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDA7CisJTGltQ291bnQgPSBMaW1Db3VudCAvIDg7CisJCisJaWYgKEludFRpbWUgPiBUWEFfTUFYX1ZBTCB8fCBMaW1Db3VudCA+IFRYQV9NQVhfVkFMKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMTAsIFNLRVJSX0hXSV9FMDEwTVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qCisJICogLSBFbmFibGUgJ0ZvcmNlIFN5bmMnIHRvIGVuc3VyZSB0aGUgc3luY2hyb25vdXMgcXVldWUKKwkgKiAgIGhhcyB0aGUgcHJpb3JpdHkgd2hpbGUgY29uZmlndXJpbmcgdGhlIG5ldyB2YWx1ZXMuCisJICogLSBBbHNvICdkaXNhYmxlIGFsbG9jJyB0byBlbnN1cmUgdGhlIHNldHRpbmdzIGNvbXBsaWVzCisJICogICB0byB0aGUgU3luY01vZGUgcGFyYW1ldGVyLgorCSAqIC0gRGlzYWJsZSAnUmF0ZSBDb250cm9sJyB0byBjb25maWd1cmUgdGhlIG5ldyB2YWx1ZXMuCisJICogLSB3cml0ZSBJbnRUaW1lIGFuZCBMaW1Db3VudAorCSAqIC0gc3RhcnQgJ1JhdGUgQ29udHJvbCcgYW5kIGRpc2FibGUgJ0ZvcmNlIFN5bmMnCisJICogICBpZiBJbnRlcnZhbCBUaW1lciBvciBMaW1pdCBDb3VudGVyIG5vdCB6ZXJvLgorCSAqLworCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9DVFJMKSwKKwkJVFhBX0VOQV9GU1lOQyB8IFRYQV9ESVNfQUxMT0MgfCBUWEFfU1RPUF9SQyk7CisJCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9JVElfSU5JKSwgSW50VGltZSk7CisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9MSU1fSU5JKSwgTGltQ291bnQpOworCQorCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9DVFJMKSwKKwkJKFNLX1U4KShTeW5jTW9kZSAmIChUWEFfRU5BX0FMTE9DIHwgVFhBX0RJU19BTExPQykpKTsKKwkKKwlpZiAoSW50VGltZSAhPSAwIHx8IExpbUNvdW50ICE9IDApIHsKKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLCBUWEFfRElTX0ZTWU5DIHwgVFhBX1NUQVJUX1JDKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR2VDZmdTeW5jICovCisjZW5kaWYgLyogU0tfRElBRyB8fCBTS19DRkdfU1lOQyovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCURvSW5pdFJhbVF1ZXVlKCkgLSBJbml0aWFsaXplIHRoZSBSQU0gQnVmZmVyIEFkZHJlc3Mgb2YgYSBzaW5nbGUgUXVldWUKKyAqCisgKiBEZXNjY3JpcHRpb246CisgKglJZiB0aGUgcXVldWUgaXMgdXNlZCwgZW5hYmxlIGFuZCBpbml0aWFsaXplIGl0LgorICoJTWFrZSBzdXJlIHRoZSBxdWV1ZSBpcyBzdGlsbCByZXNldCwgaWYgaXQgaXMgbm90IHVzZWQuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgRG9Jbml0UmFtUXVldWUoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVF1SW9PZmZzLAkJLyogUXVldWUgSU8gQWRkcmVzcyBPZmZzZXQgKi8KK1NLX1UzMglRdVN0YXJ0QWRkciwJLyogUXVldWUgU3RhcnQgQWRkcmVzcyAqLworU0tfVTMyCVF1RW5kQWRkciwJCS8qIFF1ZXVlIEVuZCBBZGRyZXNzICovCitpbnQJCVF1VHlwZSkJCQkvKiBRdWV1ZSBUeXBlIChTS19SWF9TUkFNX1F8U0tfUlhfQlJBTV9RfFNLX1RYX1JBTV9RKSAqLworeworCVNLX1UzMglSeFVwVGhyZXNWYWw7CisJU0tfVTMyCVJ4TG9UaHJlc1ZhbDsKKworCWlmIChRdVN0YXJ0QWRkciAhPSBRdUVuZEFkZHIpIHsKKwkJLyogY2FsY3VsYXRlIHRocmVzaG9sZHMsIGFzc3VtZSB3ZSBoYXZlIGEgYmlnIFJ4IHF1ZXVlICovCisJCVJ4VXBUaHJlc1ZhbCA9IChRdUVuZEFkZHIgKyAxIC0gUXVTdGFydEFkZHIgLSBTS19SQl9VTFBQKSAvIDg7CisJCVJ4TG9UaHJlc1ZhbCA9IChRdUVuZEFkZHIgKyAxIC0gUXVTdGFydEFkZHIgLSBTS19SQl9MTFBQX0IpLzg7CisKKwkJLyogYnVpbGQgSFcgYWRkcmVzcyBmb3JtYXQgKi8KKwkJUXVTdGFydEFkZHIgPSBRdVN0YXJ0QWRkciAvIDg7CisJCVF1RW5kQWRkciA9IFF1RW5kQWRkciAvIDg7CisKKwkJLyogcmVsZWFzZSBsb2NhbCByZXNldCAqLworCQlTS19PVVQ4KElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfQ1RSTCksIFJCX1JTVF9DTFIpOworCisJCS8qIGNvbmZpZ3VyZSBhZGRyZXNzZXMgKi8KKwkJU0tfT1VUMzIoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9TVEFSVCksIFF1U3RhcnRBZGRyKTsKKwkJU0tfT1VUMzIoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9FTkQpLCBRdUVuZEFkZHIpOworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1dQKSwgUXVTdGFydEFkZHIpOworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1JQKSwgUXVTdGFydEFkZHIpOworCisJCXN3aXRjaCAoUXVUeXBlKSB7CisJCWNhc2UgU0tfUlhfU1JBTV9ROgorCQkJLyogY29uZmlndXJlIHRocmVzaG9sZCBmb3Igc21hbGwgUnggUXVldWUgKi8KKwkJCVJ4TG9UaHJlc1ZhbCArPSAoU0tfUkJfTExQUF9CIC0gU0tfUkJfTExQUF9TKSAvIDg7CisKKwkJCS8qIGNvbnRpbnVlIHdpdGggU0tfUlhfQlJBTV9RICovCisJCWNhc2UgU0tfUlhfQlJBTV9ROgorCQkJLyogd3JpdGUgdGhyZXNob2xkIGZvciBSeCBRdWV1ZSAqLworCisJCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1JYX1VUUFApLCBSeFVwVGhyZXNWYWwpOworCQkJU0tfT1VUMzIoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9SWF9MVFBQKSwgUnhMb1RocmVzVmFsKTsKKworCQkJLyogdGhlIGhpZ2ggcHJpb3JpdHkgdGhyZXNob2xkIG5vdCB1c2VkICovCisJCQlicmVhazsKKwkJY2FzZSBTS19UWF9SQU1fUToKKwkJCS8qCisJCQkgKiBEbyBOT1QgdXNlIFN0b3JlICYgRm9yd2FyZCB1bmRlciBub3JtYWwgb3BlcmF0aW9uIGR1ZSB0bworCQkJICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIChHRU5FU0lTIG9ubHkpLgorCQkJICogQnV0IGlmIEp1bWJvIEZyYW1lcyBhcmUgY29uZmlndXJlZCAoWE1BQyBUeCBGSUZPIGlzIG9ubHkgNCBrQikKKwkJCSAqIG9yIFlVS09OIGlzIHVzZWQgKChHTUFDIFR4IEZJRk8gaXMgb25seSAxIGtCKQorCQkJICogd2UgTkVFRCBTdG9yZSAmIEZvcndhcmQgb2YgdGhlIFJBTSBidWZmZXIuCisJCQkgKi8KKwkJCWlmIChwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPT0gU0tfSlVNQk9fTElOSyB8fAorCQkJCXBBQy0+R0luaS5HSVl1a29uKSB7CisJCQkJLyogZW5hYmxlIFN0b3JlICYgRm9yd2FyZCBNb2RlIGZvciB0aGUgVHggU2lkZSAqLworCQkJCVNLX09VVDgoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9DVFJMKSwgUkJfRU5BX1NURldEKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogc2V0IHF1ZXVlIG9wZXJhdGlvbmFsICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9DVFJMKSwgUkJfRU5BX09QX01EKTsKKwl9CisJZWxzZSB7CisJCS8qIGVuc3VyZSB0aGUgcXVldWUgaXMgc3RpbGwgZGlzYWJsZWQgKi8KKwkJU0tfT1VUOChJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKwl9Cit9CS8qIERvSW5pdFJhbVF1ZXVlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0UmFtQnVmcygpIC0gSW5pdGlhbGl6ZSB0aGUgUkFNIEJ1ZmZlciBRdWV1ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUluaXRpYWxpemUgYWxsIFJBTSBCdWZmZXIgUXVldWVzIG9mIHRoZSBzcGVjaWZpZWQgcG9ydAorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VJbml0UmFtQnVmcygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUICpwUHJ0OworCWludCBSeFFUeXBlOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UFJ4UVNpemUgPT0gU0tfTUlOX1JYUV9TSVpFKSB7CisJCVJ4UVR5cGUgPSBTS19SWF9TUkFNX1E7IAkvKiBzbWFsbCBSeCBRdWV1ZSAqLworCX0KKwllbHNlIHsKKwkJUnhRVHlwZSA9IFNLX1JYX0JSQU1fUTsJCS8qIGJpZyBSeCBRdWV1ZSAqLworCX0KKworCURvSW5pdFJhbVF1ZXVlKHBBQywgSW9DLCBwUHJ0LT5QUnhRT2ZmLCBwUHJ0LT5QUnhRUmFtU3RhcnQsCisJCXBQcnQtPlBSeFFSYW1FbmQsIFJ4UVR5cGUpOworCQorCURvSW5pdFJhbVF1ZXVlKHBBQywgSW9DLCBwUHJ0LT5QWHNRT2ZmLCBwUHJ0LT5QWHNRUmFtU3RhcnQsCisJCXBQcnQtPlBYc1FSYW1FbmQsIFNLX1RYX1JBTV9RKTsKKwkKKwlEb0luaXRSYW1RdWV1ZShwQUMsIElvQywgcFBydC0+UFhhUU9mZiwgcFBydC0+UFhhUVJhbVN0YXJ0LAorCQlwUHJ0LT5QWGFRUmFtRW5kLCBTS19UWF9SQU1fUSk7CisKK30JLyogU2tHZUluaXRSYW1CdWZzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0UmFtSWZhY2UoKSAtIEluaXRpYWxpemUgdGhlIFJBTSBJbnRlcmZhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXJzIFJBTSBJbnRlcmZhY2UuCisgKgorICogTm90ZToKKyAqCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0aGUgZGlhZ25vc3RpY3MuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlSW5pdFJhbUlmYWNlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJU0tfT1VUMTYoSW9DLCBCM19SSV9DVFJMLCBSSV9SU1RfQ0xSKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lb3V0IHZhbHVlcyAqLworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fUjEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfV1RPX1hBMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fWFMxLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19SMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9SVE9fWEExLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19YUzEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfV1RPX1IyLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1dUT19YQTIsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfV1RPX1hTMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9SVE9fUjIsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfUlRPX1hBMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9SVE9fWFMyLCBTS19SSV9UT181Myk7CisKK30JLyogU2tHZUluaXRSYW1JZmFjZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSW5pdEJtdSgpIC0gSW5pdGlhbGl6ZSB0aGUgQk1VIHN0YXRlIG1hY2hpbmVzCisgKgorICogRGVzY3JpcHRpb246CisgKglJbml0aWFsaXplIGFsbCBCTVUgc3RhdGUgbWFjaGluZXMgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRCbXUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMzIJCVJ4V207CisJU0tfVTMyCQlUeFdtOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlSeFdtID0gU0tfQk1VX1JYX1dNOworCVR4V20gPSBTS19CTVVfVFhfV007CisJCisJaWYgKCFwQUMtPkdJbmkuR0lQY2lTbG90NjQgJiYgIXBBQy0+R0luaS5HSVBjaUNsb2NrNjYpIHsKKwkJLyogZm9yIGJldHRlciBwZXJmb3JtYW5jZSAqLworCQlSeFdtIC89IDI7CisJCVR4V20gLz0gMjsKKwl9CisKKwkvKiBSeCBRdWV1ZTogUmVsZWFzZSBhbGwgbG9jYWwgcmVzZXRzIGFuZCBzZXQgdGhlIHdhdGVybWFyayAqLworCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBSeFFPZmYsIFFfQ1NSKSwgQ1NSX0NMUl9SRVNFVCk7CisJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9GKSwgUnhXbSk7CisKKwkvKgorCSAqIFR4IFF1ZXVlOiBSZWxlYXNlIGFsbCBsb2NhbCByZXNldHMgaWYgdGhlIHF1ZXVlIGlzIHVzZWQgIQorCSAqIAkJc2V0IHdhdGVybWFyaworCSAqLworCWlmIChwUHJ0LT5QWFNRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgQ1NSX0NMUl9SRVNFVCk7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfRiksIFR4V20pOworCX0KKwkKKwlpZiAocFBydC0+UFhBUVNpemUgIT0gMCkgeworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIENTUl9DTFJfUkVTRVQpOworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0YpLCBUeFdtKTsKKwl9CisJLyoKKwkgKiBEbyBOT1QgZW5hYmxlIHRoZSBkZXNjcmlwdG9yIHBvbGwgdGltZXJzIGhlcmUsIGJlY2F1c2UKKwkgKiB0aGUgZGVzY3JpcHRvciBhZGRyZXNzZXMgYXJlIG5vdCBzcGVjaWZpZWQgeWV0LgorCSAqLworfQkvKiBTa0dlSW5pdEJtdSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglUZXN0U3RvcEJpdCgpIC0JVGVzdCB0aGUgc3RvcCBiaXQgb2YgdGhlIHF1ZXVlCisgKgorICogRGVzY3JpcHRpb246CisgKglTdG9wcGluZyBhIHF1ZXVlIGlzIG5vdCBhcyBzaW1wbGUgYXMgaXQgc2VlbXMgdG8gYmUuCisgKglJZiBkZXNjcmlwdG9yIHBvbGxpbmcgaXMgZW5hYmxlZCwgaXQgbWF5IGhhcHBlbgorICoJdGhhdCBSWC9UWCBzdG9wIGlzIGRvbmUgYW5kIFNWIGlkbGUgaXMgTk9UIHNldC4KKyAqCUluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGlzc3VlIGFub3RoZXIgc3RvcCBjb21tYW5kLgorICoKKyAqIFJldHVybnM6CisgKglUaGUgcXVldWVzIGNvbnRyb2wgc3RhdHVzIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBTS19VMzIgVGVzdFN0b3BCaXQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlRdUlvT2ZmcykJLyogUXVldWUgSU8gQWRkcmVzcyBPZmZzZXQgKi8KK3sKKwlTS19VMzIJUXVDc3I7CS8qIENTUiBjb250ZW50cyAqLworCisJU0tfSU4zMihJb0MsIFFfQUREUihRdUlvT2ZmcywgUV9DU1IpLCAmUXVDc3IpOworCQorCWlmICgoUXVDc3IgJiAoQ1NSX1NUT1AgfCBDU1JfU1ZfSURMRSkpID09IDApIHsKKwkJLyogU3RvcCBEZXNjcmlwdG9yIG92ZXJyaWRkZW4gYnkgc3RhcnQgY29tbWFuZCAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihRdUlvT2ZmcywgUV9DU1IpLCBDU1JfU1RPUCk7CisKKwkJU0tfSU4zMihJb0MsIFFfQUREUihRdUlvT2ZmcywgUV9DU1IpLCAmUXVDc3IpOworCX0KKwkKKwlyZXR1cm4oUXVDc3IpOworfQkvKiBUZXN0U3RvcEJpdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlU3RvcFBvcnQoKSAtIFN0b3AgdGhlIFJ4L1R4IGFjdGl2aXR5IG9mIHRoZSBwb3J0ICdQb3J0Jy4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGUgZGVzY3JpcHRvciByaW5ncyBhbmQgUnggYW5kIFR4CisgKglxdWV1ZXMgb2YgdGhpcyBwb3J0IG1heSBiZSByZWNvbmZpZ3VyZWQuCisgKgorICoJSXQgaXMgcG9zc2libGUgdG8gc3RvcCB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcGF0aCBzZXBhcmF0ZSBvcgorICoJYm90aCB0b2dldGhlci4KKyAqCisgKglEaXIgPQlTS19TVE9QX1RYIAlTdG9wcyB0aGUgdHJhbnNtaXQgcGF0aCBvbmx5IGFuZCByZXNldHMgdGhlIE1BQy4KKyAqCQkJCVRoZSByZWNlaXZlIHF1ZXVlIGlzIHN0aWxsIGFjdGl2ZSBhbmQKKyAqCQkJCXRoZSBwZW5kaW5nIFJ4IGZyYW1lcyBtYXkgYmUgc3RpbGwgdHJhbnNmZXJyZWQKKyAqCQkJCWludG8gdGhlIFJ4RC4KKyAqCQlTS19TVE9QX1JYCVN0b3AgdGhlIHJlY2VpdmUgcGF0aC4gVGhlIHRhbnNtaXQgcGF0aAorICoJCQkJaGFzIHRvIGJlIHN0b3BwZWQgb25jZSBiZWZvcmUuCisgKgkJU0tfU1RPUF9BTEwJU0tfU1RPUF9UWCArIFNLX1NUT1BfUlgKKyAqCisgKglSc3RNb2RlID0gU0tfU09GVF9SU1QJUmVzZXRzIHRoZSBNQUMuIFRoZSBQSFkgaXMgc3RpbGwgYWxpdmUuCisgKgkJCVNLX0hBUkRfUlNUCVJlc2V0cyB0aGUgTUFDIGFuZCB0aGUgUEhZLgorICoKKyAqIEV4YW1wbGU6CisgKgkxKSBBIExpbmsgRG93biBldmVudCB3YXMgc2lnbmFsZWQgZm9yIGEgcG9ydC4gVGhlcmVmb3JlIHRoZSBhY3Rpdml0eQorICoJb2YgdGhpcyBwb3J0IHNob3VsZCBiZSBzdG9wcGVkIGFuZCBhIGhhcmR3YXJlIHJlc2V0IHNob3VsZCBiZSBpc3N1ZWQKKyAqCXRvIGVuYWJsZSB0aGUgd29ya2Fyb3VuZCBvZiBYTUFDIEVycmF0YSAjMi4gQnV0IHRoZSByZWNlaXZlZCBmcmFtZXMKKyAqCXNob3VsZCBub3QgYmUgZGlzY2FyZGVkLgorICoJCS4uLgorICoJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgUG9ydCwgU0tfU1RPUF9UWCwgU0tfSEFSRF9SU1QpOworICoJCSh0cmFuc2ZlciBhbGwgcGVuZGluZyBSeCBmcmFtZXMpCisgKgkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQb3J0LCBTS19TVE9QX1JYLCBTS19IQVJEX1JTVCk7CisgKgkJLi4uCisgKgorICoJMikgQW4gZXZlbnQgd2FzIGlzc3VlZCB3aGljaCByZXF1ZXN0IHRoZSBkcml2ZXIgdG8gc3dpdGNoCisgKgl0aGUgJ3ZpcnR1YWwgYWN0aXZlJyBsaW5rIHRvIGFuIG90aGVyIGFscmVhZHkgYWN0aXZlIHBvcnQKKyAqCWFzIHNvb24gYXMgcG9zc2libGUuIFRoZSBmcmFtZXMgaW4gdGhlIHJlY2VpdmUgcXVldWUgb2YgdGhpcworICoJcG9ydCBtYXkgYmUgbG9zdC4gQnV0IHRoZSBQSFkgbXVzdCBub3QgYmUgcmVzZXQgZHVyaW5nIHRoaXMKKyAqCWV2ZW50LgorICoJCS4uLgorICoJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgUG9ydCwgU0tfU1RPUF9BTEwsIFNLX1NPRlRfUlNUKTsKKyAqCQkuLi4KKyAqCisgKiBFeHRlbmRlZCBEZXNjcmlwdGlvbjoKKyAqCUlmIFNLX1NUT1BfVFggaXMgc2V0LAorICoJCW8gZGlzYWJsZSB0aGUgTUFDJ3MgcmVjZWl2ZSBhbmQgdHJhbnNtaXR0ZXIgdG8gcHJldmVudAorICoJCSAgZnJvbSBzZW5kaW5nIGluY29tcGxldGUgZnJhbWVzCisgKgkJbyBzdG9wIHRoZSBwb3J0J3MgdHJhbnNtaXQgcXVldWVzIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUKKyAqCQkgIEJNVXMgdG8gcHJldmVudCBmcm9tIHBlcmZvcm1pbmcgaW5jb21wbGV0ZSBQQ0kgY3ljbGVzCisgKgkJICBvbiB0aGUgUENJIGJ1cworICoJCS0gVGhlIG5ldHdvcmsgUnggYW5kIFR4IGFjdGl2aXR5IGFuZCBQQ0kgVHggdHJhbnNmZXIgaXMKKyAqCQkgIGRpc2FibGVkIG5vdy4KKyAqCQlvIHJlc2V0IHRoZSBNQUMgZGVwZW5kaW5nIG9uIHRoZSBSc3RNb2RlCisgKgkJbyBTdG9wIEludGVydmFsIFRpbWVyIGFuZCBMaW1pdCBDb3VudGVyIG9mIFR4IEFyYml0ZXIsCisgKgkJICBhbHNvIGRpc2FibGUgRm9yY2UgU3luYyBiaXQgYW5kIEVuYWJsZSBBbGxvYyBiaXQuCisgKgkJbyBwZXJmb3JtIGEgbG9jYWwgcmVzZXQgb2YgdGhlIHBvcnQncyBUeCBwYXRoCisgKgkJCS0gcmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBhc3luYyBUeCBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBQQ0kgRklGTyBvZiB0aGUgc3luYyBUeCBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBSQU0gQnVmZmVyIGFzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFJBTSBCdWZmZXIgc3luYyBUeCBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBNQUMgVHggRklGTworICoJCW8gc3dpdGNoIExpbmsgYW5kIFR4IExFRCBvZmYsIHN0b3AgdGhlIExFRCBjb3VudGVycworICoKKyAqCUlmIFNLX1NUT1BfUlggaXMgc2V0LAorICoJCW8gc3RvcCB0aGUgcG9ydCdzIHJlY2VpdmUgcXVldWUKKyAqCQktIFRoZSBwYXRoIGRhdGEgdHJhbnNmZXIgYWN0aXZpdHkgaXMgZnVsbHkgc3RvcHBlZCBub3cuCisgKgkJbyBwZXJmb3JtIGEgbG9jYWwgcmVzZXQgb2YgdGhlIHBvcnQncyBSeCBwYXRoCisgKgkJCS0gcmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBSeCBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBSQU0gQnVmZmVyIHJlY2VpdmUgcXVldWUKKyAqCQkJLSByZXNldCB0aGUgTUFDIFJ4IEZJRk8KKyAqCQlvIHN3aXRjaCBSeCBMRUQgb2ZmLCBzdG9wIHRoZSBMRUQgY291bnRlcgorICoKKyAqCUlmIGFsbCBwb3J0cyBhcmUgc3RvcHBlZCwKKyAqCQlvIHJlc2V0IHRoZSBSQU0gSW50ZXJmYWNlLgorICoKKyAqIE5vdGVzOgorICoJbyBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZHVyaW5nIHRoZSBkcml2ZXIgc3RhdGVzIFJFU0VUX1BPUlQgYW5kCisgKgkgIFNXSVRDSF9QT1JULgorICovCit2b2lkIFNrR2VTdG9wUG9ydCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogcG9ydCB0byBzdG9wIChNQUNfMSArIG4pICovCitpbnQJCURpciwJLyogRGlyZWN0aW9uIHRvIFN0b3AgKFNLX1NUT1BfUlgsIFNLX1NUT1BfVFgsIFNLX1NUT1BfQUxMKSAqLworaW50CQlSc3RNb2RlKS8qIFJlc2V0IE1vZGUgKFNLX1NPRlRfUlNULCBTS19IQVJEX1JTVCkgKi8KK3sKKyNpZm5kZWYgU0tfRElBRworCVNLX0VWUEFSQSBQYXJhOworI2VuZGlmIC8qICFTS19ESUFHICovCisJU0tfR0VQT1JUICpwUHJ0OworCVNLX1UzMglEV29yZDsKKwlTS19VMzIJWHNDc3I7CisJU0tfVTMyCVhhQ3NyOworCVNLX1U2NAlUb3V0U3RhcnQ7CisJaW50CQlpOworCWludAkJVG91dENudDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKChEaXIgJiBTS19TVE9QX1RYKSAhPSAwKSB7CisJCS8qIGRpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovCisJCVNrTWFjUnhUeERpc2FibGUocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJLyogc3RvcCBib3RoIHRyYW5zbWl0IHF1ZXVlcyAqLworCQkvKgorCQkgKiBJZiB0aGUgQk1VIGlzIGluIHRoZSByZXNldCBzdGF0ZSBDU1JfU1RPUCB3aWxsIHRlcm1pbmF0ZQorCQkgKiBpbW1lZGlhdGVseS4KKwkJICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgQ1NSX1NUT1ApOworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIENTUl9TVE9QKTsKKworCQlUb3V0U3RhcnQgPSBTa09zR2V0VGltZShwQUMpOworCQlUb3V0Q250ID0gMDsKKwkJZG8geworCQkJLyoKKwkJCSAqIENsZWFyIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgdG8gbWFrZSBzdXJlCisJCQkgKiB0aGlzIGxvb3Agd2lsbCB0ZXJtaW5hdGUuCisJCQkgKi8KKwkJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgKFNLX1UxNikoKFBvcnQgPT0gTUFDXzEpID8KKwkJCQlQQV9DTFJfVE9fVFgxIDogUEFfQ0xSX1RPX1RYMikpOworCisJCQkvKgorCQkJICogSWYgdGhlIHRyYW5zZmVyIHN0dWNrcyBhdCB0aGUgTUFDIHRoZSBTVE9QIGNvbW1hbmQgd2lsbCBub3QKKwkJCSAqIHRlcm1pbmF0ZSBpZiB3ZSBkb24ndCBmbHVzaCB0aGUgWE1BQydzIHRyYW5zbWl0IEZJRk8gIQorCQkJICovCisJCQlTa01hY0ZsdXNoVHhGaWZvKHBBQywgSW9DLCBQb3J0KTsKKworCQkJWHNDc3IgPSBUZXN0U3RvcEJpdChwQUMsIElvQywgcFBydC0+UFhzUU9mZik7CisJCQlYYUNzciA9IFRlc3RTdG9wQml0KHBBQywgSW9DLCBwUHJ0LT5QWGFRT2ZmKTsKKworCQkJaWYgKFNrT3NHZXRUaW1lKHBBQykgLSBUb3V0U3RhcnQgPiAoU0tfVElDS1NfUEVSX1NFQyAvIDE4KSkgeworCQkJCS8qCisJCQkJICogVGltZW91dCBvZiAxLzE4IHNlY29uZCByZWFjaGVkLgorCQkJCSAqIFRoaXMgbmVlZHMgdG8gYmUgY2hlY2tlZCBhdCAxLzE4IHNlYyBvbmx5LgorCQkJCSAqLworCQkJCVRvdXRDbnQrKzsKKwkJCQlpZiAoVG91dENudCA+IDEpIHsKKwkJCQkJLyogTWlnaHQgYmUgYSBwcm9ibGVtIHdoZW4gdGhlIGRyaXZlciBldmVudCBoYW5kbGVyCisJCQkJCSAqIGNhbGxzIFN0b3BQb3J0IGFnYWluLiBYWFguCisJCQkJCSAqLworCisJCQkJCS8qIEZhdGFsIEVycm9yLCBMb29wIGFib3J0ZWQgKi8KKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9IV0lfRTAxOCwKKwkJCQkJCVNLRVJSX0hXSV9FMDE4TVNHKTsKKyNpZm5kZWYgU0tfRElBRworCQkJCQlQYXJhLlBhcmE2NCA9IFBvcnQ7CisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCS8qCisJCQkJICogQ2FjaGUgaW5jb2hlcmVuY3kgd29ya2Fyb3VuZDogQXNzdW1lIGEgc3RhcnQgY29tbWFuZAorCQkJCSAqIGhhcyBiZWVuIGxvc3Qgd2hpbGUgc2VuZGluZyB0aGUgZnJhbWUuCisJCQkJICovCisJCQkJVG91dFN0YXJ0ID0gU2tPc0dldFRpbWUocEFDKTsKKworCQkJCWlmICgoWHNDc3IgJiBDU1JfU1RPUCkgIT0gMCkgeworCQkJCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWHNRT2ZmLCBRX0NTUiksIENTUl9TVEFSVCk7CisJCQkJfQorCQkJCWlmICgoWGFDc3IgJiBDU1JfU1RPUCkgIT0gMCkgeworCQkJCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIENTUl9TVEFSVCk7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogQmVjYXVzZSBvZiB0aGUgQVNJQyBwcm9ibGVtIHJlcG9ydCBlbnRyeSBmcm9tIDIxLjA4LjE5OTggaXQgaXMKKwkJCSAqIHJlcXVpcmVkIHRvIHdhaXQgdW50aWwgQ1NSX1NUT1AgaXMgcmVzZXQgYW5kIENTUl9TVl9JRExFIGlzIHNldC4KKwkJCSAqLworCQl9IHdoaWxlICgoWHNDc3IgJiAoQ1NSX1NUT1AgfCBDU1JfU1ZfSURMRSkpICE9IENTUl9TVl9JRExFIHx8CisJCQkJIChYYUNzciAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgIT0gQ1NSX1NWX0lETEUpOworCisJCS8qIFJlc2V0IHRoZSBNQUMgZGVwZW5kaW5nIG9uIHRoZSBSc3RNb2RlICovCisJCWlmIChSc3RNb2RlID09IFNLX1NPRlRfUlNUKSB7CisJCQlTa01hY1NvZnRSc3QocEFDLCBJb0MsIFBvcnQpOworCQl9CisJCWVsc2UgeworCQkJU2tNYWNIYXJkUnN0KHBBQywgSW9DLCBQb3J0KTsKKwkJfQorIAkJCisJCS8qIERpc2FibGUgRm9yY2UgU3luYyBiaXQgYW5kIEVuYWJsZSBBbGxvYyBiaXQgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLAorCQkJVFhBX0RJU19GU1lOQyB8IFRYQV9ESVNfQUxMT0MgfCBUWEFfU1RPUF9SQyk7CisJCQorCQkvKiBTdG9wIEludGVydmFsIFRpbWVyIGFuZCBMaW1pdCBDb3VudGVyIG9mIFR4IEFyYml0ZXIgKi8KKwkJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9JVElfSU5JKSwgMEwpOworCQlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0xJTV9JTkkpLCAwTCk7CisKKwkJLyogUGVyZm9ybSBhIGxvY2FsIHJlc2V0IG9mIHRoZSBwb3J0J3MgVHggcGF0aCAqLworCisJCS8qIFJlc2V0IHRoZSBQQ0kgRklGTyBvZiB0aGUgYXN5bmMgVHggcXVldWUgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhhUU9mZiwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKKwkJLyogUmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBzeW5jIFR4IHF1ZXVlICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgQ1NSX1NFVF9SRVNFVCk7CisJCS8qIFJlc2V0IHRoZSBSQU0gQnVmZmVyIGFzeW5jIFR4IHF1ZXVlICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKHBQcnQtPlBYYVFPZmYsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKwkJLyogUmVzZXQgdGhlIFJBTSBCdWZmZXIgc3luYyBUeCBxdWV1ZSAqLworCQlTS19PVVQ4KElvQywgUkJfQUREUihwUHJ0LT5QWHNRT2ZmLCBSQl9DVFJMKSwgUkJfUlNUX1NFVCk7CisJCQorCQkvKiBSZXNldCBUeCBNQUMgRklGTyAqLworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCS8qIE5vdGU6IE1GRl9SU1RfU0VUIGRvZXMgTk9UIHJlc2V0IHRoZSBYTUFDICEgKi8KKwkJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKKworCQkJLyogc3dpdGNoIExpbmsgYW5kIFR4IExFRCBvZmYsIHN0b3AgdGhlIExFRCBjb3VudGVycyAqLworCQkJLyogTGluayBMRUQgaXMgc3dpdGNoZWQgb2ZmIGJ5IHRoZSBSTE1UIGFuZCB0aGUgRGlhZyBpdHNlbGYgKi8KKwkJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFRYX0xFRF9JTkkpLCBTS19MRURfRElTKTsKKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCS8qIFJlc2V0IFRYIE1BQyBGSUZPICovCisJCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9SU1RfU0VUKTsKKwkJfQorI2VuZGlmIC8qIFlVS09OICovCisJfQorCisJaWYgKChEaXIgJiBTS19TVE9QX1JYKSAhPSAwKSB7CisJCS8qCisJCSAqIFRoZSBSWCBTdG9wIENvbW1hbmQgd2lsbCBub3QgdGVybWluYXRlIGlmIG5vIGJ1ZmZlcnMKKwkJICogYXJlIHF1ZXVlZCBpbiB0aGUgUnhEIHJpbmcuIEJ1dCBpdCB3aWxsIGFsd2F5cyByZWFjaAorCQkgKiB0aGUgSWRsZSBzdGF0ZS4gVGhlcmVmb3JlIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIHRvCisJCSAqIHN0b3AgdGhlIHRyYW5zZmVyIG9mIHJlY2VpdmVkIHBhY2tldHMuCisJCSAqLworCQkvKiBzdG9wIHRoZSBwb3J0J3MgcmVjZWl2ZSBxdWV1ZSAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QUnhRT2ZmLCBRX0NTUiksIENTUl9TVE9QKTsKKwkJCisJCWkgPSAxMDA7CisJCWRvIHsKKwkJCS8qCisJCQkgKiBDbGVhciBwYWNrZXQgYXJiaXRlciB0aW1lb3V0IHRvIG1ha2Ugc3VyZQorCQkJICogdGhpcyBsb29wIHdpbGwgdGVybWluYXRlCisJCQkgKi8KKwkJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgKFNLX1UxNikoKFBvcnQgPT0gTUFDXzEpID8KKwkJCQlQQV9DTFJfVE9fUlgxIDogUEFfQ0xSX1RPX1JYMikpOworCisJCQlEV29yZCA9IFRlc3RTdG9wQml0KHBBQywgSW9DLCBwUHJ0LT5QUnhRT2ZmKTsKKworCQkJLyogdGltZW91dCBpZiBpPT0wIChidWcgZml4IGZvciAjMTA3NDgpICovCisJCQlpZiAoLS1pID09IDApIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0hXSV9FMDI0LAorCQkJCQlTS0VSUl9IV0lfRTAyNE1TRyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogYmVjYXVzZSBvZiB0aGUgQVNJQyBwcm9ibGVtIHJlcG9ydCBlbnRyeSBmcm9tIDIxLjA4Ljk4CisJCQkgKiBpdCBpcyByZXF1aXJlZCB0byB3YWl0IHVudGlsIENTUl9TVE9QIGlzIHJlc2V0IGFuZAorCQkJICogQ1NSX1NWX0lETEUgaXMgc2V0LgorCQkJICovCisJCX0gd2hpbGUgKChEV29yZCAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgIT0gQ1NSX1NWX0lETEUpOworCisJCS8qIFRoZSBwYXRoIGRhdGEgdHJhbnNmZXIgYWN0aXZpdHkgaXMgZnVsbHkgc3RvcHBlZCBub3cgKi8KKworCQkvKiBQZXJmb3JtIGEgbG9jYWwgcmVzZXQgb2YgdGhlIHBvcnQncyBSeCBwYXRoICovCisKKwkJIC8qCVJlc2V0IHRoZSBQQ0kgRklGTyBvZiB0aGUgUnggcXVldWUgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKKwkJLyogUmVzZXQgdGhlIFJBTSBCdWZmZXIgcmVjZWl2ZSBxdWV1ZSAqLworCQlTS19PVVQ4KElvQywgUkJfQUREUihwUHJ0LT5QUnhRT2ZmLCBSQl9DVFJMKSwgUkJfUlNUX1NFVCk7CisKKwkJLyogUmVzZXQgUnggTUFDIEZJRk8gKi8KKyNpZmRlZiBHRU5FU0lTCisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkKKwkJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKKworCQkJLyogc3dpdGNoIFJ4IExFRCBvZmYsIHN0b3AgdGhlIExFRCBjb3VudGVyICovCisJCQlTa0dlWG1pdExFRChwQUMsIElvQywgTVJfQUREUihQb3J0LCBSWF9MRURfSU5JKSwgU0tfTEVEX0RJUyk7CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwkJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQkvKiBSZXNldCBSeCBNQUMgRklGTyAqLworCQkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0NUUkxfVCksIChTS19VOClHTUZfUlNUX1NFVCk7CisJCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCX0KK30JLyogU2tHZVN0b3BQb3J0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0MCgpIC0gTGV2ZWwgMCBJbml0aWFsaXphdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJLSBJbml0aWFsaXplIHRoZSBCTVUgYWRkcmVzcyBvZmZzZXRzCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXQwKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwlpbnQgaTsKKwlTS19HRVBPUlQgKnBQcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtpXTsKKworCQlwUHJ0LT5QU3RhdGUgPSBTS19QUlRfUkVTRVQ7CisJCXBQcnQtPlBSeFFPZmYgPSBRT2ZmVGFiW2ldLlJ4UU9mZjsKKwkJcFBydC0+UFhzUU9mZiA9IFFPZmZUYWJbaV0uWHNRT2ZmOworCQlwUHJ0LT5QWGFRT2ZmID0gUU9mZlRhYltpXS5YYVFPZmY7CisJCXBQcnQtPlBDaGVja1BhciA9IFNLX0ZBTFNFOworCQlwUHJ0LT5QSXNhdmUgPSAwOworCQlwUHJ0LT5QUHJldlNob3J0cyA9IDA7CisJCXBQcnQtPlBMaW5rUmVzQ3QgPSAwOworCQlwUHJ0LT5QQXV0b05lZ1RPQ3QgPSAwOworCQlwUHJ0LT5QUHJldlJ4ID0gMDsKKwkJcFBydC0+UFByZXZGY3MgPSAwOworCQlwUHJ0LT5QUnhMaW0gPSBTS19ERUZfUlhfV0FfTElNOworCQlwUHJ0LT5QTGlua01vZGUgPSAoU0tfVTgpU0tfTE1PREVfQVVUT0ZVTEw7CisJCXBQcnQtPlBMaW5rU3BlZWRDYXAgPSAoU0tfVTgpU0tfTFNQRUVEX0NBUF8xMDAwTUJQUzsKKwkJcFBydC0+UExpbmtTcGVlZCA9IChTS19VOClTS19MU1BFRURfMTAwME1CUFM7CisJCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUX1VOS05PV047CisJCXBQcnQtPlBMaW5rTW9kZUNvbmYgPSAoU0tfVTgpU0tfTE1PREVfQVVUT1NFTlNFOworCQlwUHJ0LT5QRmxvd0N0cmxNb2RlID0gKFNLX1U4KVNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOworCQlwUHJ0LT5QTGlua0NhcCA9IChTS19VOCkoU0tfTE1PREVfQ0FQX0hBTEYgfCBTS19MTU9ERV9DQVBfRlVMTCB8CisJCQlTS19MTU9ERV9DQVBfQVVUT0hBTEYgfCBTS19MTU9ERV9DQVBfQVVUT0ZVTEwpOworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9VTktOT1dOOworCQlwUHJ0LT5QRmxvd0N0cmxDYXAgPSAoU0tfVTgpU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IChTS19VOClTS19GTE9XX1NUQVRfTk9ORTsKKwkJcFBydC0+UE1TQ2FwID0gMDsKKwkJcFBydC0+UE1TTW9kZSA9IChTS19VOClTS19NU19NT0RFX0FVVE87CisJCXBQcnQtPlBNU1N0YXR1cyA9IChTS19VOClTS19NU19TVEFUX1VOU0VUOworCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSAoU0tfVTgpU0tfTElQQV9VTktOT1dOOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19GQUxTRTsKKwkJcFBydC0+UEhXTGlua1VwID0gU0tfRkFMU0U7CisJCXBQcnQtPlBMaW5rQnJva2VuID0gU0tfVFJVRTsgLyogU2VlIFdBIGNvZGUgKi8KKwkJcFBydC0+UFBoeVBvd2VyU3RhdGUgPSBQSFlfUE1fT1BFUkFUSU9OQUxfTU9ERTsKKwkJcFBydC0+UE1hY0NvbFRocmVzID0gVFhfQ09MX0RFRjsKKwkJcFBydC0+UE1hY0phbUxlbiA9IFRYX0pBTV9MRU5fREVGOworCQlwUHJ0LT5QTWFjSmFtSXBnVmFsCT0gVFhfSkFNX0lQR19ERUY7CisJCXBQcnQtPlBNYWNKYW1JcGdEYXRhID0gVFhfSVBHX0pBTV9ERUY7CisJCXBQcnQtPlBNYWNJcGdEYXRhID0gSVBHX0RBVEFfREVGOworCQlwUHJ0LT5QTWFjTGltaXQ0ID0gU0tfRkFMU0U7CisJfQorCisJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfUkVEX0xJTks7CisJcEFDLT5HSW5pLkdJTGVkQmxpbmtDdHJsID0gKFNLX1UxNilPZW1Db25maWcuVmFsdWU7CisJcEFDLT5HSW5pLkdJVmFsSXJxTWFzayA9IElTX0FMTF9NU0s7CisKK30JLyogU2tHZUluaXQwKi8KKworI2lmZGVmIFNLX1BDSV9SRVNFVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVBjaVJlc2V0KCkgLSBSZXNldCBQQ0kgaW50ZXJmYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglvIFJlYWQgUENJIGNvbmZpZ3VyYXRpb24uCisgKglvIENoYW5nZSBwb3dlciBzdGF0ZSB0byAzLgorICoJbyBDaGFuZ2UgcG93ZXIgc3RhdGUgdG8gMC4KKyAqCW8gUmVzdG9yZSBQQ0kgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJU3VjY2Vzcy4KKyAqCTE6CVBvd2VyIHN0YXRlIGNvdWxkIG5vdCBiZSBjaGFuZ2VkIHRvIDMuCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBjaVJlc2V0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwlpbnQJCWk7CisJU0tfVTE2CVBtQ3RsU3RzOworCVNLX1UzMglCcDE7CisJU0tfVTMyCUJwMjsKKwlTS19VMTYJUGNpQ21kOworCVNLX1U4CUNsczsKKwlTS19VOAlMYXQ7CisJU0tfVTgJQ29uZmlnU3BhY2VbUENJX0NGR19TSVpFXTsKKworCS8qCisJICogTm90ZTogU3dpdGNoaW5nIHRvIEQzIHN0YXRlIGlzIGxpa2UgYSBzb2Z0d2FyZSByZXNldC4KKwkgKgkJIFN3aXRjaGluZyBmcm9tIEQzIHRvIEQwIGlzIGEgaGFyZHdhcmUgcmVzZXQuCisJICoJCSBXZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IFBDSV9DRkdfU0laRTsgaSsrKSB7CisJCVNrUGNpUmVhZENmZ0RXb3JkKHBBQywgaSo0LCAmQ29uZmlnU3BhY2VbaV0pOworCX0KKworCS8qIFdlIGtub3cgdGhlIFJBTSBJbnRlcmZhY2UgQXJiaXRlciBpcyBlbmFibGVkLiAqLworCVNrUGNpV3JpdGVDZmdXb3JkKHBBQywgUENJX1BNX0NUTF9TVFMsIFBDSV9QTV9TVEFURV9EMyk7CisJU2tQY2lSZWFkQ2ZnV29yZChwQUMsIFBDSV9QTV9DVExfU1RTLCAmUG1DdGxTdHMpOworCQorCWlmICgoUG1DdGxTdHMgJiBQQ0lfUE1fU1RBVEVfTVNLKSAhPSBQQ0lfUE1fU1RBVEVfRDMpIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIFJldHVybiB0byBEMCBzdGF0ZS4gKi8KKwlTa1BjaVdyaXRlQ2ZnV29yZChwQUMsIFBDSV9QTV9DVExfU1RTLCBQQ0lfUE1fU1RBVEVfRDApOworCisJLyogQ2hlY2sgZm9yIEQwIHN0YXRlLiAqLworCVNrUGNpUmVhZENmZ1dvcmQocEFDLCBQQ0lfUE1fQ1RMX1NUUywgJlBtQ3RsU3RzKTsKKwkKKwlpZiAoKFBtQ3RsU3RzICYgUENJX1BNX1NUQVRFX01TSykgIT0gUENJX1BNX1NUQVRFX0QwKSB7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBDaGVjayBQQ0kgQ29uZmlnIFJlZ2lzdGVycy4gKi8KKwlTa1BjaVJlYWRDZmdXb3JkKHBBQywgUENJX0NPTU1BTkQsICZQY2lDbWQpOworCVNrUGNpUmVhZENmZ0J5dGUocEFDLCBQQ0lfQ0FDSEVfTFNaLCAmQ2xzKTsKKwlTa1BjaVJlYWRDZmdEV29yZChwQUMsIFBDSV9CQVNFXzFTVCwgJkJwMSk7CisJU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLCBQQ0lfQkFTRV8yTkQsICZCcDIpOworCVNrUGNpUmVhZENmZ0J5dGUocEFDLCBQQ0lfTEFUX1RJTSwgJkxhdCk7CisJCisJaWYgKFBjaUNtZCAhPSAwIHx8IENscyAhPSAoU0tfVTgpMCB8fCBMYXQgIT0gKFNLX1U4KTAgfHwKKwkJKEJwMSAmIDB4ZmZmZmZmZjBMKSAhPSAwIHx8IEJwMiAhPSAxKSB7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBSZXN0b3JlIFBDSSBDb25maWcgU3BhY2UuICovCisJZm9yIChpID0gMDsgaSA8IFBDSV9DRkdfU0laRTsgaSsrKSB7CisJCVNrUGNpV3JpdGVDZmdEV29yZChwQUMsIGkqNCwgQ29uZmlnU3BhY2VbaV0pOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZVBjaVJlc2V0ICovCisKKyNlbmRpZiAvKiBTS19QQ0lfUkVTRVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0MSgpIC0gTGV2ZWwgMSBJbml0aWFsaXphdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJbyBEbyBhIHNvZnR3YXJlIHJlc2V0LgorICoJbyBDbGVhciBhbGwgcmVzZXQgYml0cy4KKyAqCW8gVmVyaWZ5IHRoYXQgdGhlIGRldGVjdGVkIGhhcmR3YXJlIGlzIHByZXNlbnQuCisgKgkgIFJldHVybiBhbiBlcnJvciBpZiBub3QuCisgKglvIEdldCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbgorICoJCSsgUmVhZCB0aGUgbnVtYmVyIG9mIE1BQ3MvUG9ydHMuCisgKgkJKyBSZWFkIHRoZSBSQU0gc2l6ZS4KKyAqCQkrIFJlYWQgdGhlIFBDSSBSZXZpc2lvbiBJZC4KKyAqCQkrIEZpbmQgb3V0IHRoZSBhZGFwdGVycyBob3N0IGNsb2NrIHNwZWVkCisgKgkJKyBSZWFkIGFuZCBjaGVjayB0aGUgUEhZIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJMDoJc3VjY2VzcworICoJNToJVW5leHBlY3RlZCBQSFkgdHlwZSBkZXRlY3RlZAorICoJNjoJSFcgc2VsZiB0ZXN0IGZhaWxlZAorICovCitzdGF0aWMgaW50IFNrR2VJbml0MSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MpCQkvKiBJTyBjb250ZXh0ICovCit7CisJU0tfVTgJQnl0ZTsKKwlTS19VMTYJV29yZDsKKwlTS19VMTYJQ3RybFN0YXQ7CisJU0tfVTMyCURXb3JkOworCWludAlSZXRWYWw7CisJaW50CWk7CisKKwlSZXRWYWwgPSAwOworCisJLyogc2F2ZSBDTEtfUlVOIGJpdHMgKFlVS09OLUxpdGUpICovCisJU0tfSU4xNihJb0MsIEIwX0NUU1QsICZDdHJsU3RhdCk7CisKKyNpZmRlZiBTS19QQ0lfUkVTRVQKKwkodm9pZClTa0dlUGNpUmVzZXQocEFDLCBJb0MpOworI2VuZGlmIC8qIFNLX1BDSV9SRVNFVCAqLworCisJLyogZG8gdGhlIFNXLXJlc2V0ICovCisJU0tfT1VUOChJb0MsIEIwX0NUU1QsIENTX1JTVF9TRVQpOworCisJLyogcmVsZWFzZSB0aGUgU1ctcmVzZXQgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfUlNUX0NMUik7CisKKwkvKiByZXNldCBhbGwgZXJyb3IgYml0cyBpbiB0aGUgUENJIFNUQVRVUyByZWdpc3RlciAqLworCS8qCisJICogTm90ZTogUENJIENmZyBjeWNsZXMgY2Fubm90IGJlIHVzZWQsIGJlY2F1c2UgdGhleSBhcmUgbm90CisJICoJCSBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMgYWZ0ZXIgJ2Jvb3QgdGltZScuCisJICovCisJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAmV29yZCk7CisJCisJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJU0tfT1VUMTYoSW9DLCBQQ0lfQyhQQ0lfU1RBVFVTKSwgKFNLX1UxNikoV29yZCB8IFBDSV9FUlJCSVRTKSk7CisJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOworCisJLyogcmVsZWFzZSBNYXN0ZXIgUmVzZXQgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfTVJTVF9DTFIpOworCisjaWZkZWYgQ0xLX1JVTgorCUN0cmxTdGF0IHw9IENTX0NMS19SVU5fRU5BOworI2VuZGlmIC8qIENMS19SVU4gKi8KKworCS8qIHJlc3RvcmUgQ0xLX1JVTiBiaXRzICovCisJU0tfT1VUMTYoSW9DLCBCMF9DVFNULCAoU0tfVTE2KShDdHJsU3RhdCAmCisJCShDU19DTEtfUlVOX0hPVCB8IENTX0NMS19SVU5fUlNUIHwgQ1NfQ0xLX1JVTl9FTkEpKSk7CisKKwkvKiByZWFkIENoaXAgSWRlbnRpZmljYXRpb24gTnVtYmVyICovCisJU0tfSU44KElvQywgQjJfQ0hJUF9JRCwgJkJ5dGUpOworCXBBQy0+R0luaS5HSUNoaXBJZCA9IEJ5dGU7CisJCisJLyogcmVhZCBudW1iZXIgb2YgTUFDcyAqLworCVNLX0lOOChJb0MsIEIyX01BQ19DRkcsICZCeXRlKTsKKwlwQUMtPkdJbmkuR0lNYWNzRm91bmQgPSAoQnl0ZSAmIENGR19TTkdfTUFDKSA/IDEgOiAyOworCQorCS8qIGdldCBDaGlwIFJldmlzaW9uIE51bWJlciAqLworCXBBQy0+R0luaS5HSUNoaXBSZXYgPSAoU0tfVTgpKChCeXRlICYgQ0ZHX0NISVBfUl9NU0spID4+IDQpOworCisJLyogZ2V0IGRpZmYuIFBDSSBwYXJhbWV0ZXJzICovCisJU0tfSU4xNihJb0MsIEIwX0NUU1QsICZDdHJsU3RhdCk7CisJCisJLyogcmVhZCB0aGUgYWRhcHRlcnMgUkFNIHNpemUgKi8KKwlTS19JTjgoSW9DLCBCMl9FXzAsICZCeXRlKTsKKwkKKwlwQUMtPkdJbmkuR0lHZW5lc2lzID0gU0tfRkFMU0U7CisJcEFDLT5HSW5pLkdJWXVrb24gPSBTS19GQUxTRTsKKwlwQUMtPkdJbmkuR0lZdWtvbkxpdGUgPSBTS19GQUxTRTsKKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfR0VORVNJUykgeworCisJCXBBQy0+R0luaS5HSUdlbmVzaXMgPSBTS19UUlVFOworCisJCWlmIChCeXRlID09IChTS19VOCkzKSB7CQkJCQkJCisJCQkvKiBzcGVjaWFsIGNhc2U6IDQgeCA2NGsgeCAzNiwgb2Zmc2V0ID0gMHg4MDAwMCAqLworCQkJcEFDLT5HSW5pLkdJUmFtU2l6ZSA9IDEwMjQ7CisJCQlwQUMtPkdJbmkuR0lSYW1PZmZzID0gKFNLX1UzMik1MTIgKiAxMDI0OworCQl9CisJCWVsc2UgeworCQkJcEFDLT5HSW5pLkdJUmFtU2l6ZSA9IChpbnQpQnl0ZSAqIDUxMjsKKwkJCXBBQy0+R0luaS5HSVJhbU9mZnMgPSAwOworCQl9CisJCS8qIGFsbCBHRSBhZGFwdGVycyB3b3JrIHdpdGggNTMuMTI1IE1IeiBob3N0IGNsb2NrICovCisJCXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgPSBTS19GQUNUXzUzOworCQkKKwkJLyogc2V0IERlc2NyLiBQb2xsIFRpbWVyIEluaXQgVmFsdWUgdG8gMjUwIG1zICovCisJCXBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCA9CisJCQlTS19EUE9MTF9ERUYgKiAoU0tfVTMyKXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDA7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgIT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJCQorCQlwQUMtPkdJbmkuR0lZdWtvbiA9IFNLX1RSVUU7CisJCQorCQlwQUMtPkdJbmkuR0lSYW1TaXplID0gKEJ5dGUgPT0gKFNLX1U4KTApID8gMTI4IDogKGludClCeXRlICogNDsKKwkJCisJCXBBQy0+R0luaS5HSVJhbU9mZnMgPSAwOworCQkKKwkJLyogV0EgZm9yIGNoaXAgUmV2LiBBICovCisJCXBBQy0+R0luaS5HSVdvbE9mZnMgPSAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04gJiYKKwkJCXBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgPyBXT0xfUkVHX09GRlMgOiAwOworCQkKKwkJLyogZ2V0IFBNIENhcGFiaWxpdGllcyBvZiBQQ0kgY29uZmlnIHNwYWNlICovCisJCVNLX0lOMTYoSW9DLCBQQ0lfQyhQQ0lfUE1fQ0FQX1JFRyksICZXb3JkKTsKKworCQkvKiBjaGVjayBpZiBWQVVYIGlzIGF2YWlsYWJsZSAqLworCQlpZiAoKChDdHJsU3RhdCAmIENTX1ZBVVhfQVZBSUwpICE9IDApICYmCisJCQkvKiBjaGVjayBhbHNvIGlmIFBNRSBmcm9tIEQzY29sZCBpcyBzZXQgKi8KKwkJCSgoV29yZCAmIFBDSV9QTUVfRDNDX1NVUCkgIT0gMCkpIHsKKwkJCS8qIHNldCBlbnRyeSBpbiBHRSBpbml0IHN0cnVjdCAqLworCQkJcEFDLT5HSW5pLkdJVmF1eEF2YWlsID0gU0tfVFJVRTsKKwkJfQorCQkKKwkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OX0xJVEUpIHsKKwkJCS8qIHRoaXMgaXMgUmV2LiBBMSAqLworCQkJcEFDLT5HSW5pLkdJWXVrb25MaXRlID0gU0tfVFJVRTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIHNhdmUgRmxhc2gtQWRkcmVzcyBSZWdpc3RlciAqLworCQkJU0tfSU4zMihJb0MsIEIyX0ZBUiwgJkRXb3JkKTsKKworCQkJLyogdGVzdCBGbGFzaC1BZGRyZXNzIFJlZ2lzdGVyICovCisJCQlTS19PVVQ4KElvQywgQjJfRkFSICsgMywgMHhmZik7CisJCQlTS19JTjgoSW9DLCBCMl9GQVIgKyAzLCAmQnl0ZSk7CisKKwkJCWlmIChCeXRlICE9IDApIHsKKwkJCQkvKiB0aGlzIGlzIFJldi4gQTAgKi8KKwkJCQlwQUMtPkdJbmkuR0lZdWtvbkxpdGUgPSBTS19UUlVFOworCisJCQkJLyogcmVzdG9yZSBGbGFzaC1BZGRyZXNzIFJlZ2lzdGVyICovCisJCQkJU0tfT1VUMzIoSW9DLCBCMl9GQVIsIERXb3JkKTsKKwkJCX0KKwkJfQorCisJCS8qIHN3aXRjaCBwb3dlciB0byBWQ0MgKFdBIGZvciBWQVVYIHByb2JsZW0pICovCisJCVNLX09VVDgoSW9DLCBCMF9QT1dFUl9DVFJMLCAoU0tfVTgpKFBDX1ZBVVhfRU5BIHwgUENfVkNDX0VOQSB8CisJCQlQQ19WQVVYX09GRiB8IFBDX1ZDQ19PTikpOworCisJCS8qIHJlYWQgdGhlIEludGVycnVwdCBzb3VyY2UgKi8KKwkJU0tfSU4zMihJb0MsIEIwX0lTUkMsICZEV29yZCk7CisJCQorCQlpZiAoKERXb3JkICYgSVNfSFdfRVJSKSAhPSAwKSB7CisJCQkvKiByZWFkIHRoZSBIVyBFcnJvciBJbnRlcnJ1cHQgc291cmNlICovCisJCQlTS19JTjMyKElvQywgQjBfSFdFX0lTUkMsICZEV29yZCk7CisJCQkKKwkJCWlmICgoRFdvcmQgJiBJU19JUlFfU0VOU09SKSAhPSAwKSB7CisJCQkJLyogZGlzYWJsZSBIVyBFcnJvciBJUlEgKi8KKwkJCQlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrICY9IH5JU19IV19FUlI7CisJCQl9CisJCX0KKwkJCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJLyogc2V0IEdNQUMgTGluayBDb250cm9sIHJlc2V0ICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoaSwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9TRVQpOworCisJCQkvKiBjbGVhciBHTUFDIExpbmsgQ29udHJvbCByZXNldCAqLworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfQ0xSKTsKKwkJfQorCQkvKiBhbGwgWVUgY2hpcHMgd29yayB3aXRoIDc4LjEyNSBNSHogaG9zdCBjbG9jayAqLworCQlwQUMtPkdJbmkuR0lIc3RDbGtGYWN0ID0gU0tfRkFDVF83ODsKKwkJCisJCXBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCA9IFNLX0RQT0xMX01BWDsJLyogMjE1IG1zICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwkvKiBjaGVjayBpZiA2NC1iaXQgUENJIFNsb3QgaXMgcHJlc2VudCAqLworCXBBQy0+R0luaS5HSVBjaVNsb3Q2NCA9IChTS19CT09MKSgoQ3RybFN0YXQgJiBDU19CVVNfU0xPVF9TWikgIT0gMCk7CisJCisJLyogY2hlY2sgaWYgNjYgTUh6IFBDSSBDbG9jayBpcyBhY3RpdmUgKi8KKwlwQUMtPkdJbmkuR0lQY2lDbG9jazY2ID0gKFNLX0JPT0wpKChDdHJsU3RhdCAmIENTX0JVU19DTE9DSykgIT0gMCk7CisKKwkvKiByZWFkIFBDSSBIVyBSZXZpc2lvbiBJZC4gKi8KKwlTS19JTjgoSW9DLCBQQ0lfQyhQQ0lfUkVWX0lEKSwgJkJ5dGUpOworCXBBQy0+R0luaS5HSVBjaUh3UmV2ID0gQnl0ZTsKKworCS8qIHJlYWQgdGhlIFBNRCB0eXBlICovCisJU0tfSU44KElvQywgQjJfUE1EX1RZUCwgJkJ5dGUpOworCXBBQy0+R0luaS5HSUNvcHBlclR5cGUgPSAoU0tfVTgpKEJ5dGUgPT0gJ1QnKTsKKworCS8qIHJlYWQgdGhlIFBIWSB0eXBlICovCisJU0tfSU44KElvQywgQjJfRV8xLCAmQnl0ZSk7CisKKwlCeXRlICY9IDB4MGY7CS8qIHRoZSBQSFkgdHlwZSBpcyBzdG9yZWQgaW4gdGhlIGxvd2VyIG5pYmJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkKKyNpZmRlZiBHRU5FU0lTCisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQlzd2l0Y2ggKEJ5dGUpIHsKKwkJCWNhc2UgU0tfUEhZX1hNQUM6CisJCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9YTUFDOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19QSFlfQkNPTToKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkciA9IFBIWV9BRERSX0JDT007CisJCQkJcEFDLT5HSW5pLkdQW2ldLlBNU0NhcCA9IChTS19VOCkoU0tfTVNfQ0FQX0FVVE8gfAorCQkJCQlTS19NU19DQVBfTUFTVEVSIHwgU0tfTVNfQ0FQX1NMQVZFKTsKKwkJCQlicmVhazsKKyNpZmRlZiBPVEhFUl9QSFkKKwkJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9MT05FOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19QSFlfTkFUOgorCQkJCXBBQy0+R0luaS5HUFtpXS5QaHlBZGRyID0gUEhZX0FERFJfTkFUOworCQkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQkJZGVmYXVsdDoKKwkJCQkvKiBFUlJPUjogdW5leHBlY3RlZCBQSFkgdHlwZSBkZXRlY3RlZCAqLworCQkJCVJldFZhbCA9IDU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwkJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQkKKwkJCWlmIChCeXRlIDwgKFNLX1U4KVNLX1BIWV9NQVJWX0NPUFBFUikgeworCQkJCS8qIGlmIHRoaXMgZmllbGQgaXMgbm90IGluaXRpYWxpemVkICovCisJCQkJQnl0ZSA9IChTS19VOClTS19QSFlfTUFSVl9DT1BQRVI7CisJCQkJCisJCQkJcEFDLT5HSW5pLkdJQ29wcGVyVHlwZSA9IFNLX1RSVUU7CisJCQl9CisJCQkKKwkJCXBBQy0+R0luaS5HUFtpXS5QaHlBZGRyID0gUEhZX0FERFJfTUFSVjsKKwkJCQorCQkJaWYgKHBBQy0+R0luaS5HSUNvcHBlclR5cGUpIHsKKworCQkJCXBBQy0+R0luaS5HUFtpXS5QTGlua1NwZWVkQ2FwID0gKFNLX1U4KShTS19MU1BFRURfQ0FQX0FVVE8gfAorCQkJCQlTS19MU1BFRURfQ0FQXzEwTUJQUyB8IFNLX0xTUEVFRF9DQVBfMTAwTUJQUyB8CisJCQkJCVNLX0xTUEVFRF9DQVBfMTAwME1CUFMpOworCQkJCQorCQkJCXBBQy0+R0luaS5HUFtpXS5QTGlua1NwZWVkID0gKFNLX1U4KVNLX0xTUEVFRF9BVVRPOworCQkJCQorCQkJCXBBQy0+R0luaS5HUFtpXS5QTVNDYXAgPSAoU0tfVTgpKFNLX01TX0NBUF9BVVRPIHwKKwkJCQkJU0tfTVNfQ0FQX01BU1RFUiB8IFNLX01TX0NBUF9TTEFWRSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlCeXRlID0gKFNLX1U4KVNLX1BIWV9NQVJWX0ZJQkVSOworCQkJfQorCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkJCisJCXBBQy0+R0luaS5HUFtpXS5QaHlUeXBlID0gKGludClCeXRlOworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JTklULAorCQkJKCJQSFkgdHlwZTogJWQgIFBIWSBhZGRyOiAlMDR4XG4iLCBCeXRlLAorCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIpKTsKKwl9CisJCisJLyogZ2V0IE1BQyBUeXBlICYgc2V0IGZ1bmN0aW9uIHBvaW50ZXJzIGRlcGVuZGVudCBvbiAqLworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJcEFDLT5HSW5pLkdJTWFjVHlwZSA9IFNLX01BQ19YTUFDOworCisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjVXBkYXRlU3RhdHMJPSBTa1htVXBkYXRlU3RhdHM7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjU3RhdGlzdGljCT0gU2tYbU1hY1N0YXRpc3RpYzsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNSZXNldENvdW50ZXIJPSBTa1htUmVzZXRDb3VudGVyOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY092ZXJmbG93CQk9IFNrWG1PdmVyZmxvd1N0YXR1czsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlwQUMtPkdJbmkuR0lNYWNUeXBlID0gU0tfTUFDX0dNQUM7CisKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNVcGRhdGVTdGF0cwk9IFNrR21VcGRhdGVTdGF0czsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNTdGF0aXN0aWMJPSBTa0dtTWFjU3RhdGlzdGljOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1Jlc2V0Q291bnRlcgk9IFNrR21SZXNldENvdW50ZXI7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjT3ZlcmZsb3cJCT0gU2tHbU92ZXJmbG93U3RhdHVzOworCisjaWZkZWYgU1BFQ0lBTF9IQU5ETElORworCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHsKKwkJCS8qIGNoZWNrIEhXIHNlbGYgdGVzdCByZXN1bHQgKi8KKwkJCVNLX0lOOChJb0MsIEIyX0VfMywgJkJ5dGUpOworCQkJaWYgKEJ5dGUgJiBCMl9FM19SRVNfTUFTSykgeworCQkJCVJldFZhbCA9IDY7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQorCXJldHVybihSZXRWYWwpOworfQkvKiBTa0dlSW5pdDEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQyKCkgLSBMZXZlbCAyIEluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKgktIHN0YXJ0IHRoZSBCbGluayBTb3VyY2UgQ291bnRlcgorICoJLSBzdGFydCB0aGUgRGVzY3JpcHRvciBQb2xsIFRpbWVyCisgKgktIGNvbmZpZ3VyZSB0aGUgTUFDLUFyYml0ZXIKKyAqCS0gY29uZmlndXJlIHRoZSBQYWNrZXQtQXJiaXRlcgorICoJLSBlbmFibGUgdGhlIFR4IEFyYml0ZXJzCisgKgktIGVuYWJsZSB0aGUgUkFNIEludGVyZmFjZSBBcmJpdGVyCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXQyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKyNpZmRlZiBHRU5FU0lTCisJU0tfVTMyCURXb3JkOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwlpbnQJCWk7CisKKwkvKiBzdGFydCB0aGUgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCisJaWYgKHBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCAhPSAwKSB7CisJCWlmIChwQUMtPkdJbmkuR0lQb2xsVGltZXJWYWwgPiBTS19EUE9MTF9NQVgpIHsKKwkJCXBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCA9IFNLX0RQT0xMX01BWDsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxNywgU0tFUlJfSFdJX0UwMTdNU0cpOworCQl9CisJCVNLX09VVDMyKElvQywgQjI4X0RQVF9JTkksIHBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCk7CisJCVNLX09VVDgoSW9DLCBCMjhfRFBUX0NUUkwsIERQVF9TVEFSVCk7CisJfQorCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIHN0YXJ0IHRoZSBCbGluayBTb3VyY2UgQ291bnRlciAqLworCQlEV29yZCA9IFNLX0JMS19EVVIgKiAoU0tfVTMyKXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDA7CisKKwkJU0tfT1VUMzIoSW9DLCBCMl9CU0NfSU5JLCBEV29yZCk7CisJCVNLX09VVDgoSW9DLCBCMl9CU0NfQ1RSTCwgQlNDX1NUQVJUKTsKKworCQkvKgorCQkgKiBDb25maWd1cmUgdGhlIE1BQyBBcmJpdGVyIGFuZCB0aGUgUGFja2V0IEFyYml0ZXIuCisJCSAqIFRoZXkgd2lsbCBiZSBzdGFydGVkIG9uY2UgYW5kIG5ldmVyIGJlIHN0b3BwZWQuCisJCSAqLworCQlTa0dlSW5pdE1hY0FyYihwQUMsIElvQyk7CisKKwkJU2tHZUluaXRQa3RBcmIocEFDLCBJb0MpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogc3RhcnQgVGltZSBTdGFtcCBUaW1lciAqLworCQlTS19PVVQ4KElvQywgR01BQ19USV9TVF9DVFJMLCAoU0tfVTgpR01UX1NUX1NUQVJUKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCS8qIGVuYWJsZSB0aGUgVHggQXJiaXRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoaSwgVFhBX0NUUkwpLCBUWEFfRU5BX0FSQik7CisJfQorCisJLyogZW5hYmxlIHRoZSBSQU0gSW50ZXJmYWNlIEFyYml0ZXIgKi8KKwlTa0dlSW5pdFJhbUlmYWNlKHBBQywgSW9DKTsKKworfQkvKiBTa0dlSW5pdDIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0KCkgLSBJbml0aWFsaXplIHRoZSBHRSBBZGFwdGVyIHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUxldmVsCTA6CUluaXRpYWxpemUgdGhlIE1vZHVsZSBzdHJ1Y3R1cmVzLgorICoJTGV2ZWwJMToJR2VuZXJpYyBIYXJkd2FyZSBJbml0aWFsaXphdGlvbi4gVGhlIElPUC9NZW1CYXNlIHBvaW50ZXIgaGFzCisgKgkJCQl0byBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBsZXZlbC4KKyAqCisgKgkJCW8gRG8gYSBzb2Z0d2FyZSByZXNldC4KKyAqCQkJbyBDbGVhciBhbGwgcmVzZXQgYml0cy4KKyAqCQkJbyBWZXJpZnkgdGhhdCB0aGUgZGV0ZWN0ZWQgaGFyZHdhcmUgaXMgcHJlc2VudC4KKyAqCQkJICBSZXR1cm4gYW4gZXJyb3IgaWYgbm90LgorICoJCQlvIEdldCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbgorICoJCQkJKyBTZXQgR0lNYWNzRm91bmQgd2l0aCB0aGUgbnVtYmVyIG9mIE1BQ3MuCisgKgkJCQkrIFN0b3JlIHRoZSBSQU0gc2l6ZSBpbiBHSVJhbVNpemUuCisgKgkJCQkrIFNhdmUgdGhlIFBDSSBSZXZpc2lvbiBJRCBpbiBHSVBjaUh3UmV2LgorICoJCQlvIHJldHVybiBhbiBlcnJvcgorICoJCQkJaWYgTnVtYmVyIG9mIE1BQ3MgPiBTS19NQVhfTUFDUworICoKKyAqCQkJQWZ0ZXIgcmV0dXJuaW5nIGZyb20gTGV2ZWwgMCB0aGUgYWRhcHRlcgorICoJCQltYXkgYmUgYWNjZXNzZWQgd2l0aCBJTyBvcGVyYXRpb25zLgorICoKKyAqCUxldmVsCTI6CXN0YXJ0IHRoZSBCbGluayBTb3VyY2UgQ291bnRlcgorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgkxOglOdW1iZXIgb2YgTUFDcyBleGNlZWRzIFNLX01BWF9NQUNTCShhZnRlciBsZXZlbCAxKQorICoJMjoJQWRhcHRlciBub3QgcHJlc2VudCBvciBub3QgYWNjZXNzaWJsZQorICoJMzoJSWxsZWdhbCBpbml0aWFsaXphdGlvbiBsZXZlbAorICoJNDoJSW5pdGlhbGl6YXRpb24gTGV2ZWwgMSBDYWxsIG1pc3NpbmcKKyAqCTU6CVVuZXhwZWN0ZWQgUEhZIHR5cGUgZGV0ZWN0ZWQKKyAqCTY6CUhXIHNlbGYgdGVzdCBmYWlsZWQKKyAqLworaW50CVNrR2VJbml0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJTGV2ZWwpCQkvKiBpbml0aWFsaXphdGlvbiBsZXZlbCAqLworeworCWludAkJUmV0VmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJU0tfVTMyCURXb3JkOworCisJUmV0VmFsID0gMDsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lOSVQsCisJCSgiU2tHZUluaXQoTGV2ZWwgJWQpXG4iLCBMZXZlbCkpOworCisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQkvKiBJbml0aWFsaXphdGlvbiBMZXZlbCAwICovCisJCVNrR2VJbml0MChwQUMsIElvQyk7CisJCXBBQy0+R0luaS5HSUxldmVsID0gU0tfSU5JVF9EQVRBOworCQlicmVhazsKKwkKKwljYXNlIFNLX0lOSVRfSU86CisJCS8qIEluaXRpYWxpemF0aW9uIExldmVsIDEgKi8KKwkJUmV0VmFsID0gU2tHZUluaXQxKHBBQywgSW9DKTsKKwkJaWYgKFJldFZhbCAhPSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNoZWNrIGlmIHRoZSBhZGFwdGVyIHNlZW1zIHRvIGJlIGFjY2Vzc2libGUgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMl9JUlFNX0lOSSwgU0tfVEVTVF9WQUwpOworCQlTS19JTjMyKElvQywgQjJfSVJRTV9JTkksICZEV29yZCk7CisJCVNLX09VVDMyKElvQywgQjJfSVJRTV9JTkksIDBMKTsKKwkJCisJCWlmIChEV29yZCAhPSBTS19URVNUX1ZBTCkgeworCQkJUmV0VmFsID0gMjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgaWYgdGhlIG51bWJlciBvZiBHSU1hY3NGb3VuZCBtYXRjaGVzIFNLX01BWF9NQUNTICovCisJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiBTS19NQVhfTUFDUykgeworCQkJUmV0VmFsID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTGV2ZWwgMSBzdWNjZXNzZnVsbHkgcGFzc2VkICovCisJCXBBQy0+R0luaS5HSUxldmVsID0gU0tfSU5JVF9JTzsKKwkJYnJlYWs7CisJCisJY2FzZSBTS19JTklUX1JVTjoKKwkJLyogSW5pdGlhbGl6YXRpb24gTGV2ZWwgMiAqLworCQlpZiAocEFDLT5HSW5pLkdJTGV2ZWwgIT0gU0tfSU5JVF9JTykgeworI2lmbmRlZiBTS19ESUFHCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDAyLCBTS0VSUl9IV0lfRTAwMk1TRyk7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwkJCVJldFZhbCA9IDQ7CisJCQlicmVhazsKKwkJfQorCQlTa0dlSW5pdDIocEFDLCBJb0MpOworCisJCS8qIExldmVsIDIgc3VjY2Vzc2Z1bGx5IHBhc3NlZCAqLworCQlwQUMtPkdJbmkuR0lMZXZlbCA9IFNLX0lOSVRfUlVOOworCQlicmVhazsKKwkKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDAzLCBTS0VSUl9IV0lfRTAwM01TRyk7CisJCVJldFZhbCA9IDM7CisJCWJyZWFrOworCX0KKworCXJldHVybihSZXRWYWwpOworfQkvKiBTa0dlSW5pdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlRGVJbml0KCkgLSBEZWluaXRpYWxpemUgdGhlIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUFsbCBwb3J0cyBvZiB0aGUgYWRhcHRlciB3aWxsIGJlIHN0b3BwZWQgaWYgbm90IGFscmVhZHkgZG9uZS4KKyAqCURvIGEgc29mdHdhcmUgcmVzZXQgYW5kIHN3aXRjaCBvZmYgYWxsIExFRHMuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlRGVJbml0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwlpbnQJaTsKKwlTS19VMTYJV29yZDsKKworI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisJU0tfVTgJQnl0ZTsKKwlTS19VMTYJUG1DdGxTdHM7CisjZW5kaWYgLyogU0tfUEhZX0xQX01PREUgKi8KKworI2lmICghZGVmaW5lZChTS19TTElNKSAmJiAhZGVmaW5lZChWQ1BVKSkKKwkvKiBlbnN1cmUgSTJDIGlzIHJlYWR5ICovCisJU2tJMmNXYWl0SXJxKHBBQywgSW9DKTsKKyNlbmRpZgkKKworCS8qIHN0b3AgYWxsIGN1cnJlbnQgdHJhbnNmZXIgYWN0aXZpdHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKHBBQy0+R0luaS5HUFtpXS5QU3RhdGUgIT0gU0tfUFJUX1NUT1AgJiYKKwkJCXBBQy0+R0luaS5HUFtpXS5QU3RhdGUgIT0gU0tfUFJUX1JFU0VUKSB7CisKKwkJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgaSwgU0tfU1RPUF9BTEwsIFNLX0hBUkRfUlNUKTsKKwkJfQorCX0KKworI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisgICAgLyoKKwkgKiBmb3IgcG93ZXIgc2F2aW5nIHB1cnBvc2VzIHdpdGhpbiBtb2JpbGUgZW52aXJvbm1lbnRzCisJICogd2Ugc2V0IHRoZSBQSFkgdG8gY29tYSBtb2RlIGFuZCBzd2l0Y2ggdG8gRDMgcG93ZXIgc3RhdGUuCisJICovCisJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJgorCQlwQUMtPkdJbmkuR0lDaGlwUmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpIHsKKworCQkvKiBmb3IgYWxsIHBvcnRzIHN3aXRjaCBQSFkgdG8gY29tYSBtb2RlICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJCisJCQlTa0dtRW50ZXJMb3dQb3dlck1vZGUocEFDLCBJb0MsIGksIFBIWV9QTV9ERUVQX1NMRUVQKTsKKwkJfQorCisJCWlmIChwQUMtPkdJbmkuR0lWYXV4QXZhaWwpIHsKKwkJCS8qIHN3aXRjaCBwb3dlciB0byBWQVVYICovCisJCQlCeXRlID0gUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwgUENfVkFVWF9PTiB8IFBDX1ZDQ19PRkY7CisKKwkJCVNLX09VVDgoSW9DLCBCMF9QT1dFUl9DVFJMLCBCeXRlKTsKKwkJfQorCQkKKwkJLyogc3dpdGNoIHRvIEQzIHN0YXRlICovCisJCVNLX0lOMTYoSW9DLCBQQ0lfQyhQQ0lfUE1fQ1RMX1NUUyksICZQbUN0bFN0cyk7CisKKwkJUG1DdGxTdHMgfD0gUENJX1BNX1NUQVRFX0QzOworCisJCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCisJCVNLX09VVDE2KElvQywgUENJX0MoUENJX1BNX0NUTF9TVFMpLCBQbUN0bFN0cyk7CisJfQorI2VuZGlmIC8qIFNLX1BIWV9MUF9NT0RFICovCisKKwkvKiBSZXNldCBhbGwgYml0cyBpbiB0aGUgUENJIFNUQVRVUyByZWdpc3RlciAqLworCS8qCisJICogTm90ZTogUENJIENmZyBjeWNsZXMgY2Fubm90IGJlIHVzZWQsIGJlY2F1c2UgdGhleSBhcmUgbm90CisJICoJIGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcyBhZnRlciAnYm9vdCB0aW1lJy4KKwkgKi8KKwlTS19JTjE2KElvQywgUENJX0MoUENJX1NUQVRVUyksICZXb3JkKTsKKwkKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKwlTS19PVVQxNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAoU0tfVTE2KShXb3JkIHwgUENJX0VSUkJJVFMpKTsKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwkvKiBkbyB0aGUgcmVzZXQsIGFsbCBMRURzIGFyZSBzd2l0Y2hlZCBvZmYgbm93ICovCisJU0tfT1VUOChJb0MsIEIwX0NUU1QsIENTX1JTVF9TRVQpOworCQorCXBBQy0+R0luaS5HSUxldmVsID0gU0tfSU5JVF9EQVRBOworfQkvKiBTa0dlRGVJbml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0UG9ydCgpCUluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBwb3J0LgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUFJ4UVNpemUsIFBYU1FTaXplLCBhbmQgUFhBUVNpemUgaGFzIHRvIGJlCisgKgljb25maWd1cmVkIGZvciB0aGUgc3BlY2lmaWVkIHBvcnQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqICBUaGUgZGVzY3JpcHRvciByaW5ncyBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgdG9vLgorICoKKyAqCW8gKFJlKWNvbmZpZ3VyZSBxdWV1ZXMgb2YgdGhlIHNwZWNpZmllZCBwb3J0LgorICoJbyBjb25maWd1cmUgdGhlIE1BQyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKglvIHB1dCBBU0lDIGFuZCBNQUMocykgaW4gb3BlcmF0aW9uYWwgbW9kZS4KKyAqCW8gaW5pdGlhbGl6ZSBSeC9UeCBhbmQgU3luYyBMRUQKKyAqCW8gaW5pdGlhbGl6ZSBSQU0gQnVmZmVycyBhbmQgTUFDIEZJRk9zCisgKgorICoJVGhlIHBvcnQgaXMgcmVhZHkgdG8gY29ubmVjdCB3aGVuIHJldHVybmluZy4KKyAqCisgKiBOb3RlOgorICoJVGhlIE1BQydzIFJ4IGFuZCBUeCBzdGF0ZSBtYWNoaW5lIGlzIHN0aWxsIGRpc2FibGVkIHdoZW4gcmV0dXJuaW5nLgorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgkxOglRdWV1ZSBzaXplIGluaXRpYWxpemF0aW9uIGVycm9yLiBUaGUgY29uZmlndXJlZCB2YWx1ZXMKKyAqCQlmb3IgUFJ4UVNpemUsIFBYU1FTaXplLCBvciBQWEFRU2l6ZSBhcmUgaW52YWxpZCBmb3Igb25lCisgKgkJb3IgbW9yZSBxdWV1ZXMuIFRoZSBzcGVjaWZpZWQgcG9ydCB3YXMgTk9UIGluaXRpYWxpemVkLgorICoJCUFuIGVycm9yIGxvZyBlbnRyeSB3YXMgZ2VuZXJhdGVkLgorICoJMjoJVGhlIHBvcnQgaGFzIHRvIGJlIHN0b3BwZWQgYmVmb3JlIGl0IGNhbiBiZSBpbml0aWFsaXplZCBhZ2Fpbi4KKyAqLworaW50IFNrR2VJbml0UG9ydCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IHRvIGNvbmZpZ3VyZSAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKFNrR2VDaGVja1FTaXplKHBBQywgUG9ydCkgIT0gMCkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA0LCBTS0VSUl9IV0lfRTAwNE1TRyk7CisJCXJldHVybigxKTsKKwl9CisJCisJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfSU5JVCB8fCBwUHJ0LT5QU3RhdGUgPT0gU0tfUFJUX1JVTikgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA1LCBTS0VSUl9IV0lfRTAwNU1TRyk7CisJCXJldHVybigyKTsKKwl9CisKKwkvKiBjb25maWd1cmF0aW9uIG9rLCBpbml0aWFsaXplIHRoZSBQb3J0IG5vdyAqLworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIGluaXRpYWxpemUgUngsIFR4IGFuZCBMaW5rIExFRCAqLworCQkvKgorCQkgKiBJZiAxMDAwQlQgUGh5IG5lZWRzIExFRCBpbml0aWFsaXphdGlvbiB0aGFuIHN3YXAKKwkJICogTEVEIGFuZCBYTUFDIGluaXRpYWxpemF0aW9uIG9yZGVyCisJCSAqLworCQlTa0dlWG1pdExFRChwQUMsIElvQywgTVJfQUREUihQb3J0LCBUWF9MRURfSU5JKSwgU0tfTEVEX0VOQSk7CisJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFJYX0xFRF9JTkkpLCBTS19MRURfRU5BKTsKKwkJLyogVGhlIExpbmsgTEVEIGlzIGluaXRpYWxpemVkIGJ5IFJMTVQgb3IgRGlhZ25vc3RpY3MgaXRzZWxmICovCisJCQorCQlTa1htSW5pdE1hYyhwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCisJCVNrR21Jbml0TWFjKHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkKKwkvKiBkbyBOT1QgaW5pdGlhbGl6ZSB0aGUgTGluayBTeW5jIENvdW50ZXIgKi8KKworCVNrR2VJbml0TWFjRmlmbyhwQUMsIElvQywgUG9ydCk7CisJCisJU2tHZUluaXRSYW1CdWZzKHBBQywgSW9DLCBQb3J0KTsKKwkKKwlpZiAocFBydC0+UFhTUVNpemUgIT0gMCkgeworCQkvKiBlbmFibGUgRm9yY2UgU3luYyBiaXQgaWYgc3luY2hyb25vdXMgcXVldWUgYXZhaWxhYmxlICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYQV9DVFJMKSwgVFhBX0VOQV9GU1lOQyk7CisJfQorCQorCVNrR2VJbml0Qm11KHBBQywgSW9DLCBQb3J0KTsKKworCS8qIG1hcmsgcG9ydCBhcyBpbml0aWFsaXplZCAqLworCXBQcnQtPlBTdGF0ZSA9IFNLX1BSVF9JTklUOworCisJcmV0dXJuKDApOworfQkvKiBTa0dlSW5pdFBvcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZW1pYi5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlbWliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5MWJjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZW1pYi5jCkBAIC0wLDAgKzEsMTA4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZW1pYi5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTEgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTUgMTM6Mzg6MTIgJAorICogUHVycG9zZToJUHJpdmF0ZSBOZXR3b3JrIE1hbmFnZW1lbnQgSW50ZXJmYWNlIE1hbmFnZW1lbnQgRGF0YWJhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFBSSVZBVEUgT0lEIGhhbmRsZXIgZnVuY3Rpb24gcHJvdG90eXBlcworICovCitQTk1JX1NUQVRJQyBpbnQgQWRkcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLAorCVNLX1UzMiBJZCwgY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgQ3N1bVN0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IEdlbmVyYWwoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IE1hYzgwMjNTdGF0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBNYWNQcml2YXRlQ29uZihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgTWFjUHJpdmF0ZVN0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IE1vbml0b3IoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwKKwlTS19VMzIgSWQsIGNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IE9pZFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgUGVyZm9ybShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50KiBwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgUmxtdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgUmxtdFN0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IFNlbnNvclN0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IFZwZChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgVmN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKKworI2lmZGVmIFNLX1BPV0VSX01HTVQKK1BOTUlfU1RBVElDIGludCBQb3dlck1hbmFnZW1lbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorUE5NSV9TVEFUSUMgaW50IERpYWdBY3Rpb25zKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KKworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElEX1RBQkxFX1NJWkUgKHNpemVvZihJZFRhYmxlKS9zaXplb2YoSWRUYWJsZVswXSkpCisKKworLyogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgdG8gY29ycmVsYXRlIE9JRCB3aXRoIGhhbmRsZXIgZnVuY3Rpb24gYW5kIGluZGV4IHRvCisgKiBoYXJkd2FyZSByZWdpc3RlciBzdG9yZWQgaW4gU3RhdEFkZHJlc3MgaWYgYXBwbGljYWJsZS4KKyAqLworUE5NSV9TVEFUSUMgY29uc3QgU0tfUE5NSV9UQUJfRU5UUlkgSWRUYWJsZVtdID0geworCXtPSURfR0VOX1hNSVRfT0ssCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWH0sCisJe09JRF9HRU5fUkNWX09LLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlh9LAorCXtPSURfR0VOX1hNSVRfRVJST1IsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfR0VOX1JDVl9FUlJPUiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9HRU5fUkNWX05PX0JVRkZFUiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVQsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9VTklDQVNUfSwKKwl7T0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9NVUxUSUNBU1R9LAorCXtPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0JST0FEQ0FTVH0sCisJe09JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDViwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFJYX1VOSUNBU1R9LAorCXtPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfTVVMVElDQVNUfSwKKwl7T0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDViwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFJYX0JST0FEQ0FTVH0sCisJe09JRF9HRU5fUkNWX0NSQ19FUlJPUiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFJYX0ZDU30sCisJe09JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RILAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgMH0sCisJe09JRF84MDJfM19DVVJSRU5UX0FERFJFU1MsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCAwfSwKKwl7T0lEXzgwMl8zX1JDVl9FUlJPUl9BTElHTk1FTlQsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWF9GUkFNSU5HfSwKKwl7T0lEXzgwMl8zX1hNSVRfT05FX0NPTExJU0lPTiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX1NJTkdMRV9DT0x9LAorCXtPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlMsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9NVUxUSV9DT0x9LAorCXtPSURfODAyXzNfWE1JVF9ERUZFUlJFRCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0RFRkZFUkFMfSwKKwl7T0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlMsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9FWENFU1NfQ09MfSwKKwl7T0lEXzgwMl8zX1JDVl9PVkVSUlVOLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfT1ZFUkZMT1d9LAorCXtPSURfODAyXzNfWE1JVF9VTkRFUlJVTiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX1VOREVSUlVOfSwKKwl7T0lEXzgwMl8zX1hNSVRfVElNRVNfQ1JTX0xPU1QsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9DQVJSSUVSfSwKKwl7T0lEXzgwMl8zX1hNSVRfTEFURV9DT0xMSVNJT05TLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfTEFURV9DT0x9LAorI2lmZGVmIFNLX1BPV0VSX01HTVQKKwl7T0lEX1BOUF9DQVBBQklMSVRJRVMsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfU0VUX1BPV0VSLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1dPLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorCXtPSURfUE5QX1FVRVJZX1BPV0VSLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorCXtPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk4sCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfV08sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfUkVNT1ZFX1dBS0VfVVBfUEFUVEVSTiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9XTywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKwl7T0lEX1BOUF9FTkFCTEVfV0FLRV9VUCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9SVywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKyNlbmRpZiAvKiBTS19QT1dFUl9NR01UICovCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJe09JRF9TS0dFX0RJQUdfTU9ERSwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9SVywgRGlhZ0FjdGlvbnMsIDB9LAorI2VuZGlmIC8qIFNLX0RJQUdfU1VQUE9SVCAqLworCXtPSURfU0tHRV9NREJfVkVSU0lPTiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKE1nbXREQlZlcnNpb24pLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfU1VQUE9SVEVEX0xJU1QsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9BTExfREFUQSwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9SVywgT2lkU3RydWN0LCAwfSwKKwl7T0lEX1NLR0VfVlBEX0ZSRUVfQllURVMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihWcGRGcmVlQnl0ZXMpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfRU5UUklFU19MSVNULAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVnBkRW50cmllc0xpc3QpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfRU5UUklFU19OVU1CRVIsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihWcGRFbnRyaWVzTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgVnBkLCAwfSwKKwl7T0lEX1NLR0VfVlBEX0tFWSwKKwkJU0tfUE5NSV9WUERfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfVlBEKSwKKwkJU0tfUE5NSV9PRkYoVnBkKSArIFNLX1BOTUlfVlBEX09GRihWcGRLZXkpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfVkFMVUUsCisJCVNLX1BOTUlfVlBEX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1ZQRCksCisJCVNLX1BOTUlfT0ZGKFZwZCkgKyBTS19QTk1JX1ZQRF9PRkYoVnBkVmFsdWUpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfQUNDRVNTLAorCQlTS19QTk1JX1ZQRF9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9WUEQpLAorCQlTS19QTk1JX09GRihWcGQpICsgU0tfUE5NSV9WUERfT0ZGKFZwZEFjY2VzcyksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9BQ1RJT04sCisJCVNLX1BOTUlfVlBEX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1ZQRCksCisJCVNLX1BOTUlfT0ZGKFZwZCkgKyBTS19QTk1JX1ZQRF9PRkYoVnBkQWN0aW9uKSwKKwkJU0tfUE5NSV9SVywgVnBkLCAwfSwKKwl7T0lEX1NLR0VfUE9SVF9OVU1CRVIsCQkKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFBvcnROdW1iZXIpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfREVWSUNFX1RZUEUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihEZXZpY2VUeXBlKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0RSSVZFUl9ERVNDUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKERyaXZlckRlc2NyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0RSSVZFUl9WRVJTSU9OLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyVmVyc2lvbiksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9EUklWRVJfUkVMREFURSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKERyaXZlclJlbGVhc2VEYXRlKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0RSSVZFUl9GSUxFTkFNRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKERyaXZlckZpbGVOYW1lKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0hXX0RFU0NSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoSHdEZXNjciksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9IV19WRVJTSU9OLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoSHdWZXJzaW9uKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0NISVBTRVQsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihDaGlwc2V0KSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0NISVBJRCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKENoaXBJZCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9SQU1TSVpFLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmFtU2l6ZSksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9WQVVYQVZBSUwsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihWYXV4QXZhaWwpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQUNUSU9OLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQWN0aW9uKSwKKwkJU0tfUE5NSV9SVywgUGVyZm9ybSwgMH0sCisJe09JRF9TS0dFX1JFU1VMVCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFRlc3RSZXN1bHQpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQlVTX1RZUEUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihCdXNUeXBlKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0JVU19TUEVFRCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEJ1c1NwZWVkKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0JVU19XSURUSCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEJ1c1dpZHRoKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX1NXX1FVRVVFX0xFTiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4U3dRdWV1ZUxlbiksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9UWF9TV19RVUVVRV9NQVgsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeFN3UXVldWVNYXgpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfUkVUUlksCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeFJldHJ5Q3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JYX0lOVFJfQ1RTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUnhJbnRyQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX0lOVFJfQ1RTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVHhJbnRyQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JYX05PX0JVRl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeE5vQnVmQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX05PX0JVRl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeE5vQnVmQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX1VTRURfREVTQ1JfTk8sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeFVzZWREZXNjck5vKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JYX0RFTElWRVJFRF9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeERlbGl2ZXJlZEN0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9SWF9PQ1RFVFNfREVMSVZfQ1RTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUnhPY3RldHNEZWxpdmVyZWRDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUnhId0Vycm9yc0N0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9UWF9IV19FUlJPUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeEh3RXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0lOX0VSUk9SU19DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihJbkVycm9yc0N0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9PVVRfRVJST1JfQ1RTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoT3V0RXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0VSUl9SRUNPVkVSWV9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihFcnJSZWNvdmVyeUN0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TWVNVUFRJTUUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihTeXNVcFRpbWUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX05VTUJFUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFNlbnNvck51bWJlciksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfSU5ERVgsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29ySW5kZXgpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX0RFU0NSLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvckRlc2NyKSwKKwkJU0tfUE5NSV9STywgU2Vuc29yU3RhdCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9UWVBFLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvclR5cGUpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1ZBTFVFLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvclZhbHVlKSwKKwkJU0tfUE5NSV9STywgU2Vuc29yU3RhdCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfTE9XLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvcldhcm5pbmdUaHJlc2hvbGRMb3cpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19VUFAsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ1RocmVzaG9sZEhpZ2gpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19MT1csCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRXJyb3JUaHJlc2hvbGRMb3cpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19VUFAsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRXJyb3JUaHJlc2hvbGRIaWdoKSwKKwkJU0tfUE5NSV9STywgU2Vuc29yU3RhdCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9TVEFUVVMsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yU3RhdHVzKSwKKwkJU0tfUE5NSV9STywgU2Vuc29yU3RhdCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9XQVJfQ1RTLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvcldhcm5pbmdDdHMpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX0VSUl9DVFMsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRXJyb3JDdHMpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9USU1FLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvcldhcm5pbmdUaW1lc3RhbXApLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX0VSUl9USU1FLAorCQlTS19QTk1JX1NFTlNPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TRU5TT1IpLAorCQlTS19QTk1JX09GRihTZW5zb3IpICsgU0tfUE5NSV9TRU5fT0ZGKFNlbnNvckVycm9yVGltZXN0YW1wKSwKKwkJU0tfUE5NSV9STywgU2Vuc29yU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX05VTUJFUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKENoZWNrc3VtTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1JYX09LX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVJ4T2tDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1JYX1VOQUJMRV9DVFMsCisJCVNLQ1NfTlVNX1BST1RPQ09MUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ0hFQ0tTVU0pLAorCQlTS19QTk1JX09GRihDaGVja3N1bSkgKyBTS19QTk1JX0NIS19PRkYoQ2hlY2tzdW1SeFVuYWJsZUN0cyksCisJCVNLX1BOTUlfUk8sIENzdW1TdGF0LCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fUlhfRVJSX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVJ4RXJyQ3RzKSwKKwkJU0tfUE5NSV9STywgQ3N1bVN0YXQsIDB9LAorCXtPSURfU0tHRV9DSEtTTV9UWF9PS19DVFMsCisJCVNLQ1NfTlVNX1BST1RPQ09MUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ0hFQ0tTVU0pLAorCQlTS19QTk1JX09GRihDaGVja3N1bSkgKyBTS19QTk1JX0NIS19PRkYoQ2hlY2tzdW1UeE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgQ3N1bVN0YXQsIDB9LAorCXtPSURfU0tHRV9DSEtTTV9UWF9VTkFCTEVfQ1RTLAorCQlTS0NTX05VTV9QUk9UT0NPTFMsCisJCXNpemVvZihTS19QTk1JX0NIRUNLU1VNKSwKKwkJU0tfUE5NSV9PRkYoQ2hlY2tzdW0pICsgU0tfUE5NSV9DSEtfT0ZGKENoZWNrc3VtVHhVbmFibGVDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX1NUQVRfVFgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWH0sCisJe09JRF9TS0dFX1NUQVRfVFhfT0NURVRTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4T2N0ZXRzT2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfT0NURVR9LAorCXtPSURfU0tHRV9TVEFUX1RYX0JST0FEQ0FTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeEJyb2FkY2FzdE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0JST0FEQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTVVMVElDQVNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4TXVsdGljYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTVVMVElDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9VTklDQVNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4VW5pY2FzdE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1VOSUNBU1R9LAorCXtPSURfU0tHRV9TVEFUX1RYX0xPTkdGUkFNRVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhMb25nRnJhbWVzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0xPTkdGUkFNRVN9LAorCXtPSURfU0tHRV9TVEFUX1RYX0JVUlNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4QnVyc3RDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfQlVSU1R9LAorCXtPSURfU0tHRV9TVEFUX1RYX1BGTE9XQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFBhdXNlTWFjQ3RybEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9QTUFDQ30sCisJe09JRF9TS0dFX1NUQVRfVFhfRkxPV0MsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhNYWNDdHJsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX01BQ0N9LAorCXtPSURfU0tHRV9TVEFUX1RYX1NJTkdMRV9DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfU0lOR0xFX0NPTH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTVVMVElfQ09MLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4TXVsdGlwbGVDb2xsaXNpb25DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTVVMVElfQ09MfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9FWENFU1NfQ09MLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4RXhjZXNzaXZlQ29sbGlzaW9uQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0VYQ0VTU19DT0x9LAorCXtPSURfU0tHRV9TVEFUX1RYX0xBVEVfQ09MLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4TGF0ZUNvbGxpc2lvbkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9MQVRFX0NPTH0sCisJe09JRF9TS0dFX1NUQVRfVFhfREVGRkVSQUwsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhEZWZlcnJhbEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9ERUZGRVJBTH0sCisJe09JRF9TS0dFX1NUQVRfVFhfRVhDRVNTX0RFRiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeEV4Y2Vzc2l2ZURlZmVycmFsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0VYQ0VTU19ERUZ9LAorCXtPSURfU0tHRV9TVEFUX1RYX1VOREVSUlVOLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4Rmlmb1VuZGVycnVuQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1VOREVSUlVOfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9DQVJSSUVSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4Q2FycmllckN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9DQVJSSUVSfSwKKy8qCXtPSURfU0tHRV9TVEFUX1RYX1VUSUwsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhVdGlsaXphdGlvbiksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCAoU0tfVTE2KSgtMSl9LCAqLworCXtPSURfU0tHRV9TVEFUX1RYXzY0LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4NjRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfNjR9LAorCXtPSURfU0tHRV9TVEFUX1RYXzEyNywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeDEyN0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF8xMjd9LAorCXtPSURfU0tHRV9TVEFUX1RYXzI1NSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeDI1NUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF8yNTV9LAorCXtPSURfU0tHRV9TVEFUX1RYXzUxMSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeDUxMUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF81MTF9LAorCXtPSURfU0tHRV9TVEFUX1RYXzEwMjMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHgxMDIzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzEwMjN9LAorCXtPSURfU0tHRV9TVEFUX1RYX01BWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeE1heEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9NQVh9LAorCXtPSURfU0tHRV9TVEFUX1RYX1NZTkMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhTeW5jQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1NZTkN9LAorCXtPSURfU0tHRV9TVEFUX1RYX1NZTkNfT0NURVRTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4U3luY09jdGV0c0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9TWU5DX09DVEVUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9PQ1RFVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhPY3RldHNPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9PQ1RFVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfQlJPQURDQVNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4QnJvYWRjYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQlJPQURDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9NVUxUSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhNdWx0aWNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NVUxUSUNBU1R9LAorCXtPSURfU0tHRV9TVEFUX1JYX1VOSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhVbmljYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfVU5JQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfTE9OR0ZSQU1FUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeExvbmdGcmFtZXNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfTE9OR0ZSQU1FU30sCisJe09JRF9TS0dFX1NUQVRfUlhfUEZMT1dDLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4UGF1c2VNYWNDdHJsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1BNQUNDfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GTE9XQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1hY0N0cmxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfTUFDQ30sCisJe09JRF9TS0dFX1NUQVRfUlhfUEZMT1dDX0VSUiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFBhdXNlTWFjQ3RybEVycm9yQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1BNQUNDX0VSUn0sCisJe09JRF9TS0dFX1NUQVRfUlhfRkxPV0NfVU5LV04sCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhNYWNDdHJsVW5rbm93bkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NQUNDX1VOS1dOfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9CVVJTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeEJ1cnN0Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0JVUlNUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9NSVNTRUQsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhNaXNzZWRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfTUlTU0VEfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GUkFNSU5HLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4RnJhbWluZ0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9GUkFNSU5HfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9PVkVSRkxPVywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeEZpZm9PdmVyZmxvd0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9PVkVSRkxPV30sCisJe09JRF9TS0dFX1NUQVRfUlhfSkFCQkVSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4SmFiYmVyQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0pBQkJFUn0sCisJe09JRF9TS0dFX1NUQVRfUlhfQ0FSUklFUiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeENhcnJpZXJDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQ0FSUklFUn0sCisJe09JRF9TS0dFX1NUQVRfUlhfSVJfTEVOR1RILAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4SVJMZW5ndGhDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfSVJMRU5HVEh9LAorCXtPSURfU0tHRV9TVEFUX1JYX1NZTUJPTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFN5bWJvbEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9TWU1CT0x9LAorCXtPSURfU0tHRV9TVEFUX1JYX1NIT1JUUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFNob3J0c0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9TSE9SVFN9LAorCXtPSURfU0tHRV9TVEFUX1JYX1JVTlQsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhSdW50Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1JVTlR9LAorCXtPSURfU0tHRV9TVEFUX1JYX0NFWFQsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhDZXh0Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0NFWFR9LAorCXtPSURfU0tHRV9TVEFUX1JYX1RPT19MT05HLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4VG9vTG9uZ0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9UT09fTE9OR30sCisJe09JRF9TS0dFX1NUQVRfUlhfRkNTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4RmNzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0ZDU30sCisvKgl7T0lEX1NLR0VfU1RBVF9SWF9VVElMLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4VXRpbGl6YXRpb24pLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgKFNLX1UxNikoLTEpfSwgKi8KKwl7T0lEX1NLR0VfU1RBVF9SWF82NCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDY0Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYXzY0fSwKKwl7T0lEX1NLR0VfU1RBVF9SWF8xMjcsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UngxMjdDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfMTI3fSwKKwl7T0lEX1NLR0VfU1RBVF9SWF8yNTUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UngyNTVDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfMjU1fSwKKwl7T0lEX1NLR0VfU1RBVF9SWF81MTEsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0Ung1MTFDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfNTExfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF8xMDIzLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4MTAyM0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF8xMDIzfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9NQVgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhNYXhDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfTUFYfSwKKwl7T0lEX1NLR0VfUEhZU19DVVJfQUREUiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZNYWNDdXJyZW50QWRkciksCisJCVNLX1BOTUlfUlcsIEFkZHIsIDB9LAorCXtPSURfU0tHRV9QSFlTX0ZBQ19BRERSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZk1hY0ZhY3RvcnlBZGRyKSwKKwkJU0tfUE5NSV9STywgQWRkciwgMH0sCisJe09JRF9TS0dFX1BNRCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZQTUQpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0NPTk5FQ1RPUiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZDb25uZWN0b3IpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1BIWV9UWVBFLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeVR5cGUpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwkJe09JRF9TS0dFX1BIWV9MUF9NT0RFLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisjZW5kaWYJCisJe09JRF9TS0dFX0xJTktfQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkxpbmtDYXBhYmlsaXR5KSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9MSU5LX01PREUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua01vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0xJTktfTU9ERV9TVEFUVVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua01vZGVTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0xJTktfU1RBVFVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkxpbmtTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0ZMT1dDVFJMX0NBUCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZGbG93Q3RybENhcGFiaWxpdHkpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0ZMT1dDVFJMX01PREUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mRmxvd0N0cmxNb2RlKSwKKwkJU0tfUE5NSV9SVywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mRmxvd0N0cmxTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1BIWV9PUEVSQVRJT05fQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU9wZXJhdGlvbkNhcGFiaWxpdHkpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZQaHlPcGVyYXRpb25Nb2RlKSwKKwkJU0tfUE5NSV9SVywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9QSFlfT1BFUkFUSU9OX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZQaHlPcGVyYXRpb25TdGF0dXMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1NQRUVEX0NBUCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZTcGVlZENhcGFiaWxpdHkpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1NQRUVEX01PREUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mU3BlZWRNb2RlKSwKKwkJU0tfUE5NSV9SVywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9TUEVFRF9TVEFUVVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mU3BlZWRTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1RSQVAsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUcmFwKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RSQVBfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVHJhcE51bWJlciksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9STE1UX01PREUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10TW9kZSksCisJCVNLX1BOTUlfUlcsIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1BPUlRfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdFBvcnROdW1iZXIpLAorCQlTS19QTk1JX1JPLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRQb3J0QWN0aXZlKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfUE9SVF9QUkVGRVJSRUQsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10UG9ydFByZWZlcnJlZCksCisJCVNLX1BOTUlfUlcsIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX0NIQU5HRV9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10Q2hhbmdlQ3RzKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX1RJTUUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10Q2hhbmdlVGltZSksCisJCVNLX1BOTUlfUk8sIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX0NIQU5HRV9FU1RJTSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VFc3RpbWF0ZSksCisJCVNLX1BOTUlfUk8sIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VUaHJlc2hvbGQpLAorCQlTS19QTk1JX1JXLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9QT1JUX0lOREVYLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdEluZGV4KSwKKwkJU0tfUE5NSV9STywgUmxtdFN0YXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVCksCisJCVNLX1BOTUlfT0ZGKFJsbXQpICsgU0tfUE5NSV9STE1fT0ZGKFJsbXRTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfVFhfSEVMTE9fQ1RTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFR4SGVsbG9DdHMpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfUlhfSEVMTE9fQ1RTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFJ4SGVsbG9DdHMpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfVFhfU1BfUkVRX0NUUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVCksCisJCVNLX1BOTUlfT0ZGKFJsbXQpICsgU0tfUE5NSV9STE1fT0ZGKFJsbXRUeFNwSGVsbG9SZXFDdHMpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfUlhfU1BfQ1RTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFJ4U3BIZWxsb0N0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX05VTUJFUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRNb25pdG9yTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9OSVRPUl9JTkRFWCwKKwkJU0tfUE5NSV9NT05JVE9SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVRfTU9OSVRPUiksCisJCVNLX1BOTUlfT0ZGKFJsbXRNb25pdG9yKSArIFNLX1BOTUlfTU9OX09GRihSbG10TW9uaXRvckluZGV4KSwKKwkJU0tfUE5NSV9STywgTW9uaXRvciwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRERSLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9yQWRkciksCisJCVNLX1BOTUlfUk8sIE1vbml0b3IsIDB9LAorCXtPSURfU0tHRV9STE1UX01PTklUT1JfRVJSUywKKwkJU0tfUE5NSV9NT05JVE9SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVRfTU9OSVRPUiksCisJCVNLX1BOTUlfT0ZGKFJsbXRNb25pdG9yKSArIFNLX1BOTUlfTU9OX09GRihSbG10TW9uaXRvckVycm9yQ3RzKSwKKwkJU0tfUE5NSV9STywgTW9uaXRvciwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9OSVRPUl9USU1FU1RBTVAsCisJCVNLX1BOTUlfTU9OSVRPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UX01PTklUT1IpLAorCQlTS19QTk1JX09GRihSbG10TW9uaXRvcikgKyBTS19QTk1JX01PTl9PRkYoUmxtdE1vbml0b3JUaW1lc3RhbXApLAorCQlTS19QTk1JX1JPLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX0FETUlOLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9yQWRtaW4pLAorCQlTS19QTk1JX1JXLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfTVRVLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoTXR1U2l6ZSksCisJCVNLX1BOTUlfUlcsIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfVkNUX0dFVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgVmN0LCAwfSwKKwl7T0lEX1NLR0VfVkNUX1NFVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9XTywgVmN0LCAwfSwKKwl7T0lEX1NLR0VfVkNUX1NUQVRVUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgVmN0LCAwfSwKKwl7T0lEX1NLR0VfQk9BUkRMRVZFTCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vwbm1pLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vwbm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlMWE1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vwbm1pLmMKQEAgLTAsMCArMSw4MzU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlcG5taS5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTExICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE1IDEzOjM1OjM1ICQKKyAqIFB1cnBvc2U6CVByaXZhdGUgTmV0d29yayBNYW5hZ2VtZW50IEludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX2xpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2dlcG5taS5jLHYgMS4xMTEgMjAwMy8wOS8xNSAxMzozNTozNSB0c2NoaWxsaSBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmIC8qICFfbGludCAqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2t0eXBlcy5oIgorI2luY2x1ZGUgImgveG1hY19paS5oIgorI2luY2x1ZGUgImgvc2tkZWJ1Zy5oIgorI2luY2x1ZGUgImgvc2txdWV1ZS5oIgorI2luY2x1ZGUgImgvc2tnZXBubWkuaCIKKyNpbmNsdWRlICJoL3NrZ2VzaXJxLmgiCisjaW5jbHVkZSAiaC9za2NzdW0uaCIKKyNpbmNsdWRlICJoL3NrdnBkLmgiCisjaW5jbHVkZSAiaC9za2dlaHcuaCIKKyNpbmNsdWRlICJoL3NrZ2Vpbml0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorI2luY2x1ZGUgImgvc2tnZXBubTIuaCIKKyNpZmRlZiBTS19QT1dFUl9NR01UCisjaW5jbHVkZSAiaC9za2dlcG1ndC5oIgorI2VuZGlmCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgUE5NSV9TVEFUSUMJc3RhdGljCisjZWxzZQkvKiBERUJVRyAqLworI2RlZmluZSBQTk1JX1NUQVRJQworI2VuZGlmIC8qIERFQlVHICovCisKKy8qCisgKiBQdWJsaWMgRnVuY3Rpb24gcHJvdG90eXBlcworICovCitpbnQgU2tQbm1pSW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgbGV2ZWwpOworaW50IFNrUG5taUdldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pUHJlU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlTZXRWYXIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIElkLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taUdldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlQcmVTZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pU2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taUV2ZW50KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBFdmVudCwgU0tfRVZQQVJBIFBhcmFtKTsKK2ludCBTa1BubWlHZW5Jb2N0bChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkICogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKiBwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworCisKKy8qCisgKiBQcml2YXRlIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCitQTk1JX1NUQVRJQyBTS19VOCBDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cyhTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQKKwlQaHlzUG9ydEluZGV4KTsKK1BOTUlfU1RBVElDIFNLX1U4IENhbGN1bGF0ZUxpbmtTdGF0dXMoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50CisJUGh5c1BvcnRJbmRleCk7CitQTk1JX1NUQVRJQyB2b2lkIENvcHlNYWMoY2hhciAqcERzdCwgU0tfTUFDX0FERFIgKnBNYWMpOworUE5NSV9TVEFUSUMgdm9pZCBDb3B5VHJhcFF1ZXVlKFNLX0FDICpwQUMsIGNoYXIgKnBEc3RCdWYpOworUE5NSV9TVEFUSUMgU0tfVTY0IEdldFBoeXNTdGF0VmFsKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsCisJdW5zaWduZWQgaW50IFBoeXNQb3J0SW5kZXgsIHVuc2lnbmVkIGludCBTdGF0SW5kZXgpOworUE5NSV9TVEFUSUMgU0tfVTY0IEdldFN0YXRWYWwoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IExvZ1BvcnRJbmRleCwKKwl1bnNpZ25lZCBpbnQgU3RhdEluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgY2hhciogR2V0VHJhcEVudHJ5KFNLX0FDICpwQUMsIFNLX1UzMiBUcmFwSWQsIHVuc2lnbmVkIGludCBTaXplKTsKK1BOTUlfU1RBVElDIHZvaWQgR2V0VHJhcFF1ZXVlTGVuKFNLX0FDICpwQUMsIHVuc2lnbmVkIGludCAqcExlbiwKKwl1bnNpZ25lZCBpbnQgKnBFbnRyaWVzKTsKK1BOTUlfU1RBVElDIGludCBHZXRWcGRLZXlBcnIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgY2hhciAqcEtleUFyciwKKwl1bnNpZ25lZCBpbnQgS2V5QXJyTGVuLCB1bnNpZ25lZCBpbnQgKnBLZXlObyk7CitQTk1JX1NUQVRJQyBpbnQgTG9va3VwSWQoU0tfVTMyIElkKTsKK1BOTUlfU1RBVElDIGludCBNYWNVcGRhdGUoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IEZpcnN0TWFjLAorCXVuc2lnbmVkIGludCBMYXN0TWFjKTsKK1BOTUlfU1RBVElDIGludCBQbm1pU3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBBY3Rpb24sIGNoYXIgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IFBubWlWYXIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IEFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVJsbXROZXdNYWNUcmFwKFNLX0FDICpwQUMsIHVuc2lnbmVkIGludCBBY3RpdmVNYWMpOworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVJsbXRQb3J0VHJhcChTS19BQyAqcEFDLCBTS19VMzIgVHJhcElkLAorCXVuc2lnbmVkIGludCBQb3J0SW5kZXgpOworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVNlbnNvclRyYXAoU0tfQUMgKnBBQywgU0tfVTMyIFRyYXBJZCwKKwl1bnNpZ25lZCBpbnQgU2Vuc29ySW5kZXgpOworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVNpbXBsZVRyYXAoU0tfQUMgKnBBQywgU0tfVTMyIFRyYXBJZCk7CitQTk1JX1NUQVRJQyB2b2lkIFJlc2V0Q291bnRlcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IFJsbXRVcGRhdGUoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBTaXJxVXBkYXRlKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MpOworUE5NSV9TVEFUSUMgdm9pZCBWaXJ0dWFsQ29uZihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIGNoYXIgKnBCdWYpOworUE5NSV9TVEFUSUMgaW50IFZjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgQWN0aW9uLCBTS19VMzIgSWQsIGNoYXIgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIHVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgdm9pZCBDaGVja1ZjdFN0YXR1cyhTS19BQyAqLCBTS19JT0MsIGNoYXIgKiwgU0tfVTMyLCBTS19VMzIpOworCisvKgorICogVGFibGUgdG8gY29ycmVsYXRlIE9JRCB3aXRoIGhhbmRsZXIgZnVuY3Rpb24gYW5kIGluZGV4IHRvCisgKiBoYXJkd2FyZSByZWdpc3RlciBzdG9yZWQgaW4gU3RhdEFkZHJlc3MgaWYgYXBwbGljYWJsZS4KKyAqLworI2luY2x1ZGUgInNrZ2VtaWIuYyIKKworLyogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogT3ZlcmZsb3cgc3RhdHVzIHJlZ2lzdGVyIGJpdCB0YWJsZSBhbmQgY29ycmVzcG9uZGluZyBjb3VudGVyCisgKiBkZXBlbmRlbnQgb24gTUFDIHR5cGUgLSB0aGUgbnVtYmVyIHJlbGF0ZXMgdG8gdGhlIHNpemUgb2Ygb3ZlcmZsb3cKKyAqIG1hc2sgcmV0dXJuZWQgYnkgdGhlIHBGbk1hY092ZXJmbG93IGZ1bmN0aW9uCisgKi8KK1BOTUlfU1RBVElDIGNvbnN0IFNLX1UxNiBTdGF0T3ZyZmx3Qml0W11bU0tfUE5NSV9NQUNfVFlQRVNdID0geworLyogQml0MCAgKi8JeyBTS19QTk1JX0hUWCwgCQkJCVNLX1BOTUlfSFRYX1VOSUNBU1R9LAorLyogQml0MSAgKi8JeyBTS19QTk1JX0hUWF9PQ1RFVEhJR0gsIAlTS19QTk1JX0hUWF9CUk9BRENBU1R9LAorLyogQml0MiAgKi8JeyBTS19QTk1JX0hUWF9PQ1RFVExPVywgCVNLX1BOTUlfSFRYX1BNQUNDfSwKKy8qIEJpdDMgICovCXsgU0tfUE5NSV9IVFhfQlJPQURDQVNULCAJU0tfUE5NSV9IVFhfTVVMVElDQVNUfSwKKy8qIEJpdDQgICovCXsgU0tfUE5NSV9IVFhfTVVMVElDQVNULCAJU0tfUE5NSV9IVFhfT0NURVRMT1d9LAorLyogQml0NSAgKi8JeyBTS19QTk1JX0hUWF9VTklDQVNULCAJCVNLX1BOTUlfSFRYX09DVEVUSElHSH0sCisvKiBCaXQ2ICAqLwl7IFNLX1BOTUlfSFRYX0xPTkdGUkFNRVMsIAlTS19QTk1JX0hUWF82NH0sCisvKiBCaXQ3ICAqLwl7IFNLX1BOTUlfSFRYX0JVUlNULCAJCVNLX1BOTUlfSFRYXzEyN30sCisvKiBCaXQ4ICAqLwl7IFNLX1BOTUlfSFRYX1BNQUNDLCAJCVNLX1BOTUlfSFRYXzI1NX0sCisvKiBCaXQ5ICAqLwl7IFNLX1BOTUlfSFRYX01BQ0MsIAkJU0tfUE5NSV9IVFhfNTExfSwKKy8qIEJpdDEwICovCXsgU0tfUE5NSV9IVFhfU0lOR0xFX0NPTCwgCVNLX1BOTUlfSFRYXzEwMjN9LAorLyogQml0MTEgKi8JeyBTS19QTk1JX0hUWF9NVUxUSV9DT0wsIAlTS19QTk1JX0hUWF9NQVh9LAorLyogQml0MTIgKi8JeyBTS19QTk1JX0hUWF9FWENFU1NfQ09MLCAJU0tfUE5NSV9IVFhfTE9OR0ZSQU1FU30sCisvKiBCaXQxMyAqLwl7IFNLX1BOTUlfSFRYX0xBVEVfQ09MLCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MTQgKi8JeyBTS19QTk1JX0hUWF9ERUZGRVJBTCwgCVNLX1BOTUlfSFRYX0NPTH0sCisvKiBCaXQxNSAqLwl7IFNLX1BOTUlfSFRYX0VYQ0VTU19ERUYsIAlTS19QTk1JX0hUWF9MQVRFX0NPTH0sCisvKiBCaXQxNiAqLwl7IFNLX1BOTUlfSFRYX1VOREVSUlVOLCAJU0tfUE5NSV9IVFhfRVhDRVNTX0NPTH0sCisvKiBCaXQxNyAqLwl7IFNLX1BOTUlfSFRYX0NBUlJJRVIsIAkJU0tfUE5NSV9IVFhfTVVMVElfQ09MfSwKKy8qIEJpdDE4ICovCXsgU0tfUE5NSV9IVFhfVVRJTFVOREVSLCAJU0tfUE5NSV9IVFhfU0lOR0xFX0NPTH0sCisvKiBCaXQxOSAqLwl7IFNLX1BOTUlfSFRYX1VUSUxPVkVSLCAJU0tfUE5NSV9IVFhfVU5ERVJSVU59LAorLyogQml0MjAgKi8JeyBTS19QTk1JX0hUWF82NCwgCQkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjEgKi8JeyBTS19QTk1JX0hUWF8xMjcsIAkJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDIyICovCXsgU0tfUE5NSV9IVFhfMjU1LCAJCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyMyAqLwl7IFNLX1BOTUlfSFRYXzUxMSwgCQkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjQgKi8JeyBTS19QTk1JX0hUWF8xMDIzLCAJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI1ICovCXsgU0tfUE5NSV9IVFhfTUFYLCAJCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyNiAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjcgKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI4ICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyOSAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MzAgKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDMxICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQzMiAqLwl7IFNLX1BOTUlfSFJYLCAJCQkJU0tfUE5NSV9IUlhfVU5JQ0FTVH0sCisvKiBCaXQzMyAqLwl7IFNLX1BOTUlfSFJYX09DVEVUSElHSCwgCVNLX1BOTUlfSFJYX0JST0FEQ0FTVH0sCisvKiBCaXQzNCAqLwl7IFNLX1BOTUlfSFJYX09DVEVUTE9XLCAJU0tfUE5NSV9IUlhfUE1BQ0N9LAorLyogQml0MzUgKi8JeyBTS19QTk1JX0hSWF9CUk9BRENBU1QsIAlTS19QTk1JX0hSWF9NVUxUSUNBU1R9LAorLyogQml0MzYgKi8JeyBTS19QTk1JX0hSWF9NVUxUSUNBU1QsIAlTS19QTk1JX0hSWF9GQ1N9LAorLyogQml0MzcgKi8JeyBTS19QTk1JX0hSWF9VTklDQVNULCAJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDM4ICovCXsgU0tfUE5NSV9IUlhfUE1BQ0MsIAkJU0tfUE5NSV9IUlhfT0NURVRMT1d9LAorLyogQml0MzkgKi8JeyBTS19QTk1JX0hSWF9NQUNDLCAJCVNLX1BOTUlfSFJYX09DVEVUSElHSH0sCisvKiBCaXQ0MCAqLwl7IFNLX1BOTUlfSFJYX1BNQUNDX0VSUiwgCVNLX1BOTUlfSFJYX0JBRE9DVEVUTE9XfSwKKy8qIEJpdDQxICovCXsgU0tfUE5NSV9IUlhfTUFDQ19VTktXTiwJU0tfUE5NSV9IUlhfQkFET0NURVRISUdIfSwKKy8qIEJpdDQyICovCXsgU0tfUE5NSV9IUlhfQlVSU1QsIAkJU0tfUE5NSV9IUlhfVU5ERVJTSVpFfSwKKy8qIEJpdDQzICovCXsgU0tfUE5NSV9IUlhfTUlTU0VELCAJCVNLX1BOTUlfSFJYX1JVTlR9LAorLyogQml0NDQgKi8JeyBTS19QTk1JX0hSWF9GUkFNSU5HLCAJCVNLX1BOTUlfSFJYXzY0fSwKKy8qIEJpdDQ1ICovCXsgU0tfUE5NSV9IUlhfT1ZFUkZMT1csIAlTS19QTk1JX0hSWF8xMjd9LAorLyogQml0NDYgKi8JeyBTS19QTk1JX0hSWF9KQUJCRVIsIAkJU0tfUE5NSV9IUlhfMjU1fSwKKy8qIEJpdDQ3ICovCXsgU0tfUE5NSV9IUlhfQ0FSUklFUiwgCQlTS19QTk1JX0hSWF81MTF9LAorLyogQml0NDggKi8JeyBTS19QTk1JX0hSWF9JUkxFTkdUSCwgCVNLX1BOTUlfSFJYXzEwMjN9LAorLyogQml0NDkgKi8JeyBTS19QTk1JX0hSWF9TWU1CT0wsIAkJU0tfUE5NSV9IUlhfTUFYfSwKKy8qIEJpdDUwICovCXsgU0tfUE5NSV9IUlhfU0hPUlRTLCAJCVNLX1BOTUlfSFJYX0xPTkdGUkFNRVN9LAorLyogQml0NTEgKi8JeyBTS19QTk1JX0hSWF9SVU5ULCAJCVNLX1BOTUlfSFJYX1RPT19MT05HfSwKKy8qIEJpdDUyICovCXsgU0tfUE5NSV9IUlhfVE9PX0xPTkcsIAlTS19QTk1JX0hSWF9KQUJCRVJ9LAorLyogQml0NTMgKi8JeyBTS19QTk1JX0hSWF9GQ1MsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDU0ICovCXsgU0tfUE5NSV9IUlhfUkVTRVJWRUQsIAlTS19QTk1JX0hSWF9PVkVSRkxPV30sCisvKiBCaXQ1NSAqLwl7IFNLX1BOTUlfSFJYX0NFWFQsIAkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NTYgKi8JeyBTS19QTk1JX0hSWF9VVElMVU5ERVIsIAlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ1NyAqLwl7IFNLX1BOTUlfSFJYX1VUSUxPVkVSLCAJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NTggKi8JeyBTS19QTk1JX0hSWF82NCwgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NTkgKi8JeyBTS19QTk1JX0hSWF8xMjcsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDYwICovCXsgU0tfUE5NSV9IUlhfMjU1LCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ2MSAqLwl7IFNLX1BOTUlfSFJYXzUxMSwgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NjIgKi8JeyBTS19QTk1JX0hSWF8xMDIzLCAJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDYzICovCXsgU0tfUE5NSV9IUlhfTUFYLCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0KK307CisKKy8qCisgKiBUYWJsZSBmb3IgaGFyZHdhcmUgcmVnaXN0ZXIgc2F2aW5nIG9uIHJlc2V0cyBhbmQgcG9ydCBzd2l0Y2hlcworICovCitQTk1JX1NUQVRJQyBjb25zdCBTS19QTk1JX1NUQVRBRERSIFN0YXRBZGRyW1NLX1BOTUlfTUFYX0lEWF1bU0tfUE5NSV9NQUNfVFlQRVNdID0geworCS8qIFNLX1BOTUlfSFRYICovCisJe3tYTV9UWEZfT0ssIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9PQ1RFVEhJR0ggKi8KKwl7e1hNX1RYT19PS19ISSwgU0tfVFJVRX0sIHtHTV9UWE9fT0tfSEksIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9PQ1RFVExPVyAqLworCXt7WE1fVFhPX09LX0xPLCBTS19GQUxTRX0sIHtHTV9UWE9fT0tfTE8sIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfQlJPQURDQVNUICovCisJe3tYTV9UWEZfQkNfT0ssIFNLX1RSVUV9LCB7R01fVFhGX0JDX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTVVMVElDQVNUICovCisJe3tYTV9UWEZfTUNfT0ssIFNLX1RSVUV9LCB7R01fVFhGX01DX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfVU5JQ0FTVCAqLworCXt7WE1fVFhGX1VDX09LLCBTS19UUlVFfSwge0dNX1RYRl9VQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0JVUlNUICovCisJe3tYTV9UWEVfQlVSU1QsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9QTUFDQyAqLworCXt7WE1fVFhGX01QQVVTRSwgU0tfVFJVRX0sIHtHTV9UWEZfTVBBVVNFLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTUFDQyAqLworCXt7WE1fVFhGX01DVFJMLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfQ09MICovCisJe3swLCBTS19GQUxTRX0sIHtHTV9UWEZfQ09MLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfU0lOR0xFX0NPTCAqLworCXt7WE1fVFhGX1NOR19DT0wsIFNLX1RSVUV9LCB7R01fVFhGX1NOR19DT0wsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9NVUxUSV9DT0wgKi8KKwl7e1hNX1RYRl9NVUxfQ09MLCBTS19UUlVFfSwge0dNX1RYRl9NVUxfQ09MLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfRVhDRVNTX0NPTCAqLworCXt7WE1fVFhGX0FCT19DT0wsIFNLX1RSVUV9LCB7R01fVFhGX0FCT19DT0wsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9MQVRFX0NPTCAqLworCXt7WE1fVFhGX0xBVF9DT0wsIFNLX1RSVUV9LCB7R01fVFhGX0xBVF9DT0wsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9ERUZGRVJBTCAqLworCXt7WE1fVFhGX0RFRiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX0VYQ0VTU19ERUYgKi8KKwl7e1hNX1RYRl9FWF9ERUYsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9VTkRFUlJVTiAqLworCXt7WE1fVFhFX0ZJRk9fVVIsIFNLX1RSVUV9LCB7R01fVFhFX0ZJRk9fVVIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9DQVJSSUVSICovCisJe3tYTV9UWEVfQ1NfRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfVVRJTFVOREVSICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1VUSUxPVkVSICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYXzY0ICovCisJe3tYTV9UWEZfNjRCLCBTS19UUlVFfSwge0dNX1RYRl82NEIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF8xMjcgKi8KKwl7e1hNX1RYRl8xMjdCLCBTS19UUlVFfSwge0dNX1RYRl8xMjdCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfMjU1ICovCisJe3tYTV9UWEZfMjU1QiwgU0tfVFJVRX0sIHtHTV9UWEZfMjU1QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYXzUxMSAqLworCXt7WE1fVFhGXzUxMUIsIFNLX1RSVUV9LCB7R01fVFhGXzUxMUIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF8xMDIzICovCisJe3tYTV9UWEZfMTAyM0IsIFNLX1RSVUV9LCB7R01fVFhGXzEwMjNCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTUFYICovCisJe3tYTV9UWEZfTUFYX1NaLCBTS19UUlVFfSwge0dNX1RYRl8xNTE4QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0xPTkdGUkFNRVMgICovCisJe3tYTV9UWEZfTE9ORywgU0tfVFJVRX0sIHtHTV9UWEZfTUFYX1NaLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfU1lOQyAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9TWU5DX09DVEVUICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1JFU0VSVkVEICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYICovCisJe3tYTV9SWEZfT0ssIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9PQ1RFVEhJR0ggKi8KKwl7e1hNX1JYT19PS19ISSwgU0tfVFJVRX0sIHtHTV9SWE9fT0tfSEksIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9PQ1RFVExPVyAqLworCXt7WE1fUlhPX09LX0xPLCBTS19GQUxTRX0sIHtHTV9SWE9fT0tfTE8sIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfQkFET0NURVRISUdIICovCisJe3swLCBTS19GQUxTRX0sIHtHTV9SWE9fRVJSX0hJLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfQkFET0NURVRMT1cgKi8KKwl7ezAsIFNLX0ZBTFNFfSwge0dNX1JYT19FUlJfTE8sIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9CUk9BRENBU1QgKi8KKwl7e1hNX1JYRl9CQ19PSywgU0tfVFJVRX0sIHtHTV9SWEZfQkNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9NVUxUSUNBU1QgKi8KKwl7e1hNX1JYRl9NQ19PSywgU0tfVFJVRX0sIHtHTV9SWEZfTUNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9VTklDQVNUICovCisJe3tYTV9SWEZfVUNfT0ssIFNLX1RSVUV9LCB7R01fUlhGX1VDX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfUE1BQ0MgKi8KKwl7e1hNX1JYRl9NUEFVU0UsIFNLX1RSVUV9LCB7R01fUlhGX01QQVVTRSwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX01BQ0MgKi8KKwl7e1hNX1JYRl9NQ1RSTCwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1BNQUNDX0VSUiAqLworCXt7WE1fUlhGX0lOVl9NUCwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX01BQ0NfVU5LV04gKi8KKwl7e1hNX1JYRl9JTlZfTU9DLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfQlVSU1QgKi8KKwl7e1hNX1JYRV9CVVJTVCwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX01JU1NFRCAqLworCXt7WE1fUlhFX0ZNSVNTLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfRlJBTUlORyAqLworCXt7WE1fUlhGX0ZSQV9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9VTkRFUlNJWkUgKi8KKwl7ezAsIFNLX0ZBTFNFfSwge0dNX1JYRl9TSFQsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9PVkVSRkxPVyAqLworCXt7WE1fUlhFX0ZJRk9fT1YsIFNLX1RSVUV9LCB7R01fUlhFX0ZJRk9fT1YsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9KQUJCRVIgKi8KKwl7e1hNX1JYRl9KQUJfUEtULCBTS19UUlVFfSwge0dNX1JYRl9KQUJfUEtULCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfQ0FSUklFUiAqLworCXt7WE1fUlhFX0NBUl9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9JUkxFTkdUSCAqLworCXt7WE1fUlhGX0xFTl9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9TWU1CT0wgKi8KKwl7e1hNX1JYRV9TWU1fRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfU0hPUlRTICovCisJe3tYTV9SWEVfU0hUX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1JVTlQgKi8KKwl7e1hNX1JYRV9SVU5ULCBTS19UUlVFfSwge0dNX1JYRV9GUkFHLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfVE9PX0xPTkcgKi8KKwl7e1hNX1JYRl9MTkdfRVJSLCBTS19UUlVFfSwge0dNX1JYRl9MTkdfRVJSLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfRkNTICovCisJe3tYTV9SWEZfRkNTX0VSUiwgU0tfVFJVRX0sIHtHTV9SWEZfRkNTX0VSUiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0NFWFQgKi8KKwl7e1hNX1JYRl9DRVhfRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfVVRJTFVOREVSICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1VUSUxPVkVSICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYXzY0ICovCisJe3tYTV9SWEZfNjRCLCBTS19UUlVFfSwge0dNX1JYRl82NEIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF8xMjcgKi8KKwl7e1hNX1JYRl8xMjdCLCBTS19UUlVFfSwge0dNX1JYRl8xMjdCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfMjU1ICovCisJe3tYTV9SWEZfMjU1QiwgU0tfVFJVRX0sIHtHTV9SWEZfMjU1QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYXzUxMSAqLworCXt7WE1fUlhGXzUxMUIsIFNLX1RSVUV9LCB7R01fUlhGXzUxMUIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF8xMDIzICovCisJe3tYTV9SWEZfMTAyM0IsIFNLX1RSVUV9LCB7R01fUlhGXzEwMjNCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfTUFYICovCisJe3tYTV9SWEZfTUFYX1NaLCBTS19UUlVFfSwge0dNX1JYRl8xNTE4QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0xPTkdGUkFNRVMgKi8KKwl7ezAsIFNLX0ZBTFNFfSwge0dNX1JYRl9NQVhfU1osIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9SRVNFUlZFRCAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQdWJsaWMgZnVuY3Rpb25zCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taUluaXQgLSBJbml0IGZ1bmN0aW9uIG9mIFBOTUkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVNLX0lOSVRfREFUQTogSW5pdGlhbGlzZXMgdGhlIGRhdGEgc3RydWN0dXJlcworICoJU0tfSU5JVF9JTzogICBSZXNldHMgdGhlIFhNQUMgc3RhdGlzdGljcywgZGV0ZXJtaW5lcyB0aGUgZGV2aWNlIGFuZAorICoJICAgICAgICAgICAgICBjb25uZWN0b3IgdHlwZS4KKyAqCVNLX0lOSVRfUlVOOiAgU3RhcnRzIGEgdGltZXIgZXZlbnQgZm9yIHBvcnQgc3dpdGNoIHBlciBob3VyCisgKgkgICAgICAgICAgICAgIGNhbGN1bGF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKglBbHdheXMgMAorICovCitpbnQgU2tQbm1pSW5pdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgTGV2ZWwpCQkvKiBJbml0aWFsaXphdGlvbiBsZXZlbCAqLworeworCXVuc2lnbmVkIGludAlQb3J0TWF4OwkvKiBOdW1iZXIgb2YgcG9ydHMgKi8KKwl1bnNpZ25lZCBpbnQJUG9ydEluZGV4OwkvKiBDdXJyZW50IHBvcnQgaW5kZXggaW4gbG9vcCAqLworCVNLX1UxNgkJVmFsMTY7CQkvKiBNdWx0aXBsZSBwdXJwb3NlIDE2IGJpdCB2YXJpYWJsZSAqLworCVNLX1U4CQlWYWw4OwkJLyogTXVsaXRwbGUgcHVycG9zZSA4IGJpdCB2YXJpYWJsZSAqLworCVNLX0VWUEFSQQlFdmVudFBhcmFtOwkvKiBFdmVudCBzdHJ1Y3QgZm9yIHRpbWVyIGV2ZW50ICovCisJU0tfUE5NSV9WQ1QJKnBWY3RCYWNrdXBEYXRhOworCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taUluaXQ6IENhbGxlZCwgbGV2ZWw9JWRcbiIsIExldmVsKSk7CisKKwlzd2l0Y2ggKExldmVsKSB7CisKKwljYXNlIFNLX0lOSVRfREFUQToKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taSwgMCwgc2l6ZW9mKHBBQy0+UG5taSkpOworCQlwQUMtPlBubWkuVHJhcEJ1ZkZyZWUgPSBTS19QTk1JX1RSQVBfUVVFVUVfTEVOOworCQlwQUMtPlBubWkuU3RhcnRVcFRpbWUgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhTa09zR2V0VGltZShwQUMpKTsKKwkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaHJlc2hvbGQgPSBTS19QTk1JX0RFRl9STE1UX0NIR19USFJFUzsKKwkJZm9yIChQb3J0SW5kZXggPSAwOyBQb3J0SW5kZXggPCBTS19NQVhfTUFDUzsgUG9ydEluZGV4ICsrKSB7CisKKwkJCXBBQy0+UG5taS5Qb3J0W1BvcnRJbmRleF0uQWN0aXZlRmxhZyA9IFNLX0ZBTFNFOworCQkJcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID0gU0tfRkFMU0U7CisJCX0KKworI2lmZGVmIFNLX1BOTUlfQ0hFQ0sKKwkJaWYgKFNLX1BOTUlfTUFYX0lEWCAhPSBTS19QTk1JX0NOVF9OTykgeworCQkJCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQ5LCBTS19QTk1JX0VSUjA0OU1TRyk7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0lOSVQgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkJCSAgICgiQ291bnRlck9mZnNldCBzdHJ1Y3Qgc2l6ZSAoJWQpIGRpZmZlcnMgZnJvbSIKKwkJCQkJCSJTS19QTk1JX01BWF9JRFggKCVkKVxuIiwKKwkJCQkJCVNLX1BOTUlfQ05UX05PLCBTS19QTk1JX01BWF9JRFgpKTsKKwkJfQorCisJCWlmIChTS19QTk1JX01BWF9JRFggIT0KKwkJCShzaXplb2YoU3RhdEFkZHIpIC8gKHNpemVvZihTS19QTk1JX1NUQVRBRERSKSAqIFNLX1BOTUlfTUFDX1RZUEVTKSkpIHsKKwkJCQorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA1MCwgU0tfUE5NSV9FUlIwNTBNU0cpOworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9JTklUIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJCQkgICAoIlN0YXRBZGRyIHRhYmxlIHNpemUgKCVkKSBkaWZmZXJzIGZyb20gIgorCQkJCQkJIlNLX1BOTUlfTUFYX0lEWCAoJWQpXG4iLAorCQkJCQkJKHNpemVvZihTdGF0QWRkcikgLworCQkJCQkJIChzaXplb2YoU0tfUE5NSV9TVEFUQUREUikgKiBTS19QTk1JX01BQ19UWVBFUykpLAorCQkJCQkJIFNLX1BOTUlfTUFYX0lEWCkpOworCQl9CisjZW5kaWYgLyogU0tfUE5NSV9DSEVDSyAqLworCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9JTzoKKwkJLyoKKwkJICogUmVzZXQgTUFDIGNvdW50ZXJzCisJCSAqLworCQlQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJCWZvciAoUG9ydEluZGV4ID0gMDsgUG9ydEluZGV4IDwgUG9ydE1heDsgUG9ydEluZGV4ICsrKSB7CisKKwkJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjUmVzZXRDb3VudGVyKHBBQywgSW9DLCBQb3J0SW5kZXgpOworCQl9CisJCQorCQkvKiBJbml0aWFsaXplIERTUCB2YXJpYWJsZXMgZm9yIFZjdCgpIHRvIDB4ZmYgPT4gTmV2ZXIgd3JpdHRlbiEgKi8JCQorCQlmb3IgKFBvcnRJbmRleCA9IDA7IFBvcnRJbmRleCA8IFBvcnRNYXg7IFBvcnRJbmRleCArKykgeworCQkJcEFDLT5HSW5pLkdQW1BvcnRJbmRleF0uUENhYmxlTGVuID0gMHhmZjsKKwkJCXBWY3RCYWNrdXBEYXRhID0gJnBBQy0+UG5taS5WY3RCYWNrdXBbUG9ydEluZGV4XTsKKwkJCXBWY3RCYWNrdXBEYXRhLT5QQ2FibGVMZW4gPSAweGZmOworCQl9CisJCQorCQkvKgorCQkgKiBHZXQgcGNpIGJ1cyBzcGVlZAorCQkgKi8KKwkJU0tfSU4xNihJb0MsIEIwX0NUU1QsICZWYWwxNik7CisJCWlmICgoVmFsMTYgJiBDU19CVVNfQ0xPQ0spID09IDApIHsKKworCQkJcEFDLT5Qbm1pLlBjaUJ1c1NwZWVkID0gMzM7CisJCX0KKwkJZWxzZSB7CisJCQlwQUMtPlBubWkuUGNpQnVzU3BlZWQgPSA2NjsKKwkJfQorCisJCS8qCisJCSAqIEdldCBwY2kgYnVzIHdpZHRoCisJCSAqLworCQlTS19JTjE2KElvQywgQjBfQ1RTVCwgJlZhbDE2KTsKKwkJaWYgKChWYWwxNiAmIENTX0JVU19TTE9UX1NaKSA9PSAwKSB7CisKKwkJCXBBQy0+UG5taS5QY2lCdXNXaWR0aCA9IDMyOworCQl9CisJCWVsc2UgeworCQkJcEFDLT5Qbm1pLlBjaUJ1c1dpZHRoID0gNjQ7CisJCX0KKworCQkvKgorCQkgKiBHZXQgY2hpcHNldAorCQkgKi8KKwkJc3dpdGNoIChwQUMtPkdJbmkuR0lDaGlwSWQpIHsKKwkJY2FzZSBDSElQX0lEX0dFTkVTSVM6CisJCQlwQUMtPlBubWkuQ2hpcHNldCA9IFNLX1BOTUlfQ0hJUFNFVF9YTUFDOworCQkJYnJlYWs7CisKKwkJY2FzZSBDSElQX0lEX1lVS09OOgorCQkJcEFDLT5Qbm1pLkNoaXBzZXQgPSBTS19QTk1JX0NISVBTRVRfWVVLT047CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBHZXQgUE1EIGFuZCBEZXZpY2VUeXBlCisJCSAqLworCQlTS19JTjgoSW9DLCBCMl9QTURfVFlQLCAmVmFsOCk7CisJCXN3aXRjaCAoVmFsOCkgeworCQljYXNlICdTJzoKKwkJCXBBQy0+UG5taS5QTUQgPSAzOworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IDEpIHsKKworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwMjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ0wnOgorCQkJcEFDLT5Qbm1pLlBNRCA9IDI7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID4gMSkgeworCisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDA0OworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDAzOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnQyc6CisJCQlwQUMtPlBubWkuUE1EID0gNDsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiAxKSB7CisKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDY7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdUJzoKKwkJCXBBQy0+UG5taS5QTUQgPSA1OworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IDEpIHsKKworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwODsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwNzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQgOgorCQkJcEFDLT5Qbm1pLlBNRCA9IDE7CisJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEdldCBjb25uZWN0b3IKKwkJICovCisJCVNLX0lOOChJb0MsIEIyX0NPTk5fVFlQLCAmVmFsOCk7CisJCXN3aXRjaCAoVmFsOCkgeworCQljYXNlICdDJzoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRCc6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0YnOgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDQ7CisJCQlicmVhazsKKworCQljYXNlICdKJzoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSA1OworCQkJYnJlYWs7CisKKwkJY2FzZSAnVic6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gNjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19JTklUX1JVTjoKKwkJLyoKKwkJICogU3RhcnQgdGltZXIgZm9yIFJMTVQgY2hhbmdlIGNvdW50ZXIKKwkJICovCisJCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdFRpbWVyLAorCQkJMjgxMjUwMDAsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfQ0hHX0VTVF9USU1FUiwKKwkJCUV2ZW50UGFyYW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOyAvKiBOb3RoaW5nIHRvZG8gKi8KKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlHZXRWYXIgLSBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIE9JRAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsbHMgYSBnZW5lcmFsIHN1Yi1mdW5jdGlvbiBmb3IgYWxsIHRoaXMgc3R1ZmYuIElmIHRoZSBpbnN0YW5jZQorICoJLTEgaXMgcGFzc2VkLCB0aGUgdmFsdWVzIG9mIGFsbCBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGluIGFuCisgKglhcnJheSBvZiB2YWx1ZXMuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZAorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZAorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byB0YWtlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX09JRCAgVGhlIHJlcXVlc3RlZCBPSUQgaXMgdW5rbm93bgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworaW50IFNrUG5taUdldFZhcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgdG8gd2hpY2ggdGhlIG1hbmFnZW1lbnQgZGF0YSB3aWxsIGJlIGNvcGllZCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taUdldFZhcjogQ2FsbGVkLCBJZD0weCV4LCBCdWZMZW49JWQsIEluc3RhbmNlPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCUlkLCAqcExlbiwgSW5zdGFuY2UsIE5ldEluZGV4KSk7CisKKwlyZXR1cm4gKFBubWlWYXIocEFDLCBJb0MsIFNLX1BOTUlfR0VULCBJZCwgKGNoYXIgKilwQnVmLCBwTGVuLAorCQlJbnN0YW5jZSwgTmV0SW5kZXgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pUHJlU2V0VmFyIC0gUHJlc2V0cyB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgT0lECisgKgorICogRGVzY3JpcHRpb246CisgKglDYWxscyBhIGdlbmVyYWwgc3ViLWZ1bmN0aW9uIGZvciBhbGwgdGhpcyBzdHVmZi4gVGhlIHByZXNldCBkb2VzCisgKgl0aGUgc2FtZSBhcyBhIHNldCwgYnV0IHJldHVybnMganVzdCBiZWZvcmUgZmluYWxseSBzZXR0aW5nIHRoZQorICoJbmV3IHZhbHVlLiBUaGlzIGlzIHVzZWZ1bGwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCisgKglJZiB0aGUgaW5zdGFuY2UgLTEgaXMgcGFzc2VkLCBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgc3VwcG9zZWQgYW5kCisgKglhbGwgaW5zdGFuY2VzIG9mIHRoZSBPSUQgd2lsbCBiZSBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fT0lEICBUaGUgcmVxdWVzdGVkIE9JRCBpcyB1bmtub3duLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworaW50IFNrUG5taVByZVNldFZhcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgdG8gd2hpY2ggdGhlIG1hbmFnZW1lbnQgZGF0YSB3aWxsIGJlIGNvcGllZCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBUb3RhbCBsZW5ndGggb2YgbWFuYWdlbWVudCBkYXRhICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHNldCBvciAtMSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pUHJlU2V0VmFyOiBDYWxsZWQsIElkPTB4JXgsIEJ1Zkxlbj0lZCwgSW5zdGFuY2U9JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJSWQsICpwTGVuLCBJbnN0YW5jZSwgTmV0SW5kZXgpKTsKKworCisJcmV0dXJuIChQbm1pVmFyKHBBQywgSW9DLCBTS19QTk1JX1BSRVNFVCwgSWQsIChjaGFyICopcEJ1ZiwgcExlbiwKKwkJSW5zdGFuY2UsIE5ldEluZGV4KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taVNldFZhciAtIFNldHMgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIE9JRAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsbHMgYSBnZW5lcmFsIHN1Yi1mdW5jdGlvbiBmb3IgYWxsIHRoaXMgc3R1ZmYuIFRoZSBwcmVzZXQgZG9lcworICoJdGhlIHNhbWUgYXMgYSBzZXQsIGJ1dCByZXR1cm5zIGp1c3QgYmVmb3JlIGZpbmFsbHkgc2V0dGluZyB0aGUKKyAqCW5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VmdWxsIHRvIGNoZWNrIGlmIGEgc2V0IG1pZ2h0IGJlIHN1Y2Nlc3NmdWxsLgorICoJSWYgdGhlIGluc3RhbmNlIC0xIGlzIHBhc3NlZCwgYW4gYXJyYXkgb2YgdmFsdWVzIGlzIHN1cHBvc2VkIGFuZAorICoJYWxsIGluc3RhbmNlcyBvZiB0aGUgT0lEIHdpbGwgYmUgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX09JRCAgVGhlIHJlcXVlc3RlZCBPSUQgaXMgdW5rbm93bi4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK2ludCBTa1BubWlTZXRWYXIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHRvIHdoaWNoIHRoZSBtYW5hZ2VtZW50IGRhdGEgd2lsbCBiZSBjb3BpZWQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogVG90YWwgbGVuZ3RoIG9mIG1hbmFnZW1lbnQgZGF0YSAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBzZXQgb3IgLTEgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taVNldFZhcjogQ2FsbGVkLCBJZD0weCV4LCBCdWZMZW49JWQsIEluc3RhbmNlPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCUlkLCAqcExlbiwgSW5zdGFuY2UsIE5ldEluZGV4KSk7CisKKwlyZXR1cm4gKFBubWlWYXIocEFDLCBJb0MsIFNLX1BOTUlfU0VULCBJZCwgKGNoYXIgKilwQnVmLCBwTGVuLAorCQlJbnN0YW5jZSwgTmV0SW5kZXgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pR2V0U3RydWN0IC0gUmV0cmlldmVzIHRoZSBtYW5hZ2VtZW50IGRhdGFiYXNlIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJ1bnMgdGhyb3VnaCB0aGUgSWRUYWJsZSwgcXVlcmllcyB0aGUgc2luZ2xlIE9JRHMgYW5kIHN0b3JlcyB0aGUKKyAqCXJldHVybmVkIGRhdGEgaW50byB0aGUgbWFuYWdlbWVudCBkYXRhYmFzZSBzdHJ1Y3R1cmUKKyAqCVNLX1BOTUlfU1RSVUNUX0RBVEEuIFRoZSBvZmZzZXQgb2YgdGhlIE9JRCBpbiB0aGUgc3RydWN0dXJlCisgKglpcyBzdG9yZWQgaW4gdGhlIElkVGFibGUuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbworICoJYmUgc3RvcmVkIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZQorICoJbWluaW11bSBzaXplIG9mIFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQKKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQKKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gdGFrZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQgIFRoZSByZXF1ZXN0ZWQgTmV0SW5kZXggZG9lc24ndCBleGlzdAorICovCitpbnQgU2tQbm1pR2V0U3RydWN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgdG8gd2hpY2ggdGhlIG1hbmFnZW1lbnQgZGF0YSB3aWxsIGJlIGNvcGllZC4gKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAkJUmV0OworCXVuc2lnbmVkIGludAlUYWJsZUluZGV4OworCXVuc2lnbmVkIGludAlEc3RPZmZzZXQ7CisJdW5zaWduZWQgaW50CUluc3RhbmNlTm87CisJdW5zaWduZWQgaW50CUluc3RhbmNlQ250OworCVNLX1UzMgkJSW5zdGFuY2U7CisJdW5zaWduZWQgaW50CVRtcExlbjsKKwljaGFyCQlLZXlBcnJbU0tfUE5NSV9WUERfRU5UUklFU11bU0tfUE5NSV9WUERfS0VZX1NJWkVdOworCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taUdldFN0cnVjdDogQ2FsbGVkLCBCdWZMZW49JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJKnBMZW4sIE5ldEluZGV4KSk7CisKKwlpZiAoKnBMZW4gPCBTS19QTk1JX1NUUlVDVF9TSVpFKSB7CisKKwkJaWYgKCpwTGVuID49IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFKSB7CisKKwkJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgU0tfUE5NSV9FUlJfVE9PX1NIT1JULAorCQkJCShTS19VMzIpKC0xKSk7CisJCX0KKworCQkqcExlbiA9IFNLX1BOTUlfU1RSVUNUX1NJWkU7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwl9CisKKyAgICAvKgorICAgICAqIENoZWNrIE5ldEluZGV4CisgICAgICovCisJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQpOworCX0KKworCS8qIFVwZGF0ZSBzdGF0aXN0aWMgKi8KKwlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUdldFN0cnVjdDogT24gY2FsbCIpOworCisJaWYgKChSZXQgPSBNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpKSAhPQorCQlTS19QTk1JX0VSUl9PSykgeworCisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJaWYgKChSZXQgPSBSbG10VXBkYXRlKHBBQywgSW9DLCBOZXRJbmRleCkpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwlpZiAoKFJldCA9IFNpcnFVcGRhdGUocEFDLCBJb0MpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgc2VtYXBob3JlcyB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMKKwkgKiBhbHJlYWR5IGRvbmUKKwkgKi8KKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyArKzsKKwlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnICsrOworCisJLyogR2V0IHZwZCBrZXlzIGZvciBpbnN0YW5jZSBjYWxjdWxhdGlvbiAqLworCVJldCA9IEdldFZwZEtleUFycihwQUMsIElvQywgJktleUFyclswXVswXSwgc2l6ZW9mKEtleUFyciksICZUbXBMZW4pOworCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlHZXRTdHJ1Y3Q6IE9uIHJldHVybiIpOworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwkvKiBSZXRyaWV2ZSB2YWx1ZXMgKi8KKwlTS19NRU1TRVQoKGNoYXIgKilwQnVmLCAwLCBTS19QTk1JX1NUUlVDVF9TSVpFKTsKKwlmb3IgKFRhYmxlSW5kZXggPSAwOyBUYWJsZUluZGV4IDwgSURfVEFCTEVfU0laRTsgVGFibGVJbmRleCArKykgeworCisJCUluc3RhbmNlTm8gPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkluc3RhbmNlTm87CisJCWZvciAoSW5zdGFuY2VDbnQgPSAxOyBJbnN0YW5jZUNudCA8PSBJbnN0YW5jZU5vOworCQkJSW5zdGFuY2VDbnQgKyspIHsKKworCQkJRHN0T2Zmc2V0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5PZmZzZXQgKworCQkJCShJbnN0YW5jZUNudCAtIDEpICoKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLlN0cnVjdFNpemU7CisKKwkJCS8qCisJCQkgKiBGb3IgdGhlIFZQRCB0aGUgaW5zdGFuY2UgaXMgbm90IGFuIGluZGV4IG51bWJlcgorCQkJICogYnV0IHRoZSBrZXkgaXRzZWxmLiBEZXRlcm1pbiB3aXRoIHRoZSBpbnN0YW5jZQorCQkJICogY291bnRlciB0aGUgVlBEIGtleSB0byBiZSB1c2VkLgorCQkJICovCisJCQlpZiAoSWRUYWJsZVtUYWJsZUluZGV4XS5JZCA9PSBPSURfU0tHRV9WUERfS0VZIHx8CisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5JZCA9PSBPSURfU0tHRV9WUERfVkFMVUUgfHwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLklkID09IE9JRF9TS0dFX1ZQRF9BQ0NFU1MgfHwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLklkID09IE9JRF9TS0dFX1ZQRF9BQ1RJT04pIHsKKworCQkJCVNLX1NUUk5DUFkoKGNoYXIgKikmSW5zdGFuY2UsIEtleUFycltJbnN0YW5jZUNudCAtIDFdLCA0KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUluc3RhbmNlID0gKFNLX1UzMilJbnN0YW5jZUNudDsKKwkJCX0KKworCQkJVG1wTGVuID0gKnBMZW4gLSBEc3RPZmZzZXQ7CisJCQlSZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkZ1bmMocEFDLCBJb0MsIFNLX1BOTUlfR0VULAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uSWQsIChjaGFyICopcEJ1ZiArCisJCQkJRHN0T2Zmc2V0LCAmVG1wTGVuLCBJbnN0YW5jZSwgVGFibGVJbmRleCwgTmV0SW5kZXgpOworCisJCQkvKgorCQkJICogQW4gdW5rbm93biBpbnN0YW5jZSBlcnJvciBtZWFucyB0aGF0IHdlIHJlYWNoZWQKKwkJCSAqIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoYXQgdmFyaWFibGUuIFByb2NlZWQgd2l0aAorCQkJICogdGhlIG5leHQgT0lEIGluIHRoZSB0YWJsZSBhbmQgaWdub3JlIHRoZSByZXR1cm4KKwkJCSAqIGNvZGUuCisJCQkgKi8KKwkJCWlmIChSZXQgPT0gU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKSB7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCX0KKworCQkJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCQkJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCQkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCQkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pR2V0U3RydWN0OiBPbiByZXR1cm4iKTsKKwkJCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgRHN0T2Zmc2V0KTsKKwkJCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQkJCXJldHVybiAoUmV0KTsKKwkJCX0KKwkJfQorCX0KKworCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkqcExlbiA9IFNLX1BOTUlfU1RSVUNUX1NJWkU7CisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlHZXRTdHJ1Y3Q6IE9uIHJldHVybiIpOworCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgU0tfUE5NSV9FUlJfT0ssIChTS19VMzIpKC0xKSk7CisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taVByZVNldFN0cnVjdCAtIFByZXNldHMgdGhlIG1hbmFnZW1lbnQgZGF0YWJhc2UgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsbHMgYSBnZW5lcmFsIHN1Yi1mdW5jdGlvbiBmb3IgYWxsIHRoaXMgc2V0IHN0dWZmLiBUaGUgcHJlc2V0IGRvZXMKKyAqCXRoZSBzYW1lIGFzIGEgc2V0LCBidXQgcmV0dXJucyBqdXN0IGJlZm9yZSBmaW5hbGx5IHNldHRpbmcgdGhlCisgKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsbCB0byBjaGVjayBpZiBhIHNldCBtaWdodCBiZSBzdWNjZXNzZnVsbC4KKyAqCVRoZSBzdWItZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBJZFRhYmxlLCBjaGVja3Mgd2hpY2ggT0lEcyBhcmUgYWJsZQorICoJdG8gc2V0LCBhbmQgY2FsbHMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YgdGhlIE9JRCB0byBwZXJmb3JtIHRoZQorICoJcHJlc2V0LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gYmUgc3RvcmVkIGluCisgKglTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUgbWluaW11bSBzaXplIG9mCisgKglTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICovCitpbnQgU2tQbm1pUHJlU2V0U3RydWN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIGRhdGEgdG8gYmUgc2V0ICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taVByZVNldFN0cnVjdDogQ2FsbGVkLCBCdWZMZW49JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJKnBMZW4sIE5ldEluZGV4KSk7CisKKwlyZXR1cm4gKFBubWlTdHJ1Y3QocEFDLCBJb0MsIFNLX1BOTUlfUFJFU0VULCAoY2hhciAqKXBCdWYsCisgICAgCQkJCQlwTGVuLCBOZXRJbmRleCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlTZXRTdHJ1Y3QgLSBTZXRzIHRoZSBtYW5hZ2VtZW50IGRhdGFiYXNlIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHNldCBzdHVmZi4gVGhlIHJldHVybiB2YWx1ZQorICoJb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUKKyAqCXBhc3NlZCBidWZmZXIgaGFzIHRoZSBtaW5pbXVtIHNpemUgb2YgU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuCisgKglUaGUgc3ViLWZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgSWRUYWJsZSwgY2hlY2tzIHdoaWNoIE9JRHMgYXJlIGFibGUKKyAqCXRvIHNldCwgYW5kIGNhbGxzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIG9mIHRoZSBPSUQgdG8gcGVyZm9ybSB0aGUKKyAqCXNldC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHN0b3JlZCBpbgorICoJU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlIG1pbmltdW0gc2l6ZSBvZgorICoJU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqLworaW50IFNrUG5taVNldFN0cnVjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBkYXRhIHRvIGJlIHNldCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBMZW5ndGggb2YgYnVmZmVyICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlTZXRTdHJ1Y3Q6IENhbGxlZCwgQnVmTGVuPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCSpwTGVuLCBOZXRJbmRleCkpOworCisJcmV0dXJuIChQbm1pU3RydWN0KHBBQywgSW9DLCBTS19QTk1JX1NFVCwgKGNoYXIgKilwQnVmLAorICAgIAkJCQkJcExlbiwgTmV0SW5kZXgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pRXZlbnQgLSBFdmVudCBoYW5kbGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglIYW5kbGVzIHRoZSBmb2xsb3dpbmcgZXZlbnRzOgorICoJU0tfUE5NSV9FVlRfU0lSUV9PVkVSRkxPVyAgICAgV2hlbiBhIGhhcmR3YXJlIGNvdW50ZXIgb3ZlcmZsb3dzIGFuCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hpY2ggaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGhhbmRsZWQgYnkgU0lSUSB3aGljaCBnZW5lcmF0ZXMgYQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBldmVudC4gVGhlIGV2ZW50IGluY3JlbWVudHMgdGhlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciAzMiBiaXQgb2YgdGhlIDY0IGJpdCBjb3VudGVyLgorICoJU0tfUE5NSV9FVlRfU0VOX1hYWCAgICAgICAgICAgVGhlIGV2ZW50IGlzIGdlbmVyYXRlZCBieSB0aGUgSTJDIG1vZHVsZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhIHNlbnNvciByZXBvcnRzIGEgd2FybmluZyBvcgorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuIFRoZSBldmVudCB3aWxsIHN0b3JlIGEgdHJhcAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIuCisgKglTS19QTk1JX0VWVF9DSEdfRVNUX1RJTUVSICAgICBUaGUgdGltZXIgZXZlbnQgd2FzIGluaXRpYXRlZCBieSB0aGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgYW5kIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCBzd2l0Y2hlcyBwZXIgaG91ci4KKyAqCVNLX1BOTUlfRVZUX0NMRUFSX0NPVU5URVIgICAgIFRoZSBldmVudCBjbGVhcnMgYWxsIGNvdW50ZXJzIGFuZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wcy4KKyAqCVNLX1BOTUlfRVZUX1hNQUNfUkVTRVQgICAgICAgIFRoZSBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGRyaXZlcgorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGEgaGFyZCByZXNldCBvZiB0aGUgWE1BQyBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBBbGwgY291bnRlcnMgd2lsbCBiZSBzYXZlZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFkZGVkIHRvIHRoZSBoYXJkd2FyZSBjb3VudGVyCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgYWZ0ZXIgcmVzZXQgdG8gZ3JhbnQgY29udGludW91cworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciB2YWx1ZXMuCisgKglTS19QTk1JX0VWVF9STE1UX1BPUlRfVVAgICAgICBHZW5lcmF0ZWQgYnkgUkxNVCB0byBub3RpZnkgdGhhdCBhIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlbnQgbG9naWNhbGx5IHVwLiBBIHRyYXAgbWVzc2FnZSB3aWxsCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgdG8gdGhlIHRyYXAgYnVmZmVyLgorICoJU0tfUE5NSV9FVlRfUkxNVF9QT1JUX0RPV04gICAgR2VuZXJhdGVkIGJ5IFJMTVQgdG8gbm90aWZ5IHRoYXQgYSBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZW50IGxvZ2ljYWxseSBkb3duLiBBIHRyYXAgbWVzc2FnZSB3aWxsCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgdG8gdGhlIHRyYXAgYnVmZmVyLgorICoJU0tfUE5NSV9FVlRfUkxNVF9TRUdNRU5UQVRJT04gR2VuZXJhdGVkIGJ5IFJMTVQgdG8gbm90aWZ5IHRoYXQgdHdvCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmluZyB0cmVlIHJvb3QgYnJpZGdlcyB3ZXJlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZC4gQSB0cmFwIG1lc3NhZ2Ugd2lsbCBiZSBzdG9yZWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB0cmFwIGJ1ZmZlci4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04gIE5vdGlmaWVzIFBOTUkgdGhhdCBhbiBhY3RpdmUgcG9ydCB3ZW50CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duLiBQTk1JIHdpbGwgbm90IGZ1cnRoZXIgYWRkIHRoZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljIHZhbHVlcyB0byB0aGUgdmlydHVhbCBwb3J0LgorICoJU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAgICAgTm90aWZpZXMgUE5NSSB0aGF0IGEgcG9ydCB3ZW50IHVwIGFuZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm93IGFuIGFjdGl2ZSBwb3J0LiBQTk1JIHdpbGwgbm93CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgdGhlIHN0YXRpc3RpYyBkYXRhIG9mIHRoaXMgcG9ydCB0bworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZpcnR1YWwgcG9ydC4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfU0VUX05FVFMgICAgIE5vdGlmaWVzIFBOTUkgYWJvdXQgdGhlIG5ldCBtb2RlLiBUaGUgZmlyc3QgcGFyYW1ldGVyCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgbnVtYmVyIG9mIG5ldHMuIDEgbWVhbnMgc2luZ2xlIG5ldCwgMiBtZWFucworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbCBuZXQuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIC0xCisgKgorICogUmV0dXJuczoKKyAqCUFsd2F5cyAwCisgKi8KK2ludCBTa1BubWlFdmVudCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgRXZlbnQsCQkvKiBFdmVudC1JZCAqLworU0tfRVZQQVJBIFBhcmFtKQkvKiBFdmVudCBkZXBlbmRlbnQgcGFyYW1ldGVyICovCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisgICAgdW5zaWduZWQgaW50CU1heE5ldE51bWJlcjsKKwlpbnQJCQlDb3VudGVySW5kZXg7CisJaW50CQkJUmV0OworCVNLX1UxNgkJTWFjU3RhdHVzOworCVNLX1U2NAkJT3ZlcmZsb3dTdGF0dXM7CisJU0tfVTY0CQlNYXNrOworCWludAkJCU1hY1R5cGU7CisJU0tfVTY0CQlWYWx1ZTsKKwlTS19VMzIJCVZhbDMyOworCVNLX1UxNgkJUmVnaXN0ZXI7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisJU0tfVTY0CQlOZXdlc3RWYWx1ZTsKKwlTS19VNjQJCU9sZGVzdFZhbHVlOworCVNLX1U2NAkJRGVsdGE7CisJU0tfUE5NSV9FU1RJTUFURSAqcEVzdDsKKwlTS19VMzIJCU5ldEluZGV4OworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19QTk1JX1ZDVAkqcFZjdEJhY2t1cERhdGE7CisJU0tfVTMyCQlSZXRDb2RlOworCWludAkJaTsKKwlTS19VMzIJCUNhYmxlTGVuZ3RoOworCisKKyNpZmRlZiBERUJVRworCWlmIChFdmVudCAhPSBTS19QTk1JX0VWVF9YTUFDX1JFU0VUKSB7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUE5NSTogU2tQbm1pRXZlbnQ6IENhbGxlZCwgRXZlbnQ9MHgleCwgUGFyYW09MHgleFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpRXZlbnQsICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gY2FsbCIpOworCisJTWFjVHlwZSA9IHBBQy0+R0luaS5HSU1hY1R5cGU7CisJCisJc3dpdGNoIChFdmVudCkgeworCisJY2FzZSBTS19QTk1JX0VWVF9TSVJRX09WRVJGTE9XOgorCQlQaHlzUG9ydEluZGV4ID0gKGludClQYXJhbS5QYXJhMzJbMF07CisJCU1hY1N0YXR1cyA9IChTS19VMTYpUGFyYW0uUGFyYTMyWzFdOworI2lmZGVmIERFQlVHCisJCWlmIChQaHlzUG9ydEluZGV4ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9TSVJRX09WRVJGTE9XIHBhcmFtZXRlciIKKwkJCQkgIiB3cm9uZywgUGh5c1BvcnRJbmRleD0weCV4XG4iLAorCQkJCVBoeXNQb3J0SW5kZXgpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQlPdmVyZmxvd1N0YXR1cyA9IDA7CisKKwkJLyoKKwkJICogQ2hlY2sgd2hpY2ggc291cmNlIGNhdXNlZCBhbiBvdmVyZmxvdyBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAoKHBBQy0+R0luaS5HSUZ1bmMucEZuTWFjT3ZlcmZsb3cocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJTWFjU3RhdHVzLCAmT3ZlcmZsb3dTdGF0dXMpICE9IDApIHx8CisJCQkoT3ZlcmZsb3dTdGF0dXMgPT0gMCkpIHsKKworCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gcmV0dXJuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgdGhlIG92ZXJmbG93IHN0YXR1cyByZWdpc3RlciBhbmQgaW5jcmVtZW50CisJCSAqIHRoZSB1cHBlciBkd29yZCBvZiBjb3JyZXNwb25kaW5nIGNvdW50ZXIuCisJCSAqLworCQlmb3IgKENvdW50ZXJJbmRleCA9IDA7IENvdW50ZXJJbmRleCA8IHNpemVvZihNYXNrKSAqIDg7CisJCQlDb3VudGVySW5kZXggKyspIHsKKworCQkJTWFzayA9IChTS19VNjQpMSA8PCBDb3VudGVySW5kZXg7CisJCQlpZiAoKE92ZXJmbG93U3RhdHVzICYgTWFzaykgPT0gMCkgeworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXN3aXRjaCAoU3RhdE92cmZsd0JpdFtDb3VudGVySW5kZXhdW01hY1R5cGVdKSB7CisKKwkJCWNhc2UgU0tfUE5NSV9IVFhfVVRJTFVOREVSOgorCQkJY2FzZSBTS19QTk1JX0hUWF9VVElMT1ZFUjoKKwkJCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJCQlYTV9JTjE2KElvQywgUGh5c1BvcnRJbmRleCwgWE1fVFhfQ01ELCAmUmVnaXN0ZXIpOworCQkJCQlSZWdpc3RlciB8PSBYTV9UWF9TQU1fTElORTsKKwkJCQkJWE1fT1VUMTYoSW9DLCBQaHlzUG9ydEluZGV4LCBYTV9UWF9DTUQsIFJlZ2lzdGVyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0tfUE5NSV9IUlhfVVRJTFVOREVSOgorCQkJY2FzZSBTS19QTk1JX0hSWF9VVElMT1ZFUjoKKwkJCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJCQlYTV9JTjE2KElvQywgUGh5c1BvcnRJbmRleCwgWE1fUlhfQ01ELCAmUmVnaXN0ZXIpOworCQkJCQlSZWdpc3RlciB8PSBYTV9SWF9TQU1fTElORTsKKwkJCQkJWE1fT1VUMTYoSW9DLCBQaHlzUG9ydEluZGV4LCBYTV9SWF9DTUQsIFJlZ2lzdGVyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0tfUE5NSV9IVFhfT0NURVRISUdIOgorCQkJY2FzZSBTS19QTk1JX0hUWF9PQ1RFVExPVzoKKwkJCWNhc2UgU0tfUE5NSV9IVFhfUkVTRVJWRUQ6CisJCQljYXNlIFNLX1BOTUlfSFJYX09DVEVUSElHSDoKKwkJCWNhc2UgU0tfUE5NSV9IUlhfT0NURVRMT1c6CisJCQljYXNlIFNLX1BOTUlfSFJYX0lSTEVOR1RIOgorCQkJY2FzZSBTS19QTk1JX0hSWF9SRVNFUlZFRDoKKwkJCQorCQkJLyoKKwkJCSAqIHRoZSBmb2xsb3dpbmcgY291bnRlcnMgYXJlbid0IGJlIGhhbmRsZWQgKGlkID4gNjMpCisJCQkgKi8KKwkJCWNhc2UgU0tfUE5NSV9IVFhfU1lOQzoKKwkJCWNhc2UgU0tfUE5NSV9IVFhfU1lOQ19PQ1RFVDoKKwkJCQlicmVhazsKKworCQkJY2FzZSBTS19QTk1JX0hSWF9MT05HRlJBTUVTOgorCQkJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCQkJQ291bnRlckhpZ2hbQ291bnRlckluZGV4XSArKzsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJCUNvdW50ZXJIaWdoW0NvdW50ZXJJbmRleF0gKys7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1NFTl9XQVJfTE9XOgorI2lmZGVmIERFQlVHCisJCWlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCA+PSAodW5zaWduZWQgaW50KXBBQy0+STJjLk1heFNlbnMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1NFTl9XQVJfTE9XIHBhcmFtZXRlciB3cm9uZywgU2Vuc29ySW5kZXg9JWRcbiIsCisJCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUKKwkJICogYW4gZXZlbnQgZm9yIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlCisJCSAqIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVNlbnNvclRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1NFTl9XQVJfTE9XLAorCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1NFTl9XQVJfVVBQOgorI2lmZGVmIERFQlVHCisJCWlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCA+PSAodW5zaWduZWQgaW50KXBBQy0+STJjLk1heFNlbnMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1NFTl9XQVJfVVBQIHBhcmFtZXRlciB3cm9uZywgU2Vuc29ySW5kZXg9JWRcbiIsCisJCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUKKwkJICogYW4gZXZlbnQgZm9yIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlCisJCSAqIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVNlbnNvclRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1NFTl9XQVJfVVBQLAorCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1NFTl9FUlJfTE9XOgorI2lmZGVmIERFQlVHCisJCWlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCA+PSAodW5zaWduZWQgaW50KXBBQy0+STJjLk1heFNlbnMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1NFTl9FUlJfTE9XIHBhcmFtZXRlciB3cm9uZywgU2Vuc29ySW5kZXg9JWRcbiIsCisJCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUKKwkJICogYW4gZXZlbnQgZm9yIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlCisJCSAqIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVNlbnNvclRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1NFTl9FUlJfTE9XLAorCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJYnJlYWs7CisJCisJY2FzZSBTS19QTk1JX0VWVF9TRU5fRVJSX1VQUDoKKyNpZmRlZiBERUJVRworCQlpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQgPj0gKHVuc2lnbmVkIGludClwQUMtPkkyYy5NYXhTZW5zKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9TRU5fRVJSX1VQUCBwYXJhbWV0ZXIgd3JvbmcsIFNlbnNvckluZGV4PSVkXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlCisJCSAqIGFuIGV2ZW50IGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorCQkgKiBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVTZW5zb3JUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9TRU5fRVJSX1VQUCwKKwkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9DSEdfRVNUX1RJTUVSOgorCQkvKgorCQkgKiBDYWxjdWxhdGUgcG9ydCBzd2l0Y2ggYXZlcmFnZSBvbiBhIHBlciBob3VyIGJhc2lzCisJCSAqICAgVGltZSBpbnRlcnZhbCBmb3IgY2hlY2sgICAgICAgOiAyODEyNSBtcworCQkgKiAgIE51bWJlciBvZiB2YWx1ZXMgZm9yIGF2ZXJhZ2UgIDogOAorCQkgKgorCQkgKiBCZSBjYXJlZnVsIGluIGNoYW5naW5nIHRoZXNlIHZhbHVlcywgb24gY2hhbmdlIGNoZWNrCisJCSAqICAgLSB0eXBlZGVmIG9mIFNLX1BOTUlfRVNUSU1BVEUgKFNpemUgb2YgRXN0VmFsdWUKKwkJICogICAgIGFycmF5IG9uZSBsZXNzIHRoYW4gdmFsdWUgbnVtYmVyKQorCQkgKiAgIC0gVGltZXIgaW5pdGlhbGl6YXRpb24gU2tUaW1lclN0YXJ0KCkgaW4gU2tQbm1pSW5pdAorCQkgKiAgIC0gRGVsdGEgdmFsdWUgYmVsb3cgbXVzdCBiZSBtdWx0aXBsaWNhdGVkIHdpdGgKKwkJICogICAgIHBvd2VyIG9mIDIKKwkJICoKKwkJICovCisJCXBFc3QgPSAmcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZTsKKwkJQ291bnRlckluZGV4ID0gcEVzdC0+RXN0VmFsdWVJbmRleCArIDE7CisJCWlmIChDb3VudGVySW5kZXggPT0gNykgeworCisJCQlDb3VudGVySW5kZXggPSAwOworCQl9CisJCXBFc3QtPkVzdFZhbHVlSW5kZXggPSBDb3VudGVySW5kZXg7CisKKwkJTmV3ZXN0VmFsdWUgPSBwQUMtPlBubWkuUmxtdENoYW5nZUN0czsKKwkJT2xkZXN0VmFsdWUgPSBwRXN0LT5Fc3RWYWx1ZVtDb3VudGVySW5kZXhdOworCQlwRXN0LT5Fc3RWYWx1ZVtDb3VudGVySW5kZXhdID0gTmV3ZXN0VmFsdWU7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIGF2ZXJhZ2UuIERlbHRhIHN0b3JlcyB0aGUgbnVtYmVyIG9mCisJCSAqIHBvcnQgc3dpdGNoZXMgcGVyIDI4MTI1ICogOCA9IDIyNTAwMCBtcworCQkgKi8KKwkJaWYgKE5ld2VzdFZhbHVlID49IE9sZGVzdFZhbHVlKSB7CisKKwkJCURlbHRhID0gTmV3ZXN0VmFsdWUgLSBPbGRlc3RWYWx1ZTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIE92ZXJmbG93IHNpdHVhdGlvbiAqLworCQkJRGVsdGEgPSAoU0tfVTY0KSgwIC0gT2xkZXN0VmFsdWUpICsgTmV3ZXN0VmFsdWU7CisJCX0KKworCQkvKgorCQkgKiBFeHRyYXBvbGF0ZSBkZWx0YSB0byBwb3J0IHN3aXRjaGVzIHBlciBob3VyLgorCQkgKiAgICAgRXN0aW1hdGUgPSBEZWx0YSAqICgzNjAwMDAwIC8gMjI1MDAwKQorCQkgKiAgICAgICAgICAgICAgPSBEZWx0YSAqIDE2CisJCSAqICAgICAgICAgICAgICA9IERlbHRhIDw8IDQKKwkJICovCisJCXBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0aW1hdGUgPSBEZWx0YSA8PCA0OworCisJCS8qCisJCSAqIENoZWNrIGlmIHRocmVzaG9sZCBpcyBleGNlZWRlZC4gSWYgdGhlIHRocmVzaG9sZCBpcworCQkgKiBwZXJtYW5lbnRseSBleGNlZWRlZCBldmVyeSAyODEyNSBtcyBhbiBldmVudCB3aWxsIGJlCisJCSAqIGdlbmVyYXRlZCB0byByZW1pbmQgdGhlIHVzZXIgb2YgdGhpcyBjb25kaXRpb24uCisJCSAqLworCQlpZiAoKHBBQy0+UG5taS5SbG10Q2hhbmdlVGhyZXNob2xkICE9IDApICYmCisJCQkocEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RpbWF0ZSA+PQorCQkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaHJlc2hvbGQpKSB7CisKKwkJCVF1ZXVlU2ltcGxlVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfUkxNVF9DSEFOR0VfVEhSRVMpOworCQkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCX0KKworCQlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RUaW1lciwKKwkJCTI4MTI1MDAwLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVIsCisJCQlFdmVudFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX0NMRUFSX0NPVU5URVI6CisJCS8qCisJCSAqICBQYXJhbS5QYXJhMzJbMF0gY29udGFpbnMgdGhlIE5ldEluZGV4ICgwIC4uMSkuCisJCSAqICBQYXJhbS5QYXJhMzJbMV0gaXMgcmVzZXJ2ZWQsIGNvbnRhaW5zIC0xLgorCQkgKi8KKwkJTmV0SW5kZXggPSAoU0tfVTMyKVBhcmFtLlBhcmEzMlswXTsKKworI2lmZGVmIERFQlVHCisJCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfQ0xFQVJfQ09VTlRFUiBwYXJhbWV0ZXIgd3JvbmcsIE5ldEluZGV4PSVkXG4iLAorCQkJCU5ldEluZGV4KSk7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFNldCBhbGwgY291bnRlcnMgYW5kIHRpbWVzdGFtcHMgdG8gemVyby4KKwkJICogVGhlIGFjY29yZGluZyBOZXRJbmRleCBpcyByZXF1aXJlZCBhcyBhCisJCSAqIHBhcmFtZXRlciBvZiB0aGUgZXZlbnQuCisJCSAqLworCQlSZXNldENvdW50ZXIocEFDLCBJb0MsIE5ldEluZGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQ6CisJCS8qCisJCSAqIFRvIGdyYW50IGNvbnRpbnVvdXMgY291bnRlciB2YWx1ZXMgc3RvcmUgdGhlIGN1cnJlbnQKKwkJICogWE1BQyBzdGF0aXN0aWMgdmFsdWVzIHRvIHRoZSBlbnRyaWVzIDEuLm4gb2YgdGhlCisJCSAqIENvdW50ZXJPZmZzZXQgYXJyYXkuIFhNQUMgRXJyYXRhICMyCisJCSAqLworI2lmZGVmIERFQlVHCisJCWlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCBwYXJhbWV0ZXIgd3JvbmcsIFBoeXNQb3J0SW5kZXg9JWRcbiIsCisJCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZgorCQlQaHlzUG9ydEluZGV4ID0gKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQ7CisKKwkJLyoKKwkJICogVXBkYXRlIFhNQUMgc3RhdGlzdGljIHRvIGdldCBmcmVzaCB2YWx1ZXMKKwkJICovCisJCVJldCA9IE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSk7CisJCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gcmV0dXJuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCS8qCisJCSAqIEluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzCisJCSAqIGFscmVhZHkgZG9uZQorCQkgKi8KKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJCWZvciAoQ291bnRlckluZGV4ID0gMDsgQ291bnRlckluZGV4IDwgU0tfUE5NSV9NQVhfSURYOworCQkJQ291bnRlckluZGV4ICsrKSB7CisKKwkJCWlmICghU3RhdEFkZHJbQ291bnRlckluZGV4XVtNYWNUeXBlXS5HZXRPZmZzZXQpIHsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5Db3VudGVyT2Zmc2V0W0NvdW50ZXJJbmRleF0gPQorCQkJCUdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBDb3VudGVySW5kZXgpOworCQkJCisJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5Db3VudGVySGlnaFtDb3VudGVySW5kZXhdID0gMDsKKwkJfQorCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUDoKKwkJUGh5c1BvcnRJbmRleCA9ICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdOworI2lmZGVmIERFQlVHCisJCWlmIChQaHlzUG9ydEluZGV4ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX1BPUlRfVVAgcGFyYW1ldGVyIgorICAgICAgICAgICAgICAgICAiIHdyb25nLCBQaHlzUG9ydEluZGV4PSVkXG4iLCBQaHlzUG9ydEluZGV4KSk7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yCisJCSAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVJsbXRQb3J0VHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX1VQLCBQaHlzUG9ydEluZGV4KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisKKwkJLyogQnVnZml4IGZvciBYTUFDIGVycmF0YSAoIzEwNjIwKSovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBBZGQgaW5jcmVtZW50YWwgZGlmZmVyZW5jZSB0byBvZmZzZXQgKCMxMDYyMCkqLworCQkJKHZvaWQpcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJWE1fUlhFX1NIVF9FUlIsICZWYWwzMik7CisJCQkKKwkJCVZhbHVlID0gKCgoU0tfVTY0KXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCSBDb3VudGVySGlnaFtTS19QTk1JX0hSWF9TSE9SVFNdIDw8IDMyKSB8IChTS19VNjQpVmFsMzIpOworCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQ291bnRlck9mZnNldFtTS19QTk1JX0hSWF9TSE9SVFNdICs9CisJCQkJVmFsdWUgLSBwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5SeFNob3J0WmVyb01hcms7CisJCX0KKwkJCisJCS8qIFRlbGwgVmN0U3RhdHVzKCkgdGhhdCBhIGxpbmsgd2FzIHVwIG1lYW53aGlsZS4gKi8KKwkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSB8PSBTS19QTk1JX1ZDVF9MSU5LOwkJCisJCWJyZWFrOworCisgICAgY2FzZSBTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTjoKKwkJUGh5c1BvcnRJbmRleCA9ICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdOworCisjaWZkZWYgREVCVUcKKwkJaWYgKFBoeXNQb3J0SW5kZXggPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9ET1dOIHBhcmFtZXRlciIKKyAgICAgICAgICAgICAgICAgIiB3cm9uZywgUGh5c1BvcnRJbmRleD0lZFxuIiwgUGh5c1BvcnRJbmRleCkpOworCisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IGZvcgorCQkgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVSbG10UG9ydFRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1JMTVRfUE9SVF9ET1dOLCBQaHlzUG9ydEluZGV4KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisKKwkJLyogQnVnZml4ICMxMDYyMCAtIGdldCB6ZXJvIGxldmVsIGZvciBpbmNyZW1lbnRhbCBkaWZmZXJlbmNlICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisKKwkJCSh2b2lkKXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCVhNX1JYRV9TSFRfRVJSLCAmVmFsMzIpOworCQkJCisJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5SeFNob3J0WmVyb01hcmsgPQorCQkJCSgoKFNLX1U2NClwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkgQ291bnRlckhpZ2hbU0tfUE5NSV9IUlhfU0hPUlRTXSA8PCAzMikgfCAoU0tfVTY0KVZhbDMyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTjoKKwkJUGh5c1BvcnRJbmRleCA9ICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdOworCQlOZXRJbmRleCA9IChTS19VMzIpUGFyYW0uUGFyYTMyWzFdOworCisjaWZkZWYgREVCVUcKKwkJaWYgKFBoeXNQb3J0SW5kZXggPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04gcGFyYW1ldGVyIHRvbyBoaWdoLCBQaHlzUG9ydD0lZFxuIiwKKwkJCQlQaHlzUG9ydEluZGV4KSk7CisJCX0KKworCQlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04gcGFyYW1ldGVyIHRvbyBoaWdoLCBOZXRJbmRleD0lZFxuIiwKKwkJCQlOZXRJbmRleCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBGb3Igbm93LCBpZ25vcmUgZXZlbnQgaWYgTmV0SW5kZXggIT0gMC4KKwkJICovCisJCWlmIChQYXJhbS5QYXJhMzJbMV0gIT0gMCkgeworCisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyoKKwkJICogTm90aGluZyB0byBkbyBpZiBwb3J0IGlzIGFscmVhZHkgaW5hY3RpdmUKKwkJICovCisJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVycyB0byBjYWxjdWxhdGUgbmV3IG9mZnNldCBmb3IgdGhlIHZpcnR1YWwKKwkJICogcG9ydCBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMgYWxyZWFkeQorCQkgKiBkb25lLgorCQkgKi8KKwkJaWYgKE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSkgIT0KKwkJCVNLX1BOTUlfRVJSX09LKSB7CisKKwkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIHJldHVybiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIG5ldyBjb3VudGVyIG9mZnNldCBmb3IgdmlydHVhbCBwb3J0IHRvIGdyYW50IGNvbnRpbm91cworCQkgKiBjb3VudGluZyBvbiBwb3J0IHN3aXRjaGVzLiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKwkJICogYWN0aXZlIHBvcnRzLiBUaGUgcG9ydCBkb3duIGV2ZW50IGluZGljYXRlcyB0aGF0IGEgcG9ydCBpcyByZW1vdmVkCisJCSAqIGZyb20gdGhlIHZpcnR1YWwgcG9ydC4gVGhlcmVmb3JlIGFkZCB0aGUgY291bnRlciB2YWx1ZSBvZiB0aGUgcmVtb3ZlZAorCQkgKiBwb3J0IHRvIHRoZSBDb3VudGVyT2Zmc2V0IGZvciB0aGUgdmlydHVhbCBwb3J0IHRvIGdyYW50IHRoZSBzYW1lCisJCSAqIGNvdW50ZXIgdmFsdWUuCisJCSAqLworCQlmb3IgKENvdW50ZXJJbmRleCA9IDA7IENvdW50ZXJJbmRleCA8IFNLX1BOTUlfTUFYX0lEWDsKKwkJCUNvdW50ZXJJbmRleCArKykgeworCisJCQlpZiAoIVN0YXRBZGRyW0NvdW50ZXJJbmRleF1bTWFjVHlwZV0uR2V0T2Zmc2V0KSB7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJVmFsdWUgPSBHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgQ291bnRlckluZGV4KTsKKworCQkJcEFDLT5Qbm1pLlZpcnR1YWxDb3VudGVyT2Zmc2V0W0NvdW50ZXJJbmRleF0gKz0gVmFsdWU7CisJCX0KKworCQkvKgorCQkgKiBTZXQgcG9ydCB0byBpbmFjdGl2ZQorCQkgKi8KKwkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZyA9IFNLX0ZBTFNFOworCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQOgorCQlQaHlzUG9ydEluZGV4ID0gKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF07CisJCU5ldEluZGV4ID0gKFNLX1UzMilQYXJhbS5QYXJhMzJbMV07CisKKyNpZmRlZiBERUJVRworCQlpZiAoUGh5c1BvcnRJbmRleCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAgcGFyYW1ldGVyIHRvbyBoaWdoLCBQaHlzUG9ydD0lZFxuIiwKKwkJCQlQaHlzUG9ydEluZGV4KSk7CisJCX0KKworCQlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQIHBhcmFtZXRlciB0b28gaGlnaCwgTmV0SW5kZXg9JWRcbiIsCisJCQkJTmV0SW5kZXgpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogRm9yIG5vdywgaWdub3JlIGV2ZW50IGlmIE5ldEluZGV4ICE9IDAuCisJCSAqLworCQlpZiAoUGFyYW0uUGFyYTMyWzFdICE9IDApIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdGhpbmcgdG8gZG8gaWYgcG9ydCBpcyBhbHJlYWR5IGFjdGl2ZQorCQkgKi8KKwkJaWYgKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qCisJCSAqIFN0YXRpc3RpYyBtYWludGVuYW5jZQorCQkgKi8KKwkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VDdHMgKys7CisJCXBBQy0+UG5taS5SbG10Q2hhbmdlVGltZSA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKFNrT3NHZXRUaW1lKHBBQykpOworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yCisJCSAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVJsbXROZXdNYWNUcmFwKHBBQywgUGh5c1BvcnRJbmRleCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCisJCS8qCisJCSAqIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcnMgdG8gY2FsY3VsYXRlIG5ldyBvZmZzZXQgZm9yIHRoZSB2aXJ0dWFsCisJCSAqIHBvcnQgYW5kIGluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzCisJCSAqIGFscmVhZHkgZG9uZS4KKwkJICovCisJCWlmIChNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpICE9CisJCQlTS19QTk1JX0VSUl9PSykgeworCisJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiByZXR1cm4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBuZXcgY291bnRlciBvZmZzZXQgZm9yIHZpcnR1YWwgcG9ydCB0byBncmFudCBjb250aW5vdXMKKwkJICogY291bnRpbmcgb24gcG9ydCBzd2l0Y2hlcy4gQSBuZXcgcG9ydCBpcyBhZGRlZCB0byB0aGUgdmlydHVhbCBwb3J0LgorCQkgKiBUaGVyZWZvcmUgc3Vic3RyYWN0IHRoZSBjb3VudGVyIHZhbHVlIG9mIHRoZSBuZXcgcG9ydCBmcm9tIHRoZQorCQkgKiBDb3VudGVyT2Zmc2V0IGZvciB0aGUgdmlydHVhbCBwb3J0IHRvIGdyYW50IHRoZSBzYW1lIHZhbHVlLgorCQkgKi8KKwkJZm9yIChDb3VudGVySW5kZXggPSAwOyBDb3VudGVySW5kZXggPCBTS19QTk1JX01BWF9JRFg7CisJCQlDb3VudGVySW5kZXggKyspIHsKKworCQkJaWYgKCFTdGF0QWRkcltDb3VudGVySW5kZXhdW01hY1R5cGVdLkdldE9mZnNldCkgeworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVZhbHVlID0gR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIENvdW50ZXJJbmRleCk7CisKKwkJCXBBQy0+UG5taS5WaXJ0dWFsQ291bnRlck9mZnNldFtDb3VudGVySW5kZXhdIC09IFZhbHVlOworCQl9CisKKwkJLyogU2V0IHBvcnQgdG8gYWN0aXZlICovCisJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcgPSBTS19UUlVFOworCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1JMTVRfU0VHTUVOVEFUSU9OOgorCQkvKgorCQkgKiBQYXJhLlBhcmEzMlswXSBjb250YWlucyB0aGUgTmV0SW5kZXguCisJCSAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yCisJCSAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVNpbXBsZVRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1JMTVRfU0VHTUVOVEFUSU9OKTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCWJyZWFrOworCisgICAgY2FzZSBTS19QTk1JX0VWVF9STE1UX1NFVF9ORVRTOgorCQkvKgorCQkgKiAgUGFyYW0uUGFyYTMyWzBdIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgTmV0cy4KKwkJICogIFBhcmFtLlBhcmEzMlsxXSBpcyByZXNlcnZlZCwgY29udGFpbnMgLTEuCisJCSAqLworCSAgICAvKgorICAgIAkgKiBDaGVjayBudW1iZXIgb2YgbmV0cworCQkgKi8KKwkJTWF4TmV0TnVtYmVyID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCQlpZiAoKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdIDwgMSkKKwkJCXx8ICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXSA+IE1heE5ldE51bWJlcikpIHsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQpOworCQl9CisKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdID09IDEpIHsgLyogc2luZ2xlIG5ldCBtb2RlICovCisgICAgICAgIAlwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPSBTS19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogZHVhbCBuZXQgbW9kZSAqLworICAgICAgICAJcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID0gU0tfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0tfUE5NSV9FVlRfVkNUX1JFU0VUOgorCQlQaHlzUG9ydEluZGV4ID0gUGFyYW0uUGFyYTMyWzBdOworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XTsKKwkJcFZjdEJhY2t1cERhdGEgPSAmcEFDLT5Qbm1pLlZjdEJhY2t1cFtQaHlzUG9ydEluZGV4XTsKKwkJCisJCWlmIChwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfUEVORElORykgeworCQkJUmV0Q29kZSA9IFNrR21DYWJsZURpYWdTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFNLX0ZBTFNFKTsKKwkJCWlmIChSZXRDb2RlID09IDIpIHsKKwkJCQkvKgorCQkJCSAqIFZDVCB0ZXN0IGlzIHN0aWxsIHJ1bm5pbmcuCisJCQkJICogU3RhcnQgVkNUIHRpbWVyIGNvdW50ZXIgYWdhaW4uCisJCQkJICovCisJCQkJU0tfTUVNU0VUKChjaGFyICopICZQYXJhbSwgMCwgc2l6ZW9mKFBhcmFtKSk7CisJCQkJUGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQlQYXJhbS5QYXJhMzJbMV0gPSAtMTsKKwkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsCisJCQkJCSZwQUMtPlBubWkuVmN0VGltZW91dFtQaHlzUG9ydEluZGV4XS5WY3RUaW1lciwKKwkJCQk0MDAwMDAwLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1ZDVF9SRVNFVCwgUGFyYW0pOworCQkJCWJyZWFrOworCQkJfQorCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmPSB+U0tfUE5NSV9WQ1RfUEVORElORzsKKwkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gfD0KKwkJCQkoU0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBIHwgU0tfUE5NSV9WQ1RfVEVTVF9ET05FKTsKKwkJCQorCQkJLyogQ29weSByZXN1bHRzIGZvciBsYXRlciB1c2UgdG8gUE5NSSBzdHJ1Y3QuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgeworCQkJCWlmIChwUHJ0LT5QTWRpUGFpclN0c1tpXSA9PSBTS19QTk1JX1ZDVF9OT1JNQUxfQ0FCTEUpIHsKKwkJCQkJaWYgKChwUHJ0LT5QTWRpUGFpckxlbltpXSA+IDM1KSAmJgorCQkJCQkJKHBQcnQtPlBNZGlQYWlyTGVuW2ldIDwgMHhmZikpIHsKKwkJCQkJCXBQcnQtPlBNZGlQYWlyU3RzW2ldID0gU0tfUE5NSV9WQ1RfSU1QRURBTkNFX01JU01BVENIOworCQkJCQl9CisJCQkJfQorCQkJCWlmICgocFBydC0+UE1kaVBhaXJMZW5baV0gPiAzNSkgJiYKKwkJCQkJKHBQcnQtPlBNZGlQYWlyTGVuW2ldICE9IDB4ZmYpKSB7CisJCQkJCUNhYmxlTGVuZ3RoID0gMTAwMCAqCisJCQkJCQkoKCgxNzUgKiBwUHJ0LT5QTWRpUGFpckxlbltpXSkgLyAyMTApIC0gMjgpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJQ2FibGVMZW5ndGggPSAwOworCQkJCX0KKwkJCQlwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJMZW5baV0gPSBDYWJsZUxlbmd0aDsKKwkJCQlwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJTdHNbaV0gPSBwUHJ0LT5QTWRpUGFpclN0c1tpXTsKKwkJCX0KKwkJCQorCQkJUGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCVBhcmFtLlBhcmEzMlsxXSA9IC0xOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX1JFU0VULCBQYXJhbSk7CisJCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIElvQyk7CisJCX0KKwkJCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gcmV0dXJuIik7CisJcmV0dXJuICgwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJpdmF0ZSBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUG5taVZhciAtIEdldHMsIHByZXNldHMsIGFuZCBzZXRzIHNpbmdsZSBPSURzCisgKgorICogRGVzY3JpcHRpb246CisgKglMb29rcyB1cCB0aGUgcmVxdWVzdGVkIE9JRCwgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlcgorICoJZnVuY3Rpb24sIGFuZCBwYXNzZXMgdGhlIHBhcmFtZXRlcnMgd2l0aCB0aGUgZ2V0LCBwcmVzZXQsIG9yCisgKglzZXQgY29tbWFuZC4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBTa0dlUG5taUdldFZhciwKKyAqCVNrR2VQbm1pUHJlU2V0VmFyLCBvciBTa0dlUG5taVNldFZhci4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfWFhYLiBGb3IgZGV0YWlscyBoYXZlIGEgbG9vayBhdCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCisgKgljYWxsaW5nIGZ1bmN0aW9ucy4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fTkVUICBUaGUgcmVxdWVzdGVkIE5ldEluZGV4IGRvZXNuJ3QgZXhpc3QKKyAqLworUE5NSV9TVEFUSUMgaW50IFBubWlWYXIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogVG90YWwgbGVuZ3RoIG9mIHBCdWYgbWFuYWdlbWVudCBkYXRhICAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBzZXQgb3IgLTEgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJVGFibGVJbmRleDsKKwlpbnQJCVJldDsKKworCisJaWYgKChUYWJsZUluZGV4ID0gTG9va3VwSWQoSWQpKSA9PSAodW5zaWduZWQgaW50KSgtMSkpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQpOworCX0KKwkKKyAgICAvKiBDaGVjayBOZXRJbmRleCAqLworCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fTkVUKTsKKwl9CisKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlWYXI6IE9uIGNhbGwiKTsKKworCVJldCA9IElkVGFibGVbVGFibGVJbmRleF0uRnVuYyhwQUMsIElvQywgQWN0aW9uLCBJZCwgcEJ1ZiwgcExlbiwKKwkJSW5zdGFuY2UsIFRhYmxlSW5kZXgsIE5ldEluZGV4KTsKKworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVZhcjogT24gcmV0dXJuIik7CisKKwlyZXR1cm4gKFJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBubWlTdHJ1Y3QgLSBQcmVzZXRzIGFuZCBTZXRzIGRhdGEgaW4gc3RydWN0dXJlIFNLX1BOTUlfU1RSVUNUX0RBVEEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4KKyAqCVNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZSBtaW5pbXVtIHNpemUgb2YKKyAqCVNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLiBUaGUgc3ViLWZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgSWRUYWJsZSwKKyAqCWNoZWNrcyB3aGljaCBPSURzIGFyZSBhYmxlIHRvIHNldCwgYW5kIGNhbGxzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIG9mCisgKgl0aGUgT0lEIHRvIHBlcmZvcm0gdGhlIHNldC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2lsbAorICoJYWxzbyBiZSBzdG9yZWQgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlCisgKgltaW5pbXVtIHNpemUgb2YgU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCWJ5IFNrR2VQbm1pUHJlU2V0U3RydWN0IGFuZCBTa0dlUG5taVNldFN0cnVjdC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfWFhYLiBUaGUgY29kZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbnMuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX05FVCAgVGhlIHJlcXVlc3RlZCBOZXRJbmRleCBkb2Vzbid0IGV4aXN0CisgKi8KK1BOTUlfU1RBVElDIGludCBQbm1pU3RydWN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCAgQWN0aW9uLAkvKiBQUkVTRVQvU0VUIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBMZW5ndGggb2YgcEJ1ZiBtYW5hZ2VtZW50IGRhdGEgYnVmZmVyICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CQlSZXQ7CisJdW5zaWduZWQgaW50CVRhYmxlSW5kZXg7CisJdW5zaWduZWQgaW50CURzdE9mZnNldDsKKwl1bnNpZ25lZCBpbnQJTGVuOworCXVuc2lnbmVkIGludAlJbnN0YW5jZU5vOworCXVuc2lnbmVkIGludAlJbnN0YW5jZUNudDsKKwlTS19VMzIJCUluc3RhbmNlOworCVNLX1UzMgkJSWQ7CisKKworCS8qIENoZWNrIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUgcmlnaHQgc2l6ZSAqLworCWlmICgqcExlbiA8IFNLX1BOTUlfU1RSVUNUX1NJWkUpIHsKKworCQkvKiBDaGVjayBpZiB3ZSBjYW4gcmV0dXJuIHRoZSBlcnJvciB3aXRoaW4gdGhlIGJ1ZmZlciAqLworCQlpZiAoKnBMZW4gPj0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUpIHsKKworCQkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBTS19QTk1JX0VSUl9UT09fU0hPUlQsCisJCQkJKFNLX1UzMikoLTEpKTsKKwkJfQorCisJCSpwTGVuID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCX0KKwkKKyAgICAvKiBDaGVjayBOZXRJbmRleCAqLworCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fTkVUKTsKKwl9CisJCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pU3RydWN0OiBPbiBjYWxsIik7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgdmFsdWVzIG9mIFJMTVQgYW5kIFNJUlEgYW5kIGluY3JlbWVudCBzZW1hcGhvcmVzIHRvCisJICogaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4KKwkgKi8KKwlpZiAoKFJldCA9IFJsbXRVcGRhdGUocEFDLCBJb0MsIE5ldEluZGV4KSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCWlmICgoUmV0ID0gU2lycVVwZGF0ZShwQUMsIElvQykpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnICsrOworCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgKys7CisKKwkvKiBQcmVzZXQvU2V0IHZhbHVlcyAqLworCWZvciAoVGFibGVJbmRleCA9IDA7IFRhYmxlSW5kZXggPCBJRF9UQUJMRV9TSVpFOyBUYWJsZUluZGV4ICsrKSB7CisKKwkJaWYgKChJZFRhYmxlW1RhYmxlSW5kZXhdLkFjY2VzcyAhPSBTS19QTk1JX1JXKSAmJgorCQkJKElkVGFibGVbVGFibGVJbmRleF0uQWNjZXNzICE9IFNLX1BOTUlfV08pKSB7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJSW5zdGFuY2VObyA9IElkVGFibGVbVGFibGVJbmRleF0uSW5zdGFuY2VObzsKKwkJSWQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLklkOworCisJCWZvciAoSW5zdGFuY2VDbnQgPSAxOyBJbnN0YW5jZUNudCA8PSBJbnN0YW5jZU5vOworCQkJSW5zdGFuY2VDbnQgKyspIHsKKworCQkJRHN0T2Zmc2V0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5PZmZzZXQgKworCQkJCShJbnN0YW5jZUNudCAtIDEpICoKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLlN0cnVjdFNpemU7CisKKwkJCS8qCisJCQkgKiBCZWNhdXNlIFZQRCBtdWx0aXBsZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlCisJCQkgKiBub3Qgc2V0YWJsZSB3ZSBkbyBub3QgbmVlZCB0byBldmFsdWF0ZSBWUEQKKwkJCSAqIGluc3RhbmNlcy4gSGF2ZSBhIGxvb2sgdG8gVlBEIGluc3RhbmNlCisJCQkgKiBjYWxjdWxhdGlvbiBpbiBTa1BubWlHZXRTdHJ1Y3QoKS4KKwkJCSAqLworCQkJSW5zdGFuY2UgPSAoU0tfVTMyKUluc3RhbmNlQ250OworCisJCQkvKgorCQkJICogRXZhbHVhdGUgbmVlZGVkIGJ1ZmZlciBsZW5ndGgKKwkJCSAqLworCQkJTGVuID0gMDsKKwkJCVJldCA9IElkVGFibGVbVGFibGVJbmRleF0uRnVuYyhwQUMsIElvQywKKwkJCQlTS19QTk1JX0dFVCwgSWRUYWJsZVtUYWJsZUluZGV4XS5JZCwKKwkJCQlOVUxMLCAmTGVuLCBJbnN0YW5jZSwgVGFibGVJbmRleCwgTmV0SW5kZXgpOworCisJCQlpZiAoUmV0ID09IFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCkgeworCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX1RPT19TSE9SVCkgeworCisJCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pU3RydWN0OiBPbiByZXR1cm4iKTsKKwkJCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsCisJCQkJCVNLX1BOTUlfRVJSX0dFTkVSQUwsIERzdE9mZnNldCk7CisJCQkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJaWYgKElkID09IE9JRF9TS0dFX1ZQRF9BQ1RJT04pIHsKKworCQkJCXN3aXRjaCAoKihwQnVmICsgRHN0T2Zmc2V0KSkgeworCisJCQkJY2FzZSBTS19QTk1JX1ZQRF9DUkVBVEU6CisJCQkJCUxlbiA9IDMgKyAqKHBCdWYgKyBEc3RPZmZzZXQgKyAzKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNLX1BOTUlfVlBEX0RFTEVURToKKwkJCQkJTGVuID0gMzsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlMZW4gPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIENhbGwgdGhlIE9JRCBoYW5kbGVyIGZ1bmN0aW9uICovCisJCQlSZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkZ1bmMocEFDLCBJb0MsIEFjdGlvbiwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLklkLCBwQnVmICsgRHN0T2Zmc2V0LAorCQkJCSZMZW4sIEluc3RhbmNlLCBUYWJsZUluZGV4LCBOZXRJbmRleCk7CisKKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCQkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCQkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVN0cnVjdDogT24gcmV0dXJuIik7CisJCQkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBTS19QTk1JX0VSUl9CQURfVkFMVUUsCisJCQkJCURzdE9mZnNldCk7CisJCQkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCX0KKwl9CisKKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlTdHJ1Y3Q6IE9uIHJldHVybiIpOworCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgU0tfUE5NSV9FUlJfT0ssIChTS19VMzIpKC0xKSk7CisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvb2t1cElkIC0gTG9va3VwIGFuIE9JRCBpbiB0aGUgSWRUYWJsZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJU2NhbnMgdGhlIElkVGFibGUgdG8gZmluZCB0aGUgdGFibGUgZW50cnkgb2YgYW4gT0lELgorICoKKyAqIFJldHVybnM6CisgKglUaGUgdGFibGUgaW5kZXggb3IgLTEgaWYgbm90IGZvdW5kLgorICovCitQTk1JX1NUQVRJQyBpbnQgTG9va3VwSWQoCitTS19VMzIgSWQpCQkvKiBPYmplY3QgaWRlbnRpZmllciB0byBiZSBzZWFyY2hlZCAqLworeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElEX1RBQkxFX1NJWkU7IGkrKykgeworCisJCWlmIChJZFRhYmxlW2ldLklkID09IElkKSB7CisKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJcmV0dXJuICgtMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9pZFN0cnVjdCAtIEhhbmRsZXIgb2YgT0lEX1NLR0VfQUxMX0RBVEEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgT0lEIHBlcmZvcm1zIGEgR2V0L1ByZXNldC9TZXRTdHJ1Y3QgY2FsbCBhbmQgcmV0dXJucyBhbGwgZGF0YQorICoJaW4gYSBTS19QTk1JX1NUUlVDVF9EQVRBIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IE9pZFN0cnVjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWlmIChJZCAhPSBPSURfU0tHRV9BTExfREFUQSkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDMsCisJCQlTS19QTk1JX0VSUjAwM01TRyk7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIFdlIG9ubHkgaGFuZGxlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMKKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwlzd2l0Y2ggKEFjdGlvbikgeworCisJY2FzZSBTS19QTk1JX0dFVDoKKwkJcmV0dXJuIChTa1BubWlHZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KSk7CisKKwljYXNlIFNLX1BOTUlfUFJFU0VUOgorCQlyZXR1cm4gKFNrUG5taVByZVNldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpKTsKKworCWNhc2UgU0tfUE5NSV9TRVQ6CisJCXJldHVybiAoU2tQbm1pU2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCkpOworCX0KKworCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDQsIFNLX1BOTUlfRVJSMDA0TVNHKTsKKworCSpwTGVuID0gMDsKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQZXJmb3JtIC0gT0lEIGhhbmRsZXIgb2YgT0lEX1NLR0VfQUNUSU9OCisgKgorICogRGVzY3JpcHRpb246CisgKglOb25lLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgUGVyZm9ybSgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAlSZXQ7CisJU0tfVTMyCUFjdGlvbk9wOworCisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBXZSBvbmx5IGhhbmRsZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJfQorCisJLyogQ2hlY2sgaWYgYSBnZXQgc2hvdWxkIGJlIHBlcmZvcm1lZCAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQkvKiBBIGdldCBpcyBlYXN5LiBXZSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlICovCisJCUFjdGlvbk9wID0gKFNLX1UzMilTS19QTk1JX0FDVF9JRExFOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBBY3Rpb25PcCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJLyogQ29udGludWUgd2l0aCBQUkVTRVQvU0VUIGFjdGlvbiAqLworCWlmICgqcExlbiA+IHNpemVvZihTS19VMzIpKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBjb21tYW5kIGlzIGEga25vd24gb25lICovCisJU0tfUE5NSV9SRUFEX1UzMihwQnVmLCBBY3Rpb25PcCk7CisJaWYgKCpwTGVuID4gc2l6ZW9mKFNLX1UzMikgfHwKKwkJKEFjdGlvbk9wICE9IFNLX1BOTUlfQUNUX0lETEUgJiYKKwkJQWN0aW9uT3AgIT0gU0tfUE5NSV9BQ1RfUkVTRVQgJiYKKwkJQWN0aW9uT3AgIT0gU0tfUE5NSV9BQ1RfU0VMRlRFU1QgJiYKKwkJQWN0aW9uT3AgIT0gU0tfUE5NSV9BQ1RfUkVTRVRDTlQpKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJfQorCisJLyogQSBwcmVzZXQgZW5kcyBoZXJlICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCXN3aXRjaCAoQWN0aW9uT3ApIHsKKworCWNhc2UgU0tfUE5NSV9BQ1RfSURMRToKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9BQ1RfUkVTRVQ6CisJCS8qCisJCSAqIFBlcmZvcm0gYSBkcml2ZXIgcmVzZXQgb3Igc29tZXRoaW5nIHRoYXQgY29tZXMgbmVhcgorCQkgKiB0byB0aGlzLgorCQkgKi8KKwkJUmV0ID0gU0tfRFJJVkVSX1JFU0VUKHBBQywgSW9DKTsKKwkJaWYgKFJldCAhPSAwKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDUsCisJCQkJU0tfUE5NSV9FUlIwMDVNU0cpOworCisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0FDVF9TRUxGVEVTVDoKKwkJLyoKKwkJICogUGVyZm9ybSBhIGRyaXZlciBzZWxmdGVzdCBvciBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzLgorCQkgKiBDdXJyZW50bHkgdGhpcyBmZWF0dXJlIGlzIG5vdCB1c2VkIGFuZCB3aWxsIHByb2JhYmx5CisJCSAqIGltcGxlbWVudGVkIGluIGFub3RoZXIgd2F5LgorCQkgKi8KKwkJUmV0ID0gU0tfRFJJVkVSX1NFTEZURVNUKHBBQywgSW9DKTsKKwkJcEFDLT5Qbm1pLlRlc3RSZXN1bHQgPSBSZXQ7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0FDVF9SRVNFVENOVDoKKwkJLyogU2V0IGFsbCBjb3VudGVycyBhbmQgdGltZXN0YW1wcyB0byB6ZXJvICovCisJCVJlc2V0Q291bnRlcihwQUMsIElvQywgTmV0SW5kZXgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDYsCisJCQlTS19QTk1JX0VSUjAwNk1TRyk7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjODAyM1N0YXQgLSBPSUQgaGFuZGxlciBvZiBPSURfR0VOX1hYWCBhbmQgT0lEXzgwMl8zX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmV0cmlldmVzIHRoZSBzdGF0aXN0aWMgdmFsdWVzIG9mIHRoZSB2aXJ0dWFsIHBvcnQgKGxvZ2ljYWwKKyAqCWluZGV4IDApLiBPbmx5IHNwZWNpYWwgT0lEcyBvZiBORElTIGFyZSBoYW5kbGVkIHdoaWNoIGNvbnNpc3QKKyAqCW9mIGEgMzIgYml0IGluc3RlYWQgb2YgYSA2NCBiaXQgdmFsdWUuIFRoZSBPSURzIGFyZSBwdWJsaWMKKyAqCWJlY2F1c2UgcGVyaGFwcyBzb21lIG90aGVyIHBsYXRmb3JtIGNhbiB1c2UgdGhlbSB0b28uCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBNYWM4MDIzU3RhdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsCS8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludCAgICAgUmV0OworCVNLX1U2NCAgU3RhdFZhbDsKKwlTS19VMzIgIFN0YXRWYWwzMjsKKwlTS19CT09MIElzNjRCaXRSZXEgPSBTS19GQUxTRTsKKworCS8qCisJICogT25seSB0aGUgYWN0aXZlIE1hYyBpcyByZXR1cm5lZAorCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCS8qCisJICogQ2hlY2sgYWN0aW9uIHR5cGUKKwkgKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyogQ2hlY2sgbGVuZ3RoICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1M6CisJY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfTUFDX0FERFIpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX01BQ19BRERSKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisjaWZuZGVmIFNLX05ESVNfNjRCSVRfQ1RSCisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKyNlbHNlIC8qIFNLX05ESVNfNjRCSVRfQ1RSICovCisKKwkJLyogZm9yIGNvbXBhdGliaWxpdHksIGF0IGxlYXN0IDMyYml0IGFyZSByZXF1aXJlZCBmb3IgT0lEICovCisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisJCQkvKgorCQkJKiBidXQgaW5kaWNhdGUgaGFuZGxpbmcgZm9yIDY0Yml0IHZhbHVlcywKKwkJCSogaWYgaW5zdWZmaWNpZW50IHNwYWNlIGlzIHByb3ZpZGVkCisJCQkqLworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisJCUlzNjRCaXRSZXEgPSAoKnBMZW4gPCBzaXplb2YoU0tfVTY0KSkgPyBTS19GQUxTRSA6IFNLX1RSVUU7CisjZW5kaWYgLyogU0tfTkRJU182NEJJVF9DVFIgKi8KKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgYWxsIHN0YXRpc3RpY3MsIGJlY2F1c2Ugd2UgcmV0cmlldmUgdmlydHVhbCBNQUMsIHdoaWNoCisJICogY29uc2lzdHMgb2YgbXVsdGlwbGUgcGh5c2ljYWwgc3RhdGlzdGljcyBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZQorCSAqIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuCisJICovCisJUmV0ID0gTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKTsKKwlpZiAoIFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChSZXQpOworCX0KKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkvKgorCSAqIEdldCB2YWx1ZSAoTUFDIEluZGV4IDAgaWRlbnRpZmllcyB0aGUgdmlydHVhbCBNQUMpCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1M6CisJCUNvcHlNYWMocEJ1ZiwgJnBBQy0+QWRkci5OZXRbTmV0SW5kZXhdLlBlcm1hbmVudE1hY0FkZHJlc3MpOworCQkqcExlbiA9IHNpemVvZihTS19NQUNfQUREUik7CisJCWJyZWFrOworCisJY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorCQlDb3B5TWFjKHBCdWYsICZwQUMtPkFkZHIuTmV0W05ldEluZGV4XS5DdXJyZW50TWFjQWRkcmVzcyk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX01BQ19BRERSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTdGF0VmFsID0gR2V0U3RhdFZhbChwQUMsIElvQywgMCwgSWRUYWJsZVtUYWJsZUluZGV4XS5QYXJhbSwgTmV0SW5kZXgpOworCisJCS8qIGJ5IGRlZmF1bHQgMzJiaXQgdmFsdWVzIGFyZSBldmFsdWF0ZWQgKi8KKwkJaWYgKCFJczY0Qml0UmVxKSB7CisJCQlTdGF0VmFsMzIgPSAoU0tfVTMyKVN0YXRWYWw7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBTdGF0VmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFN0YXRWYWwpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjUHJpdmF0ZVN0YXQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9TVEFUX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmV0cmlldmVzIHRoZSBNQUMgc3RhdGlzdGljIGRhdGEuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBNYWNQcml2YXRlU3RhdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlMb2dQb3J0TWF4OworCXVuc2lnbmVkIGludAlMb2dQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCWludAkJCQlNYWNUeXBlOworCWludAkJCQlSZXQ7CisJU0tfVTY0CQkJU3RhdFZhbDsKKwkKKwkKKworCS8qIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQuIE1BQyBpbmRleCAwIGlzIHRoZSB2aXJ0dWFsIE1BQyAqLworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCUxvZ1BvcnRNYXggPSBTS19QTk1JX1BPUlRfUEhZUzJMT0coUGh5c1BvcnRNYXgpOworCQorCU1hY1R5cGUgPSBwQUMtPkdJbmkuR0lNYWNUeXBlOworCisJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7IC8qIER1YWwgbmV0IG1vZGUgKi8KKwkJTG9nUG9ydE1heC0tOworCX0KKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeyAvKiBPbmx5IG9uZSBzcGVjaWZpYyBpbnN0YW5jZSBpcyBxdWVyaWVkICovCisJCS8qIENoZWNrIGluc3RhbmNlIHJhbmdlICovCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBMb2dQb3J0TWF4KSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwkJTG9nUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0lOU1QyTE9HKEluc3RhbmNlKTsKKwkJTGltaXQgPSBMb2dQb3J0SW5kZXggKyAxOworCX0KKworCWVsc2UgeyAvKiBJbnN0YW5jZSA9PSAoU0tfVTMyKSgtMSksIGdldCBhbGwgSW5zdGFuY2VzIG9mIHRoYXQgT0lEICovCisKKwkJTG9nUG9ydEluZGV4ID0gMDsKKwkJTGltaXQgPSBMb2dQb3J0TWF4OworCX0KKworCS8qIENoZWNrIGFjdGlvbiAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlpZiAoKnBMZW4gPCAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkqcExlbiA9IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTY0KTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCX0KKworCS8qCisJICogVXBkYXRlIE1BQyBzdGF0aXN0aWMgYW5kIGluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdAorCSAqIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLgorCSAqLworCVJldCA9IE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSk7CisJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChSZXQpOworCX0KKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkvKiBHZXQgdmFsdWUgKi8KKwlPZmZzZXQgPSAwOworCWZvciAoOyBMb2dQb3J0SW5kZXggPCBMaW1pdDsgTG9nUG9ydEluZGV4ICsrKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisvKiBYWFggbm90IHlldCBpbXBsZW1lbnRlZCBkdWUgdG8gWE1BQyBwcm9ibGVtcworCQljYXNlIE9JRF9TS0dFX1NUQVRfVFhfVVRJTDoKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisqLworLyogWFhYIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZHVlIHRvIFhNQUMgcHJvYmxlbXMKKwkJY2FzZSBPSURfU0tHRV9TVEFUX1JYX1VUSUw6CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworKi8KKwkJY2FzZSBPSURfU0tHRV9TVEFUX1JYOgorCQkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCQlTdGF0VmFsID0KKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFJYX0JST0FEQ0FTVCwgTmV0SW5kZXgpICsKKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFJYX01VTFRJQ0FTVCwgTmV0SW5kZXgpICsKKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFJYX1VOSUNBU1QsIE5ldEluZGV4KSArCisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hSWF9VTkRFUlNJWkUsIE5ldEluZGV4KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVN0YXRWYWwgPSBHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCUlkVGFibGVbVGFibGVJbmRleF0uUGFyYW0sIE5ldEluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU1RBVF9UWDoKKwkJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkJU3RhdFZhbCA9CisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hUWF9CUk9BRENBU1QsIE5ldEluZGV4KSArCisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hUWF9NVUxUSUNBU1QsIE5ldEluZGV4KSArCisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hUWF9VTklDQVNULCBOZXRJbmRleCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTdGF0VmFsID0gR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLlBhcmFtLCBOZXRJbmRleCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU3RhdFZhbCA9IEdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLlBhcmFtLCBOZXRJbmRleCk7CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgU3RhdFZhbCk7CisKKwkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCX0KKwkqcExlbiA9IE9mZnNldDsKKworCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBZGRyIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfUEhZU19DVVJfQUREUiBhbmQgX0ZBQ19BRERSCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQvUHJlc2V0cy9TZXRzIHRoZSBjdXJyZW50IGFuZCBmYWN0b3J5IE1BQyBhZGRyZXNzLiBUaGUgTUFDCisgKglhZGRyZXNzIG9mIHRoZSB2aXJ0dWFsIHBvcnQsIHdoaWNoIGlzIHJlcG9ydGVkIHRvIHRoZSBPUywgbWF5CisgKglub3QgYmUgY2hhbmdlZCwgYnV0IHRoZSBwaHlzaWNhbCBvbmVzLiBBIHNldCB0byB0aGUgdmlydHVhbCBwb3J0CisgKgl3aWxsIGJlIGlnbm9yZWQuIE5vIGVycm9yIHNob3VsZCBiZSByZXBvcnRlZCBiZWNhdXNlIG90aGVyd2lzZQorICoJYSBtdWx0aXBsZSBpbnN0YW5jZSBzZXQgKC0xKSB3b3VsZCBhbHdheXMgZmFpbC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IEFkZHIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJCVJldDsKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldCA9IDA7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQuIE1BQyBpbmRleCAwIGlzIHRoZSB2aXJ0dWFsCisJICogTUFDLgorCSAqLworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCUxvZ1BvcnRNYXggPSBTS19QTk1JX1BPUlRfUEhZUzJMT0coUGh5c1BvcnRNYXgpOworCisJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7IC8qIER1YWwgbmV0IG1vZGUgKi8KKwkJTG9nUG9ydE1heC0tOworCX0KKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeyAvKiBPbmx5IG9uZSBzcGVjaWZpYyBpbnN0YW5jZSBpcyBxdWVyaWVkICovCisJCS8qIENoZWNrIGluc3RhbmNlIHJhbmdlICovCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBMb2dQb3J0TWF4KSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwkJTG9nUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0lOU1QyTE9HKEluc3RhbmNlKTsKKwkJTGltaXQgPSBMb2dQb3J0SW5kZXggKyAxOworCX0KKwllbHNlIHsgLyogSW5zdGFuY2UgPT0gKFNLX1UzMikoLTEpLCBnZXQgYWxsIEluc3RhbmNlcyBvZiB0aGF0IE9JRCAqLworCisJCUxvZ1BvcnRJbmRleCA9IDA7CisJCUxpbWl0ID0gTG9nUG9ydE1heDsKKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gQWN0aW9uCisJICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCS8qIENoZWNrIGxlbmd0aCAqLworCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogNikgeworCisJCQkqcExlbiA9IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiA2OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKwkJLyoKKwkJICogR2V0IHZhbHVlCisJCSAqLworCQlmb3IgKDsgTG9nUG9ydEluZGV4IDwgTGltaXQ7IExvZ1BvcnRJbmRleCArKykgeworCisJCQlzd2l0Y2ggKElkKSB7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZU19DVVJfQUREUjoKKwkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJQ29weU1hYyhwQnVmICsgT2Zmc2V0LCAmcEFDLT5BZGRyLk5ldFtOZXRJbmRleF0uQ3VycmVudE1hY0FkZHJlc3MpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJQ29weU1hYyhwQnVmICsgT2Zmc2V0LAorCQkJCQkJJnBBQy0+QWRkci5Qb3J0W1BoeXNQb3J0SW5kZXhdLkN1cnJlbnRNYWNBZGRyZXNzKTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IDY7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZU19GQUNfQUREUjoKKwkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJQ29weU1hYyhwQnVmICsgT2Zmc2V0LAorCQkJCQkJJnBBQy0+QWRkci5OZXRbTmV0SW5kZXhdLlBlcm1hbmVudE1hY0FkZHJlc3MpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQlDb3B5TWFjKHBCdWYgKyBPZmZzZXQsCisJCQkJCQkmcEFDLT5BZGRyLlBvcnRbUGh5c1BvcnRJbmRleF0uUGVybWFuZW50TWFjQWRkcmVzcyk7CisJCQkJfQorCQkJCU9mZnNldCArPSA2OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDgsCisJCQkJCVNLX1BOTUlfRVJSMDA4TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQl9CisKKwkJKnBMZW4gPSBPZmZzZXQ7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBUaGUgbG9naWNhbCBNQUMgYWRkcmVzcyBtYXkgbm90IGJlIGNoYW5nZWQgb25seQorCQkgKiB0aGUgcGh5c2ljYWwgb25lcworCQkgKi8KKwkJaWYgKElkID09IE9JRF9TS0dFX1BIWVNfRkFDX0FERFIpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCQl9CisKKwkJLyoKKwkJICogT25seSB0aGUgY3VycmVudCBhZGRyZXNzIG1heSBiZSBjaGFuZ2VkCisJCSAqLworCQlpZiAoSWQgIT0gT0lEX1NLR0VfUEhZU19DVVJfQUREUikgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA5LAorCQkJCVNLX1BOTUlfRVJSMDA5TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCS8qIENoZWNrIGxlbmd0aCAqLworCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogNikgeworCisJCQkqcExlbiA9IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiA2OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWlmICgqcExlbiA+IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiA2KSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIEFjdGlvbgorCQkgKi8KKwkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJfQorCisJCS8qCisJCSAqIFNldCBPSURfU0tHRV9NQUNfQ1VSX0FERFIKKwkJICovCisJCWZvciAoOyBMb2dQb3J0SW5kZXggPCBMaW1pdDsgTG9nUG9ydEluZGV4ICsrLCBPZmZzZXQgKz0gNikgeworCisJCQkvKgorCQkJICogQSBzZXQgdG8gdmlydHVhbCBwb3J0IGFuZCBzZXQgb2YgYnJvYWRjYXN0CisJCQkgKiBhZGRyZXNzIHdpbGwgYmUgaWdub3JlZAorCQkJICovCisJCQlpZiAoTG9nUG9ydEluZGV4ID09IDAgfHwgU0tfTUVNQ01QKHBCdWYgKyBPZmZzZXQsCisJCQkJIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsIDYpID09IDApIHsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQywKKwkJCQlMb2dQb3J0SW5kZXgpOworCisJCQlSZXQgPSBTa0FkZHJPdmVycmlkZShwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkoU0tfTUFDX0FERFIgKikocEJ1ZiArIE9mZnNldCksCisJCQkJKExvZ1BvcnRJbmRleCA9PSAwID8gU0tfQUREUl9WSVJUVUFMX0FERFJFU1MgOgorCQkJCVNLX0FERFJfUEhZU0lDQUxfQUREUkVTUykpOworCQkJaWYgKFJldCAhPSBTS19BRERSX09WRVJSSURFX1NVQ0NFU1MpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCX0KKwkJKnBMZW4gPSBPZmZzZXQ7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENzdW1TdGF0IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfQ0hLU01fWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXRyaWV2ZXMgdGhlIHN0YXRpc3RpYyB2YWx1ZXMgb2YgdGhlIENTVU0gbW9kdWxlLiBUaGUgQ1NVTSBkYXRhCisgKglzdHJ1Y3R1cmUgbXVzdCBiZSBhdmFpbGFibGUgaW4gdGhlIFNLX0FDIGV2ZW4gaWYgdGhlIENTVU0gbW9kdWxlCisgKglpcyBub3QgaW5jbHVkZWQsIGJlY2F1c2UgUE5NSSByZWFkcyB0aGUgc3RhdGlzdGljIGRhdGEgZnJvbSB0aGUKKyAqCUNTVU0gcGFydCBvZiBTS19BQyBkaXJlY3RseS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IENzdW1TdGF0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CUluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0ID0gMDsKKwlTS19VNjQJCVN0YXRWYWw7CisKKworCS8qCisJICogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZAorCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpIHsKKworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gU0tDU19OVU1fUFJPVE9DT0xTKSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwkJSW5kZXggPSAodW5zaWduZWQgaW50KUluc3RhbmNlIC0gMTsKKwkJTGltaXQgPSBJbmRleCArIDE7CisJfQorCWVsc2UgeworCQlJbmRleCA9IDA7CisJCUxpbWl0ID0gU0tDU19OVU1fUFJPVE9DT0xTOworCX0KKworCS8qCisJICogQ2hlY2sgYWN0aW9uCisJICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qIENoZWNrIGxlbmd0aCAqLworCWlmICgqcExlbiA8IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VNjQpKSB7CisKKwkJKnBMZW4gPSAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTY0KTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCX0KKworCS8qCisJICogR2V0IHZhbHVlCisJICovCisJZm9yICg7IEluZGV4IDwgTGltaXQ7IEluZGV4ICsrKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfQ0hLU01fUlhfT0tfQ1RTOgorCQkJU3RhdFZhbCA9IHBBQy0+Q3N1bS5Qcm90b1N0YXRzW05ldEluZGV4XVtJbmRleF0uUnhPa0N0czsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfQ0hLU01fUlhfVU5BQkxFX0NUUzoKKwkJCVN0YXRWYWwgPSBwQUMtPkNzdW0uUHJvdG9TdGF0c1tOZXRJbmRleF1bSW5kZXhdLlJ4VW5hYmxlQ3RzOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9DSEtTTV9SWF9FUlJfQ1RTOgorCQkJU3RhdFZhbCA9IHBBQy0+Q3N1bS5Qcm90b1N0YXRzW05ldEluZGV4XVtJbmRleF0uUnhFcnJDdHM7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0NIS1NNX1RYX09LX0NUUzoKKwkJCVN0YXRWYWwgPSBwQUMtPkNzdW0uUHJvdG9TdGF0c1tOZXRJbmRleF1bSW5kZXhdLlR4T2tDdHM7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0NIS1NNX1RYX1VOQUJMRV9DVFM6CisJCQlTdGF0VmFsID0gcEFDLT5Dc3VtLlByb3RvU3RhdHNbTmV0SW5kZXhdW0luZGV4XS5UeFVuYWJsZUN0czsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDEwLAorCQkJCVNLX1BOTUlfRVJSMDEwTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFN0YXRWYWwpOworCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJfQorCisJLyoKKwkgKiBTdG9yZSB1c2VkIGJ1ZmZlciBzcGFjZQorCSAqLworCSpwTGVuID0gT2Zmc2V0OworCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNlbnNvclN0YXQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9TRU5TT1JfWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXRyaWV2ZXMgdGhlIHN0YXRpc3RpYyB2YWx1ZXMgb2YgdGhlIEkyQyBtb2R1bGUsIHdoaWNoIGhhbmRsZXMKKyAqCXRoZSB0ZW1wZXJhdHVyZSBhbmQgdm9sdGFnZSBzZW5zb3JzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgU2Vuc29yU3RhdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlpOworCXVuc2lnbmVkIGludAlJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwl1bnNpZ25lZCBpbnQJTGVuOworCVNLX1UzMgkJVmFsMzI7CisJU0tfVTY0CQlWYWw2NDsKKworCisJLyoKKwkgKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkCisJICovCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7CisKKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IChTS19VMzIpcEFDLT5JMmMuTWF4U2VucykpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisKKwkJSW5kZXggPSAodW5zaWduZWQgaW50KUluc3RhbmNlIC0xOworCQlMaW1pdCA9ICh1bnNpZ25lZCBpbnQpSW5zdGFuY2U7CisJfQorCWVsc2UgeworCQlJbmRleCA9IDA7CisJCUxpbWl0ID0gKHVuc2lnbmVkIGludCkgcEFDLT5JMmMuTWF4U2VuczsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFjdGlvbgorCSAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9WQUxVRToKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfTE9XOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19VUFA6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVzoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfVVBQOgorCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9TRU5TT1JfREVTQ1I6CisJCWZvciAoT2Zmc2V0ID0gMCwgaSA9IEluZGV4OyBpIDwgTGltaXQ7IGkgKyspIHsKKworCQkJTGVuID0gKHVuc2lnbmVkIGludCkKKwkJCQlTS19TVFJMRU4ocEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYykgKyAxOworCQkJaWYgKExlbiA+PSBTS19QTk1JX1NUUklOR0xFTjIpIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTEsCisJCQkJCVNLX1BOTUlfRVJSMDExTVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJT2Zmc2V0ICs9IExlbjsKKwkJfQorCQlpZiAoKnBMZW4gPCBPZmZzZXQpIHsKKworCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9JTkRFWDoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9UWVBFOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX1NUQVRVUzoKKwkJaWYgKCpwTGVuIDwgTGltaXQgLSBJbmRleCkgeworCisJCQkqcExlbiA9IExpbWl0IC0gSW5kZXg7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfQ1RTOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USU1FOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9DVFM6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RJTUU6CisJCWlmICgqcExlbiA8IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VNjQpKSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1U2NCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDEyLAorCQkJU0tfUE5NSV9FUlIwMTJNU0cpOworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKworCX0KKworCS8qCisJICogR2V0IHZhbHVlCisJICovCisJZm9yIChPZmZzZXQgPSAwOyBJbmRleCA8IExpbWl0OyBJbmRleCArKykgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9JTkRFWDoKKwkJCSoocEJ1ZiArIE9mZnNldCkgPSAoY2hhcilJbmRleDsKKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9ERVNDUjoKKwkJCUxlbiA9IFNLX1NUUkxFTihwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuRGVzYyk7CisJCQlTS19NRU1DUFkocEJ1ZiArIE9mZnNldCArIDEsCisJCQkJcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlbkRlc2MsIExlbik7CisJCQkqKHBCdWYgKyBPZmZzZXQpID0gKGNoYXIpTGVuOworCQkJT2Zmc2V0ICs9IExlbiArIDE7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9UWVBFOgorCQkJKihwQnVmICsgT2Zmc2V0KSA9CisJCQkJKGNoYXIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlblR5cGU7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfVkFMVUU6CisJCQlWYWwzMiA9IChTS19VMzIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlblZhbHVlOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX0xPVzoKKwkJCVZhbDMyID0gKFNLX1UzMilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uCisJCQkJU2VuVGhyZVdhcm5Mb3c7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfVVBQOgorCQkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS4KKwkJCQlTZW5UaHJlV2FybkhpZ2g7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfTE9XOgorCQkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS4KKwkJCQlTZW5UaHJlRXJyTG93OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX1VQUDoKKwkJCVZhbDMyID0gcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlblRocmVFcnJIaWdoOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfU1RBVFVTOgorCQkJKihwQnVmICsgT2Zmc2V0KSA9CisJCQkJKGNoYXIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlbkVyckZsYWc7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlbldhcm5DdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfQ1RTOgorCQkJVmFsNjQgPSBwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuRXJyQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUU6CisJCQlWYWw2NCA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS4KKwkJCQlTZW5CZWdXYXJuVFMpOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RJTUU6CisJCQlWYWw2NCA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS4KKwkJCQlTZW5CZWdFcnJUUyk7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfRVJSLAorCQkJCSgiU2Vuc29yU3RhdDogVW5rbm93biBPSUQgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIikpOworCisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfQorCisJLyoKKwkgKiBTdG9yZSB1c2VkIGJ1ZmZlciBzcGFjZQorCSAqLworCSpwTGVuID0gT2Zmc2V0OworCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZwZCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1ZQRF9YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldC9wcmVzZXQvc2V0IG9mIFZQRCBkYXRhLiBBcyBpbnN0YW5jZSB0aGUgbmFtZSBvZiBhIFZQRCBrZXkKKyAqCWNhbiBiZSBwYXNzZWQuIFRoZSBJbnN0YW5jZSBwYXJhbWV0ZXIgaXMgYSBTS19VMzIgYW5kIGNhbiBiZQorICoJdXNlZCBhcyBhIHN0cmluZyBidWZmZXIgZm9yIHRoZSBWUEQga2V5LCBiZWNhdXNlIHRoZWlyIG1heGltdW0KKyAqCWxlbmd0aCBpcyA0IGJ5dGUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBWcGQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19WUERfU1RBVFVTCSpwVnBkU3RhdHVzOworCXVuc2lnbmVkIGludAlCdWZMZW47CisJY2hhcgkJQnVmWzI1Nl07CisJY2hhcgkJS2V5QXJyW1NLX1BOTUlfVlBEX0VOVFJJRVNdW1NLX1BOTUlfVlBEX0tFWV9TSVpFXTsKKwljaGFyCQlLZXlTdHJbU0tfUE5NSV9WUERfS0VZX1NJWkVdOworCXVuc2lnbmVkIGludAlLZXlObzsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCXVuc2lnbmVkIGludAlJbmRleDsKKwl1bnNpZ25lZCBpbnQJRmlyc3RJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGFzdEluZGV4OworCXVuc2lnbmVkIGludAlMZW47CisJaW50CQlSZXQ7CisJU0tfVTMyCQlWYWwzMjsKKworCS8qCisJICogR2V0IGFycmF5IG9mIGFsbCBjdXJyZW50bHkgc3RvcmVkIFZQRCBrZXlzCisJICovCisJUmV0ID0gR2V0VnBkS2V5QXJyKHBBQywgSW9DLCAmS2V5QXJyWzBdWzBdLCBzaXplb2YoS2V5QXJyKSwgJktleU5vKTsKKwlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCS8qCisJICogSWYgaW5zdGFuY2UgaXMgbm90IC0xLCB0cnkgdG8gZmluZCB0aGUgcmVxdWVzdGVkIFZQRCBrZXkgZm9yCisJICogdGhlIG11bHRpcGxlIGluc3RhbmNlIHZhcmlhYmxlcy4gVGhlIG90aGVyIE9JRHMgYXMgZm9yIGV4YW1wbGUKKwkgKiBPSUQgVlBEX0FDVElPTiBhcmUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcyBhbmQgbXVzdCBiZQorCSAqIGhhbmRsZWQgc2VwYXJhdGx5LgorCSAqLworCUZpcnN0SW5kZXggPSAwOworCUxhc3RJbmRleCA9IEtleU5vOworCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7CisKKwkJaWYgKElkID09IE9JRF9TS0dFX1ZQRF9LRVkgfHwgSWQgPT0gT0lEX1NLR0VfVlBEX1ZBTFVFIHx8CisJCQlJZCA9PSBPSURfU0tHRV9WUERfQUNDRVNTKSB7CisKKwkJCVNLX1NUUk5DUFkoS2V5U3RyLCAoY2hhciAqKSZJbnN0YW5jZSwgNCk7CisJCQlLZXlTdHJbNF0gPSAwOworCisJCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBLZXlObzsgSW5kZXggKyspIHsKKworCQkJCWlmIChTS19TVFJDTVAoS2V5U3RyLCBLZXlBcnJbSW5kZXhdKSA9PSAwKSB7CisJCQkJCUZpcnN0SW5kZXggPSBJbmRleDsKKwkJCQkJTGFzdEluZGV4ID0gSW5kZXgrMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKEluZGV4ID09IEtleU5vKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKEluc3RhbmNlICE9IDEpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJfQorCisJLyoKKwkgKiBHZXQgdmFsdWUsIGlmIGEgcXVlcnkgc2hvdWxkIGJlIHBlcmZvcm1lZAorCSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfRlJFRV9CWVRFUzoKKwkJCS8qIENoZWNrIGxlbmd0aCBvZiBidWZmZXIgKi8KKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCS8qIEdldCBudW1iZXIgb2YgZnJlZSBieXRlcyAqLworCQkJcFZwZFN0YXR1cyA9IFZwZFN0YXQocEFDLCBJb0MpOworCQkJaWYgKHBWcGRTdGF0dXMgPT0gTlVMTCkgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxNywKKwkJCQkJU0tfUE5NSV9FUlIwMTdNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlpZiAoKHBWcGRTdGF0dXMtPnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpID09IDApIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTgsCisJCQkJCVNLX1BOTUlfRVJSMDE4TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJCisJCQlWYWwzMiA9IChTS19VMzIpcFZwZFN0YXR1cy0+dnBkX2ZyZWVfcnc7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfRU5UUklFU19MSVNUOgorCQkJLyogQ2hlY2sgbGVuZ3RoICovCisJCQlmb3IgKExlbiA9IDAsIEluZGV4ID0gMDsgSW5kZXggPCBLZXlObzsgSW5kZXggKyspIHsKKworCQkJCUxlbiArPSBTS19TVFJMRU4oS2V5QXJyW0luZGV4XSkgKyAxOworCQkJfQorCQkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCQkqcExlbiA9IExlbjsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisKKwkJCS8qIEdldCB2YWx1ZSAqLworCQkJKihwQnVmKSA9IChjaGFyKUxlbiAtIDE7CisJCQlmb3IgKE9mZnNldCA9IDEsIEluZGV4ID0gMDsgSW5kZXggPCBLZXlObzsgSW5kZXggKyspIHsKKworCQkJCUxlbiA9IFNLX1NUUkxFTihLZXlBcnJbSW5kZXhdKTsKKwkJCQlTS19NRU1DUFkocEJ1ZiArIE9mZnNldCwgS2V5QXJyW0luZGV4XSwgTGVuKTsKKworCQkJCU9mZnNldCArPSBMZW47CisKKwkJCQlpZiAoSW5kZXggPCBLZXlObyAtIDEpIHsKKworCQkJCQkqKHBCdWYgKyBPZmZzZXQpID0gJyAnOworCQkJCQlPZmZzZXQgKys7CisJCQkJfQorCQkJfQorCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9FTlRSSUVTX05VTUJFUjoKKwkJCS8qIENoZWNrIGxlbmd0aCAqLworCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCisJCQlWYWwzMiA9IChTS19VMzIpS2V5Tm87CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfS0VZOgorCQkJLyogQ2hlY2sgYnVmZmVyIGxlbmd0aCwgaWYgaXQgaXMgbGFyZ2UgZW5vdWdoICovCisJCQlmb3IgKExlbiA9IDAsIEluZGV4ID0gRmlyc3RJbmRleDsKKwkJCQlJbmRleCA8IExhc3RJbmRleDsgSW5kZXggKyspIHsKKworCQkJCUxlbiArPSBTS19TVFJMRU4oS2V5QXJyW0luZGV4XSkgKyAxOworCQkJfQorCQkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCQkqcExlbiA9IExlbjsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBHZXQgdGhlIGtleSB0byBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLCBiZWNhdXNlCisJCQkgKiB3ZSBoYXZlIHRvIHByZXBlbmQgYSBsZW5ndGggYnl0ZS4KKwkJCSAqLworCQkJZm9yIChPZmZzZXQgPSAwLCBJbmRleCA9IEZpcnN0SW5kZXg7CisJCQkJSW5kZXggPCBMYXN0SW5kZXg7IEluZGV4ICsrKSB7CisKKwkJCQlMZW4gPSBTS19TVFJMRU4oS2V5QXJyW0luZGV4XSk7CisKKwkJCQkqKHBCdWYgKyBPZmZzZXQpID0gKGNoYXIpTGVuOworCQkJCVNLX01FTUNQWShwQnVmICsgT2Zmc2V0ICsgMSwgS2V5QXJyW0luZGV4XSwKKwkJCQkJTGVuKTsKKwkJCQlPZmZzZXQgKz0gTGVuICsgMTsKKwkJCX0KKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfVkFMVUU6CisJCQkvKiBDaGVjayB0aGUgYnVmZmVyIGxlbmd0aCBpZiBpdCBpcyBsYXJnZSBlbm91Z2ggKi8KKwkJCWZvciAoT2Zmc2V0ID0gMCwgSW5kZXggPSBGaXJzdEluZGV4OworCQkJCUluZGV4IDwgTGFzdEluZGV4OyBJbmRleCArKykgeworCisJCQkJQnVmTGVuID0gMjU2OworCQkJCWlmIChWcGRSZWFkKHBBQywgSW9DLCBLZXlBcnJbSW5kZXhdLCBCdWYsCisJCQkJCShpbnQgKikmQnVmTGVuKSA+IDAgfHwKKwkJCQkJQnVmTGVuID49IFNLX1BOTUlfVlBEX0RBVEFMRU4pIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjAyMSwKKwkJCQkJCVNLX1BOTUlfRVJSMDIxTVNHKTsKKworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gQnVmTGVuICsgMTsKKwkJCX0KKwkJCWlmICgqcExlbiA8IE9mZnNldCkgeworCisJCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCisJCQkvKgorCQkJICogR2V0IHRoZSB2YWx1ZSB0byBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLCBiZWNhdXNlCisJCQkgKiB3ZSBoYXZlIHRvIHByZXBlbmQgYSBsZW5ndGggYnl0ZS4KKwkJCSAqLworCQkJZm9yIChPZmZzZXQgPSAwLCBJbmRleCA9IEZpcnN0SW5kZXg7CisJCQkJSW5kZXggPCBMYXN0SW5kZXg7IEluZGV4ICsrKSB7CisKKwkJCQlCdWZMZW4gPSAyNTY7CisJCQkJaWYgKFZwZFJlYWQocEFDLCBJb0MsIEtleUFycltJbmRleF0sIEJ1ZiwKKwkJCQkJKGludCAqKSZCdWZMZW4pID4gMCB8fAorCQkJCQlCdWZMZW4gPj0gU0tfUE5NSV9WUERfREFUQUxFTikgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDIyLAorCQkJCQkJU0tfUE5NSV9FUlIwMjJNU0cpOworCisJCQkJCSpwTGVuID0gMDsKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisKKwkJCQkqKHBCdWYgKyBPZmZzZXQpID0gKGNoYXIpQnVmTGVuOworCQkJCVNLX01FTUNQWShwQnVmICsgT2Zmc2V0ICsgMSwgQnVmLCBCdWZMZW4pOworCQkJCU9mZnNldCArPSBCdWZMZW4gKyAxOworCQkJfQorCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9BQ0NFU1M6CisJCQlpZiAoKnBMZW4gPCBMYXN0SW5kZXggLSBGaXJzdEluZGV4KSB7CisKKwkJCQkqcExlbiA9IExhc3RJbmRleCAtIEZpcnN0SW5kZXg7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCisJCQlmb3IgKE9mZnNldCA9IDAsIEluZGV4ID0gRmlyc3RJbmRleDsKKwkJCQlJbmRleCA8IExhc3RJbmRleDsgSW5kZXggKyspIHsKKworCQkJCWlmIChWcGRNYXlXcml0ZShLZXlBcnJbSW5kZXhdKSkgeworCisJCQkJCSoocEJ1ZiArIE9mZnNldCkgPSBTS19QTk1JX1ZQRF9SVzsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCSoocEJ1ZiArIE9mZnNldCkgPSBTS19QTk1JX1ZQRF9STzsKKwkJCQl9CisJCQkJT2Zmc2V0ICsrOworCQkJfQorCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9BQ1RJT046CisJCQlPZmZzZXQgPSBMYXN0SW5kZXggLSBGaXJzdEluZGV4OworCQkJaWYgKCpwTGVuIDwgT2Zmc2V0KSB7CisKKwkJCQkqcExlbiA9IE9mZnNldDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlTS19NRU1TRVQocEJ1ZiwgMCwgT2Zmc2V0KTsKKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjMsCisJCQkJU0tfUE5NSV9FUlIwMjNNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfQorCWVsc2UgeworCQkvKiBUaGUgb25seSBPSUQgd2hpY2ggY2FuIGJlIHNldCBpcyBWUERfQUNUSU9OICovCisJCWlmIChJZCAhPSBPSURfU0tHRV9WUERfQUNUSU9OKSB7CisKKwkJCWlmIChJZCA9PSBPSURfU0tHRV9WUERfRlJFRV9CWVRFUyB8fAorCQkJCUlkID09IE9JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1QgfHwKKwkJCQlJZCA9PSBPSURfU0tHRV9WUERfRU5UUklFU19OVU1CRVIgfHwKKwkJCQlJZCA9PSBPSURfU0tHRV9WUERfS0VZIHx8CisJCQkJSWQgPT0gT0lEX1NLR0VfVlBEX1ZBTFVFIHx8CisJCQkJSWQgPT0gT0lEX1NLR0VfVlBEX0FDQ0VTUykgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwkJCX0KKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyNCwKKwkJCQlTS19QTk1JX0VSUjAyNE1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQkvKgorCQkgKiBGcm9tIHRoaXMgcG9pbnQgd2UgaGFuZGxlIFZQRF9BQ1RJT04uIENoZWNrIHRoZSBidWZmZXIKKwkJICogbGVuZ3RoLiBJdCBzaG91bGQgYXQgbGVhc3QgaGF2ZSB0aGUgc2l6ZSBvZiBvbmUgYnl0ZS4KKwkJICovCisJCWlmICgqcExlbiA8IDEpIHsKKworCQkJKnBMZW4gPSAxOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKwkJLyoKKwkJICogVGhlIGZpcnN0IGJ5dGUgY29udGFpbnMgdGhlIFZQRCBhY3Rpb24gdHlwZSB3ZSBzaG91bGQKKwkJICogcGVyZm9ybS4KKwkJICovCisJCXN3aXRjaCAoKnBCdWYpIHsKKworCQljYXNlIFNLX1BOTUlfVlBEX0lHTk9SRToKKwkJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0tfUE5NSV9WUERfQ1JFQVRFOgorCQkJLyoKKwkJCSAqIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IFZQRCBlbnRyeSBvciB3ZSBtb2RpZnkKKwkJCSAqIGFuIGV4aXN0aW5nIG9uZS4gQ2hlY2sgZmlyc3QgdGhlIGJ1ZmZlciBsZW5ndGguCisJCQkgKi8KKwkJCWlmICgqcExlbiA8IDQpIHsKKworCQkJCSpwTGVuID0gNDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlLZXlTdHJbMF0gPSBwQnVmWzFdOworCQkJS2V5U3RyWzFdID0gcEJ1ZlsyXTsKKwkJCUtleVN0clsyXSA9IDA7CisKKwkJCS8qCisJCQkgKiBJcyB0aGUgZW50cnkgd3JpdGFibGUgb3IgZG9lcyBpdCBiZWxvbmcgdG8gdGhlCisJCQkgKiByZWFkLW9ubHkgYXJlYT8KKwkJCSAqLworCQkJaWYgKCFWcGRNYXlXcml0ZShLZXlTdHIpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQlPZmZzZXQgPSAoaW50KXBCdWZbM10gJiAweEZGOworCisJCQlTS19NRU1DUFkoQnVmLCBwQnVmICsgNCwgT2Zmc2V0KTsKKwkJCUJ1ZltPZmZzZXRdID0gMDsKKworCQkJLyogQSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJLyogV3JpdGUgdGhlIG5ldyBlbnRyeSBvciBtb2RpZnkgYW4gZXhpc3Rpbmcgb25lICovCisJCQlSZXQgPSBWcGRXcml0ZShwQUMsIElvQywgS2V5U3RyLCBCdWYpOworCQkJaWYgKFJldCA9PSBTS19QTk1JX1ZQRF9OT1dSSVRFICkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFJldCAhPSBTS19QTk1JX1ZQRF9PSykgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyNSwKKwkJCQkJU0tfUE5NSV9FUlIwMjVNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBQZXJmb3JtIGFuIHVwZGF0ZSBvZiB0aGUgVlBEIGRhdGEuIFRoaXMgaXMKKwkJCSAqIG5vdCBtYW5kYW50b3J5LCBidXQganVzdCB0byBiZSBzdXJlLgorCQkJICovCisJCQlSZXQgPSBWcGRVcGRhdGUocEFDLCBJb0MpOworCQkJaWYgKFJldCAhPSBTS19QTk1JX1ZQRF9PSykgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyNiwKKwkJCQkJU0tfUE5NSV9FUlIwMjZNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNLX1BOTUlfVlBEX0RFTEVURToKKwkJCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBwbGF1c2libGUgKi8KKwkJCWlmICgqcExlbiA8IDMpIHsKKworCQkJCSpwTGVuID0gMzsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlpZiAoKnBMZW4gPiAzKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQkJS2V5U3RyWzBdID0gcEJ1ZlsxXTsKKwkJCUtleVN0clsxXSA9IHBCdWZbMl07CisJCQlLZXlTdHJbMl0gPSAwOworCisJCQkvKiBGaW5kIHRoZSBwYXNzZWQga2V5IGluIHRoZSBhcnJheSAqLworCQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgS2V5Tm87IEluZGV4ICsrKSB7CisKKwkJCQlpZiAoU0tfU1RSQ01QKEtleVN0ciwgS2V5QXJyW0luZGV4XSkgPT0gMCkgeworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB3ZSBjYW5ub3QgZmluZCB0aGUga2V5IGl0IGlzIHdyb25nLCBzbyB3ZQorCQkJICogcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlLgorCQkJICovCisJCQlpZiAoSW5kZXggPT0gS2V5Tm8pIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQkvKiBPaywgeW91IHdhbnRlZCBpdCBhbmQgeW91IHdpbGwgZ2V0IGl0ICovCisJCQlSZXQgPSBWcGREZWxldGUocEFDLCBJb0MsIEtleVN0cik7CisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfVlBEX09LKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI3LAorCQkJCQlTS19QTk1JX0VSUjAyN01TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFBlcmZvcm0gYW4gdXBkYXRlIG9mIHRoZSBWUEQgZGF0YS4gVGhpcyBpcworCQkJICogbm90IG1hbmRhbnRvcnksIGJ1dCBqdXN0IHRvIGJlIHN1cmUuCisJCQkgKi8KKwkJCVJldCA9IFZwZFVwZGF0ZShwQUMsIElvQyk7CisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfVlBEX09LKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI4LAorCQkJCQlTS19QTk1JX0VSUjAyOE1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2VuZXJhbCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIHZhcmlvdXMgc2luZ2xlIGluc3RhbmNlIE9JRHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjb2RlIGlzIHNpbXBsZS4gTm8gZGVzY3JpcHRpb24gbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgR2VuZXJhbCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJCVJldDsKKwl1bnNpZ25lZCBpbnQJSW5kZXg7CisJdW5zaWduZWQgaW50CUxlbjsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCXVuc2lnbmVkIGludAlWYWw7CisJU0tfVTgJCVZhbDg7CisJU0tfVTE2CQlWYWwxNjsKKwlTS19VMzIJCVZhbDMyOworCVNLX1U2NAkJVmFsNjQ7CisJU0tfVTY0CQlWYWw2NFJ4SHdFcnJzID0gMDsKKwlTS19VNjQJCVZhbDY0VHhId0VycnMgPSAwOworCVNLX0JPT0wJCUlzNjRCaXRSZXEgPSBTS19GQUxTRTsKKwljaGFyCQlCdWZbMjU2XTsKKwlpbnQJCQlNYWNUeXBlOworCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gV2Ugb25seSBoYW5kbGUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcy4KKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFjdGlvbi4gV2Ugb25seSBhbGxvdyBnZXQgcmVxdWVzdHMuCisJICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKwkKKwlNYWNUeXBlID0gcEFDLT5HSW5pLkdJTWFjVHlwZTsKKwkKKwkvKgorCSAqIENoZWNrIGxlbmd0aCBmb3IgdGhlIHZhcmlvdXMgc3VwcG9ydGVkIE9JRHMKKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9HRU5fWE1JVF9FUlJPUjoKKwljYXNlIE9JRF9HRU5fUkNWX0VSUk9SOgorCWNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorI2lmbmRlZiBTS19ORElTXzY0QklUX0NUUgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisjZWxzZSAvKiBTS19ORElTXzY0QklUX0NUUiAqLworCisJCS8qCisJCSAqIGZvciBjb21wYXRpYmlsaXR5LCBhdCBsZWFzdCAzMmJpdCBhcmUgcmVxdWlyZWQgZm9yIG9pZAorCQkgKi8KKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKwkJCS8qCisJCQkqIGJ1dCBpbmRpY2F0ZSBoYW5kbGluZyBmb3IgNjRiaXQgdmFsdWVzLAorCQkJKiBpZiBpbnN1ZmZpY2llbnQgc3BhY2UgaXMgcHJvdmlkZWQKKwkJCSovCisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKwkJSXM2NEJpdFJlcSA9ICgqcExlbiA8IHNpemVvZihTS19VNjQpKSA/IFNLX0ZBTFNFIDogU0tfVFJVRTsKKyNlbmRpZiAvKiBTS19ORElTXzY0QklUX0NUUiAqLworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUE9SVF9OVU1CRVI6CisJY2FzZSBPSURfU0tHRV9ERVZJQ0VfVFlQRToKKwljYXNlIE9JRF9TS0dFX1JFU1VMVDoKKwljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9OVU1CRVI6CisJY2FzZSBPSURfR0VOX1RSQU5TTUlUX1FVRVVFX0xFTkdUSDoKKwljYXNlIE9JRF9TS0dFX1RSQVBfTlVNQkVSOgorCWNhc2UgT0lEX1NLR0VfTURCX1ZFUlNJT046CisJY2FzZSBPSURfU0tHRV9CT0FSRExFVkVMOgorCWNhc2UgT0lEX1NLR0VfQ0hJUElEOgorCWNhc2UgT0lEX1NLR0VfUkFNU0laRToKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQ0hJUFNFVDoKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UxNikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTE2KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQlVTX1RZUEU6CisJY2FzZSBPSURfU0tHRV9CVVNfU1BFRUQ6CisJY2FzZSBPSURfU0tHRV9CVVNfV0lEVEg6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfTlVNQkVSOgorCWNhc2UgT0lEX1NLR0VfQ0hLU01fTlVNQkVSOgorCWNhc2UgT0lEX1NLR0VfVkFVWEFWQUlMOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTgpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U4KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfU1dfUVVFVUVfTEVOOgorCWNhc2UgT0lEX1NLR0VfVFhfU1dfUVVFVUVfTUFYOgorCWNhc2UgT0lEX1NLR0VfVFhfUkVUUlk6CisJY2FzZSBPSURfU0tHRV9SWF9JTlRSX0NUUzoKKwljYXNlIE9JRF9TS0dFX1RYX0lOVFJfQ1RTOgorCWNhc2UgT0lEX1NLR0VfUlhfTk9fQlVGX0NUUzoKKwljYXNlIE9JRF9TS0dFX1RYX05PX0JVRl9DVFM6CisJY2FzZSBPSURfU0tHRV9UWF9VU0VEX0RFU0NSX05POgorCWNhc2UgT0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JYX09DVEVUU19ERUxJVl9DVFM6CisJY2FzZSBPSURfU0tHRV9SWF9IV19FUlJPUl9DVFM6CisJY2FzZSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFM6CisJY2FzZSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTOgorCWNhc2UgT0lEX1NLR0VfT1VUX0VSUk9SX0NUUzoKKwljYXNlIE9JRF9TS0dFX0VSUl9SRUNPVkVSWV9DVFM6CisJY2FzZSBPSURfU0tHRV9TWVNVUFRJTUU6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VNjQpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBDaGVja2VkIGxhdGVyICovCisJCWJyZWFrOworCX0KKworCS8qIFVwZGF0ZSBzdGF0aXN0aWMgKi8KKwlpZiAoSWQgPT0gT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX09VVF9FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX0dFTl9YTUlUX0VSUk9SIHx8CisJCUlkID09IE9JRF9HRU5fUkNWX0VSUk9SKSB7CisKKwkJLyogRm9yY2UgdGhlIFhNQUMgdG8gdXBkYXRlIGl0cyBzdGF0aXN0aWMgY291bnRlcnMgYW5kCisJCSAqIEluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzCisJCSAqIGFscmVhZHkgZG9uZS4KKwkJICovCisJCVJldCA9IE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSk7CisJCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChSZXQpOworCQl9CisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCQkvKgorCQkgKiBTb21lIE9JRHMgY29uc2lzdCBvZiBtdWx0aXBsZSBoYXJkd2FyZSBjb3VudGVycy4gVGhvc2UKKwkJICogdmFsdWVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYWxsIG9mIHRoZW0gd2lsbCBiZSBhZGRlZAorCQkgKiBub3cuCisJCSAqLworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9SWF9IV19FUlJPUl9DVFM6CisJCWNhc2UgT0lEX1NLR0VfSU5fRVJST1JTX0NUUzoKKwkJY2FzZSBPSURfR0VOX1JDVl9FUlJPUjoKKwkJCVZhbDY0UnhId0VycnMgPQorCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX01JU1NFRCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9GUkFNSU5HLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX09WRVJGTE9XLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0pBQkJFUiwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9DQVJSSUVSLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0lSTEVOR1RILCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX1NZTUJPTCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9TSE9SVFMsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfUlVOVCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9UT09fTE9ORywgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9GQ1MsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfQ0VYVCwgTmV0SW5kZXgpOworCSAgICAgICAgYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFM6CisJCWNhc2UgT0lEX1NLR0VfT1VUX0VSUk9SX0NUUzoKKwkJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6CisJCQlWYWw2NFR4SHdFcnJzID0KKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hUWF9FWENFU1NfQ09MLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFRYX0xBVEVfQ09MLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFRYX1VOREVSUlVOLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFRYX0NBUlJJRVIsIE5ldEluZGV4KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBSZXRyaWV2ZSB2YWx1ZQorCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX1NLR0VfU1VQUE9SVEVEX0xJU1Q6CisJCUxlbiA9IElEX1RBQkxFX1NJWkUgKiBzaXplb2YoU0tfVTMyKTsKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWZvciAoT2Zmc2V0ID0gMCwgSW5kZXggPSAwOyBPZmZzZXQgPCBMZW47CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMiksIEluZGV4ICsrKSB7CisKKwkJCVZhbDMyID0gKFNLX1UzMilJZFRhYmxlW0luZGV4XS5JZDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJfQorCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0JPQVJETEVWRUw6CisJCVZhbDMyID0gKFNLX1UzMilwQUMtPkdJbmkuR0lMZXZlbDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUE9SVF9OVU1CRVI6CisJCVZhbDMyID0gKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0RFVklDRV9UWVBFOgorCQlWYWwzMiA9IChTS19VMzIpcEFDLT5Qbm1pLkRldmljZVR5cGU7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0RSSVZFUl9ERVNDUjoKKwkJaWYgKHBBQy0+UG5taS5wRHJpdmVyRGVzY3JpcHRpb24gPT0gTlVMTCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA3LAorCQkJCVNLX1BOTUlfRVJSMDA3TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCUxlbiA9IFNLX1NUUkxFTihwQUMtPlBubWkucERyaXZlckRlc2NyaXB0aW9uKSArIDE7CisJCWlmIChMZW4gPiBTS19QTk1JX1NUUklOR0xFTjEpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyOSwKKwkJCQlTS19QTk1JX0VSUjAyOU1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJKnBCdWYgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwQnVmICsgMSwgcEFDLT5Qbm1pLnBEcml2ZXJEZXNjcmlwdGlvbiwgTGVuIC0gMSk7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfRFJJVkVSX1ZFUlNJT046CisJCWlmIChwQUMtPlBubWkucERyaXZlclZlcnNpb24gPT0gTlVMTCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMwLAorCQkJCVNLX1BOTUlfRVJSMDMwTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCUxlbiA9IFNLX1NUUkxFTihwQUMtPlBubWkucERyaXZlclZlcnNpb24pICsgMTsKKwkJaWYgKExlbiA+IFNLX1BOTUlfU1RSSU5HTEVOMSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMxLAorCQkJCVNLX1BOTUlfRVJSMDMxTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkqcEJ1ZiA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBCdWYgKyAxLCBwQUMtPlBubWkucERyaXZlclZlcnNpb24sIExlbiAtIDEpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0RSSVZFUl9SRUxEQVRFOgorCQlpZiAocEFDLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSA9PSBOVUxMKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzAsCisJCQkJU0tfUE5NSV9FUlIwNTNNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJTGVuID0gU0tfU1RSTEVOKHBBQy0+UG5taS5wRHJpdmVyUmVsZWFzZURhdGUpICsgMTsKKwkJaWYgKExlbiA+IFNLX1BOTUlfU1RSSU5HTEVOMSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMxLAorCQkJCVNLX1BOTUlfRVJSMDU0TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkqcEJ1ZiA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBCdWYgKyAxLCBwQUMtPlBubWkucERyaXZlclJlbGVhc2VEYXRlLCBMZW4gLSAxKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9EUklWRVJfRklMRU5BTUU6CisJCWlmIChwQUMtPlBubWkucERyaXZlckZpbGVOYW1lID09IE5VTEwpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMCwKKwkJCQlTS19QTk1JX0VSUjA1NU1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlMZW4gPSBTS19TVFJMRU4ocEFDLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSkgKyAxOworCQlpZiAoTGVuID4gU0tfUE5NSV9TVFJJTkdMRU4xKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzEsCisJCQkJU0tfUE5NSV9FUlIwNTZNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCSpwQnVmID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocEJ1ZiArIDEsIHBBQy0+UG5taS5wRHJpdmVyRmlsZU5hbWUsIExlbiAtIDEpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0hXX0RFU0NSOgorCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgZGVzY3JpcHRpb24gaXMgbG9jYXRlZCBpbiB0aGUgVlBELiBUaGlzCisJCSAqIHF1ZXJ5IG1heSBtb3ZlIHRvIHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBCdXQKKwkJICogdGhlIFZQRCBkYXRhIGlzIGNhY2hlZCBhbmQgdGhlcmVmb3JlIGEgY2FsbCBoZXJlCisJCSAqIHdpbGwgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlLgorCQkgKi8KKwkJTGVuID0gMjU2OworCQlpZiAoVnBkUmVhZChwQUMsIElvQywgVlBEX05BTUUsIEJ1ZiwgKGludCAqKSZMZW4pID4gMCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMyLAorCQkJCVNLX1BOTUlfRVJSMDMyTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCQlMZW4gKys7CisJCWlmIChMZW4gPiBTS19QTk1JX1NUUklOR0xFTjEpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMywKKwkJCQlTS19QTk1JX0VSUjAzM01TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCSpwQnVmID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocEJ1ZiArIDEsIEJ1ZiwgTGVuIC0gMSk7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfSFdfVkVSU0lPTjoKKwkJLyogT2gsIEkgbG92ZSB0byBkbyBzb21lIHN0cmluZyBtYW5pcHVsYXRpb24gKi8KKwkJaWYgKCpwTGVuIDwgNSkgeworCisJCQkqcExlbiA9IDU7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJVmFsOCA9IChTS19VOClwQUMtPkdJbmkuR0lQY2lId1JldjsKKwkJcEJ1ZlswXSA9IDQ7CisJCXBCdWZbMV0gPSAndic7CisJCXBCdWZbMl0gPSAoY2hhcikoMHgzMCB8ICgoVmFsOCA+PiA0KSAmIDB4MEYpKTsKKwkJcEJ1ZlszXSA9ICcuJzsKKwkJcEJ1Zls0XSA9IChjaGFyKSgweDMwIHwgKFZhbDggJiAweDBGKSk7CisJCSpwTGVuID0gNTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0NISVBTRVQ6CisJCVZhbDE2ID0gcEFDLT5Qbm1pLkNoaXBzZXQ7CisJCVNLX1BOTUlfU1RPUkVfVTE2KHBCdWYsIFZhbDE2KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTE2KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0NISVBJRDoKKwkJVmFsMzIgPSBwQUMtPkdJbmkuR0lDaGlwSWQ7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JBTVNJWkU6CisJCVZhbDMyID0gcEFDLT5HSW5pLkdJUmFtU2l6ZTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVkFVWEFWQUlMOgorCQkqcEJ1ZiA9IChjaGFyKSBwQUMtPkdJbmkuR0lWYXV4QXZhaWw7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQlVTX1RZUEU6CisJCSpwQnVmID0gKGNoYXIpIFNLX1BOTUlfQlVTX1BDSTsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9CVVNfU1BFRUQ6CisJCSpwQnVmID0gcEFDLT5Qbm1pLlBjaUJ1c1NwZWVkOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0JVU19XSURUSDoKKwkJKnBCdWYgPSBwQUMtPlBubWkuUGNpQnVzV2lkdGg7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUkVTVUxUOgorCQlWYWwzMiA9IHBBQy0+UG5taS5UZXN0UmVzdWx0OworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9TRU5TT1JfTlVNQkVSOgorCQkqcEJ1ZiA9IChjaGFyKXBBQy0+STJjLk1heFNlbnM7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQ0hLU01fTlVNQkVSOgorCQkqcEJ1ZiA9IFNLQ1NfTlVNX1BST1RPQ09MUzsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UUkFQX05VTUJFUjoKKwkJR2V0VHJhcFF1ZXVlTGVuKHBBQywgJkxlbiwgJlZhbCk7CisJCVZhbDMyID0gKFNLX1UzMilWYWw7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RSQVA6CisJCUdldFRyYXBRdWV1ZUxlbihwQUMsICZMZW4sICZWYWwpOworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJQ29weVRyYXBRdWV1ZShwQUMsIHBCdWYpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9OVU1CRVI6CisvKiBYWFggTm90IHlldCBpbXBsZW1lbnRlZCBieSBSTE1UIHRoZXJlZm9yZSB3ZSByZXR1cm4gemVybyBlbGVtZW50cyAqLworCQlWYWwzMiA9IDA7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX1NXX1FVRVVFX0xFTjoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZUxlbjsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeFN3UXVldWVMZW4gKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeFN3UXVldWVMZW47CisJCQl9CQkJCisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFN3UXVldWVMZW47CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhTd1F1ZXVlTGVuICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhTd1F1ZXVlTGVuOworCQkJfQkJCQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKworCWNhc2UgT0lEX1NLR0VfVFhfU1dfUVVFVUVfTUFYOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTWF4OworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4U3dRdWV1ZU1heCArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4U3dRdWV1ZU1heDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZU1heDsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeFN3UXVldWVNYXggKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeFN3UXVldWVNYXg7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfUkVUUlk6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeFJldHJ5Q3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4UmV0cnlDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeFJldHJ5Q3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhSZXRyeUN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeFJldHJ5Q3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhSZXRyeUN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SWF9JTlRSX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4SW50ckN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5SeEludHJDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5SeEludHJDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeEludHJDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX0lOVFJfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhJbnRyQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4SW50ckN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4SW50ckN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4SW50ckN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeEludHJDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeEludHJDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUlhfTk9fQlVGX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uUnhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlJ4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5SeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX05PX0JVRl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9VU0VEX0RFU0NSX05POgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhVc2VkRGVzY3JObzsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeFVzZWREZXNjck5vICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhVc2VkRGVzY3JObzsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4VXNlZERlc2NyTm87CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhVc2VkRGVzY3JObyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4VXNlZERlc2NyTm87CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4RGVsaXZlcmVkQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlJ4RGVsaXZlcmVkQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uUnhEZWxpdmVyZWRDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeERlbGl2ZXJlZEN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5SeERlbGl2ZXJlZEN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlJ4RGVsaXZlcmVkQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JYX09DVEVUU19ERUxJVl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5SeE9jdGV0c0RlbGl2ZXJlZEN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhPY3RldHNEZWxpdmVyZWRDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5SeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SWF9IV19FUlJPUl9DVFM6CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0UnhId0VycnMpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfSFdfRVJST1JfQ1RTOgorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NFR4SHdFcnJzKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0lOX0VSUk9SU19DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKyBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uUnhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKyBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMF0uUnhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfT1VUX0VSUk9SX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArIHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFswXS5UeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArIHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKworCQkJCQlwQUMtPlBubWkuUG9ydFswXS5UeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9FUlJfUkVDT1ZFUllfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uRXJyUmVjb3ZlcnlDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uRXJyUmVjb3ZlcnlDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5FcnJSZWNvdmVyeUN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLkVyclJlY292ZXJ5Q3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLkVyclJlY292ZXJ5Q3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uRXJyUmVjb3ZlcnlDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfU1lTVVBUSU1FOgorCQlWYWw2NCA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKFNrT3NHZXRUaW1lKHBBQykpOworCQlWYWw2NCAtPSBwQUMtPlBubWkuU3RhcnRVcFRpbWU7CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX01EQl9WRVJTSU9OOgorCQlWYWwzMiA9IFNLX1BOTUlfTURCX1ZFUlNJT047CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9HRU5fUkNWX0VSUk9SOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsgcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCX0KKwkJZWxzZSB7CisJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKyBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJfQorCisJCS8qCisJCSAqIGJ5IGRlZmF1bHQgMzJiaXQgdmFsdWVzIGFyZSBldmFsdWF0ZWQKKwkJICovCisJCWlmICghSXM2NEJpdFJlcSkgeworCQkJVmFsMzIgPSAoU0tfVTMyKVZhbDY0OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9HRU5fWE1JVF9FUlJPUjoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArIHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQl9CisJCWVsc2UgeworCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsgcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCX0KKworCQkvKgorCQkgKiBieSBkZWZhdWx0IDMyYml0IHZhbHVlcyBhcmUgZXZhbHVhdGVkCisJCSAqLworCQlpZiAoIUlzNjRCaXRSZXEpIHsKKwkJCVZhbDMyID0gKFNLX1UzMilWYWw2NDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCX0KKwkJZWxzZSB7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQl9CisJCWVsc2UgeworCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJfQorCisJCS8qCisJCSAqIGJ5IGRlZmF1bHQgMzJiaXQgdmFsdWVzIGFyZSBldmFsdWF0ZWQKKwkJICovCisJCWlmICghSXM2NEJpdFJlcSkgeworCQkJVmFsMzIgPSAoU0tfVTMyKVZhbDY0OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIOgorCQlWYWwzMiA9IChTS19VMzIpcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZUxlbjsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzQsCisJCQlTS19QTk1JX0VSUjAzNE1TRyk7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCWlmIChJZCA9PSBPSURfU0tHRV9SWF9IV19FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfVFhfSFdfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX0lOX0VSUk9SU19DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfT1VUX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfR0VOX1hNSVRfRVJST1IgfHwKKwkJSWQgPT0gT0lEX0dFTl9SQ1ZfRVJST1IpIHsKKworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJsbXQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9STE1UX1hYWCBzaW5nbGUgaW5zdGFuY2UuCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQvUHJlc2V0cy9TZXRzIHRoZSBSTE1UIE9JRHMuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBSbG10KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CQlSZXQ7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCVNLX1UzMgkJVmFsMzI7CisJU0tfVTY0CQlWYWw2NDsKKworCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gT25seSBzaW5nbGUgaW5zdGFuY2UgT0lEcyBhcmUgYWxsb3dlZCBoZXJlLgorCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCS8qCisJICogUGVyZm9ybSB0aGUgcmVxdWVzdGVkIGFjdGlvbi4KKwkgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgbGFyZ2UgZW5vdWdoLgorCQkgKi8KKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX01PREU6CisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRToKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfUFJFRkVSUkVEOgorCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1U4KSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTgpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX05VTUJFUjoKKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfQ1RTOgorCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RJTUU6CisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfRVNUSU06CisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVEhSRVM6CisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTY0KSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzNSwKKwkJCQlTS19QTk1JX0VSUjAzNU1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgUkxNVCBzdGF0aXN0aWMgYW5kIGluY3JlbWVudCBzZW1hcGhvcmVzIHRvIGluZGljYXRlCisJCSAqIHRoYXQgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuIE1heWJlIFJMTVQgd2lsbCBob2xkIGl0cworCQkgKiBzdGF0aXN0aWMgYWx3YXlzIHVwIHRvIGRhdGUgc29tZSB0aW1lLiBUaGVuIHdlIGNhbgorCQkgKiByZW1vdmUgdGhpcyB0eXBlIG9mIGNhbGwuCisJCSAqLworCQlpZiAoKFJldCA9IFJsbXRVcGRhdGUocEFDLCBJb0MsIE5ldEluZGV4KSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChSZXQpOworCQl9CisJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgKys7CisKKwkJLyoKKwkJICogUmV0cmlldmUgVmFsdWUKKwkJKi8KKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT0RFOgorCQkJKnBCdWYgPSAoY2hhcilwQUMtPlJsbXQuTmV0WzBdLlJsbXRNb2RlOworCQkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVI6CisJCQlWYWwzMiA9IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRToKKwkJCSpwQnVmID0gMDsKKwkJCS8qCisJCQkgKiBJZiBtdWx0aXBsZSBwb3J0cyBtYXkgYmVjb21lIGFjdGl2ZSB0aGlzIE9JRAorCQkJICogZG9lc24ndCBtYWtlIHNlbnNlIGFueSBtb3JlLiBBIG5ldyB2YXJpYWJsZSBpbgorCQkJICogdGhlIHBvcnQgc3RydWN0dXJlIHNob3VsZCBiZSBjcmVhdGVkLiBIb3dldmVyLAorCQkJICogZm9yIHRoaXMgdmFyaWFibGUgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0IGlzCisJCQkgKiByZXR1cm5lZC4KKwkJCSAqLworCQkJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7IFBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQlpZiAocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQkJCSpwQnVmID0gKGNoYXIpU0tfUE5NSV9QT1JUX1BIWVMyTE9HKFBoeXNQb3J0SW5kZXgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRDoKKwkJCSpwQnVmID0gKGNoYXIpU0tfUE5NSV9QT1JUX1BIWVMyTE9HKHBBQy0+UmxtdC5OZXRbTmV0SW5kZXhdLlByZWZlcmVuY2UpOworCQkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLlJsbXRDaGFuZ2VDdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USU1FOgorCQkJVmFsNjQgPSBwQUMtPlBubWkuUmxtdENoYW5nZVRpbWU7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9FU1RJTToKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RpbWF0ZTsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RIUkVTOgorCQkJVmFsNjQgPSBwQUMtPlBubWkuUmxtdENoYW5nZVRocmVzaG9sZDsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfRVJSLAorCQkJCSgiUmxtdDogVW5rbm93biBPSUQgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIikpOworCisJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJfQorCWVsc2UgeworCQkvKiBQZXJmb3JtIGEgcHJlc2V0IG9yIHNldCAqLworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX01PREU6CisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBwbGF1c2libGUgKi8KKwkJCWlmICgqcExlbiA8IHNpemVvZihjaGFyKSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJLyogQ2hlY2sgaWYgdGhlIHZhbHVlIHJhbmdlIGlzIGNvcnJlY3QgKi8KKwkJCWlmICgqcExlbiAhPSBzaXplb2YoY2hhcikgfHwKKwkJCQkoKnBCdWYgJiBTS19QTk1JX1JMTVRfTU9ERV9DSEtfTElOSykgPT0gMCB8fAorCQkJCSooU0tfVTggKilwQnVmID4gMTUpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCQkJLyogU2VuZCBhbiBldmVudCB0byBSTE1UIHRvIGNoYW5nZSB0aGUgbW9kZSAqLworCQkJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJCQlFdmVudFBhcmFtLlBhcmEzMlswXSB8PSAoU0tfVTMyKSgqcEJ1Zik7CisJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IDA7CisJCQlpZiAoU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfTU9ERV9DSEFOR0UsCisJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDM3LAorCQkJCQlTS19QTk1JX0VSUjAzN01TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRDoKKwkJCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgbGVuZ3RoIGlzIHBsYXVzaWJsZSAqLworCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKGNoYXIpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQkvKiBDaGVjayBpZiB0aGUgdmFsdWUgcmFuZ2UgaXMgY29ycmVjdCAqLworCQkJaWYgKCpwTGVuICE9IHNpemVvZihjaGFyKSB8fCAqKFNLX1U4ICopcEJ1ZiA+CisJCQkJKFNLX1U4KXBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZW5kIGFuIGV2ZW50IHRvIFJMTVQgY2hhbmdlIHRoZSBwcmVmZXJyZWQgcG9ydC4KKwkJCSAqIEEgcGFyYW0gb2YgLTEgbWVhbnMgYXV0b21hdGljIG1vZGUuIFJMTVQgd2lsbAorCQkJICogbWFrZSB0aGUgZGVjaXNpb24gd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBwb3J0LgorCQkJICovCisJCQlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gKFNLX1UzMikoKnBCdWYpIC0gMTsKKwkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gTmV0SW5kZXg7CisJCQlpZiAoU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFLAorCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzOCwKKwkJCQkJU0tfUE5NSV9FUlIwMzhNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RIUkVTOgorCQkJLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgcGxhdXNpYmxlICovCisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTY0KSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQkvKgorCQkJICogVGhlcmUgYXJlIG5vdCBtYW55IHJlc3RyaWN0aW9ucyB0byB0aGUKKwkJCSAqIHZhbHVlIHJhbmdlLgorCQkJICovCisJCQlpZiAoKnBMZW4gIT0gc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCQkvKiBBIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgbmV3IHRocmVzaG9sZCwgd2hpY2ggd2lsbCBiZSB0YWtlbgorCQkJICogb24gdGhlIG5leHQgdGltZXIgZXZlbnQuCisJCQkgKi8KKwkJCVNLX1BOTUlfUkVBRF9VNjQocEJ1ZiwgVmFsNjQpOworCQkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaHJlc2hvbGQgPSBWYWw2NDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBUaGUgb3RoZXIgT0lEcyBhcmUgbm90IGJlIGFibGUgZm9yIHNldCAqLworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCQl9CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJsbXRTdGF0IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfUkxNVF9YWFggbXVsdGlwbGUgaW5zdGFuY2UuCisgKgorICogRGVzY3JpcHRpb246CisgKglQZXJmb3JtcyBnZXQgcmVxdWVzdHMgb24gbXVsdGlwbGUgaW5zdGFuY2UgdmFyaWFibGVzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgUmxtdFN0YXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJaW50CQlSZXQ7CisJU0tfVTMyCQlWYWwzMjsKKwlTS19VNjQJCVZhbDY0OworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHBvcnQgaW5kZXhlcyBmcm9tIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeworCQkvKiBDaGVjayBpbnN0YW5jZSByYW5nZSAqLworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gUGh5c1BvcnRNYXgpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCisJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQlQaHlzUG9ydEluZGV4ID0gSW5zdGFuY2UgLSAxOworCisJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQlQaHlzUG9ydEluZGV4ID0gTmV0SW5kZXg7CisJCX0KKworCQkvKiBCb3RoIG5ldCBtb2RlcyAqLworCQlMaW1pdCA9IFBoeXNQb3J0SW5kZXggKyAxOworCX0KKwllbHNlIHsKKwkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCVBoeXNQb3J0SW5kZXggPSAwOworCQlMaW1pdCA9IFBoeXNQb3J0TWF4OworCisJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQlQaHlzUG9ydEluZGV4ID0gTmV0SW5kZXg7CisJCQlMaW1pdCA9IFBoeXNQb3J0SW5kZXggKyAxOworCQl9CisJfQorCisJLyoKKwkgKiBDdXJyZW50bHkgb25seSBnZXQgcmVxdWVzdHMgYXJlIGFsbG93ZWQuCisJICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgbGFyZ2UgZW5vdWdoLgorCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX0lOREVYOgorCWNhc2UgT0lEX1NLR0VfUkxNVF9TVEFUVVM6CisJCWlmICgqcExlbiA8IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9STE1UX1RYX0hFTExPX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JMTVRfUlhfSEVMTE9fQ1RTOgorCWNhc2UgT0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTOgorCWNhc2UgT0lEX1NLR0VfUkxNVF9SWF9TUF9DVFM6CisJCWlmICgqcExlbiA8IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VNjQpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzOSwKKwkJCVNLX1BOTUlfRVJSMDM5TVNHKTsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBzdGF0aXN0aWMgYW5kIGluY3JlbWVudCBzZW1hcGhvcmVzIHRvIGluZGljYXRlIHRoYXQKKwkgKiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4KKwkgKi8KKwlpZiAoKFJldCA9IFJsbXRVcGRhdGUocEFDLCBJb0MsIE5ldEluZGV4KSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoUmV0KTsKKwl9CisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyArKzsKKworCS8qCisJICogR2V0IHZhbHVlCisJICovCisJT2Zmc2V0ID0gMDsKKwlmb3IgKDsgUGh5c1BvcnRJbmRleCA8IExpbWl0OyBQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX0lOREVYOgorCQkJVmFsMzIgPSBQaHlzUG9ydEluZGV4OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1NUQVRVUzoKKwkJCWlmIChwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5Qb3J0U3RhdGUgPT0KKwkJCQlTS19STE1UX1BTX0lOSVQgfHwKKwkJCQlwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5Qb3J0U3RhdGUgPT0KKwkJCQlTS19STE1UX1BTX0RPV04pIHsKKworCQkJCVZhbDMyID0gU0tfUE5NSV9STE1UX1NUQVRVU19FUlJPUjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJCVZhbDMyID0gU0tfUE5NSV9STE1UX1NUQVRVU19BQ1RJVkU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlWYWwzMiA9IFNLX1BOTUlfUkxNVF9TVEFUVVNfU1RBTkRCWTsKKwkJCX0KKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFM6CisJCQlWYWw2NCA9IHBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlR4SGVsbG9DdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUlhfSEVMTE9fQ1RTOgorCQkJVmFsNjQgPSBwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5SeEhlbGxvQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1RYX1NQX1JFUV9DVFM6CisJCQlWYWw2NCA9IHBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlR4U3BIZWxsb1JlcUN0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9SWF9TUF9DVFM6CisJCQlWYWw2NCA9IHBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlJ4U3BIZWxsb0N0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJSbG10U3RhdDogVW5rbm93biBPSUQgc2hvdWxkIGJlIGVycm9yZWQgYmVmb3JlIikpOworCisJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0KKwkqcExlbiA9IE9mZnNldDsKKworCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjUHJpdmF0ZUNvbmYgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURzIGNvbmNlcm5pbmcgdGhlIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldC9QcmVzZXRzL1NldHMgdGhlIE9JRHMgY29uY2VybmluZyB0aGUgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IE1hY1ByaXZhdGVDb25mKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlMb2dQb3J0TWF4OworCXVuc2lnbmVkIGludAlMb2dQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJY2hhcgkJVmFsODsKKwljaGFyIAkJKnBCdWZQdHI7CisJaW50CQkJUmV0OworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCVNLX1UzMgkJVmFsMzI7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQuIE1BQyBpbmRleCAwIGlzIHRoZSB2aXJ0dWFsIE1BQy4KKwkgKi8KKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwlMb2dQb3J0TWF4ID0gU0tfUE5NSV9QT1JUX1BIWVMyTE9HKFBoeXNQb3J0TWF4KTsKKworCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeyAvKiBEdWFsIG5ldCBtb2RlICovCisJCUxvZ1BvcnRNYXgtLTsKKwl9CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsgLyogT25seSBvbmUgc3BlY2lmaWMgaW5zdGFuY2UgaXMgcXVlcmllZCAqLworCQkvKiBDaGVjayBpbnN0YW5jZSByYW5nZSAqLworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gTG9nUG9ydE1heCkpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJCUxvZ1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9JTlNUMkxPRyhJbnN0YW5jZSk7CisJCUxpbWl0ID0gTG9nUG9ydEluZGV4ICsgMTsKKwl9CisKKwllbHNlIHsgLyogSW5zdGFuY2UgPT0gKFNLX1UzMikoLTEpLCBnZXQgYWxsIEluc3RhbmNlcyBvZiB0aGF0IE9JRCAqLworCisJCUxvZ1BvcnRJbmRleCA9IDA7CisJCUxpbWl0ID0gTG9nUG9ydE1heDsKKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gYWN0aW9uCisJICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCS8qIENoZWNrIGxlbmd0aCAqLworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9QTUQ6CisJCWNhc2UgT0lEX1NLR0VfQ09OTkVDVE9SOgorCQljYXNlIE9JRF9TS0dFX0xJTktfQ0FQOgorCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTOgorCQljYXNlIE9JRF9TS0dFX0xJTktfU1RBVFVTOgorCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX0NBUDoKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUzoKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUDoKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREU6CisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVM6CisJCWNhc2UgT0lEX1NLR0VfU1BFRURfQ0FQOgorCQljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCWNhc2UgT0lEX1NLR0VfU1BFRURfU1RBVFVTOgorI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisJCWNhc2UgT0lEX1NLR0VfUEhZX0xQX01PREU6CisjZW5kaWYKKwkJCWlmICgqcExlbiA8IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTgpKSB7CisKKwkJCQkqcExlbiA9IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTgpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCisgICAgICAgIGNhc2UgT0lEX1NLR0VfTVRVOgorICAgICAgICBjYXNlIE9JRF9TS0dFX1BIWV9UWVBFOgorCQkJaWYgKCpwTGVuIDwgKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpKSB7CisKKwkJCQkqcExlbiA9IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0MSwKKwkJCQlTS19QTk1JX0VSUjA0MU1TRyk7CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHN0YXRpc3RpYyBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLgorCQkgKi8KKwkJaWYgKChSZXQgPSBTaXJxVXBkYXRlKHBBQywgSW9DKSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChSZXQpOworCQl9CisJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgKys7CisKKwkJLyoKKwkJICogR2V0IHZhbHVlCisJCSAqLworCQlPZmZzZXQgPSAwOworCQlmb3IgKDsgTG9nUG9ydEluZGV4IDwgTGltaXQ7IExvZ1BvcnRJbmRleCArKykgeworCisJCQlwQnVmUHRyID0gcEJ1ZiArIE9mZnNldDsKKwkJCQorCQkJc3dpdGNoIChJZCkgeworCisJCQljYXNlIE9JRF9TS0dFX1BNRDoKKwkJCQkqcEJ1ZlB0ciA9IHBBQy0+UG5taS5QTUQ7CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9DT05ORUNUT1I6CisJCQkJKnBCdWZQdHIgPSBwQUMtPlBubWkuQ29ubmVjdG9yOworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZX1RZUEU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJCQlWYWwzMiA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QaHlUeXBlOworCQkJCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZlB0ciwgVmFsMzIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQkKKwkJCQkJVmFsMzIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBoeVR5cGU7CisJCQkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWZQdHIsIFZhbDMyKTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJCWJyZWFrOworCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwkJCWNhc2UgT0lEX1NLR0VfUEhZX0xQX01PREU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJCQlWYWw4ID0gKFNLX1U4KSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGU7CisJCQkJCQkqcEJ1ZlB0ciA9IFZhbDg7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCQorCQkJCQlWYWw4ID0gKFNLX1U4KSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGU7CisJCQkJCSpwQnVmUHRyID0gVmFsODsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKworCQkJY2FzZSBPSURfU0tHRV9MSU5LX0NBUDoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtDYXA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUExpbmtDYXA7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua01vZGVDb25mOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUExpbmtNb2RlQ29uZjsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJCSpwQnVmUHRyID0KKwkJCQkJCQlDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IENhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzKHBBQywgSW9DLCBOZXRJbmRleCk7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfTElOS19TVEFUVVM6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IENhbGN1bGF0ZUxpbmtTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCisJCQkJCSpwQnVmUHRyID0gQ2FsY3VsYXRlTGlua1N0YXR1cyhwQUMsIElvQywgTmV0SW5kZXgpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX0NBUDoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBGbG93Q3RybENhcDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBGbG93Q3RybENhcDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QRmxvd0N0cmxNb2RlOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QRmxvd0N0cmxNb2RlOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUzoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUEZsb3dDdHJsU3RhdHVzOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QRmxvd0N0cmxTdGF0dXM7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVA6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTVNDYXA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTVNDYXA7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBNU01vZGU7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTVNNb2RlOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTVNTdGF0dXM7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTVNTdGF0dXM7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfU1BFRURfQ0FQOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtTcGVlZENhcDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBMaW5rU3BlZWRDYXA7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtTcGVlZDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKworCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUExpbmtTcGVlZDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9TUEVFRF9TVEFUVVM6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rU3BlZWRVc2VkOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTGlua1NwZWVkVXNlZDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBPSURfU0tHRV9NVFU6CisJCQkJVmFsMzIgPSBTS19EUklWRVJfR0VUX01UVShwQUMsIElvQywgTmV0SW5kZXgpOworCQkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWZQdHIsIFZhbDMyKTsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfRVJSLAorCQkJCQkoIk1hY1ByaXZhdGVDb25mOiBVbmtub3duIE9JRCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUiKSk7CisKKwkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCX0KKwkJKnBMZW4gPSBPZmZzZXQ7CisJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJLyoKKwkgKiBGcm9tIGhlcmUgU0VUIG9yIFBSRVNFVCBhY3Rpb24uIENoZWNrIGlmIHRoZSBwYXNzZWQKKwkgKiBidWZmZXIgbGVuZ3RoIGlzIHBsYXVzaWJsZS4KKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREU6CisJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQlpZiAoKnBMZW4gPCBMaW1pdCAtIExvZ1BvcnRJbmRleCkgeworCisJCQkqcExlbiA9IExpbWl0IC0gTG9nUG9ydEluZGV4OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWlmICgqcExlbiAhPSBMaW1pdCAtIExvZ1BvcnRJbmRleCkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCWNhc2UgT0lEX1NLR0VfUEhZX0xQX01PREU6CisJCWlmICgqcExlbiA8IExpbWl0IC0gTG9nUG9ydEluZGV4KSB7CisKKwkJCSpwTGVuID0gTGltaXQgLSBMb2dQb3J0SW5kZXg7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgT0lEX1NLR0VfTVRVOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWlmICgqcExlbiAhPSBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCX0KKwkJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gcHJlc2V0IG9yIHNldAorCSAqLworCU9mZnNldCA9IDA7CisJZm9yICg7IExvZ1BvcnRJbmRleCA8IExpbWl0OyBMb2dQb3J0SW5kZXggKyspIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJCQkvKiBDaGVjayB0aGUgdmFsdWUgcmFuZ2UgKi8KKwkJCVZhbDggPSAqKHBCdWYgKyBPZmZzZXQpOworCQkJaWYgKFZhbDggPT0gMCkgeworCisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChWYWw4IDwgU0tfTE1PREVfSEFMRiB8fAorCQkJCShMb2dQb3J0SW5kZXggIT0gMCAmJiBWYWw4ID4gU0tfTE1PREVfQVVUT1NFTlNFKSB8fAorCQkJCShMb2dQb3J0SW5kZXggPT0gMCAmJiBWYWw4ID4gU0tfTE1PREVfSU5ERVRFUk1JTkFURUQpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCisJCQkJLyoKKwkJCQkgKiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKwkJCQkgKiBhY3RpdmUgcG9ydHMuIEZpbmQgdGhlbSBhbmQgc2VuZCBhbiBldmVudAorCQkJCSAqIHdpdGggdGhlIG5ldyBsaW5rIG1vZGUgdG8gU0lSUS4KKwkJCQkgKi8KKwkJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOworCQkJCQlQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCQkJQWN0aXZlRmxhZykgeworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQkJU0tfSFdFVl9TRVRfTE1PREUsCisJCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQzLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQzTVNHKTsKKworCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBhbiBldmVudCB3aXRoIHRoZSBuZXcgbGluayBtb2RlIHRvCisJCQkJICogdGhlIFNJUlEgbW9kdWxlLgorCQkJCSAqLworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsIFNLX0hXRVZfU0VUX0xNT0RFLAorCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjA0MywKKwkJCQkJCVNLX1BOTUlfRVJSMDQzTVNHKTsKKworCQkJCQkqcExlbiA9IDA7CisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCQkJfQorCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwkJCS8qIENoZWNrIHRoZSB2YWx1ZSByYW5nZSAqLworCQkJVmFsOCA9ICoocEJ1ZiArIE9mZnNldCk7CisJCQlpZiAoVmFsOCA9PSAwKSB7CisKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFZhbDggPCBTS19GTE9XX01PREVfTk9ORSB8fAorCQkJCShMb2dQb3J0SW5kZXggIT0gMCAmJiBWYWw4ID4gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU0pIHx8CisJCQkJKExvZ1BvcnRJbmRleCA9PSAwICYmIFZhbDggPiBTS19GTE9XX01PREVfSU5ERVRFUk1JTkFURUQpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCisJCQkJLyoKKwkJCQkgKiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKwkJCQkgKiBhY3RpdmUgcG9ydHMuIEZpbmQgdGhlbSBhbmQgc2VuZCBhbiBldmVudAorCQkJCSAqIHdpdGggdGhlIG5ldyBmbG93IGNvbnRyb2wgbW9kZSB0byBTSVJRLgorCQkJCSAqLworCQkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7CisJCQkJCVBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJCQlBY3RpdmVGbGFnKSB7CisKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCQlTS19IV0VWX1NFVF9GTE9XTU9ERSwKKwkJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQkJU0tfUE5NSV9FUlIwNDQsCisJCQkJCQkJU0tfUE5NSV9FUlIwNDRNU0cpOworCisJCQkJCQkqcExlbiA9IDA7CisJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIGFuIGV2ZW50IHdpdGggdGhlIG5ldyBmbG93IGNvbnRyb2wKKwkJCQkgKiBtb2RlIHRvIHRoZSBTSVJRIG1vZHVsZS4KKwkJCQkgKi8KKwkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQlTS19IV0VWX1NFVF9GTE9XTU9ERSwgRXZlbnRQYXJhbSkKKwkJCQkJPiAwKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwNDQsCisJCQkJCQlTS19QTk1JX0VSUjA0NE1TRyk7CisKKwkJCQkJKnBMZW4gPSAwOworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKwkJCX0KKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERSA6CisJCQkvKiBDaGVjayB0aGUgdmFsdWUgcmFuZ2UgKi8KKwkJCVZhbDggPSAqKHBCdWYgKyBPZmZzZXQpOworCQkJaWYgKFZhbDggPT0gMCkgeworCQkJCS8qIG1vZGUgb2YgdGhpcyBwb3J0IHJlbWFpbnMgdW5jaGFuZ2VkICovCisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChWYWw4IDwgU0tfTVNfTU9ERV9BVVRPIHx8CisJCQkJKExvZ1BvcnRJbmRleCAhPSAwICYmIFZhbDggPiBTS19NU19NT0RFX1NMQVZFKSB8fAorCQkJCShMb2dQb3J0SW5kZXggPT0gMCAmJiBWYWw4ID4gU0tfTVNfTU9ERV9JTkRFVEVSTUlOQVRFRCkpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisKKwkJCQkvKgorCQkJCSAqIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorCQkJCSAqIGFjdGl2ZSBwb3J0cy4gRmluZCB0aGVtIGFuZCBzZW5kIGFuIGV2ZW50CisJCQkJICogd2l0aCBuZXcgbWFzdGVyL3NsYXZlIChyb2xlKSBtb2RlIHRvIFNJUlEuCisJCQkJICovCisJCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsKKwkJCQkJUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkJCUFjdGl2ZUZsYWcpIHsKKworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJCVNLX0hXRVZfU0VUX1JPTEUsCisJCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQyLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQyTVNHKTsKKworCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBhbiBldmVudCB3aXRoIHRoZSBuZXcgbWFzdGVyL3NsYXZlCisJCQkJICogKHJvbGUpIG1vZGUgdG8gdGhlIFNJUlEgbW9kdWxlLgorCQkJCSAqLworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCVNLX0hXRVZfU0VUX1JPTEUsIEV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDQyLAorCQkJCQkJU0tfUE5NSV9FUlIwNDJNU0cpOworCisJCQkJCSpwTGVuID0gMDsKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisJCQl9CisKKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCQkvKiBDaGVjayB0aGUgdmFsdWUgcmFuZ2UgKi8KKwkJCVZhbDggPSAqKHBCdWYgKyBPZmZzZXQpOworCQkJaWYgKFZhbDggPT0gMCkgeworCisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChWYWw4IDwgKFNLX0xTUEVFRF9BVVRPKSB8fAorCQkJCShMb2dQb3J0SW5kZXggIT0gMCAmJiBWYWw4ID4gKFNLX0xTUEVFRF8xMDAwTUJQUykpIHx8CisJCQkJKExvZ1BvcnRJbmRleCA9PSAwICYmIFZhbDggPiAoU0tfTFNQRUVEX0lOREVURVJNSU5BVEVEKSkpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisKKwkJCQkvKgorCQkJCSAqIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorCQkJCSAqIGFjdGl2ZSBwb3J0cy4gRmluZCB0aGVtIGFuZCBzZW5kIGFuIGV2ZW50CisJCQkJICogd2l0aCB0aGUgbmV3IGZsb3cgY29udHJvbCBtb2RlIHRvIFNJUlEuCisJCQkJICovCisJCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsKKwkJCQkJUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCQlTS19IV0VWX1NFVF9TUEVFRCwKKwkJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQkJU0tfUE5NSV9FUlIwNDUsCisJCQkJCQkJU0tfUE5NSV9FUlIwNDVNU0cpOworCisJCQkJCQkqcExlbiA9IDA7CisJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIGFuIGV2ZW50IHdpdGggdGhlIG5ldyBmbG93IGNvbnRyb2wKKwkJCQkgKiBtb2RlIHRvIHRoZSBTSVJRIG1vZHVsZS4KKwkJCQkgKi8KKwkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQlTS19IV0VWX1NFVF9TUEVFRCwKKwkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwNDUsCisJCQkJCQlTS19QTk1JX0VSUjA0NU1TRyk7CisKKwkJCQkJKnBMZW4gPSAwOworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKwkJCX0KKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX01UVSA6CisJCQkvKiBDaGVjayB0aGUgdmFsdWUgcmFuZ2UgKi8KKwkJCVZhbDMyID0gKihTS19VMzIqKShwQnVmICsgT2Zmc2V0KTsKKwkJCWlmIChWYWwzMiA9PSAwKSB7CisJCQkJLyogbXR1IG9mIHRoaXMgcG9ydCByZW1haW5zIHVuY2hhbmdlZCAqLworCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChTS19EUklWRVJfUFJFU0VUX01UVShwQUMsIElvQywgTmV0SW5kZXgsIFZhbDMyKSAhPSAwKSB7CisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKFNLX0RSSVZFUl9TRVRfTVRVKHBBQywgSW9DLCBOZXRJbmRleCwgVmFsMzIpICE9IDApIHsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKwkJCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwkJY2FzZSBPSURfU0tHRV9QSFlfTFBfTU9ERToKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQlPZmZzZXQgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8qIFNldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJc3dpdGNoICgqKHBCdWYgKyBPZmZzZXQpKSB7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJLyogSWYgTG93UG93ZXJNb2RlIGlzIGFjdGl2ZSwgd2UgY2FuIGxlYXZlIGl0LiAqLworCQkJCQkJCWlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUpIHsKKworCQkJCQkJCQlWYWwzMiA9IFNrR21MZWF2ZUxvd1Bvd2VyTW9kZShwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlIDwgMykJeworCQkJCQkJCQkJCisJCQkJCQkJCQlTa0RydkluaXRBZGFwdGVyKHBBQyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQkqcExlbiA9IDA7CisJCQkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCQkJfQorCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSAyOgorCQkJCQkJY2FzZSAzOgorCQkJCQkJY2FzZSA0OgorCQkJCQkJCS8qIElmIG5vIExvd1Bvd2VyTW9kZSBpcyBhY3RpdmUsIHdlIGNhbiBlbnRlciBpdC4gKi8KKwkJCQkJCQlpZiAoIXBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSkgeworCisJCQkJCQkJCWlmICgoKihwQnVmICsgT2Zmc2V0KSkgPCAzKQl7CisJCQkJCQkJCQorCQkJCQkJCQkJU2tEcnZEZUluaXRBZGFwdGVyKHBBQyk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlWYWwzMiA9IFNrR21FbnRlckxvd1Bvd2VyTW9kZShwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgKnBCdWYpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJCQl9CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQlzd2l0Y2ggKCoocEJ1ZiArIE9mZnNldCkpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJLyogSWYgd2UgYXJlIGluIGEgTG93UG93ZXJNb2RlLCB3ZSBjYW4gbGVhdmUgaXQuICovCisJCQkJCQlpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlKSB7CisKKwkJCQkJCQlWYWwzMiA9IFNrR21MZWF2ZUxvd1Bvd2VyTW9kZShwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisJCQkJCQkJCisJCQkJCQkJaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSA8IDMpCXsKKworCQkJCQkJCQlTa0RydkluaXRBZGFwdGVyKHBBQyk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZSB7CisJCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCQl9CisJCQkJCQorCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgMjoKKwkJCQkJY2FzZSAzOgorCQkJCQljYXNlIDQ6CisJCQkJCQkvKiBJZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gTG93UG93ZXJNb2RlLCB3ZSBjYW4gZW50ZXIgaXQuICovCisJCQkJCQlpZiAoIXBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSkgeworCisJCQkJCQkJaWYgKCgqKHBCdWYgKyBPZmZzZXQpKSA8IDMpCXsKKworCQkJCQkJCQlTa0RydkRlSW5pdEFkYXB0ZXIocEFDKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisKKwkJCQkJCQkJVmFsMzIgPSBTa0dtRW50ZXJMb3dQb3dlck1vZGUocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsICpwQnVmKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQkqcExlbiA9IDA7CisJCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJCX0KKwkJCQkJCisJCQkJCWRlZmF1bHQ6CisJCQkJCQkqcExlbiA9IDA7CisJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQkJfQorCQkJfQorCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9FUlIsCisgICAgICAgICAgICAgICAgKCJNYWNQcml2YXRlQ29uZjogVW5rbm93biBPSUQgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHNldCIpKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb25pdG9yIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gZm9yIFJMTVRfTU9OSVRPUl9YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUJlY2F1c2UgUkxNVCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbW9uaXRvcmluZyBvZgorICoJcmVtb3RlIGFkYXB0ZXIgY2FyZHMsIHdlIHJldHVybiBhbHdheXMgYW4gZW1wdHkgdGFibGUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBNb25pdG9yKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CUluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCXVuc2lnbmVkIGludAlFbnRyaWVzOworCisJCisJLyoKKwkgKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkLgorCSAqLworCS8qIFhYWCBOb3QgeWV0IGltcGxlbWVudGVkLiBSZXR1cm4gYWx3YXlzIGFuIGVtcHR5IHRhYmxlLiAqLworCUVudHJpZXMgPSAwOworCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7CisKKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IEVudHJpZXMpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCisJCUluZGV4ID0gKHVuc2lnbmVkIGludClJbnN0YW5jZSAtIDE7CisJCUxpbWl0ID0gKHVuc2lnbmVkIGludClJbnN0YW5jZTsKKwl9CisJZWxzZSB7CisJCUluZGV4ID0gMDsKKwkJTGltaXQgPSBFbnRyaWVzOworCX0KKworCS8qCisJICogR2V0L1NldCB2YWx1ZQorCSovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCWZvciAoT2Zmc2V0PTA7IEluZGV4IDwgTGltaXQ7IEluZGV4ICsrKSB7CisKKwkJCXN3aXRjaCAoSWQpIHsKKworCQkJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfSU5ERVg6CisJCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRERSOgorCQkJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfRVJSUzoKKwkJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX1RJTUVTVEFNUDoKKwkJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0FETUlOOgorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDYsCisJCQkJCVNLX1BOTUlfRVJSMDQ2TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQl9CisJCSpwTGVuID0gT2Zmc2V0OworCX0KKwllbHNlIHsKKwkJLyogT25seSBNT05JVE9SX0FETUlOIGNhbiBiZSBzZXQgKi8KKwkJaWYgKElkICE9IE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRE1JTikgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGUgbGVuZ3RoIGlzIHBsYXVzaWJsZSAqLworCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBJbmRleCkpIHsKKworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCS8qIE9rYXksIHdlIGhhdmUgYSB3aWRlIHZhbHVlIHJhbmdlICovCisJCWlmICgqcExlbiAhPSAoTGltaXQgLSBJbmRleCkpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQl9CisvKgorCQlmb3IgKE9mZnNldD0wOyBJbmRleCA8IExpbWl0OyBJbmRleCArKykgeworCQl9CisqLworLyoKKyAqIFhYWCBOb3QgeWV0IGltcGxlbWVudGVkLiBSZXR1cm4gYWx3YXlzIEJBRF9WQUxVRSwgYmVjYXVzZSB0aGUgdGFibGUKKyAqIGlzIGVtcHR5LgorICovCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWaXJ0dWFsQ29uZiAtIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyBvZiBjb25maWd1cmF0aW9uIE9JRHMgZm9yIHZpcnR1YWwgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJV2UgaGFuZGxlIGhlcmUgdGhlIGdldCBvZiB0aGUgY29uZmlndXJhdGlvbiBncm91cCBPSURzLCB3aGljaCBhcmUKKyAqCWEgbGl0dGxlIGJpdCBjb21wbGljYXRlZC4gVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisgKglhY3RpdmUgcGh5c2ljYWwgcG9ydHMuIElmIG11bHRpcGxlIHBvcnRzIGFyZSBhY3RpdmUgYW5kIGNvbmZpZ3VyZWQKKyAqCWRpZmZlcmVudGx5IHdlIGdldCBpbiBzb21lIHRyb3VibGUgdG8gcmV0dXJuIGEgc2luZ2xlIHZhbHVlLiBTbyB3ZQorICoJZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGF0IG9mCisgKgl0aGUgb3RoZXIgYWN0aXZlIHBvcnRzLiBJZiB0aGV5IGFyZSBub3QgdGhlIHNhbWUsIHdlIHJldHVybiBhIHZhbHVlCisgKgl0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBzdGF0ZSBpcyBpbmRldGVybWluYXRlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFZpcnR1YWxDb25mKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZikJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCVNLX1U4CQlWYWw4OworCVNLX1UzMgkJVmFsMzI7CisJU0tfQk9PTAkJUG9ydEFjdGl2ZUZsYWc7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJKnBCdWYgPSAwOworCVBvcnRBY3RpdmVGbGFnID0gU0tfRkFMU0U7CisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCisJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsgUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJcFBydCA9ICZwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF07CisKKwkJLyogQ2hlY2sgaWYgdGhlIHBoeXNpY2FsIHBvcnQgaXMgYWN0aXZlICovCisJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQljb250aW51ZTsKKwkJfQorCisJCVBvcnRBY3RpdmVGbGFnID0gU0tfVFJVRTsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfVFlQRToKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKwkJCQlWYWwzMiA9IHBQcnQtPlBoeVR5cGU7CisJCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCWNhc2UgT0lEX1NLR0VfTElOS19DQVA6CisKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQgY2FwYWJpbGl0aWVzIHNob3VsZCBub3QgaGFwcGVuLCBidXQKKwkJCSAqIGluIHRoZSBjYXNlIG9mIHRoZSBjYXNlcyBPUiB0aGVtIGFsbCB0b2dldGhlci4KKwkJCSAqIEZyb20gYSBjdXJpb3VzIHBvaW50IG9mIHZpZXcgdGhlIHZpcnR1YWwgcG9ydAorCQkJICogaXMgY2FwYWJsZSBvZiBhbGwgZm91bmQgY2FwYWJpbGl0aWVzLgorCQkJICovCisJCQkqcEJ1ZiB8PSBwUHJ0LT5QTGlua0NhcDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTGlua01vZGVDb25mOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGxpbmsKKwkJCSAqIG1vZGUgdGhhbiB0aGUgZmlyc3Qgb25lIHdlIHJldHVybiBhIHZhbHVlIHRoYXQKKwkJCSAqIGluZGljYXRlcyB0aGF0IHRoZSBsaW5rIG1vZGUgaXMgaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QTGlua01vZGVDb25mKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0xNT0RFX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTOgorCQkJLyogR2V0IHRoZSBsaW5rIG1vZGUgb2YgdGhlIHBoeXNpY2FsIHBvcnQgKi8KKwkJCVZhbDggPSBDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gVmFsODsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBsaW5rCisJCQkgKiBtb2RlIHN0YXR1cyB0aGFuIHRoZSBmaXJzdCBvbmUgd2UgcmV0dXJuIGEgdmFsdWUKKwkJCSAqIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgbW9kZSBzdGF0dXMgaXMKKwkJCSAqIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gVmFsOCkgeworCisJCQkJKnBCdWYgPSBTS19MTU9ERV9TVEFUX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX1NUQVRVUzoKKwkJCS8qIEdldCB0aGUgbGluayBzdGF0dXMgb2YgdGhlIHBoeXNpY2FsIHBvcnQgKi8KKwkJCVZhbDggPSBDYWxjdWxhdGVMaW5rU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKworCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBWYWw4OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGxpbmsKKwkJCSAqIHN0YXR1cyB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhIHZhbHVlCisJCQkgKiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBsaW5rIHN0YXR1cyBpcworCQkJICogaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBWYWw4KSB7CisKKwkJCQkqcEJ1ZiA9IFNLX1BOTUlfUkxNVF9MU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfQ0FQOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QRmxvd0N0cmxDYXA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBGcm9tIGEgY3VyaW91cyBwb2ludCBvZiB2aWV3IHRoZSB2aXJ0dWFsIHBvcnQKKwkJCSAqIGlzIGNhcGFibGUgb2YgYWxsIGZvdW5kIGNhcGFiaWxpdGllcy4KKwkJCSAqLworCQkJKnBCdWYgfD0gcFBydC0+UEZsb3dDdHJsQ2FwOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QRmxvd0N0cmxNb2RlOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGZsb3cKKwkJCSAqIGNvbnRyb2wgbW9kZSB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhIHZhbHVlCisJCQkgKiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBtb2RlIGlzIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UEZsb3dDdHJsTW9kZSkgeworCisJCQkJKnBCdWYgPSBTS19GTE9XX01PREVfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUzoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UEZsb3dDdHJsU3RhdHVzOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGZsb3cKKwkJCSAqIGNvbnRyb2wgc3RhdHVzIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEKKwkJCSAqIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXR1cyBpcworCQkJICogaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QRmxvd0N0cmxTdGF0dXMpIHsKKworCQkJCSpwQnVmID0gU0tfRkxPV19TVEFUX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fQ0FQOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTVNDYXA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBGcm9tIGEgY3VyaW91cyBwb2ludCBvZiB2aWV3IHRoZSB2aXJ0dWFsIHBvcnQKKwkJCSAqIGlzIGNhcGFibGUgb2YgYWxsIGZvdW5kIGNhcGFiaWxpdGllcy4KKwkJCSAqLworCQkJKnBCdWYgfD0gcFBydC0+UE1TQ2FwOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREU6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBNU01vZGU7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgbWFzdGVyLworCQkJICogc2xhdmUgbW9kZSB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhIHZhbHVlCisJCQkgKiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBtb2RlIGlzIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UE1TTW9kZSkgeworCisJCQkJKnBCdWYgPSBTS19NU19NT0RFX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX1NUQVRVUzoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UE1TU3RhdHVzOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IG1hc3Rlci8KKwkJCSAqIHNsYXZlIHN0YXR1cyB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhCisJCQkgKiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBzdGF0dXMgaXMKKwkJCSAqIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UE1TU3RhdHVzKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX01TX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UExpbmtTcGVlZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBmbG93CisJCQkgKiBjb250cm9sIG1vZGUgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYSB2YWx1ZQorCQkJICogdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZSBpcyBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBMaW5rU3BlZWQpIHsKKworCQkJCSpwQnVmID0gU0tfTFNQRUVEX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIE9JRF9TS0dFX1NQRUVEX1NUQVRVUzoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UExpbmtTcGVlZFVzZWQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgZmxvdworCQkJICogY29udHJvbCBzdGF0dXMgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYQorCQkJICogdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdHVzIGlzCisJCQkgKiBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBMaW5rU3BlZWRVc2VkKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0xTUEVFRF9TVEFUX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIG5vIHBvcnQgaXMgYWN0aXZlIHJldHVybiBhbiBpbmRldGVybWluYXRlZCBhbnN3ZXIKKwkgKi8KKwlpZiAoIVBvcnRBY3RpdmVGbGFnKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfTElOS19DQVA6CisJCQkqcEJ1ZiA9IFNLX0xNT0RFX0NBUF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCQkJKnBCdWYgPSBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUzoKKwkJCSpwQnVmID0gU0tfTE1PREVfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19TVEFUVVM6CisJCQkqcEJ1ZiA9IFNLX1BOTUlfUkxNVF9MU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfQ0FQOgorCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJCQkqcEJ1ZiA9IFNLX0ZMT1dfTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfU1RBVFVTOgorCQkJKnBCdWYgPSBTS19GTE9XX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKwkJCQorCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fQ0FQOgorCQkJKnBCdWYgPSBTS19NU19DQVBfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERToKKwkJCSpwQnVmID0gU0tfTVNfTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVM6CisJCQkqcEJ1ZiA9IFNLX01TX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9DQVA6CisJCQkqcEJ1ZiA9IFNLX0xTUEVFRF9DQVBfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCQkqcEJ1ZiA9IFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU1BFRURfU1RBVFVTOgorCQkJKnBCdWYgPSBTS19MU1BFRURfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDYWxjdWxhdGVMaW5rU3RhdHVzIC0gRGV0ZXJtaW5zIHRoZSBsaW5rIHN0YXR1cyBvZiBhIHBoeXNpY2FsIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCURldGVybWlucyB0aGUgbGluayBzdGF0dXMgdGhlIGZvbGxvd2luZyB3YXk6CisgKgkgIExTVEFUX1BIWV9ET1dOOiAgTGluayBpcyBkb3duCisgKgkgIExTVEFUX0FVVE9ORUc6ICAgQXV0by1uZWdvdGlhdGlvbiBmYWlsZWQKKyAqCSAgTFNUQVRfTE9HX0RPV046ICBMaW5rIGlzIHVwIGJ1dCBSTE1UIGRpZCBub3QgeWV0IHB1dCB0aGUgcG9ydAorICoJICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxseSB1cC4KKyAqCSAgTFNUQVRfTE9HX1VQOiAgICBSTE1UIG1hcmtlZCB0aGUgcG9ydCBhcyB1cAorICoKKyAqIFJldHVybnM6CisgKglMaW5rIHN0YXR1cyBvZiBwaHlzaWNhbCBwb3J0CisgKi8KK1BOTUlfU1RBVElDIFNLX1U4IENhbGN1bGF0ZUxpbmtTdGF0dXMoCitTS19BQyAqcEFDLAkJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit1bnNpZ25lZCBpbnQgUGh5c1BvcnRJbmRleCkJLyogUGh5c2ljYWwgcG9ydCBpbmRleCAqLworeworCVNLX1U4CVJlc3VsdDsKKworCWlmICghcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBIV0xpbmtVcCkgeworCisJCVJlc3VsdCA9IFNLX1BOTUlfUkxNVF9MU1RBVF9QSFlfRE9XTjsKKwl9CisJZWxzZSBpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBBdXRvTmVnRmFpbCA+IDApIHsKKworCQlSZXN1bHQgPSBTS19QTk1JX1JMTVRfTFNUQVRfQVVUT05FRzsKKwkJCQl9CisJZWxzZSBpZiAoIXBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlBvcnREb3duKSB7CisKKwkJUmVzdWx0ID0gU0tfUE5NSV9STE1UX0xTVEFUX0xPR19VUDsKKwl9CisJZWxzZSB7CisJCVJlc3VsdCA9IFNLX1BOTUlfUkxNVF9MU1RBVF9MT0dfRE9XTjsKKwl9CisKKwlyZXR1cm4gKFJlc3VsdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzIC0gRGV0ZXJtaW5zIHRoZSBsaW5rIG1vZGUgc3RhdHVzIG9mIGEgcGh5cy4gcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIENPTU1PTiBtb2R1bGUgb25seSB0ZWxscyB1cyBpZiB0aGUgbW9kZSBpcyBoYWxmIG9yIGZ1bGwgZHVwbGV4LgorICoJQnV0IGluIHRoZSBkZWNhZGUgb2YgYXV0byBzZW5zaW5nIGl0IGlzIHVzZWZ1bGwgZm9yIHRoZSB1c2VyIHRvCisgKglrbm93IGlmIHRoZSBtb2RlIHdhcyBuZWdvdGlhdGVkIG9yIGZvcmNlZC4gVGhlcmVmb3JlIHdlIGhhdmUgYQorICoJbG9vayB0byB0aGUgbW9kZSwgd2hpY2ggd2FzIGxhc3QgdXNlZCBieSB0aGUgbmVnb3RpYXRpb24gcHJvY2Vzcy4KKyAqCisgKiBSZXR1cm5zOgorICoJVGhlIGxpbmsgbW9kZSBzdGF0dXMKKyAqLworUE5NSV9TVEFUSUMgU0tfVTggQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMoCitTS19BQyAqcEFDLAkJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit1bnNpZ25lZCBpbnQgUGh5c1BvcnRJbmRleCkJLyogUGh5c2ljYWwgcG9ydCBpbmRleCAqLworeworCVNLX1U4CVJlc3VsdDsKKworCS8qIEdldCB0aGUgY3VycmVudCBtb2RlLCB3aGljaCBjYW4gYmUgZnVsbCBvciBoYWxmIGR1cGxleCAqLworCVJlc3VsdCA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua01vZGVTdGF0dXM7CisKKwkvKiBDaGVjayBpZiBubyB2YWxpZCBtb2RlIGNvdWxkIGJlIGZvdW5kIChsaW5rIGlzIGRvd24pICovCisJaWYgKFJlc3VsdCA8IFNLX0xNT0RFX1NUQVRfSEFMRikgeworCisJCVJlc3VsdCA9IFNLX0xNT0RFX1NUQVRfVU5LTk9XTjsKKwl9CisJZWxzZSBpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rTW9kZSA+PSBTS19MTU9ERV9BVVRPSEFMRikgeworCisJCS8qCisJCSAqIEF1dG8tbmVnb3RpYXRpb24gd2FzIHVzZWQgdG8gYnJpbmcgdXAgdGhlIGxpbmsuIENoYW5nZQorCQkgKiB0aGUgYWxyZWFkeSBmb3VuZCBkdXBsZXggc3RhdHVzIHRoYXQgaXQgaW5kaWNhdGVzCisJCSAqIGF1dG8tbmVnb3RpYXRpb24gd2FzIGludm9sdmVkLgorCQkgKi8KKwkJaWYgKFJlc3VsdCA9PSBTS19MTU9ERV9TVEFUX0hBTEYpIHsKKworCQkJUmVzdWx0ID0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRjsKKwkJfQorCQllbHNlIGlmIChSZXN1bHQgPT0gU0tfTE1PREVfU1RBVF9GVUxMKSB7CisKKwkJCVJlc3VsdCA9IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gKFJlc3VsdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFZwZEtleUFyciAtIE9idGFpbiBhbiBhcnJheSBvZiBWUEQga2V5cworICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmVhZCB0aGUgVlBEIGtleXMgYW5kIGJ1aWxkIGFuIGFycmF5IG9mIFZQRCBrZXlzLCB3aGljaCBhcmUKKyAqCWVhc3kgdG8gYWNjZXNzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSwkgICAgIFRhc2sgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgIFNvbWV0aGluZyB3ZW50IHdyb25nLgorICovCitQTk1JX1NUQVRJQyBpbnQgR2V0VnBkS2V5QXJyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2NoYXIgKnBLZXlBcnIsCQkvKiBQdHIgS2V5QXJyYXkgKi8KK3Vuc2lnbmVkIGludCBLZXlBcnJMZW4sCS8qIExlbmd0aCBvZiBhcnJheSBpbiBieXRlcyAqLwordW5zaWduZWQgaW50ICpwS2V5Tm8pCS8qIE51bWJlciBvZiBrZXlzICovCit7CisJdW5zaWduZWQgaW50CQlCdWZLZXlzTGVuID0gU0tfUE5NSV9WUERfQlVGU0laRTsKKwljaGFyCQkJQnVmS2V5c1tTS19QTk1JX1ZQRF9CVUZTSVpFXTsKKwl1bnNpZ25lZCBpbnQJCVN0YXJ0T2Zmc2V0OworCXVuc2lnbmVkIGludAkJT2Zmc2V0OworCWludAkJCUluZGV4OworCWludAkJCVJldDsKKworCisJU0tfTUVNU0VUKHBLZXlBcnIsIDAsIEtleUFyckxlbik7CisKKwkvKgorCSAqIEdldCBWUEQga2V5IGxpc3QKKwkgKi8KKwlSZXQgPSBWcGRLZXlzKHBBQywgSW9DLCAoY2hhciAqKSZCdWZLZXlzLCAoaW50ICopJkJ1ZktleXNMZW4sCisJCShpbnQgKilwS2V5Tm8pOworCWlmIChSZXQgPiAwKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxNCwKKwkJCVNLX1BOTUlfRVJSMDE0TVNHKTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKwkvKiBJZiBubyBrZXlzIGFyZSBhdmFpbGFibGUgcmV0dXJuIG5vdyAqLworCWlmICgqcEtleU5vID09IDAgfHwgQnVmS2V5c0xlbiA9PSAwKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCS8qCisJICogSWYgdGhlIGtleSBsaXN0IGlzIHRvbyBsb25nIGZvciB1cyB0cnVuYyBpdCBhbmQgZ2l2ZSBhCisJICogZXJyb3Jsb2cgbm90aWZpY2F0aW9uLiBUaGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZQorCSAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIGlzIGxpbWl0ZWQgZHVlIHRvIFJBTSBsaW1pdGF0aW9ucworCSAqLworCWlmICgqcEtleU5vID4gU0tfUE5NSV9WUERfRU5UUklFUykgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTUsCisJCQlTS19QTk1JX0VSUjAxNU1TRyk7CisKKwkJKnBLZXlObyA9IFNLX1BOTUlfVlBEX0VOVFJJRVM7CisJfQorCisJLyoKKwkgKiBOb3cgYnVpbGQgYW4gYXJyYXkgb2YgZml4ZWQgc3RyaW5nIGxlbmd0aCBzaXplIGFuZCBjb3B5CisJICogdGhlIGtleXMgdG9nZXRoZXIuCisJICovCisJZm9yIChJbmRleCA9IDAsIFN0YXJ0T2Zmc2V0ID0gMCwgT2Zmc2V0ID0gMDsgT2Zmc2V0IDwgQnVmS2V5c0xlbjsKKwkJT2Zmc2V0ICsrKSB7CisKKwkJaWYgKEJ1ZktleXNbT2Zmc2V0XSAhPSAwKSB7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKE9mZnNldCAtIFN0YXJ0T2Zmc2V0ID4gU0tfUE5NSV9WUERfS0VZX1NJWkUpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxNiwKKwkJCQlTS19QTk1JX0VSUjAxNk1TRyk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJU0tfU1RSTkNQWShwS2V5QXJyICsgSW5kZXggKiBTS19QTk1JX1ZQRF9LRVlfU0laRSwKKwkJCSZCdWZLZXlzW1N0YXJ0T2Zmc2V0XSwgU0tfUE5NSV9WUERfS0VZX1NJWkUpOworCisJCUluZGV4ICsrOworCQlTdGFydE9mZnNldCA9IE9mZnNldCArIDE7CisJfQorCisJLyogTGFzdCBrZXkgbm90IHplcm8gdGVybWluYXRlZD8gR2V0IGl0IGFueXdheSAqLworCWlmIChTdGFydE9mZnNldCA8IE9mZnNldCkgeworCisJCVNLX1NUUk5DUFkocEtleUFyciArIEluZGV4ICogU0tfUE5NSV9WUERfS0VZX1NJWkUsCisJCQkmQnVmS2V5c1tTdGFydE9mZnNldF0sIFNLX1BOTUlfVlBEX0tFWV9TSVpFKTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2lycVVwZGF0ZSAtIExldCB0aGUgU0lSUSB1cGRhdGUgaXRzIGludGVybmFsIHZhbHVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSnVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIFNJUlEgbW9kdWxlIGhvbGRzIGl0cyBpbnRlcm5hbCBkYXRhCisgKglzdHJ1Y3R1cmVzIHVwIHRvIGRhdGUsIHdlIHNlbmQgYW4gdXBkYXRlIGV2ZW50IGJlZm9yZSB3ZSBtYWtlCisgKglhbnkgYWNjZXNzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSwkgICAgIFRhc2sgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgIFNvbWV0aGluZyB3ZW50IHdyb25nLgorICovCitQTk1JX1NUQVRJQyBpbnQgU2lycVVwZGF0ZSgKK1NLX0FDICpwQUMsCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DKQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworeworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCisKKwkvKiBXYXMgdGhlIG1vZHVsZSBhbHJlYWR5IHVwZGF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IFBOTUkgY2FsbD8gKi8KKwlpZiAocEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyA+IDApIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwkvKiBTZW5kIGFuIHN5bmNocm9udW91cyB1cGRhdGUgZXZlbnQgdG8gdGhlIG1vZHVsZSAqLworCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLCBTS19IV0VWX1VQREFURV9TVEFULCBFdmVudFBhcmFtKSA+IDApIHsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQ3LAorCQkJU0tfUE5NSV9FUlIwNDdNU0cpOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJsbXRVcGRhdGUgLSBMZXQgdGhlIFJMTVQgdXBkYXRlIGl0cyBpbnRlcm5hbCB2YWx1ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUp1c3QgdG8gYmUgc3VyZSB0aGF0IHRoZSBSTE1UIG1vZHVsZSBob2xkcyBpdHMgaW50ZXJuYWwgZGF0YQorICoJc3RydWN0dXJlcyB1cCB0byBkYXRlLCB3ZSBzZW5kIGFuIHVwZGF0ZSBldmVudCBiZWZvcmUgd2UgbWFrZQorICoJYW55IGFjY2Vzcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sJICAgICBUYXNrIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICBTb21ldGhpbmcgd2VudCB3cm9uZy4KKyAqLworUE5NSV9TVEFUSUMgaW50IFJsbXRVcGRhdGUoCitTS19BQyAqcEFDLAkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWxsd2F5cyB6ZXJvICovCit7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisKKworCS8qIFdhcyB0aGUgbW9kdWxlIGFscmVhZHkgdXBkYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgUE5NSSBjYWxsPyAqLworCWlmIChwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnID4gMCkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCS8qIFNlbmQgYW4gc3luY2hyb251b3VzIHVwZGF0ZSBldmVudCB0byB0aGUgbW9kdWxlICovCisJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBOZXRJbmRleDsKKwlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJaWYgKFNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX1NUQVRTX1VQREFURSwgRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0OCwKKwkJCVNLX1BOTUlfRVJSMDQ4TVNHKTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNYWNVcGRhdGUgLSBGb3JjZSB0aGUgWE1BQyB0byBvdXRwdXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgWE1BQyBob2xkcyBpdHMgc3RhdGlzdGljIGludGVybmFsbHkuIFRvIG9idGFpbiB0aGUgY3VycmVudAorICoJdmFsdWVzIHdlIG11c3Qgc2VuZCBhIGNvbW1hbmQgc28gdGhhdCB0aGUgc3RhdGlzdGljIGRhdGEgd2lsbAorICoJYmUgd3JpdHRlbiB0byBhIHByZWRlZmluZWQgbWVtb3J5IGFyZWEgb24gdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LCSAgICAgVGFzayBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgU29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKi8KK1BOTUlfU1RBVElDIGludCBNYWNVcGRhdGUoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordW5zaWduZWQgaW50IEZpcnN0TWFjLAkvKiBJbmRleCBvZiB0aGUgZmlyc3QgTWFjIHRvIGJlIHVwZGF0ZWQgKi8KK3Vuc2lnbmVkIGludCBMYXN0TWFjKQkvKiBJbmRleCBvZiB0aGUgbGFzdCBNYWMgdG8gYmUgdXBkYXRlZCAqLworeworCXVuc2lnbmVkIGludAlNYWNJbmRleDsKKworCS8qCisJICogV2VyZSB0aGUgc3RhdGlzdGljcyBhbHJlYWR5IHVwZGF0ZWQgZHVyaW5nIHRoZQorCSAqIGN1cnJlbnQgUE5NSSBjYWxsPworCSAqLworCWlmIChwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgPiAwKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJLyogU2VuZCBhbiB1cGRhdGUgY29tbWFuZCB0byBhbGwgTUFDcyBzcGVjaWZpZWQgKi8KKwlmb3IgKE1hY0luZGV4ID0gRmlyc3RNYWM7IE1hY0luZGV4IDw9IExhc3RNYWM7IE1hY0luZGV4ICsrKSB7CisKKwkJLyoKKwkJICogMjAwMi0wOS0xMyBwd2ViZXI6CUZyZWV6ZSB0aGUgY3VycmVudCBTVyBjb3VudGVycy4KKwkJICogICAgICAgICAgICAgICAgICAgICAgKFRoYXQgc2hvdWxkIGJlIGRvbmUgYXMgY2xvc2UgYXMKKwkJICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgdG8gdGhlIHVwZGF0ZSBvZiB0aGUKKwkJICogICAgICAgICAgICAgICAgICAgICAgSFcgY291bnRlcnMpCisJCSAqLworCQlpZiAocEFDLT5HSW5pLkdJTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbTWFjSW5kZXhdID0gcEFDLT5Qbm1pLlBvcnRbTWFjSW5kZXhdOworCQl9CisJCQkKKwkJLyogMjAwMi0wOS0xMyBwd2ViZXI6ICBVcGRhdGUgdGhlIEhXIGNvdW50ZXIgICovCisJCWlmIChwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1VwZGF0ZVN0YXRzKHBBQywgSW9DLCBNYWNJbmRleCkgIT0gMCkgeworCisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFN0YXRWYWwgLSBSZXRyaWV2ZSBhbiBYTUFDIHN0YXRpc3RpYyBjb3VudGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXRyaWV2ZXMgdGhlIHN0YXRpc3RpYyBjb3VudGVyIG9mIGEgdmlydHVhbCBvciBwaHlzaWNhbCBwb3J0LiBUaGUKKyAqCXZpcnR1YWwgcG9ydCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBpbmRleCAwLiBJdCBjb25zaXN0cyBvZiBhbGwKKyAqCWN1cnJlbnRseSBhY3RpdmUgcG9ydHMuIFRvIG9idGFpbiB0aGUgY291bnRlciB2YWx1ZSBmb3IgdGhpcyBwb3J0CisgKgl3ZSBtdXN0IGFkZCB0aGUgc3RhdGlzdGljIGNvdW50ZXIgb2YgYWxsIGFjdGl2ZSBwb3J0cy4gVG8gZ3JhbnQKKyAqCWNvbnRpbnVvdXMgY291bnRlciB2YWx1ZXMgZm9yIHRoZSB2aXJ0dWFsIHBvcnQgZXZlbiB3aGVuIHBvcnQKKyAqCXN3aXRjaGVzIG9jY3VyIHdlIG11c3QgYWRkaXRpb25hbGx5IGFkZCBhIGRlbHRhIHZhbHVlLCB3aGljaCB3YXMKKyAqCWNhbGN1bGF0ZWQgZHVyaW5nIGEgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAgZXZlbnQuCisgKgorICogUmV0dXJuczoKKyAqCVJlcXVlc3RlZCBzdGF0aXN0aWMgdmFsdWUKKyAqLworUE5NSV9TVEFUSUMgU0tfVTY0IEdldFN0YXRWYWwoCitTS19BQyAqcEFDLAkJCQkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkJCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordW5zaWduZWQgaW50IExvZ1BvcnRJbmRleCwJLyogSW5kZXggb2YgdGhlIGxvZ2ljYWwgUG9ydCB0byBiZSBwcm9jZXNzZWQgKi8KK3Vuc2lnbmVkIGludCBTdGF0SW5kZXgsCQkvKiBJbmRleCB0byBzdGF0aXN0aWMgdmFsdWUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWxsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCVNLX1U2NAkJCVZhbCA9IDA7CisKKworCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgewkvKiBEdWFsIG5ldCBtb2RlICovCisKKwkJUGh5c1BvcnRJbmRleCA9IE5ldEluZGV4OworCQkKKwkJVmFsID0gR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFN0YXRJbmRleCk7CisJfQorCWVsc2UgewkvKiBTaW5nbGUgTmV0IG1vZGUgKi8KKworCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKworCQkJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwkJCS8qIEFkZCBjb3VudGVyIG9mIGFsbCBhY3RpdmUgcG9ydHMgKi8KKwkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7IFBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQlpZiAocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQkJCVZhbCArPSBHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU3RhdEluZGV4KTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIENvcnJlY3QgdmFsdWUgYmVjYXVzZSBvZiBwb3J0IHN3aXRjaGVzICovCisJCQlWYWwgKz0gcEFDLT5Qbm1pLlZpcnR1YWxDb3VudGVyT2Zmc2V0W1N0YXRJbmRleF07CisJCX0KKwkJZWxzZSB7CisJCQkvKiBHZXQgY291bnRlciB2YWx1ZSBvZiBwaHlzaWNhbCBwb3J0ICovCisJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQorCQkJVmFsID0gR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFN0YXRJbmRleCk7CisJCX0KKwl9CisJcmV0dXJuIChWYWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRQaHlzU3RhdFZhbCAtIEdldCBjb3VudGVyIHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglCdWlsZHMgYSA2NGJpdCBjb3VudGVyIHZhbHVlLiBFeGNlcHQgZm9yIHRoZSBvY3RldCBjb3VudGVycworICoJdGhlIGxvd2VyIDMyYml0IGFyZSBjb3VudGVkIGluIGhhcmR3YXJlIGFuZCB0aGUgdXBwZXIgMzJiaXQKKyAqCWluIHNvZnR3YXJlIGJ5IG1vbml0b3JpbmcgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHRzIGluIHRoZQorICoJZXZlbnQgaGFuZGxlci4gVG8gZ3JhbnQgY29udGlub3VzIGNvdW50ZXIgdmFsdWVzIGR1cmluZyBYTUFDCisgKglyZXNldHMgKGNhdXNlZCBieSBhIHdvcmthcm91bmQpIHdlIG11c3QgYWRkIGEgZGVsdGEgdmFsdWUuCisgKglUaGUgZGVsdGEgd2FzIGNhbGN1bGF0ZWQgaW4gdGhlIGV2ZW50IGhhbmRsZXIgd2hlbiBhCisgKglTS19QTk1JX0VWVF9YTUFDX1JFU0VUIHdhcyByZWNlaXZlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJQ291bnRlciB2YWx1ZQorICovCitQTk1JX1NUQVRJQyBTS19VNjQgR2V0UGh5c1N0YXRWYWwoCitTS19BQyAqcEFDLAkJCQkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkJCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordW5zaWduZWQgaW50IFBoeXNQb3J0SW5kZXgsCS8qIEluZGV4IG9mIHRoZSBsb2dpY2FsIFBvcnQgdG8gYmUgcHJvY2Vzc2VkICovCit1bnNpZ25lZCBpbnQgU3RhdEluZGV4KQkJLyogSW5kZXggdG8gc3RhdGlzdGljIHZhbHVlICovCit7CisJU0tfVTY0CVZhbCA9IDA7CisJU0tfVTMyCUxvd1ZhbCA9IDA7CisJU0tfVTMyCUhpZ2hWYWwgPSAwOworCVNLX1UxNglXb3JkOworCWludAkJTWFjVHlwZTsKKwl1bnNpZ25lZCBpbnQgSGVscEluZGV4OworCVNLX0dFUE9SVAkqcFBydDsKKwkKKwlTS19QTk1JX1BPUlQJKnBQbm1pUHJ0OworCVNLX0dFTUFDRlVOQwkqcEZuTWFjOworCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdOworCQorCU1hY1R5cGUgPSBwQUMtPkdJbmkuR0lNYWNUeXBlOworCQorCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJcFBubWlQcnQgPSAmcEFDLT5Qbm1pLkJ1ZlBvcnRbUGh5c1BvcnRJbmRleF07CisJfQorCWVsc2UgeworCQlwUG5taVBydCA9ICZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XTsKKwl9CisJCisJcEZuTWFjICAgPSAmcEFDLT5HSW5pLkdJRnVuYzsKKworCXN3aXRjaCAoU3RhdEluZGV4KSB7CisJY2FzZSBTS19QTk1JX0hUWDoKKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFRYX0JST0FEQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZMb3dWYWwpOworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IVFhfTVVMVElDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkhpZ2hWYWwpOworCQkJTG93VmFsICs9IEhpZ2hWYWw7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hUWF9VTklDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkhpZ2hWYWwpOworCQkJTG93VmFsICs9IEhpZ2hWYWw7CisJCX0KKwkJZWxzZSB7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCX0KKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKwkKKwljYXNlIFNLX1BOTUlfSFJYOgorCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IUlhfQlJPQURDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkxvd1ZhbCk7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hSWF9NVUxUSUNBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmSGlnaFZhbCk7CisJCQlMb3dWYWwgKz0gSGlnaFZhbDsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFJYX1VOSUNBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmSGlnaFZhbCk7CisJCQlMb3dWYWwgKz0gSGlnaFZhbDsKKwkJfQorCQllbHNlIHsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJfQorCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9PQ1RFVDoKKwljYXNlIFNLX1BOTUlfSFJYX09DVEVUOgorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZIaWdoVmFsKTsKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleCArIDFdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9CVVJTVDoKKwljYXNlIFNLX1BOTUlfSFRYX0VYQ0VTU19ERUY6CisJY2FzZSBTS19QTk1JX0hUWF9DQVJSSUVSOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IEdNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX01BQ0M6CisJCS8qIEdNQUMgb25seSBzdXBwb3J0cyBQQVVTRSBNQUMgY29udHJvbCBmcmFtZXMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCUhlbHBJbmRleCA9IFNLX1BOTUlfSFRYX1BNQUNDOworCQl9CisJCWVsc2UgeworCQkJSGVscEluZGV4ID0gU3RhdEluZGV4OworCQl9CisJCQorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJU3RhdEFkZHJbSGVscEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCSZMb3dWYWwpOworCisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX0NPTDoKKwljYXNlIFNLX1BOTUlfSFJYX1VOREVSU0laRToKKwkJLyogTm90IHN1cHBvcnRlZCBieSBYTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9ERUZGRVJBTDoKKwkJLyogTm90IHN1cHBvcnRlZCBieSBHTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKwkJCisJCS8qCisJCSAqIFhNQUMgY291bnRzIGZyYW1lcyB3aXRoIGRlZmVycmVkIHRyYW5zbWlzc2lvbgorCQkgKiBldmVuIGluIGZ1bGwtZHVwbGV4IG1vZGUuCisJCSAqCisJCSAqIEluIGZ1bGwtZHVwbGV4IG1vZGUgdGhlIGNvdW50ZXIgcmVtYWlucyBjb25zdGFudCEKKwkJICovCisJCWlmICgocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwpIHx8CisJCQkocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfRlVMTCkpIHsKKworCQkJTG93VmFsID0gMDsKKwkJCUhpZ2hWYWwgPSAwOworCQl9CisJCWVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGdldCBjb250ZW50cyBvZiBoYXJkd2FyZSByZWdpc3RlciAqLworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCQkgICZMb3dWYWwpOworCQkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hSWF9CQURPQ1RFVDoKKwkJLyogTm90IHN1cHBvcnRlZCBieSBYTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZIaWdoVmFsKTsKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleCArIDFdW01hY1R5cGVdLlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxvd1ZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9PQ1RFVExPVzoKKwljYXNlIFNLX1BOTUlfSFJYX09DVEVUTE9XOgorCWNhc2UgU0tfUE5NSV9IUlhfQkFET0NURVRMT1c6CisJCXJldHVybiAoVmFsKTsKKworCWNhc2UgU0tfUE5NSV9IUlhfTE9OR0ZSQU1FUzoKKwkJLyogRm9yIFhNQUMgdGhlIFNXIGNvdW50ZXIgaXMgbWFuYWdlZCBieSBQTk1JICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlyZXR1cm4gKHBQbm1pUHJ0LT5TdGF0UnhMb25nRnJhbWVDdHMpOworCQl9CisJCQorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCQkKKwljYXNlIFNLX1BOTUlfSFJYX1RPT19MT05HOgorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCSZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCQorCQlWYWwgPSAoKChTS19VNjQpSGlnaFZhbCA8PCAzMikgfCAoU0tfVTY0KUxvd1ZhbCk7CisKKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCS8qIEZvciBHTUFDIHRoZSBTVyBjb3VudGVyIGlzIGFkZGl0aW9uYWxseSBtYW5hZ2VkIGJ5IFBOTUkgKi8KKwkJCVZhbCArPSBwUG5taVBydC0+U3RhdFJ4RnJhbWVUb29Mb25nQ3RzOworCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZyYW1lcyBsb25nZXIgdGhhbiBJRUVFIDgwMi4zIGZyYW1lIG1heCBzaXplIGFyZSBjb3VudGVkCisJCQkgKiBieSBYTUFDIGluIGZyYW1lX3Rvb19sb25nIGNvdW50ZXIgZXZlbiByZWNlcHRpb24gb2YgbG9uZworCQkJICogZnJhbWVzIHdhcyBlbmFibGVkIGFuZCB0aGUgZnJhbWUgd2FzIGNvcnJlY3QuCisJCQkgKiBTbyBjb3JyZWN0IHRoZSB2YWx1ZSBieSBzdWJ0cmFjdGluZyBSeExvbmdGcmFtZSBjb3VudGVyLgorCQkJICovCisJCQlWYWwgLT0gcFBubWlQcnQtPlN0YXRSeExvbmdGcmFtZUN0czsKKwkJfQorCisJCUxvd1ZhbCA9IChTS19VMzIpVmFsOworCQlIaWdoVmFsID0gKFNLX1UzMikoVmFsID4+IDMyKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU0tfUE5NSV9IUlhfU0hPUlRTOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IEdNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCS8qIEdNX1JYRV9GUkFHPz8gKi8KKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCQkKKwkJLyoKKwkJICogWE1BQyBjb3VudHMgc2hvcnQgZnJhbWUgZXJyb3JzIGV2ZW4gaWYgbGluayBkb3duICgjMTA2MjApCisJCSAqCisJCSAqIElmIGxpbmstZG93biB0aGUgY291bnRlciByZW1haW5zIGNvbnN0YW50CisJCSAqLworCQlpZiAocFBydC0+UExpbmtNb2RlU3RhdHVzICE9IFNLX0xNT0RFX1NUQVRfVU5LTk9XTikgeworCisJCQkvKiBPdGhlcndpc2UgZ2V0IGluY3JlbWVudGFsIGRpZmZlcmVuY2UgKi8KKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKworCQkJVmFsID0gKCgoU0tfVTY0KUhpZ2hWYWwgPDwgMzIpIHwgKFNLX1U2NClMb3dWYWwpOworCQkJVmFsIC09IHBQbm1pUHJ0LT5SeFNob3J0WmVyb01hcms7CisKKwkJCUxvd1ZhbCA9IChTS19VMzIpVmFsOworCQkJSGlnaFZhbCA9IChTS19VMzIpKFZhbCA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFJYX01BQ0M6CisJY2FzZSBTS19QTk1JX0hSWF9NQUNDX1VOS1dOOgorCWNhc2UgU0tfUE5NSV9IUlhfQlVSU1Q6CisJY2FzZSBTS19QTk1JX0hSWF9NSVNTRUQ6CisJY2FzZSBTS19QTk1JX0hSWF9GUkFNSU5HOgorCWNhc2UgU0tfUE5NSV9IUlhfQ0FSUklFUjoKKwljYXNlIFNLX1BOTUlfSFJYX0lSTEVOR1RIOgorCWNhc2UgU0tfUE5NSV9IUlhfU1lNQk9MOgorCWNhc2UgU0tfUE5NSV9IUlhfQ0VYVDoKKwkJLyogTm90IHN1cHBvcnRlZCBieSBHTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hSWF9QTUFDQ19FUlI6CisJCS8qIEZvciBHTUFDIHRoZSBTVyBjb3VudGVyIGlzIG1hbmFnZWQgYnkgUE5NSSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJcmV0dXJuIChwUG5taVBydC0+U3RhdFJ4UE1hY2NFcnIpOworCQl9CisJCQorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJLyogU1cgY291bnRlciBtYW5hZ2VkIGJ5IFBOTUkgKi8KKwljYXNlIFNLX1BOTUlfSFRYX1NZTkM6CisJCUxvd1ZhbCA9IChTS19VMzIpcFBubWlQcnQtPlN0YXRTeW5jQ3RzOworCQlIaWdoVmFsID0gKFNLX1UzMikocFBubWlQcnQtPlN0YXRTeW5jQ3RzID4+IDMyKTsKKwkJYnJlYWs7CisKKwkvKiBTVyBjb3VudGVyIG1hbmFnZWQgYnkgUE5NSSAqLworCWNhc2UgU0tfUE5NSV9IVFhfU1lOQ19PQ1RFVDoKKwkJTG93VmFsID0gKFNLX1UzMilwUG5taVBydC0+U3RhdFN5bmNPY3RldHNDdHM7CisJCUhpZ2hWYWwgPSAoU0tfVTMyKShwUG5taVBydC0+U3RhdFN5bmNPY3RldHNDdHMgPj4gMzIpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IUlhfRkNTOgorCQkvKgorCQkgKiBCcm9hZGNvbSBmaWx0ZXJzIEZDUyBlcnJvcnMgYW5kIGNvdW50cyBpdCBpbgorCQkgKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgcmVnaXN0ZXIKKwkJICovCisJCWlmIChwUHJ0LT5QaHlUeXBlID09IFNLX1BIWV9CQ09NKSB7CisJCQkvKiBkbyBub3QgcmVhZCB3aGlsZSBub3QgaW5pdGlhbGl6ZWQgKFBIWV9SRUFEIGhhbmdzISkqLworCQkJaWYgKHBQcnQtPlBTdGF0ZSAhPSBTS19QUlRfUkVTRVQpIHsKKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgUEhZX0JDT01fUkVfQ1RSLCAmV29yZCk7CisJCQkJCisJCQkJTG93VmFsID0gV29yZDsKKwkJCX0KKwkJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJfQorCQllbHNlIHsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisJfQorCisJVmFsID0gKCgoU0tfVTY0KUhpZ2hWYWwgPDwgMzIpIHwgKFNLX1U2NClMb3dWYWwpOworCisJLyogQ29ycmVjdCB2YWx1ZSBiZWNhdXNlIG9mIHBvc3NpYmxlIFhNQUMgcmVzZXQuIFhNQUMgRXJyYXRhICMyICovCisJVmFsICs9IHBQbm1pUHJ0LT5Db3VudGVyT2Zmc2V0W1N0YXRJbmRleF07CisKKwlyZXR1cm4gKFZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlc2V0Q291bnRlciAtIFNldCBhbGwgY291bnRlcnMgYW5kIHRpbWVzdGFtcHMgdG8gemVybworICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aWZpZXMgb3RoZXIgY29tbW9uIG1vZHVsZXMgd2hpY2ggc3RvcmUgc3RhdGlzdGljIGRhdGEgdG8KKyAqCXJlc2V0IHRoZWlyIGNvdW50ZXJzIGFuZCBmaW5hbGx5IHJlc2V0IG91ciBvd24gY291bnRlcnMuCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBSZXNldENvdW50ZXIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIE5ldEluZGV4KQoreworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCisKKwlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKworCS8qIE5vdGlmeSBzZW5zb3IgbW9kdWxlICovCisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9JMkMsIFNLX0kyQ0VWX0NMRUFSLCBFdmVudFBhcmFtKTsKKworCS8qIE5vdGlmeSBSTE1UIG1vZHVsZSAqLworCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gTmV0SW5kZXg7CisJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFUU19DTEVBUiwgRXZlbnRQYXJhbSk7CisJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAwOworCisJLyogTm90aWZ5IFNJUlEgbW9kdWxlICovCisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX0NMRUFSX1NUQVQsIEV2ZW50UGFyYW0pOworCisJLyogTm90aWZ5IENTVU0gbW9kdWxlICovCisjaWZkZWYgU0tfVVNFX0NTVU0KKwlFdmVudFBhcmFtLlBhcmEzMlswXSA9IE5ldEluZGV4OworCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0NTVU0sIFNLX0NTVU1fRVZFTlRfQ0xFQVJfUFJPVE9fU1RBVFMsCisJCUV2ZW50UGFyYW0pOworI2VuZGlmIC8qIFNLX1VTRV9DU1VNICovCisJCisJLyogQ2xlYXIgWE1BQyBzdGF0aXN0aWMgKi8KKwlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOyBQaHlzUG9ydEluZGV4IDwKKwkJKHVuc2lnbmVkIGludClwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IFBoeXNQb3J0SW5kZXggKyspIHsKKworCQkodm9pZClwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1Jlc2V0Q291bnRlcihwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkNvdW50ZXJIaWdoLAorCQkJMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkNvdW50ZXJIaWdoKSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCUNvdW50ZXJPZmZzZXQsIDAsIHNpemVvZihwQUMtPlBubWkuUG9ydFsKKwkJCVBoeXNQb3J0SW5kZXhdLkNvdW50ZXJPZmZzZXQpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLlN0YXRTeW5jQ3RzLAorCQkJMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLlN0YXRTeW5jQ3RzKSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCVN0YXRTeW5jT2N0ZXRzQ3RzLCAwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbCisJCQlQaHlzUG9ydEluZGV4XS5TdGF0U3luY09jdGV0c0N0cykpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQlTdGF0UnhMb25nRnJhbWVDdHMsIDAsIHNpemVvZihwQUMtPlBubWkuUG9ydFsKKwkJCVBoeXNQb3J0SW5kZXhdLlN0YXRSeExvbmdGcmFtZUN0cykpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJICBTdGF0UnhGcmFtZVRvb0xvbmdDdHMsIDAsIHNpemVvZihwQUMtPlBubWkuUG9ydFsKKwkJCVBoeXNQb3J0SW5kZXhdLlN0YXRSeEZyYW1lVG9vTG9uZ0N0cykpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJICBTdGF0UnhQTWFjY0VyciwgMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0WworCQkJUGh5c1BvcnRJbmRleF0uU3RhdFJ4UE1hY2NFcnIpKTsKKwl9CisKKwkvKgorCSAqIENsZWFyIGxvY2FsIHN0YXRpc3RpY3MKKwkgKi8KKwlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlZpcnR1YWxDb3VudGVyT2Zmc2V0LCAwLAorCQkgIHNpemVvZihwQUMtPlBubWkuVmlydHVhbENvdW50ZXJPZmZzZXQpKTsKKwlwQUMtPlBubWkuUmxtdENoYW5nZUN0cyA9IDA7CisJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaW1lID0gMDsKKwlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RWYWx1ZVswXSwgMCwKKwkJc2l6ZW9mKHBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0VmFsdWUpKTsKKwlwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdFZhbHVlSW5kZXggPSAwOworCXBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0aW1hdGUgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFN3UXVldWVNYXggPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFJldHJ5Q3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhJbnRyQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhJbnRyQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFVzZWREZXNjck5vID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhEZWxpdmVyZWRDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE9jdGV0c0RlbGl2ZXJlZEN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLkVyclJlY292ZXJ5Q3RzID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0VHJhcEVudHJ5IC0gR2V0IGFuIGVudHJ5IGluIHRoZSB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIHRyYXAgYnVmZmVyIHN0b3JlcyB2YXJpb3VzIGV2ZW50cy4gQSB1c2VyIGFwcGxpY2F0aW9uIHNvbWVob3cKKyAqCWdldHMgbm90aWZpZWQgdGhhdCBhbiBldmVudCBvY2N1cmVkIGFuZCByZXRyaWV2ZXMgdGhlIHRyYXAgYnVmZmVyCisgKgljb250ZW5zIChvciBzaW1wbHkgcG9sbHMgdGhlIGJ1ZmZlcikuIFRoZSBidWZmZXIgaXMgb3JnYW5pemVkIGFzCisgKglhIHJpbmcgd2hpY2ggc3RvcmVzIHRoZSBuZXdlc3QgdHJhcHMgYXQgdGhlIGJlZ2lubmluZy4gVGhlIG9sZGVzdAorICoJdHJhcHMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXdlc3Qgb25lcy4gRWFjaCB0cmFwIGVudHJ5IGhhcyBhCisgKgl1bmlxdWUgbnVtYmVyLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBtYXkgZGV0ZWN0IG5ldyB0cmFwIGVudHJpZXMuCisgKgorICogUmV0dXJuczoKKyAqCUEgcG9pbnRlciB0byB0aGUgdHJhcCBlbnRyeQorICovCitQTk1JX1NUQVRJQyBjaGFyKiBHZXRUcmFwRW50cnkoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMiBUcmFwSWQsCQkvKiBTTk1QIElEIG9mIHRoZSB0cmFwICovCit1bnNpZ25lZCBpbnQgU2l6ZSkJLyogU3BhY2UgbmVlZGVkIGZvciB0cmFwIGVudHJ5ICovCit7CisJdW5zaWduZWQgaW50CQlCdWZQYWQgPSBwQUMtPlBubWkuVHJhcEJ1ZlBhZDsKKwl1bnNpZ25lZCBpbnQJCUJ1ZkZyZWUgPSBwQUMtPlBubWkuVHJhcEJ1ZkZyZWU7CisJdW5zaWduZWQgaW50CQlCZWcgPSBwQUMtPlBubWkuVHJhcFF1ZXVlQmVnOworCXVuc2lnbmVkIGludAkJRW5kID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUVuZDsKKwljaGFyCQkJKnBCdWYgPSAmcEFDLT5Qbm1pLlRyYXBCdWZbMF07CisJaW50CQkJV3JhcDsKKwl1bnNpZ25lZCBpbnQJCU5lZWRlZFNwYWNlOworCXVuc2lnbmVkIGludAkJRW50cnlTaXplOworCVNLX1UzMgkJCVZhbDMyOworCVNLX1U2NAkJCVZhbDY0OworCisKKwkvKiBMYXN0IGJ5dGUgb2YgZW50cnkgd2lsbCBnZXQgYSBjb3B5IG9mIHRoZSBlbnRyeSBsZW5ndGggKi8KKwlTaXplICsrOworCisJLyoKKwkgKiBDYWxjdWxhdGUgbmVlZGVkIGJ1ZmZlciBzcGFjZSAqLworCWlmIChCZWcgPj0gU2l6ZSkgeworCisJCU5lZWRlZFNwYWNlID0gU2l6ZTsKKwkJV3JhcCA9IFNLX0ZBTFNFOworCX0KKwllbHNlIHsKKwkJTmVlZGVkU3BhY2UgPSBCZWcgKyBTaXplOworCQlXcmFwID0gU0tfVFJVRTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIGVub3VnaCBidWZmZXIgc3BhY2UgaXMgcHJvdmlkZWQuIE90aGVyd2lzZQorCSAqIGZyZWUgc29tZSBlbnRyaWVzLiBMZWF2ZSBvbmUgYnl0ZSBzcGFjZSBiZXR3ZWVuIGJlZ2luCisJICogYW5kIGVuZCBvZiBidWZmZXIgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBkZXRlY3Qgd2hldGhlcgorCSAqIHRoZSBidWZmZXIgaXMgZnVsbCBvciBlbXB0eQorCSAqLworCXdoaWxlIChCdWZGcmVlIDwgTmVlZGVkU3BhY2UgKyAxKSB7CisKKwkJaWYgKEVuZCA9PSAwKSB7CisKKwkJCUVuZCA9IFNLX1BOTUlfVFJBUF9RVUVVRV9MRU47CisJCX0KKworCQlFbnRyeVNpemUgPSAodW5zaWduZWQgaW50KSooKHVuc2lnbmVkIGNoYXIgKilwQnVmICsgRW5kIC0gMSk7CisJCUJ1ZkZyZWUgKz0gRW50cnlTaXplOworCQlFbmQgLT0gRW50cnlTaXplOworI2lmZGVmIERFQlVHCisJCVNLX01FTVNFVChwQnVmICsgRW5kLCAoY2hhcikoLTEpLCBFbnRyeVNpemUpOworI2VuZGlmIC8qIERFQlVHICovCisJCWlmIChFbmQgPT0gQnVmUGFkKSB7CisjaWZkZWYgREVCVUcKKwkJCVNLX01FTVNFVChwQnVmLCAoY2hhcikoLTEpLCBFbmQpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlCdWZGcmVlICs9IEVuZDsKKwkJCUVuZCA9IDA7CisJCQlCdWZQYWQgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBJbnNlcnQgbmV3IGVudHJ5IGFzIGZpcnN0IGVudHJ5LiBOZXdlc3QgZW50cmllcyBhcmUKKwkgKiBzdG9yZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuCisJICovCisJaWYgKFdyYXApIHsKKworCQlCdWZQYWQgPSBCZWc7CisJCUJlZyA9IFNLX1BOTUlfVFJBUF9RVUVVRV9MRU4gLSBTaXplOworCX0KKwllbHNlIHsKKwkJQmVnID0gQmVnIC0gU2l6ZTsKKwl9CisJQnVmRnJlZSAtPSBOZWVkZWRTcGFjZTsKKworCS8qIFNhdmUgdGhlIGN1cnJlbnQgb2Zmc2V0cyAqLworCXBBQy0+UG5taS5UcmFwUXVldWVCZWcgPSBCZWc7CisJcEFDLT5Qbm1pLlRyYXBRdWV1ZUVuZCA9IEVuZDsKKwlwQUMtPlBubWkuVHJhcEJ1ZlBhZCA9IEJ1ZlBhZDsKKwlwQUMtPlBubWkuVHJhcEJ1ZkZyZWUgPSBCdWZGcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdHJhcCBlbnRyeSAqLworCSoocEJ1ZiArIEJlZyArIFNpemUgLSAxKSA9IChjaGFyKVNpemU7CisJKihwQnVmICsgQmVnKSA9IChjaGFyKVNpemU7CisJVmFsMzIgPSAocEFDLT5Qbm1pLlRyYXBVbmlxdWUpICsrOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBCZWcgKyAxLCBWYWwzMik7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIEJlZyArIDEgKyBzaXplb2YoU0tfVTMyKSwgVHJhcElkKTsKKwlWYWw2NCA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKFNrT3NHZXRUaW1lKHBBQykpOworCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBCZWcgKyAxICsgMiAqIHNpemVvZihTS19VMzIpLCBWYWw2NCk7CisKKwlyZXR1cm4gKHBCdWYgKyBCZWcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5VHJhcFF1ZXVlIC0gQ29waWVzIHRoZSB0cmFwIGJ1ZmZlciBmb3IgdGhlIFRSQVAgT0lECisgKgorICogRGVzY3JpcHRpb246CisgKglPbiBhIHF1ZXJ5IG9mIHRoZSBUUkFQIE9JRCB0aGUgdHJhcCBidWZmZXIgY29udGVudHMgd2lsbCBiZQorICoJY29waWVkIGNvbnRpbnVvdXNseSB0byB0aGUgcmVxdWVzdCBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UKKyAqCWVub3VnaC4gTm8gbGVuZ3RoIGNoZWNrIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIENvcHlUcmFwUXVldWUoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK2NoYXIgKnBEc3RCdWYpCQkvKiBCdWZmZXIgdG8gd2hpY2ggdGhlIHF1ZXVlZCB0cmFwcyB3aWxsIGJlIGNvcGllZCAqLworeworCXVuc2lnbmVkIGludAlCdWZQYWQgPSBwQUMtPlBubWkuVHJhcEJ1ZlBhZDsKKwl1bnNpZ25lZCBpbnQJVHJhcCA9IHBBQy0+UG5taS5UcmFwUXVldWVCZWc7CisJdW5zaWduZWQgaW50CUVuZCA9IHBBQy0+UG5taS5UcmFwUXVldWVFbmQ7CisJY2hhcgkJKnBCdWYgPSAmcEFDLT5Qbm1pLlRyYXBCdWZbMF07CisJdW5zaWduZWQgaW50CUxlbjsKKwl1bnNpZ25lZCBpbnQJRHN0T2ZmID0gMDsKKworCisJd2hpbGUgKFRyYXAgIT0gRW5kKSB7CisKKwkJTGVuID0gKHVuc2lnbmVkIGludCkqKHBCdWYgKyBUcmFwKTsKKworCQkvKgorCQkgKiBMYXN0IGJ5dGUgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGxlbmd0aCB3aWxsCisJCSAqIG5vdCBiZSBjb3BpZWQuCisJCSAqLworCQkqKHBEc3RCdWYgKyBEc3RPZmYpID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocERzdEJ1ZiArIERzdE9mZiArIDEsIHBCdWYgKyBUcmFwICsgMSwgTGVuIC0gMik7CisJCURzdE9mZiArPSBMZW4gLSAxOworCisJCVRyYXAgKz0gTGVuOworCQlpZiAoVHJhcCA9PSBTS19QTk1JX1RSQVBfUVVFVUVfTEVOKSB7CisKKwkJCVRyYXAgPSBCdWZQYWQ7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFRyYXBRdWV1ZUxlbiAtIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRXZhbHVhdGVzIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IHN0b3JlZCB0cmFwcyBhbmQgdGhlIG5lZWRlZAorICoJYnVmZmVyIHNpemUgdG8gcmV0cmlldmUgdGhlbS4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIEdldFRyYXBRdWV1ZUxlbigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBMZW5ndGggaW4gQnl0ZXMgb2YgYWxsIHF1ZXVlZCB0cmFwcyAqLwordW5zaWduZWQgaW50ICpwRW50cmllcykJLyogUmV0dXJucyBudW1iZXIgb2YgdHJhcGVzIHN0b3JlZCBpbiBxdWV1ZSAqLworeworCXVuc2lnbmVkIGludAlCdWZQYWQgPSBwQUMtPlBubWkuVHJhcEJ1ZlBhZDsKKwl1bnNpZ25lZCBpbnQJVHJhcCA9IHBBQy0+UG5taS5UcmFwUXVldWVCZWc7CisJdW5zaWduZWQgaW50CUVuZCA9IHBBQy0+UG5taS5UcmFwUXVldWVFbmQ7CisJY2hhcgkJKnBCdWYgPSAmcEFDLT5Qbm1pLlRyYXBCdWZbMF07CisJdW5zaWduZWQgaW50CUxlbjsKKwl1bnNpZ25lZCBpbnQJRW50cmllcyA9IDA7CisJdW5zaWduZWQgaW50CVRvdGFsTGVuID0gMDsKKworCisJd2hpbGUgKFRyYXAgIT0gRW5kKSB7CisKKwkJTGVuID0gKHVuc2lnbmVkIGludCkqKHBCdWYgKyBUcmFwKTsKKwkJVG90YWxMZW4gKz0gTGVuIC0gMTsKKwkJRW50cmllcyArKzsKKworCQlUcmFwICs9IExlbjsKKwkJaWYgKFRyYXAgPT0gU0tfUE5NSV9UUkFQX1FVRVVFX0xFTikgeworCisJCQlUcmFwID0gQnVmUGFkOworCQl9CisJfQorCisJKnBFbnRyaWVzID0gRW50cmllczsKKwkqcExlbiA9IFRvdGFsTGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZVNpbXBsZVRyYXAgLSBTdG9yZSBhIHNpbXBsZSB0cmFwIHRvIHRoZSB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQSBzaW1wbGUgdHJhcCBpcyBhIHRyYXAgd2l0aCBub3cgYWRkaXRpb25hbCBkYXRhLiBJdCBjb25zaXN0cworICoJc2ltcGx5IG9mIGEgdHJhcCBjb2RlLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgUXVldWVTaW1wbGVUcmFwKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIgVHJhcElkKQkJLyogVHlwZSBvZiBzZW5zb3IgdHJhcCAqLworeworCUdldFRyYXBFbnRyeShwQUMsIFRyYXBJZCwgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZVNlbnNvclRyYXAgLSBTdG9yZXMgYSBzZW5zb3IgdHJhcCBpbiB0aGUgdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldHMgYW4gZW50cnkgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBmaWxscyBpdCB3aXRoIHNlbnNvciByZWxhdGVkCisgKglkYXRhLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgUXVldWVTZW5zb3JUcmFwKAorU0tfQUMgKnBBQywJCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfVTMyIFRyYXBJZCwJCQkvKiBUeXBlIG9mIHNlbnNvciB0cmFwICovCit1bnNpZ25lZCBpbnQgU2Vuc29ySW5kZXgpCS8qIEluZGV4IG9mIHNlbnNvciB3aGljaCBjYXVzZWQgdGhlIHRyYXAgKi8KK3sKKwljaGFyCQkqcEJ1ZjsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCXVuc2lnbmVkIGludAlEZXNjckxlbjsKKwlTS19VMzIJCVZhbDMyOworCisKKwkvKiBHZXQgdHJhcCBidWZmZXIgZW50cnkgKi8KKwlEZXNjckxlbiA9IFNLX1NUUkxFTihwQUMtPkkyYy5TZW5UYWJsZVtTZW5zb3JJbmRleF0uU2VuRGVzYyk7CisJcEJ1ZiA9IEdldFRyYXBFbnRyeShwQUMsIFRyYXBJZCwKKwkJU0tfUE5NSV9UUkFQX1NFTlNPUl9MRU5fQkFTRSArIERlc2NyTGVuKTsKKwlPZmZzZXQgPSBTS19QTk1JX1RSQVBfU0lNUExFX0xFTjsKKworCS8qIFN0b3JlIGFkZGl0aW9uYWxseSBzZW5zb3IgdHJhcCByZWxhdGVkIGRhdGEgKi8KKwlWYWwzMiA9IE9JRF9TS0dFX1NFTlNPUl9JTkRFWDsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJKihwQnVmICsgT2Zmc2V0ICsgNCkgPSA0OworCVZhbDMyID0gKFNLX1UzMilTZW5zb3JJbmRleDsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0ICsgNSwgVmFsMzIpOworCU9mZnNldCArPSA5OworCQorCVZhbDMyID0gKFNLX1UzMilPSURfU0tHRV9TRU5TT1JfREVTQ1I7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCSoocEJ1ZiArIE9mZnNldCArIDQpID0gKGNoYXIpRGVzY3JMZW47CisJU0tfTUVNQ1BZKHBCdWYgKyBPZmZzZXQgKyA1LCBwQUMtPkkyYy5TZW5UYWJsZVtTZW5zb3JJbmRleF0uU2VuRGVzYywKKwkJRGVzY3JMZW4pOworCU9mZnNldCArPSBEZXNjckxlbiArIDU7CisKKwlWYWwzMiA9IE9JRF9TS0dFX1NFTlNPUl9UWVBFOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkqKHBCdWYgKyBPZmZzZXQgKyA0KSA9IDE7CisJKihwQnVmICsgT2Zmc2V0ICsgNSkgPSAoY2hhcilwQUMtPkkyYy5TZW5UYWJsZVtTZW5zb3JJbmRleF0uU2VuVHlwZTsKKwlPZmZzZXQgKz0gNjsKKworCVZhbDMyID0gT0lEX1NLR0VfU0VOU09SX1ZBTFVFOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkqKHBCdWYgKyBPZmZzZXQgKyA0KSA9IDQ7CisJVmFsMzIgPSAoU0tfVTMyKXBBQy0+STJjLlNlblRhYmxlW1NlbnNvckluZGV4XS5TZW5WYWx1ZTsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0ICsgNSwgVmFsMzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZVJsbXROZXdNYWNUcmFwIC0gU3RvcmUgYSBwb3J0IHN3aXRjaCB0cmFwIGluIHRoZSB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aGluZyBmdXJ0aGVyIHRvIGV4cGxhaW4uCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVJsbXROZXdNYWNUcmFwKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgQWN0aXZlTWFjKQkvKiBJbmRleCAoMC4ubikgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgcG9ydCAqLworeworCWNoYXIJKnBCdWY7CisJU0tfVTMyCVZhbDMyOworCisKKwlwQnVmID0gR2V0VHJhcEVudHJ5KHBBQywgT0lEX1NLR0VfVFJBUF9STE1UX0NIQU5HRV9QT1JULAorCQlTS19QTk1JX1RSQVBfUkxNVF9DSEFOR0VfTEVOKTsKKworCVZhbDMyID0gT0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRTsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4sIFZhbDMyKTsKKwkqKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiArIDQpID0gMTsKKwkqKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiArIDUpID0gKGNoYXIpQWN0aXZlTWFjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZVJsbXRQb3J0VHJhcCAtIFN0b3JlIHBvcnQgcmVsYXRlZCBSTE1UIHRyYXAgdG8gdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vdGhpbmcgZnVydGhlciB0byBleHBsYWluLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgUXVldWVSbG10UG9ydFRyYXAoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMiBUcmFwSWQsCQkvKiBUeXBlIG9mIFJMTVQgcG9ydCB0cmFwICovCit1bnNpZ25lZCBpbnQgUG9ydEluZGV4KQkvKiBJbmRleCBvZiB0aGUgcG9ydCwgd2hpY2ggY2hhbmdlZCBpdHMgc3RhdGUgKi8KK3sKKwljaGFyCSpwQnVmOworCVNLX1UzMglWYWwzMjsKKworCisJcEJ1ZiA9IEdldFRyYXBFbnRyeShwQUMsIFRyYXBJZCwgU0tfUE5NSV9UUkFQX1JMTVRfUE9SVF9MRU4pOworCisJVmFsMzIgPSBPSURfU0tHRV9STE1UX1BPUlRfSU5ERVg7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOLCBWYWwzMik7CisJKihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4gKyA0KSA9IDE7CisJKihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4gKyA1KSA9IChjaGFyKVBvcnRJbmRleDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weU1hYyAtIENvcGllcyBhIE1BQyBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RoaW5nIGZ1cnRoZXIgdG8gZXhwbGFpbi4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIENvcHlNYWMoCitjaGFyICpwRHN0LAkJLyogUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgKi8KK1NLX01BQ19BRERSICpwTWFjKQkvKiBQb2ludGVyIG9mIFNvdXJjZSAqLworeworCWludAlpOworCisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFNLX01BQ19BRERSKTsgaSArKykgeworCisJCSoocERzdCArIGkpID0gcE1hYy0+YVtpXTsKKwl9Cit9CisKKyNpZmRlZiBTS19QT1dFUl9NR01UCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQb3dlck1hbmFnZW1lbnQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBQb3dlck1hbmFnZW1lbnQgT0lEcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGNvZGUgaXMgc2ltcGxlLiBObyBkZXNjcmlwdGlvbiBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCisKK1BOTUlfU1RBVElDIGludCBQb3dlck1hbmFnZW1lbnQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdldC9QcmVTZXQvU2V0IGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHRvIHdoaWNoIHRvIG1nbXQgZGF0YSB3aWxsIGJlIHJldHJpZXZlZCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWxsd2F5cyB6ZXJvICovCit7CisJCisJU0tfVTMyCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gV2Ugb25seSBoYW5kbGUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcworCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKwkKKyAgICAKKyAgICAvKiBDaGVjayBsZW5ndGggKi8KKyAgICBzd2l0Y2ggKElkKSB7CisKKyAgICBjYXNlIE9JRF9QTlBfQ0FQQUJJTElUSUVTOgorICAgICAgICBpZiAoKnBMZW4gPCBzaXplb2YoU0tfUE5QX0NBUEFCSUxJVElFUykpIHsKKworICAgICAgICAgICAgKnBMZW4gPSBzaXplb2YoU0tfUE5QX0NBUEFCSUxJVElFUyk7CisgICAgICAgICAgICByZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKwljYXNlIE9JRF9QTlBfU0VUX1BPV0VSOgorICAgIGNhc2UgT0lEX1BOUF9RVUVSWV9QT1dFUjoKKyAgICAJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX0RFVklDRV9QT1dFUl9TVEFURSkpCisgICAgCXsKKyAgICAJCSpwTGVuID0gc2l6ZW9mKFNLX0RFVklDRV9QT1dFUl9TVEFURSk7CisgICAgCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisgICAgCX0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTjoKKyAgICBjYXNlIE9JRF9QTlBfUkVNT1ZFX1dBS0VfVVBfUEFUVEVSTjoKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1BNX1BBQ0tFVF9QQVRURVJOKSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19QTV9QQUNLRVRfUEFUVEVSTik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKyAgICBjYXNlIE9JRF9QTlBfRU5BQkxFX1dBS0VfVVA6CisgICAgICAgIGlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKyAgICAgICAgICAgICpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisgICAgICAgICAgICByZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCQorICAgIC8qCisJICogUGVyZm9ybSBhY3Rpb24KKwkgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJLyoKKwkJICogR2V0IHZhbHVlCisJCSAqLworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfUE5QX0NBUEFCSUxJVElFUzoKKwkJCVJldENvZGUgPSBTa1Bvd2VyUXVlcnlQblBDYXBhYmlsaXRpZXMocEFDLCBJb0MsIHBCdWYsIHBMZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfUE5QX1FVRVJZX1BPV0VSOgorCQkJLyogVGhlIFdpbmRvd3MgRERLIGRlc2NyaWJlczogQW4gT0lEX1BOUF9RVUVSWV9QT1dFUiByZXF1ZXN0cworCQkJIHRoZSBtaW5pcG9ydCB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IGNhbiB0cmFuc2l0aW9uIGl0cyBOSUMKKwkJCSB0byB0aGUgbG93LXBvd2VyIHN0YXRlLgorCQkJIEEgbWluaXBvcnQgZHJpdmVyIG11c3QgYWx3YXlzIHJldHVybiBORElTX1NUQVRVU19TVUNDRVNTCisJCQkgdG8gYSBxdWVyeSBvZiBPSURfUE5QX1FVRVJZX1BPV0VSLiAqLworCQkJKnBMZW4gPSBzaXplb2YoU0tfREVWSUNFX1BPV0VSX1NUQVRFKTsKKyAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCWJyZWFrOworCisJCQkvKiBORElTIGhhbmRsZXMgdGhlc2UgT0lEcyBhcyB3cml0ZS1vbmx5LgorCQkJICogU28gaW4gY2FzZSBvZiBnZXQgYWN0aW9uIHRoZSBidWZmZXIgd2l0aCB3cml0dGVuIGxlbmd0aCA9IDAKKwkJCSAqIGlzIHJldHVybmVkCisJCQkgKi8KKwkJY2FzZSBPSURfUE5QX1NFVF9QT1dFUjoKKwkJY2FzZSBPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk46CisJCWNhc2UgT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOOgorCQkJKnBMZW4gPSAwOwkKKyAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9OT1RfU1VQUE9SVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQOgorCQkJUmV0Q29kZSA9IFNrUG93ZXJHZXRFbmFibGVXYWtlVXAocEFDLCBJb0MsIHBCdWYsIHBMZW4pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gKFJldENvZGUpOworCX0KKwkKKworCS8qCisJICogUGVyZm9ybSBwcmVzZXQgb3Igc2V0CisJICovCisJCisJLyogUE9XRVIgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUFJFU0VUIGFjdGlvbiAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJc3dpdGNoIChJZCkgeworCWNhc2UgT0lEX1BOUF9TRVRfUE9XRVI6CisJCVJldENvZGUgPSBTa1Bvd2VyU2V0UG93ZXIocEFDLCBJb0MsIHBCdWYsIHBMZW4pOwkKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTjoKKwkJUmV0Q29kZSA9IFNrUG93ZXJBZGRXYWtlVXBQYXR0ZXJuKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsJCisJCWJyZWFrOworCQkKKwljYXNlIE9JRF9QTlBfUkVNT1ZFX1dBS0VfVVBfUEFUVEVSTjoKKwkJUmV0Q29kZSA9IFNrUG93ZXJSZW1vdmVXYWtlVXBQYXR0ZXJuKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsJCisJCWJyZWFrOworCQkKKwljYXNlIE9JRF9QTlBfRU5BQkxFX1dBS0VfVVA6CisJCVJldENvZGUgPSBTa1Bvd2VyU2V0RW5hYmxlV2FrZVVwKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsKKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCVJldENvZGUgPSBTS19QTk1JX0VSUl9SRUFEX09OTFk7CisJfQorCQorCXJldHVybiAoUmV0Q29kZSk7Cit9CisjZW5kaWYgLyogU0tfUE9XRVJfTUdNVCAqLworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEaWFnQWN0aW9ucyAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIERpYWdub3N0aWMgZHJpdmVyIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGNvZGUgaXMgc2ltcGxlLiBObyBkZXNjcmlwdGlvbiBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KKworUE5NSV9TVEFUSUMgaW50IERpYWdBY3Rpb25zKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisKKwlTS19VMzIJRGlhZ1N0YXR1czsKKwlTS19VMzIJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBXZSBvbmx5IGhhbmRsZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzLgorCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCS8qCisJICogQ2hlY2sgbGVuZ3RoLgorCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX1NLR0VfRElBR19NT0RFOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0MCwgU0tfUE5NSV9FUlIwNDBNU0cpOworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJLyogUGVyZm9ybSBhY3Rpb24uICovCisKKwkvKiBHRVQgdmFsdWUuICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX0RJQUdfTU9ERToKKwkJCURpYWdTdGF0dXMgPSBwQUMtPlBubWkuRGlhZ0F0dGFjaGVkOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgRGlhZ1N0YXR1cyk7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOwkKKwkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqcExlbiA9IDA7CQorCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gKFJldENvZGUpOyAKKwl9CisKKwkvKiBGcm9tIGhlcmUgU0VUIG9yIFBSRVNFVCB2YWx1ZS4gKi8KKwkKKwkvKiBQUkVTRVQgdmFsdWUgaXMgbm90IHN1cHBvcnRlZC4gKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOyAKKwl9CisKKwkvKiBTRVQgdmFsdWUuICovCisJc3dpdGNoIChJZCkgeworCQljYXNlIE9JRF9TS0dFX0RJQUdfTU9ERToKKworCQkJLyogSGFuZGxlIHRoZSBTRVQuICovCisJCQlzd2l0Y2ggKCpwQnVmKSB7CisKKwkJCQkvKiBBdHRhY2ggdGhlIERJQUcgdG8gdGhpcyBhZGFwdGVyLiAqLworCQkJCWNhc2UgU0tfRElBR19BVFRBQ0hFRDoKKwkJCQkJLyogQ2hlY2sgaWYgd2UgY29tZSBmcm9tIHJ1bm5pbmcgKi8KKwkJCQkJaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19SVU5OSU5HKSB7CisKKwkJCQkJCVJldENvZGUgPSBTa0RydkxlYXZlRGlhZ01vZGUocEFDKTsKKworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19JRExFKSB7CisKKwkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQkJfQkKKwkJCQkJCisJCQkJCWVsc2UgeworCisJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoUmV0Q29kZSA9PSBTS19QTk1JX0VSUl9PSykgeworCisJCQkJCQlwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID0gU0tfRElBR19BVFRBQ0hFRDsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCS8qIEVudGVyIHRoZSBESUFHIG1vZGUgaW4gdGhlIGRyaXZlci4gKi8KKwkJCQljYXNlIFNLX0RJQUdfUlVOTklORzoKKwkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCQkKKwkJCQkJLyoKKwkJCQkJICogSWYgRGlhZ0F0dGFjaGVkIGlzIHNldCwgd2UgY2FuIHRlbGwgdGhlIGRyaXZlcgorCQkJCQkgKiB0byBlbnRlciB0aGUgRElBRyBtb2RlLgorCQkJCQkgKi8KKwkJCQkJaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19BVFRBQ0hFRCkgeworCQkJCQkJLyogSWYgRGlhZ01vZGUgaXMgbm90IGFjdGl2ZSwgd2UgY2FuIGVudGVyIGl0LiAqLworCQkJCQkJaWYgKCFwQUMtPkRpYWdNb2RlQWN0aXZlKSB7CisKKwkJCQkJCQlSZXRDb2RlID0gU2tEcnZFbnRlckRpYWdNb2RlKHBBQyk7IAorCQkJCQkJfQorCQkJCQkJZWxzZSB7CisKKwkJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIHsKKworCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChSZXRDb2RlID09IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCQkJCXBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPSBTS19ESUFHX1JVTk5JTkc7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNLX0RJQUdfSURMRToKKwkJCQkJLyogQ2hlY2sgaWYgd2UgY29tZSBmcm9tIHJ1bm5pbmcgKi8KKwkJCQkJaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19SVU5OSU5HKSB7CisKKwkJCQkJCVJldENvZGUgPSBTa0RydkxlYXZlRGlhZ01vZGUocEFDKTsKKworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19BVFRBQ0hFRCkgeworCisJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJCX0JCisJCQkJCQorCQkJCQllbHNlIHsKKworCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisKKwkJCQkJfQorCisJCQkJCWlmIChSZXRDb2RlID09IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCQkJCXBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPSBTS19ESUFHX0lETEU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfQkFEX1ZBTFVFOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwl9CisKKwlpZiAoUmV0Q29kZSA9PSBTS19QTk1JX0VSUl9PSykgeworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCX0KKwllbHNlIHsKKworCQkqcExlbiA9IDA7CisJfQorCXJldHVybiAoUmV0Q29kZSk7Cit9CisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZjdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mICBPSURzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgY29kZSBpcyBzaW1wbGUuIE5vIGRlc2NyaXB0aW9uIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcikuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkJIE9ubHkgdGhlIEdldCBhY3Rpb24gaXMgYWxsb3dlZC4KKyAqCisgKi8KKworUE5NSV9TVEFUSUMgaW50IFZjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKC0xLDIuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19QTk1JX1ZDVAkqcFZjdEJhY2t1cERhdGE7CisJU0tfVTMyCQlMb2dQb3J0TWF4OworCVNLX1UzMgkJUGh5c1BvcnRNYXg7CisJU0tfVTMyCQlQaHlzUG9ydEluZGV4OworCVNLX1UzMgkJTGltaXQ7CisJU0tfVTMyCQlPZmZzZXQ7CisJU0tfQk9PTAkJTGluazsKKwlTS19VMzIJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCWludAkJaTsKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMzIJCUNhYmxlTGVuZ3RoOworCQorCS8qCisJICogQ2FsY3VsYXRlIHRoZSBwb3J0IGluZGV4ZXMgZnJvbSB0aGUgaW5zdGFuY2UuCisJICovCisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJTG9nUG9ydE1heCA9IFNLX1BOTUlfUE9SVF9QSFlTMkxPRyhQaHlzUG9ydE1heCk7CisJCisJLyogRHVhbCBuZXQgbW9kZT8gKi8KKwlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJTG9nUG9ydE1heC0tOworCX0KKwkKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpICgtMSkpKSB7CisJCS8qIENoZWNrIGluc3RhbmNlIHJhbmdlLiAqLworCQlpZiAoKEluc3RhbmNlIDwgMikgfHwgKEluc3RhbmNlID4gTG9nUG9ydE1heCkpIHsKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCQkKKwkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQlQaHlzUG9ydEluZGV4ID0gTmV0SW5kZXg7CisJCX0KKwkJZWxzZSB7CisJCQlQaHlzUG9ydEluZGV4ID0gSW5zdGFuY2UgLSAyOworCQl9CisJCUxpbWl0ID0gUGh5c1BvcnRJbmRleCArIDE7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBJbnN0YW5jZSA9PSAoU0tfVTMyKSAoLTEpLCBnZXQgYWxsIEluc3RhbmNlcyBvZiB0aGF0IE9JRC4KKwkJICoKKwkJICogTm90IGltcGxlbWVudGVkIHlldC4gTWF5IGJlIHVzZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorCQkgKi8KKwkJUGh5c1BvcnRJbmRleCA9IDA7CisJCUxpbWl0ID0gUGh5c1BvcnRNYXg7CisJfQorCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdOworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJTGluayA9IFNLX1RSVUU7CisJfQorCWVsc2UgeworCQlMaW5rID0gU0tfRkFMU0U7CisJfQorCQorCS8qIENoZWNrIE1BQyB0eXBlICovCisJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX01BUlZfQ09QUEVSKSB7CisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisJCisJLyogSW5pdGlhbGl6ZSBiYWNrdXAgZGF0YSBwb2ludGVyLiAqLworCXBWY3RCYWNrdXBEYXRhID0gJnBBQy0+UG5taS5WY3RCYWNrdXBbUGh5c1BvcnRJbmRleF07CisJCisJLyogQ2hlY2sgYWN0aW9uIHR5cGUgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisJCS8qIENoZWNrIGxlbmd0aCAqLworCQlzd2l0Y2ggKElkKSB7CisJCQorCQljYXNlIE9JRF9TS0dFX1ZDVF9HRVQ6CisJCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19QTk1JX1ZDVCkpIHsKKwkJCQkqcExlbiA9IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1BOTUlfVkNUKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWNhc2UgT0lEX1NLR0VfVkNUX1NUQVRVUzoKKwkJCWlmICgqcExlbiA8IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U4KSkgeworCQkJCSpwTGVuID0gKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTgpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0JCisJCQorCQkvKiBHZXQgdmFsdWUgKi8KKwkJT2Zmc2V0ID0gMDsKKwkJZm9yICg7IFBoeXNQb3J0SW5kZXggPCBMaW1pdDsgUGh5c1BvcnRJbmRleCsrKSB7CisJCQlzd2l0Y2ggKElkKSB7CisJCQkKKwkJCWNhc2UgT0lEX1NLR0VfVkNUX0dFVDoKKwkJCQlpZiAoKExpbmsgPT0gU0tfRkFMU0UpICYmCisJCQkJCShwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfUEVORElORykpIHsKKwkJCQkJUmV0Q29kZSA9IFNrR21DYWJsZURpYWdTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFNLX0ZBTFNFKTsKKwkJCQkJaWYgKFJldENvZGUgPT0gMCkgeworCQkJCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmPSB+U0tfUE5NSV9WQ1RfUEVORElORzsKKwkJCQkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gfD0KKwkJCQkJCQkoU0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBIHwgU0tfUE5NSV9WQ1RfVEVTVF9ET05FKTsKKwkJCQkJCQorCQkJCQkJLyogQ29weSByZXN1bHRzIGZvciBsYXRlciB1c2UgdG8gUE5NSSBzdHJ1Y3QuICovCisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgeworCQkJCQkJCWlmIChwUHJ0LT5QTWRpUGFpclN0c1tpXSA9PSBTS19QTk1JX1ZDVF9OT1JNQUxfQ0FCTEUpIHsKKwkJCQkJCQkJaWYgKChwUHJ0LT5QTWRpUGFpckxlbltpXSA+IDM1KSAmJiAocFBydC0+UE1kaVBhaXJMZW5baV0gPCAweGZmKSkgeworCQkJCQkJCQkJcFBydC0+UE1kaVBhaXJTdHNbaV0gPSBTS19QTk1JX1ZDVF9JTVBFREFOQ0VfTUlTTUFUQ0g7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaWYgKChwUHJ0LT5QTWRpUGFpckxlbltpXSA+IDM1KSAmJiAocFBydC0+UE1kaVBhaXJMZW5baV0gIT0gMHhmZikpIHsKKwkJCQkJCQkJQ2FibGVMZW5ndGggPSAxMDAwICogKCgoMTc1ICogcFBydC0+UE1kaVBhaXJMZW5baV0pIC8gMjEwKSAtIDI4KTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCUNhYmxlTGVuZ3RoID0gMDsKKwkJCQkJCQl9CisJCQkJCQkJcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyTGVuW2ldID0gQ2FibGVMZW5ndGg7CisJCQkJCQkJcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyU3RzW2ldID0gcFBydC0+UE1kaVBhaXJTdHNbaV07CisJCQkJCQl9CisKKwkJCQkJCVBhcmEuUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJCVBhcmEuUGFyYTMyWzFdID0gLTE7CisJCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfUkVTRVQsIFBhcmEpOworCQkJCQkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBJb0MpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJOyAvKiBWQ1QgdGVzdCBpcyBydW5uaW5nLiAqLworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8qIEdldCBhbGwgcmVzdWx0cy4gKi8KKwkJCQlDaGVja1ZjdFN0YXR1cyhwQUMsIElvQywgcEJ1ZiwgT2Zmc2V0LCBQaHlzUG9ydEluZGV4KTsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCQkqKHBCdWYgKyBPZmZzZXQpID0gcFBydC0+UENhYmxlTGVuOworCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspICB7CisJCQkJCVNLX1BOTUlfU1RPUkVfVTMyKChwQnVmICsgT2Zmc2V0KSwgcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyTGVuW2ldKTsKKwkJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJCX0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgeworCQkJCQkqKHBCdWYgKyBPZmZzZXQpID0gcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyU3RzW2ldOworCQkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCQl9CisJCQkJCisJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCWJyZWFrOworCQkKKwkJCWNhc2UgT0lEX1NLR0VfVkNUX1NUQVRVUzoKKwkJCQlDaGVja1ZjdFN0YXR1cyhwQUMsIElvQywgcEJ1ZiwgT2Zmc2V0LCBQaHlzUG9ydEluZGV4KTsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJYnJlYWs7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCX0gLyogZm9yICovCisJCSpwTGVuID0gT2Zmc2V0OworCQlyZXR1cm4gKFJldENvZGUpOworCQorCX0gLyogaWYgU0tfUE5NSV9HRVQgKi8KKwkKKwkvKgorCSAqIEZyb20gaGVyZSBTRVQgb3IgUFJFU0VUIGFjdGlvbi4gQ2hlY2sgaWYgdGhlIHBhc3NlZAorCSAqIGJ1ZmZlciBsZW5ndGggaXMgcGxhdXNpYmxlLgorCSAqLworCQorCS8qIENoZWNrIGxlbmd0aCAqLworCXN3aXRjaCAoSWQpIHsKKwljYXNlIE9JRF9TS0dFX1ZDVF9TRVQ6CisJCWlmICgqcExlbiA8IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMikpIHsKKwkJCSpwTGVuID0gKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKwkKKwlkZWZhdWx0OgorCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCQorCS8qCisJICogUGVyZm9ybSBwcmVzZXQgb3Igc2V0LgorCSAqLworCQorCS8qIFZDVCBkb2VzIG5vdCBzdXBwb3J0IFBSRVNFVCBhY3Rpb24uICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisJCisJT2Zmc2V0ID0gMDsKKwlmb3IgKDsgUGh5c1BvcnRJbmRleCA8IExpbWl0OyBQaHlzUG9ydEluZGV4KyspIHsKKwkJc3dpdGNoIChJZCkgeworCQljYXNlIE9JRF9TS0dFX1ZDVF9TRVQ6IC8qIFN0YXJ0IFZDVCB0ZXN0LiAqLworCQkJaWYgKExpbmsgPT0gU0tfRkFMU0UpIHsKKwkJCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFNLX1NUT1BfQUxMLCBTS19TT0ZUX1JTVCk7CisJCQkJCisJCQkJUmV0Q29kZSA9IFNrR21DYWJsZURpYWdTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFNLX1RSVUUpOworCQkJCWlmIChSZXRDb2RlID09IDApIHsgLyogUmV0Q29kZTogMCA9PiBTdGFydCEgKi8KKwkJCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSB8PSBTS19QTk1JX1ZDVF9QRU5ESU5HOworCQkJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICY9IH5TS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEE7CisJCQkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJj0gflNLX1BOTUlfVkNUX0xJTks7CisJCQkJCQorCQkJCQkvKgorCQkJCQkgKiBTdGFydCBWQ1QgdGltZXIgY291bnRlci4KKwkJCQkJICovCisJCQkJCVNLX01FTVNFVCgoY2hhciAqKSAmUGFyYSwgMCwgc2l6ZW9mKFBhcmEpKTsKKwkJCQkJUGFyYS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQlQYXJhLlBhcmEzMlsxXSA9IC0xOworCQkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlBubWkuVmN0VGltZW91dFtQaHlzUG9ydEluZGV4XS5WY3RUaW1lciwKKwkJCQkJCTQwMDAwMDAsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfVkNUX1JFU0VULCBQYXJhKTsKKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIoKHBCdWYgKyBPZmZzZXQpLCBSZXRDb2RlKTsKKwkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCX0KKwkJCQllbHNlIHsgLyogUmV0Q29kZTogMiA9PiBSdW5uaW5nISAqLworCQkJCQlTS19QTk1JX1NUT1JFX1UzMigocEJ1ZiArIE9mZnNldCksIFJldENvZGUpOworCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8qIFJldENvZGU6IDQgPT4gTGluayEgKi8KKwkJCQlSZXRDb2RlID0gNDsKKwkJCQlTS19QTk1JX1NUT1JFX1UzMigocEJ1ZiArIE9mZnNldCksIFJldENvZGUpOworCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCX0KKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCQorCQlkZWZhdWx0OgorCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0gLyogZm9yICovCisJKnBMZW4gPSBPZmZzZXQ7CisJcmV0dXJuIChSZXRDb2RlKTsKKworfSAvKiBWY3QgKi8KKworCitQTk1JX1NUQVRJQyB2b2lkIENoZWNrVmN0U3RhdHVzKAorU0tfQUMJCSpwQUMsCitTS19JT0MJCUlvQywKK2NoYXIJCSpwQnVmLAorU0tfVTMyCQlPZmZzZXQsCitTS19VMzIJCVBoeXNQb3J0SW5kZXgpCit7CisJU0tfR0VQT1JUIAkqcFBydDsKKwlTS19QTk1JX1ZDVAkqcFZjdERhdGE7CisJU0tfVTMyCQlSZXRDb2RlOworCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdOworCQorCXBWY3REYXRhID0gKFNLX1BOTUlfVkNUICopIChwQnVmICsgT2Zmc2V0KTsKKwlwVmN0RGF0YS0+VmN0U3RhdHVzID0gU0tfUE5NSV9WQ1RfTk9ORTsKKwkKKwlpZiAoIXBQcnQtPlBIV0xpbmtVcCkgeworCQkKKwkJLyogV2FzIGEgVkNUIHRlc3QgZXZlciBtYWRlIGJlZm9yZT8gKi8KKwkJaWYgKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9URVNUX0RPTkUpIHsKKwkJCWlmICgocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX0xJTkspKSB7CisJCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9PTERfVkNUX0RBVEE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX05FV19WQ1RfREFUQTsKKwkJCX0KKwkJfQorCQkKKwkJLyogQ2hlY2sgVkNUIHRlc3Qgc3RhdHVzLiAqLworCQlSZXRDb2RlID0gU2tHbUNhYmxlRGlhZ1N0YXR1cyhwQUMsSW9DLCBQaHlzUG9ydEluZGV4LCBTS19GQUxTRSk7CisJCWlmIChSZXRDb2RlID09IDIpIHsgLyogVkNUIHRlc3QgaXMgcnVubmluZy4gKi8KKwkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfUlVOTklORzsKKwkJfQorCQllbHNlIHsgLyogVkNUIGRhdGEgd2FzIGNvcGllZCB0byBwQUMgaGVyZS4gQ2hlY2sgUEVORElORyBzdGF0ZS4gKi8KKwkJCWlmIChwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfUEVORElORykgeworCQkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBOworCQkJfQorCQl9CisJCQorCQlpZiAocFBydC0+UENhYmxlTGVuICE9IDB4ZmYpIHsgLyogT2xkIERTUCB2YWx1ZS4gKi8KKwkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfT0xEX0RTUF9EQVRBOworCQl9CisJfQorCWVsc2UgeworCQkKKwkJLyogV2FzIGEgVkNUIHRlc3QgZXZlciBtYWRlIGJlZm9yZT8gKi8KKwkJaWYgKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9URVNUX0RPTkUpIHsKKwkJCXBWY3REYXRhLT5WY3RTdGF0dXMgJj0gflNLX1BOTUlfVkNUX05FV19WQ1RfREFUQTsKKwkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfT0xEX1ZDVF9EQVRBOworCQl9CisJCQorCQkvKiBEU1Agb25seSB2YWxpZCBpbiAxMDAvMTAwMCBtb2Rlcy4gKi8KKwkJaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua1NwZWVkVXNlZCAhPQorCQkJU0tfTFNQRUVEX1NUQVRfMTBNQlBTKSB7CQorCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9ORVdfRFNQX0RBVEE7CisJCX0KKwl9Cit9IC8qIENoZWNrVmN0U3RhdHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBTa1BubWlHZW5Jb2N0bCAtIEhhbmRsZXMgbmV3IGdlbmVyaWMgUE5NSSBJT0NUTCwgY2FsbHMgdGhlIG5lZWRlZAorICogICAgICAgICAgICAgICAgICAgICAgIFBOTUkgZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSBzdWJjb21tYW5kIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgYWxsIGRhdGEgYmVsb25naW5nIHRvIHRoZSBjb21wbGV0ZSBkYXRhYmFzZQorICogICAgICAgICAgICAgICAgICAgICAgIG9yIE9JRCByZXF1ZXN0LgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTG9va3MgdXAgdGhlIHJlcXVlc3RlZCBzdWJjb21tYW5kLCBjYWxscyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVyCisgKglmdW5jdGlvbiBhbmQgcGFzc2VzIGFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGl0LgorICoJVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyLiBJdCBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoZSBuZXcKKyAqICBnZW5lcmljIFBOTUkgSU9DVEwuIFRoaXMgSU9DVEwgaXMgZ2l2ZW4gdG8gdGhlIGRyaXZlciBhbmQgY29udGFpbnMgYm90aAorICogIHRoZSBPSUQgYW5kIGEgc3ViY29tbWFuZCB0byBkZWNpZGUgd2hhdCBraW5kIG9mIHJlcXVlc3QgaGFzIHRvIGJlIGRvbmUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZAorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZAorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byB0YWtlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX09JRCAgVGhlIHJlcXVlc3RlZCBPSUQgaXMgdW5rbm93bgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworaW50IFNrUG5taUdlbklvY3RsKAorU0tfQUMJCSpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK3ZvaWQJCSpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK1NLX1UzMgkJTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CitTS19JMzIJTW9kZTsJCQkvKiBTdG9yZSB2YWx1ZSBvZiBzdWJjb21tYW5kLiAqLworU0tfVTMyCU9pZDsJCQkvKiBTdG9yZSB2YWx1ZSBvZiBPSUQuICovCitpbnQJCVJldHVybkNvZGU7CQkvKiBTdG9yZSByZXR1cm4gdmFsdWUgdG8gc2hvdyBzdGF0dXMgb2YgUE5NSSBhY3Rpb24uICovCitpbnQgCUhlYWRlckxlbmd0aDsJLyogTGVuZ3RoIG9mIGRlc2lyZWQgYWN0aW9uIHBsdXMgT0lELiAqLworCisJUmV0dXJuQ29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJCisJU0tfTUVNQ1BZKCZNb2RlLCBwQnVmLCBzaXplb2YoU0tfSTMyKSk7CisJU0tfTUVNQ1BZKCZPaWQsIChjaGFyICopIHBCdWYgKyBzaXplb2YoU0tfSTMyKSwgc2l6ZW9mKFNLX1UzMikpOworCUhlYWRlckxlbmd0aCA9IHNpemVvZihTS19JMzIpICsgc2l6ZW9mKFNLX1UzMik7CisJKnBMZW4gPSAqcExlbiAtIEhlYWRlckxlbmd0aDsKKwlTS19NRU1DUFkoKGNoYXIgKikgcEJ1ZiArIHNpemVvZihTS19JMzIpLCAoY2hhciAqKSBwQnVmICsgSGVhZGVyTGVuZ3RoLCAqcExlbik7CisJCisJc3dpdGNoKE1vZGUpIHsKKwljYXNlIFNLX0dFVF9TSU5HTEVfVkFSOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pR2V0VmFyKHBBQywgSW9DLCBPaWQsIAorCQkJCShjaGFyICopIHBCdWYgKyBzaXplb2YoU0tfSTMyKSwgcExlbiwKKwkJCQkoKFNLX1UzMikgKC0xKSksIE5ldEluZGV4KTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgUmV0dXJuQ29kZSk7CisJCSpwTGVuID0gKnBMZW4gKyBzaXplb2YoU0tfSTMyKTsKKwkJYnJlYWs7CisJY2FzZSBTS19QUkVTRVRfU0lOR0xFX1ZBUjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taVByZVNldFZhcihwQUMsIElvQywgT2lkLCAKKwkJCQkoY2hhciAqKSBwQnVmICsgc2l6ZW9mKFNLX0kzMiksIHBMZW4sCisJCQkJKChTS19VMzIpICgtMSkpLCBOZXRJbmRleCk7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFJldHVybkNvZGUpOworCQkqcExlbiA9ICpwTGVuICsgc2l6ZW9mKFNLX0kzMik7CisJCWJyZWFrOworCWNhc2UgU0tfU0VUX1NJTkdMRV9WQVI6CisJCVJldHVybkNvZGUgPSBTa1BubWlTZXRWYXIocEFDLCBJb0MsIE9pZCwgCisJCQkJKGNoYXIgKikgcEJ1ZiArIHNpemVvZihTS19JMzIpLCBwTGVuLAorCQkJCSgoU0tfVTMyKSAoLTEpKSwgTmV0SW5kZXgpOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBSZXR1cm5Db2RlKTsKKwkJKnBMZW4gPSAqcExlbiArIHNpemVvZihTS19JMzIpOworCQlicmVhazsKKwljYXNlIFNLX0dFVF9GVUxMX01JQjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taUdldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpOworCQlicmVhazsKKwljYXNlIFNLX1BSRVNFVF9GVUxMX01JQjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taVByZVNldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpOworCQlicmVhazsKKwljYXNlIFNLX1NFVF9GVUxMX01JQjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taVNldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJCisJcmV0dXJuIChSZXR1cm5Db2RlKTsKKworfSAvKiBTa0dlSW9jR2VuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VzaXJxLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VzaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1MjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXNpcnEuYwpAQCAtMCwwICsxLDIyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlc2lycS5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjkyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDE0OjM3OjA3ICQKKyAqIFB1cnBvc2U6CVNwZWNpYWwgSVJRIG1vZHVsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3BlY2lhbCBJbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqCVRoZSBmb2xsb3dpbmcgYWJzdHJhY3Qgc2hvdWxkIHNob3cgaG93IHRoaXMgbW9kdWxlIGlzIGluY2x1ZGVkCisgKglpbiB0aGUgZHJpdmVyIHBhdGg6CisgKgorICoJSW4gdGhlIElTUiBvZiB0aGUgZHJpdmVyIHRoZSBiaXRzIGZvciBmcmFtZSB0cmFuc21pc3Npb24gY29tcGxldGUgYW5kCisgKglmb3IgcmVjZWl2ZSBjb21wbGV0ZSBhcmUgY2hlY2tlZCBhbmQgaGFuZGxlZCBieSB0aGUgZHJpdmVyIGl0c2VsZi4KKyAqCVRoZSBiaXRzIG9mIHRoZSBzbG93IHBhdGggbWFzayBhcmUgY2hlY2tlZCBhZnRlciB0aGF0IGFuZCB0aGVuIHRoZQorICoJZW50cnkgaW50byB0aGUgc28tY2FsbGVkICJzbG93IHBhdGgiIGlzIHByZXBhcmVkLiBJdCBpcyBhbiBpbXBsZW1lbnRvcnMKKyAqCWRlY2lzaW9uIHdoZXRoZXIgdGhpcyBpcyBleGVjdXRlZCBkaXJlY3RseSBvciBqdXN0IHNjaGVkdWxlZCBieQorICoJZGlzYWJsaW5nIHRoZSBtYXNrLiBJbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBzb21lIGV2ZW50cyBtYXkgYmUKKyAqCWdlbmVyYXRlZCwgc28gaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gY2FsbCB0aGUgRXZlbnREaXNwYXRjaGVyCisgKglyaWdodCBhZnRlciB0aGlzIElTUi4KKyAqCisgKglUaGUgSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBvZiB0aGUgYWRhcHRlciBpcyBOT1QgcmVhZCBieSB0aGlzIG1vZHVsZS4KKyAqICBTTyBpZiB0aGUgZHJpdmVycyBpbXBsZW1lbnRvciBuZWVkcyBhIHdoaWxlIGxvb3AgYXJvdW5kIHRoZQorICoJc2xvdyBkYXRhIHBhdGhzIGludGVycnVwdCBiaXRzLCBoZSBuZWVkcyB0byBjYWxsIHRoZSBTa0dlU2lycUlzcigpIGZvcgorICoJZWFjaCBsb29wIGVudGVyZWQuCisgKgorICoJSG93ZXZlciwgdGhlIE1BQyBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycyBhcmUgcmVhZCBpbiBhIHdoaWxlIGxvb3AuCisgKgorICovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tnZXNpcnEuYyx2IDEuOTIgMjAwMy8wOS8xNiAxNDozNzowNyByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgU0tfU0xJTQorI2luY2x1ZGUgImgvc2tnZXBubWkuaCIJCS8qIFBOTUkgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrcmxtdC5oIgkJLyogUkxNVCBEZWZpbml0aW9ucyAqLworI2VuZGlmCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisvKiBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjaWZkZWYgR0VORVNJUworc3RhdGljIGludAlTa0dlUG9ydENoZWNrVXBYbWFjKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIGludAlTa0dlUG9ydENoZWNrVXBCY29tKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIHZvaWQJU2tQaHlJc3JCY29tKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX1UxNik7CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCitzdGF0aWMgaW50CVNrR2VQb3J0Q2hlY2tVcEdtYWMoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlTa1BoeUlzckdtYWMoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfVTE2KTsKKyNlbmRpZiAvKiBZVUtPTiAqLworI2lmZGVmIE9USEVSX1BIWQorc3RhdGljIGludAlTa0dlUG9ydENoZWNrVXBMb25lKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIGludAlTa0dlUG9ydENoZWNrVXBOYXQoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlTa1BoeUlzckxvbmUoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfVTE2KTsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKworI2lmZGVmIEdFTkVTSVMKKy8qCisgKiBhcnJheSBvZiBSeCBjb3VudGVyIGZyb20gWE1BQyB3aGljaCBhcmUgY2hlY2tlZAorICogaW4gQXV0b1NlbnNlIG1vZGUgdG8gY2hlY2sgd2hldGhlciBhIGxpbmsgaXMgbm90IGFibGUgdG8gYXV0by1uZWdvdGlhdGUuCisgKi8KK3N0YXRpYyBjb25zdCBTS19VMTYgU2tHZVJ4UmVnc1tdPSB7CisJWE1fUlhGXzY0QiwKKwlYTV9SWEZfMTI3QiwKKwlYTV9SWEZfMjU1QiwKKwlYTV9SWEZfNTExQiwKKwlYTV9SWEZfMTAyM0IsCisJWE1fUlhGX01BWF9TWgorfSA7CisjZW5kaWYgLyogR0VORVNJUyAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorICoJU3BlY2lhbCBJUlEgZnVuY3Rpb24KKyAqCisgKglHZW5lcmFsIERlc2NyaXB0aW9uOgorICoKKyAqLworaW50cm8oKQore30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tIV0luaXREZWZTZW5zZSgpIC0gRGVmYXVsdCBBdXRvc2Vuc2luZyBtb2RlIGluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246IHNldHMgdGhlIFBMaW5rTW9kZSBmb3IgSFdJbml0CisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrSFdJbml0RGVmU2Vuc2UoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPSAwOworCisJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgIT0gU0tfTE1PREVfQVVUT1NFTlNFKSB7CisJCXBQcnQtPlBMaW5rTW9kZSA9IHBQcnQtPlBMaW5rTW9kZUNvbmY7CisJCXJldHVybjsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJKCJBdXRvU2Vuc2luZzogRmlyc3QgbW9kZSAlZCBvbiBQb3J0ICVkXG4iLAorCQkoaW50KVNLX0xNT0RFX0FVVE9GVUxMLCBQb3J0KSk7CisKKwlwUHJ0LT5QTGlua01vZGUgPSAoU0tfVTgpU0tfTE1PREVfQVVUT0ZVTEw7CisKKwlyZXR1cm47Cit9CS8qIFNrSFdJbml0RGVmU2Vuc2UgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrSFdTZW5zZUdldE5leHQoKSAtIEdldCBOZXh0IEF1dG9zZW5zaW5nIE1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjogZ2V0cyB0aGUgYXBwcm9wcmlhdGUgbmV4dCBtb2RlCisgKgorICogTm90ZToKKyAqCisgKi8KK3N0YXRpYyBTS19VOCBTa0hXU2Vuc2VHZXROZXh0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJcFBydC0+UEF1dG9OZWdUaW1lT3V0ID0gMDsKKworICAgIGlmIChwUHJ0LT5QTGlua01vZGVDb25mICE9IChTS19VOClTS19MTU9ERV9BVVRPU0VOU0UpIHsKKwkJLyogTGVhdmUgYWxsIGFzIGNvbmZpZ3VyZWQgKi8KKwkJcmV0dXJuKHBQcnQtPlBMaW5rTW9kZUNvbmYpOworCX0KKworICAgIGlmIChwUHJ0LT5QTGlua01vZGUgPT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9GVUxMKSB7CisJCS8qIFJldHVybiBuZXh0IG1vZGUgQVVUT0JPVEggKi8KKyAgICAgICAgcmV0dXJuICgoU0tfVTgpU0tfTE1PREVfQVVUT0JPVEgpOworCX0KKworCS8qIFJldHVybiBkZWZhdWx0IGF1dG9mdWxsICovCisgICAgcmV0dXJuICgoU0tfVTgpU0tfTE1PREVfQVVUT0ZVTEwpOworfQkvKiBTa0hXU2Vuc2VHZXROZXh0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrSFdTZW5zZVNldE5leHQoKSAtIEF1dG9zZW5zaW5nIFNldCBuZXh0IG1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoJc2V0cyB0aGUgYXBwcm9wcmlhdGUgbmV4dCBtb2RlCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrSFdTZW5zZVNldE5leHQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTgJTmV3TW9kZSkJLyogTmV3IE1vZGUgdG8gYmUgd3JpdHRlbiBpbiBzZW5zZSBtb2RlICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCXBQcnQtPlBBdXRvTmVnVGltZU91dCA9IDA7CisKKyAgICBpZiAocFBydC0+UExpbmtNb2RlQ29uZiAhPSAoU0tfVTgpU0tfTE1PREVfQVVUT1NFTlNFKSB7CisJCXJldHVybjsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJKCJBdXRvU2Vuc2luZzogbmV4dCBtb2RlICVkIG9uIFBvcnQgJWRcbiIsCisJCShpbnQpTmV3TW9kZSwgUG9ydCkpOworCisJcFBydC0+UExpbmtNb2RlID0gTmV3TW9kZTsKKworCXJldHVybjsKK30JLyogU2tIV1NlbnNlU2V0TmV4dCAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tIV0xpbmtEb3duKCkgLSBMaW5rIERvd24gaGFuZGxpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyB0aGUgaGFyZHdhcmUgbGluayBkb3duIHNpZ25hbAorICoKKyAqIFJldHVybnM6IE4vQQorICovCit2b2lkIFNrSFdMaW5rRG93bigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIERpc2FibGUgYWxsIE1BQyBpbnRlcnJ1cHRzICovCisJU2tNYWNJcnFEaXNhYmxlKHBBQywgSW9DLCBQb3J0KTsKKworCS8qIERpc2FibGUgUmVjZWl2ZXIgYW5kIFRyYW5zbWl0dGVyICovCisJU2tNYWNSeFR4RGlzYWJsZShwQUMsIElvQywgUG9ydCk7CisJCisJLyogSW5pdCBkZWZhdWx0IHNlbnNlIG1vZGUgKi8KKwlTa0hXSW5pdERlZlNlbnNlKHBBQywgSW9DLCBQb3J0KTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXAgPT0gU0tfRkFMU0UpIHsKKwkJcmV0dXJuOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkoIkxpbmsgZG93biBQb3J0ICVkXG4iLCBQb3J0KSk7CisKKwkvKiBTZXQgTGluayB0byBET1dOICovCisJcFBydC0+UEhXTGlua1VwID0gU0tfRkFMU0U7CisKKwkvKiBSZXNldCBQb3J0IHN0YXRpICovCisgICAgcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfVU5LTk9XTjsKKyAgICBwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSAoU0tfVTgpU0tfRkxPV19TVEFUX05PTkU7CisJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisKKwkvKiBSZS1pbml0IFBoeSBlc3BlY2lhbGx5IHdoZW4gdGhlIEF1dG9TZW5zZSBkZWZhdWx0IGlzIHNldCBub3cgKi8KKwlTa01hY0luaXRQaHkocEFDLCBJb0MsIFBvcnQsIFNLX0ZBTFNFKTsKKworCS8qIEdQMDogdXNlZCBmb3Igd29ya2Fyb3VuZCBvZiBSZXYuIEMgRXJyYXRhIDIgKi8KKworCS8qIERvIE5PVCBzaWduYWwgdG8gUkxNVCAqLworCisJLyogRG8gTk9UIHN0YXJ0IHRoZSB0aW1lciBoZXJlICovCit9CS8qIFNrSFdMaW5rRG93biAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0hXTGlua1VwKCkgLSBMaW5rIFVwIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgdGhlIGhhcmR3YXJlIGxpbmsgdXAgc2lnbmFsCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3ZvaWQgU2tIV0xpbmtVcCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJLyogV2UgZG8gTk9UIG5lZWQgdG8gcHJvY2VlZCBvbiBhY3RpdmUgbGluayAqLworCQlyZXR1cm47CisJfQorCisJcFBydC0+UEhXTGlua1VwID0gU0tfVFJVRTsKKwlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19GQUxTRTsKKyAgICBwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9VTktOT1dOOworCisgICAgaWYgKHBQcnQtPlBMaW5rTW9kZSAhPSAoU0tfVTgpU0tfTE1PREVfQVVUT0hBTEYgJiYKKyAgICAgICAgcFBydC0+UExpbmtNb2RlICE9IChTS19VOClTS19MTU9ERV9BVVRPRlVMTCAmJgorICAgICAgICBwUHJ0LT5QTGlua01vZGUgIT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9CT1RIKSB7CisJCS8qIExpbmsgaXMgdXAgYW5kIG5vIEF1dG8tbmVnb3RpYXRpb24gc2hvdWxkIGJlIGRvbmUgKi8KKworCQkvKiBMaW5rIHNwZWVkIHNob3VsZCBiZSB0aGUgY29uZmlndXJlZCBvbmUgKi8KKwkJc3dpdGNoIChwUHJ0LT5QTGlua1NwZWVkKSB7CisJCWNhc2UgU0tfTFNQRUVEX0FVVE86CisJCQkvKiBkZWZhdWx0IGlzIDEwMDAgTWJwcyAqLworCQljYXNlIFNLX0xTUEVFRF8xMDAwTUJQUzoKKwkJCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTFNQRUVEXzEwME1CUFM6CisJCQlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xMDBNQlBTOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTFNQRUVEXzEwTUJQUzoKKwkJCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUXzEwTUJQUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2V0IExpbmsgTW9kZSBTdGF0dXMgKi8KKwkJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9GVUxMOworCQl9CisJCWVsc2UgeworICAgICAgICAgICAgcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfSEFMRjsKKwkJfQorCisJCS8qIE5vIGZsb3cgY29udHJvbCB3aXRob3V0IGF1dG8tbmVnb3RpYXRpb24gKi8KKyAgICAgICAgcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gKFNLX1U4KVNLX0ZMT1dfU1RBVF9OT05FOworCisJCS8qIGVuYWJsZSBSeC9UeCAqLworICAgICAgICAodm9pZClTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIFBvcnQpOworCX0KK30JLyogU2tIV0xpbmtVcCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY1Bhcml0eSgpIC0gTUFDIHBhcml0eSB3b3JrYXJvdW5kCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgTUFDIHBhcml0eSBlcnJvcnMgY29ycmVjdGx5CisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrTWFjUGFyaXR5KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggb2YgdGhlIHBvcnQgZmFpbGVkICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfVTMyCQlUeE1heDsJCS8qIFR4IE1heCBTaXplIENvdW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogQ2xlYXIgSVJRIFR4IFBhcml0eSBFcnJvciAqLworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX1BFUlIpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogSFctQnVnICM4OiBjbGVhcmVkIGJ5IEdNRl9DTElfVFhfRkMgaW5zdGVhZCBvZiBHTUZfQ0xJX1RYX1BFICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLAorCQkJKFNLX1U4KSgocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04gJiYKKwkJCXBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgPyBHTUZfQ0xJX1RYX0ZDIDogR01GX0NMSV9UWF9QRSkpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQorCWlmIChwUHJ0LT5QQ2hlY2tQYXIpIHsKKworCQlpZiAoUG9ydCA9PSBNQUNfMSkgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTYsIFNLRVJSX1NJUlFfRTAxNk1TRyk7CisJCX0KKwkJZWxzZSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxNywgU0tFUlJfU0lSUV9FMDE3TVNHKTsKKwkJfQorCQlQYXJhLlBhcmE2NCA9IFBvcnQ7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJCisJCVBhcmEuUGFyYTMyWzBdID0gUG9ydDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgZnJhbWVzIHdpdGggYSBzaXplIG9mIDFrIHdlcmUgc2VudCAqLworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkvKiBTbmFwIHN0YXRpc3RpYyBjb3VudGVycyAqLworCQkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fVFhGX01BWF9TWiwgJlR4TWF4KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisKKwkJKHZvaWQpU2tHbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgR01fVFhGXzE1MThCLCAmVHhNYXgpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQorCWlmIChUeE1heCA+IDApIHsKKwkJLyogRnJvbSBub3cgb24gY2hlY2sgdGhlIHBhcml0eSAqLworCQlwUHJ0LT5QQ2hlY2tQYXIgPSBTS19UUlVFOworCX0KK30JLyogU2tNYWNQYXJpdHkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUh3RXJyKCkgLSBIYXJkd2FyZSBFcnJvciBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBhbGwgSFcgRXJyb3IgaW50ZXJydXB0cworICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa0dlSHdFcnIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworU0tfVTMyCUh3U3RhdHVzKQkvKiBJbnRlcnJ1cHQgc3RhdHVzIHdvcmQgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMTYJCVdvcmQ7CisKKwlpZiAoKEh3U3RhdHVzICYgKElTX0lSUV9NU1RfRVJSIHwgSVNfSVJRX1NUQVQpKSAhPSAwKSB7CisJCS8qIFBDSSBFcnJvcnMgb2NjdXJlZCAqLworCQlpZiAoKEh3U3RhdHVzICYgSVNfSVJRX1NUQVQpICE9IDApIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDEzLCBTS0VSUl9TSVJRX0UwMTNNU0cpOworCQl9CisJCWVsc2UgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTIsIFNLRVJSX1NJUlFfRTAxMk1TRyk7CisJCX0KKworCQkvKiBSZXNldCBhbGwgYml0cyBpbiB0aGUgUENJIFNUQVRVUyByZWdpc3RlciAqLworCQlTS19JTjE2KElvQywgUENJX0MoUENJX1NUQVRVUyksICZXb3JkKTsKKwkJCisJCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworICAgICAgICBTS19PVVQxNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAoU0tfVTE2KShXb3JkIHwgUENJX0VSUkJJVFMpKTsKKwkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOworCisJCVBhcmEuUGFyYTY0ID0gMDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9BREFQX0ZBSUwsIFBhcmEpOworCX0KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCisJCWlmICgoSHdTdGF0dXMgJiBJU19OT19TVEFUX00xKSAhPSAwKSB7CisJCQkvKiBJZ25vcmUgaXQgKi8KKwkJCS8qIFRoaXMgc2l0dWF0aW9uIGlzIGFsc28gaW5kaWNhdGVkIGluIHRoZSBkZXNjcmlwdG9yICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoTUFDXzEsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5TVEFUKTsKKwkJfQorCisJCWlmICgoSHdTdGF0dXMgJiBJU19OT19TVEFUX00yKSAhPSAwKSB7CisJCQkvKiBJZ25vcmUgaXQgKi8KKwkJCS8qIFRoaXMgc2l0dWF0aW9uIGlzIGFsc28gaW5kaWNhdGVkIGluIHRoZSBkZXNjcmlwdG9yICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoTUFDXzIsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5TVEFUKTsKKwkJfQorCisJCWlmICgoSHdTdGF0dXMgJiBJU19OT19USVNUX00xKSAhPSAwKSB7CisJCQkvKiBJZ25vcmUgaXQgKi8KKwkJCS8qIFRoaXMgc2l0dWF0aW9uIGlzIGFsc28gaW5kaWNhdGVkIGluIHRoZSBkZXNjcmlwdG9yICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoTUFDXzEsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5USVNUKTsKKwkJfQorCisJCWlmICgoSHdTdGF0dXMgJiBJU19OT19USVNUX00yKSAhPSAwKSB7CisJCQkvKiBJZ25vcmUgaXQgKi8KKwkJCS8qIFRoaXMgc2l0dWF0aW9uIGlzIGFsc28gaW5kaWNhdGVkIGluIHRoZSBkZXNjcmlwdG9yICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoTUFDXzIsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5USVNUKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogVGhpcyBpcyBuZWNlc3Nhcnkgb25seSBmb3IgUnggdGltaW5nIG1lYXN1cmVtZW50cyAqLworCQlpZiAoKEh3U3RhdHVzICYgSVNfSVJRX1RJU1RfT1YpICE9IDApIHsKKwkJCS8qIGluY3JlbWVudCBUaW1lIFN0YW1wIFRpbWVyIGNvdW50ZXIgKGhpZ2gpICovCisJCQlwQUMtPkdJbmkuR0lUaW1lU3RhbXBDbnQrKzsKKworCQkJLyogQ2xlYXIgVGltZSBTdGFtcCBUaW1lciBJUlEgKi8KKwkJCVNLX09VVDgoSW9DLCBHTUFDX1RJX1NUX0NUUkwsIChTS19VOClHTVRfU1RfQ0xSX0lSUSk7CisJCX0KKworCQlpZiAoKEh3U3RhdHVzICYgSVNfSVJRX1NFTlNPUikgIT0gMCkgeworCQkJLyogbm8gc2Vuc29ycyBvbiAzMi1iaXQgWXVrb24gKi8KKwkJCWlmIChwQUMtPkdJbmkuR0lZdWtvbjMyQml0KSB7CisJCQkJLyogZGlzYWJsZSBIVyBFcnJvciBJUlEgKi8KKwkJCQlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrICY9IH5JU19IV19FUlI7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCWlmICgoSHdTdGF0dXMgJiBJU19SQU1fUkRfUEFSKSAhPSAwKSB7CisJCVNLX09VVDE2KElvQywgQjNfUklfQ1RSTCwgUklfQ0xSX1JEX1BFUlIpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxNCwgU0tFUlJfU0lSUV9FMDE0TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSAwOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX0FEQVBfRkFJTCwgUGFyYSk7CisJfQorCisJaWYgKChId1N0YXR1cyAmIElTX1JBTV9XUl9QQVIpICE9IDApIHsKKwkJU0tfT1VUMTYoSW9DLCBCM19SSV9DVFJMLCBSSV9DTFJfV1JfUEVSUik7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE1LCBTS0VSUl9TSVJRX0UwMTVNU0cpOworCQlQYXJhLlBhcmE2NCA9IDA7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfQURBUF9GQUlMLCBQYXJhKTsKKwl9CisKKwlpZiAoKEh3U3RhdHVzICYgSVNfTTFfUEFSX0VSUikgIT0gMCkgeworCQlTa01hY1Bhcml0eShwQUMsIElvQywgTUFDXzEpOworCX0KKworCWlmICgoSHdTdGF0dXMgJiBJU19NMl9QQVJfRVJSKSAhPSAwKSB7CisJCVNrTWFjUGFyaXR5KHBBQywgSW9DLCBNQUNfMik7CisJfQorCisJaWYgKChId1N0YXR1cyAmIElTX1IxX1BBUl9FUlIpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfUjFfQ1NSLCBDU1JfSVJRX0NMX1ApOworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE4LCBTS0VSUl9TSVJRX0UwMThNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCQorCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKEh3U3RhdHVzICYgSVNfUjJfUEFSX0VSUikgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9SMl9DU1IsIENTUl9JUlFfQ0xfUCk7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTksIFNLRVJSX1NJUlFfRTAxOU1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJCisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KK30JLyogU2tHZUh3RXJyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VTaXJxSXNyKCkgLSBTcGVjaWFsIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBhbGwgbm9uIGRhdGEgdHJhbnNmZXIgc3BlY2lmaWMgaW50ZXJydXB0cyAoc2xvdyBwYXRoKQorICoKKyAqIFJldHVybnM6IE4vQQorICovCit2b2lkIFNrR2VTaXJxSXNyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK1NLX1UzMglJc3RhdHVzKQkvKiBJbnRlcnJ1cHQgc3RhdHVzIHdvcmQgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMzIJCVJlZ1ZhbDMyOwkvKiBSZWFkIHJlZ2lzdGVyIHZhbHVlICovCisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfVTE2IAkJUGh5SW50OworCWludAkJCWk7CisKKwlpZiAoKChJc3RhdHVzICYgSVNfSFdfRVJSKSAmIHBBQy0+R0luaS5HSVZhbElycU1hc2spICE9IDApIHsKKwkJLyogcmVhZCB0aGUgSFcgRXJyb3IgSW50ZXJydXB0IHNvdXJjZSAqLworCQlTS19JTjMyKElvQywgQjBfSFdFX0lTUkMsICZSZWdWYWwzMik7CisJCQorCQlTa0dlSHdFcnIocEFDLCBJb0MsIFJlZ1ZhbDMyKTsKKwl9CisKKwkvKgorCSAqIFBhY2tldCBUaW1lb3V0IGludGVycnVwdHMKKwkgKi8KKwkvKiBDaGVjayB3aGV0aGVyIE1BQ3MgYXJlIGNvcnJlY3RseSBpbml0aWFsaXplZCAqLworCWlmICgoKElzdGF0dXMgJiAoSVNfUEFfVE9fUlgxIHwgSVNfUEFfVE9fVFgxKSkgIT0gMCkgJiYKKwkJcEFDLT5HSW5pLkdQW01BQ18xXS5QU3RhdGUgPT0gU0tfUFJUX1JFU0VUKSB7CisJCS8qIE1BQyAxIHdhcyBub3QgaW5pdGlhbGl6ZWQgYnV0IFBhY2tldCB0aW1lb3V0IG9jY3VyZWQgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA0LAorCQkJU0tFUlJfU0lSUV9FMDA0TVNHKTsKKwl9CisKKwlpZiAoKChJc3RhdHVzICYgKElTX1BBX1RPX1JYMiB8IElTX1BBX1RPX1RYMikpICE9IDApICYmCisJICAgIHBBQy0+R0luaS5HUFtNQUNfMl0uUFN0YXRlID09IFNLX1BSVF9SRVNFVCkgeworCQkvKiBNQUMgMiB3YXMgbm90IGluaXRpYWxpemVkIGJ1dCBQYWNrZXQgdGltZW91dCBvY2N1cmVkICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwNSwKKwkJCVNLRVJSX1NJUlFfRTAwNU1TRyk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfUEFfVE9fUlgxKSAhPSAwKSB7CisJCS8qIE1lYW5zIG5ldHdvcmsgaXMgZmlsbGluZyB1cyB1cCAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDIsCisJCQlTS0VSUl9TSVJRX0UwMDJNU0cpOworCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19SWDEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1BBX1RPX1JYMikgIT0gMCkgeworCQkvKiBNZWFucyBuZXR3b3JrIGlzIGZpbGxpbmcgdXMgdXAgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDAzLAorCQkJU0tFUlJfU0lSUV9FMDAzTVNHKTsKKwkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fUlgyKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19QQV9UT19UWDEpICE9IDApIHsKKwkJCisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQWzBdOworCisJCS8qIE1heSBiZSBhIG5vcm1hbCBzaXR1YXRpb24gaW4gYSBzZXJ2ZXIgd2l0aCBhIHNsb3cgbmV0d29yayAqLworCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19UWDEpOworCisjaWZkZWYgR0VORVNJUworCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJLyoKKwkJCSAqIHdvcmthcm91bmQ6IGlmIGluIGhhbGYgZHVwbGV4IG1vZGUsIGNoZWNrIGZvciBUeCBoYW5ndXAuCisJCQkgKiBSZWFkIG51bWJlciBvZiBUWCdlZCBieXRlcywgd2FpdCBmb3IgMTAgbXMsIHRoZW4gY29tcGFyZQorCQkJICogdGhlIG51bWJlciB3aXRoIGN1cnJlbnQgdmFsdWUuIElmIG5vdGhpbmcgY2hhbmdlZCwgd2UgYXNzdW1lCisJCQkgKiB0aGF0IFR4IGlzIGhhbmdpbmcgYW5kIGRvIGEgRklGTyBmbHVzaCAoc2VlIGV2ZW50IHJvdXRpbmUpLgorCQkJICovCisJCQlpZiAoKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0hBTEYgfHwKKwkJCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRikgJiYKKwkJCQkhcFBydC0+SGFsZkR1cFRpbWVyQWN0aXZlKSB7CisJCQkJLyoKKwkJCQkgKiBtYW55IG1vcmUgcGFjay4gYXJiLiB0aW1lb3V0cyBtYXkgY29tZSBpbiBiZXR3ZWVuLAorCQkJCSAqIHdlIGlnbm9yZSB0aG9zZQorCQkJCSAqLworCQkJCXBQcnQtPkhhbGZEdXBUaW1lckFjdGl2ZSA9IFNLX1RSVUU7CisjaWZkZWYgWFhYCisJCQkJTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQkJU2tQbm1pR2V0VmFyKHBBQywgSW9DLCBPSURfU0tHRV9TVEFUX1RYX09DVEVUUywgKGNoYXIgKikmT2N0ZXRzLAorCQkJCQkmTGVuLCAoU0tfVTMyKVNLX1BOTUlfUE9SVF9QSFlTMklOU1QocEFDLCAwKSwKKwkJCQkJcEFDLT5SbG10LlBvcnRbMF0uTmV0LT5OZXROdW1iZXIpOworCQkJCQorCQkJCXBQcnQtPkxhc3RPY3RldHMgPSBPY3RldHM7CisjZW5kaWYgLyogWFhYICovCisJCQkJLyogU25hcCBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwkJCQkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIDApOworCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgMCwgWE1fVFhPX09LX0hJLCAmUmVnVmFsMzIpOworCisJCQkJcFBydC0+TGFzdE9jdGV0cyA9IChTS19VNjQpUmVnVmFsMzIgPDwgMzI7CisJCQkJCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgMCwgWE1fVFhPX09LX0xPLCAmUmVnVmFsMzIpOworCisJCQkJcFBydC0+TGFzdE9jdGV0cyArPSBSZWdWYWwzMjsKKwkJCQkKKwkJCQlQYXJhLlBhcmEzMlswXSA9IDA7CisJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+SGFsZkR1cENoa1RpbWVyLCBTS19IQUxGRFVQX0NIS19USU1FLAorCQkJCQlTS0dFX0hXQUMsIFNLX0hXRVZfSEFMRkRVUF9DSEssIFBhcmEpOworCQkJfQorCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1BBX1RPX1RYMikgIT0gMCkgeworCQkKKwkJcFBydCA9ICZwQUMtPkdJbmkuR1BbMV07CisKKwkJLyogTWF5IGJlIGEgbm9ybWFsIHNpdHVhdGlvbiBpbiBhIHNlcnZlciB3aXRoIGEgc2xvdyBuZXR3b3JrICovCisJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1RYMik7CisKKyNpZmRlZiBHRU5FU0lTCisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkvKiB3b3JrYXJvdW5kOiBzZWUgYWJvdmUgKi8KKwkJCWlmICgocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfSEFMRiB8fAorCQkJCSBwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRikgJiYKKwkJCQkhcFBydC0+SGFsZkR1cFRpbWVyQWN0aXZlKSB7CisJCQkJcFBydC0+SGFsZkR1cFRpbWVyQWN0aXZlID0gU0tfVFJVRTsKKyNpZmRlZiBYWFgKKwkJCQlMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCQlTa1BubWlHZXRWYXIocEFDLCBJb0MsIE9JRF9TS0dFX1NUQVRfVFhfT0NURVRTLCAoY2hhciAqKSZPY3RldHMsCisJCQkJCSZMZW4sIChTS19VMzIpU0tfUE5NSV9QT1JUX1BIWVMySU5TVChwQUMsIDEpLAorCQkJCQlwQUMtPlJsbXQuUG9ydFsxXS5OZXQtPk5ldE51bWJlcik7CisJCQkJCisJCQkJcFBydC0+TGFzdE9jdGV0cyA9IE9jdGV0czsKKyNlbmRpZiAvKiBYWFggKi8KKwkJCQkvKiBTbmFwIHN0YXRpc3RpYyBjb3VudGVycyAqLworCQkJCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgMSk7CisKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCAxLCBYTV9UWE9fT0tfSEksICZSZWdWYWwzMik7CisKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzID0gKFNLX1U2NClSZWdWYWwzMiA8PCAzMjsKKwkJCQkKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCAxLCBYTV9UWE9fT0tfTE8sICZSZWdWYWwzMik7CisKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzICs9IFJlZ1ZhbDMyOworCQkJCQorCQkJCVBhcmEuUGFyYTMyWzBdID0gMTsKKwkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUHJ0LT5IYWxmRHVwQ2hrVGltZXIsIFNLX0hBTEZEVVBfQ0hLX1RJTUUsCisJCQkJCVNLR0VfSFdBQywgU0tfSFdFVl9IQUxGRFVQX0NISywgUGFyYSk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJfQorCisJLyogQ2hlY2sgaW50ZXJydXB0cyBvZiB0aGUgcGFydGljdWxhciBxdWV1ZXMgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19SMV9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1IxX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA2LAorCQkJU0tFUlJfU0lSUV9FMDA2TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19SMl9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1IyX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA3LAorCQkJU0tFUlJfU0lSUV9FMDA3TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19YUzFfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9YUzFfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDgsCisJCQlTS0VSUl9TSVJRX0UwMDhNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1hBMV9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1hBMV9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwOSwKKwkJCVNLRVJSX1NJUlFfRTAwOU1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfWFMyX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfWFMyX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDEwLAorCQkJU0tFUlJfU0lSUV9FMDEwTVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19YQTJfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9YQTJfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMTEsCisJCQlTS0VSUl9TSVJRX0UwMTFNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCS8qIEV4dGVybmFsIHJlZyBpbnRlcnJ1cHQgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19FWFRfUkVHKSAhPSAwKSB7CisJCS8qIFRlc3QgSVJRcyBmcm9tIFBIWSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCQorCQkJcFBydCA9ICZwQUMtPkdJbmkuR1BbaV07CisJCQkKKwkJCWlmIChwUHJ0LT5QU3RhdGUgPT0gU0tfUFJUX1JFU0VUKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKyNpZmRlZiBHRU5FU0lTCisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCQorCQkJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQkJCQorCQkJCWNhc2UgU0tfUEhZX1hNQUM6CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgU0tfUEhZX0JDT006CisJCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBpLCBQSFlfQkNPTV9JTlRfU1RBVCwgJlBoeUludCk7CisJCisJCQkJCWlmICgoUGh5SW50ICYgflBIWV9CX0RFRl9NU0spICE9IDApIHsKKwkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkJCSgiUG9ydCAlZCBCY29tIEludDogMHglMDRYXG4iLAorCQkJCQkJCWksIFBoeUludCkpOworCQkJCQkJU2tQaHlJc3JCY29tKHBBQywgSW9DLCBpLCBQaHlJbnQpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQkJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBpLCBQSFlfTE9ORV9JTlRfU1RBVCwgJlBoeUludCk7CisJCQkJCQorCQkJCQlpZiAoKFBoeUludCAmIFBIWV9MX0RFRl9NU0spICE9IDApIHsKKwkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkJCSgiUG9ydCAlZCBMb25lIEludDogJXhcbiIsCisJCQkJCQkJaSwgUGh5SW50KSk7CisJCQkJCQlTa1BoeUlzckxvbmUocEFDLCBJb0MsIGksIFBoeUludCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisJCQkJfQorCQkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQkJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQkJLyogUmVhZCBQSFkgSW50ZXJydXB0IFN0YXR1cyAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBpLCBQSFlfTUFSVl9JTlRfU1RBVCwgJlBoeUludCk7CisKKwkJCQlpZiAoKFBoeUludCAmIFBIWV9NX0RFRl9NU0spICE9IDApIHsKKwkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCQkoIlBvcnQgJWQgTWFydiBJbnQ6IDB4JTA0WFxuIiwKKwkJCQkJCWksIFBoeUludCkpOworCQkJCQlTa1BoeUlzckdtYWMocEFDLCBJb0MsIGksIFBoeUludCk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8qIFlVS09OICovCisJCX0KKwl9CisKKwkvKiBJMkMgUmVhZHkgaW50ZXJydXB0ICovCisJaWYgKChJc3RhdHVzICYgSVNfSTJDX1JFQURZKSAhPSAwKSB7CisjaWZkZWYgU0tfU0xJTQorICAgICAgICBTS19PVVQzMihJb0MsIEIyX0kyQ19JUlEsIEkyQ19DTFJfSVJRKTsKKyNlbHNlCQkKKwkJU2tJMmNJc3IocEFDLCBJb0MpOworI2VuZGlmCQkKKwl9CisKKwkvKiBTVyBmb3JjZWQgaW50ZXJydXB0ICovCisJaWYgKChJc3RhdHVzICYgSVNfSVJRX1NXKSAhPSAwKSB7CisJCS8qIGNsZWFyIHRoZSBzb2Z0d2FyZSBJUlEgKi8KKwkJU0tfT1VUOChJb0MsIEIwX0NUU1QsIENTX0NMX1NXX0lSUSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfTE5LX1NZTkNfTTEpICE9IDApIHsKKwkJLyoKKwkJICogV2UgZG8gTk9UIG5lZWQgdGhlIExpbmsgU3luYyBpbnRlcnJ1cHQsIGJlY2F1c2UgaXQgc2hvd3MKKwkJICogdXMgb25seSBhIGxpbmsgZ29pbmcgZG93bi4KKwkJICovCisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihNQUNfMSwgTE5LX1NZTkNfQ1RSTCksIExFRF9DTFJfSVJRKTsKKwl9CisKKwkvKiBDaGVjayBNQUMgYWZ0ZXIgbGluayBzeW5jIGNvdW50ZXIgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19NQUMxKSAhPSAwKSB7CisJCS8qIElSUSBmcm9tIE1BQyAxICovCisJCVNrTWFjSXJxKHBBQywgSW9DLCBNQUNfMSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfTE5LX1NZTkNfTTIpICE9IDApIHsKKwkJLyoKKwkJICogV2UgZG8gTk9UIG5lZWQgdGhlIExpbmsgU3luYyBpbnRlcnJ1cHQsIGJlY2F1c2UgaXQgc2hvd3MKKwkJICogdXMgb25seSBhIGxpbmsgZ29pbmcgZG93bi4KKwkJICovCisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihNQUNfMiwgTE5LX1NZTkNfQ1RSTCksIExFRF9DTFJfSVJRKTsKKwl9CisKKwkvKiBDaGVjayBNQUMgYWZ0ZXIgbGluayBzeW5jIGNvdW50ZXIgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19NQUMyKSAhPSAwKSB7CisJCS8qIElSUSBmcm9tIE1BQyAyICovCisJCVNrTWFjSXJxKHBBQywgSW9DLCBNQUNfMik7CisJfQorCisJLyogVGltZXIgaW50ZXJydXB0IChzZXJ2ZWQgbGFzdCkgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19USU1JTlQpICE9IDApIHsKKwkJLyogY2hlY2sgZm9yIEhXIEVycm9ycyAqLworCQlpZiAoKChJc3RhdHVzICYgSVNfSFdfRVJSKSAmIH5wQUMtPkdJbmkuR0lWYWxJcnFNYXNrKSAhPSAwKSB7CisJCQkvKiByZWFkIHRoZSBIVyBFcnJvciBJbnRlcnJ1cHQgc291cmNlICovCisJCQlTS19JTjMyKElvQywgQjBfSFdFX0lTUkMsICZSZWdWYWwzMik7CisKKwkJCVNrR2VId0VycihwQUMsIElvQywgUmVnVmFsMzIpOworCQl9CisKKwkJU2tId3RJc3IocEFDLCBJb0MpOworCX0KKworfQkvKiBTa0dlU2lycUlzciAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1Nob3J0cygpIC0gSW1wbGVtZW50aW5nIFhNQUMgV29ya2Fyb3VuZCBFcnJhdGEgIyAyCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tTaG9ydHMoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0KQkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworeworCVNLX1UzMgkJU2hvcnRzOwkJCS8qIFNob3J0IEV2ZW50IENvdW50ZXIgKi8KKwlTS19VMzIJCUNoZWNrU2hvcnRzOwkvKiBDaGVjayB2YWx1ZSBmb3IgU2hvcnQgRXZlbnQgQ291bnRlciAqLworCVNLX1U2NAkJUnhDdHM7CQkJLyogUnggQ291bnRlciAocGFja2V0cyBvbiBuZXR3b3JrKSAqLworCVNLX1UzMgkJUnhUbXA7CQkJLyogUnggdGVtcC4gQ291bnRlciAqLworCVNLX1UzMgkJRmNzRXJyQ3RzOwkJLyogRkNTIEVycm9yIENvdW50ZXIgKi8KKwlTS19HRVBPUlQJKnBQcnQ7CQkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJaW50CQkJUnR2OwkJCS8qIFJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIERlZmF1bHQ6IG5vIGFjdGlvbiAqLworCVJ0diA9IFNLX0hXX1BTX05PTkU7CisKKwkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIFBvcnQpOworCisJLyogRXh0cmEgcHJlY2F1dGlvbjogY2hlY2sgZm9yIHNob3J0IEV2ZW50IGNvdW50ZXIgKi8KKwkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9SWEVfU0hUX0VSUiwgJlNob3J0cyk7CisKKwkvKgorCSAqIFJlYWQgUnggY291bnRlcnMgKHBhY2tldHMgc2VlbiBvbiB0aGUgbmV0d29yayBhbmQgbm90IG5lY2Vzc2FyaWx5CisJICogcmVhbGx5IHJlY2VpdmVkLgorCSAqLworCVJ4Q3RzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoU2tHZVJ4UmVncykvc2l6ZW9mKFNrR2VSeFJlZ3NbMF0pOyBpKyspIHsKKwkJCisJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFNrR2VSeFJlZ3NbaV0sICZSeFRtcCk7CisJCQorCQlSeEN0cyArPSAoU0tfVTY0KVJ4VG1wOworCX0KKworCS8qIE9uIGRlZmF1bHQ6IGNoZWNrIHNob3J0cyBhZ2FpbnN0IHplcm8gKi8KKwlDaGVja1Nob3J0cyA9IDA7CisKKwkvKiBFeHRyYSBwcmVjYXV0aW9uIG9uIGFjdGl2ZSBsaW5rcyAqLworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJLyogUmVzZXQgTGluayBSZXN0YXJ0IGNvdW50ZXIgKi8KKwkJcFBydC0+UExpbmtSZXNDdCA9IDA7CisJCXBQcnQtPlBBdXRvTmVnVE9DdCA9IDA7CisKKwkJLyogSWYgbGluayBpcyB1cCBjaGVjayBmb3IgMiAqLworCQlDaGVja1Nob3J0cyA9IDI7CisKKwkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fUlhGX0ZDU19FUlIsICZGY3NFcnJDdHMpOworCQkKKwkJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgPT0gU0tfTE1PREVfQVVUT1NFTlNFICYmCisJCSAgICBwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9VTktOT1dOICYmCisJCSAgICAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwKKwkJCSBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGF1dG9zZW5zaW5nIGFuZCB3ZSBhcmUgaW4gdGhlIGZhbGxiYWNrCisJCQkgKiBtYW51YWwgZnVsbC9oYWxmIGR1cGxleCBtb2RlLgorCQkJICovCisJCQlpZiAoUnhDdHMgPT0gcFBydC0+UFByZXZSeCkgeworCQkJCS8qIE5vdGhpbmcgcmVjZWl2ZWQsIHJlc3RhcnQgbGluayAqLworCQkJCXBQcnQtPlBQcmV2RmNzID0gRmNzRXJyQ3RzOworCQkJCXBQcnQtPlBQcmV2U2hvcnRzID0gU2hvcnRzOworCQkJCQorCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBQcnQtPlBMaXBhQXV0b05lZyA9IFNLX0xJUEFfTUFOVUFMOworCQkJfQorCQl9CisKKwkJaWYgKCgoUnhDdHMgLSBwUHJ0LT5QUHJldlJ4KSA+IHBQcnQtPlBSeExpbSkgfHwKKwkJICAgICghKEZjc0VyckN0cyAtIHBQcnQtPlBQcmV2RmNzKSkpIHsKKwkJCS8qCisJCQkgKiBOb3RlOiBUaGUgY29tcGFyZSB3aXRoIHplcm8gYWJvdmUgaGFzIHRvIGJlIGRvbmUgdGhlIHdheSBzaG93biwKKwkJCSAqIG90aGVyd2lzZSB0aGUgTGludXggZHJpdmVyIHdpbGwgaGF2ZSBhIHByb2JsZW0uCisJCQkgKi8KKwkJCS8qCisJCQkgKiBXZSByZWNlaXZlZCBhIGJ1bmNoIG9mIGZyYW1lcyBvciBubyBDUkMgZXJyb3Igb2NjdXJlZCBvbiB0aGUKKwkJCSAqIG5ldHdvcmsgLT4gb2suCisJCQkgKi8KKwkJCXBQcnQtPlBQcmV2UnggPSBSeEN0czsKKwkJCXBQcnQtPlBQcmV2RmNzID0gRmNzRXJyQ3RzOworCQkJcFBydC0+UFByZXZTaG9ydHMgPSBTaG9ydHM7CisKKwkJCXJldHVybihTS19IV19QU19OT05FKTsKKwkJfQorCisJCXBQcnQtPlBQcmV2RmNzID0gRmNzRXJyQ3RzOworCX0KKworCisJaWYgKChTaG9ydHMgLSBwUHJ0LT5QUHJldlNob3J0cykgPiBDaGVja1Nob3J0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiU2hvcnQgRXZlbnQgQ291bnQgUmVzdGFydCBQb3J0ICVkIFxuIiwgUG9ydCkpOworCQlSdHYgPSBTS19IV19QU19SRVNUQVJUOworCX0KKworCXBQcnQtPlBQcmV2U2hvcnRzID0gU2hvcnRzOworCXBQcnQtPlBQcmV2UnggPSBSeEN0czsKKworCXJldHVybihSdHYpOworfQkvKiBTa0dlUG9ydENoZWNrU2hvcnRzICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXAoKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIHVwCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXAoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0KQkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX0JPT0wJCUF1dG9OZWc7CS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCisJaW50CQkJUnR2OwkJLyogUmV0dXJuIHZhbHVlICovCisKKwlSdHYgPSBTS19IV19QU19OT05FOworCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGIHx8IHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCUF1dG9OZWcgPSBTS19GQUxTRTsKKwl9CisJZWxzZSB7CisJCUF1dG9OZWcgPSBTS19UUlVFOworCX0KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCisJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQkKKwkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCVJ0diA9IFNrR2VQb3J0Q2hlY2tVcFhtYWMocEFDLCBJb0MsIFBvcnQsIEF1dG9OZWcpOworCQkJYnJlYWs7CisJCWNhc2UgU0tfUEhZX0JDT006CisJCQlSdHYgPSBTa0dlUG9ydENoZWNrVXBCY29tKHBBQywgSW9DLCBQb3J0LCBBdXRvTmVnKTsKKwkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQljYXNlIFNLX1BIWV9MT05FOgorCQkJUnR2ID0gU2tHZVBvcnRDaGVja1VwTG9uZShwQUMsIElvQywgUG9ydCwgQXV0b05lZyk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfTkFUOgorCQkJUnR2ID0gU2tHZVBvcnRDaGVja1VwTmF0KHBBQywgSW9DLCBQb3J0LCBBdXRvTmVnKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQl9CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJUnR2ID0gU2tHZVBvcnRDaGVja1VwR21hYyhwQUMsIElvQywgUG9ydCwgQXV0b05lZyk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwlyZXR1cm4oUnR2KTsJCit9CS8qIFNrR2VQb3J0Q2hlY2tVcCAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwWG1hYygpIC0gSW1wbGVtZW50aW5nIG9mIHRoZSBXb3JrYXJvdW5kIEVycmF0YSAjIDIKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcFhtYWMoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworU0tfQk9PTAlBdXRvTmVnKQkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworeworCVNLX1UzMgkJU2hvcnRzOwkJLyogU2hvcnQgRXZlbnQgQ291bnRlciAqLworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCWludAkJCURvbmU7CisJU0tfVTMyCQlHcFJlZzsJCS8qIEdlbmVyYWwgUHVycG9zZSByZWdpc3RlciB2YWx1ZSAqLworCVNLX1UxNgkJSXNyYzsJCS8qIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKwlTS19VMTYJCUlzcmNTdW07CS8qIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgc3VtICovCisJU0tfVTE2CQlMcEFiOwkJLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKi8KKwlTS19VMTYJCVJlc0FiOwkJLyogUmVzb2x2ZWQgQWJpbGl0eSAqLworCVNLX1UxNgkJRXh0U3RhdDsJLyogRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICovCisJU0tfVTgJCU5leHRNb2RlOwkvKiBOZXh0IEF1dG9TZW5zaW5nIE1vZGUgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgeworCQkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuKFNrR2VQb3J0Q2hlY2tTaG9ydHMocEFDLCBJb0MsIFBvcnQpKTsKKwkJfQorCX0KKworCUlzcmNTdW0gPSBwUHJ0LT5QSXNhdmU7CisJcFBydC0+UElzYXZlID0gMDsKKworCS8qIE5vdyB3YWl0IGZvciBlYWNoIHBvcnQncyBsaW5rICovCisJaWYgKHBQcnQtPlBMaW5rQnJva2VuKSB7CisJCS8qIExpbmsgd2FzIGJyb2tlbiAqLworCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fR1BfUE9SVCwgJkdwUmVnKTsKKworCQlpZiAoKEdwUmVnICYgWE1fR1BfSU5QX0FTUykgPT0gMCkgeworCQkJLyogVGhlIExpbmsgaXMgaW4gc3luYyAqLworCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJc3JjKTsKKwkJCUlzcmNTdW0gfD0gSXNyYzsKKwkJCVNrWG1BdXRvTmVnTGlwYVhtYWMocEFDLCBJb0MsIFBvcnQsIElzcmNTdW0pOworCQkJCisJCQlpZiAoKElzcmMgJiBYTV9JU19JTlBfQVNTKSA9PSAwKSB7CisJCQkJLyogSXQgaGFzIGJlZW4gaW4gc3luYyBzaW5jZSBsYXN0IHRpbWUgKi8KKwkJCQkvKiBSZXN0YXJ0IHRoZSBQT1JUICovCisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCSgiTGluayBpbiBzeW5jIFJlc3RhcnQgUG9ydCAlZFxuIiwgUG9ydCkpOworCisJCQkJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCBQb3J0KTsKKworCQkJCS8qIFdlIG5vdyBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgUHJldlNob3J0cyBjb3VudGVyICovCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fUlhFX1NIVF9FUlIsICZTaG9ydHMpOworCQkJCXBQcnQtPlBQcmV2U2hvcnRzID0gU2hvcnRzOworCisJCQkJcFBydC0+UExpbmtCcm9rZW4gPSBTS19GQUxTRTsKKworCQkJCS8qCisJCQkJICogTGluayBSZXN0YXJ0IFdvcmthcm91bmQ6CisJCQkJICogIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHRoZSBvdGhlciBMaW5rIHNpZGUKKwkJCQkgKiAgcmVzdGFydHMgaXRzIGxpbmsgYXMgd2VsbCBhbiB3ZSBkZXRlY3QKKwkJCQkgKiAgYW5vdGhlciBMaW5rQnJva2VuLiBUbyBwcmV2ZW50IHRoaXMKKwkJCQkgKiAgaGFwcGVuaW5nIHdlIGNoZWNrIGZvciBhIG1heGltdW0gbnVtYmVyCisJCQkJICogIG9mIGNvbnNlY3V0aXZlIHJlc3RhcnQuIElmIHRob3NlIGhhcHBlbnMsCisJCQkJICogIHdlIGRvIE5PVCByZXN0YXJ0IHRoZSBhY3RpdmUgbGluayBhbmQKKwkJCQkgKiAgY2hlY2sgd2hldGhlciB0aGUgbGluayBpcyBub3cgby5rLgorCQkJCSAqLworCQkJCXBQcnQtPlBMaW5rUmVzQ3QrKzsKKwkJCQkKKwkJCQlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPSAwOworCisJCQkJaWYgKHBQcnQtPlBMaW5rUmVzQ3QgPCBTS19NQVhfTFJFU1RBUlQpIHsKKwkJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJCX0KKworCQkJCXBQcnQtPlBMaW5rUmVzQ3QgPSAwOworCQkJCQorCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJEbyBOT1QgcmVzdGFydCBvbiBQb3J0ICVkICV4ICV4XG4iLCBQb3J0LCBJc3JjLCBJc3JjU3VtKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwUHJ0LT5QSXNhdmUgPSAoU0tfVTE2KShJc3JjU3VtICYgWE1fSVNfQU5EKTsKKwkJCQkKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiU2F2ZSBTeW5jL25vc3luYyBQb3J0ICVkICV4ICV4XG4iLCBQb3J0LCBJc3JjLCBJc3JjU3VtKSk7CisKKwkJCQkvKiBEbyBub3RoaW5nIG1vcmUgaWYgbGluayBpcyBicm9rZW4gKi8KKwkJCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEbyBub3RoaW5nIG1vcmUgaWYgbGluayBpcyBicm9rZW4gKi8KKwkJCXJldHVybihTS19IV19QU19OT05FKTsKKwkJfQorCisJfQorCWVsc2UgeworCQkvKiBMaW5rIHdhcyBub3QgYnJva2VuLCBjaGVjayBpZiBpdCBpcyAqLworCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklzcmMpOworCQlJc3JjU3VtIHw9IElzcmM7CisJCWlmICgoSXNyYyAmIFhNX0lTX0lOUF9BU1MpICE9IDApIHsKKwkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmSXNyYyk7CisJCQlJc3JjU3VtIHw9IElzcmM7CisJCQlpZiAoKElzcmMgJiBYTV9JU19JTlBfQVNTKSAhPSAwKSB7CisJCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJc3JjKTsKKwkJCQlJc3JjU3VtIHw9IElzcmM7CisJCQkJaWYgKChJc3JjICYgWE1fSVNfSU5QX0FTUykgIT0gMCkgeworCQkJCQlwUHJ0LT5QTGlua0Jyb2tlbiA9IFNLX1RSVUU7CisJCQkJCS8qIFJlLUluaXQgTGluayBwYXJ0bmVyIEF1dG9uZWcgZmxhZyAqLworCQkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSBTS19MSVBBX1VOS05PV047CisJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkJKCJMaW5rIGJyb2tlbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisKKwkJCQkJLyogQ2FibGUgcmVtb3ZlZC0+IHJlaW5pdCBzZW5zZSBtb2RlICovCisJCQkJCVNrSFdJbml0RGVmU2Vuc2UocEFDLCBJb0MsIFBvcnQpOworCisJCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlTa1htQXV0b05lZ0xpcGFYbWFjKHBBQywgSW9DLCBQb3J0LCBJc3JjKTsKKwkJCQorCQkJaWYgKFNrR2VQb3J0Q2hlY2tTaG9ydHMocEFDLCBJb0MsIFBvcnQpID09IFNLX0hXX1BTX1JFU1RBUlQpIHsKKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIGhlcmUgd2UgdXN1YWxseSBjYW4gY2hlY2sgd2hldGhlciB0aGUgbGluayBpcyBpbiBzeW5jIGFuZAorCSAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZG9uZS4KKwkgKi8KKwlYTV9JTjMyKElvQywgUG9ydCwgWE1fR1BfUE9SVCwgJkdwUmVnKTsKKwlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklzcmMpOworCUlzcmNTdW0gfD0gSXNyYzsKKworCVNrWG1BdXRvTmVnTGlwYVhtYWMocEFDLCBJb0MsIFBvcnQsIElzcmNTdW0pOworCQorCWlmICgoR3BSZWcgJiBYTV9HUF9JTlBfQVNTKSAhPSAwIHx8IChJc3JjU3VtICYgWE1fSVNfSU5QX0FTUykgIT0gMCkgeworCQlpZiAoKEdwUmVnICYgWE1fR1BfSU5QX0FTUykgPT0gMCkgeworCQkJLyogU2F2ZSBBdXRvLW5lZ290aWF0aW9uIERvbmUgaW50ZXJydXB0IG9ubHkgaWYgbGluayBpcyBpbiBzeW5jICovCisJCQlwUHJ0LT5QSXNhdmUgPSAoU0tfVTE2KShJc3JjU3VtICYgWE1fSVNfQU5EKTsKKwkJfQorI2lmZGVmIERFQlVHCisJCWlmICgocFBydC0+UElzYXZlICYgWE1fSVNfQU5EKSAhPSAwKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJBdXRvTmVnIGRvbmUgcmVzY2hlZHVsZWQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKworCWlmIChBdXRvTmVnKSB7CisJCWlmICgoSXNyY1N1bSAmIFhNX0lTX0FORCkgIT0gMCkgeworCQkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQlEb25lID0gU2tNYWNBdXRvTmVnRG9uZShwQUMsIElvQywgUG9ydCk7CisJCQlpZiAoRG9uZSAhPSBTS19BTkRfT0spIHsKKwkJCQkvKiBHZXQgUEhZIHBhcmFtZXRlcnMsIGZvciBkZWJ1Z2dpbmcgb25seSAqLworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19BVU5FX0xQLCAmTHBBYik7CisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9YTUFDX1JFU19BQkksICZSZXNBYik7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIkF1dG9OZWcgRkFJTCBQb3J0ICVkIChMcEFiICV4LCBSZXNBYiAleClcbiIsCisJCQkJCSBQb3J0LCBMcEFiLCBSZXNBYikpOworCQkJCQkKKwkJCQkvKiBUcnkgbmV4dCBwb3NzaWJsZSBtb2RlICovCisJCQkJTmV4dE1vZGUgPSBTa0hXU2Vuc2VHZXROZXh0KHBBQywgSW9DLCBQb3J0KTsKKwkJCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIFBvcnQpOworCQkJCWlmIChEb25lID09IFNLX0FORF9EVVBfQ0FQKSB7CisJCQkJCS8qIEdvVG8gbmV4dCBtb2RlICovCisJCQkJCVNrSFdTZW5zZVNldE5leHQocEFDLCBJb0MsIFBvcnQsIE5leHRNb2RlKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQl9CisJCQkvKgorCQkJICogRHVtbXkgUmVhZCBleHRlbmRlZCBzdGF0dXMgdG8gcHJldmVudCBleHRyYSBsaW5rIGRvd24vdXBzCisJCQkgKiAoY2xlYXIgUGFnZSBSZWNlaXZlZCBiaXQgaWYgc2V0KQorCQkJICovCisJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfQVVORV9FWFAsICZFeHRTdGF0KTsKKwkJCQorCQkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCQl9CisJCQorCQkvKiBBdXRvTmVnIG5vdCBkb25lLCBidXQgSFcgbGluayBpcyB1cC4gQ2hlY2sgZm9yIHRpbWVvdXRzICovCisJCXBQcnQtPlBBdXRvTmVnVGltZU91dCsrOworCQlpZiAocFBydC0+UEF1dG9OZWdUaW1lT3V0ID49IFNLX0FORF9NQVhfVE8pIHsKKwkJCS8qIEluY3JlYXNlIHRoZSBUaW1lb3V0IGNvdW50ZXIgKi8KKwkJCXBQcnQtPlBBdXRvTmVnVE9DdCsrOworCisJCQkvKiBUaW1lb3V0IG9jY3VyZWQgKi8KKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCSgiQXV0b05lZyB0aW1lb3V0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCWlmIChwUHJ0LT5QTGlua01vZGVDb25mID09IFNLX0xNT0RFX0FVVE9TRU5TRSAmJgorCQkJCXBQcnQtPlBMaXBhQXV0b05lZyAhPSBTS19MSVBBX0FVVE8pIHsKKwkJCQkvKiBTZXQgTGluayBtYW51YWxseSB1cCAqLworCQkJCVNrSFdTZW5zZVNldE5leHQocEFDLCBJb0MsIFBvcnQsIFNLX0xNT0RFX0ZVTEwpOworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkoIlNldCBtYW51YWwgZnVsbCBkdXBsZXggUG9ydCAlZFxuIiwgUG9ydCkpOworCQkJfQorCisJCQlpZiAocFBydC0+UExpbmtNb2RlQ29uZiA9PSBTS19MTU9ERV9BVVRPU0VOU0UgJiYKKwkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9BVVRPICYmCisJCQkJcFBydC0+UEF1dG9OZWdUT0N0ID49IFNLX01BWF9BTkVHX1RPKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHJhdGhlciBjb21wbGljYXRlZC4KKwkJCQkgKiB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUgd2hldGhlciB0aGUgTElQQV9BVVRPCisJCQkJICogd2Ugc2F3IGJlZm9yZSBpcyBmYWxzZSBhbGVydC4gV2Ugc2F3IGF0IG9uZQorCQkJCSAqIHN3aXRjaCAoIFNSODgwMCkgdGhhdCBvbiBib290IHRpbWUgaXQgc2VuZHMKKwkJCQkgKiBqdXN0IG9uZSBhdXRvLW5lZyBwYWNrZXQgYW5kIGRvZXMgbm8gZnVydGhlcgorCQkJCSAqIGF1dG8tbmVnb3RpYXRpb24uCisJCQkJICogU29sdXRpb246IHdlIHJlc3RhcnQgdGhlIGF1dG9zZW5zaW5nIGFmdGVyCisJCQkJICogYSBmZXcgdGltZW91dHMuCisJCQkJICovCisJCQkJcFBydC0+UEF1dG9OZWdUT0N0ID0gMDsKKwkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSBTS19MSVBBX1VOS05PV047CisJCQkJU2tIV0luaXREZWZTZW5zZShwQUMsIElvQywgUG9ydCk7CisJCQl9CisKKwkJCS8qIERvIHRoZSByZXN0YXJ0ICovCisJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIExpbmsgaXMgdXAgYW5kIHdlIGRvbid0IG5lZWQgbW9yZSAqLworI2lmZGVmIERFQlVHCisJCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9BVVRPKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJFUlJPUjogTGlwYSBhdXRvIGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJMaW5rIHN5bmMoR1ApLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJLyoKKwkJICogTGluayBzeW5jIChHUCkgYW5kIHNvIGFzc3VtZSBhIGdvb2QgY29ubmVjdGlvbi4gQnV0IGlmIG5vdCByZWNlaXZlZAorCQkgKiBhIGJ1bmNoIG9mIGZyYW1lcyByZWNlaXZlZCBpbiBhIHRpbWUgc2xvdCAobWF5YmUgYnJva2VuIHR4IGNhYmxlKQorCQkgKiB0aGUgcG9ydCBpcyByZXN0YXJ0LgorCQkgKi8KKwkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCX0KKworCXJldHVybihTS19IV19QU19OT05FKTsKK30JLyogU2tHZVBvcnRDaGVja1VwWG1hYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXBCY29tKCkgLSBDaGVjayBpZiB0aGUgbGluayBpcyB1cCBvbiBCY29tIFBIWQorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwQmNvbSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCitTS19CT09MCUF1dG9OZWcpCS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJaW50CQkJRG9uZTsKKwlTS19VMTYJCUlzcmM7CQkvKiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisJU0tfVTE2CQlQaHlTdGF0OwkvKiBQaHkgU3RhdHVzIFJlZ2lzdGVyICovCisJU0tfVTE2CQlSZXNBYjsJCS8qIE1hc3Rlci9TbGF2ZSByZXNvbHV0aW9uICovCisJU0tfVTE2CQlDdHJsOwkJLyogQnJvYWRjb20gY29udHJvbCBmbGFncyAqLworI2lmZGVmIERFQlVHCisJU0tfVTE2CQlMcEFiOworCVNLX1UxNgkJRXh0U3RhdDsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBDaGVjayBmb3IgTm8gSENEIExpbmsgZXZlbnRzICgjMTA1MjMpICovCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9TVEFULCAmSXNyYyk7CisKKyNpZmRlZiB4REVCVUcKKwlpZiAoKElzcmMgJiB+KFBIWV9CX0lTX0hDVCB8IFBIWV9CX0lTX0xDVCkgPT0KKwkJKFBIWV9CX0lTX1NDUl9TX0VSIHwgUEhZX0JfSVNfUlJTX0NIQU5HRSB8IFBIWV9CX0lTX0xSU19DSEFOR0UpKSB7CisKKwkJU0tfVTMyCVN0YXQxLCBTdGF0MiwgU3RhdDM7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX01BU0ssICZTdGF0MSk7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkNoZWNrVXAxIC0gU3RhdDogJXgsIE1hc2s6ICV4IiwKKwkJCSh2b2lkICopSXNyYywKKwkJCSh2b2lkICopU3RhdDEpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1NUQVQsICZTdGF0Mik7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBTdGF0MjsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9BRFYsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfTFAsICZTdGF0Myk7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBTdGF0MzsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQ3RybC9TdGF0OiAleCwgQU4gQWR2L0xQOiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9FWFAsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0VYVF9TVEFULCAmU3RhdDIpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgU3RhdDI7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX1NUQVQsICZTdGF0Myk7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBTdGF0MzsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQU4gRXhwL0lFRUUgRXh0OiAleCwgMTAwMFQgQ3RybC9TdGF0OiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fUF9FWFRfU1RBVCwgJlN0YXQyKTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFN0YXQyOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX1NUQVQsICZTdGF0Myk7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBTdGF0MzsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiUEhZIEV4dCBDdHJsL1N0YXQ6ICV4LCBBdXggQ3RybC9TdGF0OiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwlpZiAoKElzcmMgJiAoUEhZX0JfSVNfTk9fSERDTCAvKiB8IFBIWV9CX0lTX05PX0hEQyAqLykpICE9IDApIHsKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBCQ29tIEVycmF0YToKKwkJICoJZW5hYmxlIGFuZCBkaXNhYmxlIGxvb3BiYWNrIG1vZGUgaWYgIk5PIEhDRCIgb2NjdXJzLgorCQkgKi8KKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsICZDdHJsKTsKKwkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLAorCQkJKFNLX1UxNikoQ3RybCB8IFBIWV9DVF9MT09QKSk7CisJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQ1RSTCwKKwkJCShTS19VMTYpKEN0cmwgJiB+UEhZX0NUX0xPT1ApKTsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJObyBIQ0QgTGluayBldmVudCwgUG9ydCAlZFxuIiwgUG9ydCkpOworI2lmZGVmIHhERUJVRworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJObyBIQ0QgbGluayBldmVudCwgcG9ydCAlZC4iLAorCQkJKHZvaWQgKilQb3J0LAorCQkJKHZvaWQgKilOVUxMKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCX0KKworCS8qIE5vdCBvYnNvbGV0ZTogbGluayBzdGF0dXMgYml0IGlzIGxhdGNoZWQgdG8gMCBhbmQgYXV0b2NsZWFyaW5nISAqLworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9TVEFULCAmUGh5U3RhdCk7CisKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisKKyNpZmRlZiB4REVCVUcKKwl7CisJCVNLX1UzMglTdGF0MSwgU3RhdDIsIFN0YXQzOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAmU3RhdDEpOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJDaGVja1VwMWEgLSBTdGF0OiAleCwgTWFzazogJXgiLAorCQkJKHZvaWQgKilJc3JjLAorCQkJKHZvaWQgKilTdGF0MSk7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQ1RSTCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fU1RBVCwgJlBoeVN0YXQpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgUGh5U3RhdDsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9BRFYsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfTFAsICZTdGF0Myk7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBTdGF0MzsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQ3RybC9TdGF0OiAleCwgQU4gQWR2L0xQOiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9FWFAsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0VYVF9TVEFULCAmU3RhdDIpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgU3RhdDI7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX1NUQVQsICZSZXNBYik7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBSZXNBYjsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQU4gRXhwL0lFRUUgRXh0OiAleCwgMTAwMFQgQ3RybC9TdGF0OiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fUF9FWFRfU1RBVCwgJlN0YXQyKTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFN0YXQyOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX1NUQVQsICZTdGF0Myk7CisJCVN0YXQyID0gU3RhdDIgPDwgMTYgfCBTdGF0MzsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiUEhZIEV4dCBDdHJsL1N0YXQ6ICV4LCBBdXggQ3RybC9TdGF0OiAleCIsCisJCQkodm9pZCAqKVN0YXQxLAorCQkJKHZvaWQgKilTdGF0Mik7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkvKgorCSAqIEhlcmUgd2UgdXN1YWxseSBjYW4gY2hlY2sgd2hldGhlciB0aGUgbGluayBpcyBpbiBzeW5jIGFuZAorCSAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZG9uZS4KKwkgKi8KKworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9TVEFULCAmUGh5U3RhdCk7CisKKwlTa01hY0F1dG9OZWdMaXBhUGh5KHBBQywgSW9DLCBQb3J0LCBQaHlTdGF0KTsKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQ2hlY2tVcCBQb3J0ICVkLCBQaHlTdGF0OiAweCUwNFhcbiIsIFBvcnQsIFBoeVN0YXQpKTsKKworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9TVEFULCAmUmVzQWIpOworCisJaWYgKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TRikgIT0gMCkgeworCQkvKiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIk1hc3Rlci9TbGF2ZSBGYXVsdCBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCQorCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX0ZBVUxUOworCQkKKwkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCX0KKworCWlmICgoUGh5U3RhdCAmIFBIWV9TVF9MU1lOQykgPT0gMCkgeworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCQorCXBQcnQtPlBNU1N0YXR1cyA9ICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU1IpICE9IDApID8KKwkJU0tfTVNfU1RBVF9NQVNURVIgOiBTS19NU19TVEFUX1NMQVZFOworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQb3J0ICVkLCBSZXNBYjogMHglMDRYXG4iLCBQb3J0LCBSZXNBYikpOworCisJaWYgKEF1dG9OZWcpIHsKKwkJaWYgKChQaHlTdGF0ICYgUEhZX1NUX0FOX09WRVIpICE9IDApIHsKKwkJCQorCQkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQkKKwkJCURvbmUgPSBTa01hY0F1dG9OZWdEb25lKHBBQywgSW9DLCBQb3J0KTsKKwkJCQorCQkJaWYgKERvbmUgIT0gU0tfQU5EX09LKSB7CisjaWZkZWYgREVCVUcKKwkJCQkvKiBHZXQgUEhZIHBhcmFtZXRlcnMsIGZvciBkZWJ1Z2dpbmcgb25seSAqLworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0xQLCAmTHBBYik7CisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX1NUQVQsICZFeHRTdGF0KTsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiQXV0b05lZyBGQUlMIFBvcnQgJWQgKExwQWIgJXgsIDEwMDBUU3RhdCAleClcbiIsCisJCQkJCVBvcnQsIExwQWIsIEV4dFN0YXQpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCX0KKwkJCWVsc2UgeworI2lmZGVmIHhERUJVRworCQkJCS8qIER1bW15IHJlYWQgSVNSIHRvIHByZXZlbnQgZXh0cmEgbGluayBkb3ducy91cHMgKi8KKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX1NUQVQsICZFeHRTdGF0KTsKKworCQkJCWlmICgoRXh0U3RhdCAmIH4oUEhZX0JfSVNfSENUIHwgUEhZX0JfSVNfTENUKSkgIT0gMCkgeworCQkJCQlDTVNNUHJpbnRTdHJpbmcoCisJCQkJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCQkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCQkJCSJDaGVja1VwMiAtIFN0YXQ6ICV4IiwKKwkJCQkJCSh2b2lkICopRXh0U3RhdCwKKwkJCQkJCSh2b2lkICopTlVMTCk7CisJCQkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCQkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCQkJfQorCQl9CisJfQorCWVsc2UgewkvKiAhQXV0b05lZyAqLworCQkvKiBMaW5rIGlzIHVwIGFuZCB3ZSBkb24ndCBuZWVkIG1vcmUuICovCisjaWZkZWYgREVCVUcKKwkJaWYgKHBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX0FVVE8pIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkVSUk9SOiBMaXBhIGF1dG8gZGV0ZWN0ZWQgb24gcG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIHhERUJVRworCQkvKiBEdW1teSByZWFkIElTUiB0byBwcmV2ZW50IGV4dHJhIGxpbmsgZG93bnMvdXBzICovCisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfU1RBVCwgJkV4dFN0YXQpOworCisJCWlmICgoRXh0U3RhdCAmIH4oUEhZX0JfSVNfSENUIHwgUEhZX0JfSVNfTENUKSkgIT0gMCkgeworCQkJQ01TTVByaW50U3RyaW5nKAorCQkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCQkiQ2hlY2tVcDMgLSBTdGF0OiAleCIsCisJCQkJKHZvaWQgKilFeHRTdGF0LAorCQkJCSh2b2lkICopTlVMTCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIkxpbmsgc3luYyhHUCksIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQorCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJfQorCisJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworfQkvKiBTa0dlUG9ydENoZWNrVXBCY29tICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKyNpZmRlZiBZVUtPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcEdtYWMoKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9uIE1hcnZlbGwgUEhZCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXBHbWFjKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK1NLX0JPT0wJQXV0b05lZykJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlpbnQJCQlEb25lOworCVNLX1UxNgkJUGh5SXNyYzsJLyogUEhZIEludGVycnVwdCBzb3VyY2UgKi8KKwlTS19VMTYJCVBoeVN0YXQ7CS8qIFBQWSBTdGF0dXMgKi8KKwlTS19VMTYJCVBoeVNwZWNTdGF0Oy8qIFBIWSBTcGVjaWZpYyBTdGF0dXMgKi8KKwlTS19VMTYJCVJlc0FiOwkJLyogTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gKi8KKwlTS19FVlBBUkEJUGFyYTsKKyNpZmRlZiBERUJVRworCVNLX1UxNgkJV29yZDsJCS8qIEkvTyBoZWxwZXIgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisKKwkvKiBSZWFkIFBIWSBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfU1RBVCwgJlBoeVN0YXQpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkNoZWNrVXAgUG9ydCAlZCwgUGh5U3RhdDogMHglMDRYXG4iLCBQb3J0LCBQaHlTdGF0KSk7CisKKwkvKiBSZWFkIFBIWSBJbnRlcnJ1cHQgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0lOVF9TVEFULCAmUGh5SXNyYyk7CisKKwlpZiAoKFBoeUlzcmMgJiBQSFlfTV9JU19BTl9DT01QTCkgIT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG8tTmVnb3RpYXRpb24gQ29tcGxldGVkLCBQaHlJc3JjOiAweCUwNFhcbiIsIFBoeUlzcmMpKTsKKwl9CisKKwlpZiAoKFBoeUlzcmMgJiBQSFlfTV9JU19MU1BfQ0hBTkdFKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTGluayBTcGVlZCBDaGFuZ2VkLCBQaHlJc3JjOiAweCUwNFhcbiIsIFBoeUlzcmMpKTsKKwl9CisKKwlTa01hY0F1dG9OZWdMaXBhUGh5KHBBQywgSW9DLCBQb3J0LCBQaHlTdGF0KTsKKwkKKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfMTAwMFRfU1RBVCwgJlJlc0FiKTsKKworCWlmICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU0YpICE9IDApIHsKKwkJLyogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNYXN0ZXIvU2xhdmUgRmF1bHQgcG9ydCAlZFxuIiwgUG9ydCkpOworCQkKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9GQVVMVDsKKwkJCisJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwl9CisKKwkvKiBSZWFkIFBIWSBTcGVjaWZpYyBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX1NUQVQsICZQaHlTcGVjU3RhdCk7CisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBoeTEwMDBCVDogMHglMDRYLCBQaHlTcGVjU3RhdDogMHglMDRYXG4iLCBSZXNBYiwgUGh5U3BlY1N0YXQpKTsKKworI2lmZGVmIERFQlVHCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfRVhQLCAmV29yZCk7CisKKwlpZiAoKFBoeUlzcmMgJiBQSFlfTV9JU19BTl9QUikgIT0gMCB8fCAoV29yZCAmIFBIWV9BTkVfUlhfUEcpICE9IDAgfHwKKwkJKFBoeVNwZWNTdGF0ICYgUEhZX01fUFNfUEFHRV9SRUMpICE9IDApICB7CisJCS8qIFJlYWQgUEhZIE5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX05FUEdfTFAsICZXb3JkKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlBhZ2UgUmVjZWl2ZWQsIE5leHRQYWdlOiAweCUwNFhcbiIsIFdvcmQpKTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCWlmICgoUGh5U3BlY1N0YXQgJiBQSFlfTV9QU19MSU5LX1VQKSA9PSAwKSB7CisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisJCisJaWYgKChQaHlTcGVjU3RhdCAmIFBIWV9NX1BTX0RPV05TX1NUQVQpICE9IDAgfHwKKwkJKFBoeUlzcmMgJiBQSFlfTV9JU19ET1dOU0hfREVUKSAhPSAwKSB7CisJCS8qIERvd25zaGlmdCBkZXRlY3RlZCAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAyNSwgU0tFUlJfU0lSUV9FMDI1TVNHKTsKKwkJCisJCVBhcmEuUGFyYTY0ID0gUG9ydDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9ET1dOU0hJRlRfREVULCBQYXJhKTsKKwkJCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiRG93bnNoaWZ0IGRldGVjdGVkLCBQaHlJc3JjOiAweCUwNFhcbiIsIFBoeUlzcmMpKTsKKwl9CisKKwlwUHJ0LT5QTVNTdGF0dXMgPSAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNSKSAhPSAwKSA/CisJCVNLX01TX1NUQVRfTUFTVEVSIDogU0tfTVNfU1RBVF9TTEFWRTsKKwkKKwlwUHJ0LT5QQ2FibGVMZW4gPSAoU0tfVTgpKChQaHlTcGVjU3RhdCAmIFBIWV9NX1BTX0NBQkxFX01TSykgPj4gNyk7CisJCisJaWYgKEF1dG9OZWcpIHsKKwkJLyogQXV0by1OZWdvdGlhdGlvbiBPdmVyID8gKi8KKwkJaWYgKChQaHlTdGF0ICYgUEhZX1NUX0FOX09WRVIpICE9IDApIHsKKwkJCQorCQkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQkKKwkJCURvbmUgPSBTa01hY0F1dG9OZWdEb25lKHBBQywgSW9DLCBQb3J0KTsKKwkJCQorCQkJaWYgKERvbmUgIT0gU0tfQU5EX09LKSB7CisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJfQorCQkJCisJCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJCX0KKwl9CisJZWxzZSB7CS8qICFBdXRvTmVnICovCisJCS8qIExpbmsgaXMgdXAgYW5kIHdlIGRvbid0IG5lZWQgbW9yZSAqLworI2lmZGVmIERFQlVHCisJCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9BVVRPKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJFUlJPUjogTGlwYSBhdXRvIGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIkxpbmsgc3luYywgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCXJldHVybihTS19IV19QU19MSU5LKTsKKwl9CisKKwlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7Cit9CS8qIFNrR2VQb3J0Q2hlY2tVcEdtYWMgKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZmRlZiBPVEhFUl9QSFkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXBMb25lKCkgLSBDaGVjayBpZiB0aGUgbGluayBpcyB1cCBvbiBMZXZlbCBPbmUgUEhZCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXBMb25lKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK1NLX0JPT0wJQXV0b05lZykJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlpbnQJCQlEb25lOworCVNLX1UxNgkJSXNyYzsJCS8qIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKwlTS19VMTYJCUxwQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCVNLX1UxNgkJRXh0U3RhdDsJLyogRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICovCisJU0tfVTE2CQlQaHlTdGF0OwkvKiBQaHkgU3RhdHVzIFJlZ2lzdGVyICovCisJU0tfVTE2CQlTdGF0U3VtOworCVNLX1U4CQlOZXh0TW9kZTsJLyogTmV4dCBBdXRvU2Vuc2luZyBNb2RlICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKworCVN0YXRTdW0gPSBwUHJ0LT5QSXNhdmU7CisJcFBydC0+UElzYXZlID0gMDsKKworCS8qCisJICogaGVyZSB3ZSB1c3VhbGx5IGNhbiBjaGVjayB3aGV0aGVyIHRoZSBsaW5rIGlzIGluIHN5bmMgYW5kCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBkb25lLgorCSAqLworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9TVEFULCAmUGh5U3RhdCk7CisJU3RhdFN1bSB8PSBQaHlTdGF0OworCisJU2tNYWNBdXRvTmVnTGlwYVBoeShwQUMsIElvQywgUG9ydCwgUGh5U3RhdCk7CisJCisJaWYgKChQaHlTdGF0ICYgUEhZX1NUX0xTWU5DKSA9PSAwKSB7CisJCS8qIFNhdmUgQXV0by1uZWdvdGlhdGlvbiBEb25lIGJpdCAqLworCQlwUHJ0LT5QSXNhdmUgPSAoU0tfVTE2KShTdGF0U3VtICYgUEhZX1NUX0FOX09WRVIpOworI2lmZGVmIERFQlVHCisJCWlmICgocFBydC0+UElzYXZlICYgUEhZX1NUX0FOX09WRVIpICE9IDApIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkF1dG9OZWcgZG9uZSByZXNjaGVkdWxlZCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCisJaWYgKEF1dG9OZWcpIHsKKwkJaWYgKChTdGF0U3VtICYgUEhZX1NUX0FOX09WRVIpICE9IDApIHsKKwkJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkJRG9uZSA9IFNrTWFjQXV0b05lZ0RvbmUocEFDLCBJb0MsIFBvcnQpOworCQkJaWYgKERvbmUgIT0gU0tfQU5EX09LKSB7CisJCQkJLyogR2V0IFBIWSBwYXJhbWV0ZXJzLCBmb3IgZGVidWdnaW5nIG9ubHkgKi8KKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfQVVORV9MUCwgJkxwQWIpOworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV8xMDAwVF9TVEFULCAmRXh0U3RhdCk7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIkF1dG9OZWcgRkFJTCBQb3J0ICVkIChMcEFiICV4LCAxMDAwVFN0YXQgJXgpXG4iLAorCQkJCQkgUG9ydCwgTHBBYiwgRXh0U3RhdCkpOworCQkJCQkKKwkJCQkvKiBUcnkgbmV4dCBwb3NzaWJsZSBtb2RlICovCisJCQkJTmV4dE1vZGUgPSBTa0hXU2Vuc2VHZXROZXh0KHBBQywgSW9DLCBQb3J0KTsKKwkJCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIFBvcnQpOworCQkJCWlmIChEb25lID09IFNLX0FORF9EVVBfQ0FQKSB7CisJCQkJCS8qIEdvVG8gbmV4dCBtb2RlICovCisJCQkJCVNrSFdTZW5zZVNldE5leHQocEFDLCBJb0MsIFBvcnQsIE5leHRNb2RlKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogRHVtbXkgUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIHRvIHByZXZlbnQKKwkJCQkgKiBleHRyYSBsaW5rIGRvd24vdXBzCisJCQkJICovCisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0lOVF9TVEFULCAmRXh0U3RhdCk7CisJCQkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCQkJfQorCQl9CisJCQorCQkvKiBBdXRvTmVnIG5vdCBkb25lLCBidXQgSFcgbGluayBpcyB1cC4gQ2hlY2sgZm9yIHRpbWVvdXRzICovCisJCXBQcnQtPlBBdXRvTmVnVGltZU91dCsrOworCQlpZiAocFBydC0+UEF1dG9OZWdUaW1lT3V0ID49IFNLX0FORF9NQVhfVE8pIHsKKwkJCS8qIFRpbWVvdXQgb2NjdXJlZCAqLworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJKCJBdXRvTmVnIHRpbWVvdXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQkJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgPT0gU0tfTE1PREVfQVVUT1NFTlNFICYmCisJCQkJcFBydC0+UExpcGFBdXRvTmVnICE9IFNLX0xJUEFfQVVUTykgeworCQkJCS8qIFNldCBMaW5rIG1hbnVhbGx5IHVwICovCisJCQkJU2tIV1NlbnNlU2V0TmV4dChwQUMsIElvQywgUG9ydCwgU0tfTE1PREVfRlVMTCk7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCSgiU2V0IG1hbnVhbCBmdWxsIGR1cGxleCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCQl9CisKKwkJCS8qIERvIHRoZSByZXN0YXJ0ICovCisJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIExpbmsgaXMgdXAgYW5kIHdlIGRvbid0IG5lZWQgbW9yZSAqLworI2lmZGVmIERFQlVHCisJCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9BVVRPKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJFUlJPUjogTGlwYSBhdXRvIGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogRHVtbXkgUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIHRvIHByZXZlbnQKKwkJICogZXh0cmEgbGluayBkb3duL3VwcworCQkgKi8KKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0lOVF9TVEFULCAmRXh0U3RhdCk7CisJCQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiTGluayBzeW5jKEdQKSwgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCXJldHVybihTS19IV19QU19MSU5LKTsKKwl9CisKKwlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7Cit9CS8qIFNrR2VQb3J0Q2hlY2tVcExvbmUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwTmF0KCkgLSBDaGVjayBpZiB0aGUgbGluayBpcyB1cCBvbiBOYXRpb25hbCBQSFkKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcE5hdCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCitTS19CT09MCUF1dG9OZWcpCS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCit7CisJLyogdG9kbzogTmF0aW9uYWwgKi8KKwlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7Cit9CS8qIFNrR2VQb3J0Q2hlY2tVcE5hdCAqLworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlU2lycUV2ZW50KCkgLSBFdmVudCBTZXJ2aWNlIFJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBOb3RlczoKKyAqLworaW50CVNrR2VTaXJxRXZlbnQoCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJbyBDb250ZXh0ICovCitTS19VMzIJCUV2ZW50LAkJLyogTW9kdWxlIHNwZWNpZmljIEV2ZW50ICovCitTS19FVlBBUkEJUGFyYSkJCS8qIEV2ZW50IHNwZWNpZmljIFBhcmFtZXRlciAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX1UzMgkJUG9ydDsKKwlTS19VMzIJCVZhbDMyOworCWludAkJCVBvcnRTdGF0OworCVNLX1U4CQlWYWw4OworI2lmZGVmIEdFTkVTSVMKKwlTS19VNjQJCU9jdGV0czsKKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKwlQb3J0ID0gUGFyYS5QYXJhMzJbMF07CisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlzd2l0Y2ggKEV2ZW50KSB7CisJY2FzZSBTS19IV0VWX1dBVElNOgorCQlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9SRVNFVCkgeworCQkKKwkJCVBvcnRTdGF0ID0gU0tfSFdfUFNfTk9ORTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIENoZWNrIHdoZXRoZXIgcG9ydCBjYW1lIHVwICovCisJCQlQb3J0U3RhdCA9IFNrR2VQb3J0Q2hlY2tVcChwQUMsIElvQywgKGludClQb3J0KTsKKwkJfQorCisJCXN3aXRjaCAoUG9ydFN0YXQpIHsKKwkJY2FzZSBTS19IV19QU19SRVNUQVJUOgorCQkJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkJCS8qIFNldCBMaW5rIHRvIGRvd24gKi8KKwkJCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIChpbnQpUG9ydCk7CisKKwkJCQkvKgorCQkJCSAqIFNpZ25hbCBkaXJlY3RseSB0byBSTE1UIHRvIGVuc3VyZSBjb3JyZWN0CisJCQkJICogc2VxdWVuY2Ugb2YgU1dJVENIIGFuZCBSRVNFVCBldmVudC4KKwkJCQkgKi8KKwkJCQlTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IG5lZWRlZCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX1JFU0VULCBQYXJhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0tfSFdfUFNfTElOSzoKKwkJCS8qIFNpZ25hbCB0byBSTE1UICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19VUCwgUGFyYSk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJLyogU3RhcnQgYWdhaW4gdGhlIGNoZWNrIFRpbWVyICovCisJCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJCVZhbDMyID0gU0tfV0FfQUNUX1RJTUU7CisJCX0KKwkJZWxzZSB7CisJCQlWYWwzMiA9IFNLX1dBX0lOQV9USU1FOworCQl9CisKKwkJLyogVG9kbzogc3RpbGwgbmVlZGVkIGZvciBub24tWE1BQyBQSFlzPz8/ICovCisJCS8qIFN0YXJ0IHdvcmthcm91bmQgRXJyYXRhICMyIHRpbWVyICovCisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPlBXYVRpbWVyLCBWYWwzMiwKKwkJCVNLR0VfSFdBQywgU0tfSFdFVl9XQVRJTSwgUGFyYSk7CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1BPUlRfU1RBUlQ6CisJCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJCS8qCisJCQkgKiBTaWduYWwgZGlyZWN0bHkgdG8gUkxNVCB0byBlbnN1cmUgY29ycmVjdAorCQkJICogc2VxdWVuY2Ugb2YgU1dJVENIIGFuZCBSRVNFVCBldmVudC4KKwkJCSAqLworCQkJU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwkJfQorCisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgKGludClQb3J0KTsKKworCQkvKiBTY2hlZHVsZSBQb3J0IFJFU0VUICovCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9SRVNFVCwgUGFyYSk7CisKKwkJLyogU3RhcnQgd29ya2Fyb3VuZCBFcnJhdGEgIzIgdGltZXIgKi8KKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+UFdhVGltZXIsIFNLX1dBX0lOQV9USU1FLAorCQkJU0tHRV9IV0FDLCBTS19IV0VWX1dBVElNLCBQYXJhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfUE9SVF9TVE9QOgorCQlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCQkvKgorCQkJICogU2lnbmFsIGRpcmVjdGx5IHRvIFJMTVQgdG8gZW5zdXJlIGNvcnJlY3QKKwkJCSAqIHNlcXVlbmNlIG9mIFNXSVRDSCBhbmQgUkVTRVQgZXZlbnQuCisJCQkgKi8KKwkJCVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJCX0KKworCQkvKiBTdG9wIFdvcmthcm91bmQgVGltZXIgKi8KKwkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUHJ0LT5QV2FUaW1lcik7CisKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCAoaW50KVBvcnQpOworCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9VUERBVEVfU1RBVDoKKwkJLyogV2UgZG8gTk9UIG5lZWQgdG8gdXBkYXRlIGFueSBzdGF0aXN0aWNzICovCisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX0NMRUFSX1NUQVQ6CisJCS8qIFdlIGRvIE5PVCBuZWVkIHRvIGNsZWFyIGFueSBzdGF0aXN0aWNzICovCisJCWZvciAoUG9ydCA9IDA7IFBvcnQgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgUG9ydCsrKSB7CisJCQlwUHJ0LT5QUHJldlJ4ID0gMDsKKwkJCXBQcnQtPlBQcmV2RmNzID0gMDsKKwkJCXBQcnQtPlBQcmV2U2hvcnRzID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9TRVRfTE1PREU6CisJCVZhbDggPSAoU0tfVTgpUGFyYS5QYXJhMzJbMV07CisJCWlmIChwUHJ0LT5QTGlua01vZGVDb25mICE9IFZhbDgpIHsKKwkJCS8qIFNldCBOZXcgbGluayBtb2RlICovCisJCQlwUHJ0LT5QTGlua01vZGVDb25mID0gVmFsODsKKworCQkJLyogUmVzdGFydCBQb3J0ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVE9QLCBQYXJhKTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUQVJULCBQYXJhKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9TRVRfRkxPV01PREU6CisJCVZhbDggPSAoU0tfVTgpUGFyYS5QYXJhMzJbMV07CisJCWlmIChwUHJ0LT5QRmxvd0N0cmxNb2RlICE9IFZhbDgpIHsKKwkJCS8qIFNldCBOZXcgRmxvdyBDb250cm9sIG1vZGUgKi8KKwkJCXBQcnQtPlBGbG93Q3RybE1vZGUgPSBWYWw4OworCisJCQkvKiBSZXN0YXJ0IFBvcnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUT1AsIFBhcmEpOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RBUlQsIFBhcmEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1NFVF9ST0xFOgorCQkvKiBub3QgcG9zc2libGUgZm9yIGZpYmVyICovCisJCWlmICghcEFDLT5HSW5pLkdJQ29wcGVyVHlwZSkgeworCQkJYnJlYWs7CisJCX0KKwkJVmFsOCA9IChTS19VOClQYXJhLlBhcmEzMlsxXTsKKwkJaWYgKHBQcnQtPlBNU01vZGUgIT0gVmFsOCkgeworCQkJLyogU2V0IE5ldyBSb2xlIChNYXN0ZXIvU2xhdmUpIG1vZGUgKi8KKwkJCXBQcnQtPlBNU01vZGUgPSBWYWw4OworCisJCQkvKiBSZXN0YXJ0IFBvcnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUT1AsIFBhcmEpOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RBUlQsIFBhcmEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1NFVF9TUEVFRDoKKwkJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX01BUlZfQ09QUEVSKSB7CisJCQlicmVhazsKKwkJfQorCQlWYWw4ID0gKFNLX1U4KVBhcmEuUGFyYTMyWzFdOworCQlpZiAocFBydC0+UExpbmtTcGVlZCAhPSBWYWw4KSB7CisJCQkvKiBTZXQgTmV3IFNwZWVkIHBhcmFtZXRlciAqLworCQkJcFBydC0+UExpbmtTcGVlZCA9IFZhbDg7CisKKwkJCS8qIFJlc3RhcnQgUG9ydCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RPUCwgUGFyYSk7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVEFSVCwgUGFyYSk7CisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBHRU5FU0lTCisJY2FzZSBTS19IV0VWX0hBTEZEVVBfQ0hLOgorCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJLyoKKwkJCSAqIGhhbGYgZHVwbGV4IGhhbmd1cCB3b3JrYXJvdW5kLgorCQkJICogU2VlIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgaW50ZXJydXB0IGZvciBkZXNjcmlwdGlvbgorCQkJICovCisJCQlwUHJ0LT5IYWxmRHVwVGltZXJBY3RpdmUgPSBTS19GQUxTRTsKKwkJCWlmIChwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9IQUxGIHx8CisJCQkJcFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpIHsKKyNpZmRlZiBYWFgKKwkJCQlMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCQlTa1BubWlHZXRWYXIocEFDLCBJb0MsIE9JRF9TS0dFX1NUQVRfVFhfT0NURVRTLCAoY2hhciAqKSZPY3RldHMsCisJCQkJCSZMZW4sIChTS19VMzIpU0tfUE5NSV9QT1JUX1BIWVMySU5TVChwQUMsIFBvcnQpLAorCQkJCQlwQUMtPlJsbXQuUG9ydFtQb3J0XS5OZXQtPk5ldE51bWJlcik7CisjZW5kaWYgLyogWFhYICovCisJCQkJLyogU25hcCBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwkJCQkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIFBvcnQpOworCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fVFhPX09LX0hJLCAmVmFsMzIpOworCisJCQkJT2N0ZXRzID0gKFNLX1U2NClWYWwzMiA8PCAzMjsKKwkJCQkKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9UWE9fT0tfTE8sICZWYWwzMik7CisKKwkJCQlPY3RldHMgKz0gVmFsMzI7CisJCQkJCisJCQkJaWYgKHBQcnQtPkxhc3RPY3RldHMgPT0gT2N0ZXRzKSB7CisJCQkJCS8qIFR4IGhhbmdpbmcsIGEgRklGTyBmbHVzaCByZXN0YXJ0cyBpdCAqLworCQkJCQlTa01hY0ZsdXNoVHhGaWZvKHBBQywgSW9DLCBQb3J0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfU0lSUV9FMDAxLCBTS0VSUl9TSVJRX0UwMDFNU0cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR2VTaXJxRXZlbnQgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGh5SXNyQmNvbSgpIC0gUEhZIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBhbGwgaW50ZXJydXB0cyBmcm9tIEJDb20gUEhZCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrUGh5SXNyQmNvbSgKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIElvIENvbnRleHQgKi8KK2ludAkJCVBvcnQsCQkvKiBQb3J0IE51bSA9IFBIWSBOdW0gKi8KK1NLX1UxNgkJSVN0YXR1cykJLyogSW50ZXJydXB0IFN0YXR1cyAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX0VWUEFSQQlQYXJhOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoKElTdGF0dXMgJiBQSFlfQl9JU19QU0UpICE9IDApIHsKKwkJLyogSW5jb3JyZWN0YWJsZSBwYWlyIHN3YXAgZXJyb3IgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDIyLAorCQkJU0tFUlJfU0lSUV9FMDIyTVNHKTsKKwl9CisJCisJaWYgKChJU3RhdHVzICYgKFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpICE9IDApIHsKKworCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIFBvcnQpOworCisJCVBhcmEuUGFyYTMyWzBdID0gKFNLX1UzMilQb3J0OworCQkvKiBTaWduYWwgdG8gUkxNVCAqLworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKworCQkvKiBTdGFydCB3b3JrYXJvdW5kIEVycmF0YSAjMiB0aW1lciAqLworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUHJ0LT5QV2FUaW1lciwgU0tfV0FfSU5BX1RJTUUsCisJCQlTS0dFX0hXQUMsIFNLX0hXRVZfV0FUSU0sIFBhcmEpOworCX0KKworfQkvKiBTa1BoeUlzckJjb20gKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQaHlJc3JHbWFjKCkgLSBQSFkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIGFsbCBpbnRlcnJ1cHRzIGZyb20gTWFydmVsbCBQSFkKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tQaHlJc3JHbWFjKAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSW8gQ29udGV4dCAqLworaW50CQkJUG9ydCwJCS8qIFBvcnQgTnVtID0gUEhZIE51bSAqLworU0tfVTE2CQlJU3RhdHVzKQkvKiBJbnRlcnJ1cHQgU3RhdHVzICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTE2CQlXb3JkOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoKElTdGF0dXMgJiAoUEhZX01fSVNfQU5fUFIgfCBQSFlfTV9JU19MU1RfQ0hBTkdFKSkgIT0gMCkgeworCisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisKKwkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCAmV29yZCk7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnLkFkdjogMHglMDRYXG4iLCBXb3JkKSk7CisJCQorCQkvKiBTZXQgQXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50ICovCisJCWlmIChwUHJ0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNKSB7CisJCQkvKiByZXN0b3JlIEFzeW1tZXRyaWMgUGF1c2UgYml0ICovCisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLAorCQkJCShTS19VMTYpKFdvcmQgfCBQSFlfTV9BTl9BU1ApKTsKKwkJfQorCQkKKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCS8qIFNpZ25hbCB0byBSTE1UICovCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKwkKKwlpZiAoKElTdGF0dXMgJiBQSFlfTV9JU19BTl9FUlJPUikgIT0gMCkgeworCQkvKiBBdXRvLU5lZ290aWF0aW9uIEVycm9yICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDIzLCBTS0VSUl9TSVJRX0UwMjNNU0cpOworCX0KKwkKKwlpZiAoKElTdGF0dXMgJiBQSFlfTV9JU19GSUZPX0VSUk9SKSAhPSAwKSB7CisJCS8qIEZJRk8gT3ZlcmZsb3cvVW5kZXJydW4gRXJyb3IgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMjQsIFNLRVJSX1NJUlFfRTAyNE1TRyk7CisJfQorCQorfQkvKiBTa1BoeUlzckdtYWMgKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZmRlZiBPVEhFUl9QSFkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BoeUlzckxvbmUoKSAtIFBIWSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgYWxsIGludGVycnVwdHMgZnJvbSBMT05FIFBIWQorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa1BoeUlzckxvbmUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSW8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBOdW0gPSBQSFkgTnVtICovCitTS19VMTYJSVN0YXR1cykJLyogSW50ZXJydXB0IFN0YXR1cyAqLworeworCVNLX0VWUEFSQQlQYXJhOworCisJaWYgKElTdGF0dXMgJiAoUEhZX0xfSVNfRFVQIHwgUEhZX0xfSVNfSVNPTCkpIHsKKwkJCisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisKKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCS8qIFNpZ25hbCB0byBSTE1UICovCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworfQkvKiBTa1BoeUlzckxvbmUgKi8KKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKworLyogRW5kIG9mIEZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tpMmMuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tpMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVhMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2kyYy5jCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNraTJjLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIFRXU0ktTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNTkgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMjAgMDk6MDc6MjUgJAorICogUHVycG9zZToJRnVuY3Rpb25zIHRvIGFjY2VzcyBWb2x0YWdlIGFuZCBUZW1wZXJhdHVyZSBTZW5zb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUkyQyBQcm90b2NvbAorICovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNraTJjLmMsdiAxLjU5IDIwMDMvMTAvMjAgMDk6MDc6MjUgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuICI7CisjZW5kaWYKKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIJCS8qIERyaXZlciBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvbG04MC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIJCS8qIEFkYXB0ZXIgQ29udHJvbC0gYW5kIERyaXZlciBzcGVjaWZpYyBEZWYuICovCisKKyNpZmRlZiBfX0MyTUFOX18KKy8qCisJSTJDIHByb3RvY29sIGltcGxlbWVudGF0aW9uLgorCisJR2VuZXJhbCBEZXNjcmlwdGlvbjoKKworCVRoZSBJMkMgcHJvdG9jb2wgaXMgdXNlZCBmb3IgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcnMgYW5kIGZvcgorCXRoZSBzZXJpYWwgRUVQUk9NIHdoaWNoIGhvbGQgdGhlIGNvbmZpZ3VyYXRpb24uCisKKwlUaGlzIGZpbGUgY292ZXJzIGZ1bmN0aW9ucyB0aGF0IGFsbG93IHRvIHJlYWQgd3JpdGUgYW5kIGRvCisJc29tZSBidWxrIHJlcXVlc3RzIGEgc3BlY2lmaWVkIEkyQyBhZGRyZXNzLgorCisJVGhlIEdlbmVzaXMgaGFzIDIgSTJDIGJ1c2VzLiBPbmUgZm9yIHRoZSBFRVBST00gd2hpY2ggaG9sZHMKKwl0aGUgVlBEIERhdGEgYW5kIG9uZSBmb3IgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2Ugc2Vuc29yLgorCVRoZSBmb2xsb3dpbmcgcGljdHVyZSBzaG93cyB0aGUgSTJDIGJ1c2VzLCBJMkMgZGV2aWNlcyBhbmQKKwl0aGVpciBjb250cm9sIHJlZ2lzdGVycy4KKworCU5vdGU6IFRoZSBWUEQgZnVuY3Rpb25zIGFyZSBpbiBza3ZwZC5jCisuCisuCVBDSSBDb25maWcgSTJDIEJ1cyBmb3IgVlBEIERhdGE6CisuCisuCQkgICAgICArLS0tLS0tLS0tLS0tKworLgkJICAgICAgfCBWUEQgRUVQUk9NIHwKKy4JCSAgICAgICstLS0tLS0tLS0tLS0rCisuCQkJICAgICB8CisuCQkJICAgICB8IDwtLSBJMkMKKy4JCQkgICAgIHwKKy4JCSArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisuCQkgfAkJCSB8CisuCSstLS0tLS0tLS0tLS0tLS0tLSsJKy0tLS0tLS0tLS0tLS0tLS0tKworLgl8IFBDSV9WUERfQURSX1JFRyB8CXwgUENJX1ZQRF9EQVRfUkVHIHwKKy4JKy0tLS0tLS0tLS0tLS0tLS0tKwkrLS0tLS0tLS0tLS0tLS0tLS0rCisuCisuCisuCUkyQyBCdXMgZm9yIExNODAgc2Vuc29yOgorLgorLgkJCSstLS0tLS0tLS0tLS0tLS0tLSsKKy4JCQl8IFRlbXBlcmF0dXJlIGFuZCB8CisuCQkJfCBWb2x0YWdlIFNlbnNvciAgfAorLgkJCXwgCUxNODAJICB8CisuCQkJKy0tLS0tLS0tLS0tLS0tLS0tKworLgkJCQl8CisuCQkJCXwKKy4JCQlJMkMgLS0+IHwKKy4JCQkJfAorLgkJCSAgICAgKy0tLS0rCisuCSAgICAgKy0tLS0tLS0tLS0tLS0tPnwgT1IgfDwtLSsKKy4JICAgICB8CQkgICAgICstLS0tKyAgIHwKKy4gICAgICstLS0tLS0rLS0tLS0tKwkJICAgICAgfAorLiAgICAgfAkJICAgIHwJCSAgICAgIHwKKy4gKy0tLS0tLS0tKwkrLS0tLS0tLS0rCSstLS0tLS0tLS0tKworLiB8IEIyX0kyQyB8CXwgQjJfSTJDIHwJfCAgQjJfSTJDICB8CisuIHwgX0NUUkwgIHwJfCBfREFUQSAgfAl8ICAgX1NXICAgIHwKKy4gKy0tLS0tLS0tKwkrLS0tLS0tLS0rCSstLS0tLS0tLS0tKworLgorCVRoZSBJMkMgYnVzIG1heSBiZSBkcml2ZW4gYnkgdGhlIEIyX0kyQ19TVyBvciBieSB0aGUgQjJfSTJDX0NUUkwKKwlhbmQgQjJfSTJDX0RBVEEgcmVnaXN0ZXJzLgorCUZvciBkcml2ZXIgc29mdHdhcmUgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJMkMgY29udHJvbCBhbmQKKwlkYXRhIHJlZ2lzdGVyLCBiZWNhdXNlIEkyQyBidXMgdGltaW5nIGlzIGRvbmUgYnkgdGhlIEFTSUMgYW5kCisJYW4gaW50ZXJydXB0IG1heSBiZSByZWNlaXZlZCB3aGVuIHRoZSBJMkMgcmVxdWVzdCBpcyBjb21wbGV0ZWQuCisKKwlDbG9jayBSYXRlIFRpbWluZzoJCQlNSU4JTUFYCWdlbmVyYXRlZCBieQorCQlWUEQgRUVQUk9NOgkJCTUwIGtIegkxMDAga0h6CQlIVworCQlMTTgwIG92ZXIgSTJDIEN0cmwvRGF0YSByZWcuCTUwIGtIegkxMDAga0h6CQlIVworCQlMTTgwIG92ZXIgQjJfSTJDX1NXIHJlZ2lzdGVyCTAJNDAwIGtIegkJU1cKKworCU5vdGU6CVRoZSBjbG9jayBnZW5lcmF0ZWQgYnkgdGhlIGhhcmR3YXJlIGlzIGRlcGVuZGVuZCBvbiB0aGUKKwkJUENJIGNsb2NrLiBJZiB0aGUgUENJIGJ1cyBjbG9jayBpcyAzMyBNSHosIHRoZSBJMkMvVlBECisJCWNsb2NrIGlzIDUwIGtIei4KKyAqLworaW50cm8oKQore30KKyNlbmRpZgorCisjaWZkZWYgU0tfRElBRworLyoKKyAqIEkyQyBGYXN0IE1vZGUgdGltaW5nIHZhbHVlcyB1c2VkIGJ5IHRoZSBMTTgwLgorICogSWYgbmV3IGRldmljZXMgYXJlIGFkZGVkIHRvIHRoZSBJMkMgYnVzIHRoZSB0aW1pbmcgdmFsdWVzIGhhdmUgdG8gYmUgY2hlY2tlZC4KKyAqLworI2lmbmRlZiBJMkNfU0xPV19USU1JTkcKKyNkZWZpbmUJVF9DTEtfTE9XCQkJMTMwMEwJLyogY2xvY2sgbG93IHRpbWUgaW4gbnMgKi8KKyNkZWZpbmUJVF9DTEtfSElHSAkJIAkgNjAwTAkvKiBjbG9jayBoaWdoIHRpbWUgaW4gbnMgKi8KKyNkZWZpbmUgVF9EQVRBX0lOX1NFVFVQCQkgMTAwTAkvKiBkYXRhIGluIFNldC11cCBUaW1lICovCisjZGVmaW5lIFRfU1RBUlRfSE9MRAkJIDYwMEwJLyogc3RhcnQgY29uZGl0aW9uIGhvbGQgdGltZSAqLworI2RlZmluZSBUX1NUQVJUX1NFVFVQCQkgNjAwTAkvKiBzdGFydCBjb25kaXRpb24gU2V0LXVwIHRpbWUgKi8KKyNkZWZpbmUJVF9TVE9QX1NFVFVQCQkgNjAwTAkvKiBzdG9wIGNvbmRpdGlvbiBTZXQtdXAgdGltZSAqLworI2RlZmluZSBUX0JVU19JRExFCQkJMTMwMEwJLyogdGltZSB0aGUgYnVzIG11c3QgZnJlZSBhZnRlciBUeCAqLworI2RlZmluZQlUX0NMS18yX0RBVEFfT1VUCSA5MDBMCS8qIG1heC4gY2xvY2sgbG93IHRvIGRhdGEgb3V0cHV0IHZhbGlkICovCisjZWxzZQkvKiBJMkNfU0xPV19USU1JTkcgKi8KKy8qIEkyQyBTdGFuZGFyZCBNb2RlIFRpbWluZyAqLworI2RlZmluZQlUX0NMS19MT1cJCQk0NzAwTAkvKiBjbG9jayBsb3cgdGltZSBpbiBucyAqLworI2RlZmluZQlUX0NMS19ISUdICQkJNDAwMEwJLyogY2xvY2sgaGlnaCB0aW1lIGluIG5zICovCisjZGVmaW5lIFRfREFUQV9JTl9TRVRVUAkJIDI1MEwJLyogZGF0YSBpbiBTZXQtdXAgVGltZSAqLworI2RlZmluZSBUX1NUQVJUX0hPTEQJCTQwMDBMCS8qIHN0YXJ0IGNvbmRpdGlvbiBob2xkIHRpbWUgKi8KKyNkZWZpbmUgVF9TVEFSVF9TRVRVUAkJNDcwMEwJLyogc3RhcnQgY29uZGl0aW9uIFNldC11cCB0aW1lICovCisjZGVmaW5lCVRfU1RPUF9TRVRVUAkJNDAwMEwJLyogc3RvcCBjb25kaXRpb24gU2V0LXVwIHRpbWUgKi8KKyNkZWZpbmUgVF9CVVNfSURMRQkJCTQ3MDBMCS8qIHRpbWUgdGhlIGJ1cyBtdXN0IGZyZWUgYWZ0ZXIgVHggKi8KKyNlbmRpZgkvKiAhSTJDX1NMT1dfVElNSU5HICovCisKKyNkZWZpbmUgTlMyQkNMSyh4KQkoKCh4KSoxMjUpLzEwMDAwKQorCisvKgorICogSTJDIFdpcmUgT3BlcmF0aW9ucworICoKKyAqIEFib3V0IEkyQ19DTEtfTE9XKCk6CisgKgorICogVGhlIERhdGEgRGlyZWN0aW9uIGJpdCAoSTJDX0RBVEFfRElSKSBoYXMgdG8gYmUgc2V0IHRvIGlucHV0IHdoZW4gc2V0dGluZworICogY2xvY2sgdG8gbG93LCB0byBwcmV2ZW50IHRoZSBBU0lDIGFuZCB0aGUgSTJDIGRhdGEgY2xpZW50IGZyb20gZHJpdmluZyB0aGUKKyAqIHNlcmlhbCBkYXRhIGxpbmUgc2ltdWx0YW5lb3VzbHkgKEFTSUM6IGxhc3QgYml0IG9mIGEgYnl0ZSA9ICcxJywgSTJDIGNsaWVudAorICogc2VuZCBhbiAnQUNLJykuIFNlZSBhbHNvIENvbmNlbnRyYXRvciBCdWdyZXBvcnQgTm8uIDEwMTkyLgorICovCisjZGVmaW5lIEkyQ19EQVRBX0hJR0goSW9DKQlTS19JMkNfU0VUX0JJVChJb0MsIEkyQ19EQVRBKQorI2RlZmluZQlJMkNfREFUQV9MT1coSW9DKQlTS19JMkNfQ0xSX0JJVChJb0MsIEkyQ19EQVRBKQorI2RlZmluZQlJMkNfREFUQV9PVVQoSW9DKQlTS19JMkNfU0VUX0JJVChJb0MsIEkyQ19EQVRBX0RJUikKKyNkZWZpbmUJSTJDX0RBVEFfSU4oSW9DKQlTS19JMkNfQ0xSX0JJVChJb0MsIEkyQ19EQVRBX0RJUiB8IEkyQ19EQVRBKQorI2RlZmluZQlJMkNfQ0xLX0hJR0goSW9DKQlTS19JMkNfU0VUX0JJVChJb0MsIEkyQ19DTEspCisjZGVmaW5lCUkyQ19DTEtfTE9XKElvQykJU0tfSTJDX0NMUl9CSVQoSW9DLCBJMkNfQ0xLIHwgSTJDX0RBVEFfRElSKQorI2RlZmluZQlJMkNfU1RBUlRfQ09ORChJb0MpCVNLX0kyQ19DTFJfQklUKElvQywgSTJDX0NMSykKKworI2RlZmluZSBOUzJDTEtUKHgpCSgoeCoxMjVMKS8xMDAwMCkKKworLyotLS0tLS0tLS0tLS0tLS0gSTJDIEludGVyZmFjZSBSZWdpc3RlciBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzZW5kaW5nIG9uZSBiaXQKKyAqLwordm9pZCBTa0kyY1NuZEJpdCgKK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VOAlCaXQpCS8qIEJpdCB0byBzZW5kICovCit7CisJSTJDX0RBVEFfT1VUKElvQyk7CisJaWYgKEJpdCkgeworCQlJMkNfREFUQV9ISUdIKElvQyk7CisJfQorCWVsc2UgeworCQlJMkNfREFUQV9MT1coSW9DKTsKKwl9CisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0RBVEFfSU5fU0VUVVApKTsKKwlJMkNfQ0xLX0hJR0goSW9DKTsKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLX0hJR0gpKTsKKwlJMkNfQ0xLX0xPVyhJb0MpOworfQkvKiBTa0kyY1NuZEJpdCovCisKKworLyoKKyAqIFNpZ25hbCBhIHN0YXJ0IHRvIHRoZSBJMkMgQnVzLgorICoKKyAqIEEgc3RhcnQgaXMgc2lnbmFsZWQgd2hlbiBkYXRhIGdvZXMgdG8gbG93IGluIGEgaGlnaCBjbG9jayBjeWNsZS4KKyAqCisgKiBFbmRzIHdpdGggQ2xvY2sgTG93LgorICoKKyAqIFN0YXR1czogbm90IHRlc3RlZAorICovCit2b2lkIFNrSTJjU3RhcnQoCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCS8qIEluaXQgZGF0YSBhbmQgQ2xvY2sgdG8gb3V0cHV0IGxpbmVzICovCisJLyogU2V0IERhdGEgaGlnaCAqLworCUkyQ19EQVRBX09VVChJb0MpOworCUkyQ19EQVRBX0hJR0goSW9DKTsKKwkvKiBTZXQgQ2xvY2sgaGlnaCAqLworCUkyQ19DTEtfSElHSChJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX1NUQVJUX1NFVFVQKSk7CisKKwkvKiBTZXQgRGF0YSBMb3cgKi8KKwlJMkNfREFUQV9MT1coSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9TVEFSVF9IT0xEKSk7CisKKwkvKiBDbG9jayBsb3cgd2l0aG91dCBEYXRhIHRvIElucHV0ICovCisJSTJDX1NUQVJUX0NPTkQoSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfTE9XKSk7Cit9CS8qIFNrSTJjU3RhcnQgKi8KKworCit2b2lkIFNrSTJjU3RvcCgKK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJLyogSW5pdCBkYXRhIGFuZCBDbG9jayB0byBvdXRwdXQgbGluZXMgKi8KKwkvKiBTZXQgRGF0YSBsb3cgKi8KKwlJMkNfREFUQV9PVVQoSW9DKTsKKwlJMkNfREFUQV9MT1coSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfMl9EQVRBX09VVCkpOworCisJLyogU2V0IENsb2NrIGhpZ2ggKi8KKwlJMkNfQ0xLX0hJR0goSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9TVE9QX1NFVFVQKSk7CisKKwkvKgorCSAqIFNldCBEYXRhIEhpZ2g6CURvIGl0IGJ5IHNldHRpbmcgdGhlIERhdGEgTGluZSB0byBJbnB1dC4KKwkgKgkJCUJlY2F1c2Ugb2YgYSBwdWxsIHVwIHJlc2lzdG9yIHRoZSBEYXRhIExpbmUKKwkgKgkJCWZsb29kcyB0byBoaWdoLgorCSAqLworCUkyQ19EQVRBX0lOKElvQyk7CisKKwkvKgorCSAqCVdoZW4gSTJDIGFjdGl2aXR5IGlzIHN0b3BwZWQKKwkgKgkgbwlEQVRBIHNob3VsZCBiZSBzZXQgdG8gaW5wdXQgYW5kCisJICoJIG8JQ0xPQ0sgc2hvdWxkIGJlIHNldCB0byBoaWdoIQorCSAqLworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9CVVNfSURMRSkpOworfQkvKiBTa0kyY1N0b3AgKi8KKworCisvKgorICogUmVjZWl2ZSBqdXN0IG9uZSBiaXQgdmlhIHRoZSBJMkMgYnVzLgorICoKKyAqIE5vdGU6CUNsb2NrIG11c3QgYmUgc2V0IHRvIExPVyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgVGhlIHJlY2VpdmVkIGJpdC4KKyAqLworaW50IFNrSTJjUmN2Qml0KAorU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwlpbnQJQml0OworCVNLX1U4CUkyY1N3Q3RybDsKKworCS8qIEluaXQgZGF0YSBhcyBpbnB1dCBsaW5lICovCisJSTJDX0RBVEFfSU4oSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfMl9EQVRBX09VVCkpOworCisJSTJDX0NMS19ISUdIKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLX0hJR0gpKTsKKworCVNLX0kyQ19HRVRfU1coSW9DLCAmSTJjU3dDdHJsKTsKKwkKKwlCaXQgPSAoSTJjU3dDdHJsICYgSTJDX0RBVEEpID8gMSA6IDA7CisKKwlJMkNfQ0xLX0xPVyhJb0MpOworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfTE9XLVRfQ0xLXzJfREFUQV9PVVQpKTsKKworCXJldHVybihCaXQpOworfQkvKiBTa0kyY1JjdkJpdCAqLworCisKKy8qCisgKiBSZWNlaXZlIGFuIEFDSy4KKyAqCisgKiByZXR1cm5zCTAgSWYgYWNrbm93bGVkZ2VkCisgKgkJMSBpbiBjYXNlIG9mIGFuIGVycm9yCisgKi8KK2ludCBTa0kyY1JjdkFjaygKK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJLyoKKwkgKiBSZWNlaXZlZCBiaXQgbXVzdCBiZSB6ZXJvLgorCSAqLworCXJldHVybihTa0kyY1JjdkJpdChJb0MpICE9IDApOworfQkvKiBTa0kyY1JjdkFjayAqLworCisKKy8qCisgKiBTZW5kIGFuIE5BQ0suCisgKi8KK3ZvaWQgU2tJMmNTbmROQWNrKAorU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwkvKgorCSAqIFJlY2VpdmVkIGJpdCBtdXN0IGJlIHplcm8uCisJICovCisJU2tJMmNTbmRCaXQoSW9DLCAxKTsKK30JLyogU2tJMmNTbmROQWNrICovCisKKworLyoKKyAqIFNlbmQgYW4gQUNLLgorICovCit2b2lkIFNrSTJjU25kQWNrKAorU0tfSU9DIElvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwkvKgorCSAqIFJlY2VpdmVkIGJpdCBtdXN0IGJlIHplcm8uCisJICovCisJU2tJMmNTbmRCaXQoSW9DLCAwKTsKK30JLyogU2tJMmNTbmRBY2sgKi8KKworCisvKgorICogU2VuZCBvbmUgYnl0ZSB0byB0aGUgSTJDIGRldmljZSBhbmQgd2FpdCBmb3IgQUNLLgorICoKKyAqIFJldHVybiBhY2tub3dsZWdlZCBzdGF0dXMuCisgKi8KK2ludCBTa0kyY1NuZEJ5dGUoCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworaW50CQlCeXRlKQkvKiBieXRlIHRvIHNlbmQgKi8KK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKEJ5dGUgJiAoMTw8KDctaSkpKSB7CisJCQlTa0kyY1NuZEJpdChJb0MsIDEpOworCQl9CisJCWVsc2UgeworCQkJU2tJMmNTbmRCaXQoSW9DLCAwKTsKKwkJfQorCX0KKworCXJldHVybihTa0kyY1JjdkFjayhJb0MpKTsKK30JLyogU2tJMmNTbmRCeXRlICovCisKKworLyoKKyAqIFJlY2VpdmUgb25lIGJ5dGUgYW5kIGFjayBpdC4KKyAqCisgKiBSZXR1cm4gYnl0ZS4KKyAqLworaW50IFNrSTJjUmN2Qnl0ZSgKK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUxhc3QpCS8qIExhc3QgQnl0ZSBGbGFnICovCit7CisJaW50CWk7CisJaW50CUJ5dGUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlCeXRlIDw8PSAxOworCQlCeXRlIHw9IFNrSTJjUmN2Qml0KElvQyk7CisJfQorCisJaWYgKExhc3QpIHsKKwkJU2tJMmNTbmROQWNrKElvQyk7CisJfQorCWVsc2UgeworCQlTa0kyY1NuZEFjayhJb0MpOworCX0KKworCXJldHVybihCeXRlKTsKK30JLyogU2tJMmNSY3ZCeXRlICovCisKKworLyoKKyAqIFN0YXJ0IGRpYWxvZyBhbmQgc2VuZCBkZXZpY2UgYWRkcmVzcworICoKKyAqIFJldHVybiAwIGlmIGFja25vd2xlZ2VkLCAxIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworaW50CVNrSTJjU25kRGV2KAorU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK2ludAkJQWRkciwJLyogRGV2aWNlIEFkZHJlc3MgKi8KK2ludAkJUncpCQkvKiBSZWFkIC8gV3JpdGUgRmxhZyAqLworeworCVNrSTJjU3RhcnQoSW9DKTsKKwlSdyA9IH5SdzsKKwlSdyAmPSBJMkNfV1JJVEU7CisJcmV0dXJuKFNrSTJjU25kQnl0ZShJb0MsIChBZGRyPDwxKSB8IFJ3KSk7Cit9CS8qIFNrSTJjU25kRGV2ICovCisKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0gSTJDIENUUkwgUmVnaXN0ZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0qLworCisvKgorICogd2FpdHMgZm9yIGEgY29tcGxldGlvbiBvZiBhbiBJMkMgdHJhbnNmZXIKKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MsIHRyYW5zZmVyIGNvbXBsZXRlcworICoJCQkxOgllcnJvciwJIHRyYW5zZmVyIGRvZXMgbm90IGNvbXBsZXRlLCBJMkMgdHJhbnNmZXIKKyAqCQkJCQkJIGtpbGxlZCwgd2FpdCBsb29wIHRlcm1pbmF0ZWQuCisgKi8KK2ludAlTa0kyY1dhaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUV2ZW50KQkvKiBjb21wbGV0ZSBldmVudCB0byB3YWl0IGZvciAoSTJDX1JFQUQgb3IgSTJDX1dSSVRFKSAqLworeworCVNLX1U2NAlTdGFydFRpbWU7CisJU0tfVTY0CUN1cnJlbnRUaW1lOworCVNLX1UzMglJMmNDdHJsOworCisJU3RhcnRUaW1lID0gU2tPc0dldFRpbWUocEFDKTsKKwkKKwlkbyB7CisJCUN1cnJlbnRUaW1lID0gU2tPc0dldFRpbWUocEFDKTsKKworCQlpZiAoQ3VycmVudFRpbWUgLSBTdGFydFRpbWUgPiBTS19USUNLU19QRVJfU0VDIC8gOCkgeworCQkJCisJCQlTS19JMkNfU1RPUChJb0MpOworI2lmbmRlZiBTS19ESUFHCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0kyQ19FMDAyLCBTS0VSUl9JMkNfRTAwMk1TRyk7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwkJCXJldHVybigxKTsKKwkJfQorCQkKKwkJU0tfSTJDX0dFVF9DVEwoSW9DLCAmSTJjQ3RybCk7CisKKyNpZmRlZiB4WVVLT05fREJHCisJCXByaW50ZigiU3RhcnRUaW1lPSVsdSwgQ3VycmVudFRpbWU9JWx1XG4iLAorCQkJU3RhcnRUaW1lLCBDdXJyZW50VGltZSk7CisJCWlmIChrYmhpdCgpKSB7CisJCQlyZXR1cm4oMSk7CisJCX0KKyNlbmRpZiAvKiBZVUtPTl9EQkcgKi8KKwkKKwl9IHdoaWxlICgoSTJjQ3RybCAmIEkyQ19GTEFHKSA9PSAoU0tfVTMyKUV2ZW50IDw8IDMxKTsKKworCXJldHVybigwKTsKK30JLyogU2tJMmNXYWl0ICovCisKKworLyoKKyAqIHdhaXRzIGZvciBhIGNvbXBsZXRpb24gb2YgYW4gSTJDIHRyYW5zZmVyCisgKgorICogUmV0dXJucworICoJTm90aGluZworICovCit2b2lkIFNrSTJjV2FpdElycSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwlTS19TRU5TT1IJKnBTZW47CisJU0tfVTY0CQlTdGFydFRpbWU7CisJU0tfVTMyCQlJcnFTcmM7CisKKwlwU2VuID0gJnBBQy0+STJjLlNlblRhYmxlW3BBQy0+STJjLkN1cnJTZW5zXTsKKworCWlmIChwU2VuLT5TZW5TdGF0ZSA9PSBTS19TRU5fSURMRSkgeworCQlyZXR1cm47CisJfQorCisJU3RhcnRUaW1lID0gU2tPc0dldFRpbWUocEFDKTsKKwkKKwlkbyB7CisJCWlmIChTa09zR2V0VGltZShwQUMpIC0gU3RhcnRUaW1lID4gU0tfVElDS1NfUEVSX1NFQyAvIDgpIHsKKwkJCQorCQkJU0tfSTJDX1NUT1AoSW9DKTsKKyNpZm5kZWYgU0tfRElBRworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9JMkNfRTAxNiwgU0tFUlJfSTJDX0UwMTZNU0cpOworI2VuZGlmIC8qICFTS19ESUFHICovCisJCQlyZXR1cm47CisJCX0KKwkJCisJCVNLX0lOMzIoSW9DLCBCMF9JU1JDLCAmSXJxU3JjKTsKKworCX0gd2hpbGUgKChJcnFTcmMgJiBJU19JMkNfUkVBRFkpID09IDApOworCisJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fSURMRTsKKwlyZXR1cm47Cit9CS8qIFNrSTJjV2FpdElycSAqLworCisvKgorICogd3JpdGVzIGEgc2luZ2xlIGJ5dGUgb3IgNCBieXRlcyBpbnRvIHRoZSBJMkMgZGV2aWNlCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzCisgKgkJCTE6CWVycm9yCisgKi8KK2ludCBTa0kyY1dyaXRlKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJSTJjRGF0YSwJLyogSTJDIERhdGEgdG8gd3JpdGUgKi8KK2ludAkJSTJjRGV2LAkJLyogSTJDIERldmljZSBBZGRyZXNzICovCitpbnQJCUkyY0RldlNpemUsIC8qIEkyQyBEZXZpY2UgU2l6ZSAoZS5nLiBJMkNfMDI1S19ERVYgb3IgSTJDXzJLX0RFVikgKi8KK2ludAkJSTJjUmVnLAkJLyogSTJDIERldmljZSBSZWdpc3RlciBBZGRyZXNzICovCitpbnQJCUkyY0J1cnN0KQkvKiBJMkMgQnVyc3QgRmxhZyAqLworeworCVNLX09VVDMyKElvQywgQjJfSTJDX0RBVEEsIEkyY0RhdGEpOworCQorCVNLX0kyQ19DVEwoSW9DLCBJMkNfV1JJVEUsIEkyY0RldiwgSTJjRGV2U2l6ZSwgSTJjUmVnLCBJMmNCdXJzdCk7CisJCisJcmV0dXJuKFNrSTJjV2FpdChwQUMsIElvQywgSTJDX1dSSVRFKSk7Cit9CS8qIFNrSTJjV3JpdGUqLworCisKKyNpZmRlZglTS19ESUFHCisvKgorICogcmVhZHMgYSBzaW5nbGUgYnl0ZSBvciA0IGJ5dGVzIGZyb20gdGhlIEkyQyBkZXZpY2UKKyAqCisgKiByZXR1cm5zCXRoZSB3b3JkIHJlYWQKKyAqLworU0tfVTMyIFNrSTJjUmVhZCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlJMmNEZXYsCQkvKiBJMkMgRGV2aWNlIEFkZHJlc3MgKi8KK2ludAkJSTJjRGV2U2l6ZSwgLyogSTJDIERldmljZSBTaXplIChlLmcuIEkyQ18wMjVLX0RFViBvciBJMkNfMktfREVWKSAqLworaW50CQlJMmNSZWcsCQkvKiBJMkMgRGV2aWNlIFJlZ2lzdGVyIEFkZHJlc3MgKi8KK2ludAkJSTJjQnVyc3QpCS8qIEkyQyBCdXJzdCBGbGFnICovCit7CisJU0tfVTMyCURhdGE7CisKKwlTS19PVVQzMihJb0MsIEIyX0kyQ19EQVRBLCAwKTsKKwlTS19JMkNfQ1RMKElvQywgSTJDX1JFQUQsIEkyY0RldiwgSTJjRGV2U2l6ZSwgSTJjUmVnLCBJMmNCdXJzdCk7CisJCisJaWYgKFNrSTJjV2FpdChwQUMsIElvQywgSTJDX1JFQUQpICE9IDApIHsKKwkJd19wcmludCgiJXNcbiIsIFNLRVJSX0kyQ19FMDAyTVNHKTsKKwl9CisJCisJU0tfSU4zMihJb0MsIEIyX0kyQ19EQVRBLCAmRGF0YSk7CisJCisJcmV0dXJuKERhdGEpOworfQkvKiBTa0kyY1JlYWQgKi8KKyNlbmRpZiAvKiBTS19ESUFHICovCisKKworLyoKKyAqIHJlYWQgYSBzZW5zb3IncyB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzZW5zb3IncyB2YWx1ZSBmcm9tIHRoZSBJMkMgc2Vuc29yIGNoaXAuIFRoZSBzZW5zb3IKKyAqIGlzIGRlZmluZWQgYnkgaXRzIGluZGV4IGludG8gdGhlIHNlbnNvcnMgZGF0YWJhc2UgaW4gdGhlIHN0cnVjdCBwQUMgcG9pbnRzCisgKiB0by4KKyAqIFJldHVybnMKKyAqCQkxIGlmIHRoZSByZWFkIGlzIGNvbXBsZXRlZAorICoJCTAgaWYgdGhlIHJlYWQgbXVzdCBiZSBjb250aW51ZWQgKEkyQyBCdXMgc3RpbGwgYWxsb2NhdGVkKQorICovCitpbnQJU2tJMmNSZWFkU2Vuc29yKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19TRU5TT1IJKnBTZW4pCS8qIFNlbnNvciB0byBiZSByZWFkICovCit7CisgICAgaWYgKHBTZW4tPlNlblJlYWQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4oKCpwU2VuLT5TZW5SZWFkKShwQUMsIElvQywgcFNlbikpOworICAgIH0KKwllbHNlIHsKKyAgICAgICAgcmV0dXJuKDApOyAvKiBubyBzdWNjZXNzICovCisJfQorfQkvKiBTa0kyY1JlYWRTZW5zb3IgKi8KKworLyoKKyAqIERvIHRoZSBJbml0IHN0YXRlIDAgaW5pdGlhbGl6YXRpb24KKyAqLworc3RhdGljIGludCBTa0kyY0luaXQwKAorU0tfQUMJKnBBQykJLyogQWRhcHRlciBDb250ZXh0ICovCit7CisJaW50CWk7CisKKwkvKiBCZWdpbiB3aXRoIGZpcnN0IHNlbnNvciAqLworCXBBQy0+STJjLkN1cnJTZW5zID0gMDsKKwkKKwkvKiBCZWdpbiB3aXRoIHRpbWVvdXQgY29udHJvbCBmb3Igc3RhdGUgbWFjaGluZSAqLworCXBBQy0+STJjLlRpbWVyTW9kZSA9IFNLX1RJTUVSX1dBVENIX1NNOworCQorCS8qIFNldCBzZW5zb3IgbnVtYmVyIHRvIHplcm8gKi8KKwlwQUMtPkkyYy5NYXhTZW5zID0gMDsKKworI2lmbmRlZiBTS19ESUFHCisJLyogSW5pdGlhbGl6ZSBOdW1iZXIgb2YgRHVtbXkgUmVhZHMgKi8KKwlwQUMtPkkyYy5EdW1teVJlYWRzID0gU0tfTUFYX1NFTlNPUlM7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfU0VOU09SUzsgaSsrKSB7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAidW5rbm93biI7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVU5LTk9XTjsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX0ZBTjJfSU47CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkluaXQgPSBTS19TRU5fRFlOX0lOSVRfTk9ORTsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9OT1RfUFJFU0VOVDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyQ3RzID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuQmVnRXJyVFMgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWFkID0gTlVMTDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGV2ID0gMDsKKwl9CisKKwkvKiBOb3cgd2UgYXJlICJJTklUIGRhdGEiZWQgKi8KKwlwQUMtPkkyYy5Jbml0TGV2ZWwgPSBTS19JTklUX0RBVEE7CisJcmV0dXJuKDApOworfQkvKiBTa0kyY0luaXQwKi8KKworCisvKgorICogRG8gdGhlIGluaXQgc3RhdGUgMSBpbml0aWFsaXphdGlvbgorICoKKyAqIGluaXRpYWxpemUgdGhlIGZvbGxvd2luZyByZWdpc3RlciBvZiB0aGUgTE04MDoKKyAqIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6CisgKiAtIFNUQVJULCBub0lOVCwgYWN0aXZlTE9XLCBub0lOVCNDbGVhciwgbm9SRVNFVCwgbm9DSSwgbm9HUE8jLCBub0lOSVQKKyAqCisgKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAxOgorICogLSBhbGwgaW50ZXJydXB0cyBhcmUgRGlzYWJsZWQgKDB4ZmYpCisgKgorICogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMjoKKyAqIC0gYWxsIGludGVycnVwdHMgYXJlIERpc2FibGVkICgweGZmKSBJbnRlcnJ1cHQgbW9kaSBkb2Vzbid0IG1hdHRlci4KKyAqCisgKiBGYW4gRGl2aXNvci9SU1RfT1VUIHJlZ2lzdGVyOgorICogLSBEaXZpc29ycyBzZXQgdG8gMSAoYml0cyAwMCksIGFsbCBvdGhlcnMgMHMuCisgKgorICogT1MjIENvbmZpZ3VyYXRpb24vVGVtcGVyYXR1cmUgcmVzb2x1dGlvbiBSZWdpc3RlcjoKKyAqIC0gYWxsIDBzCisgKgorICovCitzdGF0aWMgaW50IFNrSTJjSW5pdDEoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisgICAgaW50IGk7CisgICAgU0tfVTggSTJjU3dDdHJsOworCVNLX0dFUE9SVCAqcFBydDsJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlpZiAocEFDLT5JMmMuSW5pdExldmVsICE9IFNLX0lOSVRfREFUQSkgeworCQkvKiBSZUluaXQgbm90IG5lZWRlZCBpbiBJMkMgbW9kdWxlICovCisJCXJldHVybigwKTsKKwl9CisKKyAgICAvKiBTZXQgdGhlIERpcmVjdGlvbiBvZiBJMkMtRGF0YSBQaW4gdG8gSU4gKi8KKyAgICBTS19JMkNfQ0xSX0JJVChJb0MsIEkyQ19EQVRBX0RJUiB8IEkyQ19EQVRBKTsKKyAgICAvKiBDaGVjayBmb3IgMzItQml0IFl1a29uIHdpdGggTG93IGF0IEkyQy1EYXRhIFBpbiAqLworCVNLX0kyQ19HRVRfU1coSW9DLCAmSTJjU3dDdHJsKTsKKworCWlmICgoSTJjU3dDdHJsICYgSTJDX0RBVEEpID09IDApIHsKKwkJLyogdGhpcyBpcyBhIDMyLUJpdCBib2FyZCAqLworCQlwQUMtPkdJbmkuR0lZdWtvbjMyQml0ID0gU0tfVFJVRTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworCS8qIENoZWNrIGZvciA2NCBCaXQgWXVrb24gd2l0aG91dCBzZW5zb3JzICovCisJaWYgKFNrSTJjV3JpdGUocEFDLCBJb0MsIDAsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLCBMTTgwX0NGRywgMCkgIT0gMCkgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisJKHZvaWQpU2tJMmNXcml0ZShwQUMsIElvQywgMHhmZlVMLCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwgTE04MF9JTVNLXzEsIDApOworCQorCSh2b2lkKVNrSTJjV3JpdGUocEFDLCBJb0MsIDB4ZmZVTCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsIExNODBfSU1TS18yLCAwKTsKKwkKKwkodm9pZClTa0kyY1dyaXRlKHBBQywgSW9DLCAwLCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwgTE04MF9GQU5fQ1RSTCwgMCk7CisJCisJKHZvaWQpU2tJMmNXcml0ZShwQUMsIElvQywgMCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsIExNODBfVEVNUF9DVFJMLCAwKTsKKwkKKwkodm9pZClTa0kyY1dyaXRlKHBBQywgSW9DLCAoU0tfVTMyKUxNODBfQ0ZHX1NUQVJULCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwKKwkJTE04MF9DRkcsIDApOworCQorCS8qCisJICogTWF4U2VucyBoYXMgdG8gYmUgdXBkYXRlZCBoZXJlLCBiZWNhdXNlIFBoeVR5cGUgaXMgbm90CisJICogc2V0IHdoZW4gcGVyZm9ybWluZyBJbml0IExldmVsIDAKKwkgKi8KKyAgICBwQUMtPkkyYy5NYXhTZW5zID0gNTsKKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFswXTsKKwkKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlpZiAocFBydC0+UGh5VHlwZSA9PSBTS19QSFlfQkNPTSkgeworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAxKSB7CisJCQkJcEFDLT5JMmMuTWF4U2VucyArPSAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5JMmMuTWF4U2VucyArPSAzOworCQkJfQorCQl9CisJfQorCWVsc2UgeworCQlwQUMtPkkyYy5NYXhTZW5zICs9IDM7CisJfQorCQorCWZvciAoaSA9IDA7IGkgPCBwQUMtPkkyYy5NYXhTZW5zOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVGVtcGVyYXR1cmUiOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9URU1QOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fVEVNUF9ISUdIX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9URU1QX0hJR0hfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1RFTVBfTE9XX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1RFTVBfTE9XX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVEVNUF9JTjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUENJIjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BDSV81Vl9ISUdIX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QQ0lfNVZfSElHSF9XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUENJXzVWX0xPV19XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QQ0lfNVZfTE9XX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQwX0lOOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQQ0ktSU8iOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUENJX0lPXzVWX0hJR0hfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BDSV9JT181Vl9ISUdIX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QQ0lfSU9fM1YzX0xPV19XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QQ0lfSU9fM1YzX0xPV19FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUMV9JTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkluaXQgPSBTS19TRU5fRFlOX0lOSVRfUENJX0lPOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBBU0lDIjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1ZERF9ISUdIX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9WRERfSElHSF9XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fVkREX0xPV19XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9WRERfTE9XX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQyX0lOOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJaWYgKHBQcnQtPlBoeVR5cGUgPT0gU0tfUEhZX0JDT00pIHsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBIWSBBIFBMTCI7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9FUlI7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfV0FSTjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUExMXzNWM19MT1dfV0FSTjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19FUlI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUE1BIjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX0VSUjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9XQVJOOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19XQVJOOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX0VSUjsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgVkFVWCI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fVkFVWF8zVjNfSElHSF9FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1ZBVVhfM1YzX0hJR0hfV0FSTjsKKwkJCQlpZiAocEFDLT5HSW5pLkdJVmF1eEF2YWlsKSB7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1ZBVVhfM1YzX0xPV19XQVJOOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1ZBVVhfM1YzX0xPV19FUlI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1ZBVVhfMFZfV0FSTl9FUlI7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1ZBVVhfMFZfV0FSTl9FUlI7CisJCQkJfQorCQkJfQorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDNfSU47CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUEhZIDJWNSI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUEhZXzJWNV9ISUdIX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUEhZXzJWNV9ISUdIX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUEhZXzJWNV9MT1dfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BIWV8yVjVfTE9XX0VSUjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBDb3JlIDFWNSI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fQ09SRV8xVjVfSElHSF9FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX0NPUkVfMVY1X0hJR0hfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9DT1JFXzFWNV9MT1dfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX0NPUkVfMVY1X0xPV19FUlI7CisJCQl9CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUNF9JTjsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQSFkgQiBQTEwiOworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBIWSAzVjMiOworCQkJfQorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQ1X0lOOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJTcGVlZCBGYW4iOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fRkFOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX0ZBTl9ISUdIX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fRkFOX0hJR0hfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9GQU5fTE9XX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9GQU5fTE9XX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX0ZBTjJfSU47CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUEhZIDJWNSI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BIWV8yVjVfSElHSF9FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BIWV8yVjVfSElHSF9XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BIWV8yVjVfTE9XX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QSFlfMlY1X0xPV19FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDZfSU47CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9JTklUIHwgU0tfRVJSQ0xfU1csCisJCQkJU0tFUlJfSTJDX0UwMDEsIFNLRVJSX0kyQ19FMDAxTVNHKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9PSzsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyQ3RzID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuQmVnRXJyVFMgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWFkID0gU2tMbTgwUmVhZFNlbnNvcjsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGV2ID0gTE04MF9BRERSOworCX0KKworI2lmbmRlZiBTS19ESUFHCisJcEFDLT5JMmMuRHVtbXlSZWFkcyA9IHBBQy0+STJjLk1heFNlbnM7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwkKKwkvKiBDbGVhciBJMkMgSVJRICovCisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfSVJRLCBJMkNfQ0xSX0lSUSk7CisJCisJLyogTm93IHdlIGFyZSBJL08gaW5pdGlhbGl6ZWQgKi8KKwlwQUMtPkkyYy5Jbml0TGV2ZWwgPSBTS19JTklUX0lPOworCXJldHVybigwKTsKK30JLyogU2tJMmNJbml0MSAqLworCisKKy8qCisgKiBJbml0IGxldmVsIDI6IFN0YXJ0IGZpcnN0IHNlbnNvciByZWFkLgorICovCitzdGF0aWMgaW50IFNrSTJjSW5pdDIoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJaW50CQlSZWFkQ29tcGxldGU7CisJU0tfU0VOU09SCSpwU2VuOworCisJaWYgKHBBQy0+STJjLkluaXRMZXZlbCAhPSBTS19JTklUX0lPKSB7CisJCS8qIFJlSW5pdCBub3QgbmVlZGVkIGluIEkyQyBtb2R1bGUgKi8KKwkJLyogSW5pdDAgYW5kIEluaXQyIG5vdCBwZXJtaXR0ZWQgKi8KKwkJcmV0dXJuKDApOworCX0KKworCXBTZW4gPSAmcEFDLT5JMmMuU2VuVGFibGVbcEFDLT5JMmMuQ3VyclNlbnNdOworCVJlYWRDb21wbGV0ZSA9IFNrSTJjUmVhZFNlbnNvcihwQUMsIElvQywgcFNlbik7CisKKwlpZiAoUmVhZENvbXBsZXRlKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9JTklULCBTS0VSUl9JMkNfRTAwOCwgU0tFUlJfSTJDX0UwMDhNU0cpOworCX0KKworCS8qIE5vdyB3ZSBhcmUgY29ycmVjdGx5IGluaXRpYWxpemVkICovCisJcEFDLT5JMmMuSW5pdExldmVsID0gU0tfSU5JVF9SVU47CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjSW5pdDIqLworCisKKy8qCisgKiBJbml0aWFsaXplIEkyQyBkZXZpY2VzCisgKgorICogR2V0IHRoZSBmaXJzdCB2b2x0YWdlIHZhbHVlIGFuZCBkaXNjYXJkIGl0LgorICogR28gaW50byB0ZW1wZXJhdHVyZSByZWFkIG1vZGUuIEEgZGVmYXVsdCBwb2ludGVyIGlzIG5vdCBzZXQuCisgKgorICogVGhlIHRoaW5ncyB0byBiZSBkb25lIGRlcGVuZCBvbiB0aGUgaW5pdCBsZXZlbCBpbiB0aGUgcGFyYW1ldGVyIGxpc3Q6CisgKiBMZXZlbCAwOgorICoJSW5pdGlhbGl6ZSBvbmx5IHRoZSBkYXRhIHN0cnVjdHVyZXMuIERvIE5PVCBhY2Nlc3MgaGFyZHdhcmUuCisgKiBMZXZlbCAxOgorICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSB0aHJvdWdoIFNLX0lOIC8gU0tfT1VUIGNvbW1hbmRzLiBEbyBOT1QgdXNlIGludGVycnVwdHMuCisgKiBMZXZlbCAyOgorICoJRXZlcnl0aGluZyBpcyBwb3NzaWJsZS4gSW50ZXJydXB0cyBtYXkgYmUgdXNlZCBmcm9tIG5vdyBvbi4KKyAqCisgKiByZXR1cm46CisgKgkwID0gc3VjY2VzcworICoJb3RoZXIgPSBlcnJvci4KKyAqLworaW50CVNrSTJjSW5pdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgbmVlZGVkIGluIGxldmVscyAxIGFuZCAyICovCitpbnQJCUxldmVsKQkvKiBJbml0IExldmVsICovCit7CisKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CisJCXJldHVybihTa0kyY0luaXQwKHBBQykpOworCWNhc2UgU0tfSU5JVF9JTzoKKwkJcmV0dXJuKFNrSTJjSW5pdDEocEFDLCBJb0MpKTsKKwljYXNlIFNLX0lOSVRfUlVOOgorCQlyZXR1cm4oU2tJMmNJbml0MihwQUMsIElvQykpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tJMmNJbml0ICovCisKKworI2lmbmRlZiBTS19ESUFHCisKKy8qCisgKiBJbnRlcnJ1cHQgc2VydmljZSBmdW5jdGlvbiBmb3IgdGhlIEkyQyBJbnRlcmZhY2UKKyAqCisgKiBDbGVhcnMgdGhlIEludGVycnVwdCBzb3VyY2UKKyAqCisgKiBSZWFkcyB0aGUgcmVnaXN0ZXIgYW5kIGNoZWNrIGl0IGZvciBzZW5kaW5nIGEgdHJhcC4KKyAqCisgKiBTdGFydHMgdGhlIHRpbWVyIGlmIG5lY2Vzc2FyeS4KKyAqLwordm9pZCBTa0kyY0lzcigKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKworCS8qIENsZWFyIEkyQyBJUlEgKi8KKwlTS19PVVQzMihJb0MsIEIyX0kyQ19JUlEsIEkyQ19DTFJfSVJRKTsKKworCVBhcmEuUGFyYTY0ID0gMDsKKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0kyQywgU0tfSTJDRVZfSVJRLCBQYXJhKTsKK30JLyogU2tJMmNJc3IgKi8KKworCisvKgorICogQ2hlY2sgdGhpcyBzZW5zb3JzIFZhbHVlIGFnYWluc3QgdGhlIHRocmVzaG9sZCBhbmQgc2VuZCBldmVudHMuCisgKi8KK3N0YXRpYyB2b2lkIFNrSTJjQ2hlY2tTZW5zb3IoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19TRU5TT1IJKnBTZW4pCit7CisJU0tfRVZQQVJBCVBhcmFMb2NhbDsKKwlTS19CT09MCQlUb29IaWdoOwkvKiBJcyBzZW5zb3IgdG9vIGhpZ2g/ICovCisJU0tfQk9PTAkJVG9vTG93OwkJLyogSXMgc2Vuc29yIHRvbyBsb3c/ICovCisJU0tfVTY0CQlDdXJyVGltZTsJLyogQ3VycmVudCBUaW1lICovCisJU0tfQk9PTAkJRG9UcmFwU2VuZDsJLyogV2UgbmVlZCB0byBzZW5kIGEgdHJhcCAqLworCVNLX0JPT0wJCURvRXJyTG9nOwkvKiBXZSBuZWVkIHRvIGxvZyB0aGUgZXJyb3IgKi8KKwlTS19CT09MCQlJc0Vycm9yOwkvKiBXZSBuZWVkIHRvIGxvZyB0aGUgZXJyb3IgKi8KKworCS8qIENoZWNrIER1bW15IFJlYWRzIGZpcnN0ICovCisJaWYgKHBBQy0+STJjLkR1bW15UmVhZHMgPiAwKSB7CisJCXBBQy0+STJjLkR1bW15UmVhZHMtLTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgY3VycmVudCB0aW1lICovCisJQ3VyclRpbWUgPSBTa09zR2V0VGltZShwQUMpOworCisJLyogU2V0IHBhcmEgdG8gdGhlIG1vc3QgdXNlZnVsIHNldHRpbmc6IFRoZSBjdXJyZW50IHNlbnNvci4gKi8KKwlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NClwQUMtPkkyYy5DdXJyU2VuczsKKworCS8qIENoZWNrIHRoZSBWYWx1ZSBhZ2FpbnN0IHRoZSB0aHJlc2hvbGRzLiBGaXJzdDogRXJyb3IgVGhyZXNob2xkcyAqLworCVRvb0hpZ2ggPSAocFNlbi0+U2VuVmFsdWUgPiBwU2VuLT5TZW5UaHJlRXJySGlnaCk7CisJVG9vTG93ID0gKHBTZW4tPlNlblZhbHVlIDwgcFNlbi0+U2VuVGhyZUVyckxvdyk7CisJCQorCUlzRXJyb3IgPSBTS19GQUxTRTsKKwlpZiAoVG9vSGlnaCB8fCBUb29Mb3cpIHsKKwkJLyogRXJyb3IgY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqLworCQlEb1RyYXBTZW5kID0gU0tfVFJVRTsKKwkJRG9FcnJMb2cgPSBTS19UUlVFOworCisJCS8qIE5vdyBlcnJvciBjb25kaXRpb24gaXMgc2F0aXNmaWVkICovCisJCUlzRXJyb3IgPSBTS19UUlVFOworCisJCWlmIChwU2VuLT5TZW5FcnJGbGFnID09IFNLX1NFTl9FUlJfRVJSKSB7CisJCQkvKiBUaGlzIHN0YXRlIGlzIHRoZSBmb3JtZXIgb25lICovCisKKwkJCS8qIFNvIGNoZWNrIGZpcnN0IHdoZXRoZXIgd2UgaGF2ZSB0byBzZW5kIGEgdHJhcCAqLworCQkJaWYgKHBTZW4tPlNlbkxhc3RFcnJUcmFwVFMgKyBTS19TRU5fRVJSX1RSX0hPTEQgPgorCQkJICAgIEN1cnJUaW1lKSB7CisJCQkJLyoKKwkJCQkgKiBEbyBOT1Qgc2VuZCB0aGUgVHJhcC4gVGhlIGhvbGQgYmFjayB0aW1lCisJCQkJICogaGFzIHRvIHJ1biBvdXQgZmlyc3QuCisJCQkJICovCisJCQkJRG9UcmFwU2VuZCA9IFNLX0ZBTFNFOworCQkJfQorCisJCQkvKiBDaGVjayBub3cgd2hldGhlciB3ZSBoYXZlIHRvIGxvZyBhbiBFcnJvciAqLworCQkJaWYgKHBTZW4tPlNlbkxhc3RFcnJMb2dUUyArIFNLX1NFTl9FUlJfTE9HX0hPTEQgPgorCQkJICAgIEN1cnJUaW1lKSB7CisJCQkJLyoKKwkJCQkgKiBEbyBOT1QgbG9nIHRoZSBlcnJvci4gVGhlIGhvbGQgYmFjayB0aW1lCisJCQkJICogaGFzIHRvIHJ1biBvdXQgZmlyc3QuCisJCQkJICovCisJCQkJRG9FcnJMb2cgPSBTS19GQUxTRTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIFdlIGNhbWUgZnJvbSBhIGRpZmZlcmVudCBzdGF0ZSAtPiBTZXQgQmVnaW4gVGltZSBTdGFtcCAqLworCQkJcFNlbi0+U2VuQmVnRXJyVFMgPSBDdXJyVGltZTsKKwkJCXBTZW4tPlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX0VSUjsKKwkJfQorCisJCWlmIChEb1RyYXBTZW5kKSB7CisJCQkvKiBTZXQgY3VycmVudCBUaW1lICovCisJCQlwU2VuLT5TZW5MYXN0RXJyVHJhcFRTID0gQ3VyclRpbWU7CisJCQlwU2VuLT5TZW5FcnJDdHMrKzsKKworCQkJLyogUXVldWUgUE5NSSBFdmVudCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCAoVG9vSGlnaCA/CisJCQkJU0tfUE5NSV9FVlRfU0VOX0VSUl9VUFAgOgorCQkJCVNLX1BOTUlfRVZUX1NFTl9FUlJfTE9XKSwKKwkJCQlQYXJhTG9jYWwpOworCQl9CisKKwkJaWYgKERvRXJyTG9nKSB7CisJCQkvKiBTZXQgY3VycmVudCBUaW1lICovCisJCQlwU2VuLT5TZW5MYXN0RXJyTG9nVFMgPSBDdXJyVGltZTsKKworCQkJaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX1RFTVApIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDExLCBTS0VSUl9JMkNfRTAxMU1TRyk7CisJCQl9CisJCQllbHNlIGlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9WT0xUKSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxMiwgU0tFUlJfSTJDX0UwMTJNU0cpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxNSwgU0tFUlJfSTJDX0UwMTVNU0cpOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgdGhlIFZhbHVlIGFnYWluc3QgdGhlIHRocmVzaG9sZHMgKi8KKwkvKiAybmQ6IFdhcm5pbmcgdGhyZXNob2xkcyAqLworCVRvb0hpZ2ggPSAocFNlbi0+U2VuVmFsdWUgPiBwU2VuLT5TZW5UaHJlV2FybkhpZ2gpOworCVRvb0xvdyA9IChwU2VuLT5TZW5WYWx1ZSA8IHBTZW4tPlNlblRocmVXYXJuTG93KTsKKwkJCisJaWYgKCFJc0Vycm9yICYmIChUb29IaWdoIHx8IFRvb0xvdykpIHsKKwkJLyogRXJyb3IgY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqLworCQlEb1RyYXBTZW5kID0gU0tfVFJVRTsKKwkJRG9FcnJMb2cgPSBTS19UUlVFOworCisJCWlmIChwU2VuLT5TZW5FcnJGbGFnID09IFNLX1NFTl9FUlJfV0FSTikgeworCQkJLyogVGhpcyBzdGF0ZSBpcyB0aGUgZm9ybWVyIG9uZSAqLworCisJCQkvKiBTbyBjaGVjayBmaXJzdCB3aGV0aGVyIHdlIGhhdmUgdG8gc2VuZCBhIHRyYXAgKi8KKwkJCWlmIChwU2VuLT5TZW5MYXN0V2FyblRyYXBUUyArIFNLX1NFTl9XQVJOX1RSX0hPTEQgPiBDdXJyVGltZSkgeworCQkJCS8qCisJCQkJICogRG8gTk9UIHNlbmQgdGhlIFRyYXAuIFRoZSBob2xkIGJhY2sgdGltZQorCQkJCSAqIGhhcyB0byBydW4gb3V0IGZpcnN0LgorCQkJCSAqLworCQkJCURvVHJhcFNlbmQgPSBTS19GQUxTRTsKKwkJCX0KKworCQkJLyogQ2hlY2sgbm93IHdoZXRoZXIgd2UgaGF2ZSB0byBsb2cgYW4gRXJyb3IgKi8KKwkJCWlmIChwU2VuLT5TZW5MYXN0V2FybkxvZ1RTICsgU0tfU0VOX1dBUk5fTE9HX0hPTEQgPiBDdXJyVGltZSkgeworCQkJCS8qCisJCQkJICogRG8gTk9UIGxvZyB0aGUgZXJyb3IuIFRoZSBob2xkIGJhY2sgdGltZQorCQkJCSAqIGhhcyB0byBydW4gb3V0IGZpcnN0LgorCQkJCSAqLworCQkJCURvRXJyTG9nID0gU0tfRkFMU0U7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBjYW1lIGZyb20gYSBkaWZmZXJlbnQgc3RhdGUgLT4gU2V0IEJlZ2luIFRpbWUgU3RhbXAgKi8KKwkJCXBTZW4tPlNlbkJlZ1dhcm5UUyA9IEN1cnJUaW1lOworCQkJcFNlbi0+U2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfV0FSTjsKKwkJfQorCisJCWlmIChEb1RyYXBTZW5kKSB7CisJCQkvKiBTZXQgY3VycmVudCBUaW1lICovCisJCQlwU2VuLT5TZW5MYXN0V2FyblRyYXBUUyA9IEN1cnJUaW1lOworCQkJcFNlbi0+U2VuV2FybkN0cysrOworCisJCQkvKiBRdWV1ZSBQTk1JIEV2ZW50ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIChUb29IaWdoID8KKwkJCQlTS19QTk1JX0VWVF9TRU5fV0FSX1VQUCA6CisJCQkJU0tfUE5NSV9FVlRfU0VOX1dBUl9MT1cpLAorCQkJCVBhcmFMb2NhbCk7CisJCX0KKworCQlpZiAoRG9FcnJMb2cpIHsKKwkJCS8qIFNldCBjdXJyZW50IFRpbWUgKi8KKwkJCXBTZW4tPlNlbkxhc3RXYXJuTG9nVFMgPSBDdXJyVGltZTsKKworCQkJaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX1RFTVApIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDA5LCBTS0VSUl9JMkNfRTAwOU1TRyk7CisJCQl9CisJCQllbHNlIGlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9WT0xUKSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxMCwgU0tFUlJfSTJDX0UwMTBNU0cpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxNCwgU0tFUlJfSTJDX0UwMTRNU0cpOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIE5PIGVycm9yIGF0IGFsbCAqLworCWlmICghSXNFcnJvciAmJiAhVG9vSGlnaCAmJiAhVG9vTG93KSB7CisJCS8qIFNldCBvLmsuIFN0YXR1cyBpZiBubyBlcnJvciBhbmQgbm8gd2FybmluZyBjb25kaXRpb24gKi8KKwkJcFNlbi0+U2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfT0s7CisJfQorCisJLyogRW5kIG9mIGNoZWNrIGFnYWluc3QgdGhlIHRocmVzaG9sZHMgKi8KKworCS8qIEJ1ZyBmaXggQUY6IDE2LkF1Zy4yMDAxOiBDb3JyZWN0IHRoZSBpbml0IGJhc2UKKwkgKiBvZiBMTTgwIHNlbnNvci4KKwkgKi8KKwlpZiAocFNlbi0+U2VuSW5pdCA9PSBTS19TRU5fRFlOX0lOSVRfUENJX0lPKSB7CisKKyAgICAgICAgcFNlbi0+U2VuSW5pdCA9IFNLX1NFTl9EWU5fSU5JVF9OT05FOworCisJCWlmIChwU2VuLT5TZW5WYWx1ZSA+IFNLX1NFTl9QQ0lfSU9fUkFOR0VfTElNSVRFUikgeworCQkJLyogNVYgUENJLUlPIFZvbHRhZ2UgKi8KKwkJCXBTZW4tPlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BDSV9JT181Vl9MT1dfV0FSTjsKKwkJCXBTZW4tPlNlblRocmVFcnJMb3cgPSBTS19TRU5fUENJX0lPXzVWX0xPV19FUlI7CisJCX0KKwkJZWxzZSB7CisJCQkvKiAzLjNWIFBDSS1JTyBWb2x0YWdlICovCisJCQlwU2VuLT5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUENJX0lPXzNWM19ISUdIX1dBUk47CisJCQlwU2VuLT5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QQ0lfSU9fM1YzX0hJR0hfRVJSOworCQl9CisJfQorCQorI2lmZGVmIFRFU1RfT05MWQorICAgIC8qIER5bmFtaWMgdGhyZXNob2xkcyBhbHNvIGZvciBWQVVYIG9mIExNODAgc2Vuc29yICovCisJaWYgKHBTZW4tPlNlbkluaXQgPT0gU0tfU0VOX0RZTl9JTklUX1ZBVVgpIHsKKworICAgICAgICBwU2VuLT5TZW5Jbml0ID0gU0tfU0VOX0RZTl9JTklUX05PTkU7CisKKwkJLyogMy4zViBWQVVYIFZvbHRhZ2UgKi8KKwkJaWYgKHBTZW4tPlNlblZhbHVlID4gU0tfU0VOX1ZBVVhfUkFOR0VfTElNSVRFUikgeworCQkJcFNlbi0+U2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fVkFVWF8zVjNfTE9XX1dBUk47CisJCQlwU2VuLT5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1ZBVVhfM1YzX0xPV19FUlI7CisJCX0KKwkJLyogMFYgVkFVWCBWb2x0YWdlICovCisJCWVsc2UgeworCQkJcFNlbi0+U2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1ZBVVhfMFZfV0FSTl9FUlI7CisJCQlwU2VuLT5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9WQVVYXzBWX1dBUk5fRVJSOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpbml0aWFsaXphdGlvbiBzdGF0ZToKKwkgKiBUaGUgVklPIFRocmVzaG9sZHMgbmVlZCBhZGFwdGlvbgorCSAqLworCWlmICghcFNlbi0+U2VuSW5pdCAmJiBwU2VuLT5TZW5SZWcgPT0gTE04MF9WVDFfSU4gJiYKKwkgICAgIHBTZW4tPlNlblZhbHVlID4gU0tfU0VOX1dBUk5MT1cyQyAmJgorCSAgICAgcFNlbi0+U2VuVmFsdWUgPCBTS19TRU5fV0FSTkhJR0gyKSB7CisJCXBTZW4tPlNlblRocmVFcnJMb3cgPSBTS19TRU5fRVJSTE9XMkM7CisJCXBTZW4tPlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1dBUk5MT1cyQzsKKwkJcFNlbi0+U2VuSW5pdCA9IFNLX1RSVUU7CisJfQorCisJaWYgKCFwU2VuLT5TZW5Jbml0ICYmIHBTZW4tPlNlblJlZyA9PSBMTTgwX1ZUMV9JTiAmJgorCSAgICAgcFNlbi0+U2VuVmFsdWUgPiBTS19TRU5fV0FSTkxPVzIgJiYKKwkgICAgIHBTZW4tPlNlblZhbHVlIDwgU0tfU0VOX1dBUk5ISUdIMkMpIHsKKwkJcFNlbi0+U2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fRVJSSElHSDJDOworCQlwU2VuLT5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fV0FSTkhJR0gyQzsKKwkJcFNlbi0+U2VuSW5pdCA9IFNLX1RSVUU7CisJfQorI2VuZGlmCisKKwlpZiAocFNlbi0+U2VuSW5pdCAhPSBTS19TRU5fRFlOX0lOSVRfTk9ORSkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDEzLCBTS0VSUl9JMkNfRTAxM01TRyk7CisJfQorfQkvKiBTa0kyY0NoZWNrU2Vuc29yICovCisKKworLyoKKyAqIFRoZSBvbmx5IEV2ZW50IHRvIGJlIHNlcnZlZCBpcyB0aGUgdGltZW91dCBldmVudAorICoKKyAqLworaW50CVNrSTJjRXZlbnQoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMgkJRXZlbnQsCS8qIE1vZHVsZSBzcGVjaWZpYyBFdmVudCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIEV2ZW50IHNwZWNpZmljIFBhcmFtZXRlciAqLworeworCWludAkJCVJlYWRDb21wbGV0ZTsKKwlTS19TRU5TT1IJKnBTZW47CisJU0tfVTMyCQlUaW1lOworCVNLX0VWUEFSQQlQYXJhTG9jYWw7CisJaW50CQkJaTsKKworCS8qIE5ldyBjYXNlOiBubyBzZW5zb3JzICovCisJaWYgKHBBQy0+STJjLk1heFNlbnMgPT0gMCkgeworCQlyZXR1cm4oMCk7CisJfQorCisJc3dpdGNoIChFdmVudCkgeworCWNhc2UgU0tfSTJDRVZfSVJROgorCQlwU2VuID0gJnBBQy0+STJjLlNlblRhYmxlW3BBQy0+STJjLkN1cnJTZW5zXTsKKwkJUmVhZENvbXBsZXRlID0gU2tJMmNSZWFkU2Vuc29yKHBBQywgSW9DLCBwU2VuKTsKKworCQlpZiAoUmVhZENvbXBsZXRlKSB7CisJCQkvKiBDaGVjayBzZW5zb3IgYWdhaW5zdCBkZWZpbmVkIHRocmVzaG9sZHMgKi8KKwkJCVNrSTJjQ2hlY2tTZW5zb3IocEFDLCBwU2VuKTsKKworCQkJLyogSW5jcmVtZW50IEN1cnJlbnQgc2Vuc29yIGFuZCBzZXQgYXBwcm9wcmlhdGUgVGltZW91dCAqLworCQkJcEFDLT5JMmMuQ3VyclNlbnMrKzsKKwkJCWlmIChwQUMtPkkyYy5DdXJyU2VucyA+PSBwQUMtPkkyYy5NYXhTZW5zKSB7CisJCQkJcEFDLT5JMmMuQ3VyclNlbnMgPSAwOworCQkJCVRpbWUgPSBTS19JMkNfVElNX0xPTkc7CisJCQl9CisJCQllbHNlIHsKKwkJCQlUaW1lID0gU0tfSTJDX1RJTV9TSE9SVDsKKwkJCX0KKworCQkJLyogU3RhcnQgVGltZXIgKi8KKwkJCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KTA7CisKKwkJCXBBQy0+STJjLlRpbWVyTW9kZSA9IFNLX1RJTUVSX05FV19HQVVHSU5HOworCQkJCisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkkyYy5TZW5UaW1lciwgVGltZSwKKwkJCQlTS0dFX0kyQywgU0tfSTJDRVZfVElNLCBQYXJhTG9jYWwpOworCQl9CisgICAgICAgIGVsc2UgeworCQkJLyogU3RhcnQgVGltZXIgKi8KKwkJCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KTA7CisKKwkJCXBBQy0+STJjLlRpbWVyTW9kZSA9IFNLX1RJTUVSX1dBVENIX1NNOworCisgICAgICAgICAgICBTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkkyYy5TZW5UaW1lciwgU0tfSTJDX1RJTV9XQVRDSCwKKwkJCQlTS0dFX0kyQywgU0tfSTJDRVZfVElNLCBQYXJhTG9jYWwpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0tfSTJDRVZfVElNOgorCQlpZiAocEFDLT5JMmMuVGltZXJNb2RlID09IFNLX1RJTUVSX05FV19HQVVHSU5HKSB7CisKKwkJCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KTA7CisJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+STJjLlNlblRpbWVyKTsKKworCQkJcFNlbiA9ICZwQUMtPkkyYy5TZW5UYWJsZVtwQUMtPkkyYy5DdXJyU2Vuc107CisJCQlSZWFkQ29tcGxldGUgPSBTa0kyY1JlYWRTZW5zb3IocEFDLCBJb0MsIHBTZW4pOworCisJCQlpZiAoUmVhZENvbXBsZXRlKSB7CisJCQkJLyogQ2hlY2sgc2Vuc29yIGFnYWluc3QgZGVmaW5lZCB0aHJlc2hvbGRzICovCisJCQkJU2tJMmNDaGVja1NlbnNvcihwQUMsIHBTZW4pOworCisJCQkJLyogSW5jcmVtZW50IEN1cnJlbnQgc2Vuc29yIGFuZCBzZXQgYXBwcm9wcmlhdGUgVGltZW91dCAqLworCQkJCXBBQy0+STJjLkN1cnJTZW5zKys7CisJCQkJaWYgKHBBQy0+STJjLkN1cnJTZW5zID09IHBBQy0+STJjLk1heFNlbnMpIHsKKwkJCQkJcEFDLT5JMmMuQ3VyclNlbnMgPSAwOworCQkJCQlUaW1lID0gU0tfSTJDX1RJTV9MT05HOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJVGltZSA9IFNLX0kyQ19USU1fU0hPUlQ7CisJCQkJfQorCisJCQkJLyogU3RhcnQgVGltZXIgKi8KKwkJCQlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NCkwOworCisJCQkJcEFDLT5JMmMuVGltZXJNb2RlID0gU0tfVElNRVJfTkVXX0dBVUdJTkc7CisKKwkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkkyYy5TZW5UaW1lciwgVGltZSwKKwkJCQkJU0tHRV9JMkMsIFNLX0kyQ0VWX1RJTSwgUGFyYUxvY2FsKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXBTZW4gPSAmcEFDLT5JMmMuU2VuVGFibGVbcEFDLT5JMmMuQ3VyclNlbnNdOworCQkJcFNlbi0+U2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfRkFVTFRZOworCQkJU0tfSTJDX1NUT1AoSW9DKTsKKworCQkJLyogSW5jcmVtZW50IEN1cnJlbnQgc2Vuc29yIGFuZCBzZXQgYXBwcm9wcmlhdGUgVGltZW91dCAqLworCQkJcEFDLT5JMmMuQ3VyclNlbnMrKzsKKwkJCWlmIChwQUMtPkkyYy5DdXJyU2VucyA9PSBwQUMtPkkyYy5NYXhTZW5zKSB7CisJCQkJcEFDLT5JMmMuQ3VyclNlbnMgPSAwOworCQkJCVRpbWUgPSBTS19JMkNfVElNX0xPTkc7CisJCQl9CisJCQllbHNlIHsKKwkJCQlUaW1lID0gU0tfSTJDX1RJTV9TSE9SVDsKKwkJCX0KKworCQkJLyogU3RhcnQgVGltZXIgKi8KKwkJCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KTA7CisKKwkJCXBBQy0+STJjLlRpbWVyTW9kZSA9IFNLX1RJTUVSX05FV19HQVVHSU5HOworCisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkkyYy5TZW5UaW1lciwgVGltZSwKKwkJCQlTS0dFX0kyQywgU0tfSTJDRVZfVElNLCBQYXJhTG9jYWwpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0tfSTJDRVZfQ0xFQVI6CisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfU0VOU09SUzsgaSsrKSB7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9PSzsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckN0cyA9IDA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5XYXJuQ3RzID0gMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkJlZ0VyclRTID0gMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkJlZ1dhcm5UUyA9IDA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5MYXN0RXJyVHJhcFRTID0gKFNLX1U2NCkwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuTGFzdEVyckxvZ1RTID0gKFNLX1U2NCkwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuTGFzdFdhcm5UcmFwVFMgPSAoU0tfVTY0KTA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5MYXN0V2FybkxvZ1RTID0gKFNLX1U2NCkwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSTJDX0UwMDYsIFNLRVJSX0kyQ19FMDA2TVNHKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjRXZlbnQqLworCisjZW5kaWYgLyogIVNLX0RJQUcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tsbTgwLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrbG04MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjkyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrbG04MC5jCkBAIC0wLDAgKzEsMjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tsbTgwLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIFRXU0ktTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMjIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMjAgMDk6MDg6MjEgJAorICogUHVycG9zZToJRnVuY3Rpb25zIHRvIGFjY2VzcyBWb2x0YWdlIGFuZCBUZW1wZXJhdHVyZSBTZW5zb3IgKExNODApCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJTE04MCBmdW5jdGlvbnMKKyovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrbG04MC5jLHYgMS4yMiAyMDAzLzEwLzIwIDA5OjA4OjIxIHJzY2htaWR0IEV4cCAkIChDKSBNYXJ2ZWxsLiAiOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL2xtODAuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYJU0tfRElBRworI2RlZmluZQlCUkVBS19PUl9XQUlUKHBBQyxJb0MsRXZlbnQpCVNrSTJjV2FpdChwQUMsSW9DLEV2ZW50KQorI2Vsc2UJLyogblNLX0RJQUcgKi8KKyNkZWZpbmUJQlJFQUtfT1JfV0FJVChwQUMsSW9DLEV2ZW50KQlicmVhaworI2VuZGlmCS8qIG5TS19ESUFHICovCisKKyNpZmRlZglTS19ESUFHCisvKgorICogcmVhZCB0aGUgcmVnaXN0ZXIgJ1JlZycgZnJvbSB0aGUgZGV2aWNlICdEZXYnCisgKgorICogcmV0dXJuIAlyZWFkIGVycm9yCS0xCisgKgkJc3VjY2VzcwkJdGhlIHJlYWQgdmFsdWUKKyAqLworaW50CVNrTG04MFJjdlJlZygKK1NLX0lPQwlJb0MsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK2ludAkJRGV2LAkJLyogSTJDIGRldmljZSBhZGRyZXNzICovCitpbnQJCVJlZykJCS8qIHJlZ2lzdGVyIHRvIHJlYWQgKi8KK3sKKwlpbnQJVmFsID0gMDsKKwlpbnQJVGVtcEV4dDsKKworCS8qIFNpZ25hbCBkZXZpY2UgbnVtYmVyICovCisJaWYgKFNrSTJjU25kRGV2KElvQywgRGV2LCBJMkNfV1JJVEUpKSB7CisJCXJldHVybigtMSk7CisJfQorCisJaWYgKFNrSTJjU25kQnl0ZShJb0MsIFJlZykpIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiByZXBlYXQgc3RhcnQgKi8KKwlpZiAoU2tJMmNTbmREZXYoSW9DLCBEZXYsIEkyQ19SRUFEKSkgeworCQlyZXR1cm4oLTEpOworCX0KKworCXN3aXRjaCAoUmVnKSB7CisJY2FzZSBMTTgwX1RFTVBfSU46CisJCVZhbCA9IChpbnQpU2tJMmNSY3ZCeXRlKElvQywgMSk7CisKKwkJLyogRmlyc3Q6IGNvcnJlY3QgdGhlIHZhbHVlOiBpdCBtaWdodCBiZSBuZWdhdGl2ZSAqLworCQlpZiAoKFZhbCAmIDB4ODApICE9IDApIHsKKwkJCS8qIFZhbHVlIGlzIG5lZ2F0aXZlICovCisJCQlWYWwgPSBWYWwgLSAyNTY7CisJCX0KKwkJVmFsID0gVmFsICogU0tfTE04MF9URU1QX0xTQjsKKwkJU2tJMmNTdG9wKElvQyk7CisJCQorCQlUZW1wRXh0ID0gKGludClTa0xtODBSY3ZSZWcoSW9DLCBMTTgwX0FERFIsIExNODBfVEVNUF9DVFJMKTsKKwkJCisJCWlmIChWYWwgPiAwKSB7CisJCQlWYWwgKz0gKChUZW1wRXh0ID4+IDcpICogU0tfTE04MF9URU1QRVhUX0xTQik7CisJCX0KKwkJZWxzZSB7CisJCQlWYWwgLT0gKChUZW1wRXh0ID4+IDcpICogU0tfTE04MF9URU1QRVhUX0xTQik7CisJCX0KKwkJcmV0dXJuKFZhbCk7CisJCWJyZWFrOworCWNhc2UgTE04MF9WVDBfSU46CisJY2FzZSBMTTgwX1ZUMV9JTjoKKwljYXNlIExNODBfVlQyX0lOOgorCWNhc2UgTE04MF9WVDNfSU46CisJCVZhbCA9IChpbnQpU2tJMmNSY3ZCeXRlKElvQywgMSkgKiBTS19MTTgwX1ZUX0xTQjsKKwkJYnJlYWs7CisJCisJZGVmYXVsdDoKKwkJVmFsID0gKGludClTa0kyY1JjdkJ5dGUoSW9DLCAxKTsKKwkJYnJlYWs7CisJfQorCisJU2tJMmNTdG9wKElvQyk7CisJcmV0dXJuKFZhbCk7Cit9CisjZW5kaWYJLyogU0tfRElBRyAqLworCisvKgorICogcmVhZCBhIHNlbnNvcnMgdmFsdWUgKExNODAgc3BlY2lmaWMpCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNlbnNvcnMgdmFsdWUgZnJvbSB0aGUgSTJDIHNlbnNvciBjaGlwIExNODAuCisgKiBUaGUgc2Vuc29yIGlzIGRlZmluZWQgYnkgaXRzIGluZGV4IGludG8gdGhlIHNlbnNvcnMgZGF0YWJhc2UgaW4gdGhlIHN0cnVjdAorICogcEFDIHBvaW50cyB0by4KKyAqCisgKiBSZXR1cm5zCTEgaWYgdGhlIHJlYWQgaXMgY29tcGxldGVkCisgKgkJMCBpZiB0aGUgcmVhZCBtdXN0IGJlIGNvbnRpbnVlZCAoSTJDIEJ1cyBzdGlsbCBhbGxvY2F0ZWQpCisgKi8KK2ludCBTa0xtODBSZWFkU2Vuc29yKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0IG5lZWRlZCBpbiBsZXZlbCAxIGFuZCAyICovCitTS19TRU5TT1IJKnBTZW4pCS8qIFNlbnNvciB0byBiZSByZWFkICovCit7CisJU0tfSTMyCQlWYWx1ZTsKKworCXN3aXRjaCAocFNlbi0+U2VuU3RhdGUpIHsKKwljYXNlIFNLX1NFTl9JRExFOgorCQkvKiBTZW5kIGFkZHJlc3MgdG8gQUREUiByZWdpc3RlciAqLworCQlTS19JMkNfQ1RMKElvQywgSTJDX1JFQUQsIHBTZW4tPlNlbkRldiwgSTJDXzAyNUtfREVWLCBwU2VuLT5TZW5SZWcsIDApOworCisJCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX1ZBTFVFIDsKKwkJQlJFQUtfT1JfV0FJVChwQUMsIElvQywgSTJDX1JFQUQpOworCQorCWNhc2UgU0tfU0VOX1ZBTFVFOgorCQkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSByZWdpc3RlciAqLworCQlTS19JTjMyKElvQywgQjJfSTJDX0RBVEEsICgoU0tfVTMyICopJlZhbHVlKSk7CisJCQorCQlWYWx1ZSAmPSAweGZmOyAvKiBvbmx5IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgaXMgdmFsaWQgKi8KKworCQkvKiBEbyBOT1QgY2hlY2sgdGhlIFZhbHVlIGFnYWluc3QgdGhlIHRocmVzaG9sZHMgKi8KKwkJLyogQ2hlY2tpbmcgaXMgZG9uZSBpbiB0aGUgY2FsbGluZyBpbnN0YW5jZSAqLworCisJCWlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9WT0xUKSB7CisJCQkvKiBWb2x0YWdlIHNlbnNvciAqLworCQkJcFNlbi0+U2VuVmFsdWUgPSBWYWx1ZSAqIFNLX0xNODBfVlRfTFNCOworCQkJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fSURMRSA7CisJCQlyZXR1cm4oMSk7CisJCX0KKworCQlpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fRkFOKSB7CisJCQlpZiAoVmFsdWUgIT0gMCAmJiBWYWx1ZSAhPSAweGZmKSB7CisJCQkJLyogRmFuIHNwZWVkIGNvdW50ZXIgKi8KKwkJCQlwU2VuLT5TZW5WYWx1ZSA9IFNLX0xNODBfRkFOX0ZBS1RPUi9WYWx1ZTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIEluZGljYXRlIEZhbiBlcnJvciAqLworCQkJCXBTZW4tPlNlblZhbHVlID0gMDsKKwkJCX0KKwkJCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX0lETEUgOworCQkJcmV0dXJuKDEpOworCQl9CisKKwkJLyogRmlyc3Q6IGNvcnJlY3QgdGhlIHZhbHVlOiBpdCBtaWdodCBiZSBuZWdhdGl2ZSAqLworCQlpZiAoKFZhbHVlICYgMHg4MCkgIT0gMCkgeworCQkJLyogVmFsdWUgaXMgbmVnYXRpdmUgKi8KKwkJCVZhbHVlID0gVmFsdWUgLSAyNTY7CisJCX0KKworCQkvKiBXZSBoYXZlIGEgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBuZWVkIHRvIGdldCB0aGUgc2lnbmVkIGV4dGVuc2lvbi4KKwkJICogRm9yIG5vdyB3ZSBnZXQgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBsYXN0IHJlYWRpbmcsIHNvIGluIHRoZSBub3JtYWwKKwkJICogY2FzZSB3ZSB3b24ndCBzZWUgZmxpY2tlcmluZyB0ZW1wZXJhdHVyZXMuCisJCSAqLworCQlwU2VuLT5TZW5WYWx1ZSA9IChWYWx1ZSAqIFNLX0xNODBfVEVNUF9MU0IpICsKKwkJCShwU2VuLT5TZW5WYWx1ZSAlIFNLX0xNODBfVEVNUF9MU0IpOworCisJCS8qIFNlbmQgYWRkcmVzcyB0byBBRERSIHJlZ2lzdGVyICovCisJCVNLX0kyQ19DVEwoSW9DLCBJMkNfUkVBRCwgcFNlbi0+U2VuRGV2LCBJMkNfMDI1S19ERVYsIExNODBfVEVNUF9DVFJMLCAwKTsKKworCQlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9WQUxFWFQgOworCQlCUkVBS19PUl9XQUlUKHBBQywgSW9DLCBJMkNfUkVBRCk7CisJCisJY2FzZSBTS19TRU5fVkFMRVhUOgorCQkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSByZWdpc3RlciAqLworCQlTS19JTjMyKElvQywgQjJfSTJDX0RBVEEsICgoU0tfVTMyICopJlZhbHVlKSk7CisJCVZhbHVlICY9IExNODBfVEVNUF9MU0JfOTsgLyogb25seSBiaXQgNyBpcyB2YWxpZCAqLworCisJCS8qIGN1dCB0aGUgTFNCIGJpdCAqLworCQlwU2VuLT5TZW5WYWx1ZSA9ICgocFNlbi0+U2VuVmFsdWUgLyBTS19MTTgwX1RFTVBfTFNCKSAqCisJCQlTS19MTTgwX1RFTVBfTFNCKTsKKworCQlpZiAocFNlbi0+U2VuVmFsdWUgPCAwKSB7CisJCQkvKiBWYWx1ZSBuZWdhdGl2ZTogVGhlIGJpdCB2YWx1ZSBtdXN0IGJlIHN1YnRyYWN0ZWQgKi8KKwkJCXBTZW4tPlNlblZhbHVlIC09ICgoVmFsdWUgPj4gNykgKiBTS19MTTgwX1RFTVBFWFRfTFNCKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFZhbHVlIHBvc2l0aXZlOiBUaGUgYml0IHZhbHVlIG11c3QgYmUgYWRkZWQgKi8KKwkJCXBTZW4tPlNlblZhbHVlICs9ICgoVmFsdWUgPj4gNykgKiBTS19MTTgwX1RFTVBFWFRfTFNCKTsKKwkJfQorCisJCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX0lETEUgOworCQlyZXR1cm4oMSk7CisJCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9JMkNfRTAwNywgU0tFUlJfSTJDX0UwMDdNU0cpOworCQlyZXR1cm4oMSk7CisJfQorCisJLyogTm90IGNvbXBsZXRlZCAqLworCXJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za3Byb2MuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2twcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlY2UyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2twcm9jLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3Byb2MuYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjExICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEyLzExIDE2OjAzOjU3ICQKKyAqIFB1cnBvc2U6CUZ1bmt0aW9ucyB0byBkaXNwbGF5IHN0YXRpY3RpYyBkYXRhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUNyZWF0ZWQgMjItTm92LTIwMDAKKyAqCUF1dGhvcjogTWlya28gTGluZG5lciAobWxpbmRuZXJAc3lza29ubmVjdC5kZSkKKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKyNpbmNsdWRlICJoL3NrdmVyc2lvbi5oIgorCitzdGF0aWMgaW50IHNrX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgc2tfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBza19wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHNrX3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIHNrX3NlcV9zaG93IC0gc2hvdyBwcm9jIGluZm9ybWF0aW9uIG9mIGEgcGFydGljdWxhciBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgcHJvYyBlbnRyeSB3aXRoIHN0YXRpc3RpYyBkYXRhIGFib3V0IAorICogIHRoZSBldGhlcm5ldCBkZXZpY2UuIEl0IGludm9rZXMgdGhlIGdlbmVyaWMgc2tfZ2VuX2Jyb3dzZSgpIHRvCisgKiAgcHJpbnQgb3V0IGFsbCBpdGVtcyBvbmUgcGVyIG9uZS4KKyAqICAKKyAqIFJldHVybnM6IDAKKyAqICAgICAgCisgKi8KK3N0YXRpYyBpbnQgc2tfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlcS0+cHJpdmF0ZTsKKwlERVZfTkVUCQkJKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDCQkJKnBBQyA9IHBOZXQtPnBBQzsKKwlTS19QTk1JX1NUUlVDVF9EQVRBIAkqcFBubWlTdHJ1Y3QgPSAmcEFDLT5Qbm1pU3RydWN0OworCXVuc2lnbmVkIGxvbmcJCUZsYWdzOwkKKwl1bnNpZ25lZCBpbnQJCVNpemU7CisJY2hhcgkJCXNlbnNfbXNnWzUwXTsKKwlpbnQgCQkJdDsKKwlpbnQgCQkJaTsKKworCS8qIE5ldEluZGV4IGluIEdldFN0cnVjdCBpcyBub3cgcmVxdWlyZWQsIHplcm8gaXMgb25seSBkdW1teSAqLworCWZvciAodD1wQUMtPkdJbmkuR0lNYWNzRm91bmQ7IHQgPiAwOyB0LS0pIHsKKwkJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgJiYgcEFDLT5SbG10TmV0cyA9PSAxKQorCQkJdC0tOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQlTaXplID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwkJaWYgKHBBQy0+Qm9hcmRMZXZlbCA9PSBTS19JTklUX0RBVEEpIHsKKwkJCVNLX01FTUNQWSgmKHBBQy0+UG5taVN0cnVjdCksICYocEFDLT5Qbm1pQmFja3VwKSwgc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKwkJCWlmIChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfTk9UQUNUSVZFKSB7CisJCQkJcEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfSURMRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNrUG5taUdldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCBwUG5taVN0cnVjdCwgJlNpemUsIHQtMSk7CisJCX0KKyNlbHNlCisJCVNrUG5taUdldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAKKwkJCQlwUG5taVN0cnVjdCwgJlNpemUsIHQtMSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkKKwkJaWYgKHBBQy0+ZGV2W3QtMV0gPT0gZGV2KSB7CisJCQlTS19QTk1JX1NUQVQJKnBQbm1pU3RhdCA9ICZwUG5taVN0cnVjdC0+U3RhdFswXTsKKworCQkJc2VxX3ByaW50ZihzZXEsICJcbkRldGFpbGVkIHN0YXRpc3RpYyBmb3IgZGV2aWNlICVzXG4iLAorCQkJCSAgICAgIHBBQy0+ZGV2W3QtMV0tPm5hbWUpOworCQkJc2VxX3ByaW50ZihzZXEsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCQorCQkJLyogQm9hcmQgc3RhdGlzdGljcyAqLworCQkJc2VxX3ByaW50ZihzZXEsICJcbkJvYXJkIHN0YXRpc3RpY3NcblxuIik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkFjdGl2ZSBQb3J0ICAgICAgICAgICAgICAgICAgICAlY1xuIiwKKwkJCQkgICAgICAnQScgKyBwQUMtPlJsbXQuTmV0W3QtMV0uUG9ydFtwQUMtPlJsbXQuCisJCQkJCQkJCSAgICBOZXRbdC0xXS5QcmVmUG9ydF0tPlBvcnROdW1iZXIpOworCQkJc2VxX3ByaW50ZihzZXEsICJQcmVmZXJyZWQgUG9ydCAgICAgICAgICAgICAgICAgJWNcbiIsCisJCQkJICAgICAgJ0EnICsgcEFDLT5SbG10Lk5ldFt0LTFdLlBvcnRbcEFDLT5SbG10LgorCQkJCQkJCQkgICAgTmV0W3QtMV0uUHJlZlBvcnRdLT5Qb3J0TnVtYmVyKTsKKworCQkJc2VxX3ByaW50ZihzZXEsICJCdXMgc3BlZWQgKE1IeikgICAgICAgICAgICAgICAgJWRcbiIsCisJCQkJICAgICAgcFBubWlTdHJ1Y3QtPkJ1c1NwZWVkKTsKKworCQkJc2VxX3ByaW50ZihzZXEsICJCdXMgd2lkdGggKEJpdCkgICAgICAgICAgICAgICAgJWRcbiIsCisJCQkJICAgICAgcFBubWlTdHJ1Y3QtPkJ1c1dpZHRoKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiRHJpdmVyIHZlcnNpb24gICAgICAgICAgICAgICAgICVzXG4iLAorCQkJCSAgICAgIFZFUl9TVFJJTkcpOworCQkJc2VxX3ByaW50ZihzZXEsICJIYXJkd2FyZSByZXZpc2lvbiAgICAgICAgICAgICAgdiVkLiVkXG4iLAorCQkJCSAgICAgIChwQUMtPkdJbmkuR0lQY2lId1JldiA+PiA0KSAmIDB4MEYsCisJCQkJICAgICAgcEFDLT5HSW5pLkdJUGNpSHdSZXYgJiAweDBGKTsKKworCQkJLyogUHJpbnQgc2Vuc29yIGluZm9ybWF0aW9ucyAqLworCQkJZm9yIChpPTA7IGkgPCBwQUMtPkkyYy5NYXhTZW5zOyBpICsrKSB7CisJCQkJLyogQ2hlY2sgdHlwZSAqLworCQkJCXN3aXRjaCAocEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSkgeworCQkJCWNhc2UgMToKKwkJCQkJc3RyY3B5KHNlbnNfbXNnLCBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjKTsKKwkJCQkJc3RyY2F0KHNlbnNfbXNnLCAiIChDKSIpOworCQkJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjVzICAgICAgJWQuJTAyZFxuIiwKKwkJCQkJCSAgICAgIHNlbnNfbXNnLAorCQkJCQkJICAgICAgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgLyAxMCwKKwkJCQkJCSAgICAgIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlICUgMTApOworCisJCQkJCXN0cmNweShzZW5zX21zZywgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyk7CisJCQkJCXN0cmNhdChzZW5zX21zZywgIiAoRikiKTsKKwkJCQkJc2VxX3ByaW50ZihzZXEsICIlLTI1cyAgICAgICVkLiUwMmRcbiIsCisJCQkJCQkgICAgICBzZW5zX21zZywKKwkJCQkJCSAgICAgICgoKChwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSkKKwkJCQkJCQkgKjEwKSo5KS81ICsgMzIwMCkvMTAwLAorCQkJCQkJICAgICAgKCgoKHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlKQorCQkJCQkJCSAqMTApKjkpLzUgKyAzMjAwKSAlIDEwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQlzdHJjcHkoc2Vuc19tc2csIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MpOworCQkJCQlzdHJjYXQoc2Vuc19tc2csICIgKFYpIik7CisJCQkJCXNlcV9wcmludGYoc2VxLCAiJS0yNXMgICAgICAlZC4lMDNkXG4iLAorCQkJCQkJICAgICAgc2Vuc19tc2csCisJCQkJCQkgICAgICBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSAvIDEwMDAsCisJCQkJCQkgICAgICBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSAlIDEwMDApOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXN0cmNweShzZW5zX21zZywgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyk7CisJCQkJCXN0cmNhdChzZW5zX21zZywgIiAocnBtKSIpOworCQkJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjVzICAgICAgJWRcbiIsCisJCQkJCQkgICAgICBzZW5zX21zZywKKwkJCQkJCSAgICAgIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJCQorCQkJLypSZWNlaXZlIHN0YXRpc3RpY3MgKi8KKwkJCXNlcV9wcmludGYoc2VxLCAiXG5SZWNlaXZlIHN0YXRpc3RpY3NcblxuIik7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZWQgYnl0ZXMgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeE9jdGV0c09rQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZWQgcGFja2V0cyAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeE9rQ3RzKTsKKyNpZiAwCisJCQlpZiAocEFDLT5HSW5pLkdQWzBdLlBoeVR5cGUgPT0gU0tfUEhZX1hNQUMgJiYgCisJCQkgICAgcEFDLT5IV1JldmlzaW9uIDwgMTIpIHsKKwkJCQlwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgPSBwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgLSAKKwkJCQkJcFBubWlTdGF0LT5TdGF0UnhTaG9ydHNDdHM7CisJCQkJcFBubWlTdGF0LT5TdGF0UnhTaG9ydHNDdHMgPSAwOworCQkJfQorI2VuZGlmCisJCQlpZiAoZGV2LT5tdHUgPiAxNTAwKQorCQkJCXBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyA9IHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAtCisJCQkJCXBQbm1pU3RhdC0+U3RhdFJ4VG9vTG9uZ0N0czsKKworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlIGVycm9ycyAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmUgZHJvcHBlZCAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdHJ1Y3QtPlJ4Tm9CdWZDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlZCBtdWx0aWNhc3QgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4TXVsdGljYXN0T2tDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlIGVycm9yIHR5cGVzXG4iKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeFJ1bnRDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBidWZmZXIgb3ZlcmZsb3cgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4Rmlmb092ZXJmbG93Q3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgYmFkIGNyYyAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeEZjc0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGZyYW1pbmcgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhGcmFtaW5nQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgbWlzc2VkIGZyYW1lcyAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeE1pc3NlZEN0cyk7CisKKwkJCWlmIChkZXYtPm10dSA+IDE1MDApCisJCQkJcFBubWlTdGF0LT5TdGF0UnhUb29Mb25nQ3RzID0gMDsKKworCQkJc2VxX3ByaW50ZihzZXEsICIgICB0b28gbG9uZyAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4VG9vTG9uZ0N0cyk7CQkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgY2FycmllciBleHRlbnNpb24gICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeENleHRDdHMpOwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgdG9vIHNob3J0ICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeFNob3J0c0N0cyk7CQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBzeW1ib2wgICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4U3ltYm9sQ3RzKTsJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIExMQyBNQUMgc2l6ZSAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhJUkxlbmd0aEN0cyk7CQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBjYXJyaWVyIGV2ZW50ICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4Q2FycmllckN0cyk7CQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBqYWJiZXIgICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4SmFiYmVyQ3RzKTsJCQkJCisKKworCQkJLypUcmFuc21pdCBzdGF0aXN0aWNzICovCisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuVHJhbnNtaXQgc3RhdGlzdGljc1xuXG4iKTsKKwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXRlZCBieXRlcyAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeE9jdGV0c09rQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXRlZCBwYWNrZXRzICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeE9rQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXQgZXJyb3JzICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0IGRyb3BwZWQgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdHJ1Y3QtPlR4Tm9CdWZDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdCBjb2xsaXNpb25zICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXQgZXJyb3IgdHlwZXNcbiIpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBleGNlc3NpdmUgY29sbGlzaW9uICAgICAgICAgJWxkXG4iLAorCQkJCSAgICAgIHBBQy0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBjYXJyaWVyICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4Q2FycmllckN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGZpZm8gdW5kZXJydW4gICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhGaWZvVW5kZXJydW5DdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBoZWFydGJlYXQgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4Q2FycmllckN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIHdpbmRvdyAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIsCisJCQkJICAgICAgcEFDLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKTsKKwkJCQkKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBza19wcm9jX29wZW4gLSByZWdpc3RlciB0aGUgc2hvdyBmdW5jdGlvbiB3aGVuIHByb2MgaXMgb3BlbidlZAorICogIAorICogRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzazk4bGluIHByb2MgZmlsZSBpcyBxdWVyaWVkLgorICogIAorICogUmV0dXJuczogdGhlIHJldHVybiB2YWx1ZSBvZiBzaW5nbGVfb3BlbigpCisgKiAgICAgIAorICovCitzdGF0aWMgaW50IHNrX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2tfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVuZCBvZiBmaWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2txdWV1ZS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2txdWV1ZS5jCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2txdWV1ZS5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMjAgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTM6NDQ6MDAgJAorICogUHVycG9zZToJTWFuYWdlbWVudCBvZiBhbiBldmVudCBxdWV1ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKglFdmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcgorICovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrcXVldWUuYyx2IDEuMjAgMjAwMy8wOS8xNiAxMzo0NDowMCByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrcXVldWUuaCIJCS8qIFF1ZXVlIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sLSBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworI2lmZGVmIF9fQzJNQU5fXworLyoKKwlFdmVudCBxdWV1ZSBtYW5hZ2VtZW50LgorCisJR2VuZXJhbCBEZXNjcmlwdGlvbjoKKworICovCitpbnRybygpCit7fQorI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRGKGEsYixjKQorCisvKgorICogaW5pdCBldmVudCBxdWV1ZSBtYW5hZ2VtZW50CisgKgorICogTXVzdCBiZSBjYWxsZWQgZHVyaW5nIGluaXQgbGV2ZWwgMC4KKyAqLwordm9pZAlTa0V2ZW50SW5pdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvYywJLyogSU8gY29udGV4dCAqLworaW50CQlMZXZlbCkJLyogSW5pdCBsZXZlbCAqLworeworCXN3aXRjaCAoTGV2ZWwpIHsKKwljYXNlIFNLX0lOSVRfREFUQToKKwkJcEFDLT5FdmVudC5FdlB1dCA9IHBBQy0+RXZlbnQuRXZHZXQgPSBwQUMtPkV2ZW50LkV2UXVldWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGFkZCBldmVudCB0byBxdWV1ZQorICovCit2b2lkCVNrRXZlbnRRdWV1ZSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19VMzIJCUNsYXNzLAkvKiBFdmVudCBDbGFzcyAqLworU0tfVTMyCQlFdmVudCwJLyogRXZlbnQgdG8gYmUgcXVldWVkICovCitTS19FVlBBUkEJUGFyYSkJLyogRXZlbnQgcGFyYW1ldGVyICovCit7CisJcEFDLT5FdmVudC5FdlB1dC0+Q2xhc3MgPSBDbGFzczsKKwlwQUMtPkV2ZW50LkV2UHV0LT5FdmVudCA9IEV2ZW50OworCXBBQy0+RXZlbnQuRXZQdXQtPlBhcmEgPSBQYXJhOworCQorCWlmICgrK3BBQy0+RXZlbnQuRXZQdXQgPT0gJnBBQy0+RXZlbnQuRXZRdWV1ZVtTS19NQVhfRVZFTlRdKQorCQlwQUMtPkV2ZW50LkV2UHV0ID0gcEFDLT5FdmVudC5FdlF1ZXVlOworCisJaWYgKHBBQy0+RXZlbnQuRXZQdXQgPT0gcEFDLT5FdmVudC5FdkdldCkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfTk9SRVMsIFNLRVJSX1FfRTAwMSwgU0tFUlJfUV9FMDAxTVNHKTsKKwl9Cit9CisKKy8qCisgKiBldmVudCBkaXNwYXRjaGVyCisgKgl3aGlsZSBldmVudCBxdWV1ZSBpcyBub3QgZW1wdHkKKyAqCQlnZXQgZXZlbnQgZnJvbSBxdWV1ZQorICoJCXNlbmQgY29tbWFuZCB0byBzdGF0ZSBtYWNoaW5lCisgKgllbmQKKyAqCXJldHVybiBlcnJvciByZXBvcnRlZCBieSBpbmRpdmlkdWFsIEV2ZW50IGZ1bmN0aW9uCisgKgkJMCBpZiBubyBlcnJvciBvY2N1cmVkLgorICovCitpbnQJU2tFdmVudERpc3BhdGNoZXIoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBDb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJbyBjb250ZXh0ICovCit7CisJU0tfRVZFTlRFTEVNCSpwRXY7CS8qIHBvaW50ZXIgaW50byBxdWV1ZSAqLworCVNLX1UzMgkJCUNsYXNzOworCWludAkJCVJ0djsKKworCXBFdiA9IHBBQy0+RXZlbnQuRXZHZXQ7CisJCisJUFJJTlRGKCJkaXNwYXRjaCBnZXQgJXggcHV0ICV4XG4iLCBwRXYsIHBBQy0+RXZlbnQuZXZfcHV0KTsKKwkKKwl3aGlsZSAocEV2ICE9IHBBQy0+RXZlbnQuRXZQdXQpIHsKKwkJUFJJTlRGKCJkaXNwYXRjaCBDbGFzcyAlZCBFdmVudCAlZFxuIiwgcEV2LT5DbGFzcywgcEV2LT5FdmVudCk7CisKKwkJc3dpdGNoIChDbGFzcyA9IHBFdi0+Q2xhc3MpIHsKKyNpZm5kZWYgU0tfVVNFX0xBQ19FVgorI2lmbmRlZiBTS19TTElNCisJCWNhc2UgU0tHRV9STE1UOgkJLyogUkxNVCBFdmVudCAqLworCQkJUnR2ID0gU2tSbG10RXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKwkJY2FzZSBTS0dFX0kyQzoJCS8qIEkyQyBFdmVudCAqLworCQkJUnR2ID0gU2tJMmNFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworCQljYXNlIFNLR0VfUE5NSToJCS8qIFBOTUkgRXZlbnQgKi8KKwkJCVJ0diA9IFNrUG5taUV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjZW5kaWYJLyogbm90IFNLX1NMSU0gKi8KKyNlbmRpZgkvKiBub3QgU0tfVVNFX0xBQ19FViAqLworCQljYXNlIFNLR0VfRFJWOgkJLyogRHJpdmVyIEV2ZW50ICovCisJCQlSdHYgPSBTa0RydkV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjaWZuZGVmIFNLX1VTRV9TV19USU1FUgorCQljYXNlIFNLR0VfSFdBQzoKKwkJCVJ0diA9IFNrR2VTaXJxRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNlbHNlIC8qICFTS19VU0VfU1dfVElNRVIgKi8KKyAgICAgICAgY2FzZSBTS0dFX1NXVCA6CisJCQlSdHYgPSBTa1N3dEV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjZW5kaWYgLyogIVNLX1VTRV9TV19USU1FUiAqLworI2lmZGVmIFNLX1VTRV9MQUNfRVYKKwkJY2FzZSBTS0dFX0xBQ1AgOgorCQkJUnR2ID0gU2tMYWNwRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKwkJY2FzZSBTS0dFX1JTRiA6CisJCQlSdHYgPSBTa1JzZkV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisJCWNhc2UgU0tHRV9NQVJLRVIgOgorCQkJUnR2ID0gU2tNYXJrZXJFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworCQljYXNlIFNLR0VfRkQgOgorCQkJUnR2ID0gU2tGZEV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjZW5kaWYgLyogU0tfVVNFX0xBQ19FViAqLworI2lmZGVmCVNLX1VTRV9DU1VNCisJCWNhc2UgU0tHRV9DU1VNIDoKKwkJCVJ0diA9IFNrQ3NFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2VuZGlmCS8qIFNLX1VTRV9DU1VNICovCisJCWRlZmF1bHQgOgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9RX0UwMDIsIFNLRVJSX1FfRTAwMk1TRyk7CisJCQlSdHYgPSAwOworCQl9CisKKwkJaWYgKFJ0diAhPSAwKSB7CisJCQlyZXR1cm4oUnR2KTsKKwkJfQorCisJCWlmICgrK3BFdiA9PSAmcEFDLT5FdmVudC5FdlF1ZXVlW1NLX01BWF9FVkVOVF0pCisJCQlwRXYgPSBwQUMtPkV2ZW50LkV2UXVldWU7CisKKwkJLyogUmVuZXcgZ2V0OiBpdCBpcyB1c2VkIGluIHF1ZXVlX2V2ZW50cyB0byBkZXRlY3Qgb3ZlcnJ1bnMgKi8KKwkJcEFDLT5FdmVudC5FdkdldCA9IHBFdjsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrcmxtdC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3JsbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWExMWFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3JsbXQuYwpAQCAtMCwwICsxLDMyNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3JsbXQuYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjY5ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA0LzE1IDA5OjM5OjIyICQKKyAqIFB1cnBvc2U6CU1hbmFnZSBsaW5rcyBvbiBTSy1ORVQgQWRhcHRlcnMsIGVzcC4gcmVkdW5kYW50IG9uZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgZm9yIExpbmsgTWFuYWdlbWVuVCAoTE1UKSBvZiBTSy1ORVQgQWRhcHRlcnMuCisgKiBJdCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIGFkYXB0ZXJzIHdpdGggbW9yZSB0aGFuIG9uZSBsaW5rLgorICogRm9yIHN1Y2ggYWRhcHRlcnMsIHRoaXMgbW9kdWxlIHJlYWxpemVzIFJlZHVuZGFudCBMaW5rIE1hbmFnZW1lblQgKFJMTVQpLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJInNrZHJ2MXN0LmgiCisgKgkic2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza3JsbXQuYyx2IDEuNjkgMjAwMy8wNC8xNSAwOTozOToyMiB0c2NoaWxsaSBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCS8qICFkZWZpbmVkKGxpbnQpICovCisKKyNkZWZpbmUgX19TS1JMTVRfQworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIGNwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTS19IV0FDX0xJTktfTEVECisjZGVmaW5lIFNLX0hXQUNfTElOS19MRUQoYSxiLGMsZCkKKyNlbmRpZgkvKiAhZGVmaW5lZChTS19IV0FDX0xJTktfTEVEKSAqLworCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIFJMTVRfU1RBVElDCXN0YXRpYworI2Vsc2UJLyogREVCVUcgKi8KKyNkZWZpbmUgUkxNVF9TVEFUSUMKKworI2lmbmRlZiBTS19MSVRUTEVfRU5ESUFOCisvKiBGaXJzdCAzMiBiaXRzICovCisjZGVmaW5lIE9GRlNfTE8zMgkxCisKKy8qIFNlY29uZCAzMiBiaXRzICovCisjZGVmaW5lIE9GRlNfSEkzMgkwCisjZWxzZQkvKiBTS19MSVRUTEVfRU5ESUFOICovCisvKiBGaXJzdCAzMiBiaXRzICovCisjZGVmaW5lIE9GRlNfTE8zMgkwCisKKy8qIFNlY29uZCAzMiBiaXRzICovCisjZGVmaW5lIE9GRlNfSEkzMgkxCisjZW5kaWYJLyogU0tfTElUVExFX0VORElBTiAqLworCisjZW5kaWYJLyogREVCVUcgKi8KKworLyogLS0tLS0gUHJpdmF0ZSB0aW1lb3V0IHZhbHVlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfTUlOX1RPX1ZBTAkJCSAgIDEyNTAwMAkvKiAxLzggc2VjLiAqLworI2RlZmluZSBTS19STE1UX0RFRl9UT19WQUwJCQkgIDEwMDAwMDAJLyogMSBzZWMuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVERPV05fVElNX1ZBTAkgICA5MDAwMDAJLyogYW5vdGhlciAwLjkgc2VjLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRTVEFSVF9USU1fVkFMCSAgIDEwMDAwMAkvKiAwLjEgc2VjLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRVUF9USU1fVkFMCQkgIDI1MDAwMDAJLyogMi41IHNlYy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TRUdfVE9fVkFMCQkJOTAwMDAwMDAwCS8qIDE1IG1pbi4gKi8KKworLyogQXNzdW1lIHRpY2sgY291bnRlciBpbmNyZW1lbnQgaXMgMSAtIG1heSBiZSBzZXQgT1MtZGVwZW5kZW50LiAqLworI2lmbmRlZiBTS19USUNLX0lOQ1IKKyNkZWZpbmUgU0tfVElDS19JTkNSCVNLX0NPTlNUVTY0KDEpCisjZW5kaWYJLyogIWRlZmluZWQoU0tfVElDS19JTkNSKSAqLworCisvKgorICogQW1vdW50IHRoYXQgYSB0aW1lIHN0YW1wIG11c3QgYmUgbGF0ZXIgdG8gYmUgcmVjb2duaXplZCBhcyAic3Vic3RhbnRpYWxseQorICogbGF0ZXIiLiBUaGlzIGlzIGFib3V0IDEvMTI4IHNlYywgYnV0IGFib3ZlIDEgdGljayBjb3VudGVyIGluY3JlbWVudC4KKyAqLworI2RlZmluZSBTS19STE1UX0JDX0RFTFRBCQkoMSArICgoU0tfVElDS1NfUEVSX1NFQyA+PiA3KSA+IFNLX1RJQ0tfSU5DUiA/IFwKKwkJCQkJCQkJCShTS19USUNLU19QRVJfU0VDID4+IDcpIDogU0tfVElDS19JTkNSKSkKKworLyogLS0tLS0gUHJpdmF0ZSBSTE1UIGRlZmF1bHRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9ERUZfUFJFRl9QT1JUCTAJCQkJCS8qICJMb3dlciIgcG9ydC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9ERUZfTU9ERSAJCVNLX1JMTVRfQ0hFQ0tfTElOSwkvKiBEZWZhdWx0IFJMTVQgTW9kZS4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBSTE1UIGNoZWNraW5nIHN0YXRlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfUkNTX1NFRwkJCTEJCS8qIFJMTVQgQ2hlY2sgU3RhdGU6IGNoZWNrIHNlZy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9SQ1NfU1RBUlRfU0VHCTIJCS8qIFJMTVQgQ2hlY2sgU3RhdGU6IHN0YXJ0IGNoZWNrIHNlZy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9SQ1NfU0VORF9TRUcJNAkJLyogUkxNVCBDaGVjayBTdGF0ZTogc2VuZCBCUERVIHBhY2tldCAqLworI2RlZmluZSBTS19STE1UX1JDU19SRVBPUlRfU0VHCTgJCS8qIFJMTVQgQ2hlY2sgU3RhdGU6IHJlcG9ydCBzZWcuICovCisKKy8qIC0tLS0tIFByaXZhdGUgUE9SVCBjaGVja2luZyBzdGF0ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1BDU19UWAkJCTEJCS8qIFBvcnQgQ2hlY2sgU3RhdGU6IGNoZWNrIHR4LiAqLworI2RlZmluZSBTS19STE1UX1BDU19SWAkJCTIJCS8qIFBvcnQgQ2hlY2sgU3RhdGU6IGNoZWNrIHJ4LiAqLworCisvKiAtLS0tLSBQcml2YXRlIFBPUlQgZXZlbnRzIC0tLS0tICovCisKKy8qIE5vdGU6IFVwZGF0ZSBzaW11bGF0aW9uIHdoZW4gY2hhbmdpbmcgdGhlc2UuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVFNUQVJUX1RJTQkxMTAwCS8qIFBvcnQgc3RhcnQgdGltZW91dC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JUVVBfVElNCQkxMTAxCS8qIFBvcnQgY2FuIG5vdyBnbyB1cC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JURE9XTl9SWF9USU0JMTEwMgkvKiBQb3J0IGRpZCBub3QgcmVjZWl2ZSBvbmNlIC4uLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRET1dOCQkxMTAzCS8qIFBvcnQgd2VudCBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRET1dOX1RYX1RJTQkxMTA0CS8qIFBhcnRuZXIgZGlkIG5vdCByZWNlaXZlIC4uLiAqLworCisvKiAtLS0tLSBQcml2YXRlIFJMTVQgZXZlbnRzIC0tLS0tICovCisKKy8qIE5vdGU6IFVwZGF0ZSBzaW11bGF0aW9uIHdoZW4gY2hhbmdpbmcgdGhlc2UuICovCisjZGVmaW5lIFNLX1JMTVRfVElNCQkJCTIxMDAJLyogUkxNVCB0aW1lb3V0LiAqLworI2RlZmluZSBTS19STE1UX1NFR19USU0JCQkyMTAxCS8qIFJMTVQgc2VnbWVudGF0aW9uIGNoZWNrIHRpbWVvdXQuICovCisKKyNkZWZpbmUgVE9fU0hPUlRFTih0aW0pCSgodGltKSAvIDIpCisKKy8qIEVycm9yIG51bWJlcnMgYW5kIG1lc3NhZ2VzLiAqLworI2RlZmluZSBTS0VSUl9STE1UX0UwMDEJCShTS19FUlJCQVNFX1JMTVQgKyAwKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDFfTVNHCSJObyBQYWNrZXQuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDIJCShTS0VSUl9STE1UX0UwMDEgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDJfTVNHCSJTaG9ydCBQYWNrZXQuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDMJCShTS0VSUl9STE1UX0UwMDIgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDNfTVNHCSJVbmtub3duIFJMTVQgZXZlbnQuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDQJCShTS0VSUl9STE1UX0UwMDMgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDRfTVNHCSJQb3J0c1VwIGluY29ycmVjdC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNQkJKFNLRVJSX1JMTVRfRTAwNCArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNV9NU0cJXAorICJOZXQgc2VlbXMgdG8gYmUgc2VnbWVudGVkIChkaWZmZXJlbnQgcm9vdCBicmlkZ2VzIGFyZSByZXBvcnRlZCBvbiB0aGUgcG9ydHMpLiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA2CQkoU0tFUlJfUkxNVF9FMDA1ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA2X01TRwkiRHVwbGljYXRlIE1BQyBBZGRyZXNzIGRldGVjdGVkLiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA3CQkoU0tFUlJfUkxNVF9FMDA2ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA3X01TRwkiTGlua3NVcCBpbmNvcnJlY3QuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDgJCShTS0VSUl9STE1UX0UwMDcgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDhfTVNHCSJQb3J0IG5vdCBzdGFydGVkIGJ1dCBsaW5rIGNhbWUgdXAuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDkJCShTS0VSUl9STE1UX0UwMDggKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDlfTVNHCSJDb3JyZWN0ZWQgaWxsZWdhbCBzZXR0aW5nIG9mIFByZWZlcnJlZCBQb3J0LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDEwCQkoU0tFUlJfUkxNVF9FMDA5ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDEwX01TRwkiSWdub3JlZCBpbGxlZ2FsIFByZWZlcnJlZCBQb3J0LiIKKworLyogTExDIGZpZWxkIHZhbHVlcy4gKi8KKyNkZWZpbmUgTExDX0NPTU1BTkRfUkVTUE9OU0VfQklUCQkxCisjZGVmaW5lIExMQ19URVNUX0NPTU1BTkQJCQkJMHhFMworI2RlZmluZSBMTENfVUkJCQkJCQkJMHgwMworCisvKiBSTE1UIFBhY2tldCBmaWVsZHMuICovCisjZGVmaW5lCVNLX1JMTVRfRFNBUAkJCQkJMAorI2RlZmluZQlTS19STE1UX1NTQVAJCQkJCTAKKyNkZWZpbmUgU0tfUkxNVF9DVFJMCQkJCQkoTExDX1RFU1RfQ09NTUFORCkKKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1IwCQkJCTB4NTMJLyogUyAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjEJCQkJMHg0QgkvKiBLICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SMgkJCQkweDJECS8qIC0gKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1IzCQkJCTB4NTIJLyogUiAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjQJCQkJMHg0QwkvKiBMICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SNQkJCQkweDRECS8qIE0gKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1I2CQkJCTB4NTQJLyogVCAqLworI2RlZmluZSBTS19STE1UX1BBQ0tFVF9WRVJTSU9OCQkJMAorCisvKiBSTE1UIFNQVCBGbGFnIHZhbHVlcy4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfRkxBR19DSEFOR0UJCQkweDAxCisjZGVmaW5lCVNLX1JMTVRfU1BUX0ZMQUdfQ0hBTkdFX0FDSwkJMHg4MAorCisvKiBSTE1UIFNQVCBQYWNrZXQgZmllbGRzLiAqLworI2RlZmluZQlTS19STE1UX1NQVF9EU0FQCQkJCTB4NDIKKyNkZWZpbmUJU0tfUkxNVF9TUFRfU1NBUAkJCQkweDQyCisjZGVmaW5lIFNLX1JMTVRfU1BUX0NUUkwJCQkJKExMQ19VSSkKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUFJPVE9DT0xfSUQwCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX1BST1RPQ09MX0lEMQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9QUk9UT0NPTF9WRVJTSU9OX0lECTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfQlBEVV9UWVBFCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9GTEFHUwkJCQkweDAwCS8qID8/ICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfSUQwCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfSUQxCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisKKy8qIFJlbWFpbmluZyA2IGJ5dGVzIHdpbGwgYmUgdGhlIGN1cnJlbnQgcG9ydCBhZGRyZXNzLiAqLworI2RlZmluZQlTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDAJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QxCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMgkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDMJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfQlJJREdFX0lEMAkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworI2RlZmluZQlTS19STE1UX1NQVF9CUklER0VfSUQxCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisKKy8qIFJlbWFpbmluZyA2IGJ5dGVzIHdpbGwgYmUgdGhlIGN1cnJlbnQgcG9ydCBhZGRyZXNzLiAqLworI2RlZmluZQlTS19STE1UX1NQVF9QT1JUX0lEMAkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworI2RlZmluZQlTS19STE1UX1NQVF9QT1JUX0lEMQkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworI2RlZmluZQlTS19STE1UX1NQVF9NU0dfQUdFMAkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfTVNHX0FHRTEJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX01BWF9BR0UwCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9NQVhfQUdFMQkJCTB4RkYKKyNkZWZpbmUJU0tfUkxNVF9TUFRfSEVMTE9fVElNRTAJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX0hFTExPX1RJTUUxCQkJMHhGRgorI2RlZmluZQlTS19STE1UX1NQVF9GV0RfREVMQVkwCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9GV0RfREVMQVkxCQkJMHg0MAorCisvKiBTaXplIGRlZmluZXMuICovCisjZGVmaW5lIFNLX1JMTVRfTUlOX1BBQ0tFVF9TSVpFCQkJMzQKKyNkZWZpbmUgU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkUJCQkoU0tfUkxNVF9NQVhfVFhfQlVGX1NJWkUpCisjZGVmaW5lIFNLX1BBQ0tFVF9EQVRBX0xFTgkJCQkoU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkUgLSBcCisJCQkJCQkJCQkJU0tfUkxNVF9NSU5fUEFDS0VUX1NJWkUpCisKKy8qIC0tLS0tIFJMTVQgcGFja2V0IHR5cGVzIC0tLS0tICovCisjZGVmaW5lIFNLX1BBQ0tFVF9BTk5PVU5DRQkJCQkxCS8qIFBvcnQgYW5ub3VuY2VtZW50LiAqLworI2RlZmluZSBTS19QQUNLRVRfQUxJVkUJCQkJCTIJLyogQWxpdmUgcGFja2V0IHRvIHBvcnQuICovCisjZGVmaW5lIFNLX1BBQ0tFVF9BRERSX0NIQU5HRUQJCQkzCS8qIFBvcnQgYWRkcmVzcyBjaGFuZ2VkLiAqLworI2RlZmluZSBTS19QQUNLRVRfQ0hFQ0tfVFgJCQkJNAkvKiBDaGVjayB5b3VyIHR4IGxpbmUuICovCisKKyNpZmRlZiBTS19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFNLX1UxNl9UT19ORVRXT1JLX09SREVSKFZhbCxBZGRyKSB7IFwKKwlTS19VOAkqX0FkZHIgPSAoU0tfVTgqKShBZGRyKTsgXAorCVNLX1UxNglfVmFsID0gKFNLX1UxNikoVmFsKTsgXAorCSpfQWRkcisrID0gKFNLX1U4KShfVmFsID4+IDgpOyBcCisJKl9BZGRyID0gKFNLX1U4KShfVmFsICYgMHhGRik7IFwKK30KKyNlbmRpZgkvKiBTS19MSVRUTEVfRU5ESUFOICovCisKKyNpZmRlZiBTS19CSUdfRU5ESUFOCisjZGVmaW5lIFNLX1UxNl9UT19ORVRXT1JLX09SREVSKFZhbCxBZGRyKSAoKihTS19VMTYqKShBZGRyKSA9IChTS19VMTYpKFZhbCkpCisjZW5kaWYJLyogU0tfQklHX0VORElBTiAqLworCisjZGVmaW5lIEFVVE9ORUdfRkFJTEVECVNLX0ZBTFNFCisjZGVmaW5lIEFVVE9ORUdfU1VDQ0VTUwlTS19UUlVFCisKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkxNVCBwYWNrZXQuICBMZW5ndGg6IFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFICg2MCkgYnl0ZXMuICovCit0eXBlZGVmIHN0cnVjdCBzX1JsbXRQYWNrZXQgeworCVNLX1U4CURzdEFkZHJbU0tfTUFDX0FERFJfTEVOXTsKKwlTS19VOAlTcmNBZGRyW1NLX01BQ19BRERSX0xFTl07CisJU0tfVTgJVHlwZUxlblsyXTsKKwlTS19VOAlEU2FwOworCVNLX1U4CVNTYXA7CisJU0tfVTgJQ3RybDsKKwlTS19VOAlJbmRpY2F0b3JbN107CisJU0tfVTgJUmxtdFBhY2tldFR5cGVbMl07CisJU0tfVTgJQWxpZ24xWzJdOworCVNLX1U4CVJhbmRvbVs0XTsJCQkJLyogUmFuZG9tIHZhbHVlIG9mIHJlcXVlc3RpbmcoISkgc3RhdGlvbi4gKi8KKwlTS19VOAlSbG10UGFja2V0VmVyc2lvblsyXTsJLyogUkxNVCBQYWNrZXQgdmVyc2lvbi4gKi8KKwlTS19VOAlEYXRhW1NLX1BBQ0tFVF9EQVRBX0xFTl07Cit9IFNLX1JMTVRfUEFDS0VUOworCit0eXBlZGVmIHN0cnVjdCBzX1NwVHJlZVJsbXRQYWNrZXQgeworCVNLX1U4CURzdEFkZHJbU0tfTUFDX0FERFJfTEVOXTsKKwlTS19VOAlTcmNBZGRyW1NLX01BQ19BRERSX0xFTl07CisJU0tfVTgJVHlwZUxlblsyXTsKKwlTS19VOAlEU2FwOworCVNLX1U4CVNTYXA7CisJU0tfVTgJQ3RybDsKKwlTS19VOAlQcm90b2NvbElkWzJdOworCVNLX1U4CVByb3RvY29sVmVyc2lvbklkOworCVNLX1U4CUJwZHVUeXBlOworCVNLX1U4CUZsYWdzOworCVNLX1U4CVJvb3RJZFs4XTsKKwlTS19VOAlSb290UGF0aENvc3RbNF07CisJU0tfVTgJQnJpZGdlSWRbOF07CisJU0tfVTgJUG9ydElkWzJdOworCVNLX1U4CU1lc3NhZ2VBZ2VbMl07CisJU0tfVTgJTWF4QWdlWzJdOworCVNLX1U4CUhlbGxvVGltZVsyXTsKKwlTS19VOAlGb3J3YXJkRGVsYXlbMl07Cit9IFNLX1NQVFJFRV9QQUNLRVQ7CisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NLX01BQ19BRERSCVNrUmxtdE1jQWRkciA9CXt7MHgwMSwgIDB4MDAsICAweDVBLCAgMHg1MiwgIDB4NEMsICAweDREfX07CitTS19NQUNfQUREUglCcmlkZ2VNY0FkZHIgPQl7ezB4MDEsICAweDgwLCAgMHhDMiwgIDB4MDAsICAweDAwLCAgMHgwMH19OworU0tfTUFDX0FERFIJQmNBZGRyID0gCQl7ezB4RkYsICAweEZGLCAgMHhGRiwgIDB4RkYsICAweEZGLCAgMHhGRn19OworCisvKiBsb2NhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOb25lLiAqLworCisvKiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdENoZWNrU3dpdGNoKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJTmV0SWR4KTsKK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10Q2hlY2tTZWcoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglOZXRJZHgpOworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTZXROZXRzKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCVNLX0VWUEFSQQlQYXJhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEluaXQgLSBpbml0aWFsaXplIGRhdGEsIHNldCBzdGF0ZSB0byBpbml0CisgKgorICogRGVzY3JpcHRpb246CisgKgorICoJU0tfSU5JVF9EQVRBCisgKgk9PT09PT09PT09PT0KKyAqCisgKglUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgYWxsIFJMTVQtcmVsYXRlZCB2YXJpYWJsZXMgdG8gYSBrbm93biBzdGF0ZS4KKyAqCVRoZSBpbml0aWFsIHN0YXRlIGlzIFNLX1JMTVRfUlNfSU5JVC4KKyAqCUFsbCBwb3J0cyBhcmUgaW5pdGlhbGl6ZWQgdG8gU0tfUkxNVF9QU19JTklULgorICoKKyAqCisgKglTS19JTklUX0lPCisgKgk9PT09PT09PT09CisgKgorICoJTm90aGluZy4KKyAqCisgKgorICoJU0tfSU5JVF9SVU4KKyAqCT09PT09PT09PT09CisgKgorICoJRGV0ZXJtaW5lIHRoZSBhZGFwdGVyJ3MgcmFuZG9tIHZhbHVlLgorICoJU2V0IHRoZSBodyByZWdpc3RlcnMsIHRoZSAibG9naWNhbCBNQUMgYWRkcmVzcyIsIHRoZQorICoJUkxNVCBtdWx0aWNhc3QgYWRkcmVzcywgYW5kIGV2ZW50dWFsbHkgdGhlIEJQRFUgbXVsdGljYXN0IGFkZHJlc3MuCisgKgorICogQ29udGV4dDoKKyAqCWluaXQsIHBhZ2VhYmxlCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK3ZvaWQJU2tSbG10SW5pdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK2ludAkJTGV2ZWwpCS8qIEluaXRpYWxpemF0aW9uIExldmVsICovCit7CisJU0tfVTMyCQlpLCBqOworCVNLX1U2NAkJUmFuZG9tOworCVNLX0VWUEFSQQlQYXJhOworICAgIFNLX01BQ19BRERSCQlWaXJ0dWFsTWFjQWRkcmVzczsKKyAgICBTS19NQUNfQUREUgkJUGh5c2ljYWxBTWFjQWRkcmVzczsKKyAgICBTS19CT09MCQlWaXJ0dWFsTWFjQWRkcmVzc1NldDsKKyAgICBTS19CT09MCQlQaHlzaWNhbEFNYWNBZGRyZXNzU2V0OworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfSU5JVCwKKwkJKCJSTE1UIEluaXQgbGV2ZWwgJWQuXG4iLCBMZXZlbCkpCisKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CS8qIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzLiAqLworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5SbG10LCAwLCBzaXplb2YoU0tfUkxNVCkpOworCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0lOSVQ7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5MaW5rRG93biA9IFNLX1RSVUU7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0RG93biA9IFNLX1RSVUU7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhcnRlZCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydE5vUnggPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydE51bWJlciA9IGk7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5OZXQgPSAmcEFDLT5SbG10Lk5ldFswXTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLkFkZHJQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W2ldOworCQl9CisKKwkJcEFDLT5SbG10Lk51bU5ldHMgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX05FVFM7IGkrKykgeworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10U3RhdGUgPSBTS19STE1UX1JTX0lOSVQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydCA9IFNLX1JMTVRfREVGX1BSRUZfUE9SVDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZmVyZW5jZSA9IDB4RkZGRkZGRkY7CSAgLyogQXV0b21hdGljLiAqLworCQkJLyogSnVzdCBhc3N1bWluZy4gKi8KKwkJCXBBQy0+UmxtdC5OZXRbaV0uQWN0aXZlUG9ydCA9IHBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRNb2RlID0gU0tfUkxNVF9ERUZfTU9ERTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uVGltZW91dFZhbHVlID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCQkJcEFDLT5SbG10Lk5ldFtpXS5OZXROdW1iZXIgPSBpOworCQl9CisKKwkJcEFDLT5SbG10Lk5ldFswXS5Qb3J0WzBdID0gJnBBQy0+UmxtdC5Qb3J0WzBdOworCQlwQUMtPlJsbXQuTmV0WzBdLlBvcnRbMV0gPSAmcEFDLT5SbG10LlBvcnRbMV07CisjaWYgU0tfTUFYX05FVFMgPiAxCisJCXBBQy0+UmxtdC5OZXRbMV0uUG9ydFswXSA9ICZwQUMtPlJsbXQuUG9ydFsxXTsKKyNlbmRpZgkvKiBTS19NQVhfTkVUUyA+IDEgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNLX0lOSVRfSU86CS8qIEdJTWFjc0ZvdW5kIGZpcnN0IGF2YWlsYWJsZSBoZXJlLiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9JTklULAorCQkJKCJSTE1UOiAlZCBNQUNzIHdlcmUgZGV0ZWN0ZWQuXG4iLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQpKQorCisJCXBBQy0+UmxtdC5OZXRbMF0uTnVtUG9ydHMgPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwkJLyogSW5pdGlhbGl6ZSBIVyByZWdpc3RlcnM/ICovCisJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMSkgeworCQkJUGFyYS5QYXJhMzJbMF0gPSBTS19STE1UX01PREVfQ0xTOworCQkJUGFyYS5QYXJhMzJbMV0gPSAwOworCQkJKHZvaWQpU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfTU9ERV9DSEFOR0UsIFBhcmEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19JTklUX1JVTjoKKwkJLyogRW5zdXJlIFJMTVQgaXMgc2V0IHRvIG9uZSBuZXQuICovCisJCWlmIChwQUMtPlJsbXQuTnVtTmV0cyA+IDEpIHsKKwkJCVBhcmEuUGFyYTMyWzBdID0gMTsKKwkJCVBhcmEuUGFyYTMyWzFdID0gLTE7CisJCQlTa1JsbXRFdnRTZXROZXRzKHBBQywgSW9DLCBQYXJhKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlSYW5kb20gPSBTa09zR2V0VGltZShwQUMpOworCQkJKihTS19VMzIqKSZwQUMtPlJsbXQuUG9ydFtpXS5SYW5kb20gPSAqKFNLX1UzMiopJlJhbmRvbTsKKworCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJCXBBQy0+UmxtdC5Qb3J0W2ldLlJhbmRvbVtqXSBePSBwQUMtPlJsbXQuUG9ydFtpXS5BZGRyUG9ydC0+CisJCQkJCUN1cnJlbnRNYWNBZGRyZXNzLmFbU0tfTUFDX0FERFJfTEVOIC0gMSAtIGpdOworCQkJfQorCisJCQkodm9pZClTa0FkZHJNY0NsZWFyKHBBQywgSW9DLCBpLCBTS19BRERSX1BFUk1BTkVOVCB8IFNLX01DX1NXX09OTFkpOworCQkJCisJCQkvKiBBZGQgUkxNVCBNQyBhZGRyZXNzLiAqLworCQkJKHZvaWQpU2tBZGRyTWNBZGQocEFDLCBJb0MsIGksICZTa1JsbXRNY0FkZHIsIFNLX0FERFJfUEVSTUFORU5UKTsKKworCQkJaWYgKHBBQy0+UmxtdC5OZXRbMF0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgeworCQkJCS8qIEFkZCBCUERVIE1DIGFkZHJlc3MuICovCisJCQkJKHZvaWQpU2tBZGRyTWNBZGQocEFDLCBJb0MsIGksICZCcmlkZ2VNY0FkZHIsIFNLX0FERFJfUEVSTUFORU5UKTsKKwkJCX0KKworCQkJKHZvaWQpU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIGkpOworCQl9CisKKyAgICAJVmlydHVhbE1hY0FkZHJlc3NTZXQgPSBTS19GQUxTRTsKKwkJLyogUmVhZCB2aXJ0dWFsIE1BQyBhZGRyZXNzIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0tfTUFDX0FERFJfTEVOOyBqKyspIHsKKwkJCQorICAgICAgICAgICAgU0tfSU44KElvQywgQjJfTUFDXzEgKyBqLCAmVmlydHVhbE1hY0FkZHJlc3MuYVtqXSk7CisgICAgICAgICAgICBWaXJ0dWFsTWFjQWRkcmVzc1NldCB8PSBWaXJ0dWFsTWFjQWRkcmVzcy5hW2pdOworCQl9CisgICAgCQorICAgICAgICBQaHlzaWNhbEFNYWNBZGRyZXNzU2V0ID0gU0tfRkFMU0U7CisJCS8qIFJlYWQgcGh5c2ljYWwgTUFDIGFkZHJlc3MgZm9yIE1BQyBBIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0tfTUFDX0FERFJfTEVOOyBqKyspIHsKKwkJCQorICAgICAgICAgICAgU0tfSU44KElvQywgQjJfTUFDXzIgKyBqLCAmUGh5c2ljYWxBTWFjQWRkcmVzcy5hW2pdKTsKKyAgICAgICAgICAgIFBoeXNpY2FsQU1hY0FkZHJlc3NTZXQgfD0gUGh5c2ljYWxBTWFjQWRkcmVzcy5hW2pdOworCQl9CisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIHR3byBtYWMgYWRkcmVzc2VzIGNvbnRhaW4gcmVhc29uYWJsZSB2YWx1ZXMgKi8KKyAgICAgICAgaWYgKCFWaXJ0dWFsTWFjQWRkcmVzc1NldCB8fCAhUGh5c2ljYWxBTWFjQWRkcmVzc1NldCkgeworCisgICAgICAgICAgICBwQUMtPlJsbXQuUmxtdE9mZiA9IFNLX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB0aGUgdHdvIG1hYyBhZGRyZXNzZXMgYXJlIGVxdWFsIHN3aXRjaCBvZmYgdGhlIFJMTVRfUFJFX0xPT0tBSEVBRAorICAgICAgICAgICBhbmQgdGhlIFJMTVRfTE9PS0FIRUFEIG1hY3JvcyAqLworICAgICAgICBlbHNlIGlmIChTS19BRERSX0VRVUFMKFBoeXNpY2FsQU1hY0FkZHJlc3MuYSwgVmlydHVhbE1hY0FkZHJlc3MuYSkpIHsKKworICAgICAgICAgICAgcEFDLT5SbG10LlJsbXRPZmYgPSBTS19UUlVFOworICAgICAgICB9CisJCWVsc2UgeworCQkJcEFDLT5SbG10LlJsbXRPZmYgPSBTS19GQUxTRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CS8qIGVycm9yICovCisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CS8qIFNrUmxtdEluaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10QnVpbGRDaGVja0NoYWluIC0gYnVpbGQgdGhlIGNoZWNrIGNoYWluCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgYnVpbGRzIHRoZSBsb2NhbCBjaGVjayBjaGFpbjoKKyAqCS0gRWFjaCBwb3J0IHRoYXQgaXMgdXAgY2hlY2tzIHRoZSBuZXh0IHBvcnQuCisgKgktIFRoZSBsYXN0IHBvcnQgdGhhdCBpcyB1cCBjaGVja3MgdGhlIGZpcnN0IHBvcnQgdGhhdCBpcyB1cC4KKyAqCisgKiBOb3RlczoKKyAqCS0gQ3VycmVudGx5IG9ubHkgbG9jYWwgcG9ydHMgYXJlIGNvbnNpZGVyZWQgd2hlbiBidWlsZGluZyB0aGUgY2hhaW4uCisgKgktIEN1cnJlbnRseSB0aGUgU3VzcGVjdFN0YXRlIGlzIGp1c3QgcmVzZXQ7CisgKgkgIGl0IHdvdWxkIGJlIGJldHRlciB0byBzYXZlIGl0IC4uLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbigKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfVTMyCU5ldElkeCkJLyogTmV0IE51bWJlciAqLworeworCVNLX1UzMgkJCWk7CisJU0tfVTMyCQkJTnVtTWFjc1VwOworCVNLX1JMTVRfUE9SVCAqCUZpcnN0TWFjVXA7CisJU0tfUkxNVF9QT1JUICoJUHJldk1hY1VwOworCisJRmlyc3RNYWNVcAk9IE5VTEw7CisJUHJldk1hY1VwCT0gTlVMTDsKKwkKKwlpZiAoIShwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtpXS5OdW1Qb3J0czsgaSsrKSB7CisJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydHNDaGVja2VkID0gMDsKKwkJfQorCQlyZXR1cm47CS8qIERvbmUuICovCisJfQorCQkJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTa1JsbXRCdWlsZENoZWNrQ2hhaW4uXG4iKSkKKworCU51bU1hY3NVcCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtOZXRJZHhdLk51bVBvcnRzOyBpKyspIHsKKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRzQ2hlY2tlZCA9IDA7CisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0c1N1c3BlY3QgPSAwOworCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+Q2hlY2tpbmdTdGF0ZSAmPQorCQkJfihTS19STE1UX1BDU19SWCB8IFNLX1JMTVRfUENTX1RYKTsKKworCQkvKgorCQkgKiBJZiBtb3JlIHRoYW4gdHdvIGxpbmtzIGFyZSBkZXRlY3RlZCB3ZSBzaG91bGQgY29uc2lkZXIKKwkJICogY2hlY2tpbmcgYXQgbGVhc3QgdHdvIG90aGVyIHBvcnRzOgorCQkgKiAxLiB0aGUgbmV4dCBwb3J0IHRoYXQgaXMgbm90IExpbmtEb3duIGFuZAorCQkgKiAyLiB0aGUgbmV4dCBwb3J0IHRoYXQgaXMgbm90IFBvcnREb3duLgorCQkgKi8KKwkJaWYgKCFwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+TGlua0Rvd24pIHsKKwkJCWlmIChOdW1NYWNzVXAgPT0gMCkgeworCQkJCUZpcnN0TWFjVXAgPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVByZXZNYWNVcC0+UG9ydENoZWNrWworCQkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydHNDaGVja2VkXS5DaGVja0FkZHIgPQorCQkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+QWRkclBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzOworCQkJCVByZXZNYWNVcC0+UG9ydENoZWNrWworCQkJCQlQcmV2TWFjVXAtPlBvcnRzQ2hlY2tlZF0uU3VzcGVjdFR4ID0gU0tfRkFMU0U7CisJCQkJUHJldk1hY1VwLT5Qb3J0c0NoZWNrZWQrKzsKKwkJCX0KKwkJCVByZXZNYWNVcCA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldOworCQkJTnVtTWFjc1VwKys7CisJCX0KKwl9CisKKwlpZiAoTnVtTWFjc1VwID4gMSkgeworCQlQcmV2TWFjVXAtPlBvcnRDaGVja1tQcmV2TWFjVXAtPlBvcnRzQ2hlY2tlZF0uQ2hlY2tBZGRyID0KKwkJCUZpcnN0TWFjVXAtPkFkZHJQb3J0LT5DdXJyZW50TWFjQWRkcmVzczsKKwkJUHJldk1hY1VwLT5Qb3J0Q2hlY2tbUHJldk1hY1VwLT5Qb3J0c0NoZWNrZWRdLlN1c3BlY3RUeCA9CisJCQlTS19GQUxTRTsKKwkJUHJldk1hY1VwLT5Qb3J0c0NoZWNrZWQrKzsKKwl9CisKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W05ldElkeF0uTnVtUG9ydHM7IGkrKykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJQb3J0ICVkIGNoZWNrcyAlZCBvdGhlciBwb3J0czogJTJYLlxuIiwgaSwKKwkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydHNDaGVja2VkLAorCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0Q2hlY2tbMF0uQ2hlY2tBZGRyLmFbNV0pKQorCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJcmV0dXJuOworfQkvKiBTa1JsbXRCdWlsZENoZWNrQ2hhaW4gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10QnVpbGRQYWNrZXQgLSBidWlsZCBhbiBSTE1UIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNldHMgdXAgYW4gUkxNVCBwYWNrZXQuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOVUxMIG9yIHBvaW50ZXIgdG8gUkxNVCBtYnVmCisgKi8KK1JMTVRfU1RBVElDIFNLX01CVUYJKlNrUmxtdEJ1aWxkUGFja2V0KAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogU2VuZGluZyBwb3J0ICovCitTS19VMTYJCVBhY2tldFR5cGUsCS8qIFJMTVQgcGFja2V0IHR5cGUgKi8KK1NLX01BQ19BRERSCSpTcmNBZGRyLAkvKiBTb3VyY2UgYWRkcmVzcyAqLworU0tfTUFDX0FERFIJKkRlc3RBZGRyKQkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzICovCit7CisJaW50CQlpOworCVNLX1UxNgkJTGVuZ3RoOworCVNLX01CVUYJCSpwTWI7CisJU0tfUkxNVF9QQUNLRVQJKnBQYWNrZXQ7CisKKyNpZmRlZiBERUJVRworCVNLX1U4CUNoZWNrU3JjICA9IDA7CisJU0tfVTgJQ2hlY2tEZXN0ID0gMDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyArK2kpIHsKKwkJQ2hlY2tTcmMgIHw9IFNyY0FkZHItPmFbaV07CisJCUNoZWNrRGVzdCB8PSBEZXN0QWRkci0+YVtpXTsKKwl9CisKKwlpZiAoKENoZWNrU3JjID09IDApIHx8IChDaGVja0Rlc3QgPT0gMCkpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfRVJSLAorCQkJKCJTa1JsbXRCdWlsZFBhY2tldDogSW52YWxpZCAlcyVzYWRkci5cbiIsCisJCQkgKENoZWNrU3JjID09IDAgPyAiU3JjIiA6ICIiKSwgKENoZWNrRGVzdCA9PSAwID8gIkRlc3QiIDogIiIpKSkKKwl9CisjZW5kaWYKKworCWlmICgocE1iID0gU2tEcnZBbGxvY1JsbXRNYnVmKHBBQywgSW9DLCBTS19STE1UX01BWF9QQUNLRVRfU0laRSkpICE9IE5VTEwpIHsKKwkJcFBhY2tldCA9IChTS19STE1UX1BBQ0tFVCopcE1iLT5wRGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BQ19BRERSX0xFTjsgaSsrKSB7CisJCQlwUGFja2V0LT5Ec3RBZGRyW2ldID0gRGVzdEFkZHItPmFbaV07CisJCQlwUGFja2V0LT5TcmNBZGRyW2ldID0gU3JjQWRkci0+YVtpXTsKKwkJfQorCQlwUGFja2V0LT5EU2FwID0gU0tfUkxNVF9EU0FQOworCQlwUGFja2V0LT5TU2FwID0gU0tfUkxNVF9TU0FQOworCQlwUGFja2V0LT5DdHJsID0gU0tfUkxNVF9DVFJMOworCQlwUGFja2V0LT5JbmRpY2F0b3JbMF0gPSBTS19STE1UX0lORElDQVRPUjA7CisJCXBQYWNrZXQtPkluZGljYXRvclsxXSA9IFNLX1JMTVRfSU5ESUNBVE9SMTsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzJdID0gU0tfUkxNVF9JTkRJQ0FUT1IyOworCQlwUGFja2V0LT5JbmRpY2F0b3JbM10gPSBTS19STE1UX0lORElDQVRPUjM7CisJCXBQYWNrZXQtPkluZGljYXRvcls0XSA9IFNLX1JMTVRfSU5ESUNBVE9SNDsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzVdID0gU0tfUkxNVF9JTkRJQ0FUT1I1OworCQlwUGFja2V0LT5JbmRpY2F0b3JbNl0gPSBTS19STE1UX0lORElDQVRPUjY7CisKKwkJU0tfVTE2X1RPX05FVFdPUktfT1JERVIoUGFja2V0VHlwZSwgJnBQYWNrZXQtPlJsbXRQYWNrZXRUeXBlWzBdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlwUGFja2V0LT5SYW5kb21baV0gPSBwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5SYW5kb21baV07CisJCX0KKwkJCisJCVNLX1UxNl9UT19ORVRXT1JLX09SREVSKAorCQkJU0tfUkxNVF9QQUNLRVRfVkVSU0lPTiwgJnBQYWNrZXQtPlJsbXRQYWNrZXRWZXJzaW9uWzBdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0tfUEFDS0VUX0RBVEFfTEVOOyBpKyspIHsKKwkJCXBQYWNrZXQtPkRhdGFbaV0gPSAweDAwOworCQl9CisKKwkJTGVuZ3RoID0gU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkU7CS8qIE9yIHNtYWxsZXIuICovCisJCXBNYi0+TGVuZ3RoID0gTGVuZ3RoOworCQlwTWItPlBvcnRJZHggPSBQb3J0TnVtYmVyOworCQlMZW5ndGggLT0gMTQ7CisJCVNLX1UxNl9UT19ORVRXT1JLX09SREVSKExlbmd0aCwgJnBQYWNrZXQtPlR5cGVMZW5bMF0pOworCisJCWlmIChQYWNrZXRUeXBlID09IFNLX1BBQ0tFVF9BTElWRSkgeworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uVHhIZWxsb0N0cysrOworCQl9CisJfQorCisJcmV0dXJuIChwTWIpOworfQkvKiBTa1JsbXRCdWlsZFBhY2tldCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldCAtIGJ1aWxkIHNwYW5uaW5nIHRyZWUgY2hlY2sgcGFja2V0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2V0cyB1cCBhIEJQRFUgcGFja2V0IGZvciBzcGFubmluZyB0cmVlIGNoZWNrLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCBvciBwb2ludGVyIHRvIFJMTVQgbWJ1ZgorICovCitSTE1UX1NUQVRJQyBTS19NQlVGCSpTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFNlbmRpbmcgcG9ydCAqLworeworCXVuc2lnbmVkCQkJaTsKKwlTS19VMTYJCQkJTGVuZ3RoOworCVNLX01CVUYJCQkJKnBNYjsKKwlTS19TUFRSRUVfUEFDS0VUCSpwU1BhY2tldDsKKworCWlmICgocE1iID0gU2tEcnZBbGxvY1JsbXRNYnVmKHBBQywgSW9DLCBTS19STE1UX01BWF9QQUNLRVRfU0laRSkpICE9CisJCU5VTEwpIHsKKwkJcFNQYWNrZXQgPSAoU0tfU1BUUkVFX1BBQ0tFVCopcE1iLT5wRGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BQ19BRERSX0xFTjsgaSsrKSB7CisJCQlwU1BhY2tldC0+RHN0QWRkcltpXSA9IEJyaWRnZU1jQWRkci5hW2ldOworCQkJcFNQYWNrZXQtPlNyY0FkZHJbaV0gPQorCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbaV07CisJCX0KKwkJcFNQYWNrZXQtPkRTYXAgPSBTS19STE1UX1NQVF9EU0FQOworCQlwU1BhY2tldC0+U1NhcCA9IFNLX1JMTVRfU1BUX1NTQVA7CisJCXBTUGFja2V0LT5DdHJsID0gU0tfUkxNVF9TUFRfQ1RSTDsKKworCQlwU1BhY2tldC0+UHJvdG9jb2xJZFswXSA9IFNLX1JMTVRfU1BUX1BST1RPQ09MX0lEMDsKKwkJcFNQYWNrZXQtPlByb3RvY29sSWRbMV0gPSBTS19STE1UX1NQVF9QUk9UT0NPTF9JRDE7CisJCXBTUGFja2V0LT5Qcm90b2NvbFZlcnNpb25JZCA9IFNLX1JMTVRfU1BUX1BST1RPQ09MX1ZFUlNJT05fSUQ7CisJCXBTUGFja2V0LT5CcGR1VHlwZSA9IFNLX1JMTVRfU1BUX0JQRFVfVFlQRTsKKwkJcFNQYWNrZXQtPkZsYWdzID0gU0tfUkxNVF9TUFRfRkxBR1M7CisJCXBTUGFja2V0LT5Sb290SWRbMF0gPSBTS19STE1UX1NQVF9ST09UX0lEMDsKKwkJcFNQYWNrZXQtPlJvb3RJZFsxXSA9IFNLX1JMTVRfU1BUX1JPT1RfSUQxOworCQlwU1BhY2tldC0+Um9vdFBhdGhDb3N0WzBdID0gU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QwOworCQlwU1BhY2tldC0+Um9vdFBhdGhDb3N0WzFdID0gU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QxOworCQlwU1BhY2tldC0+Um9vdFBhdGhDb3N0WzJdID0gU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QyOworCQlwU1BhY2tldC0+Um9vdFBhdGhDb3N0WzNdID0gU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QzOworCQlwU1BhY2tldC0+QnJpZGdlSWRbMF0gPSBTS19STE1UX1NQVF9CUklER0VfSUQwOworCQlwU1BhY2tldC0+QnJpZGdlSWRbMV0gPSBTS19STE1UX1NQVF9CUklER0VfSUQxOworCisJCS8qCisJCSAqIFVzZSBsb2dpY2FsIE1BQyBhZGRyZXNzIGFzIGJyaWRnZSBJRCBhbmQgZmlsdGVyIHRoZXNlIHBhY2tldHMKKwkJICogb24gcmVjZWl2ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKykgeworCQkJcFNQYWNrZXQtPkJyaWRnZUlkW2kgKyAyXSA9IHBTUGFja2V0LT5Sb290SWRbaSArIDJdID0KKwkJCQlwQUMtPkFkZHIuTmV0W3BBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyXS4KKwkJCQkJQ3VycmVudE1hY0FkZHJlc3MuYVtpXTsKKwkJfQorCQlwU1BhY2tldC0+UG9ydElkWzBdID0gU0tfUkxNVF9TUFRfUE9SVF9JRDA7CisJCXBTUGFja2V0LT5Qb3J0SWRbMV0gPSBTS19STE1UX1NQVF9QT1JUX0lEMTsKKwkJcFNQYWNrZXQtPk1lc3NhZ2VBZ2VbMF0gPSBTS19STE1UX1NQVF9NU0dfQUdFMDsKKwkJcFNQYWNrZXQtPk1lc3NhZ2VBZ2VbMV0gPSBTS19STE1UX1NQVF9NU0dfQUdFMTsKKwkJcFNQYWNrZXQtPk1heEFnZVswXSA9IFNLX1JMTVRfU1BUX01BWF9BR0UwOworCQlwU1BhY2tldC0+TWF4QWdlWzFdID0gU0tfUkxNVF9TUFRfTUFYX0FHRTE7CisJCXBTUGFja2V0LT5IZWxsb1RpbWVbMF0gPSBTS19STE1UX1NQVF9IRUxMT19USU1FMDsKKwkJcFNQYWNrZXQtPkhlbGxvVGltZVsxXSA9IFNLX1JMTVRfU1BUX0hFTExPX1RJTUUxOworCQlwU1BhY2tldC0+Rm9yd2FyZERlbGF5WzBdID0gU0tfUkxNVF9TUFRfRldEX0RFTEFZMDsKKwkJcFNQYWNrZXQtPkZvcndhcmREZWxheVsxXSA9IFNLX1JMTVRfU1BUX0ZXRF9ERUxBWTE7CisKKwkJTGVuZ3RoID0gU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkU7CS8qIE9yIHNtYWxsZXIuICovCisJCXBNYi0+TGVuZ3RoID0gTGVuZ3RoOworCQlwTWItPlBvcnRJZHggPSBQb3J0TnVtYmVyOworCQlMZW5ndGggLT0gMTQ7CisJCVNLX1UxNl9UT19ORVRXT1JLX09SREVSKExlbmd0aCwgJnBTUGFja2V0LT5UeXBlTGVuWzBdKTsKKworCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5UeFNwSGVsbG9SZXFDdHMrKzsKKwl9CisKKwlyZXR1cm4gKHBNYik7Cit9CS8qIFNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbmQgLSBidWlsZCBhbmQgc2VuZCBjaGVjayBwYWNrZXRzCisgKgorICogRGVzY3JpcHRpb246CisgKglEZXBlbmRpbmcgb24gdGhlIFJMTVQgc3RhdGUgYW5kIHRoZSBjaGVja2luZyBzdGF0ZSwgc2V2ZXJhbCBwYWNrZXRzCisgKglhcmUgc2VudCB0aHJvdWdoIHRoZSBpbmRpY2F0ZWQgcG9ydC4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10U2VuZCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFNlbmRpbmcgcG9ydCAqLworeworCXVuc2lnbmVkCWo7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl07CisJaWYgKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSB7CisJCWlmIChwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiAoU0tfUkxNVF9QQ1NfVFggfCBTS19STE1UX1BDU19SWCkpIHsKKwkJCS8qIFBvcnQgaXMgc3VzcGljaW91cy4gU2VuZCB0aGUgUkxNVCBwYWNrZXQgdG8gdGhlIFJMTVQgbWMgYWRkci4gKi8KKwkJCWlmICgoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQb3J0TnVtYmVyLAorCQkJCVNLX1BBQ0tFVF9BTElWRSwgJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLAorCQkJCSZTa1JsbXRNY0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFNlbmQgYSBkaXJlY3RlZCBSTE1UIHBhY2tldCB0byBhbGwgcG9ydHMgdGhhdCBhcmUKKwkJCSAqIGNoZWNrZWQgYnkgdGhlIGluZGljYXRlZCBwb3J0LgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgcFJQb3J0LT5Qb3J0c0NoZWNrZWQ7IGorKykgeworCQkJCWlmICgoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQb3J0TnVtYmVyLAorCQkJCQlTS19QQUNLRVRfQUxJVkUsICZwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcywKKwkJCQkJJnBSUG9ydC0+UG9ydENoZWNrW2pdLkNoZWNrQWRkcikpICE9IE5VTEwpIHsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICgocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSAmJgorCQkocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9SQ1NfU0VORF9TRUcpKSB7CisJCS8qCisJCSAqIFNlbmQgYSBCUERVIHBhY2tldCB0byBtYWtlIGEgY29ubmVjdGVkIHN3aXRjaCB0ZWxsIHVzCisJCSAqIHRoZSBjb3JyZWN0IHJvb3QgYnJpZGdlLgorCQkgKi8KKwkJaWYgKChQYXJhLnBQYXJhUHRyID0KKwkJCVNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0KHBBQywgSW9DLCBQb3J0TnVtYmVyKSkgIT0gTlVMTCkgeworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1JDU19TRU5EX1NFRzsKKwkJCXBSUG9ydC0+Um9vdElkU2V0ID0gU0tfRkFMU0U7CisKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1RYLAorCQkJCSgiU2tSbG10U2VuZDogQlBEVSBQYWNrZXQgb24gUG9ydCAldS5cbiIsIFBvcnROdW1iZXIpKQorCQl9CisJfQorCXJldHVybjsKK30JLyogU2tSbG10U2VuZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRQb3J0UmVjZWl2ZXMgLSBjaGVjayBpZiBwb3J0IGlzIChnb2luZykgZG93biBhbmQgYnJpbmcgaXQgdXAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjaGVja3MgaWYgYSBwb3J0IHdobyByZWNlaXZlZCBhIG5vbi1CUERVIHBhY2tldAorICoJbmVlZHMgdG8gZ28gdXAgb3IgbmVlZHMgdG8gYmUgc3RvcHBlZCBnb2luZyBkb3duLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRQb3J0UmVjZWl2ZXMoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCQkvKiBQb3J0IHRvIGNoZWNrICovCit7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisJU0tfRVZQQVJBCQlQYXJhOworCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdOworCXBSUG9ydC0+UG9ydE5vUnggPSBTS19GQUxTRTsKKworCWlmICgocFJQb3J0LT5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19ET1dOKSAmJgorCQkhKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1RYKSkgeworCQkvKgorCQkgKiBQb3J0IGlzIG1hcmtlZCBkb3duIChyeCksIGJ1dCByZWNlaXZlZCBhIG5vbi1CUERVIHBhY2tldC4KKwkJICogQnJpbmcgaXQgdXAuCisJCSAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogUmVjZWl2ZWQgb24gUG9ydERvd24uXG4iKSkKKworCQlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfR09JTkdfVVA7CisJCXBSUG9ydC0+R3VUaW1lU3RhbXAgPSBTa09zR2V0VGltZShwQUMpOworCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5VcFRpbWVyLCBTS19STE1UX1BPUlRVUF9USU1fVkFMLAorCQkJU0tHRV9STE1ULCBTS19STE1UX1BPUlRVUF9USU0sIFBhcmEpOworCQlwUlBvcnQtPkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUENTX1JYOworCQkvKiBwQUMtPlJsbXQuQ2hlY2tTd2l0Y2ggPSBTS19UUlVFOyAqLworCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJfQkvKiBQb3J0RG93biAmJiAhU3VzcGVjdFR4ICovCisJZWxzZSBpZiAocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFN0b3AgYnJpbmdpbmcgcG9ydCBkb3duLlxuIikpCisJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duUnhUaW1lcik7CisJCXBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9QQ1NfUlg7CisJCS8qIHBBQy0+UmxtdC5DaGVja1N3aXRjaCA9IFNLX1RSVUU7ICovCisJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwl9CS8qIFBvcnRHb2luZ0Rvd24gKi8KKworCXJldHVybjsKK30JLyogU2tSbG10UG9ydFJlY2VpdmVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFBhY2tldFJlY2VpdmUgLSByZWNlaXZlIGEgcGFja2V0IGZvciBjbG9zZXIgZXhhbWluYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBleGFtaW5lcyBhIHBhY2tldCBtb3JlIGNsb3NlbHkgdGhhbiBTS19STE1UX0xPT0tBSEVBRC4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10UGFja2V0UmVjZWl2ZSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX01CVUYJKnBNYikJLyogUmVjZWl2ZWQgcGFja2V0ICovCit7CisjaWZkZWYgeERFQlVHCisJZXh0ZXJuCXZvaWQgRHVtcERhdGEoY2hhciAqcCwgaW50IHNpemUpOworI2VuZGlmCS8qIERFQlVHICovCisJaW50CQkJCQlpOworCXVuc2lnbmVkCQkJajsKKwlTS19VMTYJCQkJUGFja2V0VHlwZTsKKwlTS19VMzIJCQkJUG9ydE51bWJlcjsKKwlTS19BRERSX1BPUlQJCSpwQVBvcnQ7CisJU0tfUkxNVF9QT1JUCQkqcFJQb3J0OworCVNLX1JMTVRfUEFDS0VUCQkqcFJQYWNrZXQ7CisJU0tfU1BUUkVFX1BBQ0tFVAkqcFNQYWNrZXQ7CisJU0tfRVZQQVJBCQkJUGFyYTsKKworCVBvcnROdW1iZXIJPSBwTWItPlBvcnRJZHg7CisJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdOworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFBvcnROdW1iZXIgPT0gJWQuXG4iLCBQb3J0TnVtYmVyKSkKKworCXBSUGFja2V0ID0gKFNLX1JMTVRfUEFDS0VUKilwTWItPnBEYXRhOworCXBTUGFja2V0ID0gKFNLX1NQVFJFRV9QQUNLRVQqKXBSUGFja2V0OworCisjaWZkZWYgeERFQlVHCisJRHVtcERhdGEoKGNoYXIgKilwUlBhY2tldCwgMzIpOworI2VuZGlmCS8qIERFQlVHICovCisKKwlpZiAoKHBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90IC0gcFJQb3J0LT5CcGR1UGFja2V0c1BlclRpbWVTbG90KSAhPSAwKSB7CisJCVNrUmxtdFBvcnRSZWNlaXZlcyhwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorCQorCS8qIENoZWNrIGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCisKKwlpZiAoIVNLX0FERFJfRVFVQUwocEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hLCBwUlBhY2tldC0+RHN0QWRkcikgJiYKKwkJIVNLX0FERFJfRVFVQUwoU2tSbG10TWNBZGRyLmEsIHBSUGFja2V0LT5Ec3RBZGRyKSAmJgorCQkhU0tfQUREUl9FUVVBTChCcmlkZ2VNY0FkZHIuYSwgcFJQYWNrZXQtPkRzdEFkZHIpKSB7CisKKwkJLyogTm90IHNlbnQgdG8gY3VycmVudCBNQUMgb3IgcmVnaXN0ZXJlZCBNQyBhZGRyZXNzID0+IFRyYXNoIGl0LiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogTm90IGZvciBtZS5cbiIpKQorCisJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKFNLX0FERFJfRVFVQUwocEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hLCBwUlBhY2tldC0+U3JjQWRkcikpIHsKKworCQkvKgorCQkgKiBXYXMgc2VudCBieSBzYW1lIHBvcnQgKG1heSBoYXBwZW4gZHVyaW5nIHBvcnQgc3dpdGNoaW5nCisJCSAqIG9yIGluIGNhc2Ugb2YgZHVwbGljYXRlIE1BQyBhZGRyZXNzZXMpLgorCQkgKi8KKworCQkvKgorCQkgKiBDaGVjayBmb3IgZHVwbGljYXRlIGFkZHJlc3MgaGVyZToKKwkJICogSWYgUGFja2V0LlJhbmRvbSAhPSBNeS5SYW5kb20gPT4gRHVwQWRkci4KKwkJICovCisJCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAocFJQb3J0LT5SYW5kb21baV0gIT0gcFJQYWNrZXQtPlJhbmRvbVtpXSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogQ0FVVElPTjogRG8gbm90IGNoZWNrIGZvciBkdXBsaWNhdGUgTUFDIGFkZHJlc3MgaW4gUkxNVCBBbGl2ZSBSZXBseQorCQkgKiBwYWNrZXRzICh0aGV5IGhhdmUgdGhlIExMQ19DT01NQU5EX1JFU1BPTlNFX0JJVCBzZXQgaW4KKwkJICogcFJQYWNrZXQtPlNTYXApLgorCQkgKi8KKwkJaWYgKGkgPj0gMCAmJiBwUlBhY2tldC0+RFNhcCA9PSBTS19STE1UX0RTQVAgJiYKKwkJCXBSUGFja2V0LT5DdHJsID09IFNLX1JMTVRfQ1RSTCAmJgorCQkJcFJQYWNrZXQtPlNTYXAgPT0gU0tfUkxNVF9TU0FQICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzBdID09IFNLX1JMTVRfSU5ESUNBVE9SMCAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvclsxXSA9PSBTS19STE1UX0lORElDQVRPUjEgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbMl0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IyICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzNdID09IFNLX1JMTVRfSU5ESUNBVE9SMyAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvcls0XSA9PSBTS19STE1UX0lORElDQVRPUjQgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbNV0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I1ICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzZdID09IFNLX1JMTVRfSU5ESUNBVE9SNikgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBEdXBsaWNhdGUgTUFDIEFkZHJlc3MuXG4iKSkKKworCQkJLyogRXJyb3IgTG9nIGVudHJ5LiAqLworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0NPTU0sIFNLRVJSX1JMTVRfRTAwNiwgU0tFUlJfUkxNVF9FMDA2X01TRyk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBTaW1wbHkgdHJhc2ggaXQuICovCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFNlbnQgYnkgbWUuXG4iKSkKKwkJfQorCisJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgU3VzcGVjdFR4IGVudHJpZXMuICovCisJaWYgKHBSUG9ydC0+UG9ydHNTdXNwZWN0ID4gMCkgeworCQlmb3IgKGogPSAwOyBqIDwgcFJQb3J0LT5Qb3J0c0NoZWNrZWQ7IGorKykgeworCQkJaWYgKHBSUG9ydC0+UG9ydENoZWNrW2pdLlN1c3BlY3RUeCAmJgorCQkJCVNLX0FERFJfRVFVQUwoCisJCQkJCXBSUGFja2V0LT5TcmNBZGRyLCBwUlBvcnQtPlBvcnRDaGVja1tqXS5DaGVja0FkZHIuYSkpIHsKKwkJCQlwUlBvcnQtPlBvcnRDaGVja1tqXS5TdXNwZWN0VHggPSBTS19GQUxTRTsKKwkJCQlwUlBvcnQtPlBvcnRzU3VzcGVjdC0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogRGV0ZXJtaW5lIHR5cGUgb2YgcGFja2V0LiAqLworCWlmIChwUlBhY2tldC0+RFNhcCA9PSBTS19STE1UX0RTQVAgJiYKKwkJcFJQYWNrZXQtPkN0cmwgPT0gU0tfUkxNVF9DVFJMICYmCisJCShwUlBhY2tldC0+U1NhcCAmIH5MTENfQ09NTUFORF9SRVNQT05TRV9CSVQpID09IFNLX1JMTVRfU1NBUCAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzBdID09IFNLX1JMTVRfSU5ESUNBVE9SMCAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzFdID09IFNLX1JMTVRfSU5ESUNBVE9SMSAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzJdID09IFNLX1JMTVRfSU5ESUNBVE9SMiAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzNdID09IFNLX1JMTVRfSU5ESUNBVE9SMyAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzRdID09IFNLX1JMTVRfSU5ESUNBVE9SNCAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzVdID09IFNLX1JMTVRfSU5ESUNBVE9SNSAmJgorCQlwUlBhY2tldC0+SW5kaWNhdG9yWzZdID09IFNLX1JMTVRfSU5ESUNBVE9SNikgeworCisJCS8qIEl0J3MgYW4gUkxNVCBwYWNrZXQuICovCisJCVBhY2tldFR5cGUgPSAoU0tfVTE2KSgocFJQYWNrZXQtPlJsbXRQYWNrZXRUeXBlWzBdIDw8IDgpIHwKKwkJCXBSUGFja2V0LT5SbG10UGFja2V0VHlwZVsxXSk7CisKKwkJc3dpdGNoIChQYWNrZXRUeXBlKSB7CisJCWNhc2UgU0tfUEFDS0VUX0FOTk9VTkNFOgkvKiBOb3QgeWV0IHVzZWQuICovCisjaWYgMAorCQkJLyogQnVpbGQgdGhlIGNoZWNrIGNoYWluLiAqLworCQkJU2tSbG10QnVpbGRDaGVja0NoYWluKHBBQyk7CisjZW5kaWYJLyogMCAqLworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IEFubm91bmNlLlxuIikpCisKKwkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTS19QQUNLRVRfQUxJVkU6CisJCQlpZiAocFJQYWNrZXQtPlNTYXAgJiBMTENfQ09NTUFORF9SRVNQT05TRV9CSVQpIHsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBBbGl2ZSBSZXBseS5cbiIpKQorCisJCQkJaWYgKCEocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSB8fAorCQkJCQlTS19BRERSX0VRVUFMKAorCQkJCQkJcFJQYWNrZXQtPkRzdEFkZHIsIHBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYSkpIHsKKwkJCQkJLyogT2J2aW91c2x5IHdlIGNvdWxkIHNlbmQgc29tZXRoaW5nLiAqLworCQkJCQlpZiAocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfVFgpIHsKKwkJCQkJCXBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmPSAgflNLX1JMTVRfUENTX1RYOworCQkJCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25UeFRpbWVyKTsKKwkJCQkJfQorCisJCQkJCWlmICgocFJQb3J0LT5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19ET1dOKSAmJgorCQkJCQkJIShwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpIHsKKwkJCQkJCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19HT0lOR19VUDsKKwkJCQkJCXBSUG9ydC0+R3VUaW1lU3RhbXAgPSBTa09zR2V0VGltZShwQUMpOworCisJCQkJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blR4VGltZXIpOworCisJCQkJCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCQkJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPlVwVGltZXIsCisJCQkJCQkJU0tfUkxNVF9QT1JUVVBfVElNX1ZBTCwgU0tHRV9STE1ULAorCQkJCQkJCVNLX1JMTVRfUE9SVFVQX1RJTSwgUGFyYSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBNYXJrIHNlbmRpbmcgcG9ydCBhcyBhbGl2ZT8gKi8KKwkJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJCX0KKwkJCWVsc2UgewkvKiBBbGl2ZSBSZXF1ZXN0IFBhY2tldC4gKi8KKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBBbGl2ZSBSZXF1ZXN0LlxuIikpCisKKwkJCQlwUlBvcnQtPlJ4SGVsbG9DdHMrKzsKKworCQkJCS8qIEFuc3dlci4gKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyBpKyspIHsKKwkJCQkJcFJQYWNrZXQtPkRzdEFkZHJbaV0gPSBwUlBhY2tldC0+U3JjQWRkcltpXTsKKwkJCQkJcFJQYWNrZXQtPlNyY0FkZHJbaV0gPQorCQkJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVtpXTsKKwkJCQl9CisJCQkJcFJQYWNrZXQtPlNTYXAgfD0gTExDX0NPTU1BTkRfUkVTUE9OU0VfQklUOworCisJCQkJUGFyYS5wUGFyYVB0ciA9IHBNYjsKKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNLX1BBQ0tFVF9DSEVDS19UWDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQ2hlY2sgeW91ciB0eCBsaW5lLlxuIikpCisKKwkJCS8qIEEgcG9ydCBjaGVja2luZyB1cyByZXF1ZXN0cyB1cyB0byBjaGVjayBvdXIgdHggbGluZS4gKi8KKwkJCXBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSB8PSBTS19STE1UX1BDU19UWDsKKworCQkJLyogU3RhcnQgUG9ydERvd25UeCB0aW1lci4gKi8KKwkJCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+RG93blR4VGltZXIsCisJCQkJU0tfUkxNVF9QT1JURE9XTl9USU1fVkFMLCBTS0dFX1JMTVQsCisJCQkJU0tfUkxNVF9QT1JURE9XTl9UWF9USU0sIFBhcmEpOworCisJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKworCQkJaWYgKChQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBvcnROdW1iZXIsCisJCQkJU0tfUEFDS0VUX0FMSVZFLCAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MsCisJCQkJJlNrUmxtdE1jQWRkcikpICE9IE5VTEwpIHsKKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNLX1BBQ0tFVF9BRERSX0NIQU5HRUQ6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IEFkZHJlc3MgQ2hhbmdlLlxuIikpCisKKwkJCS8qIEJ1aWxkIHRoZSBjaGVjayBjaGFpbi4gKi8KKwkJCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbihwQUMsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBVbmtub3duIFJMTVQgcGFja2V0LlxuIikpCisKKwkJCS8qIFJBOzo7OiA/Pz8gKi8KKwkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQl9CisJfQorCWVsc2UgaWYgKHBTUGFja2V0LT5EU2FwID09IFNLX1JMTVRfU1BUX0RTQVAgJiYKKwkJcFNQYWNrZXQtPkN0cmwgPT0gU0tfUkxNVF9TUFRfQ1RSTCAmJgorCQkocFNQYWNrZXQtPlNTYXAgJiB+TExDX0NPTU1BTkRfUkVTUE9OU0VfQklUKSA9PSBTS19STE1UX1NQVF9TU0FQKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBCUERVIFBhY2tldC5cbiIpKQorCisJCS8qIFNwYW5uaW5nIFRyZWUgcGFja2V0LiAqLworCQlwUlBvcnQtPlJ4U3BIZWxsb0N0cysrOworCisJCWlmICghU0tfQUREUl9FUVVBTCgmcFNQYWNrZXQtPlJvb3RJZFsyXSwgJnBBQy0+QWRkci5OZXRbcEFDLT5SbG10LgorCQkJUG9ydFtQb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVswXSkpIHsKKwkJCS8qCisJCQkgKiBDaGVjayBzZWdtZW50YXRpb24gaWYgYSBuZXcgcm9vdCBicmlkZ2UgaXMgc2V0IGFuZAorCQkJICogdGhlIHNlZ21lbnRhdGlvbiBjaGVjayBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcuCisJCQkgKi8KKwkJCWlmICghU0tfQUREUl9FUVVBTCgmcFNQYWNrZXQtPlJvb3RJZFsyXSwgJnBSUG9ydC0+Um9vdC5JZFsyXSkgJiYKKwkJCQkocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5MaW5rc1VwID4gMSkgJiYKKwkJCQkocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKQorCQkJCSE9IDAgJiYgKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSAmCisJCQkJU0tfUkxNVF9SQ1NfU0VHKSA9PSAwKSB7CisJCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlIHw9CisJCQkJCVNLX1JMTVRfUkNTX1NUQVJUX1NFRyB8IFNLX1JMTVRfUkNTX1NFTkRfU0VHOworCQkJfQorCisJCQkvKiBTdG9yZSB0cmVlIHZpZXcgb2YgdGhpcyBwb3J0LiAqLworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCXBSUG9ydC0+Um9vdC5JZFtpXSA9IHBTUGFja2V0LT5Sb290SWRbaV07CisJCQl9CisJCQlwUlBvcnQtPlJvb3RJZFNldCA9IFNLX1RSVUU7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0RVTVAsCisJCQkJKCJSb290IElEICVkOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLAorCQkJCQlQb3J0TnVtYmVyLAorCQkJCQlwUlBvcnQtPlJvb3QuSWRbMF0sIHBSUG9ydC0+Um9vdC5JZFsxXSwKKwkJCQkJcFJQb3J0LT5Sb290LklkWzJdLCBwUlBvcnQtPlJvb3QuSWRbM10sCisJCQkJCXBSUG9ydC0+Um9vdC5JZFs0XSwgcFJQb3J0LT5Sb290LklkWzVdLAorCQkJCQlwUlBvcnQtPlJvb3QuSWRbNl0sIHBSUG9ydC0+Um9vdC5JZFs3XSkpCisJCX0KKworCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJaWYgKChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgJgorCQkJU0tfUkxNVF9SQ1NfUkVQT1JUX1NFRykgIT0gMCkgeworCQkJU2tSbG10Q2hlY2tTZWcocEFDLCBJb0MsIHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFVua25vd24gUGFja2V0IFR5cGUuXG4iKSkKKworCQkvKiBVbmtub3duIHBhY2tldC4gKi8KKwkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJfQorCXJldHVybjsKK30JLyogU2tSbG10UGFja2V0UmVjZWl2ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRDaGVja1BvcnQgLSBjaGVjayBpZiBhIHBvcnQgd29ya3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjaGVja3MgaWYgYSBwb3J0IHdob3NlIGxpbmsgaXMgdXAgcmVjZWl2ZWQgc29tZXRoaW5nCisgKglhbmQgaWYgaXQgc2VlbXMgdG8gdHJhbnNtaXQgc3VjY2Vzc2Z1bGx5LgorICoKKyAqCSMgUG9ydFN0YXRlOiBQc0luaXQsIFBzTGlua0Rvd24sIFBzRG93biwgUHNHb2luZ1VwLCBQc1VwCisgKgkjIFBvcnRDaGVja2luZ1N0YXRlIChCaXRmaWVsZCk6IENoa1R4LCBDaGtSeCwgQ2hrU2VnCisgKgkjIFJsbXRDaGVja2luZ1N0YXRlIChCaXRmaWVsZCk6IENoa1NlZywgU3RhcnRDaGtTZWcsIFJlcG9ydFNlZworICoKKyAqCWlmIChSeCAtIFJ4QnBkdSA9PSAwKSB7CSMgTm8gcnguCisgKgkJaWYgKHN0YXRlID09IFBzVXApIHsKKyAqCQkJUG9ydENoZWNraW5nU3RhdGUgfD0gQ2hrUngKKyAqCQl9CisgKgkJaWYgKE1vZGVDaGVja1NlZyAmJiAoVGltZW91dCA9PQorICoJCQlUT19TSE9SVEVOKFJMTVRfREVGQVVMVF9USU1FT1VUKSkpIHsKKyAqCQkJUmxtdENoZWNraW5nU3RhdGUgfD0gQ2hrU2VnKQorICoJCQlQb3J0Q2hlY2tpbmdTdGF0ZSB8PSBDaGtTZWcKKyAqCQl9CisgKgkJTmV3VGltZW91dCA9IFRPX1NIT1JURU4oVGltZW91dCkKKyAqCQlpZiAoTmV3VGltZW91dCA8IFJMTVRfTUlOX1RJTUVPVVQpIHsKKyAqCQkJTmV3VGltZW91dCA9IFJMTVRfTUlOX1RJTUVPVVQKKyAqCQkJUG9ydFN0YXRlID0gUHNEb3duCisgKgkJCS4uLgorICoJCX0KKyAqCX0KKyAqCWVsc2UgewkjIHNvbWV0aGluZyB3YXMgcmVjZWl2ZWQKKyAqCQkjIFNldCBjb3VudGVyIHRvIDAgYXQgTGlua0Rvd24/CisgKgkJIyAgIE5vIC0gcnggbWF5IGJlIHJlcG9ydGVkIGFmdGVyIExpbmtEb3duID8/PworICoJCVBvcnRDaGVja2luZ1N0YXRlICY9IH5DaGtSeAorICoJCU5ld1RpbWVvdXQgPSBSTE1UX0RFRkFVTFRfVElNRU9VVAorICoJCWlmIChSeEFjayA9PSAwKSB7CisgKgkJCXBvc3NpYmxlIHJlYXNvbnM6CisgKgkJCWlzIG15IHR4IGxpbmUgYmFkPyAtLQorICoJCQkJc2VuZCBSTE1UIG11bHRpY2FzdCBhbmQgcmVwb3J0CisgKgkJCQliYWNrIGludGVybmFsbHk/IChvbmx5IHBvc3NpYmxlCisgKgkJCQliZXR3ZWVuIHBvcnRzIG9uIHNhbWUgYWRhcHRlcikKKyAqCQl9CisgKgkJaWYgKFJ4Q2hrID09IDApIHsKKyAqCQkJcG9zc2libGUgcmVhc29uczoKKyAqCQkJLSB0eCBsaW5lIG9mIHBvcnQgc2V0IHRvIGNoZWNrIG1lCisgKgkJCSAgbWF5YmUgYmFkCisgKgkJCS0gbm8gb3RoZXIgcG9ydC9hZGFwdGVyIGF2YWlsYWJsZSBvciBzZXQKKyAqCQkJICB0byBjaGVjayBtZQorICoJCQktIGFkYXB0ZXIgY2hlY2tpbmcgbWUgaGFzIGEgbG9uZ2VyCisgKgkJCSAgdGltZW91dAorICoJCQk/Pz8gYW55dGhpbmcgdGhhdCBjYW4gYmUgZG9uZSBoZXJlPworICoJCX0KKyAqCX0KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5ldyB0aW1lb3V0IHZhbHVlLgorICovCitSTE1UX1NUQVRJQyBTS19VMzIJU2tSbG10Q2hlY2tQb3J0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogUG9ydCB0byBjaGVjayAqLworeworCXVuc2lnbmVkCQlpOworCVNLX1UzMgkJCU5ld1RpbWVvdXQ7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisJU0tfRVZQQVJBCQlQYXJhOworCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdOworCisJaWYgKChwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCAtIHBSUG9ydC0+QnBkdVBhY2tldHNQZXJUaW1lU2xvdCkgPT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTa1JsbXRDaGVja1BvcnQgJWQ6IE5vICglZCkgcmVjZWl2ZXMgaW4gbGFzdCB0aW1lIHNsb3QuXG4iLAorCQkJCVBvcnROdW1iZXIsIHBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90KSkKKworCQkvKgorCQkgKiBDaGVjayBzZWdtZW50YXRpb24gaWYgdGhlcmUgd2FzIG5vIHJlY2VpdmUgYXQgbGVhc3QgdHdpY2UKKwkJICogaW4gYSByb3cgKFBvcnROb1J4IGlzIGFscmVhZHkgc2V0KSBhbmQgdGhlIHNlZ21lbnRhdGlvbgorCQkgKiBjaGVjayBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcuCisJCSAqLworCisJCWlmIChwUlBvcnQtPlBvcnROb1J4ICYmIChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkxpbmtzVXAgPiAxKSAmJgorCQkJKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgJiYKKwkJCSEocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9SQ1NfU0VHKSkgeworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlIHw9CisJCQkJU0tfUkxNVF9SQ1NfU1RBUlRfU0VHIHwgU0tfUkxNVF9SQ1NfU0VORF9TRUc7CisJCX0KKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTa1JsbXRDaGVja1BvcnQ6IFBvcnRzU3VzcGVjdCAlZCwgUGNzUnggJWQuXG4iLAorCQkJCXBSUG9ydC0+UG9ydHNTdXNwZWN0LCBwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpCisKKwkJaWYgKHBSUG9ydC0+UG9ydFN0YXRlICE9IFNLX1JMTVRfUFNfRE9XTikgeworCQkJTmV3VGltZW91dCA9IFRPX1NIT1JURU4ocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5UaW1lb3V0VmFsdWUpOworCQkJaWYgKE5ld1RpbWVvdXQgPCBTS19STE1UX01JTl9UT19WQUwpIHsKKwkJCQlOZXdUaW1lb3V0ID0gU0tfUkxNVF9NSU5fVE9fVkFMOworCQkJfQorCisJCQlpZiAoIShwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpIHsKKwkJCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCQkJcFJQb3J0LT5DaGVja2luZ1N0YXRlIHw9IFNLX1JMTVRfUENTX1JYOworCisJCQkJLyoKKwkJCQkgKiBXaGF0IHNoYWxsIHdlIGRvIGlmIHRoZSBwb3J0IGNoZWNrZWQgYnkgdGhpcyBvbmUgcmVjZWl2ZXMKKwkJCQkgKiBvdXIgcmVxdWVzdCBmcmFtZXM/ICBXaGF0J3MgYmFkIC0gb3VyIHJ4IGxpbmUgb3IgaGlzIHR4IGxpbmU/CisJCQkJICovCisJCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+RG93blJ4VGltZXIsCisJCQkJCVNLX1JMTVRfUE9SVERPV05fVElNX1ZBTCwgU0tHRV9STE1ULAorCQkJCQlTS19STE1UX1BPUlRET1dOX1JYX1RJTSwgUGFyYSk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcFJQb3J0LT5Qb3J0c0NoZWNrZWQ7IGkrKykgeworCQkJCQlpZiAocFJQb3J0LT5Qb3J0Q2hlY2tbaV0uU3VzcGVjdFR4KSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlwUlBvcnQtPlBvcnRDaGVja1tpXS5TdXNwZWN0VHggPSBTS19UUlVFOworCQkJCQlwUlBvcnQtPlBvcnRzU3VzcGVjdCsrOworCQkJCQlpZiAoKFBhcmEucFBhcmFQdHIgPQorCQkJCQkJU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBvcnROdW1iZXIsIFNLX1BBQ0tFVF9DSEVDS19UWCwKKwkJCQkJCQkmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MsCisJCQkJCQkJJnBSUG9ydC0+UG9ydENoZWNrW2ldLkNoZWNrQWRkcikpICE9IE5VTEwpIHsKKwkJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsJLyogUG9ydERvd24gLS0gb3IgYWxsIHBhcnRuZXJzIHN1c3BlY3QuICovCisJCQlOZXdUaW1lb3V0ID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCQl9CisJCXBSUG9ydC0+UG9ydE5vUnggPSBTS19UUlVFOworCX0KKwllbHNlIHsJLyogQSBub24tQlBEVSBwYWNrZXQgd2FzIHJlY2VpdmVkLiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTa1JsbXRDaGVja1BvcnQgJWQ6ICVkICglZCkgcmVjZWl2ZXMgaW4gbGFzdCB0aW1lIHNsb3QuXG4iLAorCQkJCVBvcnROdW1iZXIsCisJCQkJcFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QgLSBwUlBvcnQtPkJwZHVQYWNrZXRzUGVyVGltZVNsb3QsCisJCQkJcFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QpKQorCQkKKwkJU2tSbG10UG9ydFJlY2VpdmVzKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwkJaWYgKHBBQy0+UmxtdC5DaGVja1N3aXRjaCkgeworCQkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQl9CisKKwkJTmV3VGltZW91dCA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKwl9CisKKwlyZXR1cm4gKE5ld1RpbWVvdXQpOworfQkvKiBTa1JsbXRDaGVja1BvcnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VsZWN0QmNSeCAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQsIGNyaXRlcmlhIDEgKENMUCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZWxlY3RzIHRoZSBwb3J0IHRoYXQgcmVjZWl2ZWQgYSBicm9hZGNhc3QgZnJhbWUKKyAqCXN1YnN0YW50aWFsbHkgbGF0ZXIgdGhhbiBhbGwgb3RoZXIgcG9ydHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglTS19CT09MCisgKi8KK1JMTVRfU1RBVElDIFNLX0JPT0wJU2tSbG10U2VsZWN0QmNSeCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUFjdGl2ZSwJCS8qIEFjdGl2ZSBwb3J0ICovCitTS19VMzIJUHJlZlBvcnQsCS8qIFByZWZlcnJlZCBwb3J0ICovCitTS19VMzIJKnBTZWxlY3QpCS8qIE5ldyBhY3RpdmUgcG9ydCAqLworeworCVNLX1U2NAkJQmNUaW1lU3RhbXA7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCUJjVGltZVN0YW1wID0gMDsJLyogTm90IHRvdGFsbHkgbmVjZXNzYXJ5LCBidXQgZmVlbGluZyBiZXR0ZXIuICovCisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisJCisJLyogU2VsZWN0IHBvcnQgd2l0aCB0aGUgbGF0ZXN0IFRpbWVTdGFtcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlRpbWVTdGFtcCBQb3J0ICVkIChEb3duOiAlZCwgTm9SeDogJWQpOiAlMDh4ICUwOHguXG4iLAorCQkJCWksCisgICAJCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydERvd24sIHBBQy0+UmxtdC5Qb3J0W2ldLlBvcnROb1J4LAorCQkJCSooKFNLX1UzMiopKCZwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcCkgKyBPRkZTX0hJMzIpLAorCQkJCSooKFNLX1UzMiopKCZwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcCkgKyBPRkZTX0xPMzIpKSkKKworCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnREb3duICYmICFwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0Tm9SeCkgeworCQkJaWYgKCFQb3J0Rm91bmQgfHwgcEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXAgPiBCY1RpbWVTdGFtcCkgeworCQkJCUJjVGltZVN0YW1wID0gcEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXA7CisJCQkJKnBTZWxlY3QgPSBpOworCQkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoUG9ydEZvdW5kKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlBvcnQgJWQgcmVjZWl2ZWQgdGhlIGxhc3QgYnJvYWRjYXN0LlxuIiwgKnBTZWxlY3QpKQorCisJCS8qIExvb2sgaWYgYW5vdGhlciBwb3J0J3MgdGltZSBzdGFtcCBpcyBzaW1pbGFyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJaWYgKGkgPT0gKnBTZWxlY3QpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcEFDLT5SbG10LlBvcnRbaV0uUG9ydERvd24gJiYgIXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnROb1J4ICYmCisJCQkJKHBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wID4KKwkJCQkgQmNUaW1lU3RhbXAgLSBTS19STE1UX0JDX0RFTFRBIHx8CisJCQkJcEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXAgKworCQkJCSBTS19STE1UX0JDX0RFTFRBID4gQmNUaW1lU3RhbXApKSB7CisJCQkJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisJCQkJCisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJQb3J0ICVkIHJlY2VpdmVkIGEgYnJvYWRjYXN0IGF0IGEgc2ltaWxhciB0aW1lLlxuIiwgaSkpCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBERUJVRworCWlmIChQb3J0Rm91bmQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRUxFQ1RfQkNSWCBmb3VuZCBQb3J0ICVkIHJlY2VpdmluZyB0aGUgc3Vic3RhbnRpYWxseSAiCisJCQkgImxhdGVzdCBicm9hZGNhc3QgKCV1KS5cbiIsCisJCQkJKnBTZWxlY3QsCisJCQkJQmNUaW1lU3RhbXAgLSBwQUMtPlJsbXQuUG9ydFsxIC0gKnBTZWxlY3RdLkJjVGltZVN0YW1wKSkKKwl9CisjZW5kaWYJLyogREVCVUcgKi8KKworCXJldHVybiAoUG9ydEZvdW5kKTsKK30JLyogU2tSbG10U2VsZWN0QmNSeCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZWxlY3ROb3RTdXNwZWN0IC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCwgY3JpdGVyaWEgMiAoQ0xQKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNlbGVjdHMgYSBnb29kIHBvcnQgKGl0IGlzIFBvcnRVcCAmJiAhU3VzcGVjdFJ4KS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCVNLX0JPT0wKKyAqLworUkxNVF9TVEFUSUMgU0tfQk9PTAlTa1JsbXRTZWxlY3ROb3RTdXNwZWN0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJQWN0aXZlLAkJLyogQWN0aXZlIHBvcnQgKi8KK1NLX1UzMglQcmVmUG9ydCwJLyogUHJlZmVycmVkIHBvcnQgKi8KK1NLX1UzMgkqcFNlbGVjdCkJLyogTmV3IGFjdGl2ZSBwb3J0ICovCit7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCisJLyogU2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBQb3J0VXAgJiYgIVN1c3BlY3RSeC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnREb3duICYmCisJCQkhKHBBQy0+UmxtdC5Qb3J0W2ldLkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpIHsKKwkJCSpwU2VsZWN0ID0gaTsKKwkJCWlmICghcEFDLT5SbG10LlBvcnRbQWN0aXZlXS5Qb3J0RG93biAmJgorCQkJCSEocEFDLT5SbG10LlBvcnRbQWN0aXZlXS5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkJKnBTZWxlY3QgPSBBY3RpdmU7CisJCQl9CisJCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W1ByZWZQb3J0XS5Qb3J0RG93biAmJgorCQkJCSEocEFDLT5SbG10LlBvcnRbUHJlZlBvcnRdLkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpIHsKKwkJCQkqcFNlbGVjdCA9IFByZWZQb3J0OworCQkJfQorCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJTS19STE1UX1NFTEVDVF9OT1RTVVNQRUNUIGZvdW5kIFBvcnQgJWQgdXAgYW5kIG5vdCBjaGVjayBSWC5cbiIsCisJCQkJCSpwU2VsZWN0KSkKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAoUG9ydEZvdW5kKTsKK30JLyogU2tSbG10U2VsZWN0Tm90U3VzcGVjdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZWxlY3RVcCAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQsIGNyaXRlcmlhIDMsIDQgKENMUCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZWxlY3RzIGEgcG9ydCB0aGF0IGlzIHVwLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQk9PTAorICovCitSTE1UX1NUQVRJQyBTS19CT09MCVNrUmxtdFNlbGVjdFVwKAorU0tfQUMJKnBBQywJCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglBY3RpdmUsCQkJLyogQWN0aXZlIHBvcnQgKi8KK1NLX1UzMglQcmVmUG9ydCwJCS8qIFByZWZlcnJlZCBwb3J0ICovCitTS19VMzIJKnBTZWxlY3QsCQkvKiBOZXcgYWN0aXZlIHBvcnQgKi8KK1NLX0JPT0wJQXV0b05lZ0RvbmUpCS8qIFN1Y2Nlc3NmdWxseSBhdXRvLW5lZ290aWF0ZWQ/ICovCit7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCisJLyogU2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBQb3J0VXAuICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX1VQICYmCisJCQlwQUMtPkdJbmkuR1BbaV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkqcFNlbGVjdCA9IGk7CisJCQlpZiAocEFDLT5SbG10LlBvcnRbQWN0aXZlXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19VUCAmJgorCQkJCXBBQy0+R0luaS5HUFtBY3RpdmVdLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJCSpwU2VsZWN0ID0gQWN0aXZlOworCQkJfQorCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W1ByZWZQb3J0XS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19VUCAmJgorCQkJCXBBQy0+R0luaS5HUFtQcmVmUG9ydF0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkJKnBTZWxlY3QgPSBQcmVmUG9ydDsKKwkJCX0KKwkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiU0tfUkxNVF9TRUxFQ1RfVVAgZm91bmQgUG9ydCAlZCB1cC5cbiIsICpwU2VsZWN0KSkKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAoUG9ydEZvdW5kKTsKK30JLyogU2tSbG10U2VsZWN0VXAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VsZWN0R29pbmdVcCAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQsIGNyaXRlcmlhIDUsIDYgKENMUCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZWxlY3RzIHRoZSBwb3J0IHRoYXQgaXMgZ29pbmcgdXAgZm9yIHRoZSBsb25nZXN0IHRpbWUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglTS19CT09MCisgKi8KK1JMTVRfU1RBVElDIFNLX0JPT0wJU2tSbG10U2VsZWN0R29pbmdVcCgKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJQWN0aXZlLAkJCS8qIEFjdGl2ZSBwb3J0ICovCitTS19VMzIJUHJlZlBvcnQsCQkvKiBQcmVmZXJyZWQgcG9ydCAqLworU0tfVTMyCSpwU2VsZWN0LAkJLyogTmV3IGFjdGl2ZSBwb3J0ICovCitTS19CT09MCUF1dG9OZWdEb25lKQkvKiBTdWNjZXNzZnVsbHkgYXV0by1uZWdvdGlhdGVkPyAqLworeworCVNLX1U2NAkJR3VUaW1lU3RhbXA7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCUd1VGltZVN0YW1wID0gMDsKKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKworCS8qIFNlbGVjdCBwb3J0IHRoYXQgaXMgUG9ydEdvaW5nVXAgZm9yIHRoZSBsb25nZXN0IHRpbWUuICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0dPSU5HX1VQICYmCisJCQlwQUMtPkdJbmkuR1BbaV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQlHdVRpbWVTdGFtcCA9IHBBQy0+UmxtdC5Qb3J0W2ldLkd1VGltZVN0YW1wOworCQkJKnBTZWxlY3QgPSBpOworCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFQb3J0Rm91bmQpIHsKKwkJcmV0dXJuIChTS19GQUxTRSk7CisJfQorCisJZm9yIChpID0gKnBTZWxlY3QgKyAxOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfR09JTkdfVVAgJiYKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLkd1VGltZVN0YW1wIDwgR3VUaW1lU3RhbXAgJiYKKwkJCXBBQy0+R0luaS5HUFtpXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCUd1VGltZVN0YW1wID0gcEFDLT5SbG10LlBvcnRbaV0uR3VUaW1lU3RhbXA7CisJCQkqcFNlbGVjdCA9IGk7CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU0VMRUNUX0dPSU5HVVAgZm91bmQgUG9ydCAlZCBnb2luZyB1cC5cbiIsICpwU2VsZWN0KSkKKwlyZXR1cm4gKFNLX1RSVUUpOworfQkvKiBTa1JsbXRTZWxlY3RHb2luZ1VwICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbGVjdERvd24gLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0LCBjcml0ZXJpYSA3LCA4IChDTFApCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2VsZWN0cyBhIHBvcnQgdGhhdCBpcyBkb3duLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQk9PTAorICovCitSTE1UX1NUQVRJQyBTS19CT09MCVNrUmxtdFNlbGVjdERvd24oCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUFjdGl2ZSwJCQkvKiBBY3RpdmUgcG9ydCAqLworU0tfVTMyCVByZWZQb3J0LAkJLyogUHJlZmVycmVkIHBvcnQgKi8KK1NLX1UzMgkqcFNlbGVjdCwJCS8qIE5ldyBhY3RpdmUgcG9ydCAqLworU0tfQk9PTAlBdXRvTmVnRG9uZSkJLyogU3VjY2Vzc2Z1bGx5IGF1dG8tbmVnb3RpYXRlZD8gKi8KK3sKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisKKwkvKiBTZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIFBvcnREb3duLiAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmIChwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19ET1dOICYmCisJCQlwQUMtPkdJbmkuR1BbaV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkqcFNlbGVjdCA9IGk7CisJCQlpZiAocEFDLT5SbG10LlBvcnRbQWN0aXZlXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19ET1dOICYmCisJCQkJcEFDLT5HSW5pLkdQW0FjdGl2ZV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkJKnBTZWxlY3QgPSBBY3RpdmU7CisJCQl9CisJCQlpZiAocEFDLT5SbG10LlBvcnRbUHJlZlBvcnRdLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0RPV04gJiYKKwkJCQlwQUMtPkdJbmkuR1BbUHJlZlBvcnRdLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJCSpwU2VsZWN0ID0gUHJlZlBvcnQ7CisJCQl9CisJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlNLX1JMTVRfU0VMRUNUX0RPV04gZm91bmQgUG9ydCAlZCBkb3duLlxuIiwgKnBTZWxlY3QpKQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChQb3J0Rm91bmQpOworfQkvKiBTa1JsbXRTZWxlY3REb3duICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdENoZWNrU3dpdGNoIC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCBhbmQgc3dpdGNoIHRvIGl0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgZGVjaWRlcyB3aGljaCBwb3J0IHNob3VsZCBiZSB0aGUgYWN0aXZlIG9uZSBhbmQgcXVldWVzCisgKglwb3J0IHN3aXRjaGluZyBpZiBuZWNlc3NhcnkuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdENoZWNrU3dpdGNoKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCU5ldElkeCkJLyogTmV0IGluZGV4ICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTMyCQlBY3RpdmU7CisJU0tfVTMyCQlQcmVmUG9ydDsKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJQWN0aXZlID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLkFjdGl2ZVBvcnQ7CS8qIEluZGV4IG9mIGFjdGl2ZSBwb3J0LiAqLworCVByZWZQb3J0ID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlByZWZQb3J0OwkvKiBJbmRleCBvZiBwcmVmZXJyZWQgcG9ydC4gKi8KKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKwlwQUMtPlJsbXQuQ2hlY2tTd2l0Y2ggPSBTS19GQUxTRTsKKworI2lmIDAJLyogUlcgMjAwMS8xMC8xOCAtIGFjdGl2ZSBwb3J0IGJlY29tZXMgYWx3YXlzIHByZWZlcmVkIG9uZSAqLworCWlmIChwQUMtPlJsbXQuTmV0W05ldElkeF0uUHJlZmVyZW5jZSA9PSAweEZGRkZGRkZGKSB7IC8qIEF1dG9tYXRpYyAqLworCQkvKiBkaXNhYmxlIGF1dG8tZmFpbCBiYWNrICovCisJCVByZWZQb3J0ID0gQWN0aXZlOworCX0KKyNlbmRpZgorCisJaWYgKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5MaW5rc1VwID09IDApIHsKKwkJLyogTGFzdCBsaW5rIHdlbnQgZG93biAtIHNodXQgZG93biB0aGUgbmV0LiAqLworCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19ORVRfRE9XTjsKKwkJUGFyYS5QYXJhMzJbMF0gPSBTS19STE1UX05FVF9ET1dOX1RFTVA7CisJCVBhcmEuUGFyYTMyWzFdID0gTmV0SWR4OworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX05FVF9ET1dOLCBQYXJhKTsKKworCQlQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS4KKwkJCVBvcnRbcEFDLT5SbG10Lk5ldFtOZXRJZHhdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworCQlQYXJhLlBhcmEzMlsxXSA9IE5ldElkeDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOLCBQYXJhKTsKKwkJcmV0dXJuOworCX0JLyogcEFDLT5SbG10LkxpbmtzVXAgPT0gMCAqLworCWVsc2UgaWYgKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5MaW5rc1VwID09IDEgJiYKKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRTdGF0ZSA9PSBTS19STE1UX1JTX05FVF9ET1dOKSB7CisJCS8qIEZpcnN0IGxpbmsgY2FtZSB1cCAtIGdldCB0aGUgbmV0IHVwLiAqLworCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19ORVRfVVA7CisKKwkJLyoKKwkJICogSWYgcEFDLT5SbG10LkFjdGl2ZVBvcnQgIT0gUGFyYS5QYXJhMzJbMF0sCisJCSAqIHRoZSBEUlYgc3dpdGNoZXMgdG8gdGhlIHBvcnQgdGhhdCBjYW1lIHVwLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5OdW1Qb3J0czsgaSsrKSB7CisJCQlpZiAoIXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5MaW5rRG93bikgeworCQkJCWlmICghcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbQWN0aXZlXS0+TGlua0Rvd24pIHsKKwkJCQkJaSA9IEFjdGl2ZTsKKwkJCQl9CisJCQkJaWYgKCFwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtQcmVmUG9ydF0tPkxpbmtEb3duKSB7CisJCQkJCWkgPSBQcmVmUG9ydDsKKwkJCQl9CisJCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChQb3J0Rm91bmQpIHsKKwkJCVBhcmEuUGFyYTMyWzBdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnROdW1iZXI7CisJCQlQYXJhLlBhcmEzMlsxXSA9IE5ldElkeDsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAsIFBhcmEpOworCisJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uQWN0aXZlUG9ydCA9IGk7CisJCQlQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0TnVtYmVyOworCQkJUGFyYS5QYXJhMzJbMV0gPSBOZXRJZHg7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX05FVF9VUCwgUGFyYSk7CisKKwkJCWlmICgocEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRNb2RlICYgU0tfUkxNVF9UUkFOU1BBUkVOVCkgPT0gMCAmJgorCQkJCShQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsCisJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnROdW1iZXIsCisJCQkJU0tfUEFDS0VUX0FOTk9VTkNFLCAmcEFDLT5BZGRyLk5ldFtOZXRJZHhdLgorCQkJCUN1cnJlbnRNYWNBZGRyZXNzLCAmU2tSbG10TWNBZGRyKSkgIT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogU2VuZCBhbm5vdW5jZSBwYWNrZXQgdG8gUkxNVCBtdWx0aWNhc3QgYWRkcmVzcyB0byBmb3JjZQorCQkJCSAqIHN3aXRjaGVzIHRvIGxlYXJuIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlIGxvZ2ljYWwgTUFDIGFkZHJlc3MuCisJCQkJICovCisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMDcsIFNLRVJSX1JMTVRfRTAwN19NU0cpOworCQl9CisKKwkJcmV0dXJuOworCX0JLyogTGlua3NVcCA9PSAxICYmIFJsbXRTdGF0ZSA9PSBTS19STE1UX1JTX05FVF9ET1dOICovCisJZWxzZSB7CS8qIENhbm5vdCBiZSByZWFjaGVkIGluIGR1YWwtbmV0IG1vZGUuICovCisJCVBhcmEuUGFyYTMyWzBdID0gQWN0aXZlOworCisJCS8qCisJCSAqIFByZXNlbGVjdGlvbjoKKwkJICoJSWYgUkxNVCBNb2RlICE9IENoZWNrTGlua1N0YXRlCisJCSAqCQlzZWxlY3QgcG9ydCB0aGF0IHJlY2VpdmVkIGEgYnJvYWRjYXN0IGZyYW1lIHN1YnN0YW50aWFsbHkgbGF0ZXIKKwkJICoJCXRoYW4gYWxsIG90aGVyIHBvcnRzCisJCSAqCWVsc2Ugc2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBub3QgU3VzcGVjdFJ4CisJCSAqCWVsc2Ugc2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBQb3J0VXAKKwkJICoJZWxzZSBzZWxlY3QgcG9ydCB0aGF0IGlzIFBvcnRHb2luZ1VwIGZvciB0aGUgbG9uZ2VzdCB0aW1lCisJCSAqCWVsc2Ugc2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBQb3J0RG93bgorCQkgKgllbHNlIHN0b3AuCisJCSAqCisJCSAqIEZvciB0aGUgcHJlc2VsZWN0ZWQgcG9ydDoKKwkJICoJSWYgQWN0aXZlUG9ydCBpcyBlcXVhbCBpbiBxdWFsaXR5LCBzZWxlY3QgQWN0aXZlUG9ydC4KKwkJICoKKwkJICoJSWYgUHJlZlBvcnQgaXMgZXF1YWwgaW4gcXVhbGl0eSwgc2VsZWN0IFByZWZQb3J0LgorCQkgKgorCQkgKglJZiBBY3RpdmVQb3J0ICE9IFNlbGVjdGVkUG9ydCwKKwkJICoJCUlmIG9sZCBBY3RpdmVQb3J0IGlzIExpbmtEb3duLAorCQkgKgkJCVN3aXRjaEhhcmQKKwkJICoJCWVsc2UKKwkJICoJCQlTd2l0Y2hTb2Z0CisJCSAqLworCQkvKiBjaGVjayBvZiBDaGdCY1ByaW8gZmxhZyBhZGRlZCAqLworCQlpZiAoKHBBQy0+UmxtdC5OZXRbMF0uUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUykgJiYKKwkJCSghcEFDLT5SbG10Lk5ldFswXS5DaGdCY1ByaW8pKSB7CisJCQkKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0QmNSeCgKKwkJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSk7CisJCQl9CisKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0Tm90U3VzcGVjdCgKKwkJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSk7CisJCQl9CisJCX0JLyogcEFDLT5SbG10LlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMgKi8KKworCQkvKiB3aXRoIGNoYW5nZWQgcHJpb3JpdHkgZm9yIGxhc3QgYnJvYWRjYXN0IHJlY2VpdmVkICovCisJCWlmICgocEFDLT5SbG10Lk5ldFswXS5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTKSAmJgorCQkJKHBBQy0+UmxtdC5OZXRbMF0uQ2hnQmNQcmlvKSkgeworCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3ROb3RTdXNwZWN0KAorCQkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdKTsKKwkJCX0KKworCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RCY1J4KAorCQkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdKTsKKwkJCX0KKwkJfQkvKiBwQUMtPlJsbXQuUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUyAqLworCisJCWlmICghUG9ydEZvdW5kKSB7CisJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RVcCgKKwkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX1NVQ0NFU1MpOworCQl9CisKKwkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdFVwKAorCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfRkFJTEVEKTsKKwkJfQorCisJCWlmICghUG9ydEZvdW5kKSB7CisJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RHb2luZ1VwKAorCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfU1VDQ0VTUyk7CisJCX0KKworCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0R29pbmdVcCgKKwkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX0ZBSUxFRCk7CisJCX0KKworCQlpZiAocEFDLT5SbG10Lk5ldFswXS5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTKSB7CisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdERvd24ocEFDLCBJb0MsCisJCQkJCUFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19TVUNDRVNTKTsKKwkJCX0KKworCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3REb3duKHBBQywgSW9DLAorCQkJCQlBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfRkFJTEVEKTsKKwkJCX0KKwkJfQkvKiBwQUMtPlJsbXQuUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUyAqLworCisJCWlmIChQb3J0Rm91bmQpIHsKKworCQkJaWYgKFBhcmEuUGFyYTMyWzFdICE9IEFjdGl2ZSkgeworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiQWN0aXZlOiAlZCwgUGFyYTE6ICVkLlxuIiwgQWN0aXZlLCBQYXJhLlBhcmEzMlsxXSkpCisJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLkFjdGl2ZVBvcnQgPSBQYXJhLlBhcmEzMlsxXTsKKwkJCQlQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS4KKwkJCQkJUG9ydFtQYXJhLlBhcmEzMlswXV0tPlBvcnROdW1iZXI7CisJCQkJUGFyYS5QYXJhMzJbMV0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uCisJCQkJCVBvcnRbUGFyYS5QYXJhMzJbMV1dLT5Qb3J0TnVtYmVyOworCQkJCVNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzFdLCBTS19MRURfQUNUSVZFKTsKKwkJCQlpZiAocEFDLT5SbG10LlBvcnRbQWN0aXZlXS5MaW5rRG93bikgeworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1NXSVRDSF9IQVJELCBQYXJhKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCVNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLCBTS19MRURfU1RBTkRCWSk7CisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfU1dJVENIX1NPRlQsIFBhcmEpOworCQkJCX0KKwkJCQlQYXJhLlBhcmEzMlsxXSA9IE5ldElkeDsKKwkJCQlQYXJhLlBhcmEzMlswXSA9CisJCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W1BhcmEuUGFyYTMyWzBdXS0+UG9ydE51bWJlcjsKKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04sIFBhcmEpOworCQkJCVBhcmEuUGFyYTMyWzBdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLgorCQkJCQlQb3J0W3BBQy0+UmxtdC5OZXRbTmV0SWR4XS5BY3RpdmVQb3J0XS0+UG9ydE51bWJlcjsKKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQLCBQYXJhKTsKKwkJCQlpZiAoKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10TW9kZSAmIFNLX1JMTVRfVFJBTlNQQVJFTlQpID09IDAgJiYKKwkJCQkJKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sCisJCQkJCVNLX1BBQ0tFVF9BTk5PVU5DRSwgJnBBQy0+QWRkci5OZXRbTmV0SWR4XS5DdXJyZW50TWFjQWRkcmVzcywKKwkJCQkJJlNrUmxtdE1jQWRkcikpICE9IE5VTEwpIHsKKwkJCQkJLyoKKwkJCQkJICogU2VuZCBhbm5vdW5jZSBwYWNrZXQgdG8gUkxNVCBtdWx0aWNhc3QgYWRkcmVzcyB0byBmb3JjZQorCQkJCQkgKiBzd2l0Y2hlcyB0byBsZWFybiB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSBsb2dpY2FsCisJCQkJCSAqIE1BQyBhZGRyZXNzLgorCQkJCQkgKi8KKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJCX0JLyogKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldCguLi4pKSAhPSBOVUxMICovCisJCQl9CS8qIFBhcmEuUGFyYTMyWzFdICE9IEFjdGl2ZSAqLworCQl9CS8qIFBvcnRGb3VuZCAqLworCQllbHNlIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDA0LCBTS0VSUl9STE1UX0UwMDRfTVNHKTsKKwkJfQorCX0JLyogTGlua3NVcCA+IDEgfHwgTGlua3NVcCA9PSAxICYmIFJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX05FVF9ET1dOICovCisJcmV0dXJuOworfQkvKiBTa1JsbXRDaGVja1N3aXRjaCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRDaGVja1NlZyAtIFJlcG9ydCBpZiBzZWdtZW50YXRpb24gaXMgZGV0ZWN0ZWQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlIHBvcnRzIHNlZSBkaWZmZXJlbnQgcm9vdCBicmlkZ2VzIGFuZCByZXBvcnRzCisgKglzZWdtZW50YXRpb24gaW4gc3VjaCBhIGNhc2UuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdENoZWNrU2VnKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCU5ldElkeCkJLyogTmV0IG51bWJlciAqLworeworCVNLX0VWUEFSQQlQYXJhOworCVNLX1JMTVRfTkVUCSpwTmV0OworCVNLX1UzMgkJaSwgajsKKwlTS19CT09MCQlFcXVhbDsKKworCXBOZXQgPSAmcEFDLT5SbG10Lk5ldFtOZXRJZHhdOworCXBOZXQtPlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCUVxdWFsID0gU0tfVFJVRTsKKworCWZvciAoaSA9IDA7IGkgPCBwTmV0LT5OdW1Qb3J0czsgaSsrKSB7CisJCWlmIChwTmV0LT5Qb3J0W2ldLT5MaW5rRG93biB8fCAhcE5ldC0+UG9ydFtpXS0+Um9vdElkU2V0KSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0RVTVAsCisJCQkoIlJvb3QgSUQgJWQ6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeC5cbiIsIGksCisJCQkJcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFswXSwgcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFsxXSwKKwkJCQlwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzJdLCBwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzNdLAorCQkJCXBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbNF0sIHBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbNV0sCisJCQkJcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFs2XSwgcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFs3XSkpCisKKwkJaWYgKCFwTmV0LT5Sb290SWRTZXQpIHsKKwkJCXBOZXQtPlJvb3QgPSBwTmV0LT5Qb3J0W2ldLT5Sb290OworCQkJcE5ldC0+Um9vdElkU2V0ID0gU0tfVFJVRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGogKyspIHsKKwkJCUVxdWFsICY9IHBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbal0gPT0gcE5ldC0+Um9vdC5JZFtqXTsKKwkJCWlmICghRXF1YWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKCFFcXVhbCkgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0NPTU0sIFNLRVJSX1JMTVRfRTAwNSwgU0tFUlJfUkxNVF9FMDA1X01TRyk7CisJCQlQYXJhLlBhcmEzMlswXSA9IE5ldElkeDsKKwkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9TRUdNRU5UQVRJT04sIFBhcmEpOworCisJCQlwTmV0LT5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1JDU19SRVBPUlRfU0VHOworCisJCQkvKiAyMDAwLTAzLTA2IFJBOiBOZXcuICovCisJCQlQYXJhLlBhcmEzMlswXSA9IE5ldElkeDsKKwkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBOZXQtPlNlZ1RpbWVyLCBTS19STE1UX1NFR19UT19WQUwsCisJCQkJU0tHRV9STE1ULCBTS19STE1UX1NFR19USU0sIFBhcmEpOworCQkJYnJlYWs7CisJCX0KKwl9CS8qIGZvciAoaSA9IDA7IGkgPCBwTmV0LT5OdW1Qb3J0czsgaSsrKSAqLworCisJLyogMjAwMC0wMy0wNiBSQTogTW92ZWQgaGVyZS4gKi8KKwkvKiBTZWdtZW50YXRpb24gY2hlY2sgbm90IHJ1bm5pbmcgYW55bW9yZS4gKi8KKwlwTmV0LT5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1JDU19TRUc7CisKK30JLyogU2tSbG10Q2hlY2tTZWcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10UG9ydFN0YXJ0IC0gaW5pdGlhbGl6ZSBwb3J0IHZhcmlhYmxlcyBhbmQgc3RhcnQgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGEgcG9ydCdzIHZhcmlhYmxlcyBhbmQgaXNzdWVzIGEgUE9SVF9TVEFSVAorICoJdG8gdGhlIEhXQUMgbW9kdWxlLiAgVGhpcyBoYW5kbGVzIHJldHJpZXMgaWYgdGhlIHN0YXJ0IGZhaWxzIG9yIHRoZQorICoJbGluayBldmVudHVhbGx5IGdvZXMgZG93bi4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRQb3J0U3RhcnQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBQb3J0IG51bWJlciAqLworeworCVNLX0VWUEFSQQlQYXJhOworCisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydFN0YXRlID0gU0tfUkxNVF9QU19MSU5LX0RPV047CisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydFN0YXJ0ZWQgPSBTS19UUlVFOworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLkxpbmtEb3duID0gU0tfVFJVRTsKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0RG93biA9IFNLX1RSVUU7CisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uQ2hlY2tpbmdTdGF0ZSA9IDA7CisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVEFSVCwgUGFyYSk7Cit9CS8qIFNrUmxtdFBvcnRTdGFydCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQb3J0U3RhcnRUaW0gLSBQT1JUX1NUQVJUX1RJTQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUE9SVF9TVEFSVF9USU0gZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UG9ydFN0YXJ0VGltKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1UzMgkJCWk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVFNUQVJUX1RJTUVPVVQgUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCQlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVFNUQVJUX1RJTUVPVVQgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXNlZCB0byBzdGFydCBub24tcHJlZmVycmVkIHBvcnRzIGlmIHRoZSBwcmVmZXJyZWQgb25lCisJICogZG9lcyBub3QgY29tZSB1cC4KKwkgKiBUaGlzIHRpbWVvdXQgbmVlZHMgb25seSBiZSBzZXQgd2hlbiBzdGFydGluZyB0aGUgZmlyc3QKKwkgKiAocHJlZmVycmVkKSBwb3J0LgorCSAqLworCWlmIChwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uTGlua0Rvd24pIHsKKwkJLyogUE9SVF9TVEFSVCBmYWlsZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uTmV0LT5OdW1Qb3J0czsgaSsrKSB7CisJCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5OZXQtPlBvcnRbaV0tPlBvcnRTdGFydGVkKSB7CisJCQkJU2tSbG10UG9ydFN0YXJ0KHBBQywgSW9DLAorCQkJCQlwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uTmV0LT5Qb3J0W2ldLT5Qb3J0TnVtYmVyKTsKKwkJCX0KKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JUU1RBUlRfVElNRU9VVCBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0UG9ydFN0YXJ0VGltICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dExpbmtVcCAtIExJTktfVVAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIExMSU5LX1VQIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dExpbmtVcCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgVW5kZWZpbmVkICovCit7CisJU0tfVTMyCQkJaTsKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKwlTS19FVlBBUkEJCVBhcmEyOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX0xJTktfVVAgUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV07CisJaWYgKCFwUlBvcnQtPlBvcnRTdGFydGVkKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDA4LCBTS0VSUl9STE1UX0UwMDhfTVNHKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiU0tfUkxNVF9MSU5LX1VQIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoIXBSUG9ydC0+TGlua0Rvd24pIHsKKwkJLyogUkE7Ojs6IEFueSBiZXR0ZXIgc29sdXRpb24/ICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfTElOS19VUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPlVwVGltZXIpOworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duUnhUaW1lcik7CisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25UeFRpbWVyKTsKKworCS8qIERvIHNvbWV0aGluZyBpZiB0aW1lciBhbHJlYWR5IGZpcmVkPyAqLworCisJcFJQb3J0LT5MaW5rRG93biA9IFNLX0ZBTFNFOworCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19HT0lOR19VUDsKKwlwUlBvcnQtPkd1VGltZVN0YW1wID0gU2tPc0dldFRpbWUocEFDKTsKKwlwUlBvcnQtPkJjVGltZVN0YW1wID0gMDsKKwlwUlBvcnQtPk5ldC0+TGlua3NVcCsrOworCWlmIChwUlBvcnQtPk5ldC0+TGlua3NVcCA9PSAxKSB7CisJCVNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLCBTS19MRURfQUNUSVZFKTsKKwl9CisJZWxzZSB7CisJCVNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLCBTS19MRURfU1RBTkRCWSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBSUG9ydC0+TmV0LT5OdW1Qb3J0czsgaSsrKSB7CisJCWlmICghcFJQb3J0LT5OZXQtPlBvcnRbaV0tPlBvcnRTdGFydGVkKSB7CisJCQlTa1JsbXRQb3J0U3RhcnQocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5Qb3J0W2ldLT5Qb3J0TnVtYmVyKTsKKwkJfQorCX0KKworCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKworCWlmIChwUlBvcnQtPk5ldC0+TGlua3NVcCA+PSAyKSB7CisJCWlmIChwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSB7CisJCQkvKiBCdWlsZCB0aGUgY2hlY2sgY2hhaW4uICovCisJCQlTa1JsbXRCdWlsZENoZWNrQ2hhaW4ocEFDLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCX0KKworCS8qIElmIHRoZSBmaXJzdCBsaW5rIGNvbWVzIHVwLCBzdGFydCB0aGUgcGVyaW9kaWNhbCBSTE1UIHRpbWVvdXQuICovCisJaWYgKHBSUG9ydC0+TmV0LT5OdW1Qb3J0cyA+IDEgJiYgcFJQb3J0LT5OZXQtPkxpbmtzVXAgPT0gMSAmJgorCQkocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19PVEhFUlMpICE9IDApIHsKKwkJUGFyYTIuUGFyYTMyWzBdID0gcFJQb3J0LT5OZXQtPk5ldE51bWJlcjsKKwkJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5OZXQtPkxvY1RpbWVyLAorCQkJcFJQb3J0LT5OZXQtPlRpbWVvdXRWYWx1ZSwgU0tHRV9STE1ULCBTS19STE1UX1RJTSwgUGFyYTIpOworCX0KKworCVBhcmEyID0gUGFyYTsKKwlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+VXBUaW1lciwgU0tfUkxNVF9QT1JUVVBfVElNX1ZBTCwKKwkJU0tHRV9STE1ULCBTS19STE1UX1BPUlRVUF9USU0sIFBhcmEyKTsKKwkKKwkvKiBMYXRlcjogaWYgKHBBQy0+UmxtdC5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspICYmICovCisJaWYgKChwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX1RSQU5TUEFSRU5UKSA9PSAwICYmCisJCShwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xJTkspICE9IDAgJiYKKwkJKFBhcmEyLnBQYXJhUHRyID0KKwkJCVNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwgU0tfUEFDS0VUX0FOTk9VTkNFLAorCQkJJnBBQy0+QWRkci5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5DdXJyZW50TWFjQWRkcmVzcywgJlNrUmxtdE1jQWRkcikKKwkJKSAhPSBOVUxMKSB7CisJCS8qIFNlbmQgIm5ldyIgcGFja2V0IHRvIFJMTVQgbXVsdGljYXN0IGFkZHJlc3MuICovCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhMik7CisJfQorCisJaWYgKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSB7CisJCWlmICgoUGFyYTIucFBhcmFQdHIgPQorCQkJU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdKSkgIT0gTlVMTCkgeworCQkJcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcFJQb3J0LT5OZXQtPkNoZWNraW5nU3RhdGUgfD0KKwkJCQlTS19STE1UX1JDU19TRUcgfCBTS19STE1UX1JDU19SRVBPUlRfU0VHOworCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYTIpOworCisJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPk5ldC0+U2VnVGltZXIsCisJCQkJU0tfUkxNVF9TRUdfVE9fVkFMLCBTS0dFX1JMTVQsIFNLX1JMTVRfU0VHX1RJTSwgUGFyYSk7CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfTElOS19VUCBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0TGlua1VwICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFBvcnRVcFRpbSAtIFBPUlRfVVBfVElNCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQT1JUX1VQX1RJTSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQb3J0VXBUaW0oCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVFVQX1RJTSBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRVUF9USU0gRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV07CisJaWYgKHBSUG9ydC0+TGlua0Rvd24gfHwgKHBSUG9ydC0+UG9ydFN0YXRlID09IFNLX1JMTVRfUFNfVVApKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVFVQX1RJTSBQb3J0ICVkIEV2ZW50IEVNUFRZLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlyZXR1cm47CisJfQorCisJcFJQb3J0LT5Qb3J0RG93biA9IFNLX0ZBTFNFOworCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19VUDsKKwlwUlBvcnQtPk5ldC0+UG9ydHNVcCsrOworCWlmIChwUlBvcnQtPk5ldC0+UmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfSU5JVCkgeworCQlpZiAocEFDLT5SbG10Lk51bU5ldHMgPD0gMSkgeworCQkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQl9CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9QT1JUX1VQLCBQYXJhKTsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVFVQX1RJTSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0UG9ydFVwVGltICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFBvcnREb3duVGltIC0gUE9SVF9ET1dOXyoKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBPUlRfRE9XTl8qIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFBvcnREb3duWCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCQlFdmVudCwJLyogRXZlbnQgY29kZSAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JURE9XTiogUG9ydCAlZCBFdmVudCAoJWQpIEJFR0lOLlxuIiwKKwkJCVBhcmEuUGFyYTMyWzBdLCBFdmVudCkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVERPV04qIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dOworCWlmICghcFJQb3J0LT5Qb3J0U3RhcnRlZCB8fCAoRXZlbnQgPT0gU0tfUkxNVF9QT1JURE9XTl9UWF9USU0gJiYKKwkJIShwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19UWCkpKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVERPV04qIEV2ZW50ICglZCkgRU1QVFkuXG4iLCBFdmVudCkpCisJCXJldHVybjsKKwl9CisJCisJLyogU3RvcCBwb3J0J3MgdGltZXJzLiAqLworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5VcFRpbWVyKTsKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blJ4VGltZXIpOworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duVHhUaW1lcik7CisKKwlpZiAocFJQb3J0LT5Qb3J0U3RhdGUgIT0gU0tfUkxNVF9QU19MSU5LX0RPV04pIHsKKwkJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0RPV047CisJfQorCisJaWYgKCFwUlBvcnQtPlBvcnREb3duKSB7CisJCXBSUG9ydC0+TmV0LT5Qb3J0c1VwLS07CisJCXBSUG9ydC0+UG9ydERvd24gPSBTS19UUlVFOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9ET1dOLCBQYXJhKTsKKwl9CisKKwlwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCA9IDA7CisJLyogcFJQb3J0LT5EYXRhUGFja2V0c1BlclRpbWVTbG90ID0gMDsgKi8KKwlwUlBvcnQtPkJwZHVQYWNrZXRzUGVyVGltZVNsb3QgPSAwOworCXBSUG9ydC0+QmNUaW1lU3RhbXAgPSAwOworCisJLyoKKwkgKiBSQTs6OzogVG8gYmUgY2hlY2tlZDoKKwkgKiAtIGFjdGlvbnMgYXQgUkxNVF9TVE9QOiBXZSBzaG91bGQgbm90IHN3aXRjaCBhbnltb3JlLgorCSAqLworCWlmIChwUlBvcnQtPk5ldC0+UmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfSU5JVCkgeworCQlpZiAoUGFyYS5QYXJhMzJbMF0gPT0KKwkJCXBSUG9ydC0+TmV0LT5Qb3J0W3BSUG9ydC0+TmV0LT5BY3RpdmVQb3J0XS0+UG9ydE51bWJlcikgeworCQkJLyogQWN0aXZlIFBvcnQgd2VudCBkb3duLiAqLworCQkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRET1dOKiBFdmVudCAoJWQpIEVORC5cbiIsIEV2ZW50KSkKK30JLyogU2tSbG10RXZ0UG9ydERvd25YICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dExpbmtEb3duIC0gTElOS19ET1dOCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBMSU5LX0RPV04gZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0TGlua0Rvd24oCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIFVuZGVmaW5lZCAqLworeworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfTElOS19ET1dOIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoIXBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5MaW5rRG93bikgeworCQlwUlBvcnQtPk5ldC0+TGlua3NVcC0tOworCQlwUlBvcnQtPkxpbmtEb3duID0gU0tfVFJVRTsKKwkJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0xJTktfRE9XTjsKKwkJU0tfSFdBQ19MSU5LX0xFRChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sIFNLX0xFRF9PRkYpOworCisJCWlmICgocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykgIT0gMCkgeworCQkJLyogQnVpbGQgdGhlIGNoZWNrIGNoYWluLiAqLworCQkJU2tSbG10QnVpbGRDaGVja0NoYWluKHBBQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCX0KKworCQkvKiBFbnN1cmUgdGhhdCBwb3J0IGlzIG1hcmtlZCBkb3duLiAqLworCQlQYXJhLlBhcmEzMlsxXSA9IC0xOworCQkodm9pZClTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9QT1JURE9XTiwgUGFyYSk7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX0xJTktfRE9XTiBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0TGlua0Rvd24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UG9ydEFkZHIgLSBQT1JUX0FERFIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBPUlRfQUREUiBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQb3J0QWRkcigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19VMzIJCQlpLCBqOworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCVNLX01BQ19BRERSCQkqcE9sZE1hY0FkZHI7CisJU0tfTUFDX0FERFIJCSpwTmV3TWFjQWRkcjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JUX0FERFIgUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JUX0FERFIgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIFBvcnQncyBwaHlzaWNhbCBNQUMgYWRkcmVzcyBjaGFuZ2VkLiAqLworCXBPbGRNYWNBZGRyID0gJnBBQy0+QWRkci5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5QcmV2aW91c01hY0FkZHJlc3M7CisJcE5ld01hY0FkZHIgPSAmcEFDLT5BZGRyLlBvcnRbUGFyYS5QYXJhMzJbMF1dLkN1cnJlbnRNYWNBZGRyZXNzOworCisJLyoKKwkgKiBOT1RFOiBUaGlzIGlzIG5vdCBzY2FsYWJsZSBmb3Igc29sdXRpb25zIHdoZXJlIHBvcnRzIGFyZQorCSAqCSBjaGVja2VkIHJlbW90ZWx5LiAgVGhlcmUsIHdlIG5lZWQgdG8gc2VuZCBhbiBSTE1UCisJICoJIGFkZHJlc3MgY2hhbmdlIHBhY2tldCAtIGFuZCBob3cgZG8gd2UgZW5zdXJlIGRlbGl2ZXJ5PworCSAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtpXTsKKwkJZm9yIChqID0gMDsgaiA8IHBSUG9ydC0+UG9ydHNDaGVja2VkOyBqKyspIHsKKwkJCWlmIChTS19BRERSX0VRVUFMKAorCQkJCXBSUG9ydC0+UG9ydENoZWNrW2pdLkNoZWNrQWRkci5hLCBwT2xkTWFjQWRkci0+YSkpIHsKKwkJCQlwUlBvcnQtPlBvcnRDaGVja1tqXS5DaGVja0FkZHIgPSAqcE5ld01hY0FkZHI7CisJCQl9CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRfQUREUiBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0UG9ydEFkZHIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U3RhcnQgLSBTVEFSVAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU1RBUlQgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U3RhcnQoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTI7CisJU0tfVTMyCQlQb3J0SWR4OworCVNLX1UzMgkJUG9ydE51bWJlcjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVEFSVCBOZXQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBUlQgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVJUIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfSU5JVCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVJUIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAocEFDLT5SbG10Lk5ldHNTdGFydGVkID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkFsbCBuZXRzIHNob3VsZCBoYXZlIGJlZW4gc3RhcnRlZC5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVJUIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUHJlZlBvcnQgPj0KKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHMpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMDksIFNLRVJSX1JMTVRfRTAwOV9NU0cpOworCisJCS8qIENoYW5nZSBQcmVmUG9ydCB0byBpbnRlcm5hbCBkZWZhdWx0LiAqLworCQlQYXJhMi5QYXJhMzJbMF0gPSAweEZGRkZGRkZGOworCQlQYXJhMi5QYXJhMzJbMV0gPSBQYXJhLlBhcmEzMlswXTsKKwkJKHZvaWQpU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFLCBQYXJhMik7CisJfQorCisJUG9ydElkeCA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlByZWZQb3J0OworCVBvcnROdW1iZXIgPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W1BvcnRJZHhdLT5Qb3J0TnVtYmVyOworCisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTGlua3NVcCA9IDA7CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydHNVcCA9IDA7CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uQ2hlY2tpbmdTdGF0ZSA9IDA7CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19ORVRfRE9XTjsKKworCS8qIFN0YXJ0IHByZWZlcnJlZCBwb3J0LiAqLworCVNrUmxtdFBvcnRTdGFydChwQUMsIElvQywgUG9ydE51bWJlcik7CisKKwkvKiBTdGFydCBUaW1lciAoZm9yIGZpcnN0IHBvcnQgb25seSkuICovCisJUGFyYTIuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlVwVGltZXIsCisJCVNLX1JMTVRfUE9SVFNUQVJUX1RJTV9WQUwsIFNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUU1RBUlRfVElNLCBQYXJhMik7CisKKwlwQUMtPlJsbXQuTmV0c1N0YXJ0ZWQrKzsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBUlQgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFN0YXJ0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFN0b3AgLSBTVE9QCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTVE9QIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFN0b3AoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTI7CisJU0tfVTMyCQlQb3J0TnVtYmVyOworCVNLX1UzMgkJaTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVE9QIE5ldCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVE9QIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVE9QIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdFN0YXRlID09IFNLX1JMTVRfUlNfSU5JVCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUT1AgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChwQUMtPlJsbXQuTmV0c1N0YXJ0ZWQgPT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBbGwgbmV0cyBhcmUgc3RvcHBlZC5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUT1AgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIFN0b3AgUkxNVCB0aW1lcnMuICovCisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Mb2NUaW1lcik7CisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5TZWdUaW1lcik7CisKKwkvKiBTdG9wIG5ldC4gKi8KKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10U3RhdGUgPSBTS19STE1UX1JTX0lOSVQ7CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJUGFyYTIuUGFyYTMyWzBdID0gU0tfUkxNVF9ORVRfRE9XTl9GSU5BTDsKKwlQYXJhMi5QYXJhMzJbMV0gPSBQYXJhLlBhcmEzMlswXTsJCQkvKiBOZXQjICovCisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9ORVRfRE9XTiwgUGFyYTIpOworCisJLyogU3RvcCBwb3J0cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHM7IGkrKykgeworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtpXS0+UG9ydE51bWJlcjsKKwkJaWYgKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnRTdGF0ZSAhPSBTS19STE1UX1BTX0lOSVQpIHsKKwkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uVXBUaW1lcik7CisJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLkRvd25SeFRpbWVyKTsKKwkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uRG93blR4VGltZXIpOworCisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0lOSVQ7CisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnRTdGFydGVkID0gU0tfRkFMU0U7CisJCQlQYXJhMi5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUT1AsIFBhcmEyKTsKKwkJfQorCX0KKworCXBBQy0+UmxtdC5OZXRzU3RhcnRlZC0tOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUT1AgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFN0b3AgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0VGltIC0gVElNCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBUSU0gZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0VGltKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisJU0tfVTMyCQkJVGltZW91dDsKKwlTS19VMzIJCQlOZXdUaW1lb3V0OworCVNLX1UzMgkJCVBvcnROdW1iZXI7CisJU0tfVTMyCQkJaTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9USU0gRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9USU0gRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmICgocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX09USEVSUykgPT0gMCB8fAorCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5MaW5rc1VwID09IDApIHsKKwkJLyogTW9kZSBjaGFuZ2VkIG9yIGFsbCBsaW5rcyBkb3duOiBObyBtb3JlIGxpbmsgY2hlY2tpbmcuICovCisJCXJldHVybjsKKwl9CisKKyNpZiAwCisJcEFDLT5SbG10LlN3aXRjaENoZWNrQ291bnRlci0tOworCWlmIChwQUMtPlJsbXQuU3dpdGNoQ2hlY2tDb3VudGVyID09IDApIHsKKwkJcEFDLT5SbG10LlN3aXRjaENoZWNrQ291bnRlcjsKKwl9CisjZW5kaWYJLyogMCAqLworCisJTmV3VGltZW91dCA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHM7IGkrKykgeworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtpXS0+UG9ydE51bWJlcjsKKwkJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdOworCQlpZiAoIXBSUG9ydC0+TGlua0Rvd24pIHsKKwkJCVRpbWVvdXQgPSBTa1JsbXRDaGVja1BvcnQocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCQkJaWYgKFRpbWVvdXQgPCBOZXdUaW1lb3V0KSB7CisJCQkJTmV3VGltZW91dCA9IFRpbWVvdXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGVzZSBjb3VudGVycyBzaG91bGQgYmUgc2V0IHRvIDAgZm9yIGFsbCBwb3J0cyBiZWZvcmUgdGhlCisJCQkgKiBmaXJzdCBmcmFtZSBpcyBzZW50IGluIHRoZSBuZXh0IGxvb3AuCisJCQkgKi8KKwkJCXBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90ID0gMDsKKwkJCS8qIHBSUG9ydC0+RGF0YVBhY2tldHNQZXJUaW1lU2xvdCA9IDA7ICovCisJCQlwUlBvcnQtPkJwZHVQYWNrZXRzUGVyVGltZVNsb3QgPSAwOworCQl9CisJfQorCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlRpbWVvdXRWYWx1ZSA9IE5ld1RpbWVvdXQ7CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTGlua3NVcCA+IDEpIHsKKwkJLyoKKwkJICogSWYgY2hlY2tpbmcgcmVtb3RlIHBvcnRzLCBhbHNvIHNlbmQgcGFja2V0cyBpZgorCQkgKiAgIChMaW5rc1VwID09IDEpICYmCisJCSAqICAgdGhpcyBwb3J0IGNoZWNrcyBhdCBsZWFzdCBvbmUgKHJlbW90ZSkgcG9ydC4KKwkJICovCisKKwkJLyoKKwkJICogTXVzdCBiZSBuZXcgbG9vcCwgYXMgU2tSbG10Q2hlY2tQb3J0IGNhbiByZXF1ZXN0IHRvCisJCSAqIGNoZWNrIHNlZ21lbnRhdGlvbiB3aGVuIGUuZy4gY2hlY2tpbmcgdGhlIGxhc3QgcG9ydC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0czsgaSsrKSB7CisJCQlpZiAoIXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbaV0tPkxpbmtEb3duKSB7CisJCQkJU2tSbG10U2VuZChwQUMsIElvQywKKwkJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtpXS0+UG9ydE51bWJlcik7CisJCQl9CisJCX0KKwl9CisKKwlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Mb2NUaW1lciwKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uVGltZW91dFZhbHVlLCBTS0dFX1JMTVQsIFNLX1JMTVRfVElNLAorCQlQYXJhKTsKKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5MaW5rc1VwID4gMSAmJgorCQkocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgJiYKKwkJKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1JDU19TVEFSVF9TRUcpKSB7CisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlNlZ1RpbWVyLAorCQkJU0tfUkxNVF9TRUdfVE9fVkFMLCBTS0dFX1JMTVQsIFNLX1JMTVRfU0VHX1RJTSwgUGFyYSk7CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUkNTX1NUQVJUX1NFRzsKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uQ2hlY2tpbmdTdGF0ZSB8PQorCQkJU0tfUkxNVF9SQ1NfU0VHIHwgU0tfUkxNVF9SQ1NfUkVQT1JUX1NFRzsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1RJTSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0VGltICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFNlZ1RpbSAtIFNFR19USU0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNFR19USU0gZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U2VnVGltKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisjaWZkZWYgeERFQlVHCisJaW50IGo7CisjZW5kaWYJLyogREVCVUcgKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TRUdfVElNIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VHX1RJTSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisjaWZkZWYgeERFQlVHCisJZm9yIChqID0gMDsgaiA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzOyBqKyspIHsKKwkJU0tfQUREUl9QT1JUCSpwQVBvcnQ7CisJCVNLX1UzMgkJCWs7CisJCVNLX1UxNgkJCSpJbkFkZHI7CisJCVNLX1U4CQkJSW5BZGRyOFs2XTsKKworCQlJbkFkZHIgPSAoU0tfVTE2ICopJkluQWRkcjhbMF07CisJCXBBUG9ydCA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbal0tPkFkZHJQb3J0OworCQlmb3IgKGsgPSAwOyBrIDwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQ7IGsrKykgeworCQkJLyogR2V0IGV4YWN0IG1hdGNoIGFkZHJlc3MgayBmcm9tIHBvcnQgai4gKi8KKwkJCVhNX0lOQUREUihJb0MsIHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbal0tPlBvcnROdW1iZXIsCisJCQkJWE1fRVhNKGspLCBJbkFkZHIpOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIk1DIGFkZHJlc3MgJWQgb24gUG9ydCAldTogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggLS0gICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4LlxuIiwKKwkJCQkJaywgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtqXS0+UG9ydE51bWJlciwKKwkJCQkJSW5BZGRyOFswXSwgSW5BZGRyOFsxXSwgSW5BZGRyOFsyXSwKKwkJCQkJSW5BZGRyOFszXSwgSW5BZGRyOFs0XSwgSW5BZGRyOFs1XSwKKwkJCQkJcEFQb3J0LT5FeGFjdFtrXS5hWzBdLCBwQVBvcnQtPkV4YWN0W2tdLmFbMV0sCisJCQkJCXBBUG9ydC0+RXhhY3Rba10uYVsyXSwgcEFQb3J0LT5FeGFjdFtrXS5hWzNdLAorCQkJCQlwQVBvcnQtPkV4YWN0W2tdLmFbNF0sIHBBUG9ydC0+RXhhY3Rba10uYVs1XSkpCisJCX0KKwl9CisjZW5kaWYJLyogeERFQlVHICovCisJCQkJCisJU2tSbG10Q2hlY2tTZWcocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdKTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VHX1RJTSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0U2VnVGltICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFBhY2tldFJ4IC0gUEFDS0VUX1JFQ0VJVkVECisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQQUNLRVRfUkVDRUlWRUQgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UGFja2V0UngoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19NQlVGICpwTWIgKi8KK3sKKwlTS19NQlVGCSpwTWI7CisJU0tfTUJVRgkqcE5leHRNYjsKKwlTS19VMzIJTmV0TnVtYmVyOworCisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BBQ0tFVF9SRUNFSVZFRCBFdmVudCBCRUdJTi5cbiIpKQorCisJLyogU2hvdWxkIHdlIGlnbm9yZSBmcmFtZXMgZHVyaW5nIHBvcnQgc3dpdGNoaW5nPyAqLworCisjaWZkZWYgREVCVUcKKwlwTWIgPSBQYXJhLnBQYXJhUHRyOworCWlmIChwTWIgPT0gTlVMTCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLCAoIk5vIG1idWYuXG4iKSkKKwl9CisJZWxzZSBpZiAocE1iLT5wTmV4dCAhPSBOVUxMKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIk1vcmUgdGhhbiBvbmUgbWJ1ZiBvciBwTWItPnBOZXh0IG5vdCBzZXQuXG4iKSkKKwl9CisjZW5kaWYJLyogREVCVUcgKi8KKworCWZvciAocE1iID0gUGFyYS5wUGFyYVB0cjsgcE1iICE9IE5VTEw7IHBNYiA9IHBOZXh0TWIpIHsKKwkJcE5leHRNYiA9IHBNYi0+cE5leHQ7CisJCXBNYi0+cE5leHQgPSBOVUxMOworCisJCU5ldE51bWJlciA9IHBBQy0+UmxtdC5Qb3J0W3BNYi0+UG9ydElkeF0uTmV0LT5OZXROdW1iZXI7CisJCWlmIChwQUMtPlJsbXQuTmV0W05ldE51bWJlcl0uUmxtdFN0YXRlID09IFNLX1JMTVRfUlNfSU5JVCkgeworCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCX0KKwkJZWxzZSB7CisJCQlTa1JsbXRQYWNrZXRSZWNlaXZlKHBBQywgSW9DLCBwTWIpOworCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BBQ0tFVF9SRUNFSVZFRCBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0UGFja2V0UnggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U3RhdHNDbGVhciAtIFNUQVRTX0NMRUFSCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTVEFUU19DTEVBUiBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTdGF0c0NsZWFyKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfVTMyCQkJaTsKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVEFUU19DTEVBUiBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVRTX0NMRUFSIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFUU19DTEVBUiBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogQ2xlYXIgc3RhdGlzdGljcyBmb3IgbG9naWNhbCBhbmQgcGh5c2ljYWwgcG9ydHMuICovCisJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzOyBpKyspIHsKKwkJcFJQb3J0ID0KKwkJCSZwQUMtPlJsbXQuUG9ydFtwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyXTsKKwkJcFJQb3J0LT5UeEhlbGxvQ3RzID0gMDsKKwkJcFJQb3J0LT5SeEhlbGxvQ3RzID0gMDsKKwkJcFJQb3J0LT5UeFNwSGVsbG9SZXFDdHMgPSAwOworCQlwUlBvcnQtPlJ4U3BIZWxsb0N0cyA9IDA7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUQVRTX0NMRUFSIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRTdGF0c0NsZWFyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFN0YXRzVXBkYXRlIC0gU1RBVFNfVVBEQVRFCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTVEFUU19VUERBVEUgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U3RhdHNVcGRhdGUoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RBVFNfVVBEQVRFIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBVFNfVVBEQVRFIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFUU19VUERBVEUgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSBzdGF0aXN0aWNzIC0gY3VycmVudGx5IGFsd2F5cyB1cC10by1kYXRlLiAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUQVRTX1VQREFURSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0U3RhdHNVcGRhdGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UHJlZnBvcnRDaGFuZ2UgLSBQUkVGUE9SVF9DSEFOR0UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBSRUZQT1JUX0NIQU5HRSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQcmVmcG9ydENoYW5nZSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0SW5kZXg7IFNLX1UzMiBOZXROdW1iZXIgKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFIHRvIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzFdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIDB4RkZGRkZGRkYgPT0gYXV0by1tb2RlLiAqLworCWlmIChQYXJhLlBhcmEzMlswXSA9PSAweEZGRkZGRkZGKSB7CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlByZWZQb3J0ID0gU0tfUkxNVF9ERUZfUFJFRl9QT1JUOworCX0KKwllbHNlIHsKKwkJaWYgKFBhcmEuUGFyYTMyWzBdID49IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLk51bVBvcnRzKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAxMCwgU0tFUlJfUkxNVF9FMDEwX01TRyk7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJTS19STE1UX1BSRUZQT1JUX0NIQU5HRSBFdmVudCBFTVBUWS5cbiIpKQorCQkJcmV0dXJuOworCQl9CisKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUHJlZlBvcnQgPSBQYXJhLlBhcmEzMlswXTsKKwl9CisKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5QcmVmZXJlbmNlID0gUGFyYS5QYXJhMzJbMF07CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfSU5JVCkgeworCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgUGFyYS5QYXJhMzJbMV0pOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFByZWZwb3J0Q2hhbmdlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFNldE5ldHMgLSBTRVRfTkVUUworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU0VUX05FVFMgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U2V0TmV0cygKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOdW1OZXRzOyBTS19VMzIgLTEgKi8KK3sKKwlpbnQgaTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPT0gMCB8fCBQYXJhLlBhcmEzMlswXSA+IFNLX01BWF9ORVRTIHx8CisJCVBhcmEuUGFyYTMyWzBdID4gKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIG51bWJlciBvZiBuZXRzOiAlZC5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID09IHBBQy0+UmxtdC5OdW1OZXRzKSB7CS8qIE5vIGNoYW5nZS4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogRW50ZXJpbmcgYW5kIGxlYXZpbmcgZHVhbCBtb2RlIG9ubHkgYWxsb3dlZCB3aGlsZSBuZXRzIGFyZSBzdG9wcGVkLiAqLworCWlmIChwQUMtPlJsbXQuTmV0c1N0YXJ0ZWQgPiAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkNoYW5naW5nIGR1YWwgbW9kZSBvbmx5IGFsbG93ZWQgd2hpbGUgYWxsIG5ldHMgYXJlIHN0b3BwZWQuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID09IDEpIHsKKwkJaWYgKHBBQy0+UmxtdC5OdW1OZXRzID4gMSkgeworCQkJLyogQ2xlYXIgbG9naWNhbCBNQUMgYWRkciBmcm9tIHNlY29uZCBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJCSh2b2lkKVNrQWRkck92ZXJyaWRlKHBBQywgSW9DLCBwQUMtPlJsbXQuTmV0WzFdLlBvcnRbcEFDLT5BZGRyLgorCQkJCU5ldFsxXS5BY3RpdmVQb3J0XS0+UG9ydE51bWJlciwgTlVMTCwgU0tfQUREUl9DTEVBUl9MT0dJQ0FMKTsKKwkJCXBBQy0+UmxtdC5OZXRbMV0uTnVtUG9ydHMgPSAwOworCQl9CisKKwkJcEFDLT5SbG10Lk51bU5ldHMgPSBQYXJhLlBhcmEzMlswXTsKKwkJZm9yIChpID0gMDsgKFNLX1UzMilpIDwgcEFDLT5SbG10Lk51bU5ldHM7IGkrKykgeworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10U3RhdGUgPSBTS19STE1UX1JTX0lOSVQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmZXJlbmNlID0gMHhGRkZGRkZGRjsJICAvKiAiQXV0b21hdGljIiAqLworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydCA9IFNLX1JMTVRfREVGX1BSRUZfUE9SVDsKKwkJCS8qIEp1c3QgYXNzdW1pbmcuICovCisJCQlwQUMtPlJsbXQuTmV0W2ldLkFjdGl2ZVBvcnQgPSBwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0OworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10TW9kZSA9IFNLX1JMTVRfREVGX01PREU7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlRpbWVvdXRWYWx1ZSA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uTmV0TnVtYmVyID0gaTsKKwkJfQorCisJCXBBQy0+UmxtdC5Qb3J0WzFdLk5ldD0gJnBBQy0+UmxtdC5OZXRbMF07CisJCXBBQy0+UmxtdC5OZXRbMF0uTnVtUG9ydHMgPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX1NFVF9ORVRTLCBQYXJhKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJSTE1UOiBDaGFuZ2VkIHRvIG9uZSBuZXQgd2l0aCB0d28gcG9ydHMuXG4iKSkKKwl9CisJZWxzZSBpZiAoUGFyYS5QYXJhMzJbMF0gPT0gMikgeworCQlwQUMtPlJsbXQuUG9ydFsxXS5OZXQ9ICZwQUMtPlJsbXQuTmV0WzFdOworCQlwQUMtPlJsbXQuTmV0WzFdLk51bVBvcnRzID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMTsKKwkJcEFDLT5SbG10Lk5ldFswXS5OdW1Qb3J0cyA9CisJCQlwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSBwQUMtPlJsbXQuTmV0WzFdLk51bVBvcnRzOworCQkKKwkJcEFDLT5SbG10Lk51bU5ldHMgPSBQYXJhLlBhcmEzMlswXTsKKwkJZm9yIChpID0gMDsgKFNLX1UzMilpIDwgcEFDLT5SbG10Lk51bU5ldHM7IGkrKykgeworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10U3RhdGUgPSBTS19STE1UX1JTX0lOSVQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmZXJlbmNlID0gMHhGRkZGRkZGRjsJICAvKiAiQXV0b21hdGljIiAqLworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydCA9IFNLX1JMTVRfREVGX1BSRUZfUE9SVDsKKwkJCS8qIEp1c3QgYXNzdW1pbmcuICovCisJCQlwQUMtPlJsbXQuTmV0W2ldLkFjdGl2ZVBvcnQgPSBwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0OworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10TW9kZSA9IFNLX1JMTVRfREVGX01PREU7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlRpbWVvdXRWYWx1ZSA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKworCQkJcEFDLT5SbG10Lk5ldFtpXS5OZXROdW1iZXIgPSBpOworCQl9CisKKwkJLyogU2V0IGxvZ2ljYWwgTUFDIGFkZHIgb24gc2Vjb25kIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQkodm9pZClTa0FkZHJPdmVycmlkZShwQUMsIElvQywgcEFDLT5SbG10Lk5ldFsxXS5Qb3J0W3BBQy0+QWRkci4KKwkJCU5ldFsxXS5BY3RpdmVQb3J0XS0+UG9ydE51bWJlciwgTlVMTCwgU0tfQUREUl9TRVRfTE9HSUNBTCk7CisKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX1NFVF9ORVRTLCBQYXJhKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJSTE1UOiBDaGFuZ2VkIHRvIHR3byBuZXRzIHdpdGggb25lIHBvcnQgZWFjaC5cbiIpKQorCX0KKwllbHNlIHsKKwkJLyogTm90IGltcGxlbWVudGVkIGZvciBtb3JlIHRoYW4gdHdvIG5ldHMuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNldE5ldHMgbm90IGltcGxlbWVudGVkIGZvciBtb3JlIHRoYW4gdHdvIG5ldHMuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRTZXROZXRzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dE1vZGVDaGFuZ2UgLSBNT0RFX0NIQU5HRQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgTU9ERV9DSEFOR0UgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0TW9kZUNoYW5nZSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXdNb2RlOyBTS19VMzIgTmV0TnVtYmVyICovCit7CisJU0tfRVZQQVJBCVBhcmEyOworCVNLX1UzMgkJaTsKKwlTS19VMzIJCVByZXZSbG10TW9kZTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9NT0RFX0NIQU5HRSBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlsxXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfTU9ERV9DSEFOR0UgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCVBhcmEuUGFyYTMyWzBdIHw9IFNLX1JMTVRfQ0hFQ0tfTElOSzsKKworCWlmICgocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uTnVtUG9ydHMgPT0gMSkgJiYKKwkJUGFyYS5QYXJhMzJbMF0gIT0gU0tfUkxNVF9NT0RFX0NMUykgeworCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSA9IFNLX1JMTVRfTU9ERV9DTFM7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkZvcmNlZCBSTE1UIG1vZGUgdG8gQ0xTIG9uIHNpbmdsZSBwb3J0IG5ldC5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX01PREVfQ0hBTkdFIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBVcGRhdGUgUkxNVCBtb2RlLiAqLworCVByZXZSbG10TW9kZSA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlOworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlID0gUGFyYS5QYXJhMzJbMF07CisKKwlpZiAoKFByZXZSbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspICE9CisJCShwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspKSB7CisJCS8qIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgYml0IGNoYW5nZWQuICovCisJCWlmICgoUHJldlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19PVEhFUlMpID09IDAgJiYKKwkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLk51bVBvcnRzID4gMSAmJgorCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydHNVcCA+PSAxKSB7CisJCQkvKiAyMDAwMTIwNyBSQTogV2FzICJQb3J0c1VwID09IDEiLiAqLworCQkJUGFyYTIuUGFyYTMyWzBdID0gUGFyYS5QYXJhMzJbMV07CisJCQlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uTG9jVGltZXIsCisJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uVGltZW91dFZhbHVlLAorCQkJCVNLR0VfUkxNVCwgU0tfUkxNVF9USU0sIFBhcmEyKTsKKwkJfQorCX0KKworCWlmICgoUHJldlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpICE9CisJCShwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSkgeworCQkvKiBTS19STE1UX0NIRUNLX1NFRyBiaXQgY2hhbmdlZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLk51bVBvcnRzOyBpKyspIHsKKwkJCSh2b2lkKVNrQWRkck1jQ2xlYXIocEFDLCBJb0MsCisJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+UG9ydE51bWJlciwKKwkJCQlTS19BRERSX1BFUk1BTkVOVCB8IFNLX01DX1NXX09OTFkpOworCisJCQkvKiBBZGQgUkxNVCBNQyBhZGRyZXNzLiAqLworCQkJKHZvaWQpU2tBZGRyTWNBZGQocEFDLCBJb0MsCisJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+UG9ydE51bWJlciwKKwkJCQkmU2tSbG10TWNBZGRyLCBTS19BRERSX1BFUk1BTkVOVCk7CisKKwkJCWlmICgocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgJgorCQkJCVNLX1JMTVRfQ0hFQ0tfU0VHKSAhPSAwKSB7CisJCQkJLyogQWRkIEJQRFUgTUMgYWRkcmVzcy4gKi8KKwkJCQkodm9pZClTa0FkZHJNY0FkZChwQUMsIElvQywKKwkJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+UG9ydE51bWJlciwKKwkJCQkJJkJyaWRnZU1jQWRkciwgU0tfQUREUl9QRVJNQU5FTlQpOworCisJCQkJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX0lOSVQpIHsKKwkJCQkJaWYgKCFwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5MaW5rRG93biAmJgorCQkJCQkJKFBhcmEyLnBQYXJhUHRyID0gU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQoCisJCQkJCQlwQUMsIElvQywgaSkpICE9IE5VTEwpIHsKKwkJCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPlJvb3RJZFNldCA9CisJCQkJCQkJU0tfRkFMU0U7CisJCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYTIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJKHZvaWQpU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsCisJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+UG9ydE51bWJlcik7CisJCX0JLyogZm9yIC4uLiAqLworCisJCWlmICgocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgIT0gMCkgeworCQkJUGFyYTIuUGFyYTMyWzBdID0gUGFyYS5QYXJhMzJbMV07CisJCQlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uU2VnVGltZXIsCisJCQkJU0tfUkxNVF9TRUdfVE9fVkFMLCBTS0dFX1JMTVQsIFNLX1JMTVRfU0VHX1RJTSwgUGFyYTIpOworCQl9CisJfQkvKiBTS19STE1UX0NIRUNLX1NFRyBiaXQgY2hhbmdlZC4gKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfTU9ERV9DSEFOR0UgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dE1vZGVDaGFuZ2UgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZlbnQgLSBhIFBPUlQtIG9yIGFuIFJMTVQtc3BlY2lmaWMgZXZlbnQgaGFwcGVuZWQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjYWxscyBzdWJyb3V0aW5lcyB0byBoYW5kbGUgUE9SVC0gYW5kIFJMTVQtc3BlY2lmaWMgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKgkwCisgKi8KK2ludAlTa1JsbXRFdmVudCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCQlFdmVudCwJLyogRXZlbnQgY29kZSAqLworU0tfRVZQQVJBCVBhcmEpCS8qIEV2ZW50LXNwZWNpZmljIHBhcmFtZXRlciAqLworeworCXN3aXRjaCAoRXZlbnQpIHsKKwkKKwkvKiAtLS0tLSBQT1JUIGV2ZW50cyAtLS0tLSAqLworCisJY2FzZSBTS19STE1UX1BPUlRTVEFSVF9USU06CS8qIEZyb20gUkxNVCB2aWEgVElNRS4gKi8KKwkJU2tSbG10RXZ0UG9ydFN0YXJ0VGltKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX0xJTktfVVA6CQkvKiBGcm9tIFNJUlEuICovCisJCVNrUmxtdEV2dExpbmtVcChwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9QT1JUVVBfVElNOgkvKiBGcm9tIFJMTVQgdmlhIFRJTUUuICovCisJCVNrUmxtdEV2dFBvcnRVcFRpbShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9QT1JURE9XTjoJCQkvKiBGcm9tIFJMTVQuICovCisJY2FzZSBTS19STE1UX1BPUlRET1dOX1JYX1RJTToJLyogRnJvbSBSTE1UIHZpYSBUSU1FLiAqLworCWNhc2UgU0tfUkxNVF9QT1JURE9XTl9UWF9USU06CS8qIEZyb20gUkxNVCB2aWEgVElNRS4gKi8KKwkJU2tSbG10RXZ0UG9ydERvd25YKHBBQywgSW9DLCBFdmVudCwgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9MSU5LX0RPV046CQkvKiBGcm9tIFNJUlEuICovCisJCVNrUmxtdEV2dExpbmtEb3duKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1BPUlRfQUREUjoJCS8qIEZyb20gQUREUi4gKi8KKwkJU2tSbG10RXZ0UG9ydEFkZHIocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKworCS8qIC0tLS0tIFJMTVQgZXZlbnRzIC0tLS0tICovCisKKwljYXNlIFNLX1JMTVRfU1RBUlQ6CQkvKiBGcm9tIERSVi4gKi8KKwkJU2tSbG10RXZ0U3RhcnQocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfU1RPUDoJCS8qIEZyb20gRFJWLiAqLworCQlTa1JsbXRFdnRTdG9wKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1RJTToJCS8qIEZyb20gUkxNVCB2aWEgVElNRS4gKi8KKwkJU2tSbG10RXZ0VGltKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1NFR19USU06CisJCVNrUmxtdEV2dFNlZ1RpbShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQ6CS8qIEZyb20gRFJWLiAqLworCQlTa1JsbXRFdnRQYWNrZXRSeChwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9TVEFUU19DTEVBUjoJLyogRnJvbSBQTk1JLiAqLworCQlTa1JsbXRFdnRTdGF0c0NsZWFyKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1NUQVRTX1VQREFURToJLyogRnJvbSBQTk1JLiAqLworCQlTa1JsbXRFdnRTdGF0c1VwZGF0ZShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0U6CS8qIEZyb20gUE5NSS4gKi8KKwkJU2tSbG10RXZ0UHJlZnBvcnRDaGFuZ2UocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfTU9ERV9DSEFOR0U6CS8qIEZyb20gUE5NSS4gKi8KKwkJU2tSbG10RXZ0TW9kZUNoYW5nZShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9TRVRfTkVUUzoJLyogRnJvbSBEUlYuICovCisJCVNrUmxtdEV2dFNldE5ldHMocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKworCS8qIC0tLS0tIFVua25vd24gZXZlbnRzIC0tLS0tICovCisKKwlkZWZhdWx0OgkvKiBDcmVhdGUgZXJyb3IgbG9nIGVudHJ5LiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJVbmtub3duIFJMTVQgRXZlbnQgJWQuXG4iLCBFdmVudCkpCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDAzLCBTS0VSUl9STE1UX0UwMDNfTVNHKTsKKwkJYnJlYWs7CisJfQkvKiBzd2l0Y2goKSAqLworCisJcmV0dXJuICgwKTsKK30JLyogU2tSbG10RXZlbnQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t0aW1lci5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0NjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t0aW1lci5jCkBAIC0wLDAgKzEsMjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t0aW1lci5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTQgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTM6NDY6NTEgJAorICogUHVycG9zZToJSGlnaCBsZXZlbCB0aW1lciBmdW5jdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICoJRXZlbnQgcXVldWUgYW5kIGRpc3BhdGNoZXIKKyAqLworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza3RpbWVyLmMsdiAxLjE0IDIwMDMvMDkvMTYgMTM6NDY6NTEgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sLSBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworI2lmZGVmIF9fQzJNQU5fXworLyoKKwlFdmVudCBxdWV1ZSBtYW5hZ2VtZW50LgorCisJR2VuZXJhbCBEZXNjcmlwdGlvbjoKKworICovCitpbnRybygpCit7fQorI2VuZGlmCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgdGltZXJfZG9uZShTS19BQyAqcEFDLFNLX0lPQyBJb2MsaW50IFJlc3RhcnQpOworCisKKy8qCisgKiBJbml0cyB0aGUgc29mdHdhcmUgdGltZXIKKyAqCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgZHVyaW5nIEluaXQgbGV2ZWwgMS4KKyAqLwordm9pZAlTa1RpbWVySW5pdCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jLAkJLyogSW9Db250ZXh0ICovCitpbnQJCUxldmVsKQkJLyogSW5pdCBMZXZlbCAqLworeworCXN3aXRjaCAoTGV2ZWwpIHsKKwljYXNlIFNLX0lOSVRfREFUQToKKwkJcEFDLT5UaW0uU3RRdWV1ZSA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgU0tfSU5JVF9JTzoKKwkJU2tId3RJbml0KHBBQywgSW9jKTsKKwkJU2tUaW1lckRvbmUocEFDLCBJb2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBTdG9wcyBhIGhpZ2ggbGV2ZWwgdGltZXIKKyAqIC0gSWYgYSB0aW1lciBpcyBub3QgaW4gdGhlIHF1ZXVlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vcm1hbGx5LCB0b28uCisgKi8KK3ZvaWQJU2tUaW1lclN0b3AoCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9jLAkJLyogSW9Db250ZXh0ICovCitTS19USU1FUgkqcFRpbWVyKQkvKiBUaW1lciBQb2ludGVyIHRvIGJlIHN0YXJ0ZWQgKi8KK3sKKwlTS19USU1FUgkqKnBwVGltUHJldjsKKwlTS19USU1FUgkqcFRtOworCisJLyoKKwkgKiByZW1vdmUgdGltZXIgZnJvbSBxdWV1ZQorCSAqLworCXBUaW1lci0+VG1BY3RpdmUgPSBTS19GQUxTRTsKKwkKKwlpZiAocEFDLT5UaW0uU3RRdWV1ZSA9PSBwVGltZXIgJiYgIXBUaW1lci0+VG1OZXh0KSB7CisJCVNrSHd0U3RvcChwQUMsIElvYyk7CisJfQorCQorCWZvciAocHBUaW1QcmV2ID0gJnBBQy0+VGltLlN0UXVldWU7IChwVG0gPSAqcHBUaW1QcmV2KTsKKwkJcHBUaW1QcmV2ID0gJnBUbS0+VG1OZXh0ICkgeworCQkKKwkJaWYgKHBUbSA9PSBwVGltZXIpIHsKKwkJCS8qCisJCQkgKiBUaW1lciBmb3VuZCBpbiBxdWV1ZQorCQkJICogLSBkZXF1ZXVlIGl0IGFuZAorCQkJICogLSBjb3JyZWN0IGRlbHRhIG9mIHRoZSBuZXh0IHRpbWVyCisJCQkgKi8KKwkJCSpwcFRpbVByZXYgPSBwVG0tPlRtTmV4dDsKKworCQkJaWYgKHBUbS0+VG1OZXh0KSB7CisJCQkJLyogY29ycmVjdCBkZWx0YSBvZiBuZXh0IHRpbWVyIGluIHF1ZXVlICovCisJCQkJcFRtLT5UbU5leHQtPlRtRGVsdGEgKz0gcFRtLT5UbURlbHRhOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKgorICogU3RhcnQgYSBoaWdoIGxldmVsIHNvZnR3YXJlIHRpbWVyCisgKi8KK3ZvaWQJU2tUaW1lclN0YXJ0KAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJCUlvYywJCS8qIElvQ29udGV4dCAqLworU0tfVElNRVIJKnBUaW1lciwJLyogVGltZXIgUG9pbnRlciB0byBiZSBzdGFydGVkICovCitTS19VMzIJCVRpbWUsCQkvKiBUaW1lIHZhbHVlICovCitTS19VMzIJCUNsYXNzLAkJLyogRXZlbnQgQ2xhc3MgZm9yIHRoaXMgdGltZXIgKi8KK1NLX1UzMgkJRXZlbnQsCQkvKiBFdmVudCBWYWx1ZSBmb3IgdGhpcyB0aW1lciAqLworU0tfRVZQQVJBCVBhcmEpCQkvKiBFdmVudCBQYXJhbWV0ZXIgZm9yIHRoaXMgdGltZXIgKi8KK3sKKwlTS19USU1FUgkqKnBwVGltUHJldjsKKwlTS19USU1FUgkqcFRtOworCVNLX1UzMgkJRGVsdGE7CisKKwlUaW1lIC89IDE2OwkJLyogaW5wdXQgaXMgdVMsIGNsb2NrIHRpY2tzIGFyZSAxNnVTICovCisJCisJaWYgKCFUaW1lKQorCQlUaW1lID0gMTsKKworCVNrVGltZXJTdG9wKHBBQywgSW9jLCBwVGltZXIpOworCisJcFRpbWVyLT5UbUNsYXNzID0gQ2xhc3M7CisJcFRpbWVyLT5UbUV2ZW50ID0gRXZlbnQ7CisJcFRpbWVyLT5UbVBhcmEgPSBQYXJhOworCXBUaW1lci0+VG1BY3RpdmUgPSBTS19UUlVFOworCisJaWYgKCFwQUMtPlRpbS5TdFF1ZXVlKSB7CisJCS8qIEZpcnN0IFRpbWVyIHRvIGJlIHN0YXJ0ZWQgKi8KKwkJcEFDLT5UaW0uU3RRdWV1ZSA9IHBUaW1lcjsKKwkJcFRpbWVyLT5UbU5leHQgPSBOVUxMOworCQlwVGltZXItPlRtRGVsdGEgPSBUaW1lOworCQkKKwkJU2tId3RTdGFydChwQUMsIElvYywgVGltZSk7CisJCQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiB0aW1lciBjb3JyZWN0aW9uCisJICovCisJdGltZXJfZG9uZShwQUMsIElvYywgMCk7CisKKwkvKgorCSAqIGZpbmQgcG9zaXRpb24gaW4gcXVldWUKKwkgKi8KKwlEZWx0YSA9IDA7CisJZm9yIChwcFRpbVByZXYgPSAmcEFDLT5UaW0uU3RRdWV1ZTsgKHBUbSA9ICpwcFRpbVByZXYpOworCQlwcFRpbVByZXYgPSAmcFRtLT5UbU5leHQgKSB7CisJCQorCQlpZiAoRGVsdGEgKyBwVG0tPlRtRGVsdGEgPiBUaW1lKSB7CisJCQkvKiBQb3NpdGlvbiBmb3VuZCAqLworCQkJLyogSGVyZSB0aGUgdGltZXIgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQuICovCisJCQlicmVhazsKKwkJfQorCQlEZWx0YSArPSBwVG0tPlRtRGVsdGE7CisJfQorCisJLyogaW5zZXJ0IGluIHF1ZXVlICovCisJKnBwVGltUHJldiA9IHBUaW1lcjsKKwlwVGltZXItPlRtTmV4dCA9IHBUbTsKKwlwVGltZXItPlRtRGVsdGEgPSBUaW1lIC0gRGVsdGE7CisKKwlpZiAocFRtKSB7CisJCS8qIFRoZXJlIGlzIGEgbmV4dCB0aW1lcgorCQkgKiAtPiBjb3JyZWN0IGl0cyBEZWx0YSB2YWx1ZS4KKwkJICovCisJCXBUbS0+VG1EZWx0YSAtPSBwVGltZXItPlRtRGVsdGE7CisJfQorCisJLyogcmVzdGFydCB3aXRoIGZpcnN0ICovCisJU2tId3RTdGFydChwQUMsIElvYywgcEFDLT5UaW0uU3RRdWV1ZS0+VG1EZWx0YSk7Cit9CisKKwordm9pZAlTa1RpbWVyRG9uZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkJLyogSW9Db250ZXh0ICovCit7CisJdGltZXJfZG9uZShwQUMsIElvYywgMSk7Cit9CisKKworc3RhdGljIHZvaWQJdGltZXJfZG9uZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jLAkJLyogSW9Db250ZXh0ICovCitpbnQJCVJlc3RhcnQpCS8qIERvIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgSGFyZHdhcmUgdGltZXIgPyAqLworeworCVNLX1UzMgkJRGVsdGE7CisJU0tfVElNRVIJKnBUbTsKKwlTS19USU1FUgkqcFRDb21wOwkvKiBUaW1lciBjb21wbGV0ZWQgbm93IG5vdyAqLworCVNLX1RJTUVSCSoqcHBMYXN0OwkvKiBOZXh0IGZpZWxkIG9mIExhc3QgdGltZXIgdG8gYmUgZGVxICovCisJaW50CQlEb25lID0gMDsKKworCURlbHRhID0gU2tId3RSZWFkKHBBQywgSW9jKTsKKwkKKwlwcExhc3QgPSAmcEFDLT5UaW0uU3RRdWV1ZTsKKwlwVG0gPSBwQUMtPlRpbS5TdFF1ZXVlOworCXdoaWxlIChwVG0gJiYgIURvbmUpIHsKKwkJaWYgKERlbHRhID49IHBUbS0+VG1EZWx0YSkgeworCQkJLyogVGltZXIgcmFuIG91dCAqLworCQkJcFRtLT5UbUFjdGl2ZSA9IFNLX0ZBTFNFOworCQkJRGVsdGEgLT0gcFRtLT5UbURlbHRhOworCQkJcHBMYXN0ID0gJnBUbS0+VG1OZXh0OworCQkJcFRtID0gcFRtLT5UbU5leHQ7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBmb3VuZCB0aGUgZmlyc3QgdGltZXIgdGhhdCBkaWQgbm90IHJ1biBvdXQgKi8KKwkJCXBUbS0+VG1EZWx0YSAtPSBEZWx0YTsKKwkJCURlbHRhID0gMDsKKwkJCURvbmUgPSAxOworCQl9CisJfQorCSpwcExhc3QgPSBOVUxMOworCS8qCisJICogcFRtIHBvaW50cyB0byB0aGUgZmlyc3QgVGltZXIgdGhhdCBkaWQgbm90IHJ1biBvdXQuCisJICogU3RRdWV1ZSBwb2ludHMgdG8gdGhlIGZpcnN0IFRpbWVyIHRoYXQgcnVuIG91dC4KKwkgKi8KKworCWZvciAoIHBUQ29tcCA9IHBBQy0+VGltLlN0UXVldWU7IHBUQ29tcDsgcFRDb21wID0gcFRDb21wLT5UbU5leHQpIHsKKwkJU2tFdmVudFF1ZXVlKHBBQyxwVENvbXAtPlRtQ2xhc3MsIHBUQ29tcC0+VG1FdmVudCwgcFRDb21wLT5UbVBhcmEpOworCX0KKworCS8qIFNldCBoZWFkIG9mIHRpbWVyIHF1ZXVlIHRvIHRoZSBmaXJzdCB0aW1lciB0aGF0IGRpZCBub3QgcnVuIG91dCAqLworCXBBQy0+VGltLlN0UXVldWUgPSBwVG07CisKKwlpZiAoUmVzdGFydCAmJiBwQUMtPlRpbS5TdFF1ZXVlKSB7CisJCS8qIFJlc3RhcnQgSFcgdGltZXIgKi8KKwkJU2tId3RTdGFydChwQUMsIElvYywgcEFDLT5UaW0uU3RRdWV1ZS0+VG1EZWx0YSk7CisJfQorfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za3ZwZC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3ZwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2M4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3ZwZC5jCkBAIC0wLDAgKzEsMTE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrdnBkLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wMS8xMyAxMDo0Mjo0NSAkCisgKiBQdXJwb3NlOglTaGFyZWQgc29mdHdhcmUgdG8gcmVhZCBhbmQgd3JpdGUgVlBEIGRhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVBsZWFzZSByZWZlciBza3ZwZC50eHQgZm9yIGluZm9tYXRpb24gaG93IHRvIGluY2x1ZGUgdGhpcyBtb2R1bGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSRJZDogc2t2cGQuYyx2IDEuMzcgMjAwMy8wMS8xMyAxMDo0Mjo0NSByc2NobWlkdCBFeHAgJCAoQykgU0siOworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2t0eXBlcy5oIgorI2luY2x1ZGUgImgvc2tkZWJ1Zy5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKworLyoKKyAqIFN0YXRpYyBmdW5jdGlvbnMKKyAqLworI2lmbmRlZiBTS19LUl9QUk9UTworc3RhdGljIFNLX1ZQRF9QQVJBCSp2cGRfZmluZF9wYXJhKAorCVNLX0FDCSpwQUMsCisJY29uc3QgY2hhcgkqa2V5LAorCVNLX1ZQRF9QQVJBICpwKTsKKyNlbHNlCS8qIFNLX0tSX1BST1RPICovCitzdGF0aWMgU0tfVlBEX1BBUkEJKnZwZF9maW5kX3BhcmEoKTsKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisvKgorICogd2FpdHMgZm9yIGEgY29tcGxldGlvbiBvZiBhIFZQRCB0cmFuc2ZlcgorICogVGhlIFZQRCB0cmFuc2ZlciBtdXN0IGNvbXBsZXRlIHdpdGhpbiBTS19USUNLU19QRVJfU0VDLzE2CisgKgorICogcmV0dXJucwkwOglzdWNjZXNzLCB0cmFuc2ZlciBjb21wbGV0ZXMKKyAqCQllcnJvcglleGl0KDkpIHdpdGggYSBlcnJvciBtZXNzYWdlCisgKi8KK3N0YXRpYyBpbnQgVnBkV2FpdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2ludAkJZXZlbnQpCS8qIGV2ZW50IHRvIHdhaXQgZm9yIChWUERfUkVBRCAvIFZQRF93cml0ZSkgY29tcGxldGlvbiovCit7CisJU0tfVTY0CXN0YXJ0X3RpbWU7CisJU0tfVTE2CXN0YXRlOworCisJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHdhaXQgZm9yICVzXG4iLCBldmVudD8iV3JpdGUiOiJSZWFkIikpOworCXN0YXJ0X3RpbWUgPSBTa09zR2V0VGltZShwQUMpOworCWRvIHsKKwkJaWYgKFNrT3NHZXRUaW1lKHBBQykgLSBzdGFydF90aW1lID4gU0tfVElDS1NfUEVSX1NFQykgeworCisJCQkvKiBCdWcgZml4IEFGOiBUaHUgTWFyIDI4IDIwMDIKKwkJCSAqIERvIG5vdCBjYWxsOiBWUERfU1RPUChwQUMsIElvQyk7CisJCQkgKiBBIHBlbmRpbmcgVlBEIHJlYWQgY3ljbGUgY2FuIG5vdCBiZSBhYm9ydGVkIGJ5IHdyaXRpbmcKKwkJCSAqIFZQRF9XUklURSB0byB0aGUgUENJX1ZQRF9BRFJfUkVHIChWUEQgYWRkcmVzcyByZWdpc3RlcikuCisJCQkgKiBBbHRob3VnaCB0aGUgd3JpdGUgdGhyZXNob2xkIGluIHRoZSBPVVItcmVnaXN0ZXIgcHJvdGVjdHMKKwkJCSAqIFZQRCByZWFkIG9ubHkgc3BhY2UgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiB0aGlzIGRvZXMgbm90CisJCQkgKiBwcm90ZWN0IGEgVlBEIHJlYWQgZnJvbSBiZWluZyBgY29udmVydGVkYCBpbnRvIGEgVlBEIHdyaXRlCisJCQkgKiBvcGVyYXRpb24gKG9uIHRoZSBmbHkpLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBWUERfU1RPUCB3b3VsZAorCQkJICogZGVsZXRlIFZQRCByZWFkIG9ubHkgZGF0YS4gSW4gY2FzZSBvZiBhbnkgcHJvYmxlbXMgd2l0aCB0aGUKKwkJCSAqIEkyQyBidXMgd2UgZXhpdCB0aGUgbG9vcCBoZXJlLiBUaGUgSTJDIHJlYWQgb3BlcmF0aW9uIGNhbgorCQkJICogbm90IGJlIGFib3J0ZWQgZXhjZXB0IGJ5IGEgcmVzZXQgKC0+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+bmFtZSApKTsKKwkJUkVHQSggQ1NSMTUgKSA9IDB4ODAwMDsgLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9IGVsc2UgeworCQlzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CisJCWludCBudW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OworCQlpbnQgaTsKKwkJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyCisJCSAqIGZpbHRlcmluZy4gKi8KKwkJbWVtc2V0KCBtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsCisJCQkJc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkgKTsKKwkJZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisJCQlSRUdBKCBDU1I4K2kgKSA9IG11bHRpY2FzdF90YWJsZVtpXTsKKwkJUkVHQSggQ1NSMTUgKSA9IDA7IC8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9CisKKwkvKgorCSAqIEFsd2F5cyBzZXQgQlNXUCBhZnRlciBhIFNUT1AgYXMgU1RPUCBwdXRzIGl0IGJhY2sgaW50bworCSAqIGxpdHRsZSBlbmRpYW4gbW9kZS4KKwkgKi8KKwlSRUdBKCBDU1IzICkgPSBDU1IzX0JTV1A7CisKKwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgcmVzZXQgQVJFRyB0byBDU1IwICovCisJUkVHQSggQ1NSMCApID0gQ1NSMF9JRE9OIHwgQ1NSMF9JTkVBIHwgQ1NSMF9TVFJUOworfQorCisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zbGFuY2VfZGV2OworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdW4zbGFuY2VfZGV2ID0gc3VuM2xhbmNlX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKHN1bjNsYW5jZV9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihzdW4zbGFuY2VfZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHN1bjNsYW5jZV9kZXYpOworI2lmZGVmIENPTkZJR19TVU4zCisJaW91bm1hcCgodm9pZCAqKXN1bjNsYW5jZV9kZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKwlmcmVlX25ldGRldihzdW4zbGFuY2VfZGV2KTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1ZGNkODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKQEAgLTAsMCArMSwxMzI0IEBACisvKiAkSWQ6IHN1bmJtYWMuYyx2IDEuMzAgMjAwMi8wMS8xNSAwNjo0ODo1NSBkYXZlbSBFeHAgJAorICogc3VuYm1hYy5jOiBEcml2ZXIgZm9yIFNwYXJjIEJpZ01BQyAxMDBiYXNlVCBldGhlcm5ldCBhZGFwdGVycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYXV4aW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAic3VuYm1hYy5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisgICAgICAgICJzdW5ibWFjLmM6djIuMCAyNC9Ob3YvMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworI3VuZGVmIERFQlVHX1BST0JFCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKworI2lmZGVmIERFQlVHX1BST0JFCisjZGVmaW5lIERQKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgRFAoeCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfVFgKKyNkZWZpbmUgRFRYKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgRFRYKHgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lSUQorI2RlZmluZSBESVJRKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgRElSUSh4KQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYmlnbWFjICpyb290X2JpZ21hY19kZXY7CisKKyNkZWZpbmUgREVGQVVMVF9KQU1TSVpFICAgIDQgLyogVG9lIGphbSAqLworCisjZGVmaW5lIFFFQ19SRVNFVF9UUklFUyAyMDAKKworc3RhdGljIGludCBxZWNfZ2xvYmFsX3Jlc2V0KHZvaWQgX19pb21lbSAqZ3JlZ3MpCit7CisJaW50IHRyaWVzID0gUUVDX1JFU0VUX1RSSUVTOworCisJc2J1c193cml0ZWwoR0xPQl9DVFJMX1JFU0VULCBncmVncyArIEdMT0JfQ1RSTCk7CisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJaWYgKHNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX0NUUkwpICYgR0xPQl9DVFJMX1JFU0VUKSB7CisJCQl1ZGVsYXkoMjApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICh0cmllcykKKwkJcmV0dXJuIDA7CisJcHJpbnRrKEtFUk5fRVJSICJCaWdNQUM6IENhbm5vdCByZXNldCB0aGUgUUVDLlxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBxZWNfaW5pdChzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwl2b2lkIF9faW9tZW0gKmdyZWdzID0gYnAtPmdyZWdzOworCXN0cnVjdCBzYnVzX2RldiAqcWVjX3NkZXYgPSBicC0+cWVjX3NkZXY7CisJdTggYnNpemVzID0gYnAtPmJpZ21hY19idXJzdHM7CisJdTMyIHJlZ3ZhbDsKKworCS8qIDY0Ynl0ZSBidXJzdHMgZG8gbm90IHdvcmsgYXQgdGhlIG1vbWVudCwgZG8KKwkgKiBub3QgZXZlbiB0cnkgdG8gZW5hYmxlIHRoZW0uICAtRGF2ZU0KKwkgKi8KKwlpZiAoYnNpemVzICYgRE1BX0JVUlNUMzIpCisJCXJlZ3ZhbCA9IEdMT0JfQ1RSTF9CMzI7CisJZWxzZQorCQlyZWd2YWwgPSBHTE9CX0NUUkxfQjE2OworCXNidXNfd3JpdGVsKHJlZ3ZhbCB8IEdMT0JfQ1RSTF9CTU9ERSwgZ3JlZ3MgKyBHTE9CX0NUUkwpOworCXNidXNfd3JpdGVsKEdMT0JfUFNJWkVfMjA0OCwgZ3JlZ3MgKyBHTE9CX1BTSVpFKTsKKworCS8qIEFsbCBvZiBtZW1zaXplIGlzIGdpdmVuIHRvIGJpZ21hYy4gKi8KKwlzYnVzX3dyaXRlbChxZWNfc2Rldi0+cmVnX2FkZHJzWzFdLnJlZ19zaXplLAorCQkgICAgZ3JlZ3MgKyBHTE9CX01TSVpFKTsKKworCS8qIEhhbGYgdG8gdGhlIHRyYW5zbWl0dGVyLCBoYWxmIHRvIHRoZSByZWNlaXZlci4gKi8KKwlzYnVzX3dyaXRlbChxZWNfc2Rldi0+cmVnX2FkZHJzWzFdLnJlZ19zaXplID4+IDEsCisJCSAgICBncmVncyArIEdMT0JfVFNJWkUpOworCXNidXNfd3JpdGVsKHFlY19zZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMSwKKwkJICAgIGdyZWdzICsgR0xPQl9SU0laRSk7Cit9CisKKyNkZWZpbmUgVFhfUkVTRVRfVFJJRVMgICAgIDMyCisjZGVmaW5lIFJYX1JFU0VUX1RSSUVTICAgICAzMgorCitzdGF0aWMgdm9pZCBiaWdtYWNfdHhfcmVzZXQodm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlpbnQgdHJpZXMgPSBUWF9SRVNFVF9UUklFUzsKKworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19UWENGRyk7CisKKwkvKiBUaGUgZmlmbyB0aHJlc2hvbGQgYml0IGlzIHJlYWQtb25seSBhbmQgZG9lcworCSAqIG5vdCBjbGVhci4gIC1EYXZlTQorCSAqLworCXdoaWxlICgoc2J1c19yZWFkbChicmVncyArIEJNQUNfVFhDRkcpICYgfihCSUdNQUNfVFhDRkdfRklGTykpICE9IDAgJiYKKwkgICAgICAgLS10cmllcyAhPSAwKQorCQl1ZGVsYXkoMjApOworCisJaWYgKCF0cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogVHJhbnNtaXR0ZXIgd2lsbCBub3QgcmVzZXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IHR4X2NmZyBpcyAlMDh4XG4iLAorCQkgICAgICAgc2J1c19yZWFkbChicmVncyArIEJNQUNfVFhDRkcpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY19yeF9yZXNldCh2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCWludCB0cmllcyA9IFJYX1JFU0VUX1RSSUVTOworCisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl3aGlsZSAoc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisKKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBSZWNlaXZlciB3aWxsIG5vdCByZXNldC5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogcnhfY2ZnIGlzICUwOHhcbiIsCisJCSAgICAgICBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRykpOworCX0KK30KKworLyogUmVzZXQgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlci4gKi8KK3N0YXRpYyB2b2lkIGJpZ21hY19zdG9wKHN0cnVjdCBiaWdtYWMgKmJwKQoreworCWJpZ21hY190eF9yZXNldChicC0+YnJlZ3MpOworCWJpZ21hY19yeF9yZXNldChicC0+YnJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfZ2V0X2NvdW50ZXJzKHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZicC0+ZW5ldF9zdGF0czsKKworCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JDUkNFQ1RSKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfUkNSQ0VDVFIpOworCisJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19VTkFMRUNUUik7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX1VOQUxFQ1RSKTsKKworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX0dMRUNUUik7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0dMRUNUUik7CisKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gc2J1c19yZWFkbChicmVncyArIEJNQUNfRVhDVFIpOworCisJc3RhdHMtPmNvbGxpc2lvbnMgKz0KKwkJKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX0VYQ1RSKSArCisJCSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19MVENUUikpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19FWENUUik7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0xUQ1RSKTsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX2NsZWFuX3JpbmdzKHN0cnVjdCBiaWdtYWMgKmJwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChicC0+cnhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShicC0+cnhfc2tic1tpXSk7CisJCQlicC0+cnhfc2tic1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGJwLT50eF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KGJwLT50eF9za2JzW2ldKTsKKwkJCWJwLT50eF9za2JzW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYmlnbWFjX2luaXRfcmluZ3Moc3RydWN0IGJpZ21hYyAqYnAsIGludCBmcm9tX2lycSkKK3sKKwlzdHJ1Y3QgYm1hY19pbml0X2Jsb2NrICpiYiA9IGJwLT5ibWFjX2Jsb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OworCWludCBpLCBnZnBfZmxhZ3MgPSBHRlBfS0VSTkVMOworCisJaWYgKGZyb21faXJxIHx8IGluX2ludGVycnVwdCgpKQorCQlnZnBfZmxhZ3MgPSBHRlBfQVRPTUlDOworCisJYnAtPnJ4X25ldyA9IGJwLT5yeF9vbGQgPSBicC0+dHhfbmV3ID0gYnAtPnR4X29sZCA9IDA7CisKKwkvKiBGcmVlIGFueSBza2lwcHkgYnVmcyBsZWZ0IGFyb3VuZCBpbiB0aGUgcmluZ3MuICovCisJYmlnbWFjX2NsZWFuX3JpbmdzKGJwKTsKKworCS8qIE5vdyBnZXQgbmV3IHNrYnVmcyBmb3IgdGhlIHJlY2VpdmUgcmluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBiaWdfbWFjX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgZ2ZwX2ZsYWdzKTsKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQlicC0+cnhfc2tic1tpXSA9IHNrYjsKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCisJCXNrYl9wdXQoc2tiLCBFVEhfRlJBTUVfTEVOKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCAzNCk7CisKKwkJYmItPmJlX3J4ZFtpXS5yeF9hZGRyID0KKwkJCXNidXNfbWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkJU0JVU19ETUFfRlJPTURFVklDRSk7CisJCWJiLT5iZV9yeGRbaV0ucnhfZmxhZ3MgPQorCQkJKFJYRF9PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gMzQpICYgUlhEX0xFTkdUSCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJYmItPmJlX3R4ZFtpXS50eF9mbGFncyA9IGJiLT5iZV90eGRbaV0udHhfYWRkciA9IDA7Cit9CisKKyNkZWZpbmUgTUdNVF9DTEtPTiAgKE1HTVRfUEFMX0lOVF9NRElPfE1HTVRfUEFMX0VYVF9NRElPfE1HTVRfUEFMX09FTkFCfE1HTVRfUEFMX0RDTE9DSykKKyNkZWZpbmUgTUdNVF9DTEtPRkYgKE1HTVRfUEFMX0lOVF9NRElPfE1HTVRfUEFMX0VYVF9NRElPfE1HTVRfUEFMX09FTkFCKQorCitzdGF0aWMgdm9pZCBpZGxlX3RyYW5zY2VpdmVyKHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaW50IGkgPSAyMDsKKworCXdoaWxlIChpLS0pIHsKKwkJc2J1c193cml0ZWwoTUdNVF9DTEtPRkYsIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfd3JpdGVsKE1HTVRfQ0xLT04sIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV90Y3ZyX2JpdChzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IGJpdCkKK3sKKwlpZiAoYnAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgeworCQliaXQgPSAoYml0ICYgMSkgPDwgMzsKKwkJc2J1c193cml0ZWwoYml0IHwgKE1HTVRfUEFMX09FTkFCIHwgTUdNVF9QQUxfRVhUX01ESU8pLAorCQkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfd3JpdGVsKGJpdCB8IE1HTVRfUEFMX09FTkFCIHwgTUdNVF9QQUxfRVhUX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl9IGVsc2UgaWYgKGJwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJYml0ID0gKGJpdCAmIDEpIDw8IDI7CisJCXNidXNfd3JpdGVsKGJpdCB8IE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfT0VOQUIsCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c193cml0ZWwoYml0IHwgTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9PRU5BQiB8IE1HTVRfUEFMX0RDTE9DSywKKwkJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAid3JpdGVfdGN2cl9iaXQ6IE5vIHRyYW5zY2VpdmVyIHR5cGUga25vd24hXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90Y3ZyX2JpdChzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChicC0+dGN2cl90eXBlID09IGludGVybmFsKSB7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0VYVF9NRElPLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9FWFRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywKKwkJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlyZXR2YWwgPSAoc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCkgJiBNR01UX1BBTF9JTlRfTURJTykgPj4gMzsKKwl9IGVsc2UgaWYgKGJwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8sIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlyZXR2YWwgPSAoc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCkgJiBNR01UX1BBTF9FWFRfTURJTykgPj4gMjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInJlYWRfdGN2cl9iaXQ6IE5vIHRyYW5zY2VpdmVyIHR5cGUga25vd24hXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCByZWFkX3RjdnJfYml0MihzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChicC0+dGN2cl90eXBlID09IGludGVybmFsKSB7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0VYVF9NRElPLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlyZXR2YWwgPSAoc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCkgJiBNR01UX1BBTF9JTlRfTURJTykgPj4gMzsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfRVhUX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJfSBlbHNlIGlmIChicC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlyZXR2YWwgPSAoc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCkgJiBNR01UX1BBTF9FWFRfTURJTykgPj4gMjsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWFkX3RjdnJfYml0MjogTm8gdHJhbnNjZWl2ZXIgdHlwZSBrbm93biFcbiIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBwdXRfdGN2cl9ieXRlKHN0cnVjdCBiaWdtYWMgKmJwLAorCQkJICB2b2lkIF9faW9tZW0gKnRyZWdzLAorCQkJICB1bnNpZ25lZCBpbnQgYnl0ZSkKK3sKKwlpbnQgc2hpZnQgPSA0OworCisJZG8geworCQl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsICgoYnl0ZSA+PiBzaGlmdCkgJiAxKSk7CisJCXNoaWZ0IC09IDE7CisJfSB3aGlsZSAoc2hpZnQgPj0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY190Y3ZyX3dyaXRlKHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKnRyZWdzLAorCQkJICAgICAgaW50IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWludCBzaGlmdDsKKworCXJlZyAmPSAweGZmOworCXZhbCAmPSAweGZmZmY7CisJc3dpdGNoKGJwLT50Y3ZyX3R5cGUpIHsKKwljYXNlIGludGVybmFsOgorCWNhc2UgZXh0ZXJuYWw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJiaWdtYWNfdGN2cl9yZWFkOiBXaG9vcHMsIG5vIGtub3duIHRyYW5zY2VpdmVyIHR5cGUuXG4iKTsKKwkJcmV0dXJuOworCX07CisKKwlpZGxlX3RyYW5zY2VpdmVyKHRyZWdzKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDApOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMSk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAwKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDEpOworCisJcHV0X3RjdnJfYnl0ZShicCwgdHJlZ3MsCisJCSAgICAgICgoYnAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgPworCQkgICAgICAgQklHTUFDX1BIWV9JTlRFUk5BTCA6IEJJR01BQ19QSFlfRVhURVJOQUwpKTsKKworCXB1dF90Y3ZyX2J5dGUoYnAsIHRyZWdzLCByZWcpOworCisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAxKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDApOworCisJc2hpZnQgPSAxNTsKKwlkbyB7CisJCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgKHZhbCA+PiBzaGlmdCkgJiAxKTsKKwkJc2hpZnQgLT0gMTsKKwl9IHdoaWxlIChzaGlmdCA+PSAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJpZ21hY190Y3ZyX3JlYWQoc3RydWN0IGJpZ21hYyAqYnAsCisJCQkJICAgICAgIHZvaWQgX19pb21lbSAqdHJlZ3MsCisJCQkJICAgICAgIGludCByZWcpCit7CisJdW5zaWduZWQgc2hvcnQgcmV0dmFsID0gMDsKKworCXJlZyAmPSAweGZmOworCXN3aXRjaChicC0+dGN2cl90eXBlKSB7CisJY2FzZSBpbnRlcm5hbDoKKwljYXNlIGV4dGVybmFsOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiYmlnbWFjX3RjdnJfcmVhZDogV2hvb3BzLCBubyBrbm93biB0cmFuc2NlaXZlciB0eXBlLlxuIik7CisJCXJldHVybiAweGZmZmY7CisJfTsKKworCWlkbGVfdHJhbnNjZWl2ZXIodHJlZ3MpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMCk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAxKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDEpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMCk7CisKKwlwdXRfdGN2cl9ieXRlKGJwLCB0cmVncywKKwkJICAgICAgKChicC0+dGN2cl90eXBlID09IGludGVybmFsKSA/CisJCSAgICAgICBCSUdNQUNfUEhZX0lOVEVSTkFMIDogQklHTUFDX1BIWV9FWFRFUk5BTCkpOworCisJcHV0X3RjdnJfYnl0ZShicCwgdHJlZ3MsIHJlZyk7CisKKwlpZiAoYnAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQlpbnQgc2hpZnQgPSAxNTsKKworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisKKwkJZG8geworCQkJaW50IHRtcDsKKworCQkJdG1wID0gcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKwkJCXJldHZhbCB8PSAoKHRtcCAmIDEpIDw8IHNoaWZ0KTsKKwkJCXNoaWZ0IC09IDE7CisJCX0gd2hpbGUgKHNoaWZ0ID49IDApOworCisJCSh2b2lkKSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisJfSBlbHNlIHsKKwkJaW50IHNoaWZ0ID0gMTU7CisKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKworCQlkbyB7CisJCQlpbnQgdG1wOworCisJCQl0bXAgPSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisJCQlyZXR2YWwgfD0gKCh0bXAgJiAxKSA8PCBzaGlmdCk7CisJCQlzaGlmdCAtPSAxOworCQl9IHdoaWxlIChzaGlmdCA+PSAwKTsKKworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfdGN2cl9pbml0KHN0cnVjdCBiaWdtYWMgKmJwKQoreworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBicC0+dHJlZ3M7CisJdTMyIG1wYWw7CisKKwlpZGxlX3RyYW5zY2VpdmVyKHRyZWdzKTsKKwlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX0VYVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLAorCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCisJLyogT25seSB0aGUgYml0IGZvciB0aGUgcHJlc2VudCB0cmFuc2NlaXZlciAoaW50ZXJuYWwgb3IKKwkgKiBleHRlcm5hbCkgd2lsbCBzdGljaywgc2V0IHRoZW0gYm90aCBhbmQgc2VlIHdoYXQgc3RheXMuCisJICovCisJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9FWFRfTURJTywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCXVkZWxheSgyMCk7CisKKwltcGFsID0gc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJaWYgKG1wYWwgJiBNR01UX1BBTF9FWFRfTURJTykgeworCQlicC0+dGN2cl90eXBlID0gZXh0ZXJuYWw7CisJCXNidXNfd3JpdGVsKH4oVENWUl9QQUxfRVhUTEJBQ0sgfCBUQ1ZSX1BBTF9NU0VOU0UgfCBUQ1ZSX1BBTF9MVEVOQUJMRSksCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX1RQQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9UUEFMKTsKKwl9IGVsc2UgaWYgKG1wYWwgJiBNR01UX1BBTF9JTlRfTURJTykgeworCQlicC0+dGN2cl90eXBlID0gaW50ZXJuYWw7CisJCXNidXNfd3JpdGVsKH4oVENWUl9QQUxfU0VSSUFMIHwgVENWUl9QQUxfRVhUTEJBQ0sgfAorCQkJICAgICAgVENWUl9QQUxfTVNFTlNFIHwgVENWUl9QQUxfTFRFTkFCTEUpLAorCQkJICAgIHRyZWdzICsgVENWUl9UUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfVFBBTCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IEFJRUVFLCBuZWl0aGVyIGludGVybmFsIG5vciAiCisJCSAgICAgICAiZXh0ZXJuYWwgTURJTyBhdmFpbGFibGUhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IG1nbXRfcGFsWyUwOHhdIHRjdnJfcGFsWyUwOHhdXG4iLAorCQkgICAgICAgc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCksCisJCSAgICAgICBzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9UUEFMKSk7CisJfQorfQorCitzdGF0aWMgaW50IGJpZ21hY19pbml0KHN0cnVjdCBiaWdtYWMgKiwgaW50KTsKKworc3RhdGljIGludCB0cnlfbmV4dF9wZXJtdXRhdGlvbihzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlpZiAoYnAtPnN3X2JtY3IgJiBCTUNSX1NQRUVEMTAwKSB7CisJCWludCB0aW1lb3V0OworCisJCS8qIFJlc2V0IHRoZSBQSFkuICovCisJCWJwLT5zd19ibWNyCT0gKEJNQ1JfSVNPTEFURSB8IEJNQ1JfUERPV04gfCBCTUNSX0xPT1BCQUNLKTsKKwkJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCQlicC0+c3dfYm1jcgk9IChCTUNSX1JFU0VUKTsKKwkJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCisJCXRpbWVvdXQgPSA2NDsKKwkJd2hpbGUgKC0tdGltZW91dCkgeworCQkJYnAtPnN3X2JtY3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCQkJaWYgKChicC0+c3dfYm1jciAmIEJNQ1JfUkVTRVQpID09IDApCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMjApOworCQl9CisJCWlmICh0aW1lb3V0ID09IDApCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQSFkgcmVzZXQgZmFpbGVkLlxuIiwgYnAtPmRldi0+bmFtZSk7CisKKwkJYnAtPnN3X2JtY3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCisJCS8qIE5vdyB3ZSB0cnkgMTBiYXNlVC4gKi8KKwkJYnAtPnN3X2JtY3IgJj0gfihCTUNSX1NQRUVEMTAwKTsKKwkJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSd2ZSB0cmllZCB0aGVtIGFsbC4gKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkYXRhOworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBicC0+dHJlZ3M7CisJaW50IHJlc3RhcnRfdGltZXIgPSAwOworCisJYnAtPnRpbWVyX3RpY2tzKys7CisJaWYgKGJwLT50aW1lcl9zdGF0ZSA9PSBsdHJ5d2FpdCkgeworCQlicC0+c3dfYm1zciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1TUik7CisJCWJwLT5zd19ibWNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKwkJaWYgKGJwLT5zd19ibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyBub3cgdXAgYXQgJXMuXG4iLAorCQkJICAgICAgIGJwLT5kZXYtPm5hbWUsCisJCQkgICAgICAgKGJwLT5zd19ibWNyICYgQk1DUl9TUEVFRDEwMCkgPworCQkJICAgICAgICIxMDBiYXNlVCIgOiAiMTBiYXNlVCIpOworCQkJYnAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCQkJcmVzdGFydF90aW1lciA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoYnAtPnRpbWVyX3RpY2tzID49IDQpIHsKKwkJCQlpbnQgcmV0OworCisJCQkJcmV0ID0gdHJ5X25leHRfcGVybXV0YXRpb24oYnAsIHRyZWdzKTsKKwkJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IExpbmsgZG93biwgY2FibGUgcHJvYmxlbT9cbiIsCisJCQkJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwkJCQkJcmV0ID0gYmlnbWFjX2luaXQoYnAsIDApOworCQkJCQlpZiAocmV0KSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciwgY2Fubm90IHJlLWluaXQgdGhlICIKKwkJCQkJCSAgICAgICAiQmlnTUFDLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlicC0+dGltZXJfdGlja3MgPSAwOworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIENhbid0IGhhcHBlbnMuLi4uICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFpZWVlLCBsaW5rIHRpbWVyIGlzIGFzbGVlcCBidXQgd2UgZ290IG9uZSBhbnl3YXlzIVxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQlyZXN0YXJ0X3RpbWVyID0gMDsKKwkJYnAtPnRpbWVyX3RpY2tzID0gMDsKKwkJYnAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOyAvKiBmb28gb24geW91ICovCisJfQorCisJaWYgKHJlc3RhcnRfdGltZXIgIT0gMCkgeworCQlicC0+YmlnbWFjX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKCgxMiAqIEhaKS8xMCk7IC8qIDEuMiBzZWMuICovCisJCWFkZF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7CisJfQorfQorCisvKiBXZWxsLCByZWFsbHkgd2UganVzdCBmb3JjZSB0aGUgY2hpcCBpbnRvIDEwMGJhc2VUIHRoZW4KKyAqIDEwYmFzZVQsIGVhY2ggdGltZSBjaGVja2luZyBmb3IgYSBsaW5rIHN0YXR1cy4KKyAqLworc3RhdGljIHZvaWQgYmlnbWFjX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oc3RydWN0IGJpZ21hYyAqYnApCit7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGJwLT50cmVnczsKKwlpbnQgdGltZW91dDsKKworCS8qIEdyYWIgbmV3IHNvZnR3YXJlIGNvcGllcyBvZiBQSFkgcmVnaXN0ZXJzLiAqLworCWJwLT5zd19ibXNyCT0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTVNSKTsKKwlicC0+c3dfYm1jcgk9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisKKwkvKiBSZXNldCB0aGUgUEhZLiAqLworCWJwLT5zd19ibWNyCT0gKEJNQ1JfSVNPTEFURSB8IEJNQ1JfUERPV04gfCBCTUNSX0xPT1BCQUNLKTsKKwliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisJYnAtPnN3X2JtY3IJPSAoQk1DUl9SRVNFVCk7CisJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCisJdGltZW91dCA9IDY0OworCXdoaWxlICgtLXRpbWVvdXQpIHsKKwkJYnAtPnN3X2JtY3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCQlpZiAoKGJwLT5zd19ibWNyICYgQk1DUl9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwlpZiAodGltZW91dCA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQSFkgcmVzZXQgZmFpbGVkLlxuIiwgYnAtPmRldi0+bmFtZSk7CisKKwlicC0+c3dfYm1jciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisKKwkvKiBGaXJzdCB3ZSB0cnkgMTAwYmFzZVQuICovCisJYnAtPnN3X2JtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKwliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisKKwlicC0+dGltZXJfc3RhdGUgPSBsdHJ5d2FpdDsKKwlicC0+dGltZXJfdGlja3MgPSAwOworCWJwLT5iaWdtYWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoMTIgKiBIWikgLyAxMDsKKwlicC0+YmlnbWFjX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYnA7CisJYnAtPmJpZ21hY190aW1lci5mdW5jdGlvbiA9ICZiaWdtYWNfdGltZXI7CisJYWRkX3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKK30KKworc3RhdGljIGludCBiaWdtYWNfaW5pdChzdHJ1Y3QgYmlnbWFjICpicCwgaW50IGZyb21faXJxKQoreworCXZvaWQgX19pb21lbSAqZ3JlZ3MgICAgICAgID0gYnAtPmdyZWdzOworCXZvaWQgX19pb21lbSAqY3JlZ3MgICAgICAgID0gYnAtPmNyZWc7CisJdm9pZCBfX2lvbWVtICpicmVncyAgICAgICAgPSBicC0+YnJlZ3M7CisJdW5zaWduZWQgY2hhciAqZSA9ICZicC0+ZGV2LT5kZXZfYWRkclswXTsKKworCS8qIExhdGNoIGN1cnJlbnQgY291bnRlcnMgaW50byBzdGF0aXN0aWNzLiAqLworCWJpZ21hY19nZXRfY291bnRlcnMoYnAsIGJyZWdzKTsKKworCS8qIFJlc2V0IFFFQy4gKi8KKwlxZWNfZ2xvYmFsX3Jlc2V0KGdyZWdzKTsKKworCS8qIEluaXQgUUVDLiAqLworCXFlY19pbml0KGJwKTsKKworCS8qIEFsbG9jIGFuZCByZXNldCB0aGUgdHgvcnggZGVzY3JpcHRvciBjaGFpbnMuICovCisJYmlnbWFjX2luaXRfcmluZ3MoYnAsIGZyb21faXJxKTsKKworCS8qIEluaXRpYWxpemUgdGhlIFBIWS4gKi8KKwliaWdtYWNfdGN2cl9pbml0KGJwKTsKKworCS8qIFN0b3AgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLiAqLworCWJpZ21hY19zdG9wKGJwKTsKKworCS8qIFNldCBoYXJkd2FyZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCXNidXNfd3JpdGVsKCgoZVs0XSA8PCA4KSB8IGVbNV0pLCBicmVncyArIEJNQUNfTUFDQUREUjIpOworCXNidXNfd3JpdGVsKCgoZVsyXSA8PCA4KSB8IGVbM10pLCBicmVncyArIEJNQUNfTUFDQUREUjEpOworCXNidXNfd3JpdGVsKCgoZVswXSA8PCA4KSB8IGVbMV0pLCBicmVncyArIEJNQUNfTUFDQUREUjApOworCisJLyogQ2xlYXIgdGhlIGhhc2ggdGFibGUgdW50aWwgbWMgdXBsb2FkIG9jY3Vycy4gKi8KKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfSFRBQkxFMyk7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19IVEFCTEUxKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfSFRBQkxFMCk7CisKKwkvKiBFbmFibGUgQmlnIE1hYyBoYXNoIHRhYmxlIGZpbHRlci4gKi8KKwlzYnVzX3dyaXRlbChCSUdNQUNfUlhDRkdfSEVOQUJMRSB8IEJJR01BQ19SWENGR19GSUZPLAorCQkgICAgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl1ZGVsYXkoMjApOworCisJLyogT2ssIGNvbmZpZ3VyZSB0aGUgQmlnIE1hYyB0cmFuc21pdHRlci4gKi8KKwlzYnVzX3dyaXRlbChCSUdNQUNfVFhDRkdfRklGTywgYnJlZ3MgKyBCTUFDX1RYQ0ZHKTsKKworCS8qIFRoZSBITUUgZG9jcyByZWNvbW1lbmQgdG8gdXNlIHRoZSAxMExTQiBvZiBvdXIgTUFDIGhlcmUuICovCisJc2J1c193cml0ZWwoKChlWzVdIHwgZVs0XSA8PCA4KSAmIDB4M2ZmKSwKKwkJICAgIGJyZWdzICsgQk1BQ19SU0VFRCk7CisKKwkvKiBFbmFibGUgdGhlIG91dHB1dCBkcml2ZXJzIG5vIG1hdHRlciB3aGF0LiAqLworCXNidXNfd3JpdGVsKEJJR01BQ19YQ0ZHX09ERU5BQkxFIHwgQklHTUFDX1hDRkdfUkVTViwKKwkJICAgIGJyZWdzICsgQk1BQ19YSUZDRkcpOworCisJLyogVGVsbCB0aGUgUUVDIHdoZXJlIHRoZSByaW5nIGRlc2NyaXB0b3JzIGFyZS4gKi8KKwlzYnVzX3dyaXRlbChicC0+YmJsb2NrX2R2bWEgKyBiaWJfb2Zmc2V0KGJlX3J4ZCwgMCksCisJCSAgICBjcmVncyArIENSRUdfUlhEUyk7CisJc2J1c193cml0ZWwoYnAtPmJibG9ja19kdm1hICsgYmliX29mZnNldChiZV90eGQsIDApLAorCQkgICAgY3JlZ3MgKyBDUkVHX1RYRFMpOworCisJLyogU2V0dXAgdGhlIEZJRk8gcG9pbnRlcnMgaW50byBRRUMgbG9jYWwgbWVtb3J5LiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19SWFJCVUZQVFIpOworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19SWFdCVUZQVFIpOworCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX1JTSVpFKSwKKwkJICAgIGNyZWdzICsgQ1JFR19UWFJCVUZQVFIpOworCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX1JTSVpFKSwKKwkJICAgIGNyZWdzICsgQ1JFR19UWFdCVUZQVFIpOworCisJLyogVGVsbCBiaWdtYWMgd2hhdCBpbnRlcnJ1cHRzIHdlIGRvbid0IHdhbnQgdG8gaGVhciBhYm91dC4gKi8KKwlzYnVzX3dyaXRlbChCSUdNQUNfSU1BU0tfR09URlJBTUUgfCBCSUdNQUNfSU1BU0tfU0VOVEZSQU1FLAorCQkgICAgYnJlZ3MgKyBCTUFDX0lNQVNLKTsKKworCS8qIEVuYWJsZSB0aGUgdmFyaW91cyBvdGhlciBpcnEncy4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUklNQVNLKTsKKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfVElNQVNLKTsKKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUU1BU0spOworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19CTUFTSyk7CisKKwkvKiBTZXQgamFtIHNpemUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQuICovCisJc2J1c193cml0ZWwoREVGQVVMVF9KQU1TSVpFLCBicmVncyArIEJNQUNfSlNJWkUpOworCisJLyogQ2xlYXIgY29sbGlzaW9uIGNvdW50ZXIuICovCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX0NDTlQpOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlci4gKi8KKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19UWENGRykgfCBCSUdNQUNfVFhDRkdfRU5BQkxFLAorCQkgICAgYnJlZ3MgKyBCTUFDX1RYQ0ZHKTsKKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRykgfCBCSUdNQUNfUlhDRkdfRU5BQkxFLAorCQkgICAgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKworCS8qIE9rLCBzdGFydCBkZXRlY3RpbmcgbGluayBzcGVlZC9kdXBsZXguICovCisJYmlnbWFjX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oYnApOworCisJLyogU3VjY2Vzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogRXJyb3IgaW50ZXJydXB0cyBnZXQgc2VudCBoZXJlLiAqLworc3RhdGljIHZvaWQgYmlnbWFjX2lzX21lZGl1bV9yYXJlKHN0cnVjdCBiaWdtYWMgKmJwLCB1MzIgcWVjX3N0YXR1cywgdTMyIGJtYWNfc3RhdHVzKQoreworCXByaW50ayhLRVJOX0VSUiAiYmlnbWFjX2lzX21lZGl1bV9yYXJlOiAiKTsKKwlpZiAocWVjX3N0YXR1cyAmIChHTE9CX1NUQVRfRVIgfCBHTE9CX1NUQVRfQk0pKSB7CisJCWlmIChxZWNfc3RhdHVzICYgR0xPQl9TVEFUX0VSKQorCQkJcHJpbnRrKCJRRUNfRVJST1IsICIpOworCQlpZiAocWVjX3N0YXR1cyAmIEdMT0JfU1RBVF9CTSkKKwkJCXByaW50aygiUUVDX0JNQUNfRVJST1IsICIpOworCX0KKwlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfRVJST1JTKSB7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9CRVJST1IpCisJCQlwcmludGsoIkJNQUNfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfVFhERVJST1IpCisJCQlwcmludGsoIlRYRF9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9UWExFUlIpCisJCQlwcmludGsoIlRYX0xBVEVfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfVFhQRVJSKQorCQkJcHJpbnRrKCJUWF9QQVJJVFlfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfVFhTRVJSKQorCQkJcHJpbnRrKCJUWF9TQlVTX0VSUk9SLCAiKTsKKworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhEUk9QKQorCQkJcHJpbnRrKCJSWF9EUk9QX0VSUk9SLCAiKTsKKworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhTTUFMTCkKKwkJCXByaW50aygiUlhfU01BTExfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhMRVJSKQorCQkJcHJpbnRrKCJSWF9MQVRFX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYUEVSUikKKwkJCXByaW50aygiUlhfUEFSSVRZX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYU0VSUikKKwkJCXByaW50aygiUlhfU0JVU19FUlJPUiwgIik7CisJfQorCisJcHJpbnRrKCIgUkVTRVRcbiIpOworCWJpZ21hY19pbml0KGJwLCAxKTsKK30KKworLyogQmlnTUFDIHRyYW5zbWl0IGNvbXBsZXRlIHNlcnZpY2Ugcm91dGluZXMuICovCitzdGF0aWMgdm9pZCBiaWdtYWNfdHgoc3RydWN0IGJpZ21hYyAqYnApCit7CisJc3RydWN0IGJlX3R4ZCAqdHhiYXNlID0gJmJwLT5ibWFjX2Jsb2NrLT5iZV90eGRbMF07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CisJaW50IGVsZW07CisKKwlzcGluX2xvY2soJmJwLT5sb2NrKTsKKworCWVsZW0gPSBicC0+dHhfb2xkOworCURUWCgoImJpZ21hY190eDogdHhfb2xkWyVkXSAiLCBlbGVtKSk7CisJd2hpbGUgKGVsZW0gIT0gYnAtPnR4X25ldykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgYmVfdHhkICp0aGlzID0gJnR4YmFzZVtlbGVtXTsKKworCQlEVFgoKCJ0aGlzKCVwKSBbZmxhZ3MoJTA4eClhZGRyKCUwOHgpXSIsCisJCSAgICAgdGhpcywgdGhpcy0+dHhfZmxhZ3MsIHRoaXMtPnR4X2FkZHIpKTsKKworCQlpZiAodGhpcy0+dHhfZmxhZ3MgJiBUWERfT1dOKQorCQkJYnJlYWs7CisJCXNrYiA9IGJwLT50eF9za2JzW2VsZW1dOworCQlicC0+ZW5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWJwLT5lbmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlzYnVzX3VubWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsCisJCQkJICB0aGlzLT50eF9hZGRyLCBza2ItPmxlbiwKKwkJCQkgIFNCVVNfRE1BX1RPREVWSUNFKTsKKworCQlEVFgoKCJza2IoJXApICIsIHNrYikpOworCQlicC0+dHhfc2tic1tlbGVtXSA9IE5VTEw7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisKKwkJZWxlbSA9IE5FWFRfVFgoZWxlbSk7CisJfQorCURUWCgoIiBET05FLCB0eF9vbGQ9JWRcbiIsIGVsZW0pKTsKKwlicC0+dHhfb2xkID0gZWxlbTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwoYnApID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShicC0+ZGV2KTsKKworCXNwaW5fdW5sb2NrKCZicC0+bG9jayk7Cit9CisKKy8qIEJpZ01BQyByZWNlaXZlIGNvbXBsZXRlIHNlcnZpY2Ugcm91dGluZXMuICovCitzdGF0aWMgdm9pZCBiaWdtYWNfcngoc3RydWN0IGJpZ21hYyAqYnApCit7CisJc3RydWN0IGJlX3J4ZCAqcnhiYXNlID0gJmJwLT5ibWFjX2Jsb2NrLT5iZV9yeGRbMF07CisJc3RydWN0IGJlX3J4ZCAqdGhpczsKKwlpbnQgZWxlbSA9IGJwLT5yeF9uZXcsIGRyb3BzID0gMDsKKwl1MzIgZmxhZ3M7CisKKwl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl3aGlsZSAoISgoZmxhZ3MgPSB0aGlzLT5yeF9mbGFncykgJiBSWERfT1dOKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgbGVuID0gKGZsYWdzICYgUlhEX0xFTkdUSCk7IC8qIEZDUyBub3QgaW5jbHVkZWQgKi8KKworCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLworCQlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJCWJwLT5lbmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQkJYnAtPmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCisJZHJvcF9pdDoKKwkJCS8qIFJldHVybiBpdCB0byB0aGUgQmlnTUFDLiAqLworCQkJYnAtPmVuZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJdGhpcy0+cnhfZmxhZ3MgPQorCQkJCShSWERfT1dOIHwgKChSWF9CVUZfQUxMT0NfU0laRSAtIDM0KSAmIFJYRF9MRU5HVEgpKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlza2IgPSBicC0+cnhfc2tic1tlbGVtXTsKKwkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKworCQkJLyogTm93IHJlZmlsbCB0aGUgZW50cnksIGlmIHdlIGNhbi4gKi8KKwkJCW5ld19za2IgPSBiaWdfbWFjX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQlzYnVzX3VubWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsCisJCQkJCSAgdGhpcy0+cnhfYWRkciwKKwkJCQkJICBSWF9CVUZfQUxMT0NfU0laRSAtIDM0LAorCQkJCQkgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJYnAtPnJ4X3NrYnNbZWxlbV0gPSBuZXdfc2tiOworCQkJbmV3X3NrYi0+ZGV2ID0gYnAtPmRldjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgRVRIX0ZSQU1FX0xFTik7CisJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAzNCk7CisJCQl0aGlzLT5yeF9hZGRyID0gc2J1c19tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2RldiwKKwkJCQkJCQluZXdfc2tiLT5kYXRhLAorCQkJCQkJCVJYX0JVRl9BTExPQ19TSVpFIC0gMzQsCisJCQkJCQkJU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQl0aGlzLT5yeF9mbGFncyA9CisJCQkJKFJYRF9PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gMzQpICYgUlhEX0xFTkdUSCkpOworCisJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpjb3B5X3NrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisKKwkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQljb3B5X3NrYi0+ZGV2ID0gYnAtPmRldjsKKwkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKKwkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGJwLT5iaWdtYWNfc2RldiwKKwkJCQkJCSAgICAgdGhpcy0+cnhfYWRkciwgbGVuLAorCQkJCQkJICAgICBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0oY29weV9za2IsICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhLCBsZW4sIDApOworCQkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShicC0+YmlnbWFjX3NkZXYsCisJCQkJCQkJdGhpcy0+cnhfYWRkciwgbGVuLAorCQkJCQkJCVNCVVNfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBSZXVzZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KKwkJCXRoaXMtPnJ4X2ZsYWdzID0KKwkJCQkoUlhEX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCkgJiBSWERfTEVOR1RIKSk7CisKKwkJCXNrYiA9IGNvcHlfc2tiOworCQl9CisKKwkJLyogTm8gY2hlY2tzdW1zIGRvbmUgYnkgdGhlIEJpZ01BQyA7LSggKi8KKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWJwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlicC0+ZW5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCWJwLT5lbmV0X3N0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwluZXh0OgorCQllbGVtID0gTkVYVF9SWChlbGVtKTsKKwkJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJfQorCWJwLT5yeF9uZXcgPSBlbGVtOworCWlmIChkcm9wcykKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLCBicC0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJpZ21hY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldl9pZDsKKwl1MzIgcWVjX3N0YXR1cywgYm1hY19zdGF0dXM7CisKKwlESVJRKCgiYmlnbWFjX2ludGVycnVwdDogIikpOworCisJLyogTGF0Y2ggc3RhdHVzIHJlZ2lzdGVycyBub3cuICovCisJYm1hY19zdGF0dXMgPSBzYnVzX3JlYWRsKGJwLT5jcmVnICsgQ1JFR19TVEFUKTsKKwlxZWNfc3RhdHVzID0gc2J1c19yZWFkbChicC0+Z3JlZ3MgKyBHTE9CX1NUQVQpOworCisJRElSUSgoInFlY19zdGF0dXM9JTA4eCBibWFjX3N0YXR1cz0lMDh4XG4iLCBxZWNfc3RhdHVzLCBibWFjX3N0YXR1cykpOworCWlmICgocWVjX3N0YXR1cyAmIChHTE9CX1NUQVRfRVIgfCBHTE9CX1NUQVRfQk0pKSB8fAorCSAgIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9FUlJPUlMpKQorCQliaWdtYWNfaXNfbWVkaXVtX3JhcmUoYnAsIHFlY19zdGF0dXMsIGJtYWNfc3RhdHVzKTsKKworCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9UWElSUSkKKwkJYmlnbWFjX3R4KGJwKTsKKworCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWElSUSkKKwkJYmlnbWFjX3J4KGJwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBiaWdtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmJpZ21hY19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGJwKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW4ndCBvcmRlciBpcnEgJWQgdG8gZ28uXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCWluaXRfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOworCXJldCA9IGJpZ21hY19pbml0KGJwLCAwKTsKKwlpZiAocmV0KQorCQlmcmVlX2lycShkZXYtPmlycSwgYnApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmlnbWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisKKwlkZWxfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOworCWJwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwlicC0+dGltZXJfdGlja3MgPSAwOworCisJYmlnbWFjX3N0b3AoYnApOworCWJpZ21hY19jbGVhbl9yaW5ncyhicCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGJwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKworCWJpZ21hY19pbml0KGJwLCAwKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIFB1dCBhIHBhY2tldCBvbiB0aGUgd2lyZS4gKi8KK3N0YXRpYyBpbnQgYmlnbWFjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKwlpbnQgbGVuLCBlbnRyeTsKKwl1MzIgbWFwcGluZzsKKworCWxlbiA9IHNrYi0+bGVuOworCW1hcHBpbmcgPSBzYnVzX21hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LCBza2ItPmRhdGEsIGxlbiwgU0JVU19ETUFfVE9ERVZJQ0UpOworCisJLyogQXZvaWQgYSByYWNlLi4uICovCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWVudHJ5ID0gYnAtPnR4X25ldzsKKwlEVFgoKCJiaWdtYWNfc3RhcnRfeG1pdDogbGVuKCVkKSBlbnRyeSglZClcbiIsIGxlbiwgZW50cnkpKTsKKwlicC0+Ym1hY19ibG9jay0+YmVfdHhkW2VudHJ5XS50eF9mbGFncyA9IFRYRF9VUERBVEU7CisJYnAtPnR4X3NrYnNbZW50cnldID0gc2tiOworCWJwLT5ibWFjX2Jsb2NrLT5iZV90eGRbZW50cnldLnR4X2FkZHIgPSBtYXBwaW5nOworCWJwLT5ibWFjX2Jsb2NrLT5iZV90eGRbZW50cnldLnR4X2ZsYWdzID0KKwkJKFRYRF9PV04gfCBUWERfU09QIHwgVFhEX0VPUCB8IChsZW4gJiBUWERfTEVOR1RIKSk7CisJYnAtPnR4X25ldyA9IE5FWFRfVFgoZW50cnkpOworCWlmIChUWF9CVUZGU19BVkFJTChicCkgPD0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJLyogR2V0IGl0IGdvaW5nLiAqLworCXNidXNfd3JpdGVsKENSRUdfQ1RSTF9UV0FLRVVQLCBicC0+Y3JlZyArIENSRUdfQ1RSTCk7CisKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYmlnbWFjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCisJYmlnbWFjX2dldF9jb3VudGVycyhicCwgYnAtPmJyZWdzKTsKKwlyZXR1cm4gJmJwLT5lbmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqYnJlZ3MgPSBicC0+YnJlZ3M7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJY2hhciAqYWRkcnM7CisJaW50IGk7CisJdTMyIHRtcCwgY3JjOworCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIuICBUaGUgYml0IHNlbGYtY2xlYXJzIHdoZW4KKwkgKiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorCSAqLworCXRtcCA9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl0bXAgJj0gfihCSUdNQUNfUlhDRkdfRU5BQkxFKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGJyZWdzICsgQk1BQ19SWENGRyk7CisJd2hpbGUgKChzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRykgJiBCSUdNQUNfUlhDRkdfRU5BQkxFKSAhPSAwKQorCQl1ZGVsYXkoMjApOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlzYnVzX3dyaXRlbCgweGZmZmYsIGJyZWdzICsgQk1BQ19IVEFCTEUwKTsKKwkJc2J1c193cml0ZWwoMHhmZmZmLCBicmVncyArIEJNQUNfSFRBQkxFMSk7CisJCXNidXNfd3JpdGVsKDB4ZmZmZiwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIpOworCQlzYnVzX3dyaXRlbCgweGZmZmYsIGJyZWdzICsgQk1BQ19IVEFCTEUzKTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQl0bXAgPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRyk7CisJCXRtcCB8PSBCSUdNQUNfUlhDRkdfUE1JU0M7CisJCXNidXNfd3JpdGVsKHRtcCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJaGFzaF90YWJsZVtpXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCisJCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCXNidXNfd3JpdGVsKGhhc2hfdGFibGVbMF0sIGJyZWdzICsgQk1BQ19IVEFCTEUwKTsKKwkJc2J1c193cml0ZWwoaGFzaF90YWJsZVsxXSwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEpOworCQlzYnVzX3dyaXRlbChoYXNoX3RhYmxlWzJdLCBicmVncyArIEJNQUNfSFRBQkxFMik7CisJCXNidXNfd3JpdGVsKGhhc2hfdGFibGVbM10sIGJyZWdzICsgQk1BQ19IVEFCTEUzKTsKKwl9CisKKwkvKiBSZS1lbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCXRtcCA9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl0bXAgfD0gQklHTUFDX1JYQ0ZHX0VOQUJMRTsKKwlzYnVzX3dyaXRlbCh0bXAsIGJyZWdzICsgQk1BQ19SWENGRyk7Cit9CisKKy8qIEV0aHRvb2wgc3VwcG9ydC4uLiAqLworc3RhdGljIHZvaWQgYmlnbWFjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSBkZXYtPnByaXY7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VuYm1hYyIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMi4wIik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAorCQlicC0+cWVjX3NkZXYtPnNsb3QpOworfQorCitzdGF0aWMgdTMyIGJpZ21hY19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWJwLT5zd19ibXNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgYnAtPnRyZWdzLCBCSUdNQUNfQk1TUik7CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlyZXR1cm4gKGJwLT5zd19ibXNyICYgQk1TUl9MU1RBVFVTKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBiaWdtYWNfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGJpZ21hY19nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gYmlnbWFjX2dldF9saW5rLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmlnbWFjX2V0aGVyX2luaXQoc3RydWN0IHNidXNfZGV2ICpxZWNfc2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBiaWdtYWMgKmJwOworCXU4IGJzaXplcywgYnNpemVzX21vcmU7CisJaW50IGk7CisKKwkvKiBHZXQgYSBuZXcgZGV2aWNlIHN0cnVjdCBmb3IgdGhpcyBpbnRlcmZhY2UuICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBiaWdtYWMpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlkZXYtPmJhc2VfYWRkciA9IChsb25nKSBxZWNfc2RldjsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaWRwcm9tLT5pZF9ldGhhZGRyW2ldOworCisJLyogU2V0dXAgc29mdGMsIHdpdGggYmFja3BvaW50ZXJzIHRvIFFFQyBhbmQgQmlnTUFDIFNCVVMgZGV2aWNlIHN0cnVjdHMuICovCisJYnAgPSBkZXYtPnByaXY7CisJYnAtPnFlY19zZGV2ID0gcWVjX3NkZXY7CisJYnAtPmJpZ21hY19zZGV2ID0gcWVjX3NkZXYtPmNoaWxkOworCisJc3Bpbl9sb2NrX2luaXQoJmJwLT5sb2NrKTsKKworCS8qIFZlcmlmeSB0aGUgcmVnaXN0ZXJzIHdlIGV4cGVjdCwgYXJlIGFjdHVhbGx5IHRoZXJlLiAqLworCWlmICgoYnAtPmJpZ21hY19zZGV2LT5udW1fcmVnaXN0ZXJzICE9IDMpIHx8CisJICAgKGJwLT5xZWNfc2Rldi0+bnVtX3JlZ2lzdGVycyAhPSAyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogRGV2aWNlIGRvZXMgbm90IGhhdmUgMiBhbmQgMyByZWdzLCBpdCBoYXMgJWQgYW5kICVkLlxuIiwKKwkJICAgICAgIGJwLT5xZWNfc2Rldi0+bnVtX3JlZ2lzdGVycywKKwkJICAgICAgIGJwLT5iaWdtYWNfc2Rldi0+bnVtX3JlZ2lzdGVycyk7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBXb3VsZCB5b3UgbGlrZSB0aGF0IGZvciBoZXJlIG9yIHRvIGdvP1xuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBNYXAgaW4gUUVDIGdsb2JhbCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlicC0+Z3JlZ3MgPSBzYnVzX2lvcmVtYXAoJmJwLT5xZWNfc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJIEdMT0JfUkVHX1NJWkUsICJCaWdNQUMgUUVDIEdMb2JhbCBSZWdzIik7CisJaWYgKCFicC0+Z3JlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBtYXAgUUVDIGdsb2JhbCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIE1ha2Ugc3VyZSBRRUMgaXMgaW4gQmlnTUFDIG1vZGUuICovCisJaWYgKChzYnVzX3JlYWRsKGJwLT5ncmVncyArIEdMT0JfQ1RSTCkgJiAweGYwMDAwMDAwKSAhPSBHTE9CX0NUUkxfQk1PREUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCaWdNQUM6IEFJRUVFLCBRRUMgaXMgbm90IGluIEJpZ01BQyBtb2RlIVxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBSZXNldCB0aGUgUUVDLiAqLworCWlmIChxZWNfZ2xvYmFsX3Jlc2V0KGJwLT5ncmVncykpCisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKworCS8qIEdldCBzdXBwb3J0ZWQgU0JVUyBidXJzdCBzaXplcy4gKi8KKwlic2l6ZXMgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPnFlY19zZGV2LT5wcm9tX25vZGUsCisJCQkJICAgICJidXJzdC1zaXplcyIsCisJCQkJICAgIDB4ZmYpOworCisJYnNpemVzX21vcmUgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPnFlY19zZGV2LT5idXMtPnByb21fbm9kZSwKKwkJCQkJICJidXJzdC1zaXplcyIsCisJCQkJCSAweGZmKTsKKworCWJzaXplcyAmPSAweGZmOworCWlmIChic2l6ZXNfbW9yZSAhPSAweGZmKQorCQlic2l6ZXMgJj0gYnNpemVzX21vcmU7CisJaWYgKGJzaXplcyA9PSAweGZmIHx8IChic2l6ZXMgJiBETUFfQlVSU1QxNikgPT0gMCB8fAorCSAgICAoYnNpemVzICYgRE1BX0JVUlNUMzIpID09IDApCisJCWJzaXplcyA9IChETUFfQlVSU1QzMiAtIDEpOworCWJwLT5iaWdtYWNfYnVyc3RzID0gYnNpemVzOworCisJLyogUGVyZm9ybSBRRUMgaW5pdGlhbGl6YXRpb24uICovCisJcWVjX2luaXQoYnApOworCisJLyogTWFwIGluIHRoZSBCaWdNQUMgY2hhbm5lbCByZWdpc3RlcnMuICovCisJYnAtPmNyZWcgPSBzYnVzX2lvcmVtYXAoJmJwLT5iaWdtYWNfc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJQ1JFR19SRUdfU0laRSwgIkJpZ01BQyBRRUMgQ2hhbm5lbCBSZWdzIik7CisJaWYgKCFicC0+Y3JlZykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IG1hcCBRRUMgY2hhbm5lbCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIE1hcCBpbiB0aGUgQmlnTUFDIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCWJwLT5icmVncyA9IHNidXNfaW9yZW1hcCgmYnAtPmJpZ21hY19zZGV2LT5yZXNvdXJjZVsxXSwgMCwKKwkJCQkgQk1BQ19SRUdfU0laRSwgIkJpZ01BQyBQcmltYXJ5IFJlZ3MiKTsKKwlpZiAoIWJwLT5icmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IG1hcCBCaWdNQUMgcHJpbWFyeSByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIE1hcCBpbiB0aGUgQmlnTUFDIHRyYW5zY2VpdmVyIHJlZ2lzdGVycywgdGhpcyBpcyBob3cgeW91IHBva2UgYXQKKwkgKiB0aGUgQmlnTUFDJ3MgUEhZLgorCSAqLworCWJwLT50cmVncyA9IHNidXNfaW9yZW1hcCgmYnAtPmJpZ21hY19zZGV2LT5yZXNvdXJjZVsyXSwgMCwKKwkJCQkgVENWUl9SRUdfU0laRSwgIkJpZ01BQyBUcmFuc2NlaXZlciBSZWdzIik7CisJaWYgKCFicC0+dHJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBtYXAgQmlnTUFDIHRyYW5zY2VpdmVyIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogU3RvcCB0aGUgQmlnTUFDLiAqLworCWJpZ21hY19zdG9wKGJwKTsKKworCS8qIEFsbG9jYXRlIHRyYW5zbWl0L3JlY2VpdmUgZGVzY3JpcHRvciBEVk1BIGJsb2NrLiAqLworCWJwLT5ibWFjX2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KGJwLT5iaWdtYWNfc2RldiwKKwkJCQkJICAgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICAgICZicC0+YmJsb2NrX2R2bWEpOworCWlmIChicC0+Ym1hY19ibG9jayA9PSBOVUxMIHx8IGJwLT5iYmxvY2tfZHZtYSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgYWxsb2NhdGUgY29uc2lzdGVudCBETUEuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIEdldCB0aGUgYm9hcmQgcmV2aXNpb24gb2YgdGhpcyBCaWdNQUMuICovCisJYnAtPmJvYXJkX3JldiA9IHByb21fZ2V0aW50ZGVmYXVsdChicC0+YmlnbWFjX3NkZXYtPnByb21fbm9kZSwKKwkJCQkJICAgImJvYXJkLXZlcnNpb24iLCAxKTsKKworCS8qIEluaXQgYXV0by1uZWdvdGlhdGlvbiB0aW1lciBzdGF0ZS4gKi8KKwlpbml0X3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKKwlicC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJYnAtPnRpbWVyX3RpY2tzID0gMDsKKworCS8qIEJhY2tsaW5rIHRvIGdlbmVyaWMgbmV0IGRldmljZSBzdHJ1Y3QuICovCisJYnAtPmRldiA9IGRldjsKKworCS8qIFNldCBsaW5rcyB0byBvdXIgQmlnTUFDIG9wZW4gYW5kIGNsb3NlIHJvdXRpbmVzLiAqLworCWRldi0+b3BlbiA9ICZiaWdtYWNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmYmlnbWFjX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmJpZ21hY19zdGFydF94bWl0OworCWRldi0+ZXRodG9vbF9vcHMgPSAmYmlnbWFjX2V0aHRvb2xfb3BzOworCisJLyogU2V0IGxpbmtzIHRvIEJpZ01BQyBzdGF0aXN0aWMgYW5kIG11bHRpLWNhc3QgbG9hZGluZyBjb2RlLiAqLworCWRldi0+Z2V0X3N0YXRzID0gJmJpZ21hY19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYmlnbWFjX3NldF9tdWx0aWNhc3Q7CisKKwlkZXYtPnR4X3RpbWVvdXQgPSAmYmlnbWFjX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisKKwkvKiBGaW5pc2ggbmV0IGRldmljZSByZWdpc3RyYXRpb24uICovCisJZGV2LT5pcnEgPSBicC0+YmlnbWFjX3NkZXYtPmlycXNbMF07CisJZGV2LT5kbWEgPSAwOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBQdXQgdXMgaW50byB0aGUgbGlzdCBvZiBpbnN0YW5jZXMgYXR0YWNoZWQgZm9yIGxhdGVyIGRyaXZlcgorCSAqIGV4aXQuCisJICovCisJYnAtPm5leHRfbW9kdWxlID0gcm9vdF9iaWdtYWNfZGV2OworCXJvb3RfYmlnbWFjX2RldiA9IGJwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJpZ01BQyAxMDBiYXNlVCBFdGhlcm5ldCAiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sCisJCSAgICAgICBpID09IDUgPyAnICcgOiAnOicpOworCXByaW50aygiXG4iKTsKKworCXJldHVybiAwOworCitmYWlsX2FuZF9jbGVhbnVwOgorCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLCB1bmRvIHdoYXRldmVyIHdlIGRpZCBzbyBmYXIuICovCisJLyogRnJlZSByZWdpc3RlciBtYXBwaW5ncyBpZiBhbnkuICovCisJaWYgKGJwLT5ncmVncykKKwkJc2J1c19pb3VubWFwKGJwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJaWYgKGJwLT5jcmVnKQorCQlzYnVzX2lvdW5tYXAoYnAtPmNyZWcsIENSRUdfUkVHX1NJWkUpOworCWlmIChicC0+YnJlZ3MpCisJCXNidXNfaW91bm1hcChicC0+YnJlZ3MsIEJNQUNfUkVHX1NJWkUpOworCWlmIChicC0+dHJlZ3MpCisJCXNidXNfaW91bm1hcChicC0+dHJlZ3MsIFRDVlJfUkVHX1NJWkUpOworCisJaWYgKGJwLT5ibWFjX2Jsb2NrKQorCQlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCisJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJICAgICBicC0+Ym1hY19ibG9jaywKKwkJCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7CisKKwkvKiBUaGlzIGFsc28gZnJlZXMgdGhlIGNvLWxvY2F0ZWQgJ2Rldi0+cHJpdicgKi8KKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCisvKiBRRUMgY2FuIGJlIHRoZSBwYXJlbnQgb2YgZWl0aGVyIFF1YWRFdGhlcm5ldCBvcgorICogYSBCaWdNQUMuICBXZSB3YW50IHRoZSBsYXR0ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJpZ21hY19tYXRjaChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RydWN0IHNidXNfZGV2ICpjaGlsZCA9IHNkZXYtPmNoaWxkOworCisJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJxZWMiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChjaGlsZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChzdHJjbXAoY2hpbGQtPnByb21fbmFtZSwgImJlIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgYmlnbWFjX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IE5VTEw7CisJc3RhdGljIGludCBjYWxsZWQ7CisJaW50IGNhcmRzID0gMCwgdjsKKworCXJvb3RfYmlnbWFjX2RldiA9IE5VTEw7CisKKwlpZiAoY2FsbGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYWxsZWQrKzsKKworCWZvcl9lYWNoX3NidXMoc2J1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKKwkJCWlmIChiaWdtYWNfbWF0Y2goc2RldikpIHsKKwkJCQljYXJkcysrOworCQkJCWlmICgodiA9IGJpZ21hY19ldGhlcl9pbml0KHNkZXYpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQl9CisJCX0KKwl9CisJaWYgKCFjYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiaWdtYWNfY2xlYW51cCh2b2lkKQoreworCXdoaWxlIChyb290X2JpZ21hY19kZXYpIHsKKwkJc3RydWN0IGJpZ21hYyAqYnAgPSByb290X2JpZ21hY19kZXY7CisJCXN0cnVjdCBiaWdtYWMgKmJwX254dCA9IHJvb3RfYmlnbWFjX2Rldi0+bmV4dF9tb2R1bGU7CisKKwkJc2J1c19pb3VubWFwKGJwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJCXNidXNfaW91bm1hcChicC0+Y3JlZywgQ1JFR19SRUdfU0laRSk7CisJCXNidXNfaW91bm1hcChicC0+YnJlZ3MsIEJNQUNfUkVHX1NJWkUpOworCQlzYnVzX2lvdW5tYXAoYnAtPnRyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwkJc2J1c19mcmVlX2NvbnNpc3RlbnQoYnAtPmJpZ21hY19zZGV2LAorCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCSAgICAgYnAtPmJtYWNfYmxvY2ssCisJCQkJICAgICBicC0+YmJsb2NrX2R2bWEpOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGJwLT5kZXYpOworCQlmcmVlX25ldGRldihicC0+ZGV2KTsKKwkJcm9vdF9iaWdtYWNfZGV2ID0gYnBfbnh0OworCX0KK30KKworbW9kdWxlX2luaXQoYmlnbWFjX3Byb2JlKTsKK21vZHVsZV9leGl0KGJpZ21hY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuaCBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njc0MDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5oCkBAIC0wLDAgKzEsMzU2IEBACisvKiAkSWQ6IHN1bmJtYWMuaCx2IDEuNyAyMDAwLzA3LzExIDIyOjM1OjIyIGRhdmVtIEV4cCAkCisgKiBzdW5ibWFjLmg6IERlZmluZXMgZm9yIHRoZSBTdW4gIkJpZyBNQUMiIDEwMGJhc2VUIGV0aGVybmV0IGNhcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKi8KKworI2lmbmRlZiBfU1VOQk1BQ19ICisjZGVmaW5lIF9TVU5CTUFDX0gKKworLyogUUVDIGdsb2JhbCByZWdpc3RlcnMuICovCisjZGVmaW5lIEdMT0JfQ1RSTAkweDAwVUwJLyogQ29udHJvbCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVAkweDA0VUwJLyogU3RhdHVzICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkUJMHgwOFVMCS8qIFBhY2tldCBTaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX01TSVpFCTB4MGNVTAkvKiBMb2NhbC1tZW0gc2l6ZSAoNjRLKSAgICAgKi8KKyNkZWZpbmUgR0xPQl9SU0laRQkweDEwVUwJLyogUmVjZWl2ZSBwYXJ0aXRpb24gc2l6ZSAgICovCisjZGVmaW5lIEdMT0JfVFNJWkUJMHgxNFVMCS8qIFRyYW5zbWl0IHBhcnRpdGlvbiBzaXplICAqLworI2RlZmluZSBHTE9CX1JFR19TSVpFCTB4MThVTAorCisjZGVmaW5lIEdMT0JfQ1RSTF9NTU9ERSAgICAgICAweDQwMDAwMDAwIC8qIE1BQ0UgcWVjIG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQk1PREUgICAgICAgMHgxMDAwMDAwMCAvKiBCaWdNQUMgcWVjIG1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0VQQVIgICAgICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIHBhcml0eSAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9BQ05UUkwgICAgICAweDAwMDAwMDE4IC8qIFNCVVMgYXJiaXRyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBHTE9CX0NUUkxfQjY0ICAgICAgICAgMHgwMDAwMDAwNCAvKiA2NCBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0IzMiAgICAgICAgIDB4MDAwMDAwMDIgLyogMzIgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CMTYgICAgICAgICAweDAwMDAwMDAwIC8qIDE2IGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfUkVTRVQgICAgICAgMHgwMDAwMDAwMSAvKiBSZXNldCB0aGUgUUVDICAgICAgICAgICAgKi8KKworI2RlZmluZSBHTE9CX1NUQVRfVFggICAgICAgICAgMHgwMDAwMDAwOCAvKiBCaWdNQUMgVHJhbnNtaXQgSVJRICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX1JYICAgICAgICAgIDB4MDAwMDAwMDQgLyogQmlnTUFDIFJlY2VpdmUgSVJRICAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9CTSAgICAgICAgICAweDAwMDAwMDAyIC8qIEJpZ01BQyBHbG9iYWwgSVJRICAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfRVIgICAgICAgICAgMHgwMDAwMDAwMSAvKiBCaWdNQUMgRXJyb3IgSVJRICAgICAgICAgKi8KKworI2RlZmluZSBHTE9CX1BTSVpFXzIwNDggICAgICAgMHgwMCAgICAgICAvKiAyayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV80MDk2ICAgICAgIDB4MDEgICAgICAgLyogNGsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfNjE0NCAgICAgICAweDEwICAgICAgIC8qIDZrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzgxOTIgICAgICAgMHgxMSAgICAgICAvKiA4ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKworLyogUUVDIEJpZ01BQyBjaGFubmVsIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgQ1JFR19DVFJMCTB4MDBVTAkvKiBDb250cm9sICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVAkweDA0VUwJLyogU3RhdHVzICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1JYRFMJMHgwOFVMCS8qIFJYIGRlc2NyaXB0b3IgcmluZyBwdHIgICAgKi8KKyNkZWZpbmUgQ1JFR19UWERTCTB4MGNVTAkvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcHRyICAgICovCisjZGVmaW5lIENSRUdfUklNQVNLCTB4MTBVTAkvKiBSWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfVElNQVNLCTB4MTRVTAkvKiBUWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0sJMHgxOFVMCS8qIFFFQyBFcnJvciBJbnRlcnJ1cHQgTWFzayAgKi8KKyNkZWZpbmUgQ1JFR19CTUFTSwkweDFjVUwJLyogQmlnTUFDIEVycm9yIEludGVycnVwdCBNYXNrKi8KKyNkZWZpbmUgQ1JFR19SWFdCVUZQVFIJMHgyMFVMCS8qIExvY2FsIG1lbW9yeSByeCB3cml0ZSBwdHIgKi8KKyNkZWZpbmUgQ1JFR19SWFJCVUZQVFIJMHgyNFVMCS8qIExvY2FsIG1lbW9yeSByeCByZWFkIHB0ciAgKi8KKyNkZWZpbmUgQ1JFR19UWFdCVUZQVFIJMHgyOFVMCS8qIExvY2FsIG1lbW9yeSB0eCB3cml0ZSBwdHIgKi8KKyNkZWZpbmUgQ1JFR19UWFJCVUZQVFIJMHgyY1VMCS8qIExvY2FsIG1lbW9yeSB0eCByZWFkIHB0ciAgKi8KKyNkZWZpbmUgQ1JFR19DQ05UCTB4MzBVTAkvKiBDb2xsaXNpb24gQ291bnRlciAgICAgICAgICovCisjZGVmaW5lIENSRUdfUkVHX1NJWkUJMHgzNFVMCisKKyNkZWZpbmUgQ1JFR19DVFJMX1RXQUtFVVAgICAgIDB4MDAwMDAwMDEgIC8qIFRyYW5zbWl0dGVyIFdha2V1cCwgJ2dvJy4gKi8KKworI2RlZmluZSBDUkVHX1NUQVRfQkVSUk9SICAgICAgMHg4MDAwMDAwMCAgLyogQmlnTUFDIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhJUlEgICAgICAgMHgwMDIwMDAwMCAgLyogVHJhbnNtaXQgSW50ZXJydXB0ICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhERVJST1IgICAgMHgwMDA4MDAwMCAgLyogVFggRGVzY3JpcHRvciBpcyBib2d1cyAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhMRVJSICAgICAgMHgwMDA0MDAwMCAgLyogTGF0ZSBUcmFuc21pdCBFcnJvciAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhQRVJSICAgICAgMHgwMDAyMDAwMCAgLyogVHJhbnNtaXQgUGFyaXR5IEVycm9yICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhTRVJSICAgICAgMHgwMDAxMDAwMCAgLyogVHJhbnNtaXQgU0JVUyBlcnJvciBhY2sgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhJUlEgICAgICAgMHgwMDAwMDAyMCAgLyogUmVjZWl2ZSBJbnRlcnJ1cHQgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhEUk9QICAgICAgMHgwMDAwMDAxMCAgLyogRHJvcHBlZCBhIFJYJ2QgcGFja2V0ICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTTUFMTCAgICAgMHgwMDAwMDAwOCAgLyogUmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhMRVJSICAgICAgMHgwMDAwMDAwNCAgLyogUmVjZWl2ZSBMYXRlIEVycm9yICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhQRVJSICAgICAgMHgwMDAwMDAwMiAgLyogUmVjZWl2ZSBQYXJpdHkgRXJyb3IgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTRVJSICAgICAgMHgwMDAwMDAwMSAgLyogUmVjZWl2ZSBTQlVTIEVycm9yIEFDSyAgICAqLworCisjZGVmaW5lIENSRUdfU1RBVF9FUlJPUlMgICAgICAoQ1JFR19TVEFUX0JFUlJPUnxDUkVHX1NUQVRfVFhERVJST1J8Q1JFR19TVEFUX1RYTEVSUnwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFR19TVEFUX1RYUEVSUnxDUkVHX1NUQVRfVFhTRVJSfENSRUdfU1RBVF9SWERST1B8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFR19TVEFUX1JYU01BTEx8Q1JFR19TVEFUX1JYTEVSUnxDUkVHX1NUQVRfUlhQRVJSfCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFR19TVEFUX1JYU0VSUikKKworI2RlZmluZSBDUkVHX1FNQVNLX1RYREVSUk9SICAgMHgwMDA4MDAwMCAgLyogVFhEIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYTEVSUiAgICAgMHgwMDA0MDAwMCAgLyogVFggbGF0ZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYUEVSUiAgICAgMHgwMDAyMDAwMCAgLyogVFggcGFyaXR5IGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYU0VSUiAgICAgMHgwMDAxMDAwMCAgLyogVFggc2J1cyBlcnJvciBhY2sgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYRFJPUCAgICAgMHgwMDAwMDAxMCAgLyogUlggZHJvcCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYQkVSUk9SICAgMHgwMDAwMDAwOCAgLyogUlggYnVmZmVyIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYTEVFUlIgICAgMHgwMDAwMDAwNCAgLyogUlggbGF0ZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYUEVSUiAgICAgMHgwMDAwMDAwMiAgLyogUlggcGFyaXR5IGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYU0VSUiAgICAgMHgwMDAwMDAwMSAgLyogUlggc2J1cyBlcnJvciBhY2sgICAgICAgICAqLworCisvKiBCSUdNQUMgY29yZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQk1BQ19YSUZDRkcJMHgwMDBVTAkvKiBYSUYgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisJLyogMHgwMDQtLT4weDBmYywgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19TVEFUVVMJMHgxMDBVTAkvKiBTdGF0dXMgcmVnaXN0ZXIsIGNsZWFyIG9uIHJlYWQgICAgICovCisjZGVmaW5lIEJNQUNfSU1BU0sJMHgxMDRVTAkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAgICAgICAgICAgICovCisJLyogMHgxMDgtLT4weDIwNCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19UWFNXUkVTRVQJMHgyMDhVTAkvKiBUcmFuc21pdHRlciBzb2Z0d2FyZSByZXNldCAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhDRkcJMHgyMGNVTAkvKiBUcmFuc21pdHRlciBjb25maWcgcmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIEJNQUNfSUdBUDEJMHgyMTBVTAkvKiBJbnRlci1wYWNrZXQgZ2FwIDEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSUdBUDIJMHgyMTRVTAkvKiBJbnRlci1wYWNrZXQgZ2FwIDIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUxJTUlUCTB4MjE4VUwJLyogVHJhbnNtaXQgYXR0ZW1wdCBsaW1pdCAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1NUSU1FCTB4MjFjVUwJLyogVHJhbnNtaXQgc2xvdCB0aW1lICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BMRU4JMHgyMjBVTAkvKiBTaXplIG9mIHRyYW5zbWl0IHByZWFtYmxlICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUFBBVAkweDIyNFVMCS8qIFBhdHRlcm4gZm9yIHRyYW5zbWl0IHByZWFtYmxlICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWERFTElNCTB4MjI4VUwJLyogVHJhbnNtaXQgZGVsaW1pdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0pTSVpFCTB4MjJjVUwJLyogVG9lIGphbS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYUE1BWAkweDIzMFVMCS8qIFRyYW5zbWl0IG1heCBwa3Qgc2l6ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWFBNSU4JMHgyMzRVTAkvKiBUcmFuc21pdCBtaW4gcGt0IHNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUEFUVEVNUFQJMHgyMzhVTAkvKiBDb3VudCBvZiB0cmFuc21pdCBwZWFrIGF0dGVtcHRzICAgICovCisjZGVmaW5lIEJNQUNfRFRDVFIJMHgyM2NVTAkvKiBUcmFuc21pdCBkZWZlciB0aW1lciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTkNDVFIJMHgyNDBVTAkvKiBUcmFuc21pdCBub3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgICovCisjZGVmaW5lIEJNQUNfRkNDVFIJMHgyNDRVTAkvKiBUcmFuc21pdCBmaXJzdC1jb2xsaXNpb24gY291bnRlciAgICovCisjZGVmaW5lIEJNQUNfRVhDVFIJMHgyNDhVTAkvKiBUcmFuc21pdCBleGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgICovCisjZGVmaW5lIEJNQUNfTFRDVFIJMHgyNGNVTAkvKiBUcmFuc21pdCBsYXRlLWNvbGxpc2lvbiBjb3VudGVyICAgICovCisjZGVmaW5lIEJNQUNfUlNFRUQJMHgyNTBVTAkvKiBUcmFuc21pdCByYW5kb20gbnVtYmVyIHNlZWQgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhTTUFDSElORQkweDI1NFVMIC8qIFRyYW5zbWl0IHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKwkvKiAweDI1OC0tPjB4MzA0LCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX1JYU1dSRVNFVAkweDMwOFVMCS8qIFJlY2VpdmVyIHNvZnR3YXJlIHJlc2V0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWENGRwkweDMwY1VMCS8qIFJlY2VpdmVyIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWFBNQVgJMHgzMTBVTAkvKiBSZWNlaXZlIG1heCBwa3Qgc2l6ZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhQTUlOCTB4MzE0VUwJLyogUmVjZWl2ZSBtaW4gcGt0IHNpemUgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIyCTB4MzE4VUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAyICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIxCTB4MzFjVUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAxICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIwCTB4MzIwVUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAwICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0ZSQ1RSCTB4MzI0VUwJLyogUmVjZWl2ZSBmcmFtZSByZWNlaXZlIGNvdW50ZXIgICAgICAqLworI2RlZmluZSBCTUFDX0dMRUNUUgkweDMyOFVMCS8qIFJlY2VpdmUgZ2lhbnQtbGVuZ3RoIGVycm9yIGNvdW50ZXIgKi8KKyNkZWZpbmUgQk1BQ19VTkFMRUNUUgkweDMyY1VMCS8qIFJlY2VpdmUgdW5hbGlnbmVkIGVycm9yIGNvdW50ZXIgICAgKi8KKyNkZWZpbmUgQk1BQ19SQ1JDRUNUUgkweDMzMFVMCS8qIFJlY2VpdmUgQ1JDIGVycm9yIGNvdW50ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWFNNQUNISU5FCTB4MzM0VUwJLyogUmVjZWl2ZXIgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYQ1ZBTElECTB4MzM4VUwJLyogUmVjZWl2ZXIgY29kZSB2aW9sYXRpb24gICAgICAgICAgICAqLworCS8qIDB4MzNjLCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX0hUQUJMRTMJMHgzNDBVTAkvKiBIYXNoIHRhYmxlIDMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMgkweDM0NFVMCS8qIEhhc2ggdGFibGUgMiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUxCTB4MzQ4VUwJLyogSGFzaCB0YWJsZSAxICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTAJMHgzNGNVTAkvKiBIYXNoIHRhYmxlIDAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjIJMHgzNTBVTAkvKiBBZGRyZXNzIGZpbHRlciAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjEJMHgzNTRVTAkvKiBBZGRyZXNzIGZpbHRlciAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjAJMHgzNThVTAkvKiBBZGRyZXNzIGZpbHRlciAwICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZNQVNLCTB4MzVjVUwJLyogQWRkcmVzcyBmaWx0ZXIgbWFzayAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JFR19TSVpFCTB4MzYwVUwKKworLyogQmlnTWFjIFhJRiBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX09ERU5BQkxFICAgMHgwMDAwMDAwMSAvKiBPdXRwdXQgZHJpdmVyIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX1JFU1YgICAgICAgMHgwMDAwMDAwMiAvKiBSZXNlcnZlZCwgd3JpdGUgYWx3YXlzIGFzIDEgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX01MQkFDSyAgICAgMHgwMDAwMDAwNCAvKiBMb29wYmFjay1tb2RlIE1JSSBlbmFibGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX1NNT0RFICAgICAgMHgwMDAwMDAwOCAvKiBFbmFibGUgc2VyaWFsIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEJpZ01BQyBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0dPVEZSQU1FICAgMHgwMDAwMDAwMSAvKiBSZWNlaXZlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX1JDTlRFWFAgICAgMHgwMDAwMDAwMiAvKiBSZWNlaXZlIGZyYW1lIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0FDTlRFWFAgICAgMHgwMDAwMDAwNCAvKiBBbGlnbi1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0NDTlRFWFAgICAgMHgwMDAwMDAwOCAvKiBDUkMtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0xDTlRFWFAgICAgMHgwMDAwMDAxMCAvKiBMZW5ndGgtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX1JGSUZPVkYgICAgMHgwMDAwMDAyMCAvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0NWQ05URVhQICAgMHgwMDAwMDA0MCAvKiBDb2RlLXZpb2xhdGlvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX1NFTlRGUkFNRSAgMHgwMDAwMDEwMCAvKiBUcmFuc21pdHRlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX1RGSUZPX1VORCAgMHgwMDAwMDIwMCAvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX01BWFBLVEVSUiAgMHgwMDAwMDQwMCAvKiBNYXgtcGFja2V0IHNpemUgZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX05DTlRFWFAgICAgMHgwMDAwMDgwMCAvKiBOb3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0VDTlRFWFAgICAgMHgwMDAwMTAwMCAvKiBFeGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0xDQ05URVhQICAgMHgwMDAwMjAwMCAvKiBMYXRlLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0ZDTlRFWFAgICAgMHgwMDAwNDAwMCAvKiBGaXJzdC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19TVEFUX0RUSU1FWFAgICAgMHgwMDAwODAwMCAvKiBEZWZlci10aW1lciBleHBpcmVkICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEJpZ01BQyBpbnRlcnJ1cHQgbWFzayByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0dPVEZSQU1FICAweDAwMDAwMDAxIC8qIFJlY2VpdmVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX1JDTlRFWFAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgZnJhbWUgY291bnRlciBleHBpcmVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0FDTlRFWFAgICAweDAwMDAwMDA0IC8qIEFsaWduLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0NDTlRFWFAgICAweDAwMDAwMDA4IC8qIENSQy1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0xDTlRFWFAgICAweDAwMDAwMDEwIC8qIExlbmd0aC1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX1JGSUZPVkYgICAweDAwMDAwMDIwIC8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0NWQ05URVhQICAweDAwMDAwMDQwIC8qIENvZGUtdmlvbGF0aW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX1NFTlRGUkFNRSAweDAwMDAwMTAwIC8qIFRyYW5zbWl0dGVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX1RGSUZPX1VORCAweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX01BWFBLVEVSUiAweDAwMDAwNDAwIC8qIE1heC1wYWNrZXQgc2l6ZSBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX05DTlRFWFAgICAweDAwMDAwODAwIC8qIE5vcm1hbC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0VDTlRFWFAgICAweDAwMDAxMDAwIC8qIEV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0xDQ05URVhQICAweDAwMDAyMDAwIC8qIExhdGUtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0ZDTlRFWFAgICAweDAwMDA0MDAwIC8qIEZpcnN0LWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX0lNQVNLX0RUSU1FWFAgICAweDAwMDA4MDAwIC8qIERlZmVyLXRpbWVyIGV4cGlyZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQmlnTWFjIHRyYW5zbWl0IGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0VOQUJMRSAgICAweDAwMDAwMDAxIC8qIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0ZJRk8gICAgICAweDAwMDAwMDEwIC8qIERlZmF1bHQgdHggZnRocmVzaC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX1NNT0RFICAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBzbG93IHRyYW5zbWl0IG1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0NJR04gICAgICAweDAwMDAwMDQwIC8qIElnbm9yZSB0cmFuc21pdCBjb2xsaXNpb25zICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0ZDU09GRiAgICAweDAwMDAwMDgwIC8qIERvIG5vdCBlbWl0IEZDUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0RCQUNLT0ZGICAweDAwMDAwMTAwIC8qIERpc2FibGUgYmFja29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0ZVTExEUExYICAweDAwMDAwMjAwIC8qIEVuYWJsZSBmdWxsLWR1cGxleCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQmlnTWFjIHJlY2VpdmUgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfRU5BQkxFICAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHRoZSByZWNlaXZlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfRklGTyAgICAgIDB4MDAwMDAwMGUgLyogRGVmYXVsdCByeCBmdGhyZXNoLi4uICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUFNUUklQICAgIDB4MDAwMDAwMjAgLyogUGFkIGJ5dGUgc3RyaXAgZW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUE1JU0MgICAgIDB4MDAwMDAwNDAgLyogRW5hYmxlIHByb21pc2NvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfREVSUiAgICAgIDB4MDAwMDAwODAgLyogRGlzYWJsZSBlcnJvciBjaGVja2luZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfRENSQ1MgICAgIDB4MDAwMDAxMDAgLyogRGlzYWJsZSBDUkMgc3RyaXBwaW5nICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfTUUgICAgICAgIDB4MDAwMDAyMDAgLyogUmVjZWl2ZSBwYWNrZXRzIGFkZHJlc3NlZCB0byBtZSAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUEdSUCAgICAgIDB4MDAwMDA0MDAgLyogRW5hYmxlIHByb21pc2MgZ3JvdXAgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfSEVOQUJMRSAgIDB4MDAwMDA4MDAgLyogRW5hYmxlIHRoZSBoYXNoIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfQUVOQUJMRSAgIDB4MDAwMDEwMDAgLyogRW5hYmxlIHRoZSBhZGRyZXNzIGZpbHRlciAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgQmlnTUFDIFBIWSB0cmFuc2NlaXZlci4gIE5vdCBuZWFybHkgYXMgc29waGlzdGljYXRlZCBhcyB0aGUgaGFwcHkgbWVhbAorICogb25lLiAgQnV0IGl0IGRvZXMgaGF2ZSB0aGUgImJpdCBiYW5nZXIiLCBvaCBiYWJ5LgorICovCisjZGVmaW5lIFRDVlJfVFBBTAkweDAwVUwKKyNkZWZpbmUgVENWUl9NUEFMCTB4MDRVTAorI2RlZmluZSBUQ1ZSX1JFR19TSVpFCTB4MDhVTAorCisvKiBGcmFtZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgRlJBTUVfV1JJVEUgICAgICAgICAgIDB4NTAwMjAwMDAKKyNkZWZpbmUgRlJBTUVfUkVBRCAgICAgICAgICAgIDB4NjAwMjAwMDAKKworLyogVHJhbmNlaXZlciByZWdpc3RlcnMuICovCisjZGVmaW5lIFRDVlJfUEFMX1NFUklBTCAgICAgICAweDAwMDAwMDAxIC8qIEVuYWJsZSBzZXJpYWwgbW9kZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9QQUxfRVhUTEJBQ0sgICAgIDB4MDAwMDAwMDIgLyogRW5hYmxlIGV4dGVybmFsIGxvb3BiYWNrICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1BBTF9NU0VOU0UgICAgICAgMHgwMDAwMDAwNCAvKiBNZWRpYSBzZW5zZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfUEFMX0xURU5BQkxFICAgICAweDAwMDAwMDA4IC8qIExpbmsgdGVzdCBlbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9QQUxfTFRTVEFUVVMgICAgIDB4MDAwMDAwMTAgLyogTGluayB0ZXN0IHN0YXR1cyAgKFAxIG9ubHkpICAgICAqLworCisvKiBNYW5hZ2VtZW50IFBBTC4gKi8KKyNkZWZpbmUgTUdNVF9QQUxfRENMT0NLICAgICAgIDB4MDAwMDAwMDEgLyogRGF0YSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNR01UX1BBTF9PRU5BQiAgICAgICAgMHgwMDAwMDAwMiAvKiBPdXRwdXQgZW5hYmxlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1HTVRfUEFMX01ESU8gICAgICAgICAweDAwMDAwMDA0IC8qIE1ESU8gRGF0YS9hdHRhY2hlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUdNVF9QQUxfVElNRU8gICAgICAgIDB4MDAwMDAwMDggLyogVHJhbnNtaXQgZW5hYmxlIHRpbWVvdXQgZXJyb3IgICAqLworI2RlZmluZSBNR01UX1BBTF9FWFRfTURJTyAgICAgTUdNVF9QQUxfTURJTworI2RlZmluZSBNR01UX1BBTF9JTlRfTURJTyAgICAgTUdNVF9QQUxfVElNRU8KKworLyogSGVyZSBhcmUgc29tZSBQSFkgYWRkcmVzc2VzLiAqLworI2RlZmluZSBCSUdNQUNfUEhZX0VYVEVSTkFMICAgMCAvKiBFeHRlcm5hbCB0cmFuc2NlaXZlciAqLworI2RlZmluZSBCSUdNQUNfUEhZX0lOVEVSTkFMICAgMSAvKiBJbnRlcm5hbCB0cmFuc2NlaXZlciAqLworCisvKiBQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJJR01BQ19CTUNSICAgICAgICAgICAweDAwIC8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlcgkqLworI2RlZmluZSBCSUdNQUNfQk1TUiAgICAgICAgICAgMHgwMSAvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlcgkqLworCisvKiBCTUNSIGJpdHMgKi8KKyNkZWZpbmUgQk1DUl9JU09MQVRFICAgICAgICAgICAgMHgwNDAwICAvKiBEaXNjb25uZWN0IERQODM4NDAgZnJvbSBNSUkgKi8KKyNkZWZpbmUgQk1DUl9QRE9XTiAgICAgICAgICAgICAgMHgwODAwICAvKiBQb3dlcmRvd24gdGhlIERQODM4NDAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9BTkVOQUJMRSAgICAgICAgICAgMHgxMDAwICAvKiBFbmFibGUgYXV0byBuZWdvdGlhdGlvbiAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAgICAgMHgyMDAwICAvKiBTZWxlY3QgMTAwTWJwcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9MT09QQkFDSyAgICAgICAgICAgMHg0MDAwICAvKiBUWEQgbG9vcGJhY2sgYml0cyAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgICAgICAgICAgMHg4MDAwICAvKiBSZXNldCB0aGUgRFA4Mzg0MCAgICAgICAgICAgKi8KKworLyogQk1TUiBiaXRzICovCisjZGVmaW5lIEJNU1JfRVJDQVAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRXh0LXJlZyBjYXBhYmlsaXR5ICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfSkNEICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSmFiYmVyIGRldGVjdGVkICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfTFNUQVRVUyAgICAgICAgICAgIDB4MDAwNCAgLyogTGluayBzdGF0dXMgICAgICAgICAgICAgICAgICovCisKKy8qIFJpbmcgZGVzY3JpcHRvcnMgYW5kIHN1Y2gsIHNhbWUgYXMgUXVhZCBFdGhlcm5ldC4gKi8KK3N0cnVjdCBiZV9yeGQgeworCXUzMiByeF9mbGFnczsKKwl1MzIgcnhfYWRkcjsKK307CisKKyNkZWZpbmUgUlhEX09XTiAgICAgIDB4ODAwMDAwMDAgLyogT3duZXJzaGlwLiAgICAgICovCisjZGVmaW5lIFJYRF9VUERBVEUgICAweDEwMDAwMDAwIC8qIEJlaW5nIFVwZGF0ZWQ/ICAqLworI2RlZmluZSBSWERfTEVOR1RIICAgMHgwMDAwMDdmZiAvKiBQYWNrZXQgTGVuZ3RoLiAgKi8KKworc3RydWN0IGJlX3R4ZCB7CisJdTMyIHR4X2ZsYWdzOworCXUzMiB0eF9hZGRyOworfTsKKworI2RlZmluZSBUWERfT1dOICAgICAgMHg4MDAwMDAwMCAvKiBPd25lcnNoaXAuICAgICAgKi8KKyNkZWZpbmUgVFhEX1NPUCAgICAgIDB4NDAwMDAwMDAgLyogU3RhcnQgT2YgUGFja2V0ICovCisjZGVmaW5lIFRYRF9FT1AgICAgICAweDIwMDAwMDAwIC8qIEVuZCBPZiBQYWNrZXQgICAqLworI2RlZmluZSBUWERfVVBEQVRFICAgMHgxMDAwMDAwMCAvKiBCZWluZyBVcGRhdGVkPyAgKi8KKyNkZWZpbmUgVFhEX0xFTkdUSCAgIDB4MDAwMDA3ZmYgLyogUGFja2V0IExlbmd0aC4gICovCisKKyNkZWZpbmUgVFhfUklOR19NQVhTSVpFICAgMjU2CisjZGVmaW5lIFJYX1JJTkdfTUFYU0laRSAgIDI1NgorCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgIDI1NgorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAyNTYKKworI2RlZmluZSBORVhUX1JYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFJYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1RYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFRYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1JYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFJYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1RYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFRYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKGJwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoYnApLT50eF9vbGQgPD0gKGJwKS0+dHhfbmV3KSA/ICAgICAgICAgICAgICAgICAgICAgXAorCSAgKGJwKS0+dHhfb2xkICsgKFRYX1JJTkdfU0laRSAtIDEpIC0gKGJwKS0+dHhfbmV3IDogIFwKKwkJCSAgICAoYnApLT50eF9vbGQgLSAoYnApLT50eF9uZXcgLSAxKQorCisKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQgIDI1NgorI2RlZmluZSBSWF9CVUZfQUxMT0NfU0laRSAgKEVUSF9GUkFNRV9MRU4gKyAoNjQgKiAzKSkKKworc3RydWN0IGJtYWNfaW5pdF9ibG9jayB7CisJc3RydWN0IGJlX3J4ZCBiZV9yeGRbUlhfUklOR19NQVhTSVpFXTsKKwlzdHJ1Y3QgYmVfdHhkIGJlX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworI2RlZmluZSBiaWJfb2Zmc2V0KG1lbSwgZWxlbSkgXAorKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgYm1hY19pbml0X2Jsb2NrICopMCktPm1lbVtlbGVtXSkpKSkKKworLyogTm93IHNvZnR3YXJlIHN0YXRlIHN0dWZmLiAqLworZW51bSBiaWdtYWNfdHJhbnNjZWl2ZXIgeworCWV4dGVybmFsID0gMCwKKwlpbnRlcm5hbCA9IDEsCisJbm9uZSAgICAgPSAyLAorfTsKKworLyogVGltZXIgc3RhdGUgZW5naW5lLiAqLworZW51bSBiaWdtYWNfdGltZXJfc3RhdGUgeworCWx0cnl3YWl0ID0gMSwgIC8qIEZvcmNpbmcgdHJ5IG9mIGFsbCBtb2RlcywgZnJvbSBmYXN0ZXN0IHRvIHNsb3dlc3QuICovCisJYXNsZWVwICAgPSAyLCAgLyogVGltZXIgaW5hY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBiaWdtYWMgeworCXZvaWQgX19pb21lbQkqZ3JlZ3M7CS8qIFFFQyBHbG9iYWwgUmVnaXN0ZXJzICAgICAgICAgICAgICAgKi8KKwl2b2lkIF9faW9tZW0JKmNyZWc7CS8qIFFFQyBCaWdNQUMgQ2hhbm5lbCBSZWdpc3RlcnMgICAgICAgKi8KKwl2b2lkIF9faW9tZW0JKmJyZWdzOwkvKiBCaWdNQUMgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICovCisJdm9pZCBfX2lvbWVtCSp0cmVnczsJLyogQmlnTUFDIFRyYW5zY2VpdmVyICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBibWFjX2luaXRfYmxvY2sJKmJtYWNfYmxvY2s7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAqLworCV9fdTMyCQkJIGJibG9ja19kdm1hOwkvKiBSWCBhbmQgVFggZGVzY3JpcHRvcnMgKi8KKworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnJ4X3NrYnNbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnR4X3NrYnNbVFhfUklOR19TSVpFXTsKKworCWludCByeF9uZXcsIHR4X25ldywgcnhfb2xkLCB0eF9vbGQ7CisKKwlpbnQgYm9hcmRfcmV2OwkJCQkvKiBCaWdNQUMgYm9hcmQgcmV2aXNpb24uICAgICAgICAgICAgICovCisKKwllbnVtIGJpZ21hY190cmFuc2NlaXZlcgl0Y3ZyX3R5cGU7CisJdW5zaWduZWQgaW50CQliaWdtYWNfYnVyc3RzOworCXVuc2lnbmVkIGludAkJcGFkZHI7CisJdW5zaWduZWQgc2hvcnQJCXN3X2Jtc3I7ICAgICAgICAgLyogU1cgY29weSBvZiBQSFkgQk1TUiAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQJCXN3X2JtY3I7ICAgICAgICAgLyogU1cgY29weSBvZiBQSFkgQk1DUiAgICAgICAgICAgICAgICovCisJc3RydWN0IHRpbWVyX2xpc3QJYmlnbWFjX3RpbWVyOworCWVudW0gYmlnbWFjX3RpbWVyX3N0YXRlCXRpbWVyX3N0YXRlOworCXVuc2lnbmVkIGludAkJdGltZXJfdGlja3M7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwllbmV0X3N0YXRzOworCXN0cnVjdCBzYnVzX2RldgkJKnFlY19zZGV2OworCXN0cnVjdCBzYnVzX2RldgkJKmJpZ21hY19zZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJc3RydWN0IGJpZ21hYwkJKm5leHRfbW9kdWxlOworfTsKKworLyogV2UgdXNlIHRoaXMgdG8gYWNxdWlyZSByZWNlaXZlIHNrYidzIHRoYXQgd2UgY2FuIERNQSBkaXJlY3RseSBpbnRvLiAqLworI2RlZmluZSBBTElHTkVEX1JYX1NLQl9BRERSKGFkZHIpIFwKKyAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgKDY0IC0gMSkpICYgfig2NCAtIDEpKSAtICh1bnNpZ25lZCBsb25nKShhZGRyKSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqYmlnX21hY19hbGxvY19za2IodW5zaWduZWQgaW50IGxlbmd0aCwgaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIDY0LCBnZnBfZmxhZ3MpOworCWlmKHNrYikgeworCQlpbnQgb2Zmc2V0ID0gQUxJR05FRF9SWF9TS0JfQUREUihza2ItPmRhdGEpOworCisJCWlmKG9mZnNldCkKKwkJCXNrYl9yZXNlcnZlKHNrYiwgb2Zmc2V0KTsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworI2VuZGlmIC8qICEoX1NVTkJNQUNfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2I3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCkBAIC0wLDAgKzEsMTc4NSBAQAorLyogc3VuZGFuY2UuYzogQSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3VuZGFuY2UgU1QyMDEgIkFsdGEiLiAqLworLyoKKwlXcml0dGVuIDE5OTktMjAwMCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3N1bmRhbmNlLmh0bWwKKworCisJVmVyc2lvbiBMSzEuMDFhIChqZ2FyemlrKToKKwktIFJlcGxhY2Ugc29tZSBNSUktcmVsYXRlZCBtYWdpYyBudW1iZXJzIHdpdGggY29uc3RhbnRzCisKKwlWZXJzaW9uIExLMS4wMiAoRC1MaW5rKToKKwktIEFkZCBuZXcgYm9hcmQgdG8gUENJIElEIGxpc3QKKwktIEZpeCBtdWx0aWNhc3QgYnVnCisKKwlWZXJzaW9uIExLMS4wMyAoRC1MaW5rKToKKwktIE5ldyBSeCBzY2hlbWUsIHJlZHVjZSBSeCBjb25nZXN0aW9uCisJLSBPcHRpb24gdG8gZGlzYWJsZSBmbG93IGNvbnRyb2wKKworCVZlcnNpb24gTEsxLjA0IChELUxpbmspOgorCS0gVHggdGltZW91dCByZWNvdmVyeQorCS0gTW9yZSBzdXBwb3J0IGZvciBldGh0b29sLgorCisJVmVyc2lvbiBMSzEuMDRhOgorCS0gUmVtb3ZlIHVudXNlZC9jb25zdGFudCBtZW1iZXJzIGZyb20gc3RydWN0IHBjaV9pZF9pbmZvCisJKHdoaWNoIHRoZW4gYWxsb3dzIHJlbW92YWwgb2YgJ2Rydl9mbGFncycgZnJvbSBwcml2YXRlIHN0cnVjdCkKKwkoamdhcnppaykKKwktIElmIG5vIHBoeSBpcyBmb3VuZCwgZmFpbCB0byBsb2FkIHRoYXQgYm9hcmQgKGpnYXJ6aWspCisJLSBBbHdheXMgc3RhcnQgcGh5IGlkIHNjYW4gYXQgaWQgMSB0byBhdm9pZCBwcm9ibGVtcyAoRG9uYWxkIEJlY2tlcikKKwktIEF1dG9kZXRlY3Qgd2hlcmUgbWlpX3ByZWFibGVfcmVxdWlyZWQgaXMgbmVlZGVkLAorCWRlZmF1bHQgdG8gbm90IG5lZWRlZC4gIChEb25hbGQgQmVja2VyKQorCisJVmVyc2lvbiBMSzEuMDRiOgorCS0gUmVtb3ZlIG1paV9wcmVhbWJsZV9yZXF1aXJlZCBtb2R1bGUgcGFyYW1ldGVyIChEb25hbGQgQmVja2VyKQorCS0gQWRkIHBlci1pbnRlcmZhY2UgbWlpX3ByZWFtYmxlX3JlcXVpcmVkIChzZXR0aW5nIGlzIGF1dG9kZXRlY3RlZCkKKwkgIChEb25hbGQgQmVja2VyKQorCS0gUmVtb3ZlIHVubmVjZXNzYXJ5IGNhc3QgZnJvbSB2b2lkIHBvaW50ZXIgKGpnYXJ6aWspCisJLSBSZS1hbGlnbiBjb21tZW50cyBpbiBwcml2YXRlIHN0cnVjdCAoamdhcnppaykKKworCVZlcnNpb24gTEsxLjA0YyAoamdhcnppayk6CisJLSBTdXBwb3J0IGJpdG1hcHBlZCBtZXNzYWdlIGxldmVscyAoTkVUSUZfTVNHX3h4eCksIGFuZCB0aGUKKwkgIHR3byBldGh0b29sIGlvY3RscyB0aGF0IGdldC9zZXQgdGhlbQorCS0gRG9uJ3QgaGFuZC1jb2RlIE1JSSBldGh0b29sIHN1cHBvcnQsIHVzZSBzdGFuZGFyZCBBUEkvbGliCisKKwlWZXJzaW9uIExLMS4wNGQ6CisJLSBNZXJnZSBmcm9tIERvbmFsZCBCZWNrZXIncyBzdW5kYW5jZS5jOiAoSmFzb24gTHVueikKKwkJKiBwcm9wZXIgc3VwcG9ydCBmb3IgdmFyaWFibHktc2l6ZWQgTVRVcworCQkqIGRlZmF1bHQgdG8gUElPLCB0byBmaXggY2hpcCBidWdzCisJLSBBZGQgbWlzc2luZyB1bnJlZ2lzdGVyX25ldGRldiAoSmFzb24gTHVueikKKwktIEFkZCBDT05GSUdfU1VOREFOQ0VfTU1JTyBjb25maWcgb3B0aW9uIChqZ2FyemlrKQorCS0gQmV0dGVyIHJ4IGJ1ZiBzaXplIGNhbGN1bGF0aW9uIChEb25hbGQgQmVja2VyKQorCisJVmVyc2lvbiBMSzEuMDUgKEQtTGluayk6CisJLSBGaXggREZFLTU4MFRYIHBhY2tldCBkcm9wIGlzc3VlIChmb3IgREwxMDA1MEMpCisJLSBGaXggcmVzZXRfdHggbG9naWMKKworCVZlcnNpb24gTEsxLjA2IChELUxpbmspOgorCS0gRml4IGNyYXNoIHdoaWxlIHVubG9hZGluZyBkcml2ZXIKKworCVZlcnNpbiBMSzEuMDZiIChELUxpbmspOgorCS0gTmV3IHR4IHNjaGVtZSwgYWRhcHRpdmUgdHhfY29hbGVzY2UKKwkKKwlWZXJzaW9uIExLMS4wNyAoRC1MaW5rKToKKwktIEZpeCB0eCBidWdzIGluIGJpZy1lbmRpYW4gbWFjaGluZXMKKwktIFJlbW92ZSB1bnVzZWQgbWF4X2ludGVycnVwdF93b3JrIG1vZHVsZSBwYXJhbWV0ZXIsIHRoZSBuZXcgCisJICBOQVBJLWxpa2Ugcnggc2NoZW1lIGRvZXNuJ3QgbmVlZCBpdC4KKwktIFJlbW92ZSByZWR1bmRhbmN5IGdldF9zdGF0cygpIGluIGludHJfaGFuZGxlcigpLCB0aG9zZSAKKwkgIEkvTyBhY2Nlc3MgY291bGQgYWZmZWN0IHBlcmZvcm1hbmNlIGluIEFSTS1iYXNlZCBzeXN0ZW0KKwktIEFkZCBMaW51eCBzb2Z0d2FyZSBWTEFOIHN1cHBvcnQKKwkKKwlWZXJzaW9uIExLMS4wOCAoRC1MaW5rKToKKwktIEZpeCBidWcgb2YgY3VzdG9tIG1hYyBhZGRyZXNzIAorCShTdGF0aW9uQWRkciByZWdpc3RlciBvbmx5IGFjY2VwdCB3b3JkIHdyaXRlKSAKKworCVZlcnNpb24gTEsxLjA5IChELUxpbmspOgorCS0gRml4IHRoZSBmbG93Y3RybCBidWcuCQorCS0gU2V0IFBhdXNlIGJpdCBpbiBNSUkgQU5BUiBpZiBmbG93IGNvbnRyb2wgZW5hYmxlZC4JCisKKwlWZXJzaW9uIExLMS4wOWEgKElDUGx1cyk6CisJLSBBZGQgdGhlIGRlbGF5IHRpbWUgaW4gcmVhZGluZyB0aGUgY29udGVudHMgb2YgRUVQUk9NCisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJInN1bmRhbmNlIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMStMSzEuMDlhIgorI2RlZmluZSBEUlZfUkVMREFURQkiMTAtSnVsLTIwMDMiCisKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KK3N0YXRpYyBpbnQgZGVidWcgPSAxOwkJCS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gcngtYWxsLW11bHRpY2FzdCkuCisgICBUeXBpY2FsIGlzIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4KKyAgIFRoaXMgY2hpcCBjYW4gcmVjZWl2ZSBpbnRvIG9mZnNldCBidWZmZXJzLCBzbyB0aGUgQWxwaGEgZG9lcyBub3QKKyAgIG5lZWQgYSBjb3B5LWFsaWduLiAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWs7CitzdGF0aWMgaW50IGZsb3djdHJsPTE7CisKKy8qIG1lZGlhW10gc3BlY2lmaWVzIHRoZSBtZWRpYSB0eXBlIHRoZSBOSUMgb3BlcmF0ZXMgYXQuCisJCSBhdXRvc2Vuc2UJQXV0b3NlbnNpbmcgYWN0aXZlIG1lZGlhLgorCQkgMTBtYnBzX2hkIAkxME1icHMgaGFsZiBkdXBsZXguCisJCSAxMG1icHNfZmQgCTEwTWJwcyBmdWxsIGR1cGxleC4KKwkJIDEwMG1icHNfaGQgCTEwME1icHMgaGFsZiBkdXBsZXguCisJCSAxMDBtYnBzX2ZkIAkxMDBNYnBzIGZ1bGwgZHVwbGV4LgorCQkgMAkJQXV0b3NlbnNpbmcgYWN0aXZlIG1lZGlhLgorCQkgMQkgCTEwTWJwcyBoYWxmIGR1cGxleC4KKwkJIDIJIAkxME1icHMgZnVsbCBkdXBsZXguCisJCSAzCSAJMTAwTWJwcyBoYWxmIGR1cGxleC4KKwkJIDQJIAkxMDBNYnBzIGZ1bGwgZHVwbGV4LgorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgKK3N0YXRpYyBjaGFyICptZWRpYVtNQVhfVU5JVFNdOworCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LCBhbmQgbW9yZSB0aGFuIDEyOCByZXF1aXJlcyBtb2RpZnlpbmcgdGhlCisgICBUeCBlcnJvciByZWNvdmVyeS4KKyAgIExhcmdlIHJlY2VpdmUgcmluZ3MgbWVyZWx5IHdhc3RlIG1lbW9yeS4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTMyCisjZGVmaW5lIFRYX1FVRVVFX0xFTgkoVFhfUklOR19TSVpFIC0gMSkgLyogTGltaXQgcmluZyBlbnRyaWVzIGFjdHVhbGx5IHVzZWQuICAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJNjQKKyNkZWZpbmUgUlhfQlVER0VUCTMyCisjZGVmaW5lIFRYX1RPVEFMX1NJWkUJVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJUlhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDQqSFopCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworLyogSW5jbHVkZSBmaWxlcywgZGVzaWduZWQgdG8gc3VwcG9ydCBtb3N0IGtlcm5lbCB2ZXJzaW9ucyAyLjAuMCBhbmQgbGF0ZXIuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2lmbmRlZiBfQ09NUEFUX1dJVEhfT0xEX0tFUk5FTAorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2Vsc2UKKyNpbmNsdWRlICJjcmMzMi5oIgorI2luY2x1ZGUgImV0aHRvb2wuaCIKKyNpbmNsdWRlICJtaWkuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNlbmRpZgorCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorS0VSTl9JTkZPIERSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAgV3JpdHRlbiBieSBEb25hbGQgQmVja2VyXG4iCitLRVJOX0lORk8gIiAgaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9zdW5kYW5jZS5odG1sXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW5kYW5jZSBBbHRhIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZmxvd2N0cmwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU3VuZGFuY2UgQWx0YSBkZWJ1ZyBsZXZlbCAoMC01KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJTdW5kYW5jZSBBbHRhIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKGZsb3djdHJsLCAiU3VuZGFuY2UgQWx0YSBmbG93IGNvbnRyb2wgWzB8MV0iKTsKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBTdW5kYW5jZSBUZWNobm9sb2dpZXMgIkFsdGEiIFNUMjAxIGNoaXAuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK1RoaXMgZHJpdmVyIHVzZXMgdHdvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGZpeGVkLXNpemUgZGVzY3JpcHRvciBsaXN0cworZm9ybWVkIGludG8gcmluZ3MgYnkgYSBicmFuY2ggZnJvbSB0aGUgZmluYWwgZGVzY3JpcHRvciB0byB0aGUgYmVnaW5uaW5nIG9mCit0aGUgbGlzdC4gIFRoZSByaW5nIHNpemVzIGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4KK1NvbWUgY2hpcHMgZXhwbGljaXRseSB1c2Ugb25seSAyXk4gc2l6ZWQgcmluZ3MsIHdoaWxlIG90aGVycyB1c2UgYQorJ25leHQgZGVzY3JpcHRvcicgcG9pbnRlciB0aGF0IHRoZSBkcml2ZXIgZm9ybXMgaW50byByaW5ncy4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciB1c2VzIGEgemVyby1jb3B5IHJlY2VpdmUgYW5kIHRyYW5zbWl0IHNjaGVtZS4KK1RoZSBkcml2ZXIgYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0CitvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlIGNoaXAgYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2suICBCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZnMgaW4gYSBsYXRlciBwaGFzZSBvZiByZWNlaXZlcy4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgTmV3IGJvYXJkcyBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gZ2VuZXJvdXNseSBjb25maWd1cmVkIG1hY2hpbmVzCithbmQgdGhlIHVuZGVyZmlsbGVkIGJ1ZmZlcnMgaGF2ZSBuZWdsaWdpYmxlIGltcGFjdCBjb21wYXJlZCB0byB0aGUgYmVuZWZpdCBvZgorYSBzaW5nbGUgYWxsb2NhdGlvbiBzaXplLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIHJlc3VsdHMgaW4gbmV2ZXIKK2NvcHlpbmcgcGFja2V0cy4gIFdoZW4gY29weWluZyBpcyBkb25lLCB0aGUgY29zdCBpcyB1c3VhbGx5IG1pdGlnYXRlZCBieSB1c2luZworYSBjb21iaW5lZCBjb3B5L2NoZWNrc3VtIHJvdXRpbmUuICBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK0Egc3VidGxlIGFzcGVjdCBvZiB0aGUgb3BlcmF0aW9uIGlzIHRoYXQgdGhlIElQIGhlYWRlciBhdCBvZmZzZXQgMTQgaW4gYW4KK2V0aGVybmV0IGZyYW1lIGlzbid0IGxvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KK1VuYWxpZ25lZCBidWZmZXJzIGFyZSBwZXJtaXR0ZWQgYnkgdGhlIFN1bmRhbmNlIGhhcmR3YXJlLCBzbworZnJhbWVzIGFyZSByZWNlaXZlZCBpbnRvIHRoZSBza2J1ZmYgYXQgYW4gb2Zmc2V0IG9mICIrMiIsIDE2LWJ5dGUgYWxpZ25pbmcKK3RoZSBJUCBoZWFkZXIuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGludGVycnVwdCBoYW5kbGluZyBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAnbHAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWZmIHRoZSAnbHAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdAorY2xlYXJzIGJvdGggdGhlIHR4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCitJVi4gTm90ZXMKKworSVZiLiBSZWZlcmVuY2VzCisKK1RoZSBTdW5kYW5jZSBTVDIwMSBkYXRhc2hlZXQsIHByZWxpbWluYXJ5IHZlcnNpb24uCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy8xMDBtYnBzLmh0bWwKK2h0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9taXNjL05XYXkuaHRtbAorCitJVmMuIEVycmF0YQorCisqLworCisvKiBXb3JrLWFyb3VuZCBmb3IgS2VuZGluIGNoaXAgYnVncy4gKi8KKyNpZm5kZWYgQ09ORklHX1NVTkRBTkNFX01NSU8KKyNkZWZpbmUgVVNFX0lPX09QUyAxCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN1bmRhbmNlX3BjaV90YmxbXSA9IHsKKwl7MHgxMTg2LCAweDEwMDIsIDB4MTE4NiwgMHgxMDAyLCAwLCAwLCAwfSwKKwl7MHgxMTg2LCAweDEwMDIsIDB4MTE4NiwgMHgxMDAzLCAwLCAwLCAxfSwKKwl7MHgxMTg2LCAweDEwMDIsIDB4MTE4NiwgMHgxMDEyLCAwLCAwLCAyfSwKKwl7MHgxMTg2LCAweDEwMDIsIDB4MTE4NiwgMHgxMDQwLCAwLCAwLCAzfSwKKwl7MHgxMTg2LCAweDEwMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXsweDEzRjAsIDB4MDIwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdW5kYW5jZV9wY2lfdGJsKTsKKworZW51bSB7CisJbmV0ZGV2X2lvX3NpemUgPSAxMjgKK307CisKK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9Oworc3RhdGljIHN0cnVjdCBwY2lfaWRfaW5mbyBwY2lfaWRfdGJsW10gPSB7CisJeyJELUxpbmsgREZFLTU1MFRYIEZBU1QgRXRoZXJuZXQgQWRhcHRlciJ9LAorCXsiRC1MaW5rIERGRS01NTBGWCAxMDBNYnBzIEZpYmVyLW9wdGljcyBBZGFwdGVyIn0sCisJeyJELUxpbmsgREZFLTU4MFRYIDQgcG9ydCBTZXJ2ZXIgQWRhcHRlciJ9LAorCXsiRC1MaW5rIERGRS01MzBUWFMgRkFTVCBFdGhlcm5ldCBBZGFwdGVyIn0sCisJeyJELUxpbmsgREwxMDA1MC1iYXNlZCBGQVNUIEV0aGVybmV0IEFkYXB0ZXIifSwKKwl7IlN1bmRhbmNlIFRlY2hub2xvZ3kgQWx0YSJ9LAorCXtOVUxMLH0sCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCisvKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSwgaG93ZXZlciB4ODYtb3JpZW50ZWQKKyAgIGhhcmR3YXJlIG9mdGVuIHVzZXMgSS9PIHNwYWNlIGFjY2Vzc2VzLiAqLworCisvKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLgorICAgVW5saWtlIHNvZnR3YXJlLW9ubHkgc3lzdGVtcywgZGV2aWNlIGRyaXZlcnMgaW50ZXJhY3Qgd2l0aCBjb21wbGV4IGhhcmR3YXJlLgorICAgSXQncyBub3QgdXNlZnVsIHRvIGRlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3IgZXZlcnkgcmVnaXN0ZXIgYml0IGluIHRoZQorICAgZGV2aWNlLiAgVGhlIG5hbWUgY2FuIG9ubHkgcGFydGlhbGx5IGRvY3VtZW50IHRoZSBzZW1hbnRpY3MgYW5kIG1ha2UKKyAgIHRoZSBkcml2ZXIgbG9uZ2VyIGFuZCBtb3JlIGRpZmZpY3VsdCB0byByZWFkLgorICAgSW4gZ2VuZXJhbCwgb25seSB0aGUgaW1wb3J0YW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9yIGJpdHMgY2hhbmdlZAorICAgbXVsdGlwbGUgdGltZXMgc2hvdWxkIGJlIGRlZmluZWQgc3ltYm9saWNhbGx5LgorKi8KK2VudW0gYWx0YV9vZmZzZXRzIHsKKwlETUFDdHJsID0gMHgwMCwKKwlUeExpc3RQdHIgPSAweDA0LAorCVR4RE1BQnVyc3RUaHJlc2ggPSAweDA4LAorCVR4RE1BVXJnZW50VGhyZXNoID0gMHgwOSwKKwlUeERNQVBvbGxQZXJpb2QgPSAweDBhLAorCVJ4RE1BU3RhdHVzID0gMHgwYywKKwlSeExpc3RQdHIgPSAweDEwLAorCURlYnVnQ3RybDAgPSAweDFhLAorCURlYnVnQ3RybDEgPSAweDFjLAorCVJ4RE1BQnVyc3RUaHJlc2ggPSAweDE0LAorCVJ4RE1BVXJnZW50VGhyZXNoID0gMHgxNSwKKwlSeERNQVBvbGxQZXJpb2QgPSAweDE2LAorCUxFREN0cmwgPSAweDFhLAorCUFTSUNDdHJsID0gMHgzMCwKKwlFRURhdGEgPSAweDM0LAorCUVFQ3RybCA9IDB4MzYsCisJVHhTdGFydFRocmVzaCA9IDB4M2MsCisJUnhFYXJseVRocmVzaCA9IDB4M2UsCisJRmxhc2hBZGRyID0gMHg0MCwKKwlGbGFzaERhdGEgPSAweDQ0LAorCVR4U3RhdHVzID0gMHg0NiwKKwlUeEZyYW1lSWQgPSAweDQ3LAorCURvd25Db3VudGVyID0gMHgxOCwKKwlJbnRyQ2xlYXIgPSAweDRhLAorCUludHJFbmFibGUgPSAweDRjLAorCUludHJTdGF0dXMgPSAweDRlLAorCU1BQ0N0cmwwID0gMHg1MCwKKwlNQUNDdHJsMSA9IDB4NTIsCisJU3RhdGlvbkFkZHIgPSAweDU0LAorCU1heEZyYW1lU2l6ZSA9IDB4NUEsCisJUnhNb2RlID0gMHg1YywKKwlNSUlDdHJsID0gMHg1ZSwKKwlNdWx0aWNhc3RGaWx0ZXIwID0gMHg2MCwKKwlNdWx0aWNhc3RGaWx0ZXIxID0gMHg2NCwKKwlSeE9jdGV0c0xvdyA9IDB4NjgsCisJUnhPY3RldHNIaWdoID0gMHg2YSwKKwlUeE9jdGV0c0xvdyA9IDB4NmMsCisJVHhPY3RldHNIaWdoID0gMHg2ZSwKKwlUeEZyYW1lc09LID0gMHg3MCwKKwlSeEZyYW1lc09LID0gMHg3MiwKKwlTdGF0c0NhcnJpZXJFcnJvciA9IDB4NzQsCisJU3RhdHNMYXRlQ29sbCA9IDB4NzUsCisJU3RhdHNNdWx0aUNvbGwgPSAweDc2LAorCVN0YXRzT25lQ29sbCA9IDB4NzcsCisJU3RhdHNUeERlZmVyID0gMHg3OCwKKwlSeE1pc3NlZCA9IDB4NzksCisJU3RhdHNUeFhTRGVmZXIgPSAweDdhLAorCVN0YXRzVHhBYm9ydCA9IDB4N2IsCisJU3RhdHNCY2FzdFR4ID0gMHg3YywKKwlTdGF0c0JjYXN0UnggPSAweDdkLAorCVN0YXRzTWNhc3RUeCA9IDB4N2UsCisJU3RhdHNNY2FzdFJ4ID0gMHg3ZiwKKwkvKiBBbGlhc2VkIGFuZCBib2d1cyB2YWx1ZXMhICovCisJUnhTdGF0dXMgPSAweDBjLAorfTsKK2VudW0gQVNJQ0N0cmxfSGlXb3JkX2JpdCB7CisJR2xvYmFsUmVzZXQgPSAweDAwMDEsCisJUnhSZXNldCA9IDB4MDAwMiwKKwlUeFJlc2V0ID0gMHgwMDA0LAorCURNQVJlc2V0ID0gMHgwMDA4LAorCUZJRk9SZXNldCA9IDB4MDAxMCwKKwlOZXR3b3JrUmVzZXQgPSAweDAwMjAsCisJSG9zdFJlc2V0ID0gMHgwMDQwLAorCVJlc2V0QnVzeSA9IDB4MDQwMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCUludHJTdW1tYXJ5PTB4MDAwMSwgSW50clBDSUVycj0weDAwMDIsIEludHJNQUNDdHJsPTB4MDAwOCwKKwlJbnRyVHhEb25lPTB4MDAwNCwgSW50clJ4RG9uZT0weDAwMTAsIEludHJSeFN0YXJ0PTB4MDAyMCwKKwlJbnRyRHJ2UnFzdD0weDAwNDAsCisJU3RhdHNNYXg9MHgwMDgwLCBMaW5rQ2hhbmdlPTB4MDEwMCwKKwlJbnRyVHhETUFEb25lPTB4MDIwMCwgSW50clJ4RE1BRG9uZT0weDA0MDAsCit9OworCisvKiBCaXRzIGluIHRoZSBSeE1vZGUgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQWNjZXB0QWxsSVBNdWx0aT0weDIwLCBBY2NlcHRNdWx0aUhhc2g9MHgxMCwgQWNjZXB0QWxsPTB4MDgsCisJQWNjZXB0QnJvYWRjYXN0PTB4MDQsIEFjY2VwdE11bHRpY2FzdD0weDAyLCBBY2NlcHRNeVBoeXM9MHgwMSwKK307CisvKiBCaXRzIGluIE1BQ0N0cmwuICovCitlbnVtIG1hY19jdHJsMF9iaXRzIHsKKwlFbmJGdWxsRHVwbGV4PTB4MjAsIEVuYlJjdkxhcmdlRnJhbWU9MHg0MCwKKwlFbmJGbG93Q3RybD0weDEwMCwgRW5iUGFzc1J4Q1JDPTB4MjAwLAorfTsKK2VudW0gbWFjX2N0cmwxX2JpdHMgeworCVN0YXRzRW5hYmxlPTB4MDAyMCwJU3RhdHNEaXNhYmxlPTB4MDA0MCwgU3RhdHNFbmFibGVkPTB4MDA4MCwKKwlUeEVuYWJsZT0weDAxMDAsIFR4RGlzYWJsZT0weDAyMDAsIFR4RW5hYmxlZD0weDA0MDAsCisJUnhFbmFibGU9MHgwODAwLCBSeERpc2FibGU9MHgxMDAwLCBSeEVuYWJsZWQ9MHgyMDAwLAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCisvKiBOb3RlIHRoYXQgdXNpbmcgb25seSAzMiBiaXQgZmllbGRzIHNpbXBsaWZpZXMgY29udmVyc2lvbiB0byBiaWctZW5kaWFuCisgICBhcmNoaXRlY3R1cmVzLiAqLworc3RydWN0IG5ldGRldl9kZXNjIHsKKwl1MzIgbmV4dF9kZXNjOworCXUzMiBzdGF0dXM7CisJc3RydWN0IGRlc2NfZnJhZyB7IHUzMiBhZGRyLCBsZW5ndGg7IH0gZnJhZ1sxXTsKK307CisKKy8qIEJpdHMgaW4gbmV0ZGV2X2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworCURlc2NPd249MHg4MDAwLAorCURlc2NFbmRQYWNrZXQ9MHg0MDAwLAorCURlc2NFbmRSaW5nPTB4MjAwMCwKKwlMYXN0RnJhZz0weDgwMDAwMDAwLAorCURlc2NJbnRyT25UeD0weDgwMDAsCisJRGVzY0ludHJPbkRNQURvbmU9MHg4MDAwMDAwMCwKKwlEaXNhYmxlQWxpZ24gPSAweDAwMDAwMDAxLAorfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTE1IAkvKiBSZXF1aXJlZCBhbGlnbm1lbnQgbWFzayAqLworLyogVXNlICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkIChMMV9DQUNIRV9CWVRFUykpKSAgdG8gbWFpbnRhaW4gYWxpZ25tZW50CisgICB3aXRoaW4gdGhlIHN0cnVjdHVyZS4gKi8KKyNkZWZpbmUgTUlJX0NOVAkJNAorc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQuICovCisJc3RydWN0IG5ldGRldl9kZXNjICpyeF9yaW5nOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworICAgICAgICBkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworICAgICAgICBkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJLyogTWVkaWEgbW9uaXRvcmluZyB0aW1lci4gKi8KKwkvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCByeF9sb2NrOwkJCS8qIEdyb3VwIHdpdGggVHggY29udHJvbCBjYWNoZSBsaW5lLiAqLworCWludCBtc2dfZW5hYmxlOworCWludCBjaGlwX2lkOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJc3RydWN0IG5ldGRldl9kZXNjICpsYXN0X3R4OwkJLyogTGFzdCBUeCBkZXNjcmlwdG9yIHVzZWQuICovCisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJLyogVGhlc2UgdmFsdWVzIGFyZSBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2NlaXZlci9tZWRpYSBpbiB1c2UuICovCisJdW5zaWduZWQgaW50IGZsb3djdHJsOjE7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IGFuX2VuYWJsZToxOworCXVuc2lnbmVkIGludCBzcGVlZDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFza2xldDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhfdGFza2xldDsKKwlpbnQgYnVkZ2V0OworCWludCBjdXJfdGFzazsKKwkvKiBNdWx0aWNhc3QgYW5kIHJlY2VpdmUgbW9kZS4gKi8KKwlzcGlubG9ja190IG1jYXN0bG9jazsJCQkvKiBTTVAgbG9jayBtdWx0aWNhc3QgdXBkYXRlcy4gKi8KKwl1MTYgbWNhc3RfZmlsdGVyWzRdOworCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CisJaW50IG1paV9wcmVhbWJsZV9yZXF1aXJlZDsKKwl1bnNpZ25lZCBjaGFyIHBoeXNbTUlJX0NOVF07CQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcywgb25seSBmaXJzdCBvbmUgdXNlZC4gKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgY2hhciBwY2lfcmV2X2lkOworfTsKKworLyogVGhlIHN0YXRpb24gYWRkcmVzcyBsb2NhdGlvbiBpbiB0aGUgRUVQUk9NLiAqLworI2RlZmluZSBFRVBST01fU0FfT0ZGU0VUCTB4MTAKKyNkZWZpbmUgREVGQVVMVF9JTlRSIChJbnRyUnhETUFEb25lIHwgSW50clBDSUVyciB8IFwKKwkJCUludHJEcnZScXN0IHwgSW50clR4RG9uZSB8IFN0YXRzTWF4IHwgXAorCQkJTGlua0NoYW5nZSkKKworc3RhdGljIGludCAgY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgaW50ICBlZXByb21fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgIG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50ICBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByZXNldF90eCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgcnhfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgdHhfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcmVmaWxsX3J4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIHZvaWQgbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgX19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCAgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wczsKKworc3RhdGljIGludCBfX2RldmluaXQgc3VuZGFuY2VfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlzdGF0aWMgaW50IGNhcmRfaWR4OworCWludCBjaGlwX2lkeCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IGlycTsKKwlpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl1MTYgbWlpX2N0bDsKKwl2b2lkICpyaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisjaWZkZWYgVVNFX0lPX09QUworCWludCBiYXIgPSAwOworI2Vsc2UKKwlpbnQgYmFyID0gMTsKKyNlbmRpZgorCisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlycSA9IHBkZXYtPmlycTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqbnApKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX291dF9uZXRkZXY7CisKKwlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFyLCBuZXRkZXZfaW9fc2l6ZSk7CisJaWYgKCFpb2FkZHIpCisJCWdvdG8gZXJyX291dF9yZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0KKwkJCWxlMTZfdG9fY3B1KGVlcHJvbV9yZWFkKGlvYWRkciwgaSArIEVFUFJPTV9TQV9PRkZTRVQpKTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5iYXNlID0gaW9hZGRyOworCW5wLT5wY2lfZGV2ID0gcGRldjsKKwlucC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCW5wLT5tc2dfZW5hYmxlID0gKDEgPDwgZGVidWcpIC0gMTsKKwlzcGluX2xvY2tfaW5pdCgmbnAtPmxvY2spOworCXRhc2tsZXRfaW5pdCgmbnAtPnJ4X3Rhc2tsZXQsIHJ4X3BvbGwsICh1bnNpZ25lZCBsb25nKWRldik7CisJdGFza2xldF9pbml0KCZucC0+dHhfdGFza2xldCwgdHhfcG9sbCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCW5wLT50eF9yaW5nID0gKHN0cnVjdCBuZXRkZXZfZGVzYyAqKXJpbmdfc3BhY2U7CisJbnAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF90eDsKKwlucC0+cnhfcmluZyA9IChzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJbnAtPm1paV9pZi5kZXYgPSBkZXY7CisJbnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJbnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlucC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlucC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+Y2hhbmdlX210dSA9ICZjaGFuZ2VfbXR1OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmbnAtPnBjaV9yZXZfaWQpOworCisJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChpKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfcng7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXAsICIsCisJCSAgIGRldi0+bmFtZSwgcGNpX2lkX3RibFtjaGlwX2lkeF0ubmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCisJaWYgKDEpIHsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCW5wLT5waHlzWzBdID0gMTsJCS8qIERlZmF1bHQgc2V0dGluZyAqLworCQlucC0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7CisJCWZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IE1JSV9DTlQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0JNU1IpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICAmJiAgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCQlucC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCQkJCW5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQkJCWlmICgobWlpX3N0YXR1cyAmIDB4MDA0MCkgPT0gMCkKKwkJCQkJbnAtPm1paV9wcmVhbWJsZV9yZXF1aXJlZCsrOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiCisJCQkJCSAgICIweCU0LjR4IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwaHksIG1paV9zdGF0dXMsIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCW5wLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQtLTsKKworCQlpZiAocGh5X2lkeCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gTUlJIHRyYW5zY2VpdmVyIGZvdW5kLCBhYm9ydGluZy4gIEFTSUMgc3RhdHVzICV4XG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpKTsKKwkJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyOworCQl9CisKKwkJbnAtPm1paV9pZi5waHlfaWQgPSBucC0+cGh5c1swXTsKKwl9CisKKwkvKiBQYXJzZSBvdmVycmlkZSBjb25maWd1cmF0aW9uICovCisJbnAtPmFuX2VuYWJsZSA9IDE7CisJaWYgKGNhcmRfaWR4IDwgTUFYX1VOSVRTKSB7CisJCWlmIChtZWRpYVtjYXJkX2lkeF0gIT0gTlVMTCkgeworCQkJbnAtPmFuX2VuYWJsZSA9IDA7CisJCQlpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMDBtYnBzX2ZkIikgPT0gMCB8fAorCQkJICAgIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiNCIpID09IDApIHsKKwkJCQlucC0+c3BlZWQgPSAxMDA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTAwbWJwc19oZCIpID09IDAKKwkJCQkgICB8fCBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjMiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwbWJwc19mZCIpID09IDAgfHwKKwkJCQkgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjIiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTBtYnBzX2hkIikgPT0gMCB8fAorCQkJCSAgIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMSIpID09IDApIHsKKwkJCQlucC0+c3BlZWQgPSAxMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPmFuX2VuYWJsZSA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGZsb3djdHJsID09IDEpCisJCQlucC0+Zmxvd2N0cmwgPSAxOworCX0KKworCS8qIEZpYnJlIFBIWT8gKi8KKwlpZiAoaW9yZWFkMzIgKGlvYWRkciArIEFTSUNDdHJsKSAmIDB4ODApIHsKKwkJLyogRGVmYXVsdCAxMDBNYnBzIEZ1bGwgKi8KKwkJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCQkJbnAtPmFuX2VuYWJsZSA9IDA7CisJCX0KKwl9CisJLyogUmVzZXQgUEhZICovCisJbWRpb193cml0ZSAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCW1kZWxheSAoMzAwKTsKKwkvKiBJZiBmbG93IGNvbnRyb2wgZW5hYmxlZCwgd2UgbmVlZCB0byBhZHZlcnRpc2UgaXQuKi8KKwlpZiAobnAtPmZsb3djdHJsKQorCQltZGlvX3dyaXRlIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFLCBucC0+bWlpX2lmLmFkdmVydGlzaW5nIHwgMHgwNDAwKTsKKwltZGlvX3dyaXRlIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUiwgQk1DUl9BTkVOQUJMRXxCTUNSX0FOUkVTVEFSVCk7CisJLyogRm9yY2UgbWVkaWEgdHlwZSAqLworCWlmICghbnAtPmFuX2VuYWJsZSkgeworCQltaWlfY3RsID0gMDsKKwkJbWlpX2N0bCB8PSAobnAtPnNwZWVkID09IDEwMCkgPyBCTUNSX1NQRUVEMTAwIDogMDsKKwkJbWlpX2N0bCB8PSAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkgPyBCTUNSX0ZVTExEUExYIDogMDsKKwkJbWRpb193cml0ZSAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IsIG1paV9jdGwpOworCQlwcmludGsgKEtFUk5fSU5GTyAiT3ZlcnJpZGUgc3BlZWQ9JWQsICVzIGR1cGxleFxuIiwKKwkJCW5wLT5zcGVlZCwgbnAtPm1paV9pZi5mdWxsX2R1cGxleCA/ICJGdWxsIiA6ICJIYWxmIik7CisKKwl9CisKKwkvKiBQZXJoYXBzIG1vdmUgdGhlIHJlc2V0IGhlcmU/ICovCisJLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4gKi8KKwlpZiAobmV0aWZfbXNnX2h3KG5wKSkKKwkJcHJpbnRrKCJBU0lDIENvbnRyb2wgaXMgJXguXG4iLCBpb3JlYWQzMihpb2FkZHIgKyBBU0lDQ3RybCkpOworCWlvd3JpdGUxNigweDAwN2YsIGlvYWRkciArIEFTSUNDdHJsICsgMik7CisJaWYgKG5ldGlmX21zZ19odyhucCkpCisJCXByaW50aygiQVNJQyBDb250cm9sIGlzIG5vdyAleC5cbiIsIGlvcmVhZDMyKGlvYWRkciArIEFTSUNDdHJsKSk7CisKKwljYXJkX2lkeCsrOworCXJldHVybiAwOworCitlcnJfb3V0X3VucmVnaXN0ZXI6CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKK2Vycl9vdXRfdW5tYXBfcng6CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsIG5wLT5yeF9yaW5nX2RtYSk7CitlcnJfb3V0X3VubWFwX3R4OgorICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLCBucC0+dHhfcmluZ19kbWEpOworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X25ldGRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBjaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IDgxOTEpKSAvKiBTZXQgYnkgUnhETUFGcmFtZUxlbiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBlZXByb21fZGVsYXkoZWVfYWRkcikJaW9yZWFkMzIoZWVfYWRkcikKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZXByb21fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBib2d1c2NudCA9IDEwMDAwOwkJLyogVHlwaWNhbCAxOTAwIHRpY2tzLiAqLworCWlvd3JpdGUxNigweDAyMDAgfCAobG9jYXRpb24gJiAweGZmKSwgaW9hZGRyICsgRUVDdHJsKTsKKwlkbyB7CisJCWVlcHJvbV9kZWxheShpb2FkZHIgKyBFRUN0cmwpOworCQlpZiAoISAoaW9yZWFkMTYoaW9hZGRyICsgRUVDdHJsKSAmIDB4ODAwMCkpIHsKKwkJCXJldHVybiBpb3JlYWQxNihpb2FkZHIgKyBFRURhdGEpOworCQl9CisJfSB3aGlsZSAoLS1ib2d1c2NudCA+IDApOworCXJldHVybiAwOworfQorCisvKiAgTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKwlSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisJTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKwlmb3IgZGV0YWlscy4KKworCVRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKwltZXQgYnkgYmFjay10by1iYWNrIDMzTWh6IFBDSSBjeWNsZXMuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpb3JlYWQ4KG1kaW9fYWRkcikKKworZW51bSBtaWlfcmVnX2JpdHMgeworCU1ESU9fU2hpZnRDbGs9MHgwMDAxLCBNRElPX0RhdGE9MHgwMDAyLCBNRElPX0VuYk91dHB1dD0weDAwMDQsCit9OworI2RlZmluZSBNRElPX0VuYkluICAoMCkKKyNkZWZpbmUgTURJT19XUklURTAgKE1ESU9fRW5iT3V0cHV0KQorI2RlZmluZSBNRElPX1dSSVRFMSAoTURJT19EYXRhIHwgTURJT19FbmJPdXRwdXQpCisKKy8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCisgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmModm9pZCBfX2lvbWVtICptZGlvX2FkZHIpCit7CisJaW50IGJpdHMgPSAzMjsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwl3aGlsZSAoLS1iaXRzID49IDApIHsKKwkJaW93cml0ZTgoTURJT19XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTgoTURJT19XUklURTEgfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptZGlvX2FkZHIgPSBucC0+YmFzZSArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlpZiAobnAtPm1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlOChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGU4KGRhdGF2YWwgfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisJZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwkJaW93cml0ZTgoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQ4KG1kaW9fYWRkcikgJiBNRElPX0RhdGEpID8gMSA6IDApOworCQlpb3dyaXRlOChNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptZGlvX2FkZHIgPSBucC0+YmFzZSArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCB2YWx1ZTsKKwlpbnQgaTsKKworCWlmIChucC0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlOChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGU4KGRhdGF2YWwgfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworCWZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwkJaW93cml0ZTgoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlOChNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCBpOworCisJLyogRG8gd2UgbmVlZCB0byByZXNldCB0aGUgY2hpcD8/PyAqLworCisJaSA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaW50cl9oYW5kbGVyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKQorCQlyZXR1cm4gaTsKKworCWlmIChuZXRpZl9tc2dfaWZ1cChucCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbmV0ZGV2X29wZW4oKSBpcnEgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJaW5pdF9yaW5nKGRldik7CisKKwlpb3dyaXRlMzIobnAtPnJ4X3JpbmdfZG1hLCBpb2FkZHIgKyBSeExpc3RQdHIpOworCS8qIFRoZSBUeCBsaXN0IHBvaW50ZXIgaXMgd3JpdHRlbiBhcyBwYWNrZXRzIGFyZSBxdWV1ZWQuICovCisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwlfX3NldF9tYWNfYWRkcihkZXYpOworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCWlvd3JpdGUxNihkZXYtPm10dSArIDE4LCBpb2FkZHIgKyBNYXhGcmFtZVNpemUpOworI2Vsc2UKKwlpb3dyaXRlMTYoZGV2LT5tdHUgKyAxNCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKKyNlbmRpZgorCWlmIChkZXYtPm10dSA+IDIwNDcpCisJCWlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIgKyBBU0lDQ3RybCkgfCAweDBDLCBpb2FkZHIgKyBBU0lDQ3RybCk7CisKKwkvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuICovCisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IG5wLT5kZWZhdWx0X3BvcnQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbnAtPm1jYXN0bG9jayk7CisKKwlzZXRfcnhfbW9kZShkZXYpOworCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlpb3dyaXRlMTYoMCwgaW9hZGRyICsgRG93bkNvdW50ZXIpOworCS8qIFNldCB0aGUgY2hpcCB0byBwb2xsIGV2ZXJ5IE4qMzIwbnNlYy4gKi8KKwlpb3dyaXRlOCgxMDAsIGlvYWRkciArIFJ4RE1BUG9sbFBlcmlvZCk7CisJaW93cml0ZTgoMTI3LCBpb2FkZHIgKyBUeERNQVBvbGxQZXJpb2QpOworCS8qIEZpeCBERkUtNTgwVFggcGFja2V0IGRyb3AgaXNzdWUgKi8KKwlpZiAobnAtPnBjaV9yZXZfaWQgPj0gMHgxNCkKKwkJaW93cml0ZTgoMHgwMSwgaW9hZGRyICsgRGVidWdDdHJsMSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCWlvd3JpdGUxNiAoU3RhdHNFbmFibGUgfCBSeEVuYWJsZSB8IFR4RW5hYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgbmV0ZGV2X29wZW4oKSwgc3RhdHVzOiBSeCAleCBUeCAleCAiCisJCQkgICAiTUFDIENvbnRyb2wgJXgsICU0LjR4ICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgUnhTdGF0dXMpLCBpb3JlYWQ4KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIE1BQ0N0cmwwKSwKKwkJCSAgIGlvcmVhZDE2KGlvYWRkciArIE1BQ0N0cmwxKSwgaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDApKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZucC0+dGltZXIpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDMqSFo7CisJbnAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJbnAtPnRpbWVyLmZ1bmN0aW9uID0gJm5ldGRldl90aW1lcjsJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmbnAtPnRpbWVyKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNihERUZBVUxUX0lOVFIsIGlvYWRkciArIEludHJFbmFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IG1paV9scGEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0xQQSk7CisJaW50IG5lZ290aWF0ZWQgPSBtaWlfbHBhICYgbnAtPm1paV9pZi5hZHZlcnRpc2luZzsKKwlpbnQgZHVwbGV4OworCisJLyogRm9yY2UgbWVkaWEgKi8KKwlpZiAoIW5wLT5hbl9lbmFibGUgfHwgbWlpX2xwYSA9PSAweGZmZmYpIHsKKwkJaWYgKG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpCisJCQlpb3dyaXRlMTYgKGlvcmVhZDE2IChpb2FkZHIgKyBNQUNDdHJsMCkgfCBFbmJGdWxsRHVwbGV4LAorCQkJCWlvYWRkciArIE1BQ0N0cmwwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEF1dG9uZWdvdGlhdGlvbiAqLworCWR1cGxleCA9IChuZWdvdGlhdGVkICYgMHgwMTAwKSB8fCAobmVnb3RpYXRlZCAmIDB4MDFDMCkgPT0gMHgwMDQwOworCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkgeworCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCQlpZiAobmV0aWZfbXNnX2xpbmsobnApKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSAjJWQgIgorCQkJCSAgICJuZWdvdGlhdGVkIGNhcGFiaWxpdHkgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkJICAgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLCBucC0+cGh5c1swXSwgbmVnb3RpYXRlZCk7CisJCWlvd3JpdGUxNihpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMCkgfCBkdXBsZXggPyAweDIwIDogMCwgaW9hZGRyICsgTUFDQ3RybDApOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCBuZXh0X3RpY2sgPSAxMCpIWjsKKworCWlmIChuZXRpZl9tc2dfdGltZXIobnApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2ssIGludHIgc3RhdHVzICU0LjR4LCAiCisJCQkgICAiVHggJXggUnggJXguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyRW5hYmxlKSwKKwkJCSAgIGlvcmVhZDgoaW9hZGRyICsgVHhTdGF0dXMpLCBpb3JlYWQzMihpb2FkZHIgKyBSeFN0YXR1cykpOworCX0KKwljaGVja19kdXBsZXgoZGV2KTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXRhc2tsZXRfZGlzYWJsZSgmbnAtPnR4X3Rhc2tsZXQpOworCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0LCBUeFN0YXR1cyAlMi4yeCAiCisJCSAgICJUeEZyYW1lSWQgJTIuMngsIgorCQkgICAiIHJlc2V0dGluZy4uLlxuIiwgZGV2LT5uYW1lLCBpb3JlYWQ4KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJICAgaW9yZWFkOChpb2FkZHIgKyBUeEZyYW1lSWQpKTsKKworCXsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAlMDhsbHggJTA4eCAlMDh4KCUwMngpICUwOHggJTA4eFxuIiwgaSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKShucC0+dHhfcmluZ19kbWEgKyBpKnNpemVvZigqbnAtPnR4X3JpbmcpKSwKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MpLAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLnN0YXR1cyksCisJCQkJKGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLnN0YXR1cykgPj4gMikgJiAweGZmLAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLmZyYWdbMF0uYWRkciksIAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoKSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlR4TGlzdFB0cj0lMDh4IG5ldGlmX3F1ZXVlX3N0b3BwZWQ9JWRcbiIsIAorCQkJaW9yZWFkMzIobnAtPmJhc2UgKyBUeExpc3RQdHIpLCAKKwkJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfdHg9JWQoJTAyeCkgZGlydHlfdHg9JWQoJTAyeClcbiIsIAorCQkJbnAtPmN1cl90eCwgbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRSwKKwkJCW5wLT5kaXJ0eV90eCwgbnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl9yeD0lZCBkaXJ0eV9yeD0lZFxuIiwgbnAtPmN1cl9yeCwgbnAtPmRpcnR5X3J4KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl90YXNrPSVkXG4iLCBucC0+Y3VyX3Rhc2spOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWcpOworCisJLyogU3RvcCBhbmQgcmVzdGFydCB0aGUgY2hpcCdzIFR4IHByb2Nlc3NlcyAuICovCisJcmVzZXRfdHgoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZyk7CisKKwlkZXYtPmlmX3BvcnQgPSAwOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4IDwgVFhfUVVFVUVfTEVOIC0gNCkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCWlvd3JpdGUxNihERUZBVUxUX0lOVFIsIGlvYWRkciArIEludHJFbmFibGUpOworCXRhc2tsZXRfZW5hYmxlKCZucC0+dHhfdGFza2xldCk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbnAtPmN1cl9yeCA9IG5wLT5jdXJfdHggPSAwOworCW5wLT5kaXJ0eV9yeCA9IG5wLT5kaXJ0eV90eCA9IDA7CisJbnAtPmN1cl90YXNrID0gMDsKKworCW5wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUyMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDE2KTsKKworCS8qIEluaXRpYWxpemUgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihucC0+cnhfcmluZ19kbWEgKworCQkJKChpKzEpJVJYX1JJTkdfU0laRSkqc2l6ZW9mKCpucC0+cnhfcmluZykpOworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCA9IDA7CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQlucC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIoCisJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSkpOworCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBMYXN0RnJhZyk7CisJfQorCW5wLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlucC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHR4X3BvbGwgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBoZWFkID0gbnAtPmN1cl90YXNrICUgVFhfUklOR19TSVpFOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqdHhkZXNjID0gCisJCSZucC0+dHhfcmluZ1sobnAtPmN1cl90eCAtIDEpICUgVFhfUklOR19TSVpFXTsKKwkKKwkvKiBDaGFpbiB0aGUgbmV4dCBwb2ludGVyICovCisJZm9yICg7IG5wLT5jdXJfdHggLSBucC0+Y3VyX3Rhc2sgPiAwOyBucC0+Y3VyX3Rhc2srKykgeworCQlpbnQgZW50cnkgPSBucC0+Y3VyX3Rhc2sgJSBUWF9SSU5HX1NJWkU7CisJCXR4ZGVzYyA9ICZucC0+dHhfcmluZ1tlbnRyeV07CisJCWlmIChucC0+bGFzdF90eCkgeworCQkJbnAtPmxhc3RfdHgtPm5leHRfZGVzYyA9IGNwdV90b19sZTMyKG5wLT50eF9yaW5nX2RtYSArCisJCQkJZW50cnkqc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYykpOworCQl9CisJCW5wLT5sYXN0X3R4ID0gdHhkZXNjOworCX0KKwkvKiBJbmRpY2F0ZSB0aGUgbGF0ZXN0IGRlc2NyaXB0b3Igb2YgdHggcmluZyAqLworCXR4ZGVzYy0+c3RhdHVzIHw9IGNwdV90b19sZTMyKERlc2NJbnRyT25UeCk7CisKKwlpZiAoaW9yZWFkMzIgKG5wLT5iYXNlICsgVHhMaXN0UHRyKSA9PSAwKQorCQlpb3dyaXRlMzIgKG5wLT50eF9yaW5nX2RtYSArIGhlYWQgKiBzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKSwKKwkJCW5wLT5iYXNlICsgVHhMaXN0UHRyKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3N0YXJ0X3R4IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqdHhkZXNjOworCXVuc2lnbmVkIGVudHJ5OworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCW5wLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCXR4ZGVzYyA9ICZucC0+dHhfcmluZ1tlbnRyeV07CisKKwl0eGRlc2MtPm5leHRfZGVzYyA9IDA7CisJdHhkZXNjLT5zdGF0dXMgPSBjcHVfdG9fbGUzMiAoKGVudHJ5IDw8IDIpIHwgRGlzYWJsZUFsaWduKTsKKwl0eGRlc2MtPmZyYWdbMF0uYWRkciA9IGNwdV90b19sZTMyIChwY2lfbWFwX3NpbmdsZSAobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCQlza2ItPmxlbiwKKwkJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKSk7CisJdHhkZXNjLT5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyIChza2ItPmxlbiB8IExhc3RGcmFnKTsKKworCS8qIEluY3JlbWVudCBjdXJfdHggYmVmb3JlIHRhc2tsZXRfc2NoZWR1bGUoKSAqLworCW5wLT5jdXJfdHgrKzsKKwltYigpOworCS8qIFNjaGVkdWxlIGEgdHhfcG9sbCgpIHRhc2sgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZucC0+dHhfdGFza2xldCk7CisKKwkvKiBPbiBzb21lIGFyY2hpdGVjdHVyZXM6IGV4cGxpY2l0bHkgZmx1c2ggY2FjaGUgbGluZXMgaGVyZS4gKi8KKwlpZiAobnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDEKKwkJCSYmICFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyogZG8gbm90aGluZyAqLworCX0gZWxzZSB7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKG5wKSkgeworCQlwcmludGsgKEtFUk5fREVCVUcKKwkJCSIlczogVHJhbnNtaXQgZnJhbWUgIyVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgbnAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVzZXQgaGFyZHdhcmUgdHggYW5kIGZyZWUgYWxsIG9mIHR4IGJ1ZmZlcnMgKi8KK3N0YXRpYyBpbnQKK3Jlc2V0X3R4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKwlpbnQgaXJxID0gaW5faW50ZXJydXB0KCk7CisJCisJLyogUmVzZXQgdHggbG9naWMsIFR4TGlzdFB0ciB3aWxsIGJlIGNsZWFuZWQgKi8KKwlpb3dyaXRlMTYgKFR4RGlzYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOworCWlvd3JpdGUxNiAoVHhSZXNldCB8IERNQVJlc2V0IHwgRklGT1Jlc2V0IHwgTmV0d29ya1Jlc2V0LAorCQkJaW9hZGRyICsgQVNJQ0N0cmwgKyAyKTsKKwlmb3IgKGk9NTA7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKChpb3JlYWQxNihpb2FkZHIgKyBBU0lDQ3RybCArIDIpICYgUmVzZXRCdXN5KSA9PSAwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJLyogZnJlZSBhbGwgdHggc2tidWZmICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIAorCQkJCW5wLT50eF9yaW5nW2ldLmZyYWdbMF0uYWRkciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlpZiAoaXJxKQorCQkJCWRldl9rZnJlZV9za2JfaXJxIChza2IpOworCQkJZWxzZQorCQkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJbnAtPmN1cl90eCA9IG5wLT5kaXJ0eV90eCA9IDA7CisJbnAtPmN1cl90YXNrID0gMDsKKwlpb3dyaXRlMTYgKFN0YXRzRW5hYmxlIHwgUnhFbmFibGUgfCBUeEVuYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOworCXJldHVybiAwOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgY2xlYW5zIHVwIGFmdGVyIHRoZSBUeCB0aHJlYWQsIAorICAgYW5kIHNjaGVkdWxlIGEgUnggdGhyZWFkIHdvcmsgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgaHdfZnJhbWVfaWQ7CisJaW50IHR4X2NudDsKKwlpbnQgdHhfc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCisJZG8geworCQlpbnQgaW50cl9zdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkJaW93cml0ZTE2KGludHJfc3RhdHVzLCBpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworCQlpZiAobmV0aWZfbXNnX2ludHIobnApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKCEoaW50cl9zdGF0dXMgJiBERUZBVUxUX0lOVFIpKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJSeERNQURvbmUpKSB7CisJCQlpb3dyaXRlMTYoREVGQVVMVF9JTlRSICYgfihJbnRyUnhEb25lfEludHJSeERNQURvbmUpLAorCQkJCQlpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwkJCWlmIChucC0+YnVkZ2V0IDwgMCkKKwkJCQlucC0+YnVkZ2V0ID0gUlhfQlVER0VUOworCQkJdGFza2xldF9zY2hlZHVsZSgmbnAtPnJ4X3Rhc2tsZXQpOworCQl9CisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyVHhEb25lIHwgSW50ckRydlJxc3QpKSB7CisJCQl0eF9zdGF0dXMgPSBpb3JlYWQxNiAoaW9hZGRyICsgVHhTdGF0dXMpOworCQkJZm9yICh0eF9jbnQ9MzI7IHR4X3N0YXR1cyAmIDB4ODA7IC0tdHhfY250KSB7CisJCQkJaWYgKG5ldGlmX21zZ190eF9kb25lKG5wKSkKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIiVzOiBUcmFuc21pdCBzdGF0dXMgaXMgJTIuMnguXG4iLAorCQkJCSAgICAgCWRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkJCQlpZiAodHhfc3RhdHVzICYgMHgxZSkgeworCQkJCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDEwKQorCQkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDA4KQorCQkJCQkJbnAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDIpCisJCQkJCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQkvKiBUaGlzIHJlc2V0IGhhcyBub3QgYmVlbiB2ZXJpZmllZCEuICovCisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDEwKSB7CS8qIFJlc2V0IHRoZSBUeC4gKi8KKwkJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQkJCQlyZXNldF90eChkZXYpOworCQkJCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCQkJfQorCQkJCQlpZiAodHhfc3RhdHVzICYgMHgxZSkJLyogUmVzdGFydCB0aGUgVHguICovCisJCQkJCQlpb3dyaXRlMTYgKFR4RW5hYmxlLAorCQkJCQkJCWlvYWRkciArIE1BQ0N0cmwxKTsKKwkJCQl9CisJCQkJLyogWXVwLCB0aGlzIGlzIGEgZG9jdW1lbnRhdGlvbiBidWcuICBJdCBjb3N0IG1lICpob3VycyouICovCisJCQkJaW93cml0ZTE2ICgwLCBpb2FkZHIgKyBUeFN0YXR1cyk7CisJCQkJaWYgKHR4X2NudCA8IDApIHsKKwkJCQkJaW93cml0ZTMyKDUwMDAsIGlvYWRkciArIERvd25Db3VudGVyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXR4X3N0YXR1cyA9IGlvcmVhZDE2IChpb2FkZHIgKyBUeFN0YXR1cyk7CisJCQl9CisJCQlod19mcmFtZV9pZCA9ICh0eF9zdGF0dXMgPj4gOCkgJiAweGZmOworCQl9IGVsc2UgCXsKKwkJCWh3X2ZyYW1lX2lkID0gaW9yZWFkOChpb2FkZHIgKyBUeEZyYW1lSWQpOworCQl9CisJCQkKKwkJaWYgKG5wLT5wY2lfcmV2X2lkID49IDB4MTQpIHsJCisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCWZvciAoOyBucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID4gMDsgbnAtPmRpcnR5X3R4KyspIHsKKwkJCQlpbnQgZW50cnkgPSBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCQlpbnQgc3dfZnJhbWVfaWQ7CisJCQkJc3dfZnJhbWVfaWQgPSAobGUzMl90b19jcHUoCisJCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpID4+IDIpICYgMHhmZjsKKwkJCQlpZiAoc3dfZnJhbWVfaWQgPT0gaHdfZnJhbWVfaWQgJiYKKwkJCQkJIShsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKQorCQkJCQkmIDB4MDAwMTAwMDApKQorCQkJCQkJYnJlYWs7CisJCQkJaWYgKHN3X2ZyYW1lX2lkID09IChod19mcmFtZV9pZCArIDEpICUgCisJCQkJCVRYX1JJTkdfU0laRSkKKwkJCQkJCWJyZWFrOworCQkJCXNrYiA9IG5wLT50eF9za2J1ZmZbZW50cnldOworCQkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyLAorCQkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEgKG5wLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQlucC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciA9IDA7CisJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0ubGVuZ3RoID0gMDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCWZvciAoOyBucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID4gMDsgbnAtPmRpcnR5X3R4KyspIHsKKwkJCQlpbnQgZW50cnkgPSBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCQlpZiAoIShsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKSAKKwkJCQkJCQkmIDB4MDAwMTAwMDApKQorCQkJCQlicmVhazsKKwkJCQlza2IgPSBucC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciwKKwkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxIChucC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCQkJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSAwOworCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IDA7CisJCQl9CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisJCQorCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCQlucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4IDwgVFhfUVVFVUVfTEVOIC0gNCkgeworCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIGJ1c3kgZmxhZy4gKi8KKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKwkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUENJRXJyIHwgTGlua0NoYW5nZSB8IFN0YXRzTWF4KSkKKwkJCW5ldGRldl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKwl9IHdoaWxlICgwKTsKKwlpZiAobmV0aWZfbXNnX2ludHIobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCByeF9wb2xsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBucC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IG5wLT5idWRnZXQ7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IG5ldGRldl9kZXNjICpkZXNjID0gJihucC0+cnhfcmluZ1tlbnRyeV0pOworCQl1MzIgZnJhbWVfc3RhdHVzID0gbGUzMl90b19jcHUoZGVzYy0+c3RhdHVzKTsKKwkJaW50IHBrdF9sZW47CisKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlnb3RvIG5vdF9kb25lOworCQl9CisJCWlmICghKGZyYW1lX3N0YXR1cyAmIERlc2NPd24pKQorCQkJYnJlYWs7CisJCXBrdF9sZW4gPSBmcmFtZV9zdGF0dXMgJiAweDFmZmY7CS8qIENoaXAgb21pdHMgdGhlIENSQy4gKi8KKwkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMobnApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJCQkJICAgZnJhbWVfc3RhdHVzKTsKKwkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxZjQwMDApIHsKKwkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLworCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIobnApKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIFJ4IGVycm9yIHdhcyAlOC44eC5cbiIsCisJCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDEwMDAwMCkgbnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMDEwMDAwKSBucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMDYwMDAwKSBucC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDA4MDAwMCkgbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMTAwMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSwiCisJCQkJCSAgICIgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBmcmFtZV9zdGF0dXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMobnApKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkIgorCQkJCQkgICAiLCBib2d1c19jbnQgJWQuXG4iLAorCQkJCQkgICBwa3RfbGVuLCBib2d1c2NudCk7CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCisJCQkJCQkJICAgIGRlc2MtPmZyYWdbMF0uYWRkciwKKwkJCQkJCQkgICAgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgICBkZXNjLT5mcmFnWzBdLmFkZHIsCisJCQkJCQkJICAgICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJfSBlbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQlkZXNjLT5mcmFnWzBdLmFkZHIsCisJCQkJCW5wLT5yeF9idWZfc3osCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3B1dChza2IgPSBucC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCS8qIE5vdGU6IGNoZWNrc3VtIC0+IHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7ICovCisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCQllbnRyeSA9IChlbnRyeSArIDEpICUgUlhfUklOR19TSVpFOworCQlyZWNlaXZlZCsrOworCX0KKwlucC0+Y3VyX3J4ID0gZW50cnk7CisJcmVmaWxsX3J4IChkZXYpOworCW5wLT5idWRnZXQgLT0gcmVjZWl2ZWQ7CisJaW93cml0ZTE2KERFRkFVTFRfSU5UUiwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJcmV0dXJuOworCitub3RfZG9uZToKKwlucC0+Y3VyX3J4ID0gZW50cnk7CisJcmVmaWxsX3J4IChkZXYpOworCWlmICghcmVjZWl2ZWQpCisJCXJlY2VpdmVkID0gMTsKKwlucC0+YnVkZ2V0IC09IHJlY2VpdmVkOworCWlmIChucC0+YnVkZ2V0IDw9IDApCisJCW5wLT5idWRnZXQgPSBSWF9CVURHRVQ7CisJdGFza2xldF9zY2hlZHVsZSgmbnAtPnJ4X3Rhc2tsZXQpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcmVmaWxsX3J4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKwlpbnQgY250ID0gMDsKKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyhucC0+Y3VyX3J4IC0gbnAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFKSAlIFJYX1JJTkdfU0laRSA+IDA7CisJCW5wLT5kaXJ0eV9yeCA9IChucC0+ZGlydHlfcnggKyAxKSAlIFJYX1JJTkdfU0laRSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQllbnRyeSA9IG5wLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisJCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciA9IGNwdV90b19sZTMyKAorCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCQkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQl9CisJCS8qIFBlcmhhcHMgd2UgbmVlZCBub3QgcmVzZXQgdGhpcyBmaWVsZC4gKi8KKwkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdbMF0ubGVuZ3RoID0KKwkJCWNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBMYXN0RnJhZyk7CisJCW5wLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOworCQljbnQrKzsKKwl9CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXUxNiBtaWlfY3RsLCBtaWlfYWR2ZXJ0aXNlLCBtaWlfbHBhOworCWludCBzcGVlZDsKKworCWlmIChpbnRyX3N0YXR1cyAmIExpbmtDaGFuZ2UpIHsKKwkJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJCW1paV9hZHZlcnRpc2UgPSBtZGlvX3JlYWQgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UpOworCQkJbWlpX2xwYT0gbWRpb19yZWFkIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJCW1paV9hZHZlcnRpc2UgJj0gbWlpX2xwYTsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBjaGFuZ2VkOiAiLCBkZXYtPm5hbWUpOworCQkJaWYgKG1paV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTAwRlVMTCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlwcmludGsgKCIxMDBNYnBzLCBmdWxsIGR1cGxleFxuIik7CisJCQl9IGVsc2UgaWYgKG1paV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTAwSEFMRikgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlwcmludGsgKCIxMDBNYnBzLCBoYWxmIGR1cGxleFxuIik7CisJCQl9IGVsc2UgaWYgKG1paV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTBGVUxMKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJcHJpbnRrICgiMTBNYnBzLCBmdWxsIGR1cGxleFxuIik7CisJCQl9IGVsc2UgaWYgKG1paV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTBIQUxGKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJcHJpbnRrICgiMTBNYnBzLCBoYWxmIGR1cGxleFxuIik7CisJCQl9IGVsc2UKKwkJCQlwcmludGsgKCJcbiIpOworCisJCX0gZWxzZSB7CisJCQltaWlfY3RsID0gbWRpb19yZWFkIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUik7CisJCQlzcGVlZCA9IChtaWlfY3RsICYgQk1DUl9TUEVFRDEwMCkgPyAxMDAgOiAxMDsKKwkJCW5wLT5zcGVlZCA9IHNwZWVkOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIGNoYW5nZWQ6ICVkTWJwcyAsIiwKKwkJCQlkZXYtPm5hbWUsIHNwZWVkKTsKKwkJCXByaW50ayAoIiVzIGR1cGxleC5cbiIsIChtaWlfY3RsICYgQk1DUl9GVUxMRFBMWCkgPworCQkJCSJmdWxsIiA6ICJoYWxmIik7CisJCX0KKwkJY2hlY2tfZHVwbGV4IChkZXYpOworCQlpZiAobnAtPmZsb3djdHJsICYmIG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpIHsKKwkJCWlvd3JpdGUxNihpb3JlYWQxNihpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKzIpIHwgMHgwMjAwLAorCQkJCWlvYWRkciArIE11bHRpY2FzdEZpbHRlcjErMik7CisJCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDApIHwgRW5iRmxvd0N0cmwsCisJCQkJaW9hZGRyICsgTUFDQ3RybDApOworCQl9CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFN0YXRzTWF4KSB7CisJCWdldF9zdGF0cyhkZXYpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyUENJRXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCQkvKiBXZSBtdXN0IGRvIGEgZ2xvYmFsIHJlc2V0IG9mIERNQSB0byBjb250aW51ZS4gKi8KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgaTsKKworCS8qIFdlIHNob3VsZCBsb2NrIHRoaXMgc2VnbWVudCBvZiBjb2RlIGZvciBTTVAgZXZlbnR1YWxseSwgYWx0aG91Z2gKKwkgICB0aGUgdnVsbmVyYWJpbGl0eSB3aW5kb3cgaXMgdmVyeSBzbWFsbCBhbmQgc3RhdGlzdGljcyBhcmUKKwkgICBub24tY3JpdGljYWwuICovCisJLyogVGhlIGNoaXAgb25seSBuZWVkIHJlcG9ydCBmcmFtZSBzaWxlbnRseSBkcm9wcGVkLiAqLworCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzCSs9IGlvcmVhZDgoaW9hZGRyICsgUnhNaXNzZWQpOworCW5wLT5zdGF0cy50eF9wYWNrZXRzICs9IGlvcmVhZDE2KGlvYWRkciArIFR4RnJhbWVzT0spOworCW5wLT5zdGF0cy5yeF9wYWNrZXRzICs9IGlvcmVhZDE2KGlvYWRkciArIFJ4RnJhbWVzT0spOworCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9IGlvcmVhZDgoaW9hZGRyICsgU3RhdHNMYXRlQ29sbCk7CisJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gaW9yZWFkOChpb2FkZHIgKyBTdGF0c011bHRpQ29sbCk7CisJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gaW9yZWFkOChpb2FkZHIgKyBTdGF0c09uZUNvbGwpOworCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBpb3JlYWQ4KGlvYWRkciArIFN0YXRzQ2FycmllckVycm9yKTsKKwlpb3JlYWQ4KGlvYWRkciArIFN0YXRzVHhEZWZlcik7CisJZm9yIChpID0gU3RhdHNUeERlZmVyOyBpIDw9IFN0YXRzTWNhc3RSeDsgaSsrKQorCQlpb3JlYWQ4KGlvYWRkciArIGkpOworCW5wLT5zdGF0cy50eF9ieXRlcyArPSBpb3JlYWQxNihpb2FkZHIgKyBUeE9jdGV0c0xvdyk7CisJbnAtPnN0YXRzLnR4X2J5dGVzICs9IGlvcmVhZDE2KGlvYWRkciArIFR4T2N0ZXRzSGlnaCkgPDwgMTY7CisJbnAtPnN0YXRzLnJ4X2J5dGVzICs9IGlvcmVhZDE2KGlvYWRkciArIFJ4T2N0ZXRzTG93KTsKKwlucC0+c3RhdHMucnhfYnl0ZXMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhPY3RldHNIaWdoKSA8PCAxNjsKKworCXJldHVybiAmbnAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJdTE2IG1jX2ZpbHRlcls0XTsJCQkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwl1MzIgcnhfbW9kZTsKKwlpbnQgaTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdEFsbCB8IEFjY2VwdE15UGh5czsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJCSAgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGJpdDsKKwkJaW50IGluZGV4OworCQlpbnQgY3JjOworCQltZW1zZXQgKG1jX2ZpbHRlciwgMCwgc2l6ZW9mIChtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSAoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpOworCQkJZm9yIChpbmRleD0wLCBiaXQ9MDsgYml0IDwgNjsgYml0KyssIGNyYyA8PD0gMSkKKwkJCQlpZiAoY3JjICYgMHg4MDAwMDAwMCkgaW5kZXggfD0gMSA8PCBiaXQ7CisJCQltY19maWx0ZXJbaW5kZXgvMTZdIHw9ICgxIDw8IChpbmRleCAlIDE2KSk7CisJCX0KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpSGFzaCB8IEFjY2VwdE15UGh5czsKKwl9IGVsc2UgeworCQlpb3dyaXRlOChBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXMsIGlvYWRkciArIFJ4TW9kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKG5wLT5taWlfaWYuZnVsbF9kdXBsZXggJiYgbnAtPmZsb3djdHJsKQorCQltY19maWx0ZXJbM10gfD0gMHgwMjAwOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaW93cml0ZTE2KG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCArIGkqMik7CisJaW93cml0ZTgocnhfbW9kZSwgaW9hZGRyICsgUnhNb2RlKTsKK30KKworc3RhdGljIGludCBfX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBhZGRyMTY7CisKKwlhZGRyMTYgPSAoZGV2LT5kZXZfYWRkclswXSB8IChkZXYtPmRldl9hZGRyWzFdIDw8IDgpKTsKKwlpb3dyaXRlMTYoYWRkcjE2LCBucC0+YmFzZSArIFN0YXRpb25BZGRyKTsKKwlhZGRyMTYgPSAoZGV2LT5kZXZfYWRkclsyXSB8IChkZXYtPmRldl9hZGRyWzNdIDw8IDgpKTsKKwlpb3dyaXRlMTYoYWRkcjE2LCBucC0+YmFzZSArIFN0YXRpb25BZGRyKzIpOworCWFkZHIxNiA9IChkZXYtPmRldl9hZGRyWzRdIHwgKGRldi0+ZGV2X2FkZHJbNV0gPDwgOCkpOworCWlvd3JpdGUxNihhZGRyMTYsIG5wLT5iYXNlICsgU3RhdGlvbkFkZHIrNCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaWZfcnVubmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXMgPSBtaWlfZXRodG9vbF9zc2V0KCZucC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG53YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIGdldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWwpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJbnAtPm1zZ19lbmFibGUgPSB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmJlZ2luID0gY2hlY2tfaWZfcnVubmluZywKKwkuZ2V0X2RydmluZm8gPSBnZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQgPSBud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGdldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwgPSBnZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IHNldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgcmM7CisJaW50IGk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmbnAtPm1paV9pZiwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NERVZQUklWQVRFOgorCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggJTA4bGx4ICUwOHggJTA4eCglMDJ4KSAlMDh4ICUwOHhcbiIsIGksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobnAtPnR4X3JpbmdfZG1hICsgaSpzaXplb2YoKm5wLT50eF9yaW5nKSksCQorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLm5leHRfZGVzYyksCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uc3RhdHVzKSwKKwkJCQkobGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uc3RhdHVzKSA+PiAyKSAKKwkJCQkJJiAweGZmLAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLmZyYWdbMF0uYWRkciksIAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoKSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlR4TGlzdFB0cj0lMDh4IG5ldGlmX3F1ZXVlX3N0b3BwZWQ9JWRcbiIsIAorCQkJaW9yZWFkMzIobnAtPmJhc2UgKyBUeExpc3RQdHIpLCAKKwkJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfdHg9JWQoJTAyeCkgZGlydHlfdHg9JWQoJTAyeClcbiIsIAorCQkJbnAtPmN1cl90eCwgbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRSwKKwkJCW5wLT5kaXJ0eV90eCwgbnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl9yeD0lZCBkaXJ0eV9yeD0lZFxuIiwgbnAtPmN1cl9yeCwgbnAtPmRpcnR5X3J4KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl90YXNrPSVkXG4iLCBucC0+Y3VyX3Rhc2spOworCQlwcmludGsoS0VSTl9ERUJVRyAiVHhTdGF0dXM9JTA0eFxuIiwgaW9yZWFkMTYoaW9hZGRyICsgVHhTdGF0dXMpKTsKKwkJCXJldHVybiAwOworCX0KKwkJCQkKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAobmV0aWZfbXNnX2lmZG93bihucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyBUeCAlMi4yeCAiCisJCQkgICAiUnggJTQuNHggSW50ICUyLjJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkOChpb2FkZHIgKyBUeFN0YXR1cyksCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBSeFN0YXR1cyksIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsICBSeCAlZCAvICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LCBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlpb3dyaXRlMTYoVHhEaXNhYmxlIHwgUnhEaXNhYmxlIHwgU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisKKwkvKiBXYWl0IGFuZCBraWxsIHRhc2tsZXQgKi8KKwl0YXNrbGV0X2tpbGwoJm5wLT5yeF90YXNrbGV0KTsKKwl0YXNrbGV0X2tpbGwoJm5wLT50eF90YXNrbGV0KTsKKworI2lmZGVmIF9faTM4Nl9fCisJaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44eDpcbiIsCisJCQkgICAoaW50KShucC0+dHhfcmluZ19kbWEpKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgIyVkIGRlc2MuICU0LjR4ICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCQkgICBpLCBucC0+dHhfcmluZ1tpXS5zdGF0dXMsIG5wLT50eF9yaW5nW2ldLmZyYWdbMF0uYWRkciwKKwkJCQkgICBucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCk7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyAiICBSeCByaW5nICU4Ljh4OlxuIiwKKwkJCSAgIChpbnQpKG5wLT5yeF9yaW5nX2RtYSkpOworCQlmb3IgKGkgPSAwOyBpIDwgLypSWF9SSU5HX1NJWkUqLzQgOyBpKyspIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIyVkIGRlc2MuICU0LjR4ICU0LjR4ICU4Ljh4XG4iLAorCQkJCSAgIGksIG5wLT5yeF9yaW5nW2ldLnN0YXR1cywgbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5hZGRyLAorCQkJCSAgIG5wLT5yeF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyBkZWJ1Z2dpbmcgb25seSAqLworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlkZWxfdGltZXJfc3luYygmbnAtPnRpbWVyKTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5hZGRyID0gMHhCQURGMDBEMDsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlza2IgPSBucC0+cnhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT5yeF9yaW5nW2ldLmZyYWdbMF0uYWRkciwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJbnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5hZGRyLCBza2ItPmxlbiwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzdW5kYW5jZV9yZW1vdmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworICAgICAgICAJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywKKwkJCW5wLT5yeF9yaW5nX2RtYSk7CisJICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLAorCQkJbnAtPnR4X3JpbmdfZG1hKTsKKwkJcGNpX2lvdW5tYXAocGRldiwgbnAtPmJhc2UpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3VuZGFuY2VfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHN1bmRhbmNlX3BjaV90YmwsCisJLnByb2JlCQk9IHN1bmRhbmNlX3Byb2JlMSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHN1bmRhbmNlX3JlbW92ZTEpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3VuZGFuY2VfaW5pdCh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc3VuZGFuY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN1bmRhbmNlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN1bmRhbmNlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN1bmRhbmNlX2luaXQpOworbW9kdWxlX2V4aXQoc3VuZGFuY2VfZXhpdCk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q1MGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTAsMCArMSwzMjA0IEBACisvKiAkSWQ6IHN1bmdlbS5jLHYgMS40NC4yLjIyIDIwMDIvMDMvMTMgMDE6MTg6MTIgZGF2ZW0gRXhwICQKKyAqIHN1bmdlbS5jOiBTdW4gR0VNIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogCisgKiBTdXBwb3J0IGZvciBBcHBsZSBHTUFDIGFuZCBhc3NvcnRlZCBQSFlzLCBXT0wsIFBvd2VyIE1hbmFnZW1lbnQKKyAqIChDKSAyMDAxLDIwMDIsMjAwMyBCZW5qYW1pbiBIZXJyZW5zY21pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKKyAqIChDKSAyMDA0LDIwMDUgQmVuamFtaW4gSGVycmVuc2NtaWR0LCBJQk0gQ29ycC4KKyAqCisgKiBOQVBJIGFuZCBORVRQT0xMIHN1cHBvcnQKKyAqIChDKSAyMDA0IGJ5IEVyaWMgTGVtb2luZSAoZXJpYy5sZW1vaW5lQGdtYWlsLmNvbSkKKyAqIAorICogVE9ETzogCisgKiAgLSBOb3cgdGhhdCB0aGUgZHJpdmVyIHdhcyBzaWduaWZpY2FudGx5IHNpbXBsaWZpZWQsIEkgbmVlZCB0byByZXdvcmsKKyAqICAgIHRoZSBsb2NraW5nLiBJJ20gc3VyZSB3ZSBkb24ndCBuZWVkIF8yXyBzcGlubG9ja3MsIGFuZCB3ZSBwcm9iYWJseQorICogICAgY2FuIGF2b2lkIHRha2luZyBtb3N0IG9mIHRoZW0gZm9yIHNvIGxvbmcgcGVyaW9kIG9mIHRpbWUgKGFuZCBzY2hlZHVsZQorICogICAgaW5zdGVhZCkuIFRoZSBtYWluIGlzc3VlcyBhdCB0aGlzIHBvaW50IGFyZSBjYXVzZWQgYnkgdGhlIG5ldGRldiBsYXllcgorICogICAgdGhvdWdoOgorICogICAgCisgKiAgICBnZW1fY2hhbmdlX210dSgpIGFuZCBnZW1fc2V0X211bHRpY2FzdCgpIGFyZSBjYWxsZWQgd2l0aCBhIHJlYWRfbG9jaygpCisgKiAgICBoZWxwIGJ5IG5ldC9jb3JlL2Rldi5jLCB0aHVzIHRoZXkgY2FuJ3Qgc2NoZWR1bGUuIFRoYXQgbWVhbnMgdGhleSBjYW4ndAorICogICAgY2FsbCBuZXRpZl9wb2xsX2Rpc2FibGUoKSBuZWl0aGVyLCB0aHVzIGZvcmNlIGdlbV9wb2xsKCkgdG8ga2VlcCBhIHNwaW5sb2NrCisgKiAgICB3aGVyZSBpdCBjb3VsZCBoYXZlIGJlZW4gZHJvcHBlZC4gY2hhbmdlX210dSBlc3BlY2lhbGx5IHdvdWxkIGxvdmUgYWxzbyB0bworICogICAgYmUgYWJsZSB0byBtc2xlZXAgaW5zdGVhZCBvZiBob3JyaWQgbG9ja2VkIGRlbGF5cyB3aGVuIHJlc2V0dGluZyB0aGUgSFcsCisgKiAgICBidXQgdGhhdCByZWFkX2xvY2soKSBtYWtlcyBpdCBpbXBvc3NpYmxlLCB1bmxlc3MgSSBkZWZlciBpdCdzIGFjdGlvbiB0bworICogICAgdGhlIHJlc2V0IHRhc2ssIHdoaWNoIG1lYW5zIGl0J2xsIGJlIGFzeW5jaHJvbm91cyAod29uJ3QgdGFrZSBlZmZlY3QgdW50aWwKKyAqICAgIHRoZSBzeXN0ZW0gc2NoZWR1bGVzIGEgYml0KS4KKyAqCisgKiAgICBBbHNvLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBwb3NzaWJsZSB0byBhbHNvIHJlbW92ZSBtb3N0IG9mIHRoZSBsb25nLWxpZmUKKyAqICAgIGxvY2tpbmcgaW4gb3Blbi9yZXN1bWUgY29kZSBwYXRoIChnZW1fcmVpbml0X2NoaXApIGJ5IGJlZWluZyBtb3JlIGNhcmVmdWwKKyAqICAgIGFib3V0IHdoZW4gd2UgY2FuIHN0YXJ0IHRha2luZyBpbnRlcnJ1cHRzIG9yIGdldCB4bWl0KCkgY2FsbGVkLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmZGVmIF9fc3BhcmNfXworI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcGJtLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUENfUE1BQworI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgorI2luY2x1ZGUgInN1bmdlbS5oIgorCisvKiBTdHJpcHBpbmcgRkNTIGlzIGNhdXNpbmcgcHJvYmxlbXMsIGRpc2FibGVkIGZvciBub3cgKi8KKyN1bmRlZiBTVFJJUF9GQ1MKKworI2RlZmluZSBERUZBVUxUX01TRwkoTkVUSUZfTVNHX0RSVgkJfCBcCisJCQkgTkVUSUZfTVNHX1BST0JFCXwgXAorCQkJIE5FVElGX01TR19MSU5LKQorCisjZGVmaW5lIEFEVkVSVElTRV9NQVNLCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFwKKwkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKworI2RlZmluZSBEUlZfTkFNRQkic3VuZ2VtIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45OCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjgvMjQvMDMiCisjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyAgICAgICAgRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICIgRFJWX0FVVEhPUiAiXG4iOworCitNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gR0VNIEdiaXQgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgR0VNX01PRFVMRV9OQU1FCSJnZW0iCisjZGVmaW5lIFBGWCBHRU1fTU9EVUxFX05BTUUgIjogIgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ2VtX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU1VOLCBQQ0lfREVWSUNFX0lEX1NVTl9HRU0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKworCS8qIFRoZXNlIG1vZGVscyBvbmx5IGRpZmZlciBmcm9tIHRoZSBvcmlnaW5hbCBHRU0gaW4KKwkgKiB0aGF0IHRoZWlyIHR4L3J4IGZpZm9zIGFyZSBvZiBhIGRpZmZlcmVudCBzaXplIGFuZAorCSAqIHRoZXkgb25seSBzdXBwb3J0IDEwLzEwMCBzcGVlZHMuIC1EYXZlTQorCSAqIAorCSAqIEFwcGxlJ3MgR01BQyBkb2VzIHN1cHBvcnQgZ2lnYWJpdCBvbiBtYWNoaW5lcyB3aXRoCisJICogdGhlIEJDTTU0eHggUEhZcy4gLUJlbkgKKwkgKi8KKwl7IFBDSV9WRU5ET1JfSURfU1VOLCBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fR0VNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0dNQUMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fR01BQ1AsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fR01BQzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfSzJfR01BQywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9TSF9TVU5HRU0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7MCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGdlbV9wY2lfdGJsKTsKKworc3RhdGljIHUxNiBfX3BoeV9yZWFkKHN0cnVjdCBnZW0gKmdwLCBpbnQgcGh5X2FkZHIsIGludCByZWcpCit7CisJdTMyIGNtZDsKKwlpbnQgbGltaXQgPSAxMDAwMDsKKworCWNtZCAgPSAoMSA8PCAzMCk7CisJY21kIHw9ICgyIDw8IDI4KTsKKwljbWQgfD0gKHBoeV9hZGRyIDw8IDIzKSAmIE1JRl9GUkFNRV9QSFlBRDsKKwljbWQgfD0gKHJlZyA8PCAxOCkgJiBNSUZfRlJBTUVfUkVHQUQ7CisJY21kIHw9IChNSUZfRlJBTUVfVEFNU0IpOworCXdyaXRlbChjbWQsIGdwLT5yZWdzICsgTUlGX0ZSQU1FKTsKKworCXdoaWxlIChsaW1pdC0tKSB7CisJCWNtZCA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0ZSQU1FKTsKKwkJaWYgKGNtZCAmIE1JRl9GUkFNRV9UQUxTQikKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKCFsaW1pdCkKKwkJY21kID0gMHhmZmZmOworCisJcmV0dXJuIGNtZCAmIE1JRl9GUkFNRV9EQVRBOworfQorCitzdGF0aWMgaW5saW5lIGludCBfcGh5X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gX19waHlfcmVhZChncCwgbWlpX2lkLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBwaHlfcmVhZChzdHJ1Y3QgZ2VtICpncCwgaW50IHJlZykKK3sKKwlyZXR1cm4gX19waHlfcmVhZChncCwgZ3AtPm1paV9waHlfYWRkciwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19waHlfd3JpdGUoc3RydWN0IGdlbSAqZ3AsIGludCBwaHlfYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwl1MzIgY21kOworCWludCBsaW1pdCA9IDEwMDAwOworCisJY21kICA9ICgxIDw8IDMwKTsKKwljbWQgfD0gKDEgPDwgMjgpOworCWNtZCB8PSAocGh5X2FkZHIgPDwgMjMpICYgTUlGX0ZSQU1FX1BIWUFEOworCWNtZCB8PSAocmVnIDw8IDE4KSAmIE1JRl9GUkFNRV9SRUdBRDsKKwljbWQgfD0gKE1JRl9GUkFNRV9UQU1TQik7CisJY21kIHw9ICh2YWwgJiBNSUZfRlJBTUVfREFUQSk7CisJd3JpdGVsKGNtZCwgZ3AtPnJlZ3MgKyBNSUZfRlJBTUUpOworCisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJY21kID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfRlJBTUUpOworCQlpZiAoY21kICYgTUlGX0ZSQU1FX1RBTFNCKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcGh5X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcsIGludCB2YWwpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJX19waHlfd3JpdGUoZ3AsIG1paV9pZCwgcmVnLCB2YWwgJiAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGh5X3dyaXRlKHN0cnVjdCBnZW0gKmdwLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCV9fcGh5X3dyaXRlKGdwLCBncC0+bWlpX3BoeV9hZGRyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW1fZW5hYmxlX2ludHMoc3RydWN0IGdlbSAqZ3ApCit7CisJLyogRW5hYmxlIGFsbCBpbnRlcnJ1cHRzIGJ1dCBUWERPTkUgKi8KKwl3cml0ZWwoR1JFR19TVEFUX1RYRE9ORSwgZ3AtPnJlZ3MgKyBHUkVHX0lNQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbV9kaXNhYmxlX2ludHMoc3RydWN0IGdlbSAqZ3ApCit7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgaW5jbHVkaW5nIFRYRE9ORSAqLworCXdyaXRlbChHUkVHX1NUQVRfTkFQSSB8IEdSRUdfU1RBVF9UWERPTkUsIGdwLT5yZWdzICsgR1JFR19JTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9nZXRfY2VsbChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlCVUdfT04oZ3AtPmNlbGxfZW5hYmxlZCA8IDApOworCWdwLT5jZWxsX2VuYWJsZWQrKzsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoZ3AtPmNlbGxfZW5hYmxlZCA9PSAxKSB7CisJCW1iKCk7CisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0dNQUNfRU5BQkxFLCBncC0+b2Zfbm9kZSwgMCwgMSk7CisJCXVkZWxheSgxMCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLworfQorCisvKiBUdXJuIG9mZiB0aGUgY2hpcCdzIGNsb2NrICovCitzdGF0aWMgdm9pZCBnZW1fcHV0X2NlbGwoc3RydWN0IGdlbSAqZ3ApCit7CisJQlVHX09OKGdwLT5jZWxsX2VuYWJsZWQgPD0gMCk7CisJZ3AtPmNlbGxfZW5hYmxlZC0tOworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChncC0+Y2VsbF9lbmFibGVkID09IDApIHsKKwkJbWIoKTsKKwkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR01BQ19FTkFCTEUsIGdwLT5vZl9ub2RlLCAwLCAwKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCit9CisKK3N0YXRpYyB2b2lkIGdlbV9oYW5kbGVfbWlmX2V2ZW50KHN0cnVjdCBnZW0gKmdwLCB1MzIgcmVnX3ZhbCwgdTMyIGNoYW5nZWRfYml0cykKK3sKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1pZiBpbnRlcnJ1cHRcbiIsIGdwLT5kZXYtPm5hbWUpOworfQorCitzdGF0aWMgaW50IGdlbV9wY3NfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgcGNzX2lzdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfSVNUQVQpOworCXUzMiBwY3NfbWlpc3RhdDsKKworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcGNzIGludGVycnVwdCwgcGNzX2lzdGF0OiAweCV4XG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgcGNzX2lzdGF0KTsKKworCWlmICghKHBjc19pc3RhdCAmIFBDU19JU1RBVF9MU0MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDUyBpcnEgYnV0IG5vIGxpbmsgc3RhdHVzIGNoYW5nZT8/P1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoZSBsaW5rIHN0YXR1cyBiaXQgbGF0Y2hlcyBvbiB6ZXJvLCBzbyB5b3UgbXVzdAorCSAqIHJlYWQgaXQgdHdpY2UgaW4gc3VjaCBhIGNhc2UgdG8gc2VlIGEgdHJhbnNpdGlvbgorCSAqIHRvIHRoZSBsaW5rIGJlaW5nIHVwLgorCSAqLworCXBjc19taWlzdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJU1RBVCk7CisJaWYgKCEocGNzX21paXN0YXQgJiBQQ1NfTUlJU1RBVF9MUykpCisJCXBjc19taWlzdGF0IHw9CisJCQkocmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJU1RBVCkgJgorCQkJIFBDU19NSUlTVEFUX0xTKTsKKworCWlmIChwY3NfbWlpc3RhdCAmIFBDU19NSUlTVEFUX0FOQykgeworCQkvKiBUaGUgcmVtb3RlLWZhdWx0IGluZGljYXRpb24gaXMgb25seSB2YWxpZAorCQkgKiB3aGVuIGF1dG9uZWcgaGFzIGNvbXBsZXRlZC4KKwkJICovCisJCWlmIChwY3NfbWlpc3RhdCAmIFBDU19NSUlTVEFUX1JGKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDUyBBdXRvTkVHIGNvbXBsZXRlLCAiCisJCQkgICAgICAgIlJlbW90ZUZhdWx0XG4iLCBkZXYtPm5hbWUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUENTIEF1dG9ORUcgY29tcGxldGUuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHBjc19taWlzdGF0ICYgUENTX01JSVNUQVRfTFMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDUyBsaW5rIGlzIG5vdyB1cC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29uKGdwLT5kZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ1MgbGluayBpcyBub3cgZG93bi5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29mZihncC0+ZGV2KTsKKwkJLyogSWYgdGhpcyBoYXBwZW5zIGFuZCB0aGUgbGluayB0aW1lciBpcyBub3QgcnVubmluZywKKwkJICogcmVzZXQgc28gd2UgcmUtbmVnb3RpYXRlLgorCQkgKi8KKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZncC0+bGlua190aW1lcikpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fdHhtYWNfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgdHhtYWNfc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYU1RBVCk7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4bWFjIGludGVycnVwdCwgdHhtYWNfc3RhdDogMHgleFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIHR4bWFjX3N0YXQpOworCisJLyogRGVmZXIgdGltZXIgZXhwaXJhdGlvbiBpcyBxdWl0ZSBub3JtYWwsCisJICogZG9uJ3QgZXZlbiBsb2cgdGhlIGV2ZW50LgorCSAqLworCWlmICgodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfRFRFKSAmJgorCSAgICAhKHR4bWFjX3N0YXQgJiB+TUFDX1RYU1RBVF9EVEUpKQorCQlyZXR1cm4gMDsKKworCWlmICh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9VUlVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYIE1BQyB4bWl0IHVuZGVycnVuLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdwLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwl9CisKKwlpZiAodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfTVBFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYIE1BQyBtYXggcGFja2V0IHNpemUgZXJyb3IuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ3AtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisKKwkvKiBUaGUgcmVzdCBhcmUgYWxsIGNhc2VzIG9mIG9uZSBvZiB0aGUgMTYtYml0IFRYCisJICogY291bnRlcnMgZXhwaXJpbmcuCisJICovCisJaWYgKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX05DRSkKKwkJZ3AtPm5ldF9zdGF0cy5jb2xsaXNpb25zICs9IDB4MTAwMDA7CisKKwlpZiAodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfRUNFKSB7CisJCWdwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgKz0gMHgxMDAwMDsKKwkJZ3AtPm5ldF9zdGF0cy5jb2xsaXNpb25zICs9IDB4MTAwMDA7CisJfQorCisJaWYgKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX0xDRSkgeworCQlncC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IDB4MTAwMDA7CisJCWdwLT5uZXRfc3RhdHMuY29sbGlzaW9ucyArPSAweDEwMDAwOworCX0KKworCS8qIFdlIGRvIG5vdCBrZWVwIHRyYWNrIG9mIE1BQ19UWFNUQVRfRkNFIGFuZAorCSAqIE1BQ19UWFNUQVRfUENFIGV2ZW50cy4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworLyogV2hlbiB3ZSBnZXQgYSBSWCBmaWZvIG92ZXJmbG93LCB0aGUgUlggdW5pdCBpbiBHRU0gaXMgcHJvYmFibHkgaHVuZworICogc28gd2UgZG8gdGhlIGZvbGxvd2luZy4KKyAqCisgKiBJZiBhbnkgcGFydCBvZiB0aGUgcmVzZXQgZ29lcyB3cm9uZywgd2UgcmV0dXJuIDEgYW5kIHRoYXQgY2F1c2VzIHRoZQorICogd2hvbGUgY2hpcCB0byBiZSByZXNldC4KKyAqLworc3RhdGljIGludCBnZW1fcnhtYWNfcmVzZXQoc3RydWN0IGdlbSAqZ3ApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdwLT5kZXY7CisJaW50IGxpbWl0LCBpOworCXU2NCBkZXNjX2RtYTsKKwl1MzIgdmFsOworCisJLyogRmlyc3QsIHJlc2V0ICYgZGlzYWJsZSBNQUMgUlguICovCisJd3JpdGVsKE1BQ19SWFJTVF9DTUQsIGdwLT5yZWdzICsgTUFDX1JYUlNUKTsKKwlmb3IgKGxpbWl0ID0gMDsgbGltaXQgPCA1MDAwOyBsaW1pdCsrKSB7CisJCWlmICghKHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYUlNUKSAmIE1BQ19SWFJTVF9DTUQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA9PSA1MDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYIE1BQyB3aWxsIG5vdCByZXNldCwgcmVzZXR0aW5nIHdob2xlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNoaXAuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3cml0ZWwoZ3AtPm1hY19yeF9jZmcgJiB+TUFDX1JYQ0ZHX0VOQUIsCisJICAgICAgIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwlmb3IgKGxpbWl0ID0gMDsgbGltaXQgPCA1MDAwOyBsaW1pdCsrKSB7CisJCWlmICghKHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKSAmIE1BQ19SWENGR19FTkFCKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobGltaXQgPT0gNTAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSWCBNQUMgd2lsbCBub3QgZGlzYWJsZSwgcmVzZXR0aW5nIHdob2xlICIKKwkJICAgICAgICJjaGlwLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2Vjb25kLCBkaXNhYmxlIFJYIERNQS4gKi8KKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCWZvciAobGltaXQgPSAwOyBsaW1pdCA8IDUwMDA7IGxpbWl0KyspIHsKKwkJaWYgKCEocmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9DRkcpICYgUlhETUFfQ0ZHX0VOQUJMRSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0ID09IDUwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggRE1BIHdpbGwgbm90IGRpc2FibGUsIHJlc2V0dGluZyB3aG9sZSAiCisJCSAgICAgICAiY2hpcC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXVkZWxheSg1MDAwKTsKKworCS8qIEV4ZWN1dGUgUlggcmVzZXQgY29tbWFuZC4gKi8KKwl3cml0ZWwoZ3AtPnN3cnN0X2Jhc2UgfCBHUkVHX1NXUlNUX1JYUlNULAorCSAgICAgICBncC0+cmVncyArIEdSRUdfU1dSU1QpOworCWZvciAobGltaXQgPSAwOyBsaW1pdCA8IDUwMDA7IGxpbWl0KyspIHsKKwkJaWYgKCEocmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX1NXUlNUKSAmIEdSRUdfU1dSU1RfUlhSU1QpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA9PSA1MDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYIHJlc2V0IGNvbW1hbmQgd2lsbCBub3QgZXhlY3V0ZSwgcmVzZXR0aW5nICIKKwkJICAgICAgICJ3aG9sZSBjaGlwLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUmVmcmVzaCB0aGUgUlggcmluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IGdlbV9yeGQgKnJ4ZCA9ICZncC0+aW5pdF9ibG9jay0+cnhkW2ldOworCisJCWlmIChncC0+cnhfc2tic1tpXSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQYXJ0cyBvZiBSWCByaW5nIGVtcHR5LCByZXNldHRpbmcgIgorCQkJICAgICAgICJ3aG9sZSBjaGlwLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcnhkLT5zdGF0dXNfd29yZCA9IGNwdV90b19sZTY0KFJYRENUUkxfRlJFU0goZ3ApKTsKKwl9CisJZ3AtPnJ4X25ldyA9IGdwLT5yeF9vbGQgPSAwOworCisJLyogTm93IHdlIG11c3QgcmVwcm9ncmFtIHRoZSByZXN0IG9mIFJYIHVuaXQuICovCisJZGVzY19kbWEgPSAodTY0KSBncC0+Z2Jsb2NrX2R2bWE7CisJZGVzY19kbWEgKz0gKElOSVRfQkxPQ0tfVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBnZW1fdHhkKSk7CisJd3JpdGVsKGRlc2NfZG1hID4+IDMyLCBncC0+cmVncyArIFJYRE1BX0RCSEkpOworCXdyaXRlbChkZXNjX2RtYSAmIDB4ZmZmZmZmZmYsIGdwLT5yZWdzICsgUlhETUFfREJMT1cpOworCXdyaXRlbChSWF9SSU5HX1NJWkUgLSA0LCBncC0+cmVncyArIFJYRE1BX0tJQ0spOworCXZhbCA9IChSWERNQV9DRkdfQkFTRSB8IChSWF9PRkZTRVQgPDwgMTApIHwKKwkgICAgICAgKCgxNCAvIDIpIDw8IDEzKSB8IFJYRE1BX0NGR19GVEhSRVNIXzEyOCk7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCWlmIChyZWFkbChncC0+cmVncyArIEdSRUdfQklGQ0ZHKSAmIEdSRUdfQklGQ0ZHX002NkVOKQorCQl3cml0ZWwoKCg1ICYgUlhETUFfQkxBTktfSVBLVFMpIHwKKwkJCSgoOCA8PCAxMikgJiBSWERNQV9CTEFOS19JVElNRSkpLAorCQkgICAgICAgZ3AtPnJlZ3MgKyBSWERNQV9CTEFOSyk7CisJZWxzZQorCQl3cml0ZWwoKCg1ICYgUlhETUFfQkxBTktfSVBLVFMpIHwKKwkJCSgoNCA8PCAxMikgJiBSWERNQV9CTEFOS19JVElNRSkpLAorCQkgICAgICAgZ3AtPnJlZ3MgKyBSWERNQV9CTEFOSyk7CisJdmFsICA9ICgoKGdwLT5yeF9wYXVzZV9vZmYgLyA2NCkgPDwgMCkgJiBSWERNQV9QVEhSRVNIX09GRik7CisJdmFsIHw9ICgoKGdwLT5yeF9wYXVzZV9vbiAvIDY0KSA8PCAxMikgJiBSWERNQV9QVEhSRVNIX09OKTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIFJYRE1BX1BUSFJFU0gpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl3cml0ZWwodmFsIHwgUlhETUFfQ0ZHX0VOQUJMRSwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXdyaXRlbChNQUNfUlhTVEFUX1JDViwgZ3AtPnJlZ3MgKyBNQUNfUlhNQVNLKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJd3JpdGVsKHZhbCB8IE1BQ19SWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fcnhtYWNfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgcnhtYWNfc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYU1RBVCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4bWFjIGludGVycnVwdCwgcnhtYWNfc3RhdDogMHgleFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIHJ4bWFjX3N0YXQpOworCisJaWYgKHJ4bWFjX3N0YXQgJiBNQUNfUlhTVEFUX09GTFcpIHsKKwkJdTMyIHNtYWMgPSByZWFkbChncC0+cmVncyArIE1BQ19TTUFDSElORSk7CisKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggTUFDIGZpZm8gb3ZlcmZsb3cgc21hY1slMDh4XS5cbiIsCisJCQkJZGV2LT5uYW1lLCBzbWFjKTsKKwkJZ3AtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQlncC0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisKKwkJcmV0ID0gZ2VtX3J4bWFjX3Jlc2V0KGdwKTsKKwl9CisKKwlpZiAocnhtYWNfc3RhdCAmIE1BQ19SWFNUQVRfQUNFKQorCQlncC0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSAweDEwMDAwOworCisJaWYgKHJ4bWFjX3N0YXQgJiBNQUNfUlhTVEFUX0NDRSkKKwkJZ3AtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICs9IDB4MTAwMDA7CisKKwlpZiAocnhtYWNfc3RhdCAmIE1BQ19SWFNUQVRfTENFKQorCQlncC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gMHgxMDAwMDsKKworCS8qIFdlIGRvIG5vdCB0cmFjayBNQUNfUlhTVEFUX0ZDRSBhbmQgTUFDX1JYU1RBVF9WQ0UKKwkgKiBldmVudHMuCisJICovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZW1fbWFjX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIG1hY19jc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0NTVEFUKTsKKworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWFjIGludGVycnVwdCwgbWFjX2NzdGF0OiAweCV4XG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgbWFjX2NzdGF0KTsKKworCS8qIFRoaXMgaW50ZXJydXB0IGlzIGp1c3QgZm9yIHBhdXNlIGZyYW1lIGFuZCBwYXVzZQorCSAqIHRyYWNraW5nLiAgSXQgaXMgdXNlZnVsIGZvciBkaWFnbm9zdGljcyBhbmQgZGVidWcKKwkgKiBidXQgcHJvYmFibHkgYnkgZGVmYXVsdCB3ZSB3aWxsIG1hc2sgdGhlc2UgZXZlbnRzLgorCSAqLworCWlmIChtYWNfY3N0YXQgJiBNQUNfQ1NUQVRfUFMpCisJCWdwLT5wYXVzZV9lbnRlcmVkKys7CisKKwlpZiAobWFjX2NzdGF0ICYgTUFDX0NTVEFUX1BSQ1YpCisJCWdwLT5wYXVzZV9sYXN0X3RpbWVfcmVjdmQgPSAobWFjX2NzdGF0ID4+IDE2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9taWZfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgbWlmX3N0YXR1cyA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX1NUQVRVUyk7CisJdTMyIHJlZ192YWwsIGNoYW5nZWRfYml0czsKKworCXJlZ192YWwgPSAobWlmX3N0YXR1cyAmIE1JRl9TVEFUVVNfREFUQSkgPj4gMTY7CisJY2hhbmdlZF9iaXRzID0gKG1pZl9zdGF0dXMgJiBNSUZfU1RBVFVTX1NUQVQpOworCisJZ2VtX2hhbmRsZV9taWZfZXZlbnQoZ3AsIHJlZ192YWwsIGNoYW5nZWRfYml0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fcGNpX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIHBjaV9lc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19QQ0lFU1RBVCk7CisKKwlpZiAoZ3AtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgorCSAgICBncC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX0dFTSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgZXJyb3IgWyUwNHhdICIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBjaV9lc3RhdCk7CisKKwkJaWYgKHBjaV9lc3RhdCAmIEdSRUdfUENJRVNUQVRfQkFEQUNLKQorCQkJcHJpbnRrKCI8Tm8gQUNLNjQjIGR1cmluZyBBQlM2NCBjeWNsZT4gIik7CisJCWlmIChwY2lfZXN0YXQgJiBHUkVHX1BDSUVTVEFUX0RUUlRPKQorCQkJcHJpbnRrKCI8RGVsYXllZCB0cmFuc2FjdGlvbiB0aW1lb3V0PiAiKTsKKwkJaWYgKHBjaV9lc3RhdCAmIEdSRUdfUENJRVNUQVRfT1RIRVIpCisJCQlwcmludGsoIjxvdGhlcj4iKTsKKwkJcHJpbnRrKCJcbiIpOworCX0gZWxzZSB7CisJCXBjaV9lc3RhdCB8PSBHUkVHX1BDSUVTVEFUX09USEVSOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHBjaV9lc3RhdCAmIEdSRUdfUENJRVNUQVRfT1RIRVIpIHsKKwkJdTE2IHBjaV9jZmdfc3RhdDsKKworCQkvKiBJbnRlcnJvZ2F0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciB0aGUKKwkJICogdHJ1ZSBjYXVzZS4KKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGdwLT5wZGV2LCBQQ0lfU1RBVFVTLAorCQkJCSAgICAgJnBjaV9jZmdfc3RhdCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlYWQgUENJIGNmZyBzcGFjZSBzdGF0dXMgWyUwNHhdXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBwY2lfY2ZnX3N0YXQpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19QQVJJVFkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgcGFyaXR5IGVycm9yIGRldGVjdGVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIHRhcmdldCBhYm9ydC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBtYXN0ZXIgYWNrcyB0YXJnZXQgYWJvcnQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgbWFzdGVyIGFib3J0LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIHN5c3RlbSBlcnJvciBTRVJSIy5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIHBhcml0eSBlcnJvci5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKworCQkvKiBXcml0ZSB0aGUgZXJyb3IgYml0cyBiYWNrIHRvIGNsZWFyIHRoZW0uICovCisJCXBjaV9jZmdfc3RhdCAmPSAoUENJX1NUQVRVU19QQVJJVFkgfAorCQkJCSBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQgfAorCQkJCSBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfAorCQkJCSBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgfAorCQkJCSBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfAorCQkJCSBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChncC0+cGRldiwKKwkJCQkgICAgICBQQ0lfU1RBVFVTLCBwY2lfY2ZnX3N0YXQpOworCX0KKworCS8qIEZvciBhbGwgUENJIGVycm9ycywgd2Ugc2hvdWxkIHJlc2V0IHRoZSBjaGlwLiAqLworCXJldHVybiAxOworfQorCisvKiBBbGwgbm9uLW5vcm1hbCBpbnRlcnJ1cHQgY29uZGl0aW9ucyBnZXQgc2VydmljZWQgaGVyZS4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgd2Ugc2hvdWxkIGp1c3QgZXhpdCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIHJpZ2h0IG5vdyAoaWUuIGlmIHdlIHJlc2V0IHRoZSBjYXJkIHdoaWNoIGludmFsaWRhdGVzCisgKiBhbGwgb2YgdGhlIG90aGVyIG9yaWdpbmFsIGlycSBzdGF0dXMgYml0cykuCisgKi8KK3N0YXRpYyBpbnQgZ2VtX2Fibm9ybWFsX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhOT0JVRikgeworCQkvKiBGcmFtZSBhcnJpdmVkLCBubyBmcmVlIFJYIGJ1ZmZlcnMgYXZhaWxhYmxlLiAqLworCQlpZiAobmV0aWZfbXNnX3J4X2VycihncCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIGJ1ZmZlciBmb3IgcnggZnJhbWVcbiIsCisJCQkJZ3AtPmRldi0+bmFtZSk7CisJCWdwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1JYVEFHRVJSKSB7CisJCS8qIGNvcnJ1cHQgUlggdGFnIGZyYW1pbmcgKi8KKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoZ3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb3JydXB0IHJ4IHRhZyBmcmFtaW5nXG4iLAorCQkJCWdwLT5kZXYtPm5hbWUpOworCQlncC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCisJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUENTKSB7CisJCWlmIChnZW1fcGNzX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhNQUMpIHsKKwkJaWYgKGdlbV90eG1hY19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1JYTUFDKSB7CisJCWlmIChnZW1fcnhtYWNfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9NQUMpIHsKKwkJaWYgKGdlbV9tYWNfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9NSUYpIHsKKwkJaWYgKGdlbV9taWZfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9QQ0lFUlIpIHsKKwkJaWYgKGdlbV9wY2lfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlyZXR1cm4gMDsKKworZG9fcmVzZXQ6CisJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJc2NoZWR1bGVfd29yaygmZ3AtPnJlc2V0X3Rhc2spOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZ2VtX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwlpbnQgZW50cnksIGxpbWl0OworCisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBpbnRlcnJ1cHQsIGdlbV9zdGF0dXM6IDB4JXhcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCBnZW1fc3RhdHVzKTsKKworCWVudHJ5ID0gZ3AtPnR4X29sZDsKKwlsaW1pdCA9ICgoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9UWE5SKSA+PiBHUkVHX1NUQVRfVFhOUl9TSElGVCk7CisJd2hpbGUgKGVudHJ5ICE9IGxpbWl0KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBnZW1fdHhkICp0eGQ7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCXUzMiBkbWFfbGVuOworCQlpbnQgZnJhZzsKKworCQlpZiAobmV0aWZfbXNnX3R4X2RvbmUoZ3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lLCBzbG90ICVkXG4iLAorCQkJCWdwLT5kZXYtPm5hbWUsIGVudHJ5KTsKKwkJc2tiID0gZ3AtPnR4X3NrYnNbZW50cnldOworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgeworCQkJaW50IGxhc3QgPSBlbnRyeSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCQlpbnQgd2FsayA9IGVudHJ5OworCQkJaW50IGluY29tcGxldGUgPSAwOworCisJCQlsYXN0ICY9IChUWF9SSU5HX1NJWkUgLSAxKTsKKwkJCWZvciAoOzspIHsKKwkJCQl3YWxrID0gTkVYVF9UWCh3YWxrKTsKKwkJCQlpZiAod2FsayA9PSBsaW1pdCkKKwkJCQkJaW5jb21wbGV0ZSA9IDE7CisJCQkJaWYgKHdhbGsgPT0gbGFzdCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5jb21wbGV0ZSkKKwkJCQlicmVhazsKKwkJfQorCQlncC0+dHhfc2tic1tlbnRyeV0gPSBOVUxMOworCQlncC0+bmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPD0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQl0eGQgPSAmZ3AtPmluaXRfYmxvY2stPnR4ZFtlbnRyeV07CisKKwkJCWRtYV9hZGRyID0gbGU2NF90b19jcHUodHhkLT5idWZmZXIpOworCQkJZG1hX2xlbiA9IGxlNjRfdG9fY3B1KHR4ZC0+Y29udHJvbF93b3JkKSAmIFRYRENUUkxfQlVGU1o7CisKKwkJCXBjaV91bm1hcF9wYWdlKGdwLT5wZGV2LCBkbWFfYWRkciwgZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCQl9CisKKwkJZ3AtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCWdwLT50eF9vbGQgPSBlbnRyeTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwoZ3ApID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGdlbV9wb3N0X3J4ZHMoc3RydWN0IGdlbSAqZ3AsIGludCBsaW1pdCkKK3sKKwlpbnQgY2x1c3Rlcl9zdGFydCwgY3VyciwgY291bnQsIGtpY2s7CisKKwljbHVzdGVyX3N0YXJ0ID0gY3VyciA9IChncC0+cnhfbmV3ICYgfig0IC0gMSkpOworCWNvdW50ID0gMDsKKwlraWNrID0gLTE7CisJd21iKCk7CisJd2hpbGUgKGN1cnIgIT0gbGltaXQpIHsKKwkJY3VyciA9IE5FWFRfUlgoY3Vycik7CisJCWlmICgrK2NvdW50ID09IDQpIHsKKwkJCXN0cnVjdCBnZW1fcnhkICpyeGQgPQorCQkJCSZncC0+aW5pdF9ibG9jay0+cnhkW2NsdXN0ZXJfc3RhcnRdOworCQkJZm9yICg7OykgeworCQkJCXJ4ZC0+c3RhdHVzX3dvcmQgPSBjcHVfdG9fbGU2NChSWERDVFJMX0ZSRVNIKGdwKSk7CisJCQkJcnhkKys7CisJCQkJY2x1c3Rlcl9zdGFydCA9IE5FWFRfUlgoY2x1c3Rlcl9zdGFydCk7CisJCQkJaWYgKGNsdXN0ZXJfc3RhcnQgPT0gY3VycikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlraWNrID0gY3VycjsKKwkJCWNvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoa2ljayA+PSAwKSB7CisJCW1iKCk7CisJCXdyaXRlbChraWNrLCBncC0+cmVncyArIFJYRE1BX0tJQ0spOworCX0KK30KKworc3RhdGljIGludCBnZW1fcngoc3RydWN0IGdlbSAqZ3AsIGludCB3b3JrX3RvX2RvKQoreworCWludCBlbnRyeSwgZHJvcHMsIHdvcmtfZG9uZSA9IDA7CisJdTMyIGRvbmU7CisKKwlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnggaW50ZXJydXB0LCBkb25lOiAlZCwgcnhfbmV3OiAlZFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIHJlYWRsKGdwLT5yZWdzICsgUlhETUFfRE9ORSksIGdwLT5yeF9uZXcpOworCisJZW50cnkgPSBncC0+cnhfbmV3OworCWRyb3BzID0gMDsKKwlkb25lID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9ET05FKTsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBnZW1fcnhkICpyeGQgPSAmZ3AtPmluaXRfYmxvY2stPnJ4ZFtlbnRyeV07CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXU2NCBzdGF0dXMgPSBjcHVfdG9fbGU2NChyeGQtPnN0YXR1c193b3JkKTsKKwkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwkJaW50IGxlbjsKKworCQlpZiAoKHN0YXR1cyAmIFJYRENUUkxfT1dOKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHdvcmtfZG9uZSA+PSBSWF9SSU5HX1NJWkUgfHwgd29ya19kb25lID49IHdvcmtfdG9fZG8pCisJCQlicmVhazsKKworCQkvKiBXaGVuIHdyaXRpbmcgYmFjayBSWCBkZXNjcmlwdG9yLCBHRU0gd3JpdGVzIHN0YXR1cworCQkgKiB0aGVuIGJ1ZmZlciBhZGRyZXNzLCBwb3NzaWJseSBpbiBzZXBlcmF0ZSB0cmFuc2FjdGlvbnMuCisJCSAqIElmIHdlIGRvbid0IHdhaXQgZm9yIHRoZSBjaGlwIHRvIHdyaXRlIGJvdGgsIHdlIGNvdWxkCisJCSAqIHBvc3QgYSBuZXcgYnVmZmVyIHRvIHRoaXMgZGVzY3JpcHRvciB0aGVuIGhhdmUgR0VNIHNwYW0KKwkJICogb24gdGhlIGJ1ZmZlciBhZGRyZXNzLiAgV2Ugc3luYyBvbiB0aGUgUlggY29tcGxldGlvbgorCQkgKiByZWdpc3RlciB0byBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcuCisJCSAqLworCQlpZiAoZW50cnkgPT0gZG9uZSkgeworCQkJZG9uZSA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfRE9ORSk7CisJCQlpZiAoZW50cnkgPT0gZG9uZSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGNhbiBub3cgYWNjb3VudCBmb3IgdGhlIHdvcmsgd2UncmUgYWJvdXQgdG8gZG8gKi8KKwkJd29ya19kb25lKys7CisKKwkJc2tiID0gZ3AtPnJ4X3NrYnNbZW50cnldOworCisJCWxlbiA9IChzdGF0dXMgJiBSWERDVFJMX0JVRlNaKSA+PiAxNjsKKwkJaWYgKChsZW4gPCBFVEhfWkxFTikgfHwgKHN0YXR1cyAmIFJYRENUUkxfQkFEKSkgeworCQkJZ3AtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChsZW4gPCBFVEhfWkxFTikKKwkJCQlncC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChsZW4gJiBSWERDVFJMX0JBRCkKKwkJCQlncC0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKworCQkJLyogV2UnbGwganVzdCByZXR1cm4gaXQgdG8gR0VNLiAqLworCQlkcm9wX2l0OgorCQkJZ3AtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlkbWFfYWRkciA9IGNwdV90b19sZTY0KHJ4ZC0+YnVmZmVyKTsKKwkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKworCQkJbmV3X3NrYiA9IGdlbV9hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChuZXdfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCXBjaV91bm1hcF9wYWdlKGdwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZ3AtPnJ4X3NrYnNbZW50cnldID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGdwLT5kZXY7CisJCQlza2JfcHV0KG5ld19za2IsIChncC0+cnhfYnVmX3N6ICsgUlhfT0ZGU0VUKSk7CisJCQlyeGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KHBjaV9tYXBfcGFnZShncC0+cGRldiwKKwkJCQkJCQkgICAgICAgdmlydF90b19wYWdlKG5ld19za2ItPmRhdGEpLAorCQkJCQkJCSAgICAgICBvZmZzZXRfaW5fcGFnZShuZXdfc2tiLT5kYXRhKSwKKwkJCQkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisKKwkJCS8qIFRyaW0gdGhlIG9yaWdpbmFsIHNrYiBmb3IgdGhlIG5ldGlmLiAqLworCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKworCQkJY29weV9za2ItPmRldiA9IGdwLT5kZXY7CisJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CisJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGdwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZ3AtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCS8qIFdlJ2xsIHJldXNlIHRoZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KKwkJCXNrYiA9IGNvcHlfc2tiOworCQl9CisKKwkJc2tiLT5jc3VtID0gbnRvaHMoKHN0YXR1cyAmIFJYRENUUkxfVENQQ1NVTSkgXiAweGZmZmYpOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBncC0+ZGV2KTsKKworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJCWdwLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQlncC0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJZ3AtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwluZXh0OgorCQllbnRyeSA9IE5FWFRfUlgoZW50cnkpOworCX0KKworCWdlbV9wb3N0X3J4ZHMoZ3AsIGVudHJ5KTsKKworCWdwLT5yeF9uZXcgPSBlbnRyeTsKKworCWlmIChkcm9wcykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJICAgICAgIGdwLT5kZXYtPm5hbWUpOworCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIGludCBnZW1fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBOQVBJIGxvY2tpbmcgbmlnaHRtYXJlOiBTZWUgY29tbWVudCBhdCBoZWFkIG9mIGRyaXZlciAKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCWRvIHsKKwkJaW50IHdvcmtfdG9fZG8sIHdvcmtfZG9uZTsKKworCQkvKiBIYW5kbGUgYW5vbWFsaWVzICovCisJCWlmIChncC0+c3RhdHVzICYgR1JFR19TVEFUX0FCTk9STUFMKSB7CisJCQlpZiAoZ2VtX2Fibm9ybWFsX2lycShkZXYsIGdwLCBncC0+c3RhdHVzKSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIFJ1biBUWCBjb21wbGV0aW9uIHRocmVhZCAqLworCQlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKwkJZ2VtX3R4KGRldiwgZ3AsIGdwLT5zdGF0dXMpOworCQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogUnVuIFJYIHRocmVhZC4gV2UgZG9uJ3QgdXNlIGFueSBsb2NraW5nIGhlcmUsIAorCQkgKiBjb2RlIHdpbGxpbmcgdG8gZG8gYmFkIHRoaW5ncyAtIGxpa2UgY2xlYW5pbmcgdGhlIAorCQkgKiByeCByaW5nIC0gbXVzdCBjYWxsIG5ldGlmX3BvbGxfZGlzYWJsZSgpLCB3aGljaAorCQkgKiBzY2hlZHVsZV90aW1lb3V0KCkncyBpZiBwb2xsaW5nIGlzIGFscmVhZHkgZGlzYWJsZWQuCisJCSAqLworCQl3b3JrX3RvX2RvID0gbWluKCpidWRnZXQsIGRldi0+cXVvdGEpOworCisJCXdvcmtfZG9uZSA9IGdlbV9yeChncCwgd29ya190b19kbyk7CisKKwkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJCWlmICh3b3JrX2RvbmUgPj0gd29ya190b19kbykKKwkJCXJldHVybiAxOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCQkKKwkJZ3AtPnN0YXR1cyA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19TVEFUKTsKKwl9IHdoaWxlIChncC0+c3RhdHVzICYgR1JFR19TVEFUX05BUEkpOworCisJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCWdlbV9lbmFibGVfaW50cyhncCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZ2VtX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFN3YWxsb3cgaW50ZXJydXB0cyB3aGVuIHNodXR0aW5nIHRoZSBjaGlwIGRvd24sIHRob3VnaAorCSAqIHRoYXQgc2hvdWxkbid0IGhhcHBlbiwgd2Ugc2hvdWxkIGhhdmUgZG9uZSBmcmVlX2lycSgpIGF0CisJICogdGhpcyBwb2ludC4uLgorCSAqLworCWlmICghZ3AtPnJ1bm5pbmcpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCQorCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJdTMyIGdlbV9zdGF0dXMgPSByZWFkbChncC0+cmVncyArIEdSRUdfU1RBVCk7CisKKwkJaWYgKGdlbV9zdGF0dXMgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfQorCQlncC0+c3RhdHVzID0gZ2VtX3N0YXR1czsKKwkJZ2VtX2Rpc2FibGVfaW50cyhncCk7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworICAKKwkvKiBJZiBwb2xsaW5nIHdhcyBkaXNhYmxlZCBhdCB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGF0CisJICogaW50ZXJydXB0LCB3ZSBtYXkgcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgd2hpbGUgd2UgCisJICogc2hvdWxkIHJldHVybiBJUlFfTk9ORS4gTm8gYmlnIGRlYWwuLi4KKwkgKi8KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgZ2VtX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGdlbV9pbnRlcnJ1cHQgaXMgc2FmZSB0byByZWVudHJhbmNlIHNvIG5vIG5lZWQKKwkgKiB0byBkaXNhYmxlX2lycSBoZXJlLgorCSAqLworCWdlbV9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2VtX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCWlmICghZ3AtPnJ1bm5pbmcpIHsKKwkJcHJpbnRrKCIlczogaHJtLi4gaHcgbm90IHJ1bm5pbmcgIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9FUlIgIiVzOiBUWF9TVEFURVslMDh4OiUwOHg6JTA4eF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBUWERNQV9DRkcpLAorCSAgICAgICByZWFkbChncC0+cmVncyArIE1BQ19UWFNUQVQpLAorCSAgICAgICByZWFkbChncC0+cmVncyArIE1BQ19UWENGRykpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYX1NUQVRFWyUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICByZWFkbChncC0+cmVncyArIFJYRE1BX0NGRyksCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYU1RBVCksCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKSk7CisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKKwlzY2hlZHVsZV93b3JrKCZncC0+cmVzZXRfdGFzayk7CisKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZ2VtX2ludG1lKGludCBlbnRyeSkKK3sKKwkvKiBBbGdvcml0aG06IElSUSBldmVyeSAxLzIgb2YgZGVzY3JpcHRvcnMuICovCisJaWYgKCEoZW50cnkgJiAoKFRYX1JJTkdfU0laRT4+MSktMSkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJaW50IGVudHJ5OworCXU2NCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljdHJsID0gMDsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJdTY0IGNzdW1fc3RhcnRfb2ZmLCBjc3VtX3N0dWZmX29mZjsKKworCQljc3VtX3N0YXJ0X29mZiA9ICh1NjQpIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJY3N1bV9zdHVmZl9vZmYgPSAodTY0KSAoKHNrYi0+aC5yYXcgKyBza2ItPmNzdW0pIC0gc2tiLT5kYXRhKTsKKworCQljdHJsID0gKFRYRENUUkxfQ0VOQUIgfAorCQkJKGNzdW1fc3RhcnRfb2ZmIDw8IDE1KSB8CisJCQkoY3N1bV9zdHVmZl9vZmYgPDwgMjEpKTsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKCFzcGluX3RyeWxvY2soJmdwLT50eF9sb2NrKSkgeworCQkvKiBUZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKKwl9CisJLyogV2UgcmFjZWQgd2l0aCBnZW1fZG9fc3RvcCgpICovCisJaWYgKCFncC0+cnVubmluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+dHhfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJLyogVGhpcyBpcyBhIGhhcmQgZXJyb3IsIGxvZyBpdC4gKi8KKwlpZiAoVFhfQlVGRlNfQVZBSUwoZ3ApIDw9IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+dHhfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJZW50cnkgPSBncC0+dHhfbmV3OworCWdwLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKKworCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApIHsKKwkJc3RydWN0IGdlbV90eGQgKnR4ZCA9ICZncC0+aW5pdF9ibG9jay0+dHhkW2VudHJ5XTsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQl1MzIgbGVuOworCisJCWxlbiA9IHNrYi0+bGVuOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGdwLT5wZGV2LAorCQkJCSAgICAgICB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJY3RybCB8PSBUWERDVFJMX1NPRiB8IFRYRENUUkxfRU9GIHwgbGVuOworCQlpZiAoZ2VtX2ludG1lKGVudHJ5KSkKKwkJCWN0cmwgfD0gVFhEQ1RSTF9JTlRNRTsKKwkJdHhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKKwkJd21iKCk7CisJCXR4ZC0+Y29udHJvbF93b3JkID0gY3B1X3RvX2xlNjQoY3RybCk7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGdlbV90eGQgKnR4ZDsKKwkJdTMyIGZpcnN0X2xlbjsKKwkJdTY0IGludG1lOworCQlkbWFfYWRkcl90IGZpcnN0X21hcHBpbmc7CisJCWludCBmcmFnLCBmaXJzdF9lbnRyeSA9IGVudHJ5OworCisJCWludG1lID0gMDsKKwkJaWYgKGdlbV9pbnRtZShlbnRyeSkpCisJCQlpbnRtZSB8PSBUWERDVFJMX0lOVE1FOworCisJCS8qIFdlIG11c3QgZ2l2ZSB0aGlzIGluaXRpYWwgY2h1bmsgdG8gdGhlIGRldmljZSBsYXN0LgorCQkgKiBPdGhlcndpc2Ugd2UgY291bGQgcmFjZSB3aXRoIHRoZSBkZXZpY2UuCisJCSAqLworCQlmaXJzdF9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlmaXJzdF9tYXBwaW5nID0gcGNpX21hcF9wYWdlKGdwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkJICAgICBvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEpLAorCQkJCQkgICAgIGZpcnN0X2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisKKwkJZm9yIChmcmFnID0gMDsgZnJhZyA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJc2tiX2ZyYWdfdCAqdGhpc19mcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ107CisJCQl1MzIgbGVuOworCQkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQkJdTY0IHRoaXNfY3RybDsKKworCQkJbGVuID0gdGhpc19mcmFnLT5zaXplOworCQkJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShncC0+cGRldiwKKwkJCQkJICAgICAgIHRoaXNfZnJhZy0+cGFnZSwKKwkJCQkJICAgICAgIHRoaXNfZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJdGhpc19jdHJsID0gY3RybDsKKwkJCWlmIChmcmFnID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKQorCQkJCXRoaXNfY3RybCB8PSBUWERDVFJMX0VPRjsKKwkJCQorCQkJdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZW50cnldOworCQkJdHhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKKwkJCXdtYigpOworCQkJdHhkLT5jb250cm9sX3dvcmQgPSBjcHVfdG9fbGU2NCh0aGlzX2N0cmwgfCBsZW4pOworCisJCQlpZiAoZ2VtX2ludG1lKGVudHJ5KSkKKwkJCQlpbnRtZSB8PSBUWERDVFJMX0lOVE1FOworCisJCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCQl9CisJCXR4ZCA9ICZncC0+aW5pdF9ibG9jay0+dHhkW2ZpcnN0X2VudHJ5XTsKKwkJdHhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChmaXJzdF9tYXBwaW5nKTsKKwkJd21iKCk7CisJCXR4ZC0+Y29udHJvbF93b3JkID0KKwkJCWNwdV90b19sZTY0KGN0cmwgfCBUWERDVFJMX1NPRiB8IGludG1lIHwgZmlyc3RfbGVuKTsKKwl9CisKKwlncC0+dHhfbmV3ID0gZW50cnk7CisJaWYgKFRYX0JVRkZTX0FWQUlMKGdwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggcXVldWVkLCBzbG90ICVkLCBza2JsZW4gJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBza2ItPmxlbik7CisJbWIoKTsKKwl3cml0ZWwoZ3AtPnR4X25ldywgZ3AtPnJlZ3MgKyBUWERNQV9LSUNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+dHhfbG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisjZGVmaW5lIFNUT1BfVFJJRVMgMzIKKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9yZXNldChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlpbnQgbGltaXQ7CisJdTMyIHZhbDsKKworCS8qIE1ha2Ugc3VyZSB3ZSB3b24ndCBnZXQgYW55IG1vcmUgaW50ZXJydXB0cyAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBncC0+cmVncyArIEdSRUdfSU1BU0spOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwl3cml0ZWwoZ3AtPnN3cnN0X2Jhc2UgfCBHUkVHX1NXUlNUX1RYUlNUIHwgR1JFR19TV1JTVF9SWFJTVCwKKwkgICAgICAgZ3AtPnJlZ3MgKyBHUkVHX1NXUlNUKTsKKworCWxpbWl0ID0gU1RPUF9UUklFUzsKKworCWRvIHsKKwkJdWRlbGF5KDIwKTsKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX1NXUlNUKTsKKwkJaWYgKGxpbWl0LS0gPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKHZhbCAmIChHUkVHX1NXUlNUX1RYUlNUIHwgR1JFR19TV1JTVF9SWFJTVCkpOworCisJaWYgKGxpbWl0IDw9IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNXIHJlc2V0IGlzIGdoZXR0by5cbiIsIGdwLT5kZXYtPm5hbWUpOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX3N0YXJ0X2RtYShzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1MzIgdmFsOworCQorCS8qIFdlIGFyZSByZWFkeSB0byByb2NrLCB0dXJuIGV2ZXJ5dGhpbmcgb24uICovCisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCXdyaXRlbCh2YWwgfCBUWERNQV9DRkdfRU5BQkxFLCBncC0+cmVncyArIFRYRE1BX0NGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXdyaXRlbCh2YWwgfCBSWERNQV9DRkdfRU5BQkxFLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXdyaXRlbCh2YWwgfCBNQUNfVFhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl3cml0ZWwodmFsIHwgTUFDX1JYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKworCSh2b2lkKSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJdWRlbGF5KDEwMCk7CisKKwlnZW1fZW5hYmxlX2ludHMoZ3ApOworCisJd3JpdGVsKFJYX1JJTkdfU0laRSAtIDQsIGdwLT5yZWdzICsgUlhETUFfS0lDSyk7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suIERNQSB3b24ndCBiZQorICogYWN0dWFsbHkgc3RvcHBlZCBiZWZvcmUgYWJvdXQgNG1zIHRobyAuLi4KKyAqLworc3RhdGljIHZvaWQgZ2VtX3N0b3BfZG1hKHN0cnVjdCBnZW0gKmdwKQoreworCXUzMiB2YWw7CisKKwkvKiBXZSBhcmUgZG9uZSByb2NraW5nLCB0dXJuIGV2ZXJ5dGhpbmcgb2ZmLiAqLworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKwl3cml0ZWwodmFsICYgflRYRE1BX0NGR19FTkFCTEUsIGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIFJYRE1BX0NGRyk7CisJd3JpdGVsKHZhbCAmIH5SWERNQV9DRkdfRU5BQkxFLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXdyaXRlbCh2YWwgJiB+TUFDX1RYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJd3JpdGVsKHZhbCAmIH5NQUNfUlhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCisJKHZvaWQpIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKworCS8qIE5lZWQgdG8gd2FpdCBhIGJpdCAuLi4gZG9uZSBieSB0aGUgY2FsbGVyICovCit9CisKKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KKy8vIFhYWCBkYmwgY2hlY2sgd2hhdCB0aGF0IGZ1bmN0aW9uIHNob3VsZCBkbyB3aGVuIGNhbGxlZCBvbiBQQ1MgUEhZCitzdGF0aWMgdm9pZCBnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihzdHJ1Y3QgZ2VtICpncCwgc3RydWN0IGV0aHRvb2xfY21kICplcCkKK3sKKwl1MzIgYWR2ZXJ0aXNlLCBmZWF0dXJlczsKKwlpbnQgYXV0b25lZzsKKwlpbnQgc3BlZWQ7CisJaW50IGR1cGxleDsKKworCWlmIChncC0+cGh5X3R5cGUgIT0gcGh5X21paV9tZGlvMCAmJgorICAgICAJICAgIGdwLT5waHlfdHlwZSAhPSBwaHlfbWlpX21kaW8xKQorICAgICAJICAgIAlnb3RvIG5vbl9taWk7CisKKwkvKiBTZXR1cCBhZHZlcnRpc2UgKi8KKwlpZiAoZm91bmRfbWlpX3BoeShncCkpCisJCWZlYXR1cmVzID0gZ3AtPnBoeV9taWkuZGVmLT5mZWF0dXJlczsKKwllbHNlCisJCWZlYXR1cmVzID0gMDsKKworCWFkdmVydGlzZSA9IGZlYXR1cmVzICYgQURWRVJUSVNFX01BU0s7CisJaWYgKGdwLT5waHlfbWlpLmFkdmVydGlzaW5nICE9IDApCisJCWFkdmVydGlzZSAmPSBncC0+cGh5X21paS5hZHZlcnRpc2luZzsKKworCWF1dG9uZWcgPSBncC0+d2FudF9hdXRvbmVnOworCXNwZWVkID0gZ3AtPnBoeV9taWkuc3BlZWQ7CisJZHVwbGV4ID0gZ3AtPnBoeV9taWkuZHVwbGV4OworCQorCS8qIFNldHVwIGxpbmsgcGFyYW1ldGVycyAqLworCWlmICghZXApCisJCWdvdG8gc3RhcnRfYW5lZzsKKwlpZiAoZXAtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJYWR2ZXJ0aXNlID0gZXAtPmFkdmVydGlzaW5nOworCQlhdXRvbmVnID0gMTsKKwl9IGVsc2UgeworCQlhdXRvbmVnID0gMDsKKwkJc3BlZWQgPSBlcC0+c3BlZWQ7CisJCWR1cGxleCA9IGVwLT5kdXBsZXg7CisJfQorCitzdGFydF9hbmVnOgorCS8qIFNhbml0aXplIHNldHRpbmdzIGJhc2VkIG9uIFBIWSBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoKGZlYXR1cmVzICYgU1VQUE9SVEVEX0F1dG9uZWcpID09IDApCisJCWF1dG9uZWcgPSAwOworCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwICYmCisJICAgICEoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKSkpCisJCXNwZWVkID0gU1BFRURfMTAwOworCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAgJiYKKwkgICAgIShmZWF0dXJlcyAmIChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKSkpCisJCXNwZWVkID0gU1BFRURfMTA7CisJaWYgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCAmJgorCSAgICAhKGZlYXR1cmVzICYgKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJICAgIAkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJICAgIAkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSkpCisJICAgIAlkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlpZiAoc3BlZWQgPT0gMCkKKwkJc3BlZWQgPSBTUEVFRF8xMDsKKwkKKwkvKiBJZiB3ZSBhcmUgYXNsZWVwLCB3ZSBkb24ndCB0cnkgdG8gYWN0dWFsbHkgc2V0dXAgdGhlIFBIWSwgd2UKKwkgKiBqdXN0IHN0b3JlIHRoZSBzZXR0aW5ncworCSAqLworCWlmIChncC0+YXNsZWVwKSB7CisJCWdwLT5waHlfbWlpLmF1dG9uZWcgPSBncC0+d2FudF9hdXRvbmVnID0gYXV0b25lZzsKKwkJZ3AtPnBoeV9taWkuc3BlZWQgPSBzcGVlZDsKKwkJZ3AtPnBoeV9taWkuZHVwbGV4ID0gZHVwbGV4OworCQlyZXR1cm47CisJfQorCisJLyogQ29uZmlndXJlIFBIWSAmIHN0YXJ0IGFuZWcgKi8KKwlncC0+d2FudF9hdXRvbmVnID0gYXV0b25lZzsKKwlpZiAoYXV0b25lZykgeworCQlpZiAoZm91bmRfbWlpX3BoeShncCkpCisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfYW5lZygmZ3AtPnBoeV9taWksIGFkdmVydGlzZSk7CisJCWdwLT5sc3RhdGUgPSBsaW5rX2FuZWc7CisJfSBlbHNlIHsKKwkJaWYgKGZvdW5kX21paV9waHkoZ3ApKQorCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2ZvcmNlZCgmZ3AtPnBoeV9taWksIHNwZWVkLCBkdXBsZXgpOworCQlncC0+bHN0YXRlID0gbGlua19mb3JjZV9vazsKKwl9CisKK25vbl9taWk6CisJZ3AtPnRpbWVyX3RpY2tzID0gMDsKKwltb2RfdGltZXIoJmdwLT5saW5rX3RpbWVyLCBqaWZmaWVzICsgKCgxMiAqIEhaKSAvIDEwKSk7Cit9CisKKy8qIEEgbGluay11cCBjb25kaXRpb24gaGFzIG9jY3VycmVkLCBpbml0aWFsaXplIGFuZCBlbmFibGUgdGhlCisgKiByZXN0IG9mIHRoZSBjaGlwLgorICoKKyAqIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suCisgKi8KK3N0YXRpYyBpbnQgZ2VtX3NldF9saW5rX21vZGVzKHN0cnVjdCBnZW0gKmdwKQoreworCXUzMiB2YWw7CisJaW50IGZ1bGxfZHVwbGV4LCBzcGVlZCwgcGF1c2U7CisKKwlmdWxsX2R1cGxleCA9IDA7CisJc3BlZWQgPSBTUEVFRF8xMDsKKwlwYXVzZSA9IDA7CisKKwlpZiAoZm91bmRfbWlpX3BoeShncCkpIHsKKwkgICAgCWlmIChncC0+cGh5X21paS5kZWYtPm9wcy0+cmVhZF9saW5rKCZncC0+cGh5X21paSkpCisJICAgIAkJcmV0dXJuIDE7CisJCWZ1bGxfZHVwbGV4ID0gKGdwLT5waHlfbWlpLmR1cGxleCA9PSBEVVBMRVhfRlVMTCk7CisJCXNwZWVkID0gZ3AtPnBoeV9taWkuc3BlZWQ7CisJCXBhdXNlID0gZ3AtPnBoeV9taWkucGF1c2U7CisJfSBlbHNlIGlmIChncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmlhbGluayB8fAorCSAgICAJICAgZ3AtPnBoeV90eXBlID09IHBoeV9zZXJkZXMpIHsKKwkJdTMyIHBjc19scGEgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlMUCk7CisKKwkJaWYgKHBjc19scGEgJiBQQ1NfTUlJQURWX0ZEKQorCQkJZnVsbF9kdXBsZXggPSAxOworCQlzcGVlZCA9IFNQRUVEXzEwMDA7CisJfQorCisJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMtZHVwbGV4LlxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIHNwZWVkLCAoZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpKTsKKworCWlmICghZ3AtPnJ1bm5pbmcpCisJCXJldHVybiAwOworCisJdmFsID0gKE1BQ19UWENGR19FSVBHMCB8IE1BQ19UWENGR19OR1UpOworCWlmIChmdWxsX2R1cGxleCkgeworCQl2YWwgfD0gKE1BQ19UWENGR19JQ1MgfCBNQUNfVFhDRkdfSUNPTEwpOworCX0gZWxzZSB7CisJCS8qIE1BQ19UWENGR19OQk8gbXVzdCBiZSB6ZXJvLiAqLworCX0JCisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCisJdmFsID0gKE1BQ19YSUZDRkdfT0UgfCBNQUNfWElGQ0ZHX0xMRUQpOworCWlmICghZnVsbF9kdXBsZXggJiYKKwkgICAgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CisJICAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkpIHsKKwkJdmFsIHw9IE1BQ19YSUZDRkdfRElTRTsKKwl9IGVsc2UgaWYgKGZ1bGxfZHVwbGV4KSB7CisJCXZhbCB8PSBNQUNfWElGQ0ZHX0ZMRUQ7CisJfQorCisJaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCXZhbCB8PSAoTUFDX1hJRkNGR19HTUlJKTsKKworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisKKwkvKiBJZiBnaWdhYml0IGFuZCBoYWxmLWR1cGxleCwgZW5hYmxlIGNhcnJpZXIgZXh0ZW5zaW9uCisJICogbW9kZS4gIEVsc2UsIGRpc2FibGUgaXQuCisJICovCisJaWYgKHNwZWVkID09IFNQRUVEXzEwMDAgJiYgIWZ1bGxfZHVwbGV4KSB7CisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwkJd3JpdGVsKHZhbCB8IE1BQ19UWENGR19UQ0UsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKworCQl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJCXdyaXRlbCh2YWwgfCBNQUNfUlhDRkdfUkNFLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisJfSBlbHNlIHsKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCQl3cml0ZWwodmFsICYgfk1BQ19UWENGR19UQ0UsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKworCQl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJCXdyaXRlbCh2YWwgJiB+TUFDX1JYQ0ZHX1JDRSwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCX0KKworCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmlhbGluayB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmRlcykgeworIAkJdTMyIHBjc19scGEgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlMUCk7CisKKwkJaWYgKHBjc19scGEgJiAoUENTX01JSUFEVl9TUCB8IFBDU19NSUlBRFZfQVApKQorCQkJcGF1c2UgPSAxOworCX0KKworCWlmIChuZXRpZl9tc2dfbGluayhncCkpIHsKKwkJaWYgKHBhdXNlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGF1c2UgaXMgZW5hYmxlZCAiCisJCQkgICAgICAgIihyeGZpZm86ICVkIG9mZjogJWQgb246ICVkKVxuIiwKKwkJCSAgICAgICBncC0+ZGV2LT5uYW1lLAorCQkJICAgICAgIGdwLT5yeF9maWZvX3N6LAorCQkJICAgICAgIGdwLT5yeF9wYXVzZV9vZmYsCisJCQkgICAgICAgZ3AtPnJ4X3BhdXNlX29uKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXVzZSBpcyBkaXNhYmxlZFxuIiwKKwkJCSAgICAgICBncC0+ZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmICghZnVsbF9kdXBsZXgpCisJCXdyaXRlbCg1MTIsIGdwLT5yZWdzICsgTUFDX1NUSU1FKTsKKwllbHNlCisJCXdyaXRlbCg2NCwgZ3AtPnJlZ3MgKyBNQUNfU1RJTUUpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX01DQ0ZHKTsKKwlpZiAocGF1c2UpCisJCXZhbCB8PSAoTUFDX01DQ0ZHX1NQRSB8IE1BQ19NQ0NGR19SUEUpOworCWVsc2UKKwkJdmFsICY9IH4oTUFDX01DQ0ZHX1NQRSB8IE1BQ19NQ0NGR19SUEUpOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgTUFDX01DQ0ZHKTsKKworCWdlbV9zdGFydF9kbWEoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgaW50IGdlbV9tZGlvX2xpbmtfbm90X3VwKHN0cnVjdCBnZW0gKmdwKQoreworCXN3aXRjaCAoZ3AtPmxzdGF0ZSkgeworCWNhc2UgbGlua19mb3JjZV9yZXQ6CisJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQXV0b25lZyBmYWlsZWQgYWdhaW4sIGtlZXBpbmciCisJCQkJIiBmb3JjZWQgbW9kZVxuIiwgZ3AtPmRldi0+bmFtZSk7CisJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmdwLT5waHlfbWlpLAorCQkJZ3AtPmxhc3RfZm9yY2VkX3NwZWVkLCBEVVBMRVhfSEFMRik7CisJCWdwLT50aW1lcl90aWNrcyA9IDU7CisJCWdwLT5sc3RhdGUgPSBsaW5rX2ZvcmNlX29rOworCQlyZXR1cm4gMDsKKwljYXNlIGxpbmtfYW5lZzoKKwkJLyogV2UgdHJ5IGZvcmNlZCBtb2RlcyBhZnRlciBhIGZhaWxlZCBhbmVnIG9ubHkgb24gUEhZcyB0aGF0IGRvbid0CisJCSAqIGhhdmUgIm1hZ2ljX2FuZWciIGJpdCBzZXQsIHdoaWNoIG1lYW5zIHRoZXkgaW50ZXJuYWxseSBkbyB0aGUKKwkJICogd2hpbGUgZm9yY2VkLW1vZGUgdGhpbmd5LiBPbiB0aGVzZSwgd2UganVzdCByZXN0YXJ0IGFuZWcKKwkJICovCisJCWlmIChncC0+cGh5X21paS5kZWYtPm1hZ2ljX2FuZWcpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gZm9yY2VkIDEwMGJ0XG4iLAorCQkJCWdwLT5kZXYtPm5hbWUpOworCQkvKiBUcnkgZm9yY2VkIG1vZGVzLiAqLworCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKCZncC0+cGh5X21paSwgU1BFRURfMTAwLAorCQkJRFVQTEVYX0hBTEYpOworCQlncC0+dGltZXJfdGlja3MgPSA1OworCQlncC0+bHN0YXRlID0gbGlua19mb3JjZV90cnk7CisJCXJldHVybiAwOworCWNhc2UgbGlua19mb3JjZV90cnk6CisJCS8qIERvd25ncmFkZSBmcm9tIDEwMCB0byAxMCBNYnBzIGlmIG5lY2Vzc2FyeS4KKwkJICogSWYgYWxyZWFkeSBhdCAxME1icHMsIHdhcm4gdXNlciBhYm91dCB0aGUKKwkJICogc2l0dWF0aW9uIGV2ZXJ5IDEwIHRpY2tzLgorCQkgKi8KKwkJaWYgKGdwLT5waHlfbWlpLnNwZWVkID09IFNQRUVEXzEwMCkgeworCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2ZvcmNlZCgmZ3AtPnBoeV9taWksIFNQRUVEXzEwLAorCQkJCURVUExFWF9IQUxGKTsKKwkJCWdwLT50aW1lcl90aWNrcyA9IDU7CisJCQlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gZm9yY2VkIDEwYnRcbiIsCisJCQkJCWdwLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZW1fbGlua190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGdlbSAqZ3AgPSAoc3RydWN0IGdlbSAqKSBkYXRhOworCWludCByZXN0YXJ0X2FuZWcgPSAwOworCQkKKwlpZiAoZ3AtPmFzbGVlcCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCWdlbV9nZXRfY2VsbChncCk7CisKKwkvKiBJZiB0aGUgcmVzZXQgdGFzayBpcyBzdGlsbCBwZW5kaW5nLCB3ZSBqdXN0CisJICogcmVzY2hlZHVsZSB0aGUgbGluayB0aW1lcgorCSAqLworCWlmIChncC0+cmVzZXRfdGFza19wZW5kaW5nKQorCQlnb3RvIHJlc3RhcnQ7CisJICAgIAkKKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmsgfHwKKwkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9zZXJkZXMpIHsKKwkJdTMyIHZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSVNUQVQpOworCisJCWlmICghKHZhbCAmIFBDU19NSUlTVEFUX0xTKSkKKwkJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSVNUQVQpOworCisJCWlmICgodmFsICYgUENTX01JSVNUQVRfTFMpICE9IDApIHsKKwkJCWdwLT5sc3RhdGUgPSBsaW5rX3VwOworCQkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKKwkJCSh2b2lkKWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisJCX0KKwkJZ290byByZXN0YXJ0OworCX0KKwlpZiAoZm91bmRfbWlpX3BoeShncCkgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnBvbGxfbGluaygmZ3AtPnBoeV9taWkpKSB7CisJCS8qIE9rLCBoZXJlIHdlIGdvdCBhIGxpbmsuIElmIHdlIGhhZCBpdCBkdWUgdG8gYSBmb3JjZWQKKwkJICogZmFsbGJhY2ssIGFuZCB3ZSB3ZXJlIGNvbmZpZ3VyZWQgZm9yIGF1dG9uZWcsIHdlIGRvCisJCSAqIHJldHJ5IGEgc2hvcnQgYXV0b25lZyBwYXNzLiBJZiB5b3Uga25vdyB5b3VyIGh1YiBpcworCQkgKiBicm9rZW4sIHVzZSBldGh0b29sIDspCisJCSAqLworCQlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX2ZvcmNlX3RyeSAmJiBncC0+d2FudF9hdXRvbmVnKSB7CisJCQlncC0+bHN0YXRlID0gbGlua19mb3JjZV9yZXQ7CisJCQlncC0+bGFzdF9mb3JjZWRfc3BlZWQgPSBncC0+cGh5X21paS5zcGVlZDsKKwkJCWdwLT50aW1lcl90aWNrcyA9IDU7CisJCQlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHb3QgbGluayBhZnRlciBmYWxsYmFjaywgcmV0cnlpbmciCisJCQkJCSIgYXV0b25lZyBvbmNlLi4uXG4iLCBncC0+ZGV2LT5uYW1lKTsKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9hbmVnKCZncC0+cGh5X21paSwgZ3AtPnBoeV9taWkuYWR2ZXJ0aXNpbmcpOworCQl9IGVsc2UgaWYgKGdwLT5sc3RhdGUgIT0gbGlua191cCkgeworCQkJZ3AtPmxzdGF0ZSA9IGxpbmtfdXA7CisJCQluZXRpZl9jYXJyaWVyX29uKGdwLT5kZXYpOworCQkJaWYgKGdlbV9zZXRfbGlua19tb2RlcyhncCkpCisJCQkJcmVzdGFydF9hbmVnID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBsaW5rIHdhcyBwcmV2aW91c2x5IHVwLCB3ZSByZXN0YXJ0IHRoZQorCQkgKiB3aG9sZSBwcm9jZXNzCisJCSAqLworCQlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX3VwKSB7CisJCQlncC0+bHN0YXRlID0gbGlua19kb3duOworCQkJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBkb3duXG4iLAorCQkJCQlncC0+ZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGdwLT5kZXYpOworCQkJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJCQlzY2hlZHVsZV93b3JrKCZncC0+cmVzZXRfdGFzayk7CisJCQlyZXN0YXJ0X2FuZWcgPSAxOworCQl9IGVsc2UgaWYgKCsrZ3AtPnRpbWVyX3RpY2tzID4gMTApIHsKKwkJCWlmIChmb3VuZF9taWlfcGh5KGdwKSkKKwkJCQlyZXN0YXJ0X2FuZWcgPSBnZW1fbWRpb19saW5rX25vdF91cChncCk7CisJCQllbHNlCisJCQkJcmVzdGFydF9hbmVnID0gMTsKKwkJfQorCX0KKwlpZiAocmVzdGFydF9hbmVnKSB7CisJCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBOVUxMKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KK3Jlc3RhcnQ6CisJbW9kX3RpbWVyKCZncC0+bGlua190aW1lciwgamlmZmllcyArICgoMTIgKiBIWikgLyAxMCkpOworb3V0X3VubG9jazoKKwlnZW1fcHV0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1fY2xlYW5fcmluZ3Moc3RydWN0IGdlbSAqZ3ApCit7CisJc3RydWN0IGdlbV9pbml0X2Jsb2NrICpnYiA9IGdwLT5pbml0X2Jsb2NrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgZ2VtX3J4ZCAqcnhkOworCisJCXJ4ZCA9ICZnYi0+cnhkW2ldOworCQlpZiAoZ3AtPnJ4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJc2tiID0gZ3AtPnJ4X3NrYnNbaV07CisJCQlkbWFfYWRkciA9IGxlNjRfdG9fY3B1KHJ4ZC0+YnVmZmVyKTsKKwkJCXBjaV91bm1hcF9wYWdlKGdwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWdwLT5yeF9za2JzW2ldID0gTlVMTDsKKwkJfQorCQlyeGQtPnN0YXR1c193b3JkID0gMDsKKwkJd21iKCk7CisJCXJ4ZC0+YnVmZmVyID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGdwLT50eF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBnZW1fdHhkICp0eGQ7CisJCQlpbnQgZnJhZzsKKworCQkJc2tiID0gZ3AtPnR4X3NrYnNbaV07CisJCQlncC0+dHhfc2tic1tpXSA9IE5VTEw7CisKKwkJCWZvciAoZnJhZyA9IDA7IGZyYWcgPD0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQkJaW50IGVudCA9IGkgJiAoVFhfUklOR19TSVpFIC0gMSk7CisKKwkJCQl0eGQgPSAmZ2ItPnR4ZFtlbnRdOworCQkJCWRtYV9hZGRyID0gbGU2NF90b19jcHUodHhkLT5idWZmZXIpOworCQkJCXBjaV91bm1hcF9wYWdlKGdwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkJICAgICAgIGxlNjRfdG9fY3B1KHR4ZC0+Y29udHJvbF93b3JkKSAmCisJCQkJCSAgICAgICBUWERDVFJMX0JVRlNaLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkJCWlmIChmcmFnICE9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCisJCQkJCWkrKzsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwl9Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1faW5pdF9yaW5ncyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwlzdHJ1Y3QgZ2VtX2luaXRfYmxvY2sgKmdiID0gZ3AtPmluaXRfYmxvY2s7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdwLT5kZXY7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWdwLT5yeF9uZXcgPSBncC0+cnhfb2xkID0gZ3AtPnR4X25ldyA9IGdwLT50eF9vbGQgPSAwOworCisJZ2VtX2NsZWFuX3JpbmdzKGdwKTsKKworCWdwLT5yeF9idWZfc3ogPSBtYXgoZGV2LT5tdHUgKyBFVEhfSExFTiArIFZMQU5fSExFTiwKKwkJCSAgICAodW5zaWduZWQpVkxBTl9FVEhfRlJBTUVfTEVOKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgZ2VtX3J4ZCAqcnhkID0gJmdiLT5yeGRbaV07CisKKwkJc2tiID0gZ2VtX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRShncCksIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikgeworCQkJcnhkLT5idWZmZXIgPSAwOworCQkJcnhkLT5zdGF0dXNfd29yZCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWdwLT5yeF9za2JzW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3B1dChza2IsIChncC0+cnhfYnVmX3N6ICsgUlhfT0ZGU0VUKSk7CisJCWRtYV9hZGRyID0gcGNpX21hcF9wYWdlKGdwLT5wZGV2LAorCQkJCQl2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkJb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkJUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyeGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KGRtYV9hZGRyKTsKKwkJd21iKCk7CisJCXJ4ZC0+c3RhdHVzX3dvcmQgPSBjcHVfdG9fbGU2NChSWERDVFJMX0ZSRVNIKGdwKSk7CisJCXNrYl9yZXNlcnZlKHNrYiwgUlhfT0ZGU0VUKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IGdlbV90eGQgKnR4ZCA9ICZnYi0+dHhkW2ldOworCisJCXR4ZC0+Y29udHJvbF93b3JkID0gMDsKKwkJd21iKCk7CisJCXR4ZC0+YnVmZmVyID0gMDsKKwl9CisJd21iKCk7Cit9CisKKy8qIEluaXQgUEhZIGludGVyZmFjZSBhbmQgc3RhcnQgbGluayBwb2xsIHN0YXRlIG1hY2hpbmUgKi8KK3N0YXRpYyB2b2lkIGdlbV9pbml0X3BoeShzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1MzIgbWlmY2ZnOworCisJLyogUmV2ZXJ0IE1JRiBDRkcgc2V0dGluZyBkb25lIG9uIHN0b3BfcGh5ICovCisJbWlmY2ZnID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwltaWZjZmcgJj0gfk1JRl9DRkdfQkJNT0RFOworCXdyaXRlbChtaWZjZmcsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisJCisJaWYgKGdwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BUFBMRSkgeworCQlpbnQgaTsKKworCQkvKiBUaG9zZSBkZWxheSBzdWNrcywgdGhlIEhXIHNlZW0gdG8gbG92ZSB0aGVtIHRob3VnaCwgSSdsbAorCQkgKiBzZXJpc291bHkgY29uc2lkZXIgYnJlYWtpbmcgc29tZSBsb2NrcyBoZXJlIHRvIGJlIGFibGUKKwkJICogdG8gc2NoZWR1bGUgaW5zdGVhZAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworI2lmZGVmIENPTkZJR19QUENfUE1BQworCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR01BQ19QSFlfUkVTRVQsIGdwLT5vZl9ub2RlLCAwLCAwKTsKKwkJCW1zbGVlcCgyMCk7CisjZW5kaWYKKwkJCS8qIFNvbWUgUEhZcyB1c2VkIGJ5IGFwcGxlIGhhdmUgcHJvYmxlbSBnZXR0aW5nIGJhY2sgdG8gdXMsCisJCQkgKiB3ZSBkbyBhbiBhZGRpdGlvbmFsIHJlc2V0IGhlcmUKKwkJCSAqLworCQkJcGh5X3dyaXRlKGdwLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJCQltc2xlZXAoMjApOworCQkJaWYgKHBoeV9yZWFkKGdwLCBNSUlfQk1DUikgIT0gMHhmZmZmKQorCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gMikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR01BQyBQSFkgbm90IHJlc3BvbmRpbmcgIVxuIiwKKwkJCQkgICAgICAgZ3AtPmRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAoZ3AtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgorCSAgICBncC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX0dFTSkgeworCQl1MzIgdmFsOworCisJCS8qIEluaXQgZGF0YXBhdGggbW9kZSByZWdpc3Rlci4gKi8KKwkJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CisJCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkgeworCQkJdmFsID0gUENTX0RNT0RFX01HTTsKKwkJfSBlbHNlIGlmIChncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmlhbGluaykgeworCQkJdmFsID0gUENTX0RNT0RFX1NNIHwgUENTX0RNT0RFX0dNT0U7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBQQ1NfRE1PREVfRVNNOworCQl9CisKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfRE1PREUpOworCX0KKworCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkgeworCSAgICAJLy8gWFhYIGNoZWNrIGZvciBlcnJvcnMKKwkJbWlpX3BoeV9wcm9iZSgmZ3AtPnBoeV9taWksIGdwLT5taWlfcGh5X2FkZHIpOworCisJCS8qIEluaXQgUEhZICovCisJCWlmIChncC0+cGh5X21paS5kZWYgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMtPmluaXQpCisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+aW5pdCgmZ3AtPnBoeV9taWkpOworCX0gZWxzZSB7CisJCXUzMiB2YWw7CisJCWludCBsaW1pdDsKKworCQkvKiBSZXNldCBQQ1MgdW5pdC4gKi8KKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJQ1RSTCk7CisJCXZhbCB8PSBQQ1NfTUlJQ1RSTF9SU1Q7CisJCXdyaXRlYih2YWwsIGdwLT5yZWdzICsgUENTX01JSUNUUkwpOworCisJCWxpbWl0ID0gMzI7CisJCXdoaWxlIChyZWFkbChncC0+cmVncyArIFBDU19NSUlDVFJMKSAmIFBDU19NSUlDVFJMX1JTVCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlpZiAobGltaXQtLSA8PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChsaW1pdCA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBDUyByZXNldCBiaXQgd291bGQgbm90IGNsZWFyLlxuIiwKKwkJCSAgICAgICBncC0+ZGV2LT5uYW1lKTsKKworCQkvKiBNYWtlIHN1cmUgUENTIGlzIGRpc2FibGVkIHdoaWxlIGNoYW5naW5nIGFkdmVydGlzZW1lbnQKKwkJICogY29uZmlndXJhdGlvbi4KKwkJICovCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX0NGRyk7CisJCXZhbCAmPSB+KFBDU19DRkdfRU5BQkxFIHwgUENTX0NGR19UTyk7CisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX0NGRyk7CisKKwkJLyogQWR2ZXJ0aXNlIGFsbCBjYXBhYmlsaXRpZXMgZXhjZXB0IGFzc3ltZXRyaWMKKwkJICogcGF1c2UuCisJCSAqLworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlBRFYpOworCQl2YWwgfD0gKFBDU19NSUlBRFZfRkQgfCBQQ1NfTUlJQURWX0hEIHwKKwkJCVBDU19NSUlBRFZfU1AgfCBQQ1NfTUlJQURWX0FQKTsKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfTUlJQURWKTsKKworCQkvKiBFbmFibGUgYW5kIHJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiwgZGlzYWJsZSB3cmFwYmFjay9sb29wYmFjaywKKwkJICogYW5kIHJlLWVuYWJsZSBQQ1MuCisJCSAqLworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlDVFJMKTsKKwkJdmFsIHw9IChQQ1NfTUlJQ1RSTF9SQU4gfCBQQ1NfTUlJQ1RSTF9BTkUpOworCQl2YWwgJj0gflBDU19NSUlDVFJMX1dCOworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19NSUlDVFJMKTsKKworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19DRkcpOworCQl2YWwgfD0gUENTX0NGR19FTkFCTEU7CisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX0NGRyk7CisKKwkJLyogTWFrZSBzdXJlIHNlcmlhbGluayBsb29wYmFjayBpcyBvZmYuICBUaGUgbWVhbmluZworCQkgKiBvZiB0aGlzIGJpdCBpcyBsb2dpY2FsbHkgaW52ZXJ0ZWQgYmFzZWQgdXBvbiB3aGV0aGVyCisJCSAqIHlvdSBhcmUgaW4gU2VyaWFsaW5rIG9yIFNFUkRFUyBtb2RlLgorCQkgKi8KKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfU0NUUkwpOworCQlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmspCisJCQl2YWwgJj0gflBDU19TQ1RSTF9MT09QOworCQllbHNlCisJCQl2YWwgfD0gUENTX1NDVFJMX0xPT1A7CisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX1NDVFJMKTsKKwl9CisKKwkvKiBEZWZhdWx0IGFuZWcgcGFyYW1ldGVycyAqLworCWdwLT50aW1lcl90aWNrcyA9IDA7CisJZ3AtPmxzdGF0ZSA9IGxpbmtfZG93bjsKKwluZXRpZl9jYXJyaWVyX29mZihncC0+ZGV2KTsKKworCS8qIENhbiBJIGFkdmVydGlzZSBnaWdhYml0IGhlcmUgPyBJJ2QgbmVlZCBCQ00gUEhZIGRvY3MuLi4gKi8KKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX2luaXRfZG1hKHN0cnVjdCBnZW0gKmdwKQoreworCXU2NCBkZXNjX2RtYSA9ICh1NjQpIGdwLT5nYmxvY2tfZHZtYTsKKwl1MzIgdmFsOworCisJdmFsID0gKFRYRE1BX0NGR19CQVNFIHwgKDB4N2ZmIDw8IDEwKSB8IFRYRE1BX0NGR19QTU9ERSk7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCisJd3JpdGVsKGRlc2NfZG1hID4+IDMyLCBncC0+cmVncyArIFRYRE1BX0RCSEkpOworCXdyaXRlbChkZXNjX2RtYSAmIDB4ZmZmZmZmZmYsIGdwLT5yZWdzICsgVFhETUFfREJMT1cpOworCWRlc2NfZG1hICs9IChJTklUX0JMT0NLX1RYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgZ2VtX3R4ZCkpOworCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgVFhETUFfS0lDSyk7CisKKwl2YWwgPSAoUlhETUFfQ0ZHX0JBU0UgfCAoUlhfT0ZGU0VUIDw8IDEwKSB8CisJICAgICAgICgoMTQgLyAyKSA8PCAxMykgfCBSWERNQV9DRkdfRlRIUkVTSF8xMjgpOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKworCXdyaXRlbChkZXNjX2RtYSA+PiAzMiwgZ3AtPnJlZ3MgKyBSWERNQV9EQkhJKTsKKwl3cml0ZWwoZGVzY19kbWEgJiAweGZmZmZmZmZmLCBncC0+cmVncyArIFJYRE1BX0RCTE9XKTsKKworCXdyaXRlbChSWF9SSU5HX1NJWkUgLSA0LCBncC0+cmVncyArIFJYRE1BX0tJQ0spOworCisJdmFsICA9ICgoKGdwLT5yeF9wYXVzZV9vZmYgLyA2NCkgPDwgMCkgJiBSWERNQV9QVEhSRVNIX09GRik7CisJdmFsIHw9ICgoKGdwLT5yeF9wYXVzZV9vbiAvIDY0KSA8PCAxMikgJiBSWERNQV9QVEhSRVNIX09OKTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIFJYRE1BX1BUSFJFU0gpOworCisJaWYgKHJlYWRsKGdwLT5yZWdzICsgR1JFR19CSUZDRkcpICYgR1JFR19CSUZDRkdfTTY2RU4pCisJCXdyaXRlbCgoKDUgJiBSWERNQV9CTEFOS19JUEtUUykgfAorCQkJKCg4IDw8IDEyKSAmIFJYRE1BX0JMQU5LX0lUSU1FKSksCisJCSAgICAgICBncC0+cmVncyArIFJYRE1BX0JMQU5LKTsKKwllbHNlCisJCXdyaXRlbCgoKDUgJiBSWERNQV9CTEFOS19JUEtUUykgfAorCQkJKCg0IDw8IDEyKSAmIFJYRE1BX0JMQU5LX0lUSU1FKSksCisJCSAgICAgICBncC0+cmVncyArIFJYRE1BX0JMQU5LKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB1MzIgZ2VtX3NldHVwX211bHRpY2FzdChzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1MzIgcnhjZmcgPSAwOworCWludCBpOworCQorCWlmICgoZ3AtPmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgIChncC0+ZGV2LT5tY19jb3VudCA+IDI1NikpIHsKKwkgICAgCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCQl3cml0ZWwoMHhmZmZmLCBncC0+cmVncyArIE1BQ19IQVNIMCArIChpIDw8IDIpKTsKKwkJcnhjZmcgfD0gTUFDX1JYQ0ZHX0hGRTsKKwl9IGVsc2UgaWYgKGdwLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcnhjZmcgfD0gTUFDX1JYQ0ZHX1BST007CisJfSBlbHNlIHsKKwkJdTE2IGhhc2hfdGFibGVbMTZdOworCQl1MzIgY3JjOworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGdwLT5kZXYtPm1jX2xpc3Q7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJaGFzaF90YWJsZVtpXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGdwLT5kZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWNoYXIgKmFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKworCQkJZG1pID0gZG1pLT5uZXh0OworCisJCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCQljb250aW51ZTsKKworIAkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCQljcmMgPj49IDI0OworCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoMTUgLSAoY3JjICYgMHhmKSk7CisJCX0KKwkgICAgCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCQl3cml0ZWwoaGFzaF90YWJsZVtpXSwgZ3AtPnJlZ3MgKyBNQUNfSEFTSDAgKyAoaSA8PCAyKSk7CisJCXJ4Y2ZnIHw9IE1BQ19SWENGR19IRkU7CisJfQorCisJcmV0dXJuIHJ4Y2ZnOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX2luaXRfbWFjKHN0cnVjdCBnZW0gKmdwKQoreworCXVuc2lnbmVkIGNoYXIgKmUgPSAmZ3AtPmRldi0+ZGV2X2FkZHJbMF07CisKKwl3cml0ZWwoMHgxYmYwLCBncC0+cmVncyArIE1BQ19TTkRQQVVTRSk7CisKKwl3cml0ZWwoMHgwMCwgZ3AtPnJlZ3MgKyBNQUNfSVBHMCk7CisJd3JpdGVsKDB4MDgsIGdwLT5yZWdzICsgTUFDX0lQRzEpOworCXdyaXRlbCgweDA0LCBncC0+cmVncyArIE1BQ19JUEcyKTsKKwl3cml0ZWwoMHg0MCwgZ3AtPnJlZ3MgKyBNQUNfU1RJTUUpOworCXdyaXRlbCgweDQwLCBncC0+cmVncyArIE1BQ19NSU5GU1opOworCisJLyogRXRoZXJuZXQgcGF5bG9hZCArIGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnLiAqLworCXdyaXRlbCgweDIwMDAwMDAwIHwgKGdwLT5yeF9idWZfc3ogKyA0KSwgZ3AtPnJlZ3MgKyBNQUNfTUFYRlNaKTsKKworCXdyaXRlbCgweDA3LCBncC0+cmVncyArIE1BQ19QQVNJWkUpOworCXdyaXRlbCgweDA0LCBncC0+cmVncyArIE1BQ19KQU1TSVpFKTsKKwl3cml0ZWwoMHgxMCwgZ3AtPnJlZ3MgKyBNQUNfQVRUTElNKTsKKwl3cml0ZWwoMHg4ODA4LCBncC0+cmVncyArIE1BQ19NQ1RZUEUpOworCisJd3JpdGVsKChlWzVdIHwgKGVbNF0gPDwgOCkpICYgMHgzZmYsIGdwLT5yZWdzICsgTUFDX1JBTkRTRUVEKTsKKworCXdyaXRlbCgoZVs0XSA8PCA4KSB8IGVbNV0sIGdwLT5yZWdzICsgTUFDX0FERFIwKTsKKwl3cml0ZWwoKGVbMl0gPDwgOCkgfCBlWzNdLCBncC0+cmVncyArIE1BQ19BRERSMSk7CisJd3JpdGVsKChlWzBdIDw8IDgpIHwgZVsxXSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjIpOworCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FERFIzKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUREUjQpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRERSNSk7CisKKwl3cml0ZWwoMHgwMDAxLCBncC0+cmVncyArIE1BQ19BRERSNik7CisJd3JpdGVsKDB4YzIwMCwgZ3AtPnJlZ3MgKyBNQUNfQUREUjcpOworCXdyaXRlbCgweDAxODAsIGdwLT5yZWdzICsgTUFDX0FERFI4KTsKKworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRklMVDApOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRklMVDEpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRklMVDIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRjIxTVNLKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUYwTVNLKTsKKworCWdwLT5tYWNfcnhfY2ZnID0gZ2VtX3NldHVwX211bHRpY2FzdChncCk7CisjaWZkZWYgU1RSSVBfRkNTCisJZ3AtPm1hY19yeF9jZmcgfD0gTUFDX1JYQ0ZHX1NGQ1M7CisjZW5kaWYKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTkNPTEwpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19GQVNVQ0MpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19FQ09MTCk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0xDT0xMKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRFRJTUVSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfUEFUTVBTKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfUkZDVFIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19MRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUVSUik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0ZDU0VSUik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1JYQ1ZFUlIpOworCisJLyogQ2xlYXIgUlgvVFgvTUFDL1hJRiBjb25maWcsIHdlIHdpbGwgc2V0IHRoZXNlIHVwIGFuZCBlbmFibGUKKwkgKiB0aGVtIG9uY2UgYSBsaW5rIGlzIGVzdGFibGlzaGVkLgorCSAqLworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisJd3JpdGVsKGdwLT5tYWNfcnhfY2ZnLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX01DQ0ZHKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKworCS8qIFNldHVwIE1BQyBpbnRlcnJ1cHRzLiAgV2Ugd2FudCB0byBnZXQgYWxsIG9mIHRoZSBpbnRlcmVzdGluZworCSAqIGNvdW50ZXIgZXhwaXJhdGlvbiBldmVudHMsIGJ1dCB3ZSBkbyBub3Qgd2FudCB0byBoZWFyIGFib3V0CisJICogbm9ybWFsIHJ4L3R4IGFzIHRoZSBETUEgZW5naW5lIHRlbGxzIHVzIHRoYXQuCisJICovCisJd3JpdGVsKE1BQ19UWFNUQVRfWE1JVCwgZ3AtPnJlZ3MgKyBNQUNfVFhNQVNLKTsKKwl3cml0ZWwoTUFDX1JYU1RBVF9SQ1YsIGdwLT5yZWdzICsgTUFDX1JYTUFTSyk7CisKKwkvKiBEb24ndCBlbmFibGUgZXZlbiB0aGUgUEFVU0UgaW50ZXJydXB0cyBmb3Igbm93LCB3ZQorCSAqIG1ha2Ugbm8gdXNlIG9mIHRob3NlIGV2ZW50cyBvdGhlciB0aGFuIHRvIHJlY29yZCB0aGVtLgorCSAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBncC0+cmVncyArIE1BQ19NQ01BU0spOworCisJLyogRG9uJ3QgZW5hYmxlIEdFTSdzIFdPTCBpbiBub3JtYWwgb3BlcmF0aW9ucworCSAqLworCWlmIChncC0+aGFzX3dvbCkKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgV09MX1dBS0VDU1IpOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX2luaXRfcGF1c2VfdGhyZXNob2xkcyhzdHJ1Y3QgZ2VtICpncCkKK3sKKyAgICAgICAJdTMyIGNmZzsKKworCS8qIENhbGN1bGF0ZSBwYXVzZSB0aHJlc2hvbGRzLiAgU2V0dGluZyB0aGUgT0ZGIHRocmVzaG9sZCB0byB0aGUKKwkgKiBmdWxsIFJYIGZpZm8gc2l6ZSBlZmZlY3RpdmVseSBkaXNhYmxlcyBQQVVTRSBnZW5lcmF0aW9uIHdoaWNoCisJICogaXMgd2hhdCB3ZSBkbyBmb3IgMTAvMTAwIG9ubHkgR0VNcyB3aGljaCBoYXZlIEZJRk9zIHRvbyBzbWFsbAorCSAqIHRvIG1ha2UgcmVhbCBnYWlucyBmcm9tIFBBVVNFLgorCSAqLworCWlmIChncC0+cnhfZmlmb19zeiA8PSAoMiAqIDEwMjQpKSB7CisJCWdwLT5yeF9wYXVzZV9vZmYgPSBncC0+cnhfcGF1c2Vfb24gPSBncC0+cnhfZmlmb19zejsKKwl9IGVsc2UgeworCQlpbnQgbWF4X2ZyYW1lID0gKGdwLT5yeF9idWZfc3ogKyA0ICsgNjQpICYgfjYzOworCQlpbnQgb2ZmID0gKGdwLT5yeF9maWZvX3N6IC0gKG1heF9mcmFtZSAqIDIpKTsKKwkJaW50IG9uID0gb2ZmIC0gbWF4X2ZyYW1lOworCisJCWdwLT5yeF9wYXVzZV9vZmYgPSBvZmY7CisJCWdwLT5yeF9wYXVzZV9vbiA9IG9uOworCX0KKworCisJLyogQ29uZmlndXJlIHRoZSBjaGlwICJidXJzdCIgRE1BIG1vZGUgJiBlbmFibGUgc29tZQorCSAqIEhXIGJ1ZyBmaXhlcyBvbiBBcHBsZSB2ZXJzaW9uCisJICovCisgICAgICAgCWNmZyAgPSAwOworICAgICAgIAlpZiAoZ3AtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFKQorCQljZmcgfD0gR1JFR19DRkdfUk9OUEFVTEJJVCB8IEdSRUdfQ0ZHX0VOQlVHMkZJWDsKKyNpZiAhZGVmaW5lZChDT05GSUdfU1BBUkM2NCkgJiYgIWRlZmluZWQoQ09ORklHX0FMUEhBKQorICAgICAgIAljZmcgfD0gR1JFR19DRkdfSUJVUlNUOworI2VuZGlmCisgICAgICAgCWNmZyB8PSAoKDMxIDw8IDEpICYgR1JFR19DRkdfVFhETUFMSU0pOworICAgICAgIAljZmcgfD0gKCgzMSA8PCA2KSAmIEdSRUdfQ0ZHX1JYRE1BTElNKTsKKyAgICAgICAJd3JpdGVsKGNmZywgZ3AtPnJlZ3MgKyBHUkVHX0NGRyk7CisKKwkvKiBJZiBJbmZpbml0ZSBCdXJzdCBkaWRuJ3Qgc3RpY2ssIHRoZW4gdXNlIGRpZmZlcmVudAorCSAqIHRocmVzaG9sZHMgKGFuZCBBcHBsZSBidWcgZml4ZXMgZG9uJ3QgZXhpc3QpCisJICovCisJaWYgKCEocmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX0NGRykgJiBHUkVHX0NGR19JQlVSU1QpKSB7CisJCWNmZyA9ICgoMiA8PCAxKSAmIEdSRUdfQ0ZHX1RYRE1BTElNKTsKKwkJY2ZnIHw9ICgoOCA8PCA2KSAmIEdSRUdfQ0ZHX1JYRE1BTElNKTsKKwkJd3JpdGVsKGNmZywgZ3AtPnJlZ3MgKyBHUkVHX0NGRyk7CisJfQkKK30KKworc3RhdGljIGludCBnZW1fY2hlY2tfaW52YXJpYW50cyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGdwLT5wZGV2OworCXUzMiBtaWZfY2ZnOworCisJLyogT24gQXBwbGUncyBzdW5nZW0sIHdlIGNhbid0IHJlbHkgb24gcmVnaXN0ZXJzIGFzIHRoZSBjaGlwCisJICogd2FzIGJlZW4gcG93ZXJlZCBkb3duIGJ5IHRoZSBmaXJtd2FyZS4gVGhlIFBIWSBpcyBsb29rZWQKKwkgKiB1cCBsYXRlciBvbi4KKwkgKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUpIHsKKwkJZ3AtPnBoeV90eXBlID0gcGh5X21paV9tZGlvMDsKKwkJZ3AtPnR4X2ZpZm9fc3ogPSByZWFkbChncC0+cmVncyArIFRYRE1BX0ZTWikgKiA2NDsKKwkJZ3AtPnJ4X2ZpZm9fc3ogPSByZWFkbChncC0+cmVncyArIFJYRE1BX0ZTWikgKiA2NDsKKwkJZ3AtPnN3cnN0X2Jhc2UgPSAwOworCisJCW1pZl9jZmcgPSByZWFkbChncC0+cmVncyArIE1JRl9DRkcpOworCQltaWZfY2ZnICY9IH4oTUlGX0NGR19QU0VMRUNUfE1JRl9DRkdfUE9MTHxNSUZfQ0ZHX0JCTU9ERXxNSUZfQ0ZHX01ESTEpOworCQltaWZfY2ZnIHw9IE1JRl9DRkdfTURJMDsKKwkJd3JpdGVsKG1pZl9jZmcsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisJCXdyaXRlbChQQ1NfRE1PREVfTUdNLCBncC0+cmVncyArIFBDU19ETU9ERSk7CisJCXdyaXRlbChNQUNfWElGQ0ZHX09FLCBncC0+cmVncyArIE1BQ19YSUZDRkcpOworCisJCS8qIFdlIGhhcmQtY29kZSB0aGUgUEhZIGFkZHJlc3Mgc28gd2UgY2FuIHByb3Blcmx5IGJyaW5nIGl0IG91dCBvZgorCQkgKiByZXNldCBsYXRlciBvbiwgd2UgY2FuJ3QgcmVhbGx5IHByb2JlIGl0IGF0IHRoaXMgcG9pbnQsIHRob3VnaAorCQkgKiB0aGF0IGlzbid0IGFuIGlzc3VlLgorCQkgKi8KKwkJaWYgKGdwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BUFBMRV9LMl9HTUFDKQorCQkJZ3AtPm1paV9waHlfYWRkciA9IDE7CisJCWVsc2UKKwkJCWdwLT5taWlfcGh5X2FkZHIgPSAwOworCisJCXJldHVybiAwOworCX0KKworCW1pZl9jZmcgPSByZWFkbChncC0+cmVncyArIE1JRl9DRkcpOworCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fUklPX0dFTSkgeworCQkvKiBPbmUgb2YgdGhlIE1JSSBQSFlzIF9tdXN0XyBiZSBwcmVzZW50CisJCSAqIGFzIHRoaXMgY2hpcCBoYXMgbm8gZ2lnYWJpdCBQSFkuCisJCSAqLworCQlpZiAoKG1pZl9jZmcgJiAoTUlGX0NGR19NREkwIHwgTUlGX0NGR19NREkxKSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUklPIEdFTSBsYWNrcyBNSUkgcGh5LCBtaWZfY2ZnWyUwOHhdXG4iLAorCQkJICAgICAgIG1pZl9jZmcpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogRGV0ZXJtaW5lIGluaXRpYWwgUEhZIGludGVyZmFjZSB0eXBlIGd1ZXNzLiAgTURJTzEgaXMgdGhlCisJICogZXh0ZXJuYWwgUEhZIGFuZCB0aHVzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBNRElPMC4KKwkgKi8KKwkKKwlpZiAobWlmX2NmZyAmIE1JRl9DRkdfTURJMSkgeworCQlncC0+cGh5X3R5cGUgPSBwaHlfbWlpX21kaW8xOworCQltaWZfY2ZnIHw9IE1JRl9DRkdfUFNFTEVDVDsKKwkJd3JpdGVsKG1pZl9jZmcsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisJfSBlbHNlIGlmIChtaWZfY2ZnICYgTUlGX0NGR19NREkwKSB7CisJCWdwLT5waHlfdHlwZSA9IHBoeV9taWlfbWRpbzA7CisJCW1pZl9jZmcgJj0gfk1JRl9DRkdfUFNFTEVDVDsKKwkJd3JpdGVsKG1pZl9jZmcsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisJfSBlbHNlIHsKKwkJZ3AtPnBoeV90eXBlID0gcGh5X3NlcmlhbGluazsKKwl9CisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xIHx8CisJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlncC0+bWlpX3BoeV9hZGRyID0gaTsKKwkJCWlmIChwaHlfcmVhZChncCwgTUlJX0JNQ1IpICE9IDB4ZmZmZikKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSAzMikgeworCQkJaWYgKHBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0pIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSSU8gTUlJIHBoeSB3aWxsIG5vdCByZXNwb25kLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZ3AtPnBoeV90eXBlID0gcGh5X3NlcmRlczsKKwkJfQorCX0KKworCS8qIEZldGNoIHRoZSBGSUZPIGNvbmZpZ3VyYXRpb25zIG5vdyB0b28uICovCisJZ3AtPnR4X2ZpZm9fc3ogPSByZWFkbChncC0+cmVncyArIFRYRE1BX0ZTWikgKiA2NDsKKwlncC0+cnhfZmlmb19zeiA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfRlNaKSAqIDY0OworCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTikgeworCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX0dFTSkgeworCQkJaWYgKGdwLT50eF9maWZvX3N6ICE9ICg5ICogMTAyNCkgfHwKKwkJCSAgICBncC0+cnhfZmlmb19zeiAhPSAoMjAgKiAxMDI0KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIkdFTSBoYXMgYm9ndXMgZmlmbyBzaXplcyB0eCglZCkgcngoJWQpXG4iLAorCQkJCSAgICAgICBncC0+dHhfZmlmb19zeiwgZ3AtPnJ4X2ZpZm9fc3opOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWdwLT5zd3JzdF9iYXNlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChncC0+dHhfZmlmb19zeiAhPSAoMiAqIDEwMjQpIHx8CisJCQkgICAgZ3AtPnJ4X2ZpZm9fc3ogIT0gKDIgKiAxMDI0KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJJTyBHRU0gaGFzIGJvZ3VzIGZpZm8gc2l6ZXMgdHgoJWQpIHJ4KCVkKVxuIiwKKwkJCQkgICAgICAgZ3AtPnR4X2ZpZm9fc3osIGdwLT5yeF9maWZvX3N6KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlncC0+c3dyc3RfYmFzZSA9ICg2NCAvIDQpIDw8IEdSRUdfU1dSU1RfQ0FDSEVfU0hJRlQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9yZWluaXRfY2hpcChzdHJ1Y3QgZ2VtICpncCkKK3sKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCWdlbV9yZXNldChncCk7CisKKwkvKiBNYWtlIHN1cmUgaW50cyBhcmUgZGlzYWJsZWQgKi8KKwlnZW1fZGlzYWJsZV9pbnRzKGdwKTsKKworCS8qIEFsbG9jYXRlICYgc2V0dXAgcmluZyBidWZmZXJzICovCisJZ2VtX2luaXRfcmluZ3MoZ3ApOworCisJLyogQ29uZmlndXJlIHBhdXNlIHRocmVzaG9sZHMgKi8KKwlnZW1faW5pdF9wYXVzZV90aHJlc2hvbGRzKGdwKTsKKworCS8qIEluaXQgRE1BICYgTUFDIGVuZ2luZXMgKi8KKwlnZW1faW5pdF9kbWEoZ3ApOworCWdlbV9pbml0X21hYyhncCk7Cit9CisKKworLyogTXVzdCBiZSBpbnZva2VkIHdpdGggbm8gbG9jayBoZWxkLiAqLworc3RhdGljIHZvaWQgZ2VtX3N0b3BfcGh5KHN0cnVjdCBnZW0gKmdwLCBpbnQgd29sKQoreworCXUzMiBtaWZjZmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIExldCB0aGUgY2hpcCBzZXR0bGUgZG93biBhIGJpdCwgaXQgc2VlbXMgdGhhdCBoZWxwcworCSAqIGZvciBzbGVlcCBtb2RlIG9uIHNvbWUgbW9kZWxzCisJICovCisJbXNsZWVwKDEwKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgcG9sbGluZyBQSFkgc3RhdHVzIGNoYW5nZS4gV2UKKwkgKiBkb24ndCBjdXJyZW50bHkgdXNlIHRoYXQgZmVhdHVyZSB0aG91Z2gKKwkgKi8KKwltaWZjZmcgPSByZWFkbChncC0+cmVncyArIE1JRl9DRkcpOworCW1pZmNmZyAmPSB+TUlGX0NGR19QT0xMOworCXdyaXRlbChtaWZjZmcsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisKKwlpZiAod29sICYmIGdwLT5oYXNfd29sKSB7CisJCXVuc2lnbmVkIGNoYXIgKmUgPSAmZ3AtPmRldi0+ZGV2X2FkZHJbMF07CisJCXUzMiBjc3I7CisKKwkJLyogU2V0dXAgd2FrZS1vbi1sYW4gZm9yIE1BR0lDIHBhY2tldCAqLworCQl3cml0ZWwoTUFDX1JYQ0ZHX0hGRSB8IE1BQ19SWENGR19TRkNTIHwgTUFDX1JYQ0ZHX0VOQUIsCisJCSAgICAgICBncC0+cmVncyArIE1BQ19SWENGRyk7CQorCQl3cml0ZWwoKGVbNF0gPDwgOCkgfCBlWzVdLCBncC0+cmVncyArIFdPTF9NQVRDSDApOworCQl3cml0ZWwoKGVbMl0gPDwgOCkgfCBlWzNdLCBncC0+cmVncyArIFdPTF9NQVRDSDEpOworCQl3cml0ZWwoKGVbMF0gPDwgOCkgfCBlWzFdLCBncC0+cmVncyArIFdPTF9NQVRDSDIpOworCisJCXdyaXRlbChXT0xfTUNPVU5UX04gfCBXT0xfTUNPVU5UX00sIGdwLT5yZWdzICsgV09MX01DT1VOVCk7CisJCWNzciA9IFdPTF9XQUtFQ1NSX0VOQUJMRTsKKwkJaWYgKChyZWFkbChncC0+cmVncyArIE1BQ19YSUZDRkcpICYgTUFDX1hJRkNGR19HTUlJKSA9PSAwKQorCQkJY3NyIHw9IFdPTF9XQUtFQ1NSX01JSTsKKwkJd3JpdGVsKGNzciwgZ3AtPnJlZ3MgKyBXT0xfV0FLRUNTUik7CisJfSBlbHNlIHsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwkJKHZvaWQpcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCQkvKiBNYWNoaW5lIHNsZWVwIHdpbGwgZGllIGluIHN0cmFuZ2Ugd2F5cyBpZiB3ZQorCQkgKiBkb250IHdhaXQgYSBiaXQgaGVyZSwgbG9va3MgbGlrZSB0aGUgY2hpcCB0YWtlcworCQkgKiBzb21lIHRpbWUgdG8gcmVhbGx5IHNodXQgZG93bgorCQkgKi8KKwkJbXNsZWVwKDEwKTsKKwl9CisKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19YSUZDRkcpOworCXdyaXRlbCgwLCBncC0+cmVncyArIFRYRE1BX0NGRyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKworCWlmICghd29sKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKwkJZ2VtX3Jlc2V0KGdwKTsKKwkJd3JpdGVsKE1BQ19UWFJTVF9DTUQsIGdwLT5yZWdzICsgTUFDX1RYUlNUKTsKKwkJd3JpdGVsKE1BQ19SWFJTVF9DTUQsIGdwLT5yZWdzICsgTUFDX1JYUlNUKTsKKwkJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBObyBuZWVkIHRvIHRha2UgdGhlIGxvY2sgaGVyZSAqLworCisJCWlmIChmb3VuZF9taWlfcGh5KGdwKSAmJiBncC0+cGh5X21paS5kZWYtPm9wcy0+c3VzcGVuZCkKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zdXNwZW5kKCZncC0+cGh5X21paSk7CisKKwkJLyogQWNjb3JkaW5nIHRvIEFwcGxlLCB3ZSBtdXN0IHNldCB0aGUgTURJTyBwaW5zIHRvIHRoaXMgYmVnbmlnbgorCQkgKiBzdGF0ZSBvciB3ZSBtYXkgMSkgZWF0IG1vcmUgY3VycmVudCwgMikgZGFtYWdlIHNvbWUgUEhZcworCQkgKi8KKwkJd3JpdGVsKG1pZmNmZyB8IE1JRl9DRkdfQkJNT0RFLCBncC0+cmVncyArIE1JRl9DRkcpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNSUZfQkJDTEspOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNSUZfQkJEQVRBKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUlGX0JCT0VOQUIpOworCQl3cml0ZWwoTUFDX1hJRkNGR19HTUlJIHwgTUFDX1hJRkNGR19MQkNLLCBncC0+cmVncyArIE1BQ19YSUZDRkcpOworCQkodm9pZCkgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKwl9Cit9CisKKworc3RhdGljIGludCBnZW1fZG9fc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwkvKiBFbmFibGUgdGhlIGNlbGwgKi8KKwlnZW1fZ2V0X2NlbGwoZ3ApOworCisJLyogSW5pdCAmIHNldHVwIGNoaXAgaGFyZHdhcmUgKi8KKwlnZW1fcmVpbml0X2NoaXAoZ3ApOworCisJZ3AtPnJ1bm5pbmcgPSAxOworCisJaWYgKGdwLT5sc3RhdGUgPT0gbGlua191cCkgeworCQluZXRpZl9jYXJyaWVyX29uKGdwLT5kZXYpOworCQlnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoZ3AtPmRldik7CisKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVxdWVzdF9pcnEoZ3AtPnBkZXYtPmlycSwgZ2VtX2ludGVycnVwdCwKKwkJCQkgICBTQV9TSElSUSwgZGV2LT5uYW1lLCAodm9pZCAqKWRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlcXVlc3QgaXJxICFcbiIsIGdwLT5kZXYtPm5hbWUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCQlncC0+cnVubmluZyA9ICAwOworCQlnZW1fcmVzZXQoZ3ApOworCQlnZW1fY2xlYW5fcmluZ3MoZ3ApOworCQlnZW1fcHV0X2NlbGwoZ3ApOworCQkKKwkJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VtX2RvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdvbCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwlncC0+cnVubmluZyA9IDA7CisKKwkvKiBTdG9wIG5ldGlmIHF1ZXVlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogTWFrZSBzdXJlIGludHMgYXJlIGRpc2FibGVkICovCisJZ2VtX2Rpc2FibGVfaW50cyhncCk7CisKKwkvKiBXZSBjYW4gZHJvcCB0aGUgbG9jayBub3cgKi8KKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gc2xlZXAgd2l0aCBXT0wgKi8KKwlnZW1fc3RvcF9kbWEoZ3ApOworCW1zbGVlcCgxMCk7CisJaWYgKCF3b2wpCisJCWdlbV9yZXNldChncCk7CisJbXNsZWVwKDEwKTsKKworCS8qIEdldCByaWQgb2YgcmluZ3MgKi8KKwlnZW1fY2xlYW5fcmluZ3MoZ3ApOworCisJLyogTm8gaXJxIG5lZWRlZCBhbnltb3JlICovCisJZnJlZV9pcnEoZ3AtPnBkZXYtPmlycSwgKHZvaWQgKikgZGV2KTsKKworCS8qIENlbGwgbm90IG5lZWRlZCBuZWl0aGVyIGlmIG5vIFdPTCAqLworCWlmICghd29sKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCQlnZW1fcHV0X2NlbGwoZ3ApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2VtX3Jlc2V0X3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IChzdHJ1Y3QgZ2VtICopIGRhdGE7CisKKwlkb3duKCZncC0+cG1fc2VtKTsKKworCW5ldGlmX3BvbGxfZGlzYWJsZShncC0+ZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCWlmIChncC0+cnVubmluZyA9PSAwKQorCQlnb3RvIG5vdF9ydW5uaW5nOworCisJaWYgKGdwLT5ydW5uaW5nKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZ3AtPmRldik7CisKKwkJLyogUmVzZXQgdGhlIGNoaXAgJiByaW5ncyAqLworCQlnZW1fcmVpbml0X2NoaXAoZ3ApOworCQlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX3VwKQorCQkJZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShncC0+ZGV2KTsKKwl9Cisgbm90X3J1bm5pbmc6CisJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDA7CisKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCisJbmV0aWZfcG9sbF9lbmFibGUoZ3AtPmRldik7CisKKwl1cCgmZ3AtPnBtX3NlbSk7Cit9CisKKworc3RhdGljIGludCBnZW1fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCWludCByYyA9IDA7CisKKwlkb3duKCZncC0+cG1fc2VtKTsKKworCS8qIFdlIG5lZWQgdGhlIGNlbGwgZW5hYmxlZCAqLworCWlmICghZ3AtPmFzbGVlcCkKKwkJcmMgPSBnZW1fZG9fc3RhcnQoZGV2KTsKKwlncC0+b3BlbmVkID0gKHJjID09IDApOworCisJdXAoJmdwLT5wbV9zZW0pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdlbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJLyogTm90ZTogd2UgZG9uJ3QgbmVlZCB0byBjYWxsIG5ldGlmX3BvbGxfZGlzYWJsZSgpIGhlcmUgYmVjYXVzZQorCSAqIG91ciBjYWxsZXIgKGRldl9jbG9zZSkgYWxyZWFkeSBkaWQgaXQgZm9yIHVzCisJICovCisKKwlkb3duKCZncC0+cG1fc2VtKTsKKworCWdwLT5vcGVuZWQgPSAwOwkKKwlpZiAoIWdwLT5hc2xlZXApCisJCWdlbV9kb19zdG9wKGRldiwgMCk7CisKKwl1cCgmZ3AtPnBtX3NlbSk7CisJCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZ2VtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkb3duKCZncC0+cG1fc2VtKTsKKworCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN1c3BlbmRpbmcsIFdha2VPbkxhbiAlc1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICAoZ3AtPndha2Vfb25fbGFuICYmIGdwLT5vcGVuZWQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCisJLyogS2VlcCB0aGUgY2VsbCBlbmFibGVkIGR1cmluZyB0aGUgZW50aXJlIG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCWdlbV9nZXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlIGRyaXZlciBpcyBvcGVuZWQsIHdlIHN0b3AgdGhlIE1BQyAqLworCWlmIChncC0+b3BlbmVkKSB7CisJCS8qIFN0b3AgdHJhZmZpYywgbWFyayB1cyBjbG9zZWQgKi8KKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJCS8qIFN3aXRjaCBvZmYgTUFDLCByZW1lbWJlciBXT0wgc2V0dGluZyAqLworCQlncC0+YXNsZWVwX3dvbCA9IGdwLT53YWtlX29uX2xhbjsKKwkJZ2VtX2RvX3N0b3AoZGV2LCBncC0+YXNsZWVwX3dvbCk7CisJfSBlbHNlCisJCWdwLT5hc2xlZXBfd29sID0gMDsKKworCS8qIE1hcmsgdXMgYXNsZWVwICovCisJZ3AtPmFzbGVlcCA9IDE7CisJd21iKCk7CisKKwkvKiBTdG9wIHRoZSBsaW5rIHRpbWVyICovCisJZGVsX3RpbWVyX3N5bmMoJmdwLT5saW5rX3RpbWVyKTsKKworCS8qIE5vdyB3ZSByZWxlYXNlIHRoZSBzZW1hcGhvcmUgdG8gbm90IGJsb2NrIHRoZSByZXNldCB0YXNrIHdobworCSAqIGNhbiB0YWtlIGl0IHRvby4gV2UgYXJlIG1hcmtlZCBhc2xlZXAsIHNvIHRoZXJlIHdpbGwgYmUgbm8KKwkgKiBjb25mbGljdCBoZXJlCisJICovCisJdXAoJmdwLT5wbV9zZW0pOworCisJLyogV2FpdCBmb3IgYSBwZW5kaW5nIHJlc2V0IHRhc2sgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZykKKwkJeWllbGQoKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJLyogU2h1dCB0aGUgUEhZIGRvd24gZXZlbnR1YWxseSBhbmQgc2V0dXAgV09MICovCisJZ2VtX3N0b3BfcGh5KGdwLCBncC0+YXNsZWVwX3dvbCk7CisKKwkvKiBNYWtlIHN1cmUgYnVzIG1hc3RlciBpcyBkaXNhYmxlZCAqLworCXBjaV9kaXNhYmxlX2RldmljZShncC0+cGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBjZWxsLCBubyBuZWVkIHRvIHRha2UgYSBsb2NrIGF0IHRoaXMgcG9pbnQgc2luY2UKKwkgKiBub3RoaW5nIGVsc2UgY2FuIGhhcHBlbiBub3cKKwkgKi8KKwlnZW1fcHV0X2NlbGwoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVzdW1pbmdcbiIsIGRldi0+bmFtZSk7CisKKwlkb3duKCZncC0+cG1fc2VtKTsKKworCS8qIEtlZXAgdGhlIGNlbGwgZW5hYmxlZCBkdXJpbmcgdGhlIGVudGlyZSBvcGVyYXRpb24sIG5vIG5lZWQgdG8KKwkgKiB0YWtlIGEgbG9jayBoZXJlIHRobyBzaW5jZSBub3RoaW5nIGVsc2UgY2FuIGhhcHBlbiB3aGlsZSB3ZSBhcmUKKwkgKiBtYXJrZWQgYXNsZWVwCisJICovCisJZ2VtX2dldF9jZWxsKGdwKTsKKworCS8qIE1ha2Ugc3VyZSBQQ0kgYWNjZXNzIGFuZCBidXMgbWFzdGVyIGFyZSBlbmFibGVkICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGdwLT5wZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCByZS1lbmFibGUgY2hpcCAhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJLyogUHV0IGNlbGwgYW5kIGZvcmdldCBpdCBmb3Igbm93LCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMKKwkJICogc3RpbGwgYXNsZWVwLCBhIG5ldyBzbGVlcCBjeWNsZSBtYXkgYnJpbmcgaXQgYmFjaworCQkgKi8KKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKwkJdXAoJmdwLT5wbV9zZW0pOworCQlyZXR1cm4gMDsKKwl9CisJcGNpX3NldF9tYXN0ZXIoZ3AtPnBkZXYpOworCisJLyogUmVzZXQgZXZlcnl0aGluZyAqLworCWdlbV9yZXNldChncCk7CisKKwkvKiBNYXJrIHVzIHdva2VuIHVwICovCisJZ3AtPmFzbGVlcCA9IDA7CisJd21iKCk7CisKKwkvKiBCcmluZyB0aGUgUEhZIGJhY2suIEFnYWluLCBsb2NrIGlzIHVzZWxlc3MgYXQgdGhpcyBwb2ludCBhcworCSAqIG5vdGhpbmcgY2FuIGJlIGhhcHBlbmluZyB1bnRpbCB3ZSByZXN0YXJ0IHRoZSB3aG9sZSB0aGluZworCSAqLworCWdlbV9pbml0X3BoeShncCk7CisKKwkvKiBJZiB3ZSB3ZXJlIG9wZW5lZCwgYnJpbmcgZXZlcnl0aGluZyBiYWNrICovCisJaWYgKGdwLT5vcGVuZWQpIHsKKwkJLyogUmVzdGFydCBNQUMgKi8KKwkJZ2VtX2RvX3N0YXJ0KGRldik7CisKKwkJLyogUmUtYXR0YWNoIG5ldCBkZXZpY2UgKi8KKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwkvKiBJZiB3ZSBoYWQgV09MIGVuYWJsZWQsIHRoZSBjZWxsIGNsb2NrIHdhcyBuZXZlciB0dXJuZWQgb2ZmIGR1cmluZworCSAqIHNsZWVwLCBzbyB3ZSBlbmQgdXAgYmVlaW5nIHVuYmFsYW5jZWQuIEZpeCB0aGF0IGhlcmUKKwkgKi8KKwlpZiAoZ3AtPmFzbGVlcF93b2wpCisJCWdlbV9wdXRfY2VsbChncCk7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbmVlZCB0byBob2xkIHRoZSBjZWxsLCBpdCB3aWxsIGJlIGhlbGQgaWYgdGhlCisJICogZHJpdmVyIGlzIG9wZW4gYnkgZ2VtX2RvX3N0YXJ0KCkuCisJICovCisJZ2VtX3B1dF9jZWxsKGdwKTsKKworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisJCisJdXAoJmdwLT5wbV9zZW0pOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2VtX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZncC0+bmV0X3N0YXRzOworCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJLyogSSBoYXZlIHNlZW4gdGhpcyBiZWluZyBjYWxsZWQgd2hpbGUgdGhlIFBNIHdhcyBpbiBwcm9ncmVzcywKKwkgKiBzbyB3ZSBzaGllbGQgYWdhaW5zdCB0aGlzCisJICovCisJaWYgKGdwLT5ydW5uaW5nKSB7CisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0ZDU0VSUik7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19GQ1NFUlIpOworCisJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfQUVSUik7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRVJSKTsKKworCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19MRVJSKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0xFUlIpOworCisJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19FQ09MTCk7CisJCXN0YXRzLT5jb2xsaXNpb25zICs9CisJCQkocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpICsKKwkJCSByZWFkbChncC0+cmVncyArIE1BQ19MQ09MTCkpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTENPTEwpOworCX0KKworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisKKwlyZXR1cm4gJmdwLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdTMyIHJ4Y2ZnLCByeGNmZ19uZXc7CisJaW50IGxpbWl0ID0gMTAwMDA7CisJCisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwlpZiAoIWdwLT5ydW5uaW5nKQorCQlnb3RvIGJhaWw7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyeGNmZyA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwlyeGNmZ19uZXcgPSBnZW1fc2V0dXBfbXVsdGljYXN0KGdwKTsKKyNpZmRlZiBTVFJJUF9GQ1MKKwlyeGNmZ19uZXcgfD0gTUFDX1JYQ0ZHX1NGQ1M7CisjZW5kaWYKKwlncC0+bWFjX3J4X2NmZyA9IHJ4Y2ZnX25ldzsKKwkKKwl3cml0ZWwocnhjZmcgJiB+TUFDX1JYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl3aGlsZSAocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpICYgTUFDX1JYQ0ZHX0VOQUIpIHsKKwkJaWYgKCFsaW1pdC0tKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJcnhjZmcgJj0gfihNQUNfUlhDRkdfUFJPTSB8IE1BQ19SWENGR19IRkUpOworCXJ4Y2ZnIHw9IHJ4Y2ZnX25ldzsKKworCXdyaXRlbChyeGNmZywgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisgYmFpbDoKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworfQorCisvKiBKdW1iby1ncmFtcyBkb24ndCBzZWVtIHRvIHdvcmsgOi0oICovCisjZGVmaW5lIEdFTV9NSU5fTVRVCTY4CisjaWYgMQorI2RlZmluZSBHRU1fTUFYX01UVQkxNTAwCisjZWxzZQorI2RlZmluZSBHRU1fTUFYX01UVQk5MDAwCisjZW5kaWYKKworc3RhdGljIGludCBnZW1fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCWlmIChuZXdfbXR1IDwgR0VNX01JTl9NVFUgfHwgbmV3X210dSA+IEdFTV9NQVhfTVRVKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8ICFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCS8qIFdlJ2xsIGp1c3QgY2F0Y2ggaXQgbGF0ZXIgd2hlbiB0aGUKKwkJICogZGV2aWNlIGlzIHVwJ2Qgb3IgcmVzdW1lZC4KKwkJICovCisJCWRldi0+bXR1ID0gbmV3X210dTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG93bigmZ3AtPnBtX3NlbSk7CisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAoZ3AtPnJ1bm5pbmcpIHsKKwkJZ2VtX3JlaW5pdF9jaGlwKGdwKTsKKwkJaWYgKGdwLT5sc3RhdGUgPT0gbGlua191cCkKKwkJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisJfQorCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisJdXAoJmdwLT5wbV9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworICAKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGdwLT5wZGV2KSk7Cit9CisgIAorc3RhdGljIGludCBnZW1fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CisJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSB7CisJCWlmIChncC0+cGh5X21paS5kZWYpCisJCQljbWQtPnN1cHBvcnRlZCA9IGdwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisJCWVsc2UKKwkJCWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpOworCisJCS8qIFhYWCBoYXJkY29kZWQgc3R1ZmYgZm9yIG5vdyAqLworCQljbWQtPnBvcnQgPSBQT1JUX01JSTsKKwkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJCWNtZC0+cGh5X2FkZHJlc3MgPSAwOyAvKiBYWFggZml4ZWQgUEhZQUQgKi8KKworCQkvKiBSZXR1cm4gY3VycmVudCBQSFkgc2V0dGluZ3MgKi8KKwkJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCQljbWQtPmF1dG9uZWcgPSBncC0+d2FudF9hdXRvbmVnOworCQljbWQtPnNwZWVkID0gZ3AtPnBoeV9taWkuc3BlZWQ7CisJCWNtZC0+ZHVwbGV4ID0gZ3AtPnBoeV9taWkuZHVwbGV4OwkJCQorCQljbWQtPmFkdmVydGlzaW5nID0gZ3AtPnBoeV9taWkuYWR2ZXJ0aXNpbmc7CisKKwkJLyogSWYgd2Ugc3RhcnRlZCB3aXRoIGEgZm9yY2VkIG1vZGUsIHdlIGRvbid0IGhhdmUgYSBkZWZhdWx0CisJCSAqIGFkdmVydGlzZSBzZXQsIHdlIG5lZWQgdG8gcmV0dXJuIHNvbWV0aGluZyBzZW5zaWJsZSBzbworCQkgKiB1c2VybGFuZCBjYW4gcmUtZW5hYmxlIGF1dG9uZWcgcHJvcGVybHkuCisJCSAqLworCQlpZiAoY21kLT5hZHZlcnRpc2luZyA9PSAwKQorCQkJY21kLT5hZHZlcnRpc2luZyA9IGNtZC0+c3VwcG9ydGVkOworCQlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKwl9IGVsc2UgeyAvLyBYWFggUENTID8KKwkJY21kLT5zdXBwb3J0ZWQgPQorCQkJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSBTVVBQT1JURURfQXV0b25lZyk7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBjbWQtPnN1cHBvcnRlZDsKKwkJY21kLT5zcGVlZCA9IDA7CisJCWNtZC0+ZHVwbGV4ID0gY21kLT5wb3J0ID0gY21kLT5waHlfYWRkcmVzcyA9CisJCQljbWQtPnRyYW5zY2VpdmVyID0gY21kLT5hdXRvbmVnID0gMDsKKwl9CisJY21kLT5tYXh0eHBrdCA9IGNtZC0+bWF4cnhwa3QgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCS8qIFZlcmlmeSB0aGUgc2V0dGluZ3Mgd2UgY2FyZSBhYm91dC4gKi8KKwlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmCisJICAgIGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICBjbWQtPmFkdmVydGlzaW5nID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkgICAgKChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMDAgJiYKKwkgICAgICBjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAmJgorCSAgICAgIGNtZC0+c3BlZWQgIT0gU1BFRURfMTApIHx8CisJICAgICAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKKwkgICAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkgICAgICAKKwkvKiBBcHBseSBzZXR0aW5ncyBhbmQgcmVzdGFydCBsaW5rIHByb2Nlc3MuICovCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCWdlbV9nZXRfY2VsbChncCk7CisJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIGNtZCk7CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwlpZiAoIWdwLT53YW50X2F1dG9uZWcpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVzdGFydCBsaW5rIHByb2Nlc3MuICovCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCWdlbV9nZXRfY2VsbChncCk7CisJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOworCWdlbV9wdXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBnZW1fZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJcmV0dXJuIGdwLT5tc2dfZW5hYmxlOworfQorICAKK3N0YXRpYyB2b2lkIGdlbV9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCWdwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKKworLyogQWRkIG1vcmUgd2hlbiBJIHVuZGVyc3RhbmQgaG93IHRvIHByb2dyYW0gdGhlIGNoaXAgKi8KKy8qIGxpa2UgV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUICovCisKKyNkZWZpbmUgV09MX1NVUFBPUlRFRF9NQVNLCShXQUtFX01BR0lDKQorCitzdGF0aWMgdm9pZCBnZW1fZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwkvKiBBZGQgbW9yZSB3aGVuIEkgdW5kZXJzdGFuZCBob3cgdG8gcHJvZ3JhbSB0aGUgY2hpcCAqLworCWlmIChncC0+aGFzX3dvbCkgeworCQl3b2wtPnN1cHBvcnRlZCA9IFdPTF9TVVBQT1JURURfTUFTSzsKKwkJd29sLT53b2xvcHRzID0gZ3AtPndha2Vfb25fbGFuOworCX0gZWxzZSB7CisJCXdvbC0+c3VwcG9ydGVkID0gMDsKKwkJd29sLT53b2xvcHRzID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJaWYgKCFncC0+aGFzX3dvbCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWdwLT53YWtlX29uX2xhbiA9IHdvbC0+d29sb3B0cyAmIFdPTF9TVVBQT1JURURfTUFTSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBnZW1fZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGdlbV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3NldHRpbmdzCQk9IGdlbV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBnZW1fc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IGdlbV9ud2F5X3Jlc2V0LAorCS5nZXRfbXNnbGV2ZWwJCT0gZ2VtX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGdlbV9zZXRfbXNnbGV2ZWwsCisJLmdldF93b2wJCT0gZ2VtX2dldF93b2wsCisJLnNldF93b2wJCT0gZ2VtX3NldF93b2wsCit9OworCitzdGF0aWMgaW50IGdlbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSG9sZCB0aGUgUE0gc2VtYXBob3JlIHdoaWxlIGRvaW5nIGlvY3RsJ3Mgb3Igd2UgbWF5IGNvbGxpZGUKKwkgKiB3aXRoIHBvd2VyIG1hbmFnZW1lbnQuCisJICovCisJZG93bigmZ3AtPnBtX3NlbSk7CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCWdlbV9nZXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSBncC0+bWlpX3BoeV9hZGRyOworCQkvKiBGYWxsdGhyb3VnaC4uLiAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFncC0+cnVubmluZykKKwkJCXJjID0gLUVBR0FJTjsKKwkJZWxzZSB7CisJCQlkYXRhLT52YWxfb3V0ID0gX19waHlfcmVhZChncCwgZGF0YS0+cGh5X2lkICYgMHgxZiwKKwkJCQkJCSAgIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJCXJjID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyYyA9IC1FUEVSTTsKKwkJZWxzZSBpZiAoIWdwLT5ydW5uaW5nKQorCQkJcmMgPSAtRUFHQUlOOworCQllbHNlIHsKKwkJCV9fcGh5X3dyaXRlKGdwLCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKKwkJCQkgICAgZGF0YS0+dmFsX2luKTsKKwkJCXJjID0gMDsKKwkJfQorCQlicmVhazsKKwl9OworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCWdlbV9wdXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCXVwKCZncC0+cG1fc2VtKTsKKwkKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAoIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpKQorLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KK3N0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQoreworCWludCB0aGlzX29mZnNldDsKKworCWZvciAodGhpc19vZmZzZXQgPSAweDIwOyB0aGlzX29mZnNldCA8IGxlbjsgdGhpc19vZmZzZXQrKykgeworCQl2b2lkIF9faW9tZW0gKnAgPSByb21fYmFzZSArIHRoaXNfb2Zmc2V0OworCQlpbnQgaTsKKworCQlpZiAocmVhZGIocCArIDApICE9IDB4OTAgfHwKKwkJICAgIHJlYWRiKHAgKyAxKSAhPSAweDAwIHx8CisJCSAgICByZWFkYihwICsgMikgIT0gMHgwOSB8fAorCQkgICAgcmVhZGIocCArIDMpICE9IDB4NGUgfHwKKwkJICAgIHJlYWRiKHAgKyA0KSAhPSAweDQxIHx8CisJCSAgICByZWFkYihwICsgNSkgIT0gMHgwNikKKwkJCWNvbnRpbnVlOworCisJCXRoaXNfb2Zmc2V0ICs9IDY7CisJCXAgKz0gNjsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X2dlbV9tYWNfbm9ub2JwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKK3sKKwl1MzIgcm9tX3JlZ19vcmlnOworCXZvaWQgX19pb21lbSAqcDsKKworCWlmIChwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5wYXJlbnQgPT0gTlVMTCkgeworCQlpZiAocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSA8IDApCisJCQlnb3RvIHVzZV9yYW5kb207CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgJnJvbV9yZWdfb3JpZyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsCisJCQkgICAgICAgcm9tX3JlZ19vcmlnIHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisKKwlwID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX1JPTV9SRVNPVVJDRSksICg2NCAqIDEwMjQpKTsKKwlpZiAocCAhPSBOVUxMICYmIHJlYWRiKHApID09IDB4NTUgJiYgcmVhZGIocCArIDEpID09IDB4YWEpCisJCWZpbmRfZXRoX2FkZHJfaW5fdnBkKHAsICg2NCAqIDEwMjQpLCBkZXZfYWRkcik7CisKKwlpZiAocCAhPSBOVUxMKQorCQlpb3VubWFwKHApOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsIHJvbV9yZWdfb3JpZyk7CisJcmV0dXJuOworCit1c2VfcmFuZG9tOgorCS8qIFN1biBNQUMgcHJlZml4IHRoZW4gMyByYW5kb20gYnl0ZXMuICovCisJZGV2X2FkZHJbMF0gPSAweDA4OworCWRldl9hZGRyWzFdID0gMHgwMDsKKwlkZXZfYWRkclsyXSA9IDB4MjA7CisJZ2V0X3JhbmRvbV9ieXRlcyhkZXZfYWRkciArIDMsIDMpOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBub3QgU3BhcmMgYW5kIG5vdCBQUEMgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgZ2VtX2dldF9kZXZpY2VfYWRkcmVzcyhzdHJ1Y3QgZ2VtICpncCkKK3sKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdwLT5kZXY7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19zcGFyY19fKQorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZ3AtPnBkZXY7CisJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CisJaW50IG5vZGUgPSAtMTsKKworCWlmIChwY3AgIT0gTlVMTCkgeworCQlub2RlID0gcGNwLT5wcm9tX25vZGU7CisJCWlmIChwcm9tX2dldHByb3BsZW4obm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikKKwkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCQllbHNlCisJCQlub2RlID0gLTE7CisJfQorCWlmIChub2RlID09IC0xKQorCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgaWRwcm9tLT5pZF9ldGhhZGRyLCA2KTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKQorCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisKKwlhZGRyID0gZ2V0X3Byb3BlcnR5KGdwLT5vZl9ub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAoYWRkciA9PSBOVUxMKSB7CisJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IG1hYy1hZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCA2KTsKKyNlbHNlCisJZ2V0X2dlbV9tYWNfbm9ub2JwKGdwLT5wZGV2LCBncC0+ZGV2LT5kZXZfYWRkcik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGdlbV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJLyogU3RvcCB0aGUgbGluayB0aW1lciAqLworCQlkZWxfdGltZXJfc3luYygmZ3AtPmxpbmtfdGltZXIpOworCisJCS8qIFdlIHNob3VsZG4ndCBuZWVkIGFueSBsb2NraW5nIGhlcmUgKi8KKwkJZ2VtX2dldF9jZWxsKGdwKTsKKworCQkvKiBXYWl0IGZvciBhIHBlbmRpbmcgcmVzZXQgdGFzayB0byBjb21wbGV0ZSAqLworCQl3aGlsZSAoZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZykKKwkJCXlpZWxkKCk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkJLyogU2h1dCB0aGUgUEhZIGRvd24gKi8KKwkJZ2VtX3N0b3BfcGh5KGdwLCAwKTsKKworCQlnZW1fcHV0X2NlbGwoZ3ApOworCisJCS8qIE1ha2Ugc3VyZSBidXMgbWFzdGVyIGlzIGRpc2FibGVkICovCisJCXBjaV9kaXNhYmxlX2RldmljZShncC0+cGRldik7CisKKwkJLyogRnJlZSByZXNvdXJjZXMgKi8KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGdlbV9pbml0X2Jsb2NrKSwKKwkJCQkgICAgZ3AtPmluaXRfYmxvY2ssCisJCQkJICAgIGdwLT5nYmxvY2tfZHZtYSk7CisJCWlvdW5tYXAoZ3AtPnJlZ3MpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdlbV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBnZW1fdmVyc2lvbl9wcmludGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGdlbXJlZ19iYXNlLCBnZW1yZWdfbGVuOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGdlbSAqZ3A7CisJaW50IGksIGVyciwgcGNpX3VzaW5nX2RhYzsKKworCWlmIChnZW1fdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCS8qIEFwcGxlIGdtYWMgbm90ZTogZHVyaW5nIHByb2JlLCB0aGUgY2hpcCBpcyBwb3dlcmVkIHVwIGJ5CisJICogdGhlIGFyY2ggY29kZSB0byBhbGxvdyB0aGUgY29kZSBiZWxvdyB0byB3b3JrIChhbmQgdG8gbGV0CisJICogdGhlIGNoaXAgYmUgcHJvYmVkIG9uIHRoZSBjb25maWcgc3BhY2UuIEl0IHdvbid0IHN0YXkgcG93ZXJlZAorCSAqIHVwIHVudGlsIHRoZSBpbnRlcmZhY2UgaXMgYnJvdWdodCB1cCBob3dldmVyLCBzbyB3ZSBjYW4ndCByZWx5CisJICogb24gcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBkb25lIGF0IHRoaXMgcG9pbnQuCisJICovCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZW5hYmxlIE1NSU8gb3BlcmF0aW9uLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisKKwkvKiBBbGwgb2YgdGhlIEdFTSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IDY0LWJpdCBETUEgYWRkcmVzc2luZworCSAqIGlzIGZ1bGx5IHN1cHBvcnRlZCBhbmQgc2hvdWxkIHdvcmsganVzdCBmaW5lLiAgSG93ZXZlciB0aGUKKwkgKiBmcm9udCBlbmQgZm9yIFJJTyBiYXNlZCBHRU1zIGlzIGRpZmZlcmVudCBhbmQgb25seSBzdXBwb3J0cworCSAqIDMyLWJpdCBhZGRyZXNzaW5nLgorCSAqCisJICogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIHZhcmlvdXMgUFBDIEdFTXMgYXJlIDMyLWJpdCBvbmx5IGFzIHdlbGwuCisJICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fR0VNICYmCisJICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwkJfQorCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisJCisJZ2VtcmVnX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJZ2VtcmVnX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwlpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgIgorCQkgICAgICAgImJhc2UgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpncCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJZ3AgPSBkZXYtPnByaXY7CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwlncC0+cGRldiA9IHBkZXY7CisJZGV2LT5iYXNlX2FkZHIgPSAobG9uZykgcGRldjsKKwlncC0+ZGV2ID0gZGV2OworCisJZ3AtPm1zZ19lbmFibGUgPSBERUZBVUxUX01TRzsKKworCXNwaW5fbG9ja19pbml0KCZncC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmdwLT50eF9sb2NrKTsKKwlpbml0X01VVEVYKCZncC0+cG1fc2VtKTsKKworCWluaXRfdGltZXIoJmdwLT5saW5rX3RpbWVyKTsKKwlncC0+bGlua190aW1lci5mdW5jdGlvbiA9IGdlbV9saW5rX3RpbWVyOworCWdwLT5saW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZ3A7CisKKwlJTklUX1dPUksoJmdwLT5yZXNldF90YXNrLCBnZW1fcmVzZXRfdGFzaywgZ3ApOworCQorCWdwLT5sc3RhdGUgPSBsaW5rX2Rvd247CisJZ3AtPnRpbWVyX3RpY2tzID0gMDsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJZ3AtPnJlZ3MgPSBpb3JlbWFwKGdlbXJlZ19iYXNlLCBnZW1yZWdfbGVuKTsKKwlpZiAoZ3AtPnJlZ3MgPT0gMFVMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwkvKiBPbiBBcHBsZSwgd2Ugd2FudCBhIHJlZmVyZW5jZSB0byB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UtdHJlZQorCSAqIG5vZGUuIFdlIHVzZSBpdCBmb3IgY2xvY2sgY29udHJvbC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlncC0+b2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKyNlbmRpZgorCisJLyogT25seSBBcHBsZSB2ZXJzaW9uIHN1cHBvcnRzIFdPTCBhZmFpayAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BUFBMRSkKKwkJZ3AtPmhhc193b2wgPSAxOworCisJLyogTWFrZSBzdXJlIGNlbGwgaXMgZW5hYmxlZCAqLworCWdlbV9nZXRfY2VsbChncCk7CisKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBzdG9wcGVkIGFuZCBpbiBpbml0IHN0YXRlICovCisJZ2VtX3Jlc2V0KGdwKTsKKworCS8qIEZpbGwgdXAgdGhlIG1paV9waHkgc3RydWN0dXJlIChldmVuIGlmIHdlIHdvbid0IHVzZSBpdCkgKi8KKwlncC0+cGh5X21paS5kZXYgPSBkZXY7CisJZ3AtPnBoeV9taWkubWRpb19yZWFkID0gX3BoeV9yZWFkOworCWdwLT5waHlfbWlpLm1kaW9fd3JpdGUgPSBfcGh5X3dyaXRlOworCisJLyogQnkgZGVmYXVsdCwgd2Ugc3RhcnQgd2l0aCBhdXRvbmVnICovCisJZ3AtPndhbnRfYXV0b25lZyA9IDE7CisKKwkvKiBDaGVjayBmaWZvIHNpemVzLCBQSFkgdHlwZSwgZXRjLi4uICovCisJaWYgKGdlbV9jaGVja19pbnZhcmlhbnRzKGdwKSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGJlIGF0IGxlYXN0CisJICogUEFHRV9TSVpFIGFsaWduZWQuCisJICovCisJZ3AtPmluaXRfYmxvY2sgPSAoc3RydWN0IGdlbV9pbml0X2Jsb2NrICopCisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgZ2VtX2luaXRfYmxvY2spLAorCQkJCSAgICAgJmdwLT5nYmxvY2tfZHZtYSk7CisJaWYgKCFncC0+aW5pdF9ibG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgaW5pdCBibG9jaywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWlmIChnZW1fZ2V0X2RldmljZV9hZGRyZXNzKGdwKSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDsKKworCWRldi0+b3BlbiA9IGdlbV9vcGVuOworCWRldi0+c3RvcCA9IGdlbV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGdlbV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gZ2VtX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGdlbV9zZXRfbXVsdGljYXN0OworCWRldi0+ZG9faW9jdGwgPSBnZW1faW9jdGw7CisJZGV2LT5wb2xsID0gZ2VtX3BvbGw7CisJZGV2LT53ZWlnaHQgPSA2NDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmdlbV9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSBnZW1fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOworCWRldi0+Y2hhbmdlX210dSA9IGdlbV9jaGFuZ2VfbXR1OworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+ZG1hID0gMDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZ2VtX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJLyogU2V0IHRoYXQgbm93LCBpbiBjYXNlIFBNIGtpY2tzIGluIG5vdyAqLworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogRGV0ZWN0ICYgaW5pdCBQSFksIHN0YXJ0IGF1dG9uZWcsIHdlIHJlbGVhc2UgdGhlIGNlbGwgbm93CisJICogdG9vLCBpdCB3aWxsIGJlIG1hbmFnZWQgYnkgd2hvZXZlciBuZWVkcyBpdAorCSAqLworCWdlbV9pbml0X3BoeShncCk7CisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKworCS8qIFJlZ2lzdGVyIHdpdGgga2VybmVsICovCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU3VuIEdFTSAoUENJKSAxMC8xMDAvMTAwMEJhc2VUIEV0aGVybmV0ICIsCisJICAgICAgIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisJcHJpbnRrKCJcbiIpOworCisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CisgICAgIAkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGb3VuZCAlcyBQSFlcbiIsIGRldi0+bmFtZSwgCisJCQlncC0+cGh5X21paS5kZWYgPyBncC0+cGh5X21paS5kZWYtPm5hbWUgOiAibm8iKTsKKworCS8qIEdFTSBjYW4gZG8gaXQgYWxsLi4uICovCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9MTFRYOworCWlmIChwY2lfdXNpbmdfZGFjKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDoKKwlnZW1fcmVtb3ZlX29uZShwZGV2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwlnZW1fcHV0X2NlbGwoZ3ApOworCWlvdW5tYXAoZ3AtPnJlZ3MpOworCitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycl9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKKworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBnZW1fZHJpdmVyID0geworCS5uYW1lCQk9IEdFTV9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBnZW1fcGNpX3RibCwKKwkucHJvYmUJCT0gZ2VtX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ2VtX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gZ2VtX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBnZW1fcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgZ2VtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZnZW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdlbV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZnZW1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ2VtX2luaXQpOworbW9kdWxlX2V4aXQoZ2VtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmggYi9kcml2ZXJzL25ldC9zdW5nZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQzZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmgKQEAgLTAsMCArMSwxMDUxIEBACisvKiAkSWQ6IHN1bmdlbS5oLHYgMS4xMC4yLjQgMjAwMi8wMy8xMSAwODo1NDo0OCBkYXZlbSBFeHAgJAorICogc3VuZ2VtLmg6IERlZmluaXRpb25zIGZvciBTdW4gR0VNIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpZm5kZWYgX1NVTkdFTV9ICisjZGVmaW5lIF9TVU5HRU1fSAorCisvKiBHbG9iYWwgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdSRUdfU0VCU1RBVEUJMHgwMDAwVUwJLyogU0VCIFN0YXRlIFJlZ2lzdGVyCQkqLworI2RlZmluZSBHUkVHX0NGRwkweDAwMDRVTAkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfU1RBVAkweDAwMENVTAkvKiBTdGF0dXMgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEdSRUdfSU1BU0sJMHgwMDEwVUwJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19JQUNLCTB4MDAxNFVMCS8qIEludGVycnVwdCBBQ0sgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19TVEFUMgkweDAwMUNVTAkvKiBBbGlhcyBvZiBHUkVHX1NUQVQJCSovCisjZGVmaW5lIEdSRUdfUENJRVNUQVQJMHgxMDAwVUwJLyogUENJIEVycm9yIFN0YXR1cyBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX1BDSUVNQVNLCTB4MTAwNFVMCS8qIFBDSSBFcnJvciBNYXNrIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfQklGQ0ZHCTB4MTAwOFVMCS8qIEJJRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfQklGRElBRwkweDEwMENVTAkvKiBCSUYgRGlhZ25vc3RpY3MgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19TV1JTVAkweDEwMTBVTAkvKiBTb2Z0d2FyZSBSZXNldCBSZWdpc3RlcgkqLworCisvKiBHbG9iYWwgU0VCIFN0YXRlIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfU0VCU1RBVEVfQVJCCTB4MDAwMDAwMDMJLyogU3RhdGUgb2YgQXJiaXRlcgkJKi8KKyNkZWZpbmUgR1JFR19TRUJTVEFURV9SWFdPTgkweDAwMDAwMDA0CS8qIFJYIHdvbiBpbnRlcm5hbCBhcmJpdHJhdGlvbgkqLworCisvKiBHbG9iYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX0NGR19JQlVSU1QJCTB4MDAwMDAwMDEJLyogSW5maW5pdGUgQnVyc3QJCSovCisjZGVmaW5lIEdSRUdfQ0ZHX1RYRE1BTElNCTB4MDAwMDAwM2UJLyogVFggRE1BIGdyYW50IGxpbWl0CQkqLworI2RlZmluZSBHUkVHX0NGR19SWERNQUxJTQkweDAwMDAwN2MwCS8qIFJYIERNQSBncmFudCBsaW1pdAkJKi8KKyNkZWZpbmUgR1JFR19DRkdfUk9OUEFVTEJJVAkweDAwMDAwODAwCS8qIFVzZSBtZW0gcmVhZCBtdWx0aXBsZSBmb3IgUENJIHJlYWQKKwkJCQkJCSAqIGFmdGVyIGluZmluaXRlIGJ1cnN0IChBcHBsZSkgKi8KKyNkZWZpbmUgR1JFR19DRkdfRU5CVUcyRklYCTB4MDAwMDEwMDAJLyogRml4IFJ4IGhhbmcgYWZ0ZXIgb3ZlcmZsb3cgKi8KKworLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIuCisgKgorICogUmVhZGluZyB0aGlzIHJlZ2lzdGVyIGF1dG9tYXRpY2FsbHkgY2xlYXJzIGJpdHMgMCB0aHJvdWdoIDYuCisgKiBUaGlzIGF1dG8tY2xlYXJpbmcgZG9lcyBub3Qgb2NjdXIgd2hlbiB0aGUgYWxpYXMgYXQgR1JFR19TVEFUMgorICogaXMgcmVhZCBpbnN0ZWFkLiAgVGhlIHJlc3Qgb2YgdGhlIGludGVycnVwdCBiaXRzIG9ubHkgY2xlYXIgd2hlbgorICogdGhlIHNlY29uZGFyeSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhhdAorICogYml0IGlzIHJlYWQgKGllLiBpZiBHUkVHX1NUQVRfUENTIGlzIHNldCwgaXQgd2lsbCBiZSBjbGVhcmVkIGJ5CisgKiByZWFkaW5nIFBDU19JU1RBVCkuCisgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYSU5UTUUJMHgwMDAwMDAwMQkvKiBUWCBJTlRNRSBmcmFtZSB0cmFuc2ZlcnJlZAkqLworI2RlZmluZSBHUkVHX1NUQVRfVFhBTEwJCTB4MDAwMDAwMDIJLyogQWxsIFRYIGZyYW1lcyB0cmFuc2ZlcnJlZAkqLworI2RlZmluZSBHUkVHX1NUQVRfVFhET05FCTB4MDAwMDAwMDQJLyogT25lIFRYIGZyYW1lIHRyYW5zZmVycmVkCSovCisjZGVmaW5lIEdSRUdfU1RBVF9SWERPTkUJMHgwMDAwMDAxMAkvKiBPbmUgUlggZnJhbWUgYXJyaXZlZAkJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYTk9CVUYJMHgwMDAwMDAyMAkvKiBObyBmcmVlIFJYIGJ1ZmZlcnMgYXZhaWxhYmxlCSovCisjZGVmaW5lIEdSRUdfU1RBVF9SWFRBR0VSUgkweDAwMDAwMDQwCS8qIFJYIHRhZyBmcmFtaW5nIGlzIGNvcnJ1cHQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1BDUwkJMHgwMDAwMjAwMAkvKiBQQ1Mgc2lnbmFsbGVkIGludGVycnVwdAkqLworI2RlZmluZSBHUkVHX1NUQVRfVFhNQUMJCTB4MDAwMDQwMDAJLyogVFggTUFDIHNpZ25hbGxlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYTUFDCQkweDAwMDA4MDAwCS8qIFJYIE1BQyBzaWduYWxsZWQgaW50ZXJydXB0CSovCisjZGVmaW5lIEdSRUdfU1RBVF9NQUMJCTB4MDAwMTAwMDAJLyogTUFDIENvbnRyb2wgc2lnbmFsbGVkIGlycQkqLworI2RlZmluZSBHUkVHX1NUQVRfTUlGCQkweDAwMDIwMDAwCS8qIE1JRiBzaWduYWxsZWQgaW50ZXJydXB0CSovCisjZGVmaW5lIEdSRUdfU1RBVF9QQ0lFUlIJMHgwMDA0MDAwMAkvKiBQQ0kgRXJyb3IgaW50ZXJydXB0CQkqLworI2RlZmluZSBHUkVHX1NUQVRfVFhOUgkJMHhmZmY4MDAwMAkvKiA9PSBUWERNQV9UWERPTkUgcmVnIHZhbAkqLworI2RlZmluZSBHUkVHX1NUQVRfVFhOUl9TSElGVAkxOQorCisjZGVmaW5lIEdSRUdfU1RBVF9BQk5PUk1BTAkoR1JFR19TVEFUX1JYTk9CVUYgfCBHUkVHX1NUQVRfUlhUQUdFUlIgfCBcCisJCQkJIEdSRUdfU1RBVF9QQ1MgfCBHUkVHX1NUQVRfVFhNQUMgfCBHUkVHX1NUQVRfUlhNQUMgfCBcCisJCQkJIEdSRUdfU1RBVF9NQUMgfCBHUkVHX1NUQVRfTUlGIHwgR1JFR19TVEFUX1BDSUVSUikKKworI2RlZmluZSBHUkVHX1NUQVRfTkFQSQkJKEdSRUdfU1RBVF9UWEFMTCAgfCBHUkVHX1NUQVRfVFhJTlRNRSB8IFwKKwkJCQkgR1JFR19TVEFUX1JYRE9ORSB8IEdSRUdfU1RBVF9BQk5PUk1BTCkKKworLyogVGhlIGxheW91dCBvZiBHUkVHX0lNQVNLIGFuZCBHUkVHX0lBQ0sgaXMgaWRlbnRpY2FsIHRvIEdSRUdfU1RBVC4KKyAqIEJpdHMgc2V0IGluIEdSRUdfSU1BU0sgd2lsbCBwcmV2ZW50IHRoYXQgaW50ZXJydXB0IHR5cGUgZnJvbSBiZWluZworICogc2lnbmFsbGVkIHRvIHRoZSBjcHUuICBHUkVHX0lBQ0sgY2FuIGJlIHVzZWQgdG8gY2xlYXIgc3BlY2lmaWMgdG9wLWxldmVsCisgKiBpbnRlcnJ1cHQgY29uZGl0aW9ucyBpbiBHUkVHX1NUQVQsIGllLiBpdCBvbmx5IHdvcmtzIGZvciBiaXRzIDAgdGhyb3VnaCA2LgorICogU2V0dGluZyB0aGUgYml0IHdpbGwgY2xlYXIgdGhhdCBpbnRlcnJ1cHQsIGNsZWFyIGJpdHMgd2lsbCBoYXZlIG5vIGVmZmVjdAorICogb24gR1JFR19TVEFULgorICovCisKKy8qIEdsb2JhbCBQQ0kgRXJyb3IgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfUENJRVNUQVRfQkFEQUNLCTB4MDAwMDAwMDEJLyogTm8gQUNLNjQjIGR1cmluZyBBQlM2NCBjeWNsZQkqLworI2RlZmluZSBHUkVHX1BDSUVTVEFUX0RUUlRPCTB4MDAwMDAwMDIJLyogRGVsYXllZCB0cmFuc2FjdGlvbiB0aW1lb3V0CSovCisjZGVmaW5lIEdSRUdfUENJRVNUQVRfT1RIRVIJMHgwMDAwMDAwNAkvKiBPdGhlciBQQ0kgZXJyb3IsIGNoZWNrIGNmZyBzcGFjZSAqLworCisvKiBUaGUgbGF5b3V0IG9mIHRoZSBHUkVHX1BDSUVNQVNLIGlzIGlkZW50aWNhbCB0byB0aGF0IG9mIEdSRUdfUENJRVNUQVQuCisgKiBCaXRzIHNldCBpbiBHUkVHX1BDSUVNQVNLIHdpbGwgcHJldmVudCB0aGF0IGludGVycnVwdCB0eXBlIGZyb20gYmVpbmcKKyAqIHNpZ25hbGxlZCB0byB0aGUgY3B1LgorICovCisKKy8qIEdsb2JhbCBCSUYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX0JJRkNGR19TTE9XQ0xLCTB4MDAwMDAwMDEJLyogU2V0IGlmIFBDSSBydW5zIDwgMjVNaHoJKi8KKyNkZWZpbmUgR1JFR19CSUZDRkdfQjY0RElTCTB4MDAwMDAwMDIJLyogRGlzYWJsZSA2NGJpdCB3aWRlIGRhdGEgY3ljbGUqLworI2RlZmluZSBHUkVHX0JJRkNGR19NNjZFTgkweDAwMDAwMDA0CS8qIFNldCBpZiBvbiA2Nk1oeiBQQ0kgc2VnbWVudAkqLworCisvKiBHbG9iYWwgQklGIERpYWdub3N0aWNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfQklGRElBR19CVVJTVFNNCTB4MDA3ZjAwMDAJLyogUENJIEJ1cnN0IHN0YXRlIG1hY2hpbmUJKi8KKyNkZWZpbmUgR1JFR19CSUZESUFHX0JJRlNNCTB4ZmYwMDAwMDAJLyogQklGIHN0YXRlIG1hY2hpbmUJCSovCisKKy8qIEdsb2JhbCBTb2Z0d2FyZSBSZXNldCBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gcGVyZm9ybSBhIGdsb2JhbCByZXNldCBvZiB0aGUgUlggYW5kIFRYIHBvcnRpb25zCisgKiBvZiB0aGUgR0VNIGFzaWMuICBTZXR0aW5nIHRoZSBSWCBvciBUWCByZXNldCBiaXQgd2lsbCBzdGFydCB0aGUgcmVzZXQuCisgKiBUaGUgZHJpdmVyIF9NVVNUXyBwb2xsIHRoZXNlIGJpdHMgdW50aWwgdGhleSBjbGVhci4gIE9uZSBtYXkgbm90IGF0dGVtcHQKKyAqIHRvIHByb2dyYW0gYW55IG90aGVyIHBhcnQgb2YgR0VNIHVudGlsIHRoZSBiaXRzIGNsZWFyLgorICovCisjZGVmaW5lIEdSRUdfU1dSU1RfVFhSU1QJMHgwMDAwMDAwMQkvKiBUWCBTb2Z0d2FyZSBSZXNldAkJKi8KKyNkZWZpbmUgR1JFR19TV1JTVF9SWFJTVAkweDAwMDAwMDAyCS8qIFJYIFNvZnR3YXJlIFJlc2V0CQkqLworI2RlZmluZSBHUkVHX1NXUlNUX1JTVE9VVAkweDAwMDAwMDA0CS8qIEZvcmNlIFJTVCMgcGluIGFjdGl2ZQkqLworI2RlZmluZSBHUkVHX1NXUlNUX0NBQ0hFU0laRQkweDAwZmYwMDAwCS8qIFJJTyBvbmx5OiBjYWNoZSBsaW5lIHNpemUJKi8KKyNkZWZpbmUgR1JFR19TV1JTVF9DQUNIRV9TSElGVAkxNgorCisvKiBUWCBETUEgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRYRE1BX0tJQ0sJMHgyMDAwVUwJLyogVFggS2ljayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHCTB4MjAwNFVMCS8qIFRYIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFhETUFfREJMT1cJMHgyMDA4VUwJLyogVFggRGVzYy4gQmFzZSBMb3cJCSovCisjZGVmaW5lIFRYRE1BX0RCSEkJMHgyMDBDVUwJLyogVFggRGVzYy4gQmFzZSBIaWdoCQkqLworI2RlZmluZSBUWERNQV9GV1BUUgkweDIwMTRVTAkvKiBUWCBGSUZPIFdyaXRlIFBvaW50ZXIJKi8KKyNkZWZpbmUgVFhETUFfRlNXUFRSCTB4MjAxOFVMCS8qIFRYIEZJRk8gU2hhZG93IFdyaXRlIFBvaW50ZXIJKi8KKyNkZWZpbmUgVFhETUFfRlJQVFIJMHgyMDFDVUwJLyogVFggRklGTyBSZWFkIFBvaW50ZXIJCSovCisjZGVmaW5lIFRYRE1BX0ZTUlBUUgkweDIwMjBVTAkvKiBUWCBGSUZPIFNoYWRvdyBSZWFkIFBvaW50ZXIJKi8KKyNkZWZpbmUgVFhETUFfUENOVAkweDIwMjRVTAkvKiBUWCBGSUZPIFBhY2tldCBDb3VudGVyCSovCisjZGVmaW5lIFRYRE1BX1NNQUNISU5FCTB4MjAyOFVMCS8qIFRYIFN0YXRlIE1hY2hpbmUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFhETUFfRFBMT1cJMHgyMDMwVUwJLyogVFggRGF0YSBQb2ludGVyIExvdwkJKi8KKyNkZWZpbmUgVFhETUFfRFBISQkweDIwMzRVTAkvKiBUWCBEYXRhIFBvaW50ZXIgSGlnaAkJKi8KKyNkZWZpbmUgVFhETUFfVFhET05FCTB4MjEwMFVMCS8qIFRYIENvbXBsZXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFhETUFfRkFERFIJMHgyMTA0VUwJLyogVFggRklGTyBBZGRyZXNzCQkqLworI2RlZmluZSBUWERNQV9GVEFHCTB4MjEwOFVMCS8qIFRYIEZJRk8gVGFnCQkJKi8KKyNkZWZpbmUgVFhETUFfRExPVwkweDIxMENVTAkvKiBUWCBGSUZPIERhdGEgTG93CQkqLworI2RlZmluZSBUWERNQV9ESElUMQkweDIxMTBVTAkvKiBUWCBGSUZPIERhdGEgSGlnaFQxCQkqLworI2RlZmluZSBUWERNQV9ESElUMAkweDIxMTRVTAkvKiBUWCBGSUZPIERhdGEgSGlnaFQwCQkqLworI2RlZmluZSBUWERNQV9GU1oJMHgyMTE4VUwJLyogVFggRklGTyBTaXplCQkJKi8KKworLyogVFggS2ljayBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIDEzLWJpdCByZWdpc3RlciBpcyBwcm9ncmFtbWVkIGJ5IHRoZSBkcml2ZXIgdG8gaG9sZCB0aGUgZGVzY3JpcHRvcgorICogZW50cnkgaW5kZXggd2hpY2ggZm9sbG93cyB0aGUgbGFzdCB2YWxpZCB0cmFuc21pdCBkZXNjcmlwdG9yLgorICovCisKKy8qIFRYIENvbXBsZXRpb24gUmVnaXN0ZXIuCisgKgorICogVGhpcyAxMy1iaXQgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBHRU0gdG8gaG9sZCB0byBkZXNjcmlwdG9yIGVudHJ5IGluZGV4CisgKiB3aGljaCBmb2xsb3dzIHRoZSBsYXN0IGRlc2NyaXB0b3IgYWxyZWFkeSBwcm9jZXNzZWQgYnkgR0VNLiAgTm90ZSB0aGF0CisgKiB0aGlzIHZhbHVlIGlzIG1pcnJvcmVkIGluIEdSRUdfU1RBVCB3aGljaCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIGV2ZW4KKyAqIGFjY2VzcyB0aGlzIHJlZ2lzdGVyIGluIHRoZSBkcml2ZXIgZHVyaW5nIGludGVycnVwdCBwcm9jZXNzaW5nLgorICovCisKKy8qIFRYIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogTm90ZSB0aGF0IFRYRE1BX0NGR19GVEhSRVNILCB0aGUgVFggRklGTyBUaHJlc2hvbGQsIGlzIGFuIG9ic29sZXRlIGZlYXR1cmUKKyAqIHRoYXQgd2FzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCBqdW1ibyBwYWNrZXRzLiAgSXQgc2hvdWxkIGJlIHNldCB0byB0aGUKKyAqIG1heGltdW0gdmFsdWUgb2YgMHg0ZmYsIGVsc2Ugb25lIHJpc2tzIGdldHRpbmcgVFggTUFDIFVuZGVycnVuIGVycm9ycy4KKyAqLworI2RlZmluZSBUWERNQV9DRkdfRU5BQkxFCTB4MDAwMDAwMDEJLyogRW5hYmxlIFRYIERNQSBjaGFubmVsCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1oJMHgwMDAwMDAxZQkvKiBUWCBkZXNjcmlwdG9yIHJpbmcgc2l6ZQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzMyCTB4MDAwMDAwMDAJLyogMzIgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfNjQJMHgwMDAwMDAwMgkvKiA2NCBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl8xMjgJMHgwMDAwMDAwNAkvKiAxMjggVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfMjU2CTB4MDAwMDAwMDYJLyogMjU2IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzUxMgkweDAwMDAwMDA4CS8qIDUxMiBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl8xSwkweDAwMDAwMDBhCS8qIDEwMjQgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfMksJMHgwMDAwMDAwYwkvKiAyMDQ4IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzRLCTB4MDAwMDAwMGUJLyogNDA5NiBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl84SwkweDAwMDAwMDEwCS8qIDgxOTIgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19QSU9TRUwJMHgwMDAwMDAyMAkvKiBFbmFibGUgVFggRklGTyBQSU8gZnJvbSBjcHUJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX0ZUSFJFU0gJMHgwMDFmZmMwMAkvKiBUWCBGSUZPIFRocmVzaG9sZCwgb2Jzb2xldGUJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1BNT0RFCQkweDAwMjAwMDAwCS8qIFRYQUxMIGlycSBtZWFucyBUWCBGSUZPIGVtcHR5Ki8KKworLyogVFggRGVzY3JpcHRvciBCYXNlIExvdy9IaWdoLgorICoKKyAqIFRoZXNlIHR3byByZWdpc3RlcnMgc3RvcmUgdGhlIDUzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYmFzZSBhZGRyZXNzCisgKiBvZiB0aGUgVFggZGVzY3JpcHRvciB0YWJsZS4gIFRoZSAxMSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBhbHdheXMKKyAqIHplcm8uICBBcyBhIHJlc3VsdCwgdGhlIFRYIGRlc2NyaXB0b3IgdGFibGUgbXVzdCBiZSAySyBhbGlnbmVkLgorICovCisKKy8qIFRoZSByZXN0IG9mIHRoZSBUWERNQV8qIHJlZ2lzdGVycyBhcmUgZm9yIGRpYWdub3N0aWNzIGFuZCBkZWJ1ZywgSSB3aWxsIGRvY3VtZW50CisgKiB0aGVtIGxhdGVyLiAtRGF2ZU0KKyAqLworCisvKiBXYWtlT25MYW4gUmVnaXN0ZXJzCSovCisjZGVmaW5lIFdPTF9NQVRDSDAJMHgzMDAwVUwKKyNkZWZpbmUgV09MX01BVENIMQkweDMwMDRVTAorI2RlZmluZSBXT0xfTUFUQ0gyCTB4MzAwOFVMCisjZGVmaW5lIFdPTF9NQ09VTlQJMHgzMDBDVUwKKyNkZWZpbmUgV09MX1dBS0VDU1IJMHgzMDEwVUwKKworLyogV09MIE1hdGNoIGNvdW50IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgV09MX01DT1VOVF9OCQkweDAwMDAwMDEwCisjZGVmaW5lIFdPTF9NQ09VTlRfTQkJMHgwMDAwMDAwMCAvKiAwIDw8IDggKi8KKworI2RlZmluZSBXT0xfV0FLRUNTUl9FTkFCTEUJMHgwMDAwMDAwMQorI2RlZmluZSBXT0xfV0FLRUNTUl9NSUkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgV09MX1dBS0VDU1JfU0VFTgkweDAwMDAwMDA0CisjZGVmaW5lIFdPTF9XQUtFQ1NSX0ZJTFRfVUNBU1QJMHgwMDAwMDAwOAorI2RlZmluZSBXT0xfV0FLRUNTUl9GSUxUX01DQVNUCTB4MDAwMDAwMTAKKyNkZWZpbmUgV09MX1dBS0VDU1JfRklMVF9CQ0FTVAkweDAwMDAwMDIwCisjZGVmaW5lIFdPTF9XQUtFQ1NSX0ZJTFRfU0VFTgkweDAwMDAwMDQwCisKKworLyogUmVjZWl2ZSBETUEgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJYRE1BX0NGRwkweDQwMDBVTAkvKiBSWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFJYRE1BX0RCTE9XCTB4NDAwNFVMCS8qIFJYIERlc2NyaXB0b3IgQmFzZSBMb3cJKi8KKyNkZWZpbmUgUlhETUFfREJISQkweDQwMDhVTAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgSGlnaAkqLworI2RlZmluZSBSWERNQV9GV1BUUgkweDQwMENVTAkvKiBSWCBGSUZPIFdyaXRlIFBvaW50ZXIJKi8KKyNkZWZpbmUgUlhETUFfRlNXUFRSCTB4NDAxMFVMCS8qIFJYIEZJRk8gU2hhZG93IFdyaXRlIFBvaW50ZXIJKi8KKyNkZWZpbmUgUlhETUFfRlJQVFIJMHg0MDE0VUwJLyogUlggRklGTyBSZWFkIFBvaW50ZXIJCSovCisjZGVmaW5lIFJYRE1BX1BDTlQJMHg0MDE4VUwJLyogUlggRklGTyBQYWNrZXQgQ291bnRlcgkqLworI2RlZmluZSBSWERNQV9TTUFDSElORQkweDQwMUNVTAkvKiBSWCBTdGF0ZSBNYWNoaW5lIFJlZ2lzdGVyCSovCisjZGVmaW5lIFJYRE1BX1BUSFJFU0gJMHg0MDIwVUwJLyogUGF1c2UgVGhyZXNob2xkcwkJKi8KKyNkZWZpbmUgUlhETUFfRFBMT1cJMHg0MDI0VUwJLyogUlggRGF0YSBQb2ludGVyIExvdwkJKi8KKyNkZWZpbmUgUlhETUFfRFBISQkweDQwMjhVTAkvKiBSWCBEYXRhIFBvaW50ZXIgSGlnaAkJKi8KKyNkZWZpbmUgUlhETUFfS0lDSwkweDQxMDBVTAkvKiBSWCBLaWNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBSWERNQV9ET05FCTB4NDEwNFVMCS8qIFJYIENvbXBsZXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUlhETUFfQkxBTksJMHg0MTA4VUwJLyogUlggQmxhbmtpbmcgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFJYRE1BX0ZBRERSCTB4NDEwQ1VMCS8qIFJYIEZJRk8gQWRkcmVzcwkJKi8KKyNkZWZpbmUgUlhETUFfRlRBRwkweDQxMTBVTAkvKiBSWCBGSUZPIFRhZwkJCSovCisjZGVmaW5lIFJYRE1BX0RMT1cJMHg0MTE0VUwJLyogUlggRklGTyBEYXRhIExvdwkJKi8KKyNkZWZpbmUgUlhETUFfREhJVDEJMHg0MTE4VUwJLyogUlggRklGTyBEYXRhIEhpZ2hUMAkJKi8KKyNkZWZpbmUgUlhETUFfREhJVDAJMHg0MTFDVUwJLyogUlggRklGTyBEYXRhIEhpZ2hUMQkJKi8KKyNkZWZpbmUgUlhETUFfRlNaCTB4NDEyMFVMCS8qIFJYIEZJRk8gU2l6ZQkJCSovCisKKy8qIFJYIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCisjZGVmaW5lIFJYRE1BX0NGR19FTkFCTEUJMHgwMDAwMDAwMQkvKiBFbmFibGUgUlggRE1BIGNoYW5uZWwJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWgkweDAwMDAwMDFlCS8qIFJYIGRlc2NyaXB0b3IgcmluZyBzaXplCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfMzIJMHgwMDAwMDAwMAkvKiAtIDMyICAgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl82NAkweDAwMDAwMDAyCS8qIC0gNjQgICBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzEyOAkweDAwMDAwMDA0CS8qIC0gMTI4ICBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzI1NgkweDAwMDAwMDA2CS8qIC0gMjU2ICBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzUxMgkweDAwMDAwMDA4CS8qIC0gNTEyICBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzFLCTB4MDAwMDAwMGEJLyogLSAxMDI0IGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfMksJMHgwMDAwMDAwYwkvKiAtIDIwNDggZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl80SwkweDAwMDAwMDBlCS8qIC0gNDA5NiBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzhLCTB4MDAwMDAwMTAJLyogLSA4MTkyIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfQkRJU0FCCTB4MDAwMDAwMjAJLyogRGlzYWJsZSBSWCBkZXNjIGJhdGNoaW5nCSovCisjZGVmaW5lIFJYRE1BX0NGR19GQk9GRgkJMHgwMDAwMWMwMAkvKiBPZmZzZXQgb2YgZmlyc3QgZGF0YSBieXRlCSovCisjZGVmaW5lIFJYRE1BX0NGR19DU1VNT0ZGCTB4MDAwZmUwMDAJLyogU2tpcCBieXRlcyBiZWZvcmUgY3N1bSBjYWxjCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNICTB4MDcwMDAwMDAJLyogUlggRklGTyBkbWEgc3RhcnQgdGhyZXNob2xkCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzY0CTB4MDAwMDAwMDAJLyogLSA2NCAgIGJ5dGVzCQkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfMTI4CTB4MDEwMDAwMDAJLyogLSAxMjggIGJ5dGVzCQkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfMjU2CTB4MDIwMDAwMDAJLyogLSAyNTYgIGJ5dGVzCQkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfNTEyCTB4MDMwMDAwMDAJLyogLSA1MTIgIGJ5dGVzCQkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfMUsJMHgwNDAwMDAwMAkvKiAtIDEwMjQgYnl0ZXMJCQkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF8ySwkweDA1MDAwMDAwCS8qIC0gMjA0OCBieXRlcwkJCSovCisKKy8qIFJYIERlc2NyaXB0b3IgQmFzZSBMb3cvSGlnaC4KKyAqCisgKiBUaGVzZSB0d28gcmVnaXN0ZXJzIHN0b3JlIHRoZSA1MyBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGJhc2UgYWRkcmVzcworICogb2YgdGhlIFJYIGRlc2NyaXB0b3IgdGFibGUuICBUaGUgMTEgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgYWx3YXlzCisgKiB6ZXJvLiAgQXMgYSByZXN1bHQsIHRoZSBSWCBkZXNjcmlwdG9yIHRhYmxlIG11c3QgYmUgMksgYWxpZ25lZC4KKyAqLworCisvKiBSWCBQQVVTRSBUaHJlc2hvbGRzLgorICoKKyAqIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgd2hlbiBYT0ZGIGFuZCBYT04gUEFVU0UgZnJhbWVzIGFyZSBlbWl0dGVkIGJ5CisgKiBHRU0uICBUaGUgdGhyZXNob2xkcyBtZWFzdXJlIFJYIEZJRk8gb2NjdXBhbmN5IGluIHVuaXRzIG9mIDY0IGJ5dGVzLgorICovCisjZGVmaW5lIFJYRE1BX1BUSFJFU0hfT0ZGCTB4MDAwMDAxZmYJLyogWE9GRiBlbWl0dGVkIHcvRklGTyA+IHRoaXMJKi8KKyNkZWZpbmUgUlhETUFfUFRIUkVTSF9PTgkweDAwMWZmMDAwCS8qIFhPTiBlbWl0dGVkIHcvRklGTyA8IHRoaXMJKi8KKworLyogUlggS2ljayBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIDEzLWJpdCByZWdpc3RlciBpcyB3cml0dGVuIGJ5IHRoZSBob3N0IENQVSBhbmQgaG9sZHMgdGhlIGxhc3QKKyAqIHZhbGlkIFJYIGRlc2NyaXB0b3IgbnVtYmVyIHBsdXMgb25lLiAgVGhpcyBpcywgaWYgJ04nIGlzIHdyaXR0ZW4gdG8KKyAqIHRoaXMgcmVnaXN0ZXIsIGl0IG1lYW5zIHRoYXQgYWxsIFJYIGRlc2NyaXB0b3JzIHVwIHRvIGJ1dCBleGNsdWRpbmcKKyAqICdOJyBhcmUgdmFsaWQuCisgKgorICogVGhlIGhhcmR3YXJlIHJlcXVpcmVzIHRoYXQgUlggZGVzY3JpcHRvcnMgYXJlIHBvc3RlZCBpbiBpbmNyZW1lbnRzCisgKiBvZiA0LiAgVGhpcyBtZWFucyAnTicgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIuICBGb3IgdGhlIGJlc3QKKyAqIHBlcmZvcm1hbmNlLCB0aGUgZmlyc3QgbmV3IGRlc2NyaXB0b3IgYmVpbmcgcG9zdGVkIHNob3VsZCBiZSAoUENJKQorICogY2FjaGUgbGluZSBhbGlnbmVkLgorICovCisKKy8qIFJYIENvbXBsZXRpb24gUmVnaXN0ZXIuCisgKgorICogVGhpcyAxMy1iaXQgcmVnaXN0ZXIgaXMgdXBkYXRlZCBieSBHRU0gdG8gaW5kaWNhdGUgd2hpY2ggUlggZGVzY3JpcHRvcnMKKyAqIGhhdmUgYWxyZWFkeSBiZWVuIHVzZWQgZm9yIHJlY2VpdmUgZnJhbWVzLiAgQWxsIGRlc2NyaXB0b3JzIHVwIHRvIGJ1dAorICogZXhjbHVkaW5nIHRoZSB2YWx1ZSBpbiB0aGlzIHJlZ2lzdGVyIGFyZSByZWFkeSB0byBiZSBwcm9jZXNzZWQuICBHRU0KKyAqIHVwZGF0ZXMgdGhpcyByZWdpc3RlciB2YWx1ZSBhZnRlciB0aGUgUlggRklGTyBlbXB0aWVzIGNvbXBsZXRlbHkgaW50bworICogdGhlIFJYIGRlc2NyaXB0b3IncyBidWZmZXIsIGJ1dCBiZWZvcmUgdGhlIFJYX0RPTkUgYml0IGlzIHNldCBpbiB0aGUKKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKworLyogUlggQmxhbmtpbmcgUmVnaXN0ZXIuICovCisjZGVmaW5lIFJYRE1BX0JMQU5LX0lQS1RTCTB4MDAwMDAxZmYJLyogUlhfRE9ORSBhc3NlcnRlZCBhZnRlciB0aGlzCisJCQkJCQkgKiBtYW55IHBhY2tldHMgcmVjZWl2ZWQgc2luY2UKKwkJCQkJCSAqIHByZXZpb3VzIFJYX0RPTkUuCisJCQkJCQkgKi8KKyNkZWZpbmUgUlhETUFfQkxBTktfSVRJTUUJMHgwMDBmZjAwMAkvKiBSWF9ET05FIGFzc2VydGVkIGFmdGVyIHRoaXMKKwkJCQkJCSAqIG1hbnkgY2xvY2tzIChtZWFzdXJlZCBpbiAyMDQ4CisJCQkJCQkgKiBQQ0kgY2xvY2tzKSB3ZXJlIGNvdW50ZWQgc2luY2UKKwkJCQkJCSAqIHRoZSBwcmV2aW91cyBSWF9ET05FLgorCQkJCQkJICovCisKKy8qIFJYIEZJRk8gU2l6ZS4KKyAqCisgKiBUaGlzIDExLWJpdCByZWFkLW9ubHkgcmVnaXN0ZXIgaW5kaWNhdGVzIGhvdyBsYXJnZSwgaW4gdW5pdHMgb2YgNjQtYnl0ZXMsCisgKiB0aGUgUlggRklGTyBpcy4gIFRoZSBkcml2ZXIgdXNlcyB0aGlzIHRvIHByb3Blcmx5IGNvbmZpZ3VyZSB0aGUgUlggUEFVU0UKKyAqIHRocmVzaG9sZHMuCisgKi8KKworLyogVGhlIHJlc3Qgb2YgdGhlIFJYRE1BXyogcmVnaXN0ZXJzIGFyZSBmb3IgZGlhZ25vc3RpY3MgYW5kIGRlYnVnLCBJIHdpbGwgZG9jdW1lbnQKKyAqIHRoZW0gbGF0ZXIuIC1EYXZlTQorICovCisKKy8qIE1BQyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFDX1RYUlNUCTB4NjAwMFVMCS8qIFRYIE1BQyBTb2Z0d2FyZSBSZXNldCBDb21tYW5kKi8KKyNkZWZpbmUgTUFDX1JYUlNUCTB4NjAwNFVMCS8qIFJYIE1BQyBTb2Z0d2FyZSBSZXNldCBDb21tYW5kKi8KKyNkZWZpbmUgTUFDX1NORFBBVVNFCTB4NjAwOFVMCS8qIFNlbmQgUGF1c2UgQ29tbWFuZCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfVFhTVEFUCTB4NjAxMFVMCS8qIFRYIE1BQyBTdGF0dXMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVAkweDYwMTRVTAkvKiBSWCBNQUMgU3RhdHVzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19DU1RBVAkweDYwMThVTAkvKiBNQUMgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1RYTUFTSwkweDYwMjBVTAkvKiBUWCBNQUMgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUFDX1JYTUFTSwkweDYwMjRVTAkvKiBSWCBNQUMgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUFDX01DTUFTSwkweDYwMjhVTAkvKiBNQUMgQ29udHJvbCBNYXNrIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19UWENGRwkweDYwMzBVTAkvKiBUWCBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciovCisjZGVmaW5lIE1BQ19SWENGRwkweDYwMzRVTAkvKiBSWCBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciovCisjZGVmaW5lIE1BQ19NQ0NGRwkweDYwMzhVTAkvKiBNQUMgQ29udHJvbCBDb25maWcgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1hJRkNGRwkweDYwM0NVTAkvKiBYSUYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSVBHMAkweDYwNDBVTAkvKiBJbnRlclBhY2tldEdhcDAgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0lQRzEJMHg2MDQ0VUwJLyogSW50ZXJQYWNrZXRHYXAxIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19JUEcyCTB4NjA0OFVMCS8qIEludGVyUGFja2V0R2FwMiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfU1RJTUUJMHg2MDRDVUwJLyogU2xvdFRpbWUgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1BQ19NSU5GU1oJMHg2MDUwVUwJLyogTWluRnJhbWVTaXplIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19NQVhGU1oJMHg2MDU0VUwJLyogTWF4RnJhbWVTaXplIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19QQVNJWkUJMHg2MDU4VUwJLyogUEEgU2l6ZSBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUFDX0pBTVNJWkUJMHg2MDVDVUwJLyogSmFtU2l6ZSBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUFDX0FUVExJTQkweDYwNjBVTAkvKiBBdHRlbXB0IExpbWl0IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19NQ1RZUEUJMHg2MDY0VUwJLyogTUFDIENvbnRyb2wgVHlwZSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjAJMHg2MDgwVUwJLyogTUFDIEFkZHJlc3MgMCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjEJMHg2MDg0VUwJLyogTUFDIEFkZHJlc3MgMSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjIJMHg2MDg4VUwJLyogTUFDIEFkZHJlc3MgMiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjMJMHg2MDhDVUwJLyogTUFDIEFkZHJlc3MgMyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjQJMHg2MDkwVUwJLyogTUFDIEFkZHJlc3MgNCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjUJMHg2MDk0VUwJLyogTUFDIEFkZHJlc3MgNSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjYJMHg2MDk4VUwJLyogTUFDIEFkZHJlc3MgNiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjcJMHg2MDlDVUwJLyogTUFDIEFkZHJlc3MgNyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUREUjgJMHg2MEEwVUwJLyogTUFDIEFkZHJlc3MgOCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUZJTFQwCTB4NjBBNFVMCS8qIEFkZHJlc3MgRmlsdGVyIDAgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FGSUxUMQkweDYwQThVTAkvKiBBZGRyZXNzIEZpbHRlciAxIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRklMVDIJMHg2MEFDVUwJLyogQWRkcmVzcyBGaWx0ZXIgMiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUYyMU1TSwkweDYwQjBVTAkvKiBBZGRyZXNzIEZpbHRlciAyJjEgTWFzayBSZWcJKi8KKyNkZWZpbmUgTUFDX0FGME1TSwkweDYwQjRVTAkvKiBBZGRyZXNzIEZpbHRlciAwIE1hc2sgUmVnCSovCisjZGVmaW5lIE1BQ19IQVNIMAkweDYwQzBVTAkvKiBIYXNoIFRhYmxlIDAgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxCTB4NjBDNFVMCS8qIEhhc2ggVGFibGUgMSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDIJMHg2MEM4VUwJLyogSGFzaCBUYWJsZSAyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMwkweDYwQ0NVTAkvKiBIYXNoIFRhYmxlIDMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g0CTB4NjBEMFVMCS8qIEhhc2ggVGFibGUgNCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDUJMHg2MEQ0VUwJLyogSGFzaCBUYWJsZSA1IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNINgkweDYwRDhVTAkvKiBIYXNoIFRhYmxlIDYgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g3CTB4NjBEQ1VMCS8qIEhhc2ggVGFibGUgNyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDgJMHg2MEUwVUwJLyogSGFzaCBUYWJsZSA4IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIOQkweDYwRTRVTAkvKiBIYXNoIFRhYmxlIDkgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxMAkweDYwRThVTAkvKiBIYXNoIFRhYmxlIDEwIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTEJMHg2MEVDVUwJLyogSGFzaCBUYWJsZSAxMSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDEyCTB4NjBGMFVMCS8qIEhhc2ggVGFibGUgMTIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxMwkweDYwRjRVTAkvKiBIYXNoIFRhYmxlIDEzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTQJMHg2MEY4VUwJLyogSGFzaCBUYWJsZSAxNCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDE1CTB4NjBGQ1VMCS8qIEhhc2ggVGFibGUgMTUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX05DT0xMCTB4NjEwMFVMCS8qIE5vcm1hbCBDb2xsaXNpb24gQ291bnRlcgkqLworI2RlZmluZSBNQUNfRkFTVUNDCTB4NjEwNFVMCS8qIEZpcnN0IEF0dG1wdC4gU3VjYyBDb2xsIEN0ci4JKi8KKyNkZWZpbmUgTUFDX0VDT0xMCTB4NjEwOFVMCS8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnRlcgkqLworI2RlZmluZSBNQUNfTENPTEwJMHg2MTBDVUwJLyogTGF0ZSBDb2xsaXNpb24gQ291bnRlcgkqLworI2RlZmluZSBNQUNfRFRJTUVSCTB4NjExMFVMCS8qIERlZmVyIFRpbWVyCQkJKi8KKyNkZWZpbmUgTUFDX1BBVE1QUwkweDYxMTRVTAkvKiBQZWFrIEF0dGVtcHRzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19SRkNUUgkweDYxMThVTAkvKiBSZWNlaXZlIEZyYW1lIENvdW50ZXIJKi8KKyNkZWZpbmUgTUFDX0xFUlIJMHg2MTFDVUwJLyogTGVuZ3RoIEVycm9yIENvdW50ZXIJCSovCisjZGVmaW5lIE1BQ19BRVJSCTB4NjEyMFVMCS8qIEFsaWdubWVudCBFcnJvciBDb3VudGVyCSovCisjZGVmaW5lIE1BQ19GQ1NFUlIJMHg2MTI0VUwJLyogRkNTIEVycm9yIENvdW50ZXIJCSovCisjZGVmaW5lIE1BQ19SWENWRVJSCTB4NjEyOFVMCS8qIFJYIGNvZGUgVmlvbGF0aW9uIEVycm9yIEN0cgkqLworI2RlZmluZSBNQUNfUkFORFNFRUQJMHg2MTMwVUwJLyogUmFuZG9tIE51bWJlciBTZWVkIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19TTUFDSElORQkweDYxMzRVTAkvKiBTdGF0ZSBNYWNoaW5lIFJlZ2lzdGVyCSovCisKKy8qIFRYIE1BQyBTb2Z0d2FyZSBSZXNldCBDb21tYW5kLiAqLworI2RlZmluZSBNQUNfVFhSU1RfQ01ECTB4MDAwMDAwMDEJLyogU3RhcnQgc3cgcmVzZXQsIHNlbGYtY2xlYXJzCSovCisKKy8qIFJYIE1BQyBTb2Z0d2FyZSBSZXNldCBDb21tYW5kLiAqLworI2RlZmluZSBNQUNfUlhSU1RfQ01ECTB4MDAwMDAwMDEJLyogU3RhcnQgc3cgcmVzZXQsIHNlbGYtY2xlYXJzCSovCisKKy8qIFNlbmQgUGF1c2UgQ29tbWFuZC4gKi8KKyNkZWZpbmUgTUFDX1NORFBBVVNFX1RTCTB4MDAwMGZmZmYJLyogVGhlIHBhdXNlX3RpbWUgb3BlcmFuZCB1c2VkIGluCisJCQkJCSAqIFNlbmRfUGF1c2UgYW5kIGZsb3ctY29udHJvbAorCQkJCQkgKiBoYW5kc2hha2VzLgorCQkJCQkgKi8KKyNkZWZpbmUgTUFDX1NORFBBVVNFX1NQCTB4MDAwMTAwMDAJLyogU2V0dGluZyB0aGlzIGJpdCBpbnN0cnVjdHMgdGhlIE1BQworCQkJCQkgKiB0byBzZW5kIGEgUGF1c2UgRmxvdyBDb250cm9sCisJCQkJCSAqIGZyYW1lIG9udG8gdGhlIG5ldHdvcmsuCisJCQkJCSAqLworCisvKiBUWCBNQUMgU3RhdHVzIFJlZ2lzdGVyLiAqLworI2RlZmluZSBNQUNfVFhTVEFUX1hNSVQJMHgwMDAwMDAwMQkvKiBGcmFtZSBUcmFuc21pdHRlZAkJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9VUlVOCTB4MDAwMDAwMDIJLyogVFggVW5kZXJydW4JCQkqLworI2RlZmluZSBNQUNfVFhTVEFUX01QRQkweDAwMDAwMDA0CS8qIE1heCBQYWNrZXQgU2l6ZSBFcnJvcgkqLworI2RlZmluZSBNQUNfVFhTVEFUX05DRQkweDAwMDAwMDA4CS8qIE5vcm1hbCBDb2xsaXNpb24gQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9FQ0UJMHgwMDAwMDAxMAkvKiBFeGNlc3MgQ29sbGlzaW9uIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfTENFCTB4MDAwMDAwMjAJLyogTGF0ZSBDb2xsaXNpb24gQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9GQ0UJMHgwMDAwMDA0MAkvKiBGaXJzdCBDb2xsaXNpb24gQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9EVEUJMHgwMDAwMDA4MAkvKiBEZWZlciBUaW1lciBFeHBpcmUJCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfUENFCTB4MDAwMDAxMDAJLyogUGVhayBBdHRlbXB0cyBDbnRyIEV4cGlyZQkqLworCisvKiBSWCBNQUMgU3RhdHVzIFJlZ2lzdGVyLiAqLworI2RlZmluZSBNQUNfUlhTVEFUX1JDVgkweDAwMDAwMDAxCS8qIEZyYW1lIFJlY2VpdmVkCQkqLworI2RlZmluZSBNQUNfUlhTVEFUX09GTFcJMHgwMDAwMDAwMgkvKiBSZWNlaXZlIE92ZXJmbG93CQkqLworI2RlZmluZSBNQUNfUlhTVEFUX0ZDRQkweDAwMDAwMDA0CS8qIEZyYW1lIENudHIgRXhwaXJlCQkqLworI2RlZmluZSBNQUNfUlhTVEFUX0FDRQkweDAwMDAwMDA4CS8qIEFsaWduIEVycm9yIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfQ0NFCTB4MDAwMDAwMTAJLyogQ1JDIEVycm9yIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfTENFCTB4MDAwMDAwMjAJLyogTGVuZ3RoIEVycm9yIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfVkNFCTB4MDAwMDAwNDAJLyogQ29kZSBWaW9sYXRpb24gQ250ciBFeHBpcmUJKi8KKworLyogTUFDIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyLiAqLworI2RlZmluZSBNQUNfQ1NUQVRfUFJDVgkweDAwMDAwMDAxCS8qIFBhdXNlIFJlY2VpdmVkCQkqLworI2RlZmluZSBNQUNfQ1NUQVRfUFMJMHgwMDAwMDAwMgkvKiBQYXVzZWQgU3RhdGUJCQkqLworI2RlZmluZSBNQUNfQ1NUQVRfTlBTCTB4MDAwMDAwMDQJLyogTm90IFBhdXNlZCBTdGF0ZQkJKi8KKyNkZWZpbmUgTUFDX0NTVEFUX1BUUgkweGZmZmYwMDAwCS8qIFBhdXNlIFRpbWUgUmVjZWl2ZWQJCSovCisKKy8qIFRoZSBsYXlvdXQgb2YgdGhlIE1BQ197VFgsUlgsQ31NQVNLIHJlZ2lzdGVycyBpcyBpZGVudGljYWwgdG8gdGhhdAorICogb2YgTUFDX3tUWCxSWCxDfVNUQVQuICBCaXRzIHNldCBpbiBNQUNfe1RYLFJYLEN9TUFTSyB3aWxsIHByZXZlbnQKKyAqIHRoYXQgaW50ZXJydXB0IHR5cGUgZnJvbSBiZWluZyBzaWduYWxsZWQgdG8gZnJvbnQgZW5kIG9mIEdFTS4gIEZvcgorICogdGhlIGludGVycnVwdCB0byBhY3R1YWxseSBnZXQgc2VudCB0byB0aGUgY3B1LCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAqIHByb3Blcmx5IHNldCB0aGUgYXBwcm9wcmlhdGUgR1JFR19JTUFTS197VFgsUlgsfU1BQyBiaXRzIGFzIHdlbGwuCisgKi8KKworLyogVFggTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogTk9URTogVGhlIFRYIE1BQyBFbmFibGUgYml0IG11c3QgYmUgY2xlYXJlZCBhbmQgcG9sbGVkIHVudGlsCisgKgkgemVybyBiZWZvcmUgYW55IG90aGVyIGJpdHMgaW4gdGhpcyByZWdpc3RlciBhcmUgY2hhbmdlZC4KKyAqCisgKgkgQWxzbywgZW5hYmxpbmcgdGhlIENhcnJpZXIgRXh0ZW5zaW9uIGZlYXR1cmUgb2YgR0VNIGlzCisgKgkgYSAzIHN0ZXAgcHJvY2VzcyAxKSBTZXQgVFggQ2FycmllciBFeHRlbnNpb24gMikgU2V0CisgKgkgUlggQ2FycmllciBFeHRlbnNpb24gMykgU2V0IFNsb3QgVGltZSB0byAweDIwMC4gIFRoaXMKKyAqCSBtb2RlIG11c3QgYmUgZW5hYmxlZCB3aGVuIGluIGhhbGYtZHVwbGV4IGF0IDFHYnBzLCBlbHNlCisgKgkgaXQgbXVzdCBiZSBkaXNhYmxlZC4KKyAqLworI2RlZmluZSBNQUNfVFhDRkdfRU5BQgkweDAwMDAwMDAxCS8qIFRYIE1BQyBFbmFibGUJCSovCisjZGVmaW5lIE1BQ19UWENGR19JQ1MJMHgwMDAwMDAwMgkvKiBJZ25vcmUgQ2FycmllciBTZW5zZQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX0lDT0xMCTB4MDAwMDAwMDQJLyogSWdub3JlIENvbGxpc2lvbnMJCSovCisjZGVmaW5lIE1BQ19UWENGR19FSVBHMAkweDAwMDAwMDA4CS8qIEVuYWJsZSBJUEcwCQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX05HVQkweDAwMDAwMDEwCS8qIE5ldmVyIEdpdmUgVXAJCSovCisjZGVmaW5lIE1BQ19UWENGR19OR1VMCTB4MDAwMDAwMjAJLyogTmV2ZXIgR2l2ZSBVcCBMaW1pdAkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX05CTwkweDAwMDAwMDQwCS8qIE5vIEJhY2tvZmYJCQkqLworI2RlZmluZSBNQUNfVFhDRkdfU0QJMHgwMDAwMDA4MAkvKiBTbG93IERvd24JCQkqLworI2RlZmluZSBNQUNfVFhDRkdfTkZDUwkweDAwMDAwMTAwCS8qIE5vIEZDUwkJCSovCisjZGVmaW5lIE1BQ19UWENGR19UQ0UJMHgwMDAwMDIwMAkvKiBUWCBDYXJyaWVyIEV4dGVuc2lvbgkJKi8KKworLyogUlggTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogTk9URTogVGhlIFJYIE1BQyBFbmFibGUgYml0IG11c3QgYmUgY2xlYXJlZCBhbmQgcG9sbGVkIHVudGlsCisgKgkgemVybyBiZWZvcmUgYW55IG90aGVyIGJpdHMgaW4gdGhpcyByZWdpc3RlciBhcmUgY2hhbmdlZC4KKyAqCisgKgkgU2ltaWxhciBydWxlcyBhcHBseSB0byB0aGUgSGFzaCBGaWx0ZXIgRW5hYmxlIGJpdCB3aGVuCisgKgkgcHJvZ3JhbW1pbmcgdGhlIGhhc2ggdGFibGUgcmVnaXN0ZXJzLCBhbmQgdGhlIEFkZHJlc3MgRmlsdGVyCisgKgkgRW5hYmxlIGJpdCB3aGVuIHByb2dyYW1taW5nIHRoZSBhZGRyZXNzIGZpbHRlciByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX0VOQUIJMHgwMDAwMDAwMQkvKiBSWCBNQUMgRW5hYmxlCQkqLworI2RlZmluZSBNQUNfUlhDRkdfU1BBRAkweDAwMDAwMDAyCS8qIFN0cmlwIFBhZAkJCSovCisjZGVmaW5lIE1BQ19SWENGR19TRkNTCTB4MDAwMDAwMDQJLyogU3RyaXAgRkNTCQkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX1BST00JMHgwMDAwMDAwOAkvKiBQcm9taXNjdW91cyBNb2RlCQkqLworI2RlZmluZSBNQUNfUlhDRkdfUEdSUAkweDAwMDAwMDEwCS8qIFByb21pc2N1b3VzIEdyb3VwCQkqLworI2RlZmluZSBNQUNfUlhDRkdfSEZFCTB4MDAwMDAwMjAJLyogSGFzaCBGaWx0ZXIgRW5hYmxlCQkqLworI2RlZmluZSBNQUNfUlhDRkdfQUZFCTB4MDAwMDAwNDAJLyogQWRkcmVzcyBGaWx0ZXIgRW5hYmxlCSovCisjZGVmaW5lIE1BQ19SWENGR19EREUJMHgwMDAwMDA4MAkvKiBEaXNhYmxlIERpc2NhcmQgb24gRXJyb3IJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX1JDRQkweDAwMDAwMTAwCS8qIFJYIENhcnJpZXIgRXh0ZW5zaW9uCQkqLworCisvKiBNQUMgQ29udHJvbCBDb25maWcgUmVnaXN0ZXIuICovCisjZGVmaW5lIE1BQ19NQ0NGR19TUEUJMHgwMDAwMDAwMQkvKiBTZW5kIFBhdXNlIEVuYWJsZQkJKi8KKyNkZWZpbmUgTUFDX01DQ0ZHX1JQRQkweDAwMDAwMDAyCS8qIFJlY2VpdmUgUGF1c2UgRW5hYmxlCQkqLworI2RlZmluZSBNQUNfTUNDRkdfUE1DCTB4MDAwMDAwMDQJLyogUGFzcyBNQUMgQ29udHJvbAkJKi8KKworLyogWElGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogTk9URTogV2hlbiBsZWF2aW5nIG9yIGVudGVyaW5nIGxvb3BiYWNrIG1vZGUsIGEgZ2xvYmFsIGhhcmR3YXJlCisgKiAgICAgICBpbml0IG9mIEdFTSBzaG91bGQgYmUgcGVyZm9ybWVkLgorICovCisjZGVmaW5lIE1BQ19YSUZDRkdfT0UJMHgwMDAwMDAwMQkvKiBNSUkgVFggT3V0cHV0IERyaXZlciBFbmFibGUJKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19MQkNLCTB4MDAwMDAwMDIJLyogTG9vcGJhY2sgVFggdG8gUlgJCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfRElTRQkweDAwMDAwMDA0CS8qIERpc2FibGUgUlggcGF0aCBkdXJpbmcgVFgJKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19HTUlJCTB4MDAwMDAwMDgJLyogVXNlIEdNSUkgY2xvY2tzICsgZGF0YXBhdGgJKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19NQk9FCTB4MDAwMDAwMTAJLyogQ29udHJvbHMgTUlJX0JVRl9FTiBwaW4JKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19MTEVECTB4MDAwMDAwMjAJLyogRm9yY2UgTElOS0xFRCMgYWN0aXZlIChsb3cpCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfRkxFRAkweDAwMDAwMDQwCS8qIEZvcmNlIEZEUExYTEVEIyBhY3RpdmUgKGxvdykJKi8KKworLyogSW50ZXJQYWNrZXRHYXAwIFJlZ2lzdGVyLiAgVGhpcyA4LWJpdCB2YWx1ZSBpcyB1c2VkIGFzIGFuIGV4dGVuc2lvbgorICogdG8gdGhlIEludGVyUGFja2V0R2FwMSBSZWdpc3Rlci4gIFNwZWNpZmljYWxseSBpdCBjb250cmlidXRlcyB0byB0aGUKKyAqIHRpbWluZyBvZiB0aGUgUlgtdG8tVFggSVBHLiAgVGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGFuZCBwcmVzdW1lZCB0bworICogYmUgemVybyBmb3IgVFgtdG8tVFggSVBHIGNhbGN1bGF0aW9ucyBhbmQvb3Igd2hlbiB0aGUgRW5hYmxlIElQRzAgYml0CisgKiBpcyBjbGVhcmVkIGluIHRoZSBUWCBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIHZhbHVlIGluIHRoaXMgcmVnaXN0ZXIgaW4gdGVybXMgb2YgbWVkaWEgYnl0ZSB0aW1lLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDAwCisgKi8KKworLyogSW50ZXJQYWNrZXRHYXAxIFJlZ2lzdGVyLiAgVGhpcyA4LWJpdCB2YWx1ZSBkZWZpbmVzIHRoZSBmaXJzdCAyLzMKKyAqIHBvcnRpb24gb2YgdGhlIEludGVyIFBhY2tldCBHYXAuCisgKgorICogVGhpcyB2YWx1ZSBpbiB0aGlzIHJlZ2lzdGVyIGluIHRlcm1zIG9mIG1lZGlhIGJ5dGUgdGltZS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgwOAorICovCisKKy8qIEludGVyUGFja2V0R2FwMiBSZWdpc3Rlci4gIFRoaXMgOC1iaXQgdmFsdWUgZGVmaW5lcyB0aGUgc2Vjb25kIDEvMworICogcG9ydGlvbiBvZiB0aGUgSW50ZXIgUGFja2V0IEdhcC4KKyAqCisgKiBUaGlzIHZhbHVlIGluIHRoaXMgcmVnaXN0ZXIgaW4gdGVybXMgb2YgbWVkaWEgYnl0ZSB0aW1lLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDA0CisgKi8KKworLyogU2xvdCBUaW1lIFJlZ2lzdGVyLiAgVGhpcyAxMC1iaXQgdmFsdWUgc3BlY2lmaWVzIHRoZSBzbG90IHRpbWUKKyAqIHBhcmFtZXRlciBpbiB1bml0cyBvZiBtZWRpYSBieXRlIHRpbWUuICBJdCBkZXRlcm1pbmVzIHRoZSBwaHlzaWNhbAorICogc3BhbiBvZiB0aGUgbmV0d29yay4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHg0MAorICovCisKKy8qIE1pbmltdW0gRnJhbWUgU2l6ZSBSZWdpc3Rlci4gIFRoaXMgMTAtYml0IHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUKKyAqIHNtYWxsZXN0IHNpemVkIGZyYW1lIHRoZSBUWE1BQyB3aWxsIHNlbmQgb250byB0aGUgbWVkaXVtLCBhbmQgdGhlCisgKiBSWE1BQyB3aWxsIHJlY2VpdmUgZnJvbSB0aGUgbWVkaXVtLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDQwCisgKi8KKworLyogTWF4aW11bSBGcmFtZSBhbmQgQnVyc3QgU2l6ZSBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIHJlZ2lzdGVyIHNwZWNpZmllcyB0d28gdGhpbmdzLiAgRmlyc3QgaXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtCisgKiBzaXplZCBmcmFtZSB0aGUgVFhNQUMgd2lsbCBzZW5kIGFuZCB0aGUgUlhNQUMgd2lsbCByZWNvZ25pemUgYXMKKyAqIHZhbGlkLiAgU2Vjb25kLCBpdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gcnVuIGxlbmd0aCBvZiBhIGJ1cnN0IG9mCisgKiBwYWNrZXRzIHNlbnQgaW4gaGFsZi1kdXBsZXggZ2lnYWJpdCBtb2Rlcy4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgyMDAwMDVlZQorICovCisjZGVmaW5lIE1BQ19NQVhGU1pfTUZTCTB4MDAwMDdmZmYJLyogTWF4IEZyYW1lIFNpemUJCSovCisjZGVmaW5lIE1BQ19NQVhGU1pfTUJTCTB4N2ZmZjAwMDAJLyogTWF4IEJ1cnN0IFNpemUJCSovCisKKy8qIFBBIFNpemUgUmVnaXN0ZXIuICBUaGlzIDEwLWJpdCByZWdpc3RlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwcmVhbWJsZQorICogYnl0ZXMgd2hpY2ggd2lsbCBiZSB0cmFuc21pdHRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUuICBBCisgKiB2YWx1ZSBvZiB0d28gb3IgZ3JlYXRlciBzaG91bGQgYmUgcHJvZ3JhbW1lZCBoZXJlLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDA3CisgKi8KKworLyogSmFtIFNpemUgUmVnaXN0ZXIuICBUaGlzIDQtYml0IHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUgZHVyYXRpb24gb2YKKyAqIHRoZSBqYW0gaW4gdW5pdHMgb2YgbWVkaWEgYnl0ZSB0aW1lLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDA0CisgKi8KKworLyogQXR0ZW1wdHMgTGltaXQgUmVnaXN0ZXIuICBUaGlzIDgtYml0IHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyCisgKiBvZiBhdHRlbXB0cyB0aGF0IHRoZSBUWE1BQyB3aWxsIG1ha2UgdG8gdHJhbnNtaXQgYSBmcmFtZSwgYmVmb3JlIGl0CisgKiByZXNldHMgaXRzIEF0dGVtcHRzIENvdW50ZXIuICBBZnRlciByZWFjaGluZyB0aGUgQXR0ZW1wdHMgTGltaXQgdGhlCisgKiBUWE1BQyBtYXkgb3IgbWF5IG5vdCBkcm9wIHRoZSBmcmFtZSwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgTkdVCisgKiAoTmV2ZXIgR2l2ZSBVcCkgYW5kIE5HVUwgKE5ldmVyIEdpdmUgVXAgTGltaXQpIGJpdHMgaW4gdGhlIFRYTUFDCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDEwCisgKi8KKworLyogTUFYIENvbnRyb2wgVHlwZSBSZWdpc3Rlci4gIFRoaXMgMTYtYml0IHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUKKyAqICJ0eXBlIiBmaWVsZCBvZiBhIE1BQyBDb250cm9sIGZyYW1lLiAgVGhlIFRYTUFDIHVzZXMgdGhpcyBmaWVsZCB0bworICogZW5jYXBzdWxhdGUgdGhlIE1BQyBDb250cm9sIGZyYW1lIGZvciB0cmFuc21pc3Npb24sIGFuZCB0aGUgUlhNQUMKKyAqIHVzZXMgaXQgZm9yIGRlY29kaW5nIHZhbGlkIE1BQyBDb250cm9sIGZyYW1lcyByZWNlaXZlZCBmcm9tIHRoZQorICogbmV0d29yay4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHg4ODA4CisgKi8KKworLyogTUFDIEFkZHJlc3MgUmVnaXN0ZXJzLiAgRWFjaCBvZiB0aGVzZSByZWdpc3RlcnMgc3BlY2lmeSB0aGUKKyAqIGV0aGVybmV0IE1BQyBvZiB0aGUgaW50ZXJmYWNlLCAxNi1iaXRzIGF0IGEgdGltZS4gIFJlZ2lzdGVyCisgKiAwIHNwZWNpZmllcyBiaXRzIFs0NzozMl0sIHJlZ2lzdGVyIDEgYml0cyBbMzE6MTZdLCBhbmQgcmVnaXN0ZXIKKyAqIDIgYml0cyBbMTU6MF0uCisgKgorICogUmVnaXN0ZXJzIDMgdGhyb3VnaCBhbmQgaW5jbHVkaW5nIDUgc3BlY2lmeSBhbiBhbHRlcm5hdGUKKyAqIE1BQyBhZGRyZXNzIGZvciB0aGUgaW50ZXJmYWNlLgorICoKKyAqIFJlZ2lzdGVycyA2IHRocm91Z2ggYW5kIGluY2x1ZGluZyA4IHNwZWNpZnkgdGhlIE1BQyBDb250cm9sCisgKiBBZGRyZXNzLCB3aGljaCBtdXN0IGJlIHRoZSByZXNlcnZlZCBtdWx0aWNhc3QgYWRkcmVzcyBmb3IgTUFDCisgKiBDb250cm9sIGZyYW1lcy4KKyAqCisgKiBFeGFtcGxlOiBUbyBwcm9ncmFtIHByaW1hcnkgc3RhdGlvbiBhZGRyZXNzIGE6YjpjOmQ6ZTpmIGludG8KKyAqCSAgICB0aGUgY2hpcC4KKyAqCQlNQUNfQWRkcmVzc18yID0gKGEgPDwgOCkgfCBiCisgKgkJTUFDX0FkZHJlc3NfMSA9IChjIDw8IDgpIHwgZAorICoJCU1BQ19BZGRyZXNzXzAgPSAoZSA8PCA4KSB8IGYKKyAqLworCisvKiBBZGRyZXNzIEZpbHRlciBSZWdpc3RlcnMuICBSZWdpc3RlcnMgMCB0aHJvdWdoIDIgc3BlY2lmeSBiaXQKKyAqIGZpZWxkcyBbNDc6MzJdIHRocm91Z2ggWzE1OjBdLCByZXNwZWN0aXZlbHksIG9mIHRoZSBhZGRyZXNzCisgKiBmaWx0ZXIuICBUaGUgQWRkcmVzcyBGaWx0ZXIgMiYxIE1hc2sgUmVnaXN0ZXIgZGVub3RlcyB0aGUgOC1iaXQKKyAqIG5pYmJsZSBtYXNrIGZvciBBZGRyZXNzIEZpbHRlciBSZWdpc3RlcnMgMiBhbmQgMS4gIFRoZSBBZGRyZXNzCisgKiBGaWx0ZXIgMCBNYXNrIFJlZ2lzdGVyIGRlbm90ZXMgdGhlIDE2LWJpdCBtYXNrIGZvciB0aGUgQWRkcmVzcworICogRmlsdGVyIFJlZ2lzdGVyIDAuCisgKi8KKworLyogSGFzaCBUYWJsZSBSZWdpc3RlcnMuICBSZWdpc3RlcnMgMCB0aHJvdWdoIDE1IHNwZWNpZnkgYml0IGZpZWxkcworICogWzI1NToyNDBdIHRocm91Z2ggWzE1OjBdLCByZXNwZWN0aXZlbHksIG9mIHRoZSBoYXNoIHRhYmxlLgorICovCisKKy8qIFN0YXRpc3RpY3MgUmVnaXN0ZXJzLiAgQWxsIG9mIHRoZXNlIHJlZ2lzdGVycyBhcmUgMTYtYml0cyBhbmQKKyAqIHRyYWNrIG9jY3VycmVuY2VzIG9mIGEgc3BlY2lmaWMgZXZlbnQuICBHRU0gY2FuIGJlIGNvbmZpZ3VyZWQKKyAqIHRvIGludGVycnVwdCB0aGUgaG9zdCBjcHUgd2hlbiBhbnkgb2YgdGhlc2UgY291bnRlcnMgb3ZlcmZsb3cuCisgKiBUaGV5IHNob3VsZCBhbGwgYmUgZXhwbGljaXRseSBpbml0aWFsaXplZCB0byB6ZXJvIHdoZW4gdGhlIGludGVyZmFjZQorICogaXMgYnJvdWdodCB1cC4KKyAqLworCisvKiBSYW5kb20gTnVtYmVyIFNlZWQgUmVnaXN0ZXIuICBUaGlzIDEwLWJpdCB2YWx1ZSBpcyB1c2VkIGFzIHRoZQorICogUk5HIHNlZWQgaW5zaWRlIEdFTSBmb3IgdGhlIENTTUEvQ0QgYmFja29mZiBhbGdvcml0aG0uICBJdCBpcworICogcmVjb21tZW5kZWQgdG8gcHJvZ3JhbSB0aGlzIHJlZ2lzdGVyIHRvIHRoZSAxMCBMU0Igb2YgdGhlCisgKiBpbnRlcmZhY2VzIE1BQyBhZGRyZXNzLgorICovCisKKy8qIFBhdXNlIFRpbWVyLCByZWFkLW9ubHkuICBUaGlzIDE2LWJpdCB0aW1lciBpcyB1c2VkIHRvIHRpbWUgdGhlIHBhdXNlCisgKiBpbnRlcnZhbCBhcyBpbmRpY2F0ZWQgYnkgYSByZWNlaXZlZCBwYXVzZSBmbG93IGNvbnRyb2wgZnJhbWUuCisgKiBBIG5vbi16ZXJvIHZhbHVlIGluIHRoaXMgdGltZXIgaW5kaWNhdGVzIHRoYXQgdGhlIE1BQyBpcyBjdXJyZW50bHkgaW4KKyAqIHRoZSBwYXVzZWQgc3RhdGUuCisgKi8KKworLyogTUlGIFJlZ2lzdGVycyAqLworI2RlZmluZSBNSUZfQkJDTEsJMHg2MjAwVUwJLyogTUlGIEJpdC1CYW5nIENsb2NrCQkqLworI2RlZmluZSBNSUZfQkJEQVRBCTB4NjIwNFVMCS8qIE1JRiBCaXQtQmFuZCBEYXRhCQkqLworI2RlZmluZSBNSUZfQkJPRU5BQgkweDYyMDhVTAkvKiBNSUYgQml0LUJhbmcgT3V0cHV0IEVuYWJsZQkqLworI2RlZmluZSBNSUZfRlJBTUUJMHg2MjBDVUwJLyogTUlGIEZyYW1lL091dHB1dCBSZWdpc3RlcgkqLworI2RlZmluZSBNSUZfQ0ZHCQkweDYyMTBVTAkvKiBNSUYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBNSUZfTUFTSwkweDYyMTRVTAkvKiBNSUYgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUlGX1NUQVRVUwkweDYyMThVTAkvKiBNSUYgU3RhdHVzIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNSUZfU01BQ0hJTkUJMHg2MjFDVUwJLyogTUlGIFN0YXRlIE1hY2hpbmUgUmVnaXN0ZXIJKi8KKworLyogTUlGIEJpdC1CYW5nIENsb2NrLiAgVGhpcyAxLWJpdCByZWdpc3RlciBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZQorICogTURDIGNsb2NrIHdhdmVmb3JtIG9uIHRoZSBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2Ugd2hlbiB0aGUgTUlGIGlzCisgKiBwcm9ncmFtbWVkIGluIHRoZSAiQml0LUJhbmciIG1vZGUuICBXcml0aW5nIGEgJzEnIGFmdGVyIGEgJzAnIGludG8KKyAqIHRoaXMgcmVnaXN0ZXIgd2lsbCBjcmVhdGUgYSByaXNpbmcgZWRnZSBvbiB0aGUgTURDLCB3aGlsZSB3cml0aW5nCisgKiBhICcwJyBhZnRlciBhICcxJyB3aWxsIGNyZWF0ZSBhIGZhbGxpbmcgZWRnZS4gIEZvciBldmVyeSBiaXQgdGhhdAorICogaXMgdHJhbnNmZXJyZWQgb24gdGhlIG1hbmFnZW1lbnQgaW50ZXJmYWNlLCBib3RoIGVkZ2VzIGhhdmUgdG8gYmUKKyAqIGdlbmVyYXRlZC4KKyAqLworCisvKiBNSUYgQml0LUJhbmcgRGF0YS4gIFRoaXMgMS1iaXQgcmVnaXN0ZXIgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUKKyAqIG91dGdvaW5nIGRhdGEgKE1ETykgb24gdGhlIE1JSSBNYW5hZ2VtZW50IEludGVyZmFjZSB3aGVuIHRoZSBNSUYKKyAqIGlzIHByb2dyYW1tZWQgaW4gdGhlICJCaXQtQmFuZyIgbW9kZS4gIFRoZSBkYWEgd2lsbCBiZSBzdGVlcmVkIHRvIHRoZQorICogYXBwcm9wcmlhdGUgTURJTyBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIFBIWV9TZWxlY3QgYml0IGluIHRoZSBNSUYKKyAqIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKi8KKworLyogTUlGIEJpZy1CYW5kIE91dHB1dCBFbmFibGUuICBUSGlzIDEtYml0IHJlZ2lzdGVyIGlzIHVzZWQgdG8gZW5hYmxlCisgKiAoJzEnKSBvciBkaXNhYmxlICgnMCcpIHRoZSBJLWRpcmVjdGlvbmFsIGRyaXZlciBvbiB0aGUgTUlJIHdoZW4gdGhlCisgKiBNSUYgaXMgcHJvZ3JhbW1lZCBpbiB0aGUgIkJpdC1CYW5nIiBtb2RlLiAgVGhlIE1ESU8gc2hvdWxkIGJlIGVuYWJsZWQKKyAqIHdoZW4gZGF0YSBiaXRzIGFyZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBNSUYgdG8gdGhlIHRyYW5zY2VpdmVyLCBhbmQgaXQKKyAqIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgaWRsZSBvciB3aGVuIGRhdGEgYml0cyBhcmUKKyAqIHRyYW5zZmVycmVkIGZyb20gdGhlIHRyYW5zY2VpdmVyIHRvIHRoZSBNSUYgKGRhdGEgcG9ydGlvbiBvZiBhIHJlYWQKKyAqIGluc3RydWN0aW9uKS4gIE9ubHkgb25lIE1ESU8gd2lsbCBiZSBlbmFibGVkIGF0IGEgZ2l2ZW4gdGltZSwgZGVwZW5kaW5nCisgKiBvbiB0aGUgc3RhdGUgb2YgdGhlIFBIWV9TZWxlY3QgYml0IGluIHRoZSBNSUYgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqLworCisvKiBNSUYgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4gIFRoaXMgMTUtYml0IHJlZ2lzdGVyIGNvbnRyb2xzIHRoZSBvcGVyYXRpb24KKyAqIG9mIHRoZSBNSUYuCisgKi8KKyNkZWZpbmUgTUlGX0NGR19QU0VMRUNUCTB4MDAwMDAwMDEJLyogWGN2ciBzbGN0OiAwPW1kaW8wIDE9bWRpbzEJKi8KKyNkZWZpbmUgTUlGX0NGR19QT0xMCTB4MDAwMDAwMDIJLyogRW5hYmxlIHBvbGxpbmcgbWVjaGFuaXNtCSovCisjZGVmaW5lIE1JRl9DRkdfQkJNT0RFCTB4MDAwMDAwMDQJLyogMT1iaXQtYmFuZyAwPWZyYW1lIG1vZGUJKi8KKyNkZWZpbmUgTUlGX0NGR19QUkFERFIJMHgwMDAwMDBmOAkvKiBYY3ZyIHBvbGwgcmVnaXN0ZXIgYWRkcmVzcwkqLworI2RlZmluZSBNSUZfQ0ZHX01ESTAJMHgwMDAwMDEwMAkvKiBNRElPXzAgcHJlc2VudCBvciByZWFkLWJpdAkqLworI2RlZmluZSBNSUZfQ0ZHX01ESTEJMHgwMDAwMDIwMAkvKiBNRElPXzEgcHJlc2VudCBvciByZWFkLWJpdAkqLworI2RlZmluZSBNSUZfQ0ZHX1BQQUREUgkweDAwMDA3YzAwCS8qIFhjdnIgcG9sbCBQSFkgYWRkcmVzcwkqLworCisvKiBNSUYgRnJhbWUvT3V0cHV0IFJlZ2lzdGVyLiAgVGhpcyAzMi1iaXQgcmVnaXN0ZXIgYWxsb3dzIHRoZSBob3N0IHRvCisgKiBjb21tdW5pY2F0ZSB3aXRoIGEgdHJhbnNjZWl2ZXIgaW4gZnJhbWUgbW9kZSAoYXMgb3Bwb3NlZCB0byBiaWctYmFuZworICogbW9kZSkuICBXcml0ZXMgYnkgdGhlIGhvc3Qgc3BlY2lmeSBhbiBpbnN0cnV0aW9uLiAgQWZ0ZXIgYmVpbmcgaXNzdWVkCisgKiB0aGUgaG9zdCBtdXN0IHBvbGwgdGhpcyByZWdpc3RlciBmb3IgY29tcGxldGlvbi4gIEFsc28sIGFmdGVyCisgKiBjb21wbGV0aW9uIHRoaXMgcmVnaXN0ZXIgaG9sZHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHRyYW5zY2VpdmVyCisgKiBpZiBhcHBsaWNhYmxlLgorICovCisjZGVmaW5lIE1JRl9GUkFNRV9TVAkweGMwMDAwMDAwCS8qIFNUYXJ0IG9mIGZyYW1lCQkqLworI2RlZmluZSBNSUZfRlJBTUVfT1AJMHgzMDAwMDAwMAkvKiBPUGNvZGUJCQkqLworI2RlZmluZSBNSUZfRlJBTUVfUEhZQUQJMHgwZjgwMDAwMAkvKiBQSFkgQURkcmVzcwkJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9SRUdBRAkweDAwN2MwMDAwCS8qIFJFR2lzdGVyIEFEZHJlc3MJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9UQU1TQgkweDAwMDIwMDAwCS8qIFR1cm4gQXJvdW5kIE1TQgkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX1RBTFNCCTB4MDAwMTAwMDAJLyogVHVybiBBcm91bmQgTFNCCQkqLworI2RlZmluZSBNSUZfRlJBTUVfREFUQQkweDAwMDBmZmZmCS8qIEluc3RydWN0aW9uIFBheWxvYWQJCSovCisKKy8qIE1JRiBTdGF0dXMgUmVnaXN0ZXIuICBUaGlzIHJlZ2lzdGVyIHJlcG9ydHMgc3RhdHVzIHdoZW4gdGhlIE1JRiBpcworICogb3BlcmF0aW5nIGluIHRoZSBwb2xsIG1vZGUuICBUaGUgcG9sbCBzdGF0dXMgZmllbGQgaXMgYXV0by1jbGVhcmluZworICogb24gcmVhZC4KKyAqLworI2RlZmluZSBNSUZfU1RBVFVTX0RBVEEJMHhmZmZmMDAwMAkvKiBMaXZlIGltYWdlIG9mIFhDVlIgcmVnCSovCisjZGVmaW5lIE1JRl9TVEFUVVNfU1RBVAkweDAwMDBmZmZmCS8qIFdoaWNoIGJpdHMgaGF2ZSBjaGFuZ2VkCSovCisKKy8qIE1JRiBNYXNrIFJlZ2lzdGVyLiAgVGhpcyAxNi1iaXQgcmVnaXN0ZXIgaXMgdXNlZCB3aGVuIGluIHBvbGwgbW9kZQorICogdG8gc2F5IHdoaWNoIGJpdHMgb2YgdGhlIHBvbGxlZCByZWdpc3RlciB3aWxsIGNhdXNlIGFuIGludGVycnVwdAorICogd2hlbiBjaGFuZ2VkLgorICovCisKKy8qIFBDUy9TZXJpYWxpbmsgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBDU19NSUlDVFJMCTB4OTAwMFVMCS8qIFBDUyBNSUkgQ29udHJvbCBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfTUlJU1RBVAkweDkwMDRVTAkvKiBQQ1MgTUlJIFN0YXR1cyBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfTUlJQURWCTB4OTAwOFVMCS8qIFBDUyBNSUkgQWR2ZXJ0aXNlbWVudCBSZWcJKi8KKyNkZWZpbmUgUENTX01JSUxQCTB4OTAwQ1VMCS8qIFBDUyBNSUkgTGluayBQYXJ0bmVyIEFiaWxpdHkJKi8KKyNkZWZpbmUgUENTX0NGRwkJMHg5MDEwVUwJLyogUENTIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX1NNQUNISU5FCTB4OTAxNFVMCS8qIFBDUyBTdGF0ZSBNYWNoaW5lIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19JU1RBVAkweDkwMThVTAkvKiBQQ1MgSW50ZXJydXB0IFN0YXR1cyBSZWcJKi8KKyNkZWZpbmUgUENTX0RNT0RFCTB4OTA1MFVMCS8qIERhdGFwYXRoIE1vZGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX1NDVFJMCTB4OTA1NFVMCS8qIFNlcmlhbGluayBDb250cm9sIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19TT1MJCTB4OTA1OFVMCS8qIFNoYXJlZCBPdXRwdXQgU2VsZWN0IFJlZwkqLworI2RlZmluZSBQQ1NfU1NUQVRFCTB4OTA1Q1VMCS8qIFNlcmlhbGluayBTdGF0ZSBSZWdpc3RlcgkqLworCisvKiBQQ0QgTUlJIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIFBDU19NSUlDVFJMX1NQRAkweDAwMDAwMDQwCS8qIFJlYWQgYXMgb25lLCB3cml0ZXMgaWdub3JlZAkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9DVAkweDAwMDAwMDgwCS8qIEZvcmNlIENPTCBzaWduYWwgYWN0aXZlCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX0RNCTB4MDAwMDAxMDAJLyogRHVwbGV4IG1vZGUsIGZvcmNlZCBsb3cJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfUkFOCTB4MDAwMDAyMDAJLyogUmVzdGFydCBhdXRvLW5lZywgc2VsZiBjbGVhcgkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9JU08JMHgwMDAwMDQwMAkvKiBSZWFkIGFzIHplcm8sIHdyaXRlcyBpZ25vcmVkCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX1BECTB4MDAwMDA4MDAJLyogUmVhZCBhcyB6ZXJvLCB3cml0ZXMgaWdub3JlZAkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9BTkUJMHgwMDAwMTAwMAkvKiBBdXRvLW5lZyBlbmFibGUJCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX1NTCTB4MDAwMDIwMDAJLyogUmVhZCBhcyB6ZXJvLCB3cml0ZXMgaWdub3JlZAkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9XQgkweDAwMDA0MDAwCS8qIFdyYXBiYWNrLCBsb29wYmFjayBhdCAxMC1iaXQKKwkJCQkJICogaW5wdXQgc2lkZSBvZiBTZXJpYWxpbmsKKwkJCQkJICovCisjZGVmaW5lIFBDU19NSUlDVFJMX1JTVAkweDAwMDA4MDAwCS8qIFJlc2V0cyBQQ1MsIHNlbGYgY2xlYXJpbmcJKi8KKworLyogUENTIE1JSSBTdGF0dXMgUmVnaXN0ZXIuICovCisjZGVmaW5lIFBDU19NSUlTVEFUX0VDCTB4MDAwMDAwMDEJLyogRXh0IENhcGFiaWxpdHk6IFJlYWQgYXMgemVybwkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9KRAkweDAwMDAwMDAyCS8qIEphYmJlciBEZXRlY3Q6IFJlYWQgYXMgemVybwkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9MUwkweDAwMDAwMDA0CS8qIExpbmsgU3RhdHVzOiAxPXVwIDA9ZG93bgkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9BTkEJMHgwMDAwMDAwOAkvKiBBdXRvLW5lZyBBYmlsaXR5LCBhbHdheXMgMQkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9SRgkweDAwMDAwMDEwCS8qIFJlbW90ZSBGYXVsdAkJCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX0FOQwkweDAwMDAwMDIwCS8qIEF1dG8tbmVnIGNvbXBsZXRlCQkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9FUwkweDAwMDAwMTAwCS8qIEV4dGVuZGVkIFN0YXR1cywgYWx3YXlzIDEJKi8KKworLyogUENTIE1JSSBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyLiAqLworI2RlZmluZSBQQ1NfTUlJQURWX0ZECTB4MDAwMDAwMjAJLyogQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4CSovCisjZGVmaW5lIFBDU19NSUlBRFZfSEQJMHgwMDAwMDA0MAkvKiBBZHZlcnRpc2UgSGFsZiBEdXBsZXgJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9TUAkweDAwMDAwMDgwCS8qIEFkdmVydGlzZSBTeW1tZXRyaWMgUGF1c2UJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9BUAkweDAwMDAwMTAwCS8qIEFkdmVydGlzZSBBc3ltbWV0cmljIFBhdXNlCSovCisjZGVmaW5lIFBDU19NSUlBRFZfUkYJMHgwMDAwMzAwMAkvKiBSZW1vdGUgRmF1bHQJCQkqLworI2RlZmluZSBQQ1NfTUlJQURWX0FDSwkweDAwMDA0MDAwCS8qIFJlYWQtb25seQkJCSovCisjZGVmaW5lIFBDU19NSUlBRFZfTlAJMHgwMDAwODAwMAkvKiBOZXh0LXBhZ2UsIGZvcmNlZCBsb3cJKi8KKworLyogUENTIE1JSSBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWdpc3Rlci4gICBUaGlzIHJlZ2lzdGVyIGlzIGVxdWl2YWxlbnQKKyAqIHRvIHRoZSBMaW5rIFBhcnRuZXQgQWJpbGl0eSBSZWdpc3RlciBvZiB0aGUgc3RhbmRhcmQgTUlJIHJlZ2lzdGVyIHNldC4KKyAqIEl0J3MgbGF5b3V0IGNvcnJlc3BvbmRzIHRvIHRoZSBQQ1MgTUlJIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIuCisgKi8KKworLyogUENTIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCisjZGVmaW5lIFBDU19DRkdfRU5BQkxFCTB4MDAwMDAwMDEJLyogTXVzdCBiZSB6ZXJvIHdoaWxlIGNoYW5naW5nCisJCQkJCSAqIFBDUyBNSUkgYWR2ZXJ0aXNlbWVudCByZWcuCisJCQkJCSAqLworI2RlZmluZSBQQ1NfQ0ZHX1NETwkweDAwMDAwMDAyCS8qIFNpZ25hbCBkZXRlY3Qgb3ZlcnJpZGUJKi8KKyNkZWZpbmUgUENTX0NGR19TREwJMHgwMDAwMDAwNAkvKiBTaWduYWwgZGV0ZWN0IGFjdGl2ZSBsb3cJKi8KKyNkZWZpbmUgUENTX0NGR19KUwkweDAwMDAwMDE4CS8qIEppdHRlci1zdHVkeToKKwkJCQkJICogMCA9IG5vcm1hbCBvcGVyYXRpb24KKwkJCQkJICogMSA9IGhpZ2gtZnJlcXVlbmN5IHRlc3QgcGF0dGVybgorCQkJCQkgKiAyID0gbG93LWZyZXF1ZW5jeSB0ZXN0IHBhdHRlcm4KKwkJCQkJICogMyA9IHJlc2VydmVkCisJCQkJCSAqLworI2RlZmluZSBQQ1NfQ0ZHX1RPCTB4MDAwMDAwMjAJLyogMTBtcyBhdXRvLW5lZyB0aW1lciBvdmVycmlkZQkqLworCisvKiBQQ1MgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3Rlci4gIFRoaXMgcmVnaXN0ZXIgaXMgc2VsZi1jbGVhcmluZworICogd2hlbiByZWFkLgorICovCisjZGVmaW5lIFBDU19JU1RBVF9MU0MJMHgwMDAwMDAwNAkvKiBMaW5rIFN0YXR1cyBDaGFuZ2UJCSovCisKKy8qIERhdGFwYXRoIE1vZGUgUmVnaXN0ZXIuICovCisjZGVmaW5lIFBDU19ETU9ERV9TTQkweDAwMDAwMDAxCS8qIDEgPSB1c2UgaW50ZXJuYWwgU2VyaWFsaW5rCSovCisjZGVmaW5lIFBDU19ETU9ERV9FU00JMHgwMDAwMDAwMgkvKiBFeHRlcm5hbCBTRVJERVMgbW9kZQkJKi8KKyNkZWZpbmUgUENTX0RNT0RFX01HTQkweDAwMDAwMDA0CS8qIE1JSS9HTUlJIG1vZGUJCSovCisjZGVmaW5lIFBDU19ETU9ERV9HTU9FCTB4MDAwMDAwMDgJLyogR01JSSBPdXRwdXQgRW5hYmxlCQkqLworCisvKiBTZXJpYWxpbmsgQ29udHJvbCBSZWdpc3Rlci4KKyAqCisgKiBOT1RFOiBXaGVuIGluIFNFUkRFUyBtb2RlLCB0aGUgbG9vcGJhY2sgYml0IGhhcyBpbnZlcnNlIGxvZ2ljLgorICovCisjZGVmaW5lIFBDU19TQ1RSTF9MT09QCTB4MDAwMDAwMDEJLyogTG9vcGJhY2sgZW5hYmxlCQkqLworI2RlZmluZSBQQ1NfU0NUUkxfRVNDRAkweDAwMDAwMDAyCS8qIEVuYWJsZSBzeW5jIGNoYXIgZGV0ZWN0aW9uCSovCisjZGVmaW5lIFBDU19TQ1RSTF9MT0NLCTB4MDAwMDAwMDQJLyogTG9jayB0byByZWZlcmVuY2UgY2xvY2sJKi8KKyNkZWZpbmUgUENTX1NDVFJMX0VNUAkweDAwMDAwMDE4CS8qIE91dHB1dCBkcml2ZXIgZW1waGFzaXMJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1NURVNUCTB4MDAwMDAxYzAJLyogU2VsZiB0ZXN0IHBhdHRlcm5zCQkqLworI2RlZmluZSBQQ1NfU0NUUkxfUERXTgkweDAwMDAwMjAwCS8qIFNvZnR3YXJlIHBvd2VyLWRvd24JCSovCisjZGVmaW5lIFBDU19TQ1RSTF9SWFoJMHgwMDAwMGMwMAkvKiBQTEwgaW5wdXQgdG8gU2VyaWFsaW5rCSovCisjZGVmaW5lIFBDU19TQ1RSTF9SWFAJMHgwMDAwMzAwMAkvKiBQTEwgaW5wdXQgdG8gU2VyaWFsaW5rCSovCisjZGVmaW5lIFBDU19TQ1RSTF9UWFoJMHgwMDAwYzAwMAkvKiBQTEwgaW5wdXQgdG8gU2VyaWFsaW5rCSovCisjZGVmaW5lIFBDU19TQ1RSTF9UWFAJMHgwMDAzMDAwMAkvKiBQTEwgaW5wdXQgdG8gU2VyaWFsaW5rCSovCisKKy8qIFNoYXJlZCBPdXRwdXQgU2VsZWN0IFJlZ2lzdGVyLiAgRm9yIHRlc3QgYW5kIGRlYnVnLCBhbGxvd3MgbXVsdGlwbGV4aW5nCisgKiB0ZXN0IG91dHB1dHMgaW50byB0aGUgUFJPTSBhZGRyZXNzIHBpbnMuICBTZXQgdG8gemVybyBmb3Igbm9ybWFsCisgKiBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgUENTX1NPU19QQUREUgkweDAwMDAwMDAzCS8qIFBST00gQWRkcmVzcwkJCSovCisKKy8qIFBST00gSW1hZ2UgU3BhY2UgKi8KKyNkZWZpbmUgUFJPTV9TVEFSVAkweDEwMDAwMFVMCS8qIEV4cGFuc2lvbiBST00gcnVuIHRpbWUgYWNjZXNzKi8KKyNkZWZpbmUgUFJPTV9TSVpFCTB4MGZmZmZmVUwJLyogU2l6ZSBvZiBST00JCQkqLworI2RlZmluZSBQUk9NX0VORAkweDIwMDAwMFVMCS8qIEVuZCBvZiBST00JCQkqLworCisvKiBNSUkgZGVmaW5pdGlvbnMgbWlzc2luZyBmcm9tIG1paS5oICovCisKKyNkZWZpbmUgQk1DUl9TUEQyCTB4MDA0MAkJLyogR2lnYWJpdCBlbmFibGU/IChiY201NDExKQkqLworI2RlZmluZSBMUEFfUEFVU0UJMHgwNDAwCisKKy8qIE1vcmUgUEhZIHJlZ2lzdGVycyAoc3BlY2lmaWMgdG8gQnJvYWRjb20gbW9kZWxzKSAqLworCisvKiBNSUkgQkNNNTIwMSBNVUxUSVBIWSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTUyMDFfSU5URVJSVVBUCQkJMHgxQQorI2RlZmluZSBNSUlfQkNNNTIwMV9JTlRFUlJVUFRfSU5URU5BQkxFCQkweDQwMDAKKworI2RlZmluZSBNSUlfQkNNNTIwMV9BVVhNT0RFMgkJCTB4MUIKKyNkZWZpbmUgTUlJX0JDTTUyMDFfQVVYTU9ERTJfTE9XUE9XRVIJCTB4MDAwOAorCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZICAgICAgICAgICAgICAgICAgICAweDFFCisKKy8qIE1JSSBCQ001MjAxIE1VTFRJUEhZIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFlfU0VSSUFMTU9ERSAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TVVBFUklTT0xBVEUgICAgICAgMHgwMDA4CisKKy8qIE1JSSBCQ001NDAwIDEwMDAtQkFTRVQgQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MCQkJMHgwOQorI2RlZmluZSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MX0ZVTExEVVBMRVhDQVAJMHgwMjAwCisKKy8qIE1JSSBCQ001NDAwIEFVWENPTlRST0wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCAgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTF9QV1IxMEJBU0VUICAgICAgIDB4MDAwNAorCisvKiBNSUkgQkNNNTQwMCBBVVhTVEFUVVMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX01BU0sgICAgIDB4MDcwMAorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfU0hJRlQgICAgOCAgCisKKy8qIFdoZW4gaXQgY2FuLCBHRU0gaW50ZXJuYWxseSBjYWNoZXMgNCBhbGlnbmVkIFRYIGRlc2NyaXB0b3JzCisgKiBhdCBhIHRpbWUsIHNvIHRoYXQgaXQgY2FuIHVzZSBmdWxsIGNhY2hlbGluZSBETUEgcmVhZHMuCisgKgorICogTm90ZSB0aGF0IHVubGlrZSBITUUsIHRoZXJlIGlzIG5vIG93bmVyc2hpcCBiaXQgaW4gdGhlIGRlc2NyaXB0b3IKKyAqIGNvbnRyb2wgd29yZC4gIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgaXMgb2J0YWluZWQgdmlhIHRoZSBUWC1LaWNrCisgKiBhbmQgVFgtQ29tcGxldGUgcmVnaXN0ZXJzLiAgQXMgYSByZXN1bHQsIEdFTSBuZWVkIG5vdCB3cml0ZSBiYWNrCisgKiB1cGRhdGVkIHZhbHVlcyB0byB0aGUgVFggZGVzY3JpcHRvciByaW5nLCBpdCBvbmx5IHBlcmZvcm1zIHJlYWRzLgorICoKKyAqIFNpbmNlIFRYIGRlc2NyaXB0b3JzIGFyZSBuZXZlciBtb2RpZmllZCBieSBHRU0sIHRoZSBkcml2ZXIgY2FuCisgKiB1c2UgdGhlIGJ1ZmZlciBETUEgYWRkcmVzcyBhcyBhIHBsYWNlIHRvIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkCisgKiBETUEgbWFwcGluZ3MgZm9yIGEgdHJhbnNtaXR0ZWQgcGFja2V0LgorICovCitzdHJ1Y3QgZ2VtX3R4ZCB7CisJdTY0CWNvbnRyb2xfd29yZDsKKwl1NjQJYnVmZmVyOworfTsKKworI2RlZmluZSBUWERDVFJMX0JVRlNaCTB4MDAwMDAwMDAwMDAwN2ZmZlVMTAkvKiBCdWZmZXIgU2l6ZQkJKi8KKyNkZWZpbmUgVFhEQ1RSTF9DU1RBUlQJMHgwMDAwMDAwMDAwMWY4MDAwVUxMCS8qIENTVU0gU3RhcnQgT2Zmc2V0CSovCisjZGVmaW5lIFRYRENUUkxfQ09GRgkweDAwMDAwMDAwMWZlMDAwMDBVTEwJLyogQ1NVTSBTdHVmZiBPZmZzZXQJKi8KKyNkZWZpbmUgVFhEQ1RSTF9DRU5BQgkweDAwMDAwMDAwMjAwMDAwMDBVTEwJLyogQ1NVTSBFbmFibGUJCSovCisjZGVmaW5lIFRYRENUUkxfRU9GCTB4MDAwMDAwMDA0MDAwMDAwMFVMTAkvKiBFbmQgb2YgRnJhbWUJCSovCisjZGVmaW5lIFRYRENUUkxfU09GCTB4MDAwMDAwMDA4MDAwMDAwMFVMTAkvKiBTdGFydCBvZiBGcmFtZQkqLworI2RlZmluZSBUWERDVFJMX0lOVE1FCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAkvKiAiSW50ZXJydXB0IE1lIgkqLworI2RlZmluZSBUWERDVFJMX05PQ1JDCTB4MDAwMDAwMDIwMDAwMDAwMFVMTAkvKiBObyBDUkMgUHJlc2VudAkqLworCisvKiBHRU0gcmVxdWlyZXMgdGhhdCBSWCBkZXNjcmlwdG9ycyBhcmUgcHJvdmlkZWQgZm91ciBhdCBhIHRpbWUsCisgKiBhbGlnbmVkLiAgQWxzbywgdGhlIFJYIHJpbmcgbWF5IG5vdCB3cmFwIGFyb3VuZC4gIFRoaXMgbWVhbnMgdGhhdAorICogdGhlcmUgd2lsbCBiZSBhdCBsZWFzdCA0IHVudXNlZCBkZXNjaXB0b3IgZW50cmllcyBpbiB0aGUgbWlkZGxlCisgKiBvZiB0aGUgUlggcmluZyBhdCBhbGwgdGltZXMuCisgKgorICogU2ltaWxhciB0byBITUUsIEdFTSBhc3N1bWVzIHRoYXQgaXQgY2FuIHdyaXRlIGdhcmJhZ2UgYnl0ZXMgYmVmb3JlCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIHJpZ2h0IGFmdGVyIHRoZSBlbmQgaW4gb3JkZXIgdG8gRE1BCisgKiB3aG9sZSBjYWNoZWxpbmVzLgorICoKKyAqIFVubGlrZSBmb3IgVFgsIEdFTSBkb2VzIHVwZGF0ZSB0aGUgc3RhdHVzIHdvcmQgaW4gdGhlIFJYIGRlc2NyaXB0b3JzCisgKiB3aGVuIHBhY2tldHMgYXJyaXZlLiAgVGhlcmVmb3JlIGFuIG93bmVyc2hpcCBiaXQgZG9lcyBleGlzdCBpbiB0aGUKKyAqIFJYIGRlc2NyaXB0b3JzLiAgSXQgaXMgYWR2aXNvcnksIEdFTSBjbGVhcnMgaXQgYnV0IGRvZXMgbm90IGNoZWNrCisgKiBpdCBpbiBhbnkgd2F5LiAgU28gd2hlbiBidWZmZXJzIGFyZSBwb3N0ZWQgdG8gdGhlIFJYIHJpbmcgKHZpYSB0aGUKKyAqIFJYIEtpY2sgcmVnaXN0ZXIpIGJ5IHRoZSBkcml2ZXIgaXQgbXVzdCBtYWtlIHN1cmUgdGhlIGJ1ZmZlcnMgYXJlCisgKiB0cnVseSByZWFkeSBhbmQgdGhhdCB0aGUgb3duZXJzaGlwIGJpdHMgYXJlIHNldCBwcm9wZXJseS4KKyAqCisgKiBFdmVuIHRob3VnaCBHRU0gbW9kaWZpZXMgdGhlIFJYIGRlc2NyaXB0b3JzLCBpdCBndWFyYW50ZWVzIHRoYXQgdGhlCisgKiBidWZmZXIgRE1BIGFkZHJlc3MgZmllbGQgd2lsbCBzdGF5IHRoZSBzYW1lIHdoZW4gaXQgcGVyZm9ybXMgdGhlc2UKKyAqIHVwZGF0ZXMuICBUaGVyZWZvcmUgaXQgY2FuIGJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBETUEgbWFwcGluZ3MKKyAqIGJ5IHRoZSBob3N0IGRyaXZlciBqdXN0IGFzIGluIHRoZSBUWCBkZXNjcmlwdG9yIGNhc2UgYWJvdmUuCisgKi8KK3N0cnVjdCBnZW1fcnhkIHsKKwl1NjQJc3RhdHVzX3dvcmQ7CisJdTY0CWJ1ZmZlcjsKK307CisKKyNkZWZpbmUgUlhEQ1RSTF9UQ1BDU1VNCTB4MDAwMDAwMDAwMDAwZmZmZlVMTAkvKiBUQ1AgUHNldWRvLUNTVU0JKi8KKyNkZWZpbmUgUlhEQ1RSTF9CVUZTWgkweDAwMDAwMDAwN2ZmZjAwMDBVTEwJLyogQnVmZmVyIFNpemUJCSovCisjZGVmaW5lIFJYRENUUkxfT1dOCTB4MDAwMDAwMDA4MDAwMDAwMFVMTAkvKiBHRU0gb3ducyB0aGlzIGVudHJ5CSovCisjZGVmaW5lIFJYRENUUkxfSEFTSFZBTAkweDBmZmZmMDAwMDAwMDAwMDBVTEwJLyogSGFzaCBWYWx1ZQkJKi8KKyNkZWZpbmUgUlhEQ1RSTF9IUEFTUwkweDEwMDAwMDAwMDAwMDAwMDBVTEwJLyogUGFzc2VkIEhhc2ggRmlsdGVyCSovCisjZGVmaW5lIFJYRENUUkxfQUxUTUFDCTB4MjAwMDAwMDAwMDAwMDAwMFVMTAkvKiBNYXRjaGVkIEFMVCBNQUMJKi8KKyNkZWZpbmUgUlhEQ1RSTF9CQUQJMHg0MDAwMDAwMDAwMDAwMDAwVUxMCS8qIEZyYW1lIGhhcyBiYWQgQ1JDCSovCisKKyNkZWZpbmUgUlhEQ1RSTF9GUkVTSChncCkJXAorCSgoKChSWF9CVUZfQUxMT0NfU0laRShncCkgLSBSWF9PRkZTRVQpIDw8IDE2KSAmIFJYRENUUkxfQlVGU1opIHwgXAorCSBSWERDVFJMX09XTikKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgMTI4CisjZGVmaW5lIFJYX1JJTkdfU0laRSAxMjgKKworI2lmIFRYX1JJTkdfU0laRSA9PSAzMgorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzMyCisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gNjQKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl82NAorI2VsaWYgVFhfUklOR19TSVpFID09IDEyOAorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzEyOAorI2VsaWYgVFhfUklOR19TSVpFID09IDI1NgorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzI1NgorI2VsaWYgVFhfUklOR19TSVpFID09IDUxMgorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzUxMgorI2VsaWYgVFhfUklOR19TSVpFID09IDEwMjQKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl8xSworI2VsaWYgVFhfUklOR19TSVpFID09IDIwNDgKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl8ySworI2VsaWYgVFhfUklOR19TSVpFID09IDQwOTYKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl80SworI2VsaWYgVFhfUklOR19TSVpFID09IDgxOTIKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl84SworI2Vsc2UKKyNlcnJvciBUWF9SSU5HX1NJWkUgdmFsdWUgaXMgaWxsZWdhbC4uLgorI2VuZGlmCisKKyNpZiBSWF9SSU5HX1NJWkUgPT0gMzIKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl8zMgorI2VsaWYgUlhfUklOR19TSVpFID09IDY0CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfNjQKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSAxMjgKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl8xMjgKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSAyNTYKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl8yNTYKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSA1MTIKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl81MTIKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSAxMDI0CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfMUsKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSAyMDQ4CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfMksKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSA0MDk2CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfNEsKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSA4MTkyCisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfOEsKKyNlbHNlCisjZXJyb3IgUlhfUklOR19TSVpFIGlzIGlsbGVnYWwuLi4KKyNlbmRpZgorCisjZGVmaW5lIE5FWFRfVFgoTikJKCgoTikgKyAxKSAmIChUWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9SWChOKQkoKChOKSArIDEpICYgKFJYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKEdQKQkJCQkJXAorCSgoKEdQKS0+dHhfb2xkIDw9IChHUCktPnR4X25ldykgPwkJCVwKKwkgIChHUCktPnR4X29sZCArIChUWF9SSU5HX1NJWkUgLSAxKSAtIChHUCktPnR4X25ldyA6CVwKKwkgIChHUCktPnR4X29sZCAtIChHUCktPnR4X25ldyAtIDEpCisKKyNkZWZpbmUgUlhfT0ZGU0VUICAgICAgICAgIDIKKyNkZWZpbmUgUlhfQlVGX0FMTE9DX1NJWkUoZ3ApCSgoZ3ApLT5yeF9idWZfc3ogKyAyOCArIFJYX09GRlNFVCArIDY0KQorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAyNTYKKworI2lmIFRYX1JJTkdfU0laRSA8IDEyOAorI2RlZmluZSBJTklUX0JMT0NLX1RYX1JJTkdfU0laRQkJMTI4CisjZWxzZQorI2RlZmluZSBJTklUX0JMT0NLX1RYX1JJTkdfU0laRQkJVFhfUklOR19TSVpFCisjZW5kaWYKKworI2lmIFJYX1JJTkdfU0laRSA8IDEyOAorI2RlZmluZSBJTklUX0JMT0NLX1JYX1JJTkdfU0laRQkJMTI4CisjZWxzZQorI2RlZmluZSBJTklUX0JMT0NLX1JYX1JJTkdfU0laRQkJUlhfUklOR19TSVpFCisjZW5kaWYKKworc3RydWN0IGdlbV9pbml0X2Jsb2NrIHsKKwlzdHJ1Y3QgZ2VtX3R4ZAl0eGRbSU5JVF9CTE9DS19UWF9SSU5HX1NJWkVdOworCXN0cnVjdCBnZW1fcnhkCXJ4ZFtJTklUX0JMT0NLX1JYX1JJTkdfU0laRV07Cit9OworCitlbnVtIGdlbV9waHlfdHlwZSB7CisJcGh5X21paV9tZGlvMCwKKwlwaHlfbWlpX21kaW8xLAorCXBoeV9zZXJpYWxpbmssCisJcGh5X3NlcmRlcywKK307CisKK2VudW0gbGlua19zdGF0ZSB7CisJbGlua19kb3duID0gMCwJLyogTm8gbGluaywgd2lsbCByZXRyeSAqLworCWxpbmtfYW5lZywJLyogQXV0b25lZyBpbiBwcm9ncmVzcyAqLworCWxpbmtfZm9yY2VfdHJ5LAkvKiBUcnkgRm9yY2VkIGxpbmsgc3BlZWQgKi8KKwlsaW5rX2ZvcmNlX3JldCwJLyogRm9yY2VkIG1vZGUgd29ya2VkLCByZXRyeWluZyBhdXRvbmVnICovCisJbGlua19mb3JjZV9vaywJLyogU3RheSBpbiBmb3JjZWQgbW9kZSAqLworCWxpbmtfdXAJCS8qIExpbmsgaXMgdXAgKi8KK307CisKK3N0cnVjdCBnZW0geworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3BpbmxvY2tfdAkJdHhfbG9jazsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCWludAkJCXJ4X25ldywgcnhfb2xkOworCWludAkJCXR4X25ldywgdHhfb2xkOworCisJdW5zaWduZWQgaW50IGhhc193b2wgOiAxOwkvKiBjaGlwIHN1cHBvcnRzIHdha2Utb24tbGFuICovCisJdW5zaWduZWQgaW50IGFzbGVlcCA6IDE7CS8qIGNoaXAgYXNsZWVwLCBwcm90ZWN0ZWQgYnkgcG1fc2VtICovCisJdW5zaWduZWQgaW50IGFzbGVlcF93b2wgOiAxOwkvKiB3YXMgYXNsZWVwIHdpdGggV09MIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQgb3BlbmVkIDogMTsJLyogZHJpdmVyIG9wZW5lZCwgcHJvdGVjdGVkIGJ5IHBtX3NlbSAqLworCXVuc2lnbmVkIGludCBydW5uaW5nIDogMTsJLyogY2hpcCBydW5uaW5nLCBwcm90ZWN0ZWQgYnkgbG9jayAqLworCQorCS8qIGNlbGwgZW5hYmxlIGNvdW50LCBwcm90ZWN0ZWQgYnkgbG9jayAqLworCWludAkJCWNlbGxfZW5hYmxlZDsgIAorCQorCXN0cnVjdCBzZW1hcGhvcmUJcG1fc2VtOworCisJdTMyCQkJbXNnX2VuYWJsZTsKKwl1MzIJCQlzdGF0dXM7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisKKwlpbnQJCQl0eF9maWZvX3N6OworCWludAkJCXJ4X2ZpZm9fc3o7CisJaW50CQkJcnhfcGF1c2Vfb2ZmOworCWludAkJCXJ4X3BhdXNlX29uOworCWludAkJCXJ4X2J1Zl9zejsKKwl1NjQJCQlwYXVzZV9lbnRlcmVkOworCXUxNgkJCXBhdXNlX2xhc3RfdGltZV9yZWN2ZDsKKwl1MzIJCQltYWNfcnhfY2ZnOworCXUzMgkJCXN3cnN0X2Jhc2U7CisKKwlpbnQJCQl3YW50X2F1dG9uZWc7CisJaW50CQkJbGFzdF9mb3JjZWRfc3BlZWQ7CisJZW51bSBsaW5rX3N0YXRlCQlsc3RhdGU7CisJc3RydWN0IHRpbWVyX2xpc3QJbGlua190aW1lcjsKKwlpbnQJCQl0aW1lcl90aWNrczsKKwlpbnQJCQl3YWtlX29uX2xhbjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVzZXRfdGFzazsKKwl2b2xhdGlsZSBpbnQJCXJlc2V0X3Rhc2tfcGVuZGluZzsKKworCWVudW0gZ2VtX3BoeV90eXBlCXBoeV90eXBlOworCXN0cnVjdCBtaWlfcGh5CQlwaHlfbWlpOworCWludAkJCW1paV9waHlfYWRkcjsKKwkJCisJc3RydWN0IGdlbV9pbml0X2Jsb2NrCSppbml0X2Jsb2NrOworCXN0cnVjdCBza19idWZmCQkqcnhfc2tic1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmCQkqdHhfc2tic1tSWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QJCWdibG9ja19kdm1hOworCisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOworI2VuZGlmCit9OworCisjZGVmaW5lIGZvdW5kX21paV9waHkoZ3ApICgoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpIFwKKwkJCQkmJiBncC0+cGh5X21paS5kZWYgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMpCisJCQkKKyNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCisgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NFVMIC0gMVVMKSkgJiB+KDY0VUwgLSAxVUwpKSAtICh1bnNpZ25lZCBsb25nKShhZGRyKSkKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBza19idWZmICpnZW1fYWxsb2Nfc2tiKGludCBzaXplLCBpbnQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSArIDY0LCBnZnBfZmxhZ3MpOworCisJaWYgKHNrYikgeworCQlpbnQgb2Zmc2V0ID0gKGludCkgQUxJR05FRF9SWF9TS0JfQUREUihza2ItPmRhdGEpOworCQlpZiAob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKworCXJldHVybiBza2I7Cit9CisKKyNlbmRpZiAvKiBfU1VOR0VNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmNhNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jCkBAIC0wLDAgKzEsODcyIEBACisvKgorICogUEhZIGRyaXZlcnMgZm9yIHRoZSBzdW5nZW0gZXRoZXJuZXQgZHJpdmVyLgorICogCisgKiBUaGlzIGZpbGUgY291bGQgYmUgc2hhcmVkIHdpdGggb3RoZXIgZHJpdmVycy4KKyAqIAorICogKGMpIDIwMDIsIEJlbmphbWluIEhlcnJlbnNjbWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQorICoKKyAqIFRPRE86CisgKiAgLSBJbXBsZW1lbnQgV09MCisgKiAgLSBBZGQgc3VwcG9ydCBmb3IgUEhZcyB0aGF0IHByb3ZpZGUgYW4gSVJRIGxpbmUKKyAqICAtIEV2ZW50dWFsbHkgbW92ZWQgdGhlIGVudGlyZSBwb2xsaW5nIHN0YXRlIG1hY2hpbmUgaW4KKyAqICAgIHRoZXJlIChvdXQgb2YgdGhlIGV0aCBkcml2ZXIpLCBzbyB0aGF0IGl0IGNhbiBlYXNpbHkgYmUKKyAqICAgIHNraXBwZWQgb24gUEhZcyB0aGF0IGltcGxlbWVudCBpdCBpbiBoYXJkd2FyZS4KKyAqICAtIE9uIExYVDk3MSAmIEJDTTUyMDEsIEFwcGxlIHVzZXMgc29tZSBjaGlwIHNwZWNpZmljIHJlZ3MKKyAqICAgIHRvIHJlYWQgdGhlIGxpbmsgc3RhdHVzLiBGaWd1cmUgb3V0IHdoeSBhbmQgaWYgaXQgbWFrZXMKKyAqICAgIHNlbnNlIHRvIGRvIHRoZSBzYW1lIChtYWdpYyBhbmVnID8pCisgKiAgLSBBcHBsZSBoYXMgc29tZSBhZGRpdGlvbmFsIHBvd2VyIG1hbmFnZW1lbnQgY29kZSBmb3Igc29tZQorICogICAgQnJvYWRjb20gUEhZcyB0aGF0IHRoZXkgImhpZGUiIGZyb20gdGhlIE9wZW5Tb3VyY2UgdmVyc2lvbgorICogICAgb2YgZGFyd2luLCBzdGlsbCBuZWVkIHRvIHJldmVyc2UgZW5naW5lZXIgdGhhdAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJzdW5nZW1fcGh5LmgiCisKKy8qIExpbmsgbW9kZXMgb2YgdGhlIEJDTTU0MDAgUEhZICovCitzdGF0aWMgaW50IHBoeV9CQ001NDAwX2xpbmtfdGFibGVbOF1bM10gPSB7CisJeyAwLCAwLCAwIH0sCS8qIE5vIGxpbmsgKi8KKwl7IDAsIDAsIDAgfSwJLyogMTBCVCBIYWxmIER1cGxleCAqLworCXsgMSwgMCwgMCB9LAkvKiAxMEJUIEZ1bGwgRHVwbGV4ICovCisJeyAwLCAxLCAwIH0sCS8qIDEwMEJUIEhhbGYgRHVwbGV4ICovCisJeyAwLCAxLCAwIH0sCS8qIDEwMEJUIEhhbGYgRHVwbGV4ICovCisJeyAxLCAxLCAwIH0sCS8qIDEwMEJUIEZ1bGwgRHVwbGV4Ki8KKwl7IDEsIDAsIDEgfSwJLyogMTAwMEJUICovCisJeyAxLCAwLCAxIH0sCS8qIDEwMDBCVCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgX19waHlfcmVhZChzdHJ1Y3QgbWlpX3BoeSogcGh5LCBpbnQgaWQsIGludCByZWcpCit7CisJcmV0dXJuIHBoeS0+bWRpb19yZWFkKHBoeS0+ZGV2LCBpZCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcGh5X3dyaXRlKHN0cnVjdCBtaWlfcGh5KiBwaHksIGludCBpZCwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIGlkLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBoeV9yZWFkKHN0cnVjdCBtaWlfcGh5KiBwaHksIGludCByZWcpCit7CisJcmV0dXJuIHBoeS0+bWRpb19yZWFkKHBoeS0+ZGV2LCBwaHktPm1paV9pZCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSogcGh5LCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXBoeS0+bWRpb193cml0ZShwaHktPmRldiwgcGh5LT5taWlfaWQsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCByZXNldF9vbmVfbWlpX3BoeShzdHJ1Y3QgbWlpX3BoeSogcGh5LCBpbnQgcGh5X2lkKQoreworCXUxNiB2YWw7CisJaW50IGxpbWl0ID0gMTAwMDA7CisJCisJdmFsID0gX19waHlfcmVhZChwaHksIHBoeV9pZCwgTUlJX0JNQ1IpOworCXZhbCAmPSB+KEJNQ1JfSVNPTEFURSB8IEJNQ1JfUERPV04pOworCXZhbCB8PSBCTUNSX1JFU0VUOworCV9fcGh5X3dyaXRlKHBoeSwgcGh5X2lkLCBNSUlfQk1DUiwgdmFsKTsKKworCXVkZWxheSgxMDApOworCisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJdmFsID0gX19waHlfcmVhZChwaHksIHBoeV9pZCwgTUlJX0JNQ1IpOworCQlpZiAoKHZhbCAmIEJNQ1JfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKCh2YWwgJiBCTUNSX0lTT0xBVEUpICYmIGxpbWl0ID4gMCkKKwkJX19waHlfd3JpdGUocGh5LCBwaHlfaWQsIE1JSV9CTUNSLCB2YWwgJiB+Qk1DUl9JU09MQVRFKTsKKwkKKwlyZXR1cm4gKGxpbWl0IDw9IDApOworfQorCitzdGF0aWMgaW50IGJjbTUyMDFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMDFfTVVMVElQSFkpOworCWRhdGEgJj0gfk1JSV9CQ001MjAxX01VTFRJUEhZX1NVUEVSSVNPTEFURTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIwMV9NVUxUSVBIWSwgZGF0YSk7CisKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIwMV9JTlRFUlJVUFQsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTIwMV9zdXNwZW5kKHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMDFfSU5URVJSVVBULCAwKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIwMV9NVUxUSVBIWSwgTUlJX0JDTTUyMDFfTVVMVElQSFlfU1VQRVJJU09MQVRFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTUyMjFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCwKKwkJZGF0YSB8IE1JSV9CQ001MjIxX1RFU1RfRU5BQkxFX1NIQURPV1MpOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX1NUQVQyKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfU1RBVDIsCisJCWRhdGEgfCBNSUlfQkNNNTIyMV9TSERPV19BVVhfU1RBVDJfQVBEKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0LAorCQlkYXRhIHwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0X0NMS0xPUFdSKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1RFU1QpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1RFU1QsCisJCWRhdGEgJiB+TUlJX0JDTTUyMjFfVEVTVF9FTkFCTEVfU0hBRE9XUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201MjIxX3N1c3BlbmQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1RFU1QpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1RFU1QsCisJCWRhdGEgfCBNSUlfQkNNNTIyMV9URVNUX0VOQUJMRV9TSEFET1dTKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0LAorCQkgIGRhdGEgfCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTRfSUREUU1PREUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQwMF9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisKKwkvKiBDb25maWd1cmUgZm9yIGdpZ2FiaXQgZnVsbCBkdXBsZXggKi8KKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9BVVhDT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9CQ001NDAwX0FVWENPTlRST0xfUFdSMTBCQVNFVDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTQwMF9BVVhDT05UUk9MLCBkYXRhKTsKKwkKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9CQ001NDAwX0dCX0NPTlRST0xfRlVMTERVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MLCBkYXRhKTsKKwkKKwl1ZGVsYXkoMTAwKTsKKworCS8qIFJlc2V0IGFuZCBjb25maWd1cmUgY2FzY2FkZWQgMTAvMTAwIFBIWSAqLworCSh2b2lkKXJlc2V0X29uZV9taWlfcGh5KHBoeSwgMHgxZik7CisJCisJZGF0YSA9IF9fcGh5X3JlYWQocGh5LCAweDFmLCBNSUlfQkNNNTIwMV9NVUxUSVBIWSk7CisJZGF0YSB8PSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TRVJJQUxNT0RFOworCV9fcGh5X3dyaXRlKHBoeSwgMHgxZiwgTUlJX0JDTTUyMDFfTVVMVElQSFksIGRhdGEpOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCk7CisJZGF0YSAmPSB+TUlJX0JDTTU0MDBfQVVYQ09OVFJPTF9QV1IxMEJBU0VUOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001NDAwX0FVWENPTlRST0wsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQwMF9zdXNwZW5kKHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisjaWYgMCAvKiBDb21tZW50ZWQgb3V0IGluIERhcndpbi4uLiBzb21lb25lIGhhcyB0aG9zZSBkYXduIGRvY3MgPyAqLworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBCTUNSX1BET1dOKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MDFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCWludCByZXY7CisKKwlyZXYgPSBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSAmIDB4MDAwZjsKKwlpZiAocmV2ID09IDAgfHwgcmV2ID09IDMpIHsKKwkJLyogU29tZSByZXZpc2lvbnMgb2YgNTQwMSBhcHBlYXIgdG8gbmVlZCB0aGlzCisJCSAqIGluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIHRvIGRpc2FibGUsIGFjY29yZGluZworCQkgKiB0byBPRiwgInRhcCBwb3dlciBtYW5hZ2VtZW50IgorCQkgKiAKKwkJICogV0FSTklORyAhIE9GIGFuZCBEYXJ3aW4gZG9uJ3QgYWdyZWUgb24gdGhlCisJCSAqIHJlZ2lzdGVyIGFkZHJlc3Nlcy4gT0Ygc2VlbSB0byBpbnRlcnByZXQgdGhlCisJCSAqIHJlZ2lzdGVyIG51bWJlcnMgYmVsb3cgYXMgZGVjaW1hbAorCQkgKgorCQkgKiBOb3RlOiBUaGlzIHNob3VsZCAoYW5kIGRvZXMpIG1hdGNoIHRnM19pbml0XzU0MDFwaHlfZHNwCisJCSAqICAgICAgIGluIHRoZSB0ZzMuYyBkcml2ZXIuIC1EYXZlTQorCQkgKi8KKwkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHgwYzIwKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHgwMDEyKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgMHgxODA0KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHgwMDEzKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgMHgxMjA0KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHg4MDA2KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgMHgwMTMyKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHg4MDA2KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgMHgwMjMyKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHgyMDFmKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgMHgwYTIwKTsKKwl9CisJCisJLyogQ29uZmlndXJlIGZvciBnaWdhYml0IGZ1bGwgZHVwbGV4ICovCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MX0ZVTExEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCwgZGF0YSk7CisKKwl1ZGVsYXkoMTApOworCisJLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSBjYXNjYWRlZCAxMC8xMDAgUEhZICovCisJKHZvaWQpcmVzZXRfb25lX21paV9waHkocGh5LCAweDFmKTsKKwkKKwlkYXRhID0gX19waHlfcmVhZChwaHksIDB4MWYsIE1JSV9CQ001MjAxX01VTFRJUEhZKTsKKwlkYXRhIHw9IE1JSV9CQ001MjAxX01VTFRJUEhZX1NFUklBTE1PREU7CisJX19waHlfd3JpdGUocGh5LCAweDFmLCBNSUlfQkNNNTIwMV9NVUxUSVBIWSwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDAxX3N1c3BlbmQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKyNpZiAwIC8qIENvbW1lbnRlZCBvdXQgaW4gRGFyd2luLi4uIHNvbWVvbmUgaGFzIHRob3NlIGRhd24gZG9jcyA/ICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUERPV04pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQxMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisKKwkvKiBIZXJlJ3Mgc29tZSBtb3JlIEFwcGxlIGJsYWNrIG1hZ2ljIHRvIHNldHVwCisJICogc29tZSB2b2x0YWdlIHN0dWZmcy4KKwkgKi8KKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweDhjMjMpOworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OGNhMyk7CisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg4YzIzKTsKKworCS8qIEhlcmUsIEFwcGxlIHNlZW1zIHRvIHdhbnQgdG8gcmVzZXQgaXQsIGRvCisJICogaXQgYXMgd2VsbAorCSAqLworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgMHgxMzQwKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0JDTTU0MDBfR0JfQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wsIGRhdGEpOworCisJdWRlbGF5KDEwKTsKKworCS8qIFJlc2V0IGFuZCBjb25maWd1cmUgY2FzY2FkZWQgMTAvMTAwIFBIWSAqLworCSh2b2lkKXJlc2V0X29uZV9taWlfcGh5KHBoeSwgMHgxZik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQxMV9zdXNwZW5kKHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUERPV04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQyMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisJaW50IHJldjsKKworCXJldiA9IHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDIpICYgMHgwMDBmOworCWlmIChyZXYgPT0gMCkgeworCQkvKiBUaGlzIGlzIGJvcnJvd2VkIGZyb20gTWFjT1MKKwkJICovCisJCXBoeV93cml0ZShwaHksIDB4MTgsIDB4MTAwNyk7CisJCWRhdGEgPSBwaHlfcmVhZChwaHksIDB4MTgpOworCQlwaHlfd3JpdGUocGh5LCAweDE4LCBkYXRhIHwgMHgwNDAwKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHgwMDA3KTsKKwkJZGF0YSA9IHBoeV9yZWFkKHBoeSwgMHgxOCk7CisJCXBoeV93cml0ZShwaHksIDB4MTgsIGRhdGEgfCAweDA4MDApOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDAwMGEpOworCQlkYXRhID0gcGh5X3JlYWQocGh5LCAweDE1KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgZGF0YSB8IDB4MDIwMCk7CisJfQorI2lmIDAKKwkvKiBUaGlzIGhhcyB0byBiZSB2ZXJpZmllZCBiZWZvcmUgSSBlbmFibGUgaXQgKi8KKwkvKiBFbmFibGUgYXV0b21hdGljIGxvdy1wb3dlciAqLworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTAwMik7CisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHhhODIxKTsKKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweDk0MWQpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQyMWsyX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwkvKiBJbml0IGNvZGUgYm9ycm93ZWQgZnJvbSBPRiAqLworCXBoeV93cml0ZShwaHksIDQsIDB4MDFlMSk7CisJcGh5X3dyaXRlKHBoeSwgOSwgMHgwMzAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0eHhfc2V0dXBfYW5lZyhzdHJ1Y3QgbWlpX3BoeSAqcGh5LCB1MzIgYWR2ZXJ0aXNlKQoreworCXUxNiBjdGwsIGFkdjsKKwkKKwlwaHktPmF1dG9uZWcgPSAxOworCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCXBoeS0+cGF1c2UgPSAwOworCXBoeS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisKKwkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2UgKi8KKwlhZHYgPSBwaHlfcmVhZChwaHksIE1JSV9BRFZFUlRJU0UpOworCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCXBoeV93cml0ZShwaHksIE1JSV9BRFZFUlRJU0UsIGFkdik7CisKKwkvKiBTZXR1cCAxMDAwQlQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfMTAwMEJBU0VUQ09OVFJPTCk7CisJYWR2ICY9IH4oTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUHxNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQKTsKKwlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUDsKKwlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfMTAwMEJBU0VUQ09OVFJPTCwgYWR2KTsKKworCS8qIFN0YXJ0L1Jlc3RhcnQgYW5lZyAqLworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0eHhfc2V0dXBfZm9yY2VkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGZkKQoreworCXUxNiBjdGw7CisJCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPnNwZWVkID0gc3BlZWQ7CisJcGh5LT5kdXBsZXggPSBmZDsKKwlwaHktPnBhdXNlID0gMDsKKworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFh8Qk1DUl9TUEVFRDEwMHxCTUNSX1NQRDJ8Qk1DUl9BTkVOQUJMRSk7CisKKwkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCB8IEJNQ1JfUkVTRVQpOworCisJLyogU2VsZWN0IHNwZWVkICYgZHVwbGV4ICovCisJc3dpdGNoKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDoKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCWN0bCB8PSBCTUNSX1NQRUVEMTAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDA6CisJCWN0bCB8PSBCTUNSX1NQRDI7CisJfQorCWlmIChmZCA9PSBEVVBMRVhfRlVMTCkKKwkJY3RsIHw9IEJNQ1JfRlVMTERQTFg7CisKKwkvLyBYWFggU2hvdWxkIHdlIHNldCB0aGUgc3VuZ2VtIHRvIEdJSSBub3cgb24gMTAwMEJUID8KKwkKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0eHhfcmVhZF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJaW50IGxpbmtfbW9kZTsJCisJdTE2IHZhbDsKKwkKKwlpZiAocGh5LT5hdXRvbmVnKSB7CisJICAgIAl2YWwgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0FVWFNUQVRVUyk7CisJCWxpbmtfbW9kZSA9ICgodmFsICYgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX01BU0spID4+CisJCQkgICAgIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9TSElGVCk7CisJCXBoeS0+ZHVwbGV4ID0gcGh5X0JDTTU0MDBfbGlua190YWJsZVtsaW5rX21vZGVdWzBdID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwkJcGh5LT5zcGVlZCA9IHBoeV9CQ001NDAwX2xpbmtfdGFibGVbbGlua19tb2RlXVsyXSA/CisJCQkJU1BFRURfMTAwMCA6CisJCQkJKHBoeV9CQ001NDAwX2xpbmtfdGFibGVbbGlua19tb2RlXVsxXSA/IFNQRUVEXzEwMCA6IFNQRUVEXzEwKTsKKwkJdmFsID0gcGh5X3JlYWQocGh5LCBNSUlfTFBBKTsKKwkJcGh5LT5wYXVzZSA9ICgodmFsICYgTFBBX1BBVVNFKSAhPSAwKTsKKwl9CisJLyogT24gbm9uLWFuZWcsIHdlIGFzc3VtZSB3aGF0IHdlIHB1dCBpbiBCTUNSIGlzIHRoZSBzcGVlZCwKKwkgKiB0aG91Z2ggbWFnaWMtYW5lZyBzaG91bGRuJ3QgcHJldmVudCB0aGlzIGNhc2UgZnJvbSBvY2N1cnJpbmcKKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcnZlbGxfc2V0dXBfYW5lZyhzdHJ1Y3QgbWlpX3BoeSAqcGh5LCB1MzIgYWR2ZXJ0aXNlKQoreworCXUxNiBjdGwsIGFkdjsKKwkKKwlwaHktPmF1dG9uZWcgPSAxOworCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCXBoeS0+cGF1c2UgPSAwOworCXBoeS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisKKwkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2UgKi8KKwlhZHYgPSBwaHlfcmVhZChwaHksIE1JSV9BRFZFUlRJU0UpOworCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCXBoeV93cml0ZShwaHksIE1JSV9BRFZFUlRJU0UsIGFkdik7CisKKwkvKiBTZXR1cCAxMDAwQlQgYWR2ZXJ0aXNlICYgZW5hYmxlIGNyb3Nzb3ZlciBkZXRlY3QKKwkgKiBYWFggSG93IGRvIHdlIGFkdmVydGlzZSAxMDAwQlQgPyBEYXJ3aW4gc291cmNlIGlzCisJICogY29uZnVzaW5nIGhlcmUsIHRoZXkgcmVhZCBmcm9tIHNwZWNpZmljIGNvbnRyb2wgYW5kCisJICogd3JpdGUgdG8gY29udHJvbC4uLiBTb21lb25lIGhhcyBzcGVjcyBmb3IgdGhvc2UKKwkgKiBiZWFzdHMgPworCSAqLworCWFkdiA9IHBoeV9yZWFkKHBoeSwgTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0wpOworCWFkdiB8PSBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTF9BVVRPX01ESVg7CisJYWR2ICY9IH4oTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUCB8CisJCQlNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQKTsKKwlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUDsKKwlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfMTAwMEJBU0VUQ09OVFJPTCwgYWR2KTsKKworCS8qIFN0YXJ0L1Jlc3RhcnQgYW5lZyAqLworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcnZlbGxfc2V0dXBfZm9yY2VkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGZkKQoreworCXUxNiBjdGwsIGN0bDI7CisJCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPnNwZWVkID0gc3BlZWQ7CisJcGh5LT5kdXBsZXggPSBmZDsKKwlwaHktPnBhdXNlID0gMDsKKworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFh8Qk1DUl9TUEVFRDEwMHxCTUNSX1NQRDJ8Qk1DUl9BTkVOQUJMRSk7CisJY3RsIHw9IEJNQ1JfUkVTRVQ7CisKKwkvKiBTZWxlY3Qgc3BlZWQgJiBkdXBsZXggKi8KKwlzd2l0Y2goc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWJyZWFrOworCS8qIEknbSBub3Qgc3VyZSBhYm91dCB0aGUgb25lIGJlbG93LCBhZ2FpbiwgRGFyd2luIHNvdXJjZSBpcworCSAqIHF1aXRlIGNvbmZ1c2luZyBhbmQgSSBsYWNrIGNoaXAgc3BlY3MKKwkgKi8KKwljYXNlIFNQRUVEXzEwMDA6CisJCWN0bCB8PSBCTUNSX1NQRDI7CisJfQorCWlmIChmZCA9PSBEVVBMRVhfRlVMTCkKKwkJY3RsIHw9IEJNQ1JfRlVMTERQTFg7CisKKwkvKiBEaXNhYmxlIGNyb3Nzb3Zlci4gQWdhaW4sIHRoZSB3YXkgQXBwbGUgZG9lcyBpdCBpcyBzdHJhbmdlLAorCSAqIHRob3VnaCBJIGRvbid0IGFzc3VtZSB0aGV5IGFyZSB3cm9uZyA7KQorCSAqLworCWN0bDIgPSBwaHlfcmVhZChwaHksIE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MKTsKKwljdGwyICY9IH4oTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0xfTUFOVUFMX01ESVggfAorCQlNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTF9BVVRPX01ESVggfAorCQlNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQIHwKKwkJTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUCk7CisJaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCWN0bDIgfD0gKGZkID09IERVUExFWF9GVUxMKSA/CisJCQlNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQIDoKKwkJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJXzEwMDBCQVNFVENPTlRST0wsIGN0bDIpOworCisJLy8gWFhYIFNob3VsZCB3ZSBzZXQgdGhlIHN1bmdlbSB0byBHSUkgbm93IG9uIDEwMDBCVCA/CisJCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJ2ZWxsX3JlYWRfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCXUxNiBzdGF0dXM7CisKKwlpZiAocGh5LT5hdXRvbmVnKSB7CisJCXN0YXR1cyA9IHBoeV9yZWFkKHBoeSwgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVUyk7CisJCWlmICgoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19SRVNPTFZFRCkgPT0gMCkKKwkJCXJldHVybiAtRUFHQUlOOworCQlpZiAoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAwKQorCQkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwKQorCQkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCQlpZiAoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19GVUxMRFVQTEVYKQorCQkJcGh5LT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJcGh5LT5wYXVzZSA9IDA7IC8qIFhYWCBDaGVjayBhZ2FpbnN0IHNwZWMgISAqLworCX0KKwkvKiBPbiBub24tYW5lZywgd2UgYXNzdW1lIHdoYXQgd2UgcHV0IGluIEJNQ1IgaXMgdGhlIHNwZWVkLAorCSAqIHRob3VnaCBtYWdpYy1hbmVnIHNob3VsZG4ndCBwcmV2ZW50IHRoaXMgY2FzZSBmcm9tIG9jY3VycmluZworCSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3NldHVwX2FuZWcoc3RydWN0IG1paV9waHkgKnBoeSwgdTMyIGFkdmVydGlzZSkKK3sKKwl1MTYgY3RsLCBhZHY7CisJCisJcGh5LT5hdXRvbmVnID0gMTsKKwlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCisJLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3NldHVwX2ZvcmNlZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwl1MTYgY3RsOworCQorCXBoeS0+YXV0b25lZyA9IDA7CisJcGh5LT5zcGVlZCA9IHNwZWVkOworCXBoeS0+ZHVwbGV4ID0gZmQ7CisJcGh5LT5wYXVzZSA9IDA7CisKKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgJj0gfihCTUNSX0ZVTExEUExYfEJNQ1JfU1BFRUQxMDB8Qk1DUl9BTkVOQUJMRSk7CisKKwkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCB8IEJNQ1JfUkVTRVQpOworCisJLyogU2VsZWN0IHNwZWVkICYgZHVwbGV4ICovCisJc3dpdGNoKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDoKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCWN0bCB8PSBCTUNSX1NQRUVEMTAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDA6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChmZCA9PSBEVVBMRVhfRlVMTCkKKwkJY3RsIHw9IEJNQ1JfRlVMTERQTFg7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5taWlfcG9sbF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IHN0YXR1czsKKwkKKwkodm9pZClwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlzdGF0dXMgPSBwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHBoeS0+YXV0b25lZyAmJiAhKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3JlYWRfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCXUxNiBscGE7CisKKwlpZiAocGh5LT5hdXRvbmVnKSB7CisJCWxwYSA9IHBoeV9yZWFkKHBoeSwgTUlJX0xQQSk7CisKKwkJaWYgKGxwYSAmIChMUEFfMTBGVUxMIHwgTFBBXzEwMEZVTEwpKQorCQkJcGh5LT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJaWYgKGxwYSAmIChMUEFfMTAwRlVMTCB8IExQQV8xMDBIQUxGKSkKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJcGh5LT5wYXVzZSA9IDA7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwkgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBNSUlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkpCisjZGVmaW5lIE1JSV9HQklUX0ZFQVRVUkVTCShNSUlfQkFTSUNfRkVBVFVSRVMgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKworLyogQnJvYWRjb20gQkNNIDUyMDEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTIwMV9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTUyMDFfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTUyMDFfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGdlbm1paV9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBnZW5taWlfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBnZW5taWlfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201MjAxX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwNDA2MjEwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTUyMDEiLAorCS5mZWF0dXJlcwk9IE1JSV9CQVNJQ19GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTIwMV9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTIyMSAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201MjIxX3BoeV9vcHMgPSB7CisJLnN1c3BlbmQJPSBiY201MjIxX3N1c3BlbmQsCisJLmluaXQJCT0gYmNtNTIyMV9pbml0LAorCS5zZXR1cF9hbmVnCT0gZ2VubWlpX3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGdlbm1paV9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGdlbm1paV9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTUyMjFfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDA0MDYxZTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTIyMSIsCisJLmZlYXR1cmVzCT0gTUlJX0JBU0lDX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201MjIxX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1NDAwICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MDBfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDAwX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDAwX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQwMF9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDIwNjA0MCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001NDAwIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTQwMF9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTQwMSAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201NDAxX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQwMV9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQwMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0MDFfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwNTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQwMSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0MDFfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDU0MTEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQxMV9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTU0MTFfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTU0MTFfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGJjbTU0eHhfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201NDExX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MDcwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0MTEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDExX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1NDIxICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MjFfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDIxX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDExX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQyMV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDIwNjBlMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001NDIxIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTQyMV9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTQyMSBidWlsdC1pbiBLMiAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201NDIxazJfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDIxazJfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTU0MTFfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGJjbTU0eHhfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201NDIxazJfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYyZTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQyMS1LMiIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0MjFrMl9waHlfb3BzCit9OworCisvKiBNYXJ2ZWxsIDg4RTExMDEgKEFwcGxlIHNlZW0gdG8gZGVhbCB3aXRoIDIgZGlmZmVyZW50IHJldnMsCisgKiBJIG1hc2tlZCBvdXQgdGhlIDggbGFzdCBiaXRzIHRvIGdldCBib3RoLCBidXQgc29tZSBzcGVjcworICogd291bGQgYmUgdXNlZnVsIGhlcmUpIC0tQmVuSC4KKyAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBtYXJ2ZWxsX3BoeV9vcHMgPSB7CisJLnNldHVwX2FuZWcJPSBtYXJ2ZWxsX3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IG1hcnZlbGxfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBtYXJ2ZWxsX3JlYWRfbGluaworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBtYXJ2ZWxsX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAxNDEwYzAwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmMDAsCisJLm5hbWUJCT0gIk1hcnZlbGwgODhFMTEwMSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJm1hcnZlbGxfcGh5X29wcworfTsKKworLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgbW9zdCAxMC8xMDAgUEhZcyAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBnZW5lcmljX3BoeV9vcHMgPSB7CisJLnNldHVwX2FuZWcJPSBnZW5taWlfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gZ2VubWlpX3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gZ2VubWlpX3JlYWRfbGluaworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBnZW5taWlfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAwMDAwMDAsCisJLnBoeV9pZF9tYXNrCT0gMHgwMDAwMDAwMCwKKwkubmFtZQkJPSAiR2VuZXJpYyBNSUkiLAorCS5mZWF0dXJlcwk9IE1JSV9CQVNJQ19GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDAsCisJLm9wcwkJPSAmZ2VuZXJpY19waHlfb3BzCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmKiBtaWlfcGh5X3RhYmxlW10gPSB7CisJJmJjbTUyMDFfcGh5X2RlZiwKKwkmYmNtNTIyMV9waHlfZGVmLAorCSZiY201NDAwX3BoeV9kZWYsCisJJmJjbTU0MDFfcGh5X2RlZiwKKwkmYmNtNTQxMV9waHlfZGVmLAorCSZiY201NDIxX3BoeV9kZWYsCisJJmJjbTU0MjFrMl9waHlfZGVmLAorCSZtYXJ2ZWxsX3BoeV9kZWYsCisJJmdlbm1paV9waHlfZGVmLAorCU5VTEwKK307CisKK2ludCBtaWlfcGh5X3Byb2JlKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBtaWlfaWQpCit7CisJaW50IHJjOworCXUzMiBpZDsKKwlzdHJ1Y3QgbWlpX3BoeV9kZWYqIGRlZjsKKwlpbnQgaTsKKworCS8qIFdlIGRvIG5vdCByZXNldCB0aGUgbWlpX3BoeSBzdHJ1Y3R1cmUgYXMgdGhlIGRyaXZlcgorCSAqIG1heSByZS1wcm9iZSB0aGUgUEhZIHJlZ3VsYXJ5CisJICovCisJcGh5LT5taWlfaWQgPSBtaWlfaWQ7CisJCisJLyogVGFrZSBQSFkgb3V0IG9mIGlzbG9hdGUgbW9kZSBhbmQgcmVzZXQgaXQuICovCisJcmMgPSByZXNldF9vbmVfbWlpX3BoeShwaHksIG1paV9pZCk7CisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisKKwkvKiBSZWFkIElEIGFuZCBmaW5kIG1hdGNoaW5nIGVudHJ5ICovCQorCWlkID0gKHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDEpIDw8IDE2IHwgcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikpOworCXByaW50ayhLRVJOX0RFQlVHICJQSFkgSUQ6ICV4LCBhZGRyOiAleFxuIiwgaWQsIG1paV9pZCk7CisJZm9yIChpPTA7IChkZWYgPSBtaWlfcGh5X3RhYmxlW2ldKSAhPSBOVUxMOyBpKyspCisJCWlmICgoaWQgJiBkZWYtPnBoeV9pZF9tYXNrKSA9PSBkZWYtPnBoeV9pZCkKKwkJCWJyZWFrOworCS8qIFNob3VsZCBuZXZlciBiZSBOVUxMICh3ZSBoYXZlIGEgZ2VuZXJpYyBlbnRyeSksIGJ1dC4uLiAqLworCWlmIChkZWYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCisJcGh5LT5kZWYgPSBkZWY7CisJCisJcmV0dXJuIDA7CitmYWlsOgorCXBoeS0+c3BlZWQgPSAwOworCXBoeS0+ZHVwbGV4ID0gMDsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworRVhQT1JUX1NZTUJPTChtaWlfcGh5X3Byb2JlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmNiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmgKQEAgLTAsMCArMSwxMTcgQEAKKyNpZm5kZWYgX19TVU5HRU1fUEhZX0hfXworI2RlZmluZSBfX1NVTkdFTV9QSFlfSF9fCisKK3N0cnVjdCBtaWlfcGh5OworCisvKiBPcGVyYXRpb25zIHN1cHBvcnRlZCBieSBhbnkga2luZCBvZiBQSFkgKi8KK3N0cnVjdCBtaWlfcGh5X29wcworeworCWludAkJKCppbml0KShzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKKwlpbnQJCSgqc3VzcGVuZCkoc3RydWN0IG1paV9waHkgKnBoeSk7CisJaW50CQkoKnNldHVwX2FuZWcpKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpOworCWludAkJKCpzZXR1cF9mb3JjZWQpKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGZkKTsKKwlpbnQJCSgqcG9sbF9saW5rKShzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKKwlpbnQJCSgqcmVhZF9saW5rKShzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHN0YXRpY2FsbHkgZGVmaW5lIGFuIG1paS9naWkgYmFzZWQgUEhZICovCitzdHJ1Y3QgbWlpX3BoeV9kZWYKK3sKKwl1MzIJCQkJcGh5X2lkOwkJLyogQ29uY2F0ZW5hdGVkIElEMSA8PCAxNiB8IElEMiAqLworCXUzMgkJCQlwaHlfaWRfbWFzazsJLyogU2lnbmlmaWNhbnQgYml0cyAqLworCXUzMgkJCQlmZWF0dXJlczsJLyogRXRodG9vbCBTVVBQT1JURURfKiBkZWZpbmVzICovCisJaW50CQkJCW1hZ2ljX2FuZWc7CS8qIEF1dG9uZWcgZG9lcyBhbGwgc3BlZWQgdGVzdCBmb3IgdXMgKi8KKwljb25zdCBjaGFyKgkJCW5hbWU7CisJY29uc3Qgc3RydWN0IG1paV9waHlfb3BzKglvcHM7Cit9OworCisvKiBBbiBpbnN0YW5jZSBvZiBhIFBIWSwgcGFydGlhbGx5IGJvcnJvd2VkIGZyb20gbWlpX2lmX2luZm8gKi8KK3N0cnVjdCBtaWlfcGh5Cit7CisJc3RydWN0IG1paV9waHlfZGVmKglkZWY7CisJaW50CQkJYWR2ZXJ0aXNpbmc7CisJaW50CQkJbWlpX2lkOworCisJLyogMTogYXV0b25lZyBlbmFibGVkLCAwOiBkaXNhYmxlZCAqLworCWludAkJCWF1dG9uZWc7CisKKwkvKiBmb3JjZWQgc3BlZWQgJiBkdXBsZXggKG5vIGF1dG9uZWcpCisJICogcGFydG5lciBzcGVlZCAmIGR1cGxleCAmIHBhdXNlIChhdXRvbmVnKQorCSAqLworCWludAkJCXNwZWVkOworCWludAkJCWR1cGxleDsKKwlpbnQJCQlwYXVzZTsKKworCS8qIFByb3ZpZGVkIGJ5IGhvc3QgY2hpcCAqLworCXN0cnVjdCBuZXRfZGV2aWNlKglkZXY7CisJaW50ICgqbWRpb19yZWFkKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZyk7CisJdm9pZCAoKm1kaW9fd3JpdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnLCBpbnQgdmFsKTsKK307CisKKy8qIFBhc3MgaW4gYSBzdHJ1Y3QgbWlpX3BoeSB3aXRoIGRldiwgbWRpb19yZWFkIGFuZCBtZGlvX3dyaXRlCisgKiBmaWxsZWQsIHRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgZmlsbGVkIG9uIHJldHVybgorICovCitleHRlcm4gaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCk7CisKKworLyogTUlJIGRlZmluaXRpb25zIG1pc3NpbmcgZnJvbSBtaWkuaCAqLworCisjZGVmaW5lIEJNQ1JfU1BEMgkweDAwNDAJCS8qIEdpZ2FiaXQgZW5hYmxlIChiY201NHh4KQkqLworI2RlZmluZSBMUEFfUEFVU0UJMHgwNDAwCisKKy8qIE1vcmUgUEhZIHJlZ2lzdGVycyAobW9kZWwgc3BlY2lmaWMpICovCisKKy8qIE1JSSBCQ001MjAxIE1VTFRJUEhZIGludGVycnVwdCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTIwMV9JTlRFUlJVUFQJCQkweDFBCisjZGVmaW5lIE1JSV9CQ001MjAxX0lOVEVSUlVQVF9JTlRFTkFCTEUJCTB4NDAwMAorCisjZGVmaW5lIE1JSV9CQ001MjAxX0FVWE1PREUyCQkJMHgxQgorI2RlZmluZSBNSUlfQkNNNTIwMV9BVVhNT0RFMl9MT1dQT1dFUgkJMHgwMDA4CisKKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFkgICAgICAgICAgICAgICAgICAgIDB4MUUKKworLyogTUlJIEJDTTUyMDEgTVVMVElQSFkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TRVJJQUxNT0RFICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZX1NVUEVSSVNPTEFURSAgICAgICAweDAwMDgKKworLyogTUlJIEJDTTUyMjEgQWRkaXRpb25hbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlJX0JDTTUyMjFfVEVTVAkJCTB4MWYKKyNkZWZpbmUgTUlJX0JDTTUyMjFfVEVTVF9FTkFCTEVfU0hBRE9XUwkJMHgwMDgwCisjZGVmaW5lIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9TVEFUMgkJMHgxYgorI2RlZmluZSBNSUlfQkNNNTIyMV9TSERPV19BVVhfU1RBVDJfQVBECQkweDAwMjAKKyNkZWZpbmUgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0CQkweDFhCisjZGVmaW5lIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNF9JRERRTU9ERQkweDAwMDEKKyNkZWZpbmUgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0X0NMS0xPUFdSCTB4MDAwNAorCisvKiBNSUkgQkNNNTQwMCAxMDAwLUJBU0VUIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTAkJCTB4MDkKKyNkZWZpbmUgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTF9GVUxMRFVQTEVYQ0FQCTB4MDIwMAorCisvKiBNSUkgQkNNNTQwMCBBVVhDT05UUk9MIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWENPTlRST0wgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWENPTlRST0xfUFdSMTBCQVNFVCAgICAgICAweDAwMDQKKworLyogTUlJIEJDTTU0MDAgQVVYU1RBVFVTIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVUyAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9NQVNLICAgICAweDA3MDAKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX1NISUZUICAgIDggIAorCisvKiAxMDAwQlQgY29udHJvbCAoTWFydmVsbCAmIEJDTTU0eHggYXQgbGVhc3QpICovCisjZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MCQkJMHgwOQorI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQCTB4MDIwMAorI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQCTB4MDEwMAorCisvKiBNYXJ2ZWxsIDg4RTEwMTEgUEhZIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0wJCTB4MTAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0xfTUFOVUFMX01ESVgJMHgyMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTF9BVVRPX01ESVgJMHg0MAorCisvKiBNYXJ2ZWxsIDg4RTEwMTEgUEhZIHN0YXR1cyAqLworI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTCQkweDExCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwMAkJMHg4MDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwCQkweDQwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19TUERfTUFTSwkweGMwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19GVUxMRFVQTEVYCTB4MjAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1JFU09MVkVECTB4MDgwMAorCisjZW5kaWYgLyogX19TVU5HRU1fUEhZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM3YjNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKQEAgLTAsMCArMSwzNDI2IEBACisvKiAkSWQ6IHN1bmhtZS5jLHYgMS4xMjQgMjAwMi8wMS8xNSAwNjoyNTo1MSBkYXZlbSBFeHAgJAorICogc3VuaG1lLmM6IFNwYXJjIEhNRS9CaWdNYWMgMTAvMTAwYmFzZVQgaGFsZi9mdWxsIGR1cGxleCBhdXRvIHN3aXRjaGluZywKKyAqICAgICAgICAgICBhdXRvIGNhcnJpZXIgZGV0ZWN0aW5nIGV0aGVybmV0IGRyaXZlci4gIEFsc28ga25vd24gYXMgdGhlCisgKiAgICAgICAgICAgIkhhcHB5IE1lYWwgRXRoZXJuZXQiIGZvdW5kIG9uIFN1blN3aWZ0IFNCVVMgY2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDAyLCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKiBDaGFuZ2VzIDoKKyAqIDIwMDAvMTEvMTEgV2lsbHkgVGFycmVhdSA8d2lsbHkgQVQgbWV0YS14Lm9yZz4KKyAqICAgLSBwb3J0IHRvIG5vbi1zcGFyYyBhcmNoaXRlY3R1cmVzLiBUZXN0ZWQgb25seSBvbiB4ODYgYW5kCisgKiAgICAgb25seSBjdXJyZW50bHkgd29ya3Mgd2l0aCBRRkUgUENJIGNhcmRzLgorICogICAtIGFiaWxpdHkgdG8gc3BlY2lmeSB0aGUgTUFDIGFkZHJlc3MgYXQgbW9kdWxlIGxvYWQgdGltZSBieSBwYXNzaW5nIHRoaXMKKyAqICAgICBhcmd1bWVudCA6IG1hY2FkZHI9MHgwMCwweDEwLDB4MjAsMHgzMCwweDQwLDB4NTAKKyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorICAgICAgICAic3VuaG1lLmM6djIuMDIgMjQvQXVnLzIwMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIF9fc3BhcmNfXworI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9hdXhpby5oPgorI2lmbmRlZiBfX3NwYXJjX3Y5X18KKyNpbmNsdWRlIDxhc20vaW8tdW5pdC5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8YXNtL3BibS5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInN1bmhtZS5oIgorCisKKyNkZWZpbmUgRFJWX05BTUUgInN1bmhtZSIKKworc3RhdGljIGludCBtYWNhZGRyWzZdOworCisvKiBhY2NlcHQgTUFDIGFkZHJlc3Mgb2YgdGhlIGZvcm0gbWFjYWRkcj0weDA4LDB4MDAsMHgyMCwweDMwLDB4NDAsMHg1MCAqLworbW9kdWxlX3BhcmFtX2FycmF5KG1hY2FkZHIsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hY2FkZHIsICJIYXBweSBNZWFsIE1BQyBhZGRyZXNzIHRvIHNldCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IGhhcHB5X21lYWwgKnJvb3RfaGFwcHlfZGV2OworCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBzdHJ1Y3QgcXVhdHRybyAqcWZlX3NidXNfbGlzdDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBxdWF0dHJvICpxZmVfcGNpX2xpc3Q7CisjZW5kaWYKKworI3VuZGVmIEhNRURFQlVHCisjdW5kZWYgU1hERUJVRworI3VuZGVmIFJYREVCVUcKKyN1bmRlZiBUWERFQlVHCisjdW5kZWYgVFhMT0dHSU5HCisKKyNpZmRlZiBUWExPR0dJTkcKK3N0cnVjdCBobWVfdHhfbG9nZW50IHsKKwl1bnNpZ25lZCBpbnQgdHN0YW1wOworCWludCB0eF9uZXcsIHR4X29sZDsKKwl1bnNpZ25lZCBpbnQgYWN0aW9uOworI2RlZmluZSBUWExPR19BQ1RJT05fSVJRCTB4MDEKKyNkZWZpbmUgVFhMT0dfQUNUSU9OX1RYTUlUCTB4MDIKKyNkZWZpbmUgVFhMT0dfQUNUSU9OX1RCVVNZCTB4MDQKKyNkZWZpbmUgVFhMT0dfQUNUSU9OX05CVUZTCTB4MDgKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworfTsKKyNkZWZpbmUgVFhfTE9HX0xFTgkxMjgKK3N0YXRpYyBzdHJ1Y3QgaG1lX3R4X2xvZ2VudCB0eF9sb2dbVFhfTE9HX0xFTl07CitzdGF0aWMgaW50IHR4bG9nX2N1cl9lbnRyeTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdHhfYWRkX2xvZyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgcykKK3sKKwlzdHJ1Y3QgaG1lX3R4X2xvZ2VudCAqdGxwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2FuZF9jbGkoZmxhZ3MpOworCXRscCA9ICZ0eF9sb2dbdHhsb2dfY3VyX2VudHJ5XTsKKwl0bHAtPnRzdGFtcCA9ICh1bnNpZ25lZCBpbnQpamlmZmllczsKKwl0bHAtPnR4X25ldyA9IGhwLT50eF9uZXc7CisJdGxwLT50eF9vbGQgPSBocC0+dHhfb2xkOworCXRscC0+YWN0aW9uID0gYTsKKwl0bHAtPnN0YXR1cyA9IHM7CisJdHhsb2dfY3VyX2VudHJ5ID0gKHR4bG9nX2N1cl9lbnRyeSArIDEpICYgKFRYX0xPR19MRU4gLSAxKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdHhfZHVtcF9sb2codm9pZCkKK3sKKwlpbnQgaSwgdGhpczsKKworCXRoaXMgPSB0eGxvZ19jdXJfZW50cnk7CisJZm9yIChpID0gMDsgaSA8IFRYX0xPR19MRU47IGkrKykgeworCQlwcmludGsoIlRYTE9HWyVkXTogalslMDh4XSB0eFtOKCVkKU8oJWQpXSBhY3Rpb25bJTA4eF0gc3RhdFslMDh4XVxuIiwgaSwKKwkJICAgICAgIHR4X2xvZ1t0aGlzXS50c3RhbXAsCisJCSAgICAgICB0eF9sb2dbdGhpc10udHhfbmV3LCB0eF9sb2dbdGhpc10udHhfb2xkLAorCQkgICAgICAgdHhfbG9nW3RoaXNdLmFjdGlvbiwgdHhfbG9nW3RoaXNdLnN0YXR1cyk7CisJCXRoaXMgPSAodGhpcyArIDEpICYgKFRYX0xPR19MRU4gLSAxKTsKKwl9Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHR4X2R1bXBfcmluZyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgKmhiID0gaHAtPmhhcHB5X2Jsb2NrOworCXN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdHAgPSAmaGItPmhhcHB5X21lYWxfdHhkWzBdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSs9NCkgeworCQlwcmludGsoIlRYRFslZC4uJWRdOiBbJTA4eDolMDh4XSBbJTA4eDolMDh4XSBbJTA4eDolMDh4XSBbJTA4eDolMDh4XVxuIiwKKwkJICAgICAgIGksIGkgKyA0LAorCQkgICAgICAgbGUzMl90b19jcHUodHBbaV0udHhfZmxhZ3MpLCBsZTMyX3RvX2NwdSh0cFtpXS50eF9hZGRyKSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRwW2kgKyAxXS50eF9mbGFncyksIGxlMzJfdG9fY3B1KHRwW2kgKyAxXS50eF9hZGRyKSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRwW2kgKyAyXS50eF9mbGFncyksIGxlMzJfdG9fY3B1KHRwW2kgKyAyXS50eF9hZGRyKSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRwW2kgKyAzXS50eF9mbGFncyksIGxlMzJfdG9fY3B1KHRwW2kgKyAzXS50eF9hZGRyKSk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgdHhfYWRkX2xvZyhocCwgYSwgcykJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSB0eF9kdW1wX2xvZygpCQkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHR4X2R1bXBfcmluZyhocCkJCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBITUVERUJVRworI2RlZmluZSBITUQoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBITUQoeCkKKyNlbmRpZgorCisvKiAjZGVmaW5lIEFVVE9fU1dJVENIX0RFQlVHICovCisKKyNpZmRlZiBBVVRPX1NXSVRDSF9ERUJVRworI2RlZmluZSBBU0QoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBBU0QoeCkKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfSVBHMCAgICAgIDE2IC8qIEZvciBsYW5jZS1tb2RlIG9ubHkgKi8KKyNkZWZpbmUgREVGQVVMVF9JUEcxICAgICAgIDggLyogRm9yIGFsbCBtb2RlcyAqLworI2RlZmluZSBERUZBVUxUX0lQRzIgICAgICAgNCAvKiBGb3IgYWxsIG1vZGVzICovCisjZGVmaW5lIERFRkFVTFRfSkFNU0laRSAgICA0IC8qIFRvZSBqYW0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChNT0RVTEUpCisvKiBUaGlzIGhhcHB5X3BjaV9pZHMgaXMgZGVjbGFyZWQgX19pbml0ZGF0YSBiZWNhdXNlIGl0IGlzIG9ubHkgdXNlZAorICAgYXMgYW4gYWR2aXNvcnkgdG8gZGVwbW9kLiAgSWYgdGhpcyBpcyBwb3J0ZWQgdG8gdGhlIG5ldyBQQ0kgaW50ZXJmYWNlCisgICB3aGVyZSBpdCBjb3VsZCBiZSByZWZlcmVuY2VkIGF0IGFueSB0aW1lIGR1ZSB0byBob3QgcGx1Z2dpbmcsCisgICB0aGUgX19pbml0ZGF0YSByZWZlcmVuY2Ugc2hvdWxkIGJlIHJlbW92ZWQuICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBoYXBweW1lYWxfcGNpX2lkc1tdID0geworCXsKKwkgIC52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX1NVTiwKKwkgIC5kZXZpY2UJPSBQQ0lfREVWSUNFX0lEX1NVTl9IQVBQWU1FQUwsCisJICAuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkgIC5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBoYXBweW1lYWxfcGNpX2lkcyk7CisKKyNlbmRpZgorCisvKiBOT1RFOiBJbiB0aGUgZGVzY3JpcHRvciB3cml0ZXMgb25lIF9tdXN0XyB3cml0ZSB0aGUgYWRkcmVzcworICoJIG1lbWJlciBfZmlyc3RfLiAgVGhlIGNhcmQgbXVzdCBub3QgYmUgYWxsb3dlZCB0byBzZWUKKyAqCSB0aGUgdXBkYXRlZCBkZXNjcmlwdG9yIGZsYWdzIHVudGlsIHRoZSBhZGRyZXNzIGlzCisgKgkgY29ycmVjdC4gIEkndmUgYWRkZWQgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZXR3ZWVuCisgKgkgdGhlIHR3byBzdG9yZXMgc28gdGhhdCBJIGNhbiBzbGVlcCB3ZWxsIGF0IG5pZ2h0Li4uIC1EYXZlTQorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCitzdGF0aWMgdm9pZCBzYnVzX2htZV93cml0ZTMyKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsKQoreworCXNidXNfd3JpdGVsKHZhbCwgcmVnKTsKK30KKworc3RhdGljIHUzMiBzYnVzX2htZV9yZWFkMzIodm9pZCBfX2lvbWVtICpyZWcpCit7CisJcmV0dXJuIHNidXNfcmVhZGwocmVnKTsKK30KKworc3RhdGljIHZvaWQgc2J1c19obWVfd3JpdGVfcnhkKHN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqcnhkLCB1MzIgZmxhZ3MsIHUzMiBhZGRyKQoreworCXJ4ZC0+cnhfYWRkciA9IGFkZHI7CisJd21iKCk7CisJcnhkLT5yeF9mbGFncyA9IGZsYWdzOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2htZV93cml0ZV90eGQoc3RydWN0IGhhcHB5X21lYWxfdHhkICp0eGQsIHUzMiBmbGFncywgdTMyIGFkZHIpCit7CisJdHhkLT50eF9hZGRyID0gYWRkcjsKKwl3bWIoKTsKKwl0eGQtPnR4X2ZsYWdzID0gZmxhZ3M7Cit9CisKK3N0YXRpYyB1MzIgc2J1c19obWVfcmVhZF9kZXNjMzIodTMyICpwKQoreworCXJldHVybiAqcDsKK30KKworc3RhdGljIHZvaWQgcGNpX2htZV93cml0ZTMyKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB1MzIgcGNpX2htZV9yZWFkMzIodm9pZCBfX2lvbWVtICpyZWcpCit7CisJcmV0dXJuIHJlYWRsKHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9obWVfd3JpdGVfcnhkKHN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqcnhkLCB1MzIgZmxhZ3MsIHUzMiBhZGRyKQoreworCXJ4ZC0+cnhfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCXdtYigpOworCXJ4ZC0+cnhfZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9obWVfd3JpdGVfdHhkKHN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdHhkLCB1MzIgZmxhZ3MsIHUzMiBhZGRyKQoreworCXR4ZC0+dHhfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCXdtYigpOworCXR4ZC0+dHhfZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7Cit9CisKK3N0YXRpYyB1MzIgcGNpX2htZV9yZWFkX2Rlc2MzMih1MzIgKnApCit7CisJcmV0dXJuIGNwdV90b19sZTMycChwKTsKK30KKworI2RlZmluZSBobWVfd3JpdGUzMihfX2hwLCBfX3JlZywgX192YWwpIFwKKwkoKF9faHApLT53cml0ZTMyKChfX3JlZyksIChfX3ZhbCkpKQorI2RlZmluZSBobWVfcmVhZDMyKF9faHAsIF9fcmVnKSBcCisJKChfX2hwKS0+cmVhZDMyKF9fcmVnKSkKKyNkZWZpbmUgaG1lX3dyaXRlX3J4ZChfX2hwLCBfX3J4ZCwgX19mbGFncywgX19hZGRyKSBcCisJKChfX2hwKS0+d3JpdGVfcnhkKChfX3J4ZCksIChfX2ZsYWdzKSwgKF9fYWRkcikpKQorI2RlZmluZSBobWVfd3JpdGVfdHhkKF9faHAsIF9fdHhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKKwkoKF9faHApLT53cml0ZV90eGQoKF9fdHhkKSwgKF9fZmxhZ3MpLCAoX19hZGRyKSkpCisjZGVmaW5lIGhtZV9yZWFkX2Rlc2MzMihfX2hwLCBfX3ApIFwKKwkoKF9faHApLT5yZWFkX2Rlc2MzMihfX3ApKQorI2RlZmluZSBobWVfZG1hX21hcChfX2hwLCBfX3B0ciwgX19zaXplLCBfX2RpcikgXAorCSgoX19ocCktPmRtYV9tYXAoKF9faHApLT5oYXBweV9kZXYsIChfX3B0ciksIChfX3NpemUpLCAoX19kaXIpKSkKKyNkZWZpbmUgaG1lX2RtYV91bm1hcChfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwkoKF9faHApLT5kbWFfdW5tYXAoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfY3B1KF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCSgoX19ocCktPmRtYV9zeW5jX2Zvcl9jcHUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfZGV2aWNlKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCSgoX19ocCktPmRtYV9zeW5jX2Zvcl9kZXZpY2UoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisjZWxzZQorI2lmZGVmIENPTkZJR19TQlVTCisvKiBTQlVTIG9ubHkgY29tcGlsYXRpb24gKi8KKyNkZWZpbmUgaG1lX3dyaXRlMzIoX19ocCwgX19yZWcsIF9fdmFsKSBcCisJc2J1c193cml0ZWwoKF9fdmFsKSwgKF9fcmVnKSkKKyNkZWZpbmUgaG1lX3JlYWQzMihfX2hwLCBfX3JlZykgXAorCXNidXNfcmVhZGwoX19yZWcpCisjZGVmaW5lIGhtZV93cml0ZV9yeGQoX19ocCwgX19yeGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorZG8gewkoX19yeGQpLT5yeF9hZGRyID0gKF9fYWRkcik7IFwKKwl3bWIoKTsgXAorCShfX3J4ZCktPnJ4X2ZsYWdzID0gKF9fZmxhZ3MpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIGhtZV93cml0ZV90eGQoX19ocCwgX190eGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorZG8gewkoX190eGQpLT50eF9hZGRyID0gKF9fYWRkcik7IFwKKwl3bWIoKTsgXAorCShfX3R4ZCktPnR4X2ZsYWdzID0gKF9fZmxhZ3MpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIGhtZV9yZWFkX2Rlc2MzMihfX2hwLCBfX3ApCSgqKF9fcCkpCisjZGVmaW5lIGhtZV9kbWFfbWFwKF9faHAsIF9fcHRyLCBfX3NpemUsIF9fZGlyKSBcCisJc2J1c19tYXBfc2luZ2xlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV91bm1hcChfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlzYnVzX3VubWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2NwdShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfZGV2aWNlKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNlbHNlCisvKiBQQ0kgb25seSBjb21waWxhdGlvbiAqLworI2RlZmluZSBobWVfd3JpdGUzMihfX2hwLCBfX3JlZywgX192YWwpIFwKKwl3cml0ZWwoKF9fdmFsKSwgKF9fcmVnKSkKKyNkZWZpbmUgaG1lX3JlYWQzMihfX2hwLCBfX3JlZykgXAorCXJlYWRsKF9fcmVnKQorI2RlZmluZSBobWVfd3JpdGVfcnhkKF9faHAsIF9fcnhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKK2RvIHsJKF9fcnhkKS0+cnhfYWRkciA9IGNwdV90b19sZTMyKF9fYWRkcik7IFwKKwl3bWIoKTsgXAorCShfX3J4ZCktPnJ4X2ZsYWdzID0gY3B1X3RvX2xlMzIoX19mbGFncyk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgaG1lX3dyaXRlX3R4ZChfX2hwLCBfX3R4ZCwgX19mbGFncywgX19hZGRyKSBcCitkbyB7CShfX3R4ZCktPnR4X2FkZHIgPSBjcHVfdG9fbGUzMihfX2FkZHIpOyBcCisJd21iKCk7IFwKKwkoX190eGQpLT50eF9mbGFncyA9IGNwdV90b19sZTMyKF9fZmxhZ3MpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIGhtZV9yZWFkX2Rlc2MzMihfX2hwLCBfX3ApCWNwdV90b19sZTMycChfX3ApCisjZGVmaW5lIGhtZV9kbWFfbWFwKF9faHAsIF9fcHRyLCBfX3NpemUsIF9fZGlyKSBcCisJcGNpX21hcF9zaW5nbGUoKF9faHApLT5oYXBweV9kZXYsIChfX3B0ciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3VubWFwKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXBjaV91bm1hcF9zaW5nbGUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9jcHUoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfZGV2aWNlKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2VuZGlmCisjZW5kaWYKKworCisjaWZkZWYgU0JVU19ETUFfQklESVJFQ1RJT05BTAorIwlkZWZpbmUgRE1BX0JJRElSRUNUSU9OQUwJU0JVU19ETUFfQklESVJFQ1RJT05BTAorI2Vsc2UKKyMJZGVmaW5lIERNQV9CSURJUkVDVElPTkFMCTAKKyNlbmRpZgorCisjaWZkZWYgU0JVU19ETUFfRlJPTURFVklDRQorIwlkZWZpbmUgRE1BX0ZST01ERVZJQ0UJCVNCVVNfRE1BX0ZST01ERVZJQ0UKKyNlbHNlCisjCWRlZmluZSBETUFfVE9ERVZJQ0UJCTEKKyNlbmRpZgorCisjaWZkZWYgU0JVU19ETUFfVE9ERVZJQ0UKKyMJZGVmaW5lIERNQV9UT0RFVklDRQkJU0JVU19ETUFfVE9ERVZJQ0UKKyNlbHNlCisjCWRlZmluZSBETUFfRlJPTURFVklDRQkJMgorI2VuZGlmCisKKworLyogT2ggeWVzLCB0aGUgTUlGIEJpdEJhbmcgaXMgbWlnaHR5IGZ1biB0byBwcm9ncmFtLiAgQml0QnVja2V0IGlzIG1vcmUgbGlrZSBpdC4gKi8KK3N0YXRpYyB2b2lkIEJCX1BVVF9CSVQoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgYml0KQoreworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJEQVRBLCBiaXQpOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMCk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAxKTsKK30KKworI2lmIDAKK3N0YXRpYyB1MzIgQkJfR0VUX0JJVChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCBpbnRlcm5hbCkKK3sKKwl1MzIgcmV0OworCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAwKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDEpOworCXJldCA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpOworCWlmIChpbnRlcm5hbCkKKwkJcmV0ICY9IFRDVl9DRkdfTURJTzA7CisJZWxzZQorCQlyZXQgJj0gVENWX0NGR19NRElPMTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIHUzMiBCQl9HRVRfQklUMihzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCBpbnRlcm5hbCkKK3sKKwl1MzIgcmV0dmFsOworCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAwKTsKKwl1ZGVsYXkoMSk7CisJcmV0dmFsID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRyk7CisJaWYgKGludGVybmFsKQorCQlyZXR2YWwgJj0gVENWX0NGR19NRElPMDsKKwllbHNlCisJCXJldHZhbCAmPSBUQ1ZfQ0ZHX01ESU8xOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFRDVlJfRkFJTFVSRSAgICAgIDB4ODAwMDAwMDAgICAgIC8qIEltcG9zc2libGUgTUlGIHJlYWQgdmFsdWUgKi8KKworc3RhdGljIGludCBoYXBweV9tZWFsX2JiX3JlYWQoc3RydWN0IGhhcHB5X21lYWwgKmhwLAorCQkJICAgICAgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IHJlZykKK3sKKwl1MzIgdG1wOworCWludCByZXR2YWwgPSAwOworCWludCBpOworCisJQVNEKCgiaGFwcHlfbWVhbF9iYl9yZWFkOiByZWc9JWQgIiwgcmVnKSk7CisKKwkvKiBFbmFibGUgdGhlIE1JRiBCaXRCYW5nIG91dHB1dHMuICovCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQk9FTkFCLCAxKTsKKworCS8qIEZvcmNlIEJpdEJhbmcgaW50byB0aGUgaWRsZSBzdGF0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCisJLyogR2l2ZSBpdCB0aGUgcmVhZCBzZXF1ZW5jZS4gKi8KKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMCk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMCk7CisKKwkvKiBHaXZlIGl0IHRoZSBQSFkgYWRkcmVzcy4gKi8KKwl0bXAgPSBocC0+cGFkZHIgJiAweGZmOworCWZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgKCh0bXAgPj4gaSkgJiAxKSk7CisKKwkvKiBUZWxsIGl0IHdoYXQgcmVnaXN0ZXIgd2Ugd2FudCB0byByZWFkLiAqLworCXRtcCA9IChyZWcgJiAweGZmKTsKKwlmb3IgKGkgPSA0OyBpID49IDA7IGktLSkKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsICgodG1wID4+IGkpICYgMSkpOworCisJLyogQ2xvc2UgZG93biB0aGUgTUlGIEJpdEJhbmcgb3V0cHV0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCT0VOQUIsIDApOworCisJLyogTm93IHJlYWQgaW4gdGhlIHZhbHVlLiAqLworCSh2b2lkKSBCQl9HRVRfQklUMihocCwgdHJlZ3MsIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSk7CisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKQorCQlyZXR2YWwgfD0gQkJfR0VUX0JJVDIoaHAsIHRyZWdzLCAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkpOworCSh2b2lkKSBCQl9HRVRfQklUMihocCwgdHJlZ3MsIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSk7CisJKHZvaWQpIEJCX0dFVF9CSVQyKGhwLCB0cmVncywgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpKTsKKwkodm9pZCkgQkJfR0VUX0JJVDIoaHAsIHRyZWdzLCAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkpOworCUFTRCgoInZhbHVlPSV4XG4iLCByZXR2YWwpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX2JiX3dyaXRlKHN0cnVjdCBoYXBweV9tZWFsICpocCwKKwkJCQl2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXUzMiB0bXA7CisJaW50IGk7CisKKwlBU0QoKCJoYXBweV9tZWFsX2JiX3dyaXRlOiByZWc9JWQgdmFsdWU9JXhcbiIsIHJlZywgdmFsdWUpKTsKKworCS8qIEVuYWJsZSB0aGUgTUlGIEJpdEJhbmcgb3V0cHV0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCT0VOQUIsIDEpOworCisJLyogRm9yY2UgQml0QmFuZyBpbnRvIHRoZSBpZGxlIHN0YXRlLiAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisKKwkvKiBHaXZlIGl0IHdyaXRlIHNlcXVlbmNlLiAqLworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAwKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDApOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKworCS8qIEdpdmUgaXQgdGhlIFBIWSBhZGRyZXNzLiAqLworCXRtcCA9IChocC0+cGFkZHIgJiAweGZmKTsKKwlmb3IgKGkgPSA0OyBpID49IDA7IGktLSkKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsICgodG1wID4+IGkpICYgMSkpOworCisJLyogVGVsbCBpdCB3aGF0IHJlZ2lzdGVyIHdlIHdpbGwgYmUgd3JpdGluZy4gKi8KKwl0bXAgPSAocmVnICYgMHhmZik7CisJZm9yIChpID0gNDsgaSA+PSAwOyBpLS0pCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAoKHRtcCA+PiBpKSAmIDEpKTsKKworCS8qIFRlbGwgaXQgdG8gYmVjb21lIHJlYWR5IGZvciB0aGUgYml0cy4gKi8KKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDApOworCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgKCh2YWx1ZSA+PiBpKSAmIDEpKTsKKworCS8qIENsb3NlIGRvd24gdGhlIE1JRiBCaXRCYW5nIG91dHB1dHMuICovCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQk9FTkFCLCAwKTsKK30KKworI2RlZmluZSBUQ1ZSX1JFQURfVFJJRVMgICAxNgorCitzdGF0aWMgaW50IGhhcHB5X21lYWxfdGN2cl9yZWFkKHN0cnVjdCBoYXBweV9tZWFsICpocCwKKwkJCQl2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgcmVnKQoreworCWludCB0cmllcyA9IFRDVlJfUkVBRF9UUklFUzsKKwlpbnQgcmV0dmFsOworCisJQVNEKCgiaGFwcHlfbWVhbF90Y3ZyX3JlYWQ6IHJlZz0weCUwMnggIiwgcmVnKSk7CisJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gbm9uZSkgeworCQlBU0QoKCJubyB0cmFuc2NlaXZlciwgdmFsdWU9VENWUl9GQUlMVVJFXG4iKSk7CisJCXJldHVybiBUQ1ZSX0ZBSUxVUkU7CisJfQorCisJaWYgKCEoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfRkVOQUJMRSkpIHsKKwkJQVNEKCgiZG9pbmcgYml0IGJhbmdcbiIpKTsKKwkJcmV0dXJuIGhhcHB5X21lYWxfYmJfcmVhZChocCwgdHJlZ3MsIHJlZyk7CisJfQorCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9GUkFNRSwKKwkJICAgIChGUkFNRV9SRUFEIHwgKGhwLT5wYWRkciA8PCAyMykgfCAoKHJlZyAmIDB4ZmYpIDw8IDE4KSkpOworCXdoaWxlICghKGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9GUkFNRSkgJiAweDEwMDAwKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCWlmICghdHJpZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBBaWVlZSwgdHJhbnNjZWl2ZXIgTUlGIHJlYWQgYm9saXhlZFxuIik7CisJCXJldHVybiBUQ1ZSX0ZBSUxVUkU7CisJfQorCXJldHZhbCA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9GUkFNRSkgJiAweGZmZmY7CisJQVNEKCgidmFsdWU9JTA0eFxuIiwgcmV0dmFsKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBUQ1ZSX1dSSVRFX1RSSUVTICAxNgorCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3RjdnJfd3JpdGUoc3RydWN0IGhhcHB5X21lYWwgKmhwLAorCQkJCSAgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IHJlZywKKwkJCQkgIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCB0cmllcyA9IFRDVlJfV1JJVEVfVFJJRVM7CisJCisJQVNEKCgiaGFwcHlfbWVhbF90Y3ZyX3dyaXRlOiByZWc9MHglMDJ4IHZhbHVlPSUwNHhcbiIsIHJlZywgdmFsdWUpKTsKKworCS8qIFdlbGNvbWUgdG8gU3VuIE1pY3Jvc3lzdGVtcywgY2FuIEkgdGFrZSB5b3VyIG9yZGVyIHBsZWFzZT8gKi8KKwlpZiAoIShocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19GRU5BQkxFKSkgeworCQloYXBweV9tZWFsX2JiX3dyaXRlKGhwLCB0cmVncywgcmVnLCB2YWx1ZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXb3VsZCB5b3UgbGlrZSBmcmllcyB3aXRoIHRoYXQ/ICovCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9GUkFNRSwKKwkJICAgIChGUkFNRV9XUklURSB8IChocC0+cGFkZHIgPDwgMjMpIHwKKwkJICAgICAoKHJlZyAmIDB4ZmYpIDw8IDE4KSB8ICh2YWx1ZSAmIDB4ZmZmZikpKTsKKwl3aGlsZSAoIShobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfRlJBTUUpICYgMHgxMDAwMCkgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKworCS8qIEFueXRoaW5nIGVsc2U/ICovCisJaWYgKCF0cmllcykKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBBaWVlZSwgdHJhbnNjZWl2ZXIgTUlGIHdyaXRlIGJvbGl4ZWRcbiIpOworCisJLyogRmlmdHktdHdvIGNlbnRzIGlzIHlvdXIgY2hhbmdlLCBoYXZlIGEgbmljZSBkYXkuICovCit9CisKKy8qIEF1dG8gbmVnb3RpYXRpb24uICBUaGUgc2NoZW1lIGlzIHZlcnkgc2ltcGxlLiAgV2UgaGF2ZSBhIHRpbWVyIHJvdXRpbmUKKyAqIHRoYXQga2VlcHMgd2F0Y2hpbmcgdGhlIGF1dG8gbmVnb3RpYXRpb24gcHJvY2VzcyBhcyBpdCBwcm9ncmVzc2VzLgorICogVGhlIERQODM4NDAgaXMgZmlyc3QgdG9sZCB0byBzdGFydCBkb2luZyBpdCdzIHRoaW5nLCB3ZSBzZXQgdXAgdGhlIHRpbWUKKyAqIGFuZCBwbGFjZSB0aGUgdGltZXIgc3RhdGUgbWFjaGluZSBpbiBpdCdzIGluaXRpYWwgc3RhdGUuCisgKgorICogSGVyZSB0aGUgdGltZXIgcGVla3MgYXQgdGhlIERQODM4NDAgc3RhdHVzIHJlZ2lzdGVycyBhdCBlYWNoIGNsaWNrIHRvIHNlZQorICogaWYgdGhlIGF1dG8gbmVnb3RpYXRpb24gaGFzIGNvbXBsZXRlZCwgd2UgYXNzdW1lIGhlcmUgdGhhdCB0aGUgRFA4Mzg0MCBQSFkKKyAqIHdpbGwgdGltZSBvdXQgYXQgc29tZSBwb2ludCBhbmQganVzdCB0ZWxsIHVzIHdoYXQgKGRpZG4ndCkgaGFwcGVuLiAgRm9yCisgKiBjb21wbGV0ZSBjb3ZlcmFnZSB3ZSBvbmx5IGFsbG93IHNvIG1hbnkgb2YgdGhlIHRpY2tzIGF0IHRoaXMgbGV2ZWwgdG8gcnVuLAorICogd2hlbiB0aGlzIGhhcyBleHBpcmVkIHdlIHByaW50IGEgd2FybmluZyBtZXNzYWdlIGFuZCB0cnkgYW5vdGhlciBzdHJhdGVneS4KKyAqIFRoaXMgIm90aGVyIiBzdHJhdGVneSBpcyB0byBmb3JjZSB0aGUgaW50ZXJmYWNlIGludG8gdmFyaW91cyBzcGVlZC9kdXBsZXgKKyAqIGNvbmZpZ3VyYXRpb25zIGFuZCB3ZSBzdG9wIHdoZW4gd2Ugc2VlIGEgbGluay11cCBjb25kaXRpb24gYmVmb3JlIHRoZQorICogbWF4aW11bSBudW1iZXIgb2YgInBlZWsiIHRpY2tzIGhhdmUgb2NjdXJyZWQuCisgKgorICogT25jZSBhIHZhbGlkIGxpbmsgc3RhdHVzIGhhcyBiZWVuIGRldGVjdGVkIHdlIGNvbmZpZ3VyZSB0aGUgQmlnTUFDIGFuZAorICogdGhlIHJlc3Qgb2YgdGhlIEhhcHB5IE1lYWwgdG8gc3BlYWsgdGhlIG1vc3QgZWZmaWNpZW50IHByb3RvY29sIHdlIGNvdWxkCisgKiBnZXQgYSBjbGVhbiBsaW5rIGZvci4gIFRoZSBwcmlvcml0eSBmb3IgbGluayBjb25maWd1cmF0aW9ucywgaGlnaGVzdCBmaXJzdAorICogaXM6CisgKiAgICAgICAgICAgICAgICAgMTAwIEJhc2UtVCBGdWxsIER1cGxleAorICogICAgICAgICAgICAgICAgIDEwMCBCYXNlLVQgSGFsZiBEdXBsZXgKKyAqICAgICAgICAgICAgICAgICAxMCBCYXNlLVQgRnVsbCBEdXBsZXgKKyAqICAgICAgICAgICAgICAgICAxMCBCYXNlLVQgSGFsZiBEdXBsZXgKKyAqCisgKiBXZSBzdGFydCBhIG5ldyB0aW1lciBub3csIGFmdGVyIGEgc3VjY2Vzc2Z1bCBhdXRvIG5lZ290aWF0aW9uIHN0YXR1cyBoYXMKKyAqIGJlZW4gZGV0ZWN0ZWQuICBUaGlzIHRpbWVyIGp1c3Qgd2FpdHMgZm9yIHRoZSBsaW5rLXVwIGJpdCB0byBnZXQgc2V0IGluCisgKiB0aGUgQk1DUiBvZiB0aGUgRFA4Mzg0MC4gIFdoZW4gdGhpcyBvY2N1cnMgd2UgcHJpbnQgYSBrZXJuZWwgbG9nIG1lc3NhZ2UKKyAqIGRlc2NyaWJpbmcgdGhlIGxpbmsgdHlwZSBpbiB1c2UgYW5kIHRoZSBmYWN0IHRoYXQgaXQgaXMgdXAuCisgKgorICogSWYgYSBmYXRhbCBlcnJvciBvZiBzb21lIHNvcnQgaXMgc2lnbmFsbGVkIGFuZCBkZXRlY3RlZCBpbiB0aGUgaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUsIGFuZCB0aGUgY2hpcCBpcyByZXNldCwgb3IgdGhlIGxpbmsgaXMgaWZjb25maWcnZCBkb3duCisgKiBhbmQgdGhlbiBiYWNrIHVwLCB0aGlzIGVudGlyZSBwcm9jZXNzIHJlcGVhdHMgaXRzZWxmIGFsbCBvdmVyIGFnYWluLgorICovCitzdGF0aWMgaW50IHRyeV9uZXh0X3Blcm11dGF0aW9uKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCisJLyogRG93bmdyYWRlIGZyb20gZnVsbCB0byBoYWxmIGR1cGxleC4gIE9ubHkgcG9zc2libGUKKwkgKiB2aWEgZXRodG9vbC4KKwkgKi8KKwlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX0ZVTExEUExYKSB7CisJCWhwLT5zd19ibWNyICY9IH4oQk1DUl9GVUxMRFBMWCk7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisJCXJldHVybiAwOworCX0KKworCS8qIERvd25ncmFkZSBmcm9tIDEwMCB0byAxMC4gKi8KKwlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX1NQRUVEMTAwKSB7CisJCWhwLT5zd19ibWNyICY9IH4oQk1DUl9TUEVFRDEwMCk7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlJ3ZlIHRyaWVkIGV2ZXJ5dGhpbmcuICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpbmtfbW9kZShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgdXAgdXNpbmcgIiwgaHAtPmRldi0+bmFtZSk7CisJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpCisJCXByaW50aygiZXh0ZXJuYWwgIik7CisJZWxzZQorCQlwcmludGsoImludGVybmFsICIpOworCXByaW50aygidHJhbnNjZWl2ZXIgYXQgIik7CisJaHAtPnN3X2xwYSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0xQQSk7CisJaWYgKGhwLT5zd19scGEgJiAoTFBBXzEwMEhBTEYgfCBMUEFfMTAwRlVMTCkpIHsKKwkJaWYgKGhwLT5zd19scGEgJiBMUEFfMTAwRlVMTCkKKwkJCXByaW50aygiMTAwTWIvcywgRnVsbCBEdXBsZXguXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIxMDBNYi9zLCBIYWxmIER1cGxleC5cbiIpOworCX0gZWxzZSB7CisJCWlmIChocC0+c3dfbHBhICYgTFBBXzEwRlVMTCkKKwkJCXByaW50aygiMTBNYi9zLCBGdWxsIER1cGxleC5cbiIpOworCQllbHNlCisJCQlwcmludGsoIjEwTWIvcywgSGFsZiBEdXBsZXguXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZm9yY2VkX2xpbmtfbW9kZShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaGFzIGJlZW4gZm9yY2VkIHVwIHVzaW5nICIsIGhwLT5kZXYtPm5hbWUpOworCWlmIChocC0+dGN2cl90eXBlID09IGV4dGVybmFsKQorCQlwcmludGsoImV4dGVybmFsICIpOworCWVsc2UKKwkJcHJpbnRrKCJpbnRlcm5hbCAiKTsKKwlwcmludGsoInRyYW5zY2VpdmVyIGF0ICIpOworCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9TUEVFRDEwMCkKKwkJcHJpbnRrKCIxMDBNYi9zLCAiKTsKKwllbHNlCisJCXByaW50aygiMTBNYi9zLCAiKTsKKwlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX0ZVTExEUExYKQorCQlwcmludGsoIkZ1bGwgRHVwbGV4LlxuIik7CisJZWxzZQorCQlwcmludGsoIkhhbGYgRHVwbGV4LlxuIik7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2hhcHB5X2xpbmtfbW9kZXMoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWludCBmdWxsOworCisJLyogQWxsIHdlIGNhcmUgYWJvdXQgaXMgbWFraW5nIHN1cmUgdGhlIGJpZ21hYyB0eF9jZmcgaGFzIGEKKwkgKiBwcm9wZXIgZHVwbGV4IHNldHRpbmcuCisJICovCisJaWYgKGhwLT50aW1lcl9zdGF0ZSA9PSBhcmJ3YWl0KSB7CisJCWhwLT5zd19scGEgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9MUEEpOworCQlpZiAoIShocC0+c3dfbHBhICYgKExQQV8xMEhBTEYgfCBMUEFfMTBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwRlVMTCkpKQorCQkJZ290byBub19yZXNwb25zZTsKKwkJaWYgKGhwLT5zd19scGEgJiBMUEFfMTAwRlVMTCkKKwkJCWZ1bGwgPSAxOworCQllbHNlIGlmIChocC0+c3dfbHBhICYgTFBBXzEwMEhBTEYpCisJCQlmdWxsID0gMDsKKwkJZWxzZSBpZiAoaHAtPnN3X2xwYSAmIExQQV8xMEZVTEwpCisJCQlmdWxsID0gMTsKKwkJZWxzZQorCQkJZnVsbCA9IDA7CisJfSBlbHNlIHsKKwkJLyogRm9yY2luZyBhIGxpbmsgbW9kZS4gKi8KKwkJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9GVUxMRFBMWCkKKwkJCWZ1bGwgPSAxOworCQllbHNlCisJCQlmdWxsID0gMDsKKwl9CisKKwkvKiBCZWZvcmUgY2hhbmdpbmcgb3RoZXIgYml0cyBpbiB0aGUgdHhfY2ZnIHJlZ2lzdGVyLCBhbmQgaW4KKwkgKiBnZW5lcmFsIGFueSBvZiBvdGhlciB0aGUgVFggY29uZmlnIHJlZ2lzdGVycyB0b28sIHlvdQorCSAqIG11c3Q6CisJICogMSkgQ2xlYXIgRW5hYmxlCisJICogMikgUG9sbCB3aXRoIHJlYWRzIHVudGlsIHRoYXQgYml0IHJlYWRzIGJhY2sgYXMgemVybworCSAqIDMpIE1ha2UgVFggY29uZmlndXJhdGlvbiBjaGFuZ2VzCisJICogNCkgU2V0IEVuYWJsZSBvbmNlIG1vcmUKKwkgKi8KKwlobWVfd3JpdGUzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSAmCisJCSAgICB+KEJJR01BQ19UWENGR19FTkFCTEUpKTsKKwl3aGlsZSAoaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSAmIEJJR01BQ19UWENGR19FTkFCTEUpCisJCWJhcnJpZXIoKTsKKwlpZiAoZnVsbCkgeworCQlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfRlVMTDsKKwkJaG1lX3dyaXRlMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpIHwKKwkJCSAgICBCSUdNQUNfVFhDRkdfRlVMTERQTFgpOworCX0gZWxzZSB7CisJCWhwLT5oYXBweV9mbGFncyAmPSB+KEhGTEFHX0ZVTEwpOworCQlobWVfd3JpdGUzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykgJgorCQkJICAgIH4oQklHTUFDX1RYQ0ZHX0ZVTExEUExYKSk7CisJfQorCWhtZV93cml0ZTMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpIHwKKwkJICAgIEJJR01BQ19UWENGR19FTkFCTEUpOworCXJldHVybiAwOworbm9fcmVzcG9uc2U6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9pbml0KHN0cnVjdCBoYXBweV9tZWFsICpocCk7CisKK3N0YXRpYyBpbnQgaXNfbHVjZW50X3BoeShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGhwLT50Y3ZyZWdzOworCXVuc2lnbmVkIHNob3J0IG1yMiwgbXIzOworCWludCByZXQgPSAwOworCisJbXIyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCAyKTsKKwltcjMgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIDMpOworCWlmICgobXIyICYgMHhmZmZmKSA9PSAweDAxODAgJiYKKwkgICAgKChtcjMgJiAweGZmZmYpID4+IDEwKSA9PSAweDFkKQorCQlyZXQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gKHN0cnVjdCBoYXBweV9tZWFsICopIGRhdGE7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGhwLT50Y3ZyZWdzOworCWludCByZXN0YXJ0X3RpbWVyID0gMDsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWhwLT50aW1lcl90aWNrcysrOworCXN3aXRjaChocC0+dGltZXJfc3RhdGUpIHsKKwljYXNlIGFyYndhaXQ6CisJCS8qIE9ubHkgYWxsb3cgZm9yIDUgdGlja3MsIHRoYXRzIDEwIHNlY29uZHMgYW5kIG11Y2ggdG9vCisJCSAqIGxvbmcgdG8gd2FpdCBmb3IgYXJiaXRyYXRpb24gdG8gY29tcGxldGUuCisJCSAqLworCQlpZiAoaHAtPnRpbWVyX3RpY2tzID49IDEwKSB7CisJCQkvKiBFbnRlciBmb3JjZSBtb2RlLiAqLworCWRvX2ZvcmNlX21vZGU6CisJCQlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXV0by1OZWdvdGlhdGlvbiB1bnN1Y2Nlc3NmdWwsIHRyeWluZyBmb3JjZSBsaW5rIG1vZGVcbiIsCisJCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJCQlocC0+c3dfYm1jciA9IEJNQ1JfU1BFRUQxMDA7CisJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJCQlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCQkJLyogT0ssIHNlZW1zIHdlIG5lZWQgZG8gZGlzYWJsZSB0aGUgdHJhbnNjZWl2ZXIgZm9yIHRoZSBmaXJzdAorCQkJCSAqIHRpY2sgdG8gbWFrZSBzdXJlIHdlIGdldCBhbiBhY2N1cmF0ZSBsaW5rIHN0YXRlIGF0IHRoZQorCQkJCSAqIHNlY29uZCB0aWNrLgorCQkJCSAqLworCQkJCWhwLT5zd19jc2NvbmZpZyA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgRFA4Mzg0MF9DU0NPTkZJRyk7CisJCQkJaHAtPnN3X2NzY29uZmlnICY9IH4oQ1NDT05GSUdfVENWRElTQUIpOworCQkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIERQODM4NDBfQ1NDT05GSUcsIGhwLT5zd19jc2NvbmZpZyk7CisJCQl9CisJCQlocC0+dGltZXJfc3RhdGUgPSBsdHJ5d2FpdDsKKwkJCWhwLT50aW1lcl90aWNrcyA9IDA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFueXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbj8gKi8KKwkJCWhwLT5zd19ibXNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSX0FORUdDT01QTEVURSkgeworCQkJCWludCByZXQ7CisKKwkJCQkvKiBKdXN0IHdoYXQgd2UndmUgYmVlbiB3YWl0aW5nIGZvci4uLiAqLworCQkJCXJldCA9IHNldF9oYXBweV9saW5rX21vZGVzKGhwLCB0cmVncyk7CisJCQkJaWYgKHJldCkgeworCQkJCQkvKiBPb29wcywgc29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgZ28gdG8gZm9yY2UKKwkJCQkJICogbW9kZS4KKwkJCQkJICoKKwkJCQkJICogWFhYIEJyb2tlbiBodWJzIHdoaWNoIGRvbid0IHN1cHBvcnQgODAyLjN1CisJCQkJCSAqIFhYWCBhdXRvLW5lZ290aWF0aW9uIG1ha2UgdGhpcyBoYXBwZW4gYXMgd2VsbC4KKwkJCQkJICovCisJCQkJCWdvdG8gZG9fZm9yY2VfbW9kZTsKKwkJCQl9CisKKwkJCQkvKiBTdWNjZXNzLCBhdCBsZWFzdCBzbyBmYXIsIGFkdmFuY2Ugb3VyIHN0YXRlIGVuZ2luZS4gKi8KKwkJCQlocC0+dGltZXJfc3RhdGUgPSBsdXB3YWl0OworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgbHVwd2FpdDoKKwkJLyogQXV0byBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQgd2UgYXJlIGF3YWl0aW5nIGEKKwkJICogbGluayB1cCBzdGF0dXMuICBJIGhhdmUgZGVjaWRlZCB0byBsZXQgdGhpcyB0aW1lciBydW4KKwkJICogZm9yZXZlciB1bnRpbCBzb21lIHNvcnQgb2YgZXJyb3IgaXMgc2lnbmFsbGVkLCByZXBvcnRpbmcKKwkJICogYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IDEwIHNlY29uZCBpbnRlcnZhbHMuCisJCSAqLworCQlocC0+c3dfYm1zciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCS8qIFdoZWVlLCBpdCdzIHVwLCBkaXNwbGF5IHRoZSBsaW5rIG1vZGUgaW4gdXNlIGFuZCBwdXQKKwkJCSAqIHRoZSB0aW1lciB0byBzbGVlcC4KKwkJCSAqLworCQkJZGlzcGxheV9saW5rX21vZGUoaHAsIHRyZWdzKTsKKwkJCWhwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwkJCXJlc3RhcnRfdGltZXIgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGhwLT50aW1lcl90aWNrcyA+PSAxMCkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEF1dG8gbmVnb3RpYXRpb24gc3VjY2Vzc2Z1bCwgbGluayBzdGlsbCAiCisJCQkJICAgICAgICJub3QgY29tcGxldGVseSB1cC5cbiIsIGhwLT5kZXYtPm5hbWUpOworCQkJCWhwLT50aW1lcl90aWNrcyA9IDA7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBsdHJ5d2FpdDoKKwkJLyogTWFraW5nIHRoZSB0aW1lb3V0IGhlcmUgdG9vIGxvbmcgY2FuIG1ha2UgaXQgdGFrZQorCQkgKiBhbm5veWluZ2x5IGxvbmcgdG8gYXR0ZW1wdCBhbGwgb2YgdGhlIGxpbmsgbW9kZQorCQkgKiBwZXJtdXRhdGlvbnMsIGJ1dCB0aGVuIGFnYWluIHRoaXMgaXMgZXNzZW50aWFsbHkKKwkJICogZXJyb3IgcmVjb3ZlcnkgY29kZSBmb3IgdGhlIG1vc3QgcGFydC4KKwkJICovCisJCWhwLT5zd19ibXNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJCWhwLT5zd19jc2NvbmZpZyA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgRFA4Mzg0MF9DU0NPTkZJRyk7CisJCWlmIChocC0+dGltZXJfdGlja3MgPT0gMSkgeworCQkJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQkJCS8qIFJlLWVuYWJsZSB0cmFuc2NlaXZlciwgd2UnbGwgcmUtZW5hYmxlIHRoZSB0cmFuc2NlaXZlciBuZXh0CisJCQkJICogdGljaywgdGhlbiBjaGVjayBsaW5rIHN0YXRlIG9uIHRoZSBmb2xsb3dpbmcgdGljay4KKwkJCQkgKi8KKwkJCQlocC0+c3dfY3Njb25maWcgfD0gQ1NDT05GSUdfVENWRElTQUI7CisJCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywKKwkJCQkJCSAgICAgIERQODM4NDBfQ1NDT05GSUcsIGhwLT5zd19jc2NvbmZpZyk7CisJCQl9CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChocC0+dGltZXJfdGlja3MgPT0gMikgeworCQkJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQkJCWhwLT5zd19jc2NvbmZpZyAmPSB+KENTQ09ORklHX1RDVkRJU0FCKTsKKwkJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLAorCQkJCQkJICAgICAgRFA4Mzg0MF9DU0NPTkZJRywgaHAtPnN3X2NzY29uZmlnKTsKKwkJCX0KKwkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkvKiBGb3JjZSBtb2RlIHNlbGVjdGlvbiBzdWNjZXNzLiAqLworCQkJZGlzcGxheV9mb3JjZWRfbGlua19tb2RlKGhwLCB0cmVncyk7CisJCQlzZXRfaGFwcHlfbGlua19tb2RlcyhocCwgdHJlZ3MpOyAvKiBYWFggZXJyb3I/IHRoZW4gd2hhdD8gKi8KKwkJCWhwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwkJCXJlc3RhcnRfdGltZXIgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGhwLT50aW1lcl90aWNrcyA+PSA0KSB7IC8qIDYgc2Vjb25kcyBvciBzby4uLiAqLworCQkJCWludCByZXQ7CisKKwkJCQlyZXQgPSB0cnlfbmV4dF9wZXJtdXRhdGlvbihocCwgdHJlZ3MpOworCQkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkJLyogQWllZWUsIHRyaWVkIHRoZW0gYWxsLCByZXNldCB0aGUKKwkJCQkJICogY2hpcCBhbmQgdHJ5IGFsbCBvdmVyIGFnYWluLgorCQkJCQkgKi8KKworCQkJCQkvKiBMZXQgdGhlIHVzZXIga25vdy4uLiAqLworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBMaW5rIGRvd24sIGNhYmxlIHByb2JsZW0/XG4iLAorCQkJCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisKKwkJCQkJcmV0ID0gaGFwcHlfbWVhbF9pbml0KGhwKTsKKwkJCQkJaWYgKHJldCkgeworCQkJCQkJLyogaG8gaHVtLi4uICovCisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciwgY2Fubm90IHJlLWluaXQgdGhlICIKKwkJCQkJCSAgICAgICAiSGFwcHkgTWVhbC5cbiIsIGhwLT5kZXYtPm5hbWUpOworCQkJCQl9CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCQkJCWhwLT5zd19jc2NvbmZpZyA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywKKwkJCQkJCQkJCSAgICAgICBEUDgzODQwX0NTQ09ORklHKTsKKwkJCQkJaHAtPnN3X2NzY29uZmlnIHw9IENTQ09ORklHX1RDVkRJU0FCOworCQkJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLAorCQkJCQkJCSAgICAgIERQODM4NDBfQ1NDT05GSUcsIGhwLT5zd19jc2NvbmZpZyk7CisJCQkJfQorCQkJCWhwLT50aW1lcl90aWNrcyA9IDA7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBhc2xlZXA6CisJZGVmYXVsdDoKKwkJLyogQ2FuJ3QgaGFwcGVucy4uLi4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQWllZWUsIGxpbmsgdGltZXIgaXMgYXNsZWVwIGJ1dCB3ZSBnb3Qgb25lIGFueXdheXMhXG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJCXJlc3RhcnRfdGltZXIgPSAwOworCQlocC0+dGltZXJfdGlja3MgPSAwOworCQlocC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7IC8qIGZvbyBvbiB5b3UgKi8KKwkJYnJlYWs7CisJfTsKKworCWlmIChyZXN0YXJ0X3RpbWVyKSB7CisJCWhwLT5oYXBweV90aW1lci5leHBpcmVzID0gamlmZmllcyArICgoMTIgKiBIWikvMTApOyAvKiAxLjIgc2VjLiAqLworCQlhZGRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7Cit9CisKKyNkZWZpbmUgVFhfUkVTRVRfVFJJRVMgICAgIDMyCisjZGVmaW5lIFJYX1JFU0VUX1RSSUVTICAgICAzMgorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdHhfcmVzZXQoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCWludCB0cmllcyA9IFRYX1JFU0VUX1RSSUVTOworCisJSE1EKCgiaGFwcHlfbWVhbF90eF9yZXNldDogcmVzZXQsICIpKTsKKworCS8qIFdvdWxkIHlvdSBsaWtlIHRvIHRyeSBvdXIgU01DQyBEZWx1eD8gKi8KKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1RYU1dSRVNFVCwgMCk7CisJd2hpbGUgKChobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfVFhTV1JFU0VUKSAmIDEpICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisKKwkvKiBMZXR0dWNlLCB0b21hdG8sIGJ1Z2d5IGhhcmR3YXJlIChubyBleHRyYSBjaGFyZ2UpPyAqLworCWlmICghdHJpZXMpCisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogVHJhbnNjZWl2ZXIgQmlnTWFjIEFUVEFDSyEiKTsKKworCS8qIFRha2UgY2FyZS4gKi8KKwlITUQoKCJkb25lXG4iKSk7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9yeF9yZXNldChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJaW50IHRyaWVzID0gUlhfUkVTRVRfVFJJRVM7CisKKwlITUQoKCJoYXBweV9tZWFsX3J4X3Jlc2V0OiByZXNldCwgIikpOworCisJLyogV2UgaGF2ZSBhIHNwZWNpYWwgb24gR05VL1Zpa2luZyBoYXJkd2FyZSBidWdzIHRvZGF5LiAqLworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUlhTV1JFU0VULCAwKTsKKwl3aGlsZSAoKGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SWFNXUkVTRVQpICYgMSkgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKworCS8qIFdpbGwgdGhhdCBiZSBhbGw/ICovCisJaWYgKCF0cmllcykKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBSZWNlaXZlciBCaWdNYWMgQVRUQUNLISIpOworCisJLyogRG9uJ3QgZm9yZ2V0IHlvdXIgdmlrXzExMzcxMjVfd2EuICBIYXZlIGEgbmljZSBkYXkuICovCisJSE1EKCgiZG9uZVxuIikpOworfQorCisjZGVmaW5lIFNUT1BfVFJJRVMgICAgICAgICAxNgorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfc3RvcChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqZ3JlZ3MpCit7CisJaW50IHRyaWVzID0gU1RPUF9UUklFUzsKKworCUhNRCgoImhhcHB5X21lYWxfc3RvcDogcmVzZXQsICIpKTsKKworCS8qIFdlJ3JlIGNvbnNvbGlkYXRpbmcgb3VyIFNUQiBwcm9kdWN0cywgaXQncyB5b3VyIGx1Y2t5IGRheS4gKi8KKwlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX1NXUkVTRVQsIEdSRUdfUkVTRVRfQUxMKTsKKwl3aGlsZSAoaG1lX3JlYWQzMihocCwgZ3JlZ3MgKyBHUkVHX1NXUkVTRVQpICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisKKwkvKiBDb21lIGJhY2sgbmV4dCB3ZWVrIHdoZW4gd2UgYXJlICJTdW4gTWljcm9lbGVjdHJvbmljcyIuICovCisJaWYgKCF0cmllcykKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBGcnkgZ3V5cy4iKTsKKworCS8qIFJlbWVtYmVyOiAiRGlmZmVyZW50IG5hbWUsIHNhbWUgb2xkIGJ1Z2d5IGFzIHNoaXQgaGFyZHdhcmUuIiAqLworCUhNRCgoImRvbmVcbiIpKTsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX2dldF9jb3VudGVycyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmhwLT5uZXRfc3RhdHM7CisKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUkNSQ0VDVFIpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUkNSQ0VDVFIsIDApOworCisJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfVU5BTEVDVFIpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfVU5BTEVDVFIsIDApOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX0dMRUNUUik7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19HTEVDVFIsIDApOworCisJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICs9IGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19FWENUUik7CisKKwlzdGF0cy0+Y29sbGlzaW9ucyArPQorCQkoaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX0VYQ1RSKSArCisJCSBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfTFRDVFIpKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0VYQ1RSLCAwKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0xUQ1RSLCAwKTsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3BvbGxfc3RvcChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJQVNEKCgiaGFwcHlfbWVhbF9wb2xsX3N0b3A6ICIpKTsKKworCS8qIElmIHBvbGxpbmcgZGlzYWJsZWQgb3Igbm90IHBvbGxpbmcgYWxyZWFkeSwgbm90aGluZyB0byBkby4gKi8KKwlpZiAoKGhwLT5oYXBweV9mbGFncyAmIChIRkxBR19QT0xMRU5BQkxFIHwgSEZMQUdfUE9MTCkpICE9CisJICAgKEhGTEFHX1BPTExFTkFCTEUgfCBIRkxBR19QT0xMKSkgeworCQlITUQoKCJub3QgcG9sbGluZywgcmV0dXJuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTaHV0IHVwIHRoZSBNSUYuICovCisJQVNEKCgid2VyZSBwb2xsaW5nLCBtaWYgaW50cyBvZmYsICIpKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0lNQVNLLCAweGZmZmYpOworCisJLyogVHVybiBvZmYgcG9sbGluZy4gKi8KKwlBU0QoKCJwb2xsaW5nIG9mZiwgIikpOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgJiB+KFRDVl9DRkdfUEVOQUJMRSkpOworCisJLyogV2UgYXJlIG5vIGxvbmdlciBwb2xsaW5nLiAqLworCWhwLT5oYXBweV9mbGFncyAmPSB+KEhGTEFHX1BPTEwpOworCisJLyogTGV0IHRoZSBiaXRzIHNldC4gKi8KKwl1ZGVsYXkoMjAwKTsKKwlBU0QoKCJkb25lXG4iKSk7Cit9CisKKy8qIE9ubHkgU3VuIGNhbiB0YWtlIHN1Y2ggbmljZSBwYXJ0cyBhbmQgZnVjayB1cCB0aGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlCisgKiBsaWtlIHRoaXMuICBHb29kIGpvYiBndXlzLi4uCisgKi8KKyNkZWZpbmUgVENWUl9SRVNFVF9UUklFUyAgICAgICAxNiAvKiBJdCBzaG91bGQgcmVzZXQgcXVpY2tseSAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9VTklTT0xBVEVfVFJJRVMgICAzMiAvKiBEaXMtaXNvbGF0aW9uIGNhbiB0YWtlIGxvbmdlci4gKi8KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgaW50IGhhcHB5X21lYWxfdGN2cl9yZXNldChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJdTMyIHRjb25maWc7CisJaW50IHJlc3VsdCwgdHJpZXMgPSBUQ1ZSX1JFU0VUX1RSSUVTOworCisJdGNvbmZpZyA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpOworCUFTRCgoImhhcHB5X21lYWxfdGN2cl9yZXNldDogdGNmZzwlMDhseD4gIiwgdGNvbmZpZykpOworCWlmIChocC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCUFTRCgoImV4dGVybmFsPCIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsIHRjb25maWcgJiB+KFRDVl9DRkdfUFNFTEVDVCkpOworCQlocC0+dGN2cl90eXBlID0gaW50ZXJuYWw7CisJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9JVFg7CisJCUFTRCgoIklTT0xBVEUsIikpOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwKKwkJCQkgICAgICAoQk1DUl9MT09QQkFDS3xCTUNSX1BET1dOfEJNQ1JfSVNPTEFURSkpOworCQlyZXN1bHQgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJaWYgKHJlc3VsdCA9PSBUQ1ZSX0ZBSUxVUkUpIHsKKwkJCUFTRCgoInBoeXJlYWRfZmFpbD5cbiIpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlBU0QoKCJwaHlyZWFkX29rLFBTRUxFQ1Q+IikpOworCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgdGNvbmZpZyB8IFRDVl9DRkdfUFNFTEVDVCk7CisJCWhwLT50Y3ZyX3R5cGUgPSBleHRlcm5hbDsKKwkJaHAtPnBhZGRyID0gVENWX1BBRERSX0VUWDsKKwl9IGVsc2UgeworCQlpZiAodGNvbmZpZyAmIFRDVl9DRkdfTURJTzEpIHsKKwkJCUFTRCgoImludGVybmFsPFBTRUxFQ1QsIikpOworCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsICh0Y29uZmlnIHwgVENWX0NGR19QU0VMRUNUKSk7CisJCQlBU0QoKCJJU09MQVRFLCIpKTsKKwkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLAorCQkJCQkgICAgICAoQk1DUl9MT09QQkFDS3xCTUNSX1BET1dOfEJNQ1JfSVNPTEFURSkpOworCQkJcmVzdWx0ID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCQlpZiAocmVzdWx0ID09IFRDVlJfRkFJTFVSRSkgeworCQkJCUFTRCgoInBoeXJlYWRfZmFpbD5cbiIpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlBU0QoKCJwaHlyZWFkX29rLH5QU0VMRUNUPiIpKTsKKwkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCAodGNvbmZpZyAmIH4oVENWX0NGR19QU0VMRUNUKSkpOworCQkJaHAtPnRjdnJfdHlwZSA9IGludGVybmFsOworCQkJaHAtPnBhZGRyID0gVENWX1BBRERSX0lUWDsKKwkJfQorCX0KKworCUFTRCgoIkJNQ1JfUkVTRVQgIikpOworCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCXdoaWxlICgtLXRyaWVzKSB7CisJCXJlc3VsdCA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQlpZiAocmVzdWx0ID09IFRDVlJfRkFJTFVSRSkKKwkJCXJldHVybiAtMTsKKwkJaHAtPnN3X2JtY3IgPSByZXN1bHQ7CisJCWlmICghKHJlc3VsdCAmIEJNQ1JfUkVTRVQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCWlmICghdHJpZXMpIHsKKwkJQVNEKCgiQk1DUiBSRVNFVCBGQUlMRUQhXG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisJQVNEKCgiUkVTRVRfT0tcbiIpKTsKKworCS8qIEdldCBmcmVzaCBjb3BpZXMgb2YgdGhlIFBIWSByZWdpc3RlcnMuICovCisJaHAtPnN3X2Jtc3IgICAgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCWhwLT5zd19waHlzaWQxICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9QSFlTSUQxKTsKKwlocC0+c3dfcGh5c2lkMiAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfUEhZU0lEMik7CisJaHAtPnN3X2FkdmVydGlzZSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0FEVkVSVElTRSk7CisKKwlBU0QoKCJVTklTT0xBVEUiKSk7CisJaHAtPnN3X2JtY3IgJj0gfihCTUNSX0lTT0xBVEUpOworCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwl0cmllcyA9IFRDVlJfVU5JU09MQVRFX1RSSUVTOworCXdoaWxlICgtLXRyaWVzKSB7CisJCXJlc3VsdCA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQlpZiAocmVzdWx0ID09IFRDVlJfRkFJTFVSRSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCEocmVzdWx0ICYgQk1DUl9JU09MQVRFKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwlpZiAoIXRyaWVzKSB7CisJCUFTRCgoIiBGQUlMRUQhXG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisJQVNEKCgiIFNVQ0NFU1MgYW5kIENTQ09ORklHX0RGQllQQVNTXG4iKSk7CisJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQlyZXN1bHQgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsCisJCQkJCSAgICAgIERQODM4NDBfQ1NDT05GSUcpOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLAorCQkJCSAgICAgIERQODM4NDBfQ1NDT05GSUcsIChyZXN1bHQgfCBDU0NPTkZJR19ERkJZUEFTUykpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRmlndXJlIG91dCB3aGV0aGVyIHdlIGhhdmUgYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgdHJhbnNjZWl2ZXIuCisgKgorICogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdHJhbnNjZWl2ZXJfY2hlY2soc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdGNvbmZpZyA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpOworCisJQVNEKCgiaGFwcHlfbWVhbF90cmFuc2NlaXZlcl9jaGVjazogdGNmZz0lMDhseCAiLCB0Y29uZmlnKSk7CisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BPTEwpIHsKKwkJLyogSWYgd2UgYXJlIHBvbGxpbmcsIHdlIG11c3Qgc3RvcCB0byBnZXQgdGhlIHRyYW5zY2VpdmVyIHR5cGUuICovCisJCUFTRCgoIjxwb2xsaW5nPiAiKSk7CisJCWlmIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSB7CisJCQlpZiAodGNvbmZpZyAmIFRDVl9DRkdfTURJTzEpIHsKKwkJCQlBU0QoKCI8aW50ZXJuYWw+IDxwb2xsIHN0b3A+ICIpKTsKKwkJCQloYXBweV9tZWFsX3BvbGxfc3RvcChocCwgdHJlZ3MpOworCQkJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9FVFg7CisJCQkJaHAtPnRjdnJfdHlwZSA9IGV4dGVybmFsOworCQkJCUFTRCgoIjxleHRlcm5hbD5cbiIpKTsKKwkJCQl0Y29uZmlnICY9IH4oVENWX0NGR19QRU5BQkxFKTsKKwkJCQl0Y29uZmlnIHw9IFRDVl9DRkdfUFNFTEVDVDsKKwkJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgdGNvbmZpZyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaHAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQkJCUFTRCgoIjxleHRlcm5hbD4gIikpOworCQkJCWlmICghKGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9TVEFUVVMpID4+IDE2KSkgeworCQkJCQlBU0QoKCI8cG9sbCBzdG9wPiAiKSk7CisJCQkJCWhhcHB5X21lYWxfcG9sbF9zdG9wKGhwLCB0cmVncyk7CisJCQkJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9JVFg7CisJCQkJCWhwLT50Y3ZyX3R5cGUgPSBpbnRlcm5hbDsKKwkJCQkJQVNEKCgiPGludGVybmFsPlxuIikpOworCQkJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCQkJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSAmCisJCQkJCQkgICAgfihUQ1ZfQ0ZHX1BTRUxFQ1QpKTsKKwkJCQl9CisJCQkJQVNEKCgiXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCUFTRCgoIjxub25lPlxuIikpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdTMyIHJlcmVhZCA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpOworCisJCS8qIEVsc2Ugd2UgY2FuIGp1c3Qgd29yayBvZmYgb2YgdGhlIE1ESU8gYml0cy4gKi8KKwkJQVNEKCgiPG5vdCBwb2xsaW5nPiAiKSk7CisJCWlmIChyZXJlYWQgJiBUQ1ZfQ0ZHX01ESU8xKSB7CisJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgdGNvbmZpZyB8IFRDVl9DRkdfUFNFTEVDVCk7CisJCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfRVRYOworCQkJaHAtPnRjdnJfdHlwZSA9IGV4dGVybmFsOworCQkJQVNEKCgiPGV4dGVybmFsPlxuIikpOworCQl9IGVsc2UgeworCQkJaWYgKHJlcmVhZCAmIFRDVl9DRkdfTURJTzApIHsKKwkJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCQkJICAgIHRjb25maWcgJiB+KFRDVl9DRkdfUFNFTEVDVCkpOworCQkJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9JVFg7CisJCQkJaHAtPnRjdnJfdHlwZSA9IGludGVybmFsOworCQkJCUFTRCgoIjxpbnRlcm5hbD5cbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBUcmFuc2NlaXZlciBhbmQgYSBjb2tlIHBsZWFzZS4iKTsKKwkJCQlocC0+dGN2cl90eXBlID0gbm9uZTsgLyogR3Jyci4uLiAqLworCQkJCUFTRCgoIjxub25lPlxuIikpOworCQkJfQorCQl9CisJfQorfQorCisvKiBUaGUgcmVjZWl2ZSByaW5nIGJ1ZmZlcnMgYXJlIGEgYml0IHRyaWNreSB0byBnZXQgcmlnaHQuICBIZXJlIGdvZXMuLi4KKyAqCisgKiBUaGUgYnVmZmVycyB3ZSBkbWEgaW50byBtdXN0IGJlIDY0IGJ5dGUgYWxpZ25lZC4gIFNvIHdlIHVzZSBhIHNwZWNpYWwKKyAqIGFsbG9jX3NrYigpIHJvdXRpbmUgZm9yIHRoZSBoYXBweSBtZWFsIHRvIGFsbG9jYXRlIDY0IGJ5dGVzIG1vcmUgdGhhbgorICogd2UgcmVhbGx5IG5lZWQuCisgKgorICogV2UgdXNlIHNrYl9yZXNlcnZlKCkgdG8gYWxpZ24gdGhlIGRhdGEgYmxvY2sgd2UgZ2V0IGluIHRoZSBza2IuICBXZQorICogYWxzbyBwcm9ncmFtIHRoZSBldHhyZWdzLT5jZmcgcmVnaXN0ZXIgdG8gdXNlIGFuIG9mZnNldCBvZiAyLiAgVGhpcworICogaW1wZXJpY2FsIGNvbnN0YW50IHBsdXMgdGhlIGV0aGVybmV0IGhlYWRlciBzaXplIHdpbGwgYWx3YXlzIGxlYXZlCisgKiB1cyB3aXRoIGEgbmljZWx5IGFsaWduZWQgaXAgaGVhZGVyIG9uY2Ugd2UgcGFzcyB0aGluZ3MgdXAgdG8gdGhlCisgKiBwcm90b2NvbCBsYXllcnMuCisgKgorICogVGhlIG51bWJlcnMgd29yayBvdXQgdG86CisgKgorICogICAgICAgICBNYXggZXRoZXJuZXQgZnJhbWUgc2l6ZSAgICAgICAgIDE1MTgKKyAqICAgICAgICAgRXRoZXJuZXQgaGVhZGVyIHNpemUgICAgICAgICAgICAgIDE0CisgKiAgICAgICAgIEhhcHB5IE1lYWwgYmFzZSBvZmZzZXQgICAgICAgICAgICAgMgorICoKKyAqIFNheSBhIHNrYiBkYXRhIGFyZWEgaXMgYXQgMHhmMDAxYjAxMCwgYW5kIGl0cyBzaXplIGFsbG9jZWQgaXMKKyAqIChFVEhfRlJBTUVfTEVOICsgNjQgKyAyKSA9ICgxNTE0ICsgNjQgKyAyKSA9IDE1ODAgYnl0ZXMuCisgKgorICogRmlyc3Qgb3VyIGFsbG9jX3NrYigpIHJvdXRpbmUgYWxpZ25zIHRoZSBkYXRhIGJhc2UgdG8gYSA2NCBieXRlCisgKiBib3VuZGFyeS4gIFdlIG5vdyBoYXZlIDB4ZjAwMWIwNDAgYXMgb3VyIHNrYiBkYXRhIGFkZHJlc3MuICBXZQorICogcGx1ZyB0aGlzIGludG8gdGhlIHJlY2VpdmUgZGVzY3JpcHRvciBhZGRyZXNzLgorICoKKyAqIE5leHQsIHdlIHNrYl9yZXNlcnZlKCkgMiBieXRlcyB0byBhY2NvdW50IGZvciB0aGUgSGFwcHkgTWVhbCBvZmZzZXQuCisgKiBTbyBub3cgdGhlIGRhdGEgd2Ugd2lsbCBlbmQgdXAgbG9va2luZyBhdCBzdGFydHMgYXQgMHhmMDAxYjA0Mi4gIFdoZW4KKyAqIHRoZSBwYWNrZXQgYXJyaXZlcywgd2Ugd2lsbCBjaGVjayBvdXQgdGhlIHNpemUgcmVjZWl2ZWQgYW5kIHN1YnRyYWN0CisgKiB0aGlzIGZyb20gdGhlIHNrYi0+bGVuZ3RoLiAgVGhlbiB3ZSBqdXN0IHBhc3MgdGhlIHBhY2tldCB1cCB0byB0aGUKKyAqIHByb3RvY29scyBhcyBpcywgYW5kIGFsbG9jYXRlIGEgbmV3IHNrYiB0byByZXBsYWNlIHRoaXMgc2xvdCB3ZSBoYXZlCisgKiBqdXN0IHJlY2VpdmVkIGZyb20uCisgKgorICogVGhlIGV0aGVybmV0IGxheWVyIHdpbGwgc3RyaXAgdGhlIGV0aGVyIGhlYWRlciBmcm9tIHRoZSBmcm9udCBvZiB0aGUKKyAqIHNrYiB3ZSBqdXN0IHNlbnQgdG8gaXQsIHRoaXMgbGVhdmVzIHVzIHdpdGggdGhlIGlwIGhlYWRlciBzaXR0aW5nCisgKiBuaWNlbHkgYWxpZ25lZCBhdCAweGYwMDFiMDUwLiAgQWxzbywgZm9yIHRjcCBhbmQgdWRwIHBhY2tldHMgdGhlCisgKiBIYXBweSBNZWFsIGhhcyBldmVuIGNoZWNrc3VtbWVkIHRoZSB0Y3AvdWRwIGRhdGEgZm9yIHVzLiAgVGhlIDE2CisgKiBiaXQgY2hlY2tzdW0gaXMgb2J0YWluZWQgZnJvbSB0aGUgbG93IGJpdHMgb2YgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcgorICogZmxhZ3MsIHRodXM6CisgKgorICogCXNrYi0+Y3N1bSA9IHJ4ZC0+cnhfZmxhZ3MgJiAweGZmZmY7CisgKiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKyAqCisgKiBiZWZvcmUgc2VuZGluZyBvZmYgdGhlIHNrYiB0byB0aGUgcHJvdG9jb2xzLCBhbmQgd2UgYXJlIGdvb2QgYXMgZ29sZC4KKyAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9jbGVhbl9yaW5ncyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGhwLT5yeF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBocC0+cnhfc2tic1tpXTsKKwkJCXN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqcnhkOworCQkJdTMyIGRtYV9hZGRyOworCisJCQlyeGQgPSAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3J4ZFtpXTsKKwkJCWRtYV9hZGRyID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmcnhkLT5yeF9hZGRyKTsKKwkJCWhtZV9kbWFfdW5tYXAoaHAsIGRtYV9hZGRyLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWhwLT5yeF9za2JzW2ldID0gTlVMTDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoaHAtPnR4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGhwLT50eF9za2JzW2ldOworCQkJc3RydWN0IGhhcHB5X21lYWxfdHhkICp0eGQ7CisJCQl1MzIgZG1hX2FkZHI7CisJCQlpbnQgZnJhZzsKKworCQkJaHAtPnR4X3NrYnNbaV0gPSBOVUxMOworCisJCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDw9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJCXR4ZCA9ICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfdHhkW2ldOworCQkJCWRtYV9hZGRyID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdHhkLT50eF9hZGRyKTsKKwkJCQlobWVfZG1hX3VubWFwKGhwLCBkbWFfYWRkciwKKwkJCQkJICAgICAgKGhtZV9yZWFkX2Rlc2MzMihocCwgJnR4ZC0+dHhfZmxhZ3MpCisJCQkJCSAgICAgICAmIFRYRkxBR19TSVpFKSwKKwkJCQkJICAgICAgRE1BX1RPREVWSUNFKTsKKworCQkJCWlmIChmcmFnICE9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCisJCQkJCWkrKzsKKwkJCX0KKworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQorCX0KK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX2luaXRfcmluZ3Moc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXN0cnVjdCBobWVhbF9pbml0X2Jsb2NrICpoYiA9IGhwLT5oYXBweV9ibG9jazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHAtPmRldjsKKwlpbnQgaTsKKworCUhNRCgoImhhcHB5X21lYWxfaW5pdF9yaW5nczogY291bnRlcnMgdG8gemVybywgIikpOworCWhwLT5yeF9uZXcgPSBocC0+cnhfb2xkID0gaHAtPnR4X25ldyA9IGhwLT50eF9vbGQgPSAwOworCisJLyogRnJlZSBhbnkgc2tpcHB5IGJ1ZnMgbGVmdCBhcm91bmQgaW4gdGhlIHJpbmdzLiAqLworCUhNRCgoImNsZWFuLCAiKSk7CisJaGFwcHlfbWVhbF9jbGVhbl9yaW5ncyhocCk7CisKKwkvKiBOb3cgZ2V0IG5ldyBza2lwcHkgYnVmcyBmb3IgdGhlIHJlY2VpdmUgcmluZy4gKi8KKwlITUQoKCJpbml0IHJ4cmluZywgIikpOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGhhcHB5X21lYWxfYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpIHsKKwkJCWhtZV93cml0ZV9yeGQoaHAsICZoYi0+aGFwcHlfbWVhbF9yeGRbaV0sIDAsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaHAtPnJ4X3NrYnNbaV0gPSBza2I7CisJCXNrYi0+ZGV2ID0gZGV2OworCisJCS8qIEJlY2F1c2Ugd2UgcmVzZXJ2ZSBhZnRlcndhcmRzLiAqLworCQlza2JfcHV0KHNrYiwgKEVUSF9GUkFNRV9MRU4gKyBSWF9PRkZTRVQpKTsKKwkJaG1lX3dyaXRlX3J4ZChocCwgJmhiLT5oYXBweV9tZWFsX3J4ZFtpXSwKKwkJCSAgICAgIChSWEZMQUdfT1dOIHwgKChSWF9CVUZfQUxMT0NfU0laRSAtIFJYX09GRlNFVCkgPDwgMTYpKSwKKwkJCSAgICAgIGhtZV9kbWFfbWFwKGhwLCBza2ItPmRhdGEsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTURFVklDRSkpOworCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CisJfQorCisJSE1EKCgiaW5pdCB0eHJpbmcsICIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCWhtZV93cml0ZV90eGQoaHAsICZoYi0+aGFwcHlfbWVhbF90eGRbaV0sIDAsIDApOworCisJSE1EKCgiZG9uZVxuIikpOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfYmVnaW5fYXV0b19uZWdvdGlhdGlvbihzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsCisJCQkJCSAgICAgIHZvaWQgX19pb21lbSAqdHJlZ3MsCisJCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZXApCit7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBSZWFkIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBpbnRlcmVzdGVkIGluIG5vdy4gKi8KKwlocC0+c3dfYm1zciAgICAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJaHAtPnN3X2JtY3IgICAgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCWhwLT5zd19waHlzaWQxICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9QSFlTSUQxKTsKKwlocC0+c3dfcGh5c2lkMiAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfUEhZU0lEMik7CisKKwkvKiBYWFggQ2hlY2sgQk1TUl9BTkVHQ0FQQUJMRSwgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdGhvdWdoLiAqLworCisJaHAtPnN3X2FkdmVydGlzZSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0FEVkVSVElTRSk7CisJaWYgKGVwID09IE5VTEwgfHwgZXAtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJLyogQWR2ZXJ0aXNlIGV2ZXJ5dGhpbmcgd2UgY2FuIHN1cHBvcnQuICovCisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTBIQUxGKQorCQkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwSEFMRik7CisJCWVsc2UKKwkJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTBIQUxGKTsKKworCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwRlVMTCkKKwkJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMEZVTEwpOworCQllbHNlCisJCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwRlVMTCk7CisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTAwSEFMRikKKwkJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMDBIQUxGKTsKKwkJZWxzZQorCQkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMDBIQUxGKTsKKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMDBGVUxMKQorCQkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwMEZVTEwpOworCQllbHNlCisJCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwMEZVTEwpOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQURWRVJUSVNFLCBocC0+c3dfYWR2ZXJ0aXNlKTsKKworCQkvKiBYWFggQ3VycmVudGx5IG5vIEhhcHB5IE1lYWwgY2FyZHMgSSBrbm93IG9mZiBzdXBwb3J0IDEwMEJhc2VUNCwKKwkJICogWFhYIGFuZCB0aGlzIGlzIGJlY2F1c2UgdGhlIERQODM4NDAgZG9lcyBub3Qgc3VwcG9ydCBpdCwgY2hhbmdlcworCQkgKiBYWFggd291bGQgbmVlZCB0byBiZSBtYWRlIHRvIHRoZSB0eC9yeCBsb2dpYyBpbiB0aGUgZHJpdmVyIGFzIHdlbGwKKwkJICogWFhYIHNvIEkgY29tcGxldGVseSBza2lwIGNoZWNraW5nIGZvciBpdCBpbiB0aGUgQk1TUiBmb3Igbm93LgorCQkgKi8KKworI2lmZGVmIEFVVE9fU1dJVENIX0RFQlVHCisJCUFTRCgoIiVzOiBBZHZlcnRpc2luZyBbICIsIGhwLT5kZXYtPm5hbWUpKTsKKwkJaWYgKGhwLT5zd19hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQkJQVNEKCgiMTBIICIpKTsKKwkJaWYgKGhwLT5zd19hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQkJQVNEKCgiMTBGICIpKTsKKwkJaWYgKGhwLT5zd19hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTAwSEFMRikKKwkJCUFTRCgoIjEwMEggIikpOworCQlpZiAoaHAtPnN3X2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQkJQVNEKCgiMTAwRiAiKSk7CisjZW5kaWYKKworCQkvKiBFbmFibGUgQXV0by1OZWdvdGlhdGlvbiwgdGhpcyBpcyB1c3VhbGx5IG9uIGFscmVhZHkuLi4gKi8KKwkJaHAtPnN3X2JtY3IgfD0gQk1DUl9BTkVOQUJMRTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCQkvKiBSZXN0YXJ0IGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyBnb2luZy4gKi8KKwkJaHAtPnN3X2JtY3IgfD0gQk1DUl9BTlJFU1RBUlQ7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwkJLyogQk1DUl9BTlJFU1RBUlQgc2VsZiBjbGVhcnMgd2hlbiB0aGUgcHJvY2VzcyBoYXMgYmVndW4uICovCisKKwkJdGltZW91dCA9IDY0OyAgLyogTW9yZSB0aGFuIGVub3VnaC4gKi8KKwkJd2hpbGUgKC0tdGltZW91dCkgeworCQkJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJCWlmICghKGhwLT5zd19ibWNyICYgQk1DUl9BTlJFU1RBUlQpKQorCQkJCWJyZWFrOyAvKiBnb3QgaXQuICovCisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmICghdGltZW91dCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCB3b3VsZCBub3Qgc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAiCisJCQkgICAgICAgIkJNQ1I9MHglMDR4XG4iLCBocC0+ZGV2LT5uYW1lLCBocC0+c3dfYm1jcik7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQZXJmb3JtaW5nIGZvcmNlIGxpbmsgZGV0ZWN0aW9uLlxuIiwKKwkJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZm9yY2VfbGluazsKKwkJfSBlbHNlIHsKKwkJCWhwLT50aW1lcl9zdGF0ZSA9IGFyYndhaXQ7CisJCX0KKwl9IGVsc2UgeworZm9yY2VfbGluazoKKwkJLyogRm9yY2UgdGhlIGxpbmsgdXAsIHRyeWluZyBmaXJzdCBhIHBhcnRpY3VsYXIgbW9kZS4KKwkJICogRWl0aGVyIHdlIGFyZSBoZXJlIGF0IHRoZSByZXF1ZXN0IG9mIGV0aHRvb2wgb3IKKwkJICogYmVjYXVzZSB0aGUgSGFwcHkgTWVhbCB3b3VsZCBub3Qgc3RhcnQgdG8gYXV0b25lZy4KKwkJICovCisKKwkJLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGluIEJNQ1IsIGVuYWJsZSB0aGUgZHVwbGV4IGFuZAorCQkgKiBzcGVlZCBzZXR0aW5nLCBpbml0IHRoZSB0aW1lciBzdGF0ZSBtYWNoaW5lLCBhbmQgZmlyZSBpdCBvZmYuCisJCSAqLworCQlpZiAoZXAgPT0gTlVMTCB8fCBlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJaHAtPnN3X2JtY3IgPSBCTUNSX1NQRUVEMTAwOworCQl9IGVsc2UgeworCQkJaWYgKGVwLT5zcGVlZCA9PSBTUEVFRF8xMDApCisJCQkJaHAtPnN3X2JtY3IgPSBCTUNSX1NQRUVEMTAwOworCQkJZWxzZQorCQkJCWhwLT5zd19ibWNyID0gMDsKKwkJCWlmIChlcC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCWhwLT5zd19ibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJCX0KKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCQlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCQkvKiBPSywgc2VlbXMgd2UgbmVlZCBkbyBkaXNhYmxlIHRoZSB0cmFuc2NlaXZlciBmb3IgdGhlIGZpcnN0CisJCQkgKiB0aWNrIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gYWNjdXJhdGUgbGluayBzdGF0ZSBhdCB0aGUKKwkJCSAqIHNlY29uZCB0aWNrLgorCQkJICovCisJCQlocC0+c3dfY3Njb25maWcgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsCisJCQkJCQkJICAgICAgIERQODM4NDBfQ1NDT05GSUcpOworCQkJaHAtPnN3X2NzY29uZmlnICY9IH4oQ1NDT05GSUdfVENWRElTQUIpOworCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgRFA4Mzg0MF9DU0NPTkZJRywKKwkJCQkJICAgICAgaHAtPnN3X2NzY29uZmlnKTsKKwkJfQorCQlocC0+dGltZXJfc3RhdGUgPSBsdHJ5d2FpdDsKKwl9CisKKwlocC0+dGltZXJfdGlja3MgPSAwOworCWhwLT5oYXBweV90aW1lci5leHBpcmVzID0gamlmZmllcyArICgxMiAqIEhaKS8xMDsgIC8qIDEuMiBzZWMuICovCisJaHAtPmhhcHB5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHA7CisJaHAtPmhhcHB5X3RpbWVyLmZ1bmN0aW9uID0gJmhhcHB5X21lYWxfdGltZXI7CisJYWRkX3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9pbml0KHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwl2b2lkIF9faW9tZW0gKmdyZWdzICAgICAgICA9IGhwLT5ncmVnczsKKwl2b2lkIF9faW9tZW0gKmV0eHJlZ3MgICAgICA9IGhwLT5ldHhyZWdzOworCXZvaWQgX19pb21lbSAqZXJ4cmVncyAgICAgID0gaHAtPmVyeHJlZ3M7CisJdm9pZCBfX2lvbWVtICpicmVncyAgICAgICAgPSBocC0+YmlnbWFjcmVnczsKKwl2b2lkIF9faW9tZW0gKnRyZWdzICAgICAgICA9IGhwLT50Y3ZyZWdzOworCXUzMiByZWd0bXAsIHJ4Y2ZnOworCXVuc2lnbmVkIGNoYXIgKmUgPSAmaHAtPmRldi0+ZGV2X2FkZHJbMF07CisKKwkvKiBJZiBhdXRvLW5lZ290aWF0aW9uIHRpbWVyIGlzIHJ1bm5pbmcsIGtpbGwgaXQuICovCisJZGVsX3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiBoYXBweV9mbGFnc1slMDh4XSAiLAorCSAgICAgaHAtPmhhcHB5X2ZsYWdzKSk7CisJaWYgKCEoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfSU5JVCkpIHsKKwkJSE1EKCgic2V0IEhGTEFHX0lOSVQsICIpKTsKKwkJaHAtPmhhcHB5X2ZsYWdzIHw9IEhGTEFHX0lOSVQ7CisJCWhhcHB5X21lYWxfZ2V0X2NvdW50ZXJzKGhwLCBicmVncyk7CisJfQorCisJLyogU3RvcCBwb2xsaW5nLiAqLworCUhNRCgoInRvIGhhcHB5X21lYWxfcG9sbF9zdG9wXG4iKSk7CisJaGFwcHlfbWVhbF9wb2xsX3N0b3AoaHAsIHRyZWdzKTsKKworCS8qIFN0b3AgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogdG8gaGFwcHlfbWVhbF9zdG9wXG4iKSk7CisJaGFwcHlfbWVhbF9zdG9wKGhwLCBncmVncyk7CisKKwkvKiBBbGxvYyBhbmQgcmVzZXQgdGhlIHR4L3J4IGRlc2NyaXB0b3IgY2hhaW5zLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogdG8gaGFwcHlfbWVhbF9pbml0X3JpbmdzXG4iKSk7CisJaGFwcHlfbWVhbF9pbml0X3JpbmdzKGhwKTsKKworCS8qIFNodXQgdXAgdGhlIE1JRi4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IERpc2FibGUgYWxsIE1JRiBpcnFzIChvbGRbJTA4eF0pLCAiLAorCSAgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0lNQVNLKSkpOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfSU1BU0ssIDB4ZmZmZik7CisKKwkvKiBTZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGUgTUlGIGZyYW1lIG9uIHRoaXMgY2FyZCB0byBzcGVhayB0byB0aGUgRFA4Mzg0MC4gKi8KKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfRkVOQUJMRSkgeworCQlITUQoKCJ1c2UgZnJhbWUgb2xkWyUwOHhdLCAiLAorCQkgICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpKSk7CisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpICYgfihUQ1ZfQ0ZHX0JFTkFCTEUpKTsKKwl9IGVsc2UgeworCQlITUQoKCJ1c2UgYml0YmFuZyBvbGRbJTA4eF0sICIsCisJCSAgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgfCBUQ1ZfQ0ZHX0JFTkFCTEUpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgdHJhbnNjZWl2ZXIuICovCisJSE1EKCgidG8gaGFwcHlfbWVhbF90cmFuc2NlaXZlcl9jaGVja1xuIikpOworCWhhcHB5X21lYWxfdHJhbnNjZWl2ZXJfY2hlY2soaHAsIHRyZWdzKTsKKworCS8qIFB1dCB0aGUgQmlnIE1hYyBpbnRvIGEgc2FuZSBzdGF0ZS4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6ICIpKTsKKwlzd2l0Y2goaHAtPnRjdnJfdHlwZSkgeworCWNhc2Ugbm9uZToKKwkJLyogQ2Fubm90IG9wZXJhdGUgaWYgd2UgZG9uJ3Qga25vdyB0aGUgdHJhbnNjZWl2ZXIgdHlwZSEgKi8KKwkJSE1EKCgiQUFJRUVFIG5vIHRyYW5zY2VpdmVyIHR5cGUsIEVBR0FJTiIpKTsKKwkJcmV0dXJuIC1FQUdBSU47CisKKwljYXNlIGludGVybmFsOgorCQkvKiBVc2luZyB0aGUgTUlJIGJ1ZmZlcnMuICovCisJCUhNRCgoImludGVybmFsLCB1c2luZyBNSUksICIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcsIDApOworCQlicmVhazsKKworCWNhc2UgZXh0ZXJuYWw6CisJCS8qIE5vdCB1c2luZyB0aGUgTUlJLCBkaXNhYmxlIGl0LiAqLworCQlITUQoKCJleHRlcm5hbCwgZGlzYWJsZSBNSUksICIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcsIEJJR01BQ19YQ0ZHX01JSURJU0FCKTsKKwkJYnJlYWs7CisJfTsKKworCWlmIChoYXBweV9tZWFsX3RjdnJfcmVzZXQoaHAsIHRyZWdzKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBSZXNldCB0aGUgSGFwcHkgTWVhbCBCaWcgTWFjIHRyYW5zY2VpdmVyIGFuZCB0aGUgcmVjZWl2ZXIuICovCisJSE1EKCgidHgvcnggcmVzZXQsICIpKTsKKwloYXBweV9tZWFsX3R4X3Jlc2V0KGhwLCBicmVncyk7CisJaGFwcHlfbWVhbF9yeF9yZXNldChocCwgYnJlZ3MpOworCisJLyogU2V0IGphbSBzaXplIGFuZCBpbnRlci1wYWNrZXQgZ2FwcyB0byByZWFzb25hYmxlIGRlZmF1bHRzLiAqLworCUhNRCgoImpzaXplL2lwZzEvaXBnMiwgIikpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSlNJWkUsIERFRkFVTFRfSkFNU0laRSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19JR0FQMSwgREVGQVVMVF9JUEcxKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0lHQVAyLCBERUZBVUxUX0lQRzIpOworCisJLyogTG9hZCB1cCB0aGUgTUFDIGFkZHJlc3MgYW5kIHJhbmRvbSBzZWVkLiAqLworCUhNRCgoInJzZWVkL21hY2FkZHIsICIpKTsKKworCS8qIFRoZSBkb2NzIHJlY29tbWVuZCB0byB1c2UgdGhlIDEwTFNCIG9mIG91ciBNQUMgaGVyZS4gKi8KKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JTRUVELCAoKGVbNV0gfCBlWzRdPDw4KSYweDNmZikpOworCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19NQUNBRERSMiwgKChlWzRdIDw8IDgpIHwgZVs1XSkpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfTUFDQUREUjEsICgoZVsyXSA8PCA4KSB8IGVbM10pKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX01BQ0FERFIwLCAoKGVbMF0gPDwgOCkgfCBlWzFdKSk7CisKKwlITUQoKCJodGFibGUsICIpKTsKKwlpZiAoKGhwLT5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAoaHAtPmRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUwLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMiwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUzLCAweGZmZmYpOworCX0gZWxzZSBpZiAoKGhwLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID09IDApIHsKKwkJdTE2IGhhc2hfdGFibGVbNF07CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gaHAtPmRldi0+bWNfbGlzdDsKKwkJY2hhciAqYWRkcnM7CisJCWludCBpOworCQl1MzIgY3JjOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgaHAtPmRldi0+bWNfY291bnQ7IGkrKykgeworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCisJCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMCwgaGFzaF90YWJsZVswXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMSwgaGFzaF90YWJsZVsxXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMiwgaGFzaF90YWJsZVsyXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMywgaGFzaF90YWJsZVszXSk7CisJfSBlbHNlIHsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUzLCAwKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUyLCAwKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUxLCAwKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUwLCAwKTsKKwl9CisKKwkvKiBTZXQgdGhlIFJYIGFuZCBUWCByaW5nIHB0cnMuICovCisJSE1EKCgicmluZyBwdHJzIHJ4clslMDh4XSB0eHJbJTA4eF1cbiIsCisJICAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF9yeGQsIDApKSwKKwkgICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3R4ZCwgMCkpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGVyeHJlZ3MgKyBFUlhfUklORywKKwkJICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3J4ZCwgMCkpKTsKKwlobWVfd3JpdGUzMihocCwgZXR4cmVncyArIEVUWF9SSU5HLAorCQkgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfdHhkLCAwKSkpOworCisJLyogUGFyaXR5IGlzc3VlcyBpbiB0aGUgRVJYIHVuaXQgb2Ygc29tZSBITUUgcmV2aXNpb25zIGNhbiBjYXVzZSBzb21lCisJICogcmVnaXN0ZXJzIHRvIG5vdCBiZSB3cml0dGVuIHVubGVzcyB0aGVpciBwYXJpdHkgaXMgZXZlbi4gIERldGVjdCBzdWNoCisJICogbG9zdCB3cml0ZXMgYW5kIHNpbXBseSByZXdyaXRlIHdpdGggYSBsb3cgYml0IHNldCAod2hpY2ggd2lsbCBiZSBpZ25vcmVkCisJICogc2luY2UgdGhlIHJ4cmluZyBuZWVkcyB0byBiZSAySyBhbGlnbmVkKS4KKwkgKi8KKwlpZiAoaG1lX3JlYWQzMihocCwgZXJ4cmVncyArIEVSWF9SSU5HKSAhPQorCSAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF9yeGQsIDApKSkKKwkJaG1lX3dyaXRlMzIoaHAsIGVyeHJlZ3MgKyBFUlhfUklORywKKwkJCSAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF9yeGQsIDApKQorCQkJICAgIHwgMHg0KTsKKworCS8qIFNldCB0aGUgc3VwcG9ydGVkIGJ1cnN0IHNpemVzLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogb2xkWyUwOHhdIGJ1cnN0czwiLAorCSAgICAgaG1lX3JlYWQzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRykpKTsKKworI2lmbmRlZiBfX3NwYXJjX18KKwkvKiBJdCBpcyBhbHdheXMgUENJIGFuZCBjYW4gaGFuZGxlIDY0Ynl0ZSBidXJzdHMuICovCisJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIEdSRUdfQ0ZHX0JVUlNUNjQpOworI2Vsc2UKKwlpZiAoKGhwLT5oYXBweV9idXJzdHMgJiBETUFfQlVSU1Q2NCkgJiYKKwkgICAgKChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpICE9IDAKKyNpZmRlZiBDT05GSUdfU0JVUworCSAgICAgfHwgc2J1c19jYW5fYnVyc3Q2NChocC0+aGFwcHlfZGV2KQorI2VuZGlmCisJICAgICB8fCAwKSkgeworCQl1MzIgZ2NmZyA9IEdSRUdfQ0ZHX0JVUlNUNjQ7CisKKwkJLyogSSBoYXZlIG5vIGlkZWEgaWYgSSBzaG91bGQgc2V0IHRoZSBleHRlbmRlZAorCQkgKiB0cmFuc2ZlciBtb2RlIGJpdCBmb3IgQ2hlZXJpbywgc28gZm9yIG5vdyBJCisJCSAqIGRvIG5vdC4gIC1EYXZlTQorCQkgKi8KKyNpZmRlZiBDT05GSUdfU0JVUworCQlpZiAoKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkgPT0gMCAmJgorCQkgICAgc2J1c19jYW5fZG1hXzY0Yml0KGhwLT5oYXBweV9kZXYpKSB7CisJCQlzYnVzX3NldF9zYnVzNjQoaHAtPmhhcHB5X2RldiwKKwkJCQkJaHAtPmhhcHB5X2J1cnN0cyk7CisJCQlnY2ZnIHw9IEdSRUdfQ0ZHXzY0QklUOworCQl9CisjZW5kaWYKKworCQlITUQoKCI2ND4iKSk7CisJCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfQ0ZHLCBnY2ZnKTsKKwl9IGVsc2UgaWYgKGhwLT5oYXBweV9idXJzdHMgJiBETUFfQlVSU1QzMikgeworCQlITUQoKCIzMj4iKSk7CisJCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfQ0ZHLCBHUkVHX0NGR19CVVJTVDMyKTsKKwl9IGVsc2UgaWYgKGhwLT5oYXBweV9idXJzdHMgJiBETUFfQlVSU1QxNikgeworCQlITUQoKCIxNj4iKSk7CisJCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfQ0ZHLCBHUkVHX0NGR19CVVJTVDE2KTsKKwl9IGVsc2UgeworCQlITUQoKCJYWFg+IikpOworCQlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgMCk7CisJfQorI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyB3ZSBkbyBub3Qgd2FudCB0byBoZWFyLiAqLworCUhNRCgoIiwgZW5hYmxlIGdsb2JhbCBpbnRlcnJ1cHRzLCAiKSk7CisJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19JTUFTSywKKwkJICAgIChHUkVHX0lNQVNLX0dPVEZSQU1FIHwgR1JFR19JTUFTS19SQ05URVhQIHwKKwkJICAgICBHUkVHX0lNQVNLX1NFTlRGUkFNRSB8IEdSRUdfSU1BU0tfVFhQRVJSKSk7CisKKwkvKiBTZXQgdGhlIHRyYW5zbWl0IHJpbmcgYnVmZmVyIHNpemUuICovCisJSE1EKCgidHggcnNpemU9JWQgb3JlZ1slMDh4XSwgIiwgKGludClUWF9SSU5HX1NJWkUsCisJICAgICBobWVfcmVhZDMyKGhwLCBldHhyZWdzICsgRVRYX1JTSVpFKSkpOworCWhtZV93cml0ZTMyKGhwLCBldHhyZWdzICsgRVRYX1JTSVpFLCAoVFhfUklOR19TSVpFID4+IEVUWF9SU0laRV9TSElGVCkgLSAxKTsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlciBEVk1BLiAqLworCUhNRCgoInR4IGRtYSBlbmFibGUgb2xkWyUwOHhdLCAiLAorCSAgICAgaG1lX3JlYWQzMihocCwgZXR4cmVncyArIEVUWF9DRkcpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGV0eHJlZ3MgKyBFVFhfQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgZXR4cmVncyArIEVUWF9DRkcpIHwgRVRYX0NGR19ETUFFTkFCTEUpOworCisJLyogVGhpcyBjaGlwIHJlYWxseSByb3RzLCBmb3IgdGhlIHJlY2VpdmVyIHNvbWV0aW1lcyB3aGVuIHlvdQorCSAqIHdyaXRlIHRvIGl0cyBjb250cm9sIHJlZ2lzdGVycyBub3QgYWxsIHRoZSBiaXRzIGdldCB0aGVyZQorCSAqIHByb3Blcmx5LiAgSSBjYW5ub3QgdGhpbmsgb2YgYSBzYW5lIHdheSB0byBwcm92aWRlIGNvbXBsZXRlCisJICogY292ZXJhZ2UgZm9yIHRoaXMgaGFyZHdhcmUgYnVnIHlldC4KKwkgKi8KKwlITUQoKCJlcnggcmVncyBidWcgb2xkWyUwOHhdXG4iLAorCSAgICAgaG1lX3JlYWQzMihocCwgZXJ4cmVncyArIEVSWF9DRkcpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGVyeHJlZ3MgKyBFUlhfQ0ZHLCBFUlhfQ0ZHX0RFRkFVTFQoUlhfT0ZGU0VUKSk7CisJcmVndG1wID0gaG1lX3JlYWQzMihocCwgZXJ4cmVncyArIEVSWF9DRkcpOworCWhtZV93cml0ZTMyKGhwLCBlcnhyZWdzICsgRVJYX0NGRywgRVJYX0NGR19ERUZBVUxUKFJYX09GRlNFVCkpOworCWlmIChobWVfcmVhZDMyKGhwLCBlcnhyZWdzICsgRVJYX0NGRykgIT0gRVJYX0NGR19ERUZBVUxUKFJYX09GRlNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBFaWVlZSwgcnggY29uZmlnIHJlZ2lzdGVyIGdldHMgZ3JlYXN5IGZyaWVzLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogVHJ5aW5nIHRvIHNldCAlMDh4LCByZXJlYWQgZ2l2ZXMgJTA4eFxuIiwKKwkJICAgICAgIEVSWF9DRkdfREVGQVVMVChSWF9PRkZTRVQpLCByZWd0bXApOworCQkvKiBYWFggU2hvdWxkIHJldHVybiBmYWlsdXJlIGhlcmUuLi4gKi8KKwl9CisKKwkvKiBFbmFibGUgQmlnIE1hYyBoYXNoIHRhYmxlIGZpbHRlci4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IGVuYWJsZSBoYXNoIHJ4X2NmZ19vbGRbJTA4eF0sICIsCisJICAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcpKSk7CisJcnhjZmcgPSBCSUdNQUNfUlhDRkdfSEVOQUJMRSB8IEJJR01BQ19SWENGR19SRUpNRTsKKwlpZiAoaHAtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJcnhjZmcgfD0gQklHTUFDX1JYQ0ZHX1BNSVNDOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcsIHJ4Y2ZnKTsKKworCS8qIExldCB0aGUgYml0cyBzZXR0bGUgaW4gdGhlIGNoaXAuICovCisJdWRlbGF5KDEwKTsKKworCS8qIE9rLCBjb25maWd1cmUgdGhlIEJpZyBNYWMgdHJhbnNtaXR0ZXIuICovCisJSE1EKCgiQklHTUFDIGluaXQsICIpKTsKKwlyZWd0bXAgPSAwOworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19GVUxMKQorCQlyZWd0bXAgfD0gQklHTUFDX1RYQ0ZHX0ZVTExEUExYOworCisJLyogRG9uJ3QgdHVybiBvbiB0aGUgImRvbid0IGdpdmUgdXAiIGJpdCBmb3Igbm93LiAgSXQgY291bGQgY2F1c2UgaG1lCisJICogdG8gZGVhZGxvY2sgd2l0aCB0aGUgUEhZIGlmIGEgSmFiYmVyIG9jY3Vycy4KKwkgKi8KKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1RYQ0ZHLCByZWd0bXAgLyp8IEJJR01BQ19UWENGR19ER0lWRVVQKi8pOworCisJLyogR2l2ZSB1cCBhZnRlciAxNiBUWCBhdHRlbXB0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0FMSU1JVCwgMTYpOworCisJLyogRW5hYmxlIHRoZSBvdXRwdXQgZHJpdmVycyBubyBtYXR0ZXIgd2hhdC4gKi8KKwlyZWd0bXAgPSBCSUdNQUNfWENGR19PREVOQUJMRTsKKworCS8qIElmIGNhcmQgY2FuIGRvIGxhbmNlIG1vZGUsIGVuYWJsZSBpdC4gKi8KKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfTEFOQ0UpCisJCXJlZ3RtcCB8PSAoREVGQVVMVF9JUEcwIDw8IDUpIHwgQklHTUFDX1hDRkdfTEFOQ0U7CisKKwkvKiBEaXNhYmxlIHRoZSBNSUkgYnVmZmVycyBpZiB1c2luZyBleHRlcm5hbCB0cmFuc2NlaXZlci4gKi8KKwlpZiAoaHAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkKKwkJcmVndG1wIHw9IEJJR01BQ19YQ0ZHX01JSURJU0FCOworCisJSE1EKCgiWElGIGNvbmZpZyBvbGRbJTA4eF0sICIsCisJICAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHKSkpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHLCByZWd0bXApOworCisJLyogU3RhcnQgdGhpbmdzIHVwLiAqLworCUhNRCgoInR4IG9sZFslMDh4XSBhbmQgcnggWyUwOHhdIE9OIVxuIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19UWENGRyksCisJICAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19UWENGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19UWENGRykgfCBCSUdNQUNfVFhDRkdfRU5BQkxFKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKSB8IEJJR01BQ19SWENGR19FTkFCTEUpOworCisJLyogR2V0IHRoZSBhdXRvbmVnb3RpYXRpb24gc3RhcnRlZCwgYW5kIHRoZSB3YXRjaCB0aW1lciB0aWNraW5nLiAqLworCWhhcHB5X21lYWxfYmVnaW5fYXV0b19uZWdvdGlhdGlvbihocCwgdHJlZ3MsIE5VTEwpOworCisJLyogU3VjY2Vzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3NldF9pbml0aWFsX2FkdmVydGlzZW1lbnQoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXZvaWQgX19pb21lbSAqdHJlZ3MJPSBocC0+dGN2cmVnczsKKwl2b2lkIF9faW9tZW0gKmJyZWdzCT0gaHAtPmJpZ21hY3JlZ3M7CisJdm9pZCBfX2lvbWVtICpncmVncwk9IGhwLT5ncmVnczsKKworCWhhcHB5X21lYWxfc3RvcChocCwgZ3JlZ3MpOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfSU1BU0ssIDB4ZmZmZik7CisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0ZFTkFCTEUpCisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpICYgfihUQ1ZfQ0ZHX0JFTkFCTEUpKTsKKwllbHNlCisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpIHwgVENWX0NGR19CRU5BQkxFKTsKKwloYXBweV9tZWFsX3RyYW5zY2VpdmVyX2NoZWNrKGhwLCB0cmVncyk7CisJc3dpdGNoKGhwLT50Y3ZyX3R5cGUpIHsKKwljYXNlIG5vbmU6CisJCXJldHVybjsKKwljYXNlIGludGVybmFsOgorCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRywgMCk7CisJCWJyZWFrOworCWNhc2UgZXh0ZXJuYWw6CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHLCBCSUdNQUNfWENGR19NSUlESVNBQik7CisJCWJyZWFrOworCX07CisJaWYgKGhhcHB5X21lYWxfdGN2cl9yZXNldChocCwgdHJlZ3MpKQorCQlyZXR1cm47CisKKwkvKiBMYXRjaCBQSFkgcmVnaXN0ZXJzIGFzIG9mIG5vdy4gKi8KKwlocC0+c3dfYm1zciAgICAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJaHAtPnN3X2FkdmVydGlzZSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0FEVkVSVElTRSk7CisKKwkvKiBBZHZlcnRpc2UgZXZlcnl0aGluZyB3ZSBjYW4gc3VwcG9ydC4gKi8KKwlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwSEFMRikKKwkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwSEFMRik7CisJZWxzZQorCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwSEFMRik7CisKKwlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwRlVMTCkKKwkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwRlVMTCk7CisJZWxzZQorCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwRlVMTCk7CisJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMDBIQUxGKQorCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTAwSEFMRik7CisJZWxzZQorCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwMEhBTEYpOworCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTAwRlVMTCkKKwkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwMEZVTEwpOworCWVsc2UKKwkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMDBGVUxMKTsKKworCS8qIFVwZGF0ZSB0aGUgUEhZIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0FEVkVSVElTRSwgaHAtPnN3X2FkdmVydGlzZSk7Cit9CisKKy8qIE9uY2Ugc3RhdHVzIGlzIGxhdGNoZWQgKGJ5IGhhcHB5X21lYWxfaW50ZXJydXB0KSBpdCBpcyBjbGVhcmVkIGJ5CisgKiB0aGUgaGFyZHdhcmUsIHNvIHdlIGNhbm5vdCByZS1yZWFkIGl0IGFuZCBnZXQgYSBjb3JyZWN0IHZhbHVlLgorICoKKyAqIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgaW50IGhhcHB5X21lYWxfaXNfbm90X3NvX2hhcHB5KHN0cnVjdCBoYXBweV9tZWFsICpocCwgdTMyIHN0YXR1cykKK3sKKwlpbnQgcmVzZXQgPSAwOworCQorCS8qIE9ubHkgcHJpbnQgbWVzc2FnZXMgZm9yIG5vbi1jb3VudGVyIHJlbGF0ZWQgaW50ZXJydXB0cy4gKi8KKwlpZiAoc3RhdHVzICYgKEdSRUdfU1RBVF9TVFNURVJSIHwgR1JFR19TVEFUX1RGSUZPX1VORCB8CisJCSAgICAgIEdSRUdfU1RBVF9NQVhQS1RFUlIgfCBHUkVHX1NUQVRfUlhFUlIgfAorCQkgICAgICBHUkVHX1NUQVRfUlhQRVJSIHwgR1JFR19TVEFUX1JYVEVSUiB8IEdSRUdfU1RBVF9FT1BFUlIgfAorCQkgICAgICBHUkVHX1NUQVRfTUlGSVJRIHwgR1JFR19TVEFUX1RYRUFDSyB8IEdSRUdfU1RBVF9UWExFUlIgfAorCQkgICAgICBHUkVHX1NUQVRfVFhQRVJSIHwgR1JFR19TVEFUX1RYVEVSUiB8IEdSRUdfU1RBVF9TTFZFUlIgfAorCQkgICAgICBHUkVHX1NUQVRfU0xWUEVSUikpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGludGVycnVwdCBmb3IgaGFwcHkgbWVhbCwgc3RhdHVzID0gJTA4eFxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1JGSUZPVkYpIHsKKwkJLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93IGlzIGhhcm1sZXNzIGFuZCB0aGUgaGFyZHdhcmUgd2lsbCB0YWtlCisJCSAgIGNhcmUgb2YgaXQsIGp1c3Qgc29tZSBwYWNrZXRzIGFyZSBsb3N0LiBXaG8gY2FyZXMuICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSGFwcHkgTWVhbCByZWNlaXZlIEZJRk8gb3ZlcmZsb3cuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1NUU1RFUlIpIHsKKwkJLyogQmlnTUFDIFNRRSBsaW5rIHRlc3QgZmFpbGVkLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIEJpZ01BQyBTUUUgdGVzdCBmYWlsZWQuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfVEZJRk9fVU5EKSB7CisJCS8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4sIGFnYWluIERNQSBlcnJvciBsaWtlbHkuICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgdHJhbnNtaXR0ZXIgRklGTyB1bmRlcnJ1biwgRE1BIGVycm9yLlxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9NQVhQS1RFUlIpIHsKKwkJLyogRHJpdmVyIGVycm9yLCB0cmllZCB0byB0cmFuc21pdCBzb21ldGhpbmcgbGFyZ2VyCisJCSAqIHRoYW4gZXRoZXJuZXQgbWF4IG10dS4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgTUFYIFBhY2tldCBzaXplIGVycm9yLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX05PUlhEKSB7CisJCS8qIFRoaXMgaXMgaGFybWxlc3MsIGl0IGp1c3QgbWVhbnMgdGhlIHN5c3RlbSBpcworCQkgKiBxdWl0ZSBsb2FkZWQgYW5kIHRoZSBpbmNvbWluZyBwYWNrZXQgcmF0ZSB3YXMKKwkJICogZmFzdGVyIHRoYW4gdGhlIGludGVycnVwdCBoYW5kbGVyIGNvdWxkIGtlZXAgdXAKKwkJICogd2l0aC4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXBweSBNZWFsIG91dCBvZiByZWNlaXZlICIKKwkJICAgICAgICJkZXNjcmlwdG9ycywgcGFja2V0IGRyb3BwZWQuXG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJfQorCisJaWYgKHN0YXR1cyAmIChHUkVHX1NUQVRfUlhFUlJ8R1JFR19TVEFUX1JYUEVSUnxHUkVHX1NUQVRfUlhURVJSKSkgeworCQkvKiBBbGwgc29ydHMgb2YgRE1BIHJlY2VpdmUgZXJyb3JzLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIHJ4IERNQSBlcnJvcnMgWyAiLCBocC0+ZGV2LT5uYW1lKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9SWEVSUikKKwkJCXByaW50aygiR2VuZXJpY0Vycm9yICIpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1JYUEVSUikKKwkJCXByaW50aygiUGFyaXR5RXJyb3IgIik7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfUlhURVJSKQorCQkJcHJpbnRrKCJSeFRhZ0JvdGNoICIpOworCQlwcmludGsoIl1cbiIpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9FT1BFUlIpIHsKKwkJLyogRHJpdmVyIGJ1ZywgZGlkbid0IHNldCBFT1AgYml0IGluIHR4IGRlc2NyaXB0b3IgZ2l2ZW4KKwkJICogdG8gdGhlIGhhcHB5IG1lYWwuCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFT1Agbm90IHNldCBpbiBoYXBweSBtZWFsIHRyYW5zbWl0IGRlc2NyaXB0b3IhXG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX01JRklSUSkgeworCQkvKiBNSUYgc2lnbmFsbGVkIGFuIGludGVycnVwdCwgd2VyZSB3ZSBwb2xsaW5nIGl0PyAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIE1JRiBpbnRlcnJ1cHQuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAoc3RhdHVzICYKKwkgICAgKEdSRUdfU1RBVF9UWEVBQ0t8R1JFR19TVEFUX1RYTEVSUnxHUkVHX1NUQVRfVFhQRVJSfEdSRUdfU1RBVF9UWFRFUlIpKSB7CisJCS8qIEFsbCBzb3J0cyBvZiB0cmFuc21pdCBETUEgZXJyb3JzLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIHR4IERNQSBlcnJvcnMgWyAiLCBocC0+ZGV2LT5uYW1lKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9UWEVBQ0spCisJCQlwcmludGsoIkdlbmVyaWNFcnJvciAiKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9UWExFUlIpCisJCQlwcmludGsoIkxhdGVFcnJvciAiKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9UWFBFUlIpCisJCQlwcmludGsoIlBhcml0eUVycm8gIik7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfVFhURVJSKQorCQkJcHJpbnRrKCJUYWdCb3RjaCAiKTsKKwkJcHJpbnRrKCJdXG4iKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiAoR1JFR19TVEFUX1NMVkVSUnxHUkVHX1NUQVRfU0xWUEVSUikpIHsKKwkJLyogQnVzIG9yIHBhcml0eSBlcnJvciB3aGVuIGNwdSBhY2Nlc3NlZCBoYXBweSBtZWFsIHJlZ2lzdGVycworCQkgKiBvciBpdCdzIGludGVybmFsIEZJRk8ncy4gIFNob3VsZCBuZXZlciBzZWUgdGhpcy4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgcmVnaXN0ZXIgYWNjZXNzIFNCVVMgc2xhdmUgKCVzKSBlcnJvci5cbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lLAorCQkgICAgICAgKHN0YXR1cyAmIEdSRUdfU1RBVF9TTFZQRVJSKSA/ICJwYXJpdHkiIDogImdlbmVyaWMiKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChyZXNldCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSZXNldHRpbmcuLi5cbiIsIGhwLT5kZXYtPm5hbWUpOworCQloYXBweV9tZWFsX2luaXQoaHApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9taWZfaW50ZXJydXB0KHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gaHAtPnRjdnJlZ3M7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBzdGF0dXMgY2hhbmdlLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwlocC0+c3dfbHBhID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfTFBBKTsKKworCS8qIFVzZSB0aGUgZmFzdGVzdCB0cmFuc21pc3Npb24gcHJvdG9jb2wgcG9zc2libGUuICovCisJaWYgKGhwLT5zd19scGEgJiBMUEFfMTAwRlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3dpdGNoaW5nIHRvIDEwME1icHMgYXQgZnVsbCBkdXBsZXguIiwgaHAtPmRldi0+bmFtZSk7CisJCWhwLT5zd19ibWNyIHw9IChCTUNSX0ZVTExEUExYIHwgQk1DUl9TUEVFRDEwMCk7CisJfSBlbHNlIGlmIChocC0+c3dfbHBhICYgTFBBXzEwMEhBTEYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN3aXRjaGluZyB0byAxMDBNQnBzIGF0IGhhbGYgZHVwbGV4LiIsIGhwLT5kZXYtPm5hbWUpOworCQlocC0+c3dfYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCX0gZWxzZSBpZiAoaHAtPnN3X2xwYSAmIExQQV8xMEZVTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN3aXRjaGluZyB0byAxME1CcHMgYXQgZnVsbCBkdXBsZXguIiwgaHAtPmRldi0+bmFtZSk7CisJCWhwLT5zd19ibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIDEwTWJwcyBhdCBoYWxmIGR1cGxleC4iLCBocC0+ZGV2LT5uYW1lKTsKKwl9CisJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCS8qIEZpbmFsbHkgc3RvcCBwb2xsaW5nIGFuZCBzaHV0IHVwIHRoZSBNSUYuICovCisJaGFwcHlfbWVhbF9wb2xsX3N0b3AoaHAsIHRyZWdzKTsKK30KKworI2lmZGVmIFRYREVCVUcKKyNkZWZpbmUgVFhEKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBUWEQoeCkKKyNlbmRpZgorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdHgoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdHhiYXNlID0gJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF90eGRbMF07CisJc3RydWN0IGhhcHB5X21lYWxfdHhkICp0aGlzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBocC0+ZGV2OworCWludCBlbGVtOworCisJZWxlbSA9IGhwLT50eF9vbGQ7CisJVFhEKCgiVFg8IikpOworCXdoaWxlIChlbGVtICE9IGhwLT50eF9uZXcpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTMyIGZsYWdzLCBkbWFfYWRkciwgZG1hX2xlbjsKKwkJaW50IGZyYWc7CisKKwkJVFhEKCgiWyVkXSIsIGVsZW0pKTsKKwkJdGhpcyA9ICZ0eGJhc2VbZWxlbV07CisJCWZsYWdzID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdGhpcy0+dHhfZmxhZ3MpOworCQlpZiAoZmxhZ3MgJiBUWEZMQUdfT1dOKQorCQkJYnJlYWs7CisJCXNrYiA9IGhwLT50eF9za2JzW2VsZW1dOworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgeworCQkJaW50IGxhc3Q7CisKKwkJCWxhc3QgPSBlbGVtICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCWxhc3QgJj0gKFRYX1JJTkdfU0laRSAtIDEpOworCQkJZmxhZ3MgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0eGJhc2VbbGFzdF0udHhfZmxhZ3MpOworCQkJaWYgKGZsYWdzICYgVFhGTEFHX09XTikKKwkJCQlicmVhazsKKwkJfQorCQlocC0+dHhfc2tic1tlbGVtXSA9IE5VTEw7CisJCWhwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJZm9yIChmcmFnID0gMDsgZnJhZyA8PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCWRtYV9hZGRyID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdGhpcy0+dHhfYWRkcik7CisJCQlkbWFfbGVuID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdGhpcy0+dHhfZmxhZ3MpOworCisJCQlkbWFfbGVuICY9IFRYRkxBR19TSVpFOworCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsIGRtYV9sZW4sIERNQV9UT0RFVklDRSk7CisKKwkJCWVsZW0gPSBORVhUX1RYKGVsZW0pOworCQkJdGhpcyA9ICZ0eGJhc2VbZWxlbV07CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlocC0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwl9CisJaHAtPnR4X29sZCA9IGVsZW07CisJVFhEKCgiPiIpKTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwoaHApID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisjaWZkZWYgUlhERUJVRworI2RlZmluZSBSWEQoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIFJYRCh4KQorI2VuZGlmCisKKy8qIE9yaWdpbmFsbHkgSSB1c2VkIHRvIGhhbmRsZSB0aGUgYWxsb2NhdGlvbiBmYWlsdXJlIGJ5IGp1c3QgZ2l2aW5nIGJhY2sganVzdAorICogdGhhdCBvbmUgcmluZyBidWZmZXIgdG8gdGhlIGhhcHB5IG1lYWwuICBQcm9ibGVtIGlzIHRoYXQgdXN1YWxseSB3aGVuIHRoYXQKKyAqIGNvbmRpdGlvbiBpcyB0cmlnZ2VyZWQsIHRoZSBoYXBweSBtZWFsIGV4cGVjdHMgeW91IHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlCisgKiB3aXRoIGFsbCBvZiB0aGUgcGFja2V0cyBpdCBoYXMgRE1BJ2QgaW4uICBTbyBub3cgSSBqdXN0IGRyb3AgdGhlIGVudGlyZQorICogcmluZyB3aGVuIHdlIGNhbm5vdCBnZXQgYSBuZXcgc2tiIGFuZCBnaXZlIHRoZW0gYWxsIGJhY2sgdG8gdGhlIGhhcHB5IG1lYWwsCisgKiBtYXliZSB0aGluZ3Mgd2lsbCBiZSAiaGFwcGllciIgbm93LgorICoKKyAqIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3J4KHN0cnVjdCBoYXBweV9tZWFsICpocCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4YmFzZSA9ICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfcnhkWzBdOworCXN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqdGhpczsKKwlpbnQgZWxlbSA9IGhwLT5yeF9uZXcsIGRyb3BzID0gMDsKKwl1MzIgZmxhZ3M7CisKKwlSWEQoKCJSWDwiKSk7CisJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJd2hpbGUgKCEoKGZsYWdzID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdGhpcy0+cnhfZmxhZ3MpKSAmIFJYRkxBR19PV04pKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBsZW4gPSBmbGFncyA+PiAxNjsKKwkJdTE2IGNzdW0gPSBmbGFncyAmIFJYRkxBR19DU1VNOworCQl1MzIgZG1hX2FkZHIgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT5yeF9hZGRyKTsKKworCQlSWEQoKCJbJWQgIiwgZWxlbSkpOworCisJCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJCWlmICgobGVuIDwgRVRIX1pMRU4pIHx8IChmbGFncyAmIFJYRkxBR19PVkVSRkxPVykpIHsKKwkJCVJYRCgoIkVSUiglMDh4KV0iLCBmbGFncykpOworCQkJaHAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChsZW4gPCBFVEhfWkxFTikKKwkJCQlocC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChsZW4gJiAoUlhGTEFHX09WRVJGTE9XID4+IDE2KSkgeworCQkJCWhwLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlocC0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQl9CisKKwkJCS8qIFJldHVybiBpdCB0byB0aGUgSGFwcHkgbWVhbC4gKi8KKwlkcm9wX2l0OgorCQkJaHAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlobWVfd3JpdGVfcnhkKGhwLCB0aGlzLAorCQkJCSAgICAgIChSWEZMQUdfT1dOfCgoUlhfQlVGX0FMTE9DX1NJWkUtUlhfT0ZGU0VUKTw8MTYpKSwKKwkJCQkgICAgICBkbWFfYWRkcik7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJc2tiID0gaHAtPnJ4X3NrYnNbZWxlbV07CisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJCS8qIE5vdyByZWZpbGwgdGhlIGVudHJ5LCBpZiB3ZSBjYW4uICovCisJCQluZXdfc2tiID0gaGFwcHlfbWVhbF9hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTURFVklDRSk7CisJCQlocC0+cnhfc2tic1tlbGVtXSA9IG5ld19za2I7CisJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcHV0KG5ld19za2IsIChFVEhfRlJBTUVfTEVOICsgUlhfT0ZGU0VUKSk7CisJCQlobWVfd3JpdGVfcnhkKGhwLCB0aGlzLAorCQkJCSAgICAgIChSWEZMQUdfT1dOfCgoUlhfQlVGX0FMTE9DX1NJWkUtUlhfT0ZGU0VUKTw8MTYpKSwKKwkJCQkgICAgICBobWVfZG1hX21hcChocCwgbmV3X3NrYi0+ZGF0YSwgUlhfQlVGX0FMTE9DX1NJWkUsIERNQV9GUk9NREVWSUNFKSk7CisJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBSWF9PRkZTRVQpOworCisJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpjb3B5X3NrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisKKwkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisKKwkJCWNvcHlfc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CisJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOworCQkJaG1lX2RtYV9zeW5jX2Zvcl9jcHUoaHAsIGRtYV9hZGRyLCBsZW4sIERNQV9GUk9NREVWSUNFKTsKKwkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQkJaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoaHAsIGRtYV9hZGRyLCBsZW4sIERNQV9GUk9NREVWSUNFKTsKKworCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCisJCQlobWVfd3JpdGVfcnhkKGhwLCB0aGlzLAorCQkJCSAgICAgIChSWEZMQUdfT1dOfCgoUlhfQlVGX0FMTE9DX1NJWkUtUlhfT0ZGU0VUKTw8MTYpKSwKKwkJCQkgICAgICBkbWFfYWRkcik7CisKKwkJCXNrYiA9IGNvcHlfc2tiOworCQl9CisKKwkJLyogVGhpcyBjYXJkIGlzIF9mdWNraW5nXyBob3QuLi4gKi8KKwkJc2tiLT5jc3VtID0gbnRvaHMoY3N1bSBeIDB4ZmZmZik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisKKwkJUlhEKCgibGVuPSVkIGNzdW09JTR4XSIsIGxlbiwgY3N1bSkpOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yeChza2IpOworCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWhwLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQlocC0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwluZXh0OgorCQllbGVtID0gTkVYVF9SWChlbGVtKTsKKwkJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJfQorCWhwLT5yeF9uZXcgPSBlbGVtOworCWlmIChkcm9wcykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwgaHAtPmRldi0+bmFtZSk7CisJUlhEKCgiPiIpKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGhhcHB5X21lYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwICA9IGRldi0+cHJpdjsKKwl1MzIgaGFwcHlfc3RhdHVzICAgICAgID0gaG1lX3JlYWQzMihocCwgaHAtPmdyZWdzICsgR1JFR19TVEFUKTsKKworCUhNRCgoImhhcHB5X21lYWxfaW50ZXJydXB0OiBzdGF0dXM9JTA4eCAiLCBoYXBweV9zdGF0dXMpKTsKKworCXNwaW5fbG9jaygmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9FUlJPUlMpIHsKKwkJSE1EKCgiRVJST1JTICIpKTsKKwkJaWYgKGhhcHB5X21lYWxfaXNfbm90X3NvX2hhcHB5KGhwLCAvKiB1bi0gKi8gaGFwcHlfc3RhdHVzKSkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfTUlGSVJRKSB7CisJCUhNRCgoIk1JRklSUSAiKSk7CisJCWhhcHB5X21lYWxfbWlmX2ludGVycnVwdChocCk7CisJfQorCisJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9UWEFMTCkgeworCQlITUQoKCJUWEFMTCAiKSk7CisJCWhhcHB5X21lYWxfdHgoaHApOworCX0KKworCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhUT0hPU1QpIHsKKwkJSE1EKCgiUlhUT0hPU1QgIikpOworCQloYXBweV9tZWFsX3J4KGhwLCBkZXYpOworCX0KKworCUhNRCgoImRvbmVcbiIpKTsKK291dDoKKwlzcGluX3VubG9jaygmaHAtPmhhcHB5X2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBpcnFyZXR1cm5fdCBxdWF0dHJvX3NidXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvb2tpZSwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwlzdHJ1Y3QgcXVhdHRybyAqcXAgPSAoc3RydWN0IHF1YXR0cm8gKikgY29va2llOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXAtPmhhcHB5X21lYWxzW2ldOworCQlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgID0gZGV2LT5wcml2OworCQl1MzIgaGFwcHlfc3RhdHVzICAgICAgID0gaG1lX3JlYWQzMihocCwgaHAtPmdyZWdzICsgR1JFR19TVEFUKTsKKworCQlITUQoKCJxdWF0dHJvX2ludGVycnVwdDogc3RhdHVzPSUwOHggIiwgaGFwcHlfc3RhdHVzKSk7CisKKwkJaWYgKCEoaGFwcHlfc3RhdHVzICYgKEdSRUdfU1RBVF9FUlJPUlMgfAorCQkJCSAgICAgIEdSRUdfU1RBVF9NSUZJUlEgfAorCQkJCSAgICAgIEdSRUdfU1RBVF9UWEFMTCB8CisJCQkJICAgICAgR1JFR19TVEFUX1JYVE9IT1NUKSkpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2soJmhwLT5oYXBweV9sb2NrKTsKKworCQlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX0VSUk9SUykgeworCQkJSE1EKCgiRVJST1JTICIpKTsKKwkJCWlmIChoYXBweV9tZWFsX2lzX25vdF9zb19oYXBweShocCwgaGFwcHlfc3RhdHVzKSkKKwkJCQlnb3RvIG5leHQ7CisJCX0KKworCQlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX01JRklSUSkgeworCQkJSE1EKCgiTUlGSVJRICIpKTsKKwkJCWhhcHB5X21lYWxfbWlmX2ludGVycnVwdChocCk7CisJCX0KKworCQlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX1RYQUxMKSB7CisJCQlITUQoKCJUWEFMTCAiKSk7CisJCQloYXBweV9tZWFsX3R4KGhwKTsKKwkJfQorCisJCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhUT0hPU1QpIHsKKwkJCUhNRCgoIlJYVE9IT1NUICIpKTsKKwkJCWhhcHB5X21lYWxfcngoaHAsIGRldik7CisJCX0KKworCW5leHQ6CisJCXNwaW5fdW5sb2NrKCZocC0+aGFwcHlfbG9jayk7CisJfQorCUhNRCgoImRvbmVcbiIpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGhhcHB5X21lYWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKwlpbnQgcmVzOworCisJSE1EKCgiaGFwcHlfbWVhbF9vcGVuOiAiKSk7CisKKwkvKiBPbiBTQlVTIFF1YXR0cm8gUUZFIGNhcmRzLCBhbGwgaG1lIGludGVycnVwdHMgYXJlIGNvbmNlbnRyYXRlZAorCSAqIGludG8gYSBzaW5nbGUgc291cmNlIHdoaWNoIHdlIHJlZ2lzdGVyIGhhbmRsaW5nIGF0IHByb2JlIHRpbWUuCisJICovCisJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiAoSEZMQUdfUVVBVFRST3xIRkxBR19QQ0kpKSAhPSBIRkxBR19RVUFUVFJPKSB7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmhhcHB5X21lYWxfaW50ZXJydXB0LAorCQkJCVNBX1NISVJRLCBkZXYtPm5hbWUsICh2b2lkICopZGV2KSkgeworCQkJSE1EKCgiRUFHQUlOXG4iKSk7CisjaWZkZWYgX19zcGFyY19fCisJCQlwcmludGsoS0VSTl9FUlIgImhhcHB5X21lYWwoU0JVUyk6IENhbid0IG9yZGVyIGlycSAlcyB0byBnby5cbiIsCisJCQkgICAgICAgX19pcnFfaXRvYShkZXYtPmlycSkpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiaGFwcHlfbWVhbChTQlVTKTogQ2FuJ3Qgb3JkZXIgaXJxICVkIHRvIGdvLlxuIiwKKwkJCSAgICAgICBkZXYtPmlycSk7CisjZW5kaWYKKworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwlITUQoKCJ0byBoYXBweV9tZWFsX2luaXRcbiIpKTsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwlyZXMgPSBoYXBweV9tZWFsX2luaXQoaHApOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKHJlcyAmJiAoKGhwLT5oYXBweV9mbGFncyAmIChIRkxBR19RVUFUVFJPfEhGTEFHX1BDSSkpICE9IEhGTEFHX1FVQVRUUk8pKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhhcHB5X21lYWxfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaGFwcHlfbWVhbF9zdG9wKGhwLCBocC0+Z3JlZ3MpOworCWhhcHB5X21lYWxfY2xlYW5fcmluZ3MoaHApOworCisJLyogSWYgYXV0by1uZWdvdGlhdGlvbiB0aW1lciBpcyBydW5uaW5nLCBraWxsIGl0LiAqLworCWRlbF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJLyogT24gUXVhdHRybyBRRkUgY2FyZHMsIGFsbCBobWUgaW50ZXJydXB0cyBhcmUgY29uY2VudHJhdGVkCisJICogaW50byBhIHNpbmdsZSBzb3VyY2Ugd2hpY2ggd2UgcmVnaXN0ZXIgaGFuZGxpbmcgYXQgcHJvYmUKKwkgKiB0aW1lIGFuZCBuZXZlciB1bnJlZ2lzdGVyLgorCSAqLworCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgKEhGTEFHX1FVQVRUUk98SEZMQUdfUENJKSkgIT0gSEZMQUdfUVVBVFRSTykKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNYREVCVUcKKyNkZWZpbmUgU1hEKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBTWEQoeCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwlwcmludGsgKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisJdHhfZHVtcF9sb2coKTsKKwlwcmludGsgKEtFUk5fRVJSICIlczogSGFwcHkgU3RhdHVzICUwOHggVFhbJTA4eDolMDh4XVxuIiwgZGV2LT5uYW1lLAorCQlobWVfcmVhZDMyKGhwLCBocC0+Z3JlZ3MgKyBHUkVHX1NUQVQpLAorCQlobWVfcmVhZDMyKGhwLCBocC0+ZXR4cmVncyArIEVUWF9DRkcpLAorCQlobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpKTsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwloYXBweV9tZWFsX2luaXQoaHApOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGhhcHB5X21lYWxfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKyAJaW50IGVudHJ5OworIAl1MzIgdHhfZmxhZ3M7CisKKwl0eF9mbGFncyA9IFRYRkxBR19PV047CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXUzMiBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7CisKKwkJY3N1bV9zdGFydF9vZmYgPSAodTMyKSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCWNzdW1fc3R1ZmZfb2ZmID0gKHUzMikgKChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YSk7CisKKwkJdHhfZmxhZ3MgPSAoVFhGTEFHX09XTiB8IFRYRkxBR19DU0VOQUJMRSB8CisJCQkgICAgKChjc3VtX3N0YXJ0X29mZiA8PCAxNCkgJiBUWEZMQUdfQ1NCVUZCRUdJTikgfAorCQkJICAgICgoY3N1bV9zdHVmZl9vZmYgPDwgMjApICYgVFhGTEFHX0NTTE9DQVRJT04pKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKyAJaWYgKFRYX0JVRkZTX0FWQUlMKGhwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZW50cnkgPSBocC0+dHhfbmV3OworCVNYRCgoIlNYPGxbJWRdZVslZF0+IiwgbGVuLCBlbnRyeSkpOworCWhwLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKKworCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApIHsKKwkJdTMyIG1hcHBpbmcsIGxlbjsKKworCQlsZW4gPSBza2ItPmxlbjsKKwkJbWFwcGluZyA9IGhtZV9kbWFfbWFwKGhwLCBza2ItPmRhdGEsIGxlbiwgRE1BX1RPREVWSUNFKTsKKwkJdHhfZmxhZ3MgfD0gKFRYRkxBR19TT1AgfCBUWEZMQUdfRU9QKTsKKwkJaG1lX3dyaXRlX3R4ZChocCwgJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF90eGRbZW50cnldLAorCQkJICAgICAgKHR4X2ZsYWdzIHwgKGxlbiAmIFRYRkxBR19TSVpFKSksCisJCQkgICAgICBtYXBwaW5nKTsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwl9IGVsc2UgeworCQl1MzIgZmlyc3RfbGVuLCBmaXJzdF9tYXBwaW5nOworCQlpbnQgZnJhZywgZmlyc3RfZW50cnkgPSBlbnRyeTsKKworCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KKwkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZmlyc3RfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZmlyc3RfbWFwcGluZyA9IGhtZV9kbWFfbWFwKGhwLCBza2ItPmRhdGEsIGZpcnN0X2xlbiwgRE1BX1RPREVWSUNFKTsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQlza2JfZnJhZ190ICp0aGlzX2ZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnXTsKKwkJCXUzMiBsZW4sIG1hcHBpbmcsIHRoaXNfdHhmbGFnczsKKworCQkJbGVuID0gdGhpc19mcmFnLT5zaXplOworCQkJbWFwcGluZyA9IGhtZV9kbWFfbWFwKGhwLAorCQkJCQkgICAgICAoKHZvaWQgKikgcGFnZV9hZGRyZXNzKHRoaXNfZnJhZy0+cGFnZSkgKworCQkJCQkgICAgICAgdGhpc19mcmFnLT5wYWdlX29mZnNldCksCisJCQkJCSAgICAgIGxlbiwgRE1BX1RPREVWSUNFKTsKKwkJCXRoaXNfdHhmbGFncyA9IHR4X2ZsYWdzOworCQkJaWYgKGZyYWcgPT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAtIDEpCisJCQkJdGhpc190eGZsYWdzIHw9IFRYRkxBR19FT1A7CisJCQlobWVfd3JpdGVfdHhkKGhwLCAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtlbnRyeV0sCisJCQkJICAgICAgKHRoaXNfdHhmbGFncyB8IChsZW4gJiBUWEZMQUdfU0laRSkpLAorCQkJCSAgICAgIG1hcHBpbmcpOworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJfQorCQlobWVfd3JpdGVfdHhkKGhwLCAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtmaXJzdF9lbnRyeV0sCisJCQkgICAgICAodHhfZmxhZ3MgfCBUWEZMQUdfU09QIHwgKGZpcnN0X2xlbiAmIFRYRkxBR19TSVpFKSksCisJCQkgICAgICBmaXJzdF9tYXBwaW5nKTsKKwl9CisKKwlocC0+dHhfbmV3ID0gZW50cnk7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwoaHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEdldCBpdCBnb2luZy4gKi8KKwlobWVfd3JpdGUzMihocCwgaHAtPmV0eHJlZ3MgKyBFVFhfUEVORElORywgRVRYX1RQX0RNQVdBS0VVUCk7CisKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJdHhfYWRkX2xvZyhocCwgVFhMT0dfQUNUSU9OX1RYTUlULCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoYXBweV9tZWFsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwloYXBweV9tZWFsX2dldF9jb3VudGVycyhocCwgaHAtPmJpZ21hY3JlZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJcmV0dXJuICZocC0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpicmVncyA9IGhwLT5iaWdtYWNyZWdzOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpOworCXUzMiBjcmM7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IChkZXYtPm1jX2NvdW50ID4gNjQpKSB7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMCwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUxLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMywgMHhmZmZmKTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRykgfCBCSUdNQUNfUlhDRkdfUE1JU0MpOworCX0gZWxzZSB7CisJCXUxNiBoYXNoX3RhYmxlWzRdOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNjsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUwLCBoYXNoX3RhYmxlWzBdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUxLCBoYXNoX3RhYmxlWzFdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUyLCBoYXNoX3RhYmxlWzJdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUzLCBoYXNoX3RhYmxlWzNdKTsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKK30KKworLyogRXRodG9vbCBzdXBwb3J0Li4uICovCitzdGF0aWMgaW50IGhtZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJY21kLT5zdXBwb3J0ZWQgPQorCQkoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkpOworCisJLyogWFhYIGhhcmRjb2RlZCBzdHVmZiBmb3Igbm93ICovCisJY21kLT5wb3J0ID0gUE9SVF9UUDsgLyogWFhYIG5vIE1JSSBzdXBwb3J0ICovCisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7IC8qIFhYWCBubyBleHRlcm5hbCB4Y3ZyIHN1cHBvcnQgKi8KKwljbWQtPnBoeV9hZGRyZXNzID0gMDsgLyogWFhYIGZpeGVkIFBIWUFEICovCisKKwkvKiBSZWNvcmQgUEhZIHNldHRpbmdzLiAqLworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCBocC0+dGN2cmVncywgTUlJX0JNQ1IpOworCWhwLT5zd19scGEgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgaHAtPnRjdnJlZ3MsIE1JSV9MUEEpOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJY21kLT5zcGVlZCA9CisJCQkoaHAtPnN3X2xwYSAmIChMUEFfMTAwSEFMRiB8IExQQV8xMDBGVUxMKSkgPworCQkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJCWlmIChjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCWNtZC0+ZHVwbGV4ID0KKwkJCQkoaHAtPnN3X2xwYSAmIChMUEFfMTAwRlVMTCkpID8KKwkJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCQllbHNlCisJCQljbWQtPmR1cGxleCA9CisJCQkJKGhwLT5zd19scGEgJiAoTFBBXzEwRlVMTCkpID8KKwkJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCX0gZWxzZSB7CisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkJY21kLT5zcGVlZCA9CisJCQkoaHAtPnN3X2JtY3IgJiBCTUNSX1NQRUVEMTAwKSA/CisJCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwkJY21kLT5kdXBsZXggPQorCQkJKGhwLT5zd19ibWNyICYgQk1DUl9GVUxMRFBMWCkgPworCQkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG1lX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwkvKiBWZXJpZnkgdGhlIHNldHRpbmdzIHdlIGNhcmUgYWJvdXQuICovCisJaWYgKGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICBjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgorCSAgICAoKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwICYmCisJICAgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKKwkgICAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCSAgICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT2ssIGRvIGl0IHRvIGl0LiAqLworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwlkZWxfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisJaGFwcHlfbWVhbF9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGhwLCBocC0+dGN2cmVncywgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBobWVfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VuaG1lIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sICIyLjAyIik7CisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGhwLT5oYXBweV9kZXY7CisJCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGRldikpOworCX0KKyNpZmRlZiBDT05GSUdfU0JVUworCWVsc2UgeworCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBocC0+aGFwcHlfZGV2OworCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiU0JVUzolZCIsCisJCQlzZGV2LT5zbG90KTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHUzMiBobWVfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgaHAtPnRjdnJlZ3MsIE1JSV9CTUNSKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCXJldHVybiAoaHAtPnN3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhtZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IGhtZV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBobWVfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBobWVfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGhtZV9nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQgaG1lX3ZlcnNpb25fcHJpbnRlZDsKKworI2lmZGVmIENPTkZJR19TQlVTCit2b2lkIF9faW5pdCBxdWF0dHJvX2dldF9yYW5nZXMoc3RydWN0IHF1YXR0cm8gKnFwKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKKwlpbnQgZXJyOworCisJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShzZGV2LT5wcm9tX25vZGUsCisJCQkgICAgICAgInJhbmdlcyIsCisJCQkgICAgICAgKGNoYXIgKikmcXAtPnJhbmdlc1swXSwKKwkJCSAgICAgICBzaXplb2YocXAtPnJhbmdlcykpOworCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKKwkJcXAtPm5yYW5nZXMgPSAwOworCQlyZXR1cm47CisJfQorCXFwLT5ucmFuZ2VzID0gKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHF1YXR0cm9fYXBwbHlfcmFuZ2VzKHN0cnVjdCBxdWF0dHJvICpxcCwgc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGhwLT5oYXBweV9kZXY7CisJaW50IHJuZzsKKworCWZvciAocm5nID0gMDsgcm5nIDwgcXAtPm5yYW5nZXM7IHJuZysrKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcm5ncCA9ICZxcC0+cmFuZ2VzW3JuZ107CisJCWludCByZWc7CisKKwkJZm9yIChyZWcgPSAwOyByZWcgPCA1OyByZWcrKykgeworCQkJaWYgKHNkZXYtPnJlZ19hZGRyc1tyZWddLndoaWNoX2lvID09CisJCQkgICAgcm5ncC0+b3RfY2hpbGRfc3BhY2UpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlZyA9PSA1KQorCQkJY29udGludWU7CisKKwkJc2Rldi0+cmVnX2FkZHJzW3JlZ10ud2hpY2hfaW8gPSBybmdwLT5vdF9wYXJlbnRfc3BhY2U7CisJCXNkZXYtPnJlZ19hZGRyc1tyZWddLnBoeXNfYWRkciArPSBybmdwLT5vdF9wYXJlbnRfYmFzZTsKKwl9Cit9CisKKy8qIEdpdmVuIGEgaGFwcHkgbWVhbCBzYnVzIGRldmljZSwgZmluZCBpdCdzIHF1YXR0cm8gcGFyZW50LgorICogSWYgbm9uZSBleGlzdCwgYWxsb2NhdGUgYW5kIHJldHVybiBhIG5ldyBvbmUuCisgKgorICogUmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBxdWF0dHJvICogX19pbml0IHF1YXR0cm9fc2J1c19maW5kKHN0cnVjdCBzYnVzX2RldiAqZ29hbF9zZGV2KQoreworCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7CisJc3RydWN0IHF1YXR0cm8gKnFwOworCWludCBpOworCisJaWYgKHFmZV9zYnVzX2xpc3QgPT0gTlVMTCkKKwkJZ290byBmb3VuZDsKKworCWZvciAocXAgPSBxZmVfc2J1c19saXN0OyBxcCAhPSBOVUxMOyBxcCA9IHFwLT5uZXh0KSB7CisJCWZvciAoaSA9IDAsIHNkZXYgPSBxcC0+cXVhdHRyb19kZXY7CisJCSAgICAgKHNkZXYgIT0gTlVMTCkgJiYgKGkgPCA0KTsKKwkJICAgICBzZGV2ID0gc2Rldi0+bmV4dCwgaSsrKSB7CisJCQlpZiAoc2RldiA9PSBnb2FsX3NkZXYpCisJCQkJcmV0dXJuIHFwOworCQl9CisJfQorCWZvcl9lYWNoX3NidXMoc2J1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKKwkJCWlmIChzZGV2ID09IGdvYWxfc2RldikKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJLyogQ2Fubm90IGZpbmQgcXVhdHRybyBwYXJlbnQsIGZhaWwuICovCisJcmV0dXJuIE5VTEw7CisKK2ZvdW5kOgorCXFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF1YXR0cm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAocXAgIT0gTlVMTCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcXAtPmhhcHB5X21lYWxzW2ldID0gTlVMTDsKKworCQlxcC0+cXVhdHRyb19kZXYgPSBnb2FsX3NkZXY7CisJCXFwLT5uZXh0ID0gcWZlX3NidXNfbGlzdDsKKwkJcWZlX3NidXNfbGlzdCA9IHFwOworCQlxdWF0dHJvX2dldF9yYW5nZXMocXApOworCX0KKwlyZXR1cm4gcXA7Cit9CisKKy8qIEFmdGVyIGFsbCBxdWF0dHJvIGNhcmRzIGhhdmUgYmVlbiBwcm9iZWQsIHdlIGNhbGwgdGhlc2UgZnVuY3Rpb25zCisgKiB0byByZWdpc3RlciB0aGUgSVJRIGhhbmRsZXJzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcXVhdHRyb19zYnVzX3JlZ2lzdGVyX2lycXModm9pZCkKK3sKKwlzdHJ1Y3QgcXVhdHRybyAqcXA7CisKKwlmb3IgKHFwID0gcWZlX3NidXNfbGlzdDsgcXAgIT0gTlVMTDsgcXAgPSBxcC0+bmV4dCkgeworCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBxcC0+cXVhdHRyb19kZXY7CisJCWludCBlcnI7CisKKwkJZXJyID0gcmVxdWVzdF9pcnEoc2Rldi0+aXJxc1swXSwKKwkJCQkgIHF1YXR0cm9fc2J1c19pbnRlcnJ1cHQsCisJCQkJICBTQV9TSElSUSwgIlF1YXR0cm8iLAorCQkJCSAgcXApOworCQlpZiAoZXJyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUXVhdHRybzogRmF0YWwgSVJRIHJlZ2lzdGVyeSBlcnJvciAlZC5cbiIsIGVycik7CisJCQlwYW5pYygiUUZFIHJlcXVlc3QgaXJxIik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NCVVMgKi8KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcXVhdHRybyAqIF9faW5pdCBxdWF0dHJvX3BjaV9maW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpiZGV2ID0gcGRldi0+YnVzLT5zZWxmOworCXN0cnVjdCBxdWF0dHJvICpxcDsKKworCWlmICghYmRldikgcmV0dXJuIE5VTEw7CisJZm9yIChxcCA9IHFmZV9wY2lfbGlzdDsgcXAgIT0gTlVMTDsgcXAgPSBxcC0+bmV4dCkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcXBkZXYgPSBxcC0+cXVhdHRyb19kZXY7CisKKwkJaWYgKHFwZGV2ID09IGJkZXYpCisJCQlyZXR1cm4gcXA7CisJfQorCXFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF1YXR0cm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAocXAgIT0gTlVMTCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcXAtPmhhcHB5X21lYWxzW2ldID0gTlVMTDsKKworCQlxcC0+cXVhdHRyb19kZXYgPSBiZGV2OworCQlxcC0+bmV4dCA9IHFmZV9wY2lfbGlzdDsKKwkJcWZlX3BjaV9saXN0ID0gcXA7CisKKwkJLyogTm8gcmFuZ2UgdHJpY2tzIG5lY2Vzc2FyeSBvbiBQQ0kuICovCisJCXFwLT5ucmFuZ2VzID0gMDsKKwl9CisJcmV0dXJuIHFwOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworI2lmZGVmIENPTkZJR19TQlVTCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3NidXNfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBpc19xZmUpCit7CisJc3RydWN0IHF1YXR0cm8gKnFwID0gTlVMTDsKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgcWZlX3Nsb3QgPSAtMTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWlmIChpc19xZmUpIHsKKwkJcXAgPSBxdWF0dHJvX3NidXNfZmluZChzZGV2KTsKKwkJaWYgKHFwID09IE5VTEwpCisJCQlnb3RvIGVycl9vdXQ7CisJCWZvciAocWZlX3Nsb3QgPSAwOyBxZmVfc2xvdCA8IDQ7IHFmZV9zbG90KyspCisJCQlpZiAocXAtPmhhcHB5X21lYWxzW3FmZV9zbG90XSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQlpZiAocWZlX3Nsb3QgPT0gNCkKKwkJCWdvdG8gZXJyX291dDsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaGFwcHlfbWVhbCkpOworCWlmICghZGV2KQorCQlnb3RvIGVycl9vdXQ7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGhtZV92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJLyogSWYgdXNlciBkaWQgbm90IHNwZWNpZnkgYSBNQUMgYWRkcmVzcyBzcGVjaWZpY2FsbHksIHVzZQorCSAqIHRoZSBRdWF0dHJvIGxvY2FsLW1hYy1hZGRyZXNzIHByb3BlcnR5Li4uCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAobWFjYWRkcltpXSAhPSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgNikgeyAvKiBhIG1hYyBhZGRyZXNzIHdhcyBnaXZlbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IG1hY2FkZHJbaV07CisJCW1hY2FkZHJbNV0rKzsKKwl9IGVsc2UgaWYgKHFmZV9zbG90ICE9IC0xICYmCisJCSAgIHByb21fZ2V0cHJvcGxlbihzZGV2LT5wcm9tX25vZGUsCisJCQkJICAgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgeworCQlwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkgZGV2LT5kZXZfYWRkciwgNik7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisJfQorCisJaHAgPSBkZXYtPnByaXY7CisKKwlocC0+aGFwcHlfZGV2ID0gc2RldjsKKworCXNwaW5fbG9ja19pbml0KCZocC0+aGFwcHlfbG9jayk7CisKKwllcnIgPSAtRU5PREVWOworCWlmIChzZGV2LT5udW1fcmVnaXN0ZXJzICE9IDUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IERldmljZSBkb2VzIG5vdCBoYXZlIDUgcmVncywgaXQgaGFzICVkLlxuIiwKKwkJICAgICAgIHNkZXYtPm51bV9yZWdpc3RlcnMpOworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogV291bGQgeW91IGxpa2UgdGhhdCBmb3IgaGVyZSBvciB0byBnbz9cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorCisJaWYgKHFwICE9IE5VTEwpIHsKKwkJaHAtPnFmZV9wYXJlbnQgPSBxcDsKKwkJaHAtPnFmZV9lbnQgPSBxZmVfc2xvdDsKKwkJcXAtPmhhcHB5X21lYWxzW3FmZV9zbG90XSA9IGRldjsKKwkJcXVhdHRyb19hcHBseV9yYW5nZXMocXAsIGhwKTsKKwl9CisKKwlocC0+Z3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCSBHUkVHX1JFR19TSVpFLCAiSE1FIEdsb2JhbCBSZWdzIik7CisJaWYgKCFocC0+Z3JlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBnbG9iYWwgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwlocC0+ZXR4cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMV0sIDAsCisJCQkJICAgRVRYX1JFR19TSVpFLCAiSE1FIFRYIFJlZ3MiKTsKKwlpZiAoIWhwLT5ldHhyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgTUFDIFRyYW5zbWl0IHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocC0+ZXJ4cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMl0sIDAsCisJCQkJICAgRVJYX1JFR19TSVpFLCAiSE1FIFJYIFJlZ3MiKTsKKwlpZiAoIWhwLT5lcnhyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgTUFDIFJlY2VpdmUgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwLT5iaWdtYWNyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVszXSwgMCwKKwkJCQkgICAgICBCTUFDX1JFR19TSVpFLCAiSE1FIEJJR01BQyBSZWdzIik7CisJaWYgKCFocC0+YmlnbWFjcmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIEJJR01BQyByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaHAtPnRjdnJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzRdLCAwLAorCQkJCSAgIFRDVlJfUkVHX1NJWkUsICJITUUgVHJhbmNlaXZlciBSZWdzIik7CisJaWYgKCFocC0+dGN2cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIFRyYW5jZWl2ZXIgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwLT5obV9yZXZpc2lvbiA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5wcm9tX25vZGUsICJobS1yZXYiLCAweGZmKTsKKwlpZiAoaHAtPmhtX3JldmlzaW9uID09IDB4ZmYpCisJCWhwLT5obV9yZXZpc2lvbiA9IDB4YTA7CisKKwkvKiBOb3cgZW5hYmxlIHRoZSBmZWF0dXJlIGZsYWdzIHdlIGNhbi4gKi8KKwlpZiAoaHAtPmhtX3JldmlzaW9uID09IDB4MjAgfHwgaHAtPmhtX3JldmlzaW9uID09IDB4MjEpCisJCWhwLT5oYXBweV9mbGFncyA9IEhGTEFHXzIwXzIxOworCWVsc2UgaWYgKGhwLT5obV9yZXZpc2lvbiAhPSAweGEwKQorCQlocC0+aGFwcHlfZmxhZ3MgPSBIRkxBR19OT1RfQTA7CisKKwlpZiAocXAgIT0gTlVMTCkKKwkJaHAtPmhhcHB5X2ZsYWdzIHw9IEhGTEFHX1FVQVRUUk87CisKKwkvKiBHZXQgdGhlIHN1cHBvcnRlZCBEVk1BIGJ1cnN0IHNpemVzIGZyb20gb3VyIEhhcHB5IFNCVVMuICovCisJaHAtPmhhcHB5X2J1cnN0cyA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwKKwkJCQkJICAgICAgImJ1cnN0LXNpemVzIiwgMHgwMCk7CisKKwlocC0+aGFwcHlfYmxvY2sgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKKwkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCSZocC0+aGJsb2NrX2R2bWEpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFocC0+aGFwcHlfYmxvY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBhbGxvY2F0ZSBkZXNjcmlwdG9ycy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiBGb3JjZSBjaGVjayBvZiB0aGUgbGluayBmaXJzdCB0aW1lIHdlIGFyZSBicm91Z2h0IHVwLiAqLworCWhwLT5saW5rY2hlY2sgPSAwOworCisJLyogRm9yY2UgdGltZXIgc3RhdGUgdG8gJ2FzbGVlcCcgd2l0aCBjb3VudCBvZiB6ZXJvLiAqLworCWhwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwlocC0+dGltZXJfdGlja3MgPSAwOworCisJaW5pdF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKworCWhwLT5kZXYgPSBkZXY7CisJZGV2LT5vcGVuID0gJmhhcHB5X21lYWxfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaGFwcHlfbWVhbF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYXBweV9tZWFsX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmaGFwcHlfbWVhbF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9ICZoYXBweV9tZWFsX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT5ldGh0b29sX29wcyA9ICZobWVfZXRodG9vbF9vcHM7CisKKwkvKiBIYXBweSBNZWFsIGNhbiBkbyBpdCBhbGwuLi4gZXhjZXB0IFZMQU4uICovCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisKKwlkZXYtPmlycSA9IHNkZXYtPmlycXNbMF07CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyogSG9vayB1cCBQQ0kgcmVnaXN0ZXIvZG1hIGFjY2Vzc29ycy4gKi8KKwlocC0+cmVhZF9kZXNjMzIgPSBzYnVzX2htZV9yZWFkX2Rlc2MzMjsKKwlocC0+d3JpdGVfdHhkID0gc2J1c19obWVfd3JpdGVfdHhkOworCWhwLT53cml0ZV9yeGQgPSBzYnVzX2htZV93cml0ZV9yeGQ7CisJaHAtPmRtYV9tYXAgPSAodTMyICgqKSh2b2lkICosIHZvaWQgKiwgbG9uZywgaW50KSlzYnVzX21hcF9zaW5nbGU7CisJaHAtPmRtYV91bm1hcCA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSlzYnVzX3VubWFwX3NpbmdsZTsKKwlocC0+ZG1hX3N5bmNfZm9yX2NwdSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKKwkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdTsKKwlocC0+ZG1hX3N5bmNfZm9yX2RldmljZSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKKwkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKKwlocC0+cmVhZDMyID0gc2J1c19obWVfcmVhZDMyOworCWhwLT53cml0ZTMyID0gc2J1c19obWVfd3JpdGUzMjsKKyNlbmRpZgorCisJLyogR3JyciwgSGFwcHkgTWVhbCBjb21lcyB1cCBieSBkZWZhdWx0IG5vdCBhZHZlcnRpc2luZworCSAqIGZ1bGwgZHVwbGV4IDEwMGJhc2VUIGNhcGFiaWxpdGllcywgZml4IHRoaXMuCisJICovCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhhcHB5X21lYWxfc2V0X2luaXRpYWxfYWR2ZXJ0aXNlbWVudChocCk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGhwLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CisJfQorCisJaWYgKHFmZV9zbG90ICE9IC0xKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUXVhdHRybyBITUUgc2xvdCAlZCAoU0JVUykgMTAvMTAwYmFzZVQgRXRoZXJuZXQgIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcWZlX3Nsb3QpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhBUFBZIE1FQUwgKFNCVVMpIDEwLzEwMGJhc2VUIEV0aGVybmV0ICIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisJcHJpbnRrKCJcbiIpOworCisJLyogV2UgYXJlIGhvbWUgZnJlZSBhdCB0aGlzIHBvaW50LCBsaW5rIHVzIGluIHRvIHRoZSBoYXBweQorCSAqIGRldmljZSBsaXN0LgorCSAqLworCWhwLT5uZXh0X21vZHVsZSA9IHJvb3RfaGFwcHlfZGV2OworCXJvb3RfaGFwcHlfZGV2ID0gaHA7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ6CisJc2J1c19mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKKwkJCSAgICAgUEFHRV9TSVpFLAorCQkJICAgICBocC0+aGFwcHlfYmxvY2ssCisJCQkgICAgIGhwLT5oYmxvY2tfZHZtYSk7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpZiAoaHAtPmdyZWdzKQorCQlzYnVzX2lvdW5tYXAoaHAtPmdyZWdzLCBHUkVHX1JFR19TSVpFKTsKKwlpZiAoaHAtPmV0eHJlZ3MpCisJCXNidXNfaW91bm1hcChocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKKwlpZiAoaHAtPmVyeHJlZ3MpCisJCXNidXNfaW91bm1hcChocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKKwlpZiAoaHAtPmJpZ21hY3JlZ3MpCisJCXNidXNfaW91bm1hcChocC0+YmlnbWFjcmVncywgQk1BQ19SRUdfU0laRSk7CisJaWYgKGhwLT50Y3ZyZWdzKQorCQlzYnVzX2lvdW5tYXAoaHAtPnRjdnJlZ3MsIFRDVlJfUkVHX1NJWkUpOworCitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorI2lmbmRlZiBfX3NwYXJjX18KK3N0YXRpYyBpbnQgaXNfcXVhdHRyb19wKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpidXNkZXYgPSBwZGV2LT5idXMtPnNlbGY7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWludCBuX2htZXM7CisKKwlpZiAoYnVzZGV2ID09IE5VTEwgfHwKKwkgICAgYnVzZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9ERUMgfHwKKwkgICAgYnVzZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9ERUNfMjExNTMpCisJCXJldHVybiAwOworCisJbl9obWVzID0gMDsKKwl0bXAgPSBwZGV2LT5idXMtPmRldmljZXMubmV4dDsKKwl3aGlsZSAodG1wICE9ICZwZGV2LT5idXMtPmRldmljZXMpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnRoaXNfcGRldiA9IHBjaV9kZXZfYih0bXApOworCisJCWlmICh0aGlzX3BkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgorCQkgICAgdGhpc19wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMKQorCQkJbl9obWVzKys7CisKKwkJdG1wID0gdG1wLT5uZXh0OworCX0KKworCWlmIChuX2htZXMgIT0gNCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KK3N0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCit7CisJaW50IHRoaXNfb2Zmc2V0OworCisJZm9yICh0aGlzX29mZnNldCA9IDB4MjA7IHRoaXNfb2Zmc2V0IDwgbGVuOyB0aGlzX29mZnNldCsrKSB7CisJCXZvaWQgX19pb21lbSAqcCA9IHJvbV9iYXNlICsgdGhpc19vZmZzZXQ7CisKKwkJaWYgKHJlYWRiKHAgKyAwKSAhPSAweDkwIHx8CisJCSAgICByZWFkYihwICsgMSkgIT0gMHgwMCB8fAorCQkgICAgcmVhZGIocCArIDIpICE9IDB4MDkgfHwKKwkJICAgIHJlYWRiKHAgKyAzKSAhPSAweDRlIHx8CisJCSAgICByZWFkYihwICsgNCkgIT0gMHg0MSB8fAorCQkgICAgcmVhZGIocCArIDUpICE9IDB4MDYpCisJCQljb250aW51ZTsKKworCQl0aGlzX29mZnNldCArPSA2OworCQlwICs9IDY7CisKKwkJaWYgKGluZGV4ID09IDApIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJCWRldl9hZGRyW2ldID0gcmVhZGIocCArIGkpOworCQkJYnJlYWs7CisJCX0KKwkJaW5kZXgtLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9obWVfbWFjX25vbnNwYXJjKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKK3sKKwl1MzIgcm9tX3JlZ19vcmlnOworCXZvaWQgX19pb21lbSAqcDsKKwlpbnQgaW5kZXg7CisKKwlpbmRleCA9IDA7CisJaWYgKGlzX3F1YXR0cm9fcChwZGV2KSkKKwkJaW5kZXggPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisKKwlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0ucGFyZW50ID09IE5VTEwpIHsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCAwKQorCQkJZ290byB1c2VfcmFuZG9tOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsICZyb21fcmVnX29yaWcpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLAorCQkJICAgICAgIHJvbV9yZWdfb3JpZyB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCisJcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpLCAoNjQgKiAxMDI0KSk7CisJaWYgKHAgIT0gTlVMTCAmJiByZWFkYihwKSA9PSAweDU1ICYmIHJlYWRiKHAgKyAxKSA9PSAweGFhKQorCQlmaW5kX2V0aF9hZGRyX2luX3ZwZChwLCAoNjQgKiAxMDI0KSwgaW5kZXgsIGRldl9hZGRyKTsKKworCWlmIChwICE9IE5VTEwpCisJCWlvdW5tYXAocCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX3JlZ19vcmlnKTsKKwlyZXR1cm47CisKK3VzZV9yYW5kb206CisJLyogU3VuIE1BQyBwcmVmaXggdGhlbiAzIHJhbmRvbSBieXRlcy4gKi8KKwlkZXZfYWRkclswXSA9IDB4MDg7CisJZGV2X2FkZHJbMV0gPSAweDAwOworCWRldl9hZGRyWzJdID0gMHgyMDsKKwlnZXRfcmFuZG9tX2J5dGVzKCZkZXZfYWRkclszXSwgMyk7CisJcmV0dXJuOworfQorI2VuZGlmIC8qICEoX19zcGFyY19fKSAqLworCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBxdWF0dHJvICpxcCA9IE5VTEw7CisjaWZkZWYgX19zcGFyY19fCisJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKKwlpbnQgbm9kZTsKKyNlbmRpZgorCXN0cnVjdCBoYXBweV9tZWFsICpocDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaHByZWdfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGhwcmVnX3JlczsKKwlpbnQgaSwgcWZlX3Nsb3QgPSAtMTsKKwljaGFyIHByb21fbmFtZVs2NF07CisJaW50IGVycjsKKworCS8qIE5vdyBtYWtlIHN1cmUgcGNpX2RldiBjb29raWUgaXMgdGhlcmUuICovCisjaWZkZWYgX19zcGFyY19fCisJcGNwID0gcGRldi0+c3lzZGF0YTsKKwlpZiAocGNwID09IE5VTEwgfHwgcGNwLT5wcm9tX25vZGUgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogU29tZSBQQ0kgZGV2aWNlIGluZm8gbWlzc2luZ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlub2RlID0gcGNwLT5wcm9tX25vZGU7CisJCisJcHJvbV9nZXRzdHJpbmcobm9kZSwgIm5hbWUiLCBwcm9tX25hbWUsIHNpemVvZihwcm9tX25hbWUpKTsKKyNlbHNlCisJaWYgKGlzX3F1YXR0cm9fcChwZGV2KSkKKwkJc3RyY3B5KHByb21fbmFtZSwgIlNVTlcscWZlIik7CisJZWxzZQorCQlzdHJjcHkocHJvbV9uYW1lLCAiU1VOVyxobWUiKTsKKyNlbmRpZgorCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXN0cmNtcChwcm9tX25hbWUsICJTVU5XLHFmZSIpIHx8ICFzdHJjbXAocHJvbV9uYW1lLCAicWZlIikpIHsKKwkJcXAgPSBxdWF0dHJvX3BjaV9maW5kKHBkZXYpOworCQlpZiAocXAgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX291dDsKKwkJZm9yIChxZmVfc2xvdCA9IDA7IHFmZV9zbG90IDwgNDsgcWZlX3Nsb3QrKykKKwkJCWlmIChxcC0+aGFwcHlfbWVhbHNbcWZlX3Nsb3RdID09IE5VTEwpCisJCQkJYnJlYWs7CisJCWlmIChxZmVfc2xvdCA9PSA0KQorCQkJZ290byBlcnJfb3V0OworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaGFwcHlfbWVhbCkpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyX291dDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChobWVfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpIHBkZXY7CisKKwlocCA9IChzdHJ1Y3QgaGFwcHlfbWVhbCAqKWRldi0+cHJpdjsKKwltZW1zZXQoaHAsIDAsIHNpemVvZigqaHApKTsKKworCWhwLT5oYXBweV9kZXYgPSBwZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChxcCAhPSBOVUxMKSB7CisJCWhwLT5xZmVfcGFyZW50ID0gcXA7CisJCWhwLT5xZmVfZW50ID0gcWZlX3Nsb3Q7CisJCXFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPSBkZXY7CisJfQkJCisKKwlocHJlZ19yZXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgYmFzZSBhZGRyZXNzLlxuIik7CisJCWdvdG8gZXJyX291dF9jbGVhcl9xdWF0dHJvOworCX0KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2NsZWFyX3F1YXR0cm87CisJfQorCisJaWYgKChocHJlZ19iYXNlID0gaW9yZW1hcChocHJlZ19yZXMsIDB4ODAwMCkpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogVW5hYmxlIHRvIHJlbWFwIGNhcmQgbWVtb3J5LlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmIChtYWNhZGRyW2ldICE9IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCA2KSB7IC8qIGEgbWFjIGFkZHJlc3Mgd2FzIGdpdmVuICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID0gbWFjYWRkcltpXTsKKwkJbWFjYWRkcls1XSsrOworCX0gZWxzZSB7CisjaWZkZWYgX19zcGFyY19fCisJCWlmIChxZmVfc2xvdCAhPSAtMSAmJgorCQkgICAgcHJvbV9nZXRwcm9wbGVuKG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKKwkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisJCX0KKyNlbHNlCisJCWdldF9obWVfbWFjX25vbnNwYXJjKHBkZXYsICZkZXYtPmRldl9hZGRyWzBdKTsKKyNlbmRpZgorCX0KKwkKKwkvKiBMYXlvdXQgcmVnaXN0ZXJzLiAqLworCWhwLT5ncmVncyAgICAgID0gKGhwcmVnX2Jhc2UgKyAweDAwMDBVTCk7CisJaHAtPmV0eHJlZ3MgICAgPSAoaHByZWdfYmFzZSArIDB4MjAwMFVMKTsKKwlocC0+ZXJ4cmVncyAgICA9IChocHJlZ19iYXNlICsgMHg0MDAwVUwpOworCWhwLT5iaWdtYWNyZWdzID0gKGhwcmVnX2Jhc2UgKyAweDYwMDBVTCk7CisJaHAtPnRjdnJlZ3MgICAgPSAoaHByZWdfYmFzZSArIDB4NzAwMFVMKTsKKworI2lmZGVmIF9fc3BhcmNfXworCWhwLT5obV9yZXZpc2lvbiA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiaG0tcmV2IiwgMHhmZik7CisJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweGZmKSB7CisJCXVuc2lnbmVkIGNoYXIgcHJldjsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZwcmV2KTsKKwkJaHAtPmhtX3JldmlzaW9uID0gMHhjMCB8IChwcmV2ICYgMHgwZik7CisJfQorI2Vsc2UKKwkvKiB3b3JrcyB3aXRoIHRoaXMgb24gbm9uLXNwYXJjIGhvc3RzICovCisJaHAtPmhtX3JldmlzaW9uID0gMHgyMDsKKyNlbmRpZgorCisJLyogTm93IGVuYWJsZSB0aGUgZmVhdHVyZSBmbGFncyB3ZSBjYW4uICovCisJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweDIwIHx8IGhwLT5obV9yZXZpc2lvbiA9PSAweDIxKQorCQlocC0+aGFwcHlfZmxhZ3MgPSBIRkxBR18yMF8yMTsKKwllbHNlIGlmIChocC0+aG1fcmV2aXNpb24gIT0gMHhhMCAmJiBocC0+aG1fcmV2aXNpb24gIT0gMHhjMCkKKwkJaHAtPmhhcHB5X2ZsYWdzID0gSEZMQUdfTk9UX0EwOworCisJaWYgKHFwICE9IE5VTEwpCisJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19RVUFUVFJPOworCisJLyogQW5kIG9mIGNvdXJzZSwgaW5kaWNhdGUgdGhpcyBpcyBQQ0kuICovCisJaHAtPmhhcHB5X2ZsYWdzIHw9IEhGTEFHX1BDSTsKKworI2lmZGVmIF9fc3BhcmNfXworCS8qIEFzc3VtZSBQQ0kgaGFwcHkgbWVhbHMgY2FuIGhhbmRsZSBhbGwgYnVyc3Qgc2l6ZXMuICovCisJaHAtPmhhcHB5X2J1cnN0cyA9IERNQV9CVVJTVEJJVFM7CisjZW5kaWYKKworCWhwLT5oYXBweV9ibG9jayA9IChzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayAqKQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBQQUdFX1NJWkUsICZocC0+aGJsb2NrX2R2bWEpOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWhwLT5oYXBweV9ibG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBDYW5ub3QgZ2V0IGhtZSBpbml0IGJsb2NrLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwLT5saW5rY2hlY2sgPSAwOworCWhwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwlocC0+dGltZXJfdGlja3MgPSAwOworCisJaW5pdF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKworCWhwLT5kZXYgPSBkZXY7CisJZGV2LT5vcGVuID0gJmhhcHB5X21lYWxfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaGFwcHlfbWVhbF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYXBweV9tZWFsX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmaGFwcHlfbWVhbF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9ICZoYXBweV9tZWFsX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT5ldGh0b29sX29wcyA9ICZobWVfZXRodG9vbF9vcHM7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5kbWEgPSAwOworCisJLyogSGFwcHkgTWVhbCBjYW4gZG8gaXQgYWxsLi4uICovCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCisjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCS8qIEhvb2sgdXAgUENJIHJlZ2lzdGVyL2RtYSBhY2Nlc3NvcnMuICovCisJaHAtPnJlYWRfZGVzYzMyID0gcGNpX2htZV9yZWFkX2Rlc2MzMjsKKwlocC0+d3JpdGVfdHhkID0gcGNpX2htZV93cml0ZV90eGQ7CisJaHAtPndyaXRlX3J4ZCA9IHBjaV9obWVfd3JpdGVfcnhkOworCWhwLT5kbWFfbWFwID0gKHUzMiAoKikodm9pZCAqLCB2b2lkICosIGxvbmcsIGludCkpcGNpX21hcF9zaW5nbGU7CisJaHAtPmRtYV91bm1hcCA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSlwY2lfdW5tYXBfc2luZ2xlOworCWhwLT5kbWFfc3luY19mb3JfY3B1ID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKQorCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHU7CisJaHAtPmRtYV9zeW5jX2Zvcl9kZXZpY2UgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKKwlocC0+cmVhZDMyID0gcGNpX2htZV9yZWFkMzI7CisJaHAtPndyaXRlMzIgPSBwY2lfaG1lX3dyaXRlMzI7CisjZW5kaWYKKworCS8qIEdycnIsIEhhcHB5IE1lYWwgY29tZXMgdXAgYnkgZGVmYXVsdCBub3QgYWR2ZXJ0aXNpbmcKKwkgKiBmdWxsIGR1cGxleCAxMDBiYXNlVCBjYXBhYmlsaXRpZXMsIGZpeCB0aGlzLgorCSAqLworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwloYXBweV9tZWFsX3NldF9pbml0aWFsX2FkdmVydGlzZW1lbnQoaHApOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihocC0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWlmICghcWZlX3Nsb3QpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnFwZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCisJCXByb21fbmFtZVswXSA9IDA7CisJCWlmICghc3RybmNtcChkZXYtPm5hbWUsICJldGgiLCAzKSkgeworCQkJaW50IGkgPSBzaW1wbGVfc3RydG91bChkZXYtPm5hbWUgKyAzLCBOVUxMLCAxMCk7CisJCQlzcHJpbnRmKHByb21fbmFtZSwgIi0lZCIsIGkgKyAzKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlcyVzOiBRdWF0dHJvIEhNRSAoUENJL0NoZWVySU8pIDEwLzEwMGJhc2VUIEV0aGVybmV0ICIsIGRldi0+bmFtZSwgcHJvbV9uYW1lKTsKKwkJaWYgKHFwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUMgJiYKKwkJICAgIHFwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ERUNfMjExNTMpCisJCQlwcmludGsoIkRFQyAyMTE1MyBQQ0kgQnJpZGdlXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJ1bmtub3duIGJyaWRnZSAlMDR4LiUwNHhcbiIsIAorCQkJCXFwZGV2LT52ZW5kb3IsIHFwZGV2LT5kZXZpY2UpOworCX0KKworCWlmIChxZmVfc2xvdCAhPSAtMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFF1YXR0cm8gSE1FIHNsb3QgJWQgKFBDSS9DaGVlcklPKSAxMC8xMDBiYXNlVCBFdGhlcm5ldCAiLAorCQkgICAgICAgZGV2LT5uYW1lLCBxZmVfc2xvdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSEFQUFkgTUVBTCAoUENJL0NoZWVySU8pIDEwLzEwMEJhc2VUIEV0aGVybmV0ICIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJyAnIDogJzonKTsKKworCXByaW50aygiXG4iKTsKKworCS8qIFdlIGFyZSBob21lIGZyZWUgYXQgdGhpcyBwb2ludCwgbGluayB1cyBpbiB0byB0aGUgaGFwcHkKKwkgKiBkZXZpY2UgbGlzdC4KKwkgKi8KKwlocC0+bmV4dF9tb2R1bGUgPSByb290X2hhcHB5X2RldjsKKwlyb290X2hhcHB5X2RldiA9IGhwOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKGhwLT5ncmVncyk7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9jbGVhcl9xdWF0dHJvOgorCWlmIChxcCAhPSBOVUxMKQorCQlxcC0+aGFwcHlfbWVhbHNbcWZlX3Nsb3RdID0gTlVMTDsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfc2J1c19wcm9iZSh2b2lkKQoreworCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7CisJaW50IGNhcmRzID0gMDsKKwljaGFyIG1vZGVsWzEyOF07CisKKwlmb3JfZWFjaF9zYnVzKHNidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7CisJCQljaGFyICpuYW1lID0gc2Rldi0+cHJvbV9uYW1lOworCisJCQlpZiAoIXN0cmNtcChuYW1lLCAiU1VOVyxobWUiKSkgeworCQkJCWNhcmRzKys7CisJCQkJcHJvbV9nZXRzdHJpbmcoc2Rldi0+cHJvbV9ub2RlLCAibW9kZWwiLAorCQkJCQkgICAgICAgbW9kZWwsIHNpemVvZihtb2RlbCkpOworCQkJCWlmICghc3RyY21wKG1vZGVsLCAiU1VOVyxzYnVzLXFmZSIpKQorCQkJCQloYXBweV9tZWFsX3NidXNfaW5pdChzZGV2LCAxKTsKKwkJCQllbHNlCisJCQkJCWhhcHB5X21lYWxfc2J1c19pbml0KHNkZXYsIDApOworCQkJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJxZmUiKSB8fAorCQkJCSAgICFzdHJjbXAobmFtZSwgIlNVTlcscWZlIikpIHsKKwkJCQljYXJkcysrOworCQkJCWhhcHB5X21lYWxfc2J1c19pbml0KHNkZXYsIDEpOworCQkJfQorCQl9CisJfQorCWlmIChjYXJkcyAhPSAwKQorCQlxdWF0dHJvX3NidXNfcmVnaXN0ZXJfaXJxcygpOworCXJldHVybiBjYXJkczsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wY2lfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IGNhcmRzID0gMDsKKworCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NVTiwKKwkJCQkgICAgICAgUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMLCBwZGV2KSkgIT0gTlVMTCkgeworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQljb250aW51ZTsKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCWNhcmRzKys7CisJCWhhcHB5X21lYWxfcGNpX2luaXQocGRldik7CisJfQorCXJldHVybiBjYXJkczsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3Byb2JlKHZvaWQpCit7CisJc3RhdGljIGludCBjYWxsZWQgPSAwOworCWludCBjYXJkczsKKworCXJvb3RfaGFwcHlfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJY2FyZHMgPSAwOworI2lmZGVmIENPTkZJR19TQlVTCisJY2FyZHMgKz0gaGFwcHlfbWVhbF9zYnVzX3Byb2JlKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJCisJY2FyZHMgKz0gaGFwcHlfbWVhbF9wY2lfcHJvYmUoKTsKKyNlbmRpZgorCWlmICghY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoYXBweV9tZWFsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NCVVMKKwlzdHJ1Y3QgcXVhdHRybyAqbGFzdF9zZWVuX3FmZSA9IE5VTEw7CisjZW5kaWYKKworCXdoaWxlIChyb290X2hhcHB5X2RldikgeworCQlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSByb290X2hhcHB5X2RldjsKKwkJc3RydWN0IGhhcHB5X21lYWwgKm5leHQgPSByb290X2hhcHB5X2Rldi0+bmV4dF9tb2R1bGU7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBocC0+ZGV2OworCisJCS8qIFVucmVnaXN0ZXIgbmV0ZGV2IGJlZm9yZSB1bm1hcHBpbmcgcmVnaXN0ZXJzIGFzIHRoaXMKKwkJICogY2FsbCBjYW4gZW5kIHVwIHRyeWluZyB0byBhY2Nlc3MgdGhvc2UgcmVnaXN0ZXJzLgorCQkgKi8KKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworI2lmZGVmIENPTkZJR19TQlVTCisJCWlmICghKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkpIHsKKwkJCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19RVUFUVFJPKSB7CisJCQkJaWYgKGhwLT5xZmVfcGFyZW50ICE9IGxhc3Rfc2Vlbl9xZmUpIHsKKwkJCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGhwLT5xZmVfcGFyZW50KTsKKwkJCQkJbGFzdF9zZWVuX3FmZSA9IGhwLT5xZmVfcGFyZW50OworCQkJCX0KKwkJCX0KKworCQkJc2J1c19pb3VubWFwKGhwLT5ncmVncywgR1JFR19SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAoaHAtPmV0eHJlZ3MsIEVUWF9SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAoaHAtPmVyeHJlZ3MsIEVSWF9SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAoaHAtPmJpZ21hY3JlZ3MsIEJNQUNfUkVHX1NJWkUpOworCQkJc2J1c19pb3VubWFwKGhwLT50Y3ZyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgIGhwLT5oYXBweV9ibG9jaywKKwkJCQkJICAgICBocC0+aGJsb2NrX2R2bWEpOworCQl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJCisJCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChocC0+aGFwcHlfZGV2LAorCQkJCQkgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgaHAtPmhhcHB5X2Jsb2NrLAorCQkJCQkgICAgaHAtPmhibG9ja19kdm1hKTsKKwkJCWlvdW5tYXAoaHAtPmdyZWdzKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaHAtPmhhcHB5X2Rldik7CisJCX0KKyNlbmRpZgorCQlmcmVlX25ldGRldihkZXYpOworCisJCXJvb3RfaGFwcHlfZGV2ID0gbmV4dDsKKwl9CisKKwkvKiBOb3cgY2xlYW51cCB0aGUgcXVhdHRybyBsaXN0cy4gKi8KKyNpZmRlZiBDT05GSUdfU0JVUworCXdoaWxlIChxZmVfc2J1c19saXN0KSB7CisJCXN0cnVjdCBxdWF0dHJvICpxZmUgPSBxZmVfc2J1c19saXN0OworCQlzdHJ1Y3QgcXVhdHRybyAqbmV4dCA9IHFmZS0+bmV4dDsKKworCQlrZnJlZShxZmUpOworCisJCXFmZV9zYnVzX2xpc3QgPSBuZXh0OworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwl3aGlsZSAocWZlX3BjaV9saXN0KSB7CisJCXN0cnVjdCBxdWF0dHJvICpxZmUgPSBxZmVfcGNpX2xpc3Q7CisJCXN0cnVjdCBxdWF0dHJvICpuZXh0ID0gcWZlLT5uZXh0OworCisJCWtmcmVlKHFmZSk7CisKKwkJcWZlX3BjaV9saXN0ID0gbmV4dDsKKwl9CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoaGFwcHlfbWVhbF9wcm9iZSk7Cittb2R1bGVfZXhpdChoYXBweV9tZWFsX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5oIGIvZHJpdmVycy9uZXQvc3VuaG1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlOWY5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5oCkBAIC0wLDAgKzEsNTE1IEBACisvKiAkSWQ6IHN1bmhtZS5oLHYgMS4zMyAyMDAxLzA4LzAzIDA2OjIzOjA0IGRhdmVtIEV4cCAkCisgKiBzdW5obWUuaDogRGVmaW5pdGlvbnMgZm9yIFNwYXJjIEhNRS9CaWdNYWMgMTAvMTAwYmFzZVQgZXRoZXJuZXQgZHJpdmVyLgorICogICAgICAgICAgIEFsc28ga25vd24gYXMgdGhlICJIYXBweSBNZWFsIi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpZm5kZWYgX1NVTkhNRV9ICisjZGVmaW5lIF9TVU5ITUVfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKy8qIEhhcHB5IE1lYWwgZ2xvYmFsIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgR1JFR19TV1JFU0VUCTB4MDAwVUwJLyogU29mdHdhcmUgUmVzZXQgICovCisjZGVmaW5lIEdSRUdfQ0ZHCTB4MDA0VUwJLyogQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfU1RBVAkweDEwOFVMCS8qIFN0YXR1cyAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLCTB4MTBjVUwJLyogSW50ZXJydXB0IE1hc2sgICovCisjZGVmaW5lIEdSRUdfUkVHX1NJWkUJMHgxMTBVTAorCisvKiBHbG9iYWwgcmVzZXQgcmVnaXN0ZXIuICovCisjZGVmaW5lIEdSRUdfUkVTRVRfRVRYICAgICAgICAgMHgwMQorI2RlZmluZSBHUkVHX1JFU0VUX0VSWCAgICAgICAgIDB4MDIKKyNkZWZpbmUgR1JFR19SRVNFVF9BTEwgICAgICAgICAweDAzCisKKy8qIEdsb2JhbCBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEdSRUdfQ0ZHX0JVUlNUTVNLICAgICAgMHgwMworI2RlZmluZSBHUkVHX0NGR19CVVJTVDE2ICAgICAgIDB4MDAKKyNkZWZpbmUgR1JFR19DRkdfQlVSU1QzMiAgICAgICAweDAxCisjZGVmaW5lIEdSRUdfQ0ZHX0JVUlNUNjQgICAgICAgMHgwMgorI2RlZmluZSBHUkVHX0NGR182NEJJVCAgICAgICAgIDB4MDQKKyNkZWZpbmUgR1JFR19DRkdfUEFSSVRZICAgICAgICAweDA4CisjZGVmaW5lIEdSRUdfQ0ZHX1JFU1YgICAgICAgICAgMHgxMAorCisvKiBHbG9iYWwgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBHUkVHX1NUQVRfR09URlJBTUUgICAgIDB4MDAwMDAwMDEgLyogUmVjZWl2ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUkNOVEVYUCAgICAgIDB4MDAwMDAwMDIgLyogUmVjZWl2ZSBmcmFtZSBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfQUNOVEVYUCAgICAgIDB4MDAwMDAwMDQgLyogQWxpZ24tZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfQ0NOVEVYUCAgICAgIDB4MDAwMDAwMDggLyogQ1JDLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfTENOVEVYUCAgICAgIDB4MDAwMDAwMTAgLyogTGVuZ3RoLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUkZJRk9WRiAgICAgIDB4MDAwMDAwMjAgLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfQ1ZDTlRFWFAgICAgIDB4MDAwMDAwNDAgLyogQ29kZS12aW9sYXRpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfU1RTVEVSUiAgICAgIDB4MDAwMDAwODAgLyogVGVzdCBlcnJvciBpbiBYSUYgZm9yIFNRRSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfU0VOVEZSQU1FICAgIDB4MDAwMDAxMDAgLyogVHJhbnNtaXR0ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfVEZJRk9fVU5EICAgIDB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfTUFYUEtURVJSICAgIDB4MDAwMDA0MDAgLyogTWF4LXBhY2tldCBzaXplIGVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfTkNOVEVYUCAgICAgIDB4MDAwMDA4MDAgLyogTm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfRUNOVEVYUCAgICAgIDB4MDAwMDEwMDAgLyogRXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfTENDTlRFWFAgICAgIDB4MDAwMDIwMDAgLyogTGF0ZS1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfRkNOVEVYUCAgICAgIDB4MDAwMDQwMDAgLyogRmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfRFRJTUVYUCAgICAgIDB4MDAwMDgwMDAgLyogRGVmZXItdGltZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUlhUT0hPU1QgICAgIDB4MDAwMTAwMDAgLyogTW92ZWQgZnJvbSByZWNlaXZlLUZJRk8gdG8gaG9zdCBtZW1vcnkgICAqLworI2RlZmluZSBHUkVHX1NUQVRfTk9SWEQgICAgICAgIDB4MDAwMjAwMDAgLyogTm8gbW9yZSByZWNlaXZlIGRlc2NyaXB0b3JzICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUlhFUlIgICAgICAgIDB4MDAwNDAwMDAgLyogRXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUlhMQVRFUlIgICAgIDB4MDAwODAwMDAgLyogTGF0ZSBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUlhQRVJSICAgICAgIDB4MDAxMDAwMDAgLyogUGFyaXR5IGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfUlhURVJSICAgICAgIDB4MDAyMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfRU9QRVJSICAgICAgIDB4MDA0MDAwMDAgLyogVHJhbnNtaXQgZGVzY3JpcHRvciBkaWQgbm90IGhhdmUgRU9QIHNldCAqLworI2RlZmluZSBHUkVHX1NUQVRfTUlGSVJRICAgICAgIDB4MDA4MDAwMDAgLyogTUlGIGlzIHNpZ25hbGluZyBhbiBpbnRlcnJ1cHQgY29uZGl0aW9uICAqLworI2RlZmluZSBHUkVHX1NUQVRfSE9TVFRPVFggICAgIDB4MDEwMDAwMDAgLyogTW92ZWQgZnJvbSBob3N0IG1lbW9yeSB0byB0cmFuc21pdC1GSUZPICAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhBTEwgICAgICAgIDB4MDIwMDAwMDAgLyogVHJhbnNtaXR0ZWQgYWxsIHBhY2tldHMgaW4gdGhlIHR4LWZpZm8gICAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhFQUNLICAgICAgIDB4MDQwMDAwMDAgLyogRXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhMRVJSICAgICAgIDB4MDgwMDAwMDAgLyogTGF0ZSBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhQRVJSICAgICAgIDB4MTAwMDAwMDAgLyogUGFyaXR5IGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhURVJSICAgICAgIDB4MjAwMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfU0xWRVJSICAgICAgIDB4NDAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYW4gZXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX1NUQVRfU0xWUEVSUiAgICAgIDB4ODAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYSBwYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworCisvKiBBbGwgaW50ZXJlc3RpbmcgZXJyb3IgY29uZGl0aW9ucy4gKi8KKyNkZWZpbmUgR1JFR19TVEFUX0VSUk9SUyAgICAgICAweGZjN2VmZWZjCisKKy8qIEdsb2JhbCBpbnRlcnJ1cHQgbWFzayByZWdpc3Rlci4gKi8KKyNkZWZpbmUgR1JFR19JTUFTS19HT1RGUkFNRSAgICAweDAwMDAwMDAxIC8qIFJlY2VpdmVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SQ05URVhQICAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgZnJhbWUgY291bnRlciBleHBpcmVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19BQ05URVhQICAgICAweDAwMDAwMDA0IC8qIEFsaWduLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19DQ05URVhQICAgICAweDAwMDAwMDA4IC8qIENSQy1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19MQ05URVhQICAgICAweDAwMDAwMDEwIC8qIExlbmd0aC1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SRklGT1ZGICAgICAweDAwMDAwMDIwIC8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19DVkNOVEVYUCAgICAweDAwMDAwMDQwIC8qIENvZGUtdmlvbGF0aW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19TVFNURVJSICAgICAweDAwMDAwMDgwIC8qIFRlc3QgZXJyb3IgaW4gWElGIGZvciBTUUUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19TRU5URlJBTUUgICAweDAwMDAwMTAwIC8qIFRyYW5zbWl0dGVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19URklGT19VTkQgICAweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19NQVhQS1RFUlIgICAweDAwMDAwNDAwIC8qIE1heC1wYWNrZXQgc2l6ZSBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19OQ05URVhQICAgICAweDAwMDAwODAwIC8qIE5vcm1hbC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19FQ05URVhQICAgICAweDAwMDAxMDAwIC8qIEV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19MQ0NOVEVYUCAgICAweDAwMDAyMDAwIC8qIExhdGUtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19GQ05URVhQICAgICAweDAwMDA0MDAwIC8qIEZpcnN0LWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19EVElNRVhQICAgICAweDAwMDA4MDAwIC8qIERlZmVyLXRpbWVyIGV4cGlyZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SWFRPSE9TVCAgICAweDAwMDEwMDAwIC8qIE1vdmVkIGZyb20gcmVjZWl2ZS1GSUZPIHRvIGhvc3QgbWVtb3J5ICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19OT1JYRCAgICAgICAweDAwMDIwMDAwIC8qIE5vIG1vcmUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SWEVSUiAgICAgICAweDAwMDQwMDAwIC8qIEVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SWExBVEVSUiAgICAweDAwMDgwMDAwIC8qIExhdGUgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SWFBFUlIgICAgICAweDAwMTAwMDAwIC8qIFBhcml0eSBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19SWFRFUlIgICAgICAweDAwMjAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19FT1BFUlIgICAgICAweDAwNDAwMDAwIC8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgZGlkIG5vdCBoYXZlIEVPUCBzZXQgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19NSUZJUlEgICAgICAweDAwODAwMDAwIC8qIE1JRiBpcyBzaWduYWxpbmcgYW4gaW50ZXJydXB0IGNvbmRpdGlvbiAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19IT1NUVE9UWCAgICAweDAxMDAwMDAwIC8qIE1vdmVkIGZyb20gaG9zdCBtZW1vcnkgdG8gdHJhbnNtaXQtRklGTyAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19UWEFMTCAgICAgICAweDAyMDAwMDAwIC8qIFRyYW5zbWl0dGVkIGFsbCBwYWNrZXRzIGluIHRoZSB0eC1maWZvICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19UWEVBQ0sgICAgICAweDA0MDAwMDAwIC8qIEVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19UWExFUlIgICAgICAweDA4MDAwMDAwIC8qIExhdGUgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19UWFBFUlIgICAgICAweDEwMDAwMDAwIC8qIFBhcml0eSBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19UWFRFUlIgICAgICAweDIwMDAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19TTFZFUlIgICAgICAweDQwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGFuIGVycm9yICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTS19TTFZQRVJSICAgICAweDgwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGEgcGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKworLyogSGFwcHkgTWVhbCBleHRlcm5hbCB0cmFuc21pdHRlciByZWdpc3RlcnMuICovCisjZGVmaW5lIEVUWF9QRU5ESU5HCTB4MDBVTAkvKiBUcmFuc21pdCBwZW5kaW5nL3dha2V1cCByZWdpc3RlciAqLworI2RlZmluZSBFVFhfQ0ZHCQkweDA0VUwJLyogVHJhbnNtaXQgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX1JJTkcJMHgwOFVMCS8qIFRyYW5zbWl0IHJpbmcgcG9pbnRlciAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9CQkFTRQkweDBjVUwJLyogVHJhbnNtaXQgYnVmZmVyIGJhc2UgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0JESVNQCTB4MTBVTAkvKiBUcmFuc21pdCBidWZmZXIgZGlzcGxhY2VtZW50ICAgICAqLworI2RlZmluZSBFVFhfRklGT1dQVFIJMHgxNFVMCS8qIEZJRk8gd3JpdGUgcHRyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9GSUZPU1dQVFIJMHgxOFVMCS8qIEZJRk8gd3JpdGUgcHRyIChzaGFkb3cgcmVnaXN0ZXIpICovCisjZGVmaW5lIEVUWF9GSUZPUlBUUgkweDFjVUwJLyogRklGTyByZWFkIHB0ciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0ZJRk9TUlBUUgkweDIwVUwJLyogRklGTyByZWFkIHB0ciAoc2hhZG93IHJlZ2lzdGVyKSAgKi8KKyNkZWZpbmUgRVRYX0ZJRk9QQ05UCTB4MjRVTAkvKiBGSUZPIHBhY2tldCBjb3VudGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfU01BQ0hJTkUJMHgyOFVMCS8qIFRyYW5zbWl0dGVyIHN0YXRlIG1hY2hpbmUgICAgICAgICovCisjZGVmaW5lIEVUWF9SU0laRQkweDJjVUwJLyogUmluZyBkZXNjcmlwdG9yIHNpemUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0JQVFIJMHgzMFVMCS8qIFRyYW5zbWl0IGRhdGEgYnVmZmVyIHB0ciAgICAgICAgICovCisjZGVmaW5lIEVUWF9SRUdfU0laRQkweDM0VUwKKworLyogRVRYIHRyYW5zbWl0IHBlbmRpbmcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEVUWF9UUF9ETUFXQUtFVVAgICAgICAgICAweDAwMDAwMDAxIC8qIFJlc3RhcnQgdHJhbnNtaXQgZG1hICAgICAgICAgICAgICovCisKKy8qIEVUWCBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEVUWF9DRkdfRE1BRU5BQkxFICAgICAgICAweDAwMDAwMDAxIC8qIEVuYWJsZSB0cmFuc21pdCBkbWEgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9DRkdfRklGT1RIUkVTSCAgICAgICAweDAwMDAwM2ZlIC8qIFRyYW5zbWl0IEZJRk8gdGhyZXNob2xkICAgICAgICAgICovCisjZGVmaW5lIEVUWF9DRkdfSVJRREFGVEVSICAgICAgICAweDAwMDAwNDAwIC8qIEludGVycnVwdCBhZnRlciBUWC1GSUZPIGRyYWluZWQgICovCisjZGVmaW5lIEVUWF9DRkdfSVJRREJFRk9SRSAgICAgICAweDAwMDAwMDAwIC8qIEludGVycnVwdCBiZWZvcmUgVFgtRklGTyBkcmFpbmVkICovCisKKyNkZWZpbmUgRVRYX1JTSVpFX1NISUZUICAgICAgICAgIDQKKworLyogSGFwcHkgTWVhbCBleHRlcm5hbCByZWNlaXZlciByZWdpc3RlcnMuICovCisjZGVmaW5lIEVSWF9DRkcJCTB4MDBVTAkvKiBSZWNlaXZlciBjb25maWcgcmVnaXN0ZXIgICAgICAgICAqLworI2RlZmluZSBFUlhfUklORwkweDA0VUwJLyogUmVjZWl2ZXIgcmluZyBwdHIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0JQVFIJMHgwOFVMCS8qIFJlY2VpdmVyIGJ1ZmZlciBwdHIgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9GSUZPV1BUUgkweDBjVUwJLyogRklGTyB3cml0ZSBwdHIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0ZJRk9TV1BUUgkweDEwVUwJLyogRklGTyB3cml0ZSBwdHIgKHNoYWRvdyByZWdpc3RlcikgKi8KKyNkZWZpbmUgRVJYX0ZJRk9SUFRSCTB4MTRVTAkvKiBGSUZPIHJlYWQgcHRyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfRklGT1NSUFRSCTB4MThVTAkvKiBGSUZPIHJlYWQgcHRyIChzaGFkb3cgcmVnaXN0ZXIpICAqLworI2RlZmluZSBFUlhfU01BQ0hJTkUJMHgxY1VMCS8qIFJlY2VpdmVyIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9SRUdfU0laRQkweDIwVUwKKworLyogRVJYIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRVJYX0NGR19ETUFFTkFCTEUgICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgcmVjZWl2ZSBETUEgICAgICAgICovCisjZGVmaW5lIEVSWF9DRkdfUkVTVjEgICAgICAgIDB4MDAwMDAwMDYgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfQ0ZHX0JZVEVPRkZTRVQgICAweDAwMDAwMDM4IC8qIFJlY2VpdmUgZmlyc3QgYnl0ZSBvZmZzZXQgKi8KKyNkZWZpbmUgRVJYX0NGR19SRVNWMiAgICAgICAgMHgwMDAwMDFjMCAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9DRkdfU0laRTMyICAgICAgIDB4MDAwMDAwMDAgLyogUmVjZWl2ZSByaW5nIHNpemUgPT0gMzIgICAqLworI2RlZmluZSBFUlhfQ0ZHX1NJWkU2NCAgICAgICAweDAwMDAwMjAwIC8qIFJlY2VpdmUgcmluZyBzaXplID09IDY0ICAgKi8KKyNkZWZpbmUgRVJYX0NGR19TSVpFMTI4ICAgICAgMHgwMDAwMDQwMCAvKiBSZWNlaXZlIHJpbmcgc2l6ZSA9PSAxMjggICovCisjZGVmaW5lIEVSWF9DRkdfU0laRTI1NiAgICAgIDB4MDAwMDA2MDAgLyogUmVjZWl2ZSByaW5nIHNpemUgPT0gMjU2ICAqLworI2RlZmluZSBFUlhfQ0ZHX1JFU1YzICAgICAgICAweDAwMDBmODAwIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0NGR19DU1VNU1RBUlQgICAgMHgwMDdmMDAwMCAvKiBPZmZzZXQgb2YgY2hlY2tzdW0gc3RhcnQsCisJCQkJCSAqIGluIGhhbGZ3b3Jkcy4gKi8KKworLyogSSdkIGxpa2UgYSBCaWcgTWFjLCBzbWFsbCBmcmllcywgc21hbGwgY29rZSwgYW5kIFNwYXJjTGludXggcGxlYXNlLiAqLworI2RlZmluZSBCTUFDX1hJRkNGRwkweDAwMDBVTAkvKiBYSUYgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisJLyogMHg0LS0+MHgyMDQsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfVFhTV1JFU0VUCTB4MjA4VUwJLyogVHJhbnNtaXR0ZXIgc29mdHdhcmUgcmVzZXQgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYQ0ZHCTB4MjBjVUwJLyogVHJhbnNtaXR0ZXIgY29uZmlnIHJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBCTUFDX0lHQVAxCTB4MjEwVUwJLyogSW50ZXItcGFja2V0IGdhcCAxICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0lHQVAyCTB4MjE0VUwJLyogSW50ZXItcGFja2V0IGdhcCAyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FMSU1JVAkweDIxOFVMCS8qIFRyYW5zbWl0IGF0dGVtcHQgbGltaXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19TVElNRQkweDIxY1VMCS8qIFRyYW5zbWl0IHNsb3QgdGltZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QTEVOCTB4MjIwVUwJLyogU2l6ZSBvZiB0cmFuc21pdCBwcmVhbWJsZSAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BQQVQJMHgyMjRVTAkvKiBQYXR0ZXJuIGZvciB0cmFuc21pdCBwcmVhbWJsZSAgICAgICovCisjZGVmaW5lIEJNQUNfVFhTREVMSU0JMHgyMjhVTAkvKiBUcmFuc21pdCBkZWxpbWl0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSlNJWkUJMHgyMmNVTAkvKiBKYW0gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhNQVgJMHgyMzBVTAkvKiBUcmFuc21pdCBtYXggcGt0IHNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhNSU4JMHgyMzRVTAkvKiBUcmFuc21pdCBtaW4gcGt0IHNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUEFUVEVNUFQJMHgyMzhVTAkvKiBDb3VudCBvZiB0cmFuc21pdCBwZWFrIGF0dGVtcHRzICAgICovCisjZGVmaW5lIEJNQUNfRFRDVFIJMHgyM2NVTAkvKiBUcmFuc21pdCBkZWZlciB0aW1lciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTkNDVFIJMHgyNDBVTAkvKiBUcmFuc21pdCBub3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgICovCisjZGVmaW5lIEJNQUNfRkNDVFIJMHgyNDRVTAkvKiBUcmFuc21pdCBmaXJzdC1jb2xsaXNpb24gY291bnRlciAgICovCisjZGVmaW5lIEJNQUNfRVhDVFIJMHgyNDhVTAkvKiBUcmFuc21pdCBleGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgICovCisjZGVmaW5lIEJNQUNfTFRDVFIJMHgyNGNVTAkvKiBUcmFuc21pdCBsYXRlLWNvbGxpc2lvbiBjb3VudGVyICAgICovCisjZGVmaW5lIEJNQUNfUlNFRUQJMHgyNTBVTAkvKiBUcmFuc21pdCByYW5kb20gbnVtYmVyIHNlZWQgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhTTUFDSElORQkweDI1NFVMCS8qIFRyYW5zbWl0IHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKwkvKiAweDI1OC0tPjB4MzA0LCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX1JYU1dSRVNFVAkweDMwOFVMCS8qIFJlY2VpdmVyIHNvZnR3YXJlIHJlc2V0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWENGRwkweDMwY1VMCS8qIFJlY2VpdmVyIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWE1BWAkweDMxMFVMCS8qIFJlY2VpdmUgbWF4IHBrdCBzaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWE1JTgkweDMxNFVMCS8qIFJlY2VpdmUgbWluIHBrdCBzaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMgkweDMxOFVMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMiAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMQkweDMxY1VMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMSAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMAkweDMyMFVMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMCAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19GUkNUUgkweDMyNFVMCS8qIFJlY2VpdmUgZnJhbWUgcmVjZWl2ZSBjb3VudGVyICAgICAgKi8KKyNkZWZpbmUgQk1BQ19HTEVDVFIJMHgzMjhVTAkvKiBSZWNlaXZlIGdpYW50LWxlbmd0aCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIEJNQUNfVU5BTEVDVFIJMHgzMmNVTAkvKiBSZWNlaXZlIHVuYWxpZ25lZCBlcnJvciBjb3VudGVyICAgICovCisjZGVmaW5lIEJNQUNfUkNSQ0VDVFIJMHgzMzBVTAkvKiBSZWNlaXZlIENSQyBlcnJvciBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhTTUFDSElORQkweDMzNFVMCS8qIFJlY2VpdmVyIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWENWQUxJRAkweDMzOFVMCS8qIFJlY2VpdmVyIGNvZGUgdmlvbGF0aW9uICAgICAgICAgICAgKi8KKwkvKiAweDMzYywgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUzCTB4MzQwVUwJLyogSGFzaCB0YWJsZSAzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTIJMHgzNDRVTAkvKiBIYXNoIHRhYmxlIDIgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMQkweDM0OFVMCS8qIEhhc2ggdGFibGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUwCTB4MzRjVUwJLyogSGFzaCB0YWJsZSAwICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIyCTB4MzUwVUwJLyogQWRkcmVzcyBmaWx0ZXIgMiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIxCTB4MzU0VUwJLyogQWRkcmVzcyBmaWx0ZXIgMSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIwCTB4MzU4VUwJLyogQWRkcmVzcyBmaWx0ZXIgMCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGTUFTSwkweDM1Y1VMCS8qIEFkZHJlc3MgZmlsdGVyIG1hc2sgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SRUdfU0laRQkweDM2MFVMCisKKy8qIEJpZ01hYyBYSUYgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfWENGR19PREVOQUJMRSAgMHgwMDAwMDAwMSAvKiBPdXRwdXQgZHJpdmVyIGVuYWJsZSAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX1hMQkFDSyAgICAweDAwMDAwMDAyIC8qIExvb3BiYWNrLW1vZGUgWElGIGVuYWJsZSAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfTUxCQUNLICAgIDB4MDAwMDAwMDQgLyogTG9vcGJhY2stbW9kZSBNSUkgZW5hYmxlICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19NSUlESVNBQiAgMHgwMDAwMDAwOCAvKiBNSUkgcmVjZWl2ZSBidWZmZXIgZGlzYWJsZSAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX1NRRU5BQkxFICAweDAwMDAwMDEwIC8qIFNRRSB0ZXN0IGVuYWJsZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfU1FFVFdJTiAgIDB4MDAwMDAzZTAgLyogU1FFIHRpbWUgd2luZG93ICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19MQU5DRSAgICAgMHgwMDAwMDAxMCAvKiBMYW5jZSBtb2RlIGVuYWJsZSAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX0xJUEcwICAgICAweDAwMDAwM2UwIC8qIExhbmNlIG1vZGUgSVBHMCAgICAgICAgICAgICAgKi8KKworLyogQmlnTWFjIHRyYW5zbWl0IGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0VOQUJMRSAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlciAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfU01PREUgICAgMHgwMDAwMDAyMCAvKiBFbmFibGUgc2xvdyB0cmFuc21pdCBtb2RlICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19DSUdOICAgICAweDAwMDAwMDQwIC8qIElnbm9yZSB0cmFuc21pdCBjb2xsaXNpb25zICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0ZDU09GRiAgIDB4MDAwMDAwODAgLyogRG8gbm90IGVtaXQgRkNTICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfREJBQ0tPRkYgMHgwMDAwMDEwMCAvKiBEaXNhYmxlIGJhY2tvZmYgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19GVUxMRFBMWCAweDAwMDAwMjAwIC8qIEVuYWJsZSBmdWxsLWR1cGxleCAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0RHSVZFVVAgIDB4MDAwMDA0MDAgLyogRG9uJ3QgZ2l2ZSB1cCBvbiB0cmFuc21pdHMgICAqLworCisvKiBCaWdNYWMgcmVjZWl2ZSBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19SWENGR19FTkFCTEUgICAweDAwMDAwMDAxIC8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BTVFJJUCAgIDB4MDAwMDAwMjAgLyogUGFkIGJ5dGUgc3RyaXAgZW5hYmxlICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUE1JU0MgICAgMHgwMDAwMDA0MCAvKiBFbmFibGUgcHJvbWlzY291cyBtb2RlICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19ERVJSICAgICAweDAwMDAwMDgwIC8qIERpc2FibGUgZXJyb3IgY2hlY2tpbmcgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0RDUkNTICAgIDB4MDAwMDAxMDAgLyogRGlzYWJsZSBDUkMgc3RyaXBwaW5nICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUkVKTUUgICAgMHgwMDAwMDIwMCAvKiBSZWplY3QgcGFja2V0cyBhZGRyZXNzZWQgdG8gbWUgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QR1JQICAgICAweDAwMDAwNDAwIC8qIEVuYWJsZSBwcm9taXNjIGdyb3VwIG1vZGUgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0hFTkFCTEUgIDB4MDAwMDA4MDAgLyogRW5hYmxlIHRoZSBoYXNoIGZpbHRlciAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfQUVOQUJMRSAgMHgwMDAwMTAwMCAvKiBFbmFibGUgdGhlIGFkZHJlc3MgZmlsdGVyICAgICAgICovCisKKy8qIFRoZXNlIGFyZSB0aGUgIk1hbmFnZW1lbnQgSW50ZXJmYWNlIiAoaWUuIE1JRikgcmVnaXN0ZXJzIG9mIHRoZSB0cmFuc2NlaXZlci4gKi8KKyNkZWZpbmUgVENWUl9CQkNMT0NLCTB4MDBVTAkvKiBCaXQgYmFuZyBjbG9jayByZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX0JCREFUQQkweDA0VUwJLyogQml0IGJhbmcgZGF0YSByZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9CQk9FTkFCCTB4MDhVTAkvKiBCaXQgYmFuZyBvdXRwdXQgZW5hYmxlICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX0ZSQU1FCTB4MGNVTAkvKiBGcmFtZSBjb250cm9sL2RhdGEgcmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBUQ1ZSX0NGRwkweDEwVUwJLyogTUlGIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9JTUFTSwkweDE0VUwJLyogTUlGIGludGVycnVwdCBtYXNrICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9TVEFUVVMJMHgxOFVMCS8qIE1JRiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfU01BQ0hJTkUJMHgxY1VMCS8qIE1JRiBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfUkVHX1NJWkUJMHgyMFVMCisKKy8qIEZyYW1lIGNvbW1hbmRzLiAqLworI2RlZmluZSBGUkFNRV9XUklURSAgICAgICAgICAgMHg1MDAyMDAwMAorI2RlZmluZSBGUkFNRV9SRUFEICAgICAgICAgICAgMHg2MDAyMDAwMAorCisvKiBUcmFuc2NlaXZlciBjb25maWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENWX0NGR19QU0VMRUNUICAgICAgIDB4MDAwMDAwMDEgLyogU2VsZWN0IFBIWSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZfQ0ZHX1BFTkFCTEUgICAgICAgMHgwMDAwMDAwMiAvKiBFbmFibGUgTUlGIHBvbGxpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVl9DRkdfQkVOQUJMRSAgICAgICAweDAwMDAwMDA0IC8qIEVuYWJsZSB0aGUgImJpdCBiYW5nZXIiIG9oIGJhYnkgKi8KKyNkZWZpbmUgVENWX0NGR19QUkVHQUREUiAgICAgIDB4MDAwMDAwZjggLyogQWRkcmVzcyBvZiBwb2xsIHJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBUQ1ZfQ0ZHX01ESU8wICAgICAgICAgMHgwMDAwMDEwMCAvKiBNRElPIHplcm8sIGRhdGEvYXR0YWNoZWQgICAgICAgICovCisjZGVmaW5lIFRDVl9DRkdfTURJTzEgICAgICAgICAweDAwMDAwMjAwIC8qIE1ESU8gb25lLCAgZGF0YS9hdHRhY2hlZCAgICAgICAgKi8KKyNkZWZpbmUgVENWX0NGR19QREFERFIgICAgICAgIDB4MDAwMDdjMDAgLyogRGV2aWNlIFBIWSBhZGRyZXNzIHBvbGxpbmcgICAgICAqLworCisvKiBIZXJlIGFyZSBzb21lIFBIWSBhZGRyZXNzZXMuICovCisjZGVmaW5lIFRDVl9QQUREUl9FVFggICAgICAgICAwICAgICAgICAgIC8qIEludGVybmFsIHRyYW5zY2VpdmVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWX1BBRERSX0lUWCAgICAgICAgIDEgICAgICAgICAgLyogRXh0ZXJuYWwgdHJhbnNjZWl2ZXIgICAgICAgICAgICAqLworCisvKiBUcmFuc2NlaXZlciBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENWX1NUQVRfQkFTSUMgICAgICAgIDB4ZmZmZjAwMDAgLyogVGhlICJiYXNpYyIgcGFydCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZfU1RBVF9OT1JNQUwgICAgICAgMHgwMDAwZmZmZiAvKiBUaGUgIm5vbi1iYXNpYyIgcGFydCAgICAgICAgICAgICovCisKKy8qIEluc2lkZSB0aGUgSGFwcHkgTWVhbCB0cmFuc2NlaXZlciBpcyB0aGUgcGh5c2ljYWwgbGF5ZXIsIHRoZXkgdXNlIGFuCisgKiBpbXBsZW1lbnRhdGlvbnMgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IsIHBhcnQgbnVtYmVyIERQODM4NDBWQ0UuCisgKiBZb3UgY2FuIHJldHJpZXZlIHRoZSBkYXRhIHNoZWV0cyBhbmQgcHJvZ3JhbW1pbmcgZG9jcyBmb3IgdGhpcyBiZWFzdAorICogZnJvbSBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS8KKyAqCisgKiBUaGUgRFA4Mzg0MCBpcyBjYXBhYmxlIG9mIGJvdGggMTAgYW5kIDEwME1icHMgZXRoZXJuZXQsIGluIGJvdGgKKyAqIGhhbGYgYW5kIGZ1bGwgZHVwbGV4IG1vZGUuICBJdCBhbHNvIHN1cHBvcnRzIGF1dG8gbmVnb3RpYXRpb24uCisgKgorICogQnV0Li4uLiBUSElTIFRISU5HIElTIEEgUEFJTiBJTiBUSEUgQVNTIFRPIFBST0dSQU0hCisgKiBEZWJ1Z2dpbmcgZWVwcm9tIGJ1cm50IGNvZGUgaXMgbW9yZSBmdW4gdGhhbiBwcm9ncmFtbWluZyB0aGlzIGNoaXAhCisgKi8KKworLyogR2VuZXJpYyBNSUkgcmVnaXN0ZXJzIGRlZmluZWQgaW4gbGludXgvbWlpLmgsIHRoZXNlIGJlbG93CisgKiBhcmUgRFA4Mzg0MCBzcGVjaWZpYy4KKyAqLworI2RlZmluZSBEUDgzODQwX0NTQ09ORklHICAgICAgICAweDE3ICAgICAgICAvKiBDUyBjb25maWd1cmF0aW9uICAgICAgICAgICAgKi8KKworLyogVGhlIENhcnJpZXIgU2Vuc2UgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBDU0NPTkZJR19SRVNWMSAgICAgICAgICAweDAwMDEgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19MRUQ0ICAgICAgICAgICAweDAwMDIgIC8qIFBpbiBmb3IgZnVsbC1kcGx4IExFRDQgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19MRUQxICAgICAgICAgICAweDAwMDQgIC8qIFBpbiBmb3IgY29ubi1zdGF0dXMgTEVEMSAgICAqLworI2RlZmluZSBDU0NPTkZJR19SRVNWMiAgICAgICAgICAweDAwMDggIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19UQ1ZESVNBQiAgICAgICAweDAwMTAgIC8qIFR1cm5zIG9mZiB0aGUgdHJhbnNjZWl2ZXIgICAqLworI2RlZmluZSBDU0NPTkZJR19ERkJZUEFTUyAgICAgICAweDAwMjAgIC8qIEJ5cGFzcyBkaXNjb25uZWN0IGZ1bmN0aW9uICAqLworI2RlZmluZSBDU0NPTkZJR19HTEZPUkNFICAgICAgICAweDAwNDAgIC8qIEdvb2QgbGluayBmb3JjZSBmb3IgMTAwbWJwcyAqLworI2RlZmluZSBDU0NPTkZJR19DTEtUUklTVEFURSAgICAweDAwODAgIC8qIFRyaXN0YXRlIDI1bSBjbG9jayAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19SRVNWMyAgICAgICAgICAweDA3MDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19FTkNPREUgICAgICAgICAweDA4MDAgIC8qIDE9TUxULTMsIDA9YmluYXJ5ICAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19SRU5BQkxFICAgICAgICAweDEwMDAgIC8qIFJlcGVhdGVyIG1vZGUgZW5hYmxlICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19UQ0RJU0FCTEUgICAgICAweDIwMDAgIC8qIERpc2FibGUgdGltZW91dCBjb3VudGVyICAgICAqLworI2RlZmluZSBDU0NPTkZJR19SRVNWNCAgICAgICAgICAweDQwMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU0NPTkZJR19ORElTQUJMRSAgICAgICAweDgwMDAgIC8qIERpc2FibGUgTlJaSSAgICAgICAgICAgICAgICAqLworCisvKiBIYXBweSBNZWFsIGRlc2NyaXB0b3IgcmluZ3MgYW5kIHN1Y2guCisgKiBBbGwgZGVzY3JpcHRvciByaW5ncyBtdXN0IGJlIGFsaWduZWQgb24gYSAySyBib3VuZGFyeS4KKyAqIEFsbCByZWNlaXZlIGJ1ZmZlcnMgbXVzdCBiZSA2NCBieXRlIGFsaWduZWQuCisgKiBBbHdheXMgd3JpdGUgdGhlIGFkZHJlc3MgZmlyc3QgYmVmb3JlIHNldHRpbmcgdGhlIG93bmVyc2hpcAorICogYml0cyB0byBhdm9pZCByYWNlcyB3aXRoIHRoZSBoYXJkd2FyZSBzY2FubmluZyB0aGUgcmluZy4KKyAqLworc3RydWN0IGhhcHB5X21lYWxfcnhkIHsKKwl1MzIgcnhfZmxhZ3M7CisJdTMyIHJ4X2FkZHI7Cit9OworCisjZGVmaW5lIFJYRkxBR19PV04gICAgICAgICAweDgwMDAwMDAwIC8qIDEgPSBoYXJkd2FyZSwgMCA9IHNvZnR3YXJlICovCisjZGVmaW5lIFJYRkxBR19PVkVSRkxPVyAgICAweDQwMDAwMDAwIC8qIDEgPSBidWZmZXIgb3ZlcmZsb3cgICAgICAgICovCisjZGVmaW5lIFJYRkxBR19TSVpFICAgICAgICAweDNmZmYwMDAwIC8qIFNpemUgb2YgdGhlIGJ1ZmZlciAgICAgICAgICovCisjZGVmaW5lIFJYRkxBR19DU1VNICAgICAgICAweDAwMDBmZmZmIC8qIEhXIGNvbXB1dGVkIGNoZWNrc3VtICAgICAgICovCisKK3N0cnVjdCBoYXBweV9tZWFsX3R4ZCB7CisJdTMyIHR4X2ZsYWdzOworCXUzMiB0eF9hZGRyOworfTsKKworI2RlZmluZSBUWEZMQUdfT1dOICAgICAgICAgMHg4MDAwMDAwMCAvKiAxID0gaGFyZHdhcmUsIDAgPSBzb2Z0d2FyZSAqLworI2RlZmluZSBUWEZMQUdfU09QICAgICAgICAgMHg0MDAwMDAwMCAvKiAxID0gc3RhcnQgb2YgcGFja2V0ICAgICAgICAqLworI2RlZmluZSBUWEZMQUdfRU9QICAgICAgICAgMHgyMDAwMDAwMCAvKiAxID0gZW5kIG9mIHBhY2tldCAgICAgICAgICAqLworI2RlZmluZSBUWEZMQUdfQ1NFTkFCTEUgICAgMHgxMDAwMDAwMCAvKiAxID0gZW5hYmxlIGh3LWNoZWNrc3VtcyAgICAqLworI2RlZmluZSBUWEZMQUdfQ1NMT0NBVElPTiAgMHgwZmYwMDAwMCAvKiBXaGVyZSB0byBzdGljayB0aGUgY3N1bSAgICAqLworI2RlZmluZSBUWEZMQUdfQ1NCVUZCRUdJTiAgMHgwMDBmYzAwMCAvKiBXaGVyZSB0byBiZWdpbiBjaGVja3N1bSAgICAqLworI2RlZmluZSBUWEZMQUdfU0laRSAgICAgICAgMHgwMDAwM2ZmZiAvKiBTaXplIG9mIHRoZSBwYWNrZXQgICAgICAgICAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAzMiAgICAgICAgIC8qIE11c3QgYmUgPjE2IGFuZCA8MjU1LCBtdWx0aXBsZSBvZiAxNiAgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgIDMyICAgICAgICAgLyogc2VlIEVSWF9DRkdfU0laRSogZm9yIHBvc3NpYmxlIHZhbHVlcyAqLworCisjaWYgKFRYX1JJTkdfU0laRSA8IDE2IHx8IFRYX1JJTkdfU0laRSA+IDI1NiB8fCAoVFhfUklOR19TSVpFICUgMTYpICE9IDApCisjZXJyb3IgVFhfUklOR19TSVpFIGhvbGRzIGlsbGVnYWwgdmFsdWUKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgICAyNTYKKyNkZWZpbmUgUlhfUklOR19NQVhTSVpFICAgIDI1NgorCisvKiBXZSB1c2UgYSAxNCBieXRlIG9mZnNldCBmb3IgY2hlY2tzdW0gY29tcHV0YXRpb24uICovCisjaWYgKFJYX1JJTkdfU0laRSA9PSAzMikKKyNkZWZpbmUgRVJYX0NGR19ERUZBVUxUKG9mZikgKEVSWF9DRkdfRE1BRU5BQkxFfCgob2ZmKTw8Myl8RVJYX0NGR19TSVpFMzJ8KCgxNC8yKTw8MTYpKQorI2Vsc2UKKyNpZiAoUlhfUklOR19TSVpFID09IDY0KQorI2RlZmluZSBFUlhfQ0ZHX0RFRkFVTFQob2ZmKSAoRVJYX0NGR19ETUFFTkFCTEV8KChvZmYpPDwzKXxFUlhfQ0ZHX1NJWkU2NHwoKDE0LzIpPDwxNikpCisjZWxzZQorI2lmIChSWF9SSU5HX1NJWkUgPT0gMTI4KQorI2RlZmluZSBFUlhfQ0ZHX0RFRkFVTFQob2ZmKSAoRVJYX0NGR19ETUFFTkFCTEV8KChvZmYpPDwzKXxFUlhfQ0ZHX1NJWkUxMjh8KCgxNC8yKTw8MTYpKQorI2Vsc2UKKyNpZiAoUlhfUklOR19TSVpFID09IDI1NikKKyNkZWZpbmUgRVJYX0NGR19ERUZBVUxUKG9mZikgKEVSWF9DRkdfRE1BRU5BQkxFfCgob2ZmKTw8Myl8RVJYX0NGR19TSVpFMjU2fCgoMTQvMik8PDE2KSkKKyNlbHNlCisjZXJyb3IgUlhfUklOR19TSVpFIGhvbGRzIGlsbGVnYWwgdmFsdWUKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE5FWFRfUlgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfVFgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfUlgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoaHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChocCktPnR4X29sZCA8PSAoaHApLT50eF9uZXcpID8gICAgICAgICAgICAgICAgICAgICBcCisJICAoaHApLT50eF9vbGQgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAoaHApLT50eF9uZXcgOiAgXAorCQkJICAgIChocCktPnR4X29sZCAtIChocCktPnR4X25ldyAtIDEpCisKKyNkZWZpbmUgUlhfT0ZGU0VUICAgICAgICAgIDIKKyNkZWZpbmUgUlhfQlVGX0FMTE9DX1NJWkUgICgxNTQ2ICsgUlhfT0ZGU0VUICsgNjQpCisKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQgIDI1NgorCitzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayB7CisJc3RydWN0IGhhcHB5X21lYWxfcnhkIGhhcHB5X21lYWxfcnhkW1JYX1JJTkdfTUFYU0laRV07CisJc3RydWN0IGhhcHB5X21lYWxfdHhkIGhhcHB5X21lYWxfdHhkW1RYX1JJTkdfTUFYU0laRV07Cit9OworCisjZGVmaW5lIGhibG9ja19vZmZzZXQobWVtLCBlbGVtKSBcCisoKF9fdTMyKSgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBobWVhbF9pbml0X2Jsb2NrICopMCktPm1lbVtlbGVtXSkpKSkKKworLyogTm93IHNvZnR3YXJlIHN0YXRlIHN0dWZmLiAqLworZW51bSBoYXBweV90cmFuc2NlaXZlciB7CisJZXh0ZXJuYWwgPSAwLAorCWludGVybmFsID0gMSwKKwlub25lICAgICA9IDIsCit9OworCisvKiBUaW1lciBzdGF0ZSBlbmdpbmUuICovCitlbnVtIGhhcHB5X3RpbWVyX3N0YXRlIHsKKwlhcmJ3YWl0ICA9IDAsICAvKiBXYWl0aW5nIGZvciBhdXRvIG5lZ290aWF0aW9uIHRvIGNvbXBsZXRlLiAgICAgICAgICAqLworCWx1cHdhaXQgID0gMSwgIC8qIEF1dG8tbmVnIGNvbXBsZXRlLCBhd2FpdGluZyBsaW5rLXVwIHN0YXR1cy4gICAgICAgICovCisJbHRyeXdhaXQgPSAyLCAgLyogRm9yY2luZyB0cnkgb2YgYWxsIG1vZGVzLCBmcm9tIGZhc3Rlc3QgdG8gc2xvd2VzdC4gKi8KKwlhc2xlZXAgICA9IDMsICAvKiBUaW1lIGluYWN0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IHF1YXR0cm87CisKKy8qIEhhcHB5IGhhcHB5LCBqb3kgam95ISAqLworc3RydWN0IGhhcHB5X21lYWwgeworCXZvaWQgX19pb21lbQkqZ3JlZ3M7CQkJLyogSGFwcHkgbWVhbCBnbG9iYWwgcmVnaXN0ZXJzICAgICAgICovCisJc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgICpoYXBweV9ibG9jazsJLyogUlggYW5kIFRYIGRlc2NyaXB0b3JzIChDUFUgYWRkcikgICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJdTMyICgqcmVhZF9kZXNjMzIpKHUzMiAqKTsKKwl2b2lkICgqd3JpdGVfdHhkKShzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKiwgdTMyLCB1MzIpOworCXZvaWQgKCp3cml0ZV9yeGQpKHN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqLCB1MzIsIHUzMik7CisJdTMyICgqZG1hX21hcCkodm9pZCAqLCB2b2lkICosIGxvbmcsIGludCk7CisJdm9pZCAoKmRtYV91bm1hcCkodm9pZCAqLCB1MzIsIGxvbmcsIGludCk7CisJdm9pZCAoKmRtYV9zeW5jX2Zvcl9jcHUpKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpOworCXZvaWQgKCpkbWFfc3luY19mb3JfZGV2aWNlKSh2b2lkICosIHUzMiwgbG9uZywgaW50KTsKKyNlbmRpZgorCisJLyogVGhpcyBpcyBlaXRoZXIgYSBzYnVzX2RldiBvciBhIHBjaV9kZXYuICovCisJdm9pZAkJCSAgKmhhcHB5X2RldjsKKworCXNwaW5sb2NrX3QJCSAgaGFwcHlfbG9jazsKKworCXN0cnVjdCBza19idWZmICAgICAgICAgICAqcnhfc2tic1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmICAgICAgICAgICAqdHhfc2tic1tUWF9SSU5HX1NJWkVdOworCisJaW50IHJ4X25ldywgdHhfbmV3LCByeF9vbGQsIHR4X29sZDsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCSAgbmV0X3N0YXRzOyAgICAgIC8qIFN0YXRpc3RpY2FsIGNvdW50ZXJzICAgICAgICAgICAgICAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCXUzMiAoKnJlYWQzMikodm9pZCBfX2lvbWVtICopOworCXZvaWQgKCp3cml0ZTMyKSh2b2lkIF9faW9tZW0gKiwgdTMyKTsKKyNlbmRpZgorCisJdm9pZCBfX2lvbWVtCSpldHhyZWdzOyAgICAgICAgLyogRXh0ZXJuYWwgdHJhbnNtaXR0ZXIgcmVncyAgICAgICAgKi8KKwl2b2lkIF9faW9tZW0JKmVyeHJlZ3M7ICAgICAgICAvKiBFeHRlcm5hbCByZWNlaXZlciByZWdzICAgICAgICAgICAqLworCXZvaWQgX19pb21lbQkqYmlnbWFjcmVnczsgICAgIC8qIEJJR01BQyBjb3JlIHJlZ3MJCSAgICAgKi8KKwl2b2lkIF9faW9tZW0JKnRjdnJlZ3M7ICAgICAgICAvKiBNSUYgdHJhbnNjZWl2ZXIgcmVncyAgICAgICAgICAgICAqLworCisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgICBoYmxvY2tfZHZtYTsgICAgLyogRFZNQSB2aXNpYmxlIGFkZHJlc3MgaGFwcHkgYmxvY2sgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBoYXBweV9mbGFnczsgICAgLyogRHJpdmVyIHN0YXRlIGZsYWdzICAgICAgICAgICAgICAgICovCisJZW51bSBoYXBweV90cmFuc2NlaXZlciAgICB0Y3ZyX3R5cGU7ICAgICAgLyogS2luZCBvZiB0cmFuc2NlaXZlciBpbiB1c2UgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBoYXBweV9idXJzdHM7ICAgLyogR2V0IHlvdXIgbWluZCBvdXQgb2YgdGhlIGd1dHRlciAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBwYWRkcjsgICAgICAgICAgLyogUEhZIGFkZHJlc3MgZm9yIHRyYW5zY2VpdmVyICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBobV9yZXZpc2lvbjsgICAgLyogSGFwcHkgbWVhbCByZXZpc2lvbiAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19ibWNyOyAgICAgICAgLyogU1cgY29weSBvZiBCTUNSICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19ibXNyOyAgICAgICAgLyogU1cgY29weSBvZiBCTVNSICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19waHlzaWQxOyAgICAgLyogU1cgY29weSBvZiBQSFlTSUQxICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19waHlzaWQyOyAgICAgLyogU1cgY29weSBvZiBQSFlTSUQyICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19hZHZlcnRpc2U7ICAgLyogU1cgY29weSBvZiBBRFZFUlRJU0UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19scGE7ICAgICAgICAgLyogU1cgY29weSBvZiBMUEEgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19leHBhbnNpb247ICAgLyogU1cgY29weSBvZiBFWFBBTlNJT04gICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgICBzd19jc2NvbmZpZzsgICAgLyogU1cgY29weSBvZiBDU0NPTkZJRyAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBhdXRvX3NwZWVkOyAgICAgLyogQXV0by1uZWdvIGxpbmsgc3BlZWQgICAgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgZm9yY2VkX3NwZWVkOyAgIC8qIEZvcmNlIG1vZGUgbGluayBzcGVlZCAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgcG9sbF9kYXRhOyAgICAgIC8qIE1JRiBwb2xsIGRhdGEgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgcG9sbF9mbGFnOyAgICAgIC8qIE1JRiBwb2xsIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgbGlua2NoZWNrOyAgICAgIC8qIEhhdmUgd2UgY2hlY2tlZCB0aGUgbGluayB5ZXQ/ICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgbG5rdXA7ICAgICAgICAgIC8qIElzIHRoZSBsaW5rIHVwIGFzIGZhciBhcyB3ZSBrbm93PyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgbG5rZG93bjsgICAgICAgIC8qIFRyeWluZyB0byBmb3JjZSB0aGUgbGluayBkb3duPyAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgbG5rY250OyAgICAgICAgIC8qIENvdW50ZXIgZm9yIGxpbmstdXAgYXR0ZW1wdHMuICAgICAqLworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgaGFwcHlfdGltZXI7ICAgIC8qIFRvIHdhdGNoIHRoZSBsaW5rIHdoZW4gY29taW5nIHVwLiAqLworCWVudW0gaGFwcHlfdGltZXJfc3RhdGUgICAgdGltZXJfc3RhdGU7ICAgIC8qIFN0YXRlIG9mIHRoZSBhdXRvLW5lZyB0aW1lci4gICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgdGltZXJfdGlja3M7ICAgIC8qIE51bWJlciBvZiBjbGlja3MgYXQgZWFjaCBzdGF0ZS4gICAqLworCisJc3RydWN0IG5ldF9kZXZpY2UJICpkZXY7CQkvKiBCYWNrcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgcXVhdHRybwkJICpxZmVfcGFyZW50OwkvKiBGb3IgUXVhdHRybyBjYXJkcyAgICAgICAgICAgICAgICAgKi8KKwlpbnQJCQkgIHFmZV9lbnQ7CS8qIFdoaWNoIGluc3RhbmNlIG9uIHF1YXR0cm8gICAgICAgICAqLworCXN0cnVjdCBoYXBweV9tZWFsICAgICAgICAgKm5leHRfbW9kdWxlOworfTsKKworLyogSGVyZSBhcmUgdGhlIGhhcHB5IGZsYWdzLiAqLworI2RlZmluZSBIRkxBR19QT0xMICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBXZSBhcmUgZG9pbmcgTUlGIHBvbGxpbmcgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfRkVOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAgLyogVGhlIE1JSSBmcmFtZSBpcyBlbmFibGVkICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX0xBTkNFICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgIC8qIFdlIGFyZSB1c2luZyBsYW5jZS1tb2RlICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19SWEVOQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDggICAgICAvKiBSZWNlaXZlciBpcyBlbmFibGVkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfQVVUTyAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAgICAgLyogVXNpbmcgYXV0by1uZWdvdGlhdGlvbiwgMCA9IGZvcmNlICovCisjZGVmaW5lIEhGTEFHX0ZVTEwgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAgIC8qIEZ1bGwgZHVwbGV4IGVuYWJsZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19NQUNGVUxMICAgICAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvKiBVc2luZyBmdWxsIGR1cGxleCBpbiB0aGUgTUFDICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfUE9MTEVOQUJMRSAgICAgICAgICAweDAwMDAwMDgwICAgICAgLyogQWN0dWFsbHkgdHJ5IE1JRiBwb2xsaW5nICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX1JYQ1YgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAgIC8qIFhYWCBSWENWIEVOQUJMRSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19JTklUICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAgICAgICAvKiBJbml0IGNhbGxlZCBhdCBsZWFzdCBvbmNlICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfTElOS1VQICAgICAgICAgICAgICAweDAwMDAwNDAwICAgICAgLyogMSA9IExpbmsgaXMgdXAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX1BDSSAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAgIC8qIFBDSSBiYXNlZCBIYXBweSBNZWFsICAgICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19RVUFUVFJPCQkgIDB4MDAwMDEwMDAgICAgICAvKiBPbiBRRkUvUXVhdHRybyBjYXJkCSAgICAgICAqLworCisjZGVmaW5lIEhGTEFHXzIwXzIxICAoSEZMQUdfUE9MTEVOQUJMRSB8IEhGTEFHX0ZFTkFCTEUpCisjZGVmaW5lIEhGTEFHX05PVF9BMCAoSEZMQUdfUE9MTEVOQUJMRSB8IEhGTEFHX0ZFTkFCTEUgfCBIRkxBR19MQU5DRSB8IEhGTEFHX1JYQ1YpCisKKy8qIFN1cHBvcnQgZm9yIFFGRS9RdWF0dHJvIGNhcmRzLiAqLworc3RydWN0IHF1YXR0cm8geworCXN0cnVjdCBuZXRfZGV2aWNlCSpoYXBweV9tZWFsc1s0XTsKKworCS8qIFRoaXMgaXMgZWl0aGVyIGEgc2J1c19kZXYgb3IgYSBwY2lfZGV2LiAqLworCXZvaWQJCQkqcXVhdHRyb19kZXY7CisKKwlzdHJ1Y3QgcXVhdHRybwkJKm5leHQ7CisKKwkvKiBQUk9NIHJhbmdlcywgaWYgYW55LiAqLworI2lmZGVmIENPTkZJR19TQlVTCisJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICByYW5nZXNbOF07CisjZW5kaWYKKwlpbnQJCQkgIG5yYW5nZXM7Cit9OworCisvKiBXZSB1c2UgdGhpcyB0byBhY3F1aXJlIHJlY2VpdmUgc2tiJ3MgdGhhdCB3ZSBjYW4gRE1BIGRpcmVjdGx5IGludG8uICovCisjZGVmaW5lIEFMSUdORURfUlhfU0tCX0FERFIoYWRkcikgXAorICAgICAgICAoKCgodW5zaWduZWQgbG9uZykoYWRkcikgKyAoNjRVTCAtIDFVTCkpICYgfig2NFVMIC0gMVVMKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIGhhcHB5X21lYWxfYWxsb2Nfc2tiKF9fbGVuZ3RoLCBfX2dmcF9mbGFncykgXAorKHsJc3RydWN0IHNrX2J1ZmYgKl9fc2tiOyBcCisJX19za2IgPSBhbGxvY19za2IoKF9fbGVuZ3RoKSArIDY0LCAoX19nZnBfZmxhZ3MpKTsgXAorCWlmKF9fc2tiKSB7IFwKKwkJaW50IF9fb2Zmc2V0ID0gKGludCkgQUxJR05FRF9SWF9TS0JfQUREUihfX3NrYi0+ZGF0YSk7IFwKKwkJaWYoX19vZmZzZXQpIFwKKwkJCXNrYl9yZXNlcnZlKF9fc2tiLCBfX29mZnNldCk7IFwKKwl9IFwKKwlfX3NrYjsgXAorfSkKKworI2VuZGlmIC8qICEoX1NVTkhNRV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkNDY0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKQEAgLTAsMCArMSwxNjE0IEBACisvKiAkSWQ6IHN1bmxhbmNlLmMsdiAxLjExMiAyMDAyLzAxLzE1IDA2OjQ4OjU1IGRhdmVtIEV4cCAkCisgKiBsYW5jZS5jOiBMaW51eC9TcGFyYy9MYW5jZSBkcml2ZXIKKyAqCisgKglXcml0dGVuIDE5OTUsIDE5OTYgYnkgTWlndWVsIGRlIEljYXphCisgKiBTb3VyY2VzOgorICoJVGhlIExpbnV4ICBkZXBjYSBkcml2ZXIKKyAqCVRoZSBMaW51eCAgbGFuY2UgZHJpdmVyLgorICoJVGhlIExpbnV4ICBza2VsZXRvbiBkcml2ZXIuCisgKglUaGUgTmV0QlNEIFNwYXJjL0xhbmNlIGRyaXZlci4KKyAqCVRoZW8gZGUgUmFhZHQgKGRlcmFhZHRAb3BlbmJzZC5vcmcpCisgKglOQ1I5MkM5OTAgTGFuIENvbnRyb2xsZXIgbWFudWFsCisgKgorICogMS40OgorICoJQWRkZWQgc3VwcG9ydCB0byBydW4gd2l0aCBhIGxlZG1hIG9uIHRoZSBTdW40bQorICoKKyAqIDEuNToKKyAqCUFkZGVkIG11bHRpcGxlIGNhcmQgZGV0ZWN0aW9uLgorICoKKyAqCSA0LzE3Lzk2OiBCdXJzdCBzaXplcyBhbmQgdHBlIHNlbGVjdGlvbiBvbiBzdW40bSBieSBFZGRpZSBDLiBEb3N0CisgKgkJICAoZWNkQHNreW5ldC5iZSkKKyAqCisgKgkgNS8xNS85NjogYXV0byBjYXJyaWVyIGRldGVjdGlvbiBvbiBzdW40bSBieSBFZGRpZSBDLiBEb3N0CisgKgkJICAoZWNkQHNreW5ldC5iZSkKKyAqCisgKgkgNS8xNy85NjogbGVidWZmZXIgb24gc2NzaS9ldGhlciBjYXJkcyBub3cgd29yayBEYXZpZCBTLiBNaWxsZXIKKyAqCQkgIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICoKKyAqCSA1LzI5Lzk2OiBvdmVycmlkZSBvcHRpb24gJ3RwZS1saW5rLXRlc3Q/JywgaWYgaXQgaXMgJ2ZhbHNlJywgYXMKKyAqCQkgIHRoaXMgZGlzYWJsZXMgYXV0byBjYXJyaWVyIGRldGVjdGlvbiBvbiBzdW40bS4gRWRkaWUgQy4gRG9zdAorICoJCSAgKGVjZEBza3luZXQuYmUpCisgKgorICogMS43OgorICoJIDYvMjYvOTY6IEJ1ZyBmaXggZm9yIG11bHRpcGxlIGxlZG1hcywgbWlndWVsLgorICoKKyAqIDEuODoKKyAqCQkgIFN0b2xlIG11bHRpY2FzdCBjb2RlIGZyb20gZGVwY2EuYywgZml4ZWQgbGFuY2VfdHguCisgKgorICogMS45OgorICoJIDgvMjEvOTY6IEZpeGVkIHRoZSBtdWx0aWNhc3QgY29kZSAoUGVkcm8gUm9xdWUpCisgKgorICoJIDgvMjgvOTY6IFNlbmQgZmFrZSBwYWNrZXQgaW4gbGFuY2Vfb3BlbigpIGlmIGF1dG9fc2VsZWN0IGlzIHRydWUsCisgKgkJICBzbyB3ZSBjYW4gZGV0ZWN0IHRoZSBjYXJyaWVyIGxvc3MgY29uZGl0aW9uIGluIHRpbWUuCisgKgkJICBFZGRpZSBDLiBEb3N0IChlY2RAc2t5bmV0LmJlKQorICoKKyAqCSA5LzE1Lzk2OiBBbGlnbiByeF9idWYgc28gdGhhdCBldGhfY29weV9hbmRfc3VtKCkgd29uJ3QgY2F1c2UgYW4KKyAqCQkgIE1OQSB0cmFwIGR1cmluZyBjaGtzdW1fcGFydGlhbF9jb3B5KCkuIChlY2RAc2t5bmV0LmJlKQorICoKKyAqCTExLzE3Lzk2OiBIYW5kbGUgTEVfQzBfTUVSUiBpbiBsYW5jZV9pbnRlcnJ1cHQoKS4gKGVjZEBza3luZXQuYmUpCisgKgorICoJMTIvMjIvOTY6IERvbid0IGxvb3AgZm9yZXZlciBpbiBsYW5jZV9yeCgpIG9uIGluY29tcGxldGUgcGFja2V0cy4KKyAqCQkgIFRoaXMgd2FzIHRoZSBzdW40YyBraWxsZXIuIFNoaXQsIHN0dXBpZCBidWcuCisgKgkJICAoZWNkQHNreW5ldC5iZSkKKyAqCisgKiAxLjEwOgorICoJIDEvMjYvOTc6IE1vZHVsYXJpemUgZHJpdmVyLiAoZWNkQHNreW5ldC5iZSkKKyAqCisgKiAxLjExOgorICoJMTIvMjcvOTc6IEFkZGVkIHN1bjRkIHN1cHBvcnQuIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICoKKyAqIDEuMTI6CisgKiAJIDExLzMvOTk6IEZpeGVkIFNNUCByYWNlIGluIGxhbmNlX3N0YXJ0X3htaXQgZm91bmQgYnkgZGF2ZW0uCisgKiAJICAgICAgICAgIEFudG9uIEJsYW5jaGFyZCAoYW50b25AcHJvZ3NvYy51dHMuZWR1LmF1KQorICogMi4wMDogMTEvOS85OTogTWFzc2l2ZSBvdmVyaGF1bCBhbmQgcG9ydCB0byBuZXcgU0JVUyBkcml2ZXIgaW50ZXJmYWNlcy4KKyAqCQkgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIDIuMDE6CisgKiAgICAgIDExLzA4LzAxOiBVc2UgbGlicmFyeSBjcmMzMiBmdW5jdGlvbnMgKE1hdHRfRG9tc2NoQGRlbGwuY29tKQorICoJCSAgCisgKi8KKworI3VuZGVmIERFQlVHX0RSSVZFUgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorCSJzdW5sYW5jZS5jOnYyLjAyIDI0L0F1Zy8wMyBNaWd1ZWwgZGUgSWNhemEgKG1pZ3VlbEBudWNsZWN1LnVuYW0ubXgpXG4iOworCitzdGF0aWMgY2hhciBsYW5jZXN0cltdID0gIkxBTkNFIjsKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+IC8qIFVzZWQgZm9yIHRoZSB0ZW1wb3JhbCBpbmV0IGVudHJpZXMgYW5kIHJvdXRpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogVXNlZCBieSB0aGUgY2hlY2tzdW0gcm91dGluZXMgKi8KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vYXV4aW8uaD4JCS8qIEZvciB0cGUtbGluay10ZXN0PyBzZXR0aW5nICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBEZWZpbmU6IDJeNCBUeCBidWZmZXJzIGFuZCAyXjQgUnggYnVmZmVycyAqLworI2lmbmRlZiBMQU5DRV9MT0dfVFhfQlVGRkVSUworI2RlZmluZSBMQU5DRV9MT0dfVFhfQlVGRkVSUyA0CisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTIDQKKyNlbmRpZgorCisjZGVmaW5lIExFX0NTUjAgMAorI2RlZmluZSBMRV9DU1IxIDEKKyNkZWZpbmUgTEVfQ1NSMiAyCisjZGVmaW5lIExFX0NTUjMgMworCisjZGVmaW5lIExFX01PX1BST00gICAgICAweDgwMDAgIC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisKKyNkZWZpbmUJTEVfQzBfRVJSCTB4ODAwMAkvKiBFcnJvcjogc2V0IGlmIEJBQiwgU1FFLCBNSVNTIG9yIE1FIGlzIHNldCAqLworI2RlZmluZQlMRV9DMF9CQUJMCTB4NDAwMAkvKiBCQUI6ICBCYWJibGU6IHR4IHRpbWVvdXQuICovCisjZGVmaW5lCUxFX0MwX0NFUlIJMHgyMDAwCS8qIFNRRTogIFNpZ25hbCBxdWFsaXR5IGVycm9yICovCisjZGVmaW5lCUxFX0MwX01JU1MJMHgxMDAwCS8qIE1JU1M6IE1pc3NlZCBhIHBhY2tldCAqLworI2RlZmluZQlMRV9DMF9NRVJSCTB4MDgwMAkvKiBNRTogICBNZW1vcnkgZXJyb3IgKi8KKyNkZWZpbmUJTEVfQzBfUklOVAkweDA0MDAJLyogUmVjZWl2ZWQgaW50ZXJydXB0ICovCisjZGVmaW5lCUxFX0MwX1RJTlQJMHgwMjAwCS8qIFRyYW5zbWl0dGVyIEludGVycnVwdCAqLworI2RlZmluZQlMRV9DMF9JRE9OCTB4MDEwMAkvKiBJRklOOiBJbml0IGZpbmlzaGVkLiAqLworI2RlZmluZQlMRV9DMF9JTlRSCTB4MDA4MAkvKiBJbnRlcnJ1cHQgb3IgZXJyb3IgKi8KKyNkZWZpbmUJTEVfQzBfSU5FQQkweDAwNDAJLyogSW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlMRV9DMF9SWE9OCTB4MDAyMAkvKiBSZWNlaXZlciBvbiAqLworI2RlZmluZQlMRV9DMF9UWE9OCTB4MDAxMAkvKiBUcmFuc21pdHRlciBvbiAqLworI2RlZmluZQlMRV9DMF9URE1ECTB4MDAwOAkvKiBUcmFuc21pdHRlciBkZW1hbmQgKi8KKyNkZWZpbmUJTEVfQzBfU1RPUAkweDAwMDQJLyogU3RvcCB0aGUgY2FyZCAqLworI2RlZmluZQlMRV9DMF9TVFJUCTB4MDAwMgkvKiBTdGFydCB0aGUgY2FyZCAqLworI2RlZmluZQlMRV9DMF9JTklUCTB4MDAwMQkvKiBJbml0IHRoZSBjYXJkICovCisKKyNkZWZpbmUJTEVfQzNfQlNXUAkweDQgICAgIC8qIFNXQVAgKi8KKyNkZWZpbmUJTEVfQzNfQUNPTgkweDIJLyogQUxFIENvbnRyb2wgKi8KKyNkZWZpbmUJTEVfQzNfQkNPTgkweDEJLyogQnl0ZSBjb250cm9sICovCisKKy8qIFJlY2VpdmUgbWVzc2FnZSBkZXNjcmlwdG9yIDEgKi8KKyNkZWZpbmUgTEVfUjFfT1dOICAgICAgIDB4ODAgICAgLyogV2hvIG93bnMgdGhlIGVudHJ5ICovCisjZGVmaW5lIExFX1IxX0VSUiAgICAgICAweDQwICAgIC8qIEVycm9yOiBpZiBGUkEsIE9GTCwgQ1JDIG9yIEJVRiBpcyBzZXQgKi8KKyNkZWZpbmUgTEVfUjFfRlJBICAgICAgIDB4MjAgICAgLyogRlJBOiBGcmFtZSBlcnJvciAqLworI2RlZmluZSBMRV9SMV9PRkwgICAgICAgMHgxMCAgICAvKiBPRkw6IEZyYW1lIG92ZXJmbG93ICovCisjZGVmaW5lIExFX1IxX0NSQyAgICAgICAweDA4ICAgIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBMRV9SMV9CVUYgICAgICAgMHgwNCAgICAvKiBCVUY6IEJ1ZmZlciBlcnJvciAqLworI2RlZmluZSBMRV9SMV9TT1AgICAgICAgMHgwMiAgICAvKiBTdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfUjFfRU9QICAgICAgIDB4MDEgICAgLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9SMV9QT0sgICAgICAgMHgwMyAgICAvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisjZGVmaW5lIExFX1QxX09XTiAgICAgICAweDgwICAgIC8qIExhbmNlIG93bnMgdGhlIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9FUlIgICAgICAgMHg0MCAgICAvKiBFcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIExFX1QxX0VNT1JFICAgICAweDEwICAgIC8qIEVycm9yOiBtb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FICAgICAgMHgwOCAgICAvKiBFcnJvcjogb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FREVGICAgICAgMHgwNCAgICAvKiBFcnJvcjogZGVmZXJyZWQgKi8KKyNkZWZpbmUgTEVfVDFfU09QICAgICAgIDB4MDIgICAgLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUCAgICAgICAweDAxICAgIC8qIEVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfUE9LCTB4MDMJLyogUGFja2V0IGlzIGNvbXBsZXRlOiBTT1AgKyBFT1AgKi8KKworI2RlZmluZSBMRV9UM19CVUYgICAgICAgMHg4MDAwICAvKiBCdWZmZXIgZXJyb3IgKi8KKyNkZWZpbmUgTEVfVDNfVUZMICAgICAgIDB4NDAwMCAgLyogRXJyb3IgdW5kZXJmbG93ICovCisjZGVmaW5lIExFX1QzX0xDT0wgICAgICAweDEwMDAgIC8qIEVycm9yIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIExFX1QzX0NMT1MgICAgICAweDA4MDAgIC8qIEVycm9yIGNhcnJpZXIgbG9zcyAqLworI2RlZmluZSBMRV9UM19SVFkgICAgICAgMHgwNDAwICAvKiBFcnJvciByZXRyeSAqLworI2RlZmluZSBMRV9UM19URFIgICAgICAgMHgwM2ZmICAvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IGNvdW50ZXIgKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUJCQkoMSA8PCAoTEFOQ0VfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCQkoVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUwkJKChMQU5DRV9MT0dfVFhfQlVGRkVSUykgPDwgMjkpCisjZGVmaW5lIFRYX05FWFQoX194KQkJCSgoKF9feCkrMSkgJiBUWF9SSU5HX01PRF9NQVNLKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJCShSWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBSWF9SSU5HX0xFTl9CSVRTCQkoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgUlhfTkVYVChfX3gpCQkJKCgoX194KSsxKSAmIFJYX1JJTkdfTU9EX01BU0spCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NAorI2RlZmluZSBSWF9CVUZGX1NJWkUgICAgICAgICAgICBQS1RfQlVGX1NaCisjZGVmaW5lIFRYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU1oKKworc3RydWN0IGxhbmNlX3J4X2Rlc2MgeworCXUxNglybWQwOwkJLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdTgJcm1kMV9iaXRzOwkvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwl1OAlybWQxX2hhZHI7CS8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwlzMTYJbGVuZ3RoOwkJLyogVGhpcyBsZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpIQorCQkJCSAqIEJ1ZmZlciBsZW5ndGgKKwkJCQkgKi8KKwl1MTYJbWJsZW5ndGg7CS8qIFRoaXMgaXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgKi8KK307CisKK3N0cnVjdCBsYW5jZV90eF9kZXNjIHsKKwl1MTYJdG1kMDsJCS8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXU4IAl0bWQxX2JpdHM7CS8qIGRlc2NyaXB0b3IgYml0cyAqLworCXU4IAl0bWQxX2hhZHI7CS8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwlzMTYgCWxlbmd0aDsJCS8qIExlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhICovCisJdTE2IAltaXNjOworfTsKKwkJCisvKiBUaGUgTEFOQ0UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vay4gKi8KKy8qIE9uIHRoZSBTcGFyYywgdGhpcyBibG9jayBzaG91bGQgYmUgb24gYSBETUEgcmVnaW9uICAgICAqLworc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgeworCXUxNgltb2RlOwkJLyogUHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworCXU4CXBoeXNfYWRkcls2XTsJLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXUzMglmaWx0ZXJbMl07CS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1MTYJcnhfcHRyOwkJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHIgKi8KKwl1MTYJcnhfbGVuOwkJLyogcmVjZWl2ZSBsZW4gYW5kIGhpZ2ggYWRkciAqLworCXUxNgl0eF9wdHI7CQkvKiB0cmFuc21pdCBkZXNjcmlwdG9yIGFkZHIgKi8KKwl1MTYJdHhfbGVuOwkJLyogdHJhbnNtaXQgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKyAgICAKKwkvKiBUaGUgVHggYW5kIFJ4IHJpbmcgZW50cmllcyBtdXN0IGFsaWduZWQgb24gOC1ieXRlIGJvdW5kYXJpZXMuICovCisJc3RydWN0IGxhbmNlX3J4X2Rlc2MgYnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbGFuY2VfdHhfZGVzYyBidHhfcmluZ1tUWF9SSU5HX1NJWkVdOworICAgIAorCXU4CXR4X2J1ZiBbVFhfUklOR19TSVpFXVtUWF9CVUZGX1NJWkVdOworCXU4CXBhZFsyXTsJCS8qIGFsaWduIHJ4X2J1ZiBmb3IgY29weV9hbmRfc3VtKCkuICovCisJdTgJcnhfYnVmIFtSWF9SSU5HX1NJWkVdW1JYX0JVRkZfU0laRV07Cit9OworCisjZGVmaW5lIGxpYmRlc2Nfb2Zmc2V0KHJ0LCBlbGVtKSBcCisoKF9fdTMyKSgoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKTApLT5ydFtlbGVtXSkpKSkpCisKKyNkZWZpbmUgbGliYnVmZl9vZmZzZXQocnQsIGVsZW0pIFwKKygoX191MzIpKCgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopMCktPnJ0W2VsZW1dWzBdKSkpKSkKKworc3RydWN0IGxhbmNlX3ByaXZhdGUgeworCXZvaWQgX19pb21lbQkqbHJlZ3M7CQkvKiBMYW5jZSBSQVAvUkRQIHJlZ3MuCQkqLworCXZvaWQgX19pb21lbQkqZHJlZ3M7CQkvKiBETUEgY29udHJvbGxlciByZWdzLgkJKi8KKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppbml0X2Jsb2NrX2lvbWVtOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppbml0X2Jsb2NrX21lbTsKKyAgICAKKwlzcGlubG9ja190CWxvY2s7CisKKwlpbnQJCXJ4X25ldywgdHhfbmV3OworCWludAkJcnhfb2xkLCB0eF9vbGQ7CisgICAgCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IHNidXNfZG1hICpsZWRtYTsJLyogSWYgc2V0IHRoaXMgcG9pbnRzIHRvIGxlZG1hCSovCisJY2hhcgkJdHBlOwkJLyogY2FibGUtc2VsZWN0aW9uIGlzIFRQRQkqLworCWNoYXIJCWF1dG9fc2VsZWN0OwkvKiBjYWJsZS1zZWxlY3Rpb24gYnkgY2FycmllcgkqLworCWNoYXIJCWJ1cnN0X3NpemVzOwkvKiBsZWRtYSBTQnVzIGJ1cnN0IHNpemVzCSovCisJY2hhcgkJcGlvX2J1ZmZlcjsJLyogaW5pdCBibG9jayBpbiBQSU8gc3BhY2U/CSovCisKKwl1bnNpZ25lZCBzaG9ydAlidXNtYXN0ZXJfcmVndmFsOworCisJdm9pZCAoKmluaXRfcmluZykoc3RydWN0IG5ldF9kZXZpY2UgKik7CisJdm9pZCAoKnJ4KShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl2b2lkICgqdHgpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCisJY2hhcgkgICAgICAgCSAgICAgICAqbmFtZTsKKwlkbWFfYWRkcl90CQlpbml0X2Jsb2NrX2R2bWE7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAqZGV2OwkJICAvKiBCYWNrcG9pbnRlcgkqLworCXN0cnVjdCBsYW5jZV9wcml2YXRlICAgKm5leHRfbW9kdWxlOworCXN0cnVjdCBzYnVzX2RldgkgICAgICAgKnNkZXY7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgbXVsdGljYXN0X3RpbWVyOworfTsKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKKwkJCWxwLT50eF9vbGQrVFhfUklOR19NT0RfTUFTSy1scC0+dHhfbmV3OlwKKwkJCWxwLT50eF9vbGQgLSBscC0+dHhfbmV3LTEpCisKKy8qIExhbmNlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgUkRQCQkweDAwVUwJCS8qIHJlZ2lzdGVyIGRhdGEgcG9ydAkJKi8KKyNkZWZpbmUgUkFQCQkweDAyVUwJCS8qIHJlZ2lzdGVyIGFkZHJlc3MgcG9ydAkqLworI2RlZmluZSBMQU5DRV9SRUdfU0laRQkweDA0VUwKKworI2RlZmluZSBTVE9QX0xBTkNFKF9fbHApIFwKK2RvIHsJdm9pZCBfX2lvbWVtICpfX2Jhc2UgPSAoX19scCktPmxyZWdzOyBcCisJc2J1c193cml0ZXcoTEVfQ1NSMCwJX19iYXNlICsgUkFQKTsgXAorCXNidXNfd3JpdGV3KExFX0MwX1NUT1AsCV9fYmFzZSArIFJEUCk7IFwKK30gd2hpbGUgKDApCisKK2ludCBzcGFyY19sYW5jZV9kZWJ1ZyA9IDI7CisKKy8qIFRoZSBMYW5jZSB1c2VzIDI0IGJpdCBhZGRyZXNzZXMgKi8KKy8qIE9uIHRoZSBTdW40YyB0aGUgRFZNQSB3aWxsIHByb3ZpZGUgdGhlIHJlbWFpbmluZyBieXRlcyBmb3IgdXMgKi8KKy8qIE9uIHRoZSBTdW40bSB3ZSBoYXZlIHRvIGluc3RydWN0IHRoZSBsZWRtYSB0byBwcm92aWRlIHRoZW0gICAgKi8KKy8qIEV2ZW4gd29yc2UsIG9uIHNjc2kvZXRoZXIgU0JVUyBjYXJkcywgdGhlIGluaXQgYmxvY2sgYW5kIHRoZQorICogdHJhbnNtaXQvcmVjZWl2ZSBidWZmZXJzIGFyZSBhZGRyZXNzZXMgYXMgb2Zmc2V0cyBmcm9tIGFic29sdXRlCisgKiB6ZXJvIG9uIHRoZSBsZWJ1ZmZlciBQSU8gYXJlYS4gLURhdmVNCisgKi8KKworI2RlZmluZSBMQU5DRV9BRERSKHgpICgobG9uZykoeCkgJiB+MHhmZjAwMDAwMCkKKworc3RhdGljIHN0cnVjdCBsYW5jZV9wcml2YXRlICpyb290X2xhbmNlX2RldjsKKworLyogTG9hZCB0aGUgQ1NSIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgbG9hZF9jc3JzKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwl1MzIgbGVwdHI7CisKKwlpZiAobHAtPnBpb19idWZmZXIpCisJCWxlcHRyID0gMDsKKwllbHNlCisJCWxlcHRyID0gTEFOQ0VfQUREUihscC0+aW5pdF9ibG9ja19kdm1hKTsKKworCXNidXNfd3JpdGV3KExFX0NTUjEsCQkgIGxwLT5scmVncyArIFJBUCk7CisJc2J1c193cml0ZXcobGVwdHIgJiAweGZmZmYsCSAgbHAtPmxyZWdzICsgUkRQKTsKKwlzYnVzX3dyaXRldyhMRV9DU1IyLAkJICBscC0+bHJlZ3MgKyBSQVApOworCXNidXNfd3JpdGV3KGxlcHRyID4+IDE2LAkgIGxwLT5scmVncyArIFJEUCk7CisJc2J1c193cml0ZXcoTEVfQ1NSMywJCSAgbHAtPmxyZWdzICsgUkFQKTsKKwlzYnVzX3dyaXRldyhscC0+YnVzbWFzdGVyX3JlZ3ZhbCwgbHAtPmxyZWdzICsgUkRQKTsKKworCS8qIFBvaW50IGJhY2sgdG8gY3NyMCAqLworCXNidXNfd3JpdGV3KExFX0NTUjAsIGxwLT5scmVncyArIFJBUCk7Cit9CisKKy8qIFNldHVwIHRoZSBMYW5jZSBSeCBhbmQgVHggcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZ19kdm1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJZG1hX2FkZHJfdCBhaWIgPSBscC0+aW5pdF9ibG9ja19kdm1hOworCV9fdTMyIGxlcHRyOworCWludCBpOworICAgIAorCS8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsZSBzZXR0aW5nIHVwIGhhcmR3YXJlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWxwLT5yeF9uZXcgPSBscC0+dHhfbmV3ID0gMDsKKwlscC0+cnhfb2xkID0gbHAtPnR4X29sZCA9IDA7CisKKwkvKiBDb3B5IHRoZSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBsYW5jZSBpbml0IGJsb2NrCisJICogTm90ZSB0aGF0IG9uIHRoZSBzcGFyYyB5b3UgbmVlZCB0byBzd2FwIHRoZSBldGhlcm5ldCBhZGRyZXNzLgorCSAqLworCWliLT5waHlzX2FkZHIgWzBdID0gZGV2LT5kZXZfYWRkciBbMV07CisJaWItPnBoeXNfYWRkciBbMV0gPSBkZXYtPmRldl9hZGRyIFswXTsKKwlpYi0+cGh5c19hZGRyIFsyXSA9IGRldi0+ZGV2X2FkZHIgWzNdOworCWliLT5waHlzX2FkZHIgWzNdID0gZGV2LT5kZXZfYWRkciBbMl07CisJaWItPnBoeXNfYWRkciBbNF0gPSBkZXYtPmRldl9hZGRyIFs1XTsKKwlpYi0+cGh5c19hZGRyIFs1XSA9IGRldi0+ZGV2X2FkZHIgWzRdOworCisJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPD0gVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbGVwdHIgPSBMQU5DRV9BRERSKGFpYiArIGxpYmJ1ZmZfb2Zmc2V0KHR4X2J1ZiwgaSkpOworCQlpYi0+YnR4X3JpbmcgW2ldLnRtZDAgICAgICA9IGxlcHRyOworCQlpYi0+YnR4X3JpbmcgW2ldLnRtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnR4X3JpbmcgW2ldLnRtZDFfYml0cyA9IDA7CisJCWliLT5idHhfcmluZyBbaV0ubGVuZ3RoICAgID0gMHhmMDAwOyAvKiBUaGUgb25lcyByZXF1aXJlZCBieSB0bWQyICovCisJCWliLT5idHhfcmluZyBbaV0ubWlzYyAgICAgID0gMDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgUnggcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxlcHRyID0gTEFOQ0VfQUREUihhaWIgKyBsaWJidWZmX29mZnNldChyeF9idWYsIGkpKTsKKworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDAgICAgICA9IGxlcHRyOworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJaWItPmJyeF9yaW5nIFtpXS5sZW5ndGggICAgPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQlpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoICA9IDA7CisJfQorCisJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisgICAgCisJLyogU2V0dXAgcnggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBMQU5DRV9BRERSKGFpYiArIGxpYmRlc2Nfb2Zmc2V0KGJyeF9yaW5nLCAwKSk7CisJaWItPnJ4X2xlbiA9IChMQU5DRV9MT0dfUlhfQlVGRkVSUyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOworCWliLT5yeF9wdHIgPSBsZXB0cjsKKyAgICAKKwkvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IExBTkNFX0FERFIoYWliICsgbGliZGVzY19vZmZzZXQoYnR4X3JpbmcsIDApKTsKKwlpYi0+dHhfbGVuID0gKExBTkNFX0xPR19UWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7CisJaWItPnR4X3B0ciA9IGxlcHRyOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3JpbmdfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCXUzMiBsZXB0cjsKKwlpbnQgaTsKKyAgICAKKwkvKiBMb2NrIG91dCBvdGhlciBwcm9jZXNzZXMgd2hpbGUgc2V0dGluZyB1cCBoYXJkd2FyZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlscC0+cnhfbmV3ID0gbHAtPnR4X25ldyA9IDA7CisJbHAtPnJ4X29sZCA9IGxwLT50eF9vbGQgPSAwOworCisJLyogQ29weSB0aGUgZXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgbGFuY2UgaW5pdCBibG9jaworCSAqIE5vdGUgdGhhdCBvbiB0aGUgc3BhcmMgeW91IG5lZWQgdG8gc3dhcCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4KKwkgKi8KKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzFdLCAmaWItPnBoeXNfYWRkclswXSk7CisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkclswXSwgJmliLT5waHlzX2FkZHJbMV0pOworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbM10sICZpYi0+cGh5c19hZGRyWzJdKTsKKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzJdLCAmaWItPnBoeXNfYWRkclszXSk7CisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkcls1XSwgJmliLT5waHlzX2FkZHJbNF0pOworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbNF0sICZpYi0+cGh5c19hZGRyWzVdKTsKKworCS8qIFNldHVwIHRoZSBUeCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxlcHRyID0gbGliYnVmZl9vZmZzZXQodHhfYnVmLCBpKTsKKwkJc2J1c193cml0ZXcobGVwdHIsCSZpYi0+YnR4X3JpbmcgW2ldLnRtZDApOworCQlzYnVzX3dyaXRlYihsZXB0ciA+PiAxNiwmaWItPmJ0eF9yaW5nIFtpXS50bWQxX2hhZHIpOworCQlzYnVzX3dyaXRlYigwLAkJJmliLT5idHhfcmluZyBbaV0udG1kMV9iaXRzKTsKKworCQkvKiBUaGUgb25lcyByZXF1aXJlZCBieSB0bWQyICovCisJCXNidXNfd3JpdGV3KDB4ZjAwMCwJJmliLT5idHhfcmluZyBbaV0ubGVuZ3RoKTsKKwkJc2J1c193cml0ZXcoMCwJCSZpYi0+YnR4X3JpbmcgW2ldLm1pc2MpOworCX0KKworCS8qIFNldHVwIHRoZSBSeCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbGVwdHIgPSBsaWJidWZmX29mZnNldChyeF9idWYsIGkpOworCisJCXNidXNfd3JpdGV3KGxlcHRyLAkmaWItPmJyeF9yaW5nIFtpXS5ybWQwKTsKKwkJc2J1c193cml0ZWIobGVwdHIgPj4gMTYsJmliLT5icnhfcmluZyBbaV0ucm1kMV9oYWRyKTsKKwkJc2J1c193cml0ZWIoTEVfUjFfT1dOLAkmaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMpOworCQlzYnVzX3dyaXRldygtUlhfQlVGRl9TSVpFfDB4ZjAwMCwKKwkJCSAgICAmaWItPmJyeF9yaW5nIFtpXS5sZW5ndGgpOworCQlzYnVzX3dyaXRldygwLAkJJmliLT5icnhfcmluZyBbaV0ubWJsZW5ndGgpOworCX0KKworCS8qIFNldHVwIHRoZSBpbml0aWFsaXphdGlvbiBibG9jayAqLworICAgIAorCS8qIFNldHVwIHJ4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gbGliZGVzY19vZmZzZXQoYnJ4X3JpbmcsIDApOworCXNidXNfd3JpdGV3KChMQU5DRV9MT0dfUlhfQlVGRkVSUyA8PCAxMykgfCAobGVwdHIgPj4gMTYpLAorCQkgICAgJmliLT5yeF9sZW4pOworCXNidXNfd3JpdGV3KGxlcHRyLCAmaWItPnJ4X3B0cik7CisgICAgCisJLyogU2V0dXAgdHggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBsaWJkZXNjX29mZnNldChidHhfcmluZywgMCk7CisJc2J1c193cml0ZXcoKExBTkNFX0xPR19UWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNiksCisJCSAgICAmaWItPnR4X2xlbik7CisJc2J1c193cml0ZXcobGVwdHIsICZpYi0+dHhfcHRyKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yZXN0YXJ0X2xlZG1hKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwl1MzIgY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCWlmICghKGNzciAmIERNQV9ITkRMX0VSUk9SKSkgeworCQkvKiBFLUNhY2hlIGRyYWluaW5nICovCisJCXdoaWxlIChzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpICYgRE1BX0ZJRk9fSVNEUkFJTikKKwkJCWJhcnJpZXIoKTsKKwl9CisKKwljc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCWNzciAmPSB+RE1BX0VfQlVSU1RTOworCWlmIChscC0+YnVyc3Rfc2l6ZXMgJiBETUFfQlVSU1QzMikKKwkJY3NyIHw9IERNQV9FX0JVUlNUMzI7CisJZWxzZQorCQljc3IgfD0gRE1BX0VfQlVSU1QxNjsKKworCWNzciB8PSAoRE1BX0RTQkxfUkRfRFJOIHwgRE1BX0RTQkxfV1JfSU5WIHwgRE1BX0ZJRk9fSU5WKTsKKworCWlmIChscC0+dHBlKQorCQljc3IgfD0gRE1BX0VOX0VORVRBVUk7CisJZWxzZQorCQljc3IgJj0gfkRNQV9FTl9FTkVUQVVJOworCXVkZWxheSgyMCk7CisJc2J1c193cml0ZWwoY3NyLCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl1ZGVsYXkoMjAwKTsKK30KKworc3RhdGljIGludCBpbml0X3Jlc3RhcnRfbGFuY2Uoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXUxNiByZWd2YWwgPSAwOworCWludCBpOworCisJaWYgKGxwLT5kcmVncykKKwkJaW5pdF9yZXN0YXJ0X2xlZG1hKGxwKTsKKworCXNidXNfd3JpdGV3KExFX0NTUjAsCWxwLT5scmVncyArIFJBUCk7CisJc2J1c193cml0ZXcoTEVfQzBfSU5JVCwJbHAtPmxyZWdzICsgUkRQKTsKKworCS8qIFdhaXQgZm9yIHRoZSBsYW5jZSB0byBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlyZWd2YWwgPSBzYnVzX3JlYWR3KGxwLT5scmVncyArIFJEUCk7CisKKwkJaWYgKHJlZ3ZhbCAmIChMRV9DMF9FUlIgfCBMRV9DMF9JRE9OKSkKKwkJCWJyZWFrOworCQliYXJyaWVyKCk7CisJfQorCWlmIChpID09IDEwMCB8fCAocmVndmFsICYgTEVfQzBfRVJSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkxBTkNFIHVub3BlbmVkIGFmdGVyICVkIHRpY2tzLCBjc3IwPSU0LjR4LlxuIiwKKwkJICAgICAgIGksIHJlZ3ZhbCk7CisJCWlmIChscC0+ZHJlZ3MpCisJCQlwcmludGsoImRjc3I9JTguOHhcbiIsIHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2xlYXIgSURPTiBieSB3cml0aW5nIGEgIjEiLCBlbmFibGUgaW50ZXJydXB0cyBhbmQgc3RhcnQgbGFuY2UgKi8KKwlzYnVzX3dyaXRldyhMRV9DMF9JRE9OLAkJCWxwLT5scmVncyArIFJEUCk7CisJc2J1c193cml0ZXcoTEVfQzBfSU5FQSB8IExFX0MwX1NUUlQsCWxwLT5scmVncyArIFJEUCk7CisKKwlpZiAobHAtPmRyZWdzKSB7CisJCXUzMiBjc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCisJCWNzciB8PSBETUFfSU5UX0VOQUI7CisJCXNidXNfd3JpdGVsKGNzciwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3J4X2R2bWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyAqcmQ7CisJdTggYml0czsKKwlpbnQgbGVuLCBlbnRyeSA9IGxwLT5yeF9uZXc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWZvciAocmQgPSAmaWItPmJyeF9yaW5nIFtlbnRyeV07CisJICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworCSAgICAgcmQgPSAmaWItPmJyeF9yaW5nIFtlbnRyeV0pIHsKKworCQkvKiBXZSBnb3QgYW4gaW5jb21wbGV0ZSBmcmFtZT8gKi8KKwkJaWYgKChiaXRzICYgTEVfUjFfUE9LKSAhPSBMRV9SMV9QT0spIHsKKwkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgaWYgKGJpdHMgJiBMRV9SMV9FUlIpIHsKKwkJCS8qIENvdW50IG9ubHkgdGhlIGVuZCBmcmFtZSBhcyBhIHJ4IGVycm9yLAorCQkJICogbm90IHRoZSBiZWdpbm5pbmcKKwkJCSAqLworCQkJaWYgKGJpdHMgJiBMRV9SMV9CVUYpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9DUkMpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX09GTCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0ZSQSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9FT1ApIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IChyZC0+bWJsZW5ndGggJiAweGZmZikgLSA0OworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXJkLT5tYmxlbmd0aCA9IDA7CisJCQkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJCQlscC0+cnhfbmV3ID0gUlhfTkVYVChlbnRyeSk7CisJCQkJcmV0dXJuOworCQkJfQorCSAgICAKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCXNrYl9wdXQoc2tiLCBsZW4pOwkJLyogbWFrZSByb29tICovCisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkJICh1bnNpZ25lZCBjaGFyICopJihpYi0+cnhfYnVmIFtlbnRyeV1bMF0pLAorCQkJCQkgbGVuLCAwKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKworCQkvKiBSZXR1cm4gdGhlIHBhY2tldCB0byB0aGUgcG9vbCAqLworCQlyZC0+bWJsZW5ndGggPSAwOworCQlyZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQllbnRyeSA9IFJYX05FWFQoZW50cnkpOworCX0KKworCWxwLT5yeF9uZXcgPSBlbnRyeTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfdHhfZHZtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCWludCBpLCBqOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlqID0gbHAtPnR4X29sZDsKKwlmb3IgKGkgPSBqOyBpICE9IGxwLT50eF9uZXc7IGkgPSBqKSB7CisJCXN0cnVjdCBsYW5jZV90eF9kZXNjICp0ZCA9ICZpYi0+YnR4X3JpbmcgW2ldOworCQl1OCBiaXRzID0gdGQtPnRtZDFfYml0czsKKworCQkvKiBJZiB3ZSBoaXQgYSBwYWNrZXQgbm90IG93bmVkIGJ5IHVzLCBzdG9wICovCisJCWlmIChiaXRzICYgTEVfVDFfT1dOKQorCQkJYnJlYWs7CisJCQorCQlpZiAoYml0cyAmIExFX1QxX0VSUikgeworCQkJdTE2IHN0YXR1cyA9IHRkLT5taXNjOworCSAgICAKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisJCQlpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChscC0+YXV0b19zZWxlY3QpIHsKKwkJCQkJbHAtPnRwZSA9IDEgLSBscC0+dHBlOworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBDYXJyaWVyIExvc3QsIHRyeWluZyAlc1xuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgbHAtPnRwZT8iVFBFIjoiQVVJIik7CisJCQkJCVNUT1BfTEFOQ0UobHApOworCQkJCQlscC0+aW5pdF9yaW5nKGRldik7CisJCQkJCWxvYWRfY3NycyhscCk7CisJCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKworCQkJLyogQnVmZmVyIGVycm9ycyBhbmQgdW5kZXJmbG93cyB0dXJuIG9mZiB0aGUKKwkJCSAqIHRyYW5zbWl0dGVyLCByZXN0YXJ0IHRoZSBhZGFwdGVyLgorCQkJICovCisJCQlpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCByZXN0YXJ0aW5nXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCVNUT1BfTEFOQ0UobHApOworCQkJCWxwLT5pbml0X3JpbmcoZGV2KTsKKwkJCQlsb2FkX2NzcnMobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoKGJpdHMgJiBMRV9UMV9QT0spID09IExFX1QxX1BPSykgeworCQkJLyoKKwkJCSAqIFNvIHdlIGRvbid0IGNvdW50IHRoZSBwYWNrZXQgbW9yZSB0aGFuIG9uY2UuCisJCQkgKi8KKwkJCXRkLT50bWQxX2JpdHMgPSBiaXRzICYgfihMRV9UMV9QT0spOworCisJCQkvKiBPbmUgY29sbGlzaW9uIGJlZm9yZSBwYWNrZXQgd2FzIHNlbnQuICovCisJCQlpZiAoYml0cyAmIExFX1QxX0VPTkUpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworCQkJLyogTW9yZSB0aGFuIG9uZSBjb2xsaXNpb24sIGJlIG9wdGltaXN0aWMuICovCisJCQlpZiAoYml0cyAmIExFX1QxX0VNT1JFKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDI7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkKKwkJaiA9IFRYX05FWFQoaik7CisJfQorCWxwLT50eF9vbGQgPSBqOworb3V0OgorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwgPiAwKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9waW9jb3B5X3RvX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkIF9faW9tZW0gKnBpb2J1ZiwgaW50IGxlbikKK3sKKwl1MTYgKnAxNiA9ICh1MTYgKikgc2tiLT5kYXRhOworCXUzMiAqcDMyOworCXU4ICpwODsKKwl2b2lkIF9faW9tZW0gKnBidWYgPSBwaW9idWY7CisKKwkvKiBXZSBrbm93IGhlcmUgdGhhdCBib3RoIHNyYyBhbmQgZGVzdCBhcmUgb24gYSAxNmJpdCBib3VuZGFyeS4gKi8KKwkqcDE2KysgPSBzYnVzX3JlYWR3KHBidWYpOworCXAzMiA9ICh1MzIgKikgcDE2OworCXBidWYgKz0gMjsKKwlsZW4gLT0gMjsKKworCXdoaWxlIChsZW4gPj0gNCkgeworCQkqcDMyKysgPSBzYnVzX3JlYWRsKHBidWYpOworCQlwYnVmICs9IDQ7CisJCWxlbiAtPSA0OworCX0KKwlwOCA9ICh1OCAqKSBwMzI7CisJaWYgKGxlbiA+PSAyKSB7CisJCXAxNiA9ICh1MTYgKikgcDMyOworCQkqcDE2KysgPSBzYnVzX3JlYWR3KHBidWYpOworCQlwYnVmICs9IDI7CisJCWxlbiAtPSAyOworCQlwOCA9ICh1OCAqKSBwMTY7CisJfQorCWlmIChsZW4gPj0gMSkKKwkJKnA4ID0gc2J1c19yZWFkYihwYnVmKTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfcnhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCXN0cnVjdCBsYW5jZV9yeF9kZXNjIF9faW9tZW0gKnJkOworCXVuc2lnbmVkIGNoYXIgYml0czsKKwlpbnQgbGVuLCBlbnRyeTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZW50cnkgPSBscC0+cnhfbmV3OworCWZvciAocmQgPSAmaWItPmJyeF9yaW5nIFtlbnRyeV07CisJICAgICAhKChiaXRzID0gc2J1c19yZWFkYigmcmQtPnJtZDFfYml0cykpICYgTEVfUjFfT1dOKTsKKwkgICAgIHJkID0gJmliLT5icnhfcmluZyBbZW50cnldKSB7CisKKwkJLyogV2UgZ290IGFuIGluY29tcGxldGUgZnJhbWU/ICovCisJCWlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CisJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChiaXRzICYgTEVfUjFfRVJSKSB7CisJCQkvKiBDb3VudCBvbmx5IHRoZSBlbmQgZnJhbWUgYXMgYSByeCBlcnJvciwKKwkJCSAqIG5vdCB0aGUgYmVnaW5uaW5nCisJCQkgKi8KKwkJCWlmIChiaXRzICYgTEVfUjFfQlVGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9PRkwpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9GUkEpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRU9QKSBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAoc2J1c19yZWFkdygmcmQtPm1ibGVuZ3RoKSAmIDB4ZmZmKSAtIDQ7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJc2J1c193cml0ZXcoMCwgJnJkLT5tYmxlbmd0aCk7CisJCQkJc2J1c193cml0ZWIoTEVfUjFfT1dOLCAmcmQtPnJtZDFfYml0cyk7CisJCQkJbHAtPnJ4X25ldyA9IFJYX05FWFQoZW50cnkpOworCQkJCXJldHVybjsKKwkJCX0KKwkgICAgCisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJc2tiX3B1dChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KKwkJCWxhbmNlX3Bpb2NvcHlfdG9fc2tiKHNrYiwgJihpYi0+cnhfYnVmW2VudHJ5XVswXSksIGxlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KKwkJc2J1c193cml0ZXcoMCwgJnJkLT5tYmxlbmd0aCk7CisJCXNidXNfd3JpdGViKExFX1IxX09XTiwgJnJkLT5ybWQxX2JpdHMpOworCQllbnRyeSA9IFJYX05FWFQoZW50cnkpOworCX0KKworCWxwLT5yeF9uZXcgPSBlbnRyeTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfdHhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCWludCBpLCBqOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlqID0gbHAtPnR4X29sZDsKKwlmb3IgKGkgPSBqOyBpICE9IGxwLT50eF9uZXc7IGkgPSBqKSB7CisJCXN0cnVjdCBsYW5jZV90eF9kZXNjIF9faW9tZW0gKnRkID0gJmliLT5idHhfcmluZyBbaV07CisJCXU4IGJpdHMgPSBzYnVzX3JlYWRiKCZ0ZC0+dG1kMV9iaXRzKTsKKworCQkvKiBJZiB3ZSBoaXQgYSBwYWNrZXQgbm90IG93bmVkIGJ5IHVzLCBzdG9wICovCisJCWlmIChiaXRzICYgTEVfVDFfT1dOKQorCQkJYnJlYWs7CisJCQorCQlpZiAoYml0cyAmIExFX1QxX0VSUikgeworCQkJdTE2IHN0YXR1cyA9IHNidXNfcmVhZHcoJnRkLT5taXNjKTsKKwkgICAgCisJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfUlRZKSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfTENPTCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0NMT1MpIHsKKwkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAobHAtPmF1dG9fc2VsZWN0KSB7CisJCQkJCWxwLT50cGUgPSAxIC0gbHAtPnRwZTsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQ2FycmllciBMb3N0LCB0cnlpbmcgJXNcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGxwLT50cGU/IlRQRSI6IkFVSSIpOworCQkJCQlTVE9QX0xBTkNFKGxwKTsKKwkJCQkJbHAtPmluaXRfcmluZyhkZXYpOworCQkJCQlsb2FkX2NzcnMobHApOworCQkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlCisJCQkgKiB0cmFuc21pdHRlciwgcmVzdGFydCB0aGUgYWRhcHRlci4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyAmIChMRV9UM19CVUZ8TEVfVDNfVUZMKSkgeworCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHg6IEVSUl9CVUZ8RVJSX1VGTCwgcmVzdGFydGluZ1xuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlTVE9QX0xBTkNFKGxwKTsKKwkJCQlscC0+aW5pdF9yaW5nKGRldik7CisJCQkJbG9hZF9jc3JzKGxwKTsKKwkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKChiaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJCS8qCisJCQkgKiBTbyB3ZSBkb24ndCBjb3VudCB0aGUgcGFja2V0IG1vcmUgdGhhbiBvbmNlLgorCQkJICovCisJCQlzYnVzX3dyaXRlYihiaXRzICYgfihMRV9UMV9QT0spLCAmdGQtPnRtZDFfYml0cyk7CisKKwkJCS8qIE9uZSBjb2xsaXNpb24gYmVmb3JlIHBhY2tldCB3YXMgc2VudC4gKi8KKwkJCWlmIChiaXRzICYgTEVfVDFfRU9ORSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCisJCQkvKiBNb3JlIHRoYW4gb25lIGNvbGxpc2lvbiwgYmUgb3B0aW1pc3RpYy4gKi8KKwkJCWlmIChiaXRzICYgTEVfVDFfRU1PUkUpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMjsKKworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQorCQlqID0gVFhfTkVYVChqKTsKKwl9CisJbHAtPnR4X29sZCA9IGo7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworb3V0OgorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5jZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNzcjA7CisgICAgCisJc2J1c193cml0ZXcoTEVfQ1NSMCwgbHAtPmxyZWdzICsgUkFQKTsKKwljc3IwID0gc2J1c19yZWFkdyhscC0+bHJlZ3MgKyBSRFApOworCisJLyogQWNrbm93bGVkZ2UgYWxsIHRoZSBpbnRlcnJ1cHQgc291cmNlcyBBU0FQICovCisJc2J1c193cml0ZXcoY3NyMCAmIChMRV9DMF9JTlRSIHwgTEVfQzBfVElOVCB8IExFX0MwX1JJTlQpLAorCQkgICAgbHAtPmxyZWdzICsgUkRQKTsKKyAgICAKKwlpZiAoKGNzcjAgJiBMRV9DMF9FUlIpICE9IDApIHsKKwkJLyogQ2xlYXIgdGhlIGVycm9yIGNvbmRpdGlvbiAqLworCQlzYnVzX3dyaXRldygoTEVfQzBfQkFCTCB8IExFX0MwX0VSUiB8IExFX0MwX01JU1MgfAorCQkJICAgICBMRV9DMF9DRVJSIHwgTEVfQzBfTUVSUiksCisJCQkgICAgbHAtPmxyZWdzICsgUkRQKTsKKwl9CisgICAgCisJaWYgKGNzcjAgJiBMRV9DMF9SSU5UKQorCQlscC0+cngoZGV2KTsKKyAgICAKKwlpZiAoY3NyMCAmIExFX0MwX1RJTlQpCisJCWxwLT50eChkZXYpOworICAgIAorCWlmIChjc3IwICYgTEVfQzBfQkFCTCkKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJaWYgKGNzcjAgJiBMRV9DMF9NSVNTKQorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwlpZiAoY3NyMCAmIExFX0MwX01FUlIpIHsKKwkJaWYgKGxwLT5kcmVncykgeworCQkJdTMyIGFkZHIgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9BRERSKTsKKworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IGVycm9yLCBzdGF0dXMgJTA0eCwgYWRkciAlMDZ4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgY3NyMCwgYWRkciAmIDB4ZmZmZmZmKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE1lbW9yeSBlcnJvciwgc3RhdHVzICUwNHhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKKwkJfQorCisJCXNidXNfd3JpdGV3KExFX0MwX1NUT1AsIGxwLT5scmVncyArIFJEUCk7CisKKwkJaWYgKGxwLT5kcmVncykgeworCQkJdTMyIGRtYV9jc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCisJCQlkbWFfY3NyIHw9IERNQV9GSUZPX0lOVjsKKwkJCXNidXNfd3JpdGVsKGRtYV9jc3IsIGxwLT5kcmVncyArIERNQV9DU1IpOworCQl9CisKKwkJbHAtPmluaXRfcmluZyhkZXYpOworCQlsb2FkX2NzcnMobHApOworCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJc2J1c193cml0ZXcoTEVfQzBfSU5FQSwgbHAtPmxyZWdzICsgUkRQKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogQnVpbGQgYSBmYWtlIG5ldHdvcmsgcGFja2V0IGFuZCBzZW5kIGl0IHRvIG91cnNlbHZlcy4gKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX2Zha2VfcGFja2V0KHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbHAtPmRldjsKKwlpbnQgaSwgZW50cnk7CisKKwllbnRyeSA9IGxwLT50eF9uZXcgJiBUWF9SSU5HX01PRF9NQVNLOworCWlmIChscC0+cGlvX2J1ZmZlcikgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCQl1MTYgX19pb21lbSAqcGFja2V0ID0gKHUxNiBfX2lvbWVtICopICYoaWItPnR4X2J1ZltlbnRyeV1bMF0pOworCQlzdHJ1Y3QgZXRoaGRyIF9faW9tZW0gKmV0aCA9IChzdHJ1Y3QgZXRoaGRyIF9faW9tZW0gKikgcGFja2V0OworCQlmb3IgKGkgPSAwOyBpIDwgKEVUSF9aTEVOIC8gc2l6ZW9mKHUxNikpOyBpKyspCisJCQlzYnVzX3dyaXRldygwLCAmcGFja2V0W2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkcltpXSwgJmV0aC0+aF9kZXN0W2ldKTsKKwkJCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sICZldGgtPmhfc291cmNlW2ldKTsKKwkJfQorCQlzYnVzX3dyaXRldygoLUVUSF9aTEVOKSB8IDB4ZjAwMCwgJmliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoKTsKKwkJc2J1c193cml0ZXcoMCwgJmliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyk7CisJCXNidXNfd3JpdGViKExFX1QxX1BPS3xMRV9UMV9PV04sICZpYi0+YnR4X3JpbmdbZW50cnldLnRtZDFfYml0cyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCQl1MTYgKnBhY2tldCA9ICh1MTYgKikgJihpYi0+dHhfYnVmW2VudHJ5XVswXSk7CisJCXN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIHBhY2tldDsKKwkJbWVtc2V0KHBhY2tldCwgMCwgRVRIX1pMRU4pOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlldGgtPmhfZGVzdFtpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJCQlldGgtPmhfc291cmNlW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJfQorCQlpYi0+YnR4X3JpbmdbZW50cnldLmxlbmd0aCA9ICgtRVRIX1pMRU4pIHwgMHhmMDAwOworCQlpYi0+YnR4X3JpbmdbZW50cnldLm1pc2MgPSAwOworCQlpYi0+YnR4X3JpbmdbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0t8TEVfVDFfT1dOKTsKKwl9CisJbHAtPnR4X25ldyA9IFRYX05FWFQoZW50cnkpOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqbGFzdF9kZXY7CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1cyA9IDA7CisKKwlsYXN0X2RldiA9IGRldjsKKworCVNUT1BfTEFOQ0UobHApOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbGFuY2VfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCWxhbmNlc3RyLCAodm9pZCAqKSBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTGFuY2U6IENhbid0IGdldCBpcnEgJXNcbiIsIF9faXJxX2l0b2EoZGV2LT5pcnEpKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogT24gdGhlIDRtLCBzZXR1cCB0aGUgbGVkbWEgdG8gcHJvdmlkZSB0aGUgdXBwZXIgYml0cyBmb3IgYnVmZmVycyAqLworCWlmIChscC0+ZHJlZ3MpIHsKKwkJdTMyIHJlZ3ZhbCA9IGxwLT5pbml0X2Jsb2NrX2R2bWEgJiAweGZmMDAwMDAwOworCisJCXNidXNfd3JpdGVsKHJlZ3ZhbCwgbHAtPmRyZWdzICsgRE1BX1RFU1QpOworCX0KKworCS8qIFNldCBtb2RlIGFuZCBjbGVhciBtdWx0aWNhc3QgZmlsdGVyIG9ubHkgYXQgZGV2aWNlIG9wZW4sCisJICogc28gdGhhdCBsYW5jZV9pbml0X3JpbmcoKSBjYWxsZWQgYXQgYW55IGVycm9yIHdpbGwgbm90CisJICogZm9yZ2V0IG11bHRpY2FzdCBmaWx0ZXJzLgorCSAqCisJICogQlRXIGl0IGlzIGNvbW1vbiBidWcgaW4gYWxsIGxhbmNlIGRyaXZlcnMhIC0tQU5LCisJICovCisJaWYgKGxwLT5waW9fYnVmZmVyKSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJCXNidXNfd3JpdGV3KDAsICZpYi0+bW9kZSk7CisJCXNidXNfd3JpdGVsKDAsICZpYi0+ZmlsdGVyWzBdKTsKKwkJc2J1c193cml0ZWwoMCwgJmliLT5maWx0ZXJbMV0pOworCX0gZWxzZSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwkJaWItPm1vZGUgPSAwOworCQlpYi0+ZmlsdGVyIFswXSA9IDA7CisJCWliLT5maWx0ZXIgWzFdID0gMDsKKwl9CisKKwlscC0+aW5pdF9yaW5nKGRldik7CisJbG9hZF9jc3JzKGxwKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCWlmICghc3RhdHVzICYmIGxwLT5hdXRvX3NlbGVjdCkgeworCQlidWlsZF9mYWtlX3BhY2tldChscCk7CisJCXNidXNfd3JpdGV3KExFX0MwX0lORUEgfCBMRV9DMF9URE1ELCBscC0+bHJlZ3MgKyBSRFApOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZscC0+bXVsdGljYXN0X3RpbWVyKTsKKworCVNUT1BfTEFOQ0UobHApOworCisJZnJlZV9pcnEoZGV2LT5pcnEsICh2b2lkICopIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzdGF0dXM7CisgICAgCisJU1RPUF9MQU5DRShscCk7CisKKwkvKiBPbiB0aGUgNG0sIHJlc2V0IHRoZSBkbWEgdG9vICovCisJaWYgKGxwLT5kcmVncykgeworCQl1MzIgY3NyLCBhZGRyOworCisJCXByaW50ayhLRVJOX0VSUiAicmVzZXR0aW5nIGxlZG1hXG4iKTsKKwkJY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwoY3NyIHwgRE1BX1JTVF9FTkVULCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJdWRlbGF5KDIwMCk7CisJCXNidXNfd3JpdGVsKGNzciAmIH5ETUFfUlNUX0VORVQsIGxwLT5kcmVncyArIERNQV9DU1IpOworCisJCWFkZHIgPSBscC0+aW5pdF9ibG9ja19kdm1hICYgMHhmZjAwMDAwMDsKKwkJc2J1c193cml0ZWwoYWRkciwgbHAtPmRyZWdzICsgRE1BX1RFU1QpOworCX0KKwlscC0+aW5pdF9yaW5nKGRldik7CisJbG9hZF9jc3JzKGxwKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3Bpb2NvcHlfZnJvbV9za2Iodm9pZCBfX2lvbWVtICpkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpwaW9idWYgPSBkZXN0OworCXUzMiAqcDMyOworCXUxNiAqcDE2OworCXU4ICpwODsKKworCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpc3JjICYgMHgzKSB7CisJY2FzZSAwOgorCQlwMzIgPSAodTMyICopIHNyYzsKKwkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQlzYnVzX3dyaXRlbCgqcDMyLCBwaW9idWYpOworCQkJcDMyKys7CisJCQlwaW9idWYgKz0gNDsKKwkJCWxlbiAtPSA0OworCQl9CisJCXNyYyA9IChjaGFyICopIHAzMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMzoKKwkJcDggPSAodTggKikgc3JjOworCQl3aGlsZSAobGVuID49IDQpIHsKKwkJCXUzMiB2YWw7CisKKwkJCXZhbCAgPSBwOFswXSA8PCAyNDsKKwkJCXZhbCB8PSBwOFsxXSA8PCAxNjsKKwkJCXZhbCB8PSBwOFsyXSA8PCA4OworCQkJdmFsIHw9IHA4WzNdOworCQkJc2J1c193cml0ZWwodmFsLCBwaW9idWYpOworCQkJcDggKz0gNDsKKwkJCXBpb2J1ZiArPSA0OworCQkJbGVuIC09IDQ7CisJCX0KKwkJc3JjID0gKGNoYXIgKikgcDg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcDE2ID0gKHUxNiAqKSBzcmM7CisJCXdoaWxlIChsZW4gPj0gNCkgeworCQkJdTMyIHZhbCA9IHAxNlswXTw8MTYgfCBwMTZbMV07CisJCQlzYnVzX3dyaXRlbCh2YWwsIHBpb2J1Zik7CisJCQlwMTYgKz0gMjsKKwkJCXBpb2J1ZiArPSA0OworCQkJbGVuIC09IDQ7CisJCX0KKwkJc3JjID0gKGNoYXIgKikgcDE2OworCQlicmVhazsKKwl9OworCWlmIChsZW4gPj0gMikgeworCQl1MTYgdmFsID0gc3JjWzBdIDw8IDggfCBzcmNbMV07CisJCXNidXNfd3JpdGV3KHZhbCwgcGlvYnVmKTsKKwkJc3JjICs9IDI7CisJCXBpb2J1ZiArPSAyOworCQlsZW4gLT0gMjsKKwl9CisJaWYgKGxlbiA+PSAxKQorCQlzYnVzX3dyaXRlYihzcmNbMF0sIHBpb2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3Bpb3plcm8odm9pZCBfX2lvbWVtICpkZXN0LCBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqcGlvYnVmID0gZGVzdDsKKworCWlmICgodW5zaWduZWQgbG9uZylwaW9idWYgJiAxKSB7CisJCXNidXNfd3JpdGViKDAsIHBpb2J1Zik7CisJCXBpb2J1ZiArPSAxOworCQlsZW4gLT0gMTsKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuOworCX0KKwlpZiAobGVuID09IDEpIHsKKwkJc2J1c193cml0ZWIoMCwgcGlvYnVmKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHVuc2lnbmVkIGxvbmcpcGlvYnVmICYgMikgeworCQlzYnVzX3dyaXRldygwLCBwaW9idWYpOworCQlwaW9idWYgKz0gMjsKKwkJbGVuIC09IDI7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybjsKKwl9CisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCXNidXNfd3JpdGVsKDAsIHBpb2J1Zik7CisJCXBpb2J1ZiArPSA0OworCQlsZW4gLT0gNDsKKwl9CisJaWYgKGxlbiA+PSAyKSB7CisJCXNidXNfd3JpdGV3KDAsIHBpb2J1Zik7CisJCXBpb2J1ZiArPSAyOworCQlsZW4gLT0gMjsKKwl9CisJaWYgKGxlbiA+PSAxKQorCQlzYnVzX3dyaXRlYigwLCBwaW9idWYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHNidXNfcmVhZHcobHAtPmxyZWdzICsgUkRQKSk7CisJbGFuY2VfcmVzZXQoZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5LCBza2JsZW4sIGxlbjsKKworCXNrYmxlbiA9IHNrYi0+bGVuOworCisJbGVuID0gKHNrYmxlbiA8PSBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYmxlbjsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwllbnRyeSA9IGxwLT50eF9uZXcgJiBUWF9SSU5HX01PRF9NQVNLOworCWlmIChscC0+cGlvX2J1ZmZlcikgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCQlzYnVzX3dyaXRldygoLWxlbikgfCAweGYwMDAsICZpYi0+YnR4X3JpbmdbZW50cnldLmxlbmd0aCk7CisJCXNidXNfd3JpdGV3KDAsICZpYi0+YnR4X3JpbmdbZW50cnldLm1pc2MpOworCQlsYW5jZV9waW9jb3B5X2Zyb21fc2tiKCZpYi0+dHhfYnVmW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworCQlpZiAobGVuICE9IHNrYmxlbikKKwkJCWxhbmNlX3Bpb3plcm8oJmliLT50eF9idWZbZW50cnldW3NrYmxlbl0sIGxlbiAtIHNrYmxlbik7CisJCXNidXNfd3JpdGViKExFX1QxX1BPSyB8IExFX1QxX09XTiwgJmliLT5idHhfcmluZ1tlbnRyeV0udG1kMV9iaXRzKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJCWliLT5idHhfcmluZyBbZW50cnldLmxlbmd0aCA9ICgtbGVuKSB8IDB4ZjAwMDsKKwkJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7CisJCW1lbWNweSgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKwkJaWYgKGxlbiAhPSBza2JsZW4pCisJCQltZW1zZXQoKGNoYXIgKikgJmliLT50eF9idWYgW2VudHJ5XVtza2JsZW5dLCAwLCBsZW4gLSBza2JsZW4pOworCQlpYi0+YnR4X3JpbmcgW2VudHJ5XS50bWQxX2JpdHMgPSAoTEVfVDFfUE9LIHwgTEVfVDFfT1dOKTsKKwl9CisKKwlscC0+dHhfbmV3ID0gVFhfTkVYVChlbnRyeSk7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwgPD0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogS2ljayB0aGUgbGFuY2U6IHRyYW5zbWl0IG5vdyAqLworCXNidXNfd3JpdGV3KExFX0MwX0lORUEgfCBMRV9DMF9URE1ELCBscC0+bHJlZ3MgKyBSRFApOworCisJLyogUmVhZCBiYWNrIENTUiB0byBpbnZhbGlkYXRlIHRoZSBFLUNhY2hlLgorCSAqIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERNQV9EU0JMX1dSX0lOViBpcyBzZXQuCisJICovCisJaWYgKGxwLT5kcmVncykKKwkJc2J1c19yZWFkdyhscC0+bHJlZ3MgKyBSRFApOworCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiB0YWtlbiBmcm9tIHRoZSBkZXBjYSBkcml2ZXIgKi8KK3N0YXRpYyB2b2lkIGxhbmNlX2xvYWRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCXUzMiB2YWw7CisJCisJLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQl2YWwgPSB+MDsKKwllbHNlCisJCXZhbCA9IDA7CisKKwlpZiAobHAtPnBpb19idWZmZXIpIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwkJc2J1c193cml0ZWwodmFsLCAmaWItPmZpbHRlclswXSk7CisJCXNidXNfd3JpdGVsKHZhbCwgJmliLT5maWx0ZXJbMV0pOworCX0gZWxzZSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwkJaWItPmZpbHRlciBbMF0gPSB2YWw7CisJCWliLT5maWx0ZXIgWzFdID0gdmFsOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQlyZXR1cm47CisJCisJLyogQWRkIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQlkbWkgICA9IGRtaS0+bmV4dDsKKworCQkvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KKwkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQljb250aW51ZTsKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJY3JjID0gY3JjID4+IDI2OworCQlpZiAobHAtPnBpb19idWZmZXIpIHsKKwkJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJCQl1MTYgX19pb21lbSAqbWNhc3RfdGFibGUgPSAodTE2IF9faW9tZW0gKikgJmliLT5maWx0ZXI7CisJCQl1MTYgdG1wID0gc2J1c19yZWFkdygmbWNhc3RfdGFibGVbY3JjPj40XSk7CisJCQl0bXAgfD0gMSA8PCAoY3JjICYgMHhmKTsKKwkJCXNidXNfd3JpdGV3KHRtcCwgJm1jYXN0X3RhYmxlW2NyYz4+NF0pOworCQl9IGVsc2UgeworCQkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCQkJdTE2ICptY2FzdF90YWJsZSA9ICh1MTYgKikgJmliLT5maWx0ZXI7CisJCQltY2FzdF90YWJsZSBbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYl9tZW0gPSBscC0+aW5pdF9ibG9ja19tZW07CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWJfaW9tZW0gPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwl1MTYgbW9kZTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKKwlpZiAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KSB7CisJCW1vZF90aW1lcigmbHAtPm11bHRpY2FzdF90aW1lciwgamlmZmllcyArIDQpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybjsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlTVE9QX0xBTkNFKGxwKTsKKwlscC0+aW5pdF9yaW5nKGRldik7CisKKwlpZiAobHAtPnBpb19idWZmZXIpCisJCW1vZGUgPSBzYnVzX3JlYWR3KCZpYl9pb21lbS0+bW9kZSk7CisJZWxzZQorCQltb2RlID0gaWJfbWVtLT5tb2RlOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbW9kZSB8PSBMRV9NT19QUk9NOworCQlpZiAobHAtPnBpb19idWZmZXIpCisJCQlzYnVzX3dyaXRldyhtb2RlLCAmaWJfaW9tZW0tPm1vZGUpOworCQllbHNlCisJCQlpYl9tZW0tPm1vZGUgPSBtb2RlOworCX0gZWxzZSB7CisJCW1vZGUgJj0gfkxFX01PX1BST007CisJCWlmIChscC0+cGlvX2J1ZmZlcikKKwkJCXNidXNfd3JpdGV3KG1vZGUsICZpYl9pb21lbS0+bW9kZSk7CisJCWVsc2UKKwkJCWliX21lbS0+bW9kZSA9IG1vZGU7CisJCWxhbmNlX2xvYWRfbXVsdGljYXN0KGRldik7CisJfQorCWxvYWRfY3NycyhscCk7CisJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3RfcmV0cnkodW5zaWduZWQgbG9uZyBfb3BhcXVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgX29wYXF1ZTsKKworCWxhbmNlX3NldF9tdWx0aWNhc3QoZGV2KTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfZnJlZV9od3Jlc291cmNlcyhzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJaWYgKGxwLT5scmVncykKKwkJc2J1c19pb3VubWFwKGxwLT5scmVncywgTEFOQ0VfUkVHX1NJWkUpOworCWlmIChscC0+aW5pdF9ibG9ja19pb21lbSkgeworCQlzYnVzX2lvdW5tYXAobHAtPmluaXRfYmxvY2tfaW9tZW0sCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykpOworCX0gZWxzZSBpZiAobHAtPmluaXRfYmxvY2tfbWVtKSB7CisJCXNidXNfZnJlZV9jb25zaXN0ZW50KGxwLT5zZGV2LAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwKKwkJCQkgICAgIGxwLT5pbml0X2Jsb2NrX21lbSwKKwkJCQkgICAgIGxwLT5pbml0X2Jsb2NrX2R2bWEpOworCX0KK30KKworLyogRXRodG9vbCBzdXBwb3J0Li4uICovCitzdGF0aWMgdm9pZCBzcGFyY19sYW5jZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VubGFuY2UiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgIjIuMDIiKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiU0JVUzolZCIsCisJCWxwLT5zZGV2LT5zbG90KTsKK30KKworc3RhdGljIHUzMiBzcGFyY19sYW5jZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFdlIHJlYWxseSBkbyBub3Qga2VlcCB0cmFjayBvZiB0aGlzLCBidXQgdGhpcworCSAqIGlzIGJldHRlciB0aGFuIG5vdCByZXBvcnRpbmcgYW55dGhpbmcgYXQgYWxsLgorCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNwYXJjX2xhbmNlX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBzcGFyY19sYW5jZV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gc3BhcmNfbGFuY2VfZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwKKwkJCQkgICBzdHJ1Y3Qgc2J1c19kbWEgKmxlZG1hLAorCQkJCSAgIHN0cnVjdCBzYnVzX2RldiAqbGVidWZmZXIpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscDsKKwlpbnQgICAgaTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSkgKyA4KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbWVtc2V0KGxwLCAwLCBzaXplb2YoKmxwKSk7CisKKwlpZiAoc3BhcmNfbGFuY2VfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJLyogQ29weSB0aGUgSURQUk9NIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUsIGxhdGVyIHdlCisJICogd2lsbCBjb3B5IHRoZSBhZGRyZXNzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHRoZSBsYW5jZQorCSAqIGluaXRpYWxpemF0aW9uIGJsb2NrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpZHByb20tPmlkX2V0aGFkZHJbaV07CisKKwkvKiBHZXQgdGhlIElPIHJlZ2lvbiAqLworCWxwLT5scmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJIExBTkNFX1JFR19TSVpFLCBsYW5jZXN0cik7CisJaWYgKCFscC0+bHJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogQ2Fubm90IG1hcCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWxwLT5zZGV2ID0gc2RldjsKKwlpZiAobGVidWZmZXIpIHsKKwkJLyogc2FuaXR5IGNoZWNrICovCisJCWlmIChsZWJ1ZmZlci0+cmVzb3VyY2VbMF0uc3RhcnQgJiA3KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBFUlJPUjogUnggYW5kIFR4IHJpbmdzIG5vdCBvbiBldmVuIGJvdW5kYXJ5LlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbHAtPmluaXRfYmxvY2tfaW9tZW0gPQorCQkJc2J1c19pb3JlbWFwKCZsZWJ1ZmZlci0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spLCAibGVidWZmZXIiKTsKKwkJaWYgKCFscC0+aW5pdF9ibG9ja19pb21lbSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogQ2Fubm90IG1hcCBQSU8gYnVmZmVyLlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbHAtPmluaXRfYmxvY2tfZHZtYSA9IDA7CisJCWxwLT5waW9fYnVmZmVyID0gMTsKKwkJbHAtPmluaXRfcmluZyA9IGxhbmNlX2luaXRfcmluZ19waW87CisJCWxwLT5yeCA9IGxhbmNlX3J4X3BpbzsKKwkJbHAtPnR4ID0gbGFuY2VfdHhfcGlvOworCX0gZWxzZSB7CisJCWxwLT5pbml0X2Jsb2NrX21lbSA9CisJCQlzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2Rldiwgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwKKwkJCQkJICAgICAgJmxwLT5pbml0X2Jsb2NrX2R2bWEpOworCQlpZiAoIWxwLT5pbml0X2Jsb2NrX21lbSB8fCBscC0+aW5pdF9ibG9ja19kdm1hID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCBhbGxvY2F0ZSBjb25zaXN0ZW50IERNQSBtZW1vcnkuXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlscC0+cGlvX2J1ZmZlciA9IDA7CisJCWxwLT5pbml0X3JpbmcgPSBsYW5jZV9pbml0X3JpbmdfZHZtYTsKKwkJbHAtPnJ4ID0gbGFuY2VfcnhfZHZtYTsKKwkJbHAtPnR4ID0gbGFuY2VfdHhfZHZtYTsKKwl9CisJbHAtPmJ1c21hc3Rlcl9yZWd2YWwgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLAorCQkJCQkJICAiYnVzbWFzdGVyLXJlZ3ZhbCIsCisJCQkJCQkgIChMRV9DM19CU1dQIHwgTEVfQzNfQUNPTiB8CisJCQkJCQkgICBMRV9DM19CQ09OKSk7CisKKwlscC0+bmFtZSA9IGxhbmNlc3RyOworCWxwLT5sZWRtYSA9IGxlZG1hOworCisJbHAtPmJ1cnN0X3NpemVzID0gMDsKKwlpZiAobHAtPmxlZG1hKSB7CisJCWNoYXIgcHJvcFs2XTsKKwkJdW5zaWduZWQgaW50IHNibWFzazsKKwkJdTMyIGNzcjsKKworCQkvKiBGaW5kIGJ1cnN0LXNpemUgcHJvcGVydHkgZm9yIGxlZG1hICovCisJCWxwLT5idXJzdF9zaXplcyA9IHByb21fZ2V0aW50ZGVmYXVsdChsZWRtYS0+c2Rldi0+cHJvbV9ub2RlLAorCQkJCQkJICAgICAiYnVyc3Qtc2l6ZXMiLCAwKTsKKworCQkvKiBsZWRtYSBtYXkgYmUgY2FwYWJsZSBvZiBmYXN0IGJ1cnN0cywgYnV0IHNidXMgbWF5IG5vdC4gKi8KKwkJc2JtYXNrID0gcHJvbV9nZXRpbnRkZWZhdWx0KGxlZG1hLT5zZGV2LT5idXMtPnByb21fbm9kZSwKKwkJCQkJICAgICJidXJzdC1zaXplcyIsIERNQV9CVVJTVEJJVFMpOworCQlscC0+YnVyc3Rfc2l6ZXMgJj0gc2JtYXNrOworCisJCS8qIEdldCB0aGUgY2FibGUtc2VsZWN0aW9uIHByb3BlcnR5ICovCisJCW1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworCQlwcm9tX2dldHN0cmluZyhsZWRtYS0+c2Rldi0+cHJvbV9ub2RlLCAiY2FibGUtc2VsZWN0aW9uIiwKKwkJCSAgICAgICBwcm9wLCBzaXplb2YocHJvcCkpOworCQlpZiAocHJvcFswXSA9PSAwKSB7CisJCQlpbnQgdG9wbmQsIG5kOworCisJCQlwcmludGsoS0VSTl9JTkZPICJTdW5MYW5jZTogdXNpbmcgYXV0by1jYXJyaWVyLWRldGVjdGlvbi5cbiIpOworCisJCQkvKiBJcyB0aGlzIGZvdW5kIGF0IC9vcHRpb25zIC5hdHRyaWJ1dGVzIGluIGFsbAorCQkJICogUHJvbSB2ZXJzaW9ucz8gWFhYCisJCQkgKi8KKwkJCXRvcG5kID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7CisKKwkJCW5kID0gcHJvbV9zZWFyY2hzaWJsaW5ncyh0b3BuZCwgIm9wdGlvbnMiKTsKKwkJCWlmICghbmQpCisJCQkJZ290byBub19saW5rX3Rlc3Q7CisKKwkJCWlmICghcHJvbV9ub2RlX2hhc19wcm9wZXJ0eShuZCwgInRwZS1saW5rLXRlc3Q/IikpCisJCQkJZ290byBub19saW5rX3Rlc3Q7CisKKwkJCW1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworCQkJcHJvbV9nZXRzdHJpbmcobmQsICJ0cGUtbGluay10ZXN0PyIsIHByb3AsCisJCQkJICAgICAgIHNpemVvZihwcm9wKSk7CisKKwkJCWlmIChzdHJjbXAocHJvcCwgInRydWUiKSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiU3VuTGFuY2U6IHdhcm5pbmc6IG92ZXJyaWRpbmcgb3B0aW9uICIKKwkJCQkgICAgICAgIid0cGUtbGluay10ZXN0PydcbiIpOworCQkJCXByaW50ayhLRVJOX05PVElDRSAiU3VuTGFuY2U6IHdhcm5pbmc6IG1haWwgYW55IHByb2JsZW1zICIKKwkJCQkgICAgICAgInRvIGVjZEBza3luZXQuYmVcbiIpOworCQkJCWF1eGlvX3NldF9sdGUoQVVYSU9fTFRFX09OKTsKKwkJCX0KK25vX2xpbmtfdGVzdDoKKwkJCWxwLT5hdXRvX3NlbGVjdCA9IDE7CisJCQlscC0+dHBlID0gMDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHByb3AsICJhdWkiKSkgeworCQkJbHAtPmF1dG9fc2VsZWN0ID0gMDsKKwkJCWxwLT50cGUgPSAwOworCQl9IGVsc2UgeworCQkJbHAtPmF1dG9fc2VsZWN0ID0gMDsKKwkJCWxwLT50cGUgPSAxOworCQl9CisKKwkJbHAtPmRyZWdzID0gbGVkbWEtPnJlZ3M7CisKKwkJLyogUmVzZXQgbGVkbWEgKi8KKwkJY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwoY3NyIHwgRE1BX1JTVF9FTkVULCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJdWRlbGF5KDIwMCk7CisJCXNidXNfd3JpdGVsKGNzciAmIH5ETUFfUlNUX0VORVQsIGxwLT5kcmVncyArIERNQV9DU1IpOworCX0gZWxzZQorCQlscC0+ZHJlZ3MgPSBOVUxMOworCisJbHAtPmRldiA9IGRldjsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuID0gJmxhbmNlX29wZW47CisJZGV2LT5zdG9wID0gJmxhbmNlX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmxhbmNlX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gJmxhbmNlX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT5nZXRfc3RhdHMgPSAmbGFuY2VfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmxhbmNlX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5ldGh0b29sX29wcyA9ICZzcGFyY19sYW5jZV9ldGh0b29sX29wczsKKworCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKworCWRldi0+ZG1hID0gMDsKKworCS8qIFdlIGNhbm5vdCBzbGVlcCBpZiB0aGUgY2hpcCBpcyBidXN5IGR1cmluZyBhCisJICogbXVsdGljYXN0IGxpc3QgdXBkYXRlIGV2ZW50LCBiZWNhdXNlIHN1Y2ggZXZlbnRzCisJICogY2FuIG9jY3VyIGZyb20gaW50ZXJydXB0cyAoZXguIElQdjYpLiAgU28gd2UKKwkgKiB1c2UgYSB0aW1lciB0byB0cnkgYWdhaW4gbGF0ZXIgd2hlbiBuZWNlc3NhcnkuIC1EYXZlTQorCSAqLworCWluaXRfdGltZXIoJmxwLT5tdWx0aWNhc3RfdGltZXIpOworCWxwLT5tdWx0aWNhc3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJbHAtPm11bHRpY2FzdF90aW1lci5mdW5jdGlvbiA9ICZsYW5jZV9zZXRfbXVsdGljYXN0X3JldHJ5OworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWxwLT5uZXh0X21vZHVsZSA9IHJvb3RfbGFuY2VfZGV2OworCXJvb3RfbGFuY2VfZGV2ID0gbHA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTEFOQ0UgIiwgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sCisJCSAgICAgICBpID09IDUgPyAnICc6ICc6Jyk7CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJbGFuY2VfZnJlZV9od3Jlc291cmNlcyhscCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogT24gNG0sIGZpbmQgdGhlIGFzc29jaWF0ZWQgZG1hIGZvciB0aGUgbGFuY2UgY2hpcCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2J1c19kbWEgKmZpbmRfbGVkbWEoc3RydWN0IHNidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBzYnVzX2RtYSAqcDsKKworCWZvcl9lYWNoX2R2bWEocCkgeworCQlpZiAocC0+c2RldiA9PSBzZGV2KQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX1NVTjQKKworI2luY2x1ZGUgPGFzbS9zdW40cGFkZHIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KKworLyogRmluZCBhbGwgdGhlIGxhbmNlIGNhcmRzIG9uIHRoZSBzeXN0ZW0gYW5kIGluaXRpYWxpemUgdGhlbSAqLworc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfcHJvYmUodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHNidXNfZGV2IHNkZXY7CisJc3RhdGljIGludCBjYWxsZWQ7CisKKwlyb290X2xhbmNlX2RldiA9IE5VTEw7CisKKwlpZiAoY2FsbGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYWxsZWQrKzsKKworCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONHxTTV80XzMzMCkpIHx8CisJICAgIChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40fFNNXzRfNDcwKSkpIHsKKwkJbWVtc2V0KCZzZGV2LCAwLCBzaXplb2Yoc2RldikpOworCQlzZGV2LnJlZ19hZGRyc1swXS5waHlzX2FkZHIgPSBzdW40X2V0aF9waHlzYWRkcjsKKwkJc2Rldi5pcnFzWzBdID0gNjsKKwkJcmV0dXJuIHNwYXJjX2xhbmNlX2luaXQoJnNkZXYsIE5VTEwsIE5VTEwpOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2Vsc2UgLyogIUNPTkZJR19TVU40ICovCisKKy8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwYXJjX2xhbmNlX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2J1c19kbWEgKmxlZG1hID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisJcm9vdF9sYW5jZV9kZXYgPSBOVUxMOworCisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FsbGVkKys7CisKKwlmb3JfZWFjaF9zYnVzIChidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldiAoc2RldiwgYnVzKSB7CisJCQlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgImxlIikgPT0gMCkgeworCQkJCWNhcmRzKys7CisJCQkJaWYgKCh2ID0gc3BhcmNfbGFuY2VfaW5pdChzZGV2LCBOVUxMLCBOVUxMKSkpCisJCQkJCXJldHVybiB2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJsZWRtYSIpID09IDApIHsKKwkJCQljYXJkcysrOworCQkJCWxlZG1hID0gZmluZF9sZWRtYShzZGV2KTsKKwkJCQlpZiAoKHYgPSBzcGFyY19sYW5jZV9pbml0KHNkZXYtPmNoaWxkLAorCQkJCQkJCSAgbGVkbWEsIE5VTEwpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgImxlYnVmZmVyIikgPT0gMCl7CisJCQkJY2FyZHMrKzsKKwkJCQlpZiAoKHYgPSBzcGFyY19sYW5jZV9pbml0KHNkZXYtPmNoaWxkLAorCQkJCQkJCSAgTlVMTCwgc2RldikpKQorCQkJCQlyZXR1cm4gdjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSAvKiBmb3IgZWFjaCBzYnVzZGV2ICovCisJfSAvKiBmb3IgZWFjaCBzYnVzICovCisJaWYgKCFjYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogIUNPTkZJR19TVU40ICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGFyY19sYW5jZV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCisJd2hpbGUgKHJvb3RfbGFuY2VfZGV2KSB7CisJCWxwID0gcm9vdF9sYW5jZV9kZXYtPm5leHRfbW9kdWxlOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KHJvb3RfbGFuY2VfZGV2LT5kZXYpOworCQlsYW5jZV9mcmVlX2h3cmVzb3VyY2VzKHJvb3RfbGFuY2VfZGV2KTsKKwkJZnJlZV9uZXRkZXYocm9vdF9sYW5jZV9kZXYtPmRldik7CisJCXJvb3RfbGFuY2VfZGV2ID0gbHA7CisJfQorfQorCittb2R1bGVfaW5pdChzcGFyY19sYW5jZV9wcm9iZSk7Cittb2R1bGVfZXhpdChzcGFyY19sYW5jZV9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnFlLmMgYi9kcml2ZXJzL25ldC9zdW5xZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWYxYjgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VucWUuYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8qICRJZDogc3VucWUuYyx2IDEuNTUgMjAwMi8wMS8xNSAwNjo0ODo1NSBkYXZlbSBFeHAgJAorICogc3VucWUuYzogU3BhcmMgUXVhZEV0aGVybmV0IDEwYmFzZVQgU0JVUyBjYXJkIGRyaXZlci4KKyAqICAgICAgICAgIE9uY2UgYWdhaW4gSSBhbSBvdXQgdG8gcHJvdmUgdGhhdCBldmVyeSBldGhlcm5ldAorICogICAgICAgICAgY29udHJvbGxlciBvdXQgdGhlcmUgY2FuIGJlIG1vc3QgZWZmaWNpZW50bHkgcHJvZ3JhbW1lZAorICogICAgICAgICAgaWYgeW91IG1ha2UgaXQgbG9vayBsaWtlIGEgTEFOQ0UuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorICAgICAgICAic3VucWUuYzp2My4wIDgvMjQvMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vYXV4aW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInN1bnFlLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc3VucWVjICpyb290X3FlY19kZXY7CisKK3N0YXRpYyB2b2lkIHFlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgUUVDX1JFU0VUX1RSSUVTIDIwMAorCitzdGF0aWMgaW5saW5lIGludCBxZWNfZ2xvYmFsX3Jlc2V0KHZvaWQgX19pb21lbSAqZ3JlZ3MpCit7CisJaW50IHRyaWVzID0gUUVDX1JFU0VUX1RSSUVTOworCisJc2J1c193cml0ZWwoR0xPQl9DVFJMX1JFU0VULCBncmVncyArIEdMT0JfQ1RSTCk7CisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJdTMyIHRtcCA9IHNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX0NUUkwpOworCQlpZiAodG1wICYgR0xPQl9DVFJMX1JFU0VUKSB7CisJCQl1ZGVsYXkoMjApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICh0cmllcykKKwkJcmV0dXJuIDA7CisJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IEFJRUVFIGNhbm5vdCByZXNldCB0aGUgUUVDIVxuIik7CisJcmV0dXJuIC0xOworfQorCisjZGVmaW5lIE1BQ0VfUkVTRVRfUkVUUklFUyAyMDAKKyNkZWZpbmUgUUVfUkVTRVRfUkVUUklFUyAgIDIwMAorCitzdGF0aWMgaW5saW5lIGludCBxZV9zdG9wKHN0cnVjdCBzdW5xZSAqcWVwKQoreworCXZvaWQgX19pb21lbSAqY3JlZ3MgPSBxZXAtPnFjcmVnczsKKwl2b2lkIF9faW9tZW0gKm1yZWdzID0gcWVwLT5tcmVnczsKKwlpbnQgdHJpZXM7CisKKwkvKiBSZXNldCB0aGUgTUFDRSwgdGhlbiB0aGUgUUVDIGNoYW5uZWwuICovCisJc2J1c193cml0ZWIoTVJFR1NfQkNPTkZJR19SRVNFVCwgbXJlZ3MgKyBNUkVHU19CQ09ORklHKTsKKwl0cmllcyA9IE1BQ0VfUkVTRVRfUkVUUklFUzsKKwl3aGlsZSAoLS10cmllcykgeworCQl1OCB0bXAgPSBzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfQkNPTkZJRyk7CisJCWlmICh0bXAgJiBNUkVHU19CQ09ORklHX1JFU0VUKSB7CisJCQl1ZGVsYXkoMjApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICghdHJpZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IEFJRUVFIGNhbm5vdCByZXNldCB0aGUgTUFDRSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2J1c193cml0ZWwoQ1JFR19DVFJMX1JFU0VULCBjcmVncyArIENSRUdfQ1RSTCk7CisJdHJpZXMgPSBRRV9SRVNFVF9SRVRSSUVTOworCXdoaWxlICgtLXRyaWVzKSB7CisJCXUzMiB0bXAgPSBzYnVzX3JlYWRsKGNyZWdzICsgQ1JFR19DVFJMKTsKKwkJaWYgKHRtcCAmIENSRUdfQ1RSTF9SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgcmVzZXQgUUUgY2hhbm5lbCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxZV9pbml0X3JpbmdzKHN0cnVjdCBzdW5xZSAqcWVwKQoreworCXN0cnVjdCBxZV9pbml0X2Jsb2NrICpxYiA9IHFlcC0+cWVfYmxvY2s7CisJc3RydWN0IHN1bnFlX2J1ZmZlcnMgKnFidWZzID0gcWVwLT5idWZmZXJzOworCV9fdTMyIHFidWZzX2R2bWEgPSBxZXAtPmJ1ZmZlcnNfZHZtYTsKKwlpbnQgaTsKKworCXFlcC0+cnhfbmV3ID0gcWVwLT5yeF9vbGQgPSBxZXAtPnR4X25ldyA9IHFlcC0+dHhfb2xkID0gMDsKKwltZW1zZXQocWIsIDAsIHNpemVvZihzdHJ1Y3QgcWVfaW5pdF9ibG9jaykpOworCW1lbXNldChxYnVmcywgMCwgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSk7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXFiLT5xZV9yeGRbaV0ucnhfYWRkciA9IHFidWZzX2R2bWEgKyBxZWJ1Zl9vZmZzZXQocnhfYnVmLCBpKTsKKwkJcWItPnFlX3J4ZFtpXS5yeF9mbGFncyA9CisJCQkoUlhEX09XTiB8ICgoUlhEX1BLVF9TWikgJiBSWERfTEVOR1RIKSk7CisJfQorfQorCitzdGF0aWMgaW50IHFlX2luaXQoc3RydWN0IHN1bnFlICpxZXAsIGludCBmcm9tX2lycSkKK3sKKwlzdHJ1Y3Qgc3VucWVjICpxZWNwID0gcWVwLT5wYXJlbnQ7CisJdm9pZCBfX2lvbWVtICpjcmVncyA9IHFlcC0+cWNyZWdzOworCXZvaWQgX19pb21lbSAqbXJlZ3MgPSBxZXAtPm1yZWdzOworCXZvaWQgX19pb21lbSAqZ3JlZ3MgPSBxZWNwLT5ncmVnczsKKwl1bnNpZ25lZCBjaGFyICplID0gJnFlcC0+ZGV2LT5kZXZfYWRkclswXTsKKwl1MzIgdG1wOworCWludCBpOworCisJLyogU2h1dCBpdCB1cC4gKi8KKwlpZiAocWVfc3RvcChxZXApKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFNldHVwIGluaXRpYWwgcngvdHggaW5pdCBibG9jayBwb2ludGVycy4gKi8KKwlzYnVzX3dyaXRlbChxZXAtPnFibG9ja19kdm1hICsgcWliX29mZnNldChxZV9yeGQsIDApLCBjcmVncyArIENSRUdfUlhEUyk7CisJc2J1c193cml0ZWwocWVwLT5xYmxvY2tfZHZtYSArIHFpYl9vZmZzZXQocWVfdHhkLCAwKSwgY3JlZ3MgKyBDUkVHX1RYRFMpOworCisJLyogRW5hYmxlL21hc2sgdGhlIHZhcmlvdXMgaXJxJ3MuICovCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1JJTUFTSyk7CisJc2J1c193cml0ZWwoMSwgY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisKKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUU1BU0spOworCXNidXNfd3JpdGVsKENSRUdfTU1BU0tfUlhDT0xMLCBjcmVncyArIENSRUdfTU1BU0spOworCisJLyogU2V0dXAgdGhlIEZJRk8gcG9pbnRlcnMgaW50byBRRUMgbG9jYWwgbWVtb3J5LiAqLworCXRtcCA9IHFlcC0+Y2hhbm5lbCAqIHNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX01TSVpFKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGNyZWdzICsgQ1JFR19SWFJCVUZQVFIpOworCXNidXNfd3JpdGVsKHRtcCwgY3JlZ3MgKyBDUkVHX1JYV0JVRlBUUik7CisKKwl0bXAgPSBzYnVzX3JlYWRsKGNyZWdzICsgQ1JFR19SWFJCVUZQVFIpICsKKwkJc2J1c19yZWFkbChncmVncyArIEdMT0JfUlNJWkUpOworCXNidXNfd3JpdGVsKHRtcCwgY3JlZ3MgKyBDUkVHX1RYUkJVRlBUUik7CisJc2J1c193cml0ZWwodG1wLCBjcmVncyArIENSRUdfVFhXQlVGUFRSKTsKKworCS8qIENsZWFyIHRoZSBjaGFubmVsIGNvbGxpc2lvbiBjb3VudGVyLiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19DQ05UKTsKKworCS8qIEZvciAxMGJhc2VULCBpbnRlciBmcmFtZSBzcGFjZSBub3IgdGhyb3R0bGUgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5LiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19QSVBHKTsKKworCS8qIE5vdyBkb3JrIHdpdGggdGhlIEFNRCBNQUNFLiAqLworCXNidXNfd3JpdGViKE1SRUdTX1BIWUNPTkZJR19BVVRPLCBtcmVncyArIE1SRUdTX1BIWUNPTkZJRyk7CisJc2J1c193cml0ZWIoTVJFR1NfVFhGQ05UTF9BVVRPUEFELCBtcmVncyArIE1SRUdTX1RYRkNOVEwpOworCXNidXNfd3JpdGViKDAsIG1yZWdzICsgTVJFR1NfUlhGQ05UTCk7CisKKwkvKiBUaGUgUUVDIGRtYSdzIHRoZSByeCdkIHBhY2tldHMgZnJvbSBsb2NhbCBtZW1vcnkgb3V0IHRvIG1haW4gbWVtb3J5LAorCSAqIGFuZCB0aGVyZWZvcmUgaXQgaW50ZXJydXB0cyB3aGVuIHRoZSBwYWNrZXQgcmVjZXB0aW9uIGlzICJjb21wbGV0ZSIuCisJICogU28gZG9uJ3QgbGlzdGVuIGZvciB0aGUgTUFDRSB0YWxraW5nIGFib3V0IGl0LgorCSAqLworCXNidXNfd3JpdGViKE1SRUdTX0lNQVNLX0NPTEwgfCBNUkVHU19JTUFTS19SWElSUSwgbXJlZ3MgKyBNUkVHU19JTUFTSyk7CisJc2J1c193cml0ZWIoTVJFR1NfQkNPTkZJR19CU1dBUCB8IE1SRUdTX0JDT05GSUdfNjRUUywgbXJlZ3MgKyBNUkVHU19CQ09ORklHKTsKKwlzYnVzX3dyaXRlYigoTVJFR1NfRkNPTkZJR19UWEYxNiB8IE1SRUdTX0ZDT05GSUdfUlhGMzIgfAorCQkgICAgIE1SRUdTX0ZDT05GSUdfUkZXVSB8IE1SRUdTX0ZDT05GSUdfVEZXVSksCisJCSAgICBtcmVncyArIE1SRUdTX0ZDT05GSUcpOworCisJLyogT25seSB1c2FibGUgaW50ZXJmYWNlIG9uIFF1YWRFdGhlciBpcyB0d2lzdGVkIHBhaXIuICovCisJc2J1c193cml0ZWIoTVJFR1NfUExTQ09ORklHX1RQLCBtcmVncyArIE1SRUdTX1BMU0NPTkZJRyk7CisKKwkvKiBUZWxsIE1BQ0Ugd2UgYXJlIGNoYW5naW5nIHRoZSBldGhlciBhZGRyZXNzLiAqLworCXNidXNfd3JpdGViKE1SRUdTX0lBQ09ORklHX0FDSE5HRSB8IE1SRUdTX0lBQ09ORklHX1BBUkVTRVQsCisJCSAgICBtcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwl3aGlsZSAoKHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19JQUNPTkZJRykgJiBNUkVHU19JQUNPTkZJR19BQ0hOR0UpICE9IDApCisJCWJhcnJpZXIoKTsKKwlzYnVzX3dyaXRlYihlWzBdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbMV0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisJc2J1c193cml0ZWIoZVsyXSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKwlzYnVzX3dyaXRlYihlWzNdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbNF0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisJc2J1c193cml0ZWIoZVs1XSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKworCS8qIENsZWFyIG91dCB0aGUgYWRkcmVzcyBmaWx0ZXIuICovCisJc2J1c193cml0ZWIoTVJFR1NfSUFDT05GSUdfQUNITkdFIHwgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCwKKwkJICAgIG1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCXdoaWxlICgoc2J1c19yZWFkYihtcmVncyArIE1SRUdTX0lBQ09ORklHKSAmIE1SRUdTX0lBQ09ORklHX0FDSE5HRSkgIT0gMCkKKwkJYmFycmllcigpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXNidXNfd3JpdGViKDAsIG1yZWdzICsgTVJFR1NfRklMVEVSKTsKKworCS8qIEFkZHJlc3MgY2hhbmdlcyBhcmUgbm93IGNvbXBsZXRlLiAqLworCXNidXNfd3JpdGViKDAsIG1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCisJcWVfaW5pdF9yaW5ncyhxZXApOworCisJLyogV2FpdCBhIGxpdHRsZSBiaXQgZm9yIHRoZSBsaW5rIHRvIGNvbWUgdXAuLi4gKi8KKwltZGVsYXkoNSk7CisJaWYgKCEoc2J1c19yZWFkYihtcmVncyArIE1SRUdTX1BIWUNPTkZJRykgJiBNUkVHU19QSFlDT05GSUdfTFRFU1RESVMpKSB7CisJCWludCB0cmllcyA9IDUwOworCisJCXdoaWxlICh0cmllcy0tKSB7CisJCQl1OCB0bXA7CisKKwkJCW1kZWxheSg1KTsKKwkJCWJhcnJpZXIoKTsKKwkJCXRtcCA9IHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19QSFlDT05GSUcpOworCQkJaWYgKCh0bXAgJiBNUkVHU19QSFlDT05GSUdfTFNUQVQpICE9IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRyaWVzID09IDApCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBXYXJuaW5nLCBsaW5rIHN0YXRlIGlzIGRvd24uXG4iLCBxZXAtPmRldi0+bmFtZSk7CisJfQorCisJLyogTWlzc2VkIHBhY2tldCBjb3VudGVyIGlzIGNsZWFyZWQgb24gYSByZWFkLiAqLworCXNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19NUENOVCk7CisKKwkvKiBSZWxvYWQgbXVsdGljYXN0IGluZm9ybWF0aW9uLCB0aGlzIHdpbGwgZW5hYmxlIHRoZSByZWNlaXZlcgorCSAqIGFuZCB0cmFuc21pdHRlci4KKwkgKi8KKwlxZV9zZXRfbXVsdGljYXN0KHFlcC0+ZGV2KTsKKworCS8qIFFFQyBzaG91bGQgbm93IHN0YXJ0IHRvIHNob3cgaW50ZXJydXB0cy4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogR3JyciwgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIGNvbXBsZXRlbHkgbG9jayB1cCB0aGUgQU1EIE1BQ0UsCisgKiBzbyB3aGVuIHdlIGdldCB0aGVzZSB3ZSBfbXVzdF8gcmVzZXQgdGhlIGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgcWVfaXNfYm9saXhlZChzdHJ1Y3Qgc3VucWUgKnFlcCwgdTMyIHFlX3N0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcWVwLT5kZXY7CisJaW50IG1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDA7CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0VERUZFUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFeGNlc3NpdmUgdHJhbnNtaXQgZGVmZXJzLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9DTE9TUykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJyaWVyIGxvc3QsIGxpbmsgZG93bj9cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfRVJFVFJJRVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXhjZXNzaXZlIHRyYW5zbWl0IHJldHJpZXMgKG1vcmUgdGhhbiAxNikuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0xDT0xMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExhdGUgdHJhbnNtaXQgY29sbGlzaW9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0ZVRkxPVykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBmaWZvIHVuZGVyZmxvdywgZHJpdmVyIGJ1Zy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfSkVSUk9SKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEphYmJlciBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9CRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQmFiYmxlIGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0NDT0ZMT1cpIHsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzICs9IDI1NjsKKwkJcWVwLT5uZXRfc3RhdHMuY29sbGlzaW9ucyArPSAyNTY7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9UWERFUlJPUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBkZXNjcmlwdG9yIGlzIGJvZ3VzLCBkcml2ZXIgYnVnLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9UWExFUlIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgbGF0ZSBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhQRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRyYW5zbWl0IERNQSBwYXJpdHkgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1RYU0VSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBETUEgc2J1cyBlcnJvciBhY2suXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JDQ09GTE9XKSB7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycyArPSAyNTY7CisJCXFlcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlVPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSAyNTY7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9NQ09GTE9XKSB7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycyArPSAyNTY7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhGT0ZMT1cpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBmaWZvIG92ZXJmbG93LlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9STENPTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTGF0ZSByZWNlaXZlIGNvbGxpc2lvbi5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5jb2xsaXNpb25zKys7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9GQ09GTE9XKSB7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycyArPSAyNTY7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSAyNTY7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9DRUNPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICs9IDI1NjsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYRFJPUCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIHBhY2tldCBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcWVwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhTTUFMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIGJ1ZmZlciB0b28gc21hbGwsIGRyaXZlciBidWcuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhMRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgbGF0ZSBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhQRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgRE1BIHBhcml0eSBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SWFNFUlIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBETUEgc2J1cyBlcnJvciBhY2suXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChtYWNlX2h3YnVnX3dvcmthcm91bmQpCisJCXFlX2luaXQocWVwLCAxKTsKKwlyZXR1cm4gbWFjZV9od2J1Z193b3JrYXJvdW5kOworfQorCisvKiBQZXItUUUgcmVjZWl2ZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAgSnVzdCBsaWtlIG9uIHRoZSBoYXBweSBtZWFsCisgKiB3ZSByZWNlaXZlIGRpcmVjdGx5IGludG8gc2tiJ3Mgd2l0aCBhIHNtYWxsIHBhY2tldCBjb3B5IHdhdGVyIG1hcmsuCisgKi8KK3N0YXRpYyB2b2lkIHFlX3J4KHN0cnVjdCBzdW5xZSAqcWVwKQoreworCXN0cnVjdCBxZV9yeGQgKnJ4YmFzZSA9ICZxZXAtPnFlX2Jsb2NrLT5xZV9yeGRbMF07CisJc3RydWN0IHFlX3J4ZCAqdGhpczsKKwlzdHJ1Y3Qgc3VucWVfYnVmZmVycyAqcWJ1ZnMgPSBxZXAtPmJ1ZmZlcnM7CisJX191MzIgcWJ1ZnNfZHZtYSA9IHFlcC0+YnVmZmVyc19kdm1hOworCWludCBlbGVtID0gcWVwLT5yeF9uZXcsIGRyb3BzID0gMDsKKwl1MzIgZmxhZ3M7CisKKwl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl3aGlsZSAoISgoZmxhZ3MgPSB0aGlzLT5yeF9mbGFncykgJiBSWERfT1dOKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1bnNpZ25lZCBjaGFyICp0aGlzX3FidWYgPQorCQkJJnFidWZzLT5yeF9idWZbZWxlbSAmIChSWF9SSU5HX1NJWkUgLSAxKV1bMF07CisJCV9fdTMyIHRoaXNfcWJ1Zl9kdm1hID0gcWJ1ZnNfZHZtYSArCisJCQlxZWJ1Zl9vZmZzZXQocnhfYnVmLCAoZWxlbSAmIChSWF9SSU5HX1NJWkUgLSAxKSkpOworCQlzdHJ1Y3QgcWVfcnhkICplbmRfcnhkID0KKwkJCSZyeGJhc2VbKGVsZW0rUlhfUklOR19TSVpFKSYoUlhfUklOR19NQVhTSVpFLTEpXTsKKwkJaW50IGxlbiA9IChmbGFncyAmIFJYRF9MRU5HVEgpIC0gNDsgIC8qIFFFIGFkZHMgZXRoZXIgRkNTIHNpemUgdG8gbGVuICovCisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXFlcC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXFlcC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCXFlcC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0gZWxzZSB7CisJCQkJc2tiLT5kZXYgPSBxZXAtPmRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSB0aGlzX3FidWYsCisJCQkJCQkgbGVuLCAwKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBxZXAtPmRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlxZXAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJcWVwLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQkJCXFlcC0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCX0KKwkJfQorCQllbmRfcnhkLT5yeF9hZGRyID0gdGhpc19xYnVmX2R2bWE7CisJCWVuZF9yeGQtPnJ4X2ZsYWdzID0gKFJYRF9PV04gfCAoKFJYRF9QS1RfU1opICYgUlhEX0xFTkdUSCkpOworCQkKKwkJZWxlbSA9IE5FWFRfUlgoZWxlbSk7CisJCXRoaXMgPSAmcnhiYXNlW2VsZW1dOworCX0KKwlxZXAtPnJ4X25ldyA9IGVsZW07CisJaWYgKGRyb3BzKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIHFlcC0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgcWVfdHhfcmVjbGFpbShzdHJ1Y3Qgc3VucWUgKnFlcCk7CisKKy8qIEludGVycnVwdHMgZm9yIGFsbCBRRSdzIGdldCBmaWx0ZXJlZCBvdXQgdmlhIHRoZSBRRUMgbWFzdGVyIGNvbnRyb2xsZXIsCisgKiBzbyB3ZSBqdXN0IHJ1biB0aHJvdWdoIGVhY2ggcWUgYW5kIGNoZWNrIHRvIHNlZSB3aG8gaXMgc2lnbmFsaW5nCisgKiBhbmQgdGh1cyBuZWVkcyB0byBiZSBzZXJ2aWNlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHFlY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3VucWVjICpxZWNwID0gKHN0cnVjdCBzdW5xZWMgKikgZGV2X2lkOworCXUzMiBxZWNfc3RhdHVzOworCWludCBjaGFubmVsID0gMDsKKworCS8qIExhdGNoIHRoZSBzdGF0dXMgbm93LiAqLworCXFlY19zdGF0dXMgPSBzYnVzX3JlYWRsKHFlY3AtPmdyZWdzICsgR0xPQl9TVEFUKTsKKwl3aGlsZSAoY2hhbm5lbCA8IDQpIHsKKwkJaWYgKHFlY19zdGF0dXMgJiAweGYpIHsKKwkJCXN0cnVjdCBzdW5xZSAqcWVwID0gcWVjcC0+cWVzW2NoYW5uZWxdOworCQkJdTMyIHFlX3N0YXR1czsKKworCQkJcWVfc3RhdHVzID0gc2J1c19yZWFkbChxZXAtPnFjcmVncyArIENSRUdfU1RBVCk7CisJCQlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0VSUk9SUykgeworCQkJCWlmIChxZV9pc19ib2xpeGVkKHFlcCwgcWVfc3RhdHVzKSkKKwkJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SWElSUSkKKwkJCQlxZV9yeChxZXApOworCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocWVwLT5kZXYpICYmCisJCQkgICAgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9UWElSUSkpIHsKKwkJCQlzcGluX2xvY2soJnFlcC0+bG9jayk7CisJCQkJcWVfdHhfcmVjbGFpbShxZXApOworCQkJCWlmIChUWF9CVUZGU19BVkFJTChxZXApID4gMCkgeworCQkJCQkvKiBXYWtlIG5ldCBxdWV1ZSBhbmQgcmV0dXJuIHRvCisJCQkJCSAqIGxhenkgdHggcmVjbGFpbS4KKwkJCQkJICovCisJCQkJCW5ldGlmX3dha2VfcXVldWUocWVwLT5kZXYpOworCQkJCQlzYnVzX3dyaXRlbCgxLCBxZXAtPnFjcmVncyArIENSRUdfVElNQVNLKTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2soJnFlcC0+bG9jayk7CisJCQl9CisJbmV4dDoKKwkJCTsKKwkJfQorCQlxZWNfc3RhdHVzID4+PSA0OworCQljaGFubmVsKys7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHFlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCisJcWVwLT5tY29uZmlnID0gKE1SRUdTX01DT05GSUdfVFhFTkFCIHwKKwkJCU1SRUdTX01DT05GSUdfUlhFTkFCIHwKKwkJCU1SRUdTX01DT05GSUdfTUJBRU5BQik7CisJcmV0dXJuIHFlX2luaXQocWVwLCAwKTsKK30KKworc3RhdGljIGludCBxZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisKKwlxZV9zdG9wKHFlcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2xhaW0gVFgnZCBmcmFtZXMgZnJvbSB0aGUgcmluZy4gIFRoaXMgbXVzdCBhbHdheXMgcnVuIHVuZGVyCisgKiB0aGUgSVJRIHByb3RlY3RlZCBxZXAtPmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHFlX3R4X3JlY2xhaW0oc3RydWN0IHN1bnFlICpxZXApCit7CisJc3RydWN0IHFlX3R4ZCAqdHhiYXNlID0gJnFlcC0+cWVfYmxvY2stPnFlX3R4ZFswXTsKKwlpbnQgZWxlbSA9IHFlcC0+dHhfb2xkOworCisJd2hpbGUgKGVsZW0gIT0gcWVwLT50eF9uZXcpIHsKKwkJdTMyIGZsYWdzID0gdHhiYXNlW2VsZW1dLnR4X2ZsYWdzOworCisJCWlmIChmbGFncyAmIFRYRF9PV04pCisJCQlicmVhazsKKwkJZWxlbSA9IE5FWFRfVFgoZWxlbSk7CisJfQorCXFlcC0+dHhfb2xkID0gZWxlbTsKK30KKworc3RhdGljIHZvaWQgcWVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisJaW50IHR4X2Z1bGw7CisKKwlzcGluX2xvY2tfaXJxKCZxZXAtPmxvY2spOworCisJLyogVHJ5IHRvIHJlY2xhaW0sIGlmIHRoYXQgZnJlZXMgdXAgc29tZSB0eAorCSAqIGVudHJpZXMsIHdlJ3JlIGZpbmUuCisJICovCisJcWVfdHhfcmVjbGFpbShxZXApOworCXR4X2Z1bGwgPSBUWF9CVUZGU19BVkFJTChxZXApIDw9IDA7CisKKwlzcGluX3VubG9ja19pcnEoJnFlcC0+bG9jayk7CisKKwlpZiAoISB0eF9mdWxsKQorCQlnb3RvIG91dDsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCXFlX2luaXQocWVwLCAxKTsKKworb3V0OgorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogR2V0IGEgcGFja2V0IHF1ZXVlZCB0byBnbyBvbnRvIHRoZSB3aXJlLiAqLworc3RhdGljIGludCBxZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc3VucWVfYnVmZmVycyAqcWJ1ZnMgPSBxZXAtPmJ1ZmZlcnM7CisJX191MzIgdHhidWZfZHZtYSwgcWJ1ZnNfZHZtYSA9IHFlcC0+YnVmZmVyc19kdm1hOworCXVuc2lnbmVkIGNoYXIgKnR4YnVmOworCWludCBsZW4sIGVudHJ5OworCisJc3Bpbl9sb2NrX2lycSgmcWVwLT5sb2NrKTsKKworCXFlX3R4X3JlY2xhaW0ocWVwKTsKKworCWxlbiA9IHNrYi0+bGVuOworCWVudHJ5ID0gcWVwLT50eF9uZXc7CisKKwl0eGJ1ZiA9ICZxYnVmcy0+dHhfYnVmW2VudHJ5ICYgKFRYX1JJTkdfU0laRSAtIDEpXVswXTsKKwl0eGJ1Zl9kdm1hID0gcWJ1ZnNfZHZtYSArCisJCXFlYnVmX29mZnNldCh0eF9idWYsIChlbnRyeSAmIChUWF9SSU5HX1NJWkUgLSAxKSkpOworCisJLyogQXZvaWQgYSByYWNlLi4uICovCisJcWVwLT5xZV9ibG9jay0+cWVfdHhkW2VudHJ5XS50eF9mbGFncyA9IFRYRF9VUERBVEU7CisKKwltZW1jcHkodHhidWYsIHNrYi0+ZGF0YSwgbGVuKTsKKworCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfYWRkciA9IHR4YnVmX2R2bWE7CisJcWVwLT5xZV9ibG9jay0+cWVfdHhkW2VudHJ5XS50eF9mbGFncyA9CisJCShUWERfT1dOIHwgVFhEX1NPUCB8IFRYRF9FT1AgfCAobGVuICYgVFhEX0xFTkdUSCkpOworCXFlcC0+dHhfbmV3ID0gTkVYVF9UWChlbnRyeSk7CisKKwkvKiBHZXQgaXQgZ29pbmcuICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc2J1c193cml0ZWwoQ1JFR19DVFJMX1RXQUtFVVAsIHFlcC0+cWNyZWdzICsgQ1JFR19DVFJMKTsKKworCXFlcC0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwlxZXAtPm5ldF9zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwocWVwKSA8PSAwKSB7CisJCS8qIEhhbHQgdGhlIG5ldCBxdWV1ZSBhbmQgZW5hYmxlIHR4IGludGVycnVwdHMuCisJCSAqIFdoZW4gdGhlIHR4IHF1ZXVlIGVtcHRpZXMgdGhlIHR4IGlycSBoYW5kbGVyCisJCSAqIHdpbGwgd2FrZSB1cCB0aGUgcXVldWUgYW5kIHJldHVybiB1cyBiYWNrIHRvCisJCSAqIHRoZSBsYXp5IHR4IHJlY2xhaW0gc2NoZW1lLgorCQkgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzYnVzX3dyaXRlbCgwLCBxZXAtPnFjcmVncyArIENSRUdfVElNQVNLKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZxZXAtPmxvY2spOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcWVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKworCXJldHVybiAmcWVwLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHFlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCXU4IG5ld19tY29uZmlnID0gcWVwLT5tY29uZmlnOworCWNoYXIgKmFkZHJzOworCWludCBpOworCXUzMiBjcmM7CisKKwkvKiBMb2NrIG91dCBvdGhlcnMuICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlzYnVzX3dyaXRlYihNUkVHU19JQUNPTkZJR19BQ0hOR0UgfCBNUkVHU19JQUNPTkZJR19MQVJFU0VULAorCQkJICAgIHFlcC0+bXJlZ3MgKyBNUkVHU19JQUNPTkZJRyk7CisJCXdoaWxlICgoc2J1c19yZWFkYihxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpICYgTVJFR1NfSUFDT05GSUdfQUNITkdFKSAhPSAwKQorCQkJYmFycmllcigpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJc2J1c193cml0ZWIoMHhmZiwgcWVwLT5tcmVncyArIE1SRUdTX0ZJTFRFUik7CisJCXNidXNfd3JpdGViKDAsIHFlcC0+bXJlZ3MgKyBNUkVHU19JQUNPTkZJRyk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbmV3X21jb25maWcgfD0gTVJFR1NfTUNPTkZJR19QUk9NSVNDOworCX0gZWxzZSB7CisJCXUxNiBoYXNoX3RhYmxlWzRdOworCQl1OCAqaGJ5dGVzID0gKHVuc2lnbmVkIGNoYXIgKikgJmhhc2hfdGFibGVbMF07CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWhhc2hfdGFibGVbaV0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQkJY29udGludWU7CisJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNjsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwkJLyogUHJvZ3JhbSB0aGUgcWUgd2l0aCB0aGUgbmV3IGZpbHRlciB2YWx1ZS4gKi8KKwkJc2J1c193cml0ZWIoTVJFR1NfSUFDT05GSUdfQUNITkdFIHwgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCwKKwkJCSAgICBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCQl3aGlsZSAoKHNidXNfcmVhZGIocWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKSAmIE1SRUdTX0lBQ09ORklHX0FDSE5HRSkgIT0gMCkKKwkJCWJhcnJpZXIoKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJdTggdG1wID0gKmhieXRlcysrOworCQkJc2J1c193cml0ZWIodG1wLCBxZXAtPm1yZWdzICsgTVJFR1NfRklMVEVSKTsKKwkJfQorCQlzYnVzX3dyaXRlYigwLCBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCX0KKworCS8qIEFueSBjaGFuZ2Ugb2YgdGhlIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIsIHRoZSBwaHlzaWNhbCBhZGRyZXNzLAorCSAqIG9yIGVuYWJsaW5nL2Rpc2FibGluZyBwcm9taXNjdW91cyBtb2RlIGNhdXNlcyB0aGUgTUFDRSB0byBkaXNhYmxlCisJICogdGhlIHJlY2VpdmVyLiAgU28gd2UgbXVzdCByZS1lbmFibGUgdGhlbSBoZXJlIG9yIGVsc2UgdGhlIE1BQ0UKKwkgKiByZWZ1c2VzIHRvIGxpc3RlbiB0byBhbnl0aGluZyBvbiB0aGUgbmV0d29yay4gIFNoZWVzaCwgdG9vaworCSAqIG1lIGEgZGF5IG9yIHR3byB0byBmaW5kIHRoaXMgYnVnLgorCSAqLworCXFlcC0+bWNvbmZpZyA9IG5ld19tY29uZmlnOworCXNidXNfd3JpdGViKHFlcC0+bWNvbmZpZywgcWVwLT5tcmVncyArIE1SRUdTX01DT05GSUcpOworCisJLyogTGV0IHVzIGdldCBnb2luZyBhZ2Fpbi4gKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIEV0aHRvb2wgc3VwcG9ydC4uLiAqLworc3RhdGljIHZvaWQgcWVfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IGRldi0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5xZSIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMy4wIik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAorCQlxZXAtPnFlX3NkZXYtPnNsb3QpOworfQorCitzdGF0aWMgdTMyIHFlX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICptcmVncyA9IHFlcC0+bXJlZ3M7CisJdTggcGh5Y29uZmlnOworCisJc3Bpbl9sb2NrX2lycSgmcWVwLT5sb2NrKTsKKwlwaHljb25maWcgPSBzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfUEhZQ09ORklHKTsKKwlzcGluX3VubG9ja19pcnEoJnFlcC0+bG9jayk7CisKKwlyZXR1cm4gKHBoeWNvbmZpZyAmIE1SRUdTX1BIWUNPTkZJR19MU1RBVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgcWVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHFlX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBxZV9nZXRfbGluaywKK307CisKKy8qIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSBhdCBib290IHRpbWUgZm9yIGVhY2ggY2FyZCBwcm9iZWQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgcWVjX2luaXRfb25jZShzdHJ1Y3Qgc3VucWVjICpxZWNwLCBzdHJ1Y3Qgc2J1c19kZXYgKnFzZGV2KQoreworCXU4IGJzaXplcyA9IHFlY3AtPnFlY19idXJzdHM7CisKKwlpZiAoc2J1c19jYW5fYnVyc3Q2NChxc2RldikgJiYgKGJzaXplcyAmIERNQV9CVVJTVDY0KSkgeworCQlzYnVzX3dyaXRlbChHTE9CX0NUUkxfQjY0LCBxZWNwLT5ncmVncyArIEdMT0JfQ1RSTCk7CisJfSBlbHNlIGlmIChic2l6ZXMgJiBETUFfQlVSU1QzMikgeworCQlzYnVzX3dyaXRlbChHTE9CX0NUUkxfQjMyLCBxZWNwLT5ncmVncyArIEdMT0JfQ1RSTCk7CisJfSBlbHNlIHsKKwkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0IxNiwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOworCX0KKworCS8qIFBhY2tldHNpemUgb25seSB1c2VkIGluIDEwMGJhc2VUIEJpZ01BQyBjb25maWd1cmF0aW9ucywKKwkgKiBzZXQgaXQgdG8gemVybyBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuCisJICovCisJc2J1c193cml0ZWwoR0xPQl9QU0laRV8yMDQ4LCBxZWNwLT5ncmVncyArIEdMT0JfUFNJWkUpOworCisJLyogU2V0IHRoZSBsb2NhbCBtZW1zaXplIHJlZ2lzdGVyLCBkaXZpZGVkIHVwIHRvIG9uZSBwaWVjZSBwZXIgUUUgY2hhbm5lbC4gKi8KKwlzYnVzX3dyaXRlbCgocXNkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAyKSwKKwkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9NU0laRSk7CisKKwkvKiBEaXZpZGUgdXAgdGhlIGxvY2FsIFFFQyBtZW1vcnkgYW1vbmdzdCB0aGUgNCBRRSByZWNlaXZlciBhbmQKKwkgKiB0cmFuc21pdHRlciBGSUZPcy4gIEJhc2ljYWxseSBpdCBpcyAodG90YWwgLyAyIC8gbnVtX2NoYW5uZWxzKS4KKwkgKi8KKwlzYnVzX3dyaXRlbCgocXNkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAyKSA+PiAxLAorCQkgICAgcWVjcC0+Z3JlZ3MgKyBHTE9CX1RTSVpFKTsKKwlzYnVzX3dyaXRlbCgocXNkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAyKSA+PiAxLAorCQkgICAgcWVjcC0+Z3JlZ3MgKyBHTE9CX1JTSVpFKTsKK30KKworLyogRm91ciBRRSdzIHBlciBRRUMgY2FyZC4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHFlY19ldGhlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpxZV9kZXZzWzRdOworCXN0cnVjdCBzdW5xZSAqcWVwc1s0XTsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnFlc2RldnNbNF07CisJc3RydWN0IHNidXNfZGV2ICpjaGlsZDsKKwlzdHJ1Y3Qgc3VucWVjICpxZWNwID0gTlVMTDsKKwl1OCBic2l6ZXMsIGJzaXplc19tb3JlOworCWludCBpLCBqLCByZXMgPSAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlxZV9kZXZzW2ldID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzdW5xZSkpOworCQlpZiAoIXFlX2RldnNbaV0pCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcWVwc1tpXSA9IChzdHJ1Y3Qgc3VucWUgKikgcWVfZGV2c1tpXS0+cHJpdjsKKwkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkJCXFlX2RldnNbaV0tPmRldl9hZGRyW2pdID0gaWRwcm9tLT5pZF9ldGhhZGRyW2pdOworCQlxZXBzW2ldLT5jaGFubmVsID0gaTsKKwkJc3Bpbl9sb2NrX2luaXQoJnFlcHNbaV0tPmxvY2spOworCX0KKworCXFlY3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3VucWVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFlY3AgPT0gTlVMTCkKKwkJZ290byBvdXQxOworCXFlY3AtPnFlY19zZGV2ID0gc2RldjsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcWVjcC0+cWVzW2ldID0gcWVwc1tpXTsKKwkJcWVwc1tpXS0+ZGV2ID0gcWVfZGV2c1tpXTsKKwkJcWVwc1tpXS0+cGFyZW50ID0gcWVjcDsKKwl9CisKKwlyZXMgPSAtRU5PREVWOworCisJZm9yIChpID0gMCwgY2hpbGQgPSBzZGV2LT5jaGlsZDsgaSA8IDQ7IGkrKywgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkvKiBMaW5rIGluIGNoYW5uZWwgKi8KKwkJaiA9IHByb21fZ2V0aW50ZGVmYXVsdChjaGlsZC0+cHJvbV9ub2RlLCAiY2hhbm5lbCMiLCAtMSk7CisJCWlmIChqID09IC0xKQorCQkJZ290byBvdXQyOworCQlxZXNkZXZzW2pdID0gY2hpbGQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJcWVwc1tpXS0+cWVfc2RldiA9IHFlc2RldnNbaV07CisKKwkvKiBOb3cgbWFwIGluIHRoZSByZWdpc3RlcnMsIFFFQyBnbG9iYWxzIGZpcnN0LiAqLworCXFlY3AtPmdyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICBHTE9CX1JFR19TSVpFLCAiUUVDIEdsb2JhbCBSZWdpc3RlcnMiKTsKKwlpZiAoIXFlY3AtPmdyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFQyBnbG9iYWwgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIFFFQyBpcyBpbiBNQUNFIG1vZGUuICovCisJaWYgKChzYnVzX3JlYWRsKHFlY3AtPmdyZWdzICsgR0xPQl9DVFJMKSAmIDB4ZjAwMDAwMDApICE9IEdMT0JfQ1RSTF9NTU9ERSkgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQUlFRUUsIFFFQyBpcyBub3QgaW4gTUFDRSBtb2RlIVxuIik7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKiBSZXNldCB0aGUgUUVDLiAqLworCWlmIChxZWNfZ2xvYmFsX3Jlc2V0KHFlY3AtPmdyZWdzKSkKKwkJZ290byBvdXQzOworCisJLyogRmluZCBhbmQgc2V0IHRoZSBidXJzdCBzaXplcyBmb3IgdGhlIFFFQywgc2luY2UgaXQgZG9lcworCSAqIHRoZSBhY3R1YWwgZG1hIGZvciBhbGwgNCBjaGFubmVscy4KKwkgKi8KKwlic2l6ZXMgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKKwlic2l6ZXMgJj0gMHhmZjsKKwlic2l6ZXNfbW9yZSA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisKKwlpZiAoYnNpemVzX21vcmUgIT0gMHhmZikKKwkJYnNpemVzICY9IGJzaXplc19tb3JlOworCWlmIChic2l6ZXMgPT0gMHhmZiB8fCAoYnNpemVzICYgRE1BX0JVUlNUMTYpID09IDAgfHwKKwkgICAoYnNpemVzICYgRE1BX0JVUlNUMzIpPT0wKQorCQlic2l6ZXMgPSAoRE1BX0JVUlNUMzIgLSAxKTsKKworCXFlY3AtPnFlY19idXJzdHMgPSBic2l6ZXM7CisKKwkvKiBQZXJmb3JtIG9uZSB0aW1lIFFFQyBpbml0aWFsaXphdGlvbiwgd2UgbmV2ZXIgdG91Y2ggdGhlIFFFQworCSAqIGdsb2JhbHMgYWdhaW4gYWZ0ZXIgdGhpcy4KKwkgKi8KKwlxZWNfaW5pdF9vbmNlKHFlY3AsIHNkZXYpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzdHJ1Y3Qgc3VucWUgKnFlID0gcWVwc1tpXTsKKwkJLyogTWFwIGluIFFFQyBwZXItY2hhbm5lbCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwkJcWUtPnFjcmVncyA9IHNidXNfaW9yZW1hcCgmcWUtPnFlX3NkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCSAgICAgICBDUkVHX1JFR19TSVpFLCAiUUVDIENoYW5uZWwgUmVnaXN0ZXJzIik7CisJCWlmICghcWUtPnFjcmVncykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbm5vdCBtYXAgUUUgJWQncyBjaGFubmVsIHJlZ2lzdGVycy5cbiIsIGkpOworCQkJZ290byBvdXQ0OworCQl9CisKKwkJLyogTWFwIGluIHBlci1jaGFubmVsIEFNRCBNQUNFIHJlZ2lzdGVycy4gKi8KKwkJcWUtPm1yZWdzID0gc2J1c19pb3JlbWFwKCZxZS0+cWVfc2Rldi0+cmVzb3VyY2VbMV0sIDAsCisJCQkJICAgICAgTVJFR1NfUkVHX1NJWkUsICJRRSBNQUNFIFJlZ2lzdGVycyIpOworCQlpZiAoIXFlLT5tcmVncykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbm5vdCBtYXAgUUUgJWQncyBNQUNFIHJlZ2lzdGVycy5cbiIsIGkpOworCQkJZ290byBvdXQ0OworCQl9CisKKwkJcWUtPnFlX2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCQkJICBQQUdFX1NJWkUsCisJCQkJCQkgICZxZS0+cWJsb2NrX2R2bWEpOworCQlxZS0+YnVmZmVycyA9IHNidXNfYWxsb2NfY29uc2lzdGVudChxZS0+cWVfc2RldiwKKwkJCQkJCSBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJCQkJICZxZS0+YnVmZmVyc19kdm1hKTsKKwkJaWYgKHFlLT5xZV9ibG9jayA9PSBOVUxMIHx8IHFlLT5xYmxvY2tfZHZtYSA9PSAwIHx8CisJCSAgICBxZS0+YnVmZmVycyA9PSBOVUxMIHx8IHFlLT5idWZmZXJzX2R2bWEgPT0gMCkgeworCQkJZ290byBvdXQ0OworCQl9CisKKwkJLyogU3RvcCB0aGlzIFFFLiAqLworCQlxZV9zdG9wKHFlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCVNFVF9NT0RVTEVfT1dORVIocWVfZGV2c1tpXSk7CisJCXFlX2RldnNbaV0tPm9wZW4gPSBxZV9vcGVuOworCQlxZV9kZXZzW2ldLT5zdG9wID0gcWVfY2xvc2U7CisJCXFlX2RldnNbaV0tPmhhcmRfc3RhcnRfeG1pdCA9IHFlX3N0YXJ0X3htaXQ7CisJCXFlX2RldnNbaV0tPmdldF9zdGF0cyA9IHFlX2dldF9zdGF0czsKKwkJcWVfZGV2c1tpXS0+c2V0X211bHRpY2FzdF9saXN0ID0gcWVfc2V0X211bHRpY2FzdDsKKwkJcWVfZGV2c1tpXS0+dHhfdGltZW91dCA9IHFlX3R4X3RpbWVvdXQ7CisJCXFlX2RldnNbaV0tPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKwkJcWVfZGV2c1tpXS0+aXJxID0gc2Rldi0+aXJxc1swXTsKKwkJcWVfZGV2c1tpXS0+ZG1hID0gMDsKKwkJcWVfZGV2c1tpXS0+ZXRodG9vbF9vcHMgPSAmcWVfZXRodG9vbF9vcHM7CisJfQorCisJLyogUUVDIHJlY2VpdmVzIGludGVycnVwdHMgZnJvbSBlYWNoIFFFLCB0aGVuIGl0IHNlbmRzIHRoZSBhY3R1YWwKKwkgKiBJUlEgdG8gdGhlIGNwdSBpdHNlbGYuICBTaW5jZSBRRUMgaXMgdGhlIHNpbmdsZSBwb2ludCBvZgorCSAqIGludGVycnVwdCBmb3IgYWxsIFFFIGNoYW5uZWxzIHdlIHJlZ2lzdGVyIHRoZSBJUlEgaGFuZGxlcgorCSAqIGZvciBpdCBub3cuCisJICovCisJaWYgKHJlcXVlc3RfaXJxKHNkZXYtPmlycXNbMF0sICZxZWNfaW50ZXJydXB0LAorCQkJU0FfU0hJUlEsICJRdWFkRXRoZXIiLCAodm9pZCAqKSBxZWNwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2FuJ3QgcmVnaXN0ZXIgUUVDIG1hc3RlciBpcnEgaGFuZGxlci5cbiIpOworCQlyZXMgPSAtRUFHQUlOOworCQlnb3RvIG91dDQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KHFlX2RldnNbaV0pICE9IDApCisJCQlnb3RvIG91dDU7CisJfQorCisJLyogUmVwb3J0IHRoZSBRRSBjaGFubmVscy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBRdWFkRXRoZXJuZXQgY2hhbm5lbFslZF0gIiwgcWVfZGV2c1tpXS0+bmFtZSwgaSk7CisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJCQlwcmludGsgKCIlMi4yeCVjIiwKKwkJCQlxZV9kZXZzW2ldLT5kZXZfYWRkcltqXSwKKwkJCQlqID09IDUgPyAnICc6ICc6Jyk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwkvKiBXZSBhcmUgaG9tZSBmcmVlIGF0IHRoaXMgcG9pbnQsIGxpbmsgdGhlIHFlJ3MgaW50bworCSAqIHRoZSBtYXN0ZXIgbGlzdCBmb3IgbGF0ZXIgZHJpdmVyIGV4aXQuCisJICovCisJcWVjcC0+bmV4dF9tb2R1bGUgPSByb290X3FlY19kZXY7CisJcm9vdF9xZWNfZGV2ID0gcWVjcDsKKworCXJldHVybiAwOworCitvdXQ1OgorCXdoaWxlIChpLS0pCisJCXVucmVnaXN0ZXJfbmV0ZGV2KHFlX2RldnNbaV0pOworCWZyZWVfaXJxKHNkZXYtPmlycXNbMF0sICh2b2lkICopcWVjcCk7CitvdXQ0OgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHN1bnFlICpxZSA9IChzdHJ1Y3Qgc3VucWUgKilxZV9kZXZzW2ldLT5wcml2OworCisJCWlmIChxZS0+cWNyZWdzKQorCQkJc2J1c19pb3VubWFwKHFlLT5xY3JlZ3MsIENSRUdfUkVHX1NJWkUpOworCQlpZiAocWUtPm1yZWdzKQorCQkJc2J1c19pb3VubWFwKHFlLT5tcmVncywgTVJFR1NfUkVHX1NJWkUpOworCQlpZiAocWUtPnFlX2Jsb2NrKQorCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgIHFlLT5xZV9ibG9jaywKKwkJCQkJICAgICBxZS0+cWJsb2NrX2R2bWEpOworCQlpZiAocWUtPmJ1ZmZlcnMpCisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChxZS0+cWVfc2RldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJCQkgICAgIHFlLT5idWZmZXJzLAorCQkJCQkgICAgIHFlLT5idWZmZXJzX2R2bWEpOworCX0KK291dDM6CisJc2J1c19pb3VubWFwKHFlY3AtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKK291dDI6CisJa2ZyZWUocWVjcCk7CitvdXQxOgorCWkgPSA0Oworb3V0OgorCXdoaWxlIChpLS0pCisJCWZyZWVfbmV0ZGV2KHFlX2RldnNbaV0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHFlY19tYXRjaChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RydWN0IHNidXNfZGV2ICpzaWJsaW5nOworCWludCBpOworCisJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJxZWMiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFFFQyBjYW4gYmUgcGFyZW50IG9mIGVpdGhlciBRdWFkRXRoZXJuZXQgb3IgQmlnTUFDCisJICogY2hpbGRyZW4uICBEbyBub3QgY29uZnVzZSB0aGlzIHdpdGggcWZlL1NVTlcscWZlCisJICogd2hpY2ggaXMgYSBxdWFkLWhhcHB5bWVhbCBjYXJkIGFuZCBoYW5kbGVkIGJ5CisJICogYSBkaWZmZXJlbnQgZHJpdmVyLgorCSAqLworCXNpYmxpbmcgPSBzZGV2LT5jaGlsZDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChzaWJsaW5nID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHN0cmNtcChzaWJsaW5nLT5wcm9tX25hbWUsICJxZSIpICE9IDApCisJCQlyZXR1cm4gMDsKKwkJc2libGluZyA9IHNpYmxpbmctPm5leHQ7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxZWNfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2J1c19idXMgKmJ1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOworCXN0YXRpYyBpbnQgY2FsbGVkOworCWludCBjYXJkcyA9IDAsIHY7CisKKwlyb290X3FlY19kZXYgPSBOVUxMOworCisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FsbGVkKys7CisKKwlmb3JfZWFjaF9zYnVzKGJ1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIGJ1cykgeworCQkJaWYgKGNhcmRzKQorCQkJCWRldiA9IE5VTEw7CisKKwkJCWlmIChxZWNfbWF0Y2goc2RldikpIHsKKwkJCQljYXJkcysrOworCQkJCWlmICgodiA9IHFlY19ldGhlcl9pbml0KGRldiwgc2RldikpKQorCQkJCQlyZXR1cm4gdjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWNhcmRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHFlY19jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IHN1bnFlYyAqbmV4dF9xZWM7CisJaW50IGk7CisKKwl3aGlsZSAocm9vdF9xZWNfZGV2KSB7CisJCW5leHRfcWVjID0gcm9vdF9xZWNfZGV2LT5uZXh0X21vZHVsZTsKKworCQkvKiBSZWxlYXNlIGFsbCBmb3VyIFFFIGNoYW5uZWxzLCB0aGVuIHRoZSBRRUMgaXRzZWxmLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihyb290X3FlY19kZXYtPnFlc1tpXS0+ZGV2KTsKKwkJCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPnFlc1tpXS0+cWNyZWdzLCBDUkVHX1JFR19TSVpFKTsKKwkJCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPnFlc1tpXS0+bXJlZ3MsIE1SRUdTX1JFR19TSVpFKTsKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xZV9zZGV2LAorCQkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICByb290X3FlY19kZXYtPnFlc1tpXS0+cWVfYmxvY2ssCisJCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFibG9ja19kdm1hKTsKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xZV9zZGV2LAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCisJCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPmJ1ZmZlcnMsCisJCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPmJ1ZmZlcnNfZHZtYSk7CisJCQlmcmVlX25ldGRldihyb290X3FlY19kZXYtPnFlc1tpXS0+ZGV2KTsKKwkJfQorCQlmcmVlX2lycShyb290X3FlY19kZXYtPnFlY19zZGV2LT5pcnFzWzBdLCAodm9pZCAqKXJvb3RfcWVjX2Rldik7CisJCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKKwkJa2ZyZWUocm9vdF9xZWNfZGV2KTsKKwkJcm9vdF9xZWNfZGV2ID0gbmV4dF9xZWM7CisJfQorfQorCittb2R1bGVfaW5pdChxZWNfcHJvYmUpOworbW9kdWxlX2V4aXQocWVjX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VucWUuaCBiL2RyaXZlcnMvbmV0L3N1bnFlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzNGYzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qICRJZDogc3VucWUuaCx2IDEuMTMgMjAwMC8wMi8wOSAxMToxNTo0MiBkYXZlbSBFeHAgJAorICogc3VucWUuaDogRGVmaW5pdGlvbnMgZm9yIHRoZSBTdW4gUXVhZEV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKyNpZm5kZWYgX1NVTlFFX0gKKyNkZWZpbmUgX1NVTlFFX0gKKworLyogUUVDIGdsb2JhbCByZWdpc3RlcnMuICovCisjZGVmaW5lIEdMT0JfQ1RSTAkweDAwVUwJCS8qIENvbnRyb2wJCQkqLworI2RlZmluZSBHTE9CX1NUQVQJMHgwNFVMCQkvKiBTdGF0dXMJCQkqLworI2RlZmluZSBHTE9CX1BTSVpFCTB4MDhVTAkJLyogUGFja2V0IFNpemUJCQkqLworI2RlZmluZSBHTE9CX01TSVpFCTB4MGNVTAkJLyogTG9jYWwtbWVtb3J5IFNpemUJCSovCisjZGVmaW5lIEdMT0JfUlNJWkUJMHgxMFVMCQkvKiBSZWNlaXZlIHBhcnRpdGlvbiBzaXplCSovCisjZGVmaW5lIEdMT0JfVFNJWkUJMHgxNFVMCQkvKiBUcmFuc21pdCBwYXJ0aXRpb24gc2l6ZQkqLworI2RlZmluZSBHTE9CX1JFR19TSVpFCTB4MThVTAorCisjZGVmaW5lIEdMT0JfQ1RSTF9NTU9ERSAgICAgICAweDQwMDAwMDAwIC8qIE1BQ0UgcWVjIG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQk1PREUgICAgICAgMHgxMDAwMDAwMCAvKiBCaWdNQUMgcWVjIG1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0VQQVIgICAgICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIHBhcml0eSAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9BQ05UUkwgICAgICAweDAwMDAwMDE4IC8qIFNCVVMgYXJiaXRyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBHTE9CX0NUUkxfQjY0ICAgICAgICAgMHgwMDAwMDAwNCAvKiA2NCBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0IzMiAgICAgICAgIDB4MDAwMDAwMDIgLyogMzIgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CMTYgICAgICAgICAweDAwMDAwMDAwIC8qIDE2IGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfUkVTRVQgICAgICAgMHgwMDAwMDAwMSAvKiBSZXNldCB0aGUgUUVDICAgICAgICAgICAgKi8KKworI2RlZmluZSBHTE9CX1NUQVRfVFggICAgICAgICAgMHgwMDAwMDAwOCAvKiBCaWdNQUMgVHJhbnNtaXQgSVJRICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX1JYICAgICAgICAgIDB4MDAwMDAwMDQgLyogQmlnTUFDIFJlY2VpdmUgSVJRICAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9CTSAgICAgICAgICAweDAwMDAwMDAyIC8qIEJpZ01BQyBHbG9iYWwgSVJRICAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfRVIgICAgICAgICAgMHgwMDAwMDAwMSAvKiBCaWdNQUMgRXJyb3IgSVJRICAgICAgICAgKi8KKworI2RlZmluZSBHTE9CX1BTSVpFXzIwNDggICAgICAgMHgwMCAgICAgICAvKiAyayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV80MDk2ICAgICAgIDB4MDEgICAgICAgLyogNGsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfNjE0NCAgICAgICAweDEwICAgICAgIC8qIDZrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzgxOTIgICAgICAgMHgxMSAgICAgICAvKiA4ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKworLyogSW4gTUFDRSBtb2RlLCB0aGVyZSBhcmUgZm91ciBxZSBjaGFubmVscy4gIEVhY2ggY2hhbm5lbCBoYXMgaXQncyBvd24KKyAqIHN0YXR1cyBiaXRzIGluIHRoZSBRRUMgc3RhdHVzIHJlZ2lzdGVyLiAgVGhpcyBtYWNybyBwaWNrcyBvdXQgdGhlCisgKiBvbmVzIHlvdSB3YW50LgorICovCisjZGVmaW5lIEdMT0JfU1RBVF9QRVJfUUUoc3RhdHVzLCBjaGFubmVsKSAoKChzdGF0dXMpID4+ICgoY2hhbm5lbCkgKiA0KSkgJiAweGYpCisKKy8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGFyZSBmb3IgcGVyLXFlIGNoYW5uZWwgaW5mb3JtYXRpb24vc3RhdHVzLiAqLworI2RlZmluZSBDUkVHX0NUUkwJMHgwMFVMCS8qIENvbnRyb2wgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUCTB4MDRVTAkvKiBTdGF0dXMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUlhEUwkweDA4VUwJLyogUlggZGVzY3JpcHRvciByaW5nIHB0ciAgICAqLworI2RlZmluZSBDUkVHX1RYRFMJMHgwY1VMCS8qIFRYIGRlc2NyaXB0b3IgcmluZyBwdHIgICAgKi8KKyNkZWZpbmUgQ1JFR19SSU1BU0sJMHgxMFVMCS8qIFJYIEludGVycnVwdCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19USU1BU0sJMHgxNFVMCS8qIFRYIEludGVycnVwdCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTSwkweDE4VUwJLyogUUVDIEVycm9yIEludGVycnVwdCBNYXNrICAqLworI2RlZmluZSBDUkVHX01NQVNLCTB4MWNVTAkvKiBNQUNFIEVycm9yIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIENSRUdfUlhXQlVGUFRSCTB4MjBVTAkvKiBMb2NhbCBtZW1vcnkgcnggd3JpdGUgcHRyICovCisjZGVmaW5lIENSRUdfUlhSQlVGUFRSCTB4MjRVTAkvKiBMb2NhbCBtZW1vcnkgcnggcmVhZCBwdHIgICovCisjZGVmaW5lIENSRUdfVFhXQlVGUFRSCTB4MjhVTAkvKiBMb2NhbCBtZW1vcnkgdHggd3JpdGUgcHRyICovCisjZGVmaW5lIENSRUdfVFhSQlVGUFRSCTB4MmNVTAkvKiBMb2NhbCBtZW1vcnkgdHggcmVhZCBwdHIgICovCisjZGVmaW5lIENSRUdfQ0NOVAkweDMwVUwJLyogQ29sbGlzaW9uIENvdW50ZXIgICAgICAgICAqLworI2RlZmluZSBDUkVHX1BJUEcJMHgzNFVMCS8qIEludGVyLUZyYW1lIEdhcCAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19SRUdfU0laRQkweDM4VUwKKworI2RlZmluZSBDUkVHX0NUUkxfUlhPRkYgICAgICAgMHgwMDAwMDAwNCAgLyogRGlzYWJsZSB0aGlzIHFlJ3MgcmVjZWl2ZXIqLworI2RlZmluZSBDUkVHX0NUUkxfUkVTRVQgICAgICAgMHgwMDAwMDAwMiAgLyogUmVzZXQgdGhpcyBxZSBjaGFubmVsICAgICAqLworI2RlZmluZSBDUkVHX0NUUkxfVFdBS0VVUCAgICAgMHgwMDAwMDAwMSAgLyogVHJhbnNtaXR0ZXIgV2FrZXVwLCAnZ28nLiAqLworCisjZGVmaW5lIENSRUdfU1RBVF9FREVGRVIgICAgICAweDEwMDAwMDAwICAvKiBFeGNlc3NpdmUgRGVmZXJzICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9DTE9TUyAgICAgICAweDA4MDAwMDAwICAvKiBDYXJyaWVyIExvc3MgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9FUkVUUklFUyAgICAweDA0MDAwMDAwICAvKiBNb3JlIHRoYW4gMTYgcmV0cmllcyAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9MQ09MTCAgICAgICAweDAyMDAwMDAwICAvKiBMYXRlIFRYIENvbGxpc2lvbiAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9GVUZMT1cgICAgICAweDAxMDAwMDAwICAvKiBGSUZPIFVuZGVyZmxvdyAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9KRVJST1IgICAgICAweDAwODAwMDAwICAvKiBKYWJiZXIgRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9CRVJST1IgICAgICAweDAwNDAwMDAwICAvKiBCYWJibGUgRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWElSUSAgICAgICAweDAwMjAwMDAwICAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9DQ09GTE9XICAgICAweDAwMTAwMDAwICAvKiBUWCBDb2xsLWNvdW50ZXIgT3ZlcmZsb3cgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWERFUlJPUiAgICAweDAwMDgwMDAwICAvKiBUWCBEZXNjcmlwdG9yIGlzIGJvZ3VzICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWExFUlIgICAgICAweDAwMDQwMDAwICAvKiBMYXRlIFRyYW5zbWl0IEVycm9yICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWFBFUlIgICAgICAweDAwMDIwMDAwICAvKiBUcmFuc21pdCBQYXJpdHkgRXJyb3IgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWFNFUlIgICAgICAweDAwMDEwMDAwICAvKiBUcmFuc21pdCBTQlVTIGVycm9yIGFjayAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SQ0NPRkxPVyAgICAweDAwMDAxMDAwICAvKiBSWCBDb2xsLWNvdW50ZXIgT3ZlcmZsb3cgICovCisjZGVmaW5lIENSRUdfU1RBVF9SVU9GTE9XICAgICAweDAwMDAwODAwICAvKiBSdW50IENvdW50ZXIgT3ZlcmZsb3cgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9NQ09GTE9XICAgICAweDAwMDAwNDAwICAvKiBNaXNzZWQgQ291bnRlciBPdmVyZmxvdyAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWEZPRkxPVyAgICAweDAwMDAwMjAwICAvKiBSWCBGSUZPIE92ZXJmbG93ICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9STENPTEwgICAgICAweDAwMDAwMTAwICAvKiBSWCBMYXRlIENvbGxpc2lvbiAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9GQ09GTE9XICAgICAweDAwMDAwMDgwICAvKiBGcmFtZSBDb3VudGVyIE92ZXJmbG93ICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9DRUNPRkxPVyAgICAweDAwMDAwMDQwICAvKiBDUkMgRXJyb3ItY291bnRlciBPdmVyZmxvdyovCisjZGVmaW5lIENSRUdfU1RBVF9SWElSUSAgICAgICAweDAwMDAwMDIwICAvKiBSZWNlaXZlIEludGVycnVwdCAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWERST1AgICAgICAweDAwMDAwMDEwICAvKiBEcm9wcGVkIGEgUlgnZCBwYWNrZXQgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFNNQUxMICAgICAweDAwMDAwMDA4ICAvKiBSZWNlaXZlIGJ1ZmZlciB0b28gc21hbGwgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWExFUlIgICAgICAweDAwMDAwMDA0ICAvKiBSZWNlaXZlIExhdGUgRXJyb3IgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFBFUlIgICAgICAweDAwMDAwMDAyICAvKiBSZWNlaXZlIFBhcml0eSBFcnJvciAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFNFUlIgICAgICAweDAwMDAwMDAxICAvKiBSZWNlaXZlIFNCVVMgRXJyb3IgQUNLICAgICovCisKKyNkZWZpbmUgQ1JFR19TVEFUX0VSUk9SUyAgICAgIChDUkVHX1NUQVRfRURFRkVSfENSRUdfU1RBVF9DTE9TU3xDUkVHX1NUQVRfRVJFVFJJRVN8ICAgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX0xDT0xMfENSRUdfU1RBVF9GVUZMT1d8Q1JFR19TVEFUX0pFUlJPUnwgICAgICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9CRVJST1J8Q1JFR19TVEFUX0NDT0ZMT1d8Q1JFR19TVEFUX1RYREVSUk9SfCAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfVFhMRVJSfENSRUdfU1RBVF9UWFBFUlJ8Q1JFR19TVEFUX1RYU0VSUnwgICAgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX1JDQ09GTE9XfENSRUdfU1RBVF9SVU9GTE9XfENSRUdfU1RBVF9NQ09GTE9XfCBcCisJCQkgICAgICAgQ1JFR19TVEFUX1JYRk9GTE9XfENSRUdfU1RBVF9STENPTEx8Q1JFR19TVEFUX0ZDT0ZMT1d8ICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9DRUNPRkxPV3xDUkVHX1NUQVRfUlhEUk9QfENSRUdfU1RBVF9SWFNNQUxMfCAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfUlhMRVJSfENSRUdfU1RBVF9SWFBFUlJ8Q1JFR19TVEFUX1JYU0VSUikKKworI2RlZmluZSBDUkVHX1FNQVNLX0NPRkxPVyAgICAgMHgwMDEwMDAwMCAgLyogQ29sbENudHIgb3ZlcmZsb3cgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYREVSUk9SICAgMHgwMDA4MDAwMCAgLyogVFhEIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYTEVSUiAgICAgMHgwMDA0MDAwMCAgLyogVFggbGF0ZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYUEVSUiAgICAgMHgwMDAyMDAwMCAgLyogVFggcGFyaXR5IGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1RYU0VSUiAgICAgMHgwMDAxMDAwMCAgLyogVFggc2J1cyBlcnJvciBhY2sgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYRFJPUCAgICAgMHgwMDAwMDAxMCAgLyogUlggZHJvcCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYQkVSUk9SICAgMHgwMDAwMDAwOCAgLyogUlggYnVmZmVyIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYTEVFUlIgICAgMHgwMDAwMDAwNCAgLyogUlggbGF0ZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYUEVSUiAgICAgMHgwMDAwMDAwMiAgLyogUlggcGFyaXR5IGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLX1JYU0VSUiAgICAgMHgwMDAwMDAwMSAgLyogUlggc2J1cyBlcnJvciBhY2sgICAgICAgICAqLworCisjZGVmaW5lIENSRUdfTU1BU0tfRURFRkVSICAgICAweDEwMDAwMDAwICAvKiBFeGNlc3MgZGVmZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfQ0xPU1MgICAgICAweDA4MDAwMDAwICAvKiBDYXJyaWVyIGxvc3MgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfRVJFVFJZICAgICAweDA0MDAwMDAwICAvKiBFeGNlc3MgcmV0cnkgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfTENPTEwgICAgICAweDAyMDAwMDAwICAvKiBMYXRlIGNvbGxpc2lvbiBlcnJvciAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfVUZMT1cgICAgICAweDAxMDAwMDAwICAvKiBVbmRlcmZsb3cgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfSkFCQkVSICAgICAweDAwODAwMDAwICAvKiBKYWJiZXIgZXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfQkFCQkxFICAgICAweDAwNDAwMDAwICAvKiBCYWJibGUgZXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfT0ZMT1cgICAgICAweDAwMDAwODAwICAvKiBPdmVyZmxvdyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfUlhDT0xMICAgICAweDAwMDAwNDAwICAvKiBSWCBDb2xsLUNudHIgb3ZlcmZsb3cgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfUlBLVCAgICAgICAweDAwMDAwMjAwICAvKiBSdW50IHBrdCBvdmVyZmxvdyAgICAgICAgICovCisjZGVmaW5lIENSRUdfTU1BU0tfTVBLVCAgICAgICAweDAwMDAwMTAwICAvKiBNaXNzZWQgcGt0IG92ZXJmbG93ICAgICAgICovCisKKyNkZWZpbmUgQ1JFR19QSVBHX1RFTkFCICAgICAgIDB4MDAwMDAwMjAgIC8qIEVuYWJsZSBUaHJvdHRsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19QSVBHX01NT0RFICAgICAgIDB4MDAwMDAwMTAgIC8qIE1hbnVhbCBNb2RlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19QSVBHX1dNQVNLICAgICAgIDB4MDAwMDAwMGYgIC8qIFNCVVMgV2FpdCBNYXNrICAgICAgICAgICAgKi8KKworLyogUGVyLWNoYW5uZWwgQU1EIDc5Qzk0MCBNQUNFIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgTVJFR1NfUlhGSUZPCTB4MDBVTAkvKiBSZWNlaXZlIEZJRk8gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGSUZPCTB4MDFVTAkvKiBUcmFuc21pdCBGSUZPICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGQ05UTAkweDAyVUwJLyogVHJhbnNtaXQgRnJhbWUgQ29udHJvbCAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVQJMHgwM1VMCS8qIFRyYW5zbWl0IEZyYW1lIFN0YXR1cyAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWFJDTlQJMHgwNFVMCS8qIFRyYW5zbWl0IFJldHJ5IENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZDTlRMCTB4MDVVTAkvKiBSZWNlaXZlIEZyYW1lIENvbnRyb2wgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVAkweDA2VUwJLyogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZGQ05UCTB4MDdVTAkvKiBGSUZPIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSVJFRwkweDA4VUwJLyogSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lNQVNLCTB4MDlVTAkvKiBJbnRlcnJ1cHQgTWFzayAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUE9MTAkweDBhVUwJLyogUE9MTCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUcJMHgwYlVMCS8qIEJJVSBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHCTB4MGNVTAkvKiBGSUZPIENvbmZpZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJRwkweDBkVUwJLyogTUFDIENvbmZpZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJRwkweDBlVUwJLyogUExTIENvbmZpZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJRwkweDBmVUwJLyogUEhZIENvbmZpZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0NISVBJRDEJMHgxMFVMCS8qIENoaXAtSUQsIGxvdyBiaXRzICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19DSElQSUQyCTB4MTFVTAkvKiBDaGlwLUlELCBoaWdoIGJpdHMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSUFDT05GSUcJMHgxMlVMCS8qIEludGVybmFsIEFkZHJlc3MgQ29uZmlnICAgICAgICAqLworCS8qIDB4MTNVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVJFR1NfRklMVEVSCTB4MTRVTAkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRVRIQUREUgkweDE1VUwJLyogT3VyIEV0aGVybmV0IEFkZHJlc3MgICAgICAgICAgICovCisJLyogMHgxNlVMLCByZXNlcnZlZCAqLworCS8qIDB4MTdVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVJFR1NfTVBDTlQJMHgxOFVMCS8qIE1pc3NlZCBQYWNrZXQgQ291bnQgICAgICAgICAgICAqLworCS8qIDB4MTlVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVJFR1NfUlBDTlQJMHgxYVVMCS8qIFJ1bnQgUGFja2V0IENvdW50ICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SQ0NOVAkweDFiVUwJLyogUlggQ29sbGlzaW9uIENvdW50ICAgICAgICAgICAgICovCisJLyogMHgxY1VMLCByZXNlcnZlZCAqLworI2RlZmluZSBNUkVHU19VVEVTVAkweDFkVUwJLyogVXNlciBUZXN0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JURVNUMQkweDFlVUwJLyogUmVzZXJ2ZWQgVGVzdCAxICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JURVNUMgkweDFmVUwJLyogUmVzZXJ2ZWQgVGVzdCAyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JFR19TSVpFCTB4MjBVTAorCisjZGVmaW5lIE1SRUdTX1RYRkNOVExfRFJFVFJZICAgICAgICAweDgwIC8qIFJldHJ5IGRpc2FibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZDTlRMX0RGQ1MgICAgICAgICAgMHgwOCAvKiBEaXNhYmxlIFRYIEZDUyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGQ05UTF9BVVRPUEFEICAgICAgIDB4MDEgLyogVFggYXV0byBwYWQgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9WQUxJRCAgICAgICAgIDB4ODAgLyogVFggdmFsaWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfVU5ERVJGTE9XICAgICAweDQwIC8qIFRYIHVuZGVyZmxvdyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX0xDT0xMICAgICAgICAgMHgyMCAvKiBUWCBsYXRlIGNvbGxpc2lvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9NUkVUUlkgICAgICAgIDB4MTAgLyogVFggPiAxIHJldHJpZXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfT1JFVFJZICAgICAgICAweDA4IC8qIFRYIDEgcmV0cnkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX1BERUZFUiAgICAgICAgMHgwNCAvKiBUWCBwa3QgZGVmZXJyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9DTE9TUyAgICAgICAgIDB4MDIgLyogVFggY2FycmllciBsb3N0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfUkVSUk9SICAgICAgICAweDAxIC8qIFRYIHJldHJ5IGVycm9yICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1RYUkNOVF9FREVGRVIgICAgICAgICAweDgwIC8qIFRYIEV4Y2VzcyBkZWZlcnMgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWFJDTlRfQ01BU0sgICAgICAgICAgMHgwZiAvKiBUWCByZXRyeSBjb3VudCAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19SWEZDTlRMX0xPV0xBVCAgICAgICAgMHgwOCAvKiBSWCBsb3cgbGF0ZW5jeSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGQ05UTF9BUkVKRUNUICAgICAgIDB4MDQgLyogUlggYWRkciBtYXRjaCByZWogICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRkNOVExfQVVUT1NUUklQICAgICAweDAxIC8qIFJYIGF1dG8gc3RyaXAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1JYRlNUQVRfT1ZFUkZMT1cgICAgICAweDgwIC8qIFJYIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZTVEFUX0xDT0xMICAgICAgICAgMHg0MCAvKiBSWCBsYXRlIGNvbGxpc2lvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVF9GRVJST1IgICAgICAgIDB4MjAgLyogUlggZnJhbWluZyBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRlNUQVRfRkNTRVJST1IgICAgICAweDEwIC8qIFJYIEZDUyBlcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZTVEFUX1JCQ05UICAgICAgICAgMHgwZiAvKiBSWCBtc2cgYnl0ZSBjb3VudCAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19GRkNOVF9SWCAgICAgICAgICAgICAgMHhmMCAvKiBSWCBGSUZPIGZyYW1lIGNudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkZDTlRfVFggICAgICAgICAgICAgIDB4MGYgLyogVFggRklGTyBmcmFtZSBjbnQgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfSVJFR19KQUJCRVIgICAgICAgICAgIDB4ODAgLyogSVJRIEphYmJlciBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUdfQkFCQkxFICAgICAgICAgICAweDQwIC8qIElSUSBCYWJibGUgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX0NPTEwgICAgICAgICAgICAgMHgyMCAvKiBJUlEgQ29sbGlzaW9uIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19SQ0NPICAgICAgICAgICAgIDB4MTAgLyogSVJRIENvbGxpc2lvbiBjbnQgb3ZlcmZsb3cgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUdfUlBLVENPICAgICAgICAgICAweDA4IC8qIElSUSBSdW50IHBhY2tldCBjb3VudCBvdmVyZmxvdyAqLworI2RlZmluZSBNUkVHU19JUkVHX01QS1RDTyAgICAgICAgICAgMHgwNCAvKiBJUlEgbWlzc2VkIHBhY2tldCBjbnQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19SWElSUSAgICAgICAgICAgIDB4MDIgLyogSVJRIFJYJ2QgYSBwYWNrZXQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUdfVFhJUlEgICAgICAgICAgICAweDAxIC8qIElSUSBUWCdkIGEgcGFja2V0ICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0lNQVNLX0JBQkJMRSAgICAgICAgICAweDQwIC8qIElNQVNLIEJhYmJsZSBlcnJvcnMgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JTUFTS19DT0xMICAgICAgICAgICAgMHgyMCAvKiBJTUFTSyBDb2xsaXNpb24gZXJyb3JzICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSU1BU0tfTVBLVENPICAgICAgICAgIDB4MDQgLyogSU1BU0sgTWlzc2VkIHBrdCBjbnQgb3ZlcmZsb3cgICovCisjZGVmaW5lIE1SRUdTX0lNQVNLX1JYSVJRICAgICAgICAgICAweDAyIC8qIElNQVNLIFJYIGludGVycnVwdHMgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JTUFTS19UWElSUSAgICAgICAgICAgMHgwMSAvKiBJTUFTSyBUWCBpbnRlcnJ1cHRzICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19QT0xMX1RYVkFMSUQgICAgICAgICAgMHg4MCAvKiBUWCBpcyB2YWxpZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUE9MTF9URFRSICAgICAgICAgICAgIDB4NDAgLyogVFggZGF0YSB0cmFuc2ZlciByZXF1ZXN0ICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BPTExfUkRUUiAgICAgICAgICAgICAweDIwIC8qIFJYIGRhdGEgdHJhbnNmZXIgcmVxdWVzdCAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfQlNXQVAgICAgICAgICAweDQwIC8qIEJ5dGUgU3dhcCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHXzRUUyAgICAgICAgICAgMHgwMCAvKiA0Ynl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR18xNlRTICAgICAgICAgIDB4MTAgLyogMTZieXRlIHRyYW5zbWl0IHN0YXJ0IHBvaW50ICAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfNjRUUyAgICAgICAgICAweDIwIC8qIDY0Ynl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHXzExMlRTICAgICAgICAgMHgzMCAvKiAxMTJieXRlIHRyYW5zbWl0IHN0YXJ0IHBvaW50ICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR19SRVNFVCAgICAgICAgIDB4MDEgLyogU1ctUmVzZXQgdGhlIE1BQ0UgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19UWEY4ICAgICAgICAgIDB4MDAgLyogVFggZmlmbyA4IHdyaXRlIGN5Y2xlcyAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfVFhGMzIgICAgICAgICAweDgwIC8qIFRYIGZpZm8gMzIgd3JpdGUgY3ljbGVzICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1RYRjE2ICAgICAgICAgMHg0MCAvKiBUWCBmaWZvIDE2IHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19SWEY2NCAgICAgICAgIDB4MjAgLyogUlggZmlmbyA2NCB3cml0ZSBjeWNsZXMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUlhGMzIgICAgICAgICAweDEwIC8qIFJYIGZpZm8gMzIgd3JpdGUgY3ljbGVzICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1JYRjE2ICAgICAgICAgMHgwMCAvKiBSWCBmaWZvIDE2IHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19URldVICAgICAgICAgIDB4MDggLyogVFggZmlmbyB3YXRlcm1hcmsgdXBkYXRlICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUkZXVSAgICAgICAgICAweDA0IC8qIFJYIGZpZm8gd2F0ZXJtYXJrIHVwZGF0ZSAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1RCRU5BQiAgICAgICAgMHgwMiAvKiBUWCBidXJzdCBlbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19SQkVOQUIgICAgICAgIDB4MDEgLyogUlggYnVyc3QgZW5hYmxlICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19QUk9NSVNDICAgICAgIDB4ODAgLyogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGUgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfVFBERElTQUIgICAgICAweDQwIC8qIFRYIDJwYXJ0IGRlZmVycmFsIGVuYWJsZSAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX01CQUVOQUIgICAgICAgMHgyMCAvKiBNb2RpZmllZCBiYWNrb2ZmIGVuYWJsZSAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19SUEFESVNBQiAgICAgIDB4MDggLyogUlggcGh5c2ljYWwgYWRkciBkaXNhYmxlICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUkJESVNBQiAgICAgICAweDA0IC8qIFJYIGJyb2FkY2FzdCBkaXNhYmxlICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX1RYRU5BQiAgICAgICAgMHgwMiAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19SWEVOQUIgICAgICAgIDB4MDEgLyogRW5hYmxlIHJlY2VpdmVyICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX1RYTVMgICAgICAgIDB4MDggLyogVFggbW9kZSBzZWxlY3QgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19HUFNJICAgICAgICAweDA2IC8qIFVzZSBHUFNJIGNvbm5lY3RvciAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfREFJICAgICAgICAgMHgwNCAvKiBVc2UgREFJIGNvbm5lY3RvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX1RQICAgICAgICAgIDB4MDIgLyogVXNlIFR3aXN0ZWRQYWlyIGNvbm5lY3RvciAgICAgICovCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19BVUkgICAgICAgICAweDAwIC8qIFVzZSBBVUkgY29ubmVjdG9yICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfSU9FTkFCICAgICAgMHgwMSAvKiBQTFMgSS9PIGVuYWJsZSAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfTFNUQVQgICAgICAgMHg4MCAvKiBMaW5rIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0xURVNURElTICAgIDB4NDAgLyogRGlzYWJsZSBsaW5rIHRlc3QgbG9naWMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19SWFBPTEFSSVRZICAweDIwIC8qIFJYIHBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfQVBDRElTQUIgICAgMHgxMCAvKiBBdXRvUG9sYXJpdHlDb3JyZWN0IGRpc2FiICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0xURU5BQiAgICAgIDB4MDggLyogU2VsZWN0IGxvdyB0aHJlc2hvbGQgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19BVVRPICAgICAgICAweDA0IC8qIENvbm5lY3RvciBwb3J0IGF1dG8tc2VsICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfUldVICAgICAgICAgMHgwMiAvKiBSZW1vdGUgV2FrZVVwICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0FXICAgICAgICAgIDB4MDEgLyogQXV0byBXYWtldXAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfSUFDT05GSUdfQUNITkdFICAgICAgIDB4ODAgLyogRG8gYWRkcmVzcyBjaGFuZ2UgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lBQ09ORklHX1BBUkVTRVQgICAgICAweDA0IC8qIFBoeXNpY2FsIGFkZHJlc3MgcmVzZXQgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JQUNPTkZJR19MQVJFU0VUICAgICAgMHgwMiAvKiBMb2dpY2FsIGFkZHJlc3MgcmVzZXQgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19VVEVTVF9SVFJFTkFCICAgICAgICAgMHg4MCAvKiBFbmFibGUgcmVzdiB0ZXN0IHJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfUlRSRElTQUIgICAgICAgIDB4NDAgLyogRGlzYWIgcmVzdiB0ZXN0IHJlZ2lzdGVyICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX1JQQUNDRVBUICAgICAgICAweDIwIC8qIEFjY2VwdCBydW50IHBhY2tldHMgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9GQ09MTCAgICAgICAgICAgMHgxMCAvKiBGb3JjZSBjb2xsaXNpb24gc3RhdHVzICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfRkNTRU5BQiAgICAgICAgIDB4MDggLyogRW5hYmxlIEZDUyBvbiBSWCAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX0lOVExPT1BNICAgICAgICAweDA2IC8qIEludGVybiBscGJhY2sgdy9NRU5ERUMgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9JTlRMT09QICAgICAgICAgMHgwNCAvKiBJbnRlcm4gbHBiYWNrICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfRVhUTE9PUCAgICAgICAgIDB4MDIgLyogRXh0ZXJuIGxwYmFjayAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX05PTE9PUCAgICAgICAgICAweDAwIC8qIE5vIGxvb3BiYWNrICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgcWVfcnhkIHsKKwl1MzIgcnhfZmxhZ3M7CisJdTMyIHJ4X2FkZHI7Cit9OworCisjZGVmaW5lIFJYRF9PV04gICAgICAweDgwMDAwMDAwIC8qIE93bmVyc2hpcC4gICAgICAqLworI2RlZmluZSBSWERfVVBEQVRFICAgMHgxMDAwMDAwMCAvKiBCZWluZyBVcGRhdGVkPyAgKi8KKyNkZWZpbmUgUlhEX0xFTkdUSCAgIDB4MDAwMDA3ZmYgLyogUGFja2V0IExlbmd0aC4gICovCisKK3N0cnVjdCBxZV90eGQgeworCXUzMiB0eF9mbGFnczsKKwl1MzIgdHhfYWRkcjsKK307CisKKyNkZWZpbmUgVFhEX09XTiAgICAgIDB4ODAwMDAwMDAgLyogT3duZXJzaGlwLiAgICAgICovCisjZGVmaW5lIFRYRF9TT1AgICAgICAweDQwMDAwMDAwIC8qIFN0YXJ0IE9mIFBhY2tldCAqLworI2RlZmluZSBUWERfRU9QICAgICAgMHgyMDAwMDAwMCAvKiBFbmQgT2YgUGFja2V0ICAgKi8KKyNkZWZpbmUgVFhEX1VQREFURSAgIDB4MTAwMDAwMDAgLyogQmVpbmcgVXBkYXRlZD8gICovCisjZGVmaW5lIFRYRF9MRU5HVEggICAweDAwMDAwN2ZmIC8qIFBhY2tldCBMZW5ndGguICAqLworCisjZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgIDI1NgorI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAyNTYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAxNgorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAxNgorCisjZGVmaW5lIE5FWFRfUlgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoUlhfUklOR19NQVhTSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfVFgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoVFhfUklOR19NQVhTSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfUlgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoUlhfUklOR19NQVhTSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoVFhfUklOR19NQVhTSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwocXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChxcCktPnR4X29sZCA8PSAocXApLT50eF9uZXcpID8gICAgICAgICAgICAgICAgICAgICBcCisJICAocXApLT50eF9vbGQgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAocXApLT50eF9uZXcgOiAgXAorCQkJICAgIChxcCktPnR4X29sZCAtIChxcCktPnR4X25ldyAtIDEpCisKK3N0cnVjdCBxZV9pbml0X2Jsb2NrIHsKKwlzdHJ1Y3QgcWVfcnhkIHFlX3J4ZFtSWF9SSU5HX01BWFNJWkVdOworCXN0cnVjdCBxZV90eGQgcWVfdHhkW1RYX1JJTkdfTUFYU0laRV07Cit9OworCisjZGVmaW5lIHFpYl9vZmZzZXQobWVtLCBlbGVtKSBcCisoKF9fdTMyKSgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBxZV9pbml0X2Jsb2NrICopMCktPm1lbVtlbGVtXSkpKSkKKworc3RydWN0IHN1bnFlOworCitzdHJ1Y3Qgc3VucWVjIHsKKwl2b2lkIF9faW9tZW0JCSpncmVnczsJCS8qIFFFQyBHbG9iYWwgUmVnaXN0ZXJzICAgICAgICAgKi8KKwlzdHJ1Y3Qgc3VucWUJCSpxZXNbNF07CS8qIEVhY2ggY2hpbGQgTUFDRSAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBxZWNfYnVyc3RzOwkvKiBTdXBwb3J0IGJ1cnN0IHNpemVzICAgICAgICAgICovCisJc3RydWN0IHNidXNfZGV2CQkqcWVjX3NkZXY7CS8qIFFFQydzIFNCVVMgZGV2aWNlICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc3VucWVjCQkqbmV4dF9tb2R1bGU7CS8qIExpc3Qgb2YgYWxsIFFFQ3MgaW4gc3lzdGVtICAgKi8KK307CisKKyNkZWZpbmUgUEtUX0JVRl9TWgkxNjY0CisjZGVmaW5lIFJYRF9QS1RfU1oJMTY2NAorCitzdHJ1Y3Qgc3VucWVfYnVmZmVycyB7CisJdTgJdHhfYnVmW1RYX1JJTkdfU0laRV1bUEtUX0JVRl9TWl07CisJdTgJX19wYWRbMl07CisJdTgJcnhfYnVmW1JYX1JJTkdfU0laRV1bUEtUX0JVRl9TWl07Cit9OworCisjZGVmaW5lIHFlYnVmX29mZnNldChtZW0sIGVsZW0pIFwKKygoX191MzIpKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IHN1bnFlX2J1ZmZlcnMgKikwKS0+bWVtW2VsZW1dWzBdKSkpKQorCitzdHJ1Y3Qgc3VucWUgeworCXZvaWQgX19pb21lbQkJCSpxY3JlZ3M7CQkvKiBRRUMgcGVyLWNoYW5uZWwgUmVnaXN0ZXJzICAgKi8KKwl2b2lkIF9faW9tZW0JCQkqbXJlZ3M7CQkvKiBQZXItY2hhbm5lbCBNQUNFIFJlZ2lzdGVycyAgKi8KKwlzdHJ1Y3QgcWVfaW5pdF9ibG9jayAgICAgIAkqcWVfYmxvY2s7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAgICAgICAqLworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgIAlxYmxvY2tfZHZtYTsJLyogUlggYW5kIFRYIGRlc2NyaXB0b3JzICAgICAgICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CQkvKiBQcm90ZWN0cyB0eGZ1bGwgc3RhdGUgICAgICAgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAJcnhfbmV3LCByeF9vbGQ7CS8qIFJYIHJpbmcgZXh0ZW50cwkgICAgICAgKi8KKwlpbnQJCQkgICAJdHhfbmV3LCB0eF9vbGQ7CS8qIFRYIHJpbmcgZXh0ZW50cwkgICAgICAgKi8KKwlzdHJ1Y3Qgc3VucWVfYnVmZmVycwkJKmJ1ZmZlcnM7CS8qIENQVSB2aXNpYmxlIGFkZHJlc3MuICAgICAgICAqLworCV9fdTMyCQkJCWJ1ZmZlcnNfZHZtYTsJLyogRFZNQSB2aXNpYmxlIGFkZHJlc3MuICAgICAgICovCisJc3RydWN0IHN1bnFlYwkJCSpwYXJlbnQ7CisJdTgJCQkJbWNvbmZpZzsJLyogQmFzZSBNQUNFIG1jb25maWcgdmFsdWUgICAgICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCW5ldF9zdGF0czsJLyogU3RhdGlzdGljYWwgY291bnRlcnMgICAgICAgICovCisJc3RydWN0IHNidXNfZGV2CQkJKnFlX3NkZXY7CS8qIFFFJ3MgU0JVUyBkZXZpY2Ugc3RydWN0ICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OwkJLyogUUUncyBuZXRkZXZpY2Ugc3RydWN0ICAgICAgICovCisJaW50CQkJCWNoYW5uZWw7CS8qIFdobyBhbSBJPyAgICAgICAgICAgICAgICAgICAqLworfTsKKworI2VuZGlmIC8qICEoX1NVTlFFX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90YzM1ODE1LmMgYi9kcml2ZXJzL25ldC90YzM1ODE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlYzlmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwpAQCAtMCwwICsxLDE3NDUgQEAKKy8qIHRjMzU4MTUuYzogQSBUT1NISUJBIFRDMzU4MTVDRiBQQ0kgMTAvMTAwTWJwcyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIAorICogICAgICAgICAgICAgICAgYWhlbm5lc3N5QG12aXN0YS5jb20KKyAqCisgKiBCYXNlZCBvbiBza2VsdG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0KKwkidGMzNTgxNS5jOnYwLjAwIDI2LzA3LzIwMDAgYnkgVG9zaGliYSBDb3Jwb3JhdGlvblxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIFRoZSBuYW1lIG9mIHRoZSBjYXJkLiBJcyB1c2VkIGZvciBtZXNzYWdlcyBhbmQgaW4gdGhlIHJlcXVlc3RzIGZvcgorICogaW8gcmVnaW9ucywgaXJxcyBhbmQgZG1hIGNoYW5uZWxzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBjYXJkbmFtZSA9ICJUQzM1ODE1Q0YiOworI2RlZmluZSBUQzM1ODE1X1BST0NfRU5UUlkgIm5ldC90YzM1ODE1IgorCisjZGVmaW5lIFRDMzU4MTVfTU9EVUxFX05BTUUgIlRDMzU4MTVDRiIKKyNkZWZpbmUgVFhfVElNRU9VVCAoNCpIWikKKworLyogRmlyc3QsIGEgZmV3IGRlZmluaXRpb25zIHRoYXQgdGhlIGJyYXZlIG1pZ2h0IGNoYW5nZS4gKi8KKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIFRDMzU4MTVfREVCVUcKKyNkZWZpbmUgVEMzNTgxNV9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGMzNTgxNV9kZWJ1ZyA9IFRDMzU4MTVfREVCVUc7CisKKyNkZWZpbmUgR0FUSEVSX1RYSU5UCS8qIE9uLURlbWFuZCBUeCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSB2dG9ub2NhY2hlKHApCUtTRUcxQUREUih2aXJ0X3RvX3BoeXMocCkpCisKKy8qCisgKiBSZWdpc3RlcnMKKyAqLworc3RydWN0IHRjMzU4MTVfcmVncyB7CisJdm9sYXRpbGUgX191MzIgRE1BX0N0bDsJCS8qIDB4MDAgKi8KKwl2b2xhdGlsZSBfX3UzMiBUeEZybVB0cjsKKwl2b2xhdGlsZSBfX3UzMiBUeFRocnNoOworCXZvbGF0aWxlIF9fdTMyIFR4UG9sbEN0cjsKKwl2b2xhdGlsZSBfX3UzMiBCTEZybVB0cjsKKwl2b2xhdGlsZSBfX3UzMiBSeEZyYWdTaXplOworCXZvbGF0aWxlIF9fdTMyIEludF9FbjsKKwl2b2xhdGlsZSBfX3UzMiBGREFfQmFzOworCXZvbGF0aWxlIF9fdTMyIEZEQV9MaW07CQkvKiAweDIwICovCisJdm9sYXRpbGUgX191MzIgSW50X1NyYzsKKwl2b2xhdGlsZSBfX3UzMiB1bnVzZWQwWzJdOworCXZvbGF0aWxlIF9fdTMyIFBhdXNlQ250OworCXZvbGF0aWxlIF9fdTMyIFJlbVBhdUNudDsKKwl2b2xhdGlsZSBfX3UzMiBUeEN0bEZybVN0YXQ7CisJdm9sYXRpbGUgX191MzIgdW51c2VkMTsKKwl2b2xhdGlsZSBfX3UzMiBNQUNfQ3RsOwkJLyogMHg0MCAqLworCXZvbGF0aWxlIF9fdTMyIENBTV9DdGw7CisJdm9sYXRpbGUgX191MzIgVHhfQ3RsOworCXZvbGF0aWxlIF9fdTMyIFR4X1N0YXQ7CisJdm9sYXRpbGUgX191MzIgUnhfQ3RsOworCXZvbGF0aWxlIF9fdTMyIFJ4X1N0YXQ7CisJdm9sYXRpbGUgX191MzIgTURfRGF0YTsKKwl2b2xhdGlsZSBfX3UzMiBNRF9DQTsKKwl2b2xhdGlsZSBfX3UzMiBDQU1fQWRyOwkJLyogMHg2MCAqLworCXZvbGF0aWxlIF9fdTMyIENBTV9EYXRhOworCXZvbGF0aWxlIF9fdTMyIENBTV9FbmE7CisJdm9sYXRpbGUgX191MzIgUFJPTV9DdGw7CisJdm9sYXRpbGUgX191MzIgUFJPTV9EYXRhOworCXZvbGF0aWxlIF9fdTMyIEFsZ25fQ250OworCXZvbGF0aWxlIF9fdTMyIENSQ19DbnQ7CisJdm9sYXRpbGUgX191MzIgTWlzc19DbnQ7Cit9OworCisvKgorICogQml0IGFzc2lnbm1lbnRzCisgKi8KKy8qIERNQV9DdGwgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRE1BX0ludE1hc2sgICAgICAgICAgICAweDAwMDQwMDAwIC8qIDE6SW50ZXJ1cHQgbWFzayAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1NXSW50UmVxICAgICAgICAgICAweDAwMDIwMDAwIC8qIDE6U29mdHdhcmUgSW50ZXJydXB0IHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgRE1BX1R4V2FrZVVwICAgICAgICAgICAweDAwMDEwMDAwIC8qIDE6VHJhbnNtaXQgV2FrZSBVcCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1J4QmlnRSAgICAgICAgICAgICAweDAwMDA4MDAwIC8qIDE6UmVjZWl2ZSBCaWcgRW5kaWFuICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1R4QmlnRSAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIDE6VHJhbnNtaXQgQmlnIEVuZGlhbiAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1Rlc3RNb2RlICAgICAgICAgICAweDAwMDAyMDAwIC8qIDE6VGVzdCBNb2RlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1Bvd3JNZ21udCAgICAgICAgICAweDAwMDAxMDAwIC8qIDE6UG93ZXIgTWFuYWdlbWVudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0RtQnVyc3RfTWFzayAgICAgICAweDAwMDAwMWZjIC8qIERNQSBCdXJzdCBzaXplICAgICAgICAgICAgICAgICAgKi8KKworLyogUnhGcmFnU2l6ZSBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSeEZyYWdfRW5QYWNrICAgICAgICAgIDB4MDAwMDgwMDAgLyogMTpFbmFibGUgUGFja2luZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeEZyYWdfTWluRnJhZ01hc2sgICAgIDB4MDAwMDBmZmMgLyogTWluaW11bSBGcmFnbWVudCAgICAgICAgICAgICAgICAqLworCisvKiBNQUNfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE1BQ19MaW5rMTAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiAxOkxpbmsgU3RhdHVzIDEwTWJpdHMgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19Fbk1pc3NSb2xsICAgICAgICAgMHgwMDAwMjAwMCAvKiAxOkVuYWJsZSBNaXNzZWQgUm9sbCAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19NaXNzUm9sbCAgICAgICAgICAgMHgwMDAwMDQwMCAvKiAxOk1pc3NlZCBSb2xsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19Mb29wMTAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvKiAxOkxvb3AgMTAgTWJwcyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19Db25uX0F1dG8gICAgICAgICAgMHgwMDAwMDAwMCAvKjAwOkNvbm5lY3Rpb24gbW9kZSAoQXV0b21hdGljKSAgICovCisjZGVmaW5lIE1BQ19Db25uXzEwTSAgICAgICAgICAgMHgwMDAwMDAyMCAvKjAxOiAgICAgICAgICAgICAgICAoMTBNYnBzIGVuZGVjKSovCisjZGVmaW5lIE1BQ19Db25uX01sbCAgICAgICAgICAgMHgwMDAwMDA0MCAvKjEwOiAgICAgICAgICAgICAgICAoTWxsIGNsb2NrKSAgICovCisjZGVmaW5lIE1BQ19NYWNMb29wICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiAxOk1BQyBMb29wYmFjayAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19GdWxsRHVwICAgICAgICAgICAgMHgwMDAwMDAwOCAvKiAxOkZ1bGwgRHVwbGV4IDA6SGFsZiBEdXBsZXggICAgICovCisjZGVmaW5lIE1BQ19SZXNldCAgICAgICAgICAgICAgMHgwMDAwMDAwNCAvKiAxOlNvZnR3YXJlIFJlc2V0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19IYWx0SW1tICAgICAgICAgICAgMHgwMDAwMDAwMiAvKiAxOkhhbHQgSW1tZWRpYXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ19IYWx0UmVxICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiAxOkhhbHQgcmVxdWVzdCAgICAgICAgICAgICAgICAgICovCisKKy8qIFBST01fQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUFJPTV9CdXN5ICAgICAgICAgICAgICAweDAwMDA4MDAwIC8qIDE6QnVzeSAoU3RhcnQgT3BlcmF0aW9uKSAgICAgICAgKi8KKyNkZWZpbmUgUFJPTV9SZWFkICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qMTA6UmVhZCBvcGVyYXRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFJPTV9Xcml0ZSAgICAgICAgICAgICAweDAwMDAyMDAwIC8qMDE6V3JpdGUgb3BlcmF0aW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFJPTV9FcmFzZSAgICAgICAgICAgICAweDAwMDA2MDAwIC8qMTE6RXJhc2Ugb3BlcmF0aW9uICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMDA6RW5hYmxlIG9yIERpc2FibGUgV3JpdHRpbmcsICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgYXMgc3BlY2lmaWVkIGluIFBST01fQWRkci4gKi8KKyNkZWZpbmUgUFJPTV9BZGRyX0VuYSAgICAgICAgICAweDAwMDAwMDMwIC8qMTF4eHh4OlBST00gV3JpdGUgZW5hYmxlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMDB4eHh4OiAgICAgICAgICAgZGlzYWJsZSAgICAgICAgKi8KKworLyogQ0FNX0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBDQU1fQ29tcEVuICAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpDQU0gQ29tcGFyZSBFbmFibGUgICAgICAgICAgICAqLworI2RlZmluZSBDQU1fTmVnQ0FNICAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpSZWplY3QgcGFja2V0cyBDQU0gcmVjb2duaXplcywqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgIGFjY2VwdCBvdGhlciAqLworI2RlZmluZSBDQU1fQnJvYWRBY2MgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpCcm9hZGNhc3QgYXNzZXB0ICAgICAgICAgICAgICAqLworI2RlZmluZSBDQU1fR3JvdXBBY2MgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpNdWx0aWNhc3QgYXNzZXB0ICAgICAgICAgICAgICAqLworI2RlZmluZSBDQU1fU3RhdGlvbkFjYyAgICAgICAgIDB4MDAwMDAwMDEgLyogMTp1bmljYXN0IGFjY2VwdCAgICAgICAgICAgICAgICAqLworCisvKiBDQU1fRW5hIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENBTV9FTlRSWV9NQVggICAgICAgICAgICAgICAgICAyMSAgIC8qIENBTSBEYXRhIGVudHJ5IG1heCBjb3VudCAgICAgICovCisjZGVmaW5lIENBTV9FbmFfTWFzayAoKDE8PENBTV9FTlRSWV9NQVgpLTEpIC8qIENBTSBFbmFibGUgYml0cyAoTWF4IDIxYml0cykgICovCisjZGVmaW5lIENBTV9FbmFfQml0KGluZGV4KSAgICAgICAgICgxPDwoaW5kZXgpKQorI2RlZmluZSBDQU1fRU5UUllfREVTVElOQVRJT04JMAorI2RlZmluZSBDQU1fRU5UUllfU09VUkNFCTEKKyNkZWZpbmUgQ0FNX0VOVFJZX01BQ0NUTAkyMAorCisvKiBUeF9DdGwgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFR4X0VuICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiAxOlRyYW5zbWl0IGVuYWJsZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1R4SGFsdCAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvKiAxOlRyYW5zbWl0IEhhbHQgUmVxdWVzdCAgICAgICAgICovCisjZGVmaW5lIFR4X05vUGFkICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAvKiAxOlN1cHByZXNzIFBhZGRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X05vQ1JDICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAvKiAxOlN1cHByZXNzIFBhZGRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0ZCYWNrICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiAxOkZhc3QgQmFjay1vZmYgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0VuVW5kZXIgICAgICAgICAgICAgMHgwMDAwMDEwMCAvKiAxOkVuYWJsZSBVbmRlcnJ1biAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0VuRXhEZWZlciAgICAgICAgICAgMHgwMDAwMDIwMCAvKiAxOkVuYWJsZSBFeGNlc3NpdmUgRGVmZXJyYWwgICAgICovCisjZGVmaW5lIFR4X0VuTENhcnIgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiAxOkVuYWJsZSBMb3N0IENhcnJpZXIgICAgICAgICAgICovCisjZGVmaW5lIFR4X0VuRXhDb2xsICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxOkVuYWJsZSBFeGNlc3NpdmUgQ29sbGlzaW9uICAgICovCisjZGVmaW5lIFR4X0VuTGF0ZUNvbGwgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOkVuYWJsZSBMYXRlIENvbGxpc2lvbiAgICAgICAgICovCisjZGVmaW5lIFR4X0VuVHhQYXIgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiAxOkVuYWJsZSBUcmFuc21pdCBQYXJpdHkgICAgICAgICovCisjZGVmaW5lIFR4X0VuQ29tcCAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiAxOkVuYWJsZSBDb21wbGV0aW9uICAgICAgICAgICAgICovCisKKy8qIFR4X1N0YXQgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgVHhfVHhDb2xsX01BU0sgICAgICAgICAweDAwMDAwMDBGIC8qIFR4IENvbGxpc2lvbiBDb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfRXhDb2xsICAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfVFhEZWZlciAgICAgICAgICAgICAweDAwMDAwMDIwIC8qIFRyYW5zbWl0IERlZmVyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfUGF1c2VkICAgICAgICAgICAgICAweDAwMDAwMDQwIC8qIFRyYW5zbWl0IFBhdXNlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfSW50VHggICAgICAgICAgICAgICAweDAwMDAwMDgwIC8qIEludGVycnVwdCBvbiBUeCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfVW5kZXIgICAgICAgICAgICAgICAweDAwMDAwMTAwIC8qIFVuZGVycnVuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfRGVmZXIgICAgICAgICAgICAgICAweDAwMDAwMjAwIC8qIERlZmVycmFsICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfTkNhcnIgICAgICAgICAgICAgICAweDAwMDAwNDAwIC8qIE5vIENhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfMTBTdGF0ICAgICAgICAgICAgICAweDAwMDAwODAwIC8qIDEwTWJwcyBTdGF0dXMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfTGF0ZUNvbGwgICAgICAgICAgICAweDAwMDAxMDAwIC8qIExhdGUgQ29sbGlzaW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfVHhQYXIgICAgICAgICAgICAgICAweDAwMDAyMDAwIC8qIFR4IFBhcml0eSBFcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfQ29tcCAgICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIENvbXBsZXRpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfSGFsdGVkICAgICAgICAgICAgICAweDAwMDA4MDAwIC8qIFR4IEhhbHRlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhfU1FFcnIgICAgICAgICAgICAgICAweDAwMDEwMDAwIC8qIFNpZ25hbCBRdWFsaXR5IEVycm9yKFNRRSkgICAgICAgKi8KKworLyogUnhfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSeF9Fbkdvb2QgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogMTpFbmFibGUgR29vZCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9FblJ4UGFyICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogMTpFbmFibGUgUmVjZWl2ZSBQYXJpdHkgICAgICAgICAqLworI2RlZmluZSBSeF9FbkxvbmdFcnIgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpFbmFibGUgTG9uZyBFcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Fbk92ZXIgICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpFbmFibGUgT3ZlckZsb3cgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9FbkNSQ0VyciAgICAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpFbmFibGUgQ1JDIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9FbkFsaWduICAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpFbmFibGUgQWxpZ25tZW50ICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9JZ25vcmVDUkMgICAgICAgICAgIDB4MDAwMDAwNDAgLyogMTpJZ25vcmUgQ1JDIFZhbHVlICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9TdHJpcENSQyAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpTdHJpcCBDUkMgVmFsdWUgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9TaG9ydEVuICAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpTaG9ydCBFbmFibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Mb25nRW4gICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpMb25nIEVuYWJsZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9SeEhhbHQgICAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpSZWNlaXZlIEhhbHQgUmVxdWVzdCAgICAgICAgICAqLworI2RlZmluZSBSeF9SeEVuICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpSZWNlaXZlIEludHJydXB0IEVuYWJsZSAgICAgICAqLworCisvKiBSeF9TdGF0IGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJ4X0hhbHRlZCAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiBSeCBIYWx0ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0dvb2QgICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBSeCBHb29kICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X1J4UGFyICAgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiBSeCBQYXJpdHkgRXJyb3IgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDAwMTAwMCAgICBub3QgdXNlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0xvbmdFcnIgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiBSeCBMb25nIEVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X092ZXIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiBSeCBPdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0NSQ0VyciAgICAgICAgICAgICAgMHgwMDAwMDIwMCAvKiBSeCBDUkMgRXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0FsaWduICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvKiBSeCBBbGlnbm1lbnQgRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4XzEwU3RhdCAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvKiBSeCAxME1icHMgU3RhdHVzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0ludFJ4ICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAvKiBSeCBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJ4X0N0bFJlY2QgICAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBSeCBDb250cm9sIFJlY2VpdmUgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUnhfU3RhdF9NYXNrICAgICAgICAgICAweDAwMDBFRkMwIC8qIFJ4IEFsbCBTdGF0dXMgTWFzayAgICAgICAgICAgICAgKi8KKworLyogSW50X0VuIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJbnRfTlJBYnRFbiAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpOb24tcmVjb3ZlcmFibGUgQWJvcnQgRW5hYmxlICAqLworI2RlZmluZSBJbnRfVHhDdGxDbXBFbiAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpUcmFuc21pdCBDb250cm9sIENvbXBsZXRlIEVuYWJsZSAqLworI2RlZmluZSBJbnRfRG1QYXJFcnJFbiAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpETUEgUGFyaXR5IEVycm9yIEVuYWJsZSAgICAgICAqLworI2RlZmluZSBJbnRfRFBhckRFbiAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpEYXRhIFBhcml0eSBFcnJvciBFbmFibGUgICAgICAqLworI2RlZmluZSBJbnRfRWFyTm90RW4gICAgICAgICAgIDB4MDAwMDAwODAgLyogMTpFYXJseSBOb3RpZnkgRW5hYmxlICAgICAgICAgICAqLworI2RlZmluZSBJbnRfRFBhckVyckVuICAgICAgICAgIDB4MDAwMDAwNDAgLyogMTpEZXRlY3RlZCBQYXJpdHkgRXJyb3IgRW5hYmxlICAqLworI2RlZmluZSBJbnRfU1N5c0VyckVuICAgICAgICAgIDB4MDAwMDAwMjAgLyogMTpTaWduYWxsZWQgU3lzdGVtIEVycm9yIEVuYWJsZSAqLworI2RlZmluZSBJbnRfUk1hc0FidEVuICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpSZWNlaXZlZCBNYXN0ZXIgQWJvcnQgRW5hYmxlICAqLworI2RlZmluZSBJbnRfUlRhcmdBYnRFbiAgICAgICAgIDB4MDAwMDAwMDggLyogMTpSZWNlaXZlZCBUYXJnZXQgQWJvcnQgRW5hYmxlICAqLworI2RlZmluZSBJbnRfU1RhcmdBYnRFbiAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpTaWduYWxsZWQgVGFyZ2V0IEFib3J0IEVuYWJsZSAqLworI2RlZmluZSBJbnRfQkxFeEVuICAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpCdWZmZXIgTGlzdCBFeGhhdXN0ZWQgRW5hYmxlICAqLworI2RlZmluZSBJbnRfRkRBRXhFbiAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpGcmVlIERlc2NyaXB0b3IgQXJlYSAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICBFeGhhdXN0ZWQgRW5hYmxlICAqLworCisvKiBJbnRfU3JjIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEludF9OUmFidCAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiAxOk5vbiBSZWNvdmVyYWJsZSBlcnJvciAgICAgICAgICovCisjZGVmaW5lIEludF9EbVBhckVyclN0YXQgICAgICAgMHgwMDAwMjAwMCAvKiAxOkRNQSBQYXJpdHkgRXJyb3IgJiBDbGVhciAgICAgICovCisjZGVmaW5lIEludF9CTEV4ICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOkJ1ZmZlciBMaXN0IEVtcHR5ICYgQ2xlYXIgICAgICovCisjZGVmaW5lIEludF9GREFFeCAgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxOkZEQSBFbXB0eSAmIENsZWFyICAgICAgICAgICAgICovCisjZGVmaW5lIEludF9JbnROUkFidCAgICAgICAgICAgMHgwMDAwMDQwMCAvKiAxOk5vbiBSZWNvdmVyYWJsZSBBYm9ydCAgICAgICAgICovCisjZGVmaW5lCUludF9JbnRDbXAgICAgICAgICAgICAgMHgwMDAwMDIwMCAvKiAxOk1BQyBjb250cm9sIHBhY2tldCBjb21wbGV0ZSAgICovCisjZGVmaW5lIEludF9JbnRFeEJEICAgICAgICAgICAgMHgwMDAwMDEwMCAvKiAxOkludGVycnVwdCBFeHRyYSBCRCAmIENsZWFyICAgICovCisjZGVmaW5lIEludF9EbVBhckVyciAgICAgICAgICAgMHgwMDAwMDA4MCAvKiAxOkRNQSBQYXJpdHkgRXJyb3IgJiBDbGVhciAgICAgICovCisjZGVmaW5lIEludF9JbnRFYXJOb3QgICAgICAgICAgMHgwMDAwMDA0MCAvKiAxOlJlY2VpdmUgRGF0YSB3cml0ZSAmIENsZWFyICAgICovCisjZGVmaW5lIEludF9TV0ludCAgICAgICAgICAgICAgMHgwMDAwMDAyMCAvKiAxOlNvZnR3YXJlIHJlcXVlc3QgJiBDbGVhciAgICAgICovCisjZGVmaW5lIEludF9JbnRCTEV4ICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiAxOkJ1ZmZlciBMaXN0IEVtcHR5ICYgQ2xlYXIgICAgICovCisjZGVmaW5lIEludF9JbnRGREFFeCAgICAgICAgICAgMHgwMDAwMDAwOCAvKiAxOkZEQSBFbXB0eSAmIENsZWFyICAgICAgICAgICAgICovCisjZGVmaW5lIEludF9JbnRQQ0kgICAgICAgICAgICAgMHgwMDAwMDAwNCAvKiAxOlBDSSBjb250cm9sbGVyICYgQ2xlYXIgICAgICAgICovCisjZGVmaW5lIEludF9JbnRNYWNSeCAgICAgICAgICAgMHgwMDAwMDAwMiAvKiAxOlJ4IGNvbnRyb2xsZXIgJiBDbGVhciAgICAgICAgICovCisjZGVmaW5lIEludF9JbnRNYWNUeCAgICAgICAgICAgMHgwMDAwMDAwMSAvKiAxOlR4IGNvbnRyb2xsZXIgJiBDbGVhciAgICAgICAgICovCisKKy8qIE1EX0NBIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTURfQ0FfUHJlU3VwICAgICAgICAgICAweDAwMDAxMDAwIC8qIDE6UHJlYW1ibGUgU3VwcmVzcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTURfQ0FfQnVzeSAgICAgICAgICAgICAweDAwMDAwODAwIC8qIDE6QnVzeSAoU3RhcnQgT3BlcmF0aW9uKSAgICAgICAgKi8KKyNkZWZpbmUgTURfQ0FfV3IgICAgICAgICAgICAgICAweDAwMDAwNDAwIC8qIDE6V3JpdGUgMDpSZWFkICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBNSUkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNSUlfQ09OVFJPTCAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTUlJX1NUQVRVUyAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1JSV9QSFlfSUQwICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlfUEhZX0lEMSAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTUlJX0FOQVIgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIE1JSV9BTkxQQVIgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBNSUlfQU5FUiAgICAgICAgICAgICAgICAweDAwMDYKKy8qIE1JSSBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgTUlJQ05UTF9GRFggICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIE1JSUNOVExfUlNUX0FVVE8gICAgICAgIDB4MDIwMAorI2RlZmluZSBNSUlDTlRMX0lTT0xBVEUgICAgICAgICAweDA0MDAKKyNkZWZpbmUgTUlJQ05UTF9QV1JEV04gICAgICAgICAgMHgwODAwCisjZGVmaW5lIE1JSUNOVExfQVVUTyAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBNSUlDTlRMX1NQRUVEICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTUlJQ05UTF9MUEJLICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1JSUNOVExfUkVTRVQgICAgICAgICAgIDB4ODAwMAorLyogTUlJIFN0YXR1cyByZWdpc3RlciBiaXQgc2lnbmlmaWNhbmNlLiAqLworI2RlZmluZSBNSUlTVEFUX0VYVCAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUlJU1RBVF9KQUIgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1JSVNUQVRfTElOSyAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNSUlTVEFUX0NBTl9BVVRPICAgICAgICAweDAwMDgKKyNkZWZpbmUgTUlJU1RBVF9GQVVMVCAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIE1JSVNUQVRfQVVUT19ET05FICAgICAgIDB4MDAyMAorI2RlZmluZSBNSUlTVEFUX0NBTl9UICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVF9GRFggICAgICAgMHgxMDAwCisjZGVmaW5lIE1JSVNUQVRfQ0FOX1RYICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBNSUlTVEFUX0NBTl9UWF9GRFggICAgICAweDQwMDAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVDQgICAgICAgICAgMHg4MDAwCisvKiBNSUkgQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24vUmVtb3RlRW5kIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgTUlJX0FOX1RYX0ZEWCAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIE1JSV9BTl9UWF9IRFggICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBNSUlfQU5fMTBfRkRYICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgTUlJX0FOXzEwX0hEWCAgICAgICAgICAgMHgwMDIwCisKKworLyoKKyAqIERlc2NyaXB0b3JzCisgKi8KKworLyogRnJhbWUgZGVzY3JpcHRlciAqLworc3RydWN0IEZEZXNjIHsKKwl2b2xhdGlsZSBfX3UzMiBGRE5leHQ7CisJdm9sYXRpbGUgX191MzIgRkRTeXN0ZW07CisJdm9sYXRpbGUgX191MzIgRkRTdGF0OworCXZvbGF0aWxlIF9fdTMyIEZEQ3RsOworfTsKKworLyogQnVmZmVyIGRlc2NyaXB0ZXIgKi8KK3N0cnVjdCBCRGVzYyB7CisJdm9sYXRpbGUgX191MzIgQnVmZkRhdGE7CisJdm9sYXRpbGUgX191MzIgQkRDdGw7Cit9OworCisjZGVmaW5lIEZEX0FMSUdOCTE2CisKKy8qIEZyYW1lIERlc2NyaXB0ZXIgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRkRfRkRMZW5ndGhfTUFTSyAgICAgICAweDAwMDBGRkZGIC8qIExlbmd0aCBNQVNLICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRfQkRDbnRfTUFTSyAgICAgICAgICAweDAwMUYwMDAwIC8qIEJEIGNvdW50IE1BU0sgaW4gRkQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRfRnJtT3B0X01BU0sgICAgICAgICAweDdDMDAwMDAwIC8qIEZyYW1lIG9wdGlvbiBNQVNLICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkRfRnJtT3B0X0JpZ0VuZGlhbiAgICAweDQwMDAwMDAwIC8qIFR4L1J4ICovCisjZGVmaW5lIEZEX0ZybU9wdF9JbnRUeCAgICAgICAgMHgyMDAwMDAwMCAvKiBUeCBvbmx5ICovCisjZGVmaW5lIEZEX0ZybU9wdF9Ob0NSQyAgICAgICAgMHgxMDAwMDAwMCAvKiBUeCBvbmx5ICovCisjZGVmaW5lIEZEX0ZybU9wdF9Ob1BhZGRpbmcgICAgMHgwODAwMDAwMCAvKiBUeCBvbmx5ICovCisjZGVmaW5lIEZEX0ZybU9wdF9QYWNraW5nICAgICAgMHgwNDAwMDAwMCAvKiBSeCBvbmx5ICovCisjZGVmaW5lIEZEX0Nvd25zRkQgICAgICAgICAgICAgMHg4MDAwMDAwMCAvKiBGRCBDb250cm9sbGVyIG93bmVyIGJpdCAgICAgICAgICovCisjZGVmaW5lIEZEX05leHRfRU9MICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBGRCBFT0wgaW5kaWNhdG9yICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0JEQ250X1NISUZUICAgICAgICAgMTYKKworLyogQnVmZmVyIERlc2NyaXB0ZXIgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBCRF9CdWZmTGVuZ3RoX01BU0sgICAgIDB4MDAwMEZGRkYgLyogUmVjaWV2ZSBEYXRhIFNpemUgICAgICAgICAgICAgICAqLworI2RlZmluZSBCRF9SeEJESURfTUFTSyAgICAgICAgIDB4MDBGRjAwMDAgLyogQkQgSUQgTnVtYmVyIE1BU0sgICAgICAgICAgICAgICAqLworI2RlZmluZSBCRF9SeEJEU2VxTl9NQVNLICAgICAgIDB4N0YwMDAwMDAgLyogUnggQkQgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAqLworI2RlZmluZSBCRF9Db3duc0JEICAgICAgICAgICAgIDB4ODAwMDAwMDAgLyogQkQgQ29udHJvbGxlciBvd25lciBiaXQgICAgICAgICAqLworI2RlZmluZSBCRF9SeEJESURfU0hJRlQgICAgICAgIDE2CisjZGVmaW5lIEJEX1J4QkRTZXFOX1NISUZUICAgICAgMjQKKworCisvKiBTb21lIHVzZWZ1bCBjb25zdGFudHMuICovCisjdW5kZWYgTk9fQ0hFQ0tfQ0FSUklFUgkvKiBEb2VzIG5vdCBjaGVjayBOby1DYXJyaWVyIHdpdGggVFAgKi8KKworI2lmZGVmIE5PX0NIRUNLX0NBUlJJRVIKKyNkZWZpbmUgVFhfQ1RMX0NNRAkoVHhfRW5Db21wIHwgVHhfRW5UeFBhciB8IFR4X0VuTGF0ZUNvbGwgfCBcCisJVHhfRW5FeENvbGwgfCBUeF9FbkxDYXJyIHwgVHhfRW5FeERlZmVyIHwgVHhfRW5VbmRlciB8IFwKKwlUeF9FbikJLyogbWF5YmUgIDB4N2QwMSAqLworI2Vsc2UKKyNkZWZpbmUgVFhfQ1RMX0NNRAkoVHhfRW5Db21wIHwgVHhfRW5UeFBhciB8IFR4X0VuTGF0ZUNvbGwgfCBcCisJVHhfRW5FeENvbGwgfCBUeF9FbkV4RGVmZXIgfCBUeF9FblVuZGVyIHwgXAorCVR4X0VuKQkvKiBtYXliZSAgMHg3ZjAxICovCisjZW5kaWYKKyNkZWZpbmUgUlhfQ1RMX0NNRAkoUnhfRW5Hb29kIHwgUnhfRW5SeFBhciB8IFJ4X0VuTG9uZ0VyciB8IFJ4X0VuT3ZlciBcCisJfCBSeF9FbkNSQ0VyciB8IFJ4X0VuQWxpZ24gfCBSeF9SeEVuKQkvKiBtYXliZSAweDZmMDEgKi8KKworI2RlZmluZSBJTlRfRU5fQ01EICAoSW50X05SQWJ0RW4gfCBcCisJIEludF9EUGFyREVuIHwgSW50X0RQYXJFcnJFbiB8IFwKKwlJbnRfU1N5c0VyckVuICB8IEludF9STWFzQWJ0RW4gfCBJbnRfUlRhcmdBYnRFbiB8IFwKKwlJbnRfU1RhcmdBYnRFbiB8IFwKKwlJbnRfQkxFeEVuICB8IEludF9GREFFeEVuKSAvKiBtYXliZSAweGI3ZiovCisKKy8qIFR1bmluZyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIERNQV9CVVJTVF9TSVpFCTMyCisjZGVmaW5lIFRYX1RIUkVTSE9MRAkxMDI0CisKKyNkZWZpbmUgRkRfUEFHRV9OVU0gMgorI2RlZmluZSBGRF9QQUdFX09SREVSIDEKKy8qIDE2ICsgUlhfQlVGX1BBR0VTICogOCArIFJYX0ZEX05VTSAqIDE2ICsgVFhfRkRfTlVNICogMzIgPD0gUEFHRV9TSVpFKjIgKi8KKyNkZWZpbmUgUlhfQlVGX1BBR0VTCTgJLyogPj0gMiAqLworI2RlZmluZSBSWF9GRF9OVU0JMjUwCS8qID49IDMyICovCisjZGVmaW5lIFRYX0ZEX05VTQkxMjgKKworc3RydWN0IFR4RkQgeworCXN0cnVjdCBGRGVzYyBmZDsKKwlzdHJ1Y3QgQkRlc2MgYmQ7CisJc3RydWN0IEJEZXNjIHVudXNlZDsKK307CisKK3N0cnVjdCBSeEZEIHsKKwlzdHJ1Y3QgRkRlc2MgZmQ7CisJc3RydWN0IEJEZXNjIGJkWzBdOwkvKiB2YXJpYWJsZSBsZW5ndGggKi8KK307CisKK3N0cnVjdCBGckZEIHsKKwlzdHJ1Y3QgRkRlc2MgZmQ7CisJc3RydWN0IEJEZXNjIGJkW1JYX0JVRl9QQUdFU107Cit9OworCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRjX3JlYWRsKHZvbGF0aWxlIF9fdTMyICphZGRyKTsKK2V4dGVybiB2b2lkIHRjX3dyaXRlbCh1bnNpZ25lZCBsb25nIGRhdGEsIHZvbGF0aWxlIF9fdTMyICphZGRyKTsKKworZG1hX2FkZHJfdCBwcml2X2RtYV9oYW5kbGU7CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IHRjMzU4MTVfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKworCS8qIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgeworCQlpbnQgbWF4X3R4X3FsZW47CisJCWludCB0eF9pbnRzOworCQlpbnQgcnhfaW50czsKKwl9IGxzdGF0czsKKworCWludCB0YnVzeTsKKwlpbnQgb3B0aW9uOworI2RlZmluZSBUQzM1ODE1X09QVF9BVVRPCTB4MDAKKyNkZWZpbmUgVEMzNTgxNV9PUFRfMTBNCTB4MDEKKyNkZWZpbmUgVEMzNTgxNV9PUFRfMTAwTQkweDAyCisjZGVmaW5lIFRDMzU4MTVfT1BUX0ZVTExEVVAJMHgwNAorCWludCBsaW5rc3BlZWQ7CS8qIDEwIG9yIDEwMCAqLworCWludCBmdWxsZHVwbGV4OworCisJLyoKKwkgKiBUcmFuc21pdHRpbmc6IEJhdGNoIE1vZGUuCisJICoJMSBCRCBpbiAxIFR4RkQuCisJICogUmVjZWl2aW5nOiBQYWNraW5nIE1vZGUuCisJICoJMSBjaXJjdWxhciBGRCBmb3IgRnJlZSBCdWZmZXIgTGlzdC4KKwkgKglSWF9CVUdfUEFHRVMgQkQgaW4gRnJlZSBCdWZmZXIgRkQuCisJICoJT25lIEZyZWUgQnVmZmVyIEJEIGhhcyBQQUdFX1NJWkUgZGF0YSBidWZmZXIuCisJICovCisgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWRtYV9hZGRyX3QgZmRfYnVmX2RtYV9oYW5kbGU7CisJdm9pZCAqIGZkX2J1ZjsJLyogZm9yIFR4RkQsIFR4RkQsIEZyRkQgKi8KKwlzdHJ1Y3QgVHhGRCAqdGZkX2Jhc2U7CisJaW50IHRmZF9zdGFydDsKKwlpbnQgdGZkX2VuZDsKKwlzdHJ1Y3QgUnhGRCAqcmZkX2Jhc2U7CisJc3RydWN0IFJ4RkQgKnJmZF9saW1pdDsKKwlzdHJ1Y3QgUnhGRCAqcmZkX2N1cjsKKwlzdHJ1Y3QgRnJGRCAqZmJsX3B0cjsKKwl1bnNpZ25lZCBjaGFyIGZibF9jdXJpZDsKKwlkbWFfYWRkcl90IGRhdGFfYnVmX2RtYV9oYW5kbGVbUlhfQlVGX1BBR0VTXTsKKwl2b2lkICogZGF0YV9idWZbUlhfQlVGX1BBR0VTXTsJCS8qIHBhY2tpbmcgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRjMzU4MTVfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyLCB1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIGludAl0YzM1ODE1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXRjMzU4MTVfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICAgdGMzNTgxNV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHRjMzU4MTVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQJdGMzNTgxNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCXRjMzU4MTVfdHhkb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl0YzM1ODE1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdAluZXRfZGV2aWNlX3N0YXRzICp0YzM1ODE1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCXRjMzU4MTVfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCAJdGMzNTgxNV9jaGlwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRjMzU4MTVfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRjMzU4MTVfcGh5X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgdGMzNTgxNSBkZXZpY2VzLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpyb290X3RjMzU4MTVfZGV2ID0gTlVMTDsKKworLyoKKyAqIFBDSSBkZXZpY2UgaWRlbnRpZmllcnMgZm9yICJuZXcgc3R5bGUiIExpbnV4IFBDSSBEZXZpY2UgRHJpdmVycworICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGMzNTgxNV9wY2lfdGJsW10gPSB7CisgICAgeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkFfMiwgUENJX0RFVklDRV9JRF9UT1NISUJBX1RDMzU4MTVDRiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB0YzM1ODE1X3BjaV90YmwpOworCitpbnQKK3RjMzU4MTVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHBjaV9tZW1hZGRyOworCXVuc2lnbmVkIGludCBwY2lfaXJxX2xpbmU7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0YzM1ODE1X3Byb2JlOiBmb3VuZCBkZXZpY2UgJSMwOHguJSMwOHhcbiIsIGVudC0+dmVuZG9yLCBlbnQtPmRldmljZSk7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisgICAgICAgIHBjaV9tZW1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPICIgICAgcGNpX21lbWFkZHI9JSMwOGx4ICByZXNvdXJjZV9mbGFncz0lIzA4bHhcbiIsIHBjaV9tZW1hZGRyLCBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApKTsKKworCWlmICghcGNpX21lbWFkZHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gUENJIE1FTSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwlwY2lfaXJxX2xpbmUgPSBwZGV2LT5pcnE7CisJLyogaXJxIGRpc2FibGVkLiAqLworCWlmIChwY2lfaXJxX2xpbmUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJubyBQQ0kgaXJxLCBhYm9ydGluZ1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXQgPSAgdGMzNTgxNV9wcm9iZTEocGRldiwgcGNpX21lbWFkZHIsIHBjaV9pcnFfbGluZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0OworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGMzNTgxNV9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGludCBiYXNlX2FkZHIsIHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZCA9IDA7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHA7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIEFsbG9jYXRlIGEgbmV3ICdkZXYnIGlmIG5lZWRlZC4gKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHRjMzU4MTVfbG9jYWwpKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBhbGxvY19ldGhlcmRldiBhbGxvY3MgYW5kIHplcm9zIGRldi0+cHJpdgorCSAqLworCWxwID0gZGV2LT5wcml2OworCisJaWYgKHRjMzU4MTVfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKworCS8qIEZpbGwgaW4gdGhlICdkZXYnIGZpZWxkcy4gKi8KKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoYmFzZV9hZGRyLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB0YzM1ODE1X3JlZ3MpKTsKKwlpZiAoIWRldi0+YmFzZV9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisKKwl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKKworCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwl3aGlsZSAodGNfcmVhZGwoJnRyLT5QUk9NX0N0bCkgJiBQUk9NX0J1c3kpCisJCTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCXVuc2lnbmVkIHNob3J0IGRhdGE7CisJCXRjX3dyaXRlbChQUk9NX0J1c3kgfCBQUk9NX1JlYWQgfCAoaSAvIDIgKyAyKSwgJnRyLT5QUk9NX0N0bCk7CisJCXdoaWxlICh0Y19yZWFkbCgmdHItPlBST01fQ3RsKSAmIFBST01fQnVzeSkKKwkJCTsKKwkJZGF0YSA9IHRjX3JlYWRsKCZ0ci0+UFJPTV9EYXRhKTsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGRhdGEgJiAweGZmOworCQlkZXYtPmRldl9hZGRyW2krMV0gPSBkYXRhID4+IDg7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlscC0+cGRldiA9IHBkZXY7CisJbHAtPm5leHRfbW9kdWxlID0gcm9vdF90YzM1ODE1X2RldjsKKwlyb290X3RjMzU4MTVfZGV2ID0gZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWlmIChkZXYtPm1lbV9zdGFydCA+IDApIHsKKwkJbHAtPm9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCQlpZiAoKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xME0pICYmCisJCSAgICAobHAtPm9wdGlvbiAmIFRDMzU4MTVfT1BUXzEwME0pKSB7CisJCQkvKiBpZiBib3RoIHNwZWVkIHNwZWZpY2llZCwgYXV0byBzZWxlY3QuICovCisJCQlscC0+b3B0aW9uICY9IH4oVEMzNTgxNV9PUFRfMTBNIHwgVEMzNTgxNV9PUFRfMTAwTSk7CisJCX0KKwl9CisJLy9YWFggZml4bWUKKyAgICAgICAgbHAtPm9wdGlvbiB8PSBUQzM1ODE1X09QVF8xME07CisKKwkvKiBkbyBhdXRvIG5lZ290aWF0aW9uICovCisJdGMzNTgxNV9waHlfY2hpcF9pbml0KGRldik7CisKKwlkZXYtPm9wZW4JCT0gdGMzNTgxNV9vcGVuOworCWRldi0+c3RvcAkJPSB0YzM1ODE1X2Nsb3NlOworCWRldi0+dHhfdGltZW91dCAgICAgICAgID0gdGMzNTgxNV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHRjMzU4MTVfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gdGMzNTgxNV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGF0ICUjeCwgaXJxICVkLCBNQUMiLAorCSAgICAgICBkZXYtPm5hbWUsIGNhcmRuYW1lLCBiYXNlX2FkZHIsIGlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmtzcGVlZCAlZE1icHMsICVzIER1cGxleFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBscC0+bGlua3NwZWVkLCBscC0+ZnVsbGR1cGxleCA/ICJGdWxsIiA6ICJIYWxmIik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoKHZvaWQgKikgZGV2LT5iYXNlX2FkZHIpOworZXJyX291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAordGMzNTgxNV9pbml0X3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZkX2FkZHI7CisKKwlpZiAoIWxwLT5mZF9idWYpIHsKKwkJaWYgKHNpemVvZihzdHJ1Y3QgRkRlc2MpICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgQkRlc2MpICogUlhfQlVGX1BBR0VTICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgRkRlc2MpICogUlhfRkRfTlVNICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgVHhGRCkgKiBUWF9GRF9OVU0gPiBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgUXVldWUgU2l6ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmICgobHAtPmZkX2J1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBGRF9QQUdFX09SREVSKSkgPT0gMCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspIHsKKwkJCWlmICgobHAtPmRhdGFfYnVmW2ldID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpID09IDApIHsKKwkJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWxwLT5kYXRhX2J1ZltpXSk7CisJCQkJCWxwLT5kYXRhX2J1ZltpXSA9IDA7CisJCQkJfQorCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylscC0+ZmRfYnVmKTsKKwkJCQlscC0+ZmRfYnVmID0gMDsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKyNpZmRlZiBfX21pcHNfXworCQkJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZylscC0+ZGF0YV9idWZbaV0sIFBBR0VfU0laRSAqIEZEX1BBR0VfTlVNKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgX19taXBzX18KKwkJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZylscC0+ZmRfYnVmLCBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQljbGVhcl9wYWdlKGxwLT5mZF9idWYpOworI2lmZGVmIF9fbWlwc19fCisJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1ZiwgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOworI2VuZGlmCisJfQorI2lmZGVmIF9fbWlwc19fCisJZmRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXZ0b25vY2FjaGUobHAtPmZkX2J1Zik7ICAKKyNlbHNlCisJZmRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWY7CisjZW5kaWYKKworCS8qIEZyZWUgRGVzY3JpcHRvcnMgKGZvciBSZWNlaXZlKSAqLworCWxwLT5yZmRfYmFzZSA9IChzdHJ1Y3QgUnhGRCAqKWZkX2FkZHI7CisJZmRfYWRkciArPSBzaXplb2Yoc3RydWN0IFJ4RkQpICogUlhfRkRfTlVNOworCWZvciAoaSA9IDA7IGkgPCBSWF9GRF9OVU07IGkrKykgeworCQlscC0+cmZkX2Jhc2VbaV0uZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihGRF9Db3duc0ZEKTsKKwl9CisJbHAtPnJmZF9jdXIgPSBscC0+cmZkX2Jhc2U7CisJbHAtPnJmZF9saW1pdCA9IChzdHJ1Y3QgUnhGRCAqKShmZF9hZGRyIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBGRGVzYykgLQorCQkJCQlzaXplb2Yoc3RydWN0IEJEZXNjKSAqIDMwKTsKKworCS8qIFRyYW5zbWl0IERlc2NyaXB0b3JzICovCisJbHAtPnRmZF9iYXNlID0gKHN0cnVjdCBUeEZEICopZmRfYWRkcjsKKwlmZF9hZGRyICs9IHNpemVvZihzdHJ1Y3QgVHhGRCkgKiBUWF9GRF9OVU07CisJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKSB7CisJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmbHAtPnRmZF9iYXNlW2krMV0pKTsKKwkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisJCWxwLT50ZmRfYmFzZVtpXS5mZC5GREN0bCA9IGNwdV90b19sZTMyKDApOworCX0KKwlscC0+dGZkX2Jhc2VbVFhfRkRfTlVNLTFdLmZkLkZETmV4dCA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCZscC0+dGZkX2Jhc2VbMF0pKTsKKwlscC0+dGZkX3N0YXJ0ID0gMDsKKwlscC0+dGZkX2VuZCA9IDA7CisKKwkvKiBCdWZmZXIgTGlzdCAoZm9yIFJlY2VpdmUpICovCisJbHAtPmZibF9wdHIgPSAoc3RydWN0IEZyRkQgKilmZF9hZGRyOworCWxwLT5mYmxfcHRyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhscC0+ZmJsX3B0cikpOworCWxwLT5mYmxfcHRyLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKFJYX0JVRl9QQUdFUyB8IEZEX0Nvd25zRkQpOworCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykgeworCQlscC0+ZmJsX3B0ci0+YmRbaV0uQnVmZkRhdGEgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhscC0+ZGF0YV9idWZbaV0pKTsKKwkJLyogQkRJRCBpcyBpbmRleCBvZiBGckZELmJkW10gKi8KKwkJbHAtPmZibF9wdHItPmJkW2ldLkJEQ3RsID0KKwkJCWNwdV90b19sZTMyKEJEX0Nvd25zQkQgfCAoaSA8PCBCRF9SeEJESURfU0hJRlQpIHwgUEFHRV9TSVpFKTsKKwl9CisJbHAtPmZibF9jdXJpZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RjMzU4MTVfY2xlYXJfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikKKwkJCWxlMzJfdG9fY3B1KGxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSk7CisJCWlmIChza2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0gPSBjcHVfdG9fbGUzMigwKTsKKwl9CisKKwl0YzM1ODE1X2luaXRfcXVldWVzKGRldik7Cit9CisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X2ZyZWVfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCisJaWYgKGxwLT50ZmRfYmFzZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgVFhfRkRfTlVNOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikKKwkJCQlsZTMyX3RvX2NwdShscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0pOworCQkJaWYgKHNrYikKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisJCX0KKwl9CisKKwlscC0+cmZkX2Jhc2UgPSBOVUxMOworCWxwLT5yZmRfYmFzZSA9IE5VTEw7CisJbHAtPnJmZF9saW1pdCA9IE5VTEw7CisJbHAtPnJmZF9jdXIgPSBOVUxMOworCWxwLT5mYmxfcHRyID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykgeworCQlpZiAobHAtPmRhdGFfYnVmW2ldKQorCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWxwLT5kYXRhX2J1ZltpXSk7CisJCWxwLT5kYXRhX2J1ZltpXSA9IDA7CisJfQorCWlmIChscC0+ZmRfYnVmKQorCQlfX2ZyZWVfcGFnZXMobHAtPmZkX2J1ZiwgRkRfUEFHRV9PUkRFUik7CisJbHAtPmZkX2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3R4ZmQoc3RydWN0IFR4RkQgKmZkKQoreworCXByaW50aygiVHhGRCglcCk6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGZkLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkROZXh0KSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEU3lzdGVtKSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEU3RhdCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkpOworCXByaW50aygiQkQ6ICIpOworCXByaW50aygiICUwOHggJTA4eCIsCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZC5CdWZmRGF0YSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZC5CREN0bCkpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGludAorZHVtcF9yeGZkKHN0cnVjdCBSeEZEICpmZCkKK3sKKwlpbnQgaSwgYmRfY291bnQgPSAobGUzMl90b19jcHUoZmQtPmZkLkZEQ3RsKSAmIEZEX0JEQ250X01BU0spID4+IEZEX0JEQ250X1NISUZUOworCWlmIChiZF9jb3VudCA+IDgpCisJCWJkX2NvdW50ID0gODsKKwlwcmludGsoIlJ4RkQoJXApOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBmZCwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZETmV4dCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN5c3RlbSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKKwlpZiAobGUzMl90b19jcHUoZmQtPmZkLkZEQ3RsKSAmIEZEX0Nvd25zRkQpCisJICAgIHJldHVybiAwOworCXByaW50aygiQkQ6ICIpOworCWZvciAoaSA9IDA7IGkgPCBiZF9jb3VudDsgaSsrKQorCQlwcmludGsoIiAlMDh4ICUwOHgiLAorCQkgICAgICAgbGUzMl90b19jcHUoZmQtPmJkW2ldLkJ1ZmZEYXRhKSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZFtpXS5CREN0bCkpOworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gYmRfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2ZyZmQoc3RydWN0IEZyRkQgKmZkKQoreworCWludCBpOworCXByaW50aygiRnJGRCglcCk6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGZkLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkROZXh0KSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEU3lzdGVtKSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEU3RhdCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkpOworCXByaW50aygiQkQ6ICIpOworCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykKKwkJcHJpbnRrKCIgJTA4eCAlMDh4IiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZFtpXS5CdWZmRGF0YSksCisJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQkRDdGwpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwYW5pY19xdWV1ZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlwcmludGsoIlR4RkQgYmFzZSAlcCwgc3RhcnQgJWQsIGVuZCAlZFxuIiwKKwkgICAgICAgbHAtPnRmZF9iYXNlLCBscC0+dGZkX3N0YXJ0LCBscC0+dGZkX2VuZCk7CisJcHJpbnRrKCJSeEZEIGJhc2UgJXAgbGltaXQgJXAgY3VyICVwXG4iLAorCSAgICAgICBscC0+cmZkX2Jhc2UsIGxwLT5yZmRfbGltaXQsIGxwLT5yZmRfY3VyKTsKKwlwcmludGsoIkZyRkQgJXBcbiIsIGxwLT5mYmxfcHRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfRkRfTlVNOyBpKyspCisJCWR1bXBfdHhmZCgmbHAtPnRmZF9iYXNlW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfRkRfTlVNOyBpKyspIHsKKwkJaW50IGJkX2NvdW50ID0gZHVtcF9yeGZkKCZscC0+cmZkX2Jhc2VbaV0pOworCQlpICs9IChiZF9jb3VudCArIDEpIC8gMjsJLyogc2tpcCBCRHMgKi8KKwl9CisJZHVtcF9mcmZkKGxwLT5mYmxfcHRyKTsKKwlwYW5pYygiJXM6IElsbGVnYWwgcXVldWUgc3RhdGUuIiwgZGV2LT5uYW1lKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHByaW50X2J1ZihjaGFyICphZGQsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisJaW50IGxlbiA9IGxlbmd0aDsKKworCXByaW50aygicHJpbnRfYnVmKCUwOHgpKCV4KVxuIiwgKHVuc2lnbmVkIGludCkgYWRkLGxlbmd0aCk7CisKKwlpZiAobGVuID4gMTAwKQorCQlsZW4gPSAxMDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFtpXSk7CisJCWlmICghKGkgJSAxNikpCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcmludF9ldGgoY2hhciAqYWRkKQoreworCWludCBpOworCisJcHJpbnRrKCJwcmludF9ldGgoJTA4eClcbiIsICh1bnNpZ25lZCBpbnQpIGFkZCk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCAodW5zaWduZWQgY2hhcikgYWRkW2kgKyA2XSk7CisJcHJpbnRrKCIgPT4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yWCIsICh1bnNpZ25lZCBjaGFyKSBhZGRbaV0pOworCXByaW50aygiIDogJTIuMlglMi4yWFxuIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFsxMl0sICh1bnNpZ25lZCBjaGFyKSBhZGRbMTNdKTsKK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgKiBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KK3N0YXRpYyBpbnQKK3RjMzU4MTVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwkvKgorCSAqIFRoaXMgaXMgdXNlZCBpZiB0aGUgaW50ZXJydXB0IGxpbmUgY2FuIHR1cm5lZCBvZmYgKHNoYXJlZCkuCisJICogU2VlIDNjNTAzLmMgZm9yIGFuIGV4YW1wbGUgb2Ygc2VsZWN0aW5nIHRoZSBJUlEgYXQgY29uZmlnLXRpbWUuCisJICovCisKKwlpZiAoZGV2LT5pcnEgPT0gMCAgfHwKKwkgICAgcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ0YzM1ODE1X2ludGVycnVwdCwgU0FfU0hJUlEsIGNhcmRuYW1lLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCisJaWYgKHRjMzU4MTVfaW5pdF9xdWV1ZXMoZGV2KSAhPSAwKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCXRjMzU4MTVfY2hpcF9pbml0KGRldik7CisKKwlscC0+dGJ1c3kgPSAwOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MgKilkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjbHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgdGNfcmVhZGwoJnRyLT5UeF9TdGF0KSk7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisJdGMzNTgxNV9jbGVhcl9xdWV1ZXMoZGV2KTsKKwl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCWxwLT50YnVzeT0wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHRjMzU4MTVfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyAqKWRldi0+YmFzZV9hZGRyOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkvKgorCQkgKiBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGV2ZWwgaGFzIGRlY2lkZWQgd2UgYXJlIGJyb2tlbi4KKwkJICogVGhlcmUgc2hvdWxkIHJlYWxseSBiZSBhICJraWNrIG1lIiBmdW5jdGlvbiBjYWxsIGluc3RlYWQuCisJCSAqLworCQlpbnQgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCQlpZiAodGlja3Nzb2ZhciA8IDUpCisJCQlyZXR1cm4gMTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjbHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHRjX3JlYWRsKCZ0ci0+VHhfU3RhdCkpOworCQkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwkJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisJCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7CisJCXRjMzU4MTVfY2hpcF9pbml0KGRldik7CisJCWxwLT50YnVzeT0wOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCS8qCisJICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiBUaGlzIGNvdWxkIGJldHRlciBiZQorCSAqIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBscC0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuCisJICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQqKSZscC0+dGJ1c3kpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0dGVyIGFjY2VzcyBjb25mbGljdC5cbiIsIGRldi0+bmFtZSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfSBlbHNlIHsKKwkJc2hvcnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKwkJc3RydWN0IFR4RkQgKnR4ZmQgPSAmbHAtPnRmZF9iYXNlW2xwLT50ZmRfc3RhcnRdOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKworI2lmZGVmIF9fbWlwc19fCisJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpYnVmLCBsZW5ndGgpOworI2VuZGlmCisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogZmFpbHNhZmUuLi4gKi8KKwkJaWYgKGxwLT50ZmRfc3RhcnQgIT0gbHAtPnRmZF9lbmQpCisJCQl0YzM1ODE1X3R4ZG9uZShkZXYpOworCisKKwkJdHhmZC0+YmQuQnVmZkRhdGEgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhidWYpKTsKKworCQl0eGZkLT5iZC5CREN0bCA9IGNwdV90b19sZTMyKGxlbmd0aCk7CisJCXR4ZmQtPmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoKF9fdTMyKXNrYik7CisJCXR4ZmQtPmZkLkZEQ3RsID0gY3B1X3RvX2xlMzIoRkRfQ293bnNGRCB8ICgxIDw8IEZEX0JEQ250X1NISUZUKSk7CisKKwkJaWYgKGxwLT50ZmRfc3RhcnQgPT0gbHAtPnRmZF9lbmQpIHsKKwkJCS8qIFN0YXJ0IERNQSBUcmFuc21pdHRlci4gKi8KKwkJCXR4ZmQtPmZkLkZETmV4dCB8PSBjcHVfdG9fbGUzMihGRF9OZXh0X0VPTCk7CisjaWZkZWYgR0FUSEVSX1RYSU5UCisJCQl0eGZkLT5mZC5GREN0bCB8PSBjcHVfdG9fbGUzMihGRF9Gcm1PcHRfSW50VHgpOworI2VuZGlmCisJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCQlwcmludGsoIiVzOiBzdGFydGluZyBUeEZELlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlkdW1wX3R4ZmQodHhmZCk7CisJCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQorCQkJCQlwcmludF9ldGgoYnVmKTsKKwkJCX0KKwkJCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyh0eGZkKSwgJnRyLT5UeEZybVB0cik7CisJCX0gZWxzZSB7CisJCQl0eGZkLT5mZC5GRE5leHQgJj0gY3B1X3RvX2xlMzIofkZEX05leHRfRU9MKTsKKwkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJCXByaW50aygiJXM6IHF1ZXVlaW5nIFR4RkQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWR1bXBfdHhmZCh0eGZkKTsKKwkJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDMpCisJCQkJCXByaW50X2V0aChidWYpOworCQkJfQorCQl9CisJCWxwLT50ZmRfc3RhcnQgPSAobHAtPnRmZF9zdGFydCArIDEpICUgVFhfRkRfTlVNOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJCWlmICgobHAtPnRmZF9zdGFydCArIDEpICUgVFhfRkRfTlVNICE9IGxwLT50ZmRfZW5kKSB7CisJCQkvKiB3ZSBjYW4gc2VuZCBhbm90aGVyIHBhY2tldCAqLworCQkJbHAtPnRidXN5ID0gMDsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCX0gZWxzZSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4RkQgRXhoYXVzdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZBVEFMX0VSUk9SX0lOVCBcCisJKEludF9JbnRQQ0kgfCBJbnRfRG1QYXJFcnIgfCBJbnRfSW50TlJBYnQpCitzdGF0aWMgdm9pZCB0YzM1ODE1X2ZhdGFsX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQoreworCXN0YXRpYyBpbnQgY291bnQ7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhdGFsIEVycm9yIEludHRlcnJ1cHQgKCUjeCk6IiwKKwkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEludF9JbnRQQ0kpCisJCXByaW50aygiIEludFBDSSIpOworCWlmIChzdGF0dXMgJiBJbnRfRG1QYXJFcnIpCisJCXByaW50aygiIERtUGFyRXJyIik7CisJaWYgKHN0YXR1cyAmIEludF9JbnROUkFidCkKKwkJcHJpbnRrKCIgSW50TlJBYnQiKTsKKwlwcmludGsoIlxuIik7CisJaWYgKGNvdW50KysgPiAxMDApCisJCXBhbmljKCIlczogVG9vIG1hbnkgZmF0YWwgZXJyb3JzLiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyAlcy4uLlxuIiwgZGV2LT5uYW1lLCBjYXJkbmFtZSk7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisJdGMzNTgxNV9jbGVhcl9xdWV1ZXMoZGV2KTsKKwl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworfQorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqICAgSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdGMzNTgxNV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0cjsKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHA7CisJaW50IHN0YXR1cywgYm9ndXNjb3VudCA9IDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgY2FyZG5hbWUsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwl0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwlscCA9IGRldi0+cHJpdjsKKworCWRvIHsKKwkJc3RhdHVzID0gdGNfcmVhZGwoJnRyLT5JbnRfU3JjKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCQl0Y193cml0ZWwoc3RhdHVzLCAmdHItPkludF9TcmMpOwkvKiB3cml0ZSB0byBjbGVhciAqLworCisJCS8qIEZhdGFsIGVycm9ycy4uLiAqLworCQlpZiAoc3RhdHVzICYgRkFUQUxfRVJST1JfSU5UKSB7CisJCQl0YzM1ODE1X2ZhdGFsX2Vycm9yX2ludGVycnVwdChkZXYsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQkvKiByZWNvdmVyYWJsZSBlcnJvcnMgKi8KKwkJaWYgKHN0YXR1cyAmIEludF9JbnRGREFFeCkgeworCQkJLyogZGlzYWJsZSBGREFFeCBpbnQuICh1bnRpbCB3ZSBtYWtlIHJvb21zLi4uKSAqLworCQkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSAmIH5JbnRfRkRBRXhFbiwgJnRyLT5JbnRfRW4pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogRnJlZSBEZXNjcmlwdG9yIEFyZWEgRXhoYXVzdGVkICglI3gpLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9CisJCWlmIChzdGF0dXMgJiBJbnRfSW50QkxFeCkgeworCQkJLyogZGlzYWJsZSBCTEV4IGludC4gKHVudGlsIHdlIG1ha2Ugcm9vbXMuLi4pICovCisJCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pICYgfkludF9CTEV4RW4sICZ0ci0+SW50X0VuKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEJ1ZmZlciBMaXN0IEV4aGF1c3RlZCAoJSN4KS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgSW50X0ludEV4QkQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEV4Y2Vzc2l2ZSBCdWZmZXIgRGVzY3JpcHRpb3JzICglI3gpLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisJCS8qIG5vcm1hbCBub3RpZmljYXRpb24gKi8KKwkJaWYgKHN0YXR1cyAmIEludF9JbnRNYWNSeCkgeworCQkJLyogR290IGEgcGFja2V0KHMpLiAqLworCQkJbHAtPmxzdGF0cy5yeF9pbnRzKys7CisJCQl0YzM1ODE1X3J4KGRldik7CisJCX0KKwkJaWYgKHN0YXR1cyAmIEludF9JbnRNYWNUeCkgeworCQkJbHAtPmxzdGF0cy50eF9pbnRzKys7CisJCQl0YzM1ODE1X3R4ZG9uZShkZXYpOworCQl9CisJfSB3aGlsZSAoKytib2d1c2NvdW50IDwgMjApIDsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkCit0YzM1ODE1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBmZGN0bDsKKwlpbnQgaTsKKwlpbnQgYnVmX2ZyZWVfY291bnQgPSAwOworCWludCBmZF9mcmVlX2NvdW50ID0gMDsKKworCXdoaWxlICghKChmZGN0bCA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5mZC5GREN0bCkpICYgRkRfQ293bnNGRCkpIHsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5mZC5GRFN0YXQpOworCQlpbnQgcGt0X2xlbiA9IGZkY3RsICYgRkRfRkRMZW5ndGhfTUFTSzsKKwkJc3RydWN0IFJ4RkQgKm5leHRfcmZkOworCQlpbnQgYmRfY291bnQgPSAoZmRjdGwgJiBGRF9CRENudF9NQVNLKSA+PiBGRF9CRENudF9TSElGVDsKKworCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpCisJCQlkdW1wX3J4ZmQobHAtPnJmZF9jdXIpOworCQlpZiAoc3RhdHVzICYgUnhfR29vZCkgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJCWludCBjdXJfYmQsIG9mZnNldDsKKworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOyAvKiArMjogZm9yIHJlc2VydmUgKi8KKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgIC8qIDE2IGJpdCBhbGlnbm1lbnQgKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQlkYXRhID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCisJCQkvKiBjb3B5IGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KKwkJCWN1cl9iZCA9IDA7CisJCQlvZmZzZXQgPSAwOworCQkJd2hpbGUgKG9mZnNldCA8IHBrdF9sZW4gJiYgY3VyX2JkIDwgYmRfY291bnQpIHsKKwkJCQlpbnQgbGVuID0gbGUzMl90b19jcHUobHAtPnJmZF9jdXItPmJkW2N1cl9iZF0uQkRDdGwpICYKKwkJCQkJQkRfQnVmZkxlbmd0aF9NQVNLOworCQkJCXZvaWQgKnJ4YnVmID0KKwkJCQkJYnVzX3RvX3ZpcnQobGUzMl90b19jcHUobHAtPnJmZF9jdXItPmJkW2N1cl9iZF0uQnVmZkRhdGEpKTsKKyNpZmRlZiBfX21pcHNfXworCQkJCWRtYV9jYWNoZV9pbnYoKHVuc2lnbmVkIGxvbmcpcnhidWYsIGxlbik7CisjZW5kaWYKKwkJCQltZW1jcHkoZGF0YSArIG9mZnNldCwgcnhidWYsIGxlbik7CisJCQkJb2Zmc2V0ICs9IGxlbjsKKwkJCQljdXJfYmQrKzsKKwkJCX0KKyNpZiAwCisJCQlwcmludF9idWYoZGF0YSxwa3RfbGVuKTsKKyNlbmRpZgorCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQorCQkJCXByaW50X2V0aChkYXRhKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfSBlbHNlIHsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCS8qIFdPUktBUk9VTkQ6IExvbmdFcnIgYW5kIENSQ0VyciBtZWFucyBPdmVyZmxvdy4gKi8KKwkJCWlmICgoc3RhdHVzICYgUnhfTG9uZ0VycikgJiYgKHN0YXR1cyAmIFJ4X0NSQ0VycikpIHsKKwkJCQlzdGF0dXMgJj0gfihSeF9Mb25nRXJyfFJ4X0NSQ0Vycik7CisJCQkJc3RhdHVzIHw9IFJ4X092ZXI7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgUnhfTG9uZ0VycikgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSeF9PdmVyKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSeF9DUkNFcnIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhfQWxpZ24pIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJfQorCisJCWlmIChiZF9jb3VudCA+IDApIHsKKwkJCS8qIHB1dCBGcmVlIEJ1ZmZlciBiYWNrIHRvIGNvbnRyb2xsZXIgKi8KKwkJCWludCBiZGN0bCA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtiZF9jb3VudCAtIDFdLkJEQ3RsKTsKKwkJCXVuc2lnbmVkIGNoYXIgaWQgPQorCQkJCShiZGN0bCAmIEJEX1J4QkRJRF9NQVNLKSA+PiBCRF9SeEJESURfU0hJRlQ7CisJCQlpZiAoaWQgPj0gUlhfQlVGX1BBR0VTKSB7CisJCQkJcHJpbnRrKCIlczogaW52YWxpZCBCRElELlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJCX0KKwkJCS8qIGZyZWUgb2xkIGJ1ZmZlcnMgKi8KKwkJCXdoaWxlIChscC0+ZmJsX2N1cmlkICE9IGlkKSB7CisJCQkJYmRjdGwgPSBsZTMyX3RvX2NwdShscC0+ZmJsX3B0ci0+YmRbbHAtPmZibF9jdXJpZF0uQkRDdGwpOworCQkJCWlmIChiZGN0bCAmIEJEX0Nvd25zQkQpIHsKKwkJCQkJcHJpbnRrKCIlczogRnJlZWluZyBpbnZhbGlkIEJELlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCXBhbmljX3F1ZXVlcyhkZXYpOworCQkJCX0KKwkJCQkvKiBwYXNzIEJEIHRvIGNvbnRyb2xlciAqLworCQkJCS8qIE5vdGU6IEJETGVuZ3RoIHdhcyBtb2RpZmllZCBieSBjaGlwLiAqLworCQkJCWxwLT5mYmxfcHRyLT5iZFtscC0+ZmJsX2N1cmlkXS5CREN0bCA9CisJCQkJCWNwdV90b19sZTMyKEJEX0Nvd25zQkQgfAorCQkJCQkJICAgIChscC0+ZmJsX2N1cmlkIDw8IEJEX1J4QkRJRF9TSElGVCkgfAorCQkJCQkJICAgIFBBR0VfU0laRSk7CisJCQkJbHAtPmZibF9jdXJpZCA9CisJCQkJCShscC0+ZmJsX2N1cmlkICsgMSkgJSBSWF9CVUZfUEFHRVM7CisJCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCQkJCXByaW50aygiJXM6IEVudGVyaW5nIG5ldyBGQkQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGxwLT5mYmxfY3VyaWQpOworCQkJCQlkdW1wX2ZyZmQobHAtPmZibF9wdHIpOworCQkJCX0KKwkJCQlidWZfZnJlZV9jb3VudCsrOworCQkJfQorCQl9CisKKwkJLyogcHV0IFJ4RkQgYmFjayB0byBjb250cm9sbGVyICovCisJCW5leHRfcmZkID0gYnVzX3RvX3ZpcnQobGUzMl90b19jcHUobHAtPnJmZF9jdXItPmZkLkZETmV4dCkpOworI2lmZGVmIF9fbWlwc19fCisJCW5leHRfcmZkID0gKHN0cnVjdCBSeEZEICopdnRvbm9jYWNoZShuZXh0X3JmZCk7CisjZW5kaWYKKwkJaWYgKG5leHRfcmZkIDwgbHAtPnJmZF9iYXNlIHx8IG5leHRfcmZkID4gbHAtPnJmZF9saW1pdCkgeworCQkJcHJpbnRrKCIlczogUnhGRCBGRE5leHQgaW52YWxpZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgKGJkX2NvdW50ICsgMSkgLyAyICsgMTsgaSsrKSB7CisJCQkvKiBwYXNzIEZEIHRvIGNvbnRyb2xlciAqLworCQkJbHAtPnJmZF9jdXItPmZkLkZETmV4dCA9IGNwdV90b19sZTMyKDB4ZGVhZGRlYWQpOwkvKiBmb3IgZGVidWcgKi8KKwkJCWxwLT5yZmRfY3VyLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKEZEX0Nvd25zRkQpOworCQkJbHAtPnJmZF9jdXIrKzsKKwkJCWZkX2ZyZWVfY291bnQrKzsKKwkJfQorCisJCWxwLT5yZmRfY3VyID0gbmV4dF9yZmQ7CisJfQorCisJLyogcmUtZW5hYmxlIEJML0ZEQSBFeGhhdXN0IGludGVycnVwdHMuICovCisJaWYgKGZkX2ZyZWVfY291bnQpIHsKKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSB8IEludF9GREFFeEVuLCAmdHItPkludF9Fbik7CisJCWlmIChidWZfZnJlZV9jb3VudCkKKwkJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgfCBJbnRfQkxFeEVuLCAmdHItPkludF9Fbik7CisJfQorfQorCisjaWZkZWYgTk9fQ0hFQ0tfQ0FSUklFUgorI2RlZmluZSBUWF9TVEFfRVJSCShUeF9FeENvbGx8VHhfVW5kZXJ8VHhfRGVmZXJ8VHhfTGF0ZUNvbGx8VHhfVHhQYXJ8VHhfU1FFcnIpCisjZWxzZQorI2RlZmluZSBUWF9TVEFfRVJSCShUeF9FeENvbGx8VHhfVW5kZXJ8VHhfRGVmZXJ8VHhfTkNhcnJ8VHhfTGF0ZUNvbGx8VHhfVHhQYXJ8VHhfU1FFcnIpCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3RjMzU4MTVfY2hlY2tfdHhfc3RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwljb25zdCBjaGFyICptc2cgPSBOVUxMOworCisJLyogY291bnQgY29sbGlzaW9ucyAqLworCWlmIChzdGF0dXMgJiBUeF9FeENvbGwpCisJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDE2OworCWlmIChzdGF0dXMgJiBUeF9UeENvbGxfTUFTSykKKwkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gc3RhdHVzICYgVHhfVHhDb2xsX01BU0s7CisKKwkvKiBXT1JLQVJPVU5EOiBpZ25vcmUgTG9zdENyUyBpbiBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KKwlpZiAobHAtPmZ1bGxkdXBsZXgpCisJCXN0YXR1cyAmPSB+VHhfTkNhcnI7CisKKwlpZiAoIShzdGF0dXMgJiBUWF9TVEFfRVJSKSkgeworCQkvKiBubyBlcnJvci4gKi8KKwkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcmV0dXJuOworCX0KKworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgVHhfRXhDb2xsKSB7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQltc2cgPSAiRXhjZXNzaXZlIENvbGxpc2lvbi4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfVW5kZXIpIHsKKwkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW1zZyA9ICJUeCBGSUZPIFVuZGVycnVuLiI7CisJfQorCWlmIChzdGF0dXMgJiBUeF9EZWZlcikgeworCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJbXNnID0gIkV4Y2Vzc2l2ZSBEZWZlcnJhbC4iOworCX0KKyNpZm5kZWYgTk9fQ0hFQ0tfQ0FSUklFUgorCWlmIChzdGF0dXMgJiBUeF9OQ2FycikgeworCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJbXNnID0gIkxvc3QgQ2FycmllciBTZW5zZS4iOworCX0KKyNlbmRpZgorCWlmIChzdGF0dXMgJiBUeF9MYXRlQ29sbCkgeworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbXNnID0gIkxhdGUgQ29sbGlzaW9uLiI7CisJfQorCWlmIChzdGF0dXMgJiBUeF9UeFBhcikgeworCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJbXNnID0gIlRyYW5zbWl0IFBhcml0eSBFcnJvci4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfU1FFcnIpIHsKKwkJbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJbXNnID0gIlNpZ25hbCBRdWFsaXR5IEVycm9yLiI7CisJfQorCWlmIChtc2cpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcyAoJSN4KVxuIiwgZGV2LT5uYW1lLCBtc2csIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X3R4ZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgVHhGRCAqdHhmZDsKKwl1bnNpZ25lZCBpbnQgZmRjdGw7CisJaW50IG51bV9kb25lID0gMDsKKworCXR4ZmQgPSAmbHAtPnRmZF9iYXNlW2xwLT50ZmRfZW5kXTsKKwl3aGlsZSAobHAtPnRmZF9zdGFydCAhPSBscC0+dGZkX2VuZCAmJgorCSAgICAgICAhKChmZGN0bCA9IGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZEQ3RsKSkgJiBGRF9Db3duc0ZEKSkgeworCQlpbnQgc3RhdHVzID0gbGUzMl90b19jcHUodHhmZC0+ZmQuRkRTdGF0KTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgbG9uZyBmZG5leHQgPSBsZTMyX3RvX2NwdSh0eGZkLT5mZC5GRE5leHQpOworCisJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJcHJpbnRrKCIlczogY29tcGxldGUgVHhGRC5cbiIsIGRldi0+bmFtZSk7CisJCQlkdW1wX3R4ZmQodHhmZCk7CisJCX0KKwkJdGMzNTgxNV9jaGVja190eF9zdGF0KGRldiwgc3RhdHVzKTsKKworCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilsZTMyX3RvX2NwdSh0eGZkLT5mZC5GRFN5c3RlbSk7CisJCWlmIChza2IpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwkJdHhmZC0+ZmQuRkRTeXN0ZW0gPSBjcHVfdG9fbGUzMigwKTsKKworCQludW1fZG9uZSsrOworCQlscC0+dGZkX2VuZCA9IChscC0+dGZkX2VuZCArIDEpICUgVFhfRkRfTlVNOworCQl0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX2VuZF07CisJCWlmICgoZmRuZXh0ICYgfkZEX05leHRfRU9MKSAhPSB2aXJ0X3RvX2J1cyh0eGZkKSkgeworCQkJcHJpbnRrKCIlczogVHhGRCBGRE5leHQgaW52YWxpZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJfQorCQlpZiAoZmRuZXh0ICYgRkRfTmV4dF9FT0wpIHsKKwkJCS8qIERNQSBUcmFuc21pdHRlciBoYXMgYmVlbiBzdG9wcGluZy4uLiAqLworCQkJaWYgKGxwLT50ZmRfZW5kICE9IGxwLT50ZmRfc3RhcnQpIHsKKwkJCQlpbnQgaGVhZCA9IChscC0+dGZkX3N0YXJ0ICsgVFhfRkRfTlVNIC0gMSkgJSBUWF9GRF9OVU07CisJCQkJc3RydWN0IFR4RkQqIHR4aGVhZCA9ICZscC0+dGZkX2Jhc2VbaGVhZF07CisJCQkJaW50IHFsZW4gPSAobHAtPnRmZF9zdGFydCArIFRYX0ZEX05VTQorCQkJCQkgICAgLSBscC0+dGZkX2VuZCkgJSBUWF9GRF9OVU07CisKKwkJCQlpZiAoIShsZTMyX3RvX2NwdSh0eGZkLT5mZC5GREN0bCkgJiBGRF9Db3duc0ZEKSkgeworCQkJCQlwcmludGsoIiVzOiBUeEZEIEZEQ3RsIGludmFsaWQuXG4iLCBkZXYtPm5hbWUpOworCQkJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJCQl9CisJCQkJLyogbG9nIG1heCBxdWV1ZSBsZW5ndGggKi8KKwkJCQlpZiAobHAtPmxzdGF0cy5tYXhfdHhfcWxlbiA8IHFsZW4pCisJCQkJCWxwLT5sc3RhdHMubWF4X3R4X3FsZW4gPSBxbGVuOworCisKKwkJCQkvKiBzdGFydCBETUEgVHJhbnNtaXR0ZXIgYWdhaW4gKi8KKwkJCQl0eGhlYWQtPmZkLkZETmV4dCB8PSBjcHVfdG9fbGUzMihGRF9OZXh0X0VPTCk7CisjaWZkZWYgR0FUSEVSX1RYSU5UCisJCQkJdHhoZWFkLT5mZC5GREN0bCB8PSBjcHVfdG9fbGUzMihGRF9Gcm1PcHRfSW50VHgpOworI2VuZGlmCisJCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCQkJCXByaW50aygiJXM6IHN0YXJ0IFR4RkQgb24gcXVldWUuXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJZHVtcF90eGZkKHR4ZmQpOworCQkJCX0KKwkJCQl0Y193cml0ZWwodmlydF90b19idXModHhmZCksICZ0ci0+VHhGcm1QdHIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobnVtX2RvbmUgPiAwICYmIGxwLT50YnVzeSkgeworCQlscC0+dGJ1c3kgPSAwOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byB0YzM1ODE1X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQKK3RjMzU4MTVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisKKwlscC0+dGJ1c3kgPSAxOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeCBoZXJlLiAqLworCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwl0YzM1ODE1X2ZyZWVfcXVldWVzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdGMzNTgxNV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IHRjX3JlYWRsKCZ0ci0+TWlzc19DbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X3NldF9jYW1fZW50cnkoc3RydWN0IHRjMzU4MTVfcmVncyAqdHIsIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlpbnQgY2FtX2luZGV4ID0gaW5kZXggKiA2OworCXVuc2lnbmVkIGxvbmcgY2FtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzYXZlZF9hZGRyOworCXNhdmVkX2FkZHIgPSB0Y19yZWFkbCgmdHItPkNBTV9BZHIpOworCisJaWYgKHRjMzU4MTVfZGVidWcgPiAxKSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENBTSAlZDoiLCBjYXJkbmFtZSwgaW5kZXgpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIGFkZHJbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCWlmIChpbmRleCAmIDEpIHsKKwkJLyogcmVhZCBtb2RpZnkgd3JpdGUgKi8KKwkJdGNfd3JpdGVsKGNhbV9pbmRleCAtIDIsICZ0ci0+Q0FNX0Fkcik7CisJCWNhbV9kYXRhID0gdGNfcmVhZGwoJnRyLT5DQU1fRGF0YSkgJiAweGZmZmYwMDAwOworCQljYW1fZGF0YSB8PSBhZGRyWzBdIDw8IDggfCBhZGRyWzFdOworCQl0Y193cml0ZWwoY2FtX2RhdGEsICZ0ci0+Q0FNX0RhdGEpOworCQkvKiB3cml0ZSB3aG9sZSB3b3JkICovCisJCXRjX3dyaXRlbChjYW1faW5kZXggKyAyLCAmdHItPkNBTV9BZHIpOworCQljYW1fZGF0YSA9IChhZGRyWzJdIDw8IDI0KSB8IChhZGRyWzNdIDw8IDE2KSB8IChhZGRyWzRdIDw8IDgpIHwgYWRkcls1XTsKKwkJdGNfd3JpdGVsKGNhbV9kYXRhLCAmdHItPkNBTV9EYXRhKTsKKwl9IGVsc2UgeworCQkvKiB3cml0ZSB3aG9sZSB3b3JkICovCisJCXRjX3dyaXRlbChjYW1faW5kZXgsICZ0ci0+Q0FNX0Fkcik7CisJCWNhbV9kYXRhID0gKGFkZHJbMF0gPDwgMjQpIHwgKGFkZHJbMV0gPDwgMTYpIHwgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdOworCQl0Y193cml0ZWwoY2FtX2RhdGEsICZ0ci0+Q0FNX0RhdGEpOworCQkvKiByZWFkIG1vZGlmeSB3cml0ZSAqLworCQl0Y193cml0ZWwoY2FtX2luZGV4ICsgNCwgJnRyLT5DQU1fQWRyKTsKKwkJY2FtX2RhdGEgPSB0Y19yZWFkbCgmdHItPkNBTV9EYXRhKSAmIDB4MDAwMGZmZmY7CisJCWNhbV9kYXRhIHw9IGFkZHJbNF0gPDwgMjQgfCAoYWRkcls1XSA8PCAxNik7CisJCXRjX3dyaXRlbChjYW1fZGF0YSwgJnRyLT5DQU1fRGF0YSk7CisJfQorCisJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCWludCBpOworCQlmb3IgKGkgPSBjYW1faW5kZXggLyA0OyBpIDwgY2FtX2luZGV4IC8gNCArIDI7IGkrKykgeworCQkJdGNfd3JpdGVsKGkgKiA0LCAmdHItPkNBTV9BZHIpOworCQkJcHJpbnRrKCJDQU0gMHgleDogJTA4bHgiLAorCQkJICAgICAgIGkgKiA0LCB0Y19yZWFkbCgmdHItPkNBTV9EYXRhKSk7CisJCX0KKwl9CisJdGNfd3JpdGVsKHNhdmVkX2FkZHIsICZ0ci0+Q0FNX0Fkcik7Cit9CisKKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCit0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisJeworCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYyB8IENBTV9Hcm91cEFjYyB8IENBTV9TdGF0aW9uQWNjLCAmdHItPkNBTV9DdGwpOworCX0KKwllbHNlIGlmKChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSkgfHwgZGV2LT5tY19jb3VudCA+IENBTV9FTlRSWV9NQVggLSAzKQorCXsKKwkJLyogQ0FNIDAsIDEsIDIwIGFyZSByZXNlcnZlZC4gKi8KKwkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCB1c2Ugbm9ybWFsIG1vZGUuICovCisJCXRjX3dyaXRlbChDQU1fQ29tcEVuIHwgQ0FNX0Jyb2FkQWNjIHwgQ0FNX0dyb3VwQWNjLCAmdHItPkNBTV9DdGwpOworCX0KKwllbHNlIGlmKGRldi0+bWNfY291bnQpCisJeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QqIGN1cl9hZGRyID0gZGV2LT5tY19saXN0OworCQlpbnQgaTsKKwkJaW50IGVuYV9iaXRzID0gQ0FNX0VuYV9CaXQoQ0FNX0VOVFJZX1NPVVJDRSk7CisKKwkJdGNfd3JpdGVsKDAsICZ0ci0+Q0FNX0N0bCk7CisJCS8qIFdhbGsgdGhlIGFkZHJlc3MgbGlzdCwgYW5kIGxvYWQgdGhlIGZpbHRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBjdXJfYWRkciA9IGN1cl9hZGRyLT5uZXh0KSB7CisJCQlpZiAoIWN1cl9hZGRyKQorCQkJCWJyZWFrOworCQkJLyogZW50cnkgMCwxIGlzIHJlc2VydmVkLiAqLworCQkJdGMzNTgxNV9zZXRfY2FtX2VudHJ5KHRyLCBpICsgMiwgY3VyX2FkZHItPmRtaV9hZGRyKTsKKwkJCWVuYV9iaXRzIHw9IENBTV9FbmFfQml0KGkgKyAyKTsKKwkJfQorCQl0Y193cml0ZWwoZW5hX2JpdHMsICZ0ci0+Q0FNX0VuYSk7CisJCXRjX3dyaXRlbChDQU1fQ29tcEVuIHwgQ0FNX0Jyb2FkQWNjLCAmdHItPkNBTV9DdGwpOworCX0KKwllbHNlIHsKKwkJdGNfd3JpdGVsKENBTV9FbmFfQml0KENBTV9FTlRSWV9TT1VSQ0UpLCAmdHItPkNBTV9FbmEpOworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRjX3BoeV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyLCBpbnQgcGh5LCBpbnQgcGh5X3JlZykKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl0Y193cml0ZWwoTURfQ0FfQnVzeSB8IChwaHkgPDwgNSkgfCBwaHlfcmVnLCAmdHItPk1EX0NBKTsKKwl3aGlsZSAodGNfcmVhZGwoJnRyLT5NRF9DQSkgJiBNRF9DQV9CdXN5KQorCQk7CisJZGF0YSA9IHRjX3JlYWRsKCZ0ci0+TURfRGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgdGNfcGh5X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZCwgc3RydWN0IHRjMzU4MTVfcmVncyAqdHIsIGludCBwaHksIGludCBwaHlfcmVnKQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl0Y193cml0ZWwoZCwgJnRyLT5NRF9EYXRhKTsKKwl0Y193cml0ZWwoTURfQ0FfQnVzeSB8IE1EX0NBX1dyIHwgKHBoeSA8PCA1KSB8IHBoeV9yZWcsICZ0ci0+TURfQ0EpOworCXdoaWxlICh0Y19yZWFkbCgmdHItPk1EX0NBKSAmIE1EX0NBX0J1c3kpCisJCTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X3BoeV9jaGlwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJdW5zaWduZWQgc2hvcnQgY3RsOworCisJaWYgKGZpcnN0KSB7CisJCXVuc2lnbmVkIHNob3J0IGlkMCwgaWQxOworCQlpbnQgY291bnQ7CisJCWZpcnN0ID0gMDsKKworCQkvKiBmaXJzdCBkYXRhIHdyaXR0ZW4gdG8gdGhlIFBIWSB3aWxsIGJlIGFuIElEIG51bWJlciAqLworCQl0Y19waHlfd3JpdGUoZGV2LCAwLCB0ciwgMCwgTUlJX0NPTlRST0wpOwkvKiBJRDowICovCisjaWYgMAorCQl0Y19waHlfd3JpdGUoZGV2LCBNSUlDTlRMX1JFU0VULCB0ciwgMCwgTUlJX0NPTlRST0wpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzZXR0aW5nIFBIWS4uLiIsIGRldi0+bmFtZSk7CisJCXdoaWxlICh0Y19waHlfcmVhZChkZXYsIHRyLCAwLCBNSUlfQ09OVFJPTCkgJiBNSUlDTlRMX1JFU0VUKQorCQkJOworCQlwcmludGsoIlxuIik7CisJCXRjX3BoeV93cml0ZShkZXYsIE1JSUNOVExfQVVUT3xNSUlDTlRMX1NQRUVEfE1JSUNOVExfRkRYLCB0ciwgMCwKKwkJCSAgICAgTUlJX0NPTlRST0wpOworI2VuZGlmCisJCWlkMCA9IHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9QSFlfSUQwKTsKKwkJaWQxID0gdGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX1BIWV9JRDEpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBIWSBJRCAlMDR4ICUwNHhcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIGlkMCwgaWQxKTsKKwkJaWYgKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xME0pIHsKKwkJCWxwLT5saW5rc3BlZWQgPSAxMDsKKwkJCWxwLT5mdWxsZHVwbGV4ID0gKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF9GVUxMRFVQKSAhPSAwOworCQl9IGVsc2UgaWYgKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xMDBNKSB7CisJCQlscC0+bGlua3NwZWVkID0gMTAwOworCQkJbHAtPmZ1bGxkdXBsZXggPSAobHAtPm9wdGlvbiAmIFRDMzU4MTVfT1BUX0ZVTExEVVApICE9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBhdXRvIG5lZ290aWF0aW9uICovCisJCQl1bnNpZ25lZCBsb25nIG5lZ19yZXN1bHQ7CisJCQl0Y19waHlfd3JpdGUoZGV2LCBNSUlDTlRMX0FVVE8gfCBNSUlDTlRMX1JTVF9BVVRPLCB0ciwgMCwgTUlJX0NPTlRST0wpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG8gTmVnb3RpYXRpb24uLi4iLCBkZXYtPm5hbWUpOworCQkJY291bnQgPSAwOworCQkJd2hpbGUgKCEodGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX1NUQVRVUykgJiBNSUlTVEFUX0FVVE9fRE9ORSkpIHsKKwkJCQlpZiAoY291bnQrKyA+IDUwMDApIHsKKwkJCQkJcHJpbnRrKCIgZmFpbGVkLiBBc3N1bWUgMTBNYnBzXG4iKTsKKwkJCQkJbHAtPmxpbmtzcGVlZCA9IDEwOworCQkJCQlscC0+ZnVsbGR1cGxleCA9IDA7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQkJaWYgKGNvdW50ICUgNTEyID09IDApCisJCQkJCXByaW50aygiLiIpOworCQkJCW1kZWxheSgxKTsKKwkJCX0KKwkJCXByaW50aygiIGRvbmUuXG4iKTsKKwkJCW5lZ19yZXN1bHQgPSB0Y19waHlfcmVhZChkZXYsIHRyLCAwLCBNSUlfQU5MUEFSKTsKKwkJCWlmIChuZWdfcmVzdWx0ICYgKE1JSV9BTl9UWF9GRFggfCBNSUlfQU5fVFhfSERYKSkKKwkJCQlscC0+bGlua3NwZWVkID0gMTAwOworCQkJZWxzZQorCQkJCWxwLT5saW5rc3BlZWQgPSAxMDsKKwkJCWlmIChuZWdfcmVzdWx0ICYgKE1JSV9BTl9UWF9GRFggfCBNSUlfQU5fMTBfRkRYKSkKKwkJCQlscC0+ZnVsbGR1cGxleCA9IDE7CisJCQllbHNlCisJCQkJbHAtPmZ1bGxkdXBsZXggPSAwOworCQlkb25lOgorCQkJOworCQl9CisJfQorCisJY3RsID0gMDsKKwlpZiAobHAtPmxpbmtzcGVlZCA9PSAxMDApCisJCWN0bCB8PSBNSUlDTlRMX1NQRUVEOworCWlmIChscC0+ZnVsbGR1cGxleCkKKwkJY3RsIHw9IE1JSUNOVExfRkRYOworCXRjX3BoeV93cml0ZShkZXYsIGN0bCwgdHIsIDAsIE1JSV9DT05UUk9MKTsKKworCWlmIChscC0+ZnVsbGR1cGxleCkgeworCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5NQUNfQ3RsKSB8IE1BQ19GdWxsRHVwLCAmdHItPk1BQ19DdGwpOworCX0KK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9jaGlwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisKKwkvKiByZXNldCB0aGUgY29udHJvbGxlciAqLworCXRjX3dyaXRlbChNQUNfUmVzZXQsICZ0ci0+TUFDX0N0bCk7CisJd2hpbGUgKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgJiBNQUNfUmVzZXQpCisJCTsKKworCXRjX3dyaXRlbCgwLCAmdHItPk1BQ19DdGwpOworCisJLyogaW5pdGlhbGl6ZSByZWdpc3RlcnMgdG8gZGVmYXVsdCB2YWx1ZSAqLworCXRjX3dyaXRlbCgwLCAmdHItPkRNQV9DdGwpOworCXRjX3dyaXRlbCgwLCAmdHItPlR4VGhyc2gpOworCXRjX3dyaXRlbCgwLCAmdHItPlR4UG9sbEN0cik7CisJdGNfd3JpdGVsKDAsICZ0ci0+UnhGcmFnU2l6ZSk7CisJdGNfd3JpdGVsKDAsICZ0ci0+SW50X0VuKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5GREFfQmFzKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5GREFfTGltKTsKKwl0Y193cml0ZWwoMHhmZmZmZmZmZiwgJnRyLT5JbnRfU3JjKTsJLyogV3JpdGUgMSB0byBjbGVhciAqLworCXRjX3dyaXRlbCgwLCAmdHItPkNBTV9DdGwpOworCXRjX3dyaXRlbCgwLCAmdHItPlR4X0N0bCk7CisJdGNfd3JpdGVsKDAsICZ0ci0+UnhfQ3RsKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5DQU1fRW5hKTsKKwkodm9pZCl0Y19yZWFkbCgmdHItPk1pc3NfQ250KTsJLyogUmVhZCB0byBjbGVhciAqLworCit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0eGN0bCA9IFRYX0NUTF9DTUQ7CisKKwl0YzM1ODE1X3BoeV9jaGlwX2luaXQoZGV2KTsKKworCS8qIGxvYWQgc3RhdGlvbiBhZGRyZXNzIHRvIENBTSAqLworCXRjMzU4MTVfc2V0X2NhbV9lbnRyeSh0ciwgQ0FNX0VOVFJZX1NPVVJDRSwgZGV2LT5kZXZfYWRkcik7CisKKwkvKiBFbmFibGUgQ0FNIChicm9hZGNhc3QgYW5kIHVuaWNhc3QpICovCisJdGNfd3JpdGVsKENBTV9FbmFfQml0KENBTV9FTlRSWV9TT1VSQ0UpLCAmdHItPkNBTV9FbmEpOworCXRjX3dyaXRlbChDQU1fQ29tcEVuIHwgQ0FNX0Jyb2FkQWNjLCAmdHItPkNBTV9DdGwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl0Y193cml0ZWwoRE1BX0JVUlNUX1NJWkUsICZ0ci0+RE1BX0N0bCk7CisKKwl0Y193cml0ZWwoUnhGcmFnX0VuUGFjayB8IEVUSF9aTEVOLCAmdHItPlJ4RnJhZ1NpemUpOwkvKiBQYWNraW5nICovCisJdGNfd3JpdGVsKDAsICZ0ci0+VHhQb2xsQ3RyKTsJLyogQmF0Y2ggbW9kZSAqLworCXRjX3dyaXRlbChUWF9USFJFU0hPTEQsICZ0ci0+VHhUaHJzaCk7CisJdGNfd3JpdGVsKElOVF9FTl9DTUQsICZ0ci0+SW50X0VuKTsKKworCS8qIHNldCBxdWV1ZXMgKi8KKwl0Y193cml0ZWwodmlydF90b19idXMobHAtPnJmZF9iYXNlKSwgJnRyLT5GREFfQmFzKTsKKwl0Y193cml0ZWwoKHVuc2lnbmVkIGxvbmcpbHAtPnJmZF9saW1pdCAtICh1bnNpZ25lZCBsb25nKWxwLT5yZmRfYmFzZSwKKwkJICAmdHItPkZEQV9MaW0pOworCS8qCisJICogQWN0aXZhdGlvbiBtZXRob2Q6CisJICogRmlyc3QsIGVuYWJsZSBlaHQgTUFDIFRyYW5zbWl0dGVyIGFuZCB0aGUgRE1BIFJlY2VpdmUgY2lyY3VpdHMuCisJICogVGhlbiBlbmFibGUgdGhlIERNQSBUcmFuc21pdHRlciBhbmQgdGhlIE1BQyBSZWNlaXZlIGNpcmN1aXRzLgorCSAqLworCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyhscC0+ZmJsX3B0ciksICZ0ci0+QkxGcm1QdHIpOwkvKiBzdGFydCBETUEgcmVjZWl2ZXIgKi8KKwl0Y193cml0ZWwoUlhfQ1RMX0NNRCwgJnRyLT5SeF9DdGwpOwkvKiBzdGFydCBNQUMgcmVjZWl2ZXIgKi8KKwkvKiBzdGFydCBNQUMgdHJhbnNtaXR0ZXIgKi8KKwkvKiBXT1JLQVJPVU5EOiBpZ25vcmUgTG9zdENyUyBpbiBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KKwlpZiAobHAtPmZ1bGxkdXBsZXgpCisJCXR4Y3RsID0gVFhfQ1RMX0NNRCAmIH5UeF9FbkxDYXJyOworI2lmZGVmIEdBVEhFUl9UWElOVAorCXR4Y3RsICY9IH5UeF9FbkNvbXA7CS8qIGRpc2FibGUgZ2xvYmFsIHR4IGNvbXBsZXRpb24gaW50LiAqLworI2VuZGlmCisJdGNfd3JpdGVsKHR4Y3RsLCAmdHItPlR4X0N0bCk7CisjaWYgMAkvKiBObyBuZWVkIHRvIHBvbGxpbmcgKi8KKwl0Y193cml0ZWwodmlydF90b19idXMobHAtPnRmZF9iYXNlKSwgJnRyLT5UeEZybVB0cik7CS8qIHN0YXJ0IERNQSB0cmFuc21pdHRlciAqLworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworLyogWFhYICovCit2b2lkCit0YzM1ODE1X2tpbGxhbGwodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZm9yIChkZXYgPSByb290X3RjMzU4MTVfZGV2OyBkZXY7IGRldiA9ICgoc3RydWN0IHRjMzU4MTVfbG9jYWwgKilkZXYtPnByaXYpLT5uZXh0X21vZHVsZSkgeworCQlpZiAoZGV2LT5mbGFncyZJRkZfVVApeworCQkJZGV2LT5zdG9wKGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0YzM1ODE1X2RyaXZlciA9IHsKKwkubmFtZSA9IFRDMzU4MTVfTU9EVUxFX05BTUUsCisJLnByb2JlID0gdGMzNTgxNV9wcm9iZSwKKwkucmVtb3ZlID0gTlVMTCwKKwkuaWRfdGFibGUgPSB0YzM1ODE1X3BjaV90YmwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0YzM1ODE1X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdGMzNTgxNV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGMzNTgxNV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKworCXdoaWxlIChyb290X3RjMzU4MTVfZGV2KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByb290X3RjMzU4MTVfZGV2OworCQluZXh0X2RldiA9ICgoc3RydWN0IHRjMzU4MTVfbG9jYWwgKilkZXYtPnByaXYpLT5uZXh0X21vZHVsZTsKKwkJaW91bm1hcCgodm9pZCAqKShkZXYtPmJhc2VfYWRkcikpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyb290X3RjMzU4MTVfZGV2ID0gbmV4dF9kZXY7CisJfQorfQorbW9kdWxlX2luaXQodGMzNTgxNV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0YzM1ODE1X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZTgwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC0wLDAgKzEsOTA4MyBAQAorLyoKKyAqIHRnMy5jOiBCcm9hZGNvbSBUaWdvbjMgZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgSmVmZiBHYXJ6aWsgKGpnYXJ6aWtAcG9ib3guY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA0IFN1biBNaWNyb3N5c3RlbXMgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA1IEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqIEZpcm13YXJlIGlzOgorICogCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3BibS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgVEczX1ZMQU5fVEFHX1VTRUQgMQorI2Vsc2UKKyNkZWZpbmUgVEczX1ZMQU5fVEFHX1VTRUQgMAorI2VuZGlmCisKKyNpZmRlZiBORVRJRl9GX1RTTworI2RlZmluZSBURzNfVFNPX1NVUFBPUlQJMQorI2Vsc2UKKyNkZWZpbmUgVEczX1RTT19TVVBQT1JUCTAKKyNlbmRpZgorCisjaW5jbHVkZSAidGczLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjI1IgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIk1hcmNoIDI0LCAyMDA1IgorCisjZGVmaW5lIFRHM19ERUZfTUFDX01PREUJMAorI2RlZmluZSBURzNfREVGX1JYX01PREUJCTAKKyNkZWZpbmUgVEczX0RFRl9UWF9NT0RFCQkwCisjZGVmaW5lIFRHM19ERUZfTVNHX0VOQUJMRQkgIFwKKwkoTkVUSUZfTVNHX0RSVgkJfCBcCisJIE5FVElGX01TR19QUk9CRQl8IFwKKwkgTkVUSUZfTVNHX0xJTksJCXwgXAorCSBORVRJRl9NU0dfVElNRVIJfCBcCisJIE5FVElGX01TR19JRkRPV04JfCBcCisJIE5FVElGX01TR19JRlVQCQl8IFwKKwkgTkVUSUZfTVNHX1JYX0VSUgl8IFwKKwkgTkVUSUZfTVNHX1RYX0VSUikKKworLyogbGVuZ3RoIG9mIHRpbWUgYmVmb3JlIHdlIGRlY2lkZSB0aGUgaGFyZHdhcmUgaXMgYm9ya2VkLAorICogYW5kIGRldi0+dHhfdGltZW91dCgpIHNob3VsZCBiZSBjYWxsZWQgdG8gZml4IHRoZSBwcm9ibGVtCisgKi8KKyNkZWZpbmUgVEczX1RYX1RJTUVPVVQJCQkoNSAqIEhaKQorCisvKiBoYXJkd2FyZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGZvciBhIHNpbmdsZSBmcmFtZSdzIGRhdGEgcGF5bG9hZCAqLworI2RlZmluZSBURzNfTUlOX01UVQkJCTYwCisjZGVmaW5lIFRHM19NQVhfTVRVKHRwKQlcCisJKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSAmJiBcCisJICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MCkgPyA5MDAwIDogMTUwMCkKKworLyogVGhlc2UgbnVtYmVycyBzZWVtIHRvIGJlIGhhcmQgY29kZWQgaW4gdGhlIE5JQyBmaXJtd2FyZSBzb21laG93LgorICogWW91IGNhbid0IGNoYW5nZSB0aGUgcmluZyBzaXplcywgYnV0IHlvdSBjYW4gY2hhbmdlIHdoZXJlIHlvdSBwbGFjZQorICogdGhlbSBpbiB0aGUgTklDIG9uYm9hcmQgbWVtb3J5LgorICovCisjZGVmaW5lIFRHM19SWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBURzNfREVGX1JYX1JJTkdfUEVORElORwkJMjAwCisjZGVmaW5lIFRHM19SWF9KVU1CT19SSU5HX1NJWkUJCTI1NgorI2RlZmluZSBURzNfREVGX1JYX0pVTUJPX1JJTkdfUEVORElORwkxMDAKKworLyogRG8gbm90IHBsYWNlIHRoaXMgbi1yaW5nIGVudHJpZXMgdmFsdWUgaW50byB0aGUgdHAgc3RydWN0IGl0c2VsZiwKKyAqIHdlIHJlYWxseSB3YW50IHRvIGV4cG9zZSB0aGVzZSBjb25zdGFudHMgdG8gR0NDIHNvIHRoYXQgbW9kdWxvIGV0CisgKiBhbC4gIG9wZXJhdGlvbnMgYXJlIGRvbmUgd2l0aCBzaGlmdHMgYW5kIG1hc2tzIGluc3RlYWQgb2Ygd2l0aAorICogaHcgbXVsdGlwbHkvbW9kdWxvIGluc3RydWN0aW9ucy4gIEFub3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8KKyAqIHJlcGxhY2UgdGhpbmdzIGxpa2UgJyUgZm9vJyB3aXRoICcmIChmb28gLSAxKScuCisgKi8KKyNkZWZpbmUgVEczX1JYX1JDQl9SSU5HX1NJWkUodHApCVwKKwkoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSA/ICA1MTIgOiAxMDI0KQorCisjZGVmaW5lIFRHM19UWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBURzNfREVGX1RYX1JJTkdfUEVORElORwkJKFRHM19UWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFRHM19SWF9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykgKiBcCisJCQkJIFRHM19SWF9SSU5HX1NJWkUpCisjZGVmaW5lIFRHM19SWF9KVU1CT19SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykgKiBcCisJCQkgICAgICAgICBURzNfUlhfSlVNQk9fUklOR19TSVpFKQorI2RlZmluZSBURzNfUlhfUkNCX1JJTkdfQllURVModHApIChzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykgKiBcCisJCQkgICAgICAgICAgIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKSkKKyNkZWZpbmUgVEczX1RYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjKSAqIFwKKwkJCQkgVEczX1RYX1JJTkdfU0laRSkKKyNkZWZpbmUgVFhfUklOR19HQVAoVFApCVwKKwkoVEczX1RYX1JJTkdfU0laRSAtIChUUCktPnR4X3BlbmRpbmcpCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKFRQKQkJCQkJCVwKKwkoKChUUCktPnR4X2NvbnMgPD0gKFRQKS0+dHhfcHJvZCkgPwkJCQlcCisJICAoVFApLT50eF9jb25zICsgKFRQKS0+dHhfcGVuZGluZyAtIChUUCktPnR4X3Byb2QgOgkJXAorCSAgKFRQKS0+dHhfY29ucyAtIChUUCktPnR4X3Byb2QgLSBUWF9SSU5HX0dBUChUUCkpCisjZGVmaW5lIE5FWFRfVFgoTikJCSgoKE4pICsgMSkgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFJYX1BLVF9CVUZfU1oJCSgxNTM2ICsgdHAtPnJ4X29mZnNldCArIDY0KQorI2RlZmluZSBSWF9KVU1CT19QS1RfQlVGX1NaCSg5MDQ2ICsgdHAtPnJ4X29mZnNldCArIDY0KQorCisvKiBtaW5pbXVtIG51bWJlciBvZiBmcmVlIFRYIGRlc2NyaXB0b3JzIHJlcXVpcmVkIHRvIHdha2UgdXAgVFggcHJvY2VzcyAqLworI2RlZmluZSBURzNfVFhfV0FLRVVQX1RIUkVTSAkJKFRHM19UWF9SSU5HX1NJWkUgLyA0KQorCisvKiBudW1iZXIgb2YgRVRIVE9PTF9HU1RBVFMgdTY0J3MgKi8KKyNkZWZpbmUgVEczX05VTV9TVEFUUwkJKHNpemVvZihzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMpL3NpemVvZih1NjQpKQorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkgYW5kIEplZmYgR2FyemlrIChqZ2FyemlrQHBvYm94LmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworc3RhdGljIGludCB0ZzNfZGVidWcgPSAtMTsJLyogLTEgPT0gdXNlIFRHM19ERUZfTVNHX0VOQUJMRSBhcyB2YWx1ZSAqLworbW9kdWxlX3BhcmFtKHRnM19kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGczX2RlYnVnLCAiVGlnb24zIGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRnM19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA0LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyRkUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVfMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNU0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVNXzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAzWCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNFMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJBMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM0EzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgyLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg4LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg5LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxXzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDRTXzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVGLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzIwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzIxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUwTSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MU0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFGLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzTSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1M0YsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODEsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUXzlEWFgsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUXzlNWFgsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQUxUSU1BLCBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzEwMDAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQUxUSU1BLCBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzEwMDEsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQUxUSU1BLCBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzEwMDMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQUxUSU1BLCBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzkxMDAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfVElHT04zLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdGczX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyIHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOworfSBldGh0b29sX3N0YXRzX2tleXNbVEczX05VTV9TVEFUU10gPSB7CisJeyAicnhfb2N0ZXRzIiB9LAorCXsgInJ4X2ZyYWdtZW50cyIgfSwKKwl7ICJyeF91Y2FzdF9wYWNrZXRzIiB9LAorCXsgInJ4X21jYXN0X3BhY2tldHMiIH0sCisJeyAicnhfYmNhc3RfcGFja2V0cyIgfSwKKwl7ICJyeF9mY3NfZXJyb3JzIiB9LAorCXsgInJ4X2FsaWduX2Vycm9ycyIgfSwKKwl7ICJyeF94b25fcGF1c2VfcmN2ZCIgfSwKKwl7ICJyeF94b2ZmX3BhdXNlX3JjdmQiIH0sCisJeyAicnhfbWFjX2N0cmxfcmN2ZCIgfSwKKwl7ICJyeF94b2ZmX2VudGVyZWQiIH0sCisJeyAicnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzIiB9LAorCXsgInJ4X2phYmJlcnMiIH0sCisJeyAicnhfdW5kZXJzaXplX3BhY2tldHMiIH0sCisJeyAicnhfaW5fbGVuZ3RoX2Vycm9ycyIgfSwKKwl7ICJyeF9vdXRfbGVuZ3RoX2Vycm9ycyIgfSwKKwl7ICJyeF82NF9vcl9sZXNzX29jdGV0X3BhY2tldHMiIH0sCisJeyAicnhfNjVfdG9fMTI3X29jdGV0X3BhY2tldHMiIH0sCisJeyAicnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzI1Nl90b181MTFfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF81MTJfdG9fMTAyM19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzE1MjNfdG9fMjA0N19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzIwNDhfdG9fNDA5NV9vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzgxOTJfdG9fOTAyMl9vY3RldF9wYWNrZXRzIiB9LAorCisJeyAidHhfb2N0ZXRzIiB9LAorCXsgInR4X2NvbGxpc2lvbnMiIH0sCisKKwl7ICJ0eF94b25fc2VudCIgfSwKKwl7ICJ0eF94b2ZmX3NlbnQiIH0sCisJeyAidHhfZmxvd19jb250cm9sIiB9LAorCXsgInR4X21hY19lcnJvcnMiIH0sCisJeyAidHhfc2luZ2xlX2NvbGxpc2lvbnMiIH0sCisJeyAidHhfbXVsdF9jb2xsaXNpb25zIiB9LAorCXsgInR4X2RlZmVycmVkIiB9LAorCXsgInR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zIiB9LAorCXsgInR4X2xhdGVfY29sbGlzaW9ucyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzJ0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzN0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzR0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzV0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzZ0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzd0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzh0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzl0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzEwdGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xMXRpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTJ0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzEzdGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xNHRpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTV0aW1lcyIgfSwKKwl7ICJ0eF91Y2FzdF9wYWNrZXRzIiB9LAorCXsgInR4X21jYXN0X3BhY2tldHMiIH0sCisJeyAidHhfYmNhc3RfcGFja2V0cyIgfSwKKwl7ICJ0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyIgfSwKKwl7ICJ0eF9kaXNjYXJkcyIgfSwKKwl7ICJ0eF9lcnJvcnMiIH0sCisKKwl7ICJkbWFfd3JpdGVxX2Z1bGwiIH0sCisJeyAiZG1hX3dyaXRlX3ByaW9xX2Z1bGwiIH0sCisJeyAicnhiZHNfZW1wdHkiIH0sCisJeyAicnhfZGlzY2FyZHMiIH0sCisJeyAicnhfZXJyb3JzIiB9LAorCXsgInJ4X3RocmVzaG9sZF9oaXQiIH0sCisKKwl7ICJkbWFfcmVhZHFfZnVsbCIgfSwKKwl7ICJkbWFfcmVhZF9wcmlvcV9mdWxsIiB9LAorCXsgInR4X2NvbXBfcXVldWVfZnVsbCIgfSwKKworCXsgInJpbmdfc2V0X3NlbmRfcHJvZF9pbmRleCIgfSwKKwl7ICJyaW5nX3N0YXR1c191cGRhdGUiIH0sCisJeyAibmljX2lycXMiIH0sCisJeyAibmljX2F2b2lkZWRfaXJxcyIgfSwKKwl7ICJuaWNfdHhfdGhyZXNob2xkX2hpdCIgfQorfTsKKworc3RhdGljIHZvaWQgdGczX3dyaXRlX2luZGlyZWN0X3JlZzMyKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHKSAhPSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5pbmRpcmVjdF9sb2NrLCBmbGFncyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9SRUdfQkFTRV9BRERSLCBvZmYpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUkVHX0RBVEEsIHZhbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5pbmRpcmVjdF9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKHZhbCwgdHAtPnJlZ3MgKyBvZmYpOworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR181NzAxX1JFR19XUklURV9CVUcpICE9IDApCisJCQlyZWFkbCh0cC0+cmVncyArIG9mZik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfdHczMl9mbHVzaChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKK3sKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgIT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUkVHX0JBU0VfQUREUiwgb2ZmKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19EQVRBLCB2YWwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXZvaWQgX19pb21lbSAqZGVzdCA9IHRwLT5yZWdzICsgb2ZmOworCQl3cml0ZWwodmFsLCBkZXN0KTsKKwkJcmVhZGwoZGVzdCk7ICAgIC8qIGFsd2F5cyBmbHVzaCBQQ0kgd3JpdGUgKi8KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdHczMl9yeF9tYm94KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCXZvaWQgX19pb21lbSAqbWJveCA9IHRwLT5yZWdzICsgb2ZmOworCXdyaXRlbCh2YWwsIG1ib3gpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSKQorCQlyZWFkbChtYm94KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF90dzMyX3R4X21ib3goc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiB2YWwpCit7CisJdm9pZCBfX2lvbWVtICptYm94ID0gdHAtPnJlZ3MgKyBvZmY7CisJd3JpdGVsKHZhbCwgbWJveCk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UWERfTUJPWF9IV0JVRykKKwkJd3JpdGVsKHZhbCwgbWJveCk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19NQk9YX1dSSVRFX1JFT1JERVIpCisJCXJlYWRsKG1ib3gpOworfQorCisjZGVmaW5lIHR3MzJfbWFpbGJveChyZWcsIHZhbCkgIHdyaXRlbCgoKHZhbCkgJiAweGZmZmZmZmZmKSwgdHAtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHczMl9yeF9tYm94KHJlZywgdmFsKSAgX3R3MzJfcnhfbWJveCh0cCwgcmVnLCB2YWwpCisjZGVmaW5lIHR3MzJfdHhfbWJveChyZWcsIHZhbCkgIF90dzMyX3R4X21ib3godHAsIHJlZywgdmFsKQorCisjZGVmaW5lIHR3MzIocmVnLHZhbCkJCXRnM193cml0ZV9pbmRpcmVjdF9yZWczMih0cCwocmVnKSwodmFsKSkKKyNkZWZpbmUgdHczMl9mKHJlZyx2YWwpCQlfdHczMl9mbHVzaCh0cCwocmVnKSwodmFsKSkKKyNkZWZpbmUgdHcxNihyZWcsdmFsKQkJd3JpdGV3KCgodmFsKSAmIDB4ZmZmZiksIHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHR3OChyZWcsdmFsKQkJd3JpdGViKCgodmFsKSAmIDB4ZmYpLCB0cC0+cmVncyArIChyZWcpKQorI2RlZmluZSB0cjMyKHJlZykJCXJlYWRsKHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyMTYocmVnKQkJcmVhZHcodHAtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHI4KHJlZykJCXJlYWRiKHRwLT5yZWdzICsgKHJlZykpCisKK3N0YXRpYyB2b2lkIHRnM193cml0ZV9tZW0oc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgb2ZmKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCisJLyogQWx3YXlzIGxlYXZlIHRoaXMgYXMgemVyby4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5pbmRpcmVjdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19yZWFkX21lbShzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyICp2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgb2ZmKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0RBVEEsIHZhbCk7CisKKwkvKiBBbHdheXMgbGVhdmUgdGhpcyBhcyB6ZXJvLiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdGczX2Rpc2FibGVfaW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkgICAgICh0cC0+bWlzY19ob3N0X2N0cmwgfCBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAxKTsKKwl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfY29uZF9pbnQoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT5od19zdGF0dXMtPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKQorCQl0dzMyKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfCBHUkNfTENMQ1RSTF9TRVRJTlQpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfZW5hYmxlX2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJICAgICAodHAtPm1pc2NfaG9zdF9jdHJsICYgfk1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCkpOworCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIDB4MDAwMDAwMDApOworCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XKTsKKworCXRnM19jb25kX2ludCh0cCk7Cit9CisKKy8qIHRnM19yZXN0YXJ0X2ludHMKKyAqICBzaW1pbGFyIHRvIHRnM19lbmFibGVfaW50cywgYnV0IGl0IGNhbiByZXR1cm4gd2l0aG91dCBmbHVzaGluZyB0aGUKKyAqICBQSU8gd3JpdGUgd2hpY2ggcmVlbmFibGVzIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgdGczX3Jlc3RhcnRfaW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJKHRwLT5taXNjX2hvc3RfY3RybCAmIH5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAwKTsKKwltbWlvd2IoKTsKKworCXRnM19jb25kX2ludCh0cCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfbmV0aWZfc3RvcChzdHJ1Y3QgdGczICp0cCkKK3sKKwluZXRpZl9wb2xsX2Rpc2FibGUodHAtPmRldik7CisJbmV0aWZfdHhfZGlzYWJsZSh0cC0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRnM19uZXRpZl9zdGFydChzdHJ1Y3QgdGczICp0cCkKK3sKKwluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOworCS8qIE5PVEU6IHVuY29uZGl0aW9uYWwgbmV0aWZfd2FrZV9xdWV1ZSBpcyBvbmx5IGFwcHJvcHJpYXRlCisJICogc28gbG9uZyBhcyBhbGwgY2FsbGVycyBhcmUgYXNzdXJlZCB0byBoYXZlIGZyZWUgdHggc2xvdHMKKwkgKiAoc3VjaCBhcyBhZnRlciB0ZzNfaW5pdF9odykKKwkgKi8KKwluZXRpZl9wb2xsX2VuYWJsZSh0cC0+ZGV2KTsKKwl0ZzNfY29uZF9pbnQodHApOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc3dpdGNoX2Nsb2NrcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgY2xvY2tfY3RybCA9IHRyMzIoVEczUENJX0NMT0NLX0NUUkwpOworCXUzMiBvcmlnX2Nsb2NrX2N0cmw7CisKKwlvcmlnX2Nsb2NrX2N0cmwgPSBjbG9ja19jdHJsOworCWNsb2NrX2N0cmwgJj0gKENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOIHwKKwkJICAgICAgIENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEUgfAorCQkgICAgICAgMHgxZik7CisJdHAtPnBjaV9jbG9ja19jdHJsID0gY2xvY2tfY3RybDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgeworCQlpZiAob3JpZ19jbG9ja19jdHJsICYgQ0xPQ0tfQ1RSTF82MjVfQ09SRSkgeworCQkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkJICAgICAgIGNsb2NrX2N0cmwgfCBDTE9DS19DVFJMXzYyNV9DT1JFKTsKKwkJCXVkZWxheSg0MCk7CisJCX0KKwl9IGVsc2UgaWYgKChvcmlnX2Nsb2NrX2N0cmwgJiBDTE9DS19DVFJMXzQ0TUhaX0NPUkUpICE9IDApIHsKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkgICAgIGNsb2NrX2N0cmwgfAorCQkgICAgIChDTE9DS19DVFJMXzQ0TUhaX0NPUkUgfCBDTE9DS19DVFJMX0FMVENMSykpOworCQl1ZGVsYXkoNDApOworCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsCisJCSAgICAgY2xvY2tfY3RybCB8IChDTE9DS19DVFJMX0FMVENMSykpOworCQl1ZGVsYXkoNDApOworCX0KKwl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIGNsb2NrX2N0cmwpOworCXVkZWxheSg0MCk7Cit9CisKKyNkZWZpbmUgUEhZX0JVU1lfTE9PUFMJNTAwMAorCitzdGF0aWMgaW50IHRnM19yZWFkcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgcmVnLCB1MzIgKnZhbCkKK3sKKwl1MzIgZnJhbWVfdmFsOworCXVuc2lnbmVkIGludCBsb29wczsKKwlpbnQgcmV0OworCisJaWYgKCh0cC0+bWlfbW9kZSAmIE1BQ19NSV9NT0RFX0FVVE9fUE9MTCkgIT0gMCkgeworCQl0dzMyX2YoTUFDX01JX01PREUsCisJCSAgICAgKHRwLT5taV9tb2RlICYgfk1BQ19NSV9NT0RFX0FVVE9fUE9MTCkpOworCQl1ZGVsYXkoODApOworCX0KKworCSp2YWwgPSAweDA7CisKKwlmcmFtZV92YWwgID0gKChQSFlfQUREUiA8PCBNSV9DT01fUEhZX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1BIWV9BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoKHJlZyA8PCBNSV9DT01fUkVHX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1JFR19BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoTUlfQ09NX0NNRF9SRUFEIHwgTUlfQ09NX1NUQVJUKTsKKwkKKwl0dzMyX2YoTUFDX01JX0NPTSwgZnJhbWVfdmFsKTsKKworCWxvb3BzID0gUEhZX0JVU1lfTE9PUFM7CisJd2hpbGUgKGxvb3BzICE9IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKworCQlpZiAoKGZyYW1lX3ZhbCAmIE1JX0NPTV9CVVNZKSA9PSAwKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcHMgLT0gMTsKKwl9CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxvb3BzICE9IDApIHsKKwkJKnZhbCA9IGZyYW1lX3ZhbCAmIE1JX0NPTV9EQVRBX01BU0s7CisJCXJldCA9IDA7CisJfQorCisJaWYgKCh0cC0+bWlfbW9kZSAmIE1BQ19NSV9NT0RFX0FVVE9fUE9MTCkgIT0gMCkgeworCQl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRnM193cml0ZXBoeShzdHJ1Y3QgdGczICp0cCwgaW50IHJlZywgdTMyIHZhbCkKK3sKKwl1MzIgZnJhbWVfdmFsOworCXVuc2lnbmVkIGludCBsb29wczsKKwlpbnQgcmV0OworCisJaWYgKCh0cC0+bWlfbW9kZSAmIE1BQ19NSV9NT0RFX0FVVE9fUE9MTCkgIT0gMCkgeworCQl0dzMyX2YoTUFDX01JX01PREUsCisJCSAgICAgKHRwLT5taV9tb2RlICYgfk1BQ19NSV9NT0RFX0FVVE9fUE9MTCkpOworCQl1ZGVsYXkoODApOworCX0KKworCWZyYW1lX3ZhbCAgPSAoKFBIWV9BRERSIDw8IE1JX0NPTV9QSFlfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUEhZX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9ICgocmVnIDw8IE1JX0NPTV9SRUdfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUkVHX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9ICh2YWwgJiBNSV9DT01fREFUQV9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKE1JX0NPTV9DTURfV1JJVEUgfCBNSV9DT01fU1RBUlQpOworCQorCXR3MzJfZihNQUNfTUlfQ09NLCBmcmFtZV92YWwpOworCisJbG9vcHMgPSBQSFlfQlVTWV9MT09QUzsKKwl3aGlsZSAobG9vcHMgIT0gMCkgeworCQl1ZGVsYXkoMTApOworCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQlpZiAoKGZyYW1lX3ZhbCAmIE1JX0NPTV9CVVNZKSA9PSAwKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcHMgLT0gMTsKKwl9CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxvb3BzICE9IDApCisJCXJldCA9IDA7CisKKwlpZiAoKHRwLT5taV9tb2RlICYgTUFDX01JX01PREVfQVVUT19QT0xMKSAhPSAwKSB7CisJCXR3MzJfZihNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCQl1ZGVsYXkoODApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19waHlfc2V0X3dpcmVzcGVlZChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQpCisJCXJldHVybjsKKworCWlmICghdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDcwMDcpICYmCisJICAgICF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgJnZhbCkpCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwKKwkJCSAgICAgKHZhbCB8ICgxIDw8IDE1KSB8ICgxIDw8IDQpKSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX2JtY3JfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHBoeV9jb250cm9sOworCWludCBsaW1pdCwgZXJyOworCisJLyogT0ssIHJlc2V0IGl0LCBhbmQgcG9sbCB0aGUgQk1DUl9SRVNFVCBiaXQgdW50aWwgaXQKKwkgKiBjbGVhcnMgb3Igd2UgdGltZSBvdXQuCisJICovCisJcGh5X2NvbnRyb2wgPSBCTUNSX1JFU0VUOworCWVyciA9IHRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIHBoeV9jb250cm9sKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlsaW1pdCA9IDUwMDA7CisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJZXJyID0gdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmcGh5X2NvbnRyb2wpOworCQlpZiAoZXJyICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICgocGh5X2NvbnRyb2wgJiBCTUNSX1JFU0VUKSA9PSAwKSB7CisJCQl1ZGVsYXkoNDApOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0IDw9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfd2FpdF9tYWNyb19kb25lKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBsaW1pdCA9IDEwMDsKKworCXdoaWxlIChsaW1pdC0tKSB7CisJCXUzMiB0bXAzMjsKKworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCAweDE2LCAmdG1wMzIpKSB7CisJCQlpZiAoKHRtcDMyICYgMHgxMDAwKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaW1pdCA8PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV93cml0ZV9hbmRfY2hlY2tfdGVzdHBhdChzdHJ1Y3QgdGczICp0cCwgaW50ICpyZXNldHApCit7CisJc3RhdGljIGNvbnN0IHUzMiB0ZXN0X3BhdFs0XVs2XSA9IHsKKwl7IDB4MDAwMDU1NTUsIDB4MDAwMDAwMDUsIDB4MDAwMDJhYWEsIDB4MDAwMDAwMGEsIDB4MDAwMDM0NTYsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwMDJhYWEsIDB4MDAwMDAwMGEsIDB4MDAwMDMzMzMsIDB4MDAwMDAwMDMsIDB4MDAwMDc4OWEsIDB4MDAwMDAwMDUgfSwKKwl7IDB4MDAwMDVhNWEsIDB4MDAwMDAwMDUsIDB4MDAwMDJhNmEsIDB4MDAwMDAwMGEsIDB4MDAwMDFiY2QsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwMDJhNWEsIDB4MDAwMDAwMGEsIDB4MDAwMDMzYzMsIDB4MDAwMDAwMDMsIDB4MDAwMDJlZjEsIDB4MDAwMDAwMDUgfQorCX07CisJaW50IGNoYW47CisKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgNDsgY2hhbisrKSB7CisJCWludCBpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCSAgICAgKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwMDIpOworCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsCisJCQkJICAgICB0ZXN0X3BhdFtjaGFuXVtpXSk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAyMDIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCSpyZXNldHAgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCSAgICAgKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwODIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCSpyZXNldHAgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwODAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCQl1MzIgbG93LCBoaWdoOworCisJCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsICZsb3cpIHx8CisJCQkgICAgdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsICZoaWdoKSB8fAorCQkJICAgIHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkJKnJlc2V0cCA9IDE7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWxvdyAmPSAweDdmZmY7CisJCQloaWdoICY9IDB4MDAwZjsKKwkJCWlmIChsb3cgIT0gdGVzdF9wYXRbY2hhbl1baV0gfHwKKwkJCSAgICBoaWdoICE9IHRlc3RfcGF0W2NoYW5dW2krMV0pIHsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYik7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDQwMDEpOworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHg0MDA1KTsKKworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X3Jlc2V0X2NoYW5wYXQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGNoYW47CisKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgNDsgY2hhbisrKSB7CisJCWludCBpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCSAgICAgKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwMDIpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X3Jlc2V0XzU3MDNfNF81KHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiByZWczMiwgcGh5OV9vcmlnOworCWludCByZXRyaWVzLCBkb19waHlfcmVzZXQsIGVycjsKKworCXJldHJpZXMgPSAxMDsKKwlkb19waHlfcmVzZXQgPSAxOworCWRvIHsKKwkJaWYgKGRvX3BoeV9yZXNldCkgeworCQkJZXJyID0gdGczX2JtY3JfcmVzZXQodHApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJZG9fcGh5X3Jlc2V0ID0gMDsKKwkJfQorCisJCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIgYW5kIGludGVycnVwdC4gICovCisJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnJlZzMyKSkKKwkJCWNvbnRpbnVlOworCisJCXJlZzMyIHw9IDB4MzAwMDsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCByZWczMik7CisKKwkJLyogU2V0IGZ1bGwtZHVwbGV4LCAxMDAwIG1icHMuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAorCQkJICAgICBCTUNSX0ZVTExEUExYIHwgVEczX0JNQ1JfU1BFRUQxMDAwKTsKKworCQkvKiBTZXQgdG8gbWFzdGVyIG1vZGUuICAqLworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnBoeTlfb3JpZykpCisJCQljb250aW51ZTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwKKwkJCSAgICAgKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJICAgICAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpKTsKKworCQkvKiBFbmFibGUgU01fRFNQX0NMT0NLIGFuZCA2ZEIuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMwMCk7CisKKwkJLyogQmxvY2sgdGhlIFBIWSBjb250cm9sIGFjY2Vzcy4gICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA1KTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDA4MDApOworCisJCWVyciA9IHRnM19waHlfd3JpdGVfYW5kX2NoZWNrX3Rlc3RwYXQodHAsICZkb19waHlfcmVzZXQpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tcmV0cmllcyk7CisKKwllcnIgPSB0ZzNfcGh5X3Jlc2V0X2NoYW5wYXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNSk7CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAwMDApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgyMDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAwKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQkvKiBTZXQgRXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiaXQgZm9yIGp1bWJvIGZyYW1lcyAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NDQwMCk7CisJfQorCWVsc2UgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDQwMCk7CisJfQorCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIHBoeTlfb3JpZyk7CisKKwlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcmVnMzIpKSB7CisJCXJlZzMyICY9IH4weDMwMDA7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOworCX0gZWxzZSBpZiAoIWVycikKKwkJZXJyID0gLUVCVVNZOworCisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyB3aWxsIHJlc2V0IHRoZSB0aWdvbjMgUEhZIGlmIHRoZXJlIGlzIG5vIHZhbGlkCisgKiBsaW5rIHVubGVzcyB0aGUgRk9SQ0UgYXJndW1lbnQgaXMgbm9uLXplcm8uCisgKi8KK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgcGh5X3N0YXR1czsKKwlpbnQgZXJyOworCisJZXJyICA9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnBoeV9zdGF0dXMpOworCWVyciB8PSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZwaHlfc3RhdHVzKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHsKKwkJZXJyID0gdGczX3BoeV9yZXNldF81NzAzXzRfNSh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB0ZzNfYm1jcl9yZXNldCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworb3V0OgorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9BRENfQlVHKSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MmFhYSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDBhKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAzMjMpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDQwMCk7CisJfQorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV81NzA0X0EwX0JVRykgeworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwl9CisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX0JFUl9CVUcpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgzMTBiKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4OTUwNik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg0MDFmKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDE0ZTIpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDQwMCk7CisJfQorCS8qIFNldCBFeHRlbmRlZCBwYWNrZXQgbGVuZ3RoIGJpdCAoYml0IDE0KSBvbiBhbGwgY2hpcHMgdGhhdCAqLworCS8qIHN1cHBvcnQganVtYm8gZnJhbWVzICovCisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSB7CisJCS8qIENhbm5vdCBkbyByZWFkLW1vZGlmeS13cml0ZSBvbiA1NDAxICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg0YzIwKTsKKwl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1ICYmCisJCSAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzUwKSB7CisJCXUzMiBwaHlfcmVnOworCisJCS8qIFNldCBiaXQgMTQgd2l0aCByZWFkLW1vZGlmeS13cml0ZSB0byBwcmVzZXJ2ZSBvdGhlciBiaXRzICovCisJCWlmICghdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDAwMDcpICYmCisJCSAgICAhdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZwaHlfcmVnKSkKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgcGh5X3JlZyB8IDB4NDAwMCk7CisJfQorCisJLyogU2V0IHBoeSByZWdpc3RlciAweDEwIGJpdCAwIHRvIGhpZ2ggZmlmbyBlbGFzdGljaXR5IHRvIHN1cHBvcnQKKwkgKiBqdW1ibyBmcmFtZXMgdHJhbnNtaXNzaW9uLgorCSAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MCkgeworCQl1MzIgcGh5X3JlZzsKKworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcGh5X3JlZykpCisJCSAgICB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsCisJCQkJIHBoeV9yZWcgfCBNSUlfVEczX0VYVF9DVFJMX0ZJRk9fRUxBU1RJQyk7CisJfQorCisJdGczX3BoeV9zZXRfd2lyZXNwZWVkKHRwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGczX2Zyb2JfYXV4X3Bvd2VyKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCB0ZzMgKnRwX3BlZXIgPSB0cDsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UKSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJdHBfcGVlciA9IHBjaV9nZXRfZHJ2ZGF0YSh0cC0+cGRldl9wZWVyKTsKKwkJaWYgKCF0cF9wZWVyKQorCQkJQlVHKCk7CisJfQorCisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfRU5BQkxFKSAhPSAwIHx8CisJICAgICh0cF9wZWVyLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfRU5BQkxFKSAhPSAwKSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJCSAgICAgKEdSQ19MQ0xDVFJMX0dQSU9fT0UwIHwKKwkJCSAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCSAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyIHwKKwkJCSAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMCB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpKTsKKwkJCXVkZWxheSgxMDApOworCQl9IGVsc2UgeworCQkJdTMyIG5vX2dwaW8yOworCQkJdTMyIGdyY19sb2NhbF9jdHJsOworCisJCQlpZiAodHBfcGVlciAhPSB0cCAmJgorCQkJICAgICh0cF9wZWVyLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSAhPSAwKQorCQkJCXJldHVybjsKKworCQkJLyogT24gNTc1MyBhbmQgdmFyaWFudHMsIEdQSU8yIGNhbm5vdCBiZSB1c2VkLiAqLworCQkJbm9fZ3BpbzIgPSB0cC0+bmljX3NyYW1fZGF0YV9jZmcgJgorCQkJCSAgICBOSUNfU1JBTV9EQVRBX0NGR19OT19HUElPMjsKKworCQkJZ3JjX2xvY2FsX2N0cmwgPSBHUkNfTENMQ1RSTF9HUElPX09FMCB8CisJCQkJCSBHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkJCSBHUkNfTENMQ1RSTF9HUElPX09FMiB8CisJCQkJCSBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyOworCQkJaWYgKG5vX2dwaW8yKSB7CisJCQkJZ3JjX2xvY2FsX2N0cmwgJj0gfihHUkNfTENMQ1RSTF9HUElPX09FMiB8CisJCQkJCQkgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyKTsKKwkJCX0KKwkJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJCQkJCWdyY19sb2NhbF9jdHJsKTsKKwkJCXVkZWxheSgxMDApOworCisJCQlncmNfbG9jYWxfY3RybCB8PSBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDA7CisKKwkJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJCQkJCWdyY19sb2NhbF9jdHJsKTsKKwkJCXVkZWxheSgxMDApOworCisJCQlpZiAoIW5vX2dwaW8yKSB7CisJCQkJZ3JjX2xvY2FsX2N0cmwgJj0gfkdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMjsKKwkJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJICAgICAgIGdyY19sb2NhbF9jdHJsKTsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCAmJgorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpIHsKKwkJCWlmICh0cF9wZWVyICE9IHRwICYmCisJCQkgICAgKHRwX3BlZXItPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpICE9IDApCisJCQkJcmV0dXJuOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpKTsKKwkJCXVkZWxheSgxMDApOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMSkpOworCQkJdWRlbGF5KDEwMCk7CisKKwkJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJCSAgICAgKEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCSAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSkpOworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX3BoeShzdHJ1Y3QgdGczICosIGludCk7CisKKyNkZWZpbmUgUkVTRVRfS0lORF9TSFVURE9XTgkwCisjZGVmaW5lIFJFU0VUX0tJTkRfSU5JVAkJMQorI2RlZmluZSBSRVNFVF9LSU5EX1NVU1BFTkQJMgorCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfc2lnX3Bvc3RfcmVzZXQoc3RydWN0IHRnMyAqLCBpbnQpOworc3RhdGljIGludCB0ZzNfaGFsdF9jcHUoc3RydWN0IHRnMyAqLCB1MzIpOworCitzdGF0aWMgaW50IHRnM19zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHRnMyAqdHAsIGludCBzdGF0ZSkKK3sKKwl1MzIgbWlzY19ob3N0X2N0cmw7CisJdTE2IHBvd2VyX2NvbnRyb2wsIHBvd2VyX2NhcHM7CisJaW50IHBtID0gdHAtPnBtX2NhcDsKKworCS8qIE1ha2Ugc3VyZSByZWdpc3RlciBhY2Nlc3NlcyAoaW5kaXJlY3Qgb3Igb3RoZXJ3aXNlKQorCSAqIHdpbGwgZnVuY3Rpb24gY29ycmVjdGx5LgorCSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsCisJCQkgICAgICAgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwKKwkJCSAgICAgcG0gKyBQQ0lfUE1fQ1RSTCwKKwkJCSAgICAgJnBvd2VyX2NvbnRyb2wpOworCXBvd2VyX2NvbnRyb2wgfD0gUENJX1BNX0NUUkxfUE1FX1NUQVRVUzsKKwlwb3dlcl9jb250cm9sICY9IH4oUENJX1BNX0NUUkxfU1RBVEVfTUFTSyk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgMDoKKwkJcG93ZXJfY29udHJvbCB8PSAwOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsCisJCQkJICAgICAgcG0gKyBQQ0lfUE1fQ1RSTCwKKwkJCQkgICAgICBwb3dlcl9jb250cm9sKTsKKwkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwpOworCQl1ZGVsYXkoMTAwKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgMToKKwkJcG93ZXJfY29udHJvbCB8PSAxOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJcG93ZXJfY29udHJvbCB8PSAyOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJcG93ZXJfY29udHJvbCB8PSAzOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogSW52YWxpZCBwb3dlciBzdGF0ZSAoJWQpICIKKwkJICAgICAgICJyZXF1ZXN0ZWQuXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwgc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJcG93ZXJfY29udHJvbCB8PSBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFOworCisJbWlzY19ob3N0X2N0cmwgPSB0cjMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCk7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJICAgICBtaXNjX2hvc3RfY3RybCB8IE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCk7CisKKwlpZiAodHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPT0gMCkgeworCQl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDE7CisJCXRwLT5saW5rX2NvbmZpZy5vcmlnX3NwZWVkID0gdHAtPmxpbmtfY29uZmlnLnNwZWVkOworCQl0cC0+bGlua19jb25maWcub3JpZ19kdXBsZXggPSB0cC0+bGlua19jb25maWcuZHVwbGV4OworCQl0cC0+bGlua19jb25maWcub3JpZ19hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7CisJfQorCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkgeworCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSBTUEVFRF8xMDsKKwkJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9IQUxGOworCQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQl0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgcG0gKyBQQ0lfUE1fUE1DLCAmcG93ZXJfY2Fwcyk7CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9FTkFCTEUpIHsKKwkJdTMyIG1hY19tb2RlOworCisJCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg1YSk7CisJCQl1ZGVsYXkoNDApOworCisJCQltYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisKKwkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCB8fAorCQkJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQikpCisJCQkJbWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJfSBlbHNlIHsKKwkJCW1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwkJfQorCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MCkKKwkJCXR3MzIoTUFDX0xFRF9DVFJMLCB0cC0+bGVkX2N0cmwpOworCisJCWlmICgoKHBvd2VyX2NhcHMgJiBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQpICYmCisJCSAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfRU5BQkxFKSkpCisJCQltYWNfbW9kZSB8PSBNQUNfTU9ERV9NQUdJQ19QS1RfRU5BQkxFOworCisJCXR3MzJfZihNQUNfTU9ERSwgbWFjX21vZGUpOworCQl1ZGVsYXkoMTAwKTsKKworCQl0dzMyX2YoTUFDX1JYX01PREUsIFJYX01PREVfRU5BQkxFKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CKSAmJgorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSkgeworCQl1MzIgYmFzZV92YWw7CisKKwkJYmFzZV92YWwgPSB0cC0+cGNpX2Nsb2NrX2N0cmw7CisJCWJhc2VfdmFsIHw9IChDTE9DS19DVFJMX1JYQ0xLX0RJU0FCTEUgfAorCQkJICAgICBDTE9DS19DVFJMX1RYQ0xLX0RJU0FCTEUpOworCisJCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwgYmFzZV92YWwgfAorCQkgICAgIENMT0NLX0NUUkxfQUxUQ0xLIHwKKwkJICAgICBDTE9DS19DVFJMX1BXUkRPV05fUExMMTMzKTsKKwkJdWRlbGF5KDQwKTsKKwl9IGVsc2UgaWYgKCEoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSA1NzUwKSAmJgorCQkgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpKSB7CisJCXUzMiBuZXdiaXRzMSwgbmV3Yml0czI7CisKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkgeworCQkJbmV3Yml0czEgPSAoQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFIHwKKwkJCQkgICAgQ0xPQ0tfQ1RSTF9UWENMS19ESVNBQkxFIHwKKwkJCQkgICAgQ0xPQ0tfQ1RSTF9BTFRDTEspOworCQkJbmV3Yml0czIgPSBuZXdiaXRzMSB8IENMT0NLX0NUUkxfNDRNSFpfQ09SRTsKKwkJfSBlbHNlIGlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgeworCQkJbmV3Yml0czEgPSBDTE9DS19DVFJMXzYyNV9DT1JFOworCQkJbmV3Yml0czIgPSBuZXdiaXRzMSB8IENMT0NLX0NUUkxfQUxUQ0xLOworCQl9IGVsc2UgeworCQkJbmV3Yml0czEgPSBDTE9DS19DVFJMX0FMVENMSzsKKwkJCW5ld2JpdHMyID0gbmV3Yml0czEgfCBDTE9DS19DVFJMXzQ0TUhaX0NPUkU7CisJCX0KKworCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIHRwLT5wY2lfY2xvY2tfY3RybCB8IG5ld2JpdHMxKTsKKwkJdWRlbGF5KDQwKTsKKworCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIHRwLT5wY2lfY2xvY2tfY3RybCB8IG5ld2JpdHMyKTsKKwkJdWRlbGF5KDQwKTsKKworCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJCXUzMiBuZXdiaXRzMzsKKworCQkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJCQluZXdiaXRzMyA9IChDTE9DS19DVFJMX1JYQ0xLX0RJU0FCTEUgfAorCQkJCQkgICAgQ0xPQ0tfQ1RSTF9UWENMS19ESVNBQkxFIHwKKwkJCQkJICAgIENMT0NLX0NUUkxfNDRNSFpfQ09SRSk7CisJCQl9IGVsc2UgeworCQkJCW5ld2JpdHMzID0gQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFOworCQkJfQorCisJCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsCisJCQkJCSB0cC0+cGNpX2Nsb2NrX2N0cmwgfCBuZXdiaXRzMyk7CisJCQl1ZGVsYXkoNDApOworCQl9CisJfQorCisJdGczX2Zyb2JfYXV4X3Bvd2VyKHRwKTsKKworCS8qIFdvcmthcm91bmQgZm9yIHVuc3RhYmxlIFBMTCBjbG9jayAqLworCWlmICgoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTc1MF9BWCkgfHwKKwkgICAgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3NTBfQlgpKSB7CisJCXUzMiB2YWwgPSB0cjMyKDB4N2QwMCk7CisKKwkJdmFsICY9IH4oKDEgPDwgMTYpIHwgKDEgPDwgNCkgfCAoMSA8PCAyKSB8ICgxIDw8IDEpIHwgMSk7CisJCXR3MzIoMHg3ZDAwLCB2YWwpOworCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpCisJCQl0ZzNfaGFsdF9jcHUodHAsIFJYX0NQVV9CQVNFKTsKKwl9CisKKwkvKiBGaW5hbGx5LCBzZXQgdGhlIG5ldyBwb3dlciBzdGF0ZS4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIHBtICsgUENJX1BNX0NUUkwsIHBvd2VyX2NvbnRyb2wpOworCisJdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfbGlua19yZXBvcnQoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyBkb3duLlxuIiwgdHAtPmRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzIGR1cGxleC5cbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLAorCQkgICAgICAgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCA/CisJCQkxMDAwIDoKKwkJCSh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMCA/CisJCQkgMTAwIDogMTApKSwKKwkJICAgICAgICh0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfRlVMTCA/CisJCQkiZnVsbCIgOiAiaGFsZiIpKTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IEZsb3cgY29udHJvbCBpcyAlcyBmb3IgVFggYW5kICIKKwkJICAgICAgICIlcyBmb3IgUlguXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwKKwkJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpID8gIm9uIiA6ICJvZmYiLAorCQkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9QQVVTRSkgPyAib24iIDogIm9mZiIpOworCX0KK30KKworc3RhdGljIHZvaWQgdGczX3NldHVwX2Zsb3dfY29udHJvbChzdHJ1Y3QgdGczICp0cCwgdTMyIGxvY2FsX2FkdiwgdTMyIHJlbW90ZV9hZHYpCit7CisJdTMyIG5ld190ZzNfZmxhZ3MgPSAwOworCXUzMiBvbGRfcnhfbW9kZSA9IHRwLT5yeF9tb2RlOworCXUzMiBvbGRfdHhfbW9kZSA9IHRwLT50eF9tb2RlOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQVVTRV9BVVRPTkVHKSB7CisJCWlmIChsb2NhbF9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCQlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkJCQlpZiAocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApCisJCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJCShURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSAJVEczX0ZMQUdfVFhfUEFVU0UpOworCQkJCWVsc2UgaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQVNZTSkKKwkJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkJKFRHM19GTEFHX1JYX1BBVVNFKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgCVRHM19GTEFHX1RYX1BBVVNFKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChsb2NhbF9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQkJaWYgKChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkgJiYKKwkJICAgIAkocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9BU1lNKSkKKwkJCQluZXdfdGczX2ZsYWdzIHw9IFRHM19GTEFHX1RYX1BBVVNFOworCQl9CisKKwkJdHAtPnRnM19mbGFncyAmPSB+KFRHM19GTEFHX1JYX1BBVVNFIHwgVEczX0ZMQUdfVFhfUEFVU0UpOworCQl0cC0+dGczX2ZsYWdzIHw9IG5ld190ZzNfZmxhZ3M7CisJfSBlbHNlIHsKKwkJbmV3X3RnM19mbGFncyA9IHRwLT50ZzNfZmxhZ3M7CisJfQorCisJaWYgKG5ld190ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9QQVVTRSkKKwkJdHAtPnJ4X21vZGUgfD0gUlhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworCWVsc2UKKwkJdHAtPnJ4X21vZGUgJj0gflJYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKworCWlmIChvbGRfcnhfbW9kZSAhPSB0cC0+cnhfbW9kZSkgeworCQl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKwl9CisJCisJaWYgKG5ld190ZzNfZmxhZ3MgJiBURzNfRkxBR19UWF9QQVVTRSkKKwkJdHAtPnR4X21vZGUgfD0gVFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworCWVsc2UKKwkJdHAtPnR4X21vZGUgJj0gflRYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKworCWlmIChvbGRfdHhfbW9kZSAhPSB0cC0+dHhfbW9kZSkgeworCQl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19hdXhfc3RhdF90b19zcGVlZF9kdXBsZXgoc3RydWN0IHRnMyAqdHAsIHUzMiB2YWwsIHUxNiAqc3BlZWQsIHU4ICpkdXBsZXgpCit7CisJc3dpdGNoICh2YWwgJiBNSUlfVEczX0FVWF9TVEFUX1NQRE1BU0spIHsKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTBIQUxGOgorCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJKmR1cGxleCA9IERVUExFWF9IQUxGOworCQlicmVhazsKKworCWNhc2UgTUlJX1RHM19BVVhfU1RBVF8xMEZVTEw6CisJCSpzcGVlZCA9IFNQRUVEXzEwOworCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwMEhBTEY6CisJCSpzcGVlZCA9IFNQRUVEXzEwMDsKKwkJKmR1cGxleCA9IERVUExFWF9IQUxGOworCQlicmVhazsKKworCWNhc2UgTUlJX1RHM19BVVhfU1RBVF8xMDBGVUxMOgorCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCSpkdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTAwMEhBTEY6CisJCSpzcGVlZCA9IFNQRUVEXzEwMDA7CisJCSpkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTAwMEZVTEw6CisJCSpzcGVlZCA9IFNQRUVEXzEwMDA7CisJCSpkdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkqc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCQkqZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJCWJyZWFrOworCX07Cit9CisKK3N0YXRpYyB2b2lkIHRnM19waHlfY29wcGVyX2JlZ2luKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBuZXdfYWR2OworCWludCBpOworCisJaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKSB7CisJCS8qIEVudGVyaW5nIGxvdyBwb3dlciBtb2RlLiAgRGlzYWJsZSBnaWdhYml0IGFuZAorCQkgKiAxMDBiYXNlVCBhZHZlcnRpc2VtZW50cy4KKwkJICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKworCQluZXdfYWR2ID0gKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCSAgIEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CKQorCQkJbmV3X2FkdiB8PSAoQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKwl9IGVsc2UgaWYgKHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBTUEVFRF9JTlZBTElEKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOworCisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJj0KKwkJCQl+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisKKwkJbmV3X2FkdiA9IChBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIG5ld19hZHYpOworCisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJgorCQkgICAgKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKSkgeworCQkJbmV3X2FkdiA9IDA7CisJCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCQluZXdfYWR2IHw9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGOworCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKKwkJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgJiYKKwkJCSAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApKQorCQkJCW5ld19hZHYgfD0gKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCQkgICAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIG5ld19hZHYpOworCQl9IGVsc2UgeworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIDApOworCQl9CisJfSBlbHNlIHsKKwkJLyogQXNraW5nIGZvciBhIHNwZWNpZmljIGxpbmsgbW9kZS4gKi8KKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCQluZXdfYWR2ID0gQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKworCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJbmV3X2FkdiA9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMOworCQkJZWxzZQorCQkJCW5ld19hZHYgPSBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRjsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKQorCQkJCW5ld19hZHYgfD0gKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCQkgICAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIG5ld19hZHYpOworCQl9IGVsc2UgeworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIDApOworCisJCQluZXdfYWR2ID0gQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQOworCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJCQlpZiAodHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJCQllbHNlCisJCQkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCQl9IGVsc2UgeworCQkJCWlmICh0cC0+bGlua19jb25maWcuZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCQkJZWxzZQorCQkJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCQl9CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIG5ld19hZHYpOworCQl9CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgorCSAgICB0cC0+bGlua19jb25maWcuc3BlZWQgIT0gU1BFRURfSU5WQUxJRCkgeworCQl1MzIgYm1jciwgb3JpZ19ibWNyOworCisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSB0cC0+bGlua19jb25maWcuc3BlZWQ7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmR1cGxleDsKKworCQlibWNyID0gMDsKKwkJc3dpdGNoICh0cC0+bGlua19jb25maWcuc3BlZWQpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwOgorCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJYm1jciB8PSBURzNfQk1DUl9TUEVFRDEwMDA7CisJCQlicmVhazsKKwkJfTsKKworCQlpZiAodHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWJtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJm9yaWdfYm1jcikgJiYKKwkJICAgIChibWNyICE9IG9yaWdfYm1jcikpIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOworCQkJZm9yIChpID0gMDsgaSA8IDE1MDA7IGkrKykgeworCQkJCXUzMiB0bXA7CisKKwkJCQl1ZGVsYXkoMTApOworCQkJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApIHx8CisJCQkJICAgIHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnRtcCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghKHRtcCAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCQkJdWRlbGF5KDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgYm1jcik7CisJCQl1ZGVsYXkoNDApOworCQl9CisJfSBlbHNlIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwKKwkJCSAgICAgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGczX2luaXRfNTQwMXBoeV9kc3Aoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCS8qIFR1cm4gb2ZmIHRhcCBwb3dlciBtYW5hZ2VtZW50LiAqLworCS8qIFNldCBFeHRlbmRlZCBwYWNrZXQgbGVuZ3RoIGJpdCAqLworCWVyciAgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NGMyMCk7CisKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMTIpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MTgwNCk7CisKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMTMpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MTIwNCk7CisKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDYpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDEzMik7CisKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDYpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDIzMik7CisKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MGEyMCk7CisKKwl1ZGVsYXkoNDApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZzNfY29wcGVyX2lzX2FkdmVydGlzaW5nX2FsbChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgYWR2X3JlZywgYWxsX21hc2s7CisKKwlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9BRFZFUlRJU0UsICZhZHZfcmVnKSkKKwkJcmV0dXJuIDA7CisKKwlhbGxfbWFzayA9IChBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCSAgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKTsKKwlpZiAoKGFkdl9yZWcgJiBhbGxfbWFzaykgIT0gYWxsX21hc2spCisJCXJldHVybiAwOworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpIHsKKwkJdTMyIHRnM19jdHJsOworCisJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19DVFJMLCAmdGczX2N0cmwpKQorCQkJcmV0dXJuIDA7CisKKwkJYWxsX21hc2sgPSAoTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYgfAorCQkJICAgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMKTsKKwkJaWYgKCh0ZzNfY3RybCAmIGFsbF9tYXNrKSAhPSBhbGxfbWFzaykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfY29wcGVyX3BoeShzdHJ1Y3QgdGczICp0cCwgaW50IGZvcmNlX3Jlc2V0KQoreworCWludCBjdXJyZW50X2xpbmtfdXA7CisJdTMyIGJtc3IsIGR1bW15OworCXUxNiBjdXJyZW50X3NwZWVkOworCXU4IGN1cnJlbnRfZHVwbGV4OworCWludCBpLCBlcnI7CisKKwl0dzMyKE1BQ19FVkVOVCwgMCk7CisKKwl0dzMyX2YoTUFDX1NUQVRVUywKKwkgICAgIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCB8CisJICAgICAgTUFDX1NUQVRVU19NSV9DT01QTEVUSU9OIHwKKwkgICAgICBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpKTsKKwl1ZGVsYXkoNDApOworCisJdHAtPm1pX21vZGUgPSBNQUNfTUlfTU9ERV9CQVNFOworCXR3MzJfZihNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCXVkZWxheSg4MCk7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDIpOworCisJLyogU29tZSB0aGlyZC1wYXJ0eSBQSFlzIG5lZWQgdG8gYmUgcmVzZXQgb24gbGluayBnb2luZworCSAqIGRvd24uCisJICovCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyB8fAorCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgfHwKKwkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSAmJgorCSAgICBuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKSB7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpICYmCisJCSAgICAhKGJtc3IgJiBCTVNSX0xTVEFUVVMpKQorCQkJZm9yY2VfcmVzZXQgPSAxOworCX0KKwlpZiAoZm9yY2VfcmVzZXQpCisJCXRnM19waHlfcmVzZXQodHApOworCisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSB7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcikgfHwKKwkJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpKQorCQkJYm1zciA9IDA7CisKKwkJaWYgKCEoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCQkJdWRlbGF5KDEwKTsKKwkJCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpICYmCisJCQkJICAgIChibXNyICYgQk1TUl9MU1RBVFVTKSkgeworCQkJCQl1ZGVsYXkoNDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9SRVZfTUFTSykgPT0gUEhZX1JFVl9CQ001NDAxX0IwICYmCisJCQkgICAgIShibXNyICYgQk1TUl9MU1RBVFVTKSAmJgorCQkJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQkJCWVyciA9IHRnM19waHlfcmVzZXQodHApOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApIHsKKwkJLyogNTcwMSB7QTAsQjB9IENSQyBidWcgd29ya2Fyb3VuZCAqLworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTUsIDB4MGE3NSk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4YzY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7CisJfQorCisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzLi4uICovCisJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfSVNUQVQsICZkdW1teSk7CisJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfSVNUQVQsICZkdW1teSk7CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQpCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19JTUFTSywgfk1JSV9URzNfSU5UX0xJTktDSEcpOworCWVsc2UKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0lNQVNLLCB+MCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJaWYgKHRwLT5sZWRfY3RybCA9PSBMRURfQ1RSTF9NT0RFX1BIWV8xKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLAorCQkJCSAgICAgTUlJX1RHM19FWFRfQ1RSTF9MTkszX0xFRF9NT0RFKTsKKwkJZWxzZQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAwKTsKKwl9CisKKwljdXJyZW50X2xpbmtfdXAgPSAwOworCWN1cnJlbnRfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCWN1cnJlbnRfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9DQVBBQ0lUSVZFX0NPVVBMSU5HKSB7CisJCXUzMiB2YWw7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDQwMDcpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgJnZhbCk7CisJCWlmICghKHZhbCAmICgxIDw8IDEwKSkpIHsKKwkJCXZhbCB8PSAoMSA8PCAxMCk7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIHZhbCk7CisJCQlnb3RvIHJlbGluazsKKwkJfQorCX0KKworCWJtc3IgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgorCQkgICAgKGJtc3IgJiBCTVNSX0xTVEFUVVMpKQorCQkJYnJlYWs7CisJCXVkZWxheSg0MCk7CisJfQorCisJaWYgKGJtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJdTMyIGF1eF9zdGF0LCBibWNyOworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9TVEFULCAmYXV4X3N0YXQpOworCQlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCQl1ZGVsYXkoMTApOworCQkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KSAmJgorCQkJICAgIGF1eF9zdGF0KQorCQkJCWJyZWFrOworCQl9CisKKwkJdGczX2F1eF9zdGF0X3RvX3NwZWVkX2R1cGxleCh0cCwgYXV4X3N0YXQsCisJCQkJCSAgICAgJmN1cnJlbnRfc3BlZWQsCisJCQkJCSAgICAgJmN1cnJlbnRfZHVwbGV4KTsKKworCQlibWNyID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwkJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChibWNyICYmIGJtY3IgIT0gMHg3ZmZmKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKworCQkJCS8qIEZvcmNlIGF1dG9uZWcgcmVzdGFydCBpZiB3ZSBhcmUgZXhpdGluZworCQkJCSAqIGxvdyBwb3dlciBtb2RlLgorCQkJCSAqLworCQkJCWlmICghdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwodHApKQorCQkJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQkJfSBlbHNlIHsKKwkJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoYm1jciAmIEJNQ1JfQU5FTkFCTEUpICYmCisJCQkgICAgdHAtPmxpbmtfY29uZmlnLnNwZWVkID09IGN1cnJlbnRfc3BlZWQgJiYKKwkJCSAgICB0cC0+bGlua19jb25maWcuZHVwbGV4ID09IGN1cnJlbnRfZHVwbGV4KSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0KKwkJfQorCisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBjdXJyZW50X3NwZWVkOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IGN1cnJlbnRfZHVwbGV4OworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCSAgICAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpICYmCisJICAgICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkpIHsKKwkJdTMyIGxvY2FsX2FkdiwgcmVtb3RlX2FkdjsKKworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9BRFZFUlRJU0UsICZsb2NhbF9hZHYpKQorCQkJbG9jYWxfYWR2ID0gMDsKKwkJbG9jYWxfYWR2ICY9IChBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU0pOworCisJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0xQQSwgJnJlbW90ZV9hZHYpKQorCQkJcmVtb3RlX2FkdiA9IDA7CisKKwkJcmVtb3RlX2FkdiAmPSAoTFBBX1BBVVNFX0NBUCB8IExQQV9QQVVTRV9BU1lNKTsKKworCQkvKiBJZiB3ZSBhcmUgbm90IGFkdmVydGlzaW5nIGZ1bGwgcGF1c2UgY2FwYWJpbGl0eSwKKwkJICogc29tZXRoaW5nIGlzIHdyb25nLiAgQnJpbmcgdGhlIGxpbmsgZG93biBhbmQgcmVjb25maWd1cmUuCisJCSAqLworCQlpZiAobG9jYWxfYWR2ICE9IEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCX0gZWxzZSB7CisJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCQl9CisJfQorcmVsaW5rOgorCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMCkgeworCQl1MzIgdG1wOworCisJCXRnM19waHlfY29wcGVyX2JlZ2luKHRwKTsKKworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApOworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnRtcCkgJiYKKwkJICAgICh0bXAgJiBCTVNSX0xTVEFUVVMpKQorCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwl9CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSkgeworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAgfHwKKwkJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTApCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKKwkJZWxzZQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCX0gZWxzZQorCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX0hBTEZfRFVQTEVYOworCWlmICh0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0hBTEZfRFVQTEVYOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkgeworCQlpZiAoKHRwLT5sZWRfY3RybCA9PSBMRURfQ1RSTF9NT0RFX1BIWV8yKSB8fAorCQkgICAgKGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJCSAgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMCkpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwl9IGVsc2UgeworCQlpZiAoY3VycmVudF9saW5rX3VwID09IDEpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwl9CisKKwkvKiA/Pz8gV2l0aG91dCB0aGlzIHNldHRpbmcgTmV0Z2VhciBHQTMwMlQgUEhZIGRvZXMgbm90CisJICogPz8/IHNlbmQvcmVjZWl2ZSBwYWNrZXRzLi4uCisJICovCisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDExICYmCisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAwX0FMVElNQSkgeworCQl0cC0+bWlfbW9kZSB8PSBNQUNfTUlfTU9ERV9BVVRPX1BPTEw7CisJCXR3MzJfZihNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCQl1ZGVsYXkoODApOworCX0KKworCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwl1ZGVsYXkoNDApOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTElOS0NIR19SRUcpIHsKKwkJLyogUG9sbGVkIHZpYSB0aW1lci4gKi8KKwkJdHczMl9mKE1BQ19FVkVOVCwgMCk7CisJfSBlbHNlIHsKKwkJdHczMl9mKE1BQ19FVkVOVCwgTUFDX0VWRU5UX0xOS1NUQVRFX0NIQU5HRUQpOworCX0KKwl1ZGVsYXkoNDApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwICYmCisJICAgIGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpIHx8CisJICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEKSkpIHsKKwkJdWRlbGF5KDEyMCk7CisJCXR3MzJfZihNQUNfU1RBVFVTLAorCQkgICAgIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJdWRlbGF5KDQwKTsKKwkJdGczX3dyaXRlX21lbSh0cCwKKwkJCSAgICAgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gsCisJCQkgICAgICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YX01BR0lDMik7CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCAhPSBuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKSB7CisJCWlmIChjdXJyZW50X2xpbmtfdXApCisJCQluZXRpZl9jYXJyaWVyX29uKHRwLT5kZXYpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZih0cC0+ZGV2KTsKKwkJdGczX2xpbmtfcmVwb3J0KHRwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyB7CisJaW50IHN0YXRlOworI2RlZmluZSBBTkVHX1NUQVRFX1VOS05PV04JCTAKKyNkZWZpbmUgQU5FR19TVEFURV9BTl9FTkFCTEUJCTEKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUX0lOSVQJCTIKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUCQkzCisjZGVmaW5lIEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LCTQKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVF9JTklUCTUKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVAk2CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUCTcKKyNkZWZpbmUgQU5FR19TVEFURV9BQ0tfREVURUNUCQk4CisjZGVmaW5lIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQJOQorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSwkJMTAKKyNkZWZpbmUgQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUCTExCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1QJCTEyCisjZGVmaW5lIEFORUdfU1RBVEVfTElOS19PSwkJMTMKKyNkZWZpbmUgQU5FR19TVEFURV9ORVhUX1BBR0VfV0FJVF9JTklUCTE0CisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVQJMTUKKworCXUzMiBmbGFnczsKKyNkZWZpbmUgTVJfQU5fRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIE1SX1JFU1RBUlRfQU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgTVJfQU5fQ09NUExFVEUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTVJfUEFHRV9SWAkJMHgwMDAwMDAwOAorI2RlZmluZSBNUl9OUF9MT0FERUQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTVJfVE9HR0xFX1RYCQkweDAwMDAwMDIwCisjZGVmaW5lIE1SX0xQX0FEVl9GVUxMX0RVUExFWAkweDAwMDAwMDQwCisjZGVmaW5lIE1SX0xQX0FEVl9IQUxGX0RVUExFWAkweDAwMDAwMDgwCisjZGVmaW5lIE1SX0xQX0FEVl9TWU1fUEFVU0UJMHgwMDAwMDEwMAorI2RlZmluZSBNUl9MUF9BRFZfQVNZTV9QQVVTRQkweDAwMDAwMjAwCisjZGVmaW5lIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVJfTFBfQURWX1JFTU9URV9GQVVMVDIJMHgwMDAwMDgwMAorI2RlZmluZSBNUl9MUF9BRFZfTkVYVF9QQUdFCTB4MDAwMDEwMDAKKyNkZWZpbmUgTVJfVE9HR0xFX1JYCQkweDAwMDAyMDAwCisjZGVmaW5lIE1SX05QX1JYCQkweDAwMDA0MDAwCisKKyNkZWZpbmUgTVJfTElOS19PSwkJMHg4MDAwMDAwMAorCisJdW5zaWduZWQgbG9uZyBsaW5rX3RpbWUsIGN1cl90aW1lOworCisJdTMyIGFiaWxpdHlfbWF0Y2hfY2ZnOworCWludCBhYmlsaXR5X21hdGNoX2NvdW50OworCisJY2hhciBhYmlsaXR5X21hdGNoLCBpZGxlX21hdGNoLCBhY2tfbWF0Y2g7CisKKwl1MzIgdHhjb25maWcsIHJ4Y29uZmlnOworI2RlZmluZSBBTkVHX0NGR19OUAkJMHgwMDAwMDA4MAorI2RlZmluZSBBTkVHX0NGR19BQ0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQU5FR19DRkdfUkYyCQkweDAwMDAwMDIwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMQkJMHgwMDAwMDAxMAorI2RlZmluZSBBTkVHX0NGR19QUzIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQU5FR19DRkdfUFMxCQkweDAwMDA4MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0hECQkweDAwMDA0MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0ZECQkweDAwMDAyMDAwCisjZGVmaW5lIEFORUdfQ0ZHX0lOVkFMCQkweDAwMDAxZjA2CisKK307CisjZGVmaW5lIEFORUdfT0sJCTAKKyNkZWZpbmUgQU5FR19ET05FCTEKKyNkZWZpbmUgQU5FR19USU1FUl9FTkFCCTIKKyNkZWZpbmUgQU5FR19GQUlMRUQJLTEKKworI2RlZmluZSBBTkVHX1NUQVRFX1NFVFRMRV9USU1FCTEwMDAwCisKK3N0YXRpYyBpbnQgdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUoc3RydWN0IHRnMyAqdHAsCisJCQkJICAgc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyAqYXApCit7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1MzIgcnhfY2ZnX3JlZzsKKwlpbnQgcmV0OworCisJaWYgKGFwLT5zdGF0ZSA9PSBBTkVHX1NUQVRFX1VOS05PV04pIHsKKwkJYXAtPnJ4Y29uZmlnID0gMDsKKwkJYXAtPmxpbmtfdGltZSA9IDA7CisJCWFwLT5jdXJfdGltZSA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJCWFwLT5hY2tfbWF0Y2ggPSAwOworCX0KKwlhcC0+Y3VyX3RpbWUrKzsKKworCWlmICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19SQ1ZEX0NGRykgeworCQlyeF9jZmdfcmVnID0gdHIzMihNQUNfUlhfQVVUT19ORUcpOworCisJCWlmIChyeF9jZmdfcmVnICE9IGFwLT5hYmlsaXR5X21hdGNoX2NmZykgeworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gcnhfY2ZnX3JlZzsKKwkJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICgrK2FwLT5hYmlsaXR5X21hdGNoX2NvdW50ID4gMSkgeworCQkJCWFwLT5hYmlsaXR5X21hdGNoID0gMTsKKwkJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSByeF9jZmdfcmVnOworCQkJfQorCQl9CisJCWlmIChyeF9jZmdfcmVnICYgQU5FR19DRkdfQUNLKQorCQkJYXAtPmFja19tYXRjaCA9IDE7CisJCWVsc2UKKwkJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCWFwLT5pZGxlX21hdGNoID0gMDsKKwl9IGVsc2UgeworCQlhcC0+aWRsZV9tYXRjaCA9IDE7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQlyeF9jZmdfcmVnID0gMDsKKwl9CisKKwlhcC0+cnhjb25maWcgPSByeF9jZmdfcmVnOworCXJldCA9IEFORUdfT0s7CisKKwlzd2l0Y2goYXAtPnN0YXRlKSB7CisJY2FzZSBBTkVHX1NUQVRFX1VOS05PV046CisJCWlmIChhcC0+ZmxhZ3MgJiAoTVJfQU5fRU5BQkxFIHwgTVJfUkVTVEFSVF9BTikpCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9BTl9FTkFCTEU6CisJCWFwLT5mbGFncyAmPSB+KE1SX0FOX0NPTVBMRVRFIHwgTVJfUEFHRV9SWCk7CisJCWlmIChhcC0+ZmxhZ3MgJiBNUl9BTl9FTkFCTEUpIHsKKwkJCWFwLT5saW5rX3RpbWUgPSAwOworCQkJYXAtPmN1cl90aW1lID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9SRVNUQVJUX0lOSVQ7CisJCX0gZWxzZSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUX0lOSVQ6CisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisJCWFwLT5mbGFncyAmPSB+KE1SX05QX0xPQURFRCk7CisJCWFwLT50eGNvbmZpZyA9IDA7CisJCXR3MzIoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl1ZGVsYXkoNDApOworCisJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9SRVNUQVJUOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBBTkVHX1NUQVRFX1JFU1RBUlQ6CisJCWRlbHRhID0gYXAtPmN1cl90aW1lIC0gYXAtPmxpbmtfdGltZTsKKwkJaWYgKGRlbHRhID4gQU5FR19TVEFURV9TRVRUTEVfVElNRSkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVF9JTklUOworCQl9IGVsc2UgeworCQkJcmV0ID0gQU5FR19USU1FUl9FTkFCOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSzoKKwkJcmV0ID0gQU5FR19ET05FOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVF9JTklUOgorCQlhcC0+ZmxhZ3MgJj0gfihNUl9UT0dHTEVfVFgpOworCQlhcC0+dHhjb25maWcgPSAoQU5FR19DRkdfRkQgfCBBTkVHX0NGR19QUzEpOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgYXAtPnR4Y29uZmlnKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl1ZGVsYXkoNDApOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1Q7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJiBhcC0+cnhjb25maWcgIT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQ0tfREVURUNUX0lOSVQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOgorCQlhcC0+dHhjb25maWcgfD0gQU5FR19DRkdfQUNLOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgYXAtPnR4Y29uZmlnKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl1ZGVsYXkoNDApOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUNLX0RFVEVDVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9BQ0tfREVURUNUOgorCQlpZiAoYXAtPmFja19tYXRjaCAhPSAwKSB7CisJCQlpZiAoKGFwLT5yeGNvbmZpZyAmIH5BTkVHX0NGR19BQ0spID09CisJCQkgICAgKGFwLT5hYmlsaXR5X21hdGNoX2NmZyAmIH5BTkVHX0NGR19BQ0spKSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9DT01QTEVURV9BQ0tfSU5JVDsKKwkJCX0gZWxzZSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCQl9CisJCX0gZWxzZSBpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkJICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUOgorCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfSU5WQUwpIHsKKwkJCXJldCA9IEFORUdfRkFJTEVEOworCQkJYnJlYWs7CisJCX0KKwkJYXAtPmZsYWdzICY9IH4oTVJfTFBfQURWX0ZVTExfRFVQTEVYIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfSEFMRl9EVVBMRVggfAorCQkJICAgICAgIE1SX0xQX0FEVl9TWU1fUEFVU0UgfAorCQkJICAgICAgIE1SX0xQX0FEVl9BU1lNX1BBVVNFIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMSB8CisJCQkgICAgICAgTVJfTFBfQURWX1JFTU9URV9GQVVMVDIgfAorCQkJICAgICAgIE1SX0xQX0FEVl9ORVhUX1BBR0UgfAorCQkJICAgICAgIE1SX1RPR0dMRV9SWCB8CisJCQkgICAgICAgTVJfTlBfUlgpOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfRkQpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0ZVTExfRFVQTEVYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfSEQpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0hBTEZfRFVQTEVYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUFMxKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9TWU1fUEFVU0U7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19QUzIpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0FTWU1fUEFVU0U7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19SRjEpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1JFTU9URV9GQVVMVDE7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19SRjIpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1JFTU9URV9GQVVMVDI7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19OUCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfTkVYVF9QQUdFOworCisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisKKwkJYXAtPmZsYWdzIF49IChNUl9UT0dHTEVfVFgpOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgMHgwMDA4KQorCQkJYXAtPmZsYWdzIHw9IE1SX1RPR0dMRV9SWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX05QKQorCQkJYXAtPmZsYWdzIHw9IE1SX05QX1JYOworCQlhcC0+ZmxhZ3MgfD0gTVJfUEFHRV9SWDsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSzsKKwkJcmV0ID0gQU5FR19USU1FUl9FTkFCOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9DT01QTEVURV9BQ0s6CisJCWlmIChhcC0+YWJpbGl0eV9tYXRjaCAhPSAwICYmCisJCSAgICBhcC0+cnhjb25maWcgPT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCQlicmVhazsKKwkJfQorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWlmICghKGFwLT5mbGFncyAmIChNUl9MUF9BRFZfTkVYVF9QQUdFKSkpIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ7CisJCQl9IGVsc2UgeworCQkJCWlmICgoYXAtPnR4Y29uZmlnICYgQU5FR19DRkdfTlApID09IDAgJiYKKwkJCQkgICAgIShhcC0+ZmxhZ3MgJiBNUl9OUF9SWCkpIHsKKwkJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOworCQkJCX0gZWxzZSB7CisJCQkJCXJldCA9IEFORUdfRkFJTEVEOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOgorCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCQl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl1ZGVsYXkoNDApOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfSURMRV9ERVRFQ1Q7CisJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfSURMRV9ERVRFQ1Q6CisJCWlmIChhcC0+YWJpbGl0eV9tYXRjaCAhPSAwICYmCisJCSAgICBhcC0+cnhjb25maWcgPT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCQlicmVhazsKKwkJfQorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCS8qIFhYWCBhbm90aGVyIGdlbSBmcm9tIHRoZSBCcm9hZGNvbSBkcml2ZXIgOiggKi8KKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfTElOS19PSzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9MSU5LX09LOgorCQlhcC0+ZmxhZ3MgfD0gKE1SX0FOX0NPTVBMRVRFIHwgTVJfTElOS19PSyk7CisJCXJldCA9IEFORUdfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVRfSU5JVDoKKwkJLyogPz8/IHVuaW1wbGVtZW50ZWQgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVQ6CisJCS8qID8/PyB1bmltcGxlbWVudGVkICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gQU5FR19GQUlMRUQ7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpYmVyX2F1dG9uZWcoc3RydWN0IHRnMyAqdHAsIHUzMiAqZmxhZ3MpCit7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyBhbmluZm87CisJaW50IHN0YXR1cyA9IEFORUdfRkFJTEVEOworCXVuc2lnbmVkIGludCB0aWNrOworCXUzMiB0bXA7CisKKwl0dzMyX2YoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKworCXRtcCA9IHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwl0dzMyX2YoTUFDX01PREUsIHRtcCB8IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJKTsKKwl1ZGVsYXkoNDApOworCisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworCXVkZWxheSg0MCk7CisKKwltZW1zZXQoJmFuaW5mbywgMCwgc2l6ZW9mKGFuaW5mbykpOworCWFuaW5mby5mbGFncyB8PSBNUl9BTl9FTkFCTEU7CisJYW5pbmZvLnN0YXRlID0gQU5FR19TVEFURV9VTktOT1dOOworCWFuaW5mby5jdXJfdGltZSA9IDA7CisJdGljayA9IDA7CisJd2hpbGUgKCsrdGljayA8IDE5NTAwMCkgeworCQlzdGF0dXMgPSB0ZzNfZmliZXJfYW5lZ19zbWFjaGluZSh0cCwgJmFuaW5mbyk7CisJCWlmIChzdGF0dXMgPT0gQU5FR19ET05FIHx8IHN0YXR1cyA9PSBBTkVHX0ZBSUxFRCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxKTsKKwl9CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCSpmbGFncyA9IGFuaW5mby5mbGFnczsKKworCWlmIChzdGF0dXMgPT0gQU5FR19ET05FICYmCisJICAgIChhbmluZm8uZmxhZ3MgJiAoTVJfQU5fQ09NUExFVEUgfCBNUl9MSU5LX09LIHwKKwkJCSAgICAgTVJfTFBfQURWX0ZVTExfRFVQTEVYKSkpCisJCXJlcyA9IDE7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9iY204MDAyKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBtYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwlpbnQgaTsKKworCS8qIFJlc2V0IHdoZW4gaW5pdHRpbmcgZmlyc3QgdGltZSBvciB3ZSBoYXZlIGEgbGluay4gKi8KKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSAmJgorCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpKQorCQlyZXR1cm47CisKKwkvKiBTZXQgUExMIGxvY2sgcmFuZ2UuICovCisJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDgwMDcpOworCisJLyogU1cgcmVzZXQgKi8KKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCS8qIFdhaXQgZm9yIHJlc2V0IHRvIGNvbXBsZXRlLiAqLworCS8qIFhYWCBzY2hlZHVsZV90aW1lb3V0KCkgLi4uICovCisJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKQorCQl1ZGVsYXkoMTApOworCisJLyogQ29uZmlnIG1vZGU7IHNlbGVjdCBQTUEvQ2ggMSByZWdzLiAqLworCXRnM193cml0ZXBoeSh0cCwgMHgxMCwgMHg4NDExKTsKKworCS8qIEVuYWJsZSBhdXRvLWxvY2sgYW5kIGNvbWRldCwgc2VsZWN0IHR4Y2xrIGZvciB0eC4gKi8KKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTEsIDB4MGExMCk7CisKKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTgsIDB4MDBhMCk7CisJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDQxZmYpOworCisJLyogQXNzZXJ0IGFuZCBkZWFzc2VydCBQT1IuICovCisJdGczX3dyaXRlcGh5KHRwLCAweDEzLCAweDA0MDApOworCXVkZWxheSg0MCk7CisJdGczX3dyaXRlcGh5KHRwLCAweDEzLCAweDAwMDApOworCisJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhNTApOworCXVkZWxheSg0MCk7CisJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhMTApOworCisJLyogV2FpdCBmb3Igc2lnbmFsIHRvIHN0YWJpbGl6ZSAqLworCS8qIFhYWCBzY2hlZHVsZV90aW1lb3V0KCkgLi4uICovCisJZm9yIChpID0gMDsgaSA8IDE1MDAwOyBpKyspCisJCXVkZWxheSgxMCk7CisKKwkvKiBEZXNlbGVjdCB0aGUgY2hhbm5lbCByZWdpc3RlciBzbyB3ZSBjYW4gcmVhZCB0aGUgUEhZSUQKKwkgKiBsYXRlci4KKwkgKi8KKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTAsIDB4ODAxMSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2ZpYmVyX2h3X2F1dG9uZWcoc3RydWN0IHRnMyAqdHAsIHUzMiBtYWNfc3RhdHVzKQoreworCXUzMiBzZ19kaWdfY3RybCwgc2dfZGlnX3N0YXR1czsKKwl1MzIgc2VyZGVzX2NmZywgZXhwZWN0ZWRfc2dfZGlnX2N0cmw7CisJaW50IHdvcmthcm91bmQsIHBvcnRfYTsKKwlpbnQgY3VycmVudF9saW5rX3VwOworCisJc2VyZGVzX2NmZyA9IDA7CisJZXhwZWN0ZWRfc2dfZGlnX2N0cmwgPSAwOworCXdvcmthcm91bmQgPSAwOworCXBvcnRfYSA9IDE7CisJY3VycmVudF9saW5rX3VwID0gMDsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNF9BMCAmJgorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNF9BMSkgeworCQl3b3JrYXJvdW5kID0gMTsKKwkJaWYgKHRyMzIoVEczUENJX0RVQUxfTUFDX0NUUkwpICYgRFVBTF9NQUNfQ1RSTF9JRCkKKwkJCXBvcnRfYSA9IDA7CisKKwkJLyogcHJlc2VydmUgYml0cyAwLTExLDEzLDE0IGZvciBzaWduYWwgcHJlLWVtcGhhc2lzICovCisJCS8qIHByZXNlcnZlIGJpdHMgMjAtMjMgZm9yIHZvbHRhZ2UgcmVndWxhdG9yICovCisJCXNlcmRlc19jZmcgPSB0cjMyKE1BQ19TRVJERVNfQ0ZHKSAmIDB4MDBmMDZmZmY7CisJfQorCisJc2dfZGlnX2N0cmwgPSB0cjMyKFNHX0RJR19DVFJMKTsKKworCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoc2dfZGlnX2N0cmwgJiAoMSA8PCAzMSkpIHsKKwkJCWlmICh3b3JrYXJvdW5kKSB7CisJCQkJdTMyIHZhbCA9IHNlcmRlc19jZmc7CisKKwkJCQlpZiAocG9ydF9hKQorCQkJCQl2YWwgfD0gMHhjMDEwMDAwOworCQkJCWVsc2UKKwkJCQkJdmFsIHw9IDB4NDAxMDAwMDsKKwkJCQl0dzMyX2YoTUFDX1NFUkRFU19DRkcsIHZhbCk7CisJCQl9CisJCQl0dzMyX2YoU0dfRElHX0NUUkwsIDB4MDEzODg0MDApOworCQl9CisJCWlmIChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSB7CisJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCAwLCAwKTsKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogV2FudCBhdXRvLW5lZ290aWF0aW9uLiAgKi8KKwlleHBlY3RlZF9zZ19kaWdfY3RybCA9IDB4ODEzODg0MDA7CisKKwkvKiBQYXVzZSBjYXBhYmlsaXR5ICovCisJZXhwZWN0ZWRfc2dfZGlnX2N0cmwgfD0gKDEgPDwgMTEpOworCisJLyogQXN5bWV0dHJpYyBwYXVzZSAqLworCWV4cGVjdGVkX3NnX2RpZ19jdHJsIHw9ICgxIDw8IDEyKTsKKworCWlmIChzZ19kaWdfY3RybCAhPSBleHBlY3RlZF9zZ19kaWdfY3RybCkgeworCQlpZiAod29ya2Fyb3VuZCkKKwkJCXR3MzJfZihNQUNfU0VSREVTX0NGRywgc2VyZGVzX2NmZyB8IDB4YzAxMTAwMCk7CisJCXR3MzJfZihTR19ESUdfQ1RSTCwgZXhwZWN0ZWRfc2dfZGlnX2N0cmwgfCAoMSA8PCAzMCkpOworCQl1ZGVsYXkoNSk7CisJCXR3MzJfZihTR19ESUdfQ1RSTCwgZXhwZWN0ZWRfc2dfZGlnX2N0cmwpOworCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9KVVNUX0lOSVRURUQ7CisJfSBlbHNlIGlmIChtYWNfc3RhdHVzICYgKE1BQ19TVEFUVVNfUENTX1NZTkNFRCB8CisJCQkJIE1BQ19TVEFUVVNfU0lHTkFMX0RFVCkpIHsKKwkJaW50IGk7CisKKwkJLyogR2l2ZXIgdGltZSB0byBuZWdvdGlhdGUgKH4yMDBtcykgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQwMDAwOyBpKyspIHsKKwkJCXNnX2RpZ19zdGF0dXMgPSB0cjMyKFNHX0RJR19TVEFUVVMpOworCQkJaWYgKHNnX2RpZ19zdGF0dXMgJiAoMHgzKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSg1KTsKKwkJfQorCQltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKworCQlpZiAoKHNnX2RpZ19zdGF0dXMgJiAoMSA8PCAxKSkgJiYKKwkJICAgIChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkJdTMyIGxvY2FsX2FkdiwgcmVtb3RlX2FkdjsKKworCQkJbG9jYWxfYWR2ID0gQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCXJlbW90ZV9hZHYgPSAwOworCQkJaWYgKHNnX2RpZ19zdGF0dXMgJiAoMSA8PCAxOSkpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQ0FQOworCQkJaWYgKHNnX2RpZ19zdGF0dXMgJiAoMSA8PCAyMCkpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQVNZTTsKKworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQl0cC0+dGczX2ZsYWdzMiAmPSB+VEczX0ZMRzJfUEhZX0pVU1RfSU5JVFRFRDsKKwkJfSBlbHNlIGlmICghKHNnX2RpZ19zdGF0dXMgJiAoMSA8PCAxKSkpIHsKKwkJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9KVVNUX0lOSVRURUQpCisJCQkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1BIWV9KVVNUX0lOSVRURUQ7CisJCQllbHNlIHsKKwkJCQlpZiAod29ya2Fyb3VuZCkgeworCQkJCQl1MzIgdmFsID0gc2VyZGVzX2NmZzsKKworCQkJCQlpZiAocG9ydF9hKQorCQkJCQkJdmFsIHw9IDB4YzAxMDAwMDsKKwkJCQkJZWxzZQorCQkJCQkJdmFsIHw9IDB4NDAxMDAwMDsKKworCQkJCQl0dzMyX2YoTUFDX1NFUkRFU19DRkcsIHZhbCk7CisJCQkJfQorCisJCQkJdHczMl9mKFNHX0RJR19DVFJMLCAweDAxMzg4NDAwKTsKKwkJCQl1ZGVsYXkoNDApOworCisJCQkJLyogTGluayBwYXJhbGxlbCBkZXRlY3Rpb24gLSBsaW5rIGlzIHVwICovCisJCQkJLyogb25seSBpZiB3ZSBoYXZlIFBDU19TWU5DIGFuZCBub3QgKi8KKwkJCQkvKiByZWNlaXZpbmcgY29uZmlnIGNvZGUgd29yZHMgKi8KKwkJCQltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwkJCQlpZiAoKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCisJCQkJICAgICEobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUkNWRF9DRkcpKSB7CisJCQkJCXRnM19zZXR1cF9mbG93X2NvbnRyb2wodHAsIDAsIDApOworCQkJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworb3V0OgorCXJldHVybiBjdXJyZW50X2xpbmtfdXA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2ZpYmVyX2J5X2hhbmQoc3RydWN0IHRnMyAqdHAsIHUzMiBtYWNfc3RhdHVzKQoreworCWludCBjdXJyZW50X2xpbmtfdXAgPSAwOworCisgCWlmICghKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpKSB7CisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXUzMiBmbGFnczsKKwkJaW50IGk7CisgIAorCQlpZiAoZmliZXJfYXV0b25lZyh0cCwgJmZsYWdzKSkgeworCQkJdTMyIGxvY2FsX2FkdiwgcmVtb3RlX2FkdjsKKworCQkJbG9jYWxfYWR2ID0gQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCXJlbW90ZV9hZHYgPSAwOworCQkJaWYgKGZsYWdzICYgTVJfTFBfQURWX1NZTV9QQVVTRSkKKwkJCQlyZW1vdGVfYWR2IHw9IExQQV9QQVVTRV9DQVA7CisJCQlpZiAoZmxhZ3MgJiBNUl9MUF9BRFZfQVNZTV9QQVVTRSkKKwkJCQlyZW1vdGVfYWR2IHw9IExQQV9QQVVTRV9BU1lNOworCisJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTDsKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKKwkJCXVkZWxheSgyMCk7CisJCQl0dzMyX2YoTUFDX1NUQVRVUywKKwkJCSAgICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCU1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJCXVkZWxheSg0MCk7CisJCQlpZiAoKHRyMzIoTUFDX1NUQVRVUykgJgorCQkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAwICYmCisJCSAgICAobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgJiYKKwkJICAgICEobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUkNWRF9DRkcpKQorCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwl9IGVsc2UgeworCQkvKiBGb3JjaW5nIDEwMDBGRCBsaW5rIHVwLiAqLworCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTDsKKworCQl0dzMyX2YoTUFDX01PREUsICh0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisKK291dDoKKwlyZXR1cm4gY3VycmVudF9saW5rX3VwOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9maWJlcl9waHkoc3RydWN0IHRnMyAqdHAsIGludCBmb3JjZV9yZXNldCkKK3sKKwl1MzIgb3JpZ19wYXVzZV9jZmc7CisJdTE2IG9yaWdfYWN0aXZlX3NwZWVkOworCXU4IG9yaWdfYWN0aXZlX2R1cGxleDsKKwl1MzIgbWFjX3N0YXR1czsKKwlpbnQgY3VycmVudF9saW5rX3VwOworCWludCBpOworCisJb3JpZ19wYXVzZV9jZmcgPQorCQkodHAtPnRnM19mbGFncyAmIChURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJICBURzNfRkxBR19UWF9QQVVTRSkpOworCW9yaWdfYWN0aXZlX3NwZWVkID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZDsKKwlvcmlnX2FjdGl2ZV9kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfQVVUT05FRykgJiYKKwkgICAgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpKSB7CisJCW1hY19zdGF0dXMgPSB0cjMyKE1BQ19TVEFUVVMpOworCQltYWNfc3RhdHVzICY9IChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJICAgICAgIE1BQ19TVEFUVVNfU0lHTkFMX0RFVCB8CisJCQkgICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCB8CisJCQkgICAgICAgTUFDX1NUQVRVU19SQ1ZEX0NGRyk7CisJCWlmIChtYWNfc3RhdHVzID09IChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJCSAgIE1BQ19TVEFUVVNfU0lHTkFMX0RFVCkpIHsKKwkJCXR3MzJfZihNQUNfU1RBVFVTLCAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCQkgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl0dzMyX2YoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKworCXRwLT5tYWNfbW9kZSAmPSB+KE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLIHwgTUFDX01PREVfSEFMRl9EVVBMRVgpOworCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwl1ZGVsYXkoNDApOworCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX0JDTTgwMDIpCisJCXRnM19pbml0X2JjbTgwMDIodHApOworCisJLyogRW5hYmxlIGxpbmsgY2hhbmdlIGV2ZW50IGV2ZW4gd2hlbiBzZXJkZXMgcG9sbGluZy4gICovCisJdHczMl9mKE1BQ19FVkVOVCwgTUFDX0VWRU5UX0xOS1NUQVRFX0NIQU5HRUQpOworCXVkZWxheSg0MCk7CisKKwljdXJyZW50X2xpbmtfdXAgPSAwOworCW1hY19zdGF0dXMgPSB0cjMyKE1BQ19TVEFUVVMpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfQVVUT05FRykKKwkJY3VycmVudF9saW5rX3VwID0gdGczX3NldHVwX2ZpYmVyX2h3X2F1dG9uZWcodHAsIG1hY19zdGF0dXMpOworCWVsc2UKKwkJY3VycmVudF9saW5rX3VwID0gdGczX3NldHVwX2ZpYmVyX2J5X2hhbmQodHAsIG1hY19zdGF0dXMpOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwl1ZGVsYXkoNDApOworCisJdHAtPmh3X3N0YXR1cy0+c3RhdHVzID0KKwkJKFNEX1NUQVRVU19VUERBVEVEIHwKKwkJICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiB+U0RfU1RBVFVTX0xJTktfQ0hHKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdHczMl9mKE1BQ19TVEFUVVMsIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCQkJICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJdWRlbGF5KDUpOworCQlpZiAoKHRyMzIoTUFDX1NUQVRVUykgJiAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCQkgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisJCQlicmVhazsKKwl9CisKKwltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwlpZiAoKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpID09IDApIHsKKwkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCQl0dzMyX2YoTUFDX01PREUsICh0cC0+bWFjX21vZGUgfAorCQkJCQkgIE1BQ19NT0RFX1NFTkRfQ09ORklHUykpOworCQkJdWRlbGF5KDEpOworCQkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl9CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IERVUExFWF9GVUxMOworCQl0dzMyKE1BQ19MRURfQ1RSTCwgKHRwLT5sZWRfY3RybCB8CisJCQkJICAgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERSB8CisJCQkJICAgIExFRF9DVFJMXzEwMDBNQlBTX09OKSk7CisJfSBlbHNlIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJCXR3MzIoTUFDX0xFRF9DVFJMLCAodHAtPmxlZF9jdHJsIHwKKwkJCQkgICAgTEVEX0NUUkxfTE5LTEVEX09WRVJSSURFIHwKKwkJCQkgICAgTEVEX0NUUkxfVFJBRkZJQ19PVkVSUklERSkpOworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgIT0gbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQlpZiAoY3VycmVudF9saW5rX3VwKQorCQkJbmV0aWZfY2Fycmllcl9vbih0cC0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisJCXRnM19saW5rX3JlcG9ydCh0cCk7CisJfSBlbHNlIHsKKwkJdTMyIG5vd19wYXVzZV9jZmcgPQorCQkJdHAtPnRnM19mbGFncyAmIChURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSBURzNfRkxBR19UWF9QQVVTRSk7CisJCWlmIChvcmlnX3BhdXNlX2NmZyAhPSBub3dfcGF1c2VfY2ZnIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9zcGVlZCAhPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9kdXBsZXggIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXgpCisJCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9waHkoc3RydWN0IHRnMyAqdHAsIGludCBmb3JjZV9yZXNldCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCQllcnIgPSB0ZzNfc2V0dXBfZmliZXJfcGh5KHRwLCBmb3JjZV9yZXNldCk7CisJfSBlbHNlIHsKKwkJZXJyID0gdGczX3NldHVwX2NvcHBlcl9waHkodHAsIGZvcmNlX3Jlc2V0KTsKKwl9CisKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAwICYmCisJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQl0dzMyKE1BQ19UWF9MRU5HVEhTLAorCQkgICAgICgoMiA8PCBUWF9MRU5HVEhTX0lQR19DUlNfU0hJRlQpIHwKKwkJICAgICAgKDYgPDwgVFhfTEVOR1RIU19JUEdfU0hJRlQpIHwKKwkJICAgICAgKDB4ZmYgPDwgVFhfTEVOR1RIU19TTE9UX1RJTUVfU0hJRlQpKSk7CisJZWxzZQorCQl0dzMyKE1BQ19UWF9MRU5HVEhTLAorCQkgICAgICgoMiA8PCBUWF9MRU5HVEhTX0lQR19DUlNfU0hJRlQpIHwKKwkJICAgICAgKDYgPDwgVFhfTEVOR1RIU19JUEdfU0hJRlQpIHwKKwkJICAgICAgKDMyIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSkpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKSB7CisJCQl0dzMyKEhPU1RDQ19TVEFUX0NPQUxfVElDS1MsCisJCQkgICAgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTKTsKKwkJfSBlbHNlIHsKKwkJCXR3MzIoSE9TVENDX1NUQVRfQ09BTF9USUNLUywgMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBUaWdvbjMgbmV2ZXIgcmVwb3J0cyBwYXJ0aWFsIHBhY2tldCBzZW5kcy4gIFNvIHdlIGRvIG5vdAorICogbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBTS0JzIHRoYXQgaGF2ZSBub3QgaGFkIGFsbAorICogb2YgdGhlaXIgZnJhZ3Mgc2VudCB5ZXQsIGxpa2UgU3VuR0VNIGRvZXMuCisgKi8KK3N0YXRpYyB2b2lkIHRnM190eChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgaHdfaWR4ID0gdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnR4X2NvbnN1bWVyOworCXUzMiBzd19pZHggPSB0cC0+dHhfY29uczsKKworCXdoaWxlIChzd19pZHggIT0gaHdfaWR4KSB7CisJCXN0cnVjdCB0eF9yaW5nX2luZm8gKnJpID0gJnRwLT50eF9idWZmZXJzW3N3X2lkeF07CisJCXN0cnVjdCBza19idWZmICpza2IgPSByaS0+c2tiOworCQlpbnQgaTsKKworCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKQorCQkJQlVHKCk7CisKKwkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwKKwkJCQkgcGNpX3VubWFwX2FkZHIocmksIG1hcHBpbmcpLAorCQkJCSBza2JfaGVhZGxlbihza2IpLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlyaS0+c2tiID0gTlVMTDsKKworCQlzd19pZHggPSBORVhUX1RYKHN3X2lkeCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJaWYgKHVubGlrZWx5KHN3X2lkeCA9PSBod19pZHgpKQorCQkJCUJVRygpOworCisJCQlyaSA9ICZ0cC0+dHhfYnVmZmVyc1tzd19pZHhdOworCQkJaWYgKHVubGlrZWx5KHJpLT5za2IgIT0gTlVMTCkpCisJCQkJQlVHKCk7CisKKwkJCXBjaV91bm1hcF9wYWdlKHRwLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyaSwgbWFwcGluZyksCisJCQkJICAgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCXN3X2lkeCA9IE5FWFRfVFgoc3dfaWR4KTsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCisJdHAtPnR4X2NvbnMgPSBzd19pZHg7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJgorCSAgICAoVFhfQlVGRlNfQVZBSUwodHApID4gVEczX1RYX1dBS0VVUF9USFJFU0gpKQorCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOworfQorCisvKiBSZXR1cm5zIHNpemUgb2Ygc2tiIGFsbG9jYXRlZCBvciA8IDAgb24gZXJyb3IuCisgKgorICogV2Ugb25seSBuZWVkIHRvIGZpbGwgaW4gdGhlIGFkZHJlc3MgYmVjYXVzZSB0aGUgb3RoZXIgbWVtYmVycworICogb2YgdGhlIFJYIGRlc2NyaXB0b3IgYXJlIGludmFyaWFudCwgc2VlIHRnM19pbml0X3JpbmdzLgorICoKKyAqIE5vdGUgdGhlIHB1cnBvc2VmdWwgYXNzeW1ldHJ5IG9mIGNwdSB2cy4gY2hpcCBhY2Nlc3Nlcy4gIEZvcgorICogcG9zdGluZyBidWZmZXJzIHdlIG9ubHkgZGlydHkgdGhlIGZpcnN0IGNhY2hlIGxpbmUgb2YgdGhlIFJYCisgKiBkZXNjcmlwdG9yIChjb250YWluaW5nIHRoZSBhZGRyZXNzKS4gIFdoZXJlYXMgZm9yIHRoZSBSWCBzdGF0dXMKKyAqIGJ1ZmZlcnMgdGhlIGNwdSBvbmx5IHJlYWRzIHRoZSBsYXN0IGNhY2hlbGluZSBvZiB0aGUgUlggZGVzY3JpcHRvcgorICogKHRvIGZldGNoIHRoZSBlcnJvciBmbGFncywgdmxhbiB0YWcsIGNoZWNrc3VtLCBhbmQgb3BhcXVlIGNvb2tpZSkuCisgKi8KK3N0YXRpYyBpbnQgdGczX2FsbG9jX3J4X3NrYihzdHJ1Y3QgdGczICp0cCwgdTMyIG9wYXF1ZV9rZXksCisJCQkgICAgaW50IHNyY19pZHgsIHUzMiBkZXN0X2lkeF91bm1hc2tlZCkKK3sKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpkZXNjOworCXN0cnVjdCByaW5nX2luZm8gKm1hcCwgKnNyY19tYXA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJaW50IHNrYl9zaXplLCBkZXN0X2lkeDsKKworCXNyY19tYXAgPSBOVUxMOworCXN3aXRjaCAob3BhcXVlX2tleSkgeworCWNhc2UgUlhEX09QQVFVRV9SSU5HX1NURDoKKwkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAlIFRHM19SWF9SSU5HX1NJWkU7CisJCWRlc2MgPSAmdHAtPnJ4X3N0ZFtkZXN0X2lkeF07CisJCW1hcCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbZGVzdF9pZHhdOworCQlpZiAoc3JjX2lkeCA+PSAwKQorCQkJc3JjX21hcCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbc3JjX2lkeF07CisJCXNrYl9zaXplID0gUlhfUEtUX0JVRl9TWjsKKwkJYnJlYWs7CisKKwljYXNlIFJYRF9PUEFRVUVfUklOR19KVU1CTzoKKwkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAlIFRHM19SWF9KVU1CT19SSU5HX1NJWkU7CisJCWRlc2MgPSAmdHAtPnJ4X2p1bWJvW2Rlc3RfaWR4XTsKKwkJbWFwID0gJnRwLT5yeF9qdW1ib19idWZmZXJzW2Rlc3RfaWR4XTsKKwkJaWYgKHNyY19pZHggPj0gMCkKKwkJCXNyY19tYXAgPSAmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbc3JjX2lkeF07CisJCXNrYl9zaXplID0gUlhfSlVNQk9fUEtUX0JVRl9TWjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJLyogRG8gbm90IG92ZXJ3cml0ZSBhbnkgb2YgdGhlIG1hcCBvciBycCBpbmZvcm1hdGlvbgorCSAqIHVudGlsIHdlIGFyZSBzdXJlIHdlIGNhbiBjb21taXQgdG8gYSBuZXcgYnVmZmVyLgorCSAqCisJICogQ2FsbGVycyBkZXBlbmQgdXBvbiB0aGlzIGJlaGF2aW9yIGFuZCBhc3N1bWUgdGhhdAorCSAqIHdlIGxlYXZlIGV2ZXJ5dGhpbmcgdW5jaGFuZ2VkIGlmIHdlIGZhaWwuCisJICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihza2Jfc2l6ZSk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYi0+ZGV2ID0gdHAtPmRldjsKKwlza2JfcmVzZXJ2ZShza2IsIHRwLT5yeF9vZmZzZXQpOworCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYl9zaXplIC0gdHAtPnJ4X29mZnNldCwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCW1hcC0+c2tiID0gc2tiOworCXBjaV91bm1hcF9hZGRyX3NldChtYXAsIG1hcHBpbmcsIG1hcHBpbmcpOworCisJaWYgKHNyY19tYXAgIT0gTlVMTCkKKwkJc3JjX21hcC0+c2tiID0gTlVMTDsKKworCWRlc2MtPmFkZHJfaGkgPSAoKHU2NCltYXBwaW5nID4+IDMyKTsKKwlkZXNjLT5hZGRyX2xvID0gKCh1NjQpbWFwcGluZyAmIDB4ZmZmZmZmZmYpOworCisJcmV0dXJuIHNrYl9zaXplOworfQorCisvKiBXZSBvbmx5IG5lZWQgdG8gbW92ZSBvdmVyIGluIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIG90aGVyCisgKiBtZW1iZXJzIG9mIHRoZSBSWCBkZXNjcmlwdG9yIGFyZSBpbnZhcmlhbnQuICBTZWUgbm90ZXMgYWJvdmUKKyAqIHRnM19hbGxvY19yeF9za2IgZm9yIGZ1bGwgZGV0YWlscy4KKyAqLworc3RhdGljIHZvaWQgdGczX3JlY3ljbGVfcngoc3RydWN0IHRnMyAqdHAsIHUzMiBvcGFxdWVfa2V5LAorCQkJICAgaW50IHNyY19pZHgsIHUzMiBkZXN0X2lkeF91bm1hc2tlZCkKK3sKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpzcmNfZGVzYywgKmRlc3RfZGVzYzsKKwlzdHJ1Y3QgcmluZ19pbmZvICpzcmNfbWFwLCAqZGVzdF9tYXA7CisJaW50IGRlc3RfaWR4OworCisJc3dpdGNoIChvcGFxdWVfa2V5KSB7CisJY2FzZSBSWERfT1BBUVVFX1JJTkdfU1REOgorCQlkZXN0X2lkeCA9IGRlc3RfaWR4X3VubWFza2VkICUgVEczX1JYX1JJTkdfU0laRTsKKwkJZGVzdF9kZXNjID0gJnRwLT5yeF9zdGRbZGVzdF9pZHhdOworCQlkZXN0X21hcCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbZGVzdF9pZHhdOworCQlzcmNfZGVzYyA9ICZ0cC0+cnhfc3RkW3NyY19pZHhdOworCQlzcmNfbWFwID0gJnRwLT5yeF9zdGRfYnVmZmVyc1tzcmNfaWR4XTsKKwkJYnJlYWs7CisKKwljYXNlIFJYRF9PUEFRVUVfUklOR19KVU1CTzoKKwkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAlIFRHM19SWF9KVU1CT19SSU5HX1NJWkU7CisJCWRlc3RfZGVzYyA9ICZ0cC0+cnhfanVtYm9bZGVzdF9pZHhdOworCQlkZXN0X21hcCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tkZXN0X2lkeF07CisJCXNyY19kZXNjID0gJnRwLT5yeF9qdW1ib1tzcmNfaWR4XTsKKwkJc3JjX21hcCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tzcmNfaWR4XTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfTsKKworCWRlc3RfbWFwLT5za2IgPSBzcmNfbWFwLT5za2I7CisJcGNpX3VubWFwX2FkZHJfc2V0KGRlc3RfbWFwLCBtYXBwaW5nLAorCQkJICAgcGNpX3VubWFwX2FkZHIoc3JjX21hcCwgbWFwcGluZykpOworCWRlc3RfZGVzYy0+YWRkcl9oaSA9IHNyY19kZXNjLT5hZGRyX2hpOworCWRlc3RfZGVzYy0+YWRkcl9sbyA9IHNyY19kZXNjLT5hZGRyX2xvOworCisJc3JjX21hcC0+c2tiID0gTlVMTDsKK30KKworI2lmIFRHM19WTEFOX1RBR19VU0VECitzdGF0aWMgaW50IHRnM192bGFuX3J4KHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90YWcpCit7CisJcmV0dXJuIHZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHRwLT52bGdycCwgdmxhbl90YWcpOworfQorI2VuZGlmCisKKy8qIFRoZSBSWCByaW5nIHNjaGVtZSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSByaW5ncyB3aGljaCBwb3N0IGZyZXNoCisgKiBidWZmZXJzIHRvIHRoZSBjaGlwLCBhbmQgb25lIHNwZWNpYWwgcmluZyB0aGUgY2hpcCB1c2VzIHRvIHJlcG9ydAorICogc3RhdHVzIGJhY2sgdG8gdGhlIGhvc3QuCisgKgorICogVGhlIHNwZWNpYWwgcmluZyByZXBvcnRzIHRoZSBzdGF0dXMgb2YgcmVjZWl2ZWQgcGFja2V0cyB0byB0aGUKKyAqIGhvc3QuICBUaGUgY2hpcCBkb2VzIG5vdCB3cml0ZSBpbnRvIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIHRoZQorICogUlggYnVmZmVyIHdhcyBvYnRhaW5lZCBmcm9tLiAgVGhlIGNoaXAgc2ltcGx5IHRha2VzIHRoZSBvcmlnaW5hbAorICogZGVzY3JpcHRvciBhcyBwcm92aWRlZCBieSB0aGUgaG9zdCwgdXBkYXRlcyB0aGUgc3RhdHVzIGFuZCBsZW5ndGgKKyAqIGZpZWxkLCB0aGVuIHdyaXRlcyB0aGlzIGludG8gdGhlIG5leHQgc3RhdHVzIHJpbmcgZW50cnkuCisgKgorICogRWFjaCByaW5nIHRoZSBob3N0IHVzZXMgdG8gcG9zdCBidWZmZXJzIHRvIHRoZSBjaGlwIGlzIGRlc2NyaWJlZAorICogYnkgYSBURzNfQkRJTkZPIGVudHJ5IGluIHRoZSBjaGlwcyBTUkFNIGFyZWEuICBXaGVuIGEgcGFja2V0IGFycml2ZXMsCisgKiBpdCBpcyBmaXJzdCBwbGFjZWQgaW50byB0aGUgb24tY2hpcCByYW0uICBXaGVuIHRoZSBwYWNrZXQncyBsZW5ndGgKKyAqIGlzIGtub3duLCBpdCB3YWxrcyBkb3duIHRoZSBURzNfQkRJTkZPIGVudHJpZXMgdG8gc2VsZWN0IHRoZSByaW5nLgorICogRWFjaCBURzNfQkRJTkZPIHNwZWNpZmllcyBhIE1BWExFTiBmaWVsZCBhbmQgdGhlIGZpcnN0IFRHM19CRElORk8KKyAqIHdoaWNoIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIG5ldyBwYWNrZXQncyBsZW5ndGggaXMgY2hvc2VuLgorICoKKyAqIFRoZSAic2VwYXJhdGUgcmluZyBmb3Igcnggc3RhdHVzIiBzY2hlbWUgbWF5IHNvdW5kIHF1ZWVyLCBidXQgaXQgbWFrZXMKKyAqIHNlbnNlIGZyb20gYSBjYWNoZSBjb2hlcmVuY3kgcGVyc3BlY3RpdmUuICBJZiBvbmx5IHRoZSBob3N0IHdyaXRlcworICogdG8gdGhlIGJ1ZmZlciBwb3N0IHJpbmdzLCBhbmQgb25seSB0aGUgY2hpcCB3cml0ZXMgdG8gdGhlIHJ4IHN0YXR1cworICogcmluZ3MsIHRoZW4gY2FjaGUgbGluZXMgbmV2ZXIgbW92ZSBiZXlvbmQgc2hhcmVkLW1vZGlmaWVkIHN0YXRlLgorICogSWYgYm90aCB0aGUgaG9zdCBhbmQgY2hpcCB3ZXJlIHRvIHdyaXRlIGludG8gdGhlIHNhbWUgcmluZywgY2FjaGUgbGluZQorICogZXZpY3Rpb24gY291bGQgb2NjdXIgc2luY2UgYm90aCBlbnRpdGllcyB3YW50IGl0IGluIGFuIGV4Y2x1c2l2ZSBzdGF0ZS4KKyAqLworc3RhdGljIGludCB0ZzNfcngoc3RydWN0IHRnMyAqdHAsIGludCBidWRnZXQpCit7CisJdTMyIHdvcmtfbWFzazsKKwl1MzIgcnhfcmNiX3B0ciA9IHRwLT5yeF9yY2JfcHRyOworCXUxNiBod19pZHgsIHN3X2lkeDsKKwlpbnQgcmVjZWl2ZWQ7CisKKwlod19pZHggPSB0cC0+aHdfc3RhdHVzLT5pZHhbMF0ucnhfcHJvZHVjZXI7CisJLyoKKwkgKiBXZSBuZWVkIHRvIG9yZGVyIHRoZSByZWFkIG9mIGh3X2lkeCBhbmQgdGhlIHJlYWQgb2YKKwkgKiB0aGUgb3BhcXVlIGNvb2tpZS4KKwkgKi8KKwlybWIoKTsKKwlzd19pZHggPSByeF9yY2JfcHRyICUgVEczX1JYX1JDQl9SSU5HX1NJWkUodHApOworCXdvcmtfbWFzayA9IDA7CisJcmVjZWl2ZWQgPSAwOworCXdoaWxlIChzd19pZHggIT0gaHdfaWR4ICYmIGJ1ZGdldCA+IDApIHsKKwkJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYyA9ICZ0cC0+cnhfcmNiW3N3X2lkeF07CisJCXVuc2lnbmVkIGludCBsZW47CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCXUzMiBvcGFxdWVfa2V5LCBkZXNjX2lkeCwgKnBvc3RfcHRyOworCisJCWRlc2NfaWR4ID0gZGVzYy0+b3BhcXVlICYgUlhEX09QQVFVRV9JTkRFWF9NQVNLOworCQlvcGFxdWVfa2V5ID0gZGVzYy0+b3BhcXVlICYgUlhEX09QQVFVRV9SSU5HX01BU0s7CisJCWlmIChvcGFxdWVfa2V5ID09IFJYRF9PUEFRVUVfUklOR19TVEQpIHsKKwkJCWRtYV9hZGRyID0gcGNpX3VubWFwX2FkZHIoJnRwLT5yeF9zdGRfYnVmZmVyc1tkZXNjX2lkeF0sCisJCQkJCQkgIG1hcHBpbmcpOworCQkJc2tiID0gdHAtPnJ4X3N0ZF9idWZmZXJzW2Rlc2NfaWR4XS5za2I7CisJCQlwb3N0X3B0ciA9ICZ0cC0+cnhfc3RkX3B0cjsKKwkJfSBlbHNlIGlmIChvcGFxdWVfa2V5ID09IFJYRF9PUEFRVUVfUklOR19KVU1CTykgeworCQkJZG1hX2FkZHIgPSBwY2lfdW5tYXBfYWRkcigmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbZGVzY19pZHhdLAorCQkJCQkJICBtYXBwaW5nKTsKKwkJCXNrYiA9IHRwLT5yeF9qdW1ib19idWZmZXJzW2Rlc2NfaWR4XS5za2I7CisJCQlwb3N0X3B0ciA9ICZ0cC0+cnhfanVtYm9fcHRyOworCQl9CisJCWVsc2UgeworCQkJZ290byBuZXh0X3BrdF9ub3Bvc3Q7CisJCX0KKworCQl3b3JrX21hc2sgfD0gb3BhcXVlX2tleTsKKworCQlpZiAoKGRlc2MtPmVycl92bGFuICYgUlhEX0VSUl9NQVNLKSAhPSAwICYmCisJCSAgICAoZGVzYy0+ZXJyX3ZsYW4gIT0gUlhEX0VSUl9PRERfTklCQkxFX1JDVkRfTUlJKSkgeworCQlkcm9wX2l0OgorCQkJdGczX3JlY3ljbGVfcngodHAsIG9wYXF1ZV9rZXksCisJCQkJICAgICAgIGRlc2NfaWR4LCAqcG9zdF9wdHIpOworCQlkcm9wX2l0X25vX3JlY3ljbGU6CisJCQkvKiBPdGhlciBzdGF0aXN0aWNzIGtlcHQgdHJhY2sgb2YgYnkgY2FyZC4gKi8KKwkJCXRwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBuZXh0X3BrdDsKKwkJfQorCisJCWxlbiA9ICgoZGVzYy0+aWR4X2xlbiAmIFJYRF9MRU5fTUFTSykgPj4gUlhEX0xFTl9TSElGVCkgLSA0OyAvKiBvbWl0IGNyYyAqLworCisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCAKKwkJCSYmIHRwLT5yeF9vZmZzZXQgPT0gMgorCQkJLyogcnhfb2Zmc2V0ICE9IDIgaWZmIHRoaXMgaXMgYSA1NzAxIGNhcmQgcnVubmluZworCQkJICogaW4gUENJLVggbW9kZSBbc2VlIHRnM19nZXRfaW52YXJpYW50cygpXSAqLworCQkpIHsKKwkJCWludCBza2Jfc2l6ZTsKKworCQkJc2tiX3NpemUgPSB0ZzNfYWxsb2Nfcnhfc2tiKHRwLCBvcGFxdWVfa2V5LAorCQkJCQkJICAgIGRlc2NfaWR4LCAqcG9zdF9wdHIpOworCQkJaWYgKHNrYl9zaXplIDwgMCkKKwkJCQlnb3RvIGRyb3BfaXQ7CisKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIGRtYV9hZGRyLAorCQkJCQkgc2tiX3NpemUgLSB0cC0+cnhfb2Zmc2V0LAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJc2tiX3B1dChza2IsIGxlbik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2I7CisKKwkJCXRnM19yZWN5Y2xlX3J4KHRwLCBvcGFxdWVfa2V5LAorCQkJCSAgICAgICBkZXNjX2lkeCwgKnBvc3RfcHRyKTsKKworCQkJY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpCisJCQkJZ290byBkcm9wX2l0X25vX3JlY3ljbGU7CisKKwkJCWNvcHlfc2tiLT5kZXYgPSB0cC0+ZGV2OworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBXZSdsbCByZXVzZSB0aGUgb3JpZ2luYWwgcmluZyBidWZmZXIuICovCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCisJCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX0NIRUNLU1VNUykgJiYKKwkJICAgIChkZXNjLT50eXBlX2ZsYWdzICYgUlhEX0ZMQUdfVENQVURQX0NTVU0pICYmCisJCSAgICAoKChkZXNjLT5pcF90Y3BfY3N1bSAmIFJYRF9UQ1BDU1VNX01BU0spCisJCSAgICAgID4+IFJYRF9UQ1BDU1VNX1NISUZUKSA9PSAweGZmZmYpKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJZWxzZQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHRwLT5kZXYpOworI2lmIFRHM19WTEFOX1RBR19VU0VECisJCWlmICh0cC0+dmxncnAgIT0gTlVMTCAmJgorCQkgICAgZGVzYy0+dHlwZV9mbGFncyAmIFJYRF9GTEFHX1ZMQU4pIHsKKwkJCXRnM192bGFuX3J4KHRwLCBza2IsCisJCQkJICAgIGRlc2MtPmVycl92bGFuICYgUlhEX1ZMQU5fTUFTSyk7CisJCX0gZWxzZQorI2VuZGlmCisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJCXRwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlyZWNlaXZlZCsrOworCQlidWRnZXQtLTsKKworbmV4dF9wa3Q6CisJCSgqcG9zdF9wdHIpKys7CituZXh0X3BrdF9ub3Bvc3Q6CisJCXJ4X3JjYl9wdHIrKzsKKwkJc3dfaWR4ID0gcnhfcmNiX3B0ciAlIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKTsKKwl9CisKKwkvKiBBQ0sgdGhlIHN0YXR1cyByaW5nLiAqLworCXRwLT5yeF9yY2JfcHRyID0gcnhfcmNiX3B0cjsKKwl0dzMyX3J4X21ib3goTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgKHJ4X3JjYl9wdHIgJSBURzNfUlhfUkNCX1JJTkdfU0laRSh0cCkpKTsKKworCS8qIFJlZmlsbCBSWCByaW5nKHMpLiAqLworCWlmICh3b3JrX21hc2sgJiBSWERfT1BBUVVFX1JJTkdfU1REKSB7CisJCXN3X2lkeCA9IHRwLT5yeF9zdGRfcHRyICUgVEczX1JYX1JJTkdfU0laRTsKKwkJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICBzd19pZHgpOworCX0KKwlpZiAod29ya19tYXNrICYgUlhEX09QQVFVRV9SSU5HX0pVTUJPKSB7CisJCXN3X2lkeCA9IHRwLT5yeF9qdW1ib19wdHIgJSBURzNfUlhfSlVNQk9fUklOR19TSVpFOworCQl0dzMyX3J4X21ib3goTUFJTEJPWF9SQ1ZfSlVNQk9fUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCSAgICAgc3dfaWR4KTsKKwl9CisJbW1pb3diKCk7CisKKwlyZXR1cm4gcmVjZWl2ZWQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB0ZzNfaHdfc3RhdHVzICpzYmxrID0gdHAtPmh3X3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkb25lOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBoYW5kbGUgbGluayBjaGFuZ2UgYW5kIG90aGVyIHBoeSBldmVudHMgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYKKwkgICAgICAoVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHIHwKKwkgICAgICAgVEczX0ZMQUdfUE9MTF9TRVJERVMpKSkgeworCQlpZiAoc2Jsay0+c3RhdHVzICYgU0RfU1RBVFVTX0xJTktfQ0hHKSB7CisJCQlzYmxrLT5zdGF0dXMgPSBTRF9TVEFUVVNfVVBEQVRFRCB8CisJCQkJKHNibGstPnN0YXR1cyAmIH5TRF9TVEFUVVNfTElOS19DSEcpOworCQkJdGczX3NldHVwX3BoeSh0cCwgMCk7CisJCX0KKwl9CisKKwkvKiBydW4gVFggY29tcGxldGlvbiB0aHJlYWQgKi8KKwlpZiAoc2Jsay0+aWR4WzBdLnR4X2NvbnN1bWVyICE9IHRwLT50eF9jb25zKSB7CisJCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCQl0ZzNfdHgodHApOworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBydW4gUlggdGhyZWFkLCB3aXRoaW4gdGhlIGJvdW5kcyBzZXQgYnkgTkFQSS4KKwkgKiBBbGwgUlggImxvY2tpbmciIGlzIGRvbmUgYnkgZW5zdXJpbmcgb3V0c2lkZQorCSAqIGNvZGUgc3luY2hyb25pemVzIHdpdGggZGV2LT5wb2xsKCkKKwkgKi8KKwlkb25lID0gMTsKKwlpZiAoc2Jsay0+aWR4WzBdLnJ4X3Byb2R1Y2VyICE9IHRwLT5yeF9yY2JfcHRyKSB7CisJCWludCBvcmlnX2J1ZGdldCA9ICpidWRnZXQ7CisJCWludCB3b3JrX2RvbmU7CisKKwkJaWYgKG9yaWdfYnVkZ2V0ID4gbmV0ZGV2LT5xdW90YSkKKwkJCW9yaWdfYnVkZ2V0ID0gbmV0ZGV2LT5xdW90YTsKKworCQl3b3JrX2RvbmUgPSB0ZzNfcngodHAsIG9yaWdfYnVkZ2V0KTsKKworCQkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkJaWYgKHdvcmtfZG9uZSA+PSBvcmlnX2J1ZGdldCkKKwkJCWRvbmUgPSAwOworCX0KKworCS8qIGlmIG5vIG1vcmUgd29yaywgdGVsbCBuZXQgc3RhY2sgYW5kIE5JQyB3ZSdyZSBkb25lICovCisJaWYgKGRvbmUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCV9fbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJdGczX3Jlc3RhcnRfaW50cyh0cCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIChkb25lID8gMCA6IDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0ZzNfaGFzX3dvcmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOworCXVuc2lnbmVkIGludCB3b3JrX2V4aXN0cyA9IDA7CisKKwkvKiBjaGVjayBmb3IgcGh5IGV2ZW50cyAqLworCWlmICghKHRwLT50ZzNfZmxhZ3MgJgorCSAgICAgIChURzNfRkxBR19VU0VfTElOS0NIR19SRUcgfAorCSAgICAgICBURzNfRkxBR19QT0xMX1NFUkRFUykpKSB7CisJCWlmIChzYmxrLT5zdGF0dXMgJiBTRF9TVEFUVVNfTElOS19DSEcpCisJCQl3b3JrX2V4aXN0cyA9IDE7CisJfQorCS8qIGNoZWNrIGZvciBSWC9UWCB3b3JrIHRvIGRvICovCisJaWYgKHNibGstPmlkeFswXS50eF9jb25zdW1lciAhPSB0cC0+dHhfY29ucyB8fAorCSAgICBzYmxrLT5pZHhbMF0ucnhfcHJvZHVjZXIgIT0gdHAtPnJ4X3JjYl9wdHIpCisJCXdvcmtfZXhpc3RzID0gMTsKKworCXJldHVybiB3b3JrX2V4aXN0czsKK30KKworc3RhdGljIGlycXJldHVybl90IHRnM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cyAqc2JsayA9IHRwLT5od19zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIEluIElOVHggbW9kZSwgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gYXJyaXZlIGF0CisJICogdGhlIENQVSBiZWZvcmUgdGhlIHN0YXR1cyBibG9jayBwb3N0ZWQgcHJpb3IgdG8gdGhlIGludGVycnVwdC4KKwkgKiBSZWFkaW5nIHRoZSBQQ0kgU3RhdGUgcmVnaXN0ZXIgd2lsbCBjb25maXJtIHdoZXRoZXIgdGhlCisJICogaW50ZXJydXB0IGlzIG91cnMgYW5kIHdpbGwgZmx1c2ggdGhlIHN0YXR1cyBibG9jay4KKwkgKi8KKwlpZiAoKHNibGstPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKSB8fAorCSAgICAhKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0lOVF9OT1RfQUNUSVZFKSkgeworCQkvKgorCQkgKiB3cml0aW5nIGFueSB2YWx1ZSB0byBpbnRyLW1ib3gtMCBjbGVhcnMgUENJIElOVEEjIGFuZAorCQkgKiBjaGlwLWludGVybmFsIGludGVycnVwdCBwZW5kaW5nIGV2ZW50cy4KKwkJICogd3JpdGluZyBub24temVybyB0byBpbnRyLW1ib3gtMCBhZGRpdGlvbmFsIHRlbGxzIHRoZQorCQkgKiBOSUMgdG8gc3RvcCBzZW5kaW5nIHVzIGlycXMsIGVuZ2FnaW5nICJpbi1pbnRyLWhhbmRsZXIiCisJCSAqIGV2ZW50IGNvYWxlc2NpbmcuCisJCSAqLworCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAweDAwMDAwMDAxKTsKKwkJLyoKKwkJICogRmx1c2ggUENJIHdyaXRlLiAgVGhpcyBhbHNvIGd1YXJhbnRlZXMgdGhhdCBvdXIKKwkJICogc3RhdHVzIGJsb2NrIGhhcyBiZWVuIGZsdXNoZWQgdG8gaG9zdCBtZW1vcnkuCisJCSAqLworCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCXNibGstPnN0YXR1cyAmPSB+U0RfU1RBVFVTX1VQREFURUQ7CisKKwkJaWYgKGxpa2VseSh0ZzNfaGFzX3dvcmsoZGV2LCB0cCkpKQorCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsJCS8qIHNjaGVkdWxlIE5BUEkgcG9sbCAqLworCQllbHNlIHsKKwkJCS8qIG5vIHdvcmssIHNoYXJlZCBpbnRlcnJ1cHQgcGVyaGFwcz8gIHJlLWVuYWJsZQorCQkJICogaW50ZXJydXB0cywgYW5kIGZsdXNoIHRoYXQgUENJIHdyaXRlCisJCQkgKi8KKwkJCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csCisJCQkgICAgIAkweDAwMDAwMDAwKTsKKwkJCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XKTsKKwkJfQorCX0gZWxzZSB7CS8qIHNoYXJlZCBpbnRlcnJ1cHQgKi8KKwkJaGFuZGxlZCA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IHRnM19pbml0X2h3KHN0cnVjdCB0ZzMgKik7CitzdGF0aWMgaW50IHRnM19oYWx0KHN0cnVjdCB0ZzMgKik7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdGczX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXRnM19pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGczX3Jlc2V0X3Rhc2sodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IHRnMyAqdHAgPSBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdGFydF90aW1lcjsKKworCXRnM19uZXRpZl9zdG9wKHRwKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXJlc3RhcnRfdGltZXIgPSB0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1JFU1RBUlRfVElNRVI7CisJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1JFU1RBUlRfVElNRVI7CisKKwl0ZzNfaGFsdCh0cCk7CisJdGczX2luaXRfaHcodHApOworCisJdGczX25ldGlmX3N0YXJ0KHRwKTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlpZiAocmVzdGFydF90aW1lcikKKwkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIGppZmZpZXMgKyAxKTsKK30KKworc3RhdGljIHZvaWQgdGczX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisKKwlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfdHhkKHN0cnVjdCB0ZzMgKiwgaW50LCBkbWFfYWRkcl90LCBpbnQsIHUzMiwgdTMyKTsKKworc3RhdGljIGludCB0aWdvbjNfNGdiX2h3YnVnX3dvcmthcm91bmQoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHUzMiBndWlsdHlfZW50cnksIGludCBndWlsdHlfbGVuLAorCQkJCSAgICAgICB1MzIgbGFzdF9wbHVzX29uZSwgdTMyICpzdGFydCwgdTMyIG1zcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJZG1hX2FkZHJfdCBuZXdfYWRkcjsKKwl1MzIgZW50cnkgPSAqc3RhcnQ7CisJaW50IGk7CisKKwlpZiAoIW5ld19za2IpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTmV3IFNLQiBpcyBndWFyYW50ZWVkIHRvIGJlIGxpbmVhci4gKi8KKwllbnRyeSA9ICpzdGFydDsKKwluZXdfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBuZXdfc2tiLT5kYXRhLCBuZXdfc2tiLT5sZW4sCisJCQkJICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0ZzNfc2V0X3R4ZCh0cCwgZW50cnksIG5ld19hZGRyLCBuZXdfc2tiLT5sZW4sCisJCSAgICAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpID8KKwkJICAgIFRYRF9GTEFHX1RDUFVEUF9DU1VNIDogMCwgMSB8IChtc3MgPDwgMSkpOworCSpzdGFydCA9IE5FWFRfVFgoZW50cnkpOworCisJLyogTm93IGNsZWFuIHVwIHRoZSBzdyByaW5nIGVudHJpZXMuICovCisJaSA9IDA7CisJd2hpbGUgKGVudHJ5ICE9IGxhc3RfcGx1c19vbmUpIHsKKwkJaW50IGxlbjsKKworCQlpZiAoaSA9PSAwKQorCQkJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZWxzZQorCQkJbGVuID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdLnNpemU7CisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcpLAorCQkJCSBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoaSA9PSAwKSB7CisJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gbmV3X3NrYjsKKwkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBuZXdfYWRkcik7CisJCX0gZWxzZSB7CisJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJfQorCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCQlpKys7CisJfQorCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfdHhkKHN0cnVjdCB0ZzMgKnRwLCBpbnQgZW50cnksCisJCQlkbWFfYWRkcl90IG1hcHBpbmcsIGludCBsZW4sIHUzMiBmbGFncywKKwkJCXUzMiBtc3NfYW5kX2lzX2VuZCkKK3sKKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjICp0eGQgPSAmdHAtPnR4X3JpbmdbZW50cnldOworCWludCBpc19lbmQgPSAobXNzX2FuZF9pc19lbmQgJiAweDEpOworCXUzMiBtc3MgPSAobXNzX2FuZF9pc19lbmQgPj4gMSk7CisJdTMyIHZsYW5fdGFnID0gMDsKKworCWlmIChpc19lbmQpCisJCWZsYWdzIHw9IFRYRF9GTEFHX0VORDsKKwlpZiAoZmxhZ3MgJiBUWERfRkxBR19WTEFOKSB7CisJCXZsYW5fdGFnID0gZmxhZ3MgPj4gMTY7CisJCWZsYWdzICY9IDB4ZmZmZjsKKwl9CisJdmxhbl90YWcgfD0gKG1zcyA8PCBUWERfTVNTX1NISUZUKTsKKworCXR4ZC0+YWRkcl9oaSA9ICgodTY0KSBtYXBwaW5nID4+IDMyKTsKKwl0eGQtPmFkZHJfbG8gPSAoKHU2NCkgbWFwcGluZyAmIDB4ZmZmZmZmZmYpOworCXR4ZC0+bGVuX2ZsYWdzID0gKGxlbiA8PCBUWERfTEVOX1NISUZUKSB8IGZsYWdzOworCXR4ZC0+dmxhbl90YWcgPSB2bGFuX3RhZyA8PCBUWERfVkxBTl9UQUdfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRnM180Z19vdmVyZmxvd190ZXN0KGRtYV9hZGRyX3QgbWFwcGluZywgaW50IGxlbikKK3sKKwl1MzIgYmFzZSA9ICh1MzIpIG1hcHBpbmcgJiAweGZmZmZmZmZmOworCisJcmV0dXJuICgoYmFzZSA+IDB4ZmZmZmRjYzApICYmCisJCShiYXNlICsgbGVuICsgOCA8IGJhc2UpKTsKK30KKworc3RhdGljIGludCB0ZzNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIGxlbiwgZW50cnksIGJhc2VfZmxhZ3MsIG1zczsKKwlpbnQgd291bGRfaGl0X2h3YnVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCisJLyogTm8gQkggZGlzYWJsaW5nIGZvciB0eF9sb2NrIGhlcmUuICBXZSBhcmUgcnVubmluZyBpbiBCSCBkaXNhYmxlZAorCSAqIGNvbnRleHQgYW5kIFRYIHJlY2xhaW0gcnVucyB2aWEgdHAtPnBvbGwgaW5zaWRlIG9mIGEgc29mdHdhcmUKKwkgKiBpbnRlcnJ1cHQuICBSZWpvaWNlIQorCSAqCisJICogQWN0dWFsbHksIHRoaW5ncyBhcmUgbm90IHNvIHNpbXBsZS4gIElmIHdlIGFyZSB0byB0YWtlIGEgaHcKKwkgKiBJUlEgaGVyZSwgd2UgY2FuIGRlYWRsb2NrLCBjb25zaWRlcjoKKwkgKgorCSAqICAgICAgIENQVTEJCUNQVTIKKwkgKiAgIHRnM19zdGFydF94bWl0CisJICogICB0YWtlIHRwLT50eF9sb2NrCisJICoJCQl0ZzNfdGltZXIKKwkgKgkJCXRha2UgdHAtPmxvY2sKKwkgKiAgIHRnM19pbnRlcnJ1cHQKKwkgKiAgIHNwaW4gb24gdHAtPmxvY2sKKwkgKgkJCXNwaW4gb24gdHAtPnR4X2xvY2sKKwkgKgorCSAqIFNvIHdlIHJlYWxseSBkbyBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyB3aGVuIHRha2luZworCSAqIHR4X2xvY2sgaGVyZS4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKCFzcGluX3RyeWxvY2soJnRwLT50eF9sb2NrKSkgeyAKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsgCisJfSAKKworCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJaWYgKHVubGlrZWx5KFRYX0JVRkZTX0FWQUlMKHRwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT50eF9sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwllbnRyeSA9IHRwLT50eF9wcm9kOworCWJhc2VfZmxhZ3MgPSAwOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJYmFzZV9mbGFncyB8PSBUWERfRkxBR19UQ1BVRFBfQ1NVTTsKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCW1zcyA9IDA7CisJaWYgKHNrYi0+bGVuID4gKHRwLT5kZXYtPm10dSArIEVUSF9ITEVOKSAmJgorCSAgICAobXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgIT0gMCkgeworCQlpbnQgdGNwX29wdF9sZW4sIGlwX3RjcF9sZW47CisKKwkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJdGNwX29wdF9sZW4gPSAoKHNrYi0+aC50aC0+ZG9mZiAtIDUpICogNCk7CisJCWlwX3RjcF9sZW4gPSAoc2tiLT5uaC5pcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJCWJhc2VfZmxhZ3MgfD0gKFRYRF9GTEFHX0NQVV9QUkVfRE1BIHwKKwkJCSAgICAgICBUWERfRkxBR19DUFVfUE9TVF9ETUEpOworCisJCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7CisJCXNrYi0+bmguaXBoLT50b3RfbGVuID0gbnRvaHMobXNzICsgaXBfdGNwX2xlbiArIHRjcF9vcHRfbGVuKTsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB7CisJCQlza2ItPmgudGgtPmNoZWNrID0gMDsKKwkJCWJhc2VfZmxhZ3MgJj0gflRYRF9GTEFHX1RDUFVEUF9DU1VNOworCQl9CisJCWVsc2UgeworCQkJc2tiLT5oLnRoLT5jaGVjayA9CisJCQkJfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJCSAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJCSAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJfQorCisJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pIHx8CisJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpKSB7CisJCQlpZiAodGNwX29wdF9sZW4gfHwgc2tiLT5uaC5pcGgtPmlobCA+IDUpIHsKKwkJCQlpbnQgdHNmbGFnczsKKworCQkJCXRzZmxhZ3MgPSAoKHNrYi0+bmguaXBoLT5paGwgLSA1KSArCisJCQkJCSAgICh0Y3Bfb3B0X2xlbiA+PiAyKSk7CisJCQkJbXNzIHw9ICh0c2ZsYWdzIDw8IDExKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0Y3Bfb3B0X2xlbiB8fCBza2ItPm5oLmlwaC0+aWhsID4gNSkgeworCQkJCWludCB0c2ZsYWdzOworCisJCQkJdHNmbGFncyA9ICgoc2tiLT5uaC5pcGgtPmlobCAtIDUpICsKKwkJCQkJICAgKHRjcF9vcHRfbGVuID4+IDIpKTsKKwkJCQliYXNlX2ZsYWdzIHw9IHRzZmxhZ3MgPDwgMTI7CisJCQl9CisJCX0KKwl9CisjZWxzZQorCW1zcyA9IDA7CisjZW5kaWYKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCWlmICh0cC0+dmxncnAgIT0gTlVMTCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpCisJCWJhc2VfZmxhZ3MgfD0gKFRYRF9GTEFHX1ZMQU4gfAorCQkJICAgICAgICh2bGFuX3R4X3RhZ19nZXQoc2tiKSA8PCAxNikpOworI2VuZGlmCisKKwkvKiBRdWV1ZSBza2IgZGF0YSwgYS5rLmEuIHRoZSBtYWluIHNrYiBmcmFnbWVudC4gKi8KKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7CisJcGNpX3VubWFwX2FkZHJfc2V0KCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcsIG1hcHBpbmcpOworCisJd291bGRfaGl0X2h3YnVnID0gMDsKKworCWlmICh0ZzNfNGdfb3ZlcmZsb3dfdGVzdChtYXBwaW5nLCBsZW4pKQorCQl3b3VsZF9oaXRfaHdidWcgPSBlbnRyeSArIDE7CisKKwl0ZzNfc2V0X3R4ZCh0cCwgZW50cnksIG1hcHBpbmcsIGxlbiwgYmFzZV9mbGFncywKKwkJICAgIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApIHwgKG1zcyA8PCAxKSk7CisKKwllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJLyogTm93IGxvb3AgdGhyb3VnaCBhZGRpdGlvbmFsIGRhdGEgZnJhZ21lbnRzLCBhbmQgcXVldWUgdGhlbS4gKi8KKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApIHsKKwkJdW5zaWduZWQgaW50IGksIGxhc3Q7CisKKwkJbGFzdCA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxOworCQlmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCQlsZW4gPSBmcmFnLT5zaXplOworCQkJbWFwcGluZyA9IHBjaV9tYXBfcGFnZSh0cC0+cGRldiwKKwkJCQkJICAgICAgIGZyYWctPnBhZ2UsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJICAgICAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJcGNpX3VubWFwX2FkZHJfc2V0KCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcsIG1hcHBpbmcpOworCisJCQlpZiAodGczXzRnX292ZXJmbG93X3Rlc3QobWFwcGluZywgbGVuKSkgeworCQkJCS8qIE9ubHkgb25lIHNob3VsZCBtYXRjaC4gKi8KKwkJCQlpZiAod291bGRfaGl0X2h3YnVnKQorCQkJCQlCVUcoKTsKKwkJCQl3b3VsZF9oaXRfaHdidWcgPSBlbnRyeSArIDE7CisJCQl9CisKKwkJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykKKwkJCQl0ZzNfc2V0X3R4ZCh0cCwgZW50cnksIG1hcHBpbmcsIGxlbiwKKwkJCQkJICAgIGJhc2VfZmxhZ3MsIChpID09IGxhc3QpfChtc3MgPDwgMSkpOworCQkJZWxzZQorCQkJCXRnM19zZXRfdHhkKHRwLCBlbnRyeSwgbWFwcGluZywgbGVuLAorCQkJCQkgICAgYmFzZV9mbGFncywgKGkgPT0gbGFzdCkpOworCisJCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCQl9CisJfQorCisJaWYgKHdvdWxkX2hpdF9od2J1ZykgeworCQl1MzIgbGFzdF9wbHVzX29uZSA9IGVudHJ5OworCQl1MzIgc3RhcnQ7CisJCXVuc2lnbmVkIGludCBsZW4gPSAwOworCisJCXdvdWxkX2hpdF9od2J1ZyAtPSAxOworCQllbnRyeSA9IGVudHJ5IC0gMSAtIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCWVudHJ5ICY9IChURzNfVFhfUklOR19TSVpFIC0gMSk7CisJCXN0YXJ0ID0gZW50cnk7CisJCWkgPSAwOworCQl3aGlsZSAoZW50cnkgIT0gbGFzdF9wbHVzX29uZSkgeworCQkJaWYgKGkgPT0gMCkKKwkJCQlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCQkJZWxzZQorCQkJCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaS0xXS5zaXplOworCisJCQlpZiAoZW50cnkgPT0gd291bGRfaGl0X2h3YnVnKQorCQkJCWJyZWFrOworCisJCQlpKys7CisJCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJCX0KKworCQkvKiBJZiB0aGUgd29ya2Fyb3VuZCBmYWlscyBkdWUgdG8gbWVtb3J5L21hcHBpbmcKKwkJICogZmFpbHVyZSwgc2lsZW50bHkgZHJvcCB0aGlzIHBhY2tldC4KKwkJICovCisJCWlmICh0aWdvbjNfNGdiX2h3YnVnX3dvcmthcm91bmQodHAsIHNrYiwKKwkJCQkJCWVudHJ5LCBsZW4sCisJCQkJCQlsYXN0X3BsdXNfb25lLAorCQkJCQkJJnN0YXJ0LCBtc3MpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWVudHJ5ID0gc3RhcnQ7CisJfQorCisJLyogUGFja2V0cyBhcmUgcmVhZHksIHVwZGF0ZSBUeCBwcm9kdWNlciBpZHggbG9jYWwgYW5kIG9uIGNhcmQuICovCisJdHczMl90eF9tYm94KChNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XKSwgZW50cnkpOworCisJdHAtPnR4X3Byb2QgPSBlbnRyeTsKKwlpZiAoVFhfQlVGRlNfQVZBSUwodHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworb3V0X3VubG9jazoKKyAgICAJbW1pb3diKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPnR4X2xvY2ssIGZsYWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRnM19zZXRfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0ZzMgKnRwLAorCQkJICAgICAgIGludCBuZXdfbXR1KQoreworCWRldi0+bXR1ID0gbmV3X210dTsKKworCWlmIChuZXdfbXR1ID4gRVRIX0RBVEFfTEVOKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0pVTUJPX0VOQUJMRTsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0pVTUJPX0VOQUJMRTsKK30KKworc3RhdGljIGludCB0ZzNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV3X210dSA8IFRHM19NSU5fTVRVIHx8IG5ld19tdHUgPiBURzNfTUFYX01UVSh0cCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogV2UnbGwganVzdCBjYXRjaCBpdCBsYXRlciB3aGVuIHRoZQorCQkgKiBkZXZpY2UgaXMgdXAnZC4KKwkJICovCisJCXRnM19zZXRfbXR1KGRldiwgdHAsIG5ld19tdHUpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0ZzNfbmV0aWZfc3RvcCh0cCk7CisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJdGczX2hhbHQodHApOworCisJdGczX3NldF9tdHUoZGV2LCB0cCwgbmV3X210dSk7CisKKwl0ZzNfaW5pdF9odyh0cCk7CisKKwl0ZzNfbmV0aWZfc3RhcnQodHApOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBGcmVlIHVwIHBlbmRpbmcgcGFja2V0cyBpbiBhbGwgcngvdHggcmluZ3MuCisgKgorICogVGhlIGNoaXAgaGFzIGJlZW4gc2h1dCBkb3duIGFuZCB0aGUgZHJpdmVyIGRldGFjaGVkIGZyb20KKyAqIHRoZSBuZXR3b3JraW5nLCBzbyBubyBpbnRlcnJ1cHRzIG9yIG5ldyB0eCBwYWNrZXRzIHdpbGwKKyAqIGVuZCB1cCBpbiB0aGUgZHJpdmVyLiAgdHAtPnt0eCx9bG9jayBpcyBub3QgaGVsZCBhbmQgd2UgYXJlIG5vdAorICogaW4gYW4gaW50ZXJydXB0IGNvbnRleHQgYW5kIHRodXMgbWF5IHNsZWVwLgorICovCitzdGF0aWMgdm9pZCB0ZzNfZnJlZV9yaW5ncyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgcmluZ19pbmZvICpyeHA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4cCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbaV07CisKKwkJaWYgKHJ4cC0+c2tiID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwKKwkJCQkgcGNpX3VubWFwX2FkZHIocnhwLCBtYXBwaW5nKSwKKwkJCQkgUlhfUEtUX0JVRl9TWiAtIHRwLT5yeF9vZmZzZXQsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRldl9rZnJlZV9za2JfYW55KHJ4cC0+c2tiKTsKKwkJcnhwLT5za2IgPSBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBURzNfUlhfSlVNQk9fUklOR19TSVpFOyBpKyspIHsKKwkJcnhwID0gJnRwLT5yeF9qdW1ib19idWZmZXJzW2ldOworCisJCWlmIChyeHAtPnNrYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJ4cCwgbWFwcGluZyksCisJCQkJIFJYX0pVTUJPX1BLVF9CVUZfU1ogLSB0cC0+cnhfb2Zmc2V0LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShyeHAtPnNrYik7CisJCXJ4cC0+c2tiID0gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1RYX1JJTkdfU0laRTsgKSB7CisJCXN0cnVjdCB0eF9yaW5nX2luZm8gKnR4cDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGo7CisKKwkJdHhwID0gJnRwLT50eF9idWZmZXJzW2ldOworCQlza2IgPSB0eHAtPnNrYjsKKworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwKKwkJCQkgcGNpX3VubWFwX2FkZHIodHhwLCBtYXBwaW5nKSwKKwkJCQkgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCXR4cC0+c2tiID0gTlVMTDsKKworCQlpKys7CisKKwkJZm9yIChqID0gMDsgaiA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGorKykgeworCQkJdHhwID0gJnRwLT50eF9idWZmZXJzW2kgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpXTsKKwkJCXBjaV91bm1hcF9wYWdlKHRwLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcih0eHAsIG1hcHBpbmcpLAorCQkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2pdLnNpemUsCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJaSsrOworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUgdHgvcnggcmluZ3MgZm9yIHBhY2tldCBwcm9jZXNzaW5nLgorICoKKyAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisgKiB0aGUgbmV0d29ya2luZywgc28gbm8gaW50ZXJydXB0cyBvciBuZXcgdHggcGFja2V0cyB3aWxsCisgKiBlbmQgdXAgaW4gdGhlIGRyaXZlci4gIHRwLT57dHgsfWxvY2sgYXJlIGhlbGQgYW5kIHRodXMKKyAqIHdlIG1heSBub3Qgc2xlZXAuCisgKi8KK3N0YXRpYyB2b2lkIHRnM19pbml0X3JpbmdzKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBpOworCisJLyogRnJlZSB1cCBhbGwgdGhlIFNLQnMuICovCisJdGczX2ZyZWVfcmluZ3ModHApOworCisJLyogWmVybyBvdXQgYWxsIGRlc2NyaXB0b3JzLiAqLworCW1lbXNldCh0cC0+cnhfc3RkLCAwLCBURzNfUlhfUklOR19CWVRFUyk7CisJbWVtc2V0KHRwLT5yeF9qdW1ibywgMCwgVEczX1JYX0pVTUJPX1JJTkdfQllURVMpOworCW1lbXNldCh0cC0+cnhfcmNiLCAwLCBURzNfUlhfUkNCX1JJTkdfQllURVModHApKTsKKwltZW1zZXQodHAtPnR4X3JpbmcsIDAsIFRHM19UWF9SSU5HX0JZVEVTKTsKKworCS8qIEluaXRpYWxpemUgaW52YXJpYW50cyBvZiB0aGUgcmluZ3MsIHdlIG9ubHkgc2V0IHRoaXMKKwkgKiBzdHVmZiBvbmNlLiAgVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBjYXJkIGRvZXMgbm90CisJICogd3JpdGUgaW50byB0aGUgcnggYnVmZmVyIHBvc3RpbmcgcmluZ3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IFRHM19SWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpyeGQ7CisKKwkJcnhkID0gJnRwLT5yeF9zdGRbaV07CisJCXJ4ZC0+aWR4X2xlbiA9IChSWF9QS1RfQlVGX1NaIC0gdHAtPnJ4X29mZnNldCAtIDY0KQorCQkJPDwgUlhEX0xFTl9TSElGVDsKKwkJcnhkLT50eXBlX2ZsYWdzID0gKFJYRF9GTEFHX0VORCA8PCBSWERfRkxBR1NfU0hJRlQpOworCQlyeGQtPm9wYXF1ZSA9IChSWERfT1BBUVVFX1JJTkdfU1REIHwKKwkJCSAgICAgICAoaSA8PCBSWERfT1BBUVVFX0lOREVYX1NISUZUKSk7CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFRHM19SWF9KVU1CT19SSU5HX1NJWkU7IGkrKykgeworCQkJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqcnhkOworCisJCQlyeGQgPSAmdHAtPnJ4X2p1bWJvW2ldOworCQkJcnhkLT5pZHhfbGVuID0gKFJYX0pVTUJPX1BLVF9CVUZfU1ogLSB0cC0+cnhfb2Zmc2V0IC0gNjQpCisJCQkJPDwgUlhEX0xFTl9TSElGVDsKKwkJCXJ4ZC0+dHlwZV9mbGFncyA9IChSWERfRkxBR19FTkQgPDwgUlhEX0ZMQUdTX1NISUZUKSB8CisJCQkJUlhEX0ZMQUdfSlVNQk87CisJCQlyeGQtPm9wYXF1ZSA9IChSWERfT1BBUVVFX1JJTkdfSlVNQk8gfAorCQkJICAgICAgIChpIDw8IFJYRF9PUEFRVUVfSU5ERVhfU0hJRlQpKTsKKwkJfQorCX0KKworCS8qIE5vdyBhbGxvY2F0ZSBmcmVzaCBTS0JzIGZvciBlYWNoIHJ4IHJpbmcuICovCisJZm9yIChpID0gMDsgaSA8IHRwLT5yeF9wZW5kaW5nOyBpKyspIHsKKwkJaWYgKHRnM19hbGxvY19yeF9za2IodHAsIFJYRF9PUEFRVUVfUklOR19TVEQsCisJCQkJICAgICAtMSwgaSkgPCAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpIHsKKwkJZm9yIChpID0gMDsgaSA8IHRwLT5yeF9qdW1ib19wZW5kaW5nOyBpKyspIHsKKwkJCWlmICh0ZzNfYWxsb2Nfcnhfc2tiKHRwLCBSWERfT1BBUVVFX1JJTkdfSlVNQk8sCisJCQkJCSAgICAgLTEsIGkpIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIE11c3Qgbm90IGJlIGludm9rZWQgd2l0aCBpbnRlcnJ1cHQgc291cmNlcyBkaXNhYmxlZCBhbmQKKyAqIHRoZSBoYXJkd2FyZSBzaHV0ZG93biBkb3duLgorICovCitzdGF0aWMgdm9pZCB0ZzNfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+cnhfc3RkX2J1ZmZlcnMpIHsKKwkJa2ZyZWUodHAtPnJ4X3N0ZF9idWZmZXJzKTsKKwkJdHAtPnJ4X3N0ZF9idWZmZXJzID0gTlVMTDsKKwl9CisJaWYgKHRwLT5yeF9zdGQpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JJTkdfQllURVMsCisJCQkJICAgIHRwLT5yeF9zdGQsIHRwLT5yeF9zdGRfbWFwcGluZyk7CisJCXRwLT5yeF9zdGQgPSBOVUxMOworCX0KKwlpZiAodHAtPnJ4X2p1bWJvKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19SWF9KVU1CT19SSU5HX0JZVEVTLAorCQkJCSAgICB0cC0+cnhfanVtYm8sIHRwLT5yeF9qdW1ib19tYXBwaW5nKTsKKwkJdHAtPnJ4X2p1bWJvID0gTlVMTDsKKwl9CisJaWYgKHRwLT5yeF9yY2IpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSwKKwkJCQkgICAgdHAtPnJ4X3JjYiwgdHAtPnJ4X3JjYl9tYXBwaW5nKTsKKwkJdHAtPnJ4X3JjYiA9IE5VTEw7CisJfQorCWlmICh0cC0+dHhfcmluZykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfVFhfUklOR19CWVRFUywKKwkJCXRwLT50eF9yaW5nLCB0cC0+dHhfZGVzY19tYXBwaW5nKTsKKwkJdHAtPnR4X3JpbmcgPSBOVUxMOworCX0KKwlpZiAodHAtPmh3X3N0YXR1cykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfSFdfU1RBVFVTX1NJWkUsCisJCQkJICAgIHRwLT5od19zdGF0dXMsIHRwLT5zdGF0dXNfbWFwcGluZyk7CisJCXRwLT5od19zdGF0dXMgPSBOVUxMOworCX0KKwlpZiAodHAtPmh3X3N0YXRzKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIHNpemVvZihzdHJ1Y3QgdGczX2h3X3N0YXRzKSwKKwkJCQkgICAgdHAtPmh3X3N0YXRzLCB0cC0+c3RhdHNfbWFwcGluZyk7CisJCXRwLT5od19zdGF0cyA9IE5VTEw7CisJfQorfQorCisvKgorICogTXVzdCBub3QgYmUgaW52b2tlZCB3aXRoIGludGVycnVwdCBzb3VyY2VzIGRpc2FibGVkIGFuZAorICogdGhlIGhhcmR3YXJlIHNodXRkb3duIGRvd24uICBDYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgdGczX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHRnMyAqdHApCit7CisJdHAtPnJ4X3N0ZF9idWZmZXJzID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICoKKwkJCQkgICAgICAoVEczX1JYX1JJTkdfU0laRSArCisJCQkJICAgICAgIFRHM19SWF9KVU1CT19SSU5HX1NJWkUpKSArCisJCQkJICAgICAoc2l6ZW9mKHN0cnVjdCB0eF9yaW5nX2luZm8pICoKKwkJCQkgICAgICBURzNfVFhfUklOR19TSVpFKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghdHAtPnJ4X3N0ZF9idWZmZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCh0cC0+cnhfc3RkX2J1ZmZlcnMsIDAsCisJICAgICAgIChzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKgorCQkoVEczX1JYX1JJTkdfU0laRSArCisJCSBURzNfUlhfSlVNQk9fUklOR19TSVpFKSkgKworCSAgICAgICAoc2l6ZW9mKHN0cnVjdCB0eF9yaW5nX2luZm8pICoKKwkJVEczX1RYX1JJTkdfU0laRSkpOworCisJdHAtPnJ4X2p1bWJvX2J1ZmZlcnMgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW1RHM19SWF9SSU5HX1NJWkVdOworCXRwLT50eF9idWZmZXJzID0gKHN0cnVjdCB0eF9yaW5nX2luZm8gKikKKwkJJnRwLT5yeF9qdW1ib19idWZmZXJzW1RHM19SWF9KVU1CT19SSU5HX1NJWkVdOworCisJdHAtPnJ4X3N0ZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfUlhfUklOR19CWVRFUywKKwkJCQkJICAmdHAtPnJ4X3N0ZF9tYXBwaW5nKTsKKwlpZiAoIXRwLT5yeF9zdGQpCisJCWdvdG8gZXJyX291dDsKKworCXRwLT5yeF9qdW1ibyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfUlhfSlVNQk9fUklOR19CWVRFUywKKwkJCQkJICAgICZ0cC0+cnhfanVtYm9fbWFwcGluZyk7CisKKwlpZiAoIXRwLT5yeF9qdW1ibykKKwkJZ290byBlcnJfb3V0OworCisJdHAtPnJ4X3JjYiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfUlhfUkNCX1JJTkdfQllURVModHApLAorCQkJCQkgICZ0cC0+cnhfcmNiX21hcHBpbmcpOworCWlmICghdHAtPnJ4X3JjYikKKwkJZ290byBlcnJfb3V0OworCisJdHAtPnR4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1RYX1JJTkdfQllURVMsCisJCQkJCSAgICZ0cC0+dHhfZGVzY19tYXBwaW5nKTsKKwlpZiAoIXRwLT50eF9yaW5nKQorCQlnb3RvIGVycl9vdXQ7CisKKwl0cC0+aHdfc3RhdHVzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsCisJCQkJCSAgICAgVEczX0hXX1NUQVRVU19TSVpFLAorCQkJCQkgICAgICZ0cC0+c3RhdHVzX21hcHBpbmcpOworCWlmICghdHAtPmh3X3N0YXR1cykKKwkJZ290byBlcnJfb3V0OworCisJdHAtPmh3X3N0YXRzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cyksCisJCQkJCSAgICAmdHAtPnN0YXRzX21hcHBpbmcpOworCWlmICghdHAtPmh3X3N0YXRzKQorCQlnb3RvIGVycl9vdXQ7CisKKwltZW1zZXQodHAtPmh3X3N0YXR1cywgMCwgVEczX0hXX1NUQVRVU19TSVpFKTsKKwltZW1zZXQodHAtPmh3X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cykpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJdGczX2ZyZWVfY29uc2lzdGVudCh0cCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKyNkZWZpbmUgTUFYX1dBSVRfQ05UIDEwMDAKKworLyogVG8gc3RvcCBhIGJsb2NrLCBjbGVhciB0aGUgZW5hYmxlIGJpdCBhbmQgcG9sbCB0aWxsIGl0CisgKiBjbGVhcnMuICB0cC0+bG9jayBpcyBoZWxkLgorICovCitzdGF0aWMgaW50IHRnM19zdG9wX2Jsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1bnNpZ25lZCBsb25nIG9mcywgdTMyIGVuYWJsZV9iaXQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHZhbDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgeworCQlzd2l0Y2ggKG9mcykgeworCQljYXNlIFJDVkxTQ19NT0RFOgorCQljYXNlIERNQUNfTU9ERToKKwkJY2FzZSBNQkZSRUVfTU9ERToKKwkJY2FzZSBCVUZNR1JfTU9ERToKKwkJY2FzZSBNRU1BUkJfTU9ERToKKwkJCS8qIFdlIGNhbid0IGVuYWJsZS9kaXNhYmxlIHRoZXNlIGJpdHMgb2YgdGhlCisJCQkgKiA1NzA1LzU3NTAsIGp1c3Qgc2F5IHN1Y2Nlc3MuCisJCQkgKi8KKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9CisKKwl2YWwgPSB0cjMyKG9mcyk7CisJdmFsICY9IH5lbmFibGVfYml0OworCXR3MzJfZihvZnMsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1dBSVRfQ05UOyBpKyspIHsKKwkJdWRlbGF5KDEwMCk7CisJCXZhbCA9IHRyMzIob2ZzKTsKKwkJaWYgKCh2YWwgJiBlbmFibGVfYml0KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gTUFYX1dBSVRfQ05UKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19zdG9wX2Jsb2NrIHRpbWVkIG91dCwgIgorCQkgICAgICAgIm9mcz0lbHggZW5hYmxlX2JpdD0leFxuIiwKKwkJICAgICAgIG9mcywgZW5hYmxlX2JpdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfYWJvcnRfaHcoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGksIGVycjsKKworCXRnM19kaXNhYmxlX2ludHModHApOworCisJdHAtPnJ4X21vZGUgJj0gflJYX01PREVfRU5BQkxFOworCXR3MzJfZihNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCXVkZWxheSgxMCk7CisKKwllcnIgID0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkJESV9NT0RFLCBSQ1ZCRElfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWTFBDX01PREUsIFJDVkxQQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZMU0NfTU9ERSwgUkNWTFNDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkRCRElfTU9ERSwgUkNWREJESV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQ0NfTU9ERSwgUkNWRENDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkNDX01PREUsIFJDVkNDX01PREVfRU5BQkxFKTsKKworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRTX01PREUsIFNOREJEU19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkRCRElfTU9ERSwgU05EQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJETUFDX01PREUsIFJETUFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIERNQUNfTU9ERSwgRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkRCRENfTU9ERSwgU05EQkRDX01PREVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfVERFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCXRwLT50eF9tb2RlICY9IH5UWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0FJVF9DTlQ7IGkrKykgeworCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKCEodHIzMihNQUNfVFhfTU9ERSkgJiBUWF9NT0RFX0VOQUJMRSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gTUFYX1dBSVRfQ05UKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19hYm9ydF9odyB0aW1lZCBvdXQgZm9yICVzLCAiCisJCSAgICAgICAiVFhfTU9ERV9FTkFCTEUgd2lsbCBub3QgY2xlYXIgTUFDX1RYX01PREU9JTA4eFxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHRyMzIoTUFDX1RYX01PREUpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBIT1NUQ0NfTU9ERSwgSE9TVENDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFdETUFDX01PREUsIFdETUFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIE1CRlJFRV9NT0RFLCBNQkZSRUVfTU9ERV9FTkFCTEUpOworCisJdHczMihGVFFfUkVTRVQsIDB4ZmZmZmZmZmYpOworCXR3MzIoRlRRX1JFU0VULCAweDAwMDAwMDAwKTsKKworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNRU1BUkJfTU9ERSwgTUVNQVJCX01PREVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmICh0cC0+aHdfc3RhdHVzKQorCQltZW1zZXQodHAtPmh3X3N0YXR1cywgMCwgVEczX0hXX1NUQVRVU19TSVpFKTsKKwlpZiAodHAtPmh3X3N0YXRzKQorCQltZW1zZXQodHAtPmh3X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cykpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX252cmFtX2xvY2soc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkgeworCQlpbnQgaTsKKworCQl0dzMyKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfU0VUMSk7CisJCWZvciAoaSA9IDA7IGkgPCA4MDAwOyBpKyspIHsKKwkJCWlmICh0cjMyKE5WUkFNX1NXQVJCKSAmIFNXQVJCX0dOVDEpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMjApOworCQl9CisJCWlmIChpID09IDgwMDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCB0ZzNfbnZyYW1fdW5sb2NrKHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pCisJCXR3MzJfZihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX0NMUjEpOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX3dyaXRlX3NpZ19wcmVfcmVzZXQoc3RydWN0IHRnMyAqdHAsIGludCBraW5kKQoreworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MFgpKQorCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0UpIHsKKwkJc3dpdGNoIChraW5kKSB7CisJCWNhc2UgUkVTRVRfS0lORF9JTklUOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NUQVJUKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TSFVURE9XTjoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9VTkxPQUQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFVF9LSU5EX1NVU1BFTkQ6CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfU1VTUEVORCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfQorfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHN0cnVjdCB0ZzMgKnRwLCBpbnQga2luZCkKK3sKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRSkgeworCQlzd2l0Y2ggKGtpbmQpIHsKKwkJY2FzZSBSRVNFVF9LSU5EX0lOSVQ6CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfU1RBUlRfRE9ORSk7CisJCQlicmVhazsKKworCQljYXNlIFJFU0VUX0tJTkRfU0hVVERPV046CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfVU5MT0FEX0RPTkUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9OworCX0KK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM193cml0ZV9zaWdfbGVnYWN5KHN0cnVjdCB0ZzMgKnRwLCBpbnQga2luZCkKK3sKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpIHsKKwkJc3dpdGNoIChraW5kKSB7CisJCWNhc2UgUkVTRVRfS0lORF9JTklUOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NUQVJUKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TSFVURE9XTjoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9VTkxPQUQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFVF9LSU5EX1NVU1BFTkQ6CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfU1VTUEVORCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZzNfc3RvcF9mdyhzdHJ1Y3QgdGczICopOworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfY2hpcF9yZXNldChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsOworCXUzMiBmbGFnc19zYXZlOworCWludCBpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkpCisJCXRnM19udnJhbV9sb2NrKHRwKTsKKworCS8qCisJICogV2UgbXVzdCBhdm9pZCB0aGUgcmVhZGwoKSB0aGF0IG5vcm1hbGx5IHRha2VzIHBsYWNlLgorCSAqIEl0IGxvY2tzIG1hY2hpbmVzLCBjYXVzZXMgbWFjaGluZSBjaGVja3MsIGFuZCBvdGhlcgorCSAqIGZ1biB0aGluZ3MuICBTbywgdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgNTcwMQorCSAqIGhhcmR3YXJlIHdvcmthcm91bmQsIHdoaWxlIHdlIGRvIHRoZSByZXNldC4KKwkgKi8KKwlmbGFnc19zYXZlID0gdHAtPnRnM19mbGFnczsKKwl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR181NzAxX1JFR19XUklURV9CVUc7CisKKwkvKiBkbyB0aGUgcmVzZXQgKi8KKwl2YWwgPSBHUkNfTUlTQ19DRkdfQ09SRUNMS19SRVNFVDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSB7CisJCWlmICh0cjMyKDB4N2UyYykgPT0gMHg2MCkgeworCQkJdHczMigweDdlMmMsIDB4MjApOworCQl9CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMCkgeworCQkJdHczMihHUkNfTUlTQ19DRkcsICgxIDw8IDI5KSk7CisJCQl2YWwgfD0gKDEgPDwgMjkpOworCQl9CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCQl2YWwgfD0gR1JDX01JU0NfQ0ZHX0tFRVBfR1BIWV9QT1dFUjsKKwl0dzMyKEdSQ19NSVNDX0NGRywgdmFsKTsKKworCS8qIHJlc3RvcmUgNTcwMSBoYXJkd2FyZSBidWcgd29ya2Fyb3VuZCBmbGFnICovCisJdHAtPnRnM19mbGFncyA9IGZsYWdzX3NhdmU7CisKKwkvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIGRlbGF5IGJlZm9yZSB0aGUgUENJIHJlYWQgYmFjay4KKwkgKiBTb21lIDU3NVggY2hpcHMgZXZlbiB3aWxsIG5vdCByZXNwb25kIHRvIGEgUENJIGNmZyBhY2Nlc3MKKwkgKiB3aGVuIHRoZSByZXNldCBjb21tYW5kIGlzIGdpdmVuIHRvIHRoZSBjaGlwLgorCSAqCisJICogSG93IGRvIHRoZXNlIGhhcmR3YXJlIGRlc2lnbmVycyBleHBlY3QgdGhpbmdzIHRvIHdvcmsKKwkgKiBwcm9wZXJseSBpZiB0aGUgUENJIHdyaXRlIGlzIHBvc3RlZCBmb3IgYSBsb25nIHBlcmlvZAorCSAqIG9mIHRpbWU/ICBJdCBpcyBhbHdheXMgbmVjZXNzYXJ5IHRvIGhhdmUgc29tZSBtZXRob2QgYnkKKwkgKiB3aGljaCBhIHJlZ2lzdGVyIHJlYWQgYmFjayBjYW4gb2NjdXIgdG8gcHVzaCB0aGUgd3JpdGUKKwkgKiBvdXQgd2hpY2ggZG9lcyB0aGUgcmVzZXQuCisJICoKKwkgKiBGb3IgbW9zdCB0ZzMgdmFyaWFudHMgdGhlIHRyaWNrIGJlbG93IHdhcyB3b3JraW5nLgorCSAqIEhvIGh1bS4uLgorCSAqLworCXVkZWxheSgxMjApOworCisJLyogRmx1c2ggUENJIHBvc3RlZCB3cml0ZXMuICBUaGUgbm9ybWFsIE1NSU8gcmVnaXN0ZXJzCisJICogYXJlIGluYWNjZXNzaWJsZSBhdCB0aGlzIHRpbWUgc28gdGhpcyBpcyB0aGUgb25seQorCSAqIHdheSB0byBtYWtlIHRoaXMgcmVsaWFibHkgKGFjdHVhbGx5LCB0aGlzIGlzIG5vIGxvbmdlcgorCSAqIHRoZSBjYXNlLCBzZWUgYWJvdmUpLiAgSSB0cmllZCB0byB1c2UgaW5kaXJlY3QKKwkgKiByZWdpc3RlciByZWFkL3dyaXRlIGJ1dCB0aGlzIHVwc2V0IHNvbWUgNTcwMSB2YXJpYW50cy4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCAmdmFsKTsKKworCXVkZWxheSgxMjApOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CisJCQlpbnQgaTsKKwkJCXUzMiBjZmdfdmFsOworCisJCQkvKiBXYWl0IGZvciBsaW5rIHRyYWluaW5nIHRvIGNvbXBsZXRlLiAgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisJCQkJdWRlbGF5KDEwMCk7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgMHhjNCwgJmNmZ192YWwpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgMHhjNCwKKwkJCQkJICAgICAgIGNmZ192YWwgfCAoMSA8PCAxNSkpOworCQl9CisJCS8qIFNldCBQQ0lFIG1heCBwYXlsb2FkIHNpemUgYW5kIGNsZWFyIGVycm9yIHN0YXR1cy4gICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIDB4ZDgsIDB4ZjUwMDApOworCX0KKworCS8qIFJlLWVuYWJsZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3Nlcy4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCS8qIFNldCBNQVggUENJIHJldHJ5IHRvIHplcm8uICovCisJdmFsID0gKFBDSVNUQVRFX1JPTV9FTkFCTEUgfCBQQ0lTVEFURV9ST01fUkVUUllfRU5BQkxFKTsKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpKQorCQl2YWwgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLCB2YWwpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUodHAtPnBkZXYpOworCisJLyogTWFrZSBzdXJlIFBDSS1YIHJlbGF4ZWQgb3JkZXJpbmcgYml0IGlzIGNsZWFyLiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1hfQ0FQUywgJnZhbCk7CisJdmFsICY9IH5QQ0lYX0NBUFNfUkVMQVhFRF9PUkRFUklORzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfWF9DQVBTLCB2YWwpOworCisJdHczMihNRU1BUkJfTU9ERSwgTUVNQVJCX01PREVfRU5BQkxFKTsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc1MF9BMykgeworCQl0ZzNfc3RvcF9mdyh0cCk7CisJCXR3MzIoMHg1MDAwLCAweDQwMCk7CisJfQorCisJdHczMihHUkNfTU9ERSwgdHAtPmdyY19tb2RlKTsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMCkgeworCQl1MzIgdmFsID0gdHIzMigweGM0KTsKKworCQl0dzMyKDB4YzQsIHZhbCB8ICgxIDw8IDE1KSk7CisJfQorCisJaWYgKCh0cC0+bmljX3NyYW1fZGF0YV9jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19NSU5JX1BDSSkgIT0gMCAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQl0cC0+cGNpX2Nsb2NrX2N0cmwgfD0gQ0xPQ0tfQ1RSTF9DTEtSVU5fT0VOQUJMRTsKKwkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0EwKQorCQkJdHAtPnBjaV9jbG9ja19jdHJsIHw9IENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOOworCQl0dzMyKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwpOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJdHAtPm1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCX0gZWxzZQorCQl0dzMyX2YoTUFDX01PREUsIDApOworCXVkZWxheSg0MCk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSkgeworCQkvKiBXYWl0IGZvciBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZS4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisJCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gsICZ2YWwpOworCQkJaWYgKHZhbCA9PSB+TklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmIChpID49IDEwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX3Jlc2V0X2h3IHRpbWVkIG91dCBmb3IgJXMsICIKKwkJCSAgICAgICAiZmlybXdhcmUgd2lsbCBub3QgcmVzdGFydCBtYWdpYz0lMDh4XG4iLAorCQkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHZhbCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgJiYKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTApIHsKKwkJdTMyIHZhbCA9IHRyMzIoMHg3YzAwKTsKKworCQl0dzMyKDB4N2MwMCwgdmFsIHwgKDEgPDwgMjUpKTsKKwl9CisKKwkvKiBSZXByb2JlIEFTRiBlbmFibGUgc3RhdGUuICAqLworCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0VOQUJMRV9BU0Y7CisJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9TSUcsICZ2YWwpOworCWlmICh2YWwgPT0gTklDX1NSQU1fREFUQV9TSUdfTUFHSUMpIHsKKwkJdTMyIG5pY19jZmc7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX0NGRywgJm5pY19jZmcpOworCQlpZiAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0FTRl9FTkFCTEUpIHsKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRU5BQkxFX0FTRjsKKwkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkKKwkJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX3N0b3BfZncoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCXUzMiB2YWw7CisJCWludCBpOworCisJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0NNRF9NQk9YLCBGV0NNRF9OSUNEUlZfUEFVU0VfRlcpOworCQl2YWwgPSB0cjMyKEdSQ19SWF9DUFVfRVZFTlQpOworCQl2YWwgfD0gKDEgPDwgMTQpOworCQl0dzMyKEdSQ19SWF9DUFVfRVZFTlQsIHZhbCk7CisKKwkJLyogV2FpdCBmb3IgUlggY3B1IHRvIEFDSyB0aGUgZXZlbnQuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCWlmICghKHRyMzIoR1JDX1JYX0NQVV9FVkVOVCkgJiAoMSA8PCAxNCkpKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CisJfQorfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfaGFsdChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgZXJyOworCisJdGczX3N0b3BfZncodHApOworCisJdGczX3dyaXRlX3NpZ19wcmVfcmVzZXQodHAsIFJFU0VUX0tJTkRfU0hVVERPV04pOworCisJdGczX2Fib3J0X2h3KHRwKTsKKwllcnIgPSB0ZzNfY2hpcF9yZXNldCh0cCk7CisKKwl0ZzNfd3JpdGVfc2lnX2xlZ2FjeSh0cCwgUkVTRVRfS0lORF9TSFVURE9XTik7CisJdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBURzNfRldfUkVMRUFTRV9NQUpPUgkweDAKKyNkZWZpbmUgVEczX0ZXX1JFTEFTRV9NSU5PUgkweDAKKyNkZWZpbmUgVEczX0ZXX1JFTEVBU0VfRklYCTB4MAorI2RlZmluZSBURzNfRldfU1RBUlRfQUREUgkweDA4MDAwMDAwCisjZGVmaW5lIFRHM19GV19URVhUX0FERFIJMHgwODAwMDAwMAorI2RlZmluZSBURzNfRldfVEVYVF9MRU4JCTB4OWMwCisjZGVmaW5lIFRHM19GV19ST0RBVEFfQUREUgkweDA4MDAwOWMwCisjZGVmaW5lIFRHM19GV19ST0RBVEFfTEVOCTB4NjAKKyNkZWZpbmUgVEczX0ZXX0RBVEFfQUREUgkweDA4MDAwYTQwCisjZGVmaW5lIFRHM19GV19EQVRBX0xFTgkJMHgyMAorI2RlZmluZSBURzNfRldfU0JTU19BRERSCTB4MDgwMDBhNjAKKyNkZWZpbmUgVEczX0ZXX1NCU1NfTEVOCQkweGMKKyNkZWZpbmUgVEczX0ZXX0JTU19BRERSCQkweDA4MDAwYTcwCisjZGVmaW5lIFRHM19GV19CU1NfTEVOCQkweDEwCisKK3N0YXRpYyB1MzIgdGczRndUZXh0WyhURzNfRldfVEVYVF9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKKwkweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDNjMWQwODAwLAorCTB4MzdiZDNmZmMsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsIDB4MjYxMDAwMDAsIDB4MGUwMDAwMTgsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwgMHgzN2JkM2ZmYywgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwgMHgyNjEwMDAzNCwKKwkweDBlMDAwMjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MjdiZGZmZTAsIDB4M2MxY2MwMDAsIDB4YWZiZjAwMTgsIDB4YWY4MDY4MGMsIDB4MGUwMDAwNGMsIDB4MjQxYjIxMDUsCisJMHg5Nzg1MDAwMCwgMHg5Nzg3MDAwMiwgMHg5NzgyMDAyYywgMHg5NzgzMDAyZSwgMHgzYzA0MDgwMCwgMHgyNDg0MDljMCwKKwkweGFmYTAwMDE0LCAweDAwMDIxNDAwLCAweDAwNjIxODI1LCAweDAwMDUyYzAwLCAweGFmYTMwMDEwLCAweDhmODYwMDEwLAorCTB4MDBlNTI4MjUsIDB4MGUwMDAwNjAsIDB4MjQwNzAxMDIsIDB4M2MwMmFjMDAsIDB4MzQ0MjAxMDAsIDB4M2MwM2FjMDEsCisJMHgzNDYzMDEwMCwgMHhhZjgyMDQ5MCwgMHgzYzAyZmZmZiwgMHhhZjgyMDQ5NCwgMHhhZjgzMDQ5OCwgMHhhZjgyMDQ5YywKKwkweDI0MDIwMDAxLCAweGFmODI1Y2UwLCAweDBlMDAwMDNmLCAweGFmODI1ZDAwLCAweDBlMDAwMTQwLCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjQwMmZmZmYsIDB4YWY4MjU0MDQsIDB4OGY4MzU0MDAsCisJMHgzNDYzMDQwMCwgMHhhZjgzNTQwMCwgMHhhZjgyNTQwNCwgMHgzYzAyMDgwMCwgMHgyNDQyMDAzNCwgMHhhZjgyNTQxYywKKwkweDAzZTAwMDA4LCAweGFmODA1NDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDM0NDIzMDAwLAorCTB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsIDB4M2MwNDA4MDAsIDB4MzQ4NDM3ZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNjQsCisJMHgyNDAyMDA0MCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE2OCwgMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwgMHhhYzYwMDAwMCwKKwkweDI0NjMwMDA0LCAweDAwODMxMDJiLCAweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAorCTB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNjAsIDB4M2MwNDA4MDAsIDB4OGM4NDBhNjgsCisJMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwgMHgwMDQ0MTAyYiwgMHgzYzAxMDgwMCwgMHhhYzIzMGE2MCwgMHgxNDQwMDAwMywKKwkweDAwMDA0MDIxLCAweDNjMDEwODAwLCAweGFjMjAwYTYwLCAweDNjMDIwODAwLCAweDhjNDIwYTYwLCAweDNjMDMwODAwLAorCTB4OGM2MzBhNjQsIDB4OTEyNDAwMDAsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsCisJMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwgMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwKKwkweDNjMDMwODAwLCAweDhjNjMwYTY0LCAweDhmODQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LAorCTB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsIDB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsCisJMHgwMjAwMDAwOCwgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwMSwgMHgwYTAwMDFlMywgMHgzYzBhMDAwMiwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDNjMGEwMDA3LCAweDBhMDAwMWUzLCAweDNjMGEwMDA4LCAweDBhMDAwMWUzLCAweDNjMGEwMDA5LAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMGIsCisJMHgwYTAwMDFlMywgMHgzYzBhMDAwYywgMHgwYTAwMDFlMywgMHgzYzBhMDAwZCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDBlLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDEzLCAweDBhMDAwMWUzLCAweDNjMGEwMDE0LAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTB4MjdiZGZmZTAsIDB4MDAwMDE4MjEsIDB4MDAwMDEwMjEsIDB4YWZiZjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsCisJMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3MCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3NCwKKwkweDNjMDEwODAwLCAweDAwMjIwODIxLCAweGFjMjAwYTc4LCAweDI0NjMwMDAxLCAweDE4NjBmZmY1LCAweDI0NDIwMDBjLAorCTB4MjQxMTAwMDEsIDB4OGY5MDY4MTAsIDB4MzIwMjAwMDQsIDB4MTQ0MDAwMDUsIDB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsCisJMHg4YzQyMGE3OCwgMHgxODQwMDAwMywgMHgwMDAwMjAyMSwgMHgwZTAwMDE4MiwgMHgwMDAwMDAwMCwgMHgzMjAyMDAwMSwKKwkweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMTY5LCAweDAwMDAwMDAwLCAweDBhMDAwMTUzLCAweGFmOTE1MDI4LAorCTB4OGZiZjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2MwNTA4MDAsCisJMHg4Y2E1MGE3MCwgMHgzYzA2MDgwMCwgMHg4Y2M2MGE4MCwgMHgzYzA3MDgwMCwgMHg4Y2U3MGE3OCwgMHgyN2JkZmZlMCwKKwkweDNjMDQwODAwLCAweDI0ODQwOWQwLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LAorCTB4MGUwMDAxN2IsIDB4MDAwMDIwMjEsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjQwMjAwMDEsCisJMHg4ZjgzNjgxMCwgMHgwMDgyMTAwNCwgMHgwMDAyMTAyNywgMHgwMDYyMTgyNCwgMHgwM2UwMDAwOCwgMHhhZjgzNjgxMCwKKwkweDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAweDEwODAwMDJlLCAweGFmYjAwMDIwLCAweDhmODI1Y2VjLCAweGFmYTIwMDE4LAorCTB4OGY4MjVjZWMsIDB4M2MxMDA4MDAsIDB4MjYxMDBhNzgsIDB4YWZhMjAwMWMsIDB4MzQwMjgwMDAsIDB4YWY4MjVjZWMsCisJMHg4ZTAyMDAwMCwgMHgxODQwMDAxNiwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg5NDQyMGE3NCwgMHg4ZmEzMDAxYywKKwkweDAwMDIyMWMwLCAweGFjODMwMDA0LCAweDhmYTIwMDFjLCAweDNjMDEwODAwLCAweDBlMDAwMjAxLCAweGFjMjIwYTc0LAorCTB4MTA0MDAwMDUsIDB4MDAwMDAwMDAsIDB4OGUwMjAwMDAsIDB4MjQ0MjAwMDEsIDB4MGEwMDAxZGYsIDB4YWUwMjAwMDAsCisJMHgzYzAyMDgwMCwgMHg4YzQyMGE3MCwgMHgwMDAyMWMwMiwgMHgwMDAzMjFjMCwgMHgwYTAwMDFjNSwgMHhhZmEyMDAxYywKKwkweDBlMDAwMjAxLCAweDAwMDAwMDAwLCAweDEwNDAwMDFmLCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDhmYTMwMDFjLAorCTB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNzAsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNzQsIDB4MGEwMDAxZGYsCisJMHhhZTAyMDAwMCwgMHgzYzEwMDgwMCwgMHgyNjEwMGE3OCwgMHg4ZTAyMDAwMCwgMHgxODQwMDAyOCwgMHgwMDAwMDAwMCwKKwkweDBlMDAwMjAxLCAweDAwMDAwMDAwLCAweDE0NDAwMDI0LCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDNjMDMwODAwLAorCTB4OGM2MzBhNzAsIDB4MjQ0MmZmZmYsIDB4YWZhMzAwMWMsIDB4MTg0MDAwMDYsIDB4YWUwMjAwMDAsIDB4MDAwMzE0MDIsCisJMHgwMDAyMjFjMCwgMHg4YzgyMDAwNCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE3MCwgMHg5N2EyMDAxZSwgMHgyNDQyZmYwMCwKKwkweDJjNDIwMzAwLCAweDE0NDAwMDBiLCAweDI0MDI0MDAwLCAweDNjMDQwODAwLCAweDI0ODQwOWRjLCAweGFmYTAwMDEwLAorCTB4YWZhMDAwMTQsIDB4OGZhNjAwMWMsIDB4MjQwNTAwMDgsIDB4MGUwMDAwNjAsIDB4MDAwMDM4MjEsIDB4MGEwMDAxZGYsCisJMHgwMDAwMDAwMCwgMHhhZjgyNWNmOCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE0MCwgMHg4ZmEzMDAxYywgMHgyNDQyMDAwMSwKKwkweGFmODM1Y2Y4LCAweDNjMDEwODAwLCAweGFjMjIwYTQwLCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDA5ZTgsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHg4ZmJmMDAxOCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDhmODI2ODBjLCAweDhmODU2ODBjLCAweDAwMDIxODI3LCAweDAwMDMxODJiLAorCTB4MDAwMzE4MjMsIDB4MDA0MzEwMjQsIDB4MDA0NDEwMjEsIDB4MDBhMjI4MmIsIDB4MTBhMDAwMDYsIDB4MDAwMDAwMDAsCisJMHgwMDQwMTgyMSwgMHg4ZjgyNjgwYywgMHgwMDQzMTAyYiwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwKKwkweDAwMDAwMDAwLCAweDNjMDQwODAwLCAweDhjODQwMDAwLCAweDNjMDMwODAwLCAweDhjNjMwYTQwLCAweDAwNjQxMDJiLAorCTB4NTQ0MDAwMDIsIDB4MDA4MzEwMjMsIDB4MDA2NDEwMjMsIDB4MmM0MjAwMDgsIDB4MDNlMDAwMDgsIDB4Mzg0MjAwMDEsCisJMHgyN2JkZmZlMCwgMHgwMDgwMjgyMSwgMHgzYzA0MDgwMCwgMHgyNDg0MGEwMCwgMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwKKwkweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LCAweDBhMDAwMjE2LCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4M2MxY2MwMDAsCisJMHhhZmJmMDAxOCwgMHgwZTAwMDA0YywgMHhhZjgwNjgwYywgMHgzYzA0MDgwMCwgMHgyNDg0MGExMCwgMHgwMzgwMjgyMSwKKwkweDAwMDAzMDIxLCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LCAweDI0MDJmZmZmLAorCTB4YWY4MjU0MDQsIDB4M2MwMjAwYWEsIDB4MGUwMDAyMzQsIDB4YWY4MjU0MzQsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlOCwgMHhhZmIwMDAxMCwKKwkweDI0MTAwMDAxLCAweGFmYmYwMDE0LCAweDNjMDFjMDAzLCAweGFjMjAwMDAwLCAweDhmODI2ODEwLCAweDMwNDIyMDAwLAorCTB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAyNDYsIDB4MDAwMDAwMDAsIDB4MGEwMDAyM2EsIDB4YWY5MDU0MjgsCisJMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgyN2JkZmZmOCwgMHg4Zjg0NWQwYywKKwkweDNjMDIwMGZmLCAweDNjMDMwODAwLCAweDhjNjMwYTUwLCAweDM0NDJmZmY4LCAweDAwODIxMDI0LCAweDEwNDMwMDFlLAorCTB4M2MwNTAwZmYsIDB4MzRhNWZmZjgsIDB4M2MwNmMwMDMsIDB4M2MwNzQwMDAsIDB4MDA4NTE4MjQsIDB4OGM2MjAwMTAsCisJMHgzYzAxMDgwMCwgMHhhYzIzMGE1MCwgMHgzMDQyMDAwOCwgMHgxMDQwMDAwNSwgMHgwMDg3MTAyNSwgMHg4Y2MyMDAwMCwKKwkweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDAwODcxMDI1LCAweGFmODI1ZDBjLCAweDhmYTIwMDAwLCAweDI0NDIwMDAxLAorCTB4YWZhMjAwMDAsIDB4OGZhMjAwMDAsIDB4OGZhMjAwMDAsIDB4MjQ0MjAwMDEsIDB4YWZhMjAwMDAsIDB4OGZhMjAwMDAsCisJMHg4Zjg0NWQwYywgMHgzYzAzMDgwMCwgMHg4YzYzMGE1MCwgMHgwMDg1MTAyNCwgMHgxNDQzZmZlOCwgMHgwMDg1MTgyNCwKKwkweDI3YmQwMDA4LCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCit9OworCitzdGF0aWMgdTMyIHRnM0Z3Um9kYXRhWyhURzNfRldfUk9EQVRBX0xFTiAvIHNpemVvZih1MzIpKSArIDFdID0geworCTB4MzUzNzMwMzEsIDB4NzI2YzczNDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTM3NzQ1NzYsIDB4NjU2ZTc0MzAsCisJMHgwMDAwMDAwMCwgMHg3MjZjNzA0NSwgMHg3NjY1NmU3NCwgMHgzMTAwMDAwMCwgMHg1NTZlNmI2ZSwgMHg0NTc2NmU3NCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NGQ2MTY5NmUsIDB4NDM3MDc1NDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMAorfTsKKworI2lmIDAgLyogQWxsIHplcm9zLCBkb24ndCBlYXQgdXAgc3BhY2Ugd2l0aCBpdC4gKi8KK3UzMiB0ZzNGd0RhdGFbKFRHM19GV19EQVRBX0xFTiAvIHNpemVvZih1MzIpKSArIDFdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMAorfTsKKyNlbmRpZgorCisjZGVmaW5lIFJYX0NQVV9TQ1JBVENIX0JBU0UJMHgzMDAwMAorI2RlZmluZSBSWF9DUFVfU0NSQVRDSF9TSVpFCTB4MDQwMDAKKyNkZWZpbmUgVFhfQ1BVX1NDUkFUQ0hfQkFTRQkweDM0MDAwCisjZGVmaW5lIFRYX0NQVV9TQ1JBVENIX1NJWkUJMHgwNDAwMAorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfaGFsdF9jcHUoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQpCit7CisJaW50IGk7CisKKwlpZiAob2Zmc2V0ID09IFRYX0NQVV9CQVNFICYmCisJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCUJVRygpOworCisJaWYgKG9mZnNldCA9PSBSWF9DUFVfQkFTRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQkJdHczMihvZmZzZXQgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCQkJdHczMihvZmZzZXQgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQkJaWYgKHRyMzIob2Zmc2V0ICsgQ1BVX01PREUpICYgQ1BVX01PREVfSEFMVCkKKwkJCQlicmVhazsKKwkJfQorCisJCXR3MzIob2Zmc2V0ICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJdHczMl9mKG9mZnNldCArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7CisJCXVkZWxheSgxMCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX01PREUsICBDUFVfTU9ERV9IQUxUKTsKKwkJCWlmICh0cjMyKG9mZnNldCArIENQVV9NT0RFKSAmIENQVV9NT0RFX0hBTFQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA+PSAxMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfcmVzZXRfY3B1IHRpbWVkIG91dCBmb3IgJXMsICIKKwkJICAgICAgICJhbmQgJXMgQ1BVXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwKKwkJICAgICAgIChvZmZzZXQgPT0gUlhfQ1BVX0JBU0UgPyAiUlgiIDogIlRYIikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmd19pbmZvIHsKKwl1bnNpZ25lZCBpbnQgdGV4dF9iYXNlOworCXVuc2lnbmVkIGludCB0ZXh0X2xlbjsKKwl1MzIgKnRleHRfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcm9kYXRhX2Jhc2U7CisJdW5zaWduZWQgaW50IHJvZGF0YV9sZW47CisJdTMyICpyb2RhdGFfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9iYXNlOworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKKwl1MzIgKmRhdGFfZGF0YTsKK307CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19sb2FkX2Zpcm13YXJlX2NwdShzdHJ1Y3QgdGczICp0cCwgdTMyIGNwdV9iYXNlLCB1MzIgY3B1X3NjcmF0Y2hfYmFzZSwKKwkJCQkgaW50IGNwdV9zY3JhdGNoX3NpemUsIHN0cnVjdCBmd19pbmZvICppbmZvKQoreworCWludCBlcnIsIGk7CisJdTMyIG9yaWdfdGczX2ZsYWdzID0gdHAtPnRnM19mbGFnczsKKwl2b2lkICgqd3JpdGVfb3ApKHN0cnVjdCB0ZzMgKiwgdTMyLCB1MzIpOworCisJaWYgKGNwdV9iYXNlID09IFRYX0NQVV9CQVNFICYmCisJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX2xvYWRfZmlybXdhcmVfY3B1OiBUcnlpbmcgdG8gbG9hZCAiCisJCSAgICAgICAiVFggY3B1IGZpcm13YXJlIG9uICVzIHdoaWNoIGlzIDU3MDUuXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykKKwkJd3JpdGVfb3AgPSB0ZzNfd3JpdGVfbWVtOworCWVsc2UKKwkJd3JpdGVfb3AgPSB0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzI7CisKKwkvKiBGb3JjZSB1c2Ugb2YgUENJIGNvbmZpZyBzcGFjZSBmb3IgaW5kaXJlY3QgcmVnaXN0ZXIKKwkgKiB3cml0ZSBjYWxscy4KKwkgKi8KKwl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHOworCisJZXJyID0gdGczX2hhbHRfY3B1KHRwLCBjcHVfYmFzZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1X3NjcmF0Y2hfc2l6ZTsgaSArPSBzaXplb2YodTMyKSkKKwkJd3JpdGVfb3AodHAsIGNwdV9zY3JhdGNoX2Jhc2UgKyBpLCAwKTsKKwl0dzMyKGNwdV9iYXNlICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwl0dzMyKGNwdV9iYXNlICsgQ1BVX01PREUsIHRyMzIoY3B1X2Jhc2UrQ1BVX01PREUpfENQVV9NT0RFX0hBTFQpOworCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+dGV4dF9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwkJd3JpdGVfb3AodHAsIChjcHVfc2NyYXRjaF9iYXNlICsKKwkJCSAgICAgIChpbmZvLT50ZXh0X2Jhc2UgJiAweGZmZmYpICsKKwkJCSAgICAgIChpICogc2l6ZW9mKHUzMikpKSwKKwkJCSAoaW5mby0+dGV4dF9kYXRhID8KKwkJCSAgaW5mby0+dGV4dF9kYXRhW2ldIDogMCkpOworCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+cm9kYXRhX2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQorCQl3cml0ZV9vcCh0cCwgKGNwdV9zY3JhdGNoX2Jhc2UgKworCQkJICAgICAgKGluZm8tPnJvZGF0YV9iYXNlICYgMHhmZmZmKSArCisJCQkgICAgICAoaSAqIHNpemVvZih1MzIpKSksCisJCQkgKGluZm8tPnJvZGF0YV9kYXRhID8KKwkJCSAgaW5mby0+cm9kYXRhX2RhdGFbaV0gOiAwKSk7CisJZm9yIChpID0gMDsgaSA8IChpbmZvLT5kYXRhX2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQorCQl3cml0ZV9vcCh0cCwgKGNwdV9zY3JhdGNoX2Jhc2UgKworCQkJICAgICAgKGluZm8tPmRhdGFfYmFzZSAmIDB4ZmZmZikgKworCQkJICAgICAgKGkgKiBzaXplb2YodTMyKSkpLAorCQkJIChpbmZvLT5kYXRhX2RhdGEgPworCQkJICBpbmZvLT5kYXRhX2RhdGFbaV0gOiAwKSk7CisKKwllcnIgPSAwOworCitvdXQ6CisJdHAtPnRnM19mbGFncyA9IG9yaWdfdGczX2ZsYWdzOworCXJldHVybiBlcnI7Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19sb2FkXzU3MDFfYTBfZmlybXdhcmVfZml4KHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBmd19pbmZvIGluZm87CisJaW50IGVyciwgaTsKKworCWluZm8udGV4dF9iYXNlID0gVEczX0ZXX1RFWFRfQUREUjsKKwlpbmZvLnRleHRfbGVuID0gVEczX0ZXX1RFWFRfTEVOOworCWluZm8udGV4dF9kYXRhID0gJnRnM0Z3VGV4dFswXTsKKwlpbmZvLnJvZGF0YV9iYXNlID0gVEczX0ZXX1JPREFUQV9BRERSOworCWluZm8ucm9kYXRhX2xlbiA9IFRHM19GV19ST0RBVEFfTEVOOworCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczRndSb2RhdGFbMF07CisJaW5mby5kYXRhX2Jhc2UgPSBURzNfRldfREFUQV9BRERSOworCWluZm8uZGF0YV9sZW4gPSBURzNfRldfREFUQV9MRU47CisJaW5mby5kYXRhX2RhdGEgPSBOVUxMOworCisJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBSWF9DUFVfQkFTRSwKKwkJCQkgICAgUlhfQ1BVX1NDUkFUQ0hfQkFTRSwgUlhfQ1BVX1NDUkFUQ0hfU0laRSwKKwkJCQkgICAgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB0ZzNfbG9hZF9maXJtd2FyZV9jcHUodHAsIFRYX0NQVV9CQVNFLAorCQkJCSAgICBUWF9DUFVfU0NSQVRDSF9CQVNFLCBUWF9DUFVfU0NSQVRDSF9TSVpFLAorCQkJCSAgICAmaW5mbyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIE5vdyBzdGFydHVwIG9ubHkgdGhlIFJYIGNwdS4gKi8KKwl0dzMyKFJYX0NQVV9CQVNFICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsICAgIFRHM19GV19URVhUX0FERFIpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAodHIzMihSWF9DUFVfQkFTRSArIENQVV9QQykgPT0gVEczX0ZXX1RFWFRfQUREUikKKwkJCWJyZWFrOworCQl0dzMyKFJYX0NQVV9CQVNFICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJdHczMihSWF9DUFVfQkFTRSArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7CisJCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9QQywgICAgVEczX0ZXX1RFWFRfQUREUik7CisJCXVkZWxheSgxMDAwKTsKKwl9CisJaWYgKGkgPj0gNSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfbG9hZF9maXJtd2FyZSBmYWlscyBmb3IgJXMgIgorCQkgICAgICAgInRvIHNldCBSWCBDUFUgUEMsIGlzICUwOHggc2hvdWxkIGJlICUwOHhcbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKFJYX0NQVV9CQVNFICsgQ1BVX1BDKSwKKwkJICAgICAgIFRHM19GV19URVhUX0FERFIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMl9mKFJYX0NQVV9CQVNFICsgQ1BVX01PREUsICAweDAwMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKworI2RlZmluZSBURzNfVFNPX0ZXX1JFTEVBU0VfTUFKT1IJMHgxCisjZGVmaW5lIFRHM19UU09fRldfUkVMQVNFX01JTk9SCQkweDYKKyNkZWZpbmUgVEczX1RTT19GV19SRUxFQVNFX0ZJWAkJMHgwCisjZGVmaW5lIFRHM19UU09fRldfU1RBUlRfQUREUgkJMHgwODAwMDAwMAorI2RlZmluZSBURzNfVFNPX0ZXX1RFWFRfQUREUgkJMHgwODAwMDAwMAorI2RlZmluZSBURzNfVFNPX0ZXX1RFWFRfTEVOCQkweDFhYTAKKyNkZWZpbmUgVEczX1RTT19GV19ST0RBVEFfQUREUgkJMHgwODAwMWFhMAorI2RlZmluZSBURzNfVFNPX0ZXX1JPREFUQV9MRU4JCTB4NjAKKyNkZWZpbmUgVEczX1RTT19GV19EQVRBX0FERFIJCTB4MDgwMDFiMjAKKyNkZWZpbmUgVEczX1RTT19GV19EQVRBX0xFTgkJMHgzMAorI2RlZmluZSBURzNfVFNPX0ZXX1NCU1NfQUREUgkJMHgwODAwMWI1MAorI2RlZmluZSBURzNfVFNPX0ZXX1NCU1NfTEVOCQkweDJjCisjZGVmaW5lIFRHM19UU09fRldfQlNTX0FERFIJCTB4MDgwMDFiODAKKyNkZWZpbmUgVEczX1RTT19GV19CU1NfTEVOCQkweDg5NAorCitzdGF0aWMgdTMyIHRnM1Rzb0Z3VGV4dFsoVEczX1RTT19GV19URVhUX0xFTiAvIDQpICsgMV0gPSB7CisJMHgwZTAwMDAwMywgMHgwMDAwMDAwMCwgMHgwODAwMWIyNCwgMHgwMDAwMDAwMCwgMHgxMDAwMDAwMywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDNjMWQwODAwLCAweDM3YmQ0MDAwLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLAorCTB4MjYxMDAwMDAsIDB4MGUwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MjdiZGZmZTAsIDB4M2MwNGZlZmUsCisJMHhhZmJmMDAxOCwgMHgwZTAwMDVkOCwgMHgzNDg0MDAwMiwgMHgwZTAwMDY2OCwgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwKKwkweDkwNjMxYjY4LCAweDI0MDIwMDAyLCAweDNjMDQwODAwLCAweDI0ODQxYWFjLCAweDE0NjIwMDAzLCAweDI0MDUwMDAxLAorCTB4M2MwNDA4MDAsIDB4MjQ4NDFhYTAsIDB4MjQwNjAwMDYsIDB4MDAwMDM4MjEsIDB4YWZhMDAwMTAsIDB4MGUwMDA2N2MsCisJMHhhZmEwMDAxNCwgMHg4ZjYyNWM1MCwgMHgzNDQyMDAwMSwgMHhhZjYyNWM1MCwgMHg4ZjYyNWM5MCwgMHgzNDQyMDAwMSwKKwkweGFmNjI1YzkwLCAweDI0MDJmZmZmLCAweDBlMDAwMDM0LCAweGFmNjI1NDA0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsCisJMHhhZmIyMDAxOCwgMHhhZmIxMDAxNCwgMHgwZTAwMDA1YiwgMHhhZmIwMDAxMCwgMHgyNDEyMDAwMiwgMHgyNDExMDAwMSwKKwkweDhmNzA2ODIwLCAweDMyMDIwMTAwLCAweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMGJiLCAweDAwMDAwMDAwLAorCTB4OGY3MDY4MjAsIDB4MzIwMjIwMDAsIDB4MTA0MDAwMDQsIDB4MzIwMjAwMDEsIDB4MGUwMDAxZjAsIDB4MjQwNDAwMDEsCisJMHgzMjAyMDAwMSwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDBhMywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDkwNDIxYjk4LCAweDE0NTIwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLCAweDBhMDAwMDNjLAorCTB4YWY3MTUwMjgsIDB4OGZiZjAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgMHgzYzA0MDgwMCwgMHgyNDg0MWFjMCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwKKwkweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LCAweDNjMDQwODAwLAorCTB4MjQ4NDIzZDgsIDB4YTQ4MDAwMDAsIDB4M2MwMTA4MDAsIDB4YTAyMDFiOTgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiOWMsCisJMHgzYzAxMDgwMCwgMHhhYzIwMWJhMCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJhNCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJhYywKKwkweDNjMDEwODAwLCAweGFjMjAxYmI4LCAweDNjMDEwODAwLCAweGFjMjAxYmJjLCAweDhmNjI0NDM0LCAweDNjMDEwODAwLAorCTB4YWMyMjFiODgsIDB4OGY2MjQ0MzgsIDB4M2MwMTA4MDAsIDB4YWMyMjFiOGMsIDB4OGY2MjQ0MTAsIDB4YWM4MGY3YTgsCisJMHgzYzAxMDgwMCwgMHhhYzIwMWI4NCwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlMCwgMHgzYzAxMDgwMCwgMHhhYzIwMjNjOCwKKwkweDNjMDEwODAwLCAweGFjMjAyM2NjLCAweDNjMDEwODAwLCAweGFjMjAyNDAwLCAweDNjMDEwODAwLCAweGFjMjIxYjkwLAorCTB4OGY2MjAwNjgsIDB4MjQwMzAwMDcsIDB4MDAwMjE3MDIsIDB4MTA0MzAwMDUsIDB4MDAwMDAwMDAsIDB4OGY2MjAwNjgsCisJMHgwMDAyMTcwMiwgMHgxNDQwMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDgwMCwgMHgwYTAwMDA5NywgMHhhYzIwMjQwYywKKwkweGFjODIwMDM0LCAweDNjMDQwODAwLCAweDI0ODQxYWNjLCAweDNjMDUwODAwLCAweDhjYTUyNDBjLCAweDAwMDAzMDIxLAorCTB4MDAwMDM4MjEsIDB4YWZhMDAwMTAsIDB4MGUwMDA2N2MsIDB4YWZhMDAwMTQsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgMHgzYzA0MDgwMCwgMHgyNDg0MWFkOCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwKKwkweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LCAweDBlMDAwMDViLAorCTB4MDAwMDAwMDAsIDB4MGUwMDAwYjQsIDB4MDAwMDIwMjEsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgyNDAyMDAwMSwgMHg4ZjYzNjgyMCwgMHgwMDgyMTAwNCwgMHgwMDAyMTAyNywgMHgwMDYyMTgyNCwgMHgwM2UwMDAwOCwKKwkweGFmNjM2ODIwLCAweDI3YmRmZmQwLCAweGFmYmYwMDJjLCAweGFmYjYwMDI4LCAweGFmYjUwMDI0LCAweGFmYjQwMDIwLAorCTB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsIDB4OGY2NzVjNWMsIDB4M2MwMzA4MDAsCisJMHgyNDYzMWJiYywgMHg4YzYyMDAwMCwgMHgxNDQ3MDAwNSwgMHgzYzAyMDBmZiwgMHgzYzAyMDgwMCwgMHg5MDQyMWI5OCwKKwkweDE0NDAwMTE5LCAweDNjMDIwMGZmLCAweDM0NDJmZmY4LCAweDAwZTI4ODI0LCAweGFjNjcwMDAwLCAweDAwMTExOTAyLAorCTB4MzA2MzAwZmYsIDB4MzBlMjAwMDMsIDB4MDAwMjExYzAsIDB4MDA2MjI4MjUsIDB4MDBhMDQwMjEsIDB4MDAwNzE2MDIsCisJMHgzYzAzMDgwMCwgMHg5MDYzMWI5OCwgMHgzMDQ0MDAwZiwgMHgxNDYwMDAzNiwgMHgwMDgwNDgyMSwgMHgyNDAyMDAwMSwKKwkweDNjMDEwODAwLCAweGEwMjIxYjk4LCAweDAwMDUxMTAwLCAweDAwODIxMDI1LCAweDNjMDEwODAwLCAweGFjMjAxYjljLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiYTAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYTQsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYWMsCisJMHgzYzAxMDgwMCwgMHhhYzIwMWJiOCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJiMCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJiNCwKKwkweDNjMDEwODAwLCAweGE0MjIyM2Q4LCAweDk2MjIwMDBjLCAweDMwNDM3ZmZmLCAweDNjMDEwODAwLCAweGE0MjIyNDEwLAorCTB4MzA0MjgwMDAsIDB4M2MwMTA4MDAsIDB4YTQyMzFiYzYsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsCisJMHhhYzIyMjNmNCwgMHgwYTAwMDEwMiwgMHgyNDA2MDAzZSwgMHgyNDA2MDAzNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNmNCwKKwkweDk2MjIwMDBhLCAweDNjMDMwODAwLCAweDk0NjMxYmM2LCAweDNjMDEwODAwLCAweGFjMjAyM2YwLCAweDNjMDEwODAwLAorCTB4YWMyMDIzZjgsIDB4MDAwMjEzMDIsIDB4MDAwMjEwODAsIDB4MDBjMjEwMjEsIDB4MDA2MjE4MjEsIDB4M2MwMTA4MDAsCisJMHhhNDIyMjNkMCwgMHgzYzAxMDgwMCwgMHgwYTAwMDExNSwgMHhhNDIzMWI5NiwgMHg5NjIyMDAwYywgMHgzYzAxMDgwMCwKKwkweGE0MjIyM2VjLCAweDNjMDQwODAwLCAweDI0ODQxYjljLCAweDhjODIwMDAwLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLAorCTB4MDAyMjA4MjEsIDB4YWMzMTFiYzgsIDB4OGM4MjAwMDAsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsCisJMHhhYzI3MWJjYywgMHg4YzgyMDAwMCwgMHgyNTAzMDAwMSwgMHgzMDY2MDFmZiwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwKKwkweDAwMjIwODIxLCAweGFjMjYxYmQwLCAweDhjODIwMDAwLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLCAweDAwMjIwODIxLAorCTB4YWMyOTFiZDQsIDB4OTYyMzAwMDgsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYWMsIDB4MDA0MzI4MjEsIDB4M2MwMTA4MDAsCisJMHhhYzI1MWJhYywgMHg5NjIyMDAwYSwgMHgzMDQyMDAwNCwgMHgxNDQwMDAxOCwgMHgwMDA2MTEwMCwgMHg4ZjYzMGMxNCwKKwkweDMwNjMwMDBmLCAweDJjNjIwMDAyLCAweDE0NDAwMDBiLCAweDNjMDJjMDAwLCAweDhmNjMwYzE0LCAweDNjMDIwODAwLAorCTB4OGM0MjFiNDAsIDB4MzA2MzAwMGYsIDB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNDAsIDB4MmM2MjAwMDIsCisJMHgxMDQwZmZmNywgMHgzYzAyYzAwMCwgMHgwMGUyMTgyNSwgMHhhZjYzNWM1YywgMHg4ZjYyNWM1MCwgMHgzMDQyMDAwMiwKKwkweDEwNDAwMDE0LCAweDAwMDAwMDAwLCAweDBhMDAwMTQ3LCAweDAwMDAwMDAwLCAweDNjMDMwODAwLCAweDhjNjMxYjgwLAorCTB4M2MwNDA4MDAsIDB4OTQ4NDFiOTQsIDB4MDEyMjEwMjUsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZGEsIDB4MjQwMjAwMDEsCisJMHgzYzAxMDgwMCwgMHhhYzIyMWJiOCwgMHgyNDYzMDAwMSwgMHgwMDg1MjAyYSwgMHgzYzAxMDgwMCwgMHgxMDgwMDAwMywKKwkweGFjMjMxYjgwLCAweDNjMDEwODAwLCAweGE0MjUxYjk0LCAweDNjMDYwODAwLCAweDI0YzYxYjljLCAweDhjYzIwMDAwLAorCTB4MjQ0MjAwMDEsIDB4YWNjMjAwMDAsIDB4Mjg0MjAwODAsIDB4MTQ0MDAwMDUsIDB4MDAwMDAwMDAsIDB4MGUwMDA2NTYsCisJMHgyNDA0MDAwMiwgMHgwYTAwMDFlNiwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg4YzQyMWJiOCwgMHgxMDQwMDA3OCwKKwkweDI0MDIwMDAxLCAweDNjMDUwODAwLCAweDkwYTUxYjk4LCAweDE0YTIwMDcyLCAweDAwMDAwMDAwLCAweDNjMTUwODAwLAorCTB4OTZiNTFiOTYsIDB4M2MwNDA4MDAsIDB4OGM4NDFiYWMsIDB4MzJhM2ZmZmYsIDB4MDA4MzEwMmEsIDB4MTQ0MDAwNmMsCisJMHgwMDAwMDAwMCwgMHgxNDgzMDAwMywgMHgwMDAwMDAwMCwgMHgzYzAxMDgwMCwgMHhhYzI1MjNmMCwgMHgxMDYwMDA1YywKKwkweDAwMDA5MDIxLCAweDI0ZDYwMDA0LCAweDAwNjBhMDIxLCAweDI0ZDMwMDE0LCAweDhlYzIwMDAwLCAweDAwMDI4MTAwLAorCTB4M2MxMTA4MDAsIDB4MDIzMDg4MjEsIDB4MGUwMDA2MjUsIDB4OGUzMTFiYzgsIDB4MDA0MDI4MjEsIDB4MTBhMDAwNTQsCisJMHgwMDAwMDAwMCwgMHg5NjI4MDAwYSwgMHgzMTAyMDA0MCwgMHgxMDQwMDAwNSwgMHgyNDA3MTgwYywgMHg4ZTIyMDAwYywKKwkweDI0MDcxODhjLCAweDAwMDIxNDAwLCAweGFjYTIwMDE4LCAweDNjMDMwODAwLCAweDAwNzAxODIxLCAweDhjNjMxYmQwLAorCTB4M2MwMjA4MDAsIDB4MDA1MDEwMjEsIDB4OGM0MjFiZDQsIDB4MDAwMzFkMDAsIDB4MDAwMjE0MDAsIDB4MDA2MjE4MjUsCisJMHhhY2EzMDAxNCwgMHg4ZWMzMDAwNCwgMHg5NjIyMDAwOCwgMHgwMDQzMjAyMywgMHgzMjQyZmZmZiwgMHgzMDgzZmZmZiwKKwkweDAwNDMxMDIxLCAweDAyODIxMDJhLCAweDE0NDAwMDAyLCAweDAyYjIzMDIzLCAweDAwODAzMDIxLCAweDhlNjIwMDAwLAorCTB4MzBjNGZmZmYsIDB4MDA0NDEwMjEsIDB4YWU2MjAwMDAsIDB4OGUyMjAwMDAsIDB4YWNhMjAwMDAsIDB4OGUyMjAwMDQsCisJMHg4ZTYzZmZmNCwgMHgwMDQzMTAyMSwgMHhhY2EyMDAwNCwgMHhhNGE2MDAwZSwgMHg4ZTYyZmZmNCwgMHgwMDQ0MTAyMSwKKwkweGFlNjJmZmY0LCAweDk2MjMwMDA4LCAweDAwNDMxMDJhLCAweDE0NDAwMDA1LCAweDAyNDY5MDIxLCAweDhlNjJmZmYwLAorCTB4YWU2MGZmZjQsIDB4MjQ0MjAwMDEsIDB4YWU2MmZmZjAsIDB4YWNhMDAwMDgsIDB4MzI0MmZmZmYsIDB4MTQ1NDAwMDgsCisJMHgyNDAyMDMwNSwgMHgzMTAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNGU3MDAxMCwgMHgyNDAyMDkwNSwgMHhhNGEyMDAwYywKKwkweDBhMDAwMWNiLCAweDM0ZTcwMDIwLCAweGE0YTIwMDBjLCAweDNjMDIwODAwLCAweDhjNDIyM2YwLCAweDEwNDAwMDAzLAorCTB4M2MwMjRiNjUsIDB4MGEwMDAxZDMsIDB4MzQ0Mjc2NTQsIDB4M2MwMmI0OWEsIDB4MzQ0Mjg5YWIsIDB4YWNhMjAwMWMsCisJMHgzMGUyZmZmZiwgMHhhY2EyMDAxMCwgMHgwZTAwMDVhMiwgMHgwMGEwMjAyMSwgMHgzMjQyZmZmZiwgMHgwMDU0MTAyYiwKKwkweDE0NDBmZmE5LCAweDAwMDAwMDAwLCAweDI0MDIwMDAyLCAweDNjMDEwODAwLCAweDBhMDAwMWU2LCAweGEwMjIxYjk4LAorCTB4OGVjMjA4M2MsIDB4MjQ0MjAwMDEsIDB4MGEwMDAxZTYsIDB4YWVjMjA4M2MsIDB4MGUwMDA0YzAsIDB4MDAwMDAwMDAsCisJMHg4ZmJmMDAyYywgMHg4ZmI2MDAyOCwgMHg4ZmI1MDAyNCwgMHg4ZmI0MDAyMCwgMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwKKwkweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDMwLCAweDI3YmRmZmQwLCAweGFmYmYwMDI4LAorCTB4YWZiMzAwMjQsIDB4YWZiMjAwMjAsIDB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY3MjVjOWMsIDB4M2MwMjAwZmYsCisJMHgzNDQyZmZmOCwgMHgzYzA3MDgwMCwgMHgyNGU3MWJiNCwgMHgwMjQyODgyNCwgMHg5NjIzMDAwZSwgMHg4Y2UyMDAwMCwKKwkweDAwNDMxMDIxLCAweGFjZTIwMDAwLCAweDhlMjIwMDEwLCAweDMwNDIwMDIwLCAweDE0NDAwMDExLCAweDAwODA5ODIxLAorCTB4MGUwMDA2M2IsIDB4MDIyMDIwMjEsIDB4M2MwMmMwMDAsIDB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsCisJMHgzMDQyMDAwMiwgMHgxMDQwMDExZSwgMHgwMDAwMDAwMCwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwKKwkweDEwNDAwMTE5LCAweDAwMDAwMDAwLCAweDBhMDAwMjBkLCAweDAwMDAwMDAwLCAweDhlMjQwMDA4LCAweDhlMjMwMDE0LAorCTB4MDAwNDE0MDIsIDB4MDAwMjMxYzAsIDB4MDAwMzE1MDIsIDB4MzA0MjAxZmYsIDB4MjQ0MmZmZmYsIDB4MzA0MjAwN2YsCisJMHgwMDAzMTk0MiwgMHgzMDYzNzgwMCwgMHgwMDAyMTEwMCwgMHgyNDQyNDAwMCwgMHgwMDYyNDgyMSwgMHg5NTIyMDAwYSwKKwkweDMwODRmZmZmLCAweDMwNDIwMDA4LCAweDEwNDAwMGIwLCAweDAwMDQyOWMwLCAweDNjMDIwODAwLCAweDhjNDIyNDAwLAorCTB4MTQ0MDAwMjQsIDB4MjRjNTAwMDgsIDB4OTRjMjAwMTQsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDAsIDB4OGNjNDAwMTAsCisJMHgwMDA0MTQwMiwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkMiwgMHgzYzAxMDgwMCwgMHhhNDI0MjNkNCwgMHg5NGMyMDAwZSwKKwkweDMwODNmZmZmLCAweDAwNDMxMDIzLCAweDNjMDEwODAwLCAweGFjMjIyNDA4LCAweDk0YzIwMDFhLCAweDNjMDEwODAwLAorCTB4YWMyNjI0MDAsIDB4M2MwMTA4MDAsIDB4YWMzMjI0MDQsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZmMsIDB4M2MwMmMwMDAsCisJMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwgMHgxMDQwMDBlNSwgMHgwMDAwMDAwMCwKKwkweGFmNjM1YzljLCAweDhmNjI1YzkwLCAweDMwNDIwMDAyLCAweDEwNDAwMGUwLCAweDAwMDAwMDAwLCAweDBhMDAwMjQ2LAorCTB4MDAwMDAwMDAsIDB4OTRjMjAwMGUsIDB4M2MwMzA4MDAsIDB4OTQ2MzIzZDQsIDB4MDA0MzQwMjMsIDB4MzEwM2ZmZmYsCisJMHgyYzYyMDAwOCwgMHgxMDQwMDAxYywgMHgwMDAwMDAwMCwgMHg5NGMyMDAxNCwgMHgyNDQyMDAyOCwgMHgwMGEyMjgyMSwKKwkweDAwMDMxMDQyLCAweDE4NDAwMDBiLCAweDAwMDAyMDIxLCAweDI0ZTYwODQ4LCAweDAwNDAzODIxLCAweDk0YTMwMDAwLAorCTB4OGNjMjAwMDAsIDB4MjQ4NDAwMDEsIDB4MDA0MzEwMjEsIDB4YWNjMjAwMDAsIDB4MDA4NzEwMmEsIDB4MTQ0MGZmZjksCisJMHgyNGE1MDAwMiwgMHgzMTAyMDAwMSwgMHgxMDQwMDAxZiwgMHgzYzAyNDAwMCwgMHgzYzA0MDgwMCwgMHgyNDg0MjNmYywKKwkweGEwYTAwMDAxLCAweDk0YTMwMDAwLCAweDhjODIwMDAwLCAweDAwNDMxMDIxLCAweDBhMDAwMjg1LCAweGFjODIwMDAwLAorCTB4OGY2MjY4MDAsIDB4M2MwMzAwMTAsIDB4MDA0MzEwMjQsIDB4MTA0MDAwMDksIDB4MDAwMDAwMDAsIDB4OTRjMjAwMWEsCisJMHgzYzAzMDgwMCwgMHg4YzYzMjNmYywgMHgwMDQzMTAyMSwgMHgzYzAxMDgwMCwgMHhhYzIyMjNmYywgMHgwYTAwMDI4NiwKKwkweDNjMDI0MDAwLCAweDk0YzIwMDFhLCAweDk0YzQwMDFjLCAweDNjMDMwODAwLCAweDhjNjMyM2ZjLCAweDAwNDQxMDIzLAorCTB4MDA2MjE4MjEsIDB4M2MwMTA4MDAsIDB4YWMyMzIzZmMsIDB4M2MwMjQwMDAsIDB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsCisJMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwgMHgxNDQwZmZmYywgMHgwMDAwMDAwMCwgMHg5NTIyMDAwYSwgMHgzMDQyMDAxMCwKKwkweDEwNDAwMDliLCAweDAwMDAwMDAwLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDNjMDcwODAwLCAweDI0ZTcyNDAwLAorCTB4OGNlNDAwMDAsIDB4OGY2MjY4MDAsIDB4MjQ2MzAwMzAsIDB4MDA4MzI4MjEsIDB4M2MwMzAwMTAsIDB4MDA0MzEwMjQsCisJMHgxNDQwMDAwYSwgMHgwMDAwMDAwMCwgMHg5NGEyMDAwNCwgMHgzYzA0MDgwMCwgMHg4Yzg0MjQwOCwgMHgzYzAzMDgwMCwKKwkweDhjNjMyM2ZjLCAweDAwNDQxMDIzLCAweDAwNjIxODIxLCAweDNjMDEwODAwLCAweGFjMjMyM2ZjLCAweDNjMDQwODAwLAorCTB4OGM4NDIzZmMsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjIwMjEsIDB4MDAwNDE0MDIsIDB4MDA4MjIwMjEsCisJMHgwMDA0MTAyNywgMHhhNGEyMDAwNiwgMHgzYzAzMDgwMCwgMHg4YzYzMjQwNCwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmOCwKKwkweDAwNjI4ODI0LCAweDk2MjIwMDA4LCAweDI0MDUwMDAxLCAweDI0MDM0MDAwLCAweDAwMDIzMWMwLCAweDAwODAxMDIxLAorCTB4YTRjMjAwMWEsIDB4YTRjMDAwMWMsIDB4YWNlMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyNTFiNjAsIDB4YWY2MzVjYjgsCisJMHg4ZjYyNWNiMCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgzYzAxMDgwMCwgMHhhYzIwMWI2MCwKKwkweDhlMjIwMDA4LCAweGFmNjI1Y2I4LCAweDhmNjI1Y2IwLCAweDMwNDIwMDAyLCAweDEwNDAwMDAzLCAweDAwMDAwMDAwLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiNjAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNjAsIDB4MTA0MGZmZWMsIDB4MDAwMDAwMDAsCisJMHgzYzA0MDgwMCwgMHgwZTAwMDYzYiwgMHg4Yzg0MjQwNCwgMHgwYTAwMDMyYSwgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwKKwkweDkwNjMxYjk4LCAweDI0MDIwMDAyLCAweDE0NjIwMDAzLCAweDNjMDM0YjY1LCAweDBhMDAwMmUxLCAweDAwMDA4MDIxLAorCTB4OGUyMjAwMWMsIDB4MzQ2Mzc2NTQsIDB4MTA0MzAwMDIsIDB4MjQxMDAwMDIsIDB4MjQxMDAwMDEsIDB4MDBjMDIwMjEsCisJMHgwZTAwMDM1MCwgMHgwMjAwMzAyMSwgMHgyNDAyMDAwMywgMHgzYzAxMDgwMCwgMHhhMDIyMWI5OCwgMHgyNDAyMDAwMiwKKwkweDEyMDIwMDBhLCAweDI0MDIwMDAxLCAweDNjMDMwODAwLCAweDhjNjMyM2YwLCAweDEwNjIwMDA2LCAweDAwMDAwMDAwLAorCTB4M2MwMjA4MDAsIDB4OTQ0MjIzZDgsIDB4MDAwMjE0MDAsIDB4MGEwMDAzMWYsIDB4YWUyMjAwMTQsIDB4M2MwNDA4MDAsCisJMHgyNDg0MjNkYSwgMHg5NDgyMDAwMCwgMHgwMDAyMTQwMCwgMHhhZTIyMDAxNCwgMHgzYzAyMDgwMCwgMHg4YzQyMWJiYywKKwkweDNjMDNjMDAwLCAweDNjMDEwODAwLCAweGEwMjAxYjk4LCAweDAwNDMxMDI1LCAweGFmNjI1YzVjLCAweDhmNjI1YzUwLAorCTB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MDAwMDAwMDAsIDB4MjQ4NGY3ZTIsIDB4OGM4MjAwMDAsIDB4MDA0MzEwMjUsCisJMHhhZjYyNWM1YywgMHg4ZjYyNWM1MCwgMHgzMDQyMDAwMiwgMHgxNDQwZmZmYSwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDI0NDIxYjg0LCAweDhjNDMwMDAwLCAweDI0NjMwMDAxLCAweGFjNDMwMDAwLCAweDhmNjMwYzE0LCAweDMwNjMwMDBmLAorCTB4MmM2MjAwMDIsIDB4MTQ0MDAwMGMsIDB4M2MwMjQwMDAsIDB4OGY2MzBjMTQsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNDAsCisJMHgzMDYzMDAwZiwgMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHhhYzIyMWI0MCwgMHgyYzYyMDAwMiwgMHgxMDQwZmZmNywKKwkweDAwMDAwMDAwLCAweDNjMDI0MDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLCAweDhmNjI1YzkwLCAweDMwNDIwMDAyLAorCTB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsIDB4MTI2MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDA0YzAsIDB4MDAwMDAwMDAsCisJMHg4ZmJmMDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDMwLCAweDhmNjM0NDUwLCAweDNjMDQwODAwLCAweDI0ODQxYjg4LCAweDhjODIwMDAwLCAweDAwMDMxYzAyLAorCTB4MDA0MzEwMmIsIDB4MTQ0MDAwMDcsIDB4M2MwMzgwMDAsIDB4OGM4NDAwMDQsIDB4OGY2MjQ0NTAsIDB4MDAwMjFjMDIsCisJMHgwMDgzMTAyYiwgMHgxMDQwZmZmYywgMHgzYzAzODAwMCwgMHhhZjYzNDQ0NCwgMHg4ZjYyNDQ0NCwgMHgwMDQzMTAyNCwKKwkweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDhmNjI0NDQ4LCAweDAzZTAwMDA4LCAweDMwNDJmZmZmLCAweDNjMDI0MDAwLAorCTB4MDA4MjIwMjUsIDB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHgwMDgwNTgyMSwgMHgxNGMwMDAxMSwgMHgyNTZlMDAwOCwKKwkweDNjMDIwODAwLCAweDhjNDIyM2Y0LCAweDEwNDAwMDA3LCAweDI0MDIwMDE2LCAweDNjMDEwODAwLCAweGE0MjIyM2QyLAorCTB4MjQwMjAwMmEsIDB4M2MwMTA4MDAsIDB4MGEwMDAzNjQsIDB4YTQyMjIzZDQsIDB4OGQ2NzAwMTAsIDB4MDAwNzE0MDIsCisJMHgzYzAxMDgwMCwgMHhhNDIyMjNkMiwgMHgzYzAxMDgwMCwgMHhhNDI3MjNkNCwgMHgzYzA0MDgwMCwgMHg5NDg0MjNkNCwKKwkweDNjMDMwODAwLCAweDk0NjMyM2QyLCAweDk1Y2YwMDA2LCAweDNjMDIwODAwLCAweDk0NDIyM2QwLCAweDAwODMyMDIzLAorCTB4MDFlMmMwMjMsIDB4MzA2NWZmZmYsIDB4MjRhMjAwMjgsIDB4MDFjMjQ4MjEsIDB4MzA4MmZmZmYsIDB4MTRjMDAwMWEsCisJMHgwMTIyNjAyMSwgMHg5NTgyMDAwYywgMHgzMDQyMDAzZiwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkNiwgMHg5NTgyMDAwNCwKKwkweDk1ODMwMDA2LCAweDNjMDEwODAwLCAweGFjMjAyM2U0LCAweDNjMDEwODAwLCAweGFjMjAyM2U4LCAweDAwMDIxNDAwLAorCTB4MDA0MzEwMjUsIDB4M2MwMTA4MDAsIDB4YWMyMjFiYzAsIDB4OTUyMjAwMDQsIDB4M2MwMTA4MDAsIDB4YTQyMjFiYzQsCisJMHg5NTIzMDAwMiwgMHgwMWU1MTAyMywgMHgwMDQzMTAyYSwgMHgxMDQwMDAxMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDgwMCwKKwkweDBhMDAwMzk4LCAweGFjMjIyM2Y4LCAweDNjMDMwODAwLCAweDhjNjMyM2U4LCAweDNjMDIwODAwLCAweDk0NDIxYmM0LAorCTB4MDA0MzEwMjEsIDB4YTUyMjAwMDQsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiYzAsIDB4YTU4MjAwMDQsIDB4M2MwMjA4MDAsCisJMHg4YzQyMWJjMCwgMHhhNTgyMDAwNiwgMHgzYzAyMDgwMCwgMHg4YzQyMjNmMCwgMHgzYzBkMDgwMCwgMHg4ZGFkMjNlNCwKKwkweDNjMGEwODAwLCAweDE0NDAwMGU1LCAweDhkNGEyM2U4LCAweDNjMDIwODAwLCAweDk0NDIxYmM0LCAweDAwNGExODIxLAorCTB4MzA2M2ZmZmYsIDB4MDA2MjE4MmIsIDB4MjQwMjAwMDIsIDB4MTBjMjAwMGQsIDB4MDE0MzUwMjMsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNkNiwgMHgzMDQyMDAwOSwgMHgxMDQwMDAwOCwgMHgwMDAwMDAwMCwgMHg5NTgyMDAwYywgMHgzMDQyZmZmNiwKKwkweGE1ODIwMDBjLCAweDNjMDIwODAwLCAweDk0NDIyM2Q2LCAweDMwNDIwMDA5LCAweDAxYTI2ODIzLCAweDNjMDIwODAwLAorCTB4OGM0MjIzZjgsIDB4MTA0MDAwNGEsIDB4MDEyMDM4MjEsIDB4M2MwMjA4MDAsIDB4OTQ0MjIzZDIsIDB4MDAwMDQwMjEsCisJMHhhNTIwMDAwYSwgMHgwMWUyMTAyMywgMHhhNTIyMDAwMiwgMHgzMDgyZmZmZiwgMHgwMDAyMTA0MiwgMHgxODQwMDAwOCwKKwkweDAwMDAzMDIxLCAweDAwNDAxODIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLCAweDAxMDMxMDJhLAorCTB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsIDB4MDAwNjE0MDIsCisJMHgwMGMyMzAyMSwgMHgwMGMwMjgyMSwgMHgwMDA2MTAyNywgMHhhNTIyMDAwYSwgMHgwMDAwMzAyMSwgMHgyNTI3MDAwYywKKwkweDAwMDA0MDIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLCAweDJkMDIwMDA0LCAweDE0NDBmZmZiLAorCTB4MjRlNzAwMDIsIDB4OTUyMjAwMDIsIDB4MDAwMDQwMjEsIDB4OTEyMzAwMDksIDB4MDA0NDIwMjMsIDB4MDE4MDM4MjEsCisJMHgzMDgyZmZmZiwgMHhhNGUwMDAxMCwgMHgwMDYyMTgyMSwgMHgwMDAyMTA0MiwgMHgxODQwMDAxMCwgMHgwMGMzMzAyMSwKKwkweDAwNDA0ODIxLCAweDk0ZTIwMDAwLCAweDI0ZTcwMDAyLCAweDAwYzIzMDIxLCAweDMwZTIwMDdmLCAweDE0NDAwMDA2LAorCTB4MjUwODAwMDEsIDB4OGQ2MzAwMDAsIDB4M2MwMjAwN2YsIDB4MzQ0MmZmODAsIDB4MDA2MjU4MjQsIDB4MjU2NzAwMDgsCisJMHgwMTA5MTAyYSwgMHgxNDQwZmZmMywgMHgwMDAwMDAwMCwgMHgzMDgyMDAwMSwgMHgxMDQwMDAwNSwgMHgwMDA2MWMwMiwKKwkweGEwZTAwMDAxLCAweDk0ZTIwMDAwLCAweDAwYzIzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLAorCTB4MDAwNjE0MDIsIDB4MDBjMjMwMjEsIDB4MGEwMDA0N2QsIDB4MzBjNmZmZmYsIDB4MjQwMjAwMDIsIDB4MTRjMjAwODEsCisJMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg4YzQyMjQwYywgMHgxNDQwMDAwNywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDk0NDIyM2QyLCAweDk1MjMwMDAyLCAweDAxZTIxMDIzLCAweDEwNjIwMDc3LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLAorCTB4OTQ0MjIzZDIsIDB4MDFlMjEwMjMsIDB4YTUyMjAwMDIsIDB4M2MwMjA4MDAsIDB4OGM0MjI0MGMsIDB4MTA0MDAwMWEsCisJMHgzMWUzZmZmZiwgMHg4ZGM3MDAxMCwgMHgzYzAyMDgwMCwgMHg5NDQyMWI5NiwgMHgwMGUwNDAyMSwgMHgwMDA3MmMwMiwKKwkweDAwYWEyMDIxLCAweDAwNDMxMDIzLCAweDAwODIzODIzLCAweDAwMDcyNDAyLCAweDMwZTJmZmZmLCAweDAwODIzODIxLAorCTB4MDAwNzEwMjcsIDB4YTUyMjAwMGEsIDB4MzEwMmZmZmYsIDB4M2MwNDA4MDAsIDB4OTQ4NDIzZDQsIDB4MDA0NTMwMjMsCisJMHgwMGUwMjgyMSwgMHgwMDY0MTgyMywgMHgwMDZkMTgyMSwgMHgwMGMzMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwKKwkweDBhMDAwNDdkLCAweDAwNjIzMDIxLCAweDAxMjAzODIxLCAweDAwMDA0MDIxLCAweDMwODJmZmZmLCAweDAwMDIxMDQyLAorCTB4MTg0MDAwMDgsIDB4MDAwMDMwMjEsIDB4MDA0MDE4MjEsIDB4OTRlMjAwMDAsIDB4MjUwODAwMDEsIDB4MDBjMjMwMjEsCisJMHgwMTAzMTAyYSwgMHgxNDQwZmZmYiwgMHgyNGU3MDAwMiwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwKKwkweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDAwYzAyODIxLCAweDAwMDYxMDI3LCAweGE1MjIwMDBhLCAweDAwMDAzMDIxLAorCTB4MjUyNzAwMGMsIDB4MDAwMDQwMjEsIDB4OTRlMjAwMDAsIDB4MjUwODAwMDEsIDB4MDBjMjMwMjEsIDB4MmQwMjAwMDQsCisJMHgxNDQwZmZmYiwgMHgyNGU3MDAwMiwgMHg5NTIyMDAwMiwgMHgwMDAwNDAyMSwgMHg5MTIzMDAwOSwgMHgwMDQ0MjAyMywKKwkweDAxODAzODIxLCAweDMwODJmZmZmLCAweGE0ZTAwMDEwLCAweDNjMDQwODAwLCAweDk0ODQyM2Q0LCAweDAwNjIxODIxLAorCTB4MDBjMzMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsIDB4MDAwNjFjMDIsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNkMCwgMHgwMGMzNDgyMSwgMHgwMDQ0MTAyMywgMHgwMDAyMWZjMiwgMHgwMDQzMTAyMSwgMHgwMDAyMTA0MywKKwkweDE4NDAwMDEwLCAweDAwMDAzMDIxLCAweDAwNDAyMDIxLCAweDk0ZTIwMDAwLCAweDI0ZTcwMDAyLCAweDAwYzIzMDIxLAorCTB4MzBlMjAwN2YsIDB4MTQ0MDAwMDYsIDB4MjUwODAwMDEsIDB4OGQ2MzAwMDAsIDB4M2MwMjAwN2YsIDB4MzQ0MmZmODAsCisJMHgwMDYyNTgyNCwgMHgyNTY3MDAwOCwgMHgwMTA0MTAyYSwgMHgxNDQwZmZmMywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDk0NDIyM2VjLCAweDAwYzIzMDIxLCAweDMxMjJmZmZmLCAweDAwYzIzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLAorCTB4MDA2MjMwMjEsIDB4MDAwNjE0MDIsIDB4MDBjMjMwMjEsIDB4MDBjMDQwMjEsIDB4MDAwNjEwMjcsIDB4YTU4MjAwMTAsCisJMHhhZGMwMDAxNCwgMHgwYTAwMDQ5ZCwgMHhhZGMwMDAwMCwgMHg4ZGM3MDAxMCwgMHgwMGUwNDAyMSwgMHgxMTQwMDAwNywKKwkweDAwMDcyYzAyLCAweDAwYWEzMDIxLCAweDAwMDYxNDAyLCAweDMwYzNmZmZmLCAweDAwNDMzMDIxLCAweDAwMDYxNDAyLAorCTB4MDBjMjI4MjEsIDB4MDAwNTEwMjcsIDB4YTUyMjAwMGEsIDB4M2MwMzA4MDAsIDB4OTQ2MzIzZDQsIDB4MzEwMmZmZmYsCisJMHgwMWUyMTAyMSwgMHgwMDQzMzAyMywgMHgwMGNkMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwKKwkweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDAwYzA0MDIxLCAweDAwMDYxMDI3LCAweGE1ODIwMDEwLCAweDMxMDJmZmZmLAorCTB4MDAwNTFjMDAsIDB4MDA0MzEwMjUsIDB4YWRjMjAwMTAsIDB4M2MwMjA4MDAsIDB4OGM0MjIzZjQsIDB4MTA0MDAwMDUsCisJMHgyZGUyMDVlYiwgMHgxNDQwMDAwMiwgMHgyNWUyZmZmMiwgMHgzNDAyODg3MCwgMHhhNWMyMDAzNCwgMHgzYzAzMDgwMCwKKwkweDI0NjMyM2U4LCAweDhjNjIwMDAwLCAweDI0NDIwMDAxLCAweGFjNjIwMDAwLCAweDNjMDQwODAwLCAweDhjODQyM2U0LAorCTB4M2MwMjA4MDAsIDB4OGM0MjFiYzAsIDB4MzMwM2ZmZmYsIDB4MDA4MzIwMjEsIDB4MDA0MzE4MjEsIDB4MDA2MjEwMmIsCisJMHgzYzAxMDgwMCwgMHhhYzI0MjNlNCwgMHgxMDQwMDAwMywgMHgyNDgyZmZmZiwgMHgzYzAxMDgwMCwgMHhhYzIyMjNlNCwKKwkweDNjMDEwODAwLCAweGFjMjMxYmMwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmI4LCAweDNjMDUwODAwLAorCTB4MjRhNTFiOTYsIDB4YWZiZjAwNDQsIDB4YWZiZTAwNDAsIDB4YWZiNzAwM2MsIDB4YWZiNjAwMzgsIDB4YWZiNTAwMzQsCisJMHhhZmI0MDAzMCwgMHhhZmIzMDAyYywgMHhhZmIyMDAyOCwgMHhhZmIxMDAyNCwgMHhhZmIwMDAyMCwgMHg5NGE5MDAwMCwKKwkweDNjMDIwODAwLCAweDk0NDIyM2QwLCAweDNjMDMwODAwLCAweDhjNjMxYmIwLCAweDNjMDQwODAwLCAweDhjODQxYmFjLAorCTB4MDEyMjEwMjMsIDB4MDA2NDE4MmEsIDB4YTdhOTAwMWUsIDB4MTA2MDAwYmUsIDB4YTdhMjAwMTYsIDB4MjRiZTAwMjIsCisJMHg5N2I2MDAxZSwgMHgyNGIzMDAxYSwgMHgyNGI3MDAxNiwgMHg4ZmMyMDAwMCwgMHgxNDQwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDhmYzJmZmY4LCAweDk3YTMwMDE2LCAweDhmYzRmZmY0LCAweDAwNDMxMDIxLCAweDAwODIyMDJhLCAweDE0ODAwMGIwLAorCTB4MDAwMDAwMDAsIDB4OTdkNTA4MTgsIDB4MzJhMmZmZmYsIDB4MTA0MDAwYTMsIDB4MDAwMDkwMjEsIDB4MDA0MGEwMjEsCisJMHgwMDAwODgyMSwgMHgwZTAwMDYyNSwgMHgwMDAwMDAwMCwgMHgwMDQwMzAyMSwgMHgxNGMwMDAwNywgMHgwMDAwMDAwMCwKKwkweDNjMDIwODAwLCAweDhjNDIyM2RjLCAweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweDBhMDAwNTk2LCAweGFjMjIyM2RjLAorCTB4M2MxMDA4MDAsIDB4MDIxMTgwMjEsIDB4OGUxMDFiYzgsIDB4OTYwODAwMGEsIDB4MzEwMjAwNDAsIDB4MTA0MDAwMDUsCisJMHgyNDA3MTgwYywgMHg4ZTAyMDAwYywgMHgyNDA3MTg4YywgMHgwMDAyMTQwMCwgMHhhY2MyMDAxOCwgMHgzMTAyMDA4MCwKKwkweDU0NDAwMDAxLCAweDM0ZTcwMDEwLCAweDNjMDIwODAwLCAweDAwNTExMDIxLCAweDhjNDIxYmQwLCAweDNjMDMwODAwLAorCTB4MDA3MTE4MjEsIDB4OGM2MzFiZDQsIDB4MDAwMjE1MDAsIDB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4YWNjMjAwMTQsCisJMHg5NjA0MDAwOCwgMHgzMjQyZmZmZiwgMHgwMDgyMTAyMSwgMHgwMjgyMTAyYSwgMHgxNDQwMDAwMiwgMHgwMmIyMjgyMywKKwkweDAwODAyODIxLCAweDhlMDIwMDAwLCAweDAyNDU5MDIxLCAweGFjYzIwMDAwLCAweDhlMDIwMDA0LCAweDAwYzAyMDIxLAorCTB4MjYzMTAwMTAsIDB4YWM4MjAwMDQsIDB4MzBlMmZmZmYsIDB4YWM4MDAwMDgsIDB4YTQ4NTAwMGUsIDB4YWM4MjAwMTAsCisJMHgyNDAyMDMwNSwgMHgwZTAwMDVhMiwgMHhhNDgyMDAwYywgMHgzMjQyZmZmZiwgMHgwMDU0MTAyYiwgMHgxNDQwZmZjNSwKKwkweDMyNDJmZmZmLCAweDBhMDAwNThlLCAweDAwMDAwMDAwLCAweDhlNjIwMDAwLCAweDhlNjNmZmZjLCAweDAwNDMxMDJhLAorCTB4MTA0MDAwNjcsIDB4MDAwMDAwMDAsIDB4OGU2MmZmZjAsIDB4MDAwMjg5MDAsIDB4M2MxMDA4MDAsIDB4MDIxMTgwMjEsCisJMHgwZTAwMDYyNSwgMHg4ZTEwMWJjOCwgMHgwMDQwMzAyMSwgMHgxNGMwMDAwNSwgMHgwMDAwMDAwMCwgMHg4ZTYyMDgyYywKKwkweDI0NDIwMDAxLCAweDBhMDAwNTk2LCAweGFlNjIwODJjLCAweDk2MDgwMDBhLCAweDMxMDIwMDQwLCAweDEwNDAwMDA1LAorCTB4MjQwNzE4MGMsIDB4OGUwMjAwMGMsIDB4MjQwNzE4OGMsIDB4MDAwMjE0MDAsIDB4YWNjMjAwMTgsIDB4M2MwMjA4MDAsCisJMHgwMDUxMTAyMSwgMHg4YzQyMWJkMCwgMHgzYzAzMDgwMCwgMHgwMDcxMTgyMSwgMHg4YzYzMWJkNCwgMHgwMDAyMTUwMCwKKwkweDAwMDMxYzAwLCAweDAwNDMxMDI1LCAweGFjYzIwMDE0LCAweDhlNjNmZmY0LCAweDk2MDIwMDA4LCAweDAwNDMyMDIzLAorCTB4MzI0MmZmZmYsIDB4MzA4M2ZmZmYsIDB4MDA0MzEwMjEsIDB4MDJjMjEwMmEsIDB4MTA0MDAwMDMsIDB4MDA4MDI4MjEsCisJMHg5N2E5MDAxZSwgMHgwMTMyMjgyMywgMHg4ZTYyMDAwMCwgMHgzMGE0ZmZmZiwgMHgwMDQ0MTAyMSwgMHhhZTYyMDAwMCwKKwkweGE0YzUwMDBlLCAweDhlMDIwMDAwLCAweGFjYzIwMDAwLCAweDhlMDIwMDA0LCAweDhlNjNmZmY0LCAweDAwNDMxMDIxLAorCTB4YWNjMjAwMDQsIDB4OGU2M2ZmZjQsIDB4OTYwMjAwMDgsIDB4MDA2NDE4MjEsIDB4MDA2MjEwMmEsIDB4MTQ0MDAwMDYsCisJMHgwMjQ1OTAyMSwgMHg4ZTYyZmZmMCwgMHhhZTYwZmZmNCwgMHgyNDQyMDAwMSwgMHgwYTAwMDU3MSwgMHhhZTYyZmZmMCwKKwkweGFlNjNmZmY0LCAweGFjYzAwMDA4LCAweDMyNDJmZmZmLCAweDEwNTYwMDAzLCAweDMxMDIwMDA0LCAweDEwNDAwMDA2LAorCTB4MjQwMjAzMDUsIDB4MzEwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzRlNzAwMTAsIDB4MzRlNzAwMjAsIDB4MjQwMjA5MDUsCisJMHhhNGMyMDAwYywgMHg4ZWUzMDAwMCwgMHg4ZWUyMDAwNCwgMHgxNDYyMDAwNywgMHgzYzAyYjQ5YSwgMHg4ZWUyMDg2MCwKKwkweDU0NDAwMDAxLCAweDM0ZTcwNDAwLCAweDNjMDI0YjY1LCAweDBhMDAwNTg4LCAweDM0NDI3NjU0LCAweDM0NDI4OWFiLAorCTB4YWNjMjAwMWMsIDB4MzBlMmZmZmYsIDB4YWNjMjAwMTAsIDB4MGUwMDA1YTIsIDB4MDBjMDIwMjEsIDB4MzI0MmZmZmYsCisJMHgwMDU2MTAyYiwgMHgxNDQwZmY5YiwgMHgwMDAwMDAwMCwgMHg4ZTYyMDAwMCwgMHg4ZTYzZmZmYywgMHgwMDQzMTAyYSwKKwkweDE0NDBmZjQ4LCAweDAwMDAwMDAwLCAweDhmYmYwMDQ0LCAweDhmYmUwMDQwLCAweDhmYjcwMDNjLCAweDhmYjYwMDM4LAorCTB4OGZiNTAwMzQsIDB4OGZiNDAwMzAsIDB4OGZiMzAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsCisJMHgwM2UwMDAwOCwgMHgyN2JkMDA0OCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxNCwgMHhhZmIwMDAxMCwgMHg4ZjYyNDQ1MCwKKwkweDhmNjM0NDEwLCAweDBhMDAwNWIxLCAweDAwODA4MDIxLCAweDhmNjI2ODIwLCAweDMwNDIyMDAwLCAweDEwNDAwMDAzLAorCTB4MDAwMDAwMDAsIDB4MGUwMDAxZjAsIDB4MDAwMDIwMjEsIDB4OGY2MjQ0NTAsIDB4OGY2MzQ0MTAsIDB4MzA0MmZmZmYsCisJMHgwMDQzMTAyYiwgMHgxNDQwZmZmNSwgMHgwMDAwMDAwMCwgMHg4ZjYzMGMxNCwgMHgzMDYzMDAwZiwgMHgyYzYyMDAwMiwKKwkweDE0NDAwMDBiLCAweDAwMDAwMDAwLCAweDhmNjMwYzE0LCAweDNjMDIwODAwLCAweDhjNDIxYjQwLCAweDMwNjMwMDBmLAorCTB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNDAsIDB4MmM2MjAwMDIsIDB4MTA0MGZmZjcsIDB4MDAwMDAwMDAsCisJMHhhZjcwNWMxOCwgMHg4ZjYyNWMxMCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwOSwgMHgwMDAwMDAwMCwgMHg4ZjYyNjgyMCwKKwkweDMwNDIyMDAwLCAweDEwNDBmZmY4LCAweDAwMDAwMDAwLCAweDBlMDAwMWYwLCAweDAwMDAyMDIxLCAweDBhMDAwNWM0LAorCTB4MDAwMDAwMDAsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlOCwgMHgzYzFiYzAwMCwgMHhhZmJmMDAxNCwgMHhhZmIwMDAxMCwKKwkweGFmNjA2ODBjLCAweDhmNjI2ODA0LCAweDM0NDIwMDgyLCAweGFmNjI2ODA0LCAweDhmNjM0MDAwLCAweDI0MDIwYjUwLAorCTB4M2MwMTA4MDAsIDB4YWMyMjFiNTQsIDB4MjQwMjBiNzgsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNjQsIDB4MzQ2MzAwMDIsCisJMHhhZjYzNDAwMCwgMHgwZTAwMDYwNSwgMHgwMDgwODAyMSwgMHgzYzAxMDgwMCwgMHhhMDIyMWI2OCwgMHgzMDQyMDBmZiwKKwkweDI0MDMwMDAyLCAweDE0NDMwMDA1LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDhjNDIxYjU0LCAweDBhMDAwNWY4LAorCTB4YWM1MDAwYzAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNTQsIDB4YWM1MDAwYmMsIDB4OGY2MjQ0MzQsIDB4OGY2MzQ0MzgsCisJMHg4ZjY0NDQxMCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI1YywgMHgzYzAxMDgwMCwgMHhhYzIzMWI2YywgMHgzYzAxMDgwMCwKKwkweGFjMjQxYjU4LCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDQwODAwLAorCTB4OGM4NzAwMDAsIDB4M2MwM2FhNTUsIDB4MzQ2M2FhNTUsIDB4M2MwNmMwMDMsIDB4YWM4MzAwMDAsIDB4OGNjMjAwMDAsCisJMHgxNDQzMDAwNywgMHgyNDA1MDAwMiwgMHgzYzAzNTVhYSwgMHgzNDYzNTVhYSwgMHhhYzgzMDAwMCwgMHg4Y2MyMDAwMCwKKwkweDUwNDMwMDAxLCAweDI0MDUwMDAxLCAweDNjMDIwODAwLCAweGFjNDcwMDAwLCAweDAzZTAwMDA4LCAweDAwYTAxMDIxLAorCTB4MjdiZGZmZjgsIDB4MTg4MDAwMDksIDB4MDAwMDI4MjEsIDB4OGY2MzY4MGMsIDB4OGY2MjY4MGMsIDB4MTA0M2ZmZmUsCisJMHgwMDAwMDAwMCwgMHgyNGE1MDAwMSwgMHgwMGE0MTAyYSwgMHgxNDQwZmZmOSwgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDA4LCAweDhmNjM0NDUwLCAweDNjMDIwODAwLCAweDhjNDIxYjVjLCAweDAwMDMxYzAyLCAweDAwNDMxMDJiLAorCTB4MTQ0MDAwMDgsIDB4M2MwMzgwMDAsIDB4M2MwNDA4MDAsIDB4OGM4NDFiNmMsIDB4OGY2MjQ0NTAsIDB4MDAwMjFjMDIsCisJMHgwMDgzMTAyYiwgMHgxMDQwZmZmYywgMHgzYzAzODAwMCwgMHhhZjYzNDQ0NCwgMHg4ZjYyNDQ0NCwgMHgwMDQzMTAyNCwKKwkweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDhmNjI0NDQ4LCAweDAzZTAwMDA4LCAweDMwNDJmZmZmLCAweDMwODJmZmZmLAorCTB4MjQ0MmUwMDAsIDB4MmM0MjIwMDEsIDB4MTQ0MDAwMDMsIDB4M2MwMjQwMDAsIDB4MGEwMDA2NDgsIDB4MjQwMmZmZmYsCisJMHgwMDgyMjAyNSwgMHhhZjY0NWMzOCwgMHg4ZjYyNWMzMCwgMHgzMDQyMDAwMiwgMHgxNDQwZmZmYywgMHgwMDAwMTAyMSwKKwkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDhmNjI0NDUwLCAweDNjMDMwODAwLCAweDhjNjMxYjU4LCAweDBhMDAwNjUxLAorCTB4MzA0MmZmZmYsIDB4OGY2MjQ0NTAsIDB4MzA0MmZmZmYsIDB4MDA0MzEwMmIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHgwMDgwMjgyMSwgMHgzYzA0MDgwMCwgMHgyNDg0MWFmMCwKKwkweDAwMDAzMDIxLCAweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LAorCTB4MGEwMDA2NjAsIDB4MDAwMDAwMDAsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHgzNDQyMzAwMCwgMHgzYzAzMDgwMCwgMHgzNDYzMzAwMCwKKwkweDNjMDQwODAwLCAweDM0ODQzN2ZmLCAweDNjMDEwODAwLCAweGFjMjIxYjc0LCAweDI0MDIwMDQwLCAweDNjMDEwODAwLAorCTB4YWMyMjFiNzgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiNzAsIDB4YWM2MDAwMDAsIDB4MjQ2MzAwMDQsIDB4MDA4MzEwMmIsCisJMHg1MDQwZmZmZCwgMHhhYzYwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDgwNDgyMSwgMHg4ZmFhMDAxMCwKKwkweDNjMDIwODAwLCAweDhjNDIxYjcwLCAweDNjMDQwODAwLCAweDhjODQxYjc4LCAweDhmYWIwMDE0LCAweDI0NDMwMDAxLAorCTB4MDA0NDEwMmIsIDB4M2MwMTA4MDAsIDB4YWMyMzFiNzAsIDB4MTQ0MDAwMDMsIDB4MDAwMDQwMjEsIDB4M2MwMTA4MDAsCisJMHhhYzIwMWI3MCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI3MCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI3NCwgMHg5MTI0MDAwMCwKKwkweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweDAwNDgxMDIxLCAweDI1MDgwMDAxLCAweGEwNDQwMDAwLCAweDI5MDIwMDA4LAorCTB4MTQ0MGZmZjQsIDB4MjUyOTAwMDEsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNzAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiNzQsCisJMHg4ZjY0NjgwYywgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHhhYzQ0MDAwOCwgMHhhYzQ1MDAwYywgMHhhYzQ2MDAxMCwKKwkweGFjNDcwMDE0LCAweGFjNGEwMDE4LCAweDAzZTAwMDA4LCAweGFjNGIwMDFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIHUzMiB0ZzNUc29Gd1JvZGF0YVtdID0geworCTB4NGQ2MTY5NmUsIDB4NDM3MDc1NDIsIDB4MDAwMDAwMDAsIDB4NGQ2MTY5NmUsIDB4NDM3MDc1NDEsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHg0OTZlMDAwMCwgMHg3Mzc0NmI2ZiwKKwkweDY2NjYyYTJhLCAweDAwMDAwMDAwLCAweDUzNzc0NTc2LCAweDY1NmU3NDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NjY2MTc0NjEsIDB4NmM0NTcyNzIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyB1MzIgdGczVHNvRndEYXRhW10gPSB7CisJMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHg1Zjc2MzEyZSwgMHgzNjJlMzAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCisvKiA1NzA1IG5lZWRzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBUU08gZmlybXdhcmUuICAqLworI2RlZmluZSBURzNfVFNPNV9GV19SRUxFQVNFX01BSk9SCTB4MQorI2RlZmluZSBURzNfVFNPNV9GV19SRUxBU0VfTUlOT1IJMHgyCisjZGVmaW5lIFRHM19UU081X0ZXX1JFTEVBU0VfRklYCQkweDAKKyNkZWZpbmUgVEczX1RTTzVfRldfU1RBUlRfQUREUgkJMHgwMDAxMDAwMAorI2RlZmluZSBURzNfVFNPNV9GV19URVhUX0FERFIJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX1RTTzVfRldfVEVYVF9MRU4JCTB4ZTkwCisjZGVmaW5lIFRHM19UU081X0ZXX1JPREFUQV9BRERSCQkweDAwMDEwZTkwCisjZGVmaW5lIFRHM19UU081X0ZXX1JPREFUQV9MRU4JCTB4NTAKKyNkZWZpbmUgVEczX1RTTzVfRldfREFUQV9BRERSCQkweDAwMDEwZjAwCisjZGVmaW5lIFRHM19UU081X0ZXX0RBVEFfTEVOCQkweDIwCisjZGVmaW5lIFRHM19UU081X0ZXX1NCU1NfQUREUgkJMHgwMDAxMGYyMAorI2RlZmluZSBURzNfVFNPNV9GV19TQlNTX0xFTgkJMHgyOAorI2RlZmluZSBURzNfVFNPNV9GV19CU1NfQUREUgkJMHgwMDAxMGY1MAorI2RlZmluZSBURzNfVFNPNV9GV19CU1NfTEVOCQkweDg4CisKK3N0YXRpYyB1MzIgdGczVHNvNUZ3VGV4dFsoVEczX1RTTzVfRldfVEVYVF9MRU4gLyA0KSArIDFdID0geworCTB4MGMwMDQwMDMsIDB4MDAwMDAwMDAsIDB4MDAwMTBmMDQsIDB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDAwMSwgMHgzN2JkZTAwMCwgMHgwM2EwZjAyMSwgMHgzYzEwMDAwMSwKKwkweDI2MTAwMDAwLCAweDBjMDA0MDEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDI3YmRmZmUwLCAweDNjMDRmZWZlLAorCTB4YWZiZjAwMTgsIDB4MGMwMDQyZTgsIDB4MzQ4NDAwMDIsIDB4MGMwMDQzNjQsIDB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsCisJMHg5MDYzMGYzNCwgMHgyNDAyMDAwMiwgMHgzYzA0MDAwMSwgMHgyNDg0MGU5YywgMHgxNDYyMDAwMywgMHgyNDA1MDAwMSwKKwkweDNjMDQwMDAxLCAweDI0ODQwZTkwLCAweDI0MDYwMDAyLCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBjMDA0Mzc4LAorCTB4YWZhMDAwMTQsIDB4MGMwMDQwMmMsIDB4MDAwMDAwMDAsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywgMHhhZmIyMDAxOCwgMHhhZmIxMDAxNCwKKwkweDBjMDA0MmQ0LCAweGFmYjAwMDEwLCAweDNjMTI4MDAwLCAweDI0MTEwMDAxLCAweDhmNzA2ODEwLCAweDMyMDIwNDAwLAorCTB4MTA0MDAwMDcsIDB4MDAwMDAwMDAsIDB4OGY2NDEwMDgsIDB4MDA5MjEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsCisJMHgwYzAwNDA2NCwgMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg5MDQyMGY1NiwgMHgxMDUxMDAwMywgMHgzMjAyMDIwMCwKKwkweDEwNDBmZmYxLCAweDAwMDAwMDAwLCAweDBjMDA0MWI0LCAweDAwMDAwMDAwLCAweDA4MDA0MDM0LCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgyN2JkZmZlMCwgMHgzYzA0MDAwMSwgMHgyNDg0MGViMCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwKKwkweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBjMDA0Mzc4LCAweGFmYTAwMDE0LCAweDAwMDBkMDIxLCAweDI0MDIwMTMwLAorCTB4YWY2MjUwMDAsIDB4M2MwMTAwMDEsIDB4YTQyMDBmNTAsIDB4M2MwMTAwMDEsIDB4YTAyMDBmNTcsIDB4OGZiZjAwMTgsCisJMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwgMHgyNDYzMGY2MCwKKwkweDkwNjIwMDAwLCAweDI3YmRmZmYwLCAweDE0NDAwMDAzLCAweDAwODBjMDIxLCAweDA4MDA0MDczLCAweDAwMDA0ODIxLAorCTB4M2MwMjIwMDAsIDB4MDMwMjEwMjQsIDB4MTA0MDAwMDMsIDB4MjQwOTAwMDIsIDB4MDgwMDQwNzMsIDB4YTA2MDAwMDAsCisJMHgyNDA5MDAwMSwgMHgwMDE4MTA0MCwgMHgzMDQzMWY4MCwgMHgzNDZmODAwOCwgMHgxNTIwMDA0YiwgMHgyNWViMDAyOCwKKwkweDNjMDQwMDAxLCAweDAwODMyMDIxLCAweDhjODQ4MDEwLCAweDNjMDUwMDAxLCAweDI0YTUwZjdhLCAweDAwMDQxNDAyLAorCTB4YTBhMjAwMDAsIDB4M2MwMTAwMDEsIDB4YTAyNDBmN2IsIDB4M2MwMjAwMDEsIDB4MDA0MzEwMjEsIDB4OTQ0MjgwMTQsCisJMHgzYzAxMDAwMSwgMHhhMDIyMGY3YywgMHgzYzBjMDAwMSwgMHgwMTgzNjAyMSwgMHg4ZDhjODAxOCwgMHgzMDQyMDBmZiwKKwkweDI0NDIwMDA4LCAweDAwMDIyMGMzLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGEwMjIwZjYwLCAweDAxMjQxMDJiLAorCTB4MTA0MDAwMGMsIDB4MDAwMDM4MjEsIDB4MjRhNjAwMGUsIDB4MDE2MDI4MjEsIDB4OGNhMjAwMDAsIDB4OGNhMzAwMDQsCisJMHgyNGE1MDAwOCwgMHgyNGU3MDAwMSwgMHhhY2MyMDAwMCwgMHhhY2MzMDAwNCwgMHgwMGU0MTAyYiwgMHgxNDQwZmZmOCwKKwkweDI0YzYwMDA4LCAweDAwMDAzODIxLCAweDNjMDgwMDAxLCAweDI1MDgwZjdiLCAweDkxMDYwMDAwLCAweDNjMDIwMDAxLAorCTB4OTA0MjBmN2MsIDB4MjUwMzAwMGQsIDB4MDBjMzI4MjEsIDB4MDA0NjEwMjMsIDB4MDAwMjFmYzIsIDB4MDA0MzEwMjEsCisJMHgwMDAyMTA0MywgMHgxODQwMDAwYywgMHgwMDAwMjAyMSwgMHg5MTAyMDAwMSwgMHgwMDQ2MTAyMywgMHgwMDAyMWZjMiwKKwkweDAwNDMxMDIxLCAweDAwMDIxODQzLCAweDk0YTIwMDAwLCAweDI0ZTcwMDAxLCAweDAwODIyMDIxLCAweDAwZTMxMDJhLAorCTB4MTQ0MGZmZmIsIDB4MjRhNTAwMDIsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjIwMjEsIDB4MDAwNDE0MDIsCisJMHgwMDgyMjAyMSwgMHgzYzAyZmZmZiwgMHgwMTgyMTAyNCwgMHgzMDgzZmZmZiwgMHgwMDQzMTAyNSwgMHgzYzAxMDAwMSwKKwkweDA4MDA0MGZhLCAweGFjMjIwZjgwLCAweDNjMDUwMDAxLCAweDI0YTUwZjdjLCAweDkwYTIwMDAwLCAweDNjMGMwMDAxLAorCTB4MDE4MzYwMjEsIDB4OGQ4YzgwMTgsIDB4MDAwMjIwYzIsIDB4MTA4MDAwMGUsIDB4MDAwMDM4MjEsIDB4MDE2MDMwMjEsCisJMHgyNGE1MDAwYywgMHg4Y2EyMDAwMCwgMHg4Y2EzMDAwNCwgMHgyNGE1MDAwOCwgMHgyNGU3MDAwMSwgMHhhY2MyMDAwMCwKKwkweGFjYzMwMDA0LCAweDAwZTQxMDJiLCAweDE0NDBmZmY4LCAweDI0YzYwMDA4LCAweDNjMDUwMDAxLCAweDI0YTUwZjdjLAorCTB4OTBhMjAwMDAsIDB4MzA0MzAwMDcsIDB4MjQwMjAwMDQsIDB4MTA2MjAwMTEsIDB4Mjg2MjAwMDUsIDB4MTA0MDAwMDUsCisJMHgyNDAyMDAwMiwgMHgxMDYyMDAwOCwgMHgwMDA3MTBjMCwgMHgwODAwNDBmYSwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwNiwKKwkweDEwNjIwMDBlLCAweDAwMDcxMGMwLCAweDA4MDA0MGZhLCAweDAwMDAwMDAwLCAweDAwYTIxODIxLCAweDk0NjMwMDBjLAorCTB4MDA0YjEwMjEsIDB4MDgwMDQwZmEsIDB4YTQ0MzAwMDAsIDB4MDAwNzEwYzAsIDB4MDBhMjE4MjEsIDB4OGM2MzAwMGMsCisJMHgwMDRiMTAyMSwgMHgwODAwNDBmYSwgMHhhYzQzMDAwMCwgMHgwMGEyMTgyMSwgMHg4YzYzMDAwYywgMHgwMDRiMjAyMSwKKwkweDAwYTIxMDIxLCAweGFjODMwMDAwLCAweDk0NDIwMDEwLCAweGE0ODIwMDA0LCAweDk1ZTcwMDA2LCAweDNjMDIwMDAxLAorCTB4OTA0MjBmN2MsIDB4M2MwMzAwMDEsIDB4OTA2MzBmN2EsIDB4MDBlMmM4MjMsIDB4M2MwMjAwMDEsIDB4OTA0MjBmN2IsCisJMHgyNDYzMDAyOCwgMHgwMWUzNDAyMSwgMHgyNDQyMDAyOCwgMHgxNTIwMDAxMiwgMHgwMWUyMzAyMSwgMHg5NGMyMDAwYywKKwkweDNjMDEwMDAxLCAweGE0MjIwZjc4LCAweDk0YzIwMDA0LCAweDk0YzMwMDA2LCAweDNjMDEwMDAxLCAweGE0MjAwZjc2LAorCTB4M2MwMTAwMDEsIDB4YTQyMDBmNzIsIDB4MDAwMjE0MDAsIDB4MDA0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjBmNmMsCisJMHg5NTAyMDAwNCwgMHgzYzAxMDAwMSwgMHgwODAwNDEyNCwgMHhhNDIyMGY3MCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY3MCwKKwkweDNjMDMwMDAxLCAweDk0NjMwZjcyLCAweDAwNDMxMDIxLCAweGE1MDIwMDA0LCAweDNjMDIwMDAxLCAweDk0NDIwZjZjLAorCTB4YTRjMjAwMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjBmNmMsIDB4YTRjMjAwMDYsIDB4M2MwNDAwMDEsIDB4OTQ4NDBmNzIsCisJMHgzYzAyMDAwMSwgMHg5NDQyMGY3MCwgMHgzYzBhMDAwMSwgMHg5NTRhMGY3NiwgMHgwMDQ0MTgyMSwgMHgzMDYzZmZmZiwKKwkweDAwNjIxODJhLCAweDI0MDIwMDAyLCAweDExMjIwMDBiLCAweDAwODMyMDIzLCAweDNjMDMwMDAxLCAweDk0NjMwZjc4LAorCTB4MzA2MjAwMDksIDB4MTA0MDAwMDYsIDB4MzA2MmZmZjYsIDB4YTRjMjAwMGMsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNzgsCisJMHgzMDQyMDAwOSwgMHgwMTQyNTAyMywgMHgyNDAyMDAwMSwgMHgxMTIyMDAxYiwgMHgyOTIyMDAwMiwgMHg1MDQwMDAwNSwKKwkweDI0MDIwMDAyLCAweDExMjAwMDA3LCAweDMxYTJmZmZmLCAweDA4MDA0MTk3LCAweDAwMDAwMDAwLCAweDExMjIwMDFkLAorCTB4MjQwMjAwMTYsIDB4MDgwMDQxOTcsIDB4MzFhMmZmZmYsIDB4M2MwZTAwMDEsIDB4OTVjZTBmODAsIDB4MTA4MDAwMDUsCisJMHgwMTgwNjgyMSwgMHgwMWM0MjAyMSwgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwgMHgwMDYyNzAyMSwgMHgwMDBlMTAyNywKKwkweGE1MDIwMDBhLCAweDNjMDMwMDAxLCAweDkwNjMwZjdiLCAweDMxYTJmZmZmLCAweDAwZTIxMDIxLCAweDA4MDA0MThkLAorCTB4MDA0MzIwMjMsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmODAsIDB4MDA0NDIwMjEsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsCisJMHgwMDYyMjAyMSwgMHgwMDgwNzAyMSwgMHgwMDA0MTAyNywgMHgwODAwNDE4NSwgMHhhNTAyMDAwYSwgMHgzYzA1MDAwMSwKKwkweDI0YTUwZjdhLCAweDkwYTMwMDAwLCAweDE0NjIwMDAyLCAweDI0ZTJmZmYyLCAweGE1ZTIwMDM0LCAweDkwYTIwMDAwLAorCTB4MDBlMjEwMjMsIDB4YTUwMjAwMDIsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmODAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWEsCisJMHgzMGU1ZmZmZiwgMHgwMDY0MTgyMSwgMHgwMDQ1MTAyMywgMHgwMDYyMjAyMywgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwKKwkweDAwNjIyMDIxLCAweDAwMDQxMDI3LCAweGE1MDIwMDBhLCAweDNjMDMwMDAxLCAweDkwNjMwZjdjLCAweDI0NjIwMDAxLAorCTB4MTRhMjAwMDUsIDB4MDA4MDcwMjEsIDB4MDE2MzEwMjEsIDB4OTA0MjAwMDAsIDB4MDgwMDQxODUsIDB4MDAwMjYyMDAsCisJMHgyNDYyMDAwMiwgMHgxNGEyMDAwMywgMHgzMDYyMDBmZSwgMHgwMDRiMTAyMSwgMHg5NDRjMDAwMCwgMHgzYzAyMDAwMSwKKwkweDk0NDIwZjgyLCAweDMxODNmZmZmLCAweDNjMDQwMDAxLCAweDkwODQwZjdiLCAweDAwNDMxMDIxLCAweDAwZTIxMDIxLAorCTB4MDA0NDIwMjMsIDB4MDA4YTIwMjEsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjIwMjEsIDB4MDAwNDE0MDIsCisJMHgwMDgyMjAyMSwgMHgwMDgwNjgyMSwgMHgwMDA0MTAyNywgMHhhNGMyMDAxMCwgMHgzMWEyZmZmZiwgMHgwMDBlMWMwMCwKKwkweDAwNDMxMDI1LCAweDNjMDQwMDAxLCAweDI0ODQwZjcyLCAweGFkZTIwMDEwLCAweDk0ODIwMDAwLCAweDNjMDUwMDAxLAorCTB4OTRhNTBmNzYsIDB4M2MwMzAwMDEsIDB4OGM2MzBmNmMsIDB4MjQ0MjAwMDEsIDB4MDBiOTI4MjEsIDB4YTQ4MjAwMDAsCisJMHgzMzIyZmZmZiwgMHgwMDYyMjAyMSwgMHgwMDgzMTgyYiwgMHgzYzAxMDAwMSwgMHhhNDI1MGY3NiwgMHgxMDYwMDAwMywKKwkweDI0YTJmZmZmLCAweDNjMDEwMDAxLCAweGE0MjIwZjc2LCAweDNjMDI0MDAwLCAweDAzMDIxMDI1LCAweDNjMDEwMDAxLAorCTB4YWMyNDBmNmMsIDB4YWY2MjEwMDgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTAsIDB4M2MwMzAwMDEsIDB4OTA2MzBmNTYsCisJMHgyN2JkZmZlOCwgMHgyNDAyMDAwMSwgMHhhZmJmMDAxNCwgMHgxMDYyMDAyNiwgMHhhZmIwMDAxMCwgMHg4ZjYyMGNmNCwKKwkweDI0NDJmZmZmLCAweDMwNDIwMDdmLCAweDAwMDIxMTAwLCAweDhjNDM0MDAwLCAweDNjMDEwMDAxLCAweGFjMjMwZjY0LAorCTB4OGM0MzQwMDgsIDB4MjQ0NDQwMDAsIDB4OGM1YzQwMDQsIDB4MzA2MjAwNDAsIDB4MTQ0MDAwMDIsIDB4MjQwMjAwODgsCisJMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHhhNDIyMGY2OCwgMHgzMDYyMDAwNCwgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwKKwkweDNjMDEwMDAxLCAweGEwMjIwZjU3LCAweDA4MDA0MWQ1LCAweDAwMDMxNDAyLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LAorCTB4MDAwMzE0MDIsIDB4M2MwMTAwMDEsIDB4YTQyMjBmNTQsIDB4OTQ4MzAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCisJMHhhNDIwMGY1MCwgMHgzYzAxMDAwMSwgMHhhMDIyMGY1NiwgMHgzYzAxMDAwMSwgMHhhNDIzMGY2MiwgMHgyNDAyMDAwMSwKKwkweDEzNDIwMDFlLCAweDAwMDAwMDAwLCAweDEzNDAwMDA1LCAweDI0MDIwMDAzLCAweDEzNDIwMDY3LCAweDAwMDAwMDAwLAorCTB4MDgwMDQyY2YsIDB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjIsIDB4MjQxYTAwMDEsIDB4M2MwMTAwMDEsCisJMHhhNDIwMGY1ZSwgMHgzYzAxMDAwMSwgMHhhNDIwMGY1MiwgMHgzMDQ0MDdmZiwgMHgwMDAyMWJjMiwgMHgwMDAzMTgyMywKKwkweDMwNjMwMDNlLCAweDM0NjMwMDM2LCAweDAwMDIxMjQyLCAweDMwNDIwMDNjLCAweDAwNjIxODIxLCAweDNjMDEwMDAxLAorCTB4YTQyNDBmNTgsIDB4MDA4MzIwMjEsIDB4MjQ2MzAwMzAsIDB4M2MwMTAwMDEsIDB4YTQyNDBmNWEsIDB4M2MwMTAwMDEsCisJMHhhNDIzMGY1YywgMHgzYzA2MDAwMSwgMHgyNGM2MGY1MiwgMHg5NGM1MDAwMCwgMHg5NGMzMDAwMiwgMHgzYzA0MDAwMSwKKwkweDk0ODQwZjVhLCAweDAwNjUxMDIxLCAweDAwNDQxMDJhLCAweDEwNDAwMDEzLCAweDNjMTA4MDAwLCAweDAwYTMxMDIxLAorCTB4YTRjMjAwMDAsIDB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsIDB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsCisJMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwgMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwKKwkweDAwNTAxMDI0LCAweDEwNDAwMGI3LCAweDAwMDAwMDAwLCAweDA4MDA0MjBmLCAweDAwMDAwMDAwLCAweDNjMDMwMDAxLAorCTB4OTQ2MzBmNTAsIDB4MDA4NTEwMjMsIDB4YTRjNDAwMDAsIDB4MDA2MjE4MjEsIDB4MzA0MmZmZmYsIDB4M2MwMTAwMDEsCisJMHhhNDIzMGY1MCwgMHhhZjYyMGNlOCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzNDQyMDAyNCwgMHhhZjYyMGNlYywKKwkweDk0YzMwMDAyLCAweDNjMDIwMDAxLCAweDk0NDIwZjUwLCAweDE0NjIwMDEyLCAweDNjMDI4MDAwLCAweDNjMTA4MDAwLAorCTB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsIDB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsCisJMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwgMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwKKwkweDE0NDBmZmY3LCAweDAwMDAwMDAwLCAweDA4MDA0MmNmLCAweDI0MWEwMDAzLCAweGFmNjIwY2Y0LCAweDNjMTA4MDAwLAorCTB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsCisJMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHgwODAwNDJjZiwgMHgyNDFhMDAwMywKKwkweDNjMDcwMDAxLCAweDI0ZTcwZjUwLCAweDk0ZTIwMDAwLCAweDAzODIxMDIxLCAweGFmNjIwY2UwLCAweDNjMDIwMDAxLAorCTB4OGM0MjBmNjQsIDB4YWY2MjBjZTQsIDB4M2MwNTAwMDEsIDB4OTRhNTBmNTQsIDB4OTRlMzAwMDAsIDB4M2MwNDAwMDEsCisJMHg5NDg0MGY1OCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1ZSwgMHgwMGEzMjgyMywgMHgwMDgyMjAyMywgMHgzMGE2ZmZmZiwKKwkweDMwODNmZmZmLCAweDAwYzMxMDJiLCAweDE0NDAwMDQzLCAweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDk0NDIwZjVjLAorCTB4MDAwMjE0MDAsIDB4MDA2MjEwMjUsIDB4YWY2MjBjZTgsIDB4OTRlMjAwMDAsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmNTQsCisJMHgwMDQ0MTAyMSwgMHhhNGUyMDAwMCwgMHgzMDQyZmZmZiwgMHgxNDQzMDAyMSwgMHgzYzAyMDAwOCwgMHgzYzAyMDAwMSwKKwkweDkwNDIwZjU3LCAweDEwNDAwMDA2LCAweDNjMDMwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDM0NjMwNjI0LAorCTB4MDgwMDQyN2MsIDB4MDAwMGQwMjEsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4M2MwMzAwMDgsIDB4MzQ2MzA2MjQsCisJMHgwMDQzMTAyNSwgMHhhZjYyMGNlYywgMHgzYzEwODAwMCwgMHgzYzAyYTAwMCwgMHhhZjYyMGNmNCwgMHgzYzAxMDAwMSwKKwkweGEwMjAwZjU2LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LAorCTB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTA0MDAwMTUsIDB4MDAwMDAwMDAsIDB4MDgwMDQyODMsCisJMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwgMHg5NDYzMGY2OCwgMHgzNDQyMDYyNCwgMHgzYzEwODAwMCwgMHgwMDYyMTgyNSwKKwkweDNjMDI4MDAwLCAweGFmNjMwY2VjLCAweGFmNjIwY2Y0LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLAorCTB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTQ0MGZmZjcsCisJMHgwMDAwMDAwMCwgMHgzYzAxMDAwMSwgMHgwODAwNDJjZiwgMHhhNDIwMGY1ZSwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1YywKKwkweDAwMDIxNDAwLCAweDAwYzIxMDI1LCAweGFmNjIwY2U4LCAweDNjMDIwMDAxLCAweDkwNDIwZjU3LCAweDEwNDAwMDA5LAorCTB4M2MwMzAwMGMsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4MzQ2MzA2MjQsIDB4MDAwMGQwMjEsIDB4MDA0MzEwMjUsCisJMHhhZjYyMGNlYywgMHgwODAwNDJjMSwgMHgzYzEwODAwMCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzYzAzMDAwOCwKKwkweDM0NjMwNjA0LCAweDAwNDMxMDI1LCAweGFmNjIwY2VjLCAweDNjMDIwMDAxLCAweDk0NDIwZjVlLCAweDAwNDUxMDIxLAorCTB4M2MwMTAwMDEsIDB4YTQyMjBmNWUsIDB4M2MxMDgwMDAsIDB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsCisJMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwKKwkweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDE0NDBmZmY3LCAweDAwMDAwMDAwLCAweDhmYmYwMDE0LAorCTB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4M2MwNDAwMDEsCisJMHgyNDg0MGVjMCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwKKwkweDBjMDA0Mzc4LCAweGFmYTAwMDE0LCAweDAwMDBkMDIxLCAweDI0MDIwMTMwLCAweGFmNjI1MDAwLCAweDNjMDEwMDAxLAorCTB4YTQyMDBmNTAsIDB4M2MwMTAwMDEsIDB4YTAyMDBmNTcsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgyN2JkZmZlOCwgMHgzYzFiYzAwMCwgMHhhZmJmMDAxNCwgMHhhZmIwMDAxMCwgMHhhZjYwNjgwYywgMHg4ZjYyNjgwNCwKKwkweDM0NDIwMDgyLCAweGFmNjI2ODA0LCAweDhmNjM0MDAwLCAweDI0MDIwYjUwLCAweDNjMDEwMDAxLCAweGFjMjIwZjIwLAorCTB4MjQwMjBiNzgsIDB4M2MwMTAwMDEsIDB4YWMyMjBmMzAsIDB4MzQ2MzAwMDIsIDB4YWY2MzQwMDAsIDB4MGMwMDQzMTUsCisJMHgwMDgwODAyMSwgMHgzYzAxMDAwMSwgMHhhMDIyMGYzNCwgMHgzMDQyMDBmZiwgMHgyNDAzMDAwMiwgMHgxNDQzMDAwNSwKKwkweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDhjNDIwZjIwLCAweDA4MDA0MzA4LCAweGFjNTAwMGMwLCAweDNjMDIwMDAxLAorCTB4OGM0MjBmMjAsIDB4YWM1MDAwYmMsIDB4OGY2MjQ0MzQsIDB4OGY2MzQ0MzgsIDB4OGY2NDQ0MTAsIDB4M2MwMTAwMDEsCisJMHhhYzIyMGYyOCwgMHgzYzAxMDAwMSwgMHhhYzIzMGYzOCwgMHgzYzAxMDAwMSwgMHhhYzI0MGYyNCwgMHg4ZmJmMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAzZTAwMDA4LCAweDI0MDIwMDAxLCAweDI3YmRmZmY4LAorCTB4MTg4MDAwMDksIDB4MDAwMDI4MjEsIDB4OGY2MzY4MGMsIDB4OGY2MjY4MGMsIDB4MTA0M2ZmZmUsIDB4MDAwMDAwMDAsCisJMHgyNGE1MDAwMSwgMHgwMGE0MTAyYSwgMHgxNDQwZmZmOSwgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAwOCwKKwkweDhmNjM0NDUwLCAweDNjMDIwMDAxLCAweDhjNDIwZjI4LCAweDAwMDMxYzAyLCAweDAwNDMxMDJiLCAweDE0NDAwMDA4LAorCTB4M2MwMzgwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDBmMzgsIDB4OGY2MjQ0NTAsIDB4MDAwMjFjMDIsIDB4MDA4MzEwMmIsCisJMHgxMDQwZmZmYywgMHgzYzAzODAwMCwgMHhhZjYzNDQ0NCwgMHg4ZjYyNDQ0NCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDhmNjI0NDQ4LCAweDAzZTAwMDA4LCAweDMwNDJmZmZmLCAweDMwODJmZmZmLCAweDI0NDJlMDAwLAorCTB4MmM0MjIwMDEsIDB4MTQ0MDAwMDMsIDB4M2MwMjQwMDAsIDB4MDgwMDQzNDcsIDB4MjQwMmZmZmYsIDB4MDA4MjIwMjUsCisJMHhhZjY0NWMzOCwgMHg4ZjYyNWMzMCwgMHgzMDQyMDAwMiwgMHgxNDQwZmZmYywgMHgwMDAwMTAyMSwgMHgwM2UwMDAwOCwKKwkweDAwMDAwMDAwLCAweDhmNjI0NDUwLCAweDNjMDMwMDAxLCAweDhjNjMwZjI0LCAweDA4MDA0MzUwLCAweDMwNDJmZmZmLAorCTB4OGY2MjQ0NTAsIDB4MzA0MmZmZmYsIDB4MDA0MzEwMmIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHgwMDgwMjgyMSwgMHgzYzA0MDAwMSwgMHgyNDg0MGVkMCwgMHgwMDAwMzAyMSwKKwkweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBjMDA0Mzc4LCAweGFmYTAwMDE0LCAweDA4MDA0MzVmLAorCTB4MDAwMDAwMDAsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2MwMjAwMDEsIDB4MzQ0MmQ2MDAsCisJMHgzYzAzMDAwMSwgMHgzNDYzZDYwMCwgMHgzYzA0MDAwMSwgMHgzNDg0ZGRmZiwgMHgzYzAxMDAwMSwgMHhhYzIyMGY0MCwKKwkweDI0MDIwMDQwLCAweDNjMDEwMDAxLCAweGFjMjIwZjQ0LCAweDNjMDEwMDAxLCAweGFjMjAwZjNjLCAweGFjNjAwMDAwLAorCTB4MjQ2MzAwMDQsIDB4MDA4MzEwMmIsIDB4NTA0MGZmZmQsIDB4YWM2MDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsCisJMHgwMDgwNDgyMSwgMHg4ZmFhMDAxMCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYzYywgMHgzYzA0MDAwMSwgMHg4Yzg0MGY0NCwKKwkweDhmYWIwMDE0LCAweDI0NDMwMDAxLCAweDAwNDQxMDJiLCAweDNjMDEwMDAxLCAweGFjMjMwZjNjLCAweDE0NDAwMDAzLAorCTB4MDAwMDQwMjEsIDB4M2MwMTAwMDEsIDB4YWMyMDBmM2MsIDB4M2MwMjAwMDEsIDB4OGM0MjBmM2MsIDB4M2MwMzAwMDEsCisJMHg4YzYzMGY0MCwgMHg5MTI0MDAwMCwgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHgwMDQ4MTAyMSwgMHgyNTA4MDAwMSwKKwkweGEwNDQwMDAwLCAweDI5MDIwMDA4LCAweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwMDAxLCAweDhjNDIwZjNjLAorCTB4M2MwMzAwMDEsIDB4OGM2MzBmNDAsIDB4OGY2NDY4MGMsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4YWM0NDAwMDgsCisJMHhhYzQ1MDAwYywgMHhhYzQ2MDAxMCwgMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgwM2UwMDAwOCwgMHhhYzRiMDAxYywKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIHUzMiB0ZzNUc281RndSb2RhdGFbKFRHM19UU081X0ZXX1JPREFUQV9MRU4gLyA0KSArIDFdID0geworCTB4NGQ2MTY5NmUsIDB4NDM3MDc1NDIsIDB4MDAwMDAwMDAsIDB4NGQ2MTY5NmUsIDB4NDM3MDc1NDEsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDczNzQ2YjZmLCAweDY2NjY2YzY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgdTMyIHRnM1RzbzVGd0RhdGFbKFRHM19UU081X0ZXX0RBVEFfTEVOIC8gNCkgKyAxXSA9IHsKKwkweDAwMDAwMDAwLCAweDczNzQ2YjZmLCAweDY2NjY2YzY0LCAweDVmNzYzMTJlLCAweDMyMmUzMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfbG9hZF90c29fZmlybXdhcmUoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IGZ3X2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGNwdV9iYXNlLCBjcHVfc2NyYXRjaF9iYXNlLCBjcHVfc2NyYXRjaF9zaXplOworCWludCBlcnIsIGk7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCXJldHVybiAwOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCWluZm8udGV4dF9iYXNlID0gVEczX1RTTzVfRldfVEVYVF9BRERSOworCQlpbmZvLnRleHRfbGVuID0gVEczX1RTTzVfRldfVEVYVF9MRU47CisJCWluZm8udGV4dF9kYXRhID0gJnRnM1RzbzVGd1RleHRbMF07CisJCWluZm8ucm9kYXRhX2Jhc2UgPSBURzNfVFNPNV9GV19ST0RBVEFfQUREUjsKKwkJaW5mby5yb2RhdGFfbGVuID0gVEczX1RTTzVfRldfUk9EQVRBX0xFTjsKKwkJaW5mby5yb2RhdGFfZGF0YSA9ICZ0ZzNUc281RndSb2RhdGFbMF07CisJCWluZm8uZGF0YV9iYXNlID0gVEczX1RTTzVfRldfREFUQV9BRERSOworCQlpbmZvLmRhdGFfbGVuID0gVEczX1RTTzVfRldfREFUQV9MRU47CisJCWluZm8uZGF0YV9kYXRhID0gJnRnM1RzbzVGd0RhdGFbMF07CisJCWNwdV9iYXNlID0gUlhfQ1BVX0JBU0U7CisJCWNwdV9zY3JhdGNoX2Jhc2UgPSBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRTU3MDU7CisJCWNwdV9zY3JhdGNoX3NpemUgPSAoaW5mby50ZXh0X2xlbiArCisJCQkJICAgIGluZm8ucm9kYXRhX2xlbiArCisJCQkJICAgIGluZm8uZGF0YV9sZW4gKworCQkJCSAgICBURzNfVFNPNV9GV19TQlNTX0xFTiArCisJCQkJICAgIFRHM19UU081X0ZXX0JTU19MRU4pOworCX0gZWxzZSB7CisJCWluZm8udGV4dF9iYXNlID0gVEczX1RTT19GV19URVhUX0FERFI7CisJCWluZm8udGV4dF9sZW4gPSBURzNfVFNPX0ZXX1RFWFRfTEVOOworCQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNUc29Gd1RleHRbMF07CisJCWluZm8ucm9kYXRhX2Jhc2UgPSBURzNfVFNPX0ZXX1JPREFUQV9BRERSOworCQlpbmZvLnJvZGF0YV9sZW4gPSBURzNfVFNPX0ZXX1JPREFUQV9MRU47CisJCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczVHNvRndSb2RhdGFbMF07CisJCWluZm8uZGF0YV9iYXNlID0gVEczX1RTT19GV19EQVRBX0FERFI7CisJCWluZm8uZGF0YV9sZW4gPSBURzNfVFNPX0ZXX0RBVEFfTEVOOworCQlpbmZvLmRhdGFfZGF0YSA9ICZ0ZzNUc29Gd0RhdGFbMF07CisJCWNwdV9iYXNlID0gVFhfQ1BVX0JBU0U7CisJCWNwdV9zY3JhdGNoX2Jhc2UgPSBUWF9DUFVfU0NSQVRDSF9CQVNFOworCQljcHVfc2NyYXRjaF9zaXplID0gVFhfQ1BVX1NDUkFUQ0hfU0laRTsKKwl9CisKKwllcnIgPSB0ZzNfbG9hZF9maXJtd2FyZV9jcHUodHAsIGNwdV9iYXNlLAorCQkJCSAgICBjcHVfc2NyYXRjaF9iYXNlLCBjcHVfc2NyYXRjaF9zaXplLAorCQkJCSAgICAmaW5mbyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIE5vdyBzdGFydHVwIHRoZSBjcHUuICovCisJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMl9mKGNwdV9iYXNlICsgQ1BVX1BDLCAgICBpbmZvLnRleHRfYmFzZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmICh0cjMyKGNwdV9iYXNlICsgQ1BVX1BDKSA9PSBpbmZvLnRleHRfYmFzZSkKKwkJCWJyZWFrOworCQl0dzMyKGNwdV9iYXNlICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJdHczMihjcHVfYmFzZSArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7CisJCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgICAgaW5mby50ZXh0X2Jhc2UpOworCQl1ZGVsYXkoMTAwMCk7CisJfQorCWlmIChpID49IDUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX2xvYWRfdHNvX2Zpcm13YXJlIGZhaWxzIGZvciAlcyAiCisJCSAgICAgICAidG8gc2V0IENQVSBQQywgaXMgJTA4eCBzaG91bGQgYmUgJTA4eFxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHRyMzIoY3B1X2Jhc2UgKyBDUFVfUEMpLAorCQkgICAgICAgaW5mby50ZXh0X2Jhc2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMl9mKGNwdV9iYXNlICsgQ1BVX01PREUsICAweDAwMDAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFRHM19UU09fU1VQUE9SVCAhPSAwICovCisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfbWFjX2FkZHIoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGFkZHJfaGlnaCwgYWRkcl9sb3c7CisJaW50IGk7CisKKwlhZGRyX2hpZ2ggPSAoKHRwLT5kZXYtPmRldl9hZGRyWzBdIDw8IDgpIHwKKwkJICAgICB0cC0+ZGV2LT5kZXZfYWRkclsxXSk7CisJYWRkcl9sb3cgPSAoKHRwLT5kZXYtPmRldl9hZGRyWzJdIDw8IDI0KSB8CisJCSAgICAodHAtPmRldi0+ZGV2X2FkZHJbM10gPDwgMTYpIHwKKwkJICAgICh0cC0+ZGV2LT5kZXZfYWRkcls0XSA8PCAgOCkgfAorCQkgICAgKHRwLT5kZXYtPmRldl9hZGRyWzVdIDw8ICAwKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl0dzMyKE1BQ19BRERSXzBfSElHSCArIChpICogOCksIGFkZHJfaGlnaCk7CisJCXR3MzIoTUFDX0FERFJfMF9MT1cgKyAoaSAqIDgpLCBhZGRyX2xvdyk7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCQl0dzMyKE1BQ19FWFRBRERSXzBfSElHSCArIChpICogOCksIGFkZHJfaGlnaCk7CisJCQl0dzMyKE1BQ19FWFRBRERSXzBfTE9XICsgKGkgKiA4KSwgYWRkcl9sb3cpOworCQl9CisJfQorCisJYWRkcl9oaWdoID0gKHRwLT5kZXYtPmRldl9hZGRyWzBdICsKKwkJICAgICB0cC0+ZGV2LT5kZXZfYWRkclsxXSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbMl0gKworCQkgICAgIHRwLT5kZXYtPmRldl9hZGRyWzNdICsKKwkJICAgICB0cC0+ZGV2LT5kZXZfYWRkcls0XSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbNV0pICYKKwkJVFhfQkFDS09GRl9TRUVEX01BU0s7CisJdHczMihNQUNfVFhfQkFDS09GRl9TRUVELCBhZGRyX2hpZ2gpOworfQorCitzdGF0aWMgaW50IHRnM19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlfX3RnM19zZXRfbWFjX2FkZHIodHApOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCB0ZzNfc2V0X2JkaW5mbyhzdHJ1Y3QgdGczICp0cCwgdTMyIGJkaW5mb19hZGRyLAorCQkJICAgZG1hX2FkZHJfdCBtYXBwaW5nLCB1MzIgbWF4bGVuX2ZsYWdzLAorCQkJICAgdTMyIG5pY19hZGRyKQoreworCXRnM193cml0ZV9tZW0odHAsCisJCSAgICAgIChiZGluZm9fYWRkciArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdIKSwKKwkJICAgICAgKCh1NjQpIG1hcHBpbmcgPj4gMzIpKTsKKwl0ZzNfd3JpdGVfbWVtKHRwLAorCQkgICAgICAoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XKSwKKwkJICAgICAgKCh1NjQpIG1hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJdGczX3dyaXRlX21lbSh0cCwKKwkJICAgICAgKGJkaW5mb19hZGRyICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MpLAorCQkgICAgICAgbWF4bGVuX2ZsYWdzKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkKKwkJdGczX3dyaXRlX21lbSh0cCwKKwkJCSAgICAgIChiZGluZm9fYWRkciArIFRHM19CRElORk9fTklDX0FERFIpLAorCQkJICAgICAgbmljX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX3Jlc2V0X2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiB2YWwsIHJkbWFjX21vZGU7CisJaW50IGksIGVyciwgbGltaXQ7CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRnM19zdG9wX2Z3KHRwKTsKKworCXRnM193cml0ZV9zaWdfcHJlX3Jlc2V0KHRwLCBSRVNFVF9LSU5EX0lOSVQpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSB7CisJCWVyciA9IHRnM19hYm9ydF9odyh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHRnM19jaGlwX3Jlc2V0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdGczX3dyaXRlX3NpZ19sZWdhY3kodHAsIFJFU0VUX0tJTkRfSU5JVCk7CisKKwkvKiBUaGlzIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aXRoIEF0aGxvbiBjaGlwc2V0cyBvbgorCSAqIEIzIHRpZ29uMyBzaWxpY29uLiAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBvbiBhbnkKKwkgKiBvdGhlciByZXZpc2lvbi4gIEJ1dCBkbyBub3Qgc2V0IHRoaXMgb24gUENJIEV4cHJlc3MKKwkgKiBjaGlwcy4KKwkgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkKKwkJdHAtPnBjaV9jbG9ja19jdHJsIHw9IENMT0NLX0NUUkxfREVMQVlfUENJX0dSQU5UOworCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkpIHsKKwkJdmFsID0gdHIzMihURzNQQ0lfUENJU1RBVEUpOworCQl2YWwgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJCXR3MzIoVEczUENJX1BDSVNUQVRFLCB2YWwpOworCX0KKworCWlmIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81NzA0X0JYKSB7CisJCS8qIEVuYWJsZSBzb21lIGh3IGZpeGVzLiAgKi8KKwkJdmFsID0gdHIzMihURzNQQ0lfTVNJX0RBVEEpOworCQl2YWwgfD0gKDEgPDwgMjYpIHwgKDEgPDwgMjgpIHwgKDEgPDwgMjkpOworCQl0dzMyKFRHM1BDSV9NU0lfREFUQSwgdmFsKTsKKwl9CisKKwkvKiBEZXNjcmlwdG9yIHJpbmcgaW5pdCBtYXkgbWFrZSBhY2Nlc3NlcyB0byB0aGUKKwkgKiBOSUMgU1JBTSBhcmVhIHRvIHNldHVwIHRoZSBUWCBkZXNjcmlwdG9ycywgc28gd2UKKwkgKiBjYW4gb25seSBkbyB0aGlzIGFmdGVyIHRoZSBoYXJkd2FyZSBoYXMgYmVlbgorCSAqIHN1Y2Nlc3NmdWxseSByZXNldC4KKwkgKi8KKwl0ZzNfaW5pdF9yaW5ncyh0cCk7CisKKwkvKiBUaGlzIHZhbHVlIGlzIGRldGVybWluZWQgZHVyaW5nIHRoZSBwcm9iZSB0aW1lIERNQQorCSAqIGVuZ2luZSB0ZXN0LCB0ZzNfdGVzdF9kbWEuCisJICovCisJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKworCXRwLT5ncmNfbW9kZSAmPSB+KEdSQ19NT0RFX0hPU1RfU0VOREJEUyB8CisJCQkgIEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTIHwKKwkJCSAgR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNIHwKKwkJCSAgR1JDX01PREVfTk9fUlhfUEhEUl9DU1VNKTsKKwl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfSE9TVF9TRU5EQkRTOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTk9fVFhfUFNFVURPX0NTVU0pCisJCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU07CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OT19SWF9QU0VVRE9fQ1NVTSkKKwkJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTTsKKworCXR3MzIoR1JDX01PREUsCisJICAgICB0cC0+Z3JjX21vZGUgfAorCSAgICAgKEdSQ19NT0RFX0lSUV9PTl9NQUNfQVRUTiB8IEdSQ19NT0RFX0hPU1RfU1RBQ0tVUCkpOworCisJLyogU2V0dXAgdGhlIHRpbWVyIHByZXNjYWxhciByZWdpc3Rlci4gIENsb2NrIGlzIGFsd2F5cyA2Nk1oei4gKi8KKwl2YWwgPSB0cjMyKEdSQ19NSVNDX0NGRyk7CisJdmFsICY9IH4weGZmOworCXZhbCB8PSAoNjUgPDwgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9TSElGVCk7CisJdHczMihHUkNfTUlTQ19DRkcsIHZhbCk7CisKKwkvKiBJbml0aWFsaXplIE1CVUYvREVTQyBwb29sLiAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkvKiBEbyBub3RoaW5nLiAgKi8KKwl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCXR3MzIoQlVGTUdSX01CX1BPT0xfQUREUiwgTklDX1NSQU1fTUJVRl9QT09MX0JBU0UpOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpCisJCQl0dzMyKEJVRk1HUl9NQl9QT09MX1NJWkUsIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNjQpOworCQllbHNlCisJCQl0dzMyKEJVRk1HUl9NQl9QT09MX1NJWkUsIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFOTYpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRSk7CisJCXR3MzIoQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRSwgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFKTsKKwl9CisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwllbHNlIGlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSB7CisJCWludCBmd19sZW47CisKKwkJZndfbGVuID0gKFRHM19UU081X0ZXX1RFWFRfTEVOICsKKwkJCSAgVEczX1RTTzVfRldfUk9EQVRBX0xFTiArCisJCQkgIFRHM19UU081X0ZXX0RBVEFfTEVOICsKKwkJCSAgVEczX1RTTzVfRldfU0JTU19MRU4gKworCQkJICBURzNfVFNPNV9GV19CU1NfTEVOKTsKKwkJZndfbGVuID0gKGZ3X2xlbiArICgweDgwIC0gMSkpICYgfigweDgwIC0gMSk7CisJCXR3MzIoQlVGTUdSX01CX1BPT0xfQUREUiwKKwkJICAgICBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRTU3MDUgKyBmd19sZW4pOworCQl0dzMyKEJVRk1HUl9NQl9QT09MX1NJWkUsCisJCSAgICAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU1NzA1IC0gZndfbGVuIC0gMHhhMDApOworCX0KKyNlbmRpZgorCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0pVTUJPX0VOQUJMRSkpIHsKKwkJdHczMihCVUZNR1JfTUJfUkRNQV9MT1dfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXIpOworCQl0dzMyKEJVRk1HUl9NQl9NQUNSWF9MT1dfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfSElHSF9XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX2hpZ2hfd2F0ZXIpOworCX0gZWxzZSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyX2p1bWJvKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyX2p1bWJvKTsKKwl9CisJdHczMihCVUZNR1JfRE1BX0xPV19XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9sb3dfd2F0ZXIpOworCXR3MzIoQlVGTUdSX0RNQV9ISUdIX1dBVEVSLAorCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcuZG1hX2hpZ2hfd2F0ZXIpOworCisJdHczMihCVUZNR1JfTU9ERSwgQlVGTUdSX01PREVfRU5BQkxFIHwgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUpOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKHRyMzIoQlVGTUdSX01PREUpICYgQlVGTUdSX01PREVfRU5BQkxFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpID49IDIwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX3Jlc2V0X2h3IGNhbm5vdCBlbmFibGUgQlVGTUdSIGZvciAlcy5cbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogU2V0dXAgcmVwbGVuaXNoIHRocmVzaG9sZC4gKi8KKwl0dzMyKFJDVkJESV9TVERfVEhSRVNILCB0cC0+cnhfcGVuZGluZyAvIDgpOworCisJLyogSW5pdGlhbGl6ZSBURzNfQkRJTkZPJ3MgYXQ6CisJICogIFJDVkRCRElfU1REX0JEOglzdGFuZGFyZCBldGggc2l6ZSByeCByaW5nCisJICogIFJDVkRCRElfSlVNQk9fQkQ6CWp1bWJvIGZyYW1lIHJ4IHJpbmcKKwkgKiAgUkNWREJESV9NSU5JX0JEOglzbWFsbCBmcmFtZSByeCByaW5nICg/Pz8gZG9lcyBub3Qgd29yaykKKwkgKgorCSAqIGxpa2Ugc286CisJICogIFRHM19CRElORk9fSE9TVF9BRERSOgloaWdoL2xvdyBwYXJ0cyBvZiBETUEgYWRkcmVzcyBvZiByaW5nCisJICogIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTOgkocnggbWF4IGJ1ZmZlciBzaXplIDw8IDE2KSB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nIGF0dHJpYnV0ZSBmbGFncworCSAqICBURzNfQkRJTkZPX05JQ19BRERSOglsb2NhdGlvbiBvZiBkZXNjcmlwdG9ycyBpbiBuaWMgU1JBTQorCSAqCisJICogU3RhbmRhcmQgcmVjZWl2ZSByaW5nIEAgTklDX1NSQU1fUlhfQlVGRkVSX0RFU0MsIDUxMiBlbnRyaWVzLgorCSAqIEp1bWJvIHJlY2VpdmUgcmluZyBAIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDLCAyNTYgZW50cmllcy4KKwkgKgorCSAqIFRoZSBzaXplIG9mIGVhY2ggcmluZyBpcyBmaXhlZCBpbiB0aGUgZmlybXdhcmUsIGJ1dCB0aGUgbG9jYXRpb24gaXMKKwkgKiBjb25maWd1cmFibGUuCisJICovCisJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILAorCSAgICAgKCh1NjQpIHRwLT5yeF9zdGRfbWFwcGluZyA+PiAzMikpOworCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCSAgICAgKCh1NjQpIHRwLT5yeF9zdGRfbWFwcGluZyAmIDB4ZmZmZmZmZmYpKTsKKwl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19OSUNfQUREUiwKKwkgICAgIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDKTsKKworCS8qIERvbid0IGV2ZW4gdHJ5IHRvIHByb2dyYW0gdGhlIEpVTUJPL01JTkkgYnVmZmVyIGRlc2NyaXB0b3IKKwkgKiBjb25maWdzIG9uIDU3MDUuCisJICovCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSB7CisJCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJICAgICBSWF9TVERfTUFYX1NJWkVfNTcwNSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKTsKKwl9IGVsc2UgeworCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCSAgICAgUlhfU1REX01BWF9TSVpFIDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpOworCisJCXR3MzIoUkNWREJESV9NSU5JX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCSAgICAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKworCQkvKiBTZXR1cCByZXBsZW5pc2ggdGhyZXNob2xkLiAqLworCQl0dzMyKFJDVkJESV9KVU1CT19USFJFU0gsIHRwLT5yeF9qdW1ib19wZW5kaW5nIC8gOCk7CisKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpIHsKKwkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILAorCQkJICAgICAoKHU2NCkgdHAtPnJ4X2p1bWJvX21hcHBpbmcgPj4gMzIpKTsKKwkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJCQkgICAgICgodTY0KSB0cC0+cnhfanVtYm9fbWFwcGluZyAmIDB4ZmZmZmZmZmYpKTsKKwkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkJICAgICBSWF9KVU1CT19NQVhfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKTsKKwkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fTklDX0FERFIsCisJCQkgICAgIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDKTsKKwkJfSBlbHNlIHsKKwkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkJICAgICBCRElORk9fRkxBR1NfRElTQUJMRUQpOworCQl9CisKKwl9CisKKwkvKiBUaGVyZSBpcyBvbmx5IG9uZSBzZW5kIHJpbmcgb24gNTcwNS81NzUwLCBubyBuZWVkIHRvIGV4cGxpY2l0bHkKKwkgKiBkaXNhYmxlIHRoZSBvdGhlcnMuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCS8qIENsZWFyIG91dCBzZW5kIFJDQiByaW5nIGluIFNSQU0uICovCisJCWZvciAoaSA9IE5JQ19TUkFNX1NFTkRfUkNCOyBpIDwgTklDX1NSQU1fUkNWX1JFVF9SQ0I7IGkgKz0gVEczX0JESU5GT19TSVpFKQorCQkJdGczX3dyaXRlX21lbSh0cCwgaSArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkJCSAgICAgIEJESU5GT19GTEFHU19ESVNBQkxFRCk7CisJfQorCisJdHAtPnR4X3Byb2QgPSAwOworCXRwLT50eF9jb25zID0gMDsKKwl0dzMyX21haWxib3goTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisJdHczMl90eF9tYm94KE1BSUxCT1hfU05ETklDX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisKKwl0ZzNfc2V0X2JkaW5mbyh0cCwgTklDX1NSQU1fU0VORF9SQ0IsCisJCSAgICAgICB0cC0+dHhfZGVzY19tYXBwaW5nLAorCQkgICAgICAgKFRHM19UWF9SSU5HX1NJWkUgPDwKKwkJCUJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpLAorCQkgICAgICAgTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MpOworCisJLyogVGhlcmUgaXMgb25seSBvbmUgcmVjZWl2ZSByZXR1cm4gcmluZyBvbiA1NzA1LzU3NTAsIG5vIG5lZWQKKwkgKiB0byBleHBsaWNpdGx5IGRpc2FibGUgdGhlIG90aGVycy4KKwkgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJZm9yIChpID0gTklDX1NSQU1fUkNWX1JFVF9SQ0I7IGkgPCBOSUNfU1JBTV9TVEFUU19CTEs7CisJCSAgICAgaSArPSBURzNfQkRJTkZPX1NJWkUpIHsKKwkJCXRnM193cml0ZV9tZW0odHAsIGkgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCQkgICAgICBCRElORk9fRkxBR1NfRElTQUJMRUQpOworCQl9CisJfQorCisJdHAtPnJ4X3JjYl9wdHIgPSAwOworCXR3MzJfcnhfbWJveChNQUlMQk9YX1JDVlJFVF9DT05fSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisKKwl0ZzNfc2V0X2JkaW5mbyh0cCwgTklDX1NSQU1fUkNWX1JFVF9SQ0IsCisJCSAgICAgICB0cC0+cnhfcmNiX21hcHBpbmcsCisJCSAgICAgICAoVEczX1JYX1JDQl9SSU5HX1NJWkUodHApIDw8CisJCQlCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKSwKKwkJICAgICAgIDApOworCisJdHAtPnJ4X3N0ZF9wdHIgPSB0cC0+cnhfcGVuZGluZzsKKwl0dzMyX3J4X21ib3goTUFJTEJPWF9SQ1ZfU1REX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgdHAtPnJ4X3N0ZF9wdHIpOworCisJdHAtPnJ4X2p1bWJvX3B0ciA9ICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSA/CisJCQkJCQl0cC0+cnhfanVtYm9fcGVuZGluZyA6IDA7CisJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX0pVTUJPX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgdHAtPnJ4X2p1bWJvX3B0cik7CisKKwkvKiBJbml0aWFsaXplIE1BQyBhZGRyZXNzIGFuZCBiYWNrb2ZmIHNlZWQuICovCisJX190ZzNfc2V0X21hY19hZGRyKHRwKTsKKworCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnICovCisJdHczMihNQUNfUlhfTVRVX1NJWkUsIHRwLT5kZXYtPm10dSArIEVUSF9ITEVOICsgOCk7CisKKwkvKiBUaGUgc2xvdCB0aW1lIGlzIGNoYW5nZWQgYnkgdGczX3NldHVwX3BoeSBpZiB3ZQorCSAqIHJ1biBhdCBnaWdhYml0IHdpdGggaGFsZiBkdXBsZXguCisJICovCisJdHczMihNQUNfVFhfTEVOR1RIUywKKwkgICAgICgyIDw8IFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVCkgfAorCSAgICAgKDYgPDwgVFhfTEVOR1RIU19JUEdfU0hJRlQpIHwKKwkgICAgICgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpOworCisJLyogUmVjZWl2ZSBydWxlcy4gKi8KKwl0dzMyKE1BQ19SQ1ZfUlVMRV9DRkcsIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTKTsKKwl0dzMyKFJDVkxQQ19DT05GSUcsIDB4MDE4MSk7CisKKwkvKiBDYWxjdWxhdGUgUkRNQUNfTU9ERSBzZXR0aW5nIGVhcmx5LCB3ZSBuZWVkIGl0IHRvIGRldGVybWluZQorCSAqIHRoZSBSQ1ZMUENfU1RBVEVfRU5BQkxFIG1hc2suCisJICovCisJcmRtYWNfbW9kZSA9IChSRE1BQ19NT0RFX0VOQUJMRSB8IFJETUFDX01PREVfVEdUQUJPUlRfRU5BQiB8CisJCSAgICAgIFJETUFDX01PREVfTVNUQUJPUlRfRU5BQiB8IFJETUFDX01PREVfUEFSSVRZRVJSX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCIHwgUkRNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQiB8CisJCSAgICAgIFJETUFDX01PREVfRklGT1VSVU5fRU5BQiB8IFJETUFDX01PREVfRklGT09SRUFEX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX0xOR1JFQURfRU5BQik7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKQorCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfU1BMSVRfRU5BQkxFOworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSB8fAorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFICYmCisJCSAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTEgfHwKKwkJICAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMikpIHsKKwkJCXJkbWFjX21vZGUgfD0gUkRNQUNfTU9ERV9GSUZPX1NJWkVfMTI4OworCQl9IGVsc2UgaWYgKCEodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICYmCisJCQkgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkpIHsKKwkJCXJkbWFjX21vZGUgfD0gUkRNQUNfTU9ERV9GSUZPX0xPTkdfQlVSU1Q7CisJCX0KKwl9CisKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykKKwkJcmRtYWNfbW9kZSB8PSAoMSA8PCAyNyk7CisjZW5kaWYKKworCS8qIFJlY2VpdmUvc2VuZCBzdGF0aXN0aWNzLiAqLworCWlmICgocmRtYWNfbW9kZSAmIFJETUFDX01PREVfRklGT19TSVpFXzEyOCkgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpKSB7CisJCXZhbCA9IHRyMzIoUkNWTFBDX1NUQVRTX0VOQUJMRSk7CisJCXZhbCAmPSB+UkNWTFBDX1NUQVRTRU5BQl9MTkdCUlNUX1JGSVg7CisJCXR3MzIoUkNWTFBDX1NUQVRTX0VOQUJMRSwgdmFsKTsKKwl9IGVsc2UgeworCQl0dzMyKFJDVkxQQ19TVEFUU19FTkFCTEUsIDB4ZmZmZmZmKTsKKwl9CisJdHczMihSQ1ZMUENfU1RBVFNDVFJMLCBSQ1ZMUENfU1RBVFNDVFJMX0VOQUJMRSk7CisJdHczMihTTkREQVRBSV9TVEFUU0VOQUIsIDB4ZmZmZmZmKTsKKwl0dzMyKFNORERBVEFJX1NUQVRTQ1RSTCwKKwkgICAgIChTTkREQVRBSV9TQ1RSTF9FTkFCTEUgfAorCSAgICAgIFNORERBVEFJX1NDVFJMX0ZBU1RVUEQpKTsKKworCS8qIFNldHVwIGhvc3QgY29hbGVzY2luZyBlbmdpbmUuICovCisJdHczMihIT1NUQ0NfTU9ERSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQlpZiAoISh0cjMyKEhPU1RDQ19NT0RFKSAmIEhPU1RDQ19NT0RFX0VOQUJMRSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwl0dzMyKEhPU1RDQ19SWENPTF9USUNLUywgMCk7CisJdHczMihIT1NUQ0NfVFhDT0xfVElDS1MsIExPV19UWENPTF9USUNLUyk7CisJdHczMihIT1NUQ0NfUlhNQVhfRlJBTUVTLCAxKTsKKwl0dzMyKEhPU1RDQ19UWE1BWF9GUkFNRVMsIExPV19SWE1BWF9GUkFNRVMpOworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQl0dzMyKEhPU1RDQ19SWENPQUxfVElDS19JTlQsIDApOworCQl0dzMyKEhPU1RDQ19UWENPQUxfVElDS19JTlQsIDApOworCX0KKwl0dzMyKEhPU1RDQ19SWENPQUxfTUFYRl9JTlQsIDEpOworCXR3MzIoSE9TVENDX1RYQ09BTF9NQVhGX0lOVCwgMCk7CisKKwkvKiBzZXQgc3RhdHVzIGJsb2NrIERNQSBhZGRyZXNzICovCisJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsCisJICAgICAoKHU2NCkgdHAtPnN0YXR1c19tYXBwaW5nID4+IDMyKSk7CisJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkgICAgICgodTY0KSB0cC0+c3RhdHVzX21hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJLyogU3RhdHVzL3N0YXRpc3RpY3MgYmxvY2sgYWRkcmVzcy4gIFNlZSB0ZzNfdGltZXIsCisJCSAqIHRoZSB0ZzNfcGVyaW9kaWNfZmV0Y2hfc3RhdHMgY2FsbCB0aGVyZSwgYW5kCisJCSAqIHRnM19nZXRfc3RhdHMgdG8gc2VlIGhvdyB0aGlzIHdvcmtzIGZvciA1NzA1LzU3NTAgY2hpcHMuCisJCSAqLworCQl0dzMyKEhPU1RDQ19TVEFUX0NPQUxfVElDS1MsCisJCSAgICAgREVGQVVMVF9TVEFUX0NPQUxfVElDS1MpOworCQl0dzMyKEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILAorCQkgICAgICgodTY0KSB0cC0+c3RhdHNfbWFwcGluZyA+PiAzMikpOworCQl0dzMyKEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgKCh1NjQpIHRwLT5zdGF0c19tYXBwaW5nICYgMHhmZmZmZmZmZikpOworCQl0dzMyKEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIsIE5JQ19TUkFNX1NUQVRTX0JMSyk7CisJCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfTklDX0FERFIsIE5JQ19TUkFNX1NUQVRVU19CTEspOworCX0KKworCXR3MzIoSE9TVENDX01PREUsIEhPU1RDQ19NT0RFX0VOQUJMRSB8IHRwLT5jb2FsZXNjZV9tb2RlKTsKKworCXR3MzIoUkNWQ0NfTU9ERSwgUkNWQ0NfTU9ERV9FTkFCTEUgfCBSQ1ZDQ19NT0RFX0FUVE5fRU5BQkxFKTsKKwl0dzMyKFJDVkxQQ19NT0RFLCBSQ1ZMUENfTU9ERV9FTkFCTEUpOworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkKKwkJdHczMihSQ1ZMU0NfTU9ERSwgUkNWTFNDX01PREVfRU5BQkxFIHwgUkNWTFNDX01PREVfQVRUTl9FTkFCTEUpOworCisJLyogQ2xlYXIgc3RhdGlzdGljcy9zdGF0dXMgYmxvY2sgaW4gY2hpcCwgYW5kIHN0YXR1cyBibG9jayBpbiByYW0uICovCisJZm9yIChpID0gTklDX1NSQU1fU1RBVFNfQkxLOworCSAgICAgaSA8IE5JQ19TUkFNX1NUQVRVU19CTEsgKyBURzNfSFdfU1RBVFVTX1NJWkU7CisJICAgICBpICs9IHNpemVvZih1MzIpKSB7CisJCXRnM193cml0ZV9tZW0odHAsIGksIDApOworCQl1ZGVsYXkoNDApOworCX0KKwltZW1zZXQodHAtPmh3X3N0YXR1cywgMCwgVEczX0hXX1NUQVRVU19TSVpFKTsKKworCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1RYU1RBVF9FTkFCTEUgfCBNQUNfTU9ERV9SWFNUQVRfRU5BQkxFIHwKKwkJTUFDX01PREVfVERFX0VOQUJMRSB8IE1BQ19NT0RFX1JERV9FTkFCTEUgfCBNQUNfTU9ERV9GSERFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSB8IE1BQ19NT0RFX1JYU1RBVF9DTEVBUiB8IE1BQ19NT0RFX1RYU1RBVF9DTEVBUik7CisJdWRlbGF5KDQwKTsKKworCXRwLT5ncmNfbG9jYWxfY3RybCA9IEdSQ19MQ0xDVFJMX0lOVF9PTl9BVFROIHwgR1JDX0xDTENUUkxfQVVUT19TRUVQUk9NOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkKKwkJdHAtPmdyY19sb2NhbF9jdHJsIHw9IChHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSk7CisJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwpOworCXVkZWxheSgxMDApOworCisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQl0dzMyX2YoRE1BQ19NT0RFLCBETUFDX01PREVfRU5BQkxFKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisKKwl2YWwgPSAoV0RNQUNfTU9ERV9FTkFCTEUgfCBXRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIgfAorCSAgICAgICBXRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIgfCBXRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9BRERST0ZMT1dfRU5BQiB8IFdETUFDX01PREVfRklGT09GTE9XX0VOQUIgfAorCSAgICAgICBXRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBXRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOworCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTApIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAmJgorCQkgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0ExIHx8CisJCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTIpKSB7CisJCQkvKiBub3RoaW5nICovCisJCX0gZWxzZSBpZiAoISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9CVVNfU1BFRURfSElHSCkgJiYKKwkJCSAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU181Nzg4KSAmJgorCQkJICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkgeworCQkJdmFsIHw9IFdETUFDX01PREVfUlhfQUNDRUw7CisJCX0KKwl9CisKKwl0dzMyX2YoV0RNQUNfTU9ERSwgdmFsKTsKKwl1ZGVsYXkoNDApOworCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAhPSAwKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1hfQ0FQUyk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgeworCQkJdmFsICY9IH5QQ0lYX0NBUFNfQlVSU1RfTUFTSzsKKwkJCXZhbCB8PSAoUENJWF9DQVBTX01BWF9CVVJTVF9DUElPQiA8PCBQQ0lYX0NBUFNfQlVSU1RfU0hJRlQpOworCQl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCQl2YWwgJj0gfihQQ0lYX0NBUFNfU1BMSVRfTUFTSyB8IFBDSVhfQ0FQU19CVVJTVF9NQVNLKTsKKwkJCXZhbCB8PSAoUENJWF9DQVBTX01BWF9CVVJTVF9DUElPQiA8PCBQQ0lYX0NBUFNfQlVSU1RfU0hJRlQpOworCQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKQorCQkJCXZhbCB8PSAodHAtPnNwbGl0X21vZGVfbWF4X3JlcXMgPDwKKwkJCQkJUENJWF9DQVBTX1NQTElUX1NISUZUKTsKKwkJfQorCQl0dzMyKFRHM1BDSV9YX0NBUFMsIHZhbCk7CisJfQorCisJdHczMl9mKFJETUFDX01PREUsIHJkbWFjX21vZGUpOworCXVkZWxheSg0MCk7CisKKwl0dzMyKFJDVkRDQ19NT0RFLCBSQ1ZEQ0NfTU9ERV9FTkFCTEUgfCBSQ1ZEQ0NfTU9ERV9BVFROX0VOQUJMRSk7CisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKQorCQl0dzMyKE1CRlJFRV9NT0RFLCBNQkZSRUVfTU9ERV9FTkFCTEUpOworCXR3MzIoU05EREFUQUNfTU9ERSwgU05EREFUQUNfTU9ERV9FTkFCTEUpOworCXR3MzIoU05EQkRDX01PREUsIFNOREJEQ19NT0RFX0VOQUJMRSB8IFNOREJEQ19NT0RFX0FUVE5fRU5BQkxFKTsKKwl0dzMyKFJDVkJESV9NT0RFLCBSQ1ZCRElfTU9ERV9FTkFCTEUgfCBSQ1ZCRElfTU9ERV9SQ0JfQVRUTl9FTkFCKTsKKwl0dzMyKFJDVkRCRElfTU9ERSwgUkNWREJESV9NT0RFX0VOQUJMRSB8IFJDVkRCRElfTU9ERV9JTlZfUklOR19TWik7CisJdHczMihTTkREQVRBSV9NT0RFLCBTTkREQVRBSV9NT0RFX0VOQUJMRSk7CisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCXR3MzIoU05EREFUQUlfTU9ERSwgU05EREFUQUlfTU9ERV9FTkFCTEUgfCAweDgpOworI2VuZGlmCisJdHczMihTTkRCRElfTU9ERSwgU05EQkRJX01PREVfRU5BQkxFIHwgU05EQkRJX01PREVfQVRUTl9FTkFCTEUpOworCXR3MzIoU05EQkRTX01PREUsIFNOREJEU19NT0RFX0VOQUJMRSB8IFNOREJEU19NT0RFX0FUVE5fRU5BQkxFKTsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCkgeworCQllcnIgPSB0ZzNfbG9hZF81NzAxX2EwX2Zpcm13YXJlX2ZpeCh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpIHsKKwkJZXJyID0gdGczX2xvYWRfdHNvX2Zpcm13YXJlKHRwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisKKwl0cC0+dHhfbW9kZSA9IFRYX01PREVfRU5BQkxFOworCXR3MzJfZihNQUNfVFhfTU9ERSwgdHAtPnR4X21vZGUpOworCXVkZWxheSgxMDApOworCisJdHAtPnJ4X21vZGUgPSBSWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKwl1ZGVsYXkoMTApOworCisJaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKSB7CisJCXRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID0gMDsKKwkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQ7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSB0cC0+bGlua19jb25maWcub3JpZ19kdXBsZXg7CisJCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZzsKKwl9CisKKwl0cC0+bWlfbW9kZSA9IE1BQ19NSV9NT0RFX0JBU0U7CisJdHczMl9mKE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJdWRlbGF5KDgwKTsKKworCXR3MzIoTUFDX0xFRF9DVFJMLCB0cC0+bGVkX2N0cmwpOworCisJdHczMihNQUNfTUlfU1RBVCwgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIpOworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCBSWF9NT0RFX1JFU0VUKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJdHczMl9mKE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisJdWRlbGF5KDEwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgJiYKKwkJCSEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TRVJERVNfUFJFRU1QSEFTSVMpKSB7CisJCQkvKiBTZXQgZHJpdmUgdHJhbnNtaXNzaW9uIGxldmVsIHRvIDEuMlYgICovCisJCQkvKiBvbmx5IGlmIHRoZSBzaWduYWwgcHJlLWVtcGhhc2lzIGJpdCBpcyBub3Qgc2V0ICAqLworCQkJdmFsID0gdHIzMihNQUNfU0VSREVTX0NGRyk7CisJCQl2YWwgJj0gMHhmZmZmZjAwMDsKKwkJCXZhbCB8PSAweDg4MDsKKwkJCXR3MzIoTUFDX1NFUkRFU19DRkcsIHZhbCk7CisJCX0KKwkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAzX0ExKQorCQkJdHczMihNQUNfU0VSREVTX0NGRywgMHg2MTYwMDApOworCX0KKworCS8qIFByZXZlbnQgY2hpcCBmcm9tIGRyb3BwaW5nIGZyYW1lcyB3aGVuIGZsb3cgY29udHJvbAorCSAqIGlzIGVuYWJsZWQuCisJICovCisJdHczMl9mKE1BQ19MT1dfV01BUktfTUFYX1JYX0ZSQU1FLCAyKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCAmJgorCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkgeworCQkvKiBVc2UgaGFyZHdhcmUgbGluayBhdXRvLW5lZ290aWF0aW9uICovCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0hXX0FVVE9ORUc7CisJfQorCisJZXJyID0gdGczX3NldHVwX3BoeSh0cCwgMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJdTMyIHRtcDsKKworCQkvKiBDbGVhciBDUkMgc3RhdHMuICovCisJCWlmICghdGczX3JlYWRwaHkodHAsIDB4MWUsICZ0bXApKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWUsIHRtcCB8IDB4ODAwMCk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNCwgJnRtcCk7CisJCX0KKwl9CisKKwlfX3RnM19zZXRfcnhfbW9kZSh0cC0+ZGV2KTsKKworCS8qIEluaXRpYWxpemUgcmVjZWl2ZSBydWxlcy4gKi8KKwl0dzMyKE1BQ19SQ1ZfUlVMRV8wLCAgMHhjMjAwMDAwMCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzAsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9SVUxFXzEsICAweDg2MDAwMDA0ICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfVkFMVUVfMSwgMHhmZmZmZmZmZiAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpCisJCWxpbWl0ID0gODsKKwllbHNlCisJCWxpbWl0ID0gMTY7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKQorCQlsaW1pdCAtPSA0OworCXN3aXRjaCAobGltaXQpIHsKKwljYXNlIDE2OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xNSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTUsICAwKTsKKwljYXNlIDE1OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xNCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTQsICAwKTsKKwljYXNlIDE0OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xMywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTMsICAwKTsKKwljYXNlIDEzOgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xMiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTIsICAwKTsKKwljYXNlIDEyOgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xMSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTEsICAwKTsKKwljYXNlIDExOgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV8xMCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMTAsICAwKTsKKwljYXNlIDEwOgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV85LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV85LCAgMCk7CisJY2FzZSA5OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV84LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV84LCAgMCk7CisJY2FzZSA4OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV83LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV83LCAgMCk7CisJY2FzZSA3OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV82LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV82LCAgMCk7CisJY2FzZSA2OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV81LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV81LCAgMCk7CisJY2FzZSA1OgorCQl0dzMyKE1BQ19SQ1ZfUlVMRV80LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV80LCAgMCk7CisJY2FzZSA0OgorCQkvKiB0dzMyKE1BQ19SQ1ZfUlVMRV8zLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8zLCAgMCk7ICovCisJY2FzZSAzOgorCQkvKiB0dzMyKE1BQ19SQ1ZfUlVMRV8yLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8yLCAgMCk7ICovCisJY2FzZSAyOgorCWNhc2UgMToKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwl0ZzNfd3JpdGVfc2lnX3Bvc3RfcmVzZXQodHAsIFJFU0VUX0tJTkRfSU5JVCk7CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpCisJCXRnM19lbmFibGVfaW50cyh0cCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIGF0IGRldmljZSBvcGVuIHRpbWUgdG8gZ2V0IHRoZSBjaGlwIHJlYWR5IGZvcgorICogcGFja2V0IHByb2Nlc3NpbmcuICBJbnZva2VkIHdpdGggdHAtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCB0ZzNfaW5pdF9odyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgZXJyOworCisJLyogRm9yY2UgdGhlIGNoaXAgaW50byBEMC4gKi8KKwllcnIgPSB0ZzNfc2V0X3Bvd2VyX3N0YXRlKHRwLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXRnM19zd2l0Y2hfY2xvY2tzKHRwKTsKKworCXR3MzIoVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCWVyciA9IHRnM19yZXNldF9odyh0cCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIFRHM19TVEFUX0FERDMyKFBTVEFULCBSRUcpIFwKK2RvIHsJdTMyIF9fdmFsID0gdHIzMihSRUcpOyBcCisJKFBTVEFUKS0+bG93ICs9IF9fdmFsOyBcCisJaWYgKChQU1RBVCktPmxvdyA8IF9fdmFsKSBcCisJCShQU1RBVCktPmhpZ2ggKz0gMTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgdGczX3BlcmlvZGljX2ZldGNoX3N0YXRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCB0ZzNfaHdfc3RhdHMgKnNwID0gdHAtPmh3X3N0YXRzOworCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKQorCQlyZXR1cm47CisKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X29jdGV0cywgTUFDX1RYX1NUQVRTX09DVEVUUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9jb2xsaXNpb25zLCBNQUNfVFhfU1RBVFNfQ09MTElTSU9OUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF94b25fc2VudCwgTUFDX1RYX1NUQVRTX1hPTl9TRU5UKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X3hvZmZfc2VudCwgTUFDX1RYX1NUQVRTX1hPRkZfU0VOVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9tYWNfZXJyb3JzLCBNQUNfVFhfU1RBVFNfTUFDX0VSUk9SUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9zaW5nbGVfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX1NJTkdMRV9DT0xMSVNJT05TKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X211bHRfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX01VTFRfQ09MTElTSU9OUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9kZWZlcnJlZCwgTUFDX1RYX1NUQVRTX0RFRkVSUkVEKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zLCBNQUNfVFhfU1RBVFNfRVhDRVNTSVZFX0NPTCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9sYXRlX2NvbGxpc2lvbnMsIE1BQ19UWF9TVEFUU19MQVRFX0NPTCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF91Y2FzdF9wYWNrZXRzLCBNQUNfVFhfU1RBVFNfVUNBU1QpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfbWNhc3RfcGFja2V0cywgTUFDX1RYX1NUQVRTX01DQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X2JjYXN0X3BhY2tldHMsIE1BQ19UWF9TVEFUU19CQ0FTVCk7CisKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X29jdGV0cywgTUFDX1JYX1NUQVRTX09DVEVUUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9mcmFnbWVudHMsIE1BQ19SWF9TVEFUU19GUkFHTUVOVFMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfdWNhc3RfcGFja2V0cywgTUFDX1JYX1NUQVRTX1VDQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X21jYXN0X3BhY2tldHMsIE1BQ19SWF9TVEFUU19NQ0FTVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9iY2FzdF9wYWNrZXRzLCBNQUNfUlhfU1RBVFNfQkNBU1QpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfZmNzX2Vycm9ycywgTUFDX1JYX1NUQVRTX0ZDU19FUlJPUlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfYWxpZ25fZXJyb3JzLCBNQUNfUlhfU1RBVFNfQUxJR05fRVJST1JTKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X3hvbl9wYXVzZV9yY3ZkLCBNQUNfUlhfU1RBVFNfWE9OX1BBVVNFX1JFQ1ZEKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X3hvZmZfcGF1c2VfcmN2ZCwgTUFDX1JYX1NUQVRTX1hPRkZfUEFVU0VfUkVDVkQpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfbWFjX2N0cmxfcmN2ZCwgTUFDX1JYX1NUQVRTX01BQ19DVFJMX1JFQ1ZEKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X3hvZmZfZW50ZXJlZCwgTUFDX1JYX1NUQVRTX1hPRkZfRU5URVJFRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9mcmFtZV90b29fbG9uZ19lcnJvcnMsIE1BQ19SWF9TVEFUU19GUkFNRV9UT09fTE9ORyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9qYWJiZXJzLCBNQUNfUlhfU1RBVFNfSkFCQkVSUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF91bmRlcnNpemVfcGFja2V0cywgTUFDX1JYX1NUQVRTX1VOREVSU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM190aW1lcih1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gKHN0cnVjdCB0ZzMgKikgX19vcGFxdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJLyogQWxsIG9mIHRoaXMgZ2FyYmFnZSBpcyBiZWNhdXNlIHdoZW4gdXNpbmcgbm9uLXRhZ2dlZAorCSAqIElSUSBzdGF0dXMgdGhlIG1haWxib3gvc3RhdHVzX2Jsb2NrIHByb3RvY29sIHRoZSBjaGlwCisJICogdXNlcyB3aXRoIHRoZSBjcHUgaXMgcmFjZSBwcm9uZS4KKwkgKi8KKwlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHsKKwkJdHczMihHUkNfTE9DQUxfQ1RSTCwKKwkJICAgICB0cC0+Z3JjX2xvY2FsX2N0cmwgfCBHUkNfTENMQ1RSTF9TRVRJTlQpOworCX0gZWxzZSB7CisJCXR3MzIoSE9TVENDX01PREUsIHRwLT5jb2FsZXNjZV9tb2RlIHwKKwkJICAgICAoSE9TVENDX01PREVfRU5BQkxFIHwgSE9TVENDX01PREVfTk9XKSk7CisJfQorCisJaWYgKCEodHIzMihXRE1BQ19NT0RFKSAmIFdETUFDX01PREVfRU5BQkxFKSkgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSOworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpCisJCXRnM19wZXJpb2RpY19mZXRjaF9zdGF0cyh0cCk7CisKKwkvKiBUaGlzIHBhcnQgb25seSBydW5zIG9uY2UgcGVyIHNlY29uZC4gKi8KKwlpZiAoIS0tdHAtPnRpbWVyX2NvdW50ZXIpIHsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTElOS0NIR19SRUcpIHsKKwkJCXUzMiBtYWNfc3RhdDsKKwkJCWludCBwaHlfZXZlbnQ7CisKKwkJCW1hY19zdGF0ID0gdHIzMihNQUNfU1RBVFVTKTsKKworCQkJcGh5X2V2ZW50ID0gMDsKKwkJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVCkgeworCQkJCWlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTUlfSU5URVJSVVBUKQorCQkJCQlwaHlfZXZlbnQgPSAxOworCQkJfSBlbHNlIGlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRCkKKwkJCQlwaHlfZXZlbnQgPSAxOworCisJCQlpZiAocGh5X2V2ZW50KQorCQkJCXRnM19zZXR1cF9waHkodHAsIDApOworCQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QT0xMX1NFUkRFUykgeworCQkJdTMyIG1hY19zdGF0ID0gdHIzMihNQUNfU1RBVFVTKTsKKwkJCWludCBuZWVkX3NldHVwID0gMDsKKworCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikgJiYKKwkJCSAgICAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpKSB7CisJCQkJbmVlZF9zZXR1cCA9IDE7CisJCQl9CisJCQlpZiAoISBuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpICYmCisJCQkgICAgKG1hY19zdGF0ICYgKE1BQ19TVEFUVVNfUENTX1NZTkNFRCB8CisJCQkJCSBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSkgeworCQkJCW5lZWRfc2V0dXAgPSAxOworCQkJfQorCQkJaWYgKG5lZWRfc2V0dXApIHsKKwkJCQl0dzMyX2YoTUFDX01PREUsCisJCQkJICAgICAodHAtPm1hY19tb2RlICYKKwkJCQkgICAgICB+TUFDX01PREVfUE9SVF9NT0RFX01BU0spKTsKKwkJCQl1ZGVsYXkoNDApOworCQkJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJCQl1ZGVsYXkoNDApOworCQkJCXRnM19zZXR1cF9waHkodHAsIDApOworCQkJfQorCQl9CisKKwkJdHAtPnRpbWVyX2NvdW50ZXIgPSB0cC0+dGltZXJfbXVsdGlwbGllcjsKKwl9CisKKwkvKiBIZWFydGJlYXQgaXMgb25seSBzZW50IG9uY2UgZXZlcnkgMTIwIHNlY29uZHMuICAqLworCWlmICghLS10cC0+YXNmX2NvdW50ZXIpIHsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCQl1MzIgdmFsOworCisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfTUJPWCwgRldDTURfTklDRFJWX0FMSVZFKTsKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0NNRF9MRU5fTUJPWCwgNCk7CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfREFUQV9NQk9YLCAzKTsKKwkJCXZhbCA9IHRyMzIoR1JDX1JYX0NQVV9FVkVOVCk7CisJCQl2YWwgfD0gKDEgPDwgMTQpOworCQkJdHczMihHUkNfUlhfQ1BVX0VWRU5ULCB2YWwpOworCQl9CisJCXRwLT5hc2ZfY291bnRlciA9IHRwLT5hc2ZfbXVsdGlwbGllcjsKKwl9CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKK30KKworc3RhdGljIGludCB0ZzNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfSU5JVF9DT01QTEVURTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkvKiBUaGUgcGxhY2VtZW50IG9mIHRoaXMgY2FsbCBpcyB0aWVkCisJICogdG8gdGhlIHNldHVwIGFuZCB1c2Ugb2YgSG9zdCBUWCBkZXNjcmlwdG9ycy4KKwkgKi8KKwllcnIgPSB0ZzNfYWxsb2NfY29uc2lzdGVudCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCB0ZzNfaW50ZXJydXB0LAorCQkJICBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCisJaWYgKGVycikgeworCQl0ZzNfZnJlZV9jb25zaXN0ZW50KHRwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwllcnIgPSB0ZzNfaW5pdF9odyh0cCk7CisJaWYgKGVycikgeworCQl0ZzNfaGFsdCh0cCk7CisJCXRnM19mcmVlX3JpbmdzKHRwKTsKKwl9IGVsc2UgeworCQl0cC0+dGltZXJfb2Zmc2V0ID0gSFogLyAxMDsKKwkJdHAtPnRpbWVyX2NvdW50ZXIgPSB0cC0+dGltZXJfbXVsdGlwbGllciA9IDEwOworCQl0cC0+YXNmX2NvdW50ZXIgPSB0cC0+YXNmX211bHRpcGxpZXIgPSAoMTAgKiAxMjApOworCisJCWluaXRfdGltZXIoJnRwLT50aW1lcik7CisJCXRwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHRwLT50aW1lcl9vZmZzZXQ7CisJCXRwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHRwOworCQl0cC0+dGltZXIuZnVuY3Rpb24gPSB0ZzNfdGltZXI7CisJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0lOSVRfQ09NUExFVEU7CisJfQorCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCWlmIChlcnIpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXRnM19mcmVlX2NvbnNpc3RlbnQodHApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19lbmFibGVfaW50cyh0cCk7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisjaWYgMAorLypzdGF0aWMqLyB2b2lkIHRnM19kdW1wX3N0YXRlKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiB2YWwzMiwgdmFsMzJfMiwgdmFsMzJfMywgdmFsMzJfNCwgdmFsMzJfNTsKKwl1MTYgdmFsMTY7CisJaW50IGk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX1NUQVRVUywgJnZhbDE2KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgJnZhbDMyKTsKKwlwcmludGsoIkRFQlVHOiBQQ0kgc3RhdHVzIFslMDR4XSBURzNQQ0kgc3RhdGVbJTA4eF1cbiIsCisJICAgICAgIHZhbDE2LCB2YWwzMik7CisKKwkvKiBNQUMgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBNQUNfTU9ERVslMDh4XSBNQUNfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKE1BQ19NT0RFKSwgdHIzMihNQUNfU1RBVFVTKSk7CisJcHJpbnRrKCIgICAgICAgTUFDX0VWRU5UWyUwOHhdIE1BQ19MRURfQ1RSTFslMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUNfRVZFTlQpLCB0cjMyKE1BQ19MRURfQ1RSTCkpOworCXByaW50aygiREVCVUc6IE1BQ19UWF9NT0RFWyUwOHhdIE1BQ19UWF9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUFDX1RYX01PREUpLCB0cjMyKE1BQ19UWF9TVEFUVVMpKTsKKwlwcmludGsoIiAgICAgICBNQUNfUlhfTU9ERVslMDh4XSBNQUNfUlhfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKE1BQ19SWF9NT0RFKSwgdHIzMihNQUNfUlhfU1RBVFVTKSk7CisKKwkvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBTTkREQVRBSV9NT0RFWyUwOHhdIFNORERBVEFJX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihTTkREQVRBSV9NT0RFKSwgdHIzMihTTkREQVRBSV9TVEFUVVMpKTsKKwlwcmludGsoIiAgICAgICBTTkREQVRBSV9TVEFUU0NUUkxbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoU05EREFUQUlfU1RBVFNDVFJMKSk7CisKKwkvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EREFUQUNfTU9ERVslMDh4XVxuIiwgdHIzMihTTkREQVRBQ19NT0RFKSk7CisKKwkvKiBTZW5kIEJEIHJpbmcgc2VsZWN0b3IgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBTTkRCRFNfTU9ERVslMDh4XSBTTkRCRFNfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFNOREJEU19NT0RFKSwgdHIzMihTTkRCRFNfU1RBVFVTKSk7CisKKwkvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EQkRJX01PREVbJTA4eF0gU05EQkRJX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihTTkRCRElfTU9ERSksIHRyMzIoU05EQkRJX1NUQVRVUykpOworCisJLyogU2VuZCBCRCBjb21wbGV0aW9uIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBTTkRCRENfTU9ERVslMDh4XVxuIiwgdHIzMihTTkRCRENfTU9ERSkpOworCisJLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkNWTFBDX01PREVbJTA4eF0gUkNWTFBDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZMUENfTU9ERSksIHRyMzIoUkNWTFBDX1NUQVRVUykpOworCXByaW50aygiICAgICAgIFJDVkxQQ19TVEFUU0NUUkxbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWTFBDX1NUQVRTQ1RSTCkpOworCisJLyogUmVjZWl2ZSBkYXRhIGFuZCByZWNlaXZlIEJEIGluaXRpYXRvciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkNWREJESV9NT0RFWyUwOHhdIFJDVkRCRElfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkRCRElfTU9ERSksIHRyMzIoUkNWREJESV9TVEFUVVMpKTsKKworCS8qIFJlY2VpdmUgZGF0YSBjb21wbGV0aW9uIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSQ1ZEQ0NfTU9ERVslMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQ0NfTU9ERSkpOworCisJLyogUmVjZWl2ZSBCRCBpbml0aWF0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkJESV9NT0RFWyUwOHhdIFJDVkJESV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWQkRJX01PREUpLCB0cjMyKFJDVkJESV9TVEFUVVMpKTsKKworCS8qIFJlY2VpdmUgQkQgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkNWQ0NfTU9ERVslMDh4XSBSQ1ZDQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWQ0NfTU9ERSksIHRyMzIoUkNWQ0NfU1RBVFVTKSk7CisKKwkvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkxTQ19NT0RFWyUwOHhdIFJDVkxTQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWTFNDX01PREUpLCB0cjMyKFJDVkxTQ19TVEFUVVMpKTsKKworCS8qIE1idWYgY2x1c3RlciBmcmVlIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogTUJGUkVFX01PREVbJTA4eF0gTUJGUkVFX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQkZSRUVfTU9ERSksIHRyMzIoTUJGUkVFX1NUQVRVUykpOworCisJLyogSG9zdCBjb2FsZXNjaW5nIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBIT1NUQ0NfTU9ERVslMDh4XSBIT1NUQ0NfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEhPU1RDQ19NT0RFKSwgdHIzMihIT1NUQ0NfU1RBVFVTKSk7CisJcHJpbnRrKCJERUJVRzogSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFJbJTA4eCUwOHhdXG4iLAorCSAgICAgICB0cjMyKEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdIKSwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XKSk7CisJcHJpbnRrKCJERUJVRzogSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSWyUwOHglMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gpLAorCSAgICAgICB0cjMyKEhPU1RDQ19TVEFUVVNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XKSk7CisJcHJpbnRrKCJERUJVRzogSE9TVENDX1NUQVRTX0JMS19OSUNfQUREUlslMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFNfQkxLX05JQ19BRERSKSk7CisJcHJpbnRrKCJERUJVRzogSE9TVENDX1NUQVRVU19CTEtfTklDX0FERFJbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRVU19CTEtfTklDX0FERFIpKTsKKworCS8qIE1lbW9yeSBhcmJpdGVyIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBNRU1BUkJfTU9ERVslMDh4XSBNRU1BUkJfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKE1FTUFSQl9NT0RFKSwgdHIzMihNRU1BUkJfU1RBVFVTKSk7CisKKwkvKiBCdWZmZXIgbWFuYWdlciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogQlVGTUdSX01PREVbJTA4eF0gQlVGTUdSX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihCVUZNR1JfTU9ERSksIHRyMzIoQlVGTUdSX1NUQVRVUykpOworCXByaW50aygiREVCVUc6IEJVRk1HUl9NQl9QT09MX0FERFJbJTA4eF0gQlVGTUdSX01CX1BPT0xfU0laRVslMDh4XVxuIiwKKwkgICAgICAgdHIzMihCVUZNR1JfTUJfUE9PTF9BRERSKSwgdHIzMihCVUZNR1JfTUJfUE9PTF9TSVpFKSk7CisJcHJpbnRrKCJERUJVRzogQlVGTUdSX0RNQV9ERVNDX1BPT0xfQUREUlslMDh4XSAiCisJICAgICAgICJCVUZNR1JfRE1BX0RFU0NfUE9PTF9TSVpFWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIpLAorCSAgICAgICB0cjMyKEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUpKTsKKworCS8qIFJlYWQgRE1BIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSRE1BQ19NT0RFWyUwOHhdIFJETUFDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihSRE1BQ19NT0RFKSwgdHIzMihSRE1BQ19TVEFUVVMpKTsKKworCS8qIFdyaXRlIERNQSBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogV0RNQUNfTU9ERVslMDh4XSBXRE1BQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoV0RNQUNfTU9ERSksIHRyMzIoV0RNQUNfU1RBVFVTKSk7CisKKwkvKiBETUEgY29tcGxldGlvbiBibG9jayAqLworCXByaW50aygiREVCVUc6IERNQUNfTU9ERVslMDh4XVxuIiwKKwkgICAgICAgdHIzMihETUFDX01PREUpKTsKKworCS8qIEdSQyBibG9jayAqLworCXByaW50aygiREVCVUc6IEdSQ19NT0RFWyUwOHhdIEdSQ19NSVNDX0NGR1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihHUkNfTU9ERSksIHRyMzIoR1JDX01JU0NfQ0ZHKSk7CisJcHJpbnRrKCJERUJVRzogR1JDX0xPQ0FMX0NUUkxbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoR1JDX0xPQ0FMX0NUUkwpKTsKKworCS8qIFRHM19CRElORk9zICovCisJcHJpbnRrKCJERUJVRzogUkNWREJESV9KVU1CT19CRFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkRCRElfSlVNQk9fQkQgKyAweDApLAorCSAgICAgICB0cjMyKFJDVkRCRElfSlVNQk9fQkQgKyAweDQpLAorCSAgICAgICB0cjMyKFJDVkRCRElfSlVNQk9fQkQgKyAweDgpLAorCSAgICAgICB0cjMyKFJDVkRCRElfSlVNQk9fQkQgKyAweGMpKTsKKwlwcmludGsoIkRFQlVHOiBSQ1ZEQkRJX1NURF9CRFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkRCRElfU1REX0JEICsgMHgwKSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX1NURF9CRCArIDB4NCksCisJICAgICAgIHRyMzIoUkNWREJESV9TVERfQkQgKyAweDgpLAorCSAgICAgICB0cjMyKFJDVkRCRElfU1REX0JEICsgMHhjKSk7CisJcHJpbnRrKCJERUJVRzogUkNWREJESV9NSU5JX0JEWyUwOHglMDh4OiUwOHg6JTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWREJESV9NSU5JX0JEICsgMHgwKSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX01JTklfQkQgKyAweDQpLAorCSAgICAgICB0cjMyKFJDVkRCRElfTUlOSV9CRCArIDB4OCksCisJICAgICAgIHRyMzIoUkNWREJESV9NSU5JX0JEICsgMHhjKSk7CisKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1NFTkRfUkNCICsgMHgwLCAmdmFsMzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU0VORF9SQ0IgKyAweDQsICZ2YWwzMl8yKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1NFTkRfUkNCICsgMHg4LCAmdmFsMzJfMyk7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TRU5EX1JDQiArIDB4YywgJnZhbDMyXzQpOworCXByaW50aygiREVCVUc6IFNSQU1fU0VORF9SQ0JfMFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB2YWwzMiwgdmFsMzJfMiwgdmFsMzJfMywgdmFsMzJfNCk7CisKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgMHgwLCAmdmFsMzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fUkNWX1JFVF9SQ0IgKyAweDQsICZ2YWwzMl8yKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgMHg4LCAmdmFsMzJfMyk7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIDB4YywgJnZhbDMyXzQpOworCXByaW50aygiREVCVUc6IFNSQU1fUkNWX1JFVF9SQ0JfMFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB2YWwzMiwgdmFsMzJfMiwgdmFsMzJfMywgdmFsMzJfNCk7CisKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1NUQVRVU19CTEsgKyAweDAsICZ2YWwzMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHg0LCAmdmFsMzJfMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHg4LCAmdmFsMzJfMyk7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHhjLCAmdmFsMzJfNCk7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHgxMCwgJnZhbDMyXzUpOworCXByaW50aygiREVCVUc6IFNSQU1fU1RBVFVTX0JMS1slMDh4OiUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB2YWwzMiwgdmFsMzJfMiwgdmFsMzJfMywgdmFsMzJfNCwgdmFsMzJfNSk7CisKKwkvKiBTVyBzdGF0dXMgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBIb3N0IHN0YXR1cyBibG9jayBbJTA4eDolMDh4OiglMDR4OiUwNHg6JTA0eCk6KCUwNHg6JTA0eCldXG4iLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5zdGF0dXMsCisJICAgICAgIHRwLT5od19zdGF0dXMtPnN0YXR1c190YWcsCisJICAgICAgIHRwLT5od19zdGF0dXMtPnJ4X2p1bWJvX2NvbnN1bWVyLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5yeF9jb25zdW1lciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+cnhfbWluaV9jb25zdW1lciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnJ4X3Byb2R1Y2VyLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5pZHhbMF0udHhfY29uc3VtZXIpOworCisJLyogU1cgc3RhdGlzdGljcyBibG9jayAqLworCXByaW50aygiREVCVUc6IEhvc3Qgc3RhdGlzdGljcyBibG9jayBbJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJICAgICAgICgodTMyICopdHAtPmh3X3N0YXRzKVswXSwKKwkgICAgICAgKCh1MzIgKil0cC0+aHdfc3RhdHMpWzFdLAorCSAgICAgICAoKHUzMiAqKXRwLT5od19zdGF0cylbMl0sCisJICAgICAgICgodTMyICopdHAtPmh3X3N0YXRzKVszXSk7CisKKwkvKiBNYWlsYm94ZXMgKi8KKwlwcmludGsoIkRFQlVHOiBTTkRIT1NUX1BST0RbJTA4eCUwOHhdIFNORE5JQ19QUk9EWyUwOHglMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIDB4MCksCisJICAgICAgIHRyMzIoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyAweDQpLAorCSAgICAgICB0cjMyKE1BSUxCT1hfU05ETklDX1BST0RfSURYXzAgKyAweDApLAorCSAgICAgICB0cjMyKE1BSUxCT1hfU05ETklDX1BST0RfSURYXzAgKyAweDQpKTsKKworCS8qIE5JQyBzaWRlIHNlbmQgZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHR4ZDsKKworCQl0eGQgPSB0cC0+cmVncyArIE5JQ19TUkFNX1dJTl9CQVNFICsgTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MKKwkJCSsgKGkgKiBzaXplb2Yoc3RydWN0IHRnM190eF9idWZmZXJfZGVzYykpOworCQlwcmludGsoIkRFQlVHOiBOSUMgVFhEKCVkKVslMDh4OiUwOHg6JTA4eDolMDh4XVxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICByZWFkbCh0eGQgKyAweDApLCByZWFkbCh0eGQgKyAweDQpLAorCQkgICAgICAgcmVhZGwodHhkICsgMHg4KSwgcmVhZGwodHhkICsgMHhjKSk7CisJfQorCisJLyogTklDIHNpZGUgUlggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHJ4ZDsKKworCQlyeGQgPSB0cC0+cmVncyArIE5JQ19TUkFNX1dJTl9CQVNFICsgTklDX1NSQU1fUlhfQlVGRkVSX0RFU0MKKwkJCSsgKGkgKiBzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykpOworCQlwcmludGsoIkRFQlVHOiBOSUMgUlhEX1NURCglZClbMF1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCQlyeGQgKz0gKDQgKiBzaXplb2YodTMyKSk7CisJCXByaW50aygiREVCVUc6IE5JQyBSWERfU1REKCVkKVsxXVslMDh4OiUwOHg6JTA4eDolMDh4XVxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICByZWFkbChyeGQgKyAweDApLCByZWFkbChyeGQgKyAweDQpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHg4KSwgcmVhZGwocnhkICsgMHhjKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHJ4ZDsKKworCQlyeGQgPSB0cC0+cmVncyArIE5JQ19TUkFNX1dJTl9CQVNFICsgTklDX1NSQU1fUlhfSlVNQk9fQlVGRkVSX0RFU0MKKwkJCSsgKGkgKiBzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykpOworCQlwcmludGsoIkRFQlVHOiBOSUMgUlhEX0pVTUJPKCVkKVswXVslMDh4OiUwOHg6JTA4eDolMDh4XVxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICByZWFkbChyeGQgKyAweDApLCByZWFkbChyeGQgKyAweDQpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHg4KSwgcmVhZGwocnhkICsgMHhjKSk7CisJCXJ4ZCArPSAoNCAqIHNpemVvZih1MzIpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFJYRF9KVU1CTyglZClbMV1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRnM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICp0ZzNfZ2V0X2VzdGF0cyhzdHJ1Y3QgdGczICopOworCitzdGF0aWMgaW50IHRnM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworI2lmIDAKKwl0ZzNfZHVtcF9zdGF0ZSh0cCk7CisjZW5kaWYKKworCXRnM19kaXNhYmxlX2ludHModHApOworCisJdGczX2hhbHQodHApOworCXRnM19mcmVlX3JpbmdzKHRwKTsKKwl0cC0+dGczX2ZsYWdzICY9CisJCX4oVEczX0ZMQUdfSU5JVF9DT01QTEVURSB8CisJCSAgVEczX0ZMQUdfR09UX1NFUkRFU19GTE9XQ1RMKTsKKwluZXRpZl9jYXJyaWVyX29mZih0cC0+ZGV2KTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCW1lbWNweSgmdHAtPm5ldF9zdGF0c19wcmV2LCB0ZzNfZ2V0X3N0YXRzKHRwLT5kZXYpLAorCSAgICAgICBzaXplb2YodHAtPm5ldF9zdGF0c19wcmV2KSk7CisJbWVtY3B5KCZ0cC0+ZXN0YXRzX3ByZXYsIHRnM19nZXRfZXN0YXRzKHRwKSwKKwkgICAgICAgc2l6ZW9mKHRwLT5lc3RhdHNfcHJldikpOworCisJdGczX2ZyZWVfY29uc2lzdGVudCh0cCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9zdGF0NjQodGczX3N0YXQ2NF90ICp2YWwpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwlyZXQgPSB2YWwtPmxvdzsKKyNlbHNlCisJcmV0ID0gKCh1NjQpdmFsLT5oaWdoIDw8IDMyKSB8ICgodTY0KXZhbC0+bG93KTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGNfY3JjX2Vycm9ycyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzICpod19zdGF0cyA9IHRwLT5od19zdGF0czsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdTMyIHZhbDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgMHgxZSwgJnZhbCkpIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgMHgxZSwgdmFsIHwgMHg4MDAwKTsKKwkJCXRnM19yZWFkcGh5KHRwLCAweDE0LCAmdmFsKTsKKwkJfSBlbHNlCisJCQl2YWwgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJCXRwLT5waHlfY3JjX2Vycm9ycyArPSB2YWw7CisKKwkJcmV0dXJuIHRwLT5waHlfY3JjX2Vycm9yczsKKwl9CisKKwlyZXR1cm4gZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X2Zjc19lcnJvcnMpOworfQorCisjZGVmaW5lIEVTVEFUX0FERChtZW1iZXIpIFwKKwllc3RhdHMtPm1lbWJlciA9CW9sZF9lc3RhdHMtPm1lbWJlciArIFwKKwkJCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+bWVtYmVyKQorCitzdGF0aWMgc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICp0ZzNfZ2V0X2VzdGF0cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgKmVzdGF0cyA9ICZ0cC0+ZXN0YXRzOworCXN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqb2xkX2VzdGF0cyA9ICZ0cC0+ZXN0YXRzX3ByZXY7CisJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CisKKwlpZiAoIWh3X3N0YXRzKQorCQlyZXR1cm4gb2xkX2VzdGF0czsKKworCUVTVEFUX0FERChyeF9vY3RldHMpOworCUVTVEFUX0FERChyeF9mcmFnbWVudHMpOworCUVTVEFUX0FERChyeF91Y2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfbWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4X2JjYXN0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF9mY3NfZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfYWxpZ25fZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfeG9uX3BhdXNlX3JjdmQpOworCUVTVEFUX0FERChyeF94b2ZmX3BhdXNlX3JjdmQpOworCUVTVEFUX0FERChyeF9tYWNfY3RybF9yY3ZkKTsKKwlFU1RBVF9BREQocnhfeG9mZl9lbnRlcmVkKTsKKwlFU1RBVF9BREQocnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfamFiYmVycyk7CisJRVNUQVRfQUREKHJ4X3VuZGVyc2l6ZV9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfaW5fbGVuZ3RoX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X291dF9sZW5ndGhfZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfNjRfb3JfbGVzc19vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfNjVfdG9fMTI3X29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF8xMjhfdG9fMjU1X29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF8yNTZfdG9fNTExX29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF81MTJfdG9fMTAyM19vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMTAyNF90b18xNTIyX29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF8xNTIzX3RvXzIwNDdfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzIwNDhfdG9fNDA5NV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfNDA5Nl90b184MTkxX29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF84MTkyX3RvXzkwMjJfb2N0ZXRfcGFja2V0cyk7CisKKwlFU1RBVF9BREQodHhfb2N0ZXRzKTsKKwlFU1RBVF9BREQodHhfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X3hvbl9zZW50KTsKKwlFU1RBVF9BREQodHhfeG9mZl9zZW50KTsKKwlFU1RBVF9BREQodHhfZmxvd19jb250cm9sKTsKKwlFU1RBVF9BREQodHhfbWFjX2Vycm9ycyk7CisJRVNUQVRfQUREKHR4X3NpbmdsZV9jb2xsaXNpb25zKTsKKwlFU1RBVF9BREQodHhfbXVsdF9jb2xsaXNpb25zKTsKKwlFU1RBVF9BREQodHhfZGVmZXJyZWQpOworCUVTVEFUX0FERCh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X2xhdGVfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfMnRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8zdGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzR0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfNXRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV82dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzd0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfOHRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV85dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzEwdGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzExdGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzEydGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzEzdGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzE0dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzE1dGltZXMpOworCUVTVEFUX0FERCh0eF91Y2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQodHhfbWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHR4X2JjYXN0X3BhY2tldHMpOworCUVTVEFUX0FERCh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyk7CisJRVNUQVRfQUREKHR4X2Rpc2NhcmRzKTsKKwlFU1RBVF9BREQodHhfZXJyb3JzKTsKKworCUVTVEFUX0FERChkbWFfd3JpdGVxX2Z1bGwpOworCUVTVEFUX0FERChkbWFfd3JpdGVfcHJpb3FfZnVsbCk7CisJRVNUQVRfQUREKHJ4YmRzX2VtcHR5KTsKKwlFU1RBVF9BREQocnhfZGlzY2FyZHMpOworCUVTVEFUX0FERChyeF9lcnJvcnMpOworCUVTVEFUX0FERChyeF90aHJlc2hvbGRfaGl0KTsKKworCUVTVEFUX0FERChkbWFfcmVhZHFfZnVsbCk7CisJRVNUQVRfQUREKGRtYV9yZWFkX3ByaW9xX2Z1bGwpOworCUVTVEFUX0FERCh0eF9jb21wX3F1ZXVlX2Z1bGwpOworCisJRVNUQVRfQUREKHJpbmdfc2V0X3NlbmRfcHJvZF9pbmRleCk7CisJRVNUQVRfQUREKHJpbmdfc3RhdHVzX3VwZGF0ZSk7CisJRVNUQVRfQUREKG5pY19pcnFzKTsKKwlFU1RBVF9BREQobmljX2F2b2lkZWRfaXJxcyk7CisJRVNUQVRfQUREKG5pY190eF90aHJlc2hvbGRfaGl0KTsKKworCXJldHVybiBlc3RhdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdGczX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHAtPm5ldF9zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqb2xkX3N0YXRzID0gJnRwLT5uZXRfc3RhdHNfcHJldjsKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzICpod19zdGF0cyA9IHRwLT5od19zdGF0czsKKworCWlmICghaHdfc3RhdHMpCisJCXJldHVybiBvbGRfc3RhdHM7CisKKwlzdGF0cy0+cnhfcGFja2V0cyA9IG9sZF9zdGF0cy0+cnhfcGFja2V0cyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF91Y2FzdF9wYWNrZXRzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9tY2FzdF9wYWNrZXRzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9iY2FzdF9wYWNrZXRzKTsKKwkJCisJc3RhdHMtPnR4X3BhY2tldHMgPSBvbGRfc3RhdHMtPnR4X3BhY2tldHMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfdWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfbWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfYmNhc3RfcGFja2V0cyk7CisKKwlzdGF0cy0+cnhfYnl0ZXMgPSBvbGRfc3RhdHMtPnJ4X2J5dGVzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X29jdGV0cyk7CisJc3RhdHMtPnR4X2J5dGVzID0gb2xkX3N0YXRzLT50eF9ieXRlcyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9vY3RldHMpOworCisJc3RhdHMtPnJ4X2Vycm9ycyA9IG9sZF9zdGF0cy0+cnhfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X2Vycm9ycykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfZGlzY2FyZHMpOworCXN0YXRzLT50eF9lcnJvcnMgPSBvbGRfc3RhdHMtPnR4X2Vycm9ycyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9lcnJvcnMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X21hY19lcnJvcnMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9kaXNjYXJkcyk7CisKKwlzdGF0cy0+bXVsdGljYXN0ID0gb2xkX3N0YXRzLT5tdWx0aWNhc3QgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfbWNhc3RfcGFja2V0cyk7CisJc3RhdHMtPmNvbGxpc2lvbnMgPSBvbGRfc3RhdHMtPmNvbGxpc2lvbnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfY29sbGlzaW9ucyk7CisKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IG9sZF9zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9mcmFtZV90b29fbG9uZ19lcnJvcnMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X3VuZGVyc2l6ZV9wYWNrZXRzKTsKKworCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IG9sZF9zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhiZHNfZW1wdHkpOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9hbGlnbl9lcnJvcnMpOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyA9IG9sZF9zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfZGlzY2FyZHMpOworCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyA9IG9sZF9zdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpOworCisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2NyY19lcnJvcnMgKworCQljYWxjX2NyY19lcnJvcnModHApOworCisJcmV0dXJuIHN0YXRzOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjYWxjX2NyYyh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdTMyIHJlZzsKKwl1MzIgdG1wOworCWludCBqLCBrOworCisJcmVnID0gMHhmZmZmZmZmZjsKKworCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworCQlyZWcgXj0gYnVmW2pdOworCisJCWZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwkJCXRtcCA9IHJlZyAmIDB4MDE7CisKKwkJCXJlZyA+Pj0gMTsKKworCQkJaWYgKHRtcCkgeworCQkJCXJlZyBePSAweGVkYjg4MzIwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIH5yZWc7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfbXVsdGkoc3RydWN0IHRnMyAqdHAsIHVuc2lnbmVkIGludCBhY2NlcHRfYWxsKQoreworCS8qIGFjY2VwdCBvciByZWplY3QgYWxsIG11bHRpY2FzdCBmcmFtZXMgKi8KKwl0dzMyKE1BQ19IQVNIX1JFR18wLCBhY2NlcHRfYWxsID8gMHhmZmZmZmZmZiA6IDApOworCXR3MzIoTUFDX0hBU0hfUkVHXzEsIGFjY2VwdF9hbGwgPyAweGZmZmZmZmZmIDogMCk7CisJdHczMihNQUNfSEFTSF9SRUdfMiwgYWNjZXB0X2FsbCA/IDB4ZmZmZmZmZmYgOiAwKTsKKwl0dzMyKE1BQ19IQVNIX1JFR18zLCBhY2NlcHRfYWxsID8gMHhmZmZmZmZmZiA6IDApOworfQorCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcnhfbW9kZTsKKworCXJ4X21vZGUgPSB0cC0+cnhfbW9kZSAmIH4oUlhfTU9ERV9QUk9NSVNDIHwKKwkJCQkgIFJYX01PREVfS0VFUF9WTEFOX1RBRyk7CisKKwkvKiBXaGVuIEFTRiBpcyBpbiB1c2UsIHdlIGFsd2F5cyBrZWVwIHRoZSBSWF9NT0RFX0tFRVBfVkxBTl9UQUcKKwkgKiBmbGFnIGNsZWFyLgorCSAqLworI2lmIFRHM19WTEFOX1RBR19VU0VECisJaWYgKCF0cC0+dmxncnAgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpCisJCXJ4X21vZGUgfD0gUlhfTU9ERV9LRUVQX1ZMQU5fVEFHOworI2Vsc2UKKwkvKiBCeSBkZWZpbml0aW9uLCBWTEFOIGlzIGRpc2FibGVkIGFsd2F5cyBpbiB0aGlzCisJICogY2FzZS4KKwkgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpCisJCXJ4X21vZGUgfD0gUlhfTU9ERV9LRUVQX1ZMQU5fVEFHOworI2VuZGlmCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUuICovCisJCXJ4X21vZGUgfD0gUlhfTU9ERV9QUk9NSVNDOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBBY2NlcHQgYWxsIG11bHRpY2FzdC4gKi8KKwkJdGczX3NldF9tdWx0aSAodHAsIDEpOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA8IDEpIHsKKwkJLyogUmVqZWN0IGFsbCBtdWx0aWNhc3QuICovCisJCXRnM19zZXRfbXVsdGkgKHRwLCAwKTsKKwl9IGVsc2UgeworCQkvKiBBY2NlcHQgb25lIG9yIG1vcmUgbXVsdGljYXN0KHMpLiAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJdW5zaWduZWQgaW50IGk7CisJCXUzMiBtY19maWx0ZXJbNF0gPSB7IDAsIH07CisJCXUzMiByZWdpZHg7CisJCXUzMiBiaXQ7CisJCXUzMiBjcmM7CisKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKworCQkJY3JjID0gY2FsY19jcmMgKG1jbGlzdC0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKwkJCWJpdCA9IH5jcmMgJiAweDdmOworCQkJcmVnaWR4ID0gKGJpdCAmIDB4NjApID4+IDU7CisJCQliaXQgJj0gMHgxZjsKKwkJCW1jX2ZpbHRlcltyZWdpZHhdIHw9ICgxIDw8IGJpdCk7CisJCX0KKworCQl0dzMyKE1BQ19IQVNIX1JFR18wLCBtY19maWx0ZXJbMF0pOworCQl0dzMyKE1BQ19IQVNIX1JFR18xLCBtY19maWx0ZXJbMV0pOworCQl0dzMyKE1BQ19IQVNIX1JFR18yLCBtY19maWx0ZXJbMl0pOworCQl0dzMyKE1BQ19IQVNIX1JFR18zLCBtY19maWx0ZXJbM10pOworCX0KKworCWlmIChyeF9tb2RlICE9IHRwLT5yeF9tb2RlKSB7CisJCXRwLT5yeF9tb2RlID0gcnhfbW9kZTsKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCByeF9tb2RlKTsKKwkJdWRlbGF5KDEwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwlfX3RnM19zZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Cit9CisKKyNkZWZpbmUgVEczX1JFR0RVTVBfTEVOCQkoMzIgKiAxMDI0KQorCitzdGF0aWMgaW50IHRnM19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gVEczX1JFR0RVTVBfTEVOOworfQorCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqX3ApCit7CisJdTMyICpwID0gX3A7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4ICpvcmlnX3AgPSBfcDsKKwlpbnQgaTsKKworCXJlZ3MtPnZlcnNpb24gPSAwOworCisJbWVtc2V0KHAsIDAsIFRHM19SRUdEVU1QX0xFTik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKyNkZWZpbmUgX19HRVRfUkVHMzIocmVnKQkoKihwKSsrID0gdHIzMihyZWcpKQorI2RlZmluZSBHRVRfUkVHMzJfTE9PUChiYXNlLGxlbikJCVwKK2RvIHsJcCA9ICh1MzIgKikob3JpZ19wICsgKGJhc2UpKTsJCVwKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCQlcCisJCV9fR0VUX1JFRzMyKChiYXNlKSArIGkpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZSBHRVRfUkVHMzJfMShyZWcpCQkJXAorZG8gewlwID0gKHUzMiAqKShvcmlnX3AgKyAocmVnKSk7CQlcCisJX19HRVRfUkVHMzIoKHJlZykpOwkJCVwKK30gd2hpbGUgKDApCisKKwlHRVRfUkVHMzJfTE9PUChURzNQQ0lfVkVORE9SLCAweGIwKTsKKwlHRVRfUkVHMzJfTE9PUChNQUlMQk9YX0lOVEVSUlVQVF8wLCAweDIwMCk7CisJR0VUX1JFRzMyX0xPT1AoTUFDX01PREUsIDB4NGYwKTsKKwlHRVRfUkVHMzJfTE9PUChTTkREQVRBSV9NT0RFLCAweGUwKTsKKwlHRVRfUkVHMzJfMShTTkREQVRBQ19NT0RFKTsKKwlHRVRfUkVHMzJfTE9PUChTTkRCRFNfTU9ERSwgMHg4MCk7CisJR0VUX1JFRzMyX0xPT1AoU05EQkRJX01PREUsIDB4NDgpOworCUdFVF9SRUczMl8xKFNOREJEQ19NT0RFKTsKKwlHRVRfUkVHMzJfTE9PUChSQ1ZMUENfTU9ERSwgMHgyMCk7CisJR0VUX1JFRzMyX0xPT1AoUkNWTFBDX1NFTExTVF9CQVNFLCAweDE1Yyk7CisJR0VUX1JFRzMyX0xPT1AoUkNWREJESV9NT0RFLCAweDBjKTsKKwlHRVRfUkVHMzJfTE9PUChSQ1ZEQkRJX0pVTUJPX0JELCAweDNjKTsKKwlHRVRfUkVHMzJfTE9PUChSQ1ZEQkRJX0JEX1BST0RfSURYXzAsIDB4NDQpOworCUdFVF9SRUczMl8xKFJDVkRDQ19NT0RFKTsKKwlHRVRfUkVHMzJfTE9PUChSQ1ZCRElfTU9ERSwgMHgyMCk7CisJR0VUX1JFRzMyX0xPT1AoUkNWQ0NfTU9ERSwgMHgxNCk7CisJR0VUX1JFRzMyX0xPT1AoUkNWTFNDX01PREUsIDB4MDgpOworCUdFVF9SRUczMl8xKE1CRlJFRV9NT0RFKTsKKwlHRVRfUkVHMzJfTE9PUChIT1NUQ0NfTU9ERSwgMHgxMDApOworCUdFVF9SRUczMl9MT09QKE1FTUFSQl9NT0RFLCAweDEwKTsKKwlHRVRfUkVHMzJfTE9PUChCVUZNR1JfTU9ERSwgMHg1OCk7CisJR0VUX1JFRzMyX0xPT1AoUkRNQUNfTU9ERSwgMHgwOCk7CisJR0VUX1JFRzMyX0xPT1AoV0RNQUNfTU9ERSwgMHgwOCk7CisJR0VUX1JFRzMyX0xPT1AoUlhfQ1BVX0JBU0UsIDB4MjgwKTsKKwlHRVRfUkVHMzJfTE9PUChUWF9DUFVfQkFTRSwgMHgyODApOworCUdFVF9SRUczMl9MT09QKEdSQ01CT1hfSU5URVJSVVBUXzAsIDB4MTEwKTsKKwlHRVRfUkVHMzJfTE9PUChGVFFfUkVTRVQsIDB4MTIwKTsKKwlHRVRfUkVHMzJfTE9PUChNU0dJTlRfTU9ERSwgMHgwYyk7CisJR0VUX1JFRzMyXzEoRE1BQ19NT0RFKTsKKwlHRVRfUkVHMzJfTE9PUChHUkNfTU9ERSwgMHg0Yyk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkKKwkJR0VUX1JFRzMyX0xPT1AoTlZSQU1fQ01ELCAweDI0KTsKKworI3VuZGVmIF9fR0VUX1JFRzMyCisjdW5kZWYgR0VUX1JFRzMyX0xPT1AKKyN1bmRlZiBHRVRfUkVHMzJfMQorCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKK30KKworc3RhdGljIGludCB0ZzNfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gdHAtPm52cmFtX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWQoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiAqdmFsKTsKKworc3RhdGljIGludCB0ZzNfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisJdTggICpwZDsKKwl1MzIgaSwgb2Zmc2V0LCBsZW4sIHZhbCwgYl9vZmZzZXQsIGJfY291bnQ7CisKKwlvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKwlsZW4gPSBlZXByb20tPmxlbjsKKwllZXByb20tPmxlbiA9IDA7CisKKwllZXByb20tPm1hZ2ljID0gVEczX0VFUFJPTV9NQUdJQzsKKworCWlmIChvZmZzZXQgJiAzKSB7CisJCS8qIGFkanVzdG1lbnRzIHRvIHN0YXJ0IG9uIHJlcXVpcmVkIDQgYnl0ZSBib3VuZGFyeSAqLworCQliX29mZnNldCA9IG9mZnNldCAmIDM7CisJCWJfY291bnQgPSA0IC0gYl9vZmZzZXQ7CisJCWlmIChiX2NvdW50ID4gbGVuKSB7CisJCQkvKiBpLmUuIG9mZnNldD0xIGxlbj0yICovCisJCQliX2NvdW50ID0gbGVuOworCQl9CisJCXJldCA9IHRnM19udnJhbV9yZWFkKHRwLCBvZmZzZXQtYl9vZmZzZXQsICZ2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJdmFsID0gY3B1X3RvX2xlMzIodmFsKTsKKwkJbWVtY3B5KGRhdGEsICgoY2hhciopJnZhbCkgKyBiX29mZnNldCwgYl9jb3VudCk7CisJCWxlbiAtPSBiX2NvdW50OworCQlvZmZzZXQgKz0gYl9jb3VudDsKKwkgICAgICAgIGVlcHJvbS0+bGVuICs9IGJfY291bnQ7CisJfQorCisJLyogcmVhZCBieXRlcyB1cHRvIHRoZSBsYXN0IDQgYnl0ZSBib3VuZGFyeSAqLworCXBkID0gJmRhdGFbZWVwcm9tLT5sZW5dOworCWZvciAoaSA9IDA7IGkgPCAobGVuIC0gKGxlbiAmIDMpKTsgaSArPSA0KSB7CisJCXJldCA9IHRnM19udnJhbV9yZWFkKHRwLCBvZmZzZXQgKyBpLCAmdmFsKTsKKwkJaWYgKHJldCkgeworCQkJZWVwcm9tLT5sZW4gKz0gaTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJdmFsID0gY3B1X3RvX2xlMzIodmFsKTsKKwkJbWVtY3B5KHBkICsgaSwgJnZhbCwgNCk7CisJfQorCWVlcHJvbS0+bGVuICs9IGk7CisKKwlpZiAobGVuICYgMykgeworCQkvKiByZWFkIGxhc3QgYnl0ZXMgbm90IGVuZGluZyBvbiA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJcGQgPSAmZGF0YVtlZXByb20tPmxlbl07CisJCWJfY291bnQgPSBsZW4gJiAzOworCQliX29mZnNldCA9IG9mZnNldCArIGxlbiAtIGJfY291bnQ7CisJCXJldCA9IHRnM19udnJhbV9yZWFkKHRwLCBiX29mZnNldCwgJnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQl2YWwgPSBjcHVfdG9fbGUzMih2YWwpOworCQltZW1jcHkocGQsICgoY2hhciopJnZhbCksIGJfY291bnQpOworCQllZXByb20tPmxlbiArPSBiX2NvdW50OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfbnZyYW1fd3JpdGVfYmxvY2soc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiBsZW4sIHU4ICpidWYpOyAKKworc3RhdGljIGludCB0ZzNfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisJdTMyIG9mZnNldCwgbGVuLCBiX29mZnNldCwgb2RkX2xlbiwgc3RhcnQsIGVuZDsKKwl1OCAqYnVmOworCisJaWYgKGVlcHJvbS0+bWFnaWMgIT0gVEczX0VFUFJPTV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKwlsZW4gPSBlZXByb20tPmxlbjsKKworCWlmICgoYl9vZmZzZXQgPSAob2Zmc2V0ICYgMykpKSB7CisJCS8qIGFkanVzdG1lbnRzIHRvIHN0YXJ0IG9uIHJlcXVpcmVkIDQgYnl0ZSBib3VuZGFyeSAqLworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0LWJfb2Zmc2V0LCAmc3RhcnQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJc3RhcnQgPSBjcHVfdG9fbGUzMihzdGFydCk7CisJCWxlbiArPSBiX29mZnNldDsKKwkJb2Zmc2V0ICY9IH4zOworCX0KKworCW9kZF9sZW4gPSAwOworCWlmICgobGVuICYgMykgJiYgKChsZW4gPiA0KSB8fCAoYl9vZmZzZXQgPT0gMCkpKSB7CisJCS8qIGFkanVzdG1lbnRzIHRvIGVuZCBvbiByZXF1aXJlZCA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJb2RkX2xlbiA9IDE7CisJCWxlbiA9IChsZW4gKyAzKSAmIH4zOworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0K2xlbi00LCAmZW5kKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWVuZCA9IGNwdV90b19sZTMyKGVuZCk7CisJfQorCisJYnVmID0gZGF0YTsKKwlpZiAoYl9vZmZzZXQgfHwgb2RkX2xlbikgeworCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gMCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoYl9vZmZzZXQpCisJCQltZW1jcHkoYnVmLCAmc3RhcnQsIDQpOworCQlpZiAob2RkX2xlbikKKwkJCW1lbWNweShidWYrbGVuLTQsICZlbmQsIDQpOworCQltZW1jcHkoYnVmICsgYl9vZmZzZXQsIGRhdGEsIGVlcHJvbS0+bGVuKTsKKwl9CisKKwlyZXQgPSB0ZzNfbnZyYW1fd3JpdGVfYmxvY2sodHAsIG9mZnNldCwgbGVuLCBidWYpOworCisJaWYgKGJ1ZiAhPSBkYXRhKQorCQlrZnJlZShidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworICAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKQorCQljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkKKwkJY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJICBTVVBQT1JURURfTUlJKTsKKwllbHNlCisJCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKyAgCisJY21kLT5hZHZlcnRpc2luZyA9IHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZzsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWNtZC0+c3BlZWQgPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkOworCQljbWQtPmR1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4OworCX0KKwljbWQtPnBvcnQgPSAwOworCWNtZC0+cGh5X2FkZHJlc3MgPSBQSFlfQUREUjsKKwljbWQtPnRyYW5zY2VpdmVyID0gMDsKKwljbWQtPmF1dG9uZWcgPSB0cC0+bGlua19jb25maWcuYXV0b25lZzsKKwljbWQtPm1heHR4cGt0ID0gMDsKKwljbWQtPm1heHJ4cGt0ID0gMDsKKwlyZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgaW50IHRnM19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCS8qIFRoZXNlIGFyZSB0aGUgb25seSB2YWxpZCBhZHZlcnRpc2VtZW50IGJpdHMgYWxsb3dlZC4gICovCisJCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYKKwkJICAgIChjbWQtPmFkdmVydGlzaW5nICYgfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkJICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICBBRFZFUlRJU0VEX0F1dG9uZWcgfAorCQkJCQkgIEFEVkVSVElTRURfRklCUkUpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gY21kLT5hdXRvbmVnOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0gY21kLT5hZHZlcnRpc2luZzsKKwkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9JTlZBTElEOworCX0gZWxzZSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IDA7CisJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IGNtZC0+c3BlZWQ7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBjbWQtPmR1cGxleDsKKyAgCX0KKyAgCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJdGczX3NldHVwX3BoeSh0cCwgMSk7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh0cC0+cGRldikpOworfQorICAKK3N0YXRpYyB2b2lkIHRnM19nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9NQUdJQzsKKwl3b2wtPndvbG9wdHMgPSAwOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkKKwkJd29sLT53b2xvcHRzID0gV0FLRV9NQUdJQzsKKwltZW1zZXQoJndvbC0+c29wYXNzLCAwLCBzaXplb2Yod29sLT5zb3Bhc3MpKTsKK30KKyAgCitzdGF0aWMgaW50IHRnM19zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCWlmICh3b2wtPndvbG9wdHMgJiB+V0FLRV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKSAmJgorCSAgICB0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU0VSREVTX1dPTF9DQVApKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1dPTF9FTkFCTEU7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19XT0xfRU5BQkxFOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgdTMyIHRnM19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHRwLT5tc2dfZW5hYmxlOworfQorICAKK3N0YXRpYyB2b2lkIHRnM19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorICAKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorc3RhdGljIGludCB0ZzNfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkpIHsKKwkJaWYgKHZhbHVlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZXRodG9vbF9vcF9zZXRfdHNvKGRldiwgdmFsdWUpOworfQorI2VuZGlmCisgIAorc3RhdGljIGludCB0ZzNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgYm1jcjsKKwlpbnQgcjsKKyAgCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXIgPSAtRUlOVkFMOworCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpOworCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcikgJiYKKwkgICAgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9BTlJFU1RBUlQpOworCQlyID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiByOworfQorICAKK3N0YXRpYyB2b2lkIHRnM19nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwllcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBURzNfUlhfUklOR19TSVpFIC0gMTsKKwllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gVEczX1JYX0pVTUJPX1JJTkdfU0laRSAtIDE7CisKKwllcmluZy0+cnhfcGVuZGluZyA9IHRwLT5yeF9wZW5kaW5nOworCWVyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCWVyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gdHAtPnJ4X2p1bWJvX3BlbmRpbmc7CisJZXJpbmctPnR4X3BlbmRpbmcgPSB0cC0+dHhfcGVuZGluZzsKK30KKyAgCitzdGF0aWMgaW50IHRnM19zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlpZiAoKGVyaW5nLT5yeF9wZW5kaW5nID4gVEczX1JYX1JJTkdfU0laRSAtIDEpIHx8CisJICAgIChlcmluZy0+cnhfanVtYm9fcGVuZGluZyA+IFRHM19SWF9KVU1CT19SSU5HX1NJWkUgLSAxKSB8fAorCSAgICAoZXJpbmctPnR4X3BlbmRpbmcgPiBURzNfVFhfUklOR19TSVpFIC0gMSkpCisJCXJldHVybiAtRUlOVkFMOworICAKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQl0ZzNfbmV0aWZfc3RvcCh0cCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisgIAorCXRwLT5yeF9wZW5kaW5nID0gZXJpbmctPnJ4X3BlbmRpbmc7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTUFYX1JYUEVORF82NCkgJiYKKwkgICAgdHAtPnJ4X3BlbmRpbmcgPiA2MykKKwkJdHAtPnJ4X3BlbmRpbmcgPSA2MzsKKwl0cC0+cnhfanVtYm9fcGVuZGluZyA9IGVyaW5nLT5yeF9qdW1ib19wZW5kaW5nOworCXRwLT50eF9wZW5kaW5nID0gZXJpbmctPnR4X3BlbmRpbmc7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXRnM19oYWx0KHRwKTsKKwkJdGczX2luaXRfaHcodHApOworCQl0ZzNfbmV0aWZfc3RhcnQodHApOworCX0KKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiAwOworfQorICAKK3N0YXRpYyB2b2lkIHRnM19nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwllcGF1c2UtPmF1dG9uZWcgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BBVVNFX0FVVE9ORUcpICE9IDA7CisJZXBhdXNlLT5yeF9wYXVzZSA9ICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpICE9IDA7CisJZXBhdXNlLT50eF9wYXVzZSA9ICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpICE9IDA7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJdGczX25ldGlmX3N0b3AodHApOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCWlmIChlcGF1c2UtPmF1dG9uZWcpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUEFVU0VfQVVUT05FRzsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CisJaWYgKGVwYXVzZS0+cnhfcGF1c2UpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUlhfUEFVU0U7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19SWF9QQVVTRTsKKwlpZiAoZXBhdXNlLT50eF9wYXVzZSkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19UWF9QQVVTRTsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1RYX1BBVVNFOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQl0ZzNfaGFsdCh0cCk7CisJCXRnM19pbml0X2h3KHRwKTsKKwkJdGczX25ldGlmX3N0YXJ0KHRwKTsKKwl9CisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHUzMiB0ZzNfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TKSAhPSAwOworfQorICAKK3N0YXRpYyBpbnQgdGczX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TKSB7CisJCWlmIChkYXRhICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlyZXR1cm4gMDsKKyAgCX0KKyAgCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCWlmIChkYXRhKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1JYX0NIRUNLU1VNUzsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1JYX0NIRUNLU1VNUzsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVMpIHsKKwkJaWYgKGRhdGEgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworICAJCXJldHVybiAwOworICAJfQorICAKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfZ2V0X3N0YXRzX2NvdW50IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBURzNfTlVNX1NUQVRTOworfQorCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3N0cmluZ3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCit7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGJ1ZiwgJmV0aHRvb2xfc3RhdHNfa2V5cywgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOwkvKiB3ZSBuZWVkIGEgV0FSTigpICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdGczX2dldF9ldGh0b29sX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBldGh0b29sX3N0YXRzICplc3RhdHMsIHU2NCAqdG1wX3N0YXRzKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltZW1jcHkodG1wX3N0YXRzLCB0ZzNfZ2V0X2VzdGF0cyh0cCksIHNpemVvZih0cC0+ZXN0YXRzKSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCWRhdGEtPnBoeV9pZCA9IFBIWV9BRERSOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBTSU9DR01JSVJFRzogeworCQl1MzIgbWlpX3JlZ3ZhbDsKKworCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQkJYnJlYWs7CQkJLyogV2UgaGF2ZSBubyBQSFkgKi8KKworCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJCWVyciA9IHRnM19yZWFkcGh5KHRwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgJm1paV9yZWd2YWwpOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCQlkYXRhLT52YWxfb3V0ID0gbWlpX3JlZ3ZhbDsKKworCQlyZXR1cm4gZXJyOworCX0KKworCWNhc2UgU0lPQ1NNSUlSRUc6CisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpCisJCQlicmVhazsJCQkvKiBXZSBoYXZlIG5vIFBIWSAqLworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCQllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCQlyZXR1cm4gZXJyOworCisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKK3N0YXRpYyB2b2lkIHRnM192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJdHAtPnZsZ3JwID0gZ3JwOworCisJLyogVXBkYXRlIFJYX01PREVfS0VFUF9WTEFOX1RBRyBiaXQgaW4gUlhfTU9ERSByZWdpc3Rlci4gKi8KKwlfX3RnM19zZXRfcnhfbW9kZShkZXYpOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdGczX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwlpZiAodHAtPnZsZ3JwKQorCQl0cC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdGczX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gdGczX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHRnM19zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IHRnM19nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IHRnM19nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IHRnM19nZXRfcmVncywKKwkuZ2V0X3dvbAkJPSB0ZzNfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSB0ZzNfc2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCQk9IHRnM19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSB0ZzNfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0CQk9IHRnM19ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbgkJPSB0ZzNfZ2V0X2VlcHJvbV9sZW4sCisJLmdldF9lZXByb20JCT0gdGczX2dldF9lZXByb20sCisJLnNldF9lZXByb20JCT0gdGczX3NldF9lZXByb20sCisJLmdldF9yaW5ncGFyYW0JCT0gdGczX2dldF9yaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0JCT0gdGczX3NldF9yaW5ncGFyYW0sCisJLmdldF9wYXVzZXBhcmFtCQk9IHRnM19nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0JCT0gdGczX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfcnhfY3N1bQkJPSB0ZzNfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IHRnM19zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gdGczX3NldF90eF9jc3VtLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvCQk9IHRnM19zZXRfdHNvLAorI2VuZGlmCisJLmdldF9zdHJpbmdzCQk9IHRnM19nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50CT0gdGczX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSB0ZzNfZ2V0X2V0aHRvb2xfc3RhdHMsCit9OworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9lZXByb21fc2l6ZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgY3Vyc2l6ZSwgdmFsOworCisJdHAtPm52cmFtX3NpemUgPSBFRVBST01fQ0hJUF9TSVpFOworCisJaWYgKHRnM19udnJhbV9yZWFkKHRwLCAwLCAmdmFsKSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAoc3dhYjMyKHZhbCkgIT0gVEczX0VFUFJPTV9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTaXplIHRoZSBjaGlwIGJ5IHJlYWRpbmcgb2Zmc2V0cyBhdCBpbmNyZWFzaW5nIHBvd2VycyBvZiB0d28uCisJICogV2hlbiB3ZSBlbmNvdW50ZXIgb3VyIHZhbGlkYXRpb24gc2lnbmF0dXJlLCB3ZSBrbm93IHRoZSBhZGRyZXNzaW5nCisJICogaGFzIHdyYXBwZWQgYXJvdW5kLCBhbmQgdGh1cyBoYXZlIG91ciBjaGlwIHNpemUuCisJICovCisJY3Vyc2l6ZSA9IDB4ODAwOworCisJd2hpbGUgKGN1cnNpemUgPCB0cC0+bnZyYW1fc2l6ZSkgeworCQlpZiAodGczX252cmFtX3JlYWQodHAsIGN1cnNpemUsICZ2YWwpICE9IDApCisJCQlyZXR1cm47CisKKwkJaWYgKHN3YWIzMih2YWwpID09IFRHM19FRVBST01fTUFHSUMpCisJCQlicmVhazsKKworCQljdXJzaXplIDw8PSAxOworCX0KKworCXRwLT5udnJhbV9zaXplID0gY3Vyc2l6ZTsKK30KKwkJCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9udnJhbV9zaXplKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiB2YWw7CisKKwlpZiAodGczX252cmFtX3JlYWQodHAsIDB4ZjAsICZ2YWwpID09IDApIHsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQl0cC0+bnZyYW1fc2l6ZSA9ICh2YWwgPj4gMTYpICogMTAyNDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl0cC0+bnZyYW1fc2l6ZSA9IDB4MjAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfZ2V0X252cmFtX2luZm8oc3RydWN0IHRnMyAqdHApCit7CisJdTMyIG52Y2ZnMTsKKworCW52Y2ZnMSA9IHRyMzIoTlZSQU1fQ0ZHMSk7CisJaWYgKG52Y2ZnMSAmIE5WUkFNX0NGRzFfRkxBU0hJRl9FTkFCKSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0ZMQVNIOworCX0KKwllbHNlIHsKKwkJbnZjZmcxICY9IH5OVlJBTV9DRkcxX0NPTVBBVF9CWVBBU1M7CisJCXR3MzIoTlZSQU1fQ0ZHMSwgbnZjZmcxKTsKKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJc3dpdGNoIChudmNmZzEgJiBOVlJBTV9DRkcxX1ZFTkRPUl9NQVNLKSB7CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9BVE1FTF9GTEFTSF9CVUZGRVJFRDoKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19BVE1FTDsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBBVE1FTF9BVDQ1REIwWDFCX1BBR0VfU0laRTsKKwkJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfVU5CVUZGRVJFRDoKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19BVE1FTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPm52cmFtX3BhZ2VzaXplID0gQVRNRUxfQVQyNUY1MTJfUEFHRV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfQVRNRUxfRUVQUk9NOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX0FUTUVMOworICAgICAgICAgICAgICAgICAgICAgICAgIAl0cC0+bnZyYW1fcGFnZXNpemUgPSBBVE1FTF9BVDI0QzUxMl9DSElQX1NJWkU7CisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxBU0hfVkVORE9SX1NUOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX1NUOworCQkJCXRwLT5udnJhbV9wYWdlc2l6ZSA9IFNUX000NVBFWDBfUEFHRV9TSVpFOworCQkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9TQUlGVU46CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfU0FJRlVOOworCQkJCXRwLT5udnJhbV9wYWdlc2l6ZSA9IFNBSUZVTl9TQTI1RjBYWF9QQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9TU1RfU01BTEw6CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9TU1RfTEFSR0U6CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfU1NUOworCQkJCXRwLT5udnJhbV9wYWdlc2l6ZSA9IFNTVF8yNVZGMFgwX1BBR0VfU0laRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIHsKKwkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfQVRNRUw7CisJCXRwLT5udnJhbV9wYWdlc2l6ZSA9IEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9TSVpFOworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEOworCX0KK30KKworLyogQ2hpcHMgb3RoZXIgdGhhbiA1NzAwLzU3MDEgdXNlIHRoZSBOVlJBTSBmb3IgZmV0Y2hpbmcgaW5mby4gKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfbnZyYW1faW5pdChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgajsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKQorCQlyZXR1cm47CisKKwl0dzMyX2YoR1JDX0VFUFJPTV9BRERSLAorCSAgICAgKEVFUFJPTV9BRERSX0ZTTV9SRVNFVCB8CisJICAgICAgKEVFUFJPTV9ERUZBVUxUX0NMT0NLX1BFUklPRCA8PAorCSAgICAgICBFRVBST01fQUREUl9DTEtQRVJEX1NISUZUKSkpOworCisJLyogWFhYIHNjaGVkdWxlX3RpbWVvdXQoKSAuLi4gKi8KKwlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspCisJCXVkZWxheSgxMCk7CisKKwkvKiBFbmFibGUgc2VlcHJvbSBhY2Nlc3Nlcy4gKi8KKwl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsCisJICAgICB0cjMyKEdSQ19MT0NBTF9DVFJMKSB8IEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTSk7CisJdWRlbGF5KDEwMCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzIHwgQUNDRVNTX0VOQUJMRSk7CisJCX0KKworCQl0ZzNfZ2V0X252cmFtX2luZm8odHApOworCQl0ZzNfZ2V0X252cmFtX3NpemUodHApOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCQl0dzMyKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgJiB+QUNDRVNTX0VOQUJMRSk7CisJCX0KKworCX0gZWxzZSB7CisJCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19OVlJBTSB8IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEKTsKKworCQl0ZzNfZ2V0X2VlcHJvbV9zaXplKHRwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWRfdXNpbmdfZWVwcm9tKHN0cnVjdCB0ZzMgKnRwLAorCQkJCQl1MzIgb2Zmc2V0LCB1MzIgKnZhbCkKK3sKKwl1MzIgdG1wOworCWludCBpOworCisJaWYgKG9mZnNldCA+IEVFUFJPTV9BRERSX0FERFJfTUFTSyB8fAorCSAgICAob2Zmc2V0ICUgNCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSB0cjMyKEdSQ19FRVBST01fQUREUikgJiB+KEVFUFJPTV9BRERSX0FERFJfTUFTSyB8CisJCQkJCUVFUFJPTV9BRERSX0RFVklEX01BU0sgfAorCQkJCQlFRVBST01fQUREUl9SRUFEKTsKKwl0dzMyKEdSQ19FRVBST01fQUREUiwKKwkgICAgIHRtcCB8CisJICAgICAoMCA8PCBFRVBST01fQUREUl9ERVZJRF9TSElGVCkgfAorCSAgICAgKChvZmZzZXQgPDwgRUVQUk9NX0FERFJfQUREUl9TSElGVCkgJgorCSAgICAgIEVFUFJPTV9BRERSX0FERFJfTUFTSykgfAorCSAgICAgRUVQUk9NX0FERFJfUkVBRCB8IEVFUFJPTV9BRERSX1NUQVJUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXRtcCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKKworCQlpZiAodG1wICYgRUVQUk9NX0FERFJfQ09NUExFVEUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmICghKHRtcCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCSp2YWwgPSB0cjMyKEdSQ19FRVBST01fREFUQSk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTlZSQU1fQ01EX1RJTUVPVVQgMTAwMDAKKworc3RhdGljIGludCB0ZzNfbnZyYW1fZXhlY19jbWQoc3RydWN0IHRnMyAqdHAsIHUzMiBudnJhbV9jbWQpCit7CisJaW50IGk7CisKKwl0dzMyKE5WUkFNX0NNRCwgbnZyYW1fY21kKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlZSQU1fQ01EX1RJTUVPVVQ7IGkrKykgeworCQl1ZGVsYXkoMTApOworCQlpZiAodHIzMihOVlJBTV9DTUQpICYgTlZSQU1fQ01EX0RPTkUpIHsKKwkJCXVkZWxheSgxMCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBOVlJBTV9DTURfVElNRU9VVCkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfbnZyYW1fcmVhZChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZnNldCwgdTMyICp2YWwpCit7CisJaW50IHJldDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkF0dGVtcHQgdG8gZG8gbnZyYW1fcmVhZCBvbiBTdW4gNTcwWFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkpCisJCXJldHVybiB0ZzNfbnZyYW1fcmVhZF91c2luZ19lZXByb20odHAsIG9mZnNldCwgdmFsKTsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNX0JVRkZFUkVEKSAmJgorCQkodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkgJiYKKwkJKHRwLT5udnJhbV9qZWRlY251bSA9PSBKRURFQ19BVE1FTCkpIHsKKworCQlvZmZzZXQgPSAoKG9mZnNldCAvIHRwLT5udnJhbV9wYWdlc2l6ZSkgPDwKKwkJCSAgQVRNRUxfQVQ0NURCMFgxQl9QQUdFX1BPUykgKworCQkJKG9mZnNldCAlIHRwLT5udnJhbV9wYWdlc2l6ZSk7CisJfQorCisJaWYgKG9mZnNldCA+IE5WUkFNX0FERFJfTVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRnM19udnJhbV9sb2NrKHRwKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQl1MzIgbnZhY2Nlc3MgPSB0cjMyKE5WUkFNX0FDQ0VTUyk7CisKKwkJdHczMl9mKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgfCBBQ0NFU1NfRU5BQkxFKTsKKwl9CisKKwl0dzMyKE5WUkFNX0FERFIsIG9mZnNldCk7CisJcmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLCBOVlJBTV9DTURfUkQgfCBOVlJBTV9DTURfR08gfAorCQlOVlJBTV9DTURfRklSU1QgfCBOVlJBTV9DTURfTEFTVCB8IE5WUkFNX0NNRF9ET05FKTsKKworCWlmIChyZXQgPT0gMCkKKwkJKnZhbCA9IHN3YWIzMih0cjMyKE5WUkFNX1JEREFUQSkpOworCisJdGczX252cmFtX3VubG9jayh0cCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCXR3MzJfZihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzICYgfkFDQ0VTU19FTkFCTEUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrX3VzaW5nX2VlcHJvbShzdHJ1Y3QgdGczICp0cCwKKwkJCQkgICAgdTMyIG9mZnNldCwgdTMyIGxlbiwgdTggKmJ1ZikKK3sKKwlpbnQgaSwgaiwgcmMgPSAwOworCXUzMiB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKKwkJdTMyIGFkZHIsIGRhdGE7CisKKwkJYWRkciA9IG9mZnNldCArIGk7CisKKwkJbWVtY3B5KCZkYXRhLCBidWYgKyBpLCA0KTsKKworCQl0dzMyKEdSQ19FRVBST01fREFUQSwgY3B1X3RvX2xlMzIoZGF0YSkpOworCisJCXZhbCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKKwkJdHczMihHUkNfRUVQUk9NX0FERFIsIHZhbCB8IEVFUFJPTV9BRERSX0NPTVBMRVRFKTsKKworCQl2YWwgJj0gfihFRVBST01fQUREUl9BRERSX01BU0sgfCBFRVBST01fQUREUl9ERVZJRF9NQVNLIHwKKwkJCUVFUFJPTV9BRERSX1JFQUQpOworCQl0dzMyKEdSQ19FRVBST01fQUREUiwgdmFsIHwKKwkJCSgwIDw8IEVFUFJPTV9BRERSX0RFVklEX1NISUZUKSB8CisJCQkoYWRkciAmIEVFUFJPTV9BRERSX0FERFJfTUFTSykgfAorCQkJRUVQUk9NX0FERFJfU1RBUlQgfAorCQkJRUVQUk9NX0FERFJfV1JJVEUpOworCQkKKwkJZm9yIChqID0gMDsgaiA8IDEwMDAwOyBqKyspIHsKKwkJCXZhbCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKKworCQkJaWYgKHZhbCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwkJaWYgKCEodmFsICYgRUVQUk9NX0FERFJfQ09NUExFVEUpKSB7CisJCQlyYyA9IC1FQlVTWTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZHdvcmQgYWxpZ25lZCAqLworc3RhdGljIGludCB0ZzNfbnZyYW1fd3JpdGVfYmxvY2tfdW5idWZmZXJlZChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZnNldCwgdTMyIGxlbiwKKwkJdTggKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgcGFnZXNpemUgPSB0cC0+bnZyYW1fcGFnZXNpemU7CisJdTMyIHBhZ2VtYXNrID0gcGFnZXNpemUgLSAxOworCXUzMiBudnJhbV9jbWQ7CisJdTggKnRtcDsKKworCXRtcCA9IGttYWxsb2MocGFnZXNpemUsIEdGUF9LRVJORUwpOworCWlmICh0bXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAobGVuKSB7CisJCWludCBqOworCQl1MzIgcGh5X2FkZHIsIHBhZ2Vfb2ZmLCBzaXplLCBudmFjY2VzczsKKworCQlwaHlfYWRkciA9IG9mZnNldCAmIH5wYWdlbWFzazsKKwkKKwkJZm9yIChqID0gMDsgaiA8IHBhZ2VzaXplOyBqICs9IDQpIHsKKwkJCWlmICgocmV0ID0gdGczX252cmFtX3JlYWQodHAsIHBoeV9hZGRyICsgaiwKKwkJCQkJCSh1MzIgKikgKHRtcCArIGopKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJICAgICAgICBwYWdlX29mZiA9IG9mZnNldCAmIHBhZ2VtYXNrOworCQlzaXplID0gcGFnZXNpemU7CisJCWlmIChsZW4gPCBzaXplKQorCQkJc2l6ZSA9IGxlbjsKKworCQlsZW4gLT0gc2l6ZTsKKworCQltZW1jcHkodG1wICsgcGFnZV9vZmYsIGJ1Ziwgc2l6ZSk7CisKKwkJb2Zmc2V0ID0gb2Zmc2V0ICsgKHBhZ2VzaXplIC0gcGFnZV9vZmYpOworCisJCW52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCQl0dzMyX2YoTlZSQU1fQUNDRVNTLCBudmFjY2VzcyB8IEFDQ0VTU19FTkFCTEUpOworCisJCS8qCisJCSAqIEJlZm9yZSB3ZSBjYW4gZXJhc2UgdGhlIGZsYXNoIHBhZ2UsIHdlIG5lZWQKKwkJICogdG8gaXNzdWUgYSBzcGVjaWFsICJ3cml0ZSBlbmFibGUiIGNvbW1hbmQuCisJCSAqLworCQludnJhbV9jbWQgPSBOVlJBTV9DTURfV1JFTiB8IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FOworCisJCWlmICh0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCkpCisJCQlicmVhazsKKworCQkvKiBFcmFzZSB0aGUgdGFyZ2V0IHBhZ2UgKi8KKwkJdHczMihOVlJBTV9BRERSLCBwaHlfYWRkcik7CisKKwkJbnZyYW1fY21kID0gTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkUgfCBOVlJBTV9DTURfV1IgfAorCQkJTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QgfCBOVlJBTV9DTURfRVJBU0U7CisKKwkgICAgICAgIGlmICh0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCkpCisJCQlicmVhazsKKworCQkvKiBJc3N1ZSBhbm90aGVyIHdyaXRlIGVuYWJsZSB0byBzdGFydCB0aGUgd3JpdGUuICovCisJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9XUkVOIHwgTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkU7CisKKwkJaWYgKHRnM19udnJhbV9leGVjX2NtZCh0cCwgbnZyYW1fY21kKSkKKwkJCWJyZWFrOworCisJCWZvciAoaiA9IDA7IGogPCBwYWdlc2l6ZTsgaiArPSA0KSB7CisJCQl1MzIgZGF0YTsKKworCSAgICAJCWRhdGEgPSAqKCh1MzIgKikgKHRtcCArIGopKTsKKwkJCXR3MzIoTlZSQU1fV1JEQVRBLCBjcHVfdG9fYmUzMihkYXRhKSk7CisKKwkJCXR3MzIoTlZSQU1fQUREUiwgcGh5X2FkZHIgKyBqKTsKKworCQkJbnZyYW1fY21kID0gTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkUgfAorCQkJCU5WUkFNX0NNRF9XUjsKKworCQkJaWYgKGogPT0gMCkKKwkJCQludnJhbV9jbWQgfD0gTlZSQU1fQ01EX0ZJUlNUOworCQkJZWxzZSBpZiAoaiA9PSAocGFnZXNpemUgLSA0KSkKKwkJCQludnJhbV9jbWQgfD0gTlZSQU1fQ01EX0xBU1Q7CisKKwkJCWlmICgocmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJbnZyYW1fY21kID0gTlZSQU1fQ01EX1dSREkgfCBOVlJBTV9DTURfR08gfCBOVlJBTV9DTURfRE9ORTsKKwl0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCk7CisKKwlrZnJlZSh0bXApOworCisJcmV0dXJuIHJldDsKK30KKworLyogb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGR3b3JkIGFsaWduZWQgKi8KK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrX2J1ZmZlcmVkKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0LCB1MzIgbGVuLAorCQl1OCAqYnVmKQoreworCWludCBpLCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBvZmZzZXQgKz0gNCkgeworCQl1MzIgZGF0YSwgcGFnZV9vZmYsIHBoeV9hZGRyLCBudnJhbV9jbWQ7CisKKwkJbWVtY3B5KCZkYXRhLCBidWYgKyBpLCA0KTsKKwkJdHczMihOVlJBTV9XUkRBVEEsIGNwdV90b19iZTMyKGRhdGEpKTsKKworCSAgICAgICAgcGFnZV9vZmYgPSBvZmZzZXQgJSB0cC0+bnZyYW1fcGFnZXNpemU7CisKKwkJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0ZMQVNIKSAmJgorCQkJKHRwLT5udnJhbV9qZWRlY251bSA9PSBKRURFQ19BVE1FTCkpIHsKKworCQkJcGh5X2FkZHIgPSAoKG9mZnNldCAvIHRwLT5udnJhbV9wYWdlc2l6ZSkgPDwKKwkJCQkgICAgQVRNRUxfQVQ0NURCMFgxQl9QQUdFX1BPUykgKyBwYWdlX29mZjsKKwkJfQorCQllbHNlIHsKKwkJCXBoeV9hZGRyID0gb2Zmc2V0OworCQl9CisKKwkJdHczMihOVlJBTV9BRERSLCBwaHlfYWRkcik7CisKKwkJbnZyYW1fY21kID0gTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkUgfCBOVlJBTV9DTURfV1I7CisKKwkgICAgICAgIGlmICgocGFnZV9vZmYgPT0gMCkgfHwgKGkgPT0gMCkpCisJCQludnJhbV9jbWQgfD0gTlZSQU1fQ01EX0ZJUlNUOworCQllbHNlIGlmIChwYWdlX29mZiA9PSAodHAtPm52cmFtX3BhZ2VzaXplIC0gNCkpCisJCQludnJhbV9jbWQgfD0gTlZSQU1fQ01EX0xBU1Q7CisKKwkJaWYgKGkgPT0gKGxlbiAtIDQpKQorCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOworCisJCWlmICgodHAtPm52cmFtX2plZGVjbnVtID09IEpFREVDX1NUKSAmJgorCQkJKG52cmFtX2NtZCAmIE5WUkFNX0NNRF9GSVJTVCkpIHsKKworCQkJaWYgKChyZXQgPSB0ZzNfbnZyYW1fZXhlY19jbWQodHAsCisJCQkJTlZSQU1fQ01EX1dSRU4gfCBOVlJBTV9DTURfR08gfAorCQkJCU5WUkFNX0NNRF9ET05FKSkpCisKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0ZMQVNIKSkgeworCQkJLyogV2UgYWx3YXlzIGRvIGNvbXBsZXRlIHdvcmQgd3JpdGVzIHRvIGVlcHJvbS4gKi8KKwkJCW52cmFtX2NtZCB8PSAoTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QpOworCQl9CisKKwkJaWYgKChyZXQgPSB0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCkpKQorCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkd29yZCBhbGlnbmVkICovCitzdGF0aWMgaW50IHRnM19udnJhbV93cml0ZV9ibG9jayhzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZnNldCwgdTMyIGxlbiwgdTggKmJ1ZikKK3sKKwlpbnQgcmV0OworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MFgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQXR0ZW1wdCB0byBkbyBudnJhbV93cml0ZSBvbiBTdW4gNTcwWFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QpIHsKKwkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkgICAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEpOworCQl1ZGVsYXkoNDApOworCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkpIHsKKwkJcmV0ID0gdGczX252cmFtX3dyaXRlX2Jsb2NrX3VzaW5nX2VlcHJvbSh0cCwgb2Zmc2V0LCBsZW4sIGJ1Zik7CisJfQorCWVsc2UgeworCQl1MzIgZ3JjX21vZGU7CisKKwkJdGczX252cmFtX2xvY2sodHApOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCQl0dzMyKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgfCBBQ0NFU1NfRU5BQkxFKTsKKworCQkJdHczMihOVlJBTV9XUklURTEsIDB4NDA2KTsKKwkJfQorCisJCWdyY19tb2RlID0gdHIzMihHUkNfTU9ERSk7CisJCXR3MzIoR1JDX01PREUsIGdyY19tb2RlIHwgR1JDX01PREVfTlZSQU1fV1JfRU5BQkxFKTsKKworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCkgfHwKKwkJCSEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkpIHsKKworCQkJcmV0ID0gdGczX252cmFtX3dyaXRlX2Jsb2NrX2J1ZmZlcmVkKHRwLCBvZmZzZXQsIGxlbiwKKwkJCQlidWYpOworCQl9CisJCWVsc2UgeworCQkJcmV0ID0gdGczX252cmFtX3dyaXRlX2Jsb2NrX3VuYnVmZmVyZWQodHAsIG9mZnNldCwgbGVuLAorCQkJCWJ1Zik7CisJCX0KKworCQlncmNfbW9kZSA9IHRyMzIoR1JDX01PREUpOworCQl0dzMyKEdSQ19NT0RFLCBncmNfbW9kZSAmIH5HUkNfTU9ERV9OVlJBTV9XUl9FTkFCTEUpOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCQl0dzMyKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgJiB+QUNDRVNTX0VOQUJMRSk7CisJCX0KKwkJdGczX252cmFtX3VubG9jayh0cCk7CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVCkgeworCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCSAgICAgICBHUkNfTENMQ1RSTF9HUElPX09FMSB8IEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSk7CisJCXVkZWxheSg0MCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHN1YnN5c190YmxfZW50IHsKKwl1MTYgc3Vic3lzX3ZlbmRvciwgc3Vic3lzX2RldmlkOworCXUzMiBwaHlfaWQ7Cit9OworCitzdGF0aWMgc3RydWN0IHN1YnN5c190YmxfZW50IHN1YnN5c19pZF90b19waHlfaWRbXSA9IHsKKwkvKiBCcm9hZGNvbSBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDE2NDQsIFBIWV9JRF9CQ001NDAxIH0sIC8qIEJDTTk1NzAwQTYgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwMSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBNSAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDAyLCBQSFlfSURfQkNNODAwMiB9LCAvKiBCQ005NTcwMFQ2ICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDMsIDAgfSwJCSAgICAvKiBCQ005NTcwMEE5ICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDUsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxVDEgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwNiwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFUOCAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDA3LCAwIH0sCQkgICAgLyogQkNNOTU3MDFBNyAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDA4LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMUExMCAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg4MDA4LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMUExMiAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDA5LCBQSFlfSURfQkNNNTcwMyB9LCAvKiBCQ005NTcwM0F4MSAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg4MDA5LCBQSFlfSURfQkNNNTcwMyB9LCAvKiBCQ005NTcwM0F4MiAqLworCisJLyogM2NvbSBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwMCwgUEhZX0lEX0JDTTU0MDEgfSwgLyogM0M5OTZUICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNiwgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0M5OTZCVCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDQsIDAgfSwJCS8qIDNDOTk2U1ggKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA3LCBQSFlfSURfQkNNNTcwMSB9LCAvKiAzQzEwMDBUICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0M5NDBCUjAxICovCisKKwkvKiBERUxMIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMGQxLCBQSFlfSURfQkNNNTQwMSB9LCAvKiBWSVBFUiAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMDYsIFBIWV9JRF9CQ001NDAxIH0sIC8qIEpBR1VBUiAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMDksIFBIWV9JRF9CQ001NDExIH0sIC8qIE1FUkxPVCAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMGEsIFBIWV9JRF9CQ001NDExIH0sIC8qIFNMSU1fTUVSTE9UICovCisKKwkvKiBDb21wYXEgYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA3YywgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkFOU0hFRSAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA5YSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkFOU0hFRV8yICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDdkLCAwIH0sCQkgIC8qIENIQU5HRUxJTkcgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwODUsIFBIWV9JRF9CQ001NzAxIH0sIC8qIE5DNzc4MCAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA5OSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogTkM3NzgwXzIgKi8KKworCS8qIElCTSBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgMHgwMjgxLCAwIH0gLyogSUJNPz8/ICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdWJzeXNfdGJsX2VudCAqbG9va3VwX2J5X3N1YnN5cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN1YnN5c19pZF90b19waHlfaWQpOyBpKyspIHsKKwkJaWYgKChzdWJzeXNfaWRfdG9fcGh5X2lkW2ldLnN1YnN5c192ZW5kb3IgPT0KKwkJICAgICB0cC0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvcikgJiYKKwkJICAgIChzdWJzeXNfaWRfdG9fcGh5X2lkW2ldLnN1YnN5c19kZXZpZCA9PQorCQkgICAgIHRwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSkKKwkJCXJldHVybiAmc3Vic3lzX2lkX3RvX3BoeV9pZFtpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19waHlfcHJvYmUoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGVlcHJvbV9waHlfaWQsIGh3X3BoeV9pZF8xLCBod19waHlfaWRfMjsKKwl1MzIgaHdfcGh5X2lkLCBod19waHlfaWRfbWFza2VkOworCXUzMiB2YWw7CisJaW50IGVlcHJvbV9zaWduYXR1cmVfZm91bmQsIGVlcHJvbV9waHlfc2VyZGVzLCBlcnI7CisKKwl0cC0+cGh5X2lkID0gUEhZX0lEX0lOVkFMSUQ7CisJZWVwcm9tX3BoeV9pZCA9IFBIWV9JRF9JTlZBTElEOworCWVlcHJvbV9waHlfc2VyZGVzID0gMDsKKwllZXByb21fc2lnbmF0dXJlX2ZvdW5kID0gMDsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfU0lHLCAmdmFsKTsKKwlpZiAodmFsID09IE5JQ19TUkFNX0RBVEFfU0lHX01BR0lDKSB7CisJCXUzMiBuaWNfY2ZnLCBsZWRfY2ZnOworCQl1MzIgbmljX3BoeV9pZCwgdmVyLCBjZmcyID0gMDsKKworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfQ0ZHLCAmbmljX2NmZyk7CisJCXRwLT5uaWNfc3JhbV9kYXRhX2NmZyA9IG5pY19jZmc7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX1ZFUiwgJnZlcik7CisJCXZlciA+Pj0gTklDX1NSQU1fREFUQV9WRVJfU0hJRlQ7CisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDApICYmCisJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpICYmCisJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDMpICYmCisJCSAgICAodmVyID4gMCkgJiYgKHZlciA8IDB4MTAwKSkKKwkJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9DRkdfMiwgJmNmZzIpOworCisJCWVlcHJvbV9zaWduYXR1cmVfZm91bmQgPSAxOworCisJCWlmICgobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX01BU0spID09CisJCSAgICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9GSUJFUikKKwkJCWVlcHJvbV9waHlfc2VyZGVzID0gMTsKKworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfUEhZX0lELCAmbmljX3BoeV9pZCk7CisJCWlmIChuaWNfcGh5X2lkICE9IDApIHsKKwkJCXUzMiBpZDEgPSBuaWNfcGh5X2lkICYgTklDX1NSQU1fREFUQV9QSFlfSUQxX01BU0s7CisJCQl1MzIgaWQyID0gbmljX3BoeV9pZCAmIE5JQ19TUkFNX0RBVEFfUEhZX0lEMl9NQVNLOworCisJCQllZXByb21fcGh5X2lkICA9IChpZDEgPj4gMTYpIDw8IDEwOworCQkJZWVwcm9tX3BoeV9pZCB8PSAoaWQyICYgMHhmYzAwKSA8PCAxNjsKKwkJCWVlcHJvbV9waHlfaWQgfD0gKGlkMiAmIDB4MDNmZikgPDwgIDA7CisJCX0gZWxzZQorCQkJZWVwcm9tX3BoeV9pZCA9IDA7CisKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCQlsZWRfY2ZnID0gY2ZnMiAmIChOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLIHwKKwkJCQkgICAgU0hBU1RBX0VYVF9MRURfTU9ERV9NQVNLKTsKKwkJfSBlbHNlCisJCQlsZWRfY2ZnID0gbmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX01BU0s7CisKKwkJc3dpdGNoIChsZWRfY2ZnKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzE6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8xOworCQkJYnJlYWs7CisKKwkJY2FzZSBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9QSFlfMjoKKwkJCXRwLT5sZWRfY3RybCA9IExFRF9DVFJMX01PREVfUEhZXzI7CisJCQlicmVhazsKKworCQljYXNlIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX01BQzoKKwkJCXRwLT5sZWRfY3RybCA9IExFRF9DVFJMX01PREVfTUFDOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSEFTVEFfRVhUX0xFRF9TSEFSRUQ6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1NIQVJFRDsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMCAmJgorCQkJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0ExKQorCQkJCXRwLT5sZWRfY3RybCB8PSAoTEVEX0NUUkxfTU9ERV9QSFlfMSB8CisJCQkJCQkgTEVEX0NUUkxfTU9ERV9QSFlfMik7CisJCQlicmVhazsKKworCQljYXNlIFNIQVNUQV9FWFRfTEVEX01BQzoKKwkJCXRwLT5sZWRfY3RybCA9IExFRF9DVFJMX01PREVfU0hBU1RBX01BQzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0hBU1RBX0VYVF9MRURfQ09NQk86CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX0NPTUJPOworCQkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0EwKQorCQkJCXRwLT5sZWRfY3RybCB8PSAoTEVEX0NUUkxfTU9ERV9QSFlfMSB8CisJCQkJCQkgTEVEX0NUUkxfTU9ERV9QSFlfMik7CisJCQlicmVhazsKKworCQl9OworCisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkgJiYKKwkJICAgIHRwLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVMTCkKKwkJCXRwLT5sZWRfY3RybCA9IExFRF9DVFJMX01PREVfUEhZXzI7CisKKwkJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCkgJiYKKwkJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkgJiYKKwkJICAgIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfRUVQUk9NX1dQKSkKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1Q7CisKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFKSB7CisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VOQUJMRV9BU0Y7CisJCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0U7CisJCX0KKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19GSUJFUl9XT0wpCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQOworCisJCWlmIChjZmcyICYgKDEgPDwgMTcpKQorCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORzsKKworCQkvKiBzZXJkZXMgc2lnbmFsIHByZS1lbXBoYXNpcyBpbiByZWdpc3RlciAweDU5MCBzZXQgYnkgKi8KKwkJLyogYm9vdGNvZGUgaWYgYml0IDE4IGlzIHNldCAqLworCQlpZiAoY2ZnMiAmICgxIDw8IDE4KSkKKwkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1NFUkRFU19QUkVFTVBIQVNJUzsKKwl9CisKKwkvKiBSZWFkaW5nIHRoZSBQSFkgSUQgcmVnaXN0ZXIgY2FuIGNvbmZsaWN0IHdpdGggQVNGCisJICogZmlyd21hcmUgYWNjZXNzIHRvIHRoZSBQSFkgaGFyZHdhcmUuCisJICovCisJZXJyID0gMDsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpIHsKKwkJaHdfcGh5X2lkID0gaHdfcGh5X2lkX21hc2tlZCA9IFBIWV9JRF9JTlZBTElEOworCX0gZWxzZSB7CisJCS8qIE5vdyByZWFkIHRoZSBwaHlzaWNhbCBQSFlfSUQgZnJvbSB0aGUgY2hpcCBhbmQgdmVyaWZ5CisJCSAqIHRoYXQgaXQgaXMgc2FuZS4gIElmIGl0IGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBmYWxsIGJhY2sKKwkJICogdG8gZWl0aGVyIHRoZSBoYXJkLWNvZGVkIHRhYmxlIGJhc2VkIFBIWV9JRCBhbmQgZmFpbGluZworCQkgKiB0aGF0IHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgZWVwcm9tIGFyZWEuCisJCSAqLworCQllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9QSFlTSUQxLCAmaHdfcGh5X2lkXzEpOworCQllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9QSFlTSUQyLCAmaHdfcGh5X2lkXzIpOworCisJCWh3X3BoeV9pZCAgPSAoaHdfcGh5X2lkXzEgJiAweGZmZmYpIDw8IDEwOworCQlod19waHlfaWQgfD0gKGh3X3BoeV9pZF8yICYgMHhmYzAwKSA8PCAxNjsKKwkJaHdfcGh5X2lkIHw9IChod19waHlfaWRfMiAmIDB4MDNmZikgPDwgIDA7CisKKwkJaHdfcGh5X2lkX21hc2tlZCA9IGh3X3BoeV9pZCAmIFBIWV9JRF9NQVNLOworCX0KKworCWlmICghZXJyICYmIEtOT1dOX1BIWV9JRChod19waHlfaWRfbWFza2VkKSkgeworCQl0cC0+cGh5X2lkID0gaHdfcGh5X2lkOworCQlpZiAoaHdfcGh5X2lkX21hc2tlZCA9PSBQSFlfSURfQkNNODAwMikKKwkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9TRVJERVM7CisJfSBlbHNlIHsKKwkJaWYgKGVlcHJvbV9zaWduYXR1cmVfZm91bmQpIHsKKwkJCXRwLT5waHlfaWQgPSBlZXByb21fcGh5X2lkOworCQkJaWYgKGVlcHJvbV9waHlfc2VyZGVzKQorCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9TRVJERVM7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc3Vic3lzX3RibF9lbnQgKnA7CisKKwkJCS8qIE5vIGVlcHJvbSBzaWduYXR1cmU/ICBUcnkgdGhlIGhhcmRjb2RlZAorCQkJICogc3Vic3lzIGRldmljZSB0YWJsZS4KKwkJCSAqLworCQkJcCA9IGxvb2t1cF9ieV9zdWJzeXModHApOworCQkJaWYgKCFwKQorCQkJCXJldHVybiAtRU5PREVWOworCisJCQl0cC0+cGh5X2lkID0gcC0+cGh5X2lkOworCQkJaWYgKCF0cC0+cGh5X2lkIHx8CisJCQkgICAgdHAtPnBoeV9pZCA9PSBQSFlfSURfQkNNODAwMikKKwkJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCQl9CisJfQorCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSAmJgorCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSkgeworCQl1MzIgYm1zciwgYWR2X3JlZywgdGczX2N0cmw7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcikgJiYKKwkJICAgIChibXNyICYgQk1TUl9MU1RBVFVTKSkKKwkJCWdvdG8gc2tpcF9waHlfcmVzZXQ7CisJCSAgICAKKwkJZXJyID0gdGczX3BoeV9yZXNldCh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWFkdl9yZWcgPSAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfAorCQkJICAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCB8CisJCQkgICBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCQl0ZzNfY3RybCA9IDA7CisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpIHsKKwkJCXRnM19jdHJsID0gKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCQkgICAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwpOworCQkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCQkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApCisJCQkJdGczX2N0cmwgfD0gKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCQkgICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJfQorCisJCWlmICghdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwodHApKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIGFkdl9yZWcpOworCisJCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKQorCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCB0ZzNfY3RybCk7CisKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCisJCQkJICAgICBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCQl9CisJCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBhZHZfcmVnKTsKKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCB0ZzNfY3RybCk7CisJfQorCitza2lwX3BoeV9yZXNldDoKKwlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpIHsKKwkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIWVyciAmJiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpKSB7CisJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwl9CisKKwlpZiAoIWVlcHJvbV9zaWduYXR1cmVfZm91bmQpCisJCXRwLT5sZWRfY3RybCA9IExFRF9DVFJMX01PREVfUEhZXzE7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkJKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkJIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfQXV0b25lZyB8CisJCQkgQURWRVJUSVNFRF9GSUJSRSk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CisJCQl+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkJICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfcmVhZF9wYXJ0bm8oc3RydWN0IHRnMyAqdHApCit7CisJdW5zaWduZWQgY2hhciB2cGRfZGF0YVsyNTZdOworCWludCBpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MFgpIHsKKwkJLyogU3VuIGRlY2lkZWQgbm90IHRvIHB1dCB0aGUgbmVjZXNzYXJ5IGJpdHMgaW4gdGhlCisJCSAqIE5WUkFNIG9mIHRoZWlyIG9uYm9hcmQgdGczIHBhcnRzIDooCisJCSAqLworCQlzdHJjcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLCAiU3VuIDU3MFgiKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgeworCQl1MzIgdG1wOworCisJCWlmICh0ZzNfbnZyYW1fcmVhZCh0cCwgMHgxMDAgKyBpLCAmdG1wKSkKKwkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQl2cGRfZGF0YVtpICsgMF0gPSAoKHRtcCA+PiAgMCkgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDFdID0gKCh0bXAgPj4gIDgpICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAyXSA9ICgodG1wID4+IDE2KSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgM10gPSAoKHRtcCA+PiAyNCkgJiAweGZmKTsKKwl9CisKKwkvKiBOb3cgcGFyc2UgYW5kIGZpbmQgdGhlIHBhcnQgbnVtYmVyLiAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICkgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IHZwZF9kYXRhW2ldOworCQlpbnQgYmxvY2tfZW5kOworCisJCWlmICh2YWwgPT0gMHg4MiB8fCB2YWwgPT0gMHg5MSkgeworCQkJaSA9IChpICsgMyArCisJCQkgICAgICh2cGRfZGF0YVtpICsgMV0gKworCQkJICAgICAgKHZwZF9kYXRhW2kgKyAyXSA8PCA4KSkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodmFsICE9IDB4OTApCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJYmxvY2tfZW5kID0gKGkgKyAzICsKKwkJCSAgICAgKHZwZF9kYXRhW2kgKyAxXSArCisJCQkgICAgICAodnBkX2RhdGFbaSArIDJdIDw8IDgpKSk7CisJCWkgKz0gMzsKKwkJd2hpbGUgKGkgPCBibG9ja19lbmQpIHsKKwkJCWlmICh2cGRfZGF0YVtpICsgMF0gPT0gJ1AnICYmCisJCQkgICAgdnBkX2RhdGFbaSArIDFdID09ICdOJykgeworCQkJCWludCBwYXJ0bm9fbGVuID0gdnBkX2RhdGFbaSArIDJdOworCisJCQkJaWYgKHBhcnRub19sZW4gPiAyNCkKKwkJCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCQkJbWVtY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwKKwkJCQkgICAgICAgJnZwZF9kYXRhW2kgKyAzXSwKKwkJCQkgICAgICAgcGFydG5vX2xlbik7CisKKwkJCQkvKiBTdWNjZXNzLiAqLworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIFBhcnQgbnVtYmVyIG5vdCBmb3VuZC4gKi8KKwkJZ290byBvdXRfbm90X2ZvdW5kOworCX0KKworb3V0X25vdF9mb3VuZDoKKwlzdHJjcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLCAibm9uZSIpOworfQorCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19pc19zdW5fNTcwWChzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wZGV2OworCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOworCisJaWYgKHBjcCAhPSBOVUxMKSB7CisJCWludCBub2RlID0gcGNwLT5wcm9tX25vZGU7CisJCXUzMiB2ZW5pZDsKKwkJaW50IGVycjsKKworCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJzdWJzeXN0ZW0tdmVuZG9yLWlkIiwKKwkJCQkgICAgICAgKGNoYXIgKikgJnZlbmlkLCBzaXplb2YodmVuaWQpKTsKKwkJaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkKKwkJCXJldHVybiAwOworCQlpZiAodmVuaWQgPT0gUENJX1ZFTkRPUl9JRF9TVU4pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9pbnZhcmlhbnRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3cml0ZV9yZW9yZGVyX2NoaXBzZXRzW10gPSB7CisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzgpIH0sCisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzgpIH0sCisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzExKSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV82KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsCisJCSAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEMpIH0sCisJCXsgfSwKKwl9OworCXUzMiBtaXNjX2N0cmxfcmVnOworCXUzMiBjYWNoZWxpbmVfc3pfcmVnOworCXUzMiBwY2lfc3RhdGVfcmVnLCBncmNfbWlzY19jZmc7CisJdTMyIHZhbDsKKwl1MTYgcGNpX2NtZDsKKwlpbnQgZXJyOworCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwlpZiAodGczX2lzX3N1bl81NzBYKHRwKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfU1VOXzU3MFg7CisjZW5kaWYKKworCS8qIElmIHdlIGhhdmUgYW4gQU1EIDc2MiBvciBJbnRlbCBJQ0gvSUNIMC9JQ0gyIGNoaXBzZXQsIHdyaXRlCisJICogcmVvcmRlcmluZyB0byB0aGUgbWFpbGJveCByZWdpc3RlcnMgZG9uZSBieSB0aGUgaG9zdAorCSAqIGNvbnRyb2xsZXIgY2FuIGNhdXNlIG1ham9yIHRyb3VibGVzLiAgV2UgcmVhZCBiYWNrIGZyb20KKwkgKiBldmVyeSBtYWlsYm94IHJlZ2lzdGVyIHdyaXRlIHRvIGZvcmNlIHRoZSB3cml0ZXMgdG8gYmUKKwkgKiBwb3N0ZWQgdG8gdGhlIGNoaXAgaW4gb3JkZXIuCisJICovCisJaWYgKHBjaV9kZXZfcHJlc2VudCh3cml0ZV9yZW9yZGVyX2NoaXBzZXRzKSkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19NQk9YX1dSSVRFX1JFT1JERVI7CisKKwkvKiBGb3JjZSBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZSBvZmYuICBJZiB3ZSBsZWF2ZSBpdCBvbiwKKwkgKiB0aGVuIG9uIDU3MDBfQlggY2hpcHMgd2UgaGF2ZSB0byBlbmFibGUgYSB3b3JrYXJvdW5kLgorCSAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHNldCB0aGUgVEczUENJX0RNQV9SV19DVFJMIGJvdW5kYXJ5CisJICogdG8gbWF0Y2ggdGhlIGNhY2hlbGluZSBzaXplLiAgVGhlIEJyb2FkY29tIGRyaXZlciBoYXZlIHRoaXMKKwkgKiB3b3JrYXJvdW5kIGJ1dCB0dXJucyBNV0kgb2ZmIGFsbCB0aGUgdGltZXMgc28gbmV2ZXIgdXNlcworCSAqIGl0LiAgVGhpcyBzZWVtcyB0byBzdWdnZXN0IHRoYXQgdGhlIHdvcmthcm91bmQgaXMgaW5zdWZmaWNpZW50LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CisKKwkvKiBJdCBpcyBhYnNvbHV0ZWx5IGNyaXRpY2FsIHRoYXQgVEczUENJX01JU0NfSE9TVF9DVFJMCisJICogaGFzIHRoZSByZWdpc3RlciBpbmRpcmVjdCB3cml0ZSBlbmFibGUgYml0IHNldCBiZWZvcmUKKwkgKiB3ZSB0cnkgdG8gYWNjZXNzIGFueSBvZiB0aGUgTU1JTyByZWdpc3RlcnMuICBJdCBpcyBhbHNvCisJICogY3JpdGljYWwgdGhhdCB0aGUgUENJLVggaHcgd29ya2Fyb3VuZCBzaXR1YXRpb24gaXMgZGVjaWRlZAorCSAqIGJlZm9yZSB0aGF0IGFzIHdlbGwuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCQkgICAgICAmbWlzY19jdHJsX3JlZyk7CisKKwl0cC0+cGNpX2NoaXBfcmV2X2lkID0gKG1pc2NfY3RybF9yZWcgPj4KKwkJCSAgICAgICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKTsKKworCS8qIEluaXRpYWxpemUgbWlzYyBob3N0IGNvbnRyb2wgaW4gUENJIGJsb2NrLiAqLworCXRwLT5taXNjX2hvc3RfY3RybCB8PSAobWlzY19jdHJsX3JlZyAmCisJCQkgICAgICAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9DQUNIRUxJTkVTWiwKKwkJCSAgICAgICZjYWNoZWxpbmVfc3pfcmVnKTsKKworCXRwLT5wY2lfY2FjaGVsaW5lX3N6ID0gKGNhY2hlbGluZV9zel9yZWcgPj4gIDApICYgMHhmZjsKKwl0cC0+cGNpX2xhdF90aW1lciAgICA9IChjYWNoZWxpbmVfc3pfcmVnID4+ICA4KSAmIDB4ZmY7CisJdHAtPnBjaV9oZHJfdHlwZSAgICAgPSAoY2FjaGVsaW5lX3N6X3JlZyA+PiAxNikgJiAweGZmOworCXRwLT5wY2lfYmlzdCAgICAgICAgID0gKGNhY2hlbGluZV9zel9yZWcgPj4gMjQpICYgMHhmZjsKKworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHx8CisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyXzU3MDVfUExVUzsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSFdfVFNPOworCisJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkodHAtPnBkZXYsIFBDSV9DQVBfSURfRVhQKSAhPSAwKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QQ0lfRVhQUkVTUzsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyAmJgorCSAgICB0cC0+cGNpX2xhdF90aW1lciA8IDY0KSB7CisJCXRwLT5wY2lfbGF0X3RpbWVyID0gNjQ7CisKKwkJY2FjaGVsaW5lX3N6X3JlZyAgPSAoKHRwLT5wY2lfY2FjaGVsaW5lX3N6ICYgMHhmZikgPDwgIDApOworCQljYWNoZWxpbmVfc3pfcmVnIHw9ICgodHAtPnBjaV9sYXRfdGltZXIgICAgJiAweGZmKSA8PCAgOCk7CisJCWNhY2hlbGluZV9zel9yZWcgfD0gKCh0cC0+cGNpX2hkcl90eXBlICAgICAmIDB4ZmYpIDw8IDE2KTsKKwkJY2FjaGVsaW5lX3N6X3JlZyB8PSAoKHRwLT5wY2lfYmlzdCAgICAgICAgICYgMHhmZikgPDwgMjQpOworCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9DQUNIRUxJTkVTWiwKKwkJCQkgICAgICAgY2FjaGVsaW5lX3N6X3JlZyk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsCisJCQkgICAgICAmcGNpX3N0YXRlX3JlZyk7CisKKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9DT05WX1BDSV9NT0RFKSA9PSAwKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJWF9NT0RFOworCisJCS8qIElmIHRoaXMgaXMgYSA1NzAwIEJYIGNoaXBzZXQsIGFuZCB3ZSBhcmUgaW4gUENJLVgKKwkJICogbW9kZSwgZW5hYmxlIHJlZ2lzdGVyIHdyaXRlIHdvcmthcm91bmQuCisJCSAqCisJCSAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3NlcworCQkgKiBmb3IgYWxsIGNoaXAgd3JpdGVzIG5vdCB0byBtYWlsYm94IHJlZ2lzdGVycy4KKwkJICovCisJCWlmIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81NzAwX0JYKSB7CisJCQl1MzIgcG1fcmVnOworCQkJdTE2IHBjaV9jbWQ7CisKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJWF9UQVJHRVRfSFdCVUc7CisKKwkJCS8qIFRoZSBjaGlwIGNhbiBoYXZlIGl0J3MgcG93ZXIgbWFuYWdlbWVudCBQQ0kgY29uZmlnCisJCQkgKiBzcGFjZSByZWdpc3RlcnMgY2xvYmJlcmVkIGR1ZSB0byB0aGlzIGJ1Zy4KKwkJCSAqIFNvIGV4cGxpY2l0bHkgZm9yY2UgdGhlIGNoaXAgaW50byBEMCBoZXJlLgorCQkJICovCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QTV9DVFJMX1NUQVQsCisJCQkJCSAgICAgICZwbV9yZWcpOworCQkJcG1fcmVnICY9IH5QQ0lfUE1fQ1RSTF9TVEFURV9NQVNLOworCQkJcG1fcmVnIHw9IFBDSV9QTV9DVFJMX1BNRV9FTkFCTEUgfCAwIC8qIEQwICovOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BNX0NUUkxfU1RBVCwKKwkJCQkJICAgICAgIHBtX3JlZyk7CisKKwkJCS8qIEFsc28sIGZvcmNlIFNFUlIjL1BFUlIjIGluIFBDSSBjb21tYW5kLiAqLworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJCQlwY2lfY21kIHw9IFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlI7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKwkJfQorCX0KKworCS8qIEJhY2sgdG8gYmFjayByZWdpc3RlciB3cml0ZXMgY2FuIGNhdXNlIHByb2JsZW1zIG9uIHRoaXMgY2hpcCwKKwkgKiB0aGUgd29ya2Fyb3VuZCBpcyB0byByZWFkIGJhY2sgYWxsIHJlZyB3cml0ZXMgZXhjZXB0IHRob3NlIHRvCisJICogbWFpbGJveCByZWdzLiAgU2VlIHRnM193cml0ZV9pbmRpcmVjdF9yZWczMigpLgorCSAqCisJICogUENJIEV4cHJlc3MgNTc1MF9BMCByZXYgY2hpcHMgbmVlZCB0aGlzIHdvcmthcm91bmQgdG9vLgorCSAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSB8fAorCSAgICAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpICYmCisJICAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc1MF9BMCkpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfNTcwMV9SRUdfV1JJVEVfQlVHOworCisJaWYgKChwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICE9IDApCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJX0hJR0hfU1BFRUQ7CisJaWYgKChwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfQlVTXzMyQklUKSAhPSAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSV8zMkJJVDsKKworCS8qIENoaXAtc3BlY2lmaWMgZml4dXAgZnJvbSBCcm9hZGNvbSBkcml2ZXIgKi8KKwlpZiAoKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwKSAmJgorCSAgICAoIShwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfUkVUUllfU0FNRV9ETUEpKSkgeworCQlwY2lfc3RhdGVfcmVnIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsIHBjaV9zdGF0ZV9yZWcpOworCX0KKworCS8qIEZvcmNlIHRoZSBjaGlwIGludG8gRDAuICovCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIoJXMpIHRyYW5zaXRpb24gdG8gRDAgZmFpbGVkXG4iLAorCQkgICAgICAgcGNpX25hbWUodHAtPnBkZXYpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiA1NzAwIEIwIGNoaXBzIGRvIG5vdCBzdXBwb3J0IGNoZWNrc3VtbWluZyBjb3JyZWN0bHkgZHVlCisJICogdG8gaGFyZHdhcmUgYnVncy4KKwkgKi8KKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDBfQjApCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUzsKKworCS8qIFBzZXVkby1oZWFkZXIgY2hlY2tzdW0gaXMgZG9uZSBieSBoYXJkd2FyZSBsb2dpYyBhbmQgbm90CisJICogdGhlIG9mZmxvYWQgcHJvY2Vzc2Vycywgc28gbWFrZSB0aGUgY2hpcCBkbyB0aGUgcHNldWRvLQorCSAqIGhlYWRlciBjaGVja3N1bXMgb24gcmVjZWl2ZS4gIEZvciB0cmFuc21pdCBpdCBpcyBtb3JlCisJICogY29udmVuaWVudCB0byBkbyB0aGUgcHNldWRvLWhlYWRlciBjaGVja3N1bSBpbiBzb2Z0d2FyZQorCSAqIGFzIExpbnV4IGRvZXMgdGhhdCBvbiB0cmFuc21pdCBmb3IgdXMgaW4gYWxsIGNhc2VzLgorCSAqLworCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTk9fVFhfUFNFVURPX0NTVU07CisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfTk9fUlhfUFNFVURPX0NTVU07CisKKwkvKiBEZXJpdmUgaW5pdGlhbCBqdW1ibyBtb2RlIGZyb20gTVRVIGFzc2lnbmVkIGluCisJICogZXRoZXJfc2V0dXAoKSB2aWEgdGhlIGFsbG9jX2V0aGVyZGV2KCkgY2FsbAorCSAqLworCWlmICh0cC0+ZGV2LT5tdHUgPiBFVEhfREFUQV9MRU4pCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfSlVNQk9fRU5BQkxFOworCisJLyogRGV0ZXJtaW5lIFdha2VPbkxhbiBzcGVlZCB0byB1c2UuICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwIHx8CisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IyKSB7CisJCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19XT0xfU1BFRURfMTAwTUIpOworCX0gZWxzZSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfV09MX1NQRUVEXzEwME1COworCX0KKworCS8qIEEgZmV3IGJvYXJkcyBkb24ndCB3YW50IEV0aGVybmV0QFdpcmVTcGVlZCBwaHkgZmVhdHVyZSAqLworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHx8CisJICAgICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpICYmCisJICAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTApICYmCisJICAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTEpKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQ7CisKKwlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwM19BWCB8fAorCSAgICBHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81NzA0X0FYKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfQURDX0JVRzsKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTApCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV81NzA0X0EwX0JVRzsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX0JFUl9CVUc7CisKKwkvKiBPbmx5IDU3MDEgYW5kIGxhdGVyIHN1cHBvcnQgdGFnZ2VkIGlycSBzdGF0dXMgbW9kZS4KKwkgKiBBbHNvLCA1Nzg4IGNoaXBzIGNhbm5vdCB1c2UgdGFnZ2VkIGlycSBzdGF0dXMuCisJICoKKwkgKiBIb3dldmVyLCBzaW5jZSB3ZSBhcmUgdXNpbmcgTkFQSSBhdm9pZCB0YWdnZWQgaXJxIHN0YXR1cworCSAqIGJlY2F1c2UgdGhlIGludGVycnVwdCBjb25kaXRpb24gaXMgbW9yZSBkaWZmaWN1bHQgdG8KKwkgKiBmdWxseSBjbGVhciBpbiB0aGF0IG1vZGUuCisJICovCisJdHAtPmNvYWxlc2NlX21vZGUgPSAwOworCisJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBDSElQUkVWXzU3MDBfQVggJiYKKwkgICAgR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IENISVBSRVZfNTcwMF9CWCkKKwkJdHAtPmNvYWxlc2NlX21vZGUgfD0gSE9TVENDX01PREVfMzJCWVRFOworCisJLyogSW5pdGlhbGl6ZSBNQUMgTUkgbW9kZSwgcG9sbGluZyBkaXNhYmxlZC4gKi8KKwl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwl1ZGVsYXkoODApOworCisJLyogSW5pdGlhbGl6ZSBkYXRhL2Rlc2NyaXB0b3IgYnl0ZS93b3JkIHN3YXBwaW5nLiAqLworCXZhbCA9IHRyMzIoR1JDX01PREUpOworCXZhbCAmPSBHUkNfTU9ERV9IT1NUX1NUQUNLVVA7CisJdHczMihHUkNfTU9ERSwgdmFsIHwgdHAtPmdyY19tb2RlKTsKKworCXRnM19zd2l0Y2hfY2xvY2tzKHRwKTsKKworCS8qIENsZWFyIHRoaXMgb3V0IGZvciBzYW5pdHkuICovCisJdHczMihURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsCisJCQkgICAgICAmcGNpX3N0YXRlX3JlZyk7CisJaWYgKChwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfQ09OVl9QQ0lfTU9ERSkgPT0gMCAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHKSA9PSAwKSB7CisJCXUzMiBjaGlwcmV2aWQgPSBHRVRfQ0hJUF9SRVZfSUQodHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCQlpZiAoY2hpcHJldmlkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkgICAgY2hpcHJldmlkID09IENISVBSRVZfSURfNTcwMV9CMCB8fAorCQkgICAgY2hpcHJldmlkID09IENISVBSRVZfSURfNTcwMV9CMiB8fAorCQkgICAgY2hpcHJldmlkID09IENISVBSRVZfSURfNTcwMV9CNSkgeworCQkJdm9pZCBfX2lvbWVtICpzcmFtX2Jhc2U7CisKKwkJCS8qIFdyaXRlIHNvbWUgZHVtbXkgd29yZHMgaW50byB0aGUgU1JBTSBzdGF0dXMgYmxvY2sKKwkJCSAqIGFyZWEsIHNlZSBpZiBpdCByZWFkcyBiYWNrIGNvcnJlY3RseS4gIElmIHRoZSByZXR1cm4KKwkJCSAqIHZhbHVlIGlzIGJhZCwgZm9yY2UgZW5hYmxlIHRoZSBQQ0lYIHdvcmthcm91bmQuCisJCQkgKi8KKwkJCXNyYW1fYmFzZSA9IHRwLT5yZWdzICsgTklDX1NSQU1fV0lOX0JBU0UgKyBOSUNfU1JBTV9TVEFUU19CTEs7CisKKwkJCXdyaXRlbCgweDAwMDAwMDAwLCBzcmFtX2Jhc2UpOworCQkJd3JpdGVsKDB4MDAwMDAwMDAsIHNyYW1fYmFzZSArIDQpOworCQkJd3JpdGVsKDB4ZmZmZmZmZmYsIHNyYW1fYmFzZSArIDQpOworCQkJaWYgKHJlYWRsKHNyYW1fYmFzZSkgIT0gMHgwMDAwMDAwMCkKKwkJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHOworCQl9CisJfQorCisJdWRlbGF5KDUwKTsKKwl0ZzNfbnZyYW1faW5pdCh0cCk7CisKKwlncmNfbWlzY19jZmcgPSB0cjMyKEdSQ19NSVNDX0NGRyk7CisJZ3JjX21pc2NfY2ZnICY9IEdSQ19NSVNDX0NGR19CT0FSRF9JRF9NQVNLOworCisJLyogQnJvYWRjb20ncyBkcml2ZXIgc2F5cyB0aGF0IENJT0JFIG11bHRpc3BsaXQgaGFzIGEgYnVnICovCisjaWYgMAorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCAmJgorCSAgICBncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDRDSU9CRSkgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1NQTElUX01PREU7CisJCXRwLT5zcGxpdF9tb2RlX21heF9yZXFzID0gU1BMSVRfTU9ERV81NzA0X01BWF9SRVE7CisJfQorI2VuZGlmCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ICYmCisJICAgIChncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODggfHwKKwkgICAgIGdyY19taXNjX2NmZyA9PSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OE0pKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9JU181Nzg4OworCisJLyogdGhlc2UgYXJlIGxpbWl0ZWQgdG8gMTAvMTAwIG9ubHkgKi8KKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzICYmCisJICAgICAoZ3JjX21pc2NfY2ZnID09IDB4ODAwMCB8fCBncmNfbWlzY19jZmcgPT0gMHg0MDAwKSkgfHwKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ICYmCisJICAgICB0cC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQlJPQURDT00gJiYKKwkgICAgICh0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU5MDEgfHwKKwkgICAgICB0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU5MDFfMiB8fAorCSAgICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNUYpKSB8fAorCSAgICAodHAtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NICYmCisJICAgICAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxRiB8fAorCSAgICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc1M0YpKSkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR18xMF8xMDBfT05MWTsKKworCWVyciA9IHRnM19waHlfcHJvYmUodHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiKCVzKSBwaHkgcHJvYmUgZmFpbGVkLCBlcnIgJWRcbiIsCisJCSAgICAgICBwY2lfbmFtZSh0cC0+cGRldiksIGVycik7CisJCS8qIC4uLiBidXQgZG8gbm90IHJldHVybiBpbW1lZGlhdGVseSAuLi4gKi8KKwl9CisKKwl0ZzNfcmVhZF9wYXJ0bm8odHApOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19VU0VfTUlfSU5URVJSVVBUOworCX0gZWxzZSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVDsKKwkJZWxzZQorCQkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVDsKKwl9CisKKwkvKiA1NzAwIHtBWCxCWH0gY2hpcHMgaGF2ZSBhIGJyb2tlbiBzdGF0dXMgYmxvY2sgbGluaworCSAqIGNoYW5nZSBiaXQgaW1wbGVtZW50YXRpb24sIHNvIHdlIG11c3QgdXNlIHRoZQorCSAqIHN0YXR1cyByZWdpc3RlciBpbiB0aG9zZSBjYXNlcy4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHOworCisJLyogVGhlIGxlZF9jdHJsIGlzIHNldCBkdXJpbmcgdGczX3BoeV9wcm9iZSwgaGVyZSB3ZSBtaWdodAorCSAqIGhhdmUgdG8gZm9yY2UgdGhlIGxpbmsgc3RhdHVzIHBvbGxpbmcgbWVjaGFuaXNtIGJhc2VkCisJICogdXBvbiBzdWJzeXN0ZW0gSURzLgorCSAqLworCWlmICh0cC0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFTEwgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gKFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQgfAorCQkJCSAgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKTsKKwl9CisKKwkvKiBGb3IgYWxsIFNFUkRFUyB3ZSBwb2xsIHRoZSBNQUMgc3RhdHVzIHJlZ2lzdGVyLiAqLworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUE9MTF9TRVJERVM7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19QT0xMX1NFUkRFUzsKKworCS8qIDU3MDAgQlggY2hpcHMgbmVlZCB0byBoYXZlIHRoZWlyIFRYIHByb2R1Y2VyIGluZGV4IG1haWxib3hlcworCSAqIHdyaXR0ZW4gdHdpY2UgdG8gd29ya2Fyb3VuZCBhIGJ1Zy4KKwkgKi8KKwlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwMF9CWCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19UWERfTUJPWF9IV0JVRzsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1RYRF9NQk9YX0hXQlVHOworCisJLyogSXQgc2VlbXMgYWxsIGNoaXBzIGNhbiBnZXQgY29uZnVzZWQgaWYgVFggYnVmZmVycworCSAqIHN0cmFkZGxlIHRoZSA0R0IgYWRkcmVzcyBib3VuZGFyeSBpbiBzb21lIGNhc2VzLgorCSAqLworCXRwLT5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRnM19zdGFydF94bWl0OworCisJdHAtPnJ4X29mZnNldCA9IDI7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAhPSAwKQorCQl0cC0+cnhfb2Zmc2V0ID0gMDsKKworCS8qIEJ5IGRlZmF1bHQsIGRpc2FibGUgd2FrZS1vbi1sYW4uICBVc2VyIGNhbiBjaGFuZ2UgdGhpcworCSAqIHVzaW5nIEVUSFRPT0xfU1dPTC4KKwkgKi8KKwl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19XT0xfRU5BQkxFOworCisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19TUEFSQzY0CitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfZ2V0X21hY2FkZHJfc3BhcmMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKworCWlmIChwY3AgIT0gTlVMTCkgeworCQlpbnQgbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCisJCWlmIChwcm9tX2dldHByb3BsZW4obm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgeworCQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJCQkgZGV2LT5kZXZfYWRkciwgNik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9kZWZhdWx0X21hY2FkZHJfc3BhcmMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgaWRwcm9tLT5pZF9ldGhhZGRyLCA2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfZ2V0X2RldmljZV9hZGRyZXNzKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCXUzMiBoaSwgbG8sIG1hY19vZmZzZXQ7CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCWlmICghdGczX2dldF9tYWNhZGRyX3NwYXJjKHRwKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCW1hY19vZmZzZXQgPSAweDdjOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCAmJgorCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxHMl9TVU5fNTcwWCkpIHsKKwkJaWYgKHRyMzIoVEczUENJX0RVQUxfTUFDX0NUUkwpICYgRFVBTF9NQUNfQ1RSTF9JRCkKKwkJCW1hY19vZmZzZXQgPSAweGNjOworCQlpZiAodGczX252cmFtX2xvY2sodHApKQorCQkJdHczMl9mKE5WUkFNX0NNRCwgTlZSQU1fQ01EX1JFU0VUKTsKKwkJZWxzZQorCQkJdGczX252cmFtX3VubG9jayh0cCk7CisJfQorCisJLyogRmlyc3QgdHJ5IHRvIGdldCBpdCBmcm9tIE1BQyBhZGRyZXNzIG1haWxib3guICovCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9NQUNfQUREUl9ISUdIX01CT1gsICZoaSk7CisJaWYgKChoaSA+PiAxNikgPT0gMHg0ODRiKSB7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAoaGkgPj4gIDgpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsxXSA9IChoaSA+PiAgMCkgJiAweGZmOworCisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fTUFDX0FERFJfTE9XX01CT1gsICZsbyk7CisJCWRldi0+ZGV2X2FkZHJbMl0gPSAobG8gPj4gMjQpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclszXSA9IChsbyA+PiAxNikgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzRdID0gKGxvID4+ICA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbNV0gPSAobG8gPj4gIDApICYgMHhmZjsKKwl9CisJLyogTmV4dCwgdHJ5IE5WUkFNLiAqLworCWVsc2UgaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEcyX1NVTl81NzBYKSAmJgorCQkgIXRnM19udnJhbV9yZWFkKHRwLCBtYWNfb2Zmc2V0ICsgMCwgJmhpKSAmJgorCQkgIXRnM19udnJhbV9yZWFkKHRwLCBtYWNfb2Zmc2V0ICsgNCwgJmxvKSkgeworCQlkZXYtPmRldl9hZGRyWzBdID0gKChoaSA+PiAxNikgJiAweGZmKTsKKwkJZGV2LT5kZXZfYWRkclsxXSA9ICgoaGkgPj4gMjQpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbMl0gPSAoKGxvID4+ICAwKSAmIDB4ZmYpOworCQlkZXYtPmRldl9hZGRyWzNdID0gKChsbyA+PiAgOCkgJiAweGZmKTsKKwkJZGV2LT5kZXZfYWRkcls0XSA9ICgobG8gPj4gMTYpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbNV0gPSAoKGxvID4+IDI0KSAmIDB4ZmYpOworCX0KKwkvKiBGaW5hbGx5IGp1c3QgZmV0Y2ggaXQgb3V0IG9mIHRoZSBNQUMgY29udHJvbCByZWdzLiAqLworCWVsc2UgeworCQloaSA9IHRyMzIoTUFDX0FERFJfMF9ISUdIKTsKKwkJbG8gPSB0cjMyKE1BQ19BRERSXzBfTE9XKTsKKworCQlkZXYtPmRldl9hZGRyWzVdID0gbG8gJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzRdID0gKGxvID4+IDgpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclszXSA9IChsbyA+PiAxNikgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzJdID0gKGxvID4+IDI0KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSBoaSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAoaGkgPj4gOCkgJiAweGZmOworCX0KKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcigmZGV2LT5kZXZfYWRkclswXSkpIHsKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCQlpZiAoIXRnM19nZXRfZGVmYXVsdF9tYWNhZGRyX3NwYXJjKHRwKSkKKwkJCXJldHVybiAwOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2RvX3Rlc3RfZG1hKHN0cnVjdCB0ZzMgKnRwLCB1MzIgKmJ1ZiwgZG1hX2FkZHJfdCBidWZfZG1hLCBpbnQgc2l6ZSwgaW50IHRvX2RldmljZSkKK3sKKwlzdHJ1Y3QgdGczX2ludGVybmFsX2J1ZmZlcl9kZXNjIHRlc3RfZGVzYzsKKwl1MzIgc3JhbV9kbWFfZGVzY3M7CisJaW50IGksIHJldDsKKworCXNyYW1fZG1hX2Rlc2NzID0gTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9CQVNFOworCisJdHczMihGVFFfUkNWQkRfQ09NUF9GSUZPX0VOUURFUSwgMCk7CisJdHczMihGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRLCAwKTsKKwl0dzMyKFJETUFDX1NUQVRVUywgMCk7CisJdHczMihXRE1BQ19TVEFUVVMsIDApOworCisJdHczMihCVUZNR1JfTU9ERSwgMCk7CisJdHczMihGVFFfUkVTRVQsIDApOworCisJdGVzdF9kZXNjLmFkZHJfaGkgPSAoKHU2NCkgYnVmX2RtYSkgPj4gMzI7CisJdGVzdF9kZXNjLmFkZHJfbG8gPSBidWZfZG1hICYgMHhmZmZmZmZmZjsKKwl0ZXN0X2Rlc2MubmljX21idWYgPSAweDAwMDAyMTAwOworCXRlc3RfZGVzYy5sZW4gPSBzaXplOworCisJLyoKKwkgKiBIUCBaWDEgd2FzIHNlZWluZyB0ZXN0IGZhaWx1cmVzIGZvciA1NzAxIGNhcmRzIHJ1bm5pbmcgYXQgMzNNaHoKKwkgKiB0aGUgKnNlY29uZCogdGltZSB0aGUgdGczIGRyaXZlciB3YXMgZ2V0dGluZyBsb2FkZWQgYWZ0ZXIgYW4KKwkgKiBpbml0aWFsIHNjYW4uCisJICoKKwkgKiBCcm9hZGNvbSB0ZWxscyBtZToKKwkgKiAgIC4uLnRoZSBETUEgZW5naW5lIGlzIGNvbm5lY3RlZCB0byB0aGUgR1JDIGJsb2NrIGFuZCBhIERNQQorCSAqICAgcmVzZXQgbWF5IGFmZmVjdCB0aGUgR1JDIGJsb2NrIGluIHNvbWUgdW5wcmVkaWN0YWJsZSB3YXkuLi4KKwkgKiAgIFRoZSBiZWhhdmlvciBvZiByZXNldHMgdG8gaW5kaXZpZHVhbCBibG9ja3MgaGFzIG5vdCBiZWVuIHRlc3RlZC4KKwkgKgorCSAqIEJyb2FkY29tIG5vdGVkIHRoZSBHUkMgcmVzZXQgd2lsbCBhbHNvIHJlc2V0IGFsbCBzdWItY29tcG9uZW50cy4KKwkgKi8KKwlpZiAodG9fZGV2aWNlKSB7CisJCXRlc3RfZGVzYy5jcWlkX3NxaWQgPSAoMTMgPDwgOCkgfCAyOworCisJCXR3MzJfZihSRE1BQ19NT0RFLCBSRE1BQ19NT0RFX0VOQUJMRSk7CisJCXVkZWxheSg0MCk7CisJfSBlbHNlIHsKKwkJdGVzdF9kZXNjLmNxaWRfc3FpZCA9ICgxNiA8PCA4KSB8IDc7CisKKwkJdHczMl9mKFdETUFDX01PREUsIFdETUFDX01PREVfRU5BQkxFKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisJdGVzdF9kZXNjLmZsYWdzID0gMHgwMDAwMDAwNTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHRlc3RfZGVzYykgLyBzaXplb2YodTMyKSk7IGkrKykgeworCQl1MzIgdmFsOworCisJCXZhbCA9ICooKCh1MzIgKikmdGVzdF9kZXNjKSArIGkpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsCisJCQkJICAgICAgIHNyYW1fZG1hX2Rlc2NzICsgKGkgKiBzaXplb2YodTMyKSkpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCX0KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCisJaWYgKHRvX2RldmljZSkgeworCQl0dzMyKEZUUV9ETUFfSElHSF9SRUFEX0ZJRk9fRU5RREVRLCBzcmFtX2RtYV9kZXNjcyk7CisJfSBlbHNlIHsKKwkJdHczMihGVFFfRE1BX0hJR0hfV1JJVEVfRklGT19FTlFERVEsIHNyYW1fZG1hX2Rlc2NzKTsKKwl9CisKKwlyZXQgPSAtRU5PREVWOworCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKSB7CisJCXUzMiB2YWw7CisKKwkJaWYgKHRvX2RldmljZSkKKwkJCXZhbCA9IHRyMzIoRlRRX1JDVkJEX0NPTVBfRklGT19FTlFERVEpOworCQllbHNlCisJCQl2YWwgPSB0cjMyKEZUUV9SQ1ZEQVRBX0NPTVBfRklGT19FTlFERVEpOworCQlpZiAoKHZhbCAmIDB4ZmZmZikgPT0gc3JhbV9kbWFfZGVzY3MpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSgxMDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVEVTVF9CVUZGRVJfU0laRQkweDQwMAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfdGVzdF9kbWEoc3RydWN0IHRnMyAqdHApCit7CisJZG1hX2FkZHJfdCBidWZfZG1hOworCXUzMiAqYnVmOworCWludCByZXQ7CisKKwlidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEVTVF9CVUZGRVJfU0laRSwgJmJ1Zl9kbWEpOworCWlmICghYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vZnJlZTsKKwl9CisKKwl0cC0+ZG1hX3J3Y3RybCA9ICgoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJICAoMHg2IDw8IERNQV9SV0NUUkxfUENJX1JFQURfQ01EX1NISUZUKSk7CisKKyNpZm5kZWYgQ09ORklHX1g4NgorCXsKKwkJdTggYnl0ZTsKKwkJaW50IGNhY2hlbGluZV9zaXplOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSh0cC0+cGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCisJCWlmIChieXRlID09IDApCisJCQljYWNoZWxpbmVfc2l6ZSA9IDEwMjQ7CisJCWVsc2UKKwkJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkJc3dpdGNoIChjYWNoZWxpbmVfc2l6ZSkgeworCQljYXNlIDE2OgorCQljYXNlIDMyOgorCQljYXNlIDY0OgorCQljYXNlIDEyODoKKwkJCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgJiYKKwkJCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKSB7CisJCQkJdHAtPmRtYV9yd2N0cmwgfD0KKwkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8zODRfUENJWDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQkJCXRwLT5kbWFfcndjdHJsICY9CisJCQkJCX4oRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EKTsKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PQorCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzEyOF9QQ0lFOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAyNTY6CisJCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAmJgorCQkJICAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpCisJCQkJdHAtPmRtYV9yd2N0cmwgfD0KKwkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8yNTY7CisJCQllbHNlIGlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKQorCQkJCXRwLT5kbWFfcndjdHJsIHw9CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2X1BDSVg7CisJCX07CisJfQorI2VuZGlmCisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQkvKiBETUEgcmVhZCB3YXRlcm1hcmsgbm90IHVzZWQgb24gUENJRSAqLworCQl0cC0+ZG1hX3J3Y3RybCB8PSAweDAwMTgwMDAwOworCX0gZWxzZSBpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgfHwKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKQorCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDNmMDAwMDsKKwkJZWxzZQorCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDNmMDAwZjsKKwl9IGVsc2UgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCQl1MzIgY2N2YWwgPSAodHIzMihURzNQQ0lfQ0xPQ0tfQ1RSTCkgJiAweDFmKTsKKworCQkJaWYgKGNjdmFsID09IDB4NiB8fCBjY3ZhbCA9PSAweDcpCisJCQkJdHAtPmRtYV9yd2N0cmwgfD0gRE1BX1JXQ1RSTF9PTkVfRE1BOworCisJCQkvKiBTZXQgYml0IDIzIHRvIHJlbmFibGUgUENJWCBodyBidWcgZml4ICovCisJCQl0cC0+ZG1hX3J3Y3RybCB8PSAweDAwOWYwMDAwOworCQl9IGVsc2UgeworCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDFiMDAwZjsKKwkJfQorCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkKKwkJdHAtPmRtYV9yd2N0cmwgJj0gMHhmZmZmZmZmMDsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkgeworCQkvKiBSZW1vdmUgdGhpcyBpZiBpdCBjYXVzZXMgcHJvYmxlbXMgZm9yIHNvbWUgYm9hcmRzLiAqLworCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX1VTRV9NRU1fUkVBRF9NVUxUOworCisJCS8qIE9uIDU3MDAvNTcwMSBjaGlwcywgd2UgbmVlZCB0byBzZXQgdGhpcyBiaXQuCisJCSAqIE90aGVyd2lzZSB0aGUgY2hpcCB3aWxsIGlzc3VlIGNhY2hlbGluZSB0cmFuc2FjdGlvbnMKKwkJICogdG8gc3RyZWFtYWJsZSBETUEgbWVtb3J5IHdpdGggbm90IGFsbCB0aGUgYnl0ZQorCQkgKiBlbmFibGVzIHR1cm5lZCBvbi4gIFRoaXMgaXMgYW4gZXJyb3Igb24gc2V2ZXJhbAorCQkgKiBSSVNDIFBDSSBjb250cm9sbGVycywgaW4gcGFydGljdWxhciBzcGFyYzY0LgorCQkgKgorCQkgKiBPbiA1NzAzLzU3MDQgY2hpcHMsIHRoaXMgYml0IGhhcyBiZWVuIHJlYXNzaWduZWQKKwkJICogYSBkaWZmZXJlbnQgbWVhbmluZy4gIEluIHBhcnRpY3VsYXIsIGl0IGlzIHVzZWQKKwkJICogb24gdGhvc2UgY2hpcHMgdG8gZW5hYmxlIGEgUENJLVggd29ya2Fyb3VuZC4KKwkJICovCisJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfQVNTRVJUX0FMTF9CRTsKKwl9CisKKwl0dzMyKFRHM1BDSV9ETUFfUldfQ1RSTCwgdHAtPmRtYV9yd2N0cmwpOworCisjaWYgMAorCS8qIFVubmVlZGVkLCBhbHJlYWR5IGRvbmUgYnkgdGczX2dldF9pbnZhcmlhbnRzLiAgKi8KKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisjZW5kaWYKKworCXJldCA9IDA7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwICYmCisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKQorCQlnb3RvIG91dDsKKworCXdoaWxlICgxKSB7CisJCXUzMiAqcCA9IGJ1ZiwgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpOyBpKyspCisJCQlwW2ldID0gaTsKKworCQkvKiBTZW5kIHRoZSBidWZmZXIgdG8gdGhlIGNoaXAuICovCisJCXJldCA9IHRnM19kb190ZXN0X2RtYSh0cCwgYnVmLCBidWZfZG1hLCBURVNUX0JVRkZFUl9TSVpFLCAxKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzNfdGVzdF9kbWEoKSBXcml0ZSB0aGUgYnVmZmVyIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCWJyZWFrOworCQl9CisKKyNpZiAwCisJCS8qIHZhbGlkYXRlIGRhdGEgcmVhY2hlZCBjYXJkIFJBTSBjb3JyZWN0bHkuICovCisJCWZvciAoaSA9IDA7IGkgPCBURVNUX0JVRkZFUl9TSVpFIC8gc2l6ZW9mKHUzMik7IGkrKykgeworCQkJdTMyIHZhbDsKKwkJCXRnM19yZWFkX21lbSh0cCwgMHgyMTAwICsgKGkqNCksICZ2YWwpOworCQkJaWYgKGxlMzJfdG9fY3B1KHZhbCkgIT0gcFtpXSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiICB0ZzNfdGVzdF9kbWEoKSAgQ2FyZCBidWZmZXIgY29ycnVwdGVkIG9uIHdyaXRlISAoJWQgIT0gJWQpXG4iLCB2YWwsIGkpOworCQkJCS8qIHJldCA9IC1FTk9ERVYgaGVyZT8gKi8KKwkJCX0KKwkJCXBbaV0gPSAwOworCQl9CisjZW5kaWYKKwkJLyogTm93IHJlYWQgaXQgYmFjay4gKi8KKwkJcmV0ID0gdGczX2RvX3Rlc3RfZG1hKHRwLCBidWYsIGJ1Zl9kbWEsIFRFU1RfQlVGRkVSX1NJWkUsIDApOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRnM190ZXN0X2RtYSgpIFJlYWQgdGhlIGJ1ZmZlciBmYWlsZWQgJWRcbiIsIHJldCk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVmVyaWZ5IGl0LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpOyBpKyspIHsKKwkJCWlmIChwW2ldID09IGkpCisJCQkJY29udGludWU7CisKKwkJCWlmICgodHAtPmRtYV9yd2N0cmwgJiBETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0spID09CisJCQkgICAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9ESVNBQikgeworCQkJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTY7CisJCQkJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzNfdGVzdF9kbWEoKSBidWZmZXIgY29ycnVwdGVkIG9uIHJlYWQgYmFjayEgKCVkICE9ICVkKVxuIiwgcFtpXSwgaSk7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IChURVNUX0JVRkZFUl9TSVpFIC8gc2l6ZW9mKHUzMikpKSB7CisJCQkvKiBTdWNjZXNzLiAqLworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEVTVF9CVUZGRVJfU0laRSwgYnVmLCBidWZfZG1hKTsKK291dF9ub2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19pbml0X2xpbmtfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCShBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX01JSSk7CisJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfSU5WQUxJRDsKKwl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwluZXRpZl9jYXJyaWVyX29mZih0cC0+ZGV2KTsKKwl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID0gMDsKKwl0cC0+bGlua19jb25maWcub3JpZ19zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZyA9IEFVVE9ORUdfSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19pbml0X2J1Zm1ncl9jb25maWcoc3RydWN0IHRnMyAqdHApCit7CisJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXIgPQorCQlERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSOworCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlciA9CisJCURFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSOworCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlciA9CisJCURFRkFVTFRfTUJfSElHSF9XQVRFUjsKKworCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyX2p1bWJvID0KKwkJREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl9KVU1CTzsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXJfanVtYm8gPQorCQlERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUl9KVU1CTzsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX2hpZ2hfd2F0ZXJfanVtYm8gPQorCQlERUZBVUxUX01CX0hJR0hfV0FURVJfSlVNQk87CisKKwl0cC0+YnVmbWdyX2NvbmZpZy5kbWFfbG93X3dhdGVyID0gREVGQVVMVF9ETUFfTE9XX1dBVEVSOworCXRwLT5idWZtZ3JfY29uZmlnLmRtYV9oaWdoX3dhdGVyID0gREVGQVVMVF9ETUFfSElHSF9XQVRFUjsKK30KKworc3RhdGljIGNoYXIgKiBfX2RldmluaXQgdGczX3BoeV9zdHJpbmcoc3RydWN0IHRnMyAqdHApCit7CisJc3dpdGNoICh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spIHsKKwljYXNlIFBIWV9JRF9CQ001NDAwOglyZXR1cm4gIjU0MDAiOworCWNhc2UgUEhZX0lEX0JDTTU0MDE6CXJldHVybiAiNTQwMSI7CisJY2FzZSBQSFlfSURfQkNNNTQxMToJcmV0dXJuICI1NDExIjsKKwljYXNlIFBIWV9JRF9CQ001NzAxOglyZXR1cm4gIjU3MDEiOworCWNhc2UgUEhZX0lEX0JDTTU3MDM6CXJldHVybiAiNTcwMyI7CisJY2FzZSBQSFlfSURfQkNNNTcwNDoJcmV0dXJuICI1NzA0IjsKKwljYXNlIFBIWV9JRF9CQ001NzA1OglyZXR1cm4gIjU3MDUiOworCWNhc2UgUEhZX0lEX0JDTTU3NTA6CXJldHVybiAiNTc1MCI7CisJY2FzZSBQSFlfSURfQkNNODAwMjoJcmV0dXJuICI4MDAyL3NlcmRlcyI7CisJY2FzZSAwOgkJCXJldHVybiAic2VyZGVzIjsKKwlkZWZhdWx0OgkJcmV0dXJuICJ1bmtub3duIjsKKwl9OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBfX2RldmluaXQgdGczX2ZpbmRfNTcwNF9wZWVyKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZWVyOworCXVuc2lnbmVkIGludCBmdW5jLCBkZXZuciA9IHRwLT5wZGV2LT5kZXZmbiAmIH43OworCisJZm9yIChmdW5jID0gMDsgZnVuYyA8IDg7IGZ1bmMrKykgeworCQlwZWVyID0gcGNpX2dldF9zbG90KHRwLT5wZGV2LT5idXMsIGRldm5yIHwgZnVuYyk7CisJCWlmIChwZWVyICYmIHBlZXIgIT0gdHAtPnBkZXYpCisJCQlicmVhazsKKwkJcGNpX2Rldl9wdXQocGVlcik7CisJfQorCWlmICghcGVlciB8fCBwZWVyID09IHRwLT5wZGV2KQorCQlCVUcoKTsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byBrZWVwIHRoZSByZWZjb3VudCBlbGV2YXRlZDsgdGhlcmUncyBubyB3YXkKKwkgKiB0byByZW1vdmUgb25lIGhhbGYgb2YgdGhpcyBkZXZpY2Ugd2l0aG91dCByZW1vdmluZyB0aGUgb3RoZXIKKwkgKi8KKwlwY2lfZGV2X3B1dChwZWVyKTsKKworCXJldHVybiBwZWVyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgdGczX3ZlcnNpb25fcHJpbnRlZCA9IDA7CisJdW5zaWduZWQgbG9uZyB0ZzNyZWdfYmFzZSwgdGczcmVnX2xlbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB0ZzMgKnRwOworCWludCBpLCBlcnIsIHBjaV91c2luZ19kYWMsIHBtX2NhcDsKKworCWlmICh0ZzNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgIgorCQkgICAgICAgImJhc2UgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRmluZCBwb3dlci1tYW5hZ2VtZW50IGNhcGFiaWxpdHkuICovCisJcG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwlpZiAocG1fY2FwID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgUG93ZXJNYW5hZ2VtZW50IGNhcGFiaWxpdHksICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKwlpZiAoIWVycikgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgIgorCQkJICAgICAgICJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKKwkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwkJfQorCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisKKwl0ZzNyZWdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwl0ZzNyZWdfbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdHApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfdXNpbmdfZGFjKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IHRnM192bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IHRnM192bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPnBkZXYgPSBwZGV2OworCXRwLT5kZXYgPSBkZXY7CisJdHAtPnBtX2NhcCA9IHBtX2NhcDsKKwl0cC0+bWFjX21vZGUgPSBURzNfREVGX01BQ19NT0RFOworCXRwLT5yeF9tb2RlID0gVEczX0RFRl9SWF9NT0RFOworCXRwLT50eF9tb2RlID0gVEczX0RFRl9UWF9NT0RFOworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwlpZiAodGczX2RlYnVnID4gMCkKKwkJdHAtPm1zZ19lbmFibGUgPSB0ZzNfZGVidWc7CisJZWxzZQorCQl0cC0+bXNnX2VuYWJsZSA9IFRHM19ERUZfTVNHX0VOQUJMRTsKKworCS8qIFRoZSB3b3JkL2J5dGUgc3dhcCBjb250cm9scyBoZXJlIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzIGJ5dGUKKwkgKiBzd2FwcGluZy4gIERNQSBkYXRhIGJ5dGUgc3dhcHBpbmcgaXMgY29udHJvbGxlZCBpbiB0aGUgR1JDX01PREUKKwkgKiBzZXR0aW5nIGJlbG93LgorCSAqLworCXRwLT5taXNjX2hvc3RfY3RybCA9CisJCU1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisJCU1JU0NfSE9TVF9DVFJMX1dPUkRfU1dBUCB8CisJCU1JU0NfSE9TVF9DVFJMX0lORElSX0FDQ0VTUyB8CisJCU1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXOworCisJLyogVGhlIE5PTkZSTSAobm9uLWZyYW1lKSBieXRlL3dvcmQgc3dhcCBjb250cm9scyB0YWtlIGVmZmVjdAorCSAqIG9uIGRlc2NyaXB0b3IgZW50cmllcywgYW55dGhpbmcgd2hpY2ggaXNuJ3QgcGFja2V0IGRhdGEuCisJICoKKwkgKiBUaGUgU3Ryb25nQVJNIGNoaXBzIG9uIHRoZSBib2FyZCAob25lIGZvciB0eCwgb25lIGZvciByeCkKKwkgKiBhcmUgcnVubmluZyBpbiBiaWctZW5kaWFuIG1vZGUuCisJICovCisJdHAtPmdyY19tb2RlID0gKEdSQ19NT0RFX1dTV0FQX0RBVEEgfCBHUkNfTU9ERV9CU1dBUF9EQVRBIHwKKwkJCUdSQ19NT0RFX1dTV0FQX05PTkZSTV9EQVRBKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfQlNXQVBfTk9ORlJNX0RBVEE7CisjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRwLT5pbmRpcmVjdF9sb2NrKTsKKwlJTklUX1dPUksoJnRwLT5yZXNldF90YXNrLCB0ZzNfcmVzZXRfdGFzaywgdHApOworCisJdHAtPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUodGczcmVnX2Jhc2UsIHRnM3JlZ19sZW4pOworCWlmICh0cC0+cmVncyA9PSAwVUwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCXRnM19pbml0X2xpbmtfY29uZmlnKHRwKTsKKworCXRnM19pbml0X2J1Zm1ncl9jb25maWcodHApOworCisJdHAtPnJ4X3BlbmRpbmcgPSBURzNfREVGX1JYX1JJTkdfUEVORElORzsKKwl0cC0+cnhfanVtYm9fcGVuZGluZyA9IFRHM19ERUZfUlhfSlVNQk9fUklOR19QRU5ESU5HOworCXRwLT50eF9wZW5kaW5nID0gVEczX0RFRl9UWF9SSU5HX1BFTkRJTkc7CisKKwlkZXYtPm9wZW4gPSB0ZzNfb3BlbjsKKwlkZXYtPnN0b3AgPSB0ZzNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB0ZzNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdGczX3NldF9yeF9tb2RlOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gdGczX3NldF9tYWNfYWRkcjsKKwlkZXYtPmRvX2lvY3RsID0gdGczX2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9IHRnM190eF90aW1lb3V0OworCWRldi0+cG9sbCA9IHRnM19wb2xsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmdGczX2V0aHRvb2xfb3BzOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRHM19UWF9USU1FT1VUOworCWRldi0+Y2hhbmdlX210dSA9IHRnM19jaGFuZ2VfbXR1OworCWRldi0+aXJxID0gcGRldi0+aXJxOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSB0ZzNfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKwllcnIgPSB0ZzNfZ2V0X2ludmFyaWFudHModHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUHJvYmxlbSBmZXRjaGluZyBpbnZhcmlhbnRzIG9mIGNoaXAsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXIgPQorCQkJREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl81NzA1OworCQl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXIgPQorCQkJREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfNTcwNTsKKwkJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyID0KKwkJCURFRkFVTFRfTUJfSElHSF9XQVRFUl81NzA1OworCX0KKworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1RTT19DQVBBQkxFOworCX0KKwllbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMCB8fAorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpICE9IDApIHsKKwkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1RTT19DQVBBQkxFOworCX0gZWxzZSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1RTT19DQVBBQkxFOworCX0KKworCS8qIFRTTyBpcyBvZmYgYnkgZGVmYXVsdCwgdXNlciBjYW4gZW5hYmxlIHVzaW5nIGV0aHRvb2wuICAqLworI2lmIDAKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKyNlbmRpZgorCisjZW5kaWYKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMSAmJgorCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpICYmCisJICAgICEodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpKSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX01BWF9SWFBFTkRfNjQ7CisJCXRwLT5yeF9wZW5kaW5nID0gNjM7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQl0cC0+cGRldl9wZWVyID0gdGczX2ZpbmRfNTcwNF9wZWVyKHRwKTsKKworCWVyciA9IHRnM19nZXRfZGV2aWNlX2FkZHJlc3ModHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG9idGFpbiB2YWxpZCBldGhlcm5ldCBhZGRyZXNzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJLyoKKwkgKiBSZXNldCBjaGlwIGluIGNhc2UgVU5ESSBvciBFRkkgZHJpdmVyIGRpZCBub3Qgc2h1dGRvd24KKwkgKiBETUEgc2VsZiB0ZXN0IHdpbGwgZW5hYmxlIFdETUFDIGFuZCB3ZSdsbCBzZWUgKHNwdXJpb3VzKQorCSAqIHBlbmRpbmcgRE1BIG9uIHRoZSBQQ0kgYnVzIGF0IHRoYXQgcG9pbnQuCisJICovCisJaWYgKCh0cjMyKEhPU1RDQ19NT0RFKSAmIEhPU1RDQ19NT0RFX0VOQUJMRSkgfHwKKwkgICAgKHRyMzIoV0RNQUNfTU9ERSkgJiBXRE1BQ19NT0RFX0VOQUJMRSkpIHsKKwkJcGNpX3NhdmVfc3RhdGUodHAtPnBkZXYpOworCQl0dzMyKE1FTUFSQl9NT0RFLCBNRU1BUkJfTU9ERV9FTkFCTEUpOworCQl0ZzNfaGFsdCh0cCk7CisJfQorCisJZXJyID0gdGczX3Rlc3RfZG1hKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkRNQSBlbmdpbmUgdGVzdCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCS8qIFRpZ29uMyBjYW4gZG8gaXB2NCBvbmx5Li4uIGFuZCBzb21lIGNoaXBzIGhhdmUgYnVnZ3kKKwkgKiBjaGVja3N1bW1pbmcuCisJICovCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUykgPT0gMCkgeworCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TOworCX0gZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19SWF9DSEVDS1NVTVM7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU181Nzg4KQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hJR0hETUE7CisKKwkvKiBmbG93IGNvbnRyb2wgYXV0b25lZ290aWF0aW9uIGlzIGRlZmF1bHQgYmVoYXZpb3IgKi8KKwl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBOb3cgdGhhdCB3ZSBoYXZlIGZ1bGx5IHNldHVwIHRoZSBjaGlwLCBzYXZlIGF3YXkgYSBzbmFwc2hvdAorCSAqIG9mIHRoZSBQQ0kgY29uZmlnIHNwYWNlLiAgV2UgbmVlZCB0byByZXN0b3JlIHRoaXMgYWZ0ZXIKKwkgKiBHUkNfTUlTQ19DRkcgY29yZSBjbG9jayByZXNldHMgYW5kIHNvbWUgcmVzdW1lIGV2ZW50cy4KKwkgKi8KKwlwY2lfc2F2ZV9zdGF0ZSh0cC0+cGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVGlnb24zIFtwYXJ0bm8oJXMpIHJldiAlMDR4IFBIWSglcyldIChQQ0klczolczolcykgJXNCYXNlVCBFdGhlcm5ldCAiLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIHRwLT5ib2FyZF9wYXJ0X251bWJlciwKKwkgICAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCwKKwkgICAgICAgdGczX3BoeV9zdHJpbmcodHApLAorCSAgICAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIlgiIDogIiIpLAorCSAgICAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkgPworCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIjEzM01IeiIgOiAiNjZNSHoiKSA6CisJCSgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgPyAiMTAwTUh6IiA6ICIzM01IeiIpKSwKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJXzMyQklUKSA/ICIzMi1iaXQiIDogIjY0LWJpdCIpLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSA/ICIxMC8xMDAiIDogIjEwLzEwMC8xMDAwIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUlhjc3Vtc1slZF0gTGlua0NoZ1JFR1slZF0gIgorCSAgICAgICAiTUlpcnFbJWRdIEFTRlslZF0gU3BsaXRbJWRdIFdpcmVTcGVlZFslZF0gIgorCSAgICAgICAiVFNPY2FwWyVkXSBcbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9DSEVDS1NVTVMpICE9IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQpICE9IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgIT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRCkgPT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpICE9IDApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKHRwLT5yZWdzKTsKKworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHRnM19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpb3VubWFwKHRwLT5yZWdzKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXRnM19uZXRpZl9zdG9wKHRwKTsKKworCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19kaXNhYmxlX2ludHModHApOworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJdGczX2hhbHQodHApOworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwllcnIgPSB0ZzNfc2V0X3Bvd2VyX3N0YXRlKHRwLCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJaWYgKGVycikgeworCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJCXRnM19pbml0X2h3KHRwKTsKKworCQl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQl0ZzNfbmV0aWZfc3RhcnQodHApOworCisJCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGczX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJcGNpX3Jlc3RvcmVfc3RhdGUodHAtPnBkZXYpOworCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19pbml0X2h3KHRwKTsKKworCXRwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHRwLT50aW1lcl9vZmZzZXQ7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJdGczX2VuYWJsZV9pbnRzKHRwKTsKKworCXRnM19uZXRpZl9zdGFydCh0cCk7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0ZzNfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSB0ZzNfcGNpX3RibCwKKwkucHJvYmUJCT0gdGczX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGczX3JlbW92ZV9vbmUpLAorCS5zdXNwZW5kCT0gdGczX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0ZzNfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZzNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnRnM19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGczX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRnM19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0ZzNfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZzNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuaCBiL2RyaXZlcnMvbmV0L3RnMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODg4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtMCwwICsxLDIyMDYgQEAKKy8qICRJZDogdGczLmgsdiAxLjM3LjIuMzIgMjAwMi8wMy8xMSAxMjoxODoxOCBkYXZlbSBFeHAgJAorICogdGczLmg6IERlZmluaXRpb25zIGZvciBCcm9hZGNvbSBUaWdvbjMgZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSmVmZiBHYXJ6aWsgKGpnYXJ6aWtAcG9ib3guY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA0IFN1biBNaWNyb3N5c3RlbXMgSW5jLgorICovCisKKyNpZm5kZWYgX1QzX0gKKyNkZWZpbmUgX1QzX0gKKworI2RlZmluZSBURzNfNjRCSVRfUkVHX0hJR0gJCTB4MDBVTAorI2RlZmluZSBURzNfNjRCSVRfUkVHX0xPVwkJMHgwNFVMCisKKy8qIERlc2NyaXB0b3IgYmxvY2sgaW5mby4gKi8KKyNkZWZpbmUgVEczX0JESU5GT19IT1NUX0FERFIJCTB4MFVMIC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNfQkRJTkZPX01BWExFTl9GTEFHUwkJMHg4VUwgLyogMzItYml0ICovCisjZGVmaW5lICBCRElORk9fRkxBR1NfVVNFX0VYVF9SRUNWCSAweDAwMDAwMDAxIC8qIGV4dCByeF9idWZmZXJfZGVzYyAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9NQVNLCSAweGZmZmYwMDAwCisjZGVmaW5lICBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUCSAxNgorI2RlZmluZSBURzNfQkRJTkZPX05JQ19BRERSCQkweGNVTCAvKiAzMi1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19TSVpFCQkJMHgxMFVMCisKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQgIAkJMjU2CisKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFCQkJMTUzNgorI2RlZmluZSBSWF9TVERfTUFYX1NJWkVfNTcwNQkJNTEyCisjZGVmaW5lIFJYX0pVTUJPX01BWF9TSVpFCQkweGRlYWRiZWVmIC8qIFhYWCAqLworCisvKiBGaXJzdCAyNTYgYnl0ZXMgYXJlIGEgbWlycm9yIG9mIFBDSSBjb25maWcgc3BhY2UuICovCisjZGVmaW5lIFRHM1BDSV9WRU5ET1IJCQkweDAwMDAwMDAwCisjZGVmaW5lICBURzNQQ0lfVkVORE9SX0JST0FEQ09NCQkgMHgxNGU0CisjZGVmaW5lIFRHM1BDSV9ERVZJQ0UJCQkweDAwMDAwMDAyCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18xCQkgMHgxNjQ0IC8qIEJDTTU3MDAgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzIJCSAweDE2NDUgLyogQkNNNTcwMSAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMwkJIDB4MTY0NiAvKiBCQ001NzAyICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM180CQkgMHgxNjQ3IC8qIEJDTTU3MDMgKi8KKyNkZWZpbmUgVEczUENJX0NPTU1BTkQJCQkweDAwMDAwMDA0CisjZGVmaW5lIFRHM1BDSV9TVEFUVVMJCQkweDAwMDAwMDA2CisjZGVmaW5lIFRHM1BDSV9DQ1JFVklECQkJMHgwMDAwMDAwOAorI2RlZmluZSBURzNQQ0lfQ0FDSEVMSU5FU1oJCTB4MDAwMDAwMGMKKyNkZWZpbmUgVEczUENJX0xBVFRJTUVSCQkJMHgwMDAwMDAwZAorI2RlZmluZSBURzNQQ0lfSEVBREVSVFlQRQkJMHgwMDAwMDAwZQorI2RlZmluZSBURzNQQ0lfQklTVAkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgVEczUENJX0JBU0UwX0xPVwkJMHgwMDAwMDAxMAorI2RlZmluZSBURzNQQ0lfQkFTRTBfSElHSAkJMHgwMDAwMDAxNAorLyogMHgxOCAtLT4gMHgyYyB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX1NVQlNZU1ZFTklECQkweDAwMDAwMDJjCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNJRAkJCTB4MDAwMDAwMmUKKyNkZWZpbmUgVEczUENJX1JPTUFERFIJCQkweDAwMDAwMDMwCisjZGVmaW5lIFRHM1BDSV9DQVBMSVNUCQkJMHgwMDAwMDAzNAorLyogMHgzNSAtLT4gMHgzYyB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX0lSUV9MSU5FCQkJMHgwMDAwMDAzYworI2RlZmluZSBURzNQQ0lfSVJRX1BJTgkJCTB4MDAwMDAwM2QKKyNkZWZpbmUgVEczUENJX01JTl9HTlQJCQkweDAwMDAwMDNlCisjZGVmaW5lIFRHM1BDSV9NQVhfTEFUCQkJMHgwMDAwMDAzZgorI2RlZmluZSBURzNQQ0lfWF9DQVBTCQkJMHgwMDAwMDA0MAorI2RlZmluZSAgUENJWF9DQVBTX1JFTEFYRURfT1JERVJJTkcJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9NQVNLCQkgMHgwMDcwMDAwMAorI2RlZmluZSAgUENJWF9DQVBTX1NQTElUX1NISUZUCQkgMjAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9NQVNLCQkgMHgwMDBjMDAwMAorI2RlZmluZSAgUENJWF9DQVBTX0JVUlNUX1NISUZUCQkgMTgKKyNkZWZpbmUgIFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IJIDIKKyNkZWZpbmUgVEczUENJX1BNX0NBUF9QVFIJCTB4MDAwMDAwNDEKKyNkZWZpbmUgVEczUENJX1hfQ09NTUFORAkJMHgwMDAwMDA0MgorI2RlZmluZSBURzNQQ0lfWF9TVEFUVVMJCQkweDAwMDAwMDQ0CisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfSUQJCTB4MDAwMDAwNDgKKyNkZWZpbmUgVEczUENJX1ZQRF9DQVBfUFRSCQkweDAwMDAwMDQ5CisjZGVmaW5lIFRHM1BDSV9QTV9DQVBTCQkJMHgwMDAwMDA0YQorI2RlZmluZSBURzNQQ0lfUE1fQ1RSTF9TVEFUCQkweDAwMDAwMDRjCisjZGVmaW5lIFRHM1BDSV9CUl9TVVBQX0VYVAkJMHgwMDAwMDA0ZQorI2RlZmluZSBURzNQQ0lfUE1fREFUQQkJCTB4MDAwMDAwNGYKKyNkZWZpbmUgVEczUENJX1ZQRF9DQVBfSUQJCTB4MDAwMDAwNTAKKyNkZWZpbmUgVEczUENJX01TSV9DQVBfUFRSCQkweDAwMDAwMDUxCisjZGVmaW5lIFRHM1BDSV9WUERfQUREUl9GTEFHCQkweDAwMDAwMDUyCisjZGVmaW5lICBWUERfQUREUl9GTEFHX1dSSVRFCQkweDAwMDA4MDAwCisjZGVmaW5lIFRHM1BDSV9WUERfREFUQQkJCTB4MDAwMDAwNTQKKyNkZWZpbmUgVEczUENJX01TSV9DQVBfSUQJCTB4MDAwMDAwNTgKKyNkZWZpbmUgVEczUENJX05YVF9DQVBfUFRSCQkweDAwMDAwMDU5CisjZGVmaW5lIFRHM1BDSV9NU0lfQ1RSTAkJCTB4MDAwMDAwNWEKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0xPVwkJMHgwMDAwMDA1YworI2RlZmluZSBURzNQQ0lfTVNJX0FERFJfSElHSAkJMHgwMDAwMDA2MAorI2RlZmluZSBURzNQQ0lfTVNJX0RBVEEJCQkweDAwMDAwMDY0CisvKiAweDY2IC0tPiAweDY4IHVudXNlZCAqLworI2RlZmluZSBURzNQQ0lfTUlTQ19IT1NUX0NUUkwJCTB4MDAwMDAwNjgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NMRUFSX0lOVAkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UCSAweDAwMDAwMDAyCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9CWVRFX1NXQVAJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1dPUkRfU1dBUAkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfUENJU1RBVEVfUlcJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NMS1JFR19SVwkgMHgwMDAwMDAyMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfUkVHV09SRF9TV0FQCSAweDAwMDAwMDQwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0lSUV9NQVNLX01PREUJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1RBR0dFRF9TVEFUVVMJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYJCSAweGZmZmYwMDAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUCSAxNgorI2RlZmluZSAgR0VUX0NISVBfUkVWX0lEKE1JU0NfSE9TVF9DVFJMKSBcCisJICgoKE1JU0NfSE9TVF9DVFJMKSAmIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYpID4+IFwKKwkgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVZfU0hJRlQpCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTAJCSAweDcwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BMQkJIDB4NzAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IwCQkgMHg3MTAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjEJCSAweDcxMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMwkJIDB4NzEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0FMVElNQQkJIDB4NzEwNAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0MwCQkgMHg3MjAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQTAJCSAweDAwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMAkJIDB4MDEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0IyCQkgMHgwMTAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjUJCSAweDAxMDUKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMAkJIDB4MTAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0ExCQkgMHgxMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTIJCSAweDEwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMwkJIDB4MTAwMworI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0EwCQkgMHgyMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTEJCSAweDIwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMgkJIDB4MjAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0EzCQkgMHgyMDAzCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTAJCSAweDMwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNV9BMQkJIDB4MzAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EyCQkgMHgzMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTMJCSAweDMwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTc1MF9BMAkJIDB4NDAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzUwX0ExCQkgMHg0MDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3NTBfQTMJCSAweDQwMDMKKyNkZWZpbmUgIEdFVF9BU0lDX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgPj4gMTIpCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMAkJCSAweDA3CisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMQkJCSAweDAwCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMwkJCSAweDAxCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwNAkJCSAweDAyCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwNQkJCSAweDAzCisjZGVmaW5lICAgQVNJQ19SRVZfNTc1MAkJCSAweDA0CisjZGVmaW5lICBHRVRfQ0hJUF9SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpID4+IDgpCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0FYCQkgMHg3MAorI2RlZmluZSAgIENISVBSRVZfNTcwMF9CWAkJIDB4NzEKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQ1gJCSAweDcyCisjZGVmaW5lICAgQ0hJUFJFVl81NzAxX0FYCQkgMHgwMAorI2RlZmluZSAgIENISVBSRVZfNTcwM19BWAkJIDB4MTAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDRfQVgJCSAweDIwCisjZGVmaW5lICAgQ0hJUFJFVl81NzA0X0JYCQkgMHgyMQorI2RlZmluZSAgIENISVBSRVZfNTc1MF9BWAkJIDB4NDAKKyNkZWZpbmUgICBDSElQUkVWXzU3NTBfQlgJCSAweDQxCisjZGVmaW5lICBHRVRfTUVUQUxfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSAmIDB4ZmYpCisjZGVmaW5lICAgTUVUQUxfUkVWX0EwCQkJIDB4MDAKKyNkZWZpbmUgICBNRVRBTF9SRVZfQTEJCQkgMHgwMQorI2RlZmluZSAgIE1FVEFMX1JFVl9CMAkJCSAweDAwCisjZGVmaW5lICAgTUVUQUxfUkVWX0IxCQkJIDB4MDEKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjIJCQkgMHgwMgorI2RlZmluZSBURzNQQ0lfRE1BX1JXX0NUUkwJCTB4MDAwMDAwNmMKKyNkZWZpbmUgIERNQV9SV0NUUkxfTUlOX0RNQQkJIDB4MDAwMDAwZmYKKyNkZWZpbmUgIERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVAkgMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZX01BU0sJIDB4MDAwMDA3MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV9ESVNBQgkgMHgwMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzE2CSAweDAwMDAwMTAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMTI4X1BDSVgJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8zMgkgMHgwMDAwMDIwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzI1Nl9QQ0lYCSAweDAwMDAwMjAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfNjQJIDB4MDAwMDAzMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8zODRfUENJWAkgMHgwMDAwMDMwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEyOAkgMHgwMDAwMDQwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzI1NgkgMHgwMDAwMDUwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzUxMgkgMHgwMDAwMDYwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEwMjQJIDB4MDAwMDA3MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfTUFTSwkgMHgwMDAwMzgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9ESVNBQgkgMHgwMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xNgkgMHgwMDAwMDgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjhfUENJWCAweDAwMDAwODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzMyCSAweDAwMDAxMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1Nl9QQ0lYIDB4MDAwMDEwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfNjQJIDB4MDAwMDE4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzg0X1BDSVggMHgwMDAwMTgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjgJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2CSAweDAwMDAyODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzUxMgkgMHgwMDAwMzAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMDI0CSAweDAwMDAzODAwCisjZGVmaW5lICBETUFfUldDVFJMX09ORV9ETUEJCSAweDAwMDA0MDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfV0FURVIJCSAweDAwMDcwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfV0FURVJfU0hJRlQJIDE2CisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX1dBVEVSCQkgMHgwMDM4MDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVAkgMTkKKyNkZWZpbmUgIERNQV9SV0NUUkxfVVNFX01FTV9SRUFEX01VTFQJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfQVNTRVJUX0FMTF9CRQkgMHgwMDgwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTUQJIDB4MGYwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1JFQURfQ01EX1NISUZUCSAyNAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01ECSAweGYwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQJIDI4CisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzY0X1BDSUUJIDB4MTAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4X1BDSUUgMHgzMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9ESVNBQl9QQ0lFIDB4NzAwMDAwMDAKKyNkZWZpbmUgVEczUENJX1BDSVNUQVRFCQkJMHgwMDAwMDA3MAorI2RlZmluZSAgUENJU1RBVEVfRk9SQ0VfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUENJU1RBVEVfQ09OVl9QQ0lfTU9ERQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdICSAweDAwMDAwMDA4CisjZGVmaW5lICBQQ0lTVEFURV9CVVNfMzJCSVQJCSAweDAwMDAwMDEwCisjZGVmaW5lICBQQ0lTVEFURV9ST01fRU5BQkxFCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRQkgMHgwMDAwMDA0MAorI2RlZmluZSAgUENJU1RBVEVfRkxBVF9WSUVXCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUENJU1RBVEVfUkVUUllfU0FNRV9ETUEJIDB4MDAwMDIwMDAKKyNkZWZpbmUgVEczUENJX0NMT0NLX0NUUkwJCTB4MDAwMDAwNzQKKyNkZWZpbmUgIENMT0NLX0NUUkxfQ09SRUNMS19ESVNBQkxFCSAweDAwMDAwMjAwCisjZGVmaW5lICBDTE9DS19DVFJMX1JYQ0xLX0RJU0FCTEUJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRQkgMHgwMDAwMDgwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9BTFRDTEsJCSAweDAwMDAxMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX1BXUkRPV05fUExMMTMzCSAweDAwMDA4MDAwCisjZGVmaW5lICBDTE9DS19DVFJMXzQ0TUhaX0NPUkUJCSAweDAwMDQwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMXzYyNV9DT1JFCQkgMHgwMDEwMDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9GT1JDRV9DTEtSVU4JIDB4MDAyMDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEUJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfREVMQVlfUENJX0dSQU5UCSAweDgwMDAwMDAwCisjZGVmaW5lIFRHM1BDSV9SRUdfQkFTRV9BRERSCQkweDAwMDAwMDc4CisjZGVmaW5lIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUgkweDAwMDAwMDdjCisjZGVmaW5lIFRHM1BDSV9SRUdfREFUQQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEczUENJX01FTV9XSU5fREFUQQkJMHgwMDAwMDA4NAorI2RlZmluZSBURzNQQ0lfTU9ERV9DVFJMCQkweDAwMDAwMDg4CisjZGVmaW5lIFRHM1BDSV9NSVNDX0NGRwkJCTB4MDAwMDAwOGMKKyNkZWZpbmUgVEczUENJX01JU0NfTE9DQUxfQ1RSTAkJMHgwMDAwMDA5MAorLyogMHg5NCAtLT4gMHg5OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX1NURF9SSU5HX1BST0RfSURYCTB4MDAwMDAwOTggLyogNjQtYml0ICovCisjZGVmaW5lIFRHM1BDSV9SQ1ZfUkVUX1JJTkdfQ09OX0lEWAkweDAwMDAwMGEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNQQ0lfU05EX1BST0RfSURYCQkweDAwMDAwMGE4IC8qIDY0LWJpdCAqLworLyogMHhiMCAtLT4gMHhiOCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX0RVQUxfTUFDX0NUUkwJCTB4MDAwMDAwYjgKKyNkZWZpbmUgIERVQUxfTUFDX0NUUkxfQ0hfTUFTSwkJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIERVQUxfTUFDX0NUUkxfSUQJCSAweDAwMDAwMDA0CisvKiAweGJjIC0tPiAweDEwMCB1bnVzZWQgKi8KKworLyogMHgxMDAgLS0+IDB4MjAwIHVudXNlZCAqLworCisvKiBNYWlsYm94IHJlZ2lzdGVycyAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8wCQkweDAwMDAwMjAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8xCQkweDAwMDAwMjA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8yCQkweDAwMDAwMjEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8zCQkweDAwMDAwMjE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMAkJMHgwMDAwMDIyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzEJCTB4MDAwMDAyMjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8yCQkweDAwMDAwMjMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMwkJMHgwMDAwMDIzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzQJCTB4MDAwMDAyNDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF81CQkweDAwMDAwMjQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNgkJMHgwMDAwMDI1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzcJCTB4MDAwMDAyNTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkVMT0FEX1NUQVQJCTB4MDAwMDAyNjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWAkweDAwMDAwMjY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9KVU1CT19QUk9EX0lEWAkweDAwMDAwMjcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9NSU5JX1BST0RfSURYCTB4MDAwMDAyNzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMAkweDAwMDAwMjgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEJMHgwMDAwMDI4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8yCTB4MDAwMDAyOTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMwkweDAwMDAwMjk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzQJMHgwMDAwMDJhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF81CTB4MDAwMDAyYTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNgkweDAwMDAwMmIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzcJMHgwMDAwMDJiOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF84CTB4MDAwMDAyYzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfOQkweDAwMDAwMmM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEwCTB4MDAwMDAyZDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTEJMHgwMDAwMDJkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMgkweDAwMDAwMmUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEzCTB4MDAwMDAyZTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTQJMHgwMDAwMDJmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xNQkweDAwMDAwMmY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMAkweDAwMDAwMzAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMQkweDAwMDAwMzA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMgkweDAwMDAwMzEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMwkweDAwMDAwMzE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNAkweDAwMDAwMzIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNQkweDAwMDAwMzI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNgkweDAwMDAwMzMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNwkweDAwMDAwMzM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfOAkweDAwMDAwMzQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfOQkweDAwMDAwMzQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTAJMHgwMDAwMDM1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzExCTB4MDAwMDAzNTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMgkweDAwMDAwMzYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTMJMHgwMDAwMDM2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzE0CTB4MDAwMDAzNzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xNQkweDAwMDAwMzc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wCTB4MDAwMDAzODAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEJMHgwMDAwMDM4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMgkweDAwMDAwMzkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8zCTB4MDAwMDAzOTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzQJMHgwMDAwMDNhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNQkweDAwMDAwM2E4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF82CTB4MDAwMDAzYjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzcJMHgwMDAwMDNiOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfOAkweDAwMDAwM2MwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF85CTB4MDAwMDAzYzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEwCTB4MDAwMDAzZDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzExCTB4MDAwMDAzZDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEyCTB4MDAwMDAzZTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEzCTB4MDAwMDAzZTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzE0CTB4MDAwMDAzZjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzE1CTB4MDAwMDAzZjggLyogNjQtYml0ICovCisKKy8qIE1BQyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQUNfTU9ERQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19NT0RFX0hBTEZfRFVQTEVYCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX01BU0sJIDB4MDAwMDAwMGMKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkJCSAweDAwMDAwMDBjCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfR01JSQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX01JSQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9OT05FCSAweDAwMDAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX0lOVF9MUEJBQ0sJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19NT0RFX1RBR0dFRF9NQUNfQ1RSTAkgMHgwMDAwMDA4MAorI2RlZmluZSAgTUFDX01PREVfVFhfQlVSU1RJTkcJCSAweDAwMDAwMTAwCisjZGVmaW5lICBNQUNfTU9ERV9NQVhfREVGRVIJCSAweDAwMDAwMjAwCisjZGVmaW5lICBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZCQkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX01PREVfUlhTVEFUX0VOQUJMRQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9DTEVBUgkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9GTFVTSAkJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYU1RBVF9FTkFCTEUJCSAweDAwMDA0MDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIJCSAweDAwMDA4MDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfRkxVU0gJCSAweDAwMDEwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9TRU5EX0NPTkZJR1MJCSAweDAwMDIwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9NQUdJQ19QS1RfRU5BQkxFCSAweDAwMDQwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9BQ1BJX0VOQUJMRQkJIDB4MDAwODAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX01JUF9FTkFCTEUJCSAweDAwMTAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9UREVfRU5BQkxFCQkgMHgwMDIwMDAwMAorI2RlZmluZSAgTUFDX01PREVfUkRFX0VOQUJMRQkJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX0ZIREVfRU5BQkxFCQkgMHgwMDgwMDAwMAorI2RlZmluZSBNQUNfU1RBVFVTCQkJMHgwMDAwMDQwNAorI2RlZmluZSAgTUFDX1NUQVRVU19QQ1NfU1lOQ0VECQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUFDX1NUQVRVU19TSUdOQUxfREVUCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX1NUQVRVU19SQ1ZEX0NGRwkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRAkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX1NUQVRVU19QT1JUX0RFQ19FUlIJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRAkgMHgwMDAwMTAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19NSV9DT01QTEVUSU9OCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVAkgMHgwMDgwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19BUF9FUlJPUgkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfT0RJX0VSUk9SCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19SWFNUQVRfT1ZFUlJVTgkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19UWFNUQVRfT1ZFUlJVTgkgMHgwODAwMDAwMAorI2RlZmluZSBNQUNfRVZFTlQJCQkweDAwMDAwNDA4CisjZGVmaW5lICBNQUNfRVZFTlRfUE9SVF9ERUNPREVfRVJSCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTE5LU1RBVEVfQ0hBTkdFRAkgMHgwMDAwMTAwMAorI2RlZmluZSAgTUFDX0VWRU5UX01JX0NPTVBMRVRJT04JIDB4MDA0MDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9NSV9JTlRFUlJVUFQJCSAweDAwODAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfQVBfRVJST1IJCSAweDAxMDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfT0RJX0VSUk9SCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX1JYU1RBVF9PVkVSUlVOCSAweDA0MDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfVFhTVEFUX09WRVJSVU4JIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX0xFRF9DVFJMCQkJMHgwMDAwMDQwYworI2RlZmluZSAgTEVEX0NUUkxfTE5LTEVEX09WRVJSSURFCSAweDAwMDAwMDAxCisjZGVmaW5lICBMRURfQ1RSTF8xMDAwTUJQU19PTgkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIExFRF9DVFJMXzEwME1CUFNfT04JCSAweDAwMDAwMDA0CisjZGVmaW5lICBMRURfQ1RSTF8xME1CUFNfT04JCSAweDAwMDAwMDA4CisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX09WRVJSSURFCSAweDAwMDAwMDEwCisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX0JMSU5LCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19MRUQJCSAweDAwMDAwMDQwCisjZGVmaW5lICBMRURfQ1RSTF8xMDAwTUJQU19TVEFUVVMJIDB4MDAwMDAwODAKKyNkZWZpbmUgIExFRF9DVFJMXzEwME1CUFNfU1RBVFVTCSAweDAwMDAwMTAwCisjZGVmaW5lICBMRURfQ1RSTF8xME1CUFNfU1RBVFVTCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19TVEFUVVMJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfTUFDCQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTEVEX0NUUkxfTU9ERV9QSFlfMQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfUEhZXzIJCSAweDAwMDAxMDAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX1NIQVNUQV9NQUMJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfU0hBUkVECQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTEVEX0NUUkxfTU9ERV9DT01CTwkJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfTUFTSwkgMHg3ZmY4MDAwMAorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUkFURV9TSElGVAkgMTkKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1BFUl9PVkVSUklERQkgMHgwMDA4MDAwMAorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUkFURV9PVkVSUklERQkgMHg4MDAwMDAwMAorI2RlZmluZSBNQUNfQUREUl8wX0hJR0gJCQkweDAwMDAwNDEwIC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMF9MT1cJCQkweDAwMDAwNDE0IC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMV9ISUdICQkJMHgwMDAwMDQxOCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzFfTE9XCQkJMHgwMDAwMDQxYyAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzJfSElHSAkJCTB4MDAwMDA0MjAgLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8yX0xPVwkJCTB4MDAwMDA0MjQgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8zX0hJR0gJCQkweDAwMDAwNDI4IC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfM19MT1cJCQkweDAwMDAwNDJjIC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FDUElfTUJVRl9QVFIJCTB4MDAwMDA0MzAKKyNkZWZpbmUgTUFDX0FDUElfTEVOX09GRlNFVAkJMHgwMDAwMDQzNAorI2RlZmluZSAgQUNQSV9MRU5PRkZfTEVOX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9MRU5fU0hJRlQJCSAwCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9PRkZfTUFTSwkJIDB4MGZmZjAwMDAKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX09GRl9TSElGVAkJIDE2CisjZGVmaW5lIE1BQ19UWF9CQUNLT0ZGX1NFRUQJCTB4MDAwMDA0MzgKKyNkZWZpbmUgIFRYX0JBQ0tPRkZfU0VFRF9NQVNLCQkgMHgwMDAwMDNmZgorI2RlZmluZSBNQUNfUlhfTVRVX1NJWkUJCQkweDAwMDAwNDNjCisjZGVmaW5lICBSWF9NVFVfU0laRV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSBNQUNfUENTX1RFU1QJCQkweDAwMDAwNDQwCisjZGVmaW5lICBQQ1NfVEVTVF9QQVRURVJOX01BU0sJCSAweDAwMGZmZmZmCisjZGVmaW5lICBQQ1NfVEVTVF9QQVRURVJOX1NISUZUCQkgMAorI2RlZmluZSAgUENTX1RFU1RfRU5BQkxFCQkgMHgwMDEwMDAwMAorI2RlZmluZSBNQUNfVFhfQVVUT19ORUcJCQkweDAwMDAwNDQ0CisjZGVmaW5lICBUWF9BVVRPX05FR19NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgVFhfQVVUT19ORUdfU0hJRlQJCSAwCisjZGVmaW5lIE1BQ19SWF9BVVRPX05FRwkJCTB4MDAwMDA0NDgKKyNkZWZpbmUgIFJYX0FVVE9fTkVHX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBSWF9BVVRPX05FR19TSElGVAkJIDAKKyNkZWZpbmUgTUFDX01JX0NPTQkJCTB4MDAwMDA0NGMKKyNkZWZpbmUgIE1JX0NPTV9DTURfTUFTSwkJIDB4MGMwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9DTURfV1JJVEUJCSAweDA0MDAwMDAwCisjZGVmaW5lICBNSV9DT01fQ01EX1JFQUQJCSAweDA4MDAwMDAwCisjZGVmaW5lICBNSV9DT01fUkVBRF9GQUlMRUQJCSAweDEwMDAwMDAwCisjZGVmaW5lICBNSV9DT01fU1RBUlQJCQkgMHgyMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0JVU1kJCQkgMHgyMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1BIWV9BRERSX01BU0sJCSAweDAzZTAwMDAwCisjZGVmaW5lICBNSV9DT01fUEhZX0FERFJfU0hJRlQJCSAyMQorI2RlZmluZSAgTUlfQ09NX1JFR19BRERSX01BU0sJCSAweDAwMWYwMDAwCisjZGVmaW5lICBNSV9DT01fUkVHX0FERFJfU0hJRlQJCSAxNgorI2RlZmluZSAgTUlfQ09NX0RBVEFfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgTUFDX01JX1NUQVQJCQkweDAwMDAwNDUwCisjZGVmaW5lICBNQUNfTUlfU1RBVF9MTktTVEFUX0FUVE5fRU5BQgkgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNfTUlfTU9ERQkJCTB4MDAwMDA0NTQKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0NMS18xME1IWgkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX1NIT1JUX1BSRUFNQkxFCSAweDAwMDAwMDAyCisjZGVmaW5lICBNQUNfTUlfTU9ERV9BVVRPX1BPTEwJCSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfTUlfTU9ERV9DT1JFX0NMS182Mk1IWgkgMHgwMDAwODAwMAorI2RlZmluZSAgTUFDX01JX01PREVfQkFTRQkJIDB4MDAwYzAwMDAgLyogWFhYIG1hZ2ljIHZhbHVlcyBYWFggKi8KKyNkZWZpbmUgTUFDX0FVVE9fUE9MTF9TVEFUVVMJCTB4MDAwMDA0NTgKKyNkZWZpbmUgIE1BQ19BVVRPX1BPTExfRVJST1IJCSAweDAwMDAwMDAxCisjZGVmaW5lIE1BQ19UWF9NT0RFCQkJMHgwMDAwMDQ1YworI2RlZmluZSAgVFhfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBUWF9NT0RFX0VOQUJMRQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBUWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEUJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFRYX01PREVfQklHX0JDS09GRl9FTkFCTEUJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFRYX01PREVfTE9OR19QQVVTRV9FTkFCTEUJIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRVUwkJCTB4MDAwMDA0NjAKKyNkZWZpbmUgIFRYX1NUQVRVU19YT0ZGRUQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBUWF9TVEFUVVNfU0VOVF9YT0ZGCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgVFhfU1RBVFVTX1NFTlRfWE9OCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgVFhfU1RBVFVTX0xJTktfVVAJCSAweDAwMDAwMDA4CisjZGVmaW5lICBUWF9TVEFUVVNfT0RJX1VOREVSUlVOCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgVFhfU1RBVFVTX09ESV9PVkVSUlVOCQkgMHgwMDAwMDAyMAorI2RlZmluZSBNQUNfVFhfTEVOR1RIUwkJCTB4MDAwMDA0NjQKKyNkZWZpbmUgIFRYX0xFTkdUSFNfU0xPVF9USU1FX01BU0sJIDB4MDAwMDAwZmYKKyNkZWZpbmUgIFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUCSAwCisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19NQVNLCQkgMHgwMDAwMGYwMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfU0hJRlQJCSA4CisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19DUlNfTUFTSwkgMHgwMDAwMzAwMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUCSAxMgorI2RlZmluZSBNQUNfUlhfTU9ERQkJCTB4MDAwMDA0NjgKKyNkZWZpbmUgIFJYX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUlhfTU9ERV9FTkFCTEUJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUlhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lICBSWF9NT0RFX0tFRVBfTUFDX0NUUkwJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSWF9NT0RFX0tFRVBfUEFVU0UJCSAweDAwMDAwMDEwCisjZGVmaW5lICBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJYX01PREVfQUNDRVBUX1JVTlRTCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgUlhfTU9ERV9MRU5fQ0hFQ0sJCSAweDAwMDAwMDgwCisjZGVmaW5lICBSWF9NT0RFX1BST01JU0MJCSAweDAwMDAwMTAwCisjZGVmaW5lICBSWF9NT0RFX05PX0NSQ19DSEVDSwkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJYX01PREVfS0VFUF9WTEFOX1RBRwkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgTUFDX1JYX1NUQVRVUwkJCTB4MDAwMDA0NmMKKyNkZWZpbmUgIFJYX1NUQVRVU19SRU1PVEVfVFhfWE9GRkVECSAweDAwMDAwMDAxCisjZGVmaW5lICBSWF9TVEFUVVNfWE9GRl9SQ1ZECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUlhfU1RBVFVTX1hPTl9SQ1ZECQkgMHgwMDAwMDAwNAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMAkJCTB4MDAwMDA0NzAKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzEJCQkweDAwMDAwNDc0CisjZGVmaW5lIE1BQ19IQVNIX1JFR18yCQkJMHgwMDAwMDQ3OAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMwkJCTB4MDAwMDA0N2MKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzAJCQkweDAwMDAwNDgwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMAkJCTB4MDAwMDA0ODQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEJCQkweDAwMDAwNDg4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMQkJCTB4MDAwMDA0OGMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzIJCQkweDAwMDAwNDkwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMgkJCTB4MDAwMDA0OTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzMJCQkweDAwMDAwNDk4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMwkJCTB4MDAwMDA0OWMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzQJCQkweDAwMDAwNGEwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNAkJCTB4MDAwMDA0YTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzUJCQkweDAwMDAwNGE4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNQkJCTB4MDAwMDA0YWMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzYJCQkweDAwMDAwNGIwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNgkJCTB4MDAwMDA0YjQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzcJCQkweDAwMDAwNGI4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfNwkJCTB4MDAwMDA0YmMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzgJCQkweDAwMDAwNGMwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfOAkJCTB4MDAwMDA0YzQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzkJCQkweDAwMDAwNGM4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfOQkJCTB4MDAwMDA0Y2MKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEwCQkJMHgwMDAwMDRkMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEwCQkweDAwMDAwNGQ0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMQkJCTB4MDAwMDA0ZDgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMQkJMHgwMDAwMDRkYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTIJCQkweDAwMDAwNGUwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTIJCTB4MDAwMDA0ZTQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEzCQkJMHgwMDAwMDRlOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEzCQkweDAwMDAwNGVjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xNAkJCTB4MDAwMDA0ZjAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xNAkJMHgwMDAwMDRmNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTUJCQkweDAwMDAwNGY4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTUJCTB4MDAwMDA0ZmMKKyNkZWZpbmUgIFJDVl9SVUxFX0RJU0FCTEVfTUFTSwkJIDB4N2ZmZmZmZmYKKyNkZWZpbmUgTUFDX1JDVl9SVUxFX0NGRwkJMHgwMDAwMDUwMAorI2RlZmluZSAgUkNWX1JVTEVfQ0ZHX0RFRkFVTFRfQ0xBU1MJMHgwMDAwMDAwOAorI2RlZmluZSBNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRQkweDAwMDAwNTA0CisvKiAweDUwOCAtLT4gMHg1MjAgdW51c2VkICovCisjZGVmaW5lIE1BQ19IQVNIUkVHVV8wCQkJMHgwMDAwMDUyMAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMQkJCTB4MDAwMDA1MjQKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzIJCQkweDAwMDAwNTI4CisjZGVmaW5lIE1BQ19IQVNIUkVHVV8zCQkJMHgwMDAwMDUyYworI2RlZmluZSBNQUNfRVhUQUREUl8wX0hJR0gJCTB4MDAwMDA1MzAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMF9MT1cJCTB4MDAwMDA1MzQKKyNkZWZpbmUgTUFDX0VYVEFERFJfMV9ISUdICQkweDAwMDAwNTM4CisjZGVmaW5lIE1BQ19FWFRBRERSXzFfTE9XCQkweDAwMDAwNTNjCisjZGVmaW5lIE1BQ19FWFRBRERSXzJfSElHSAkJMHgwMDAwMDU0MAorI2RlZmluZSBNQUNfRVhUQUREUl8yX0xPVwkJMHgwMDAwMDU0NAorI2RlZmluZSBNQUNfRVhUQUREUl8zX0hJR0gJCTB4MDAwMDA1NDgKKyNkZWZpbmUgTUFDX0VYVEFERFJfM19MT1cJCTB4MDAwMDA1NGMKKyNkZWZpbmUgTUFDX0VYVEFERFJfNF9ISUdICQkweDAwMDAwNTUwCisjZGVmaW5lIE1BQ19FWFRBRERSXzRfTE9XCQkweDAwMDAwNTU0CisjZGVmaW5lIE1BQ19FWFRBRERSXzVfSElHSAkJMHgwMDAwMDU1OAorI2RlZmluZSBNQUNfRVhUQUREUl81X0xPVwkJMHgwMDAwMDU1YworI2RlZmluZSBNQUNfRVhUQUREUl82X0hJR0gJCTB4MDAwMDA1NjAKKyNkZWZpbmUgTUFDX0VYVEFERFJfNl9MT1cJCTB4MDAwMDA1NjQKKyNkZWZpbmUgTUFDX0VYVEFERFJfN19ISUdICQkweDAwMDAwNTY4CisjZGVmaW5lIE1BQ19FWFRBRERSXzdfTE9XCQkweDAwMDAwNTZjCisjZGVmaW5lIE1BQ19FWFRBRERSXzhfSElHSAkJMHgwMDAwMDU3MAorI2RlZmluZSBNQUNfRVhUQUREUl84X0xPVwkJMHgwMDAwMDU3NAorI2RlZmluZSBNQUNfRVhUQUREUl85X0hJR0gJCTB4MDAwMDA1NzgKKyNkZWZpbmUgTUFDX0VYVEFERFJfOV9MT1cJCTB4MDAwMDA1N2MKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTBfSElHSAkJMHgwMDAwMDU4MAorI2RlZmluZSBNQUNfRVhUQUREUl8xMF9MT1cJCTB4MDAwMDA1ODQKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTFfSElHSAkJMHgwMDAwMDU4OAorI2RlZmluZSBNQUNfRVhUQUREUl8xMV9MT1cJCTB4MDAwMDA1OGMKKyNkZWZpbmUgTUFDX1NFUkRFU19DRkcJCQkweDAwMDAwNTkwCisjZGVmaW5lICBNQUNfU0VSREVTX0NGR19FREdFX1NFTEVDVAkgMHgwMDAwMTAwMAorI2RlZmluZSBNQUNfU0VSREVTX1NUQVQJCQkweDAwMDAwNTk0CisvKiAweDU5OCAtLT4gMHg1YjAgdW51c2VkICovCisjZGVmaW5lIFNHX0RJR19DVFJMCQkJMHgwMDAwMDViMAorI2RlZmluZSAgU0dfRElHX1VTSU5HX0hXX0FVVE9ORUcJIDB4ODAwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19TT0ZUX1JFU0VUCQkgMHg0MDAwMDAwMAorI2RlZmluZSAgU0dfRElHX0RJU0FCTEVfTElOS1JEWQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19DUkMxNl9DTEVBUl9OCQkgMHgwMTAwMDAwMAorI2RlZmluZSAgU0dfRElHX0VOMTBCCQkJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIFNHX0RJR19DTEVBUl9TVEFUVVMJCSAweDAwNDAwMDAwCisjZGVmaW5lICBTR19ESUdfTE9DQUxfRFVQTEVYX1NUQVRVUwkgMHgwMDIwMDAwMAorI2RlZmluZSAgU0dfRElHX0xPQ0FMX0xJTktfU1RBVFVTCSAweDAwMTAwMDAwCisjZGVmaW5lICBTR19ESUdfU1BFRURfU1RBVFVTX01BU0sJIDB4MDAwYzAwMDAKKyNkZWZpbmUgIFNHX0RJR19TUEVFRF9TVEFUVVNfU0hJRlQJIDE4CisjZGVmaW5lICBTR19ESUdfSlVNQk9fUEFDS0VUX0RJU0FCTEUJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFNHX0RJR19SRVNUQVJUX0FVVE9ORUcJCSAweDAwMDEwMDAwCisjZGVmaW5lICBTR19ESUdfRklCRVJfTU9ERQkJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIFNHX0RJR19SRU1PVEVfRkFVTFRfTUFTSwkgMHgwMDAwNjAwMAorI2RlZmluZSAgU0dfRElHX1BBVVNFX01BU0sJCSAweDAwMDAxODAwCisjZGVmaW5lICBTR19ESUdfR0JJQ19FTkFCTEUJCSAweDAwMDAwNDAwCisjZGVmaW5lICBTR19ESUdfQ0hFQ0tfRU5EX0VOQUJMRQkgMHgwMDAwMDIwMAorI2RlZmluZSAgU0dfRElHX1NHTUlJX0FVVE9ORUdfVElNRVIJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFNHX0RJR19DTE9DS19QSEFTRV9TRUxFQ1QJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFNHX0RJR19HTUlJX0lOUFVUX1NFTEVDVAkgMHgwMDAwMDA0MAorI2RlZmluZSAgU0dfRElHX01SQURWX0NSQzE2X1NFTEVDVAkgMHgwMDAwMDAyMAorI2RlZmluZSAgU0dfRElHX0NPTU1BX0RFVEVDVF9FTkFCTEUJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFNHX0RJR19BVVRPTkVHX1RJTUVSX1JFRFVDRQkgMHgwMDAwMDAwOAorI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfTE9XX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU0dfRElHX1JFTU9URV9MT09QQkFDSwkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNHX0RJR19MT09QQkFDSwkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0dfRElHX1NUQVRVUwkJCTB4MDAwMDA1YjQKKyNkZWZpbmUgIFNHX0RJR19DUkMxNl9CVVNfTUFTSwkJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX0ZBVUxUX01BU0sJIDB4MDA2MDAwMDAgLyogSWYgIU1SQURWX0NSQzE2X1NFTEVDVCAqLworI2RlZmluZSAgU0dfRElHX1BBUlRORVJfQVNZTV9QQVVTRQkgMHgwMDEwMDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9QQVVTRV9DQVBBQkxFCSAweDAwMDgwMDAwIC8qIElmICFNUkFEVl9DUkMxNl9TRUxFQ1QgKi8KKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX0hBTEZfRFVQTEVYCSAweDAwMDQwMDAwIC8qIElmICFNUkFEVl9DUkMxNl9TRUxFQ1QgKi8KKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX0ZVTExfRFVQTEVYCSAweDAwMDIwMDAwIC8qIElmICFNUkFEVl9DUkMxNl9TRUxFQ1QgKi8KKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX05FWFRfUEFHRQkgMHgwMDAxMDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfQVVUT05FR19TVEFURV9NQVNLCSAweDAwMDAwZmYwCisjZGVmaW5lICBTR19ESUdfQ09NTUFfREVURUNUT1IJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTR19ESUdfTUFDX0FDS19TVEFUVVMJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTR19ESUdfQVVUT05FR19DT01QTEVURQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfRVJST1IJCSAweDAwMDAwMDAxCisvKiAweDViOCAtLT4gMHg2MDAgdW51c2VkICovCisjZGVmaW5lIE1BQ19UWF9NQUNfU1RBVEVfQkFTRQkJMHgwMDAwMDYwMCAvKiAxNiBieXRlcyAqLworI2RlZmluZSBNQUNfUlhfTUFDX1NUQVRFX0JBU0UJCTB4MDAwMDA2MTAgLyogMjAgYnl0ZXMgKi8KKy8qIDB4NjI0IC0tPiAweDgwMCB1bnVzZWQgKi8KKyNkZWZpbmUgTUFDX1RYX1NUQVRTX09DVEVUUwkJMHgwMDAwMDgwMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjEJCTB4MDAwMDA4MDQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0NPTExJU0lPTlMJCTB4MDAwMDA4MDgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1hPTl9TRU5UCQkweDAwMDAwODBjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19YT0ZGX1NFTlQJCTB4MDAwMDA4MTAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YyCQkweDAwMDAwODE0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19NQUNfRVJST1JTCQkweDAwMDAwODE4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19TSU5HTEVfQ09MTElTSU9OUwkweDAwMDAwODFjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19NVUxUX0NPTExJU0lPTlMJMHgwMDAwMDgyMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfREVGRVJSRUQJCTB4MDAwMDA4MjQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YzCQkweDAwMDAwODI4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19FWENFU1NJVkVfQ09MCTB4MDAwMDA4MmMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0xBVEVfQ09MCQkweDAwMDAwODMwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xCQkweDAwMDAwODM0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8yCQkweDAwMDAwODM4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8zCQkweDAwMDAwODNjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF80CQkweDAwMDAwODQwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF81CQkweDAwMDAwODQ0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF82CQkweDAwMDAwODQ4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF83CQkweDAwMDAwODRjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF84CQkweDAwMDAwODUwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF85CQkweDAwMDAwODU0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMAkJMHgwMDAwMDg1OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTEJCTB4MDAwMDA4NWMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzEyCQkweDAwMDAwODYwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMwkJMHgwMDAwMDg2NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTQJCTB4MDAwMDA4NjgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1VDQVNUCQkweDAwMDAwODZjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19NQ0FTVAkJMHgwMDAwMDg3MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfQkNBU1QJCTB4MDAwMDA4NzQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y1XzEJCTB4MDAwMDA4NzgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y1XzIJCTB4MDAwMDA4N2MKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX09DVEVUUwkJMHgwMDAwMDg4MAorI2RlZmluZSBNQUNfUlhfU1RBVFNfUkVTVjEJCTB4MDAwMDA4ODQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZSQUdNRU5UUwkJMHgwMDAwMDg4OAorI2RlZmluZSBNQUNfUlhfU1RBVFNfVUNBU1QJCTB4MDAwMDA4OGMKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX01DQVNUCQkweDAwMDAwODkwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19CQ0FTVAkJMHgwMDAwMDg5NAorI2RlZmluZSBNQUNfUlhfU1RBVFNfRkNTX0VSUk9SUwkJMHgwMDAwMDg5OAorI2RlZmluZSBNQUNfUlhfU1RBVFNfQUxJR05fRVJST1JTCTB4MDAwMDA4OWMKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1hPTl9QQVVTRV9SRUNWRAkweDAwMDAwOGEwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT0ZGX1BBVVNFX1JFQ1ZECTB4MDAwMDA4YTQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX01BQ19DVFJMX1JFQ1ZECTB4MDAwMDA4YTgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1hPRkZfRU5URVJFRAkweDAwMDAwOGFjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19GUkFNRV9UT09fTE9ORwkweDAwMDAwOGIwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19KQUJCRVJTCQkweDAwMDAwOGI0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19VTkRFUlNJWkUJCTB4MDAwMDA4YjgKKy8qIDB4OGJjIC0tPiAweGMwMCB1bnVzZWQgKi8KKworLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkREQVRBSV9NT0RFCQkJMHgwMDAwMGMwMAorI2RlZmluZSAgU05EREFUQUlfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EREFUQUlfTU9ERV9TVEFUX09GTE9XX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EREFUQUlfU1RBVFVTCQkJMHgwMDAwMGMwNAorI2RlZmluZSAgU05EREFUQUlfU1RBVFVTX1NUQVRfT0ZMT1cJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNDVFJMCQkweDAwMDAwYzA4CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9FTkFCTEUJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GQVNUVVBECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfQ0xFQVIJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GTFVTSAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0ZPUkNFX1pFUk8JIDB4MDAwMDAwMTAKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNFTkFCCQkweDAwMDAwYzBjCisjZGVmaW5lIFNORERBVEFJX1NUQVRTSU5DTUFTSwkJMHgwMDAwMGMxMAorLyogMHhjMTQgLS0+IDB4YzgwIHVudXNlZCAqLworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzAJCTB4MDAwMDBjODAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xCQkweDAwMDAwYzg0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMgkJMHgwMDAwMGM4OAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzMJCTB4MDAwMDBjOGMKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF80CQkweDAwMDAwYzkwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNQkJMHgwMDAwMGM5NAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzYJCTB4MDAwMDBjOTgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF83CQkweDAwMDAwYzljCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfOAkJMHgwMDAwMGNhMAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzkJCTB4MDAwMDBjYTQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMAkJMHgwMDAwMGNhOAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzExCQkweDAwMDAwY2FjCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTIJCTB4MDAwMDBjYjAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMwkJMHgwMDAwMGNiNAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzE0CQkweDAwMDAwY2I4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTUJCTB4MDAwMDBjYmMKKyNkZWZpbmUgU05EREFUQUlfRE1BX1JEUV9GVUxMX0NOVAkweDAwMDAwY2MwCisjZGVmaW5lIFNORERBVEFJX0RNQV9QUklPX1JEUV9GVUxMX0NOVAkweDAwMDAwY2M0CisjZGVmaW5lIFNORERBVEFJX1NEQ1FfRlVMTF9DTlQJCTB4MDAwMDBjYzgKKyNkZWZpbmUgU05EREFUQUlfTklDUk5HX1NTTkRfUElEWF9DTlQJMHgwMDAwMGNjYworI2RlZmluZSBTTkREQVRBSV9TVEFUU19VUERBVEVEX0NOVAkweDAwMDAwY2QwCisjZGVmaW5lIFNORERBVEFJX0lOVEVSUlVQVFNfQ05UCQkweDAwMDAwY2Q0CisjZGVmaW5lIFNORERBVEFJX0FWT0lEX0lOVEVSUlVQVFNfQ05UCTB4MDAwMDBjZDgKKyNkZWZpbmUgU05EREFUQUlfU05EX1RIUkVTSF9ISVRfQ05UCTB4MDAwMDBjZGMKKy8qIDB4Y2UwIC0tPiAweDEwMDAgdW51c2VkICovCisKKy8qIFNlbmQgZGF0YSBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNORERBVEFDX01PREUJCQkweDAwMDAxMDAwCisjZGVmaW5lICBTTkREQVRBQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisvKiAweDEwMDQgLS0+IDB4MTQwMCB1bnVzZWQgKi8KKworLyogU2VuZCBCRCByaW5nIHNlbGVjdG9yICovCisjZGVmaW5lIFNOREJEU19NT0RFCQkJMHgwMDAwMTQwMAorI2RlZmluZSAgU05EQkRTX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkRCRFNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkRCRFNfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRFNfU1RBVFVTCQkJMHgwMDAwMTQwNAorI2RlZmluZSAgU05EQkRTX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJEU19IV0RJQUcJCQkweDAwMDAxNDA4CisvKiAweDE0MGMgLS0+IDB4MTQ0MCAqLworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMAkJMHgwMDAwMTQ0MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMQkJMHgwMDAwMTQ0NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMgkJMHgwMDAwMTQ0OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMwkJMHgwMDAwMTQ0YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNAkJMHgwMDAwMTQ1MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNQkJMHgwMDAwMTQ1NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNgkJMHgwMDAwMTQ1OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNwkJMHgwMDAwMTQ1YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfOAkJMHgwMDAwMTQ2MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfOQkJMHgwMDAwMTQ2NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTAJCTB4MDAwMDE0NjgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzExCQkweDAwMDAxNDZjCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMgkJMHgwMDAwMTQ3MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTMJCTB4MDAwMDE0NzQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzE0CQkweDAwMDAxNDc4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xNQkJMHgwMDAwMTQ3YworLyogMHgxNDgwIC0tPiAweDE4MDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNOREJESV9NT0RFCQkJMHgwMDAwMTgwMAorI2RlZmluZSAgU05EQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkRCRElfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkRCRElfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRElfU1RBVFVTCQkJMHgwMDAwMTgwNAorI2RlZmluZSAgU05EQkRJX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8wCQkweDAwMDAxODA4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xCQkweDAwMDAxODBjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8yCQkweDAwMDAxODEwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8zCQkweDAwMDAxODE0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF80CQkweDAwMDAxODE4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF81CQkweDAwMDAxODFjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF82CQkweDAwMDAxODIwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF83CQkweDAwMDAxODI0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF84CQkweDAwMDAxODI4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF85CQkweDAwMDAxODJjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMAkJMHgwMDAwMTgzMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTEJCTB4MDAwMDE4MzQKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzEyCQkweDAwMDAxODM4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMwkJMHgwMDAwMTgzYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTQJCTB4MDAwMDE4NDAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzE1CQkweDAwMDAxODQ0CisvKiAweDE4NDggLS0+IDB4MWMwMCB1bnVzZWQgKi8KKworLyogU2VuZCBCRCBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNOREJEQ19NT0RFCQkJMHgwMDAwMWMwMAorI2RlZmluZSBTTkRCRENfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgU05EQkRDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBTTkRCRENfTU9ERV9BVFROX0VOQUJMRQkJIDB4MDAwMDAwMDQKKy8qIDB4MWMwNCAtLT4gMHgyMDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIGxpc3QgcGxhY2VtZW50IGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkxQQ19NT0RFCQkJMHgwMDAwMjAwMAorI2RlZmluZSAgUkNWTFBDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMUENfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZMUENfTU9ERV9DTEFTUzBfQVRUTl9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZMUENfTU9ERV9NQVBPT1JfQUFUVE5fRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWTFBDX01PREVfU1RBVF9PRkxPV19FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkxQQ19TVEFUVVMJCQkweDAwMDAyMDA0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX0NMQVNTMAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfTUFQT09SCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19TVEFUX09GTE9XCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkxQQ19MT0NLCQkJMHgwMDAwMjAwOAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfUkVRX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBSQ1ZMUENfTE9DS19SRVFfU0hJRlQJCSAwCisjZGVmaW5lICBSQ1ZMUENfTE9DS19HUkFOVF9NQVNLCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfR1JBTlRfU0hJRlQJIDE2CisjZGVmaW5lIFJDVkxQQ19OT05fRU1QVFlfQklUUwkJMHgwMDAwMjAwYworI2RlZmluZSAgUkNWTFBDX05PTl9FTVBUWV9CSVRTX01BU0sJIDB4MDAwMGZmZmYKKyNkZWZpbmUgUkNWTFBDX0NPTkZJRwkJCTB4MDAwMDIwMTAKKyNkZWZpbmUgUkNWTFBDX1NUQVRTQ1RSTAkJMHgwMDAwMjAxNAorI2RlZmluZSAgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0NUUkxfRkFTVFVQRAkgMHgwMDAwMDAwMgorI2RlZmluZSBSQ1ZMUENfU1RBVFNfRU5BQkxFCQkweDAwMDAyMDE4CisjZGVmaW5lICBSQ1ZMUENfU1RBVFNFTkFCX0xOR0JSU1RfUkZJWAkgMHgwMDQwMDAwMAorI2RlZmluZSBSQ1ZMUENfU1RBVFNfSU5DTUFTSwkJMHgwMDAwMjAxYworLyogMHgyMDIwIC0tPiAweDIxMDAgdW51c2VkICovCisjZGVmaW5lIFJDVkxQQ19TRUxMU1RfQkFTRQkJMHgwMDAwMjEwMCAvKiAxNiAxNi1ieXRlIGVudHJpZXMgKi8KKyNkZWZpbmUgIFNFTExTVF9UQUlMCQkJMHgwMDAwMDAwNAorI2RlZmluZSAgU0VMTFNUX0NPTlQJCQkweDAwMDAwMDA4CisjZGVmaW5lICBTRUxMU1RfVU5VU0VECQkJMHgwMDAwMDAwYworI2RlZmluZSBSQ1ZMUENfQ09TX0NOVExfQkFTRQkJMHgwMDAwMjIwMCAvKiAxNiA0LWJ5dGUgZW50cmllcyAqLworI2RlZmluZSBSQ1ZMUENfRFJPUF9GSUxURVJfQ05UCQkweDAwMDAyMjQwCisjZGVmaW5lIFJDVkxQQ19ETUFfV1FfRlVMTF9DTlQJCTB4MDAwMDIyNDQKKyNkZWZpbmUgUkNWTFBDX0RNQV9ISVBSSU9fV1FfRlVMTF9DTlQJMHgwMDAwMjI0OAorI2RlZmluZSBSQ1ZMUENfTk9fUkNWX0JEX0NOVAkJMHgwMDAwMjI0YworI2RlZmluZSBSQ1ZMUENfSU5fRElTQ0FSRFNfQ05UCQkweDAwMDAyMjUwCisjZGVmaW5lIFJDVkxQQ19JTl9FUlJPUlNfQ05UCQkweDAwMDAyMjU0CisjZGVmaW5lIFJDVkxQQ19SQ1ZfVEhSRVNIX0hJVF9DTlQJMHgwMDAwMjI1OAorLyogMHgyMjVjIC0tPiAweDI0MDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbCAqLworI2RlZmluZSBSQ1ZEQkRJX01PREUJCQkweDAwMDAyNDAwCisjZGVmaW5lICBSQ1ZEQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZEQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWREJESV9NT0RFX0pVTUJPQkRfTkVFREVECSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZEQkRJX01PREVfRlJNX1RPT19CSUcJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9JTlZfUklOR19TWgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZEQkRJX1NUQVRVUwkJCTB4MDAwMDI0MDQKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0pVTUJPQkRfTkVFREVECSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19GUk1fVE9PX0JJRwkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfSU5WX1JJTkdfU1oJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWREJESV9TUExJVF9GUkFNRV9NSU5TWgkweDAwMDAyNDA4CisvKiAweDI0MGMgLS0+IDB4MjQ0MCB1bnVzZWQgKi8KKyNkZWZpbmUgUkNWREJESV9KVU1CT19CRAkJMHgwMDAwMjQ0MCAvKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBSQ1ZEQkRJX1NURF9CRAkJCTB4MDAwMDI0NTAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9NSU5JX0JECQkJMHgwMDAwMjQ2MCAvKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBSQ1ZEQkRJX0pVTUJPX0NPTl9JRFgJCTB4MDAwMDI0NzAKKyNkZWZpbmUgUkNWREJESV9TVERfQ09OX0lEWAkJMHgwMDAwMjQ3NAorI2RlZmluZSBSQ1ZEQkRJX01JTklfQ09OX0lEWAkJMHgwMDAwMjQ3OAorLyogMHgyNDdjIC0tPiAweDI0ODAgdW51c2VkICovCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMAkJMHgwMDAwMjQ4MAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEJCTB4MDAwMDI0ODQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8yCQkweDAwMDAyNDg4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMwkJMHgwMDAwMjQ4YworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzQJCTB4MDAwMDI0OTAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF81CQkweDAwMDAyNDk0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNgkJMHgwMDAwMjQ5OAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzcJCTB4MDAwMDI0OWMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF84CQkweDAwMDAyNGEwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfOQkJMHgwMDAwMjRhNAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEwCQkweDAwMDAyNGE4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTEJCTB4MDAwMDI0YWMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMgkJMHgwMDAwMjRiMAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEzCQkweDAwMDAyNGI0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTQJCTB4MDAwMDI0YjgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xNQkJMHgwMDAwMjRiYworI2RlZmluZSBSQ1ZEQkRJX0hXRElBRwkJCTB4MDAwMDI0YzAKKy8qIDB4MjRjNCAtLT4gMHgyODAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIERhdGEgQ29tcGxldGlvbiBDb250cm9sICovCisjZGVmaW5lIFJDVkRDQ19NT0RFCQkJMHgwMDAwMjgwMAorI2RlZmluZSAgUkNWRENDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZEQ0NfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZEQ0NfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorLyogMHgyODA0IC0tPiAweDJjMDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkJESV9NT0RFCQkJMHgwMDAwMmMwMAorI2RlZmluZSAgUkNWQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZCRElfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZCRElfTU9ERV9SQ0JfQVRUTl9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkJESV9TVEFUVVMJCQkweDAwMDAyYzA0CisjZGVmaW5lICBSQ1ZCRElfU1RBVFVTX1JDQl9BVFROCQkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZCRElfSlVNQk9fUFJPRF9JRFgJCTB4MDAwMDJjMDgKKyNkZWZpbmUgUkNWQkRJX1NURF9QUk9EX0lEWAkJMHgwMDAwMmMwYworI2RlZmluZSBSQ1ZCRElfTUlOSV9QUk9EX0lEWAkJMHgwMDAwMmMxMAorI2RlZmluZSBSQ1ZCRElfTUlOSV9USFJFU0gJCTB4MDAwMDJjMTQKKyNkZWZpbmUgUkNWQkRJX1NURF9USFJFU0gJCTB4MDAwMDJjMTgKKyNkZWZpbmUgUkNWQkRJX0pVTUJPX1RIUkVTSAkJMHgwMDAwMmMxYworLyogMHgyYzIwIC0tPiAweDMwMDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZDQ19NT0RFCQkJMHgwMDAwMzAwMAorI2RlZmluZSAgUkNWQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkNDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQ0NfU1RBVFVTCQkJMHgwMDAwMzAwNAorI2RlZmluZSAgUkNWQ0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQ0NfSlVNUF9QUk9EX0lEWAkJMHgwMDAwMzAwOAorI2RlZmluZSBSQ1ZDQ19TVERfUFJPRF9JRFgJCTB4MDAwMDMwMGMKKyNkZWZpbmUgUkNWQ0NfTUlOSV9QUk9EX0lEWAkJMHgwMDAwMzAxMAorLyogMHgzMDE0IC0tPiAweDM0MDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgbGlzdCBzZWxlY3RvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZMU0NfTU9ERQkJCTB4MDAwMDM0MDAKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFNDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWTFNDX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWTFNDX1NUQVRVUwkJCTB4MDAwMDM0MDQKKyNkZWZpbmUgIFJDVkxTQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorLyogMHgzNDA4IC0tPiAweDM4MDAgdW51c2VkICovCisKKy8qIE1idWYgY2x1c3RlciBmcmVlIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQkZSRUVfTU9ERQkJCTB4MDAwMDM4MDAKKyNkZWZpbmUgIE1CRlJFRV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUJGUkVFX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBNQkZSRUVfU1RBVFVTCQkJMHgwMDAwMzgwNAorLyogMHgzODA4IC0tPiAweDNjMDAgdW51c2VkICovCisKKy8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBIT1NUQ0NfTU9ERQkJCTB4MDAwMDNjMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgSE9TVENDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgSE9TVENDX01PREVfQVRUTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PVwkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0ZVTExfU1RBVFVTCSAweDAwMDAwMDAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV82NEJZVEUJCSAweDAwMDAwMDgwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV8zMkJZVEUJCSAweDAwMDAwMTAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9DTFJUSUNLX1JYQkQJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0NMUlRJQ0tfVFhCRAkgMHgwMDAwMDQwMAorI2RlZmluZSAgSE9TVENDX01PREVfTk9JTlRfT05fTk9XCSAweDAwMDAwODAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT0lOVF9PTl9GT1JDRQkgMHgwMDAwMTAwMAorI2RlZmluZSBIT1NUQ0NfU1RBVFVTCQkJMHgwMDAwM2MwNAorI2RlZmluZSAgSE9TVENDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIEhPU1RDQ19SWENPTF9USUNLUwkJMHgwMDAwM2MwOAorI2RlZmluZSAgTE9XX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDAzMgorI2RlZmluZSAgREVGQVVMVF9SWENPTF9USUNLUwkJIDB4MDAwMDAwNDgKKyNkZWZpbmUgIEhJR0hfUlhDT0xfVElDS1MJCSAweDAwMDAwMDk2CisjZGVmaW5lIEhPU1RDQ19UWENPTF9USUNLUwkJMHgwMDAwM2MwYworI2RlZmluZSAgTE9XX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgorI2RlZmluZSAgREVGQVVMVF9UWENPTF9USUNLUwkJIDB4MDAwMDAxMmMKKyNkZWZpbmUgIEhJR0hfVFhDT0xfVElDS1MJCSAweDAwMDAwMTQ1CisjZGVmaW5lIEhPU1RDQ19SWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTAKKyNkZWZpbmUgIExPV19SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA1CisjZGVmaW5lICBERUZBVUxUX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEhJR0hfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAxMgorI2RlZmluZSBIT1NUQ0NfVFhNQVhfRlJBTUVTCQkweDAwMDAzYzE0CisjZGVmaW5lICBMT1dfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDAzNQorI2RlZmluZSAgREVGQVVMVF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDRiCisjZGVmaW5lICBISUdIX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwNTIKKyNkZWZpbmUgSE9TVENDX1JYQ09BTF9USUNLX0lOVAkJMHgwMDAwM2MxOAorI2RlZmluZSAgREVGQVVMVF9SWENPQUxfVElDS19JTlQJIDB4MDAwMDAwMTkKKyNkZWZpbmUgSE9TVENDX1RYQ09BTF9USUNLX0lOVAkJMHgwMDAwM2MxYworI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlQJIDB4MDAwMDAwMTkKKyNkZWZpbmUgSE9TVENDX1JYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyMAorI2RlZmluZSAgREVGQVVMVF9SWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgSE9TVENDX1RYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyNAorI2RlZmluZSAgREVGQVVMVF9UWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgSE9TVENDX1NUQVRfQ09BTF9USUNLUwkJMHgwMDAwM2MyOAorI2RlZmluZSAgREVGQVVMVF9TVEFUX0NPQUxfVElDS1MJIDB4MDAwZjQyNDAKKy8qIDB4M2MyYyAtLT4gMHgzYzMwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRTX0JMS19OSUNfQUREUgkweDAwMDAzYzQwCisjZGVmaW5lIEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSCTB4MDAwMDNjNDQKKyNkZWZpbmUgSE9TVENDX0ZMT1dfQVRUTgkJMHgwMDAwM2M0OAorLyogMHgzYzRjIC0tPiAweDNjNTAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19KVU1CT19DT05fSURYCQkweDAwMDAzYzUwCisjZGVmaW5lIEhPU1RDQ19TVERfQ09OX0lEWAkJMHgwMDAwM2M1NAorI2RlZmluZSBIT1NUQ0NfTUlOSV9DT05fSURYCQkweDAwMDAzYzU4CisvKiAweDNjNWMgLS0+IDB4M2M4MCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8wCQkweDAwMDAzYzgwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMQkJMHgwMDAwM2M4NAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzIJCTB4MDAwMDNjODgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8zCQkweDAwMDAzYzhjCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNAkJMHgwMDAwM2M5MAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzUJCTB4MDAwMDNjOTQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF82CQkweDAwMDAzYzk4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNwkJMHgwMDAwM2M5YworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzgJCTB4MDAwMDNjYTAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF85CQkweDAwMDAzY2E0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTAJCTB4MDAwMDNjYTgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMQkJMHgwMDAwM2NhYworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEyCQkweDAwMDAzY2IwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTMJCTB4MDAwMDNjYjQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xNAkJMHgwMDAwM2NiOAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzE1CQkweDAwMDAzY2JjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8wCQkweDAwMDAzY2MwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xCQkweDAwMDAzY2M0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8yCQkweDAwMDAzY2M4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8zCQkweDAwMDAzY2NjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF80CQkweDAwMDAzY2QwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF81CQkweDAwMDAzY2Q0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF82CQkweDAwMDAzY2Q4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF83CQkweDAwMDAzY2RjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF84CQkweDAwMDAzY2UwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF85CQkweDAwMDAzY2U0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMAkJMHgwMDAwM2NlOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTEJCTB4MDAwMDNjZWMKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzEyCQkweDAwMDAzY2YwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMwkJMHgwMDAwM2NmNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTQJCTB4MDAwMDNjZjgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzE1CQkweDAwMDAzY2ZjCisvKiAweDNkMDAgLS0+IDB4NDAwMCB1bnVzZWQgKi8KKworLyogTWVtb3J5IGFyYml0ZXIgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUVNQVJCX01PREUJCQkweDAwMDA0MDAwCisjZGVmaW5lICBNRU1BUkJfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1FTUFSQl9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTUVNQVJCX1NUQVRVUwkJCTB4MDAwMDQwMDQKKyNkZWZpbmUgTUVNQVJCX1RSQVBfQUREUl9MT1cJCTB4MDAwMDQwMDgKKyNkZWZpbmUgTUVNQVJCX1RSQVBfQUREUl9ISUdICQkweDAwMDA0MDBjCisvKiAweDQwMTAgLS0+IDB4NDQwMCB1bnVzZWQgKi8KKworLyogQnVmZmVyIG1hbmFnZXIgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQlVGTUdSX01PREUJCQkweDAwMDA0NDAwCisjZGVmaW5lICBCVUZNR1JfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lICBCVUZNR1JfTU9ERV9CTV9URVNUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgQlVGTUdSX01PREVfTUJMT1dfQVRUTl9FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lIEJVRk1HUl9TVEFUVVMJCQkweDAwMDA0NDA0CisjZGVmaW5lICBCVUZNR1JfU1RBVFVTX0VSUk9SCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgQlVGTUdSX1NUQVRVU19NQkxPVwkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgQlVGTUdSX01CX1BPT0xfQUREUgkJMHgwMDAwNDQwOAorI2RlZmluZSBCVUZNR1JfTUJfUE9PTF9TSVpFCQkweDAwMDA0NDBjCisjZGVmaW5lIEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUgkweDAwMDA0NDEwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSCSAweDAwMDAwMDUwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSXzU3MDUJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfSlVNQk8gMHgwMDAwMDEzMAorI2RlZmluZSBCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSCTB4MDAwMDQ0MTQKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSCSAgMHgwMDAwMDAyMAorI2RlZmluZSAgREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfNTcwNSAgMHgwMDAwMDAxMAorI2RlZmluZSAgREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfSlVNQk8gMHgwMDAwMDA5OAorI2RlZmluZSBCVUZNR1JfTUJfSElHSF9XQVRFUgkJMHgwMDAwNDQxOAorI2RlZmluZSAgREVGQVVMVF9NQl9ISUdIX1dBVEVSCQkgMHgwMDAwMDA2MAorI2RlZmluZSAgREVGQVVMVF9NQl9ISUdIX1dBVEVSXzU3MDUJIDB4MDAwMDAwNjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUl9KVU1CTwkgMHgwMDAwMDE3YworI2RlZmluZSBCVUZNR1JfUlhfTUJfQUxMT0NfUkVRCQkweDAwMDA0NDFjCisjZGVmaW5lICBCVUZNR1JfTUJfQUxMT0NfQklUCQkgMHgxMDAwMDAwMAorI2RlZmluZSBCVUZNR1JfUlhfTUJfQUxMT0NfUkVTUAkJMHgwMDAwNDQyMAorI2RlZmluZSBCVUZNR1JfVFhfTUJfQUxMT0NfUkVRCQkweDAwMDA0NDI0CisjZGVmaW5lIEJVRk1HUl9UWF9NQl9BTExPQ19SRVNQCQkweDAwMDA0NDI4CisjZGVmaW5lIEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIJMHgwMDAwNDQyYworI2RlZmluZSBCVUZNR1JfRE1BX0RFU0NfUE9PTF9TSVpFCTB4MDAwMDQ0MzAKKyNkZWZpbmUgQlVGTUdSX0RNQV9MT1dfV0FURVIJCTB4MDAwMDQ0MzQKKyNkZWZpbmUgIERFRkFVTFRfRE1BX0xPV19XQVRFUgkJIDB4MDAwMDAwMDUKKyNkZWZpbmUgQlVGTUdSX0RNQV9ISUdIX1dBVEVSCQkweDAwMDA0NDM4CisjZGVmaW5lICBERUZBVUxUX0RNQV9ISUdIX1dBVEVSCQkgMHgwMDAwMDAwYQorI2RlZmluZSBCVUZNR1JfUlhfRE1BX0FMTE9DX1JFUQkJMHgwMDAwNDQzYworI2RlZmluZSBCVUZNR1JfUlhfRE1BX0FMTE9DX1JFU1AJMHgwMDAwNDQ0MAorI2RlZmluZSBCVUZNR1JfVFhfRE1BX0FMTE9DX1JFUQkJMHgwMDAwNDQ0NAorI2RlZmluZSBCVUZNR1JfVFhfRE1BX0FMTE9DX1JFU1AJMHgwMDAwNDQ0OAorI2RlZmluZSBCVUZNR1JfSFdESUFHXzAJCQkweDAwMDA0NDRjCisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMQkJCTB4MDAwMDQ0NTAKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18yCQkJMHgwMDAwNDQ1NAorLyogMHg0NDU4IC0tPiAweDQ4MDAgdW51c2VkICovCisKKy8qIFJlYWQgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJETUFDX01PREUJCQkweDAwMDA0ODAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkRNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJETUFDX01PREVfTVNUQUJPUlRfRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkRNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSAgUkRNQUNfTU9ERV9BRERST0ZMT1dfRU5BQgkgMHgwMDAwMDAyMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQgkgMHgwMDAwMDA0MAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPVVJVTl9FTkFCCSAweDAwMDAwMDgwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCCSAweDAwMDAwMTAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0xOR1JFQURfRU5BQgkgMHgwMDAwMDIwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9TUExJVF9FTkFCTEUJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFJETUFDX01PREVfU1BMSVRfUkVTRVQJCSAweDAwMDAxMDAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9fU0laRV8xMjgJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT19MT05HX0JVUlNUCSAweDAwMDMwMDAwCisjZGVmaW5lIFJETUFDX1NUQVRVUwkJCTB4MDAwMDQ4MDQKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19UR1RBQk9SVAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19NU1RBQk9SVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19QQVJJVFlFUlIJCSAweDAwMDAwMDEwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfQUREUk9GTE9XCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0ZJRk9PRkxPVwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPVVJVTgkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPT1JFQUQJCSAweDAwMDAwMTAwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfTE5HUkVBRAkJIDB4MDAwMDAyMDAKKy8qIDB4NDgwOCAtLT4gMHg0YzAwIHVudXNlZCAqLworCisvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0RNQUNfTU9ERQkJCTB4MDAwMDRjMDAKKyNkZWZpbmUgIFdETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBXRE1BQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFdETUFDX01PREVfVEdUQUJPUlRfRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgV0RNQUNfTU9ERV9NU1RBQk9SVF9FTkFCCSAweDAwMDAwMDA4CisjZGVmaW5lICBXRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lICBXRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCCSAweDAwMDAwMDIwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCCSAweDAwMDAwMDQwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFdETUFDX01PREVfRklGT09SRUFEX0VOQUIJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFdETUFDX01PREVfTE5HUkVBRF9FTkFCCSAweDAwMDAwMjAwCisjZGVmaW5lICBXRE1BQ19NT0RFX1JYX0FDQ0VMCSAJIDB4MDAwMDA0MDAKKyNkZWZpbmUgV0RNQUNfU1RBVFVTCQkJMHgwMDAwNGMwNAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX1RHVEFCT1JUCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX01TVEFCT1JUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX1BBUklUWUVSUgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19BRERST0ZMT1cJCSAweDAwMDAwMDIwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfRklGT09GTE9XCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9VUlVOCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9PUkVBRAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19MTkdSRUFECQkgMHgwMDAwMDIwMAorLyogMHg0YzA4IC0tPiAweDUwMDAgdW51c2VkICovCisKKy8qIFBlci1jcHUgcmVnaXN0ZXIgb2Zmc2V0cyAoYXJtOSkgKi8KKyNkZWZpbmUgQ1BVX01PREUJCQkweDAwMDAwMDAwCisjZGVmaW5lICBDUFVfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBDUFVfTU9ERV9IQUxUCQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgQ1BVX1NUQVRFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUFVfRVZUTUFTSwkJCTB4MDAwMDAwMDgKKy8qIDB4YyAtLT4gMHgxYyByZXNlcnZlZCAqLworI2RlZmluZSBDUFVfUEMJCQkJMHgwMDAwMDAxYworI2RlZmluZSBDUFVfSU5TTgkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ1BVX1NQQURfVUZMT1cJCQkweDAwMDAwMDI0CisjZGVmaW5lIENQVV9XRE9HX0NMRUFSCQkJMHgwMDAwMDAyOAorI2RlZmluZSBDUFVfV0RPR19WRUNUT1IJCQkweDAwMDAwMDJjCisjZGVmaW5lIENQVV9XRE9HX1BDCQkJMHgwMDAwMDAzMAorI2RlZmluZSBDUFVfSFdfQlAJCQkweDAwMDAwMDM0CisvKiAweDM4IC0tPiAweDQ0IHVudXNlZCAqLworI2RlZmluZSBDUFVfV0RPR19TQVZFRF9TVEFURQkJMHgwMDAwMDA0NAorI2RlZmluZSBDUFVfTEFTVF9CUkFOQ0hfQUREUgkJMHgwMDAwMDA0OAorI2RlZmluZSBDUFVfU1BBRF9VRkxPV19TRVQJCTB4MDAwMDAwNGMKKy8qIDB4NTAgLS0+IDB4MjAwIHVudXNlZCAqLworI2RlZmluZSBDUFVfUjAJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBDUFVfUjEJCQkJMHgwMDAwMDIwNAorI2RlZmluZSBDUFVfUjIJCQkJMHgwMDAwMDIwOAorI2RlZmluZSBDUFVfUjMJCQkJMHgwMDAwMDIwYworI2RlZmluZSBDUFVfUjQJCQkJMHgwMDAwMDIxMAorI2RlZmluZSBDUFVfUjUJCQkJMHgwMDAwMDIxNAorI2RlZmluZSBDUFVfUjYJCQkJMHgwMDAwMDIxOAorI2RlZmluZSBDUFVfUjcJCQkJMHgwMDAwMDIxYworI2RlZmluZSBDUFVfUjgJCQkJMHgwMDAwMDIyMAorI2RlZmluZSBDUFVfUjkJCQkJMHgwMDAwMDIyNAorI2RlZmluZSBDUFVfUjEwCQkJCTB4MDAwMDAyMjgKKyNkZWZpbmUgQ1BVX1IxMQkJCQkweDAwMDAwMjJjCisjZGVmaW5lIENQVV9SMTIJCQkJMHgwMDAwMDIzMAorI2RlZmluZSBDUFVfUjEzCQkJCTB4MDAwMDAyMzQKKyNkZWZpbmUgQ1BVX1IxNAkJCQkweDAwMDAwMjM4CisjZGVmaW5lIENQVV9SMTUJCQkJMHgwMDAwMDIzYworI2RlZmluZSBDUFVfUjE2CQkJCTB4MDAwMDAyNDAKKyNkZWZpbmUgQ1BVX1IxNwkJCQkweDAwMDAwMjQ0CisjZGVmaW5lIENQVV9SMTgJCQkJMHgwMDAwMDI0OAorI2RlZmluZSBDUFVfUjE5CQkJCTB4MDAwMDAyNGMKKyNkZWZpbmUgQ1BVX1IyMAkJCQkweDAwMDAwMjUwCisjZGVmaW5lIENQVV9SMjEJCQkJMHgwMDAwMDI1NAorI2RlZmluZSBDUFVfUjIyCQkJCTB4MDAwMDAyNTgKKyNkZWZpbmUgQ1BVX1IyMwkJCQkweDAwMDAwMjVjCisjZGVmaW5lIENQVV9SMjQJCQkJMHgwMDAwMDI2MAorI2RlZmluZSBDUFVfUjI1CQkJCTB4MDAwMDAyNjQKKyNkZWZpbmUgQ1BVX1IyNgkJCQkweDAwMDAwMjY4CisjZGVmaW5lIENQVV9SMjcJCQkJMHgwMDAwMDI2YworI2RlZmluZSBDUFVfUjI4CQkJCTB4MDAwMDAyNzAKKyNkZWZpbmUgQ1BVX1IyOQkJCQkweDAwMDAwMjc0CisjZGVmaW5lIENQVV9SMzAJCQkJMHgwMDAwMDI3OAorI2RlZmluZSBDUFVfUjMxCQkJCTB4MDAwMDAyN2MKKy8qIDB4MjgwIC0tPiAweDQwMCB1bnVzZWQgKi8KKworI2RlZmluZSBSWF9DUFVfQkFTRQkJCTB4MDAwMDUwMDAKKyNkZWZpbmUgVFhfQ1BVX0JBU0UJCQkweDAwMDA1NDAwCisKKy8qIE1haWxib3hlcyAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8wCQkweDAwMDA1ODAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8xCQkweDAwMDA1ODA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8yCQkweDAwMDA1ODEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8zCQkweDAwMDA1ODE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMAkJMHgwMDAwNTgyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzEJCTB4MDAwMDU4MjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8yCQkweDAwMDA1ODMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMwkJMHgwMDAwNTgzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzQJCTB4MDAwMDU4NDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF81CQkweDAwMDA1ODQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNgkJMHgwMDAwNTg1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzcJCTB4MDAwMDU4NTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkVMT0FEX1NUQVQJCTB4MDAwMDU4NjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWU1REX1BST0RfSURYCQkweDAwMDA1ODY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVkpVTUJPX1BST0RfSURYCTB4MDAwMDU4NzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWTUlOSV9QUk9EX0lEWAkweDAwMDA1ODc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzAJMHgwMDAwNTg4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xCTB4MDAwMDU4ODggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMgkweDAwMDA1ODkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzMJMHgwMDAwNTg5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF80CTB4MDAwMDU4YTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNQkweDAwMDA1OGE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzYJMHgwMDAwNThiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF83CTB4MDAwMDU4YjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfOAkweDAwMDA1OGMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzkJMHgwMDAwNThjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMAkweDAwMDA1OGQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzExCTB4MDAwMDU4ZDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTIJMHgwMDAwNThlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMwkweDAwMDA1OGU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzE0CTB4MDAwMDU4ZjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTUJMHgwMDAwNThmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzAJMHgwMDAwNTkwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEJMHgwMDAwNTkwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzIJMHgwMDAwNTkxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzMJMHgwMDAwNTkxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzQJMHgwMDAwNTkyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzUJMHgwMDAwNTkyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzYJMHgwMDAwNTkzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzcJMHgwMDAwNTkzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzgJMHgwMDAwNTk0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzkJMHgwMDAwNTk0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEwCTB4MDAwMDU5NTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMQkweDAwMDA1OTU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTIJMHgwMDAwNTk2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEzCTB4MDAwMDU5NjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xNAkweDAwMDA1OTcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTUJMHgwMDAwNTk3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMAkweDAwMDA1OTgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xCTB4MDAwMDU5ODggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzIJMHgwMDAwNTk5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMwkweDAwMDA1OTk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF80CTB4MDAwMDU5YTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzUJMHgwMDAwNTlhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNgkweDAwMDA1OWIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF83CTB4MDAwMDU5YjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzgJMHgwMDAwNTljMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfOQkweDAwMDA1OWM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMAkweDAwMDA1OWQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMQkweDAwMDA1OWQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMgkweDAwMDA1OWUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMwkweDAwMDA1OWU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xNAkweDAwMDA1OWYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xNQkweDAwMDA1OWY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0hJR0hfUFJJT19FVl9WRUNUT1IJMHgwMDAwNWEwMAorI2RlZmluZSBHUkNNQk9YX0hJR0hfUFJJT19FVl9NQVNLCTB4MDAwMDVhMDQKKyNkZWZpbmUgR1JDTUJPWF9MT1dfUFJJT19FVl9WRUMJCTB4MDAwMDVhMDgKKyNkZWZpbmUgR1JDTUJPWF9MT1dfUFJJT19FVl9NQVNLCTB4MDAwMDVhMGMKKy8qIDB4NWExMCAtLT4gMHg1YzAwICovCisKKy8qIEZsb3cgVGhyb3VnaCBxdWV1ZXMgKi8KKyNkZWZpbmUgRlRRX1JFU0VUCQkJMHgwMDAwNWMwMAorLyogMHg1YzA0IC0tPiAweDVjMTAgdW51c2VkICovCisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX0NUTAkJMHgwMDAwNWMxMAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9GVUxMX0NOVAkweDAwMDA1YzE0CisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX0ZJRk9fRU5RREVRCTB4MDAwMDVjMTgKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfV1JJVEVfUEVFSwkweDAwMDA1YzFjCisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX0NUTAkJMHgwMDAwNWMyMAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9GVUxMX0NOVAkweDAwMDA1YzI0CisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX0ZJRk9fRU5RREVRCTB4MDAwMDVjMjgKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfV1JJVEVfUEVFSwkweDAwMDA1YzJjCisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX0NUTAkJMHgwMDAwNWMzMAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19GVUxMX0NOVAkweDAwMDA1YzM0CisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX0ZJRk9fRU5RREVRCTB4MDAwMDVjMzgKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfV1JJVEVfUEVFSwkweDAwMDA1YzNjCisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfQ1RMCQkweDAwMDA1YzQwCisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWM0NAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjNDgKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjNGMKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0NUTAkJMHgwMDAwNWM1MAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfRlVMTF9DTlQJMHgwMDAwNWM1NAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfRklGT19FTlFERVEJMHgwMDAwNWM1OAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfV1JJVEVfUEVFSwkweDAwMDA1YzVjCisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9DVEwJCTB4MDAwMDVjNjAKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX0ZVTExfQ05UCTB4MDAwMDVjNjQKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX0ZJRk9fRU5RREVRCTB4MDAwMDVjNjgKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX1dSSVRFX1BFRUsJMHgwMDAwNWM2YworI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfQ1RMCQkweDAwMDA1YzcwCisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9GVUxMX0NOVAkweDAwMDA1Yzc0CisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9GSUZPX0VOUURFUQkweDAwMDA1Yzc4CisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9XUklURV9QRUVLCTB4MDAwMDVjN2MKKyNkZWZpbmUgRlRRX1NXVFlQRTFfQ1RMCQkJMHgwMDAwNWM4MAorI2RlZmluZSBGVFFfU1dUWVBFMV9GVUxMX0NOVAkJMHgwMDAwNWM4NAorI2RlZmluZSBGVFFfU1dUWVBFMV9GSUZPX0VOUURFUQkJMHgwMDAwNWM4OAorI2RlZmluZSBGVFFfU1dUWVBFMV9XUklURV9QRUVLCQkweDAwMDA1YzhjCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9DVEwJCTB4MDAwMDVjOTAKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX0ZVTExfQ05UCTB4MDAwMDVjOTQKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjOTgKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWM5YworI2RlZmluZSBGVFFfSE9TVF9DT0FMX0NUTAkJMHgwMDAwNWNhMAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX0ZVTExfQ05UCQkweDAwMDA1Y2E0CisjZGVmaW5lIEZUUV9IT1NUX0NPQUxfRklGT19FTlFERVEJMHgwMDAwNWNhOAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX1dSSVRFX1BFRUsJMHgwMDAwNWNhYworI2RlZmluZSBGVFFfTUFDX1RYX0NUTAkJCTB4MDAwMDVjYjAKKyNkZWZpbmUgRlRRX01BQ19UWF9GVUxMX0NOVAkJMHgwMDAwNWNiNAorI2RlZmluZSBGVFFfTUFDX1RYX0ZJRk9fRU5RREVRCQkweDAwMDA1Y2I4CisjZGVmaW5lIEZUUV9NQUNfVFhfV1JJVEVfUEVFSwkJMHgwMDAwNWNiYworI2RlZmluZSBGVFFfTUJfRlJFRV9DVEwJCQkweDAwMDA1Y2MwCisjZGVmaW5lIEZUUV9NQl9GUkVFX0ZVTExfQ05UCQkweDAwMDA1Y2M0CisjZGVmaW5lIEZUUV9NQl9GUkVFX0ZJRk9fRU5RREVRCQkweDAwMDA1Y2M4CisjZGVmaW5lIEZUUV9NQl9GUkVFX1dSSVRFX1BFRUsJCTB4MDAwMDVjY2MKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfQ1RMCQkweDAwMDA1Y2QwCisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0ZVTExfQ05UCQkweDAwMDA1Y2Q0CisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjZDgKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1Y2RjCisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9DVEwJCTB4MDAwMDVjZTAKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX0ZVTExfQ05UCTB4MDAwMDVjZTQKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX0ZJRk9fRU5RREVRCTB4MDAwMDVjZTgKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX1dSSVRFX1BFRUsJMHgwMDAwNWNlYworI2RlZmluZSBGVFFfUkNWREFUQV9JTklfQ1RMCQkweDAwMDA1Y2YwCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9GVUxMX0NOVAkweDAwMDA1Y2Y0CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9GSUZPX0VOUURFUQkweDAwMDA1Y2Y4CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9XUklURV9QRUVLCTB4MDAwMDVjZmMKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9DVEwJCTB4MDAwMDVkMDAKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9GVUxMX0NOVAkweDAwMDA1ZDA0CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfRklGT19FTlFERVEJMHgwMDAwNWQwOAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWQwYworI2RlZmluZSBGVFFfU1dUWVBFMl9DVEwJCQkweDAwMDA1ZDEwCisjZGVmaW5lIEZUUV9TV1RZUEUyX0ZVTExfQ05UCQkweDAwMDA1ZDE0CisjZGVmaW5lIEZUUV9TV1RZUEUyX0ZJRk9fRU5RREVRCQkweDAwMDA1ZDE4CisjZGVmaW5lIEZUUV9TV1RZUEUyX1dSSVRFX1BFRUsJCTB4MDAwMDVkMWMKKy8qIDB4NWQyMCAtLT4gMHg2MDAwIHVudXNlZCAqLworCisvKiBNZXNzYWdlIHNpZ25hbGVkIGludGVycnVwdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVNHSU5UX01PREUJCQkweDAwMDA2MDAwCisjZGVmaW5lICBNU0dJTlRfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1TR0lOVF9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTVNHSU5UX1NUQVRVUwkJCTB4MDAwMDYwMDQKKyNkZWZpbmUgTVNHSU5UX0ZJRk8JCQkweDAwMDA2MDA4CisvKiAweDYwMGMgLS0+IDB4NjQwMCB1bnVzZWQgKi8KKworLyogRE1BIGNvbXBsZXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIERNQUNfTU9ERQkJCTB4MDAwMDY0MDAKKyNkZWZpbmUgIERNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIERNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisvKiAweDY0MDQgLS0+IDB4NjgwMCB1bnVzZWQgKi8KKworLyogR1JDIHJlZ2lzdGVycyAqLworI2RlZmluZSBHUkNfTU9ERQkJCTB4MDAwMDY4MDAKKyNkZWZpbmUgIEdSQ19NT0RFX1VQRF9PTl9DT0FMCQkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTU9ERV9CU1dBUF9OT05GUk1fREFUQQkweDAwMDAwMDAyCisjZGVmaW5lICBHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQQkweDAwMDAwMDA0CisjZGVmaW5lICBHUkNfTU9ERV9CU1dBUF9EQVRBCQkweDAwMDAwMDEwCisjZGVmaW5lICBHUkNfTU9ERV9XU1dBUF9EQVRBCQkweDAwMDAwMDIwCisjZGVmaW5lICBHUkNfTU9ERV9TUExJVEhEUgkJMHgwMDAwMDEwMAorI2RlZmluZSAgR1JDX01PREVfTk9GUk1fQ1JBQ0tJTkcJMHgwMDAwMDIwMAorI2RlZmluZSAgR1JDX01PREVfSU5DTF9DUkMJCTB4MDAwMDA0MDAKKyNkZWZpbmUgIEdSQ19NT0RFX0FMTE9XX0JBRF9GUk1TCTB4MDAwMDA4MDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PSVJRX09OX1NFTkRTCTB4MDAwMDIwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PSVJRX09OX1JDVgkJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX01PREVfRk9SQ0VfUENJMzJCSVQJMHgwMDAwODAwMAorI2RlZmluZSAgR1JDX01PREVfSE9TVF9TVEFDS1VQCQkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9IT1NUX1NFTkRCRFMJCTB4MDAwMjAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTQkweDAwMTAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OVlJBTV9XUl9FTkFCTEUJMHgwMDIwMDAwMAorI2RlZmluZSAgR1JDX01PREVfTk9fUlhfUEhEUl9DU1VNCTB4MDA4MDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9UWF9DUFVfQVRUTgkweDAxMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fUlhfQ1BVX0FUVE4JMHgwMjAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX01BQ19BVFROCTB4MDQwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9ETUFfQVRUTgkweDA4MDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fRkxPV19BVFROCTB4MTAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTCTB4MjAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX01DQVNUX0ZSTV9FTkFCTEUJMHg0MDAwMDAwMAorI2RlZmluZSBHUkNfTUlTQ19DRkcJCQkweDAwMDA2ODA0CisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQ09SRUNMS19SRVNFVAkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfUFJFU0NBTEFSX01BU0sJMHgwMDAwMDBmZQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9TSElGVAkxCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfTUFTSwkweDAwMDFlMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMAkweDAwMDFlMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMQkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMkZFCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAzCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAzUwkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNAkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNENJT0JFIDB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0X0EyCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4CTB4MDAwMTAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4TQkweDAwMDE4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfQUM5MTAwMkExIDB4MDAwMTgwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVIJMHgwNDAwMDAwMAorI2RlZmluZSBHUkNfTE9DQUxfQ1RSTAkJCTB4MDAwMDY4MDgKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0lOVF9BQ1RJVkUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0NMRUFSSU5UCQkweDAwMDAwMDAyCisjZGVmaW5lICBHUkNfTENMQ1RSTF9TRVRJTlQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0lOVF9PTl9BVFROCTB4MDAwMDAwMDgKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQwCTB4MDAwMDAxMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQxCTB4MDAwMDAyMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQyCTB4MDAwMDA0MDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UwCQkweDAwMDAwODAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMQkJMHgwMDAwMTAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMAkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEJMHgwMDAwODAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyCTB4MDAwMTAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0VYVE1FTV9FTkFCTEUJMHgwMDAyMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfTUFTSwkJMHgwMDFjMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMjU2SwkJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfNTEySwkJMHgwMDA0MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMU0JCTB4MDAwODAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzJNCQkweDAwMGMwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl80TQkJMHgwMDEwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfOE0JCTB4MDAxNDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzE2TQkJMHgwMDE4MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfQkFOS19TRUxFQ1QJMHgwMDIwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfU1NSQU1fVFlQRQkJMHgwMDQwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfQVVUT19TRUVQUk9NCTB4MDEwMDAwMDAKKyNkZWZpbmUgR1JDX1RJTUVSCQkJMHgwMDAwNjgwYworI2RlZmluZSBHUkNfUlhfQ1BVX0VWRU5UCQkweDAwMDA2ODEwCisjZGVmaW5lIEdSQ19SWF9USU1FUl9SRUYJCTB4MDAwMDY4MTQKKyNkZWZpbmUgR1JDX1JYX0NQVV9TRU0JCQkweDAwMDA2ODE4CisjZGVmaW5lIEdSQ19SRU1PVEVfUlhfQ1BVX0FUVE4JCTB4MDAwMDY4MWMKKyNkZWZpbmUgR1JDX1RYX0NQVV9FVkVOVAkJMHgwMDAwNjgyMAorI2RlZmluZSBHUkNfVFhfVElNRVJfUkVGCQkweDAwMDA2ODI0CisjZGVmaW5lIEdSQ19UWF9DUFVfU0VNCQkJMHgwMDAwNjgyOAorI2RlZmluZSBHUkNfUkVNT1RFX1RYX0NQVV9BVFROCQkweDAwMDA2ODJjCisjZGVmaW5lIEdSQ19NRU1fUE9XRVJfVVAJCTB4MDAwMDY4MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ19FRVBST01fQUREUgkJCTB4MDAwMDY4MzgKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1dSSVRFCQkweDAwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9SRUFECQkweDgwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9DT01QTEVURQkJMHg0MDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfRlNNX1JFU0VUCQkweDIwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9ERVZJRF9NQVNLCQkweDFjMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9ERVZJRF9TSElGVAkyNgorI2RlZmluZSAgRUVQUk9NX0FERFJfU1RBUlQJCTB4MDIwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0NMS1BFUkRfU0hJRlQJMTYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0FERFJfTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSAgRUVQUk9NX0FERFJfQUREUl9TSElGVAkJMAorI2RlZmluZSAgRUVQUk9NX0RFRkFVTFRfQ0xPQ0tfUEVSSU9ECTB4NjAKKyNkZWZpbmUgIEVFUFJPTV9DSElQX1NJWkUJCSg2NCAqIDEwMjQpCisjZGVmaW5lIEdSQ19FRVBST01fREFUQQkJCTB4MDAwMDY4M2MKKyNkZWZpbmUgR1JDX0VFUFJPTV9DVFJMCQkJMHgwMDAwNjg0MAorI2RlZmluZSBHUkNfTURJX0NUUkwJCQkweDAwMDA2ODQ0CisjZGVmaW5lIEdSQ19TRUVQUk9NX0RFTEFZCQkweDAwMDA2ODQ4CisvKiAweDY4NGMgLS0+IDB4NmMwMCB1bnVzZWQgKi8KKworLyogMHg2YzAwIC0tPiAweDcwMDAgdW51c2VkICovCisKKy8qIE5WUkFNIENvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5WUkFNX0NNRAkJCTB4MDAwMDcwMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE5WUkFNX0NNRF9ET05FCQkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5WUkFNX0NNRF9HTwkJCSAweDAwMDAwMDEwCisjZGVmaW5lICBOVlJBTV9DTURfV1IJCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgTlZSQU1fQ01EX1JECQkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9FUkFTRQkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9GSVJTVAkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE5WUkFNX0NNRF9MQVNUCQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9XUkVOCQkJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9XUkRJCQkJIDB4MDAwMjAwMDAKKyNkZWZpbmUgTlZSQU1fU1RBVAkJCTB4MDAwMDcwMDQKKyNkZWZpbmUgTlZSQU1fV1JEQVRBCQkJMHgwMDAwNzAwOAorI2RlZmluZSBOVlJBTV9BRERSCQkJMHgwMDAwNzAwYworI2RlZmluZSAgTlZSQU1fQUREUl9NU0sJCQkweDAwZmZmZmZmCisjZGVmaW5lIE5WUkFNX1JEREFUQQkJCTB4MDAwMDcwMTAKKyNkZWZpbmUgTlZSQU1fQ0ZHMQkJCTB4MDAwMDcwMTQKKyNkZWZpbmUgIE5WUkFNX0NGRzFfRkxBU0hJRl9FTkFCCSAweDAwMDAwMDAxCisjZGVmaW5lICBOVlJBTV9DRkcxX0JVRkZFUkVEX01PREUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE5WUkFNX0NGRzFfUEFTU19USFJVCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9TVEFUVVNfQklUUwkJIDB4MDAwMDAwNzAKKyNkZWZpbmUgIE5WUkFNX0NGRzFfQklUX0JBTkcJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOVlJBTV9DRkcxX0ZMQVNIX1NJWkUJCSAweDAyMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DRkcxX0NPTVBBVF9CWVBBU1MJIDB4ODAwMDAwMDAKKyNkZWZpbmUgIE5WUkFNX0NGRzFfVkVORE9SX01BU0sJCSAweDAzMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfQVRNRUxfRUVQUk9NCSAweDAyMDAwMDAwCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfQlVGRkVSRUQJIDB4MDIwMDAwMDMKKyNkZWZpbmUgIEZMQVNIX1ZFTkRPUl9BVE1FTF9GTEFTSF9VTkJVRkZFUkVECSAweDAwMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfU1QJCQkgMHgwMzAwMDAwMQorI2RlZmluZSAgRkxBU0hfVkVORE9SX1NBSUZVTgkJIDB4MDEwMDAwMDMKKyNkZWZpbmUgIEZMQVNIX1ZFTkRPUl9TU1RfU01BTEwJCSAweDAwMDAwMDAxCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfU1NUX0xBUkdFCQkgMHgwMjAwMDAwMQorI2RlZmluZSBOVlJBTV9DRkcyCQkJMHgwMDAwNzAxOAorI2RlZmluZSBOVlJBTV9DRkczCQkJMHgwMDAwNzAxYworI2RlZmluZSBOVlJBTV9TV0FSQgkJCTB4MDAwMDcwMjAKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQwCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQxCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQyCQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQzCQkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIwCQkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIxCQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIyCQkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIzCQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFNXQVJCX0dOVDAJCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgU1dBUkJfR05UMQkJCSAweDAwMDAwMjAwCisjZGVmaW5lICBTV0FSQl9HTlQyCQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIFNXQVJCX0dOVDMJCQkgMHgwMDAwMDgwMAorI2RlZmluZSAgU1dBUkJfUkVRMAkJCSAweDAwMDAxMDAwCisjZGVmaW5lICBTV0FSQl9SRVExCQkJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTIJCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgU1dBUkJfUkVRMwkJCSAweDAwMDA4MDAwCisjZGVmaW5lIE5WUkFNX0FDQ0VTUwkJCTB4MDAwMDcwMjQKKyNkZWZpbmUgIEFDQ0VTU19FTkFCTEUJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgQUNDRVNTX1dSX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlZSQU1fV1JJVEUxCQkJMHgwMDAwNzAyOAorLyogMHg3MDJjIC0tPiAweDc0MDAgdW51c2VkICovCisKKy8qIDB4NzQwMCAtLT4gMHg4MDAwIHVudXNlZCAqLworCisjZGVmaW5lIFRHM19FRVBST01fTUFHSUMJCTB4NjY5OTU1YWEKKworLyogMzJLIFdpbmRvdyBpbnRvIE5JQyBpbnRlcm5hbCBtZW1vcnkgKi8KKyNkZWZpbmUgTklDX1NSQU1fV0lOX0JBU0UJCTB4MDAwMDgwMDAKKworLyogT2Zmc2V0cyBpbnRvIGZpcnN0IDMyayBvZiBOSUMgaW50ZXJuYWwgbWVtb3J5LiAqLworI2RlZmluZSBOSUNfU1JBTV9QQUdFX1pFUk8JCTB4MDAwMDAwMDAKKyNkZWZpbmUgTklDX1NSQU1fU0VORF9SQ0IJCTB4MDAwMDAxMDAgLyogMTYgKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBOSUNfU1JBTV9SQ1ZfUkVUX1JDQgkJMHgwMDAwMDIwMCAvKiAxNiAqIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIE5JQ19TUkFNX1NUQVRTX0JMSwkJMHgwMDAwMDMwMAorI2RlZmluZSBOSUNfU1JBTV9TVEFUVVNfQkxLCQkweDAwMDAwYjAwCisKKyNkZWZpbmUgTklDX1NSQU1fRklSTVdBUkVfTUJPWAkJMHgwMDAwMGI1MAorI2RlZmluZSAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzEJIDB4NEI2NTc2NTQKKyNkZWZpbmUgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMyCSAweDQ4NjE3NjRiIC8qICFkbWEgb24gbGlua2NoZyAqLworCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfU0lHCQkweDAwMDAwYjU0CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1NJR19NQUdJQwkgMHg0YjY1NzY1NCAvKiBhc2NpaSBmb3IgJ0tldlQnICovCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9DRkcJCQkweDAwMDAwYjU4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLCSAweDAwMDAwMDBjCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQUMJCSAweDAwMDAwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9QSFlfMQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX01BU0sJIDB4MDAwMDAwMzAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX1VOS05PV04JIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0NPUFBFUgkgMHgwMDAwMDAxMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfRklCRVIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1dPTF9FTkFCTEUJCSAweDAwMDAwMDQwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfRUVQUk9NX1dQCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kJCSAweDAwMDAxMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19GSUJFUl9XT0wJCSAweDAwMDA0MDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19OT19HUElPMgkJIDB4MDAxMDAwMDAKKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1ZFUgkJCTB4MDAwMDBiNWMKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfVkVSX1NISUZUCQkgMTYKKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1BIWV9JRAkJMHgwMDAwMGI3NAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9QSFlfSUQxX01BU0sJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfUEhZX0lEMl9NQVNLCSAweDAwMDBmZmZmCisKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX01CT1gJCTB4MDAwMDBiNzgKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9BTElWRQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9QQVVTRV9GVwkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9JUFY0QUREUl9DSEcJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9JUFY2QUREUl9DSEcJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9GSVhfRE1BUgkJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9GSVhfRE1BVwkJIDB4MDAwMDAwMDYKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX0xFTl9NQk9YCTB4MDAwMDBiN2MKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX0RBVEFfTUJPWAkweDAwMDAwYjgwCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0FTRl9TVEFUVVNfTUJPWAkweDAwMDAwYzAwCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YCTB4MDAwMDBjMDQKKyNkZWZpbmUgIERSVl9TVEFURV9TVEFSVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIERSVl9TVEFURV9TVEFSVF9ET05FCQkgMHg4MDAwMDAwMQorI2RlZmluZSAgRFJWX1NUQVRFX1VOTE9BRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIERSVl9TVEFURV9VTkxPQURfRE9ORQkJIDB4ODAwMDAwMDIKKyNkZWZpbmUgIERSVl9TVEFURV9XT0wJCQkgMHgwMDAwMDAwMworI2RlZmluZSAgRFJWX1NUQVRFX1NVU1BFTkQJCSAweDAwMDAwMDA0CisKKyNkZWZpbmUgTklDX1NSQU1fRldfUkVTRVRfVFlQRV9NQk9YCTB4MDAwMDBjMDgKKworI2RlZmluZSBOSUNfU1JBTV9NQUNfQUREUl9ISUdIX01CT1gJMHgwMDAwMGMxNAorI2RlZmluZSBOSUNfU1JBTV9NQUNfQUREUl9MT1dfTUJPWAkweDAwMDAwYzE4CisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9DRkdfMgkJMHgwMDAwMGQzOAorCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9NT0RFX01BU0sJIDB4MDAwMTgwMDAKKyNkZWZpbmUgIFNIQVNUQV9FWFRfTEVEX0xFR0FDWQkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIFNIQVNUQV9FWFRfTEVEX1NIQVJFRAkJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIFNIQVNUQV9FWFRfTEVEX01BQwkJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIFNIQVNUQV9FWFRfTEVEX0NPTUJPCQkgMHgwMDAxODAwMAorCisjZGVmaW5lIE5JQ19TUkFNX1JYX01JTklfQlVGRkVSX0RFU0MJMHgwMDAwMTAwMAorCisjZGVmaW5lIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRQkweDAwMDAyMDAwCisjZGVmaW5lICBOSUNfU1JBTV9ETUFfREVTQ19QT09MX1NJWkUJIDB4MDAwMDIwMDAKKyNkZWZpbmUgTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MJCTB4MDAwMDQwMDAgLyogNTEyIGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fUlhfQlVGRkVSX0RFU0MJCTB4MDAwMDYwMDAgLyogMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fUlhfSlVNQk9fQlVGRkVSX0RFU0MJMHgwMDAwNzAwMCAvKiAyNTYgZW50cmllcyAqLworI2RlZmluZSBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRQkJMHgwMDAwODAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU5NgkgMHgwMDAxODAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU2NAkgMHgwMDAxMDAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1CTB4MDAwMTAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNTcwNQkweDAwMDBlMDAwCisKKy8qIEN1cnJlbnRseSB0aGlzIGlzIGZpeGVkLiAqLworI2RlZmluZSBQSFlfQUREUgkJMHgwMQorCisvKiBUaWdvbjMgc3BlY2lmaWMgUEhZIE1JSSByZWdpc3RlcnMuICovCisjZGVmaW5lICBURzNfQk1DUl9TUEVFRDEwMDAJCTB4MDA0MAorCisjZGVmaW5lIE1JSV9URzNfQ1RSTAkJCTB4MDkgLyogMTAwMC1iYXNlVCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRgkweDAxMDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMCTB4MDIwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0FTX01BU1RFUgkJMHgwODAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUgkweDEwMDAKKworI2RlZmluZSBNSUlfVEczX0VYVF9DVFJMCQkweDEwIC8qIEV4dGVuZGVkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfRklGT19FTEFTVElDCTB4MDAwMQorI2RlZmluZSAgTUlJX1RHM19FWFRfQ1RSTF9MTkszX0xFRF9NT0RFCTB4MDAwMgorI2RlZmluZSAgTUlJX1RHM19FWFRfQ1RSTF9UQkkJCTB4ODAwMAorCisjZGVmaW5lIE1JSV9URzNfRVhUX1NUQVQJCTB4MTEgLyogRXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9TVEFUX0xQQVNTCQkweDAxMDAKKworI2RlZmluZSBNSUlfVEczX0RTUF9SV19QT1JUCQkweDE1IC8qIERTUCBjb2VmZmljaWVudCByZWFkL3dyaXRlIHBvcnQgKi8KKworI2RlZmluZSBNSUlfVEczX0RTUF9BRERSRVNTCQkweDE3IC8qIERTUCBhZGRyZXNzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUlJX1RHM19BVVhfQ1RSTAkJMHgxOCAvKiBhdXhpbGxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUCQkweDE5IC8qIGF1eGlsbGlhcnkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfTFBBU1MJCTB4MDAwNAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUX1NQRE1BU0sJMHgwNzAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTBIQUxGCQkweDAxMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMEZVTEwJCTB4MDIwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMEhBTEYJMHgwMzAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwXzQJCTB4MDQwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMEZVTEwJMHgwNTAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwMEhBTEYJMHgwNjAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwMEZVTEwJMHgwNzAwCisKKyNkZWZpbmUgTUlJX1RHM19JU1RBVAkJCTB4MWEgLyogSVJRIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfVEczX0lNQVNLCQkJMHgxYiAvKiBJUlEgbWFzayByZWdpc3RlciAqLworCisvKiBJU1RBVC9JTUFTSyBldmVudCBiaXRzICovCisjZGVmaW5lIE1JSV9URzNfSU5UX0xJTktDSEcJCTB4MDAwMgorI2RlZmluZSBNSUlfVEczX0lOVF9TUEVFRENIRwkJMHgwMDA0CisjZGVmaW5lIE1JSV9URzNfSU5UX0RVUExFWENIRwkJMHgwMDA4CisjZGVmaW5lIE1JSV9URzNfSU5UX0FORUdfUEFHRV9SWAkweDA0MDAKKworLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIG1hbmFnZSB0aGUgVFggZGVzY3JpcHRvcnMgb24gdGhlIHRpZ29uMy4KKyAqIEVpdGhlciB0aGUgZGVzY3JpcHRvcnMgYXJlIGluIGhvc3QgRE1BJ2FibGUgbWVtb3J5LCBvciB0aGV5CisgKiBleGlzdCBvbmx5IGluIHRoZSBjYXJkcyBvbi1jaGlwIFNSQU0uICBBbGwgMTYgc2VuZCBiZHMgYXJlIHVuZGVyCisgKiB0aGUgc2FtZSBtb2RlLCB0aGV5IG1heSBub3QgYmUgY29uZmlndXJlZCBpbmRpdmlkdWFsbHkuCisgKgorICogVGhpcyBkcml2ZXIgYWx3YXlzIHVzZXMgaG9zdCBtZW1vcnkgVFggZGVzY3JpcHRvcnMuCisgKgorICogVG8gdXNlIGhvc3QgbWVtb3J5IFRYIGRlc2NyaXB0b3JzOgorICoJMSkgU2V0IEdSQ19NT0RFX0hPU1RfU0VOREJEUyBpbiBHUkNfTU9ERSByZWdpc3Rlci4KKyAqCSAgIE1ha2Ugc3VyZSBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyBpcyBjbGVhci4KKyAqCTIpIEFsbG9jYXRlIERNQSdhYmxlIG1lbW9yeS4KKyAqCTMpIEluIE5JQ19TUkFNX1NFTkRfUkNCIChvZiBkZXNpcmVkIGluZGV4KSBvZiBvbi1jaGlwIFNSQU06CisgKgkgICBhKSBTZXQgVEczX0JESU5GT19IT1NUX0FERFIgdG8gRE1BIGFkZHJlc3Mgb2YgbWVtb3J5CisgKgkgICAgICBvYnRhaW5lZCBpbiBzdGVwIDIKKyAqCSAgIGIpIFNldCBURzNfQkRJTkZPX05JQ19BRERSIHRvIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDLgorICoJICAgYykgU2V0IGxlbiBmaWVsZCBvZiBURzNfQkRJTkZPX01BWExFTl9GTEFHUyB0byBudW1iZXIKKyAqICAgICAgICAgICAgb2YgVFggZGVzY3JpcHRvcnMuICBMZWF2ZSBmbGFncyBmaWVsZCBjbGVhci4KKyAqCTQpIEFjY2VzcyBUWCBkZXNjcmlwdG9ycyB2aWEgaG9zdCBtZW1vcnkuICBUaGUgY2hpcAorICoJICAgd2lsbCByZWZldGNoIGludG8gbG9jYWwgU1JBTSBhcyBuZWVkZWQgd2hlbiBwcm9kdWNlcgorICoJICAgaW5kZXggbWFpbGJveGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFRvIHVzZSBvbi1jaGlwIFRYIGRlc2NyaXB0b3JzOgorICoJMSkgU2V0IEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTIGluIEdSQ19NT0RFIHJlZ2lzdGVyLgorICoJICAgTWFrZSBzdXJlIEdSQ19NT0RFX0hPU1RfU0VOREJEUyBpcyBjbGVhci4KKyAqCTIpIEluIE5JQ19TUkFNX1NFTkRfUkNCIChvZiBkZXNpcmVkIGluZGV4KSBvZiBvbi1jaGlwIFNSQU06CisgKgkgICBhKSBTZXQgVEczX0JESU5GT19IT1NUX0FERFIgdG8gemVyby4KKyAqCSAgIGIpIFNldCBURzNfQkRJTkZPX05JQ19BRERSIHRvIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCisgKgkgICBjKSBURzNfQkRJTkZPX01BWExFTl9GTEFHUyBpcyBkb24ndCBjYXJlLgorICoJMykgQWNjZXNzIFRYIGRlc2NyaXB0b3JzIGRpcmVjdGx5IGluIG9uLWNoaXAgU1JBTQorICoJICAgdXNpbmcgbm9ybWFsIHtyZWFkLHdyaXRlfWwoKS4gIChhbmQgbm90IHVzaW5nCisgKiAgICAgICAgIHBvaW50ZXIgZGVyZWZlcmVuY2luZyBvZiBpb3JlbWFwKCknZCBtZW1vcnkgbGlrZQorICoJICAgdGhlIGJyb2tlbiBCcm9hZGNvbSBkcml2ZXIgZG9lcykKKyAqCisgKiBOb3RlIHRoYXQgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEIHNob3VsZCBiZSBzZXQgaW4gdGhlIGZsYWdzIGZpZWxkIG9mCisgKiBURzNfQkRJTkZPX01BWExFTl9GTEFHUyBvZiBhbGwgdW51c2VkIFNFTkRfUkNCIGluZGljZXMuCisgKi8KK3N0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MgeworCXUzMgkJCQlhZGRyX2hpOworCXUzMgkJCQlhZGRyX2xvOworCisJdTMyCQkJCWxlbl9mbGFnczsKKyNkZWZpbmUgVFhEX0ZMQUdfVENQVURQX0NTVU0JCTB4MDAwMQorI2RlZmluZSBUWERfRkxBR19JUF9DU1VNCQkweDAwMDIKKyNkZWZpbmUgVFhEX0ZMQUdfRU5ECQkJMHgwMDA0CisjZGVmaW5lIFRYRF9GTEFHX0lQX0ZSQUcJCTB4MDAwOAorI2RlZmluZSBUWERfRkxBR19JUF9GUkFHX0VORAkJMHgwMDEwCisjZGVmaW5lIFRYRF9GTEFHX1ZMQU4JCQkweDAwNDAKKyNkZWZpbmUgVFhEX0ZMQUdfQ09BTF9OT1cJCTB4MDA4MAorI2RlZmluZSBUWERfRkxBR19DUFVfUFJFX0RNQQkJMHgwMTAwCisjZGVmaW5lIFRYRF9GTEFHX0NQVV9QT1NUX0RNQQkJMHgwMjAwCisjZGVmaW5lIFRYRF9GTEFHX0FERF9TUkNfQUREUgkJMHgxMDAwCisjZGVmaW5lIFRYRF9GTEFHX0NIT09TRV9TUkNfQUREUgkweDYwMDAKKyNkZWZpbmUgVFhEX0ZMQUdfTk9fQ1JDCQkJMHg4MDAwCisjZGVmaW5lIFRYRF9MRU5fU0hJRlQJCQkxNgorCisJdTMyCQkJCXZsYW5fdGFnOworI2RlZmluZSBUWERfVkxBTl9UQUdfU0hJRlQJCTAKKyNkZWZpbmUgVFhEX01TU19TSElGVAkJCTE2Cit9OworCisjZGVmaW5lIFRYRF9BRERSCQkJMHgwMFVMIC8qIDY0LWJpdCAqLworI2RlZmluZSBUWERfTEVOX0ZMQUdTCQkJMHgwOFVMIC8qIDMyLWJpdCAodXBwZXIgMTYtYml0cyBhcmUgbGVuKSAqLworI2RlZmluZSBUWERfVkxBTl9UQUcJCQkweDBjVUwgLyogMzItYml0ICh1cHBlciAxNi1iaXRzIGFyZSB0YWcpICovCisjZGVmaW5lIFRYRF9TSVpFCQkJMHgxMFVMCisKK3N0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgeworCXUzMgkJCQlhZGRyX2hpOworCXUzMgkJCQlhZGRyX2xvOworCisJdTMyCQkJCWlkeF9sZW47CisjZGVmaW5lIFJYRF9JRFhfTUFTSwkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JRFhfU0hJRlQJMTYKKyNkZWZpbmUgUlhEX0xFTl9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX0xFTl9TSElGVAkwCisKKwl1MzIJCQkJdHlwZV9mbGFnczsKKyNkZWZpbmUgUlhEX1RZUEVfU0hJRlQJMTYKKyNkZWZpbmUgUlhEX0ZMQUdTX1NISUZUCTAKKworI2RlZmluZSBSWERfRkxBR19FTkQJCQkweDAwMDQKKyNkZWZpbmUgUlhEX0ZMQUdfTUlOSQkJCTB4MDgwMAorI2RlZmluZSBSWERfRkxBR19KVU1CTwkJCTB4MDAyMAorI2RlZmluZSBSWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFJYRF9GTEFHX0VSUk9SCQkJMHgwNDAwCisjZGVmaW5lIFJYRF9GTEFHX0lQX0NTVU0JCTB4MTAwMAorI2RlZmluZSBSWERfRkxBR19UQ1BVRFBfQ1NVTQkJMHgyMDAwCisjZGVmaW5lIFJYRF9GTEFHX0lTX1RDUAkJCTB4NDAwMAorCisJdTMyCQkJCWlwX3RjcF9jc3VtOworI2RlZmluZSBSWERfSVBDU1VNX01BU0sJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgUlhEX0lQQ1NVTV9TSElGVAkxNgorI2RlZmluZSBSWERfVENQQ1NVTV9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX1RDUENTVU1fU0hJRlQJMAorCisJdTMyCQkJCWVycl92bGFuOworCisjZGVmaW5lIFJYRF9WTEFOX01BU0sJCQkweDAwMDBmZmZmCisKKyNkZWZpbmUgUlhEX0VSUl9CQURfQ1JDCQkJMHgwMDAxMDAwMAorI2RlZmluZSBSWERfRVJSX0NPTExJU0lPTgkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfRVJSX0xJTktfTE9TVAkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfRVJSX1BIWV9ERUNPREUJCTB4MDAwODAwMDAKKyNkZWZpbmUgUlhEX0VSUl9PRERfTklCQkxFX1JDVkRfTUlJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9NQUNfQUJSVAkJMHgwMDIwMDAwMAorI2RlZmluZSBSWERfRVJSX1RPT19TTUFMTAkJMHgwMDQwMDAwMAorI2RlZmluZSBSWERfRVJSX05PX1JFU09VUkNFUwkJMHgwMDgwMDAwMAorI2RlZmluZSBSWERfRVJSX0hVR0VfRlJBTUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9NQVNLCQkJMHhmZmZmMDAwMAorCisJdTMyCQkJCXJlc2VydmVkOworCXUzMgkJCQlvcGFxdWU7CisjZGVmaW5lIFJYRF9PUEFRVUVfSU5ERVhfTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBSWERfT1BBUVVFX0lOREVYX1NISUZUCQkwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19TVEQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgUlhEX09QQVFVRV9SSU5HX0pVTUJPCQkweDAwMDIwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19NSU5JCQkweDAwMDQwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19NQVNLCQkweDAwMDcwMDAwCit9OworCitzdHJ1Y3QgdGczX2V4dF9yeF9idWZmZXJfZGVzYyB7CisJc3RydWN0IHsKKwkJdTMyCQkJYWRkcl9oaTsKKwkJdTMyCQkJYWRkcl9sbzsKKwl9CQkJCWFkZHJsaXN0WzNdOworCXUzMgkJCQlsZW4yX2xlbjE7CisJdTMyCQkJCXJlc3ZfbGVuMzsKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCXN0ZDsKK307CisKKy8qIFdlIG9ubHkgdXNlIHRoaXMgd2hlbiB0ZXN0aW5nIG91dCB0aGUgRE1BIGVuZ2luZQorICogYXQgcHJvYmUgdGltZS4gIFRoaXMgaXMgdGhlIGludGVybmFsIGZvcm1hdCBvZiBidWZmZXIKKyAqIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIGNoaXAgYXQgTklDX1NSQU1fRE1BX0RFU0NTLgorICovCitzdHJ1Y3QgdGczX2ludGVybmFsX2J1ZmZlcl9kZXNjIHsKKwl1MzIJCQkJYWRkcl9oaTsKKwl1MzIJCQkJYWRkcl9sbzsKKwl1MzIJCQkJbmljX21idWY7CisJLyogWFhYIEZJWCBUSElTICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTE2CQkJCWNxaWRfc3FpZDsKKwl1MTYJCQkJbGVuOworI2Vsc2UKKwl1MTYJCQkJbGVuOworCXUxNgkJCQljcWlkX3NxaWQ7CisjZW5kaWYKKwl1MzIJCQkJZmxhZ3M7CisJdTMyCQkJCV9fY29va2llMTsKKwl1MzIJCQkJX19jb29raWUyOworCXUzMgkJCQlfX2Nvb2tpZTM7Cit9OworCisjZGVmaW5lIFRHM19IV19TVEFUVVNfU0laRQkJMHg1MAorc3RydWN0IHRnM19od19zdGF0dXMgeworCXUzMgkJCQlzdGF0dXM7CisjZGVmaW5lIFNEX1NUQVRVU19VUERBVEVECQkweDAwMDAwMDAxCisjZGVmaW5lIFNEX1NUQVRVU19MSU5LX0NIRwkJMHgwMDAwMDAwMgorI2RlZmluZSBTRF9TVEFUVVNfRVJST1IJCQkweDAwMDAwMDA0CisKKwl1MzIJCQkJc3RhdHVzX3RhZzsKKworI2lmZGVmIF9fQklHX0VORElBTgorCXUxNgkJCQlyeF9jb25zdW1lcjsKKwl1MTYJCQkJcnhfanVtYm9fY29uc3VtZXI7CisjZWxzZQorCXUxNgkJCQlyeF9qdW1ib19jb25zdW1lcjsKKwl1MTYJCQkJcnhfY29uc3VtZXI7CisjZW5kaWYKKworI2lmZGVmIF9fQklHX0VORElBTgorCXUxNgkJCQlyZXNlcnZlZDsKKwl1MTYJCQkJcnhfbWluaV9jb25zdW1lcjsKKyNlbHNlCisJdTE2CQkJCXJ4X21pbmlfY29uc3VtZXI7CisJdTE2CQkJCXJlc2VydmVkOworI2VuZGlmCisJc3RydWN0IHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJdTE2CQkJdHhfY29uc3VtZXI7CisJCXUxNgkJCXJ4X3Byb2R1Y2VyOworI2Vsc2UKKwkJdTE2CQkJcnhfcHJvZHVjZXI7CisJCXUxNgkJCXR4X2NvbnN1bWVyOworI2VuZGlmCisJfQkJCQlpZHhbMTZdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBoaWdoLCBsb3c7Cit9IHRnM19zdGF0NjRfdDsKKworc3RydWN0IHRnM19od19zdGF0cyB7CisJdTgJCQkJX19yZXNlcnZlZDBbMHg0MDAtMHgzMDBdOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFJlY2VpdmUgTUFDLiAqLworCXRnM19zdGF0NjRfdAkJCXJ4X29jdGV0czsKKwl1NjQJCQkJX19yZXNlcnZlZDE7CisJdGczX3N0YXQ2NF90CQkJcnhfZnJhZ21lbnRzOworCXRnM19zdGF0NjRfdAkJCXJ4X3VjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfbWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9iY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2Zjc19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfYWxpZ25fZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvbl9wYXVzZV9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvZmZfcGF1c2VfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9tYWNfY3RybF9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvZmZfZW50ZXJlZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mcmFtZV90b29fbG9uZ19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfamFiYmVyczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF91bmRlcnNpemVfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9pbl9sZW5ndGhfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X291dF9sZW5ndGhfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4XzY0X29yX2xlc3Nfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF82NV90b18xMjdfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xMjhfdG9fMjU1X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMjU2X3RvXzUxMV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzUxMl90b18xMDIzX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTAyNF90b18xNTIyX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTUyM190b18yMDQ3X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMjA0OF90b180MDk1X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNDA5Nl90b184MTkxX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfODE5Ml90b185MDIyX29jdGV0X3BhY2tldHM7CisKKwl1NjQJCQkJX191bnVzZWQwWzM3XTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBUcmFuc21pdCBNQUMuICovCisJdGczX3N0YXQ2NF90CQkJdHhfb2N0ZXRzOworCXU2NAkJCQlfX3Jlc2VydmVkMjsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X3hvbl9zZW50OworCXRnM19zdGF0NjRfdAkJCXR4X3hvZmZfc2VudDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9mbG93X2NvbnRyb2w7CisJdGczX3N0YXQ2NF90CQkJdHhfbWFjX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9zaW5nbGVfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9tdWx0X2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfZGVmZXJyZWQ7CisJdTY0CQkJCV9fcmVzZXJ2ZWQzOworCXRnM19zdGF0NjRfdAkJCXR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2xhdGVfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzJ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzN0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzR0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzV0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzZ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzd0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzh0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzl0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEwdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTJ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEzdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xNHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTV0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF91Y2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X21jYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfYmNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jYXJyaWVyX3NlbnNlX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9kaXNjYXJkczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9lcnJvcnM7CisKKwl1NjQJCQkJX191bnVzZWQxWzMxXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCXRnM19zdGF0NjRfdAkJCUNPU19yeF9wYWNrZXRzWzE2XTsKKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfZmlsdGVyX2Ryb3BwZWQ7CisJdGczX3N0YXQ2NF90CQkJZG1hX3dyaXRlcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZV9wcmlvcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCXJ4YmRzX2VtcHR5OworCXRnM19zdGF0NjRfdAkJCXJ4X2Rpc2NhcmRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF90aHJlc2hvbGRfaGl0OworCisJdTY0CQkJCV9fdW51c2VkMls5XTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBTZW5kIERhdGEgSW5pdGlhdG9yLiAqLworCXRnM19zdGF0NjRfdAkJCUNPU19vdXRfcGFja2V0c1sxNl07CisJdGczX3N0YXQ2NF90CQkJZG1hX3JlYWRxX2Z1bGw7CisJdGczX3N0YXQ2NF90CQkJZG1hX3JlYWRfcHJpb3FfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb21wX3F1ZXVlX2Z1bGw7CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgSG9zdCBDb2FsZXNjaW5nLiAqLworCXRnM19zdGF0NjRfdAkJCXJpbmdfc2V0X3NlbmRfcHJvZF9pbmRleDsKKwl0ZzNfc3RhdDY0X3QJCQlyaW5nX3N0YXR1c191cGRhdGU7CisJdGczX3N0YXQ2NF90CQkJbmljX2lycXM7CisJdGczX3N0YXQ2NF90CQkJbmljX2F2b2lkZWRfaXJxczsKKwl0ZzNfc3RhdDY0X3QJCQluaWNfdHhfdGhyZXNob2xkX2hpdDsKKworCXU4CQkJCV9fcmVzZXJ2ZWQ0WzB4YjAwLTB4OWMwXTsKK307CisKKy8qICdtYXBwaW5nJyBpcyBzdXBlcmZsdW91cyBhcyB0aGUgY2hpcCBkb2VzIG5vdCB3cml0ZSBpbnRvCisgKiB0aGUgdHgvcnggcG9zdCByaW5ncyBzbyB3ZSBjb3VsZCBqdXN0IGZldGNoIGl0IGZyb20gdGhlcmUuCisgKiBCdXQgdGhlIGNhY2hlIGJlaGF2aW9yIGlzIGJldHRlciBob3cgd2UgYXJlIGRvaW5nIGl0IG5vdy4KKyAqLworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKK307CisKK3N0cnVjdCB0eF9yaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCisJdTMyCQkJCXByZXZfdmxhbl90YWc7Cit9OworCitzdHJ1Y3QgdGczX2NvbmZpZ19pbmZvIHsKKwl1MzIJCQkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgdGczX2xpbmtfY29uZmlnIHsKKwkvKiBEZXNjcmliZXMgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gZ2V0LiAqLworCXUzMgkJCQlhZHZlcnRpc2luZzsKKwl1MTYJCQkJc3BlZWQ7CisJdTgJCQkJZHVwbGV4OworCXU4CQkJCWF1dG9uZWc7CisKKwkvKiBEZXNjcmliZXMgd2hhdCB3ZSBhY3R1YWxseSBoYXZlLiAqLworCXUxNgkJCQlhY3RpdmVfc3BlZWQ7CisJdTgJCQkJYWN0aXZlX2R1cGxleDsKKyNkZWZpbmUgU1BFRURfSU5WQUxJRAkJMHhmZmZmCisjZGVmaW5lIERVUExFWF9JTlZBTElECQkweGZmCisjZGVmaW5lIEFVVE9ORUdfSU5WQUxJRAkJMHhmZgorCisJLyogV2hlbiB3ZSBnbyBpbiBhbmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlIHdlIG5lZWQKKwkgKiB0byBzd2FwIHdpdGggdGhpcyBzdGF0ZS4KKwkgKi8KKwlpbnQJCQkJcGh5X2lzX2xvd19wb3dlcjsKKwl1MTYJCQkJb3JpZ19zcGVlZDsKKwl1OAkJCQlvcmlnX2R1cGxleDsKKwl1OAkJCQlvcmlnX2F1dG9uZWc7Cit9OworCitzdHJ1Y3QgdGczX2J1Zm1ncl9jb25maWcgeworCXUzMgkJbWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXI7CisJdTMyCQltYnVmX21hY19yeF9sb3dfd2F0ZXI7CisJdTMyCQltYnVmX2hpZ2hfd2F0ZXI7CisKKwl1MzIJCW1idWZfcmVhZF9kbWFfbG93X3dhdGVyX2p1bWJvOworCXUzMgkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyX2p1bWJvOworCXUzMgkJbWJ1Zl9oaWdoX3dhdGVyX2p1bWJvOworCisJdTMyCQlkbWFfbG93X3dhdGVyOworCXUzMgkJZG1hX2hpZ2hfd2F0ZXI7Cit9OworCitzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgeworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwl1NjQgCSAgICAJcnhfb2N0ZXRzOworCXU2NAkJcnhfZnJhZ21lbnRzOworCXU2NAkJcnhfdWNhc3RfcGFja2V0czsKKwl1NjQJCXJ4X21jYXN0X3BhY2tldHM7CisJdTY0CQlyeF9iY2FzdF9wYWNrZXRzOworCXU2NAkJcnhfZmNzX2Vycm9yczsKKwl1NjQJCXJ4X2FsaWduX2Vycm9yczsKKwl1NjQJCXJ4X3hvbl9wYXVzZV9yY3ZkOworCXU2NAkJcnhfeG9mZl9wYXVzZV9yY3ZkOworCXU2NAkJcnhfbWFjX2N0cmxfcmN2ZDsKKwl1NjQJCXJ4X3hvZmZfZW50ZXJlZDsKKwl1NjQJCXJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9yczsKKwl1NjQJCXJ4X2phYmJlcnM7CisJdTY0CQlyeF91bmRlcnNpemVfcGFja2V0czsKKwl1NjQJCXJ4X2luX2xlbmd0aF9lcnJvcnM7CisJdTY0CQlyeF9vdXRfbGVuZ3RoX2Vycm9yczsKKwl1NjQJCXJ4XzY0X29yX2xlc3Nfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfMjU2X3RvXzUxMV9vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfMTUyM190b18yMDQ3X29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfODE5Ml90b185MDIyX29jdGV0X3BhY2tldHM7CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgVHJhbnNtaXQgTUFDLiAqLworCXU2NAkJdHhfb2N0ZXRzOworCXU2NAkJdHhfY29sbGlzaW9uczsKKwl1NjQJCXR4X3hvbl9zZW50OworCXU2NAkJdHhfeG9mZl9zZW50OworCXU2NAkJdHhfZmxvd19jb250cm9sOworCXU2NAkJdHhfbWFjX2Vycm9yczsKKwl1NjQJCXR4X3NpbmdsZV9jb2xsaXNpb25zOworCXU2NAkJdHhfbXVsdF9jb2xsaXNpb25zOworCXU2NAkJdHhfZGVmZXJyZWQ7CisJdTY0CQl0eF9leGNlc3NpdmVfY29sbGlzaW9uczsKKwl1NjQJCXR4X2xhdGVfY29sbGlzaW9uczsKKwl1NjQJCXR4X2NvbGxpZGVfMnRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8zdGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzR0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfNXRpbWVzOworCXU2NAkJdHhfY29sbGlkZV82dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzd0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfOHRpbWVzOworCXU2NAkJdHhfY29sbGlkZV85dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzEwdGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzExdGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzEydGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzEzdGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzE0dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzE1dGltZXM7CisJdTY0CQl0eF91Y2FzdF9wYWNrZXRzOworCXU2NAkJdHhfbWNhc3RfcGFja2V0czsKKwl1NjQJCXR4X2JjYXN0X3BhY2tldHM7CisJdTY0CQl0eF9jYXJyaWVyX3NlbnNlX2Vycm9yczsKKwl1NjQJCXR4X2Rpc2NhcmRzOworCXU2NAkJdHhfZXJyb3JzOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQuICovCisJdTY0CQlkbWFfd3JpdGVxX2Z1bGw7CisJdTY0CQlkbWFfd3JpdGVfcHJpb3FfZnVsbDsKKwl1NjQJCXJ4YmRzX2VtcHR5OworCXU2NAkJcnhfZGlzY2FyZHM7CisJdTY0CQlyeF9lcnJvcnM7CisJdTY0CQlyeF90aHJlc2hvbGRfaGl0OworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFNlbmQgRGF0YSBJbml0aWF0b3IuICovCisJdTY0CQlkbWFfcmVhZHFfZnVsbDsKKwl1NjQJCWRtYV9yZWFkX3ByaW9xX2Z1bGw7CisJdTY0CQl0eF9jb21wX3F1ZXVlX2Z1bGw7CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgSG9zdCBDb2FsZXNjaW5nLiAqLworCXU2NAkJcmluZ19zZXRfc2VuZF9wcm9kX2luZGV4OworCXU2NAkJcmluZ19zdGF0dXNfdXBkYXRlOworCXU2NAkJbmljX2lycXM7CisJdTY0CQluaWNfYXZvaWRlZF9pcnFzOworCXU2NAkJbmljX3R4X3RocmVzaG9sZF9oaXQ7Cit9OworCitzdHJ1Y3QgdGczIHsKKwkvKiBiZWdpbiAiZ2VuZXJhbCwgZnJlcXVlbnRseS11c2VkIG1lbWJlcnMiIGNhY2hlbGluZSBzZWN0aW9uICovCisKKwkvKiBTTVAgbG9ja2luZyBzdHJhdGVneToKKwkgKgorCSAqIGxvY2s6IEhlbGQgZHVyaW5nIGFsbCBvcGVyYXRpb25zIGV4Y2VwdCBUWCBwYWNrZXQKKwkgKiAgICAgICBwcm9jZXNzaW5nLgorCSAqCisJICogdHhfbG9jazogSGVsZCBkdXJpbmcgdGczX3N0YXJ0X3htaXR7LF80Z2J1Z30gYW5kIHRnM190eAorCSAqCisJICogSWYgeW91IHdhbnQgdG8gc2h1dCB1cCBhbGwgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgeW91IG11c3QKKwkgKiBhY3F1aXJlIGJvdGggbG9ja3MsICdsb2NrJyB0YWtlbiBiZWZvcmUgJ3R4X2xvY2snLiAgSVJRcyBtdXN0CisJICogYmUgZGlzYWJsZWQgdG8gdGFrZSAnbG9jaycgYnV0IG9ubHkgc29mdGlycSBkaXNhYmxpbmcgaXMKKwkgKiBuZWNlc3NhcnkgZm9yIGFjcXVpc2l0aW9uIG9mICd0eF9sb2NrJy4KKwkgKi8KKwlzcGlubG9ja190CQkJbG9jazsKKwlzcGlubG9ja190CQkJaW5kaXJlY3RfbG9jazsKKworCXZvaWQgX19pb21lbQkJCSpyZWdzOworCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OworCXN0cnVjdCBwY2lfZGV2CQkJKnBkZXY7CisKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cwkJKmh3X3N0YXR1czsKKwlkbWFfYWRkcl90CQkJc3RhdHVzX21hcHBpbmc7CisKKwl1MzIJCQkJbXNnX2VuYWJsZTsKKworCS8qIGJlZ2luICJ0eCB0aHJlYWQiIGNhY2hlbGluZSBzZWN0aW9uICovCisJdTMyCQkJCXR4X3Byb2Q7CisJdTMyCQkJCXR4X2NvbnM7CisJdTMyCQkJCXR4X3BlbmRpbmc7CisKKwlzcGlubG9ja190CQkJdHhfbG9jazsKKworCXN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MJKnR4X3Jpbmc7CisJc3RydWN0IHR4X3JpbmdfaW5mbwkJKnR4X2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXR4X2Rlc2NfbWFwcGluZzsKKworCS8qIGJlZ2luICJyeCB0aHJlYWQiIGNhY2hlbGluZSBzZWN0aW9uICovCisJdTMyCQkJCXJ4X3JjYl9wdHI7CisJdTMyCQkJCXJ4X3N0ZF9wdHI7CisJdTMyCQkJCXJ4X2p1bWJvX3B0cjsKKwl1MzIJCQkJcnhfcGVuZGluZzsKKwl1MzIJCQkJcnhfanVtYm9fcGVuZGluZzsKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCXN0cnVjdCB2bGFuX2dyb3VwCQkqdmxncnA7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X3N0ZDsKKwlzdHJ1Y3QgcmluZ19pbmZvCQkqcnhfc3RkX2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXJ4X3N0ZF9tYXBwaW5nOworCisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfanVtYm87CisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X2p1bWJvX2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXJ4X2p1bWJvX21hcHBpbmc7CisKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9yY2I7CisJZG1hX2FkZHJfdAkJCXJ4X3JjYl9tYXBwaW5nOworCisJLyogYmVnaW4gImV2ZXJ5dGhpbmcgZWxzZSIgY2FjaGVsaW5lKHMpIHNlY3Rpb24gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHNfcHJldjsKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMJZXN0YXRzOworCXN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cwllc3RhdHNfcHJldjsKKworCXVuc2lnbmVkIGxvbmcJCQlwaHlfY3JjX2Vycm9yczsKKworCXUzMgkJCQlyeF9vZmZzZXQ7CisJdTMyCQkJCXRnM19mbGFnczsKKyNkZWZpbmUgVEczX0ZMQUdfVFhEX01CT1hfSFdCVUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TCQkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRwkweDAwMDAwMDA4CisjZGVmaW5lIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfRkxBR19FTkFCTEVfQVNGCQkweDAwMDAwMDIwCisjZGVmaW5lIFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRwkweDAwMDAwMDQwCisjZGVmaW5lIFRHM19GTEFHX1BPTExfU0VSREVTCQkweDAwMDAwMDgwCisjaWYgZGVmaW5lZChDT05GSUdfWDg2KQorI2RlZmluZSBURzNfRkxBR19NQk9YX1dSSVRFX1JFT1JERVIJMHgwMDAwMDEwMAorI2Vsc2UKKyNkZWZpbmUgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSCTAJLyogZGlzYWJsZXMgY29kZSB0b28gKi8KKyNlbmRpZgorI2RlZmluZSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRwkweDAwMDAwMjAwCisjZGVmaW5lIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQgkweDAwMDAwNDAwCisjZGVmaW5lIFRHM19GTEFHX1dPTF9FTkFCTEUJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QJMHgwMDAwMTAwMAorI2RlZmluZSBURzNfRkxBR19OVlJBTQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUlhfUEFVU0UJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVEczX0ZMQUdfVFhfUEFVU0UJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJWF9NT0RFCQkweDAwMDIwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVECQkweDAwMDQwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSV8zMkJJVAkJMHgwMDA4MDAwMAorI2RlZmluZSBURzNfRkxBR19OT19UWF9QU0VVRE9fQ1NVTQkweDAwMTAwMDAwCisjZGVmaW5lIFRHM19GTEFHX05PX1JYX1BTRVVET19DU1VNCTB4MDAyMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfU0VSREVTX1dPTF9DQVAJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfSlVNQk9fRU5BQkxFCQkweDAwODAwMDAwCisjZGVmaW5lIFRHM19GTEFHXzEwXzEwMF9PTkxZCQkweDAxMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BBVVNFX0FVVE9ORUcJCTB4MDIwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUwkweDEwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTAkweDIwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1NQTElUX01PREUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfSU5JVF9DT01QTEVURQkJMHg4MDAwMDAwMAorCXUzMgkJCQl0ZzNfZmxhZ3MyOworI2RlZmluZSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSCQkweDAwMDAwMDAxCisjZGVmaW5lIFRHM19GTEcyX1NVTl81NzBYCQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVECTB4MDAwMDAwMDQKKyNkZWZpbmUgVEczX0ZMRzJfSVNfNTc4OAkJMHgwMDAwMDAwOAorI2RlZmluZSBURzNfRkxHMl9NQVhfUlhQRU5EXzY0CQkweDAwMDAwMDEwCisjZGVmaW5lIFRHM19GTEcyX1RTT19DQVBBQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIFRHM19GTEcyX1BIWV9BRENfQlVHCQkweDAwMDAwMDQwCisjZGVmaW5lIFRHM19GTEcyX1BIWV81NzA0X0EwX0JVRwkweDAwMDAwMDgwCisjZGVmaW5lIFRHM19GTEcyX1BIWV9CRVJfQlVHCQkweDAwMDAwMTAwCisjZGVmaW5lIFRHM19GTEcyX1BDSV9FWFBSRVNTCQkweDAwMDAwMjAwCisjZGVmaW5lIFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFCTB4MDAwMDA0MDAKKyNkZWZpbmUgVEczX0ZMRzJfSFdfQVVUT05FRwkJMHgwMDAwMDgwMAorI2RlZmluZSBURzNfRkxHMl9QSFlfSlVTVF9JTklUVEVECTB4MDAwMDEwMDAKKyNkZWZpbmUgVEczX0ZMRzJfUEhZX1NFUkRFUwkJMHgwMDAwMjAwMAorI2RlZmluZSBURzNfRkxHMl9DQVBBQ0lUSVZFX0NPVVBMSU5HCTB4MDAwMDQwMDAKKyNkZWZpbmUgVEczX0ZMRzJfRkxBU0gJCQkweDAwMDA4MDAwCisjZGVmaW5lIFRHM19GTEcyX0hXX1RTTwkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX0ZMRzJfU0VSREVTX1BSRUVNUEhBU0lTCTB4MDAwMjAwMDAKKyNkZWZpbmUgVEczX0ZMRzJfNTcwNV9QTFVTCQkweDAwMDQwMDAwCisKKwl1MzIJCQkJc3BsaXRfbW9kZV9tYXhfcmVxczsKKyNkZWZpbmUgU1BMSVRfTU9ERV81NzA0X01BWF9SRVEJCTMKKworCXN0cnVjdCB0aW1lcl9saXN0CQl0aW1lcjsKKwl1MTYJCQkJdGltZXJfY291bnRlcjsKKwl1MTYJCQkJdGltZXJfbXVsdGlwbGllcjsKKwl1MzIJCQkJdGltZXJfb2Zmc2V0OworCXUxNgkJCQlhc2ZfY291bnRlcjsKKwl1MTYJCQkJYXNmX211bHRpcGxpZXI7CisKKwlzdHJ1Y3QgdGczX2xpbmtfY29uZmlnCQlsaW5rX2NvbmZpZzsKKwlzdHJ1Y3QgdGczX2J1Zm1ncl9jb25maWcJYnVmbWdyX2NvbmZpZzsKKworCS8qIGNhY2hlIGgvdyB2YWx1ZXMsIG9mdGVuIHBhc3NlZCBzdHJhaWdodCB0byBoL3cgKi8KKwl1MzIJCQkJcnhfbW9kZTsKKwl1MzIJCQkJdHhfbW9kZTsKKwl1MzIJCQkJbWFjX21vZGU7CisJdTMyCQkJCW1pX21vZGU7CisJdTMyCQkJCW1pc2NfaG9zdF9jdHJsOworCXUzMgkJCQlncmNfbW9kZTsKKwl1MzIJCQkJZ3JjX2xvY2FsX2N0cmw7CisJdTMyCQkJCWRtYV9yd2N0cmw7CisJdTMyCQkJCWNvYWxlc2NlX21vZGU7CisKKwkvKiBQQ0kgYmxvY2sgKi8KKwl1MTYJCQkJcGNpX2NoaXBfcmV2X2lkOworCXU4CQkJCXBjaV9jYWNoZWxpbmVfc3o7CisJdTgJCQkJcGNpX2xhdF90aW1lcjsKKwl1OAkJCQlwY2lfaGRyX3R5cGU7CisJdTgJCQkJcGNpX2Jpc3Q7CisKKwlpbnQJCQkJcG1fY2FwOworCisJLyogUEhZIGluZm8gKi8KKwl1MzIJCQkJcGh5X2lkOworI2RlZmluZSBQSFlfSURfTUFTSwkJCTB4ZmZmZmZmZjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MDAJCQkweDYwMDA4MDQwCisjZGVmaW5lIFBIWV9JRF9CQ001NDAxCQkJMHg2MDAwODA1MAorI2RlZmluZSBQSFlfSURfQkNNNTQxMQkJCTB4NjAwMDgwNzAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDEJCQkweDYwMDA4MTEwCisjZGVmaW5lIFBIWV9JRF9CQ001NzAzCQkJMHg2MDAwODE2MAorI2RlZmluZSBQSFlfSURfQkNNNTcwNAkJCTB4NjAwMDgxOTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDUJCQkweDYwMDA4MWEwCisjZGVmaW5lIFBIWV9JRF9CQ001NzUwCQkJMHg2MDAwODE4MAorI2RlZmluZSBQSFlfSURfQkNNODAwMgkJCTB4NjAwMTAxNDAKKyNkZWZpbmUgUEhZX0lEX0lOVkFMSUQJCQkweGZmZmZmZmZmCisjZGVmaW5lIFBIWV9JRF9SRVZfTUFTSwkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0IwCQkweDEKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0IyCQkweDMKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0MwCQkweDYKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDExX1gwCQkweDEgLyogRm91bmQgb24gTmV0Z2VhciBHQTMwMlQgKi8KKworCXUzMgkJCQlsZWRfY3RybDsKKworCWNoYXIJCQkJYm9hcmRfcGFydF9udW1iZXJbMjRdOworCXUzMgkJCQluaWNfc3JhbV9kYXRhX2NmZzsKKwl1MzIJCQkJcGNpX2Nsb2NrX2N0cmw7CisJc3RydWN0IHBjaV9kZXYJCQkqcGRldl9wZWVyOworCisJLyogVGhpcyBtYWNybyBhc3N1bWVzIHRoZSBwYXNzZWQgUEhZIElEIGlzIGFscmVhZHkgbWFza2VkCisJICogd2l0aCBQSFlfSURfTUFTSy4KKwkgKi8KKyNkZWZpbmUgS05PV05fUEhZX0lEKFgpCQlcCisJKChYKSA9PSBQSFlfSURfQkNNNTQwMCB8fCAoWCkgPT0gUEhZX0lEX0JDTTU0MDEgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU0MTEgfHwgKFgpID09IFBIWV9JRF9CQ001NzAxIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NzAzIHx8IChYKSA9PSBQSFlfSURfQkNNNTcwNCB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTcwNSB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3NTAgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTgwMDIpCisKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzCQkqaHdfc3RhdHM7CisJZG1hX2FkZHJfdAkJCXN0YXRzX21hcHBpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0CQlyZXNldF90YXNrOworCisJdTMyCQkJCW52cmFtX3NpemU7CisJdTMyCQkJCW52cmFtX3BhZ2VzaXplOworCXUzMgkJCQludnJhbV9qZWRlY251bTsKKworI2RlZmluZSBKRURFQ19BVE1FTAkJCTB4MWYKKyNkZWZpbmUgSkVERUNfU1QJCQkweDIwCisjZGVmaW5lIEpFREVDX1NBSUZVTgkJCTB4NGYKKyNkZWZpbmUgSkVERUNfU1NUCQkJMHhiZgorCisjZGVmaW5lIEFUTUVMX0FUMjRDNjRfQ0hJUF9TSVpFCQkoNjQgKiAxMDI0KQorI2RlZmluZSBBVE1FTF9BVDI0QzY0X1BBR0VfU0laRQkJKDMyKQorCisjZGVmaW5lIEFUTUVMX0FUMjRDNTEyX0NISVBfU0laRQkoNTEyICogMTAyNCkKKyNkZWZpbmUgQVRNRUxfQVQyNEM1MTJfUEFHRV9TSVpFCSgxMjgpCisKKyNkZWZpbmUgQVRNRUxfQVQ0NURCMFgxQl9QQUdFX1BPUwk5CisjZGVmaW5lIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9TSVpFCTI2NAorCisjZGVmaW5lIEFUTUVMX0FUMjVGNTEyX1BBR0VfU0laRQkyNTYKKworI2RlZmluZSBTVF9NNDVQRVgwX1BBR0VfU0laRQkJMjU2CisKKyNkZWZpbmUgU0FJRlVOX1NBMjVGMFhYX1BBR0VfU0laRQkyNTYKKworI2RlZmluZSBTU1RfMjVWRjBYMF9QQUdFX1NJWkUJCTQwOTgKKworCit9OworCisjZW5kaWYgLyogIShfVDNfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uYyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZmYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5jCkBAIC0wLDAgKzEsMzMwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgTGludXggVGh1bmRlckxBTiBEcml2ZXIKKyAqCisgKiAgdGxhbi5jCisgKiAgYnkgSmFtZXMgQmFua3MKKyAqCisgKiAgKEMpIDE5OTctMTk5OCBDYWxkZXJhLCBJbmMuCisgKiAgKEMpIDE5OTggSmFtZXMgQmFua3MKKyAqICAoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KKyAqICAoQykgMjAwMiBTYW11ZWwgQ2hlc3NtYW4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoqIFRoaXMgZmlsZSBpcyBiZXN0IHZpZXdlZC9lZGl0ZWQgd2l0aCBjb2x1bW5zPj0xMzIuCisgKgorICoqIFVzZWZ1bCAoaWYgbm90IHJlcXVpcmVkKSByZWFkaW5nOgorICoKKyAqCQlUZXhhcyBJbnN0cnVtZW50cywgVGh1bmRlckxBTiBQcm9ncmFtbWVyJ3MgR3VpZGUsCisgKgkJCVRJIExpdGVyYXR1cmUgTnVtYmVyIFNQV1UwMTNBCisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LnRpLmNvbQorICoJCUxldmVsIE9uZSwgTFhUOTAxIGFuZCBMWFQ5NzAgRGF0YSBTaGVldHMKKyAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubGV2ZWwxLmNvbQorICoJCU5hdGlvbmFsIFNlbWljb25kdWN0b3IsIERQODM4NDBBIERhdGEgU2hlZXQKKyAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubmF0aW9uYWwuY29tCisgKgkJTWljcm9jaGlwIFRlY2hub2xvZ3ksIDI0QzAxQS8wMkEvMDRBIERhdGEgU2hlZXQKKyAqCQkJYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgZnJvbSB3d3cubWljcm9jaGlwLmNvbQorICoKKyAqIENoYW5nZSBIaXN0b3J5CisgKgorICoJVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT46CVRMYW5fUGNpUHJvYmUoKSBub3cgdXNlcworICoJCQkJCQluZXcgUENJIEJJT1MgaW50ZXJmYWNlLgorICoJQWxhbiBDb3gJPGFsYW5AcmVkaGF0LmNvbT46CUZpeGVkIHRoZSBvdXQgb2YgbWVtb3J5CisgKgkJCQkJCWhhbmRsaW5nLgorICogICAgICAKKyAqCVRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4gTmV3IE1haW50YWluZXIhCisgKgorICoJdjEuMSBEZWMgMjAsIDE5OTkgICAgLSBSZW1vdmVkIGxpbnV4IHZlcnNpb24gY2hlY2tpbmcKKyAqCQkJICAgICAgIFBhdGNoIGZyb20gVGlncmFuIEFpdmF6aWFuLiAKKyAqCQkJICAgICAtIHYxLjEgaW5jbHVkZXMgQWxhbidzIFNNUCB1cGRhdGVzLgorICoJCQkgICAgIC0gV2Ugc3RpbGwgaGF2ZSBwcm9ibGVtcyBvbiBTTVAgdGhvdWdoLAorICoJCQkgICAgICAgYnV0IEknbSBsb29raW5nIGludG8gdGhhdC4gCisgKgkJCQorICoJdjEuMiBKYW4gMDIsIDIwMDAgICAgLSBIb3BlZnVsbHkgZml4ZWQgdGhlIFNNUCBkZWFkbG9jay4KKyAqCQkJICAgICAtIFJlbW92ZWQgZGVwZW5kZW5jeSBvZiBIWiBiZWluZyAxMDAuCisgKgkJCSAgICAgLSBXZSBub3cgYWxsb3cgaGlnaGVyIHByaW9yaXR5IHRpbWVycyB0byAKKyAqCQkJICAgICAgIG92ZXJ3cml0ZSB0aW1lcnMgbGlrZSBUTEFOX1RJTUVSX0FDVElWSVRZCisgKgkJCSAgICAgICBQYXRjaCBmcm9tIEpvaG4gQ2FnbGUgPGpvaG4uY2FnbGVAY29tcGFxLmNvbT4uCisgKgkJCSAgICAgLSBGaXhlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncy4KKyAqCisgKgl2MS4zIEZlYiAwNCwgMjAwMCAgICAtIEZpeGVkIHRoZSByZW1haW5pbmcgSFogaXNzdWVzLgorICoJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIHBjaV9wcmVzZW50KCkuIAorICoJCQkgICAgIC0gUmVtb3ZlZCBTQV9JTlRFUlJVUFQgZmxhZyBmcm9tIGlycSBoYW5kbGVyLgorICoJCQkgICAgIC0gQWRkZWQgX19pbml0IGFuZCBfX2luaXRkYXRhIHRvIHJlZHVjZSByZXNpc2RlbnQgCisgKgkJCSAgICAgICBjb2RlIHNpemUuCisgKgkJCSAgICAgLSBEcml2ZXIgbm93IHVzZXMgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQuCisgKgkJCSAgICAgLSBSZXdyb3RlIGluaXRfbW9kdWxlIGFuZCB0bGFuX3Byb2JlIHRvCisgKgkJCSAgICAgICBzaGFyZSBhIGxvdCBtb3JlIGNvZGUuIFdlIG5vdyB1c2UgdGxhbl9wcm9iZQorICoJCQkgICAgICAgd2l0aCBidWlsdGluIGFuZCBtb2R1bGUgZHJpdmVyLgorICoJCQkgICAgIC0gRHJpdmVyIHBvcnRlZCB0byBuZXcgbmV0IEFQSS4gCisgKgkJCSAgICAgLSB0bGFuLnR4dCBoYXMgYmVlbiByZXdvcmtlZCB0byByZWZsZWN0IGN1cnJlbnQgCisgKgkJCSAgICAgICBkcml2ZXIgKGFsbW9zdCkKKyAqCQkJICAgICAtIE90aGVyIG1pbm9yIHN0dWZmCisgKgorICoJdjEuNCBGZWIgMTAsIDIwMDAgICAgLSBVcGRhdGVkIHdpdGggbW9yZSBjaGFuZ2VzIHJlcXVpcmVkIGFmdGVyIERhdmUncworICoJICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGNsZWFudXAgaW4gMi4zLjQzcHJlNyAoVGlncmFuICYgbXlzZWxmKQorICoJICAgICAgICAgICAgICAgICAgICAgLSBNaW5vciBzdHVmZi4KKyAqCisgKgl2MS41IE1hcmNoIDIyLCAyMDAwICAtIEZpeGVkIGFub3RoZXIgdGltZXIgYnVnIHRoYXQgd291bGQgaGFuZyB0aGUgZHJpdmVyCisgKgkJCSAgICAgICBpZiBubyBjYWJsZS9saW5rIHdlcmUgcHJlc2VudC4KKyAqCQkJICAgICAtIENvc21ldGljIGNoYW5nZXMuCisgKgkJCSAgICAgLSBUT0RPOiBQb3J0IGNvbXBsZXRlbHkgdG8gbmV3IFBDSS9ETUEgQVBJCisgKgkJCSAgICAgCSAgICAgQXV0by1OZWcgZmFsbGJhY2suCisgKgorICogCXYxLjYgQXByaWwgMDQsIDIwMDAgIC0gRml4ZWQgZHJpdmVyIHN1cHBvcnQgZm9yIGtlcm5lbC1wYXJhbWV0ZXJzLiBIYXZlbid0CisgKiAJCQkgICAgICAgdGVzdGVkIGl0IHRob3VnaCwgYXMgdGhlIGtlcm5lbCBzdXBwb3J0IGlzIGN1cnJlbnRseSAKKyAqIAkJCSAgICAgICBicm9rZW4gKDIuMy45OXA0cDMpLgorICogCQkJICAgICAtIFVwZGF0ZWQgdGxhbi50eHQgYWNjb3JkaW5nbHkuCisgKiAJCQkgICAgIC0gQWRqdXN0ZWQgbWluaW11bS9tYXhpbXVtIGZyYW1lIGxlbmd0aC4KKyAqIAkJCSAgICAgLSBUaGVyZSBpcyBub3cgYSBUTEFOIHdlYnNpdGUgdXAgYXQgCisgKiAJCQkgICAgICAgaHR0cDovL3RsYW4ua2VybmVsLmRrCisgKgorICogCXYxLjcgQXByaWwgMDcsIDIwMDAgIC0gU3RhcnRlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGlvY3Rscy4gRHJpdmVyIG5vdworICogCQkJICAgICAgIHJlcG9ydHMgUEhZIGluZm9ybWF0aW9uIHdoZW4gdXNlZCB3aXRoIERvbmFsZAorICogCQkJICAgICAgIEJlY2tlcnMgdXNlcnNwYWNlIE1JSSBkaWFnbm9zdGljcyB1dGlsaXR5LgorICoKKyAqIAl2MS44IEFwcmlsIDIzLCAyMDAwICAtIEZpeGVkIHN1cHBvcnQgZm9yIGZvcmNlZCBzcGVlZC9kdXBsZXggc2V0dGluZ3MuCisgKiAJCQkgICAgIC0gQWRkZWQgbGluayBpbmZvcm1hdGlvbiB0byBBdXRvLU5lZyBhbmQgZm9yY2VkCisgKiAJCQkgICAgICAgbW9kZXMuIFdoZW4gTklDIG9wZXJhdGVzIHdpdGggYXV0by1uZWcgdGhlIGRyaXZlcgorICogCQkJICAgICAgIHdpbGwgcmVwb3J0IExpbmsgc3BlZWQgJiBkdXBsZXggbW9kZXMgYXMgd2VsbCBhcworICogCQkJICAgICAgIGxpbmsgcGFydG5lciBhYmlsaXRpZXMuIFdoZW4gZm9yY2VkIGxpbmsgaXMgdXNlZCwKKyAqIAkJCSAgICAgICB0aGUgZHJpdmVyIHdpbGwgcmVwb3J0IHN0YXR1cyBvZiB0aGUgZXN0YWJsaXNoZWQKKyAqIAkJCSAgICAgICBsaW5rLgorICogCQkJICAgICAgIFBsZWFzZSByZWFkIHRsYW4udHh0IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAKKyAqIAkJCSAgICAgLSBSZW1vdmVkIGNhbGwgdG8gY2hlY2tfcmVnaW9uKCksIGFuZCB1c2VkIAorICogCQkJICAgICAgIHJldHVybiB2YWx1ZSBvZiByZXF1ZXN0X3JlZ2lvbigpIGluc3RlYWQuCisgKgkKKyAqCXYxLjhhIE1heSAyOCwgMjAwMCAgIC0gTWlub3IgdXBkYXRlcy4KKyAqCisgKgl2MS45IEp1bHkgMjUsIDIwMDAgICAtIEZpeGVkIGEgZmV3IHJlbWFpbmluZyBGdWxsLUR1cGxleCBpc3N1ZXMuCisgKgkgICAgICAgICAgICAgICAgICAgICAtIFVwZGF0ZWQgd2l0aCB0aW1lciBmaXhlcyBmcm9tIEFuZHJldyBNb3J0b24uCisgKgkgICAgICAgICAgICAgICAgICAgICAtIEZpeGVkIG1vZHVsZSByYWNlIGluIFRMYW5fT3Blbi4KKyAqCSAgICAgICAgICAgICAgICAgICAgIC0gQWRkZWQgcm91dGluZSB0byBtb25pdG9yIFBIWSBzdGF0dXMuCisgKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIGFjdGl2aXR5IGxlZCBzdXBwb3J0IGZvciBQcm9saWFudCBkZXZpY2VzLgorICoKKyAqCXYxLjEwIEF1ZyAzMCwgMjAwMCAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgRUlTQSBiYXNlZCB0bGFuIGNvbnRyb2xsZXJzIAorICoJCQkgICAgICAgbGlrZSB0aGUgQ29tcGFxIE5ldEZsZXgzL0UuIAorICoJCQkgICAgIC0gUmV3cm90ZSB0bGFuX3Byb2JlIHRvIGJldHRlciBoYW5kbGUgbXVsdGlwbGUKKyAqCQkJICAgICAgIGJ1cyBwcm9iZXMuIFByb2JpbmcgYW5kIGRldmljZSBzZXR1cCBpcyBub3cKKyAqCQkJICAgICAgIGRvbmUgdGhyb3VnaCBUTGFuX1Byb2JlIGFuZCBUTGFuX2luaXRfb25lLiBBY3R1YWwKKyAqCQkJICAgICAgIGhhcmR3YXJlIHByb2JlIGlzIGRvbmUgd2l0aCBrZXJuZWwgQVBJIGFuZCAKKyAqCQkJICAgICAgIFRMYW5fRWlzYVByb2JlLgorICoJCQkgICAgIC0gQWRqdXN0ZWQgZGVidWcgaW5mb3JtYXRpb24gZm9yIHByb2JpbmcuCisgKgkJCSAgICAgLSBGaXhlZCBidWcgdGhhdCB3b3VsZCBjYXVzZSBnZW5lcmFsIGRlYnVnIGluZm9ybWF0aW9uIAorICoJCQkgICAgICAgdG8gYmUgcHJpbnRlZCBhZnRlciBkcml2ZXIgcmVtb3ZhbC4gCisgKgkJCSAgICAgLSBBZGRlZCB0cmFuc21pdCB0aW1lb3V0IGhhbmRsaW5nLgorICoJCQkgICAgIC0gRml4ZWQgT09NIHJldHVybiB2YWx1ZXMgaW4gdGxhbl9wcm9iZS4gCisgKgkJCSAgICAgLSBGaXhlZCBwb3NzaWJsZSBtZW0gbGVhayBpbiB0bGFuX2V4aXQgCisgKgkJCSAgICAgICAobm93IHRsYW5fcmVtb3ZlX29uZSkuCisgKgkJCSAgICAgLSBGaXhlZCB0aW1lciBidWcgaW4gVExhbl9waHlNb25pdG9yLgorICoJCQkgICAgIC0gVGhpcyBkcml2ZXIgdmVyc2lvbiBpcyBhbHBoYSBxdWFsaXR5LCBwbGVhc2UKKyAqCQkJICAgICAgIHNlbmQgbWUgYW55IGJ1ZyBpc3N1ZXMgeW91IG1heSBlbmNvdW50ZXIuCisgKgorICoJdjEuMTEgQXVnIDMxLCAyMDAwICAgLSBEbyBub3QgdHJ5IHRvIHJlZ2lzdGVyIGlycSAwIGlmIG5vIGlycSBsaW5lIHdhcyAKKyAqCQkJICAgICAgIHNldCBmb3IgRUlTQSBjYXJkcy4KKyAqCQkJICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIE5ldEZsZXgzL0Ugd2l0aCBuaWJibGUtcmF0ZQorICoJCQkgICAgICAgMTBCYXNlLVQgUEhZLiBUaGlzIGlzIHVudGVzdGV0IGFzIEkgaGF2ZW4ndCBnb3QKKyAqCQkJICAgICAgIG9uZSBvZiB0aGVzZSBjYXJkcy4KKyAqCQkJICAgICAtIEZpeGVkIHRpbWVyIGJlaW5nIGFkZGVkIHR3aWNlLgorICoJCQkgICAgIC0gRGlzYWJsZWQgUGh5TW9uaXRvcmluZyBieSBkZWZhdWx0IGFzIHRoaXMgaXMKKyAqCQkJICAgICAgIHdvcmsgaW4gcHJvZ3Jlc3MuIERlZmluZSBNT05JVE9SIHRvIGVuYWJsZSBpdC4KKyAqCQkJICAgICAtIE5vdyB3ZSBkb24ndCBkaXNwbGF5IGxpbmsgaW5mbyB3aXRoIFBIWXMgdGhhdAorICoJCQkgICAgICAgZG9lc24ndCBzdXBwb3J0IGl0IChsZXZlbDEpLgorICoJCQkgICAgIC0gSW5jcmVzZWQgdHhfdGltZW91dCBiZWFjdXNlIG9mIGF1dG8tbmVnLgorICoJCQkgICAgIC0gQWRqdXN0ZWQgdGltZXJzIGZvciBmb3JjZWQgc3BlZWRzLgorICoKKyAqCXYxLjEyIE9jdCAxMiwgMjAwMCAgIC0gTWlub3IgZml4ZXMgKG1lbWxlYWssIGluaXQsIGV0Yy4pCisgKgorICogCXYxLjEzIE5vdiAyOCwgMjAwMCAgIC0gU3RvcCBmbG9vZGluZyBjb25zb2xlIHdpdGggYXV0by1uZWcgaXNzdWVzCisgKiAJCQkgICAgICAgd2hlbiBsaW5rIGNhbid0IGJlIGVzdGFibGlzaGVkLgorICoJCQkgICAgIC0gQWRkZWQgdGhlIGJidWYgb3B0aW9uIGFzIGEga2VybmVsIHBhcmFtZXRlci4KKyAqCQkJICAgICAtIEZpeGVkIGlvYWRkciBwcm9iZSBidWcuCisgKgkJCSAgICAgLSBGaXhlZCBzdHVwaWQgZGVhZGxvY2sgd2l0aCBNSUkgaW50ZXJydXB0cy4KKyAqCQkJICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWVkL2R1cGxleCBzZWxlY3Rpb24gd2l0aCAKKyAqCQkJICAgICAgIG11bHRpcGxlIG5pY3MuCisgKgkJCSAgICAgLSBBZGRlZCBwYXJ0bHkgZml4IGZvciBUWCBDaGFubmVsIGxvY2t1cCB3aXRoCisgKgkJCSAgICAgICBUTEFOIHYxLjAgc2lsaWNvbi4gVGhpcyBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQKKyAqCQkJICAgICAgIGZ1cnRoZXIuCisgKgorICogCXYxLjE0IERlYyAxNiwgMjAwMCAgIC0gQWRkZWQgc3VwcG9ydCBmb3Igc2VydmljaW5nIG11bHRpcGxlIGZyYW1lcyBwZXIuCisgKiAJCQkgICAgICAgaW50ZXJydXB0LiBUaGFua3MgZ29lcyB0bworICogCQkJICAgICAgIEFkYW0gS2V5cyA8YWRhbUB0aS5jb20+CisgKiAJCQkgICAgICAgRGVuaXMgQmVhdWRvaW4gPGRiZWF1ZG9pbkB0aS5jb20+CisgKiAJCQkgICAgICAgZm9yIHByb3ZpZGluZyB0aGUgcGF0Y2guCisgKiAJCQkgICAgIC0gRml4ZWQgYXV0by1uZWcgb3V0cHV0IHdoZW4gdXNpbmcgbXVsdGlwbGUKKyAqIAkJCSAgICAgICBhZGFwdGVycy4KKyAqIAkJCSAgICAgLSBDb252ZXJ0ZWQgdG8gdXNlIG5ldyB0YXNrcSBpbnRlcmZhY2UuCisgKgorICogCXYxLjE0YSBKYW4gNiwgMjAwMSAgIC0gTWlub3IgYWRqdXN0bWVudHMgKHNwaW5sb2NrcywgZXRjLikKKyAqCisgKglTYW11ZWwgQ2hlc3NtYW4gPGNoZXNzbWFuQHR1eC5vcmc+IE5ldyBNYWludGFpbmVyIQorICoKKyAqCXYxLjE1IEFwciA0LCAyMDAyICAgIC0gQ29ycmVjdCBvcGVyYXRpb24gd2hlbiBhdWk9MSB0byBiZQorICoJICAgICAgICAgICAgICAgICAgICAgICAxMFQgaGFsZiBkdXBsZXggbm8gbG9vcGJhY2sKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIEd1bm5hciBFaWttYW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKworI2luY2x1ZGUgInRsYW4uaCIKKwordHlwZWRlZiB1MzIgKFRMYW5JbnRWZWN0b3JGdW5jKSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CisKKworLyogRm9yIHJlbW92aW5nIEVJU0EgZGV2aWNlcyAqLworc3RhdGljCXN0cnVjdCBuZXRfZGV2aWNlCSpUTGFuX0Vpc2FfRGV2aWNlczsKKworc3RhdGljCWludAkJVExhbkRldmljZXNJbnN0YWxsZWQ7CisKKy8qIFNldCBzcGVlZCwgZHVwbGV4IGFuZCBhdWkgc2V0dGluZ3MgKi8KK3N0YXRpYyAgaW50IGF1aVtNQVhfVExBTl9CT0FSRFNdOworc3RhdGljICBpbnQgZHVwbGV4W01BWF9UTEFOX0JPQVJEU107CitzdGF0aWMgIGludCBzcGVlZFtNQVhfVExBTl9CT0FSRFNdOworc3RhdGljICBpbnQgYm9hcmRzX2ZvdW5kOworCitNT0RVTEVfQVVUSE9SKCJNYWludGFpbmVyOiBTYW11ZWwgQ2hlc3NtYW4gPGNoZXNzbWFuQHR1eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgVEkgVGh1bmRlckxBTiBiYXNlZCBldGhlcm5ldCBQQ0kgYWRhcHRlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiBEZWZpbmUgdGhpcyB0byBlbmFibGUgTGluayBiZWF0IG1vbml0b3JpbmcgKi8KKyN1bmRlZiBNT05JVE9SCisKKy8qIFR1cm4gb24gZGVidWdnaW5nLiBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RsYW4udHh0IGZvciBkZXRhaWxzICovCitzdGF0aWMgIGludAkJZGVidWc7CisKK3N0YXRpYwlpbnQJCWJidWY7CitzdGF0aWMJdTgJCSpUTGFuUGFkQnVmZmVyOworc3RhdGljICBkbWFfYWRkcl90CVRMYW5QYWRCdWZmZXJETUE7CitzdGF0aWMJY2hhcgkJVExhblNpZ25hdHVyZVtdID0gIlRMQU4iOworc3RhdGljICBjb25zdCBjaGFyIHRsYW5fYmFubmVyW10gPSAiVGh1bmRlckxBTiBkcml2ZXIgdjEuMTVcbiI7CitzdGF0aWMgIGludCB0bGFuX2hhdmVfcGNpOworc3RhdGljICBpbnQgdGxhbl9oYXZlX2Vpc2E7CisKK3N0YXRpYyBjb25zdCBjaGFyICptZWRpYVtdID0geworCSIxMEJhc2VULUhEICIsICIxMEJhc2VULUZEICIsIjEwMGJhc2VUeC1IRCAiLCAKKwkiMTAwYmFzZVR4LUZEIiwgIjEwMGJhc2VUNCIsIE5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYm9hcmQgeworCWNvbnN0IGNoYXIJKmRldmljZUxhYmVsOworCXUzMgkgICAJZmxhZ3M7CisJdTE2CSAgIAlhZGRyT2ZzOworfSBib2FyZF9pbmZvW10gPSB7CisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQgUENJIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIEludGVncmF0ZWQgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBFbWJlZGRlZCBVVFAiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIk9saWNvbSBPQy0yMTgzLzIxODUiLCBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHg4MyB9LAorCXsgIk9saWNvbSBPQy0yMzI1IiwgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFksIDB4RjggfSwKKwl7ICJPbGljb20gT0MtMjMyNiIsIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweEY4IH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgfCAJLyogRUlTQSBjYXJkICovCisJICAgICAgICAgICAgICAgICAgICAgICAgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgfCBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZLCAweDgzIH0sCQorCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwgLyogRUlTQSBjYXJkICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGxhbl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURkxFWDNJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfVEhVTkRFUiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMyB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEZMRVgzQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwUEksCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDUgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMEQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDYgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMEksCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDcgfSwKKwl7IFBDSV9WRU5ET1JfSURfT0xJQ09NLCBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDggfSwKKwl7IFBDSV9WRU5ET1JfSURfT0xJQ09NLCBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDkgfSwKKwl7IFBDSV9WRU5ET1JfSURfT0xJQ09NLCBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF8xMDBfV1NfNTEwMCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTEgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwX1QyLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMiB9LAorCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRsYW5fcGNpX3RibCk7CQkKKworc3RhdGljIHZvaWQJVExhbl9FaXNhUHJvYmUoIHZvaWQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fRWlzYV9DbGVhbnVwKCB2b2lkICk7CitzdGF0aWMgaW50ICAgICAgVExhbl9Jbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50CVRMYW5fT3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludAlUTGFuX1N0YXJ0VHgoIHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlycXJldHVybl90IFRMYW5fSGFuZGxlSW50ZXJydXB0KCBpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50CVRMYW5fQ2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdAluZXRfZGV2aWNlX3N0YXRzICpUTGFuX0dldFN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkCVRMYW5fU2V0TXVsdGljYXN0TGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50CVRMYW5faW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCAgICAgIFRMYW5fcHJvYmUxKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgbG9uZyBpb2FkZHIsIGludCBpcnEsIGludCByZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQJVExhbl90eF90aW1lb3V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRsYW5faW5pdF9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworc3RhdGljIHUzMglUTGFuX0hhbmRsZUludmFsaWQoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9GKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3coIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVJ4RU9GKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVEdW1teSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlVHhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVN0YXR1c0NoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgKTsKKworc3RhdGljIHZvaWQJVExhbl9SZXNldExpc3RzKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX0ZyZWVMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QcmludERpbyggdTE2ICk7CitzdGF0aWMgdm9pZAlUTGFuX1ByaW50TGlzdCggVExhbkxpc3QgKiwgY2hhciAqLCBpbnQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCApOworc3RhdGljIHZvaWQJVExhbl9SZXNldEFkYXB0ZXIoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fRmluaXNoUmVzZXQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fU2V0TWFjKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgYXJlZywgY2hhciAqbWFjICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fUGh5UHJpbnQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5RGV0ZWN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeVBvd2VyRG93biggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlclVwKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeVJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeVN0YXJ0TGluayggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlGaW5pc2hBdXRvTmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisjaWZkZWYgTU9OSVRPUgorc3RhdGljIHZvaWQgICAgIFRMYW5fUGh5TW9uaXRvciggc3RydWN0IG5ldF9kZXZpY2UgKiApOworI2VuZGlmCisKKy8qCitzdGF0aWMgaW50CVRMYW5fUGh5Tm9wKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50CVRMYW5fUGh5SW50ZXJuYWxDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsU2VydmljZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX1BoeURwODM4NDBhQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyovCisKK3N0YXRpYyBpbnQJVExhbl9NaWlSZWFkUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fTWlpU2VuZERhdGEoIHUxNiwgdTMyLCB1bnNpZ25lZCApOworc3RhdGljIHZvaWQJVExhbl9NaWlTeW5jKCB1MTYgKTsKK3N0YXRpYyB2b2lkCVRMYW5fTWlpV3JpdGVSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiwgdTE2LCB1MTYgKTsKKworc3RhdGljIHZvaWQJVExhbl9FZVNlbmRTdGFydCggdTE2ICk7CitzdGF0aWMgaW50CVRMYW5fRWVTZW5kQnl0ZSggdTE2LCB1OCwgaW50ICk7CitzdGF0aWMgdm9pZAlUTGFuX0VlUmVjZWl2ZUJ5dGUoIHUxNiwgdTggKiwgaW50ICk7CitzdGF0aWMgaW50CVRMYW5fRWVSZWFkQnl0ZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTgsIHU4ICogKTsKKworCitzdGF0aWMgdm9pZCAKK1RMYW5fU3RvcmVTS0IoIHN0cnVjdCB0bGFuX2xpc3RfdGFnICp0YWcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpc2tiOworCXRhZy0+YnVmZmVyWzldLmFkZHJlc3MgPSAodTMyKWFkZHI7CisJYWRkciA+Pj0gMzE7CS8qID4+PSAzMiBpcyB1bmRlZmluZWQgZm9yIDMyYml0IGFyY2gsIHN0dXBpZCBDICovCisJYWRkciA+Pj0gMTsKKwl0YWctPmJ1ZmZlcls4XS5hZGRyZXNzID0gKHUzMilhZGRyOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorVExhbl9HZXRTS0IoIHN0cnVjdCB0bGFuX2xpc3RfdGFnICp0YWcpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gdGFnLT5idWZmZXJbOF0uYWRkcmVzczsKKwlhZGRyIDw8PSAzMTsKKwlhZGRyIDw8PSAxOworCWFkZHIgfD0gdGFnLT5idWZmZXJbOV0uYWRkcmVzczsKKwlyZXR1cm4gKHN0cnVjdCBza19idWZmICopIGFkZHI7Cit9CisKKworc3RhdGljIFRMYW5JbnRWZWN0b3JGdW5jICpUTGFuSW50VmVjdG9yW1RMQU5fSU5UX05VTUJFUl9PRl9JTlRTXSA9IHsKKwlUTGFuX0hhbmRsZUludmFsaWQsCisJVExhbl9IYW5kbGVUeEVPRiwKKwlUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdywKKwlUTGFuX0hhbmRsZVJ4RU9GLAorCVRMYW5fSGFuZGxlRHVtbXksCisJVExhbl9IYW5kbGVUeEVPQywKKwlUTGFuX0hhbmRsZVN0YXR1c0NoZWNrLAorCVRMYW5fSGFuZGxlUnhFT0MKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorVExhbl9TZXRUaW1lciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRpY2tzLCB1MzIgdHlwZSApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCAmJgorCQlwcml2LT50aW1lclR5cGUgIT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsgCisJCWlmICghaW5faXJxKCkpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwlwcml2LT50aW1lclR5cGUgPSB0eXBlOworCW1vZF90aW1lcigmcHJpdi0+dGltZXIsIGppZmZpZXMgKyB0aWNrcyk7CisJCit9IC8qIFRMYW5fU2V0VGltZXIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgUHJpbWFyeSBGdW5jdGlvbnMKKworCVRoZXNlIGZ1bmN0aW9ucyBhcmUgbW9yZSBvciBsZXNzIGNvbW1vbiB0byBhbGwgTGludXggbmV0d29yayBkcml2ZXJzLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJdGxhbl9yZW1vdmVfb25lCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCU5vbmUKKwkgKgorCSAqCUdvZXMgdGhyb3VnaCB0aGUgVExhbkRldmljZXMgbGlzdCBhbmQgZnJlZXMgdGhlIGRldmljZQorCSAqCXN0cnVjdHMgYW5kIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggZWFjaCBkZXZpY2UgKGxpc3RzCisJICoJYW5kIGJ1ZmZlcnMpLiAgSXQgYWxzbyB1cmVzZXJ2ZXMgdGhlIElPIHBvcnQgcmVnaW9ucworCSAqCWFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldmljZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdGxhbl9yZW1vdmVfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisKKwlpZiAoIHByaXYtPmRtYVN0b3JhZ2UgKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdi0+cGNpRGV2LCBwcml2LT5kbWFTaXplLCBwcml2LT5kbWFTdG9yYWdlLCBwcml2LT5kbWFTdG9yYWdlRE1BICk7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisjZW5kaWYKKwkKKwlmcmVlX25ldGRldiggZGV2ICk7CisJCQorCXBjaV9zZXRfZHJ2ZGF0YSggcGRldiwgTlVMTCApOworfSAKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRsYW5fZHJpdmVyID0geworCS5uYW1lCQk9ICJ0bGFuIiwKKwkuaWRfdGFibGUJPSB0bGFuX3BjaV90YmwsCisJLnByb2JlCQk9IHRsYW5faW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0bGFuX3JlbW92ZV9vbmUpLAkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRsYW5fcHJvYmUodm9pZCkKK3sKKwlzdGF0aWMgaW50CXBhZF9hbGxvY2F0ZWQ7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB0bGFuX2Jhbm5lcik7CisJCisJVExhblBhZEJ1ZmZlciA9ICh1OCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChOVUxMLCBUTEFOX01JTl9GUkFNRV9TSVpFLCAmVExhblBhZEJ1ZmZlckRNQSk7CisKKwlpZiAoVExhblBhZEJ1ZmZlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFkIGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoVExhblBhZEJ1ZmZlciwgMCwgVExBTl9NSU5fRlJBTUVfU0laRSk7CisJcGFkX2FsbG9jYXRlZCA9IDE7CisKKwlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiU3RhcnRpbmcgUENJIFByb2JlLi4uLlxuIik7CisJCisJLyogVXNlIG5ldyBzdHlsZSBQQ0kgcHJvYmluZy4gTm93IHRoZSBrZXJuZWwgd2lsbAorCSAgIGRvIG1vc3Qgb2YgdGhpcyBmb3IgdXMgKi8KKwlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7CisKKwlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiU3RhcnRpbmcgRUlTQSBQcm9iZS4uLi5cbiIpOworCVRMYW5fRWlzYVByb2JlKCk7CisJCQorCXByaW50ayhLRVJOX0lORk8gIlRMQU46ICVkIGRldmljZSVzIGluc3RhbGxlZCwgUENJOiAlZCAgRUlTQTogJWRcbiIsIAorCQkgVExhbkRldmljZXNJbnN0YWxsZWQsIFRMYW5EZXZpY2VzSW5zdGFsbGVkID09IDEgPyAiIiA6ICJzIiwKKwkJIHRsYW5faGF2ZV9wY2ksIHRsYW5faGF2ZV9laXNhKTsKKworCWlmIChUTGFuRGV2aWNlc0luc3RhbGxlZCA9PSAwKSB7CisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdGxhbl9kcml2ZXIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KE5VTEwsIFRMQU5fTUlOX0ZSQU1FX1NJWkUsIFRMYW5QYWRCdWZmZXIsIFRMYW5QYWRCdWZmZXJETUEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisJCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRsYW5faW5pdF9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBUTGFuX3Byb2JlMSggcGRldiwgLTEsIC0xLCAwLCBlbnQpOworfQorCisKKy8qCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJdGxhbl9wcm9iZTEKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgorCSAqCVBhcm1zOiAKKwkgKgkJbm9uZQorCSAqCisJICoJVGhlIG5hbWUgaXMgbG93ZXIgY2FzZSB0byBmaXQgaW4gd2l0aCBhbGwgdGhlIHJlc3Qgb2YKKwkgKgl0aGUgbmV0Y2FyZF9wcm9iZSBuYW1lcy4gIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIAorCSAqCWFub3RoZXIgVExhbiBiYXNlZCBhZGFwdGVyLCBzZXR0aW5nIGl0IHVwIHdpdGggdGhlCisJICoJYWxsb2NhdGVkIGRldmljZSBzdHJ1Y3QgaWYgb25lIGlzIGZvdW5kLgorCSAqCXRsYW5fcHJvYmUgaGFzIGJlZW4gcG9ydGVkIHRvIHRoZSBuZXcgbmV0IEFQSSBhbmQKKwkgKglub3cgYWxsb2NhdGVzIGl0cyBvd24gZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbgorCSAqCWlzIGFsc28gdXNlZCBieSBtb2R1bGVzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBUTGFuX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgCisJCQkJbG9uZyBpb2FkZHIsIGludCBpcnEsIGludCByZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKQoreworCisJc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7CisJVExhblByaXZhdGVJbmZvICAgICpwcml2OworCXU4CQkgICBwY2lfcmV2OworCXUxNgkJICAgZGV2aWNlX2lkOworCWludAkJICAgcmVnLCByYyA9IC1FTk9ERVY7CisKKwlpZiAocGRldikgeworCQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFRMYW5TaWduYXR1cmUpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IHJlc2VydmUgSU8gcmVnaW9uc1xuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoVExhblByaXZhdGVJbmZvKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCQorCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpdi0+cGNpRGV2ID0gcGRldjsKKwkKKwkvKiBJcyB0aGlzIGEgUENJIGRldmljZT8gKi8KKwlpZiAocGRldikgeworCQl1MzIgCQkgICBwY2lfaW9fYmFzZSA9IDA7CisKKwkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOworCisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIHN1aXRhYmxlIFBDSSBtYXBwaW5nIGF2YWlsYWJsZS5cbiIpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQl9CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKCBwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZwY2lfcmV2KTsKKworCQlmb3IgKCByZWc9IDA7IHJlZyA8PSA1OyByZWcgKysgKSB7CisJCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIHJlZykgJiBJT1JFU09VUkNFX0lPKSB7CisJCQkJcGNpX2lvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmVnKTsKKwkJCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiSU8gbWFwcGluZyBpcyBhdmFpbGFibGUgYXQgJXguXG4iLAorCQkJCQkJcGNpX2lvX2Jhc2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghcGNpX2lvX2Jhc2UpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogTm8gSU8gbWFwcGluZ3MgYXZhaWxhYmxlXG4iKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJfQorCQkKKwkJZGV2LT5iYXNlX2FkZHIgPSBwY2lfaW9fYmFzZTsKKwkJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJCXByaXYtPmFkYXB0ZXJSZXYgPSBwY2lfcmV2OyAKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJfSBlbHNlCXsgICAgIC8qIEVJU0EgY2FyZCAqLworCQkvKiBUaGlzIGlzIGEgaGFjay4gV2UgbmVlZCB0byBrbm93IHdoaWNoIGJvYXJkIHN0cnVjdHVyZQorCQkgKiBpcyBzdWl0ZWQgZm9yIHRoaXMgYWRhcHRlciAqLworCQlkZXZpY2VfaWQgPSBpbncoaW9hZGRyICsgRUlTQV9JRDIpOworCQlwcml2LT5pc19laXNhID0gMTsKKwkJaWYgKGRldmljZV9pZCA9PSAweDIwRjEpIHsKKwkJCXByaXYtPmFkYXB0ZXIgPSAmYm9hcmRfaW5mb1sxM107IAkvKiBOZXRGbGV4LTMvRSAqLworCQkJcHJpdi0+YWRhcHRlclJldiA9IDIzOwkJCS8qIFRMQU4gMi4zICovCisJCX0gZWxzZSB7CisJCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bMTRdOworCQkJcHJpdi0+YWRhcHRlclJldiA9IDEwOwkJCS8qIFRMQU4gMS4wICovCisJCX0KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCS8qIEtlcm5lbCBwYXJhbWV0ZXJzICovCisJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCXByaXYtPmF1aSAgICA9IGRldi0+bWVtX3N0YXJ0ICYgMHgwMTsKKwkJcHJpdi0+ZHVwbGV4ID0gKChkZXYtPm1lbV9zdGFydCAmIDB4MDYpID09IDB4MDYpID8gMCA6IChkZXYtPm1lbV9zdGFydCAmIDB4MDYpID4+IDE7CisJCXByaXYtPnNwZWVkICA9ICgoZGV2LT5tZW1fc3RhcnQgJiAweDE4KSA9PSAweDE4KSA/IDAgOiAoZGV2LT5tZW1fc3RhcnQgJiAweDE4KSA+PiAzOworCQorCQlpZiAocHJpdi0+c3BlZWQgPT0gMHgxKSB7CisJCQlwcml2LT5zcGVlZCA9IFRMQU5fU1BFRURfMTA7CisJCX0gZWxzZSBpZiAocHJpdi0+c3BlZWQgPT0gMHgyKSB7CisJCQlwcml2LT5zcGVlZCA9IFRMQU5fU1BFRURfMTAwOworCQl9CisJCWRlYnVnID0gcHJpdi0+ZGVidWcgPSBkZXYtPm1lbV9lbmQ7CisJfSBlbHNlIHsKKwkJcHJpdi0+YXVpICAgID0gYXVpW2JvYXJkc19mb3VuZF07CisJCXByaXYtPnNwZWVkICA9IHNwZWVkW2JvYXJkc19mb3VuZF07CisJCXByaXYtPmR1cGxleCA9IGR1cGxleFtib2FyZHNfZm91bmRdOworCQlwcml2LT5kZWJ1ZyA9IGRlYnVnOworCX0KKwkKKwkvKiBUaGlzIHdpbGwgYmUgdXNlZCB3aGVuIHdlIGdldCBhbiBhZGFwdGVyIGVycm9yIGZyb20KKwkgKiB3aXRoaW4gb3VyIGlycSBoYW5kbGVyICovCisJSU5JVF9XT1JLKCZwcml2LT50bGFuX3RxdWV1ZSwgKHZvaWQgKikodm9pZCopVExhbl90eF90aW1lb3V0LCBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQorCXJjID0gVExhbl9Jbml0KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IHNldCB1cCBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9vdXRfdW5pbml0OworCX0KKworCQorCVRMYW5EZXZpY2VzSW5zdGFsbGVkKys7CisJYm9hcmRzX2ZvdW5kKys7CisJCisJLyogcGRldiBpcyBOVUxMIGlmIHRoaXMgaXMgYW4gRUlTQSBkZXZpY2UgKi8KKwlpZiAocGRldikKKwkJdGxhbl9oYXZlX3BjaSsrOworCWVsc2UgeworCQlwcml2LT5uZXh0RGV2aWNlID0gVExhbl9FaXNhX0RldmljZXM7CisJCVRMYW5fRWlzYV9EZXZpY2VzID0gZGV2OworCQl0bGFuX2hhdmVfZWlzYSsrOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICJUTEFOOiAlcyBpcnE9JTJkLCBpbz0lMDR4LCAlcywgUmV2LiAlZFxuIiwKKwkJCWRldi0+bmFtZSwKKwkJCShpbnQpIGRldi0+aXJxLAorCQkJKGludCkgZGV2LT5iYXNlX2FkZHIsCisJCQlwcml2LT5hZGFwdGVyLT5kZXZpY2VMYWJlbCwKKwkJCXByaXYtPmFkYXB0ZXJSZXYpOworCXJldHVybiAwOworCitlcnJfb3V0X3VuaW5pdDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaURldiwgcHJpdi0+ZG1hU2l6ZSwgcHJpdi0+ZG1hU3RvcmFnZSwKKwkJCSAgICBwcml2LT5kbWFTdG9yYWdlRE1BICk7CitlcnJfb3V0X2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0X3JlZ2lvbnM6CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChwZGV2KQorCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworI2VuZGlmCitlcnJfb3V0OgorCWlmIChwZGV2KQorCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkIFRMYW5fRWlzYV9DbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXY7CisJCisJd2hpbGUoIHRsYW5faGF2ZV9laXNhICkgeworCQlkZXYgPSBUTGFuX0Vpc2FfRGV2aWNlczsKKwkJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChwcml2LT5kbWFTdG9yYWdlKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaURldiwgcHJpdi0+ZG1hU2l6ZSwgcHJpdi0+ZG1hU3RvcmFnZSwgcHJpdi0+ZG1hU3RvcmFnZURNQSApOworCQl9CisJCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgMHgxMCk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKKwkJVExhbl9FaXNhX0RldmljZXMgPSBwcml2LT5uZXh0RGV2aWNlOworCQlmcmVlX25ldGRldiggZGV2ICk7CisJCXRsYW5faGF2ZV9laXNhLS07CisJfQorfQorCQorCQkKK3N0YXRpYyB2b2lkIF9fZXhpdCB0bGFuX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKKworCWlmICh0bGFuX2hhdmVfZWlzYSkKKwkJVExhbl9FaXNhX0NsZWFudXAoKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoTlVMTCwgVExBTl9NSU5fRlJBTUVfU0laRSwgVExhblBhZEJ1ZmZlciwgVExhblBhZEJ1ZmZlckRNQSk7CisKK30KKworCisvKiBNb2R1bGUgbG9hZGluZy91bmxvYWRpbmcgKi8KK21vZHVsZV9pbml0KHRsYW5fcHJvYmUpOworbW9kdWxlX2V4aXQodGxhbl9leGl0KTsKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAJVExhbl9FaXNhUHJvYmUKKwkgKgorCSAqICAJUmV0dXJuczogMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorCSAqCisJICogIAlQYXJtczoJIE5vbmUKKwkgKgorCSAqCisJICogIAlUaGlzIGZ1bmN0aW9ucyBwcm9iZXMgZm9yIEVJU0EgZGV2aWNlcyBhbmQgY2FsbHMgCisJICogIAlUTGFuX3Byb2JlMSB3aGVuIG9uZSBpcyBmb3VuZC4gCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgIF9faW5pdCBUTGFuX0Vpc2FQcm9iZSAodm9pZCkgCit7CisJbG9uZyAJaW9hZGRyOworCWludCAJcmMgPSAtRU5PREVWOworCWludCAJaXJxOworCXUxNglkZXZpY2VfaWQ7CisKKwlpZiAoIUVJU0FfYnVzKSB7CQorCQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiTm8gRUlTQSBidXMgcHJlc2VudFxuIik7CisJCXJldHVybjsKKwl9CisJCisJLyogTG9vcCB0aHJvdWdoIGFsbCBzbG90cyBvZiB0aGUgRUlTQSBidXMgKi8KKwlmb3IgKGlvYWRkciA9IDB4MTAwMDsgaW9hZGRyIDwgMHg5MDAwOyBpb2FkZHIgKz0gMHgxMDAwKSB7CisJCQorCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsIkVJU0FfSUQgMHglNHg6IDB4JTR4XG4iLCAoaW50KSBpb2FkZHIgKyAweEM4MCwgaW53KGlvYWRkciArIEVJU0FfSUQpKTsJCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwiRUlTQV9JRCAweCU0eDogMHglNHhcbiIsIChpbnQpIGlvYWRkciArIDB4QzgyLCBpbncoaW9hZGRyICsgRUlTQV9JRDIpKTsKKworCisJCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJQcm9iaW5nIGZvciBFSVNBIGFkYXB0ZXIgYXQgSU86IDB4JTR4IDogIiwKKwkJCQkgICAJKGludCkgaW9hZGRyKTsKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgMHgxMCwgVExhblNpZ25hdHVyZSkgPT0gTlVMTCkgCisJCQlnb3RvIG91dDsKKworCQlpZiAoaW53KGlvYWRkciArIEVJU0FfSUQpICE9IDB4MTEwRSkgewkJCisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIDB4MTApOworCQkJZ290byBvdXQ7CisJCX0KKwkJCisJCWRldmljZV9pZCA9IGludyhpb2FkZHIgKyBFSVNBX0lEMik7CisJCWlmIChkZXZpY2VfaWQgIT0gIDB4MjBGMSAmJiBkZXZpY2VfaWQgIT0gMHg0MEYxKSB7IAkJCisJCQlyZWxlYXNlX3JlZ2lvbiAoaW9hZGRyLCAweDEwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCSAJaWYgKGluYihpb2FkZHIgKyBFSVNBX0NSKSAhPSAweDEpIHsgCS8qIENoZWNrIGlmIGFkYXB0ZXIgaXMgZW5hYmxlZCAqLworCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7CisJCQlnb3RvIG91dDI7CisJCX0KKwkJCisJCWlmIChkZWJ1ZyA9PSAweDEwKQkJCisJCQlwcmludGsoIkZvdW5kIG9uZVxuIik7CisKKworCQkvKiBHZXQgaXJxIGZyb20gYm9hcmQgKi8KKwkJc3dpdGNoIChpbmIoaW9hZGRyICsgMHhDQzApKSB7CisJCQljYXNlKDB4MTApOgorCQkJCWlycT01OworCQkJCWJyZWFrOworCQkJY2FzZSgweDIwKToKKwkJCQlpcnE9OTsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHg0MCk6CisJCQkJaXJxPTEwOworCQkJCWJyZWFrOworCQkJY2FzZSgweDgwKToKKwkJCQlpcnE9MTE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0OworCQl9ICAgICAgICAgICAgICAgCisJCQorCQkKKwkJLyogU2V0dXAgdGhlIG5ld2x5IGZvdW5kIGVpc2EgYWRhcHRlciAqLworCQlyYyA9IFRMYW5fcHJvYmUxKCBOVUxMLCBpb2FkZHIsIGlycSwKKwkJCQkJMTIsIE5VTEwpOworCQljb250aW51ZTsKKwkJCisJCW91dDoKKwkJCWlmIChkZWJ1ZyA9PSAweDEwKQorCQkJCXByaW50aygiTm9uZSBmb3VuZFxuIik7CisJCQljb250aW51ZTsKKworCQlvdXQyOglpZiAoZGVidWcgPT0gMHgxMCkKKwkJCQlwcmludGsoIkNhcmQgZm91bmQgYnV0IGl0IGlzIG5vdCBlbmFibGVkLCBza2lwcGluZ1xuIik7CisJCQljb250aW51ZTsKKwkJCisJfQorCit9IC8qIFRMYW5fRWlzYVByb2JlICovCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgVExhbl9Qb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCVRMYW5fSGFuZGxlSW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKwkKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSW5pdAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRldmljZSB0byBiZQorCSAqCQkJaW5pdCdlZC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKwkgKglkZXZpY2Ugc3RydWN0dXJlIGFuZCBkcml2ZXIuICBJdCByZXNlcnZlcyB0aGUgSU8KKwkgKglhZGRyZXNzZXMsIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBsaXN0cyBhbmQgYm91bmNlCisJICoJYnVmZmVycywgcmV0cmlldmVzIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20KKwkgKglhbmQgYXNzaWduZXMgdGhlIGRldmljZSdzIG1ldGhvZHMuCisJICoJCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fSW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJaW50CQlkbWFfc2l6ZTsKKwlpbnQgCQllcnI7CisJaW50CQlpOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdjsKKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmICggYmJ1ZiApIHsKKwkJZG1hX3NpemUgPSAoIFRMQU5fTlVNX1JYX0xJU1RTICsgVExBTl9OVU1fVFhfTElTVFMgKQorCSAgICAgICAgICAgKiAoIHNpemVvZihUTGFuTGlzdCkgKyBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJfSBlbHNlIHsKKwkJZG1hX3NpemUgPSAoIFRMQU5fTlVNX1JYX0xJU1RTICsgVExBTl9OVU1fVFhfTElTVFMgKQorCSAgICAgICAgICAgKiAoIHNpemVvZihUTGFuTGlzdCkgKTsKKwl9CisJcHJpdi0+ZG1hU3RvcmFnZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBjaURldiwgZG1hX3NpemUsICZwcml2LT5kbWFTdG9yYWdlRE1BKTsKKwlwcml2LT5kbWFTaXplID0gZG1hX3NpemU7CisJCisJaWYgKCBwcml2LT5kbWFTdG9yYWdlID09IE5VTEwgKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogIENvdWxkIG5vdCBhbGxvY2F0ZSBsaXN0cyBhbmQgYnVmZmVycyBmb3IgJXMuXG4iLAorCQkJZGV2LT5uYW1lICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIHByaXYtPmRtYVN0b3JhZ2UsIDAsIGRtYV9zaXplICk7CisJcHJpdi0+cnhMaXN0ID0gKFRMYW5MaXN0ICopIAorCQkgICAgICAgKCAoICggKHUzMikgcHJpdi0+ZG1hU3RvcmFnZSApICsgNyApICYgMHhGRkZGRkZGOCApOworCXByaXYtPnJ4TGlzdERNQSA9ICggKCAoICh1MzIpIHByaXYtPmRtYVN0b3JhZ2VETUEgKSArIDcgKSAmIDB4RkZGRkZGRjggKTsKKwlwcml2LT50eExpc3QgPSBwcml2LT5yeExpc3QgKyBUTEFOX05VTV9SWF9MSVNUUzsKKwlwcml2LT50eExpc3RETUEgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogVExBTl9OVU1fUlhfTElTVFM7CisJaWYgKCBiYnVmICkgeworCQlwcml2LT5yeEJ1ZmZlciA9ICh1OCAqKSAoIHByaXYtPnR4TGlzdCArIFRMQU5fTlVNX1RYX0xJU1RTICk7CisJCXByaXYtPnJ4QnVmZmVyRE1BID1wcml2LT50eExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogVExBTl9OVU1fVFhfTElTVFM7CisJCXByaXYtPnR4QnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAoIFRMQU5fTlVNX1JYX0xJU1RTICogVExBTl9NQVhfRlJBTUVfU0laRSApOworCQlwcml2LT50eEJ1ZmZlckRNQSA9IHByaXYtPnJ4QnVmZmVyRE1BICsgKCBUTEFOX05VTV9SWF9MSVNUUyAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwl9CisKKwllcnIgPSAwOworCWZvciAoIGkgPSAwOyAgaSA8IDYgOyBpKysgKQorCQllcnIgfD0gVExhbl9FZVJlYWRCeXRlKCBkZXYsCisJCQkJCSh1OCkgcHJpdi0+YWRhcHRlci0+YWRkck9mcyArIGksCisJCQkJCSh1OCAqKSAmZGV2LT5kZXZfYWRkcltpXSApOworCWlmICggZXJyICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICVzOiBFcnJvciByZWFkaW5nIE1BQyBmcm9tIGVlcHJvbTogJWRcbiIsCisJCQlkZXYtPm5hbWUsCisJCQllcnIgKTsKKwl9CisJZGV2LT5hZGRyX2xlbiA9IDY7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogRGV2aWNlIG1ldGhvZHMgKi8KKwlkZXYtPm9wZW4gPSAmVExhbl9PcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJlRMYW5fU3RhcnRUeDsKKwlkZXYtPnN0b3AgPSAmVExhbl9DbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZUTGFuX0dldFN0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlRMYW5fU2V0TXVsdGljYXN0TGlzdDsKKwlkZXYtPmRvX2lvY3RsID0gJlRMYW5faW9jdGw7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZUTGFuX1BvbGw7CisjZW5kaWYKKwlkZXYtPnR4X3RpbWVvdXQgPSAmVExhbl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJcmV0dXJuIDA7CisKK30gLyogVExhbl9Jbml0ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9PcGVuCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorCSAqCVBhcm1zOgorCSAqCQlkZXYJU3RydWN0dXJlIG9mIGRldmljZSB0byBiZSBvcGVuZWQuCisJICoKKwkgKglUaGlzIHJvdXRpbmUgcHV0cyB0aGUgZHJpdmVyIGFuZCBUTEFOIGFkYXB0ZXIgaW4gYQorCSAqCXN0YXRlIHdoZXJlIGl0IGlzIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KKwkgKglJdCBhbGxvY2F0ZXMgdGhlIElSUSwgcmVzZXRzIGFuZCBicmluZ3MgdGhlIGFkYXB0ZXIKKwkgKglvdXQgb2YgcmVzZXQsIGFuZCBhbGxvd3MgaW50ZXJydXB0cy4gIEl0IGFsc28gZGVsYXlzCisJICoJdGhlIHN0YXJ0dXAgZm9yIGF1dG9uZWdvdGlhdGlvbiBvciBzZW5kcyBhIFJ4IEdPCisJICoJY29tbWFuZCB0byB0aGUgYWRhcHRlciwgYXMgYXBwcm9wcmlhdGUuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9PcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludAkJZXJyOworCQorCXByaXYtPnRsYW5SZXYgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ERUZfUkVWSVNJT04gKTsKKwllcnIgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIFRMYW5fSGFuZGxlSW50ZXJydXB0LCBTQV9TSElSUSwgVExhblNpZ25hdHVyZSwgZGV2ICk7CisJCisJaWYgKCBlcnIgKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogIENhbm5vdCBvcGVuICVzIGJlY2F1c2UgSVJRICVkIGlzIGFscmVhZHkgaW4gdXNlLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSApOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBOT1RFOiBJdCBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIHN0YXRzIGJlZm9yZSBhCisJCQkgcmVzZXQgaWYgeW91IGRvbid0IGNhcmUgd2hhdCB0aGUgdmFsdWVzIGFyZS4KKwkqLworCVRMYW5fUmVzZXRMaXN0cyggZGV2ICk7CisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX0lHTk9SRSApOworCVRMYW5fUmVzZXRBZGFwdGVyKCBkZXYgKTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogT3BlbmVkLiAgVExBTiBDaGlwIFJldjogJXhcbiIsIGRldi0+bmFtZSwgcHJpdi0+dGxhblJldiApOworCisJcmV0dXJuIDA7CisKK30gLyogVExhbl9PcGVuICovCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9pb2N0bAorCSAqCQorCSAqCVJldHVybnM6CisJICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKKwkgKglQYXJhbXM6CisJICoJCWRldglzdHJ1Y3R1cmUgb2YgZGV2aWNlIHRvIHJlY2VpdmUgaW9jdGwuCisJICoJCQorCSAqCQlycQlpZnJlcSBzdHJ1Y3R1cmUgdG8gaG9sZCB1c2Vyc3BhY2UgZGF0YS4KKwkgKgorCSAqCQljbWQJaW9jdGwgY29tbWFuZC4KKwkgKgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKwl1MzIgcGh5ICAgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKwkKKwlpZiAoIXByaXYtPnBoeU9ubGluZSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQkJZGF0YS0+cGh5X2lkID0gcGh5OworCisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQkJVExhbl9NaWlSZWFkUmVnKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsICZkYXRhLT52YWxfb3V0KTsKKwkJCXJldHVybiAwOworCQkKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlUTGFuX01paVdyaXRlUmVnKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9IC8qIHRsYW5faW9jdGwgKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIAlUTGFuX3R4X3RpbWVvdXQKKwkgKgorCSAqIAlSZXR1cm5zOiBub3RoaW5nCisJICoKKwkgKiAJUGFyYW1zOgorCSAqIAkJZGV2CXN0cnVjdHVyZSBvZiBkZXZpY2Ugd2hpY2ggdGltZWQgb3V0IAorCSAqIAkJCWR1cmluZyB0cmFuc21pdC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgVExhbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJCisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCQorCS8qIE9rIHNvIHdlIHRpbWVkIG91dCwgbGV0cyBzZWUgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgaXQuLi4qLworCVRMYW5fRnJlZUxpc3RzKCBkZXYgKTsKKwlUTGFuX1Jlc2V0TGlzdHMoIGRldiApOwkJCisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX0lHTk9SRSApOworCVRMYW5fUmVzZXRBZGFwdGVyKCBkZXYgKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKCBkZXYgKTsJCisKK30KKwkKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fU3RhcnRUeAorCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisJICoJUGFybXM6CisJICoJCXNrYglBIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUKKwkgKgkJCWZyYW1lIHRvIGJlIHNlbnQuCisJICoJCWRldglUaGUgZGV2aWNlIHRvIHNlbmQgdGhlIGRhdGEgb24uCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGFkZHMgYSBmcmFtZSB0byB0aGUgVHggbGlzdCB0byBiZSBzZW50CisJICoJQVNBUC4gIEZpcnN0IGl0CXZlcmlmaWVzIHRoYXQgdGhlIGFkYXB0ZXIgaXMgcmVhZHkgYW5kCisJICoJdGhlcmUgaXMgcm9vbSBpbiB0aGUgcXVldWUuICBUaGVuIGl0IHNldHMgdXAgdGhlIG5leHQKKwkgKglhdmFpbGFibGUgbGlzdCwgY29waWVzIHRoZSBmcmFtZSB0byB0aGUJY29ycmVzcG9uZGluZworCSAqCWJ1ZmZlci4gIElmIHRoZSBhZGFwdGVyIFR4IGNoYW5uZWwgaXMgaWRsZSwgaXQgZ2l2ZXMKKwkgKgl0aGUgYWRhcHRlciBhIFR4IEdvIGNvbW1hbmQgb24gdGhlIGxpc3QsIG90aGVyd2lzZSBpdAorCSAqCXNldHMgdGhlIGZvcndhcmQgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgbGlzdCB0byBwb2ludAorCSAqCXRvIHRoaXMgb25lLiAgVGhlbiBpdCBmcmVlcyB0aGUgc2tfYnVmZi4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBUTGFuX1N0YXJ0VHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJVExhbkxpc3QJKnRhaWxfbGlzdDsKKwlkbWFfYWRkcl90CXRhaWxfbGlzdF9waHlzOworCXU4CQkqdGFpbF9idWZmZXI7CisJaW50CQlwYWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmICggISBwcml2LT5waHlPbmxpbmUgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBQSFkgaXMgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUgKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGFpbF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhUYWlsOworCXRhaWxfbGlzdF9waHlzID0gcHJpdi0+dHhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnR4VGFpbDsKKwkKKwlpZiAoIHRhaWxfbGlzdC0+Y1N0YXQgIT0gVExBTl9DU1RBVF9VTlVTRUQgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBpcyBidXN5IChIZWFkPSVkIFRhaWw9JWQpXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcHJpdi0+dHhCdXN5Q291bnQrKzsKKwkJcmV0dXJuIDE7CisJfQorCisJdGFpbF9saXN0LT5mb3J3YXJkID0gMDsKKworCWlmICggYmJ1ZiApIHsKKwkJdGFpbF9idWZmZXIgPSBwcml2LT50eEJ1ZmZlciArICggcHJpdi0+dHhUYWlsICogVExBTl9NQVhfRlJBTUVfU0laRSApOworCQltZW1jcHkoIHRhaWxfYnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuICk7CisJfSBlbHNlIHsKKwkJdGFpbF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCVRMYW5fU3RvcmVTS0IodGFpbF9saXN0LCBza2IpOworCX0KKworCXBhZCA9IFRMQU5fTUlOX0ZSQU1FX1NJWkUgLSBza2ItPmxlbjsKKworCWlmICggcGFkID4gMCApIHsKKwkJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBza2ItPmxlbiArIHBhZDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSAodTMyKSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgcGFkOworCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5hZGRyZXNzID0gVExhblBhZEJ1ZmZlckRNQTsKKwl9IGVsc2UgeworCQl0YWlsX2xpc3QtPmZyYW1lU2l6ZSA9ICh1MTYpIHNrYi0+bGVuOworCQl0YWlsX2xpc3QtPmJ1ZmZlclswXS5jb3VudCA9IFRMQU5fTEFTVF9CVUZGRVIgfCAodTMyKSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5hZGRyZXNzID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXRhaWxfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOworCWlmICggISBwcml2LT50eEluUHJvZ3Jlc3MgKSB7CisJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDE7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBTdGFydGluZyBUWCBvbiBidWZmZXIgJWRcbiIsIHByaXYtPnR4VGFpbCApOworCQlvdXRsKCB0YWlsX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJb3V0bCggVExBTl9IQ19HTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJfSBlbHNlIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEFkZGluZyBidWZmZXIgJWQgdG8gVFggY2hhbm5lbFxuIiwgcHJpdi0+dHhUYWlsICk7CisJCWlmICggcHJpdi0+dHhUYWlsID09IDAgKSB7CisJCQkoIHByaXYtPnR4TGlzdCArICggVExBTl9OVU1fVFhfTElTVFMgLSAxICkgKS0+Zm9yd2FyZCA9IHRhaWxfbGlzdF9waHlzOworCQl9IGVsc2UgeworCQkJKCBwcml2LT50eExpc3QgKyAoIHByaXYtPnR4VGFpbCAtIDEgKSApLT5mb3J3YXJkID0gdGFpbF9saXN0X3BoeXM7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJQ0lSQ19JTkMoIHByaXYtPnR4VGFpbCwgVExBTl9OVU1fVFhfTElTVFMgKTsKKworCWlmICggYmJ1ZiApCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworCit9IC8qIFRMYW5fU3RhcnRUeCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlSW50ZXJydXB0CisJICogIAorCSAqCVJldHVybnM6CQorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWlycQlUaGUgbGluZSBvbiB3aGljaCB0aGUgaW50ZXJydXB0CisJICoJCQlvY2N1cnJlZC4KKwkgKgkJZGV2X2lkCUEgcG9pbnRlciB0byB0aGUgZGV2aWNlIGFzc2lnbmVkIHRvCisJICoJCQl0aGlzIGlycSBsaW5lLgorCSAqCQlyZWdzCT8/PworCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFuIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgaXRzCisJICoJYXNzaWduZWQgVExBTiBhZGFwdGVyLiAgVGhlIGZ1bmN0aW9uIGRlYWN0aXZhdGVzCisJICoJaW50ZXJydXB0cyBvbiBpdHMgYWRhcHRlciwgcmVjb3JkcyB0aGUgdHlwZSBvZgorCSAqCWludGVycnVwdCwgZXhlY3V0ZXMgdGhlIGFwcHJvcHJpYXRlIHN1YmhhbmRsZXIsIGFuZAorCSAqCWFja25vd2RnZXMgdGhlIGludGVycnVwdCB0byB0aGUgYWRhcHRlciAodGh1cworCSAqCXJlLWVuYWJsaW5nIGFkYXB0ZXIgaW50ZXJydXB0cy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlycXJldHVybl90IFRMYW5fSGFuZGxlSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyCQlhY2s7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwl1MzIJCWhvc3RfY21kOworCXUxNgkJaG9zdF9pbnQ7CisJaW50CQl0eXBlOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdjsKKworCWRldiA9IGRldl9pZDsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwlob3N0X2ludCA9IGludyggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfSU5UICk7CisJb3V0dyggaG9zdF9pbnQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0lOVCApOworCisJdHlwZSA9ICggaG9zdF9pbnQgJiBUTEFOX0hJX0lUX01BU0sgKSA+PiAyOworCisJYWNrID0gVExhbkludFZlY3Rvclt0eXBlXSggZGV2LCBob3N0X2ludCApOworCisJaWYgKCBhY2sgKSB7CisJCWhvc3RfY21kID0gVExBTl9IQ19BQ0sgfCBhY2sgfCAoIHR5cGUgPDwgMTggKTsKKwkJb3V0bCggaG9zdF9jbWQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCX0KKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30gLyogVExhbl9IYW5kbGVJbnRlcnJ1cHRzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9DbG9zZQorCSAqICAKKwkgKiAJUmV0dXJuczoKKwkgKgkJQW4gZXJyb3IgY29kZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8KKwkgKgkJCWNsb3NlLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIHRoZSBhZGFwdGVyLiAgSXQgcmVjb3JkcyBhbnkKKwkgKglzdGF0cywgcHV0cyB0aGUgYWRhcHRlciBpbnRvIHJlc2V0IHN0YXRlLCBkZWFjdGl2YXRlcworCSAqCWl0cyB0aW1lIGFzIG5lZWRlZCwgYW5kCWZyZWVzIHRoZSBpcnEgaXQgaXMgdXNpbmcuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9DbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcHJpdi0+bmVnX2JlX3ZlcmJvc2UgPSAwOworCisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOworCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwgKSB7CisJCWRlbF90aW1lcl9zeW5jKCAmcHJpdi0+dGltZXIgKTsKKwkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOworCX0KKwkKKwlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOworCVRMYW5fRnJlZUxpc3RzKCBkZXYgKTsKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiRGV2aWNlICVzIGNsb3NlZC5cbiIsIGRldi0+bmFtZSApOworCisJcmV0dXJuIDA7CisKK30gLyogVExhbl9DbG9zZSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fR2V0U3RhdHMKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHJldHVybiB0aGUKKwkgKgkJCXN0YXRzIGZvci4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgZGV2aWNlcyBzdGF0aXN0aWNzIGJ5IHJlYWRpbmcKKwkgKgl0aGUgVExBTiBjaGlwJ3Mgb25ib2FyZCByZWdpc3RlcnMuICBUaGVuIGl0IHJldHVybnMgdGhlCisJICoJYWRkcmVzcyBvZiB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCS8qIFNob3VsZCBvbmx5IHJlYWQgc3RhdHMgaWYgb3BlbiA/ICovCisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOworCisJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgJXMgRU9DIGNvdW50ID0gJWRcbiIsIGRldi0+bmFtZSwgcHJpdi0+cnhFb2NDb3VudCApOworCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBCdXN5IGNvdW50ID0gJWRcbiIsIGRldi0+bmFtZSwgcHJpdi0+dHhCdXN5Q291bnQgKTsKKwlpZiAoIGRlYnVnICYgVExBTl9ERUJVR19HTlJMICkgeworCQlUTGFuX1ByaW50RGlvKCBkZXYtPmJhc2VfYWRkciApOworCQlUTGFuX1BoeVByaW50KCBkZXYgKTsJCQorCX0KKwlpZiAoIGRlYnVnICYgVExBTl9ERUJVR19MSVNUICkgeworCQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKQorCQkJVExhbl9QcmludExpc3QoIHByaXYtPnJ4TGlzdCArIGksICJSWCIsIGkgKTsKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9UWF9MSVNUUzsgaSsrICkKKwkJCVRMYW5fUHJpbnRMaXN0KCBwcml2LT50eExpc3QgKyBpLCAiVFgiLCBpICk7CisJfQorCQorCXJldHVybiAoICYoIChUTGFuUHJpdmF0ZUluZm8gKikgbmV0ZGV2X3ByaXYoZGV2KSApLT5zdGF0cyApOworCit9IC8qIFRMYW5fR2V0U3RhdHMgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1NldE11bHRpY2FzdExpc3QKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gc2V0IHRoZQorCSAqCQkJbXVsdGljYXN0IGxpc3QgZm9yLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBUTEFOIGFkYXB0b3IgdG8gdmFyaW91cyByZWNlaXZlCisJICoJbW9kZXMuICBJZiB0aGUgSUZGX1BST01JU0MgZmxhZyBpcyBzZXQsIHByb21pc2N1b3VzCisJICoJbW9kZSBpcyBhY2l0dmlhdGVkLiAgT3RoZXJ3aXNlLAlwcm9taXNjdW91cyBtb2RlIGlzCisJICoJdHVybmVkIG9mZi4gIElmIHRoZSBJRkZfQUxMTVVMVEkgZmxhZyBpcyBzZXQsIHRoZW4KKwkgKgl0aGUgaGFzaCB0YWJsZSBpcyBzZXQgdG8gcmVjZWl2ZSBhbGwgZ3JvdXAgYWRkcmVzc2VzLgorCSAqCU90aGVyd2lzZSwgdGhlIGZpcnN0IHRocmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlCisJICoJc3RvcmVkIGluIEFSRUdfMS0zLCBhbmQgdGhlIHJlc3QgYXJlIHNlbGVjdGVkIHZpYSB0aGUKKwkgKgloYXNoIHRhYmxlLCBhcyBuZWNlc3NhcnkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIFRMYW5fU2V0TXVsdGljYXN0TGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CQorCXN0cnVjdCBkZXZfbWNfbGlzdAkqZG1pID0gZGV2LT5tY19saXN0OworCXUzMgkJCWhhc2gxID0gMDsKKwl1MzIJCQloYXNoMiA9IDA7CisJaW50CQkJaTsKKwl1MzIJCQlvZmZzZXQ7CisJdTgJCQl0bXA7CisKKwlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKKwkJdG1wID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCApOworCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCwgdG1wIHwgVExBTl9ORVRfQ01EX0NBRiApOworCX0gZWxzZSB7CisJCXRtcCA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQgKTsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIHRtcCAmIH5UTEFOX05FVF9DTURfQ0FGICk7CisJCWlmICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkgCisJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIE5VTEwgKTsKKwkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8xLCAweEZGRkZGRkZGICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgMHhGRkZGRkZGRiApOworCQl9IGVsc2UgeworCQkJZm9yICggaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKysgKSB7CisJCQkJaWYgKCBpIDwgMyApIHsKKwkJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIChjaGFyICopICZkbWktPmRtaV9hZGRyICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb2Zmc2V0ID0gVExhbl9IYXNoRnVuYyggKHU4ICopICZkbWktPmRtaV9hZGRyICk7CisJCQkJCWlmICggb2Zmc2V0IDwgMzIgKSAKKwkJCQkJCWhhc2gxIHw9ICggMSA8PCBvZmZzZXQgKTsKKwkJCQkJZWxzZQorCQkJCQkJaGFzaDIgfD0gKCAxIDw8ICggb2Zmc2V0IC0gMzIgKSApOworCQkJCX0KKwkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQl9CisJCQlmb3IgKCA7IGkgPCAzOyBpKysgKSAKKwkJCQlUTGFuX1NldE1hYyggZGV2LCBpICsgMSwgTlVMTCApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzEsIGhhc2gxICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgaGFzaDIgKTsKKwkJfQorCX0KKworfSAvKiBUTGFuX1NldE11bHRpY2FzdExpc3QgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgVGh1bmRlckxBTiBEcml2ZXIgSW50ZXJydXB0IFZlY3RvcnMgYW5kIFRhYmxlCisKKwlQbGVhc2Ugc2VlIENoYXAuIDQsICJJbnRlcnJ1cHQgSGFuZGxpbmciIG9mIHRoZSAiVGh1bmRlckxBTgorCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIG1vcmUgaW5mb3JtYXRpb25zIG9uIGhhbmRsaW5nIGludGVycnVwdHMKKwlnZW5lcmF0ZWQgYnkgVExBTiBiYXNlZCBhZGFwdGVycy4gIAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVJbnZhbGlkCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGludmFsaWQgaW50ZXJydXB0cy4gIFRoaXMgc2hvdWxkCisJICoJbmV2ZXIgaGFwcGVuIHVubGVzcyBzb21lIG90aGVyIGFkYXB0ZXIgaXMgdHJ5aW5nIHRvIHVzZQorCSAqCXRoZSBJUlEgbGluZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCS8qIHByaW50ayggIlRMQU46ICBJbnZhbGlkIGludGVycnVwdCBvbiAlcy5cbiIsIGRldi0+bmFtZSApOyAqLworCXJldHVybiAwOworCit9IC8qIFRMYW5fSGFuZGxlSW52YWxpZCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlVHhFT0YKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVHggRU9GIGludGVycnVwdHMgd2hpY2ggYXJlIHJhaXNlZAorCSAqCWJ5IHRoZSBhZGFwdGVyIHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBzZW5kaW5nIHRoZQorCSAqCWNvbnRlbnRzIG9mIGEgYnVmZmVyLiAgSWYgZGV0ZW1pbmVzIHdoaWNoIGxpc3QvYnVmZmVyCisJICoJd2FzIGNvbXBsZXRlZCBhbmQgcmVzZXRzIGl0LiAgSWYgdGhlIGJ1ZmZlciB3YXMgdGhlIGxhc3QKKwkgKglpbiB0aGUgY2hhbm5lbCAoRU9DKSwgdGhlbiB0aGUgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZgorCSAqCWFub3RoZXIgYnVmZmVyIGlzIHJlYWR5IHRvIHNlbmQsIGFuZCBpZiBzbywgc2VuZHMgYSBUeAorCSAqCUdvIGNvbW1hbmQuICBGaW5hbGx5LCB0aGUgZHJpdmVyIGFjdGl2YXRlcy9jb250aW51ZXMgdGhlCisJICoJYWN0aXZpdHkgTEVELgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludAkJZW9jID0gMDsKKwlUTGFuTGlzdAkqaGVhZF9saXN0OworCWRtYV9hZGRyX3QJaGVhZF9saXN0X3BoeXM7CisJdTMyCQlhY2sgPSAwOworCXUxNgkJdG1wQ1N0YXQ7CisJCisJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPRiAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKKwloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisKKwl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQgKSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKKwkJYWNrKys7CisJCWlmICggISBiYnVmICkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IFRMYW5fR2V0U0tCKGhlYWRfbGlzdCk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgaGVhZF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcywgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWhlYWRfbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAwOworCQkJaGVhZF9saXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7CisJCX0KKwkKKwkJaWYgKCB0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRU9DICkKKwkJCWVvYyA9IDE7CisJCQkKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gaGVhZF9saXN0LT5mcmFtZVNpemU7CisKKwkJaGVhZF9saXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkJCisJCUNJUkNfSU5DKCBwcml2LT50eEhlYWQsIFRMQU5fTlVNX1RYX0xJU1RTICk7IAorCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJfQorCisJaWYgKCFhY2spCisJCXByaW50ayhLRVJOX0lORk8gIlRMQU46IFJlY2VpdmVkIGludGVycnVwdCBmb3IgdW5jb21wbGV0ZWQgVFggZnJhbWUuXG4iKTsKKwkKKwlpZiAoIGVvYyApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKKwkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCQloZWFkX2xpc3RfcGh5cyA9IHByaXYtPnR4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT50eEhlYWQ7CisJCWlmICggKCBoZWFkX2xpc3QtPmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSApID09IFRMQU5fQ1NUQVRfUkVBRFkgKSB7CisJCQlvdXRsKGhlYWRfbGlzdF9waHlzLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQkJYWNrIHw9IFRMQU5fSENfR087CisJCX0gZWxzZSB7CisJCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAwOworCQl9CisJfQorCQorCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEICkgeworCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyB8IFRMQU5fTEVEX0FDVCApOworCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSB7CisJCQkgcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwkJCSBwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwkJCSBwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFRMQU5fVElNRVJfQUNUX0RFTEFZOworCQkJIHByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworCQkJIHByaXYtPnRpbWVyVHlwZSA9IFRMQU5fVElNRVJfQUNUSVZJVFk7CisJCQkgYWRkX3RpbWVyKCZwcml2LT50aW1lcik7CisJCX0gZWxzZSBpZiAoIHByaXYtPnRpbWVyVHlwZSA9PSBUTEFOX1RJTUVSX0FDVElWSVRZICkgeworCQkJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCX0KKwl9CisKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlVHhFT0YgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgU3RhdGlzdGljcyBPdmVyZmxvdyBpbnRlcnJ1cHQKKwkgKgl3aGljaCBtZWFucyB0aGF0IG9uZSBvciBtb3JlIG9mIHRoZSBUTEFOIHN0YXRpc3RpY3MKKwkgKglyZWdpc3RlcnMgaGFzIHJlYWNoZWQgMS8yIGNhcGFjaXR5IGFuZCBuZWVkcyB0byBiZSByZWFkLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3coIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOworCisJcmV0dXJuIDE7CisKK30gLyogVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3cgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVJ4RU9GCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBSeCBFT0YgaW50ZXJydXB0IHdoaWNoCisJICoJaW5kaWNhdGVzIGEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgdGhlIGFkYXB0ZXIgZnJvbQorCSAqCXRoZSBuZXQgYW5kIHRoZSBmcmFtZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBtZW1vcnkuCisJICoJVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGJvdW5jZSBidWZmZXIgdGhlIGZyYW1lIGhhcworCSAqCWJlZW4gbG9hZGVkIGludG8sIGNyZWF0ZXMgYSBuZXcgc2tfYnVmZiBiaWcgZW5vdWdoIHRvCisJICoJaG9sZCB0aGUgZnJhbWUsIGFuZCBzZW5kcyBpdCB0byBwcm90b2NvbCBzdGFjay4gIEl0CisJICoJdGhlbiByZXNldHMgdGhlIHVzZWQgYnVmZmVyIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBlbmQKKwkgKglvZiB0aGUgbGlzdC4gIElmIHRoZSBmcmFtZSB3YXMgdGhlIGxhc3QgaW4gdGhlIFJ4CisJICoJY2hhbm5lbCAoRU9DKSwgdGhlIGZ1bmN0aW9uIHJlc3RhcnRzIHRoZSByZWNlaXZlIGNoYW5uZWwKKwkgKglieSBzZW5kaW5nIGFuIFJ4IEdvIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIuICBUaGVuIGl0CisJICoJYWN0aXZhdGVzL2NvbnRpbnVlcyB0aGUgYWN0aXZpdHkgTEVELgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMgkJYWNrID0gMDsKKwlpbnQJCWVvYyA9IDA7CisJdTgJCSpoZWFkX2J1ZmZlcjsKKwlUTGFuTGlzdAkqaGVhZF9saXN0OworCXN0cnVjdCBza19idWZmCSpza2I7CisJVExhbkxpc3QJKnRhaWxfbGlzdDsKKwl2b2lkCQkqdDsKKwl1MzIJCWZyYW1lU2l6ZTsKKwl1MTYJCXRtcENTdGF0OworCWRtYV9hZGRyX3QJaGVhZF9saXN0X3BoeXM7CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0YgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7CisJaGVhZF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhIZWFkOworCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnJ4SGVhZDsKKwkKKwl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQpICYgVExBTl9DU1RBVF9GUk1fQ01QKSAmJiAoYWNrIDwgMjU1KSkgeworCQlmcmFtZVNpemUgPSBoZWFkX2xpc3QtPmZyYW1lU2l6ZTsKKwkJYWNrKys7CisJCWlmICh0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRU9DKQorCQkJZW9jID0gMTsKKwkJCisJCWlmIChiYnVmKSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGZyYW1lU2l6ZSArIDcpOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCXByaW50ayhLRVJOX0lORk8gIlRMQU46IENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIpOworCQkJZWxzZSB7CisJCQkJaGVhZF9idWZmZXIgPSBwcml2LT5yeEJ1ZmZlciArIChwcml2LT5yeEhlYWQgKiBUTEFOX01BWF9GUkFNRV9TSVpFKTsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgZnJhbWVTaXplKTsKKwkJCisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gaGVhZF9saXN0LT5mcmFtZVNpemU7CisKKwkJCQltZW1jcHkoIHQsIGhlYWRfYnVmZmVyLCBmcmFtZVNpemUgKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CisJCQkJbmV0aWZfcngoIHNrYiApOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJCQorCQkJLyoKKwkJIAkgKglJIGNoYW5nZWQgdGhlIGFsZ29yaXRobSBoZXJlLiBXaGF0IHdlIG5vdyBkbworCQkgCSAqCWlzIGFsbG9jYXRlIHRoZSBuZXcgZnJhbWUuIElmIHRoaXMgZmFpbHMgd2UKKwkJIAkgKglzaW1wbHkgcmVjeWNsZSB0aGUgZnJhbWUuCisJCSAJICovCisJCQorCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IoIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKyA3ICk7CisJCQkKKwkJCWlmICggbmV3X3NrYiAhPSBOVUxMICkgeworCQkJCXNrYiA9IFRMYW5fR2V0U0tCKGhlYWRfbGlzdCk7CisJCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIGhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3RyaW0oIHNrYiwgZnJhbWVTaXplICk7CisKKwkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBmcmFtZVNpemU7CisKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CisJCQkJbmV0aWZfcngoIHNrYiApOworCQorCQkJCW5ld19za2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZSggbmV3X3NrYiwgMiApOworCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KCBuZXdfc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCQkJaGVhZF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbmV3X3NrYi0+ZGF0YSwgVExBTl9NQVhfRlJBTUVfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQloZWFkX2xpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gKHUzMikgdDsKKwkJCQlUTGFuX1N0b3JlU0tCKGhlYWRfbGlzdCwgbmV3X3NrYik7CisJCQl9IGVsc2UgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVExBTjogIENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIgKTsKKwkJfQorCisJCWhlYWRfbGlzdC0+Zm9yd2FyZCA9IDA7CisJCWhlYWRfbGlzdC0+Y1N0YXQgPSAwOworCQl0YWlsX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeFRhaWw7CisJCXRhaWxfbGlzdC0+Zm9yd2FyZCA9IGhlYWRfbGlzdF9waHlzOworCisJCUNJUkNfSU5DKCBwcml2LT5yeEhlYWQsIFRMQU5fTlVNX1JYX0xJU1RTICk7CisJCUNJUkNfSU5DKCBwcml2LT5yeFRhaWwsIFRMQU5fTlVNX1JYX0xJU1RTICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+cnhIZWFkOworCX0KKworCWlmICghYWNrKQorCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBSZWNlaXZlZCBpbnRlcnJ1cHQgZm9yIHVuY29tcGxldGVkIFJYIGZyYW1lLlxuIik7CisJCisKKworCisJaWYgKCBlb2MgKSB7IAorCQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+cnhIZWFkOworCQlvdXRsKGhlYWRfbGlzdF9waHlzLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQlhY2sgfD0gVExBTl9IQ19HTyB8IFRMQU5fSENfUlQ7CisJCXByaXYtPnJ4RW9jQ291bnQrKzsKKwl9CisKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCApIHsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgfCBUTEFOX0xFRF9BQ1QgKTsKKwkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgIHsKKwkJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJCQlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwkJCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVExBTl9USU1FUl9BQ1RfREVMQVk7CisJCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwkJCXByaXYtPnRpbWVyVHlwZSA9IFRMQU5fVElNRVJfQUNUSVZJVFk7CisJCQlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+dGltZXJUeXBlID09IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7CisJCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwkJfQorCX0KKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVJ4RU9GICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVEdW1teQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgRHVtbXkgaW50ZXJydXB0LCB3aGljaCBpcworCSAqCXJhaXNlZCB3aGVuZXZlciBhIHRlc3QgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSBzZXR0aW5nCisJICoJdGhlIFJlcV9JbnQgYml0IG9mIEhPU1RfQ01EIHRvIDEuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZUR1bW15KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCXByaW50ayggIlRMQU46ICBUZXN0IGludGVycnVwdCBvbiAlcy5cbiIsIGRldi0+bmFtZSApOworCXJldHVybiAxOworCit9IC8qIFRMYW5fSGFuZGxlRHVtbXkgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVR4RU9DCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBkcml2ZXIgaXMgc3RydWN0dXJlZCB0byBkZXRlcm1pbmUgRU9DIG9jY3VycmVuY2VzIGJ5CisJICoJcmVhZGluZyB0aGUgQ1NUQVQgbWVtYmVyIG9mIHRoZSBsaXN0IHN0cnVjdHVyZS4gIFR4IEVPQworCSAqCWludGVycnVwdHMgYXJlIGRpc2FibGVkIHZpYSB0aGUgRElPIElOVERJUyByZWdpc3Rlci4KKwkgKglIb3dldmVyLCBUTEFOIGNoaXBzIGJlZm9yZSByZXZpc2lvbiAzLjAgZGlkbid0IGhhdmUgdGhpcworCSAqCWZ1bmN0aW9uYWxpdHksIHNvIHByb2Nlc3MgRU9DIGV2ZW50cyBpZiB0aGlzIGlzIHRoZQorCSAqCWNhc2UuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJVExhbkxpc3QJCSpoZWFkX2xpc3Q7CisJZG1hX2FkZHJfdAkJaGVhZF9saXN0X3BoeXM7CisJdTMyCQkJYWNrID0gMTsKKwkKKwlob3N0X2ludCA9IDA7CisJaWYgKCBwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKSAtLSBJUlFcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT50eExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+dHhIZWFkOworCQlpZiAoICggaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkgKSA9PSBUTEFOX0NTVEFUX1JFQURZICkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJb3V0bCggaGVhZF9saXN0X3BoeXMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCQlhY2sgfD0gVExBTl9IQ19HTzsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlVHhFT0MgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVN0YXR1c0NoZWNrCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIGlmIEFkYXB0ZXIgY2hlY2ssIDEgaWYgTmV0d29yayBTdGF0dXMgY2hlY2suCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEFkYXB0ZXIgQ2hlY2svTmV0d29yayBTdGF0dXMKKwkgKglpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlci4gIEl0IGNoZWNrcyB0aGUKKwkgKgl2ZWN0b3IgaW4gdGhlIEhPU1RfSU5UIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiBpdCBpcworCSAqCWFuIEFkYXB0ZXIgQ2hlY2sgaW50ZXJydXB0LiAgSWYgc28sIGl0IHJlc2V0cyB0aGUKKwkgKglhZGFwdGVyLiAgT3RoZXJ3aXNlIGl0IGNsZWFycyB0aGUgc3RhdHVzIHJlZ2lzdGVycworCSAqCWFuZCBzZXJ2aWNlcyB0aGUgUEhZLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sJCisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIJCWFjazsKKwl1MzIJCWVycm9yOworCXU4CQluZXRfc3RzOworCXUzMgkJcGh5OworCXUxNgkJdGxwaHlfY3RsOworCXUxNgkJdGxwaHlfc3RzOworCQorCWFjayA9IDE7CisJaWYgKCBob3N0X2ludCAmIFRMQU5fSElfSVZfTUFTSyApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisJCWVycm9yID0gaW5sKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQlwcmludGsoICJUTEFOOiAgJXM6IEFkYXB0b3IgRXJyb3IgPSAweCV4XG4iLCBkZXYtPm5hbWUsIGVycm9yICk7CisJCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKwkJb3V0bCggVExBTl9IQ19BRF9SU1QsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnRsYW5fdHF1ZXVlKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWFjayA9IDA7CisJfSBlbHNlIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBTdGF0dXMgQ2hlY2tcbiIsIGRldi0+bmFtZSApOworCQlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCQluZXRfc3RzID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NUUyApOworCQlpZiAoIG5ldF9zdHMgKSB7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NUUywgbmV0X3N0cyApOworCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiAgICBOZXRfU3RzID0gJXhcbiIsIGRldi0+bmFtZSwgKHVuc2lnbmVkKSBuZXRfc3RzICk7CisJCX0KKwkJaWYgKCAoIG5ldF9zdHMgJiBUTEFOX05FVF9TVFNfTUlSUSApICYmICAoIHByaXYtPnBoeU51bSA9PSAwICkgKSB7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX1NUUywgJnRscGh5X3N0cyApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwgKTsKKyAgICAgICAgCQlpZiAoICEgKCB0bHBoeV9zdHMgJiBUTEFOX1RTX1BPTE9LICkgJiYgISAoIHRscGh5X2N0bCAmIFRMQU5fVENfU1dBUE9MICkgKSB7CisgICAgICAgICAgICAgICAgCQl0bHBoeV9jdGwgfD0gVExBTl9UQ19TV0FQT0w7CisgICAgICAgICAgICAgICAgCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7CisgICAgICAgIAkJfSBlbHNlIGlmICggKCB0bHBoeV9zdHMgJiBUTEFOX1RTX1BPTE9LICkgJiYgKCB0bHBoeV9jdGwgJiBUTEFOX1RDX1NXQVBPTCApICkgeworICAgICAgICAgICAgICAgIAkJdGxwaHlfY3RsICY9IH5UTEFOX1RDX1NXQVBPTDsKKyAgICAgICAgICAgICAgICAJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGxwaHlfY3RsKTsKKyAgICAgICAgCQl9CisKKwkJCWlmIChkZWJ1ZykgeworCQkJCVRMYW5fUGh5UHJpbnQoIGRldiApOwkJCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlU3RhdHVzQ2hlY2sgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVJ4RU9DCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBkcml2ZXIgaXMgc3RydWN0dXJlZCB0byBkZXRlcm1pbmUgRU9DIG9jY3VycmVuY2VzIGJ5CisJICoJcmVhZGluZyB0aGUgQ1NUQVQgbWVtYmVyIG9mIHRoZSBsaXN0IHN0cnVjdHVyZS4gIFJ4IEVPQworCSAqCWludGVycnVwdHMgYXJlIGRpc2FibGVkIHZpYSB0aGUgRElPIElOVERJUyByZWdpc3Rlci4KKwkgKglIb3dldmVyLCBUTEFOIGNoaXBzIGJlZm9yZSByZXZpc2lvbiAzLjAgZGlkbid0IGhhdmUgdGhpcworCSAqCUNTVEFUIG1lbWJlciBvciBhIElOVERJUyByZWdpc3Rlciwgc28gaWYgdGhpcyBjaGlwIGlzCisJICoJcHJlLTMuMCwgcHJvY2VzcyBFT0MgaW50ZXJydXB0cyBub3JtYWxseS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkbWFfYWRkcl90CWhlYWRfbGlzdF9waHlzOworCXUzMgkJYWNrID0gMTsKKworCWlmICggIHByaXYtPnRsYW5SZXYgPCAweDMwICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZCkgLS0gSVJRXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOworCQloZWFkX2xpc3RfcGh5cyA9IHByaXYtPnJ4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT5yeEhlYWQ7CisJCW91dGwoIGhlYWRfbGlzdF9waHlzLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQlhY2sgfD0gVExBTl9IQ19HTyB8IFRMQU5fSENfUlQ7CisJCXByaXYtPnJ4RW9jQ291bnQrKzsKKwl9CisKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlUnhFT0MgKi8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIFRpbWVyIEZ1bmN0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1RpbWVyCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRhdGEJQSB2YWx1ZSBnaXZlbiB0byBhZGQgdGltZXIgd2hlbgorCSAqCQkJYWRkX3RpbWVyIHdhcyBjYWxsZWQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGltZWQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisJICoJVExBTiBkcml2ZXIuICBUaGUgdHdvIGN1cnJlbnQgdGltZXIgdXNlcyBhcmUgZm9yCisJICoJZGVsYXlpbmcgZm9yIGF1dG9uZWdvdGlvbmF0aW9uIGFuZCBkcml2aW5nIHRoZSBBQ1QgTEVELgorCSAqCS0JQXV0b25lZ290aWF0aW9uIHJlcXVpcmVzIGJlaW5nIGFsbG93ZWQgYWJvdXQKKwkgKgkJMiAxLzIgc2Vjb25kcyBiZWZvcmUgYXR0ZW1wdGluZyB0byB0cmFuc21pdCBhCisJICoJCXBhY2tldC4gIEl0IHdvdWxkIGJlIGEgdmVyeSBiYWQgdGhpbmcgdG8gaGFuZworCSAqCQl0aGUga2VybmVsIHRoaXMgbG9uZywgc28gdGhlIGRyaXZlciBkb2Vzbid0CisJICoJCWFsbG93IHRyYW5zbWlzc2lvbiAndGlsIGFmdGVyIHRoaXMgdGltZSwgZm9yCisJICoJCWNlcnRhaW4gUEhZcy4gIEl0IHdvdWxkIGJlIG11Y2ggbmljZXIgaWYgYWxsCisJICoJCVBIWXMgd2VyZSBpbnRlcnJ1cHQtY2FwYWJsZSBsaWtlIHRoZSBpbnRlcm5hbAorCSAqCQlQSFkuCisJICoJLQlUaGUgQUNUIExFRCwgd2hpY2ggc2hvd3MgYWRhcHRlciBhY3Rpdml0eSwgaXMKKwkgKgkJZHJpdmVuIGJ5IHRoZSBkcml2ZXIsIGFuZCBzbyBtdXN0IGJlIGxlZnQgb24KKwkgKgkJZm9yIGEgc2hvcnQgcGVyaW9kIHRvIHBvd2VyIHVwIHRoZSBMRUQgc28gaXQKKwkgKgkJY2FuIGJlIHNlZW4uICBUaGlzIGRlbGF5IGNhbiBiZSBjaGFuZ2VkIGJ5CisJICoJCWNoYW5naW5nIHRoZSBUTEFOX1RJTUVSX0FDVF9ERUxBWSBpbiB0bGFuLmgsCisJICoJCWlmIGRlc2lyZWQuICAxMDAgbXMgIHByb2R1Y2VzIGEgc2xpZ2h0bHkKKwkgKgkJc2x1Z2dpc2ggcmVzcG9uc2UuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9UaW1lciggdW5zaWduZWQgbG9uZyBkYXRhICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIJCWVsYXBzZWQ7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisKKwlwcml2LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7CisKKwlzd2l0Y2ggKCBwcml2LT50aW1lclR5cGUgKSB7CisjaWZkZWYgTU9OSVRPUgkJCisJCWNhc2UgVExBTl9USU1FUl9MSU5LX0JFQVQ6CisJCQlUTGFuX1BoeU1vbml0b3IoIGRldiApOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QRE9XTjoKKwkJCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX1BVUDoKKwkJCVRMYW5fUGh5UG93ZXJVcCggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9SRVNFVDoKKwkJCVRMYW5fUGh5UmVzZXQoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSzoKKwkJCVRMYW5fUGh5U3RhcnRMaW5rKCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTjoKKwkJCVRMYW5fUGh5RmluaXNoQXV0b05lZyggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVDoKKwkJCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9BQ1RJVklUWToKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSB7CisJCQkJZWxhcHNlZCA9IGppZmZpZXMgLSBwcml2LT50aW1lclNldEF0OworCQkJCWlmICggZWxhcHNlZCA+PSBUTEFOX1RJTUVSX0FDVF9ERUxBWSApIHsKKwkJCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKKwkJCQl9IGVsc2UgIHsKKwkJCQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwkJCQkJcHJpdi0+dGltZXIuZXhwaXJlcyA9IHByaXYtPnRpbWVyU2V0QXQgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJCQlhZGRfdGltZXIoICZwcml2LT50aW1lciApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworfSAvKiBUTGFuX1RpbWVyICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBBZGFwdGVyIFJlbGF0ZWQgUm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVzZXRMaXN0cworCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHRoZSBsaXN0CisJICoJCQlzdHVjdHVyZXMgdG8gYmUgcmVzZXQuCisJICoKKwkgKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBtYW5hZ2luZworCSAqCXRoZSBUTEFOIGxpc3RzIHRvIHRoZWlyIGluaXRpYWwgdmFsdWVzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWk7CisJVExhbkxpc3QJKmxpc3Q7CisJZG1hX2FkZHJfdAlsaXN0X3BoeXM7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwl2b2lkCQkqdCA9IE5VTEw7CisKKwlwcml2LT50eEhlYWQgPSAwOworCXByaXYtPnR4VGFpbCA9IDA7CisJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9UWF9MSVNUUzsgaSsrICkgeworCQlsaXN0ID0gcHJpdi0+dHhMaXN0ICsgaTsKKwkJbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKwkJaWYgKCBiYnVmICkgeworCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwcml2LT50eEJ1ZmZlckRNQSArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gMDsKKwkJfQorCQlsaXN0LT5idWZmZXJbMl0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMl0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gMDsKKwkJbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOworCX0KKworCXByaXYtPnJ4SGVhZCA9IDA7CisJcHJpdi0+cnhUYWlsID0gVExBTl9OVU1fUlhfTElTVFMgLSAxOworCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKKwkJbGlzdCA9IHByaXYtPnJ4TGlzdCArIGk7CisJCWxpc3RfcGh5cyA9IHByaXYtPnJ4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBpOworCQlsaXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7CisJCWxpc3QtPmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7CisJCWxpc3QtPmJ1ZmZlclswXS5jb3VudCA9IFRMQU5fTUFYX0ZSQU1FX1NJWkUgfCBUTEFOX0xBU1RfQlVGRkVSOworCQlpZiAoIGJidWYgKSB7CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHByaXYtPnJ4QnVmZmVyRE1BICsgKCBpICogVExBTl9NQVhfRlJBTUVfU0laRSApOworCQl9IGVsc2UgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYiggVExBTl9NQVhfRlJBTUVfU0laRSArIDcgKTsKKwkJCWlmICggc2tiID09IE5VTEwgKSB7CisJCQkJcHJpbnRrKCAiVExBTjogIENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIgKTsKKwkJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuZWQgaXQgd291bGQgYmUgYSBwcm9ibGVtICovCisJCQl9IGVsc2UgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCQl9CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgdCwgVExBTl9NQVhfRlJBTUVfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWxpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gKHUzMikgdDsKKwkJCVRMYW5fU3RvcmVTS0IobGlzdCwgc2tiKTsKKwkJfQorCQlsaXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CisJCWlmICggaSA8IFRMQU5fTlVNX1JYX0xJU1RTIC0gMSApCisJCQlsaXN0LT5mb3J3YXJkID0gbGlzdF9waHlzICsgc2l6ZW9mKFRMYW5MaXN0KTsKKwkJZWxzZQorCQkJbGlzdC0+Zm9yd2FyZCA9IDA7CisJfQorCit9IC8qIFRMYW5fUmVzZXRMaXN0cyAqLworCisKK3ZvaWQgVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQlpOworCVRMYW5MaXN0CSpsaXN0OworCXN0cnVjdCBza19idWZmCSpza2I7CisKKwlpZiAoICEgYmJ1ZiApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9UWF9MSVNUUzsgaSsrICkgeworCQkJbGlzdCA9IHByaXYtPnR4TGlzdCArIGk7CisJCQlza2IgPSBUTGFuX0dldFNLQihsaXN0KTsKKwkJCWlmICggc2tiICkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpRGV2LCBsaXN0LT5idWZmZXJbMF0uYWRkcmVzcywgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfYW55KCBza2IgKTsKKwkJCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9IDA7CisJCQkJbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOworCQkJfQorCQl9CisKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrICkgeworCQkJbGlzdCA9IHByaXYtPnJ4TGlzdCArIGk7CisJCQlza2IgPSBUTGFuX0dldFNLQihsaXN0KTsKKwkJCWlmICggc2tiICkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpRGV2LCBsaXN0LT5idWZmZXJbMF0uYWRkcmVzcywgVExBTl9NQVhfRlJBTUVfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueSggc2tiICk7CisJCQkJbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAwOworCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJCX0KKwkJfQorCX0KK30gLyogVExhbl9GcmVlTGlzdHMgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1ByaW50RGlvCisJICogIAorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJaW9fYmFzZQkJQmFzZSBJTyBwb3J0IG9mIHRoZSBkZXZpY2Ugb2YKKwkgKgkJCQl3aGljaCB0byBwcmludCBESU8gcmVnaXN0ZXJzLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IGFsbCB0aGUgaW50ZXJuYWwgKERJTykKKwkgKglyZWdpc3RlcnMgb2YgYSBUTEFOIGNoaXAuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9QcmludERpbyggdTE2IGlvX2Jhc2UgKQoreworCXUzMiBkYXRhMCwgZGF0YTE7CisJaW50CWk7CisKKwlwcmludGsoICJUTEFOOiAgIENvbnRlbnRzIG9mIGludGVybmFsIHJlZ2lzdGVycyBmb3IgaW8gYmFzZSAweCUwNGh4LlxuIiwgaW9fYmFzZSApOworCXByaW50ayggIlRMQU46ICAgICAgT2ZmLiAgKzAgICAgICAgICArNFxuIiApOworCWZvciAoIGkgPSAwOyBpIDwgMHg0QzsgaSs9IDggKSB7CisJCWRhdGEwID0gVExhbl9EaW9SZWFkMzIoIGlvX2Jhc2UsIGkgKTsKKwkJZGF0YTEgPSBUTGFuX0Rpb1JlYWQzMiggaW9fYmFzZSwgaSArIDB4NCApOworCQlwcmludGsoICJUTEFOOiAgICAgIDB4JTAyeCAgMHglMDh4IDB4JTA4eFxuIiwgaSwgZGF0YTAsIGRhdGExICk7CisJfQorCit9IC8qIFRMYW5fUHJpbnREaW8gKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1ByaW50TGlzdAorCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWxpc3QJQSBwb2ludGVyIHRvIHRoZSBUTGFuTGlzdCBzdHJ1Y3R1cmUgdG8KKwkgKgkJCWJlIHByaW50ZWQuCisJICoJCXR5cGUJQSBzdHJpbmcgdG8gZGVzaWduYXRlIHR5cGUgb2YgbGlzdCwKKwkgKgkJCSJSeCIgb3IgIlR4Ii4KKwkgKgkJbnVtCVRoZSBpbmRleCBvZiB0aGUgbGlzdC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3QKKwkgKglwb2ludGVkIHRvIGJ5IHRoZSBsaXN0IHBhcmFtZXRlci4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1ByaW50TGlzdCggVExhbkxpc3QgKmxpc3QsIGNoYXIgKnR5cGUsIGludCBudW0pCit7CisJaW50IGk7CisKKwlwcmludGsoICJUTEFOOiAgICVzIExpc3QgJWQgYXQgMHglMDh4XG4iLCB0eXBlLCBudW0sICh1MzIpIGxpc3QgKTsKKwlwcmludGsoICJUTEFOOiAgICAgIEZvcndhcmQgICAgPSAweCUwOHhcbiIsICBsaXN0LT5mb3J3YXJkICk7CisJcHJpbnRrKCAiVExBTjogICAgICBDU1RBVCAgICAgID0gMHglMDRoeFxuIiwgbGlzdC0+Y1N0YXQgKTsKKwlwcmludGsoICJUTEFOOiAgICAgIEZyYW1lIFNpemUgPSAweCUwNGh4XG4iLCBsaXN0LT5mcmFtZVNpemUgKTsKKwkvKiBmb3IgKCBpID0gMDsgaSA8IDEwOyBpKysgKSB7ICovCisJZm9yICggaSA9IDA7IGkgPCAyOyBpKysgKSB7CisJCXByaW50ayggIlRMQU46ICAgICAgQnVmZmVyWyVkXS5jb3VudCwgYWRkciA9IDB4JTA4eCwgMHglMDh4XG4iLCBpLCBsaXN0LT5idWZmZXJbaV0uY291bnQsIGxpc3QtPmJ1ZmZlcltpXS5hZGRyZXNzICk7CisJfQorCit9IC8qIFRMYW5fUHJpbnRMaXN0ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKKwkgKgkJCXRvIHdoaWNoIHRvIHJlYWQgc3RhdHMuCisJICoJCXJlY29yZAlGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBhZGQgCisJICoKKwkgKglUaGlzIGZ1bmN0aW9ucyByZWFkcyBhbGwgdGhlIGludGVybmFsIHN0YXR1cyByZWdpc3RlcnMKKwkgKglvZiB0aGUgVExBTiBjaGlwLCB3aGljaCBjbGVhcnMgdGhlbSBhcyBhIHNpZGUgZWZmZWN0LgorCSAqCUl0IHRoZW4gZWl0aGVyIGFkZHMgdGhlIHZhbHVlcyB0byB0aGUgZGV2aWNlJ3Mgc3RhdHVzCisJICoJc3RydWN0LCBvciBkaXNjYXJkcyB0aGVtLCBkZXBlbmRpbmcgb24gd2hldGhlciByZWNvcmQKKwkgKglpcyBUTEFOX1JFQ09SRCAoIT0wKSAgb3IgVExBTl9JR05PUkUgKD09MCkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlY29yZCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIJCXR4X2dvb2QsIHR4X3VuZGVyOworCXUzMgkJcnhfZ29vZCwgcnhfb3ZlcjsKKwl1MzIJCWRlZl90eCwgY3JjLCBjb2RlOworCXUzMgkJbXVsdGlfY29sLCBzaW5nbGVfY29sOworCXUzMgkJZXhjZXNzX2NvbCwgbGF0ZV9jb2wsIGxvc3M7CisKKwlvdXR3KCBUTEFOX0dPT0RfVFhfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwl0eF9nb29kICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJdHhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXR4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICkgPDwgMTY7CisJdHhfdW5kZXIgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKKworCW91dHcoIFRMQU5fR09PRF9SWF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOworCXJ4X2dvb2QgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlyeF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7CisJcnhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKSA8PCAxNjsKKwlyeF9vdmVyICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOworCQkKKwlvdXR3KCBUTEFOX0RFRkVSUkVEX1RYLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOworCWRlZl90eCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOworCWRlZl90eCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCWNyYyAgICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKTsKKwljb2RlICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7CisJCisJb3V0dyggVExBTl9NVUxUSUNPTF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOworCW11bHRpX2NvbCAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwltdWx0aV9jb2wgICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7CisJc2luZ2xlX2NvbCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKTsKKwlzaW5nbGVfY29sICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApIDw8IDg7CisKKwlvdXR3KCBUTEFOX0VYQ0VTU0NPTF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOworCWV4Y2Vzc19jb2wgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOworCWxhdGVfY29sICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKTsKKwlsb3NzICAgICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisKKwlpZiAoIHJlY29yZCApIHsKKwkJcHJpdi0+c3RhdHMucnhfcGFja2V0cyArPSByeF9nb29kOworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMgICs9IHJ4X292ZXIgKyBjcmMgKyBjb2RlOworCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzICs9IHR4X2dvb2Q7CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycyAgKz0gdHhfdW5kZXIgKyBsb3NzOworCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zICs9IG11bHRpX2NvbCArIHNpbmdsZV9jb2wgKyBleGNlc3NfY29sICsgbGF0ZV9jb2w7CisKKwkJcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgICAgKz0gcnhfb3ZlcjsKKwkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycyAgICAgKz0gY3JjOworCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgICArPSBjb2RlOworCisJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHR4X3VuZGVyOworCQlwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBsb3NzOworCX0KKwkJCQorfSAvKiBUTGFuX1JlYWRBbmRDbGVhclN0YXRzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9SZXNldAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAorCSAqCVBhcm1zOgorCSAqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKKwkgKgkJCXRvIGJlIHJlc2V0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGFkYXB0ZXIgYW5kIGl0J3MgcGh5c2ljYWwKKwkgKglkZXZpY2UuICBTZWUgQ2hhcC4gMywgcHAuIDktMTAgb2YgdGhlICJUaHVuZGVyTEFOCisJICoJUHJvZ3JhbW1lcidzIEd1aWRlIiBmb3IgZGV0YWlscy4gIFRoZSByb3V0aW5lIHRyaWVzIHRvCisJICoJaW1wbGVtZW50IHdoYXQgaXMgZGV0YWlsZWQgdGhlcmUsIHRob3VnaCBhZGp1c3RtZW50cworCSAqCWhhdmUgYmVlbiBtYWRlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitUTGFuX1Jlc2V0QWRhcHRlciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWk7CisJdTMyCQlhZGRyOworCXUzMgkJZGF0YTsKKwl1OAkJZGF0YTg7CisKKwlwcml2LT50bGFuRnVsbER1cGxleCA9IEZBTFNFOworCXByaXYtPnBoeU9ubGluZT0wOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKy8qICAxLglBc3NlcnQgcmVzZXQgYml0LiAqLworCisJZGF0YSA9IGlubChkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19BRF9SU1Q7CisJb3V0bChkYXRhLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOworCQorCXVkZWxheSgxMDAwKTsKKworLyogIDIuCVR1cm4gb2ZmIGludGVycnVwdHMuICggUHJvYmFibHkgaXNuJ3QgbmVjZXNzYXJ5ICkgKi8KKworCWRhdGEgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfSU5UX09GRjsKKwlvdXRsKGRhdGEsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisKKy8qICAzLglDbGVhciBBUkVHcyBhbmQgSEFTSHMuICovCisKKyAJZm9yICggaSA9IFRMQU5fQVJFR18wOyBpIDw9IFRMQU5fSEFTSF8yOyBpICs9IDQgKSB7CisJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsICh1MTYpIGksIDAgKTsKKwl9CisKKy8qICA0LglTZXR1cCBOZXRDb25maWcgcmVnaXN0ZXIuICovCisKKwlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsICh1MTYpIGRhdGEgKTsKKworLyogIDUuCUxvYWQgTGRfVG1yIGFuZCBMZF9UaHIgaW4gSE9TVF9DTUQuICovCisKKyAJb3V0bCggVExBTl9IQ19MRF9UTVIgfCAweDNmLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKyAJb3V0bCggVExBTl9IQ19MRF9USFIgfCAweDksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCisvKiAgNi4JVW5yZXNldCB0aGUgTUlJIGJ5IHNldHRpbmcgTk1SU1QgKGluIE5ldFNpbykgdG8gMS4gKi8KKworCW91dHcoIFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlhZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTk1SU1QsIGFkZHIgKTsKKworLyogIDcuCVNldHVwIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzLiAqLworCisJaWYgKCBwcml2LT50bGFuUmV2ID49IDB4MzAgKSB7CisJCWRhdGE4ID0gVExBTl9JRF9UWF9FT0MgfCBUTEFOX0lEX1JYX0VPQzsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0lOVF9ESVMsIGRhdGE4ICk7CisJfQorCVRMYW5fUGh5RGV0ZWN0KCBkZXYgKTsKKwlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOOworCQorCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19CSVQ7CisJCWlmICggcHJpdi0+YXVpID09IDEgKSB7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwYSApOworCQl9IGVsc2UgaWYgKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHsKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BQ09NTUlULCAweDAwICk7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwOCApOworCQl9CisJfQorCisJaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKKwkJZGF0YSB8PSBUTEFOX05FVF9DRkdfUEhZX0VOOworCX0KKwlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsICh1MTYpIGRhdGEgKTsKKworCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKKwkJVExhbl9GaW5pc2hSZXNldCggZGV2ICk7CisJfSBlbHNlIHsKKwkJVExhbl9QaHlQb3dlckRvd24oIGRldiApOworCX0KKworfSAvKiBUTGFuX1Jlc2V0QWRhcHRlciAqLworCisKKworCit2b2lkCitUTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4CQlkYXRhOworCXUzMgkJcGh5OworCXU4CQlzaW87CisJdTE2CQlzdGF0dXM7CisJdTE2CQlwYXJ0bmVyOworCXUxNgkJdGxwaHlfY3RsOworCXUxNiAJCXRscGh5X3BhcjsKKwl1MTYJCXRscGh5X2lkMSwgdGxwaHlfaWQyOworCWludCAJCWk7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCWRhdGEgPSBUTEFOX05FVF9DTURfTlJFU0VUIHwgVExBTl9ORVRfQ01EX05XUkFQOworCWlmICggcHJpdi0+dGxhbkZ1bGxEdXBsZXggKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ01EX0RVUExFWDsKKwl9CisJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIGRhdGEgKTsKKwlkYXRhID0gVExBTl9ORVRfTUFTS19NQVNLNCB8IFRMQU5fTkVUX01BU0tfTUFTSzU7IAorCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfTUFTS19NQVNLNzsgCisJfQorCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfTUFTSywgZGF0YSApOworCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTUFYX1JYLCAoKDE1MzYpKzcpJn43ICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9ISSwgJnRscGh5X2lkMSApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfTE8sICZ0bHBoeV9pZDIgKTsKKwkKKwlpZiAoICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHx8ICggcHJpdi0+YXVpICkgKSB7CisJCXN0YXR1cyA9IE1JSV9HU19MSU5LOworCQlwcmludGsoICJUTEFOOiAgJXM6IExpbmsgZm9yY2VkLlxuIiwgZGV2LT5uYW1lICk7CisJfSBlbHNlIHsKKwkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKwkJdWRlbGF5KCAxMDAwICk7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJCWlmICggKHN0YXR1cyAmIE1JSV9HU19MSU5LKSAmJgkgLyogV2Ugb25seSBzdXBwb3J0IGxpbmsgaW5mbyBvbiBOYXQuU2VtLiBQSFkncyAqLyAKKwkJCSh0bHBoeV9pZDEgPT0gTkFUX1NFTV9JRDEpICYmCisJCQkodGxwaHlfaWQyID09IE5BVF9TRU1fSUQyKSApIHsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9BTl9MUEEsICZwYXJ0bmVyICk7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX1BBUiwgJnRscGh5X3BhciApOworCQkJCisJCQlwcmludGsoICJUTEFOOiAlczogTGluayBhY3RpdmUgd2l0aCAiLCBkZXYtPm5hbWUgKTsKKwkJCWlmICghKHRscGh5X3BhciAmIFRMQU5fUEhZX0FOX0VOX1NUQVQpKSB7CisJCQkgICAgICAJIHByaW50ayggImZvcmNlZCAxMCVzTWJwcyAlcy1EdXBsZXhcbiIsIAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOiAiMCIsCisJCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayggIkF1dG9OZWdvdGlhdGlvbiBlbmFibGVkLCBhdCAxMCVzTWJwcyAlcy1EdXBsZXhcbiIsCisJCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9TUEVFRF8xMDAgPyAiIiA6ICIwIiwKKwkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX0RVUExFWF9GVUxMID8gIkZ1bGwiIDogIkhhbGYiKTsKKwkJCQlwcmludGsoIlRMQU46IFBhcnRuZXIgY2FwYWJpbGl0eTogIik7CisJCQkJCWZvciAoaSA9IDU7IGkgPD0gMTA7IGkrKykKKwkJCQkJCWlmIChwYXJ0bmVyICYgKDE8PGkpKQorCQkJCQkJCXByaW50aygiJXMiLG1lZGlhW2ktNV0pOworCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKKyNpZmRlZiBNT05JVE9SCQkJCisJCQkvKiBXZSBoYXZlIGxpbmsgYmVhdC4uZm9yIG5vdyBhbnl3YXkgKi8KKwkgICAgICAgIAlwcml2LT5saW5rID0gMTsKKwkgICAgICAgIAkvKkVuYWJsaW5nIGxpbmsgYmVhdCBtb25pdG9yaW5nICovCisJCQlUTGFuX1NldFRpbWVyKCBkZXYsICgxMCpIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7CisjZW5kaWYgCisJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUlJX0dTX0xJTkspICB7CisJCQlwcmludGsoICJUTEFOOiAlczogTGluayBhY3RpdmVcbiIsIGRldi0+bmFtZSApOworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKKwkJfQorCX0KKworCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisgICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRscGh5X2N0bCApOworICAgICAgICAJdGxwaHlfY3RsIHw9IFRMQU5fVENfSU5URU47CisgICAgICAgIAlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCApOworICAgICAgICAJc2lvID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NJTyApOworICAgICAgICAJc2lvIHw9IFRMQU5fTkVUX1NJT19NSU5URU47CisgICAgICAgIAlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NJTywgc2lvICk7CisJfQorCisJaWYgKCBzdGF0dXMgJiBNSUlfR1NfTElOSyApIHsKKwkJVExhbl9TZXRNYWMoIGRldiwgMCwgZGV2LT5kZXZfYWRkciApOworCQlwcml2LT5waHlPbmxpbmUgPSAxOworCQlvdXRiKCAoIFRMQU5fSENfSU5UX09OID4+IDggKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICsgMSApOworCQlpZiAoIGRlYnVnID49IDEgJiYgZGVidWcgIT0gVExBTl9ERUJVR19QUk9CRSApIHsKKwkJCW91dGIoICggVExBTl9IQ19SRVFfSU5UID4+IDggKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICsgMSApOworCQl9CisJCW91dGwoIHByaXYtPnJ4TGlzdERNQSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJb3V0bCggVExBTl9IQ19HTyB8IFRMQU5fSENfUlQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgaW5hY3RpdmUsIHdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4uLlxuIiwgZGV2LT5uYW1lICk7CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDEwKkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKKwkJcmV0dXJuOworCX0KKworfSAvKiBUTGFuX0ZpbmlzaFJlc2V0ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9TZXRNYWMKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQlvbiB3aGljaCB0byBjaGFuZ2UgdGhlIEFSRUcuCisJICoJCWFyZWcJVGhlIEFSRUcgdG8gc2V0IHRoZSBhZGRyZXNzIGluICgwIC0gMykuCisJICoJCW1hYwlBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMuICBFYWNoCisJICoJCQllbGVtZW50IHN0b3JlcyBvbmUgYnl0ZSBvZiB0aGUgYWRkcmVzcy4KKwkgKgkJCUlFLCBpdCBpc24ndCBpbiBhc2NpaS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIGEgTUFDIGFkZHJlc3MgdG8gb25lIG9mIHRoZQorCSAqCVRMQU4gQVJFR3MgKGFkZHJlc3MgcmVnaXN0ZXJzKS4gIFRoZSBUTEFOIGNoaXAgbG9ja3MKKwkgKgl0aGUgcmVnaXN0ZXIgb24gd3JpdGluZyB0byBvZmZzZXQgMCBhbmQgdW5sb2NrcyB0aGUKKwkgKglyZWdpc3RlciBhZnRlciB3cml0aW5nIHRvIG9mZnNldCA1LiAgSWYgTlVMTCBpcyBwYXNzZWQKKwkgKglpbiBtYWMsIHRoZW4gdGhlIEFSRUcgaXMgZmlsbGVkIHdpdGggMCdzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fU2V0TWFjKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXJlZywgY2hhciAqbWFjICkKK3sKKwlpbnQgaTsKKwkJCQorCWFyZWcgKj0gNjsKKworCWlmICggbWFjICE9IE5VTEwgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgbWFjW2ldICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FSRUdfMCArIGFyZWcgKyBpLCAwICk7CisJfQorCit9IC8qIFRMYW5fU2V0TWFjICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBQSFkgTGF5ZXIgUm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QaHlQcmludAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZQorCSAqCQkJVExBTiBkZXZpY2UgaGF2aW5nIHRoZSBQSFlzIHRvIGJlIGRldGFpbGVkLgorCSAqCQkJCQorCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIHRoZSByZWdpc3RlcnMgYSBQSFkgKGFrYSB0cmFuc2NlaXZlcikuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9QaHlQcmludCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaSwgZGF0YTAsIGRhdGExLCBkYXRhMiwgZGF0YTMsIHBoeTsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgeworCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgVW5tYW5hZ2VkIFBIWS5cbiIsIGRldi0+bmFtZSApOworCX0gZWxzZSBpZiAoIHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUiApIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFBIWSAweCUwMnguXG4iLCBkZXYtPm5hbWUsIHBoeSApOworCQlwcmludGsoICJUTEFOOiAgICAgIE9mZi4gICswICAgICArMSAgICAgKzIgICAgICszIFxuIiApOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMHgyMDsgaSs9IDQgKSB7CisJCQlwcmludGsoICJUTEFOOiAgICAgIDB4JTAyeCIsIGkgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGksICZkYXRhMCApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMCApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDEsICZkYXRhMSApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMSApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDIsICZkYXRhMiApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMiApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDMsICZkYXRhMyApOworCQkJcHJpbnRrKCAiIDB4JTA0aHhcbiIsIGRhdGEzICk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgSW52YWxpZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKKwl9CisKK30gLyogVExhbl9QaHlQcmludCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUGh5RGV0ZWN0CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlIGFkYXB0ZXIKKwkgKgkJCWZvciB3aGljaCB0aGUgUEhZIG5lZWRzIGRldGVybWluZWQuCisJICoKKwkgKglTbyBmYXIgSSd2ZSBmb3VuZCB0aGF0IGFkYXB0ZXJzIHdoaWNoIGhhdmUgZXh0ZXJuYWwgUEhZcworCSAqCW1heSBhbHNvIHVzZSB0aGUgaW50ZXJuYWwgUEhZIGZvciBwYXJ0IG9mIHRoZSBmdW5jdGlvbmFsaXR5LgorCSAqCShlZywgQVVJL1RoaW5uZXQpLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgdGhpcyBUTEFOCisJICoJY2hpcCBoYXMgYW4gaW50ZXJuYWwgUEhZLCBhbmQgdGhlbiBmaW5kcyB0aGUgZmlyc3QgZXh0ZXJuYWwKKwkgKglQSFkgKHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAwKSBpZiBpdCBleGlzdHMpLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5RGV0ZWN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJY29udHJvbDsKKwl1MTYJCWhpOworCXUxNgkJbG87CisJdTMyCQlwaHk7CisKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB7CisJCXByaXYtPnBoeU51bSA9IDB4RkZGRjsKKwkJcmV0dXJuOworCX0KKworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBUTEFOX1BIWV9NQVhfQUREUiwgTUlJX0dFTl9JRF9ISSwgJmhpICk7CisJCisJaWYgKCBoaSAhPSAweEZGRkYgKSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX01BWF9BRERSOworCX0gZWxzZSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX05PTkU7CisJfQorCisJcHJpdi0+cGh5WzFdID0gVExBTl9QSFlfTk9ORTsKKwlmb3IgKCBwaHkgPSAwOyBwaHkgPD0gVExBTl9QSFlfTUFYX0FERFI7IHBoeSsrICkgeworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgJmNvbnRyb2wgKTsKKwkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9ISSwgJmhpICk7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfTE8sICZsbyApOworCQlpZiAoICggY29udHJvbCAhPSAweEZGRkYgKSB8fCAoIGhpICE9IDB4RkZGRiApIHx8ICggbG8gIT0gMHhGRkZGICkgKSB7CisJCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiUEhZIGZvdW5kIGF0ICUwMnggJTA0eCAlMDR4ICUwNHhcbiIsIHBoeSwgY29udHJvbCwgaGksIGxvICk7CisJCQlpZiAoICggcHJpdi0+cGh5WzFdID09IFRMQU5fUEhZX05PTkUgKSAmJiAoIHBoeSAhPSBUTEFOX1BIWV9NQVhfQUREUiApICkgeworCQkJCXByaXYtPnBoeVsxXSA9IHBoeTsKKwkJCX0KKwkJfQorCX0KKworCWlmICggcHJpdi0+cGh5WzFdICE9IFRMQU5fUEhZX05PTkUgKSB7CisJCXByaXYtPnBoeU51bSA9IDE7CisJfSBlbHNlIGlmICggcHJpdi0+cGh5WzBdICE9IFRMQU5fUEhZX05PTkUgKSB7CisJCXByaXYtPnBoeU51bSA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiVExBTjogIENhbm5vdCBpbml0aWFsaXplIGRldmljZSwgbm8gUEhZIHdhcyBmb3VuZCFcbiIgKTsKKwl9CisKK30gLyogVExhbl9QaHlEZXRlY3QgKi8KKworCisKKwordm9pZCBUTGFuX1BoeVBvd2VyRG93biggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCXZhbHVlOworCisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBQb3dlcmluZyBkb3duIFBIWShzKS5cbiIsIGRldi0+bmFtZSApOworCXZhbHVlID0gTUlJX0dDX1BET1dOIHwgTUlJX0dDX0xPT1BCSyB8IE1JSV9HQ19JU09MQVRFOworCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHByaXYtPnBoeVtwcml2LT5waHlOdW1dLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwlpZiAoICggcHJpdi0+cGh5TnVtID09IDAgKSAmJiAoIHByaXYtPnBoeVsxXSAhPSBUTEFOX1BIWV9OT05FICkgJiYgKCAhICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCApICkgKSB7CisJCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbMV0sIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOworCX0KKworCS8qIFdhaXQgZm9yIDUwIG1zIGFuZCBwb3dlcnVwCisJICogVGhpcyBpcyBhYml0cmFyeS4gIEl0IGlzIGludGVuZGVkIHRvIG1ha2Ugc3VyZSB0aGUKKwkgKiB0cmFuc2NlaXZlciBzZXR0bGVzLgorCSAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzIwKSwgVExBTl9USU1FUl9QSFlfUFVQICk7CisKK30gLyogVExhbl9QaHlQb3dlckRvd24gKi8KKworCisKKwordm9pZCBUTGFuX1BoeVBvd2VyVXAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQl2YWx1ZTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgdXAgUEhZLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCXZhbHVlID0gTUlJX0dDX0xPT1BCSzsKKwlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHByaXYtPnBoeVtwcml2LT5waHlOdW1dLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwlUTGFuX01paVN5bmMoZGV2LT5iYXNlX2FkZHIpOworCS8qIFdhaXQgZm9yIDUwMCBtcyBhbmQgcmVzZXQgdGhlCisJICogdHJhbnNjZWl2ZXIuICBUaGUgVExBTiBkb2NzIHNheSBib3RoIDUwIG1zIGFuZAorCSAqIDUwMCBtcywgc28gZG8gdGhlIGxvbmdlciwganVzdCBpbiBjYXNlLgorCSAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzIwKSwgVExBTl9USU1FUl9QSFlfUkVTRVQgKTsKKworfSAvKiBUTGFuX1BoeVBvd2VyVXAgKi8KKworCisKKwordm9pZCBUTGFuX1BoeVJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJcGh5OworCXUxNgkJdmFsdWU7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUmVzZXRpbmcgUEhZLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCXZhbHVlID0gTUlJX0dDX0xPT1BCSyB8IE1JSV9HQ19SRVNFVDsKKwlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSApOworCXdoaWxlICggdmFsdWUgJiBNSUlfR0NfUkVTRVQgKSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUgKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIGluaXRpYWxpemUuCisJICogSSBkb24ndCByZW1lbWJlciB3aHkgSSB3YWl0IHRoaXMgbG9uZy4KKwkgKiBJJ3ZlIGNoYW5nZWQgdGhpcyB0byA1MG1zLCBhcyBpdCBzZWVtcyBsb25nIGVub3VnaC4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksgKTsKKworfSAvKiBUTGFuX1BoeVJlc2V0ICovCisKKworCisKK3ZvaWQgVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQlhYmlsaXR5OworCXUxNgkJY29udHJvbDsKKwl1MTYJCWRhdGE7CisJdTE2CQlwaHk7CisJdTE2CQlzdGF0dXM7CisJdTE2CQl0Y3RsOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBUcnlpbmcgdG8gYWN0aXZhdGUgbGluay5cbiIsIGRldi0+bmFtZSApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZhYmlsaXR5ICk7CisKKwlpZiAoICggc3RhdHVzICYgTUlJX0dTX0FVVE9ORUcgKSAmJiAKKwkgICAgICggISBwcml2LT5hdWkgKSApIHsKKwkJYWJpbGl0eSA9IHN0YXR1cyA+PiAxMTsKKwkJaWYgKCBwcml2LT5zcGVlZCAgPT0gVExBTl9TUEVFRF8xMCAmJiAKKwkJICAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfSEFMRikgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDAwMDApOworCQl9IGVsc2UgaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwICYmCisJCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgwMTAwKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKKwkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfSEFMRikgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDIwMDApOworCQl9IGVsc2UgaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCAmJgorCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MjEwMCk7CisJCX0gZWxzZSB7CisJCisJCQkvKiBTZXQgQXV0by1OZWcgYWR2ZXJ0aXNlbWVudCAqLworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9BTl9BRFYsIChhYmlsaXR5IDw8IDUpIHwgMSk7CisJCQkvKiBFbmFibGVlIEF1dG8tTmVnICovCisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MTAwMCApOworCQkJLyogUmVzdGFydCBBdXRvLU5lZyAqLworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDEyMDAgKTsKKwkJCS8qIFdhaXQgZm9yIDQgc2VjIGZvciBhdXRvbmVnb3RpYXRpb24KKwkJIAkqIHRvIGNvbXBsZXRlLiAgVGhlIG1heCBzcGVjIHRpbWUgaXMgbGVzcyB0aGFuIHRoaXMKKwkJIAkqIGJ1dCB0aGUgY2FyZCBuZWVkIGFkZGl0aW9uYWwgdGltZSB0byBzdGFydCBBTi4KKwkJIAkqIC41IHNlYyBzaG91bGQgYmUgcGxlbnR5IGV4dHJhLgorCQkgCSovCisJCQlwcmludGsoICJUTEFOOiAlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLlxuIiwgZGV2LT5uYW1lICk7CisJCQlUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJfQkKKwkKKwlpZiAoICggcHJpdi0+YXVpICkgJiYgKCBwcml2LT5waHlOdW0gIT0gMCApICkgeworCQlwcml2LT5waHlOdW0gPSAwOworCQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwkJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCBkYXRhICk7CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDQwKkhaLzEwMDApLCBUTEFOX1RJTUVSX1BIWV9QRE9XTiApOworCQlyZXR1cm47CisJfSAgZWxzZSBpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQljb250cm9sID0gMDsKKyAgICAgICAgCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGN0bCApOworCQlpZiAoIHByaXYtPmF1aSApIHsKKyAgICAgICAgICAgICAgICAJdGN0bCB8PSBUTEFOX1RDX0FVSVNFTDsKKwkJfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgCXRjdGwgJj0gflRMQU5fVENfQVVJU0VMOworCQkJaWYgKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19EVVBMRVg7CisJCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJfQorCQkJaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCApIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19TUEVFRFNFTDsKKwkJCX0KKwkJfQorCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIGNvbnRyb2wgKTsKKyAgICAgICAgCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGN0bCApOworCX0KKworCS8qIFdhaXQgZm9yIDIgc2VjIHRvIGdpdmUgdGhlIHRyYW5zY2VpdmVyIHRpbWUKKwkgKiB0byBlc3RhYmxpc2ggbGluay4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsICg0KkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKKworfSAvKiBUTGFuX1BoeVN0YXJ0TGluayAqLworCisKKworCit2b2lkIFRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCWFuX2FkdjsKKwl1MTYJCWFuX2xwYTsKKwl1MTYJCWRhdGE7CisJdTE2CQltb2RlOworCXUxNgkJcGh5OworCXUxNgkJc3RhdHVzOworCQorCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKwl1ZGVsYXkoIDEwMDAgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCisJaWYgKCAhICggc3RhdHVzICYgTUlJX0dTX0FVVE9DTVBMVCApICkgeworCQkvKiBXYWl0IGZvciA4IHNlYyB0byBnaXZlIHRoZSBwcm9jZXNzCisJCSAqIG1vcmUgdGltZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgYWZ0ZXIgYSB3aGlsZS4KKwkJICovCisJCSBpZiAoIXByaXYtPm5lZ19iZV92ZXJib3NlKyspIHsKKwkJCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgR2l2aW5nIGF1dG9uZWdvdGlhdGlvbiBtb3JlIHRpbWUuXG4iKTsKKwkJIAkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIgYWRhcHRlciBoYXNcbiIpOworCQkgCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgYmVlbiBwcm9wZXJseSBjb25uZWN0ZWQgdG8gYSBIVUIgb3IgU3dpdGNoLlxuIik7CisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFRyeWluZyB0byBlc3RhYmxpc2ggbGluayBpbiB0aGUgYmFja2dyb3VuZC4uLlxuIik7CisJCSB9CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDgqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ayggIlRMQU46ICVzOiBBdXRvbmVnb3RpYXRpb24gY29tcGxldGUuXG4iLCBkZXYtPm5hbWUgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAmYW5fYWR2ICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0xQQSwgJmFuX2xwYSApOworCW1vZGUgPSBhbl9hZHYgJiBhbl9scGEgJiAweDAzRTA7CisJaWYgKCBtb2RlICYgMHgwMTAwICkgeworCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJfSBlbHNlIGlmICggISAoIG1vZGUgJiAweDAwODAgKSAmJiAoIG1vZGUgJiAweDAwNDAgKSApIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0KKworCWlmICggKCAhICggbW9kZSAmIDB4MDE4MCApICkgJiYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwICkgJiYgKCBwcml2LT5waHlOdW0gIT0gMCApICkgeworCQlwcml2LT5waHlOdW0gPSAwOworCQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwkJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCBkYXRhICk7CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDQwMCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKKwkJcmV0dXJuOworCX0KKworCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisJCWlmICggKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHx8ICggYW5fYWR2ICYgYW5fbHBhICYgMHgwMDQwICkgKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CIHwgTUlJX0dDX0RVUExFWCApOworCQkJcHJpbnRrKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEZVTEwtRFVQTEVYXG4iICk7CisJCX0gZWxzZSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CICk7CisJCQlwcmludGsoICJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggSEFMRi1EVVBMRVhcbiIgKTsKKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIDEwMCBtcy4gIE5vIHJlYXNvbiBpbiBwYXJ0aXRpY3VsYXIuCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoSFovMTApLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOworCQkKK30gLyogVExhbl9QaHlGaW5pc2hBdXRvTmVnICovCisKKyNpZmRlZiBNT05JVE9SCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAqCisgICAgICAgICogICAgICBUTGFuX3BoeU1vbml0b3IKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUmV0dXJuczogCisgICAgICAgICogICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUGFyYW1zOgorICAgICAgICAqICAgICAgICAgICAgICBkZXYgICAgICAgICAgICAgVGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhpcyBkZXZpY2UuCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIAorICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBtb25pdG9ycyBQSFkgY29uZGl0aW9uIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cworICAgICAgICAqICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBNSUkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdpdmUgaW5mbworICAgICAgICAqICAgICAgYWJvdXQgbGluayBjaGFuZ2VzICh1cC9kb3duKSwgYW5kIHBvc3NpYmxlIHN3aXRjaCB0byBhbHRlcm5hdGUKKyAgICAgICAgKiAgICAgIG1lZGlhLgorICAgICAgICAqCisgICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5TW9uaXRvciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgICAgIHBoeTsKKwl1MTYgICAgIHBoeV9zdGF0dXM7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworICAgICAgICAvKiBHZXQgUEhZIHN0YXR1cyByZWdpc3RlciAqLworICAgICAgICBUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnBoeV9zdGF0dXMgKTsKKworICAgICAgICAvKiBDaGVjayBpZiBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKyAgICAgICAgaWYgKCEocGh5X3N0YXR1cyAmIE1JSV9HU19MSU5LKSkgeyAKKyAJICAgICAgIGlmIChwcml2LT5saW5rKSB7CisJCSAgICAgIHByaXYtPmxpbmsgPSAwOworCSAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlRMQU46ICVzIGhhcyBsb3N0IGxpbmtcbiIsIGRldi0+bmFtZSk7CisJICAgICAgICAgICAgICBkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKwkJICAgICAgVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7CisJCSAgICAgIHJldHVybjsKKwkJfQorCX0KKworICAgICAgICAvKiBMaW5rIHJlc3RhYmxpc2hlZD8gKi8KKyAgICAgICAgaWYgKChwaHlfc3RhdHVzICYgTUlJX0dTX0xJTkspICYmICFwcml2LT5saW5rKSB7CisgCQlwcml2LT5saW5rID0gMTsKKyAgICAgICAgCXByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAlcyBoYXMgcmVlc3RhYmxpc2hlZCBsaW5rXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAJZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKyAgICAgICAgfQorCisJLyogU2V0dXAgYSBuZXcgbW9uaXRvciAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOworfQkKKworI2VuZGlmIC8qIE1PTklUT1IgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgTUlJIFJvdXRpbmVzCisKKwlUaGVzZSByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIENoYXAuIDIgb2YgdGhlCisJIlRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlIiwgcHAuIDE1LTI0LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9NaWlSZWFkUmVnCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwCWlmIGFjayByZWNlaXZlZCBvaworCSAqCQkxCW90aGVyd2lzZS4KKwkgKgorCSAqCVBhcm1zOgorCSAqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcKKwkgKgkJCQlUaGUgaW8gYWRkcmVzcyBhbmQgaW50ZXJydXB0IGNvdW50CisJICoJCQkJZm9yIHRoaXMgZGV2aWNlLgorCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KKwkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJcmV0cmVpdmVkLgorCSAqCQl2YWwJCUEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZQorCSAqCQkJCXJldHJpZXZlZCB2YWx1ZS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgVExBTidzIE1JSSBidXMgdG8gcmV0cmVpdmUgdGhlIGNvbnRlbnRzCisJICoJb2YgYSBnaXZlbiByZWdpc3RlciBvbiBhIFBIWS4gIEl0IHNlbmRzIHRoZSBhcHByb3ByaWF0ZSBpbmZvCisJICoJYW5kIHRoZW4gcmVhZHMgdGhlIDE2LWJpdCByZWdpc3RlciB2YWx1ZSBmcm9tIHRoZSBNSUkgYnVzIHZpYQorCSAqCXRoZSBUTEFOIFNJTyByZWdpc3Rlci4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHBoeSwgdTE2IHJlZywgdTE2ICp2YWwgKQoreworCXU4CW5hY2s7CisJdTE2CXNpbywgdG1wOworIAl1MzIJaTsKKwlpbnQJZXJyOworCWludAltaW50ZW47CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWVyciA9IEZBTFNFOworCW91dHcoVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJc2lvID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCQorCWlmICghaW5faXJxKCkpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlUTGFuX01paVN5bmMoZGV2LT5iYXNlX2FkZHIpOworCisJbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCWlmICggbWludGVuICkKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MSwgMiApOwkvKiBTdGFydCAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MiwgMiApOwkvKiBSZWFkICAoIDEwYiApICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHBoeSwgNSApOwkvKiBEZXZpY2UgIyAgICAgICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHJlZywgNSApOwkvKiBSZWdpc3RlciAjICAgICovCisKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOwkJLyogQ2hhbmdlIGRpcmVjdGlvbiAqLworCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIENsb2NrIElkbGUgYml0ICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIFdhaXQgMzAwbnMgKi8KKworCW5hY2sgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CS8qIENoZWNrIGZvciBBQ0sgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIEZpbmlzaCBBQ0sgKi8KKwlpZiAobmFjaykgewkJCQkJLyogTm8gQUNLLCBzbyBmYWtlIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCX0KKwkJdG1wID0gMHhmZmZmOworCQllcnIgPSBUUlVFOworCX0gZWxzZSB7CQkJCQkvKiBBQ0ssIHNvIHJlYWQgZGF0YSAqLworCQlmb3IgKHRtcCA9IDAsIGkgPSAweDgwMDA7IGk7IGkgPj49IDEpIHsKKwkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCQlpZiAoVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pKQorCQkJCXRtcCB8PSBpOworCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCX0KKwl9CisKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBJZGxlIGN5Y2xlICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisKKwkqdmFsID0gdG1wOworCQorCWlmICghaW5faXJxKCkpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7CisKK30gLyogVExhbl9NaWlSZWFkUmVnICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9NaWlTZW5kRGF0YQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlcglpbgorCSAqCQkJCXF1ZXN0aW9uLgorCSAqCQlkZXYJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KKwkgKgkJZGF0YQkJVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KKwkgKgkJbnVtX2JpdHMJVGhlIG51bWJlciBvZiBiaXRzIGluIGRhdGEgdGhhdCBhcmUgdG8KKwkgKgkJCQliZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIG9uIHNlcXVlbmNlIG9mIGJpdHMgb24gdGhlIE1JSQorCSAqCWNvbmZpZ3VyYXRpb24gYnVzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fTWlpU2VuZERhdGEoIHUxNiBiYXNlX3BvcnQsIHUzMiBkYXRhLCB1bnNpZ25lZCBudW1fYml0cyApCit7CisJdTE2IHNpbzsKKwl1MzIgaTsKKworCWlmICggbnVtX2JpdHMgPT0gMCApCisJCXJldHVybjsKKworCW91dHcoIFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01UWEVOLCBzaW8gKTsKKworCWZvciAoIGkgPSAoIDB4MSA8PCAoIG51bV9iaXRzIC0gMSApICk7IGk7IGkgPj49IDEgKSB7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwkJKHZvaWQpIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCWlmICggZGF0YSAmIGkgKQorCQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NREFUQSwgc2lvICk7CisJCWVsc2UKKwkJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NREFUQSwgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCSh2b2lkKSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCX0KKworfSAvKiBUTGFuX01paVNlbmREYXRhICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9NaWlTeW5jCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWJhc2VfcG9ydAlUaGUgYmFzZSBJTyBwb3J0IG9mIHRoZSBhZGFwdGVyIGluCisJICoJCQkJcXVlc3Rpb24uCisJICoKKwkgKglUaGlzIGZ1bmN0aW9ucyBzeW5jcyBhbGwgUEhZcyBpbiB0ZXJtcyBvZiB0aGUgTUlJIGNvbmZpZ3VyYXRpb24KKwkgKglidXMuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9NaWlTeW5jKCB1MTYgYmFzZV9wb3J0ICkKK3sKKwlpbnQgaTsKKwl1MTYgc2lvOworCisJb3V0dyggVExBTl9ORVRfU0lPLCBiYXNlX3BvcnQgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBiYXNlX3BvcnQgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01UWEVOLCBzaW8gKTsKKwlmb3IgKCBpID0gMDsgaSA8IDMyOyBpKysgKSB7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwl9CisKK30gLyogVExhbl9NaWlTeW5jICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9NaWlXcml0ZVJlZworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlCisJICoJCQkJdG8gd3JpdGUgdG8uCisJICoJCXBoeQkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSB3cml0dGVuIHRvLgorCSAqCQlyZWcJCVRoZSByZWdpc3RlciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUKKwkgKgkJCQl3cml0dGVuLgorCSAqCQl2YWwJCVRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSByZWdpc3Rlci4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgVExBTidzIE1JSSBidXMgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEKKwkgKglnaXZlbiByZWdpc3RlciBvbiBhIFBIWS4gIEl0IHNlbmRzIHRoZSBhcHByb3ByaWF0ZSBpbmZvIGFuZCB0aGVuCisJICoJd3JpdGVzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGNvbmZpZ3VyYXRpb24gYnVzCisJICoJdmlhIHRoZSBUTEFOIFNJTyByZWdpc3Rlci4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVdyaXRlUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcGh5LCB1MTYgcmVnLCB1MTYgdmFsICkKK3sKKwl1MTYJc2lvOworCWludAltaW50ZW47CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW91dHcoVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJc2lvID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCQorCWlmICghaW5faXJxKCkpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisKKwltaW50ZW4gPSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7CisJaWYgKCBtaW50ZW4gKQorCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogU3RhcnQgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogV3JpdGUgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCBwaHksIDUgKTsJLyogRGV2aWNlICMgICAgICAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCByZWcsIDUgKTsJLyogUmVnaXN0ZXIgIyAgICAqLworCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MiwgMiApOwkvKiBTZW5kIEFDSyAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCB2YWwsIDE2ICk7CS8qIFNlbmQgRGF0YSAqLworCisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwkvKiBJZGxlIGN5Y2xlICovCisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKworCWlmICggbWludGVuICkKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCQorCWlmICghaW5faXJxKCkpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworfSAvKiBUTGFuX01paVdyaXRlUmVnICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBFZXByb20gcm91dGluZXMKKworCVRoZSBDb21wYXEgTmV0ZWxsaWdlbnQgMTAgYW5kIDEwLzEwMCBjYXJkcyB1c2UgYSBNaWNyb2NoaXAgMjRDMDJBCisJRUVQUk9NLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBNaWNyb2NoaXAncworCWRhdGEgc2hlZXQuICBJIGRvbid0IGtub3cgaG93IHdlbGwgdGhpcyBmdW5jdGlvbnMgd2lsbCB3b3JrIHdpdGgKKwlvdGhlciBFRVBST01zLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9FZVNlbmRTdGFydAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgkKKwkgKgkJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc3RhcnQgY3ljbGUgdG8gYW4gRUVQUk9NIGF0dGFjaGVkCisJICoJdG8gYSBUTEFOIGNoaXAuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9FZVNlbmRTdGFydCggdTE2IGlvX2Jhc2UgKQoreworCXUxNglzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKworfSAvKiBUTGFuX0VlU2VuZFN0YXJ0ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9FZVNlbmRCeXRlCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlJZiB0aGUgY29ycmVjdCBhY2sgd2FzIHJlY2VpdmVkLCAwLCBvdGhlcndpc2UgMQorCSAqCVBhcm1zOglpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJVGhlIDggYml0cyBvZiBpbmZvcm1hdGlvbiB0bworCSAqCQkJCXNlbmQgdG8gdGhlIEVFUFJPTS4KKwkgKgkJc3RvcAkJSWYgVExBTl9FRVBST01fU1RPUCBpcyBwYXNzZWQsIGEKKwkgKgkJCQlzdG9wIGN5Y2xlIGlzIHNlbnQgYWZ0ZXIgdGhlCisJICoJCQkJYnl0ZSBpcyBzZW50IGFmdGVyIHRoZSBhY2sgaXMKKwkgKgkJCQlyZWFkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGJ5dGUgb24gdGhlIHNlcmlhbCBFRVBST00gbGluZSwKKwkgKglkcml2aW5nIHRoZSBjbG9jayB0byBzZW5kIGVhY2ggYml0LiBUaGUgZnVuY3Rpb24gdGhlbgorCSAqCXJldmVyc2VzIHRyYW5zbWlzc2lvbiBkaXJlY3Rpb24gYW5kIHJlYWRzIGFuIGFja25vd2xlZGdlCisJICoJYml0LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgVExhbl9FZVNlbmRCeXRlKCB1MTYgaW9fYmFzZSwgdTggZGF0YSwgaW50IHN0b3AgKQoreworCWludAllcnI7CisJdTgJcGxhY2U7CisJdTE2CXNpbzsKKworCW91dHcoIFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUiApOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCisJLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KKwlmb3IgKCBwbGFjZSA9IDB4ODA7IHBsYWNlICE9IDA7IHBsYWNlID4+PSAxICkgeworCQlpZiAoIHBsYWNlICYgZGF0YSApCisJCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKKwkJZWxzZQorCQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJfQorCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJZXJyID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKKworCWlmICggKCAhIGVyciApICYmIHN0b3AgKSB7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CS8qIFNUT1AsIHJhaXNlIGRhdGEgd2hpbGUgY2xvY2sgaXMgaGlnaCAqLworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJfQorCisJcmV0dXJuICggZXJyICk7CisKK30gLyogVExhbl9FZVNlbmRCeXRlICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9FZVJlY2VpdmVCeXRlCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorCSAqCQkJCWRhdGEgc2VudCBmcm9tIHRoZSBFRVBST00uCisJICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCisJICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorCSAqCQkJCWJ5dGUgaXMgcmVjZWl2ZWQsIGFuZCBubyBhY2sgaXMKKwkgKgkJCQlzZW50LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiByZWNlaXZlcyA4IGJpdHMgb2YgZGF0YSBmcm9tIHRoZSBFRVBST00KKwkgKglvdmVyIHRoZSBzZXJpYWwgbGluay4gIEl0IHRoZW4gc2VuZHMgYW5kIGFjayBiaXQsIG9yIG5vCisJICoJYWNrIGFuZCBhIHN0b3AgYml0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlCisJICoJZGF0YSBhZnRlciB0aGUgYWRkcmVzcyBvZiBhIGJ5dGUgaW4gdGhlIEVFUFJPTSBoYXMgYmVlbgorCSAqCXNlbnQuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYgaW9fYmFzZSwgdTggKmRhdGEsIGludCBzdG9wICkKK3sKKwl1OCAgcGxhY2U7CisJdTE2IHNpbzsKKworCW91dHcoIFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUiApOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCSpkYXRhID0gMDsKKworCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKKwlmb3IgKCBwbGFjZSA9IDB4ODA7IHBsYWNlOyBwbGFjZSA+Pj0gMSApIHsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCWlmICggVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICkgKQorCQkJKmRhdGEgfD0gcGxhY2U7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJfQorCisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisJaWYgKCAhIHN0b3AgKSB7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CS8qIEFjayA9IDAgKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJfSBlbHNlIHsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CQkvKiBObyBhY2sgPSAxICg/KSAqLworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJLyogU1RPUCwgcmFpc2UgZGF0YSB3aGlsZSBjbG9jayBpcyBoaWdoICovCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKKwl9CisKK30gLyogVExhbl9FZVJlY2VpdmVCeXRlICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9FZVJlYWRCeXRlCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlObyBlcnJvciA9IDAsIGVsc2UsIHRoZSBzdGFnZSBhdCB3aGljaCB0aGUgZXJyb3IKKwkgKgkJb2NjdXJyZWQuCisJICoJUGFybXM6CisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCQllZV9hZGRyCQlUaGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBpbiB0aGUKKwkgKgkJCQlFRVBST00gd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJcmV0cmlldmVkLgorCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorCSAqCQkJCWRhdGEgb2J0YWluZWQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiByZWFkcyBhIGJ5dGUgb2YgaW5mb3JtYXRpb24gZnJvbSBhbiBieXRlCisJICoJY2VsbCBpbiB0aGUgRUVQUk9NLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgVExhbl9FZVJlYWRCeXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBlZV9hZGRyLCB1OCAqZGF0YSApCit7CisJaW50IGVycjsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCByZXQ9MDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlUTGFuX0VlU2VuZFN0YXJ0KCBkZXYtPmJhc2VfYWRkciApOworCWVyciA9IFRMYW5fRWVTZW5kQnl0ZSggZGV2LT5iYXNlX2FkZHIsIDB4QTAsIFRMQU5fRUVQUk9NX0FDSyApOworCWlmIChlcnIpCisJeworCQlyZXQ9MTsKKwkJZ290byBmYWlsOworCX0KKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGRldi0+YmFzZV9hZGRyLCBlZV9hZGRyLCBUTEFOX0VFUFJPTV9BQ0sgKTsKKwlpZiAoZXJyKQorCXsKKwkJcmV0PTI7CisJCWdvdG8gZmFpbDsKKwl9CisJVExhbl9FZVNlbmRTdGFydCggZGV2LT5iYXNlX2FkZHIgKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGRldi0+YmFzZV9hZGRyLCAweEExLCBUTEFOX0VFUFJPTV9BQ0sgKTsKKwlpZiAoZXJyKQorCXsKKwkJcmV0PTM7CisJCWdvdG8gZmFpbDsKKwl9CisJVExhbl9FZVJlY2VpdmVCeXRlKCBkZXYtPmJhc2VfYWRkciwgZGF0YSwgVExBTl9FRVBST01fU1RPUCApOworZmFpbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworCit9IC8qIFRMYW5fRWVSZWFkQnl0ZSAqLworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGxhbi5oIGIvZHJpdmVycy9uZXQvdGxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzJiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90bGFuLmgKQEAgLTAsMCArMSw1NDAgQEAKKyNpZm5kZWYgVExBTl9ICisjZGVmaW5lIFRMQU5fSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIExpbnV4IFRodW5kZXJMQU4gRHJpdmVyCisgKgorICogIHRsYW4uaAorICogIGJ5IEphbWVzIEJhbmtzCisgKgorICogIChDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgorICogIChDKSAxOTk5LTIwMDEgVG9yYmVuIE1hdGhpYXNlbgorICogCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoqIFRoaXMgZmlsZSBpcyBiZXN0IHZpZXdlZC9lZGl0ZWQgd2l0aCB0YWJzdG9wPTQsIGNvbHVtcz49MTMyCisgKgorICogIAorICogIERlYyAxMCwgMTk5OQlUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+CisgKgkJCU5ldyBNYWludGFpbmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQUxTRQkJCTAKKyNkZWZpbmUgVFJVRQkJCTEKKworI2RlZmluZSBUTEFOX01JTl9GUkFNRV9TSVpFCTY0CisjZGVmaW5lIFRMQU5fTUFYX0ZSQU1FX1NJWkUJMTYwMAorCisjZGVmaW5lIFRMQU5fTlVNX1JYX0xJU1RTCTMyCisjZGVmaW5lIFRMQU5fTlVNX1RYX0xJU1RTCTY0CisKKyNkZWZpbmUgVExBTl9JR05PUkUJCTAKKyNkZWZpbmUgVExBTl9SRUNPUkQJCTEKKworI2RlZmluZSBUTEFOX0RCRyhsdmwsIGZvcm1hdCwgYXJncy4uLikJaWYgKGRlYnVnJmx2bCkgcHJpbnRrKEtFUk5fREVCVUcgIlRMQU46ICIgZm9ybWF0LCAjI2FyZ3MgKTsKKyNkZWZpbmUgVExBTl9ERUJVR19HTlJMCQkweDAwMDEKKyNkZWZpbmUgVExBTl9ERUJVR19UWAkJMHgwMDAyCisjZGVmaW5lIFRMQU5fREVCVUdfUlgJCTB4MDAwNCAKKyNkZWZpbmUgVExBTl9ERUJVR19MSVNUCQkweDAwMDgKKyNkZWZpbmUgVExBTl9ERUJVR19QUk9CRQkweDAwMTAKKworI2RlZmluZSBUWF9USU1FT1VUCQkoMTAqSFopCSAvKiBXZSBuZWVkIHRpbWUgZm9yIGF1dG8tbmVnICovCisjZGVmaW5lIE1BWF9UTEFOX0JPQVJEUwkJOAkgLyogTWF4IG51bWJlciBvZiBib2FyZHMgaW5zdGFsbGVkIGF0IGEgdGltZSAqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBEZXZpY2UgSWRlbnRpZmljYXRpb24gRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMgkJCTB4QjAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwCTB4QjAzMAorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCQkJMHgwMDEzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQkJCTB4MDAxMgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYJCQkweDAwMTQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0bGFuX2FkYXB0ZXJfZW50cnkgeworCXUxNgl2ZW5kb3JJZDsKKwl1MTYJZGV2aWNlSWQ7CisJY2hhcgkqZGV2aWNlTGFiZWw7CisJdTMyCWZsYWdzOworCXUxNglhZGRyT2ZzOworfSBUTGFuQWRhcHRlckVudHJ5OworCisjZGVmaW5lIFRMQU5fQURBUFRFUl9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZCTB4MDAwMDAwMDEKKyNkZWZpbmUgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWQkweDAwMDAwMDAyCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwCTB4MDAwMDAwMDQKKyNkZWZpbmUgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRAkweDAwMDAwMDA4CisKKyNkZWZpbmUgVExBTl9TUEVFRF9ERUZBVUxUCTAKKyNkZWZpbmUgVExBTl9TUEVFRF8xMAkJMTAKKyNkZWZpbmUgVExBTl9TUEVFRF8xMDAJCTEwMAorCisjZGVmaW5lIFRMQU5fRFVQTEVYX0RFRkFVTFQJMAorI2RlZmluZSBUTEFOX0RVUExFWF9IQUxGCTEKKyNkZWZpbmUgVExBTl9EVVBMRVhfRlVMTAkyCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRUlTQSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUlTQV9JRCAgICAgIDB4YzgwICAgLyogRUlTQSBJRCBSZWdpc3RlcnMgKi8gCisjZGVmaW5lIEVJU0FfSUQwICAgICAweGM4MCAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMCAqLyAKKyNkZWZpbmUgRUlTQV9JRDEgICAgIDB4YzgxICAgLyogRUlTQSBJRCBSZWdpc3RlciAxICovIAorI2RlZmluZSBFSVNBX0lEMiAgICAgMHhjODIgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDIgKi8gCisjZGVmaW5lIEVJU0FfSUQzICAgICAweGM4MyAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMyAqLyAKKyNkZWZpbmUgRUlTQV9DUiAgICAgIDB4Yzg0ICAgLyogRUlTQSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEVJU0FfUkVHMCAgICAweGM4OCAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwICovCisjZGVmaW5lIEVJU0FfUkVHMSAgICAweGM4OSAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEVJU0FfUkVHMiAgICAweGM4YSAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIEVJU0FfUkVHMyAgICAweGM4ZiAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzICovCisjZGVmaW5lIEVJU0FfQVBST00gICAweGM5MCAgIC8qIEV0aGVybmV0IEFkZHJlc3MgUFJPTSAqLworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFJ4L1R4IExpc3QgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fQlVGRkVSU19QRVJfTElTVAkxMAorI2RlZmluZSBUTEFOX0xBU1RfQlVGRkVSCTB4ODAwMDAwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9VTlVTRUQJMHg4MDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRlJNX0NNUAkweDQwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9SRUFEWQkweDMwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9FT0MJCTB4MDgwMAorI2RlZmluZSBUTEFOX0NTVEFUX1JYX0VSUk9SCTB4MDQwMAorI2RlZmluZSBUTEFOX0NTVEFUX1BBU1NfQ1JDCTB4MDIwMAorI2RlZmluZSBUTEFOX0NTVEFUX0RQX1BSCTB4MDEwMAorCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fYnVmZmVyX3JlZl90YWcgeworCXUzMgljb3VudDsKKwl1MzIJYWRkcmVzczsKK30gVExhbkJ1ZmZlclJlZjsKKworCit0eXBlZGVmIHN0cnVjdCB0bGFuX2xpc3RfdGFnIHsKKwl1MzIJCWZvcndhcmQ7CisJdTE2CQljU3RhdDsKKwl1MTYJCWZyYW1lU2l6ZTsKKwlUTGFuQnVmZmVyUmVmCWJ1ZmZlcltUTEFOX0JVRkZFUlNfUEVSX0xJU1RdOworfSBUTGFuTGlzdDsKKworCit0eXBlZGVmIHU4IFRMYW5CdWZmZXJbVExBTl9NQVhfRlJBTUVfU0laRV07CisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQSFkgZGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fUEhZX01BWF9BRERSCTB4MUYKKyNkZWZpbmUgVExBTl9QSFlfTk9ORQkJMHgyMAorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExBTiBQcml2YXRlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fcHJpdmF0ZV90YWcgeworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpuZXh0RGV2aWNlOworCXN0cnVjdCBwY2lfZGV2CQkqcGNpRGV2OworCXZvaWQJCQkqZG1hU3RvcmFnZTsKKwlkbWFfYWRkcl90CQlkbWFTdG9yYWdlRE1BOworCXVuc2lnbmVkIGludAkJZG1hU2l6ZTsKKwl1OAkJCSpwYWRCdWZmZXI7CisJVExhbkxpc3QgICAgICAgICAgICAgICAgKnJ4TGlzdDsKKwlkbWFfYWRkcl90CQlyeExpc3RETUE7CisJdTgJCQkqcnhCdWZmZXI7CisJZG1hX2FkZHJfdAkJcnhCdWZmZXJETUE7CisJdTMyICAgICAgICAgICAgICAgICAgICAgcnhIZWFkOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHJ4VGFpbDsKKwl1MzIJCQlyeEVvY0NvdW50OworCVRMYW5MaXN0ICAgICAgICAgICAgICAgICp0eExpc3Q7CisJZG1hX2FkZHJfdAkJdHhMaXN0RE1BOworCXU4CQkJKnR4QnVmZmVyOworCWRtYV9hZGRyX3QJCXR4QnVmZmVyRE1BOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4SGVhZDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICB0eEluUHJvZ3Jlc3M7CisJdTMyICAgICAgICAgICAgICAgICAgICAgdHhUYWlsOworCXUzMgkJCXR4QnVzeUNvdW50OworCXUzMiAgICAgICAgICAgICAgICAgICAgIHBoeU9ubGluZTsKKwl1MzIJCQl0aW1lclNldEF0OworCXUzMgkJCXRpbWVyVHlwZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgYm9hcmQJCSphZGFwdGVyOworCXUzMgkJCWFkYXB0ZXJSZXY7CisJdTMyCQkJYXVpOworCXUzMgkJCWRlYnVnOworCXUzMgkJCWR1cGxleDsKKwl1MzIJCQlwaHlbMl07CisJdTMyCQkJcGh5TnVtOworCXUzMgkJCXNwZWVkOworCXU4CQkJdGxhblJldjsKKwl1OAkJCXRsYW5GdWxsRHVwbGV4OworCWNoYXIgICAgICAgICAgICAgICAgICAgIGRldk5hbWVbOF07CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1OAkJCWxpbms7CisJdTgJCQlpc19laXNhOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJCXRsYW5fdHF1ZXVlOworCXU4CQkJbmVnX2JlX3ZlcmJvc2U7Cit9IFRMYW5Qcml2YXRlSW5mbzsKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRHJpdmVyIFRpbWVyIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX1RJTUVSX0xJTktfQkVBVAkJMQorI2RlZmluZSBUTEFOX1RJTUVSX0FDVElWSVRZCQkyCisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1BET1dOCQkzCisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1BVUAkJNAorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9SRVNFVAkJNQorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9TVEFSVF9MSU5LCTYKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOCTcKKyNkZWZpbmUgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQJCTgKKworI2RlZmluZSBUTEFOX1RJTUVSX0FDVF9ERUxBWQkJKEhaLzEwKQorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEcml2ZXIgRWVwcm9tIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0VFUFJPTV9BQ0sJCTAKKyNkZWZpbmUgVExBTl9FRVBST01fU1RPUAkxCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBIb3N0IFJlZ2lzdGVyIE9mZnNldHMgYW5kIENvbnRlbnRzCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0hPU1RfQ01ECQkJMHgwMAorI2RlZmluZSAJVExBTl9IQ19HTwkJMHg4MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19TVE9QCQkweDQwMDAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FDSwkJMHgyMDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19DU19NQVNLCQkweDFGRTAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0VPQwkJMHgwMDEwMDAwMAorI2RlZmluZQkJVExBTl9IQ19SVAkJMHgwMDA4MDAwMAorI2RlZmluZQkJVExBTl9IQ19ORVMJCTB4MDAwNDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQURfUlNUCQkweDAwMDA4MDAwCisjZGVmaW5lCQlUTEFOX0hDX0xEX1RNUgkJMHgwMDAwNDAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9USFIJCTB4MDAwMDIwMDAKKyNkZWZpbmUJCVRMQU5fSENfUkVRX0lOVAkJMHgwMDAwMTAwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT0ZGCQkweDAwMDAwODAwCisjZGVmaW5lCQlUTEFOX0hDX0lOVF9PTgkJMHgwMDAwMDQwMAorI2RlZmluZQkJVExBTl9IQ19BQ19NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIFRMQU5fQ0hfUEFSTQkJCTB4MDQKKyNkZWZpbmUgVExBTl9ESU9fQURSCQkJMHgwOAorI2RlZmluZQkJVExBTl9EQV9BRFJfSU5DCQkweDgwMDAKKyNkZWZpbmUJCVRMQU5fREFfUkFNX0FEUgkJMHg0MDAwCisjZGVmaW5lIFRMQU5fSE9TVF9JTlQJCQkweDBBCisjZGVmaW5lCQlUTEFOX0hJX0lWX01BU0sJCTB4MUZFMAorI2RlZmluZQkJVExBTl9ISV9JVF9NQVNLCQkweDAwMUMKKyNkZWZpbmUgVExBTl9ESU9fREFUQQkJCTB4MEMKKworCisvKiBUaHVuZGVyTEFOIEludGVybmFsIFJlZ2lzdGVyIERJTyBPZmZzZXRzICovCisKKyNkZWZpbmUgVExBTl9ORVRfQ01ECQkJMHgwMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05SRVNFVAkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTldSQVAJMHg0MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NTRgkweDIwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfQ0FGCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OT0JSWAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9DTURfRFVQTEVYCTB4MDQKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UUkZSQU0JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfQ01EX1RYUEFDRQkweDAxCisjZGVmaW5lIFRMQU5fTkVUX1NJTwkJCTB4MDEKKyNkZWZpbmUgCVRMQU5fTkVUX1NJT19NSU5URU4JMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VDTE9LCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FVFhFTgkweDIwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRURBVEEJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX05NUlNUCTB4MDgKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19NQ0xLCTB4MDQKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19NVFhFTgkweDAyCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTURBVEEJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TVFMJCQkweDAyCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfTUlSUQkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfSEJFQVQJMHg0MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1RYU1RPUAkweDIwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlhTVE9QCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19SU1JWRAkweDBGCisjZGVmaW5lIFRMQU5fTkVUX01BU0sJCQkweDAzCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s3CTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzYJMHg0MAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNQkweDIwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s0CTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9DT05GSUcJCQkweDA0CisjZGVmaW5lIAlUTEFOX05FVF9DRkdfUkNMSwkweDgwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19UQ0xLCTB4NDAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX0JJVAkweDIwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19SWENSQwkweDEwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19QRUYJMHgwODAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfMUZSQUcJMHgwNDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfMUNIQU4JMHgwMjAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfTVRFU1QJMHgwMTAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEhZX0VOCTB4MDA4MAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01TTUFTSwkweDAwN0YKKyNkZWZpbmUgVExBTl9NQU5fVEVTVAkJCTB4MDYKKyNkZWZpbmUgVExBTl9ERUZfVkVORE9SX0lECQkweDA4CisjZGVmaW5lIFRMQU5fREVGX0RFVklDRV9JRAkJMHgwQQorI2RlZmluZSBUTEFOX0RFRl9SRVZJU0lPTgkJMHgwQworI2RlZmluZSBUTEFOX0RFRl9TVUJDTEFTUwkJMHgwRAorI2RlZmluZSBUTEFOX0RFRl9NSU5fTEFUCQkweDBFCisjZGVmaW5lIFRMQU5fREVGX01BWF9MQVQJCTB4MEYKKyNkZWZpbmUgVExBTl9BUkVHXzAJCQkweDEwCisjZGVmaW5lIFRMQU5fQVJFR18xCQkJMHgxNgorI2RlZmluZSBUTEFOX0FSRUdfMgkJCTB4MUMKKyNkZWZpbmUgVExBTl9BUkVHXzMJCQkweDIyCisjZGVmaW5lIFRMQU5fSEFTSF8xCQkJMHgyOAorI2RlZmluZSBUTEFOX0hBU0hfMgkJCTB4MkMKKyNkZWZpbmUgVExBTl9HT09EX1RYX0ZSTVMJCTB4MzAKKyNkZWZpbmUgVExBTl9UWF9VTkRFUlVOUwkJMHgzMworI2RlZmluZSBUTEFOX0dPT0RfUlhfRlJNUwkJMHgzNAorI2RlZmluZSBUTEFOX1JYX09WRVJSVU5TCQkweDM3CisjZGVmaW5lIFRMQU5fREVGRVJSRURfVFgJCTB4MzgKKyNkZWZpbmUgVExBTl9DUkNfRVJST1JTCQkJMHgzQQorI2RlZmluZSBUTEFOX0NPREVfRVJST1JTCQkweDNCCisjZGVmaW5lIFRMQU5fTVVMVElDT0xfRlJNUwkJMHgzQworI2RlZmluZSBUTEFOX1NJTkdMRUNPTF9GUk1TCQkweDNFCisjZGVmaW5lIFRMQU5fRVhDRVNTQ09MX0ZSTVMJCTB4NDAKKyNkZWZpbmUgVExBTl9MQVRFX0NPTFMJCQkweDQxCisjZGVmaW5lIFRMQU5fQ0FSUklFUl9MT1NTCQkweDQyCisjZGVmaW5lIFRMQU5fQUNPTU1JVAkJCTB4NDMKKyNkZWZpbmUgVExBTl9MRURfUkVHCQkJMHg0NAorI2RlZmluZQkJVExBTl9MRURfQUNUCQkweDEwCisjZGVmaW5lCQlUTEFOX0xFRF9MSU5LCQkweDAxCisjZGVmaW5lIFRMQU5fQlNJWkVfUkVHCQkJMHg0NQorI2RlZmluZSBUTEFOX01BWF9SWAkJCTB4NDYKKyNkZWZpbmUgVExBTl9JTlRfRElTCQkJMHg0OAorI2RlZmluZQkJVExBTl9JRF9UWF9FT0MJCTB4MDQKKyNkZWZpbmUJCVRMQU5fSURfUlhfRU9GCQkweDAyCisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPQwkJMHgwMQorCisKKworLyogVGh1bmRlckxBTiBJbnRlcnJ1cHQgQ29kZXMgKi8KKworI2RlZmluZSBUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UUwk4CisKKyNkZWZpbmUgVExBTl9JTlRfTk9ORQkJCTB4MDAwMAorI2RlZmluZSBUTEFOX0lOVF9UWF9FT0YJCQkweDAwMDEKKyNkZWZpbmUgVExBTl9JTlRfU1RBVF9PVkVSRkxPVwkJMHgwMDAyCisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPRgkJCTB4MDAwMworI2RlZmluZSBUTEFOX0lOVF9EVU1NWQkJCTB4MDAwNAorI2RlZmluZSBUTEFOX0lOVF9UWF9FT0MJCQkweDAwMDUKKyNkZWZpbmUgVExBTl9JTlRfU1RBVFVTX0NIRUNLCQkweDAwMDYKKyNkZWZpbmUgVExBTl9JTlRfUlhfRU9DCQkJMHgwMDA3CisKKworCisvKiBUaHVuZGVyTEFOIE1JSSBSZWdpc3RlcnMgKi8KKworLyogR2VuZXJpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1JSV9HRU5fQ1RMCQkJMHgwMAorI2RlZmluZSAJTUlJX0dDX1JFU0VUCQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HQ19MT09QQksJCTB4NDAwMAorI2RlZmluZQkJTUlJX0dDX1NQRUVEU0VMCQkweDIwMDAKKyNkZWZpbmUJCU1JSV9HQ19BVVRPRU5CCQkweDEwMDAKKyNkZWZpbmUJCU1JSV9HQ19QRE9XTgkJMHgwODAwCisjZGVmaW5lCQlNSUlfR0NfSVNPTEFURQkJMHgwNDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT1JTUlQJCTB4MDIwMAorI2RlZmluZQkJTUlJX0dDX0RVUExFWAkJMHgwMTAwCisjZGVmaW5lCQlNSUlfR0NfQ09MVEVTVAkJMHgwMDgwCisjZGVmaW5lCQlNSUlfR0NfUkVTRVJWRUQJCTB4MDA3RgorI2RlZmluZSBNSUlfR0VOX1NUUwkJCTB4MDEKKyNkZWZpbmUJCU1JSV9HU18xMDBCVDQJCTB4ODAwMAorI2RlZmluZQkJTUlJX0dTXzEwMEJUWEZECQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhIRAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEZECQkweDEwMDAKKyNkZWZpbmUJCU1JSV9HU18xMEJUSEQJCTB4MDgwMAorI2RlZmluZQkJTUlJX0dTX1JFU0VSVkVECQkweDA3QzAKKyNkZWZpbmUJCU1JSV9HU19BVVRPQ01QTFQJMHgwMDIwCisjZGVmaW5lCQlNSUlfR1NfUkZMVAkJMHgwMDEwCisjZGVmaW5lCQlNSUlfR1NfQVVUT05FRwkJMHgwMDA4CisjZGVmaW5lCQlNSUlfR1NfTElOSwkJMHgwMDA0CisjZGVmaW5lCQlNSUlfR1NfSkFCQkVSCQkweDAwMDIKKyNkZWZpbmUJCU1JSV9HU19FWFRDQVAJCTB4MDAwMQorI2RlZmluZSBNSUlfR0VOX0lEX0hJCQkJMHgwMgorI2RlZmluZSBNSUlfR0VOX0lEX0xPCQkJMHgwMworI2RlZmluZSAJTUlJX0dJTF9PVUkJCTB4RkMwMAorI2RlZmluZSAJTUlJX0dJTF9NT0RFTAkJMHgwM0YwCisjZGVmaW5lIAlNSUlfR0lMX1JFVklTSU9OCTB4MDAwRgorI2RlZmluZSBNSUlfQU5fQURWCQkJMHgwNAorI2RlZmluZSBNSUlfQU5fTFBBCQkJMHgwNQorI2RlZmluZSBNSUlfQU5fRVhQCQkJMHgwNgorCisvKiBUaHVuZGVyTEFOIFNwZWNpZmljIE1JSS9QSFkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgVExBTl9UTFBIWV9JRAkJCTB4MTAKKyNkZWZpbmUgVExBTl9UTFBIWV9DVEwJCQkweDExCisjZGVmaW5lIAlUTEFOX1RDX0lHTElOSwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RDX1NXQVBPTAkJMHg0MDAwCisjZGVmaW5lCQlUTEFOX1RDX0FVSVNFTAkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RDX1NRRUVOCQkweDEwMDAKKyNkZWZpbmUJCVRMQU5fVENfTVRFU1QJCTB4MDgwMAorI2RlZmluZQkJVExBTl9UQ19SRVNFUlZFRAkweDA3RjgKKyNkZWZpbmUJCVRMQU5fVENfTkZFVwkJMHgwMDA0CisjZGVmaW5lCQlUTEFOX1RDX0lOVEVOCQkweDAwMDIKKyNkZWZpbmUJCVRMQU5fVENfVElOVAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fVExQSFlfU1RTCQkJMHgxMgorI2RlZmluZQkJVExBTl9UU19NSU5UCQkweDgwMDAKKyNkZWZpbmUJCVRMQU5fVFNfUEhPSwkJMHg0MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BPTE9LCQkweDIwMDAKKyNkZWZpbmUJCVRMQU5fVFNfVFBFTkVSR1kJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RTX1JFU0VSVkVECTB4MEZGRgorI2RlZmluZSBUTEFOX1RMUEhZX1BBUgkJCTB4MTkKKyNkZWZpbmUJCVRMQU5fUEhZX0NJTV9TVEFUCTB4MDAyMAorI2RlZmluZQkJVExBTl9QSFlfU1BFRURfMTAwCTB4MDA0MAorI2RlZmluZQkJVExBTl9QSFlfRFVQTEVYX0ZVTEwJMHgwMDgwCisjZGVmaW5lCQlUTEFOX1BIWV9BTl9FTl9TVEFUICAgICAweDA0MDAKKworLyogTmF0aW9uYWwgU2VtLiAmIExldmVsMSBQSFkgaWQncyAqLworI2RlZmluZSBOQVRfU0VNX0lEMQkJCTB4MjAwMAorI2RlZmluZSBOQVRfU0VNX0lEMgkJCTB4NUMwMQorI2RlZmluZSBMRVZFTDFfSUQxCQkJMHg3ODEwCisjZGVmaW5lIExFVkVMMV9JRDIJCQkweDAwMDAKKworI2RlZmluZSBDSVJDX0lOQyggYSwgYiApIGlmICggKythID49IGIgKSBhID0gMAorCisvKiBSb3V0aW5lcyB0byBhY2Nlc3MgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCitzdGF0aWMgaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOworCQorfSAvKiBUTGFuX0Rpb1JlYWQ4ICovCisKKworCisKK3N0YXRpYyBpbmxpbmUgdTE2IFRMYW5fRGlvUmVhZDE2KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlyZXR1cm4gKGludygoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpKTsKKworfSAvKiBUTGFuX0Rpb1JlYWQxNiAqLworCisKKworCitzdGF0aWMgaW5saW5lIHUzMiBUTGFuX0Rpb1JlYWQzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbmwoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkpOworCit9IC8qIFRMYW5fRGlvUmVhZDMyICovCisKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlOCh1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTggZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0YihkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDMpKTsKKworfQorCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTE2KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MTYgZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0dyhkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKKworfQorCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTMyKHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MzIgZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0bChkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKKworfQorCisjZGVmaW5lIFRMYW5fQ2xlYXJCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSAmIH5iaXQsIHBvcnQpCisjZGVmaW5lIFRMYW5fR2V0Qml0KCBiaXQsIHBvcnQgKQkoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSkKKyNkZWZpbmUgVExhbl9TZXRCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSB8IGJpdCwgcG9ydCkKKworLyoKKyAqIGdpdmVuIDYgYnl0ZXMsIHZpZXcgdGhlbSBhcyA4IDYtYml0IG51bWJlcnMgYW5kIHJldHVybiB0aGUgWE9SIG9mIHRob3NlIAorICogdGhlIGNvZGUgYmVsb3cgaXMgYWJvdXQgc2V2ZW4gdGltZXMgYXMgZmFzdCBhcyB0aGUgb3JpZ2luYWwgY29kZSAKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29kZSB3YXM6CisgKgorICogdTMyCXhvciggdTMyIGEsIHUzMiBiICkgewlyZXR1cm4gKCAoIGEgJiYgISBiICkgfHwgKCAhIGEgJiYgYiApICk7IH0KKyAqCisgKiAjZGVmaW5lIFhPUjgoIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGggKQlcCisgKiAJeG9yKCBhLCB4b3IoIGIsIHhvciggYywgeG9yKCBkLCB4b3IoIGUsIHhvciggZiwgeG9yKCBnLCBoICkgKSApICkgKSApICkKKyAqICNkZWZpbmUgREEoIGEsIGJpdCApCQkoICggKHU4KSBhW2JpdC84XSApICYgKCAodTgpICggMSA8PCBiaXQlOCApICkgKQorICoKKyAqIAloYXNoICA9IFhPUjgoIERBKGEsMCksIERBKGEsIDYpLCBEQShhLDEyKSwgREEoYSwxOCksIERBKGEsMjQpLCBEQShhLDMwKSwgREEoYSwzNiksIERBKGEsNDIpICk7CisgKiAJaGFzaCB8PSBYT1I4KCBEQShhLDEpLCBEQShhLCA3KSwgREEoYSwxMyksIERBKGEsMTkpLCBEQShhLDI1KSwgREEoYSwzMSksIERBKGEsMzcpLCBEQShhLDQzKSApIDw8IDE7CisgKiAJaGFzaCB8PSBYT1I4KCBEQShhLDIpLCBEQShhLCA4KSwgREEoYSwxNCksIERBKGEsMjApLCBEQShhLDI2KSwgREEoYSwzMiksIERBKGEsMzgpLCBEQShhLDQ0KSApIDw8IDI7CisgKiAJaGFzaCB8PSBYT1I4KCBEQShhLDMpLCBEQShhLCA5KSwgREEoYSwxNSksIERBKGEsMjEpLCBEQShhLDI3KSwgREEoYSwzMyksIERBKGEsMzkpLCBEQShhLDQ1KSApIDw8IDM7CisgKiAJaGFzaCB8PSBYT1I4KCBEQShhLDQpLCBEQShhLDEwKSwgREEoYSwxNiksIERBKGEsMjIpLCBEQShhLDI4KSwgREEoYSwzNCksIERBKGEsNDApLCBEQShhLDQ2KSApIDw8IDQ7CisgKiAJaGFzaCB8PSBYT1I4KCBEQShhLDUpLCBEQShhLDExKSwgREEoYSwxNyksIERBKGEsMjMpLCBEQShhLDI5KSwgREEoYSwzNSksIERBKGEsNDEpLCBEQShhLDQ3KSApIDw8IDU7CisgKgorICovCitzdGF0aWMgaW5saW5lIHUzMiBUTGFuX0hhc2hGdW5jKCBjb25zdCB1OCAqYSApCit7CisgICAgICAgIHU4ICAgICBoYXNoOworCisgICAgICAgIGhhc2ggPSAoYVswXV5hWzNdKTsgICAgICAgICAgICAgLyogJiAwNzcgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMF1eYVszXSk+PjYpOyAgICAgICAvKiAmIDAwMyAqLworICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKTw8Mik7ICAgICAgIC8qICYgMDc0ICovCisgICAgICAgIGhhc2ggXj0gKChhWzFdXmFbNF0pPj40KTsgICAgICAgLyogJiAwMTcgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk8PDQpOyAgICAgICAvKiAmIDA2MCAqLworICAgICAgICBoYXNoIF49ICgoYVsyXV5hWzVdKT4+Mik7ICAgICAgIC8qICYgMDc3ICovCisKKyAgICAgICAgcmV0dXJuIChoYXNoICYgMDc3KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFkY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKQEAgLTAsMCArMSwxODMwIEBACisvKgorICogICAzYzM1OS5jIChjKSAyMDAwIE1pa2UgUGhpbGxpcHMgKG1pa2VwQGxpbnV4dHIubmV0KSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIExpbnV4IGRyaXZlciBmb3IgM0NvbSAzYzM1OSBUb2tlbmxpbmsgVmVsb2NpdHkgWEwgUENJIE5JQworICoKKyAqICBCYXNlIERyaXZlciBPbHltcGljOgorICoJV3JpdHRlbiAxOTk5IFBldGVyIERlIFNjaHJpanZlciAmIE1pa2UgUGhpbGxpcHMKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqICA3LzE3LzAwIC0gQ2xlYW4gdXAsIHZlcnNpb24gbnVtYmVyIDAuOS4wLiBSZWFkeSB0byByZWxlYXNlIHRvIHRoZSB3b3JsZC4KKyAqCisgKiAgMi8xNi8wMSAtIFBvcnQgdXAgdG8ga2VybmVsIDIuNC4yIHJlYWR5IGZvciBzdWJtaXNzaW9uIGludG8gdGhlIGtlcm5lbC4KKyAqICAzLzA1LzAxIC0gTGFzdCBjbGVhbiB1cCBzdHVmZiBiZWZvcmUgc3VibWlzc2lvbi4KKyAqICAyLzE1LzAxIC0gRmluYWxseSwgdXBkYXRlIHRvIG5ldyBwY2kgYXBpLiAKKyAqCisgKiAgVG8gRG86CisgKi8KKworLyogCisgKglUZWNobmljYWwgQ2FyZCBEZXRhaWxzCisgKgorICogIEFsbCBhY2Nlc3MgdG8gZGF0YSBpcyBkb25lIHdpdGggMTYvOCBiaXQgdHJhbnNmZXJzLiAgVGhlIHRyYW5zZmVyCisgKiAgbWV0aG9kIHJlYWxseSBzdWNrcy4gWW91IGNhbiBvbmx5IHJlYWQgb3Igd3JpdGUgb25lIGxvY2F0aW9uIGF0IGEgdGltZS4KKyAqCisgKiAgQWxzbywgdGhlIG1pY3JvY29kZSBmb3IgdGhlIGNhcmQgbXVzdCBiZSB1cGxvYWRlZCBpZiB0aGUgY2FyZCBkb2VzIG5vdCBoYXZlCisgKiAgdGhlIGZsYXNocm9tIG9uIGJvYXJkLiAgVGhpcyBpcyBhIDI4SyBibG9hdCBpbiB0aGUgZHJpdmVyIHdoZW4gY29tcGlsZWQKKyAqICBhcyBhIG1vZHVsZS4KKyAqCisgKiAgUnggaXMgdmVyeSBzaW1wbGUsIHN0YXR1cyBpbnRvIGEgcmluZyBvZiBkZXNjcmlwdG9ycywgZG1hIGRhdGEgdHJhbnNmZXIsCisgKiAgaW50ZXJydXB0cyB0byB0ZWxsIHVzIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKgorICogIFR4IGlzIGEgbGl0dGxlIG1vcmUgaW50ZXJlc3RpbmcuIFNpbWlsYXIgc2NlbmFyaW8sIGRlc2NyaXB0b3IgYW5kIGRtYSBkYXRhCisgKiAgdHJhbnNmZXJzLCBidXQgd2UgZG9uJ3QgaGF2ZSB0byBpbnRlcnJ1cHQgdGhlIGNhcmQgdG8gdGVsbCBpdCBhbm90aGVyIHBhY2tldAorICogIGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24sIHdlIGFyZSBqdXN0IGRvaW5nIHNpbXBsZSBtZW1vcnkgd3JpdGVzLCBub3QgaW8gb3IgbW1pbworICogIHdyaXRlcy4gIFRoZSBjYXJkIGNhbiBiZSBzZXQgdXAgdG8gc2ltcGx5IHBvbGwgb24gdGhlIG5leHQKKyAqICBkZXNjcmlwdG9yIHBvaW50ZXIgYW5kIHdoZW4gdGhpcyB2YWx1ZSBpcyBub24temVybyB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQKKyAqICB0aGUgbmV4dCBwYWNrZXQuICBUaGUgY2FyZCB0aGVuIGludGVycnVwdHMgdXMgd2hlbiB0aGUgcGFja2V0IGlzIGRvbmUuCisgKgorICovCisKKyNkZWZpbmUgWExfREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiM2MzNTkuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgID0gCisiM2MzNTkuYyB2MS4yLjAgMi8xNy8wMSAtIE1pa2UgUGhpbGxpcHMgKG1pa2VwQGxpbnV4dHIubmV0KSIgOyAKKworTU9EVUxFX0FVVEhPUigiTWlrZSBQaGlsbGlwcyA8bWlrZXBAbGludXh0ci5uZXQ+IikgOyAKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSAzQzM1OSBWZWxvY2l0eSBYTCBUb2tlbiBSaW5nIEFkYXB0ZXIgRHJpdmVyIFxuIikgOworCisvKiBNb2R1bGUgcGFyYW10ZXJzICovCisKKy8qIFJpbmcgU3BlZWQgMCw0LDE2IAorICogMCA9IEF1dG9zZW5zZSAgIAorICogNCwxNiA9IFNlbGVjdGVkIHNwZWVkIG9ubHksIG5vIGF1dG9zZW5zZQorICogVGhpcyBhbGxvd3MgdGhlIGNhcmQgdG8gYmUgdGhlIGZpcnN0IG9uIHRoZSByaW5nCisgKiBhbmQgYmVjb21lIHRoZSBhY3RpdmUgbW9uaXRvci4KKyAqCisgKiBXQVJOSU5HOiBTb21lIGh1YnMgd2lsbCBhbGxvdyB5b3UgdG8gaW5zZXJ0CisgKiBhdCB0aGUgd3Jvbmcgc3BlZWQuCisgKiAKKyAqIFRoZSBhZGFwdGVyIHdpbGwgX25vdF8gZmFpbCB0byBvcGVuIGlmIHRoZXJlIGFyZSBubworICogYWN0aXZlIG1vbml0b3JzIG9uIHRoZSByaW5nLCBpdCB3aWxsIHNpbXBseSBvcGVuIHVwIGluIAorICogaXRzIGxhc3Qga25vd24gcmluZ3NwZWVkIGlmIG5vIHJpbmdzcGVlZCBpcyBzcGVjaWZpZWQuCisgKi8KKworc3RhdGljIGludCByaW5nc3BlZWRbWExfTUFYX0FEQVBURVJTXSA9IHswLH0gOworCittb2R1bGVfcGFyYW1fYXJyYXkocmluZ3NwZWVkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhyaW5nc3BlZWQsIjNjMzU5OiBSaW5nc3BlZWQgc2VsZWN0aW9uIC0gNCwxNiBvciAwIikgOyAKKworLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisKK3N0YXRpYyBpbnQgcGt0X2J1Zl9zeltYTF9NQVhfQURBUFRFUlNdID0gezAsfSA7CisgCittb2R1bGVfcGFyYW1fYXJyYXkocGt0X2J1Zl9zeiwgaW50LCBOVUxMLCAwKSA7CitNT0RVTEVfUEFSTV9ERVNDKHBrdF9idWZfc3osIjNjMzU5OiBJbml0aWFsIGJ1ZmZlciBzaXplIikgOyAKKy8qIE1lc3NhZ2UgTGV2ZWwgKi8KKworc3RhdGljIGludCBtZXNzYWdlX2xldmVsW1hMX01BWF9BREFQVEVSU10gPSB7MCx9IDsgCisKK21vZHVsZV9wYXJhbV9hcnJheShtZXNzYWdlX2xldmVsLCBpbnQsIE5VTEwsIDApIDsKK01PRFVMRV9QQVJNX0RFU0MobWVzc2FnZV9sZXZlbCwgIjNjMzU5OiBMZXZlbCBvZiByZXBvcnRlZCBtZXNzYWdlcyBcbiIpIDsgCisvKiAKKyAqCVRoaXMgaXMgYSByZWFsIG5hc3R5IHdheSBvZiBkb2luZyB0aGlzLCBidXQgb3RoZXJ3aXNlIHlvdQorICoJd2lsbCBiZSBzdHVjayB3aXRoIDE1NTUgbGluZXMgb2YgaGV4ICMncyBpbiB0aGUgY29kZS4KKyAqLworCisjaW5jbHVkZSAiM2MzNTlfbWljcm9jb2RlLmgiIAorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeGxfcGNpX3RibFtdID0KK3sKKwl7UENJX1ZFTkRPUl9JRF8zQ09NLFBDSV9ERVZJQ0VfSURfM0NPTV8zQzM1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IH0JCQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHhsX3BjaV90YmwpIDsgCisKK3N0YXRpYyBpbnQgeGxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGxfb3Blbl9odyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7ICAKK3N0YXRpYyBpbnQgeGxfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IAorc3RhdGljIGludCB4bF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGxfZG5fY29tcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgCitzdGF0aWMgaW50IHhsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGxfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogeGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4bF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikgOyAKK3N0YXRpYyB2b2lkIHhsX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB4bF9hc2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCB4bF9zcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcmJfY21kKSA7IAorc3RhdGljIHZvaWQgeGxfd2FpdF9taXNyX2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgaW50IHhsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgdm9pZCB4bF9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAKK3N0YXRpYyB2b2lkIHhsX2FzYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIHZvaWQgeGxfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAgCitzdGF0aWMgdm9pZCB4bF9mcmVlbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgIAorCisKKy8qIEVFUHJvbSBBY2Nlc3MgRnVuY3Rpb25zICovCitzdGF0aWMgdTE2ICB4bF9lZV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlZV9hZGRyKSA7IAorc3RhdGljIHZvaWQgIHhsX2VlX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlZV9hZGRyLCB1MTYgZWVfdmFsdWUpIDsgCisKKy8qIERlYnVnZ2luZyBmdW5jdGlvbnMgKi8KKyNpZiBYTF9ERUJVRworc3RhdGljIHZvaWQgcHJpbnRfdHhfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAKK3N0YXRpYyB2b2lkIHByaW50X3J4X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCisKK3N0YXRpYyB2b2lkIHByaW50X3R4X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7IAorCXN0cnVjdCB4bF90eF9kZXNjICp0eGQgOyAKKwl1OCBfX2lvbWVtICp4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCWludCBpIDsgCisKKwlwcmludGsoInR4X3JpbmdfaGVhZDogJWQsIHR4X3JpbmdfdGFpbDogJWQsIGZyZWVfZW50OiAlZCBcbiIseGxfcHJpdi0+dHhfcmluZ19oZWFkLCAKKwkJeGxfcHJpdi0+dHhfcmluZ190YWlsLCB4bF9wcml2LT5mcmVlX3JpbmdfZW50cmllcykgOyAKKwlwcmludGsoIlJpbmcgICAgLCBBZGRyZXNzICwgICBGU0ggICwgRG5OZXh0UHRyLCBCdWZmZXIsIEJ1ZmZlcl9MZW4gXG4iKTsgCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdHhkID0gJih4bF9wcml2LT54bF90eF9yaW5nW2ldKSA7IAorCQlwcmludGsoIiVkLCAlMDhseCwgJTA4eCwgJTA4eCwgJTA4eCwgJTA4eCBcbiIsIGksIHZpcnRfdG9fYnVzKHR4ZCksIAorCQkJdHhkLT5mcmFtZXN0YXJ0aGVhZGVyLCB0eGQtPmRubmV4dHB0ciwgdHhkLT5idWZmZXIsIHR4ZC0+YnVmZmVyX2xlbmd0aCApIDsgCisJfQorCisJcHJpbnRrKCJETkxJU1RQVFIgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fRE5MSVNUUFRSKSApOyAKKwkKKwlwcmludGsoIkRtYUN0bCA9ICUwNHggXG4iLCByZWFkbCh4bF9tbWlvICsgTU1JT19ETUFfQ1RSTCkgKTsgCisJcHJpbnRrKCJRdWV1ZSBzdGF0dXMgPSAlMHggXG4iLG5ldGlmX3J1bm5pbmcoZGV2KSApIDsgCit9CisKK3N0YXRpYyB2b2lkIHByaW50X3J4X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7IAorCXN0cnVjdCB4bF9yeF9kZXNjICpyeGQgOyAKKwl1OCBfX2lvbWVtICp4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCWludCBpIDsgCisKKwlwcmludGsoInJ4X3JpbmdfdGFpbDogJWQgXG4iLCB4bF9wcml2LT5yeF9yaW5nX3RhaWwpIDsgCisJcHJpbnRrKCJSaW5nICAgICwgQWRkcmVzcyAsICAgRnJhbWVTdGF0ZSAgLCBVUE5leHRQdHIsIEZyYWdBZGRyLCBGcmFnX0xlbiBcbiIpOyAKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeyAKKwkJLyogcnhkID0gKHN0cnVjdCB4bF9yeF9kZXNjICopeGxfcHJpdi0+cnhfcmluZ19kbWFfYWRkciArIChpICogc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSkgOyAqLworCQlyeGQgPSAmKHhsX3ByaXYtPnhsX3J4X3JpbmdbaV0pIDsgCisJCXByaW50aygiJWQsICUwOGx4LCAlMDh4LCAlMDh4LCAlMDh4LCAlMDh4IFxuIiwgaSwgdmlydF90b19idXMocnhkKSwgCisJCQlyeGQtPmZyYW1lc3RhdHVzLCByeGQtPnVwbmV4dHB0ciwgcnhkLT51cGZyYWdhZGRyLCByeGQtPnVwZnJhZ2xlbiApIDsgCisJfQorCisJcHJpbnRrKCJVUExJU1RQVFIgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fVVBMSVNUUFRSKSApOyAKKwkKKwlwcmludGsoIkRtYUN0bCA9ICUwNHggXG4iLCByZWFkbCh4bF9tbWlvICsgTU1JT19ETUFfQ1RSTCkgKTsgCisJcHJpbnRrKCJRdWV1ZSBzdGF0dXMgPSAlMHggXG4iLG5ldGlmX3J1bm5pbmcoZGV2KSApIDsKK30gCisjZW5kaWYKKworLyoKKyAqCVJlYWQgdmFsdWVzIGZyb20gdGhlIG9uLWJvYXJkIEVFUHJvbS4gIFRoaXMgbG9va3MgdmVyeSBzdHJhbmdlCisgKglidXQgeW91IGhhdmUgdG8gd2FpdCBmb3IgdGhlIEVFUHJvbSB0byBnZXQvc2V0IHRoZSB2YWx1ZSBiZWZvcmUgCisgKglwYXNzaW5nL2dldHRpbmcgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgbmljLiBBcyB3aXRoIGFsbCByZXF1ZXN0cworICoJb24gdGhpcyBuaWMgaXQgaGFzIHRvIGJlIGRvbmUgaW4gdHdvIHN0YWdlcywgYSkgdGVsbCB0aGUgbmljIHdoaWNoCisgKgltZW1vcnkgYWRkcmVzcyB5b3Ugd2FudCB0byBhY2Nlc3MgYW5kIGIpIHBhc3MvZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBuaWMuCisgKglXaXRoIHRoZSBFRVByb20sIHlvdSBoYXZlIHRvIHdhaXQgYmVmb3JlIGFuZCBpbmJldHdlZW4gYWNjZXNzIGEpIGFuZCBiKS4KKyAqCUFzIHRoaXMgaXMgb25seSByZWFkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIHRoZSB3YWl0IHBlcmlvZCBpcyB2ZXJ5IAorICoJc21hbGwgd2Ugc2hvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2NoZWR1bGluZyBpc3N1ZXMuCisgKi8KKworc3RhdGljIHUxNiB4bF9lZV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlZV9hZGRyKQoreyAKKyAgICAJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCisJLyogVGVsbCBFRVByb20gd2hhdCB3ZSB3YW50IHRvIGRvIGFuZCB3aGVyZSAqLworCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVSRUFEICsgZWVfYWRkciwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIFdhaXQgZm9yIEVFUHJvbSB0byBub3QgYmUgYnVzeSAqLworCXdyaXRlbChJT19XT1JEX1JFQUQgfCBFRUNPTlRST0wsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdoaWxlICggcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgJiBFRUJVU1kgKSA7IAorCQorCS8qIFRlbGwgRUVQcm9tIHdoYXQgd2Ugd2FudCB0byBkbyBhbmQgd2hlcmUgKi8KKwl3cml0ZWwoSU9fV09SRF9XUklURSB8IEVFQ09OVFJPTCAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldyhFRVJFQUQgKyBlZV9hZGRyLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJLyogRmluYWxseSByZWFkIHRoZSB2YWx1ZSBmcm9tIHRoZSBFRVByb20gKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVEQVRBICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJcmV0dXJuIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCit9CisKKy8qIAorICoJV3JpdGUgdmFsdWVzIHRvIHRoZSBvbmJvYXJkIGVlcHJvbS4gQXMgd2l0aCBlZXByb20gcmVhZCB5b3UgbmVlZCB0byAKKyAqCXNldCB3aGljaCBsb2NhdGlvbiB0byB3cml0ZSwgd2FpdCwgdmFsdWUgdG8gd3JpdGUsIHdhaXQsIHdpdGggdGhlIAorICoJYWRkZWQgdHdpc3Qgb2YgaGF2aW5nIHRvIGVuYWJsZSBlZXByb20gd3JpdGVzIGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgIHhsX2VlX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlZV9hZGRyLCB1MTYgZWVfdmFsdWUpIAoreworICAgIAlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7CisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKworCS8qIFdhaXQgZm9yIEVFUHJvbSB0byBub3QgYmUgYnVzeSAqLworCXdyaXRlbChJT19XT1JEX1JFQUQgfCBFRUNPTlRST0wsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdoaWxlICggcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgJiBFRUJVU1kgKSA7CisJCisJLyogRW5hYmxlIHdyaXRlL2VyYXNlICovCisJd3JpdGVsKElPX1dPUkRfV1JJVEUgfCBFRUNPTlRST0wsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldyhFRV9FTkFCTEVfV1JJVEUsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCisJLyogUHV0IHRoZSB2YWx1ZSB3ZSB3YW50IHRvIHdyaXRlIGludG8gRUVEQVRBICovIAorCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVEQVRBLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoZWVfdmFsdWUsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKworCS8qIFRlbGwgRUVQcm9tIHRvIHdyaXRlIGVldmFsdWUgaW50byBlZV9hZGRyICovCisJd3JpdGVsKElPX1dPUkRfV1JJVEUgfCBFRUNPTlRST0wsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldyhFRVdSSVRFICsgZWVfYWRkciwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIFdhaXQgZm9yIEVFUHJvbSB0byBub3QgYmUgYnVzeSwgdG8gZW5zdXJlIHdyaXRlIGdldHMgZG9uZSAqLworCXdyaXRlbChJT19XT1JEX1JFQUQgfCBFRUNPTlRST0wsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdoaWxlICggcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgJiBFRUJVU1kgKSA7CisJCisJcmV0dXJuIDsgCit9CisgCitpbnQgX19kZXZpbml0IHhsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IDsgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgOyAKKwlzdGF0aWMgaW50IGNhcmRfbm8gPSAtMSA7CisJaW50IGkgOyAKKworCWNhcmRfbm8rKyA7IAorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7IAorCQlyZXR1cm4gLUVOT0RFViA7IAorCX0gCisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICgoaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwiM2MzNTkiKSkpIHsgCisJCXJldHVybiBpIDsgCisJfSA7IAorCisJLyogCisJICogQWxsb3dpbmcgaW5pdF90cmRldiB0byBhbGxvY2F0ZSB0aGUgZGV2LT5wcml2IHN0cnVjdHVyZSB3aWxsIGFsaWduIHhsX3ByaXZhdGUKKyAgIAkgKiBvbiBhIDMyIGJ5dGVzIGJvdW5kYXJ5IHdoaWNoIHdlIG5lZWQgZm9yIHRoZSByeC90eCBkZXNjcmlwdG9ycworCSAqLworCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCB4bF9wcml2YXRlKSkgOyAKKwlpZiAoIWRldikgeyAKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCQlyZXR1cm4gLUVOT01FTSA7IAorCX0gCisJeGxfcHJpdiA9IGRldi0+cHJpdiA7IAorCisjaWYgWExfREVCVUcgIAorCXByaW50aygicGNpX2RldmljZTogJXAsIGRldjolcCwgZGV2LT5wcml2OiAlcCwgYmFbMF06ICUxMHgsIGJhWzFdOiUxMHhcbiIsIAorCQlwZGV2LCBkZXYsIGRldi0+cHJpdiwgKHVuc2lnbmVkIGludClwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgKHVuc2lnbmVkIGludClwZGV2LT5yZXNvdXJjZVsxXS5zdGFydCkgOyAgCisjZW5kaWYgCisKKwlkZXYtPmlycT1wZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHI9cGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMCkgOyAKKwl4bF9wcml2LT54bF9jYXJkX25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwl4bF9wcml2LT54bF9tbWlvPWlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMSksIFhMX0lPX1NQQUNFKTsKKwl4bF9wcml2LT5wZGV2ID0gcGRldiA7IAorCQkKKwlpZiAoKHBrdF9idWZfc3pbY2FyZF9ub10gPCAxMDApIHx8IChwa3RfYnVmX3N6W2NhcmRfbm9dID4gMTgwMDApICkKKwkJeGxfcHJpdi0+cGt0X2J1Zl9zeiA9IFBLVF9CVUZfU1ogOyAKKwllbHNlCisJCXhsX3ByaXYtPnBrdF9idWZfc3ogPSBwa3RfYnVmX3N6W2NhcmRfbm9dIDsgCisKKwlkZXYtPm10dSA9IHhsX3ByaXYtPnBrdF9idWZfc3ogLSBUUl9ITEVOIDsgCisJeGxfcHJpdi0+eGxfcmluZ19zcGVlZCA9IHJpbmdzcGVlZFtjYXJkX25vXSA7IAorCXhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwgPSBtZXNzYWdlX2xldmVsW2NhcmRfbm9dIDsgCisJeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzBdID0geGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzFdID0geGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzJdID0geGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzNdID0gMCA7IAorCXhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMgPSAwIDsgCisJCQorCWlmKChpID0geGxfaW5pdChkZXYpKSkgeworCQlpb3VubWFwKHhsX3ByaXYtPnhsX21taW8pIDsgCisJCWZyZWVfbmV0ZGV2KGRldikgOyAKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCQlyZXR1cm4gaSA7IAorCX0JCQkJCisKKwlkZXYtPm9wZW49JnhsX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQ9JnhsX3htaXQ7CisJZGV2LT5jaGFuZ2VfbXR1PSZ4bF9jaGFuZ2VfbXR1OworCWRldi0+c3RvcD0meGxfY2xvc2U7CisJZGV2LT5kb19pb2N0bD1OVUxMOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0PSZ4bF9zZXRfcnhfbW9kZTsKKwlkZXYtPmdldF9zdGF0cz0meGxfZ2V0X3N0YXRzIDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcz0meGxfc2V0X21hY19hZGRyZXNzIDsgCisJU0VUX01PRFVMRV9PV05FUihkZXYpOyAKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsZGV2KSA7IAorCWlmICgoaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpKSkgeyAKKwkJcHJpbnRrKEtFUk5fRVJSICIzQzM1OSwgcmVnaXN0ZXIgbmV0ZGV2IGZhaWxlZFxuIikgOyAgCisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LE5VTEwpIDsgCisJCWlvdW5tYXAoeGxfcHJpdi0+eGxfbW1pbykgOyAKKwkJZnJlZV9uZXRkZXYoZGV2KSA7IAorCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpIDsgCisJCXJldHVybiBpIDsgCisJfQorICAgCisJcHJpbnRrKEtFUk5fSU5GTyAiM0MzNTk6ICVzIHJlZ2lzdGVyZWQgYXM6ICVzXG4iLHhsX3ByaXYtPnhsX2NhcmRfbmFtZSxkZXYtPm5hbWUpIDsgCisKKwlyZXR1cm4gMDsgCit9CisKKworc3RhdGljIGludCBfX2luaXQgeGxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKyAgICAJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgXG4iLCB2ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogSS9PIGF0ICVoeCwgTU1JTyBhdCAlcCwgdXNpbmcgaXJxICVkXG4iLAorCQl4bF9wcml2LT54bF9jYXJkX25hbWUsICh1bnNpZ25lZCBpbnQpZGV2LT5iYXNlX2FkZHIgLHhsX3ByaXYtPnhsX21taW8sIGRldi0+aXJxKTsKKworCXNwaW5fbG9ja19pbml0KCZ4bF9wcml2LT54bF9sb2NrKSA7IAorCisJcmV0dXJuIHhsX2h3X3Jlc2V0KGRldikgOyAKKworfQorCisKKy8qIAorICoJSGFyZHdhcmUgcmVzZXQuICBUaGlzIG5lZWRzIHRvIGJlIGEgc2VwYXJhdGUgZW50aXR5IGFzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNhcmQKKyAqCXdoZW4gd2UgY2hhbmdlIHRoZSBFRVByb20gc2V0dGluZ3MuCisgKi8KKworc3RhdGljIGludCB4bF9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisgICAgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsKKwl1OCBfX2lvbWVtICp4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXVuc2lnbmVkIGxvbmcgdCA7IAorCXUxNiBpIDsgCisgICAgCXUxNiByZXN1bHRfMTYgOyAKKwl1OCByZXN1bHRfOCA7CisJdTE2IHN0YXJ0IDsgCisJaW50IGogOworCisJLyoKKwkgKiAgUmVzZXQgdGhlIGNhcmQuICBJZiB0aGUgY2FyZCBoYXMgZ290IHRoZSBtaWNyb2NvZGUgb24gYm9hcmQsIHdlIGhhdmUgCisgICAgICAgICAqICBtaXNzZWQgdGhlIGluaXRpYWxpemF0aW9uIGludGVycnVwdCwgc28gd2UgbXVzdCBhbHdheXMgZG8gdGhpcy4KKwkgKi8KKworCXdyaXRldyggR0xPQkFMX1JFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EICkgOyAKKworCS8qIAorCSAqIE11c3Qgd2FpdCBmb3IgY21kSW5Qcm9ncmVzcyBiaXQgKDEyKSB0byBjbGVhciBiZWZvcmUgY29udGludWluZyB3aXRoCisJICogY2FyZCBjb25maWd1cmF0aW9uLgorCSAqLworCisJdD1qaWZmaWVzOworCXdoaWxlIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9DTURfSU5fUFJPR1JFU1MpIHsgCisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gNDAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IDNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcgdG8gZ2xvYmFsIHJlc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiAgRW5hYmxlIHBtYmFyIGJ5IHNldHRpbmcgYml0IGluIENQQXR0ZW50aW9uCisJICovCisKKwl3cml0ZWwoIChJT19CWVRFX1JFQUQgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7CisJcmVzdWx0XzggPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCXJlc3VsdF84ID0gcmVzdWx0XzggfCBDUEFfUE1CQVJWSVMgOyAKKwl3cml0ZWwoIChJT19CWVRFX1dSSVRFIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIocmVzdWx0XzgsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJLyoKKwkgKiBSZWFkIGNwSG9sZCBiaXQgaW4gcG1iYXIsIGlmIGNsZWFyZWQgd2UgaGF2ZSBnb3QgRmxhc2hyb20gb24gYm9hcmQuCisgCSAqIElmIG5vdCwgd2UgbmVlZCB0byB1cGxvYWQgdGhlIG1pY3JvY29kZSB0byB0aGUgY2FyZAorCSAqLworCisJd3JpdGVsKCAoSU9fV09SRF9SRUFEIHwgUE1CQVIpLHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsgIAorCisjaWYgWExfREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICJSZWFkIGZyb20gUE1CQVIgPSAlMDR4IFxuIiwgcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsgCisjZW5kaWYKKworCWlmICggcmVhZHcoICh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgICYgUE1CX0NQSE9MRCApIHsgCisKKwkJLyogU2V0IFBtQmFyLCBwcml2YXRlTWVtb3J5QmFzZSBiaXRzICg4OjIpIHRvIDAgKi8KKworCQl3cml0ZWwoIChJT19XT1JEX1JFQUQgfCBQTUJBUikseGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpOyAgCisJCXJlc3VsdF8xNiA9IHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXJlc3VsdF8xNiA9IHJlc3VsdF8xNiAmIH4oKDB4N0YpIDw8IDIpIDsgCisJCXdyaXRlbCggKElPX1dPUkRfV1JJVEUgfCBQTUJBUiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZXcocmVzdWx0XzE2LHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJCS8qIFNldCBDUEF0dGVudGlvbiwgbWVtV3JFbiBiaXQgKi8KKworCQl3cml0ZWwoIChJT19CWVRFX1JFQUQgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQlyZXN1bHRfOCA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXJlc3VsdF84ID0gcmVzdWx0XzggfCBDUEFfTUVNV1JFTiAgOyAKKwkJd3JpdGVsKCAoSU9fQllURV9XUklURSB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihyZXN1bHRfOCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCQkvKiAKKwkJICogTm93IHRvIHdyaXRlIHRoZSBtaWNyb2NvZGUgaW50byB0aGUgc2hhcmVkIHJhbSAKKwkgCSAqIFRoZSBtaWNyb2NvZGUgbXVzdCBmaW5pc2ggYXQgcG9zaXRpb24gMHhGRkZGLCBzbyB3ZSBtdXN0IHN1YnRyYWN0CisJCSAqIHRvIGdldCB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSBjb2RlCisJCSAqLworCisJCXN0YXJ0ID0gKDB4RkZGRiAtIChtY19zaXplKSArIDEgKSA7IC8qIExvb2tzIHN0cmFuZ2UgYnV0IGVuc3VyZXMgY29tcGlsZXIgb25seSB1c2VzIDE2IGJpdCB1bnNpZ25lZCBpbnQgZm9yIHRoaXMgKi8gCisJCQorCQlwcmludGsoS0VSTl9JTkZPICIzQzM1OTogVXBsb2FkaW5nIE1pY3JvY29kZTogIik7IAorCQkKKwkJZm9yIChpID0gc3RhcnQsIGogPSAwOyBqIDwgbWNfc2l6ZTsgaSsrLCBqKyspIHsgCisJCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAwWEQwMDAwIHwgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIobWljcm9jb2RlW2pdLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCQlpZiAoaiAlIDEwMjQgPT0gMCkKKwkJCQlwcmludGsoIi4iKTsKKwkJfQorCQlwcmludGsoIlxuIikgOyAKKworCQlmb3IgKGk9MDtpIDwgMTY7IGkrKykgeyAKKwkJCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhERkZGMCkgKyBpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCXdyaXRlYihtaWNyb2NvZGVbbWNfc2l6ZSAtIDE2ICsgaV0sIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCX0KKworCQkvKgorCQkgKiBIYXZlIHRvIHdyaXRlIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSB1cGxvYWQgdG8gRkZGNCwgYnV0CisgICAgICAgICAgICAgICAgICogdGhlIGFkZHJlc3MgbXVzdCBiZSA+PiA0LiBZb3UgZG8gbm90IHdhbnQgdG8ga25vdyBob3cgbG9uZworICAgICAgICAgICAgICAgICAqIGl0IHRvb2sgbWUgdG8gZGlzY292ZXIgdGhpcy4KKwkJICovCisKKwkJd3JpdGVsKE1FTV9XT1JEX1dSSVRFIHwgMHhERkZGNCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRldyhzdGFydCA+PiA0LCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKTsKKworCQkvKiBDbGVhciB0aGUgQ1BBdHRlbnRpb24sIG1lbVdyRW4gQml0ICovCisJCisJCXdyaXRlbCggKElPX0JZVEVfUkVBRCB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXJlc3VsdF84ID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJcmVzdWx0XzggPSByZXN1bHRfOCAmIH5DUEFfTUVNV1JFTiA7IAorCQl3cml0ZWwoIChJT19CWVRFX1dSSVRFIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKHJlc3VsdF84LCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJCS8qIENsZWFyIHRoZSBjcEhvbGQgYml0IGluIHBtYmFyICovCisKKwkJd3JpdGVsKCAoSU9fV09SRF9SRUFEIHwgUE1CQVIpLHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsgIAorCQlyZXN1bHRfMTYgPSByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXN1bHRfMTYgPSByZXN1bHRfMTYgJiB+UE1CX0NQSE9MRCA7IAorCQl3cml0ZWwoIChJT19XT1JEX1dSSVRFIHwgUE1CQVIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGV3KHJlc3VsdF8xNix4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisKKwl9IC8qIElmIG1pY3JvY29kZSB1cGxvYWQgcmVxdWlyZWQgKi8KKworCS8qIAorCSAqIFRoZSBjYXJkIHNob3VsZCBub3cgZ28gdGhvdWdoIGEgc2VsZiB0ZXN0IHByb2NlZHVyZSBhbmQgZ2V0IGl0c2VsZiByZWFkeQorICAgICAgICAgKiB0byBiZSBvcGVuZWQsIHdlIG11c3Qgd2FpdCBmb3IgYW4gc3JiIHJlc3BvbnNlIHdpdGggdGhlIGluaXRpYWxpemF0aW9uCisgICAgICAgICAqIGluZm9ybWF0aW9uLiAKKwkgKi8KKworI2lmIFhMX0RFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1pY3JvY29kZSB1cGxvYWRlZCwgbXVzdCB3YWl0IGZvciB0aGUgc2VsZiB0ZXN0IHRvIGNvbXBsZXRlXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwl3cml0ZXcoU0VUSU5ERU5BQkxFIHwgMHhGRkYsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwl0PWppZmZpZXM7CisJd2hpbGUgKCAhKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVU19BVVRPKSAmIElOVFNUQVRfU1JCKSApIHsgCisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gMTUqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiM0NPTSAzQzM1OSBWZWxvY2l0eSBYTCAgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7IAorCQl9CisJfQorCisJLyoKKwkgKiBXcml0ZSB0aGUgUnhCdWZBcmVhIHdpdGggRDAwMCwgUnhFYXJseVRocmVzaCwgVHhTdGFydFRocmVzaCwgCisgCSAqIERuUHJpUmVxVGhyZXNoLCByZWFkIHRoZSB0ZWNoIGRvY3MgaWYgeW91IHdhbnQgdG8ga25vdyB3aGF0CisJICogdmFsdWVzIHRoZXkgbmVlZCB0byBiZS4KKwkgKi8KKworCXdyaXRlbChNTUlPX1dPUkRfV1JJVEUgfCBSWEJVRkFSRUEsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldygweEQwMDAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJd3JpdGVsKE1NSU9fV09SRF9XUklURSB8IFJYRUFSTFlUSFJFU0gsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldygwWDAwMjAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJd3JpdGV3KCBTRVRUWFNUQVJUVEhSRVNIIHwgMHg0MCAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwl3cml0ZWIoMHgwNCwgeGxfbW1pbyArIE1NSU9fRE5CVVJTVFRIUkVTSCkgOyAKKwl3cml0ZWIoMHgwNCwgeGxfbW1pbyArIEROUFJJUkVRVEhSRVNIKSA7CisKKwkvKgorCSAqIFJlYWQgV1JCUiB0byBwcm92aWRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3JiIGJsb2NrLCBoYXZlIHRvIHVzZSBieXRlIHJlYWRzIG5vdCB3b3JkIHJlYWRzLiAKKwkgKiBUZWNoIGRvY3MgaGF2ZSB0aGlzIHdyb25nICEhISEKKwkgKi8KKworCXdyaXRlbChNTUlPX0JZVEVfUkVBRCB8IFdSQlIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXhsX3ByaXYtPnNyYiA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDw8IDggOyAKKwl3cml0ZWwoIChNTUlPX0JZVEVfUkVBRCB8IFdSQlIpICsgMSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJeGxfcHJpdi0+c3JiID0geGxfcHJpdi0+c3JiIHwgcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOworCisjaWYgWExfREVCVUcKKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgU1dJVENIU0VUVElOR1MsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCWlmICggcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgJiAyKSB7IAorCQlwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IHJpbmcgc3BlZWQgNCBtYnBzIFxuIikgOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRlZmF1bHQgcmluZyBzcGVlZCAxNiBtYnBzIFxuIikgOyAKKwl9IAorCXByaW50ayhLRVJOX0lORk8gIiVzOiB4bF9wcml2LT5zcmIgPSAlMDR4XG4iLHhsX3ByaXYtPnhsX2NhcmRfbmFtZSwgeGxfcHJpdi0+c3JiKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1OCBpIDsgCisJdTE2IGh3YWRkclszXSA7IC8qIFNob3VsZCBiZSB1OFs2XSBidXQgd2UgZ2V0IHdvcmQgcmV0dXJuIHZhbHVlcyAqLworCWludCBvcGVuX2VyciA7CisKKwl1MTYgc3dpdGNoc2V0dGluZ3MsIHN3aXRjaHNldHRpbmdzX2VlcHJvbSAgOworIAorCWlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmeGxfaW50ZXJydXB0LCBTQV9TSElSUSAsICIzYzM1OSIsIGRldikpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogCisJICogUmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgRUVQUk9NIHRoYXQgd2UgbmVlZC4gSSBrbm93IHdlCisgCSAqIHNob3VsZCB1c2UgbnRvaHMsIGJ1dCB0aGUgd29yZCBnZXRzIHN0b3JlZCByZXZlcnNlZCBpbiB0aGUgMTYKKwkgKiBiaXQgZmllbGQgYW55d2F5IGFuZCBpdCBhbGwgd29ya3MgaXRzIHNlbGYgb3V0IHdoZW4gd2UgbWVtY3B5CisJICogaXQgaW50byBkZXYtPmRldl9hZGRyLiAKKwkgKi8KKwkKKwlod2FkZHJbMF0gPSB4bF9lZV9yZWFkKGRldiwweDEwKSA7IAorCWh3YWRkclsxXSA9IHhsX2VlX3JlYWQoZGV2LDB4MTEpIDsgCisJaHdhZGRyWzJdID0geGxfZWVfcmVhZChkZXYsMHgxMikgOyAKKworCS8qIFJpbmcgc3BlZWQgKi8KKworCXN3aXRjaHNldHRpbmdzX2VlcHJvbSA9IHhsX2VlX3JlYWQoZGV2LDB4MDgpIDsKKwlzd2l0Y2hzZXR0aW5ncyA9IHN3aXRjaHNldHRpbmdzX2VlcHJvbSA7ICAKKworCWlmICh4bF9wcml2LT54bF9yaW5nX3NwZWVkICE9IDApIHsgCisJCWlmICh4bF9wcml2LT54bF9yaW5nX3NwZWVkID09IDQpICAKKwkJCXN3aXRjaHNldHRpbmdzID0gc3dpdGNoc2V0dGluZ3MgfCAweDAyIDsgCisJCWVsc2UgCisJCQlzd2l0Y2hzZXR0aW5ncyA9IHN3aXRjaHNldHRpbmdzICYgfjB4MDIgOyAKKwl9CisKKwkvKiBPbmx5IHdyaXRlIEVFUHJvbSBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSAqLworCWlmIChzd2l0Y2hzZXR0aW5ncyAhPSBzd2l0Y2hzZXR0aW5nc19lZXByb20pIHsgCisJCXhsX2VlX3dyaXRlKGRldiwweDA4LHN3aXRjaHNldHRpbmdzKSA7IAorCQkvKiBIYXJkd2FyZSByZXNldCBhZnRlciBjaGFuZ2luZyBFRVByb20gKi8KKwkJeGxfaHdfcmVzZXQoZGV2KSA7IAorCX0KKworCW1lbWNweShkZXYtPmRldl9hZGRyLGh3YWRkcixkZXYtPmFkZHJfbGVuKSA7IAorCQorCW9wZW5fZXJyID0geGxfb3Blbl9odyhkZXYpIDsgCisKKwkvKiAKKwkgKiBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIHdpdGggYmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKwkgKi8KKworCWlmIChvcGVuX2VyciAhPSAwKSB7IC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIG9wZW4gY29tbWFuZCAqLworCQlpZiAob3Blbl9lcnIgJiAweDA3KSB7IC8qIFdyb25nIHNwZWVkLCByZXRyeSBhdCBkaWZmZXJlbnQgc3BlZWQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcGVuIEVycm9yLCByZXRyeWluZyBhdCBkaWZmZXJlbnQgcmluZ3NwZWVkIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJc3dpdGNoc2V0dGluZ3MgPSBzd2l0Y2hzZXR0aW5ncyBeIDIgOyAKKwkJCXhsX2VlX3dyaXRlKGRldiwweDA4LHN3aXRjaHNldHRpbmdzKSA7IAorCQkJeGxfaHdfcmVzZXQoZGV2KSA7IAorCQkJb3Blbl9lcnIgPSB4bF9vcGVuX2h3KGRldikgOyAKKwkJCWlmIChvcGVuX2VyciAhPSAwKSB7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcGVuIGVycm9yIHJldHVybmVkIGEgc2Vjb25kIHRpbWUsIHdlJ3JlIGJvbWJpbmcgb3V0IG5vd1xuIiwgZGV2LT5uYW1lKTsgCisJCQkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KSA7IAkJCQkJCQorCQkJCXJldHVybiAtRU5PREVWIDsKKwkJCX0gIAorCQl9IGVsc2UgeyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcGVuIEVycm9yID0gJTA0eFxuIiwgZGV2LT5uYW1lLCBvcGVuX2VycikgOyAKKwkJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAKKwkJCXJldHVybiAtRU5PREVWIDsgCisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyB0byBzZXQgdXAgdGhlIFJ4IGFuZCBUeCBidWZmZXIgc3RydWN0dXJlcworCSAqLworCS8qIFRoZXNlIE1VU1QgYmUgb24gOCBieXRlIGJvdW5kYXJpZXMgKi8KKwl4bF9wcml2LT54bF90eF9yaW5nID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCB4bF90eF9kZXNjKSAqIFhMX1RYX1JJTkdfU0laRSkgKyA3LCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCkgOyAKKwlpZiAoeGxfcHJpdi0+eGxfdHhfcmluZyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLlxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl4bF9wcml2LT54bF9yeF9yaW5nID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSkgKzcsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKSA7IAorCWlmICh4bF9wcml2LT54bF90eF9yaW5nID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlcnMuXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwkJa2ZyZWUoeGxfcHJpdi0+eGxfdHhfcmluZyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoeGxfcHJpdi0+eGxfdHhfcmluZywwLHNpemVvZihzdHJ1Y3QgeGxfdHhfZGVzYykgKiBYTF9UWF9SSU5HX1NJWkUpIDsgCisJbWVtc2V0KHhsX3ByaXYtPnhsX3J4X3JpbmcsMCxzaXplb2Yoc3RydWN0IHhsX3J4X2Rlc2MpICogWExfUlhfUklOR19TSVpFKSA7IAorCisJIC8qIFNldHVwIFJ4IFJpbmcgKi8KKwkgZm9yIChpPTAgOyBpIDwgWExfUlhfUklOR19TSVpFIDsgaSsrKSB7IAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiIDsgCisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYih4bF9wcml2LT5wa3RfYnVmX3N6KSA7IAorCQlpZiAoc2tiPT1OVUxMKSAKKwkJCWJyZWFrIDsgCisKKwkJc2tiLT5kZXYgPSBkZXYgOyAKKwkJeGxfcHJpdi0+eGxfcnhfcmluZ1tpXS51cGZyYWdhZGRyID0gcGNpX21hcF9zaW5nbGUoeGxfcHJpdi0+cGRldiwgc2tiLT5kYXRhLHhsX3ByaXYtPnBrdF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkgOyAKKwkJeGxfcHJpdi0+eGxfcnhfcmluZ1tpXS51cGZyYWdsZW4gPSB4bF9wcml2LT5wa3RfYnVmX3N6IHwgUlhVUExBU1RGUkFHOworCQl4bF9wcml2LT5yeF9yaW5nX3NrYltpXSA9IHNrYiA7IAkKKwl9CisKKwlpZiAoaT09MCkgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlcnMuIEFkYXB0ZXIgZGlzYWJsZWQgXG4iLGRldi0+bmFtZSkgOyAKKwkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KSA7IAorCQlyZXR1cm4gLUVJTyA7IAorCX0gCisKKwl4bF9wcml2LT5yeF9yaW5nX25vID0gaSA7IAorCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCA9IDAgOyAKKwl4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nLCBzaXplb2Yoc3RydWN0IHhsX3J4X2Rlc2MpICogWExfUlhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKSA7IAorCWZvciAoaT0wO2k8KHhsX3ByaXYtPnJ4X3Jpbmdfbm8tMSk7aSsrKSB7IAorCQl4bF9wcml2LT54bF9yeF9yaW5nW2ldLnVwbmV4dHB0ciA9IHhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgKyAoc2l6ZW9mIChzdHJ1Y3QgeGxfcnhfZGVzYykgKiAoaSsxKSkgOyAKKwl9IAorCXhsX3ByaXYtPnhsX3J4X3JpbmdbaV0udXBuZXh0cHRyID0gMCA7IAorCisJd3JpdGVsKHhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsIHhsX21taW8gKyBNTUlPX1VQTElTVFBUUikgOyAKKwkKKwkvKiBTZXR1cCBUeCBSaW5nICovCisJCisJeGxfcHJpdi0+dHhfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfdHhfcmluZywgc2l6ZW9mKHN0cnVjdCB4bF90eF9kZXNjKSAqIFhMX1RYX1JJTkdfU0laRSxQQ0lfRE1BX1RPREVWSUNFKSA7IAorCQorCXhsX3ByaXYtPnR4X3JpbmdfaGVhZCA9IDEgOyAKKwl4bF9wcml2LT50eF9yaW5nX3RhaWwgPSAyNTUgOyAvKiBTcGVjaWFsIG1hcmtlciBmb3IgZmlyc3QgcGFja2V0ICovCisJeGxfcHJpdi0+ZnJlZV9yaW5nX2VudHJpZXMgPSBYTF9UWF9SSU5HX1NJWkUgOyAKKworCS8qCisgCSAqIFNldHVwIHRoZSBmaXJzdCBkdW1teSBEUEQgZW50cnkgZm9yIHBvbGxpbmcgdG8gc3RhcnQgd29ya2luZy4KKwkgKi8KKworCXhsX3ByaXYtPnhsX3R4X3JpbmdbMF0uZnJhbWVzdGFydGhlYWRlciA9IFRYRFBERU1QVFkgOyAKKwl4bF9wcml2LT54bF90eF9yaW5nWzBdLmJ1ZmZlciA9IDAgOyAKKwl4bF9wcml2LT54bF90eF9yaW5nWzBdLmJ1ZmZlcl9sZW5ndGggPSAwIDsgCisJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5kbm5leHRwdHIgPSAwIDsgCisKKwl3cml0ZWwoeGxfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgeGxfbW1pbyArIE1NSU9fRE5MSVNUUFRSKSA7IAorCXdyaXRlbChETlVOU1RBTEwsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKFVQVU5TVEFMTCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl3cml0ZWwoRE5FTkFCTEUsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGViKDB4NDAsIHhsX21taW8gKyBNTUlPX0ROUE9MTCkgOwkKKworCS8qCisJICogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIGNhcmQKKwkgKi8KKworCXdyaXRlbChTRVRJTlRFTkFCTEUgfCBJTlRfTUFTSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl3cml0ZWwoU0VUSU5ERU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpIDsgCQorCXJldHVybiAwOworCQorfQkKKworc3RhdGljIGludCB4bF9vcGVuX2h3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreyAKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1MTYgdnNvZmYgOworCWNoYXIgdmVyX3N0clszM107ICAKKwlpbnQgb3Blbl9lcnIgOyAKKwlpbnQgaSA7IAorCXVuc2lnbmVkIGxvbmcgdCA7IAorCisJLyoKKwkgKiBPa2F5LCBsZXQncyBidWlsZCB1cCB0aGUgT3Blbi5OSUMgc3JiIGNvbW1hbmQKKwkgKgorCSAqLworCQkKKwl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoT1BFTl9OSUMsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJLyoKKwkgKiBVc2UgdGhpcyBhcyBhIHRlc3QgYnl0ZSwgaWYgaXQgY29tZXMgYmFjayB3aXRoIHRoZSBzYW1lIHZhbHVlLCB0aGUgY29tbWFuZCBkaWRuJ3Qgd29yaworCSAqLworCisJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSsgMiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4ZmYseGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIE9wZW4gb3B0aW9ucyAqLworCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyA4LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoMHgwMCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgOSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4MDAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiAKKwkgKiBOb2RlIGFkZHJlc3MsIGJlIGNhcmVmdWwgaGVyZSwgdGhlIGRvY3Mgc2F5IHlvdSBjYW4ganVzdCBwdXQgemVyb3MgaGVyZSBhbmQgaXQgd2lsbCB1c2UKKwkgKiB0aGUgaGFyZHdhcmUgYWRkcmVzcywgaXQgZG9lc24ndCwgeW91IG11c3QgaW5jbHVkZSB0aGUgbm9kZSBhZGRyZXNzIGluIHRoZSBvcGVuIGNvbW1hbmQuCisJICovCisKKwlpZiAoeGxfcHJpdi0+eGxfbGFhWzBdKSB7ICAvKiBJZiB1c2luZyBhIExBQSBhZGRyZXNzICovCisJCWZvciAoaT0xMDtpPDE2O2krKykgeyAKKwkJCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyBpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCXdyaXRlYih4bF9wcml2LT54bF9sYWFbaV0seGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJfQorCQltZW1jcHkoZGV2LT5kZXZfYWRkcix4bF9wcml2LT54bF9sYWEsZGV2LT5hZGRyX2xlbikgOyAKKwl9IGVsc2UgeyAvKiBSZWd1bGFyIGhhcmR3YXJlIGFkZHJlc3MgKi8gCisJCWZvciAoaT0xMDtpPDE2O2krKykgeyAKKwkJCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyBpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCXdyaXRlYihkZXYtPmRldl9hZGRyW2ktMTBdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl9CisJfQorCisJLyogRGVmYXVsdCBldmVyeXRoaW5nIGVsc2UgdG8gMCAqLworCWZvciAoaSA9IDE2OyBpIDwgMzQ7IGkrKykgeworCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYigweDAwLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJfQorCQorCS8qCisJICogIFNldCB0aGUgY3NyYiBiaXQgaW4gdGhlIE1JU1IgcmVnaXN0ZXIKKwkgKi8KKworCXhsX3dhaXRfbWlzcl9mbGFncyhkZXYpIDsgCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfQ1NSQiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4RkYsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJd3JpdGVsKE1NSU9fQllURV9XUklURSB8IE1JU1JfU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoTUlTUl9DU1JCICwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qCisJICogTm93IHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIHJ1bgorCSAqLworCisJdD1qaWZmaWVzOworCXdoaWxlICghIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9TUkIpKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDQwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisKKwkvKgorCSAqIExldCdzIGludGVycHJldCB0aGUgb3BlbiByZXNwb25zZQorCSAqLworCisJd3JpdGVsKCAoTUVNX0JZVEVfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpKzIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCWlmIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSE9MCkgeworCQlvcGVuX2VyciA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDw8IDggOyAKKwkJd3JpdGVsKCAoTUVNX0JZVEVfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgNywgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCW9wZW5fZXJyIHw9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXJldHVybiBvcGVuX2VyciA7IAorCX0gZWxzZSB7IAorCQl3cml0ZWwoIChNRU1fV09SRF9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyA4LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJeGxfcHJpdi0+YXNiID0gbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIE9wZW5lZCBEZXRhaWxzOiAiLGRldi0+bmFtZSkgOyAKKwkJcHJpbnRrKCJBU0I6ICUwNHgiLHhsX3ByaXYtPmFzYiApIDsgCisJCXdyaXRlbCggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDEwLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJcHJpbnRrKCIsIFNSQjogJTA0eCIsbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpICkgOyAKKyAKKwkJd3JpdGVsKCAoTUVNX1dPUkRfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgMTIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl4bF9wcml2LT5hcmIgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgOyAKKwkJcHJpbnRrKCIsIEFSQjogJTA0eCBcbiIseGxfcHJpdi0+YXJiICkgOyAKKwkJd3JpdGVsKCAoTUVNX1dPUkRfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgMTQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl2c29mZiA9IG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAorCisJCS8qIAorCQkgKiBJbnRlcmVzdGluZywgc2VuZGluZyB0aGUgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIGRpcmVjdGx5IHRvIHByaW50ayB3YXMgY2F1c2luZyBrbG9nZCB0byB1c2UKKwkJICogdXNlIDEwMCUgb2YgcHJvY2Vzc29yIHRpbWUsIHNvIHdlIGJ1aWxkIHVwIHRoZSBzdHJpbmcgYW5kIHByaW50IHRoYXQgaW5zdGVhZC4KKwkgICAJICovCisKKwkJZm9yIChpPTA7aTwweDIwO2krKykgeyAKKwkJCXdyaXRlbCggKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgdnNvZmYpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl2ZXJfc3RyW2ldID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJfQorCQl2ZXJfc3RyW2ldID0gJ1wwJyA7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogTWljcm9jb2RlIHZlcnNpb24gU3RyaW5nOiAlcyBcbiIsZGV2LT5uYW1lLHZlcl9zdHIpOyAKKwl9IAkKKwkKKwkvKgorCSAqIElzc3VlIHRoZSBBY2tJbnRlcnJ1cHQKKwkgKi8KKwl3cml0ZXcoQUNLX0lOVEVSUlVQVCB8IFNSQlJBQ0sgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwlyZXR1cm4gMCA7IAorfQorCisvKgorICoJVGhlcmUgYXJlIHR3byB3YXlzIG9mIGltcGxlbWVudGluZyByeCBvbiB0aGUgMzU5IE5JQywgZWl0aGVyCisgKiAJaW50ZXJydXB0IGRyaXZlbiBvciBwb2xsaW5nLiAgV2UgYXJlIGdvaW5nIHRvIHVzZXMgaW50ZXJydXB0cywKKyAqCWl0IGlzIHRoZSBlYXNpZXIgd2F5IG9mIGRvaW5nIHRoaW5ncy4KKyAqCQorICoJVGhlIFJ4IHdvcmtzIHdpdGggYSByaW5nIG9mIFJ4IGRlc2NyaXB0b3JzLiAgQXQgaW5pdGlhbGlzZSB0aW1lIHRoZSByaW5nCisgKgllbnRyaWVzIHBvaW50IHRvIHRoZSBuZXh0IGVudHJ5IGV4Y2VwdCBmb3IgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHJpbmcgCisgKgl3aGljaCBwb2ludHMgdG8gMC4gIFRoZSBjYXJkIGlzIHByb2dyYW1tZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0CisgKglhdmFpbGFibGUgZGVzY3JpcHRvciBhbmQga2VlcHMgcmVhZGluZyB0aGUgbmV4dF9wdHIgdW50aWwgbmV4dF9wdHIgaXMgc2V0CisgKgl0byAwLiAgSG9wZWZ1bGx5IHdpdGggYSByaW5nIHNpemUgb2YgMTYgdGhlIGNhcmQgd2lsbCBuZXZlciBnZXQgdG8gcmVhZCBhIG5leHRfcHRyCisgKglvZiAwLiAgQXMgdGhlIFJ4IGludGVycnVwdCBpcyByZWNlaXZlZCB3ZSBjb3B5IHRoZSBmcmFtZSB1cCB0byB0aGUgcHJvdG9jb2wgbGF5ZXJzCisgKglhbmQgdGhlbiBwb2ludCB0aGUgZW5kIG9mIHRoZSByaW5nIHRvIG91ciBjdXJyZW50IHBvc2l0aW9uIGFuZCBwb2ludCBvdXIgY3VycmVudAorICoJcG9zaXRpb24gdG8gMCwgdGhlcmVmb3JlIG1ha2luZyB0aGUgY3VycmVudCBwb3NpdGlvbiB0aGUgbGFzdCBwb3NpdGlvbiBvbiB0aGUgcmluZy4KKyAqCVRoZSBsYXN0IHBvc2l0aW9uIG9uIHRoZSByaW5nIHRoZXJlZm9yZSBsb29wcyBjb250aW51YWxseSBsb29wcyBhcm91bmQgdGhlIHJ4IHJpbmcuCisgKgkKKyAqCXJ4X3JpbmdfdGFpbCBpcyB0aGUgcG9zaXRpb24gb24gdGhlIHJpbmcgdG8gcHJvY2VzcyBuZXh0LiAoVGhpbmsgb2YgYSBzbmFrZSwgdGhlIGhlYWQgCisgKglleHBhbmRzIGFzIHRoZSBjYXJkIGFkZHMgbmV3IHBhY2tldHMgYW5kIHdlIGdvIGFyb3VuZCBlYXRpbmcgdGhlIHRhaWwgcHJvY2Vzc2luZyB0aGUKKyAqCXBhY2tldHMuKQorICoKKyAqCVVuZG91YnRhYmx5IGl0IGNvdWxkIGJlIHN0cmVhbWxpbmVkIGFuZCBpbXByb3ZlZCB1cG9uLCBidXQgYXQgdGhlIG1vbWVudCBpdCB3b3JrcyAKKyAqCWFuZCB0aGUgZmFzdCBwYXRoIHRocm91Z2ggdGhlIHJvdXRpbmUgaXMgZmluZS4gCisgKgkKKyAqCWFkdl9yeF9yaW5nIGNvdWxkIGJlIGlubGluZWQgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UsIGJ1dCBpdHMgY2FsbGVkIGEgKmxvdCogb2YgdGltZXMKKyAqCWluIHhsX3J4IHNvIHdvdWxkIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiBzaWduaWZpY2FudGx5LiAKKyAqLworCitzdGF0aWMgdm9pZCBhZHZfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKiBBZHZhbmNlIHJ4X3JpbmcsIGN1dCBkb3duIG9uIGJsb2F0IGluIHhsX3J4ICovIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2PShzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlpbnQgcHJldl9yaW5nX2xvYyA7IAorCisJcHJldl9yaW5nX2xvYyA9ICh4bF9wcml2LT5yeF9yaW5nX3RhaWwgKyBYTF9SWF9SSU5HX1NJWkUgLSAxKSAmIChYTF9SWF9SSU5HX1NJWkUgLSAxKTsKKwl4bF9wcml2LT54bF9yeF9yaW5nW3ByZXZfcmluZ19sb2NdLnVwbmV4dHB0ciA9IHhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgKyAoc2l6ZW9mIChzdHJ1Y3QgeGxfcnhfZGVzYykgKiB4bF9wcml2LT5yeF9yaW5nX3RhaWwpIDsgCisJeGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLmZyYW1lc3RhdHVzID0gMCA7IAorCXhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cG5leHRwdHIgPSAwIDsgCQorCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCsrIDsgCisJeGxfcHJpdi0+cnhfcmluZ190YWlsICY9IChYTF9SWF9SSU5HX1NJWkUtMSkgOyAKKworCXJldHVybiA7IAorfQorCitzdGF0aWMgdm9pZCB4bF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2PShzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tiMiA7IAorCWludCBmcmFtZV9sZW5ndGggPSAwLCBjb3B5X2xlbiA9IDAgIDsgCQorCWludCB0ZW1wX3JpbmdfbG9jIDsgIAorCisJLyoKKwkgKiBSZWNlaXZlIHRoZSBuZXh0IGZyYW1lLCBsb29wIGFyb3VuZCB0aGUgcmluZyB1bnRpbCBhbGwgZnJhbWVzCisgIAkgKiBoYXZlIGJlZW4gcmVjZWl2ZWQuCisJICovIAkgCisJCisJd2hpbGUgKHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyAmIChSWFVQRENPTVBMRVRFIHwgUlhVUERGVUxMKSApIHsgLyogRGVzY3JpcHRvciB0byBwcm9jZXNzICovCisKKwkJaWYgKHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyAmIFJYVVBERlVMTCApIHsgLyogVXBkRnVsbCwgTXVsdGlwbGUgRGVzY3JpcHRvcnMgdXNlZCBmb3IgdGhlIGZyYW1lICovCisKKwkJCS8qIAorCQkJICogVGhpcyBpcyBhIHBhaW4sIHlvdSBuZWVkIHRvIGdvIHRocm91Z2ggYWxsIHRoZSBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGFzdCBvbmUgCisJCQkgKiBmb3IgdGhpcyBmcmFtZSB0byBmaW5kIHRoZSBmcmFtZWxlbmd0aAorCQkJICovCisKKwkJCXRlbXBfcmluZ19sb2MgPSB4bF9wcml2LT5yeF9yaW5nX3RhaWwgOyAKKworCQkJd2hpbGUgKHhsX3ByaXYtPnhsX3J4X3JpbmdbdGVtcF9yaW5nX2xvY10uZnJhbWVzdGF0dXMgJiBSWFVQREZVTEwgKSB7CisJCQkJdGVtcF9yaW5nX2xvYysrIDsgCisJCQkJdGVtcF9yaW5nX2xvYyAmPSAoWExfUlhfUklOR19TSVpFLTEpIDsgCisJCQl9CisKKwkJCWZyYW1lX2xlbmd0aCA9IHhsX3ByaXYtPnhsX3J4X3JpbmdbdGVtcF9yaW5nX2xvY10uZnJhbWVzdGF0dXMgJiAweDdGRkYgOyAKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZV9sZW5ndGgpIDsKKyAKKwkJCWlmIChza2I9PU5VTEwpIHsgLyogTm8gbWVtb3J5IGZvciBmcmFtZSwgc3RpbGwgbmVlZCB0byByb2xsIGZvcndhcmQgdGhlIHJ4IHJpbmcgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWQgLSBtdWx0aSBidWZmZXIgIVxuIiwgZGV2LT5uYW1lKSA7IAorCQkJCXdoaWxlICh4bF9wcml2LT5yeF9yaW5nX3RhaWwgIT0gdGVtcF9yaW5nX2xvYykgIAorCQkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCisJCQkJCisJCQkJYWR2X3J4X3JpbmcoZGV2KSA7IC8qIE9uZSBtb3JlIHRpbWUganVzdCBmb3IgbHVjayA6KSAqLyAKKwkJCQl4bF9wcml2LT54bF9zdGF0cy5yeF9kcm9wcGVkKysgOyAKKworCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgVVBDT01QQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQlyZXR1cm4gOyAJCQkJCisJCQl9CisJCisJCQlza2ItPmRldiA9IGRldiA7IAorCisJCQl3aGlsZSAoeGxfcHJpdi0+cnhfcmluZ190YWlsICE9IHRlbXBfcmluZ19sb2MpIHsgCisJCQkJY29weV9sZW4gPSB4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnbGVuICYgMHg3RkZGIDsgCisJCQkJZnJhbWVfbGVuZ3RoIC09IGNvcHlfbGVuIDsgIAorCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLHhsX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLGNvcHlfbGVuKSwgeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXS0+ZGF0YSwgY29weV9sZW4pIDsgCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKKwkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCisJCQl9IAorCisJCQkvKiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbGFzdCBmcmFnbWVudCAqLworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKKwkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGZyYW1lX2xlbmd0aCkgOyAKKy8qCQkJbWVtY3B5KHNrYl9wdXQoc2tiLGZyYW1lX2xlbmd0aCksIGJ1c190b192aXJ0KHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyKSwgZnJhbWVfbGVuZ3RoKSA7ICovCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOworCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLGRldikgOyAKKwkJCW5ldGlmX3J4KHNrYikgOyAKKworCQl9IGVsc2UgeyAvKiBTaW5nbGUgRGVzY3JpcHRvciBVc2VkLCBzaW1wbHkgc3dhcCBidWZmZXJzIG92ZXIsIGZhc3QgcGF0aCAgKi8KKworCQkJZnJhbWVfbGVuZ3RoID0geGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLmZyYW1lc3RhdHVzICYgMHg3RkZGIDsgCisJCQkKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoeGxfcHJpdi0+cGt0X2J1Zl9zeikgOyAKKworCQkJaWYgKHNrYj09TlVMTCkgeyAvKiBTdGlsbCBuZWVkIHRvIGZpeCB0aGUgcnggcmluZyAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZCBpbiByeCwgc2luZ2xlIGJ1ZmZlciBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCWFkdl9yeF9yaW5nKGRldikgOyAKKwkJCQl4bF9wcml2LT54bF9zdGF0cy5yeF9kcm9wcGVkKysgOyAKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IFVQQ09NUEFDSyB8IExBVENIX0FDSyAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJcmV0dXJuIDsgCisJCQl9CisKKwkJCXNrYi0+ZGV2ID0gZGV2IDsgCisKKwkJCXNrYjIgPSB4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdIDsgCisJCQlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsIHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLCB4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOyAKKwkJCXNrYl9wdXQoc2tiMiwgZnJhbWVfbGVuZ3RoKSA7IAorCQkJc2tiMi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYjIsZGV2KSA7IAorCisJCQl4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdID0gc2tiIDsgCQorCQkJeGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHNrYi0+ZGF0YSx4bF9wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQl4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnbGVuID0geGxfcHJpdi0+cGt0X2J1Zl9zeiB8IFJYVVBMQVNURlJBRyA7IAorCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfcGFja2V0cysrIDsgCisJCQl4bF9wcml2LT54bF9zdGF0cy5yeF9ieXRlcyArPSBmcmFtZV9sZW5ndGggOyAJCisKKwkJCW5ldGlmX3J4KHNrYjIpIDsgCQkKKwkJIH0gLyogaWYgbXVsdGlwbGUgYnVmZmVycyAqLworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzIDsgCQorCX0gLyogd2hpbGUgcGFja2V0IHRvIGRvICovCisKKwkvKiBDbGVhciB0aGUgdXBkQ29tcGxldGUgaW50ZXJydXB0ICovCisJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBVUENPTVBBQ0sgfCBMQVRDSF9BQ0sgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXJldHVybiA7IAkKK30KKworLyoKKyAqIFRoaXMgaXMgcnV0aGxlc3MsIGl0IGRvZXNuJ3QgY2FyZSB3aGF0IHN0YXRlIHRoZSBjYXJkIGlzIGluIGl0IHdpbGwgCisgKiBjb21wbGV0ZWx5IHJlc2V0IHRoZSBhZGFwdGVyLgorICovCisKK3N0YXRpYyB2b2lkIHhsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2PShzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1bnNpZ25lZCBsb25nIHQ7IAorCisJd3JpdGV3KCBHTE9CQUxfUkVTRVQsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQgKSA7IAorCisJLyogCisJICogTXVzdCB3YWl0IGZvciBjbWRJblByb2dyZXNzIGJpdCAoMTIpIHRvIGNsZWFyIGJlZm9yZSBjb250aW51aW5nIHdpdGgKKwkgKiBjYXJkIGNvbmZpZ3VyYXRpb24uCisJICovCisKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJaWYoamlmZmllcy10ID4gNDAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiM0NPTSAzQzM1OSBWZWxvY2l0eSBYTCAgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKwkKK30KKworc3RhdGljIHZvaWQgeGxfZnJlZW1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKwlpbnQgaSA7IAorCisJZm9yIChpPTA7aTxYTF9SWF9SSU5HX1NJWkU7aSsrKSB7CisJCWRldl9rZnJlZV9za2JfaXJxKHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0pIDsgCisJCXBjaV91bm1hcF9zaW5nbGUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCsrIDsgCisJCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAmPSBYTF9SWF9SSU5HX1NJWkUtMTsgCisJfSAKKworCS8qIHVubWFwIHJpbmcgKi8KKwlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+cnhfcmluZ19kbWFfYWRkciwgc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQorCXBjaV91bm1hcF9zaW5nbGUoeGxfcHJpdi0+cGRldix4bF9wcml2LT50eF9yaW5nX2RtYV9hZGRyLCBzaXplb2Yoc3RydWN0IHhsX3R4X2Rlc2MpICogWExfVFhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKSA7IAorCisJa2ZyZWUoeGxfcHJpdi0+eGxfcnhfcmluZykgOyAKKwlrZnJlZSh4bF9wcml2LT54bF90eF9yaW5nKSA7IAorCisJcmV0dXJuICA7IAorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTE2IGludHN0YXR1cywgbWFjc3RhdHVzICA7CisKKwlpZiAoIWRldikgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlIHN0cnVjdHVyZSBkZWFkLCBhYWFoaGhoICFcbiIpIDsKKwkJcmV0dXJuIElSUV9OT05FOyAKKwl9CisKKwlpbnRzdGF0dXMgPSByZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpIDsgIAorCisJaWYgKCEoaW50c3RhdHVzICYgMSkpIC8qIFdlIGRpZG4ndCBnZW5lcmF0ZSB0aGUgaW50ZXJydXB0ICovCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOyAKKworCS8qCisJICogUHJvY2VzcyB0aGUgaW50ZXJydXB0CisJICovCisJLyoKKwkgKiBTb21ldGhpbmcgZmlzaHkgZ29pbmcgb24gaGVyZSwgd2Ugc2hvdWxkbid0IGdldCAwMDAxIGludHMsIG5vdCBmYXRhbCB0aG91Z2guCisJICovCisJaWYgKGludHN0YXR1cyA9PSAweDAwMDEpIHsgIAorCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOworCQlwcmludGsoS0VSTl9JTkZPICIlczogMDAwMDEgaW50IHJlY2VpdmVkIFxuIixkZXYtPm5hbWUpIDsgIAorCX0gZWxzZSB7ICAKKwkJaWYgKGludHN0YXR1cyAmCShIT1NURVJSSU5UIHwgU1JCUklOVCB8IEFSQkNJTlQgfCBVUENPTVBJTlQgfCBETkNPTVBJTlQgfCBIQVJERVJSSU5UIHwgKDE8PDgpIHwgVFhVTkRFUlJVTiB8IEFTQkZJTlQpKSB7IAorCQkJCisJCQkvKiAKKwkJCSAqIEhvc3QgRXJyb3IuCisJCQkgKiBJdCBtYXkgYmUgcG9zc2libGUgdG8gcmVjb3ZlciBmcm9tIHRoaXMsIGJ1dCB1c3VhbGx5IGl0IG1lYW5zIHNvbWV0aGluZworCQkJICogaXMgc2VyaW91c2x5IGZ1YmFyLCBzbyB3ZSBqdXN0IGNsb3NlIHRoZSBhZGFwdGVyLgorCQkJICovCisKKwkJCWlmIChpbnRzdGF0dXMgJiBIT1NURVJSSU5UKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhvc3QgRXJyb3IsIHBlcmZvcm1pbmcgZ2xvYmFsIHJlc2V0LCBpbnRzdGF0dXMgPSAlMDR4IFxuIixkZXYtPm5hbWUsaW50c3RhdHVzKSA7IAorCQkJCXdyaXRldyggR0xPQkFMX1JFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EICkgOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgaGFyZHdhcmU6IFxuIiwgZGV2LT5uYW1lKTsgCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsKKwkJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCQlmcmVlX2lycShkZXYtPmlycSxkZXYpOyAJCisJCQkJeGxfcmVzZXQoZGV2KSA7IAorCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCQkJCXNwaW5fdW5sb2NrKCZ4bF9wcml2LT54bF9sb2NrKSA7IAorCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0gLyogSG9zdCBFcnJvciAqLworCisJCQlpZiAoaW50c3RhdHVzICYgU1JCUklOVCApIHsgIC8qIFNyYmMgaW50ZXJydXB0ICovCisJCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBTUkJSQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7CisJCQkJaWYgKHhsX3ByaXYtPnNyYl9xdWV1ZWQpCisJCQkJCXhsX3NyYl9iaChkZXYpIDsgCisJCQl9IC8qIFNSQlIgSW50ZXJydXB0ICovCisKKwkJCWlmIChpbnRzdGF0dXMgJiBUWFVOREVSUlVOKSB7IC8qIElzc3VlIERuUmVzZXQgY29tbWFuZCAqLworCQkJCXdyaXRlbChETlJFU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCQl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IC8qIFdhaXQgZm9yIGNvbW1hbmQgdG8gcnVuICovCisJCQkJCS8qICEhISBGSVgtTUUgISEhISAKKwkJCQkJTXVzdCBwdXQgYSB0aW1lb3V0IGNoZWNrIGhlcmUgISAqLworCQkJCQkvKiBFbXB0eSBMb29wICovCisJCQkJfSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVFggVW5kZXJydW4gcmVjZWl2ZWQgXG4iLGRldi0+bmFtZSkgOworCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCQkJfSAvKiBUeFVuZGVyUnVuICovCisJCisJCQlpZiAoaW50c3RhdHVzICYgQVJCQ0lOVCApIHsgLyogQXJiYyBpbnRlcnJ1cHQgKi8KKwkJCQl4bF9hcmJfY21kKGRldikgOyAKKwkJCX0gLyogQXJiYyAqLworCisJCQlpZiAoaW50c3RhdHVzICYgQVNCRklOVCkgeyAKKwkJCQlpZiAoeGxfcHJpdi0+YXNiX3F1ZXVlZCA9PSAxKSB7CisJCQkJCXhsX2FzYl9jbWQoZGV2KSA7IAorCQkJCX0gZWxzZSBpZiAoeGxfcHJpdi0+YXNiX3F1ZXVlZCA9PSAyKSB7CisJCQkJCXhsX2FzYl9iaChkZXYpIDsgCisJCQkJfSBlbHNlIHsgCisJCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgTEFUQ0hfQUNLIHwgQVNCRkFDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQl9ICAKKwkJCX0gLyogQXNiZiAqLworCisJCQlpZiAoaW50c3RhdHVzICYgVVBDT01QSU5UICkgLyogVXBDb21wbGV0ZSAqLworCQkJCXhsX3J4KGRldikgOyAKKworCQkJaWYgKGludHN0YXR1cyAmIEROQ09NUElOVCApICAvKiBEbkNvbXBsZXRlICovCisJCQkJeGxfZG5fY29tcChkZXYpIDsgCisKKwkJCWlmIChpbnRzdGF0dXMgJiBIQVJERVJSSU5UICkgeyAvKiBIYXJkd2FyZSBlcnJvciAqLworCQkJCXdyaXRlbChNTUlPX1dPUkRfUkVBRCB8IE1BQ1NUQVRVUywgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQkJbWFjc3RhdHVzID0gcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWFjU3RhdHVzRXJyb3IsIGRldGFpbHM6ICIsIGRldi0+bmFtZSk7CisJCQkJaWYgKG1hY3N0YXR1cyAmICgxPDwxNCkpIAorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0Y2hrIGVycm9yOiBVbnJlY292ZXJhYmxlIGVycm9yIFxuIikgOyAKKwkJCQlpZiAobWFjc3RhdHVzICYgKDE8PDMpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlaW50IGVycm9yOiBJbnRlcm5hbCB3YXRjaGRvZyB0aW1lciBleHBpcmVkIFxuIikgOworCQkJCWlmIChtYWNzdGF0dXMgJiAoMTw8MikpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpbnQgZXJyb3I6IEhvc3QgdHJpZWQgdG8gcGVyZm9ybSBpbnZhbGlkIG9wZXJhdGlvbiBcbiIpIDsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5zdGF0dXMgPSAlMDJ4LCBtYWNzdGF0dXMgPSAlMDJ4XG4iLGludHN0YXR1cyxtYWNzdGF0dXMpIDsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyBoYXJkd2FyZTogXG4iLCBkZXYtPm5hbWUpOyAKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldikgOworCQkJCXhsX2ZyZWVtZW0oZGV2KSA7IAorCQkJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7IAorCQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldikgOyAKKwkJCQlmcmVlX25ldGRldihkZXYpIDsgIAorCQkJCXhsX3Jlc2V0KGRldikgOyAKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQlzcGluX3VubG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOyAKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0gZWxzZSB7IAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmVkIFVua25vd24gaW50ZXJydXB0IDogJTA0eCBcbiIsIGRldi0+bmFtZSwgaW50c3RhdHVzKSA7CisJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAJCisJCX0KKwl9IAorCisJLyogVHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gKi8KKworCXdyaXRlbCggU0VUSU5ERU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKCBTRVRJTlRFTkFCTEUgfCBJTlRfTUFTSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKworCXNwaW5fdW5sb2NrKCZ4bF9wcml2LT54bF9sb2NrKSA7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkKKworLyoKKyAqCVR4IC0gUG9sbGluZyBjb25maWd1cmF0aW9uCisgKi8KKwkKK3N0YXRpYyBpbnQgeGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJc3RydWN0IHhsX3R4X2Rlc2MgKnR4ZCA7IAorCWludCB0eF9oZWFkLCB0eF90YWlsLCB0eF9wcmV2IDsgCisJdW5zaWduZWQgbG9uZyBmbGFncyA7IAkKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4bF9wcml2LT54bF9sb2NrLGZsYWdzKSA7IAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsgCisKKwlpZiAoeGxfcHJpdi0+ZnJlZV9yaW5nX2VudHJpZXMgPiAxICkgeyAJCisJCS8qCisJCSAqIFNldCB1cCB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHBhY2tldCAKKwkJICovCisJCXR4X2hlYWQgPSB4bF9wcml2LT50eF9yaW5nX2hlYWQgOyAKKwkJdHhfdGFpbCA9IHhsX3ByaXYtPnR4X3JpbmdfdGFpbCA7IAorCisJCXR4ZCA9ICYoeGxfcHJpdi0+eGxfdHhfcmluZ1t0eF9oZWFkXSkgOyAKKwkJdHhkLT5kbm5leHRwdHIgPSAwIDsgCisJCXR4ZC0+ZnJhbWVzdGFydGhlYWRlciA9IHNrYi0+bGVuIHwgVFhETklORElDQVRFIDsgCisJCXR4ZC0+YnVmZmVyID0gcGNpX21hcF9zaW5nbGUoeGxfcHJpdi0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSkgOyAKKwkJdHhkLT5idWZmZXJfbGVuZ3RoID0gc2tiLT5sZW4gfCBUWERORlJBR0xBU1QgIDsgCisJCXhsX3ByaXYtPnR4X3Jpbmdfc2tiW3R4X2hlYWRdID0gc2tiIDsgCisJCXhsX3ByaXYtPnhsX3N0YXRzLnR4X3BhY2tldHMrKyA7IAorCQl4bF9wcml2LT54bF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbiA7CisKKwkJLyogCisJCSAqIFNldCB0aGUgbmV4dHB0ciBvZiB0aGUgcHJldmlvdXMgZGVzY3JpcHRvciBlcXVhbCB0byB0aGlzIGRlc2NyaXB0b3IsIGFkZCBYTF9UWF9SSU5HX1NJWkUgLTEgCisJCSAqIHRvIGVuc3VyZSBubyBuZWdhdGl2ZSBudW1iZXJzIGluIHVuc2lnbmVkIGxvY2F0aW9ucy4KKwkJICovIAorCQorCQl0eF9wcmV2ID0gKHhsX3ByaXYtPnR4X3JpbmdfaGVhZCArIFhMX1RYX1JJTkdfU0laRSAtIDEpICYgKFhMX1RYX1JJTkdfU0laRSAtIDEpIDsgCisKKwkJeGxfcHJpdi0+dHhfcmluZ19oZWFkKysgOyAKKwkJeGxfcHJpdi0+dHhfcmluZ19oZWFkICY9IChYTF9UWF9SSU5HX1NJWkUgLSAxKSA7CisJCXhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzLS0gOyAKKworCQl4bF9wcml2LT54bF90eF9yaW5nW3R4X3ByZXZdLmRubmV4dHB0ciA9IHhsX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIgKyAoc2l6ZW9mIChzdHJ1Y3QgeGxfdHhfZGVzYykgKiB0eF9oZWFkKSA7IAorCisJCS8qIFNuZWFreSwgYnkgZG9pbmcgYSByZWFkIG9uIERuTGlzdFB0ciB3ZSBjYW4gZm9yY2UgdGhlIGNhcmQgdG8gcG9sbCBvbiB0aGUgRG5OZXh0UHRyICovCisJCS8qIHJlYWRsKHhsX21taW8gKyBNTUlPX0ROTElTVFBUUikgOyAqLworCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KSA7IAorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhsX3ByaXYtPnhsX2xvY2ssZmxhZ3MpIDsgCisgCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhsX3ByaXYtPnhsX2xvY2ssZmxhZ3MpIDsgCisJCXJldHVybiAxOworCX0KKworfQorCQorLyogCisgKiBUaGUgTklDIGhhcyB0b2xkIHVzIHRoYXQgYSBwYWNrZXQgaGFzIGJlZW4gZG93bmxvYWRlZCBvbnRvIHRoZSBjYXJkLCB3ZSBtdXN0CisgKiBmaW5kIG91dCB3aGljaCBwYWNrZXQgaXQgaGFzIGRvbmUsIGNsZWFyIHRoZSBza2IgYW5kIGluZm9ybWF0aW9uIGZvciB0aGUgcGFja2V0CisgKiB0aGVuIGFkdmFuY2UgYXJvdW5kIHRoZSByaW5nIGZvciBhbGwgdHJhbm1pdHRlZCBwYWNrZXRzCisgKi8KKworc3RhdGljIHZvaWQgeGxfZG5fY29tcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJc3RydWN0IHhsX3R4X2Rlc2MgKnR4ZCA7IAorCisKKwlpZiAoeGxfcHJpdi0+dHhfcmluZ190YWlsID09IDI1NSkgey8qIEZpcnN0IHRpbWUgKi8KKwkJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5mcmFtZXN0YXJ0aGVhZGVyID0gMCA7IAorCQl4bF9wcml2LT54bF90eF9yaW5nWzBdLmRubmV4dHB0ciA9IDAgOyAgCisJCXhsX3ByaXYtPnR4X3JpbmdfdGFpbCA9IDEgOyAKKwl9CisKKwl3aGlsZSAoeGxfcHJpdi0+eGxfdHhfcmluZ1t4bF9wcml2LT50eF9yaW5nX3RhaWxdLmZyYW1lc3RhcnRoZWFkZXIgJiBUWEROQ09NUExFVEUgKSB7IAorCQl0eGQgPSAmKHhsX3ByaXYtPnhsX3R4X3JpbmdbeGxfcHJpdi0+dHhfcmluZ190YWlsXSkgOworCQlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsdHhkLT5idWZmZXIsIHhsX3ByaXYtPnR4X3Jpbmdfc2tiW3hsX3ByaXYtPnR4X3JpbmdfdGFpbF0tPmxlbiwgUENJX0RNQV9UT0RFVklDRSkgOyAKKwkJdHhkLT5mcmFtZXN0YXJ0aGVhZGVyID0gMCA7IAorCQl0eGQtPmJ1ZmZlciA9IDB4ZGVhZGJlZWYgIDsgCisJCXR4ZC0+YnVmZmVyX2xlbmd0aCAgPSAwIDsgIAorCQlkZXZfa2ZyZWVfc2tiX2lycSh4bF9wcml2LT50eF9yaW5nX3NrYlt4bF9wcml2LT50eF9yaW5nX3RhaWxdKSA7CisJCXhsX3ByaXYtPnR4X3JpbmdfdGFpbCsrIDsgCisJCXhsX3ByaXYtPnR4X3JpbmdfdGFpbCAmPSAoWExfVFhfUklOR19TSVpFIC0gMSkgOyAKKwkJeGxfcHJpdi0+ZnJlZV9yaW5nX2VudHJpZXMrKyA7IAorCX0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KSA7IAorCisJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBETkNPTVBBQ0sgfCBMQVRDSF9BQ0sgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorfQorCisvKgorICogQ2xvc2UgdGhlIGFkYXB0ZXIgcHJvcGVybHkuCisgKiBUaGlzIHNyYiByZXBseSBjYW5ub3QgYmUgaGFuZGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IGFzIHdlIGhhdmUKKyAqIHRvIGZyZWUgdGhlIGludGVycnVwdCBmcm9tIHRoZSBkcml2ZXIuIAorICovCisKK3N0YXRpYyBpbnQgeGxfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdW5zaWduZWQgbG9uZyB0IDsgCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldikgOyAKKworCS8qCisJICogQ2xvc2UgdGhlIGFkYXB0ZXIsIG5lZWQgdG8gc3RhbGwgdGhlIHJ4IGFuZCB0eCBxdWV1ZXMuCisJICovCisKKyAgICAJd3JpdGV3KEROU1RBTEwsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJdD1qaWZmaWVzOworCXdoaWxlIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9DTURfSU5fUFJPR1JFU1MpIHsgCisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gMTAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IDNDT00gM0MzNTkgVmVsb2NpdHkgWEwtRE5TVEFMTCBub3QgcmVzcG9uZGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhayA7IAorCQl9CisJfQorICAgIAl3cml0ZXcoRE5ESVNBQkxFLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLURORElTQUJMRSBub3QgcmVzcG9uZGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhayA7CisJCX0KKwl9CisgICAgCXdyaXRldyhVUFNUQUxMLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLVVQU1RBTEwgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKworCS8qIFR1cm4gb2ZmIGludGVycnVwdHMsIHdlIHdpbGwgc3RpbGwgZ2V0IHRoZSBpbmRpY2F0aW9uIHRob3VnaAorIAkgKiBzbyB3ZSBjYW4gdHJhcCBpdAorCSAqLworCisJd3JpdGVsKFNFVElOVEVOQUJMRSwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKworCXhsX3NyYl9jbWQoZGV2LENMT1NFX05JQykgOyAKKworCXQ9amlmZmllczsKKwl3aGlsZSAoIShyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9TUkIpKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLUNMT1NFTklDIG5vdCByZXNwb25kaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisJLyogUmVhZCB0aGUgc3JiIHJlc3BvbnNlIGZyb20gdGhlIGFkYXB0ZXIgKi8KKworCXdyaXRlbChNRU1fQllURV9SRUFEIHwgMHhkMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpOworCWlmIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAhPSBDTE9TRV9OSUMpIHsgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDTE9TRV9OSUMgZGlkIG5vdCBnZXQgYSBDTE9TRV9OSUMgcmVzcG9uc2UgXG4iLGRldi0+bmFtZSkgOyAKKwl9IGVsc2UgeyAKKwkJd3JpdGVsKChNRU1fQllURV9SRUFEIHwgMHhkMDAwMCB8IHhsX3ByaXYtPnNyYikgKzIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7CisJCWlmIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKT09MCkgeyAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBcbiIsZGV2LT5uYW1lKSA7CisJCQl3cml0ZXcoQUNLX0lOVEVSUlVQVCB8IFNSQlJBQ0sgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwkJCXhsX2ZyZWVtZW0oZGV2KSA7IAorCQkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KSA7IAorCQl9IGVsc2UgeyAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDbG9zZSBuaWMgY29tbWFuZCByZXR1cm5lZCBlcnJvciBjb2RlICUwMnhcbiIsZGV2LT5uYW1lLCByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgOworCQl9IAorCX0KKworCS8qIFJlc2V0IHRoZSB1cGxvYWQgYW5kIGRvd25sb2FkIGxvZ2ljICovCisgCisgICAgCXdyaXRldyhVUFJFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLVVQUkVTRVQgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKyAgICAJd3JpdGV3KEROUkVTRVQsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJdD1qaWZmaWVzOworCXdoaWxlIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9DTURfSU5fUFJPR1JFU1MpIHsgCisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gMTAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IDNDT00gM0MzNTkgVmVsb2NpdHkgWEwtRE5SRVNFVCBub3QgcmVzcG9uZGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhayA7IAorCQl9CisJfQorCXhsX2h3X3Jlc2V0KGRldikgOyAKKwlyZXR1cm4gMCA7Cit9CisKK3N0YXRpYyB2b2lkIHhsX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pIDsgCisJdW5zaWduZWQgY2hhciBkZXZfbWNfYWRkcmVzc1s0XSA7IAorCXUxNiBvcHRpb25zIDsgCisJaW50IGkgOyAKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCW9wdGlvbnMgPSAweDAwMDQgOyAKKwllbHNlCisJCW9wdGlvbnMgPSAweDAwMDAgOyAKKworCWlmIChvcHRpb25zIF4geGxfcHJpdi0+eGxfY29weV9hbGxfb3B0aW9ucykgeyAvKiBDaGFuZ2VkLCBtdXN0IHNlbmQgY29tbWFuZCAqLworCQl4bF9wcml2LT54bF9jb3B5X2FsbF9vcHRpb25zID0gb3B0aW9ucyA7IAorCQl4bF9zcmJfY21kKGRldiwgU0VUX1JFQ0VJVkVfTU9ERSkgOworCQlyZXR1cm4gOyAgCisJfQorCisJZGV2X21jX2FkZHJlc3NbMF0gPSBkZXZfbWNfYWRkcmVzc1sxXSA9IGRldl9tY19hZGRyZXNzWzJdID0gZGV2X21jX2FkZHJlc3NbM10gPSAwIDsKKworICAgICAgICBmb3IgKGk9MCxkbWk9ZGV2LT5tY19saXN0O2kgPCBkZXYtPm1jX2NvdW50OyBpKyssZG1pID0gZG1pLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgZGV2X21jX2FkZHJlc3NbMF0gfD0gZG1pLT5kbWlfYWRkclsyXSA7CisgICAgICAgICAgICAgICAgZGV2X21jX2FkZHJlc3NbMV0gfD0gZG1pLT5kbWlfYWRkclszXSA7CisgICAgICAgICAgICAgICAgZGV2X21jX2FkZHJlc3NbMl0gfD0gZG1pLT5kbWlfYWRkcls0XSA7CisgICAgICAgICAgICAgICAgZGV2X21jX2FkZHJlc3NbM10gfD0gZG1pLT5kbWlfYWRkcls1XSA7CisgICAgICAgIH0KKworCWlmIChtZW1jbXAoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyLGRldl9tY19hZGRyZXNzLDQpICE9IDApIHsgLyogT3B0aW9ucyBoYXZlIGNoYW5nZWQsIHJ1biB0aGUgY29tbWFuZCAqLworCQltZW1jcHkoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyLCBkZXZfbWNfYWRkcmVzcyw0KSA7IAorCQl4bF9zcmJfY21kKGRldiwgU0VUX0ZVTkNfQUREUkVTUykgOyAKKwl9CisJcmV0dXJuIDsgCit9CisKKworLyoKKyAqCVdlIGlzc3VlZCBhbiBzcmIgY29tbWFuZCBhbmQgbm93IHdlIG11c3QgcmVhZAorICoJdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNvbXBsZXRlZCBjb21tYW5kLgorICovCisKK3N0YXRpYyB2b2lkIHhsX3NyYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggc3JiX2NtZCwgcmV0X2NvZGUgOyAKKwlpbnQgaSA7IAorCisJd3JpdGVsKE1FTV9CWVRFX1JFQUQgfCAweGQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCXNyYl9jbWQgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCXdyaXRlbCgoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIpICsyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCXJldF9jb2RlID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIFJldF9jb2RlIGlzIHN0YW5kYXJkIGFjcm9zcyBhbGwgY29tbWFuZHMgKi8KKworCXN3aXRjaCAocmV0X2NvZGUpIHsgCisJY2FzZSAxOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29tbWFuZDogJWQgLSBJbnZhbGlkIENvbW1hbmQgY29kZVxuIixkZXYtPm5hbWUsc3JiX2NtZCkgOyAKKwkJYnJlYWsgOyAKKwljYXNlIDQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb21tYW5kOiAlZCAtIEFkYXB0ZXIgaXMgY2xvc2VkLCBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgY29tbWFuZCBcbiIsZGV2LT5uYW1lLHNyYl9jbWQpIDsgCisJCWJyZWFrIDsKKwkKKwljYXNlIDY6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb21tYW5kOiAlZCAtIE9wdGlvbnMgSW52YWxpZCBmb3IgY29tbWFuZCBcbiIsZGV2LT5uYW1lLHNyYl9jbWQpIDsKKwkJYnJlYWsgOworCisJY2FzZSAwOiAvKiBTdWNjZXNzZnVsIGNvbW1hbmQgZXhlY3V0aW9uICovIAorCQlzd2l0Y2ggKHNyYl9jbWQpIHsgCisJCWNhc2UgUkVBRF9MT0c6IC8qIFJldHVybnMgMTQgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBOSUMgKi8KKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJFQUQuTE9HIDE0IGJ5dGVzIG9mIGRhdGEgIixkZXYtPm5hbWUpIDsgCisJCQkvKiAKKwkJCSAqIFdlIHN0aWxsIGhhdmUgdG8gcmVhZCB0aGUgbG9nIGV2ZW4gaWYgbWVzc2FnZV9sZXZlbCA9IDAgYW5kIHdlIGRvbid0IHdhbnQKKwkJCSAqIHRvIHNlZSBpdAorCQkJICovCisJCQlmb3IgKGk9MDtpPDE0O2krKykgeyAKKwkJCQl3cml0ZWwoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIgfCBpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKSAKKwkJCQkJcHJpbnRrKCIlMDJ4OiIscmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsgCQorCQkJfSAKKwkJCXByaW50aygiXG4iKSA7IAorCQkJYnJlYWsgOyAKKwkJY2FzZSBTRVRfRlVOQ19BRERSRVNTOgorCQkJaWYoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bmN0aW9uYWwgQWRkcmVzcyBTZXQgXG4iLGRldi0+bmFtZSkgOyAgCisJCQlicmVhayA7IAorCQljYXNlIENMT1NFX05JQzoKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIENMT1NFX05JQyBpbnRlcnJ1cHQgaW4gaW50ZXJydXB0IGhhbmRsZXIgXG4iLGRldi0+bmFtZSkgOyAJCisJCQlicmVhayA7IAorCQljYXNlIFNFVF9NVUxUSUNBU1RfTU9ERToKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE11bHRpY2FzdCBvcHRpb25zIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkXG4iLGRldi0+bmFtZSkgOyAKKwkJCWJyZWFrIDsKKwkJY2FzZSBTRVRfUkVDRUlWRV9NT0RFOgorCQkJaWYoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgeyAgCisJCQkJaWYgKHhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMgPT0gMHgwMDA0KSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVudGVyaW5nIHByb21pc2N1b3VzIG1vZGUgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQkJZWxzZQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgbm9ybWFsIHJlY2VpdmUgbW9kZSBcbiIsZGV2LT5uYW1lKSA7IAorCQkJfQorCQkJYnJlYWsgOyAKKyAKKwkJfSAvKiBzd2l0Y2ggKi8KKwkJYnJlYWsgOyAKKwl9IC8qIHN3aXRjaCAqLworCXJldHVybiA7IAkKK30gCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHhsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmeGxfcHJpdi0+eGxfc3RhdHM7IAorfQorCitzdGF0aWMgaW50IHhsX3NldF9tYWNfYWRkcmVzcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikgCit7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9IGFkZHIgOyAKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7IAorCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBzZXQgbWFjL2xhYSBhZGRyZXNzIHdoaWxlIGNhcmQgaXMgb3BlblxuIiwgZGV2LT5uYW1lKSA7IAorCQlyZXR1cm4gLUVJTyA7IAorCX0KKworCW1lbWNweSh4bF9wcml2LT54bF9sYWEsIHNhZGRyLT5zYV9kYXRhLGRldi0+YWRkcl9sZW4pIDsgCisJCisJaWYgKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpIHsgCisgCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDL0xBQSBTZXQgdG8gID0gJXguJXguJXguJXguJXguJXhcbiIsZGV2LT5uYW1lLCB4bF9wcml2LT54bF9sYWFbMF0sCisJCXhsX3ByaXYtPnhsX2xhYVsxXSwgeGxfcHJpdi0+eGxfbGFhWzJdLAorCQl4bF9wcml2LT54bF9sYWFbM10sIHhsX3ByaXYtPnhsX2xhYVs0XSwKKwkJeGxfcHJpdi0+eGxfbGFhWzVdKTsKKwl9IAorCisJcmV0dXJuIDAgOyAKK30KKworc3RhdGljIHZvaWQgeGxfYXJiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1OCBhcmJfY21kIDsgCisJdTE2IGxhbl9zdGF0dXMsIGxhbl9zdGF0dXNfZGlmZiA7IAorCisJd3JpdGVsKCAoIE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXJiKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJYXJiX2NtZCA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCisJaWYgKGFyYl9jbWQgPT0gUklOR19TVEFUVVNfQ0hBTkdFKSB7IC8qIFJpbmcuU3RhdHVzLkNoYW5nZSAqLworCQl3cml0ZWwoICggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXJiKSArIDYpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQkgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIFN0YXR1cyBDaGFuZ2U6IE5ldyBTdGF0dXMgPSAlMDR4XG4iLCBkZXYtPm5hbWUsIG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICkpIDsgCisKKwkJbGFuX3N0YXR1cyA9IG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKTsKKwkKKwkJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0LCB0aGlzIHRlbGxzIG5pYyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBhcmIgKi8KKwkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBBUkJDQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCQkJCisJCWxhbl9zdGF0dXNfZGlmZiA9IHhsX3ByaXYtPnhsX2xhbl9zdGF0dXMgXiBsYW5fc3RhdHVzIDsgCisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIChMU0NfTFdGIHwgTFNDX0FSVyB8IExTQ19GUEUgfCBMU0NfUlIpICkgeyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfTFdGKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU2hvcnQgY2lyY3VpdCBkZXRlY3RlZCBvbiB0aGUgbG9iZVxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19BUlcpIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBdXRvIHJlbW92YWwgZXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRlBFKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGRFggUHJvdG9jb2wgRXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUlIpIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGb3JjZSByZW1vdmUgTUFDIGZyYW1lIHJlY2VpdmVkXG4iLGRldi0+bmFtZSk7CisJCQorCQkJLyogQWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGhhcmR3YXJlICovCisKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCXhsX2ZyZWVtZW0oZGV2KSA7IAorCQkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwkJCQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgaGFzIGJlZW4gY2xvc2VkIFxuIiwgZGV2LT5uYW1lKSA7IAorCQl9IC8qIElmIHNlcmlvdXMgZXJyb3IgKi8KKwkJCisJCWlmICh4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKSB7IAorCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TSUdfTE9TUykgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIHNpZ25hbCBkZXRlY3RlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfSEFSRF9FUlIpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCZWFjb25pbmcgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NPRlRfRVJSKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciB0cmFuc21pdHRlZCBTb2Z0IEVycm9yIFJlcG9ydCBNYWMgRnJhbWUgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1RSQU5fQkNOKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdlIGFyZSB0cmFubWl0dGluZyB0aGUgYmVhY29uLCBhYWFoXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NTKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uIG9uIHRoZSByaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUklOR19SRUMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIHJlY292ZXJ5IG9uZ29pbmdcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRkRYX01PREUpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVyYXRpbmcgaW4gRkRYIG1vZGVcbiIsZGV2LT5uYW1lKTsKKwkJfSAJCisJCQorCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0NPKSB7IAorCQkJCWlmICh4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvdW50ZXIgT3ZlcmZsb3cgXG4iLCBkZXYtPm5hbWUpOworCQkJCS8qIElzc3VlIFJFQUQuTE9HIGNvbW1hbmQgKi8KKwkJCQl4bF9zcmJfY21kKGRldiwgUkVBRF9MT0cpIDsgCQorCQl9CisKKwkJLyogVGhlcmUgaXMgbm8gY29tbWFuZCBpbiB0aGUgdGVjaCBkb2NzIHRvIGlzc3VlIHRoZSByZWFkX3NyX2NvdW50ZXJzICovCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU1JfQ08pIHsgCisJCQlpZiAoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU291cmNlIHJvdXRpbmcgY291bnRlcnMgb3ZlcmZsb3dcbiIsIGRldi0+bmFtZSk7CisJCX0KKworCQl4bF9wcml2LT54bF9sYW5fc3RhdHVzID0gbGFuX3N0YXR1cyA7IAorCQorCX0gIC8qIExhbi5jaGFuZ2Uuc3RhdHVzICovCisJZWxzZSBpZiAoIGFyYl9jbWQgPT0gUkVDRUlWRV9EQVRBKSB7IC8qIFJlY2VpdmVkLkRhdGEgKi8KKyNpZiBYTF9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJSZWNlaXZlZC5EYXRhIFxuIikgOyAKKyNlbmRpZiAJCQorCQl3cml0ZWwoICgoTUVNX1dPUkRfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5hcmIpICsgNiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7CisJCXhsX3ByaXYtPm1hY19idWZmZXIgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgOworCQkKKwkJLyogTm93IHdlIGFyZSBnb2luZyB0byBiZSByZWFsbHkgYmFzaWMgaGVyZSBhbmQgbm90IGRvIGFueXRoaW5nCisJCSAqIHdpdGggdGhlIGRhdGEgYXQgYWxsLiBUaGUgdGVjaCBkb2NzIGRvIG5vdCBnaXZlIG1lIGVub3VnaAorCQkgKiBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlcnMgcHJvcGVybHkgc28gd2UncmUKKwkJICoganVzdCBnb2luZyB0byB0ZWxsIHRoZSBuaWMgdGhhdCB3ZSd2ZSBkZWFsdCB3aXRoIHRoZSBmcmFtZQorCQkgKiBhbnl3YXkuCisJCSAqLworCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXMgOyAKKwkJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0LCB0aGlzIHRlbGxzIG5pYyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBhcmIgKi8KKwkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBBUkJDQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJCS8qIElzIHRoZSBBU0IgZnJlZSA/ICovIAkKKwkJCQorCQl4bF9wcml2LT5hc2JfcXVldWVkID0gMCA7IAkJCQorCQl3cml0ZWwoICgoTUVNX0JZVEVfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5hc2IpICsgMiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7CisJCWlmIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAhPSAweGZmKSB7IAorCQkJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDEgOworCisJCQl4bF93YWl0X21pc3JfZmxhZ3MoZGV2KSA7ICAKKworCQkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfQVNCRlIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsgCisJCQl3cml0ZWIoMHhmZiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOworCQkJd3JpdGVsKE1NSU9fQllURV9XUklURSB8IE1JU1JfU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJCXdyaXRlYihNSVNSX0FTQkZSLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQkJcmV0dXJuIDsgCQorCQkJLyogRHJvcCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBib3R0b20gaGFsZiB0byBiZSBydW4gKi8KKwkJfQorCQorCQl4bF9hc2JfY21kKGRldikgOyAKKwkJCisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmVkIHVua25vd24gYXJiICh4bF9wcml2KSBjb21tYW5kOiAlMDJ4IFxuIixkZXYtPm5hbWUsYXJiX2NtZCkgOyAKKwl9CisKKwkvKiBBY2tub3dsZWRnZSB0aGUgYXJiIGludGVycnVwdCAqLworCisJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBBUkJDQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKworCXJldHVybiA7IAorfQorCisKKy8qCisgKglUaGVyZSBpcyBvbmx5IG9uZSBhc2IgY29tbWFuZCwgYnV0IHdlIGNhbiBnZXQgY2FsbGVkIGZyb20gZGlmZmVyZW50CisgKglwbGFjZXMuCisgKi8KKworc3RhdGljIHZvaWQgeGxfYXNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCisJaWYgKHhsX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMSkgCisJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgTEFUQ0hfQUNLIHwgQVNCRkFDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMHhkMDAwMCB8IHhsX3ByaXYtPmFzYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4ODEsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwl3cml0ZWwoTUVNX1dPUkRfV1JJVEUgfCAweGQwMDAwIHwgeGxfcHJpdi0+YXNiIHwgNiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGV3KG50b2hzKHhsX3ByaXYtPm1hY19idWZmZXIpLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJeGxfd2FpdF9taXNyX2ZsYWdzKGRldikgOyAJCisKKwl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCBNRl9SQVNCLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7IAorCXdyaXRlYigweGZmLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7CisKKwl3cml0ZWwoTU1JT19CWVRFX1dSSVRFIHwgTUlTUl9TRVQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYihNSVNSX1JBU0IsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwl4bF9wcml2LT5hc2JfcXVldWVkID0gMiA7IAorCisJcmV0dXJuIDsgCit9CisKKy8qCisgKiAJVGhpcyB3aWxsIG9ubHkgZ2V0IGNhbGxlZCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKKyAqCWZyb20gdGhlIGFzYiBjbWQuCisgKi8KK3N0YXRpYyB2b2lkIHhsX2FzYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1OCByZXRfY29kZSA7IAorCisJd3JpdGVsKE1NSU9fQllURV9SRUFEIHwgMHhkMDAwMCB8IHhsX3ByaXYtPmFzYiB8IDIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXJldF9jb2RlID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwlzd2l0Y2ggKHJldF9jb2RlKSB7IAorCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQVNCIENvbW1hbmQsIHVucmVjb2duaXplZCBjb21tYW5kIGNvZGUgXG4iLGRldi0+bmFtZSkgOworCQkJYnJlYWsgOworCQljYXNlIDB4MjY6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQVNCIENvbW1hbmQsIHVuZXhwZWN0ZWQgcmVjZWl2ZSBidWZmZXIgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQlicmVhayA7IAorCQljYXNlIDB4NDA6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQVNCIENvbW1hbmQsIEludmFsaWQgU3RhdGlvbiBJRCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCWJyZWFrIDsgIAorCX0KKwl4bF9wcml2LT5hc2JfcXVldWVkID0gMCA7IAorCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgTEFUQ0hfQUNLIHwgQVNCRkFDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOworCXJldHVybiA7ICAKK30KKworLyogCQorICoJSXNzdWUgc3JiIGNvbW1hbmRzIHRvIHRoZSBuaWMgCisgKi8KKworc3RhdGljIHZvaWQgeGxfc3JiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3JiX2NtZCkgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisKKwlzd2l0Y2ggKHNyYl9jbWQpIHsgCisJY2FzZSBSRUFEX0xPRzoKKwkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihSRUFEX0xPRywgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJYnJlYWs7IAorCisJY2FzZSBDTE9TRV9OSUM6CisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoQ0xPU0VfTklDLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlicmVhayA7CisKKwljYXNlIFNFVF9SRUNFSVZFX01PREU6CisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoU0VUX1JFQ0VJVkVfTU9ERSwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJd3JpdGVsKE1FTV9XT1JEX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYiB8IDQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZXcoeGxfcHJpdi0+eGxfY29weV9hbGxfb3B0aW9ucywgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJYnJlYWsgOworCisJY2FzZSBTRVRfRlVOQ19BRERSRVNTOgorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKFNFVF9GVU5DX0FERFJFU1MsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA2ICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYih4bF9wcml2LT54bF9mdW5jdGlvbmFsX2FkZHJbMF0sIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA3ICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYih4bF9wcml2LT54bF9mdW5jdGlvbmFsX2FkZHJbMV0sIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA4ICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYih4bF9wcml2LT54bF9mdW5jdGlvbmFsX2FkZHJbMl0sIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA5ICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYih4bF9wcml2LT54bF9mdW5jdGlvbmFsX2FkZHJbM10sIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKwkJYnJlYWsgOyAgCisJfSAvKiBzd2l0Y2ggKi8KKworCisJeGxfd2FpdF9taXNyX2ZsYWdzKGRldikgIDsgCisKKwkvKiBXcml0ZSAweGZmIHRvIHRoZSBDU1JCIGZsYWcgKi8KKwl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCBNRl9DU1JCICwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4RkYsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJLyogU2V0IGNzcmIgYml0IGluIE1JU1IgcmVnaXN0ZXIgdG8gcHJvY2VzcyBjb21tYW5kICovCisJd3JpdGVsKE1NSU9fQllURV9XUklURSB8IE1JU1JfU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoTUlTUl9DU1JCLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCXhsX3ByaXYtPnNyYl9xdWV1ZWQgPSAxIDsgCisKKwlyZXR1cm4gOyAKK30KKworLyoKKyAqIFRoaXMgaXMgbmFzdHksIHRvIHVzZSB0aGUgTUlTUiBjb21tYW5kIHlvdSBoYXZlIHRvIHdhaXQgZm9yIDYgbWVtb3J5IGxvY2F0aW9ucworICogdG8gYmUgemVyby4gVGhpcyBpcyB0aGUgd2F5IHRoZSBkcml2ZXIgZG9lcyBvbiBvdGhlciBPUydlcyBzbyB3ZSBzaG91bGQgYmUgb2sgd2l0aCAKKyAqIHRoZSBlbXB0eSBsb29wLgorICovCisKK3N0YXRpYyB2b2lkIHhsX3dhaXRfbWlzcl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwkKKwlpbnQgaSAgOyAKKwkKKwl3cml0ZWwoTU1JT19CWVRFX1JFQUQgfCBNSVNSX1JXLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gMCkgeyAgLyogTWlzciBub3QgY2xlYXIgKi8KKwkJZm9yIChpPTA7IGk8NjsgaSsrKSB7IAorCQkJd3JpdGVsKE1FTV9CWVRFX1JFQUQgfCAweERGRkUwIHwgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3aGlsZSAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gMCApIHt9IDsgLyogRW1wdHkgTG9vcCAqLworCQl9IAorCX0KKworCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX0FORCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4ODAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwlyZXR1cm4gOyAKK30gCisKKy8qCisgKglDaGFuZ2UgbXR1IHNpemUsIHRoaXMgc2hvdWxkIHdvcmsgdGhlIHNhbWUgYXMgb2x5bXBpYworICovCisKK3N0YXRpYyBpbnQgeGxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTE2IG1heF9tdHUgOyAKKworCWlmICh4bF9wcml2LT54bF9yaW5nX3NwZWVkID09IDQpCisJCW1heF9tdHUgPSA0NTAwIDsgCisJZWxzZQorCQltYXhfbXR1ID0gMTgwMDAgOyAKKwkKKwlpZiAobXR1ID4gbWF4X210dSkKKwkJcmV0dXJuIC1FSU5WQUwgOyAKKwlpZiAobXR1IDwgMTAwKSAKKwkJcmV0dXJuIC1FSU5WQUwgOyAKKworCWRldi0+bXR1ID0gbXR1IDsgCisJeGxfcHJpdi0+cGt0X2J1Zl9zeiA9IG10dSArIFRSX0hMRU4gOyAKKworCXJldHVybiAwIDsgCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB4bF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2PShzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwkKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlvdW5tYXAoeGxfcHJpdi0+eGxfbW1pbykgOyAKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpIDsgCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsTlVMTCkgOyAKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiA7IAorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeGxfM2MzNTlfZHJpdmVyID0geworCS5uYW1lCQk9ICIzYzM1OSIsCisJLmlkX3RhYmxlCT0geGxfcGNpX3RibCwKKwkucHJvYmUJCT0geGxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh4bF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhsX3BjaV9pbml0ICh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZ4bF8zYzM1OV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4bF9wY2lfY2xlYW51cCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZ4bF8zYzM1OV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4bF9wY2lfaW5pdCk7Cittb2R1bGVfZXhpdCh4bF9wY2lfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKSA7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM4NjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiAgM2MzNTkuaCAoYykgMjAwMCBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIDNDb20gM0MzNTkgVG9rZW4gTGluayBQQ0kgWEwgY2FyZHMuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgCisgKiAgYW55IGxhdGVyIHZlcmlvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworLyogTWVtb3J5IEFjY2VzcyBDb21tYW5kcyAqLworI2RlZmluZSBJT19CWVRFX1JFQUQgMHgyOCA8PCAyNAorI2RlZmluZSBJT19CWVRFX1dSSVRFIDB4MTggPDwgMjQgCisjZGVmaW5lIElPX1dPUkRfUkVBRCAweDIwIDw8IDI0CisjZGVmaW5lIElPX1dPUkRfV1JJVEUgMHgxMCA8PCAyNAorI2RlZmluZSBNTUlPX0JZVEVfUkVBRCAweDg4IDw8IDI0CisjZGVmaW5lIE1NSU9fQllURV9XUklURSAweDQ4IDw8IDI0CisjZGVmaW5lIE1NSU9fV09SRF9SRUFEIDB4ODAgPDwgMjQKKyNkZWZpbmUgTU1JT19XT1JEX1dSSVRFIDB4NDAgPDwgMjQKKyNkZWZpbmUgTUVNX0JZVEVfUkVBRCAweDhDIDw8IDI0CisjZGVmaW5lIE1FTV9CWVRFX1dSSVRFIDB4NEMgPDwgMjQKKyNkZWZpbmUgTUVNX1dPUkRfUkVBRCAweDg0IDw8IDI0CisjZGVmaW5lIE1FTV9XT1JEX1dSSVRFIDB4NDQgPDwgMjQKKworI2RlZmluZSBQTUJBUiAweDFDODAKKyNkZWZpbmUgUE1CX0NQSE9MRCAoMTw8MTApCisKKyNkZWZpbmUgQ1BBVFRFTlRJT04gMHgxODBECisjZGVmaW5lIENQQV9QTUJBUlZJUyAoMTw8NykKKyNkZWZpbmUgQ1BBX01FTVdSRU4gKDE8PDYpCisKKyNkZWZpbmUgU1dJVENIU0VUVElOR1MgMHgxQzg4CisjZGVmaW5lIEVFQ09OVFJPTCAweDFDOEEKKyNkZWZpbmUgRUVEQVRBIDB4MUM4QworI2RlZmluZSBFRVJFQUQgMHgwMDgwIAorI2RlZmluZSBFRVdSSVRFIDB4MDA0MAorI2RlZmluZSBFRUVSQVNFIDB4MDA2MAorI2RlZmluZSBFRV9FTkFCTEVfV1JJVEUgMHgwMDMwCisjZGVmaW5lIEVFQlVTWSAoMTw8MTUpCisKKyNkZWZpbmUgV1JCUiAweENERTAyCisjZGVmaW5lIFdXT1IgMHhDREUwNAorI2RlZmluZSBXV0NSIDB4Q0RFMDYKKyNkZWZpbmUgTUFDU1RBVFVTIDB4Q0RFMDggCisjZGVmaW5lIE1JU1JfUlcgMHhDREUwQgorI2RlZmluZSBNSVNSX0FORCAweENERTJCCisjZGVmaW5lIE1JU1JfU0VUIDB4Q0RFNEIKKyNkZWZpbmUgUlhCVUZBUkVBIDB4Q0RFMTAKKyNkZWZpbmUgUlhFQVJMWVRIUkVTSCAweENERTEyCisjZGVmaW5lIFRYU1RBUlRUSFJFU0ggMHg1OAorI2RlZmluZSBETlBSSVJFUVRIUkVTSCAweDJDCisKKyNkZWZpbmUgTUlTUl9DU1JCICgxPDw1KQorI2RlZmluZSBNSVNSX1JBU0IgKDE8PDQpCisjZGVmaW5lIE1JU1JfU1JCRlIgKDE8PDMpCisjZGVmaW5lIE1JU1JfQVNCRlIgKDE8PDIpCisjZGVmaW5lIE1JU1JfQVJCRiAoMTw8MSkgCisKKy8qIE1JU1IgRmxhZ3MgbWVtb3J5IGxvY2F0aW9ucyAqLworI2RlZmluZSBNRl9TU0JGIDB4REZGRTAgCisjZGVmaW5lIE1GX0FSQkYgMHhERkZFMQorI2RlZmluZSBNRl9BU0JGUiAweERGRkUyCisjZGVmaW5lIE1GX1NSQkZSIDB4REZGRTMKKyNkZWZpbmUgTUZfUkFTQiAweERGRkU0CisjZGVmaW5lIE1GX0NTUkIgMHhERkZFNQorCisjZGVmaW5lIE1NSU9fTUFDREFUQSAweDEwIAorI2RlZmluZSBNTUlPX01BQ19BQ0NFU1NfQ01EIDB4MTQKKyNkZWZpbmUgTU1JT19USU1FUiAweDFBCisjZGVmaW5lIE1NSU9fRE1BX0NUUkwgMHgyMAorI2RlZmluZSBNTUlPX0ROTElTVFBUUiAweDI0CisjZGVmaW5lIE1NSU9fSEFTSEZJTFRFUiAweDI4CisjZGVmaW5lIE1NSU9fQ09ORklHIDB4MjkKKyNkZWZpbmUgTU1JT19ETlBSSVJFUVRIUkVTSCAweDJDCisjZGVmaW5lIE1NSU9fRE5QT0xMIDB4MkQKKyNkZWZpbmUgTU1JT19VUFBLVFNUQVRVUyAweDMwCisjZGVmaW5lIE1NSU9fRlJFRVRJTUVSIDB4MzQKKyNkZWZpbmUgTU1JT19DT1VOVERPV04gMHgzNgorI2RlZmluZSBNTUlPX1VQTElTVFBUUiAweDM4CisjZGVmaW5lIE1NSU9fVVBQT0xMIDB4M0MKKyNkZWZpbmUgTU1JT19VUEJVUlNUVEhSRVNIIDB4NDAKKyNkZWZpbmUgTU1JT19ETkJVUlNUVEhSRVNIIDB4NDEKKyNkZWZpbmUgTU1JT19JTlRTVEFUVVNfQVVUTyAweDU2CisjZGVmaW5lIE1NSU9fVFhTVEFSVFRIUkVTSCAweDU4CisjZGVmaW5lIE1NSU9fSU5URVJSVVBURU5BQkxFIDB4NUEKKyNkZWZpbmUgTU1JT19JTkRJQ0FUSU9ORU5BQkxFIDB4NUMKKyNkZWZpbmUgTU1JT19DT01NQU5EIDB4NUUgIC8qIFRoZXNlIHR3byBhcmUgbWVhbnQgdG8gYmUgdGhlIHNhbWUgKi8KKyNkZWZpbmUgTU1JT19JTlRTVEFUVVMgMHg1RSAvKiBNYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlIHRoaXMgd2F5ICovCisjZGVmaW5lIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTICgxPDwxMikgCisjZGVmaW5lIElOVFNUQVRfU1JCICgxPDwxNCkKKyNkZWZpbmUgSU5UU1RBVF9JTlRMQVRDSCAoMTw8MCkKKworLyogSW5kaWNhdGlvbiAvIEludGVycnVwdCBNYXNrIAorICogQW5ub3lpbmdseSB0aGUgYml0cyB0byBiZSBzZXQgaW4gdGhlIGluZGljYXRpb24gYW5kIGludGVycnVwdCBlbmFibGUKKyAqIGRvIG5vdCBtYXRjaCB3aXRoIHRoZSBhY3R1YWwgYml0cyByZWNlaXZlZCBpbiB0aGUgaW50ZXJydXB0LCBhbHRob3VnaAorICogdGhleSBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuIAorICogVGhlIG1hcHBpbmcgZm9yIHRoZSBpbmRpY2F0aW9uIC8gaW50ZXJydXB0IGFyZToKKyAqIEJpdAlJbmRpY2F0aW9uIC8gSW50ZXJydXB0CisgKiAgIDAJSG9zdEVycm9yCisgKiAgIDEJdHhjb21wbGV0ZQorICogICAyCXVwZG5lZWRlZAorICogICAzCXJ4Y29tcGxldGUKKyAqICAgNAlpbnRyZXF1ZXN0ZWQKKyAqICAgNQltYWNlcnJvcgorICogICA2ICBkbmNvbXBsZXRlCisgKiAgIDcJdXBjb21wbGV0ZQorICogICA4CXR4dW5kZXJydW4KKyAqICAgOQlhc2JmCisgKiAgMTAJc3JicgorICogIDExCWFyYmMKKyAqCisgKiAgVGhlIG9ubHkgb25lcyB3ZSBkb24ndCB3YW50IHRvIHJlY2VpdmUgYXJlIHR4Y29tcGxldGUgYW5kIHJ4Y29tcGxldGUKKyAqICB3ZSB1c2UgZG5jb21wbGV0ZSBhbmQgdXBjb21wbGV0ZSBpbnN0ZWFkLgorICovCisKKyNkZWZpbmUgSU5UX01BU0sgMHhGRjUKKworLyogTm90ZSB0aGUgc3VidGxlIGRpZmZlcmVuY2UgaGVyZSwgSU5EIGFuZCBJTlQgKi8KKworI2RlZmluZSBTRVRJTkRFTkFCTEUgKDg8PDEyKQorI2RlZmluZSBTRVRJTlRFTkFCTEUgKDc8PDEyKQorI2RlZmluZSBTUkJCSVQgKDE8PDEwKQorI2RlZmluZSBBU0JCSVQgKDE8PDkpCisjZGVmaW5lIEFSQkJJVCAoMTw8MTEpCisKKyNkZWZpbmUgU1JCIDB4REZFOTAKKyNkZWZpbmUgQVNCIDB4REZFRDAKKyNkZWZpbmUgQVJCIDB4RDAwMDAKKyNkZWZpbmUgU0NSQVRDSCAweERGRUYwCisKKyNkZWZpbmUgSU5UX1JFUVVFU1QgMHg2MDAwIC8qICg2IDw8IDEyKSAqLworI2RlZmluZSBBQ0tfSU5URVJSVVBUIDB4NjgwMCAvKiAoMTMgPDwxMSkgKi8KKyNkZWZpbmUgR0xPQkFMX1JFU0VUIDB4MDAgCisjZGVmaW5lIERORElTQUJMRSAweDUwMDAgCisjZGVmaW5lIERORU5BQkxFIDB4NDgwMCAKKyNkZWZpbmUgRE5TVEFMTCAweDMwMDIKKyNkZWZpbmUgRE5SRVNFVCAweDU4MDAKKyNkZWZpbmUgRE5VTlNUQUxMIDB4MzAwMworI2RlZmluZSBVUFJFU0VUIDB4MjgwMAorI2RlZmluZSBVUFNUQUxMIDB4MzAwMAorI2RlZmluZSBVUFVOU1RBTEwgMHgzMDAxCisjZGVmaW5lIFNFVENPTkZJRyAweDQwMDAKKyNkZWZpbmUgU0VUVFhTVEFSVFRIUkVTSCAweDk4MDAgCisKKy8qIFJlY2VpdmVkIEludGVycnVwdHMgKi8KKyNkZWZpbmUgQVNCRklOVCAoMTw8MTMpCisjZGVmaW5lIFNSQlJJTlQgKDE8PDE0KQorI2RlZmluZSBBUkJDSU5UICgxPDwxNSkKKyNkZWZpbmUgVFhVTkRFUlJVTiAoMTw8MTEpCisKKyNkZWZpbmUgVVBDT01QSU5UICgxPDwxMCkKKyNkZWZpbmUgRE5DT01QSU5UICgxPDw5KQorI2RlZmluZSBIQVJERVJSSU5UICgxPDw3KQorI2RlZmluZSBSWENPTVBMRVRFICgxPDw0KQorI2RlZmluZSBUWENPTVBJTlQgKDE8PDIpCisjZGVmaW5lIEhPU1RFUlJJTlQgKDE8PDEpCisKKy8qIFJlY2VpdmUgZGVzY3JpcHRvciBiaXRzICovCisjZGVmaW5lIFJYT1ZFUlJVTiAoMTw8MTkpCisjZGVmaW5lIFJYRkMgKDE8PDIxKQorI2RlZmluZSBSWEFSICgxPDwyMikKKyNkZWZpbmUgUlhVUERDT01QTEVURSAoMTw8MjMpCisjZGVmaW5lIFJYVVBERlVMTCAoMTw8MjQpCisjZGVmaW5lIFJYVVBMQVNURlJBRyAoMTw8MzEpCisKKy8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgYml0cyAqLworI2RlZmluZSBUWEROQ09NUExFVEUgKDE8PDE2KQorI2RlZmluZSBUWFRYSU5ESUNBVEUgKDE8PDI3KQorI2RlZmluZSBUWERQREVNUFRZICgxPDwyOSkKKyNkZWZpbmUgVFhETklORElDQVRFICgxPDwzMSkKKyNkZWZpbmUgVFhETkZSQUdMQVNUICgxPDwzMSkKKworLyogSW50ZXJydXB0cyB0byBBY2tub3dsZWRnZSAqLworI2RlZmluZSBMQVRDSF9BQ0sgMSAKKyNkZWZpbmUgVFhDT01QQUNLICgxPDwxKQorI2RlZmluZSBJTlRSRVFBQ0sgKDE8PDIpCisjZGVmaW5lIEROQ09NUEFDSyAoMTw8MykKKyNkZWZpbmUgVVBDT01QQUNLICgxPDw0KQorI2RlZmluZSBBU0JGQUNLICgxPDw1KQorI2RlZmluZSBTUkJSQUNLICgxPDw2KQorI2RlZmluZSBBUkJDQUNLICgxPDw3KQorCisjZGVmaW5lIFhMX0lPX1NQQUNFIDEyOAorI2RlZmluZSBTUkJfQ09NTUFORF9TSVpFIDUwCisKKy8qIEFkYXB0ZXIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgUkVRVUVTVF9JTlQgMHgwMAorI2RlZmluZSBNT0RJRllfT1BFTl9QQVJNUyAweDAxCisjZGVmaW5lIFJFU1RPUkVfT1BFTl9QQVJNUyAweDAyCisjZGVmaW5lIE9QRU5fTklDIDB4MDMKKyNkZWZpbmUgQ0xPU0VfTklDIDB4MDQKKyNkZWZpbmUgU0VUX1NMRUVQX01PREUgMHgwNQorI2RlZmluZSBTRVRfR1JPVVBfQUREUkVTUyAweDA2CisjZGVmaW5lIFNFVF9GVU5DX0FERFJFU1MgMHgwNworI2RlZmluZSBSRUFEX0xPRyAweDA4CisjZGVmaW5lIFNFVF9NVUxUSUNBU1RfTU9ERSAweDBDCisjZGVmaW5lIENIQU5HRV9XQUtFVVBfUEFUVEVSTiAweDBECisjZGVmaW5lIEdFVF9TVEFUSVNUSUNTIDB4MTMKKyNkZWZpbmUgU0VUX1JFQ0VJVkVfTU9ERSAweDFGCisKKy8qIEFSQiBDb21tYW5kcyAqLworI2RlZmluZSBSRUNFSVZFX0RBVEEgMHg4MQorI2RlZmluZSBSSU5HX1NUQVRVU19DSEFOR0UgMHg4NAorCisvKiBBU0IgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQVNCX1JFQ0VJVkVfREFURSAweDgxIAorCisvKiBEZWZpbmVzIGZvciBMQU4gU1RBVFVTIENIQU5HRSByZXBvcnRzICovCisjZGVmaW5lIExTQ19TSUdfTE9TUyAweDgwMDAKKyNkZWZpbmUgTFNDX0hBUkRfRVJSIDB4NDAwMAorI2RlZmluZSBMU0NfU09GVF9FUlIgMHgyMDAwCisjZGVmaW5lIExTQ19UUkFOX0JDTiAweDEwMDAKKyNkZWZpbmUgTFNDX0xXRiAgICAgIDB4MDgwMAorI2RlZmluZSBMU0NfQVJXICAgICAgMHgwNDAwCisjZGVmaW5lIExTQ19GUEUgICAgICAweDAyMDAKKyNkZWZpbmUgTFNDX1JSICAgICAgIDB4MDEwMAorI2RlZmluZSBMU0NfQ08gICAgICAgMHgwMDgwCisjZGVmaW5lIExTQ19TUyAgICAgICAweDAwNDAKKyNkZWZpbmUgTFNDX1JJTkdfUkVDIDB4MDAyMAorI2RlZmluZSBMU0NfU1JfQ08gICAgMHgwMDEwCisjZGVmaW5lIExTQ19GRFhfTU9ERSAweDAwMDQKKworI2RlZmluZSBYTF9NQVhfQURBUFRFUlMgOCAvKiAweDA4IF9fTU9EVUxFX1NUUklORyBjYW4ndCBoYW5kIDB4bm4gKi8KKworLyogM2MzNTkgZGVmYXVsdHMgZm9yIGJ1ZmZlcnMgKi8KKyAKKyNkZWZpbmUgWExfUlhfUklOR19TSVpFIDE2IC8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFhMX1RYX1JJTkdfU0laRSAxNiAvKiBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworCisjZGVmaW5lIFBLVF9CVUZfU1ogNDA5NiAvKiBEZWZhdWx0IHBhY2tldCBzaXplICovCisKKy8qIDNjMzU5IGRhdGEgc3RydWN0dXJlcyAqLworCitzdHJ1Y3QgeGxfdHhfZGVzYyB7CisJdTMyIGRubmV4dHB0ciA7IAorCXUzMiBmcmFtZXN0YXJ0aGVhZGVyIDsgCisJdTMyIGJ1ZmZlciA7CisJdTMyIGJ1ZmZlcl9sZW5ndGggOworfTsKKworc3RydWN0IHhsX3J4X2Rlc2MgeworCXUzMiB1cG5leHRwdHIgOyAKKwl1MzIgZnJhbWVzdGF0dXMgOyAKKwl1MzIgdXBmcmFnYWRkciA7IAorCXUzMiB1cGZyYWdsZW4gOyAKK307CisKK3N0cnVjdCB4bF9wcml2YXRlIHsKKwkKKworCS8qIFRoZXNlIHR3byBzdHJ1Y3R1cmVzIG11c3QgYmUgYWxpZ25lZCBvbiA4IGJ5dGUgYm91bmRhcmllcyAqLworCisJLyogc3RydWN0IHhsX3J4X2Rlc2MgeGxfcnhfcmluZ1tYTF9SWF9SSU5HX1NJWkVdOyAqLworCS8qIHN0cnVjdCB4bF90eF9kZXNjIHhsX3R4X3JpbmdbWExfVFhfUklOR19TSVpFXTsgKi8KKwlzdHJ1Y3QgeGxfcnhfZGVzYyAqeGxfcnhfcmluZyA7IAorCXN0cnVjdCB4bF90eF9kZXNjICp4bF90eF9yaW5nIDsgCisJc3RydWN0IHNrX2J1ZmYgKnR4X3Jpbmdfc2tiW1hMX1RYX1JJTkdfU0laRV0sICpyeF9yaW5nX3NrYltYTF9SWF9SSU5HX1NJWkVdOwkKKwlpbnQgdHhfcmluZ19oZWFkLCB0eF9yaW5nX3RhaWwgOyAgCisJaW50IHJ4X3JpbmdfdGFpbCwgcnhfcmluZ19ubyA7IAorCWludCBmcmVlX3JpbmdfZW50cmllcyA7IAorCisJdTE2IHNyYjsKKwl1MTYgYXJiOworCXUxNiBhc2I7CisKKwl1OCBfX2lvbWVtICp4bF9tbWlvOworCWNoYXIgKnhsX2NhcmRfbmFtZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA7IAorCQorCXNwaW5sb2NrX3QgeGxfbG9jayA7IAorCisJdm9sYXRpbGUgaW50IHNyYl9xdWV1ZWQ7ICAgIAorCXN0cnVjdCB3YWl0X3F1ZXVlICpzcmJfd2FpdDsKKwl2b2xhdGlsZSBpbnQgYXNiX3F1ZXVlZDsgICAKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHhsX3N0YXRzIDsKKworCXUxNiBtYWNfYnVmZmVyIDsgCQorCXUxNiB4bF9sYW5fc3RhdHVzIDsKKwl1OCB4bF9yaW5nX3NwZWVkIDsKKwl1MTYgcGt0X2J1Zl9zeiA7IAorCXU4IHhsX21lc3NhZ2VfbGV2ZWw7IAorCXUxNiB4bF9jb3B5X2FsbF9vcHRpb25zIDsgIAorCXVuc2lnbmVkIGNoYXIgeGxfZnVuY3Rpb25hbF9hZGRyWzRdIDsgCisJdTE2IHhsX2FkZHJfdGFibGVfYWRkciwgeGxfcGFybXNfYWRkciA7IAorCXU4IHhsX2xhYVs2XSA7IAorCXUzMiByeF9yaW5nX2RtYV9hZGRyIDsgCisJdTMyIHR4X3JpbmdfZG1hX2FkZHIgOyAKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM1NGFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5X21pY3JvY29kZS5oCkBAIC0wLDAgKzEsMTU4MSBAQAorCisvKgorICogVGhlIGZpcm13YXJlIHRoaXMgZHJpdmVyIGRvd25sb2FkcyBpbnRvIHRoZSB0b2tlbnJpbmcgY2FyZCBpcyBhCisgKiBzZXBhcmF0ZSBwcm9ncmFtIGFuZCBpcyBub3QgR1BMJ2Qgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoZSBMaW51eAorICogc2lkZSBkcml2ZXIgYW5kIHRoZSByb3V0aW5lIHRoYXQgbG9hZHMgdGhpcyBkYXRhIGludG8gdGhlIGNhcmQgYXJlLgorICoKKyAqIFRoaXMgZmlybXdhcmUgaXMgbGljZW5zZWQgdG8geW91IHN0cmljdGx5IGZvciB1c2UgaW4gY29uanVuY3Rpb24KKyAqIHdpdGggdGhlIHVzZSBvZiAzQ29tIDNDMzU5IFRva2VuUmluZyBhZGFwdGVycy4gVGhlcmUgaXMgbm8KKyAqIHdhcmFudHkgZXhwcmVzc2VkIG9yIGltcGxpZWQgYWJvdXQgaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLgorICovCisKKy8qIDNjMzU5X21pY3JvY29kZS5tYWM6IDNDb20gM0MzNTkgVG9rZW5yaW5nIG1pY3JvY29kZS4KKyAqCisgKiBOb3RlczoKKyAqICAtIExvYWRlZCBmcm9tIHhsX2luaXQgdXBvbiBhZGFwdGVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEF2YWlsYWJsZSBmcm9tIDNDb20gYXMgcGFydCBvZiB0aGVpciBzdGFuZGFyZCAzQzM1OSBkcml2ZXIuIAorICoKKyAqIG1jX3NpemUgKm11c3QqIG11c3QgbWF0Y2ggdGhlIG1pY3JvY29kZSBiZWluZyB1c2VkLCBlYWNoIHZlcnNpb24gaXMgYSAKKyAqIGRpZmZlcmVudCBsZW5ndGguCisgKi8KKworc3RhdGljIGludCBtY19zaXplID0gMjQ4ODAgOyAKKwordTggbWljcm9jb2RlW10gPSB7IAorIDB4ZmUsMHgzYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MzMsMHgyZiwweDMwLDB4MzIsMHgyZiwweDM5LDB4MzksMHgyMCwweDMxCissMHgzNywweDNhLDB4MzEsMHgzMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzYsMHgzNywweDM4LDB4MzksMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ1LDB4NDYKKywweDAwLDB4MDAsMHgwNywweGZmLDB4MDIsMHgwMCwweGZlLDB4OWYsMHgwNiwweDAwLDB4MDAsMHg3YywweDQ4LDB4MDAsMHgwMCwweDcwCissMHg4MiwweDAwLDB4ZmYsMHhmZiwweDg2LDB4MDAsMHhmZiwweGZmLDB4ODgsMHgwMCwweGZmLDB4ZmYsMHg5YSwweDAwLDB4ZmYsMHhmZgorLDB4ZmYsMHhmZiwweDExLDB4MDAsMHhjMCwweDAwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgxMSwweDIyLDB4MzMsMHg0NCwweDU1LDB4NjYKKywweDMzLDB4NDMsMHg0ZiwweDRkLDB4MjAsMHg0MiwweDQxLDB4NDIsMHg0NSwweDExLDB4NDAsMHhjMCwweDAwLDB4ZmYsMHhmZiwweGZmCissMHhmZiwweDExLDB4MjIsMHgzMywweDQ0LDB4NTUsMHg2NiwweDUzLDB4NzQsMHg2MSwweDcyLDB4NzQsMHgyMCwweDZmLDB4NjYsMHgyMAorLDB4NGMsMHg0YywweDQzLDB4MjAsMHg2NiwweDcyLDB4NjEsMHg2ZCwweDY1LDB4MmUsMHgyMCwweDIwLDB4NTQsMHg2ZiwweDc0LDB4NjEKKywweDZjLDB4MjAsMHg2NCwweDYxLDB4NzQsMHg2MSwweDIwLDB4NzMsMHg2OSwweDdhLDB4NjUsMHgyMCwweDY5LDB4NzMsMHgyMCwweDc4CissMHg3OCwweDc4LDB4MjAsMHgyMCwweDIwLDB4NDIsMHg0MSwweDQyLDB4NDUsMHhlOCwweGQyLDB4MDEsMHg4MywweDNlLDB4ZjcsMHgzNAorLDB4MDAsMHg3NSwweDIxLDB4ZTgsMHg0MSwweDAwLDB4ODMsMHgzZSwweGY3LDB4MzQsMHgwMCwweDc1LDB4MTcsMHhlOCwweDgyLDB4MDAKKywweDgzLDB4M2UsMHhmNywweDM0LDB4MDAsMHg3NSwweDBkLDB4ZTgsMHhiZiwweDAwLDB4ODMsMHgzZSwweGY3LDB4MzQsMHgwMCwweDc1CissMHgwMywweGU4LDB4NDEsMHgwMiwweGMzLDB4MWUsMHhiOCwweDAwLDB4ZjAsMHg4ZSwweGQ4LDB4MzMsMHhmNiwweGI5LDB4MDAsMHg4MAorLDB4MzMsMHhkYiwweGFkLDB4MDMsMHhkOCwweGUyLDB4ZmIsMHgxZiwweGI4LDB4MDAsMHgwMCwweDgzLDB4ZmIsMHgwMCwweDc0LDB4MDMKKywweGI4LDB4MjIsMHgwMCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4ZmEsMHhiYSwweDU2LDB4MDAsMHhiMCwweGZmLDB4ZWUsMHgzMywweGMwCissMHg4ZSwweGMwLDB4MzMsMHhmNiwweGI5LDB4ZmYsMHg3ZiwweDgzLDB4M2UsMHhmZiwweDM0LDB4MDAsMHg3NCwweDA4LDB4OGQsMHgzZQorLDB4MzAsMHg2MSwweGQxLDB4ZWYsMHgyYiwweGNmLDB4MjYsMHg4YiwweDFjLDB4MjYsMHhjNywweDA0LDB4ZmYsMHhmZiwweDI2LDB4ODMKKywweDNjLDB4ZmYsMHg3NSwweDE3LDB4MjYsMHhjNywweDA0LDB4MDAsMHgwMCwweDI2LDB4ODMsMHgzYywweDAwLDB4NzUsMHgwYywweDI2CissMHg4OSwweDFjLDB4NDYsMHg0NiwweGUyLDB4ZTAsMHhiOCwweDAwLDB4MDAsMHhlYiwweDAzLDB4YjgsMHgyNCwweDAwLDB4YTMsMHhmNworLDB4MzQsMHhjMywweGZhLDB4YjQsMHhkNywweDllLDB4NzMsMHgzYSwweDc1LDB4MzgsMHg3OSwweDM2LDB4N2IsMHgzNCwweDlmLDB4YjEKKywweDA1LDB4ZDIsMHhlYywweDczLDB4MmQsMHhiMCwweDQwLDB4ZDAsMHhlMCwweDcxLDB4MjcsMHg3OSwweDI1LDB4ZDAsMHhlMCwweDczCissMHgyMSwweDdiLDB4MWYsMHgzMiwweGMwLDB4NzUsMHgxYiwweDMyLDB4ZTQsMHg5ZSwweDcyLDB4MTYsMHg3NCwweDE0LDB4NzgsMHgxMgorLDB4N2EsMHgxMCwweDlmLDB4ZDIsMHhlYywweDcyLDB4MGIsMHhkMCwweGU0LDB4NzAsMHgwNywweDc1LDB4MDUsMHhiOCwweDAwLDB4MDAKKywweGViLDB4MDMsMHhiOCwweDI2LDB4MDAsMHhhMywweGY3LDB4MzQsMHhjMywweGZhLDB4YmEsMHg1YSwweDAwLDB4MzMsMHhjMCwweGVmCissMHhlZiwweGVmLDB4ZWYsMHhiMCwweDAwLDB4ZTYsMHg1NiwweGIwLDB4MDAsMHhlNiwweDU0LDB4YmEsMHg1MiwweDAwLDB4YjgsMHgwMQorLDB4MDEsMHhlZiwweGU4LDB4Y2EsMHgwMCwweDNjLDB4MDEsMHg3NSwweDdmLDB4ZTgsMHg4MywweDAwLDB4YmEsMHg1MiwweDAwLDB4YjgKKywweDAyLDB4MDIsMHhlZiwweGU4LDB4YjksMHgwMCwweDNjLDB4MDIsMHg3NSwweDZlLDB4ZTgsMHg3YSwweDAwLDB4YmEsMHg1MiwweDAwCissMHhiOCwweDA0LDB4MDQsMHhlZiwweGU4LDB4YTgsMHgwMCwweDNjLDB4MDQsMHg3NSwweDVkLDB4ZTgsMHg3MSwweDAwLDB4YmEsMHg1MgorLDB4MDAsMHhiOCwweDA4LDB4MDgsMHhlZiwweGU4LDB4OTcsMHgwMCwweDNjLDB4MDgsMHg3NSwweDRjLDB4ZTgsMHg2OCwweDAwLDB4YmEKKywweDUyLDB4MDAsMHhiOCwweDEwLDB4MTAsMHhlZiwweGU4LDB4ODYsMHgwMCwweDNjLDB4MTAsMHg3NSwweDNiLDB4ZTgsMHg1ZiwweDAwCissMHhiYSwweDUyLDB4MDAsMHhiOCwweDIwLDB4MjAsMHhlZiwweGU4LDB4NzUsMHgwMCwweDNjLDB4MjAsMHg3NSwweDJhLDB4ZTgsMHg1NgorLDB4MDAsMHhiYSwweDUyLDB4MDAsMHhiOCwweDQwLDB4NDAsMHhlZiwweGU4LDB4NjQsMHgwMCwweDNjLDB4NDAsMHg3NSwweDE5LDB4ZTgKKywweDRkLDB4MDAsMHhiYSwweDUyLDB4MDAsMHhiOCwweDgwLDB4ODAsMHhlZiwweGU4LDB4NTMsMHgwMCwweDNjLDB4ODAsMHg3NSwweDA4CissMHhlOCwweDQ0LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhlYiwweDAzLDB4YjgsMHgyOCwweDAwLDB4YTMsMHhmNywweDM0LDB4YzMsMHhiYQorLDB4NWEsMHgwMCwweGI4LDB4MDAsMHg4MCwweGVmLDB4YzMsMHhiYSwweDVhLDB4MDAsMHhiOCwweDAxLDB4ODAsMHhlZiwweGMzLDB4YmEKKywweDVhLDB4MDAsMHhiOCwweDAyLDB4ODAsMHhlZiwweGMzLDB4YmEsMHg1YSwweDAwLDB4YjgsMHgwMywweDgwLDB4ZWYsMHhjMywweGJhCissMHg1YSwweDAwLDB4YjgsMHgwNCwweDgwLDB4ZWYsMHhjMywweGJhLDB4NWEsMHgwMCwweGI4LDB4MDUsMHg4MCwweGVmLDB4YzMsMHhiYQorLDB4NWEsMHgwMCwweGI4LDB4MDYsMHg4MCwweGVmLDB4YzMsMHhiYSwweDVhLDB4MDAsMHhiOCwweDA3LDB4ODAsMHhlZiwweGMzLDB4YjkKKywweGZmLDB4ZmYsMHhlNCwweDU4LDB4ZTQsMHg1NCwweDNjLDB4MDAsMHg3NSwweDAzLDB4NDksMHg3NSwweGY3LDB4YzMsMHhmYSwweDMyCissMHhjMCwweGU2LDB4NTYsMHhlNCwweDU2LDB4M2MsMHgwMCwweDc0LDB4MDMsMHhlOSwweDgyLDB4MDAsMHhiMCwweGZmLDB4ZTYsMHg1NgorLDB4ZTQsMHg1NiwweDNjLDB4ZmYsMHg3NSwweDc4LDB4YmEsMHg1MiwweDAwLDB4YjgsMHhmZiwweGZmLDB4ZWYsMHhlZCwweDNjLDB4ZmYKKywweDc1LDB4NmMsMHhiOCwweDAwLDB4ZmYsMHhlZiwweGVkLDB4M2MsMHgwMCwweDc1LDB4NjMsMHhiMCwweGZmLDB4ZTYsMHg1NCwweGU0CissMHg1NCwweDNjLDB4ZmYsMHg3NSwweDU5LDB4MzIsMHhjMCwweGU2LDB4NTQsMHhlNCwweDU0LDB4M2MsMHgwMCwweDc1LDB4NGYsMHhiMAorLDB4MGYsMHhlNiwweDUwLDB4ZTQsMHg1MCwweDI0LDB4MGYsMHgzYywweDBmLDB4NzUsMHg0MywweGIwLDB4MDAsMHhlNiwweDUwLDB4ZTQKKywweDUwLDB4MjQsMHgwZiwweDNjLDB4MDAsMHg3NSwweDM3LDB4OGMsMHhjOCwweDhlLDB4YzAsMHhiZSwweDcwLDB4MDAsMHgyNiwweDhiCissMHgxNCwweDI2LDB4OGIsMHg1YywweDAyLDB4YjgsMHgwMCwweDAwLDB4ZWYsMHhlZCwweDIzLDB4YzMsMHgzZCwweDAwLDB4MDAsMHg3NQorLDB4MWQsMHhiOCwweGZmLDB4ZmYsMHgyMywweGMzLDB4ZWYsMHg4YiwweGM4LDB4ZWQsMHgyMywweGMzLDB4M2IsMHhjMSwweDc1LDB4MGUKKywweDgzLDB4YzYsMHgwNCwweDI2LDB4ODMsMHgzYywweGZmLDB4NzUsMHhkNSwweGI4LDB4MDAsMHgwMCwweGViLDB4MDMsMHhiOCwweDJhCissMHgwMCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4ZmEsMHgzMywweGMwLDB4YmYsMHgwMCwweDIwLDB4YjksMHgxNywweDAwLDB4ZjMsMHhhYgorLDB4YmYsMHgwMCwweDMwLDB4YjksMHgxNywweDAwLDB4ZjMsMHhhYiwweGJmLDB4MDAsMHgyMiwweGI5LDB4NDAsMHgwMCwweGYzLDB4YWIKKywweGJmLDB4MDAsMHgzMiwweGI5LDB4NDAsMHgwMCwweGYzLDB4YWIsMHhmYywweDFlLDB4OGMsMHhjOCwweDhlLDB4ZDgsMHgzMywweGMwCissMHg4ZSwweGMwLDB4YmUsMHg5MiwweDAwLDB4YmYsMHgwMCwweDIwLDB4YjksMHgxNywweDAwLDB4ZjMsMHhhNCwweGJlLDB4YTksMHgwMAorLDB4YmYsMHgwMCwweDIyLDB4YjksMHg0MCwweDAwLDB4ZjMsMHhhNCwweDFmLDB4YzcsMHgwNiwweGZiLDB4MzQsMHg2NCwweDAwLDB4YmEKKywweDA4LDB4MDAsMHhiOCwweDBmLDB4MDAsMHhlZiwweGU4LDB4ODIsMHgwMSwweGU4LDB4OWIsMHgwMSwweDcyLDB4MGQsMHhjNywweDA2CissMHhmNywweDM0LDB4MmMsMHgwMCwweGM3LDB4MDYsMHhmOSwweDM0LDB4MDQsMHgwMCwweGMzLDB4YmEsMHgwYSwweDAwLDB4MzMsMHhjMAorLDB4ZWYsMHhlOCwweDk4LDB4MDEsMHhlOCwweGI1LDB4MDEsMHhiOCwweDE3LDB4MDAsMHhiYSwweDljLDB4MDAsMHhlZiwweGI4LDB4MDAKKywweDEwLDB4YmEsMHg5YSwweDAwLDB4ZWYsMHhiOCwweDE3LDB4MDAsMHhhOSwweDAxLDB4MDAsMHg3NCwweDAxLDB4NDAsMHhiYSwweDhjCissMHgwMCwweGVmLDB4YjgsMHgwMCwweDE4LDB4YmEsMHg4NiwweDAwLDB4ZWYsMHhiOCwweDBjLDB4MDAsMHhiYSwweDgyLDB4MDAsMHhlZgorLDB4YmEsMHgwMiwweDAwLDB4ZWQsMHgyNSwweGY5LDB4ZmYsMHgwZCwweDAyLDB4MDAsMHhlZiwweGJhLDB4MDYsMHgwMCwweDMzLDB4YzAKKywweGVmLDB4YmEsMHgwNCwweDAwLDB4YjgsMHg2MCwweDAwLDB4ZWYsMHhiYSwweDAwLDB4MDAsMHhiOCwweDE4LDB4MDAsMHhlZiwweGJhCissMHg4MCwweDAwLDB4YjksMHhmZiwweGZmLDB4ZWQsMHhhOSwweDAxLDB4MDAsMHg3NSwweDA0LDB4ZTIsMHhmOCwweGViLDB4M2UsMHhiYQorLDB4MGEsMHgwMCwweGVkLDB4YTksMHgwMCwweDQwLDB4NzQsMHgzNSwweGE5LDB4MDAsMHgyMCwweDc0LDB4MzAsMHgzMywweGMwLDB4ZWYKKywweDUxLDB4YjksMHhjOCwweDAwLDB4ZTIsMHhmZSwweDU5LDB4MWUsMHgwNiwweDFmLDB4MjYsMHg4YiwweDBlLDB4MDIsMHgzMCwweDgzCissMHhmOSwweDE3LDB4NzUsMHgxOCwweDQ5LDB4NDksMHhiZSwweDAyLDB4MjAsMHhiZiwweDA2LDB4MzAsMHhmMywweGE2LDB4MWYsMHgyMworLDB4YzksMHg3NSwweDBhLDB4ZmYsMHgwZSwweGZiLDB4MzQsMHg3NCwweDEyLDB4ZTksMHg0ZCwweGZmLDB4MWYsMHhiOCwweDJjLDB4MDAKKywweGJiLDB4MDAsMHgwMCwweGEzLDB4ZjcsMHgzNCwweDg5LDB4MWUsMHhmOSwweDM0LDB4YzMsMHhjNywweDA2LDB4ZmIsMHgzNCwweDY0CissMHgwMCwweGU4LDB4ZDMsMHgwMCwweDcyLDB4MGQsMHhjNywweDA2LDB4ZjcsMHgzNCwweDJjLDB4MDAsMHhjNywweDA2LDB4ZjksMHgzNAorLDB4MDQsMHgwMCwweGMzLDB4ZTgsMHhkNiwweDAwLDB4ZTgsMHhmMywweDAwLDB4YjgsMHgwMywweDAwLDB4YmEsMHg4MiwweDAwLDB4ZWYKKywweGI4LDB4NDAsMHg4MCwweGJhLDB4OTgsMHgwMCwweGVmLDB4YjgsMHgwMCwweDExLDB4YmEsMHg5NiwweDAwLDB4ZWYsMHhiOCwweDQwCissMHgwMCwweGE5LDB4MDEsMHgwMCwweDc0LDB4MDEsMHg0MCwweGJhLDB4OTIsMHgwMCwweGVmLDB4YjgsMHgwMCwweDE5LDB4YmEsMHg4ZQorLDB4MDAsMHhlZiwweGJhLDB4MDIsMHgwMCwweGVkLDB4MjUsMHhmOSwweGZmLDB4MGQsMHgwNiwweDAwLDB4ZWYsMHhiYSwweDA2LDB4MDAKKywweDMzLDB4YzAsMHhlZiwweGJhLDB4MDAsMHgwMCwweGI4LDB4MTgsMHgwMCwweGVmLDB4YmEsMHg4MCwweDAwLDB4YjksMHhmZiwweGZmCissMHhlZCwweGE5LDB4MjAsMHgwMCwweDc1LDB4MDQsMHhlMiwweGY4LDB4ZWIsMHg0MywweGJhLDB4MGEsMHgwMCwweGVkLDB4YTksMHgwMAorLDB4NDAsMHg3NCwweDNhLDB4YTksMHgwMCwweDIwLDB4NzQsMHgzNSwweDMzLDB4YzAsMHhlZiwweDUxLDB4YjksMHhjOCwweDAwLDB4ZTIKKywweGZlLDB4NTksMHgxZSwweDA2LDB4MWYsMHgyNiwweDhiLDB4MGUsMHgwMiwweDMyLDB4ODMsMHhmOSwweDQwLDB4NzUsMHgxZCwweDQ5CissMHg0OSwweGJlLDB4MDIsMHgyMiwweGJmLDB4MDYsMHgzMiwweGYzLDB4YTYsMHgxZiwweDIzLDB4YzksMHg3NSwweDBmLDB4ZmYsMHgwZQorLDB4ZmIsMHgzNCwweDc0LDB4MDMsMHhlOSwweDVhLDB4ZmYsMHhiOCwweDAwLDB4MDAsMHhlYiwweDBiLDB4MWYsMHhiOCwweDJjLDB4MDAKKywweGJiLDB4MDIsMHgwMCwweDg5LDB4MWUsMHhmOSwweDM0LDB4YTMsMHhmNywweDM0LDB4YzMsMHhiYSwweDAyLDB4MDAsMHhiOCwweDAwCissMHg5YywweGVmLDB4YmEsMHgwMCwweDAwLDB4YjgsMHgwMCwweDg0LDB4ZWYsMHgzMywweGMwLDB4ZWYsMHhiYSwweDBhLDB4MDAsMHhlZgorLDB4YmEsMHgwZSwweDAwLDB4MzMsMHhjMCwweGVmLDB4YzMsMHhiYSwweDBhLDB4MDAsMHhiOSwweGZmLDB4ZmYsMHhlZCwweDI1LDB4MDAKKywweDYwLDB4M2QsMHgwMCwweDYwLDB4NzQsMHgwNCwweGUyLDB4ZjUsMHhmOCwweGMzLDB4ZjksMHhjMywweGIwLDB4MDAsMHhlNiwweDU2CissMHhiOCwweDAwLDB4ZmYsMHhiYSwweDUyLDB4MDAsMHhlZiwweGI5LDB4ZmYsMHhmZiwweGJhLDB4NTgsMHgwMCwweGVkLDB4MjUsMHhlZgorLDB4MDAsMHg3NCwweDA4LDB4YmEsMHg1YSwweDAwLDB4MzMsMHhjMCwweGVmLDB4ZTIsMHhlZiwweGMzLDB4YmEsMHg4MCwweDAwLDB4ZWQKKywweGJhLDB4ODQsMHgwMCwweGVmLDB4YmEsMHg4MCwweDAwLDB4ZWQsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhjNiwweDA2LDB4ZWMsMHgzNCwweDE1LDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4ZSwweGMwLDB4MWUsMHg4YywweGM4LDB4YmUsMHg0MAorLDB4NTQsMHhiZiwweDYwLDB4ZmUsMHg4ZSwweGQ4LDB4YjksMHgxMCwweDAwLDB4ZjMsMHhhNCwweDFmLDB4YzcsMHgwNiwweDgwLDB4MzYKKywweDEwLDB4MzUsMHhjNywweDA2LDB4OGMsMHgzNiwweDMwLDB4MzUsMHg4ZCwweDA2LDB4MzgsMHgzNSwweGEzLDB4MzAsMHgzNSwweGEzCissMHgzMiwweDM1LDB4MDUsMHgzMywweDAxLDB4YTMsMHgzNCwweDM1LDB4YzcsMHgwNiwweDM2LDB4MzUsMHg1MCwweDAxLDB4YzcsMHgwNgorLDB4ODQsMHgzNiwweDgwLDB4ZmUsMHhjNywweDA2LDB4ODgsMHgzNiwweGMwLDB4ZmUsMHhjNiwweDA2LDB4YzIsMHhmZSwweGZmLDB4YzYKKywweDA2LDB4OTMsMHgzNiwweDgwLDB4YzYsMHgwNiwweDkyLDB4MzYsMHgwMCwweGM2LDB4MDYsMHg4MCwweGZlLDB4ODAsMHhjNywweDA2CissMHg4MiwweGZlLDB4NTQsMHg1MCwweGM3LDB4MDYsMHg4NCwweGZlLDB4MmIsMHg0ZCwweGU1LDB4Y2UsMHhhOSwweDAyLDB4MDAsMHg3NQorLDB4MDgsMHhjNiwweDA2LDB4ODEsMHhmZSwweDIzLDB4ZTksMHgwNSwweDAwLDB4YzYsMHgwNiwweDgxLDB4ZmUsMHgyMiwweGExLDB4ZjcKKywweDM0LDB4YTMsMHg4NiwweGZlLDB4YjgsMHg0OCwweDM0LDB4ODYsMHhlMCwweGEzLDB4ODgsMHhmZSwweDhkLDB4MDYsMHg0ZSwweDM0CissMHg4NiwweGUwLDB4YTMsMHg4YSwweGZlLDB4YjgsMHg1OCwweDM0LDB4ODYsMHhlMCwweGEzLDB4OGMsMHhmZSwweGI4LDB4OWMsMHgzNAorLDB4ODYsMHhlMCwweGEzLDB4OGUsMHhmZSwweDhkLDB4MDYsMHgyMCwweDAzLDB4ODYsMHhlMCwweGEzLDB4OTAsMHhmZSwweDMzLDB4YzAKKywweGJhLDB4NzIsMHgwMCwweGVmLDB4MzMsMHhjMCwweGJhLDB4NzQsMHgwMCwweGVmLDB4YmEsMHg3NiwweDAwLDB4ZWYsMHhiOCwweDgwCissMHhmZSwweDg2LDB4ZTAsMHhiYSwweDcyLDB4MDAsMHhlZiwweGU4LDB4YmYsMHgwNywweGJhLDB4MGMsMHgwMSwweGI4LDB4NDAsMHg0MAorLDB4ZWYsMHhlZCwweGJhLDB4NmEsMHgwMCwweGI4LDB4MDMsMHgwMCwweGMxLDB4ZTAsMHgwOCwweDBkLDB4MDMsMHgwMCwweGVmLDB4YjkKKywweDBhLDB4MDAsMHhlOCwweDk0LDB4MDAsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzLDB4MDAsMHhjMSwweGUwLDB4MDgsMHhlZiwweGExCissMHgzMiwweDM0LDB4YTMsMHhhMiwweDMzLDB4YzcsMHgwNiwweGE2LDB4MzMsMHgwNCwweDAwLDB4OGQsMHgwNiwweGEwLDB4MzMsMHhjMQorLDB4ZTgsMHgwNCwweGNkLDB4MzksMHhjNywweDA2LDB4OTAsMHgzNiwweGZmLDB4ZmYsMHhlOSwweGUzLDB4MDAsMHg2MywweDBkLDB4NjYKKywweDBkLDB4NjYsMHgwZCwweDhhLDB4MGQsMHhlNiwweDBlLDB4NzUsMHgxMiwweDJlLDB4MGYsMHgwMywweDBmLDB4NTAsMHgwZiwweDYwCissMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4ZWQsMHgwZiwweGU5LDB4MTIsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MAorLDB4MGQsMHg2MCwweDBkLDB4MjIsMHgxMCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHhmZSwweDEwLDB4NjAKKywweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHhhZiwweDBmLDB4MzIsMHgxMCwweDM3CissMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MAorLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAKKywweDBkLDB4NjQsMHgwZSwweDAwLDB4MGYsMHg5NSwweDA5LDB4NjAsMHgwYSwweDQ5LDB4YmIsMHhmZiwweGZmLDB4YmEsMHg2YSwweDAwCissMHhlZCwweGE5LDB4MDAsMHgyMCwweDc0LDB4MzgsMHg4MCwweDNlLDB4ODAsMHhmZSwweDEyLDB4NzUsMHgzMSwweGU4LDB4NGEsMHgwMAorLDB4YTEsMHgzMiwweDM0LDB4YTMsMHhhMiwweDMzLDB4YzcsMHgwNiwweGE2LDB4MzMsMHgwNCwweDAwLDB4OGQsMHgwNiwweGEwLDB4MzMKKywweGMxLDB4ZTgsMHgwNCwweGNkLDB4MzksMHhlOCwweDIyLDB4MDAsMHhjNywweDA2LDB4ZjMsMHgzNCwweDQ2LDB4MDAsMHhjNywweDA2CissMHhmNSwweDM0LDB4ZmYsMHhmZiwweGM3LDB4MDYsMHg5MCwweDM2LDB4ZmYsMHhmZiwweDU4LDB4ZTksMHgzMiwweDAwLDB4NGIsMHg4MworLDB4ZmIsMHgwMCwweDc1LDB4YjksMHg4MywweGY5LDB4MDAsMHg3NSwweGIwLDB4YzMsMHg1MiwweGJhLDB4NmEsMHgwMCwweGI4LDB4MDMKKywweDAwLDB4YzEsMHhlMCwweDA4LDB4MGQsMHgwMywweDAwLDB4ZWYsMHg1YSwweGMzLDB4NTIsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzCissMHgwMCwweGMxLDB4ZTAsMHgwOCwweGVmLDB4NWEsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4NjgsMHg4MCwweDA3LDB4YTEsMHg5MCwweDM2LDB4Y2QsMHgzNSwweDhiLDB4MzYsMHgyNCwweDAyLDB4MmUsMHhmZiwweGE0LDB4MzUKKywweDBhLDB4ZmEsMHg4YSwweDI2LDB4OTQsMHgzNiwweDg4LDB4MjYsMHhlOCwweDM0LDB4YzYsMHgwNiwweDk0LDB4MzYsMHgwMCwweGZiCissMHgyMiwweGU0LDB4NzUsMHgwMSwweGMzLDB4ZjYsMHhjNCwweDIwLDB4NzQsMHg3ZCwweGY2LDB4YzQsMHgwOCwweDc0LDB4MDUsMHg4MAorLDB4MGUsMHg5MiwweDM2LDB4MDQsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGQ3LDB4YzQsMHgxZSwweDg0LDB4MzYsMHgyNiwweDhiLDB4MzcKKywweDgxLDB4ZTYsMHhmZiwweDAwLDB4ODMsMHhmZSwweDIwLDB4NzYsMHgwNSwweGIwLDB4MDEsMHhlOSwweDI4LDB4MDAsMHg1MywweDA2CissMHhkMSwweGU2LDB4MmUsMHhmZiwweDk0LDB4OWQsMHgwNiwweDA3LDB4NWIsMHgyNiwweDg4LDB4NDcsMHgwMiwweDNjLDB4ZmYsMHg3NAorLDB4MDcsMHgzYywweGZlLDB4NzUsMHgxMSwweGU5LDB4M2IsMHgwMCwweGY2LDB4MDYsMHg5MiwweDM2LDB4MDgsMHg3NSwweDM0LDB4ZjYKKywweDA2LDB4OTIsMHgzNiwweDA0LDB4NzQsMHgyZCwweDgwLDB4MjYsMHg5MiwweDM2LDB4ZjMsMHg4MCwweDNlLDB4OTUsMHgzNiwweDAwCissMHg3NSwweDIxLDB4MjYsMHg4MCwweDNmLDB4MDUsMHg3NSwweDEzLDB4YzYsMHgwNiwweDk1LDB4MzYsMHgwMCwweDI2LDB4ODAsMHg3ZgorLDB4MDYsMHgwMCwweDc0LDB4MDcsMHgyNiwweDhiLDB4NDcsMHgwNCwweGEyLDB4OTUsMHgzNiwweGJhLDB4MGMsMHgwMSwweGI4LDB4NDAKKywweDQwLDB4ZWYsMHhlZCwweDhhLDB4MjYsMHhlOCwweDM0LDB4ZjYsMHhjNCwweDEwLDB4NzUsMHgwMywweGU5LDB4NWIsMHgwMCwweGY2CissMHhjNCwweDA0LDB4NzQsMHgwNSwweDgwLDB4MGUsMHg5MiwweDM2LDB4MDEsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGViLDB4YzQsMHgzZQorLDB4ODgsMHgzNiwweDI2LDB4OGIsMHgzNSwweDgzLDB4ZTYsMHg3ZiwweDgzLDB4ZmUsMHgxMiwweDcyLDB4MDgsMHgyNiwweGM2LDB4NDUKKywweDAyLDB4MDEsMHhlOSwweDI0LDB4MDAsMHg4MywweGM2LDB4MjAsMHhkMSwweGU2LDB4MmUsMHhmZiwweDk0LDB4OWQsMHgwNiwweGM0CissMHgzZSwweDg4LDB4MzYsMHgyNiwweDg4LDB4NDUsMHgwMiwweDNjLDB4ZmYsMHg3NSwweDBlLDB4ZjYsMHgwNiwweDkyLDB4MzYsMHgwMQorLDB4NzQsMHgxNCwweGY2LDB4MDYsMHg5MiwweDM2LDB4MDIsMHg3NSwweDBkLDB4ODAsMHgyNiwweDkyLDB4MzYsMHhmYywweGJhLDB4MGMKKywweDAxLDB4YjgsMHgyMCwweDIwLDB4ZWYsMHhlZCwweDhhLDB4MjYsMHhlOCwweDM0LDB4ZjYsMHhjNCwweDA4LDB4NzQsMHgyMiwweDgwCissMHgyNiwweGU4LDB4MzQsMHhmNywweDgwLDB4MGUsMHg5MiwweDM2LDB4MDQsMHhmNiwweDA2LDB4OTIsMHgzNiwweDA4LDB4NzQsMHgxMQorLDB4ODAsMHgyNiwweDkyLDB4MzYsMHhmMywweGJhLDB4MGMsMHgwMSwweGI4LDB4NDAsMHg0MCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgKKywweDM0LDB4ZjYsMHhjNCwweDA0LDB4NzQsMHgyMiwweDgwLDB4MjYsMHhlOCwweDM0LDB4ZmIsMHg4MCwweDBlLDB4OTIsMHgzNiwweDAxCissMHhmNiwweDA2LDB4OTIsMHgzNiwweDAyLDB4NzUsMHgxMSwweDgwLDB4MjYsMHg5MiwweDM2LDB4ZmUsMHhiYSwweDBjLDB4MDEsMHhiOAorLDB4MjAsMHgyMCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgwMSwweDc0LDB4NjcsMHg4MCwweDI2LDB4ZTgKKywweDM0LDB4ZmUsMHg4MCwweDNlLDB4ZTgsMHhmZiwweDAwLDB4NzQsMHgzOSwweDgwLDB4M2UsMHhlOCwweGZmLDB4MDQsMHg3NCwweDMyCissMHg4MCwweDNlLDB4ZTgsMHhmZiwweDAxLDB4NzUsMHgyMSwweGU1LDB4ODAsMHhhOSwweDAwLDB4MDcsMHg3NCwweDBhLDB4YmEsMHg5ZQorLDB4MDAsMHhiOCwweDAwLDB4MDIsMHhlZiwweGU5LDB4ZWYsMHhmZiwweGM2LDB4MDYsMHhlOCwweGZmLDB4MDMsMHhiYSwweDBjLDB4MDEKKywweGI4LDB4MDgsMHgwOCwweGVmLDB4ZWQsMHhlOSwweDI4LDB4MDAsMHg4MCwweDNlLDB4ZTgsMHhmZiwweDAzLDB4NzQsMHgwNiwweGU5CissMHgxZSwweDAwLDB4ZTksMHgwMCwweDAwLDB4YmEsMHgxMCwweDAxLDB4YjgsMHgwMiwweDAyLDB4ZWYsMHhlZCwweGU1LDB4MDAsMHgwZAorLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDgyLDB4MGQsMHgwMiwweDAwLDB4ZTcsMHg4MiwweGM2LDB4MDYsMHhlOCwweGZmLDB4MDQKKywweDhhLDB4MjYsMHhlOCwweDM0LDB4ZjYsMHhjNCwweDAyLDB4NzQsMHgwZCwweDgwLDB4MjYsMHhlOCwweDM0LDB4ZmQsMHg4MCwweDI2CissMHg5MiwweDM2LDB4YmYsMHhlOCwweDRmLDB4MGIsMHhmYSwweGEwLDB4ZTgsMHgzNCwweDA4LDB4MDYsMHg5NCwweDM2LDB4YzYsMHgwNgorLDB4ZTgsMHgzNCwweDAwLDB4ZmIsMHhjMywweGU4LDB4ZTcsMHgwZiwweGM0LDB4MWUsMHg4NCwweDM2LDB4MmUsMHhmZiwweDE2LDB4MDEKKywweDA3LDB4MjYsMHg4OCwweDQ3LDB4MDIsMHhlOSwweDdlLDB4ZmUsMHhlOCwweDJkLDB4MTAsMHhjNCwweDFlLDB4ODQsMHgzNiwweDJlCissMHhmZiwweDE2LDB4MDMsMHgwNywweDI2LDB4ODgsMHg0NywweDAyLDB4ZTksMHg2YiwweGZlLDB4OGUsMHgwNiwweDI2LDB4MDIsMHgyZQorLDB4ZmYsMHgxNiwweDA3LDB4MDcsMHhjMywweGMzLDB4ODMsMHgzZSwweGY1LDB4MzQsMHgwMCwweDc0LDB4MGYsMHhmZiwweDBlLDB4ZjMKKywweDM0LDB4NzUsMHgwOSwweGU4LDB4YzQsMHhmZCwweGM3LDB4MDYsMHhmNSwweDM0LDB4MDAsMHgwMCwweGY2LDB4MDYsMHg5MywweDM2CissMHgyMCwweDc0LDB4MzAsMHhhMSwweGMyLDB4MzQsMHgzYiwweDA2LDB4ZTksMHgzNCwweGEzLDB4ZTksMHgzNCwweDc0LDB4MjQsMHg4MAorLDB4M2UsMHg5NSwweDM2LDB4MDAsMHg3NSwweDFkLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgyMCwweDAwLDB4NzQsMHgxMiwweGE5LDB4MjAKKywweDAwLDB4NzQsMHgwZCwweDgzLDB4MjYsMHhjMiwweDM0LDB4ZGYsMHg4MywweDI2LDB4ZTksMHgzNCwweGRmLDB4ZTksMHgwMywweDAwCissMHhlOCwweGRkLDB4MDksMHhiYSwweDA2LDB4MDEsMHhlZCwweDhiLDB4ZDAsMHg4MSwweGUyLDB4MDAsMHhjMCwweGMxLDB4ZWEsMHgwZQorLDB4MDMsMHgxNiwweDc0LDB4MzQsMHhjMSwweGUwLDB4MDIsMHgxMSwweDA2LDB4NzIsMHgzNCwweDczLDB4MDQsMHhmZiwweDA2LDB4NzQKKywweDM0LDB4YmEsMHgwMiwweDAxLDB4ZWQsMHg4YiwweGQwLDB4ODEsMHhlMiwweDAwLDB4YzAsMHhjMSwweGVhLDB4MGUsMHgwMywweDE2CissMHg3MCwweDM0LDB4YzEsMHhlMCwweDAyLDB4MTEsMHgwNiwweDZlLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDcwLDB4MzQsMHhjNworLDB4MDYsMHhhNiwweDMzLDB4MDQsMHgwMCwweGM3LDB4MDYsMHhhYSwweDMzLDB4MDAsMHgwMCwweDhkLDB4MDYsMHhhMCwweDMzLDB4YzEKKywweGU4LDB4MDQsMHhjZCwweDM5LDB4YzMsMHg5NSwweDA5LDB4OTUsMHgwOSwweDY1LDB4MDksMHg3OCwweDA5LDB4OTUsMHgwOSwweDk1CissMHgwOSwweDkxLDB4MDcsMHg5NSwweDA5LDB4OTYsMHgwOSwweDhiLDB4MDksMHg5NSwweDA5LDB4OTUsMHgwOSwweDk1LDB4MDksMHg5NQorLDB4MDksMHg5NSwweDA5LDB4OTUsMHgwOSwweDhiLDB4YzAsMHg4YiwweGMwLDB4OGIsMHhjMCwweDhiLDB4YzAsMHg4YiwweGMwLDB4OTAKKywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4ZTksMHhjYywweDAwLDB4OGMsMHhjMCwweDQwLDB4OGUsMHhjMCwweDI2CissMHg4YiwweDBlLDB4MDYsMHgwMCwweDg2LDB4ZTksMHgyNiwweDg5LDB4MGUsMHgwNiwweDAwLDB4OGMsMHhjMiwweGMxLDB4ZTIsMHgwNAorLDB4YmUsMHgwZSwweDAwLDB4MjYsMHhhMSwweDA0LDB4MDAsMHhkMCwweGUwLDB4MjQsMHhjMCwweDhhLDB4ZTAsMHhjMCwweGVjLDB4MDQKKywweDBhLDB4YzQsMHgyNiwweGEyLDB4MDUsMHgwMCwweDI2LDB4YTEsMHgwOCwweDAwLDB4YTksMHgwMCwweGMwLDB4NzQsMHgwMywweGU5CissMHg5ZSwweDAwLDB4MjYsMHhmNiwweDA2LDB4MTAsMHgwMCwweDgwLDB4NzUsMHgwMywweGU5LDB4MGEsMHgwMCwweDI2LDB4YTAsMHgxNgorLDB4MDAsMHgyNCwweDFmLDB4MzIsMHhlNCwweDAzLDB4ZjAsMHg4MCwweDNlLDB4ZWMsMHgzNCwweDA2LDB4NzIsMHg1YywweDgwLDB4M2UKKywweDk1LDB4MzYsMHgwMCwweDc1LDB4NjYsMHg4YiwweGZhLDB4MzMsMHhkYiwweDhlLDB4YzMsMHgyNiwweDg5LDB4MWQsMHgyNiwweDg4CissMHg1ZCwweDA0LDB4NTEsMHg1MCwweGM0LDB4MWUsMHg4YywweDM2LDB4YjksMHgwZiwweDAwLDB4MzMsMHhjMCwweGU4LDB4MjEsMHgwOQorLDB4NTgsMHg1OSwweDBiLDB4ZGIsMHg3NCwweDM0LDB4ZmUsMHgwZSwweGU2LDB4M2EsMHgyNiwweGM2LDB4MDcsMHg4MSwweDI2LDB4YzYKKywweDQ3LDB4MDEsMHgwMCwweDI2LDB4YzYsMHg0NywweDAyLDB4ZmYsMHgyNiwweGM3LDB4NDcsMHgwNCwweDAwLDB4MDAsMHgyNiwweDg5CissMHg0ZiwweDBhLDB4ODYsMHhmMiwweDI2LDB4ODksMHg1NywweDA2LDB4MjYsMHg4OSwweDc3LDB4MDgsMHgyNiwweGM2LDB4NDcsMHgwOQorLDB4MDAsMHgyNiwweGM2LDB4NDcsMHgwYywweDAyLDB4ZTgsMHg4YywweDA5LDB4YzMsMHhmZiwweDA2LDB4ZWMsMHgzMywweDhjLDB4YzAKKywweDQ4LDB4OGUsMHhjMCwweGZhLDB4ZTgsMHg5NywweDEwLDB4ZmIsMHhlOSwweGViLDB4ZmYsMHg4YywweGMwLDB4NDgsMHg4ZSwweGMwCissMHhmYSwweGU4LDB4OGEsMHgxMCwweGZiLDB4YzMsMHg4YywweGMwLDB4OGUsMHhjMCwweGZhLDB4ZTgsMHg4MCwweDEwLDB4ZmIsMHhjMworLDB4ODAsMHgzZSwweDk1LDB4MzYsMHgwMCwweDc1LDB4MDMsMHhlOSwweGMyLDB4MDAsMHhiZiwweDA4LDB4MDAsMHgyNiwweGY2LDB4MDYKKywweDEwLDB4MDAsMHg4MCwweDc1LDB4MDUsMHgwMywweGZlLDB4ZTksMHgwYywweDAwLDB4MjYsMHhhMCwweDE2LDB4MDAsMHgyNCwweDFmCissMHgzMiwweGU0LDB4MDMsMHhmMCwweDAzLDB4ZmUsMHhhMCwweDk1LDB4MzYsMHgzYywweDAwLDB4NzUsMHgwMywweGU5LDB4OWMsMHgwMAorLDB4M2MsMHgwMSwweDc0LDB4MGIsMHgzYywweDAyLDB4NzQsMHgxNCwweDNjLDB4MDMsMHg3NCwweDFkLDB4ZTksMHg4ZCwweDAwLDB4YzYKKywweDA2LDB4OTYsMHgzNiwweDAxLDB4ZTgsMHgzYywweDAxLDB4NzIsMHgyNywweGU5LDB4ODAsMHgwMCwweGM2LDB4MDYsMHg5NiwweDM2CissMHgwMiwweGU4LDB4ODMsMHgwMCwweDcyLDB4MWEsMHhlOSwweDczLDB4MDAsMHhjNiwweDA2LDB4OTYsMHgzNiwweDAxLDB4ZTgsMHgyMgorLDB4MDEsMHg3MiwweDBkLDB4YzYsMHgwNiwweDk2LDB4MzYsMHgwMiwweGU4LDB4NmMsMHgwMCwweDcyLDB4MDMsMHhlOSwweDVjLDB4MDAKKywweDUzLDB4MDYsMHg1MCwweGM0LDB4MWUsMHg4YywweDM2LDB4YjksMHgwYiwweDAwLDB4MzMsMHhjMCwweGU4LDB4NDIsMHgwOCwweDU4CissMHgyNiwweGM2LDB4MDcsMHg4MiwweDI2LDB4YzYsMHg0NywweDAyLDB4ZmYsMHg4ZCwweDA2LDB4ZTAsMHhmZSwweDg2LDB4YzQsMHgyNgorLDB4ODksMHg0NywweDA2LDB4YTAsMHg5NiwweDM2LDB4MjYsMHg4OCwweDQ3LDB4MDgsMHhlOCwweGM4LDB4MDgsMHgwNywweDViLDB4ODMKKywweDI2LDB4YWQsMHgzNiwweGZlLDB4YTEsMHhhZCwweDM2LDB4ZTcsMHgwNCwweGJhLDB4MTAsMHgwMSwweGI4LDB4ODAsMHg4MCwweGVmCissMHhlZCwweGJhLDB4MTAsMHgwMSwweGI4LDB4MDIsMHgwMiwweGVmLDB4ZWQsMHg1MiwweGJhLDB4ZTAsMHgwMCwweGI4LDB4NDEsMHgxMAorLDB4ZWYsMHg1YSwweGI4LDB4OWMsMHgwMywweGNkLDB4MzksMHhjNiwweDA2LDB4OTUsMHgzNiwweDAwLDB4OGMsMHhjMCwweDQ4LDB4OGUKKywweGMwLDB4ZmEsMHhlOCwweGE5LDB4MGYsMHhmYiwweGMzLDB4MWUsMHgwNiwweDFmLDB4MDYsMHgzMywweGMwLDB4OGUsMHhjMCwweDhiCissMHhmMCwweDhkLDB4M2UsMHgyMCwweGYzLDB4NTEsMHhiMSwweDBhLDB4MjYsMHg4MywweDdkLDB4MGMsMHgwMSwweDc1LDB4MmEsMHg1NworLDB4MjYsMHg4MywweDdkLDB4MGUsMHgwMCwweDc0LDB4MDYsMHhlOCwweDJmLDB4MDAsMHhlOSwweDAzLDB4MDAsMHhlOCwweDY2LDB4MDcKKywweDVmLDB4NzMsMHgxNiwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4MjYsMHg4YiwweDRkLDB4MTIsMHg4ZCwweDc1LDB4MjAsMHg4ZCwweDNlCissMHhlMCwweGZlLDB4ZjMsMHhhNCwweDU5LDB4MDcsMHgxZiwweGY5LDB4YzMsMHhmZSwweGM5LDB4NzQsMHgwNywweDgxLDB4YzcsMHgyMAorLDB4MDEsMHhlOSwweGM0LDB4ZmYsMHg1OSwweDA3LDB4MWYsMHhmOCwweGMzLDB4NTEsMHg1MCwweDUzLDB4NTYsMHg1MiwweDU3LDB4MzMKKywweGRiLDB4MjYsMHg4YSwweDVkLDB4MGUsMHgyNiwweDhiLDB4NGQsMHgxMiwweDhkLDB4N2QsMHgyMCwweDVhLDB4ODcsMHhkNywweDI2CissMHg4YSwweDQ1LDB4MTQsMHg4NywweGQ3LDB4NDIsMHgzMiwweGZmLDB4ODAsMHhmZiwweDA4LDB4NzUsMHgwOCwweGZlLDB4Y2IsMHgyMgorLDB4ZGIsMHg3NSwweGVhLDB4MzMsMHhkYiwweDIzLDB4ZGIsMHg3NCwweDA2LDB4ZmUsMHhjNywweGQwLDB4YzgsMHg3MywweDBjLDB4NTAKKywweDI2LDB4OGEsMHgwNSwweDM4LDB4MDQsMHg1OCwweDc0LDB4MDMsMHhlOSwweDBhLDB4MDAsMHg0OSwweDQ2LDB4NDcsMHgyMywweGM5CissMHg3NCwweDBhLDB4ZTksMHhkMywweGZmLDB4NWEsMHg1ZSwweDViLDB4NTgsMHg1OSwweGY4LDB4YzMsMHg1YSwweDVlLDB4NWIsMHg1OAorLDB4NTksMHhmOSwweGMzLDB4MWUsMHgwNiwweDFmLDB4MDYsMHgzMywweGMwLDB4OGUsMHhjMCwweDg2LDB4Y2QsMHgyYiwweGNlLDB4OGIKKywweGY3LDB4OGIsMHhjMSwweDMzLDB4YzksMHg4MCwweDNjLDB4ZmYsMHg3NCwweDE2LDB4ODAsMHhmOSwweDA2LDB4NzMsMHgwOSwweDMyCissMHhjOSwweDQ2LDB4NDgsMHg3NCwweDJlLDB4ZTksMHhlZCwweGZmLDB4M2QsMHg2MCwweDAwLDB4NzMsMHgwYywweGU5LDB4MjMsMHgwMAorLDB4ZmUsMHhjMSwweDQ2LDB4NDgsMHg3NCwweDFkLDB4ZTksMHhkYywweGZmLDB4YjgsMHgxMCwweDAwLDB4OGQsMHgzZSwweDE4LDB4MzQKKywweDMyLDB4ZWQsMHhiMSwweDA2LDB4ZjMsMHhhNiwweDc0LDB4MDMsMHhlOSwweDA4LDB4MDAsMHg0OCwweDIzLDB4YzAsMHg3NCwweDA3CissMHhlOSwweGU5LDB4ZmYsMHgwNywweDFmLDB4ZjgsMHhjMywweDhkLDB4MzYsMHgxOCwweDM0LDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4ZAorLDB4M2UsMHhlMCwweGZlLDB4YjgsMHgxMCwweDAwLDB4YjksMHgwNiwweDAwLDB4NTYsMHhmMywweGE0LDB4NWUsMHg0OCwweDNkLDB4MDAKKywweDAwLDB4NzUsMHhmMywweDA3LDB4MWYsMHhmOSwweGMzLDB4ZmYsMHgwNiwweGU0LDB4MzMsMHhjNiwweDA2LDB4ZWIsMHgzNCwweDAwCissMHgyNiwweDhiLDB4NDUsMHgwNiwweDg2LDB4ZTAsMHhjMSwweGU4LDB4MDQsMHg0OCwweDA2LDB4OGUsMHhjMCwweGZlLDB4MDYsMHhlNgorLDB4M2EsMHhmYSwweGU4LDB4NjksMHgwZSwweGZiLDB4MDcsMHhiMCwweGZmLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweGIwLDB4MDEsMHhjMywweGIwLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzCissMHg4YiwweDBlLDB4OTcsMHgzNiwweDgxLDB4ZTEsMHg4MCwweDMwLDB4MjYsMHg4YiwweDQ3LDB4MDQsMHgyNSwweDdmLDB4Y2YsMHgwYgorLDB4YzEsMHhhMywweDk3LDB4MzYsMHhhMywweGU2LDB4MzQsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzQKKywweDAzLDB4YjAsMHgwMywweGMzLDB4MjYsMHg4YiwweDQ3LDB4MDgsMHhhMywweDk3LDB4MzYsMHhhMywweGU2LDB4MzQsMHgyNiwweDhhCissMHg0NywweDIwLDB4YTIsMHhmZCwweDM0LDB4M2MsMHgwMSwweDc1LDB4MDYsMHhjNywweDA2LDB4YTEsMHgzNiwweDAwLDB4MDAsMHgyNgorLDB4OGEsMHg0NywweDIxLDB4YTIsMHhmZSwweDM0LDB4MjYsMHg4YiwweDQ3LDB4MGEsMHhhMywweDE4LDB4MzQsMHhhMywweDU4LDB4MzQKKywweDI2LDB4OGIsMHg0NywweDBjLDB4YTMsMHgxYSwweDM0LDB4YTMsMHg1YSwweDM0LDB4MjYsMHg4YiwweDQ3LDB4MGUsMHhhMywweDFjCissMHgzNCwweGEzLDB4NWMsMHgzNCwweGM2LDB4MDYsMHgyYSwweDM0LDB4YzAsMHgyNiwweDhiLDB4NDcsMHgxNCwweDI1LDB4N2YsMHhmZgorLDB4MDksMHgwNiwweDJjLDB4MzQsMHgyNiwweDhiLDB4NDcsMHgxNiwweDI1LDB4ZmYsMHhmZSwweDI1LDB4ZmYsMHhmYywweDA5LDB4MDYKKywweDJlLDB4MzQsMHhjNiwweDA2LDB4MDAsMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3LDB4MTAsMHhhMywweDAyLDB4MzQsMHgyNiwweDhiCissMHg0NywweDEyLDB4YTMsMHgwNCwweDM0LDB4MDYsMHg1MywweGU4LDB4ODQsMHgwYSwweDViLDB4MDcsMHgzZCwweDAwLDB4MDAsMHg3NQorLDB4MDcsMHg4MCwweDBlLDB4OTIsMHgzNiwweDA4LDB4YjAsMHhmZSwweGMzLDB4YjksMHgwMCwweDAxLDB4YTEsMHhhYywweDMzLDB4MzMKKywweGQyLDB4ZjcsMHhmOSwweGEzLDB4YWUsMHgzMywweDkxLDB4NDksMHgzMywweGQyLDB4ZjcsMHhlOSwweDA1LDB4MDAsMHgzYiwweGEzCissMHg0NiwweDM0LDB4YmYsMHgwMCwweDNiLDB4ODksMHgzZSwweDQ0LDB4MzQsMHhiYSwweDY4LDB4MDAsMHhiOCwweGUwLDB4ZTAsMHhlZgorLDB4YTEsMHhhZSwweDMzLDB4ZTcsMHg2MiwweGExLDB4YWUsMHgzMywweGJhLDB4MDgsMHgwMSwweGVmLDB4YTEsMHg0NCwweDM0LDB4ZTcKKywweDY0LDB4YTEsMHg0NCwweDM0LDB4YmEsMHgwYSwweDAxLDB4ZWYsMHhiOCwweDAwLDB4MDEsMHgyZCwweDA0LDB4MDAsMHgwZCwweDAwCissMHgxMCwweGU3LDB4OTIsMHhjMywweDNkLDB4MDAsMHgwMCwweDc0LDB4MGEsMHgyNiwweDg5LDB4NDcsMHgwNywweGU4LDB4ODMsMHgzYQorLDB4YjAsMHgwNywweGMzLDB4YTEsMHhhZSwweDMzLDB4MjYsMHg4OSwweDQ3LDB4MmIsMHhhMSwweDQ0LDB4MzQsMHgyNiwweDg5LDB4NDcKKywweDJkLDB4YTEsMHg0NiwweDM0LDB4MjYsMHg4OSwweDQ3LDB4MmYsMHg4MCwweDBlLDB4OTMsMHgzNiwweDIwLDB4YTEsMHg4OCwweDM2CissMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3LDB4MDgsMHhhMSwweDg0LDB4MzYsMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhhMQorLDB4ODAsMHgzNiwweDg2LDB4ZTAsMHgyNiwweDg5LDB4NDcsMHgwYywweGI4LDB4NjAsMHhmZSwweDg2LDB4ZTAsMHgyNiwweDg5LDB4NDcKKywweDBlLDB4YTAsMHhhMSwweDM2LDB4MjYsMHg4OCwweDQ3LDB4MTAsMHg4YiwweDM2LDB4ODgsMHgzNiwweDI2LDB4YzYsMHg0NCwweDAyCissMHhmZiwweGU1LDB4OWUsMHhhOSwweDAwLDB4MDgsMHg3NCwweDBjLDB4YmEsMHg4NCwweDAwLDB4ZWQsMHgwZCwweDA4LDB4MDAsMHhlZgorLDB4YmEsMHg4ZSwweDAwLDB4ZWYsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4ZTcsMHgwMiwweGJhLDB4MTAsMHgwMSwweGI4LDB4MDIKKywweDAyLDB4ZWYsMHhlZCwweGIwLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwMSwweGMzCissMHg4MCwweDI2LDB4OTMsMHgzNiwweDlmLDB4ZTgsMHg4ZCwweDBhLDB4ODAsMHgwZSwweDkyLDB4MzYsMHgwOCwweGIwLDB4ZmUsMHhjMworLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHhjNiwweDA2LDB4MmEKKywweDM0LDB4YzAsMHgyNiwweDhiLDB4NDcsMHgwNiwweDI1LDB4N2YsMHhmZiwweGEzLDB4MmMsMHgzNCwweDI2LDB4OGIsMHg0NywweDA4CissMHgyNSwweGZmLDB4ZmUsMHgyNSwweGZmLDB4ZmMsMHhhMywweDJlLDB4MzQsMHhjZCwweDUyLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNgorLDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMywweGM2LDB4MDYsMHgwMCwweDM0LDB4YzAsMHgyNiwweDhiLDB4NDcKKywweDA2LDB4YTMsMHgwMiwweDM0LDB4MjYsMHg4YiwweDQ3LDB4MDgsMHhhMywweDA0LDB4MzQsMHhjZCwweDUyLDB4YjAsMHgwMCwweGMzCissMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMywweDU3LDB4OGQsMHg3ZiwweDA2LDB4NTEsMHhiOQorLDB4MDcsMHgwMCwweDMzLDB4YzAsMHhmMywweGFiLDB4NTksMHg4ZCwweDdmLDB4MDYsMHhhMSwweDdhLDB4MzQsMHgwMywweDA2LDB4MzkKKywweDM3LDB4MjYsMHg4OCwweDA1LDB4YTEsMHg5NSwweDM3LDB4MjYsMHg4OCwweDQ1LDB4MDIsMHhhMSwweDgwLDB4MzQsMHgwMywweDA2CissMHg3NiwweDM0LDB4MjYsMHg4OCwweDQ1LDB4MDcsMHhhMSwweGM2LDB4MzQsMHgyNiwweDg4LDB4NDUsMHgwOSwweGExLDB4ZDgsMHgzMworLDB4MjYsMHg4OCwweDQ1LDB4MGEsMHgzMywweGMwLDB4YTMsMHg3YSwweDM0LDB4YTMsMHgzOSwweDM3LDB4YTMsMHg5NSwweDM3LDB4YTMKKywweDgwLDB4MzQsMHhhMywweDc2LDB4MzQsMHhhMywweGM2LDB4MzQsMHhhMywweGQ4LDB4MzMsMHg1ZiwweGIwLDB4MDAsMHhjMywweGY2CissMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHgyNiwweDhiLDB4NGYsMHgwNCwweDgzLDB4ZjksMHgwNgorLDB4NzQsMHgxMiwweDgzLDB4ZjksMHgwNCwweDc0LDB4MGQsMHg4MywweGY5LDB4MDAsMHg3NCwweDA4LDB4ODMsMHhmOSwweDAyLDB4NzQKKywweDAzLDB4YjAsMHgwMSwweGMzLDB4ODksMHgwZSwweGU4LDB4M2EsMHg4MywweDI2LDB4YWIsMHgzNiwweGY5LDB4MDksMHgwZSwweGFiCissMHgzNiwweGU1LDB4MDIsMHgyNSwweGY5LDB4ZmYsMHgwYiwweGMxLDB4ZTcsMHgwMiwweGIwLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MworLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHgyNiwweDhiLDB4NGYsMHgwNCwweDgwLDB4ZjksMHhmZiwweDc0LDB4MDgKKywweDgwLDB4ZjksMHgwMCwweDc0LDB4MTAsMHhiMCwweDAxLDB4YzMsMHg4MywweDBlLDB4YWQsMHgzNiwweDAyLDB4YTEsMHhhZCwweDM2CissMHhlNywweDA0LDB4ZTksMHgwYSwweDAwLDB4ODMsMHgyNiwweGFkLDB4MzYsMHhmZCwweGExLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhiMAorLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4ZTgsMHhkNSwweDA0LDB4YjAKKywweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDgwLDB4NzUsMHgwMywweGIwLDB4MDEsMHhjMywweDI2LDB4ODMsMHg3ZiwweDA2CissMHgwNSwweDc1LDB4MDMsMHhlOSwweDlkLDB4MDAsMHgyNiwweDhiLDB4NTcsMHgwNCwweDI2LDB4OGIsMHg0NywweDA4LDB4MjYsMHg4MQorLDB4N2YsMHgwNiwweDAwLDB4ODAsMHg3NSwweDA4LDB4ZWQsMHgyNiwweDg5LDB4NDcsMHgwYSwweGU5LDB4OWQsMHgwMCwweDI2LDB4ODMKKywweDdmLDB4MDYsMHgwMSwweDc1LDB4MDQsMHhlZiwweGU5LDB4OTIsMHgwMCwweDI2LDB4ODEsMHg3ZiwweDA2LDB4MDEsMHg4MCwweDc1CissMHgwOSwweGVmLDB4ZWQsMHgyNiwweDg5LDB4NDcsMHgwYSwweGU5LDB4ODEsMHgwMCwweDI2LDB4ODMsMHg3ZiwweDA2LDB4MDIsMHg3NQorLDB4MDcsMHgyNiwweDIxLDB4NDcsMHgwNCwweGU5LDB4NzMsMHgwMCwweDI2LDB4ODEsMHg3ZiwweDA2LDB4MDIsMHg4MCwweDc1LDB4MGMKKywweDI2LDB4MjEsMHg0NywweDA0LDB4ZWQsMHgyNiwweDg5LDB4NDcsMHgwYSwweGU5LDB4NWYsMHgwMCwweDI2LDB4ODMsMHg3ZiwweDA2CissMHgwMywweDc1LDB4MDcsMHgyNiwweDA5LDB4NDcsMHgwNCwweGU5LDB4NTEsMHgwMCwweDI2LDB4ODEsMHg3ZiwweDA2LDB4MDMsMHg4MAorLDB4NzUsMHgwYywweDI2LDB4MDksMHg0NywweDA0LDB4ZWQsMHgyNiwweDg5LDB4NDcsMHgwYSwweGU5LDB4M2QsMHgwMCwweDI2LDB4ODMKKywweDdmLDB4MDYsMHgwNCwweDc1LDB4MDcsMHgyNiwweDMxLDB4NDcsMHgwNCwweGU5LDB4MmYsMHgwMCwweDI2LDB4ODEsMHg3ZiwweDA2CissMHgwNCwweDgwLDB4NzUsMHgwYywweDI2LDB4MzEsMHg0NywweDA0LDB4ZWQsMHgyNiwweDg5LDB4NDcsMHgwYSwweGU5LDB4MWIsMHgwMAorLDB4YjAsMHgwMSwweGMzLDB4ZmEsMHg1MywweDI2LDB4OGIsMHg0ZiwweDA4LDB4MGIsMHhjOSwweDc0LDB4MGMsMHg4ZCwweDFlLDB4ZTAKKywweGZlLDB4ZTgsMHg1MiwweGZmLDB4ODMsMHhjMywweDA4LDB4ZTIsMHhmOCwweDViLDB4ZmIsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2CissMHg5MywweDM2LDB4ODAsMHg3NSwweDBhLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDAxLDB4YzMsMHg4ZAorLDB4M2UsMHhlMCwweGZlLDB4ZTUsMHgwMCwweDI2LDB4ODksMHgwNSwweGU1LDB4MDIsMHgyNiwweDg5LDB4NDUsMHgwMiwweGExLDB4YWQKKywweDM2LDB4MjYsMHg4OSwweDQ1LDB4MDQsMHhlNSwweDA2LDB4MjYsMHg4OSwweDQ1LDB4MDYsMHhlNSwweDA4LDB4MjYsMHg4OSwweDQ1CissMHgwOCwweGU1LDB4MGEsMHgyNiwweDg5LDB4NDUsMHgwYSwweGU1LDB4MGUsMHgyNiwweDg5LDB4NDUsMHgwYywweGU1LDB4NDgsMHgyNgorLDB4ODksMHg0NSwweDBlLDB4ZTUsMHg0YSwweDI2LDB4ODksMHg0NSwweDEwLDB4ZTUsMHg0YywweDI2LDB4ODksMHg0NSwweDEyLDB4YTEKKywweGI3LDB4MzYsMHgyNiwweDg5LDB4NDUsMHgxNCwweGU1LDB4NTAsMHgyNiwweDg5LDB4NDUsMHgxNiwweGU1LDB4NTIsMHgyNiwweDg5CissMHg0NSwweDE4LDB4ZTUsMHg1NCwweDI2LDB4ODksMHg0NSwweDFhLDB4ZTUsMHg1NiwweDI2LDB4ODksMHg0NSwweDFjLDB4ZTUsMHg1OAorLDB4MjYsMHg4OSwweDQ1LDB4MWUsMHhlNSwweDYyLDB4MjYsMHg4OSwweDQ1LDB4MjAsMHhlNSwweDY0LDB4MjYsMHg4OSwweDQ1LDB4MjIKKywweGU1LDB4NjYsMHgyNiwweDg5LDB4NDUsMHgyNCwweGU1LDB4NjgsMHgyNiwweDg5LDB4NDUsMHgyNiwweGU1LDB4NmEsMHgyNiwweDg5CissMHg0NSwweDI4LDB4ZTUsMHg2YywweDI2LDB4ODksMHg0NSwweDJhLDB4ZTUsMHg3MCwweDI2LDB4ODksMHg0NSwweDJjLDB4ZTUsMHg3MgorLDB4MjYsMHg4OSwweDQ1LDB4MmUsMHhlNSwweDc0LDB4MjYsMHg4OSwweDQ1LDB4MzAsMHhlNSwweDc2LDB4MjYsMHg4OSwweDQ1LDB4MzIKKywweGU1LDB4N2MsMHgyNiwweDg5LDB4NDUsMHgzNCwweGU1LDB4N2UsMHgyNiwweDg5LDB4NDUsMHgzNiwweGU1LDB4ODAsMHgyNiwweDg5CissMHg0NSwweDM4LDB4ZTUsMHg4MiwweDI2LDB4ODksMHg0NSwweDNhLDB4ZTUsMHg4NiwweDI2LDB4ODksMHg0NSwweDNjLDB4ZTUsMHg4OAorLDB4MjYsMHg4OSwweDQ1LDB4M2UsMHhlNSwweDlhLDB4MjYsMHg4OSwweDQ1LDB4NDAsMHhlNSwweDllLDB4MjYsMHg4OSwweDQ1LDB4NDIKKywweGU1LDB4Y2MsMHgyNiwweDg5LDB4NDUsMHg0NCwweGU1LDB4Y2UsMHgyNiwweDg5LDB4NDUsMHg0NiwweGU1LDB4ZDAsMHgyNiwweDg5CissMHg0NSwweDQ4LDB4ZTUsMHhkMiwweDI2LDB4ODksMHg0NSwweDRhLDB4YmEsMHgwMCwweDAxLDB4ZWQsMHgxMSwweDA2LDB4NjYsMHgzNAorLDB4NzMsMHgwNCwweGZmLDB4MDYsMHg2OCwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NGMsMHhiYSwweDAyLDB4MDEsMHhlZCwweGMxLDB4ZTAKKywweDAyLDB4MTEsMHgwNiwweDZlLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDcwLDB4MzQsMHgyNiwweDg5LDB4NDUsMHg0ZSwweGJhCissMHgwNCwweDAxLDB4ZWQsMHgxMSwweDA2LDB4NmEsMHgzNCwweDczLDB4MDQsMHhmZiwweDA2LDB4NmMsMHgzNCwweDI2LDB4ODksMHg0NQorLDB4NTAsMHhiYSwweDA2LDB4MDEsMHhlZCwweGMxLDB4ZTAsMHgwMiwweDExLDB4MDYsMHg3MiwweDM0LDB4NzMsMHgwNCwweGZmLDB4MDYKKywweDc0LDB4MzQsMHgyNiwweDg5LDB4NDUsMHg1MiwweGJhLDB4MDgsMHgwMSwweGVkLDB4MjYsMHg4OSwweDQ1LDB4NTQsMHhiYSwweDBhCissMHgwMSwweGVkLDB4MjYsMHg4OSwweDQ1LDB4NTYsMHhiYSwweDBjLDB4MDEsMHhlZCwweDI2LDB4ODksMHg0NSwweDU4LDB4YmEsMHgwZQorLDB4MDEsMHhlZCwweDAxLDB4MDYsMHg3YSwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NWUsMHhiYSwweDEwLDB4MDEsMHhlZCwweDI2LDB4ODkKKywweDQ1LDB4NWMsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDgwLDB4NzQsMHgwNywweGY2LDB4MDYsMHg5MywweDM2CissMHgyMCwweDc1LDB4MDMsMHhiMCwweDAxLDB4YzMsMHgyNiwweDgwLDB4N2YsMHgwNiwweDAwLDB4NzUsMHgzMCwweDgwLDB4M2UsMHg5NQorLDB4MzYsMHgwMCwweDc0LDB4NTIsMHhjNiwweDA2LDB4OTUsMHgzNiwweDAwLDB4ODMsMHgyNiwweGFkLDB4MzYsMHhmZSwweGExLDB4YWQKKywweDM2LDB4ZTcsMHgwNCwweGJhLDB4MTAsMHgwMSwweGI4LDB4ODAsMHg4MCwweGVmLDB4ZWQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyCissMHgwMiwweGVmLDB4ZWQsMHhiYSwweGUwLDB4MDAsMHhiOCwweDAwLDB4MTAsMHhlZiwweGIwLDB4MDAsMHhjMywweDI2LDB4OGIsMHg0NworLDB4MDQsMHgzZCwweDAwLDB4MDAsMHg3NCwweDIwLDB4M2QsMHgwMywweDAwLDB4NzcsMHgxYiwweGJhLDB4MTAsMHgwMSwweGI4LDB4MDIKKywweDAwLDB4ZWYsMHhiYSwweGUwLDB4MDAsMHhiOCwweDAxLDB4MTAsMHhlZiwweDgzLDB4MGUsMHhhZCwweDM2LDB4MDEsMHhhMSwweGFkCissMHgzNiwweGU3LDB4MDQsMHhiMCwweDAwLDB4YzMsMHhiMCwweDA2LDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDgwLDB4NzUsMHgwMworLDB4YjAsMHgwMSwweGMzLDB4MjYsMHg4MywweDdmLDB4MDQsMHgwMSwweDc0LDB4MGEsMHgyNiwweDgzLDB4N2YsMHgwNCwweDAyLDB4NzQKKywweDE5LDB4YjAsMHgwNiwweGMzLDB4MjYsMHg4MywweDdmLDB4MDYsMHgwYywweDc3LDB4ZjYsMHgyNiwweDgzLDB4N2YsMHgwYSwweDYwCissMHg3NywweGVmLDB4ZTgsMHgxMCwweDAwLDB4NzIsMHgwYiwweGIwLDB4NDYsMHhjMywweGU4LDB4NGUsMHgwMCwweDcyLDB4MDMsMHhiMAorLDB4NDYsMHhjMywweGIwLDB4MDAsMHhjMywweDUxLDB4YjEsMHgwYSwweDhiLDB4M2UsMHgyMCwweGYzLDB4MjYsMHg4MywweDdkLDB4MGMKKywweDAyLDB4NzUsMHgwMywweGU5LDB4MGUsMHgwMCwweGZlLDB4YzksMHg3NCwweDA3LDB4ODEsMHhjNywweDIwLDB4MDEsMHhlOSwweGViCissMHhmZiwweDU5LDB4ZjgsMHhjMywweDU3LDB4OGQsMHg3ZCwweDBlLDB4OGQsMHg3NywweDA2LDB4YjksMHgxMiwweDAwLDB4ZjMsMHhhNAorLDB4OGQsMHg3ZCwweDIwLDB4OGQsMHgzNiwweGUwLDB4ZmUsMHgyNiwweDhiLDB4NGQsMHgxMiwweGYzLDB4YTQsMHhmZiwweDA2LDB4MDEKKywweDM1LDB4NWYsMHgyNiwweGM3LDB4NDUsMHgwYywweDAxLDB4MDAsMHg1OSwweGY5LDB4YzMsMHg1MSwweGIxLDB4MGEsMHg4ZCwweDNlCissMHgyMCwweGYzLDB4OGQsMHgzNiwweGUwLDB4ZmUsMHgyNiwweDgzLDB4N2QsMHgwYywweDAxLDB4NzUsMHgxYiwweDU3LDB4ZTgsMHgyNQorLDB4MDAsMHg1ZiwweDczLDB4MTQsMHgzMywweGMwLDB4YjksMHgyMCwweDAxLDB4ZjMsMHhhYSwweDI2LDB4YzcsMHg0NSwweDBjLDB4MDIKKywweDAwLDB4ZmYsMHgwZSwweDAxLDB4MzUsMHg1OSwweGY5LDB4YzMsMHhmZSwweGM5LDB4NzQsMHgwNywweDgxLDB4YzcsMHgyMCwweDAxCissMHhlOSwweGQzLDB4ZmYsMHg1OSwweGY4LDB4YzMsMHg1MSwweDI2LDB4OGIsMHg0ZCwweDEyLDB4OGQsMHg3ZCwweDIwLDB4ZjMsMHhhNgorLDB4NzQsMHgwMywweDU5LDB4ZjgsMHhjMywweDU5LDB4ZjksMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDgwLDB4M2UsMHhlYywweDM0LDB4MDYsMHg3MiwweDMzLDB4ZmYsMHgwNiwweGYwLDB4MzMsMHg1MCwweGM0LDB4MWUsMHg4YywweDM2CissMHhiOSwweDBmLDB4MDAsMHgzMywweGMwLDB4ZTgsMHgyOSwweDAwLDB4NTgsMHg4MSwweDI2LDB4YzIsMHgzNCwweGRmLDB4N2YsMHg4MQorLDB4MjYsMHhlOSwweDM0LDB4ZGYsMHg3ZiwweDBiLDB4ZGIsMHg3NCwweDExLDB4MjYsMHhjNiwweDA3LDB4ODQsMHgyNiwweGM2LDB4NDcKKywweDAyLDB4ZmYsMHgyNiwweDg5LDB4NDcsMHgwNiwweGU4LDB4YWMsMHgwMCwweGMzLDB4ZmYsMHgwNiwweGVhLDB4MzMsMHhlOSwweGY1CissMHhmZiwweDU3LDB4MjYsMHg4YiwweDNmLDB4MDMsMHhmOSwweDI2LDB4M2IsMHg3ZiwweDAyLDB4NzQsMHgxNiwweDI2LDB4M2IsMHg3ZgorLDB4MDQsMHg3YywweDJhLDB4M2QsMHgwMCwweDAwLDB4NzUsMHgxMywweDhkLDB4N2YsMHgwOCwweDAzLDB4ZjksMHgyNiwweDNiLDB4N2YKKywweDAyLDB4N2MsMHgxNCwweGZmLDB4MDYsMHhkZSwweDMzLDB4MzMsMHhkYiwweDVmLDB4YzMsMHgyNiwweDhiLDB4N2YsMHgwMiwweDI2CissMHg4OSwweDNmLDB4MDMsMHhmOSwweGU5LDB4MDYsMHgwMCwweDI2LDB4ODksMHgzZiwweDI2LDB4MjksMHgwZiwweDI2LDB4YzcsMHgwNQorLDB4ZmYsMHhmZiwweDI2LDB4ODcsMHgzZiwweDI2LDB4ODksMHgwZCwweDhkLDB4NWQsMHgwMiwweDUwLDB4OGIsMHhmYiwweDgzLDB4ZTkKKywweDAyLDB4MzMsMHhjMCwweGYzLDB4YWEsMHg1OCwweGZlLDB4MGUsMHhlYywweDM0LDB4NWYsMHhjMywweDhiLDB4N2MsMHgwMiwweDNiCissMHgzYywweDc0LDB4MmYsMHg4MywweDNkLDB4ZmYsMHg3NSwweDBiLDB4OGQsMHg3YywweDA4LDB4ODksMHg3YywweDAyLDB4ODMsMHgzZAorLDB4ZmYsMHg3NCwweDFlLDB4OGEsMHg0NSwweDAyLDB4M2MsMHg4MSwweDc1LDB4MGMsMHg4MCwweDNlLDB4ZWIsMHgzNCwweDAwLDB4NzQKKywweDA1LDB4MzMsMHhjMCwweGU5LDB4MGIsMHgwMCwweDhiLDB4MGQsMHgwMSwweDRjLDB4MDIsMHg4ZCwweDc1LDB4MDIsMHg4MywweGU5CissMHgwMiwweGMzLDB4ODAsMHgzZSwweGVjLDB4MzQsMHgwNiwweDcyLDB4MDUsMHgzMywweGMwLDB4ZTksMHhmMywweGZmLDB4ZmYsMHgwNgorLDB4ZWUsMHgzMywweGU5LDB4YmUsMHhmZiwweGY2LDB4MDYsMHg5MiwweDM2LDB4NDAsMHg3NCwweDAxLDB4YzMsMHg1NywweDU2LDB4NTEKKywweDUyLDB4OGIsMHgzNiwweDhjLDB4MzYsMHhlOCwweGE0LDB4ZmYsMHg3NSwweDAzLDB4ZTksMHgxYSwweDAwLDB4ZTksMHgxYywweDAwCissMHhmZSwweDA2LDB4ZWMsMHgzNCwweGM0LDB4M2UsMHg4MCwweDM2LDB4ZjMsMHhhNCwweDgwLDB4MGUsMHg5MiwweDM2LDB4NDAsMHhiYQorLDB4MGMsMHgwMSwweGI4LDB4ODAsMHg4MCwweGVmLDB4ZWQsMHg1YSwweDU5LDB4NWUsMHg1ZiwweGMzLDB4ZmYsMHgwNiwweGUwLDB4MzMKKywweDgwLDB4M2MsMHg4MSwweDc1LDB4MGMsMHhmZiwweDA2LDB4ZTIsMHgzMywweGM2LDB4MDYsMHhlYiwweDM0LDB4MDEsMHhlOSwweGNmCissMHhmZiwweDgwLDB4M2MsMHg4NCwweDc1LDB4MDcsMHhmZiwweDA2LDB4ZTYsMHgzMywweGU5LDB4YzMsMHhmZiwweGZmLDB4MDYsMHhlOAorLDB4MzMsMHhlOSwweGJjLDB4ZmYsMHg4ZCwweDNlLDB4ZTAsMHhmZSwweGExLDB4NzIsMHgzNCwweGM3LDB4MDYsMHg3MiwweDM0LDB4MDAKKywweDAwLDB4ODksMHgwNSwweGExLDB4NzQsMHgzNCwweGM3LDB4MDYsMHg3NCwweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgwMiwweGJhCissMHgwNCwweDAxLDB4ZWQsMHg4OSwweDQ1LDB4MDQsMHhjNywweDQ1LDB4MDYsMHgwMCwweDAwLDB4YTEsMHg2ZSwweDM0LDB4YzcsMHgwNgorLDB4NmUsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MDgsMHhhMSwweDcwLDB4MzQsMHhjNywweDA2LDB4NzAsMHgzNCwweDAwLDB4MDAKKywweDg5LDB4NDUsMHgwYSwweGJhLDB4MDAsMHgwMSwweGVkLDB4ODksMHg0NSwweDBjLDB4YzcsMHg0NSwweDBlLDB4MDAsMHgwMCwweDMyCissMHhlNCwweGJhLDB4MGUsMHgwMSwweGVjLDB4ODksMHg0NSwweDEwLDB4YTEsMHg3ZSwweDM0LDB4YzcsMHgwNiwweDdlLDB4MzQsMHgwMAorLDB4MDAsMHg4OSwweDQ1LDB4MTIsMHhhMSwweDhjLDB4MzQsMHhjNywweDA2LDB4OGMsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MTQKKywweGExLDB4OGEsMHgzNCwweGM3LDB4MDYsMHg4YSwweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgxNiwweGExLDB4N2MsMHgzNCwweGM3CissMHgwNiwweDdjLDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDE4LDB4YTEsMHg4OCwweDM0LDB4YzcsMHgwNiwweDg4LDB4MzQsMHgwMAorLDB4MDAsMHg4OSwweDQ1LDB4MWEsMHhhMSwweGNhLDB4MzMsMHhjNywweDA2LDB4Y2EsMHgzMywweDAwLDB4MDAsMHg4OSwweDQ1LDB4MWMKKywweGExLDB4NzgsMHgzNCwweGM3LDB4MDYsMHg3OCwweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgxZSwweGExLDB4YzYsMHgzNCwweGM3CissMHgwNiwweGM2LDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDIwLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4ZmEsMHgzMywweGMwLDB4OGUsMHhkOCwweDhlLDB4YzAsMHhiOCwweGEwLDB4MDEsMHhjMSwweGU4LDB4MDQsMHg4ZSwweGQwLDB4OGQKKywweDI2LDB4ODAsMHgwMCwweGU4LDB4MDAsMHgwMSwweGU4LDB4MTAsMHhlYiwweDhiLDB4MWUsMHhmNywweDM0LDB4OGIsMHgxNiwweGY5CissMHgzNCwweDhiLDB4MzYsMHhmZiwweDM0LDB4MzMsMHhjMCwweGI5LDB4ZWYsMHhmZiwweDhkLDB4M2UsMHgxNCwweDAwLDB4MmIsMHhjZgorLDB4MmIsMHhjZSwweGQxLDB4ZTksMHhmMywweGFiLDB4ODksMHgxZSwweGY3LDB4MzQsMHg4OSwweDE2LDB4ZjksMHgzNCwweDgzLDB4ZmUKKywweDAwLDB4NzQsMHgwYywweGI5LDB4ZWYsMHhmZiwweGJmLDB4ODAsMHhmZSwweDJiLDB4Y2YsMHhkMSwweGU5LDB4ZjMsMHhhYiwweGI5CissMHhmZiwweGZmLDB4ODEsMHhlOSwweDAwLDB4M2IsMHg4MywweGZlLDB4MDAsMHg3NCwweDAzLDB4ZTksMHgxYiwweDAwLDB4NTEsMHgxZQorLDB4YjgsMHgwMCwweGUwLDB4OGUsMHhkOCwweDMzLDB4ZjYsMHg4ZCwweDNlLDB4MDAsMHhkOCwweGI5LDB4MDAsMHgwYywweGYzLDB4YTUKKywweDFmLDB4NTksMHhiZSwweGZmLDB4ZmYsMHg4MSwweGVlLDB4MDAsMHhkOCwweDJiLDB4Y2UsMHg4MSwweGUxLDB4MDAsMHhmZiwweDg5CissMHgwZSwweGFjLDB4MzMsMHg4ZCwweDA2LDB4MjAsMHgwMiwweGMxLDB4ZTgsMHgwNCwweGEzLDB4MzIsMHgzNCwweDhlLDB4ZDAsMHgzNgorLDB4YzcsMHgwNiwweDFlLDB4MDAsMHg4MCwweDE4LDB4MzYsMHhjNywweDA2LDB4MjIsMHgwMCwweGZmLDB4N2YsMHgzNiwweGM3LDB4MDYKKywweDBhLDB4MDAsMHhmZiwweGZmLDB4MzYsMHhjNywweDA2LDB4MWMsMHgwMCwweDgwLDB4MDAsMHg4ZCwweDA2LDB4YTAsMHgwMiwweGMxCissMHhlOCwweDA0LDB4YTMsMHgzMCwweDM0LDB4OGUsMHhkMCwweDM2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHg1MCwweDI4LDB4MzYsMHhjNworLDB4MDYsMHgwYSwweDAwLDB4ZmYsMHhmZiwweDM2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHg4MCwweDAwLDB4YjgsMHhhMCwweDAxLDB4YzEKKywweGU4LDB4MDQsMHhhMywweDM0LDB4MzQsMHhhMywweGYyLDB4MzMsMHg4ZSwweGQwLDB4OGQsMHgyNiwweDgwLDB4MDAsMHhiOCwweDAwCissMHg5MCwweGU3LDB4MDIsMHg4ZCwweDNlLDB4NzAsMHgwMSwweDhiLDB4YzcsMHhjMSwweGU4LDB4MDQsMHhiOSwweDAzLDB4MDAsMHg4OQorLDB4NDUsMHgwZSwweDg5LDB4NDUsMHgwMiwweGM3LDB4MDUsMHhmZiwweGZmLDB4ODMsMHhjNywweDEwLDB4MDUsMHgwMSwweDAwLDB4ZTIKKywweGVlLDB4ZTgsMHg1YiwweDAxLDB4ZTUsMHhjZSwweGEzLDB4YjUsMHgzNiwweGU4LDB4MjEsMHgwMCwweGU4LDB4NDUsMHgwMSwweGExCissMHgzMiwweDM0LDB4OGMsMHhjYiwweGNkLDB4MzcsMHgwZSwweDU4LDB4YTksMHgwMCwweGYwLDB4NzQsMHgwNywweDMzLDB4ZjYsMHg4OQorLDB4MzYsMHhmZiwweDM0LDB4YzMsMHg4ZCwweDM2LDB4MzAsMHg2MSwweDg5LDB4MzYsMHhmZiwweDM0LDB4YzMsMHgzMywweGMwLDB4OGIKKywweGQwLDB4OGIsMHhmMiwweGI5LDB4NjgsMHgwMCwweDJlLDB4ODAsMHhiYywweGFjLDB4MTcsMHg4MCwweDc1LDB4MDEsMHhlZiwweDgzCissMHhjMiwweDAyLDB4NDYsMHhlMiwweGYxLDB4YjgsMHgwMiwweDAwLDB4ZTcsMHg1MCwweGI5LDB4NWEsMHgwMCwweDMzLDB4ZmYsMHhjNworLDB4MDUsMHg2NSwweDE4LDB4OGMsMHg0ZCwweDAyLDB4ODMsMHhjNywweDA0LDB4ZTIsMHhmNCwweDMzLDB4YzAsMHg4ZSwweGMwLDB4OGMKKywweGM4LDB4OGUsMHhkOCwweDhkLDB4M2UsMHg4MCwweDAwLDB4OGQsMHgzNiwweDljLDB4MTcsMHhiOSwweDA4LDB4MDAsMHhlOCwweDM3CissMHgwMCwweDhkLDB4MzYsMHgyMCwweDIxLDB4OGQsMHgzZSwweGMwLDB4MDAsMHhiOSwweDBkLDB4MDAsMHhlOCwweDI5LDB4MDAsMHg4ZAorLDB4M2UsMHg0MCwweDAxLDB4YjksMHgwYSwweDAwLDB4ZTgsMHgxZiwweDAwLDB4ZTgsMHg0YiwweDBlLDB4MzMsMHhjMCwweDhlLDB4ZDgKKywweGM3LDB4MDYsMHg0ZSwweDM3LDB4NmYsMHgxNywweGU3LDB4NDgsMHhlNywweDRjLDB4YjgsMHg0MCwweDljLDB4ZTcsMHg0YSwweGU1CissMHg0OCwweDkwLDB4YjgsMHgwMCwweDcwLDB4ZTcsMHg0OCwweGMzLDB4YTUsMHg4MywweGM3LDB4MDIsMHhlMiwweGZhLDB4YzMsMHhlNQorLDB4NGMsMHhjMywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNSwweDU4LDB4ZDEKKywweGUwLDB4NzMsMHgxMSwweDhiLDB4ZjAsMHhkMSwweGU2LDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4YiwweGI0LDB4ODAsMHgwMCwweDgzCissMHhjNiwweDBiLDB4ZmYsMHhlNiwweDFmLDB4MDcsMHg1YSwweDVmLDB4NWUsMHg1OSwweDU4LDB4Y2YsMHg1OCwweDFjLDB4ZTQsMHgxYworLDB4NmMsMHgxYywweDhlLDB4MWEsMHhjMCwweDFmLDB4NDAsMHgxYSwweDQ0LDB4MWMsMHg2NSwweDE4LDB4ODAsMHg4MCwweDgwLDB4ZmYKKywweDgwLDB4MDMsMHgwMiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCissMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZgorLDB4ODAsMHgwMywweDAzLDB4NDMsMHg4MCwweDgwLDB4MDIsMHg4MCwweDQyLDB4MDMsMHgwMiwweGZmLDB4MDMsMHgwMSwweDAzLDB4MDEKKywweDAxLDB4MDMsMHgwMiwweDAzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAyLDB4MDMsMHgwMSwweDAzCissMHgwMywweGZmLDB4MDEsMHgwMSwweGZmLDB4MDEsMHhmZiwweDAxLDB4MDEsMHgwMywweDAzLDB4MDMsMHhmZiwweGZmLDB4ZmYsMHhmZgorLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKywweGZmLDB4ZmYsMHhmZiwweDAyLDB4YjgsMHgwZiwweDAwLDB4ZTcsMHg4NCwweGI4LDB4MGYsMHhmOCwweGU3LDB4ODIsMHhjMywweGI5CissMHgwOCwweDAwLDB4ODksMHgwZSwweGU2LDB4M2EsMHg4ZCwweDA2LDB4MjAsMHgwMywweDhiLDB4ZDAsMHhjMSwweGU4LDB4MDQsMHhhMworLDB4OTAsMHgwMSwweDhiLDB4YzIsMHg4YiwweGQ4LDB4YzEsMHhlOCwweDA0LDB4OGUsMHhjMCwweDA1LDB4NjEsMHgwMCwweDI2LDB4YTMKKywweDAwLDB4MDAsMHhhMSwweDMwLDB4MzQsMHgyNiwweGEzLDB4MDIsMHgwMCwweDgzLDB4YzMsMHgxNCwweGQxLDB4ZWIsMHgyNiwweDg5CissMHgxZSwweDA4LDB4MDAsMHg4MSwweGMyLDB4MTAsMHgwNiwweGUyLDB4ZDksMHgyNiwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZgorLDB4OGMsMHgwNiwweDkyLDB4MDEsMHhjMywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgKKywweGU3LDB4NWEsMHhmZiwweDA2LDB4YmUsMHgzMywweGJhLDB4ZDIsMHgwMCwweGVkLDB4Y2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg4YywweGNiLDB4YTEsMHgzMCwweDM0LDB4Y2QsMHgzNywweGU5LDB4MDYsMHhlZCwweGI4LDB4MzIsMHgwMCwweGMzLDB4ZTgsMHg4YworLDB4MDEsMHhmZSwweDA2LDB4ZTIsMHgzNCwweGU4LDB4MjEsMHgwMSwweDc1LDB4ZjAsMHhlOCwweDUzLDB4MGUsMHg4MSwweDBlLDB4YWYKKywweDM2LDB4MDAsMHhjMCwweGM3LDB4MDYsMHhhZCwweDM2LDB4NjAsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4ODAsMHgwMCwweDc1CissMHgxYSwweGY3LDB4MDYsMHhlNiwweDM0LDB4MDAsMHgwOCwweDc0LDB4MDksMHhjNywweDA2LDB4YWIsMHgzNiwweDBiLDB4MDAsMHhlOQorLDB4MGYsMHgwMCwweGM3LDB4MDYsMHhhYiwweDM2LDB4MDMsMHgwMCwweGU5LDB4MDYsMHgwMCwweGM3LDB4MDYsMHhhYiwweDM2LDB4MTEKKywweDljLDB4YzcsMHgwNiwweGE5LDB4MzYsMHgxOCwweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHg4MCwweDAwLDB4NzUsMHgwZCwweGY3CissMHgwNiwweGI1LDB4MzYsMHgwMiwweDAwLDB4NzQsMHgwNSwweDgzLDB4MGUsMHhhOSwweDM2LDB4MjAsMHhhMSwweGE5LDB4MzYsMHhlNworLDB4MDAsMHhhMSwweGFiLDB4MzYsMHhlNywweDAyLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHg4MCwweDAwLDB4NzQsMHgyZSwweGU4LDB4ZjIKKywweDJmLDB4MzMsMHhjMCwweDBkLDB4NDEsMHgwMCwweGU3LDB4NTYsMHhhMSwweGIxLDB4MzYsMHgwZCwweDAwLDB4MTAsMHhlNywweDA4CissMHhhMSwweGIzLDB4MzYsMHhlNywweDBhLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGI4LDB4NDAsMHgwMCwweGU3LDB4NGUsMHgzMworLDB4YzAsMHhlNywweDBlLDB4YzcsMHgwNiwweDI2LDB4MDIsMHgwMCwweDAwLDB4ZTksMHgyMywweDAwLDB4YzcsMHgwNiwweDRlLDB4MzcKKywweDNmLDB4MjAsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDgwLDB4NzQsMHgwNywweDI2CissMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4ODAsMHhjNiwweDA2LDB4ZTAsMHgzNCwweDAxLDB4YjgsMHgwMCwweDAwLDB4YzMsMHhmZQorLDB4MDYsMHhlMSwweDM0LDB4YzYsMHgwNiwweGUwLDB4MzQsMHgwMCwweGExLDB4MjYsMHgwMiwweDBiLDB4YzAsMHg3NCwweDAxLDB4YzMKKywweGU4LDB4MDQsMHgwMCwweGI4LDB4MDAsMHgwMCwweGMzLDB4YTEsMHhhOSwweDM2LDB4ZTcsMHgwMCwweDhiLDB4MWUsMHhhYiwweDM2CissMHg4MywweGUzLDB4MDYsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGIsMHhjMywweDBkLDB4MTAsMHgwMCwweGU3LDB4MDIsMHhhMQorLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhjMywweGI4LDB4MGEsMHgwMCwweGU3LDB4ODQsMHhmZSwweDA2LDB4ZTUsMHgzNCwweGM2LDB4MDYKKywweGUzLDB4MzQsMHgwMSwweDhlLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4NDAsMHg3NCwweDA3CissMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHg0MCwweGMzLDB4YzcsMHgwNiwweDRlLDB4MzcsMHg2ZiwweDE3LDB4ZmUsMHgwNgorLDB4ZTQsMHgzNCwweGM2LDB4MDYsMHhlMywweDM0LDB4MDAsMHhjMywweGMzLDB4ZjYsMHgwNiwweDE4LDB4MzQsMHg4MCwweDc1LDB4MGQKKywweGExLDB4MTgsMHgzNCwweDBiLDB4MDYsMHgxYSwweDM0LDB4MGIsMHgwNiwweDFjLDB4MzQsMHg3NSwweDAxLDB4YzMsMHhhMSwweDJlCissMHgzNCwweDI1LDB4ZmYsMHhmZSwweDhiLDB4MTYsMHhlNywweDM2LDB4ODEsMHhlMiwweDAwLDB4MDEsMHgwYiwweGMyLDB4YTMsMHgyZQorLDB4MzQsMHg4ZCwweDE2LDB4MTAsMHgwMCwweGJmLDB4MDAsMHgwMCwweGI5LDB4MDgsMHgwMCwweDhiLDB4ODUsMHgwMCwweDM0LDB4ZWYKKywweDgzLDB4YzIsMHgxMCwweDhiLDB4ODUsMHgwMiwweDM0LDB4ZWYsMHg4MywweGMyLDB4MTAsMHg4YiwweDg1LDB4MDQsMHgzNCwweGVmCissMHg4MywweGMyLDB4ZTIsMHg4MywweGM3LDB4MDYsMHg0OSwweDc1LDB4ZTIsMHhiOCwweDAwLDB4MDAsMHg4ZSwweGMwLDB4YmUsMHgwMAorLDB4MzQsMHhiZiwweGI5LDB4MzYsMHhiOSwweDE4LDB4MDAsMHhmMywweGE1LDB4YjgsMHgwMCwweDAwLDB4YzMsMHgzMywweGMwLDB4OGUKKywweGMwLDB4OGQsMHgzZSwweGIwLDB4MzMsMHhiOSwweDA4LDB4MDAsMHhmMywweGFiLDB4OGQsMHgzZSwweDNlLDB4MzQsMHhiOSwweDAzCissMHgwMCwweGYzLDB4YWIsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4NTAsMHg1MSwweDU2LDB4NTcsMHg1MiwweDA2LDB4MWUsMHgzMywweGMwLDB4OGUsMHhkOCwweGU3LDB4NWEsMHhmZiwweDA2LDB4YmEKKywweDMzLDB4ZTUsMHg1NiwweDBkLDB4MjAsMHgwMCwweGU3LDB4NTYsMHhiYSwweDdhLDB4MDAsMHhlZCwweDA4LDB4MjYsMHg5NCwweDM2CissMHgzMywweGMwLDB4YjEsMHgwOCwweDMyLDB4ZWQsMHgwNiwweDhlLDB4YzAsMHg4ZCwweDNlLDB4ZTAsMHhmZiwweGYzLDB4YWEsMHg4ZQorLDB4MDYsMHgzMiwweDM0LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDIsMHgwNywweGU1LDB4NTYsMHgyNSwweGRmLDB4ZmYKKywweGU3LDB4NTYsMHhlOSwweGY4LDB4ZmMsMHgwMCwweGJkLDB4MWIsMHgxMCwweDFiLDB4ZDksMHgxYSwweGYzLDB4MWEsMHg1MCwweDUxCissMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGI2LDB4MzMsMHg1MworLDB4MDYsMHg1MSwweGU1LDB4ODAsMHhhMywweGI0LDB4MzMsMHg4YiwweGQ4LDB4OGIsMHhjOCwweDI1LDB4MTAsMHgwMCwweGEzLDB4ZWQKKywweDM0LDB4MGIsMHhjMCwweDc0LDB4MTQsMHhmZiwweDA2LDB4ODAsMHgzNCwweDgwLDB4M2UsMHhmZSwweDM0LDB4MDAsMHg3NCwweDAzCissMHhlOSwweDA2LDB4MDAsMHhiOCwweDgwLDB4MDAsMHhlOCwweDlkLDB4MDQsMHg4MywweGUzLDB4MDMsMHhkMSwweGUzLDB4MmUsMHhmZgorLDB4OTcsMHg4NiwweDFhLDB4NTksMHgwNywweDViLDB4ZTksMHhhNCwweGZjLDB4YmEsMHgyMCwweDAwLDB4OGUsMHgwNiwweDNjLDB4MzQKKywweDgzLDB4M2UsMHgzYywweDM0LDB4MDAsMHg3NSwweDAzLDB4ZTksMHhmMCwweDAwLDB4YzcsMHgwNiwweDNjLDB4MzQsMHgwMCwweDAwCissMHhlOSwweDJhLDB4MDAsMHhiYSwweDEwLDB4MDAsMHg4ZSwweDA2LDB4M2EsMHgzNCwweDgzLDB4M2UsMHgzYSwweDM0LDB4MDAsMHg3NQorLDB4MDMsMHhlOSwweGQ1LDB4ZmYsMHhjNywweDA2LDB4M2EsMHgzNCwweDAwLDB4MDAsMHhlOCwweDEwLDB4MDAsMHhlOSwweGM5LDB4ZmYKKywweGJhLDB4MTAsMHgwMCwweDhlLDB4MDYsMHgzYSwweDM0LDB4YzcsMHgwNiwweDNhLDB4MzQsMHgwMCwweDAwLDB4MjYsMHhhMSwweDE0CissMHgwMCwweDI2LDB4YTMsMHgwYywweDAwLDB4MjYsMHhhMSwweDE2LDB4MDAsMHgyNiwweGEzLDB4MGUsMHgwMCwweDI2LDB4YzYsMHgwNgorLDB4MGEsMHgwMCwweDAwLDB4YzEsMHhlYSwweDAyLDB4MjMsMHhkMSwweDc0LDB4MWMsMHhiYSwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYKKywweDBlLDB4MDAsMHhlYSwweDA1LDB4MjYsMHgwYiwweDE2LDB4MGMsMHgwMCwweDI2LDB4ODksMHgxNiwweDBjLDB4MDAsMHhmZiwweDA2CissMHg4NiwweDM0LDB4ZmYsMHgwNiwweGRjLDB4MzMsMHgyNiwweGExLDB4MGMsMHgwMCwweGE5LDB4MDAsMHgzNywweDc0LDB4MTYsMHgyNgorLDB4YzYsMHgwNiwweDBhLDB4MDAsMHgwMiwweGE5LDB4MDAsMHgzMCwweDc0LDB4MDQsMHhmZiwweDA2LDB4N2EsMHgzNCwweGZmLDB4MDYKKywweGRhLDB4MzMsMHhlOSwweDQ5LDB4MDAsMHhjMCwweGVjLDB4MDcsMHg4MywweDE2LDB4OGEsMHgzNCwweDAwLDB4MjQsMHgwNywweDNjCissMHgwNywweDc1LDB4MDQsMHhmZiwweDA2LDB4OGMsMHgzNCwweGZmLDB4MDYsMHg3ZSwweDM0LDB4YTEsMHgzMCwweDM0LDB4OGMsMHhjMworLDB4OGUsMHhjMCwweDhlLDB4ZGIsMHgyNiwweDgzLDB4MGUsMHgwOCwweDAwLDB4NDAsMHg4YywweGQ4LDB4MjYsMHg4NywweDA2LDB4MTYKKywweDAwLDB4MjYsMHg4MywweDNlLDB4MTQsMHgwMCwweGZmLDB4NzQsMHgwYSwweDhlLDB4YzAsMHgyNiwweDhjLDB4MWUsMHgwMCwweDAwCissMHhlOSwweDA1LDB4MDAsMHgyNiwweDhjLDB4MWUsMHgxNCwweDAwLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhjMywweGMzLDB4OGMsMHhjMAorLDB4ODcsMHgwNiwweDkyLDB4MDEsMHgzZCwweGZmLDB4ZmYsMHg3NCwweDBkLDB4OGUsMHhkOCwweDhjLDB4MDYsMHgwMCwweDAwLDB4MzMKKywweGMwLDB4OGUsMHhkOCwweGU5LDB4MDQsMHgwMCwweDhjLDB4MDYsMHg5MCwweDAxLDB4ZTgsMHgwMSwweDAwLDB4YzMsMHgwNiwweDgzCissMHgzZSwweDkwLDB4MDEsMHhmZiwweDc0LDB4MjksMHg4MywweDNlLDB4M2EsMHgzNCwweDAwLDB4NzUsMHgxMSwweGJhLDB4ODYsMHgwMAorLDB4ZTgsMHgxZSwweDAwLDB4OGMsMHgwNiwweDNhLDB4MzQsMHg4MywweDNlLDB4OTAsMHgwMSwweGZmLDB4NzQsMHgxMSwweDgzLDB4M2UKKywweDNjLDB4MzQsMHgwMCwweDc1LDB4MGEsMHhiYSwweDg4LDB4MDAsMHhlOCwweDA2LDB4MDAsMHg4YywweDA2LDB4M2MsMHgzNCwweDA3CissMHhjMywweGExLDB4OTAsMHgwMSwweDhlLDB4YzAsMHgyNiwweGExLDB4MDgsMHgwMCwweGVmLDB4MjYsMHhhMSwweDAwLDB4MDAsMHgyNgorLDB4YzcsMHgwNiwweDAwLDB4MDAsMHhmZiwweGZmLDB4YTMsMHg5MCwweDAxLDB4M2QsMHhmZiwweGZmLDB4NzUsMHgwMywweGEzLDB4OTIKKywweDAxLDB4ODMsMHgzZSwweGVkLDB4MzQsMHgwMCwweDc0LDB4MGIsMHhiOCwweDEwLDB4MDAsMHhlNywweDg0LDB4YzcsMHgwNiwweGVkCissMHgzNCwweDAwLDB4MDAsMHhjMywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNworLDB4NWEsMHhmZiwweDA2LDB4YmMsMHgzMywweGU5LDB4MjUsMHhmYiwweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMKKywweGMwLDB4OGUsMHhkOCwweGU3LDB4NWEsMHhmZiwweDA2LDB4YjAsMHgzMywweGU5LDB4MTEsMHhmYiwweDUwLDB4NTEsMHg1NiwweDU3CissMHg1MiwweDA2LDB4MWUsMHgzMywweGMwLDB4OGUsMHhkOCwweGU3LDB4NWEsMHhmZiwweDA2LDB4YjQsMHgzMywweDA2LDB4ZmYsMHgwNgorLDB4NzYsMHgzNCwweDgwLDB4M2UsMHhmZSwweDM0LDB4MDAsMHg3NCwweDA0LDB4MDcsMHhlOSwweGYwLDB4ZmEsMHhiOCwweDgwLDB4MDAKKywweGU4LDB4ZDMsMHgwMiwweDA3LDB4ZTksMHhlNiwweGZhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhjNiwweDFkLDB4MDgsMHgxZCwweDkxLDB4MWUsMHg1ZCwweDFlLDB4NzMsMHgxZSwweDg5LDB4MWUsMHg5MSwweDFlLDB4YTgsMHgxZAorLDB4OTEsMHgxZSwweDkxLDB4MWUsMHhhZiwweDFlLDB4YWYsMHgxZSwweDE1LDB4MWQsMHgxNSwweDFkLDB4OTEsMHgxZSwweDk5LDB4MWYKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwCissMHgwMCwweDAxLDB4MDAsMHgxMCwweDAwLDB4MDEsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMAorLDB4MDcsMHhlOSwweDk5LDB4ZmEsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcKKywweDVhLDB4ZmYsMHgwNiwweGIyLDB4MzMsMHgwNiwweDY4LDB4ZjYsMHgxYywweGU1LDB4MDYsMHhhMywweGIyLDB4MzMsMHg4YiwweGYwCissMHg4MywweGU2LDB4MWUsMHgyZSwweGZmLDB4YTQsMHhhMCwweDFjLDB4ZTUsMHgwYywweGE5LDB4ODAsMHgwMCwweDc0LDB4MDYsMHhlOAorLDB4YTQsMHgwMSwweGU1LDB4MDYsMHhjMywweDUzLDB4ZTUsMHgwYywweDhiLDB4ZDgsMHhhOSwweDAxLDB4MDAsMHg3NCwweDE0LDB4ODMKKywweDNlLDB4ZTAsMHgzYSwweDAwLDB4NzQsMHgwZCwweDhlLDB4MDYsMHgzOCwweDM0LDB4ZTgsMHhiZiwweDA2LDB4YzcsMHgwNiwweGUwCissMHgzYSwweDAwLDB4MDAsMHhlNSwweDAwLDB4MGQsMHgxOCwweDAwLDB4ZTcsMHgwMCwweGU1LDB4MDIsMHgwZCwweDExLDB4MDAsMHhlNworLDB4MDIsMHg4YiwweGMzLDB4NWIsMHhhOSwweDAxLDB4MDAsMHg3NCwweDAxLDB4YzMsMHg4YiwweGQwLDB4YjgsMHgwMCwweDA4LDB4ZTcKKywweDg0LDB4OGIsMHhjMiwweDhlLDB4MDYsMHgzOCwweDM0LDB4MjYsMHhhMywweDBjLDB4MDAsMHg4YiwweGQwLDB4YzEsMHhlMCwweDAzCissMHg4MywweDE2LDB4ODgsMHgzNCwweDAwLDB4ZmYsMHgwNiwweDdjLDB4MzQsMHgyNiwweDgzLDB4M2UsMHgwNiwweDAwLDB4MGEsMHg3NQorLDB4MjEsMHg4YiwweGMyLDB4MjUsMHg0MCwweDE4LDB4M2QsMHg0MCwweDAwLDB4NzQsMHgwYywweDNkLDB4MDAsMHgxMCwweDc1LDB4MTIKKywweDI2LDB4ZmUsMHgwZSwweDBhLDB4MDAsMHg3NCwweDBiLDB4ZjcsMHgwNiwweGVmLDB4MzQsMHgyMCwweDAwLDB4NzUsMHgwMywweGU5CissMHg1YSwweDA2LDB4OGMsMHhjMCwweDI2LDB4OGUsMHgwNiwweDAyLDB4MDAsMHgyNiwweDgzLDB4MGUsMHgwOCwweDAwLDB4MjAsMHgyNgorLDB4YTMsMHgxMiwweDAwLDB4MjYsMHhhMywweDEwLDB4MDAsMHhjMywweGZmLDB4MDYsMHhjNCwweDMzLDB4ZTUsMHgwYywweGE5LDB4MDEKKywweDAwLDB4NzUsMHgwMSwweGMzLDB4YTksMHhmMCwweDA3LDB4NzQsMHgwMSwweGMzLDB4ZmYsMHgwNiwweGQ0LDB4MzMsMHhlNSwweDAwCissMHgwZCwweDE4LDB4MDAsMHhlNywweDAwLDB4YzMsMHhmZiwweDA2LDB4Y2EsMHgzMywweDgwLDB4M2UsMHhhMCwweDM2LDB4MDgsMHg3NQorLDB4MTQsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDA4LDB4NzQsMHgwNywweDI2LDB4ODEKKywweDBlLDB4MDgsMHgwMCwweDAwLDB4MDgsMHhlNSwweDgyLDB4MjUsMHhmZCwweGZmLDB4ZTcsMHg4MiwweGU1LDB4MGMsMHg1MCwweGU1CissMHg4MCwweDI1LDB4MDAsMHgwNywweGEzLDB4ZTQsMHgzYSwweGU1LDB4OGMsMHgyNSwweDAwLDB4ODAsMHhhMywweGUyLDB4M2EsMHg1OAorLDB4YTksMHgwMiwweDAwLDB4NzUsMHgyNSwweDgzLDB4M2UsMHhlMiwweDNhLDB4MDAsMHg3NSwweDFlLDB4ODMsMHgzZSwweGU0LDB4M2EKKywweDAwLDB4NzUsMHgxNywweGU1LDB4MDgsMHgwZCwweDAwLDB4MDQsMHgyNSwweGZmLDB4MDQsMHhlNywweDA4LDB4ZTgsMHg2YSwweDAxCissMHhlNSwweDgyLDB4MGQsMHgwMiwweDAwLDB4ZTcsMHg4MiwweGU5LDB4MjEsMHgwMCwweGU4LDB4MWEsMHgwNiwweDgwLDB4M2UsMHhlOAorLDB4ZmYsMHgwMCwweDc0LDB4MGEsMHg4MCwweDNlLDB4ZTgsMHhmZiwweDA0LDB4NzQsMHgwMywweGU5LDB4MGQsMHgwMCwweGM2LDB4MDYKKywweGU4LDB4ZmYsMHgwMSwweGJhLDB4MGMsMHgwMSwweGI4LDB4MDgsMHgwOCwweGVmLDB4ZWQsMHg4MCwweDNlLDB4OWYsMHgzNiwweDA2CissMHg3NSwweDA1LDB4ODMsMHgwZSwweDk5LDB4MzYsMHg0MCwweGI4LDB4MDAsMHgwMSwweGU5LDB4MDksMHgwMSwweGZmLDB4MDYsMHhjYworLDB4MzMsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZjcsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZmYsMHgwNiwweGM2LDB4MzQKKywweGU5LDB4MWUsMHgwMCwweGZmLDB4MDYsMHhjZSwweDMzLDB4ZmYsMHgwNiwweDk1LDB4MzcsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmCissMHhlZiwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhlOSwweDA4LDB4MDAsMHhmZiwweDA2LDB4ZDAsMHgzMywweGZmLDB4MDYsMHg3YQorLDB4MzQsMHhmZiwweDA2LDB4ZDIsMHgzMywweGQxLDB4ZTYsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDJlLDB4OGIsMHg4NCwweGMwLDB4MWMKKywweDI2LDB4MDksMHgwNiwweDA4LDB4MDAsMHgyZSwweDhiLDB4ODQsMHhjMiwweDFjLDB4MDksMHgwNiwweDY2LDB4MzcsMHhjMywweGU1CissMHgwYywweGE5LDB4ODAsMHgwMCwweDc0LDB4NTYsMHg1MCwweGU4LDB4ZjAsMHgwMCwweDU4LDB4YTksMHgwMCwweDAxLDB4NzUsMHgwNworLDB4ZmYsMHgwNiwweGM2LDB4MzMsMHhlOSwweDA4LDB4MDAsMHhmZiwweDA2LDB4NzgsMHgzNCwweGZmLDB4MDYsMHhjOCwweDMzLDB4ZTUKKywweDgyLDB4MjUsMHhmZCwweGZmLDB4ZTcsMHg4MiwweGU4LDB4NmUsMHgwNSwweGJhLDB4MTAsMHgwMSwweGVkLDB4ODAsMHgzZSwweGU4CissMHhmZiwweDAwLDB4NzQsMHgwYSwweDgwLDB4M2UsMHhlOCwweGZmLDB4MDQsMHg3NCwweDAzLDB4ZTksMHgxZCwweDAwLDB4YzYsMHgwNgorLDB4ZTgsMHhmZiwweDAxLDB4YmEsMHgwYywweDAxLDB4YjgsMHgwOCwweDA4LDB4ZWYsMHhlZCwweGU5LDB4MGQsMHgwMCwweGM2LDB4MDYKKywweGU4LDB4ZmYsMHgwMywweGJhLDB4MGMsMHgwMSwweGI4LDB4MDgsMHgwOCwweGVmLDB4ZWQsMHhjMywweGE5LDB4MDEsMHgwMCwweDc0CissMHgxYywweGU4LDB4MmMsMHgwMCwweDgzLDB4M2UsMHhlMCwweDNhLDB4MDAsMHg3NCwweDBmLDB4MDYsMHg4ZSwweDA2LDB4MzgsMHgzNAorLDB4ZTgsMHhjOSwweDA0LDB4YzcsMHgwNiwweGUwLDB4M2EsMHgwMCwweDAwLDB4MDcsMHhlOSwweDVkLDB4MDAsMHg4YiwweGQwLDB4OGUKKywweDA2LDB4MzgsMHgzNCwweDI2LDB4YTMsMHgwYywweDAwLDB4ZTgsMHgwNiwweDAwLDB4NjgsMHg2OSwweDFkLDB4ZTksMHg0YSwweDAwCissMHhhOSwweDAwLDB4MDQsMHg3NCwweDBhLDB4YjgsMHgwMCwweDA0LDB4ZmYsMHgwNiwweGQ4LDB4MzMsMHhlOSwweDE3LDB4MDAsMHhhOQorLDB4MDAsMHgwMSwweDc0LDB4MGEsMHhmZiwweDA2LDB4MzksMHgzNywweGI4LDB4MDAsMHgwMSwweGU5LDB4MDgsMHgwMCwweGE5LDB4MTAKKywweDAwLDB4YjgsMHgxMCwweDAwLDB4NzQsMHgxZCwweDA5LDB4MDYsMHg2NiwweDM3LDB4OGMsMHhjMCwweDhlLDB4MDYsMHgzMCwweDM0CissMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwMSwweDc0LDB4MDcsMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgwMQorLDB4OGUsMHhjMCwweGMzLDB4ZmYsMHgwNiwweGMyLDB4MzMsMHhlOSwweGY4LDB4ZmYsMHhlNSwweDAwLDB4MGQsMHgxOCwweDAwLDB4ZTcKKywweDAwLDB4ZTUsMHgwMiwweDBkLDB4MTEsMHgwMCwweGU3LDB4MDIsMHhjMywweDU4LDB4ZTksMHg0MywweGZkLDB4ZTUsMHgwOCwweDBkCissMHgwMCwweDA0LDB4MjUsMHhmZiwweDA0LDB4ZTcsMHgwOCwweGU5LDB4ZTAsMHhmZiwweGU1LDB4MGUsMHhhOSwweDAwLDB4MDgsMHg3NQorLDB4MDEsMHhjMywweGU5LDB4ZjUsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGI4CissMHgzMywweGU1LDB4NDgsMHgwNiwweDUzLDB4NTcsMHhmZiwweDE2LDB4NGUsMHgzNywweDVmLDB4NWIsMHg4MywweDNlLDB4ODAsMHgwMQorLDB4ZmYsMHg3NCwweDU4LDB4OGUsMHgwNiwweDgwLDB4MDEsMHgyNiwweGZmLDB4MGUsMHgwOCwweDAwLDB4NzUsMHg0ZCwweDI2LDB4YTEKKywweDAwLDB4MDAsMHhhMywweDgwLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweDhjLDB4YzAsMHgyNiwweDhlCissMHgwNiwweDAyLDB4MDAsMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4ODAsMHgwMCwweDhiLDB4ZDAsMHgyNiwweDg3LDB4MDYsMHgxYQorLDB4MDAsMHgyNiwweDgzLDB4M2UsMHgxOCwweDAwLDB4ZmYsMHg3NCwweDBhLDB4OGUsMHhjMCwweDI2LDB4ODksMHgxNiwweDAwLDB4MDAKKywweGU5LDB4MDUsMHgwMCwweDI2LDB4ODksMHgxNiwweDE4LDB4MDAsMHg4MywweDNlLDB4ODAsMHgwMSwweGZmLDB4NzQsMHgwYywweDhlCissMHgwNiwweDgwLDB4MDEsMHgyNiwweDgzLDB4M2UsMHgwOCwweDAwLDB4MDAsMHg3NCwweGIzLDB4MDcsMHhlOSwweDNlLDB4ZjcsMHhlNQorLDB4NGMsMHg5MCwweGU1LDB4MDIsMHhhOSwweDAwLDB4MjAsMHg3NCwweDBkLDB4MjUsMHhmZiwweGRmLDB4MGQsMHgwMSwweDAwLDB4ZTcKKywweDAyLDB4MGQsMHgwMCwweDIwLDB4ZTcsMHgwMiwweGU1LDB4MGEsMHg4YiwweGQ4LDB4YTMsMHhmNCwweDMzLDB4MjUsMHhjMywweDU3CissMHgwZCwweDAwLDB4MTAsMHhlNywweDBhLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDgwLDB4NzQsMHgzNywweGY3LDB4YzMsMHgwMAorLDB4ODAsMHg3NCwweDA2LDB4ZjcsMHhjMywweDAwLDB4MDgsMHg3NCwweDVkLDB4ODEsMHgyNiwweGMyLDB4MzQsMHg3ZiwweGZmLDB4YzcKKywweDA2LDB4MzUsMHgzNywweDA1LDB4MDAsMHhiOCwweDgwLDB4MDMsMHhjZCwweDM5LDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweDdmCissMHhjNywweDA2LDB4MGYsMHgzNywweDA0LDB4MDAsMHhmNywweDA2LDB4OWIsMHgzNiwweDQwLDB4MDAsMHg3NSwweDA2LDB4YzcsMHgwNgorLDB4MGYsMHgzNywweDAzLDB4MDAsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NCwweDJhLDB4ZjcsMHhjMywweDAwLDB4MDgKKywweDc0LDB4MjQsMHg4MCwweDNlLDB4OWQsMHgzNiwweDA2LDB4N2MsMHgxZCwweGZmLDB4MDYsMHg5NCwweDM0LDB4ODMsMHgwZSwweDY2CissMHgzNywweDIwLDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwMSwweDc0LDB4MDcsMHgyNgorLDB4ODEsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAxLDB4ZjcsMHhjMywweDAwLDB4MjAsMHg3NSwweDNiLDB4ZjcsMHgwNiwweDlhLDB4MzcKKywweDgwLDB4MDAsMHg3NCwweDBiLDB4ZmYsMHgwNiwweDg5LDB4MzcsMHgzMywweGMwLDB4ZTcsMHgwZSwweGU5LDB4MDQsMHgwMCwweGZmCissMHgwNiwweDNiLDB4MzcsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NCwweDFjLDB4ODAsMHgyNiwweDllLDB4MzYsMHhmZgorLDB4NzUsMHgxNSwweDhlLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDgsMHg3NCwweDA3LDB4MjYKKywweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgwOCwweGMzLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMiwweDIzLDB4MDIsMHgyMywweDAyLDB4MjMsMHgwMiwweDIzLDB4MDMsMHgyMywweGRkLDB4MjIsMHgwMiwweDIzLDB4ZmQsMHgyMQorLDB4MDIsMHgyMywweGE0LDB4MjQsMHhmMywweDI0LDB4MDIsMHgyMywweDhkLDB4MjIsMHg3YSwweDIzLDB4MDIsMHgyMywweDk3LDB4MjQKKywweDFiLDB4MjQsMHg3NSwweDI0LDB4MDIsMHgyMywweDAyLDB4MjMsMHg4ZSwweDI1LDB4ZmIsMHg4ZSwweDA2LDB4N2UsMHgwMSwweGZiCissMHgyNiwweDgzLDB4M2UsMHgwMCwweDAwLDB4ZmYsMHg3NCwweGYyLDB4MjYsMHg4ZSwweDA2LDB4MDAsMHgwMCwweGZhLDB4MjYsMHg4YgorLDB4MWUsMHgwOCwweDAwLDB4MjYsMHgyMywweDFlLDB4MGEsMHgwMCwweDc0LDB4ZTUsMHg4YywweGMwLDB4OGUsMHhkMCwweDI2LDB4OGIKKywweDI2LDB4MDIsMHgwMCwweDhjLDB4MTYsMHhmMiwweDMzLDB4MjIsMHhmZiwweDc1LDB4NmEsMHgyNiwweGExLDB4MWMsMHgwMCwweDhhCissMHhlMywweDhhLDB4ZGMsMHgyMiwweGQ4LDB4NzUsMHgwZCwweGQwLDB4ZTgsMHgyNCwweGY4LDB4MGEsMHhjMCwweDc1LDB4ZjIsMHhiMAorLDB4ODAsMHhlOSwweGVkLDB4ZmYsMHhkMCwweGU4LDB4MjQsMHhmOCwweDBhLDB4YzAsMHg3NSwweDAyLDB4YjAsMHg4MCwweDMyLDB4ZTQKKywweDI2LDB4YTMsMHgxYywweDAwLDB4ZjcsMHhjMywweDA4LDB4MDAsMHg3NSwweDQ3LDB4MmUsMHg4YSwweDlmLDB4YzUsMHgyNSwweDJlCissMHg4YiwweGJmLDB4YzUsMHgyNiwweDgwLDB4YzMsMHgxMCwweDI2LDB4OGUsMHgxZCwweDI2LDB4OGMsMHgxZSwweDA2LDB4MDAsMHg4YgorLDB4MTYsMHgwMCwweDAwLDB4YzcsMHgwNiwweDAwLDB4MDAsMHhmZiwweGZmLDB4MjYsMHg4OSwweDE1LDB4ODMsMHhmYSwweGZmLDB4NzUKKywweDBhLDB4MmUsMHg4YiwweDk3LDB4Y2QsMHgyNiwweDI2LDB4MjEsMHgxNiwweDA4LDB4MDAsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2CissMHg4OSwweDFlLDB4MDQsMHgwMCwweGMzLDB4OGEsMHhkZiwweGI3LDB4MDAsMHgyZSwweDhhLDB4OWYsMHhjNSwweDI1LDB4ZTksMHhlMAorLDB4ZmYsMHgyNiwweDgzLDB4MjYsMHgwOCwweDAwLDB4ZjcsMHg4MywweGMzLDB4MTAsMHhlOSwweGRlLDB4ZmYsMHg2MCwweDA2LDB4MWUKKywweDY4LDB4ODcsMHgyNSwweDZhLDB4MDAsMHgxZiwweDhlLDB4MDYsMHhmMiwweDMzLDB4OGIsMHgwZSwweDM0LDB4MzQsMHgzOSwweDBlCissMHhmMiwweDMzLDB4NzQsMHgwZSwweDI2LDB4ODEsMHgwZSwweDBhLDB4MDAsMHgwMCwweDAyLDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMAorLDB4MDAsMHgwMiwweDI2LDB4ODksMHgyNiwweDAyLDB4MDAsMHhhMywweGYyLDB4MzMsMHg4ZSwweGQwLDB4OGQsMHgyNiwweDgwLDB4MDAKKywweDM2LDB4ODksMHgyNiwweDAyLDB4MDAsMHgzNiwweDg5LDB4MWUsMHgyMCwweDAwLDB4MzYsMHhjNywweDA2LDB4MDgsMHgwMCwweDAwCissMHgwMCwweGI5LDB4MDQsMHgwMCwweGJlLDB4MDAsMHgwMCwweDJlLDB4OGIsMHhiYywweGM1LDB4MjYsMHgzNiwweGM3LDB4MDUsMHhmZgorLDB4ZmYsMHgzNiwweGM3LDB4NDUsMHgwMiwweGZmLDB4ZmYsMHg4MywweGM2LDB4MDIsMHhlMiwweGViLDB4OGUsMHgwNiwweDdlLDB4MDEKKywweDM2LDB4OGIsMHgwZSwweDIyLDB4MDAsMHg4YywweGMwLDB4MjYsMHg4MywweDNlLDB4MDAsMHgwMCwweGZmLDB4MjYsMHg4ZSwweDA2CissMHgwMCwweDAwLDB4NzQsMHgwNywweDI2LDB4M2IsMHgwZSwweDIyLDB4MDAsMHg3ZCwweGVhLDB4MzYsMHg4YywweDA2LDB4MDAsMHgwMAorLDB4OGUsMHhjMCwweDI2LDB4OGMsMHgxNiwweDAwLDB4MDAsMHhmYiwweDM2LDB4ZmYsMHgyZSwweDFlLDB4MDAsMHgwNiwweDFlLDB4NjgKKywweDhiLDB4MjUsMHg2YSwweDAwLDB4MWYsMHgyNiwweDA5LDB4MzYsMHgwOCwweDAwLDB4ZjcsMHhjNiwweDAwLDB4ZmYsMHg3NCwweDAxCissMHhjMywweDU2LDB4NTIsMHgyZSwweDhiLDB4YjQsMHhjNSwweDI1LDB4ODEsMHhlNiwweGZmLDB4MDAsMHgyZSwweDhiLDB4YjQsMHhjNQorLDB4MjYsMHg4YywweGMyLDB4OGUsMHhjMCwweDI2LDB4YzcsMHgwNiwweDAwLDB4MDAsMHhmZiwweGZmLDB4OGUsMHhjMiwweDI2LDB4ODMKKywweDNjLDB4ZmYsMHg3NCwweDBmLDB4OGIsMHhkMCwweDI2LDB4ODcsMHg1NCwweDAyLDB4OGUsMHhjMiwweDI2LDB4YTMsMHgwMCwweDAwCissMHhlOSwweDA3LDB4MDAsMHgyNiwweDg5LDB4NDQsMHgwMiwweDI2LDB4ODksMHgwNCwweDVhLDB4NWUsMHhjMywweDA2LDB4MWUsMHg2OAorLDB4OGIsMHgyNSwweDZhLDB4MDAsMHgxZiwweDhlLDB4MDYsMHhmMiwweDMzLDB4MjYsMHhhMywweDBhLDB4MDAsMHgyNiwweDg5LDB4MjYKKywweDAyLDB4MDAsMHhhMSwweDM0LDB4MzQsMHg4ZSwweGQwLDB4OGQsMHgyNiwweDgwLDB4MDAsMHg4YywweDE2LDB4ZjIsMHgzMywweGU5CissMHg0ZCwweGZlLDB4Y2YsMHg1MCwweDFlLDB4NTIsMHg1MywweDMzLDB4YzAsMHg4ZSwweGQ4LDB4MjYsMHg4MywweDNlLDB4MDQsMHgwMAorLDB4ZmYsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4MDAsMHgwMCwweDc0LDB4MDMsMHhlOSwweDFhLDB4MDAsMHg4MywweDNlLDB4ZTYKKywweDNhLDB4MDIsMHg3NiwweDEzLDB4ZmYsMHgwNiwweGQ2LDB4MzMsMHg4YywweGMwLDB4OGUsMHgwNiwweDMyLDB4MzQsMHhiZSwweDQwCissMHgwMCwweDY4LDB4M2EsMHgyMywweGU5LDB4NWUsMHhmZiwweGU4LDB4ODQsMHhmOCwweDViLDB4NWEsMHgxZiwweDU4LDB4Y2YsMHhlOAorLDB4ZTEsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE4LDB4MDAsMHgxMCwweDI2LDB4OGEsMHgxZSwweDI5LDB4MDAsMHg4OCwweDFlLDB4MWIKKywweDM3LDB4MjYsMHhjNywweDA2LDB4MGMsMHgwMCwweGZmLDB4N2YsMHgyNiwweGExLDB4MGUsMHgwMCwweGU3LDB4OWMsMHgyNiwweGExCissMHgwOCwweDAwLDB4ZTcsMHg5YSwweGU1LDB4MDAsMHg4MCwweGZiLDB4MDgsMHg3NCwweDA5LDB4MGQsMHgxOCwweGFjLDB4ZTcsMHgwMAorLDB4MDcsMHgxZiwweDU4LDB4Y2YsMHgwZCwweDE4LDB4MDAsMHhlOSwweGY0LDB4ZmYsMHg1MCwweDFlLDB4MDYsMHgzMywweGMwLDB4OGUKKywweGQ4LDB4ODMsMHgzZSwweGExLDB4MzYsMHgwMCwweDc1LDB4YjcsMHgyNiwweDhiLDB4MzYsMHgwNiwweDAwLDB4MmUsMHhmZiwweDk0CissMHhkYywweDIzLDB4MDcsMHgxZiwweDU4LDB4Y2YsMHhlOCwweDhhLDB4MDAsMHhlNSwweDAwLDB4MGQsMHgxOCwweDAwLDB4ZTcsMHgwMAorLDB4ZTgsMHg0OSwweDAwLDB4YzMsMHg1MywweGY3LDB4MDYsMHhlZiwweDM0LDB4MjAsMHgwMCwweDc1LDB4MmQsMHhlNSwweDhjLDB4MjUKKywweDAwLDB4NzAsMHg4YiwweGQ4LDB4ZTUsMHg4YywweDI1LDB4MDAsMHg3MCwweDNiLDB4YzMsMHg3NCwweDA1LDB4OGIsMHhkOCwweGU5CissMHhmMiwweGZmLDB4M2QsMHgwMCwweDMwLDB4NzUsMHgxMCwweGU1LDB4MDIsMHgyNSwweGVmLDB4ZmYsMHhlNywweDAyLDB4YzcsMHgwNgorLDB4ZTAsMHgzYSwweGZmLDB4ZmYsMHhlOSwweDAzLDB4MDAsMHhlOCwweDEyLDB4MDAsMHg1YiwweGMzLDB4YTMsMHgyMywweDk2LDB4MjMKKywweGE0LDB4MjMsMHhhNCwweDIzLDB4OTYsMHgyMywweGE0LDB4MjMsMHg5NiwweDIzLDB4OTYsMHgyMywweDI2LDB4YTAsMHgyOSwweDAwCissMHhhMiwweDFiLDB4MzcsMHgyNiwweGM3LDB4MDYsMHgwYywweDAwLDB4ZmYsMHg3ZiwweDI2LDB4YTEsMHgwZSwweDAwLDB4ZTcsMHg5YworLDB4MjYsMHhhMSwweDA4LDB4MDAsMHhlNywweDlhLDB4ZTUsMHgwMCwweDI1LDB4ZmYsMHg1MywweDI2LDB4OGIsMHgzNiwweDA2LDB4MDAKKywweDgzLDB4ZTYsMHgwZSwweDJlLDB4MGIsMHg4NCwweGFkLDB4MjUsMHhlNywweDAwLDB4YzMsMHgwNiwweDFlLDB4NjgsMHg4YiwweDI1CissMHg2YSwweDAwLDB4MWYsMHg4MywweDBlLDB4ZWYsMHgzNCwweDIwLDB4ODMsMHgwZSwweDliLDB4MzYsMHgwOCwweGU1LDB4MDAsMHgyNQorLDB4ZWYsMHhmZiwweDBkLDB4MDgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAwLDB4YTksMHgxMCwweDAwLDB4NzUsMHgwMSwweGMzLDB4ZTUKKywweDAwLDB4YTksMHgxMCwweDAwLDB4NzUsMHhmOSwweGMzLDB4NTAsMHg1MywweDUxLDB4NTYsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlCissMHhkOCwweGI4LDB4MDUsMHgwMCwweGU3LDB4ODQsMHhlNSwweDA4LDB4MGQsMHgwMCwweDA0LDB4MjUsMHhmZiwweDA0LDB4ZTcsMHgwOAorLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAyLDB4MGQsMHgxMSwweDAwLDB4ZTcsMHgwMiwweDFmLDB4MDcKKywweDVlLDB4NTksMHg1YiwweDU4LDB4YzMsMHg1MCwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhjNywweDA2LDB4ZWYsMHgzNCwweDAwCissMHgwMCwweDgzLDB4MjYsMHg5YiwweDM2LDB4ZjcsMHhlNSwweDAwLDB4MGQsMHgxOCwweDAwLDB4ZTcsMHgwMCwweGU1LDB4MDIsMHgwZAorLDB4MTEsMHgwMCwweGU3LDB4MDIsMHgxZiwweDU4LDB4Y2YsMHg2MCwweDA2LDB4MWUsMHg2OCwweDg3LDB4MjUsMHg2YSwweDAwLDB4MWYKKywweGU4LDB4MTYsMHhmNSwweGMzLDB4MDYsMHgxZSwweDY4LDB4OGIsMHgyNSwweDZhLDB4MDAsMHgxZiwweDhlLDB4YzAsMHgyNiwweDgzCissMHgzZSwweDBhLDB4MDAsMHgwMCwweDc0LDB4MDMsMHhlOCwweDQzLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwYSwweDAwLDB4ZmYsMHhmZgorLDB4MjYsMHg4YiwweDE2LDB4MDYsMHgwMCwweDhlLDB4MWUsMHg4ZSwweDAxLDB4OGMsMHhkOCwweDhiLDB4Y2EsMHg4MywweDNlLDB4MDAKKywweDAwLDB4ZmYsMHg4ZSwweDFlLDB4MDAsMHgwMCwweDc0LDB4MGEsMHgyYiwweDE2LDB4MDgsMHgwMCwweDczLDB4ZWIsMHgyOSwweDBlCissMHgwOCwweDAwLDB4MjYsMHg4OSwweDBlLDB4MDgsMHgwMCwweDI2LDB4OGMsMHgxZSwweDAwLDB4MDAsMHg4ZSwweGQ4LDB4OGMsMHgwNgorLDB4MDAsMHgwMCwweGMzLDB4NjAsMHgwNiwweDFlLDB4NjgsMHg4NywweDI1LDB4NmEsMHgwMCwweDFmLDB4OGUsMHhjMCwweDhiLDB4YzgKKywweDhlLDB4MWUsMHg4ZSwweDAxLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDAsMHg4YywweGQ4LDB4ODMsMHgzZSwweDAwCissMHgwMCwweGZmLDB4NzQsMHgyNSwweDNiLDB4MGUsMHgwMCwweDAwLDB4OGUsMHgxZSwweDAwLDB4MDAsMHg3NSwweGVkLDB4OGUsMHhkOAorLDB4MjYsMHhhMSwweDAwLDB4MDAsMHhhMywweDAwLDB4MDAsMHgzZCwweGZmLDB4ZmYsMHg3NCwweDU2LDB4OGUsMHhkOCwweDI2LDB4YTEKKywweDA4LDB4MDAsMHgwMSwweDA2LDB4MDgsMHgwMCwweGU5LDB4NDksMHgwMCwweDI2LDB4OGUsMHgxZSwweDAyLDB4MDAsMHhiZSwweDE4CissMHgwMCwweDgzLDB4M2MsMHhmZiwweDc0LDB4M2MsMHgzOSwweDBjLDB4NzQsMHgxOSwweDhlLDB4MWMsMHhiZSwweDAwLDB4MDAsMHg4MworLDB4M2UsMHgwMCwweDAwLDB4ZmYsMHg3NCwweDJjLDB4MzksMHgwZSwweDAwLDB4MDAsMHg3NCwweDA3LDB4OGUsMHgxZSwweDAwLDB4MDAKKywweGU5LDB4ZWMsMHhmZiwweDI2LDB4YTEsMHgwMCwweDAwLDB4ODksMHgwNCwweDMzLDB4YzksMHg4ZSwweGQ5LDB4M2QsMHhmZiwweGZmCissMHg3NSwweDEwLDB4ODMsMHhmZSwweDE4LDB4NzUsMHgwYiwweDI2LDB4OGUsMHgxZSwweDAyLDB4MDAsMHg4MSwweDI2LDB4MDgsMHgwMAorLDB4N2YsMHhmZiwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzMsMHgxZiwweDA3LDB4NjEsMHhjZiwweDFmLDB4MDcsMHhjZiwweDYwLDB4MDYKKywweDFlLDB4NjgsMHg4NywweDI1LDB4NmEsMHgwMCwweDFmLDB4ZTUsMHgwNiwweDI1LDB4MWUsMHgwMCwweDNkLDB4MWUsMHgwMCwweDc1CissMHhmNiwweGI5LDB4MDgsMHgwMCwweGU1LDB4NTgsMHhlNywweDVhLDB4MjMsMHhjMCwweGUwLDB4ZjgsMHhjMywweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWMsMHgwMCwweDAwLDB4MDAsMHhhOCwweDAwLDB4OGMsMHgwMiwweDA0LDB4MDAKKywweDAwLDB4MDgsMHgxMCwweDIwLDB4MDAsMHhmZiwweDBlLDB4MGMsMHgwYywweDBhLDB4MGEsMHgwYSwweDBhLDB4MDgsMHgwOCwweDA4CissMHgwOCwweDA4LDB4MDgsMHgwOCwweDA4LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNgorLDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQKKywweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0CissMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMgorLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIKKywweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyCissMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMgorLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwMCwweDE0LDB4MDAsMHgxMCwweDAwLDB4MGMsMHgwMCwweGZmLDB4N2YsMHhmZgorLDB4YmYsMHhmZiwweGRmLDB4ZmYsMHhlZiwweGZmLDB4ZjcsMHhmZiwweGZiLDB4ZmYsMHhmZCwweGZmLDB4ZmUsMHg3ZiwweGZmLDB4YmYKKywweGZmLDB4ZGYsMHhmZiwweGVmLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhmZiwweGZkLDB4ZmYsMHhmZSwweGZmLDB4MDAsMHgwMCwweDAwCissMHg4MCwweDNlLDB4ZTIsMHgzNCwweDAxLDB4NzYsMHgwMywweGU5LDB4YTUsMHgwMCwweGI4LDB4MDAsMHgwMCwweGU3LDB4NGUsMHhiOQorLDB4MjgsMHgwMCwweGUyLDB4ZmUsMHhjNiwweDA2LDB4NDUsMHgzNywweDAyLDB4YmYsMHgzZiwweDI4LDB4MmUsMHg4YiwweDQ1LDB4MDgKKywweGU3LDB4NGUsMHhiOSwweDI4LDB4MDAsMHhlMiwweGZlLDB4MmUsMHg4YiwweDFkLDB4YzcsMHgwNiwweGIzLDB4MzYsMHg0MCwweDExCissMHhjNywweDA2LDB4YjEsMHgzNiwweDI3LDB4MDAsMHhjNywweDA2LDB4NDYsMHgzNywweDAyLDB4MDAsMHhjNywweDA2LDB4NDgsMHgzNworLDB4NjQsMHgwMCwweGY3LDB4MDYsMHhiNSwweDM2LDB4MDIsMHgwMCwweDc1LDB4MWMsMHgyZSwweDBiLDB4NWQsMHgwMiwweDgxLDB4MjYKKywweGIzLDB4MzYsMHhmZiwweGZlLDB4YzcsMHgwNiwweGIxLDB4MzYsMHg5YywweDAwLDB4YzcsMHgwNiwweDQ2LDB4MzcsMHgwOCwweDAwCissMHhjNywweDA2LDB4NDgsMHgzNywweDkwLDB4MDEsMHg4OSwweDFlLDB4YjcsMHgzNiwweDg5LDB4MWUsMHhmZSwweDMzLDB4YmUsMHgyMAorLDB4MDAsMHg4YiwweGMzLDB4ZTcsMHg0ZSwweGI5LDB4MjgsMHgwMCwweGUyLDB4ZmUsMHgyZSwweDhiLDB4NDUsMHgwNCwweGU3LDB4NGUKKywweGI5LDB4MjgsMHgwMCwweGUyLDB4ZmUsMHhlNSwweDRlLDB4OGIsMHhjYiwweDJlLDB4MjMsMHg0NSwweDA2LDB4MmUsMHgyMywweDRkCissMHgwNiwweDNhLDB4YzEsMHg3NCwweDM2LDB4NGUsMHg3NSwweGQ5LDB4ODAsMHgzZSwweDQ1LDB4MzcsMHgwMCwweDc0LDB4MGIsMHhjNgorLDB4MDYsMHg0NSwweDM3LDB4MDAsMHhiZiwweDJmLDB4MjgsMHhlOSwweDcyLDB4ZmYsMHhjNiwweDA2LDB4NDUsMHgzNywweDAxLDB4ZjcKKywweDA2LDB4YjUsMHgzNiwweDAyLDB4MDAsMHg3NCwweDE0LDB4ZTUsMHhjZSwweDI1LDB4ZmQsMHhmZiwweGU3LDB4Y2UsMHhlOCwweDQzCissMHgwMCwweGU1LDB4Y2UsMHgwZCwweDAyLDB4MDAsMHhlNywweGNlLDB4ZTgsMHgzOSwweDAwLDB4ODAsMHgzZSwweGUyLDB4MzQsMHgwMQorLDB4NzYsMHgwMSwweGMzLDB4YjgsMHhlYSwweDA1LDB4ZTcsMHg4YywweGZhLDB4ZTgsMHgxMiwweGY0LDB4ZmIsMHg4ZCwweDA2LDB4ZDAKKywweDM5LDB4OGIsMHhkOCwweGMxLDB4ZTgsMHgwNCwweGEzLDB4MzgsMHgzNCwweDhlLDB4YzAsMHhhMSwweDMwLDB4MzQsMHgyNiwweGEzCissMHgwMiwweDAwLDB4MjYsMHhjNywweDA2LDB4MDAsMHgwMCwweGZmLDB4ZmYsMHg4MywweGMzLDB4MTgsMHhkMSwweGViLDB4MjYsMHg4OQorLDB4MWUsMHgwOCwweDAwLDB4YzMsMHhlNSwweDAyLDB4MGQsMHgwMCwweDQwLDB4ZTcsMHgwMiwweGU1LDB4MDAsMHgwZCwweDA0LDB4MDAKKywweGU3LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhlNywweDBhLDB4ZTUsMHgwYSwweGE5LDB4MDAsMHg4MCwweDc1LDB4MTQsMHhlNSwweDA4CissMHgwZCwweDAwLDB4MTAsMHhlNywweDA4LDB4ZTUsMHgwYSwweDBkLDB4MDAsMHgwOCwweGI5LDB4MDUsMHgwMCwweGU3LDB4MGEsMHhlMgorLDB4ZmMsMHhjMywweGU1LDB4MDgsMHgwZCwweDAwLDB4MTAsMHhiOSwweDA1LDB4MDAsMHhlNywweDA4LDB4ZTIsMHhmYywweGMzLDB4MDQKKywweDBjLDB4MjAsMHgwMCwweDAxLDB4MGMsMHg3ZSwweGZmLDB4MDAsMHgwYywweDAyLDB4MDAsMHgxMCwweDAwLDB4NDAsMHgwMCwweDBjCissMHhjNiwweDAxLDB4MDAsMHgwMCwweGMwLDB4ZjcsMHhmZiwweDAwLDB4YzAsMHgwMiwweDAwLDB4MTAsMHgwMCwweDQwLDB4MDAsMHgwMAorLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4ZCwweDNlLDB4NzIsMHg0OSwweDhkLDB4MzYsMHhiMCwweDM3LDB4YjksMHgxNCwweDAwLDB4OGIKKywweDFlLDB4MzAsMHgzNCwweDg5LDB4NWMsMHgwMiwweDJlLDB4OGIsMHg0NSwweDAyLDB4ODksMHg0NCwweDA2LDB4MmUsMHg4YiwweDA1CissMHg4OSwweDQ0LDB4MDQsMHg4MywweGM3LDB4MDQsMHg4MywweGM2LDB4MTAsMHhlMiwweGU4LDB4YzYsMHgwNiwweDllLDB4MzYsMHgwZQorLDB4ZTgsMHhmZCwweDI2LDB4NjgsMHg4MywweDI4LDB4YTEsMHhhYSwweDAyLDB4Y2QsMHgzNSwweDgzLDB4M2UsMHhhMSwweDM2LDB4MDAKKywweDc0LDB4MDMsMHhlOSwweDNiLDB4MjcsMHgzMywweGZmLDB4OGUsMHgwNiwweGE2LDB4MDIsMHg4YiwweDM2LDB4YTQsMHgwMiwweDJlCissMHhmZiwweGE0LDB4MmUsMHgzMCwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQsMHhjNywweDA2LDB4MzcsMHgzNywweDAxLDB4MDAsMHhjNgorLDB4MDYsMHhjYSwweDM0LDB4MDEsMHhlOSwweDdkLDB4MTksMHg4MCwweDNlLDB4YTAsMHgzNiwweDA4LDB4NzQsMHhlNiwweDgwLDB4MjYKKywweDllLDB4MzYsMHhmZiwweDc1LDB4MWEsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NCwweDEyLDB4ZjcsMHgwNiwweDliCissMHgzNiwweDAzLDB4MDAsMHg3NSwweDBhLDB4ODMsMHgwZSwweDY2LDB4MzcsMHgxMCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDgsMHhlOQorLDB4ZmIsMHgwMSwweDgwLDB4M2UsMHg5ZSwweDM2LDB4MDIsMHg3NSwweGNlLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweGU5LDB4ZWMKKywweDAxLDB4YzMsMHhlOSwweGU4LDB4MDEsMHgyNiwweGM3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwMCwweDI2LDB4ZmYsMHgyNiwweDA0CissMHgwMCwweGExLDB4ZDEsMHgzNiwweDI2LDB4MzksMHgwNiwweDFhLDB4MDAsMHg3NSwweDIyLDB4YTEsMHhkMywweDM2LDB4MjYsMHgzOQorLDB4MDYsMHgxYywweDAwLDB4NzUsMHgxOCwweGExLDB4ZDUsMHgzNiwweDI2LDB4MzksMHgwNiwweDFlLDB4MDAsMHg3NSwweDBlLDB4MjYKKywweGY3LDB4MDYsMHgwYywweDAwLDB4NDAsMHgwMCwweDc0LDB4MDUsMHg4MywweDBlLDB4NjYsMHgzNywweDQwLDB4ODEsMHgwZSwweGFmCissMHgzNiwweDAwLDB4MTAsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwMiwweDc1LDB4MDYsMHhjZAorLDB4MzQsMHhlOSwweGEyLDB4MWEsMHhjMywweGY3LDB4MDYsMHg5YiwweDM2LDB4MTAsMHgwMCwweDc1LDB4NTQsMHgyNiwweGY2LDB4MDYKKywweDBhLDB4MDAsMHhmZiwweDc1LDB4NGMsMHgyNiwweGEwLDB4MTksMHgwMCwweDI0LDB4YzAsMHgzYywweDQwLDB4NzUsMHgxMSwweDgwCissMHgzZSwweDk1LDB4MzYsMHgwMCwweDc0LDB4M2IsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZmYsMHhmZiwweGU5LDB4MzEsMHgwMAorLDB4ZTgsMHhmMSwweDA0LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMywweDAwLDB4NzQsMHgyZiwweDhiLDB4ZDgsMHhiOCwweDdkLDB4MDMKKywweGNkLDB4M2EsMHg4YiwweGMzLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDIsMHgwMCwweDc1CissMHgwNSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHg4MSwweDBlLDB4OWIsMHgzNiwweDgwLDB4MDAsMHg4MywweDI2LDB4OWIsMHgzNgorLDB4ZmMsMHhlOSwweDIzLDB4MDEsMHhlOCwweDg3LDB4MWQsMHhlOSwweDMzLDB4MDEsMHg1MCwweDI2LDB4YTEsMHgwYywweDAwLDB4MjUKKywweDA3LDB4MDAsMHgzZCwweDA3LDB4MDAsMHg3NSwweDAzLDB4ZTksMHg4NCwweDAwLDB4M2QsMHgwNSwweDAwLDB4NzUsMHgwMywweGU5CissMHg3YywweDAwLDB4ODMsMHgzZSwweGU4LDB4M2EsMHgwNCwweDc0LDB4NzUsMHg4MywweDNlLDB4ZTgsMHgzYSwweDAyLDB4NzQsMHg2ZQorLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgxOCwweDgwLDB4NzUsMHgwMywweGU5LDB4NmEsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MDAKKywweDgwLDB4NzQsMHgzNSwweDI2LDB4ODAsMHgzZSwweDI5LDB4MDAsMHgwMiwweDc1LDB4MmQsMHg1MSwweDU2LDB4NTcsMHg4ZCwweDM2CissMHgzZSwweDM0LDB4OGQsMHgzZSwweDIwLDB4MDAsMHhiOSwweDA2LDB4MDAsMHhmMywweGE2LDB4NWYsMHg1ZSwweDU5LDB4NzQsMHg0NQorLDB4MjYsMHhhMSwweDIwLDB4MDAsMHhhMywweDNlLDB4MzQsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4NDAsMHgzNCwweDI2LDB4YTEKKywweDI0LDB4MDAsMHhhMywweDQyLDB4MzQsMHhlOSwweDI2LDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDA4LDB4MDAsMHg3NCwweDBiCissMHgyNiwweDgwLDB4M2UsMHgxOSwweDAwLDB4MDAsMHg3NCwweDAzLDB4ZTksMHgxMywweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgxMAorLDB4MDAsMHg3NCwweDEyLDB4MjYsMHhhMCwweDI4LDB4MDAsMHhjMCwweGU4LDB4MDQsMHgyMiwweGMwLDB4NzQsMHgwNywweDI2LDB4YzcKKywweDA2LDB4MDQsMHgwMCwweGZmLDB4ZmYsMHg1OCwweDIzLDB4YzAsMHg3NCwweDAzLDB4ZTksMHg1NywweGZmLDB4ODEsMHgyNiwweDliCissMHgzNiwweGZmLDB4ZmUsMHg4MywweGZlLDB4MDYsMHg3ZiwweDI0LDB4MjYsMHhhMSwweDIwLDB4MDAsMHgzYiwweDA2LDB4ZDEsMHgzNgorLDB4NzUsMHgxYSwweDI2LDB4YTEsMHgyMiwweDAwLDB4M2IsMHgwNiwweGQzLDB4MzYsMHg3NSwweDEwLDB4MjYsMHhhMSwweDI0LDB4MDAKKywweDNiLDB4MDYsMHhkNSwweDM2LDB4NzUsMHgwNiwweDgxLDB4MGUsMHg5YiwweDM2LDB4MDAsMHgwMSwweDI2LDB4YTEsMHgyMCwweDAwCissMHgyNSwweDdmLDB4ZmYsMHhhMywweGI4LDB4MzQsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4YmEsMHgzNCwweDI2LDB4YTEsMHgyNAorLDB4MDAsMHhhMywweGJjLDB4MzQsMHg4YiwweGM2LDB4ODYsMHhjNCwweGEzLDB4YzAsMHgzNCwweGQxLDB4ZTYsMHg4MCwweGZjLDB4MDkKKywweDc0LDB4MDMsMHhlOCwweGFhLDB4MWMsMHg4YiwweGM2LDB4MmUsMHhmZiwweGE0LDB4MzAsMHg0OSwweDI2LDB4YTEsMHgwYywweDAwCissMHgzZCwweGZmLDB4N2YsMHg3NCwweDBmLDB4MjYsMHhmZiwweDI2LDB4MDQsMHgwMCwweDhlLDB4MDYsMHgzOCwweDM0LDB4ZTgsMHgzNgorLDB4MDYsMHhjZCwweDUwLDB4YzMsMHhlOSwweDE2LDB4MDAsMHhjZCwweDM0LDB4ZTksMHgxMSwweDAwLDB4Y2QsMHgzNCwweDg5LDB4MzYKKywweDNkLDB4MzcsMHhhMSwweDlkLDB4MzYsMHhhMywweDNmLDB4MzcsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBjLDB4ZTgsMHg4ZSwweDAwCissMHhhMSwweDlmLDB4MzYsMHgyMiwweGU0LDB4NzUsMHgzMiwweGY3LDB4MDYsMHg0YywweDM3LDB4MDEsMHgwMCwweDc1LDB4MmEsMHhmNgorLDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDA3LDB4ODgsMHgyNiwweDllLDB4MzYsMHhlOSwweDMxLDB4MDAsMHgzYSwweDA2LDB4OWQKKywweDM2LDB4YTMsMHg5ZCwweDM2LDB4NzQsMHgyOCwweDhiLDB4ZjAsMHgyZSwweGZmLDB4YTQsMHgwZCwweDJiLDB4NDQsMHgyOSwweGVlCissMHg0MiwweDE5LDB4NDQsMHhjZCwweDQ0LDB4MmYsMHg0NSwweDVhLDB4NDUsMHgzYSwweDI2LDB4OWUsMHgzNiwweDc1LDB4MDEsMHhjMworLDB4MzIsMHhjMCwweDg2LDB4YzQsMHg4YiwweGYwLDB4YTIsMHg5ZSwweDM2LDB4MmUsMHhmZiwweGE0LDB4MjAsMHg0OSwweDhiLDB4MmUKKywweDk5LDB4MzYsMHgyMywweGVkLDB4NzUsMHgwMSwweGMzLDB4YmYsMHgwMSwweDAwLDB4YmUsMHgwMCwweDAwLDB4ODUsMHhmZCwweDc1CissMHgxYSwweDQ2LDB4ZDEsMHhlNywweGU5LDB4ZjYsMHhmZiwweDJhLDB4MDAsMHgyOSwweDAwLDB4MjgsMHgwMCwweDI3LDB4MDAsMHgyNQorLDB4MDAsMHgwNSwweDAwLDB4MDcsMHgwMCwweDI2LDB4MDAsMHgwNiwweDAwLDB4MjAsMHgwMCwweGY3LDB4ZDcsMHgyMSwweDNlLDB4OTkKKywweDM2LDB4ZDEsMHhlNiwweDJlLDB4OGIsMHhiNCwweDQ3LDB4MmIsMHhlOSwweDRmLDB4ZmYsMHhlOSwweDU2LDB4ZmYsMHg4MCwweDI2CissMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDE3LDB4ZjcsMHgwNiwweDRjLDB4MzcsMHgwMSwweDAwLDB4NzUsMHgwZiwweGY2LDB4MDYsMHg5ZAorLDB4MzYsMHg4MCwweDc0LDB4MDgsMHhmNywweDA2LDB4NjYsMHgzNywweGZmLDB4ZmYsMHg3NSwweDA3LDB4YzcsMHgwNiwweDY2LDB4MzcKKywweDAwLDB4MDAsMHhjMywweGY3LDB4MDYsMHg0MSwweDM3LDB4MDEsMHgwMCwweDc1LDB4MGIsMHhiOCwweDdmLDB4MDMsMHhjZCwweDM5CissMHhjNywweDA2LDB4NDEsMHgzNywweDAxLDB4MDAsMHgzMywweGY2LDB4YjgsMHgwMCwweDQwLDB4ODUsMHgwNiwweDY2LDB4MzcsMHg3NAorLDB4MjEsMHg4MCwweGJjLDB4NTQsMHgzNywweGZmLDB4NzQsMHgwNCwweGZlLDB4ODQsMHg1NCwweDM3LDB4ODAsMHhiYywweDk2LDB4MzQKKywweGZmLDB4NzQsMHgwNCwweGZlLDB4ODQsMHg5NiwweDM0LDB4MzEsMHgwNiwweDY2LDB4MzcsMHg4MywweDNlLDB4NjYsMHgzNywweDAwCissMHg3NCwweDA1LDB4NDYsMHhkMSwweGU4LDB4NzMsMHhkNCwweGMzLDB4YTEsMHhmNCwweDMzLDB4YTksMHgwMCwweDg4LDB4NzQsMHgwYgorLDB4YTksMHgwMCwweDEwLDB4NzUsMHgwOSwweDhiLDB4MWUsMHg0MywweDM3LDB4ZmYsMHhlMywweGU5LDB4ZDcsMHgwMCwweGM3LDB4MDYKKywweDM1LDB4MzcsMHgwNSwweDAwLDB4YzcsMHgwNiwweDQzLDB4MzcsMHgxZSwweDJjLDB4ZjcsMHgwNiwweGY0LDB4MzMsMHgwMCwweDA4CissMHg3NCwweDA2LDB4YzcsMHgwNiwweDQzLDB4MzcsMHgxMCwweDJjLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzOSwweGU5LDB4Y2QsMHhmZQorLDB4YTksMHgwMCwweDA4LDB4NzQsMHhkOSwweGZmLDB4MGUsMHgzNSwweDM3LDB4NzUsMHhlZCwweGU5LDB4NjYsMHgwMCwweGE5LDB4MDAKKywweDA4LDB4NzUsMHhjYiwweGZmLDB4MGUsMHgzNSwweDM3LDB4NzUsMHhkZiwweDgxLDB4MGUsMHhjMiwweDM0LDB4YzAsMHgwMCwweGY2CissMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4NDgsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4ODAsMHhmNywweDA2LDB4OWIsMHgzNgorLDB4MDEsMHgwMCwweDc0LDB4MWUsMHhiOCwweDdkLDB4MDMsMHhjZCwweDNhLDB4ODEsMHgwZSwweDliLDB4MzYsMHg4MCwweDAwLDB4ODMKKywweDI2LDB4OWIsMHgzNiwweGZlLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwMiwweDAwLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNCwweGU5CissMHg3YiwweGZlLDB4ODAsMHgzZSwweGEwLDB4MzYsMHgwNCwweDc1LDB4MDcsMHg4MywweDNlLDB4MGYsMHgzNywweDAxLDB4NzUsMHgwNQorLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDIsMHgwMCwweGU5LDB4NWYsMHhmZSwweGJlLDB4MDIKKywweDAwLDB4ZTksMHg0YSwweGZlLDB4ODAsMHgyNiwweDllLDB4MzYsMHhmZiwweDc1LDB4M2EsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwCissMHg3NCwweDJkLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzUsMHgyYiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhmZgorLDB4MDYsMHg5NCwweDM0LDB4ODMsMHgwZSwweDY2LDB4MzcsMHgyMCwweDhlLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEKKywweDAwLDB4MDAsMHgwMSwweDc0LDB4MDcsMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgwMSwweGU5LDB4MDYsMHgwMCwweGJlCissMHgwNCwweDAwLDB4ZTksMHgwOSwweGZlLDB4ODEsMHgwZSwweGFmLDB4MzYsMHgwMCwweDA4LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNgorLDB4ZTUsMHgwYSwweGE5LDB4MDAsMHg4MCwweDc0LDB4MGUsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZjcsMHhhMSwweGFmLDB4MzYKKywweGU3LDB4MDYsMHhlOSwweDA5LDB4ZmYsMHhlOSwweGY1LDB4ZmQsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHg4MywweDBlCissMHg5OSwweDM2LDB4MDIsMHhlOSwweGU3LDB4ZmQsMHg4MCwweDI2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHgxZCwweGY3LDB4MDYsMHg5YgorLDB4MzYsMHgwMCwweDQwLDB4NzUsMHgwNSwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDgsMHg4MywweDBlLDB4OTksMHgzNiwweDIwLDB4ODEKKywweDI2LDB4OWIsMHgzNiwweGZmLDB4YmYsMHhiOCwweDg1LDB4MDMsMHhjZCwweDM5LDB4ZTksMHhjMCwweGZkLDB4ODAsMHgzZSwweDllCissMHgzNiwweDA2LDB4NzQsMHgwNywweDgwLDB4M2UsMHg5ZSwweDM2LDB4MGEsMHg3NSwweDM0LDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MAorLDB4NzUsMHgwNiwweGJlLDB4MDcsMHgwMCwweGU5LDB4OTYsMHhmZCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHg4MywweDNlLDB4MGYKKywweDM3LDB4MDIsMHg3NCwweDFiLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNCwweDAwLDB4ODAsMHgzZSwweDllLDB4MzYsMHgwNiwweDc1CissMHgwZSwweGY3LDB4MDYsMHg5YiwweDM2LDB4NDAsMHgwMCwweDc1LDB4MDYsMHhjNywweDA2LDB4MGYsMHgzNywweDAzLDB4MDAsMHhlOQorLDB4N2IsMHhmZCwweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDQsMHg3NSwweDEyLDB4ODEsMHgwZSwweGMyLDB4MzQsMHgwMCwweDQwLDB4ZmYKKywweDA2LDB4OTIsMHgzNCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweDYyLDB4ZmQsMHhiZSwweDA1LDB4MDAsMHhlOSwweDRkCissMHhmZCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDE5LDB4ODMsMHgwZSwweGMyLDB4MzQsMHgwNCwweGJlLDB4MDYsMHgwMAorLDB4ZTksMHgzYiwweGZkLDB4ODAsMHgyNiwweDllLDB4MzYsMHhmZiwweDc1LDB4YzUsMHhmZiwweDA2LDB4MzEsMHgzNywweGU5LDB4MDAKKywweDAwLDB4ODMsMHgyNiwweGMyLDB4MzQsMHhiZiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweDJmLDB4ZmQsMHhlNSwweDBhCissMHg1MCwweDI1LDB4YzMsMHhiZiwweGU3LDB4MGEsMHg1OCwweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDBkLDB4YTksMHgwMAorLDB4NDAsMHg3NSwweDA4LDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweGU5LDB4MTIsMHhmZCwweGI4LDB4ODMsMHgwMywweGNkLDB4MzkKKywweGMzLDB4YjgsMHg3YywweDAzLDB4Y2QsMHgzOSwweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgxMCwweDc1LDB4MDksMHhjNywweDA2CissMHgzMywweDM3LDB4MDIsMHgwMCwweGU5LDB4ZjYsMHhmYywweGZmLDB4MGUsMHgzMywweDM3LDB4NzQsMHgwMywweGU5LDB4ZWQsMHhmYworLDB4ZmYsMHgwNiwweDhlLDB4MzQsMHhlOCwweGY3LDB4MTksMHg4MywweDBlLDB4YzIsMHgzNCwweDA4LDB4YmUsMHgwMywweDAwLDB4ZTkKKywweGNjLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDQsMHgwNCwweDA1CissMHgwNCwweDA0LDB4MDQsMHgwMCwweDAzLDB4MDAsMHgwMywweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwNCwweDAwLDB4MDgsMHgwOCwweDA1LDB4MDgsMHgwOCwweDA4LDB4MDAsMHgwMywweDAwLDB4MDMsMHgwMywweDAwLDB4MDAKKywweDAyLDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MGEsMHgxNCwweDAwLDB4MDAsMHgxYSwweDAwCissMHgxYywweDAwLDB4MWUsMHgyMCwweDAwLDB4MDAsMHgwNCwweDQxLDB4MDYsMHgwYiwweDA4LDB4YzIsMHhmZiwweGU3LDB4MDQsMHgwMworLDB4MDYsMHgwNCwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHg4NywweDA0LDB4MDMsMHgwNiwweDA0LDB4MDQsMHg4NSwweDRlLDB4YTIKKywweDA0LDB4Y2YsMHgwNCwweGNkLDB4YzcsMHgwNiwweGEyLDB4MzcsMHgwMCwweDAwLDB4YzcsMHgwNiwweGE2LDB4MzcsMHgwMCwweDAwCissMHgyNiwweGExLDB4MjAsMHgwMCwweDI1LDB4N2YsMHhmZiwweGEzLDB4ZjUsMHgzNiwweDI2LDB4YTEsMHgyMiwweDAwLDB4YTMsMHhmNworLDB4MzYsMHgyNiwweGExLDB4MjQsMHgwMCwweGEzLDB4ZjksMHgzNiwweGU4LDB4M2IsMHgxOSwweDhiLDB4ZjAsMHgyNiwweDhiLDB4MGUKKywweDBlLDB4MDAsMHgyYiwweGM4LDB4ODMsMHhlOSwweDBlLDB4YjgsMHgwMSwweDgwLDB4ODMsMHhmOSwweDA0LDB4N2MsMHg1MSwweDI2CissMHg4YSwweDU0LDB4MjgsMHg4OCwweDE2LDB4MWMsMHgzNywweDQwLDB4MjYsMHg4YiwweDZjLDB4MjYsMHg4NiwweGNkLDB4M2IsMHhjZAorLDB4ODYsMHhjZCwweDg5LDB4MGUsMHhhNCwweDM3LDB4NzUsMHgzOCwweDQwLDB4MzIsMHhmZiwweDI2LDB4OGEsMHg1YywweDI5LDB4ODAKKywweGZiLDB4MTUsMHg3NywweDI1LDB4ODAsMHhmYiwweDBhLDB4NzQsMHgyMCwweDgwLDB4ZmIsMHgwMSwweDc0LDB4MWIsMHhiOCwweDA0CissMHg4MCwweDJlLDB4M2EsMHg5NywweDAyLDB4MmUsMHg3NCwweDA3LDB4MmUsMHgzYSwweDk3LDB4MTgsMHgyZSwweDc1LDB4MTEsMHgzMworLDB4YzAsMHg4MCwweGZiLDB4MDksMHg3NSwweDRmLDB4OGIsMHhmMywweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGZmLDB4ZmYKKywweDUwLDB4NTIsMHhhMSwweGE0LDB4MzcsMHg4NiwweGM0LDB4MjYsMHgzYiwweDA2LDB4MjYsMHgwMCwweDdjLDB4MzIsMHgyNiwweDgxCissMHgzZSwweDI2LDB4MDAsMHgwMCwweDA0LDB4N2UsMHgyOSwweDhkLDB4NzQsMHgyYSwweDI2LDB4OGIsMHgxNCwweDIyLDB4ZDIsMHg3NAorLDB4MWYsMHg4MCwweGU2LDB4YmYsMHg4MCwweGZlLDB4MDksMHg3NSwweDE3LDB4YzcsMHgwNiwweGEyLDB4MzcsMHgwMSwweDAwLDB4ODAKKywweGZhLDB4MDQsMHg3NSwweDBjLDB4MjYsMHg4YiwweDQ0LDB4MDIsMHhhMywweDAzLDB4MzcsMHg4NiwweGM0LDB4YTMsMHhkMCwweDM0CissMHg1YSwweDU4LDB4ZTksMHhiMSwweGZmLDB4YmQsMHg3MiwweDM3LDB4MmUsMHg4YSwweDg3LDB4MmUsMHgyZSwweDIyLDB4YzAsMHg3NAorLDB4MTYsMHgwNSwweDQ0LDB4MmUsMHg4YiwweGY4LDB4MmUsMHg4YiwweDA1LDB4M2UsMHg4OSwweDQ2LDB4MDAsMHg4MywweGM1LDB4MDIKKywweDgzLDB4YzcsMHgwMiwweDIyLDB4ZTQsMHg3ZCwweGVmLDB4OGQsMHg3NCwweDJhLDB4ODMsMHhlOSwweDA0LDB4NzUsMHgwMywweGU5CissMHhhMSwweDAwLDB4MjYsMHg4YiwweDE0LDB4MjIsMHhkMiwweDc1LDB4MDMsMHhlOSwweDdjLDB4MDAsMHhjNywweDA2LDB4YTYsMHgzNworLDB4MDEsMHgwMCwweGJmLDB4NzIsMHgzNywweDhiLDB4MDUsMHg4MywweGM3LDB4MDIsMHg4MCwweGU2LDB4YmYsMHg4MCwweGU0LDB4M2YKKywweDgwLDB4ZmUsMHgwOSwweDc1LDB4MjIsMHg4MCwweGZhLDB4MDQsMHg3NSwweDVlLDB4YzcsMHgwNiwweGEyLDB4MzcsMHgwMSwweDAwCissMHgyNiwweDhiLDB4NDQsMHgwMiwweGEzLDB4MDMsMHgzNywweDg2LDB4YzQsMHhhMywweGQwLDB4MzQsMHg4NiwweGM0LDB4YzcsMHgwNgorLDB4YTYsMHgzNywweDAwLDB4MDAsMHhlOSwweDQ3LDB4MDAsMHgzYiwweGZkLDB4N2UsMHgxNSwweDI2LDB4OGIsMHgwNCwweGE4LDB4NDAKKywweDc0LDB4MDYsMHhiOCwweDA3LDB4ODAsMHhlOSwweDM4LDB4ZmYsMHgzMiwweGMwLDB4MjYsMHg4YiwweDA0LDB4ZTksMHgyZSwweDAwCissMHgzYSwweGY0LDB4NzUsMHhiMSwweGM3LDB4NDUsMHhmZSwweDAwLDB4MDAsMHg4MCwweGZlLDB4MjIsMHg3NSwweDBkLDB4M2EsMHhkMAorLDB4NzcsMHgxNiwweGM3LDB4MDYsMHhhNiwweDM3LDB4MDAsMHgwMCwweGU5LDB4MTMsMHgwMCwweDNhLDB4ZDAsMHg3NSwweDA5LDB4YzcKKywweDA2LDB4YTYsMHgzNywweDAwLDB4MDAsMHhlOSwweDA2LDB4MDAsMHhiOCwweDA1LDB4ODAsMHhlOSwweDAyLDB4ZmYsMHgzMiwweGY2CissMHgwMywweGYyLDB4MmIsMHhjYSwweGI4LDB4MDUsMHg4MCwweDIzLDB4YzksMHg3NiwweDAzLDB4ZTksMHg2NCwweGZmLDB4NzQsMHgwMworLDB4ZTksMHhlZCwweGZlLDB4MzMsMHhjMCwweGJmLDB4NzIsMHgzNywweDhiLDB4MTUsMHg0NywweDQ3LDB4M2IsMHhmZCwweDdmLDB4MWIKKywweGY2LDB4YzYsMHg4MCwweDc0LDB4MTYsMHhmNywweDA2LDB4YTYsMHgzNywweDAxLDB4MDAsMHg3NCwweDA2LDB4YjgsMHgwOCwweDgwCissMHhlOSwweGMzLDB4ZmUsMHhmNiwweGM2LDB4NDAsMHg3NCwweGUwLDB4YjgsMHgwNywweDgwLDB4ZTksMHhiOCwweGZlLDB4N2QsMHg0MgorLDB4YTMsMHg0NSwweDQ0LDB4MjksMHg0NCwweDI5LDB4YjcsMHgyOCwweGUyLDB4MjgsMHhlZSwweDJiLDB4ZjIsMHgyOCwweGY1LDB4MjgKKywweDAxLDB4MjksMHhhYywweDJhLDB4NDQsMHgyOSwweDQ0LDB4MjksMHg0NCwweDI5LDB4NDQsMHgyOSwweDQ0LDB4MjksMHgwMCwweDAwCissMHg3MywweDM2LDB4MDAsMHgwMCwweDAzLDB4MzYsMHhjNSwweDM1LDB4ODMsMHgzNSwweDQ1LDB4MzUsMHgwNywweDM1LDB4ZDIsMHgzNAorLDB4NDUsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHhhNiwweDM4LDB4MDAsMHgwMCwweGUwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4ZjIsMHgzMywweDAwLDB4MDAsMHhhNiwweDMzLDB4NjAsMHgzMywweGZkLDB4MzIsMHhiYywweDMyLDB4NzcsMHgzMiwweDNjLDB4MzIKKywweGZiLDB4MzEsMHg2YSwweDMxLDB4MGEsMHgzMSwweGUwLDB4ZTAsMHgxMCwweDEwLDB4MTAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgwMCwweGUwLDB4ZTAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweGUwLDB4ZTAKKywweGUwLDB4MzMsMHhmZiwweDI2LDB4ZjYsMHgwNiwweDFhLDB4MDAsMHg4MCwweDc0LDB4MWIsMHgyNiwweDgwLDB4MjYsMHgxYSwweDAwCissMHg3ZiwweDI2LDB4OGIsMHgzZSwweDI2LDB4MDAsMHg4MywweGU3LDB4MWYsMHg3NCwweDBiLDB4MjYsMHg4MCwweDBlLDB4MjAsMHgwMAorLDB4ODAsMHgyNiwweDAxLDB4M2UsMHgwZSwweDAwLDB4YzMsMHg2MCwweDJlLDB4OGIsMHg4NCwweGE2LDB4MzAsMHgyNiwweGEzLDB4MTgKKywweDAwLDB4ZDEsMHhlNiwweDJlLDB4ZmYsMHg5NCwweDUwLDB4MzAsMHg2MSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGM0CissMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxNiwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAsMHgyNgorLDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4YmYsMHgwNSwweGU4LDB4OTgsMHgwNSwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAKKywweDAwLDB4MDgsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4NDAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MmEsMHhiZiwweDJhCissMHgwMCwweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyYSwweGExLDB4OTMsMHgzNywweDMzLDB4ZGIsMHhhOQorLDB4NDAsMHgwMCwweDc1LDB4MDIsMHhiMywweDAxLDB4YTksMHgwMCwweDEwLDB4NzQsMHgwMiwweGI3LDB4ODgsMHhhOSwweDAwLDB4MDgKKywweDc0LDB4MDMsMHg4MCwweGNmLDB4NDQsMHgyNiwweDg5LDB4NWQsMHgwMiwweGMzLDB4ODMsMHgwZSwweGMyLDB4MzQsMHgyMCwweDI2CissMHhjNywweDA2LDB4MDQsMHgwMCwweDZiLDB4MmIsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzAsMHgwMCwweDI2LDB4YzcsMHgwNgorLDB4MDYsMHgwMCwweDBhLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwYSwweDAwLDB4MDQsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAKKywweDAwLDB4ZTgsMHg2OSwweDA1LDB4ZTgsMHgyYywweDA1LDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MjIsMHgyNiwweGM2CissMHgwNiwweDI4LDB4MDAsMHg2MCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgyOSwweGJmLDB4MmEsMHgwMCwweDI2LDB4YzYsMHgwNQorLDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDJkLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHg1NCwweDM3LDB4YjksMHgwMywweDAwLDB4ZjMKKywweGE1LDB4MjYsMHhjNiwweDA1LDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDJlLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHg1YSwweDM3CissMHhiOSwweDAzLDB4MDAsMHhmMywweGE1LDB4ZTgsMHhkNCwweDA1LDB4ZTgsMHg2NCwweDA1LDB4YjksMHgwNiwweDAwLDB4YmUsMHg1NAorLDB4MzcsMHg4ZCwweDJlLDB4MmMsMHgwMCwweDI2LDB4OGIsMHg0NiwweDAwLDB4MjksMHgwNCwweDgzLDB4YzYsMHgwMiwweDgzLDB4YzUKKywweDAyLDB4ODMsMHhmOSwweDA0LDB4NzUsMHgwMiwweDQ1LDB4NDUsMHhlMiwweGViLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwCissMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDI0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMAorLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHhlNCwweDA0LDB4ZTgsMHhhNywweDA0LDB4MjYsMHhjNywweDA2LDB4MjYKKywweDAwLDB4MDAsMHgxNiwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg2MCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgyOCwweGJmCissMHgyYSwweDAwLDB4ZTgsMHg1YiwweDA2LDB4ZTgsMHg3NCwweDA1LDB4ZTgsMHgwNCwweDA1LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNAorLDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDFhLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYKKywweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHhhMywweDA0LDB4ZTgsMHg2NiwweDA0LDB4MjYsMHhjNywweDA2CissMHgyNiwweDAwLDB4MDAsMHgwYywweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg2MCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgyNworLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHgyMSwweDA1LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcKKywweDA2LDB4MGUsMHgwMCwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MGEsMHgwMCwweDI2LDB4YzcsMHgwNiwweDBhCissMHgwMCwweDA0LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDRiLDB4MDQsMHhlOCwweDI0LDB4MDQsMHgyNgorLDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDEyLDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDQwLDB4MjYsMHhjNiwweDA2LDB4MjkKKywweDAwLDB4MjYsMHhiZiwweDJhLDB4MDAsMHhlOCwweGY0LDB4MDQsMHhlOCwweDg0LDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0CissMHgwMCwweGM0LDB4MmEsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzQsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNgorLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDBkLDB4MDQsMHhlOCwweGU2LDB4MDMsMHgyNiwweGM3LDB4MDYKKywweDI2LDB4MDAsMHgwMCwweDI2LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDQwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDI1CissMHhiZiwweDJhLDB4MDAsMHhlOCwweGI2LDB4MDQsMHhlOCwweDQ2LDB4MDQsMHhlOCwweGZhLDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNgorLDB4MDQsMHgwMCwweGM0LDB4MmEsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzgsMHgwMCwweGExLDB4YTIsMHgzNywweDUwLDB4MGIKKywweGMwLDB4NzUsMHgwNywweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgzNCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2CissMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4OTksMHgwMywweGU4LDB4YTQsMHhmZCwweDI2LDB4YzcsMHg0NQorLDB4MjYsMHgwMCwweDJhLDB4NTgsMHgwYiwweGMwLDB4NzUsMHgwNiwweDI2LDB4YzcsMHg0NSwweDI2LDB4MDAsMHgyNiwweGExLDB4MWMKKywweDM3LDB4YzEsMHhlMCwweDA0LDB4MjYsMHg4OCwweDQ1LDB4MjgsMHgyNiwweGM2LDB4NDUsMHgyOSwweDI0LDB4ODMsMHhjNywweDJhCissMHhlOCwweDI5LDB4MDQsMHhlOCwweGEwLDB4MDQsMHhlOCwweDIyLDB4MDUsMHhlOCwweGY4LDB4MDMsMHhlOCwweDA5LDB4MDQsMHhjMworLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGM0LDB4MmEsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzIsMHgwMCwweDI2LDB4YzcKKywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDQ1LDB4MDMsMHhlOCwweDUwCissMHhmZCwweDI2LDB4YzcsMHg0NSwweDI2LDB4MDAsMHgyNCwweGExLDB4MWMsMHgzNywweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NQorLDB4MjgsMHgyNiwweGM2LDB4NDUsMHgyOSwweDIzLDB4ODMsMHhjNywweDJhLDB4ZTgsMHhlMCwweDAzLDB4ZTgsMHg2YywweDA0LDB4ZTgKKywweDhhLDB4MDQsMHhlOCwweDljLDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2CissMHgwZSwweDAwLDB4MzQsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMAorLDB4MDAsMHhlOCwweGZmLDB4MDIsMHhlOCwweDBhLDB4ZmQsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MjYsMHhhMSwweDFjLDB4MzcKKywweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NSwweDI4LDB4MjYsMHhjNiwweDQ1LDB4MjksMHgyMiwweDgzLDB4YzcsMHgyYSwweGU4CissMHg5YSwweDAzLDB4ZTgsMHhjNywweDAzLDB4ZTgsMHg1NywweDAzLDB4ZTgsMHhmOCwweDAzLDB4ZTgsMHg3OCwweDA0LDB4ZTgsMHg4YQorLDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg3NCwweDQ1LDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDNlLDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDA0LDB4MDAsMHgyNiwweGM2CissMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4ZmMsMHgwMiwweGU4LDB4YTksMHgwMiwweDgzLDB4M2UsMHg4ZCwweDM3LDB4MDMsMHg3NQorLDB4MDEsMHg5MCwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDMwLDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDUwLDB4MjYKKywweGM2LDB4MDYsMHgyOSwweDAwLDB4MjAsMHhiZiwweDJhLDB4MDAsMHhlOCwweGQwLDB4MDMsMHhlOCwweDAxLDB4MDMsMHhlOCwweGI1CissMHgwMywweGU4LDB4OWYsMHgwMywweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDYxLDB4NDMsMHhiOSwweGYwLDB4MDAsMHg4MworLDB4ZTksMHgwMiwweDI2LDB4ODksMHgwZSwweDBlLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDIsMHgwMCwweDI2LDB4YzYKKywweDA2LDB4MTksMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWEsMHgwMCwweDAwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxYywweDAwCissMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMCwweDAwLDB4MDAsMHhlOCwweDQ3LDB4MDIsMHg4MywweGU5LDB4MGUsMHg4NgorLDB4Y2QsMHgyNiwweDg5LDB4MGUsMHgyNiwweDAwLDB4ODYsMHhjZCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYKKywweDA2LDB4MjksMHgwMCwweDA4LDB4YmYsMHgyYSwweDAwLDB4ODMsMHhlOSwweDA0LDB4MjYsMHg4OSwweDBkLDB4MjYsMHhjNiwweDQ1CissMHgwMSwweDI2LDB4OGQsMHg3ZCwweDAyLDB4ODMsMHhlOSwweDAyLDB4YmIsMHgwMSwweDAwLDB4YjgsMHgzMCwweDMwLDB4NGIsMHg3NQorLDB4MTcsMHhiYiwweDBhLDB4MDAsMHg4YSwweGM0LDB4MjYsMHg4OCwweDA1LDB4YjAsMHgzMSwweDgwLDB4YzQsMHgwMSwweDgwLDB4ZmMKKywweDNhLDB4NzUsMHgwYSwweGI0LDB4NjEsMHhlOSwweDA1LDB4MDAsMHgyNiwweDg4LDB4MDUsMHgwNCwweDAxLDB4NDcsMHg0OSwweDc1CissMHhkZCwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDA0LDB4NDUsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTIsMHgwMAorLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDEsMHhlOCwweGU1LDB4MDEKKywweGU4LDB4ZDAsMHgwMSwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDA0LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDAwCissMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MDcsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNworLDB4MDYsMHgwZSwweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTkKKywweDAwLDB4MDYsMHhlOCwweDA0LDB4MDIsMHhlOCwweDliLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2CissMHhjNiwweDA2LDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA2LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHg2YgorLDB4MDIsMHhlOCwweGZiLDB4MDEsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUKKywweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDA1CissMHhlOCwweGM2LDB4MDEsMHhlOCwweDVkLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2LDB4YzYsMHgwNgorLDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA1LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHgyZCwweDAyLDB4ZTgKKywweGJkLDB4MDEsMHhjMywweGZmLDB4MDYsMHg4MiwweDM0LDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDNkLDB4NDEsMHgyNiwweGM3CissMHgwNiwweDBlLDB4MDAsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDBlLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOQorLDB4MDAsMHgwNCwweGU4LDB4ODQsMHgwMSwweGU4LDB4MWIsMHgwMSwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDEyLDB4MjYKKywweGM2LDB4MDYsMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MDQsMHhiZiwweDJhLDB4MDAsMHhlOCwweGViCissMHgwMSwweGU4LDB4N2IsMHgwMSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDY3LDB4NDIsMHgyNiwweGM3LDB4MDYsMHgwZQorLDB4MDAsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA4LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDMKKywweGU4LDB4NDYsMHgwMSwweGU4LDB4ZGQsMHgwMCwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDEyLDB4MjYsMHhjNiwweDA2CissMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MDMsMHhiZiwweDJhLDB4MDAsMHhlOCwweGFkLDB4MDEsMHhlOAorLDB4M2QsMHgwMSwweGMzLDB4ZmYsMHgwNiwweDg0LDB4MzQsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4NjcsMHg0MiwweDI2LDB4YzcKKywweDA2LDB4MGUsMHgwMCwweDI0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDgsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5CissMHgwMCwweDAyLDB4ZTgsMHgwNCwweDAxLDB4ZTgsMHg5YiwweDAwLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTYsMHgyNgorLDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgwMiwweGJmLDB4MmEsMHgwMCwweDI2LDB4YzYKKywweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDAxLDB4YTEsMHgwZiwweDM3LDB4ODYsMHhlMCwweGY2LDB4MDYsMHg2ZiwweDM3CissMHgwMSwweDc1LDB4MGYsMHgzOSwweDA2LDB4Y2MsMHgzNCwweDc0LDB4MDksMHg4YiwweGQ4LDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzOQorLDB4OGIsMHhjMywweGEzLDB4Y2MsMHgzNCwweDI2LDB4ODksMHg0NSwweDAyLDB4OGQsMHg3ZCwweDA0LDB4ZTgsMHgzZCwweDAxLDB4ZTgKKywweGNkLDB4MDAsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDFjCissMHgwMCwweGExLDB4YTIsMHgzNywweDUwLDB4MGIsMHhjMCwweDc1LDB4MDcsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTgsMHgwMAorLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDIzLDB4MDAKKywweGU4LDB4MmUsMHhmYSwweDI2LDB4YzcsMHg0NSwweDI2LDB4MDAsMHgwZSwweDU4LDB4MGIsMHhjMCwweDc1LDB4MDYsMHgyNiwweGM3CissMHg0NSwweDI2LDB4MDAsMHgwYSwweDI2LDB4YzYsMHg0NSwweDI5LDB4MDAsMHg4MywweGM3LDB4MmEsMHhlOCwweGJkLDB4MDAsMHhlOAorLDB4ZmYsMHgwMCwweGMzLDB4NTYsMHg1NywweDUxLDB4YjksMHgwMywweDAwLDB4YmUsMHhkMSwweDM2LDB4YmYsMHgyMCwweDAwLDB4ZjMKKywweGE1LDB4NTksMHg1ZiwweDVlLDB4YzMsMHg1NiwweDU3LDB4NTEsMHhiOSwweDAzLDB4MDAsMHhiZSwweGQxLDB4MzYsMHhiZiwweDFhCissMHgwMCwweGYzLDB4YTUsMHg1OSwweDVmLDB4NWUsMHhjMywweDI2LDB4YzcsMHgwNiwweDFhLDB4MDAsMHhjMCwweDAwLDB4MjYsMHhjNworLDB4MDYsMHgxYywweDAwLDB4MDAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHgwMCwweDEwLDB4YzMsMHgyNiwweGM3LDB4MDYKKywweDFhLDB4MDAsMHhjMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWMsMHgwMCwweDAwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxZSwweDAwCissMHgwMCwweDA4LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgxYSwweDAwLDB4YzAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHgwMAorLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxZSwweDAwLDB4MDAsMHgwMiwweGMzLDB4MjYsMHhjNywweDA2LDB4MWEsMHgwMCwweGMwLDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHhmZiwweGZmLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMCwweGZmLDB4ZmYsMHhjMywweDI2CissMHhjNiwweDA1LDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDAyLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHgwNSwweDM3LDB4YjksMHgwMworLDB4MDAsMHhmMywweGE1LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MDYsMHhhMSwweDBkLDB4MzcKKywweDI2LDB4ODksMHg0NSwweDAyLDB4OGQsMHg3ZCwweDA0LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxCissMHgwNywweGExLDB4MGIsMHgzNywweDI2LDB4ODksMHg0NSwweDAyLDB4ODMsMHhjNywweDA0LDB4YzMsMHhhMSwweGEyLDB4MzcsMHgwYgorLDB4YzAsMHg3NCwweDEzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDA5LDB4YTEsMHgwMywweDM3LDB4MjYKKywweDg5LDB4NDUsMHgwMiwweDgzLDB4YzcsMHgwNCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDAyCissMHg4ZCwweDdkLDB4MDIsMHhiZSwweDA1LDB4MzcsMHhiOSwweDAzLDB4MDAsMHhmMywweGE1LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNgorLDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwYiwweDhkLDB4N2QsMHgwMiwweGJlLDB4ZWYsMHgzNiwweGI5LDB4MDIsMHgwMCwweGYzLDB4YTUKKywweGMzLDB4MjYsMHhjNiwweDA1LDB4MDYsMHgyNiwweGM2LDB4NDUsMHgwMSwweDIwLDB4YTEsMHg2OCwweDM3LDB4MjYsMHg4OSwweDQ1CissMHgwMiwweGExLDB4NmEsMHgzNywweDI2LDB4ODgsMHg2NSwweDA1LDB4YzEsMHhlMCwweDA0LDB4MjYsMHg4OCwweDQ1LDB4MDQsMHg4MworLDB4YzcsMHgwNiwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDIxLDB4MjYsMHhjNywweDQ1LDB4MDIKKywweDAwLDB4MDAsMHg4MywweGM3LDB4MDQsMHhjMywweDI2LDB4YzYsMHgwNSwweDE0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyMiwweDhkCissMHg3ZCwweDAyLDB4YmUsMHgxZiwweDM3LDB4YjksMHgwOSwweDAwLDB4ZjMsMHhhNSwweGMzLDB4MjYsMHhjNiwweDA1LDB4MGMsMHgyNgorLDB4YzYsMHg0NSwweDAxLDB4MjMsMHg4ZCwweDdkLDB4MDIsMHgxZSwweDBlLDB4MWYsMHg4ZCwweDM2LDB4NDAsMHg1NCwweGI5LDB4MDMKKywweDAwLDB4ZjMsMHhhNSwweDMzLDB4YzAsMHhiOSwweDAyLDB4MDAsMHhmMywweGFiLDB4MWYsMHhjMywweDI2LDB4YzYsMHgwNSwweDA4CissMHgyNiwweGM2LDB4NDUsMHgwMSwweDI4LDB4OGQsMHg3ZCwweDAyLDB4YmUsMHhkMSwweDM2LDB4YjksMHgwMywweDAwLDB4ZjMsMHhhNQorLDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwOCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MjksMHhhMSwweGMyLDB4MzQsMHg4NiwweGUwLDB4MjYKKywweDg5LDB4NDUsMHgwMiwweGExLDB4OWIsMHgzNiwweDI2LDB4ODksMHg0NSwweDA0LDB4MjYsMHg4OCwweDQ1LDB4MDYsMHgyNiwweDg4CissMHg0NSwweDA3LDB4OGQsMHg3ZCwweDA4LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNiwweDI2LDB4YzYsMHg0NSwweDAxLDB4MmIsMHg4ZAorLDB4N2QsMHgwMiwweGJlLDB4YmIsMHgzNiwweGI5LDB4MDIsMHgwMCwweGYzLDB4YTUsMHhjMywweDI2LDB4YzYsMHgwNSwweDA2LDB4MjYKKywweGM2LDB4NDUsMHgwMSwweDJjLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHhlNSwweDM2LDB4YjksMHgwMiwweDAwLDB4ZjMsMHhhNSwweGMzCissMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MzAsMHhhMSwweDM3LDB4MzcsMHg4NiwweGUwLDB4MjYsMHg4OQorLDB4NDUsMHgwMiwweDhkLDB4N2QsMHgwNCwweGMzLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDFlLDB4MDAsMHgyNiwweGM3LDB4MDYKKywweDA2LDB4MDAsMHgwMiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHg2YywweGZlLDB4ZTgsMHgwMywweGZlCissMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHgzMCwweDI2LDB4YzYsMHgwNgorLDB4MjksMHgwMCwweDExLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHgzNSwweDAwLDB4ZTgsMHg0NSwweDAwLDB4ZTgsMHg1NSwweDAwLDB4YzMKKywweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxMiwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDAyLDB4MDAsMHgyNiwweGM2CissMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4MzIsMHhmZSwweGU4LDB4YzksMHhmZCwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMAorLDB4MDQsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4MzAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MTMsMHhjMywweDI2LDB4YzYKKywweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDBjLDB4MjYsMHhjNywweDQ1LDB4MDIsMHgwMCwweDAxLDB4ODMsMHhjNywweDA0CissMHhjMywweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwZSwweDI2LDB4YzcsMHg0NSwweDAyLDB4MDAsMHgwMgorLDB4ODMsMHhjNywweDA0LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MjEsMHgyNiwweGM3LDB4NDUKKywweDAyLDB4MDAsMHgwMCwweDgzLDB4YzcsMHgwNCwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhiMywweDM5LDB4YzksMHgzOSwweDgzLDB4M2EsMHhiMywweDM5LDB4YjMsMHgzOSwweGIzLDB4MzksMHgxYywweDNhLDB4MWMsMHgzYQorLDB4YTMsMHhiNiwweDM0LDB4YTEsMHhlOSwweDM2LDB4YTMsMHgxMSwweDM3LDB4YTMsMHhkMiwweDM0LDB4YTEsMHhlYiwweDM2LDB4YTMKKywweDEzLDB4MzcsMHhhMywweGQ0LDB4MzQsMHhhMSwweGVkLDB4MzYsMHhhMywweDE1LDB4MzcsMHhhMywweGQ2LDB4MzQsMHhhMSwweDAxCissMHgzNywweGEzLDB4Y2UsMHgzNCwweGExLDB4ZjcsMHgzNiwweGEzLDB4MTcsMHgzNywweGEzLDB4ZGMsMHgzNCwweGExLDB4ZjksMHgzNgorLDB4YTMsMHgxOSwweDM3LDB4YTMsMHhkZSwweDM0LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMiwweDAwLDB4NzUsMHgwYywweDMzLDB4YzAKKywweGEwLDB4OWUsMHgzNiwweDhiLDB4ZjAsMHgyZSwweGZmLDB4YTQsMHg1MCwweDM5LDB4ZTksMHgwZiwweDAxLDB4YmUsMHgwNywweDAwCissMHhlOSwweDE5LDB4ZjEsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHhmMywweGM2LDB4MDYsMHhhMCwweDM2LDB4MDIsMHhjNgorLDB4MDYsMHg2ZSwweDM3LDB4MDgsMHhjNiwweDA2LDB4NzAsMHgzNywweDAyLDB4YjgsMHg4OCwweDAzLDB4Y2QsMHgzOSwweGY2LDB4MDYKKywweDZmLDB4MzcsMHgwMSwweDc1LDB4NGEsMHhhMSwweGQxLDB4MzYsMHgzYSwweDA2LDB4ZTksMHgzNiwweDc1LDB4NDEsMHgzYSwweDI2CissMHhlYSwweDM2LDB4NzUsMHgzYiwweGExLDB4ZDMsMHgzNiwweDNhLDB4MDYsMHhlYiwweDM2LDB4NzUsMHgzMiwweDNhLDB4MjYsMHhlYworLDB4MzYsMHg3NSwweDJjLDB4YTEsMHhkNSwweDM2LDB4M2EsMHgwNiwweGVkLDB4MzYsMHg3NSwweDIzLDB4M2EsMHgyNiwweGVlLDB4MzYKKywweDc1LDB4MWQsMHhjNiwweDA2LDB4NzAsMHgzNywweDAyLDB4ZmUsMHgwZSwweDZlLDB4MzcsMHg3NSwweDBmLDB4YjgsMHg4OCwweDAzCissMHhjZCwweDNhLDB4ODMsMHgwZSwweDliLDB4MzYsMHgxMiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MGMsMHhlOSwweGE4LDB4ZjAsMHhhMQorLDB4MDUsMHgzNywweDI2LDB4M2IsMHgwNiwweDIwLDB4MDAsMHg3NSwweDQwLDB4YTEsMHgwNywweDM3LDB4MjYsMHgzYiwweDA2LDB4MjIKKywweDAwLDB4NzUsMHgzNiwweGExLDB4MDksMHgzNywweDI2LDB4M2IsMHgwNiwweDI0LDB4MDAsMHg3NSwweDJjLDB4YTAsMHg5ZSwweDM2CissMHgzYywweDAyLDB4NzUsMHgwOCwweDI2LDB4ZjYsMHgwNiwweDE4LDB4MDAsMHgwOCwweDc1LDB4NDcsMHhjNiwweDA2LDB4NmUsMHgzNworLDB4MDgsMHhmZSwweDBlLDB4NzAsMHgzNywweDc1LDB4MWMsMHhjNiwweDA2LDB4NzAsMHgzNywweDAyLDB4ZTUsMHgwMiwweDBkLDB4MDEKKywweDA0LDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMiwweGU5LDB4NWUsMHhmMCwweGM2LDB4MDYsMHg3MCwweDM3LDB4MDIsMHhjNiwweDA2CissMHg2ZSwweDM3LDB4MDgsMHhlNSwweDAyLDB4MjUsMHhmZiwweGZiLDB4MGQsMHgwMSwweDAwLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMgorLDB4ZTksMHg0NCwweGYwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzQsMHgyNSwweDI2LDB4ZjYsMHgwNiwweDE4LDB4MDAKKywweDA4LDB4NzUsMHhlZCwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2YsMHhmZiwweGI4LDB4ODksMHgwMywweGNkLDB4M2EsMHhiOCwweDg0CissMHgwMywweGNkLDB4M2EsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ODMsMHgyNiwweGMyLDB4MzQsMHhhZiwweGU5LDB4MTcsMHhmMAorLDB4YTEsMHgwMSwweDM3LDB4M2EsMHgyNiwweDBmLDB4MzcsMHg3ZiwweGM3LDB4ZTksMHhmNywweGZlLDB4ODMsMHgyNiwweDliLDB4MzYKKywweGVjLDB4ZTgsMHgyYSwweDBkLDB4ODEsMHgwZSwweDliLDB4MzYsMHg4MCwweDAwLDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGM2CissMHgwNiwweGEwLDB4MzYsMHgwMiwweGU5LDB4ZjAsMHhlZiwweDgzLDB4MGUsMHg5YiwweDM2LDB4MTEsMHhjNiwweDA2LDB4YTAsMHgzNgorLDB4MGMsMHhlOSwweGY5LDB4ZWYsMHg0NCwweDNiLDB4MmMsMHgzYiwweGM3LDB4MmEsMHg2YiwweDNiLDB4NDQsMHgzYiwweGM3LDB4MmEKKywweGM3LDB4MmEsMHhjNywweDJhLDB4YTMsMHhiNiwweDM0LDB4ODEsMHgwZSwweGMyLDB4MzQsMHgwMCwweDIwLDB4ZjcsMHgwNiwweDQxCissMHgzNywweDAxLDB4MDAsMHg3NCwweDFiLDB4OGMsMHhjMywweGM3LDB4MDYsMHg0MSwweDM3LDB4MDAsMHgwMCwweGI4LDB4N2YsMHgwMworLDB4Y2QsMHgzYSwweDMzLDB4YzAsMHg4ZSwweGMwLDB4YmYsMHg1NCwweDM3LDB4YjksMHgwNiwweDAwLDB4ZjMsMHhhYiwweDhlLDB4YzMKKywweDMzLDB4YzAsMHhhMCwweDllLDB4MzYsMHg4YiwweGYwLDB4MmUsMHhmZiwweGE0LDB4ZTQsMHgzYSwweGY3LDB4MDYsMHg5YiwweDM2CissMHgwMCwweDAxLDB4NzUsMHgyMSwweDgzLDB4MjYsMHhjMiwweDM0LDB4YmYsMHhhMSwweGE5LDB4MzYsMHhlNywweDAwLDB4YTEsMHg5YgorLDB4MzYsMHhlOSwweDA5LDB4MDAsMHhhMSwweDliLDB4MzYsMHg4MSwweDI2LDB4OWIsMHgzNiwweGZmLDB4ZGYsMHhhOSwweDAwLDB4MjAKKywweDc1LDB4MDYsMHhlOSwweDZlLDB4MDAsMHhlOSwweDZmLDB4ZWYsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4YzcsMHgwNiwweDM3CissMHgzNywweDAxLDB4MDAsMHhjNiwweDA2LDB4Y2EsMHgzNCwweDAxLDB4ZTksMHg1OCwweDAwLDB4ODMsMHgwZSwweDliLDB4MzYsMHg0MAorLDB4ZTgsMHg1OCwweDAwLDB4YTEsMHgwNSwweDM3LDB4M2IsMHgwNiwweGU5LDB4MzYsMHg3NSwweDM3LDB4YTEsMHgwNywweDM3LDB4M2IKKywweDA2LDB4ZWIsMHgzNiwweDc1LDB4MmUsMHhhMSwweDA5LDB4MzcsMHgzYiwweDA2LDB4ZWQsMHgzNiwweDc1LDB4MjUsMHhmZSwweDBlCissMHg3MSwweDM3LDB4NzUsMHgxYywweGI4LDB4ODcsMHgwMywweGNkLDB4M2EsMHg4MywweDBlLDB4OTksMHgzNiwweDEwLDB4YTEsMHg1MAorLDB4MzcsMHhjNywweDA2LDB4NTAsMHgzNywweDAwLDB4MDAsMHgwOSwweDA2LDB4OTksMHgzNiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDgKKywweGU5LDB4MTQsMHhlZiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQsMHhjNywweDA2LDB4MzcsMHgzNywweDAzLDB4MDAsMHhjNiwweDA2CissMHhjYSwweDM0LDB4MDMsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBhLDB4ZTksMHhmYywweGVlLDB4YTEsMHhkMSwweDM2LDB4MjYsMHgzYgorLDB4MDYsMHgyMCwweDAwLDB4NzUsMHgxNSwweGExLDB4ZDMsMHgzNiwweDI2LDB4M2IsMHgwNiwweDIyLDB4MDAsMHg3NSwweDEyLDB4YTEKKywweGQ1LDB4MzYsMHgyNiwweDNiLDB4MDYsMHgyNCwweDAwLDB4NzUsMHgwZiwweGMzLDB4OGQsMHgzNiwweDIwLDB4MDAsMHhlOSwweDBiCissMHgwMCwweDhkLDB4MzYsMHgyMiwweDAwLDB4ZTksMHgwNCwweDAwLDB4OGQsMHgzNiwweDI0LDB4MDAsMHg4MywweGM0LDB4MDIsMHhmNworLDB4MDYsMHhlNiwweDM0LDB4MDEsMHgwMCwweDc0LDB4MTUsMHgyNiwweDNhLDB4MDQsMHg3NywweDA4LDB4NzIsMHgwZSwweDI2LDB4M2EKKywweDY0LDB4MDEsMHg3MiwweDA4LDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweGU5LDB4YWIsMHhlZSwweGU4LDB4N2MsMHgwYSwweDhjCissMHhjMCwweDNkLDB4ZmYsMHhmZiwweDc0LDB4MWIsMHgyNiwweGM2LDB4MDYsMHgxOCwweDAwLDB4MTAsMHgyNiwweGM3LDB4MDYsMHgwNAorLDB4MDAsMHg0OSwweDNjLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDBjLDB4MDAsMHhjZCwweDUwLDB4YjksMHg0ZSwweDAwLDB4ZTIKKywweGZlLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwYSwweGU5LDB4OTQsMHhlZSwweGU5LDB4N2IsMHhlZSwweDhmLDB4M2MsMHgwNiwweDNkCissMHgwNiwweDNkLDB4MDYsMHgzZCwweGQyLDB4M2MsMHhlYSwweDNjLDB4MDYsMHgzZCwweDA2LDB4M2QsMHhhMywweGI2LDB4MzQsMHg4MQorLDB4MjYsMHhjMiwweDM0LDB4YWYsMHhkZiwweGM3LDB4MDYsMHg0YywweDM3LDB4MDAsMHgwMCwweGI4LDB4OGEsMHgwMywweGNkLDB4M2EKKywweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDQsMHg3NSwweDBjLDB4ODAsMHgzZSwweDllLDB4MzYsMHgwNiwweDc0LDB4MDUsMHhjNiwweDA2CissMHg5ZiwweDM2LDB4MDYsMHgzMywweGMwLDB4YTAsMHg5ZSwweDM2LDB4OGIsMHhmMCwweDJlLDB4ZmYsMHhhNCwweDRjLDB4M2MsMHhmNworLDB4MDYsMHg5YiwweDM2LDB4MDAsMHgyMCwweDc1LDB4MGUsMHg4MSwweDI2LDB4OWIsMHgzNiwweGZmLDB4YmYsMHhiOCwweDhiLDB4MDMKKywweGNkLDB4M2EsMHhlOSwweDU0LDB4MDAsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEsMHg3NCwweDAzLDB4ZTksMHgxNywweGVlCissMHhjNywweDA2LDB4MzcsMHgzNywweDAyLDB4MDAsMHhjNiwweDA2LDB4Y2EsMHgzNCwweDAyLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgwNAorLDB4ODMsMHgwZSwweDUwLDB4MzcsMHgwNCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDJhLDB4ZTgsMHgxZiwweDBiLDB4ZTkKKywweDI3LDB4MDAsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEsMHg3NSwweGQzLDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMiwweDAwCissMHhjNiwweDA2LDB4Y2EsMHgzNCwweDAyLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgwNCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDAsMHhmNgorLDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDAzLDB4ZTgsMHhkZSwweDBhLDB4ODEsMHgyNiwweDliLDB4MzYsMHg3YywweGZmLDB4YmIKKywweGZmLDB4ZmYsMHhjZCwweDUzLDB4Y2QsMHg1NCwweGU5LDB4YmUsMHhlZCwweGEzLDB4YjYsMHgzNCwweGU4LDB4YWQsMHgwMSwweGI4CissMHg4NiwweDAzLDB4Y2QsMHgzOSwweGM3LDB4MDYsMHg0YywweDM3LDB4MDAsMHgwMCwweDgxLDB4MjYsMHhjMiwweDM0LDB4YWYsMHhkZgorLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4MzQsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NCwweDU2LDB4ZjcKKywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEsMHg3NCwweDI3LDB4ZTgsMHgzNSwweDAxLDB4NzIsMHgxYywweGJlLDB4MDAsMHg0MCwweDg1CissMHgzNiwweGMyLDB4MzQsMHg3NSwweDA4LDB4MDksMHgzNiwweGMyLDB4MzQsMHhmZiwweDA2LDB4OTIsMHgzNCwweGU4LDB4OGIsMHgwMQorLDB4NzMsMHgwNiwweDgxLDB4MGUsMHg5OSwweDM2LDB4ODAsMHgwMCwweGU5LDB4NmMsMHhlZCwweGU5LDB4YjUsMHgwMCwweGM3LDB4MDYKKywweDM3LDB4MzcsMHgwMiwweDAwLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQsMHg4MywweDBlCissMHg1MCwweDM3LDB4MDQsMHg4MCwweDNlLDB4OWUsMHgzNiwweDA4LDB4NzQsMHgwMywweGU4LDB4NWEsMHgwYSwweGU4LDB4ZWYsMHgwMAorLDB4NzIsMHhkNiwweGU5LDB4YzgsMHhmZiwweDgwLDB4M2UsMHg5ZSwweDM2LDB4MGEsMHg3NSwweDEyLDB4YzYsMHgwNiwweGEwLDB4MzYKKywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwOCwweDAwLDB4NzQsMHgwMiwweGNkLDB4NTQsMHhlOCwweDM5LDB4MGEsMHg4MSwweDI2CissMHg5YiwweDM2LDB4ZmYsMHhiZiwweGU4LDB4YzgsMHgwMCwweDcyLDB4YWYsMHhiOCwweDhiLDB4MDMsMHhjZCwweDM5LDB4ZTksMHg5YworLDB4ZmYsMHhmNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHg1OCwweGEzLDB4YjYsMHgzNCwweGU4LDB4ZmUsMHgwMCwweDgxLDB4MjYKKywweGMyLDB4MzQsMHhmZiwweGJmLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4NDgsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwCissMHgyMCwweDc0LDB4MjIsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4NDAsMHg3NSwweDA4LDB4ZTgsMHg5MSwweDAwLDB4NzIsMHgzMAorLDB4ZTksMHgyMiwweDAwLDB4MjYsMHhhMSwweDBjLDB4MDAsMHhhOSwweDYwLDB4MDAsMHg3NSwweDI0LDB4ODEsMHgwZSwweDY2LDB4MzcKKywweDAwLDB4MDgsMHhlOSwweGQyLDB4ZWMsMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHhlOCwweDcxLDB4MDAsMHg3MiwweDEwCissMHhiOCwweDhiLDB4MDMsMHhjZCwweDM5LDB4ZTgsMHhkMywweDAwLDB4NzMsMHgwNiwweDgxLDB4MGUsMHg5OSwweDM2LDB4ODAsMHgwMAorLDB4ZTksMHhiNCwweGVjLDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwNCwweDc1LDB4MGMsMHg4MCwweDNlLDB4OWUsMHgzNiwweDA2LDB4NzQKKywweDQ2LDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwNiwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMSwweDc0LDB4MGMsMHg4MCwweDNlCissMHg5ZCwweDM2LDB4MDgsMHg3NSwweDA1LDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwYSwweGU4LDB4MzIsMHgwMCwweDcyLDB4ZDEsMHhlOAorLDB4OTksMHgwMCwweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDgsMHg3NSwweDEzLDB4ODEsMHgwZSwweDk5LDB4MzYsMHg4MCwweDAwLDB4ZjcKKywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NSwweDA4LDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4NjgsMHhlYywweGM2CissMHgwNiwweDlmLDB4MzYsMHgwYSwweGU5LDB4NjAsMHhlYywweGI4LDB4ODYsMHgwMywweGNkLDB4M2EsMHhlOSwweDU4LDB4ZWMsMHgyNgorLDB4YTEsMHgwYywweDAwLDB4YTksMHg2MCwweDAwLDB4NzQsMHgwOCwweDgxLDB4MjYsMHhjMiwweDM0LDB4ZmYsMHhiZiwweGY5LDB4YzMKKywweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHg0MCwweDc0LDB4MTMsMHg4MSwweDBlLDB4NjYsMHgzNywweDAwLDB4MDgsMHhlOCwweDRhCissMHgwMCwweDczLDB4MDYsMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAsMHhmOSwweGMzLDB4ODEsMHgwZSwweDliLDB4MzYsMHgwMAorLDB4NDAsMHg4MCwweDI2LDB4NmYsMHgzNywweGZlLDB4ODEsMHgyNiwweDliLDB4MzYsMHg3ZiwweGZmLDB4YzYsMHgwNiwweGEwLDB4MzYKKywweDAwLDB4ZjgsMHhjMywweDgxLDB4MGUsMHg5OSwweDM2LDB4MDAsMHgwMSwweGU5LDB4MjEsMHhlYywweDI2LDB4YTEsMHgyMCwweDAwCissMHhhMywweGZiLDB4MzYsMHhhMywweGFhLDB4MzQsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4ZmQsMHgzNiwweGEzLDB4YWMsMHgzNAorLDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweGZmLDB4MzYsMHhhMywweGFlLDB4MzQsMHhjMywweGExLDB4MDUsMHgzNywweDI2LDB4M2IKKywweDA2LDB4MjAsMHgwMCwweDc1LDB4MTksMHhhMSwweDA3LDB4MzcsMHgyNiwweDNiLDB4MDYsMHgyMiwweDAwLDB4NzUsMHgwZiwweGExCissMHgwOSwweDM3LDB4MjYsMHgzYiwweDA2LDB4MjQsMHgwMCwweDc1LDB4MDUsMHhlOCwweDAyLDB4MDAsMHhmOCwweGMzLDB4NTEsMHgxZQorLDB4MDYsMHg4YiwweGM3LDB4OGQsMHgzNiwweDIwLDB4MDAsMHhiZiwweDA1LDB4MzcsMHhiOSwweDAzLDB4MDAsMHgxZSwweDA2LDB4MWYKKywweDA3LDB4ZjMsMHhhNSwweDhiLDB4ZjgsMHg4ZCwweDM2LDB4MjAsMHgwMCwweGJmLDB4YTAsMHgzNCwweGI5LDB4MDMsMHgwMCwweGYzCissMHhhNSwweDA3LDB4MWYsMHg1OSwweDhiLDB4ZjgsMHhhMSwweDA3LDB4MzcsMHhhMywweGE2LDB4MzQsMHhhMSwweDA5LDB4MzcsMHhhMworLDB4YTgsMHgzNCwweGY5LDB4YzMsMHhjNiwweDA2LDB4YjYsMHgzNCwweDAxLDB4ZTksMHg4YiwweGViLDB4ZTgsMHg4NywweDA4LDB4OGIKKywweGYwLDB4MDUsMHgxMiwweDAwLDB4MjYsMHgyOSwweDA2LDB4MGUsMHgwMCwweDI2LDB4OGIsMHg0NCwweDJhLDB4MjYsMHgzYSwweDA2CissMHgwZSwweDAwLDB4NzUsMHg1YiwweDI2LDB4ODMsMHgyZSwweDBlLDB4MDAsMHgwMiwweDgwLDB4ZmMsMHgyNywweDc1LDB4NTAsMHgyNgorLDB4OGIsMHg0NCwweDJjLDB4YTksMHhmZiwweGZmLDB4NzUsMHg0NywweDhiLDB4ZmUsMHgzMywweGMwLDB4MjYsMHhmNiwweDQ1LDB4M2MKKywweDgwLDB4NzQsMHgwNiwweDI2LDB4OGEsMHg0NSwweDNhLDB4MjQsMHgxZiwweDAzLDB4ZjgsMHgyNiwweDgwLDB4N2QsMHg0NSwweDA5CissMHg3NSwweDJkLDB4OGMsMHhjMiwweDhlLDB4MDYsMHgzOCwweDM0LDB4OGUsMHhkYSwweDhiLDB4MGUsMHgwZSwweDAwLDB4MjYsMHg4OQorLDB4MGUsMHgwZSwweDAwLDB4OGQsMHg3NCwweDJjLDB4YmYsMHgxOCwweDAwLDB4ZjMsMHhhNCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4MjYKKywweGM3LDB4MDYsMHgwNCwweDAwLDB4YjUsMHgzZiwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4Y2QsMHg1MCwweGI4CissMHgwNiwweDgwLDB4ZTksMHhlZiwweGU5LDB4MjYsMHhhMSwweDBjLDB4MDAsMHhhMywweDkzLDB4MzcsMHg4MywweDBlLDB4OTksMHgzNgorLDB4MDEsMHhlOSwweDAwLDB4ZWIsMHgyNiwweDgwLDB4M2UsMHgxYywweDAwLDB4ZmYsMHg3NSwweDJmLDB4MjYsMHg4MCwweDNlLDB4MWUKKywweDAwLDB4ZmYsMHg3NSwweDI3LDB4MjYsMHhmNywweDA2LDB4MGMsMHgwMCwweDQwLDB4MDAsMHg3NSwweDFiLDB4YTEsMHhkMSwweDM2CissMHgyNiwweGEzLDB4MWEsMHgwMCwweGExLDB4ZDMsMHgzNiwweDI2LDB4YTMsMHgxYywweDAwLDB4YTEsMHhkNSwweDM2LDB4MjYsMHhhMworLDB4MWUsMHgwMCwweGI4LDB4MGEsMHg4MCwweGU4LDB4MzYsMHgwNywweGU5LDB4ZTIsMHhlYSwweGZmLDB4MDYsMHg5MCwweDM0LDB4YmUKKywweDBhLDB4MDAsMHhjNiwweDA2LDB4YjYsMHgzNCwweDAxLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc1LDB4MDUsMHg4MywweDBlCissMHhjMiwweDM0LDB4MDEsMHhlOSwweGI2LDB4ZWEsMHg4MCwweDNlLDB4OWQsMHgzNiwweDBhLDB4NzUsMHgwZiwweDI2LDB4YTEsMHgwYworLDB4MDAsMHgyNSwweDA3LDB4MDAsMHgzZCwweDA0LDB4MDAsMHg3NSwweDAzLDB4ZTgsMHg3OSwweDAwLDB4YTEsMHhmMywweDM2LDB4ODYKKywweGUwLDB4ZTcsMHgxZSwweGEzLDB4ZTMsMHgzNiwweDgxLDB4MjYsMHgwYiwweDM3LDB4MDAsMHgwMywweDgxLDB4MjYsMHgwZCwweDM3CissMHg3YiwweDdmLDB4ODMsMHgwZSwweDBkLDB4MzcsMHg0OCwweGU4LDB4MWUsMHgwMCwweDI2LDB4YTEsMHgwYywweDAwLDB4MjUsMHgwNworLDB4MDAsMHgzZCwweDA0LDB4MDAsMHg3NCwweDA5LDB4MjYsMHhmNywweDA2LDB4MGMsMHgwMCwweDIwLDB4MDAsMHg3NSwweDA2LDB4YjgKKywweDAxLDB4MDAsMHhlOSwweDNmLDB4ZTksMHhlOSwweDVmLDB4ZWEsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHhiOCwweDdmCissMHgwMywweGNkLDB4M2EsMHhhMSwweDFkLDB4MzcsMHhhMywweGM0LDB4MzQsMHg4NiwweGUwLDB4NjgsMHg3ZiwweDAzLDB4MWYsMHhhMworLDB4MDYsMHgwMCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YTEsMHgwYiwweDM3LDB4YTMsMHhiMiwweDM0LDB4YTEsMHgwZCwweDM3LDB4YTMKKywweGI0LDB4MzQsMHhhMSwweGYzLDB4MzYsMHhhMywweGM4LDB4MzQsMHhhMSwweGVmLDB4MzYsMHhhMywweDljLDB4MzQsMHhhMSwweGYxCissMHgzNiwweGEzLDB4OWUsMHgzNCwweGMzLDB4ODAsMHgwZSwweDlkLDB4MzYsMHg4MCwweGJlLDB4MDAsMHgwMCwweGU4LDB4YjQsMHgwNworLDB4YjgsMHg3YiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2MsMHgwMywweGNkLDB4MzksMHhjNywweDA2LDB4MzMsMHgzNywweDAyLDB4MDAKKywweGExLDB4ZTUsMHgzNiwweGU3LDB4MmUsMHhhMSwweGU3LDB4MzYsMHhlNywweDNlLDB4YjgsMHg4MiwweDAzLDB4Y2QsMHgzYSwweGY3CissMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzUsMHgwMywweGU4LDB4ZmQsMHgwNiwweGExLDB4ZDMsMHgzNiwweGEzLDB4ZWYsMHgzNgorLDB4YTMsMHg5YywweDM0LDB4YTEsMHhkNSwweDM2LDB4YTMsMHhmMSwweDM2LDB4YTMsMHg5ZSwweDM0LDB4YzMsMHhmNiwweDA2LDB4OWQKKywweDM2LDB4ODAsMHg3NCwweDMxLDB4YmUsMHgyMiwweDAwLDB4ZTksMHgxNywweDAwLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0CissMHgyNCwweGJlLDB4MjMsMHgwMCwweGU5LDB4MGEsMHgwMCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDE3LDB4YmUsMHgyNAorLDB4MDAsMHg1NiwweGU4LDB4YTgsMHgwNSwweDhjLDB4YzAsMHgzZCwweGZmLDB4ZmYsMHg1ZSwweDc0LDB4MDUsMHhlOCwweGQ3LDB4ZWYKKywweGNkLDB4NTAsMHhlOSwweDFmLDB4ZTgsMHhlOSwweDlmLDB4ZTksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhiOCwweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4YSwweDAzLDB4Y2QsMHgzOSwweGU5LDB4ZjcsMHgwMCwweDgwLDB4M2UsMHhhMAorLDB4MzYsMHgwOCwweDc1LDB4MmUsMHhhOSwweGQwLDB4MDcsMHg3NSwweDJjLDB4YTEsMHhiMSwweDM2LDB4MGQsMHgwMCwweDA0LDB4ZTcKKywweDA4LDB4ZTUsMHgwMCwweDI1LDB4ZmYsMHg3MywweGU3LDB4MDAsMHhiOCwweDhhLDB4MDMsMHhjZCwweDNhLDB4ZTgsMHhjMywweDA2CissMHgzMywweGMwLDB4ZTcsMHgwZSwweGU1LDB4MGEsMHgyNSwweGMzLDB4MTcsMHhlNywweDBhLDB4Y2QsMHg1NCwweGM2LDB4MDYsMHhhMAorLDB4MzYsMHgwMCwweGU5LDB4NjgsMHhlOSwweGJlLDB4MDQsMHgwMCwweGU5LDB4M2YsMHhlOSwweDgzLDB4MjYsMHg5YiwweDM2LDB4YmYKKywweGM2LDB4MDYsMHg3MSwweDM3LDB4MDMsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OCwweDAzLDB4Y2QsMHgzYSwweGI4CissMHg4MywweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODcsMHgwMywweGNkLDB4MzksMHg4MSwweDBlLDB4YzIsMHgzNCwweDAwLDB4MjAsMHhlOQorLDB4OTIsMHgwMCwweGU4LDB4NDksMHgwNiwweGI4LDB4ODcsMHgwMywweGNkLDB4MzksMHhiYiwweGZmLDB4N2YsMHhjZCwweDUzLDB4YjgKKywweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OGIsMHgwMywweGNkLDB4M2EsMHhiOCwweDgzCissMHgwMywweGNkLDB4M2EsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NSwweDAzLDB4Y2QsMHgzYSwweGMzLDB4ZTUsMHgwMAorLDB4MjUsMHhmZiwweDUzLDB4ZTcsMHgwMCwweDgzLDB4MGUsMHhjMiwweDM0LDB4NDAsMHg4MywweDI2LDB4YzIsMHgzNCwweGVmLDB4ZTgKKywweDBjLDB4MDYsMHhiYiwweGZmLDB4N2YsMHhjZCwweDUzLDB4YjgsMHg4YSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODUsMHgwMywweGNkCissMHgzYSwweGI4LDB4ODYsMHgwMywweGNkLDB4M2EsMHhiOCwweDgzLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NywweDAzLDB4Y2QsMHgzYQorLDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODQsMHgwMywweGNkLDB4M2EsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YzMKKywweDgzLDB4MGUsMHhjMiwweDM0LDB4NTAsMHhlOCwweDE4LDB4MDQsMHhlOCwweGQzLDB4MDUsMHhmNiwweDA2LDB4NmYsMHgzNywweDAxCissMHg3NSwweDEyLDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzOSwweDgzLDB4M2UsMHgwZiwweDM3LDB4MDAsMHg3NSwweDA2LDB4YzcsMHgwNgorLDB4MGYsMHgzNywweDA0LDB4MDAsMHhhMSwweDlkLDB4MzYsMHg4MCwweGZjLDB4MDgsMHg3NCwweDA1LDB4YjgsMHg4NCwweDAzLDB4Y2QKKywweDM5LDB4ZTUsMHgwMiwweDBkLDB4MDEsMHgwOCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhhMSwweDlkLDB4MzYsMHg4NiwweGUwCissMHgzMiwweGU0LDB4OGIsMHhmMCwweGQxLDB4ZWUsMHgzMywweGMwLDB4MGQsMHgyMCwweDAwLDB4MDksMHgwNiwweGFkLDB4MzYsMHhhMQorLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhlOSwweDUzLDB4ZTgsMHhlOSwweDVhLDB4ZTgsMHgzMywweGMwLDB4YTAsMHgxYiwweDM3LDB4ZDEKKywweGUwLDB4M2EsMHgwNiwweGEwLDB4MzYsMHg3NSwweDAzLDB4ZTksMHhiYSwweGZmLDB4ZTksMHg2MCwweGU4LDB4YzcsMHgwNiwweDQxCissMHgzNywweDAwLDB4MDAsMHhlOCwweGMxLDB4ZTEsMHhlOCwweDZhLDB4MDYsMHgzMywweGMwLDB4MGQsMHg0MSwweDAwLDB4ZTcsMHg1NgorLDB4YTEsMHhiMSwweDM2LDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOCwweGU1LDB4MDIsMHgyNSwweGY5LDB4ZmYsMHgwZCwweDAzLDB4MDAKKywweGU3LDB4MDIsMHhhMSwweGIzLDB4MzYsMHhlNywweDBhLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGExLDB4YWQsMHgzNiwweGU3CissMHgwNCwweGU4LDB4N2MsMHgwMywweGU4LDB4OWYsMHgwMywweGM3LDB4MDYsMHgxZCwweDM3LDB4MDAsMHhjOCwweGM3LDB4MDYsMHgwYgorLDB4MzcsMHgwMCwweDAzLDB4YzcsMHgwNiwweDBkLDB4MzcsMHg3YiwweDdmLDB4MzMsMHhjMCwweGEzLDB4OTksMHgzNiwweGEzLDB4OWIKKywweDM2LDB4YTMsMHg5ZCwweDM2LDB4YTMsMHg5ZiwweDM2LDB4YTMsMHg0YywweDM3LDB4YTMsMHhmMywweDM2LDB4YTMsMHhlZiwweDM2CissMHhhMywweGYxLDB4MzYsMHhlOCwweDgyLDB4ZmQsMHhjNiwweDA2LDB4OWYsMHgzNiwweDAyLDB4ZTksMHhlZiwweGU3LDB4ZTUsMHgwMgorLDB4MGQsMHgwMSwweDg4LDB4MjUsMHhlZiwweGZmLDB4MGQsMHgwMCwweDQwLDB4MGQsMHgwMCwweDA0LDB4ZTcsMHgwMiwweGU4LDB4ZjIKKywweDA1LDB4ZTUsMHgwYSwweDBkLDB4NDAsMHgwMCwweGU3LDB4MGEsMHgzMywweGMwLDB4YTMsMHg4MSwweDM3LDB4YTMsMHg4NSwweDM3CissMHhhMywweDgzLDB4MzcsMHhhMywweDg3LDB4MzcsMHhhMywweDg5LDB4MzcsMHhlNSwweDAwLDB4MGQsMHgwMCwweDg0LDB4ZTcsMHgwMAorLDB4YjgsMHg4YywweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODAsMHgwMCwweGNkLDB4MzUsMHhjNywweDA2LDB4YWEsMHgwMiwweGZmLDB4ZmYKKywweGU1LDB4MDAsMHgyNSwweGZmLDB4N2IsMHhlNywweDAwLDB4ODEsMHgwZSwweDlhLDB4MzcsMHg4MCwweDAwLDB4YjgsMHg3ZSwweDAzCissMHhjZCwweDM5LDB4MzMsMHhjMCwweGU3LDB4MGUsMHhiZSwweDA4LDB4MDAsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4YTcsMHhlZAorLDB4ODMsMHgyNiwweGVmLDB4MzQsMHhkZiwweGZmLDB4MDYsMHg4MSwweDM3LDB4Y2QsMHg1MCwweDgzLDB4MGUsMHhlZiwweDM0LDB4MjAKKywweGMzLDB4ZjcsMHgwNiwweDlhLDB4MzcsMHg4MCwweDAwLDB4NzQsMHgzZCwweGE5LDB4ZDAsMHgwNywweDc0LDB4MTAsMHhhOSwweDAwCissMHgwNCwweDc0LDB4MTIsMHgzMywweGMwLDB4ZTcsMHgwZSwweGZmLDB4MDYsMHg4NywweDM3LDB4ZTksMHhkMiwweGZmLDB4ZmYsMHgwNgorLDB4ODUsMHgzNywweGU5LDB4Y2IsMHhmZiwweGZmLDB4MDYsMHg4MywweDM3LDB4ZTksMHhjNCwweGZmLDB4ODMsMHgyNiwweDlhLDB4MzcKKywweDdmLDB4YTEsMHg4OSwweDM3LDB4MDMsMHgwNiwweDg3LDB4MzcsMHgzZCwweDA1LDB4MDAsMHg3ZiwweDAxLDB4YzMsMHhiYiwweGZmCissMHg3ZiwweGNkLDB4NTMsMHhlOSwweDAwLDB4MDAsMHhlNSwweDAyLDB4MjUsMHhmZiwweGZiLDB4MjUsMHhlZiwweGZmLDB4MGQsMHgwMQorLDB4MDAsMHhlNywweDAyLDB4YTEsMHg4MywweDM3LDB4M2IsMHgwNiwweDQ2LDB4MzcsMHg3ZiwweDJhLDB4YTEsMHg4NSwweDM3LDB4M2IKKywweDA2LDB4NDgsMHgzNywweDdjLDB4MjEsMHhhMSwweDg5LDB4MzcsMHgwMywweDA2LDB4ODcsMHgzNywweDNkLDB4MDUsMHgwMCwweDdmCissMHgxNSwweGM2LDB4MDYsMHg5ZiwweDM2LDB4MDQsMHhlNSwweDAyLDB4MjUsMHhmZiwweGY3LDB4MGQsMHgwMSwweDAwLDB4MjUsMHhlZgorLDB4ZmYsMHhlNywweDAyLDB4ZTksMHhmNywweGU2LDB4YmUsMHgwMSwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMywweDAwLDB4NzQKKywweDBhLDB4ODMsMHgyNiwweDliLDB4MzYsMHhmYywweDgzLDB4MGUsMHhjMiwweDM0LDB4MDQsMHhlOSwweGQwLDB4ZTYsMHhiOCwweDdiCissMHgwMywweGNkLDB4MzksMHhlNSwweDAyLDB4MGQsMHgwMSwweDYwLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMiwweGM3LDB4MDYsMHhmMQorLDB4MzQsMHgyMCwweDAzLDB4YjgsMHg4ZSwweDAzLDB4Y2QsMHgzOSwweGMzLDB4ODEsMHgyNiwweGMyLDB4MzQsMHg3ZiwweGZmLDB4ODAKKywweDBlLDB4NmYsMHgzNywweDAxLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMywweDAwLDB4NzQsMHhkMiwweGI4LDB4N2IsMHgwMywweGNkCissMHgzYSwweGI4LDB4N2QsMHgwMywweGNkLDB4MzksMHg4MywweDI2LDB4OWIsMHgzNiwweGVmLDB4MzMsMHhjMCwweGIwLDB4OGEsMHhhMgorLDB4OWYsMHgzNiwweGEyLDB4OWQsMHgzNiwweGM3LDB4MDYsMHg0YywweDM3LDB4MDEsMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDQKKywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHg0MCwweDAwLDB4NzUsMHgwNiwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDMsMHgwMCwweGI4CissMHg4ZCwweDAzLDB4Y2QsMHgzOSwweGU4LDB4MDAsMHhkNSwweGU1LDB4MDIsMHgwZCwweDAxLDB4NDAsMHgyNSwweGVmLDB4ZmYsMHg4YgorLDB4ZDgsMHhiOCwweDdjLDB4MDMsMHhjZCwweDM5LDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwLDB4OGIsMHhjMywweDBkLDB4MDAKKywweDIwLDB4MjUsMHhmOSwweGZmLDB4MGIsMHgwNiwweGU4LDB4M2EsMHhlNywweDAyLDB4YzMsMHhmZiwweDBlLDB4ZjEsMHgzNCwweDc1CissMHgwMSwweGMzLDB4ZTUsMHg0ZSwweGE5LDB4MDEsMHgwMCwweDc1LDB4MTIsMHhlNSwweDAwLDB4YTksMHgwMCwweDA0LDB4NzUsMHgwNQorLDB4MGQsMHgwMCwweDA0LDB4ZTcsMHgwMCwweGI4LDB4OGUsMHgwMywweGNkLDB4MzksMHhjMywweGU1LDB4MDAsMHhhOSwweDAwLDB4MDQKKywweDc0LDB4ZjMsMHgyNSwweGZmLDB4ZmIsMHhlNywweDAwLDB4ZTksMHhlYiwweGZmLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNCwweDgzCissMHgyNiwweDliLDB4MzYsMHhmYywweDgxLDB4MGUsMHg5YiwweDM2LDB4ODAsMHgwMCwweGU5LDB4MTAsMHhlNiwweGI4LDB4OGUsMHgwMworLDB4Y2QsMHgzYSwweGNkLDB4NTQsMHg4MSwweDBlLDB4YWYsMHgzNiwweDAwLDB4MTgsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4YjgKKywweDdiLDB4MDMsMHhjZCwweDM5LDB4YTEsMHhkMywweDM2LDB4YTMsMHg4ZiwweDM3LDB4YTEsMHhkNSwweDM2LDB4YTMsMHg5MSwweDM3CissMHhjNywweDA2LDB4OGIsMHgzNywweDAyLDB4MDAsMHhjNywweDA2LDB4OGQsMHgzNywweDAyLDB4MDAsMHg4MywweDBlLDB4OTksMHgzNgorLDB4NDAsMHhlOSwweGQ5LDB4ZTUsMHg4MCwweDNlLDB4OWYsMHgzNiwweDA2LDB4NzUsMHgxNSwweGE5LDB4ZDAsMHgwNywweDc1LDB4ZWMKKywweDI1LDB4MDAsMHgxOCwweDc1LDB4MGUsMHhmZiwweDBlLDB4OGIsMHgzNywweDc1LDB4ZTEsMHhjNiwweDA2LDB4OWYsMHgzNiwweDA4CissMHhlOSwweGJhLDB4ZTUsMHhmZiwweDBlLDB4OGQsMHgzNywweDc1LDB4ZDMsMHhiZSwweDA4LDB4MDAsMHhlOSwweDlmLDB4ZTUsMHhiOAorLDB4N2IsMHgwMywweGNkLDB4MzksMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NCwweDA4LDB4YzYsMHgwNiwweDlmLDB4MzYKKywweDBhLDB4ZTksMHgwZCwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDQwLDB4NzQsMHgwYiwweGI4LDB4OGIsMHgwMywweGNkCissMHgzOSwweDgxLDB4MGUsMHg5OSwweDM2LDB4ODAsMHgwMCwweGU5LDB4ODMsMHhlNSwweGI4LDB4N2IsMHgwMywweGNkLDB4MzksMHhjNworLDB4MDYsMHg4YiwweDM3LDB4MDQsMHgwMCwweGM3LDB4MDYsMHg4ZCwweDM3LDB4MDQsMHgwMCwweDgxLDB4MGUsMHg5OSwweDM2LDB4MDAKKywweDAyLDB4ZTksMHg2OSwweGU1LDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc1LDB4MWIsMHhhOSwweGQwLDB4MDcsMHg3NSwweGViCissMHhhOSwweDAwLDB4MTgsMHg3NSwweDBjLDB4ZmYsMHgwZSwweDhkLDB4MzcsMHg3NSwweGUwLDB4ZTgsMHgxNywweGZiLDB4ZTksMHg0YworLDB4ZTUsMHhiOCwweDgyLDB4MDMsMHhjZCwweDM5LDB4YzMsMHhmZiwweDBlLDB4OGIsMHgzNywweDc1LDB4Y2UsMHhiZSwweDA5LDB4MDAKKywweGU5LDB4MmIsMHhlNSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDAsMHgwMCwweGM3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMCwweGU4CissMHgzYywweDAyLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGU3LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweDgxLDB4MjYsMHg5YgorLDB4MzYsMHhmZiwweDdmLDB4ZTUsMHgwMiwweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYsMHhmZiwweDI1LDB4ZmYsMHhkZiwweGU3LDB4MDIKKywweGJiLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHgzMywweGMwLDB4YTMsMHg5ZCwweDM2LDB4YTMsMHg5ZiwweDM2LDB4ZTgsMHg1MCwweDAwCissMHhlOCwweDczLDB4MDAsMHhiOCwweDgxLDB4MDMsMHhjZCwweDM5LDB4YzMsMHhmNywweDA2LDB4OWIsMHgzNiwweDAzLDB4MDAsMHg3NAorLDB4MGQsMHhjNiwweDA2LDB4OWYsMHgzNiwweDAyLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwMCwweGU5LDB4ZGYsMHhlNCwweDgzLDB4MGUKKywweDliLDB4MzYsMHgxMCwweGM3LDB4MDYsMHg5OSwweDM2LDB4MDAsMHgwMCwweGU4LDB4ZTcsMHgwMiwweGU1LDB4NTYsMHgwZCwweDAyCissMHgwMCwweGU3LDB4NTYsMHhjNywweDA2LDB4YTgsMHgwMiwweDAwLDB4MDAsMHg4YiwweDM2LDB4M2QsMHgzNywweGU4LDB4NDQsMHgwMgorLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwZSwweGU5LDB4YjUsMHhlNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDA2LDB4YjgsMHg4YSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODUsMHgwMywweGNkLDB4M2EsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhCissMHhiOCwweDgzLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NywweDAzLDB4Y2QsMHgzYSwweGI4LDB4OGIsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4ODgsMHgwMywweGNkLDB4M2EsMHgwNywweGMzLDB4MDYsMHhiOCwweDg4LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg3YiwweDAzLDB4Y2QKKywweDNhLDB4YjgsMHg4MiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2YsMHgwMywweGNkLDB4M2EsMHhiOCwweDdjLDB4MDMsMHhjZCwweDNhCissMHhiOCwweDdlLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODEsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4ODQsMHgwMywweGNkLDB4M2EsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg3ZCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OGQKKywweDAzLDB4Y2QsMHgzYSwweGM3LDB4MDYsMHg0MSwweDM3LDB4MDAsMHgwMCwweDA3LDB4YzMsMHgwNiwweDhlLDB4MDYsMHgzOCwweDM0CissMHgxZiwweDhiLDB4MGUsMHgwZSwweDAwLDB4MjYsMHg4OSwweDBlLDB4MGUsMHgwMCwweGJlLDB4MTgsMHgwMCwweGJmLDB4MTgsMHgwMAorLDB4ZjMsMHhhNCwweDA2LDB4MWUsMHgwNywweGNkLDB4MzQsMHgwNywweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzMsMHgyNiwweGY2LDB4MDYKKywweDIwLDB4MDAsMHg4MCwweDc0LDB4NDQsMHgzMywweGMwLDB4MjYsMHhhMCwweDI2LDB4MDAsMHgyNCwweDFmLDB4OGIsMHhmMCwweDI2CissMHg4YiwweDVjLDB4MjgsMHg4OSwweDFlLDB4NmEsMHgzNywweDA2LDB4OGUsMHgwNiwweDM4LDB4MzQsMHgxZiwweGMwLDB4ZTMsMHgwNAorLDB4MjYsMHg4OCwweDVjLDB4MjgsMHg4YiwweGM2LDB4YjksMHgwNiwweDAwLDB4YmUsMHgyMCwweDAwLDB4YmYsMHgxYSwweDAwLDB4ZjMKKywweGE0LDB4OGIsMHhjOCwweDgzLDB4YzcsMHgwNiwweGYzLDB4YTQsMHgyNiwweDgxLDB4MjYsMHgyNiwweDAwLDB4MWYsMHg4MCwweDI2CissMHg4MSwweDM2LDB4MjYsMHgwMCwweDAwLDB4ODAsMHhlOSwweGE5LDB4ZmYsMHgyNiwweDhiLDB4MWUsMHgyOCwweDAwLDB4ODksMHgxZQorLDB4NmEsMHgzNywweDA2LDB4OGUsMHgwNiwweDM4LDB4MzQsMHgxZiwweGMwLDB4ZTMsMHgwNCwweDI2LDB4ODgsMHgxZSwweDI4LDB4MDAKKywweGI5LDB4MDYsMHgwMCwweGJlLDB4MjAsMHgwMCwweGJmLDB4MWEsMHgwMCwweGYzLDB4YTQsMHhlOSwweDg0LDB4ZmYsMHg4NiwweGM0CissMHhhMywweDY4LDB4MzcsMHhlOCwweDg3LDB4ZmYsMHhmNywweDA2LDB4NmEsMHgzNywweDBmLDB4MDAsMHg3NCwweDEwLDB4ODAsMHgzZQorLDB4OWUsMHgzNiwweDAwLDB4NzUsMHgwOSwweGJlLDB4MDAsMHgwMCwweGU4LDB4YWMsMHhlOSwweGNkLDB4NTAsMHhjMywweGMzLDB4NTAKKywweDU2LDB4MDYsMHgzMywweGMwLDB4MjYsMHhmNiwweDA2LDB4MjAsMHgwMCwweDgwLDB4NzQsMHgwNiwweDI2LDB4YTAsMHgyNiwweDAwCissMHgyNCwweDFmLDB4OGIsMHhmMCwweDI2LDB4OGIsMHg1YywweDI2LDB4ODYsMHhmYiwweDgzLDB4ZWIsMHgwNCwweDc0LDB4NGYsMHg4MworLDB4YzYsMHgyYSwweDhjLDB4YzAsMHg4ZSwweGQ4LDB4YjksMHgwNywweDAwLDB4MzMsMHhjMCwweDhlLDB4YzAsMHhiZiwweDcyLDB4MzcKKywweGYzLDB4YWIsMHgzMywweGM5LDB4OGEsMHgwYywweDgwLDB4ZjksMHgwMCwweDc1LDB4MDMsMHhlOSwweDMwLDB4MDAsMHgzYiwweGQ5CissMHg3MywweDAzLDB4ZTksMHgyOSwweDAwLDB4MmIsMHhkOSwweDhhLDB4NDQsMHgwMSwweDI1LDB4M2YsMHgwMCwweDc0LDB4MTksMHgzZAorLDB4MGIsMHgwMCwweDdkLDB4MTQsMHhkMSwweGUwLDB4OGIsMHhmOCwweDJlLDB4OGIsMHhiZCwweDVjLDB4NDksMHg4ZCwweDc0LDB4MDIKKywweDgzLDB4ZTksMHgwMiwweGYzLDB4YTQsMHhlOSwweDAyLDB4MDAsMHgwMywweGYxLDB4MjMsMHhkYiwweDc1LDB4YzQsMHgzMywweGMwCissMHg4ZSwweGQ4LDB4MDcsMHg1ZSwweDU4LDB4YzMsMHgzMywweGMwLDB4MjYsMHhmNiwweDA2LDB4MjAsMHgwMCwweDgwLDB4NzQsMHgwNgorLDB4MjYsMHhhMCwweDI2LDB4MDAsMHgyNCwweDFmLDB4YzMsMHhlNSwweDBhLDB4MjUsMHhjMywweGJmLDB4ZTcsMHgwYSwweGI4LDB4ODYKKywweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODMsMHgwMywweGNkLDB4MzksMHg4MSwweDI2LDB4OWIsMHgzNiwweDdjLDB4ZGYsMHhiOCwweDg1CissMHgwMywweGNkLDB4M2EsMHhlNSwweDAyLDB4MjUsMHhmZiwweGYzLDB4MGQsMHgwMSwweDAwLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMgorLDB4ZTUsMHgwMCwweDI1LDB4ZmYsMHg1MywweGU3LDB4MDAsMHhhMSwweGU3LDB4MzYsMHgyNSwweGZmLDB4ZmUsMHhhMywweGU3LDB4MzYKKywweGU3LDB4M2UsMHg4MywweDI2LDB4OTksMHgzNiwweGNmLDB4ODEsMHgwZSwweGFmLDB4MzYsMHgwMCwweDEwLDB4YTEsMHhhZiwweDM2CissMHhlNywweDA2LDB4YzMsMHhlNSwweDAyLDB4MGQsMHgwMSwweDBjLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMiwweGExLDB4ZTcsMHgzNgorLDB4MGQsMHgwMCwweDAxLDB4ZTcsMHgzZSwweGEzLDB4ZTcsMHgzNiwweDgxLDB4MGUsMHg5YiwweDM2LDB4MDAsMHgyMCwweDgzLDB4MGUKKywweDk5LDB4MzYsMHgyMCwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2MsMHhiZiwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgxMCwweGExCissMHhhZiwweDM2LDB4ZTcsMHgwNiwweGI4LDB4ODYsMHgwMywweGNkLDB4MzksMHhiOCwweDg1LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4MworLDB4MDMsMHhjZCwweDNhLDB4YzMsMHgwYiwweGY2LDB4NzUsMHg0OSwweDA2LDB4OGUsMHgwNiwweDMyLDB4MzQsMHg4MCwweDNlLDB4ZTAKKywweDM0LDB4MDEsMHg3NSwweDFiLDB4MjYsMHg4OSwweDM2LDB4MDYsMHgwMCwweDhlLDB4MDYsMHgzMiwweDM0LDB4MjYsMHhmNywweDA2CissMHgwYSwweDAwLDB4MDAsMHgyMCwweDc0LDB4MDcsMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgyMCwweDA3LDB4YzMsMHg4MAorLDB4M2UsMHhlMywweDM0LDB4MDEsMHg3NSwweDE5LDB4MjYsMHg4OSwweDM2LDB4MDYsMHgwMCwweDhlLDB4MDYsMHgzMiwweDM0LDB4MjYKKywweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgxMCwweDc0LDB4MDcsMHgyNiwweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgxMCwweDA3CissMHhjMywweGU5LDB4YjQsMHhmZiwweDUwLDB4NTEsMHg1NywweDMzLDB4YzAsMHhiOSwweDA2LDB4MDAsMHg4ZSwweGMwLDB4YmYsMHhkMQorLDB4MzYsMHhmMywweGFlLDB4NWYsMHg3NCwweDBjLDB4MjYsMHhmNiwweDA2LDB4MDAsMHgwMCwweGMwLDB4NzUsMHgwNCwweGY4LDB4NTkKKywweDU4LDB4YzMsMHhmOSwweGU5LDB4ZjksMHhmZiwweDhiLDB4MDUsMHgwYiwweDQ1LDB4MDIsMHgwYiwweDQ1LDB4MDQsMHhjMywweDUyCissMHg1MCwweGU1LDB4MDYsMHgyNSwweDFlLDB4MDAsMHgzZCwweDFlLDB4MDAsMHg3NSwweGY2LDB4YjgsMHgwMSwweDgwLDB4ZTcsMHg1YQorLDB4NTgsMHg1YSwweGMzLDB4ZTgsMHhlOSwweGZmLDB4NTAsMHhlNSwweDAyLDB4MjUsMHhmZiwweDdmLDB4MGQsMHgwMSwweDAwLDB4MjUKKywweGVmLDB4ZmYsMHhlNywweDAyLDB4MGQsMHgwMCwweDgwLDB4ZTcsMHgwMiwweGExLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhhMSwweGFmCissMHgzNiwweGU3LDB4MDYsMHg1OCwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MmUsMHgyYiwweGNlLDB4NDEsMHgxMCwweDQyLDB4N2IsMHg0MSwweDMwLDB4NDEsMHhhMiwweDQxLDB4YWYsMHg0NSwweDQ0LDB4MjkKKywweGM3LDB4MmEsMHhjNywweDJhLDB4NjAsMHgzOSwweGY0LDB4M2EsMHg1YywweDNjLDB4MDksMHgzZCwweGIxLDB4M2QsMHgzNCwweDNmCissMHhjNywweDJhLDB4M2MsMHgzZiwweGM3LDB4MmEsMHhjNCwweDNmLDB4MTYsMHg0MCwweDE2LDB4NDAsMHhlZCwweDQwLDB4ZmEsMHg0MAorLDB4MDcsMHg0MSwweGM3LDB4MmEsMHhjNywweDJhLDB4YzcsMHgyYSwweGM3LDB4MmEsMHhkNiwweDUyLDB4MDAsMHgwMCwweDAxLDB4MzcKKywweGU5LDB4MzYsMHhmMywweDM2LDB4ZWYsMHgzNiwweDFkLDB4MzcsMHgwZCwweDM3LDB4MGIsMHgzNywweDljLDB4MzcsMHgwMywweDM3CissMHhmYiwweDM2LDB4NjIsMHgyZCwweDQwLDB4MDYsMHhkMSwweDJkLDB4ZjQsMHgwMSwweGJhLDB4NDQsMHg0MCwweDA2LDB4OGMsMHg0MworLDB4NjQsMHgwMCwweGU4LDB4MmMsMHhjOCwweDAwLDB4ZDgsMHgyYiwweDA1LDB4MDAsMHhlOSwweDQ1LDB4NTAsMHgwMCwweDk3LDB4NDUKKywweGZhLDB4MDAsMHhhZSwweDJkLDB4MDQsMHgwMSwweDZhLDB4NDIsMHgwMiwweDAwLDB4ZjYsMHgyYywweGJjLDB4MDIsMHg5MywweDJkCissMHhkYywweDA1LDB4MWQsMHgyZCwweDY0LDB4MDAsMHhhMSwweDJkLDB4MTQsMHgwMCwweGQ3LDB4M2EsMHgwOCwweDA3LDB4ODEsMHgyZAorLDB4NjQsMHgwMCwweGIzLDB4M2UsMHgwMiwweDAwLDB4MzAsMHg0MywweDY0LDB4MDAsMHhjNSwweDJjLDB4ZjQsMHgwMSwweDhiLDB4NDQKKywweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg4MCwweDNlLDB4ZmQsMHgzNCwweDAyLDB4NzQsMHgwYywweGU4LDB4MjAsMHgwNSwweGM3LDB4MDYsMHhhMSwweDM2LDB4MDAsMHgwMAorLDB4ZTksMHg5YSwweGY4LDB4ZmYsMHgwNiwweGMwLDB4MzMsMHhlOCwweDEwLDB4MDUsMHg4YiwweDM2LDB4M2QsMHgzNywweGU4LDB4NzMKKywweGZlLDB4YzMsMHhjZCwweDM0LDB4ZTksMHhlOCwweDA1LDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMCwweDAwLDB4YzcsMHgwNiwweDQxCissMHgzNywweDAwLDB4MDAsMHhlOCwweGVkLDB4ZmUsMHgzMywweGMwLDB4MGQsMHg0MSwweDAwLDB4ZTcsMHg1NiwweGExLDB4YjEsMHgzNgorLDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOCwweGExLDB4YjMsMHgzNiwweGU3LDB4MGEsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4YTEKKywweGFkLDB4MzYsMHhlNywweDA0LDB4ZTgsMHgyYiwweDA5LDB4YzcsMHgwNiwweDFkLDB4MzcsMHgwMCwweGM4LDB4YzcsMHgwNiwweDBiCissMHgzNywweDAwLDB4MDMsMHhjNywweDA2LDB4MGQsMHgzNywweDdiLDB4N2YsMHgzMywweGMwLDB4YTMsMHg5YiwweDM2LDB4YTMsMHg5ZAorLDB4MzYsMHhjNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHhjNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4YzcsMHgwNiwweDA1LDB4MzcKKywweDAwLDB4MDAsMHhjNywweDA2LDB4MDcsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4MDksMHgzNywweDAwLDB4MDAsMHhhMywweGYzCissMHgzNiwweGEzLDB4ZWYsMHgzNiwweGEzLDB4ZjEsMHgzNiwweGU4LDB4ZmUsMHhmNSwweGU1LDB4MDIsMHgyNSwweGY5LDB4ZmYsMHgwZAorLDB4MDMsMHgwMCwweDBkLDB4MDAsMHg4OCwweDI1LDB4ZWYsMHhmZiwweDBkLDB4MDAsMHg0MCwweDBkLDB4MDAsMHgwNCwweGU3LDB4MDIKKywweGI4LDB4OGYsMHgwMywweGNkLDB4MzksMHhiOCwweDgwLDB4MDAsMHhjZCwweDM1LDB4YzcsMHgwNiwweGFhLDB4MDIsMHhmZiwweGZmCissMHhhMSwweGE5LDB4MzYsMHhhMywweGE3LDB4MzYsMHgwZCwweDAwLDB4YTQsMHgwZCwweDAwLDB4MDgsMHhlNywweDAwLDB4YTMsMHhhOQorLDB4MzYsMHhjNywweDA2LDB4YTMsMHgzNiwweDAxLDB4MDAsMHhjNywweDA2LDB4YTUsMHgzNiwweDBjLDB4MDAsMHg4MywweDNlLDB4YTUKKywweDM2LDB4MDAsMHg3NSwweDA5LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwNSwweDAwLDB4ZTksMHgxMywweGZmLDB4ZmYsMHgwZSwweGE1CissMHgzNiwweGJlLDB4MTEsMHgwMCwweGU4LDB4MjIsMHgwNSwweGI4LDB4OTAsMHgwMywweGNkLDB4MzksMHhjMywweDgzLDB4M2UsMHhhMworLDB4MzYsMHgwMSwweDc0LDB4ZDksMHhjMywweGI4LDB4OTAsMHgwMywweGNkLDB4M2EsMHgyNiwweGEwLDB4MmIsMHgwMCwweDI2LDB4OGIKKywweDFlLDB4MmMsMHgwMCwweGNkLDB4MzQsMHg4MywweDNlLDB4YTMsMHgzNiwweDAxLDB4NzQsMHgwMywweGU5LDB4ZjAsMHgwNCwweDNjCissMHgwZiwweDc1LDB4MWUsMHg4MSwweGZiLDB4MDAsMHgwMiwweDc1LDB4MTgsMHgyNiwweGExLDB4MjAsMHgwMCwweGEzLDB4MDUsMHgzNworLDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweDA3LDB4MzcsMHgyNiwweGExLDB4MjQsMHgwMCwweGEzLDB4MDksMHgzNywweGU5LDB4MDkKKywweDAwLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMSwweDAwLDB4ZTksMHhiNiwweGZlLDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMiwweDAwCissMHhjNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4ZTgsMHhjYiwweGZkLDB4ZTgsMHgxYywweGQ5LDB4MzMsMHhjMCwweGEzLDB4ODUsMHgzNworLDB4YTMsMHg4MywweDM3LDB4YTMsMHg4NywweDM3LDB4YTMsMHg4OSwweDM3LDB4YjgsMHg5MSwweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODAKKywweDAwLDB4Y2QsMHgzNSwweGM3LDB4MDYsMHhhYSwweDAyLDB4ZmYsMHhmZiwweGU1LDB4MDAsMHgyNSwweGZmLDB4NTMsMHhlNywweDAwCissMHg4MSwweDBlLDB4OWEsMHgzNywweDgwLDB4MDAsMHhiOCwweDkyLDB4MDMsMHhjZCwweDM5LDB4MzMsMHhjMCwweGU3LDB4MGUsMHhiZQorLDB4MDgsMHgwMCwweDhlLDB4MDYsMHgzOCwweDM0LDB4ZTgsMHg4ZSwweGU1LDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDdkLDB4NGIKKywweDgzLDB4MjYsMHhlZiwweDM0LDB4ZGYsMHhjZCwweDUwLDB4ODMsMHgwZSwweGVmLDB4MzQsMHgyMCwweGMzLDB4ZjcsMHgwNiwweDlhCissMHgzNywweDgwLDB4MDAsMHg3NCwweDMyLDB4YTksMHhkMCwweDA3LDB4NzQsMHgwYywweGE5LDB4MDAsMHgwNCwweDc0LDB4MGUsMHgzMworLDB4YzAsMHhlNywweDBlLDB4ZTksMHhkYSwweGZmLDB4ZmYsMHgwNiwweDg1LDB4MzcsMHhlOSwweGQzLDB4ZmYsMHhmZiwweDA2LDB4ODMKKywweDM3LDB4ZTksMHhjYywweGZmLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMSwweDAwLDB4ZTksMHgzNiwweGZlLDB4ODMsMHgyNiwweDlhCissMHgzNywweDdmLDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGU1LDB4MDAsMHgwZCwweDAwLDB4YWMsMHhlNywweDAwLDB4ZTUsMHgwMgorLDB4MjUsMHhmZiwweGZiLDB4MjUsMHhlZiwweGZmLDB4MjUsMHhmZiwweGY3LDB4MGQsMHgwMSwweDAwLDB4ZTcsMHgwMiwweGExLDB4ODMKKywweDM3LDB4M2IsMHgwNiwweDQ2LDB4MzcsMHg3ZiwweGNkLDB4YTEsMHg4NSwweDM3LDB4M2IsMHgwNiwweDQ4LDB4MzcsMHg3YywweGM0CissMHhjNywweDA2LDB4YTMsMHgzNiwweDAzLDB4MDAsMHhiZSwweDEzLDB4MDAsMHhlOCwweGZkLDB4MDMsMHhiOCwweDkzLDB4MDMsMHhjZAorLDB4MzksMHhiOCwweDk0LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg5NiwweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTUsMHgwMywweGNkLDB4MzkKKywweGJlLDB4MDYsMHgwMCwweGU4LDB4ZTMsMHgwMywweGU5LDB4ZDYsMHgwMywweDgzLDB4M2UsMHhhMywweDM2LDB4MDMsMHg3NCwweDAxCissMHhjMywweGJlLDB4MTMsMHgwMCwweGU4LDB4ZDIsMHgwMywweGI4LDB4OTQsMHgwMywweGNkLDB4MzksMHhjMywweGI4LDB4OTQsMHgwMworLDB4Y2QsMHgzYSwweDI2LDB4YTAsMHgyYiwweDAwLDB4MjYsMHg4YiwweDFlLDB4MmMsMHgwMCwweGNkLDB4MzQsMHg4MywweDNlLDB4YTMKKywweDM2LDB4MDMsMHg3NCwweDAzLDB4ZTksMHhhOCwweDAzLDB4M2MsMHgwZCwweDc1LDB4M2UsMHg4MywweGZiLDB4MDAsMHg3NSwweDM5CissMHhlNSwweDAyLDB4MGQsMHgwMCwweDIwLDB4ZTcsMHgwMiwweGI4LDB4OTMsMHgwMywweGNkLDB4M2EsMHhjNywweDA2LDB4YTMsMHgzNgorLDB4MDQsMHgwMCwweGJlLDB4MDAsMHgwMCwweGU4LDB4MGMsMHhmYywweGM2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHhjNiwweDA2LDB4OWUKKywweDM2LDB4MDAsMHhjNywweDA2LDB4MzMsMHgzNywweDAyLDB4MDAsMHhiOCwweDlhLDB4MDMsMHhjZCwweDM5LDB4ZTgsMHhmYywweDAwCissMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHhlOSwweDY2LDB4MDMsMHhjNywweDA2LDB4M2QsMHgzNywweDA4LDB4MDAsMHhlOQorLDB4NjEsMHhmZCwweDgzLDB4M2UsMHhhMywweDM2LDB4MDMsMHg3NSwweDA5LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwNSwweDAwLDB4ZTkKKywweDUxLDB4ZmQsMHhlOSwweDRhLDB4MDMsMHg4MywweDNlLDB4YTMsMHgzNiwweDA0LDB4NzQsMHgxMiwweDgzLDB4M2UsMHhhMywweDM2CissMHgwNSwweDc0LDB4MGIsMHhjZCwweDM0LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwNywweDAwLDB4ZTksMHgzNSwweGZkLDB4YzcsMHgwNgorLDB4YTMsMHgzNiwweDA2LDB4MDAsMHhjNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTkKKywweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTYsMHgwMywweGNkLDB4M2EsMHhiOCwweDk3LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg5OCwweDAzCissMHhjZCwweDM5LDB4YjgsMHg5YiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4MTgsMHhmZCwweGNkLDB4MzQsMHg4MywweDNlLDB4YTMsMHgzNgorLDB4MDQsMHg3NywweDE4LDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMywweDc1LDB4MDgsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEKKywweDc1LDB4MDksMHhjNywweDA2LDB4M2QsMHgzNywweDAxLDB4MDAsMHhlOSwweGU4LDB4ZmMsMHhlOSwweGUxLDB4MDIsMHhjZCwweDM0CissMHg4MywweDNlLDB4YTMsMHgzNiwweDAyLDB4NzcsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4ZDMsMHhmYworLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNCwweDc3LDB4MDUsMHhiOCwweDk2LDB4MDMsMHhjZCwweDM5LDB4ZTksMHhjMCwweDAyLDB4ODMKKywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzUsMHgxMCwweDI2LDB4YTEsMHgwYywweDAwLDB4MjUsMHgwNywweDAwLDB4NTAsMHgzZCwweDA0CissMHgwMCwweDc1LDB4MDMsMHhlOCwweDM2LDB4MDAsMHhhMSwweGYzLDB4MzYsMHg4NiwweGUwLDB4ZTcsMHgxZSwweGEzLDB4ZTMsMHgzNgorLDB4ODEsMHgyNiwweDBiLDB4MzcsMHgwMCwweDAzLDB4ODEsMHgyNiwweDBkLDB4MzcsMHg3YiwweDdmLDB4ODMsMHgwZSwweDBkLDB4MzcKKywweDQ4LDB4ZTgsMHgxNCwweGYzLDB4NTgsMHgzZCwweDA0LDB4MDAsMHg3NCwweDA5LDB4MjYsMHhmNywweDA2LDB4MGMsMHgwMCwweDIwCissMHgwMCwweDc1LDB4MDYsMHhiOCwweDAxLDB4MDAsMHhlOSwweDdhLDB4MDIsMHhlOSwweDg2LDB4ZmMsMHhhMSwweGU1LDB4MzYsMHhlNworLDB4MmUsMHhhMSwweGU3LDB4MzYsMHhlNywweDNlLDB4YTEsMHhkMywweDM2LDB4YTMsMHg5YywweDM0LDB4YTEsMHhkNSwweDM2LDB4YTMKKywweDllLDB4MzQsMHhjMywweDI2LDB4ODAsMHgzZSwweDFjLDB4MDAsMHhmZiwweDc1LDB4MmYsMHgyNiwweDgwLDB4M2UsMHgxZSwweDAwCissMHhmZiwweDc1LDB4MjcsMHgyNiwweGY3LDB4MDYsMHgwYywweDAwLDB4NDAsMHgwMCwweDc1LDB4MWIsMHhhMSwweGQxLDB4MzYsMHgyNgorLDB4YTMsMHgxYSwweDAwLDB4YTEsMHhkMywweDM2LDB4MjYsMHhhMywweDFjLDB4MDAsMHhhMSwweGQ1LDB4MzYsMHgyNiwweGEzLDB4MWUKKywweDAwLDB4YjgsMHgwYSwweDgwLDB4ZTksMHgyYywweDAyLDB4ZTksMHgzOCwweGZjLDB4ZmYsMHgwNiwweDkwLDB4MzQsMHhiZSwweDBhCissMHgwMCwweGM2LDB4MDYsMHhiNiwweDM0LDB4MDEsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzUsMHgwNSwweDgzLDB4MGUsMHhjMgorLDB4MzQsMHgwMSwweGNkLDB4MzQsMHhlOSwweDBjLDB4ZmMsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzUsMHgwOSwweGM3LDB4MDYKKywweDNkLDB4MzcsMHgwNSwweDAwLDB4ZTksMHhmYywweGZiLDB4ZTUsMHgwMiwweDBkLDB4MDMsMHgwMCwweDBkLDB4MDAsMHg4OCwweDBkCissMHgwMCwweDQwLDB4MGQsMHgwMCwweDA0LDB4ZTcsMHgwMiwweGM3LDB4MDYsMHhhMywweDM2LDB4MDUsMHgwMCwweGM2LDB4MDYsMHg5ZQorLDB4MzYsMHhmZiwweGJlLDB4MDIsMHgwMCwweGU4LDB4ZTEsMHgwMSwweGI4LDB4ODksMHgwMywweGNkLDB4M2EsMHhiOCwweDlhLDB4MDMKKywweGNkLDB4M2EsMHhiOCwweDk5LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg5NywweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTgsMHgwMywweGNkCissMHgzOSwweGU5LDB4YmIsMHgwMSwweDgzLDB4M2UsMHhhMywweDM2LDB4MDMsMHg3NCwweDBhLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNAorLDB4NzQsMHgwMywweGU5LDB4YWEsMHgwMSwweGJlLDB4MDYsMHgwMCwweGU4LDB4YWUsMHgwMSwweGI4LDB4OTUsMHgwMywweGNkLDB4MzkKKywweGU5LDB4OWMsMHgwMSwweDgzLDB4M2UsMHhhMywweDM2LDB4MDUsMHg3NCwweDAzLDB4ZTksMHg5MiwweDAxLDB4YmUsMHgwMiwweDAwCissMHhlOCwweDk2LDB4MDEsMHhiOCwweDk5LDB4MDMsMHhjZCwweDM5LDB4ZTksMHg4NCwweDAxLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNQorLDB4MDAsMHhlOSwweDdiLDB4MDEsMHhlNSwweDAyLDB4MjUsMHhmZiwweGRmLDB4ZTcsMHgwMiwweGM3LDB4MDYsMHhhMywweDM2LDB4MDcKKywweDAwLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNSwweDAwLDB4ZTksMHg2NSwweDAxLDB4ZTgsMHhkNSwweDA0LDB4YzYsMHgwNiwweDlkCissMHgzNiwweDAwLDB4YzcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAwLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNSwweDAwLDB4YzcsMHgwNgorLDB4YTgsMHgwMiwweDAwLDB4MDAsMHhjNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGQKKywweDAzLDB4MDAsMHgwZCwweDAwLDB4ODgsMHgyNSwweGVmLDB4ZmYsMHgwZCwweDAwLDB4NDAsMHgwZCwweDAwLDB4MDQsMHhlNywweDAyCissMHhlOSwweDY3LDB4ZmMsMHhiOCwweDlhLDB4MDMsMHhjZCwweDM5LDB4ZjcsMHgwNiwweGY0LDB4MzMsMHgwMCwweDEwLDB4NzUsMHgwOQorLDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwLDB4ZTksMHgxNiwweDAxLDB4ZmYsMHgwZSwweDMzLDB4MzcsMHg3NCwweDAzLDB4ZTkKKywweDBkLDB4MDEsMHhmZiwweDA2LDB4OGUsMHgzNCwweDgzLDB4MGUsMHhjMiwweDM0LDB4MDgsMHhjNywweDA2LDB4M2QsMHgzNywweDAzCissMHgwMCwweGU5LDB4ZmYsMHhmYSwweGMzLDB4NTIsMHg1MCwweGJhLDB4ZTAsMHgwMCwweGI4LDB4MDAsMHgxMCwweGVmLDB4NTgsMHg1YQorLDB4YzMsMHhjNywweDA2LDB4M2QsMHgzNywweDAwLDB4MDAsMHhlOSwweGU5LDB4ZmEsMHhmYSwweGU4LDB4NTQsMHgwNCwweGI4LDB4ODAKKywweDAzLDB4OGUsMHhjMCwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhkOCwweDJiLDB4YjgsMHg3ZiwweDAzLDB4OGUsMHhjMCwweDI2CissMHhjNywweDA2LDB4MDQsMHgwMCwweGU4LDB4MmMsMHgzMywweGMwLDB4OGUsMHhjMCwweGExLDB4YTcsMHgzNiwweGEzLDB4YTksMHgzNgorLDB4YTEsMHhhOSwweDM2LDB4ZTcsMHgwMCwweGExLDB4YWIsMHgzNiwweGU3LDB4MDIsMHhjNywweDA2LDB4MDUsMHgzNywweDAwLDB4MDAKKywweGM3LDB4MDYsMHgwNywweDM3LDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwOSwweDM3LDB4MDAsMHgwMCwweGM2LDB4MDYsMHg5ZCwweDM2CissMHgwMCwweGM2LDB4MDYsMHg5ZSwweDM2LDB4ZmYsMHhjNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDAsMHhjNywweDA2LDB4YTMsMHgzNgorLDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDAsMHgwMCwweGM3LDB4MDYsMHhhOCwweDAyLDB4MDAsMHgwMCwweGM3LDB4MDYKKywweDRjLDB4MzcsMHgwMSwweDAwLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGU3LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGJiCissMHhmZiwweDdmLDB4Y2QsMHg1MywweGU4LDB4N2MsMHhmOSwweGU1LDB4NTYsMHgwZCwweDAyLDB4MDAsMHhlNywweDU2LDB4ZmIsMHhjMworLDB4OGQsMHgzZSwweGMwLDB4NTMsMHg4ZCwweDM2LDB4ZjAsMHgzOCwweGI5LDB4MGUsMHgwMCwweDhiLDB4MWUsMHgzMCwweDM0LDB4ODkKKywweDVjLDB4MDIsMHgyZSwweDhiLDB4NDUsMHgwMiwweDg5LDB4NDQsMHgwNiwweDJlLDB4OGIsMHgwNSwweDg5LDB4NDQsMHgwNCwweDgzCissMHhjNywweDA0LDB4ODMsMHhjNiwweDEwLDB4ZTIsMHhlOCwweGI4LDB4ODAsMHgwMywweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwNAorLDB4MDAsMHhlMiwweDUxLDB4YjgsMHg3ZiwweDAzLDB4OGUsMHhjMCwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhiMiwweDUyLDB4MzMKKywweGMwLDB4OGUsMHhjMCwweGM3LDB4MDYsMHhhMSwweDM2LDB4MDEsMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUsMHgwMCwweGMzCissMHgzMywweGZmLDB4OGUsMHgwNiwweGE2LDB4MDIsMHg4YiwweDM2LDB4YTQsMHgwMiwweDJlLDB4ZmYsMHhhNCwweGEwLDB4NTMsMHhlOAorLDB4OGMsMHhkYiwweGMzLDB4ZTgsMHg0OCwweGY3LDB4ZTksMHhmNiwweGZmLDB4OGUsMHgwNiwweDM4LDB4MzQsMHhlOCwweDA3LDB4ZTEKKywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhkZiwweDRmLDB4Y2QsMHg1MCwweGMzLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDAwCissMHgwMCwweDI2LDB4ZmYsMHgyNiwweDA0LDB4MDAsMHhjZCwweDM0LDB4ZTksMHhkNCwweGZmLDB4YTEsMHhkMSwweDM2LDB4MjYsMHgzOQorLDB4MDYsMHgxYSwweDAwLDB4NzUsMHgyMiwweGExLDB4ZDMsMHgzNiwweDI2LDB4MzksMHgwNiwweDFjLDB4MDAsMHg3NSwweDE4LDB4YTEKKywweGQ1LDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxZSwweDAwLDB4NzUsMHgwZSwweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHg0MCwweDAwCissMHg3NCwweDA1LDB4ODMsMHgwZSwweDY2LDB4MzcsMHg0MCwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgxMCwweGExLDB4YWYsMHgzNgorLDB4ZTcsMHgwNiwweDgzLDB4M2UsMHhhMywweDM2LDB4MDIsMHg3NSwweDA1LDB4Y2QsMHgzNCwweGU5LDB4NTYsMHhmYiwweDgzLDB4M2UKKywweGEzLDB4MzYsMHgwMCwweDc0LDB4YjEsMHg4MywweDNlLDB4YTMsMHgzNiwweDA1LDB4NzcsMHhhYSwweDI2LDB4ZjYsMHgwNiwweDBhCissMHgwMCwweGZmLDB4NzUsMHhhMiwweGU4LDB4ZmQsMHhkZCwweDUwLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhlOQorLDB4OGMsMHgwMCwweDI2LDB4YTEsMHgwYywweDAwLDB4MjUsMHgwNywweDAwLDB4M2QsMHgwNywweDAwLDB4NzUsMHgwMywweGU5LDB4NzYKKywweDAwLDB4M2QsMHgwNSwweDAwLDB4NzUsMHgwMywweGU5LDB4NmUsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MTgsMHg4MCwweDc1CissMHgwMywweGU5LDB4NmEsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MDAsMHg4MCwweDc0LDB4MzUsMHgyNiwweDgwLDB4M2UsMHgyOQorLDB4MDAsMHgwMiwweDc1LDB4MmQsMHg1MSwweDU2LDB4NTcsMHg4ZCwweDM2LDB4M2UsMHgzNCwweDhkLDB4M2UsMHgyMCwweDAwLDB4YjkKKywweDA2LDB4MDAsMHhmMywweGE2LDB4NWYsMHg1ZSwweDU5LDB4NzUsMHg0NSwweDI2LDB4YTEsMHgyMCwweDAwLDB4YTMsMHgzZSwweDM0CissMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4NDAsMHgzNCwweDI2LDB4YTEsMHgyNCwweDAwLDB4YTMsMHg0MiwweDM0LDB4ZTksMHgyNgorLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDA4LDB4MDAsMHg3NCwweDBiLDB4MjYsMHg4MCwweDNlLDB4MTksMHgwMCwweDAwLDB4NzQKKywweDAzLDB4ZTksMHgxMywweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgxMCwweDAwLDB4NzQsMHgxMiwweDI2LDB4YTAsMHgyOCwweDAwCissMHhjMCwweGU4LDB4MDQsMHgyMiwweGMwLDB4NzQsMHgwNywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhmZiwweGZmLDB4NTgsMHgyMworLDB4YzAsMHg3NCwweDAzLDB4ZTksMHhkZCwweGZlLDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweGZlLDB4MjYsMHhhMSwweDIwLDB4MDAKKywweDNiLDB4MDYsMHhkMSwweDM2LDB4NzUsMHgxYSwweDI2LDB4YTEsMHgyMiwweDAwLDB4M2IsMHgwNiwweGQzLDB4MzYsMHg3NSwweDEwCissMHgyNiwweGExLDB4MjQsMHgwMCwweDNiLDB4MDYsMHhkNSwweDM2LDB4NzUsMHgwNiwweDgxLDB4MGUsMHg5YiwweDM2LDB4MDAsMHgwMQorLDB4MjYsMHhhMSwweDIwLDB4MDAsMHgyNSwweDdmLDB4ZmYsMHhhMywweGI4LDB4MzQsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4YmEKKywweDM0LDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweGJjLDB4MzQsMHg4YiwweGM2LDB4ODYsMHhjNCwweGEzLDB4YzAsMHgzNCwweGQxCissMHhlNiwweDgwLDB4ZmMsMHgwOSwweDc0LDB4MDMsMHhlOCwweGY2LDB4ZjUsMHhhMSwweDA1LDB4MzcsMHgwYiwweDA2LDB4MDcsMHgzNworLDB4MGIsMHgwNiwweDA5LDB4MzcsMHg3NCwweDNlLDB4MjYsMHhhMSwweDIwLDB4MDAsMHgzYiwweDA2LDB4MDUsMHgzNywweDc1LDB4MTcKKywweDI2LDB4YTEsMHgyMiwweDAwLDB4M2IsMHgwNiwweDA3LDB4MzcsMHg3NSwweDBkLDB4MjYsMHhhMSwweDI0LDB4MDAsMHgzYiwweDA2CissMHgwOSwweDM3LDB4NzUsMHgwMywweGU5LDB4MWQsMHgwMCwweDI2LDB4YTAsMHgyOCwweDAwLDB4MjQsMHgwZiwweDNjLDB4MDMsMHg3NAorLDB4MWIsMHgzYywweDAwLDB4NzUsMHgwZiwweDgzLDB4M2UsMHhhMywweDM2LDB4MDQsMHg3NCwweDEwLDB4ZjcsMHgwNiwweDliLDB4MzYKKywweDAwLDB4MDEsMHg3NCwweDA4LDB4MmUsMHhmZiwweDk0LDB4ZjgsMHg1MywweGU5LDB4MzMsMHhmZSwweGNkLDB4MzQsMHhjNywweDA2CissMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4MmMsMHhmOCwweDgzLDB4M2UsMHhhMywweDM2LDB4MDUsMHg3NCwweDEwLDB4ODMsMHgzZQorLDB4YTMsMHgzNiwweDAxLDB4N2UsMHgwOSwweDgzLDB4ZWUsMHgxNiwweDJlLDB4ZmYsMHg5NCwweDI0LDB4NTQsMHhjMywweGNkLDB4MzQKKywweGMzLDB4MjYsMHhhMSwweDBjLDB4MDAsMHgzZCwweGZmLDB4N2YsMHg3NCwweDA1LDB4MjYsMHhmZiwweDI2LDB4MDQsMHgwMCwweGU5CissMHhmZCwweGZkLDB4YTEsMHhmNCwweDMzLDB4YTksMHgwMCwweDg4LDB4NzQsMHgwYiwweGE5LDB4MDAsMHgxMCwweDc1LDB4MDksMHg4YgorLDB4MWUsMHg0MywweDM3LDB4ZmYsMHhlMywweGU5LDB4OTcsMHgwMCwweGM3LDB4MDYsMHgzNSwweDM3LDB4MDUsMHgwMCwweGM3LDB4MDYKKywweDQzLDB4MzcsMHgyOCwweDUyLDB4ZjcsMHgwNiwweGY0LDB4MzMsMHgwMCwweDA4LDB4NzQsMHgwNiwweGM3LDB4MDYsMHg0MywweDM3CissMHgxYSwweDUyLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzOSwweGU5LDB4YzUsMHhmZCwweGE5LDB4MDAsMHgwOCwweDc0LDB4ZDksMHhmZgorLDB4MGUsMHgzNSwweDM3LDB4NzUsMHhlZCwweGU5LDB4MzAsMHgwMCwweGE5LDB4MDAsMHgwOCwweDc1LDB4Y2IsMHhmZiwweDBlLDB4MzUKKywweDM3LDB4NzUsMHhkZiwweDgxLDB4MGUsMHhjMiwweDM0LDB4YzAsMHgwMCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDBmCissMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4ODAsMHhjNywweDA2LDB4MGYsMHgzNywweDAyLDB4MDAsMHhlOSwweDkwLDB4ZmQsMHhjNworLDB4MDYsMHgzZCwweDM3LDB4MDIsMHgwMCwweGU5LDB4OGIsMHhmNywweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDMwLDB4ZjYKKywweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgyMCwweGZmLDB4MDYsMHg5NCwweDM0LDB4ODMsMHgwZSwweDY2LDB4MzcsMHgyMCwweDhlCissMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwMSwweDc0LDB4MDcsMHgyNiwweDgxLDB4MGUsMHgwOAorLDB4MDAsMHgwMCwweDAxLDB4ZTksMHgwOSwweDAwLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwNCwweDAwLDB4ZTksMHg1NCwweGY3LDB4ODEKKywweDBlLDB4YWYsMHgzNiwweDAwLDB4MDgsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZTUsMHgwYSwweGE5LDB4MDAsMHg4MCwweDc0CissMHgwZSwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhmNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhlOSwweDQ5LDB4ZmYsMHhlOQorLDB4MmQsMHhmZCwweGM3LDB4MDYsMHg0MSwweDM3LDB4MDAsMHgwMCwweGJlLDB4MjksMHgwMCwweGU4LDB4MmIsMHhmZCwweGU5LDB4MWUKKywweGZkLDB4Y2QsMHgzNCwweDgzLDB4M2UsMHhhMywweDM2LDB4MDQsMHg3NywweDA5LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMSwweDAwCissMHhlOSwweDEwLDB4ZjcsMHhlOSwweDA5LDB4ZmQsMHhjZCwweDM0LDB4YzMsMHhjNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDAsMHhlOAorLDB4MGMsMHhmNSwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhlNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHg4MSwweDI2LDB4OWIKKywweDM2LDB4ZmYsMHg3ZiwweGU1LDB4MDIsMHgwZCwweDAxLDB4MDAsMHgyNSwweGVmLDB4ZmYsMHgyNSwweGZmLDB4ZGYsMHhlNywweDAyCissMHhiYiwweGZmLDB4N2YsMHhjZCwweDUzLDB4MzMsMHhjMCwweGEzLDB4OWQsMHgzNiwweGEzLDB4OWYsMHgzNiwweGU4LDB4MjAsMHhmMworLDB4ZTgsMHg0MywweGYzLDB4ODMsMHgwZSwweDliLDB4MzYsMHgxMCwweGM3LDB4MDYsMHg5OSwweDM2LDB4MDAsMHgwMCwweGU4LDB4ZDIKKywweGY1LDB4ZTUsMHg1NiwweDBkLDB4MDIsMHgwMCwweGU3LDB4NTYsMHhjNywweDA2LDB4YTgsMHgwMiwweDAwLDB4MDAsMHhiZSwweDAwCissMHgwMCwweGU4LDB4MzAsMHhmNSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MGUsMHhiOCwweDljLDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4MAorLDB4MDAsMHhjZCwweDM1LDB4YzcsMHgwNiwweGFhLDB4MDIsMHhmZiwweGZmLDB4YzcsMHgwNiwweGExLDB4MzYsMHgwMSwweDAwLDB4ZTkKKywweGE1LDB4ZjYsMHgwNiwweGI4LDB4OGYsMHgwMywweGNkLDB4M2EsMHhiOCwweDkwLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5MSwweDAzCissMHhjZCwweDNhLDB4YjgsMHg5MiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTMsMHgwMywweGNkLDB4M2EsMHhiOCwweDk0LDB4MDMsMHhjZAorLDB4M2EsMHhiOCwweDk1LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5NiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTcsMHgwMywweGNkLDB4M2EKKywweGI4LDB4OTgsMHgwMywweGNkLDB4M2EsMHhiOCwweDk5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzYSwweGI4CissMHg5YiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2YsMHgwMywweGNkLDB4M2EsMHhiOCwweDgwLDB4MDMsMHhjZCwweDNhLDB4MDcsMHhjMworLDB4ZjcsMHg0OSwweGYxLDB4NGUsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZjgsMHg1MSwweGRmLDB4NGYKKywweGZhLDB4NGYsMHgwYiwweDUwLDB4ZDEsMHg1MSwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmCissMHhlNCwweDRlLDB4MDYsMHgwMCwweGNkLDB4NGEsMHgwNCwweDAwLDB4ZTQsMHg0ZSwweDE5LDB4MDAsMHhhZCwweDRiLDB4ZmEsMHgwMAorLDB4ODIsMHg0YywweDA4LDB4MDcsMHgwOSwweDRjLDB4MTQsMHgwMCwweDI0LDB4NGUsMHg2NCwweDAwLDB4ZDcsMHg0ZCwweGY0LDB4MDEKKywweDY0LDB4NGUsMHhiYywweDAyLDB4N2EsMHg0ZSwweGU4LDB4MDMsMHg0MywweDRlLDB4MDIsMHgwMCwweGIzLDB4NGUsMHhmNCwweDAxCissMHg1YiwweDRlLDB4ZjQsMHgwMSwweGU1LDB4NGUsMHgxNCwweDAwLDB4MDYsMHg1MCwweDA2LDB4NTAsMHg5NSwweDRjLDB4YzEsMHg1MgorLDB4YzEsMHg1MiwweGZlLDB4NGMsMHhkYSwweDRjLDB4MDYsMHg1MCwweDA2LDB4NTAsMHgwNiwweDUwLDB4MDYsMHg1MCwweGI3LDB4NTEKKywweGI3LDB4NTEsMHhiNywweDUxLDB4YjcsMHg1MSwweGI3LDB4NTEsMHhiNywweDUxLDB4MDYsMHg1MCwweGQ1LDB4NGEsMHgwNiwweDUwCissMHgxZCwweDRjLDB4MDYsMHg1MCwweDgzLDB4NGQsMHgxZiwweDRkLDB4MWYsMHg0ZCwweGVkLDB4NDAsMHhmYSwweDQwLDB4MDcsMHg0MQorLDB4MzcsMHgzNywweDJlLDB4MzcsMHgzNywweDIwLDB4MjAsMHg3OSwweDc5LDB4MmYsMHg3OSwweDc5LDB4MmYsMHg3OSwweDc5LDB4MjAKKywweDMwLDB4MzEsMHgyZSwweDM5LDB4MzAsMHgyMCwweDIwLDB4MzAsMHgzMiwweDJmLDB4MzEsMHgzNywweDJmLDB4MzksMHgzOSwweDIwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4OTAsMHhlYSwweGMwLDB4MTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEzLDB4MDYKK30gOyAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDBmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZwpAQCAtMCwwICsxLDE4NiBAQAorIworIyBUb2tlbiBSaW5nIGRyaXZlciBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlRva2VuIFJpbmcgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKworIyBTbyBmYXIsIHdlIG9ubHkgaGF2ZSBQQ0ksIElTQSwgYW5kIE1DQSB0b2tlbiByaW5nIGRldmljZXMKK2NvbmZpZyBUUgorCWJvb2wgIlRva2VuIFJpbmcgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoUENJIHx8IElTQSB8fCBNQ0EgfHwgQ0NXKQorCXNlbGVjdCBMTEMKKwloZWxwCisJICBUb2tlbiBSaW5nIGlzIElCTSdzIHdheSBvZiBjb21tdW5pY2F0aW9uIG9uIGEgbG9jYWwgbmV0d29yazsgdGhlCisJICByZXN0IG9mIHRoZSB3b3JsZCB1c2VzIEV0aGVybmV0LiBUbyBwYXJ0aWNpcGF0ZSBvbiBhIFRva2VuIFJpbmcKKwkgIG5ldHdvcmssIHlvdSBuZWVkIGEgc3BlY2lhbCBUb2tlbiByaW5nIG5ldHdvcmsgY2FyZC4gSWYgeW91IGFyZQorCSAgY29ubmVjdGVkIHRvIHN1Y2ggYSBUb2tlbiBSaW5nIG5ldHdvcmsgYW5kIHdhbnQgdG8gdXNlIHlvdXIgVG9rZW4KKwkgIFJpbmcgY2FyZCB1bmRlciBMaW51eCwgc2F5IFkgaGVyZSBhbmQgdG8gdGhlIGRyaXZlciBmb3IgeW91cgorCSAgcGFydGljdWxhciBjYXJkIGJlbG93IGFuZCByZWFkIHRoZSBUb2tlbi1SaW5nIG1pbmktSE9XVE8sIGF2YWlsYWJsZQorCSAgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBNb3N0IHBlb3BsZSBjYW4KKwkgIHNheSBOIGhlcmUuCisKK2NvbmZpZyBJQk1UUgorCXRyaXN0YXRlICJJQk0gVHJvcGljIGNoaXBzZXQgYmFzZWQgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgKElTQSB8fCBNQ0EpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBhbGwgSUJNIFRva2VuIFJpbmcgY2FyZHMgdGhhdCBkb24ndCB1c2UgRE1BLiBJZgorCSAgeW91IGhhdmUgc3VjaCBhIGJlYXN0LCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZyBtaW5pLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgV2FybmluZzogdGhpcyBkcml2ZXIgd2lsbCBhbG1vc3QgZGVmaW5pdGVseSBmYWlsIGlmIG1vcmUgdGhhbiBvbmUKKwkgIGFjdGl2ZSBUb2tlbiBSaW5nIGNhcmQgaXMgcHJlc2VudC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaWJtdHIuCisKK2NvbmZpZyBJQk1PTAorCXRyaXN0YXRlICJJQk0gT2x5bXBpYyBjaGlwc2V0IFBDSSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGFsbCBub24tTGFuc3RyZWFtZXIgSUJNIFBDSSBUb2tlbiBSaW5nIENhcmRzLgorCSAgU3BlY2lmaWNhbGx5IHRoaXMgaXMgYWxsIElCTSBQQ0ksIFBDSSBXYWtlIE9uIExhbiwgUENJIElJLCBQQ0kgSUkKKwkgIFdha2UgT24gTGFuLCBhbmQgUENJIDEwMC8xNi80IGFkYXB0ZXJzLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGFuIGFkYXB0ZXIsIHNheSBZIGFuZCByZWFkIHRoZSBUb2tlbi1SaW5nCisJICBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBvbHltcGljLgorCisJICBBbHNvIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL29seW1waWMudHh0PiBvciBjaGVjayB0aGUKKwkgIExpbnV4IFRva2VuIFJpbmcgUHJvamVjdCBzaXRlIGZvciB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uIGF0CisJICA8aHR0cDovL3d3dy5saW51eHRyLm5ldC8+LgorCitjb25maWcgSUJNTFMKKwl0cmlzdGF0ZSAiSUJNIExhbnN0cmVhbWVyIGNoaXBzZXQgUENJIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFBDSSAmJiAhNjRCSVQKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIElCTSBMYW5zdHJlYW1lciBQQ0kgVG9rZW4gUmluZyBDYXJkcy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyLCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZworCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgbGFuc3RyZWFtZXIuCisKK2NvbmZpZyAzQzM1OQorCXRyaXN0YXRlICIzQ29tIDNDMzU5IFRva2VuIExpbmsgVmVsb2NpdHkgWEwgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgM0NvbSBQQ0kgVmVsb2NpdHkgWEwgY2FyZHMsIHNwZWNpZmljYWxseQorCSAgdGhlIDNDb20gM0MzNTksIHBsZWFzZSBub3RlIHRoaXMgaXMgbm90IGZvciB0aGUgM0MzMzkgY2FyZHMsIHlvdQorCSAgc2hvdWxkIHVzZSB0aGUgdG1zMzgwIGRyaXZlciBpbnN0ZWFkLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGFuIGFkYXB0ZXIsIHNheSBZIGFuZCByZWFkIHRoZSBUb2tlbi1SaW5nCisJICBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCAzYzM1OS4KKworCSAgQWxzbyByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy8zYzM1OS50eHQ+IG9yIGNoZWNrIHRoZSAKKwkgIExpbnV4IFRva2VuIFJpbmcgUHJvamVjdCBzaXRlIGZvciB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uIGF0CisJICA8aHR0cDovL3d3dy5saW51eHRyLm5ldD4KKworY29uZmlnIFRNUzM4MFRSCisJdHJpc3RhdGUgIkdlbmVyaWMgVE1TMzgwIFRva2VuIFJpbmcgSVNBL1BDSSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiAoUENJIHx8IElTQSkKKwlzZWxlY3QgRldfTE9BREVSCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2VuZXJpYyBzdXBwb3J0IGZvciB0b2tlbiByaW5nIGFkYXB0ZXJzCisJICBiYXNlZCBvbiB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzgwIHNlcmllcyBjaGlwc2V0cy4gIFRoaXMKKwkgIGluY2x1ZGVzIHRoZSBTeXNLb25uZWN0IFRSNC8xNigrKSBJU0EgKFNLLTQxOTApLCBTeXNLb25uZWN0CisJICBUUjQvMTYoKykgUENJIChTSy00NTkwKSwgU3lzS29ubmVjdCBUUjQvMTYgUENJIChTSy00NTkxKSwKKwkgIENvbXBhcSA0LzE2IFBDSSwgVGhvbWFzLUNvbnJhZCBUQzQwNDggNC8xNiBQQ0ksIGFuZCBzZXZlcmFsCisJICBNYWRnZSBhZGFwdGVycy4gIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhc2tlZCB0byBzZWxlY3QKKwkgIHdoaWNoIGNhcmRzIHRvIHN1cHBvcnQgYmVsb3cuICBJZiB5b3UncmUgdXNpbmcgbW9kdWxlcywgZWFjaAorCSAgY2xhc3Mgb2YgY2FyZCB3aWxsIGJlIHN1cHBvcnRlZCBieSBhIHNlcGFyYXRlIG1vZHVsZS4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSBpdCwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBUb2tlbi1SaW5nIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBBbHNvIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RtczM4MHRyLnR4dD4gb3IKKwkgIGNoZWNrIDxodHRwOi8vd3d3LmF1ay5jeC90bXMzODB0ci8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB0bXMzODB0ci4KKworY29uZmlnIFRNU1BDSQorCXRyaXN0YXRlICJHZW5lcmljIFRNUzM4MCBQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFRNUzM4MFRSICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyBnZW5lcmljIFRNUzM4MC1iYXNlZCBQQ0kgY2FyZHMuCisKKwkgIFRoZXNlIGNhcmRzIGFyZSBrbm93biB0byB3b3JrOgorCSAgLSBDb21wYXEgNC8xNiBUUiBQQ0kKKwkgIC0gU3lzS29ubmVjdCBUUjQvMTYgUENJIChTSy00NTkwL1NLLTQ1OTEpCisJICAtIFRob21hcy1Db25yYWQgVEM0MDQ4IFBDSSA0LzE2CisJICAtIDNDb20gVG9rZW4gTGluayBWZWxvY2l0eQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB0bXNwY2kuCisKK2NvbmZpZyBTS0lTQQorCXRyaXN0YXRlICJTeXNLb25uZWN0IFRSNC8xNiBJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFRNUzM4MFRSICYmIElTQQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyBTeXNLb25uZWN0IFRSNC8xNiBJU0EgY2FyZHMuCisKKwkgIFRoZXNlIGNhcmRzIGFyZSBrbm93biB0byB3b3JrOgorCSAgLSBTeXNLb25uZWN0IFRSNC8xNiBJU0EgKFNLLTQxOTApCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNraXNhLgorCitjb25maWcgUFJPVEVPTgorCXRyaXN0YXRlICJQcm90ZW9uIElTQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgVE1TMzgwVFIgJiYgSVNBCisJaGVscAorCSAgVGhpcyB0bXMzODAgbW9kdWxlIHN1cHBvcnRzIFByb3Rlb24gSVNBIGNhcmRzLgorCisJICBUaGVzZSBjYXJkcyBhcmUga25vd24gdG8gd29yazoKKwkgIC0gUHJvdGVvbiAxMzkyCisJICAtIFByb3Rlb24gMTM5MiBwbHVzCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHByb3Rlb24uCisKK2NvbmZpZyBBQllTUworCXRyaXN0YXRlICJNYWRnZSBTbWFydCAxNi80IFBDSSBNazIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFRNUzM4MFRSICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyB0aGUgTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyCisJICBjYXJkcyAoNTEtMDIpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBhYnlzcy4KKworY29uZmlnIE1BREdFTUMKKwl0cmlzdGF0ZSAiTWFkZ2UgU21hcnQgMTYvNCBSaW5nbm9kZSBNaWNyb0NoYW5uZWwiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBNQ0FfTEVHQUNZCisJaGVscAorCSAgVGhpcyB0bXMzODAgbW9kdWxlIHN1cHBvcnRzIHRoZSBNYWRnZSBTbWFydCAxNi80IE1DMTYgYW5kIE1DMzIKKwkgIE1pY3JvQ2hhbm5lbCBhZGFwdGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgbWFkZ2VtYy4KKworY29uZmlnIFNNQ1RSCisJdHJpc3RhdGUgIlNNQyBJU0EvTUNBIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIChJU0EgfHwgTUNBX0xFR0FDWSkgJiYgKEJST0tFTiB8fCAhNjRCSVQpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgSVNBIGFuZCBNQ0EgU01DIFRva2VuIFJpbmcgY2FyZHMsCisJICBzcGVjaWZpY2FsbHkgU01DIFRva2VuQ2FyZCBFbGl0ZSAoODExNVQpIGFuZCBTTUMgVG9rZW5DYXJkIEVsaXRlL0EKKwkgICg4MTE1VC9BKSBhZGFwdGVycy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSBpdCwgc2F5IFkgb3IgTSBhbmQKKwkgIHJlYWQgdGhlIFRva2VuLVJpbmcgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4gYW5kIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc21jdHIudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc21jdHIuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGIwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIworIyBNYWtlZmlsZSBmb3IgZHJpdmVycy9uZXQvdG9rZW5yaW5nCisjCisKK29iai0kKENPTkZJR19JQk1UUikgCSs9IGlibXRyLm8KK29iai0kKENPTkZJR19JQk1PTCkgCSs9IG9seW1waWMubworb2JqLSQoQ09ORklHX0lCTUxTKSAJKz0gbGFuc3RyZWFtZXIubworb2JqLSQoQ09ORklHX1RNUzM4MFRSKSAJKz0gdG1zMzgwdHIubworb2JqLSQoQ09ORklHX0FCWVNTKSAJKz0gYWJ5c3Mubworb2JqLSQoQ09ORklHX01BREdFTUMpIAkrPSBtYWRnZW1jLm8KK29iai0kKENPTkZJR19QUk9URU9OKSAJKz0gcHJvdGVvbi5vCitvYmotJChDT05GSUdfVE1TUENJKSAJKz0gdG1zcGNpLm8KK29iai0kKENPTkZJR19TS0lTQSkgCSs9IHNraXNhLm8KK29iai0kKENPTkZJR19TTUNUUikgCSs9IHNtY3RyLm8KK29iai0kKENPTkZJR18zQzM1OSkJKz0gM2MzNTkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRhMmJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiAgYWJ5c3MuYzogTmV0d29yayBkcml2ZXIgZm9yIHRoZSBNYWRnZSBTbWFydCAxNi80IFBDSSBNazIgdG9rZW4gcmluZyBjYXJkLgorICoKKyAqICBXcml0dGVuIDE5OTktMjAwMCBieSBBZGFtIEZyaXR6bGVyCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICBUaGlzIGRyaXZlciBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjYXJkczoKKyAqICAgICAgLSBNYWRnZSBTbWFydCAxNi80IFBDSSBNazIKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEFGCUFkYW0gRnJpdHpsZXIJCW1pZEBhdWsuY3gKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkzMC1EZWMtOTkJQUYJU3BsaXQgb2ZmIGZyb20gdGhlIHRtczM4MHRyIGRyaXZlci4KKyAqCTIyLUphbi0wMAlBRglVcGRhdGVkIHRvIHVzZSBpbmRpcmVjdCByZWFkL3dyaXRlcyAKKyAqCTIzLU5vdi0wMAlKRwlOZXcgUENJIEFQSSwgY2xlYW51cHMKKyAqCisgKgorICogIFRPRE86CisgKgkxLiBTZWUgaWYgd2UgY2FuIHVzZSBNTUlPIGluc3RlYWQgb2YgaW5iL291dGIvaW53L291dHcKKyAqCTIuIEFkZCBzdXBwb3J0IGZvciBNazEgKGhhcyBBVDI0IGF0dGFjaGVkIHRvIHRoZSBQQ0kKKyAqCQljb25maWcgcmVnaXN0ZXJzKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJ0bXMzODB0ci5oIgorI2luY2x1ZGUgImFieXNzLmgiICAgICAgICAgICAgLyogTWFkZ2Utc3BlY2lmaWMgY29uc3RhbnRzICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyJhYnlzcy5jOiB2MS4wMiAyMy8xMS8yMDAwIGJ5IEFkYW0gRnJpdHpsZXJcbiI7CisKKyNkZWZpbmUgQUJZU1NfSU9fRVhURU5UIDY0CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhYnlzc19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX01BREdFLCBQQ0lfREVWSUNFX0lEX01BREdFX01LMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ORVRXT1JLX1RPS0VOX1JJTkcgPDwgOCwgMHgwMGZmZmZmZiwgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhYnlzc19wY2lfdGJsKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGFieXNzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFieXNzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWJ5c3NfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhYnlzc19jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhYnlzc19yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhYnlzc19zZXRuc2Vsb3V0X3BpbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGF0MjRfd3JpdGVkYXRhYnl0ZSh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgYnl0ZSk7CitzdGF0aWMgaW50IGF0MjRfc2VuZGZ1bGxjbWQodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGNtZCwgdW5zaWduZWQgY2hhciBhZGRyKTsKK3N0YXRpYyBpbnQgYXQyNF9zZW5kY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkZGF0YWJpdCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyBpbnQgYXQyNF93YWl0Zm9yYWNrKHVuc2lnbmVkIGxvbmcgcmVnYWRkcik7CitzdGF0aWMgaW50IGF0MjRfd2FpdGZvcm5hY2sodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyB2b2lkIGF0MjRfc2V0bGluZXModW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGNsb2NrLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworc3RhdGljIHZvaWQgYXQyNF9zdGFydCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkYih1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgYWRkcik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhYnlzc19zaWZyZWFkYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhYnlzc19zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGFieXNzX3NpZndyaXRlYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlvdXRiKHZhbCwgZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhYnlzc19zaWZ3cml0ZXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0dyh2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWJ5c3NfYXR0YWNoKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorewkKKwlzdGF0aWMgaW50IHZlcnNpb25wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisJaW50IGksIHJldCwgcGNpX2lycV9saW5lOworCXVuc2lnbmVkIGxvbmcgcGNpX2lvYWRkcjsKKwkKKwlpZiAodmVyc2lvbnByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoIiVzIiwgdmVyc2lvbik7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCisJLyogUmVtb3ZlIEkvTyBzcGFjZSBtYXJrZXIgaW4gYml0IDAuICovCisJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCXBjaV9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworCQkKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCQkKKwlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX2lvYWRkciwgQUJZU1NfSU9fRVhURU5ULCBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0X3RyZGV2OworCX0KKwkJCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjsKKwkJCisJZGV2LT5iYXNlX2FkZHIJPSBwY2lfaW9hZGRyOworCWRldi0+aXJxCT0gcGNpX2lycV9saW5lOworCQkKKwlwcmludGsoIiVzOiBNYWRnZSBTbWFydCAxNi80IFBDSSBNazIgKEFieXNzKVxuIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiVzOiAgICBJTzogJSM0bHggIElSUTogJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcGNpX2lvYWRkciwgZGV2LT5pcnEpOworCS8qCisJICogVGhlIFRNUyBTSUYgcmVnaXN0ZXJzIGxheSAweDEwIGFib3ZlIHRoZSBjYXJkIGJhc2UgYWRkcmVzcy4KKwkgKi8KKwlkZXYtPmJhc2VfYWRkciArPSAweDEwOworCQkKKwlyZXQgPSB0bXNkZXZfaW5pdChkZXYsIFBDSV9NQVhfQUREUkVTUywgcGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoIiVzOiB1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3IgZGV2LT5wcml2LlxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKworCWFieXNzX3JlYWRfZWVwcm9tKGRldik7CisJCQorCXByaW50aygiJXM6ICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+c2V0bnNlbG91dCA9IGFieXNzX3NldG5zZWxvdXRfcGluczsKKwl0cC0+c2lmcmVhZGIgPSBhYnlzc19zaWZyZWFkYjsKKwl0cC0+c2lmcmVhZHcgPSBhYnlzc19zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gYWJ5c3Nfc2lmd3JpdGViOworCXRwLT5zaWZ3cml0ZXcgPSBhYnlzc19zaWZ3cml0ZXc7CisKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgIk1hZGdlIFBDSSAxNi80IE1rMiIsIFBST0RfSURfU0laRSArIDEpOworCQkKKwlkZXYtPm9wZW4gPSBhYnlzc19vcGVuOworCWRldi0+c3RvcCA9IGFieXNzX2Nsb3NlOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF90bXNkZXY7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdG1zZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl0bXNkZXZfdGVybShkZXYpOworZXJyX291dF9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworZXJyX291dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24ocGNpX2lvYWRkciwgQUJZU1NfSU9fRVhURU5UKTsKK2Vycl9vdXRfdHJkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSAweDAxOyAgLyogU2V0IDRNYnBzICovCisJZWxzZQorCQl2YWwgfD0gMHgwMDsgIC8qIFNldCAxNk1icHMgKi8KKwkKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBNYWRnZSBib2FyZHMgc2hvdWxkIHVzZSB0aGlzIGNvZGU6CisgKiAgIC0gU21hcnQgMTYvNCBQQ0kgTWsyIChBYnlzcykKKyAqICAgLSBTbWFydCAxNi80IFBDSSBNazEgKFBDSSBUKQorICogICAtIFNtYXJ0IDE2LzQgQ2xpZW50IFBsdXMgUG5QIChCaWcgQXBwbGUpCisgKiAgIC0gU21hcnQgMTYvNCBDYXJkYnVzIE1rMgorICoKKyAqIFRoZXNlIGFjY2VzcyBhbiBBdG1lbCBBVDI0IFNFRVBST00gdXNpbmcgdGhlaXIgZ2x1ZSBjaGlwIHJlZ2lzdGVycy4gCisgKgorICovCitzdGF0aWMgdm9pZCBhdDI0X3dyaXRlZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDAsIChieXRlID4+ICg3LWkpKSYweDAxKTsKKwkJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAxLCAoYnl0ZSA+PiAoNy1pKSkmMHgwMSk7CisJCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgKGJ5dGUgPj4gKDctaSkpJjB4MDEpOworCX0KK30KKworc3RhdGljIGludCBhdDI0X3NlbmRmdWxsY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlpZiAoYXQyNF9zZW5kY21kKHJlZ2FkZHIsIGNtZCkpIHsKKwkJYXQyNF93cml0ZWRhdGFieXRlKHJlZ2FkZHIsIGFkZHIpOworCQlyZXR1cm4gYXQyNF93YWl0Zm9yYWNrKHJlZ2FkZHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDI0X3NlbmRjbWQodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlhdDI0X3N0YXJ0KHJlZ2FkZHIpOworCQlhdDI0X3dyaXRlZGF0YWJ5dGUocmVnYWRkciwgY21kKTsKKwkJaWYgKGF0MjRfd2FpdGZvcmFjayhyZWdhZGRyKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkZGF0YWJpdCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDAsIDEpOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMSwgMSk7CisJdmFsID0gKGluYihyZWdhZGRyKSAmIEFUMjRfREFUQSk/MTowOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMSwgMSk7CisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAxKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdDI0X3JlYWRkYXRhYnl0ZSh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMDsKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWRhdGEgPDw9IDE7CisJCWRhdGEgfD0gYXQyNF9yZWFkZGF0YWJpdChyZWdhZGRyKTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBhdDI0X3dhaXRmb3JhY2sodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmICgoYXQyNF9yZWFkZGF0YWJpdChyZWdhZGRyKSAmIDB4MDEpID09IDB4MDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQyNF93YWl0Zm9ybmFjayh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJaWYgKChhdDI0X3JlYWRkYXRhYml0KHJlZ2FkZHIpICYgMHgwMSkgPT0gMHgwMSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQyNF9zZXRsaW5lcyh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgY2xvY2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbCA9IEFUMjRfRU5BQkxFOworCWlmIChjbG9jaykKKwkJdmFsIHw9IEFUMjRfQ0xPQ0s7CisJaWYgKGRhdGEpCisJCXZhbCB8PSBBVDI0X0RBVEE7CisKKwlvdXRiKHZhbCwgcmVnYWRkcik7IAorCXRtczM4MHRyX3dhaXQoMjApOyAvKiBWZXJ5IG5lY2Vzc2FyeS4gKi8KK30KKworc3RhdGljIHZvaWQgYXQyNF9zdGFydCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpCit7CisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAxKTsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDEpOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMSwgMCk7CisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkYih1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGEgPSAweGZmOworCQorCWlmIChhdDI0X3NlbmRmdWxsY21kKHJlZ2FkZHIsIEFUMjRfV1JJVEUsIGFkZHIpKSB7CisJCWlmIChhdDI0X3NlbmRjbWQocmVnYWRkciwgQVQyNF9SRUFEKSkgeworCQkJZGF0YSA9IGF0MjRfcmVhZGRhdGFieXRlKHJlZ2FkZHIpOworCQkJaWYgKCFhdDI0X3dhaXRmb3JuYWNrKHJlZ2FkZHIpKQorCQkJCWRhdGEgPSAweGZmOworCQl9CisJfQorCXJldHVybiBkYXRhOworfQorCisKKy8qCisgKiBFbmFibGUgYmFzaWMgZnVuY3Rpb25zIG9mIHRoZSBNYWRnZSBjaGlwc2V0IG5lZWRlZAorICogZm9yIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZCBhYnlzc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc2V0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwkKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlyZXNldF9yZWcgPSBpbmIoaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJcmVzZXRfcmVnIHw9IFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKwl0bXMzODB0cl93YWl0KDEwMCk7Cit9CisKKy8qCisgKiBFbmFibGUgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgTWFkZ2UgY2hpcHNldCBuZWVkZWQgZm9yCisgKiBmdWxsIHdvcmtpbmcgb3JkZXIuIAorICovCitzdGF0aWMgaW50IGFieXNzX2NoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgcmVzZXRfcmVnOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCQorCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCXJlc2V0X3JlZyA9IGluYihpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKwkKKwlyZXNldF9yZWcgfD0gUENJQk0yX1JFU0VUX1JFR19DSElQX05SRVM7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCQorCXJlc2V0X3JlZyAmPSB+KFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTIHwKKwkJICAgICAgIFBDSUJNMl9SRVNFVF9SRUdfRklGT19OUkVTIHwgCisJCSAgICAgICBQQ0lCTTJfUkVTRVRfUkVHX1NJRl9OUkVTKTsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJCisJdG1zMzgwdHJfd2FpdCgxMDApOworCQorCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX0NISVBfTlJFUzsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJCisJcmVzZXRfcmVnIHw9IFBDSUJNMl9SRVNFVF9SRUdfU0lGX05SRVM7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCisJcmVzZXRfcmVnIHw9IFBDSUJNMl9SRVNFVF9SRUdfRklGT19OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKworCW91dGIoUENJQk0yX0lOVF9DT05UUk9MX1JFR19TSU5URU4gfCAKKwkgICAgIFBDSUJNMl9JTlRfQ09OVFJPTF9SRUdfUENJX0VSUl9FTkFCTEUsIAorCSAgICAgaW9hZGRyICsgUENJQk0yX0lOVF9DT05UUk9MX1JFRyk7CisgIAorCW91dGIoMzAsIGlvYWRkciArIFBDSUJNMl9GSUZPX1RIUkVTSE9MRCk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhYnlzc19jaGlwc2V0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJb3V0YigwLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKK30KKworLyoKKyAqIFJlYWQgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlIEFUMjQgU0VFUFJPTSBvbiBNYWRnZSBjYXJkcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFieXNzX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCWludCBpOworCQorCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwkvKiBNdXN0IGVuYWJsZSBnbHVlIGNoaXAgZmlyc3QgKi8KKwlhYnlzc19lbmFibGUoZGV2KTsKKwkKKwl2YWwgPSBhdDI0X3JlYWRiKGlvYWRkciArIFBDSUJNMl9TRUVQUk9NX1JFRywgCisJCQkgUENJQk0yX1NFRVBST01fUklOR19TUEVFRCk7CisJdHAtPkRhdGFSYXRlID0gdmFsP1NQRUVEXzQ6U1BFRURfMTY7IC8qIHNldCBvcGVuIHNwZWVkICovCisJcHJpbnRrKCIlczogICAgU0VFUFJPTTogcmluZyBzcGVlZDogJWRNYi9zZWNcbiIsIGRldi0+bmFtZSwgdHAtPkRhdGFSYXRlKTsKKwkKKwl2YWwgPSBhdDI0X3JlYWRiKGlvYWRkciArIFBDSUJNMl9TRUVQUk9NX1JFRywKKwkJCSBQQ0lCTTJfU0VFUFJPTV9SQU1fU0laRSkgKiAxMjg7CisJcHJpbnRrKCIlczogICAgU0VFUFJPTTogYWRhcHRlciBSQU06ICVka2JcbiIsIGRldi0+bmFtZSwgdmFsKTsKKwkKKwlkZXYtPmFkZHJfbGVuID0gNjsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGF0MjRfcmVhZGIoaW9hZGRyICsgUENJQk0yX1NFRVBST01fUkVHLCAKKwkJCQkJICAgICAgUENJQk0yX1NFRVBST01fQklBK2kpOworfQorCitzdGF0aWMgaW50IGFieXNzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorCWFieXNzX2NoaXBzZXRfaW5pdChkZXYpOworCXRtczM4MHRyX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYnlzc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXRtczM4MHRyX2Nsb3NlKGRldik7CisJYWJ5c3NfY2hpcHNldF9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWJ5c3NfZGV0YWNoIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCQorCWlmICghZGV2KQorCQlCVUcoKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLTB4MTAsIEFCWVNTX0lPX0VYVEVOVCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJdG1zZGV2X3Rlcm0oZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFieXNzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWJ5c3MiLAorCS5pZF90YWJsZQk9IGFieXNzX3BjaV90YmwsCisJLnByb2JlCQk9IGFieXNzX2F0dGFjaCwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFieXNzX2RldGFjaCksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYnlzc19pbml0ICh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhYnlzc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWJ5c3Nfcm1tb2QgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmYWJ5c3NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWJ5c3NfaW5pdCk7Cittb2R1bGVfZXhpdChhYnlzc19ybW1vZCk7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgYWJ5c3MuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgYWJ5c3MuYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU2ZTRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmgKQEAgLTAsMCArMSw1OCBAQAorLyogCisgKiBhYnlzcy5oOiBIZWFkZXIgZm9yIHRoZSBhYnlzcyB0bXMzODB0ciBtb2R1bGUKKyAqCisgKiBBdXRob3JzOgorICogLSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NQURHRVRSX0gKKyNkZWZpbmUgX19MSU5VWF9NQURHRVRSX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIEZvciBNYWRnZSBTbWFydCAxNi80IFBDSSBNazIuICBTaW5jZSB3ZSBpbmNyZW1lbnQgdGhlIGJhc2UgYWRkcmVzcworICogdG8gZ2V0IGV2ZXJ5dGhpbmcgY29ycmVjdCBmb3IgdGhlIFRNUyBTSUYsIHdlIGRvIHRoZXNlIGFzIG5lZ2F0aXZlcworICogYXMgdGhleSBmYWxsIGJlbG93IHRoZSBTSUYgaW4gYWRkcmVzc2luZy4KKyAqLworI2RlZmluZSBQQ0lCTTJfSU5UX1NUQVRVU19SRUcgICAgICAgICAgKChzaG9ydCktMTUpLyogMHgwMSAqLworI2RlZmluZSBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHICAgICAgICAgKChzaG9ydCktMTQpLyogMHgwMiAqLworI2RlZmluZSBQQ0lCTTJfUkVTRVRfUkVHICAgICAgICAgICAgICAgKChzaG9ydCktMTIpLyogMHgwNCAqLworI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9SRUcgICAgICAgICAgICAgKChzaG9ydCktOSkgLyogMHgwNyAqLworCisjZGVmaW5lIFBDSUJNMl9JTlRfQ09OVFJPTF9SRUdfU0lOVEVOICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDSUJNMl9JTlRfQ09OVFJPTF9SRUdfUENJX0VSUl9FTkFCTEUgICAweDgwCisjZGVmaW5lIFBDSUJNMl9JTlRfU1RBVFVTX1JFR19QQ0lfRVJSICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgUENJQk0yX1JFU0VUX1JFR19DSElQX05SRVMgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUENJQk0yX1JFU0VUX1JFR19GSUZPX05SRVMgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUENJQk0yX1JFU0VUX1JFR19TSUZfTlJFUyAgICAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBQQ0lCTTJfRklGT19USFJFU0hPTEQgICAweDIxCisjZGVmaW5lIFBDSUJNMl9CVVJTVF9MRU5HVEggICAgIDB4MjIKKworLyoKKyAqIEJpdHMgaW4gUENJQk0yX1NFRVBST01fUkVHLgorICovCisjZGVmaW5lIEFUMjRfRU5BQkxFICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVQyNF9EQVRBICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBBVDI0X0NMT0NLICAgICAgICAgICAgICAweDAxCisKKy8qCisgKiBBVDI0IENvbW1hbmRzLgorICovCisjZGVmaW5lIEFUMjRfV1JJVEUgICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgQVQyNF9SRUFEICAgICAgICAgICAgICAgMHhBMQorCisvKgorICogQWRkcmVzc2VzIGluIEFUMjQgU0VFUFJPTS4KKyAqLworI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9CSUEgICAgICAgICAgMHgxMgorI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9SSU5HX1NQRUVEICAgMHgxOAorI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9SQU1fU0laRSAgICAgMHgxQQorI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9IV0YxICAgICAgICAgMHgxQworI2RlZmluZSBQQ0lCTTJfU0VFUFJPTV9IV0YyICAgICAgICAgMHgxRQorCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19MSU5VWF9NQURHRVRSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5ODg2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCkBAIC0wLDAgKzEsMTk4NyBAQAorLyogaWJtdHIuYzogIEEgc2hhcmVkLW1lbW9yeSBJQk0gVG9rZW4gUmluZyAxNi80IGRyaXZlciBmb3IgbGludXgKKyAqCisgKglXcml0dGVuIDE5OTMgYnkgTWFyayBTd2Fuc29uIGFuZCBQZXRlciBEZSBTY2hyaWp2ZXIuCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCVRoaXMgZGV2aWNlIGRyaXZlciBzaG91bGQgd29yayB3aXRoIEFueSBJQk0gVG9rZW4gUmluZyBDYXJkIHRoYXQgZG9lcworICoJbm90IHVzZSBETUEuCisgKgorICoJSSB1c2VkIERvbmFsZCBCZWNrZXIncyAoYmVja2VyQHNjeWxkLmNvbSkgZGV2aWNlIGRyaXZlciB3b3JrCisgKglhcyBhIGJhc2UgZm9yIG1vc3Qgb2YgbXkgaW5pdGlhbCB3b3JrLgorICoKKyAqCUNoYW5nZXMgYnkgUGV0ZXIgRGUgU2NocmlqdmVyCisgKgkJKFBldGVyLkRlc2NocmlqdmVyQGxpbnV4LmNjLmt1bGV1dmVuLmFjLmJlKSA6CisgKgorICoJKyBjaGFuZ2VkIG5hbWUgdG8gaWJtdHIuYyBpbiBhbnRpY2lwYXRpb24gb2Ygb3RoZXIgdHIgYm9hcmRzLgorICoJKyBjaGFuZ2VkIHJlc2V0IGNvZGUgYW5kIGFkYXB0ZXIgb3BlbiBjb2RlLgorICoJKyBhZGRlZCBTQVAgb3BlbiBjb2RlLgorICoJKyBhIGZpcnN0IGF0dGVtcHQgdG8gd3JpdGUgaW50ZXJydXB0LCB0cmFuc21pdCBhbmQgcmVjZWl2ZSByb3V0aW5lcy4KKyAqCisgKglDaGFuZ2VzIGJ5IERhdmlkIFcuIE1vcnJpcyAoZHdtQHNoZWxsLnBvcnRhbC5jb20pIDoKKyAqCTk0MTAwMyBkd206IC0gUmVzdHJ1Y3R1cmUgdG9rX3Byb2JlIGZvciBtdWx0aXBsZSBhZGFwdGVycywgZGV2aWNlcy4KKyAqCSsgQWRkIGNvbW1lbnRzLCBtaXNjIHJlb3JnIGZvciBjbGFyaXR5LgorICoJKyBGbGF0dGVuIGludGVycnVwdCBoYW5kbGVyIGxldmVscy4KKyAqCisgKglDaGFuZ2VzIGJ5IEZhcnphZCBGYXJpZCAoZmFyenlAemVuLnZpYS5lY3AuZnIpCisgKglhbmQgUGFzY2FsIEFuZHJlIChhbmRyZUBjaGltYXkudmlhLmVjcC5mcikgKE1hcmNoIDkgMTk5NSkgOgorICoJKyBtdWx0aSByaW5nIHN1cHBvcnQgY2xlYW4gdXAuCisgKgkrIFJGQzEwNDIgY29tcGxpYW5jZSBlbmhhbmNlZC4KKyAqCisgKglDaGFuZ2VzIGJ5IFBhc2NhbCBBbmRyZSAoYW5kcmVAY2hpbWF5LnZpYS5lY3AuZnIpIChTZXB0ZW1iZXIgNyAxOTk1KSA6CisgKgkrIGJ1ZyBjb3JyZWN0aW9uIGluIHRyX3R4CisgKgkrIHJlbW92ZWQgcmVkdW5kYW50IGluZm9ybWF0aW9uIGRpc3BsYXkKKyAqCSsgc29tZSBjb2RlIHJld29ya2luZworICoKKyAqCUNoYW5nZXMgYnkgTWljaGVsIExlc3BpbmFzc2UgKHdhbGtlbkB2aWEuZWNwLmZyKSwKKyAqCVlhbm4gRG91c3NvdCAoZG91c3NvdEB2aWEuZWNwLmZyKSBhbmQgUGFzY2FsIEFuZHJlIChhbmRyZUB2aWEuZWNwLmZyKQorICoJKEZlYnJ1YXJ5IDE4LCAxOTk2KSA6CisgKgkrIG1vZGlmaWVkIHNoYXJlZCBtZW1vcnkgYW5kIG1taW8gYWNjZXNzIHBvcnQgdGhlIGRyaXZlciB0bworICoJICBhbHBoYSBwbGF0Zm9ybSAoc3RydWN0dXJlIGFjY2VzcyAtPiByZWFkYi93cml0ZWIpCisgKgorICoJQ2hhbmdlcyBieSBTdGV2ZSBLaXBpc3ogKGJ1bmd5QGlibS5uZXQgb3Iga2lwaXN6QHZuZXQuaWJtLmNvbSkKKyAqCShKYW51YXJ5IDE4IDE5OTYpOgorICoJKyBzd2FwcGVkIFdXT1IgYW5kIFdXQ1IgaW4gaWJtdHIuaAorICoJKyBtb3ZlZCBzb21lIGluaXQgY29kZSBmcm9tIHRva19wcm9iZSBpbnRvIHRyZGV2X2luaXQuICBUaGUKKyAqCSAgUENNQ0lBIGNvZGUgY2FuIGNhbGwgdHJkZXZfaW5pdCB0byBjb21wbGV0ZSBpbml0aWFsaXppbmcKKyAqCSAgdGhlIGRyaXZlci4KKyAqCSsgYWRkZWQgLURQQ01DSUEgdG8gc3VwcG9ydCBQQ01DSUEKKyAqCSsgZGV0ZWN0aW5nIFBDTUNJQSBDYXJkIFJlbW92YWwgaW4gaW50ZXJydXB0IGhhbmRsZXIuICBJZgorICoJICBJU1JQIGlzIEZGLCB0aGVuIGEgUENNQ0lBIGNhcmQgaGFzIGJlZW4gcmVtb3ZlZAorICogICAgICAgIDEwLzIwMDAgQnVydCBuZWVkZWQgYSBuZXcgbWV0aG9kIHRvIGF2b2lkIGNyYXNoaW5nIHRoZSBPUworICoKKyAqCUNoYW5nZXMgYnkgUGF1bCBOb3J0b24gKHBub3J0b25AY3RzLmNvbSkgOgorICoJKyByZXN0cnVjdHVyZWQgdGhlIFJFQUQuTE9HIGxvZ2ljIHRvIHByZXZlbnQgdGhlIHRyYW5zbWl0IFNSQgorICoJICBmcm9tIGJlaW5nIHJ1ZGVseSBvdmVyd3JpdHRlbiBiZWZvcmUgdGhlIHRyYW5zbWl0IGN5Y2xlIGlzCisgKgkgIGNvbXBsZXRlLiAoQXVndXN0IDE1IDE5OTYpCisgKgkrIGNvbXBsZXRlZCBtdWx0aXBsZSBhZGFwdGVyIHN1cHBvcnQuIChOb3ZlbWJlciAyMCAxOTk2KQorICoJKyBpbXBsZW1lbnRlZCBjc3VtX3BhcnRpYWxfY29weSBpbiB0cl9yeCBhbmQgaW5jcmVhc2VkIHJlY2VpdmUgCisgKiAgICAgICAgYnVmZmVyIHNpemUgYW5kIGNvdW50LiBNaW5vciBmaXhlcy4gKE1hcmNoIDE1LCAxOTk3KQorICoKKyAqCUNoYW5nZXMgYnkgQ2hyaXN0b3BoZXIgVHVyY2tzaW4gPHdhYmJpdEBydGZjLmRlbW9uLmNvLnVrPgorICoJKyBOb3cgY29tcGlsZXMgb2sgYXMgYSBtb2R1bGUgYWdhaW4uCisgKgorICoJQ2hhbmdlcyBieSBQYXVsIE5vcnRvbiAocG5vcnRvbkBpZWVlLm9yZykgOgorICogICAgICArIG1vdmVkIHRoZSBoZWFkZXIgbWFuaXB1bGF0aW9uIGNvZGUgaW4gdHJfdHggYW5kIHRyX3J4IHRvCisgKiAgICAgICAgbmV0LzgwMi90ci5jLiAoSnVseSAxMiAxOTk3KQorICogICAgICArIGFkZCByZXRyeSBhbmQgdGltZW91dCBvbiBvcGVuIGlmIGNhYmxlIGRpc2Nvbm5lY3RlZC4gKE1heSA1IDE5OTgpCisgKiAgICAgICsgbGlmdGVkIDIwMDAgYnl0ZSBtdHUgbGltaXQuIG5vdyBkZXBlbmRzIG9uIHNoYXJlZC1SQU0gc2l6ZS4KKyAqICAgICAgICBNYXkgMjUgMTk5OCkKKyAqICAgICAgKyBjYW4ndCBhbGxvY2F0ZSAyayByZWN2IGJ1ZmYgYXQgOGsgc2hhcmVkLVJBTS4gKDIwIE9jdG9iZXIgMTk5OCkKKyAqCisgKiAgICAgIENoYW5nZXMgYnkgSm9lbCBTbG9hbiAoampzQGMtbWUuY29tKSA6CisgKiAgICAgICsgZGlzYWJsZSB2ZXJib3NlIGRlYnVnIG1lc3NhZ2VzIGJ5IGRlZmF1bHQgLSB0byBlbmFibGUgdmVyYm9zZQorICoJICBkZWJ1Z2dpbmcsIGVkaXQgdGhlIElCTVRSX0RFQlVHX01FU1NBR0VTIGRlZmluZSBiZWxvdyAKKyAqCQorICoJQ2hhbmdlcyBieSBNaWtlIFBoaWxsaXBzIDxwaGlsbGltQGFtdHJhay5jb20+IDoKKyAqCSsgQWRkZWQgZXh0cmEgI2lmZGVmJ3MgdG8gd29yayB3aXRoIG5ldyBQQ01DSUEgVG9rZW4gUmluZyBDb2RlLgorICoJICBUaGUgUENNQ0lBIGNvZGUgbm93IGp1c3Qgc2V0cyB1cCB0aGUgY2FyZCBzbyBpdCBjYW4gYmUgcmVjb2duaXplZAorICogICAgICAgIGJ5IGlibXRyX3Byb2JlLiBBbHNvIGNoZWNrcyBhbGxvY2F0ZWQgbWVtb3J5IHZzLiBvbi1ib2FyZCBtZW1vcnkKKyAqCSAgZm9yIGNvcnJlY3QgZmlndXJlIHRvIHVzZS4KKyAqCisgKglDaGFuZ2VzIGJ5IFRpbSBIb2NraW4gKHRob2NraW5AaXN1bml4Lml0Lmlsc3R1LmVkdSkgOgorICoJKyBhZGRlZCBzcGlubG9ja3MgZm9yIFNNUCBzYW5pdHkgKDEwIE1hcmNoIDE5OTkpCisgKgorICogICAgICBDaGFuZ2VzIGJ5IEpvY2hlbiBGcmllZHJpY2ggdG8gZW5hYmxlIFJGQzE0NjkgT3B0aW9uIDIgbXVsdGljYXN0aW5nCisgKiAgICAgIGkuZS4gdXNpbmcgZnVuY3Rpb25hbCBhZGRyZXNzIEMwIDAwIDAwIDA0IDAwIDAwIHRvIHRyYW5zbWl0IGFuZCAKKyAqICAgICAgcmVjZWl2ZSBtdWx0aWNhc3QgcGFja2V0cy4KKyAqCisgKiAgICAgIENoYW5nZXMgYnkgTWlrZSBTdWxsaXZhbiAoYmFzZWQgb24gb3JpZ2luYWwgc3JhbSBwYXRjaCBieSBEYXZlIEdyb3RoZQorICogICAgICB0byBzdXBwb3J0IHdpbmRvd2luZyBpbnRvIG9uIGFkYXB0ZXIgc2hhcmVkIHJhbS4KKyAqICAgICAgaS5lLiBVc2UgTEFOQUlEIHRvIHNldHVwIGEgUG5QIGNvbmZpZ3VyYXRpb24gd2l0aCAxNksgUkFNLiBQYWdpbmcKKyAqICAgICAgd2lsbCBzaGlmdCB0aGlzIDE2SyB3aW5kb3cgb3ZlciB0aGUgZW50aXJlIGF2YWlsYWJsZSBzaGFyZWQgUkFNLgorICoKKyAqICAgICAgQ2hhbmdlcyBieSBQZXRlciBEZSBTY2hyaWp2ZXIgKHAyQG1pbmQuYmUpIDoKKyAqICAgICAgKyBmaXhlZCBhIHByb2JsZW0gd2l0aCBQQ01DSUEgY2FyZCByZW1vdmFsCisgKgorICogICAgICBDaGFuZ2UgYnkgTWlrZSBTdWxsaXZhbiBldCBhbC46CisgKiAgICAgICsgYWRkZWQgdHVyYm8gY2FyZCBzdXBwb3J0LiBObyBuZWVkIHRvIHVzZSBsYW5haWQgdG8gY29uZmlndXJlCisgKiAgICAgIHRoZSBhZGFwdGVyIGludG8gaXNhIGNvbXBhdGlibGl0eSBtb2RlLgorICoKKyAqICAgICAgQ2hhbmdlcyBieSBCdXJ0IFNpbHZlcm1hbiB0byBhbGxvdyB0aGUgY29tcHV0ZXIgdG8gYmVoYXZlIG5pY2VseSB3aGVuCisgKglhIGNhYmxlIGlzIHB1bGxlZCBvciBub3QgaW4gcGxhY2UsIG9yIGEgUENNQ0lBIGNhcmQgaXMgcmVtb3ZlZCBob3QuCisgKi8KKworLyogY2hhbmdlIHRoZSBkZWZpbmUgb2YgSUJNVFJfREVCVUdfTUVTU0FHRVMgdG8gYSBub256ZXJvIHZhbHVlIAoraW4gdGhlIGV2ZW50IHRoYXQgY2hhdHR5IGRlYnVnIG1lc3NhZ2VzIGFyZSBkZXNpcmVkIC0gampzIDEyLzMwLzk4ICovCisKKyNkZWZpbmUgSUJNVFJfREVCVUdfTUVTU0FHRVMgMAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZmRlZiBQQ01DSUEJCS8qIHJlcXVpcmVkIGZvciBpYm10cl9jcy5jIHRvIGJ1aWxkICovCisjdW5kZWYgTU9EVUxFCQkvKiB5ZXMsIHJlYWxseSAqLworI3VuZGVmIEVOQUJMRV9QQUdJTkcKKyNlbHNlCisjZGVmaW5lIEVOQUJMRV9QQUdJTkcgMQkJCisjZW5kaWYKKworI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgKCFGQUxTRSkKKworLyogY2hhbmdlcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgVFJfVkVSQk9TRQkwCisKKy8qIHNvbWUgOTUgT1Mgc2VuZCBtYW55IG5vbiBVSSBmcmFtZTsgdGhpcyBhbGxvdyByZW1vdmluZyB0aGUgd2FybmluZyAqLworI2RlZmluZSBUUl9GSUxURVJOT05VSQkxCisKKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWJtdHIuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmdzKQorI2RlZmluZSBEUFJJTlREKGZvcm1hdCwgYXJncy4uLikgRHVtbXlDYWxsKCIlczogIiBmb3JtYXQsIGRldi0+bmFtZSAsICMjIGFyZ3MpCisKKy8qIHZlcnNpb24gYW5kIGNyZWRpdHMgKi8KKyNpZm5kZWYgUENNQ0lBCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisgICAgIlxuaWJtdHIuYzogdjEuMy41NyAgIDgvIDcvOTQgUGV0ZXIgRGUgU2NocmlqdmVyIGFuZCBNYXJrIFN3YW5zb25cbiIKKyAgICAiICAgICAgICAgdjIuMS4xMjUgMTAvMjAvOTggUGF1bCBOb3J0b24gICAgPHBub3J0b25AaWVlZS5vcmc+XG4iCisgICAgIiAgICAgICAgIHYyLjIuMCAgIDEyLzMwLzk4IEpvZWwgU2xvYW4gICAgIDxqanNAYy1tZS5jb20+XG4iCisgICAgIiAgICAgICAgIHYyLjIuMSAgIDAyLzA4LzAwIE1pa2UgU3VsbGl2YW4gIDxzdWxsaXZhbUB1cy5pYm0uY29tPlxuIiAKKyAgICAiICAgICAgICAgdjIuMi4yICAgMDcvMjcvMDAgQnVydCBTaWx2ZXJtYW4gPGJ1cnRzQHVzLmlibS5jb20+XG4iIAorICAgICIgICAgICAgICB2Mi40LjAgICAwMy8wMS8wMSBNaWtlIFN1bGxpdmFuIDxzdWxsaXZhbkB1cy5pYm0uY29tPlxuIjsKKyNlbmRpZgorCisvKiB0aGlzIGFsbG93cyBkaXNwbGF5aW5nIGZ1bGwgYWRhcHRlciBpbmZvcm1hdGlvbiAqLworCitjaGFyICpjaGFubmVsX2RlZltdIF9fZGV2aW5pdGRhdGEgPSB7ICJJU0EiLCAiTUNBIiwgIklTQSBQJlAiIH07CisKK3N0YXRpYyBjaGFyIHBjY2hhbm5lbGlkW10gX19kZXZpbml0ZGF0YSA9IHsKKwkweDA1LCAweDAwLCAweDA0LCAweDA5LAorCTB4MDQsIDB4MDMsIDB4MDQsIDB4MGYsCisJMHgwMywgMHgwNiwgMHgwMywgMHgwMSwKKwkweDAzLCAweDAxLCAweDAzLCAweDAwLAorCTB4MDMsIDB4MDksIDB4MDMsIDB4MDksCisJMHgwMywgMHgwMCwgMHgwMiwgMHgwMAorfTsKKworc3RhdGljIGNoYXIgbWNjaGFubmVsaWRbXSBfX2RldmluaXRkYXRhID0gIHsKKwkweDA0LCAweDBkLCAweDA0LCAweDAxLAorCTB4MDUsIDB4MDIsIDB4MDUsIDB4MDMsCisJMHgwMywgMHgwNiwgMHgwMywgMHgwMywKKwkweDA1LCAweDA4LCAweDAzLCAweDA0LAorCTB4MDMsIDB4MDUsIDB4MDMsIDB4MDEsCisJMHgwMywgMHgwOCwgMHgwMiwgMHgwMAorfTsKKworY2hhciBfX2RldmluaXQgKmFkYXB0ZXJfZGVmKGNoYXIgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDB4RjogcmV0dXJuICJQQyBBZGFwdGVyIHwgUEMgQWRhcHRlciBJSSB8IEFkYXB0ZXIvQSI7CisJY2FzZSAweEU6IHJldHVybiAiMTYvNCBBZGFwdGVyIHwgMTYvNCBBZGFwdGVyL0EgKGxvbmcpIjsKKwljYXNlIDB4RDogcmV0dXJuICIxNi80IEFkYXB0ZXIvQSAoc2hvcnQpIHwgMTYvNCBJU0EtMTYgQWRhcHRlciI7CisJY2FzZSAweEM6IHJldHVybiAiQXV0byAxNi80IEFkYXB0ZXIiOworCWRlZmF1bHQ6IHJldHVybiAiYWRhcHRlciAodW5rbm93biB0eXBlKSI7CisJfTsKK307CisKKyNkZWZpbmUgVFJDX0lOSVQgMHgwMQkJLyogIFRyYWNlIGluaXRpYWxpemF0aW9uICYgUFJPQkVzICovCisjZGVmaW5lIFRSQ19JTklUViAweDAyCQkvKiAgdmVyYm9zZSBpbml0IHRyYWNlIHBvaW50cyAgICAgKi8KK3Vuc2lnbmVkIGNoYXIgaWJtdHJfZGVidWdfdHJhY2UgPSAwOworCitzdGF0aWMgaW50IAlpYm10cl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJaWJtdHJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X3NyYW1fc2l6ZShzdHJ1Y3QgdG9rX2luZm8gKmFkYXB0X2luZm8pOworc3RhdGljIGludCAJdHJkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRva19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAJdG9rX2luaXRfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgCQl0b2tfb3Blbl9hZGFwdGVyKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpOworc3RhdGljIHZvaWQgCW9wZW5fc2FwKHVuc2lnbmVkIGNoYXIgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG9rX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRva19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRva19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2lycXJldHVybl90IHRva19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCAJaW5pdGlhbF90b2tfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCAJCWlibXRyX3Jlc2V0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0KnRtcixzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCXRva19yZXJ1bih1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKK3ZvaWQgCQlpYm10cl9yZWFkbG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCAJbmV0X2RldmljZV9zdGF0cyAqdG9rX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCAJCWlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgdm9pZAlmaW5kX3R1cmJvX2FkYXB0ZXJzKGludCAqaW9saXN0KTsKKworc3RhdGljIGludCBpYm10cl9wb3J0bGlzdFtJQk1UUl9NQVhfQURBUFRFUlMrMV0gX19kZXZpbml0ZGF0YSA9IHsKKwkweGEyMCwgMHhhMjQsIDAsIDAsIDAKK307CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHVyYm9faW9bSUJNVFJfTUFYX0FEQVBURVJTXSA9IHswfTsKK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSB0dXJib19pcnFbSUJNVFJfTUFYX0FEQVBURVJTXSA9IHswfTsKK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSB0dXJib19zZWFyY2hlZCA9IDA7CisKKyNpZm5kZWYgUENNQ0lBCitzdGF0aWMgX191MzIgaWJtdHJfbWVtX2Jhc2UgX19pbml0ZGF0YSA9IDB4ZDAwMDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19kZXZpbml0IFBydENoYW5JRChjaGFyICpwY2lkLCBzaG9ydCBzdHJpZGUpCit7CisJc2hvcnQgaSwgajsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDI0OyBpKyssIGogKz0gc3RyaWRlKQorCQlwcmludGsoIiUxeCIsICgoaW50KSBwY2lkW2pdKSAmIDB4MGYpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IEhXUHJ0Q2hhbklEKHZvaWQgX19pb21lbSAqcGNpZCwgc2hvcnQgc3RyaWRlKQoreworCXNob3J0IGksIGo7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAyNDsgaSsrLCBqICs9IHN0cmlkZSkKKwkJcHJpbnRrKCIlMXgiLCAoKGludCkgcmVhZGIocGNpZCArIGopKSAmIDB4MGYpOworCXByaW50aygiXG4iKTsKK30KKworLyogV2UgaGF2ZSB0byBpb3JlbWFwIGV2ZXJ5IGNoZWNrZWQgYWRkcmVzcywgYmVjYXVzZSBpc2FfcmVhZGIgaXMgCisgKiBnb2luZyBhd2F5LiAKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmluZF90dXJib19hZGFwdGVycyhpbnQgKmlvbGlzdCkKK3sKKwlpbnQgcmFtX2FkZHI7CisJaW50IGluZGV4PTA7CisJdm9pZCBfX2lvbWVtICpjaGFuaWQ7CisJaW50IGZvdW5kX3R1cmJvPTA7CisJdW5zaWduZWQgY2hhciAqdGNoYW5pZCwgY3RlbXA7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBqaWY7CisJdm9pZCBfX2lvbWVtICpyYW1fbWFwcGVkIDsgICAKKworCWlmICh0dXJib19zZWFyY2hlZCA9PSAxKSByZXR1cm47CisJdHVyYm9fc2VhcmNoZWQ9MTsKKwlmb3IgKHJhbV9hZGRyPTB4QzAwMDA7IHJhbV9hZGRyIDwgMHhFMDAwMDsgcmFtX2FkZHIrPTB4MjAwMCkgeworCisJCV9fdTMyIGludGZfdGJsPTA7CisKKwkJZm91bmRfdHVyYm89MTsKKwkJcmFtX21hcHBlZCA9IGlvcmVtYXAoKHUzMilyYW1fYWRkciwweDFmZmYpIDsgCisJCWlmIChyYW1fbWFwcGVkPT1OVUxMKSAKKyAJCQljb250aW51ZSA7IAorCQljaGFuaWQ9KENIQU5ORUxfSUQgKyByYW1fbWFwcGVkKTsKKwkJdGNoYW5pZD1wY2NoYW5uZWxpZDsKKwkJY3RlbXA9cmVhZGIoY2hhbmlkKSAmIDB4MGY7CisJCWlmIChjdGVtcCAhPSAqdGNoYW5pZCkgY29udGludWU7CisJCWZvciAoaT0yLGo9MTsgaTw9NDY7IGk9aSsyLGorKykgeworCQkJaWYgKChyZWFkYihjaGFuaWQraSkgJiAweDBmKSAhPSB0Y2hhbmlkW2pdKXsKKwkJCQlmb3VuZF90dXJibz0wOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmRfdHVyYm8pIGNvbnRpbnVlOworCisJCXdyaXRlYigweDkwLCByYW1fbWFwcGVkKzB4MUUwMSk7CisJCWZvcihpPTI7IGk8MHgwZjsgaSsrKSB7CisJCQl3cml0ZWIoMHgwMCwgcmFtX21hcHBlZCsweDFFMDEraSk7CisJCX0KKwkJd3JpdGViKDB4MDAsIHJhbV9tYXBwZWQrMHgxRTAxKTsKKwkJZm9yKGppZj1qaWZmaWVzK1RSX0JVU1lfSU5URVJWQUw7IHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsamlmKTspOworCQlpbnRmX3RibD1udG9ocyhyZWFkdyhyYW1fbWFwcGVkK0FDQV9PRkZTRVQrQUNBX1JXK1dSQlJfRVZFTikpOworCQlpZiAoaW50Zl90YmwpIHsKKyNpZiBJQk1UUl9ERUJVR19NRVNTQUdFUworCQkJcHJpbnRrKCJpYm10cjo6ZmluZF90dXJib19hZGFwdGVycywgVHVyYm8gZm91bmQgYXQgIgorCQkJCSJyYW1fYWRkciAleFxuIixyYW1fYWRkcik7CisJCQlwcmludGsoImlibXRyOjpmaW5kX3R1cmJvX2FkYXB0ZXJzLCBpbnRlcmZhY2VfdGFibGUgIik7CisJCQlmb3IoaT0wOyBpPDY7IGkrKykgeworCQkJCXByaW50aygiJXg6IixyZWFkYihyYW1fYWRkcitpbnRmX3RibCtpKSk7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJCXR1cmJvX2lvW2luZGV4XT1udG9ocyhyZWFkdyhyYW1fbWFwcGVkK2ludGZfdGJsKzQpKTsKKwkJCXR1cmJvX2lycVtpbmRleF09cmVhZGIocmFtX21hcHBlZCtpbnRmX3RibCszKTsKKwkJCW91dGIoMCwgdHVyYm9faW9baW5kZXhdICsgQURBUFRSRVNFVCk7CisJCQlmb3IoamlmPWppZmZpZXMrVFJfUlNUX1RJTUU7dGltZV9iZWZvcmVfZXEoamlmZmllcyxqaWYpOyk7CisJCQlvdXRiKDAsIHR1cmJvX2lvW2luZGV4XSArIEFEQVBUUkVTRVRSRUwpOworCQkJaW5kZXgrKzsKKwkJCWNvbnRpbnVlOworCQl9CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMgCisJCXByaW50aygiaWJtdHI6OmZpbmRfdHVyYm9fYWRhcHRlcnMsIGlibXRyIGNhcmQgZm91bmQgYXQiCisJCQkiICV4IGJ1dCBub3QgYSBUdXJibyBtb2RlbFxuIixyYW1fYWRkcik7CisjZW5kaWYKKwlpb3VubWFwKHJhbV9tYXBwZWQpIDsgCQorCX0gLyogZm9yICovCisJZm9yKGk9MDsgaTxJQk1UUl9NQVhfQURBUFRFUlM7IGkrKykgeworCQlpZighdHVyYm9faW9baV0pIGJyZWFrOworCQlmb3IgKGo9MDsgajxJQk1UUl9NQVhfQURBUFRFUlM7IGorKykgeworCQkJaWYgKCBpb2xpc3Rbal0gJiYgaW9saXN0W2pdICE9IHR1cmJvX2lvW2ldKSBjb250aW51ZTsKKwkJCWlvbGlzdFtqXT10dXJib19pb1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpYm10cl9jbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5iYXNlX2FkZHIpIHsKKwkJb3V0YigwLGRldi0+YmFzZV9hZGRyK0FEQVBUUkVTRVQpOworCQkKKwkJc2NoZWR1bGVfdGltZW91dChUUl9SU1RfVElNRSk7IC8qIHdhaXQgNTBtcyAqLworCisJCW91dGIoMCxkZXYtPmJhc2VfYWRkcitBREFQVFJFU0VUUkVMKTsKKwl9CisKKyNpZm5kZWYgUENNQ0lBCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIElCTVRSX0lPX0VYVEVOVCk7CisKKwl7IAorCQlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJCWlvdW5tYXAodGktPm1taW8pOworCQlpb3VubWFwKHRpLT5zcmFtX3ZpcnQpOworCX0KKyNlbmRpZgkJCit9CisKK2ludCBpYm10cl9wcm9iZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IGlibXRyX3Byb2JlKGRldik7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWlmIChlcnIpCisJCQlpYm10cl9jbGVhbnVwX2NhcmQoZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWlibXRyX3Byb2JlKCk6ICBSb3V0aW5lIHNwZWNpZmllZCBpbiB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgl0byBwcm9iZSBmb3IgYW4gSUJNIFRva2VuIFJpbmcgQWRhcHRlci4gIFJvdXRpbmUgb3V0bGluZToKKyAqCUkuICAgIEludGVycm9nYXRlIGhhcmR3YXJlIHRvIGRldGVybWluZSBpZiBhbiBhZGFwdGVyIGV4aXN0cworICoJICAgICAgYW5kIHdoYXQgdGhlIHNwZWVkcyBhbmQgZmVlZHMgYXJlCisgKglJSS4gICBTZXR1cCBkYXRhIHN0cnVjdHVyZXMgdG8gY29udHJvbCBleGVjdXRpb24gYmFzZWQgdXBvbgorICoJICAgICAgYWRhcHRlciBjaGFyYWN0ZXJpc3RpY3MuCisgKgorICoJV2UgZXhwZWN0IGlibXRyX3Byb2JlIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGRldmljZSBlbnRyeQorICoJd2hpY2ggcmVmZXJlbmNlcyBpdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGlibXRyX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGJhc2VfYWRkciAmJiBiYXNlX2FkZHIgPD0gMHgxZmYpIC8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpIHsgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgKi8KKwkJaWYgKCFpYm10cl9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpKSByZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZpbmRfdHVyYm9fYWRhcHRlcnMoaWJtdHJfcG9ydGxpc3QpOworCWZvciAoaSA9IDA7IGlibXRyX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJaW50IGlvYWRkciA9IGlibXRyX3BvcnRsaXN0W2ldOworCisJCWlmICghaWJtdHJfcHJvYmUxKGRldiwgaW9hZGRyKSkgcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlibXRyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgUElPYWRkcikKK3sKKworCXVuc2lnbmVkIGNoYXIgc2VnbWVudCwgaW50cj0wLCBpcnE9MCwgaSwgaiwgY2FyZHByZXNlbnQ9Tk9UT0ssIHRlbXA9MDsKKwl2b2lkIF9faW9tZW0gKiB0X21taW8gPSBOVUxMOworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpjZF9jaGFuaWQ7CisJdW5zaWduZWQgY2hhciAqdGNoYW5pZCwgY3RlbXA7CisjaWZuZGVmIFBDTUNJQQorCXVuc2lnbmVkIGNoYXIgdF9pcnE9MDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOworI2VuZGlmCisKKwkvKiAgICBRdWVyeSB0aGUgYWRhcHRlciBQSU8gYmFzZSBwb3J0IHdoaWNoIHdpbGwgcmV0dXJuCisJICogICAgaW5kaWNhdGlvbiBvZiB3aGVyZSBNTUlPIHdhcyBwbGFjZWQuIFdlIGFsc28gaGF2ZSBhCisJICogICAgY29kZWQgaW50ZXJydXB0IG51bWJlci4KKwkgKi8KKwlzZWdtZW50ID0gaW5iKFBJT2FkZHIpOworCWlmIChzZWdtZW50IDwgMHg0MCB8fCBzZWdtZW50ID4gMHhlMCkgeworCQkvKiBPdXQgb2YgcmFuZ2UgdmFsdWVzIHNvIHdlJ2xsIGFzc3VtZSBub24tZXhpc3RlbnQgSU8gZGV2aWNlCisJCSAqIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHByb2JsZW0sIGVzcCBpZiBhIHR1cmJvCisJCSAqIGFkYXB0ZXIgaXMgYmVpbmcgdXNlZC4gICovCisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMKKwkJRFBSSU5USygiaWJtdHJfcHJvYmUxKCk6IHVuaGFwcHkgdGhhdCBpbmIoMHglWCkgPT0gMHglWCwgIgorCQkJIkhhcmR3YXJlIFByb2JsZW0/XG4iLFBJT2FkZHIsc2VnbWVudCk7CisjZW5kaWYKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qCisJICogICAgQ29tcHV0ZSB0aGUgbGluZWFyIGJhc2UgYWRkcmVzcyBvZiB0aGUgTU1JTyBhcmVhCisJICogICAgYXMgTElOVVggZG9lc24ndCBjYXJlIGFib3V0IHNlZ21lbnRzCisJICovCisJdF9tbWlvID0gaW9yZW1hcCgoKF9fdTMyKSAoc2VnbWVudCAmIDB4ZmMpIDw8IDExKSArIDB4ODAwMDAsMjA0OCk7CisJaWYgKCF0X21taW8pIHsgCisJCURQUklOVEsoIkNhbm5vdCByZW1hcCBtbWlvYmFzZSBtZW1vcnkgYXJlYSIpIDsgCisJCXJldHVybiAtRU5PREVWIDsgCisJfSAKKwlpbnRyID0gc2VnbWVudCAmIDB4MDM7CS8qIGxvdyBiaXRzIGlzIGNvZGVkIGludGVycnVwdCAjICovCisJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpCisJCURQUklOVEsoIlBJT2FkZHI6ICU0aHggc2VnL2ludHI6ICUyeCBtbWlvIGJhc2U6ICVwIGludHI6ICVkXG4iCisJCQkJLCBQSU9hZGRyLCAoaW50KSBzZWdtZW50LCB0X21taW8sIChpbnQpIGludHIpOworCisJLyoKKwkgKiAgICBOb3cgd2Ugd2lsbCBjb21wYXJlIGV4cGVjdGVkICdjaGFubmVsaWQnIHN0cmluZ3Mgd2l0aAorCSAqICAgIHdoYXQgd2UgaXMgdGhlcmUgdG8gbGVhcm4gb2YgSVNBL01DQSBvciBub3QgVFIgY2FyZAorCSAqLworI2lmZGVmIFBDTUNJQQorCWlvdW5tYXAodF9tbWlvKTsKKwl0X21taW8gPSB0aS0+bW1pbzsJLypCTVMgdG8gZ2V0IHZpcnR1YWwgYWRkcmVzcyAqLworCWlycSA9IHRpLT5pcnE7CQkvKkJNUyB0byBkaXNwbGF5IHRoZSBpcnEhICAgKi8KKyNlbmRpZgorCWNkX2NoYW5pZCA9IChDSEFOTkVMX0lEICsgdF9tbWlvKTsJLyogZm9yIGVmZmljaWVuY3kgKi8KKwl0Y2hhbmlkID0gcGNjaGFubmVsaWQ7CisJY2FyZHByZXNlbnQgPSBUUl9JU0E7CS8qIHRyeSBJU0EgKi8KKworCS8qICAgIFN1Ym9wdGltaXplIGtub3dpbmcgZmlyc3QgYnl0ZSBkaWZmZXJlbnQgKi8KKwljdGVtcCA9IHJlYWRiKGNkX2NoYW5pZCkgJiAweDBmOworCWlmIChjdGVtcCAhPSAqdGNoYW5pZCkgewkvKiBOT1QgSVNBIGNhcmQsIHRyeSBNQ0EgKi8KKwkJdGNoYW5pZCA9IG1jY2hhbm5lbGlkOworCQljYXJkcHJlc2VudCA9IFRSX01DQTsKKwkJaWYgKGN0ZW1wICE9ICp0Y2hhbmlkKQkvKiBOZWl0aGVyIElTQSBub3IgTUNBICovCisJCQljYXJkcHJlc2VudCA9IE5PVE9LOworCX0KKwlpZiAoY2FyZHByZXNlbnQgIT0gTk9UT0spIHsKKwkJLyogICAgICAgS25vdyBwcmVzdW1lZCB0eXBlLCB0cnkgcmVzdCBvZiBJRCAqLworCQlmb3IgKGkgPSAyLCBqID0gMTsgaSA8PSA0NjsgaSA9IGkgKyAyLCBqKyspIHsKKwkJCWlmKCAocmVhZGIoY2RfY2hhbmlkK2kpJjB4MGYpID09IHRjaGFuaWRbal0pIGNvbnRpbnVlOworCQkJLyogbWF0Y2ggZmFpbGVkLCBub3QgVFIgY2FyZCAqLworCQkJY2FyZHByZXNlbnQgPSBOT1RPSzsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIAorCSAqICAgIElmIHdlIGhhdmUgYW4gSVNBIGJvYXJkIGNoZWNrIGZvciB0aGUgSVNBIFAmUCB2ZXJzaW9uLAorCSAqICAgIGFzIGl0IGhhcyBkaWZmZXJlbnQgSVJRIHNldHRpbmdzIAorCSAqLworCWlmIChjYXJkcHJlc2VudCA9PSBUUl9JU0EgJiYgKHJlYWRiKEFJUEZJRCArIHRfbW1pbykgPT0gMHgwZSkpCisJCWNhcmRwcmVzZW50ID0gVFJfSVNBUE5QOworCWlmIChjYXJkcHJlc2VudCA9PSBOT1RPSykgewkvKiAiY2hhbm5lbF9pZCIgZGlkIG5vdCBtYXRjaCwgcmVwb3J0ICovCisJCWlmICghKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpKSB7CisjaWZuZGVmIFBDTUNJQQorCQkJaW91bm1hcCh0X21taW8pOworI2VuZGlmCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlEUFJJTlRLKCAiQ2hhbm5lbCBJRCBzdHJpbmcgbm90IGZvdW5kIGZvciBQSU9hZGRyOiAlNGh4XG4iLAorCQkJCQkJCQlQSU9hZGRyKTsKKwkJRFBSSU5USygiRXhwZWN0ZWQgZm9yIElTQTogIik7CisJCVBydENoYW5JRChwY2NoYW5uZWxpZCwgMSk7CisJCURQUklOVEsoIiAgICAgICAgICAgZm91bmQ6ICIpOworLyogQk1TIE5vdGUgdGhhdCB0aGlzIGNhbiBiZSBtaXNsZWFkaW5nLCB3aGVuIGhhcmR3YXJlIGlzIGZsYWt5LCBiZWNhdXNlIHlvdQorICAgYXJlIHJlYWRpbmcgaXQgYSBzZWNvbmQgdGltZSBoZXJlLiBTbyB3aXRoIG15IGZsYWt5IGhhcmR3YXJlLCBJJ2xsIHNlZSBteS0KKyAgIHNlbGYgaW4gdGhpcyBibG9jaywgd2l0aCB0aGUgSFcgSUQgbWF0Y2hpbmcgdGhlIElTQSBJRCBleGFjdGx5ISAqLworCQlIV1BydENoYW5JRChjZF9jaGFuaWQsIDIpOworCQlEUFJJTlRLKCJFeHBlY3RlZCBmb3IgTUNBOiAiKTsKKwkJUHJ0Q2hhbklEKG1jY2hhbm5lbGlkLCAxKTsKKwl9CisJLyogTm93LCBzZXR1cCBzb21lIG9mIHRoZSBwbDAgYnVmZmVycyBmb3IgdGhpcyBkcml2ZXIuLiAqLworCS8qIElmIGNhbGxlZCBmcm9tIFBDTUNJQSwgaXQgaXMgYWxyZWFkeSBzZXQgdXAsIHNvIG5vIG5lZWQgdG8gCisJICAgd2FzdGUgdGhlIG1lbW9yeSwganVzdCB1c2UgdGhlIGV4aXN0aW5nIHN0cnVjdHVyZSAqLworI2lmbmRlZiBQQ01DSUEKKwl0aS0+bW1pbyA9IHRfbW1pbzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IElCTVRSX01BWF9BREFQVEVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR1cmJvX2lvW2ldICE9IFBJT2FkZHIpCisJCQljb250aW51ZTsKKyNpZiBJQk1UUl9ERUJVR19NRVNTQUdFUyAKKwkJcHJpbnRrKCJpYm10cjo6dHJfcHJvYmUxLCBzZXR0aW5nIFBJT2FkZHIgJXggdG8gVHVyYm9cbiIsCisJCSAgICAgICBQSU9hZGRyKTsKKyNlbmRpZgorCQl0aS0+dHVyYm8gPSAxOworCQl0X2lycSA9IHR1cmJvX2lycVtpXTsKKyAgICAgICAgfQorI2VuZGlmIC8qICFQQ01DSUEgKi8KKwl0aS0+cmVhZGxvZ19wZW5kaW5nID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aS0+d2FpdF9mb3JfcmVzZXQpOworCisJLyogaWYgUENNQ0lBLCB0aGUgY2FyZCBjYW4gYmUgcmVjb2duaXplZCBhcyBlaXRoZXIgVFJfSVNBIG9yIFRSX0lTQVBOUAorCSAqIGRlcGVuZGluZyB3aGljaCBjYXJkIGlzIGluc2VydGVkLgkqLworCQorI2lmbmRlZiBQQ01DSUEKKwlzd2l0Y2ggKGNhcmRwcmVzZW50KSB7CisJY2FzZSBUUl9JU0E6CisJCWlmIChpbnRyID09IDApIGlycSA9IDk7CS8qIGlycTIgcmVhbGx5IGlzIGlycTkgKi8KKwkJaWYgKGludHIgPT0gMSkgaXJxID0gMzsKKwkJaWYgKGludHIgPT0gMikgaXJxID0gNjsKKwkJaWYgKGludHIgPT0gMykgaXJxID0gNzsKKwkJdGktPmFkYXB0ZXJfaW50X2VuYWJsZSA9IFBJT2FkZHIgKyBBREFQVElOVFJFTDsKKwkJYnJlYWs7CisJY2FzZSBUUl9NQ0E6CisJCWlmIChpbnRyID09IDApIGlycSA9IDk7CisJCWlmIChpbnRyID09IDEpIGlycSA9IDM7CisJCWlmIChpbnRyID09IDIpIGlycSA9IDEwOworCQlpZiAoaW50ciA9PSAzKSBpcnEgPSAxMTsKKwkJdGktPmdsb2JhbF9pbnRfZW5hYmxlID0gMDsKKwkJdGktPmFkYXB0ZXJfaW50X2VuYWJsZSA9IDA7CisJCXRpLT5zcmFtX3BoeXM9KF9fdTMyKShpbmIoUElPYWRkcitBREFQVFJFU0VUUkVMKSAmIDB4ZmUpIDw8IDEyOworCQlicmVhazsKKwljYXNlIFRSX0lTQVBOUDoKKwkJaWYgKCF0X2lycSkgeworCQkJaWYgKGludHIgPT0gMCkgaXJxID0gOTsKKwkJCWlmIChpbnRyID09IDEpIGlycSA9IDM7CisJCQlpZiAoaW50ciA9PSAyKSBpcnEgPSAxMDsKKwkJCWlmIChpbnRyID09IDMpIGlycSA9IDExOworCQl9IGVsc2UKKwkJCWlycT10X2lycTsKKwkJdGltZW91dCA9IGppZmZpZXMgKyBUUl9TUElOX0lOVEVSVkFMOworCQl3aGlsZSAoIXJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFJSUl9FVkVOKSl7CisJCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIGNvbnRpbnVlOworCQkJRFBSSU5USyggIkhhcmR3YXJlIHRpbWVvdXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuIik7CisJCQlpb3VubWFwKHRfbW1pbyk7CisJCQlrZnJlZSh0aSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQl0aS0+c3JhbV9waHlzID0KKwkJICAgICAoKF9fdTMyKXJlYWRiKHRpLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1JSUl9FVkVOKTw8MTIpOworCQl0aS0+YWRhcHRlcl9pbnRfZW5hYmxlID0gUElPYWRkciArIEFEQVBUSU5UUkVMOworCQlicmVhazsKKwl9IC8qZW5kIHN3aXRjaCAoY2FyZHByZXNlbnQpICovCisjZW5kaWYJLypub3QgUENNQ0lBICovCisKKwlpZiAoaWJtdHJfZGVidWdfdHJhY2UgJiBUUkNfSU5JVCkgewkvKiBqdXN0IHJlcG9ydCBpbnQgKi8KKwkJRFBSSU5USygiaXJxPSVkIiwgaXJxKTsKKwkJcHJpbnRrKCIsIHNyYW1fcGh5cz0weCV4IiwgdGktPnNyYW1fcGh5cyk7CisJCWlmKGlibXRyX2RlYnVnX3RyYWNlJlRSQ19JTklUVil7IC8qIGZ1bGwgY2hhdCBpbiB2ZXJib3NlIG9ubHkgKi8KKwkJCURQUklOVEsoIiwgdGktPm1taW89JXAiLCB0aS0+bW1pbyk7CisJCQlwcmludGsoIiwgc2VnbWVudD0lMDJYIiwgc2VnbWVudCk7CisJCX0KKwkJcHJpbnRrKCIuXG4iKTsKKwl9CisKKwkvKiBHZXQgaHcgYWRkcmVzcyBvZiB0b2tlbiByaW5nIGNhcmQgKi8KKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMHgxODsgaSA9IGkgKyAyKSB7CisJCS8qIHRlY2huaWNhbCByZWZlcmVuY2Ugc3RhdGVzIHRvIGRvIHRoaXMgKi8KKwkJdGVtcCA9IHJlYWRiKHRpLT5tbWlvICsgQUlQICsgaSkgJiAweDBmOworCQl0aS0+aHdfYWRkcmVzc1tqXSA9IHRlbXA7CisJCWlmIChqICYgMSkKKwkJCWRldi0+ZGV2X2FkZHJbKGogLyAyKV0gPQorCQkJCXRpLT5od19hZGRyZXNzW2pdKyAodGktPmh3X2FkZHJlc3NbaiAtIDFdIDw8IDQpOworCQkrK2o7CisJfQorCS8qIGdldCBBZGFwdGVyIHR5cGU6ICAnRicgPSBBZGFwdGVyL0EsICdFJyA9IDE2LzQgQWRhcHRlciBJSSwuLi4gKi8KKwl0aS0+YWRhcHRlcl90eXBlID0gcmVhZGIodGktPm1taW8gKyBBSVBBREFQVFlQRSk7CisKKwkvKiBnZXQgRGF0YSBSYXRlOiAgRj00TWIsIEU9MTZNYiwgRD00TWIgJiAxNk1iID8/ICovCisJdGktPmRhdGFfcmF0ZSA9IHJlYWRiKHRpLT5tbWlvICsgQUlQREFUQVJBVEUpOworCisJLyogR2V0IEVhcmx5IFRva2VuIFJlbGVhc2Ugc3VwcG9ydD86IEY9bm8sIEU9NE1iLCBEPTE2TWIsIEM9NCYxNk1iICovCisJdGktPnRva2VuX3JlbGVhc2UgPSByZWFkYih0aS0+bW1pbyArIEFJUEVBUkxZVE9LRU4pOworCisJLyogSG93IG11Y2ggc2hhcmVkIFJBTSBpcyBvbiBhZGFwdGVyID8gKi8KKwlpZiAodGktPnR1cmJvKSB7CisJCXRpLT5hdmFpbF9zaGFyZWRfcmFtPTEyNzsKKwl9IGVsc2UgeworCQl0aS0+YXZhaWxfc2hhcmVkX3JhbSA9IGdldF9zcmFtX3NpemUodGkpOy8qaW4gNTEyIGJ5dGUgdW5pdHMgKi8KKwl9CisJLyogV2UgbmVlZCB0byBzZXQgb3IgZG8gYSBidW5jaCBvZiB3b3JrIGhlcmUgYmFzZWQgb24gcHJldmlvdXMgcmVzdWx0cyovCisJLyogU3VwcG9ydCBwYWdpbmc/ICBXaGF0IHNpemVzPzogIEY9bm8sIEU9MTZrLCBEPTMyaywgQz0xNiAmIDMyayAqLworCXRpLT5zaGFyZWRfcmFtX3BhZ2luZyA9IHJlYWRiKHRpLT5tbWlvICsgQUlQU0hSQU1QQUdFKTsKKworCS8qIEF2YWlsYWJsZSBESEIgIDRNYiBzaXplOiAgIEY9MjA0OCwgRT00MDk2LCBEPTQ0NjQgKi8KKwlzd2l0Y2ggKHJlYWRiKHRpLT5tbWlvICsgQUlQNE1CREhCKSkgeworCWNhc2UgMHhlOiB0aS0+ZGhiX3NpemU0bWIgPSA0MDk2OyBicmVhazsKKwljYXNlIDB4ZDogdGktPmRoYl9zaXplNG1iID0gNDQ2NDsgYnJlYWs7CisJZGVmYXVsdDogIHRpLT5kaGJfc2l6ZTRtYiA9IDIwNDg7IGJyZWFrOworCX0KKworCS8qIEF2YWlsYWJsZSBESEIgMTZNYiBzaXplOiAgRj0yMDQ4LCBFPTQwOTYsIEQ9ODE5MiwgQz0xNjM4NCwgQj0xNzk2MCAqLworCXN3aXRjaCAocmVhZGIodGktPm1taW8gKyBBSVAxNk1CREhCKSkgeworCWNhc2UgMHhlOiB0aS0+ZGhiX3NpemUxNm1iID0gNDA5NjsgYnJlYWs7CisJY2FzZSAweGQ6IHRpLT5kaGJfc2l6ZTE2bWIgPSA4MTkyOyBicmVhazsKKwljYXNlIDB4YzogdGktPmRoYl9zaXplMTZtYiA9IDE2Mzg0OyBicmVhazsKKwljYXNlIDB4YjogdGktPmRoYl9zaXplMTZtYiA9IDE3OTYwOyBicmVhazsKKwlkZWZhdWx0OiAgdGktPmRoYl9zaXplMTZtYiA9IDIwNDg7IGJyZWFrOworCX0KKworCS8qICAgIFdlIG11c3QgZmlndXJlIG91dCBob3cgbXVjaCBzaGFyZWQgbWVtb3J5IHNwYWNlIHRoaXMgYWRhcHRlcgorCSAqICAgIHdpbGwgb2NjdXB5IHNvIHRoYXQgaWYgdGhlcmUgYXJlIHR3byBhZGFwdGVycyB3ZSBjYW4gZml0IGJvdGgKKwkgKiAgICBpbi4gIEdpdmVuIGEgY2hvaWNlLCB3ZSB3aWxsIGxpbWl0IHRoaXMgYWRhcHRlciB0byAzMksuICBUaGUKKwkgKiAgICBtYXhpbXVtIHNwYWNlIHdpbGwgd2lsbCB1c2UgZm9yIHR3byBhZGFwdGVycyBpcyA2NEsgc28gaWYgdGhlCisJICogICAgYWRhcHRlciB3ZSBhcmUgd29ya2luZyBvbiBkZW1hbmRzIDY0SyAoaXQgYWxzbyBkb2Vzbid0IHN1cHBvcnQKKwkgKiAgICBwYWdpbmcpLCB0aGVuIG9ubHkgb25lIGFkYXB0ZXIgY2FuIGJlIHN1cHBvcnRlZC4gIAorCSAqLworCisJLyoKKwkgKiAgICBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdG90YWwgUkFNIGlzIG1hcHBlZCBpbnRvIFBDIHNwYWNlIAorCSAqLworCXRpLT5tYXBwZWRfcmFtX3NpemU9IC8qc2l4dGVlbiB0byBvbmVodW5kcmVkdHdlbnR5ZWlnaHQgNTEyYnl0ZSBibG9ja3MqLworCSAgICAxPDwgKChyZWFkYih0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SVytSUlJfT0REKSA+PiAyICYgMHgwMykgKyA0KTsKKwl0aS0+cGFnZV9tYXNrID0gMDsKKwlpZiAodGktPnR1cmJvKSAgdGktPnBhZ2VfbWFzaz0weGYwOworCWVsc2UgaWYgKHRpLT5zaGFyZWRfcmFtX3BhZ2luZyA9PSAweGYpOyAgLyogTm8gcGFnaW5nIGluIGFkYXB0ZXIgKi8KKwllbHNlIHsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJCXVuc2lnbmVkIGNoYXIgcGdfc2l6ZSA9IDA7CisJCS8qIEJNUzogICBwYWdlIHNpemU6IFBDTUNJQSwgdXNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI7CisJCSAgIElTQVBOUCwgdXNlIExBTkFJREMgY29uZmlnIHRvb2wgZnJvbSB3d3cuaWJtLmNvbSAgKi8KKwkJc3dpdGNoICh0aS0+c2hhcmVkX3JhbV9wYWdpbmcpIHsKKwkJY2FzZSAweGY6CisJCQlicmVhazsKKwkJY2FzZSAweGU6CisJCQl0aS0+cGFnZV9tYXNrID0gKHRpLT5tYXBwZWRfcmFtX3NpemUgPT0gMzIpID8gMHhjMCA6IDA7CisJCQlwZ19zaXplID0gMzI7CS8qIDE2S0IgcGFnZSBzaXplICovCisJCQlicmVhazsKKwkJY2FzZSAweGQ6CisJCQl0aS0+cGFnZV9tYXNrID0gKHRpLT5tYXBwZWRfcmFtX3NpemUgPT0gNjQpID8gMHg4MCA6IDA7CisJCQlwZ19zaXplID0gNjQ7CS8qIDMyS0IgcGFnZSBzaXplICovCisJCQlicmVhazsKKwkJY2FzZSAweGM6CisJCQlzd2l0Y2ggKHRpLT5tYXBwZWRfcmFtX3NpemUpIHsKKwkJCWNhc2UgMzI6CisJCQkJdGktPnBhZ2VfbWFzayA9IDB4YzA7CisJCQkJcGdfc2l6ZSA9IDMyOworCQkJCWJyZWFrOworCQkJY2FzZSA2NDoKKwkJCQl0aS0+cGFnZV9tYXNrID0gMHg4MDsKKwkJCQlwZ19zaXplID0gNjQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoIlVua25vd24gc2hhcmVkIHJhbSBwYWdpbmcgaW5mbyAlMDFYXG4iLAorCQkJCQkJCXRpLT5zaGFyZWRfcmFtX3BhZ2luZyk7CisJCQlpb3VubWFwKHRfbW1pbyk7IAorCQkJa2ZyZWUodGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJfSAvKmVuZCBzd2l0Y2ggc2hhcmVkX3JhbV9wYWdpbmcgKi8KKworCQlpZiAoaWJtdHJfZGVidWdfdHJhY2UgJiBUUkNfSU5JVCkKKwkJCURQUklOVEsoIlNoYXJlZCBSQU0gcGFnaW5nIGNvZGU6ICUwMlgsICIKKwkJCQkibWFwcGVkIFJBTSBzaXplOiAlZEssIHNoYXJlZCBSQU0gc2l6ZTogJWRLLCAiCisJCQkJInBhZ2UgbWFzazogJTAyWFxuOiIsCisJCQkJdGktPnNoYXJlZF9yYW1fcGFnaW5nLCB0aS0+bWFwcGVkX3JhbV9zaXplIC8gMiwKKwkJCQl0aS0+YXZhaWxfc2hhcmVkX3JhbSAvIDIsIHRpLT5wYWdlX21hc2spOworI2VuZGlmCS8qRU5BQkxFX1BBR0lORyAqLworCX0KKworI2lmbmRlZiBQQ01DSUEKKwkvKiBmaW5pc2ggZmlndXJpbmcgdGhlIHNoYXJlZCBSQU0gYWRkcmVzcyAqLworCWlmIChjYXJkcHJlc2VudCA9PSBUUl9JU0EpIHsKKwkJc3RhdGljIF9fdTMyIHJhbV9ibmRyeV9tYXNrW10gPQorCQkJeyAweGZmZmZlMDAwLCAweGZmZmZjMDAwLCAweGZmZmY4MDAwLCAweGZmZmYwMDAwIH07CisJCV9fdTMyIG5ld19iYXNlLCBycnJfMzIsIGNoa19iYXNlLCByYm07CisKKwkJcnJyXzMyPXJlYWRiKHRpLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1JSUl9PREQpID4+IDIgJiAweDAzOworCQlyYm0gPSByYW1fYm5kcnlfbWFza1tycnJfMzJdOworCQluZXdfYmFzZSA9IChpYm10cl9tZW1fYmFzZSArICh+cmJtKSkgJiByYm07LyogdXAgdG8gYm91bmRhcnkgKi8KKwkJY2hrX2Jhc2UgPSBuZXdfYmFzZSArICh0aS0+bWFwcGVkX3JhbV9zaXplIDw8IDkpOworCQlpZiAoY2hrX2Jhc2UgPiAoaWJtdHJfbWVtX2Jhc2UgKyBJQk1UUl9TSEFSRURfUkFNX1NJWkUpKSB7CisJCQlEUFJJTlRLKCJTaGFyZWQgUkFNIGZvciB0aGlzIGFkYXB0ZXIgKCUwNXgpIGV4Y2VlZHMgIgorCQkJImRyaXZlciBsaW1pdCAoJTA1eCksIGFkYXB0ZXIgbm90IHN0YXJ0ZWQuXG4iLAorCQkJY2hrX2Jhc2UsIGlibXRyX21lbV9iYXNlICsgSUJNVFJfU0hBUkVEX1JBTV9TSVpFKTsKKwkJCWlvdW5tYXAodF9tbWlvKTsKKwkJCWtmcmVlKHRpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9IGVsc2UgeyAvKiBzZWVtcyBjb29sLCByZWNvcmQgd2hhdCB3ZSBoYXZlIGZpZ3VyZWQgb3V0ICovCisJCQl0aS0+c3JhbV9iYXNlID0gbmV3X2Jhc2UgPj4gMTI7CisJCQlpYm10cl9tZW1fYmFzZSA9IGNoa19iYXNlOworCQl9CisJfQorCWVsc2UgIHRpLT5zcmFtX2Jhc2UgPSB0aS0+c3JhbV9waHlzID4+IDEyOworCisJLyogVGhlIFBDTUNJQSBoYXMgYWxyZWFkeSBnb3QgdGhlIGludGVycnVwdCBsaW5lIGFuZCB0aGUgaW8gcG9ydCwgCisJICAgc28gbm8gY2hhbmNlIG9mIGFueWJvZHkgZWxzZSBnZXR0aW5nIGl0IC0gTUxQICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxID0gaXJxLCAmdG9rX2ludGVycnVwdCwgMCwgImlibXRyIiwgZGV2KSAhPSAwKSB7CisJCURQUklOVEsoIkNvdWxkIG5vdCBncmFiIGlycSAlZC4gIEhhbHRpbmcgVG9rZW4gUmluZyBkcml2ZXIuXG4iLAorCQkJCQlpcnEpOworCQlpb3VubWFwKHRfbW1pbyk7CisJCWtmcmVlKHRpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qPz8gTm93LCBhbGxvY2F0ZSBzb21lIG9mIHRoZSBQSU8gUE9SVHMgZm9yIHRoaXMgZHJpdmVyLi4gKi8KKwkvKiByZWNvcmQgUElPYWRkciByYW5nZSBhcyBidXN5ICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihQSU9hZGRyLCBJQk1UUl9JT19FWFRFTlQsICJpYm10ciIpKSB7CisJCURQUklOVEsoIkNvdWxkIG5vdCBncmFiIFBJTyByYW5nZS4gSGFsdGluZyBkcml2ZXIuXG4iKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWlvdW5tYXAodF9tbWlvKTsKKwkJa2ZyZWUodGkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghdmVyc2lvbl9wcmludGVkKyspIHsKKwkJcHJpbnRrKHZlcnNpb24pOworCX0KKyNlbmRpZiAvKiAhUENNQ0lBICovCisJRFBSSU5USygiJXMgJXMgZm91bmRcbiIsCisJCWNoYW5uZWxfZGVmW2NhcmRwcmVzZW50IC0gMV0sIGFkYXB0ZXJfZGVmKHRpLT5hZGFwdGVyX3R5cGUpKTsKKwlEUFJJTlRLKCJ1c2luZyBpcnEgJWQsIFBJT2FkZHIgJWh4LCAlZEsgc2hhcmVkIFJBTS5cbiIsCisJCQlpcnEsIFBJT2FkZHIsIHRpLT5tYXBwZWRfcmFtX3NpemUgLyAyKTsKKwlEUFJJTlRLKCJIYXJkd2FyZSBhZGRyZXNzIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCWlmICh0aS0+cGFnZV9tYXNrKQorCQlEUFJJTlRLKCJTaGFyZWQgUkFNIHBhZ2luZyBlbmFibGVkLiAiCisJCQkiUGFnZSBzaXplOiAldUsgU2hhcmVkIFJhbSBzaXplICVkS1xuIiwKKwkJCSgodGktPnBhZ2VfbWFza14weGZmKSsxKSA+PjIsIHRpLT5hdmFpbF9zaGFyZWRfcmFtIC8gMik7CisJZWxzZQorCQlEUFJJTlRLKCJTaGFyZWQgUkFNIHBhZ2luZyBkaXNhYmxlZC4gdGktPnBhZ2VfbWFzayAleFxuIiwKKwkJCQkJCQkJdGktPnBhZ2VfbWFzayk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gREhCIHdlIGNhbiB1c2UgKi8KKwkvKiB0d28gY2FzZXMgd2hlcmUgYXZhaWxfc2hhcmVkX3JhbSBkb2Vzbid0IGVxdWFsIG1hcHBlZF9yYW1fc2l6ZToKKwkgICAgMS4gYXZhaWxfc2hhcmVkX3JhbSBpcyAxMjcgYnV0IG1hcHBlZF9yYW1fc2l6ZSBpcyAxMjggKHR5cGljYWwpCisJICAgIDIuIHVzZXIgaGFzIGNvbmZpZ3VyZWQgYWRhcHRlciBmb3IgbGVzcyB0aGFuIGF2YWlsX3NoYXJlZF9yYW0KKwkgICAgICAgYnV0IGlzIG5vdCB1c2luZyBwYWdpbmcgKHNoZSBzaG91bGQgdXNlIHBhZ2luZywgSSBiZWxpZXZlKQorCSovCisJaWYgKCF0aS0+cGFnZV9tYXNrKSB7CisJCXRpLT5hdmFpbF9zaGFyZWRfcmFtPQorCQkJCW1pbih0aS0+bWFwcGVkX3JhbV9zaXplLHRpLT5hdmFpbF9zaGFyZWRfcmFtKTsKKwl9CisKKwlzd2l0Y2ggKHRpLT5hdmFpbF9zaGFyZWRfcmFtKSB7CisJY2FzZSAxNjoJCS8qIDhLQiBzaGFyZWQgUkFNICovCisJCXRpLT5kaGJfc2l6ZTRtYiA9IG1pbih0aS0+ZGhiX3NpemU0bWIsICh1bnNpZ25lZCBzaG9ydCkyMDQ4KTsKKwkJdGktPnJidWZfbGVuNCA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDQ9MjsKKwkJdGktPmRoYl9zaXplMTZtYiA9IG1pbih0aS0+ZGhiX3NpemUxNm1iLCAodW5zaWduZWQgc2hvcnQpMjA0OCk7CisJCXRpLT5yYnVmX2xlbjE2ID0gMTAzMjsKKwkJdGktPnJidWZfY250MTY9MjsKKwkJYnJlYWs7CisJY2FzZSAzMjoJCS8qIDE2S0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTQ7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTQwOTYpOworCQl0aS0+cmJ1Zl9sZW4xNiA9IDEwMzI7CS8qMTAyNCB1c2FibGUgKi8KKwkJdGktPnJidWZfY250MTY9NDsKKwkJYnJlYWs7CisJY2FzZSA2NDoJCS8qIDMyS0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTY7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTEwMjQwKTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj02OworCQlicmVhazsKKwljYXNlIDEyNzoJCS8qIDYzLjVLQiBzaGFyZWQgUkFNICovCisJCXRpLT5kaGJfc2l6ZTRtYiA9IG1pbih0aS0+ZGhiX3NpemU0bWIsICh1bnNpZ25lZCBzaG9ydCk0NDY0KTsKKwkJdGktPnJidWZfbGVuNCA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDQ9NjsKKwkJdGktPmRoYl9zaXplMTZtYiA9IG1pbih0aS0+ZGhiX3NpemUxNm1iLCAodW5zaWduZWQgc2hvcnQpMTYzODQpOworCQl0aS0+cmJ1Zl9sZW4xNiA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDE2PTE2OworCQlicmVhazsKKwljYXNlIDEyODoJCS8qIDY0S0IgICBzaGFyZWQgUkFNICovCisJCXRpLT5kaGJfc2l6ZTRtYiA9IG1pbih0aS0+ZGhiX3NpemU0bWIsICh1bnNpZ25lZCBzaG9ydCk0NDY0KTsKKwkJdGktPnJidWZfbGVuNCA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDQ9NjsKKwkJdGktPmRoYl9zaXplMTZtYiA9IG1pbih0aS0+ZGhiX3NpemUxNm1iLCAodW5zaWduZWQgc2hvcnQpMTc5NjApOworCQl0aS0+cmJ1Zl9sZW4xNiA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDE2PTE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0aS0+ZGhiX3NpemU0bWIgPSAyMDQ4OworCQl0aS0+cmJ1Zl9sZW40ID0gMTAzMjsKKwkJdGktPnJidWZfY250ND0yOworCQl0aS0+ZGhiX3NpemUxNm1iID0gMjA0ODsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj0yOworCQlicmVhazsKKwl9CisJLyogdGhpcyBmb3JtdWxhIGlzIG5vdCBzbWFydCBlbm91Z2ggZm9yIHRoZSBwYWdpbmcgY2FzZQorCXRpLT5yYnVmX2NudDx4PiA9ICh0aS0+YXZhaWxfc2hhcmVkX3JhbSAqIEJMT0NLU1ogLSBBREFQVF9QUklWQVRFIC0KKwkJCUFSQkxFTkdUSCAtIFNTQkxFTkdUSCAtIERMQ19NQVhfU0FQICogU0FQTEVOR1RIIC0KKwkJCURMQ19NQVhfU1RBICogU1RBTEVOR1RIIC0gdGktPmRoYl9zaXplPHg+bWIgKiBOVU1fREhCIC0KKwkJCVNSQkxFTkdUSCAtIEFTQkxFTkdUSCkgLyB0aS0+cmJ1Zl9sZW48eD47CisJKi8KKwl0aS0+bWF4bXR1MTYgPSAodGktPnJidWZfbGVuMTYgLSA4KSAqIHRpLT5yYnVmX2NudDE2ICAtIFRSX0hMRU47CisJdGktPm1heG10dTQgPSAodGktPnJidWZfbGVuNCAtIDgpICogdGktPnJidWZfY250NCAtIFRSX0hMRU47CisJLypCTVMgYXNzdW1pbmcgMTggYnl0ZXMgb2YgUm91dGluZyBJbmZvcm1hdGlvbiAodXN1YWxseSB3b3JrcykgKi8KKwlEUFJJTlRLKCJNYXhpbXVtIFJlY2VpdmUgSW50ZXJuZXQgUHJvdG9jb2wgTVRVIDE2TWJwczogJWQsIDRNYnBzOiAlZFxuIiwKKwkJCQkJCSAgICAgdGktPm1heG10dTE2LCB0aS0+bWF4bXR1NCk7CisKKwlkZXYtPmJhc2VfYWRkciA9IFBJT2FkZHI7CS8qIHNldCB0aGUgdmFsdWUgZm9yIGRldmljZSAqLworCWRldi0+bWVtX3N0YXJ0ID0gdGktPnNyYW1fYmFzZSA8PCAxMjsKKwlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArICh0aS0+bWFwcGVkX3JhbV9zaXplIDw8IDkpIC0gMTsKKwl0cmRldl9pbml0KGRldik7CisJcmV0dXJuIDA7ICAgLyogUmV0dXJuIDAgdG8gaW5kaWNhdGUgd2UgaGF2ZSBmb3VuZCBhIFRva2VuIFJpbmcgY2FyZC4gKi8KK30JCQkJLyppYm10cl9wcm9iZTEoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHF1ZXJ5IHRoZSBhZGFwdGVyIGZvciB0aGUgc2l6ZSBvZiBzaGFyZWQgUkFNICAqLworLyogdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIFJBTSBzaXplIGluIHVuaXRzIG9mIDUxMiBieXRlcyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2RldmluaXQgZ2V0X3NyYW1fc2l6ZShzdHJ1Y3QgdG9rX2luZm8gKmFkYXB0X2luZm8pCit7CisJdW5zaWduZWQgY2hhciBhdmFpbF9zcmFtX2NvZGU7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2l6ZV9jb2RlW10gPSB7IDAsIDE2LCAzMiwgNjQsIDEyNywgMTI4IH07CisJLyogQWRhcHRlciBnaXZlcworCSAgICdGJyAtLSB1c2UgUlJSIGJpdHMgMywyCisJICAgJ0UnIC0tIDhrYiAgICdEJyAtLSAxNmtiCisJICAgJ0MnIC0tIDMya2IgICdBJyAtLSA2NEtCCisJICAgJ0InIC0gNjRLQiBsZXNzIDUxMiBieXRlcyBhdCB0b3AKKwkgICAoV0FSTklORyAuLi4gbXVzdCB6ZXJvIHRvcCBieXRlcyBpbiBJTklUICovCisKKwlhdmFpbF9zcmFtX2NvZGUgPSAweGYgLSByZWFkYihhZGFwdF9pbmZvLT5tbWlvICsgQUlQQVZBSUxTSFJBTSk7CisJaWYgKGF2YWlsX3NyYW1fY29kZSkgcmV0dXJuIHNpemVfY29kZVthdmFpbF9zcmFtX2NvZGVdOworCWVsc2UJCS8qIGZvciBjb2RlICdGJywgbXVzdCBjb21wdXRlIHNpemUgZnJvbSBSUlIoMywyKSBiaXRzICovCisJCXJldHVybiAxIDw8CisJCSAoKHJlYWRiKGFkYXB0X2luZm8tPm1taW8rQUNBX09GRlNFVCtBQ0FfUlcrUlJSX09ERCk+PjImMykrNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdHJkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisgICAgICAgIHRpLT5vcGVuX2ZhaWx1cmUgPSBOTyAgICA7CisJZGV2LT5vcGVuID0gdG9rX29wZW47CisJZGV2LT5zdG9wID0gdG9rX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdG9rX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0gdG9rX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHRva19zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaWJtdHJfY2hhbmdlX210dTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdG9rX2luaXRfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisJc2hvcnQgUElPYWRkcjsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlQSU9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwkvKiBTcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGZpcnN0IGludGVycnVwdCBhZnRlciByZXNldCAqLworCXRpLT5kb190b2tfaW50ID0gRklSU1RfSU5UOworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwl3cml0ZWIofklOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SRVNFVCArIElTUlBfRVZFTik7CisJb3V0YigwLCBQSU9hZGRyICsgQURBUFRSRVNFVCk7CisKKwljdXJyZW50LT5zdGF0ZT1UQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KFRSX1JTVF9USU1FKTsgLyogd2FpdCA1MG1zICovCisKKwlvdXRiKDAsIFBJT2FkZHIgKyBBREFQVFJFU0VUUkVMKTsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJaWYgKHRpLT5wYWdlX21hc2spCisJCXdyaXRlYihTUlBSX0VOQUJMRV9QQUdJTkcsdGktPm1taW8rQUNBX09GRlNFVCtBQ0FfUlcrU1JQUl9FVkVOKTsKKyNlbmRpZgorCXdyaXRlYihJTlRfRU5BQkxFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSUF9FVkVOKTsKKwlpID0gc2xlZXBfb25fdGltZW91dCgmdGktPndhaXRfZm9yX3Jlc2V0LCA0ICogSFopOworCXJldHVybiBpPyAwIDogLUVBR0FJTjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0b2tfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qdGhlIGNhc2Ugd2Ugd2VyZSBsZWZ0IGluIGEgZmFpbHVyZSBzdGF0ZSBkdXJpbmcgYSBwcmV2aW91cyBvcGVuICovCisJaWYgKHRpLT5vcGVuX2ZhaWx1cmUgPT0gWUVTKSB7CisJCURQUklOVEsoIkxhc3QgdGltZSB5b3Ugd2VyZSBkaXNjb25uZWN0ZWQsIGhvdyBhYm91dCBub3c/XG4iKTsKKwkJcHJpbnRrKCJZb3UgY2FuJ3QgaW5zZXJ0IHdpdGggYW4gSUNTIGNvbm5lY3RvciBoYWxmLWNvY2tlZC5cbiIpOworCX0KKworCXRpLT5vcGVuX3N0YXR1cyAgPSBDTE9TRUQ7IC8qIENMT1NFRCBvciBPUEVOICAgICAgKi8KKwl0aS0+c2FwX3N0YXR1cyAgID0gQ0xPU0VEOyAvKiBDTE9TRUQgb3IgT1BFTiAgICAgICovCisJdGktPm9wZW5fZmFpbHVyZSA9ICAgICBOTzsgLyogTk8gICAgIG9yIFlFUyAgICAgICAqLworCXRpLT5vcGVuX21vZGUgICAgPSBNQU5VQUw7IC8qIE1BTlVBTCBvciBBVVRPTUFUSUMgKi8KKwkvKiAxMi8yMDAwIG5vdCB0eXBpY2FsIExpbnV4LCBidXQgd2UgY2FuIHVzZSBSVU5OSU5HIHRvIGxldCB1cyBrbm93IHdoZW4KKwl0aGUgbmV0d29yayBoYXMgY3JhcHBlZCBvdXQgb3IgY2FibGVzIGFyZSBkaXNjb25uZWN0ZWQuIFVzZWZ1bCBiZWNhdXNlCisJdGhlIElGRl9VUCBmbGFnIHN0YXlzIHVwIHRoZSB3aG9sZSB0aW1lLCB1bnRpbCBpZmNvbmZpZyB0cjAgZG93bi4KKwkqLworCWRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCisJdGktPnNyYW1fcGh5cyAmPSB+MTsgLyogdG8gcmV2ZXJzZSB3aGF0IHdlIGRvIGluIHRva19jbG9zZSAqLworCS8qIGluaXQgdGhlIHNwaW5sb2NrICovCisJc3Bpbl9sb2NrX2luaXQoJnRpLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZ0aS0+dHJfdGltZXIpOworCQorCWkgPSB0b2tfaW5pdF9jYXJkKGRldik7CisJaWYgKGkpIHJldHVybiBpOworCisJd2hpbGUgKDEpeworCQl0b2tfb3Blbl9hZGFwdGVyKCh1bnNpZ25lZCBsb25nKSBkZXYpOworCQlpPSBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnRpLT53YWl0X2Zvcl9yZXNldCwgMjUgKiBIWik7CisJCS8qIHNpZyBjYXRjaDogZXN0aW1hdGUgb3BlbmluZyBhZGFwdGVyIHRha2VzIG1vcmUgdGhhbiAuNSBzZWMqLworCQlpZiAoaT4oMjQ1KkhaKS8xMCkgYnJlYWs7IC8qIGZhbmNpZXIgdGhhbiBpZiAoaT09MjUqSFopICovCisJCWlmIChpPT0wKSBicmVhazsKKwkJaWYgKHRpLT5vcGVuX3N0YXR1cyA9PSBPUEVOICYmIHRpLT5zYXBfc3RhdHVzPT1PUEVOKSB7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJRFBSSU5USygiQWRhcHRlciBpcyB1cCBhbmQgcnVubmluZ1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljdXJyZW50LT5zdGF0ZT1UQVNLX0lOVEVSUlVQVElCTEU7CisJCWk9c2NoZWR1bGVfdGltZW91dChUUl9SRVRSWV9JTlRFUlZBTCk7IC8qIHdhaXQgMzAgc2Vjb25kcyAqLworCQlpZihpIT0wKSBicmVhazsgLypwcm9iLiBhIHNpZ25hbCwgbGlrZSB0aGUgaT4yNCpIWiBjYXNlIGFib3ZlICovCisJfQorCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBBREFQVFJFU0VUKTsvKiBraWxsIHBlbmRpbmcgaW50ZXJydXB0cyovCisJRFBSSU5USygiVEVSTUlOQVRFRCB2aWEgc2lnbmFsXG4iKTsJLypCTVMgdXNlZnVsICovCisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT01NQU5EX09GU1QgICAgICAgICAgICAgMAorI2RlZmluZSBPUEVOX09QVElPTlNfT0ZTVCAgICAgICAgOAorI2RlZmluZSBOVU1fUkNWX0JVRl9PRlNUICAgICAgICAyNAorI2RlZmluZSBSQ1ZfQlVGX0xFTl9PRlNUICAgICAgICAyNgorI2RlZmluZSBESEJfTEVOR1RIX09GU1QgICAgICAgICAyOAorI2RlZmluZSBOVU1fREhCX09GU1QgICAgICAgICAgICAzMAorI2RlZmluZSBETENfTUFYX1NBUF9PRlNUICAgICAgICAzMgorI2RlZmluZSBETENfTUFYX1NUQV9PRlNUICAgICAgICAzMworCit2b2lkIHRva19vcGVuX2FkYXB0ZXIodW5zaWduZWQgbG9uZyBkZXZfYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9hZGRyOworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisJaW50IGk7CisKKwl0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCVNFVF9QQUdFKHRpLT5pbml0X3NyYl9wYWdlKTsgCisJd3JpdGViKH5TUkJfUkVTUF9JTlQsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SRVNFVCArIElTUlBfT0REKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBkaXJfb3Blbl9hZGFwdGVyKTsgaSsrKQorCQl3cml0ZWIoMCwgdGktPmluaXRfc3JiICsgaSk7CisJd3JpdGViKERJUl9PUEVOX0FEQVBURVIsIHRpLT5pbml0X3NyYiArIENPTU1BTkRfT0ZTVCk7CisJd3JpdGV3KGh0b25zKE9QRU5fUEFTU19CQ09OX01BQyksIHRpLT5pbml0X3NyYiArIE9QRU5fT1BUSU9OU19PRlNUKTsKKwlpZiAodGktPnJpbmdfc3BlZWQgPT0gMTYpIHsKKwkJd3JpdGV3KGh0b25zKHRpLT5kaGJfc2l6ZTE2bWIpLCB0aS0+aW5pdF9zcmIgKyBESEJfTEVOR1RIX09GU1QpOworCQl3cml0ZXcoaHRvbnModGktPnJidWZfY250MTYpLCB0aS0+aW5pdF9zcmIgKyBOVU1fUkNWX0JVRl9PRlNUKTsKKwkJd3JpdGV3KGh0b25zKHRpLT5yYnVmX2xlbjE2KSwgdGktPmluaXRfc3JiICsgUkNWX0JVRl9MRU5fT0ZTVCk7CisJfSBlbHNlIHsKKwkJd3JpdGV3KGh0b25zKHRpLT5kaGJfc2l6ZTRtYiksIHRpLT5pbml0X3NyYiArIERIQl9MRU5HVEhfT0ZTVCk7CisJCXdyaXRldyhodG9ucyh0aS0+cmJ1Zl9jbnQ0KSwgdGktPmluaXRfc3JiICsgTlVNX1JDVl9CVUZfT0ZTVCk7CisJCXdyaXRldyhodG9ucyh0aS0+cmJ1Zl9sZW40KSwgdGktPmluaXRfc3JiICsgUkNWX0JVRl9MRU5fT0ZTVCk7CisJfQorCXdyaXRlYihOVU1fREhCLAkJLyogYWx3YXlzIDIgKi8gdGktPmluaXRfc3JiICsgTlVNX0RIQl9PRlNUKTsKKwl3cml0ZWIoRExDX01BWF9TQVAsIHRpLT5pbml0X3NyYiArIERMQ19NQVhfU0FQX09GU1QpOworCXdyaXRlYihETENfTUFYX1NUQSwgdGktPmluaXRfc3JiICsgRExDX01BWF9TVEFfT0ZTVCk7CisJdGktPnNyYiA9IHRpLT5pbml0X3NyYjsJLyogV2UgdXNlIHRoaXMgb25lIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXRpLT5zcmJfcGFnZSA9IHRpLT5pbml0X3NyYl9wYWdlOworCURQUklOVEsoIk9wZW5pbmcgYWRhcHRlcjogWG1pdCBiZnJzOiAlZCBYICVkLCBSY3YgYmZyczogJWQgWCAlZFxuIiwKKwkJcmVhZGIodGktPmluaXRfc3JiICsgTlVNX0RIQl9PRlNUKSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgREhCX0xFTkdUSF9PRlNUKSksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIE5VTV9SQ1ZfQlVGX09GU1QpKSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgUkNWX0JVRl9MRU5fT0ZTVCkpKTsKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgb3Blbl9zYXAodW5zaWduZWQgY2hhciB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgZGxjX29wZW5fc2FwKTsgaSsrKQorCQl3cml0ZWIoMCwgdGktPnNyYiArIGkpOworCisjZGVmaW5lIE1BWF9JX0ZJRUxEX09GU1QgICAgICAgIDE0CisjZGVmaW5lIFNBUF9WQUxVRV9PRlNUICAgICAgICAgIDE2CisjZGVmaW5lIFNBUF9PUFRJT05TX09GU1QgICAgICAgIDE3CisjZGVmaW5lIFNUQVRJT05fQ09VTlRfT0ZTVCAgICAgIDE4CisKKwl3cml0ZWIoRExDX09QRU5fU0FQLCB0aS0+c3JiICsgQ09NTUFORF9PRlNUKTsKKwl3cml0ZXcoaHRvbnMoTUFYX0lfRklFTEQpLCB0aS0+c3JiICsgTUFYX0lfRklFTERfT0ZTVCk7CisJd3JpdGViKFNBUF9PUEVOX0lORF9TQVAgfCBTQVBfT1BFTl9QUklPUklUWSwgdGktPnNyYisgU0FQX09QVElPTlNfT0ZTVCk7CisJd3JpdGViKFNBUF9PUEVOX1NUQVRJT05fQ05ULCB0aS0+c3JiICsgU1RBVElPTl9DT1VOVF9PRlNUKTsKKwl3cml0ZWIodHlwZSwgdGktPnNyYiArIFNBUF9WQUxVRV9PRlNUKTsKKwl3cml0ZWIoQ01EX0lOX1NSQiwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHRva19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJdW5zaWduZWQgY2hhciBhZGRyZXNzWzRdOworCisJaW50IGk7CisKKwkvKkJNUyB0aGUgbmV4dCBsaW5lIGlzIENSVUNJQUwgb3IgeW91IG1heSBiZSBzYWQgd2hlbiB5b3UgKi8KKwkvKkJNUyBpZmNvbmZpZyB0ciBkb3duIG9yIGhvdCB1bnBsdWcgYSBQQ01DSUEgY2FyZCA/P2hvd25vd2Jyb3duY293Ki8KKwlpZiAoLypCTVNIRUxQZGV2LT5zdGFydCA9PSAwIHx8Ki8gdGktPm9wZW5fc3RhdHVzICE9IE9QRU4pIHJldHVybjsKKwlhZGRyZXNzWzBdID0gYWRkcmVzc1sxXSA9IGFkZHJlc3NbMl0gPSBhZGRyZXNzWzNdID0gMDsKKwltY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQlhZGRyZXNzWzBdIHw9IG1jbGlzdC0+ZG1pX2FkZHJbMl07CisJCWFkZHJlc3NbMV0gfD0gbWNsaXN0LT5kbWlfYWRkclszXTsKKwkJYWRkcmVzc1syXSB8PSBtY2xpc3QtPmRtaV9hZGRyWzRdOworCQlhZGRyZXNzWzNdIHw9IG1jbGlzdC0+ZG1pX2FkZHJbNV07CisJCW1jbGlzdCA9IG1jbGlzdC0+bmV4dDsKKwl9CisJU0VUX1BBR0UodGktPnNyYl9wYWdlKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBzcmJfc2V0X2Z1bmN0X2FkZHIpOyBpKyspCisJCXdyaXRlYigwLCB0aS0+c3JiICsgaSk7CisKKyNkZWZpbmUgRlVOQ1RfQUREUkVTU19PRlNUIDYKKworCXdyaXRlYihESVJfU0VUX0ZVTkNfQUREUiwgdGktPnNyYiArIENPTU1BTkRfT0ZTVCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgCisJCXdyaXRlYihhZGRyZXNzW2ldLCB0aS0+c3JiICsgRlVOQ1RfQUREUkVTU19PRlNUICsgaSk7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisjaWYgVFJfVkVSQk9TRQorCURQUklOVEsoIlNldHRpbmcgZnVuY3Rpb25hbCBhZGRyZXNzOiAiKTsKKwlmb3IgKGk9MDtpPDQ7aSsrKSAgcHJpbnRrKCIlMDJYICIsIGFkZHJlc3NbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1RBVElPTl9JRF9PRlNUIDQKKworc3RhdGljIGludCB0b2tfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBsb2NrIGFnYWluc3Qgb3RoZXIgQ1BVcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCYodGktPmxvY2spLCBmbGFncyk7CisKKwkvKiBTYXZlIHNrYjsgd2UnbGwgbmVlZCBpdCB3aGVuIHRoZSBhZGFwdGVyIGFza3MgZm9yIHRoZSBkYXRhICovCisJdGktPmN1cnJlbnRfc2tiID0gc2tiOworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJd3JpdGViKFhNSVRfVUlfRlJBTUUsIHRpLT5zcmIgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyh0aS0+ZXhzYXBfc3RhdGlvbl9pZCwgdGktPnNyYiArIFNUQVRJT05fSURfT0ZTVCk7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHRpLT5sb2NrKSwgZmxhZ3MpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdG9rX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCisJLyogSW1wb3J0YW50IGZvciBQQ01DSUEgaG90IHVucGx1Zywgb3RoZXJ3aXNlLCB3ZSdsbCBwdWxsIHRoZSBjYXJkLCAqLworCS8qIHVubG9hZGluZyB0aGUgbW9kdWxlIGZyb20gbWVtb3J5LCBhbmQgdGhlbiBpZiBhIHRpbWVyIHBvcHMsIG91Y2ggKi8KKwlkZWxfdGltZXJfc3luYygmdGktPnRyX3RpbWVyKTsKKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgQURBUFRSRVNFVCk7CisJdGktPnNyYW1fcGh5cyB8PSAxOworCXRpLT5vcGVuX3N0YXR1cyA9IENMT1NFRDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlEUFJJTlRLKCJBZGFwdGVyIGlzIGNsb3NlZC5cbiIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUkVUQ09ERV9PRlNUCQkyCisjZGVmaW5lIE9QRU5fRVJST1JfQ09ERV9PRlNUCTYKKyNkZWZpbmUgQVNCX0FERFJFU1NfT0ZTVCAgICAgICAgOAorI2RlZmluZSBTUkJfQUREUkVTU19PRlNUICAgICAgICAxMAorI2RlZmluZSBBUkJfQUREUkVTU19PRlNUICAgICAgICAxMgorI2RlZmluZSBTU0JfQUREUkVTU19PRlNUICAgICAgICAxNAorCitzdGF0aWMgY2hhciAqcHJpbnRwaGFzZVtdPSB7IkxvYmUgbWVkaWEgdGVzdCIsIlBoeXNpY2FsIGluc2VydGlvbiIsCisJICAgICAgIkFkZHJlc3MgdmVyaWZpY2F0aW9uIiwiUm9sbCBjYWxsIHBvbGwiLCJSZXF1ZXN0IFBhcmFtZXRlcnMifTsKK3N0YXRpYyBjaGFyICpwcmludGVycm9yW109eyJGdW5jdGlvbiBmYWlsdXJlIiwiU2lnbmFsIGxvc3MiLCJSZXNlcnZlZCIsCisJCSJGcmVxdWVuY3kgZXJyb3IiLCJUaW1lb3V0IiwiUmluZyBmYWlsdXJlIiwiUmluZyBiZWFjb25pbmciLAorCQkiRHVwbGljYXRlIG5vZGUgYWRkcmVzcyIsCisJCSJQYXJhbWV0ZXIgcmVxdWVzdC1yZXRyeSBjb3VudCBleGNlZWRlZCIsIlJlbW92ZSByZWNlaXZlZCIsCisJCSJJTVBMIGZvcmNlIHJlY2VpdmVkIiwiRHVwbGljYXRlIG1vZGlmaWVyIiwKKwkJIk5vIG1vbml0b3IgZGV0ZWN0ZWQiLCJNb25pdG9yIGNvbnRlbnRpb24gZmFpbGVkIGZvciBSUEwifTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqbWFwX2FkZHJlc3Moc3RydWN0IHRva19pbmZvICp0aSwgdW5zaWduZWQgaW5kZXgsIF9fdTggKnBhZ2UpCit7CisJaWYgKHRpLT5wYWdlX21hc2spIHsKKwkJKnBhZ2UgPSAoaW5kZXggPj4gOCkgJiB0aS0+cGFnZV9tYXNrOworCQlpbmRleCAmPSB+KHRpLT5wYWdlX21hc2sgPDwgOCk7CisJfQorCXJldHVybiB0aS0+c3JhbV92aXJ0ICsgaW5kZXg7Cit9CisKK3ZvaWQgZGlyX29wZW5fYWRhcHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworICAgICAgICB1bnNpZ25lZCBjaGFyIHJldF9jb2RlOworICAgICAgICBfX3UxNiBlcnI7CisKKyAgICAgICAgdGktPnNyYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBTUkJfQUREUkVTU19PRlNUKSksCisJCSZ0aS0+c3JiX3BhZ2UpOworICAgICAgICB0aS0+c3NiID0gbWFwX2FkZHJlc3ModGksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIFNTQl9BRERSRVNTX09GU1QpKSwKKwkJJnRpLT5zc2JfcGFnZSk7CisgICAgICAgIHRpLT5hcmIgPSBtYXBfYWRkcmVzcyh0aSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgQVJCX0FERFJFU1NfT0ZTVCkpLAorCQkmdGktPmFyYl9wYWdlKTsKKyAgICAgICAgdGktPmFzYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBBU0JfQUREUkVTU19PRlNUKSksCisJCSZ0aS0+YXNiX3BhZ2UpOworICAgICAgICB0aS0+Y3VycmVudF9za2IgPSBOVUxMOworICAgICAgICByZXRfY29kZSA9IHJlYWRiKHRpLT5pbml0X3NyYiArIFJFVENPREVfT0ZTVCk7CisgICAgICAgIGVyciA9IG50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIE9QRU5fRVJST1JfQ09ERV9PRlNUKSk7CisgICAgICAgIGlmICghcmV0X2NvZGUpIHsKKwkJdGktPm9wZW5fc3RhdHVzID0gT1BFTjsgLyogVFIgYWRhcHRlciBpcyBub3cgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgaWYgKHRpLT5vcGVuX21vZGUgPT0gQVVUT01BVElDKSB7CisJCQlEUFJJTlRLKCJBZGFwdGVyIHJlb3BlbmVkLlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlYih+U1JCX1JFU1BfSU5ULCB0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SRVNFVCtJU1JQX09ERCk7CisgICAgICAgICAgICAgICAgb3Blbl9zYXAoRVhURU5ERURfU0FQLCBkZXYpOworCQlyZXR1cm47CisJfQorCXRpLT5vcGVuX2ZhaWx1cmUgPSBZRVM7CisJaWYgKHJldF9jb2RlID09IDcpeworICAgICAgICAgICAgICAgaWYgKGVyciA9PSAweDI0KSB7CisJCQlpZiAoIXRpLT5hdXRvX3NwZWVkc2F2ZSkgeworCQkJCURQUklOVEsoIk9wZW4gZmFpbGVkOiBBZGFwdGVyIHNwZWVkIG11c3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpbmcgc3BlZWQgaWYgQXV0b21hdGljIFJpbmcgU3BlZWQgU2F2ZSBpcyAiCisJCQkJICJkaXNhYmxlZC5cbiIpOworCQkJCXRpLT5vcGVuX2FjdGlvbiA9IEZBSUw7CisJCQl9ZWxzZQorCQkJCURQUklOVEsoIlJldHJ5aW5nIG9wZW4gdG8gYWRqdXN0IHRvICIKKwkJCQkJInJpbmcgc3BlZWQsICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IDB4MmQpIHsKKwkJCURQUklOVEsoIlBoeXNpY2FsIEluc2VydGlvbjogTm8gTW9uaXRvciBEZXRlY3RlZCwgIik7CisJCQlwcmludGsoInJldHJ5aW5nIGFmdGVyICVkcyBkZWxheS4uLlxuIiwKKwkJCQkJVFJfUkVUUllfSU5URVJWQUwvSFopOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IDB4MTEpIHsKKwkJCURQUklOVEsoIkxvYmUgTWVkaWEgRnVuY3Rpb24gRmFpbHVyZSAoMHgxMSksICIpOworCQkJcHJpbnRrKCIgcmV0cnlpbmcgYWZ0ZXIgJWRzIGRlbGF5Li4uXG4iLAorCQkJCQlUUl9SRVRSWV9JTlRFUlZBTC9IWik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWNoYXIgKipwcnBoYXNlID0gcHJpbnRwaGFzZTsKKwkJCWNoYXIgKipwcmVycm9yID0gcHJpbnRlcnJvcjsKKwkJCURQUklOVEsoIlRSIEFkYXB0ZXIgbWlzYyBvcGVuIGZhaWx1cmUsIGVycm9yIGNvZGUgPSAiKTsKKwkJCXByaW50aygiMHgleCwgUGhhc2U6ICVzLCBFcnJvcjogJXNcbiIsCisJCQkJZXJyLCBwcnBoYXNlW2Vyci8xNiAtMV0sIHByZXJyb3JbZXJyJTE2IC0xXSk7CisJCQlwcmludGsoIiByZXRyeWluZyBhZnRlciAlZHMgZGVsYXkuLi5cbiIsCisJCQkJCVRSX1JFVFJZX0lOVEVSVkFML0haKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBEUFJJTlRLKCJvcGVuIGZhaWxlZDogcmV0X2NvZGUgPSAlMDJYLi4uLCAiLCByZXRfY29kZSk7CisJaWYgKHRpLT5vcGVuX2FjdGlvbiAhPSBGQUlMKSB7CisJCWlmICh0aS0+b3Blbl9tb2RlPT1BVVRPTUFUSUMpeworCQkJdGktPm9wZW5fYWN0aW9uID0gUkVPUEVOOworCQkJaWJtdHJfcmVzZXRfdGltZXIoJih0aS0+dHJfdGltZXIpLCBkZXYpOworCQkJcmV0dXJuOworCQl9CisJCXdha2VfdXAoJnRpLT53YWl0X2Zvcl9yZXNldCk7CisJCXJldHVybjsKKwl9CisJRFBSSU5USygiRkFJTFVSRSwgQ0FQVVRcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJLyogIHVuc2lnbmVkIGNoYXIgc3RhdHVzX2V2ZW4gOyAqLworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJdW5zaWduZWQgY2hhciBzYXZlX3NycHI7CisjZW5kaWYKKworCWRldiA9IGRldl9pZDsKKyNpZiBUUl9WRVJCT1NFCisJRFBSSU5USygiSW50IGZyb20gdG9rX2RyaXZlciwgZGV2IDogJXAgaXJxJWQgcmVncz0lcFxuIiwgZGV2LGlycSxyZWdzKTsKKyNlbmRpZgorCXRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJaWYgKHRpLT5zcmFtX3BoeXMgJiAxKQorCQlyZXR1cm4gSVJRX05PTkU7ICAgICAgICAgLyogUENNQ0lBIGNhcmQgZXh0cmFjdGlvbiBmbGFnICovCisJc3Bpbl9sb2NrKCYodGktPmxvY2spKTsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJc2F2ZV9zcnByID0gcmVhZGIodGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgU1JQUl9FVkVOKTsKKyNlbmRpZgorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHRpbGwgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCAqLworCXdyaXRlYigofklOVF9FTkFCTEUpLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX0VWRU4pOworCisJLyogUmVzZXQgaW50ZXJydXB0IGZvciBJU0EgYm9hcmRzICovCisJaWYgKHRpLT5hZGFwdGVyX2ludF9lbmFibGUpCisJCW91dGIoMCwgdGktPmFkYXB0ZXJfaW50X2VuYWJsZSk7CisJZWxzZSAvKiB1c2VkIGZvciBQQ01DSUEgY2FyZHMgKi8KKwkJb3V0YigwLCB0aS0+Z2xvYmFsX2ludF9lbmFibGUpOworICAgICAgICBpZiAodGktPmRvX3Rva19pbnQgPT0gRklSU1RfSU5UKXsKKyAgICAgICAgICAgICAgICBpbml0aWFsX3Rva19pbnQoZGV2KTsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisgICAgICAgICAgICAgICAgd3JpdGViKHNhdmVfc3JwciwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgU1JQUl9FVkVOKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCYodGktPmxvY2spKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgIH0KKwkvKiAgQmVnaW4gaW50ZXJydXB0IGhhbmRsZXIgSEVSRSBpbmxpbmUgdG8gYXZvaWQgdGhlIGV4dHJhCisJICAgIGxldmVscyBvZiBsb2dpYyBhbmQgY2FsbCBkZXB0aCBmb3IgdGhlIG9yaWdpbmFsIHNvbHV0aW9uLiAqLworCXN0YXR1cyA9IHJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIElTUlBfT0REKTsKKwkvKkJNU3N0YXR1c19ldmVuID0gcmVhZGIgKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIElTUlBfRVZFTikgKi8KKwkvKkJNU2RlYnVncHJpbnRrKCJ0b2tfaW50ZXJydXB0OiBJU1JQX09ERCA9IDB4JXggSVNSUF9FVkVOID0gMHgleFxuIiwgKi8KKwkvKkJNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxzdGF0dXNfZXZlbik7ICAgICAgKi8KKworCWlmIChzdGF0dXMgJiBBREFQX0NIS19JTlQpIHsKKwkJaW50IGk7CisJCXZvaWQgX19pb21lbSAqY2hlY2tfcmVhc29uOworCQlfX3U4IGNoZWNrX3JlYXNvbl9wYWdlID0gMDsKKwkJY2hlY2tfcmVhc29uID0gbWFwX2FkZHJlc3ModGksCisJCQludG9ocyhyZWFkdyh0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUlcgKyBXV0NSX0VWRU4pKSwKKwkJCSZjaGVja19yZWFzb25fcGFnZSk7CisJCVNFVF9QQUdFKGNoZWNrX3JlYXNvbl9wYWdlKTsKKworCQlEUFJJTlRLKCJBZGFwdGVyIGNoZWNrIGludGVycnVwdFxuIik7CisJCURQUklOVEsoIjggcmVhc29uIGJ5dGVzIGZvbGxvdzogIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGNoZWNrX3JlYXNvbisrKQorCQkJcHJpbnRrKCIlMDJYICIsIChpbnQpIHJlYWRiKGNoZWNrX3JlYXNvbikpOworCQlwcmludGsoIlxuIik7CisJCXdyaXRlYih+QURBUF9DSEtfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQrIElTUlBfT0REKTsKKwkJc3RhdHVzID0gcmVhZGIodGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSQV9FVkVOKTsKKwkJRFBSSU5USygiSVNSQV9FVkVOID09IDB4MDIleFxuIixzdGF0dXMpOworCQl0aS0+b3Blbl9zdGF0dXMgPSBDTE9TRUQ7CisJCXRpLT5zYXBfc3RhdHVzICA9IENMT1NFRDsKKwkJdGktPm9wZW5fbW9kZSAgID0gQVVUT01BVElDOworCQlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl0aS0+b3Blbl9hY3Rpb24gPSBSRVNUQVJUOworCQlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgQURBUFRSRVNFVCk7CisJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsvKkJNUyB0cnkgdG8gcmVvcGVuKi8KKwkJc3Bpbl91bmxvY2soJih0aS0+bG9jaykpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmIChyZWFkYih0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX0VWRU4pCisJCSYgKFRDUl9JTlQgfCBFUlJfSU5UIHwgQUNDRVNTX0lOVCkpIHsKKwkJRFBSSU5USygiYWRhcHRlciBlcnJvcjogSVNSUF9FVkVOIDogJTAyeFxuIiwKKwkJCShpbnQpcmVhZGIodGktPm1taW8rIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX0VWRU4pKTsKKwkJd3JpdGViKH4oVENSX0lOVCB8IEVSUl9JTlQgfCBBQ0NFU1NfSU5UKSwKKwkJCXRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SRVNFVCArIElTUlBfRVZFTik7CisJCXN0YXR1cz0gcmVhZGIodGktPm1taW8rIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JBX0VWRU4pOy8qQk1TKi8KKwkJRFBSSU5USygiSVNSQV9FVkVOID09IDB4MDIleFxuIixzdGF0dXMpOy8qQk1TKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisjaWZkZWYgRU5BQkxFX1BBR0lORworICAgICAgICAgICAgICAgIHdyaXRlYihzYXZlX3NycHIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmKHRpLT5sb2NrKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9CisJaWYgKHN0YXR1cyAmIFNSQl9SRVNQX0lOVCkgewkvKiBTUkIgcmVzcG9uc2UgKi8KKwkJU0VUX1BBR0UodGktPnNyYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIlNSQiByZXNwOiBjbWQ9JTAyWCByc3A9JTAyWFxuIiwKKwkJCQlyZWFkYih0aS0+c3JiKSwgcmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCkpOworI2VuZGlmCisJCXN3aXRjaCAocmVhZGIodGktPnNyYikpIHsJLyogU1JCIGNvbW1hbmQgY2hlY2sgKi8KKwkJY2FzZSBYTUlUX0RJUl9GUkFNRTp7CisJCQl1bnNpZ25lZCBjaGFyIHhtaXRfcmV0X2NvZGU7CisJCQl4bWl0X3JldF9jb2RlID0gcmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCk7CisJCQlpZiAoeG1pdF9yZXRfY29kZSA9PSAweGZmKSBicmVhazsKKwkJCURQUklOVEsoImVycm9yIG9uIHhtaXRfZGlyX2ZyYW1lIHJlcXVlc3Q6ICUwMlhcbiIsCisJCQkJCQkJCXhtaXRfcmV0X2NvZGUpOworCQkJaWYgKHRpLT5jdXJyZW50X3NrYikgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKHRpLT5jdXJyZW50X3NrYik7CisJCQkJdGktPmN1cnJlbnRfc2tiID0gTlVMTDsKKwkJCX0KKwkJCS8qZGV2LT50YnVzeSA9IDA7Ki8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWlmICh0aS0+cmVhZGxvZ19wZW5kaW5nKQorCQkJCWlibXRyX3JlYWRsb2coZGV2KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgWE1JVF9VSV9GUkFNRTp7CisJCQl1bnNpZ25lZCBjaGFyIHhtaXRfcmV0X2NvZGU7CisKKwkJCXhtaXRfcmV0X2NvZGUgPSByZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKTsKKwkJCWlmICh4bWl0X3JldF9jb2RlID09IDB4ZmYpIGJyZWFrOworCQkJRFBSSU5USygiZXJyb3Igb24geG1pdF91aV9mcmFtZSByZXF1ZXN0OiAlMDJYXG4iLAorCQkJCQkJCQl4bWl0X3JldF9jb2RlKTsKKwkJCWlmICh0aS0+Y3VycmVudF9za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSh0aS0+Y3VycmVudF9za2IpOworCQkJCXRpLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlpZiAodGktPnJlYWRsb2dfcGVuZGluZykKKwkJCQlpYm10cl9yZWFkbG9nKGRldik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIERJUl9PUEVOX0FEQVBURVI6CisJCQlkaXJfb3Blbl9hZGFwdGVyKGRldik7CisJCQlicmVhazsKKwkJY2FzZSBETENfT1BFTl9TQVA6CisJCQlpZiAocmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCkpIHsKKwkJCQlEUFJJTlRLKCJvcGVuX3NhcCBmYWlsZWQ6IHJldF9jb2RlID0gJTAyWCwgIgorCQkJCQkicmV0cnlpbmdcbiIsCisJCQkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKwkJCQl0aS0+b3Blbl9hY3Rpb24gPSBSRU9QRU47CisJCQkJaWJtdHJfcmVzZXRfdGltZXIoJih0aS0+dHJfdGltZXIpLCBkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJdGktPmV4c2FwX3N0YXRpb25faWQgPSByZWFkdyh0aS0+c3JiICsgU1RBVElPTl9JRF9PRlNUKTsKKwkJCXRpLT5zYXBfc3RhdHVzID0gT1BFTjsvKiBUUiBhZGFwdGVyIGlzIG5vdyBhdmFpbGFibGUgKi8KKwkJCWlmICh0aS0+b3Blbl9tb2RlPT1NQU5VQUwpeworCQkJCXdha2VfdXAoJnRpLT53YWl0X2Zvcl9yZXNldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlkZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOy8qQk1TIDEyLzIwMDAqLworCQkJYnJlYWs7CisJCWNhc2UgRElSX0lOVEVSUlVQVDoKKwkJY2FzZSBESVJfTU9EX09QRU5fUEFSQU1TOgorCQljYXNlIERJUl9TRVRfR1JQX0FERFI6CisJCWNhc2UgRElSX1NFVF9GVU5DX0FERFI6CisJCWNhc2UgRExDX0NMT1NFX1NBUDoKKwkJCWlmIChyZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSkKKwkJCQlEUFJJTlRLKCJlcnJvciBvbiAlMDJYOiAlMDJYXG4iLAorCQkJCQkoaW50KSByZWFkYih0aS0+c3JiICsgQ09NTUFORF9PRlNUKSwKKwkJCQkJKGludCkgcmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCkpOworCQkJYnJlYWs7CisJCWNhc2UgRElSX1JFQURfTE9HOgorCQkJaWYgKHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKXsKKwkJCQlEUFJJTlRLKCJlcnJvciBvbiBkaXJfcmVhZF9sb2c6ICUwMlhcbiIsCisJCQkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJYnJlYWs7CisJCQl9CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMKKworI2RlZmluZSBMSU5FX0VSUk9SU19PRlNUICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVEVSTkFMX0VSUk9SU19PRlNUICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlVSU1RfRVJST1JTX09GU1QgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBQ19FUlJPUlNfT0ZTVCAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFCT1JUX0RFTElNSVRFUlNfT0ZTVCAgICAgICAgICAgIDQKKyNkZWZpbmUgTE9TVF9GUkFNRVNfT0ZTVCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUNWX0NPTkdFU1RfQ09VTlRfT0ZTVCAgICAgICAgICA3CisjZGVmaW5lIEZSQU1FX0NPUElFRF9FUlJPUlNfT0ZTVCAgICAgICAgIDgKKyNkZWZpbmUgRlJFUVVFTkNZX0VSUk9SU19PRlNUICAgICAgICAgICAgOQorI2RlZmluZSBUT0tFTl9FUlJPUlNfT0ZTVCAgICAgICAgICAgICAgIDEwCisKKwkJCURQUklOVEsoIkxpbmUgZXJyb3JzICUwMlgsIEludGVybmFsIGVycm9ycyAlMDJYLCAiCisJCQkiQnVyc3QgZXJyb3JzICUwMlhcbiIgIkEvQyBlcnJvcnMgJTAyWCwgIgorCQkJIkFib3J0IGRlbGltaXRlcnMgJTAyWCwgTG9zdCBmcmFtZXMgJTAyWFxuIgorCQkJIlJlY2VpdmUgY29uZ2VzdGlvbiBjb3VudCAlMDJYLCAiCisJCQkiRnJhbWUgY29waWVkIGVycm9ycyAlMDJYXG5GcmVxdWVuY3kgZXJyb3JzICUwMlgsICIKKwkJCSJUb2tlbiBlcnJvcnMgJTAyWFxuIiwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBMSU5FX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBJTlRFUk5BTF9FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgQlVSU1RfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIEFDX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBBQk9SVF9ERUxJTUlURVJTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIExPU1RfRlJBTUVTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIFJFQ1ZfQ09OR0VTVF9DT1VOVF9PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBGUkFNRV9DT1BJRURfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIEZSRVFVRU5DWV9FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgVE9LRU5fRVJST1JTX09GU1QpKTsKKyNlbmRpZgorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKCJVbmtub3duIGNvbW1hbmQgJTAyWCBlbmNvdW50ZXJlZFxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5zcmIpKTsKKyAgICAgICAgCX0JLyogZW5kIHN3aXRjaCBTUkIgY29tbWFuZCBjaGVjayAqLworCQl3cml0ZWIoflNSQl9SRVNQX0lOVCwgdGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JFU0VUKyBJU1JQX09ERCk7CisJfQkvKiBpZiBTUkIgcmVzcG9uc2UgKi8KKwlpZiAoc3RhdHVzICYgQVNCX0ZSRUVfSU5UKSB7CS8qIEFTQiByZXNwb25zZSAqLworCQlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworI2lmIFRSX1ZFUkJPU0UKKwkJRFBSSU5USygiQVNCIHJlc3A6IGNtZD0lMDJYXG4iLCByZWFkYih0aS0+YXNiKSk7CisjZW5kaWYKKworCQlzd2l0Y2ggKHJlYWRiKHRpLT5hc2IpKSB7CS8qIEFTQiBjb21tYW5kIGNoZWNrICovCisJCWNhc2UgUkVDX0RBVEE6CisJCWNhc2UgWE1JVF9VSV9GUkFNRToKKwkJY2FzZSBYTUlUX0RJUl9GUkFNRToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygidW5rbm93biBjb21tYW5kIGluIGFzYiAlMDJYXG4iLAorCQkJCQkJKGludCkgcmVhZGIodGktPmFzYikpOworCQl9CS8qIHN3aXRjaCBBU0IgY29tbWFuZCBjaGVjayAqLworCQlpZiAocmVhZGIodGktPmFzYiArIDIpICE9IDB4ZmYpCS8qIGNoZWNrcyByZXRfY29kZSAqLworCQkJRFBSSU5USygiQVNCIGVycm9yICUwMlggaW4gY21kICUwMlhcbiIsCisJCQkJKGludCkgcmVhZGIodGktPmFzYiArIDIpLCAoaW50KSByZWFkYih0aS0+YXNiKSk7CisJCXdyaXRlYih+QVNCX0ZSRUVfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQrIElTUlBfT0REKTsKKwl9CS8qIGlmIEFTQiByZXNwb25zZSAqLworCisjZGVmaW5lIFNUQVRVU19PRlNUICAgICAgICAgICAgIDYKKyNkZWZpbmUgTkVUV19TVEFUVVNfT0ZTVCAgICAgICAgNgorCisJaWYgKHN0YXR1cyAmIEFSQl9DTURfSU5UKSB7CS8qIEFSQiByZXNwb25zZSAqLworCQlTRVRfUEFHRSh0aS0+YXJiX3BhZ2UpOworI2lmIFRSX1ZFUkJPU0UKKwkJRFBSSU5USygiQVJCIHJlc3A6IGNtZD0lMDJYXG4iLCByZWFkYih0aS0+YXJiKSk7CisjZW5kaWYKKworCQlzd2l0Y2ggKHJlYWRiKHRpLT5hcmIpKSB7CS8qIEFSQiBjb21tYW5kIGNoZWNrICovCisJCWNhc2UgRExDX1NUQVRVUzoKKwkJCURQUklOVEsoIkRMQ19TVEFUVVMgbmV3IHN0YXR1czogJTAyWCBvbiBzdGF0aW9uICUwMlhcbiIsCisJCQkJbnRvaHMocmVhZHcodGktPmFyYiArIFNUQVRVU19PRlNUKSksCisJCQkJbnRvaHMocmVhZHcodGktPmFyYisgU1RBVElPTl9JRF9PRlNUKSkpOworCQkJYnJlYWs7CisJCWNhc2UgUkVDX0RBVEE6CisJCQl0cl9yeChkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgUklOR19TVEFUX0NIQU5HRTp7CisJCQl1bnNpZ25lZCBzaG9ydCByaW5nX3N0YXR1czsKKwkJCXJpbmdfc3RhdHVzPSBudG9ocyhyZWFkdyh0aS0+YXJiICsgTkVUV19TVEFUVVNfT0ZTVCkpOworCQkJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpCisJCQkJRFBSSU5USygiUmluZyBTdGF0dXMgQ2hhbmdlLi4uKDB4JXgpXG4iLAorCQkJCQkJCQlyaW5nX3N0YXR1cyk7CisJCQlpZihyaW5nX3N0YXR1cyYgKFJFTU9WRV9SRUNWfEFVVE9fUkVNT1ZBTHxMT0JFX0ZBVUxUKSl7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCWRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOy8qbm90IHR5cGljYWwgTGludXgqLworCQkJCURQUklOVEsoIlJlbW92ZSByZWNlaXZlZCwgb3IgQXV0by1yZW1vdmFsIGVycm9yIgorCQkJCQkiLCBvciBMb2JlIGZhdWx0XG4iKTsKKwkJCQlEUFJJTlRLKCJXZSdsbCB0cnkgdG8gcmVvcGVuIHRoZSBjbG9zZWQgYWRhcHRlciIKKwkJCQkJIiBhZnRlciBhICVkIHNlY29uZCBkZWxheS5cbiIsCisJCQkJCQlUUl9SRVRSWV9JTlRFUlZBTC9IWik7CisJCQkJLypJIHdhcyBjb25mdXNlZDogSSBzYXcgdGhlIFRSIHJlb3BlbmluZyBidXQgKi8KKwkJCQkvKmZvcmdvdDp3aXRoIGFuIFJKNDUgaW4gYW4gUko0NS9JQ1MgYWRhcHRlciAqLworCQkJCS8qYnV0IGFkYXB0ZXIgbm90IGluIHRoZSByaW5nLCB0aGUgVFIgd2lsbCAgICovCisJCQkJLyogb3BlbiwgYW5kIHRoZW4gc29vbiBjbG9zZSBhbmQgY29tZSBoZXJlLiAgKi8KKwkJCQl0aS0+b3Blbl9tb2RlID0gQVVUT01BVElDOworCQkJCXRpLT5vcGVuX3N0YXR1cyA9IENMT1NFRDsgLyoxMi8yMDAwIEJNUyovCisJCQkJdGktPm9wZW5fYWN0aW9uID0gUkVPUEVOOworCQkJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsKKwkJCX0gZWxzZSBpZiAocmluZ19zdGF0dXMgJiBMT0dfT1ZFUkZMT1cpIHsKKwkJCQlpZihuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCQkJCXRpLT5yZWFkbG9nX3BlbmRpbmcgPSAxOworCQkJCWVsc2UKKwkJCQkJaWJtdHJfcmVhZGxvZyhkZXYpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgICAgCX0KKwkJY2FzZSBYTUlUX0RBVEFfUkVROgorCQkJdHJfdHgoZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiVW5rbm93biBjb21tYW5kICUwMlggaW4gYXJiXG4iLAorCQkJCQkJKGludCkgcmVhZGIodGktPmFyYikpOworCQkJYnJlYWs7CisJCX0JLyogc3dpdGNoIEFSQiBjb21tYW5kIGNoZWNrICovCisJCXdyaXRlYih+QVJCX0NNRF9JTlQsIHRpLT5tbWlvKyBBQ0FfT0ZGU0VUK0FDQV9SRVNFVCArIElTUlBfT0REKTsKKwkJd3JpdGViKEFSQl9GUkVFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCX0JLyogaWYgQVJCIHJlc3BvbnNlICovCisJaWYgKHN0YXR1cyAmIFNTQl9SRVNQX0lOVCkgewkvKiBTU0IgcmVzcG9uc2UgKi8KKwkJdW5zaWduZWQgY2hhciByZXRjb2RlOworCQlTRVRfUEFHRSh0aS0+c3NiX3BhZ2UpOworI2lmIFRSX1ZFUkJPU0UKKwkJRFBSSU5USygiU1NCIHJlc3A6IGNtZD0lMDJYIHJzcD0lMDJYXG4iLAorCQkJCXJlYWRiKHRpLT5zc2IpLCByZWFkYih0aS0+c3NiICsgMikpOworI2VuZGlmCisKKwkJc3dpdGNoIChyZWFkYih0aS0+c3NiKSkgewkvKiBTU0IgY29tbWFuZCBjaGVjayAqLworCQljYXNlIFhNSVRfRElSX0ZSQU1FOgorCQljYXNlIFhNSVRfVUlfRlJBTUU6CisJCQlyZXRjb2RlID0gcmVhZGIodGktPnNzYiArIDIpOworCQkJaWYgKHJldGNvZGUgJiYgKHJldGNvZGUgIT0gMHgyMikpLyogY2hlY2tzIHJldF9jb2RlICovCisJCQkJRFBSSU5USygieG1pdCByZXRfY29kZTogJTAyWCB4bWl0IGVycm9yIGNvZGU6ICIKKwkJCQkJIiUwMlhcbiIsCisJCQkJCShpbnQpcmV0Y29kZSwgKGludClyZWFkYih0aS0+c3NiICsgNikpOworCQkJZWxzZQorCQkJCXRpLT50cl9zdGF0cy50eF9wYWNrZXRzKys7CisJCQlicmVhazsKKwkJY2FzZSBYTUlUX1hJRF9DTUQ6CisJCQlEUFJJTlRLKCJ4bWl0IHhpZCByZXRfY29kZTogJTAyWFxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5zc2IgKyAyKSk7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKCJVbmtub3duIGNvbW1hbmQgJTAyWCBpbiBzc2JcbiIsCisJCQkJCQkoaW50KSByZWFkYih0aS0+c3NiKSk7CisJCX0JLyogU1NCIGNvbW1hbmQgY2hlY2sgKi8KKwkJd3JpdGViKH5TU0JfUkVTUF9JTlQsIHRpLT5tbWlvKyBBQ0FfT0ZGU0VUK0FDQV9SRVNFVCsgSVNSUF9PREQpOworCQl3cml0ZWIoU1NCX0ZSRUUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJfQkvKiBpZiBTU0IgcmVzcG9uc2UgKi8KKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJd3JpdGViKHNhdmVfc3JwciwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgU1JQUl9FVkVOKTsKKyNlbmRpZgorCXdyaXRlYihJTlRfRU5BQkxFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSUF9FVkVOKTsKKwlzcGluX3VubG9jaygmKHRpLT5sb2NrKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkJCQkvKnRva19pbnRlcnJ1cHQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOSVRfU1RBVFVTX09GU1QgICAgICAgIDEKKyNkZWZpbmUgSU5JVF9TVEFUVVNfMl9PRlNUICAgICAgMgorI2RlZmluZSBFTkNPREVEX0FERFJFU1NfT0ZTVCAgICA4CisKK3N0YXRpYyB2b2lkIGluaXRpYWxfdG9rX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJX191MzIgZW5jb2RlZF9hZGRyLCBod19lbmNvZGVkX2FkZHI7CisJc3RydWN0IHRva19pbmZvICp0aTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBpbml0X3N0YXR1czsgLypCTVMgMTIvMjAwMCovCisKKwl0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCisJdGktPmRvX3Rva19pbnQgPSBOT1RfRklSU1Q7CisKKwkvKiB3ZSBhc3NpZ24gdGhlIHNoYXJlZC1yYW0gYWRkcmVzcyBmb3IgSVNBIGRldmljZXMgKi8KKwl3cml0ZWIodGktPnNyYW1fYmFzZSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgUlJSX0VWRU4pOworI2lmbmRlZiBQQ01DSUEKKyAgICAgICAgdGktPnNyYW1fdmlydCA9IGlvcmVtYXAoKChfX3UzMil0aS0+c3JhbV9iYXNlIDw8IDEyKSwgdGktPmF2YWlsX3NoYXJlZF9yYW0pOworI2VuZGlmCisJdGktPmluaXRfc3JiID0gbWFwX2FkZHJlc3ModGksCisJCW50b2hzKHJlYWR3KHRpLT5tbWlvICsgQUNBX09GRlNFVCArIFdSQlJfRVZFTikpLAorCQkmdGktPmluaXRfc3JiX3BhZ2UpOworCWlmICh0aS0+cGFnZV9tYXNrICYmIHRpLT5hdmFpbF9zaGFyZWRfcmFtID09IDEyNykgeworCQl2b2lkIF9faW9tZW0gKmxhc3RfNTEyOworCQlfX3U4IGxhc3RfNTEyX3BhZ2U9MDsKKwkJaW50IGk7CisJCWxhc3RfNTEyID0gbWFwX2FkZHJlc3ModGksIDB4ZmUwMCwgJmxhc3RfNTEyX3BhZ2UpOworCQkvKiBpbml0aWFsaXplIGhpZ2ggc2VjdGlvbiBvZiByYW0gKGlmIG5lY2Vzc2FyeSkgKi8KKwkJU0VUX1BBR0UobGFzdF81MTJfcGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykKKwkJCXdyaXRlYigwLCBsYXN0XzUxMiArIGkpOworCX0KKwlTRVRfUEFHRSh0aS0+aW5pdF9zcmJfcGFnZSk7CisKKyNpZiBUUl9WRVJCT1NFCisJeworCWludCBpOworCisJRFBSSU5USygidGktPmluaXRfc3JiX3BhZ2U9MHgleFxuIiwgdGktPmluaXRfc3JiX3BhZ2UpOworCURQUklOVEsoImluaXRfc3JiKCVwKToiLCB0aS0+aW5pdF9zcmIgKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJcHJpbnRrKCIlMDJYICIsIChpbnQpIHJlYWRiKHRpLT5pbml0X3NyYiArIGkpKTsKKwlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwlod19lbmNvZGVkX2FkZHIgPSByZWFkdyh0aS0+aW5pdF9zcmIgKyBFTkNPREVEX0FERFJFU1NfT0ZTVCk7CisJZW5jb2RlZF9hZGRyID0gbnRvaHMoaHdfZW5jb2RlZF9hZGRyKTsKKyAgICAgICAgaW5pdF9zdGF0dXM9IC8qQk1TIDEyLzIwMDAgY2hlY2sgZm9yIHNoYWxsb3cgbW9kZSBwb3NzaWJpbGl0eSAoVHVyYm8pKi8KKwlyZWFkYih0aS0+aW5pdF9zcmIrb2Zmc2V0b2Yoc3RydWN0IHNyYl9pbml0X3Jlc3BvbnNlLGluaXRfc3RhdHVzKSk7CisJLypwcmludGsoIkluaXRpYWwgaW50ZXJydXB0OiBpbml0X3N0YXR1cz0gMHglMDJ4XG4iLGluaXRfc3RhdHVzKTsqLworCXRpLT5yaW5nX3NwZWVkID0gaW5pdF9zdGF0dXMgJiAweDAxID8gMTYgOiA0OworCURQUklOVEsoIkluaXRpYWwgaW50ZXJydXB0IDogJWQgTWJwcywgc2hhcmVkIFJBTSBiYXNlICUwOHguXG4iLAorCQkJCXRpLT5yaW5nX3NwZWVkLCAodW5zaWduZWQgaW50KWRldi0+bWVtX3N0YXJ0KTsKKwl0aS0+YXV0b19zcGVlZHNhdmU9cmVhZGIodGktPmluaXRfc3JiK0lOSVRfU1RBVFVTXzJfT0ZTVCkmND9UUlVFOkZBTFNFOworCisgICAgICAgIGlmICh0aS0+b3Blbl9tb2RlID09IE1BTlVBTCkJd2FrZV91cCgmdGktPndhaXRfZm9yX3Jlc2V0KTsKKwllbHNlCQkJCXRva19vcGVuX2FkYXB0ZXIoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKyAgICAgICAgCit9IC8qaW5pdGlhbF90b2tfaW50KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENNRF9DT1JSRUxBVEVfT0ZTVCAgICAgIDEKKyNkZWZpbmUgREhCX0FERFJFU1NfT0ZTVCAgICAgICAgNgorCisjZGVmaW5lIEZSQU1FX0xFTkdUSF9PRlNUICAgICAgIDYKKyNkZWZpbmUgSEVBREVSX0xFTkdUSF9PRlNUICAgICAgOAorI2RlZmluZSBSU0FQX1ZBTFVFX09GU1QgICAgICAgICA5CisKK3N0YXRpYyB2b2lkIHRyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCXN0cnVjdCB0cmhfaGRyICp0cmhkciA9IChzdHJ1Y3QgdHJoX2hkciAqKSB0aS0+Y3VycmVudF9za2ItPmRhdGE7CisJdW5zaWduZWQgaW50IGhkcl9sZW47CisJX191MzIgZGhiPTAsZGhiX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpkaGJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciB4bWl0X2NvbW1hbmQ7CisJaW50IGksZGhiX2xlbj0weDQwMDAsc3JjX2xlbixzcmNfb2Zmc2V0OworCXN0cnVjdCB0cmxsYyAqbGxjOworCXN0cnVjdCBzcmJfeG1pdCB4c3JiOworCV9fdTggZGhiX3BhZ2UgPSAwOworCV9fdTggbGxjX3NzYXA7CisKKwlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworCisJaWYgKHJlYWRiKHRpLT5hc2IrUkVUQ09ERV9PRlNUKSAhPSAweEZGKSBEUFJJTlRLKCJBU0Igbm90IGZyZWUgISEhXG4iKTsKKworCS8qIGluIHByb3ZpZGluZyB0aGUgdHJhbnNtaXQgaW50ZXJydXB0cywgaXMgdGVsbGluZyB1cyBpdCBpcyByZWFkeSBmb3IKKwkgICBkYXRhIGFuZCBwcm92aWRpbmcgYSBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgZm9yIHVzIHRvIHN0dWZmIHdpdGggZGF0YS4KKwkgICBIZXJlIHdlIGNvbXB1dGUgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIHdoZXJlIHdlIHdpbGwgcGxhY2UgZGF0YS4KKwkqLworCVNFVF9QQUdFKHRpLT5hcmJfcGFnZSk7CisJZGhiPWRoYl9iYXNlPW50b2hzKHJlYWR3KHRpLT5hcmIgKyBESEJfQUREUkVTU19PRlNUKSk7CisJaWYgKHRpLT5wYWdlX21hc2spIHsKKwkJZGhiX3BhZ2UgPSAoZGhiX2Jhc2UgPj4gOCkgJiB0aS0+cGFnZV9tYXNrOworCQlkaGI9ZGhiX2Jhc2UgJiB+KHRpLT5wYWdlX21hc2sgPDwgOCk7CisJfQorCWRoYnVmID0gdGktPnNyYW1fdmlydCArIGRoYjsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgdGhlIDgwMi41IGhlYWRlciAqLworCWlmICghKHRyaGRyLT5zYWRkclswXSAmIDB4ODApKQkvKiBSSUYgcHJlc2VudD8gKi8KKwkJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdHJoX2hkcikgLSBUUl9NQVhSSUZMRU47CisJZWxzZQorCQloZHJfbGVuID0gKChudG9ocyh0cmhkci0+cmNmKSAmIFRSX1JDRl9MRU5fTUFTSykgPj4gOCkKKwkJICAgICsgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSAtIFRSX01BWFJJRkxFTjsKKworCWxsYyA9IChzdHJ1Y3QgdHJsbGMgKikgKHRpLT5jdXJyZW50X3NrYi0+ZGF0YSArIGhkcl9sZW4pOworCisJbGxjX3NzYXAgPSBsbGMtPnNzYXA7CisJU0VUX1BBR0UodGktPnNyYl9wYWdlKTsKKwltZW1jcHlfZnJvbWlvKCZ4c3JiLCB0aS0+c3JiLCBzaXplb2YoeHNyYikpOworCVNFVF9QQUdFKHRpLT5hc2JfcGFnZSk7CisJeG1pdF9jb21tYW5kID0geHNyYi5jb21tYW5kOworCisJd3JpdGViKHhtaXRfY29tbWFuZCwgdGktPmFzYiArIENPTU1BTkRfT0ZTVCk7CisJd3JpdGV3KHhzcmIuc3RhdGlvbl9pZCwgdGktPmFzYiArIFNUQVRJT05fSURfT0ZTVCk7CisJd3JpdGViKGxsY19zc2FwLCB0aS0+YXNiICsgUlNBUF9WQUxVRV9PRlNUKTsKKwl3cml0ZWIoeHNyYi5jbWRfY29yciwgdGktPmFzYiArIENNRF9DT1JSRUxBVEVfT0ZTVCk7CisJd3JpdGViKDAsIHRpLT5hc2IgKyBSRVRDT0RFX09GU1QpOworCWlmICgoeG1pdF9jb21tYW5kID09IFhNSVRfWElEX0NNRCkgfHwgKHhtaXRfY29tbWFuZCA9PSBYTUlUX1RFU1RfQ01EKSkgeworCQl3cml0ZXcoaHRvbnMoMHgxMSksIHRpLT5hc2IgKyBGUkFNRV9MRU5HVEhfT0ZTVCk7CisJCXdyaXRlYigweDBlLCB0aS0+YXNiICsgSEVBREVSX0xFTkdUSF9PRlNUKTsKKwkJU0VUX1BBR0UoZGhiX3BhZ2UpOworCQl3cml0ZWIoQUMsIGRoYnVmKTsKKwkJd3JpdGViKExMQ19GUkFNRSwgZGhidWYgKyAxKTsKKwkJZm9yIChpID0gMDsgaSA8IFRSX0FMRU47IGkrKykKKwkJCXdyaXRlYigoaW50KSAweDBGRiwgZGhidWYgKyBpICsgMik7CisJCWZvciAoaSA9IDA7IGkgPCBUUl9BTEVOOyBpKyspCisJCQl3cml0ZWIoMCwgZGhidWYgKyBpICsgVFJfQUxFTiArIDIpOworCQl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiAgICB0aGUgdG9rZW4gcmluZyBwYWNrZXQgaXMgY29waWVkIGZyb20gc2tfYnVmZiB0byB0aGUgYWRhcHRlcgorCSAqICAgIGJ1ZmZlciBpZGVudGlmaWVkIGluIHRoZSBjb21tYW5kIGRhdGEgcmVjZWl2ZWQgd2l0aCB0aGUgaW50ZXJydXB0LgorCSAqLworCXdyaXRlYihoZHJfbGVuLCB0aS0+YXNiICsgSEVBREVSX0xFTkdUSF9PRlNUKTsKKwl3cml0ZXcoaHRvbnModGktPmN1cnJlbnRfc2tiLT5sZW4pLCB0aS0+YXNiICsgRlJBTUVfTEVOR1RIX09GU1QpOworCXNyY19sZW49dGktPmN1cnJlbnRfc2tiLT5sZW47CisJc3JjX29mZnNldD0wOworCWRoYj1kaGJfYmFzZTsKKwl3aGlsZSgxKSB7CisJCWlmICh0aS0+cGFnZV9tYXNrKSB7CisJCQlkaGJfcGFnZT0oZGhiID4+IDgpICYgdGktPnBhZ2VfbWFzazsKKwkJCWRoYj1kaGIgJiB+KHRpLT5wYWdlX21hc2sgPDwgOCk7CisJCQlkaGJfbGVuPTB4NDAwMC1kaGI7IC8qIHJlbWFpbmluZyBzaXplIG9mIHRoaXMgcGFnZSAqLworCQl9CisJCWRoYnVmID0gdGktPnNyYW1fdmlydCArIGRoYjsKKwkJU0VUX1BBR0UoZGhiX3BhZ2UpOworCQlpZiAoc3JjX2xlbiA+IGRoYl9sZW4pIHsKKwkJCW1lbWNweV90b2lvKGRoYnVmLCZ0aS0+Y3VycmVudF9za2ItPmRhdGFbc3JjX29mZnNldF0sCisJCQkJCWRoYl9sZW4pOworCQkJc3JjX2xlbiAtPSBkaGJfbGVuOworCQkJc3JjX29mZnNldCArPSBkaGJfbGVuOworCQkJZGhiX2Jhc2UrPWRoYl9sZW47CisJCQlkaGI9ZGhiX2Jhc2U7CisJCQljb250aW51ZTsKKwkJfQorCQltZW1jcHlfdG9pbyhkaGJ1ZiwgJnRpLT5jdXJyZW50X3NrYi0+ZGF0YVtzcmNfb2Zmc2V0XSwgc3JjX2xlbik7CisJCWJyZWFrOworCX0KKwl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJdGktPnRyX3N0YXRzLnR4X2J5dGVzICs9IHRpLT5jdXJyZW50X3NrYi0+bGVuOworCWRldl9rZnJlZV9za2JfaXJxKHRpLT5jdXJyZW50X3NrYik7CisJdGktPmN1cnJlbnRfc2tiID0gTlVMTDsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJaWYgKHRpLT5yZWFkbG9nX3BlbmRpbmcpCisJCWlibXRyX3JlYWRsb2coZGV2KTsKK30JCQkJLyp0cl90eCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBSRUNFSVZFX0JVRkZFUl9PRlNUICAgICA2CisjZGVmaW5lIExBTl9IRFJfTEVOR1RIX09GU1QgICAgIDgKKyNkZWZpbmUgRExDX0hEUl9MRU5HVEhfT0ZTVCAgICAgOQorCisjZGVmaW5lIERTQVBfT0ZTVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1NBUF9PRlNUICAgICAgICAgICAgICAgMQorI2RlZmluZSBMTENfT0ZTVCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBST1RJRF9PRlNUICAgICAgICAgICAgIDMKKyNkZWZpbmUgRVRIRVJUWVBFX09GU1QgICAgICAgICAgNgorCitzdGF0aWMgdm9pZCB0cl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlfX3UzMiByYnVmZmVyOworCXZvaWQgX19pb21lbSAqcmJ1ZiwgKnJidWZkYXRhLCAqbGxjOworCV9fdTggcmJ1ZmZlcl9wYWdlID0gMDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGludCByYnVmZmVyX2xlbiwgbGFuX2hkcl9sZW4sIGhkcl9sZW4sIGlwX2xlbiwgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgZGxjX2hkcl9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgc2tiX3NpemUgPSAwOworCWludCBJUHY0X3AgPSAwOworCXVuc2lnbmVkIGludCBjaGtzdW0gPSAwOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBhcmJfcmVjX3JlcSByYXJiOworCisJU0VUX1BBR0UodGktPmFyYl9wYWdlKTsKKwltZW1jcHlfZnJvbWlvKCZyYXJiLCB0aS0+YXJiLCBzaXplb2YocmFyYikpOworCXJidWZmZXIgPSBudG9ocyhyYXJiLnJlY19idWZfYWRkcikgOworCXJidWYgPSBtYXBfYWRkcmVzcyh0aSwgcmJ1ZmZlciwgJnJidWZmZXJfcGFnZSk7CisKKwlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworCisJaWYgKHJlYWRiKHRpLT5hc2IgKyBSRVRDT0RFX09GU1QpICE9MHhGRikgRFBSSU5USygiQVNCIG5vdCBmcmVlICEhIVxuIik7CisKKwl3cml0ZWIoUkVDX0RBVEEsIHRpLT5hc2IgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyhyYXJiLnN0YXRpb25faWQsIHRpLT5hc2IgKyBTVEFUSU9OX0lEX09GU1QpOworCXdyaXRldyhyYXJiLnJlY19idWZfYWRkciwgdGktPmFzYiArIFJFQ0VJVkVfQlVGRkVSX09GU1QpOworCisJbGFuX2hkcl9sZW4gPSByYXJiLmxhbl9oZHJfbGVuOworCWlmIChsYW5faGRyX2xlbiA+IHNpemVvZihzdHJ1Y3QgdHJoX2hkcikpIHsKKwkJRFBSSU5USygiTGludXggY2Fubm90IGhhbmRsZSBncmVhdGVyIHRoYW4gMTggYnl0ZXMgUklGXG4iKTsKKwkJcmV0dXJuOworCX0JCQkvKkJNUyBJIGFkZGVkIHRoaXMgYWJvdmUganVzdCB0byBiZSB2ZXJ5IHNhZmUgKi8KKwlkbGNfaGRyX2xlbiA9IHJlYWRiKHRpLT5hcmIgKyBETENfSERSX0xFTkdUSF9PRlNUKTsKKwloZHJfbGVuID0gbGFuX2hkcl9sZW4gKyBzaXplb2Yoc3RydWN0IHRybGxjKSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCisJU0VUX1BBR0UocmJ1ZmZlcl9wYWdlKTsKKwlsbGMgPSByYnVmICsgb2Zmc2V0b2Yoc3RydWN0IHJlY19idWYsIGRhdGEpICsgbGFuX2hkcl9sZW47CisKKyNpZiBUUl9WRVJCT1NFCisJRFBSSU5USygib2Zmc2V0b2YgZGF0YTogJTAyWCBsYW5faGRyX2xlbjogJTAyWFxuIiwKKwkoX191MzIpIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKSwgKHVuc2lnbmVkIGludCkgbGFuX2hkcl9sZW4pOworCURQUklOVEsoImxsYzogJTA4WCByZWNfYnVmX2FkZHI6ICUwNFggZGV2LT5tZW1fc3RhcnQ6ICVsWFxuIiwKKwkJbGxjLCBudG9ocyhyYXJiLnJlY19idWZfYWRkciksIGRldi0+bWVtX3N0YXJ0KTsKKwlEUFJJTlRLKCJkc2FwOiAlMDJYLCBzc2FwOiAlMDJYLCBsbGM6ICUwMlgsIHByb3RpZDogJTAyWCUwMlglMDJYLCAiCisJCSJldGhlcnR5cGU6ICUwNFhcbiIsCisJCShpbnQpIHJlYWRiKGxsYyArIERTQVBfT0ZTVCksIChpbnQpIHJlYWRiKGxsYyArIFNTQVBfT0ZTVCksCisJCShpbnQpIHJlYWRiKGxsYyArIExMQ19PRlNUKSwgKGludCkgcmVhZGIobGxjICsgUFJPVElEX09GU1QpLAorCQkoaW50KSByZWFkYihsbGMrUFJPVElEX09GU1QrMSksKGludClyZWFkYihsbGMrUFJPVElEX09GU1QgKyAyKSwKKwkJKGludCkgbnRvaHMocmVhZHcobGxjICsgRVRIRVJUWVBFX09GU1QpKSk7CisjZW5kaWYKKwlpZiAocmVhZGIobGxjICsgb2Zmc2V0b2Yoc3RydWN0IHRybGxjLCBsbGMpKSAhPSBVSV9DTUQpIHsKKwkJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKwkJd3JpdGViKERBVEFfTE9TVCwgdGktPmFzYiArIFJFVENPREVfT0ZTVCk7CisJCXRpLT50cl9zdGF0cy5yeF9kcm9wcGVkKys7CisJCXdyaXRlYihSRVNQX0lOX0FTQiwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggPSBudG9ocyhyYXJiLmZyYW1lX2xlbik7CisJaWYgKHJlYWRiKGxsYyArIERTQVBfT0ZTVCkgPT0gRVhURU5ERURfU0FQICYmCisJICAgcmVhZGIobGxjICsgU1NBUF9PRlNUKSA9PSBFWFRFTkRFRF9TQVAgJiYKKwkJbGVuZ3RoID49IGhkcl9sZW4pCUlQdjRfcCA9IDE7CisjaWYgVFJfVkVSQk9TRQorI2RlZmluZSBTQUREUl9PRlNUCTgKKyNkZWZpbmUgREFERFJfT0ZTVAkyCisKKwlpZiAoIUlQdjRfcCkgeworCisJCXZvaWQgX19pb21lbSAqdHJoaGRyID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKTsKKworCQlEUFJJTlRLKCJQcm9iYWJseSBub24tSVAgZnJhbWUgcmVjZWl2ZWQuXG4iKTsKKwkJRFBSSU5USygic3NhcDogJTAyWCBkc2FwOiAlMDJYICIKKwkJCSJzYWRkcjogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggIgorCQkJImRhZGRyOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJCXJlYWRiKGxsYyArIFNTQVBfT0ZTVCksIHJlYWRiKGxsYyArIERTQVBfT0ZTVCksCisJCQlyZWFkYih0cmhoZHIrU0FERFJfT0ZTVCksIHJlYWRiKHRyaGhkcisgU0FERFJfT0ZTVCsxKSwKKwkJCXJlYWRiKHRyaGhkcitTQUREUl9PRlNUKzIpLCByZWFkYih0cmhoZHIrU0FERFJfT0ZTVCszKSwKKwkJCXJlYWRiKHRyaGhkcitTQUREUl9PRlNUKzQpLCByZWFkYih0cmhoZHIrU0FERFJfT0ZTVCs1KSwKKwkJCXJlYWRiKHRyaGhkcitEQUREUl9PRlNUKSwgcmVhZGIodHJoaGRyK0RBRERSX09GU1QgKyAxKSwKKwkJCXJlYWRiKHRyaGhkcitEQUREUl9PRlNUKzIpLCByZWFkYih0cmhoZHIrREFERFJfT0ZTVCszKSwKKwkJCXJlYWRiKHRyaGhkcitEQUREUl9PRlNUKzQpLCByZWFkYih0cmhoZHIrREFERFJfT0ZTVCs1KSk7CisJfQorI2VuZGlmCisKKwkvKkJNUyBoYW5kbGUgdGhlIGNhc2Ugc2hlIGNvbWVzIGluIHdpdGggZmV3IGhvcHMgYnV0IGxlYXZlcyB3aXRoIG1hbnkgKi8KKyAgICAgICAgc2tiX3NpemU9bGVuZ3RoLWxhbl9oZHJfbGVuK3NpemVvZihzdHJ1Y3QgdHJoX2hkcikrc2l6ZW9mKHN0cnVjdCB0cmxsYyk7CisKKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYl9zaXplKSkpIHsKKwkJRFBSSU5USygib3V0IG9mIG1lbW9yeS4gZnJhbWUgZHJvcHBlZC5cbiIpOworCQl0aS0+dHJfc3RhdHMucnhfZHJvcHBlZCsrOworCQlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworCQl3cml0ZWIoREFUQV9MT1NULCB0aS0+YXNiICsgb2Zmc2V0b2Yoc3RydWN0IGFzYl9yZWMsIHJldF9jb2RlKSk7CisJCXdyaXRlYihSRVNQX0lOX0FTQiwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKwkJcmV0dXJuOworCX0KKwkvKkJNUyBhZ2FpbiwgaWYgc2hlIGNvbWVzIGluIHdpdGggZmV3IGJ1dCBsZWF2ZXMgd2l0aCBtYW55ICovCisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IHRyaF9oZHIpIC0gbGFuX2hkcl9sZW4pOworCXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCXNrYi0+ZGV2ID0gZGV2OworCWRhdGEgPSBza2ItPmRhdGE7CisJcmJ1ZmZlcl9sZW4gPSBudG9ocyhyZWFkdyhyYnVmICsgb2Zmc2V0b2Yoc3RydWN0IHJlY19idWYsIGJ1Zl9sZW4pKSk7CisJcmJ1ZmRhdGEgPSByYnVmICsgb2Zmc2V0b2Yoc3RydWN0IHJlY19idWYsIGRhdGEpOworCisJaWYgKElQdjRfcCkgeworCQkvKiBDb3B5IHRoZSBoZWFkZXJzIHdpdGhvdXQgY2hlY2tzdW1taW5nICovCisJCW1lbWNweV9mcm9taW8oZGF0YSwgcmJ1ZmRhdGEsIGhkcl9sZW4pOworCisJCS8qIFdhdGNoIGZvciBwYWRkZWQgcGFja2V0cyBhbmQgYm9nb25zICovCisJCWlwaD0gKHN0cnVjdCBpcGhkciAqKShkYXRhKyBsYW5faGRyX2xlbiArIHNpemVvZihzdHJ1Y3QgdHJsbGMpKTsKKwkJaXBfbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQlsZW5ndGggLT0gaGRyX2xlbjsKKwkJaWYgKChpcF9sZW4gPD0gbGVuZ3RoKSAmJiAoaXBfbGVuID4gNykpCisJCQlsZW5ndGggPSBpcF9sZW47CisJCWRhdGEgKz0gaGRyX2xlbjsKKwkJcmJ1ZmZlcl9sZW4gLT0gaGRyX2xlbjsKKwkJcmJ1ZmRhdGEgKz0gaGRyX2xlbjsKKwl9CisJLyogQ29weSB0aGUgcGF5bG9hZC4uLiAqLworI2RlZmluZSBCVUZGRVJfUE9JTlRFUl9PRlNUCTIKKyNkZWZpbmUgQlVGRkVSX0xFTkdUSF9PRlNUICAgICAgNgorCWZvciAoOzspIHsKKwkJaWYgKGlibXRyX2RlYnVnX3RyYWNlJlRSQ19JTklUViAmJiBsZW5ndGggPCByYnVmZmVyX2xlbikKKwkJCURQUklOVEsoIkNVUklPVVMsIGxlbmd0aD0lZCA8IHJidWZmZXJfbGVuPSVkXG4iLAorCQkJCQkJbGVuZ3RoLHJidWZmZXJfbGVuKTsKKwkJaWYgKElQdjRfcCkKKwkJCWNoa3N1bT1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKCh2b2lkKilyYnVmZGF0YSwKKwkJCSAgICBkYXRhLGxlbmd0aDxyYnVmZmVyX2xlbj9sZW5ndGg6cmJ1ZmZlcl9sZW4sY2hrc3VtKTsKKwkJZWxzZQorCQkJbWVtY3B5X2Zyb21pbyhkYXRhLCByYnVmZGF0YSwgcmJ1ZmZlcl9sZW4pOworCQlyYnVmZmVyID0gbnRvaHMocmVhZHcocmJ1ZitCVUZGRVJfUE9JTlRFUl9PRlNUKSkgOworCQlpZiAoIXJidWZmZXIpCisJCQlicmVhazsKKwkJcmJ1ZmZlciAtPSAyOworCQlsZW5ndGggLT0gcmJ1ZmZlcl9sZW47CisJCWRhdGEgKz0gcmJ1ZmZlcl9sZW47CisJCXJidWYgPSBtYXBfYWRkcmVzcyh0aSwgcmJ1ZmZlciwgJnJidWZmZXJfcGFnZSk7CisJCVNFVF9QQUdFKHJidWZmZXJfcGFnZSk7CisJCXJidWZmZXJfbGVuID0gbnRvaHMocmVhZHcocmJ1ZiArIEJVRkZFUl9MRU5HVEhfT0ZTVCkpOworCQlyYnVmZGF0YSA9IHJidWYgKyBvZmZzZXRvZihzdHJ1Y3QgcmVjX2J1ZiwgZGF0YSk7CisJfQorCisJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKwl3cml0ZWIoMCwgdGktPmFzYiArIG9mZnNldG9mKHN0cnVjdCBhc2JfcmVjLCByZXRfY29kZSkpOworCisJd3JpdGViKFJFU1BfSU5fQVNCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCisJdGktPnRyX3N0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXRpLT50cl9zdGF0cy5yeF9wYWNrZXRzKys7CisKKwlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CisJaWYgKElQdjRfcCkgeworCQlza2ItPmNzdW0gPSBjaGtzdW07CisJCXNrYi0+aXBfc3VtbWVkID0gMTsKKwl9CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQkJCQkvKnRyX3J4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdG1yLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXRtci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBUUl9SRVRSWV9JTlRFUlZBTDsKKwl0bXItPmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXRtci0+ZnVuY3Rpb24gPSB0b2tfcmVydW47CisJaW5pdF90aW1lcih0bXIpOworCWFkZF90aW1lcih0bXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgdG9rX3JlcnVuKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpeworCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9hZGRyOworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCWlmICggdGktPm9wZW5fYWN0aW9uID09IFJFU1RBUlQpeworCQl0aS0+ZG9fdG9rX2ludCA9IEZJUlNUX0lOVDsKKwkJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIEFEQVBUUkVTRVRSRUwpOworI2lmZGVmIEVOQUJMRV9QQUdJTkcKKwkJaWYgKHRpLT5wYWdlX21hc2spCisJCQl3cml0ZWIoU1JQUl9FTkFCTEVfUEFHSU5HLAorCQkJCXRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKworCQl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJfSBlbHNlCisJCXRva19vcGVuX2FkYXB0ZXIoZGV2X2FkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisKKwl0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCisJdGktPnJlYWRsb2dfcGVuZGluZyA9IDA7CisJU0VUX1BBR0UodGktPnNyYl9wYWdlKTsKKwl3cml0ZWIoRElSX1JFQURfTE9HLCB0aS0+c3JiKTsKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0b2tfZ2V0X3N0YXRzKCk6ICBCYXNpY2FsbHkgYSBzY2FmZm9sZCByb3V0aW5lIHdoaWNoIHdpbGwgcmV0dXJuCisgICB0aGUgYWRkcmVzcyBvZiB0aGUgdHJfc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoCisgICB0aGlzIGRldmljZSAtLSB0aGUgdHIuLi4uIHN0cnVjdHVyZSBpcyBhbiBldGhuZXQgbG9vay1hbGlrZQorICAgc28gYXQgbGVhc3QgZm9yIHRoaXMgaXRlcmF0aW9uIG1heSBzdWZmaWNlLiAgICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdG9rX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHRva19pbmZvICp0b2tpOworCXRva2kgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopICZ0b2tpLT50cl9zdGF0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaWJtdHJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCWlmICh0aS0+cmluZ19zcGVlZCA9PSAxNiAmJiBtdHUgPiB0aS0+bWF4bXR1MTYpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0aS0+cmluZ19zcGVlZCA9PSA0ICYmIG10dSA+IHRpLT5tYXhtdHU0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG10dTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIE1PRFVMRQorCisvKiAzQ09NIDNDNjE5QyBzdXBwb3J0cyA4IGludGVycnVwdHMsIDMyIEkvTyBwb3J0cyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfaWJtdHJbSUJNVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgaW9bSUJNVFJfTUFYX0FEQVBURVJTXSA9IHsgMHhhMjAsIDB4YTI0IH07CitzdGF0aWMgaW50IGlycVtJQk1UUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBtZW1bSUJNVFJfTUFYX0FEQVBURVJTXTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaWJtdHJfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCBjb3VudD0wOworCisJZmluZF90dXJib19hZGFwdGVycyhpbyk7CisKKwlmb3IgKGkgPSAwOyBpb1tpXSAmJiAoaSA8IElCTVRSX01BWF9BREFQVEVSUyk7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlpcnFbaV0gPSAwOworCQltZW1baV0gPSAwOworCQlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IHRva19pbmZvKSk7CisJCWlmIChkZXYgPT0gTlVMTCkgeyAKKwkJCWlmIChpID09IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1baV07CisKKwkJaWYgKGlibXRyX3Byb2JlX2NhcmQoZGV2KSkgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldl9pYm10cltpXSA9IGRldjsKKwkJY291bnQrKzsKKwl9CisJaWYgKGNvdW50KSByZXR1cm4gMDsKKwlwcmludGsoImlibXRyOiByZWdpc3Rlcl9uZXRkZXYoKSByZXR1cm5lZCBub24temVyby5cbiIpOworCXJldHVybiAtRUlPOworfQorbW9kdWxlX2luaXQoaWJtdHJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpYm10cl9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUJNVFJfTUFYX0FEQVBURVJTOyBpKyspeworCQlpZiAoIWRldl9pYm10cltpXSkKKwkJCWNvbnRpbnVlOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXZfaWJtdHJbaV0pOworCQlpYm10cl9jbGVhbnVwX2NhcmQoZGV2X2libXRyW2ldKTsKKwkJZnJlZV9uZXRkZXYoZGV2X2libXRyW2ldKTsKKwl9Cit9Cittb2R1bGVfZXhpdChpYm10cl9jbGVhbnVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWUwYjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKQEAgLTAsMCArMSwyMDExIEBACisvKgorICogICBsYW5zdHJlYW1lci5jIC0tIGRyaXZlciBmb3IgdGhlIElCTSBBdXRvIExBTlN0cmVhbWVyIFBDSSBBZGFwdGVyCisgKgorICogIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisgKgorICogIExpbnV4IGRyaXZlciBmb3IgSUJNIFBDSSB0b2tlbnJpbmcgY2FyZHMgYmFzZWQgb24gdGhlIExhblN0cmVhbWVyIE1QQworICogIGNoaXBzZXQuIAorICoKKyAqICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgb2x5bXBpYyBkcml2ZXIgZm9yIElCTSBQQ0kgVG9rZW5SaW5nIGNhcmRzIChQaXQvUGl0LVBoeS9PbHltcGljCisgKiAgY2hpcHNldHMpIHdyaXR0ZW4gIGJ5OgorICogICAgICAxOTk5IFBldGVyIERlIFNjaHJpanZlciBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgkxOTk5IE1pa2UgUGhpbGxpcHMgKHBoaWxsaW1AYW10cmFrLmNvbSkKKyAqCisgKiAgQmFzZSBEcml2ZXIgU2tlbGV0b246CisgKiAgICAgIFdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogICAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgIAorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBOTyBXQVJSQU5UWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SICAgICAgICAKKyAqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUICAgICAgCisgKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyAgICAKKyAqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgICAgICAgCisgKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgICAgICAgIAorICogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvICAgICAKKyAqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsICAgICAgICAgCisgKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgIAorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICAgICAgICAKKyAqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EICAgCisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgIAorICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSAgICAKKyAqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCAgCisgKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgIAorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAKKyAqICAxMi8xMC85OSAtIEFscGhhIFJlbGVhc2UgMC4xLjAKKyAqICAgICAgICAgICAgRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisgKiAgMDMvMDMvMDAgLSBNZXJnZWQgdG8ga2VybmVsLCBpbmRlbnRlZCAta3IgLWk4IC1icmkwLCBmaXhlZCBzb21lIG1pc3NpbmcKKyAqCQltYWxsb2MgZnJlZSBjaGVja3MsIHJldmlld2VkIGNvZGUuIDxhbGFuQHJlZGhhdC5jb20+CisgKiAgMDMvMTMvMDAgLSBBZGRlZCBzcGlubG9ja3MgZm9yIHNtcAorICogIDAzLzA4LzAxIC0gQWRkZWQgc3VwcG9ydCBmb3IgbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQorICogIDA4LzE1LzAxIC0gQWRkZWQgaW9jdGwoKSBmdW5jdGlvbmFsaXR5IGZvciBkZWJ1Z2dpbmcsIGNoYW5nZWQgbmV0aWZfKl9xdWV1ZQorICogICAgICAgICAgICAgY2FsbHMgYW5kIG90aGVyIGluY29ycmVjdG5lc3MgLSBLZW50IFlvZGVyIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqICAxMS8wNS8wMSAtIFJlc3RydWN0dXJlZCB0aGUgaW50ZXJydXB0IGZ1bmN0aW9uLCBhZGRlZCBkZWxheXMsIHJlZHVjZWQgdGhlIAorICogICAgICAgICAgICAgdGhlIG51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyB0byAxLCB3aGljaCB0b2dldGhlciBjYW4gcHJldmVudCAKKyAqICAgICAgICAgICAgIHRoZSBjYXJkIGZyb20gbG9ja2luZyB1cCB0aGUgYm94IC0gPHlvZGVyMUB1cy5pYm0uY29tPgorICogIDA5LzI3LzAyIC0gTmV3IFBDSSBpbnRlcmZhY2UgKyBidWcgZml4LiAtIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqICAxMS8xMy8wMiAtIFJlbW92ZWQgZnJlZV9pcnEgY2FsbHMgd2hpY2ggY291bGQgY2F1c2UgYSBoYW5nLCBhZGRlZAorICoJICAgICAgIG5ldGlmX2NhcnJpZXJfe29ufG9mZn0gLSA8eW9kZXIxQHVzLmlibS5jb20+CisgKiAgCisgKiAgVG8gRG86CisgKgorICoKKyAqICBJZiBQcm9ibGVtcyBkbyBPY2N1cgorICogIE1vc3QgcHJvYmxlbXMgY2FuIGJlIHJlY3RpZmllZCBieSBlaXRoZXIgY2xvc2luZyBhbmQgb3BlbmluZyB0aGUgaW50ZXJmYWNlCisgKiAgKGlmY29uZmlnIGRvd24gYW5kIHVwKSBvciBybW1vZCBhbmQgaW5zbW9kJ2luZyB0aGUgZHJpdmVyIChhIGJpdCBkaWZmaWN1bHQKKyAqICBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwpLgorICovCisKKy8qIENoYW5nZSBTVFJFQU1FUl9ERUJVRyB0byAxIHRvIGdldCB2ZXJib3NlLCBhbmQgSSBtZWFuIHJlYWxseSB2ZXJib3NlLCBtZXNzYWdlcyAqLworCisjZGVmaW5lIFNUUkVBTUVSX0RFQlVHIDAKKyNkZWZpbmUgU1RSRUFNRVJfREVCVUdfUEFDS0VUUyAwCisKKy8qIENoYW5nZSBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IgdG8gcmVjZWl2ZSBtYWMgZnJhbWVzIHRocm91Z2ggdGhlIGFyYiBjaGFubmVsLgorICogV2lsbCBhbHNvIGNyZWF0ZSBhIC9wcm9jL25ldC9zdHJlYW1lcl90ciBlbnRyeSBpZiBwcm9jX2ZzIGlzIGNvbXBpbGVkIGludG8gdGhlCisgKiBrZXJuZWwuCisgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSBhIHJpbmctZXJyb3IgcmVwb3J0aW5nIG5ldHdvcmsgbW9kdWxlIAorICogaS5lLiBpdCB3aWxsIGdpdmUgeW91IHRoZSBzb3VyY2UgYWRkcmVzcyBvZiBiZWFjb25lcnMgb24gdGhlIHJpbmcgCisgKi8KKworI2RlZmluZSBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IgMAorCisvKiAjZGVmaW5lIENPTkZJR19QUk9DX0ZTICovCisKKy8qCisgKiAgQWxsb3cgb3IgZGlzYWxsb3cgaW9jdGwncyBmb3IgZGVidWdnaW5nCisgKi8KKworI2RlZmluZSBTVFJFQU1FUl9JT0NUTCAwCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAibGFuc3RyZWFtZXIuaCIKKworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorI2Vycm9yIGJyb2tlbiBvbiA2NC1iaXQ6IHN0b3JlcyBwb2ludGVyIHRvIHJ4X3JpbmctPmJ1ZmZlciBpbiAzMi1iaXQgaW50CisjZW5kaWYKKworCisvKiBJJ3ZlIGdvdCB0byBwdXQgc29tZSBpbnRlbGxpZ2VuY2UgaW50byB0aGUgdmVyc2lvbiBudW1iZXIgc28gdGhhdCBQZXRlciBhbmQgSSBrbm93CisgKiB3aGljaCB2ZXJzaW9uIG9mIHRoZSBjb2RlIHNvbWVib2R5IGhhcyBnb3QuIAorICogVmVyc2lvbiBOdW1iZXIgPSBhLmIuYy5kICB3aGVyZSBhLmIuYyBpcyB0aGUgbGV2ZWwgb2YgY29kZSBhbmQgZCBpcyB0aGUgbGF0ZXN0IGF1dGhvci4KKyAqIFNvIDAuMC4xLnBkcyA9IFBldGVyLCAwLjAuMS5tbHAgPSBNaWtlCisgKiAKKyAqIE9mZmljaWFsIHJlbGVhc2VzIHdpbGwgb25seSBoYXZlIGFuIGEuYi5jIHZlcnNpb24gbnVtYmVyIGZvcm1hdC4KKyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPSAiTGFuU3RyZWFtZXIuYyB2MC40LjAgMDMvMDgvMDEgLSBNaWtlIFN1bGxpdmFuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICB2MC41LjMgMTEvMTMvMDIgLSBLZW50IFlvZGVyIjsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN0cmVhbWVyX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9UUiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXt9CS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksc3RyZWFtZXJfcGNpX3RibCk7CisKKworc3RhdGljIGNoYXIgKm9wZW5fbWFqX2Vycm9yW10gPSB7CisJIk5vIGVycm9yIiwgIkxvYmUgTWVkaWEgVGVzdCIsICJQaHlzaWNhbCBJbnNlcnRpb24iLAorCSJBZGRyZXNzIFZlcmlmaWNhdGlvbiIsICJOZWlnaGJvciBOb3RpZmljYXRpb24gKFJpbmcgUG9sbCkiLAorCSJSZXF1ZXN0IFBhcmFtZXRlcnMiLCAiRkRYIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0IiwKKwkiRkRYIExvYmUgTWVkaWEgVGVzdCIsICJGRFggRHVwbGljYXRlIEFkZHJlc3MgQ2hlY2siLAorCSJVbmtub3duIHN0YWdlIgorfTsKKworc3RhdGljIGNoYXIgKm9wZW5fbWluX2Vycm9yW10gPSB7CisJIk5vIGVycm9yIiwgIkZ1bmN0aW9uIEZhaWx1cmUiLCAiU2lnbmFsIExvc3QiLCAiV2lyZSBGYXVsdCIsCisJIlJpbmcgU3BlZWQgTWlzbWF0Y2giLCAiVGltZW91dCIsICJSaW5nIEZhaWx1cmUiLCAiUmluZyBCZWFjb25pbmciLAorCSJEdXBsaWNhdGUgTm9kZSBBZGRyZXNzIiwgIlJlcXVlc3QgUGFyYW1ldGVycyIsICJSZW1vdmUgUmVjZWl2ZWQiLAorCSJSZXNlcnZlZCIsICJSZXNlcnZlZCIsICJObyBNb25pdG9yIERldGVjdGVkIGZvciBSUEwiLAorCSJNb25pdG9yIENvbnRlbnRpb24gZmFpbGVyIGZvciBSUEwiLCAiRkRYIFByb3RvY29sIEVycm9yIgorfTsKKworLyogTW9kdWxlIHBhcmFtdGVycyAqLworCisvKiBSaW5nIFNwZWVkIDAsNCwxNgorICogMCA9IEF1dG9zZW5zZSAgICAgICAgIAorICogNCwxNiA9IFNlbGVjdGVkIHNwZWVkIG9ubHksIG5vIGF1dG9zZW5zZQorICogVGhpcyBhbGxvd3MgdGhlIGNhcmQgdG8gYmUgdGhlIGZpcnN0IG9uIHRoZSByaW5nCisgKiBhbmQgYmVjb21lIHRoZSBhY3RpdmUgbW9uaXRvci4KKyAqCisgKiBXQVJOSU5HOiBTb21lIGh1YnMgd2lsbCBhbGxvdyB5b3UgdG8gaW5zZXJ0CisgKiBhdCB0aGUgd3Jvbmcgc3BlZWQKKyAqLworCitzdGF0aWMgaW50IHJpbmdzcGVlZFtTVFJFQU1FUl9NQVhfQURBUFRFUlNdID0geyAwLCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkocmluZ3NwZWVkLCBpbnQsIE5VTEwsIDApOworCisvKiBQYWNrZXQgYnVmZmVyIHNpemUgKi8KKworc3RhdGljIGludCBwa3RfYnVmX3N6W1NUUkVBTUVSX01BWF9BREFQVEVSU10gPSB7IDAsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShwa3RfYnVmX3N6LCBpbnQsIE5VTEwsIDApOworCisvKiBNZXNzYWdlIExldmVsICovCisKK3N0YXRpYyBpbnQgbWVzc2FnZV9sZXZlbFtTVFJFQU1FUl9NQVhfQURBUFRFUlNdID0geyAxLCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkobWVzc2FnZV9sZXZlbCwgaW50LCBOVUxMLCAwKTsKKworI2lmIFNUUkVBTUVSX0lPQ1RMCitzdGF0aWMgaW50IHN0cmVhbWVyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3RyZWFtZXJfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RyZWFtZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0cmVhbWVyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RyZWFtZXJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIHZvaWQgc3RyZWFtZXJfYXJiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RyZWFtZXJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3NyYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX2FzYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBzdHJlYW1lcl9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICAgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgc3ByaW50Zl9pbmZvKGNoYXIgKmJ1ZmZlciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqZGV2X3N0cmVhbWVyPU5VTEw7CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdHJlYW1lcl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2OworCXVuc2lnbmVkIGxvbmcgcGlvX3N0YXJ0LCBwaW9fZW5kLCBwaW9fZmxhZ3MsIHBpb19sZW47CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2VuZCwgbW1pb19mbGFncywgbW1pb19sZW47CisJaW50IHJjID0gMDsKKwlzdGF0aWMgaW50IGNhcmRfbm89LTE7CisJdTE2IHBjcjsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJsYW5zdHJlYW1lcjo6c3RyZWFtZXJfaW5pdF9vbmUsIGVudHJ5IHBkZXYgJXBcbiIscGRldik7CisjZW5kaWYKKworCWNhcmRfbm8rKzsKKwlkZXYgPSBhbGxvY190cmRldihzaXplb2YoKnN0cmVhbWVyX3ByaXYpKTsKKwlpZiAoZGV2PT1OVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXN0cmVhbWVyX3ByaXYgPSBkZXYtPnByaXY7CisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmICghZGV2X3N0cmVhbWVyKQorCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJuZXQvc3RyZWFtZXJfdHIiLCAwLCAwLAorCQkJCQlzdHJlYW1lcl9wcm9jX2luZm8sIE5VTEwpOyAKKwlzdHJlYW1lcl9wcml2LT5uZXh0ID0gZGV2X3N0cmVhbWVyOworCWRldl9zdHJlYW1lciA9IHN0cmVhbWVyX3ByaXY7CisjZW5kaWYKKyNlbmRpZgorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBzdWl0YWJsZSBQQ0kgbWFwcGluZyBhdmFpbGFibGUuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byBlbmFibGUgcGNpIGRldmljZVxuIik7CisJCXJjPS1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJjID0gcGNpX3NldF9td2kocGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byBlbmFibGUgTVdJIG9uIHBjaSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlwaW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJcGlvX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCk7CisJcGlvX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApOworCXBpb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCisJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwltbWlvX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMSk7CisJbW1pb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygibGFuc3RyZWFtZXI6IHBpb19zdGFydCAleCBwaW9fZW5kICV4IHBpb19sZW4gJXggcGlvX2ZsYWdzICV4XG4iLAorCQlwaW9fc3RhcnQsIHBpb19lbmQsIHBpb19sZW4sIHBpb19mbGFncyk7CisJcHJpbnRrKCJsYW5zdHJlYW1lcjogbW1pb19zdGFydCAleCBtbWlvX2VuZCAleCBtbWlvX2xlbiAleCBtbWlvX2ZsYWdzICV4XG4iLAorCQltbWlvX3N0YXJ0LCBtbWlvX2VuZCwgbW1pb19mbGFncywgbW1pb19sZW4pOworI2VuZGlmCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBpb19zdGFydCwgcGlvX2xlbiwgImxhbnN0cmVhbWVyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjogdW5hYmxlIHRvIGdldCBwY2kgaW8gYWRkciAlbHhcbiIsCisJCQlwaW9fc3RhcnQpOworCQlyYz0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1taW9fc3RhcnQsIG1taW9fbGVuLCAibGFuc3RyZWFtZXIiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiB1bmFibGUgdG8gZ2V0IHBjaSBtbWlvIGFkZHIgJWx4XG4iLAorCQkJbW1pb19zdGFydCk7CisJCXJjPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF9mcmVlX3BpbzsKKwl9CisKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvPWlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjogdW5hYmxlIHRvIHJlbWFwIE1NSU8gJWx4XG4iLAorCQkJbW1pb19zdGFydCk7CisJCXJjPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9tbWlvOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0cmVhbWVyX3ByaXYtPnNyYl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdHJlYW1lcl9wcml2LT50cmJfd2FpdCk7CisKKwlkZXYtPm9wZW4gPSAmc3RyZWFtZXJfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdHJlYW1lcl94bWl0OworCWRldi0+Y2hhbmdlX210dSA9ICZzdHJlYW1lcl9jaGFuZ2VfbXR1OworCWRldi0+c3RvcCA9ICZzdHJlYW1lcl9jbG9zZTsKKyNpZiBTVFJFQU1FUl9JT0NUTAorCWRldi0+ZG9faW9jdGwgPSAmc3RyZWFtZXJfaW9jdGw7CisjZWxzZQorCWRldi0+ZG9faW9jdGwgPSBOVUxMOworI2VuZGlmCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc3RyZWFtZXJfc2V0X3J4X21vZGU7CisJZGV2LT5nZXRfc3RhdHMgPSAmc3RyZWFtZXJfZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJnN0cmVhbWVyX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkcj1waW9fc3RhcnQ7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NhcmRfbmFtZSA9IChjaGFyICopcGRldi0+cmVzb3VyY2VbMF0ubmFtZTsKKwlzdHJlYW1lcl9wcml2LT5wY2lfZGV2ID0gcGRldjsKKworCWlmICgocGt0X2J1Zl9zeltjYXJkX25vXSA8IDEwMCkgfHwgKHBrdF9idWZfc3pbY2FyZF9ub10gPiAxODAwMCkpCisJCXN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3ogPSBQS1RfQlVGX1NaOworCWVsc2UKKwkJc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeiA9IHBrdF9idWZfc3pbY2FyZF9ub107CisKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID0gcmluZ3NwZWVkW2NhcmRfbm9dOworCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwgPSBtZXNzYWdlX2xldmVsW2NhcmRfbm9dOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jayk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCAocGRldiwgUENJX0NPTU1BTkQsICZwY3IpOworCXBjciB8PSBQQ0lfQ09NTUFORF9TRVJSOworCXBjaV93cml0ZV9jb25maWdfd29yZCAocGRldiwgUENJX0NPTU1BTkQsIHBjcik7CisKKwlwcmludGsoIiVzIFxuIiwgdmVyc2lvbik7CisJcHJpbnRrKCIlczogJXMuIEkvTyBhdCAlaHgsIE1NSU8gYXQgJXAsIHVzaW5nIGlycSAlZFxuIixkZXYtPm5hbWUsCisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NhcmRfbmFtZSwKKwkJKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIsCisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8sIAorCQlkZXYtPmlycSk7CisKKwlpZiAoc3RyZWFtZXJfcmVzZXQoZGV2KSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bm1hcDoKKwlpb3VubWFwKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8pOworZXJyX291dF9mcmVlX21taW86CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKK2Vycl9vdXRfZnJlZV9waW86CisJcmVsZWFzZV9yZWdpb24ocGlvX3N0YXJ0LCBwaW9fbGVuKTsKK2Vycl9vdXRfbXdpOgorCXBjaV9jbGVhcl9td2kocGRldik7CitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dDoKKwlmcmVlX25ldGRldihkZXYpOworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJsYW5zdHJlYW1lcjogRXhpdCBlcnJvciAleFxuIixyYyk7CisjZW5kaWYKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzdHJlYW1lcl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9cGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2OworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoImxhbnN0cmVhbWVyOjpzdHJlYW1lcl9yZW1vdmVfb25lIGVudHJ5IHBkZXYgJXBcbiIscGRldik7CisjZW5kaWYKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOjpzdHJlYW1lcl9yZW1vdmVfb25lLCBFUlJPUiBkZXYgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzdHJlYW1lcl9wcml2PWRldi0+cHJpdjsKKwlpZiAoc3RyZWFtZXJfcHJpdiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6OnN0cmVhbWVyX3JlbW92ZV9vbmUsIEVSUk9SIGRldi0+cHJpdiBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJeworCQlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKnAsICoqbmV4dDsKKworCQlmb3IgKHAgPSAmZGV2X3N0cmVhbWVyOyAqcDsgcCA9IG5leHQpIHsKKwkJCW5leHQgPSAmKCpwKS0+bmV4dDsKKwkJCWlmICgqcCA9PSBzdHJlYW1lcl9wcml2KSB7CisJCQkJKnAgPSAqbmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWRldl9zdHJlYW1lcikKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KCJuZXQvc3RyZWFtZXJfdHIiLCBOVUxMKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwxKSk7CisJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsMCkpOworCXBjaV9jbGVhcl9td2kocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW87CisJdW5zaWduZWQgbG9uZyB0OworCXVuc2lnbmVkIGludCB1YWFfYWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlfX3UxNiBtaXNyOworCisJc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpIHwgQkNUTF9TT0ZUUkVTRVQsIHN0cmVhbWVyX21taW8gKyBCQ1RMKTsKKwl0ID0gamlmZmllczsKKwkvKiBIb2xkIHNvZnQgcmVzZXQgYml0IGZvciBhIHdoaWxlICovCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwkKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpICYgfkJDVExfU09GVFJFU0VULAorCSAgICAgICBzdHJlYW1lcl9tbWlvICsgQkNUTCk7CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygiQkNUTDogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSk7CisJcHJpbnRrKCJHUFI6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgR1BSKSk7CisJcHJpbnRrKCJTSVNSTUFTSzogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spKTsKKyNlbmRpZgorCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCkgfCAoQkNUTF9SWF9GSUZPXzggfCBCQ1RMX1RYX0ZJRk9fOCksIHN0cmVhbWVyX21taW8gKyBCQ1RMICk7CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9PSAwKSB7CS8qIEF1dG9zZW5zZSAqLworCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEdQUikgfCBHUFJfQVVUT1NFTlNFLAorCQkgICAgICAgc3RyZWFtZXJfbW1pbyArIEdQUik7CisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmdzcGVlZCBhdXRvc2Vuc2UgbW9kZSBvblxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9PSAxNikgeworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcnlpbmcgdG8gb3BlbiBhdCAxNiBNYnBzIGFzIHJlcXVlc3RlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl3cml0ZXcoR1BSXzE2TUJQUywgc3RyZWFtZXJfbW1pbyArIEdQUik7CisJfSBlbHNlIGlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID09IDQpIHsKKwkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHJ5aW5nIHRvIG9wZW4gYXQgNCBNYnBzIGFzIHJlcXVlc3RlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIEdQUik7CisJfQorCisJc2tiID0gZGV2X2FsbG9jX3NrYihzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6KTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2tiIGFsbG9jYXRpb24gZm9yIGRpYWdub3N0aWNzIGZhaWxlZC4uLnByb2NlZWRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJICAgICAgICBzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyAqcnhfcmluZzsKKyAgICAgICAgICAgICAgICB1OCAqZGF0YTsKKworCQlyeF9yaW5nPShzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyAqKXNrYi0+ZGF0YTsKKwkJZGF0YT0oKHU4ICopc2tiLT5kYXRhKStzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MpOworCQlyeF9yaW5nLT5mb3J3YXJkPTA7CisJCXJ4X3JpbmctPnN0YXR1cz0wOworCQlyeF9yaW5nLT5idWZmZXI9Y3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgZGF0YSwgCisJCQkJCQkJNTEyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJcnhfcmluZy0+ZnJhbWVsZW5fYnVmbGVuPTUxMjsgCisJCXdyaXRlbChjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCByeF9yaW5nLCA1MTIsIFBDSV9ETUFfRlJPTURFVklDRSkpLAorCQkJc3RyZWFtZXJfbW1pbytSWEJEQSk7CisJfQorCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkdQUiA9ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgR1BSKSk7CisjZW5kaWYKKwkvKiBzdGFydCBzb2xvIGluaXQgKi8KKwl3cml0ZXcoU0lTUl9NSSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTS19TVU0pOworCisJd2hpbGUgKCEoKHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSkgJiBTSVNSX1NSQl9SRVBMWSkpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOworCQlpZiAoamlmZmllcyAtIHQgPiA0MCAqIEhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZ1xuIik7CisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU1RSRUFNRVJfSU9fU1BBQ0UpOworCQkJaWYgKHNrYikKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJd3JpdGV3KH5TSVNSX1NSQl9SRVBMWSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwltaXNyID0gcmVhZHcoc3RyZWFtZXJfbW1pbyArIE1JU1JfUlVNKTsKKwl3cml0ZXcofm1pc3IsIHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CS8qIHJlbGVhc2Ugc2tiIHVzZWQgZm9yIGRpYWdub3N0aWNzICovCisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygiTEFQV1dPOiAleCwgTEFQQTogJXggTEFQRTogICV4XG4iLAorCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEEpLAorCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRSkpOworI2VuZGlmCisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXsKKwkJaW50IGk7CisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSwKKwkJICAgICAgIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJcHJpbnRrKCJpbml0aWFsaXphdGlvbiByZXNwb25zZSBzcmIgZHVtcDogIik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQkJcHJpbnRrKCIleDoiLAorCQkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTykgKyA2LCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJaWYgKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBEKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0b2tlbnJpbmcgY2FyZCBpbml0aWFsaXphdGlvbiBmYWlsZWQuIGVycm9yY29kZSA6ICV4XG4iLAorCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEQpKSk7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTVFJFQU1FUl9JT19TUEFDRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTykgKyA4LCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJdWFhX2FkZHIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCXJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsJLyogc2tpcCBvdmVyIExldmVsLkFkZHIgZmllbGQgKi8KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9hZGRyX3RhYmxlX2FkZHIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Bhcm1zX2FkZHIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIlVBQSByZXNpZGVzIGF0ICV4XG4iLCB1YWFfYWRkcik7CisjZW5kaWYKKworCS8qIHNldHVwIHVhYSBhcmVhIGZvciBhY2Nlc3Mgd2l0aCBMQVBEICovCisJeworCQlpbnQgaTsKKwkJX191MTYgYWRkcjsKKwkJd3JpdGV3KHVhYV9hZGRyLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwkJICAgICAgICBhZGRyPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpOworCQkJZGV2LT5kZXZfYWRkcltpXT0gKGFkZHIgPj4gOCkgJiAweGZmOworCQkJZGV2LT5kZXZfYWRkcltpKzFdPSBhZGRyICYgMHhmZjsKKwkJfQorI2lmIFNUUkVBTUVSX0RFQlVHCisJCXByaW50aygiQWRhcHRlciBhZGRyZXNzOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJcHJpbnRrKCIlMDJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHJlYW1lcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIG9wZW5fZXJyb3JbMjU1XTsKKwlpbnQgaSwgb3Blbl9maW5pc2hlZCA9IDE7CisJX191MTYgc3JiX3dvcmQ7CisJX191MTYgc3JiX29wZW47CisJaW50IHJjOworCisJaWYgKHJlYWR3KHN0cmVhbWVyX21taW8rQk1DVExfU1VNKSAmIEJNQ1RMX1JYX0VOQUJMRUQpIHsKKwkgICAgICAgIHJjPXN0cmVhbWVyX3Jlc2V0KGRldik7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc3RyZWFtZXJfaW50ZXJydXB0LCBTQV9TSElSUSwgImxhbnN0cmVhbWVyIiwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkJNQ1RMOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1NVTSkpOworCXByaW50aygicGVuZGluZyBpbnRzOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpKTsKKyNlbmRpZgorCisJd3JpdGV3KFNJU1JfTUkgfCBTSVNSX1NSQl9SRVBMWSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTSyk7CS8qIG1vcmUgaW50cyBsYXRlciwgZG9lc24ndCBzdG9wIGFyYiBjbWQgaW50ZXJydXB0ICovCisJd3JpdGV3KExJU1JfTElFLCBzdHJlYW1lcl9tbWlvICsgTElTUik7CS8qIG1vcmUgaW50cyBsYXRlciAqLworCisJLyogYWRhcHRlciBpcyBjbG9zZWQsIHNvIFNSQiBpcyBwb2ludGVkIHRvIGJ5IExBUFdXTyAqLworCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSwKKwkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEEpKTsKKwlwcmludGsoIkxBUEU6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRSkpOworCXByaW50aygiU0lTUiBNYXNrID0gJTA0eFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTSykpOworI2VuZGlmCisJZG8geworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU1JCX0NPTU1BTkRfU0laRTsgaSArPSAyKSB7CisJCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQl9CisKKwkJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8rTEFQV1dPKSxzdHJlYW1lcl9tbWlvK0xBUEEpOworCQl3cml0ZXcoaHRvbnMoU1JCX09QRU5fQURBUFRFUjw8OCksc3RyZWFtZXJfbW1pbytMQVBESU5DKSA7IAkvKiBvcGVuICovCisJCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERTw8OCksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisKKwkJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pICsgOCwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorCQkvKiBJZiBOZXR3b3JrIE1vbml0b3IsIGluc3RydWN0IGNhcmQgdG8gY29weSBNQUMgZnJhbWVzIHRocm91Z2ggdGhlIEFSQiAqLworCQl3cml0ZXcoaHRvbnMoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggfCBPUEVOX0FEQVBURVJfUEFTU19BRENfTUFDIHwgT1BFTl9BREFQVEVSX1BBU1NfQVRUX01BQyB8IE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiksIHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsJLyogb2Zmc2V0IDggd29yZCBjb250YWlucyBvcGVuIG9wdGlvbnMgKi8KKyNlbHNlCisJCXdyaXRldyhodG9ucyhPUEVOX0FEQVBURVJfRU5BQkxFX0ZEWCksIHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsJLyogT2Zmc2V0IDggd29yZCBjb250YWlucyBPcGVuLk9wdGlvbnMgKi8KKyNlbmRpZgorCisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbMF0pIHsKKwkJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSArIDEyLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQl3cml0ZXcoaHRvbnMoKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVswXSA8PCA4KSB8IAorCQkJCSAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzFdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQkJd3JpdGV3KGh0b25zKChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbMl0gPDwgOCkgfCAKKwkJCQkgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVszXSksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldyhodG9ucygoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzRdIDw8IDgpIHwgCisJCQkJICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbNV0pLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhLCBkZXYtPmFkZHJfbGVuKTsKKwkJfQorCisJCS8qIHNhdmUgb2ZmIHNyYiBvcGVuIG9mZnNldCAqLworCQlzcmJfb3BlbiA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pOworI2lmIFNUUkVBTUVSX0RFQlVHCisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSwKKwkJICAgICAgIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJcHJpbnRrKCJzcmIgb3BlbiByZXF1ZXN0OiBcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJcHJpbnRrKCIleDoiLCBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssIGZsYWdzKTsKKwkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDE7CisKKwkJLyogc2lnbmFsIHNvbG8gdGhhdCBTUkIgY29tbWFuZCBoYXMgYmVlbiBpc3N1ZWQgKi8KKwkJd3JpdGV3KExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jaywgZmxhZ3MpOworCisJCXdoaWxlIChzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkKSB7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnN0cmVhbWVyX3ByaXYtPnNyYl93YWl0LCA1ICogSFopOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNJU1I9JXggTUlTUj0leCwgTElTUj0leFxuIiwKKwkJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpLAorCQkJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pLAorCQkJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTElTUikpOworCQkJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCQlwcmludGsoIlNJU1JfTUFTSzogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spKTsKKwkJcHJpbnRrKCJzcmIgb3BlbiByZXNwb25zZTpcbiIpOworCQl3cml0ZXcoc3JiX29wZW4sIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXByaW50aygiJXg6IiwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJfQorI2VuZGlmCisKKwkJLyogSWYgd2UgZ2V0IHRoZSBzYW1lIHJldHVybiByZXNwb25zZSBhcyB3ZSBzZXQsIHRoZSBpbnRlcnJ1cHQgd2Fzbid0IHJhaXNlZCBhbmQgdGhlIG9wZW4KKwkJICogdGltZWQgb3V0LgorCQkgKi8KKwkJd3JpdGV3KHNyYl9vcGVuICsgMiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlzcmJfd29yZCA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBEKSkgPj4gODsKKwkJaWYgKHNyYl93b3JkID09IFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBPcGVuIHRpbWUgb3V0IG9yIGVycm9yLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoc3JiX3dvcmQgIT0gMCkgeworCQkJaWYgKHNyYl93b3JkID09IDB4MDcpIHsKKwkJCQlpZiAoIXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgJiYgb3Blbl9maW5pc2hlZCkgewkvKiBBdXRvc2Vuc2UgLCBmaXJzdCB0aW1lIGFyb3VuZCAqLworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmV0cnlpbmcgYXQgZGlmZmVyZW50IHJpbmcgc3BlZWQgXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJb3Blbl9maW5pc2hlZCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJX191MTYgZXJyb3JfY29kZTsKKworCQkJCQl3cml0ZXcoc3JiX29wZW4gKyA2LCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQkJCWVycm9yX2NvZGUgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRCkpOworCQkJCQlzdHJjcHkob3Blbl9lcnJvciwgb3Blbl9tYWpfZXJyb3JbKGVycm9yX2NvZGUgJiAweGYwKSA+PiA0XSk7CisJCQkJCXN0cmNhdChvcGVuX2Vycm9yLCAiIC0gIik7CisJCQkJCXN0cmNhdChvcGVuX2Vycm9yLCBvcGVuX21pbl9lcnJvclsoZXJyb3JfY29kZSAmIDB4MGYpXSk7CisKKwkJCQkJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkCisJCQkJCSAgICAmJiAoKGVycm9yX2NvZGUgJiAweDBmKSA9PSAweDBkKSkgCisJCQkJCXsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmllZCB0byBhdXRvc2Vuc2UgcmluZyBzcGVlZCB3aXRoIG5vIG1vbml0b3JzIHByZXNlbnRcbiIsIGRldi0+bmFtZSk7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUGxlYXNlIHRyeSBhZ2FpbiB3aXRoIGEgc3BlY2lmaWVkIHJpbmcgc3BlZWQgXG4iLCBkZXYtPm5hbWUpOworCQkJCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJfQorCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlc1xuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgb3Blbl9lcnJvcik7CisJCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJCQlyZXR1cm4gLUVJTzsKKworCQkJCX0JLyogaWYgYXV0b3NlbnNlICYmIG9wZW5fZmluaXNoZWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJhZCBPUEVOIHJlc3BvbnNlOiAleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBzcmJfd29yZCk7CisJCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gZWxzZQorCQkJb3Blbl9maW5pc2hlZCA9IDE7CisJfSB3aGlsZSAoIShvcGVuX2ZpbmlzaGVkKSk7CS8qIFdpbGwgb25seSBsb29wIGlmIHJpbmcgc3BlZWQgbWlzbWF0Y2ggcmUtb3BlbiBhdHRlbXB0ZWQgJiYgYXV0b3NlbnNlIGlzIG9uICovCisKKwl3cml0ZXcoc3JiX29wZW4gKyAxOCwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRCkpID4+IDg7CisJaWYgKHNyYl93b3JkICYgKDEgPDwgMykpCisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5lZCBpbiBGRFggTW9kZVxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChzcmJfd29yZCAmIDEpCisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPSAxNjsKKwllbHNlCisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPSA0OworCisJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuZWQgaW4gJWQgTWJwcyBtb2RlXG4iLCAKKwkJCWRldi0+bmFtZSwKKwkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQpOworCisJd3JpdGV3KHNyYl9vcGVuICsgOCwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXN0cmVhbWVyX3ByaXYtPmFzYiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJc3RyZWFtZXJfcHJpdi0+c3JiID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlzdHJlYW1lcl9wcml2LT5hcmIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCXJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsJLyogb2Zmc2V0IDE0IHdvcmQgaXMgcnN2ZCAqLworCXN0cmVhbWVyX3ByaXYtPnRyYiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMgPSAweDAwOworCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnMgPSAwOworCisJLyogc2V0dXAgcnggcmluZyAqLworCS8qIGVuYWJsZSByeCBjaGFubmVsICovCisJd3JpdGV3KH5CTUNUTF9SWF9ESVMsIHN0cmVhbWVyX21taW8gKyBCTUNUTF9SVU0pOworCisJLyogc2V0dXAgcnggZGVzY3JpcHRvcnMgKi8KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nPQorCSAgICBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MpKgorCQkgICAgIFNUUkVBTUVSX1JYX1JJTkdfU0laRSxHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmcpIHsKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgQUxMT0Mgb2Ygc3RyZWFtZXIgcnggcmluZyBGQUlMRUQhIVxuIixkZXYtPm5hbWUpOworCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RSRUFNRVJfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3opOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKworCQlza2ItPmRldiA9IGRldjsKKworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLmZvcndhcmQgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2kgKyAxXSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tpXS5idWZmZXIgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbaV0uZnJhbWVsZW5fYnVmbGVuID0gc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zejsKKwkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19za2JbaV0gPSBza2I7CisJfQorCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMV0uZm9yd2FyZCA9CisJCQkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbMF0sCisJCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKworCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlcnMuIEFkYXB0ZXIgZGlzYWJsZWRcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBTVFJFQU1FUl9SWF9SSU5HX1NJWkUgLSAxOwkvKiBsYXN0IHByb2Nlc3NlZCByeCBzdGF0dXMgKi8KKworCXdyaXRlbChjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1swXSwKKwkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MpLCBQQ0lfRE1BX1RPREVWSUNFKSksIAorCQlzdHJlYW1lcl9tbWlvICsgUlhCREEpOworCXdyaXRlbChjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tTVFJFQU1FUl9SWF9SSU5HX1NJWkUgLSAxXSwKKwkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MpLCBQQ0lfRE1BX1RPREVWSUNFKSksIAorCQlzdHJlYW1lcl9tbWlvICsgUlhMQkRBKTsKKworCS8qIHNldCBidXMgbWFzdGVyIGludGVycnVwdCBldmVudCBtYXNrICovCisJd3JpdGV3KE1JU1JfUlhfTk9CVUYgfCBNSVNSX1JYX0VPRiwgc3RyZWFtZXJfbW1pbyArIE1JU1JfTUFTSyk7CisKKworCS8qIHNldHVwIHR4IHJpbmcgKi8KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nPWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl90eF9kZXNjKSoKKwkJCQkJCVNUUkVBTUVSX1RYX1JJTkdfU0laRSxHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmcpIHsKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgQUxMT0Mgb2Ygc3RyZWFtZXJfdHhfcmluZyBGQUlMRURcbiIsZGV2LT5uYW1lKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJd3JpdGV3KH5CTUNUTF9UWDJfRElTLCBzdHJlYW1lcl9tbWlvICsgQk1DVExfUlVNKTsJLyogRW5hYmxlcyBUWCBjaGFubmVsIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RSRUFNRVJfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5mb3J3YXJkID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCQkJCQkJJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaSArIDFdLAorCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyksCisJCQkJCQkJCQkJUENJX0RNQV9UT0RFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0uYnVmY250X2ZyYW1lbGVuID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5idWZmZXIgPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLmJ1ZmxlbiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0ucnN2ZDEgPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLnJzdmQyID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5yc3ZkMyA9IDA7CisJfQorCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbU1RSRUFNRVJfVFhfUklOR19TSVpFIC0gMV0uZm9yd2FyZCA9CisJCQkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nWzBdLAorCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyksIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKworCXN0cmVhbWVyX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzID0gU1RSRUFNRVJfVFhfUklOR19TSVpFOworCXN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZSA9IDA7CS8qIG5leHQgZW50cnkgaW4gdHggcmluZyB0byB1c2UgKi8KKwlzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzID0gU1RSRUFNRVJfVFhfUklOR19TSVpFIC0gMTsKKworCS8qIHNldCBCdXNtYXN0ZXIgaW50ZXJydXB0IGV2ZW50IG1hc2sgKGhhbmRsZSByZWNlaXZlcyBvbiBpbnRlcnJ1cHQgb25seSAqLworCXdyaXRldyhNSVNSX1RYMl9FT0YgfCBNSVNSX1JYX05PQlVGIHwgTUlTUl9SWF9FT0YsIHN0cmVhbWVyX21taW8gKyBNSVNSX01BU0spOworCS8qIHNldCBzeXN0ZW0gZXZlbnQgaW50ZXJydXB0IG1hc2sgKi8KKwl3cml0ZXcoU0lTUl9BREFQVEVSX0NIRUNLIHwgU0lTUl9BUkJfQ01EIHwgU0lTUl9UUkJfUkVQTFkgfCBTSVNSX0FTQl9GUkVFLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLX1NVTSk7CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygiQk1DVEw6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgQk1DVExfU1VNKSk7CisJcHJpbnRrKCJTSVNSIE1BU0s6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSk7CisjZW5kaWYKKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorCisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2FkZHJfdGFibGVfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXByaW50aygiJXM6IE5vZGUgQWRkcmVzczogJTA0eDolMDR4OiUwNHhcbiIsIGRldi0+bmFtZSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCXJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKwlwcmludGsoIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3M6ICUwNHg6JTA0eFxuIiwgZGV2LT5uYW1lLAorCQludG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpLAorCQludG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9wYXJtc19hZGRyICsgNCwKKwkJc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXByaW50aygiJXM6IE5BVU4gQWRkcmVzczogJTA0eDolMDR4OiUwNHhcbiIsIGRldi0+bmFtZSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisjZW5kaWYKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCXJldHVybiAwOworfQorCisvKgorICoJV2hlbiB3ZSBlbnRlciB0aGUgcnggcm91dGluZSB3ZSBkbyBub3Qga25vdyBob3cgbWFueSBmcmFtZXMgaGF2ZSBiZWVuIAorICoJcXVldWVkIG9uIHRoZSByeCBjaGFubmVsLiAgVGhlcmVmb3JlIHdlIHN0YXJ0IGF0IHRoZSBuZXh0IHJ4IHN0YXR1cworICoJcG9zaXRpb24gYW5kIHRyYXZlbCBhcm91bmQgdGhlIHJlY2VpdmUgcmluZyB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZAorICoJYWxsIHRoZSBmcmFtZXMuCisgKgorICoJVGhpcyBtZWFucyB0aGF0IHdlIG1heSBwcm9jZXNzIHRoZSBmcmFtZSBiZWZvcmUgd2UgcmVjZWl2ZSB0aGUgZW5kCisgKglvZiBmcmFtZSBpbnRlcnJ1cHQuIFRoaXMgaXMgd2h5IHdlIGFsd2F5cyB0ZXN0IHRoZSBzdGF0dXMgaW5zdGVhZAorICoJb2YgYmxpbmRseSBwcm9jZXNzaW5nIHRoZSBuZXh0IGZyYW1lLgorICoJCisgKi8KK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MgKnJ4X2Rlc2M7CisJaW50IHJ4X3JpbmdfbGFzdF9yZWNlaXZlZCwgbGVuZ3RoLCBmcmFtZV9sZW5ndGgsIGJ1ZmZlcl9jbnQgPSAwOworCXN0cnVjdCBza19idWZmICpza2IsICpza2IyOworCisJLyogc2V0dXAgdGhlIG5leHQgcnggZGVzY3JpcHRvciB0byBiZSByZWNlaXZlZCAqLworCXJ4X2Rlc2MgPSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1soc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSldOworCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZDsKKworCXdoaWxlIChyeF9kZXNjLT5zdGF0dXMgJiAweDAxMDAwMDAwKSB7CS8qIFdoaWxlIHByb2Nlc3NlZCBkZXNjcmlwdG9ycyBhcmUgYXZhaWxhYmxlICovCisJCWlmIChyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgIT0gc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlggRXJyb3IgMSByeF9yaW5nX2xhc3RfcmVjZWl2ZWQgbm90IHRoZSBzYW1lICV4ICV4XG4iLAorCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCwgc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKTsKKwkJfQorCQlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSAoc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZDsKKworCQlsZW5ndGggPSByeF9kZXNjLT5mcmFtZWxlbl9idWZsZW4gJiAweGZmZmY7CS8qIGJ1ZmZlciBsZW5ndGggKi8KKwkJZnJhbWVfbGVuZ3RoID0gKHJ4X2Rlc2MtPmZyYW1lbGVuX2J1ZmxlbiA+PiAxNikgJiAweGZmZmY7CisKKwkJaWYgKHJ4X2Rlc2MtPnN0YXR1cyAmIDB4N0U4MzAwMDApIHsJLyogZXJyb3JzICovCisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSeCBFcnJvciAleCBcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcnhfZGVzYy0+c3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsJLyogcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgKi8KKwkJCWlmIChyeF9kZXNjLT5zdGF0dXMgJiAweDgwMDAwMDAwKSB7CS8qIGZyYW1lIGNvbXBsZXRlICovCisJCQkJYnVmZmVyX2NudCA9IDE7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6KTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZV9sZW5ndGgpOworCQkJfQorCisJCQlpZiAoc2tiID09IE5VTEwpIAorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IHBhY2tldCB0byB1cHBlciBsYXllcnMuIFxuIiwJZGV2LT5uYW1lKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9IGVsc2UgewkvKiB3ZSBhbGxvY2F0ZWQgYW4gc2tiIE9LICovCisJCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCQlpZiAoYnVmZmVyX2NudCA9PSAxKSB7CisJCQkJCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCisJCQkJCXBjaV91bm1hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCQlsZTMyX3RvX2NwdShzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCQkJCXN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3osIAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJc2tiMiA9IHN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF07CisjaWYgU1RSRUFNRVJfREVCVUdfUEFDS0VUUworCQkJCQl7CisJCQkJCQlpbnQgaTsKKwkJCQkJCXByaW50aygic3RyZWFtZXJfcnggcGFja2V0IHByaW50OiBza2ItPmRhdGEyICVwICBza2ItPmhlYWQgJXBcbiIsIHNrYjItPmRhdGEsIHNrYjItPmhlYWQpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IGZyYW1lX2xlbmd0aDsgaSsrKSAKKwkJCQkJCXsKKwkJCQkJCQlwcmludGsoIiV4OiIsIHNrYjItPmRhdGFbaV0pOworCQkJCQkJCWlmICgoKGkgKyAxKSAlIDE2KSA9PSAwKQorCQkJCQkJCQlwcmludGsoIlxuIik7CisJCQkJCQl9CisJCQkJCQlwcmludGsoIlxuIik7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlza2JfcHV0KHNrYjIsIGxlbmd0aCk7CisJCQkJCXNrYjItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IyLCBkZXYpOworCQkJCQkvKiByZWN5Y2xlIHRoaXMgZGVzY3JpcHRvciAqLworCQkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uc3RhdHVzID0gMDsKKwkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmZyYW1lbGVuX2J1ZmxlbiA9IHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3o7CisJCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIgPSAKKwkJCQkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeiwKKwkJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQkJCXN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0gPSBza2I7CisJCQkJCS8qIHBsYWNlIHJlY3ljbGVkIGRlc2NyaXB0b3IgYmFjayBvbiB0aGUgYWRhcHRlciAqLworCQkJCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCQkJCQkmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLAorCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9GUk9NREVWSUNFKSksCisJCQkJCQlzdHJlYW1lcl9tbWlvICsgUlhMQkRBKTsKKwkJCQkJLyogcGFzcyB0aGUgcmVjZWl2ZWQgc2tiIHVwIHRvIHRoZSBwcm90b2NvbCAqLworCQkJCQluZXRpZl9yeChza2IyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkbyB7CS8qIFdhbGsgdGhlIGJ1ZmZlcnMgKi8KKwkJCQkJCXBjaV91bm1hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgbGUzMl90b19jcHUocnhfZGVzYy0+YnVmZmVyKSwgbGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpLCAKKwkJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuZ3RoKSwgKHZvaWQgKilyeF9kZXNjLT5idWZmZXIsIGxlbmd0aCk7CS8qIGNvcHkgdGhpcyBmcmFnbWVudCAqLworCQkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLnN0YXR1cyA9IDA7CisJCQkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uZnJhbWVsZW5fYnVmbGVuID0gc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zejsKKwkJCQkJCQorCQkJCQkJLyogZ2l2ZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkJCQkJCXdyaXRlbChjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAKKwkJCQkJCQkJCSZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0sCisJCQkJCQkJCQlsZW5ndGgsIFBDSV9ETUFfRlJPTURFVklDRSkpLCAKKwkJCQkJCQlzdHJlYW1lcl9tbWlvICsgUlhMQkRBKTsKKworCQkJCQkJaWYgKHJ4X2Rlc2MtPnN0YXR1cyAmIDB4ODAwMDAwMDApCisJCQkJCQkJYnJlYWs7CS8qIHRoaXMgZGVzY3JpcHRvciBjb21wbGV0ZXMgdGhlIGZyYW1lICovCisKKwkJCQkJCS8qIGVsc2UgZ2V0IHRoZSBuZXh0IHBlbmRpbmcgZGVzY3JpcHRvciAqLworCQkJCQkJaWYgKHJ4X3JpbmdfbGFzdF9yZWNlaXZlZCE9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCkKKwkJCQkJCXsKKwkJCQkJCQlwcmludGsoIlJYIEVycm9yIHJ4X3JpbmdfbGFzdF9yZWNlaXZlZCBub3QgdGhlIHNhbWUgJXggJXhcbiIsCisJCQkJCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCwKKwkJCQkJCQkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKTsKKwkJCQkJCX0KKwkJCQkJCXJ4X2Rlc2MgPSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1soc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKzEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRS0xKV07CisKKwkJCQkJCWxlbmd0aCA9IHJ4X2Rlc2MtPmZyYW1lbGVuX2J1ZmxlbiAmIDB4ZmZmZjsJLyogYnVmZmVyIGxlbmd0aCAqLworCQkJCQkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0JKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCsxKSAmIChTVFJFQU1FUl9SWF9SSU5HX1NJWkUgLSAxKTsKKwkJCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZDsKKwkJCQkJfSB3aGlsZSAoMSk7CisKKwkJCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCQkvKiBzZW5kIHVwIHRvIHRoZSBwcm90b2NvbCAqLworCQkJCQluZXRpZl9yeChza2IpOworCQkJCX0KKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJCQl9CS8qIGlmIHNrYiA9PSBudWxsICovCisJCX0JCS8qIGVuZCByZWNlaXZlZCB3aXRob3V0IGVycm9ycyAqLworCisJCS8qIHRyeSB0aGUgbmV4dCBvbmUgKi8KKwkJcnhfZGVzYyA9ICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nWyhyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKyAxKSAmIChTVFJFQU1FUl9SWF9SSU5HX1NJWkUgLSAxKV07CisJfQkJCS8qIGVuZCBmb3IgYWxsIGNvbXBsZXRlZCByeCBkZXNjcmlwdG9ycyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RyZWFtZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191MTYgc2lzcjsKKwlfX3UxNiBtaXNyOworCXU4IG1heF9pbnRyID0gTUFYX0lOVFI7CisKKwlzcGluX2xvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCXNpc3IgPSByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUik7CisKKwl3aGlsZSgoc2lzciAmIChTSVNSX01JIHwgU0lTUl9TUkJfUkVQTFkgfCBTSVNSX0FEQVBURVJfQ0hFQ0sgfCBTSVNSX0FTQl9GUkVFIHwgCisJCSAgICAgICBTSVNSX0FSQl9DTUQgfCBTSVNSX1RSQl9SRVBMWSB8IFNJU1JfUEFSX0VSUiB8IFNJU1JfU0VSUl9FUlIpKQorICAgICAgICAgICAgICAgJiYgKG1heF9pbnRyID4gMCkpIHsKKworCQlpZihzaXNyICYgU0lTUl9QQVJfRVJSKSB7CisJCQl3cml0ZXcoflNJU1JfUEFSX0VSUiwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCX0KKworCQllbHNlIGlmKHNpc3IgJiBTSVNSX1NFUlJfRVJSKSB7CisJCQl3cml0ZXcoflNJU1JfU0VSUl9FUlIsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZihzaXNyICYgU0lTUl9NSSkgeworCQkJbWlzciA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisKKwkJaWYgKG1pc3IgJiBNSVNSX1RYMl9FT0YpIHsKKwkJCQl3aGlsZShzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nWyhzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzICsgMSkgJiAoU1RSRUFNRVJfVFhfUklOR19TSVpFIC0gMSldLnN0YXR1cykgeworCQkJCXN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXMgPSAoc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyArIDEpICYgKFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDEpOworCQkJCXN0cmVhbWVyX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzKys7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMudHhfYnl0ZXMgKz0gc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19za2Jbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10tPmxlbjsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19za2Jbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10pOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmZmVyID0gMHhkZWFkYmVlZjsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLnN0YXR1cyA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5idWZjbnRfZnJhbWVsZW4gPSAwOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmbGVuID0gMDsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLnJzdmQxID0gMDsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLnJzdmQyID0gMDsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLnJzdmQzID0gMDsKKwkJCX0KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCisJCWlmIChtaXNyICYgTUlTUl9SWF9FT0YpIHsKKwkJCXN0cmVhbWVyX3J4KGRldik7CisJCX0KKwkJLyogTUlTUl9SWF9FT0YgKi8KKworCQkJaWYgKG1pc3IgJiBNSVNSX1JYX05PQlVGKSB7CisJCQkJLyogQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uLCB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCB0cmFwcGluZyBpdCBrZWVwcyBpdCBvdXQgb2YgL3Zhci9sb2cvbWVzc2FnZXMuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQl9CQkvKiBTSVNSX1JYX05PQlVGICovCisKKwkJCXdyaXRldyh+bWlzciwgc3RyZWFtZXJfbW1pbyArIE1JU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisJCX0KKworCQllbHNlIGlmIChzaXNyICYgU0lTUl9TUkJfUkVQTFkpIHsKKwkJCWlmIChzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID09IDEpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnN0cmVhbWVyX3ByaXYtPnNyYl93YWl0KTsKKwkJCX0gZWxzZSBpZiAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9PSAyKSB7CisJCQkJc3RyZWFtZXJfc3JiX2JoKGRldik7CisJCQl9CisJCQlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMDsKKworCQkJd3JpdGV3KH5TSVNSX1NSQl9SRVBMWSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCX0KKworCQllbHNlIGlmIChzaXNyICYgU0lTUl9BREFQVEVSX0NIRUNLKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBDaGVjayBJbnRlcnJ1cHQgUmFpc2VkLCA4IGJ5dGVzIG9mIGluZm9ybWF0aW9uIGZvbGxvdzpcbiIsIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBXb3JkcyAleDoleDoleDoleDpcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyksCisJCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpLAorCQkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgbWFudWFsbHkgcmVzZXQuXG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJLyogU0lTUl9BREFQVEVSX0NIRUNLICovCisJCWVsc2UgaWYgKHNpc3IgJiBTSVNSX0FTQl9GUkVFKSB7CisJCQkvKiBXYWtlIHVwIGFueXRoaW5nIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIGFzYiByZXNwb25zZSAqLworCQkJaWYgKHN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQpIHsKKwkJCQlzdHJlYW1lcl9hc2JfYmgoZGV2KTsKKwkJCX0KKwkJCXdyaXRldyh+U0lTUl9BU0JfRlJFRSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCX0KKwkJLyogU0lTUl9BU0JfRlJFRSAqLworCQllbHNlIGlmIChzaXNyICYgU0lTUl9BUkJfQ01EKSB7CisJCQlzdHJlYW1lcl9hcmJfY21kKGRldik7CisJCQl3cml0ZXcoflNJU1JfQVJCX0NNRCwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCX0KKwkJLyogU0lTUl9BUkJfQ01EICovCisJCWVsc2UgaWYgKHNpc3IgJiBTSVNSX1RSQl9SRVBMWSkgeworCQkJLyogV2FrZSB1cCBhbnl0aGluZyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSB0cmIgcmVzcG9uc2UgKi8KKwkJCWlmIChzdHJlYW1lcl9wcml2LT50cmJfcXVldWVkKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdHJlYW1lcl9wcml2LT4KKwkJCQkJCSAgICAgIHRyYl93YWl0KTsKKwkJCX0KKwkJCXN0cmVhbWVyX3ByaXYtPnRyYl9xdWV1ZWQgPSAwOworCQkJd3JpdGV3KH5TSVNSX1RSQl9SRVBMWSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJCSh2b2lkKXJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCX0KKwkJLyogU0lTUl9UUkJfUkVQTFkgKi8KKworCQlzaXNyID0gcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpOworCQltYXhfaW50ci0tOworCX0gLyogd2hpbGUoKSAqLwkJCisKKwlzcGluX3VubG9jaygmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jaykgOyAKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcykgeworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZV0uc3RhdHVzID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLmJ1ZmNudF9mcmFtZWxlbiA9IDB4MDAwMjAwMDAgfCBza2ItPmxlbjsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLmJ1ZmZlciA9IAorCQkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZV0ucnN2ZDEgPSBza2ItPmxlbjsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnJzdmQyID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnJzdmQzID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLmJ1ZmxlbiA9IHNrYi0+bGVuOworCisJCXN0cmVhbWVyX3ByaXYtPnR4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZV0gPSBza2I7CisJCXN0cmVhbWVyX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzLS07CisjaWYgU1RSRUFNRVJfREVCVUdfUEFDS0VUUworCQl7CisJCQlpbnQgaTsKKwkJCXByaW50aygic3RyZWFtZXJfeG1pdCBwYWNrZXQgcHJpbnQ6XG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbjsgaSsrKSB7CisJCQkJcHJpbnRrKCIleDoiLCBza2ItPmRhdGFbaV0pOworCQkJCWlmICgoKGkgKyAxKSAlIDE2KSA9PSAwKQorCQkJCQlwcmludGsoIlxuIik7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisJCX0KKyNlbmRpZgorCisJCXdyaXRlbChjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAKKwkJCQkJJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl90eF9kZXNjKSwgUENJX0RNQV9UT0RFVklDRSkpLAorCQkJc3RyZWFtZXJfbW1pbyArIFRYMkxGREEpOworCQkodm9pZClyZWFkbChzdHJlYW1lcl9tbWlvICsgVFgyTEZEQSk7CisKKwkJc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlID0gKHN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZSArIDEpICYgKFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKworc3RhdGljIGludCBzdHJlYW1lcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJd3JpdGV3KGh0b25zKFNSQl9DTE9TRV9BREFQVEVSIDw8IDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssIGZsYWdzKTsKKworCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAxOworCXdyaXRldyhMSVNSX1NSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCkgCisJeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnN0cmVhbWVyX3ByaXYtPnNyYl93YWl0LAorCQkJCQkgICAgICAgamlmZmllcyArIDYwICogSFopOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU1JCIHRpbWVkIG91dC5cbiIsIGRldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTSVNSPSV4IE1JU1I9JXggTElTUj0leFxuIiwKKwkJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUiksCisJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIE1JU1JfUlVNKSwKKwkJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTElTUikpOworCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IChzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKyAxKSAmIChTVFJFQU1FUl9SWF9SSU5HX1NJWkUgLSAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBTVFJFQU1FUl9SWF9SSU5HX1NJWkU7IGkrKykgeworCSAgICAgICAgaWYgKHN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZF0pIHsKKwkJICAgICAgICBkZXZfa2ZyZWVfc2tiKHN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZF0pOworCQl9IAorCQlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSAoc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisJfQorCisJLyogcmVzZXQgdHgvcnggZmlmbydzIGFuZCBidXNtYXN0ZXIgbG9naWMgKi8KKworCS8qIFRCRC4gQWRkIGdyYWNlZnVsIHdheSB0byByZXNldCB0aGUgTExDIGNoYW5uZWwgd2l0aG91dCBkb2luZyBhIHNvZnQgcmVzZXQuIAorCSAgIHdyaXRlbChyZWFkbChzdHJlYW1lcl9tbWlvK0JDVEwpfCgzPDwxMyksc3RyZWFtZXJfbW1pbytCQ1RMKTsKKwkgICB1ZGVsYXkoMSk7CisJICAgd3JpdGVsKHJlYWRsKHN0cmVhbWVyX21taW8rQkNUTCkmfigzPDwxMyksc3RyZWFtZXJfbW1pbytCQ1RMKTsKKwkgKi8KKworI2lmIFNUUkVBTUVSX0RFQlVHCisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXByaW50aygic3JiKTogIik7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlwcmludGsoIiV4ICIsIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtZXJfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwlfX3U4IG9wdGlvbnMgPSAwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCXVuc2lnbmVkIGNoYXIgZGV2X21jX2FkZHJlc3NbNV07CisJaW50IGk7CisKKwl3cml0ZWwoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJb3B0aW9ucyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnM7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlvcHRpb25zIHw9ICgzIDw8IDUpOwkvKiBBbGwgTExDIGFuZCBNQUMgZnJhbWVzLCBhbGwgdGhyb3VnaCB0aGUgbWFpbiByeCBjaGFubmVsICovCisJZWxzZQorCQlvcHRpb25zICY9IH4oMyA8PCA1KTsKKworCS8qIE9ubHkgaXNzdWUgdGhlIHNyYiBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBvcHRpb25zICovCisKKwlpZiAoKG9wdGlvbnMgXiBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zKSkgCisJeworCQkvKiBOb3cgdG8gaXNzdWUgdGhlIHNyYiBjb21tYW5kIHRvIGFsdGVyIHRoZSBjb3B5LmFsbC5vcHRpb25zICovCisJCXdyaXRldyhodG9ucyhTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3JlY2VpdmVfb3B0aW9ucyA8PCA4KSB8IG9wdGlvbnMpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhodG9ucygweDRhNDEpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhodG9ucygweDRkNDUpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhodG9ucygweDUzMjApLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldygweDIwMjAsIHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKworCQlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMjsJLyogQ2FuJ3Qgc2xlZXAsIHVzZSBzcmJfYmggKi8KKworCQl3cml0ZWwoTElTUl9TUkJfQ01ELCBzdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnMgPSBvcHRpb25zOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IHRoZSBmdW5jdGlvbmFsIGFkZHJlc3NlcyB3ZSBuZWVkIGZvciBtdWx0aWNhc3QgKi8KKwl3cml0ZWwoc3RyZWFtZXJfcHJpdi0+c3JiLHN0cmVhbWVyX21taW8rTEFQQSk7CisJZGV2X21jX2FkZHJlc3NbMF0gPSBkZXZfbWNfYWRkcmVzc1sxXSA9IGRldl9tY19hZGRyZXNzWzJdID0gZGV2X21jX2FkZHJlc3NbM10gPSAwIDsgCisgIAorCWZvciAoaT0wLGRtaT1kZXYtPm1jX2xpc3Q7aSA8IGRldi0+bWNfY291bnQ7IGkrKyxkbWkgPSBkbWktPm5leHQpIAorCXsgCisgICAJICAgICAgICBkZXZfbWNfYWRkcmVzc1swXSB8PSBkbWktPmRtaV9hZGRyWzJdIDsgCisJCWRldl9tY19hZGRyZXNzWzFdIHw9IGRtaS0+ZG1pX2FkZHJbM10gOyAKKwkJZGV2X21jX2FkZHJlc3NbMl0gfD0gZG1pLT5kbWlfYWRkcls0XSA7IAorCQlkZXZfbWNfYWRkcmVzc1szXSB8PSBkbWktPmRtaV9hZGRyWzVdIDsgCisJfQorICAKKwl3cml0ZXcoaHRvbnMoU1JCX1NFVF9GVU5DX0FERFJFU1MgPDwgOCksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KDAsc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwl3cml0ZXcoaHRvbnMoIChkZXZfbWNfYWRkcmVzc1swXSA8PCA4KSB8IGRldl9tY19hZGRyZXNzWzFdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXdyaXRldyhodG9ucyggKGRldl9tY19hZGRyZXNzWzJdIDw8IDgpIHwgZGV2X21jX2FkZHJlc3NbM10pLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDIgOyAKKwl3cml0ZWwoTElTUl9TUkJfQ01ELHN0cmVhbWVyX21taW8rTElTUl9TVU0pOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwlfX3UxNiBzcmJfd29yZDsKKworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zcmIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCisJc3dpdGNoIChzcmJfd29yZCkgeworCisJCS8qIFNSQl9NT0RJRllfUkVDRUlWRV9PUFRJT05TIGkuZS4gc2V0X211bHRpY2FzdF9saXN0IG9wdGlvbnMgKHByb21pc2N1b3VzKSAKKwkJICogQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGlmIHdlIGdldCBhbiBlcnJvciwgc3VjaCBhcworCQkgKiByZXNldHRpbmcgdGhlIElGRl9QUk9NSVNDIGZsYWcgaW4gZGV2CisJCSAqLworCisJY2FzZSBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisKKwkJc3dpdGNoIChzcmJfd29yZCkgeworCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBPcHRpb25zIE1vZGlmaWVkIHRvICV4LCV4XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsCisJCQkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnMsCisJCQkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3JlY2VpdmVfb3B0aW9ucyk7CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCisJCS8qIFNSQl9TRVRfR1JPVVBfQUREUkVTUyAtIE11bHRpY2FzdCBncm91cCBzZXR0aW5nIAorCQkgKi8KKwljYXNlIFNSQl9TRVRfR1JPVVBfQUREUkVTUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkgICAgICAgIGJyZWFrOworCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIixkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgzYzoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cC9GdW5jdGlvbmFsIGFkZHJlc3MgaW5kaWNhdG9yIGJpdHMgbm90IHNldCBjb3JyZWN0bHlcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDNlOgkvKiBJZiB3ZSBldmVyIGltcGxlbWVudCBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMsIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggdGhpcyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXJzIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDU1OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdyb3VwIEFkZHJlc3MgYWxyZWFkeSBzZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCisJCS8qIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTIC0gUmVtb3ZlIGEgbXVsdGljYXN0IGFkZHJlc3MgZnJvbSBncm91cCBsaXN0CisJCSAqLworCWNhc2UgU1JCX1JFU0VUX0dST1VQX0FERFJFU1M6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCQlzd2l0Y2ggKHNyYl93b3JkKSB7CisJCWNhc2UgMHgwMDoKKwkJICAgICAgICBicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDM5OgkvKiBNdXN0IGRlYWwgd2l0aCB0aGlzIGlmIGluZGl2aWR1YWwgbXVsdGljYXN0IGFkZHJlc3NlcyB1c2VkICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogR3JvdXAgYWRkcmVzcyBub3QgZm91bmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCisJCS8qIFNSQl9TRVRfRlVOQ19BRERSRVNTIC0gQ2FsbGVkIGJ5IHRoZSBzZXRfcnhfbW9kZSAKKwkJICovCisKKwljYXNlIFNSQl9TRVRfRlVOQ19BRERSRVNTOgorCSAgICAgICAgc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKwkJc3dpdGNoIChzcmJfd29yZCkgeworCQljYXNlIDB4MDA6CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRnVuY3Rpb25hbCBBZGRyZXNzIE1hc2sgU2V0IFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKwkJLyogU1JCX1JFQURfTE9HIC0gUmVhZCBhbmQgcmVzZXQgdGhlIGFkYXB0ZXIgZXJyb3IgY291bnRlcnMKKwkJICovCisKKwljYXNlIFNSQl9SRUFEX0xPRzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkJeworCQkJCWludCBpOworCQkJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBMb2cgY29tbWFuZCBjb21wbGV0ZVxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoIlJlYWQgTG9nIHN0YXRpc3RpY3M6ICIpOworCQkJCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zcmIgKyA2LAorCQkJCSAgICAgICBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJCQlwcmludGsoIiV4OiIsIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCQkJCX0KKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQl9CQkvKiBzd2l0Y2ggc3JiWzJdICovCisJCWJyZWFrOworCisJCS8qIFNSQl9SRUFEX1NSX0NPVU5URVJTIC0gUmVhZCBhbmQgcmVzZXQgdGhlIHNvdXJjZSByb3V0aW5nIGJyaWRnZSByZWxhdGVkIGNvdW50ZXJzICovCisKKwljYXNlIFNSQl9SRUFEX1NSX0NPVU5URVJTOgorCSAgICAgICAgc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKwkJc3dpdGNoIChzcmJfd29yZCkgeworCQljYXNlIDB4MDA6CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBTb3VyY2UgUm91dGluZyBDb3VudGVycyBpc3N1ZWRcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CQkvKiBzd2l0Y2ggc3JiWzJdICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgYmggcmV0dXJuIHZhbHVlLlxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQkJCS8qIHN3aXRjaCBzcmJbMF0gKi8KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJlYW1lcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKwlzdHJlYW1lcl9wcml2ID0gKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0czsKK30KKworc3RhdGljIGludCBzdHJlYW1lcl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gYWRkcjsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSAKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IG1hYy9sYWEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbWNweShzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWEsIHNhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUMvTEFBIFNldCB0byAgPSAleC4leC4leC4leC4leC4leFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzBdLAorCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzFdLAorCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzJdLAorCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzNdLAorCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzRdLAorCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzVdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwlfX3U4IGhlYWRlcl9sZW47CisJX191MTYgZnJhbWVfbGVuLCBidWZmZXJfbGVuOworCXN0cnVjdCBza19idWZmICptYWNfZnJhbWU7CisJX191OCBmcmFtZV9kYXRhWzI1Nl07CisJX191MTYgYnVmZl9vZmY7CisJX191MTYgbGFuX3N0YXR1cyA9IDAsIGxhbl9zdGF0dXNfZGlmZjsJLyogSW5pdGlhbGl6ZSB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmcgKi8KKwlfX3U4IGZkeF9wcm90X2Vycm9yOworCV9fdTE2IG5leHRfcHRyOworCV9fdTE2IGFyYl93b3JkOworCisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisJc3RydWN0IHRyaF9oZHIgKm1hY19oZHI7CisjZW5kaWYKKworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5hcmIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlhcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUEQpKSA+PiA4OworCQorCWlmIChhcmJfd29yZCA9PSBBUkJfUkVDRUlWRV9EQVRBKSB7CS8qIFJlY2VpdmUuZGF0YSwgTUFDIGZyYW1lcyAqLworCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXJiICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlzdHJlYW1lcl9wcml2LT5tYWNfcnhfYnVmZmVyID0gYnVmZl9vZmYgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCQloZWFkZXJfbGVuPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7IC8qIDgwMi41IFRva2VuLVJpbmcgSGVhZGVyIExlbmd0aCAqLworCQlmcmFtZV9sZW4gPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwkJeworCQkJaW50IGk7CisJCQlfX3UxNiBuZXh0OworCQkJX191OCBzdGF0dXM7CisJCQlfX3UxNiBsZW47CisKKwkJCXdyaXRldyhudG9ocyhidWZmX29mZiksIHN0cmVhbWVyX21taW8gKyBMQVBBKTsJLypzZXR1cCB3aW5kb3cgdG8gZnJhbWUgZGF0YSAqLworCQkJbmV4dCA9IGh0b25zKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJCQlzdGF0dXMgPQorCQkJICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkgJiAweGZmOworCQkJbGVuID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKworCQkJLyogcHJpbnQgb3V0IDFzdCAxNCBieXRlcyBvZiBmcmFtZSBkYXRhICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQkJcHJpbnRrKCJMb2MgJWQgPSAlMDR4XG4iLCBpLAorCQkJCSAgICAgICBudG9ocyhyZWFkdworCQkJCQkgICAgIChzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJCX0KKworCQkJcHJpbnRrKCJuZXh0ICUwNHgsIGZzICUwMngsIGxlbiAlMDR4IFxuIiwgbmV4dCwKKwkJCSAgICAgICBzdGF0dXMsIGxlbik7CisJCX0KKyNlbmRpZgorCQlpZiAoIShtYWNfZnJhbWUgPSBkZXZfYWxsb2Nfc2tiKGZyYW1lX2xlbikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIGZyYW1lLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wX2ZyYW1lOworCQl9CisJCS8qIFdhbGsgdGhlIGJ1ZmZlciBjaGFpbiwgY3JlYXRpbmcgdGhlIGZyYW1lICovCisKKwkJZG8geworCQkJaW50IGk7CisJCQlfX3UxNiByeF93b3JkOworCisJCQl3cml0ZXcoaHRvbnMoYnVmZl9vZmYpLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CS8qIHNldHVwIHdpbmRvdyB0byBmcmFtZSBkYXRhICovCisJCQluZXh0X3B0ciA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJCQlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIHJlYWQgdGhydSBzdGF0dXMgd29yZCAqLworCQkJYnVmZmVyX2xlbiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisKKwkJCWlmIChidWZmZXJfbGVuID4gMjU2KQorCQkJCWJyZWFrOworCisJCQlpID0gMDsKKwkJCXdoaWxlIChpIDwgYnVmZmVyX2xlbikgeworCQkJCXJ4X3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSk7CisJCQkJZnJhbWVfZGF0YVtpXT1yeF93b3JkID4+IDg7CisJCQkJZnJhbWVfZGF0YVtpKzFdPXJ4X3dvcmQgJiAweGZmOworCQkJCWkgKz0gMjsKKwkJCX0KKworCQkJbWVtY3B5KHNrYl9wdXQobWFjX2ZyYW1lLCBidWZmZXJfbGVuKSwKKwkJCQkgICAgICBmcmFtZV9kYXRhLCBidWZmZXJfbGVuKTsKKwkJfSB3aGlsZSAobmV4dF9wdHIgJiYgKGJ1ZmZfb2ZmID0gbmV4dF9wdHIpKTsKKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopIG1hY19mcmFtZS0+ZGF0YTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBNQUMgRnJhbWUgRGVzdC4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtYWNfaGRyLT5kYWRkclswXSwgbWFjX2hkci0+ZGFkZHJbMV0sCisJCSAgICAgICBtYWNfaGRyLT5kYWRkclsyXSwgbWFjX2hkci0+ZGFkZHJbM10sCisJCSAgICAgICBtYWNfaGRyLT5kYWRkcls0XSwgbWFjX2hkci0+ZGFkZHJbNV0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IE1BQyBGcmFtZSBTcmNlLiBBZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1hY19oZHItPnNhZGRyWzBdLCBtYWNfaGRyLT5zYWRkclsxXSwKKwkJICAgICAgIG1hY19oZHItPnNhZGRyWzJdLCBtYWNfaGRyLT5zYWRkclszXSwKKwkJICAgICAgIG1hY19oZHItPnNhZGRyWzRdLCBtYWNfaGRyLT5zYWRkcls1XSk7CisjZW5kaWYKKwkJbWFjX2ZyYW1lLT5kZXYgPSBkZXY7CisJCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSwgZGV2KTsKKwkJbmV0aWZfcngobWFjX2ZyYW1lKTsKKworCQkvKiBOb3cgdGVsbCB0aGUgY2FyZCB3ZSBoYXZlIGRlYWx0IHdpdGggdGhlIHJlY2VpdmVkIGZyYW1lICovCitkcm9wX2ZyYW1lOgorCQkvKiBTZXQgTElTUiBCaXQgMSAqLworCQl3cml0ZWwoTElTUl9BUkJfRlJFRSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQkvKiBJcyB0aGUgQVNCIGZyZWUgPyAqLworCisJCWlmICghKHJlYWRsKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8gKyBTSVNSKSAmIFNJU1JfQVNCX0ZSRUUpKSAKKwkJeworCQkJc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9IDE7CisJCQl3cml0ZWwoTElTUl9BU0JfRlJFRV9SRVEsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisJCQlyZXR1cm47CisJCQkvKiBEcm9wIG91dCBhbmQgd2FpdCBmb3IgdGhlIGJvdHRvbSBoYWxmIHRvIGJlIHJ1biAqLworCQl9CisKKworCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXNiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCXdyaXRldyhodG9ucyhBU0JfUkVDRUlWRV9EQVRBIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldygwLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisJCXdyaXRldyhodG9ucyhzdHJlYW1lcl9wcml2LT5tYWNfcnhfYnVmZmVyKSwgc3RyZWFtZXJfbW1pbyArIExBUEQpOworCisJCXdyaXRlbChMSVNSX0FTQl9SRVBMWSB8IExJU1JfQVNCX0ZSRUVfUkVRLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJCXN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPSAyOworCQlyZXR1cm47CisKKwl9IGVsc2UgaWYgKGFyYl93b3JkID09IEFSQl9MQU5fQ0hBTkdFX1NUQVRVUykgewkvKiBMYW4uY2hhbmdlLnN0YXR1cyAqLworCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXJiICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlsYW5fc3RhdHVzID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwkJZmR4X3Byb3RfZXJyb3IgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUEQpKSA+PiA4OworCQkKKwkJLyogSXNzdWUgQVJCIEZyZWUgKi8KKwkJd3JpdGV3KExJU1JfQVJCX0ZSRUUsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisKKwkJbGFuX3N0YXR1c19kaWZmID0gKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhbl9zdGF0dXMgXiBsYW5fc3RhdHVzKSAmIAorCQkgICAgbGFuX3N0YXR1czsgCisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIChMU0NfTFdGIHwgTFNDX0FSVyB8IExTQ19GUEUgfCBMU0NfUlIpKSAKKwkJeworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19MV0YpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNob3J0IGNpcmN1aXQgZGV0ZWN0ZWQgb24gdGhlIGxvYmVcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0FSVykKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXV0byByZW1vdmFsIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19GUEUpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZEWCBQcm90b2NvbCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUlIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZvcmNlIHJlbW92ZSBNQUMgZnJhbWUgcmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisKKwkJCS8qIEFkYXB0ZXIgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBoYXJkd2FyZSAqLworCisJCQkvKiByZXNldCB0eC9yeCBmaWZvJ3MgYW5kIGJ1c21hc3RlciBsb2dpYyAqLworCisJCQkvKiBAVEJELiBubyBsbGMgcmVzZXQgb24gYXV0b3N0cmVhbWVyIHdyaXRlbChyZWFkbChzdHJlYW1lcl9tbWlvK0JDVEwpfCgzPDwxMyksc3RyZWFtZXJfbW1pbytCQ1RMKTsKKwkJCSAgIHVkZWxheSgxKTsKKwkJCSAgIHdyaXRlbChyZWFkbChzdHJlYW1lcl9tbWlvK0JDVEwpJn4oMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7ICovCisKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG1hbnVhbGx5IHJlc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQkvKiBJZiBzZXJpb3VzIGVycm9yICovCisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKSB7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NJR19MT1NTKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIHNpZ25hbCBkZXRlY3RlZCBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0hBUkRfRVJSKSAKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmVhY29uaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU09GVF9FUlIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgdHJhbnNtaXR0ZWQgU29mdCBFcnJvciBSZXBvcnQgTWFjIEZyYW1lIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfVFJBTl9CQ04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdlIGFyZSB0cmFubWl0dGluZyB0aGUgYmVhY29uLCBhYWFoXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TUykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2luZ2xlIFN0YXRpb24gb24gdGhlIHJpbmcgXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19SSU5HX1JFQykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyByZWNvdmVyeSBvbmdvaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19GRFhfTU9ERSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlcmF0aW5nIGluIEZEWCBtb2RlXG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19DTykgeworCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvdW50ZXIgT3ZlcmZsb3cgXG4iLCBkZXYtPm5hbWUpOworCisJCQkvKiBJc3N1ZSBSRUFELkxPRyBjb21tYW5kICovCisKKwkJCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zcmIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJCXdyaXRldyhodG9ucyhTUkJfUkVBRF9MT0cgPDwgOCksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldygwLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisJCQlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMjsJLyogQ2FuJ3Qgc2xlZXAsIHVzZSBzcmJfYmggKi8KKworCQkJd3JpdGV3KExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKwkJfQorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU1JfQ08pIHsKKwkJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTb3VyY2Ugcm91dGluZyBjb3VudGVycyBvdmVyZmxvd1xuIiwgZGV2LT5uYW1lKTsKKworCQkJLyogSXNzdWUgYSBSRUFELlNSLkNPVU5URVJTICovCisJCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQl3cml0ZXcoaHRvbnMoU1JCX1JFQURfU1JfQ09VTlRFUlMgPDwgOCksCisJCQkgICAgICAgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwKKwkJCSAgICAgICBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDI7CS8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisJCQl3cml0ZXcoTElTUl9TUkJfQ01ELCBzdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJCX0KKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFuX3N0YXR1cyA9IGxhbl9zdGF0dXM7CisJfSAvKiBMYW4uY2hhbmdlLnN0YXR1cyAqLworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVua25vd24gYXJiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKworCWlmIChzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID09IDEpIAorCXsKKwkJLyogRHJvcHBlZCB0aHJvdWdoIHRoZSBmaXJzdCB0aW1lICovCisKKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFzYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQl3cml0ZXcoaHRvbnMoQVNCX1JFQ0VJVkVfREFUQSA8PCA4KSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldygwLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisJCXdyaXRldyhodG9ucyhzdHJlYW1lcl9wcml2LT5tYWNfcnhfYnVmZmVyKSwgc3RyZWFtZXJfbW1pbyArIExBUEQpOworCisJCXdyaXRlbChMSVNSX0FTQl9SRVBMWSB8IExJU1JfQVNCX0ZSRUVfUkVRLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCQlzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID0gMjsKKworCQlyZXR1cm47CisJfQorCisJaWYgKHN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMikgeworCQlfX3U4IHJjOworCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXNiICsgMiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlyYz1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUEQpKSA+PiA4OworCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgY29tbWFuZCBjb2RlIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjY6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGJ1ZmZlciBhZGRyZXNzIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4RkY6CisJCQkvKiBWYWxpZCByZXNwb25zZSwgZXZlcnl0aGluZyBzaG91bGQgYmUgb2sgYWdhaW4gKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgcmV0dXJuIGNvZGUgaW4gYXNiXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3UxNiBtYXhfbXR1OworCisJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPT0gNCkKKwkJbWF4X210dSA9IDQ1MDA7CisJZWxzZQorCQltYXhfbXR1ID0gMTgwMDA7CisKKwlpZiAobXR1ID4gbWF4X210dSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG10dSA8IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG10dTsKKwlzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6ID0gbXR1ICsgVFJfSExFTjsKKworCXJldHVybiAwOworfQorCisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgc3RyZWFtZXJfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnNkZXY9TlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSA9IE5VTEw7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW4gPSAwOworCW9mZl90IHBvcyA9IDA7CisJaW50IHNpemU7CisKKyAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCXNpemUgPSBzcHJpbnRmKGJ1ZmZlciwgIklCTSBMYW5TdHJlYW1lci9NUEMgQ2hpcHNldCBUb2tlbiBSaW5nIEFkYXB0ZXJzXG4iKTsKKworCXBvcyArPSBzaXplOworCWxlbiArPSBzaXplOworCisgIGZvcihzZGV2PWRldl9zdHJlYW1lcjsgc2Rldjsgc2Rldj1zZGV2LT5uZXh0KSB7CisgICAgcGNpX2RldmljZT1zZGV2LT5wY2lfZGV2OworICAgIGRldj1wY2lfZ2V0X2RydmRhdGEocGNpX2RldmljZSk7CisKKwkJCQlzaXplID0gc3ByaW50Zl9pbmZvKGJ1ZmZlciArIGxlbiwgZGV2KTsKKwkJCQlsZW4gKz0gc2l6ZTsKKwkJCQlwb3MgPSBiZWdpbiArIGxlbjsKKworCQkJCWlmIChwb3MgPCBvZmZzZXQpIHsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYmVnaW4gPSBwb3M7CisJCQkJfQorCQkJCWlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJCQkJCWJyZWFrOworCQl9CQkvKiBmb3IgKi8KKworCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IHNsb3AgKi8KKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CS8qIEVuZGluZyBzbG9wICovCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBzcHJpbnRmX2luZm8oY2hhciAqYnVmZmVyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXN0cnVjdCBzdHJlYW1lcl9hZGFwdGVyX2FkZHJfdGFibGUgc2F0OworCXN0cnVjdCBzdHJlYW1lcl9wYXJhbWV0ZXJzX3RhYmxlIHNwdDsKKwlpbnQgc2l6ZSA9IDA7CisJaW50IGk7CisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfYWRkcl90YWJsZV9hZGRyLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpICs9IDIpIHsKKwkJX191MTYgaW9fd29yZDsKKwkJX191OCAqZGF0YXAgPSAoX191OCAqKSAmIHNhdDsKKwkJaW9fd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKTsKKwkJZGF0YXBbc2l6ZV09aW9fd29yZCA+PiA4OworCQlkYXRhcFtzaXplKzFdPWlvX3dvcmQgJiAweGZmOworCX0KKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcGFybXNfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCWZvciAoaSA9IDA7IGkgPCA2ODsgaSArPSAyKSB7CisJCV9fdTE2IGlvX3dvcmQ7CisJCV9fdTggKmRhdGFwID0gKF9fdTggKikgJiBzcHQ7CisJCWlvX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSk7CisJCWRhdGFwW3NpemVdPWlvX3dvcmQgPj4gODsKKwkJZGF0YXBbc2l6ZSsxXT1pb193b3JkICYgMHhmZjsKKwl9CisKKworCXNpemUgPSBzcHJpbnRmKGJ1ZmZlciwgIlxuJTZzOiBBZGFwdGVyIEFkZHJlc3MgICA6IE5vZGUgQWRkcmVzcyAgICAgIDogRnVuY3Rpb25hbCBBZGRyXG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsCisJCSAgICAiJTZzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgIGRldi0+bmFtZSwgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkJICAgIGRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sCisJCSAgICBkZXYtPmRldl9hZGRyWzVdLCBzYXQubm9kZV9hZGRyWzBdLCBzYXQubm9kZV9hZGRyWzFdLAorCQkgICAgc2F0Lm5vZGVfYWRkclsyXSwgc2F0Lm5vZGVfYWRkclszXSwgc2F0Lm5vZGVfYWRkcls0XSwKKwkJICAgIHNhdC5ub2RlX2FkZHJbNV0sIHNhdC5mdW5jX2FkZHJbMF0sIHNhdC5mdW5jX2FkZHJbMV0sCisJCSAgICBzYXQuZnVuY19hZGRyWzJdLCBzYXQuZnVuY19hZGRyWzNdKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLCAiXG4lNnM6IFRva2VuIFJpbmcgUGFyYW1ldGVycyBUYWJsZTpcbiIsIGRldi0+bmFtZSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyICsgc2l6ZSwgIiU2czogUGh5c2ljYWwgQWRkciA6IFVwIE5vZGUgQWRkcmVzcyAgIDogUG9sbCBBZGRyZXNzICAgICAgOiBBY2NQcmkgOiBBdXRoIFNyYyA6IEF0dCBDb2RlIDpcbiIsIGRldi0+bmFtZSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyICsgc2l6ZSwKKwkJICAgICIlNnM6ICUwMng6JTAyeDolMDJ4OiUwMnggICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICAgOiAlMDR4ICAgICA6ICAlMDR4ICAgIDpcbiIsCisJCSAgICBkZXYtPm5hbWUsIHNwdC5waHlzX2FkZHJbMF0sIHNwdC5waHlzX2FkZHJbMV0sCisJCSAgICBzcHQucGh5c19hZGRyWzJdLCBzcHQucGh5c19hZGRyWzNdLAorCQkgICAgc3B0LnVwX25vZGVfYWRkclswXSwgc3B0LnVwX25vZGVfYWRkclsxXSwKKwkJICAgIHNwdC51cF9ub2RlX2FkZHJbMl0sIHNwdC51cF9ub2RlX2FkZHJbM10sCisJCSAgICBzcHQudXBfbm9kZV9hZGRyWzRdLCBzcHQudXBfbm9kZV9hZGRyWzRdLAorCQkgICAgc3B0LnBvbGxfYWRkclswXSwgc3B0LnBvbGxfYWRkclsxXSwgc3B0LnBvbGxfYWRkclsyXSwKKwkJICAgIHNwdC5wb2xsX2FkZHJbM10sIHNwdC5wb2xsX2FkZHJbNF0sIHNwdC5wb2xsX2FkZHJbNV0sCisJCSAgICBudG9ocyhzcHQuYWNjX3ByaW9yaXR5KSwgbnRvaHMoc3B0LmF1dGhfc291cmNlX2NsYXNzKSwKKwkJICAgIG50b2hzKHNwdC5hdHRfY29kZSkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsICIlNnM6IFNvdXJjZSBBZGRyZXNzICAgIDogQmNuIFQgOiBNYWouIFYgOiBMYW4gU3QgOiBMY2wgUmcgOiBNb24gRXJyIDogRnJhbWUgQ29ycmVsIDogXG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsCisJCSAgICAiJTZzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwNHggIDogJTA0eCAgIDogJTA0eCAgIDogJTA0eCAgIDogJTA0eCAgICA6ICAgICAlMDR4ICAgICA6IFxuIiwKKwkJICAgIGRldi0+bmFtZSwgc3B0LnNvdXJjZV9hZGRyWzBdLCBzcHQuc291cmNlX2FkZHJbMV0sCisJCSAgICBzcHQuc291cmNlX2FkZHJbMl0sIHNwdC5zb3VyY2VfYWRkclszXSwKKwkJICAgIHNwdC5zb3VyY2VfYWRkcls0XSwgc3B0LnNvdXJjZV9hZGRyWzVdLAorCQkgICAgbnRvaHMoc3B0LmJlYWNvbl90eXBlKSwgbnRvaHMoc3B0Lm1ham9yX3ZlY3RvciksCisJCSAgICBudG9ocyhzcHQubGFuX3N0YXR1cyksIG50b2hzKHNwdC5sb2NhbF9yaW5nKSwKKwkJICAgIG50b2hzKHNwdC5tb25fZXJyb3IpLCBudG9ocyhzcHQuZnJhbWVfY29ycmVsKSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyICsgc2l6ZSwgIiU2czogQmVhY29uIERldGFpbHMgOiAgVHggIDogIFJ4ICA6IE5BVU4gTm9kZSBBZGRyZXNzIDogTkFVTiBOb2RlIFBoeXMgOiBcbiIsCisJCSAgICBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsCisJCSAgICAiJTZzOiAgICAgICAgICAgICAgICA6ICAlMDJ4ICA6ICAlMDJ4ICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeCAgICA6IFxuIiwKKwkJICAgIGRldi0+bmFtZSwgbnRvaHMoc3B0LmJlYWNvbl90cmFuc21pdCksCisJCSAgICBudG9ocyhzcHQuYmVhY29uX3JlY2VpdmUpLCBzcHQuYmVhY29uX25hdW5bMF0sCisJCSAgICBzcHQuYmVhY29uX25hdW5bMV0sIHNwdC5iZWFjb25fbmF1blsyXSwKKwkJICAgIHNwdC5iZWFjb25fbmF1blszXSwgc3B0LmJlYWNvbl9uYXVuWzRdLAorCQkgICAgc3B0LmJlYWNvbl9uYXVuWzVdLCBzcHQuYmVhY29uX3BoeXNbMF0sCisJCSAgICBzcHQuYmVhY29uX3BoeXNbMV0sIHNwdC5iZWFjb25fcGh5c1syXSwKKwkJICAgIHNwdC5iZWFjb25fcGh5c1szXSk7CisJcmV0dXJuIHNpemU7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgU1RSRUFNRVJfSU9DVEwgJiYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK3N0YXRpYyBpbnQgc3RyZWFtZXJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisgICAgICAgIGludCBpOworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0gKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIElPQ1RMX1NJU1JfTUFTSzoKKwkJd3JpdGV3KFNJU1JfTUksIHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0tfU1VNKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9TUElOX0xPQ0tfVEVTVDoKKwkgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNwaW5fbG9jaygpIGNhbGxlZC5cbiIpOworCQlzcGluX2xvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCQlzcGluX3VubG9jaygmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jayk7CisJCXByaW50ayhLRVJOX0lORk8gInNwaW5fdW5sb2NrKCkgZmluaXNoZWQuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9QUklOVF9CREFTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYmRhczogUlhCREE6ICV4IFJYTEJEQTogJXggVFgyRkRBOiAleCBUWDJMRkRBOiAleFxuIiwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBSWEJEQSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgUlhMQkRBKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBUWDJGREEpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFRYMkxGREEpKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9QUklOVF9SRUdJU1RFUlM6CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyZWdpc3RlcnM6XG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0lTUjogJTA0eCBNSVNSOiAlMDR4IExJU1I6ICUwNHggQkNUTDogJTA0eCBCTUNUTDogJTA0eFxubWFzayAgJTA0eCBtYXNrICAlMDR4XG4iLCAKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTElTUiksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgQk1DVExfU1VNKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIE1JU1JfTUFTSykpOworCQlicmVhazsKKwljYXNlIElPQ1RMX1BSSU5UX1JYX0JVRlM6CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJQcmludCByeCBidWZzOlxuIik7CisJCWZvcihpPTA7IGk8U1RSRUFNRVJfUlhfUklOR19TSVpFOyBpKyspCisJCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAicnhfcmluZyAlZCBzdGF0dXM6IDB4JXhcbiIsIGksIAorCQkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbaV0uc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9QUklOVF9UWF9CVUZTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUHJpbnQgdHggYnVmczpcbiIpOworCQlmb3IoaT0wOyBpPFNUUkVBTUVSX1RYX1JJTkdfU0laRTsgaSsrKQorCQkgICAgICAgIHByaW50ayhLRVJOX0lORk8gInR4X3JpbmcgJWQgc3RhdHVzOiAweCV4XG4iLCBpLCAKKwkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLnN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUlhfQ01EOgorCSAgICAgICAgc3RyZWFtZXJfcngoZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2VudCByeCBjb21tYW5kLlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJCYWQgaW9jdGwhXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN0cmVhbWVyX3BjaV9kcml2ZXIgPSB7CisgIC5uYW1lICAgICA9ICJsYW5zdHJlYW1lciIsCisgIC5pZF90YWJsZSA9IHN0cmVhbWVyX3BjaV90YmwsCisgIC5wcm9iZSAgICA9IHN0cmVhbWVyX2luaXRfb25lLAorICAucmVtb3ZlICAgPSBfX2RldmV4aXRfcChzdHJlYW1lcl9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmVhbWVyX2luaXRfbW9kdWxlKHZvaWQpIHsKKyAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc3RyZWFtZXJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdHJlYW1lcl9jbGVhbnVwX21vZHVsZSh2b2lkKSB7CisgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3RyZWFtZXJfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN0cmVhbWVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHN0cmVhbWVyX2NsZWFudXBfbW9kdWxlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1N2Q4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogICBsYW5zdHJlYW1lci5oIC0tIGRyaXZlciBmb3IgdGhlIElCTSBBdXRvIExBTlN0cmVhbWVyIFBDSSBBZGFwdGVyCisgKgorICogIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisgKgorICogIExpbnV4IGRyaXZlciBmb3IgSUJNIFBDSSB0b2tlbnJpbmcgY2FyZHMgYmFzZWQgb24gdGhlIExhblN0cmVhbWVyIE1QQworICogIGNoaXBzZXQuIAorICoKKyAqICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgb2x5bXBpYyBkcml2ZXIgZm9yIElCTSBQQ0kgVG9rZW5SaW5nIGNhcmRzIChQaXQvUGl0LVBoeS9PbHltcGljCisgKiAgY2hpcHNldHMpIHdyaXR0ZW4gIGJ5OgorICogICAgICAxOTk5IFBldGVyIERlIFNjaHJpanZlciBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgkxOTk5IE1pa2UgUGhpbGxpcHMgKHBoaWxsaW1AYW10cmFrLmNvbSkKKyAqCisgKiAgQmFzZSBEcml2ZXIgU2tlbGV0b246CisgKiAgICAgIFdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogICAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgIAorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBOTyBXQVJSQU5UWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SICAgICAgICAKKyAqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUICAgICAgCisgKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyAgICAKKyAqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgICAgICAgCisgKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgICAgICAgIAorICogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvICAgICAKKyAqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsICAgICAgICAgCisgKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgIAorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICAgICAgICAKKyAqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EICAgCisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgIAorICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSAgICAKKyAqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCAgCisgKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgIAorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAKKyAqICAxMi8xMC85OSAtIEFscGhhIFJlbGVhc2UgMC4xLjAKKyAqICAgICAgICAgICAgRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisgKiAgMDgvMTUvMDEgLSBBZGRlZCBpb2N0bCgpIGRlZmluaXRpb25zIGFuZCBvdGhlcnMgLSBLZW50IFlvZGVyIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmIFNUUkVBTUVSX0lPQ1RMICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisjZGVmaW5lIElPQ1RMX1BSSU5UX1JYX0JVRlMgICBTSU9DREVWUFJJVkFURQorI2RlZmluZSBJT0NUTF9QUklOVF9UWF9CVUZTICAgU0lPQ0RFVlBSSVZBVEUrMQorI2RlZmluZSBJT0NUTF9SWF9DTUQgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMgorI2RlZmluZSBJT0NUTF9UWF9DTUQgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMworI2RlZmluZSBJT0NUTF9QUklOVF9SRUdJU1RFUlMgU0lPQ0RFVlBSSVZBVEUrNAorI2RlZmluZSBJT0NUTF9QUklOVF9CREFTICAgICAgU0lPQ0RFVlBSSVZBVEUrNQorI2RlZmluZSBJT0NUTF9TUElOX0xPQ0tfVEVTVCAgU0lPQ0RFVlBSSVZBVEUrNgorI2RlZmluZSBJT0NUTF9TSVNSX01BU0sgICAgICAgU0lPQ0RFVlBSSVZBVEUrNworI2VuZGlmCisKKy8qIE1BWF9JTlRSIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIGNhbiBsb29wCisgKiBpbnNpZGUgdGhlIGludGVycnVwdCBmdW5jdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgKiBjb250cm9sIHRvIHRoZSBPUyAobWF4aW11bSB2YWx1ZSBpcyAyNTYpCisgKi8KKyNkZWZpbmUgTUFYX0lOVFIgNQorCisjZGVmaW5lIENMUyAweDBDCisjZGVmaW5lIE1MUiAweDg2CisjZGVmaW5lIExUUiAweDBECisKKyNkZWZpbmUgQkNUTCAweDYwCisjZGVmaW5lIEJDVExfU09GVFJFU0VUICgxPDwxNSkKKyNkZWZpbmUgQkNUTF9SWF9GSUZPXzggKDE8PDEpCisjZGVmaW5lIEJDVExfVFhfRklGT184ICgxPDwzKQorCisjZGVmaW5lIEdQUiAweDRhCisjZGVmaW5lIEdQUl9BVVRPU0VOU0UgKDE8PDIpCisjZGVmaW5lIEdQUl8xNk1CUFMgKDE8PDMpCisKKyNkZWZpbmUgTElTUiAweDEwCisjZGVmaW5lIExJU1JfU1VNIDB4MTIKKyNkZWZpbmUgTElTUl9SVU0gMHgxNAorCisjZGVmaW5lIExJU1JfTElFICgxPDwxNSkKKyNkZWZpbmUgTElTUl9TTElNICgxPDwxMykKKyNkZWZpbmUgTElTUl9TTEkgKDE8PDEyKQorI2RlZmluZSBMSVNSX0JQRUkgKDE8PDkpCisjZGVmaW5lIExJU1JfQlBFICgxPDw4KQorI2RlZmluZSBMSVNSX1NSQl9DTUQgKDE8PDUpCisjZGVmaW5lIExJU1JfQVNCX1JFUExZICgxPDw0KQorI2RlZmluZSBMSVNSX0FTQl9GUkVFX1JFUSAoMTw8MikKKyNkZWZpbmUgTElTUl9BUkJfRlJFRSAoMTw8MSkKKyNkZWZpbmUgTElTUl9UUkJfRlJBTUUgKDE8PDApCisKKyNkZWZpbmUgU0lTUiAweDE2CisjZGVmaW5lIFNJU1JfU1VNIDB4MTgKKyNkZWZpbmUgU0lTUl9SVU0gMHgxQQorI2RlZmluZSBTSVNSX01BU0sgMHg1NAorI2RlZmluZSBTSVNSX01BU0tfU1VNIDB4NTYKKyNkZWZpbmUgU0lTUl9NQVNLX1JVTSAweDU4CisKKyNkZWZpbmUgU0lTUl9NSSAoMTw8MTUpCisjZGVmaW5lIFNJU1JfU0VSUl9FUlIgKDE8PDE0KQorI2RlZmluZSBTSVNSX1RJTUVSICgxPDwxMSkKKyNkZWZpbmUgU0lTUl9MQVBfUEFSX0VSUiAoMTw8MTApCisjZGVmaW5lIFNJU1JfTEFQX0FDQ19FUlIgKDE8PDkpCisjZGVmaW5lIFNJU1JfUEFSX0VSUiAoMTw8OCkKKyNkZWZpbmUgU0lTUl9BREFQVEVSX0NIRUNLICgxPDw2KQorI2RlZmluZSBTSVNSX1NSQl9SRVBMWSAoMTw8NSkKKyNkZWZpbmUgU0lTUl9BU0JfRlJFRSAoMTw8NCkKKyNkZWZpbmUgU0lTUl9BUkJfQ01EICgxPDwzKQorI2RlZmluZSBTSVNSX1RSQl9SRVBMWSAoMTw8MikKKworI2RlZmluZSBNSVNSX1JVTSAweDVBCisjZGVmaW5lIE1JU1JfTUFTSyAweDVDCisjZGVmaW5lIE1JU1JfTUFTS19SVU0gMHg1RQorCisjZGVmaW5lIE1JU1JfVFgyX0lETEUgKDE8PDE1KQorI2RlZmluZSBNSVNSX1RYMl9OT19TVEFUVVMgKDE8PDE0KQorI2RlZmluZSBNSVNSX1RYMl9IQUxUICgxPDwxMykKKyNkZWZpbmUgTUlTUl9UWDJfRU9GICgxPDwxMikKKyNkZWZpbmUgTUlTUl9UWDFfSURMRSAoMTw8MTEpCisjZGVmaW5lIE1JU1JfVFgxX05PX1NUQVRVUyAoMTw8MTApCisjZGVmaW5lIE1JU1JfVFgxX0hBTFQgKDE8PDkpCisjZGVmaW5lIE1JU1JfVFgxX0VPRiAoMTw8OCkKKyNkZWZpbmUgTUlTUl9SWF9OT0JVRiAoMTw8NSkKKyNkZWZpbmUgTUlTUl9SWF9FT0IgKDE8PDQpCisjZGVmaW5lIE1JU1JfUlhfTk9fU1RBVFVTICgxPDwyKQorI2RlZmluZSBNSVNSX1JYX0hBTFQgKDE8PDEpCisjZGVmaW5lIE1JU1JfUlhfRU9GICgxPDwwKQorCisjZGVmaW5lIExBUEEgMHg2MgorI2RlZmluZSBMQVBFIDB4NjQKKyNkZWZpbmUgTEFQRCAweDY2CisjZGVmaW5lIExBUERJTkMgMHg2OAorI2RlZmluZSBMQVBXV08gMHg2QQorI2RlZmluZSBMQVBXV0MgMHg2QworI2RlZmluZSBMQVBDVEwgMHg2RQorCisjZGVmaW5lIFRJTUVSIDB4NEU0CisKKyNkZWZpbmUgQk1DVExfU1VNIDB4NTAKKyNkZWZpbmUgQk1DVExfUlVNIDB4NTIKKyNkZWZpbmUgQk1DVExfVFgxX0RJUyAoMTw8MTQpCisjZGVmaW5lIEJNQ1RMX1RYMl9ESVMgKDE8PDEwKQorI2RlZmluZSBCTUNUTF9SWF9ESVMgKDE8PDYpCisjZGVmaW5lIEJNQ1RMX1JYX0VOQUJMRUQgICgxPDw1KQorCisjZGVmaW5lIFJYTEJEQSAgMHg5MAorI2RlZmluZSBSWEJEQSAgIDB4OTQKKyNkZWZpbmUgUlhTVEFUICAweDk4CisjZGVmaW5lIFJYREJBICAgMHg5QworCisjZGVmaW5lIFRYMUxGREEgMHhBMAorI2RlZmluZSBUWDFGREEgIDB4QTQKKyNkZWZpbmUgVFgxU1RBVCAweEE4CisjZGVmaW5lIFRYMURCQSAgMHhBQworI2RlZmluZSBUWDJMRkRBIDB4QjAKKyNkZWZpbmUgVFgyRkRBICAweEI0CisjZGVmaW5lIFRYMlNUQVQgMHhCOAorI2RlZmluZSBUWDJEQkEgIDB4QkMKKworI2RlZmluZSBTVFJFQU1FUl9JT19TUEFDRSAyNTYKKworI2RlZmluZSBTUkJfQ09NTUFORF9TSVpFIDUwCisKKyNkZWZpbmUgU1RSRUFNRVJfTUFYX0FEQVBURVJTIDgJLyogMHgwOCBfX01PRFVMRV9TVFJJTkcgY2FuJ3QgaGFuZCAweG5uICovCisKKy8qIERlZmluZXMgZm9yIExBTiBTVEFUVVMgQ0hBTkdFIHJlcG9ydHMgKi8KKyNkZWZpbmUgTFNDX1NJR19MT1NTIDB4ODAwMAorI2RlZmluZSBMU0NfSEFSRF9FUlIgMHg0MDAwCisjZGVmaW5lIExTQ19TT0ZUX0VSUiAweDIwMDAKKyNkZWZpbmUgTFNDX1RSQU5fQkNOIDB4MTAwMAorI2RlZmluZSBMU0NfTFdGICAgICAgMHgwODAwCisjZGVmaW5lIExTQ19BUlcgICAgICAweDA0MDAKKyNkZWZpbmUgTFNDX0ZQRSAgICAgIDB4MDIwMAorI2RlZmluZSBMU0NfUlIgICAgICAgMHgwMTAwCisjZGVmaW5lIExTQ19DTyAgICAgICAweDAwODAKKyNkZWZpbmUgTFNDX1NTICAgICAgIDB4MDA0MAorI2RlZmluZSBMU0NfUklOR19SRUMgMHgwMDIwCisjZGVmaW5lIExTQ19TUl9DTyAgICAweDAwMTAKKyNkZWZpbmUgTFNDX0ZEWF9NT0RFIDB4MDAwNAorCisvKiBEZWZpbmVzIGZvciBPUEVOIEFEQVBURVIgY29tbWFuZCAqLworCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FWFRfV1JBUCAoMTw8MTUpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfSEFSREVFICgxPDwxNCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0RJU19TT0ZURVJSICgxPDwxMykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX1BBU1NfQURDX01BQyAoMTw8MTIpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FUVF9NQUMgKDE8PDExKQorI2RlZmluZSBPUEVOX0FEQVBURVJfRU5BQkxFX0VDICgxPDwxMCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0NPTlRFTkRFUiAoMTw8OCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX1BBU1NfQkVBQ09OICgxPDw3KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRU5BQkxFX0ZEWCAoMTw8NikKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9SUEwgKDE8PDUpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTkhJQklUX0VUUiAoMTw8NCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0lOVEVSTkFMX1dSQVAgKDE8PDMpCisKKworLyogRGVmaW5lcyBmb3IgU1JCIENvbW1hbmRzICovCisjZGVmaW5lIFNSQl9DTE9TRV9BREFQVEVSIDB4MDQKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9CUklER0UgMHgwYworI2RlZmluZSBTUkJfQ09ORklHVVJFX0hQX0NIQU5ORUwgMHgxMworI2RlZmluZSBTUkJfTU9ESUZZX0JSSURHRV9QQVJNUyAweDE1CisjZGVmaW5lIFNSQl9NT0RJRllfT1BFTl9PUFRJT05TIDB4MDEKKyNkZWZpbmUgU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMgMHgxNworI2RlZmluZSBTUkJfTk9fT1BFUkFUSU9OIDB4MDAKKyNkZWZpbmUgU1JCX09QRU5fQURBUFRFUiAweDAzCisjZGVmaW5lIFNSQl9SRUFEX0xPRyAweDA4CisjZGVmaW5lIFNSQl9SRUFEX1NSX0NPVU5URVJTIDB4MTYKKyNkZWZpbmUgU1JCX1JFU0VUX0dST1VQX0FERFJFU1MgMHgwMgorI2RlZmluZSBTUkJfUkVTRVRfVEFSR0VUX1NFR01FVE4gMHgxNAorI2RlZmluZSBTUkJfU0FWRV9DT05GSUdVUkFUSU9OIDB4MWIKKyNkZWZpbmUgU1JCX1NFVF9CUklER0VfUEFSTVMgMHgwOQorI2RlZmluZSBTUkJfU0VUX0ZVTkNfQUREUkVTUyAweDA3CisjZGVmaW5lIFNSQl9TRVRfR1JPVVBfQUREUkVTUyAweDA2CisjZGVmaW5lIFNSQl9TRVRfVEFSR0VUX1NFR01FTlQgMHgwNQorCisvKiBDbGVhciByZXR1cm4gY29kZSAqLworI2RlZmluZSBTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSAweGZlCisKKy8qIEFSQiBDb21tYW5kcyAqLworI2RlZmluZSBBUkJfUkVDRUlWRV9EQVRBIDB4ODEKKyNkZWZpbmUgQVJCX0xBTl9DSEFOR0VfU1RBVFVTIDB4ODQKKworLyogQVNCIFJlc3BvbnNlIGNvbW1hbmRzICovCisjZGVmaW5lIEFTQl9SRUNFSVZFX0RBVEEgMHg4MQorCisKKy8qIFN0cmVhbWVyIGRlZmF1bHRzIGZvciBidWZmZXJzICovCisKKyNkZWZpbmUgU1RSRUFNRVJfUlhfUklOR19TSVpFIDE2CS8qIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIgKi8KKy8qIFNldHRpbmcgdGhlIG51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyB0byAxIGlzIGEgd29ya2Fyb3VuZCBmb3IgYW4KKyAqIHVuZG9jdW1lbnRlZCBoYXJkd2FyZSBwcm9ibGVtIHdpdGggdGhlIGxhbnN0cmVhbWVyIGJvYXJkLiBTZXR0aW5nCisgKiB0aGlzIHRvIHNvbWV0aGluZyBoaWdoZXIgbWF5IHNsaWdodGx5IGluY3JlYXNlIHRoZSB0aHJvdWdocHV0IHlvdQorICogY2FuIGdldCBmcm9tIHRoZSBjYXJkLCBidXQgYXQgdGhlIHJpc2sgb2YgbG9ja2luZyB1cCB0aGUgYm94LiAtIAorICogPHlvZGVyMUB1cy5pYm0uY29tPgorICovCisjZGVmaW5lIFNUUkVBTUVSX1RYX1JJTkdfU0laRSAxCS8qIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaIDQwOTYJCS8qIERlZmF1bHQgcGFja2V0IHNpemUgKi8KKworLyogU3RyZWFtZXIgZGF0YSBzdHJ1Y3R1cmVzICovCisKK3N0cnVjdCBzdHJlYW1lcl90eF9kZXNjIHsKKwlfX3UzMiBmb3J3YXJkOworCV9fdTMyIHN0YXR1czsKKwlfX3UzMiBidWZjbnRfZnJhbWVsZW47CisJX191MzIgYnVmZmVyOworCV9fdTMyIGJ1ZmxlbjsKKwlfX3UzMiByc3ZkMTsKKwlfX3UzMiByc3ZkMjsKKwlfX3UzMiByc3ZkMzsKK307CisKK3N0cnVjdCBzdHJlYW1lcl9yeF9kZXNjIHsKKwlfX3UzMiBmb3J3YXJkOworCV9fdTMyIHN0YXR1czsKKwlfX3UzMiBidWZmZXI7CisJX191MzIgZnJhbWVsZW5fYnVmbGVuOworfTsKKworc3RydWN0IG1hY19yZWNlaXZlX2J1ZmZlciB7CisJX191MTYgbmV4dDsKKwlfX3U4IHBhZGRpbmc7CisJX191OCBmcmFtZV9zdGF0dXM7CisJX191MTYgYnVmZmVyX2xlbmd0aDsKKwlfX3U4IGZyYW1lX2RhdGE7Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSB7CisKKwlfX3UxNiBzcmI7CisJX191MTYgdHJiOworCV9fdTE2IGFyYjsKKwlfX3UxNiBhc2I7CisKKyAgICAgICAgc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKm5leHQ7CisgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbzsKKyAgICAgICAgY2hhciAqc3RyZWFtZXJfY2FyZF9uYW1lOworIAorICAgICAgICBzcGlubG9ja190IHN0cmVhbWVyX2xvY2s7CisKKwl2b2xhdGlsZSBpbnQgc3JiX3F1ZXVlZDsJLyogVHJ1ZSBpZiBhbiBTUkIgaXMgc3RpbGwgcG9zdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3JiX3dhaXQ7CisKKwl2b2xhdGlsZSBpbnQgYXNiX3F1ZXVlZDsJLyogVHJ1ZSBpZiBhbiBBU0IgaXMgcG9zdGVkICovCisKKwl2b2xhdGlsZSBpbnQgdHJiX3F1ZXVlZDsJLyogVHJ1ZSBpZiBhIFRSQiBpcyBwb3N0ZWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB0cmJfd2FpdDsKKworCXN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjICpzdHJlYW1lcl9yeF9yaW5nOworCXN0cnVjdCBzdHJlYW1lcl90eF9kZXNjICpzdHJlYW1lcl90eF9yaW5nOworCXN0cnVjdCBza19idWZmICp0eF9yaW5nX3NrYltTVFJFQU1FUl9UWF9SSU5HX1NJWkVdLAorCSAgICAqcnhfcmluZ19za2JbU1RSRUFNRVJfUlhfUklOR19TSVpFXTsKKwlpbnQgdHhfcmluZ19mcmVlLCB0eF9yaW5nX2xhc3Rfc3RhdHVzLCByeF9yaW5nX2xhc3RfcmVjZWl2ZWQsCisJICAgIGZyZWVfdHhfcmluZ19lbnRyaWVzOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RyZWFtZXJfc3RhdHM7CisJX191MTYgc3RyZWFtZXJfbGFuX3N0YXR1czsKKwlfX3U4IHN0cmVhbWVyX3Jpbmdfc3BlZWQ7CisJX191MTYgcGt0X2J1Zl9zejsKKwlfX3U4IHN0cmVhbWVyX3JlY2VpdmVfb3B0aW9ucywgc3RyZWFtZXJfY29weV9hbGxfb3B0aW9ucywKKwkgICAgc3RyZWFtZXJfbWVzc2FnZV9sZXZlbDsKKwlfX3UxNiBzdHJlYW1lcl9hZGRyX3RhYmxlX2FkZHIsIHN0cmVhbWVyX3Bhcm1zX2FkZHI7CisJX191MTYgbWFjX3J4X2J1ZmZlcjsKKwlfX3U4IHN0cmVhbWVyX2xhYVs2XTsKK307CisKK3N0cnVjdCBzdHJlYW1lcl9hZGFwdGVyX2FkZHJfdGFibGUgeworCisJX191OCBub2RlX2FkZHJbNl07CisJX191OCByZXNlcnZlZFs0XTsKKwlfX3U4IGZ1bmNfYWRkcls0XTsKK307CisKK3N0cnVjdCBzdHJlYW1lcl9wYXJhbWV0ZXJzX3RhYmxlIHsKKworCV9fdTggcGh5c19hZGRyWzRdOworCV9fdTggdXBfbm9kZV9hZGRyWzZdOworCV9fdTggdXBfcGh5c19hZGRyWzRdOworCV9fdTggcG9sbF9hZGRyWzZdOworCV9fdTE2IHJlc2VydmVkOworCV9fdTE2IGFjY19wcmlvcml0eTsKKwlfX3UxNiBhdXRoX3NvdXJjZV9jbGFzczsKKwlfX3UxNiBhdHRfY29kZTsKKwlfX3U4IHNvdXJjZV9hZGRyWzZdOworCV9fdTE2IGJlYWNvbl90eXBlOworCV9fdTE2IG1ham9yX3ZlY3RvcjsKKwlfX3UxNiBsYW5fc3RhdHVzOworCV9fdTE2IHNvZnRfZXJyb3JfdGltZTsKKwlfX3UxNiByZXNlcnZlZDE7CisJX191MTYgbG9jYWxfcmluZzsKKwlfX3UxNiBtb25fZXJyb3I7CisJX191MTYgYmVhY29uX3RyYW5zbWl0OworCV9fdTE2IGJlYWNvbl9yZWNlaXZlOworCV9fdTE2IGZyYW1lX2NvcnJlbDsKKwlfX3U4IGJlYWNvbl9uYXVuWzZdOworCV9fdTMyIHJlc2VydmVkMjsKKwlfX3U4IGJlYWNvbl9waHlzWzRdOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWUyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCkBAIC0wLDAgKzEsODAwIEBACisvKgorICogIG1hZGdlbWMuYzogRHJpdmVyIGZvciB0aGUgTWFkZ2UgU21hcnQgMTYvNCBNQzE2IE1DQSB0b2tlbiByaW5nIGNhcmQuCisgKgorICogIFdyaXR0ZW4gMjAwMCBieSBBZGFtIEZyaXR6bGVyCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICBUaGlzIGRyaXZlciBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjYXJkczoKKyAqICAgICAgLSBNYWRnZSBTbWFydCAxNi80IFJpbmdub2RlIE1DMTYKKyAqCS0gTWFkZ2UgU21hcnQgMTYvNCBSaW5nbm9kZSBNQzMyICg/PykKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEFGCUFkYW0gRnJpdHpsZXIJCW1pZEBhdWsuY3gKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkxNi1KYW4tMDAJQUYJQ3JlYXRlZAorICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gIm1hZGdlbWMuYzogdjAuOTEgMjMvMDEvMjAwMCBieSBBZGFtIEZyaXR6bGVyXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKyNpbmNsdWRlICJtYWRnZW1jLmgiICAgICAgICAgICAgLyogTWFkZ2Utc3BlY2lmaWMgY29uc3RhbnRzICovCisKKyNkZWZpbmUgTUFER0VNQ19JT19FWFRFTlQgMzIKKyNkZWZpbmUgTUFER0VNQ19TSUZfT0ZGU0VUIDB4MDgKKworc3RydWN0IG1hZGdlbWNfY2FyZCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qCisJICogVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgQklBIFJPTS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbWFuaWQ7CisJdW5zaWduZWQgaW50IGNhcmR0eXBlOworCXVuc2lnbmVkIGludCBjYXJkcmV2OworCXVuc2lnbmVkIGludCByYW1zaXplOworCQorCS8qCisJICogVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgTUNBIFBPUyByZWdpc3RlcnMuICAKKwkgKi8KKwl1bnNpZ25lZCBpbnQgYnVyc3Rtb2RlOjI7CisJdW5zaWduZWQgaW50IGZhaXJuZXNzOjE7IC8qIDAgPSBGYWlyLCAxID0gVW5mYWlyICovCisJdW5zaWduZWQgaW50IGFyYmxldmVsOjQ7CisJdW5zaWduZWQgaW50IHJpbmdzcGVlZDoyOyAvKiAwID0gNG1iLCAxID0gMTYsIDIgPSBBdXRvL25vbmUgKi8KKwl1bnNpZ25lZCBpbnQgY2FibGV0eXBlOjE7IC8qIDAgPSBSSjQ1LCAxID0gREI5ICovCisKKwlzdHJ1Y3QgbWFkZ2VtY19jYXJkICpuZXh0OworfTsKK3N0YXRpYyBzdHJ1Y3QgbWFkZ2VtY19jYXJkICptYWRnZW1jX2NhcmRfbGlzdDsKKworCitzdGF0aWMgaW50IG1hZGdlbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFkZ2VtY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFkZ2VtY19jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtYWRnZW1jX3JlYWRfcm9tKHN0cnVjdCBtYWRnZW1jX2NhcmQgKmNhcmQpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1hZGdlbWNfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRjYWJsZXR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHR5cGUpOworCitzdGF0aWMgaW50IG1hZGdlbWNfbWNhcHJvYyhjaGFyICpidWYsIGludCBzbG90LCB2b2lkICpkKTsKKworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRyZWdwYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwYWdlKTsKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0c2lmc2VsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2YWwpOworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRpbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWRnZW1jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyoKKyAqIFRoZXNlIHdvcmsgYXJvdW5kIHBhZ2luZywgaG93ZXZlciB0aGV5IGRvbid0IGd1YXJlbnRlZSB5b3UncmUgb24gdGhlCisgKiByaWdodCBwYWdlLgorICovCisjZGVmaW5lIFNJRlJFQURCKHJlZykgKGluYihkZXYtPmJhc2VfYWRkciArICgocmVnPDB4OCk/cmVnOnJlZy0weDgpKSkKKyNkZWZpbmUgU0lGV1JJVEVCKHZhbCwgcmVnKSAob3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgKChyZWc8MHg4KT9yZWc6cmVnLTB4OCkpKQorI2RlZmluZSBTSUZSRUFEVyhyZWcpIChpbncoZGV2LT5iYXNlX2FkZHIgKyAoKHJlZzwweDgpP3JlZzpyZWctMHg4KSkpCisjZGVmaW5lIFNJRldSSVRFVyh2YWwsIHJlZykgKG91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArICgocmVnPDB4OCk/cmVnOnJlZy0weDgpKSkKKworLyoKKyAqIFJlYWQgYSBieXRlLWxlbmd0aCB2YWx1ZSBmcm9tIHRoZSByZWdpc3Rlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1hZGdlbWNfc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHJldDsKKwlpZiAocmVnPDB4OCkJCisJCXJldCA9IFNJRlJFQURCKHJlZyk7CisJZWxzZSB7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDEpOwkKKwkJcmV0ID0gU0lGUkVBREIocmVnKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIGJ5dGUtbGVuZ3RoIHZhbHVlIHRvIGEgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWlmIChyZWc8MHg4KQorCQlTSUZXUklURUIodmFsLCByZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsKKwkJU0lGV1JJVEVCKHZhbCwgcmVnKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFJlYWQgYSB3b3JkLWxlbmd0aCB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1hZGdlbWNfc2lmcmVhZHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHJldDsKKwlpZiAocmVnPDB4OCkJCisJCXJldCA9IFNJRlJFQURXKHJlZyk7CisJZWxzZSB7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDEpOwkKKwkJcmV0ID0gU0lGUkVBRFcocmVnKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIHdvcmQtbGVuZ3RoIHZhbHVlIHRvIGEgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWlmIChyZWc8MHg4KQorCQlTSUZXUklURVcodmFsLCByZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsKKwkJU0lGV1JJVEVXKHZhbCwgcmVnKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisJfQorCXJldHVybjsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IG1hZGdlbWNfcHJvYmUodm9pZCkKK3sJCisJc3RhdGljIGludCB2ZXJzaW9ucHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCXN0cnVjdCBtYWRnZW1jX2NhcmQgKmNhcmQ7CisJaW50IGksc2xvdCA9IDA7CisJX191OCBwb3NyZWdbNF07CisKKwlpZiAoIU1DQV9idXMpCisJCXJldHVybiAtMTsJCisgCisJd2hpbGUgKHNsb3QgIT0gTUNBX05PVEZPVU5EKSB7CisJCS8qCisJCSAqIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgdGhlIE1DMTYvMzIgKE1DQSBJRCAwMDJkKQorCQkgKi8KKwkJc2xvdCA9IG1jYV9maW5kX3VudXNlZF9hZGFwdGVyKDB4MDAyZCwgc2xvdCk7CisJCWlmIChzbG90ID09IE1DQV9OT1RGT1VORCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIGFuIGFkYXB0ZXIuCisJCSAqLworCQlpZiAodmVyc2lvbnByaW50ZWQrKyA9PSAwKQorCQkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJCWlmIChkZXYgPT0gTlVMTCkgeworCQkJcHJpbnRrKCJtYWRnZW1jOiB1bmFibGUgdG8gYWxsb2NhdGUgZGV2IHNwYWNlXG4iKTsKKwkJCWlmIChtYWRnZW1jX2NhcmRfbGlzdCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT5kbWEgPSAwOworCisJCS8qCisJCSAqIEZldGNoIE1DQSBjb25maWcgcmVnaXN0ZXJzCisJCSAqLworCQlmb3IoaT0wO2k8NDtpKyspCisJCQlwb3NyZWdbaV0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIGkrMik7CisJCQorCQljYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1hZGdlbWNfY2FyZCksIEdGUF9LRVJORUwpOworCQlpZiAoY2FyZD09TlVMTCkgeworCQkJcHJpbnRrKCJtYWRnZW1jOiB1bmFibGUgdG8gYWxsb2NhdGUgY2FyZCBzdHJ1Y3RcbiIpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWlmIChtYWRnZW1jX2NhcmRfbGlzdCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljYXJkLT5kZXYgPSBkZXY7CisKKwkJLyoKKwkJICogUGFyc2UgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgYWxsIGNvbWVzCisJCSAqIGRpcmVjdGx5IGZyb20gdGhlIHB1YmxpY2x5IGF2YWlsYWJsZSBAMDAyZC5BREYuCisJCSAqIEdldCBpdCBmcm9tIE1hZGdlIG9yIHlvdXIgbG9jYWwgQURGIGxpYnJhcnkuCisJCSAqLworCisJCS8qCisJCSAqIEJhc2UgYWRkcmVzcyAKKwkJICovCisJCWRldi0+YmFzZV9hZGRyID0gMHgwYTIwICsgCisJCQkoKHBvc3JlZ1syXSAmIE1DMTZfUE9TMl9BRERSMik/MHgwNDAwOjApICsKKwkJCSgocG9zcmVnWzBdICYgTUMxNl9QT1MwX0FERFIxKT8weDEwMDA6MCkgKworCQkJKChwb3NyZWdbM10gJiBNQzE2X1BPUzNfQUREUjMpPzB4MjAwMDowKTsKKworCQkvKgorCQkgKiBJbnRlcnJ1cHQgbGluZQorCQkgKi8KKwkJc3dpdGNoKHBvc3JlZ1swXSA+PiA2KSB7IC8qIHVwcGVyIHR3byBiaXRzICovCisJCWNhc2UgMHgxOiBkZXYtPmlycSA9IDM7IGJyZWFrOworCQljYXNlIDB4MjogZGV2LT5pcnEgPSA5OyBicmVhazsgLyogSVJRIDIgPSBJUlEgOSAqLworCQljYXNlIDB4MzogZGV2LT5pcnEgPSAxMDsgYnJlYWs7CisJCWRlZmF1bHQ6IGRldi0+aXJxID0gMDsgYnJlYWs7CisJCX0KKworCQlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQkJcHJpbnRrKCIlczogaW52YWxpZCBJUlFcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGdldG91dDE7CisJCX0KKworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBNQURHRU1DX0lPX0VYVEVOVCwgCisJCQkJICAgIm1hZGdlbWMiKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFkZ2VtYzogdW5hYmxlIHRvIHNldHVwIFNtYXJ0IE1DIGluIHNsb3QgJWQgYmVjYXVzZSBvZiBJL08gYmFzZSBjb25mbGljdCBhdCAweCUwNGx4XG4iLCBzbG90LCBkZXYtPmJhc2VfYWRkcik7CisJCQlkZXYtPmJhc2VfYWRkciArPSBNQURHRU1DX1NJRl9PRkZTRVQ7CisJCQlnb3RvIGdldG91dDE7CisJCX0KKwkJZGV2LT5iYXNlX2FkZHIgKz0gTUFER0VNQ19TSUZfT0ZGU0VUOworCQkKKwkJLyoKKwkJICogQXJiaXRyYXRpb24gTGV2ZWwKKwkJICovCisJCWNhcmQtPmFyYmxldmVsID0gKChwb3NyZWdbMF0gPj4gMSkgJiAweDcpICsgODsKKworCQkvKgorCQkgKiBCdXJzdCBtb2RlIGFuZCBGYWlybmVzcworCQkgKi8KKwkJY2FyZC0+YnVyc3Rtb2RlID0gKChwb3NyZWdbMl0gPj4gNikgJiAweDMpOworCQljYXJkLT5mYWlybmVzcyA9ICgocG9zcmVnWzJdID4+IDQpICYgMHgxKTsKKworCQkvKgorCQkgKiBSaW5nIFNwZWVkCisJCSAqLworCQlpZiAoKHBvc3JlZ1sxXSA+PiAyKSYweDEpCisJCQljYXJkLT5yaW5nc3BlZWQgPSAyOyAvKiBub3Qgc2VsZWN0ZWQgKi8KKwkJZWxzZSBpZiAoKHBvc3JlZ1syXSA+PiA1KSAmIDB4MSkKKwkJCWNhcmQtPnJpbmdzcGVlZCA9IDE7IC8qIDE2TWIgKi8KKwkJZWxzZQorCQkJY2FyZC0+cmluZ3NwZWVkID0gMDsgLyogNE1iICovCisKKwkJLyogCisJCSAqIENhYmxlIHR5cGUKKwkJICovCisJCWlmICgocG9zcmVnWzFdID4+IDYpJjB4MSkKKwkJCWNhcmQtPmNhYmxldHlwZSA9IDE7IC8qIFNUUC9EQjkgKi8KKwkJZWxzZQorCQkJY2FyZC0+Y2FibGV0eXBlID0gMDsgLyogVVRQL1JKLTQ1ICovCisKKworCQkvKiAKKwkJICogUk9NIEluZm8uIFRoaXMgcmVxdWlyZXMgdXMgdG8gYWN0dWFsbHkgdHdpZGRsZQorCQkgKiBiaXRzIG9uIHRoZSBjYXJkLCBzbyB3ZSBtdXN0IGVuc3VyZSBhYm92ZSB0aGF0IAorCQkgKiB0aGUgYmFzZSBhZGRyZXNzIGlzIGZyZWUgb2YgY29uZmxpY3QgKHJlcXVlc3RfcmVnaW9uIGFib3ZlKS4KKwkJICovCisJCW1hZGdlbWNfcmVhZF9yb20oY2FyZCk7CisJCQorCQlpZiAoY2FyZC0+bWFuaWQgIT0gMHg0ZCkgeyAvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hZGdlIE1DIFJPTSByZWFkIGZhaWxlZCAodW5rbm93biBtYW51ZmFjdHVyZXIgSUQgJTAyeClcbiIsIGRldi0+bmFtZSwgY2FyZC0+bWFuaWQpOworCQkJZ290byBnZXRvdXQ7CisJCX0KKwkJCisJCWlmICgoY2FyZC0+Y2FyZHR5cGUgIT0gMHgwOCkgJiYgKGNhcmQtPmNhcmR0eXBlICE9IDB4MGQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWFkZ2UgTUMgUk9NIHJlYWQgZmFpbGVkICh1bmtub3duIGNhcmQgSUQgJTAyeClcbiIsIGRldi0+bmFtZSwgY2FyZC0+Y2FyZHR5cGUpOworCQkJZ290byBnZXRvdXQ7CisJCX0KKwkgICAgICAgCisJCS8qIEFsbCBjYXJkcyBleGNlcHQgUmV2IDAgYW5kIDEgTUMxNidzIGhhdmUgMjU2a2Igb2YgUkFNICovCisJCWlmICgoY2FyZC0+Y2FyZHR5cGUgPT0gMHgwOCkgJiYgKGNhcmQtPmNhcmRyZXYgPD0gMHgwMSkpCisJCQljYXJkLT5yYW1zaXplID0gMTI4OworCQllbHNlCisJCQljYXJkLT5yYW1zaXplID0gMjU2OworCisJCXByaW50aygiJXM6ICVzIFJldiAlZCBhdCAweCUwNGx4IElSUSAlZFxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUsIAorCQkgICAgICAgKGNhcmQtPmNhcmR0eXBlID09IDB4MDgpP01BREdFTUMxNl9DQVJETkFNRToKKwkJICAgICAgIE1BREdFTUMzMl9DQVJETkFNRSwgY2FyZC0+Y2FyZHJldiwgCisJCSAgICAgICBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCisJCWlmIChjYXJkLT5jYXJkdHlwZSA9PSAweDBkKQorCQkJcHJpbnRrKCIlczogICAgIFdhcm5pbmc6IE1DMzIgc3VwcG9ydCBpcyBleHBlcmltZW50YWwgYW5kIGhpZ2hseSB1bnRlc3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCisJCWlmIChjYXJkLT5yaW5nc3BlZWQ9PTIpIHsgLyogVW5rbm93biAqLworCQkJcHJpbnRrKCIlczogICAgIFdhcm5pbmc6IFJpbmcgc3BlZWQgbm90IHNldCBpbiBQT1MgLS0gUGxlYXNlIHJ1biB0aGUgcmVmZXJlbmNlIGRpc2sgYW5kIHNldCBpdCFcbiIsIGRldi0+bmFtZSk7CisJCQljYXJkLT5yaW5nc3BlZWQgPSAxOyAvKiBkZWZhdWx0IHRvIDE2bWIgKi8KKwkJfQorCQkKKwkJcHJpbnRrKCIlczogICAgIFJBTSBTaXplOiAlZEtCXG4iLCBkZXYtPm5hbWUsIGNhcmQtPnJhbXNpemUpOworCisJCXByaW50aygiJXM6ICAgICBSaW5nIFNwZWVkOiAlZE1iL3NlYyBvbiAlc1xuIiwgZGV2LT5uYW1lLCAKKwkJICAgICAgIChjYXJkLT5yaW5nc3BlZWQpPzE2OjQsIAorCQkgICAgICAgY2FyZC0+Y2FibGV0eXBlPyJTVFAvREI5IjoiVVRQL1JKLTQ1Iik7CisJCXByaW50aygiJXM6ICAgICBBcmJpdHJhdGlvbiBMZXZlbDogJWRcbiIsIGRldi0+bmFtZSwgCisJCSAgICAgICBjYXJkLT5hcmJsZXZlbCk7CisKKwkJcHJpbnRrKCIlczogICAgIEJ1cnN0IE1vZGU6ICIsIGRldi0+bmFtZSk7CisJCXN3aXRjaChjYXJkLT5idXJzdG1vZGUpIHsKKwkJY2FzZSAwOiBwcmludGsoIkN5Y2xlIHN0ZWFsIik7IGJyZWFrOworCQljYXNlIDE6IHByaW50aygiTGltaXRlZCBidXJzdCIpOyBicmVhazsKKwkJY2FzZSAyOiBwcmludGsoIkRlbGF5ZWQgcmVsZWFzZSIpOyBicmVhazsKKwkJY2FzZSAzOiBwcmludGsoIkltbWVkaWF0ZSByZWxlYXNlIik7IGJyZWFrOworCQl9CisJCXByaW50aygiICglcylcbiIsIChjYXJkLT5mYWlybmVzcyk/IlVuZmFpciI6IkZhaXIiKTsKKworCisJCS8qIAorCQkgKiBFbmFibGUgU0lGIGJlZm9yZSB3ZSBhc3NpZ24gdGhlIGludGVycnVwdCBoYW5kbGVyLAorCQkgKiBqdXN0IGluIGNhc2Ugd2UgZ2V0IHNwdXJpb3VzIGludGVycnVwdHMgdGhhdCBuZWVkCisJCSAqIGhhbmRsaW5nLgorCQkgKi8gCisJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOyAvKiBzYW5pdHkgKi8KKwkJbWFkZ2VtY19zZXRzaWZzZWwoZGV2LCAxKTsKKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBtYWRnZW1jX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgICAgICAgIm1hZGdlbWMiLCBkZXYpKSAKKwkJCWdvdG8gZ2V0b3V0OworCQkKKwkJbWFkZ2VtY19jaGlwc2V0X2luaXQoZGV2KTsgLyogZW5hYmxlcyBpbnRlcnJ1cHRzISAqLworCQltYWRnZW1jX3NldGNhYmxldHlwZShkZXYsIGNhcmQtPmNhYmxldHlwZSk7CisKKwkJLyogU2V0dXAgTUNBIHN0cnVjdHVyZXMgKi8KKwkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgKGNhcmQtPmNhcmR0eXBlID09IDB4MDgpP01BREdFTUMxNl9DQVJETkFNRTpNQURHRU1DMzJfQ0FSRE5BTUUpOworCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIG1hZGdlbWNfbWNhcHJvYywgZGV2KTsKKwkJbWNhX21hcmtfYXNfdXNlZChzbG90KTsKKworCQlwcmludGsoIiVzOiAgICAgUmluZyBTdGF0aW9uIEFkZHJlc3M6ICIsIGRldi0+bmFtZSk7CisJCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwkJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJCXByaW50aygiOiUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCXByaW50aygiXG4iKTsKKworCQkvKiBYWFggaXMgSVNBX01BWF9BRERSRVNTIGNvcnJlY3QgaGVyZT8gKi8KKwkJaWYgKHRtc2Rldl9pbml0KGRldiwgSVNBX01BWF9BRERSRVNTLCBOVUxMKSkgeworCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGRldi0+cHJpdi5cbiIsIAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkci1NQURHRU1DX1NJRl9PRkZTRVQsIAorCQkJICAgICAgIE1BREdFTUNfSU9fRVhURU5UKTsgCisJCQkKKwkJCWtmcmVlKGNhcmQpOworCQkJdG1zZGV2X3Rlcm0oZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlpZiAobWFkZ2VtY19jYXJkX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCS8qIAorCQkgKiBUaGUgTUMxNiBpcyBwaHlzaWNhbGx5IGEgMzJiaXQgY2FyZC4gIEhvd2V2ZXIsIE1hZGdlCisJCSAqIGluc2lzdHMgb24gY2FsbGluZyBpdCAxNmJpdCwgc28gSSdsbCBhc3N1bWUgaGVyZSB0aGF0CisJCSAqIHRoZXkga25vdyB3aGF0IHRoZXkncmUgdGFsa2luZyBhYm91dC4gIEN1dCBvZmYgRE1BCisJCSAqIGF0IDE2bWIuCisJCSAqLworCQl0cC0+c2V0bnNlbG91dCA9IG1hZGdlbWNfc2V0bnNlbG91dF9waW5zOworCQl0cC0+c2lmd3JpdGViID0gbWFkZ2VtY19zaWZ3cml0ZWI7CisJCXRwLT5zaWZyZWFkYiA9IG1hZGdlbWNfc2lmcmVhZGI7CisJCXRwLT5zaWZ3cml0ZXcgPSBtYWRnZW1jX3NpZndyaXRldzsKKwkJdHAtPnNpZnJlYWR3ID0gbWFkZ2VtY19zaWZyZWFkdzsKKwkJdHAtPkRhdGFSYXRlID0gKGNhcmQtPnJpbmdzcGVlZCk/U1BFRURfMTY6U1BFRURfNDsKKworCQltZW1jcHkodHAtPlByb2R1Y3RJRCwgIk1hZGdlIE1DQSAxNi80ICAgICIsIFBST0RfSURfU0laRSArIDEpOworCisJCWRldi0+b3BlbiA9IG1hZGdlbWNfb3BlbjsKKwkJZGV2LT5zdG9wID0gbWFkZ2VtY19jbG9zZTsKKworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJLyogRW5saXN0IGluIHRoZSBjYXJkIGxpc3QgKi8KKwkJCWNhcmQtPm5leHQgPSBtYWRnZW1jX2NhcmRfbGlzdDsKKwkJCW1hZGdlbWNfY2FyZF9saXN0ID0gY2FyZDsKKwkJCXNsb3QrKzsKKwkJCWNvbnRpbnVlOyAvKiBzdWNjZXNzZnVsLCB0cnkgdG8gZmluZCBhbm90aGVyICovCisJCX0KKwkJCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWdldG91dDoKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHItTUFER0VNQ19TSUZfT0ZGU0VULCAKKwkJCSAgICAgICBNQURHRU1DX0lPX0VYVEVOVCk7IAorCWdldG91dDE6CisJCWtmcmVlKGNhcmQpOworCQlmcmVlX25ldGRldihkZXYpOworCQlzbG90Kys7CisJfQorCisJaWYgKG1hZGdlbWNfY2FyZF9saXN0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBIYW5kbGUgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGNhcmQKKyAqCisgKiBUaGUgTWljcm9DaGFubmVsIE1hZGdlIGNhcmRzIG5lZWQgc2xpZ2h0bHkgbW9yZSBoYW5kbGluZworICogYWZ0ZXIgYW4gaW50ZXJydXB0IHRoYW4gb3RoZXIgVE1TMzgwIGNhcmRzIGRvLgorICoKKyAqIEZpcnN0IHdlIG11c3QgbWFrZSBzdXJlIGl0IHdhcyB0aGlzIGNhcmQgdGhhdCBnZW5lcmF0ZWQgdGhlCisgKiBpbnRlcnJ1cHQgKHNpbmNlIGludGVycnVwdCBzaGFyaW5nIGlzIGFsbG93ZWQpLiAgVGhlbiwKKyAqIGJlY2F1c2Ugd2UncmUgdXNpbmcgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMgKGFzIGlzCisgKiBzdGFuZGFyZCBvbiBNQ0EpLCB3ZSBtdXN0IHRvZ2dsZSB0aGUgaW50ZXJydXB0IGxpbmUKKyAqIG9uIHRoZSBjYXJkIGluIG9yZGVyIHRvIGNsYWltIGFuZCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0LgorICogT25jZSB0aGF0IGlzIGRvbmUsIHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGhhbmRsYWJsZSBpbgorICogdGhlIG5vcm1hbCB0bXMzODB0cl9pbnRlcnJ1cHQoKSByb3V0aW5lLgorICoKKyAqIFRoZXJlJ3MgdHdvIHdheXMgd2UgY2FuIGNoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IGlzIG91cnMsCisgKiBib3RoIHdpdGggdGhlaXIgb3duIGRpc2FkdmFudGFnZXMuLi4KKyAqCisgKiAxKSAgCVJlYWQgaW4gdGhlIFNJRlNUUyByZWdpc3RlciBmcm9tIHRoZSBUTVMgY29udHJvbGxlci4gIFRoaXMKKyAqCWlzIGd1YXJlbnRlZWQgdG8gYmUgYWNjdXJhdGUsIGhvd2V2ZXIsIHRoZXJlJ3MgYSBmYWlybHkKKyAqCWxhcmdlIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGRvaW5nIHNvOiB0aGUgTWFkZ2UgY2hpcHMKKyAqCW11c3QgcmVxdWVzdCB0aGUgcmVnaXN0ZXIgZnJvbSB0aGUgRWFnbGUsIHRoZSBFYWdsZSBtdXN0CisgKglyZWFkIHRoZW0gZnJvbSBpdHMgaW50ZXJuYWwgYnVzLCBhbmQgdGhlbiB0YWtlIHRoZSByb3V0ZQorICoJYmFjayBvdXQgYWdhaW4sIGZvciBhIDE2Yml0IHJlYWQuICAKKyAqCisgKiAyKQlVc2UgdGhlIE1DX0NPTlRST0xfUkVHMF9TSU5UUiBiaXQgZnJvbSB0aGUgTWFkZ2UgQVNJQ3MuCisgKglUaGUgbWFqb3IgZGlzYWR2YW50YWdlIGhlcmUgaXMgdGhhdCB0aGUgYWNjdXJhY3kgb2YgdGhlCisgKgliaXQgaXMgaW4gcXVlc3Rpb24uICBIb3dldmVyLCBpdCBjdXRzIG91dCB0aGUgZXh0cmEgcmVhZAorICoJY3ljbGVzIGl0IHRha2VzIHRvIHJlYWQgdGhlIEVhZ2xlJ3MgU0lGLCBhcyBpdHMgb25seSBhbgorICoJOGJpdCByZWFkLCBhbmQgdGhlb3JldGljYWxseSB0aGUgTWFkZ2UgYml0IGlzIGRpcmVjdGx5CisgKgljb25uZWN0ZWQgdG8gdGhlIGludGVycnVwdCBsYXRjaCBjb21pbmcgb3V0IG9mIHRoZSBFYWdsZQorICoJaGFyZHdhcmUgKHRoYXQgc3RhdGVtZW50IGlzIG5vdCB2ZXJpZmllZCkuICAKKyAqCisgKiBJIGNhbid0IGRldGVybWluZSB3aGljaCBvZiB0aGVzZSBtZXRob2RzIGhhcyB0aGUgYmVzdCB3aW4uICBGb3Igbm93LAorICogd2UgbWFrZSBhIGNvbXByb21pc2UuICBVc2UgdGhlIE1hZGdlIHdheSBmb3IgdGhlIGZpcnN0IGludGVycnVwdCwKKyAqIHdoaWNoIHNob3VsZCBiZSB0aGUgZmFzdC1wYXRoLCBhbmQgdGhlbiBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgCisgKiBpbnRlcnJ1cHQsIGtlZXAgb24gdHJ5aW5nIHVzaW5nIHRoZSBTSUYgbWV0aG9kIHVudGlsIHdlJ3ZlCisgKiBleGhhdXN0ZWQgYWxsIGNvbnRpZ3VvdXMgaW50ZXJydXB0cy4KKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWRnZW1jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBwZW5kaW5nLHJlZzE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmICghZGV2X2lkKSB7CisJCXByaW50aygibWFkZ2VtY19pbnRlcnJ1cHQ6IHdhcyBub3QgcGFzc2VkIGEgZGV2X2lkIVxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisKKwkvKiBNYWtlIHN1cmUgaXRzIHJlYWxseSB1cy4gLS0gdGhlIE1hZGdlIHdheSAqLworCXBlbmRpbmcgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCWlmICghKHBlbmRpbmcgJiBNQ19DT05UUk9MX1JFRzBfU0lOVFIpKQorCQlyZXR1cm4gSVJRX05PTkU7IC8qIG5vdCBvdXIgaW50ZXJydXB0ICovCisKKwkvKgorCSAqIFNpbmNlIHdlJ3JlIGxldmVsLXRyaWdnZXJlZCwgd2UgbWF5IG1pc3MgdGhlIHJpc2luZyBlZGdlCisJICogb2YgdGhlIG5leHQgaW50ZXJydXB0IHdoaWxlIHdlJ3JlIG9mZiBoYW5kbGluZyB0aGlzIG9uZSwKKwkgKiBzbyBrZWVwIGNoZWNraW5nIHVudGlsIHRoZSBTSUYgdmVyaWZpZXMgdGhhdCBpdCBoYXMgbm90aGluZworCSAqIGxlZnQgZm9yIHVzIHRvIGRvLgorCSAqLworCXBlbmRpbmcgPSBTVFNfU1lTVEVNX0lSUTsKKwlkbyB7CisJCWlmIChwZW5kaW5nICYgU1RTX1NZU1RFTV9JUlEpIHsKKworCQkJLyogVG9nZ2xlIHRoZSBpbnRlcnJ1cHQgdG8gcmVzZXQgdGhlIGxhdGNoIG9uIGNhcmQgKi8KKwkJCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCQkJb3V0YihyZWcxIF4gTUNfQ09OVFJPTF9SRUcxX1NJTlRFTiwgCisJCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwkJCW91dGIocmVnMSwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJCQkvKiBDb250aW51ZSBoYW5kbGluZyBhcyBub3JtYWwgKi8KKwkJCXRtczM4MHRyX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7CisKKwkJCXBlbmRpbmcgPSBTSUZSRUFEVyhTSUZTVFMpOyAvKiByZXN0YXJ0IC0gdGhlIFNJRiB3YXkgKi8KKworCQl9IGVsc2UKKwkJCXJldHVybiBJUlFfSEFORExFRDsgCisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7IC8qIG5vdCByZWFjaGFibGUgKi8KK30KKworLyoKKyAqIFNldCB0aGUgY2FyZCB0byB0aGUgcHJlZmVyZWQgcmluZyBzcGVlZC4KKyAqCisgKiBVbmxpa2UgbmV3ZXIgY2FyZHMsIHRoZSBNQzE2LzMyIGhhdmUgdGhlaXIgc3BlZWQgc2VsZWN0aW9uCisgKiBjaXJjdWl0IGNvbm5lY3RlZCB0byB0aGUgTWFkZ2UgQVNJQ3MgYW5kIG5vdCB0byB0aGUgVE1TMzgwCisgKiBOU0VMT1VUIHBpbnMuIFNldCB0aGUgQVNJQyBiaXRzIGNvcnJlY3RseSBoZXJlLCBhbmQgcmV0dXJuIAorICogemVybyB0byBsZWF2ZSB0aGUgVE1TIE5TRUxPVVQgYml0cyB1bmFmZmVjdGVkLgorICoKKyAqLwordW5zaWduZWQgc2hvcnQgbWFkZ2VtY19zZXRuc2Vsb3V0X3BpbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZzE7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzE2KQorCQlyZWcxIHw9IE1DX0NPTlRST0xfUkVHMV9TUEVFRF9TRUw7IC8qIGFkZCBmb3IgMTZtYiAqLworCWVsc2UgaWYgKHJlZzEgJiBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMKQorCQlyZWcxIF49IE1DX0NPTlRST0xfUkVHMV9TUEVFRF9TRUw7IC8qIHJlbW92ZSBmb3IgNG1iICovCisJb3V0YihyZWcxLCBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwlyZXR1cm4gMDsgLyogbm8gY2hhbmdlICovCit9CisKKy8qCisgKiBTZXQgdGhlIHJlZ2lzdGVyIHBhZ2UuICBUaGlzIGVxdWF0ZXMgdG8gdGhlIFNSU1ggbGluZQorICogb24gdGhlIFRNUzM4MEN4Ni4KKyAqCisgKiBSZWdpc3RlciBzZWxlY3Rpb24gaXMgbm9ybWFsbHkgZG9uZSB2aWEgdGhyZWUgY29udGlndW91cworICogYml0cy4gIEhvd2V2ZXIsIHNvbWUgYm9hcmRzIChzdWNoIGFzIHRoZSBNQzE2LzMyKSB1c2Ugb25seQorICogdHdvIGJpdHMsIHBsdXMgYSBzZXBhcmF0ZSBiaXQgaW4gdGhlIGdsdWUgY2hpcC4gIFRoaXMKKyAqIHNldHMgdGhlIFNSU1ggYml0ICh0aGUgdG9wIGJpdCkuICBTZWUgcGFnZSA0LTE3IGluIHRoZQorICogWWVsbG93IEJvb2sgZm9yIHdoaWNoIHJlZ2lzdGVycyBhcmUgYWZmZWN0ZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldHJlZ3BhZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBhZ2UpCit7CQorCXN0YXRpYyBpbnQgcmVnMTsKKworCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCWlmICgocGFnZSA9PSAwKSAmJiAocmVnMSAmIE1DX0NPTlRST0xfUkVHMV9TUlNYKSkgeworCQlvdXRiKHJlZzEgXiBNQ19DT05UUk9MX1JFRzFfU1JTWCwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCX0KKwllbHNlIGlmIChwYWdlID09IDEpIHsKKwkJb3V0YihyZWcxIHwgTUNfQ09OVFJPTF9SRUcxX1NSU1gsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwl9CisJcmVnMSA9IGluYihkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgU0lGIHJlZ2lzdGVycyBhcmUgbm90IG1hcHBlZCBpbnRvIHJlZ2lzdGVyIHNwYWNlIGJ5IGRlZmF1bHQKKyAqIFNldCB0aGlzIHRvIDEgdG8gbWFwIHRoZW0sIDAgdG8gbWFwIHRoZSBCSUEgUk9NLgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRzaWZzZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnMDsKKworCXJlZzAgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCWlmICgodmFsID09IDApICYmIChyZWcwICYgTUNfQ09OVFJPTF9SRUcwX1NJRlNFTCkpIHsKKwkJb3V0YihyZWcwIF4gTUNfQ09OVFJPTF9SRUcwX1NJRlNFTCwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCX0gZWxzZSBpZiAodmFsID09IDEpIHsKKwkJb3V0YihyZWcwIHwgTUNfQ09OVFJPTF9SRUcwX1NJRlNFTCwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCX0JCisJcmVnMCA9IGluYihkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBFbmFibGUgU0lGIGludGVycnVwdHMKKyAqCisgKiBUaGlzIGRvZXMgbm90IGVuYWJsZSBpbnRlcnJ1cHRzIGluIHRoZSBTSUYsIGJ1dCByYXRoZXIKKyAqIGVuYWJsZXMgU0lGIGludGVycnVwdHMgdG8gYmUgcGFzc2VkIG9udG8gdGhlIGhvc3QuCisgKgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldGludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCByZWcxOworCisJcmVnMSA9IGluYihkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJaWYgKCh2YWwgPT0gMCkgJiYgKHJlZzEgJiBNQ19DT05UUk9MX1JFRzFfU0lOVEVOKSkgeworCQlvdXRiKHJlZzEgXiBNQ19DT05UUk9MX1JFRzFfU0lOVEVOLCAKKwkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJfSBlbHNlIGlmICh2YWwgPT0gMSkgeworCQlvdXRiKHJlZzEgfCBNQ19DT05UUk9MX1JFRzFfU0lOVEVOLCAKKwkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogQ2FibGUgdHlwZSBpcyBzZXQgdmlhIGNvbnRyb2wgcmVnaXN0ZXIgNy4gQml0IHplcm8gaGlnaAorICogZm9yIFVUUCwgbG93IGZvciBTVFAuCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0Y2FibGV0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0eXBlKQoreworCW91dGIoKHR5cGU9PTApP01DX0NPTlRST0xfUkVHN19DQUJMRVVUUDpNQ19DT05UUk9MX1JFRzdfQ0FCTEVTVFAsCisJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHNyk7Cit9CisKKy8qCisgKiBFbmFibGUgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgTWFkZ2UgY2hpcHNldCBuZWVkZWQgZm9yCisgKiBmdWxsIHdvcmtpbmcgb3JkZXIuIAorICovCitzdGF0aWMgaW50IG1hZGdlbWNfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7IC8qIHB1bGwgU1JFU0VUIGxvdyAqLworCXRtczM4MHRyX3dhaXQoMTAwKTsgLyogd2FpdCBmb3IgY2FyZCB0byByZXNldCAqLworCisJLyogYnJpbmcgYmFjayBpbnRvIG5vcm1hbCBvcGVyYXRpbmcgbW9kZSAqLworCW91dGIoTUNfQ09OVFJPTF9SRUcxX05TUkVTRVQsIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCS8qIG1hcCBTSUYgcmVnaXN0ZXJzICovCisJbWFkZ2VtY19zZXRzaWZzZWwoZGV2LCAxKTsKKworCS8qIGVuYWJsZSBTSUYgaW50ZXJydXB0cyAqLworCW1hZGdlbWNfc2V0aW50KGRldiwgMSk7IAorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaXNhYmxlIHRoZSBib2FyZCwgYW5kIHB1dCBiYWNrIGludG8gcG93ZXItdXAgc3RhdGUuCisgKi8KK3ZvaWQgbWFkZ2VtY19jaGlwc2V0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbWFkZ2VtY19zZXRpbnQoZGV2LCAwKTsKKwkvKiB1bm1hcCBTSUYgcmVnaXN0ZXJzICovCisJbWFkZ2VtY19zZXRzaWZzZWwoZGV2LCAwKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFJlYWQgdGhlIGNhcmQgdHlwZSAoTUMxNiBvciBNQzMyKSBmcm9tIHRoZSBjYXJkLgorICoKKyAqIFRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBhcmUgc3RvcmVkIGluIHR3byBzZXBhcmF0ZQorICogcGFnZXMuICBQYWdlcyBhcmUgZmxpcHBlZCBieSBjbGVhcmluZyBiaXQgMyBvZiBDT05UUk9MX1JFRzAgKFBBR0UpCisgKiBmb3IgcGFnZSB6ZXJvLCBvciBzZXR0aW5nIGJpdCAzIGZvciBwYWdlIG9uZS4KKyAqCisgKiBQYWdlIHplcm8gY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhOgorICoJQnl0ZSAwOiBNYW51ZmFjdHVyZXIgSUQgKDB4NEQgLS0gQVNDSUkgIk0iKQorICoJQnl0ZSAxOiBDYXJkIHR5cGU6CisgKgkJCTB4MDggZm9yIE1DMTYKKyAqCQkJMHgwRCBmb3IgTUMzMgorICoJQnl0ZSAyOiBDYXJkIHJldmlzaW9uCisgKglCeXRlIDM6IE1pcnJvciBvZiBQT1MgY29uZmlnIHJlZ2lzdGVyIDAKKyAqCUJ5dGUgNDogTWlycm9yIG9mIFBPUyAxCisgKglCeXRlIDU6IE1pcnJvciBvZiBQT1MgMgorICoKKyAqIFBhZ2Ugb25lIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YToKKyAqCUJ5dGUgMDogVW51c2VkCisgKglCeXRlIDEtNjogQklBLCBNU0IgdG8gTFNCLgorICoKKyAqIE5vdGUgdGhhdCB0byByZWFkIHRoZSBCSUEsIHdlIG11c3QgdW5tYXAgdGhlIFNJRiByZWdpc3RlcnMKKyAqIGJ5IGNsZWFyaW5nIGJpdCAyIG9mIENPTlRST0xfUkVHMCAoU0lGU0VMKSwgYXMgdGhlIGRhdGEKKyAqIHdpbGwgcmVzaWRlIGluIHRoZSBzYW1lIGxvZ2ljYWwgbG9jYXRpb24uICBGb3IgdGhpcyByZWFzb24sCisgKiBfbmV2ZXJfIHJlYWQgdGhlIEJJQSB3aGlsZSB0aGUgRWFnbGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmchCisgKiBUaGUgU0lGIHdpbGwgYmUgY29tcGxldGVseSBpbmFjY2Vzc2libGUgdW50aWwgdGhlIEJJQSBvcGVyYXRpb24KKyAqIGlzIGNvbXBsZXRlLgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19yZWFkX3JvbShzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXVuc2lnbmVkIGNoYXIgcmVnMCwgcmVnMSwgdG1wcmVnMCwgaTsKKworCWlvYWRkciA9IGNhcmQtPmRldi0+YmFzZV9hZGRyOworCisJcmVnMCA9IGluYihpb2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCXJlZzEgPSBpbmIoaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCS8qIFN3aXRjaCB0byBwYWdlIHplcm8gYW5kIHVubWFwIFNJRiAqLworCXRtcHJlZzAgPSByZWcwICYgfihNQ19DT05UUk9MX1JFRzBfUEFHRSArIE1DX0NPTlRST0xfUkVHMF9TSUZTRUwpOworCW91dGIodG1wcmVnMCwgaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwkKKwljYXJkLT5tYW5pZCA9IGluYihpb2FkZHIgKyBNQ19ST01fTUFOVUZBQ1RVUkVSSUQpOworCWNhcmQtPmNhcmR0eXBlID0gaW5iKGlvYWRkciArIE1DX1JPTV9BREFQVEVSSUQpOworCWNhcmQtPmNhcmRyZXYgPSBpbmIoaW9hZGRyICsgTUNfUk9NX1JFVklTSU9OKTsKKworCS8qIFN3aXRjaCB0byByb20gcGFnZSBvbmUgKi8KKwlvdXRiKHRtcHJlZzAgfCBNQ19DT05UUk9MX1JFRzBfUEFHRSwgaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKworCS8qIFJlYWQgQklBICovCisJY2FyZC0+ZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJY2FyZC0+ZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBNQ19ST01fQklBX1NUQVJUICsgaSk7CisJCisJLyogUmVzdG9yZSBvcmlnaW5hbCByZWdpc3RlciB2YWx1ZXMgKi8KKwlvdXRiKHJlZzAsIGlvYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisJb3V0YihyZWcxLCBpb2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCQorCXJldHVybjsKK30KKworc3RhdGljIGludCBtYWRnZW1jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorCS8qCisJICogR28gYWhlYWQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgY2hpcHNldCBhZ2FpbiwganVzdCB0byAKKwkgKiBtYWtlIHN1cmUgd2UgZGlkbid0IGdldCBsZWZ0IGluIGEgYmFkIHN0YXRlLgorCSAqLworCW1hZGdlbWNfY2hpcHNldF9pbml0KGRldik7CisJdG1zMzgwdHJfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hZGdlbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0bXMzODB0cl9jbG9zZShkZXYpOworCW1hZGdlbWNfY2hpcHNldF9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZSBzb21lIGRldGFpbHMgYXZhaWxhYmxlIGZyb20gL3Byb2MvbWNhL3Nsb3RYCisgKi8KK3N0YXRpYyBpbnQgbWFkZ2VtY19tY2Fwcm9jKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpIAorewkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZDsKKwlzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjdXJjYXJkID0gbWFkZ2VtY19jYXJkX2xpc3Q7CisJaW50IGxlbiA9IDA7CisJCisJd2hpbGUgKGN1cmNhcmQpIHsgLyogc2VhcmNoIGZvciBjYXJkIHN0cnVjdCAqLworCQlpZiAoY3VyY2FyZC0+ZGV2ID09IGRldikKKwkJCWJyZWFrOworCQljdXJjYXJkID0gY3VyY2FyZC0+bmV4dDsKKwl9CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIi0tLS0tLS1cbiIpOworCWlmIChjdXJjYXJkKSB7CisJCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaW50IGk7CisJCQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQ2FyZCBSZXZpc2lvbjogJWRcbiIsIGN1cmNhcmQtPmNhcmRyZXYpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiUkFNIFNpemU6ICVka2JcbiIsIGN1cmNhcmQtPnJhbXNpemUpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQ2FibGUgdHlwZTogJXNcbiIsIChjdXJjYXJkLT5jYWJsZXR5cGUpPyJTVFAvREI5IjoiVVRQL1JKLTQ1Iik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJDb25maWd1cmVkIHJpbmcgc3BlZWQ6ICVkTWIvc2VjXG4iLCAoY3VyY2FyZC0+cmluZ3NwZWVkKT8xNjo0KTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlJ1bm5pbmcgcmluZyBzcGVlZDogJWRNYi9zZWNcbiIsICh0cC0+RGF0YVJhdGU9PVNQRUVEXzE2KT8xNjo0KTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkRldmljZTogJXNcbiIsIGRldi0+bmFtZSk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJJTyBQb3J0OiAweCUwNGx4XG4iLCBkZXYtPmJhc2VfYWRkcik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJJUlE6ICVkXG4iLCBkZXYtPmlycSk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJBcmJpdHJhdGlvbiBMZXZlbDogJWRcbiIsIGN1cmNhcmQtPmFyYmxldmVsKTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkJ1cnN0IE1vZGU6ICIpOworCQlzd2l0Y2goY3VyY2FyZC0+YnVyc3Rtb2RlKSB7CisJCWNhc2UgMDogbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkN5Y2xlIHN0ZWFsIik7IGJyZWFrOworCQljYXNlIDE6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJMaW1pdGVkIGJ1cnN0Iik7IGJyZWFrOworCQljYXNlIDI6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJEZWxheWVkIHJlbGVhc2UiKTsgYnJlYWs7CisJCWNhc2UgMzogbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkltbWVkaWF0ZSByZWxlYXNlIik7IGJyZWFrOworCQl9CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgKCVzKVxuIiwgKGN1cmNhcmQtPmZhaXJuZXNzKT8iVW5mYWlyIjoiRmFpciIpOworCQkKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiKTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJcbiIpOworCX0gZWxzZSAKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkNhcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hZGdlbWNfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG1hZGdlbWNfY2FyZCAqdGhpc19jYXJkOworCQorCXdoaWxlIChtYWRnZW1jX2NhcmRfbGlzdCkgeworCQlkZXYgPSBtYWRnZW1jX2NhcmRfbGlzdC0+ZGV2OworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkci1NQURHRU1DX1NJRl9PRkZTRVQsIE1BREdFTUNfSU9fRVhURU5UKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXRtc2Rldl90ZXJtKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXRoaXNfY2FyZCA9IG1hZGdlbWNfY2FyZF9saXN0OworCQltYWRnZW1jX2NhcmRfbGlzdCA9IHRoaXNfY2FyZC0+bmV4dDsKKwkJa2ZyZWUodGhpc19jYXJkKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KG1hZGdlbWNfcHJvYmUpOworbW9kdWxlX2V4aXQobWFkZ2VtY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIG1hZGdlbWMuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgbWFkZ2VtYy5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDgyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIAorICogbWFkZ2VtYy5oOiBIZWFkZXIgZm9yIHRoZSBtYWRnZW1jIHRtczM4MHRyIG1vZHVsZQorICoKKyAqIEF1dGhvcnM6CisgKiAtIEFkYW0gRnJpdHpsZXIgPG1pZEBhdWsuY3g+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01BREdFTUNfSAorI2RlZmluZSBfX0xJTlVYX01BREdFTUNfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1BREdFTUMxNl9DQVJETkFNRSAiTWFkZ2UgU21hcnQgMTYvNCBNQzE2IFJpbmdub2RlIgorI2RlZmluZSBNQURHRU1DMzJfQ0FSRE5BTUUgIk1hZGdlIFNtYXJ0IDE2LzQgTUMzMiBSaW5nbm9kZSIKKworLyogCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBQT1MgY29uZmlnIHJlZ2lzdGVycworICovCisjZGVmaW5lIE1DMTZfUE9TMF9BRERSMSAweDIwCisjZGVmaW5lIE1DMTZfUE9TMl9BRERSMiAweDA0CisjZGVmaW5lIE1DMTZfUE9TM19BRERSMyAweDIwCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwCQkoKGxvbmcpLTgpIC8qIDB4MDAgKi8KKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxCQkoKGxvbmcpLTcpIC8qIDB4MDEgKi8KKyNkZWZpbmUgTUNfQURBUFRFUl9QT1NfUkVHMAkoKGxvbmcpLTYpIC8qIDB4MDIgKi8KKyNkZWZpbmUgTUNfQURBUFRFUl9QT1NfUkVHMQkoKGxvbmcpLTUpIC8qIDB4MDMgKi8KKyNkZWZpbmUgTUNfQURBUFRFUl9QT1NfUkVHMgkoKGxvbmcpLTQpIC8qIDB4MDQgKi8KKyNkZWZpbmUgTUNfQURBUFRFUl9SRUc1X1VOVVNFRAkoKGxvbmcpLTMpIC8qIDB4MDUgKi8KKyNkZWZpbmUgTUNfQURBUFRFUl9SRUc2X1VOVVNFRAkoKGxvbmcpLTIpIC8qIDB4MDYgKi8KKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUc3CQkoKGxvbmcpLTEpIC8qIDB4MDcgKi8KKworI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfVU5LTk9XTjEJMHgwMQorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfVU5LTk9XTjIJMHgwMgorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfU0lGU0VMCQkweDA0CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMF9QQUdFCQkweDA4CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMF9URVNUSU5URVJSVVBUCTB4MTAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV04yMAkweDIwCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMF9TSU5UUgkJMHg0MAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfVU5LTk9XTjgwCTB4ODAKKworI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfU0lOVEVOCQkweDAxCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9CSVRPRkRFQVRICTB4MDIKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX05TUkVTRVQJCTB4MDQKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1VOS05PV044CTB4MDgKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1VOS05PV04xMAkweDEwCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9VTktOT1dOMjAJMHgyMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfU1JTWAkJMHg0MAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMCTB4ODAKKworI2RlZmluZSBNQ19DT05UUk9MX1JFRzdfQ0FCTEVTVFAJMHgwMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzdfQ0FCTEVVVFAJMHgwMQorCisvKgorICogUk9NIFBhZ2UgWmVybworICovCisjZGVmaW5lIE1DX1JPTV9NQU5VRkFDVFVSRVJJRAkJMHgwMAorI2RlZmluZSBNQ19ST01fQURBUFRFUklECQkweDAxCisjZGVmaW5lIE1DX1JPTV9SRVZJU0lPTgkJCTB4MDIKKyNkZWZpbmUgTUNfUk9NX0NPTkZJRzAJCQkweDAzCisjZGVmaW5lIE1DX1JPTV9DT05GSUcxCQkJMHgwNAorI2RlZmluZSBNQ19ST01fQ09ORklHMgkJCTB4MDUKKworLyoKKyAqIFJPTSBQYWdlIE9uZQorICovCisjZGVmaW5lIE1DX1JPTV9VTlVTRURfQllURQkJMHgwMAorI2RlZmluZSBNQ19ST01fQklBX1NUQVJUCQkweDAxCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19MSU5VWF9NQURHRU1DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzkyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCkBAIC0wLDAgKzEsMTc4NiBAQAorLyoKKyAqICAgb2x5bXBpYy5jIChjKSAxOTk5IFBldGVyIERlIFNjaHJpanZlciBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgkJICAgMTk5OS8yMDAwIE1pa2UgUGhpbGxpcHMgKG1pa2VwQGxpbnV4dHIubmV0KQorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBQaXQvUGl0LVBoeS9PbHltcGljCisgKiAgY2hpcHNldC4gCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiAgVGhhbmtzIHRvIEVyaWsgRGUgQ29jaywgQWRyaWFuIEJyaWRnZXR0IGFuZCBGcmFuayBGaWVuZSBmb3IgdGhlaXIgCisgKiAgYXNzaXN0YW5jZSBhbmQgcGVyc2VydmVyYW5jZSB3aXRoIHRoZSB0ZXN0aW5nIG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIAorICogIDQvMjcvOTkgLSBBbHBoYSBSZWxlYXNlIDAuMS4wCisgKiAgICAgICAgICAgIEZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworICoKKyAqICA2LzgvOTkgIC0gT2ZmaWNpYWwgUmVsZWFzZSAwLjIuMCAgIAorICogICAgICAgICAgICBNZXJnZWQgaW50byB0aGUga2VybmVsIGNvZGUgCisgKiAgOC8xOC85OSAtIFVwZGF0ZWQgZHJpdmVyIGZvciAyLjMuMTMga2VybmVsIHRvIHVzZSBuZXcgcGNpCisgKgkgICAgICByZXNvdXJjZS4gRHJpdmVyIGFsc28gcmVwb3J0cyB0aGUgY2FyZCBuYW1lIHJldHVybmVkIGJ5CisgKiAgICAgICAgICAgIHRoZSBwY2kgcmVzb3VyY2UuCisgKiAgMS8xMS8wMCAtIEFkZGVkIHNwaW5sb2NrcyBmb3Igc21wCisgKiAgMi8yMy8wMCAtIFVwZGF0ZWQgdG8gZGV2X2tmcmVlX2lycSAKKyAqICAzLzEwLzAwIC0gRml4ZWQgRkRYIGVuYWJsZSB3aGljaCB0cmlnZ2VyZWQgb3RoZXIgYnVncyBhbHNvIAorICogICAgICAgICAgICBzcXVhc2hlZC4KKyAqICA1LzIwLzAwIC0gQ2hhbmdlcyB0byBoYW5kbGUgT2x5bXBpYyBvbiBMaW51eFBQQy4gRW5kaWFuIGNoYW5nZXMuCisgKiAgICAgICAgICAgIFRoZSBvZGQgdGhpbmcgYWJvdXQgdGhlIGNoYW5nZXMgaXMgdGhhdCB0aGUgZml4IGZvcgorICogICAgICAgICAgICBlbmRpYW4gaXNzdWVzIHdpdGggdGhlIGJpZy1lbmRpYW4gZGF0YSBpbiB0aGUgYXJiLCBhc2IuLi4KKyAqICAgICAgICAgICAgd2FzIHRvIGFsd2F5cyBzd2FiKCkgdGhlIGJ5dGVzLCBubyBtYXR0ZXIgd2hhdCBDUFUuCisgKiAgICAgICAgICAgIFRoYXQncyBiZWNhdXNlIHRoZSByZWFkW3dsXSgpIGZ1bmN0aW9ucyBhbHdheXMgc3dhcCB0aGUKKyAqICAgICAgICAgICAgYnl0ZXMgb24gdGhlIHdheSBpbiBvbiBQUEMuCisgKiAgICAgICAgICAgIEZpeGluZyB0aGUgaGFyZHdhcmUgZGVzY3JpcHRvcnMgd2FzIGFub3RoZXIgbWF0dGVyLAorICogICAgICAgICAgICBiZWNhdXNlIHRoZXkgd2VyZW4ndCBnb2luZyB0aHJvdWdoIHJlYWRbd2xdKCksIHRoZXJlIGFsbAorICogICAgICAgICAgICB0aGUgcmVzdWx0cyBoYWQgdG8gYmUgaW4gbWVtb3J5IGluIGxlMzIgdmFsdWVzLiBrZGFha2VyCisgKgorICogMTIvMjMvMDAgLSBBZGRlZCBtaW5pbWFsIENhcmRidXMgc3VwcG9ydCAoVGhhbmtzIERvbmFsZCkuCisgKgorICogMDMvMDkvMDEgLSBBZGQgbmV3IHBjaSBhcGksIGRldl9iYXNlX2xvY2ssIGdlbmVyYWwgY2xlYW4gdXAuIAorICoKKyAqIDAzLzI3LzAxIC0gQWRkIG5ldyBkbWEgcGNpIChUaGFua3MgdG8gS3lsZSBMdWNrZSkgYW5kIGFsbG9jX3RyZGV2CisgKgkgICAgICBDaGFuZ2UgcHJvY19mcyBiZWhhdmlvdXIsIG5vdyBvbmUgZW50cnkgcGVyIGFkYXB0ZXIuCisgKgorICogMDQvMDkvMDEgLSBDb3VwbGUgb2YgYnVnIGZpeGVzIHRvIHRoZSBkbWEgdW5tYXBzIGFuZCBlamVjdGluZyB0aGUKKyAqCSAgICAgIGFkYXB0ZXIgd2hlbiBsaXZlIGRvZXMgbm90IHRha2UgdGhlIHN5c3RlbSBkb3duIHdpdGggaXQuCisgKiAKKyAqIDA2LzAyLzAxIC0gQ2xlYW4gdXAsIGNvcHkgc2tiIGZvciBzbWFsbCBwYWNrZXRzCisgKiAKKyAqIDA2LzIyLzAxIC0gQWRkIEVJU1IgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgCisgKgorICogMDcvMTkvMDEgLSBJbXByb3ZlIGJhZCBMQUEgcmVwb3J0aW5nLCBzdHJpcCBvdXQgZnJlZW1lbQorICoJICAgICAgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uLCBpdHMgY2FsbGVkIGZyb20gMyAKKyAqCSAgICAgIGRpZmZlcmVudCBwbGFjZXMgbm93LiAKKyAqIDAyLzA5LzAyIC0gUmVwbGFjZWQgc2xlZXBfb24uIAorICogMDMvMDEvMDIgLSBSZXBsYWNlIGFjY2VzcyB0byBzZXZlcmFsIHJlZ2lzdGVycyBmcm9tIDMyIGJpdCB0byAKKyAqIAkgICAgICAxNiBiaXQuIEZpeGVzIGFsaWdubWVudCBlcnJvcnMgb24gUFBDIDY0IGJpdCBtYWNoaW5lcy4KKyAqIAkgICAgICBUaGFua3MgdG8gQWwgVHJhdXRtYW4gZm9yIHRoaXMgb25lLgorICogMDMvMTAvMDIgLSBGaXggQlVHIGluIGFyYl9jbWQuIEJ1ZyB3YXMgdGhlcmUgYWxsIGFsb25nIGJ1dCB3YXMKKyAqIAkgICAgICBzaWxlbnRseSBpZ25vcmVkIHVudGlsIHRoZSBlcnJvciBjaGVja2luZyBjb2RlIAorICogCSAgICAgIHdlbnQgaW50byB2ZXJzaW9uIDEuMC4wIAorICogMDYvMDQvMDIgLSBBZGQgY29ycmVjdCBzdGFydCB1cCBzZXF1ZW5jZSBmb3IgdGhlIGNhcmRidXMgYWRhcHRlcnMuCisgKiAJICAgICAgUmVxdWlyZWQgZm9yIHN0cmljdCBjb21wbGlhbmNlIHdpdGggcGNpIHBvd2VyIG1nbXQgc3BlY3MuCisgKiAgVG8gRG86CisgKgorICoJICAgICBXYWtlIG9uIGxhbgkKKyAqIAorICogIElmIFByb2JsZW1zIGRvIE9jY3VyCisgKiAgTW9zdCBwcm9ibGVtcyBjYW4gYmUgcmVjdGlmaWVkIGJ5IGVpdGhlciBjbG9zaW5nIGFuZCBvcGVuaW5nIHRoZSBpbnRlcmZhY2UKKyAqICAoaWZjb25maWcgZG93biBhbmQgdXApIG9yIHJtbW9kIGFuZCBpbnNtb2QnaW5nIHRoZSBkcml2ZXIgKGEgYml0IGRpZmZpY3VsdAorICogIGlmIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCkuCisgKi8KKworLyogQ2hhbmdlIE9MWU1QSUNfREVCVUcgdG8gMSB0byBnZXQgdmVyYm9zZSwgYW5kIEkgbWVhbiByZWFsbHkgdmVyYm9zZSwgbWVzc2FnZXMgKi8KKworI2RlZmluZSBPTFlNUElDX0RFQlVHIDAKKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAib2x5bXBpYy5oIgorCisvKiBJJ3ZlIGdvdCB0byBwdXQgc29tZSBpbnRlbGxpZ2VuY2UgaW50byB0aGUgdmVyc2lvbiBudW1iZXIgc28gdGhhdCBQZXRlciBhbmQgSSBrbm93CisgKiB3aGljaCB2ZXJzaW9uIG9mIHRoZSBjb2RlIHNvbWVib2R5IGhhcyBnb3QuIAorICogVmVyc2lvbiBOdW1iZXIgPSBhLmIuYy5kICB3aGVyZSBhLmIuYyBpcyB0aGUgbGV2ZWwgb2YgY29kZSBhbmQgZCBpcyB0aGUgbGF0ZXN0IGF1dGhvci4KKyAqIFNvIDAuMC4xLnBkcyA9IFBldGVyLCAwLjAuMS5tbHAgPSBNaWtlCisgKiAKKyAqIE9mZmljaWFsIHJlbGVhc2VzIHdpbGwgb25seSBoYXZlIGFuIGEuYi5jIHZlcnNpb24gbnVtYmVyIGZvcm1hdC4gCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSAKKyJPbHltcGljLmMgdjEuMC41IDYvMDQvMDIgLSBQZXRlciBEZSBTY2hyaWp2ZXIgJiBNaWtlIFBoaWxsaXBzIiA7IAorCitzdGF0aWMgY2hhciAqb3Blbl9tYWpfZXJyb3JbXSAgPSB7Ik5vIGVycm9yIiwgIkxvYmUgTWVkaWEgVGVzdCIsICJQaHlzaWNhbCBJbnNlcnRpb24iLAorCQkJCSAgICJBZGRyZXNzIFZlcmlmaWNhdGlvbiIsICJOZWlnaGJvciBOb3RpZmljYXRpb24gKFJpbmcgUG9sbCkiLAorCQkJCSAgICJSZXF1ZXN0IFBhcmFtZXRlcnMiLCJGRFggUmVnaXN0cmF0aW9uIFJlcXVlc3QiLAorCQkJCSAgICJGRFggRHVwbGljYXRlIEFkZHJlc3MgQ2hlY2siLCAiU3RhdGlvbiByZWdpc3RyYXRpb24gUXVlcnkgV2FpdCIsCisJCQkJICAgIlVua25vd24gc3RhZ2UifTsKKworc3RhdGljIGNoYXIgKm9wZW5fbWluX2Vycm9yW10gPSB7Ik5vIGVycm9yIiwgIkZ1bmN0aW9uIEZhaWx1cmUiLCAiU2lnbmFsIExvc3QiLCAiV2lyZSBGYXVsdCIsCisJCQkJICAgIlJpbmcgU3BlZWQgTWlzbWF0Y2giLCAiVGltZW91dCIsIlJpbmcgRmFpbHVyZSIsIlJpbmcgQmVhY29uaW5nIiwKKwkJCQkgICAiRHVwbGljYXRlIE5vZGUgQWRkcmVzcyIsIlJlcXVlc3QgUGFyYW1ldGVycyIsIlJlbW92ZSBSZWNlaXZlZCIsCisJCQkJICAgIlJlc2VydmVkIiwgIlJlc2VydmVkIiwgIk5vIE1vbml0b3IgRGV0ZWN0ZWQgZm9yIFJQTCIsIAorCQkJCSAgICJNb25pdG9yIENvbnRlbnRpb24gZmFpbGVyIGZvciBSUEwiLCAiRkRYIFByb3RvY29sIEVycm9yIn07CisKKy8qIE1vZHVsZSBwYXJhbXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiTWlrZSBQaGlsbGlwcyA8bWlrZXBAbGludXh0ci5uZXQ+IikgOyAKK01PRFVMRV9ERVNDUklQVElPTigiT2x5bXBpYyBQQ0kvQ2FyZGJ1cyBDaGlwc2V0IERyaXZlciIpIDsgCisKKy8qIFJpbmcgU3BlZWQgMCw0LDE2LDEwMCAKKyAqIDAgPSBBdXRvc2Vuc2UgICAgICAgICAKKyAqIDQsMTYgPSBTZWxlY3RlZCBzcGVlZCBvbmx5LCBubyBhdXRvc2Vuc2UKKyAqIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIHRoZSBmaXJzdCBvbiB0aGUgcmluZworICogYW5kIGJlY29tZSB0aGUgYWN0aXZlIG1vbml0b3IuCisgKiAxMDAgPSBOb3RoaW5nIGF0IHByZXNlbnQsIDEwMG1icHMgaXMgYXV0b2RldGVjdGVkCisgKiBpZiBGRFggaXMgdHVybmVkIG9uLiBNYXkgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZSB0byAKKyAqIGZhaWwgaWYgMTAwbXBicyBpcyBub3QgZGV0ZWN0ZWQuCisgKgorICogV0FSTklORzogU29tZSBodWJzIHdpbGwgYWxsb3cgeW91IHRvIGluc2VydAorICogYXQgdGhlIHdyb25nIHNwZWVkCisgKi8KKworc3RhdGljIGludCByaW5nc3BlZWRbT0xZTVBJQ19NQVhfQURBUFRFUlNdID0gezAsfSA7Cittb2R1bGVfcGFyYW1fYXJyYXkocmluZ3NwZWVkLCBpbnQsIE5VTEwsIDApOworCisvKiBQYWNrZXQgYnVmZmVyIHNpemUgKi8KKworc3RhdGljIGludCBwa3RfYnVmX3N6W09MWU1QSUNfTUFYX0FEQVBURVJTXSA9IHswLH0gOworbW9kdWxlX3BhcmFtX2FycmF5KHBrdF9idWZfc3osIGludCwgTlVMTCwgMCkgOworCisvKiBNZXNzYWdlIExldmVsICovCisKK3N0YXRpYyBpbnQgbWVzc2FnZV9sZXZlbFtPTFlNUElDX01BWF9BREFQVEVSU10gPSB7MCx9IDsgCittb2R1bGVfcGFyYW1fYXJyYXkobWVzc2FnZV9sZXZlbCwgaW50LCBOVUxMLCAwKSA7CisKKy8qIENoYW5nZSBuZXR3b3JrX21vbml0b3IgdG8gcmVjZWl2ZSBtYWMgZnJhbWVzIHRocm91Z2ggdGhlIGFyYiBjaGFubmVsLgorICogV2lsbCBhbHNvIGNyZWF0ZSBhIC9wcm9jL25ldC9vbHltcGljX3RyJWQgZW50cnksIHdoZXJlICVkIGlzIHRoZSB0cgorICogZGV2aWNlLCBpLmUuIHRyMCwgdHIxIGV0Yy4gCisgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSBhIHJpbmctZXJyb3IgcmVwb3J0aW5nIG5ldHdvcmsgbW9kdWxlIAorICogaS5lLiBpdCB3aWxsIGdpdmUgeW91IHRoZSBzb3VyY2UgYWRkcmVzcyBvZiBiZWFjb25lcnMgb24gdGhlIHJpbmcgCisgKi8KK3N0YXRpYyBpbnQgbmV0d29ya19tb25pdG9yW09MWU1QSUNfTUFYX0FEQVBURVJTXSA9IHswLH07Cittb2R1bGVfcGFyYW1fYXJyYXkobmV0d29ya19tb25pdG9yLCBpbnQsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb2x5bXBpY19wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfSUJNLFBDSV9ERVZJQ0VfSURfSUJNX1RSX1dBS0UsUENJX0FOWV9JRCxQQ0lfQU5ZX0lELH0sCisJeyB9IAkvKiBUZXJtaW5hdGluZyBFbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLG9seW1waWNfcGNpX3RibCkgOyAKKworCitzdGF0aWMgaW50IG9seW1waWNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOyAKK3N0YXRpYyBpbnQgb2x5bXBpY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBvbHltcGljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb2x5bXBpY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG9seW1waWNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBvbHltcGljX2ZyZWVtZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAgCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2x5bXBpY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBvbHltcGljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb2x5bXBpY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikgOyAKK3N0YXRpYyB2b2lkIG9seW1waWNfYXJiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb2x5bXBpY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOworc3RhdGljIHZvaWQgb2x5bXBpY19zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAKK3N0YXRpYyB2b2lkIG9seW1waWNfYXNiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgaW50IG9seW1waWNfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKSA7IAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbHltcGljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgOyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY7CisJc3RhdGljIGludCBjYXJkX25vID0gLTEgOworCWludCBpIDsgCisKKwljYXJkX25vKysgOyAKKworCWlmICgoaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQlyZXR1cm4gaSA7IAorCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKChpID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCJvbHltcGljIikpKSB7IAorCQlnb3RvIG9wX2Rpc2FibGVfZGV2OworCX0KKyAKKwlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG9seW1waWNfcHJpdmF0ZSkpIDsgCisJaWYgKCFkZXYpIHsKKwkJaSA9IC1FTk9NRU07IAorCQlnb3RvIG9wX2ZyZWVfZGV2OworCX0KKworCW9seW1waWNfcHJpdiA9IGRldi0+cHJpdiA7CisJCisJc3Bpbl9sb2NrX2luaXQoJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKSA7IAorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmb2x5bXBpY19wcml2LT50cmJfd2FpdCk7CisjaWYgT0xZTVBJQ19ERUJVRyAgCisJcHJpbnRrKEtFUk5fSU5GTyAicGNpX2RldmljZTogJXAsIGRldjolcCwgZGV2LT5wcml2OiAlcFxuIiwgcGRldiwgZGV2LCBkZXYtPnByaXYpOworI2VuZGlmCisJZGV2LT5pcnE9cGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyPXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lID0gcGNpX25hbWUocGRldik7CisJb2x5bXBpY19wcml2LT5wZGV2ID0gcGRldjsgCisJb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDEpLDI1Nik7CisJb2x5bXBpY19wcml2LT5vbHltcGljX2xhcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMiksMjA0OCk7CisJaWYgKCFvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbyB8fCAhb2x5bXBpY19wcml2LT5vbHltcGljX2xhcCkgeworCQlnb3RvIG9wX2ZyZWVfaW9tYXA7CisJfQorCQkJCQorCWlmICgocGt0X2J1Zl9zeltjYXJkX25vXSA8IDEwMCkgfHwgKHBrdF9idWZfc3pbY2FyZF9ub10gPiAxODAwMCkgKQorCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogPSBQS1RfQlVGX1NaIDsgCisJZWxzZQorCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogPSBwa3RfYnVmX3N6W2NhcmRfbm9dIDsgCisKKwlkZXYtPm10dSA9IG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiAtIFRSX0hMRU4gOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IHJpbmdzcGVlZFtjYXJkX25vXSA7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsID0gbWVzc2FnZV9sZXZlbFtjYXJkX25vXSA7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19uZXR3b3JrX21vbml0b3IgPSBuZXR3b3JrX21vbml0b3JbY2FyZF9ub107CisJCisJaWYgKChpID0gb2x5bXBpY19pbml0KGRldikpKSB7CisJCWdvdG8gb3BfZnJlZV9pb21hcDsKKwl9CQkJCQorCisJZGV2LT5vcGVuPSZvbHltcGljX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQ9Jm9seW1waWNfeG1pdDsKKwlkZXYtPmNoYW5nZV9tdHU9Jm9seW1waWNfY2hhbmdlX210dTsKKwlkZXYtPnN0b3A9Jm9seW1waWNfY2xvc2U7CisJZGV2LT5kb19pb2N0bD1OVUxMOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0PSZvbHltcGljX3NldF9yeF9tb2RlOworCWRldi0+Z2V0X3N0YXRzPSZvbHltcGljX2dldF9zdGF0cyA7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3M9Jm9seW1waWNfc2V0X21hY19hZGRyZXNzIDsgIAorCVNFVF9NT0RVTEVfT1dORVIoZGV2KSA7IAorCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldixkZXYpIDsgCisJcmVnaXN0ZXJfbmV0ZGV2KGRldikgOyAKKwlwcmludGsoIk9seW1waWM6ICVzIHJlZ2lzdGVyZWQgYXM6ICVzXG4iLG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUsZGV2LT5uYW1lKTsKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAvKiBNdXN0IGdvIGFmdGVyIHJlZ2lzdGVyX25ldGRldiBhcyB3ZSBuZWVkIHRoZSBkZXZpY2UgbmFtZSAqLyAKKwkJY2hhciBwcm9jX25hbWVbMjBdIDsgCisJCXN0cmNweShwcm9jX25hbWUsIm5ldC9vbHltcGljXyIpIDsgCisJCXN0cmNhdChwcm9jX25hbWUsZGV2LT5uYW1lKSA7IAorCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KHByb2NfbmFtZSwwLE5VTEwsb2x5bXBpY19wcm9jX2luZm8sKHZvaWQgKilkZXYpIDsgCisJCXByaW50aygiT2x5bXBpYzogTmV0d29yayBNb25pdG9yIGluZm9ybWF0aW9uOiAvcHJvYy8lc1xuIixwcm9jX25hbWUpOyAKKwl9CisJcmV0dXJuICAwIDsKKworb3BfZnJlZV9pb21hcDoKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21taW8pCisJCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX21taW8pOyAKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCkKKwkJaW91bm1hcChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwKTsKKworb3BfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOyAKKworb3BfZGlzYWJsZV9kZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbHltcGljX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbywgKmluaXRfc3JiLCphZGFwdGVyX2FkZHI7CisJdW5zaWduZWQgbG9uZyB0OyAKKwl1bnNpZ25lZCBpbnQgdWFhX2FkZHI7CisKKyAgICAJb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCW9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKworCXByaW50aygiJXMgXG4iLCB2ZXJzaW9uKTsKKwlwcmludGsoIiVzLiBJL08gYXQgJWh4LCBNTUlPIGF0ICVwLCBMQVAgYXQgJXAsIHVzaW5nIGlycSAlZFxuIiwgb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSwgKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8sIG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAsIGRldi0+aXJxKTsKKworCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCkgfCBCQ1RMX1NPRlRSRVNFVCxvbHltcGljX21taW8rQkNUTCk7CisJdD1qaWZmaWVzOworCXdoaWxlKChyZWFkbChvbHltcGljX21taW8rQkNUTCkpICYgQkNUTF9TT0ZUUkVTRVQpIHsKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiA0MCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gUENJIHRva2VucmluZyBjYXJkIG5vdCByZXNwb25kaW5nLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCisJLyogTmVlZGVkIGZvciBjYXJkYnVzICovCisJaWYoIShyZWFkbChvbHltcGljX21taW8rQkNUTCkgJiBCQ1RMX01PREVfSU5ESUNBVE9SKSkgeworCQl3cml0ZWwocmVhZGwob2x5bXBpY19wcml2LT5vbHltcGljX21taW8rRkVSTUFTSyl8RkVSTUFTS19JTlRfQklULCBvbHltcGljX21taW8rRkVSTUFTSyk7CisJfQorCQorI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkJDVEw6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSk7CisJcHJpbnRrKCJHUFI6ICV4XG4iLHJlYWR3KG9seW1waWNfbW1pbytHUFIpKTsKKwlwcmludGsoIlNJU1JNQVNLOiAleFxuIixyZWFkbChvbHltcGljX21taW8rU0lTUl9NQVNLKSk7CisjZW5kaWYKKwkvKiBBYWFhaGhoLCBZb3UgaGF2ZSBnb3QgdG8gYmUgcmVhbCBjYXJlZnVsIHNldHRpbmcgR1BSLCB0aGUgY2FyZAorCSAgIGhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgZnJvbSBmbGFzaCBtZW1vcnksIGluY2x1ZGluZyBhdXRvc2Vuc2UgCisgICAgICAgICAgIGFuZCByaW5nIHNwZWVkICovCisKKwl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpfEJDVExfTUlNUkVCLG9seW1waWNfbW1pbytCQ1RMKTsKKwkKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgID09IDApIHsgLyogQXV0b3NlbnNlICovCisJCXdyaXRldyhyZWFkdyhvbHltcGljX21taW8rR1BSKXxHUFJfQVVUT1NFTlNFLG9seW1waWNfbW1pbytHUFIpOworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmdzcGVlZCBhdXRvc2Vuc2UgbW9kZSBvblxuIixvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lKTsKKwl9IGVsc2UgaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkID09IDE2KSB7CisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHJ5aW5nIHRvIG9wZW4gYXQgMTYgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsIG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUpOworCQl3cml0ZXcoR1BSXzE2TUJQUywgb2x5bXBpY19tbWlvK0dQUik7CisJfSBlbHNlIGlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9PSA0KSB7CisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHJ5aW5nIHRvIG9wZW4gYXQgNCBNYnBzIGFzIHJlcXVlc3RlZFxuIiwgb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSkgOyAKKwkJd3JpdGV3KDAsIG9seW1waWNfbW1pbytHUFIpOworCX0gCisJCisJd3JpdGV3KHJlYWR3KG9seW1waWNfbW1pbytHUFIpfEdQUl9ORVBUVU5FX0JGLG9seW1waWNfbW1pbytHUFIpOworCisjaWYgT0xZTVBJQ19ERUJVRworCXByaW50aygiR1BSID0gJXhcbiIscmVhZHcob2x5bXBpY19tbWlvICsgR1BSKSApIDsgCisjZW5kaWYKKwkvKiBTb2xvIGhhcyBiZWVuIHBhdXNlZCB0byBtZWV0IHRoZSBDYXJkYnVzIHBvd2VyCisJICogc3BlY3MgaWYgdGhlIGFkYXB0ZXIgaXMgY2FyZGJ1cy4gQ2hlY2sgdG8gCisJICogc2VlIGl0cyBiZWVuIHBhdXNlZCBhbmQgdGhlbiByZXN0YXJ0IHNvbG8uIFRoZQorCSAqIGFkYXB0ZXIgc2hvdWxkIHNldCB0aGUgcGF1c2UgYml0IHdpdGhpbiAxIHNlY29uZC4KKwkgKi8KKworCWlmKCEocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpICYgQkNUTF9NT0RFX0lORElDQVRPUikpIHsgCisJCXQ9amlmZmllczsKKwkJd2hpbGUgKCFyZWFkbChvbHltcGljX21taW8rQ0xLQ1RMKSAmIENMS0NUTF9QQVVTRSkgeyAKKwkJCXNjaGVkdWxlKCkgOyAKKwkJCWlmKGppZmZpZXMtdCA+IDIqSFopIHsgCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gQ2FyZGJ1cyB0b2tlbnJpbmcgYWRhcHRlciBub3QgcmVzcG9uc2luZy5cbiIpIDsgCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKwkJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytDTEtDVEwpICYgfkNMS0NUTF9QQVVTRSwgb2x5bXBpY19tbWlvK0NMS0NUTCkgOyAKKwl9CisJCisJLyogc3RhcnQgc29sbyBpbml0ICovCisJd3JpdGVsKCgxPDwxNSksb2x5bXBpY19tbWlvK1NJU1JfTUFTS19TVU0pOworCisJdD1qaWZmaWVzOworCXdoaWxlKCEoKHJlYWRsKG9seW1waWNfbW1pbytTSVNSX1JSKSkgJiBTSVNSX1NSQl9SRVBMWSkpIHsKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxNSpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gUENJIHRva2VucmluZyBjYXJkIG5vdCByZXNwb25kaW5nLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwkKKwl3cml0ZWwocmVhZHcob2x5bXBpY19tbWlvK0xBUFdXTyksb2x5bXBpY19tbWlvK0xBUEEpOworCisjaWYgT0xZTVBJQ19ERUJVRworCXByaW50aygiTEFQV1dPOiAleCwgTEFQQTogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK0xBUFdXTyksIHJlYWRsKG9seW1waWNfbW1pbytMQVBBKSk7CisjZW5kaWYKKworCWluaXRfc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAoKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pKSAmICh+MHhmODAwKSk7CisKKyNpZiBPTFlNUElDX0RFQlVHCQkKK3sKKwlpbnQgaTsKKwlwcmludGsoImluaXRfc3JiKCVwKTogIixpbml0X3NyYik7CisJZm9yKGk9MDtpPDIwO2krKykKKwkJcHJpbnRrKCIleCAiLHJlYWRiKGluaXRfc3JiK2kpKTsKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYJCisJaWYocmVhZHcoaW5pdF9zcmIrNikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidG9rZW5yaW5nIGNhcmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBlcnJvcmNvZGUgOiAleFxuIixyZWFkdyhpbml0X3NyYis2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgeworCQlpZiAoIHJlYWRiKGluaXRfc3JiICsyKSAmIDB4NDApIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICJPbHltcGljOiBBZGFwdGVyIGlzIEZEWCBjYXBhYmxlLlxuIikgOworCQl9IGVsc2UgeyAKKwkJCXByaW50ayhLRVJOX0lORk8gIk9seW1waWM6IEFkYXB0ZXIgY2Fubm90IGRvIEZEWC5cbiIpOworCQl9CisJfQorICAKKwl1YWFfYWRkcj1zd2FiMTYocmVhZHcoaW5pdF9zcmIrOCkpOworCisjaWYgT0xZTVBJQ19ERUJVRworCXByaW50aygiVUFBIHJlc2lkZXMgYXQgJXhcbiIsdWFhX2FkZHIpOworI2VuZGlmCisKKwl3cml0ZWwodWFhX2FkZHIsb2x5bXBpY19tbWlvK0xBUEEpOworCWFkYXB0ZXJfYWRkcj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKHVhYV9hZGRyICYgKH4weGY4MDApKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoImFkYXB0ZXIgYWRkcmVzczogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlyZWFkYihhZGFwdGVyX2FkZHIpLCByZWFkYihhZGFwdGVyX2FkZHIrMSkscmVhZGIoYWRhcHRlcl9hZGRyKzIpLAorCQkJcmVhZGIoYWRhcHRlcl9hZGRyKzMpLHJlYWRiKGFkYXB0ZXJfYWRkcis0KSxyZWFkYihhZGFwdGVyX2FkZHIrNSkpOworI2VuZGlmCisKKwltZW1jcHlfZnJvbWlvKCZkZXYtPmRldl9hZGRyWzBdLCBhZGFwdGVyX2FkZHIsNik7CisKKwlvbHltcGljX3ByaXYtPm9seW1waWNfYWRkcl90YWJsZV9hZGRyID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiICsgMTIpKTsgCisJb2x5bXBpY19wcml2LT5vbHltcGljX3Bhcm1zX2FkZHIgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIgKyAxNCkpOyAKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgb2x5bXBpY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW8sKmluaXRfc3JiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHQ7CisJaW50IGksIG9wZW5fZmluaXNoZWQgPSAxIDsKKwl1OCByZXNwLCBlcnI7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpIDsgCisKKwlvbHltcGljX2luaXQoZGV2KTsKKworCWlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmb2x5bXBpY19pbnRlcnJ1cHQsIFNBX1NISVJRICwgIm9seW1waWMiLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkJNQ1RMOiAleFxuIixyZWFkbChvbHltcGljX21taW8rQk1DVExfU1VNKSk7CisJcHJpbnRrKCJwZW5kaW5nIGludHM6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytTSVNSX1JSKSk7CisjZW5kaWYKKworCXdyaXRlbChTSVNSX01JLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworCXdyaXRlbChTSVNSX01JIHwgU0lTUl9TUkJfUkVQTFksIG9seW1waWNfbW1pbytTSVNSX01BU0spOyAvKiBtb3JlIGludHMgbGF0ZXIsIGRvZXNuJ3Qgc3RvcCBhcmIgY21kIGludGVycnVwdCAqLworCisJd3JpdGVsKExJU1JfTElFLG9seW1waWNfbW1pbytMSVNSKTsgLyogbW9yZSBpbnRzIGxhdGVyICovCisKKwkvKiBhZGFwdGVyIGlzIGNsb3NlZCwgc28gU1JCIGlzIHBvaW50ZWQgdG8gYnkgTEFQV1dPICovCisKKwl3cml0ZWwocmVhZHcob2x5bXBpY19tbWlvK0xBUFdXTyksb2x5bXBpY19tbWlvK0xBUEEpOworCWluaXRfc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAoKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pKSAmICh+MHhmODAwKSk7CisJCisjaWYgT0xZTVBJQ19ERUJVRworCXByaW50aygiTEFQV1dPOiAleCwgTEFQQTogJXhcbiIscmVhZHcob2x5bXBpY19tbWlvK0xBUFdXTyksIHJlYWRsKG9seW1waWNfbW1pbytMQVBBKSk7CisJcHJpbnRrKCJTSVNSIE1hc2sgPSAlMDR4XG4iLCByZWFkbChvbHltcGljX21taW8rU0lTUl9NQVNLKSk7CisJcHJpbnRrKCJCZWZvcmUgdGhlIG9wZW4gY29tbWFuZCBcbiIpOworI2VuZGlmCQorCWRvIHsKKwkJbWVtc2V0X2lvKGluaXRfc3JiLDAsU1JCX0NPTU1BTkRfU0laRSk7CisKKwkJd3JpdGViKFNSQl9PUEVOX0FEQVBURVIsaW5pdF9zcmIpIDsgCS8qIG9wZW4gKi8KKwkJd3JpdGViKE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUsaW5pdF9zcmIrMik7CisKKwkJLyogSWYgTmV0d29yayBNb25pdG9yLCBpbnN0cnVjdCBjYXJkIHRvIGNvcHkgTUFDIGZyYW1lcyB0aHJvdWdoIHRoZSBBUkIgKi8KKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19uZXR3b3JrX21vbml0b3IpIAorCQkJd3JpdGV3KHN3YWIxNihPUEVOX0FEQVBURVJfRU5BQkxFX0ZEWCB8IE9QRU5fQURBUFRFUl9QQVNTX0FEQ19NQUMgfCBPUEVOX0FEQVBURVJfUEFTU19BVFRfTUFDIHwgT1BFTl9BREFQVEVSX1BBU1NfQkVBQ09OKSwgaW5pdF9zcmIrOCk7CisJCWVsc2UKKwkJCXdyaXRldyhzd2FiMTYoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFgpLCBpbml0X3NyYis4KTsKKwkKKwkJLyogVGVzdCBPUiBvZiBmaXJzdCAzIGJ5dGVzIGFzIGl0cyB0b3RhbGx5IHBvc3NpYmxlIGZvciAKKwkJICogc29tZW9uZSB0byBzZXQgdGhlIGZpcnN0IDIgYnl0ZXMgdG8gYmUgemVybywgYWx0aG91Z2ggdGhpcyAKKwkJICogaXMgYW4gZXJyb3IsIHRoZSBmaXJzdCBieXRlIG11c3QgaGF2ZSBiaXQgNiBzZXQgdG8gMSAgKi8KKworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVswXSB8IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMV0gfCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzJdKSB7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVswXSxpbml0X3NyYisxMik7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsxXSxpbml0X3NyYisxMyk7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsyXSxpbml0X3NyYisxNCk7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVszXSxpbml0X3NyYisxNSk7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVs0XSxpbml0X3NyYisxNik7CisJCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX2xhYVs1XSxpbml0X3NyYisxNyk7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkcixvbHltcGljX3ByaXYtPm9seW1waWNfbGFhLGRldi0+YWRkcl9sZW4pIDsgIAorCQl9IAkKKwkJd3JpdGViKDEsaW5pdF9zcmIrMzApOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CQorCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MTsKKworCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrLGZsYWdzKTsKKworCQl0ID0gamlmZmllcyA7IAorCQorCQlhZGRfd2FpdF9xdWV1ZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCwmd2FpdCkgOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpIDsgCisgCisgCQl3aGlsZShvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQpIHsgICAgICAgIAorCQkJc2NoZWR1bGUoKSA7IAorICAgICAgICAJCWlmKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQl7ICAgICAgICAgICAgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNpZ25hbCByZWNlaXZlZCBpbiBvcGVuLlxuIiwKKyAgICAgICAgICAgICAgICAJCQlkZXYtPm5hbWUpOworICAgICAgICAgICAgCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0lTUj0leCBMSVNSPSV4XG4iLAorICAgICAgICAgICAgICAgIAkJCXJlYWRsKG9seW1waWNfbW1pbytTSVNSKSwKKyAgICAgICAgICAgICAgICAJCQlyZWFkbChvbHltcGljX21taW8rTElTUikpOworICAgICAgICAgICAgCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisgICAgICAgICAgICAJCQlicmVhazsKKyAgICAgICAgCQl9CisJCQlpZiAoKGppZmZpZXMtdCkgPiAxMCpIWikgeyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU1JCIHRpbWVkIG91dC4gXG4iLGRldi0+bmFtZSkgOyAKKwkJCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MDsKKwkJCQlicmVhayA7IAorCQkJfSAKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSkgOyAKKyAgICAJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQsJndhaXQpIDsgCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORykgOyAKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkID0gMCA7IAorI2lmIE9MWU1QSUNfREVCVUcKKwkJcHJpbnRrKCJpbml0X3NyYiglcCk6ICIsaW5pdF9zcmIpOworCQlmb3IoaT0wO2k8MjA7aSsrKQorCQkJcHJpbnRrKCIlMDJ4ICIscmVhZGIoaW5pdF9zcmIraSkpOworCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJCisJCS8qIElmIHdlIGdldCB0aGUgc2FtZSByZXR1cm4gcmVzcG9uc2UgYXMgd2Ugc2V0LCB0aGUgaW50ZXJydXB0IHdhc24ndCByYWlzZWQgYW5kIHRoZSBvcGVuCisgICAgICAgICAgICAgICAgICogdGltZWQgb3V0LgorCQkgKi8KKworCQlzd2l0Y2ggKHJlc3AgPSByZWFkYihpbml0X3NyYisyKSkgeworCQljYXNlIE9MWU1QSUNfQ0xFQVJfUkVUX0NPREU6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBPcGVuIHRpbWUgb3V0IG9yIGVycm9yLlxuIiwgZGV2LT5uYW1lKSA7IAorCQkJZ290byBvdXQ7CisJCWNhc2UgMDoKKwkJCW9wZW5fZmluaXNoZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNzoKKwkJCWlmICghb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgJiYgb3Blbl9maW5pc2hlZCkgeyAvKiBBdXRvc2Vuc2UgLCBmaXJzdCB0aW1lIGFyb3VuZCAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXRyeWluZyBhdCBkaWZmZXJlbnQgcmluZyBzcGVlZCBcbiIsIGRldi0+bmFtZSk7IAorCQkJCW9wZW5fZmluaXNoZWQgPSAwIDsgIAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQllcnIgPSByZWFkYihpbml0X3NyYis3KTsKKworCQkJaWYgKCFvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCAmJiAoKGVyciAmIDB4MGYpID09IDB4MGQpKSB7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmllZCB0byBhdXRvc2Vuc2UgcmluZyBzcGVlZCB3aXRoIG5vIG1vbml0b3JzIHByZXNlbnRcbiIsZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUGxlYXNlIHRyeSBhZ2FpbiB3aXRoIGEgc3BlY2lmaWVkIHJpbmcgc3BlZWQgXG4iLGRldi0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcyAtICVzXG4iLCBkZXYtPm5hbWUsCisJCQkJCW9wZW5fbWFqX2Vycm9yWyhlcnIgJiAweGYwKSA+PiA0XSwKKwkJCQkJb3Blbl9taW5fZXJyb3JbKGVyciAmIDB4MGYpXSk7CisJCQl9CisJCQlnb3RvIG91dDsKKworCQljYXNlIDB4MzI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBMQUE6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWRldi0+bmFtZSwgCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVswXSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzFdLAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMl0sCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVszXSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzRdLAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNV0pIDsgCisJCQlnb3RvIG91dDsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJhZCBPUEVOIHJlc3BvbnNlOiAleFxuIiwgZGV2LT5uYW1lLCByZXNwKTsKKwkJCWdvdG8gb3V0OworCisJCX0KKwl9IHdoaWxlICghKG9wZW5fZmluaXNoZWQpKSA7IC8qIFdpbGwgb25seSBsb29wIGlmIHJpbmcgc3BlZWQgbWlzbWF0Y2ggcmUtb3BlbiBhdHRlbXB0ZWQgJiYgYXV0b3NlbnNlIGlzIG9uICovCQorCisJaWYgKHJlYWRiKGluaXRfc3JiKzE4KSAmICgxPDwzKSkgCisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlbmVkIGluIEZEWCBNb2RlXG4iLGRldi0+bmFtZSk7CisKKwlpZiAocmVhZGIoaW5pdF9zcmIrMTgpICYgKDE8PDEpKQorCQlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IDEwMCA7IAorCWVsc2UgaWYgKHJlYWRiKGluaXRfc3JiKzE4KSAmIDEpCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkID0gMTYgOyAKKwllbHNlCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkID0gNCA7IAorCisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5lZCBpbiAlZCBNYnBzIG1vZGVcbiIsZGV2LT5uYW1lLCBvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCk7CisKKwlvbHltcGljX3ByaXYtPmFzYiA9IHN3YWIxNihyZWFkdyhpbml0X3NyYis4KSk7CisJb2x5bXBpY19wcml2LT5zcmIgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIrMTApKTsKKwlvbHltcGljX3ByaXYtPmFyYiA9IHN3YWIxNihyZWFkdyhpbml0X3NyYisxMikpOworCW9seW1waWNfcHJpdi0+dHJiID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiKzE2KSk7CisKKwlvbHltcGljX3ByaXYtPm9seW1waWNfcmVjZWl2ZV9vcHRpb25zID0gMHgwMSA7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zID0gMCA7IAorCQorCS8qIHNldHVwIHJ4IHJpbmcgKi8KKwkKKwl3cml0ZWwoKDM8PDE2KSxvbHltcGljX21taW8rQk1DVExfUldNKTsgLyogRW5zdXJlIGVuZCBvZiBmcmFtZSBnZW5lcmF0ZWQgaW50ZXJydXB0cyAqLyAKKworCXdyaXRlbChCTUNUTF9SWF9ESVN8MyxvbHltcGljX21taW8rQk1DVExfUldNKTsgLyogWWVzLCB0aGlzIHRoZSBlbmFibGVzIFJYIGNoYW5uZWwgKi8KKworCWZvcihpPTA7aTxPTFlNUElDX1JYX1JJTkdfU0laRTtpKyspIHsKKworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkKKwkJc2tiPWRldl9hbGxvY19za2Iob2x5bXBpY19wcml2LT5wa3RfYnVmX3N6KTsKKwkJaWYoc2tiID09IE5VTEwpCisJCQlicmVhazsKKworCQlza2ItPmRldiA9IGRldjsKKworCQlvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tpXS5idWZmZXIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIAorCQkJCQkJCSAgc2tiLT5kYXRhLG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSkgOyAKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbaV0ucmVzX2xlbmd0aCA9IGNwdV90b19sZTMyKG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeik7IAorCQlvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW2ldPXNrYjsKKwl9CisKKwlpZiAoaT09MCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnggYnVmZmVycy4gQWRhcHRlciBkaXNhYmxlZFxuIixkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmcsIAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBvbHltcGljX3J4X2Rlc2MpICogT0xZTVBJQ19SWF9SSU5HX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsIG9seW1waWNfbW1pbytSWERFU0NRKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT5yeF9yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhDREEpOworCXdyaXRldyhpLCBvbHltcGljX21taW8rUlhERVNDUUNOVCk7CisJCQorCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX3JpbmdfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZywgCisJCQkJCQlzaXplb2Yoc3RydWN0IG9seW1waWNfcnhfc3RhdHVzKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhTVEFUUSk7CisJd3JpdGVsKG9seW1waWNfcHJpdi0+cnhfc3RhdHVzX3JpbmdfZG1hX2FkZHIsIG9seW1waWNfbW1pbytSWENTQSk7CisJCisgCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gT0xZTVBJQ19SWF9SSU5HX1NJWkUgLSAxOwkvKiBsYXN0IHByb2Nlc3NlZCByeCBzdGF0dXMgKi8KKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkID0gT0xZTVBJQ19SWF9SSU5HX1NJWkUgLSAxOyAgCisKKwl3cml0ZXcoaSwgb2x5bXBpY19tbWlvK1JYU1RBVFFDTlQpOworCisjaWYgT0xZTVBJQ19ERUJVRyAKKwlwcmludGsoIiMgb2YgcnggYnVmZmVyczogJWQsIFJYRU5ROiAleFxuIixpLCByZWFkdyhvbHltcGljX21taW8rUlhFTlEpKTsKKwlwcmludGsoIlJYQ1NBOiAleCwgcnhfc3RhdHVzX3JpbmdbMF06ICVwXG4iLHJlYWRsKG9seW1waWNfbW1pbytSWENTQSksJm9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1swXSk7CisJcHJpbnRrKCIgc3RhdF9yaW5nWzFdOiAlcCwgc3RhdF9yaW5nWzJdOiAlcCwgc3RhdF9yaW5nWzNdOiAlcFxuIiwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMV0pLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1syXSksICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzNdKSApOworCXByaW50aygiIHN0YXRfcmluZ1s0XTogJXAsIHN0YXRfcmluZ1s1XTogJXAsIHN0YXRfcmluZ1s2XTogJXBcbiIsICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzRdKSwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbNV0pLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1s2XSkgKTsKKwlwcmludGsoIiBzdGF0X3JpbmdbN106ICVwXG4iLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1s3XSkgICk7CisKKwlwcmludGsoIlJYQ0RBOiAleCwgcnhfcmluZ1swXTogJXBcbiIscmVhZGwob2x5bXBpY19tbWlvK1JYQ0RBKSwmb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbMF0pOworCXByaW50aygiUnhfcmluZ19kbWFfYWRkciA9ICUwOHgsIHJ4X3N0YXR1c19kbWFfYWRkciA9ICUwOHhcbiIsCisJCW9seW1waWNfcHJpdi0+cnhfcmluZ19kbWFfYWRkcixvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyKSA7IAorI2VuZGlmCisKKwl3cml0ZXcoKCgocmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSkgJiAweDgwMDApIF4gMHg4MDAwKSB8IGksb2x5bXBpY19tbWlvK1JYRU5RKTsKKworI2lmIE9MWU1QSUNfREVCVUcgCisJcHJpbnRrKCIjIG9mIHJ4IGJ1ZmZlcnM6ICVkLCBSWEVOUTogJXhcbiIsaSwgcmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSk7CisJcHJpbnRrKCJSWENTQTogJXgsIHJ4X3JpbmdbMF06ICVwXG4iLHJlYWRsKG9seW1waWNfbW1pbytSWENTQSksJm9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1swXSk7CisJcHJpbnRrKCJSWENEQTogJXgsIHJ4X3JpbmdbMF06ICVwXG4iLHJlYWRsKG9seW1waWNfbW1pbytSWENEQSksJm9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nWzBdKTsKKyNlbmRpZiAKKworCXdyaXRlbChTSVNSX1JYX1NUQVRVUyB8IFNJU1JfUlhfTk9CVUYsb2x5bXBpY19tbWlvK1NJU1JfTUFTS19TVU0pOworCisJLyogc2V0dXAgdHggcmluZyAqLworCisJd3JpdGVsKEJNQ1RMX1RYMV9ESVMsb2x5bXBpY19tbWlvK0JNQ1RMX1JXTSk7IC8qIFllcywgdGhpcyBlbmFibGVzIFRYIGNoYW5uZWwgMSAqLworCWZvcihpPTA7aTxPTFlNUElDX1RYX1JJTkdfU0laRTtpKyspIAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfdHhfcmluZ1tpXS5idWZmZXI9MHhkZWFkYmVlZjsKKworCW9seW1waWNfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXM9T0xZTVBJQ19UWF9SSU5HX1NJWkU7CisJb2x5bXBpY19wcml2LT50eF9yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LG9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X2Rlc2MpICogT0xZTVBJQ19UWF9SSU5HX1NJWkUsUENJX0RNQV9UT0RFVklDRSkgOyAKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rVFhERVNDUV8xKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rVFhDREFfMSk7CisJd3JpdGV3KE9MWU1QSUNfVFhfUklOR19TSVpFLCBvbHltcGljX21taW8rVFhERVNDUUNOVF8xKTsKKwkKKwlvbHltcGljX3ByaXYtPnR4X3N0YXR1c19yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPm9seW1waWNfdHhfc3RhdHVzX3JpbmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IG9seW1waWNfdHhfc3RhdHVzKSAqIE9MWU1QSUNfVFhfUklOR19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnR4X3N0YXR1c19yaW5nX2RtYV9hZGRyLG9seW1waWNfbW1pbytUWFNUQVRRXzEpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnR4X3N0YXR1c19yaW5nX2RtYV9hZGRyLG9seW1waWNfbW1pbytUWENTQV8xKTsKKwl3cml0ZXcoT0xZTVBJQ19UWF9SSU5HX1NJWkUsb2x5bXBpY19tbWlvK1RYU1RBVFFDTlRfMSk7CisJCQorCW9seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlPTA7IC8qIG5leHQgZW50cnkgaW4gdHggcmluZyB0byB1c2UgKi8KKwlvbHltcGljX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXM9T0xZTVBJQ19UWF9SSU5HX1NJWkUtMTsgLyogbGFzdCBwcm9jZXNzZWQgdHggc3RhdHVzICovCisKKwl3cml0ZWwoMHhmZmZmZmZmZiwgb2x5bXBpY19tbWlvK0VJU1JfUldNKSA7IC8qIGNsZWFuIHRoZSBlaXNyICovCisJd3JpdGVsKDAsb2x5bXBpY19tbWlvK0VJU1IpIDsgCisJd3JpdGVsKEVJU1JfTUFTS19PUFRJT05TLG9seW1waWNfbW1pbytFSVNSX01BU0spIDsgLyogZW5hYmxlcyBtb3N0IG9mIHRoZSBUWCBlcnJvciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKFNJU1JfVFgxX0VPRiB8IFNJU1JfQURBUFRFUl9DSEVDSyB8IFNJU1JfQVJCX0NNRCB8IFNJU1JfVFJCX1JFUExZIHwgU0lTUl9BU0JfRlJFRSB8IFNJU1JfRVJSLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworI2lmIE9MWU1QSUNfREVCVUcgCisJcHJpbnRrKCJCTUNUTDogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK0JNQ1RMX1NVTSkpOworCXByaW50aygiU0lTUiBNQVNLOiAleFxuIixyZWFkbChvbHltcGljX21taW8rU0lTUl9NQVNLKSk7CisjZW5kaWYKKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yKSB7IAorCQl1OCBfX2lvbWVtICpvYXQgOyAKKwkJdTggX19pb21lbSAqb3B0IDsgCisJCW9hdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX2FkZHJfdGFibGVfYWRkcikgOyAKKwkJb3B0ID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPm9seW1waWNfcGFybXNfYWRkcikgOyAKKworCQlwcmludGsoIiVzOiBOb2RlIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLGRldi0+bmFtZSwgCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikpLCAKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSsxKSwKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSsyKSwKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSszKSwKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSs0KSwKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSs1KSk7CisJCXByaW50aygiJXM6IEZ1bmN0aW9uYWwgQWRkcmVzczogJTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKSwgCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMSksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMiksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMykpOworCQlwcmludGsoIiVzOiBOQVVOIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLGRldi0+bmFtZSwgCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSsxKSwKKwkJCXJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzIpLAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMyksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSs0KSwKKwkJCXJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzUpKTsKKwl9CisJCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAtRUlPOworfQkKKworLyoKKyAqCVdoZW4gd2UgZW50ZXIgdGhlIHJ4IHJvdXRpbmUgd2UgZG8gbm90IGtub3cgaG93IG1hbnkgZnJhbWVzIGhhdmUgYmVlbiAKKyAqCXF1ZXVlZCBvbiB0aGUgcnggY2hhbm5lbC4gIFRoZXJlZm9yZSB3ZSBzdGFydCBhdCB0aGUgbmV4dCByeCBzdGF0dXMKKyAqCXBvc2l0aW9uIGFuZCB0cmF2ZWwgYXJvdW5kIHRoZSByZWNlaXZlIHJpbmcgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQKKyAqCWFsbCB0aGUgZnJhbWVzLgorICoKKyAqCVRoaXMgbWVhbnMgdGhhdCB3ZSBtYXkgcHJvY2VzcyB0aGUgZnJhbWUgYmVmb3JlIHdlIHJlY2VpdmUgdGhlIGVuZAorICoJb2YgZnJhbWUgaW50ZXJydXB0LiBUaGlzIGlzIHdoeSB3ZSBhbHdheXMgdGVzdCB0aGUgc3RhdHVzIGluc3RlYWQKKyAqCW9mIGJsaW5kbHkgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4KKyAqCisgKglXZSBhbHNvIHJlbW92ZSB0aGUgbGFzdCA0IGJ5dGVzIGZyb20gdGhlIHBhY2tldCBhcyB3ZWxsLCB0aGVzZSBhcmUKKyAqCWp1c3QgdG9rZW4gcmluZyB0cmFpbGVyIGluZm8gYW5kIHVwc2V0IHByb3RvY29scyB0aGF0IGRvbid0IGNoZWNrIAorICoJdGhlaXIgb3duIGxlbmd0aCwgaS5lLiBTTkEuIAorICoJCisgKi8KK3N0YXRpYyB2b2lkIG9seW1waWNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvOworCXN0cnVjdCBvbHltcGljX3J4X3N0YXR1cyAqcnhfc3RhdHVzOworCXN0cnVjdCBvbHltcGljX3J4X2Rlc2MgKnJ4X2Rlc2MgOyAKKwlpbnQgcnhfcmluZ19sYXN0X3JlY2VpdmVkLGxlbmd0aCwgYnVmZmVyX2NudCwgY3B5X2xlbmd0aCwgZnJhZ19sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjI7CisJaW50IGk7CisKKwlyeF9zdGF0dXM9JihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbKG9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQgKyAxKSAmIChPTFlNUElDX1JYX1JJTkdfU0laRSAtIDEpXSkgOyAKKyAKKwl3aGlsZSAocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KSB7IAorICAgICAgICAgICAgICAgIHUzMiBsX3N0YXR1c19idWZmZXJjbnQ7CisKKwkJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCsrIDsKKwkJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpOworI2lmIE9MWU1QSUNfREVCVUcKKwkJcHJpbnRrKCJyeCBzdGF0dXM6ICV4IHJ4IGxlbjogJXggXG4iLCBsZTMyX3RvX2NwdShyeF9zdGF0dXMtPnN0YXR1c19idWZmZXJjbnQpLCBsZTMyX3RvX2NwdShyeF9zdGF0dXMtPmZyYWdtZW50Y250X2ZyYW1lbGVuKSk7CisjZW5kaWYKKwkJbGVuZ3RoID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5mcmFnbWVudGNudF9mcmFtZWxlbikgJiAweGZmZmY7CisJCWJ1ZmZlcl9jbnQgPSBsZTMyX3RvX2NwdShyeF9zdGF0dXMtPnN0YXR1c19idWZmZXJjbnQpICYgMHhmZmZmOyAKKwkJaSA9IGJ1ZmZlcl9jbnQgOyAvKiBOZWVkIGJ1ZmZlcl9jbnQgbGF0ZXIgZm9yIHJ4ZW5xIHVwZGF0ZSAqLyAKKwkJZnJhZ19sZW4gPSBsZTMyX3RvX2NwdShyeF9zdGF0dXMtPmZyYWdtZW50Y250X2ZyYW1lbGVuKSA+PiAxNjsgCisKKyNpZiBPTFlNUElDX0RFQlVHIAorCQlwcmludGsoImxlbmd0aDogJXgsIGZyYWdfbGVuOiAleCwgYnVmZmVyX2NudDogJXhcbiIsIGxlbmd0aCwgZnJhZ19sZW4sIGJ1ZmZlcl9jbnQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgbF9zdGF0dXNfYnVmZmVyY250ID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KTsKKwkJaWYobF9zdGF0dXNfYnVmZmVyY250ICYgMHhDMDAwMDAwMCkgeworCQkJaWYgKGxfc3RhdHVzX2J1ZmZlcmNudCAmIDB4M0IwMDAwMDApIHsKKwkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsKKwkJCQkJaWYgKGxfc3RhdHVzX2J1ZmZlcmNudCAmICgxPDwyOSkpICAvKiBSeCBGcmFtZSBUcnVuY2F0ZWQgKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSeCBGcmFtZSBUcnVuY2F0ZWQgXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjgpKSAvKlJ4IHJlY2VpdmUgb3ZlcnJ1biAqLworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJ4IEZyYW1lIFJlY2VpdmUgb3ZlcnJ1biBcbiIsZGV2LT5uYW1lKTsKKwkJCQkJaWYgKGxfc3RhdHVzX2J1ZmZlcmNudCAmICgxPDwyNykpIC8qIE5vIHJlY2VpdmUgYnVmZmVycyAqLworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHJlY2VpdmUgYnVmZmVycyBcbiIsZGV2LT5uYW1lKTsKKwkJCQkJaWYgKGxfc3RhdHVzX2J1ZmZlcmNudCAmICgxPDwyNSkpIC8qIFJlY2VpdmUgZnJhbWUgZXJyb3IgZGV0ZWN0ICovCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBmcmFtZSBlcnJvciBkZXRlY3QgXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjQpKSAvKiBSZWNlaXZlZCBFcnJvciBEZXRlY3QgKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCBFcnJvciBEZXRlY3QgXG4iLGRldi0+bmFtZSk7CisJCQkJfSAKKwkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArPSBpIDsgCisJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKSA7IAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy5yeF9lcnJvcnMrKzsJIAorCQkJfSBlbHNlIHsJCisJCQkKKwkJCQlpZiAoYnVmZmVyX2NudCA9PSAxKSB7CisJCQkJCXNrYiA9IGRldl9hbGxvY19za2IobWF4X3QoaW50LCBvbHltcGljX3ByaXYtPnBrdF9idWZfc3osbGVuZ3RoKSkgOyAKKwkJCQl9IGVsc2UgeworCQkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCkgOyAKKwkJCQl9CisKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgcGFja2V0IHRvIHVwcGVyIGxheWVycy4gXG4iLGRldi0+bmFtZSkgOworCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMucnhfZHJvcHBlZCsrIDsgCisJCQkJCS8qIFVwZGF0ZSBjb3VudGVycyBldmVuIHRob3VnaCB3ZSBkb24ndCB0cmFuc2ZlciB0aGUgZnJhbWUgKi8KKwkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAorCQkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpIDsgIAorCQkJCX0gZWxzZSAgeworCQkJCQlza2ItPmRldiA9IGRldiA7IAorCisJCQkJCS8qIE9wdGltaXNlIGJhc2VkIHVwb24gbnVtYmVyIG9mIGJ1ZmZlcnMgdXNlZC4gCisJCQkgICAJICAgCSAgIElmIG9ubHkgb25lIGJ1ZmZlciBpcyB1c2VkIHdlIGNhbiBzaW1wbHkgc3dhcCB0aGUgYnVmZmVycyBhcm91bmQuCisJCQkgICAJICAgCSAgIElmIG1vcmUgdGhhbiBvbmUgdGhlbiB3ZSBtdXN0IHVzZSB0aGUgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgaW5mb3JtYXRpb24KKwkJCSAgIAkgICAJICAgZmlyc3QuIElkZWFsbHkgYWxsIGZyYW1lcyB3b3VsZCBiZSBpbiBhIHNpbmdsZSBidWZmZXIsIHRoaXMgY2FuIGJlIHR1bmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIAkgICBhbHRlcmluZyB0aGUgYnVmZmVyIHNpemUuIElmIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBpcyBsZXNzIHRoYW4KKwkJCQkJICAgMTUwMCBieXRlcyB3ZSdyZSBnb2luZyB0byBjb3B5IGl0IG92ZXIgYW55d2F5IHRvIHN0b3AgcGFja2V0cyBnZXR0aW5nCisJCQkJCSAgIGRyb3BwZWQgZnJvbSBzb2NrZXRzIHdpdGggYnVmZmVycyBzbWFsbGVyIHRoYW4gb3VyIHBrdF9idWZfc3ouICovCisJCQkJCisgCQkJCQlpZiAoYnVmZmVyX2NudD09MSkgeworCQkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQrKyA7IAorCQkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKTsKKwkJCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IG9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkIDsKKwkJCQkJCWlmIChsZW5ndGggPiAxNTAwKSB7IAorCQkJCQkJCXNrYjI9b2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdIDsgCisJCQkJCQkJLyogdW5tYXAgYnVmZmVyICovCisJCQkJCQkJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsCisJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwgCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQkJCQkJc2tiX3B1dChza2IyLGxlbmd0aC00KTsKKwkJCQkJCQlza2IyLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiMixkZXYpOworCQkJCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyID0gCisJCQkJCQkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgc2tiLT5kYXRhLCAKKwkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLnJlc19sZW5ndGggPSAKKwkJCQkJCQkJY3B1X3RvX2xlMzIob2x5bXBpY19wcml2LT5wa3RfYnVmX3N6KTsgCisJCQkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdID0gc2tiIDsgCisJCQkJCQkJbmV0aWZfcngoc2tiMikgOyAKKwkJCQkJCX0gZWxzZSB7IAorCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShvbHltcGljX3ByaXYtPnBkZXYsCisJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOyAKKwkJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsbGVuZ3RoLTQpLG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS0+ZGF0YSxsZW5ndGgtNCkgOyAKKwkJCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKKwkJCQkJCQlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsZGV2KSA7IAorCQkJCQkJCW5ldGlmX3J4KHNrYikgOyAKKwkJCQkJCX0gCisJCQkJCX0gZWxzZSB7CisJCQkJCQlkbyB7IC8qIFdhbGsgdGhlIGJ1ZmZlcnMgKi8gCisJCQkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQrKyA7IAorCQkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICY9IChPTFlNUElDX1JYX1JJTkdfU0laRSAtMSk7CisJCQkJCQkJcnhfcmluZ19sYXN0X3JlY2VpdmVkID0gb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgOyAKKwkJCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQkJCQkJcnhfZGVzYyA9ICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSk7CisJCQkJCQkJY3B5X2xlbmd0aCA9IChpID09IDEgPyBmcmFnX2xlbiA6IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPnJlc19sZW5ndGgpKTsgCisJCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBjcHlfbGVuZ3RoKSwgb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLT5kYXRhLCBjcHlfbGVuZ3RoKSA7CisJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG9seW1waWNfcHJpdi0+cGRldiwKKwkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJCQl9IHdoaWxlICgtLWkpIDsgCisJCQkJCQlza2JfdHJpbShza2Isc2tiLT5sZW4tNCkgOyAKKwkJCQkJCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCQkJbmV0aWZfcngoc2tiKSA7IAorCQkJCQl9IAorCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzIDsgCisJCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy5yeF9wYWNrZXRzKysgOyAKKwkJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3N0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aCA7IAorCQkJCX0gLyogaWYgc2tiID09IG51bGwgKi8KKwkJCX0gLyogSWYgc3RhdHVzICYgMHgzYiAqLworCisJCX0gZWxzZSB7IC8qaWYgYnVmZmVyY250ICYgMHhDICovCisJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArPSBpIDsgCisJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLSAxKSA7IAorCQl9IAorCisJCXJ4X3N0YXR1cy0+ZnJhZ21lbnRjbnRfZnJhbWVsZW4gPSAwIDsgCisJCXJ4X3N0YXR1cy0+c3RhdHVzX2J1ZmZlcmNudCA9IDAgOyAKKwkJcnhfc3RhdHVzID0gJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbKG9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQrMSkgJiAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpIF0pOworCisJCXdyaXRldygoKChyZWFkdyhvbHltcGljX21taW8rUlhFTlEpKSAmIDB4ODAwMCkgXiAweDgwMDApIHwgIGJ1ZmZlcl9jbnQgLCBvbHltcGljX21taW8rUlhFTlEpOyAKKwl9IC8qIHdoaWxlICovCisKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19mcmVlbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJaW50IGk7CisJCQkKKwlmb3IoaT0wO2k8T0xZTVBJQ19SWF9SSU5HX1NJWkU7aSsrKSB7CisJCWlmIChvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWRdICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2JfaXJxKG9seW1waWNfcHJpdi0+cnhfcmluZ19za2Jbb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZF0pOworCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXSA9IE5VTEw7CisJCX0KKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW29seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciAhPSAweGRlYWRiZWVmKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgCisJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQrKzsKKwkJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCY9T0xZTVBJQ19SWF9SSU5HX1NJWkUtMTsKKwl9CisJLyogdW5tYXAgcmluZ3MgKi8KKwlwY2lfdW5tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfcmluZ19kbWFfYWRkciwgCisJCXNpemVvZihzdHJ1Y3Qgb2x5bXBpY19yeF9zdGF0dXMpICogT0xZTVBJQ19SWF9SSU5HX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIG9seW1waWNfcHJpdi0+cnhfcmluZ19kbWFfYWRkciwKKwkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3J4X2Rlc2MpICogT0xZTVBJQ19SWF9SSU5HX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIG9seW1waWNfcHJpdi0+dHhfc3RhdHVzX3JpbmdfZG1hX2FkZHIsIAorCQlzaXplb2Yoc3RydWN0IG9seW1waWNfdHhfc3RhdHVzKSAqIE9MWU1QSUNfVFhfUklOR19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIsIAorCQlzaXplb2Yoc3RydWN0IG9seW1waWNfdHhfZGVzYykgKiBPTFlNUElDX1RYX1JJTkdfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlyZXR1cm4gOyAKK30KKyAKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbHltcGljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwl1MzIgc2lzcjsKKwl1OCBfX2lvbWVtICphZGFwdGVyX2NoZWNrX2FyZWEgOyAKKwkKKwkvKiAKKwkgKiAgUmVhZCBzaXNyIGJ1dCBkb24ndCByZXNldCBpdCB5ZXQuIAorCSAqICBUaGUgaW5kaWNhdGlvbiBiaXQgbWF5IGhhdmUgYmVlbiBzZXQgYnV0IHRoZSBpbnRlcnJ1cHQgbGF0Y2gKKwkgKiAgYml0IG1heSBub3QgYmUgc2V0LCBzbyB3ZSdkIGxvc2UgdGhlIGludGVycnVwdCBsYXRlci4gCisJICovIAorCXNpc3I9cmVhZGwob2x5bXBpY19tbWlvK1NJU1IpIDsgCisJaWYgKCEoc2lzciAmIFNJU1JfTUkpKSAvKiBJbnRlcnJ1cHQgaXNuJ3QgZm9yIHVzICovIAorCQlyZXR1cm4gSVJRX05PTkU7CisJc2lzcj1yZWFkbChvbHltcGljX21taW8rU0lTUl9SUikgOyAgLyogUmVhZCAmIFJlc2V0IHNpc3IgKi8gCisKKwlzcGluX2xvY2soJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKTsKKworCS8qIEhvdHN3YXAgZ2l2ZXMgdXMgdGhpcyBvbiByZW1vdmFsICovCisJaWYgKHNpc3IgPT0gMHhmZmZmZmZmZikgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhvdHN3YXAgYWRhcHRlciByZW1vdmFsLlxuIixkZXYtPm5hbWUpIDsgCisJCXNwaW5fdW5sb2NrKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jaykgOyAKKwkJcmV0dXJuIElSUV9OT05FOworCX0gCisJCQorCWlmIChzaXNyICYgKFNJU1JfU1JCX1JFUExZIHwgU0lTUl9UWDFfRU9GIHwgU0lTUl9SWF9TVEFUVVMgfCBTSVNSX0FEQVBURVJfQ0hFQ0sgfCAgCisJCQlTSVNSX0FTQl9GUkVFIHwgU0lTUl9BUkJfQ01EIHwgU0lTUl9UUkJfUkVQTFkgfCBTSVNSX1JYX05PQlVGIHwgU0lTUl9FUlIpKSB7ICAKKwkKKwkJLyogSWYgd2UgZXZlciBnZXQgdGhpcyB0aGUgYWRhcHRlciBpcyBzZXJpb3VzbHkgZGVhZC4gT25seSBhIHJlc2V0IGlzIGdvaW5nIHRvIAorCQkgKiBicmluZyBpdCBiYWNrIHRvIGxpZmUuIFdlJ3JlIHRhbGtpbmcgcGNpIGJ1cyBlcnJvcnMgYW5kIHN1Y2ggbGlrZSA6KCAqLyAKKwkJaWYoKHNpc3IgJiBTSVNSX0VSUikgJiYgKHJlYWRsKG9seW1waWNfbW1pbytFSVNSKSAmIEVJU1JfTUFTS19PUFRJT05TKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJPbHltcGljOiBFSVNSIEVycm9yLCBFSVNSPSUwOHhcbiIscmVhZGwob2x5bXBpY19tbWlvK0VJU1IpKSA7IAorCQkJcHJpbnRrKEtFUk5fRVJSICJUaGUgYWRhcHRlciBtdXN0IGJlIHJlc2V0IHRvIGNsZWFyIHRoaXMgY29uZGl0aW9uLlxuIikgOyAKKwkJCXByaW50ayhLRVJOX0VSUiAiUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yIHRvIHRoZSBkcml2ZXIgbWFpbnRhaW5lciBhbmQvXG4iKSA7IAorCQkJcHJpbnRrKEtFUk5fRVJSICJvciB0aGUgbGludXgtdHIgbWFpbGluZyBsaXN0LlxuIikgOyAKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCk7CisJCQlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0gLyogU0lTUl9FUlIgKi8KKworCQlpZihzaXNyICYgU0lTUl9TUkJfUkVQTFkpIHsKKwkJCWlmKG9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD09MSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCk7CisJCQl9IGVsc2UgaWYgKG9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD09MikgeyAKKwkJCQlvbHltcGljX3NyYl9iaChkZXYpIDsgCisJCQl9CisJCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MDsKKwkJfSAvKiBTSVNSX1NSQl9SRVBMWSAqLworCisJCS8qIFdlIHNob3VsZG4ndCBldmVyIG1pc3MgdGhlIFR4IGludGVycnVwdCwgYnV0IHRoZSB5b3UgbmV2ZXIga25vdywgaGVuY2UgdGhlIGxvb3AgdG8gZW5zdXJlCisJCSAgIHdlIGdldCBhbGwgdHggY29tcGxldGlvbnMuICovCisJCWlmIChzaXNyICYgU0lTUl9UWDFfRU9GKSB7CisJCQl3aGlsZShvbHltcGljX3ByaXYtPm9seW1waWNfdHhfc3RhdHVzX3JpbmdbKG9seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyArIDEpICYgKE9MWU1QSUNfVFhfUklOR19TSVpFLTEpXS5zdGF0dXMpIHsgCisJCQkJb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzKys7CisJCQkJb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzICY9IChPTFlNUElDX1RYX1JJTkdfU0laRS0xKTsKKwkJCQlvbHltcGljX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzKys7CisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3N0YXRzLnR4X2J5dGVzICs9IG9seW1waWNfcHJpdi0+dHhfcmluZ19za2Jbb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS0+bGVuOworCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy50eF9wYWNrZXRzKysgOyAKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgCisJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmZmVyKSwgCisJCQkJCW9seW1waWNfcHJpdi0+dHhfcmluZ19za2Jbb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS0+bGVuLFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxKG9seW1waWNfcHJpdi0+dHhfcmluZ19za2Jbb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXSk7CisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3Jpbmdbb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5idWZmZXI9MHhkZWFkYmVlZjsKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfdHhfc3RhdHVzX3Jpbmdbb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5zdGF0dXM9MDsKKwkJCX0KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfSAvKiBTSVNSX1RYMV9FT0YgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX1JYX1NUQVRVUykgeworCQkJb2x5bXBpY19yeChkZXYpOworCQl9IC8qIFNJU1JfUlhfU1RBVFVTICovCisJCisJCWlmIChzaXNyICYgU0lTUl9BREFQVEVSX0NIRUNLKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBDaGVjayBJbnRlcnJ1cHQgUmFpc2VkLCA4IGJ5dGVzIG9mIGluZm9ybWF0aW9uIGZvbGxvdzpcbiIsIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0xBUFdXQyksb2x5bXBpY19tbWlvK0xBUEEpOworCQkJYWRhcHRlcl9jaGVja19hcmVhID0gb2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArICgocmVhZGwob2x5bXBpY19tbWlvK0xBUFdXQykpICYgKH4weGY4MDApKSA7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQnl0ZXMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLGRldi0+bmFtZSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzApLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErMSksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSsyKSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzMpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErNCksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSs1KSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzYpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErNykpIDsgCisJCQlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IAorCQl9IC8qIFNJU1JfQURBUFRFUl9DSEVDSyAqLworCQorCQlpZiAoc2lzciAmIFNJU1JfQVNCX0ZSRUUpIHsKKwkJCS8qIFdha2UgdXAgYW55dGhpbmcgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgYXNiIHJlc3BvbnNlICovICAKKwkJCWlmIChvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQpIHsKKwkJCQlvbHltcGljX2FzYl9iaChkZXYpIDsgCisJCQl9CisJCX0gLyogU0lTUl9BU0JfRlJFRSAqLworCQorCQlpZiAoc2lzciAmIFNJU1JfQVJCX0NNRCkgeworCQkJb2x5bXBpY19hcmJfY21kKGRldikgOyAKKwkJfSAvKiBTSVNSX0FSQl9DTUQgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX1RSQl9SRVBMWSkgeworCQkJLyogV2FrZSB1cCBhbnl0aGluZyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSB0cmIgcmVzcG9uc2UgKi8KKwkJCWlmIChvbHltcGljX3ByaXYtPnRyYl9xdWV1ZWQpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9seW1waWNfcHJpdi0+dHJiX3dhaXQpOworCQkJfQorCQkJb2x5bXBpY19wcml2LT50cmJfcXVldWVkID0gMCA7IAorCQl9IC8qIFNJU1JfVFJCX1JFUExZICovCQorCQorCQlpZiAoc2lzciAmIFNJU1JfUlhfTk9CVUYpIHsKKwkJCS8qIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZywgYnV0IHRyYXBwaW5nIGl0IGtlZXBzIGl0IG91dCBvZgorICAgICAgICAgICAgICAgICAgCSAgIAkgICAvdmFyL2xvZy9tZXNzYWdlcy4gICovCisJCX0gLyogU0lTUl9SWF9OT0JVRiAqLworCX0gZWxzZSB7IAorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5leHBlY3RlZCBpbnRlcnJ1cHQ6ICV4XG4iLGRldi0+bmFtZSwgc2lzcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTSVNSX01BU0s6ICV4XG4iLGRldi0+bmFtZSwgcmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpIDsKKwl9IC8qIE9uZSBpZiB0aGUgaW50ZXJydXB0cyB3ZSB3YW50ICovCisJd3JpdGVsKFNJU1JfTUksb2x5bXBpY19tbWlvK1NJU1JfTUFTS19TVU0pOworCQorCXNwaW5fdW5sb2NrKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jaykgOyAKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CQorCitzdGF0aWMgaW50IG9seW1waWNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgOyAKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmKG9seW1waWNfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXMpIHsKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3Jpbmdbb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWVdLmJ1ZmZlciA9IAorCQkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3Jpbmdbb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWVdLnN0YXR1c19sZW5ndGggPSBjcHVfdG9fbGUzMihza2ItPmxlbiB8ICgweDgwMDAwMDAwKSk7CisJCW9seW1waWNfcHJpdi0+dHhfcmluZ19za2Jbb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWVdPXNrYjsKKwkJb2x5bXBpY19wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcy0tOworCisgICAgICAgIAlvbHltcGljX3ByaXYtPnR4X3JpbmdfZnJlZSsrOworICAgICAgICAJb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWUgJj0gKE9MWU1QSUNfVFhfUklOR19TSVpFLTEpOworCQl3cml0ZXcoKCgocmVhZHcob2x5bXBpY19tbWlvK1RYRU5RXzEpKSAmIDB4ODAwMCkgXiAweDgwMDApIHwgMSxvbHltcGljX21taW8rVFhFTlFfMSk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisJCXJldHVybiAxOworCX0gCisKK30KKwkKKworc3RhdGljIGludCBvbHltcGljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW8sKnNyYjsKKwl1bnNpZ25lZCBsb25nIHQsZmxhZ3M7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpIDsgCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJd3JpdGVsKG9seW1waWNfcHJpdi0+c3JiLG9seW1waWNfbW1pbytMQVBBKTsKKwlzcmI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIChvbHltcGljX3ByaXYtPnNyYiAmICh+MHhmODAwKSk7CisJCisgICAgCXdyaXRlYihTUkJfQ0xPU0VfQURBUFRFUixzcmIrMCk7CisJd3JpdGViKDAsc3JiKzEpOworCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKworCWFkZF93YWl0X3F1ZXVlKCZvbHltcGljX3ByaXYtPnNyYl93YWl0LCZ3YWl0KSA7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKSA7IAorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrLGZsYWdzKTsKKwlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MTsKKworCXdyaXRlbChMSVNSX1NSQl9DTUQsb2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisKKwl3aGlsZShvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQpIHsKKworCQl0ID0gc2NoZWR1bGVfdGltZW91dCg2MCpIWik7IAorCisgICAgICAgIAlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkJeyAgICAgICAgICAgIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuXG4iLGRldi0+bmFtZSk7CisgICAgICAgICAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNJU1I9JXggTUlTUj0leFxuIixyZWFkbChvbHltcGljX21taW8rU0lTUikscmVhZGwob2x5bXBpY19tbWlvK0xJU1IpKTsKKyAgICAgICAgICAgIAkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisgICAgICAgICAgICAJCWJyZWFrOworICAgICAgICAJfQorCisJCWlmICh0ID09IDApIHsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU1JCIHRpbWVkIG91dC4gTWF5IG5vdCBiZSBmYXRhbC4gXG4iLGRldi0+bmFtZSkgOyAKKwkJfSAKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisgICAgCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCwmd2FpdCkgOyAKKworCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQrKzsKKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkJj1PTFlNUElDX1JYX1JJTkdfU0laRS0xOworCisJb2x5bXBpY19mcmVlbWVtKGRldikgOyAJCisKKwkvKiByZXNldCB0eC9yeCBmaWZvJ3MgYW5kIGJ1c21hc3RlciBsb2dpYyAqLworCisJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKXwoMzw8MTMpLG9seW1waWNfbW1pbytCQ1RMKTsKKwl1ZGVsYXkoMSk7CisJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSZ+KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisKKyNpZiBPTFlNUElDX0RFQlVHCisJeworCWludCBpIDsgCisJcHJpbnRrKCJzcmIoJXApOiAiLHNyYik7CisJZm9yKGk9MDtpPDQ7aSsrKQorCQlwcmludGsoIiV4ICIscmVhZGIoc3JiK2kpKTsKKwlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKworCXJldHVybiAwOworCQorfQorCitzdGF0aWMgdm9pZCBvbHltcGljX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdiA9IChzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopIGRldi0+cHJpdiA7IAorICAgCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbyA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvIDsgCisJdTggb3B0aW9ucyA9IDA7IAorCXU4IF9faW9tZW0gKnNyYjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA7IAorCXVuc2lnbmVkIGNoYXIgZGV2X21jX2FkZHJlc3NbNF0gOyAKKwlpbnQgaSA7IAorCisJd3JpdGVsKG9seW1waWNfcHJpdi0+c3JiLG9seW1waWNfbW1pbytMQVBBKTsKKwlzcmI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIChvbHltcGljX3ByaXYtPnNyYiAmICh+MHhmODAwKSk7CisJb3B0aW9ucyA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zOyAKKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKSAgCisJCW9wdGlvbnMgfD0gMHg2MSA7CisJZWxzZQorCQlvcHRpb25zICY9IH4weDYxIDsgCisKKwkvKiBPbmx5IGlzc3VlIHRoZSBzcmIgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gb3B0aW9ucyAqLworCisJaWYgKChvcHRpb25zIF4gb2x5bXBpY19wcml2LT5vbHltcGljX2NvcHlfYWxsX29wdGlvbnMpKSB7IAorCQorCQkvKiBOb3cgdG8gaXNzdWUgdGhlIHNyYiBjb21tYW5kIHRvIGFsdGVyIHRoZSBjb3B5LmFsbC5vcHRpb25zICovCisJCisJCXdyaXRlYihTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyxzcmIpOworCQl3cml0ZWIoMCxzcmIrMSk7CisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwkJd3JpdGViKDAsc3JiKzMpOworCQl3cml0ZWIob2x5bXBpY19wcml2LT5vbHltcGljX3JlY2VpdmVfb3B0aW9ucyxzcmIrNCk7CisJCXdyaXRlYihvcHRpb25zLHNyYis1KTsKKworCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MjsgLyogQ2FuJ3Qgc2xlZXAsIHVzZSBzcmJfYmggKi8KKworCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX2NvcHlfYWxsX29wdGlvbnMgPSBvcHRpb25zIDsKKwkJCisJCXJldHVybiA7ICAKKwl9IAorCisJLyogU2V0IHRoZSBmdW5jdGlvbmFsIGFkZHJlc3NlcyB3ZSBuZWVkIGZvciBtdWx0aWNhc3QgKi8KKworCWRldl9tY19hZGRyZXNzWzBdID0gZGV2X21jX2FkZHJlc3NbMV0gPSBkZXZfbWNfYWRkcmVzc1syXSA9IGRldl9tY19hZGRyZXNzWzNdID0gMCA7IAorCisJZm9yIChpPTAsZG1pPWRldi0+bWNfbGlzdDtpIDwgZGV2LT5tY19jb3VudDsgaSsrLGRtaSA9IGRtaS0+bmV4dCkgeyAKKwkJZGV2X21jX2FkZHJlc3NbMF0gfD0gZG1pLT5kbWlfYWRkclsyXSA7IAorCQlkZXZfbWNfYWRkcmVzc1sxXSB8PSBkbWktPmRtaV9hZGRyWzNdIDsgCisJCWRldl9tY19hZGRyZXNzWzJdIHw9IGRtaS0+ZG1pX2FkZHJbNF0gOyAKKwkJZGV2X21jX2FkZHJlc3NbM10gfD0gZG1pLT5kbWlfYWRkcls1XSA7IAorCX0KKworCXdyaXRlYihTUkJfU0VUX0ZVTkNfQUREUkVTUyxzcmIrMCk7CisJd3JpdGViKDAsc3JiKzEpOworCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwl3cml0ZWIoMCxzcmIrMyk7CisJd3JpdGViKDAsc3JiKzQpOworCXdyaXRlYigwLHNyYis1KTsKKwl3cml0ZWIoZGV2X21jX2FkZHJlc3NbMF0sc3JiKzYpOworCXdyaXRlYihkZXZfbWNfYWRkcmVzc1sxXSxzcmIrNyk7CisJd3JpdGViKGRldl9tY19hZGRyZXNzWzJdLHNyYis4KTsKKwl3cml0ZWIoZGV2X21jX2FkZHJlc3NbM10sc3JiKzkpOworCisJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkID0gMiA7CisJd3JpdGVsKExJU1JfU1JCX0NNRCxvbHltcGljX21taW8rTElTUl9TVU0pOworCit9CisKK3N0YXRpYyB2b2lkIG9seW1waWNfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKyAgIAl1OCBfX2lvbWVtICpvbHltcGljX21taW8gPSBvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbyA7IAorCXU4IF9faW9tZW0gKnNyYjsKKworCXdyaXRlbChvbHltcGljX3ByaXYtPnNyYixvbHltcGljX21taW8rTEFQQSk7CisJc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAob2x5bXBpY19wcml2LT5zcmIgJiAofjB4ZjgwMCkpOworCisJc3dpdGNoIChyZWFkYihzcmIpKSB7IAorCisJCS8qIFNSQl9NT0RJRllfUkVDRUlWRV9PUFRJT05TIGkuZS4gc2V0X211bHRpY2FzdF9saXN0IG9wdGlvbnMgKHByb21pc2N1b3VzKSAKKyAgICAgICAgICAgICAgICAgKiBBdCBzb21lIHBvaW50IHdlIHNob3VsZCBkbyBzb21ldGhpbmcgaWYgd2UgZ2V0IGFuIGVycm9yLCBzdWNoIGFzCisgICAgICAgICAgICAgICAgICogcmVzZXR0aW5nIHRoZSBJRkZfUFJPTUlTQyBmbGFnIGluIGRldgorCQkgKi8KKworCQljYXNlIFNSQl9NT0RJRllfUkVDRUlWRV9PUFRJT05TOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDQ6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLGRldi0+bmFtZSk7CisJCQkJCWJyZWFrIDsgCisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSAKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIE9wdGlvbnMgTW9kaWZpZWQgdG8gJXgsJXhcbiIsZGV2LT5uYW1lLG9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zLCBvbHltcGljX3ByaXYtPm9seW1waWNfcmVjZWl2ZV9vcHRpb25zKSA7IAorCQkJCQlicmVhayA7IAkKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLyAKKwkJCWJyZWFrIDsKKwkJCisJCS8qIFNSQl9TRVRfR1JPVVBfQUREUkVTUyAtIE11bHRpY2FzdCBncm91cCBzZXR0aW5nIAorICAgICAgICAgICAgICAgICAqLworCisJCWNhc2UgU1JCX1NFVF9HUk9VUF9BRERSRVNTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOgorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpOyAKKwkJCQkJYnJlYWsgOworCQkJCWNhc2UgMHgzYzoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEdyb3VwL0Z1bmN0aW9uYWwgYWRkcmVzcyBpbmRpY2F0b3IgYml0cyBub3Qgc2V0IGNvcnJlY3RseVxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsKKwkJCQljYXNlIDB4M2U6IC8qIElmIHdlIGV2ZXIgaW1wbGVtZW50IGluZGl2aWR1YWwgbXVsdGljYXN0IGFkZHJlc3Nlcywgd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCB0aGlzICovCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cCBhZGRyZXNzIHJlZ2lzdGVycyBmdWxsXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAgCisJCQkJY2FzZSAweDU1OgorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogR3JvdXAgQWRkcmVzcyBhbHJlYWR5IHNldC5cbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWsgOyAKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLyAKKwkJCWJyZWFrIDsgCisKKwkJLyogU1JCX1JFU0VUX0dST1VQX0FERFJFU1MgLSBSZW1vdmUgYSBtdWx0aWNhc3QgYWRkcmVzcyBmcm9tIGdyb3VwIGxpc3QKKyAJCSAqLworCisJCWNhc2UgU1JCX1JFU0VUX0dST1VQX0FERFJFU1M6CisJCQlzd2l0Y2ggKHJlYWRiKHNyYisyKSkgeyAKKwkJCQljYXNlIDB4MDA6CisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDM5OiAvKiBNdXN0IGRlYWwgd2l0aCB0aGlzIGlmIGluZGl2aWR1YWwgbXVsdGljYXN0IGFkZHJlc3NlcyB1c2VkICovCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHcm91cCBhZGRyZXNzIG5vdCBmb3VuZCBcbiIsZGV2LT5uYW1lKTsgCisJCQkJCWJyZWFrIDsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhayA7IAorCQkJfSAvKiBzd2l0Y2ggc3JiWzJdICovCisJCQlicmVhayA7IAorCisJCQorCQkvKiBTUkJfU0VUX0ZVTkNfQUREUkVTUyAtIENhbGxlZCBieSB0aGUgc2V0X3J4X21vZGUgCisJCSAqLworCisJCWNhc2UgU1JCX1NFVF9GVU5DX0FERFJFU1M6CisJCQlzd2l0Y2ggKHJlYWRiKHNyYisyKSkgeyAKKwkJCQljYXNlIDB4MDA6CisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3MgTWFzayBTZXQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOworCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrIDsgCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJCWJyZWFrIDsgCisJCisJCS8qIFNSQl9SRUFEX0xPRyAtIFJlYWQgYW5kIHJlc2V0IHRoZSBhZGFwdGVyIGVycm9yIGNvdW50ZXJzCisgCQkgKi8KKworCQljYXNlIFNSQl9SRUFEX0xPRzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMDogCisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBMb2cgaXNzdWVkXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDE6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDQ6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQorCQkJfSAvKiBzd2l0Y2ggc3JiWzJdICovCisJCQlicmVhayA7IAorCQkKKwkJLyogU1JCX1JFQURfU1JfQ09VTlRFUlMgLSBSZWFkIGFuZCByZXNldCB0aGUgc291cmNlIHJvdXRpbmcgYnJpZGdlIHJlbGF0ZWQgY291bnRlcnMgKi8KKworCQljYXNlIFNSQl9SRUFEX1NSX0NPVU5URVJTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOiAKKwkJCQkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSAKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWFkIFNvdXJjZSBSb3V0aW5nIENvdW50ZXJzIGlzc3VlZFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWsgOyAKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLworCQkJYnJlYWsgOworIAorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgYmggcmV0dXJuIHZhbHVlLlxuIixkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwl9IC8qIHN3aXRjaCBzcmJbMF0gKi8KKworfSAKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogb2x5bXBpY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgOworCW9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmb2x5bXBpY19wcml2LT5vbHltcGljX3N0YXRzOyAKK30KKworc3RhdGljIGludCBvbHltcGljX3NldF9tYWNfYWRkcmVzcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikgCit7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9IGFkZHIgOyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdiA7IAorCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBzZXQgbWFjL2xhYSBhZGRyZXNzIHdoaWxlIGNhcmQgaXMgb3BlblxuIiwgZGV2LT5uYW1lKSA7IAorCQlyZXR1cm4gLUVJTyA7IAorCX0KKworCW1lbWNweShvbHltcGljX3ByaXYtPm9seW1waWNfbGFhLCBzYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKSA7IAorCQorCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgeyAKKyAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUMvTEFBIFNldCB0byAgPSAleC4leC4leC4leC4leC4leFxuIixkZXYtPm5hbWUsIG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0sCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMV0sIG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMl0sCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbM10sIG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNF0sCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNV0pOworCX0gCisKKwlyZXR1cm4gMCA7IAorfQorCitzdGF0aWMgdm9pZCBvbHltcGljX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvOworCXU4IF9faW9tZW0gKmFyYl9ibG9jaywgKmFzYl9ibG9jaywgKnNyYiAgOyAKKwl1OCBoZWFkZXJfbGVuIDsgCisJdTE2IGZyYW1lX2xlbiwgYnVmZmVyX2xlbiA7CisJc3RydWN0IHNrX2J1ZmYgKm1hY19mcmFtZSA7ICAKKwl1OCBfX2lvbWVtICpidWZfcHRyIDsKKwl1OCBfX2lvbWVtICpmcmFtZV9kYXRhIDsgIAorCXUxNiBidWZmX29mZiA7IAorCXUxNiBsYW5fc3RhdHVzID0gMCwgbGFuX3N0YXR1c19kaWZmICA7IC8qIEluaXRpYWxpemUgdG8gc3RvcCBjb21waWxlciB3YXJuaW5nICovCisJdTggZmR4X3Byb3RfZXJyb3IgOyAKKwl1MTYgbmV4dF9wdHI7CisKKwlhcmJfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXJiKSA7IAorCWFzYl9ibG9jayA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5hc2IpIDsgCisJc3JiID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPnNyYikgOyAKKwkKKwlpZiAocmVhZGIoYXJiX2Jsb2NrKzApID09IEFSQl9SRUNFSVZFX0RBVEEpIHsgLyogUmVjZWl2ZS5kYXRhLCBNQUMgZnJhbWVzICovCisKKwkJaGVhZGVyX2xlbiA9IHJlYWRiKGFyYl9ibG9jays4KSA7IC8qIDgwMi41IFRva2VuLVJpbmcgSGVhZGVyIExlbmd0aCAqLwkKKwkJZnJhbWVfbGVuID0gc3dhYjE2KHJlYWR3KGFyYl9ibG9jayArIDEwKSkgOyAKKworCQlidWZmX29mZiA9IHN3YWIxNihyZWFkdyhhcmJfYmxvY2sgKyA2KSkgOworCQkKKwkJYnVmX3B0ciA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBidWZmX29mZiA7IAorCisjaWYgT0xZTVBJQ19ERUJVRworeworCQlpbnQgaTsKKwkJZnJhbWVfZGF0YSA9IGJ1Zl9wdHIrb2Zmc2V0b2Yoc3RydWN0IG1hY19yZWNlaXZlX2J1ZmZlcixmcmFtZV9kYXRhKSA7IAorCisJCWZvciAoaT0wIDsgIGkgPCAxNCA7IGkrKykgeyAKKwkJCXByaW50aygiTG9jICVkID0gJTAyeFxuIixpLHJlYWRiKGZyYW1lX2RhdGEgKyBpKSk7IAorCQl9CisKKwkJcHJpbnRrKCJuZXh0ICUwNHgsIGZzICUwMngsIGxlbiAlMDR4IFxuIixyZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsbmV4dCkpLCByZWFkYihidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsZnJhbWVfc3RhdHVzKSksIHJlYWR3KGJ1Zl9wdHIrb2Zmc2V0b2Yoc3RydWN0IG1hY19yZWNlaXZlX2J1ZmZlcixidWZmZXJfbGVuZ3RoKSkpOyAKK30KKyNlbmRpZiAKKwkJbWFjX2ZyYW1lID0gZGV2X2FsbG9jX3NrYihmcmFtZV9sZW4pIDsgCisJCWlmICghbWFjX2ZyYW1lKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIGZyYW1lLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcF9mcmFtZTsKKwkJfQorCisJCS8qIFdhbGsgdGhlIGJ1ZmZlciBjaGFpbiwgY3JlYXRpbmcgdGhlIGZyYW1lICovCisKKwkJZG8geworCQkJZnJhbWVfZGF0YSA9IGJ1Zl9wdHIrb2Zmc2V0b2Yoc3RydWN0IG1hY19yZWNlaXZlX2J1ZmZlcixmcmFtZV9kYXRhKSA7IAorCQkJYnVmZmVyX2xlbiA9IHN3YWIxNihyZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsYnVmZmVyX2xlbmd0aCkpKTsgCisJCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQobWFjX2ZyYW1lLCBidWZmZXJfbGVuKSwgZnJhbWVfZGF0YSAsIGJ1ZmZlcl9sZW4gKSA7CisJCQluZXh0X3B0cj1yZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsbmV4dCkpOyAKKwkJfSB3aGlsZSAobmV4dF9wdHIgJiYgKGJ1Zl9wdHI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG50b2hzKG5leHRfcHRyKSkpOworCisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yKSB7IAorCQkJc3RydWN0IHRyaF9oZHIgKm1hY19oZHIgOyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCBNQUMgRnJhbWUsIGRldGFpbHM6IFxuIixkZXYtPm5hbWUpIDsKKwkJCW1hY19oZHIgPSAoc3RydWN0IHRyaF9oZHIgKiltYWNfZnJhbWUtPmRhdGEgOyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQUMgRnJhbWUgRGVzdC4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBkZXYtPm5hbWUgLCBtYWNfaGRyLT5kYWRkclswXSwgbWFjX2hkci0+ZGFkZHJbMV0sIG1hY19oZHItPmRhZGRyWzJdLCBtYWNfaGRyLT5kYWRkclszXSwgbWFjX2hkci0+ZGFkZHJbNF0sIG1hY19oZHItPmRhZGRyWzVdKSA7IAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1BQyBGcmFtZSBTcmNlLiBBZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsIGRldi0+bmFtZSAsIG1hY19oZHItPnNhZGRyWzBdLCBtYWNfaGRyLT5zYWRkclsxXSwgbWFjX2hkci0+c2FkZHJbMl0sIG1hY19oZHItPnNhZGRyWzNdLCBtYWNfaGRyLT5zYWRkcls0XSwgbWFjX2hkci0+c2FkZHJbNV0pIDsgCisJCX0KKwkJbWFjX2ZyYW1lLT5kZXYgPSBkZXYgOyAKKwkJbWFjX2ZyYW1lLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMobWFjX2ZyYW1lLGRldik7CisJCW5ldGlmX3J4KG1hY19mcmFtZSkgOyAJCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKK2Ryb3BfZnJhbWU6CisJCS8qIE5vdyB0ZWxsIHRoZSBjYXJkIHdlIGhhdmUgZGVhbHQgd2l0aCB0aGUgcmVjZWl2ZWQgZnJhbWUgKi8KKworCQkvKiBTZXQgTElTUiBCaXQgMSAqLworCQl3cml0ZWwoTElTUl9BUkJfRlJFRSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbyArIExJU1JfU1VNKTsKKworCQkvKiBJcyB0aGUgQVNCIGZyZWUgPyAqLyAJCisJCQorCQlpZiAocmVhZGIoYXNiX2Jsb2NrICsgMikgIT0gMHhmZikgeyAKKwkJCW9seW1waWNfcHJpdi0+YXNiX3F1ZXVlZCA9IDEgOyAKKwkJCXdyaXRlbChMSVNSX0FTQl9GUkVFX1JFUSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbytMSVNSX1NVTSk7IAorCQkJcmV0dXJuIDsgCQorCQkJLyogRHJvcCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBib3R0b20gaGFsZiB0byBiZSBydW4gKi8KKwkJfQorCQkKKwkJd3JpdGViKEFTQl9SRUNFSVZFX0RBVEEsYXNiX2Jsb2NrKTsgLyogUmVjZWl2ZSBkYXRhICovCisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLGFzYl9ibG9jaysyKTsgLyogTmVjZXNzYXJ5ID8/ICovCisJCXdyaXRlYihyZWFkYihhcmJfYmxvY2srNiksYXNiX2Jsb2NrKzYpOyAvKiBNdXN0IHNlbmQgdGhlIGFkZHJlc3MgYmFjayB0byB0aGUgYWRhcHRlciAqLworCQl3cml0ZWIocmVhZGIoYXJiX2Jsb2NrKzcpLGFzYl9ibG9jays3KTsgLyogVG8gbGV0IGl0IGtub3cgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSBkYXRhICovCQkKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCQorCQlvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQgPSAyIDsgCisJCisJCXJldHVybiA7IAkKKwkJCisJfSBlbHNlIGlmIChyZWFkYihhcmJfYmxvY2spID09IEFSQl9MQU5fQ0hBTkdFX1NUQVRVUykgeyAvKiBMYW4uY2hhbmdlLnN0YXR1cyAqLworCQlsYW5fc3RhdHVzID0gc3dhYjE2KHJlYWR3KGFyYl9ibG9jays2KSk7CisJCWZkeF9wcm90X2Vycm9yID0gcmVhZGIoYXJiX2Jsb2NrKzgpIDsgCisJCQorCQkvKiBJc3N1ZSBBUkIgRnJlZSAqLworCQl3cml0ZWwoTElTUl9BUkJfRlJFRSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbytMSVNSX1NVTSk7CisKKwkJbGFuX3N0YXR1c19kaWZmID0gb2x5bXBpY19wcml2LT5vbHltcGljX2xhbl9zdGF0dXMgXiBsYW5fc3RhdHVzIDsgCisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIChMU0NfTFdGIHwgTFNDX0FSVyB8IExTQ19GUEUgfCBMU0NfUlIpICkgeyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfTFdGKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNob3J0IGNpcmN1aXQgZGV0ZWN0ZWQgb24gdGhlIGxvYmVcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQVJXKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1dG8gcmVtb3ZhbCBlcnJvclxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19GUEUpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGRFggUHJvdG9jb2wgRXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUlIpIAorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRm9yY2UgcmVtb3ZlIE1BQyBmcmFtZSByZWNlaXZlZFxuIixkZXYtPm5hbWUpOworCQkKKwkJCS8qIEFkYXB0ZXIgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBoYXJkd2FyZSAqLworCQkKKwkJCS8qIHJlc2V0IHR4L3J4IGZpZm8ncyBhbmQgYnVzbWFzdGVyIGxvZ2ljICovCisKKwkJCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCl8KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisJCQl1ZGVsYXkoMSk7CisJCQl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpJn4oMzw8MTMpLG9seW1waWNfbW1pbytCQ1RMKTsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW9seW1waWNfcHJpdi0+c3JiID0gcmVhZHcob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIExBUFdXTykgOyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJfSAvKiBJZiBzZXJpb3VzIGVycm9yICovCisJCQorCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NJR19MT1NTKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHJlY2VpdmUgc2lnbmFsIGRldGVjdGVkIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19IQVJEX0VSUikKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJlYWNvbmluZyBcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU09GVF9FUlIpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIHRyYW5zbWl0dGVkIFNvZnQgRXJyb3IgUmVwb3J0IE1hYyBGcmFtZSBcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfVFJBTl9CQ04pIAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogV2UgYXJlIHRyYW5taXR0aW5nIHRoZSBiZWFjb24sIGFhYWhcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU1MpIAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2luZ2xlIFN0YXRpb24gb24gdGhlIHJpbmcgXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19SSU5HX1JFQykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgcmVjb3Zlcnkgb25nb2luZ1xuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19GRFhfTU9ERSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZXJhdGluZyBpbiBGRFggbW9kZVxuIixkZXYtPm5hbWUpOworCQl9IAkKKwkJCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQ08pIHsgCisJCQkJCQorCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93IFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCisJCQkJLyogSXNzdWUgUkVBRC5MT0cgY29tbWFuZCAqLworCisJCQkJd3JpdGViKFNSQl9SRUFEX0xPRywgc3JiKTsKKwkJCQl3cml0ZWIoMCxzcmIrMSk7CisJCQkJd3JpdGViKE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUsc3JiKzIpOworCQkJCXdyaXRlYigwLHNyYiszKTsKKwkJCQl3cml0ZWIoMCxzcmIrNCk7CisJCQkJd3JpdGViKDAsc3JiKzUpOworCQkJCQkKKwkJCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MjsgLyogQ2FuJ3Qgc2xlZXAsIHVzZSBzcmJfYmggKi8KKworCQkJCXdyaXRlbChMSVNSX1NSQl9DTUQsb2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKwkJCQkJCisJCX0KKworCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NSX0NPKSB7IAorCisJCQkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU291cmNlIHJvdXRpbmcgY291bnRlcnMgb3ZlcmZsb3dcbiIsIGRldi0+bmFtZSk7CisKKwkJCQkvKiBJc3N1ZSBhIFJFQUQuU1IuQ09VTlRFUlMgKi8KKwkJCQkKKwkJCQl3cml0ZWIoU1JCX1JFQURfU1JfQ09VTlRFUlMsc3JiKTsKKwkJCQl3cml0ZWIoMCxzcmIrMSk7CisJCQkJd3JpdGViKE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUsc3JiKzIpOworCQkJCXdyaXRlYigwLHNyYiszKTsKKwkJCQkKKwkJCQlvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9MjsgLyogQ2FuJ3Qgc2xlZXAsIHVzZSBzcmJfYmggKi8KKworCQkJCXdyaXRlbChMSVNSX1NSQl9DTUQsb2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKworCQl9CisKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhbl9zdGF0dXMgPSBsYW5fc3RhdHVzIDsgCisJCisJfSAgLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIGFyYiBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqYXJiX2Jsb2NrLCAqYXNiX2Jsb2NrIDsgCisKKwlhcmJfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXJiKSA7IAorCWFzYl9ibG9jayA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5hc2IpIDsgCisKKwlpZiAob2x5bXBpY19wcml2LT5hc2JfcXVldWVkID09IDEpIHsgICAvKiBEcm9wcGVkIHRocm91Z2ggdGhlIGZpcnN0IHRpbWUgKi8KKworCQl3cml0ZWIoQVNCX1JFQ0VJVkVfREFUQSxhc2JfYmxvY2spOyAvKiBSZWNlaXZlIGRhdGEgKi8KKwkJd3JpdGViKE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUsYXNiX2Jsb2NrKzIpOyAvKiBOZWNlc3NhcnkgPz8gKi8KKwkJd3JpdGViKHJlYWRiKGFyYl9ibG9jays2KSxhc2JfYmxvY2srNik7IC8qIE11c3Qgc2VuZCB0aGUgYWRkcmVzcyBiYWNrIHRvIHRoZSBhZGFwdGVyICovCisJCXdyaXRlYihyZWFkYihhcmJfYmxvY2srNyksYXNiX2Jsb2NrKzcpOyAvKiBUbyBsZXQgaXQga25vdyB3ZSBoYXZlIGRlYWx0IHdpdGggdGhlIGRhdGEgKi8JCQorCisJCXdyaXRlbChMSVNSX0FTQl9SRVBMWSB8IExJU1JfQVNCX0ZSRUVfUkVRLG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKwkJb2x5bXBpY19wcml2LT5hc2JfcXVldWVkID0gMiA7IAorCisJCXJldHVybiA7IAorCX0KKworCWlmIChvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMikgeyAKKwkJc3dpdGNoIChyZWFkYihhc2JfYmxvY2srMikpIHsKKwkJCWNhc2UgMHgwMToKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGNvbW1hbmQgY29kZSBcbiIsIGRldi0+bmFtZSk7CisJCQkJYnJlYWsgOworCQkJY2FzZSAweDI2OgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgYnVmZmVyIGFkZHJlc3MgXG4iLCBkZXYtPm5hbWUpOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgMHhGRjoKKwkJCQkvKiBWYWxpZCByZXNwb25zZSwgZXZlcnl0aGluZyBzaG91bGQgYmUgb2sgYWdhaW4gKi8KKwkJCQlicmVhayA7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHJldHVybiBjb2RlIGluIGFzYlxuIixkZXYtPm5hbWUpOworCQkJCWJyZWFrIDsKKwkJfQorCX0KKwlvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQgPSAwIDsgCit9CisgCitzdGF0aWMgaW50IG9seW1waWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTE2IG1heF9tdHUgOyAKKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9PSA0KQorCQltYXhfbXR1ID0gNDUwMCA7IAorCWVsc2UKKwkJbWF4X210dSA9IDE4MDAwIDsgCisJCisJaWYgKG10dSA+IG1heF9tdHUpCisJCXJldHVybiAtRUlOVkFMIDsgCisJaWYgKG10dSA8IDEwMCkgCisJCXJldHVybiAtRUlOVkFMIDsgCisKKwlkZXYtPm10dSA9IG10dSA7IAorCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiA9IG10dSArIFRSX0hMRU4gOyAKKworCXJldHVybiAwIDsgCit9CisKK3N0YXRpYyBpbnQgb2x5bXBpY19wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEgOyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2F0ID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPm9seW1waWNfYWRkcl90YWJsZV9hZGRyKSA7IAorCXU4IF9faW9tZW0gKm9wdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX3Bhcm1zX2FkZHIpIDsgCisJaW50IHNpemUgPSAwIDsgCisJaW50IGxlbj0wOworCW9mZl90IGJlZ2luPTA7CisJb2ZmX3QgcG9zPTA7CisJCisJc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAKKwkJIklCTSBQaXQvUGl0LVBoeS9PbHltcGljIENoaXBzZXQgVG9rZW4gUmluZyBBZGFwdGVyICVzXG4iLGRldi0+bmFtZSk7CisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiXG4lNnM6IEFkYXB0ZXIgQWRkcmVzcyAgIDogTm9kZSBBZGRyZXNzICAgICAgOiBGdW5jdGlvbmFsIEFkZHJcbiIsCisgCSAgIGRldi0+bmFtZSk7IAorCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICBkZXYtPm5hbWUsCisgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sCisJICAgZGV2LT5kZXZfYWRkclsxXSwKKwkgICBkZXYtPmRldl9hZGRyWzJdLAorIAkgICBkZXYtPmRldl9hZGRyWzNdLAorCSAgIGRldi0+ZGV2X2FkZHJbNF0sCisJICAgZGV2LT5kZXZfYWRkcls1XSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikpLCAKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMSksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzIpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSszKSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrNCksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzUpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSksIAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSsxKSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMiksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzMpKTsKKwkgCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiXG4lNnM6IFRva2VuIFJpbmcgUGFyYW1ldGVycyBUYWJsZTpcbiIsIGRldi0+bmFtZSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6IFBoeXNpY2FsIEFkZHIgOiBVcCBOb2RlIEFkZHJlc3MgICA6IFBvbGwgQWRkcmVzcyAgICAgIDogQWNjUHJpIDogQXV0aCBTcmMgOiBBdHQgQ29kZSA6XG4iLAorCSAgZGV2LT5uYW1lKSA7IAorCSAgIAorCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeCAgIDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwNHggICA6ICUwNHggICAgIDogICUwNHggICAgOlxuIiwKKwkgIGRldi0+bmFtZSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwaHlzX2FkZHIpKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwaHlzX2FkZHIpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBoeXNfYWRkcikrMiksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcGh5c19hZGRyKSszKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMiksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSszKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzQpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrNSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwb2xsX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSs0KSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwb2xsX2FkZHIpKzUpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBhY2NfcHJpb3JpdHkpKSksCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGF1dGhfc291cmNlX2NsYXNzKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBhdHRfY29kZSkpKSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6IFNvdXJjZSBBZGRyZXNzICAgIDogQmNuIFQgOiBNYWouIFYgOiBMYW4gU3QgOiBMY2wgUmcgOiBNb24gRXJyIDogRnJhbWUgQ29ycmVsIDogXG4iLAorCSAgZGV2LT5uYW1lKSA7IAorCQorCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICAgOiAgICAgJTA0eCAgICAgOiBcbiIsCisJICBkZXYtPm5hbWUsCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBzb3VyY2VfYWRkcikrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSszKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBzb3VyY2VfYWRkcikrNCksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzUpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fdHlwZSkpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbWFqb3JfdmVjdG9yKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBsYW5fc3RhdHVzKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBsb2NhbF9yaW5nKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBtb25fZXJyb3IpKSksCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGZyYW1lX2NvcnJlbCkpKSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6IEJlYWNvbiBEZXRhaWxzIDogIFR4ICA6ICBSeCAgOiBOQVVOIE5vZGUgQWRkcmVzcyA6IE5BVU4gTm9kZSBQaHlzIDogXG4iLAorCSAgZGV2LT5uYW1lKSA7IAorCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiAgICAgICAgICAgICAgICA6ICAlMDJ4ICA6ICAlMDJ4ICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeCAgICA6IFxuIiwKKwkgIGRldi0+bmFtZSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3RyYW5zbWl0KSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fcmVjZWl2ZSkpKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9uYXVuKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrMiksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKzMpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9uYXVuKSs0KSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrNSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3BoeXMpKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fcGh5cykrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3BoeXMpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9waHlzKSszKSk7CisKKwlsZW49c2l6ZTsKKwlwb3M9YmVnaW4rc2l6ZTsKKwlpZiAocG9zPG9mZnNldCkgeworCQlsZW49MDsKKwkJYmVnaW49cG9zOworCX0KKwkqc3RhcnQ9YnVmZmVyKyhvZmZzZXQtYmVnaW4pOwkvKiBTdGFydCBvZiB3YW50ZWQgZGF0YSAqLworCWxlbi09KG9mZnNldC1iZWdpbik7CQkvKiBTdGFydCBzbG9wICovCisJaWYobGVuPmxlbmd0aCkKKwkJbGVuPWxlbmd0aDsJCS8qIEVuZGluZyBzbG9wICovCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG9seW1waWNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA7IAorCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yKSB7IAorCQljaGFyIHByb2NfbmFtZVsyMF0gOyAKKwkJc3RyY3B5KHByb2NfbmFtZSwibmV0L29seW1waWNfIikgOyAKKwkJc3RyY2F0KHByb2NfbmFtZSxkZXYtPm5hbWUpIDsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19uYW1lLE5VTEwpOyAKKwl9CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KSA7IAorCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX21taW8pIDsgCisJaW91bm1hcChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwKSA7IAorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldikgOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LE5VTEwpIDsgIAkKKwlmcmVlX25ldGRldihkZXYpIDsgCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBvbHltcGljX2RyaXZlciA9IHsgCisJLm5hbWUJCT0gIm9seW1waWMiLAorCS5pZF90YWJsZQk9IG9seW1waWNfcGNpX3RibCwKKwkucHJvYmUJCT0gb2x5bXBpY19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9seW1waWNfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbHltcGljX3BjaV9pbml0KHZvaWQpIAoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZvbHltcGljX2RyaXZlcikgOyAKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9seW1waWNfcGNpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9seW1waWNfZHJpdmVyKSA7IAorfQkKKworCittb2R1bGVfaW5pdChvbHltcGljX3BjaV9pbml0KSA7IAorbW9kdWxlX2V4aXQob2x5bXBpY19wY2lfY2xlYW51cCkgOyAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNTljOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAgb2x5bXBpYy5oIChjKSAxOTk5IFBldGVyIERlIFNjaHJpanZlciBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgICAgICAgICAgICAgICAxOTk5LDIwMDAgTWlrZSBQaGlsbGlwcyAobWlrZXBAbGludXh0ci5uZXQpCisgKgorICogIExpbnV4IGRyaXZlciBmb3IgSUJNIFBDSSB0b2tlbnJpbmcgY2FyZHMgYmFzZWQgb24gdGhlIG9seW1waWMgYW5kIHRoZSBQSVQvUEhZIGNoaXBzZXQuCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2RlZmluZSBDSUQgMHg0ZQorCisjZGVmaW5lIEJDVEwgMHg3MAorI2RlZmluZSBCQ1RMX1NPRlRSRVNFVCAoMTw8MTUpCisjZGVmaW5lIEJDVExfTUlNUkVCICgxPDw2KQorI2RlZmluZSBCQ1RMX01PREVfSU5ESUNBVE9SICgxPDw1KQorCisjZGVmaW5lIEdQUiAweDRhCisjZGVmaW5lIEdQUl9PUFRJX0JGICgxPDw2KQorI2RlZmluZSBHUFJfTkVQVFVORV9CRiAoMTw8NCkgCisjZGVmaW5lIEdQUl9BVVRPU0VOU0UgKDE8PDIpCisjZGVmaW5lIEdQUl8xNk1CUFMgKDE8PDMpIAorCisjZGVmaW5lIFBBRyAweDg1CisjZGVmaW5lIExCQyAweDhlCisKKyNkZWZpbmUgTElTUiAweDEwCisjZGVmaW5lIExJU1JfU1VNIDB4MTQKKyNkZWZpbmUgTElTUl9SV00gMHgxOAorCisjZGVmaW5lIExJU1JfTElFICgxPDwxNSkKKyNkZWZpbmUgTElTUl9TTElNICgxPDwxMykKKyNkZWZpbmUgTElTUl9TTEkgKDE8PDEyKQorI2RlZmluZSBMSVNSX1BDTVNSTUFTSyAoMTw8MTEpCisjZGVmaW5lIExJU1JfUENNU1JJTlQgKDE8PDEwKQorI2RlZmluZSBMSVNSX1dPTE1BU0sgKDE8PDkpCisjZGVmaW5lIExJU1JfV09MICgxPDw4KQorI2RlZmluZSBMSVNSX1NSQl9DTUQgKDE8PDUpCisjZGVmaW5lIExJU1JfQVNCX1JFUExZICgxPDw0KQorI2RlZmluZSBMSVNSX0FTQl9GUkVFX1JFUSAoMTw8MikKKyNkZWZpbmUgTElTUl9BUkJfRlJFRSAoMTw8MSkKKyNkZWZpbmUgTElTUl9UUkJfRlJBTUUgKDE8PDApCisKKyNkZWZpbmUgU0lTUiAweDIwCisjZGVmaW5lIFNJU1JfU1VNIDB4MjQKKyNkZWZpbmUgU0lTUl9SV00gMHgyOAorI2RlZmluZSBTSVNSX1JSIDB4MkMKKyNkZWZpbmUgU0lTUl9SRVNNQVNLIDB4MzAKKyNkZWZpbmUgU0lTUl9NQVNLIDB4NTQKKyNkZWZpbmUgU0lTUl9NQVNLX1NVTSAweDU4CisjZGVmaW5lIFNJU1JfTUFTS19SV00gMHg1QworCisjZGVmaW5lIFNJU1JfVFgyX0lETEUgKDE8PDMxKQorI2RlZmluZSBTSVNSX1RYMl9IQUxUICgxPDwyOSkKKyNkZWZpbmUgU0lTUl9UWDJfRU9GICgxPDwyOCkKKyNkZWZpbmUgU0lTUl9UWDFfSURMRSAoMTw8MjcpCisjZGVmaW5lIFNJU1JfVFgxX0hBTFQgKDE8PDI1KQorI2RlZmluZSBTSVNSX1RYMV9FT0YgKDE8PDI0KQorI2RlZmluZSBTSVNSX1RJTUVPVVQgKDE8PDIzKQorI2RlZmluZSBTSVNSX1JYX05PQlVGICgxPDwyMikKKyNkZWZpbmUgU0lTUl9SWF9TVEFUVVMgKDE8PDIxKQorI2RlZmluZSBTSVNSX1JYX0hBTFQgKDE8PDE4KQorI2RlZmluZSBTSVNSX1JYX0VPRl9FQVJMWSAoMTw8MTYpCisjZGVmaW5lIFNJU1JfTUkgKDE8PDE1KQorI2RlZmluZSBTSVNSX1BJICgxPDwxMykKKyNkZWZpbmUgU0lTUl9FUlIgKDE8PDkpCisjZGVmaW5lIFNJU1JfQURBUFRFUl9DSEVDSyAoMTw8NikKKyNkZWZpbmUgU0lTUl9TUkJfUkVQTFkgKDE8PDUpCisjZGVmaW5lIFNJU1JfQVNCX0ZSRUUgKDE8PDQpCisjZGVmaW5lIFNJU1JfQVJCX0NNRCAoMTw8MykKKyNkZWZpbmUgU0lTUl9UUkJfUkVQTFkgKDE8PDIpCisKKyNkZWZpbmUgRUlTUiAweDM0CisjZGVmaW5lIEVJU1JfUldNIDB4MzgKKyNkZWZpbmUgRUlTUl9NQVNLIDB4M2MKKyNkZWZpbmUgRUlTUl9NQVNLX09QVElPTlMgMHgwMDFGRkY3RgorCisjZGVmaW5lIExBUEEgMHg2MAorI2RlZmluZSBMQVBXV08gMHg2NAorI2RlZmluZSBMQVBXV0MgMHg2OAorI2RlZmluZSBMQVBDVEwgMHg2QworI2RlZmluZSBMQUlQRCAweDc4CisjZGVmaW5lIExBSVBERElOQyAweDdDCisKKyNkZWZpbmUgVElNRVIgMHg1MAorCisjZGVmaW5lIENMS0NUTCAweDc0CisjZGVmaW5lIENMS0NUTF9QQVVTRSAoMTw8MTUpIAorCisjZGVmaW5lIFBNX0NPTiAweDQKKworI2RlZmluZSBCTUNUTF9TVU0gMHg0MAorI2RlZmluZSBCTUNUTF9SV00gMHg0NAorI2RlZmluZSBCTUNUTF9UWDJfRElTICgxPDwzMCkgCisjZGVmaW5lIEJNQ1RMX1RYMV9ESVMgKDE8PDI2KSAKKyNkZWZpbmUgQk1DVExfUlhfRElTICgxPDwyMikgCisKKyNkZWZpbmUgQk1BU1IgMHhjYworCisjZGVmaW5lIFJYREVTQ1EgMHg5MAorI2RlZmluZSBSWERFU0NRQ05UIDB4OTQKKyNkZWZpbmUgUlhDREEgMHg5OAorI2RlZmluZSBSWEVOUSAweDlDCisjZGVmaW5lIFJYU1RBVFEgMHhBMAorI2RlZmluZSBSWFNUQVRRQ05UIDB4QTQKKyNkZWZpbmUgUlhDU0EgMHhBOAorI2RlZmluZSBSWENMRU4gMHhBQworI2RlZmluZSBSWEhMRU4gMHhBRQorCisjZGVmaW5lIFRYREVTQ1FfMSAweGIwCisjZGVmaW5lIFRYREVTQ1FfMiAweGQwCisjZGVmaW5lIFRYREVTQ1FDTlRfMSAweGI0CisjZGVmaW5lIFRYREVTQ1FDTlRfMiAweGQ0CisjZGVmaW5lIFRYQ0RBXzEgMHhiOAorI2RlZmluZSBUWENEQV8yIDB4ZDgKKyNkZWZpbmUgVFhFTlFfMSAweGJjCisjZGVmaW5lIFRYRU5RXzIgMHhkYworI2RlZmluZSBUWFNUQVRRXzEgMHhjMAorI2RlZmluZSBUWFNUQVRRXzIgMHhlMAorI2RlZmluZSBUWFNUQVRRQ05UXzEgMHhjNAorI2RlZmluZSBUWFNUQVRRQ05UXzIgMHhlNAorI2RlZmluZSBUWENTQV8xIDB4YzgKKyNkZWZpbmUgVFhDU0FfMiAweGU4CisvKiBDYXJkYnVzICovCisjZGVmaW5lIEZFUk1BU0sgMHhmNAorI2RlZmluZSBGRVJNQVNLX0lOVF9CSVQgKDE8PDE1KQorCisjZGVmaW5lIE9MWU1QSUNfSU9fU1BBQ0UgMjU2CisKKyNkZWZpbmUgU1JCX0NPTU1BTkRfU0laRSA1MAorCisjZGVmaW5lIE9MWU1QSUNfTUFYX0FEQVBURVJTIDggLyogMHgwOCBfX01PRFVMRV9TVFJJTkcgY2FuJ3QgaGFuZCAweG5uICovCisKKy8qIERlZmluZXMgZm9yIExBTiBTVEFUVVMgQ0hBTkdFIHJlcG9ydHMgKi8KKyNkZWZpbmUgTFNDX1NJR19MT1NTIDB4ODAwMAorI2RlZmluZSBMU0NfSEFSRF9FUlIgMHg0MDAwCisjZGVmaW5lIExTQ19TT0ZUX0VSUiAweDIwMDAKKyNkZWZpbmUgTFNDX1RSQU5fQkNOIDB4MTAwMAorI2RlZmluZSBMU0NfTFdGICAgICAgMHgwODAwCisjZGVmaW5lIExTQ19BUlcgICAgICAweDA0MDAKKyNkZWZpbmUgTFNDX0ZQRSAgICAgIDB4MDIwMAorI2RlZmluZSBMU0NfUlIgICAgICAgMHgwMTAwCisjZGVmaW5lIExTQ19DTyAgICAgICAweDAwODAKKyNkZWZpbmUgTFNDX1NTICAgICAgIDB4MDA0MAorI2RlZmluZSBMU0NfUklOR19SRUMgMHgwMDIwCisjZGVmaW5lIExTQ19TUl9DTyAgICAweDAwMTAKKyNkZWZpbmUgTFNDX0ZEWF9NT0RFIDB4MDAwNAorCisvKiBEZWZpbmVzIGZvciBPUEVOIEFEQVBURVIgY29tbWFuZCAqLworCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FWFRfV1JBUCAoMTw8MTUpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfSEFSREVFICgxPDwxNCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0RJU19TT0ZURVJSICgxPDwxMykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX1BBU1NfQURDX01BQyAoMTw8MTIpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FUVF9NQUMgKDE8PDExKQorI2RlZmluZSBPUEVOX0FEQVBURVJfRU5BQkxFX0VDICgxPDwxMCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0NPTlRFTkRFUiAoMTw8OCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX1BBU1NfQkVBQ09OICgxPDw3KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRU5BQkxFX0ZEWCAoMTw8NikKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9SUEwgKDE8PDUpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTkhJQklUX0VUUiAoMTw8NCkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0lOVEVSTkFMX1dSQVAgKDE8PDMpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9VU0VfT1BUUzIgKDE8PDApCisKKyNkZWZpbmUgT1BFTl9BREFQVEVSXzJfRU5BQkxFX09OTk9XICgxPDwxNSkKKworLyogRGVmaW5lcyBmb3IgU1JCIENvbW1hbmRzICovCisKKyNkZWZpbmUgU1JCX0FDQ0VTU19SRUdJU1RFUiAweDFmCisjZGVmaW5lIFNSQl9DTE9TRV9BREFQVEVSIDB4MDQKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9CUklER0UgMHgwYworI2RlZmluZSBTUkJfQ09ORklHVVJFX1dBS0VVUF9FVkVOVCAweDFhCisjZGVmaW5lIFNSQl9NT0RJRllfQlJJREdFX1BBUk1TIDB4MTUKKyNkZWZpbmUgU1JCX01PRElGWV9PUEVOX09QVElPTlMgMHgwMQorI2RlZmluZSBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyAweDE3CisjZGVmaW5lIFNSQl9OT19PUEVSQVRJT04gMHgwMAorI2RlZmluZSBTUkJfT1BFTl9BREFQVEVSIDB4MDMKKyNkZWZpbmUgU1JCX1JFQURfTE9HIDB4MDgKKyNkZWZpbmUgU1JCX1JFQURfU1JfQ09VTlRFUlMgMHgxNgorI2RlZmluZSBTUkJfUkVTRVRfR1JPVVBfQUREUkVTUyAweDAyCisjZGVmaW5lIFNSQl9TQVZFX0NPTkZJR1VSQVRJT04gMHgxYgorI2RlZmluZSBTUkJfU0VUX0JSSURHRV9QQVJNUyAweDA5CisjZGVmaW5lIFNSQl9TRVRfQlJJREdFX1RBUkdFVFMgMHgxMAorI2RlZmluZSBTUkJfU0VUX0ZVTkNfQUREUkVTUyAweDA3CisjZGVmaW5lIFNSQl9TRVRfR1JPVVBfQUREUkVTUyAweDA2CisjZGVmaW5lIFNSQl9TRVRfR1JPVVBfQUREUl9PUFRJT05TIDB4MTEKKyNkZWZpbmUgU1JCX1VQREFURV9XQUtFVVBfUEFUVEVSTiAweDE5CisKKy8qIENsZWFyIHJldHVybiBjb2RlICovCisKKyNkZWZpbmUgT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSAweGZlIAorCisvKiBBUkIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQVJCX1JFQ0VJVkVfREFUQSAweDgxCisjZGVmaW5lIEFSQl9MQU5fQ0hBTkdFX1NUQVRVUyAweDg0CisvKiBBU0IgUmVzcG9uc2UgY29tbWFuZHMgKi8KKworI2RlZmluZSBBU0JfUkVDRUlWRV9EQVRBIDB4ODEKKworCisvKiBPbHltcGljIGRlZmF1bHRzIGZvciBidWZmZXJzICovCisgCisjZGVmaW5lIE9MWU1QSUNfUlhfUklOR19TSVpFIDE2IC8qIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgT0xZTVBJQ19UWF9SSU5HX1NJWkUgOCAvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisKKyNkZWZpbmUgUEtUX0JVRl9TWiA0MDk2IC8qIERlZmF1bHQgcGFja2V0IHNpemUgKi8KKworLyogT2x5bXBpYyBkYXRhIHN0cnVjdHVyZXMgKi8KKworLyogeHh4eCBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBhbGwgbGl0dGxlIGVuZGlhbiBpbiBoYXJkd2FyZS4gKi8KKworc3RydWN0IG9seW1waWNfdHhfZGVzYyB7CisJdTMyIGJ1ZmZlcjsKKwl1MzIgc3RhdHVzX2xlbmd0aDsKK307CisKK3N0cnVjdCBvbHltcGljX3R4X3N0YXR1cyB7CisJdTMyIHN0YXR1czsKK307CisKK3N0cnVjdCBvbHltcGljX3J4X2Rlc2MgeworCXUzMiBidWZmZXI7CisJdTMyIHJlc19sZW5ndGg7IAorfTsKKworc3RydWN0IG9seW1waWNfcnhfc3RhdHVzIHsKKwl1MzIgZnJhZ21lbnRjbnRfZnJhbWVsZW47CisJdTMyIHN0YXR1c19idWZmZXJjbnQ7Cit9OworLyogeHh4eCBFTkQgVGhlc2Ugc3RydWN0dXJlcyBhcmUgYWxsIGxpdHRsZSBlbmRpYW4gaW4gaGFyZHdhcmUuICovCisvKiB4eHh4IFRoZXJlIG1heSBiZSBtb3JlLCBidXQgSSdtIHByZXR0eSBzdXJlIGFib3V0IHRoZXNlICovCisKK3N0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIgeworCXUxNiBuZXh0IDsgCisJdTggcGFkZGluZyA7IAorCXU4IGZyYW1lX3N0YXR1cyA7CisJdTE2IGJ1ZmZlcl9sZW5ndGggOyAKKwl1OCBmcmFtZV9kYXRhIDsgCit9OworCitzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlIHsKKwkKKwl1MTYgc3JiOyAgICAgIC8qIGJlMTYgKi8KKwl1MTYgdHJiOyAgICAgIC8qIGJlMTYgKi8KKwl1MTYgYXJiOyAgICAgIC8qIGJlMTYgKi8KKwl1MTYgYXNiOyAgICAgIC8qIGJlMTYgKi8KKworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbzsKKwl1OCBfX2lvbWVtICpvbHltcGljX2xhcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA7IAorCWNoYXIgKm9seW1waWNfY2FyZF9uYW1lIDsgCisKKwlzcGlubG9ja190IG9seW1waWNfbG9jayA7IAorCisJdm9sYXRpbGUgaW50IHNyYl9xdWV1ZWQ7ICAgIC8qIFRydWUgaWYgYW4gU1JCIGlzIHN0aWxsIHBvc3RlZCAqLwkKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzcmJfd2FpdDsKKworCXZvbGF0aWxlIGludCBhc2JfcXVldWVkOyAgICAvKiBUcnVlIGlmIGFuIEFTQiBpcyBwb3N0ZWQgKi8KKworCXZvbGF0aWxlIGludCB0cmJfcXVldWVkOyAgIC8qIFRydWUgaWYgYSBUUkIgaXMgcG9zdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgdHJiX3dhaXQgOyAKKworCS8qIFRoZXNlIG11c3QgYmUgb24gYSA0IGJ5dGUgYm91bmRhcnkuICovCisJc3RydWN0IG9seW1waWNfcnhfZGVzYyBvbHltcGljX3J4X3JpbmdbT0xZTVBJQ19SWF9SSU5HX1NJWkVdOworCXN0cnVjdCBvbHltcGljX3R4X2Rlc2Mgb2x5bXBpY190eF9yaW5nW09MWU1QSUNfVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgb2x5bXBpY19yeF9zdGF0dXMgb2x5bXBpY19yeF9zdGF0dXNfcmluZ1tPTFlNUElDX1JYX1JJTkdfU0laRV07CQorCXN0cnVjdCBvbHltcGljX3R4X3N0YXR1cyBvbHltcGljX3R4X3N0YXR1c19yaW5nW09MWU1QSUNfVFhfUklOR19TSVpFXTsJCisKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfcmluZ19za2JbT0xZTVBJQ19UWF9SSU5HX1NJWkVdLCAqcnhfcmluZ19za2JbT0xZTVBJQ19SWF9SSU5HX1NJWkVdOwkKKwlpbnQgdHhfcmluZ19mcmVlLCB0eF9yaW5nX2xhc3Rfc3RhdHVzLCByeF9yaW5nX2xhc3RfcmVjZWl2ZWQscnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQsIGZyZWVfdHhfcmluZ19lbnRyaWVzOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgb2x5bXBpY19zdGF0cyA7CisJdTE2IG9seW1waWNfbGFuX3N0YXR1cyA7CisJdTggb2x5bXBpY19yaW5nX3NwZWVkIDsKKwl1MTYgcGt0X2J1Zl9zeiA7IAorCXU4IG9seW1waWNfcmVjZWl2ZV9vcHRpb25zLCBvbHltcGljX2NvcHlfYWxsX29wdGlvbnMsb2x5bXBpY19tZXNzYWdlX2xldmVsLCBvbHltcGljX25ldHdvcmtfbW9uaXRvcjsgIAorCXUxNiBvbHltcGljX2FkZHJfdGFibGVfYWRkciwgb2x5bXBpY19wYXJtc19hZGRyIDsgCisJdTggb2x5bXBpY19sYWFbNl0gOyAKKwl1MzIgcnhfcmluZ19kbWFfYWRkcjsKKwl1MzIgcnhfc3RhdHVzX3JpbmdfZG1hX2FkZHI7CisJdTMyIHR4X3JpbmdfZG1hX2FkZHI7CisJdTMyIHR4X3N0YXR1c19yaW5nX2RtYV9hZGRyOworfTsKKworc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlIHsKKworCXU4IG5vZGVfYWRkcls2XSA7IAorCXU4IHJlc2VydmVkWzRdIDsgCisJdTggZnVuY19hZGRyWzRdIDsgCit9IDsgCisKK3N0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUgeyAKKwkKKwl1OCAgcGh5c19hZGRyWzRdIDsgCisJdTggIHVwX25vZGVfYWRkcls2XSA7IAorCXU4ICB1cF9waHlzX2FkZHJbNF0gOyAKKwl1OCAgcG9sbF9hZGRyWzZdIDsgCisJdTE2IHJlc2VydmVkIDsgCisJdTE2IGFjY19wcmlvcml0eSA7IAorCXUxNiBhdXRoX3NvdXJjZV9jbGFzcyA7IAorCXUxNiBhdHRfY29kZSA7IAorCXU4ICBzb3VyY2VfYWRkcls2XSA7IAorCXUxNiBiZWFjb25fdHlwZSA7IAorCXUxNiBtYWpvcl92ZWN0b3IgOyAKKwl1MTYgbGFuX3N0YXR1cyA7IAorCXUxNiBzb2Z0X2Vycm9yX3RpbWUgOyAKKyAJdTE2IHJlc2VydmVkMSA7IAorCXUxNiBsb2NhbF9yaW5nIDsgCisJdTE2IG1vbl9lcnJvciA7IAorCXUxNiBiZWFjb25fdHJhbnNtaXQgOyAKKwl1MTYgYmVhY29uX3JlY2VpdmUgOyAKKwl1MTYgZnJhbWVfY29ycmVsIDsgCisJdTggIGJlYWNvbl9uYXVuWzZdIDsgCisJdTMyIHJlc2VydmVkMiA7IAorCXU4ICBiZWFjb25fcGh5c1s0XSA7IAkKK307IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Byb3Rlb24uYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1YjA2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiAgcHJvdGVvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIGZvciBQcm90ZW9uIElTQSB0b2tlbiByaW5nIGNhcmRzLgorICoKKyAqICBCYXNlZCBvbiB0bXNwY2kgd3JpdHRlbiAxOTk5IGJ5IEFkYW0gRnJpdHpsZXIKKyAqICAKKyAqICBXcml0dGVuIDIwMDMgYnkgSm9jaGVuIEZyaWVkcmljaAorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKgktIFByb3Rlb24gMTM5MiwgMTM5MisKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEFGICAgICAgICBBZGFtIEZyaXR6bGVyICAgICAgICAgICBtaWRAYXVrLmN4CisgKiAgICBKRglKb2NoZW4gRnJpZWRyaWNoCWpvY2hlbkBzY3JhbS5kZQorICoKKyAqICBNb2RpZmljYXRpb24gSGlzdG9yeToKKyAqCTAyLUphbi0wMwlKRglDcmVhdGVkCisgKgorICovCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAicHJvdGVvbi5jOiB2MS4wMCAwMi8wMS8yMDAzIGJ5IEpvY2hlbiBGcmllZHJpY2hcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJ0bXMzODB0ci5oIgorCisjZGVmaW5lIFBST1RFT05fSU9fRVhURU5UIDMyCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRsaXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDBBMjAsIDB4MEUyMCwgMHgxQTIwLCAweDFFMjAsIDB4MkEyMCwgMHgyRTIwLCAweDNBMjAsIDB4M0UyMCwvLyBQcm90LgorCTB4NEEyMCwgMHg0RTIwLCAweDVBMjAsIDB4NUUyMCwgMHg2QTIwLCAweDZFMjAsIDB4N0EyMCwgMHg3RTIwLC8vIFByb3QuCisJMHg4QTIwLCAweDhFMjAsIDB4OUEyMCwgMHg5RTIwLCAweEFBMjAsIDB4QUUyMCwgMHhCQTIwLCAweEJFMjAsLy8gUHJvdC4KKwkweENBMjAsIDB4Q0UyMCwgMHhEQTIwLCAweERFMjAsIDB4RUEyMCwgMHhFRTIwLCAweEZBMjAsIDB4RkUyMCwvLyBQcm90LgorCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSVJRcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXJxbGlzdFtdID0geworCTcsIDYsIDUsIDQsIDMsIDEyLCAxMSwgMTAsIDksCisJMAorfTsKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBETUFzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyBpbnQgZG1hbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJNSwgNiwgNywKKwkwCit9OworCitzdGF0aWMgY2hhciBjYXJkbmFtZVtdID0gIlByb3Rlb24gMTM5MlwwIjsKKworc3RydWN0IG5ldF9kZXZpY2UgKnByb3Rlb25fcHJvYmUoaW50IHVuaXQpOworc3RhdGljIGludCBwcm90ZW9uX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwcm90ZW9uX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb3Rlb25fc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvdGVvbl9zaWZyZWFkYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm90ZW9uX3NpZnJlYWR3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgcHJvdGVvbl9zaWZ3cml0ZWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgcHJvdGVvbl9zaWZ3cml0ZXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0dyh2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvdGVvbl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoazEsIGNoazI7CisJaW50IGk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgUFJPVEVPTl9JT19FWFRFTlQsIGNhcmRuYW1lKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCQorCisJY2hrMSA9IGluYihpb2FkZHIgKyAweDFmKTsgICAgICAvKiBHZXQgUHJvdGVvbiBJRCByZWcgMSAqLworCWlmIChjaGsxICE9IDB4MWYpIAorCQlnb3RvIG5vZGV2OworCisJY2hrMSA9IGluYihpb2FkZHIgKyAweDFlKSAmIDB4MDc7ICAgICAgIC8qIEdldCBQcm90ZW9uIElEIHJlZyAwICovCisJZm9yIChpPTA7IGk8MTY7IGkrKykgeworCQljaGsyID0gaW5iKGlvYWRkciArIDB4MWUpICYgMHgwNzsKKwkJaWYgKCgoY2hrMSArIDEpICYgMHgwNykgIT0gY2hrMikKKwkJCWdvdG8gbm9kZXY7CisJCWNoazEgPSBjaGsyOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCXJldHVybiAoMCk7Citub2RldjoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFBST1RFT05fSU9fRVhURU5UKTsgCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKyAgICAgICAgc3RhdGljIGludCB2ZXJzaW9ucHJpbnRlZDsKKwljb25zdCB1bnNpZ25lZCAqcG9ydDsKKwlpbnQgaixlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWlmIChkZXYtPmJhc2VfYWRkcikJLyogcHJvYmUgc3BlY2lmaWMgbG9jYXRpb24gKi8KKwkJZXJyID0gcHJvdGVvbl9wcm9iZTEoZGV2LCBkZXYtPmJhc2VfYWRkcik7CisJZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRsaXN0OyAqcG9ydDsgcG9ydCsrKSB7CisJCQllcnIgPSBwcm90ZW9uX3Byb2JlMShkZXYsICpwb3J0KTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0NDsKKworCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBmb3VuZCBhIHZhbGlkIGNhcmQuICovCisKKwlpZiAodmVyc2lvbnByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKworCWVyciA9IC1FSU87CisJaWYgKHRtc2Rldl9pbml0KGRldiwgSVNBX01BWF9BRERSRVNTLCBOVUxMKSkKKwkJZ290byBvdXQ0OworCisJZGV2LT5iYXNlX2FkZHIgJj0gfjM7IAorCQkKKwlwcm90ZW9uX3JlYWRfZWVwcm9tKGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGogPSAxOyBqIDwgNjsgaisrKQorCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbal0pOworCXByaW50aygiXG4iKTsKKwkJCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5zZXRuc2Vsb3V0ID0gcHJvdGVvbl9zZXRuc2Vsb3V0X3BpbnM7CisJCQorCXRwLT5zaWZyZWFkYiA9IHByb3Rlb25fc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gcHJvdGVvbl9zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gcHJvdGVvbl9zaWZ3cml0ZWI7CisJdHAtPnNpZndyaXRldyA9IHByb3Rlb25fc2lmd3JpdGV3OworCQorCW1lbWNweSh0cC0+UHJvZHVjdElELCBjYXJkbmFtZSwgUFJPRF9JRF9TSVpFICsgMSk7CisKKwl0cC0+dG1zcHJpdiA9IE5VTEw7CisKKwlkZXYtPm9wZW4gPSBwcm90ZW9uX29wZW47CisJZGV2LT5zdG9wID0gdG1zMzgwdHJfY2xvc2U7CisKKwlpZiAoZGV2LT5pcnEgPT0gMCkKKwl7CisJCWZvcihqID0gMDsgaXJxbGlzdFtqXSAhPSAwOyBqKyspCisJCXsKKwkJCWRldi0+aXJxID0gaXJxbGlzdFtqXTsKKwkJCWlmICghcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHRtczM4MHRyX2ludGVycnVwdCwgMCwgCisJCQkJY2FyZG5hbWUsIGRldikpCisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQkKKyAgICAgICAgICAgICAgICBpZihpcnFsaXN0W2pdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9TZWxlY3Qgbm8gSVJRIGF2YWlsYWJsZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3IoaiA9IDA7IGlycWxpc3Rbal0gIT0gMDsgaisrKQorCQkJaWYgKGlycWxpc3Rbal0gPT0gZGV2LT5pcnEpCisJCQkJYnJlYWs7CisJCWlmIChpcnFsaXN0W2pdID09IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbGxlZ2FsIElSUSAlZCBzcGVjaWZpZWRcbiIsCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIDAsIAorCQkJY2FyZG5hbWUsIGRldikpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBJUlEgJWQgbm90IGF2YWlsYWJsZVxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5kbWEgPT0gMCkKKwl7CisJCWZvcihqID0gMDsgZG1hbGlzdFtqXSAhPSAwOyBqKyspCisJCXsKKwkJCWRldi0+ZG1hID0gZG1hbGlzdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdF9kbWEoZGV2LT5kbWEsIGNhcmRuYW1lKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmKGRtYWxpc3Rbal0gPT0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9TZWxlY3Qgbm8gRE1BIGF2YWlsYWJsZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3IoaiA9IDA7IGRtYWxpc3Rbal0gIT0gMDsgaisrKQorCQkJaWYgKGRtYWxpc3Rbal0gPT0gZGV2LT5kbWEpCisJCQkJYnJlYWs7CisJCWlmIChkbWFsaXN0W2pdID09IDApCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJbGxlZ2FsIERNQSAlZCBzcGVjaWZpZWRcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5kbWEpOworCQkJZ290byBvdXQyOworCQl9CisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZG5hbWUpKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU2VsZWN0ZWQgRE1BICVkIG5vdCBhdmFpbGFibGVcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5kbWEpOworCQkJZ290byBvdXQyOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgICBJTzogJSM0bHggIElSUTogJWQgIERNQTogJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBkZXYtPmRtYSk7CisJCQorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CitvdXQ6CisJZnJlZV9kbWEoZGV2LT5kbWEpOworb3V0MjoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDM6CisJdG1zZGV2X3Rlcm0oZGV2KTsKK291dDQ6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFBST1RFT05fSU9fRVhURU5UKTsgCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgcHJvdGVvbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJ0ciVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJZXJyID0gc2V0dXBfY2FyZChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIGRldjsKKworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqIFJlYWRzIE1BQyBhZGRyZXNzIGZyb20gYWRhcHRlciBSQU0sIHdoaWNoIHNob3VsZCd2ZSByZWFkIGl0IGZyb20KKyAqIHRoZSBvbmJvYXJkIFJPTS4gIAorICoKKyAqIENhbGxpbmcgdGhpcyBvbiBhIGJvYXJkIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBpdCBjYW4gYmUgYSB2ZXJ5CisgKiBkYW5nZXJvdXMgdGhpbmcuICBUaGUgTWFkZ2UgYm9hcmQsIGZvciBpbnN0YW5jZSwgd2lsbCBsb2NrIHlvdXIKKyAqIG1hY2hpbmUgaGFyZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiAgTHVja2lseSwgaXRzIHN1cHBvcnRlZCBpbiBhCisgKiBzZXBhcmF0ZSBkcml2ZXIuICAtLUFTRgorICovCitzdGF0aWMgdm9pZCBwcm90ZW9uX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJCisJLyogQWRkcmVzczogMDAwMDowMDAwICovCisJcHJvdGVvbl9zaWZ3cml0ZXcoZGV2LCAwLCBTSUZBRFgpOworCXByb3Rlb25fc2lmd3JpdGV3KGRldiwgMCwgU0lGQURSKTsJCisJCisJLyogUmVhZCBzaXggYnl0ZSBNQUMgYWRkcmVzcyBkYXRhICovCisJZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gcHJvdGVvbl9zaWZyZWFkdyhkZXYsIFNJRklOQykgPj4gODsKK30KKwordW5zaWduZWQgc2hvcnQgcHJvdGVvbl9zZXRuc2Vsb3V0X3BpbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm90ZW9uX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwgPSAwOworCWludCBpOworCisJLyogUHJvdGVvbiByZXNldCBzZXF1ZW5jZSAqLworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyAweDExKTsKKwltZGVsYXkoMjApOworCW91dGIoMHgwNCwgZGV2LT5iYXNlX2FkZHIgKyAweDExKTsKKwltZGVsYXkoMjApOworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyAweDExKTsKKwltZGVsYXkoMTAwKTsKKworCS8qIHNldCBjb250cm9sL3N0YXR1cyByZWcgKi8KKwl2YWwgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAweDExKTsKKwl2YWwgfD0gMHg3ODsKKwl2YWwgJj0gMHhmOTsKKwlpZih0cC0+RGF0YVJhdGUgPT0gU1BFRURfNCkKKwkJdmFsIHw9IDB4MjA7CisJZWxzZQorCQl2YWwgJj0gfjB4MjA7CisKKwlvdXRiKHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAweDExKTsKKwlvdXRiKDB4ZmYsIGRldi0+YmFzZV9hZGRyICsgMHgxMik7CisJZm9yKGkgPSAwOyBpcnFsaXN0W2ldICE9IDA7IGkrKykKKwl7CisJCWlmKGlycWxpc3RbaV0gPT0gZGV2LT5pcnEpCisJCQlicmVhazsKKwl9CisJdmFsID0gaTsKKwlpID0gKDcgLSBkZXYtPmRtYSkgPDwgNDsKKwl2YWwgfD0gaTsKKwlvdXRiKHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAweDEzKTsKKworCXJldHVybiB0bXMzODB0cl9vcGVuKGRldik7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworI2RlZmluZSBJU0FUUl9NQVhfQURBUFRFUlMgMworCitzdGF0aWMgaW50IGlvW0lTQVRSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGlycVtJU0FUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBkbWFbSVNBVFJfTUFYX0FEQVBURVJTXTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwcm90ZW9uX2RldltJU0FUUl9NQVhfQURBUFRFUlNdOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBudW0gPSAwLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IElTQVRSX01BWF9BREFQVEVSUyA7IGkrKykgeworCQlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWNvbnRpbnVlOworCisJCWRldi0+YmFzZV9hZGRyID0gaW9baV07CisJCWRldi0+aXJxID0gaXJxW2ldOworCQlkZXYtPmRtYSA9IGRtYVtpXTsKKwkJZXJyID0gc2V0dXBfY2FyZChkZXYpOworCQlpZiAoIWVycikgeworCQkJcHJvdGVvbl9kZXZbaV0gPSBkZXY7CisJCQkrK251bTsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgInByb3Rlb24uYzogJWQgY2FyZHMgZm91bmQuXG4iLCBudW0pOworCS8qIFByb2JlIGZvciBjYXJkcy4gKi8KKwlpZiAobnVtID09IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJwcm90ZW9uLmM6IE5vIGNhcmRzIGZvdW5kLlxuIik7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByb3Rlb25fZGV2W2ldOworCQkKKwkJaWYgKCFkZXYpIAorCQkJY29udGludWU7CisJCQorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgUFJPVEVPTl9JT19FWFRFTlQpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBwcm90ZW9uLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHByb3Rlb24uYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc2tpc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFiNTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiAgc2tpc2EuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgU0stTkVUIFRNUzM4MC1iYXNlZCBJU0EgdG9rZW4gcmluZyBjYXJkcy4KKyAqCisgKiAgQmFzZWQgb24gdG1zcGNpIHdyaXR0ZW4gMTk5OSBieSBBZGFtIEZyaXR6bGVyCisgKiAgCisgKiAgV3JpdHRlbiAyMDAwIGJ5IEpvY2hlbiBGcmllZHJpY2gKKyAqICBEZWRpY2F0ZWQgdG8gbXkgZ2lybGZyaWVuZCBTdGVmZmkgQm9wcAorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKgktIFN5c0tvbm5lY3QgVFI0LzE2KCspIElTQQkoU0stNDE5MCkKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEFGICAgICAgICBBZGFtIEZyaXR6bGVyICAgICAgICAgICBtaWRAYXVrLmN4CisgKiAgICBKRglKb2NoZW4gRnJpZWRyaWNoCWpvY2hlbkBzY3JhbS5kZQorICoKKyAqICBNb2RpZmljYXRpb24gSGlzdG9yeToKKyAqCTE0LUphbi0wMQlKRglDcmVhdGVkCisgKgkyOC1PY3QtMDIJSkYJRml4ZWQgcHJvYmUgb2YgY2FyZCBmb3Igc3RhdGljIGNvbXBpbGF0aW9uLgorICoJCQkJRml4ZWQgbW9kdWxlIGluaXQgdG8gbm90IG1ha2UgaG90cGx1ZyBnbyB3aWxkLgorICoJMDktTm92LTAyCUpGCUZpeGVkIGVhcmx5IGJhaWwgb3V0IG9uIG91dCBvZiBtZW1vcnkKKyAqCQkJCXNpdHVhdGlvbnMgaWYgbXVsdGlwbGUgY2FyZHMgYXJlIGZvdW5kLgorICoJCQkJQ2xlYW5lZCB1cCBzb21lIHVubmVjZXNzYXJ5IGNvbnNvbGUgU1BBTS4KKyAqCTA5LURlYy0wMglKRglGaXhlZCBtb2R1bGUgcmVmZXJlbmNlIGNvdW50aW5nLgorICoJMDItSmFuLTAzCUpGCVJlbmFtZWQgdG8gc2tpc2EuYworICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gInNraXNhLmM6IHYxLjAzIDA5LzEyLzIwMDIgYnkgSm9jaGVuIEZyaWVkcmljaFxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJ0bXMzODB0ci5oIgorCisjZGVmaW5lIFNLX0lTQV9JT19FWFRFTlQgMzIKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG9ydGxpc3RbXSBfX2luaXRkYXRhID0geworCTB4MEEyMCwgMHgxQTIwLCAweDBCMjAsIDB4MUIyMCwgMHgwOTgwLCAweDE5ODAsIDB4MDkwMCwgMHgxOTAwLC8vIFNLCisJMAorfTsKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJUlFzIHRvIGJlIHByb2JlZC4gCisgKiBVc2VkIGFnYWluIGFmdGVyIGluaXRpYWwgcHJvYmUgZm9yIHNrdHJfY2hpcHNldF9pbml0LCBjYWxsZWQgZnJvbSBza3RyX29wZW4uCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpcnFsaXN0W10gPSB7CisJMywgNSwgOSwgMTAsIDExLCAxMiwgMTUsCisJMAorfTsKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBETUFzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyBpbnQgZG1hbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJNSwgNiwgNywKKwkwCit9OworCitzdGF0aWMgY2hhciBpc2FfY2FyZG5hbWVbXSA9ICJTSyBORVQgVFIgNC8xNiBJU0FcMCI7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpza19pc2FfcHJvYmUoaW50IHVuaXQpOworc3RhdGljIGludCBza19pc2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNrX2lzYV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBza19pc2Ffc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2tfaXNhX3NpZnJlYWRiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlyZXR1cm4gaW5iKGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNrX2lzYV9zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNrX2lzYV9zaWZ3cml0ZWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc2tfaXNhX3NpZndyaXRldyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlvdXR3KHZhbCwgZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNrX2lzYV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZCwgY2hrMSwgY2hrMjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBTS19JU0FfSU9fRVhURU5ULCBpc2FfY2FyZG5hbWUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9sZCA9IGluYihpb2FkZHIgKyBTSUZBRFIpOwkvKiBHZXQgdGhlIG9sZCBTSUZBRFIgdmFsdWUgKi8KKworCWNoazEgPSAwOwkvKiBCZWdpbiB3aXRoIGNoZWNrIHZhbHVlIDAgKi8KKwlkbyB7CisJCS8qIFdyaXRlIG5ldyBTSUZBRFIgdmFsdWUgKi8KKwkJb3V0YihjaGsxLCBpb2FkZHIgKyBTSUZBRFIpOworCisJCS8qIFJlYWQsIGludmVydCBhbmQgd3JpdGUgKi8KKwkJY2hrMiA9IGluYihpb2FkZHIgKyBTSUZBREQpOworCQljaGsyIF49IDB4MEZFOworCQlvdXRiKGNoazIsIGlvYWRkciArIFNJRkFEUik7CisKKwkJLyogUmVhZCwgaW52ZXJ0IGFuZCBjb21wYXJlICovCisJCWNoazIgPSBpbmIoaW9hZGRyICsgU0lGQUREKTsKKwkJY2hrMiBePSAweDBGRTsKKworCQlpZihjaGsxICE9IGNoazIpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU0tfSVNBX0lPX0VYVEVOVCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWNoazEgLT0gMjsKKwl9IHdoaWxlKGNoazEgIT0gMCk7CS8qIFJlcGVhdCAxMjggdGltZXMgKGFsbCBieXRlIHZhbHVlcykgKi8KKworICAgIAkvKiBSZXN0b3JlIHRoZSBTSUZBRFIgdmFsdWUgKi8KKwlvdXRiKG9sZCwgaW9hZGRyICsgU0lGQURSKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisgICAgICAgIHN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJY29uc3QgdW5zaWduZWQgKnBvcnQ7CisJaW50IGosIGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJaWYgKGRldi0+YmFzZV9hZGRyKQkvKiBwcm9iZSBzcGVjaWZpYyBsb2NhdGlvbiAqLworCQllcnIgPSBza19pc2FfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWVsc2UgeworCQlmb3IgKHBvcnQgPSBwb3J0bGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQkJZXJyID0gc2tfaXNhX3Byb2JlMShkZXYsICpwb3J0KTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0NDsKKworCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBmb3VuZCBhIHZhbGlkIGNhcmQuICovCisKKwlpZiAodmVyc2lvbnByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKworCWVyciA9IC1FSU87CisJaWYgKHRtc2Rldl9pbml0KGRldiwgSVNBX01BWF9BRERSRVNTLCBOVUxMKSkKKwkJZ290byBvdXQ0OworCisJZGV2LT5iYXNlX2FkZHIgJj0gfjM7IAorCQkKKwlza19pc2FfcmVhZF9lZXByb20oZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogICAgUmluZyBTdGF0aW9uIEFkZHJlc3M6ICIsIGRldi0+bmFtZSk7CisJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbMF0pOworCWZvciAoaiA9IDE7IGogPCA2OyBqKyspCisJCXByaW50aygiOiUyLjJ4IiwgZGV2LT5kZXZfYWRkcltqXSk7CisJcHJpbnRrKCJcbiIpOworCQkKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPnNldG5zZWxvdXQgPSBza19pc2Ffc2V0bnNlbG91dF9waW5zOworCQkKKwl0cC0+c2lmcmVhZGIgPSBza19pc2Ffc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gc2tfaXNhX3NpZnJlYWR3OworCXRwLT5zaWZ3cml0ZWIgPSBza19pc2Ffc2lmd3JpdGViOworCXRwLT5zaWZ3cml0ZXcgPSBza19pc2Ffc2lmd3JpdGV3OworCQorCW1lbWNweSh0cC0+UHJvZHVjdElELCBpc2FfY2FyZG5hbWUsIFBST0RfSURfU0laRSArIDEpOworCisJdHAtPnRtc3ByaXYgPSBOVUxMOworCisJZGV2LT5vcGVuID0gc2tfaXNhX29wZW47CisJZGV2LT5zdG9wID0gdG1zMzgwdHJfY2xvc2U7CisKKwlpZiAoZGV2LT5pcnEgPT0gMCkKKwl7CisJCWZvcihqID0gMDsgaXJxbGlzdFtqXSAhPSAwOyBqKyspCisJCXsKKwkJCWRldi0+aXJxID0gaXJxbGlzdFtqXTsKKwkJCWlmICghcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHRtczM4MHRyX2ludGVycnVwdCwgMCwgCisJCQkJaXNhX2NhcmRuYW1lLCBkZXYpKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkJCisgICAgICAgICAgICAgICAgaWYoaXJxbGlzdFtqXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIElSUSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBpcnFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChpcnFsaXN0W2pdID09IGRldi0+aXJxKQorCQkJCWJyZWFrOworCQlpZiAoaXJxbGlzdFtqXSA9PSAwKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBJUlEgJWQgc3BlY2lmaWVkXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQkJZ290byBvdXQzOworCQl9CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgdG1zMzgwdHJfaW50ZXJydXB0LCAwLCAKKwkJCWlzYV9jYXJkbmFtZSwgZGV2KSkKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbGVjdGVkIElSUSAlZCBub3QgYXZhaWxhYmxlXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCX0KKworCWlmIChkZXYtPmRtYSA9PSAwKQorCXsKKwkJZm9yKGogPSAwOyBkbWFsaXN0W2pdICE9IDA7IGorKykKKwkJeworCQkJZGV2LT5kbWEgPSBkbWFsaXN0W2pdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X2RtYShkZXYtPmRtYSwgaXNhX2NhcmRuYW1lKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmKGRtYWxpc3Rbal0gPT0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9TZWxlY3Qgbm8gRE1BIGF2YWlsYWJsZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3IoaiA9IDA7IGRtYWxpc3Rbal0gIT0gMDsgaisrKQorCQkJaWYgKGRtYWxpc3Rbal0gPT0gZGV2LT5kbWEpCisJCQkJYnJlYWs7CisJCWlmIChkbWFsaXN0W2pdID09IDApCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJbGxlZ2FsIERNQSAlZCBzcGVjaWZpZWRcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5kbWEpOworCQkJZ290byBvdXQyOworCQl9CisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgaXNhX2NhcmRuYW1lKSkKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbGVjdGVkIERNQSAlZCBub3QgYXZhaWxhYmxlXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkICBETUE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCQkKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworb3V0OgorCWZyZWVfZG1hKGRldi0+ZG1hKTsKK291dDI6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQzOgorCXRtc2Rldl90ZXJtKGRldik7CitvdXQ0OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTS19JU0FfSU9fRVhURU5UKTsgCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgc2tfaXNhX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWludCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgInRyJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKwllcnIgPSBzZXR1cF9jYXJkKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gZGV2Oworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqIFJlYWRzIE1BQyBhZGRyZXNzIGZyb20gYWRhcHRlciBSQU0sIHdoaWNoIHNob3VsZCd2ZSByZWFkIGl0IGZyb20KKyAqIHRoZSBvbmJvYXJkIFJPTS4gIAorICoKKyAqIENhbGxpbmcgdGhpcyBvbiBhIGJvYXJkIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBpdCBjYW4gYmUgYSB2ZXJ5CisgKiBkYW5nZXJvdXMgdGhpbmcuICBUaGUgTWFkZ2UgYm9hcmQsIGZvciBpbnN0YW5jZSwgd2lsbCBsb2NrIHlvdXIKKyAqIG1hY2hpbmUgaGFyZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiAgTHVja2lseSwgaXRzIHN1cHBvcnRlZCBpbiBhCisgKiBzZXBhcmF0ZSBkcml2ZXIuICAtLUFTRgorICovCitzdGF0aWMgdm9pZCBza19pc2FfcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwkKKwkvKiBBZGRyZXNzOiAwMDAwOjAwMDAgKi8KKwlza19pc2Ffc2lmd3JpdGV3KGRldiwgMCwgU0lGQURYKTsKKwlza19pc2Ffc2lmd3JpdGV3KGRldiwgMCwgU0lGQURSKTsJCisJCisJLyogUmVhZCBzaXggYnl0ZSBNQUMgYWRkcmVzcyBkYXRhICovCisJZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gc2tfaXNhX3NpZnJlYWR3KGRldiwgU0lGSU5DKSA+PiA4OworfQorCit1bnNpZ25lZCBzaG9ydCBza19pc2Ffc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2tfaXNhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwgPSAwOworCXVuc2lnbmVkIHNob3J0IG9sZHZhbDsKKwlpbnQgaTsKKworCXZhbCA9IDA7CisJZm9yKGkgPSAwOyBpcnFsaXN0W2ldICE9IDA7IGkrKykKKwl7CisJCWlmKGlycWxpc3RbaV0gPT0gZGV2LT5pcnEpCisJCQlicmVhazsKKwl9CisKKwl2YWwgfD0gQ1lDTEVfVElNRSA8PCAyOworCXZhbCB8PSBpIDw8IDQ7CisJaSA9IGRldi0+ZG1hIC0gNTsKKwl2YWwgfD0gaTsKKwlpZih0cC0+RGF0YVJhdGUgPT0gU1BFRURfNCkKKwkJdmFsIHw9IExJTkVfU1BFRURfQklUOworCWVsc2UKKwkJdmFsICY9IH5MSU5FX1NQRUVEX0JJVDsKKwlvbGR2YWwgPSBza19pc2Ffc2lmcmVhZGIoZGV2LCBQT1NSRUcpOworCS8qIExlYXZlIGN5Y2xlIGJpdHMgYWxvbmUgKi8KKwlvbGR2YWwgfD0gMHhmMzsKKwl2YWwgJj0gb2xkdmFsOworCXNrX2lzYV9zaWZ3cml0ZWIoZGV2LCB2YWwsIFBPU1JFRyk7CisKKwlyZXR1cm4gdG1zMzgwdHJfb3BlbihkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCisKKyNkZWZpbmUgSVNBVFJfTUFYX0FEQVBURVJTIDMKKworc3RhdGljIGludCBpb1tJU0FUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpcnFbSVNBVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgZG1hW0lTQVRSX01BWF9BREFQVEVSU107CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc2tfaXNhX2RldltJU0FUUl9NQVhfQURBUFRFUlNdOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBudW0gPSAwLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IElTQVRSX01BWF9BREFQVEVSUyA7IGkrKykgeworCQlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWNvbnRpbnVlOworCisJCWRldi0+YmFzZV9hZGRyID0gaW9baV07CisJCWRldi0+aXJxID0gaXJxW2ldOworCQlkZXYtPmRtYSA9IGRtYVtpXTsKKwkJZXJyID0gc2V0dXBfY2FyZChkZXYpOworCisJCWlmICghZXJyKSB7CisJCQlza19pc2FfZGV2W2ldID0gZGV2OworCQkJKytudW07CisJCX0gZWxzZSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJza2lzYS5jOiAlZCBjYXJkcyBmb3VuZC5cbiIsIG51bSk7CisJLyogUHJvYmUgZm9yIGNhcmRzLiAqLworCWlmIChudW0gPT0gMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInNraXNhLmM6IE5vIGNhcmRzIGZvdW5kLlxuIik7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrX2lzYV9kZXZbaV07CisKKwkJaWYgKCFkZXYpIAorCQkJY29udGludWU7CisJCQorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0tfSVNBX0lPX0VYVEVOVCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlmcmVlX2RtYShkZXYtPmRtYSk7CisJCXRtc2Rldl90ZXJtKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHNraXNhLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHNraXNhLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YWVhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCkBAIC0wLDAgKzEsNTc0MiBAQAorLyoKKyAqICBzbWN0ci5jOiBBIG5ldHdvcmsgZHJpdmVyIGZvciB0aGUgU01DIFRva2VuIFJpbmcgQWRhcHRlcnMuCisgKgorICogIFdyaXR0ZW4gYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZGV2aWNlIGRyaXZlciB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgU01DIGFkYXB0ZXJzOgorICogICAgICAtIFNNQyBUb2tlbkNhcmQgRWxpdGUgICAoODExNVQsIGNoaXBzIDgyNS81ODQpCisgKiAgICAgIC0gU01DIFRva2VuQ2FyZCBFbGl0ZS9BIE1DQSAoODExNVQvQSwgY2hpcHMgODI1LzU5NCkKKyAqCisgKiAgU291cmNlKHMpOgorICogIAktIFNNQyBUb2tlbkNhcmQgU0RLLgorICoKKyAqICBNYWludGFpbmVyKHMpOgorICogICAgSlMgICAgICAgIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqICAgIDA3MTAyMDAwICAgICAgICAgIEpTICAgICAgRml4ZWQgYSB0aW1pbmcgcHJvYmxlbSBpbiBzbWN0cl93YWl0X2NtZCgpOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHNvIGFkZGVkIGEgYml0IG1vcmUgZGlzY3JpcHRpdmUgZXJyb3IgbXNncy4KKyAqICAgIDA3MTIyMDAwICAgICAgICAgIEpTICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRldGVjdGluZyBhIGNhcmQgd2l0aAorICoJCQkJbW9kdWxlIGlvL2lycS9tZW0gc3BlY2lmaWVkLgorICoKKyAqICBUbyBkbzoKKyAqICAgIDEuIE11bHRpY2FzdCBzdXBwb3J0LgorICoKKyAqICBJbml0aWFsIDIuNSBjbGVhbnVwIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+ICAyMDAyLzEwLzI4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisjZXJyb3IgRklYTUU6IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IDY0LWJpdCBwbGF0Zm9ybXMKKyNlbmRpZgorCisjaW5jbHVkZSAic21jdHIuaCIgICAgICAgICAgICAgICAvKiBPdXIgU3R1ZmYgKi8KKyNpbmNsdWRlICJzbWN0cl9maXJtd2FyZS5oIiAgICAgIC8qIFNNQyBhZGFwdGVyIGZpcm13YXJlICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJzbWN0ci5jOiB2MS40IDcvMTIvMDAgYnkganNjaGxzdEBzYW1iYS5vcmdcbiI7CitzdGF0aWMgY29uc3QgY2hhciBjYXJkbmFtZVtdID0gInNtY3RyIjsKKworCisjZGVmaW5lIFNNQ1RSX0lPX0VYVEVOVCAgIDIwCisKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorc3RhdGljIHVuc2lnbmVkIGludCBzbWN0cl9wb3NpZCA9IDB4NmVjNjsKKyNlbmRpZgorCitzdGF0aWMgaW50IHJpbmdzcGVlZDsKKworLyogU01DIE5hbWUgb2YgdGhlIEFkYXB0ZXIuICovCitzdGF0aWMgY2hhciBzbWN0cl9uYW1lW10gPSAiU01DIFRva2VuQ2FyZCI7CitjaGFyICpzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKKworLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgMiBmb3IgZGVidWcsIGFuZAorICogMyBmb3IgdmVyeSB2ZXJib3NlIGRlYnVnLgorICovCisjaWZuZGVmIFNNQ1RSX0RFQlVHCisjZGVmaW5lIFNNQ1RSX0RFQlVHIDEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBzbWN0cl9kZWJ1ZyA9IFNNQ1RSX0RFQlVHOworCisvKiBzbWN0ci5jIHByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBhcmUgYXJyYW5nZWQgYWxwaGFiZXRpY2x5IAorICogZm9yIGNsZWFyaXR5LCBtYWludGFpbmFiaWxpdHkgYW5kIHB1cmUgb2xkIGZhc2hpb24gZnVuLiAKKyAqLworLyogQSAqLworc3RhdGljIGludCBzbWN0cl9hbGxvY19zaGFyZWRfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBCICovCitzdGF0aWMgaW50IHNtY3RyX2J5cGFzc19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQyAqLworc3RhdGljIGludCBzbWN0cl9jaGVja3N1bV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2Noa19pc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2NoZ19yeF9tYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9jbGVhcl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2NsZWFyX3RyY19yZXNldChpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc21jdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEQgKi8KK3N0YXRpYyBpbnQgc21jdHJfZGVjb2RlX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlXzE2Yml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV9iaWNfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBFICovCitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV8xNmJpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9lbmFibGVfYmljX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRyAqLworc3RhdGljIGludCBfX2luaXQgc21jdHJfZ2V0X2JvYXJkaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1jYSk7CitzdGF0aWMgaW50IHNtY3RyX2dldF9ncm91cF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9nZXRfZnVuY3Rpb25hbF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHVuc2lnbmVkIGludCBzbWN0cl9nZXRfbnVtX3J4X2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2dldF9waHlzaWNhbF9kcm9wX251bWJlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBfX3U4ICpzbWN0cl9nZXRfcnhfcG9pbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX2dldF9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbWN0cl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgRkNCbG9jayAqc21jdHJfZ2V0X3R4X2ZjYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSwKKyAgICAgICAgX191MTYgYnl0ZXNfY291bnQpOworc3RhdGljIGludCBzbWN0cl9nZXRfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSCAqLworc3RhdGljIGludCBzbWN0cl9oYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCk7CisvKiBJICovCitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbml0X2NhcmRfcmVhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9yeF9iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbml0X3J4X2ZjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF90eF9iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbml0X3R4X2ZjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2ludGVybmFsX3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWN0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2VuYWJsZV9pbnRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIF9fdTE2IGludGVycnVwdF9lbmFibGVfbWFzayk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2ludF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgaWFja19jb2RlLAorICAgICAgICBfX3UxNiBpYml0cyk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luaXRfdGltZXJzX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfaW5pdF90eHJ4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfaW5zZXJ0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVhZF9yaW5nX3N0YXR1c19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgYXdvcmRfY250KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVtb3ZlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Rlc3RfaW50ZXJuYWxfcm9tX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9oaWNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X21hY19yZWdfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90cmNfbG9vcGJhY2tfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90cmlfbG9vcGJhY2tfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV9ieXRlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKmJ5dGUpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV93b3JkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKndvcmQpOworCisvKiBKICovCitzdGF0aWMgaW50IHNtY3RyX2pvaW5fY29tcGxldGVfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEwgKi8KK3N0YXRpYyBpbnQgc21jdHJfbGlua190eF9mY2JzX3RvX2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2xvYWRfbm9kZV9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogTSAqLworc3RhdGljIGludCBzbWN0cl9tYWtlXzgwMjVfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgTUFDX0hFQURFUiAqdG1mLCBfX3UxNiBhY19mYyk7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfYWNjZXNzX3ByaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hZGRyX21vZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hdXRoX2Z1bmN0X2NsYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdiwgX191MTYgY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfZnVuY3RfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9ncm91cF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX3BoeV9kcm9wX251bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9wcm9kdWN0X2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX3N0YXRpb25faWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV90eF9zdGF0dXNfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2LCBfX3UxNiB0eF9mc3RhdHVzKTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX3dyYXBfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKKworLyogTyAqLworc3RhdGljIGludCBzbWN0cl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9vcGVuX3RyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBQICovCitzdHJ1Y3QgbmV0X2RldmljZSAqc21jdHJfcHJvYmUoaW50IHVuaXQpOworc3RhdGljIGludCBfX2luaXQgc21jdHJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCBzbWN0cl9wcm9jZXNzX3J4X3BhY2tldChNQUNfSEVBREVSICpybWYsIF9fdTE2IHNpemUsCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHJ4X3N0YXR1cyk7CisKKy8qIFIgKi8KK3N0YXRpYyBpbnQgc21jdHJfcmFtX21lbW9yeV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9yY3ZfY2hnX3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9yY3ZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X3R4X2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mKTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X3JxX2FkZHJfc3RhdGVfYXR0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX0hFQURFUiAqcm1mLCBfX3UxNiAqY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3Jjdl91bmtub3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9yZXNldF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfcmluZ19zdGF0dXNfY2hnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9yeF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogUyAqLworc3RhdGljIGludCBzbWN0cl9zZW5kX2RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfbG9iZV9tZWRpYV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X2F0dGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3R4X2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX0hFQURFUiAqcm1mLCBfX3UxNiB0eF9mc3RhdHVzKTsKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9yc3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiByY29kZSwgX191MTYgY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKnR4X2ZzdGF0dXMpOworc3RhdGljIGludCBzbWN0cl9zZXRfYXV0aF9hY2Nlc3NfcHJpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YpOworc3RhdGljIGludCBzbWN0cl9zZXRfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnJzdiwKKwlfX3UxNiAqY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9lcnJvcl90aW1lcl92YWx1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2ZyYW1lX2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdiwgX191OCBkY19zYyk7CitzdGF0aWMgaW50IHNtY3RyX3NldF9sb2NhbF9yaW5nX251bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbWN0cl9zZXRfY3RybF9hdHRlbnRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzbWN0cl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9wYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTggKmJ1Zik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9waHlfZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3Jpbmdfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9yeF9sb29rX2FoZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZXRfdHJjX3Jlc2V0KGludCBpb2FkZHIpOworc3RhdGljIGludCBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIF9fdTE2IGNvbW1hbmQsIF9fdTE2IHN1YmNvbW1hbmQpOworc3RhdGljIGludCBzbWN0cl9zZXR1cF9zaW5nbGVfY21kX3dfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKTsKK3N0YXRpYyBjaGFyICpzbWN0cl9tYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgc2l6ZSk7CitzdGF0aWMgaW50IHNtY3RyX3N0YXR1c19jaGcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFQgKi8KK3N0YXRpYyB2b2lkIHNtY3RyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3RyY19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBGQ0Jsb2NrICpmY2IsCisgICAgICAgIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBfX3UxNiBzbWN0cl90eF9jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfdHhfbW92ZV9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4ICpwYnVmZiwgdW5zaWduZWQgaW50IGJ5dGVzKTsKKworLyogVSAqLworc3RhdGljIGludCBzbWN0cl91cGRhdGVfZXJyX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl91cGRhdGVfcnhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIGludCBzbWN0cl91cGRhdGVfdHhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgRkNCbG9jayAqZmNiLAorICAgICAgICBfX3UxNiBxdWV1ZSk7CisKKy8qIFcgKi8KK3N0YXRpYyBpbnQgc21jdHJfd2FpdF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgVE9fMjU2X0JZVEVfQk9VTkRSWShYKSAgKCgoWCArIDB4ZmYpICYgMHhmZjAwKSAtIFgpCisjZGVmaW5lIFRPX1BBUkFHUkFQSF9CT1VORFJZKFgpICgoKFggKyAweDBmKSAmIDB4ZmZmMCkgLSBYKQorI2RlZmluZSBQQVJBR1JBUEhfQk9VTkRSWShYKSAgICBzbWN0cl9tYWxsb2MoZGV2LCBUT19QQVJBR1JBUEhfQk9VTkRSWShYKSkKKworLyogQWxsb2NhdGUgQWRhcHRlciBTaGFyZWQgTWVtb3J5LgorICogSU1QT1JUQU5UIE5PVEU6IEFueSBjaGFuZ2VzIHRvIHRoaXMgZnVuY3Rpb24gTVVTVCBiZSBtaXJyb3JlZCBpbiB0aGUKKyAqIGZ1bmN0aW9uICJnZXRfbnVtX3J4X2JkYnMiIGJlbG93ISEhCisgKgorICogT3JkZXIgb2YgbWVtb3J5IGFsbG9jYXRpb246CisgKgorICogICAgICAgMC4gSW5pdGlhbCBTeXN0ZW0gQ29uZmlndXJhdGlvbiBCbG9jayBQb2ludGVyCisgKiAgICAgICAxLiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBCbG9jaworICogICAgICAgMi4gU3lzdGVtIENvbnRyb2wgQmxvY2sKKyAqICAgICAgIDMuIEFjdGlvbiBDb21tYW5kIEJsb2NrCisgKiAgICAgICA0LiBJbnRlcnJ1cHQgU3RhdHVzIEJsb2NrCisgKgorICogICAgICAgNS4gTUFDIFRYIEZDQidTCisgKiAgICAgICA2LiBOT04tTUFDIFRYIEZDQidTCisgKiAgICAgICA3LiBNQUMgVFggQkRCJ1MKKyAqICAgICAgIDguIE5PTi1NQUMgVFggQkRCJ1MKKyAqICAgICAgIDkuIE1BQyBSWCBGQ0InUworICogICAgICAxMC4gTk9OLU1BQyBSWCBGQ0InUworICogICAgICAxMS4gTUFDIFJYIEJEQidTCisgKiAgICAgIDEyLiBOT04tTUFDIFJYIEJEQidTCisgKiAgICAgIDEzLiBNQUMgVFggRGF0YSBCdWZmZXIoIDEsIDI1NiBieXRlIGJ1ZmZlcikKKyAqICAgICAgMTQuIE1BQyBSWCBEYXRhIEJ1ZmZlciggMSwgMjU2IGJ5dGUgYnVmZmVyKQorICoKKyAqICAgICAgMTUuIE5PTi1NQUMgVFggRGF0YSBCdWZmZXIKKyAqICAgICAgMTYuIE5PTi1NQUMgUlggRGF0YSBCdWZmZXIKKyAqLworc3RhdGljIGludCBzbWN0cl9hbGxvY19zaGFyZWRfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBpbml0aWFsIFN5c3RlbSBDb250cm9sIEJsb2NrIHBvaW50ZXIuCisgICAgICAgICAqIFRoaXMgcG9pbnRlciBpcyBsb2NhdGVkIGluIHRoZSBsYXN0IHBhZ2UsIGxhc3Qgb2Zmc2V0IC0gNC4KKyAgICAgICAgICovCisgICAgICAgIHRwLT5pc2NwYl9wdHIgPSAoSVNDUEJsb2NrICopKHRwLT5yYW1fYWNjZXNzICsgKChfX3UzMik2NCAqIDB4NDAwKQorICAgICAgICAgICAgICAgIC0gKGxvbmcpSVNDUF9CTE9DS19TSVpFKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBTeXN0ZW0gQ29udHJvbCBCbG9ja3MuICovCisgICAgICAgIHRwLT5zY2diX3B0ciA9IChTQ0dCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsIHNpemVvZihTQ0dCbG9jaykpOworICAgICAgICBQQVJBR1JBUEhfQk9VTkRSWSh0cC0+c2hfbWVtX3VzZWQpOworCisgICAgICAgIHRwLT5zY2xiX3B0ciA9IChTQ0xCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsIHNpemVvZihTQ0xCbG9jaykpOworICAgICAgICBQQVJBR1JBUEhfQk9VTkRSWSh0cC0+c2hfbWVtX3VzZWQpOworCisgICAgICAgIHRwLT5hY2JfaGVhZCA9IChBQ0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQUNCbG9jaykqdHAtPm51bV9hY2JzKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+aXNiX3B0ciA9IChJU0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwgc2l6ZW9mKElTQmxvY2spKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+bWlzY19jb21tYW5kX2RhdGEgPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCBNSVNDX0RBVEFfU0laRSk7CisgICAgICAgIFBBUkFHUkFQSF9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgdHJhbnNtaXQgRkNCcy4gKi8KKyAgICAgICAgdHAtPnR4X2ZjYl9oZWFkW01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV90eF9mY2JzW01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9mY2JfaGVhZFtOT05fTUFDX1FVRVVFXSA9IChGQ0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3R4X2ZjYnNbTk9OX01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9mY2JfaGVhZFtCVUdfUVVFVUVdID0gKEZDQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tCVUdfUVVFVUVdKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSB0cmFuc21pdCBCREJzLiAqLworICAgICAgICB0cC0+dHhfYmRiX2hlYWRbTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3R4X2JkYnNbTUFDX1FVRVVFXSk7CisKKyAgICAgICAgdHAtPnR4X2JkYl9oZWFkW05PTl9NQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tOT05fTUFDX1FVRVVFXSk7CisKKyAgICAgICAgdHAtPnR4X2JkYl9oZWFkW0JVR19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV90eF9iZGJzW0JVR19RVUVVRV0pOworCisgICAgICAgIC8qIEFsbG9jYXRlIHJlY2VpdmUgRkNCcy4gKi8KKyAgICAgICAgdHAtPnJ4X2ZjYl9oZWFkW01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT5yeF9mY2JfaGVhZFtOT05fTUFDX1FVRVVFXSA9IChGQ0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3J4X2ZjYnNbTk9OX01BQ19RVUVVRV0pOworCisgICAgICAgIC8qIEFsbG9jYXRlIHJlY2VpdmUgQkRCcy4gKi8KKyAgICAgICAgdHAtPnJ4X2JkYl9oZWFkW01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV9yeF9iZGJzW01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT5yeF9iZGJfZW5kW01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsIDApOworCisgICAgICAgIHRwLT5yeF9iZGJfaGVhZFtOT05fTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3J4X2JkYnNbTk9OX01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT5yeF9iZGJfZW5kW05PTl9NQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBNQUMgdHJhbnNtaXQgYnVmZmVycy4KKyAgICAgICAgICogTUFDIFR4IEJ1ZmZlcnMgZG9lbid0IGhhdmUgdG8gYmUgb24gYW4gT0REIEJvdW5kcnkuCisgICAgICAgICAqLworICAgICAgICB0cC0+dHhfYnVmZl9oZWFkW01BQ19RVUVVRV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIHRwLT50eF9idWZmX3NpemVbTUFDX1FVRVVFXSk7CisgICAgICAgIHRwLT50eF9idWZmX2N1cnJbTUFDX1FVRVVFXSA9IHRwLT50eF9idWZmX2hlYWRbTUFDX1FVRVVFXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfZW5kIFtNQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgQlVHIHRyYW5zbWl0IGJ1ZmZlcnMuICovCisgICAgICAgIHRwLT50eF9idWZmX2hlYWRbQlVHX1FVRVVFXQorICAgICAgICAgICAgICAgID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgdHAtPnR4X2J1ZmZfc2l6ZVtCVUdfUVVFVUVdKTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltCVUdfUVVFVUVdID0gdHAtPnR4X2J1ZmZfaGVhZFtCVUdfUVVFVUVdOworICAgICAgICB0cC0+dHhfYnVmZl9lbmRbQlVHX1FVRVVFXSA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIDApOworCisgICAgICAgIC8qIEFsbG9jYXRlIE1BQyByZWNlaXZlIGRhdGEgYnVmZmVycy4KKyAgICAgICAgICogTUFDIFJ4IGJ1ZmZlciBkb2Vzbid0IGhhdmUgdG8gYmUgb24gYSAyNTYgYnl0ZSBib3VuZGFyeS4KKyAgICAgICAgICovCisgICAgICAgIHRwLT5yeF9idWZmX2hlYWRbTUFDX1FVRVVFXSA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgUlhfREFUQV9CVUZGRVJfU0laRSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdKTsKKyAgICAgICAgdHAtPnJ4X2J1ZmZfZW5kW01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBOb24tTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqID8/IEZvciBtYXhpbXVtIE5ldHdhcmUgcGVyZm9ybWFuY2UsIHB1dCBUeCBCdWZmZXJzIG9uCisgICAgICAgICAqIE9ERCBCb3VuZHJ5IGFuZCB0aGVuIHJlc3RvcmUgbWFsbG9jIHRvIEV2ZW4gQm91bmRyeXMuCisgICAgICAgICAqLworICAgICAgICBzbWN0cl9tYWxsb2MoZGV2LCAxTCk7CisgICAgICAgIHRwLT50eF9idWZmX2hlYWRbTk9OX01BQ19RVUVVRV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIHRwLT50eF9idWZmX3NpemVbTk9OX01BQ19RVUVVRV0pOworICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW05PTl9NQUNfUVVFVUVdID0gdHAtPnR4X2J1ZmZfaGVhZFtOT05fTUFDX1FVRVVFXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfZW5kIFtOT05fTUFDX1FVRVVFXSA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIDApOworICAgICAgICBzbWN0cl9tYWxsb2MoZGV2LCAxTCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTm9uLU1BQyByZWNlaXZlIGRhdGEgYnVmZmVycy4KKyAgICAgICAgICogVG8gZ3VhcmFudGVlIGEgbWluaW11bSBvZiAyNTYgY29udGlnb3VzIG1lbW9yeSB0bworICAgICAgICAgKiBVTV9SZWNlaXZlX1BhY2tldCdzIGxvb2thaGVhZCBwb2ludGVyLCBiZWZvcmUgYSBwYWdlCisgICAgICAgICAqIGNoYW5nZSBvciByaW5nIGVuZCBpcyBlbmNvdW50ZXJlZCwgcGxhY2UgZWFjaCByeCBidWZmZXIgb24KKyAgICAgICAgICogYSAyNTYgYnl0ZSBib3VuZGFyeS4KKyAgICAgICAgICovCisgICAgICAgIHNtY3RyX21hbGxvYyhkZXYsIFRPXzI1Nl9CWVRFX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKSk7CisgICAgICAgIHRwLT5yeF9idWZmX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIFJYX0RBVEFfQlVGRkVSX1NJWkUgKiB0cC0+bnVtX3J4X2JkYnNbTk9OX01BQ19RVUVVRV0pOworICAgICAgICB0cC0+cnhfYnVmZl9lbmRbTk9OX01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKiBFbnRlciBCeXBhc3Mgc3RhdGUuICovCitzdGF0aWMgaW50IHNtY3RyX2J5cGFzc19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisJaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgCXByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfYnlwYXNzX3N0YXRlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFLCBKU19CWVBBU1NfU1RBVEUpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9jaGVja3N1bV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IGksIGNoZWNrc3VtID0gMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfY2hlY2tzdW1fZmlybXdhcmVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShkZXYpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IENTX1JBTV9TSVpFOyBpICs9IDIpCisgICAgICAgICAgICAgICAgY2hlY2tzdW0gKz0gKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MgKyBpKSk7CisKKyAgICAgICAgdHAtPm1pY3JvY29kZV92ZXJzaW9uID0gKihfX3UxNiAqKSh0cC0+cmFtX2FjY2VzcworICAgICAgICAgICAgICAgICsgQ1NfUkFNX1ZFUlNJT05fT0ZGU0VUKTsKKyAgICAgICAgdHAtPm1pY3JvY29kZV92ZXJzaW9uID4+PSA4OworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfYWRhcHRlcl9jdHJsX3N0b3JlKGRldik7CisKKyAgICAgICAgaWYoY2hlY2tzdW0pCisgICAgICAgICAgICAgICAgcmV0dXJuIChjaGVja3N1bSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc21jdHJfY2hrX21jYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjdXJyZW50X3Nsb3Q7CisJX191OCByMSwgcjIsIHIzLCByNCwgcjU7CisKKwljdXJyZW50X3Nsb3QgPSBtY2FfZmluZF91bnVzZWRfYWRhcHRlcihzbWN0cl9wb3NpZCwgMCk7CisJaWYoY3VycmVudF9zbG90ID09IE1DQV9OT1RGT1VORCkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCW1jYV9zZXRfYWRhcHRlcl9uYW1lKGN1cnJlbnRfc2xvdCwgc21jdHJfbmFtZSk7CisJbWNhX21hcmtfYXNfdXNlZChjdXJyZW50X3Nsb3QpOworCXRwLT5zbG90X251bSA9IGN1cnJlbnRfc2xvdDsKKworCXIxID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDIpOworCXIyID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDMpOworCisJaWYodHAtPnNsb3RfbnVtKQorCQlvdXRiKENORkdfUE9TX0NPTlRST0xfUkVHLCAoX191OCkoKHRwLT5zbG90X251bSAtIDEpIHwgQ05GR19TTE9UX0VOQUJMRV9CSVQpKTsKKwllbHNlCisJCW91dGIoQ05GR19QT1NfQ09OVFJPTF9SRUcsIChfX3U4KSgodHAtPnNsb3RfbnVtKSB8IENORkdfU0xPVF9FTkFCTEVfQklUKSk7CisKKwlyMSA9IGluYihDTkZHX1BPU19SRUcxKTsKKwlyMiA9IGluYihDTkZHX1BPU19SRUcwKTsKKworCXRwLT5iaWNfdHlwZSA9IEJJQ181OTRfQ0hJUDsKKworCS8qIElPICovCisJcjIgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgMik7CisJcjIgJj0gMHhGMDsKKwlkZXYtPmJhc2VfYWRkciA9ICgoX191MTYpcjIgPDwgOCkgKyAoX191MTYpMHg4MDA7CisJcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCwgc21jdHJfbmFtZSk7CisKKwkvKiBJUlEgKi8KKwlyNSA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCA1KTsKKwlyNSAmPSAweEM7CisgICAgICAgIHN3aXRjaChyNSkKKwl7CisgICAgICAgICAgICAJY2FzZSAwOgorCQkJZGV2LT5pcnEgPSAzOworICAgICAgICAgICAgICAgCQlicmVhazsKKworICAgICAgICAgICAgCWNhc2UgMHg0OgorCQkJZGV2LT5pcnEgPSA0OworICAgICAgICAgICAgICAgCQlicmVhazsKKworICAgICAgICAgICAgCWNhc2UgMHg4OgorCQkJZGV2LT5pcnEgPSAxMDsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorCQkJZGV2LT5pcnEgPSAxNTsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisJfQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc21jdHJfaW50ZXJydXB0LCBTQV9TSElSUSwgc21jdHJfbmFtZSwgZGV2KSkgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU01DVFJfSU9fRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogR2V0IFJBTSBiYXNlICovCisJcjMgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgMyk7CisJdHAtPnJhbV9iYXNlID0gKChfX3UzMikocjMgJiAweDcpIDw8IDEzKSArIDB4MEMwMDAwOworCWlmIChyMyAmIDB4OCkKKwkJdHAtPnJhbV9iYXNlICs9IDB4MDEwMDAwOworCWlmIChyMyAmIDB4ODApCisJCXRwLT5yYW1fYmFzZSArPSAweEYwMDAwMDsKKworCS8qIEdldCBSYW0gU2l6ZSAqLworCXIzICY9IDB4MzA7CisJcjMgPj49IDQ7CisKKwl0cC0+cmFtX3VzYWJsZSA9IChfX3UxNilDTkZHX1NJWkVfOEtCIDw8IHIzOworCXRwLT5yYW1fc2l6ZSA9IChfX3UxNilDTkZHX1NJWkVfNjRLQjsKKwl0cC0+Ym9hcmRfaWQgfD0gVE9LRU5fTUVESUE7CisKKwlyNCA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCA0KTsKKwl0cC0+cm9tX2Jhc2UgPSAoKF9fdTMyKShyNCAmIDB4NykgPDwgMTMpICsgMHgwQzAwMDA7CisJaWYgKHI0ICYgMHg4KQorCQl0cC0+cm9tX2Jhc2UgKz0gMHgwMTAwMDA7CisKKwkvKiBHZXQgUk9NIHNpemUuICovCisJcjQgPj49IDQ7CisJc3dpdGNoIChyNCkgeworCQljYXNlIDA6CisJCQl0cC0+cm9tX3NpemUgPSBDTkZHX1NJWkVfOEtCOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRwLT5yb21fc2l6ZSA9IENORkdfU0laRV8xNktCOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRwLT5yb21fc2l6ZSA9IENORkdfU0laRV8zMktCOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0cC0+cm9tX3NpemUgPSBST01fRElTQUJMRTsKKwl9CisKKwkvKiBHZXQgTWVkaWEgVHlwZS4gKi8KKwlyNSA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCA1KTsKKwlyNSAmPSBDTkZHX01FRElBX1RZUEVfTUFTSzsKKwlzd2l0Y2gocjUpCisJeworCQljYXNlICgwKToKKwkJCXRwLT5tZWRpYV90eXBlID0gTUVESUFfU1RQXzQ7CisJCQlicmVhazsKKworCQljYXNlICgxKToKKwkJCXRwLT5tZWRpYV90eXBlID0gTUVESUFfU1RQXzE2OworCQkJYnJlYWs7CisKKwkJY2FzZSAoMyk6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1VUUF8xNjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1VUUF80OworCQkJYnJlYWs7CisJfQorCXRwLT5tZWRpYV9tZW51ID0gMTQ7CisKKwlyMiA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCAyKTsKKwlpZighKHIyICYgMHgwMikpCisJCXRwLT5tb2RlX2JpdHMgfD0gRUFSTFlfVE9LRU5fUkVMOworCisJLyogRGlzYWJsZSBzbG90ICovCisJb3V0YihDTkZHX1BPU19DT05UUk9MX1JFRywgMCk7CisKKwl0cC0+Ym9hcmRfaWQgPSBzbWN0cl9nZXRfYm9hcmRpZChkZXYsIDEpOworCXN3aXRjaCh0cC0+Ym9hcmRfaWQgJiAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdEODExNVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfbW9kZWwgPSAiODExNVQvQSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0Q4MTE1VDoKKwkJCWlmKHRwLT5leHRyYV9pbmZvICYgQ0hJUF9SRVZfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfbW9kZWwgPSAiODExNVQgcmV2IFhFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfbW9kZWwgPSAiODExNVQgcmV2IFhEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIlVua25vd24iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCXJldHVybiAoMCk7CisjZWxzZQorCXJldHVybiAoLTEpOworI2VuZGlmIC8qIENPTkZJR19NQ0FfTEVHQUNZICovCit9CisKK3N0YXRpYyBpbnQgc21jdHJfY2hnX3J4X21hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyID0gMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2NoZ19yeF9tYXNrXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIGlmKHRwLT5tb2RlX2JpdHMgJiBMT09QSU5HX01PREVfTUFTSykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYX09XTl9CSVQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWF9PV05fQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBQUk9NSVNDVU9VU19NT0RFKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gUFJPTUlTQ1VPVVNfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UFJPTUlTQ1VPVVNfQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfRVJSX1BBQ0tFVFMpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBTQVZCQURfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+U0FWQkFEX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0FUVF9NQUNfRlJBTUVTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gUlhBVE1BQzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflJYQVRNQUM7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9NVUxUSV9QUk9NKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gTVVMVElDQVNUX0FERFJFU1NfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSAmPSB+TVVMVElDQVNUX0FERFJFU1NfQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfU09VUkNFX1JPVVRJTkdfU1BBTk5JTkcpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBTT1VSQ0VfUk9VVElOR19TUEFOTklOR19CSVRTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBTT1VSQ0VfUk9VVElOR19FWFBMT1JFUl9CSVQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSAmPSB+U09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV93cml0ZV93b3JkX2NtZChkZXYsIFJXX0NPTkZJR19SRUdJU1RFUl8wLAorICAgICAgICAgICAgICAgICZ0cC0+Y29uZmlnX3dvcmQwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgIH0KKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoZGV2LCBSV19DT05GSUdfUkVHSVNURVJfMSwKKyAgICAgICAgICAgICAgICAmdHAtPmNvbmZpZ193b3JkMSkpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfY2xlYXJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBvdXRiKCh0cC0+dHJjX21hc2sgfCBDU1JfQ0xSVElOVCksIGRldi0+YmFzZV9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2NsZWFyX3RyY19yZXNldChpbnQgaW9hZGRyKQoreworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBNU1IpOworICAgICAgICBvdXRiKH5NU1JfUlNUICYgciwgaW9hZGRyICsgTVNSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKgorICogVGhlIGludmVyc2Ugcm91dGluZSB0byBzbWN0cl9vcGVuKCkuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBpbnQgZXJyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCXRwLT5jbGVhbnVwID0gMTsKKworICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgYWRhcHRlciBpcyBhbHJlYWR5IGluIGEgY2xvc2VkIHN0YXRlLiAqLworICAgICAgICBpZih0cC0+c3RhdHVzICE9IE9QRU4pCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVtb3ZlX2NtZChkZXYpKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgIH0KKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2IgPSBza2JfZGVxdWV1ZSgmdHAtPlNlbmRTa2JRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYoc2tiID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB0cC0+UXVldWVTa2IrKzsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgIH0KKworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZGVjb2RlX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgc2hvcnQgYml0ID0gMHg4MCwgc2hpZnQgPSAxMjsKKyAgICAgICAgREVDT0RFX1RSRUVfTk9ERSAqdHJlZTsKKyAgICAgICAgc2hvcnQgYnJhbmNoLCB0c2l6ZTsKKyAgICAgICAgX191MTYgYnVmZiA9IDA7CisgICAgICAgIGxvbmcgd2VpZ2h0OworICAgICAgICBfX3U4ICp1Y29kZTsKKyAgICAgICAgX191MTYgKm1lbTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfZGVjb2RlX2Zpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHdlaWdodCAgPSAqKGxvbmcgKikodHAtPnB0cl91Y29kZSArIFdFSUdIVF9PRkZTRVQpOworICAgICAgICB0c2l6ZSAgID0gKihfX3U4ICopKHRwLT5wdHJfdWNvZGUgKyBUUkVFX1NJWkVfT0ZGU0VUKTsKKyAgICAgICAgdHJlZSAgICA9IChERUNPREVfVFJFRV9OT0RFICopKHRwLT5wdHJfdWNvZGUgKyBUUkVFX09GRlNFVCk7CisgICAgICAgIHVjb2RlICAgPSAoX191OCAqKSh0cC0+cHRyX3Vjb2RlICsgVFJFRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKHRzaXplICogc2l6ZW9mKERFQ09ERV9UUkVFX05PREUpKSk7CisgICAgICAgIG1lbSAgICAgPSAoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIHdoaWxlKHdlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGJyYW5jaCA9IFJPT1Q7CisgICAgICAgICAgICAgICAgd2hpbGUoKHRyZWUgKyBicmFuY2gpLT50YWcgIT0gTEVBRiAmJiB3ZWlnaHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoID0gKnVjb2RlICYgYml0ID8gKHRyZWUgKyBicmFuY2gpLT5sbGluaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0cmVlICsgYnJhbmNoKS0+cmxpbms7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodC0tOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihiaXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNvZGUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmIHw9ICh0cmVlICsgYnJhbmNoKS0+aW5mbyA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OworCisgICAgICAgICAgICAgICAgaWYoc2hpZnQgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICoobWVtKyspID0gU1dBUF9CWVRFUyhidWZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgICA9IDEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgYXNzdW1lcyB0aGUgQ29udHJvbCBTdG9yZSBNZW1vcnkgaGFzCisgICAgICAgICAqIGJlZW4gaW5pdGlhbGl6ZWQgdG8gemVyby4gSWYgdGhlIGxhc3QgcGFydGlhbCB3b3JkCisgICAgICAgICAqIGlzIHplcm8sIGl0IHdpbGwgbm90IGJlIHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICBpZihidWZmKQorICAgICAgICAgICAgICAgICoobWVtKyspID0gU1dBUF9CWVRFUyhidWZmKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfMTZiaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIE9uIEV4aXQsIEFkYXB0ZXIgaXM6CisgKiAxLiBUUkMgaXMgaW4gYSByZXNldCBzdGF0ZSBhbmQgdW4taW5pdGlhbGl6ZWQuCisgKiAyLiBBZGFwdGVyIG1lbW9yeSBpcyBlbmFibGVkLgorICogMy4gQ29udHJvbCBTdG9yZSBtZW1vcnkgaXMgb3V0IG9mIGNvbnRleHQgKC1XQ1NTIGlzIDEpLgorICovCitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfYWRhcHRlcl9jdHJsX3N0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB0cC0+dHJjX21hc2sgfD0gQ1NSX1dDU1M7CisgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV9iaWNfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIHRwLT50cmNfbWFzayA9IENTUl9NU0tfQUxMIHwgQ1NSX01TS0NCVVNZCisJICAgICAgICB8IENTUl9NU0tUSU5UIHwgQ1NSX1dDU1M7CisgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlXzE2Yml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191OCAgICByOworCisgICAgICAgIGlmKHRwLT5hZGFwdGVyX2J1cyA9PSBCVVNfSVNBMTZfVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHIgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBMQUFSKTsKKyAgICAgICAgICAgICAgICBvdXRiKChyIHwgTEFBUl9NRU0xNkVOQiksIGRldi0+YmFzZV9hZGRyICsgTEFBUik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKgorICogVG8gZW5hYmxlIHRoZSBhZGFwdGVyIGNvbnRyb2wgc3RvcmUgbWVtb3J5OgorICogMS4gQWRhcHRlciBtdXN0IGJlIGluIGEgUkVTRVQgc3RhdGUuCisgKiAyLiBBZGFwdGVyIG1lbW9yeSBtdXN0IGJlIGVuYWJsZWQuCisgKiAzLiBDb250cm9sIFN0b3JlIE1lbW9yeSBpcyBpbiBjb250ZXh0ICgtV0NTUyBpcyAwKS4KKyAqLworc3RhdGljIGludCBzbWN0cl9lbmFibGVfYWRhcHRlcl9jdHJsX3N0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9lbmFibGVfYWRhcHRlcl9jdHJsX3N0b3JlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHNtY3RyX3NldF90cmNfcmVzZXQoaW9hZGRyKTsKKyAgICAgICAgc21jdHJfZW5hYmxlX2FkYXB0ZXJfcmFtKGRldik7CisKKyAgICAgICAgdHAtPnRyY19tYXNrICY9IH5DU1JfV0NTUzsKKyAgICAgICAgb3V0Yih0cC0+dHJjX21hc2ssIGlvYWRkciArIENTUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9lbmFibGVfYWRhcHRlcl9yYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICByID0gaW5iKGlvYWRkciArIE1TUik7CisgICAgICAgIG91dGIoTVNSX01FTUIgfCByLCBpb2FkZHIgKyBNU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2JpY19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIF9fdTggcjsKKworICAgICAgICBzd2l0Y2godHAtPmJpY190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoQklDXzU4NF9DSElQKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50cmNfbWFzayA9IENTUl9NU0tDQlVTWSB8IENTUl9XQ1NTOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yih0cC0+dHJjX21hc2ssIGlvYWRkciArIENTUik7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIElSUik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRiKHIgfCBJUlJfSUVOLCBpb2FkZHIgKyBJUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIChCSUNfNTk0X0NISVApOgorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRyY19tYXNrID0gQ1NSX01TS0NCVVNZIHwgQ1NSX1dDU1M7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgSU1DQ1IpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0YihyIHwgSU1DQ1JfRUlMLCBpb2FkZHIgKyBJTUNDUik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2Noa19pc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIF9fdTggcjEsIHIyLCBiLCBjaGtzdW0gPSAwOworICAgICAgICBfX3UxNiByOworCWludCBpOworCWludCBlcnIgPSAtRU5PREVWOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9jaGtfaXNhICUjNHhcbiIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKworCWlmKChpb2FkZHIgJiAweDFGKSAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIC8qIEdyYWIgdGhlIHJlZ2lvbiBzbyB0aGF0IG5vIG9uZSBlbHNlIHRyaWVzIHRvIHByb2JlIG91ciBpb3BvcnRzLiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBTTUNUUl9JT19FWFRFTlQsIHNtY3RyX25hbWUpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisgICAgICAgIC8qIENoZWNrc3VtIFNNQyBub2RlIGFkZHJlc3MgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IGluYihpb2FkZHIgKyBMQVIwICsgaSk7CisgICAgICAgICAgICAgICAgY2hrc3VtICs9IGI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hrc3VtICE9IE5PREVfQUREUl9DS1NVTSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisKKyAgICAgICAgYiA9IGluYihpb2FkZHIgKyBCRElEKTsKKwlpZihiICE9IEJSRF9JRF84MTE1VCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IFRoZSBhZGFwdGVyIGZvdW5kIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIDgxMTVUIEJvYXJkIElEICovCisgICAgICAgIHIyID0gMDsKKyAgICAgICAgZm9yKHIgPSAwOyByIDwgODsgcisrKQorICAgICAgICB7CisgICAgICAgICAgICByMSA9IGluYihpb2FkZHIgKyAweDggKyByKTsKKyAgICAgICAgICAgIHIyICs9IHIxOworICAgICAgICB9CisKKyAgICAgICAgLyogdmFsdWUgb2YgUmVnRiBhZGRzIHVwIHRoZSBzdW0gdG8gMHhGRiAqLworICAgICAgICBpZigocjIgIT0gMHhGRikgJiYgKHIyICE9IDB4RUUpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKworICAgICAgICAvKiBHZXQgYWRhcHRlciBJRCAqLworICAgICAgICB0cC0+Ym9hcmRfaWQgPSBzbWN0cl9nZXRfYm9hcmRpZChkZXYsIDApOworICAgICAgICBzd2l0Y2godHAtPmJvYXJkX2lkICYgMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXRDgxMTVUQToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUL0EiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdEODExNVQ6CisJCQlpZih0cC0+ZXh0cmFfaW5mbyAmIENISVBfUkVWX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRSI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RvcmUgQklDIHR5cGUuICovCisgICAgICAgIHRwLT5iaWNfdHlwZSA9IEJJQ181ODRfQ0hJUDsKKyAgICAgICAgdHAtPm5pY190eXBlID0gTklDXzgyNV9DSElQOworCisgICAgICAgIC8qIENvcHkgUmFtIFNpemUgKi8KKyAgICAgICAgdHAtPnJhbV91c2FibGUgID0gQ05GR19TSVpFXzE2S0I7CisgICAgICAgIHRwLT5yYW1fc2l6ZSAgICA9IENORkdfU0laRV82NEtCOworCisgICAgICAgIC8qIEdldCA1OHggUmFtIEJhc2UgKi8KKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyKTsKKyAgICAgICAgcjEgJj0gMHgzRjsKKworICAgICAgICByMiA9IGluYihpb2FkZHIgKyBDTkZHX0xBQVJfNTg0KTsKKyAgICAgICAgcjIgJj0gQ05GR19MQUFSX01BU0s7CisgICAgICAgIHIyIDw8PSAzOworICAgICAgICByMiB8PSAoKHIxICYgMHgzOCkgPj4gMyk7CisKKyAgICAgICAgdHAtPnJhbV9iYXNlID0gKChfX3UzMilyMiA8PCAxNikgKyAoKChfX3UzMikocjEgJiAweDcpKSA8PCAxMyk7CisKKyAgICAgICAgLyogR2V0IDU4NCBJcnEgKi8KKyAgICAgICAgcjEgPSAwOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0lDUl81ODMpOworICAgICAgICByMSAmPSBDTkZHX0lDUl9JUjJfNTg0OworCisgICAgICAgIHIyID0gaW5iKGlvYWRkciArIENORkdfSVJSXzU4Myk7CisgICAgICAgIHIyICY9IENORkdfSVJSX0lSUVM7ICAgICAvKiAweDYwICovCisgICAgICAgIHIyID4+PSA1OworCisgICAgICAgIHN3aXRjaChyMikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocjEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDExOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyMSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+ZXh0cmFfaW5mbyAmIEFMVEVSTkFURV9JUlFfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocjEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSA3OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBObyBJUlEgZm91bmQgYWJvcnRpbmdcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisgICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzbWN0cl9pbnRlcnJ1cHQsIFNBX1NISVJRLCBzbWN0cl9uYW1lLCBkZXYpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKworICAgICAgICAvKiBHZXQgNTh4IFJvbSBCYXNlICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfQklPXzU4Myk7CisgICAgICAgIHIxICY9IDB4M0U7CisgICAgICAgIHIxIHw9IDB4NDA7CisKKyAgICAgICAgdHAtPnJvbV9iYXNlID0gKF9fdTMyKXIxIDw8IDEzOworCisgICAgICAgIC8qIEdldCA1OHggUm9tIFNpemUgKi8KKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19CSU9fNTgzKTsKKyAgICAgICAgcjEgJj0gMHhDMDsKKyAgICAgICAgaWYocjEgPT0gMCkKKyAgICAgICAgICAgICAgICB0cC0+cm9tX3NpemUgPSBST01fRElTQUJMRTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcjEgPj49IDY7CisgICAgICAgICAgICAgICAgdHAtPnJvbV9zaXplID0gKF9fdTE2KUNORkdfU0laRV84S0IgPDwgcjE7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgNTh4IEJvb3QgU3RhdHVzICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfR1AyKTsKKworICAgICAgICB0cC0+bW9kZV9iaXRzICY9ICh+Qk9PVF9TVEFUVVNfTUFTSyk7CisKKyAgICAgICAgaWYocjEgJiBDTkZHX0dQMl9CT09UX05JQkJMRSkKKyAgICAgICAgICAgICAgICB0cC0+bW9kZV9iaXRzIHw9IEJPT1RfVFlQRV8xOworCisgICAgICAgIC8qIEdldCA1OHggWmVybyBXYWl0IFN0YXRlICovCisgICAgICAgIHRwLT5tb2RlX2JpdHMgJj0gKH5aRVJPX1dBSVRfU1RBVEVfTUFTSyk7CisKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19JUlJfNTgzKTsKKworICAgICAgICBpZihyMSAmIENORkdfSVJSX1pXUykKKyAgICAgICAgICAgICAgICAgdHAtPm1vZGVfYml0cyB8PSBaRVJPX1dBSVRfU1RBVEVfOF9CSVQ7CisKKyAgICAgICAgaWYodHAtPmJvYXJkX2lkICYgQk9BUkRfMTZCSVQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0xBQVJfNTg0KTsKKworICAgICAgICAgICAgICAgIGlmKHIxICYgQ05GR19MQUFSX1pXUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb2RlX2JpdHMgfD0gWkVST19XQUlUX1NUQVRFXzE2X0JJVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCA1ODQgTWVkaWEgTWVudSAqLworICAgICAgICB0cC0+bWVkaWFfbWVudSA9IDE0OworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0lSUl81ODMpOworCisgICAgICAgIHRwLT5tb2RlX2JpdHMgJj0gMHhmOGZmOyAgICAgICAvKiAofkNORkdfSU5URVJGQUNFX1RZUEVfTUFTSykgKi8KKyAgICAgICAgaWYoKHRwLT5ib2FyZF9pZCAmIFRPS0VOX01FRElBKSA9PSBUT0tFTl9NRURJQSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEdldCBBZHZhbmNlZCBGZWF0dXJlcyAqLworICAgICAgICAgICAgICAgIGlmKCgocjEgJiAweDYpID4+IDEpID09IDB4MykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlIHw9IE1FRElBX1VUUF8xNjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChyMSAmIDB4NikgPj4gMSkgPT0gMHgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSB8PSBNRURJQV9TVFBfMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgocjEgJiAweDYpID4+IDEpID09IDB4MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSB8PSBNRURJQV9VVFBfNDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgfD0gTUVESUFfU1RQXzQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19HUDIpOworICAgICAgICAgICAgICAgIGlmKCEocjEgJiAweDIpICkgICAgICAgICAgIC8qIEdQMl9FVFJEICovCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kZV9iaXRzIHw9IEVBUkxZX1RPS0VOX1JFTDsKKworICAgICAgICAgICAgICAgIC8qIHNlZSBpZiB0aGUgY2hpcCBpcyBjb3JydXB0ZWQKKyAgICAgICAgICAgICAgICBpZihzbWN0cl9yZWFkXzU4NF9jaGtzdW0oaW9hZGRyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBFRVBST00gQ2hlY2tzdW0gRmFpbHVyZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQyOworICAgICAgICAgICAgICAgIH0KKwkJKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7CisKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTTUNUUl9JT19FWFRFTlQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2dldF9ib2FyZGlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtY2EpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHIsIHIxLCBJZEJ5dGU7CisgICAgICAgIF9fdTE2IEJvYXJkSWRNYXNrOworCisgICAgICAgIHRwLT5ib2FyZF9pZCA9IEJvYXJkSWRNYXNrID0gMDsKKworCWlmKG1jYSkKKwl7CisJCUJvYXJkSWRNYXNrIHw9IChNSUNST0NIQU5ORUwrSU5URVJGQUNFX0NISVArVE9LRU5fTUVESUErUEFHRURfUkFNK0JPQVJEXzE2QklUKTsKKwkJdHAtPmV4dHJhX2luZm8gfD0gKElOVEVSRkFDRV81OTRfQ0hJUCtSQU1fU0laRV82NEsrTklDXzgyNV9CSVQrQUxURVJOQVRFX0lSUV9CSVQrU0xPVF8xNkJJVCk7CisJfQorCWVsc2UKKwl7CisgICAgICAgIAlCb2FyZElkTWFza3w9KElOVEVSRkFDRV9DSElQK1RPS0VOX01FRElBK1BBR0VEX1JBTStCT0FSRF8xNkJJVCk7CisgICAgICAgIAl0cC0+ZXh0cmFfaW5mbyB8PSAoSU5URVJGQUNFXzU4NF9DSElQICsgUkFNX1NJWkVfNjRLCisgICAgICAgIAkgICAgICAgICsgTklDXzgyNV9CSVQgKyBBTFRFUk5BVEVfSVJRX0JJVCk7CisJfQorCisJaWYoIW1jYSkKKwl7CisgICAgICAgIAlyID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIAlyICY9IDB4MGM7CisgICAgICAgCQlvdXRiKHIsIGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIAlyID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgCWlmKHIgJiBCSURfU0lYVEVFTl9CSVRfQklUKQorICAgICAgICAJeworICAgICAgICAJICAgICAgICB0cC0+ZXh0cmFfaW5mbyB8PSBTTE9UXzE2QklUOworICAgICAgICAJICAgICAgICB0cC0+YWRhcHRlcl9idXMgPSBCVVNfSVNBMTZfVFlQRTsKKyAgICAgICAgCX0KKyAgICAgICAgCWVsc2UKKyAgICAgICAgCSAgICAgICAgdHAtPmFkYXB0ZXJfYnVzID0gQlVTX0lTQThfVFlQRTsKKwl9CisJZWxzZQorCQl0cC0+YWRhcHRlcl9idXMgPSBCVVNfTUNBX1RZUEU7CisKKyAgICAgICAgLyogR2V0IEJvYXJkIElkIEJ5dGUgKi8KKyAgICAgICAgSWRCeXRlID0gaW5iKGlvYWRkciArIEJJRF9CT0FSRF9JRF9CWVRFKTsKKworICAgICAgICAvKiBpZiBNYWpvciB2ZXJzaW9uID4gMS4wIHRoZW4KKyAgICAgICAgICogICAgICByZXR1cm47CisgICAgICAgICAqLworICAgICAgICBpZihJZEJ5dGUgJiAweEY4KQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIHIxICY9IEJJRF9JQ1JfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX09USEVSX0JJVDsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzMpOworCisgICAgICAgIHIxICY9IEJJRF9FQVJfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX0VOR1JfUEFHRTsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzMpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSAmPSBCSURfSUNSX01BU0s7CisgICAgICAgIHIxIHw9IChCSURfUkxBIHwgQklEX09USEVSX0JJVCk7CisKKyAgICAgICAgb3V0YihyMSwgaW9hZGRyICsgQklEX1JFR18xKTsKKworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICB3aGlsZShyMSAmIEJJRF9SRUNBTExfRE9ORV9NQVNLKQorICAgICAgICAgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBCSURfTEFSXzAgKyBCSURfUkVHXzYpOworCisgICAgICAgIC8qIGNsZWFyIGNoaXAgcmV2IGJpdHMgKi8KKyAgICAgICAgdHAtPmV4dHJhX2luZm8gJj0gfkNISVBfUkVWX01BU0s7CisgICAgICAgIHRwLT5leHRyYV9pbmZvIHw9ICgociAmIEJJRF9FRVBST01fQ0hJUF9SRVZfTUFTSykgPDwgNik7CisKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgcjEgJj0gQklEX0lDUl9NQVNLOworICAgICAgICByMSB8PSBCSURfT1RIRVJfQklUOworCisgICAgICAgIG91dGIocjEsIGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMyk7CisKKyAgICAgICAgcjEgJj0gQklEX0VBUl9NQVNLOworICAgICAgICByMSB8PSBCSURfRUE2OworCisgICAgICAgIG91dGIocjEsIGlvYWRkciArIEJJRF9SRUdfMyk7CisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgcjEgJj0gQklEX0lDUl9NQVNLOworICAgICAgICByMSB8PSBCSURfUkxBOworCisgICAgICAgIG91dGIocjEsIGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgd2hpbGUocjEgJiBCSURfUkVDQUxMX0RPTkVfTUFTSykKKyAgICAgICAgICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHJldHVybiAoQm9hcmRJZE1hc2spOworfQorCitzdGF0aWMgaW50IHNtY3RyX2dldF9ncm91cF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoZGV2LCBSV19JTkRJVklEVUFMX0dST1VQX0FERFIpOworCisgICAgICAgIHJldHVybihzbWN0cl93YWl0X2NtZChkZXYpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfZnVuY3Rpb25hbF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoZGV2LCBSV19GVU5DVElPTkFMX0FERFIpOworCisgICAgICAgIHJldHVybihzbWN0cl93YWl0X2NtZChkZXYpKTsKK30KKworLyogQ2FsY3VsYXRlIG51bWJlciBvZiBOb24tTUFDIHJlY2VpdmUgQkRCJ3MgYW5kIGRhdGEgYnVmZmVycy4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBzaW11bGF0ZSBhbGxvY2F0ZWluZyBzaGFyZWQgbWVtb3J5IGV4YWN0bHkKKyAqIGFzIHRoZSBhbGxvY2F0ZV9zaGFyZWRfbWVtb3J5IGZ1bmN0aW9uIGFib3ZlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNtY3RyX2dldF9udW1fcnhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBtZW1fdXNlZCA9IDA7CisKKyAgICAgICAgLyogQWxsb2NhdGUgU3lzdGVtIENvbnRyb2wgQmxvY2tzLiAqLworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoU0NHQmxvY2spOworCisgICAgICAgIG1lbV91c2VkICs9IFRPX1BBUkFHUkFQSF9CT1VORFJZKG1lbV91c2VkKTsKKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKFNDTEJsb2NrKTsKKworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihBQ0Jsb2NrKSAqIHRwLT5udW1fYWNiczsKKworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihJU0Jsb2NrKTsKKworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisgICAgICAgIG1lbV91c2VkICs9IE1JU0NfREFUQV9TSVpFOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRyYW5zbWl0IEZDQidzLiAqLworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV90eF9mY2JzW01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tOT05fTUFDX1FVRVVFXTsKKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV90eF9mY2JzW0JVR19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgdHJhbnNtaXQgQkRCcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV90eF9iZGJzW01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tOT05fTUFDX1FVRVVFXTsKKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV90eF9iZGJzW0JVR19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgcmVjZWl2ZSBGQ0JzLiAqLworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3J4X2ZjYnNbTUFDX1FVRVVFXTsKKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIHJlY2VpdmUgQkRCcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV9yeF9iZGJzW01BQ19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyB0cmFuc21pdCBidWZmZXJzIGRvbid0IGhhdmUgdG8gYmUgb24gYW4gT0REIEJvdW5kcnkuCisgICAgICAgICAqLworICAgICAgICBtZW1fdXNlZCArPSB0cC0+dHhfYnVmZl9zaXplW01BQ19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgQlVHIHRyYW5zbWl0IGJ1ZmZlcnMuICovCisgICAgICAgIG1lbV91c2VkICs9IHRwLT50eF9idWZmX3NpemVbQlVHX1FVRVVFXTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBNQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyByZWNlaXZlIGJ1ZmZlcnMgZG9uJ3QgaGF2ZSB0byBiZSBvbiBhIDI1NiBieXRlIGJvdW5kYXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gUlhfREFUQV9CVUZGRVJfU0laRSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIE5vbi1NQUMgdHJhbnNtaXQgYnVmZmVycy4KKyAgICAgICAgICogRm9yIG1heGltdW0gTmV0d2FyZSBwZXJmb3JtYW5jZSwgcHV0IFR4IEJ1ZmZlcnMgb24KKyAgICAgICAgICogT0REIEJvdW5kcnksYW5kIHRoZW4gcmVzdG9yZSBtYWxsb2MgdG8gRXZlbiBCb3VuZHJ5cy4KKyAgICAgICAgICovCisgICAgICAgIG1lbV91c2VkICs9IDFMOworICAgICAgICBtZW1fdXNlZCArPSB0cC0+dHhfYnVmZl9zaXplW05PTl9NQUNfUVVFVUVdOworICAgICAgICBtZW1fdXNlZCArPSAxTDsKKworICAgICAgICAvKiBDQUxDVUxBVEUgTlVNQkVSIE9GIE5PTi1NQUMgUlggQkRCJ1MKKyAgICAgICAgICogQU5EIE5PTi1NQUMgUlggREFUQSBCVUZGRVJTCisgICAgICAgICAqCisgICAgICAgICAqIE1ha2Ugc3VyZSB0aGUgbWVtX3VzZWQgb2Zmc2V0IGF0IHRoaXMgcG9pbnQgaXMgdGhlCisgICAgICAgICAqIHNhbWUgYXMgaW4gYWxsb2NhdGVfc2hhcmVkIG1lbW9yeSBvciB0aGUgZm9sbG93aW5nCisgICAgICAgICAqIGJvdW5kYXJ5IGFkanVzdG1lbnQgd2lsbCBiZSBpbmNvcnJlY3QgKGkuZS4gbm90IGFsbG9jYXRpbmcKKyAgICAgICAgICogdGhlIG5vbi1tYWMgcmVjZWl2ZSBidWZmZXJzIGFib3ZlIGNhbm5vdCBjaGFuZ2UgdGhlIDI1NgorICAgICAgICAgKiBieXRlIG9mZnNldCkuCisgICAgICAgICAqCisgICAgICAgICAqIFNpbmNlIHRoaXMgY2Fubm90IGJlIGd1YXJhbnRlZWQsIGFkZGluZyB0aGUgZnVsbCAyNTYgYnl0ZXMKKyAgICAgICAgICogdG8gdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IHVzZWQgYXQgdGhpcyBwb2ludCB3aWxsIGd1YXJhbnRlZWQKKyAgICAgICAgICogdGhhdCB0aGUgcnggZGF0YSBidWZmZXJzIGRvIG5vdCBvdmVyZmxvdyBzaGFyZWQgbWVtb3J5LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gMHgxMDA7CisKKyAgICAgICAgcmV0dXJuKCgweGZmZmYgLSBtZW1fdXNlZCkgLyAoUlhfREFUQV9CVUZGRVJfU0laRSArIHNpemVvZihCREJsb2NrKSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2dldF9waHlzaWNhbF9kcm9wX251bWJlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfUEhZU0lDQUxfRFJPUF9OVU1CRVIpOworCisgICAgICAgIHJldHVybihzbWN0cl93YWl0X2NtZChkZXYpKTsKK30KKworc3RhdGljIF9fdTggKiBzbWN0cl9nZXRfcnhfcG9pbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBxdWV1ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBCREJsb2NrICpiZGI7CisKKyAgICAgICAgYmRiID0gKEJEQmxvY2sgKikoKF9fdTMyKXRwLT5yYW1fYWNjZXNzCisgICAgICAgICAgICAgICAgKyAoX191MzIpKHRwLT5yeF9mY2JfY3VycltxdWV1ZV0tPnRyY19iZGJfcHRyKSk7CisKKyAgICAgICAgdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+YmRiX3B0ciA9IGJkYjsKKworICAgICAgICByZXR1cm4gKChfX3U4ICopYmRiLT5kYXRhX2Jsb2NrX3B0cik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X3N0YXRpb25faWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc21jdHJfaXNzdWVfcmVhZF93b3JkX2NtZChkZXYsIFJXX0lORElWSURVQUxfTUFDX0FERFJFU1MpOworCisgICAgICAgIHJldHVybihzbWN0cl93YWl0X2NtZChkZXYpKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuCisgKiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICByZXR1cm4gKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSZ0cC0+TWFjU3RhdCk7Cit9CisKK3N0YXRpYyBGQ0Jsb2NrICpzbWN0cl9nZXRfdHhfZmNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlLAorICAgICAgICBfX3UxNiBieXRlc19jb3VudCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBGQ0Jsb2NrICpwRkNCOworICAgICAgICBCREJsb2NrICpwYmRiOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBhbGxvY19zaXplOworICAgICAgICB1bnNpZ25lZCBzaG9ydCAqdGVtcDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDIwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzbWN0cl9nZXRfdHhfZmNiXG4iKTsKKworICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggRkNCIGJsb2NrcyAqLworICAgICAgICBpZih0cC0+bnVtX3R4X2ZjYnNfdXNlZFtxdWV1ZV0gPj0gdHAtPm51bV90eF9mY2JzW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKChGQ0Jsb2NrICopKC0xTCkpOworCisgICAgICAgIC8qIHJvdW5kIG9mZiB0aGUgaW5wdXQgcGt0IHNpemUgdG8gdGhlIG5lYXJlc3QgZXZlbiBudW1iZXIgKi8KKyAgICAgICAgYWxsb2Nfc2l6ZSA9IChieXRlc19jb3VudCArIDEpICYgMHhmZmZlOworCisgICAgICAgIC8qIGNoZWNrIGlmIGVub3VnaCBtZW0gKi8KKyAgICAgICAgaWYoKHRwLT50eF9idWZmX3VzZWRbcXVldWVdICsgYWxsb2Nfc2l6ZSkgPiB0cC0+dHhfYnVmZl9zaXplW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKChGQ0Jsb2NrICopKC0xTCkpOworCisgICAgICAgIC8qIGNoZWNrIGlmIHBhc3QgdGhlIGVuZCA7CisgICAgICAgICAqIGlmIGV4YWN0bHkgZW5vdWdoIG1lbSB0byBlbmQgb2YgcmluZywgYWxsb2MgZnJvbSBmcm9udC4KKyAgICAgICAgICogdGhpcyBhdm9pZHMgdXBkYXRlIG9mIGN1cnIgd2hlbiBjdXJyID0gZW5kCisgICAgICAgICAqLworICAgICAgICBpZigoKHVuc2lnbmVkIGxvbmcpKHRwLT50eF9idWZmX2N1cnJbcXVldWVdKSArIGFsbG9jX3NpemUpCisgICAgICAgICAgICAgICAgPj0gKHVuc2lnbmVkIGxvbmcpKHRwLT50eF9idWZmX2VuZFtxdWV1ZV0pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgZW5vdWdoIG1lbW9yeSBmcm9tIHJpbmcgaGVhZCAqLworICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgPSBhbGxvY19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChfX3UxNikoKF9fdTMyKXRwLT50eF9idWZmX2VuZFtxdWV1ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gKF9fdTMyKXRwLT50eF9idWZmX2N1cnJbcXVldWVdKTsKKworICAgICAgICAgICAgICAgIGlmKCh0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSArIGFsbG9jX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICA+IHRwLT50eF9idWZmX3NpemVbcXVldWVdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEZDQmxvY2sgKikoLTFMKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcmluZyB3cmFwICovCisgICAgICAgICAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltxdWV1ZV0gPSB0cC0+dHhfYnVmZl9oZWFkW3F1ZXVlXTsKKyAgICAgICAgfQorCisgICAgICAgIHRwLT50eF9idWZmX3VzZWRbcXVldWVdICs9IGFsbG9jX3NpemU7CisgICAgICAgIHRwLT5udW1fdHhfZmNic191c2VkW3F1ZXVlXSsrOworICAgICAgICB0cC0+dHhfZmNiX2N1cnJbcXVldWVdLT5mcmFtZV9sZW5ndGggPSBieXRlc19jb3VudDsKKyAgICAgICAgdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+bWVtb3J5X2FsbG9jID0gYWxsb2Nfc2l6ZTsKKyAgICAgICAgdGVtcCA9IHRwLT50eF9idWZmX2N1cnJbcXVldWVdOworICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXQorICAgICAgICAgICAgICAgID0gKF9fdTE2ICopKChfX3UzMil0ZW1wICsgKF9fdTMyKSgoYnl0ZXNfY291bnQgKyAxKSAmIDB4ZmZmZSkpOworCisgICAgICAgIHBiZGIgPSB0cC0+dHhfZmNiX2N1cnJbcXVldWVdLT5iZGJfcHRyOworICAgICAgICBwYmRiLT5idWZmZXJfbGVuZ3RoID0gYnl0ZXNfY291bnQ7CisgICAgICAgIHBiZGItPmRhdGFfYmxvY2tfcHRyID0gdGVtcDsKKyAgICAgICAgcGJkYi0+dHJjX2RhdGFfYmxvY2tfcHRyID0gVFJDX1BPSU5URVIodGVtcCk7CisKKyAgICAgICAgcEZDQiA9IHRwLT50eF9mY2JfY3VycltxdWV1ZV07CisgICAgICAgIHRwLT50eF9mY2JfY3VycltxdWV1ZV0gPSB0cC0+dHhfZmNiX2N1cnJbcXVldWVdLT5uZXh0X3B0cjsKKworICAgICAgICByZXR1cm4gKHBGQ0IpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2dldF91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoZGV2LCBSV19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHApCit7CisgICAgICAgIHN0cnVjdCB0cl9zdGF0aXN0aWNzICp0c3RhdCA9ICZ0cC0+TWFjU3RhdDsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUciJXM6IHNtY3RyX2hhcmR3YXJlX3NlbmRfcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKHRwLT5zdGF0dXMgIT0gT1BFTikKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBpZih0cC0+bW9uaXRvcl9zdGF0ZV9yZWFkeSAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNlbmQgZmlyc3QgYnVmZmVyIGZyb20gcXVldWUgKi8KKyAgICAgICAgICAgICAgICBza2IgPSBza2JfZGVxdWV1ZSgmdHAtPlNlbmRTa2JRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYoc2tiID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICAgICAgICAgIHRwLT5RdWV1ZVNrYisrOworCisgICAgICAgICAgICAgICAgaWYoc2tiLT5sZW4gPCBTTUNfSEVBREVSX1NJWkUgfHwgc2tiLT5sZW4gPiB0cC0+bWF4X3BhY2tldF9zaXplKSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICAgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTk9OX01BQ19RVUVVRSwgc2tiLT5sZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbWN0cl90eF9tb3ZlX2ZyYW1lKGRldiwgc2tiLAorICAgICAgICAgICAgICAgICAgICAgICAgKF9fdTggKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyLCBza2ItPmxlbik7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopZmNiKTsKKworICAgICAgICAgICAgICAgIHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTk9OX01BQ19RVUVVRSk7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworCisgICAgICAgICAgICAgICAgdHN0YXQtPnR4X3BhY2tldHMrKzsKKworICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9hY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIEFDQmxvY2sgKmFjYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaW5pdF9hY2JzXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGFjYiAgICAgICAgICAgICAgICAgICAgID0gdHAtPmFjYl9oZWFkOworICAgICAgICBhY2ItPmNtZF9kb25lX3N0YXR1cyAgICA9IChBQ0JfQ09NTUFORF9ET05FIHwgQUNCX0NPTU1BTkRfU1VDQ0VTU0ZVTCk7CisgICAgICAgIGFjYi0+Y21kX2luZm8gICAgICAgICAgID0gQUNCX0NIQUlOX0VORDsKKyAgICAgICAgYWNiLT5jbWQgICAgICAgICAgICAgICAgPSAwOworICAgICAgICBhY2ItPnN1YmNtZCAgICAgICAgICAgICA9IDA7CisgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfbG8gICAgID0gMDsKKyAgICAgICAgYWNiLT5kYXRhX29mZnNldF9oaSAgICAgPSAwOworICAgICAgICBhY2ItPm5leHRfcHRyCisgICAgICAgICAgICAgICAgPSAoQUNCbG9jayAqKSgoKGNoYXIgKilhY2IpICsgc2l6ZW9mKEFDQmxvY2spKTsKKyAgICAgICAgYWNiLT50cmNfbmV4dF9wdHIgICAgICAgPSBUUkNfUE9JTlRFUihhY2ItPm5leHRfcHRyKTsKKworICAgICAgICBmb3IoaSA9IDE7IGkgPCB0cC0+bnVtX2FjYnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGFjYiAgICAgICAgICAgICA9IGFjYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgYWNiLT5jbWRfZG9uZV9zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgID0gKEFDQl9DT01NQU5EX0RPTkUgfCBBQ0JfQ09NTUFORF9TVUNDRVNTRlVMKTsKKyAgICAgICAgICAgICAgICBhY2ItPmNtZF9pbmZvID0gQUNCX0NIQUlOX0VORDsKKyAgICAgICAgICAgICAgICBhY2ItPmNtZCAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIGFjYi0+c3ViY21kICAgICA9IDA7CisgICAgICAgICAgICAgICAgYWNiLT5kYXRhX29mZnNldF9sbyA9IDA7CisgICAgICAgICAgICAgICAgYWNiLT5kYXRhX29mZnNldF9oaSA9IDA7CisgICAgICAgICAgICAgICAgYWNiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgPSAoQUNCbG9jayAqKSgoKGNoYXIgKilhY2IpICsgc2l6ZW9mKEFDQmxvY2spKTsKKyAgICAgICAgICAgICAgICBhY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGFjYi0+bmV4dF9wdHIpOworICAgICAgICB9CisKKyAgICAgICAgYWNiLT5uZXh0X3B0ciAgICAgICAgICAgPSB0cC0+YWNiX2hlYWQ7CisgICAgICAgIGFjYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPmFjYl9oZWFkKTsKKyAgICAgICAgdHAtPmFjYl9uZXh0ICAgICAgICAgICAgPSB0cC0+YWNiX2hlYWQtPm5leHRfcHRyOworICAgICAgICB0cC0+YWNiX2N1cnIgICAgICAgICAgICA9IHRwLT5hY2JfaGVhZC0+bmV4dF9wdHI7CisgICAgICAgIHRwLT5udW1fYWNic191c2VkICAgICAgID0gMDsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfYWRhcHRlclxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB0cC0+c3RhdHVzICAgICAgICAgICAgICA9IENMT1NFRDsKKyAgICAgICAgdHAtPnBhZ2Vfb2Zmc2V0X21hc2sgICAgPSAodHAtPnJhbV91c2FibGUgKiAxMDI0KSAtIDE7CisgICAgICAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnRwLT5TZW5kU2tiUXVldWUpOworICAgICAgICB0cC0+UXVldWVTa2IgPSBNQVhfVFhfUVVFVUU7CisKKyAgICAgICAgaWYoISh0cC0+Z3JvdXBfYWRkcmVzc18wICYgMHgwMDgwKSkKKyAgICAgICAgICAgICAgICB0cC0+Z3JvdXBfYWRkcmVzc18wIHw9IDB4MDBDMDsKKworICAgICAgICBpZighKHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NfMCAmIDB4MDBDMCkpCisgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc18wIHw9IDB4MDBDMDsKKworICAgICAgICB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzWzBdICY9IDB4RkY3RjsKKworICAgICAgICBpZih0cC0+YXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzID09IDApCisgICAgICAgICAgICAgICAgdHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3NlcyA9IDB4N0ZGRjsKKworICAgICAgICBpZih0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkgPT0gMCkKKyAgICAgICAgICAgICAgICB0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkgPSAweDA2OworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfYmljX2ludChkZXYpOworICAgICAgICBzbWN0cl9zZXRfdHJjX3Jlc2V0KGRldi0+YmFzZV9hZGRyKTsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZihzbWN0cl9jaGVja3N1bV9maXJtd2FyZShkZXYpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBQcmV2aW91c2x5IGxvYWRlZCBmaXJtd2FyZSBpcyBtaXNzaW5nXG4iLGRldi0+bmFtZSk7ICAgICAgICAgICAgICAgIHJldHVybiAoLUVOT0VOVCk7CisgICAgICAgIH0KKworICAgICAgICBpZigoZXJyID0gc21jdHJfcmFtX21lbW9yeV90ZXN0KGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBSQU0gbWVtb3J5IHRlc3QgZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC1FSU8pOworICAgICAgICB9CisKKwlzbWN0cl9zZXRfcnhfbG9va19haGVhZChkZXYpOworICAgICAgICBzbWN0cl9sb2FkX25vZGVfYWRkcihkZXYpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgYWRhcHRlciBmb3IgSW50ZXJuYWwgU2VsZiBUZXN0LiAqLworICAgICAgICBzbWN0cl9yZXNldF9hZGFwdGVyKGRldik7CisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pbml0X2NhcmRfcmVhbChkZXYpKSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogSW5pdGlhbGl6YXRpb24gb2YgY2FyZCBmYWlsZWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC1FSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhpcyByb3V0aW5lIGNsb2JiZXJzIHRoZSBUUkMncyBpbnRlcm5hbCByZWdpc3RlcnMuICovCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pbnRlcm5hbF9zZWxmX3Rlc3QoZGV2KSkpCisJeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IENhcmQgZmFpbGVkIGludGVybmFsIHNlbGYgdGVzdCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiAoLUVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZS1Jbml0aWFsaXplIGFkYXB0ZXIncyBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKyAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICBpZigoZXJyID0gc21jdHJfaW5pdF9jYXJkX3JlYWwoZGV2KSkpCisJeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEluaXRpYWxpemF0aW9uIG9mIGNhcmQgZmFpbGVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHNtY3RyX2VuYWJsZV9iaWNfaW50KGRldik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX2VuYWJsZV9pbnRfY21kKGRldiwgVFJDX0lOVEVSUlVQVF9FTkFCTEVfTUFTSykpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X2NhcmRfcmVhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9pbml0X2NhcmRfcmVhbFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB0cC0+c2hfbWVtX3VzZWQgPSAwOworICAgICAgICB0cC0+bnVtX2FjYnMgICAgPSBOVU1fT0ZfQUNCUzsKKworICAgICAgICAvKiBSYW5nZSBDaGVjayBNYXggUGFja2V0IFNpemUgKi8KKyAgICAgICAgaWYodHAtPm1heF9wYWNrZXRfc2l6ZSA8IDI1NikKKyAgICAgICAgICAgICAgICB0cC0+bWF4X3BhY2tldF9zaXplID0gMjU2OworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+bWF4X3BhY2tldF9zaXplID4gTk9OX01BQ19UWF9CVUZGRVJfTUVNT1JZKQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1heF9wYWNrZXRfc2l6ZSA9IE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIHRwLT5udW1fb2ZfdHhfYnVmZnMgPSAoTk9OX01BQ19UWF9CVUZGRVJfTUVNT1JZCisgICAgICAgICAgICAgICAgLyB0cC0+bWF4X3BhY2tldF9zaXplKSAtIDE7CisKKyAgICAgICAgaWYodHAtPm51bV9vZl90eF9idWZmcyA+IE5VTV9OT05fTUFDX1RYX0ZDQlMpCisgICAgICAgICAgICAgICAgdHAtPm51bV9vZl90eF9idWZmcyA9IE5VTV9OT05fTUFDX1RYX0ZDQlM7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHRwLT5udW1fb2ZfdHhfYnVmZnMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5udW1fb2ZfdHhfYnVmZnMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogVHggcXVldWUgY29uc3RhbnRzICovCisgICAgICAgIHRwLT5udW1fdHhfZmNicyAgICAgICAgW0JVR19RVUVVRV0gICAgID0gTlVNX0JVR19UWF9GQ0JTOworICAgICAgICB0cC0+bnVtX3R4X2JkYnMgICAgICAgIFtCVUdfUVVFVUVdICAgICA9IE5VTV9CVUdfVFhfQkRCUzsKKyAgICAgICAgdHAtPnR4X2J1ZmZfc2l6ZSAgICAgICBbQlVHX1FVRVVFXSAgICAgPSBCVUdfVFhfQlVGRkVSX01FTU9SWTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfdXNlZCAgICAgICBbQlVHX1FVRVVFXSAgICAgPSAwOworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzICAgIFtCVUdfUVVFVUVdICAgICA9IE5PVF9UUkFOU01JVElORzsKKworICAgICAgICB0cC0+bnVtX3R4X2ZjYnMgICAgICAgIFtNQUNfUVVFVUVdICAgICA9IE5VTV9NQUNfVFhfRkNCUzsKKyAgICAgICAgdHAtPm51bV90eF9iZGJzICAgICAgICBbTUFDX1FVRVVFXSAgICAgPSBOVU1fTUFDX1RYX0JEQlM7CisgICAgICAgIHRwLT50eF9idWZmX3NpemUgICAgICAgW01BQ19RVUVVRV0gICAgID0gTUFDX1RYX0JVRkZFUl9NRU1PUlk7CisgICAgICAgIHRwLT50eF9idWZmX3VzZWQgICAgICAgW01BQ19RVUVVRV0gICAgID0gMDsKKyAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1cyAgICBbTUFDX1FVRVVFXSAgICAgPSBOT1RfVFJBTlNNSVRJTkc7CisKKyAgICAgICAgdHAtPm51bV90eF9mY2JzICAgICAgICBbTk9OX01BQ19RVUVVRV0gPSBOVU1fTk9OX01BQ19UWF9GQ0JTOworICAgICAgICB0cC0+bnVtX3R4X2JkYnMgICAgICAgIFtOT05fTUFDX1FVRVVFXSA9IE5VTV9OT05fTUFDX1RYX0JEQlM7CisgICAgICAgIHRwLT50eF9idWZmX3NpemUgICAgICAgW05PTl9NQUNfUVVFVUVdID0gTk9OX01BQ19UWF9CVUZGRVJfTUVNT1JZOworICAgICAgICB0cC0+dHhfYnVmZl91c2VkICAgICAgIFtOT05fTUFDX1FVRVVFXSA9IDA7CisgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXMgICAgW05PTl9NQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworCisgICAgICAgIC8qIFJlY2VpdmUgUXVldWUgQ29uc3RhbnRzICovCisgICAgICAgIHRwLT5udW1fcnhfZmNic1tNQUNfUVVFVUVdID0gTlVNX01BQ19SWF9GQ0JTOworICAgICAgICB0cC0+bnVtX3J4X2JkYnNbTUFDX1FVRVVFXSA9IE5VTV9NQUNfUlhfQkRCUzsKKworICAgICAgICBpZih0cC0+ZXh0cmFfaW5mbyAmIENISVBfUkVWX01BU0spCisgICAgICAgICAgICAgICAgdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdID0gNzg7ICAgIC8qIDgyNSBSZXYuIFhFICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+bnVtX3J4X2ZjYnNbTk9OX01BQ19RVUVVRV0gPSA3OyAgICAgLyogODI1IFJldi4gWEQgKi8KKworICAgICAgICB0cC0+bnVtX3J4X2JkYnNbTk9OX01BQ19RVUVVRV0gPSBzbWN0cl9nZXRfbnVtX3J4X2JkYnMoZGV2KTsKKworICAgICAgICBzbWN0cl9hbGxvY19zaGFyZWRfbWVtb3J5KGRldik7CisgICAgICAgIHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeShkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9pbml0X3RpbWVyc19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9pbml0X3R4cnhfY21kKGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBIYXJkd2FyZSBmYWlsdXJlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9yeF9iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgICAgIEJEQmxvY2sgKmJkYjsKKyAgICAgICAgX191MTYgKmJ1ZjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaW5pdF9yeF9iZGJzXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9SWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZGIgPSB0cC0+cnhfYmRiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYnVmID0gdHAtPnJ4X2J1ZmZfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBiZGItPmluZm8gPSAoQkRCX0NIQUlOX0VORCB8IEJEQl9OT19XQVJOSU5HKTsKKyAgICAgICAgICAgICAgICBiZGItPmJ1ZmZlcl9sZW5ndGggPSBSWF9EQVRBX0JVRkZFUl9TSVpFOworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgPSAoQkRCbG9jayAqKSgoKGNoYXIgKiliZGIpICsgc2l6ZW9mKEJEQmxvY2spKTsKKyAgICAgICAgICAgICAgICBiZGItPmRhdGFfYmxvY2tfcHRyID0gYnVmOworICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoYmRiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICBpZihpID09IE5PTl9NQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFJYX0JVRkZfVFJDX1BPSU5URVIoYnVmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFRSQ19QT0lOVEVSKGJ1Zik7CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCB0cC0+bnVtX3J4X2JkYnNbaV07IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyLT5iYWNrX3B0ciA9IGJkYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYiA9IGJkYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSAoX191MTYgKikoKGNoYXIgKilidWYgKyBSWF9EQVRBX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+aW5mbyA9IChCREJfTk9UX0NIQUlOX0VORCB8IEJEQl9OT19XQVJOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+YnVmZmVyX2xlbmd0aCA9IFJYX0RBVEFfQlVGRkVSX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyID0gKEJEQmxvY2sgKikoKChjaGFyICopYmRiKSArIHNpemVvZihCREJsb2NrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmRhdGFfYmxvY2tfcHRyID0gYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihiZGItPm5leHRfcHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFJYX0JVRkZfVFJDX1BPSU5URVIoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBUUkNfUE9JTlRFUihidWYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgICAgICAgICAgID0gdHAtPnJ4X2JkYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPnJ4X2JkYl9oZWFkW2ldKTsKKworICAgICAgICAgICAgICAgIHRwLT5yeF9iZGJfaGVhZFtpXS0+YmFja19wdHIgICAgPSBiZGI7CisgICAgICAgICAgICAgICAgdHAtPnJ4X2JkYl9jdXJyW2ldICAgICAgICAgICAgICA9IHRwLT5yeF9iZGJfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfcnhfZmNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1JYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGZjYiAgICAgICAgICAgICAgID0gdHAtPnJ4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgZmNiLT5pbmZvICAgICAgICAgPSBGQ0JfQ0hBSU5fRU5EOworICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIgICAgID0gKEZDQmxvY2sgKikoKChjaGFyKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKyAgICAgICAgICAgICAgICBpZihpID09IE5PTl9NQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFJYX0ZDQl9UUkNfUE9JTlRFUihmY2ItPm5leHRfcHRyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV9yeF9mY2JzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBmY2I7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2IgICAgICAgICAgICAgICAgICAgICA9IGZjYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmluZm8gICAgICAgICAgICAgICA9IEZDQl9XQVJOSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChGQ0Jsb2NrICopKCgoY2hhciAqKWZjYikgKyBzaXplb2YoRkNCbG9jaykpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihpID09IE5PTl9NQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSWF9GQ0JfVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBUUkNfUE9JTlRFUihmY2ItPm5leHRfcHRyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyID0gdHAtPnJ4X2ZjYl9oZWFkW2ldOworCisgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBSWF9GQ0JfVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihmY2ItPm5leHRfcHRyKTsKKworICAgICAgICAgICAgICAgIHRwLT5yeF9mY2JfaGVhZFtpXS0+YmFja19wdHIgICAgPSBmY2I7CisgICAgICAgICAgICAgICAgdHAtPnJ4X2ZjYl9jdXJyW2ldICAgICAgICAgICAgICA9IHRwLT5yeF9mY2JfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9zaGFyZWRfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIF9fdTMyICppc2NwYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaW5pdF9zaGFyZWRfbWVtb3J5XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKikodW5zaWduZWQgaW50KXRwLT5pc2NwYl9wdHIpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgSW5pdGlhbCBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludC4gKElTQ1ApICovCisgICAgICAgIGlzY3BiID0gKF9fdTMyICopUEFHRV9QT0lOVEVSKCZ0cC0+aXNjcGJfcHRyLT50cmNfc2NnYl9wdHIpOworICAgICAgICAqaXNjcGIgPSAoX191MzIpKFNXQVBfV09SRFMoVFJDX1BPSU5URVIodHAtPnNjZ2JfcHRyKSkpOworCisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVycy4gKFNDUCkgKi8KKyAgICAgICAgdHAtPnNjZ2JfcHRyLT5jb25maWcgPSAoU0NHQl9BRERSRVNTX1BPSU5URVJfRk9STUFUCisgICAgICAgICAgICAgICAgfCBTQ0dCX01VTFRJX1dPUkRfQ09OVFJPTCB8IFNDR0JfREFUQV9GT1JNQVQKKyAgICAgICAgICAgICAgICB8IFNDR0JfQlVSU1RfTEVOR1RIKTsKKworICAgICAgICB0cC0+c2NnYl9wdHItPnRyY19zY2xiX3B0ciAgICAgID0gVFJDX1BPSU5URVIodHAtPnNjbGJfcHRyKTsKKyAgICAgICAgdHAtPnNjZ2JfcHRyLT50cmNfYWNiX3B0ciAgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5hY2JfaGVhZCk7CisgICAgICAgIHRwLT5zY2diX3B0ci0+dHJjX2lzYl9wdHIgICAgICAgPSBUUkNfUE9JTlRFUih0cC0+aXNiX3B0cik7CisgICAgICAgIHRwLT5zY2diX3B0ci0+aXNic2l6ICAgICAgICAgICAgPSAoc2l6ZW9mKElTQmxvY2spKSAtIDI7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBTeXN0ZW0gQ29udHJvbCBCbG9jay4gKFNDQikgKi8KKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kICAgID0gU0NMQl9WQUxJRCB8IFNDTEJfQ01EX05PUDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pYWNrX2NvZGUgICAgICAgID0gMDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCAgID0gMDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pbnRfbWFza19jb250cm9sID0gMDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pbnRfbWFza19zdGF0ZSAgID0gMDsKKworICAgICAgICAvKiBJbml0aWFsaXplIEludGVycnVwdCBTdGF0dXMgQmxvY2suIChJU0IpICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9PRl9JTlRFUlJVUFRTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cC0+aXNiX3B0ci0+SVN0YXR1c1tpXS5JVHlwZSA9IDB4ZjA7CisgICAgICAgICAgICAgICAgdHAtPmlzYl9wdHItPklTdGF0dXNbaV0uSVN1YnR5cGUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgdHAtPmN1cnJlbnRfaXNiX2luZGV4ID0gMDsKKworICAgICAgICAvKiBJbml0aWFsaXplIEFjdGlvbiBDb21tYW5kIEJsb2NrLiAoQUNCKSAqLworICAgICAgICBzbWN0cl9pbml0X2FjYnMoZGV2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRyYW5zbWl0IEZDQidzIGFuZCBCREIncy4gKi8KKyAgICAgICAgc21jdHJfbGlua190eF9mY2JzX3RvX2JkYnMoZGV2KTsKKyAgICAgICAgc21jdHJfaW5pdF90eF9iZGJzKGRldik7CisgICAgICAgIHNtY3RyX2luaXRfdHhfZmNicyhkZXYpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgcmVjZWl2ZSBGQ0IncyBhbmQgQkRCJ3MuICovCisgICAgICAgIHNtY3RyX2luaXRfcnhfYmRicyhkZXYpOworICAgICAgICBzbWN0cl9pbml0X3J4X2ZjYnMoZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfdHhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBCREJsb2NrICpiZGI7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1RYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGJkYiA9IHRwLT50eF9iZGJfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBiZGItPmluZm8gPSAoQkRCX05PVF9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ciA9IChCREJsb2NrICopKCgoY2hhciAqKWJkYikgKyBzaXplb2YoQkRCbG9jaykpOworICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoYmRiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCB0cC0+bnVtX3R4X2JkYnNbaV07IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyLT5iYWNrX3B0ciA9IGJkYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYiA9IGJkYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmluZm8gPSAoQkRCX05PVF9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKEJEQmxvY2sgKikoKChjaGFyICopYmRiKSArIHNpemVvZiggQkRCbG9jaykpOyAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoYmRiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ciA9IHRwLT50eF9iZGJfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKHRwLT50eF9iZGJfaGVhZFtpXSk7CisgICAgICAgICAgICAgICAgdHAtPnR4X2JkYl9oZWFkW2ldLT5iYWNrX3B0ciA9IGJkYjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF90eF9mY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fVFhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNiICAgICAgICAgICAgICAgPSB0cC0+dHhfZmNiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBmY2ItPmluZm8gICAgICAgICA9IEZDQl9DSEFJTl9FTkQ7CisgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ciA9IChGQ0Jsb2NrICopKCgoY2hhciAqKWZjYikgKyBzaXplb2YoRkNCbG9jaykpOworICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCB0cC0+bnVtX3R4X2ZjYnNbaV07IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyLT5iYWNrX3B0ciA9IGZjYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYiAgICAgICAgICAgICAgICAgICAgID0gZmNiLT5uZXh0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfc3RhdHVzICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+aW5mbyAgICAgICAgICAgICAgID0gRkNCX0NIQUlOX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoRkNCbG9jayAqKSgoKGNoYXIgKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ciAgICAgICAgICAgPSB0cC0+dHhfZmNiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgICAgICAgPSBUUkNfUE9JTlRFUih0cC0+dHhfZmNiX2hlYWRbaV0pOworCisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9oZWFkW2ldLT5iYWNrX3B0ciAgICA9IGZjYjsKKyAgICAgICAgICAgICAgICB0cC0+dHhfZmNiX2VuZFtpXSAgICAgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldLT5uZXh0X3B0cjsKKyAgICAgICAgICAgICAgICB0cC0+dHhfZmNiX2N1cnJbaV0gICAgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldLT5uZXh0X3B0cjsKKyAgICAgICAgICAgICAgICB0cC0+bnVtX3R4X2ZjYnNfdXNlZFtpXSAgICAgICAgID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW50ZXJuYWxfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfdGVzdF9pbnRlcm5hbF9yb21fY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICYgMHhmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfdGVzdF9oaWNfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICYgMHhmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfdGVzdF9tYWNfcmVnX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6IEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHNtY3RyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKyAgICAgICAgaW50IGlvYWRkcjsKKyAgICAgICAgX191MTYgaW50ZXJydXB0X3VubWFza19iaXRzID0gMCwgaW50ZXJydXB0X2Fja19jb2RlID0gMHhmZjAwOworICAgICAgICBfX3UxNiBlcnIxLCBlcnIgPSBOT1RfTVlfSU5URVJSVVBUOworICAgICAgICBfX3U4IGlzYl90eXBlLCBpc2Jfc3VidHlwZTsKKyAgICAgICAgX191MTYgaXNiX2luZGV4OworCisgICAgICAgIGlmKGRldiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBkZXYtPm5hbWUsIGlycSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9OT05FOworICAgICAgICB9CisKKyAgICAgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIHRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgCisKKyAgICAgICAgaWYodHAtPnN0YXR1cyA9PSBOT1RfSU5JVElBTElaRUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9OT05FOworCisgICAgICAgIHNwaW5fbG9jaygmdHAtPmxvY2spOworICAgICAgICAKKyAgICAgICAgc21jdHJfZGlzYWJsZV9iaWNfaW50KGRldik7CisgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHNtY3RyX2NsZWFyX2ludChkZXYpOworCisgICAgICAgIC8qIEZpcnN0IHJlYWQgdGhlIExTQiAqLworICAgICAgICB3aGlsZSgodHAtPmlzYl9wdHItPklTdGF0dXNbdHAtPmN1cnJlbnRfaXNiX2luZGV4XS5JVHlwZSAmIDB4ZjApID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc2JfaW5kZXggICAgICAgPSB0cC0+Y3VycmVudF9pc2JfaW5kZXg7CisgICAgICAgICAgICAgICAgaXNiX3R5cGUgICAgICAgID0gdHAtPmlzYl9wdHItPklTdGF0dXNbaXNiX2luZGV4XS5JVHlwZTsKKyAgICAgICAgICAgICAgICBpc2Jfc3VidHlwZSAgICAgPSB0cC0+aXNiX3B0ci0+SVN0YXR1c1tpc2JfaW5kZXhdLklTdWJ0eXBlOworCisgICAgICAgICAgICAgICAgKHRwLT5jdXJyZW50X2lzYl9pbmRleCkrKzsKKyAgICAgICAgICAgICAgICBpZih0cC0+Y3VycmVudF9pc2JfaW5kZXggPT0gTlVNX09GX0lOVEVSUlVQVFMpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9pc2JfaW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgaWYoaXNiX3R5cGUgPj0gMHgxMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisJCSAgICAgICAgc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlcnIgPSBIQVJEV0FSRV9GQUlMRUQ7CisgICAgICAgICAgICAgICAgaW50ZXJydXB0X2Fja19jb2RlID0gaXNiX2luZGV4OworICAgICAgICAgICAgICAgIHRwLT5pc2JfcHRyLT5JU3RhdHVzW2lzYl9pbmRleF0uSVR5cGUgfD0gMHhmMDsKKworICAgICAgICAgICAgICAgIGludGVycnVwdF91bm1hc2tfYml0cyB8PSAoMSA8PCAoX191MTYpaXNiX3R5cGUpOworCisgICAgICAgICAgICAgICAgc3dpdGNoKGlzYl90eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfVFlQRV8zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGlzYl9zdWJ0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19NT05JVE9SX0ZTTV9JTkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1JFUEVBVF9CRUFDT05fU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfUkVQRUFUX0NMQUlNX1RPS0VOX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1RSQU5TTUlUX0NMQUlNX1RPS0VOX1NUQVRFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19TVEFOREJZX01PTklUT1JfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfVFJBTlNNSVRfQkVBQ09OX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX0FDVElWRV9NT05JVE9SX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1RSQU5TTUlUX1JJTkdfUFVSR0VfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODogICAvKiBkaWFnbm9zdGljIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfQkVBQ09OX1RFU1RfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzbWN0cl9sb2JlX21lZGlhX3Rlc3QoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJpbmdfc3RhdHVzX2ZsYWdzID0gUklOR19TVEFUVVNfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJpbmdfc3RhdHVzID0gQVVUT19SRU1PVkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9yaW5nX3N0YXR1c19jaGcoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfYnlwYXNzX3N0YXRlKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2lzc3VlX2luc2VydF9jbWQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FzZSAweDBhLTB4ZmYsIGlsbGVnYWwgc3RhdGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJpbmdfc3RhdHVzX2ZsYWdzID0gTU9OSVRPUl9TVEFURV9DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9yaW5nX3N0YXR1c19jaGcoZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwMiAtIE1BQyBFcnJvciBDb3VudGVycyBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE9uZSBvciBtb3JlIE1BQyBFcnJvciBDb3VudGVyIGlzIGhhbGYgZnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBNQUMgRXJyb3IgQ291bnRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgTG9zdF9GUl9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIFJDVl9Db25nZXN0aW9uX0NvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgRlJfY29waWVkX0Vycm9yX0NvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgRlJFUV9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIFRva2VuX0Vycm9yX0NvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgTGluZV9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIEludGVybmFsX0Vycm9yX0NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfRVJST1JfQ09VTlRFUlM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgODAyLjUgRXJyb3IgQ291bnRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfaXNzdWVfcmVhZF9yaW5nX3N0YXR1c19jbWQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwNCAtIE1BQyBUeXBlIDIgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBIT1NUIG5lZWRzIHRvIGVucXVldWUgTUFDIEZyYW1lIGZvciB0cmFuc21pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN1YlR5cGUgQml0IDE1IC0gUlFfSU5JVF9QRFUoIFJlcXVlc3QgSW5pdGlhbGl6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICogQ2hhbmdlZCBmcm9tIFJRX0lOSVRfUERVIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBUUkNfU3RhdHVzX0NoYW5nZWRfSW5kaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX01BQ19UWVBFXzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwNSAtIFRYIEZyYW1lIEludGVycnVwdCAoRkkpLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX1RYX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVUcgUVVFVUUgZm9yIFRSQyBzdHVjayByZWNlaXZlIEJVRyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRYX1BFTkRJTkdfUFJJT1JJVFlfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIEJVR19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PTi1NQUMgZnJhbWVzIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUWF9QRU5ESU5HX1BSSU9SSVRZXzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDIGZyYW1lcyBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgTUFDX1FVRVVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDYgLSBUWCBFTkQgT0YgUVVFVUUgKEZFKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX0VORF9PRl9UWF9RVUVVRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlVHIHF1ZXVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2sgdG8gY2xlYXIgUmVjZWl2ZSBGSUZPIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbWFzayBzZW5kX0JVRyBub3cgY29tcGxldGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF91bm1hc2tfYml0cyB8PSAweDgwMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXNbQlVHX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBCVUdfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW4oZGV2LCBCVUdfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04tTUFDIHF1ZXVlIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUWF9QRU5ESU5HX1BSSU9SSVRZXzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW05PTl9NQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIE5PTl9NQUNfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW4oZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFDIHF1ZXVlIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUWF9QRU5ESU5HX1BSSU9SSVRZXzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcmVzdGFydF90eF9jaGFpbihkZXYsIE1BQ19RVUVVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwNyAtIE5PTi1NQUMgUlggUmVzb3VyY2UgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDEyIC0gKEJXKSBCREIgd2FybmluZworICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMyAtIChGVykgRkNCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTQgLSAoQkUpIEJEQiBFbmQgb2YgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTUgLSAoRkUpIEZDQiBFbmQgb2YgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX05PTl9NQUNfUlhfUkVTT1VSQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9maWZvX292ZXJydW5fY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cmVjZWl2ZV9xdWV1ZV9udW1iZXIgPSBOT05fTUFDX1FVRVVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIxID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE5PTl9NQUNfUlhfUkVTT1VSQ0VfRkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfZmNiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgTk9OX01BQ19SWF9SRVNPVVJDRV9CRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYsIE5PTl9NQUNfUVVFVUUpKSAhPSBTVUNDRVNTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnB0cl9yeF9iZGJfb3ZlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnRwLT5wdHJfcnhfYmRiX292ZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVycjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDggLSBNQUMgUlggUmVzb3VyY2UgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDEyIC0gKEJXKSBCREIgd2FybmluZworICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMyAtIChGVykgRkNCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTQgLSAoQkUpIEJEQiBFbmQgb2YgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTUgLSAoRkUpIEZDQiBFbmQgb2YgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX01BQ19SWF9SRVNPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTUFDX1FVRVVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIxID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE1BQ19SWF9SRVNPVVJDRV9GRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfZmNiX2NtZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYsIE1BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfZmNiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgTUFDX1JYX1JFU09VUkNFX0JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldiwgTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnB0cl9yeF9iZGJfb3ZlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnRwLT5wdHJfcnhfYmRiX292ZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVycjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDkgLSBOT05fTUFDIFJYIEZyYW1lIEludGVycnVwdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX05PTl9NQUNfUlhfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9maWZvX292ZXJydW5fY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cmVjZWl2ZV9xdWV1ZV9udW1iZXIgPSBOT05fTUFDX1FVRVVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9yeF9mcmFtZShkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDBBIC0gTUFDIFJYIEZyYW1lIEludGVycnVwdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX01BQ19SWF9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTUFDX1FVRVVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9yeF9mcmFtZShkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDBCIC0gVFJDIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICogVFJDIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1YnR5cGUgYml0IDE0IC0gdHJhbnNtaXQgRklGTyB1bmRlcnJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICogc3VidHlwZSBiaXQgMTUgLSByZWNlaXZlIEZJRk8gb3ZlcnJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfVFJDX0ZJRk9fU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRSQ19GSUZPX1NUQVRVU19UWF9VTkRFUlJVTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfdHhfZmlmb191bmRlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnRwLT5wdHJfdHhfZmlmb191bmRlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRSQ19GSUZPX1NUQVRVU19SWF9PVkVSUlVOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIG92ZXJydW4gc3R1Y2sgcmVjZWl2ZSBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgPj0gMywgaGFzIHRvIGNsZWFyIGl0IGJ5IHNlbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYWNrIHRvIGJhY2sgZnJhbWVzLiBXZSBwaWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogREFUKGR1cGxpY2F0ZSBhZGRyZXNzIE1BQyBmcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50ID49IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbGF5IGNsZWFyaW5nIGZpZm8gb3ZlcnJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1hc2sgdGlsbCBzZW5kX0JVRyB0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcGxldGUgcG9zdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF91bm1hc2tfYml0cyAmPSAofjB4ODAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIkpheSBwbGVhc2Ugc2VuZCBidWdcbiIpOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3NlbmRfYnVnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnB0cl9yeF9maWZvX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2ZpZm9fb3ZlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBTVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDBDIC0gQWN0aW9uIENvbW1hbmQgU3RhdHVzIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogU3VidHlwZSBiaXQgMTQgLSBDQiBlbmQgb2YgY29tbWFuZCBjaGFpbiAoQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJ0eXBlIGJpdCAxNSAtIENCIGNvbW1hbmQgaW50ZXJydXB0IChDSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX0NPTU1BTkRfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBTVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZCA9PSBBQ0JfQ01EX0hJQ19OT1ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImkxXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFhYWFhYWFhYWFhYWFhYWCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIGVyciA9IFVNX0ludGVycnVwdChkZXYpOyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRwLT5hY2JfaGVhZC0+Y21kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBQ0JfQ01EX1JFQURfVFJDX1NUQVRVUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICh0cC0+YWNiX2hlYWQtPnN1YmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gUldfVFJDX1NUQVRVU19CTE9DSykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnB0cl9iY25fdHlwZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHRwLT5wdHJfYmNuX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoX191MzIpKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5CQ05fVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgRVJST1JfQ09VTlRFUlNfQ0hBTkdFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfdXBkYXRlX2Vycl9zdGF0cyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKFNCbG9jayAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlN0YXR1c19DSEdfSW5kaWNhdGUgJiBUSV9ORElTX1JJTkdfU1RBVFVTX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKChTQmxvY2sqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlRJX05ESVNfUmluZ19TdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcmluZ19zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigodHAtPnJpbmdfc3RhdHVzICYgUkVNT1ZFX1JFQ0VJVkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICh0cC0+Y29uZmlnX3dvcmQwICYgTk9fQVVUT1JFTU9WRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9pc3N1ZV9yZW1vdmVfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5hY2JfcGVuZGluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgVU5BX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfdW5hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnB0cl91bmFbMF0gPSBTV0FQX0JZVEVTKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+VU5BWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cHRyX3VuYVsxXSA9IFNXQVBfQllURVMoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5VTkFbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5wdHJfdW5hWzJdID0gU1dBUF9CWVRFUygoKFNCbG9jayAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlVOQVsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKFNCbG9jayAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlN0YXR1c19DSEdfSW5kaWNhdGUgJiBSRUFEWV9UT19TRU5EX1JRX0lOSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9zZW5kX3JxX2luaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+YWNiX3BlbmRpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDBEIC0gTUFDIFR5cGUgMSBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN1YnR5cGUgLS0gMDAgRlJfQkNOIHJlY2VpdmVkIGF0IFMxMgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwMSBGUl9CQ04gcmVjZWl2ZWQgYXQgUzIxCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDAyIEZSX0RBVChEQT1NQSwgQTw+MCkgcmVjZWl2ZWQgYXQgUzIxCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDAzIFRTTV9FWFAgYXQgUzIxCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDA0IEZSX1JFTU9WRSByZWNlaXZlZCBhdCBTNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgMDUgVEJSX0VYUCwgQlJfRkxBR19TRVQgYXQgUzQyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDA2IFRCVF9FWFAgYXQgUzUzCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfVFlQRV8xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSA+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBIQVJEV0FSRV9GQUlMRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBTVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaXNiX3N1YnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0JZUEFTU19TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5zdGF0dXMgIT0gQ0xPU0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfTE9CRV9URVNUX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0RFVEVDVF9NT05JVE9SX1BSRVNFTlRfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfQVdBSVRfTkVXX01PTklUT1JfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfRFVQTElDQVRFX0FERFJFU1NfVEVTVF9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19ORUlHSEJPUl9OT1RJRklDQVRJT05fU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfUkVRVUVTVF9JTklUSUFMSVpBVElPTl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19KT0lOX0NPTVBMRVRFX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IE9QRU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfQllQQVNTX1dBSVRfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwRSAtIFRSQyBJbml0aWFsaXphdGlvbiBTZXF1ZW5jZSBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN1YnR5cGUgLS0gMDAtRkYgSW5pdGlhbGl6YXRpbiBzZXF1ZW5jZSBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfVFJDX0lOVFJOTF9UU1RfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyIGludGVycnVwdCB0eXBlcywgaWxsZWdhbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoZXJyICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNraW5nIHRoZSBhY2sgY29kZSBpbnN0ZWFkIG9mIHRoZSB1bm1hc2sgYml0cyBoZXJlIGlzIGJlY2F1c2UgOgorICAgICAgICAgKiB3aGlsZSBmaXhpbmcgdGhlIHN0dWNrIHJlY2VpdmUsIERBVCBmcmFtZSBhcmUgc2VudCBhbmQgbWFzayBvZmYKKyAgICAgICAgICogRklGTyBvdmVycnVuIGludGVycnVwdCB0ZW1wb3JhcmlseSAoaW50ZXJydXB0X3VubWFza19iaXRzID0gMCkKKyAgICAgICAgICogYnV0IHdlIHN0aWxsIHdhbnQgdG8gaXNzdWUgYWNrIHRvIElTQgorICAgICAgICAgKi8KKyAgICAgICAgaWYoIShpbnRlcnJ1cHRfYWNrX2NvZGUgJiAweGZmMDApKQorICAgICAgICAgICAgICAgIHNtY3RyX2lzc3VlX2ludF9hY2soZGV2LCBpbnRlcnJ1cHRfYWNrX2NvZGUsIGludGVycnVwdF91bm1hc2tfYml0cyk7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworICAgICAgICBzbWN0cl9lbmFibGVfYmljX2ludChkZXYpOworICAgICAgICBzcGluX3VubG9jaygmdHAtPmxvY2spOworCisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBpbnRlcnJ1cHRfZW5hYmxlX21hc2spCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pbnRfbWFza19jb250cm9sICA9IGludGVycnVwdF9lbmFibGVfbWFzazsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kICAgICA9IFNDTEJfVkFMSUQgfCBTQ0xCX0NNRF9DTEVBUl9JTlRFUlJVUFRfTUFTSzsKKworICAgICAgICBzbWN0cl9zZXRfY3RybF9hdHRlbnRpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2ludF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgaWFja19jb2RlLCBfX3UxNiBpYml0cykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICB0cC0+c2NsYl9wdHItPmludF9tYXNrX2NvbnRyb2wgPSBpYml0czsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pYWNrX2NvZGUgPSBpYWNrX2NvZGUgPDwgMTsgLyogdXNlIHRoZSBvZmZzZXQgZnJvbSBiYXNlICovICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gMDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kID0gU0NMQl9WQUxJRCB8IFNDTEJfSUFDS19DT0RFX1ZBTElEIHwgU0NMQl9DTURfQ0xFQVJfSU5URVJSVVBUX01BU0s7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbml0X3RpbWVyc19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgX191MTYgKnBUaW1lcl9TdHJ1YyA9IChfX3UxNiAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+Y29uZmlnX3dvcmQwID0gVEhEUkVOIHwgRE1BX1RSSUdHRVIgfCBVU0VUUFQgfCBOT19BVVRPUkVNT1ZFOworICAgICAgICB0cC0+Y29uZmlnX3dvcmQxID0gMDsKKworICAgICAgICBpZigodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzE2KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9VVFBfMTYpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF8xNl9VVFBfMTYpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBGUkVRXzE2TUJfQklUOworICAgICAgICB9CisKKyAgICAgICAgaWYodHAtPm1vZGVfYml0cyAmIEVBUkxZX1RPS0VOX1JFTCkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IEVUUkVOOworCisgICAgICAgIGlmKHRwLT5tb2RlX2JpdHMgJiBMT09QSU5HX01PREVfTUFTSykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYX09XTl9CSVQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWF9PV05fQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBQUk9NSVNDVU9VU19NT0RFKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gUFJPTUlTQ1VPVVNfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UFJPTUlTQ1VPVVNfQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfRVJSX1BBQ0tFVFMpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBTQVZCQURfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+U0FWQkFEX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0FUVF9NQUNfRlJBTUVTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gUlhBVE1BQzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflJYQVRNQUM7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9NVUxUSV9QUk9NKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gTVVMVElDQVNUX0FERFJFU1NfQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSAmPSB+TVVMVElDQVNUX0FERFJFU1NfQklUOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfU09VUkNFX1JPVVRJTkdfU1BBTk5JTkcpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBTT1VSQ0VfUk9VVElOR19TUEFOTklOR19CSVRTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBTT1VSQ0VfUk9VVElOR19FWFBMT1JFUl9CSVQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSAmPSB+U09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfMTYpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1VUUF8xNikKKyAgICAgICAgICAgICAgICB8fCAodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzE2X1VUUF8xNikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQxIHw9IElOVEVSRlJBTUVfU1BBQ0lOR18xNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBJTlRFUkZSQU1FX1NQQUNJTkdfNDsKKworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Y29uZmlnX3dvcmQwOworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Y29uZmlnX3dvcmQxOworCisgICAgICAgIGlmKCh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfNCkKKyAgICAgICAgICAgICAgICB8fCAodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfVVRQXzQpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF80X1VUUF80KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDBGQTsgICAgICAgLyogcHJlc2NhbGUgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDI3MTA7ICAgICAgIC8qIFRQVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MjcxMDsgICAgICAgLyogVFFQX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwQTI4OyAgICAgICAvKiBUTlRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDNFODA7ICAgICAgIC8qIFRCVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4M0E5ODsgICAgICAgLyogVFNNX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxQjU4OyAgICAgICAvKiBUQU1fbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwQzg7ICAgICAgIC8qIFRCUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDdEMDsgICAgICAgLyogVEVSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMDBBOyAgICAgICAvKiBUR1RfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDExNjI7ICAgICAgIC8qIFRIVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDdEMDsgICAgICAgLyogVFJSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxMzg4OyAgICAgICAvKiBUVlhfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwMDA7ICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwM0U4OyAgICAgICAvKiBwcmVzY2FsZSAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4OUM0MDsgICAgICAgLyogVFBUX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHg5QzQwOyAgICAgICAvKiBUUVBfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDBBMjg7ICAgICAgIC8qIFROVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4M0U4MDsgICAgICAgLyogVEJUX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgzQTk4OyAgICAgICAvKiBUU01fbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDFCNTg7ICAgICAgIC8qIFRBTV9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDBDODsgICAgICAgLyogVEJSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwN0QwOyAgICAgICAvKiBURVJfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwMEE7ICAgICAgIC8qIFRHVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4NDU4ODsgICAgICAgLyogVEhUX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxRjQwOyAgICAgICAvKiBUUlJfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDRFMjA7ICAgICAgIC8qIFRWWF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDAwMDsgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBub2RlIGFkZHJlc3MuICovCisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IGRldi0+ZGV2X2FkZHJbMF0gPDwgOAorICAgICAgICAgICAgICAgIHwgKGRldi0+ZGV2X2FkZHJbMV0gJiAweEZGKTsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gZGV2LT5kZXZfYWRkclsyXSA8PCA4CisgICAgICAgICAgICAgICAgfCAoZGV2LT5kZXZfYWRkclszXSAmIDB4RkYpOworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSBkZXYtPmRldl9hZGRyWzRdIDw8IDgKKyAgICAgICAgICAgICAgICB8IChkZXYtPmRldl9hZGRyWzVdICYgMHhGRik7CisKKyAgICAgICAgLyogU2V0IGdyb3VwIGFkZHJlc3MuICovCisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5ncm91cF9hZGRyZXNzXzAgPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmdyb3VwX2FkZHJlc3NfMCA+PiA4OworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Z3JvdXBfYWRkcmVzc1swXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+Z3JvdXBfYWRkcmVzc1swXSA+PiA4OworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Z3JvdXBfYWRkcmVzc1sxXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+Z3JvdXBfYWRkcmVzc1sxXSA+PiA4OworCisgICAgICAgIC8qIFNldCBmdW5jdGlvbmFsIGFkZHJlc3MuICovCisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NfMCA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzWzBdID4+IDg7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMV0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1sxXSA+PiA4OworCisgICAgICAgIC8qIFNldCBCaXQtV2lzZSBncm91cCBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Yml0d2lzZV9ncm91cF9hZGRyZXNzWzBdIDw8IDgKKyAgICAgICAgICAgICAgICB8IHRwLT5iaXR3aXNlX2dyb3VwX2FkZHJlc3NbMF0gPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmJpdHdpc2VfZ3JvdXBfYWRkcmVzc1sxXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+Yml0d2lzZV9ncm91cF9hZGRyZXNzWzFdID4+IDg7CisKKyAgICAgICAgLyogU2V0IHJpbmcgbnVtYmVyIGFkZHJlc3MuICovCisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5zb3VyY2VfcmluZ19udW1iZXI7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT50YXJnZXRfcmluZ19udW1iZXI7CisKKyAgICAgICAgLyogUGh5c2ljYWwgZHJvcCBudW1iZXIuICovCisgICAgICAgICpwVGltZXJfU3RydWMrKyA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAodW5zaWduZWQgc2hvcnQpMDsKKworICAgICAgICAvKiBQcm9kdWN0IGluc3RhbmNlIElELiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gKHVuc2lnbmVkIHNob3J0KTA7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX0lOSVRfVFJDX1RJTUVSUywgMCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luaXRfdHhyeF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgdm9pZCAqKnR4cnhfcHRycyA9ICh2b2lkICopdHAtPm1pc2NfY29tbWFuZF9kYXRhOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisJeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEhhcmR3YXJlIGZhaWx1cmVcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBUcmFuc21pdCBRdWV1ZSBQb2ludGVycyB0aGF0IGFyZSB1c2VkLCB0byBwb2ludCB0bworICAgICAgICAgKiBhIHNpbmdsZSBGQ0IuCisgICAgICAgICAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fVFhfUVNfVVNFRDsgaSsrKQorICAgICAgICAgICAgICAgICp0eHJ4X3B0cnMrKyA9ICh2b2lkICopVFJDX1BPSU5URVIodHAtPnR4X2ZjYl9oZWFkW2ldKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIFRyYW5zbWl0IFF1ZXVlIFBvaW50ZXJzIHRoYXQgYXJlIE5PVCB1c2VkIHRvIFpFUk8uICovCisgICAgICAgIGZvcig7IGkgPCBNQVhfVFhfUVM7IGkrKykKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKTA7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBSZWNlaXZlIFF1ZXVlIFBvaW50ZXJzIChNQUMgYW5kIE5vbi1NQUMpIHRoYXQgYXJlCisgICAgICAgICAqIHVzZWQsIHRvIHBvaW50IHRvIGEgc2luZ2xlIEZDQiBhbmQgYSBCREIgY2hhaW4gb2YgYnVmZmVycy4KKyAgICAgICAgICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9SWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKVRSQ19QT0lOVEVSKHRwLT5yeF9mY2JfaGVhZFtpXSk7CisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKilUUkNfUE9JTlRFUih0cC0+cnhfYmRiX2hlYWRbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBSZWNlaXZlIFF1ZXVlIFBvaW50ZXJzIHRoYXQgYXJlIE5PVCB1c2VkIHRvIFpFUk8uICovCisgICAgICAgIGZvcig7IGkgPCBNQVhfUlhfUVM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgICp0eHJ4X3B0cnMrKyA9ICh2b2lkICopMDsKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKTA7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kX3dfZGF0YShkZXYsIEFDQl9DTURfSU5JVF9UWF9SWCwgMCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luc2VydF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9JTlNFUlQsIEFDQl9TVUJfQ01EX05PUCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX1JFQURfVFJDX1NUQVRVUywKKyAgICAgICAgICAgICAgICBSV19UUkNfU1RBVFVTX0JMT0NLKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVhZF93b3JkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBhd29yZF9jbnQpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX01DVF9SRUFEX1ZBTFVFLAorICAgICAgICAgICAgICAgIGF3b3JkX2NudCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlbW92ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sICAgID0gMDsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kICAgICA9IFNDTEJfVkFMSUQgfCBTQ0xCX0NNRF9SRU1PVkU7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfYWNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX0FDQjsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kICA9IFNDTEJfVkFMSUQgfCBTQ0xCX1JFU1VNRV9DT05UUk9MX1ZBTElEOworCisgICAgICAgIHRwLT5hY2JfcGVuZGluZyA9IDE7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZihxdWV1ZSA9PSBNQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IFNDTEJfUkNfUlhfTUFDX0JEQjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX1JYX05PTl9NQUNfQkRCOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfVkFMSUQgfCBTQ0xCX1JFU1VNRV9DT05UUk9MX1ZBTElEOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIGlmKHF1ZXVlID09IE1BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gU0NMQl9SQ19SWF9NQUNfRkNCOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IFNDTEJfUkNfUlhfTk9OX01BQ19GQ0I7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kID0gU0NMQl9WQUxJRCB8IFNDTEJfUkVTVU1FX0NPTlRST0xfVkFMSUQ7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZihzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IChTQ0xCX1JDX1RGQ0IwIDw8IHF1ZXVlKTsKKyAgICAgICAgdHAtPnNjbGJfcHRyLT52YWxpZF9jb21tYW5kID0gU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRCB8IFNDTEJfVkFMSUQ7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X2ludGVybmFsX3JvbV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9NQ1RfVEVTVCwKKyAgICAgICAgICAgICAgICBUUkNfSU5URVJOQUxfUk9NX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X2hpY19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9ISUNfVEVTVCwKKyAgICAgICAgICAgICAgICBUUkNfSE9TVF9JTlRFUkZBQ0VfUkVHX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X21hY19yZWdfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX01BQ19SRUdJU1RFUlNfVEVTVCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3RyY19sb29wYmFja19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9NQ1RfVEVTVCwKKyAgICAgICAgICAgICAgICBUUkNfSU5URVJOQUxfTE9PUEJBQ0spOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90cmlfbG9vcGJhY2tfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX1RSSV9MT09QQkFDSyk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3dyaXRlX2J5dGVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHNob3J0IGF3b3JkX2NudCwgdm9pZCAqYnl0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpd29yZCwgaWJ5dGU7CisJaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBmb3IoaXdvcmQgPSAwLCBpYnl0ZSA9IDA7IGl3b3JkIDwgKHVuc2lnbmVkIGludCkoYXdvcmRfY250ICYgMHhmZik7CisgICAgICAgIAlpd29yZCsrLCBpYnl0ZSArPSAyKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPm1pc2NfY29tbWFuZF9kYXRhW2l3b3JkXSA9ICgqKChfX3U4ICopYnl0ZSArIGlieXRlKSA8PCA4KQorCQkJfCAoKigoX191OCAqKWJ5dGUgKyBpYnl0ZSArIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX01DVF9XUklURV9WQUxVRSwgCisJCWF3b3JkX2NudCkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3dyaXRlX3dvcmRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHNob3J0IGF3b3JkX2NudCwgdm9pZCAqd29yZCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKGF3b3JkX2NudCAmIDB4ZmYpOyBpKyspCisgICAgICAgICAgICAgICAgdHAtPm1pc2NfY29tbWFuZF9kYXRhW2ldID0gKigoX191MTYgKil3b3JkICsgaSk7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX01DVF9XUklURV9WQUxVRSwKKyAgICAgICAgICAgICAgICBhd29yZF9jbnQpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9qb2luX2NvbXBsZXRlX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfQ0hBTkdFX0pPSU5fU1RBVEUsCisgICAgICAgICAgICAgICAgSlNfSk9JTl9DT01QTEVURV9TVEFURSk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2xpbmtfdHhfZmNic190b19iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKyAgICAgICAgQkRCbG9jayAqYmRiOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9UWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmY2IgPSB0cC0+dHhfZmNiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiID0gdHAtPnR4X2JkYl9oZWFkW2ldOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgdHAtPm51bV90eF9mY2JzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5iZGJfcHRyICAgICAgICAgICAgPSBiZGI7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19iZGJfcHRyICAgICAgICA9IFRSQ19QT0lOVEVSKGJkYik7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2IgPSAoRkNCbG9jayAqKSgoY2hhciAqKWZjYiArIHNpemVvZihGQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGIgPSAoQkRCbG9jayAqKSgoY2hhciAqKWJkYiArIHNpemVvZihCREJsb2NrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191MTYgaSwgY2hlY2tzdW0gPSAwOworICAgICAgICBpbnQgZXJyID0gMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfbG9hZF9maXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB0cC0+cHRyX3Vjb2RlICAgICAgICAgICA9IHNtY3RyX2NvZGU7CisgICAgICAgIHRwLT5udW1fb2ZfdHhfYnVmZnMgICAgID0gNDsKKyAgICAgICAgdHAtPm1vZGVfYml0cyAgICAgICAgICB8PSBVTUFDOworICAgICAgICB0cC0+cmVjZWl2ZV9tYXNrICAgICAgICA9IDA7CisgICAgICAgIHRwLT5tYXhfcGFja2V0X3NpemUgICAgID0gNDE3NzsKKworICAgICAgICAvKiBDYW4gb25seSB1cGxvYWQgdGhlIGZpcm13YXJlIG9uY2UgcGVyIGFkYXB0ZXIgcmVzZXQuICovCisgICAgICAgIGlmKHRwLT5taWNyb2NvZGVfdmVyc2lvbiAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoVUNPREVfUFJFU0VOVCk7CisKKyAgICAgICAgLyogVmVyaWZ5IHRoZSBmaXJtd2FyZSBleGlzdHMgYW5kIGlzIHRoZXJlIGluIHRoZSByaWdodCBhbW91bnQuICovCisgICAgICAgIGlmKCh0cC0+cHRyX3Vjb2RlID09IDBMKQorICAgICAgICAgICAgICAgIHx8ICgqKHRwLT5wdHJfdWNvZGUgKyBVQ09ERV9WRVJTSU9OX09GRlNFVCkgPCBVQ09ERV9WRVJTSU9OKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoVUNPREVfTk9UX1BSRVNFTlQpOworICAgICAgICB9CisKKyAgICAgICAgLyogVUNPREVfU0laRSBpcyBub3QgaW5jbHVkZWQgaW4gQ2hlY2tzdW0uICovCisgICAgICAgIGZvcihpID0gMDsgaSA8ICooKF9fdTE2ICopKHRwLT5wdHJfdWNvZGUgKyBVQ09ERV9TSVpFX09GRlNFVCkpOyBpICs9IDIpCisgICAgICAgICAgICAgICAgY2hlY2tzdW0gKz0gKigoX191MTYgKikodHAtPnB0cl91Y29kZSArIDIgKyBpKSk7CisgICAgICAgIGlmKGNoZWNrc3VtKQorICAgICAgICAgICAgICAgIHJldHVybiAoVUNPREVfTk9UX1BSRVNFTlQpOworCisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhIHZhbGlkIGZpcm13YXJlIGltYWdlLCBsZXRzIGtpY2sgaXQgb24gdXAuICovCisgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbShkZXYpOworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZigoc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoZGV2KSkKKyAgICAgICAgICAgICAgICB8fCAoKih0cC0+cHRyX3Vjb2RlICsgVUNPREVfVkVSU0lPTl9PRkZTRVQpCisgICAgICAgICAgICAgICAgPiB0cC0+bWljcm9jb2RlX3ZlcnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShkZXYpOworCisgICAgICAgICAgICAgICAgLyogWmVybyBvdXQgcmFtIHNwYWNlIGZvciBmaXJtd2FyZS4gKi8KKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBDU19SQU1fU0laRTsgaSArPSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MgKyBpKSkgPSAwOworCisgICAgICAgICAgICAgICAgc21jdHJfZGVjb2RlX2Zpcm13YXJlKGRldik7CisKKyAgICAgICAgICAgICAgICB0cC0+bWljcm9jb2RlX3ZlcnNpb24gPSAqKHRwLT5wdHJfdWNvZGUgKyBVQ09ERV9WRVJTSU9OX09GRlNFVCk7ICAgICAgICAgICAgICAgICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzICsgQ1NfUkFNX1ZFUlNJT05fT0ZGU0VUKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID0gKHRwLT5taWNyb2NvZGVfdmVyc2lvbiA8PCA4KTsKKyAgICAgICAgICAgICAgICAqKChfX3UxNiAqKSh0cC0+cmFtX2FjY2VzcyArIENTX1JBTV9DSEVDS1NVTV9PRkZTRVQpKQorICAgICAgICAgICAgICAgICAgICAgICAgPSB+KHRwLT5taWNyb2NvZGVfdmVyc2lvbiA8PCA4KSArIDE7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShkZXYpOworCisgICAgICAgICAgICAgICAgaWYoc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEhBUkRXQVJFX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyID0gVUNPREVfUFJFU0VOVDsKKworICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2xvYWRfbm9kZV9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIF9fdTggcjsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIExBUjAgKyBpKTsKKyAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2ldID0gKGNoYXIpcjsKKyAgICAgICAgfQorICAgICAgICBkZXYtPmFkZHJfbGVuID0gNjsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKiBMb2JlIE1lZGlhIFRlc3QuCisgKiBEdXJpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUgaW5pdGlhbCAxNTAwIGxvYmUgbWVkaWEgTUFDIGZyYW1lcywKKyAqIHRoZSBwaGFzZSBsb2NrIGxvb3AgaW4gdGhlIDgwNSBjaGlwIG1heSBsb2NrLCBhbmQgdGhlbiB1bi1sb2NrLCBjYXVzaW5nCisgKiB0aGUgODI1IHRvIGdvIGludG8gYSBQVVJHRSBzdGF0ZS4gV2hlbiBwZXJmb3JtaW5nIGEgUFVSR0UsIHRoZSBNQ1QKKyAqIG1pY3JvY29kZSB3aWxsIG5vdCB0cmFuc21pdCBhbnkgZnJhbWVzIGdpdmVuIHRvIGl0IGJ5IHRoZSBob3N0LCBhbmQKKyAqIHdpbGwgY29uc2VxdWVudGx5IGNhdXNlIGEgdGltZW91dC4KKyAqCisgKiBOT1RFIDE6IElmIHRoZSBtb25pdG9yX3N0YXRlIGlzIE1TX0JFQUNPTl9URVNUX1NUQVRFLCBhbGwgdHJhbnNtaXQKKyAqIHF1ZXVlcyBvdGhlciB0aGVuIHRoZSBvbmUgdXNlZCBmb3IgdGhlIGxvYmVfbWVkaWFfdGVzdCBzaG91bGQgYmUKKyAqIGRpc2FibGVkLiE/CisgKgorICogTk9URSAyOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSBhbmQgdGhlIHJlY2VpdmVfbWFzaworICogaGFzIGFueSBtdWx0aS1jYXN0IG9yIHByb21pc2NvdXMgYml0cyBzZXQsIHRoZSByZWNlaXZlX21hc2sgbmVlZHMgdG8KKyAqIGJlIGNoYW5nZWQgdG8gY2xlYXIgdGhlIG11bHRpLWNhc3Qgb3IgcHJvbWlzY291cyBtb2RlIGJpdHMsIHRoZSBsb2JlX3Rlc3QKKyAqIHJ1biwgYW5kIHRoZW4gdGhlIHJlY2VpdmUgbWFzayBzZXQgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUgaWYgdGhlIHRlc3QKKyAqIGlzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfbG9iZV9tZWRpYV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIHBlcnJvciA9IDA7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNhdmVkX3Jjdl9tYXNrOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9sb2JlX21lZGlhX3Rlc3RcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQ2xlYXIgcmVjZWl2ZSBtYXNrIGZvciBsb2JlIHRlc3QuICovCisgICAgICAgIHNhdmVkX3Jjdl9tYXNrICAgICAgICAgID0gdHAtPnJlY2VpdmVfbWFzazsKKyAgICAgICAgdHAtPnJlY2VpdmVfbWFzayAgICAgICAgPSAwOworCisgICAgICAgIHNtY3RyX2NoZ19yeF9tYXNrKGRldik7CisKKyAgICAgICAgLyogU2V0dXAgdGhlIGxvYmUgbWVkaWEgdGVzdC4gKi8KKyAgICAgICAgc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChkZXYpOworICAgICAgICBpZihzbWN0cl93YWl0X2NtZChkZXYpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFR4IGxvYmUgbWVkaWEgdGVzdCBmcmFtZXMuICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE1MDA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHNtY3RyX3NlbmRfbG9iZV9tZWRpYV90ZXN0KGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocGVycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9yZXNldF9hZGFwdGVyKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChkZXYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExPQkVfTUVESUFfVEVTVF9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc21jdHJfc2VuZF9kYXQoZGV2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHNtY3RyX3NlbmRfZGF0KGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRlID0gQ0xPU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiBhbnkgZnJhbWVzIHJlY2VpdmVkIGR1cmluZyB0ZXN0LiAqLworICAgICAgICBpZigodHAtPnJ4X2ZjYl9jdXJyW01BQ19RVUVVRV0tPmZyYW1lX3N0YXR1cykKKyAgICAgICAgICAgICAgICB8fCAodHAtPnJ4X2ZjYl9jdXJyW05PTl9NQUNfUVVFVUVdLT5mcmFtZV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExPQkVfTUVESUFfVEVTVF9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHJlY2VpdmUgbWFzayB0byAiUHJvbWlzYyIgbW9kZS4gKi8KKyAgICAgICAgdHAtPnJlY2VpdmVfbWFzayA9IHNhdmVkX3Jjdl9tYXNrOworCisgICAgICAgIHNtY3RyX2NoZ19yeF9tYXNrKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3RfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICAvKiBDaGFuZ2UgdG8gbG9iZSBtZWRpYSB0ZXN0IHN0YXRlLiAqLworICAgICAgICBpZih0cC0+bW9uaXRvcl9zdGF0ZSAhPSBNU19CRUFDT05fVEVTVF9TVEFURSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9zdGF0ZShkZXYpOworICAgICAgICAgICAgICAgIGlmKHNtY3RyX3dhaXRfY21kKGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJMb2JlIEZhaWxlZCB0ZXN0IHN0YXRlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0xPQkVfTUVESUFfVEVTVCk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFLAorICAgICAgICAgICAgICAgIEpTX0xPQkVfVEVTVF9TVEFURSk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfODAyNV9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX0hFQURFUiAqcm1mLCBNQUNfSEVBREVSICp0bWYsIF9fdTE2IGFjX2ZjKQoreworICAgICAgICB0bWYtPmFjID0gTVNCKGFjX2ZjKTsgICAgICAgICAgICAgICAgIC8qIG1zYiBpcyBhY2Nlc3MgY29udHJvbCAqLworICAgICAgICB0bWYtPmZjID0gTFNCKGFjX2ZjKTsgICAgICAgICAgICAgICAgIC8qIGxzYiBpcyBmcmFtZSBjb250cm9sICovCisKKyAgICAgICAgdG1mLT5zYVswXSA9IGRldi0+ZGV2X2FkZHJbMF07CisgICAgICAgIHRtZi0+c2FbMV0gPSBkZXYtPmRldl9hZGRyWzFdOworICAgICAgICB0bWYtPnNhWzJdID0gZGV2LT5kZXZfYWRkclsyXTsKKyAgICAgICAgdG1mLT5zYVszXSA9IGRldi0+ZGV2X2FkZHJbM107CisgICAgICAgIHRtZi0+c2FbNF0gPSBkZXYtPmRldl9hZGRyWzRdOworICAgICAgICB0bWYtPnNhWzVdID0gZGV2LT5kZXZfYWRkcls1XTsKKworICAgICAgICBzd2l0Y2godG1mLT52YykKKyAgICAgICAgeworCQkvKiBTZW5kIFJRX0lOSVQgdG8gUlBTICovCisgICAgICAgICAgICAgICAgY2FzZSBSUV9JTklUOgorICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVswXSA9IDB4YzA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzFdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMl0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVszXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzRdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbNV0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJLyogU2VuZCBSUFRfVFhfRk9SV0FSRCB0byBDUlMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIFJQVF9UWF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVswXSA9IDB4YzA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzFdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMl0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVszXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzRdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbNV0gPSAweDEwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJLyogRXZlcnl0aGluZyBlbHNlIGdvZXMgdG8gc2VuZGVyICovCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMF0gPSBybWYtPnNhWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsxXSA9IHJtZi0+c2FbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzJdID0gcm1mLT5zYVsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbM10gPSBybWYtPnNhWzNdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs0XSA9IHJtZi0+c2FbNF07CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzVdID0gcm1mLT5zYVs1XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2FjY2Vzc19wcmkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFk7CisgICAgICAgIHRzdi0+c3ZsID0gU19BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWTsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkpOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2FkZHJfbW9kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHRzdi0+c3ZpID0gQUREUkVTU19NT0RJRkVSOworICAgICAgICB0c3YtPnN2bCA9IFNfQUREUkVTU19NT0RJRkVSOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSAwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hdXRoX2Z1bmN0X2NsYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1M7CisgICAgICAgIHRzdi0+c3ZsID0gU19BVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5hdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXMpOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+YXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfY29ycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2LCBfX3UxNiBjb3JyZWxhdG9yKQoreworICAgICAgICB0c3YtPnN2aSA9IENPUlJFTEFUT1I7CisgICAgICAgIHRzdi0+c3ZsID0gU19DT1JSRUxBVE9SOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKGNvcnJlbGF0b3IpOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQihjb3JyZWxhdG9yKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfZnVuY3RfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgc21jdHJfZ2V0X2Z1bmN0aW9uYWxfYWRkcmVzcyhkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gRlVOQ1RJT05BTF9BRERSRVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfRlVOQ1RJT05BTF9BRERSRVNTOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisKKyAgICAgICAgdHN2LT5zdnZbMl0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKyAgICAgICAgdHN2LT5zdnZbM10gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfZ3JvdXBfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgc21jdHJfZ2V0X2dyb3VwX2FkZHJlc3MoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEdST1VQX0FERFJFU1M7CisgICAgICAgIHRzdi0+c3ZsID0gU19HUk9VUF9BRERSRVNTOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisKKyAgICAgICAgdHN2LT5zdnZbMl0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKyAgICAgICAgdHN2LT5zdnZbM10gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKworICAgICAgICAvKiBTZXQgR3JvdXAgQWRkcmVzcyBTdWItdmVjdG9yIHRvIGFsbCB6ZXJvcyBpZiBvbmx5IHRoZQorICAgICAgICAgKiBHcm91cCBBZGRyZXNzL0Z1bmN0aW9uYWwgQWRkcmVzcyBJbmRpY2F0b3IgaXMgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYodHN2LT5zdnZbMF0gPT0gMHg4MCAmJiB0c3YtPnN2dlsxXSA9PSAweDAwCisgICAgICAgIAkmJiB0c3YtPnN2dlsyXSA9PSAweDAwICYmIHRzdi0+c3Z2WzNdID09IDB4MDApCisgICAgICAgICAgICAgICAgdHN2LT5zdnZbMF0gPSAweDAwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9waHlfZHJvcF9udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9waHlzaWNhbF9kcm9wX251bWJlcihkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gUEhZU0lDQUxfRFJPUDsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1BIWVNJQ0FMX0RST1A7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKworICAgICAgICB0c3YtPnN2dlsyXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworICAgICAgICB0c3YtPnN2dlszXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9wcm9kdWN0X2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIHRzdi0+c3ZpID0gUFJPRFVDVF9JTlNUQU5DRV9JRDsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1BST0RVQ1RfSU5TVEFOQ0VfSUQ7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTg7IGkrKykKKyAgICAgICAgICAgICAgICB0c3YtPnN2dltpXSA9IDB4RjA7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3N0YXRpb25faWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9zdGF0aW9uX2lkKGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBTVEFUSU9OX0lERU5USUZFUjsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1NUQVRJT05fSURFTlRJRkVSOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisKKyAgICAgICAgdHN2LT5zdnZbMl0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKyAgICAgICAgdHN2LT5zdnZbM10gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKworICAgICAgICB0c3YtPnN2dls0XSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMl0pOworICAgICAgICB0c3YtPnN2dls1XSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMl0pOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICogdHN2KQoreworICAgICAgICB0c3YtPnN2aSA9IFJJTkdfU1RBVElPTl9TVEFUVVM7CisgICAgICAgIHRzdi0+c3ZsID0gU19SSU5HX1NUQVRJT05fU1RBVFVTOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSAwOworICAgICAgICB0c3YtPnN2dlsyXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbNF0gPSAwOworICAgICAgICB0c3YtPnN2dls1XSA9IDA7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3Jpbmdfc3RhdGlvbl92ZXJzaW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IFJJTkdfU1RBVElPTl9WRVJTSU9OX05VTUJFUjsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1JJTkdfU1RBVElPTl9WRVJTSU9OX05VTUJFUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IDB4ZTI7ICAgICAgICAgICAgLyogRUJDRElDIC0gUyAqLworICAgICAgICB0c3YtPnN2dlsxXSA9IDB4ZDQ7ICAgICAgICAgICAgLyogRUJDRElDIC0gTSAqLworICAgICAgICB0c3YtPnN2dlsyXSA9IDB4YzM7ICAgICAgICAgICAgLyogRUJDRElDIC0gQyAqLworICAgICAgICB0c3YtPnN2dlszXSA9IDB4NDA7ICAgICAgICAgICAgLyogRUJDRElDIC0gICAqLworICAgICAgICB0c3YtPnN2dls0XSA9IDB4ZTU7ICAgICAgICAgICAgLyogRUJDRElDIC0gViAqLworICAgICAgICB0c3YtPnN2dls1XSA9IDB4RjAgKyAodHAtPm1pY3JvY29kZV92ZXJzaW9uID4+IDQpOworICAgICAgICB0c3YtPnN2dls2XSA9IDB4RjAgKyAodHAtPm1pY3JvY29kZV92ZXJzaW9uICYgMHgwZik7CisgICAgICAgIHRzdi0+c3Z2WzddID0gMHg0MDsgICAgICAgICAgICAvKiBFQkNESUMgLSAgICovCisgICAgICAgIHRzdi0+c3Z2WzhdID0gMHhlNzsgICAgICAgICAgICAvKiBFQkNESUMgLSBYICovCisKKyAgICAgICAgaWYodHAtPmV4dHJhX2luZm8gJiBDSElQX1JFVl9NQVNLKQorICAgICAgICAgICAgICAgIHRzdi0+c3Z2WzldID0gMHhjNTsgICAgLyogRUJDRElDIC0gRSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHN2LT5zdnZbOV0gPSAweGM0OyAgICAvKiBFQkNESUMgLSBEICovCisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3R4X3N0YXR1c19jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YsIF9fdTE2IHR4X2ZzdGF0dXMpCit7CisgICAgICAgIHRzdi0+c3ZpID0gVFJBTlNNSVRfU1RBVFVTX0NPREU7CisgICAgICAgIHRzdi0+c3ZsID0gU19UUkFOU01JVF9TVEFUVVNfQ09ERTsKKworICAgICAgICB0c3YtPnN2dlswXSA9ICgodHhfZnN0YXR1cyAmIDB4MDEwMCA+PiA2KSB8fCBJQk1fUEFTU19TT1VSQ0VfQUREUik7CisKKyAgICAgICAgLyogU3RyaXBwZWQgZnJhbWUgc3RhdHVzIG9mIFRyYW5zbWl0dGVkIEZyYW1lICovCisgICAgICAgIHRzdi0+c3Z2WzFdID0gdHhfZnN0YXR1cyAmIDB4ZmY7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3Vwc3RyZWFtX25laWdoYm9yX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBVUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgdHN2LT5zdnZbNF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKyAgICAgICAgdHN2LT5zdnZbNV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2Vfd3JhcF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHRzdi0+c3ZpID0gV1JBUF9EQVRBOworICAgICAgICB0c3YtPnN2bCA9IFNfV1JBUF9EQVRBOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCBzb21ldGltZSBhZnRlcgorICogYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50IHNtY3RyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfb3BlblxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBlcnIgPSBzbWN0cl9pbml0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgaWYoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKiBJbnRlcnJ1cHQgZHJpdmVuIG9wZW4gb2YgVG9rZW4gY2FyZC4gKi8KK3N0YXRpYyBpbnQgc21jdHJfb3Blbl90cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX29wZW5fdHJcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogTm93IHdlIGNhbiBhY3R1YWxseSBvcGVuIHRoZSBhZGFwdGVyLiAqLworICAgICAgICBpZih0cC0+c3RhdHVzID09IE9QRU4pCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgaWYodHAtPnN0YXR1cyAhPSBJTklUSUFMSVpFRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworCS8qIEZJWE1FOiBpdCB3b3VsZCB3b3JrIGEgbG90IGJldHRlciBpZiB3ZSBtYXNrZWQgdGhlIGlycSBzb3VyY2VzCisJICAgb24gdGhlIGNhcmQgaGVyZSwgdGhlbiB3ZSBjb3VsZCBza2lwIHRoZSBsb2NraW5nIGFuZCBwb2xsIG5pY2VseSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQorICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfZmNiX2NtZChkZXYsIChzaG9ydClNQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoZGV2LCAoc2hvcnQpTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKGRldiwgKHNob3J0KU5PTl9NQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoZGV2LCAoc2hvcnQpTk9OX01BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisKKyAgICAgICAgLyogSW5zZXJ0IGludG8gdGhlIFJpbmcgb3IgRW50ZXIgTG9vcGJhY2sgTW9kZS4gKi8KKyAgICAgICAgaWYoKHRwLT5tb2RlX2JpdHMgJiBMT09QSU5HX01PREVfTUFTSykgPT0gTE9PUEJBQ0tfTU9ERV8xKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IENMT1NFRDsKKworICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfaXNzdWVfdHJjX2xvb3BiYWNrX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gT1BFTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKHRwLT5tb2RlX2JpdHMgJiBMT09QSU5HX01PREVfTUFTSykgPT0gTE9PUEJBQ0tfTU9ERV8yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX2lzc3VlX3RyaV9sb29wYmFja19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IE9QRU47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3N0YXR1c19jaGcoZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IExPT1BCQUNLX01PREVfMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl9sb2JlX21lZGlhX3Rlc3RfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBPUEVOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3N0YXR1c19jaGcoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl9sb2JlX21lZGlhX3Rlc3QoZGV2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfaXNzdWVfaW5zZXJ0X2NtZChkZXYpOworCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBMT0JFX01FRElBX1RFU1RfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExvYmUgTWVkaWEgVGVzdCBGYWlsdXJlIC0gQ2hlY2sgY2FibGU/XG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKK291dDoKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRlciBvZiB0aGlzIHR5cGUsIAorICogYW5kIHJldHVybiBkZXZpY2Ugc3RydWN0dXJlIGlmIG9uZSBleGlzdHMuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlIF9faW5pdCAqc21jdHJfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBvcnRzW10gPSB7CisJCTB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyQTAsIDB4MkMwLCAweDJFMCwgMHgzMDAsCisJCTB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MzgwLCAwCisJfTsKKwljb25zdCB1bnNpZ25lZCAqcG9ydDsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAidHIlZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworICAgICAgICBpZiAoZGV2LT5iYXNlX2FkZHIgPiAweDFmZikgICAgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBzbWN0cl9wcm9iZTEoZGV2LCBkZXYtPmJhc2VfYWRkcik7CisgICAgICAgIGVsc2UgaWYoZGV2LT5iYXNlX2FkZHIgIT0gMCkgIC8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKyAgICAgICAgICAgICAgICBlcnIgPS1FTlhJTzsKKwllbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWVyciA9IHNtY3RyX3Byb2JlMShkZXYsICpwb3J0KTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXsgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCSAgaWYgKHRwLT5zbG90X251bSkKKwkJbWNhX21hcmtfYXNfdW51c2VkKHRwLT5zbG90X251bSk7CisJfQorI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworICAgICAgICBzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIF9fdTMyICpyYW07CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGsodmVyc2lvbik7CisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKyAgICAgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwkvKiBBY3R1YWxseSBkZXRlY3QgYW4gYWRhcHRlciBub3cuICovCisgICAgICAgIGVyciA9IHNtY3RyX2Noa19pc2EoZGV2KTsKKyAgICAgICAgaWYoZXJyIDwgMCkKKyAgICAgICAgeworCQlpZiAoKGVyciA9IHNtY3RyX2Noa19tY2EoZGV2KSkgPCAwKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgZGV2LT5tZW1fc3RhcnQgPSB0cC0+cmFtX2Jhc2U7CisgICAgICAgIGRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwMDsKKyAgICAgICAgcmFtID0gKF9fdTMyICopcGh5c190b192aXJ0KGRldi0+bWVtX3N0YXJ0KTsKKyAgICAgICAgdHAtPnJhbV9hY2Nlc3MgPSAqKF9fdTMyICopJnJhbTsKKwl0cC0+c3RhdHVzID0gTk9UX0lOSVRJQUxJWkVEOworCisgICAgICAgIGVyciA9IHNtY3RyX2xvYWRfZmlybXdhcmUoZGV2KTsKKyAgICAgICAgaWYoZXJyICE9IFVDT0RFX1BSRVNFTlQgJiYgZXJyICE9IFNVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBGaXJtd2FyZSBsb2FkIGZhaWxlZCAoJWQpXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworICAgICAgICB9CisKKwkvKiBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgcmluZyBzcGVlZCBvbiBtb2R1bGUgaW5zZXJ0LiAqLworCWlmKHJpbmdzcGVlZCA9PSA0KQorCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1VUUF80OworCWVsc2UKKwkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfMTY7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzIGF0IElvICUjNHgsIElycSAlZCwgUm9tICUjNHgsIFJhbSAlIzR4LlxuIiwKKyAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHNtY3RyX25hbWUsIHNtY3RyX21vZGVsLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpZGV2LT5iYXNlX2FkZHIsCisgICAgICAgICAgICAgICAgZGV2LT5pcnEsIHRwLT5yb21fYmFzZSwgdHAtPnJhbV9iYXNlKTsKKworICAgICAgICBkZXYtPm9wZW4gICAgICAgICAgICAgICA9IHNtY3RyX29wZW47CisgICAgICAgIGRldi0+c3RvcCAgICAgICAgICAgICAgID0gc21jdHJfY2xvc2U7CisgICAgICAgIGRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gc21jdHJfc2VuZF9wYWNrZXQ7CisgICAgICAgIGRldi0+dHhfdGltZW91dAkJPSBzbWN0cl90aW1lb3V0OworICAgICAgICBkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFo7CisgICAgICAgIGRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gc21jdHJfZ2V0X3N0YXRzOworICAgICAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzbWN0cl9zZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgICAgIHJldHVybiAoMCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Byb2Nlc3NfcnhfcGFja2V0KE1BQ19IRUFERVIgKnJtZiwgX191MTYgc2l6ZSwKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcnhfc3RhdHVzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIF9fdTE2IHJjb2RlLCBjb3JyZWxhdG9yOworICAgICAgICBpbnQgZXJyID0gMDsKKyAgICAgICAgX191OCB4ZnJhbWUgPSAxOworICAgICAgICBfX3UxNiB0eF9mc3RhdHVzOworCisgICAgICAgIHJtZi0+dmwgPSBTV0FQX0JZVEVTKHJtZi0+dmwpOworICAgICAgICBpZihyeF9zdGF0dXMgJiBGQ0JfUlhfU1RBVFVTX0RBX01BVENIRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocm1mLT52YykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWNlaXZlZCBNQUMgRnJhbWVzIFByb2Nlc3NlZCBieSBSUy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHJjb2RlID0gc21jdHJfcmN2X2luaXQoZGV2LCBybWYsICZjb3JyZWxhdG9yKSkgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0b3IpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEdfUEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHJjb2RlID0gc21jdHJfcmN2X2NoZ19wYXJhbShkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVsYXRvcikpID09SEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0b3IpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9BRERSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigocmNvZGUgPSBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1mLCAmY29ycmVsYXRvcikpICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLCBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfYWRkcihkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfQVRUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9ycV9hZGRyX3N0YXRlX2F0dGNoKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWYsICZjb3JyZWxhdG9yKSkgIT0gUE9TSVRJVkVfQUNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmNvZGUgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzbWN0cl9zZW5kX3JzcChkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9zZW5kX3JwdF9hdHRjaChkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9ycV9hZGRyX3N0YXRlX2F0dGNoKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWYsICZjb3JyZWxhdG9yKSkgIT0gUE9TSVRJVkVfQUNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmNvZGUgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzbWN0cl9zZW5kX3JzcChkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9zZW5kX3JwdF9zdGF0ZShkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFhfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHJjb2RlID0gc21jdHJfcmN2X3R4X2ZvcndhcmQoZGV2LCBybWYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF90eF9mb3J3YXJkKGRldiwgcm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eF9mc3RhdHVzKSkgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyID09IEFfRlJBTUVfV0FTX0ZPUldBUkRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9zZW5kX3JwdF90eF9mb3J3YXJkKGRldiwKKwkJCQkJCXJtZiwgdHhfZnN0YXR1cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBIQVJEV0FSRV9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgTUFDIEZyYW1lcyBQcm9jZXNzZWQgYnkgQ1JTL1JFTS9SUFMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJTUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX05FV19NT046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVUFfQ0hHOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQUNUSVZFX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX05OX0lOQ01QOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9BVFRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJjdmQgQXR0LiBNQUMgRnJhbWUgKGlmIFJYQVRNQUMgc2V0KSBvciBVTktOT1dOICovCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZnJhbWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfQVRUX01BQ19GUkFNRVMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9yY3ZfdW5rbm93bihkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3JyZWxhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9yc3AoZGV2LCBybWYscmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAxLiBEQSBkb2Vzbid0IG1hdGNoIChQcm9taXNjdW91cyBNb2RlKS4KKyAgICAgICAgICAgICAgICAgKiAyLiBQYXJzZSBmb3IgRXh0ZW5kZWQgTUFDIEZyYW1lIFR5cGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc3dpdGNoKHJtZi0+dmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1A6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0FERFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0FUVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hHX1BBUk06CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9BRERSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9BVFRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfTkVXX01PTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX1NVQV9DSEc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9OTl9JTkNNUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0FDVElWRV9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZnJhbWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBOT1RFOiBVTktOT1dOIE1BQyBmcmFtZXMgd2lsbCBOT1QgYmUgcGFzc2VkIHVwIHVubGVzcworICAgICAgICAgKiBBQ0NFUFRfQVRUX01BQ19GUkFNRVMgaXMgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0FUVF9NQUNfRlJBTUVTKQorICAgICAgICAgICAgICAgICYmICh4ZnJhbWUgPT0gKF9fdTgpMCkpCisgICAgICAgICAgICAgICAgfHwgKCh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VYVF9NQUNfRlJBTUVTKQorICAgICAgICAgICAgICAgICYmICh4ZnJhbWUgPT0gKF9fdTgpMSkpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcm1mLT52bCA9IFNXQVBfQllURVMocm1mLT52bCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpKSkKKwkJCXJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgIHNrYi0+bGVuID0gc2l6ZTsKKworICAgICAgICAgICAgICAgIC8qIFNsaWRlIGRhdGEgaW50byBhIHNsZWVrIHNrYi4gKi8KKyAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgc2tiLT5sZW4pOworICAgICAgICAgICAgICAgIG1lbWNweShza2ItPmRhdGEsIHJtZiwgc2tiLT5sZW4pOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIENvdW50ZXJzICovCisgICAgICAgICAgICAgICAgdHAtPk1hY1N0YXQucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgIHRwLT5NYWNTdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisgICAgICAgICAgICAgICAgLyogS2ljayB0aGUgcGFja2V0IG9uIHVwLiAqLworICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgICAgICAgICAgICAgICBuZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKKy8qIEFkYXB0ZXIgUkFNIHRlc3QuIEluY3JlbWVudGFsIHdvcmQgT0REIGJvdW5kYXJ5IGRhdGEgdGVzdC4gKi8KK3N0YXRpYyBpbnQgc21jdHJfcmFtX21lbW9yeV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191MTYgcGFnZSwgcGFnZXNfb2ZfcmFtLCBzdGFydF9wYXR0ZXJuID0gMCwgd29yZF9wYXR0ZXJuID0gMCwKKyAgICAgICAgICAgICAgICB3b3JkX3JlYWQgPSAwLCBlcnJfd29yZCA9IDAsIGVycl9wYXR0ZXJuID0gMDsKKyAgICAgICAgdW5zaWduZWQgaW50IGVycl9vZmZzZXQ7CisgICAgICAgIF9fdTMyIGosIHB3b3JkOworICAgICAgICBfX3U4IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3JhbV9tZW1vcnlfdGVzdFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzdGFydF9wYXR0ZXJuICAgPSAweDAwMDE7CisgICAgICAgIHBhZ2VzX29mX3JhbSAgICA9IHRwLT5yYW1fc2l6ZSAvIHRwLT5yYW1fdXNhYmxlOworICAgICAgICBwd29yZCAgICAgICAgICAgPSB0cC0+cmFtX2FjY2VzczsKKworICAgICAgICAvKiBJbmNyZW1lbnRhbCB3b3JkIE9ERCBib3VuZGFyeSB0ZXN0LiAqLworICAgICAgICBmb3IocGFnZSA9IDA7IChwYWdlIDwgcGFnZXNfb2ZfcmFtKSAmJiAofmVycik7CisgICAgICAgICAgICAgICAgcGFnZSsrLCBzdGFydF9wYXR0ZXJuICs9IDB4ODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKikodHAtPnJhbV9hY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKHBhZ2UgKiB0cC0+cmFtX3VzYWJsZSAqIDEwMjQpICsgMSkpOworICAgICAgICAgICAgICAgIHdvcmRfcGF0dGVybiA9IHN0YXJ0X3BhdHRlcm47CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCAoX191MzIpKHRwLT5yYW1fdXNhYmxlICogMTAyNCkgLSAxOyBqICs9IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAqKF9fdTE2ICopKHB3b3JkICsgaikgPSB3b3JkX3BhdHRlcm4rKzsKKworICAgICAgICAgICAgICAgIHdvcmRfcGF0dGVybiA9IHN0YXJ0X3BhdHRlcm47CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCAoX191MzIpKHRwLT5yYW1fdXNhYmxlICogMTAyNCkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAofmVycik7IGogKz0gMiwgd29yZF9wYXR0ZXJuKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9yZWFkID0gKihfX3UxNiAqKShwd29yZCArIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYod29yZF9yZWFkICE9IHdvcmRfcGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyICAgICAgICAgICAgID0gKF9fdTgpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX29mZnNldCAgICAgID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3dvcmQgICAgICAgID0gd29yZF9yZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcGF0dGVybiAgICAgPSB3b3JkX3BhdHRlcm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUkFNX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBaZXJvIG91dCBtZW1vcnkuICovCisgICAgICAgIGZvcihwYWdlID0gMDsgcGFnZSA8IHBhZ2VzX29mX3JhbSAmJiAofmVycik7IHBhZ2UrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKikodHAtPnJhbV9hY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKHBhZ2UgKiB0cC0+cmFtX3VzYWJsZSAqIDEwMjQpKSk7CisgICAgICAgICAgICAgICAgd29yZF9wYXR0ZXJuID0gMDsKKworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IChfX3UzMil0cC0+cmFtX3VzYWJsZSAqIDEwMjQ7IGogKz0yKQorICAgICAgICAgICAgICAgICAgICAgICAgKihfX3UxNiAqKShwd29yZCArIGopID0gd29yZF9wYXR0ZXJuOworCisgICAgICAgICAgICAgICAgZm9yKGogPTA7IGogPCAoX191MzIpdHAtPnJhbV91c2FibGUgKiAxMDI0CisgICAgICAgICAgICAgICAgICAgICAgICAmJiAofmVycik7IGogKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JkX3JlYWQgPSAqKF9fdTE2ICopKHB3b3JkICsgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih3b3JkX3JlYWQgIT0gd29yZF9wYXR0ZXJuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgICAgICAgICAgICAgPSAoX191OCkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfb2Zmc2V0ICAgICAgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfd29yZCAgICAgICAgPSB3b3JkX3JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9wYXR0ZXJuICAgICA9IHdvcmRfcGF0dGVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChSQU1fVEVTVF9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfY2hnX3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3Y7CisgICAgICAgIHNpZ25lZCBzaG9ydCB2bGVuOworICAgICAgICBfX3UxNiByY29kZSA9IFBPU0lUSVZFX0FDSzsKKyAgICAgICAgdW5zaWduZWQgaW50IHN2ZWN0b3JzID0gRl9OT19TVUJfVkVDVE9SU19GT1VORDsKKworICAgICAgICAvKiBUaGlzIEZyYW1lIGNhbiBvbmx5IGNvbWUgZnJvbSBhIENSUyAqLworICAgICAgICBpZigocm1mLT5kY19zYyAmIFNDX01BU0spICE9IFNDX0NSUykKKyAgICAgICAgICAgICAgICByZXR1cm4oRV9JTkFQUFJPUFJJQVRFX1NPVVJDRV9DTEFTUyk7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoLiAqLworICAgICAgICB2bGVuID0gKHNpZ25lZCBzaG9ydClybWYtPnZsIC0gNDsKKworICAgICAgICAvKiBQb2ludCB0byBGaXJzdCBTVklEICovCisgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcm1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKworICAgICAgICAvKiBTZWFyY2ggZm9yIEFwcHJvcHJpYXRlIFNWSUQncy4gKi8KKyAgICAgICAgd2hpbGUoKHZsZW4gPiAwKSAmJiAocmNvZGUgPT0gUE9TSVRJVkVfQUNLKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChyc3YtPnN2aSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPUlJFTEFUT1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2ZWN0b3JzIHw9IEZfQ09SUkVMQVRPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfY29ycihkZXYsIHJzdiwgY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExPQ0FMX1JJTkdfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0xPQ0FMX1JJTkdfTlVNQkVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9sb2NhbF9yaW5nX251bShkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9QSFlTSUNBTF9EUk9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0FTU0lHTl9QSFlTSUNBTF9EUk9QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9waHlfZHJvcChkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX1RJTUVSX1ZBTFVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0VSUk9SX1RJTUVSX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9lcnJvcl90aW1lcl92YWx1ZShkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2ZWN0b3JzIHw9IEZfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfYXV0aF9mdW5jdF9jbGFzcyhkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0FVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9hdXRoX2FjY2Vzc19wcmkoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKCh2bGVuIC09IHJzdi0+c3ZsKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKworICAgICAgICAgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcnN2ICsgcnN2LT5zdmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYocmNvZGUgPT0gUE9TSVRJVkVfQUNLKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIE1WSUQgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICAgICAgICogaXMgbGFyZ2VyIHRoZW4gU1VNIG9mIFNWIGxlbmd0aCdzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYodmxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisgICAgICAgICAgICAgICAgZWxzZQorCQl7CisgICAgICAgICAgICAgICAgCS8qIExldCBTZW5kZXIgS25vdyBpZiBFeHBlY3RlZCBTVklEIE1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAJaWYoKHN2ZWN0b3JzICYgUl9DSEdfUEFSTSkgXiBSX0NIR19QQVJNKQorICAgICAgICAgICAgICAgICAgICAgICAgCXJjb2RlID0gRV9NSVNTSU5HX1NVQl9WRUNUT1I7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmNvZGUpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jjdl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3Y7CisgICAgICAgIHNpZ25lZCBzaG9ydCB2bGVuOworICAgICAgICBfX3UxNiByY29kZSA9IFBPU0lUSVZFX0FDSzsKKyAgICAgICAgdW5zaWduZWQgaW50IHN2ZWN0b3JzID0gRl9OT19TVUJfVkVDVE9SU19GT1VORDsKKworICAgICAgICAvKiBUaGlzIEZyYW1lIGNhbiBvbmx5IGNvbWUgZnJvbSBhIFJQUyAqLworICAgICAgICBpZigocm1mLT5kY19zYyAmIFNDX01BU0spICE9IFNDX1JQUykKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfSU5BUFBST1BSSUFURV9TT1VSQ0VfQ0xBU1MpOworCisgICAgICAgIC8qIFJlbW92ZSBNVklEIExlbmd0aCBmcm9tIHRvdGFsIGxlbmd0aC4gKi8KKyAgICAgICAgdmxlbiA9IChzaWduZWQgc2hvcnQpcm1mLT52bCAtIDQ7CisKKyAgICAgICAgLyogUG9pbnQgdG8gRmlyc3QgU1ZJRCAqLworICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisKKyAgICAgICAgLyogU2VhcmNoIGZvciBBcHByb3ByaWF0ZSBTVklEJ3MgKi8KKyAgICAgICAgd2hpbGUoKHZsZW4gPiAwKSAmJiAocmNvZGUgPT0gUE9TSVRJVkVfQUNLKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChyc3YtPnN2aSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPUlJFTEFUT1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2ZWN0b3JzIHw9IEZfQ09SUkVMQVRPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfY29ycihkZXYsIHJzdiwgY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExPQ0FMX1JJTkdfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0xPQ0FMX1JJTkdfTlVNQkVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9sb2NhbF9yaW5nX251bShkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9QSFlTSUNBTF9EUk9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0FTU0lHTl9QSFlTSUNBTF9EUk9QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9waHlfZHJvcChkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX1RJTUVSX1ZBTFVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0VSUk9SX1RJTUVSX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IHNtY3RyX3NldF9lcnJvcl90aW1lcl92YWx1ZShkZXYsIHJzdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfU1VCX1ZFQ1RPUl9VTktOT1dOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBMZXQgU2VuZGVyIEtub3cgaWYgU1VNIG9mIFNWIGxlbmd0aCdzIGlzCisgICAgICAgICAgICAgICAgICogbGFyZ2VyIHRoZW4gbGVuZ3RoIGluIE1WSUQgbGVuZ3RoIGZpZWxkCisJCSAqLworICAgICAgICAgICAgICAgIGlmKCh2bGVuIC09IHJzdi0+c3ZsKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKworICAgICAgICAgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcnN2ICsgcnN2LT5zdmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYocmNvZGUgPT0gUE9TSVRJVkVfQUNLKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIE1WSUQgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICAgICAgICogaXMgbGFyZ2VyIHRoZW4gU1VNIG9mIFNWIGxlbmd0aCdzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYodmxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisgICAgICAgICAgICAgICAgZWxzZQorCQl7CisgICAgICAgICAgICAgICAgCS8qIExldCBTZW5kZXIgS25vdyBpZiBFeHBlY3RlZCBTViBNaXNzaW5nICovCisgICAgICAgICAgICAgICAgCWlmKChzdmVjdG9ycyAmIFJfSU5JVCkgXiBSX0lOSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAJcmNvZGUgPSBFX01JU1NJTkdfU1VCX1ZFQ1RPUjsKKwkJfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcmN2X3R4X2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogVGhpcyBGcmFtZSBjYW4gb25seSBjb21lIGZyb20gYSBDUlMgKi8KKyAgICAgICAgaWYoKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSAhPSBTQ19DUlMpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX0lOQVBQUk9QUklBVEVfU09VUkNFX0NMQVNTKTsKKworICAgICAgICAvKiBSZW1vdmUgTVZJRCBMZW5ndGggZnJvbSB0b3RhbCBsZW5ndGggKi8KKyAgICAgICAgdmxlbiA9IChzaWduZWQgc2hvcnQpcm1mLT52bCAtIDQ7CisKKyAgICAgICAgLyogUG9pbnQgdG8gRmlyc3QgU1ZJRCAqLworICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisKKyAgICAgICAgLyogU2VhcmNoIGZvciBBcHByb3ByaWF0ZSBTVklEJ3MgKi8KKyAgICAgICAgd2hpbGUoKHZsZW4gPiAwKSAmJiAocmNvZGUgPT0gUE9TSVRJVkVfQUNLKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChyc3YtPnN2aSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZSQU1FX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2ZWN0b3JzIHw9IEZfRlJBTUVfRk9SV0FSRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfZnJhbWVfZm9yd2FyZChkZXYsIHJzdiwgCisJCQkJCXJtZi0+ZGNfc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorCQkgKi8KKyAgICAgICAgICAgICAgICBpZigodmxlbiAtPSByc3YtPnN2bCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHJjb2RlID09IFBPU0lUSVZFX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqIGlzIGxhcmdlciB0aGVuIFNVTSBvZiBTViBsZW5ndGgncworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHZsZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworICAgICAgICAgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgICAgIAkvKiBMZXQgU2VuZGVyIEtub3cgaWYgRXhwZWN0ZWQgU1YgTWlzc2luZyAqLworICAgICAgICAgICAgICAgIAlpZigoc3ZlY3RvcnMgJiBSX1RYX0ZPUldBUkQpIF4gUl9UWF9GT1JXQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgCXJjb2RlID0gRV9NSVNTSU5HX1NVQl9WRUNUT1I7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmNvZGUpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jjdl9ycV9hZGRyX3N0YXRlX2F0dGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgX191MTYgKmNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3Y7CisgICAgICAgIHNpZ25lZCBzaG9ydCB2bGVuOworICAgICAgICBfX3UxNiByY29kZSA9IFBPU0lUSVZFX0FDSzsKKyAgICAgICAgdW5zaWduZWQgaW50IHN2ZWN0b3JzID0gRl9OT19TVUJfVkVDVE9SU19GT1VORDsKKworICAgICAgICAvKiBSZW1vdmUgTVZJRCBMZW5ndGggZnJvbSB0b3RhbCBsZW5ndGggKi8KKyAgICAgICAgdmxlbiA9IChzaWduZWQgc2hvcnQpcm1mLT52bCAtIDQ7CisKKyAgICAgICAgLyogUG9pbnQgdG8gRmlyc3QgU1ZJRCAqLworICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisKKyAgICAgICAgLyogU2VhcmNoIGZvciBBcHByb3ByaWF0ZSBTVklEJ3MgKi8KKyAgICAgICAgd2hpbGUoKHZsZW4gPiAwKSAmJiAocmNvZGUgPT0gUE9TSVRJVkVfQUNLKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChyc3YtPnN2aSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPUlJFTEFUT1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2ZWN0b3JzIHw9IEZfQ09SUkVMQVRPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfY29ycihkZXYsIHJzdiwgY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfU1VCX1ZFQ1RPUl9VTktOT1dOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBMZXQgU2VuZGVyIEtub3cgaWYgU1VNIG9mIFNWIGxlbmd0aCdzIGlzCisgICAgICAgICAgICAgICAgICogbGFyZ2VyIHRoZW4gbGVuZ3RoIGluIE1WSUQgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoKHZsZW4gLT0gcnN2LT5zdmwpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworCisgICAgICAgICAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilyc3YgKyByc3YtPnN2bCk7CisgICAgICAgIH0KKworICAgICAgICBpZihyY29kZSA9PSBQT1NJVElWRV9BQ0spCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMZXQgU2VuZGVyIEtub3cgaWYgTVZJRCBsZW5ndGggZmllbGQKKyAgICAgICAgICAgICAgICAgKiBpcyBsYXJnZXIgdGhlbiBTVU0gb2YgU1YgbGVuZ3RoJ3MKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZih2bGVuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKyAgICAgICAgICAgICAgICBlbHNlCisJCXsKKyAgICAgICAgICAgICAgICAJLyogTGV0IFNlbmRlciBLbm93IGlmIEV4cGVjdGVkIFNWSUQgTWlzc2luZyAqLworICAgICAgICAgICAgICAgIAlpZigoc3ZlY3RvcnMgJiBSX1JRX0FUVENIX1NUQVRFX0FERFIpIAorCQkJCV4gUl9SUV9BVFRDSF9TVEFURV9BRERSKQorICAgICAgICAgICAgICAgICAgICAgICAgCXJjb2RlID0gRV9NSVNTSU5HX1NVQl9WRUNUT1I7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfdW5rbm93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKworICAgICAgICAqY29ycmVsYXRvciA9IDA7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQ09SUkVMQVRPUiBmb3IgUlNQIHRvIFVOS05PV04gKi8KKyAgICAgICAgd2hpbGUoKHZsZW4gPiAwKSAmJiAoKmNvcnJlbGF0b3IgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zZXRfY29ycihkZXYsIHJzdiwgY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2bGVuIC09IHJzdi0+c3ZsOworICAgICAgICAgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcnN2ICsgcnN2LT5zdmwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChFX1VOUkVDT0dOSVpFRF9WRUNUT1JfSUQpOworfQorCisvKgorICogUmVzZXQgdGhlIDgyNSBOSUMgYW5kIGV4aXQgdzoKKyAqIDEuIFRoZSBOSUMgcmVzZXQgY2xlYXJlZCAobm9uLXJlc2V0IHN0YXRlKSwgaGFsdGVkIGFuZCB1bi1pbml0aWFsaXplZC4KKyAqIDIuIFRJTlQgbWFza2VkLgorICogMy4gQ0JVU1kgbWFza2VkLgorICogNC4gVElOVCBjbGVhci4KKyAqIDUuIENCVVNZIGNsZWFyLgorICovCitzdGF0aWMgaW50IHNtY3RyX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAgICAgLyogUmVzZXRpbmcgdGhlIE5JQyB3aWxsIHB1dCBpdCBpbiBhIGhhbHRlZCBhbmQgdW4taW5pdGlhbGl6ZWQgc3RhdGUuICovICAgICAgICBzbWN0cl9zZXRfdHJjX3Jlc2V0KGlvYWRkcik7CisgICAgICAgIG1kZWxheSgyMDApOyAvKiB+MiBtcyAqLworCisgICAgICAgIHNtY3RyX2NsZWFyX3RyY19yZXNldChpb2FkZHIpOworICAgICAgICBtZGVsYXkoMjAwKTsgLyogfjIgbXMgKi8KKworICAgICAgICAvKiBSZW1vdmUgYW55IGxhdGNoZWQgaW50ZXJydXB0cyB0aGF0IG9jY3VycmVkIHByaW9yIHRvIHJlc2V0aW5nIHRoZQorICAgICAgICAgKiBhZGFwdGVyIG9yIHBvc3NpYmlseSBjYXVzZWQgYnkgbGluZSBnbGl0Y2hlcyBkdWUgdG8gdGhlIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgb3V0Yih0cC0+dHJjX21hc2sgfCBDU1JfQ0xSVElOVCB8IENTUl9DTFJDQlVTWSwgaW9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYodHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdICE9IDAKKyAgICAgICAgICAgICAgICAmJiB0cC0+dHhfcXVldWVfc3RhdHVzW3F1ZXVlXSA9PSBOT1RfVFJBTlNNSVRJTkcpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW3F1ZXVlXSA9IFRSQU5TTUlUSU5HOworICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV90eF9mY2JfY21kKGRldiwgcXVldWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZ1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICAvKiBDaGVjayBmb3IgcmluZ19zdGF0dXNfZmxhZzogd2hlbmV2ZXIgTU9OSVRPUl9TVEFURV9CSVQKKyAgICAgICAgICogQml0IGlzIHNldCwgY2hlY2sgdmFsdWUgb2YgbW9uaXRvcl9zdGF0ZSwgb25seSB0aGVuIHdlCisgICAgICAgICAqIGVuYWJsZSBhbmQgc3RhcnQgdHJhbnNtaXQvcmVjZWl2ZSB0aW1lb3V0IChpZiBhbmQgb25seQorICAgICAgICAgKiBpZiBpdCBpcyBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURSBvciBNU19TVEFOREJZX01PTklUT1JfU1RBVEUpCisgICAgICAgICAqLworICAgICAgICBpZih0cC0+cmluZ19zdGF0dXNfZmxhZ3MgPT0gTU9OSVRPUl9TVEFURV9DSEFOR0VEKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKHRwLT5tb25pdG9yX3N0YXRlID09IE1TX0FDVElWRV9NT05JVE9SX1NUQVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRwLT5tb25pdG9yX3N0YXRlID09IE1TX1NUQU5EQllfTU9OSVRPUl9TVEFURSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGVfcmVhZHkgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgYWRhcHRlciBpcyBOT1QgaW4gZWl0aGVyIGFjdGl2ZSBtb25pdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBzdGFuZGJ5IG1vbml0b3Igc3RhdGUgPT4gRGlzYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdHJhbnNtaXQvcmVjZWl2ZSB0aW1lb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZV9yZWFkeSA9IDA7CisKKwkJCS8qIFJpbmcgc3BlZWQgcHJvYmxlbSwgc3dpdGNoaW5nIHRvIGF1dG8gbW9kZS4gKi8KKwkJCWlmKHRwLT5tb25pdG9yX3N0YXRlID09IE1TX01PTklUT1JfRlNNX0lOQUNUSVZFCisJCQkJJiYgIXRwLT5jbGVhbnVwKQorCQkJeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbmNvcnJlY3QgcmluZyBzcGVlZCBzd2l0Y2hpbmcuXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNtY3RyX3NldF9yaW5nX3NwZWVkKGRldik7CisJCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoISh0cC0+cmluZ19zdGF0dXNfZmxhZ3MgJiBSSU5HX1NUQVRVU19DSEFOR0VEKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICAgIHN3aXRjaCh0cC0+cmluZ19zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJJTkdfUkVDT1ZFUlk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUmluZyBSZWNvdmVyeVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFJJTkdfUkVDT1ZFUlk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lOR0xFX1NUQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU2luZ2xlIFN0YXRpbm9uXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gU0lOR0xFX1NUQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ09VTlRFUl9PVkVSRkxPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gQ09VTlRFUl9PVkVSRkxPVzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfUkVDRUlWRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUmVtb3ZlIFJlY2VpdmVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gUkVNT1ZFX1JFQ0VJVkVEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fUkVNT1ZBTF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvIFJlbW92ZSBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IEFVVE9fUkVNT1ZBTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBMT0JFX1dJUkVfRkFVTFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogTG9iZSBXaXJlIEZhdWx0XG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gTE9CRV9XSVJFX0ZBVUxUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TTUlUX0JFQUNPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdCBCZWFjb25cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBUUkFOU01JVF9CRUFDT047CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU09GVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTb2Z0IEVycm9yXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gU09GVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBIQVJEX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhcmQgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBIQVJEX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJR05BTF9MT1NTOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpZ25hbCBMb3NzXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gU0lHTkFMX0xPU1M7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biByaW5nIHN0YXR1cyBjaGFuZ2VcbiIsCisJCQkJZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yeF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHF1ZXVlLCBzdGF0dXMsIHJ4X3NpemUsIGVyciA9IDA7CisgICAgICAgIF9fdTggKnBidWZmOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yeF9mcmFtZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBxdWV1ZSA9IHRwLT5yZWNlaXZlX3F1ZXVlX251bWJlcjsKKworICAgICAgICB3aGlsZSgoc3RhdHVzID0gdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+ZnJhbWVfc3RhdHVzKSAhPSBTVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworCisgICAgICAgICAgICAgICAgaWYoKChzdGF0dXMgJiAweDAwN2YpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfRVJSX1BBQ0tFVFMpICE9IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyYW1lIGxlbmd0aCBsZXNzIHRoZSBDUkMgKDQgYnl0ZXMpICsgRlMgKDEgYnl0ZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ4X3NpemUgPSB0cC0+cnhfZmNiX2N1cnJbcXVldWVdLT5mcmFtZV9sZW5ndGggLSA1OworCisgICAgICAgICAgICAgICAgICAgICAgICBwYnVmZiA9IHNtY3RyX2dldF9yeF9wb2ludGVyKGRldiwgcXVldWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIHBidWZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogcGJ1ZmYgcG9pbnRzIHRvIGFkZHIgd2l0aGluIG9uZSBwYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwYnVmZiA9IChfX3U4ICopUEFHRV9QT0lOVEVSKHBidWZmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYocXVldWUgPT0gTk9OX01BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4X3NpemUpOworCQkJCWlmIChza2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXNrYl9wdXQoc2tiLCByeF9zaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KHNrYi0+ZGF0YSwgcGJ1ZmYsIHJ4X3NpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBVcGRhdGUgQ291bnRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXRwLT5NYWNTdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBLaWNrIHRoZSBwYWNrZXQgb24gdXAuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ldGlmX3J4KHNrYik7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJfSBlbHNlIHsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3Byb2Nlc3NfcnhfcGFja2V0KChNQUNfSEVBREVSICopcGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfc2l6ZSwgZGV2LCBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisgICAgICAgICAgICAgICAgc21jdHJfdXBkYXRlX3J4X2NoYWluKGRldiwgcXVldWUpOworCisgICAgICAgICAgICAgICAgaWYoZXJyICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX2RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBlcnI7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zZW5kX2RhdFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwKKyAgICAgICAgICAgICAgICBzaXplb2YoTUFDX0hFQURFUikpKSA9PSAoRkNCbG9jayAqKSgtMUwpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChPVVRfT0ZfUkVTT1VSQ0VTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgREFUIERhdGEgRmllbGRzLiAqLworICAgICAgICB0bWYgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+YWMgPSBNU0IoQUNfRkNfREFUKTsKKyAgICAgICAgdG1mLT5mYyA9IExTQihBQ19GQ19EQVQpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRtZi0+c2FbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgICAgICAgICAgICAgIHRtZi0+ZGFbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCisgICAgICAgIH0KKworICAgICAgICB0bWYtPnZjICAgICAgICA9IERBVDsKKyAgICAgICAgdG1mLT5kY19zYyAgICAgPSBEQ19SUyB8IFNDX1JTOworICAgICAgICB0bWYtPnZsICAgICAgICA9IDQ7CisgICAgICAgIHRtZi0+dmwgICAgICAgID0gU1dBUF9CWVRFUyh0bWYtPnZsKTsKKworICAgICAgICAvKiBTdGFydCBUcmFuc21pdC4gKi8KKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIC8qIFdhaXQgZm9yIFRyYW5zbWl0IHRvIENvbXBsZXRlICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkLiAqLworICAgICAgICBpZighKGZjYi0+ZnJhbWVfc3RhdHVzICYgIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgfHwgZmNiLT5mcmFtZV9zdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19FIHwgRkNCX1RYX0FDX0JJVFMpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChJTklUSUFMSVpFX0ZBSUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZS1hbGxvY2F0ZWQgVHggRkNCIGFuZCBGcmFtZSBCdWZmZXIKKyAgICAgICAgICogVGhlIEZDQiBtdXN0IGJlIGRlLWFsbG9jYXRlZCBtYW51YWxseSBpZiBleGVjdXRpbmcgd2l0aAorICAgICAgICAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBvdGhlciB3aXNlIHRoZSBJU1IgKExNX1NlcnZpY2VfRXZlbnRzKQorICAgICAgICAgKiB3aWxsIGRlLWFsbG9jYXRlIGl0IHdoZW4gdGhlIGludGVycnVwdCBvY2N1cnMuCisgICAgICAgICAqLworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgIHNtY3RyX3VwZGF0ZV90eF9jaGFpbihkZXYsIGZjYiwgTUFDX1FVRVVFKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBzbWN0cl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKyAgICAgICAgICogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisgICAgICAgICAqIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXNldHRpbmcgdGhlIHRva2VuIHJpbmcgYWRhcHRlciB0YWtlcyBhIGxvbmcgdGltZSBzbyBqdXN0CisgICAgICAgICAqIGZha2UgdHJhbnNtaXNzaW9uIHRpbWUgYW5kIGdvIG9uIHRyeWluZy4gT3VyIG93biB0aW1lb3V0CisgICAgICAgICAqIHJvdXRpbmUgaXMgaW4gc2t0cl90aW1lcl9jaGsoKQorICAgICAgICAgKi8KKyAgICAgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIEdldHMgc2tiIGZyb20gc3lzdGVtLCBxdWV1ZXMgaXQgYW5kIGNoZWNrcyBpZiBpdCBjYW4gYmUgc2VudAorICovCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2VuZF9wYWNrZXRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQmxvY2sgYSB0cmFuc21pdCBvdmVybGFwCisgICAgICAgICAqLworICAgICAgICAgCisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgICAgICBpZih0cC0+UXVldWVTa2IgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOyAgICAgLyogUmV0dXJuIHdpdGggdGJ1c3kgc2V0OiBxdWV1ZSBmdWxsICovCisKKyAgICAgICAgdHAtPlF1ZXVlU2tiLS07CisgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZ0cC0+U2VuZFNrYlF1ZXVlLCBza2IpOworICAgICAgICBzbWN0cl9oYXJkd2FyZV9zZW5kX3BhY2tldChkZXYsIHRwKTsKKyAgICAgICAgaWYodHAtPlF1ZXVlU2tiID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJTUFDX1NVQl9WRUNUT1IgKnRzdjsKKwlNQUNfSEVBREVSICp0bWY7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKwlfX3UzMiBpOworCWludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxNSkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NlbmRfbG9iZV9tZWRpYV90ZXN0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2Yoc3RydWN0IHRyaF9oZHIpCisgICAgICAgICAgICAgICAgKyBTX1dSQVBfREFUQSArIFNfV1JBUF9EQVRBKSkgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoT1VUX09GX1JFU09VUkNFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIERBVCBEYXRhIEZpZWxkcy4gKi8KKyAgICAgICAgdG1mID0gKE1BQ19IRUFERVIgKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyOworICAgICAgICB0bWYtPmFjID0gTVNCKEFDX0ZDX0xPQkVfTUVESUFfVEVTVCk7CisgICAgICAgIHRtZi0+ZmMgPSBMU0IoQUNfRkNfTE9CRV9NRURJQV9URVNUKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bWYtPmRhW2ldID0gMDsKKyAgICAgICAgICAgICAgICB0bWYtPnNhW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIHRtZi0+dmMgICAgICAgID0gTE9CRV9NRURJQV9URVNUOworICAgICAgICB0bWYtPmRjX3NjICAgICA9IERDX1JTIHwgU0NfUlM7CisgICAgICAgIHRtZi0+dmwgICAgICAgID0gNDsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2Vfd3JhcF9kYXRhKGRldiwgdHN2KTsKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV93cmFwX2RhdGEoZGV2LCB0c3YpOworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworCisgICAgICAgIC8qIFN0YXJ0IFRyYW5zbWl0LiAqLworICAgICAgICB0bWYtPnZsID0gU1dBUF9CWVRFUyh0bWYtPnZsKTsKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIC8qIFdhaXQgZm9yIFRyYW5zbWl0IHRvIENvbXBsZXRlLiAoMTAgbXMpLiAqLworICAgICAgICBmb3IoaT0wOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1kZWxheSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIEdPT0QgZnJhbWUgVHgnZWQgKi8KKyAgICAgICAgaWYoIShmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgfHwgZmNiLT5mcmFtZV9zdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19FIHwgRkNCX1RYX0FDX0JJVFMpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERlLWFsbG9jYXRlZCBUeCBGQ0IgYW5kIEZyYW1lIEJ1ZmZlcgorICAgICAgICAgKiBUaGUgRkNCIG11c3QgYmUgZGUtYWxsb2NhdGVkIG1hbnVhbGx5IGlmIGV4ZWN1dGluZyB3aXRoCisgICAgICAgICAqIGludGVycnVwdHMgZGlzYWJsZWQsIG90aGVyIHdpc2UgdGhlIElTUiAoTE1fU2VydmljZV9FdmVudHMpCisgICAgICAgICAqIHdpbGwgZGUtYWxsb2NhdGUgaXQgd2hlbiB0aGUgaW50ZXJydXB0IG9jY3Vycy4KKyAgICAgICAgICovCisgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXNbTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKyAgICAgICAgc21jdHJfdXBkYXRlX3R4X2NoYWluKGRldiwgZmNiLCBNQUNfUVVFVUUpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9ycHRfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX0NPUlJFTEFUT1IgKyBTX1BIWVNJQ0FMX0RST1AgKyBTX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MKKwkJKyBTX0FERFJFU1NfTU9ESUZFUiArIFNfR1JPVVBfQUREUkVTUyArIFNfRlVOQ1RJT05BTF9BRERSRVNTKSkKKwkJPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICB0bWYgCQk9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICAJPSBSUFRfQUREUjsKKyAgICAgICAgdG1mLT5kY19zYyAJPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgCT0gNDsKKworICAgICAgICBzbWN0cl9tYWtlXzgwMjVfaGRyKGRldiwgcm1mLCB0bWYsIEFDX0ZDX1JQVF9BRERSKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfY29ycihkZXYsIHRzdiwgY29ycmVsYXRvcik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfcGh5X2Ryb3BfbnVtKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9hZGRyX21vZChkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfZ3JvdXBfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfZnVuY3RfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuIChzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X2F0dGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX0hFQURFUiAqdG1mOworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2OworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkrIFNfQ09SUkVMQVRPUiArIFNfUFJPRFVDVF9JTlNUQU5DRV9JRCArIFNfRlVOQ1RJT05BTF9BRERSRVNTCisJCSsgU19BVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTICsgU19BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSkpCisJCT09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJQVF9BVFRDSDsKKyAgICAgICAgdG1mLT5kY19zYyA9IChybWYtPmRjX3NjICYgU0NfTUFTSykgPDwgNDsKKyAgICAgICAgdG1mLT52bCAgICA9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SUFRfQVRUQ0gpOworCisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgc21jdHJfbWFrZV9jb3JyKGRldiwgdHN2LCBjb3JyZWxhdG9yKTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9wcm9kdWN0X2lkKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9mdW5jdF9hZGRyKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9hdXRoX2Z1bmN0X2NsYXNzKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9hY2Nlc3NfcHJpKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworCisgICAgICAgIC8qIFN1YnRyYWN0IG91dCBNVklEIGFuZCBNVkwgd2hpY2ggaXMKKyAgICAgICAgICogaW5jbHVkZSBpbiBib3RoIHZsIGFuZCBNQUNfSEVBREVSCisgICAgICAgICAqLworLyogICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICAgICAgPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyAgICAgICAgZmNiLT5iZGJfcHRyLT5idWZmZXJfbGVuZ3RoID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisqLworICAgICAgICB0bWYtPnZsID0gU1dBUF9CWVRFUyh0bWYtPnZsKTsKKworICAgICAgICByZXR1cm4gKHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9ycHRfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiBjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCSsgU19DT1JSRUxBVE9SICsgU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIKKwkJKyBTX1JJTkdfU1RBVElPTl9TVEFUVVMgKyBTX1NUQVRJT05fSURFTlRJRkVSKSkKKwkJPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICB0bWYgCSAgID0gKE1BQ19IRUFERVIgKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyOworICAgICAgICB0bWYtPnZjICAgID0gUlBUX1NUQVRFOworICAgICAgICB0bWYtPmRjX3NjID0gKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSA8PCA0OworICAgICAgICB0bWYtPnZsICAgID0gNDsKKworICAgICAgICBzbWN0cl9tYWtlXzgwMjVfaGRyKGRldiwgcm1mLCB0bWYsIEFDX0ZDX1JQVF9TVEFURSk7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0bWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworICAgICAgICBzbWN0cl9tYWtlX2NvcnIoZGV2LCB0c3YsIGNvcnJlbGF0b3IpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX3Jpbmdfc3RhdGlvbl92ZXJzaW9uKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fc3RhdHVzKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9zdGF0aW9uX2lkKGRldiwgdHN2KTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworCisgICAgICAgIC8qIFN1YnRyYWN0IG91dCBNVklEIGFuZCBNVkwgd2hpY2ggaXMKKyAgICAgICAgICogaW5jbHVkZSBpbiBib3RoIHZsIGFuZCBNQUNfSEVBREVSCisgICAgICAgICAqLworLyogICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICAgICAgPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyAgICAgICAgZmNiLT5iZGJfcHRyLT5idWZmZXJfbGVuZ3RoID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisqLworICAgICAgICB0bWYtPnZsID0gU1dBUF9CWVRFUyh0bWYtPnZsKTsKKworICAgICAgICByZXR1cm4gKHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9ycHRfdHhfZm9yd2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfSEVBREVSICpybWYsIF9fdTE2IHR4X2ZzdGF0dXMpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX1RSQU5TTUlUX1NUQVRVU19DT0RFKSkgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICB0bWYgCSAgID0gKE1BQ19IRUFERVIgKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyOworICAgICAgICB0bWYtPnZjICAgID0gUlBUX1RYX0ZPUldBUkQ7CisgICAgICAgIHRtZi0+ZGNfc2MgPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgIHNtY3RyX21ha2VfODAyNV9oZHIoZGV2LCBybWYsIHRtZiwgQUNfRkNfUlBUX1RYX0ZPUldBUkQpOworCisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgc21jdHJfbWFrZV90eF9zdGF0dXNfY29kZShkZXYsIHRzdiwgdHhfZnN0YXR1cyk7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuKHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9yc3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiByY29kZSwgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX0hFQURFUiAqdG1mOworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2OworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkrIFNfQ09SUkVMQVRPUiArIFNfUkVTUE9OU0VfQ09ERSkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJTUDsKKyAgICAgICAgdG1mLT5kY19zYyA9IChybWYtPmRjX3NjICYgU0NfTUFTSykgPDwgNDsKKyAgICAgICAgdG1mLT52bCAgICA9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SU1ApOworCisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgc21jdHJfbWFrZV9jb3JyKGRldiwgdHN2LCBjb3JyZWxhdG9yKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCXVuc2lnbmVkIGludCBpLCBjb3VudCA9IDA7CisJX191MTYgZnN0YXR1czsKKwlpbnQgZXJyOworCisgICAgICAgIGRvIHsKKyAgICAgICAgCWlmKCgoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCQkrIFNfUFJPRFVDVF9JTlNUQU5DRV9JRCArIFNfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUworCQkJKyBTX1JJTkdfU1RBVElPTl9WRVJTSU9OX05VTUJFUiArIFNfQUREUkVTU19NT0RJRkVSKSkKKwkJCT09IChGQ0Jsb2NrICopKC0xTCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgICAgICAgICB0bWYtPnZjICAgID0gUlFfSU5JVDsKKyAgICAgICAgICAgICAgICB0bWYtPmRjX3NjID0gRENfUlBTIHwgU0NfUlM7CisgICAgICAgICAgICAgICAgdG1mLT52bCAgICA9IDQ7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9tYWtlXzgwMjVfaGRyKGRldiwgTlVMTCwgdG1mLCBBQ19GQ19SUV9JTklUKTsKKworICAgICAgICAgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgICAgICAgICBzbWN0cl9tYWtlX3Byb2R1Y3RfaWQoZGV2LCB0c3YpOworCisgICAgICAgICAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgICAgICAgICBzbWN0cl9tYWtlX3Vwc3RyZWFtX25laWdoYm9yX2FkZHIoZGV2LCB0c3YpOworCisgICAgICAgICAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgICAgICAgICBzbWN0cl9tYWtlX3Jpbmdfc3RhdGlvbl92ZXJzaW9uKGRldiwgdHN2KTsKKworICAgICAgICAgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgICAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV9hZGRyX21vZChkZXYsIHRzdik7CisKKyAgICAgICAgICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworCisgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb3V0IE1WSUQgYW5kIE1WTCB3aGljaCBpcworICAgICAgICAgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgICA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworICAgICAgICAgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgICAgICAgICB0bWYtPnZsID0gU1dBUF9CWVRFUyh0bWYtPnZsKTsKKworICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgVHJhbnNtaXQgdG8gQ29tcGxldGUgKi8KKyAgICAgIAkJZm9yKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgCisJCXsKKyAgICAgICAgICAJCWlmKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkKKyAgICAgICAgICAgICAgCQkJYnJlYWs7CisgICAgICAgICAgCQltZGVsYXkoMSk7CisgICAgICAJCX0KKworICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIEdPT0QgZnJhbWUgVHgnZWQgKi8KKyAgICAgICAgICAgICAgICBmc3RhdHVzID0gZmNiLT5mcmFtZV9zdGF0dXM7CisKKyAgICAgICAgICAgICAgICBpZighKGZzdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKworICAgICAgICAgICAgICAgIGlmKCEoZnN0YXR1cyAmIEZDQl9UWF9TVEFUVVNfRSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworCisgICAgICAgICAgICAgICAgLyogRGUtYWxsb2NhdGVkIFR4IEZDQiBhbmQgRnJhbWUgQnVmZmVyCisgICAgICAgICAgICAgICAgICogVGhlIEZDQiBtdXN0IGJlIGRlLWFsbG9jYXRlZCBtYW51YWxseSBpZiBleGVjdXRpbmcgd2l0aAorICAgICAgICAgICAgICAgICAqIGludGVycnVwdHMgZGlzYWJsZWQsIG90aGVyIHdpc2UgdGhlIElTUiAoTE1fU2VydmljZV9FdmVudHMpCisgICAgICAgICAgICAgICAgICogd2lsbCBkZS1hbGxvY2F0ZSBpdCB3aGVuIHRoZSBpbnRlcnJ1cHQgb2NjdXJzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXNbTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICBzbWN0cl91cGRhdGVfdHhfY2hhaW4oZGV2LCBmY2IsIE1BQ19RVUVVRSk7CisgICAgICAgIH0gd2hpbGUoY291bnQgPCA0ICYmICgoZnN0YXR1cyAmIEZDQl9UWF9BQ19CSVRTKSBeIEZDQl9UWF9BQ19CSVRTKSk7CisKKwlyZXR1cm4gKHNtY3RyX2pvaW5fY29tcGxldGVfc3RhdGUoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgKnR4X2ZzdGF0dXMpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgRkNCbG9jayAqZmNiOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIEVORCBQT0lOVCBvZiB0aGUgVHJhbnNtaXQgRm9yd2FyZCBDaGFpbi4gKi8KKyAgICAgICAgaWYocm1mLT52bCA8PSAxOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICAgIC8qIEFsbG9jYXRlIFRyYW5zbWl0IEZDQiBvbmx5IGJ5IHJlcXVlc3RpbmcgMCBieXRlcworICAgICAgICAgKiBvZiBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICovCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCAwKSkgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICAgIC8qIFNldCBwb2ludGVyIHRvIFRyYW5zbWl0IEZyYW1lIEJ1ZmZlciB0byB0aGUgZGF0YQorICAgICAgICAgKiBwb3J0aW9uIG9mIHRoZSByZWNlaXZlZCBUWCBGb3J3YXJkIGZyYW1lLCBtYWtpbmcKKyAgICAgICAgICogc3VyZSB0byBza2lwIG92ZXIgdGhlIFZlY3RvciBDb2RlICh2YykgYW5kIFZlY3RvcgorICAgICAgICAgKiBsZW5ndGggKHZsKS4KKyAgICAgICAgICovCisgICAgICAgIGZjYi0+YmRiX3B0ci0+dHJjX2RhdGFfYmxvY2tfcHRyID0gVFJDX1BPSU5URVIoKF9fdTMyKXJtZiAKKwkJKyBzaXplb2YoTUFDX0hFQURFUikgKyAyKTsKKyAgICAgICAgZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0ciAgICAgPSAoX191MTYgKikoKF9fdTMyKXJtZiAKKwkJKyBzaXplb2YoTUFDX0hFQURFUikgKyAyKTsKKworICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICAgICAgICAgICA9IHJtZi0+dmwgLSA0IC0gMjsKKyAgICAgICAgZmNiLT5iZGJfcHRyLT5idWZmZXJfbGVuZ3RoICAgICAgPSBybWYtPnZsIC0gNCAtIDI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3RyY19zZW5kX3BhY2tldChkZXYsIGZjYiwgTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIC8qIFdhaXQgZm9yIFRyYW5zbWl0IHRvIENvbXBsZXRlICovCisgICAJZm9yKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgCisJeworICAgICAgIAkJaWYoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAJCWJyZWFrOworICAgICAgICAJbWRlbGF5KDEpOworICAgCX0KKworICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkICovCisgICAgICAgIGlmKCEoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChkZXYsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAJCWZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspIAorCQl7CisgICAgICAgICAgCQlpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgIAkJCWJyZWFrOworICAgICAgICAJCW1kZWxheSgxKTsKKyAgICAgIAkJfQorCisgICAgICAgICAgICAgICAgaWYoIShmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIQVJEV0FSRV9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgKnR4X2ZzdGF0dXMgPSBmY2ItPmZyYW1lX3N0YXR1czsKKworICAgICAgICByZXR1cm4gKEFfRlJBTUVfV0FTX0ZPUldBUkRFRCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfYWNjZXNzX3ByaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIHRwLT5hdXRob3JpemVkX2FjY2Vzc19wcmlvcml0eSA9IChyc3YtPnN2dlswXSA8PCA4IHwgcnN2LT5zdnZbMV0pOworCisgICAgICAgIHJldHVybiAoUE9TSVRJVkVfQUNLKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19BVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgdHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3NlcyA9IChyc3YtPnN2dlswXSA8PCA4IHwgcnN2LT5zdnZbMV0pOworCisgICAgICAgIHJldHVybiAoUE9TSVRJVkVfQUNLKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfY29ycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqcnN2LAorICAgICAgICBfX3UxNiAqY29ycmVsYXRvcikKK3sKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19DT1JSRUxBVE9SKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgKmNvcnJlbGF0b3IgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2Vycm9yX3RpbWVyX3ZhbHVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YpCit7CisJX191MTYgZXJyX3R2YWw7CisJaW50IGVycjsKKworICAgICAgICBpZihyc3YtPnN2bCAhPSBTX0VSUk9SX1RJTUVSX1ZBTFVFKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgZXJyX3R2YWwgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKSoxMDsKKworICAgICAgICBzbWN0cl9pc3N1ZV93cml0ZV93b3JkX2NtZChkZXYsIFJXX1RFUl9USFJFU0hPTEQsICZlcnJfdHZhbCk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2ZyYW1lX2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdiwgX191OCBkY19zYykKK3sKKyAgICAgICAgaWYoKHJzdi0+c3ZsIDwgMikgfHwgKHJzdi0+c3ZsID4gU19GUkFNRV9GT1JXQVJEKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIGlmKChkY19zYyAmIERDX01BU0spICE9IERDX0NSUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHJzdi0+c3ZsID49IDIgJiYgcnN2LT5zdmwgPCAyMCkKKyAgICAgICAgICAgICAgICAJcmV0dXJuIChFX1RSQU5TTUlUX0ZPUldBUkRfSU5WQUxJRCk7CisKKyAgICAgICAgICAgICAgICBpZigocnN2LT5zdnZbMF0gIT0gMCkgfHwgKHJzdi0+c3Z2WzFdICE9IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFX1RSQU5TTUlUX0ZPUldBUkRfSU5WQUxJRCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2xvY2FsX3JpbmdfbnVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihyc3YtPnN2bCAhPSBTX0xPQ0FMX1JJTkdfTlVNQkVSKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgaWYodHAtPnB0cl9sb2NhbF9yaW5nX251bSkKKyAgICAgICAgICAgICAgICAqKF9fdTE2ICopKHRwLT5wdHJfbG9jYWxfcmluZ19udW0pIAorCQkJPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbWN0cl9zZXRfY3RybF9hdHRlbnRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAgICAgaWYodHAtPmJpY190eXBlID09IEJJQ181ODVfQ0hJUCkKKyAgICAgICAgICAgICAgICBvdXRiKCh0cC0+dHJjX21hc2sgfCBIV1JfQ0EpLCBpb2FkZHIgKyBIV1IpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRiKCh0cC0+dHJjX21hc2sgfCBDU1JfQ0EpLCBpb2FkZHIgKyBDU1IpOworICAgICAgICAgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc21jdHJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zZXRfbXVsdGljYXN0X2xpc3RcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9wYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTggKmJ1ZikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3U4IGFtYXNrOworICAgICAgICBfX3UzMiB0cHRyOworCisgICAgICAgIHRwdHIgPSAoX191MzIpYnVmIC0gKF9fdTMyKXRwLT5yYW1fYWNjZXNzOworICAgICAgICBhbWFzayA9IChfX3U4KSgodHB0ciAmIFBSX1BBR0VfTUFTSykgPj4gOCk7CisgICAgICAgIG91dGIoYW1hc2ssIGRldi0+YmFzZV9hZGRyICsgUFIpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3BoeV9kcm9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICpyc3YpCit7CisJaW50IGVycjsKKworICAgICAgICBpZihyc3YtPnN2bCAhPSBTX1BIWVNJQ0FMX0RST1ApCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SKTsKKworICAgICAgICBzbWN0cl9pc3N1ZV93cml0ZV9ieXRlX2NtZChkZXYsIFJXX1BIWVNJQ0FMX0RST1BfTlVNQkVSLCAmcnN2LT5zdnZbMF0pOworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHJldHVybiAoUE9TSVRJVkVfQUNLKTsKK30KKworLyogUmVzZXQgdGhlIHJpbmcgc3BlZWQgdG8gdGhlIG9wcG9zaXRlIG9mIHdoYXQgaXQgd2FzLiBUaGlzIGF1dG8tcGlsb3QKKyAqIG1vZGUgcmVxdWlyZXMgYSBjb21wbGV0ZSByZXNldCBhbmQgcmUtaW5pdCBvZiB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBzbWN0cl9zZXRfcmluZ19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworICAgICAgICBpZih0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9VVFBfMTYpCisgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlID0gTUVESUFfVVRQXzE2OworCisgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIC8qIFJlLUluaXRpYWxpemUgYWRhcHRlcidzIGludGVybmFsIHJlZ2lzdGVycyAqLworICAgICAgICBzbWN0cl9yZXNldF9hZGFwdGVyKGRldik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2luaXRfY2FyZF9yZWFsKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBzbWN0cl9lbmFibGVfYmljX2ludChkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChkZXYsIFRSQ19JTlRFUlJVUFRfRU5BQkxFX01BU0spKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfcnhfbG9va19haGVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHN3b3JkLCByd29yZDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2V0X3J4X2xvb2tfYWhlYWRfZmxhZ1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB0cC0+YWRhcHRlcl9mbGFncyAmPSB+KEZPUkNFRF8xNkJJVF9NT0RFKTsKKyAgICAgICAgdHAtPmFkYXB0ZXJfZmxhZ3MgfD0gUlhfVkFMSURfTE9PS0FIRUFEOworCisgICAgICAgIGlmKHRwLT5hZGFwdGVyX2J1cyA9PSBCVVNfSVNBMTZfVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3b3JkID0gKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpKTsKKyAgICAgICAgICAgICAgICAqKChfX3UxNiAqKSh0cC0+cmFtX2FjY2VzcykpID0gMHgxMjM0OworCisgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgIHJ3b3JkID0gKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpKTsKKyAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKworICAgICAgICAgICAgICAgIGlmKHJ3b3JkICE9IDB4MTIzNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5hZGFwdGVyX2ZsYWdzIHw9IEZPUkNFRF8xNkJJVF9NT0RFOworCisgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpKSA9IHN3b3JkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfdHJjX3Jlc2V0KGludCBpb2FkZHIpCit7CisgICAgICAgIF9fdTggcjsKKworICAgICAgICByID0gaW5iKGlvYWRkciArIE1TUik7CisgICAgICAgIG91dGIoTVNSX1JTVCB8IHIsIGlvYWRkciArIE1TUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpZiB0aGUgYWRhcHRlciBpcyBidXN5IG9yIG5vdC4KKyAqLworc3RhdGljIGludCBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIF9fdTE2IGNvbW1hbmQsIF9fdTE2IHN1YmNvbW1hbmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGVycjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2V0dXBfc2luZ2xlX2NtZFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9ICh1bnNpZ25lZCBpbnQpc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICAgPSAwOworICAgICAgICB0cC0+YWNiX2hlYWQtPmNtZCAgICAgICAgICAgICAgID0gY29tbWFuZDsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5zdWJjbWQgICAgICAgICAgICA9IHN1YmNvbW1hbmQ7CisKKyAgICAgICAgZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoZGV2KTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUgY2FsbGVkIHdpdGggdGhlIGFkYXB0ZXIgYnVzeS4KKyAqLworc3RhdGljIGludCBzbWN0cl9zZXR1cF9zaW5nbGVfY21kX3dfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5jbWRfZG9uZV9zdGF0dXMgICA9IEFDQl9DT01NQU5EX05PVF9ET05FOworICAgICAgICB0cC0+YWNiX2hlYWQtPmNtZCAgICAgICAgICAgICAgID0gY29tbWFuZDsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5zdWJjbWQgICAgICAgICAgICA9IHN1YmNvbW1hbmQ7CisgICAgICAgIHRwLT5hY2JfaGVhZC0+ZGF0YV9vZmZzZXRfbG8KKyAgICAgICAgICAgICAgICA9IChfX3UxNilUUkNfUE9JTlRFUih0cC0+bWlzY19jb21tYW5kX2RhdGEpOworCisgICAgICAgIHJldHVybihzbWN0cl9pc3N1ZV9yZXN1bWVfYWNiX2NtZChkZXYpKTsKK30KKworc3RhdGljIGNoYXIgKnNtY3RyX21hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBzaXplKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGNoYXIgKm07CisKKyAgICAgICAgbSA9IChjaGFyICopKHRwLT5yYW1fYWNjZXNzICsgdHAtPnNoX21lbV91c2VkKTsKKyAgICAgICAgdHAtPnNoX21lbV91c2VkICs9IChfX3UzMilzaXplOworCisgICAgICAgIHJldHVybiAobSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc3RhdHVzX2NoZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3N0YXR1c19jaGdcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgc3dpdGNoKHRwLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QRU46CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZHJpdmVuIG9wZW4oKSBjb21wbGV0aW9uLiBYWFggKi8KKyAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NfMCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Z3JvdXBfYWRkcmVzc1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Z3JvdXBfYWRkcmVzc1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX29wZW5fdHIoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzdGF0dXMgY2hhbmdlIHVua25vd24gJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgdHAtPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfdHJjX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEZDQmxvY2sgKmZjYiwKKyAgICAgICAgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3RyY19zZW5kX3BhY2tldFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBmY2ItPmluZm8gPSBGQ0JfQ0hBSU5fRU5EIHwgRkNCX0VOQUJMRV9URlM7CisgICAgICAgIGlmKHRwLT5udW1fdHhfZmNic1txdWV1ZV0gIT0gMSkKKyAgICAgICAgICAgICAgICBmY2ItPmJhY2tfcHRyLT5pbmZvID0gRkNCX0lOVEVSUlVQVF9FTkFCTEUgfCBGQ0JfRU5BQkxFX1RGUzsKKworICAgICAgICBpZih0cC0+dHhfcXVldWVfc3RhdHVzW3F1ZXVlXSA9PSBOT1RfVFJBTlNNSVRJTkcpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW3F1ZXVlXSA9IFRSQU5TTUlUSU5HOworICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV90eF9mY2JfY21kKGRldiwgcXVldWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgX191MTYgc21jdHJfdHhfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191MTYgc3RhdHVzLCBlcnIgPSAwOworICAgICAgICBpbnQgY3N0YXR1czsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfdHhfY29tcGxldGVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgd2hpbGUoKHN0YXR1cyA9IHRwLT50eF9mY2JfZW5kW3F1ZXVlXS0+ZnJhbWVfc3RhdHVzKSAhPSBTVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoc3RhdHVzICYgMHg3ZTAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBIQVJEV0FSRV9GQUlMRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdXBkYXRlX3R4X2NoYWluKGRldiwgdHAtPnR4X2ZjYl9lbmRbcXVldWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICBpZih0cC0+bW9kZV9iaXRzICYgVU1BQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKHN0YXR1cyAmIChGQ0JfVFhfU1RBVFVTX0FSMSB8IEZDQl9UWF9TVEFUVVNfQVIyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBOT19TVUNIX0RFU1RJTkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHN0YXR1cyAmIChGQ0JfVFhfU1RBVFVTX0NSMSB8IEZDQl9UWF9TVEFUVVNfQ1IyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0YXR1cyA9IERFU1RfT1VUX09GX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzICYgRkNCX1RYX1NUQVRVU19FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0YXR1cyA9IE1BWF9DT0xMSVNJT05TOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBTVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBTVUNDRVNTOworCisgICAgICAgICAgICAgICAgaWYocXVldWUgPT0gQlVHX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbWN0cl90eF9tb3ZlX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKnBidWZmLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IHJhbV91c2FibGU7CisgICAgICAgIF9fdTMyIGZsZW4sIGxlbiwgb2Zmc2V0ID0gMDsKKyAgICAgICAgX191OCAqZnJhZywgKnBhZ2U7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3R4X21vdmVfZnJhbWVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgcmFtX3VzYWJsZSA9ICgodW5zaWduZWQgaW50KXRwLT5yYW1fdXNhYmxlKSA8PCAxMDsKKyAgICAgICAgZnJhZyAgICAgICA9IHNrYi0+ZGF0YTsKKyAgICAgICAgZmxlbiAgICAgICA9IHNrYi0+bGVuOworCisgICAgICAgIHdoaWxlKGZsZW4gPiAwICYmIGJ5dGVzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgcGJ1ZmYpOworCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gU01DX1BBR0VfT0ZGU0VUKHBidWZmKTsKKworICAgICAgICAgICAgICAgIGlmKG9mZnNldCArIGZsZW4gPiByYW1fdXNhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmFtX3VzYWJsZSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBmbGVuOworCisgICAgICAgICAgICAgICAgaWYobGVuID4gYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBieXRlczsKKworICAgICAgICAgICAgICAgIHBhZ2UgPSAoY2hhciAqKSAob2Zmc2V0ICsgdHAtPnJhbV9hY2Nlc3MpOworICAgICAgICAgICAgICAgIG1lbWNweShwYWdlLCBmcmFnLCBsZW4pOworCisgICAgICAgICAgICAgICAgZmxlbiAtPWxlbjsKKyAgICAgICAgICAgICAgICBieXRlcyAtPSBsZW47CisgICAgICAgICAgICAgICAgZnJhZyArPSBsZW47CisgICAgICAgICAgICAgICAgcGJ1ZmYgKz0gbGVuOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyogVXBkYXRlIHRoZSBlcnJvciBzdGF0aXN0aWMgY291bnRlcnMgZm9yIHRoaXMgYWRhcHRlci4gKi8KK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX2Vycl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHN0cnVjdCB0cl9zdGF0aXN0aWNzICp0c3RhdCA9ICZ0cC0+TWFjU3RhdDsKKworICAgICAgICBpZih0c3RhdC0+aW50ZXJuYWxfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5pbnRlcm5hbF9lcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMCkgJiAweDAwZmY7CisKKyAgICAgICAgaWYodHN0YXQtPmxpbmVfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5saW5lX2Vycm9ycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDApID4+IDg7CisKKyAgICAgICAgaWYodHN0YXQtPkFfQ19lcnJvcnMpCisgICAgICAgICAgICAgICAgdHN0YXQtPkFfQ19lcnJvcnMgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyAxKSAmIDB4MDBmZjsKKworICAgICAgICBpZih0c3RhdC0+YnVyc3RfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5idXJzdF9lcnJvcnMgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyAxKSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT5hYm9ydF9kZWxpbWl0ZXJzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5hYm9ydF9kZWxpbWl0ZXJzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMikgPj4gODsKKworICAgICAgICBpZih0c3RhdC0+cmVjdl9jb25nZXN0X2NvdW50KQorICAgICAgICAgICAgICAgIHRzdGF0LT5yZWN2X2Nvbmdlc3RfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMykgJiAweDAwZmY7CisKKyAgICAgICAgaWYodHN0YXQtPmxvc3RfZnJhbWVzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5sb3N0X2ZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyAzKSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT5mcmVxdWVuY3lfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5mcmVxdWVuY3lfZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgNCkgJiAweDAwZmY7CisKKyAgICAgICAgaWYodHN0YXQtPmZyYW1lX2NvcGllZF9lcnJvcnMpCisgICAgICAgICAgICAgICAgIHRzdGF0LT5mcmFtZV9jb3BpZWRfZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDQpID4+IDg7CisKKyAgICAgICAgaWYodHN0YXQtPnRva2VuX2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+dG9rZW5fZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgNSkgPj4gODsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3VwZGF0ZV9yeF9jaGFpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisgICAgICAgIEJEQmxvY2sgKmJkYjsKKyAgICAgICAgX191MTYgc2l6ZSwgbGVuOworCisgICAgICAgIGZjYiA9IHRwLT5yeF9mY2JfY3VycltxdWV1ZV07CisgICAgICAgIGxlbiA9IGZjYi0+ZnJhbWVfbGVuZ3RoOworCisgICAgICAgIGZjYi0+ZnJhbWVfc3RhdHVzID0gMDsKKyAgICAgICAgZmNiLT5pbmZvID0gRkNCX0NIQUlOX0VORDsKKyAgICAgICAgZmNiLT5iYWNrX3B0ci0+aW5mbyA9IEZDQl9XQVJOSU5HOworCisgICAgICAgIHRwLT5yeF9mY2JfY3VycltxdWV1ZV0gPSB0cC0+cnhfZmNiX2N1cnJbcXVldWVdLT5uZXh0X3B0cjsKKworICAgICAgICAvKiB1cGRhdGUgUlggQkRCcyAqLworICAgICAgICBzaXplID0gKGxlbiA+PiBSWF9CREJfU0laRV9TSElGVCk7CisgICAgICAgIGlmKGxlbiAmIFJYX0RBVEFfQlVGRkVSX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICBzaXplICs9IHNpemVvZihCREJsb2NrKTsKKyAgICAgICAgc2l6ZSAmPSAoflJYX0JEQl9TSVpFX01BU0spOworCisgICAgICAgIC8qIGNoZWNrIGlmIHdyYXAgYXJvdW5kICovCisgICAgICAgIGJkYiA9IChCREJsb2NrICopKChfX3UzMikodHAtPnJ4X2JkYl9jdXJyW3F1ZXVlXSkgKyAoX191MzIpKHNpemUpKTsKKyAgICAgICAgaWYoKF9fdTMyKWJkYiA+PSAoX191MzIpdHAtPnJ4X2JkYl9lbmRbcXVldWVdKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYmRiID0gKEJEQmxvY2sgKikoKF9fdTMyKSh0cC0+cnhfYmRiX2hlYWRbcXVldWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAoX191MzIpKGJkYikgLSAoX191MzIpKHRwLT5yeF9iZGJfZW5kW3F1ZXVlXSkpOworICAgICAgICB9CisKKyAgICAgICAgYmRiLT5iYWNrX3B0ci0+aW5mbyA9IEJEQl9DSEFJTl9FTkQ7CisgICAgICAgIHRwLT5yeF9iZGJfY3VycltxdWV1ZV0tPmJhY2tfcHRyLT5pbmZvID0gQkRCX05PVF9DSEFJTl9FTkQ7CisgICAgICAgIHRwLT5yeF9iZGJfY3VycltxdWV1ZV0gPSBiZGI7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl91cGRhdGVfdHhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgRkNCbG9jayAqZmNiLAorICAgICAgICBfX3UxNiBxdWV1ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMjApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInNtY3RyX3VwZGF0ZV90eF9jaGFpblxuIik7CisKKyAgICAgICAgaWYodHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQVJEV0FSRV9GQUlMRUQpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSA8IGZjYi0+bWVtb3J5X2FsbG9jKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50eF9idWZmX3VzZWRbcXVldWVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSAtPSBmY2ItPm1lbW9yeV9hbGxvYzsKKworICAgICAgICAgICAgICAgIC8qIGlmIGFsbCB0cmFuc21pdCBidWZmZXIgYXJlIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIHNldCB0aGUgdHhfYnVmZl9jdXJyW10gdG8gdHhfYnVmZl9oZWFkW10KKyAgICAgICAgICAgICAgICAgKiBvdGhlcndpc2UsIHR4IGJ1ZmZlciB3aWxsIGJlIHNlZ3JlZ2F0ZSBhbmQgY2Fubm90CisgICAgICAgICAgICAgICAgICogYWNjb21tb2RhdGUgYW5kIGJ1ZmZlciBncmVhdGVyIHRoYW4gKGN1cnIgLSBoZWFkKSBhbmQKKyAgICAgICAgICAgICAgICAgKiAoZW5kIC0gY3Vycikgc2luY2Ugd2UgZG8gbm90IGFsbG93IHdyYXAgYXJvdW5kIGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYodHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50eF9idWZmX2N1cnJbcXVldWVdID0gdHAtPnR4X2J1ZmZfaGVhZFtxdWV1ZV07CisKKyAgICAgICAgICAgICAgICB0cC0+bnVtX3R4X2ZjYnNfdXNlZFtxdWV1ZV0tLTsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9lbmRbcXVldWVdID0gZmNiLT5uZXh0X3B0cjsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBzbWN0cl93YWl0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBsb29wX2NvdW50ID0gMHgyMDAwMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfd2FpdF9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgd2hpbGUobG9vcF9jb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICYgQUNCX0NPTU1BTkRfRE9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl1ZGVsYXkoMSk7CisgICAgICAgICAgICAgICAgbG9vcF9jb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9vcF9jb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybihIQVJEV0FSRV9GQUlMRUQpOworCisgICAgICAgIGlmKHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICYgMHhmZikKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFSRFdBUkVfRkFJTEVEKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCA9IDB4MjAwMDA7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgX191OCByOworCisgICAgICAgIGlmKHRwLT5iaWNfdHlwZSA9PSBCSUNfNTg1X0NISVApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSh0aW1lb3V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgSFdSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyICYgSFdSX0NCVVNZKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUodGltZW91dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIENTUik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigociAmIENTUl9DQlVTWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYodGltZW91dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQVJEV0FSRV9GQUlMRUQpOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZGV2X3NtY3RyW1NNQ1RSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGlvW1NNQ1RSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGlycVtTTUNUUl9NQVhfQURBUFRFUlNdOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocmluZ3NwZWVkLCBpbnQsIDApOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNldHVwX2NhcmQoaW50IG4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVycjsKKwkKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlkZXYtPmlycSA9IGlycVtuXTsKKwllcnIgPSBzbWN0cl9wcm9iZTEoZGV2LCBpb1tuXSk7CisJaWYgKGVycikgCisJCWdvdG8gb3V0OworCQkKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKKyBvdXQxOgorI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJeyBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJICBpZiAodHAtPnNsb3RfbnVtKQorCQltY2FfbWFya19hc191bnVzZWQodHAtPnNsb3RfbnVtKTsKKwl9CisjZW5kaWYKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU01DVFJfSU9fRVhURU5UKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisJCQkKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIGludCBpLCBmb3VuZCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBTTUNUUl9NQVhfQURBUFRFUlM7IGkrKykgeworCQlkZXYgPSBpb1swXT8gc2V0dXBfY2FyZChpKSA6IHNtY3RyX3Byb2JlKC0xKTsKKwkJaWYgKCFJU19FUlIoZGV2KSkgeworCQkJKytmb3VuZDsKKwkJCWRldl9zbWN0cltpXSA9IGRldjsKKwkJfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZvdW5kID8gMCA6IC1FTk9ERVY7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgU01DVFJfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9zbWN0cltpXTsKKworCQlpZiAoZGV2KSB7CisKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwkJCXsgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJaWYgKHRwLT5zbG90X251bSkKKwkJCQltY2FfbWFya19hc191bnVzZWQodHAtPnNsb3RfbnVtKTsKKwkJCX0KKyNlbmRpZgorCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJCQlpZiAoZGV2LT5pcnEpCisJCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKyAgICAgICAgfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA2YzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmgKQEAgLTAsMCArMSwxNTg4IEBACisvKiBzbWN0ci5oOiBTTUMgVG9rZW4gUmluZyBkcml2ZXIgaGVhZGVyIGZvciBMaW51eAorICoKKyAqIEF1dGhvcnM6CisgKiAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTUNUUl9ICisjZGVmaW5lIF9fTElOVVhfU01DVFJfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1BWF9UWF9RVUVVRSAxMAorCisjZGVmaW5lIFNNQ19IRUFERVJfU0laRSAxNAorCisjZGVmaW5lIFNNQ19QQUdFX09GRlNFVChYKSAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzKSAmIHRwLT5wYWdlX29mZnNldF9tYXNrKQorCisjZGVmaW5lIElOSVQgICAgICAgICAgICAweDBECisjZGVmaW5lIFJRX0FUVENIICAgICAgICAweDEwCisjZGVmaW5lIFJRX1NUQVRFICAgICAgICAweDBGCisjZGVmaW5lIFJRX0FERFIgICAgICAgICAweDBFCisjZGVmaW5lIENIR19QQVJNICAgICAgICAweDBDCisjZGVmaW5lIFJTUCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFRYX0ZPUldBUkQgICAgICAweDA5CisKKyNkZWZpbmUgQUNfRkNfREFUCSgoMzw8MTMpIHwgMSkKKyNkZWZpbmUgICAgICBEQVQgICAgICAgICAgICAgMHgwNworCisjZGVmaW5lIFJQVF9ORVdfTU9OICAgICAweDI1CisjZGVmaW5lIFJQVF9TVUFfQ0hHICAgICAweDI2CisjZGVmaW5lIFJQVF9BQ1RJVkVfRVJSICAweDI4CisjZGVmaW5lIFJQVF9OTl9JTkNNUCAgICAweDI3CisjZGVmaW5lIFJQVF9FUlJPUiAgICAgICAweDI5CisKKyNkZWZpbmUgUlFfSU5JVCAgICAgICAgIDB4MjAKKyNkZWZpbmUgUlBUX0FUVENIICAgICAgIDB4MjQKKyNkZWZpbmUgUlBUX1NUQVRFICAgICAgIDB4MjMKKyNkZWZpbmUgUlBUX0FERFIgICAgICAgIDB4MjIKKworI2RlZmluZSBQT1NJVElWRV9BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBX0ZSQU1FX1dBU19GT1JXQVJERUQgICAgICAgICAgIDB4ODg4OAorCisjZGVmaW5lICAgICAgR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweDJCCisjZGVmaW5lICAgICAgUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lICAgICAgQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkgICAgICAweDA3CisjZGVmaW5lICAgICAgQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAweDA2CisjZGVmaW5lICAgICAgRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAgICAweDJDCisjZGVmaW5lICAgICAgUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAweDI5CisjZGVmaW5lICAgICAgVFJBTlNNSVRfU1RBVFVTX0NPREUgICAgICAgICAgICAweDJBCisjZGVmaW5lICAgICAgSUJNX1BBU1NfU09VUkNFX0FERFIgICAgMHgwMQorI2RlZmluZSAgICAgIEFDX0ZDX1JQVF9UWF9GT1JXQVJEICAgICAgICAgICAgKCgwPDwxMykgfCAwKQorI2RlZmluZSAgICAgIEFDX0ZDX1JQVF9TVEFURSAgICAgICAgICAgICAgICAgKCgwPDwxMykgfCAwKQorI2RlZmluZSAgICAgIEFDX0ZDX1JQVF9BRERSICAgICAgICAgICAgICAgICAgKCgwPDwxMykgfCAwKQorI2RlZmluZSAgICAgIENPUlJFTEFUT1IgICAgICAgICAgICAgICAgICAgICAgMHgwOQorCisjZGVmaW5lIFBPU0lUSVZFX0FDSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfTUFDX0RBVEFfSU5DT01QTEVURSAgICAgICAgICAgMHg4MDAxICAgICAgICAgIC8qIG5vdCB1c2VkICAgICovCisjZGVmaW5lIEVfVkVDVE9SX0xFTkdUSF9FUlJPUiAgICAgICAgICAgMHg4MDAyICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfVU5SRUNPR05JWkVEX1ZFQ1RPUl9JRCAgICAgICAgMHg4MDAzICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfSU5BUFBST1BSSUFURV9TT1VSQ0VfQ0xBU1MgICAgMHg4MDA0ICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IgICAgICAgMHg4MDA1ICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfVFJBTlNNSVRfRk9SV0FSRF9JTlZBTElEICAgICAgMHg4MDA2ICAgICAgICAgIC8qIGRlZi4gYnkgSUJNICovCisjZGVmaW5lIEVfTUlTU0lOR19TVUJfVkVDVE9SICAgICAgICAgICAgMHg4MDA3ICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfU1VCX1ZFQ1RPUl9VTktOT1dOICAgICAgICAgICAgMHg4MDA4ICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfTUFDX0hFQURFUl9UT09fTE9ORyAgICAgICAgICAgMHg4MDA5ICAgICAgICAgIC8qICAgICAgICAgICAgICovCisjZGVmaW5lIEVfRlVOQ1RJT05fRElTQUJMRUQgICAgICAgICAgICAgMHg4MDBBICAgICAgICAgIC8qIG5vdCB1c2VkICAgICovCisKKyNkZWZpbmUgQV9GUkFNRV9XQVNfRk9SV0FSREVEICAgICAgICAgICAweDg4ODggICAgICAgICAgLyogdXNlZCBieSBzZW5kX1RYX0ZPUldBUkQgKi8KKworI2RlZmluZSBVUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgICAgIDB4MDIKKyNkZWZpbmUgTE9DQUxfUklOR19OVU1CRVIgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFTU0lHTl9QSFlTSUNBTF9EUk9QICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFUlJPUl9USU1FUl9WQUxVRSAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAweDA2CisjZGVmaW5lIEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZICAgICAgMHgwNworI2RlZmluZSBDT1JSRUxBVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIFJFU1BPTlNFX0NPREUgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBRERSRVNTX01PRElGRVIgICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgUFJPRFVDVF9JTlNUQU5DRV9JRCAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFJJTkdfU1RBVElPTl9WRVJTSU9OX05VTUJFUiAgICAgMHgyMworI2RlZmluZSBXUkFQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgRlJBTUVfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAweDI3CisjZGVmaW5lIFNUQVRJT05fSURFTlRJRkVSICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBSSU5HX1NUQVRJT05fU1RBVFVTICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgVFJBTlNNSVRfU1RBVFVTX0NPREUgICAgICAgICAgICAweDJBCisjZGVmaW5lIEdST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBGVU5DVElPTkFMX0FERFJFU1MgICAgICAgICAgICAgIDB4MkMKKworI2RlZmluZSBGX05PX1NVQl9WRUNUT1JTX0ZPVU5EICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEZfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRl9MT0NBTF9SSU5HX05VTUJFUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBGX0FTU0lHTl9QSFlTSUNBTF9EUk9QICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZfRVJST1JfVElNRVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRl9BVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBGX0FVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEZfQ09SUkVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRl9QSFlTSUNBTF9EUk9QICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBGX1JFU1BPTlNFX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEZfUFJPRFVDVF9JTlNUQU5DRV9JRCAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgRl9SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBGX1NUQVRJT05fSURFTlRJRkVSICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEZfUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRl9HUk9VUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBGX0ZVTkNUSU9OQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZfRlJBTUVfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKworI2RlZmluZSBSX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSX1JRX0FUVENIX1NUQVRFX0FERFIgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSX0NIR19QQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSX1RYX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRl9GUkFNRV9GT1JXQVJECisKKworI2RlZmluZSAgICAgIFVQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MgICAgICAgMHgwMgorI2RlZmluZSAgICAgIEFERFJFU1NfTU9ESUZFUiAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSAgICAgIFJJTkdfU1RBVElPTl9WRVJTSU9OX05VTUJFUiAgICAgMHgyMworI2RlZmluZSAgICAgIFBST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgICAgMHgyMgorCisjZGVmaW5lICAgICAgUlBUX1RYX0ZPUldBUkQgIDB4MkEKKworI2RlZmluZSBBQ19GQ19JTklUICAgICAgICAgICAgICAgICAgICAgICgzPDwxMykgfCAwIC8qICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUNfRkNfUlFfSU5JVCAgICAgICAgICAgICAgICAgICAoKDM8PDEzKSB8IDApIC8qICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUNfRkNfUlFfQVRUQ0ggICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiBEQyA9IFNDIG9mIHJ4IGZyYW1lICovCisjZGVmaW5lIEFDX0ZDX1JRX1NUQVRFICAgICAgICAgICAgICAgICAgKDM8PDEzKSB8IDAgLyogREMgPSBTQyBvZiByeCBmcmFtZSAqLworI2RlZmluZSBBQ19GQ19SUV9BRERSICAgICAgICAgICAgICAgICAgICgzPDwxMykgfCAwIC8qIERDID0gU0Mgb2YgcnggZnJhbWUgKi8KKyNkZWZpbmUgQUNfRkNfQ0hHX1BBUk0gICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0ZDX1JTUCAgICAgICAgICAgICAgICAgICAgICAgKDA8PDEzKSB8IDAgLyogREMgPSBTQyBvZiByeCBmcmFtZSAqLworI2RlZmluZSBBQ19GQ19SUFRfQVRUQ0ggICAgICAgICAgICAgICAgICgwPDwxMykgfCAwCisKKyNkZWZpbmUgU19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgICAgICAgICAgICAgNiArIDIKKyNkZWZpbmUgU19MT0NBTF9SSU5HX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19BU1NJR05fUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAgNCArIDIKKyNkZWZpbmUgU19FUlJPUl9USU1FUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19BVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTICAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19DT1JSRUxBVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19QSFlTSUNBTF9EUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArIDIKKyNkZWZpbmUgU19SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArIDIKKyNkZWZpbmUgU19BRERSRVNTX01PRElGRVIgICAgICAgICAgICAgICAgICAgICAgICAgMiArIDIKKyNkZWZpbmUgU19QUk9EVUNUX0lOU1RBTkNFX0lEICAgICAgICAgICAgICAgICAgICAxOCArIDIKKyNkZWZpbmUgU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgICAgICAgICAxMCArIDIKKyNkZWZpbmUgU19TVEFUSU9OX0lERU5USUZFUiAgICAgICAgICAgICAgICAgICAgICAgNiArIDIKKyNkZWZpbmUgU19SSU5HX1NUQVRJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgNiArIDIKKyNkZWZpbmUgU19HUk9VUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArIDIKKyNkZWZpbmUgU19GVU5DVElPTkFMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgNCArIDIKKyNkZWZpbmUgU19GUkFNRV9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgIDI1MiArIDIKKyNkZWZpbmUgU19UUkFOU01JVF9TVEFUVVNfQ09ERSAgICAgICAgICAgICAgICAgICAgMiArIDIKKworI2RlZmluZSBJU0JfSU1DX1JFUzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfVFlQRV8zICAgICAgICAgICAgICAweDAwMDEgIC8qIE1BQ19BUkNfSU5ESUNBVEUgKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfRVJST1JfQ09VTlRFUlMgICAgICAweDAwMDIgIC8qICovCisjZGVmaW5lIElTQl9JTUNfUkVTMSAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19UWVBFXzIgICAgICAgICAgICAgIDB4MDAwNCAgLyogUVVFX01BQ19JTkRJQ0FURSAqLworI2RlZmluZSBJU0JfSU1DX1RYX0ZSQU1FICAgICAgICAgICAgICAgIDB4MDAwNSAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19FTkRfT0ZfVFhfUVVFVUUgICAgICAgICAweDAwMDYgIC8qICovCisjZGVmaW5lIElTQl9JTUNfTk9OX01BQ19SWF9SRVNPVVJDRSAgICAgMHgwMDA3ICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19SWF9SRVNPVVJDRSAgICAgICAgIDB4MDAwOCAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19OT05fTUFDX1JYX0ZSQU1FICAgICAgICAweDAwMDkgIC8qICovCisjZGVmaW5lIElTQl9JTUNfTUFDX1JYX0ZSQU1FICAgICAgICAgICAgMHgwMDBBICAvKiAqLworI2RlZmluZSBJU0JfSU1DX1RSQ19GSUZPX1NUQVRVUyAgICAgICAgIDB4MDAwQiAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19DT01NQU5EX1NUQVRVUyAgICAgICAgICAweDAwMEMgIC8qICovCisjZGVmaW5lIElTQl9JTUNfTUFDX1RZUEVfMSAgICAgICAgICAgICAgMHgwMDBEICAvKiBTZWxmIFJlbW92ZWQgKi8KKyNkZWZpbmUgSVNCX0lNQ19UUkNfSU5UUk5MX1RTVF9TVEFUVVMgICAweDAwMEUgIC8qICovCisjZGVmaW5lIElTQl9JTUNfUkVTMiAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiAqLworCisjZGVmaW5lIE5PTl9NQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAgICAgMHgxMCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBOT05fTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgICAgIDB4MjAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTk9OX01BQ19SWF9SRVNPVVJDRV9CRSAgICAgICAgICAweDQwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE5PTl9NQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAgICAgMHg4MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBSQVdfTk9OX01BQ19SWF9SRVNPVVJDRV9CVyAgICAgIDB4MTAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX05PTl9NQUNfUlhfUkVTT1VSQ0VfRlcgICAgICAweDIwMDAgIC8qICovCisjZGVmaW5lIFJBV19OT05fTUFDX1JYX1JFU09VUkNFX0JFICAgICAgMHg0MDAwICAvKiAqLworI2RlZmluZSBSQVdfTk9OX01BQ19SWF9SRVNPVVJDRV9GRSAgICAgIDB4ODAwMCAgLyogKi8KKworI2RlZmluZSBNQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAgICAgICAgIDB4MTAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgICAgICAgICAweDIwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE1BQ19SWF9SRVNPVVJDRV9CRSAgICAgICAgICAgICAgMHg0MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBNQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAgICAgICAgIDB4ODAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgUkFXX01BQ19SWF9SRVNPVVJDRV9CVyAgICAgICAgICAweDEwMDAgIC8qICovCisjZGVmaW5lIFJBV19NQUNfUlhfUkVTT1VSQ0VfRlcgICAgICAgICAgMHgyMDAwICAvKiAqLworI2RlZmluZSBSQVdfTUFDX1JYX1JFU09VUkNFX0JFICAgICAgICAgIDB4NDAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX01BQ19SWF9SRVNPVVJDRV9GRSAgICAgICAgICAweDgwMDAgIC8qICovCisKKyNkZWZpbmUgVFJDX0ZJRk9fU1RBVFVTX1RYX1VOREVSUlVOICAgICAweDQwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIFRSQ19GSUZPX1NUQVRVU19SWF9PVkVSUlVOICAgICAgMHg4MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBSQVdfVFJDX0ZJRk9fU1RBVFVTX1RYX1VOREVSUlVOIDB4NDAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX1RSQ19GSUZPX1NUQVRVU19SWF9PVkVSUlVOICAweDgwMDAgIC8qICovCisKKyNkZWZpbmUgICAgICAgQ1NSX0NMUlRJTlQgICAgICAgICAgICAgMHgwOAorCisjZGVmaW5lIE1TQihYKSAgICAgICAgICAgICAgICAgICgoX191OCkoKF9fdTE2KSBYID4+IDgpKQorI2RlZmluZSBMU0IoWCkgICAgICAgICAgICAgICAgICAoKF9fdTgpKChfX3UxNikgWCAmICAweGZmKSkKKworI2RlZmluZSBBQ19GQ19MT0JFX01FRElBX1RFU1QgICAgICAgICAgICgoMzw8MTMpIHwgMCkKKyNkZWZpbmUgU19XUkFQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0OCArIDIgLyogNTAwICsgMiAqLworI2RlZmluZSAgICAgIFdSQVBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBMT0JFX01FRElBX1RFU1QgMHgwOAorCisvKiBEZXN0aW5hdGlvbiBDbGFzcyAoZGMpICovCisKKyNkZWZpbmUgRENfTUFTSyAgICAgICAgIDB4RjAKKyNkZWZpbmUgRENfUlMgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRENfQ1JTICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRENfUlBTICAgICAgICAgIDB4NTAKKyNkZWZpbmUgRENfUkVNICAgICAgICAgIDB4NjAKKworLyogU291cmNlIENsYXNzZXMgKHNjKSAqLworCisjZGVmaW5lIFNDX01BU0sgICAgICAgICAweDBGCisjZGVmaW5lIFNDX1JTICAgICAgICAgICAweDAwCisjZGVmaW5lIFNDX0NSUyAgICAgICAgICAweDA0CisjZGVmaW5lIFNDX1JQUyAgICAgICAgICAweDA1CisjZGVmaW5lIFNDX1JFTSAgICAgICAgICAweDA2CisKKyNkZWZpbmUgUFIJCTB4MTEKKyNkZWZpbmUgUFJfUEFHRV9NQVNLCTB4MEMwMDAKKworI2RlZmluZSBNSUNST0NIQU5ORUwJMHgwMDA4CisjZGVmaW5lIElOVEVSRkFDRV9DSElQCTB4MDAxMAorI2RlZmluZSBCT0FSRF8xNkJJVAkweDAwNDAKKyNkZWZpbmUgUEFHRURfUkFNCTB4MDA4MAorI2RlZmluZSBXRDgxMTVUQQkoVE9LRU5fTUVESUEgfCBNSUNST0NIQU5ORUwgfCBJTlRFUkZBQ0VfQ0hJUCB8IFBBR0VEX1JBTSkKKyNkZWZpbmUgV0Q4MTE1VAkJKFRPS0VOX01FRElBIHwgSU5URVJGQUNFX0NISVAgfCBCT0FSRF8xNkJJVCB8IFBBR0VEX1JBTSkKKworI2RlZmluZSBCUkRfSURfODMxNgkweDUwCisKKyNkZWZpbmUgcjU4N19TRVIJMHgwMDEKKyNkZWZpbmUgU0VSX0RJTgkJMHg4MAorI2RlZmluZSBTRVJfRE9VVAkweDQwCisjZGVmaW5lIFNFUl9DTEsJCTB4MjAKKyNkZWZpbmUgU0VSX0VDUwkJMHgxMAorI2RlZmluZSBTRVJfRTgwNgkweDA4CisjZGVmaW5lIFNFUl9QTlAJCTB4MDQKKyNkZWZpbmUgU0VSX0JJTwkJMHgwMgorI2RlZmluZSBTRVJfMTZCCQkweDAxCisKKyNkZWZpbmUgcjU4N19JRFIJMHgwMDQKKyNkZWZpbmUgSURSX0lSUV9NQVNLCTB4MEYwCisjZGVmaW5lIElEUl9EQ1NfTUFTSwkweDAwNworI2RlZmluZSBJRFJfUldTCQkweDAwOAorCisKKyNkZWZpbmUgcjU4N19CSU8JMHgwMDMKKyNkZWZpbmUgQklPX0VOQgkJMHgwODAKKyNkZWZpbmUgQklPX01BU0sJMHgwM0YKKworI2RlZmluZSByNTg3X1BDUgkweDAwNQorI2RlZmluZSBQQ1JfUkFNUwkweDA0MAorCisKKworI2RlZmluZSBOVU1fQUREUl9CSVRTCTgKKworI2RlZmluZSBJU0FfTUFYX0FERFJFU1MJCTB4MDBmZmZmZmYKKworI2RlZmluZSBTTUNUUl9NQVhfQURBUFRFUlMJNworCisjZGVmaW5lIE1DX1RBQkxFX0VOVFJJRVMgICAgICAxNgorCisjZGVmaW5lIE1BWEZSQUdNRU5UUyAgICAgICAgICAzMgorCisjZGVmaW5lIENISVBfUkVWX01BU0sgICAgICAgICAweDMwMDAKKworI2RlZmluZSBNQVhfVFhfUVMgICAgICAgICAgICAgOAorI2RlZmluZSBOVU1fVFhfUVNfVVNFRCAgICAgICAgMworCisjZGVmaW5lIE1BWF9SWF9RUyAgICAgICAgICAgICAyCisjZGVmaW5lIE5VTV9SWF9RU19VU0VEICAgICAgICAyCisKKyNkZWZpbmUgSU5URUxfREFUQV9GT1JNQVQJMHg0MDAwCisjZGVmaW5lIElOVEVMX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQJMHg4MDAwCisjZGVmaW5lIFBBR0VfUE9JTlRFUihYKQkJKCgoKHVuc2lnbmVkIGxvbmcpKFgpIC0gdHAtPnJhbV9hY2Nlc3MpICYgdHAtPnBhZ2Vfb2Zmc2V0X21hc2spICsgdHAtPnJhbV9hY2Nlc3MpCisjZGVmaW5lIFNXQVBfV09SRFMoWCkJCSgoKFggJiAweEZGRkYpIDw8IDE2KSB8IChYID4+IDE2KSkKKworI2RlZmluZSBJTlRFUkZBQ0VfQ0hJUCAgICAgICAgICAweDAwMTAgICAgICAgICAgLyogU29mdCBDb25maWcgQWRhcHRlciAqLworI2RlZmluZSBBRFZBTkNFRF9GRUFUVVJFUyAgICAgICAweDAwMjAgICAgICAgICAgLyogQWR2LiBuZXR3LiBpbnRlcmZhY2UgZmVhdHVyZXMgKi8KKyNkZWZpbmUgQk9BUkRfMTZCSVQgICAgICAgICAgICAgMHgwMDQwICAgICAgICAgIC8qIDE2IGJpdCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFBBR0VEX1JBTSAgICAgICAgICAgICAgIDB4MDA4MCAgICAgICAgICAvKiBBZGFwdGVyIGhhcyBwYWdlZCBSQU0gKi8KKworI2RlZmluZSBQQUdFRF9ST00gICAgICAgICAgICAgICAweDAxMDAgICAgICAgICAgLyogQWRhcHRlciBoYXMgcGFnZWQgUk9NICovCisKKyNkZWZpbmUgUkFNX1NJWkVfVU5LTk9XTiAgICAgICAgMHgwMDAwICAgICAgICAgIC8qIFVua25vd24gUkFNIHNpemUgKi8KKyNkZWZpbmUgUkFNX1NJWkVfMEsgICAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIDBLICBSQU0gKi8KKyNkZWZpbmUgUkFNX1NJWkVfOEsgICAgICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIDhrICBSQU0gKi8KKyNkZWZpbmUgUkFNX1NJWkVfMTZLICAgICAgICAgICAgMHgwMDAzICAgICAgICAgIC8qIDE2ayBSQU0gKi8KKyNkZWZpbmUgUkFNX1NJWkVfMzJLICAgICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8qIDMyayBSQU0gKi8KKyNkZWZpbmUgUkFNX1NJWkVfNjRLICAgICAgICAgICAgMHgwMDA1ICAgICAgICAgIC8qIDY0ayBSQU0gKi8KKyNkZWZpbmUgUkFNX1NJWkVfUkVTRVJWRURfNiAgICAgMHgwMDA2ICAgICAgICAgIC8qIFJlc2VydmVkIFJBTSBzaXplICovCisjZGVmaW5lIFJBTV9TSVpFX1JFU0VSVkVEXzcgICAgIDB4MDAwNyAgICAgICAgICAvKiBSZXNlcnZlZCBSQU0gc2l6ZSAqLworI2RlZmluZSBSQU1fU0laRV9NQVNLICAgICAgICAgICAweDAwMDcgICAgICAgICAgLyogSXNvbGF0ZXMgUkFNIFNpemUgKi8KKworI2RlZmluZSBUT0tFTl9NRURJQSAgICAgICAgICAgMHgwMDA1CisKKyNkZWZpbmUgQklEX1JFR18wICAgICAgIDB4MDAKKyNkZWZpbmUgQklEX1JFR18xICAgICAgIDB4MDEKKyNkZWZpbmUgQklEX1JFR18yICAgICAgIDB4MDIKKyNkZWZpbmUgQklEX1JFR18zICAgICAgIDB4MDMKKyNkZWZpbmUgQklEX1JFR180ICAgICAgIDB4MDQKKyNkZWZpbmUgQklEX1JFR181ICAgICAgIDB4MDUKKyNkZWZpbmUgQklEX1JFR182ICAgICAgIDB4MDYKKyNkZWZpbmUgQklEX1JFR183ICAgICAgIDB4MDcKKyNkZWZpbmUgQklEX0xBUl8wICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0xBUl8xICAgICAgIDB4MDkKKyNkZWZpbmUgQklEX0xBUl8yICAgICAgIDB4MEEKKyNkZWZpbmUgQklEX0xBUl8zICAgICAgIDB4MEIKKyNkZWZpbmUgQklEX0xBUl80ICAgICAgIDB4MEMKKyNkZWZpbmUgQklEX0xBUl81ICAgICAgIDB4MEQKKworI2RlZmluZSBCSURfQk9BUkRfSURfQllURSAgICAgICAweDBFCisjZGVmaW5lIEJJRF9DSENLU01fQllURSAgICAgICAgIDB4MEYKKyNkZWZpbmUgQklEX0xBUl9PRkZTRVQgICAgICAgICAgMHgwOCAgCisKKyNkZWZpbmUgQklEX01TWl81ODNfQklUICAgICAgICAgMHgwOAorI2RlZmluZSBCSURfU0lYVEVFTl9CSVRfQklUICAgICAweDAxCisKKyNkZWZpbmUgQklEX0JPQVJEX1JFVl9NQVNLICAgICAgMHgxRQorCisjZGVmaW5lIEJJRF9NRURJQV9UWVBFX0JJVCAgICAgIDB4MDEKKyNkZWZpbmUgQklEX1NPRlRfQ09ORklHX0JJVCAgICAgMHgyMAorI2RlZmluZSBCSURfUkFNX1NJWkVfQklUICAgICAgICAweDQwCisjZGVmaW5lIEJJRF9CVVNfVFlQRV9CSVQgICAgICAgIDB4ODAKKworI2RlZmluZSBCSURfQ1IgICAgICAgICAgMHgxMAorCisjZGVmaW5lIEJJRF9UWFAgICAgICAgICAweDA0ICAgICAgICAgICAgLyogVHJhbnNtaXQgUGFja2V0IENvbW1hbmQgKi8KKworI2RlZmluZSBCSURfVENSX0RJRkYgICAgMHgwRCAgICAvKiBUcmFuc21pdCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQklEX1RDUl9WQUwgICAgIDB4MTggICAgICAgICAgICAvKiBWYWx1ZSB0byBUZXN0IDgzOTAgb3IgNjkwICovCisjZGVmaW5lIEJJRF9QUzAgICAgICAgICAweDAwICAgICAgICAgICAgLyogUmVnaXN0ZXIgUGFnZSBTZWxlY3QgMCAqLworI2RlZmluZSBCSURfUFMxICAgICAgICAgMHg0MCAgICAgICAgICAgIC8qIFJlZ2lzdGVyIFBhZ2UgU2VsZWN0IDEgKi8KKyNkZWZpbmUgQklEX1BTMiAgICAgICAgIDB4ODAgICAgICAgICAgICAvKiBSZWdpc3RlciBQYWdlIFNlbGVjdCAyICovCisjZGVmaW5lIEJJRF9QU19NQVNLICAgICAweDNGICAgICAgICAgICAgLyogRm9yIE1hc2tpbmcgT2ZmIFBhZ2UgU2VsZWN0IEJpdHMgKi8KKworI2RlZmluZSBCSURfRUVQUk9NXzAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0VFUFJPTV8xICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIEJJRF9FRVBST01fMiAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBCSURfRUVQUk9NXzMgICAgICAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgQklEX0VFUFJPTV80ICAgICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIEJJRF9FRVBST01fNSAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBCSURfRUVQUk9NXzYgICAgICAgICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgQklEX0VFUFJPTV83ICAgICAgICAgICAgICAgICAgICAweDBGCisKKyNkZWZpbmUgQklEX09USEVSX0JJVCAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJJRF9JQ1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBCSURfRUFSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQklEX0VOR1JfUEFHRSAgICAgICAgICAgICAgICAgICAweDBBMAorI2RlZmluZSBCSURfUkxBICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0VBNiAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEJJRF9SRUNBTExfRE9ORV9NQVNLICAgICAgICAgICAgMHgxMAorI2RlZmluZSBCSURfQklEX0VFUFJPTV9PVkVSUklERSAgICAgICAgIDB4RkZCMAorI2RlZmluZSBCSURfRVhUUkFfRUVQUk9NX09WRVJSSURFICAgICAgIDB4RkZEMAorI2RlZmluZSBCSURfRUVQUk9NX01FRElBX01BU0sgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgQklEX1NUQVJMQU5fVFlQRSAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEJJRF9FVEhFUk5FVF9UWVBFICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfVFBfVFlQRSAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQklEX0VXX1RZUEUgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEJJRF9UT0tFTl9SSU5HX1RZUEUgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBCSURfVVRQMl9UWVBFICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQklEX0VFUFJPTV9JUlFfTUFTSyAgICAgICAgICAgICAweDE4CisjZGVmaW5lIEJJRF9QUklNQVJZX0lSUSAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCSURfQUxURVJOQVRFX0lSUV8xICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0FMVEVSTkFURV9JUlFfMiAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9BTFRFUk5BVEVfSVJRXzMgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFX01BU0sgICAgICAgIDB4RTAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV9SRVMxICAgICAgICAweDAwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTMiAgICAgICAgMHgyMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFXzhLICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV8xNksgICAgICAgICAweDYwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfMzJLICAgICAgICAgMHg4MAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFXzY0SyAgICAgICAgIDB4QTAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV9SRVMzICAgICAgICAweEMwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTNCAgICAgICAgMHhFMAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19UWVBFX01BU0sgICAgICAgIDB4MDcKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9BVCAgICAgICAgICAweDAwCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1RZUEVfTUNBICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NX0JVU19UWVBFX0VJU0EgICAgICAgIDB4MDIKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9ORUMgICAgICAgICAweDAzCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1NJWkVfTUFTSyAgICAgICAgMHgxOAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFXzhCSVQgICAgICAgIDB4MDAKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfU0laRV8xNkJJVCAgICAgICAweDA4CisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1NJWkVfMzJCSVQgICAgICAgMHgxMAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFXzY0QklUICAgICAgIDB4MTgKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfTUFTVEVSICAgICAgICAgICAweDIwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1BBR0lORyAgICAgICAgICAgMHg0MAorI2RlZmluZSBCSURfRUVQUk9NX1JPTV9QQUdJTkcgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQklEX0VFUFJPTV9QQUdJTkdfTUFTSyAgICAgICAgICAweEMwCisjZGVmaW5lIEJJRF9FRVBST01fTE9XX0NPU1QgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBCSURfRUVQUk9NX0lPX01BUFBFRCAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0VFUFJPTV9ITUkgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJJRF9FRVBST01fQVVUT19NRURJQV9ERVRFQ1QgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NX0NISVBfUkVWX01BU0sgICAgICAgIDB4MEMKKworI2RlZmluZSBCSURfRUVQUk9NX0xBTl9BRERSICAgICAgICAgICAgIDB4MzAKKworI2RlZmluZSBCSURfRUVQUk9NX01FRElBX09QVElPTiAgICAgICAgIDB4NTQKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9VVFAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJJRF9FRVBST01fNE1CX1JJTkcgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBCSURfRUVQUk9NXzE2TUJfUklORyAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9TVFAgICAgICAgICAgICAweDQwCisKKyNkZWZpbmUgQklEX0VFUFJPTV9NSVNDX0RBVEEgICAgICAgICAgICAweDU2CisjZGVmaW5lIEJJRF9FRVBST01fRUFSTFlfVE9LRU5fUkVMRUFTRSAgMHgwMgorCisjZGVmaW5lIENORkdfSURfODAwM0UgICAgICAgICAgIDB4NmZjMAorI2RlZmluZSBDTkZHX0lEXzgwMDNTICAgICAgICAgICAweDZmYzEKKyNkZWZpbmUgQ05GR19JRF84MDAzVyAgICAgICAgICAgMHg2ZmMyCisjZGVmaW5lIENORkdfSURfODExNVRSQSAgICAgICAgIDB4NmVjNgorI2RlZmluZSBDTkZHX0lEXzgwMTNFICAgICAgICAgICAweDYxQzgKKyNkZWZpbmUgQ05GR19JRF84MDEzVyAgICAgICAgICAgMHg2MUM5CisjZGVmaW5lIENORkdfSURfQklTVFJPMDNFICAgICAgIDB4RUZFNQorI2RlZmluZSBDTkZHX0lEX0JJU1RSTzEzRSAgICAgICAweEVGRDUKKyNkZWZpbmUgQ05GR19JRF9CSVNUUk8xM1cgICAgICAgMHhFRkQ0CisjZGVmaW5lIENORkdfTVNSXzU4MyAgICAweDAKKyNkZWZpbmUgQ05GR19JQ1JfNTgzICAgIDB4MQorI2RlZmluZSBDTkZHX0lBUl81ODMgICAgMHgyCisjZGVmaW5lIENORkdfQklPXzU4MyAgICAweDMKKyNkZWZpbmUgQ05GR19FQVJfNTgzICAgIDB4MworI2RlZmluZSBDTkZHX0lSUl81ODMgICAgMHg0CisjZGVmaW5lIENORkdfTEFBUl81ODQgICAweDUKKyNkZWZpbmUgQ05GR19HUDIgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIENORkdfTEFBUl9NQVNLICAgICAgICAgIDB4MUYKKyNkZWZpbmUgQ05GR19MQUFSX1pXUyAgICAgICAgICAgMHgyMAorI2RlZmluZSBDTkZHX0xBQVJfTDE2RSAgICAgICAgICAweDQwCisjZGVmaW5lIENORkdfSUNSX0lSMl81ODQgICAgICAgIDB4MDQKKyNkZWZpbmUgQ05GR19JQ1JfTUFTSyAgICAgICAweDA4CisjZGVmaW5lIENORkdfSUNSX01TWiAgICAgICAgMHgwOAorI2RlZmluZSBDTkZHX0lDUl9STEEgICAgICAgIDB4MTAKKyNkZWZpbmUgQ05GR19JQ1JfU1RPICAgICAgICAweDgwCisjZGVmaW5lIENORkdfSVJSX0lSUVMgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgQ05GR19JUlJfSUVOICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDTkZHX0lSUl9aV1MgICAgICAgICAgICAweDAxCisjZGVmaW5lIENORkdfR1AyX0JPT1RfTklCQkxFICAgIDB4MEYKKyNkZWZpbmUgQ05GR19JUlJfT1VUMiAgICAgICAweDA0CisjZGVmaW5lIENORkdfSVJSX09VVDEgICAgICAgMHgwMgorCisjZGVmaW5lIENORkdfU0laRV84S0IgICAgICAgICAgIDgKKyNkZWZpbmUgQ05GR19TSVpFXzE2S0IgICAgICAgICAgMTYKKyNkZWZpbmUgQ05GR19TSVpFXzMyS0IgICAgICAgICAgMzIKKyNkZWZpbmUgQ05GR19TSVpFXzY0S0IgICAgICAgICAgNjQKKyNkZWZpbmUgQ05GR19TSVpFXzEyOEtCICAgICAxMjgKKyNkZWZpbmUgQ05GR19TSVpFXzI1NktCICAgICAyNTYKKyNkZWZpbmUgUk9NX0RJU0FCTEUgICAgICAgICAgICAgMHgwCisKKyNkZWZpbmUgQ05GR19TTE9UX0VOQUJMRV9CSVQgICAgMHgwOAorCisjZGVmaW5lIENORkdfUE9TX0NPTlRST0xfUkVHICAgIDB4MDk2CisjZGVmaW5lIENORkdfUE9TX1JFRzAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIENORkdfUE9TX1JFRzEgICAgICAgICAgIDB4MTAxCisjZGVmaW5lIENORkdfUE9TX1JFRzIgICAgICAgICAgIDB4MTAyCisjZGVmaW5lIENORkdfUE9TX1JFRzMgICAgICAgICAgIDB4MTAzCisjZGVmaW5lIENORkdfUE9TX1JFRzQgICAgICAgICAgIDB4MTA0CisjZGVmaW5lIENORkdfUE9TX1JFRzUgICAgICAgICAgIDB4MTA1CisKKyNkZWZpbmUgQ05GR19BREFQVEVSX1RZUEVfTUFTSyAgMHgwZQorCisjZGVmaW5lIFNMT1RfMTZCSVQgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBJTlRFUkZBQ0VfNVgzX0NISVAgICAgICAweDAwMDAgICAgICAgICAgLyogMDAwMCA9IDU4MyBvciA1OTMgY2hpcHMgKi8KKyNkZWZpbmUgTklDXzY5MF9CSVQgICAgICAgICAgICAgICAgICAgICAweDAwMTAgICAgICAgICAgLyogTklDIGlzIDY5MCAqLworI2RlZmluZSBBTFRFUk5BVEVfSVJRX0JJVCAgICAgICAweDAwMjAgICAgICAgICAgLyogQWx0ZXJuYXRlIElSUSBpcyB1c2VkICovCisjZGVmaW5lIElOVEVSRkFDRV81ODRfQ0hJUCAgICAgIDB4MDA0MCAgICAgICAgICAvKiAwMDAxID0gNTg0IGNoaXAgKi8KKyNkZWZpbmUgSU5URVJGQUNFXzU5NF9DSElQICAgICAgMHgwMDgwICAgICAgICAgIC8qIDAwMTAgPSA1OTQgY2hpcCAqLworI2RlZmluZSBJTlRFUkZBQ0VfNTg1X0NISVAgICAgICAweDAxMDAgICAgICAgICAgLyogMDEwMCA9IDU4NS83OTAgY2hpcCAqLworI2RlZmluZSBJTlRFUkZBQ0VfQ0hJUF9NQVNLICAgICAweDAzQzAgICAgICAgICAgLyogSXNvbGF0ZXMgSW50ZmMgQ2hpcCBUeXBlICovCisKKyNkZWZpbmUgQk9BUkRfMTZCSVQgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIE5PREVfQUREUl9DS1NVTSAJMHhFRQorI2RlZmluZSBCUkRfSURfODExNVQgICAgCTB4MDQKKworI2RlZmluZSBOSUNfODI1X0JJVCAgICAgICAgICAgICAweDA0MDAgICAgICAgICAgLyogVFJDIDgzQzgyNSBOSUMgKi8KKyNkZWZpbmUgTklDXzc5MF9CSVQgICAgICAgICAgICAgMHgwODAwICAgICAgICAgIC8qIE5JQyBpcyA4M0M3OTAgRXRoZXJuZXQgKi8KKworI2RlZmluZSBDSElQX1JFVl9NQVNLICAgICAgICAgICAweDMwMDAKKworI2RlZmluZSBIV1JfQ0JVU1kJCQkweDAyCisjZGVmaW5lIEhXUl9DQQkJCQkweDAxCisKKyNkZWZpbmUgTUFDX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE5PTl9NQUNfUVVFVUUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCVUdfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgLyogTk8gUkVDRUlWRSBRVUVVRSwgT05MWSBUWCAqLworCisjZGVmaW5lIE5VTV9NQUNfVFhfRkNCUyAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBOVU1fTUFDX1RYX0JEQlMgICAgICAgICAgICAgICAgIE5VTV9NQUNfVFhfRkNCUworI2RlZmluZSBOVU1fTUFDX1JYX0ZDQlMgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTlVNX01BQ19SWF9CREJTICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTlVNX05PTl9NQUNfVFhfRkNCUyAgICAgICAgICAgICA2CisjZGVmaW5lIE5VTV9OT05fTUFDX1RYX0JEQlMgICAgICAgICAgICAgTlVNX05PTl9NQUNfVFhfRkNCUworCisjZGVmaW5lIE5VTV9OT05fTUFDX1JYX0JEQlMgICAgICAgICAgICAgMCAgICAgICAvKiBDQUxDVUxBVEVEIERZTkFNSUNBTExZICovCisKKyNkZWZpbmUgTlVNX0JVR19UWF9GQ0JTICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE5VTV9CVUdfVFhfQkRCUyAgICAgICAgICAgICAgICAgTlVNX0JVR19UWF9GQ0JTCisKKyNkZWZpbmUgTUFDX1RYX0JVRkZFUl9NRU1PUlkgICAgICAgICAgICAxMDI0CisjZGVmaW5lIE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWSAgICAgICAgKDIwICogMTAyNCkKKyNkZWZpbmUgQlVHX1RYX0JVRkZFUl9NRU1PUlkgICAgICAgICAgICAoTlVNX0JVR19UWF9GQ0JTICogMzIpCisKKyNkZWZpbmUgUlhfQlVGRkVSX01FTU9SWSAgICAgICAgICAgICAgICAwICAgICAgIC8qIENBTENVTEFURUQgRFlOQU1JQ0FMTFkgKi8KKyNkZWZpbmUgUlhfREFUQV9CVUZGRVJfU0laRSAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgUlhfQkRCX1NJWkVfU0hJRlQgICAgICAgICAgICAgICAzICAgICAgIC8qIGxvZzIoUlhfREFUQV9CVUZGRVJfU0laRSktbG9nMihzaXplb2YoQkRCbG9jaykpICovCisjZGVmaW5lIFJYX0JEQl9TSVpFX01BU0sgICAgICAgICAgICAgICAgKHNpemVvZihCREJsb2NrKSAtIDEpCisjZGVmaW5lIFJYX0RBVEFfQlVGRkVSX1NJWkVfTUFTSyAgICAgICAgKFJYX0RBVEFfQlVGRkVSX1NJWkUtMSkKKworI2RlZmluZSBOVU1fT0ZfSU5URVJSVVBUUyAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBOT1RfVFJBTlNNSVRJTkcgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFJBTlNNSVRJTkcJCQkxCisKKyNkZWZpbmUgVFJDX0lOVEVSUlVQVF9FTkFCTEVfTUFTSyAgICAgICAweDdGRjYKKworI2RlZmluZSBVQ09ERV9WRVJTSU9OICAgICAgICAgICAgICAgICAgIDB4NTgKKworI2RlZmluZSBVQ09ERV9TSVpFX09GRlNFVCAgICAgICAgICAgICAgIDB4MDAwMCAgLyogV09SRCAqLworI2RlZmluZSBVQ09ERV9DSEVDS1NVTV9PRkZTRVQgICAgICAgICAgIDB4MDAwMiAgLyogV09SRCAqLworI2RlZmluZSBVQ09ERV9WRVJTSU9OX09GRlNFVCAgICAgICAgICAgIDB4MDAwNCAgLyogQllURSAqLworCisjZGVmaW5lIENTX1JBTV9TSVpFICAgICAgICAgICAgICAgICAgICAgMFgyMDAwCisjZGVmaW5lIENTX1JBTV9DSEVDS1NVTV9PRkZTRVQgICAgICAgICAgMHgxRkZFICAvKiBXT1JEIDFGRkUoTVNCKS0xRkZGKExTQikqLworI2RlZmluZSBDU19SQU1fVkVSU0lPTl9PRkZTRVQgICAgICAgICAgIDB4MUZGQyAgLyogV09SRCAxRkZDKE1TQiktMUZGRChMU0IpKi8KKworI2RlZmluZSBNSVNDX0RBVEFfU0laRSAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBOVU1fT0ZfQUNCUyAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBQ0JfQ09NTUFORF9OT1RfRE9ORSAgICAgICAgICAgIDB4MDAwMCAgLyogSW5pdCwgY29tbWFuZCBub3QgZG9uZSAqLworI2RlZmluZSBBQ0JfQ09NTUFORF9ET05FICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogVFJDIHNheXMgY29tbWFuZCBkb25lICovCisjZGVmaW5lIEFDQl9DT01NQU5EX1NUQVRVU19NQVNLICAgICAgICAgMHgwMEZGICAvKiBsb3cgYnl0ZSBpcyBzdGF0dXMgKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfU1VDQ0VTU0ZVTCAgICAgICAgICAweDAwMDAgIC8qIG1lYW5zIGNtZCB3YXMgc3VjY2Vzc2Z1bCAqLworI2RlZmluZSBBQ0JfTk9UX0NIQUlOX0VORCAgICAgICAgICAgICAgIDB4MDAwMCAgLyogdGVsbCBUUkMgbW9yZSBDQnMgaW4gY2hhaW4gKi8KKyNkZWZpbmUgQUNCX0NIQUlOX0VORCAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIHRlbGwgVFJDIGxhc3QgQ0IgaW4gY2hhaW4gKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfTk9fSU5URVJSVVBUICAgICAgICAweDAwMDAgIC8qIHRlbGwgVFJDIG5vIElOVCBhZnRlciBDQiAqLworI2RlZmluZSBBQ0JfQ09NTUFORF9JTlRFUlJVUFQgICAgICAgICAgIDB4MjAwMCAgLyogdGVsbCBUUkMgdG8gSU5UIGFmdGVyIENCICovCisjZGVmaW5lIEFDQl9TVUJfQ01EX05PUCAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFDQl9DTURfSElDX05PUCAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEFDQl9DTURfTUNUX05PUCAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFDQl9DTURfTUNUX1RFU1QgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFDQl9DTURfSElDX1RFU1QgICAgICAgICAgICAgICAgMHgwMDgxCisjZGVmaW5lIEFDQl9DTURfSU5TRVJUICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEFDQl9DTURfUkVNT1ZFICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEFDQl9DTURfTUNUX1dSSVRFX1ZBTFVFICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEFDQl9DTURfSElDX1dSSVRFX1ZBTFVFICAgICAgICAgMHgwMDg0CisjZGVmaW5lIEFDQl9DTURfTUNUX1JFQURfVkFMVUUgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEFDQl9DTURfSElDX1JFQURfVkFMVUUgICAgICAgICAgMHgwMDg1CisjZGVmaW5lIEFDQl9DTURfSU5JVF9UWF9SWCAgICAgICAgICAgICAgMHgwMDg2CisjZGVmaW5lIEFDQl9DTURfSU5JVF9UUkNfVElNRVJTICAgICAgICAgMHgwMDA2CisjZGVmaW5lIEFDQl9DTURfUkVBRF9UUkNfU1RBVFVTICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEFDQl9DTURfQ0hBTkdFX0pPSU5fU1RBVEUgICAgICAgMHgwMDA4CisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfOSAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfQSAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfQiAgICAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfQyAgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfRCAgICAgICAgICAgICAgMHgwMDBECisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfRSAgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIEFDQl9DTURfUkVTRVJWRURfRiAgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUgVFJDX01BQ19SRUdJU1RFUlNfVEVTVCAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgVFJDX0lOVEVSTkFMX0xPT1BCQUNLICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFJDX1RSSV9MT09QQkFDSyAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFJDX0lOVEVSTkFMX1JPTV9URVNUICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgVFJDX0xPQkVfTUVESUFfVEVTVCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFJDX0FOQUxPR19URVNUICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgVFJDX0hPU1RfSU5URVJGQUNFX1JFR19URVNUICAgICAweDAwMDMKKworI2RlZmluZSBURVNUX0RNQV8xICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBURVNUX0RNQV8yICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBURVNUX01DVF9ST00gICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBISUNfSU5URVJOQUxfRElBRyAgICAgICAgICAgICAgIDB4MDAwMworCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzEgICAgICAgMHgwMDAyCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzIgICAgICAgMHgwMDA0CisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzMgICAgICAgMHgwMDA4CisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzQgICAgICAgMHgwMDEwCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzUgICAgICAgMHgwMDIwCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzYgICAgICAgMHgwMDQwCisjZGVmaW5lIEFCT1JUX1RSQU5TTUlUX1BSSU9SSVRZXzcgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV8wICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV8xICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV8yICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV8zICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV80ICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV81ICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV82ICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgVFhfUEVORElOR19QUklPUklUWV83ICAgICAgICAgICAweDAwODAKKworI2RlZmluZSBGQ0JfRlJBTUVfTEVOR1RIICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEZDQl9DT01NQU5EX0RPTkUgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBGQ0IgV29yZCAwICovCisjZGVmaW5lIEZDQl9OT1RfQ0hBSU5fRU5EICAgICAgICAgICAgICAgMHgwMDAwICAvKiBGQ0IgV29yZCAxICovCisjZGVmaW5lIEZDQl9DSEFJTl9FTkQgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEZDQl9OT19XQVJOSU5HICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEZDQl9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZDQl9JTlRFUlJVUFRfRElTQUJMRSAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEZDQl9JTlRFUlJVUFRfRU5BQkxFICAgICAgICAgICAgMHgyMDAwCisKKyNkZWZpbmUgRkNCX0VOQUJMRV9JTUEgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRkNCX0VOQUJMRV9URVMgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEd1YXJhbnRlZSBUeCBiZWZvcmUgSW50ICovCisjZGVmaW5lIEZDQl9FTkFCTEVfVEZTICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBQb3N0IFR4IEZyYW1lIFN0YXR1cyAqLworI2RlZmluZSBGQ0JfRU5BQkxFX05UQyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTm8gVHggQ1JDICovCisKKyNkZWZpbmUgRkNCX1RYX1NUQVRVU19DUjIgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRkNCX1RYX1NUQVRVU19BUjIgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRkNCX1RYX1NUQVRVU19DUjEgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRkNCX1RYX1NUQVRVU19BUjEgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRkNCX1RYX0FDX0JJVFMgICAgICAgICAgICAgICAgICAoRkNCX1RYX1NUQVRVU19BUjErRkNCX1RYX1NUQVRVU19BUjIrRkNCX1RYX1NUQVRVU19DUjErRkNCX1RYX1NUQVRVU19DUjIpCisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfRSAgICAgICAgICAgICAgICAgMHgwMTAwCisKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19BTllfRVJST1IgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19GQ1NfRVJST1IgICAgICAgICAweDAwMDIKKworI2RlZmluZSBGQ0JfUlhfU1RBVFVTX0lBX01BVENIRUQgICAgICAgIDB4MDQwMAorI2RlZmluZSBGQ0JfUlhfU1RBVFVTX0lHQV9CU0dBX01BVENIRUQgIDB4MDUwMAorI2RlZmluZSBGQ0JfUlhfU1RBVFVTX0ZBX01BVENIRUQgICAgICAgIDB4MDYwMAorI2RlZmluZSBGQ0JfUlhfU1RBVFVTX0JBX01BVENIRUQgICAgICAgIDB4MDcwMAorI2RlZmluZSBGQ0JfUlhfU1RBVFVTX0RBX01BVENIRUQgICAgICAgIDB4MDQwMAorI2RlZmluZSBGQ0JfUlhfU1RBVFVTX1NPVVJDRV9ST1VUSU5HICAgIDB4MDgwMAorCisjZGVmaW5lIEJEQl9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgQkRCX05PVF9DSEFJTl9FTkQgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQkRCX0NIQUlOX0VORCAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgQkRCX05PX1dBUk5JTkcgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQkRCX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKworI2RlZmluZSBFUlJPUl9DT1VOVEVSU19DSEFOR0VEICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUSV9ORElTX1JJTkdfU1RBVFVTX0NIQU5HRUQgICAgIDB4MDAwMgorI2RlZmluZSBVTkFfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBSRUFEWV9UT19TRU5EX1JRX0lOSVQgICAgICAgICAgIDB4MDAwOAorCisjZGVmaW5lIFNDR0JfQUREUkVTU19QT0lOVEVSX0ZPUk1BVCAgICAgSU5URUxfQUREUkVTU19QT0lOVEVSX0ZPUk1BVAorI2RlZmluZSBTQ0dCX0RBVEFfRk9STUFUICAgICAgICAgICAgICAgIElOVEVMX0RBVEFfRk9STUFUCisjZGVmaW5lIFNDR0JfTVVMVElfV09SRF9DT05UUk9MICAgICAgICAgMAorI2RlZmluZSBTQ0dCX0JVUlNUX0xFTkdUSCAgICAgICAgICAgICAgIDB4MDAwRSAgLyogRE1BIEJ1cnN0IExlbmd0aCAqLworCisjZGVmaW5lIFNDR0JfQ09ORklHICAgICAgICAgICAgICAgICAgICAgKElOVEVMX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQrSU5URUxfREFUQV9GT1JNQVQrU0NHQl9CVVJTVF9MRU5HVEgpCisKKyNkZWZpbmUgSVNDUF9CTE9DS19TSVpFICAgICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIFJBTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBJTklUX1NZU19DT05GSUdfUFRSX09GRlNFVCAgICAgIChSQU1fU0laRS1JU0NQX0JMT0NLX1NJWkUpCisjZGVmaW5lIFNDR1BfQkxPQ0tfT0ZGU0VUICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFNDTEJfTk9UX1ZBTElEICAgICAgICAgICAgICAgICAgMHgwMDAwICAvKiBJbml0aWFsbHksIFNDTEIgbm90IHZhbGlkICovCisjZGVmaW5lIFNDTEJfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBIb3N0IHRlbGxzIFRSQyBTQ0xCIHZhbGlkICovCisjZGVmaW5lIFNDTEJfUFJPQ0VTU0VEICAgICAgICAgICAgICAgICAgMHgwMDAwICAvKiBUUkMgc2F5cyBTQ0xCIHByb2Nlc3NlZCAqLworI2RlZmluZSBTQ0xCX1JFU1VNRV9DT05UUk9MX05PVF9WQUxJRCAgIDB4MDAwMCAgLyogSW5pdGlhbGx5LCBSQyBub3QgdmFsaWQgKi8KKyNkZWZpbmUgU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRCAgICAgICAweDQwMDAgIC8qIEhvc3QgdGVsbHMgVFJDIFJDIHZhbGlkICovCisjZGVmaW5lIFNDTEJfSUFDS19DT0RFX05PVF9WQUxJRCAgICAgICAgMHgwMDAwICAvKiBJbml0aWFsbHksIElBQ0sgbm90IHZhbGlkICovCisjZGVmaW5lIFNDTEJfSUFDS19DT0RFX1ZBTElEICAgICAgICAgICAgMHgyMDAwICAvKiBIb3N0IHRlbGxzIFRSQyBJQUNLIHZhbGlkICovCisjZGVmaW5lIFNDTEJfQ01EX05PUCAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDTEJfQ01EX1JFTU9WRSAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFNDTEJfQ01EX1NVU1BFTkRfQUNCX0NIQUlOICAgICAgMHgwMDAyCisjZGVmaW5lIFNDTEJfQ01EX1NFVF9JTlRFUlJVUFRfTUFTSyAgICAgMHgwMDAzCisjZGVmaW5lIFNDTEJfQ01EX0NMRUFSX0lOVEVSUlVQVF9NQVNLICAgMHgwMDA0CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEXzUgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEXzYgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEXzcgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEXzggICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEXzkgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0EgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0IgICAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0MgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0QgICAgICAgICAgICAgMHgwMDBECisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0UgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFNDTEJfQ01EX1JFU0VSVkVEX0YgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUgU0NMQl9SQ19BQ0IgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFjdGlvbiBDb21tYW5kIEJsb2NrIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfUkVTMCAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBbHdheXMgWmVybyAqLworI2RlZmluZSBTQ0xCX1JDX1JFUzEgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQWx3YXlzIFplcm8gKi8KKyNkZWZpbmUgU0NMQl9SQ19SRVMyICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFsd2F5cyBaZXJvICovCisjZGVmaW5lIFNDTEJfUkNfUlhfTUFDX0ZDQiAgICAgICAgICAgICAgMHgwMDEwICAvKiBSWF9NQUNfRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfUlhfTUFDX0JEQiAgICAgICAgICAgICAgMHgwMDIwICAvKiBSWF9NQUNfQkRCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfUlhfTk9OX01BQ19GQ0IgICAgICAgICAgMHgwMDQwICAvKiBSWF9OT05fTUFDX0ZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JYX05PTl9NQUNfQkRCICAgICAgICAgIDB4MDA4MCAgLyogUlhfTk9OX01BQ19CREIgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCMCAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFRYIFByaW9yaXR5IDAgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjEgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBUWCBQcmlvcml0eSAxIEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0IyICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogVFggUHJpb3JpdHkgMiBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCMyAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFRYIFByaW9yaXR5IDMgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjQgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBUWCBQcmlvcml0eSA0IEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0I1ICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogVFggUHJpb3JpdHkgNSBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCNiAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFRYIFByaW9yaXR5IDYgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjcgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBUWCBQcmlvcml0eSA3IEZDQiBDaGFpbiAqLworCisjZGVmaW5lIFNDTEJfSU1DX1JFUzAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfVFlQRV8zICAgICAgICAgICAgIDB4MDAwMiAgLyogTUFDX0FSQ19JTkRJQ0FURSAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfRVJST1JfQ09VTlRFUlMgICAgIDB4MDAwNCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfUkVTMSAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19UWVBFXzIgICAgICAgICAgICAgMHgwMDEwICAvKiBRVUVfTUFDX0lORElDQVRFICovCisjZGVmaW5lIFNDTEJfSU1DX1RYX0ZSQU1FICAgICAgICAgICAgICAgMHgwMDIwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19FTkRfT0ZfVFhfUVVFVUUgICAgICAgIDB4MDA0MCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTk9OX01BQ19SWF9SRVNPVVJDRSAgICAweDAwODAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19SWF9SRVNPVVJDRSAgICAgICAgMHgwMTAwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19OT05fTUFDX1JYX0ZSQU1FICAgICAgIDB4MDIwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX1JYX0ZSQU1FICAgICAgICAgICAweDA0MDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX1RSQ19GSUZPX1NUQVRVUyAgICAgICAgMHgwODAwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19DT01NQU5EX1NUQVRVUyAgICAgICAgIDB4MTAwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX1RZUEVfMSAgICAgICAgICAgICAweDIwMDAgIC8qIFNlbGYgUmVtb3ZlZCAqLworI2RlZmluZSBTQ0xCX0lNQ19UUkNfSU5UUk5MX1RTVF9TVEFUVVMgIDB4NDAwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfUkVTMiAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qICovCisKKyNkZWZpbmUgRE1BX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRlJFUV8xNk1CX0JJVCAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgVEhEUkVOICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgQ0ZHMF9SU1YxICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgQ0ZHMF9SU1YyICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRVRSRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUlhfT1dOX0JJVCAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgUlhBVE1BQyAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgUFJPTUlTQ1VPVVNfQklUICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgVVNFVFBUICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgU0FWQkFEX0JJVCAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgT05FUVVFICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgTk9fQVVUT1JFTU9WRSAgICAgICAgICAgICAgICAgICAweDgwMDAKKworI2RlZmluZSBSWF9GQ0JfQVJFQV84MzE2ICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJYX0JVRkZfQVJFQV84MzE2ICAgICAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBUUkNfUE9JTlRFUihYKSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpKFgpIC0gdHAtPnJhbV9hY2Nlc3MpCisjZGVmaW5lIFJYX0ZDQl9UUkNfUE9JTlRFUihYKSAgICgodW5zaWduZWQgbG9uZykoWCkgLSB0cC0+cmFtX2FjY2VzcyArIFJYX0ZDQl9BUkVBXzgzMTYpCisjZGVmaW5lIFJYX0JVRkZfVFJDX1BPSU5URVIoWCkgKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzICsgUlhfQlVGRl9BUkVBXzgzMTYpCisKKy8vIE9mZnNldCAwOiBNU1IgLSBNZW1vcnkgU2VsZWN0IFJlZ2lzdGVyCisvLworI2RlZmluZSByNTg3X01TUiAgICAgICAgMHgwMDAgICAvLyBSZWdpc3RlciBPZmZzZXQKKy8vI2RlZmluZSAgICAgICBNU1JfUlNUICAgICAgICAgMHgwODAgICAvLyBMQU4gQ29udHJvbGxlciBSZXNldAorI2RlZmluZSBNU1JfTUVOQiAgICAgICAgMHgwNDAgICAvLyBTaGFyZWQgTWVtb3J5IEVuYWJsZQorI2RlZmluZSBNU1JfUkExOCAgICAgICAgMHgwMjAgICAvLyBSYW0gQWRkcmVzcyBiaXQgMTggICAoNTgzLCA1ODQsIDU4NykKKyNkZWZpbmUgTVNSX1JBMTcgICAgICAgIDB4MDEwICAgLy8gUmFtIEFkZHJlc3MgYml0IDE3ICAgKDU4MywgNTg0LCA1ODUvNzkwKQorI2RlZmluZSBNU1JfUkExNiAgICAgICAgMHgwMDggICAvLyBSYW0gQWRkcmVzcyBiaXQgMTYgICAoNTgzLCA1ODQsIDU4NS83OTApCisjZGVmaW5lIE1TUl9SQTE1ICAgICAgICAweDAwNCAgIC8vIFJhbSBBZGRyZXNzIGJpdCAxNSAgICg1ODMsIDU4NCwgNTg1Lzc5MCkKKyNkZWZpbmUgTVNSX1JBMTQgICAgICAgIDB4MDAyICAgLy8gUmFtIEFkZHJlc3MgYml0IDE0ICAgKDU4MywgNTg0LCA1ODUvNzkwKQorI2RlZmluZSBNU1JfUkExMyAgICAgICAgMHgwMDEgICAvLyBSYW0gQWRkcmVzcyBiaXQgMTMgICAoNTgzLCA1ODQsIDU4NS83OTApCisKKyNkZWZpbmUgTVNSX01BU0sgICAgICAgIDB4MDNGICAgLy8gTWFzayBmb3IgQWRkcmVzcyBiaXRzIFJBMTgtUkExMyAoNTgzLCA1ODQsIDU4NykKKworI2RlZmluZSBNU1IgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIElSUiAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSFdSICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBMQUFSICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIElNQ0NSICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTEFSMCAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBCRElEICAgICAgICAgICAgICAgICAgICAweDBFICAgIC8vIEFkYXB0ZXIgSUQgYnl0ZSByZWdpc3RlciBvZmZzZXQKKyNkZWZpbmUgQ1NSICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQUiAgICAgICAgICAgICAgICAgICAgICAweDExCisKKyNkZWZpbmUgTVNSX1JTVCAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNU1JfTUVNQiAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIE1TUl8wV1MgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBGT1JDRURfMTZCSVRfTU9ERSAgICAgICAweDAwMDIKKworI2RlZmluZSBJTlRFUkZSQU1FX1NQQUNJTkdfMTYgICAgICAgICAgIDB4MDAwMyAgLyogNiBieXRlcyAqLworI2RlZmluZSBJTlRFUkZSQU1FX1NQQUNJTkdfNCAgICAgICAgICAgIDB4MDAwMSAgLyogMiBieXRlcyAqLworI2RlZmluZSBNVUxUSUNBU1RfQUREUkVTU19CSVQgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBOT05fU1JDX1JPVVRJTkdfQklUICAgICAgICAgICAgIDB4MDAyMAorCisjZGVmaW5lIExPT1BJTkdfTU9ERV9NQVNLICAgICAgIDB4MDAwNworCisvKgorICogRGVjb2RlIGZpcm13YXJlIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgU1dBUF9CWVRFUyhYKQkJKChYICYgMHhmZikgPDwgOCkgfCAoWCA+PiA4KQorI2RlZmluZSBXRUlHSFRfT0ZGU0VUCQk1CisjZGVmaW5lIFRSRUVfU0laRV9PRkZTRVQJOQorI2RlZmluZSBUUkVFX09GRlNFVAkJMTEKKworLyogVGhlIEh1ZmZtYW4gRW5jb2RpbmcgVHJlZSBpcyBjb25zdHJ1Y3RlZCBvZiB0aGVzZSBub2Rlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3U4CWxsaW5rOwkvKiBTaG9ydCB2ZXJzaW9uIG9mIGFib3ZlIG5vZGUuICovCisJX191OAl0YWc7CisJX191OAlpbmZvOwkvKiBUaGlzIG5vZGUgaXMgdXNlZCBvbiBkZWNvZGVzLiAqLworCV9fdTgJcmxpbms7Cit9IERFQ09ERV9UUkVFX05PREU7CisKKyNkZWZpbmUgUk9PVAkwCS8qIEJyYW5jaCB2YWx1ZS4gKi8KKyNkZWZpbmUgTEVBRgkwCS8qIFRhZyBmaWVsZCB2YWx1ZS4gKi8KKyNkZWZpbmUgQlJBTkNICTEJLyogVGFnIGZpZWxkIHZhbHVlLiAqLworCisvKgorICogTXVsdGljYXN0IFRhYmxlIFN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIF9fdTggICAgYWRkcmVzc1s2XTsKKyAgICAgICAgX191OCAgICBpbnN0YW5jZV9jb3VudDsKK30gTWNUYWJsZTsKKworLyoKKyAqIEZyYWdtZW50IERlc2NyaXB0b3IgRGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIF9fdTggICpmcmFnbWVudF9wdHI7CisgICAgICAgIF9fdTMyICAgZnJhZ21lbnRfbGVuZ3RoOworfSBGcmFnbWVudFN0cnVjdHVyZTsKKworLyoKKyAqIERhdGEgQnVmZmVyIFN0cnVjdHVyZSBEZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgX191MzIgZnJhZ21lbnRfY291bnQ7CisgICAgICAgIEZyYWdtZW50U3RydWN0dXJlICAgICAgIGZyYWdtZW50X2xpc3RbTUFYRlJBR01FTlRTXTsKK30gRGF0YUJ1ZmZlclN0cnVjdHVyZTsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgX191OCAgICBJVHlwZTsKKyAgICAgICAgICAgICAgICBfX3U4ICAgIElTdWJ0eXBlOworfSBJbnRlcnJ1cHRfU3RhdHVzX1dvcmQ7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgQkRCbG9ja1R5cGUgeworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGluZm87ICAgICAgICAgICAgICAgICAgIC8qIDAyICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX25leHRfcHRyOyAgICAgICAgICAgLyogMDYgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfZGF0YV9ibG9ja19wdHI7ICAgICAvKiAxMCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGg7ICAgICAgICAgIC8qIDEyICovCisKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICAqZGF0YV9ibG9ja19wdHI7ICAgICAgICAvKiAxNiAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgQkRCbG9ja1R5cGUgICAgICpuZXh0X3B0cjsgICAgICAgICAgICAgIC8qIDIwICovCisgICAgICAgICAgICAgICAgc3RydWN0ICBCREJsb2NrVHlwZSAgICAgKmJhY2tfcHRyOyAgICAgICAgICAgICAgLyogMjQgKi8KKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbOF07ICAgICAgICAgICAgICAvKiAzMiAqLworfSBCREJsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IEZDQmxvY2tUeXBlIHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBmcmFtZV9zdGF0dXM7ICAgICAgICAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGluZm87ICAgICAgICAgICAgICAgICAgIC8qIDA0ICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX25leHRfcHRyOyAgICAgICAgICAgLyogMDggKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfYmRiX3B0cjsgICAgICAgICAgICAvKiAxMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aDsgICAgICAgICAgIC8qIDE0ICovCisKKyAgICAgICAgICAgICAgICBCREJsb2NrICAgICAgICAgICAgICAgICAqYmRiX3B0cjsgICAgICAgICAgICAgICAvKiAxOCAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgRkNCbG9ja1R5cGUgICAgICpuZXh0X3B0cjsgICAgICAgICAgICAgIC8qIDIyICovCisgICAgICAgICAgICAgICAgc3RydWN0ICBGQ0Jsb2NrVHlwZSAgICAgKmJhY2tfcHRyOyAgICAgICAgICAgICAgLyogMjYgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBtZW1vcnlfYWxsb2M7ICAgICAgICAgICAvKiAyOCAqLworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGZpbGxlcls0XTsgICAgICAgICAgICAgIC8qIDMyICovCisKK30gRkNCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBTQmxvY2tUeXBleworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbF9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZV9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1cnN0X0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVJWRURfQ09VTlRFUl8wOworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgQURfVFJBTlNfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ1ZfQ29uZ2VzdGlvbl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvc3RfRlJfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVRX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJfQ29waWVkX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVJWRURfQ09VTlRFUl8xOworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5fRXJyb3JfQ291bnQ7CisKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJX05ESVNfUmluZ19TdGF0dXM7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ05fVHlwZTsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yX0NvZGU7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBTQV9vZl9MYXN0X0FNUF9TTVBbM107CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBVTkFbM107CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBVY29kZV9WZXJzaW9uX051bWJlcjsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c19DSEdfSW5kaWNhdGU7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFUlZFRF9TVEFUVVNfMDsKK30gU0Jsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IEFDQmxvY2tUeXBlIHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBjbWRfZG9uZV9zdGF0dXM7ICAgIC8qIDAyICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgY21kX2luZm87ICAgICAgICAgICAvKiAwNCAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19uZXh0X3B0cjsgICAgICAgICAgIC8qIDA4ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgY21kOyAgICAgICAgICAgICAgICAvKiAxMCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIHN1YmNtZDsgICAgICAgICAgICAgLyogMTIgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldF9sbzsgICAgICAgICAvKiAxNCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0X2hpOyAgICAgICAgIC8qIDE2ICovCisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIEFDQmxvY2tUeXBlICAgICAqbmV4dF9wdHI7ICAgICAgICAgICAgICAvKiAyMCAqLworCisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgZmlsbGVyWzEyXTsgICAgICAgICAgICAgLyogMzIgKi8KK30gQUNCbG9jazsKKworI2RlZmluZSBOVU1fT0ZfSU5URVJSVVBUUyAgICAgICAgICAgICAgIDB4MjAKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgSW50ZXJydXB0X1N0YXR1c19Xb3JkICAgSVN0YXR1c1tOVU1fT0ZfSU5URVJSVVBUU107Cit9IElTQmxvY2s7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIHZhbGlkX2NvbW1hbmQ7ICAgICAgICAgIC8qIDAyICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgaWFja19jb2RlOyAgICAgICAgICAgICAgLyogMDQgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICByZXN1bWVfY29udHJvbDsgICAgICAgICAvKiAwNiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGludF9tYXNrX2NvbnRyb2w7ICAgICAgIC8qIDA4ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgaW50X21hc2tfc3RhdGU7ICAgICAgICAgLyogMTAgKi8KKworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGZpbGxlcls2XTsgICAgICAgICAgICAgIC8qIDE2ICovCit9IFNDTEJsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgY29uZmlnOyAgICAgICAgICAgICAgICAgLyogMDIgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfc2NsYl9wdHI7ICAgICAgICAgICAvKiAwNiAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19hY2JfcHRyOyAgICAgICAgICAgIC8qIDEwICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX2lzYl9wdHI7ICAgICAgICAgICAgLyogMTQgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpc2JzaXo7ICAgICAgICAgICAgICAgICAvKiAxNiAqLworCisgICAgICAgICAgICAgICAgU0NMQmxvY2sgICAgICAgICAgICAgICAgKnNjbGJfcHRyOyAgICAgICAgICAgICAgLyogMjAgKi8KKyAgICAgICAgICAgICAgICBBQ0Jsb2NrICAgICAgICAgICAgICAgICAqYWNiX3B0cjsgICAgICAgICAgICAgICAvKiAyNCAqLworICAgICAgICAgICAgICAgIElTQmxvY2sgICAgICAgICAgICAgICAgICppc2JfcHRyOyAgICAgICAgICAgICAgIC8qIDI4ICovCisKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBOb25fTWFjX1J4X0JkYnM7ICAgICAgICAvKiAzMCBERUJVRyAqLworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGZpbGxlclsyXTsgICAgICAgICAgICAgIC8qIDMyICovCisKK30gU0NHQmxvY2s7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QKK3sKKwlfX3UzMgkJdHJjX3NjZ2JfcHRyOworCVNDR0Jsb2NrCSpzY2diX3B0cjsKK30gSVNDUEJsb2NrOworI3ByYWdtYSBwYWNrKCkKKwordHlwZWRlZiBzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlJU0NQQmxvY2sgICAgICAgKmlzY3BiX3B0cjsKKyAgICAgICAgU0NHQmxvY2sgICAgICAgICpzY2diX3B0cjsKKyAgICAgICAgU0NMQmxvY2sgICAgICAgICpzY2xiX3B0cjsKKyAgICAgICAgSVNCbG9jayAgICAgICAgICppc2JfcHRyOworCisJQUNCbG9jayAgICAgICAgICphY2JfaGVhZDsKKyAgICAgICAgQUNCbG9jayAgICAgICAgICphY2JfY3VycjsKKyAgICAgICAgQUNCbG9jayAgICAgICAgICphY2JfbmV4dDsKKworCV9fdTgJCWFkYXB0ZXJfbmFtZVsxMl07CisKKwlfX3UxNgkJbnVtX3J4X2JkYnMJW05VTV9SWF9RU19VU0VEXTsKKwlfX3UxNgkJbnVtX3J4X2ZjYnMJW05VTV9SWF9RU19VU0VEXTsKKworCV9fdTE2CQludW1fdHhfYmRicwlbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQludW1fdHhfZmNicwlbTlVNX1RYX1FTX1VTRURdOworCisJX191MTYJCW51bV9vZl90eF9idWZmczsKKworCV9fdTE2CQl0eF9idWZmX3NpemUJW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJdHhfYnVmZl91c2VkCVtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCXR4X3F1ZXVlX3N0YXR1cwlbTlVNX1RYX1FTX1VTRURdOworCisJRkNCbG9jawkJKnR4X2ZjYl9oZWFkW05VTV9UWF9RU19VU0VEXTsKKwlGQ0Jsb2NrCQkqdHhfZmNiX2N1cnJbTlVNX1RYX1FTX1VTRURdOworCUZDQmxvY2sJCSp0eF9mY2JfZW5kW05VTV9UWF9RU19VU0VEXTsKKwlCREJsb2NrCQkqdHhfYmRiX2hlYWRbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQkqdHhfYnVmZl9oZWFkW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJKnR4X2J1ZmZfZW5kW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJKnR4X2J1ZmZfY3VycltOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCW51bV90eF9mY2JzX3VzZWRbTlVNX1RYX1FTX1VTRURdOworCisJRkNCbG9jawkJKnJ4X2ZjYl9oZWFkW05VTV9SWF9RU19VU0VEXTsKKwlGQ0Jsb2NrCQkqcnhfZmNiX2N1cnJbTlVNX1JYX1FTX1VTRURdOworCUJEQmxvY2sJCSpyeF9iZGJfaGVhZFtOVU1fUlhfUVNfVVNFRF07CisJQkRCbG9jawkJKnJ4X2JkYl9jdXJyW05VTV9SWF9RU19VU0VEXTsKKwlCREJsb2NrCQkqcnhfYmRiX2VuZFtOVU1fUlhfUVNfVVNFRF07CisJX191MTYJCSpyeF9idWZmX2hlYWRbTlVNX1JYX1FTX1VTRURdOworCV9fdTE2CQkqcnhfYnVmZl9lbmRbTlVNX1JYX1FTX1VTRURdOworCisJX191MzIJCSpwdHJfbG9jYWxfcmluZ19udW07CisKKwlfX3UzMgkJc2hfbWVtX3VzZWQ7CisKKwlfX3UxNgkJcGFnZV9vZmZzZXRfbWFzazsKKworCV9fdTE2CQlhdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXM7CisJX191MTYJCWF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5OworCisgICAgICAgIF9fdTE2ICAgICAgICAgICAgbnVtX2FjYnM7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgbnVtX2FjYnNfdXNlZDsKKyAgICAgICAgX191MTYgICAgICAgICAgICBhY2JfcGVuZGluZzsKKworCV9fdTE2CQljdXJyZW50X2lzYl9pbmRleDsKKworCV9fdTggICAgICAgICAgICBtb25pdG9yX3N0YXRlOworCV9fdTgJCW1vbml0b3Jfc3RhdGVfcmVhZHk7CisJX191MTYJCXJpbmdfc3RhdHVzOworCV9fdTgJCXJpbmdfc3RhdHVzX2ZsYWdzOworCV9fdTgJCWN1cnJlbnRfcmluZ19zdGF0dXM7CisJX191OAkJc3RhdGU7CisKKwlfX3U4CQlqb2luX3N0YXRlOworCisJX191OAkJc2xvdF9udW07CisJX191MTYJCXBvc19pZDsKKworCV9fdTMyCQkqcHRyX3VuYTsKKwlfX3UzMgkJKnB0cl9iY25fdHlwZTsKKwlfX3UzMgkJKnB0cl90eF9maWZvX3VuZGVycnVuczsKKwlfX3UzMgkJKnB0cl9yeF9maWZvX3VuZGVycnVuczsKKwlfX3UzMgkJKnB0cl9yeF9maWZvX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3R4X2ZpZm9fb3ZlcnJ1bnM7CisJX191MzIJCSpwdHJfdHhfZmNiX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3J4X2ZjYl9vdmVycnVuczsKKwlfX3UzMgkJKnB0cl90eF9iZGJfb3ZlcnJ1bnM7CisJX191MzIJCSpwdHJfcnhfYmRiX292ZXJydW5zOworCisJX191MTYJCXJlY2VpdmVfcXVldWVfbnVtYmVyOworCisJX191OAkJcnhfZmlmb19vdmVycnVuX2NvdW50OworCV9fdTgJCXR4X2ZpZm9fb3ZlcnJ1bl9jb3VudDsKKworCV9fdTE2ICAgICAgICAgICAgYWRhcHRlcl9mbGFnczsKKwlfX3UxNgkJYWRhcHRlcl9mbGFnczE7CisJX191MTYgICAgICAgICAgICAqbWlzY19jb21tYW5kX2RhdGE7CisJX191MTYgICAgICAgICAgICBtYXhfcGFja2V0X3NpemU7CisKKwlfX3UxNiAgICAgICAgICAgIGNvbmZpZ193b3JkMDsKKyAgICAgICAgX191MTYgICAgICAgICAgICBjb25maWdfd29yZDE7CisKKwlfX3U4ICAgICAgICAgICAgdHJjX21hc2s7CisKKwlfX3UxNiAgICAgICAgICAgIHNvdXJjZV9yaW5nX251bWJlcjsKKyAgICAgICAgX191MTYgICAgICAgICAgICB0YXJnZXRfcmluZ19udW1iZXI7CisKKwlfX3UxNgkJbWljcm9jb2RlX3ZlcnNpb247CisKKwlfX3UxNiAgICAgICAgICAgIGJpY190eXBlOworICAgICAgICBfX3UxNiAgICAgICAgICAgIG5pY190eXBlOworICAgICAgICBfX3UxNiAgICAgICAgICAgIGJvYXJkX2lkOworCisJX191MTYgICAgICAgICAgICByb21fc2l6ZTsKKwlfX3UzMgkJcm9tX2Jhc2U7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgcmFtX3NpemU7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgcmFtX3VzYWJsZTsKKwlfX3UzMgkJcmFtX2Jhc2U7CisJX191MzIJCXJhbV9hY2Nlc3M7CisKKwlfX3UxNiAgICAgICAgICAgIGV4dHJhX2luZm87CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgbW9kZV9iaXRzOworCV9fdTE2CQltZWRpYV9tZW51OworCV9fdTE2CQltZWRpYV90eXBlOworCV9fdTE2CQlhZGFwdGVyX2J1czsKKworCV9fdTE2CQlzdGF0dXM7CisJX191MTYgICAgICAgICAgICByZWNlaXZlX21hc2s7CisKKwlfX3UxNiAgICAgICAgICAgIGdyb3VwX2FkZHJlc3NfMDsKKyAgICAgICAgX191MTYgICAgICAgICAgICBncm91cF9hZGRyZXNzWzJdOworICAgICAgICBfX3UxNiAgICAgICAgICAgIGZ1bmN0aW9uYWxfYWRkcmVzc18wOworICAgICAgICBfX3UxNiAgICAgICAgICAgIGZ1bmN0aW9uYWxfYWRkcmVzc1syXTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBiaXR3aXNlX2dyb3VwX2FkZHJlc3NbMl07CisKKwlfX3U4ICAgICAgICAgICAgKnB0cl91Y29kZTsKKworCV9fdTgJCWNsZWFudXA7CisKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIFNlbmRTa2JRdWV1ZTsKKyAgICAgICAgX191MTYgUXVldWVTa2I7CisKKwlzdHJ1Y3QgdHJfc3RhdGlzdGljcyBNYWNTdGF0OyAgIC8qIE1BQyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCQorCXNwaW5sb2NrX3QJbG9jazsKK30gTkVUX0xPQ0FMOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTTk1QLU9OLUJPQVJEIEFnZW50IExpbmsgU3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIF9fdTggICAgICAgICAgIExua1NpZ1N0clsxMl07IC8qIHNpZ25hdHVyZSBzdHJpbmcgIlNtY0xpbmtUYWJsZSIgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRHJ2VHlwOyAgICAgLyogMT1SZWRib3ggT0RJLCAyPU9ESSBET1MsIDM9T0RJIE9TLzIsIDQ9TkRJUyBET1MgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRmxnOyAgICAgICAgLyogMCBpZiBubyBhZ2VudCBsaW5rZWQsIDEgaWYgYWdlbnQgbGlua2VkICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtOZm87ICAgICAgIC8qIHJvdXRpbmUgd2hpY2ggcmV0dXJucyBwb2ludGVyIHRvIE5JQyBpbmZvICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtBZ3RSY3Y7ICAgIC8qIHBvaW50ZXIgdG8gYWdlbnQgcmVjZWl2ZSB0cmFwIGVudHJ5ICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtBZ3RYbXQ7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBhZ2VudCB0cmFuc21pdCB0cmFwCitlbnRyeSAgKi8KK3ZvaWQgICAgICAgICAgICpMbmtHZXQ7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBOSUMgcmVjZWl2ZSBkYXRhCitjb3B5IHJvdXRpbmUgKi8KKyAgICAgICAgdm9pZCAgICAgICAgICAgKkxua1NuZDsgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIE5JQyBzZW5kIHJvdXRpbmUKKyovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtSc3Q7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBOSUMgZHJpdmVyIHJlc2V0Cityb3V0aW5lICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtNaWI7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBNSUIgZGF0YSBiYXNlICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtNaWJBY3Q7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBNSUIgYWN0aW9uIHJvdXRpbmUgbGlzdCAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgTG5rQ250T2Zmc2V0OyAgLyogb2Zmc2V0IHRvIGVycm9yIGNvdW50ZXJzICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBMbmtDbnROdW07ICAgICAvKiBudW1iZXIgb2YgZXJyb3IgY291bnRlcnMgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIExua0NudFNpemU7ICAgIC8qIHNpemUgb2YgZXJyb3IgY291bnRlcnMgaS5lLiAzMiA9IDMyIGJpdHMgKi8KKyAgICAgICAgdm9pZCAgICAgICAgICAgKkxua0lTUjsgICAgICAgLyogcG9pbnRlciB0byBpbnRlcnJ1cHQgdmVjdG9yICovCisgICAgICAgIF9fdTggICAgICAgICAgIExua0ZybVR5cDsgICAgIC8qIDE9RXRoZXJuZXQsIDI9VG9rZW4gUmluZyAqLworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtEcnZWZXIxIDsgICAvKiBkcml2ZXIgbWFqb3IgdmVyc2lvbiAqLworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtEcnZWZXIyIDsgICAvKiBkcml2ZXIgbWlub3IgdmVyc2lvbiAqLworfSBBZ2VudExpbms7CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgcGNtX2NhcmRfZmxhZ3MoYml0X21hcHBlZCkKKyAqLworI2RlZmluZSBSRUdfQ09NUExFVEUgICAweDAwMDEKKyNkZWZpbmUgSU5TRVJURUQgICAgICAgMHgwMDAyCisjZGVmaW5lIFBDQ19JTlNFUlRFRCAgIDB4MDAwNCAgICAgICAgIC8qIDE9Y3VycmVudGx5IGluc2VydGVkLCAwPWN1ciByZW1vdmVkICovCisKKy8qCisgKiBBZGFwdGVyIFJBTSB0ZXN0IHBhdHRlcm5zCisgKi8KKyNkZWZpbmUgUkFNX1BBVFRFUk5fMSAgMHg1NUFBCisjZGVmaW5lIFJBTV9QQVRURVJOXzIgIDB4OTI0OQorI2RlZmluZSBSQU1fUEFUVEVSTl8zICAweERCNkQKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBSQU0gdGVzdAorICovCisjZGVmaW5lIFJPTV9TSUdOQVRVUkUgIDB4QUE1NQorI2RlZmluZSBNSU5fUk9NX1NJWkUgICAweDIwMDAKKworLyoKKyAqIFJldHVybiBDb2RlcworICovCisjZGVmaW5lIFNVQ0NFU1MgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBREFQVEVSX0FORF9DT05GSUcgICAgICAweDAwMDEKKyNkZWZpbmUgQURBUFRFUl9OT19DT05GSUcgICAgICAgMHgwMDAyCisjZGVmaW5lIE5PVF9NWV9JTlRFUlJVUFQgICAgICAgIDB4MDAwMworI2RlZmluZSBGUkFNRV9SRUpFQ1RFRCAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRVZFTlRTX0RJU0FCTEVEICAgICAgICAgMHgwMDA1CisjZGVmaW5lIE9VVF9PRl9SRVNPVVJDRVMgICAgICAgIDB4MDAwNgorI2RlZmluZSBJTlZBTElEX1BBUkFNRVRFUiAgICAgICAweDAwMDcKKyNkZWZpbmUgSU5WQUxJRF9GVU5DVElPTiAgICAgICAgMHgwMDA4CisjZGVmaW5lIElOSVRJQUxJWkVfRkFJTEVEICAgICAgIDB4MDAwOQorI2RlZmluZSBDTE9TRV9GQUlMRUQgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgTUFYX0NPTExJU0lPTlMgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIE5PX1NVQ0hfREVTVElOQVRJT04gICAgIDB4MDAwQworI2RlZmluZSBCVUZGRVJfVE9PX1NNQUxMX0VSUk9SICAweDAwMEQKKyNkZWZpbmUgQURBUFRFUl9DTE9TRUQgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFVDT0RFX05PVF9QUkVTRU5UICAgICAgIDB4MDAwRgorI2RlZmluZSBGSUZPX1VOREVSUlVOICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgREVTVF9PVVRfT0ZfUkVTT1VSQ0VTICAgMHgwMDExCisjZGVmaW5lIEFEQVBURVJfTk9UX0lOSVRJQUxJWkVEIDB4MDAxMgorI2RlZmluZSBQRU5ESU5HICAgICAgICAgICAgICAgICAweDAwMTMKKyNkZWZpbmUgVUNPREVfUFJFU0VOVCAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIE5PVF9JTklUX0JZX0JSSURHRSAgICAgIDB4MDAxNQorCisjZGVmaW5lIE9QRU5fRkFJTEVEICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBIQVJEV0FSRV9GQUlMRUQgICAgICAgICAweDAwODEKKyNkZWZpbmUgU0VMRl9URVNUX0ZBSUxFRCAgICAgICAgMHgwMDgyCisjZGVmaW5lIFJBTV9URVNUX0ZBSUxFRCAgICAgICAgIDB4MDA4MworI2RlZmluZSBSQU1fQ09ORkxJQ1QgICAgICAgICAgICAweDAwODQKKyNkZWZpbmUgUk9NX0NPTkZMSUNUICAgICAgICAgICAgMHgwMDg1CisjZGVmaW5lIFVOS05PV05fQURBUFRFUiAgICAgICAgIDB4MDA4NgorI2RlZmluZSBDT05GSUdfRVJST1IgICAgICAgICAgICAweDAwODcKKyNkZWZpbmUgQ09ORklHX1dBUk5JTkcgICAgICAgICAgMHgwMDg4CisjZGVmaW5lIE5PX0ZJWEVEX0NORkcgICAgICAgICAgIDB4MDA4OQorI2RlZmluZSBFRVJPTV9DS1NVTV9FUlJPUiAgICAgICAweDAwOEEKKyNkZWZpbmUgUk9NX1NJR05BVFVSRV9FUlJPUiAgICAgMHgwMDhCCisjZGVmaW5lIFJPTV9DSEVDS1NVTV9FUlJPUiAgICAgIDB4MDA4QworI2RlZmluZSBST01fU0laRV9FUlJPUiAgICAgICAgICAweDAwOEQKKyNkZWZpbmUgVU5TVVBQT1JURURfTklDX0NISVAgICAgMHgwMDhFCisjZGVmaW5lIE5JQ19SRUdfRVJST1IgICAgICAgICAgIDB4MDA4RgorI2RlZmluZSBCSUNfUkVHX0VSUk9SICAgICAgICAgICAweDAwOTAKKyNkZWZpbmUgTUlDUk9DT0RFX1RFU1RfRVJST1IgICAgMHgwMDkxCisjZGVmaW5lIExPQkVfTUVESUFfVEVTVF9GQUlMRUQgIDB4MDA5MgorCisjZGVmaW5lIEFEQVBURVJfRk9VTkRfTEFOX0NPUlJVUFQgMHgwMDlCCisKKyNkZWZpbmUgQURBUFRFUl9OT1RfRk9VTkQgICAgICAgMHhGRkZGCisKKyNkZWZpbmUgSUxMRUdBTF9GVU5DVElPTiAgICAgICAgSU5WQUxJRF9GVU5DVElPTgorCisvKiBFcnJvcnMgKi8KKyNkZWZpbmUgSU9fQkFTRV9JTlZBTElEICAgICAgICAgMHgwMDAxCisjZGVmaW5lIElPX0JBU0VfUkFOR0UgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJUlFfSU5WQUxJRCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSVJRX1JBTkdFICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFJBTV9CQVNFX0lOVkFMSUQgICAgICAgIDB4MDAxMAorI2RlZmluZSBSQU1fQkFTRV9SQU5HRSAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUkFNX1NJWkVfUkFOR0UgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIE1FRElBX0lOVkFMSUQgICAgICAgICAgIDB4MDgwMAorCisvKiBXYXJuaW5ncyAqLworI2RlZmluZSBJUlFfTUlTTUFUQ0ggICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUkFNX0JBU0VfTUlTTUFUQ0ggICAgICAgMHgwMTAwCisjZGVmaW5lIFJBTV9TSVpFX01JU01BVENIICAgICAgIDB4MDIwMAorI2RlZmluZSBCVVNfTU9ERV9NSVNNQVRDSCAgICAgICAweDA0MDAKKworI2RlZmluZSBSWF9DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSWF9BTElHTk1FTlRfRVJST1IgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlhfSFdfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQgUklOR19TVEFUVVNfRkxBR1MKKyAqLworI2RlZmluZSBSSU5HX1NUQVRVU19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgMFgwMQorI2RlZmluZSBNT05JVE9SX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgMFgwMgorI2RlZmluZSBKT0lOX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgMFgwNAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZCBKT0lOX1NUQVRFCisgKi8KKyNkZWZpbmUgSlNfQllQQVNTX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSlNfTE9CRV9URVNUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSlNfREVURUNUX01PTklUT1JfUFJFU0VOVF9TVEFURSAgICAgICAgIDB4MDIKKyNkZWZpbmUgSlNfQVdBSVRfTkVXX01PTklUT1JfU1RBVEUgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgSlNfRFVQTElDQVRFX0FERFJFU1NfVEVTVF9TVEFURSAgICAgICAgIDB4MDQKKyNkZWZpbmUgSlNfTkVJR0hCT1JfTk9USUZJQ0FUSU9OX1NUQVRFICAgICAgICAgIDB4MDUKKyNkZWZpbmUgSlNfUkVRVUVTVF9JTklUSUFMSVpBVElPTl9TVEFURSAgICAgICAgIDB4MDYKKyNkZWZpbmUgSlNfSk9JTl9DT01QTEVURV9TVEFURSAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSlNfQllQQVNTX1dBSVRfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MDgKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQgTU9OSVRPUl9TVEFURQorICovCisjZGVmaW5lIE1TX01PTklUT1JfRlNNX0lOQUNUSVZFICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE1TX1JFUEVBVF9CRUFDT05fU1RBVEUgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1TX1JFUEVBVF9DTEFJTV9UT0tFTl9TVEFURSAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1TX1RSQU5TTUlUX0NMQUlNX1RPS0VOX1NUQVRFICAgICAgICAgICAweDAzCisjZGVmaW5lIE1TX1NUQU5EQllfTU9OSVRPUl9TVEFURSAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1TX1RSQU5TTUlUX0JFQUNPTl9TVEFURSAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIE1TX0FDVElWRV9NT05JVE9SX1NUQVRFICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIE1TX1RSQU5TTUlUX1JJTkdfUFVSR0VfU1RBVEUgICAgICAgICAgICAweDA3CisjZGVmaW5lIE1TX0JFQUNPTl9URVNUX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDA5CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGJpdC1maWVsZCBSSU5HX1NUQVRVUworICovCisjZGVmaW5lIFNJR05BTF9MT1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSEFSRF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBTT0ZUX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFRSQU5TTUlUX0JFQUNPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgTE9CRV9XSVJFX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBBVVRPX1JFTU9WQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFJFTU9WRV9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQ09VTlRFUl9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTSU5HTEVfU1RBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFJJTkdfUkVDT1ZFUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQgQlVTX1RZUEUKKyAqLworI2RlZmluZSBBVF9CVVMgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE1DQV9CVVMgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUlTQV9CVVMgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQQ0lfQlVTICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFBDTUNJQV9CVVMgICAgICAgICAgICAgIDB4MDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBhZGFwdGVyX2ZsYWdzCisgKi8KKyNkZWZpbmUgUlhfVkFMSURfTE9PS0FIRUFEICAgICAgMHgwMDAxCisjZGVmaW5lIEZPUkNFRF8xNkJJVF9NT0RFICAgICAgIDB4MDAwMgorI2RlZmluZSBBREFQVEVSX0RJU0FCTEVEICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFJBTlNNSVRfQ0hBSU5fSU5UICAgICAgMHgwMDA4CisjZGVmaW5lIEVBUkxZX1JYX0ZSQU1FICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBFQVJMWV9UWCAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgRUFSTFlfUlhfQ09QWSAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFVTRVNfUEhZU0lDQUxfQUREUiAgICAgIDB4MDA4MAkJLyogUnN2ZCBmb3IgREVDIFBDSSBhbmQgOTIzMiAqLworI2RlZmluZSBORUVEU19QSFlTSUNBTF9BRERSICAJMHgwMTAwICAgICAgIAkvKiBSZXNlcnZlZCovCisjZGVmaW5lIFJYX1NUQVRVU19QRU5ESU5HICAgICAgIDB4MDIwMAorI2RlZmluZSBFUlhfRElTQUJMRUQgICAgICAgICAJMHgwNDAwICAgICAgIAkvKiBFQVJMWV9SWF9FTkFCTEUgcmN2X21hc2sgKi8KKyNkZWZpbmUgRU5BQkxFX1RYX1BFTkRJTkcgICAgICAgMHgwODAwCisjZGVmaW5lIEVOQUJMRV9SWF9QRU5ESU5HICAgICAgIDB4MTAwMAorI2RlZmluZSBQRVJNX0NMT1NFICAgICAgICAgICAgICAweDIwMDAgIAorI2RlZmluZSBJT19NQVBQRUQgICAgICAgICAgICAgICAweDQwMDAgIAkvKiBJT21hcHBlZCBidXMgaW50ZXJmYWNlIDc5NSAqLworI2RlZmluZSBFVFhfRElTQUJMRUQgICAgICAgICAgICAweDgwMDAKKworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGFkYXB0ZXJfZmxhZ3MxCisgKi8KKyNkZWZpbmUgVFhfUEhZX1JYX1ZJUlQgICAgICAgICAgMHgwMDAxIAorI2RlZmluZSBORUVEU19IT1NUX1JBTSAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTkVFRFNfTUVESUFfVFlQRSAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVBUkxZX1JYX0RPTkUgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQTlBfQk9PVF9CSVQgICAgICAgICAgICAweDAwMTAgIC8qIGFjdGl2YXRlcyBQblAgJiBjb25maWcgb24gcG93ZXItdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciA9PiByZWd1bGFyIFBuUCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgUE5QX0VOQUJMRSAgICAgICAgICAgICAgMHgwMDIwICAvKiByZWd1bGFyIFBuUCBvcGVyYXRpb24gY2xlYXIgPT4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBQblAsIG92ZXJyaWRlcyBQTlBfQk9PVF9CSVQgKi8KKyNkZWZpbmUgU0FUVVJOX0VOQUJMRSAgICAgICAgICAgMHgwMDQwCisKKyNkZWZpbmUgQURBUFRFUl9SRU1PVkFCTEUgICAgICAgMHgwMDgwIAkvKiBhZGFwdGVyIGlzIGhvdCBzd2FwcGFibGUgKi8KKyNkZWZpbmUgVFhfUEhZICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBVc2VzIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHR4IGJ1ZnMgKi8KKyNkZWZpbmUgUlhfUEhZICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBVc2VzIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHJ4IGJ1ZnMgKi8KKyNkZWZpbmUgVFhfVklSVCAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBVc2VzIHZpcnR1YWwgYWRkciBmb3IgdHggYnVmcyAqLworI2RlZmluZSBSWF9WSVJUICAgICAgICAgICAgICAgICAweDA4MDAgCisjZGVmaW5lIE5FRURTX1NFUlZJQ0UgICAgICAgICAgIDB4MTAwMCAKKworLyoKKyAqIEFkYXB0ZXIgU3RhdHVzIENvZGVzCisgKi8KKyNkZWZpbmUgT1BFTiAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIElOSVRJQUxJWkVEICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBDTE9TRUQgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRkFJTEVEICAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIE5PVF9JTklUSUFMSVpFRCAgICAgICAgIDB4MDAwNgorI2RlZmluZSBJT19DT05GTElDVCAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgQ0FSRF9SRU1PVkVEICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIENBUkRfSU5TRVJURUQgICAgICAgICAgIDB4MDAwOQorCisvKgorICogTW9kZSBCaXQgRGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBJTlRFUlJVUFRfU1RBVFVTX0JJVCAgICAweDgwMDAgIC8qIFBDIEludGVycnVwdCBMaW5lOiAwID0gTm90IEVuYWJsZWQgKi8KKyNkZWZpbmUgQk9PVF9TVEFUVVNfTUFTSyAgICAgICAgMHg2MDAwICAvKiBNYXNrIHRvIGlzb2xhdGUgQk9PVF9TVEFUVVMgKi8KKyNkZWZpbmUgQk9PVF9JTkhJQklUICAgICAgICAgICAgMHgwMDAwICAvKiBCT09UX1NUQVRVUyBpcyAnaW5oaWJpdGVkJyAqLworI2RlZmluZSBCT09UX1RZUEVfMSAgICAgICAgICAgICAweDIwMDAgIC8qIFVudXNlZCBCT09UX1NUQVRVUyB2YWx1ZSAqLworI2RlZmluZSBCT09UX1RZUEVfMiAgICAgICAgICAgICAweDQwMDAgIC8qIFVudXNlZCBCT09UX1NUQVRVUyB2YWx1ZSAqLworI2RlZmluZSBCT09UX1RZUEVfMyAgICAgICAgICAgICAweDYwMDAgIC8qIFVudXNlZCBCT09UX1NUQVRVUyB2YWx1ZSAqLworI2RlZmluZSBaRVJPX1dBSVRfU1RBVEVfTUFTSyAgICAweDE4MDAgIC8qIE1hc2sgdG8gaXNvbGF0ZSBXYWl0IFN0YXRlIGZsYWdzICovCisjZGVmaW5lIFpFUk9fV0FJVF9TVEFURV84X0JJVCAgIDB4MTAwMCAgLyogMCA9IERpc2FibGVkIChJbnNlcnRzIFdhaXQgU3RhdGVzKSAqLworI2RlZmluZSBaRVJPX1dBSVRfU1RBVEVfMTZfQklUICAweDA4MDAgIC8qIDAgPSBEaXNhYmxlZCAoSW5zZXJ0cyBXYWl0IFN0YXRlcykgKi8KKyNkZWZpbmUgTE9PUElOR19NT0RFX01BU0sgICAgICAgMHgwMDA3CisjZGVmaW5lIExPT1BCQUNLX01PREVfMCAgICAgICAgIDB4MDAwMAorI2RlZmluZSBMT09QQkFDS19NT0RFXzEgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV8yICAgICAgICAgMHgwMDAyCisjZGVmaW5lIExPT1BCQUNLX01PREVfMyAgICAgICAgIDB4MDAwMworI2RlZmluZSBMT09QQkFDS19NT0RFXzQgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV81ICAgICAgICAgMHgwMDA1CisjZGVmaW5lIExPT1BCQUNLX01PREVfNiAgICAgICAgIDB4MDAwNgorI2RlZmluZSBMT09QQkFDS19NT0RFXzcgICAgICAgICAweDAwMDcKKyNkZWZpbmUgQVVUT19NRURJQV9ERVRFQ1QgICAgICAgMHgwMDA4CisjZGVmaW5lIE1BTlVBTF9DUkMgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBFQVJMWV9UT0tFTl9SRUwgICAgICAgICAweDAwMjAgIC8qIEVhcmx5IFRva2VuIFJlbGVhc2UgZm9yIFRva2VuIFJpbmcgKi8KKyNkZWZpbmUgVU1BQyAgICAgICAgICAgICAgIDB4MDA0MCAKKyNkZWZpbmUgVVRQMl9QT1JUICAgICAgICAgICAgICAgMHgwMDgwICAvKiBGb3IgODIxNlQyLCAwPXBvcnQgQSwgMT1Qb3J0IEIuICovCisjZGVmaW5lIEJOQ18xMEJUX0lOVEVSRkFDRSAgICAgIDB4MDYwMCAgLyogQk5DIGFuZCBVVFAgY3VycmVudCBtZWRpYSBzZXQgKi8KKyNkZWZpbmUgVVRQX0lOVEVSRkFDRSAgICAgICAgICAgMHgwNTAwICAvKiBFdGhlcm5ldCBVVFAgT25seS4gKi8KKyNkZWZpbmUgQk5DX0lOVEVSRkFDRSAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFVSV9JTlRFUkZBQ0UgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBBVUlfMTBCVF9JTlRFUkZBQ0UgICAgICAweDAyMDAKKyNkZWZpbmUgU1RBUkxBTl8xMF9JTlRFUkZBQ0UgICAgMHgwMTAwCisjZGVmaW5lIElOVEVSRkFDRV9UWVBFX01BU0sgICAgIDB4MDcwMAorCisvKgorICogTWVkaWEgVHlwZSBCaXQgRGVmaW5pdGlvbnMKKyAqCisgKiBsZWdlbmQ6ICAgICAgVFAgPSBUd2lzdGVkIFBhaXIKKyAqICAgICAgICAgICAgICBTVFAgPSBTaGllbGRlZCB0d2lzdGVkIHBhaXIKKyAqICAgICAgICAgICAgICBVVFAgPSBVbnNoaWVsZGVkIHR3aXN0ZWQgcGFpcgorICovCisKKyNkZWZpbmUgQ05GR19NRURJQV9UWVBFX01BU0sgICAgMHgwMDFlICAvKiBQT1MgUmVnaXN0ZXIgMyBNYXNrICAgICAgICAgKi8KKworI2RlZmluZSBNRURJQV9TMTAgICAgICAgICAgICAgICAweDAwMDAgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIFRQLiAgICAgICAgKi8KKyNkZWZpbmUgTUVESUFfQVVJX1VUUCAgICAgICAgICAgMHgwMDAxICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBBVUkvVVRQIG1lZGlhICovCisjZGVmaW5lIE1FRElBX0JOQyAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRXRoZXJuZXQgYWRhcHRlciwgQk5DIG1lZGlhLiAqLworI2RlZmluZSBNRURJQV9BVUkgICAgICAgICAgICAgICAweDAwMDMgIC8qIEV0aGVybmV0IEFkYXB0ZXIsIEFVSSBtZWRpYS4gKi8KKyNkZWZpbmUgTUVESUFfU1RQXzE2ICAgICAgICAgICAgMHgwMDA0ICAvKiBUb2tlblJpbmcgYWRhcCwgMTZNYml0IFNUUC4gICovCisjZGVmaW5lIE1FRElBX1NUUF80ICAgICAgICAgICAgIDB4MDAwNSAgLyogVG9rZW5SaW5nIGFkYXAsIDRNYml0IFNUUC4gICAqLworI2RlZmluZSBNRURJQV9VVFBfMTYgICAgICAgICAgICAweDAwMDYgIC8qIFRva2VuUmluZyBhZGFwLCAxNk1iaXQgVVRQLiAgKi8KKyNkZWZpbmUgTUVESUFfVVRQXzQgICAgICAgICAgICAgMHgwMDA3ICAvKiBUb2tlblJpbmcgYWRhcCwgNE1iaXQgVVRQLiAgICovCisjZGVmaW5lIE1FRElBX1VUUCAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRXRoZXJuZXQgYWRhcHRlciwgVVRQIG1lZGlhIChubyBBVUkpCisqLworI2RlZmluZSBNRURJQV9CTkNfVVRQICAgICAgICAgICAweDAwMTAgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIEJOQy9VVFAgbWVkaWEgKi8KKyNkZWZpbmUgTUVESUFfVVRQRkQgICAgICAgICAgICAgMHgwMDExICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBUUCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBNRURJQV9VVFBOTCAgICAgICAgICAgICAweDAwMTIgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIFRQIHdpdGggbGluayBpbnRlZ3JpdHkgdGVzdCBkaXNhYmxlZCAqLworI2RlZmluZSBNRURJQV9BVUlfQk5DICAgICAgICAgICAweDAwMTMgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIEFVSS9CTkMgbWVkaWEgKi8KKyNkZWZpbmUgTUVESUFfQVVJX0JOQ19VVFAgICAgICAgMHgwMDE0ICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBBVUlfQk5DL1VUUCAqLworI2RlZmluZSBNRURJQV9VVFBBICAgICAgICAgICAgICAweDAwMTUgIC8qIEV0aGVybmV0IFVUUC0xME1icHMgUG9ydHMgQSAqLworI2RlZmluZSBNRURJQV9VVFBCICAgICAgICAgICAgICAweDAwMTYgIC8qIEV0aGVybmV0IFVUUC0xME1icHMgUG9ydHMgQiAqLworI2RlZmluZSBNRURJQV9TVFBfMTZfVVRQXzE2ICAgICAweDAwMTcgIC8qIFRva2VuIFJpbmcgU1RQLTE2TWJwcy9VVFAtMTZNYnBzICovCisjZGVmaW5lIE1FRElBX1NUUF80X1VUUF80ICAgICAgIDB4MDAxOCAgLyogVG9rZW4gUmluZyBTVFAtNE1icHMvVVRQLTRNYnBzICovCisKKyNkZWZpbmUgTUVESUFfU1RQMTAwX1VUUDEwMCAgICAgMHgwMDIwICAvKiBFdGhlcm5ldCBTVFAtMTAwTWJwcy9VVFAtMTAwTWJwcyAqLworI2RlZmluZSBNRURJQV9VVFAxMDBGRCAgICAgICAgICAweDAwMjEgIC8qIEV0aGVybmV0IFVUUC0xMDBNYnBzLCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBNRURJQV9VVFAxMDAgICAgICAgICAgICAweDAwMjIgIC8qIEV0aGVybmV0IFVUUC0xMDBNYnBzICovCisKKworI2RlZmluZSBNRURJQV9VTktOT1dOICAgICAgICAgICAweEZGRkYgIC8qIFVua25vd24gYWRhcHRlci9tZWRpYSB0eXBlICAgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBtZWRpYV90eXBlMgorICovCisjZGVmaW5lIE1FRElBX1RZUEVfTUlJICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUVESUFfVFlQRV9VVFAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNRURJQV9UWVBFX0JOQyAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIE1FRElBX1RZUEVfQVVJICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgTUVESUFfVFlQRV9TMTAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNRURJQV9UWVBFX0FVVE9fU0VOU0UgICAgICAgMHgxMDAwCisjZGVmaW5lIE1FRElBX1RZUEVfQVVUT19ERVRFQ1QgICAgICAweDQwMDAKKyNkZWZpbmUgTUVESUFfVFlQRV9BVVRPX05FR09USUFURSAgIDB4ODAwMAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZDoKKyAqIGxpbmVfc3BlZWQKKyAqLworI2RlZmluZSBMSU5FX1NQRUVEX1VOS05PV04gICAgICAgICAgMHgwMDAwCisjZGVmaW5lIExJTkVfU1BFRURfNCAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTElORV9TUEVFRF8xMCAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMSU5FX1NQRUVEXzE2ICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExJTkVfU1BFRURfMTAwICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgTElORV9TUEVFRF9UNCAgICAgICAgICAgICAgIDB4MDAwOCAgLyogMTAwQmFzZVQ0IGFsaWFzZWQgZm9yIDkzMzJCVlQgKi8KKyNkZWZpbmUgTElORV9TUEVFRF9GVUxMX0RVUExFWCAgICAgIDB4ODAwMAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZDoKKyAqIGJpY190eXBlIChCdXMgaW50ZXJmYWNlIGNoaXAgdHlwZSkKKyAqLworI2RlZmluZSBCSUNfTk9fQ0hJUCAgICAgICAgICAgICAweDAwMDAgIC8qIEJ1cyBpbnRlcmZhY2UgY2hpcCBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgQklDXzU4M19DSElQICAgICAgICAgICAgMHgwMDAxICAvKiA4M0M1ODMgYnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ181ODRfQ0hJUCAgICAgICAgICAgIDB4MDAwMiAgLyogODNDNTg0IGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTg1X0NISVAgICAgICAgICAgICAweDAwMDMgIC8qIDgzQzU4NSBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU5M19DSElQICAgICAgICAgICAgMHgwMDA0ICAvKiA4M0M1OTMgYnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ181OTRfQ0hJUCAgICAgICAgICAgIDB4MDAwNSAgLyogODNDNTk0IGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTY0X0NISVAgICAgICAgICAgICAweDAwMDYgIC8qIFBDTUNJQSBCdXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzc5MF9DSElQICAgICAgICAgICAgMHgwMDA3ICAvKiA4M0M3OTAgYnVzIGktZmFjZS9FdGhlcm5ldCBOSUMgY2hpcCAqLworI2RlZmluZSBCSUNfNTcxX0NISVAgICAgICAgICAgICAweDAwMDggIC8qIDgzQzU3MSBFSVNBIGJ1cyBtYXN0ZXIgaS1mYWNlICovCisjZGVmaW5lIEJJQ181ODdfQ0hJUCAgICAgICAgICAgIDB4MDAwOSAgLyogVG9rZW4gUmluZyBBVCBidXMgbWFzdGVyIGktZmFjZSAqLworI2RlZmluZSBCSUNfNTc0X0NISVAgICAgICAgICAgICAweDAwMTAgIC8qIEZFQVNUIGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfODQzMl9DSElQICAgICAgICAgICAweDAwMTEgIC8qIDg0MzIgYnVzIGktZmFjZS9FdGhlcm5ldCBOSUMoREVDIFBDSSkgKi8KKyNkZWZpbmUgQklDXzkzMzJfQ0hJUCAgICAgICAgICAgMHgwMDEyICAvKiA5MzMyIGJ1cyBpLWZhY2UvMTAwTWJwcyBFdGhlciBOSUMoREVDIFBDSSkgKi8KKyNkZWZpbmUgQklDXzg0MzJFX0NISVAgICAgICAgICAgMHgwMDEzICAvKiA4NDMyIEVuaGFuY2VkIGJ1cyBpZmFjZS9FdGhlcm5ldCBOSUMoREVDKSAqLworI2RlZmluZSBCSUNfRVBJQzEwMF9DSElQICAgICAgICAweDAwMTQgIC8qIEVQSUMvMTAwIDEwLzEwMCBNYnBzIEV0aGVybmV0IEJJQy9OSUMgKi8KKyNkZWZpbmUgQklDX0M5NF9DSElQICAgICAgICAgICAgMHgwMDE1ICAvKiA5MUM5NCBidXMgaS1mYWNlIGluIFBDTUNJQSBtb2RlICovCisjZGVmaW5lIEJJQ19YODAyMF9DSElQICAgICAgICAgIDB4MDAxNiAgLyogWGlsaW54IFBDTUNJQSBtdWx0aS1mdW5jIGktZmFjZSAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZDoKKyAqIG5pY190eXBlIChCdXMgaW50ZXJmYWNlIGNoaXAgdHlwZSkKKyAqLworI2RlZmluZSBOSUNfVU5LX0NISVAgICAgICAgICAgICAweDAwMDAgIC8qIFVua25vd24gTklDIGNoaXAgICAgICAqLworI2RlZmluZSBOSUNfODM5MF9DSElQICAgICAgICAgICAweDAwMDEgIC8qIERQODM5MCBFdGhlcm5ldCBOSUMgICAqLworI2RlZmluZSBOSUNfNjkwX0NISVAgICAgICAgICAgICAweDAwMDIgIC8qIDgzQzY5MCBFdGhlcm5ldCBOSUMgICAqLworI2RlZmluZSBOSUNfODI1X0NISVAgICAgICAgICAgICAweDAwMDMgIC8qIDgzQzgyNSBUb2tlbiBSaW5nIE5JQyAqLworLyogICAgICAjZGVmaW5lIE5JQ18/Pz9fQ0hJUCAgICAweDAwMDQgICovIC8qIE5vdCB1c2VkICAgICAgICAgICAqLworLyogICAgICAjZGVmaW5lIE5JQ18/Pz9fQ0hJUCAgICAweDAwMDUgICovIC8qIE5vdCB1c2VkICAgICAgICAgICAqLworLyogICAgICAjZGVmaW5lIE5JQ18/Pz9fQ0hJUCAgICAweDAwMDYgICovIC8qIE5vdCB1c2VkICAgICAgICAgICAqLworI2RlZmluZSBOSUNfNzkwX0NISVAgICAgICAgICAgICAweDAwMDcgIC8qIDgzQzc5MCBidXMgaS1mYWNlL0V0aGVybmV0IE5JQyBjaGlwICovCisjZGVmaW5lIE5JQ19DMTAwX0NISVAgICAgICAgICAgIDB4MDAxMCAgLyogRkVBU1QgMTAwTWJwcyBFdGhlcm5ldCBOSUMgKi8KKyNkZWZpbmUgTklDXzg0MzJfQ0hJUCAgICAgICAgICAgMHgwMDExICAvKiA4NDMyIGJ1cyBpLWZhY2UvRXRoZXJuZXQgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIE5JQ185MzMyX0NISVAgICAgICAgICAgIDB4MDAxMiAgLyogOTMzMiBidXMgaS1mYWNlLzEwME1icHMgRXRoZXIgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIE5JQ184NDMyRV9DSElQICAgICAgICAgIDB4MDAxMyAgLyogODQzMiBlbmhhbmNlZCBidXMgaWZhY2UvRXRoZXJuZXQgTklDKERFQykgKi8KKyNkZWZpbmUgTklDX0VQSUMxMDBfQ0hJUCAgICAgICAgMHgwMDE0ICAgLyogRVBJQy8xMDAgMTAvMTAwIE1icHMgRXRoZXJuZXQgQklDL05JQyAqLworI2RlZmluZSBOSUNfQzk0X0NISVAgICAgICAgICAgICAweDAwMTUgIC8qIDkxQzk0IFBDIENhcmQgd2l0aCBtdWx0aSBmdW5jICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkOgorICogYWRhcHRlcl90eXBlIFRoZSBhZGFwdGVyX3R5cGUgZmllbGQgZGVzY3JpYmVzIHRoZSBhZGFwdGVyL2J1cworICogICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQlVTX0lTQTE2X1RZUEUgICAgICAgICAgMHgwMDAxICAvKiAxNiBiaXQgYWRhcCBpbiAxNiBiaXQgKEUpSVNBIHNsb3QgICovCisjZGVmaW5lIEJVU19JU0E4X1RZUEUgICAgICAgICAgIDB4MDAwMiAgLyogOC8xNmIgYWRhcCBpbiA4IGJpdCBYVC8oRSlJU0Egc2xvdCAqLworI2RlZmluZSBCVVNfTUNBX1RZUEUgICAgICAgICAgICAweDAwMDMgIC8qIE1pY3JvIENoYW5uZWwgYWRhcHRlciAgICAgICAgICAgICAgKi8KKworLyoKKyAqIFJlY2VpdmUgTWFzayBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEFDQ0VQVF9NVUxUSUNBU1QgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFDQ0VQVF9CUk9BRENBU1QgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBST01JU0NVT1VTX01PREUgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEFDQ0VQVF9TT1VSQ0VfUk9VVElORyAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFDQ0VQVF9FUlJfUEFDS0VUUyAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUyAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEFDQ0VQVF9NVUxUSV9QUk9NICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFRSQU5TTUlUX09OTFkgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEFDQ0VQVF9FWFRfTUFDX0ZSQU1FUyAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEVBUkxZX1JYX0VOQUJMRSAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFBLVF9TSVpFX05PVF9ORUVERUQgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFDQ0VQVF9TT1VSQ0VfUk9VVElOR19TUEFOTklORyAgMHgwODA4CisKKyNkZWZpbmUgQUNDRVBUX0FMTF9NQUNfRlJBTUVTICAgICAgICAgICAweDAxMjAKKworLyoKKyAqIGNvbmZpZ19tb2RlIGRlZnMKKyAqLworI2RlZmluZSBTVE9SRV9FRVJPTSAgICAgICAgICAgICAweDAwMDEgIC8qIFN0b3JlIGNvbmZpZyBpbiBFRVJPTS4gKi8KKyNkZWZpbmUgU1RPUkVfUkVHUyAgICAgICAgICAgICAgMHgwMDAyICAvKiBTdG9yZSBjb25maWcgaW4gcmVnaXN0ZXIgc2V0LiAqLworCisvKgorICogZXF1YXRlcyBmb3IgbG1hY19mbGFncyBpbiBhZGFwdGVyIHN0cnVjdHVyZSAoRXRoZXJuZXQpCisgKi8KKyNkZWZpbmUgICAgICAgICBNRU1fRElTQUJMRSAgICAgMHgwMDAxCisjZGVmaW5lICAgICAgICAgUlhfU1RBVFVTX1BPTEwgIDB4MDAwMgorI2RlZmluZSAgICAgICAgIFVTRV9SRV9CSVQgICAgICAweDAwMDQKKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMDA4ICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDAxMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAwMjAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMDQwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDA4MCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAxMDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMjAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDQwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDA4MDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgxMDAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MjAwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDQwMDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHg4MDAwICovCisKKy8qIG1lZGlhX29wdHMgJiBtZWRpYV9zZXQgRmllbGRzIGJpdCBkZWZzIGZvciBFdGhlcm5ldCAuLi4gKi8KKyNkZWZpbmUgICAgICAgICBNRURfT1BUX0JOQyAgICAgMHgwMQorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfVVRQICAgICAweDAyCisjZGVmaW5lICAgICAgICAgTUVEX09QVF9BVUkgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBNRURfT1BUXzEwTUIgICAgMHgwOAorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfMTAwTUIgICAweDEwCisjZGVmaW5lICAgICAgICAgTUVEX09QVF9TMTAgICAgIDB4MjAKKworLyogbWVkaWFfb3B0cyAmIG1lZGlhX3NldCBGaWVsZHMgYml0IGRlZnMgZm9yIFRva2VuIFJpbmcgLi4uICovCisjZGVmaW5lICAgICAgICAgTUVEX09QVF80TUIgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBNRURfT1BUXzE2TUIgICAgMHgxMAorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfU1RQICAgICAweDQwCisKKyNkZWZpbmUgTUFYXzgwMjNfU0laRSAgICAgICAgICAgMTUwMCAgICAvKiBNYXggODAyLjMgc2l6ZSBvZiBmcmFtZS4gKi8KKyNkZWZpbmUgREVGQVVMVF9FUlhfVkFMVUUgICAgICAgNCAgICAgICAvKiBOdW1iZXIgb2YgMTYtYnl0ZSBibG9ja3MgZm9yIDc5MEIgZWFybHkgUnguICovCisjZGVmaW5lIERFRkFVTFRfRVRYX1ZBTFVFICAgICAgIDMyICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIGZvciA3OTBCIGVhcmx5IFR4LiAqLworI2RlZmluZSBERUZBVUxUX1RYX1JFVFJJRVMgICAgICAzICAgICAgIC8qIE51bWJlciBvZiB0cmFuc21pdCByZXRyaWVzICovCisjZGVmaW5lIExQQktfRlJBTUVfU0laRSAgICAgICAgIDEwMjQgICAgLyogRGVmYXVsdCBsb29wYmFjayBmcmFtZSBmb3IgUnggY2FsaWJyYXRpb24gdGVzdC4gKi8KKyNkZWZpbmUgTUFYX0xPT0tBSEVBRF9TSVpFICAgICAgMjUyICAgICAvKiBNYXggbG9va2FoZWFkIHNpemUgZm9yIGV0aGVybmV0LiAqLworCisjZGVmaW5lIFJXX01BQ19TVEFURSAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIFJXX1NBX09GX0xBU1RfQU1QX09SX1NNUCAgICAgICAgMHgyODAzCisjZGVmaW5lIFJXX1BIWVNJQ0FMX0RST1BfTlVNQkVSICAgICAgICAgMHgzQjAyCisjZGVmaW5lIFJXX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MgICAgMHgzRTAzCisjZGVmaW5lIFJXX1BST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgMHg0QjA5CisKKyNkZWZpbmUgUldfVFJDX1NUQVRVU19CTE9DSyAgICAgICAgICAgICAweDU0MTIKKworI2RlZmluZSBSV19NQUNfRVJST1JfQ09VTlRFUlNfTk9fQ0xFQVIgIDB4ODAwNgorI2RlZmluZSBSV19NQUNfRVJST1JfQ09VTlRFUl9DTEVBUiAgICAgIDB4N0EwNgorI2RlZmluZSBSV19DT05GSUdfUkVHSVNURVJfMCAgICAgICAgICAgIDB4QTAwMQorI2RlZmluZSBSV19DT05GSUdfUkVHSVNURVJfMSAgICAgICAgICAgIDB4QTEwMQorI2RlZmluZSBSV19QUkVTQ0FMRV9USU1FUl9USFJFU0hPTEQgICAgIDB4QTIwMQorI2RlZmluZSBSV19UUFRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTMwMQorI2RlZmluZSBSV19UUVBfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTQwMQorI2RlZmluZSBSV19UTlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTUwMQorI2RlZmluZSBSV19UQlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTYwMQorI2RlZmluZSBSV19UU01fVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTcwMQorI2RlZmluZSBSV19UQU1fVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTgwMQorI2RlZmluZSBSV19UQlJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QTkwMQorI2RlZmluZSBSV19URVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QUEwMQorI2RlZmluZSBSV19UR1RfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QUIwMQorI2RlZmluZSBSV19USFRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QUMwMQorI2RlZmluZSBSV19UUlJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QUQwMQorI2RlZmluZSBSV19UVlhfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4QUUwMQorI2RlZmluZSBSV19JTkRJVklEVUFMX01BQ19BRERSRVNTICAgICAgIDB4QjAwMworCisjZGVmaW5lIFJXX0lORElWSURVQUxfR1JPVVBfQUREUkVTUyAgICAgMHhCMzAzICAvKiBhbGwgb2YgZ3JvdXAgYWRkciAqLworI2RlZmluZSBSV19JTkRJVklEVUFMX0dST1VQX0FERFJfV09SRF8wIDB4QjMwMSAgLyogMXN0IHdvcmQgb2YgZ3JvdXAgYWRkciAqLworI2RlZmluZSBSV19JTkRJVklEVUFMX0dST1VQX0FERFIgICAgICAgIDB4QjQwMiAgLyogMm5kLTNyZCB3b3JkIG9mIGdyb3VwIGFkZHIgKi8KKyNkZWZpbmUgUldfRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAweEI2MDMgIC8qIGFsbCBvZiBmdW5jdGlvbmFsIGFkZHIgKi8KKyNkZWZpbmUgUldfRlVOQ1RJT05BTF9BRERSX1dPUkRfMCAgICAgICAweEI2MDEgIC8qIDFzdCB3b3JkIG9mIGZ1bmMgIGFkZHIgKi8KKyNkZWZpbmUgUldfRlVOQ1RJT05BTF9BRERSICAgICAgICAgICAgICAweEI3MDIgIC8qIDJuZC0zcmQgd29yZCBmdW5jIGFkZHIgKi8KKworI2RlZmluZSBSV19CSVRfU0lHTklGSUNBTlRfR1JPVVBfQUREUiAgIDB4QjkwMgorI2RlZmluZSBSV19TT1VSQ0VfUklOR19CUklER0VfTlVNQkVSICAgIDB4QkIwMQorI2RlZmluZSBSV19UQVJHRVRfUklOR19OVU1CRVIgICAgICAgICAgIDB4QkMwMQorCisjZGVmaW5lIFJXX0hJQ19JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgMHhDNjAxCisKKyNkZWZpbmUgU09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUyAgICAweDAwQzAgIC8qIFNwYW5uaW5nIFRyZWUgRnJhbWVzICovCisjZGVmaW5lIFNPVVJDRV9ST1VUSU5HX0VYUExPUkVSX0JJVCAgICAgMHgwMDQwICAvKiBFeHBsb3JlciBhbmQgU2luZ2xlIFJvdXRlICovCisKKyAgICAgICAgLyogd3JpdGUgKi8KKworI2RlZmluZSBDU1JfTVNLX0FMTCAgICAgICAgICAgICAweDgwICAgIC8vIEJpYyA1ODcgT25seQorI2RlZmluZSBDU1JfTVNLVElOVCAgICAgICAgICAgICAweDIwCisjZGVmaW5lIENTUl9NU0tDQlVTWSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ1NSX0NMUlRJTlQgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBDU1JfQ0xSQ0JVU1kgICAgICAgICAgICAweDA0CisjZGVmaW5lIENTUl9XQ1NTICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1NSX0NBICAgICAgICAgICAgICAgICAgMHgwMQorCisgICAgICAgIC8qIHJlYWQgKi8KKworI2RlZmluZSBDU1JfVElOVCAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIENTUl9DSU5UICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ1NSX1RTVEFUICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBDU1JfQ1NUQVQgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIENTUl9GQVVMVCAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1NSX0NCVVNZICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIExBQVJfTUVNMTZFTkIgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWndzMTYgICAgICAgICAgICAgICAgICAgMHgyMAorCisjZGVmaW5lIElSUl9JRU4gICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWndzOCAgICAgICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIElNQ0NSX0VJTCAgICAgICAgICAgICAgIDB4MDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAgICAgICAgICAgYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2Nlc3MgQ29udHJvbCAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBDb250cm9sICovCisgICAgICAgIF9fdTggICAgICAgICAgICBkYVs2XTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3QgQWRkciAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgc2FbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgQWRkciAqLworCisgICAgICAgIF9fdTE2ICAgICAgICAgICAgdmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZWN0b3IgTGVuZ3RoICovCisgICAgICAgIF9fdTggICAgICAgICAgICBkY19zYzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3QvU291cmNlIENsYXNzICovCisgICAgICAgIF9fdTggICAgICAgICAgICB2YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlY3RvciBDb2RlICovCisgICAgICAgIH0gTUFDX0hFQURFUjsKKworI2RlZmluZSBNQVhfU1VCX1ZFQ1RPUl9JTkZPICAgICAoUlhfREFUQV9CVUZGRVJfU0laRSAtIHNpemVvZihNQUNfSEVBREVSKSAtIDIpCisKK3R5cGVkZWYgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgX191OCAgICAgICAgICAgIHN2bDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ViLXZlY3RvciBMZW5ndGggKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIHN2aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ViLXZlY3RvciBDb2RlICovCisgICAgICAgIF9fdTggICAgICAgICAgICBzdnZbTUFYX1NVQl9WRUNUT1JfSU5GT107ICAgICAgIC8qIFN1Yi12ZWN0b3IgSW5mbyAqLworICAgICAgICB9IE1BQ19TVUJfVkVDVE9SOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9fTElOVVhfU01DVFJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyX2Zpcm13YXJlLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHJfZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YyY2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyX2Zpcm13YXJlLmgKQEAgLTAsMCArMSw5NzkgQEAKKy8qCisgKiBUaGUgZmlybXdhcmUgdGhpcyBkcml2ZXIgZG93bmxvYWRzIGludG8gdGhlIHRva2VucmluZyBjYXJkIGlzIGEKKyAqIHNlcGFyYXRlIHByb2dyYW0gYW5kIGlzIG5vdCBHUEwnZCBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhlIExpbnV4CisgKiBzaWRlIGRyaXZlciBhbmQgdGhlIHJvdXRpbmUgdGhhdCBsb2FkcyB0aGlzIGRhdGEgaW50byB0aGUgY2FyZCBhcmUuCisgKgorICogVGhpcyBmaXJtd2FyZSBpcyBsaWNlbnNlZCB0byB5b3Ugc3RyaWN0bHkgZm9yIHVzZSBpbiBjb25qdW5jdGlvbgorICogd2l0aCB0aGUgdXNlIG9mIFNNQyBUb2tlblJpbmcgYWRhcHRlcnMuIFRoZXJlIGlzIG5vIHdhcmFudHkKKyAqIGV4cHJlc3NlZCBvciBpbXBsaWVkIGFib3V0IGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4KKyAqLworCisvKiBzbWN0cl9maXJtd2FyZS5oOiBTTUMgVG9rZW5SaW5nIGRyaXZlciBmaXJtd2FyZSBkdW1wIGZvciBMaW51eC4KKyAqCisgKiBOb3RlczoKKyAqICAtIFRoaXMgaXMgYW4gOEsgYmluYXJ5IGltYWdlLiAoTUNULkJJTiB2Ni4zQzEgMDMvMDEvOTUpCisgKgorICogQXV0aG9yczoKKyAqICAtIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU01DVFIpIHx8IGRlZmluZWQoQ09ORklHX1NNQ1RSX01PRFVMRSkKKwordW5zaWduZWQgY2hhciBzbWN0cl9jb2RlW10gPSB7CisJMHgwQkMsIDB4MDFELCAweDAxMiwgMHgwM0IsIDB4MDYzLCAweDBCNCwgMHgwRTksIDB4MDAwLAorCTB4MDAwLCAweDAxRiwgMHgwMDAsIDB4MDAxLCAweDAwMSwgMHgwMDAsIDB4MDAyLCAweDAwNSwKKwkweDAwMSwgMHgwMDAsIDB4MDA2LCAweDAwMywgMHgwMDEsIDB4MDAwLCAweDAwNCwgMHgwMDksCisJMHgwMDEsIDB4MDAwLCAweDAwQSwgMHgwMDcsIDB4MDAxLCAweDAwMCwgMHgwMDgsIDB4MDBCLAorCTB4MDAxLCAweDAwMCwgMHgwMEMsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwRiwKKwkweDAwMSwgMHgwMDAsIDB4MDEwLCAweDAwRCwgMHgwMDEsIDB4MDAwLCAweDAwRSwgMHgwMTMsCisJMHgwMDEsIDB4MDAwLCAweDAxNCwgMHgwMTEsIDB4MDAxLCAweDAwMCwgMHgwMTIsIDB4MDAwLAorCTB4MDAwLCAweDAwNSwgMHgwMDAsIDB4MDE1LCAweDAwMSwgMHgwMDAsIDB4MDE2LCAweDAxOSwKKwkweDAwMSwgMHgwMDAsIDB4MDFBLCAweDAxNywgMHgwMDEsIDB4MDAwLCAweDAxOCwgMHgwMDAsCisJMHgwMDAsIDB4MDBFLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwMSwgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwNCwgMHgwMDAsIDB4MDFCLCAweDAwMSwgMHgwMDAsIDB4MDFDLCAweDAwMCwKKwkweDAwMCwgMHgwMDcsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDBGLCAweDAwMCwgMHgwMDAsCisJMHgwMDAsIDB4MDBCLCAweDAwMCwgMHgwMUQsIDB4MDAxLCAweDAwMCwgMHgwMUUsIDB4MDAwLAorCTB4MDAwLCAweDAwOCwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDIsIDB4MDAwLCAweDAwMCwKKwkweDAwMCwgMHgwMEMsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDA2LCAweDAwMCwgMHgwMDAsCisJMHgwMDAsIDB4MDBELCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwMywgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwQSwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDksIDB4MDAwLCAweDAwNCwKKwkweDA3OCwgMHgwQzYsIDB4MEJDLCAweDAwMSwgMHgwOTQsIDB4MDA0LCAweDA5MywgMHgwODAsCisJMHgwQzgsIDB4MDQwLCAweDA2MiwgMHgwRTksIDB4MERBLCAweDAxQywgMHgwMkMsIDB4MDE1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1OCwKKwkweDAwQiwgMHgwRTksIDB4MEU1LCAweDBENSwgMHgwOTUsIDB4MEMxLCAweDA5RCwgMHgwNzcsCisJMHgwQ0UsIDB4MEJCLCAweDBBMCwgMHgwNkUsIDB4MDFDLCAweDAwNSwgMHgwRjYsIDB4MDc3LAorCTB4MEM2LCAweDAwMiwgMHgwRkEsIDB4MDk2LCAweDA3MCwgMHgwRTgsIDB4MDFELCAweDBDMCwKKwkweDAxNywgMHgwMEUsIDB4MDAyLCAweDBGQSwgMHgwNTgsIDB4MDdELCAweDBDMCwgMHgwNUYsCisJMHgwNzIsIDB4MENFLCAweDBFQywgMHgwQTQsIDB4MEMzLCAweDA4NCwgMHgwOTAsIDB4MDdBLAorCTB4MDMwLCAweDBDRCwgMHgwOEQsIDB4MDc5LCAweDAxOSwgMHgwRTcsIDB4MDZDLCAweDAyNCwKKwkweDAyNywgMHgwOUMsIDB4MDA4LCAweDAzOSwgMHgwMDcsIDB4MDM4LCAweDBBOCwgMHgwNEEsCisJMHgwNEMsIDB4MEVBLCAweDA0RCwgMHgwOTgsIDB4MDlCLCAweDAyNCwgMHgwNEMsIDB4MEMwLAorCTB4MDI2LCAweDBEMywgMHgwRTcsIDB4MDU0LCAweDA1QSwgMHgwNEQsIDB4MEYyLCAweDA0QywKKwkweDAwQywgMHgwMTMsIDB4MDIzLCAweDA0OSwgMHgwOTAsIDB4MDMyLCAweDA2RSwgMHgwQTQsCisJMHgwREYsIDB4MDkzLCAweDA3MSwgMHgwMTMsIDB4MDc3LCAweDAyNiwgMHgwRTEsIDB4MDI2LAorCTB4MEY4LCAweDAyNiwgMHgwMEMsIDB4MDRDLCAweDAxMiwgMHgwMjYsIDB4MDA4LCAweDAwOSwKKwkweDA4MiwgMHgwODIsIDB4MDYwLCAweDBBOSwgMHgwMzAsIDB4MDc5LCAweDAzNiwgMHgwQjAsCisJMHgwQjIsIDB4MEE4LCAweDBBNywgMHgwNzIsIDB4MDY0LCAweDA4RiwgMHgwOUIsIDB4MDMzLAorCTB4MDMzLCAweDBGOSwgMHgwQjgsIDB4MDM5LCAweDBENSwgMHgwMTEsIDB4MDczLCAweDBBQSwKKwkweDA3NSwgMHgwMjYsIDB4MDVELCAweDAyNiwgMHgwNTEsIDB4MDkzLCAweDAyQSwgMHgwNDksCisJMHgwOTQsIDB4MEM5LCAweDA5NSwgMHgwODksIDB4MEJDLCAweDA0RCwgMHgwQzgsIDB4MDlCLAorCTB4MDgwLCAweDA5QiwgMHgwQTAsIDB4MDk5LCAweDAwNiwgMHgwNEMsIDB4MDg2LCAweDAyNiwKKwkweDA1OCwgMHgwOUIsIDB4MEE0LCAweDA5QiwgMHgwOTksIDB4MDM3LCAweDA2MiwgMHgwNkMsCisJMHgwNjcsIDB4MDlCLCAweDAzMywgMHgwMzAsIDB4MEJGLCAweDAzNiwgMHgwNjYsIDB4MDYxLAorCTB4MEJGLCAweDAzNiwgMHgwRUMsIDB4MEM1LCAweDBCRCwgMHgwNjYsIDB4MDgyLCAweDA1QSwKKwkweDA1MCwgMHgwMzEsIDB4MEQ1LCAweDA5RCwgMHgwOTgsIDB4MDE4LCAweDAyOSwgMHgwM0MsCisJMHgwOTgsIDB4MDg2LCAweDA0QywgMHgwMTcsIDB4MDI2LCAweDAzRSwgMHgwMkMsIDB4MEI4LAorCTB4MDY5LCAweDAzQiwgMHgwNDksIDB4MDJFLCAweDBCNCwgMHgwMDgsIDB4MDQzLCAweDAxQSwKKwkweDBBNCwgMHgwRjksIDB4MEIzLCAweDA1MSwgMHgwRjEsIDB4MDEwLCAweDBGMywgMHgwNDMsCisJMHgwQ0QsIDB4MDA4LCAweDA2RiwgMHgwNjMsIDB4MDc5LCAweDBCMywgMHgwMzMsIDB4MDBFLAorCTB4MDEzLCAweDA5OCwgMHgwNDksIDB4MDk4LCAweDAwNCwgMHgwREEsIDB4MDdDLCAweDBFMCwKKwkweDA1MiwgMHgwNzksIDB4MDMxLCAweDAwQywgMHgwOTgsIDB4MDJFLCAweDA0RCwgMHgwQUMsCisJMHgwMkMsIDB4MDg0LCAweDAxNCwgMHgwRUUsIDB4MDRDLCAweDBGRSwgMHgwNjcsIDB4MDVFLAorCTB4MEU0LCAweDA5QSwgMHgwNzUsIDB4MDI5LCAweDBENywgMHgwQTksIDB4MDM1LCAweDAzQSwKKwkweDA5NCwgMHgwNUIsIDB4MEQ1LCAweDA5QiwgMHgwNTgsIDB4MEI0LCAweDBBRiwgMHgwNzUsCisJMHgwNjYsIDB4MEFGLCAweDAxNCwgMHgwQTksIDB4MEVGLCAweDA0MCwgMHgwOTUsIDB4MDI1LAorCTB4MDA4LCAweDBCOSwgMHgwQUQsIDB4MDQyLCAweDBGQywgMHgwRDgsIDB4MEQ5LCAweDA4QywKKwkweDAzMywgMHgwMEUsIDB4MDEzLCAweDA5OCwgMHgwNjYsIDB4MDFFLCAweDA0NSwgMHgwQUMsCisJMHgwQjAsIDB4MDBDLCAweDA0MiwgMHgwRDMsIDB4MENDLCAweDBBNiwgMHgwMTIsIDB4MDYyLAorCTB4MERFLCAweDBCNCwgMHgwQjEsIDB4MDgwLCAweDA0OSwgMHgwN0QsIDB4MEEyLCAweDBERSwKKwkweDBCNCwgMHgwMTgsIDB4MEMwLCAweDAyNCwgMHgwODQsIDB4MEU2LCAweDA1NCwgMHgwRjUsCisJMHgwODMsIDB4MDQ2LCAweDAwMSwgMHgwNjgsIDB4MDFBLCAweDA2MywgMHgwMEMsIDB4MEM2LAorCTB4MDEyLCAweDA2NCwgMHgwRkEsIDB4MDRDLCAweDAzNSwgMHgwMUMsIDB4MDJDLCAweDAwRSwKKwkweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsCisJMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBRCwgMHgwRDcsIDB4MDAyLAorCTB4MDcwLCAweDBFMCwgMHgwNEMsIDB4MEYzLCAweDBBMSwgMHgwQzEsIDB4MEQ1LCAweDBDMCwKKwkweDAzQywgMHgwQjksIDB4MDY5LCAweDAzOSwgMHgwNjAsIDB4MDRFLCAweDA1OCwgMHgwNzcsCisJMHgwMDIsIDB4MDY3LCAweDA5MywgMHgwM0MsIDB4MDk5LCAweDBFNCwgMHgwQ0YsIDB4MDM4LAorCTB4MDFDLCAweDA5NywgMHgwMkUsIDB4MDQwLCAweDAxQiwgMHgwOTAsIDB4MDMxLCAweDA0NiwKKwkweDBBMywgMHgwNUUsIDB4MDBFLCAweDA4OCwgMHgwMzQsIDB4MDZBLCAweDAzNSwgMHgwRTAsCisJMHgwRTgsIDB4MEFBLCAweDAzNSwgMHgwMUEsIDB4MEE5LCAweDBGNSwgMHgwMTUsIDB4MDQ2LAorCTB4MEEzLCAweDBFQSwgMHgwN0QsIDB4MDRBLCAweDBBMywgMHgwNTEsIDB4MEFBLCAweDA5RiwKKwkweDA3MCwgMHgwNTQsIDB4MEE2LCAweDA1NywgMHgwMkUsIDB4MEI0LCAweDBDRCwgMHgwQzgsCisJMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwREEsIDB4MEM2LCAweDBFMSwgMHgwQ0IsIDB4MDdBLAorCTB4MEQ0LCAweDAxQywgMHgwNjgsIDB4MEZGLCAweDBDRiwgMHgwNTUsIDB4MEE4LCAweDBDMCwKKwkweDAyRCwgMHgwODUsIDB4MDExLCAweDAxNywgMHgwNDQsIDB4MDJBLCAweDAzMCwgMHgwMEIsCisJMHgwNEEsIDB4MDg4LCAweDBDMiwgMHgwNEQsIDB4MEI1LCAweDAyMCwgMHgwRDUsIDB4MDI2LAorCTB4MDAxLCAweDA2OSwgMHgwNTEsIDB4MDY5LCAweDA1MiwgMHgwMTksIDB4MDUyLCAweDA2MCwKKwkweDAxNiwgMHgwOTUsIDB4MDE2LCAweDA4MiwgMHgwOTYsIDB4MDU0LCAweDA5OCwgMHgwMDUsCisJMHgwQTUsIDB4MDQ1LCAweDBGMywgMHgwREQsIDB4MDZBLCAweDBGOSwgMHgwMjgsIDB4MDE4LAorCTB4MEVGLCAweDAwMCwgMHgwMzAsIDB4MDMwLCAweDA1MSwgMHgwNEUsIDB4MDQ0LCAweDA1RCwKKwkweDAxMiwgMHgwRDEsIDB4MDQzLCAweDBFNiwgMHgwMTIsIDB4MDZGLCAweDA5RSwgMHgwQkEsCisJMHgwQ0MsIDB4MERGLCAweDAyNSwgMHgwMDMsIDB4MDFELCAweDBFMCwgMHgwMDYsIDB4MDA2LAorCTB4MDBBLCAweDAzMCwgMHgwQ0MsIDB4MEE5LCAweDBFQiwgMHgwMkQsIDB4MDAwLCAweDA4NiwKKwkweDBBNiwgMHgwMTIsIDB4MDY1LCAweDA0RiwgMHgwNTYsIDB4MEQ2LCAweDA2NSwgMHgwNDksCisJMHgwNUYsIDB4MDNELCAweDBFOCwgMHgwMzcsIDB4MEM5LCAweDA0MCwgMHgwQzcsIDB4MDc4LAorCTB4MDAxLCAweDA4MSwgMHgwODIsIDB4MDhDLCAweDAzMywgMHgwMTgsIDB4MDQ5LCAweDA4MCwKKwkweDBBRSwgMHgwNDAsIDB4MEM1LCAweDAxOCwgMHgwMDUsIDB4MDlDLCAweDA2RCwgMHgwMTgsCisJMHgwNjYsIDB4MDBFLCAweDBGMywgMHgwQTAsIDB4MEM2LCAweDAxMiwgMHgwNjIsIDB4MERFLAorCTB4MEY1LCAweDAwNCwgMHgwQjQsIDB4MEFDLCAweDA2QiwgMHgwQzYsIDB4MDE5LCAweDA5MSwKKwkweDA3MywgMHgwMDUsIDB4MDQ4LCAweDAyRSwgMHgwNzIsIDB4MDk0LCAweDA4MCwgMHgwNzMsCisJMHgwQTEsIDB4MEM4LCAweDA0NywgMHgwMzYsIDB4MDY2LCAweDA2NCwgMHgwMkYsIDB4MDM2LAorCTB4MDY2LCAweDA2NCwgMHgwMDcsIDB4MDk5LCAweDAwMiwgMHgwOTEsIDB4MDhFLCAweDA3MiwKKwkweDBEMSwgMHgwMEYsIDB4MDlELCAweDAwNiwgMHgwMzEsIDB4MDczLCAweDBBMCwgMHgwQzMsCisJMHgwNTEsIDB4MDZBLCAweDAxQSwgMHgwMjAsIDB4MEJGLCAweDAzQSwgMHgwMEMsIDB4MDJDLAorCTB4MDczLCAweDA4NywgMHgwNDMsIDB4MDVFLCAweDA2MCwgMHgwMDIsIDB4MDIzLCAweDBGQywKKwkweDBFMCwgMHgwRDYsIDB4MDM1LCAweDBFRiwgMHgwOUUsIDB4MEY1LCAweDBFRiwgMHgwOTIsCisJMHgwODEsIDB4MDhFLCAweDBGMCwgMHgwMDMsIDB4MDAzLCAweDAwNSwgMHgwMTgsIDB4MDY2LAorCTB4MDQ1LCAweDBDQywgMHgwMEIsIDB4MDQ4LCAweDAyRSwgMHgwNzAsIDB4MDBBLCAweDA0MCwKKwkweDAzOSwgMHgwRDAsIDB4MEU0LCAweDAyMywgMHgwOUIsIDB4MDMzLCAweDAzMiwgMHgwMTcsCisJMHgwOUIsIDB4MDMzLCAweDAzMiwgMHgwMDMsIDB4MENDLCAweDA4NSwgMHgwNDgsIDB4MEM3LAorCTB4MDM4LCAweDAxNCwgMHgwQTUsIDB4MENFLCAweDAyOSwgMHgwN0UsIDB4MEQyLCAweDA4MCwKKwkweDBBMSwgMHgwQTgsIDB4MEI0LCAweDA0OCwgMHgwODgsIDB4MDJGLCAweDBDRSwgMHgwODMsCisJMHgwMEIsIDB4MDFDLCAweDBFMSwgMHgwRDAsIDB4MEQ3LCAweDA5OCwgMHgwMDQsIDB4MDg4LAorCTB4MDg3LCAweDBDRSwgMHgwOTYsIDB4MDMxLCAweDA3MywgMHgwQTUsIDB4MDhGLCAweDBGMywKKwkweDA4MywgMHgwNTgsIDB4MEQ3LCAweDBCRSwgMHgwN0IsIDB4MDgyLCAweDBBRiwgMHgwOTIsCisJMHgwODEsIDB4MDhFLCAweDBGMCwgMHgwMDMsIDB4MDAzLCAweDAwNSwgMHgwMTgsIDB4MDY2LAorCTB4MDQ1LCAweDBDQywgMHgwMTUsIDB4MDIwLCAweDBCOSwgMHgwQzgsIDB4MDI5LCAweDAwMCwKKwkweDBFNywgMHgwNDMsIDB4MDkwLCAweDA4RSwgMHgwNkMsIDB4MENDLCAweDBDOCwgMHgwNUUsCisJMHgwNkMsIDB4MENDLCAweDBDOCwgMHgwMEYsIDB4MDMyLCAweDAwNSwgMHgwMjMsIDB4MDFDLAorCTB4MEU0LCAweDA1MCwgMHgwRDQsIDB4MDVBLCAweDAxNywgMHgwODgsIDB4MDJGLCAweDBDRSwKKwkweDA4MywgMHgwMTAsIDB4MEY5LCAweDBEMCwgMHgwMjMsIDB4MDE3LCAweDAzQSwgMHgwMDQsCisJMHgwMzUsIDB4MEU2LCAweDAwMCwgMHgwMjIsIDB4MDE2LCAweDAzOSwgMHgwQzMsIDB4MEEzLAorCTB4MEZDLCAweDBFMCwgMHgwRDYsIDB4MDM1LCAweDBFMCwgMHgwQkYsIDB4MEY0LCAweDAxOCwKKwkweDBGMiwgMHgwMkQsIDB4MDRELCAweDA0MywgMHgwNTEsIDB4MDZFLCAweDA1QSwgMHgwMjIsCisJMHgwMUYsIDB4MDMwLCAweDBENCwgMHgwMTcsIDB4MEU3LCAweDA0MSwgMHgwOTEsIDB4MDczLAorCTB4MDA1LCAweDA0OCwgMHgwMkUsIDB4MDc3LCAweDA2OSwgMHgwMDAsIDB4MEU3LCAweDA0MywKKwkweDA5MCwgMHgwOEUsIDB4MDZDLCAweDBDQywgMHgwQzgsIDB4MDVFLCAweDA2QywgMHgwQ0MsCisJMHgwQzgsIDB4MDBGLCAweDAzMiwgMHgwMDUsIDB4MDIzLCAweDAxQywgMHgwRUYsIDB4MDRDLAorCTB4MDRFLCAweDAwNiwgMHgwMDQsIDB4MEM5LCAweDA5RSwgMHgwMEIsIDB4MEZGLCAweDA0MSwKKwkweDA4RiwgMHgwMjIsIDB4MEQ0LCAweDBENCwgMHgwMzUsIDB4MDE2LCAweDBFNSwgMHgwQTIsCisJMHgwMjEsIDB4MEYzLCAweDA1QSwgMHgwODIsIDB4MEZDLCAweDBFOCwgMHgwMzIsIDB4MDJFLAorCTB4MDYwLCAweDBBOSwgMHgwMDUsIDB4MENFLCAweDAxMywgMHgwNDgsIDB4MDA3LCAweDAzQSwKKwkweDAxQywgMHgwODQsIDB4MDczLCAweDA2NiwgMHgwNjYsIDB4MDQyLCAweDBGMywgMHgwNjYsCisJMHgwNjYsIDB4MDQwLCAweDA3OSwgMHgwOTAsIDB4MDI5LCAweDAxOCwgMHgwRTcsIDB4MDBBLAorCTB4MDk4LCAweDA5QywgMHgwMEEsIDB4MDlFLCAweDBCNSwgMHgwMTIsIDB4MDVDLCAweDA3QywKKwkweDBDMywgMHgwMzEsIDB4MDhCLCAweDA5OCwgMHgwMkEsIDB4MDdDLCAweDBEMywgMHgwRUQsCisJMHgwMzgsIDB4MEU5LCAweDBEMywgMHgwNEUsIDB4MDc0LCAweDBFRCwgMHgwNDksIDB4MDlFLAorCTB4MDBCLCAweDBGRiwgMHgwNDEsIDB4MDhGLCAweDAyMiwgMHgwRDQsIDB4MEQ0LCAweDAzNSwKKwkweDAxNiwgMHgwRTUsIDB4MEEyLCAweDAyRCwgMHgwRUIsIDB4MDQ1LCAweDAzMywgMHgwOEYsCisJMHgwRkMsIDB4MEY3LCAweDBBMCwgMHgwNUYsIDB4MDI1LCAweDAwMywgMHgwMUQsIDB4MEU0LAorCTB4MDBFLCAweDAwNiwgMHgwMEEsIDB4MDMwLCAweDBDQywgMHgwMEMsIDB4MEYzLCAweDBFQiwKKwkweDA0MCwgMHgwREUsIDB4MDYxLCAweDBBOCwgMHgwNzAsIDB4MDkyLCAweDAwQSwgMHgwMDAsCisJMHgwRTEsIDB4MDI0LCAweDAxRSwgMHgwMDAsIDB4MEUxLCAweDAyNCwgMHgwMUUsIDB4MDAwLAorCTB4MEUxLCAweDAyNCwgMHgwMUUsIDB4MDAwLCAweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMCwKKwkweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMSwgMHgwMEYsIDB4MDk4LCAweDAyQSwgMHgwMEIsCisJMHgwRjMsIDB4MEEwLCAweDBDOCwgMHgwQjksIDB4MEEyLCAweDBBNCwgMHgwMTcsIDB4MDNBLAorCTB4MDY5LCAweDAwMCwgMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDc1LCAweDA0OCwKKwkweDA1RSwgMHgwNzAsIDB4MDY5LCAweDAwMSwgMHgwRTYsIDB4MDAwLCAweDA1MiwgMHgwMzEsCisJMHgwQ0MsIDB4MDE4LCAweDAxNCwgMHgwQTUsIDB4MENDLCAweDAwOSwgMHgwODIsIDB4MDk0LAorCTB4MDczLCAweDAwQywgMHgwQTAsIDB4MDkxLCAweDBGNSwgMHgwMjUsIDB4MENDLCAweDAwNywKKwkweDAwNiwgMHgwODQsIDB4MDg0LCAweDA5RiwgMHgwMzAsIDB4MEEyLCAweDBBNCwgMHgwN0QsCisJMHgwNTAsIDB4MDc1LCAweDBBNiwgMHgwNjUsIDB4MDAxLCAweDA0QSwgMHgwOEUsIDB4MEI0LAorCTB4MENDLCAweDBDNCwgMHgwMzUsIDB4MDU0LCAweDA3NSwgMHgwNjYsIDB4MEE0LCAweDA5NywKKwkweDA3QSwgMHgwODksIDB4MDUwLCAweDA1MywgMHgwMTMsIDB4MDgwLCAweDAxOSwgMHgwRTMsCisJMHgwNDksIDB4MDVDLCAweDA2RCwgMHgwQ0UsIDB4MEE5LCAweDA0MCwgMHgwMzUsIDB4MDA2LAorCTB4MDc4LCAweDBEMiwgMHgwNTcsIDB4MDA2LCAweDBGMSwgMHgwQjMsIDB4MDJBLCAweDA4RCwKKwkweDA5NywgMHgwMjMsIDB4MDYyLCAweDA5MiwgMHgwNUQsIDB4MDY5LCAweDA5OSwgMHgwMUMsCisJMHgwNkEsIDB4MDM2LCAweDBFNiwgMHgwQ0QsIDB4MDQ2LCAweDAxMiwgMHgwNkYsIDB4MDlFLAorCTB4MEUxLCAweDBBQiwgMHgwRTQsIDB4MEEzLCAweDAwQywgMHgwQzAsIDB4MERFLCAweDBBQywKKwkweDBENCwgMHgwMEQsIDB4MDI4LCAweDAxQiwgMHgwRDAsIDB4MDEyLCAweDBBNSwgMHgwMDAsCisJMHgwRjgsIDB4MDRCLCAweDBBRCwgMHgwMzMsIDB4MDI4LCAweDAwNiwgMHgwQTAsIDB4MERFLAorCTB4MDE0LCAweDA5NywgMHgwM0EsIDB4MDg5LCAweDA1RCwgMHgwQzAsIDB4MDBELCAweDBFMywKKwkweDAwNiwgMHgwOTAsIDB4MDkyLCAweDA1RCwgMHgwNjksIDB4MDk4LCAweDA2NiwgMHgwQjksCisJMHgwMTksIDB4MDk1LCAweDBFNCwgMHgwQTgsIDB4MENGLCAweDA5RCwgMHgwMzMsIDB4MDE4LAorCTB4MDQ5LCAweDBCRSwgMHgwN0IsIDB4MDg2LCAweDBBRiwgMHgwOTIsIDB4MDhDLCAweDAzMywKKwkweDAyNCwgMHgwMTQsIDB4MDBDLCAweDBGNCwgMHgwODMsIDB4MDI0LCAweDAyMSwgMHgwQzIsCisJMHgwNzAsIDB4MEJGLCAweDBGNCwgMHgwMTgsIDB4MEYyLCAweDAyRCwgMHgwNEQsIDB4MDQzLAorCTB4MDUxLCAweDA2RSwgMHgwNUEsIDB4MDIyLCAweDAxRiwgMHgwMzIsIDB4MEE4LCAweDAyRiwKKwkweDBDRSwgMHgwODMsIDB4MDIyLCAweDBFNiwgMHgwMDUsIDB4MEE0LCAweDAxNywgMHgwM0EsCisJMHgwNjksIDB4MDAwLCAweDBFNywgMHgwNDMsIDB4MDkwLCAweDA4RSwgMHgwNzUsIDB4MDQ4LAorCTB4MDVFLCAweDA3MCwgMHgwNjksIDB4MDAxLCAweDBFNiwgMHgwNDIsIDB4MEE0LCAweDA2MywKKwkweDA5OCwgMHgwMDIsIDB4MDI5LCAweDA0QiwgMHgwOUEsIDB4MDI5LCAweDA3OCwgMHgwRTksCisJMHgwNDAsIDB4MDUzLCAweDAxMywgMHgwODEsIDB4MDgxLCAweDAzMiwgMHgwNjcsIDB4MDgyLAorCTB4MEZGLCAweDBEMCwgMHgwNjMsIDB4MEM4LCAweDBCNSwgMHgwMzUsIDB4MDBELCAweDA0NSwKKwkweDBBRSwgMHgwNTAsIDB4MDA4LCAweDA3QywgMHgwRTAsIDB4MEQwLCAweDA1RiwgMHgwOUQsCisJMHgwMDYsIDB4MDQ1LCAweDBDQywgMHgwMDEsIDB4MEE0LCAweDAxNywgMHgwM0EsIDB4MDY5LAorCTB4MDAwLCAweDBFNywgMHgwNDMsIDB4MDkwLCAweDA4RSwgMHgwNzUsIDB4MDQ4LCAweDA1RSwKKwkweDA3MCwgMHgwNjksIDB4MDAxLCAweDBFNiwgMHgwNTksIDB4MEE0LCAweDA2MywgMHgwOTgsCisJMHgwMUMsIDB4MDUyLCAweDA5NywgMHgwM0IsIDB4MDMwLCAweDA1MiwgMHgwOEUsIDB4MDdELAorCTB4MDJBLCAweDAwOSwgMHgwMUYsIDB4MDUxLCAweDBFQiwgMHgwQTQsIDB4MEE0LCAweDAwQSwKKwkweDBCOSwgMHgwOTQsIDB4MDg3LCAweDBBRSwgMHgwQzUsIDB4MDMxLCAweDAzOCwgMHgwMDIsCisJMHgwRkYsIDB4MEQwLCAweDA2MywgMHgwQzgsIDB4MEI1LCAweDAzNSwgMHgwMEQsIDB4MDQ1LAorCTB4MEFFLCAweDA1MCwgMHgwMDgsIDB4MDdDLCAweDBFQSwgMHgwMjAsIDB4MEJGLCAweDAzQSwKKwkweDAwQywgMHgwOEIsIDB4MDlBLCAweDAxNiwgMHgwOTAsIDB4MDVDLCAweDBFOSwgMHgwQTQsCisJMHgwMDMsIDB4MDlELCAweDAwRSwgMHgwNDIsIDB4MDM5LCAweDBENSwgMHgwMjEsIDB4MDc5LAorCTB4MDk1LCAweDA0OCwgMHgwMEYsIDB4MDMwLCAweDAwQSwgMHgwOTEsIDB4MDhFLCAweDA2MCwKKwkweDBFQiwgMHgwMjksIDB4MDczLCAweDAwMCwgMHgwMDksIDB4MDU0LCAweDAwNCwgMHgwQ0EsCisJMHgwODIsIDB4MDY1LCAweDA1MiwgMHgwNjUsIDB4MEU0LCAweDBDQSwgMHgwMjIsIDB4MDY1LAorCTB4MDcyLCAweDA2NSwgMHgwMDksIDB4MDMyLCAweDBFMCwgMHgwOTksIDB4MDcyLCAweDA0QywKKwkweDBDNCwgMHgwRTAsIDB4MDBCLCAweDBGRiwgMHgwNDEsIDB4MDhGLCAweDAyMiwgMHgwRDQsCisJMHgwRDQsIDB4MDM1LCAweDAxNiwgMHgwQjksIDB4MDQwLCAweDAyMSwgMHgwRjMsIDB4MDhBLAorCTB4MDgyLCAweDBGQywgMHgwRTgsIDB4MDMyLCAweDAyRSwgMHgwNjAsIDB4MEE5LCAweDAwNSwKKwkweDBDRSwgMHgwOUEsIDB4MDQwLCAweDAzOSwgMHgwRDAsIDB4MEU0LCAweDAyMywgMHgwOUQsCisJMHgwNTIsIDB4MDE3LCAweDA5OSwgMHgwNTQsIDB4MDYxLCAweDA5OSwgMHgwMDEsIDB4MEU2LAorCTB4MDQwLCAweDBBNCwgMHgwNjMsIDB4MDk4LCAweDAwNCwgMHgwQjEsIDB4MDg0LCAweDA5OCwKKwkweDAxOCwgMHgwRUYsIDB4MDJELCAweDAwMywgMHgwMDUsIDB4MDMxLCAweDAzOCwgMHgwMDIsCisJMHgwRkYsIDB4MEQwLCAweDA2MywgMHgwQzgsIDB4MEI1LCAweDAzNSwgMHgwMEQsIDB4MDQ1LAorCTB4MEI5LCAweDA2OCwgMHgwODgsIDB4MDdDLCAweDBFMCwgMHgwNTAsIDB4MDVGLCAweDA5RCwKKwkweDAwNiwgMHgwNDUsIDB4MENDLCAweDA4MSwgMHgwNDgsIDB4MDJFLCAweDA3MSwgMHgwMzQsCisJMHgwOEYsIDB4MDQ4LCAweDAwMSwgMHgwNDgsIDB4MDE1LCAweDAyMSwgMHgwMDUsIDB4MDIxLAorCTB4MEU5LCAweDAwQSwgMHgwNTIsIDB4MDAzLCAweDBDRSwgMHgwNUEsIDB4MDQ2LCAweDAzOSwKKwkweDBDRiwgMHgwNDcsIDB4MDhFLCAweDA2MCwgMHgwQUIsIDB4MDFBLCAweDBGMywgMHgwNTMsCisJMHgwNDMsIDB4MEVCLCAweDAzNSwgMHgwMjQsIDB4MEI4LCAweDAxQiwgMHgwMzAsIDB4MDA3LAorCTB4MDA5LCAweDA4QSwgMHgwNzQsIDB4MDJGLCAweDA3RSwgMHgwNDEsIDB4MDc0LCAweDAxRSwKKwkweDAxRCwgMHgwMEQsIDB4MDg3LCAweDA0NiwgMHgwNDksIDB4MEQ1LCAweDA5NSwgMHgwRDEsCisJMHgwRDUsIDB4MEQ1LCAweDBCQiwgMHgwQTksIDB4MDRFLCAweDA4MiwgMHgwOUQsIDB4MDA1LAorCTB4MDNBLCAweDAwQSwgMHgwNzQsIDB4MDE0LCAweDBFOCwgMHgwMjksIDB4MEQwLCAweDA0MiwKKwkweDA3NCwgMHgwNUIsIDB4MENFLCAweDA1MCwgMHgwQzQsIDB4MDA3LCAweDA0NSwgMHgwQkMsCisJMHgwRTIsIDB4MDBDLCAweDA0MCwgMHgwNzQsIDB4MDVCLCAweDBDRSwgMHgwODMsIDB4MDA0LAorCTB4MEY5LCAweDA5NSwgMHgwNEQsIDB4MDEzLCAweDA2MywgMHgwNUUsIDB4MDZGLCAweDAzMSwKKwkweDAzQiwgMHgwQTAsIDB4MDhCLCAweDBBMiwgMHgwQzUsIDB4MDM5LCAweDA4RCwgMHgwNzgsCisJMHgwM0EsIDB4MDIyLCAweDBBMCwgMHgwMDAsIDB4MDZCLCAweDBDMSwgMHgwRDEsIDB4MDU0LAorCTB4MDYwLCAweDAxNiwgMHgwRDksIDB4MDkxLCAweDBBMiwgMHgwRTcsIDB4MDQzLCAweDA4QywKKwkweDAyNCwgMHgwREMsIDB4MDFDLCAweDBFMCwgMHgwNTEsIDB4MDE3LCAweDAzOSwgMHgwNkIsCisJMHgwM0IsIDB4MENDLCAweDA0QiwgMHgwNDIsIDB4MDJFLCAweDA2QiwgMHgwNTAsIDB4MEJGLAorCTB4MDM2LCAweDAzNiwgMHgwNjUsIDB4MDRGLCAweDA3QSwgMHgwMTgsIDB4MDU1LCAweDAyNSwKKwkweDA3OCwgMHgwOTgsIDB4MDIzLCAweDBFNywgMHgwNTAsIDB4MDNFLCAweDBGMywgMHgwODEsCisJMHgwNEMsIDB4MDAyLCAweDA2RCwgMHgwM0UsIDB4MDcxLCAweDA1MywgMHgwQUYsIDB4MDc4LAorCTB4MEE5LCAweDBENCwgMHgwQTYsIDB4MDI5LCAweDBCMSwgMHgwQkMsIDB4MEQ5LCAweDA5OSwKKwkweDBCMiwgMHgwOEUsIDB4MDYyLCAweDA4RiwgMHgwMjIsIDB4MDJFLCAweDA3NSwgMHgwMTYsCisJMHgwQjAsIDB4MEIyLCAweDBBQiwgMHgwMjMsIDB4MDI4LCAweDAxNiwgMHgwNTQsIDB4MDUyLAorCTB4MDMxLCAweDBCQywgMHgwRDksIDB4MDk5LCAweDBCMiwgMHgwOEUsIDB4MDY2LCAweDAxOSwKKwkweDAwMiwgMHgwMkUsIDB4MDc1LCAweDAxNiwgMHgwNTAsIDB4MDJDLCAweDBBOSwgMHgwQzgsCisJMHgwQzYsIDB4MEY1LCAweDAyMCwgMHgwRDMsIDB4MEU0LCAweDA3RiwgMHgwNEYsIDB4MDlDLAorCTB4MDBBLCAweDBENiwgMHgwMTYsIDB4MDdGLCAweDA5MCwgMHgwRUUsIDB4MDRDLCAweDBFQiwKKwkweDBDRiwgMHgwRTIsIDB4MDg4LCAweDBCQSwgMHgwMkYsIDB4MDQyLCAweDA4NiwgMHgwQUUsCisJMHgwQkQsIDB4MEU1LCAweDBBNywgMHgwNTIsIDB4MDlGLCAweDA5MywgMHgwNjMsIDB4MDc5LAorCTB4MEVCLCAweDAzMywgMHgwMDgsIDB4MEY5LCAweDA5NCwgMHgwNTIsIDB4MDQ3LCAweDBDRCwKKwkweDA5OSwgMHgwMjUsIDB4MDZGLCAweDAzQSwgMHgwMEMsIDB4MDEzLCAweDBFNiwgMHgwNTUsCisJMHgwMzQsIDB4MDRDLCAweDA1QSwgMHgwNEQsIDB4MEI1LCAweDAyMywgMHgwOTUsIDB4MEE1LAorCTB4MDQ4LCAweDAxMSwgMHgwNUEsIDB4MDBBLCAweDA0MywgMHgwOTUsIDB4MEFDLCAweDAyQywKKwkweDBCQSwgMHgwMjQsIDB4MDA1LCAweDA0OSwgMHgwQjEsIDB4MEJDLCAweDBDQSwgMHgwQTcsCisJMHgwNzIsIDB4MDZDLCAweDA2QiwgMHgwQzUsIDB4MEJELCAweDBFOCwgMHgwMzEsIDB4MDY5LAorCTB4MDUyLCAweDA1RCwgMHgwMDYsIDB4MDEyLCAweDA2NSwgMHgwM0UsIDB4MEIxLCAweDA1MCwKKwkweDA0QywgMHgwN0QsIDB4MDRGLCAweDBBQywgMHgwMEEsIDB4MDMwLCAweDAwQiwgMHgwMzYsCisJMHgwNjQsIDB4MDExLCAweDA3MywgMHgwOEEsIDB4MDgzLCAweDA4RSwgMHgwNzUsIDB4MDEyLAorCTB4MDlGLCAweDA3QiwgMHgwRDIsIDB4MDk5LCAweDA1OCwgMHgwRUUsIDB4MDgyLCAweDAyRSwKKwkweDA3NywgMHgwQTAsIDB4MEUzLCAweDA5RCwgMHgwNUQsIDB4MDRGLCAweDBCQywgMHgwMkEsCisJMHgwNTMsIDB4MDI5LCAweDA1MywgMHgwREUsIDB4MDkzLCAweDAyNCwgMHgwQkEsIDB4MEIzLAorCTB4MDM2LCAweDBBQSwgMHgwNEEsIDB4MEM2LCAweDA3OSwgMHgwRDQsIDB4MEI5LCAweDBERSwKKwkweDA2MiwgMHgwNUEsIDB4MDExLCAweDA3MywgMHgwNTAsIDB4MDUwLCAweDBCRiwgMHgwMzcsCisJMHgwMzYsIDB4MDZGLCAweDAxMywgMHgwMjMsIDB4MEJBLCAweDAwQywgMHgwMjQsIDB4MENFLAorCTB4MEJELCAweDBFMiwgMHgwQTcsIDB4MDUyLCAweDBCMiwgMHgwOEUsIDB4MDZCLCAweDA2MCwKKwkweDA2MiwgMHgwMkUsIDB4MDc1LCAweDAxMywgMHgwMzAsIDB4MEFDLCAweDBBMCwgMHgwNTksCisJMHgwQ0EsIDB4MDY0LCAweDA2MywgMHgwNzksIDB4MEIzLCAweDAzMywgMHgwNjUsIDB4MDFDLAorCTB4MENDLCAweDAzMiwgMHgwMDQsIDB4MDVDLCAweDBFQSwgMHgwMkMsIDB4MEEwLCAweDA1OSwKKwkweDBERiwgMHgwMjMsIDB4MDFCLCAweDBENCwgMHgwODMsIDB4MDUyLCAweDA0NywgMHgwREQsCisJMHgwNzksIDB4MDk2LCAweDBENCwgMHgwOUUsIDB4MEIzLCAweDA1MiwgMHgwNEIsIDB4MEEyLAorCTB4MDVBLCAweDAxQSwgMHgwOEQsIDB4MDVELCAweDA3QiwgMHgwODIsIDB4MEE3LCAweDA1MiwKKwkweDBCMiwgMHgwOEUsIDB4MDY2LCAweDAxOSwgMHgwMDIsIDB4MDJFLCAweDA3NSwgMHgwMTYsCisJMHgwNTAsIDB4MDJDLCAweDA4QywgMHgwMzIsIDB4MDFELCAweDA3QiwgMHgwOEUsIDB4MEE3LAorCTB4MDUyLCAweDBCMSwgMHgwQkMsIDB4MEQ5LCAweDA5OSwgMHgwOTgsIDB4MDA0LCAweDBEQSwKKwkweDA3QywgMHgwRTIsIDB4MEFDLCAweDBGRSwgMHgwNjYsIDB4MDE5LCAweDAwMiwgMHgwMkUsCisJMHgwNjUsIDB4MDUwLCAweDBCRiwgMHgwMzMsIDB4MDY2LCAweDA2NCwgMHgwRkUsIDB4MDc0LAorCTB4MDE4LCAweDA4NiwgMHgwNEMsIDB4MDE3LCAweDAyNiwgMHgwRDYsIDB4MDE2LCAweDA1MiwKKwkweDAzOSwgMHgwMTgsIDB4MERFLCAweDA3QSwgMHgwQ0MsIDB4MEMyLCAweDAzRSwgMHgwNjUsCisJMHgwMTQsIDB4MDkxLCAweDBGMywgMHgwNjYsIDB4MDQ5LCAweDAwOCwgMHgwNkUsIDB4MDgzLAorCTB4MDA5LCAweDAzMywgMHgwQUYsIDB4MDMxLCAweDBFRCwgMHgwMEQsIDB4MDlELCAweDAwNiwKKwkweDAxMiwgMHgwNjIsIDB4MDJBLCAweDAzMSwgMHgwOEQsIDB4MDZELCAweDBFNywgMHgwNDEsCisJMHgwODIsIDB4MDdDLCAweDBDQSwgMHgwQTYsIDB4MDg5LCAweDA4NywgMHgwMDksIDB4MDJFLAorCTB4MDI5LCAweDBCMSwgMHgwQUYsIDB4MDEwLCAweDAzOSwgMHgwRDYsIDB4MDY0LCAweDA5NywKKwkweDAzMCwgMHgwMUQsIDB4MDQyLCAweDA3NSwgMHgwOTMsIDB4MDQ0LCAweDAwMiwgMHgwOEMsCisJMHgwMjQsIDB4MEQyLCAweDA3QSwgMHgwQjMsIDB4MDUwLCAweDBGNiwgMHgwODksIDB4MDA1LAorCTB4MDQzLCAweDA1RSwgMHgwNjEsIDB4MDk4LCAweDBDMCwgMHgwMkMsIDB4MDkyLCAweDAyNSwKKwkweDAzQywgMHgwOEIsIDB4MDI0LCAweDA4OSwgMHgwNDksIDB4MDA1LCAweDA0OSwgMHgwRTcsCisJMHgwMEMsIDB4MEI5LCAweDA4NCwgMHgwOTgsIDB4MEI3LCAweDBBRCwgMHgwMzMsIDB4MDQ0LAorCTB4MEFFLCAweDA1QSwgMHgwNTEsIDB4MDg2LCAweDA2MCwgMHgwOUYsIDB4MDM4LCAweDBBOSwKKwkweDBBMiwgMHgwNkMsIDB4MDZCLCAweDBDNCwgMHgwOEUsIDB4MEY0LCAweDA1RSwgMHgwNDksCisJMHgwNDYsIDB4MDEyLCAweDA2MiwgMHgwREUsIDB4MEI0LCAweDBDRCwgMHgwMjEsIDB4MDVDLAorCTB4MEI0LCAweDBBMywgMHgwMEMsIDB4MEMxLCAweDAzRSwgMHgwNzIsIDB4MDI5LCAweDBBMiwKKwkweDA2QywgMHgwNkIsIDB4MEM2LCAweDAxMiwgMHgwNjIsIDB4MDQ3LCAweDBGMCwgMHgwRTgsCisJMHgwQzMsIDB4MDMyLCAweDAwNCwgMHgwMzUsIDB4MDQwLCAweDA5MiwgMHgwQTQsIDB4MDgyLAorCTB4MDg4LCAweDAxMCwgMHgwOTIsIDB4MDdDLCAweDBDQiwgMHgwRDQsIDB4MDJGLCAweDBBNCwKKwkweDAwMiwgMHgwMTEsIDB4MDg0LCAweDA5OCwgMHgwQjcsIDB4MEFELCAweDAzMywgMHgwNDQsCisJMHgwQUUsIDB4MDVBLCAweDA1MSwgMHgwODYsIDB4MDYwLCAweDA5RiwgMHgwMzgsIDB4MEE5LAorCTB4MEEyLCAweDA2QywgMHgwNkIsIDB4MEM0LCAweDA4RSwgMHgwRjQsIDB4MDVFLCAweDA0OSwKKwkweDA0NCwgMHgwMDgsIDB4MDQ5LCAweDAzRSwgMHgwNjUsIDB4MEVBLCAweDAxNywgMHgwRDIsCisJMHgwMDEsIDB4MDA4LCAweDBDMiwgMHgwNEMsIDB4MDVCLCAweDBENiwgMHgwOTksIDB4MEE0LAorCTB4MDJCLCAweDA5NiwgMHgwOTQsIDB4MDYxLCAweDA5OCwgMHgwMjcsIDB4MENFLCAweDA0NSwKKwkweDAzNCwgMHgwNEQsIDB4MDhELCAweDA3OCwgMHgwODEsIDB4MDA5LCAweDAyNywgMHgwQ0MsCisJMHgwQkQsIDB4MDEyLCAweDAyOCwgMHgwNkMsIDB4MDU4LCAweDBBRiwgMHgwQjYsIDB4MEYzLAorCTB4MEEwLCAweDBDMSwgMHgwM0UsIDB4MDY1LCAweDA1MywgMHgwNDQsIDB4MEQ4LCAweDBENywKKwkweDA5MiwgMHgwOEUsIDB4MDdELCAweDA0QiwgMHgwQzIsIDB4MEZBLCAweDA2MSwgMHgwMjYsCisJMHgwMDYsIDB4MDNBLCAweDBCMywgMHgwNkIsIDB4MDAzLCAweDAwNSwgMHgwNDksIDB4MEU3LAorCTB4MDBDLCAweDBCOSwgMHgwNkYsIDB4MDVBLCAweDA2NiwgMHgwOTUsIDB4MDVDLCAweDBCNCwKKwkweDBBMywgMHgwMEMsIDB4MEMxLCAweDAzRSwgMHgwNzAsIDB4MDI5LCAweDBBMiwgMHgwNkUsCisJMHgwQTQsIDB4MERGLCAweDA5MywgMHgwNzEsIDB4MDEzLCAweDA3NywgMHgwMjYsIDB4MEUxLAorCTB4MDI2LCAweDBGOCwgMHgwMjYsIDB4MEM2LCAweDBCQywgMHgwOTQsIDB4MDczLCAweDBGOSwKKwkweDAyRiwgMHgwMEIsIDB4MEU5LCAweDA4NCwgMHgwOTgsIDB4MDE4LCAweDBFQSwgMHgwQ0MsCisJMHgwRUMsIDB4MDBDLCAweDAxNSwgMHgwMjcsIDB4MDlDLCAweDAzMiwgMHgwRkYsIDB4MDNELAorCTB4MDU2LCAweDBBRiwgMHgwOTIsIDB4MDhCLCAweDA3QSwgMHgwRDMsIDB4MDM1LCAweDBENSwKKwkweDBDQiwgMHgwNEEsIDB4MDMwLCAweDBDQywgMHgwMTMsIDB4MEU3LCAweDAwMiwgMHgwOUEsCisJMHgwMjYsIDB4MEM2LCAweDBCQywgMHgwOTQsIDB4MDczLCAweDA0MSwgMHgwOTcsIDB4MDkxLAorCTB4MEY0LCAweDA4MywgMHgwQ0UsIDB4MDA0LCAweDAyMCwgMHgwNjIsIDB4MDhCLCAweDAwNSwKKwkweDAxNiwgMHgwNDksIDB4MDhDLCAweDAyNCwgMHgwQzAsIDB4MEM3LCAweDA1NiwgMHgwOTAsCisJMHgwQzAsIDB4MEMxLCAweDA1MiwgMHgwNzksIDB4MEMzLCAweDAyRSwgMHgwNUIsIDB4MEQ1LAorCTB4MEE2LCAweDA3MiwgMHgwRDIsIDB4MDk0LCAweDBGQSwgMHgwQUQsIDB4MDU4LCAweDBDOCwKKwkweDBGQSwgMHgwOUYsIDB4MDU0LCAweDBCMywgMHgwMzIsIDB4MDRCLCAweDBCOSwgMHgwNTQsCisJMHgwQTYsIDB4MDUxLCAweDA4NiwgMHgwNkIsIDB4MDc5LCAweDBEMCwgMHgwNjAsIDB4MDlGLAorCTB4MDMyLCAweDAwNSwgMHgwMzQsIDB4MDRELCAweDA4RCwgMHgwN0EsIDB4MDRELCAweDAxRSwKKwkweDA3QSwgMHgwQjMsIDB4MDUxLCAweDAwMCwgMHgwQTksIDB4MDNELCAweDA1OSwgMHgwQTgsCisJMHgwN0IsIDB4MDQ0LCAweDA4MiwgMHgwQTEsIDB4MEFGLCAweDA0QSwgMHgwOEQsIDB4MDUyLAorCTB4MEE5LCAweDA1MiwgMHgwNDEsIDB4MDQ5LCAweDA0RiwgMHgwM0EsIDB4MDJFLCAweDA0MCwKKwkweDBBNCwgMHgwOTksIDB4MDUwLCAweDBCRSwgMHgwOTAsIDB4MDA4LCAweDA1MiwgMHgwNzksCisJMHgwQzMsIDB4MDJFLCAweDA2MSwgMHgwMjYsIDB4MDJELCAweDBFQiwgMHgwNEMsIDB4MEQwLAorCTB4MDE1LCAweDBDQiwgMHgwNEEsIDB4MDMwLCAweDBDQywgMHgwMTMsIDB4MEU3LCAweDAwMiwKKwkweDA5QSwgMHgwMjYsIDB4MEM2LCAweDBCQywgMHgwNDgsIDB4MEZFLCAweDAxRCwgMHgwMjUsCisJMHgwNDYsIDB4MEE5LCAweDA1NCwgMHgwQTksIDB4MDIwLCAweDBBNCwgMHgwQTcsIDB4MDlELAorCTB4MDE3LCAweDAyMCwgMHgwNTIsIDB4MDRDLCAweDBBOCwgMHgwNUYsIDB4MDQ4LCAweDAwNCwKKwkweDAyMywgMHgwMDksIDB4MDMxLCAweDA2RiwgMHgwNUEsIDB4MDY2LCAweDA4MCwgMHgwQUUsCisJMHgwNUEsIDB4MDUxLCAweDA4NiwgMHgwNjAsIDB4MDlGLCAweDAzOCwgMHgwMTQsIDB4MEQxLAorCTB4MDM2LCAweDAzNSwgMHgwRTQsIDB4MEE3LCAweDA5RCwgMHgwMTcsIDB4MDIwLCAweDA1MiwKKwkweDA0QywgMHgwQTIsIDB4MDQ1LCAweDAwRCwgMHgwOEIsIDB4MDE1LCAweDBGNCwgMHgwOTEsCisJMHgwREUsIDB4MDhCLCAweDBDOSwgMHgwMjgsIDB4MEMyLCAweDA0QywgMHgwNUIsIDB4MEQ2LAorCTB4MDk5LCAweDBBOSwgMHgwNUMsIDB4MEI0LCAweDBBMywgMHgwMEMsIDB4MEQ2LCAweDBGMywKKwkweDBBMCwgMHgwQzEsIDB4MDNFLCAweDA2NCwgMHgwMEEsIDB4MDY4LCAweDA5QiwgMHgwMUEsCisJMHgwRjEsIDB4MDZELCAweDA0QywgMHgwQUEsIDB4MDkyLCAweDBFMCwgMHgwMzYsIDB4MDk0LAorCTB4MDcwLCAweDA5QiwgMHgwMjksIDB4MDc4LCAweDAxMywgMHgwQUUsIDB4MEIzLCAweDBBQSwKKwkweDA4NSwgMHgwRDQsIDB4MDQzLCAweDA3NSwgMHgwMDksIDB4MDNBLCAweDBDOSwgMHgwRUIsCisJMHgwMzUsIDB4MDI0LCAweDBCOCwgMHgwMUIsIDB4MDMyLCAweDA4RSwgMHgwMTMsIDB4MDQ4LAorCTB4MDdFLCAweDA0RSwgMHgwRkQsIDB4MDQwLCAweDBGRCwgMHgwNDAsIDB4MEZELCAweDA0MCwKKwkweDBGRCwgMHgwNDAsIDB4MEZELCAweDA0MCwgMHgwRkMsIDB4MDEzLCAweDBGNCwgMHgwMjEsCisJMHgwRjksIDB4MDE3LCAweDA0NSwgMHgwOEEsIDB4MDMwLCAweDAwQiwgMHgwMzMsIDB4MDVGLAorCTB4MDgzLCAweDBBMiwgMHgwMkEsIDB4MDMwLCAweDAwQiwgMHgwMzMsIDB4MDVGLCAweDA4MywKKwkweDBBMiwgMHgwQTgsIDB4MEMwLCAweDAyRCwgMHgwQjMsIDB4MDIwLCAweDA3MCwgMHgwOTIsCisJMHgwMTMsIDB4MDlBLCAweDBERSwgMHgwNzQsIDB4MDE4LCAweDAyNywgMHgwQ0MsIDB4MEFBLAorCTB4MDY4LCAweDA5QiwgMHgwMUEsIDB4MEY3LCAweDAwNywgMHgwNDUsIDB4MDUxLCAweDA4MCwKKwkweDA1QiwgMHgwNjYsIDB4MDQ3LCAweDAwNywgMHgwMzgsIDB4MEE4LCAweDAyMywgMHgwRTcsCisJMHgwNTEsIDB4MDExLCAweDAzRiwgMHgwRTAsIDB4MEU4LCAweDA4NSwgMHgwNDYsIDB4MDAxLAorCTB4MDZELCAweDA5OSwgMHgwMDYsIDB4MDEyLCAweDA2NSwgMHgwNEYsIDB4MDdBLCAweDAyMCwKKwkweDAyNCwgMHgwQkEsIDB4MEIzLCAweDAzMiwgMHgwMTUsIDB4MDI1LCAweDA3QiwgMHgwQUQsCisJMHgwMzMsIDB4MDc4LCAweDBBRSwgMHgwMEUsIDB4MDczLCAweDBEMCwgMHgwNDcsIDB4MENFLAorCTB4MEE3LCAweDAzMCwgMHgwQ0MsIDB4MDQ0LCAweDBGRiwgMHgwODMsIDB4MEEyLCAweDBBOCwKKwkweDBDMCwgMHgwMkMsIDB4MEQ5LCAweDA5MSwgMHgwQzEsIDB4MEQxLCAweDAxNSwgMHgwMTgsCisJMHgwMDUsIDB4MDlCLCAweDAzMiwgMHgwMDgsIDB4MEJBLCAweDAyQywgMHgwNTEsIDB4MDgwLAorCTB4MDU5LCAweDBCMywgMHgwMjAsIDB4MDcwLCAweDA5MiwgMHgwRTIsIDB4MDk4LCAweDA4OSwKKwkweDBGRCwgMHgwQkMsIDB4MEVFLCAweDAxOCwgMHgwOTAsIDB4MEZDLCAweDA4QiwgMHgwQTIsCisJMHgwQzUsIDB4MDJCLCAweDAwRCwgMHgwNzgsIDB4MDNBLCAweDAyMiwgMHgwQTUsIDB4MDYxLAorCTB4MEFGLCAweDAwNywgMHgwNDUsIDB4MDUxLCAweDA4MCwgMHgwNUIsIDB4MDY2LCAweDA0NCwKKwkweDA5RSwgMHgwQjMsIDB4MDUyLCAweDA0QiwgMHgwODMsIDB4MEFELCAweDBDNywgMHgwMDksCisJMHgwQkUsIDB4MDFGLCAweDA5RiwgMHgwNzQsIDB4MDY1LCAweDA1RCwgMHgwMEEsIDB4MDE3LAorCTB4MDdDLCAweDBBQiwgMHgwQTAsIDB4MEMyLCAweDA0QywgMHgwMzgsIDB4MDQ5LCAweDAxMiwKKwkweDAyRSwgMHgwMzgsIDB4MDQ5LCAweDAwNywgMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwM0UsCisJMHgwNjUsIDB4MDUzLCAweDA0NCwgMHgwRDgsIDB4MEQ3LCAweDBBRCwgMHgwRTcsIDB4MDAwLAorCTB4MDMyLCAweDA0QiwgMHgwOUIsIDB4MDMzLCAweDAzNCwgMHgwNEEsIDB4MDAzLCAweDAwMCwKKwkweDA5RCwgMHgwMjUsIDB4MENFLCAweDA4MywgMHgwMjQsIDB4MEI4LCAweDAxOSwgMHgwOTksCisJMHgwOEMsIDB4MDAyLCAweDAxMiwgMHgwNEIsIDB4MEExLCAweDA5OSwgMHgwRDgsIDB4MEMwLAorCTB4MDI3LCAweDA0OSwgMHgwNzMsIDB4MENGLCAweDBGOSwgMHgwM0MsIDB4MEY0LCAweDA3QywKKwkweDBFNywgMHgwOTgsIDB4MDA0LCAweDBFOSwgMHgwMkUsIDB4MDdGLCAweDAzOSwgMHgwRTMsCisJMHgwNEYsIDB4MDQ2LCAweDA1MywgMHgwQzAsIDB4MDYwLCAweDAxMywgMHgwQTQsIDB4MEI5LAorCTB4MEU1LCAweDAzQywgMHgwMDMsIDB4MERFLCAweDA4RiwgMHgwOUMsIDB4MEYzLCAweDAwMCwKKwkweDA5QywgMHgwNkYsIDB4MENGLCAweDAzRSwgMHgwODUsIDB4MEY5LCAweDBBMywgMHgwMzYsCisJMHgwMDIsIDB4MDFFLCAweDA2MCwgMHgwMzgsIDB4MDkyLCAweDAzRSwgMHgwNjMsIDB4MDFBLAorCTB4MDEwLCAweDA5RiwgMHgwQ0YsIDB4MDE4LCAweDAxMCwgMHgwOTIsIDB4MEJDLCAweDBEMCwKKwkweDBBNCwgMHgwMEMsIDB4MERDLCAweDBDMCwgMHgwMEYsIDB4MDlDLCAweDA5NywgMHgwMzQsCisJMHgwNjIsIDB4MEI2LCAweDBFNywgMHgwRjMsIDB4MEYzLCAweDBBNSwgMHgwQ0YsIDB4MDE4LAorCTB4MDQyLCAweDAzNCwgMHgwMUMsIDB4MEMyLCAweDBDQSwgMHgwRkEsIDB4MDhFLCAweDA2OCwKKwkweDA1MiwgMHgwMDYsIDB4MEFGLCAweDAzQywgMHgwQTMsIDB4MDBELCAweDBCRiwgMHgwOUUsCisJMHgwNTAsIDB4MEUxLCAweDBEMSwgMHgwNzMsIDB4MENBLCAweDBFMCwgMHgwM0EsIDB4MEZDLAorCTB4MEMxLCAweDAwOSwgMHgwMUEsIDB4MDFFLCAweDA2QSwgMHgwNUMsIDB4MDVCLCAweDA4RSwKKwkweDA2MywgMHgwNEUsIDB4MDc3LCAweDA3MywgMHgwQ0MsIDB4MDYxLCAweDA2NywgMHgwREQsCisJMHgwRTYsIDB4MDZDLCAweDA0OCwgMHgwRDEsIDB4MEYzLCAweDAxQiwgMHgwMjQsIDB4MDY5LAorCTB4MDUxLCAweDAwOCwgMHgwRDQsIDB4MDQyLCAweDAxQiwgMHgwRjQsIDB4MDY3LCAweDBEMSwKKwkweDA4MCwgMHgwNEUsIDB4MDJGLCAweDBEMCwgMHgwOEMsIDB4MEQ4LCAweDAzMCwgMHgwMDksCisJMHgwQzIsIDB4MDFFLCAweDA4MCwgMHgwMUMsIDB4MDQ2LCAweDAwMSwgMHgwM0EsIDB4MDQ3LAorCTB4MEQwLCAweDAzMSwgMHgwQTEsIDB4MDA2LCAweDAwMSwgMHgwM0EsIDB4MDdGLCAweDA0NiwKKwkweDAzMCwgMHgwMjEsIDB4MDE4LCAweDAwNCwgMHgwRTksIDB4MDVFLCAweDA4NCwgMHgwMjksCisJMHgwMDAsIDB4MEMwLCAweDAyNywgMHgwQ0QsIDB4MEQwLCAweDAwMCwgMHgwN0MsIDB4MDk4LAorCTB4MDA0LCAweDBGOSwgMHgwMkUsIDB4MDg0LCAweDA2MiwgMHgwOEMsIDB4MDAyLCAweDA3RCwKKwkweDBCQSwgMHgwM0UsIDB4MDdFLCAweDA0QywgMHgwMDIsIDB4MDdELCAweDAyRSwgMHgwOEMsCisJMHgwNjEsIDB4MDA4LCAweDAzMCwgMHgwMDksIDB4MEY0LCAweDAxRCwgMHgwMDEsIDB4MDY1LAorCTB4MDczLCAweDAwMCwgMHgwOUYsIDB4MDUxLCAweDBEMCwgMHgwODUsIDB4MDIwLCAweDAxOCwKKwkweDAwNCwgMHgwRkEsIDB4MEJELCAweDAxOSwgMHgwNDYsIDB4MDE4LCAweDBDMCwgMHgwMjcsCisJMHgwREYsIDB4MEQxLCAweDA5NCwgMHgwMzgsIDB4MDRDLCAweDAwMiwgMHgwN0QsIDB4MDE3LAorCTB4MDQ2LCAweDA1NywgMHgwMDEsIDB4MDMwLCAweDAwOSwgMHgwRjUsIDB4MEZBLCAweDAwMSwKKwkweDAwOSwgMHgwMDYsIDB4MDAxLCAweDAzRSwgMHgwODcsIDB4MEExLCAweDA0QiwgMHgwODgsCisJMHgwQzAsIDB4MDI3LCAweDBEQywgMHgwNzQsIDB4MDBELCAweDAzOSwgMHgwRDMsIDB4MDAwLAorCTB4MDlGLCAweDA3MywgMHgwRDAsIDB4MDMwLCAweDBCMywgMHgwOTgsIDB4MDA0LCAweDBGQiwKKwkweDBCRCwgMHgwMDYsIDB4MEM0LCAweDA4MywgMHgwMDAsIDB4MDlGLCAweDA0NywgMHgwRDAsCisJMHgwMzYsIDB4MDQ4LCAweDBDQywgMHgwMDIsIDB4MDcxLCAweDBCRiwgMHgwM0YsIDB4MDlBLAorCTB4MDE3LCAweDBFNiwgMHgwM0YsIDB4MDA4LCAweDAyMSwgMHgwRTYsIDB4MDkyLCAweDBBNCwKKwkweDA4RiwgMHgwOUEsIDB4MDEwLCAweDAzMSwgMHgwQTcsIDB4MEYzLCAweDAxMCwgMHgwQjEsCisJMHgwODQsIDB4MEFGLCAweDAzQSwgMHgwQUMsIDB4MERDLCAweDBGNywgMHgwNzMsIDB4MEYyLAorCTB4MDVDLCAweDBDNiwgMHgwMkEsIDB4MERCLCAweDA5RSwgMHgwN0UsIDB4MDdFLCAweDA5NywKKwkweDAzMSwgMHgwMDgsIDB4MDYzLCAweDBEMCwgMHgwNzMsIDB4MDdCLCAweDA0MywgMHgwQTgsCisJMHgwRTYsIDB4MDNELCAweDAzNCwgMHgwRUEsIDB4MEYzLCAweDBFMywgMHgwMTUsIDB4MEJGLAorCTB4MDlGLCAweDAxOCwgMHgwNUYsIDB4MDQ1LCAweDBDRiwgMHgwRTgsIDB4MDlGLCAweDA1RiwKKwkweDA5QSwgMHgwNUIsIDB4MDAzLCAweDBEMCwgMHgwRjMsIDB4MEQzLCAweDBDRSwgMHgwMzcsCisJMHgwMUMsIDB4MEQwLCAweDAwRiwgMHgwQkIsIDB4MDlFLCAweDA2OCwgMHgwNzgsIDB4MDNCLAorCTB4MEJDLCAweDBDQSwgMHgwMzEsIDB4MEU4LCAweDBGOSwgMHgwQTIsIDB4MDAyLCAweDAxMiwKKwkweDBBMiwgMHgwNzMsIDB4MDUxLCAweDAwOCwgMHgwNkYsIDB4MEQxLCAweDBGMywgMHgwNDYsCisJMHgwMDEsIDB4MDM4LCAweDBCRiwgMHgwNDAsIDB4MEZDLCAweDAyMywgMHgwMDAsIDB4MDlDLAorCTB4MDIxLCAweDBFOCwgMHgwNDksIDB4MDUxLCAweDA4MCwgMHgwNEUsIDB4MDkxLCAweDBGNCwKKwkweDAyMSwgMHgwMDMsIDB4MDE5LCAweDA4MCwgMHgwNEUsIDB4MDlGLCAweDBEMCwgMHgwMjEsCisJMHgwNjMsIDB4MDA2LCAweDAwMSwgMHgwM0EsIDB4MDU2LCAweDA4QywgMHgwMDIsIDB4MDc0LAorCTB4MEZFLCAweDA3NSwgMHgwNDksIDB4MDVFLCAweDA2MywgMHgwRDMsIDB4MDRBLCAweDA1NCwKKwkweDA0MiwgMHgwMzUsIDB4MDEzLCAweDBBNywgMHgwRDEsIDB4MDgwLCAweDA0RSwgMHgwOTUsCisJMHgwRTgsIDB4MDFFLCAweDA5QSwgMHgwNEMsIDB4MDAyLCAweDA3QywgMHgwREQsIDB4MDFCLAorCTB4MEI5LCAweDBFNiwgMHgwMDEsIDB4MDNFLCAweDA0QiwgMHgwQTAsIDB4MDYyLCAweDBBMywKKwkweDAwMCwgMHgwOUYsIDB4MDZFLCAweDA4QywgMHgwRkMsIDB4MEYzLCAweDAwMCwgMHgwOUYsCisJMHgwNEIsIDB4MEEwLCAweDA0MiwgMHgwMTgsIDB4MENDLCAweDAwMiwgMHgwN0QsIDB4MDA3LAorCTB4MDQzLCAweDBEQSwgMHgwMTMsIDB4MDAwLCAweDA5RiwgMHgwNTEsIDB4MEQwLCAweDAzRCwKKwkweDAzNCwgMHgwOTgsIDB4MDA0LCAweDBGQSwgMHgwQkQsIDB4MDFDLCAweDA2MiwgMHgwOEMsCisJMHgwMDIsIDB4MDdELCAweDBGRCwgMHgwMUMsIDB4MDYxLCAweDA3MywgMHgwMDAsIDB4MDlGLAorCTB4MDQ1LCAweDBEMSwgMHgwRjQsIDB4MDRFLCAweDA2MCwgMHgwMTMsIDB4MEVCLCAweDBGNCwKKwkweDAyNSwgMHgwQjAsIDB4MDMzLCAweDAwMCwgMHgwOUYsIDB4MDQzLCAweDBEMSwgMHgwQTcsCisJMHgwOUMsIDB4MDE4LCAweDAwNCwgMHgwRkIsIDB4MDhFLCAweDA4NCwgMHgwMDMsIDB4MEU5LAorCTB4MDgwLCAweDA0RiwgMHgwQjksIDB4MEU4LCAweDA0MywgMHgwQzEsIDB4MDMwLCAweDAwOSwKKwkweDBGNywgMHgwN0EsIDB4MDBBLCAweDAzMSwgMHgwOTgsIDB4MDA0LCAweDBGQSwgMHgwM0UsCisJMHgwODQsIDB4MDQwLCAweDA0MSwgMHgwODAsIDB4MDRFLCAweDA4MiwgMHgwRTcsIDB4MDQxLAorCTB4MDg3LCAweDAwOSwgMHgwMjMsIDB4MDA0LCAweDAyMywgMHgwMDAsIDB4MDlELCAweDAwNSwKKwkweDBDRSwgMHgwOTYsIDB4MDFDLCAweDAyNCwgMHgwOEMsIDB4MDEwLCAweDA4QywgMHgwMDIsCisJMHgwNzQsIDB4MDE3LCAweDAzQSwgMHgwMDQsIDB4MDM4LCAweDA0OSwgMHgwMTgsIDB4MDIxLAorCTB4MDE4LCAweDAwNCwgMHgwRTgsIDB4MDJFLCAweDA3NCwgMHgwNTAsIDB4MEUxLCAweDAyNCwKKwkweDA2MCwgMHgwODQsIDB4MDYwLCAweDAxMywgMHgwQTAsIDB4MEI5LCAweDBENCwgMHgwMTEsCisJMHgwQzIsIDB4MDQ4LCAweDBDMSwgMHgwMDgsIDB4MEMwLCAweDAyNywgMHgwNDEsIDB4MDczLAorCTB4MEE4LCAweDAyMywgMHgwODQsIDB4MDkxLCAweDA4MiwgMHgwMTEsIDB4MDgwLCAweDA0RSwKKwkweDA4MiwgMHgwRTcsIDB4MDUyLCAweDA4RSwgMHgwMTIsIDB4MDQ2LCAweDAwOCwgMHgwNDYsCisJMHgwMDEsIDB4MDNBLCAweDAwQiwgMHgwOUQsIDB4MDQwLCAweDAxQywgMHgwMjQsIDB4MDhDLAorCTB4MDEwLCAweDA4QywgMHgwMDIsIDB4MDc0LCAweDAxNywgMHgwM0EsIDB4MDA5LCAweDAwRSwKKwkweDAxMiwgMHgwNDYsIDB4MDA4LCAweDA0NiwgMHgwMDEsIDB4MDNBLCAweDAwQiwgMHgwOTgsCisJMHgwNkEsIDB4MDFDLCAweDAyNCwgMHgwQjAsIDB4MEUxLCAweDAxOCwgMHgwMDQsIDB4MEU4LAorCTB4MDJFLCAweDA2QiwgMHgwNTAsIDB4MEUxLCAweDAyNSwgMHgwODcsIDB4MDA4LCAweDBDMCwKKwkweDAyNywgMHgwNDEsIDB4MDczLCAweDAwNSwgMHgwNDMsIDB4MDg0LCAweDA5NiwgMHgwMUMsCisJMHgwMjMsIDB4MDAwLCAweDA5RCwgMHgwMDUsIDB4MENDLCAweDBBQSwgMHgwMUMsIDB4MDI0LAorCTB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBFOCwgMHgwMkUsIDB4MDcwLCAweDA2OCwKKwkweDA3MCwgMHgwOTIsIDB4MEMzLCAweDA4NCwgMHgwNjAsIDB4MDEzLCAweDBFNSwgMHgwNDQsCisJMHgwRjksIDB4MDQwLCAweDA5RCwgMHgwMDUsIDB4MENFLCAweDA1QSwgMHgwMUMsIDB4MDI0LAorCTB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBGOSwgMHgwRDEsIDB4MDNFLCAweDA3MCwKKwkweDAyNywgMHgwQ0YsIDB4MDEzLCAweDBFNSwgMHgwNDQsIDB4MDJDLCAweDBBMCwgMHgwNDIsCisJMHgwQ0IsIDB4MDg5LCAweDBGMiwgMHgwMjEsIDB4MDNBLCAweDAwQiwgMHgwOUMsIDB4MDBBLAorCTB4MDFDLCAweDAyNCwgMHgwQjAsIDB4MEUxLCAweDAxOCwgMHgwMDQsIDB4MEY5LCAweDBEMSwKKwkweDAwQiwgMHgwMzgsIDB4MDEwLCAweDBCMywgMHgwQzQsIDB4MDIxLCAweDAzOSwgMHgwMzYsCisJMHgwNUMsIDB4MDQyLCAweDBDOCwgMHgwODQsIDB4MDJCLCAweDA3OSwgMHgwRDAsIDB4MDYxLAorCTB4MEMyLCAweDA3NCwgMHgwMTUsIDB4MDI0LCAweDBCQSwgMHgwRDMsIDB4MDMxLCAweDBFNSwKKwkweDA1OSwgMHgwMDgsIDB4MDI5LCAweDAwOCwgMHgwRTAsIDB4MDY2LCAweDA2MywgMHgwNDIsCisJMHgwOTUsIDB4MDEyLCAweDA4MSwgMHgwMDAsIDB4MDI5LCAweDAwQiwgMHgwQzEsIDB4MDUxLAorCTB4MDI0LCAweDBCOCwgMHgwMTksIDB4MDk5LCAweDA5MCwgMHgwMjIsIDB4MDkwLCAweDBCNCwKKwkweDAxOCwgMHgwQTAsIDB4MDkxLCAweDA0MSwgMHgwMDEsIDB4MDQxLCAweDA0MSwgMHgwNDEsCisJMHgwNTIsIDB4MDgzLCAweDBDQSwgMHgwNDAsIDB4MDI4LCAweDA2OCwgMHgwMjksIDB4MDA4LAorCTB4MEJBLCAweDAxNiwgMHgwMTAsIDB4MDlDLCAweDA5OSwgMHgwMEIsIDB4MDU2LCAweDA5NCwKKwkweDA5MCwgMHgwNTIsIDB4MDE1LCAweDA3NCwgMHgwQzAsIDB4MDI3LCAweDAxQSwgMHgwMkEsCisJMHgwRDIsIDB4MDkwLCAweDAyNSwgMHgwRDMsIDB4MDAwLCAweDA5RCwgMHgwMjgsIDB4MEFCLAorCTB4MDRBLCAweDA0MiwgMHgwMTcsIDB4MDRDLCAweDAwMiwgMHgwNzAsIDB4MEQ0LCAweDA4NCwKKwkweDAyRSwgMHgwOTgsIDB4MDA0LCAweDBFMSwgMHgwMkEsIDB4MDQyLCAweDAxNywgMHgwNEMsCisJMHgwMDIsIDB4MDcwLCAweDA4MiwgMHgwOTAsIDB4MDRCLCAweDBBNiwgMHgwMDEsIDB4MDM4LAorCTB4MDUxLCAweDA0OCwgMHgwNDIsIDB4MEU5LCAweDA4MCwgMHgwNEUsIDB4MDE1LCAweDBBNCwKKwkweDAyMSwgMHgwNzQsIDB4MEMwLCAweDAyNywgMHgwMEYsIDB4MEE0LCAweDAxMiwgMHgwRTksCisJMHgwODAsIDB4MDRFLCAweDA4MiwgMHgwQUMsIDB4MDgwLCAweDBBQywgMHgwQTAsIDB4MEFDLAorCTB4MEE5LCAweDA1OSwgMHgwRTUsIDB4MDY0LCAweDA0NSwgMHgwNjUsIDB4MENBLCAweDBDOCwKKwkweDA0QSwgMHgwQ0UsIDB4MDBBLCAweDBDRSwgMHgwNEEsIDB4MENFLCAweDA5NSwgMHgwOTEsCisJMHgwOTUsIDB4MDk0LCAweDA5NSwgMHgwOTMsIDB4MDI5LCAweDAyNSwgMHgwQzAsIDB4MENDLAorCTB4MENDLCAweDA4OCwgMHgwQTQsIDB4MDk3LCAweDA1NiwgMHgwMzYsIDB4MDY0LCAweDA3MiwKKwkweDA5MCwgMHgwNTQsIDB4MDhBLCAweDA5QywgMHgwNDUsIDB4MDA4LCAweDBCOSwgMHgwQjcsCisJMHgwNjYsIDB4MDEyLCAweDA5MywgMHgwMDksIDB4MEM5LCAweDBCMiwgMHgwNzQsIDB4MDhFLAorCTB4MEJBLCAweDA2MCwgMHgwMTMsIDB4MEU1LCAweDAzNCwgMHgwOEUsIDB4MEJBLCAweDA2MCwKKwkweDAxMywgMHgwRTQsIDB4MDc0LCAweDA4RSwgMHgwQkEsIDB4MDYwLCAweDAxMywgMHgwRTUsCisJMHgwNjksIDB4MDFELCAweDA3NCwgMHgwQzAsIDB4MDI3LCAweDBDQSwgMHgwMjksIDB4MDFELAorCTB4MDc0LCAweDBDMCwgMHgwMjcsIDB4MENFLCAweDBEMiwgMHgwMjUsIDB4MEQzLCAweDAwMCwKKwkweDA5RiwgMHgwMzgsIDB4MEE0LCAweDA0QiwgMHgwQTYsIDB4MDAxLCAweDAzRSwgMHgwNUUsCisJMHgwOTEsIDB4MDJFLCAweDA5OCwgMHgwMDQsIDB4MEY5LCAweDAxNSwgMHgwMjIsIDB4MDVELAorCTB4MDMwLCAweDAwOSwgMHgwRjMsIDB4MEU5LCAweDAxMiwgMHgwRTksIDB4MDgwLCAweDA0RiwKKwkweDA5MCwgMHgwNTIsIDB4MDI1LCAweDBEMywgMHgwMDAsIDB4MDlELCAweDBDNSwgMHgwNDgsCisJMHgwMjUsIDB4MEQzLCAweDAwMCwgMHgwOUMsIDB4MDQ1LCAweDBDRSwgMHgwQ0QsIDB4MDA5LAorCTB4MEM5LCAweDBCMiwgMHgwMUEsIDB4MDQ0LCAweDBCQSwgMHgwNjAsIDB4MDEzLCAweDBFNywKKwkweDAzNCwgMHgwODksIDB4MDc0LCAweDBDMCwgMHgwMjcsIDB4MDFDLCAweDAyNywgMHgwQjcsCisJMHgwOUMsIDB4MDgwLCAweDBDMiwgMHgwRDcsIDB4MDc2LCAweDA1OSwgMHgwOUIsIDB4MDkzLAorCTB4MDBDLCAweDA2NCwgMHgwQzMsIDB4MDFELCAweDAxQiwgMHgwRjQsIDB4MDQ1LCAweDA0QiwKKwkweDBDNywgMHgwQzYsIDB4MDNBLCAweDAzNywgMHgwRTgsIDB4MDgxLCAweDA0QiwgMHgwQzcsCisJMHgwQzYsIDB4MDNBLCAweDAzNywgMHgwRTgsIDB4MDkxLCAweDA0QiwgMHgwQzcsIDB4MEM2LAorCTB4MDMyLCAweDA2MSwgMHgwOEUsIDB4MEIzLCAweDBCQywgMHgwQzMsIDB4MDRBLCAweDAyMiwKKwkweDBFNiwgMHgwQjUsIDB4MDI0LCAweDA5NywgMHgwNzEsIDB4MEM5LCAweDA4NywgMHgwQjQsCisJMHgwMzEsIDB4MEFFLCAweDA3MywgMHgwQTIsIDB4MENGLCAweDAzOSwgMHgwRDIsIDB4MDVELAorCTB4MDA0LCAweDA0NCwgMHgwNDIsIDB4MEMwLCAweDBENiwgMHgwREUsIDB4MDcxLCAweDAwNiwKKwkweDAxNiwgMHgwQkIsIDB4MERCLCAweDBDRSwgMHgwODMsIDB4MDBDLCAweDA2NCwgMHgwQzMsCisJMHgwMUQsIDB4MDMxLCAweDAxMywgMHgwMDQsIDB4MEY5LCAweDA5NSwgMHgwNEQsIDB4MDEzLAorCTB4MDMyLCAweDA5MywgMHgwNjMsIDB4MDVFLCAweDA2NiwgMHgwMTQsIDB4MENDLCAweDAyOSwKKwkweDAyQSwgMHgwNTMsIDB4MDMwLCAweDBBNiwgMHgwNjEsIDB4MDRDLCAweDBDMiwgMHgwOTksCisJMHgwODUsIDB4MDNBLCAweDA3MiwgMHgwQ0MsIDB4MEMyLCAweDA5OSwgMHgwODUsIDB4MDA2LAorCTB4MDFCLCAweDBCMywgMHgwMEEsIDB4MDY2LCAweDAxNCwgMHgwMTQsIDB4MDI0LCAweDA5OSwKKwkweDA4NSwgMHgwMzMsIDB4MDBBLCAweDAwOCwgMHgwQjEsIDB4MDg2LCAweDA2MSwgMHgwNEMsCisJMHgwQzIsIDB4MDg0LCAweDAyMSwgMHgwNjgsIDB4MDczLCAweDAzQiwgMHgwMzAsIDB4MEE2LAorCTB4MDYxLCAweDA0MSwgMHgwNEUsIDB4MEE1LCAweDA5OCwgMHgwNTMsIDB4MDMwLCAweDBBQywKKwkweDA1OSwgMHgwNzYsIDB4MDYxLCAweDA0QywgMHgwQzIsIDB4MEIwLCAweDA4RCwgMHgwRDYsCisJMHgwNjEsIDB4MDRDLCAweDBDMiwgMHgwQjAsIDB4MDJDLCAweDBGNiwgMHgwNjEsIDB4MDRDLAorCTB4MEMyLCAweDBCMSwgMHgwOEMsIDB4MEE1LCAweDA5OCwgMHgwNTMsIDB4MDMwLCAweDBBQywKKwkweDAwRiwgMHgwMjQsIDB4MENDLCAweDAyOSwgMHgwOTgsIDB4MDU2LCAweDAwRiwgMHgwMjgsCisJMHgwNjYsIDB4MDE1LCAweDA5MiwgMHgwMUEsIDB4MDE5LCAweDA4NSwgMHgwMzMsIDB4MDBBLAorCTB4MENBLCAweDA4NSwgMHgwMEMsIDB4MEMyLCAweDA5OSwgMHgwODUsIDB4MDY1LCAweDBDMywKKwkweDBEOSwgMHgwODUsIDB4MDMzLCAweDAwQSwgMHgwQ0UsIDB4MDcwLCAweDA4NiwgMHgwNjEsCisJMHgwNEMsIDB4MEMyLCAweDBCMywgMHgwOTcsIDB4MDcxLCAweDAwQywgMHgwOTksIDB4MDNCLAorCTB4MENDLCAweDA4MywgMHgwNTgsIDB4MDBCLCAweDBFQSwgMHgwNzcsIDB4MDlELCAweDAwNiwKKwkweDA0QSwgMHgwQkUsIDB4MDA0LCAweDA3NCwgMHgwNjAsIDB4MEUwLCAweDBEMSwgMHgwNEUsCisJMHgwMzgsIDB4MDRDLCAweDAzRSwgMHgwRUUsIDB4MDNFLCAweDBFRSwgMHgwM0UsIDB4MEVFLAorCTB4MDNFLCAweDBFRSwgMHgwMzAsIDB4MEJCLCAweDBDQSwgMHgwRTEsIDB4MDFGLCAweDA3NywKKwkweDAxRiwgMHgwNzcsIDB4MDFGLCAweDA3NywgMHgwMUYsIDB4MDc3LCAweDAyNywgMHgwNzAsCisJMHgwOEYsIDB4MEJCLCAweDA4MCwgMHgwMEUsIDB4MDExLCAweDBGNywgMHgwNzEsIDB4MEY3LAorCTB4MDdDLCAweDA2RiwgMHgwM0MsIDB4MEIzLCAweDAzNiwgMHgwMDIsIDB4MEZCLCAweDA4RCwKKwkweDBFNiwgMHgwNTUsIDB4MDcwLCAweDA3RiwgMHgwMkQsIDB4MDI0LCAweDA2OSwgMHgwNTUsCisJMHgwNEYsIDB4MDU4LCAweDBBOSwgMHgwMjMsIDB4MDFGLCAweDA1NCwgMHgwRjcsIDB4MDhBLAorCTB4MDk1LCAweDAyNSwgMHgwMkIsIDB4MDc1LCAweDAwQywgMHgwQ0MsIDB4MEFDLCAweDA1NiwKKwkweDA1MSwgMHgwQ0MsIDB4MDUxLCAweDBFNCwgMHgwNDUsIDB4MENFLCAweDBBMiwgMHgwMTIsCisJMHgwMzksIDB4MEMwLCAweDBBMCwgMHgwQUYsIDB4MDU2LCAweDA2QSwgMHgwNDksIDB4MDdGLAorCTB4MDAyLCAweDA4QywgMHgwMDksIDB4MEY4LCAweDAwQiwgMHgwRUIsIDB4MEFGLCAweDA1NiwKKwkweDA3NiwgMHgwNjcsIDB4MDUyLCAweDBCMiwgMHgwOEUsIDB4MDY5LCAweDBBNywgMHgwMTEsCisJMHgwNzMsIDB4MEE4LCAweDBCMSwgMHgwQkMsIDB4MENBLCAweDBBMCwgMHgwQTksIDB4MDM2LAorCTB4MDUwLCAweDAyQywgMHgwOTgsIDB4MEU3LCAweDAwQSwgMHgwRjUsIDB4MDY2LCAweDBBNCwKKwkweDA5NywgMHgwRTIsIDB4MDVBLCAweDAzMCwgMHgwMjcsIDB4MEJBLCAweDBGNywgMHgwODMsCisJMHgwNEUsIDB4MEE1LCAweDAzMywgMHgwMEEsIDB4MDY2LCAweDAxNSwgMHgwOEQsIDB4MEU2LAorCTB4MDU1LCAweDAzOSwgMHgwRDIsIDB4MEE3LCAweDBBQywgMHgwNTQsIDB4MDYwLCAweDAxNiwKKwkweDA3MCwgMHgwMUIsIDB4MDcyLCAweDA4RSwgMHgwNjIsIDB4MDhGLCAweDAyMiwgMHgwMkUsCisJMHgwNzUsIDB4MDE2LCAweDAwMiwgMHgwRkIsIDB4MDhELCAweDBFNiwgMHgwMEEsIDB4MDk1LAorCTB4MDNELCAweDA2MiwgMHgwQTMsIDB4MDAwLCAweDBCNywgMHgwMDEsIDB4MEI1LCAweDA1MywKKwkweDBERSwgMHgwMkEsIDB4MDU0LCAweDA5NCwgMHgwQUQsIDB4MEQ0LCAweDAzMywgMHgwMzIsCisJMHgwQjEsIDB4MDU5LCAweDA0NywgMHgwMzEsIDB4MDQ3LCAweDA5MSwgMHgwMTcsIDB4MDNBLAorCTB4MDg4LCAweDA0OCwgMHgwRTcsIDB4MDAyLCAweDBCMCwgMHgwMTcsIDB4MERDLCAweDA2NywKKwkweDA5RCwgMHgwNEIsIDB4MDhELCAweDBFNywgMHgwNTIsIDB4MEFBLCAweDA3QiwgMHgwRDQsCisJMHgwQUEsIDB4MDkyLCAweDBCRCwgMHgwRDYsIDB4MDk5LCAweDBCQywgMHgwNTYsIDB4MDAyLAorCTB4MEZCLCAweDA4QywgMHgwRjMsIDB4MDY2LCAweDA2NiwgMHgwQzYsIDB4MEYzLCAweDA2NiwKKwkweDA2NiwgMHgwNjIsIDB4MDk5LCAweDAyQSwgMHgwRjgsIDB4MDE4LCAweDA2OCwgMHgwNzAsCisJMHgwQjAsIDB4MDhBLCAweDAwRCwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDUyLAorCTB4MDMyLCAweDBFMSwgMHgwNDAsIDB4MDVDLCAweDAzOCwgMHgwMEIsIDB4MEVBLCAweDA5QiwKKwkweDA4NywgMHgwMDEsIDB4MDdELCAweDBDMCwgMHgwNUYsIDB4MDcwLCAweDAxNywgMHgwREMsCisJMHgwMDUsIDB4MEY1LCAweDBEQywgMHgwOUIsIDB4MDAxLCAweDA3RCwgMHgwNjEsIDB4MDRELAorCTB4MDgwLCAweDBCRSwgMHgwQTcsIDB4MDc5LCAweDA4MiwgMHgwQTIsIDB4MDFGLCAweDA1MCwKKwkweDAxNSwgMHgwMkEsIDB4MDhGLCAweDA4QiwgMHgwMUMsIDB4MEU1LCAweDBBNSwgMHgwMTMsCisJMHgwODQsIDB4MDU4LCAweDBFNywgMHgwMDIsIDB4MDkxLCAweDA1NCwgMHgwMDUsIDB4MDAyLAorCTB4MDRCLCAweDBCRCwgMHgwMjIsIDB4MDFBLCAweDA5NCwgMHgwN0YsIDB4MDlDLCAweDAxQSwKKwkweDBDMCwgMHgwNUYsIDB4MDQyLCAweDAxQSwgMHgwMjEsIDB4MEQxLCAweDA4MCwgMHgwNTksCisJMHgwQzAsIDB4MDZELCAweDAxQywgMHgwMkMsIDB4MDBBLCAweDA4MywgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTQsIDB4MDFDLCAweDBCOCwgMHgwNUMsIDB4MDZFLCAweDAxNywgMHgwOUMsCisJMHgwMkYsIDB4MDM4LCAweDA1RSwgMHgwNzAsIDB4MEU3LCAweDBCOCwgMHgwNUUsIDB4MDcwLAorCTB4MEJDLCAweDBFMSwgMHgwNzksIDB4MEMyLCAweDBGMywgMHgwODUsIDB4MEU3LCAweDAwQiwKKwkweDBDRSwgMHgwMTcsIDB4MDlDLCAweDAyOSwgMHgwOUMsIDB4MDI5LCAweDA5QywgMHgwMjksCisJMHgwOUMsIDB4MDIzLCAweDAwRiwgMHgwNTgsIDB4MDE0LCAweDBFRSwgMHgwMzUsIDB4MDc3LAorCTB4MDI2LCAweDAyMSwgMHgwOTMsIDB4MDA1LCAweDBDOSwgMHgwQjAsIDB4MDE3LCAweDBEMiwKKwkweDAxRCwgMHgwMTgsIDB4MDhBLCAweDAyMSwgMHgwOTMsIDB4MDA1LCAweDBDOSwgMHgwQjAsCisJMHgwMTcsIDB4MEQxLCAweDA4NywgMHgwQUMsIDB4MDBBLCAweDA3NCwgMHgwMEYsIDB4MEFFLAorCTB4MEY1LCAweDA1QSwgMHgwODIsIDB4MEEzLCAweDBFNCwgMHgwM0EsIDB4MDMxLCAweDAxNCwKKwkweDBCQiwgMHgwRDcsIDB4MDU5LCAweDA5OSwgMHgwNzQsIDB4MEEyLCAweDAxOSwgMHgwMzAsCisJMHgwNUMsIDB4MDlCLCAweDAwMSwgMHgwN0QsIDB4MDE4LCAweDA3QSwgMHgwQzAsIDB4MEE3LAorCTB4MDQwLCAweDBGOCwgMHgwNDMsIDB4MEQ0LCAweDA2MywgMHgwODksIDB4MDI1LCAweDBEMCwKKwkweDAxMCwgMHgwRDYsIDB4MDFDLCAweDA2QSwgMHgwMTAsIDB4MEY1LCAweDA1NSwgMHgwODksCisJMHgwMjUsIDB4MEQxLCAweDA1MSwgMHgwNjYsIDB4MDFGLCAweDA1MSwgMHgwRjUsIDB4MDkxLAorCTB4MDQ5LCAweDAyRSwgMHgwODksIDB4MDE1LCAweDA5OCwgMHgwNkEsIDB4MEEzLCAweDBFMCwKKwkweDA4QSwgMHgwOTQsIDB4MDY1LCAweDA2NCwgMHgwMEUsIDB4MDEzLCAweDAxNywgMHgwMzgsCisJMHgwQTgsIDB4MDg2LCAweDA0QywgMHgwMTcsIDB4MDI2LCAweDBDMCwgMHgwNUYsIDB4MDQ2LAorCTB4MDFFLCAweDBCMCwgMHgwMjgsIDB4MDYzLCAweDAxRiwgMHgwMDgsIDB4MDdBLCAweDA4QywKKwkweDA3MSwgMHgwMjQsIDB4MEJBLCAweDAwMiwgMHgwMUEsIDB4MEQwLCAweDAwRCwgMHgwNDIsCisJMHgwMUUsIDB4MEFBLCAweDBCMSwgMHgwMjQsIDB4MEJBLCAweDAyQSwgMHgwMkQsIDB4MDMxLAorCTB4MEY1LCAweDAxRiwgMHgwNTgsIDB4MDc0LCAweDA5MiwgMHgwRTgsIDB4MDg3LCAweDA1QSwKKwkweDA2MywgMHgwNTIsIDB4MERFLCAweDBGNCwgMHgwNTEsIDB4MDY5LCAweDA0QSwgMHgwM0UsCisJMHgwMDksIDB4MDY5LCAweDA0NiwgMHgwNTAsIDB4MEYwLCAweDBFMSwgMHgwMzEsIDB4MDczLAorCTB4MDA1LCAweDA0NSwgMHgwQkQsIDB4MDU5LCAweDA4RCwgMHgwOEIsIDB4MDRBLCAweDA3QywKKwkweDBEMywgMHgwRUQsIDB4MDM4LCAweDBFOSwgMHgwRDMsIDB4MDRFLCAweDA3NCwgMHgwRUQsCisJMHgwNDQsIDB4MDMyLCAweDA2MCwgMHgwQjksIDB4MDM2LCAweDAwMiwgMHgwRkEsIDB4MDVCLAorCTB4MERFLCAweDA4QSwgMHgwMkQsIDB4MDI5LCAweDBEMCwgMHgwRTEsIDB4MDIxLCAweDBGNSwKKwkweDBBMywgMHgwOTIsIDB4MDIxLCAweDBGMiwgMHgwMTksIDB4MDMwLCAweDA1QywgMHgwOUIsCisJMHgwMDEsIDB4MDdELCAweDAyMSwgMHgwRjUsIDB4MEEwLCAweDBDNiwgMHgwMDEsIDB4MDY3LAorCTB4MDAxLCAweDBCNCwgMHgwNDUsIDB4MENFLCAweDBBNSwgMHgwMTIsIDB4MDM5LCAweDBENCwKKwkweDAxQywgMHgwMDUsIDB4MEY0LCAweDA0MCwgMHgwQTEsIDB4MEMyLCAweDBDMywgMHgwNTAsCisJMHgwNkEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLAorCTB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MDgxLCAweDBBRiwKKwkweDA4NiwgMHgwOUYsIDB4MDE5LCAweDAxQiwgMHgwRTcsIDB4MDgxLCAweDBGMywgMHgwNjUsCisJMHgwRjIsIDB4MDgwLCAweDBCRSwgMHgwNzAsIDB4MDE3LCAweDBERiwgMHgwREYsIDB4MDM4LAorCTB4MDBCLCAweDBFQiwgMHgwMEQsIDB4MEMzLCAweDA4MCwgMHgwQkUsIDB4MEE3LCAweDAwRiwKKwkweDA5NSwgMHgwNEYsIDB4MDVBLCAweDA5NCwgMHgwQzAsIDB4MDJDLCAweDBEOCwgMHgwQjEsCisJMHgwQTcsIDB4MENFLCAweDA1QSwgMHgwMTEsIDB4MDczLCAweDBBOCwgMHgwM0EsIDB4MEMyLAorCTB4MENDLCAweDBCNiwgMHgwMzAsIDB4MDE3LCAweDBEQywgMHgwNkYsIDB4MDM1LCAweDBBOSwKKwkweDA4MCwgMHgwNEQsIDB4MEE3LCAweDBDRSwgMHgwMkEsIDB4MDE4LCAweDA3OSwgMHgwQzUsCisJMHgwNDksIDB4MERFLCAweDA2MSwgMHgwQTgsIDB4MDIyLCAweDBFNywgMHgwNTAsIDB4MDMzLAorCTB4MEY5LCAweDA5OCwgMHgwNjQsIDB4MDA4LCAweDBCOSwgMHgwOTUsIDB4MDQyLCAweDBGQywKKwkweDBDQywgMHgwRDksIDB4MDk1LCAweDAzRCwgMHgwNjIsIDB4MEEyLCAweDA0OCwgMHgwRDQsCisJMHgwNDgsIDB4MEU3LCAweDAwMiwgMHgwODgsIDB4MEI5LCAweDBDMSwgMHgwQTAsIDB4MEUzLAorCTB4MDlELCAweDA0RSwgMHgwNjIsIDB4MEU2LCAweDBDQywgMHgwQzYsIDB4MDZCLCAweDBDRSwKKwkweDA4MywgMHgwMTAsIDB4MEM5LCAweDA4MiwgMHgwRTQsIDB4MERBLCAweDBDMiwgMHgwQzgsCisJMHgwMUUsIDB4MEMzLCAweDBCOSwgMHgwMzYsIDB4MDAyLCAweDBGQSwgMHgwQTksIDB4MEVCLAorCTB4MDRFLCAweDAzMCwgMHgwMzAsIDB4MEZBLCAweDAwRCwgMHgwRjAsIDB4MEE5LCAweDBFQiwKKwkweDA0MCwgMHgwQjksIDB4MDBGLCAweDBBQSwgMHgwN0EsIDB4MEQyLCAweDBDMiwgMHgwQzgsCisJMHgwRkEsIDB4MEE3LCAweDBBRCwgMHgwNDEsIDB4MDBBLCAweDA0NywgMHgwRDUsIDB4MDNELAorCTB4MDY4LCAweDBBQywgMHgwRjEsIDB4MEY1LCAweDA0RiwgMHgwNUEsIDB4MDk3LCAweDA1NCwKKwkweDA3RCwgMHgwNEYsIDB4MEE4LCAweDBBQSwgMHgwNTUsIDB4MDFGLCAweDAxMSwgMHgwNzMsCisJMHgwNUEsIDB4MEIwLCAweDAxNywgMHgwREUsIDB4MDVELCAweDA1OSwgMHgwQTksIDB4MDI1LAorCTB4MEQwLCAweDA1NSwgMHgwMkEsIDB4MDQ2LCAweDBCQywgMHgwQjgsIDB4MDIyLCAweDBBRSwKKwkweDA0NSwgMHgwMjksIDB4MDNFLCAweDAxNCwgMHgwRkEsIDB4MEUxLCAweDA5OSwgMHgwOTQsCisJMHgwQ0EsIDB4MDRBLCAweDBCRSwgMHgwM0QsIDB4MEQ2LCAweDA5OSwgMHgwOTIsIDB4MDVELAorCTB4MDE1LCAweDAxNywgMHgwQzgsIDB4MEQ3LCAweDBEQywgMHgwMTUsIDB4MDE3LCAweDA4QSwKKwkweDA0MCwgMHgwMUYsIDB4MDBBLCAweDA5RSwgMHgwQUMsIDB4MEM5LCAweDA2NSwgMHgwNDksCisJMHgwNUMsIDB4MDFELCAweDAxMCwgMHgwNjgsIDB4MDRBLCAweDAzRSwgMHgwNUIsIDB4MERFLAorCTB4MDgzLCAweDAxNiwgMHgwOTUsIDB4MDgwLCAweDBCRSwgMHgwOTEsIDB4MDc0LCAweDA1OCwKKwkweDBBNCwgMHgwMDAsIDB4MDdDLCAweDAzOCwgMHgwRTcsIDB4MDU2LCAweDAzMCwgMHgwMTcsCisJMHgwREYsIDB4MDc1LCAweDBBNiwgMHgwNjQsIDB4MDk3LCAweDA0NSwgMHgwMjAsIDB4MDlELAorCTB4MDAzLCAweDA1RiwgMHgwNzAsIDB4MDU0LCAweDA1RSwgMHgwMjksIDB4MDFELCAweDBGMCwKKwkweDBBOSwgMHgwRUEsIDB4MENDLCAweDA4NiwgMHgwNTQsIDB4MDk1LCAweDBDMSwgMHgwRDEsCisJMHgwMDYsIDB4MDgzLCAweDAwRiwgMHgwQUEsIDB4MDdCLCAweDBEMCwgMHgwNjUsIDB4MDQ5LAorCTB4MDQ1LCAweDBCRCwgMHgwRTksIDB4MDYyLCAweDBEMiwgMHgwOTEsIDB4MERGLCAweDAwNCwKKwkweDA1RCwgMHgwMTYsIDB4MDI5LCAweDAxQywgMHgwN0QsIDB4MDRGLCAweDBBQywgMHgwMUEsCisJMHgwNDcsIDB4MDFBLCAweDBBOSwgMHgwRjUsIDB4MDY3LCAweDA2NiwgMHgwNTMsIDB4MDI4LAorCTB4MEI3LCAweDBCRCwgMHgwMkMsIDB4MDVBLCAweDA1MiwgMHgwM0IsIDB4MEUzLCAweDBERCwKKwkweDA1OSwgMHgwQTksIDB4MDI1LCAweDBEMSwgMHgwQTgsIDB4MEFDLCAweDAwOCwgMHgwNkIsCisJMHgwRUUsIDB4MDA4LCAweDBBQiwgMHgwQzUsIDB4MDIwLCAweDAyRiwgMHgwODUsIDB4MDRGLAorCTB4MDU2LCAweDA2NiwgMHgwNzUsIDB4MDQ5LCAweDA1QywgMHgwMUMsIDB4MDE4LCAweDAxRCwKKwkweDA4MSwgMHgwQzIsIDB4MDY0LCAweDAwNSwgMHgwRjAsIDB4MDgwLCAweDBCRSwgMHgwMzUsCisJMHgwNUMsIDB4MEQwLCAweDAxNywgMHgwQzIsIDB4MDU1LCAweDBGMCwgMHgwOTUsIDB4MDdDLAorCTB4MDI1LCAweDA1RiwgMHgwMDgsIDB4MDBCLCAweDBFMSwgMHgwMDEsIDB4MDdDLCAweDA3QiwKKwkweDBBQiwgMHgwMzUsIDB4MDI0LCAweDBCQSwgMHgwMTAsIDB4MDU1LCAweDA5MywgMHgwMUEsCisJMHgwRkIsIDB4MDgyLCAweDAyQSwgMHgwRjEsIDB4MDQ4LCAweDBENywgMHgwQzIsIDB4MEE3LAorCTB4MEFCLCAweDAzMSwgMHgwQjIsIDB4MEE0LCAweDBBQywgMHgwNjMsIDB4MDlELCAweDA0QSwKKwkweDA4RCwgMHgwN0MsIDB4MDdCLCAweDBBQiwgMHgwMzUsIDB4MDI0LCAweDBCQSwgMHgwMTAsCisJMHgwNTQsIDB4MDMwLCAweDA4RCwgMHgwN0QsIDB4MEMxLCAweDAxNSwgMHgwNzgsIDB4MEFDLAorCTB4MDZGLCAweDA1QSwgMHgwOTQsIDB4MDYwLCAweDAxQSwgMHgwRTMsIDB4MDc5LCAweDBENCwKKwkweDBBQSwgMHgwNEYsIDB4MDg1LCAweDA0RiwgMHgwNTYsIDB4MDY2LCAweDBENSwgMHgwNDksCisJMHgwNTgsIDB4MEM3LCAweDAzQSwgMHgwOTUsIDB4MDQ5LCAweDBGMCwgMHgwNDUsIDB4MEQxLAorCTB4MDYyLCAweDA5NCwgMHgwODYsIDB4MEJDLCAweDAxRCwgMHgwMTMsIDB4MEQyLCAweDA5MCwKKwkweDBGRiwgMHgwQ0YsIDB4MDdBLCAweDA4MywgMHgwRjIsIDB4MDUwLCAweDAzMSwgMHgwREUsCisJMHgwMDAsIDB4MDYwLCAweDA2MCwgMHgwQTEsIDB4MDE3LCAweDAzNSwgMHgwQTgsIDB4MDVGLAorCTB4MDlCLCAweDAxQiwgMHgwMzcsIDB4MDA3LCAweDA0NCwgMHgwMUEsIDB4MDMwLCAweDAwQiwKKwkweDAzOCwgMHgwMEQsIDB4MEJDLCAweDAxQywgMHgwRTAsIDB4MEQwLCAweDA0NywgMHgwQ0UsCisJMHgwQTAsIDB4MEFBLCAweDA3QSwgMHgwQTEsIDB4MDk4LCAweDA2QSwgMHgwOTIsIDB4MDk1LAorCTB4MDNELCAweDA2OCwgMHgwMzEsIDB4MDgwLCAweDA1QiwgMHgwODAsIDB4MERBLCAweDBBOSwKKwkweDBFRiwgMHgwNDEsIDB4MDk1LCAweDAyNSwgMHgwMTYsIDB4MEY3LCAweDBBNSwgMHgwOEIsCisJMHgwNEEsIDB4MEM2LCAweDA3OSwgMHgwQjMsIDB4MDMzLCAweDA2MCwgMHgwMkYsIDB4MEFBLAorCTB4MDlFLCAweDBCMSwgMHgwNTEsIDB4MDgwLCAweDA1OSwgMHgwOUUsIDB4MENBLCAweDBBNywKKwkweDBBQywgMHgwMEEsIDB4MDMwLCAweDAwQiwgMHgwNjcsIDB4MEIyLCAweDBBRCwgMHgwRDUsCisJMHgwREEsIDB4MDkyLCAweDA1RCwgMHgwMTcsIDB4MEEzLCAweDAwMCwgMHgwQjMsIDB4MDJELAorCTB4MDk1LCAweDA2RSwgMHgwMDgsIDB4MEE5LCAweDA1OCwgMHgwQTEsIDB4MDE3LCAweDAzQSwKKwkweDA4QiwgMHgwMDEsIDB4MDdELCAweDA1NCwgMHgwRjcsIDB4MDhFLCAweDA5NSwgMHgwMjUsCisJMHgwMDgsIDB4MDFDLCAweDBFMCwgMHgwNTYsIDB4MDAyLCAweDBGQiwgMHgwQzEsIDB4MEQxLAorCTB4MDE1LCAweDAxOCwgMHgwMDUsIDB4MDkyLCAweDA2QiwgMHgwM0MsIDB4MDFELCAweDAxMiwKKwkweDAyOCwgMHgwQzAsIDB4MDJDLCAweDBBNSwgMHgwNkMsIDB4MDExLCAweDA3MCwgMHgwMTcsCisJMHgwQjIsIDB4MDM4LCAweDA0RCwgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsIDB4MEI0LAorCTB4MEVDLCAweDA0QSwgMHgwRUQsIDB4MEIzLCAweDA5RSwgMHgwMDIsIDB4MEZCLCAweDA4MCwKKwkweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBCMSwgMHgwMzksIDB4MDkzLCAweDAzRSwgMHgwNkQsCisJMHgwRTcsIDB4MDEwLCAweDA2MCwgMHgwOUYsIDB4MDMyLCAweDBBOSwgMHgwQTIsIDB4MDZDLAorCTB4MDA1LCAweDBGNCwgMHgwNDAsIDB4MEU2LCAweDAwQSwgMHgwOTUsIDB4MDNELCAweDA2QSwKKwkweDAyMywgMHgwMDAsIDB4MEIzLCAweDA4MCwgMHgwREEsIDB4MEE3LCAweDBENiwgMHgwMkEsCisJMHgwMDMsIDB4MDBELCAweDA3MCwgMHgwMTcsIDB4MEQyLCAweDAyRSwgMHgwNzYsIDB4MDI5LAorCTB4MDRGLCAweDBCQywgMHgwNTQsIDB4MEE2LCAweDA1MSwgMHgwNkYsIDB4MDdBLCAweDA1OCwKKwkweDBCNCwgMHgwQUMsIDB4MDA1LCAweDBGNCwgMHgwOEIsIDB4MEEyLCAweDBGNCwgMHgwMEUsCisJMHgwMzUsIDB4MDBELCAweDA0OSwgMHgwMkUsIDB4MEI0LCAweDBDQywgMHgwMTgsIDB4MEE1LAorCTB4MEM4LCAweDBGOCwgMHgwNEEsIDB4MDk3LCAweDAyMywgMHgwRTEsIDB4MDA1LCAweDAyRSwKKwkweDA0NywgMHgwQzIsIDB4MDhBLCAweDA1QywgMHgwOEYsIDB4MDg1LCAweDA2OSwgMHgwNzIsCisJMHgwM0UsIDB4MDFGLCAweDA0QSwgMHgwQzMsIDB4MDU1LCAweDAxRiwgMHgwNTYsIDB4MDQzLAorCTB4MDMyLCAweDA4QywgMHgwQTMsIDB4MDVFLCAweDA2MCwgMHgwQTgsIDB4MDQ1LCAweDBDRSwKKwkweDAwRCwgMHgwNjAsIDB4MDJGLCAweDBBMywgMHgwODQsIDB4MDlELCAweDBEOCwgMHgwRjAsCisJMHgwMTcsIDB4MEQyLCAweDAyRSwgMHgwMEUsIDB4MDFCLCAweDAyMywgMHgwODQsIDB4MEQ4LAorCTB4MDBCLCAweDBFQiwgMHgwODksIDB4MEYzLCAweDA4MCwgMHgwQkUsIDB4MEUwLCAweDAyRiwKKwkweDBCQiwgMHgwMzksIDB4MDg1LCAweDBERiwgMHgwMjIsIDB4MDAzLCAweDBFNywgMHgwMDEsCisJMHgwN0QsIDB4MEMwLCAweDA1RiwgMHgwNzAsIDB4MDE3LCAweDBEMSwgMHgwMTcsIDB4MDM4LAorCTB4MDE0LCAweDA1QiwgMHgwRDYsIDB4MEEyLCAweDA3NCwgMHgwMEQsIDB4MDRCLCAweDA3QSwKKwkweDBCMywgMHgwMzEsIDB4MDk2LCAweDA5NCwgMHgwNkIsIDB4MENDLCAweDAzNSwgMHgwMjMsCisJMHgwRDcsIDB4MDQ5LCAweDA0OCwgMHgwMTUsIDB4MDczLCAweDAyOSwgMHgwMEYsIDB4MDVELAorCTB4MDhBLCAweDBDMCwgMHgwNUYsIDB4MDRELCAweDA3OSwgMHgwODQsIDB4MDM1LCAweDA4MCwKKwkweDBCRSwgMHgwODgsIDB4MDFDLCAweDBDMywgMHgwNTIsIDB4MDlGLCAweDA1OSwgMHgwNjgsCisJMHgwQzAsIDB4MDJDLCAweDBFMCwgMHgwMzYsIDB4MEFBLCAweDA3QiwgMHgwQ0QsIDB4MDRBLAorCTB4MDkyLCAweDBCRSwgMHgwRjMsIDB4MDgxLCAweDA0QSwgMHgwN0QsIDB4MDVCLCAweDA1OSwKKwkweDA5NCwgMHgwQ0EsIDB4MDFDLCAweDAyNCwgMHgwRUUsIDB4MEM3LCAweDA4MCwgMHgwQkUsCisJMHgwODgsIDB4MDFDLCAweDBDMywgMHgwNTIsIDB4MDlGLCAweDA1OSwgMHgwNjgsIDB4MEMwLAorCTB4MDJDLCAweDBFMCwgMHgwMzYsIDB4MEFBLCAweDA3QiwgMHgwQ0QsIDB4MDRBLCAweDA5MiwKKwkweDBCRSwgMHgwRjMsIDB4MDgxLCAweDA0MywgMHgwODQsIDB4MDlDLCAweDA3QiwgMHgwMzgsCisJMHgwMEIsIDB4MEVCLCAweDBBRiwgMHgwNzAsIDB4MEQ0LCAweDBFQSwgMHgwNTMsIDB4MDAwLAorCTB4MDlCLCAweDA0RiwgMHgwOUMsIDB4MDU0LCAweDAzMCwgMHgwRjMsIDB4MDhBLCAweDA5NCwKKwkweDBGQSwgMHgwQjYsIDB4MEIzLCAweDAyOSwgMHgwOTQsIDB4MDIyLCAweDBFNiwgMHgwMUEsCisJMHgwODUsIDB4MEY5LCAweDBCMCwgMHgwNTksIDB4MDkzLCAweDBGOSwgMHgwRDIsIDB4MEM0LAorCTB4MDMyLCAweDA2MCwgMHgwQjksIDB4MDM2LCAweDBCMCwgMHgwQjMsIDB4MDkwLCAweDBEOSwKKwkweDA3NywgMHgwMjYsIDB4MDFDLCAweDAyNywgMHgwMjIsIDB4MEU4LCAweDA5NiwgMHgwQjQsCisJMHgwMjMsIDB4MEVBLCAweDA5RSwgMHgwQjUsIDB4MDExLCAweDA4MCwgMHgwNTksIDB4MDY1LAorCTB4MDg2LCAweDAyMCwgMHgwNzMsIDB4MDk2LCAweDA4RCwgMHgwNzksIDB4MEFELCAweDA1OCwKKwkweDAwQiwgMHgwRTksIDB4MDE3LCAweDA0NCwgMHgwOEEsIDB4MDRBLCAweDAwNywgMHgwRDcsCisJMHgwN0EsIDB4MDgyLCAweDBBMSwgMHgwOTAsIDB4MEZBLCAweDBFRiwgMHgwMDEsIDB4MDU0LAorCTB4MEJBLCAweDA1MCwgMHgwRDQsIDB4MDU5LCAweDAxRSwgMHgwMkMsIDB4MEU5LCAweDBGMywKKwkweDA4QSwgMHgwOTksIDB4MDg1LCAweDA2QiwgMHgwMEIsIDB4MDIzLCAweDAxNSwgMHgwOTcsCisJMHgwNzIsIDB4MDYxLCAweDAxNywgMHgwMzAsIDB4MEQ0LCAweDAyQywgMHgwNzMsIDB4MDg3LAorCTB4MDQ4LCAweDBBQSwgMHgwMDIsIDB4MDgxLCAweDAyNSwgMHgwREUsIDB4MDkxLCAweDAwRCwKKwkweDA0QSwgMHgwQzAsIDB4MDVGLCAweDA3RSwgMHgwRDIsIDB4MDgwLCAweDBBNSwgMHgwM0UsCisJMHgwQjIsIDB4MEQwLCAweDBDOCwgMHgwNkIsIDB4MDgwLCAweDBCRSwgMHgwODgsIDB4MDFDLAorCTB4MEVBLCAweDAwOSwgMHgwMTcsIDB4MDQ0LCAweDAxQSwgMHgwMzcsIDB4MDFBLCAweDA5MSwKKwkweDA3NCwgMHgwNTgsIDB4MEEzLCAweDA3MSwgMHgwQUYsIDB4MDA3LCAweDA0NCwgMHgwNTQsCisJMHgwNkUsIDB4MDM1LCAweDBFMCwgMHgwRTgsIDB4MEFBLCAweDA2NCwgMHgwMEYsIDB4MDkwLAorCTB4MEZBLCAweDBEMCwgMHgwNjMsIDB4MDAwLCAweDBCMywgMHgwODAsIDB4MERBLCAweDAyQywKKwkweDA3MywgMHgwODcsIDB4MDQ4LCAweDBBQSwgMHgwMDIsIDB4MDgxLCAweDAyNSwgMHgwREUsCisJMHgwOTEsIDB4MDBELCAweDA0QSwgMHgwQzAsIDB4MDVGLCAweDA0OCwgMHgwQkEsIDB4MDI3LAorCTB4MEEzLCAweDAwMCwgMHgwQjcsIDB4MDAxLCAweDBCNywgMHgwNEYsIDB4MDlDLCAweDBCNCwKKwkweDA2QiwgMHgwQ0MsIDB4MDM1LCAweDAxNiwgMHgwRjUsIDB4MDY2LCAweDA2MywgMHgwMkQsCisJMHgwMjksIDB4MDFFLCAweDBCQSwgMHgwNEEsIDB4MDQwLCAweDBBQiwgMHgwOTksIDB4MDQ4LAorCTB4MDdBLCAweDBFQywgMHgwNTAsIDB4MDhCLCAweDA5QywgMHgwMDgsIDB4MDIyLCAweDBGQywKKwkweDBGOSwgMHgwQjIsIDB4MDU1LCAweDAzRCwgMHgwNjIsIDB4MEE5LCAweDAyMywgMHgwNTEsCisJMHgwMjMsIDB4MDlDLCAweDAwQSwgMHgwM0MsIDB4MDczLCAweDAwRCwgMHgwNDQsIDB4MDVDLAorCTB4MEUxLCAweDA1MCwgMHgwNzEsIDB4MENFLCAweDBBMSwgMHgwMUYsIDB4MEU3LCAweDAxNSwKKwkweDA2QiwgMHgwMEIsIDB4MDI1LCAweDBFRCwgMHgwMEIsIDB4MDkzLCAweDA2MCwgMHgwMkYsCisJMHgwQUEsIDB4MDlFLCAweDBBQywgMHgwMzYsIDB4MDY1LCAweDA0OSwgMHgwNUYsIDB4MDdBLAorCTB4MDIwLCAweDA1MCwgMHgwMDgsIDB4MDdGLCAweDBFRiwgMHgwMzksIDB4MDE0LCAweDA0OSwKKwkweDAwMSwgMHgwMTEsIDB4MDgxLCAweDAwNCwgMHgwNjAsIDB4MDQwLCAweDBDQywgMHgwNTksCisJMHgwQzAsIDB4MEFELCAweDAyMywgMHgwRUIsIDB4MDQxLCAweDBCMCwgMHgwODEsIDB4MEYyLAorCTB4MDNBLCAweDA0MSwgMHgwQUEsIDB4MDUwLCAweDA0MywgMHgwRTQsIDB4MEQ0LCAweDA4NiwKKwkweDA1NCwgMHgwQTAsIDB4MDg3LCAweDBDMSwgMHgwNTIsIDB4MENBLCAweDA5MywgMHgwMDEsCisJMHgwMzIsIDB4MDU0LCAweDA5RCwgMHgwMjQsIDB4MDAyLCAweDAwMCwgMHgwMDAsIDB4MDUyLAorCTB4MEFGLCAweDAxNiwgMHgwNDYsIDB4MEE3LCAweDA5MSwgMHgwNjcsIDB4MDA4LCAweDBCNCwKKwkweDAwNCwgMHgwNTEsIDB4MEYxLCAweDA2NSwgMHgwMTksIDB4MEI0LCAweDA2RSwgMHgwMkQsCisJMHgwQzAsIDB4MEFELCAweDA0OSwgMHgwMDAsIDB4MDkyLCAweDA1NywgMHgwMUIsIDB4MDc0LAorCTB4MDQ1LCAweDA1RiwgMHgwMjMsIDB4MDUxLCAweDBCNywgMHgwNDQsIDB4MDBBLCAweDAxMCwKKwkweDAwNiwgMHgwQTMsIDB4MDZFLCAweDA4QiwgMHgwNkIsIDB4MDA4LCAweDAxRiwgMHgwMTksCisJMHgwRDEsIDB4MEU2LCAweDA4MCwgMHgwODIsIDB4MDgwLCAweDA1NCwgMHgwMDQsIDB4MDJBLAorCTB4MDQ1LCAweDA5MSwgMHgwQTksIDB4MEU0LCAweDA1OSwgMHgwQzIsIDB4MDJELCAweDAwMSwKKwkweDAxNCwgMHgwMDQsIDB4MDUwLCAweDBEMywgMHgwRkMsIDB4MDU1LCAweDA4NCwgMHgwNjEsCisJMHgwRDksIDB4MDgwLCAweDA1MSwgMHgwMkYsIDB4MEUyLCAweDAxRiwgMHgwNDYsIDB4MDVGLAorCTB4MDQwLCAweDBFMCwgMHgwMjAsIDB4MDE1LCAweDA0QSwgMHgwQkMsIDB4MDU5LCAweDAxQSwKKwkweDA5RSwgMHgwNDUsIDB4MDlDLCAweDAyMiwgMHgwRDAsIDB4MDExLCAweDA0OCwgMHgwQ0IsCisJMHgwRTgsIDB4MDE0LCAweDAwOCwgMHgwMDEsIDB4MDU0LCAweDAxNSwgMHgwRTIsIDB4MEM4LAorCTB4MEQ0LCAweDBGMiwgMHgwMkMsIDB4MEUxLCAweDAxNiwgMHgwODAsIDB4MDhBLCAweDA0NiwKKwkweDA1RiwgMHgwNTIsIDB4MDdDLCAweDBEOSwgMHgwQTgsIDB4MEY4LCAweDA4OCwgMHgwRDAsCisJMHgwNUEsIDB4MDNDLCAweDBEMiwgMHgwNUMsIDB4MDVCLCAweDA4MCwgMHgwREEsIDB4MEE3LAorCTB4MEQ2LCAweDA1QSwgMHgwMDgsIDB4MDg2LCAweDBBNCwgMHgwNUQsIDB4MDE3LCAweDBBMCwKKwkweDBDMywgMHgwNTIsIDB4MDJFLCAweDA4OCwgMHgwQTgsIDB4MDIyLCAweDAxRiwgMHgwNTMsCisJMHgwRUEsIDB4MERBLCAweDBDQywgMHgwQTYsIDB4MDUwLCAweDBFMSwgMHgwMjcsIDB4MDc2LAorCTB4MDNDLCAweDAwNSwgMHgwRjUsIDB4MDRGLCAweDBBQiwgMHgwNkIsIDB4MDMyLCAweDA5OSwKKwkweDA0MywgMHgwODQsIDB4MDlDLCAweDA3QiwgMHgwMzgsIDB4MDBCLCAweDBFOSwgMHgwMjcsCisJMHgwQUMsIDB4MEQ0LCAweDA5MiwgMHgwRTAsIDB4MDBFLCAweDBEQSwgMHgwMzgsIDB4MDRELAorCTB4MDgwLCAweDBCRSwgMHgwRTYsIDB4MDdELCAweDA1MCwgMHgwQkEsIDB4MDUxLCAweDBBRSwKKwkweDA2NiwgMHgwRUYsIDB4MEJDLCAweDBEQywgMHgwN0IsIDB4MDg3LCAweDAxRSwgMHgwMDIsCisJMHgwRkEsIDB4MDkzLCAweDBFNiwgMHgwQ0QsIDB4MDQ3LCAweDBDNCwgMHgwNDMsIDB4MENELAorCTB4MDBGLCAweDAzNCwgMHgwOUQsIDB4MEEzLCAweDAwMCwgMHgwQjAsIDB4MDU1LCAweDAwMSwKKwkweDBBRSwgMHgwMDMsIDB4MDg0LCAweDAwNCwgMHgwQ0UsIDB4MDAxLCAweDBEMCwgMHgwRTEsCisJMHgwNzAsIDB4MDAyLCAweDA4MCwgMHgwMEUsIDB4MDg5LCAweDBFOSwgMHgwMjIsIDB4MDFGLAorCTB4MEUwLCAweDBFOCwgMHgwOTYsIDB4MEIwLCAweDAxMSwgMHgwRjQsIDB4MEMyLCAweDBDRSwKKwkweDAwMywgMHgwNkEsIDB4MDQ0LCAweDAyRCwgMHgwQzAsIDB4MDZELCAweDA0OCwgMHgwMDUsCisJMHgwQjgsIDB4MDBELCAweDBBMywgMHgwMDAsIDB4MEI3LCAweDA3NiwgMHgwRDUsIDB4MERFLAorCTB4MEIxLCAweDA1MCwgMHgwREMsIDB4MDdELCAweDA3NywgMHgwQkMsIDB4MDU0LCAweDBCQSwKKwkweDA1MiwgMHgwN0YsIDB4MDU4LCAweDAxNCwgMHgwMzQsIDB4MDBGLCAweDA5QSwgMHgwRjMsCisJMHgwODEsIDB4MDU4LCAweDAwQiwgMHgwRUEsIDB4MEVGLCAweDA1OCwgMHgwMTQsIDB4MDYwLAorCTB4MDE2LCAweDBBNSwgMHgwNkMsIDB4MDJFLCAweDBGNywgMHgwODEsIDB4MDRCLCAweDBBNSwKKwkweDA2RiwgMHgwN0QsIDB4MDVELCAweDBFRSwgMHgwQjUsIDB4MDJFLCAweDA5NSwgMHgwODAsCisJMHgwQkUsIDB4MEYwLCAweDA3MywgMHgwQkQsIDB4MDA0LCAweDA3QywgMHgwRUEsIDB4MEZFLAorCTB4MEVCLCAweDA0QywgMHgwREUsIDB4MDI5LCAweDA1MywgMHgwREQsIDB4MDZBLCAweDA1NCwKKwkweDA5NCwgMHgwQTksIDB4MEVBLCAweDAwQSwgMHgwOEMsIDB4MDAyLCAweDBENiwgMHgwNEMsCisJMHgwM0MsIDB4MDA1LCAweDBGNCwgMHgwMDAsIDB4MEVBLCAweDBDRCwgMHgwNTYsIDB4MEFGLAorCTB4MEMwLCAweDA0NywgMHgwRDIsIDB4MDlDLCAweDA4RCwgMHgwMjksIDB4MENBLCAweDBFMCwKKwkweDAyRiwgMHgwQUUsIDB4MEJELCAweDA3NSwgMHgwOTksIDB4MDlELCAweDA0QSwgMHgwRjksCisJMHgwRUYsIDB4MDUxLCAweDA3QywgMHgwOTQsIDB4MDBDLCAweDA3NywgMHgwODAsIDB4MDE4LAorCTB4MDE4LCAweDAyOSwgMHgwMkEsIDB4MEY4LCAweDBFMCwgMHgwRTgsIDB4MEFBLCAweDAzMCwKKwkweDAwQiwgMHgwMkEsIDB4MDk4LCAweDA3QywgMHgwMUQsIDB4MDExLCAweDA1MSwgMHgwODAsCisJMHgwNTksIDB4MDU0LCAweDBDMywgMHgwNTEsIDB4MEY1LCAweDAxQiwgMHgwMzMsIDB4MDI0LAorCTB4MEJCLCAweDA4MiwgMHgwQTUsIDB4MDE5LCAweDA1QywgMHgwMUQsIDB4MDEwLCAweDAyOCwKKwkweDBDMCwgMHgwMkMsIDB4MDlBLCAweDBDNywgMHgwQzEsIDB4MEQxLCAweDAyMiwgMHgwOEMsCisJMHgwMDIsIDB4MEM5LCAweDA5NCwgMHgwNjQsIDB4MDVDLCAweDAwQywgMHgwRDYsIDB4MDhFLAorCTB4MDEzLCAweDA2MCwgMHgwMkYsIDB4MEI4LCAweDAwQiwgMHgwRUEsIDB4MDMwLCAweDBFMywKKwkweDBDMCwgMHgwNUYsIDB4MDQ4LCAweDBEQywgMHgwNzgsIDB4MDBCLCAweDBFOCwgMHgwMDAsCisJMHgwRTMsIDB4MEMwLCAweDA1RiwgMHgwNkMsIDB4MDM4LCAweDBENSwgMHgwMkUsIDB4MDM1LAorCTB4MDRGLCAweDA1QSwgMHgwOEEsIDB4MDYxLCAweDBBQSwgMHgwOUYsIDB4MDU2LCAweDAxQiwKKwkweDAzMiwgMHgwOTksIDB4MDQ2LCAweDA0MiwgMHgwQzgsIDB4MDAxLCAweDAwQywgMHgwNDUsCisJMHgwQ0UsIDB4MEE1LCAweDAxNywgMHgwRTYsIDB4MEM2LCAweDBDRSwgMHgwQTksIDB4MEVCLAorCTB4MDE1LCAweDAxNiwgMHgwNDYsIDB4MEEyLCAweDA0NywgMHgwMzgsIDB4MDE0LCAweDA0MywKKwkweDAyNiwgMHgwMjIsIDB4MEU3LCAweDAzRCwgMHgwNjAsIDB4MDJGLCAweDBBQSwgMHgwOUUsCisJMHgwQjUsIDB4MDEyLCAweDBFMCwgMHgwN0YsIDB4MDAxLCAweDA3RCwgMHgwRTMsIDB4MEU3LAorCTB4MDAyLCAweDA5MywgMHgwRjksIDB4MDk1LCAweDA0NCwgMHgwNUMsIDB4MEU1LCAweDBBMCwKKwkweDBFMywgMHgwOUQsIDB4MDRBLCAweDA3RiwgMHgwOUMsIDB4MDU0LCAweDBBOSwgMHgwRUIsCisJMHgwNTEsIDB4MDA1LCAweDA0NiwgMHgwQjksIDB4MEZDLCAweDBDMCwgMHgwMUIsIDB4MDIyLAorCTB4MDJFLCAweDA2NCwgMHgwNTQsIDB4MDJGLCAweDBDRCwgMHgwNDYsIDB4MENDLCAweDBBNywKKwkweDBENSwgMHgwODYsIDB4MENDLCAweDBBNiwgMHgwNTAsIDB4MDU1LCAweDBDNiwgMHgwNDUsCisJMHgwQ0UsIDB4MDVBLCAweDAwRSwgMHgwMzksIDB4MEQ0LCAweDBBNywgMHgwRjksIDB4MEM1LAorCTB4MDRBLCAweDA5RSwgMHgwQjUsIDB4MDExLCAweDA4MCwgMHgwNTksIDB4MEMwLCAweDA2RCwKKwkweDBDRiwgMHgwRTYsIDB4MDAwLCAweDBEOSwgMHgwMTEsIDB4MDczLCAweDAyMiwgMHgwQTEsCisJMHgwN0UsIDB4MDZBLCAweDAzNiwgMHgwNjUsIDB4MDNFLCAweDBBQywgMHgwMzYsIDB4MDY1LAorCTB4MDMyLCAweDBCMCwgMHgwMTcsIDB4MERELCAweDAzRSwgMHgwNzIsIDB4MEQyLCAweDA3OSwKKwkweDAzMSwgMHgwMEMsIDB4MDk4LCAweDAyRSwgMHgwNEMsIDB4MDIwLCAweDA3MywgMHgwMkEsCisJMHgwOEYsIDB4MEYzLCAweDA4QSwgMHgwQUQsIDB4MEU3LCAweDA0MSwgMHgwODIsIDB4MDdDLAorCTB4MENBLCAweDBBNiwgMHgwODksIDB4MEI1LCAweDA4NSwgMHgwOUYsIDB4MEIwLCAweDBGMCwKKwkweDAxNywgMHgwRDUsIDB4MDFGLCAweDA1NCwgMHgwNTQsIDB4MDI1LCAweDAxQSwgMHgwQTgsCisJMHgwRkYsIDB4MDJBLCAweDA5NCwgMHgwNjUsIDB4MDExLCAweDBENywgMHgwNDksIDB4MDQ0LAorCTB4MEQ1LCAweDBDQywgMHgwQTAsIDB4MDU1LCAweDBEOCwgMHgwQUUsIDB4MDBFLCAweDA4OCwKKwkweDAxNCwgMHgwNjAsIDB4MDE2LCAweDA0RCwgMHgwNjMsIDB4MDIyLCAweDBFMCwgMHgwNzIsCisJMHgwODYsIDB4MDM4LCAweDA0RCwgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsIDB4MEI4LAorCTB4MDBCLCAweDBFRSwgMHgwMDIsIDB4MEZCLCAweDA4MSwgMHgwMzgsIDB4MEYwLCAweDAxNywKKwkweDBENywgMHgwRDcsIDB4MDFFLCAweDAwMiwgMHgwRkEsIDB4MEZBLCAweDBFMywgMHgwQzAsCisJMHgwNUYsIDB4MDRDLCAweDA4NSwgMHgwOTAsIDB4MDAyLCAweDAxOCwgMHgwQzgsIDB4MDVCLAorCTB4MDgwLCAweDBEQSwgMHgwMzAsIDB4MDBCLCAweDA3MCwgMHgwMUIsIDB4MDRDLCAweDAyMiwKKwkweDBEMywgMHgwNEMsIDB4MDMzLCAweDAwMywgMHgwOEMsIDB4MDJFLCAweDA0QywgMHgwNDMsCisJMHgwMjYsIDB4MEQwLCAweDBGNSwgMHgwNjMsIDB4MDY2LCAweDBEMCwgMHgwOTUsIDB4MEE3LAorCTB4MENFLCAweDA0NSwgMHgwMzMsIDB4MDBBLCAweDBENiwgMHgwMTYsIDB4MDQyLCAweDAzOCwKKwkweDA2RSwgMHgwRTQsIDB4MENFLCAweDBCRCwgMHgwNTksIDB4MDJDLCAweDBEMiwgMHgwQUIsCisJMHgwQkEsIDB4MDk0LCAweDA5RCwgMHgwRTYsIDB4MDFBLCAweDBCMCwgMHgwMTcsIDB4MEQ1LAorCTB4MDRGLCAweDA1QSwgMHgwOEIsIDB4MDA5LCAweDAxQSwgMHgwODgsIDB4MEI5LCAweDBDNSwKKwkweDA0MiwgMHgwNDcsIDB4MDMwLCAweDBENCwgMHgwMzIsIDB4MDE2LCAweDA3MiwgMHgwODgsCisJMHgwNjUsIDB4MEJELCAweDA1OSwgMHgwOTksIDB4MDI1LCAweDBBNSwgMHgwNjAsIDB4MDJGLAorCTB4MEI4LCAweDA2MCwgMHgwRjMsIDB4MDA4LCAweDBCNywgMHgwNEEsIDB4MDFBLCAweDA4RiwKKwkweDBBQiwgMHgwMEQsIDB4MDk5LCAweDA0NiwgMHgwNTEsIDB4MEFGLCAweDAzOCwgMHgwQTgsCisJMHgwOEUsIDB4MDkwLCAweDA2NSwgMHgwMTMsIDB4MDUyLCAweDAxOCwgMHgwQTAsIDB4MDU0LAorCTB4MEIxLCAweDA0MiwgMHgwMkUsIDB4MDYxLCAweDBBOCwgMHgwNDgsIDB4MEU3LCAweDAyRCwKKwkweDAxNiwgMHgwRjcsIDB4MEE4LCAweDAwNSwgMHgwQTUsIDB4MDYwLCAweDAyRiwgMHgwQTQsCisJMHgwNzUsIDB4MEQyLCAweDA1MSwgMHgwMzUsIDB4MDczLCAweDAyOCwgMHgwMTUsIDB4MDc2LAorCTB4MDJCLCAweDA4MywgMHgwQTIsIDB4MDA1LCAweDAxOCwgMHgwMDUsIDB4MDkzLCAweDA1OCwKKwkweDBDOCwgMHgwQjgsIDB4MDA2LCAweDAyOCwgMHgwNjMsIDB4MDg0LCAweDBEOCwgMHgwMEIsCisJMHgwRUUsIDB4MDAyLCAweDBGQiwgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsIDB4MEEwLAorCTB4MDQzLCAweDBBNywgMHgwMDEsIDB4MDdELCAweDA0QywgMHgwRTMsIDB4MEMwLCAweDA1RiwKKwkweDA3MCwgMHgwMTcsIDB4MERDLCAweDAwNSwgMHgwRjQsIDB4MDY0LCAweDAyRCwgMHgwQzAsCisJMHgwNkQsIDB4MDE4LCAweDAwNSwgMHgwQjgsIDB4MDBELCAweDBBNSwgMHgwQkQsIDB4MDZBLAorCTB4MDIzLCAweDA4NiwgMHgwQUEsIDB4MDlFLCAweDBCNSwgMHgwMTEsIDB4MEE0LCAweDA2QSwKKwkweDBBMywgMHgwRUEsIDB4MDhBLCAweDA4RCwgMHgwMjMsIDB4MEUxLCAweDAxNywgMHgwMzgsCisJMHgwMzQsIDB4MDY5LCAweDA3MSwgMHgwOTgsIDB4MDQ1LCAweDBBNiwgMHgwOTgsIDB4MDZBLAorCTB4MDNFLCAweDBBQywgMHgwMzYsIDB4MDY1LCAweDAxOSwgMHgwNDYsIDB4MEJDLCAweDBFMiwKKwkweDBBMiwgMHgwM0EsIDB4MDQxLCAweDA5NCwgMHgwNEQsIDB4MDQ4LCAweDA2MiwgMHgwODEsCisJMHgwNTIsIDB4MEM1LCAweDAxNiwgMHgwRjcsIDB4MEE4LCAweDA4QiwgMHgwNEEsIDB4MDU0LAorCTB4MEY1LCAweDBBOCwgMHgwOEMsIDB4MDAyLCAweDBEQywgMHgwMDYsIDB4MEQxLCAweDAwMywKKwkweDA5QywgMHgwQjQsIDB4MEE5LCAweDBFRSwgMHgwMEEsIDB4MDk1LCAweDAyNSwgMHgwMkEsCisJMHgwN0EsIDB4MEFELCAweDA0NiwgMHgwMDEsIDB4MDY3LCAweDAwMSwgMHgwQjUsIDB4MEQ3LAorCTB4MEFDLCAweDAwQSwgMHgwMzAsIDB4MDBCLCAweDA2QywgMHgwNDksIDB4MDM1LCAweDBFNiwKKwkweDBCNSwgMHgwNjcsIDB4MEYzLCAweDAwMCwgMHgwNkMsIDB4MDg4LCAweDBCOSwgMHgwOTEsCisJMHgwNTAsIDB4MEJGLCAweDAzMSwgMHgwMUIsIDB4MDMyLCAweDBBNywgMHgwQjgsIDB4MDY4LAorCTB4MDk1LCAweDAyNSwgMHgwN0IsIDB4MEFELCAweDAzMywgMHgwNzgsIDB4MEE3LCAweDBDRCwKKwkweDAzRSwgMHgwRDMsIDB4MDhFLCAweDA5RCwgMHgwMzQsIDB4MEU3LCAweDA0RSwgMHgwRDQsCisJMHgwMjIsIDB4MEU3LCAweDAwNiwgMHgwODQsIDB4MDhFLCAweDA2MCwgMHgwQTgsIDB4MEZGLAorCTB4MDM4LCAweDBBQiwgMHgwODMsIDB4MDlDLCAweDAyQSwgMHgwMDgsIDB4MEY5LCAweDBENCwKKwkweDAyMCwgMHgwNjMsIDB4MEJDLCAweDAxQSwgMHgwMDYsIDB4MDBBLCAweDBDMCwgMHgwNUYsCisJMHgwNDYsIDB4MDQyLCAweDBEQywgMHgwMDYsIDB4MEQxLCAweDA4MCwgMHgwNUIsIDB4MDgwLAorCTB4MERBLCAweDAyMiwgMHgwRTYsIDB4MDFBLCAweDA4NCwgMHgwOEUsIDB4MDcyLCAweDBEMSwKKwkweDA2RiwgMHgwNUEsIDB4MDgwLCAweDA4NywgMHgwMUEsIDB4MEFBLCAweDA3QSwgMHgwRDQsCisJMHgwNDgsIDB4MEM4LCAweDBENSwgMHgwNDcsIDB4MEQ1LCAweDAxNSwgMHgwMjMsIDB4MDIzLAorCTB4MEUxLCAweDAxNywgMHgwMzgsIDB4MDM0LCAweDA4QywgMHgwQkEsIDB4MDRCLCAweDA3QiwKKwkweDBENCwgMHgwMDIsIDB4MEQyLCAweDA4QywgMHgwMjIsIDB4MERDLCAweDAwNiwgMHgwRDUsCisJMHgwMUYsIDB4MDU2LCAweDAxQiwgMHgwMzIsIDB4MDhDLCAweDBBMywgMHgwNUUsIDB4MDcxLAorCTB4MDUxLCAweDAxRCwgMHgwMjAsIDB4MENBLCAweDAyNiwgMHgwQTQsIDB4MDMxLCAweDA0MCwKKwkweDBBOSwgMHgwNjIsIDB4MEIwLCAweDAxNywgMHgwREYsIDB4MDlFLCAweDBGNCwgMHgwQjcsCisJMHgwQzksIDB4MDQwLCAweDBDNywgMHgwNzgsIDB4MDAxLCAweDA4MSwgMHgwODIsIDB4MEI4LAorCTB4MDM4LCAweDAzOSwgMHgwNDksIDB4MDFDLCAweDAyNiwgMHgwQzAsIDB4MDVGLCAweDA3MCwKKwkweDAxNywgMHgwRDQsIDB4MEFCLCAweDBFMSwgMHgwMkEsIDB4MEY4LCAweDA0QSwgMHgwQkUsCisJMHgwMTIsIDB4MEFGLCAweDA4RiwgMHgwOTcsIDB4MDRGLCAweDBDQiwgMHgwQTcsIDB4MDAxLAorCTB4MDdELCAweDBEQSwgMHgwODAsIDB4MEFBLCAweDA5MSwgMHgwNjQsIDB4MDdGLCAweDA0QSwKKwkweDA4MSwgMHgwRDUsIDB4MDIyLCAweDBDOCwgMHgwRkUsIDB4MDgyLCAweDA4MCwgMHgwMjUsCisJMHgwNDgsIDB4MEIyLCAweDAzRSwgMHgwQkIsIDB4MERDLCAweDAzNSwgMHgwMkUsIDB4MDk0LAorCTB4MDA3LCAweDBFOCwgMHgwOEEsIDB4MDlDLCAweDAwMywgMHgwRTIsIDB4MDRCLCAweDBBNSwKKwkweDA3NywgMHgwQUIsIDB4MEIzLCAweDAzMiwgMHgwRTksIDB4MDRCLCAweDBCRCwgMHgwNTksCisJMHgwODYsIDB4MDg0LCAweDA5NywgMHgwN0EsIDB4MDA0LCAweDBCQSwgMHgwNTMsIDB4MEUxLAorCTB4MDMyLCAweDBFRiwgMHgwNTAsIDB4MEQ0LCAweDBFNiwgMHgwMzUsIDB4MDUzLCAweDBFQiwKKwkweDAwMiwgMHgwOUMsIDB4MEM3LCAweDBENywgMHgwN0EsIDB4MEIzLCAweDAzMCwgMHgwRDIsCisJMHgwNUQsIDB4MEVBLCAweDAwMiwgMHgwRTksIDB4MDQ0LCAweDA1RCwgMHgwMTYsIDB4MDI4LAorCTB4MEMwLCAweDAyQywgMHgwRTAsIDB4MDM2LCAweDA5MSwgMHgwNzQsIDB4MDQ1LCAweDA1OSwKKwkweDAxOCwgMHgwRDUsIDB4MDRGLCAweDBBQywgMHgwMEEsIDB4MEM0LCAweDAzNSwgMHgwMzAsCisJMHgwOEIsIDB4MDM4LCAweDA2OSwgMHgwMkIsIDB4MEJELCAweDA1OSwgMHgwOTgsIDB4MDY5LAorCTB4MDJFLCAweDBGNSwgMHgwMTIsIDB4MEU5LCAweDA1OCwgMHgwNjcsIDB4MDRBLCAweDBFRiwKKwkweDA1MCwgMHgwRDUsIDB4MDhFLCAweDAzRSwgMHgwMUMsIDB4MEE0LCAweDBCMCwgMHgwQ0UsCisJMHgwOTMsIDB4MDIxLCAweDA2RSwgMHgwMUEsIDB4MDQ4LCAweDAxRiwgMHgwQTIsIDB4MDJBLAorCTB4MEMzLCAweDAwRCwgMHgwNTcsIDB4MDdBLCAweDBCMywgMHgwMEQsIDB4MDA5LCAweDAyRSwKKwkweDBGNCwgMHgwNDMsIDB4MDVELCAweDAyOCwgMHgwOEIsIDB4MDgzLCAweDAyMCwgMHgwOTIsCisJMHgwMzgsIDB4MDRELCAweDA4MCwgMHgwQkUsIDB4MEUwLCAweDAyRiwgMHgwQUMsIDB4MDE3LAorCTB4MDQ5LCAweDBCMywgMHgwQTUsIDB4MDgyLCAweDBFOSwgMHgwM0UsIDB4MEU5LCAweDAzNiwKKwkweDA3NCwgMHgwRTAsIDB4MDJGLCAweDBBNiwgMHgwQ0UsIDB4MDlDLCAweDAwNSwgMHgwRjQsCisJMHgwQzIsIDB4MDJDLCAweDA4QywgMHgwNTIsIDB4MDU3LCAweDA3QSwgMHgwRDQsIDB4MDhELAorCTB4MDQ4LCAweDBGQSwgMHgwRUYsIDB4MDUwLCAweDBENSwgMHgwQUUsIDB4MDM1LCAweDA1MywKKwkweDBFQiwgMHgwMDIsIDB4MDg2LCAweDAyMSwgMHgwQUEsIDB4MEVGLCAweDA1NiwgMHgwNjYsCisJMHgwMUEsIDB4MDRCLCAweDBCRCwgMHgwNDQsIDB4MEJBLCAweDA1MCwgMHgwQzQsIDB4MEU5LAorCTB4MDUzLCAweDBFQiwgMHgwMDIsIDB4MDg2LCAweDA4MSwgMHgwRjUsIDB4MERFLCAweDBBMSwKKwkweDBBOCwgMHgwNjIsIDB4MDFGLCAweDA1RCwgMHgwRkUsIDB4MEEyLCAweDA1RCwgMHgwMjksCisJMHgwNzcsIDB4MEE4LCAweDA2QSwgMHgwNjEsIDB4MDhELCAweDA0MCwgMHgwRkQsIDB4MDExLAorCTB4MDUzLCAweDAwQywgMHgwNkEsIDB4MEE3LCAweDBENiwgMHgwMDUsIDB4MDMwLCAweDBDNywKKwkweDBENywgMHgwN0YsIDB4MEE5LCAweDA1NywgMHgwNEEsIDB4MDVELCAweDBFQiwgMHgwNDgsCisJMHgwMUIsIDB4MDBDLCAweDA3QywgMHgwOEIsIDB4MDlELCAweDA4QSwgMHgwNTMsIDB4MEVGLAorCTB4MDY2LCAweDA5NCwgMHgwQ0EsIDB4MDU0LCAweDBGNSwgMHgwQTAsIDB4MEM2LCAweDAwMSwKKwkweDA2RSwgMHgwMDMsIDB4MDZBLCAweDA5RiwgMHgwNTYsIDB4MDc2LCAweDA2NSwgMHgwMzIsCisJMHgwOEIsIDB4MDdCLCAweDBEMiwgMHgwQzUsIDB4MEE1LCAweDA2MCwgMHgwMkYsIDB4MEFBLAorCTB4MDdELCAweDA2NSwgMHgwQTMsIDB4MDAwLCAweDBCNywgMHgwMDEsIDB4MEI0LCAweDBDOCwKKwkweDA1QSwgMHgwMDcsIDB4MDhGLCAweDBFRCwgMHgwMDEsIDB4MEQ1LCAweDAyNywgMHgwOTEsCisJMHgwNjcsIDB4MDAxLCAweDBCNCwgMHgwOEIsIDB4MDlDLCAweDA1NCwgMHgwMUMsIDB4MDczLAorCTB4MEE4LCAweDA4NCwgMHgwNUMsIDB4MEMxLCAweDA1MCwgMHgwQkYsIDB4MDM2LCAweDA1NiwKKwkweDA2MCwgMHgwQUIsIDB4MDhDLCAweDA4QiwgMHgwOUMsIDB4MDU0LCAweDAxQywgMHgwNzMsCisJMHgwQTgsIDB4MDg0LCAweDA1QywgMHgwQzEsIDB4MDUwLCAweDBCRiwgMHgwMzYsIDB4MDU2LAorCTB4MDZDLCAweDAwNSwgMHgwRjUsIDB4MDUzLCAweDBENiwgMHgwQTIsIDB4MDMwLCAweDAwQiwKKwkweDAyOSwgMHgwNUIsIDB4MDE5LCAweDBGQywgMHgwRjYsIDB4MDk0LCAweDA0NSwgMHgwQ0YsCisJMHgwMTUsIDB4MDBCLCAweDBGMywgMHgwM0MsIDB4MEIzLCAweDAyQSwgMHgwN0EsIDB4MEM1LAorCTB4MDQ2LCAweDAwMSwgMHgwNjQsIDB4MDhBLCAweDAzMSwgMHgwMjMsIDB4MDlDLCAweDAwQSwKKwkweDA1RCwgMHgwRUEsIDB4MDM0LCAweDAzMywgMHgwMkUsIDB4MDk1LCAweDBDNywgMHgwQ0UsCisJMHgwMkEsIDB4MDRGLCAweDBFNiwgMHgwNTAsIDB4MDIwLCAweDBCOSwgMHgwMzEsIDB4MDBDLAorCTB4MDlCLCAweDBFRiwgMHgwMzksIDB4MDE0LCAweDA0NSwgMHgwQ0UsIDB4MDQ1LCAweDAwNywKKwkweDAxQywgMHgwRUEsIDB4MDQ2LCAweDA4NywgMHgwQUIsIDB4MDFCLCAweDAzNiwgMHgwODQsCisJMHgwQTcsIDB4MDVFLCAweDBBQywgMHgwOTYsIDB4MDY3LCAweDA1MiwgMHgwQjAsIDB4MDE3LAorCTB4MERDLCAweDBGRSwgMHgwN0IsIDB4MDRBLCAweDAyMiwgMHgwRTcsIDB4MDhBLCAweDA4NSwKKwkweDBGOSwgMHgwOUUsIDB4MDU5LCAweDA5NywgMHgwN0EsIDB4MDhELCAweDAwQywgMHgwQ0IsCisJMHgwQTUsIDB4MDI3LCAweDBGMywgMHgwQTAsIDB4MDQ0LCAweDAzMiwgMHgwNjAsIDB4MEI5LAorCTB4MDM3LCAweDBERSwgMHgwNzIsIDB4MDI4LCAweDA4QiwgMHgwOUMsIDB4MDhBLCAweDAwRSwKKwkweDAzOSwgMHgwRDQsIDB4MDhDLCAweDAwNSwgMHgwRjcsIDB4MEU3LCAweDBCOCwgMHgwMkEsCisJMHgwRjksIDB4MDI4LCAweDAxOCwgMHgwRUYsIDB4MDAwLCAweDAzMCwgMHgwMzAsIDB4MDU3LAorCTB4MDA3LCAweDA0NCwgMHgwMEEsIDB4MDUwLCAweDA4RiwgMHgwRjAsIDB4MDczLCAweDA5MSwKKwkweDA0MSwgMHgwMUYsIDB4MDNBLCAweDA5MCwgMHgwNDUsIDB4MEMwLCAweDBCQiwgMHgwMTgsCisJMHgwRTEsIDB4MDM2LCAweDAwMiwgMHgwRkIsIDB4MEZCLCAweDA5RSwgMHgwMDIsIDB4MEZBLAorCTB4MEVFLCAweDBFNywgMHgwRjUsIDB4MENGLCAweDAwMSwgMHgwN0QsIDB4MDEwLCAweDA1QywKKwkweDBGMCwgMHgwMTcsIDB4MEQxLCAweDAwNSwgMHgwQ0YsIDB4MDAxLCAweDA3RCwgMHgwNTMsCisJMHgwRUIsIDB4MDJELCAweDAxOCwgMHgwMDUsIDB4MEI4LCAweDAwRCwgMHgwQTYsIDB4MDQyLAorCTB4MERDLCAweDAwNiwgMHgwRDMsIDB4MDE3LCAweDAzNSwgMHgwQTgsIDB4MDhCLCAweDA5QywKKwkweDAwQSwgMHgwMEUsIDB4MDM5LCAweDBENCwgMHgwMEMsIDB4MEZFLCAweDA3QiwgMHgwNEEsCisJMHgwMjIsIDB4MEU2LCAweDA1NSwgMHgwMEIsIDB4MEYzLCAweDAzMSwgMHgwQjMsIDB4MDYwLAorCTB4MDJGLCAweDBCQywgMHgwN0MsIDB4MEUyLCAweDBBNCwgMHgwRkUsIDB4MDY1LCAweDA1MSwKKwkweDAxNywgMHgwMzgsIDB4MDE0LCAweDAxQywgMHgwNzMsIDB4MEE4LCAweDAxOSwgMHgwRkMsCisJMHgwRjYsIDB4MDk0LCAweDA0NSwgMHgwQ0MsIDB4MEFBLCAweDAxNywgMHgwRTYsIDB4MDYzLAorCTB4MDY2LCAweDAwQSwgMHgwQjgsIDB4MENDLCAweDA4NSwgMHgwQTEsIDB4MDU4LCAweDBGNiwKKwkweDBBMiwgMHgwMzUsIDB4MDQ4LCAweDA0OCwgMHgwN0YsIDB4MDRBLCAweDA4OSwgMHgwOTUsCisJMHgwMjEsIDB4MDIxLCAweDBGRCwgMHgwMDUsIDB4MDAyLCAweDA1NCwgMHgwOUUsIDB4MDQ1LAorCTB4MDkxLCAweDAwRSwgMHgwM0MsIDB4MDA1LCAweDBGNSwgMHgwMDcsIDB4MDQwLCAweDA1NSwKKwkweDA0OCwgMHgwNTIsIDB4MDNFLCAweDA4NiwgMHgwQTAsIDB4MDc1LCAweDA0OCwgMHgwNTIsCisJMHgwM0UsIDB4MEI1LCAweDAwMCwgMHgwNEEsIDB4MDlDLCAweDAwMCwgMHgwNkIsIDB4MEM3LAorCTB4MENFLCAweDA0NSwgMHgwMjcsIDB4MEYzLCAweDAyQSwgMHgwODQsIDB4MDM3LCAweDAzNSwKKwkweDBERSwgMHgwQTAsIDB4MEFCLCAweDAyMywgMHgwMUEsIDB4MEFFLCAweDBGNSwgMHgwODMsCisJMHgwNTksIDB4MDE4LCAweDBENywgMHgwNDMsIDB4MERFLCAweDAyQSwgMHgwRDAsIDB4MDk0LAorCTB4MEVCLCAweDBERSwgMHgwMDUsIDB4MDNBLCAweDA5NSwgMHgwOUYsIDB4MENDLCAweDBDMywKKwkweDAyMCwgMHgwNDUsIDB4MENDLCAweDBBQSwgMHgwMTcsIDB4MEU2LCAweDA2NiwgMHgwQ0MsCisJMHgwNDMsIDB4MDI2LCAweDA0RiwgMHgwRTcsIDB4MDQxLCAweDAyMiwgMHgwMkUsIDB4MDcwLAorCTB4MDY4LCAweDAzOCwgMHgwRTcsIDB4MDUzLCAweDBFMCwgMHgwMkYsIDB4MEFCLCAweDBCQywKKwkweDAxMiwgMHgwRDIsIDB4MEU5LCAweDA1OCwgMHgwMEIsIDB4MEVBLCAweDBBNywgMHgwQUQsCisJMHgwNDUsIDB4MEExLCAweDAxRiwgMHgwQzAsIDB4MDVGLCAweDA3OCwgMHgwMzksIDB4MEM4LAorCTB4MEEwLCAweDA4RiwgMHgwOUQsIDB4MDQ4LCAweDAxQywgMHgwMjQsIDB4MEVFLCAweDBDNywKKwkweDA4MCwgMHgwQkUsIDB4MEJBLCAweDBGNSwgMHgwNkQsIDB4MDY2LCAweDA0OSwgMHgwNzcsCisJMHgwMEQsIDB4MDRFLCAweDBBNSwgMHgwMzAsIDB4MDA5LCAweDBCNCwgMHgwRjksIDB4MEM1LAorCTB4MDQzLCAweDAwRiwgMHgwMzgsIDB4MEE5LCAweDAzRiwgMHgwOUQsIDB4MDAyLCAweDBGQiwKKwkweDBDRSwgMHgwNDUsIDB4MDExLCAweDA3MywgMHgwOTEsIDB4MDQxLCAweDBDNywgMHgwM0EsCisJMHgwOTEsIDB4MDlGLCAweDBDRiwgMHgwNjksIDB4MDQ0LCAweDA1QywgMHgwRjEsIDB4MDUwLAorCTB4MEJGLCAweDAzMywgMHgwQ0IsIDB4MDMyLCAweDBBNywgMHgwQUMsIDB4MDU0LCAweDA5MCwKKwkweDA4RCwgMHgwNDQsIDB4MDhFLCAweDA3MCwgMHgwMjksIDB4MDc3LCAweDBBOCwgMHgwRDAsCisJMHgwQ0MsIDB4MEJBLCAweDA1NiwgMHgwQjAsIDB4MEIyLCAweDA5RCwgMHgwOEMsIDB4MDg2LAorCTB4MDRDLCAweDAxNywgMHgwMjYsIDB4MDc3LCAweDAyNiwgMHgwMUMsIDB4MDI3LCAweDAxQywKKwkweDAyNCwgMHgwOUUsIDB4MDIzLCAweDA2MSwgMHgwQkUsIDB4MDhFLCAweDAxMiwgMHgwNEYsCisJMHgwMTEsIDB4MDg3LCAweDAxQywgMHgwRUEsIDB4MDVDLCAweDAwNSwgMHgwRjUsIDB4MEQ3LAorCTB4MEI4LCAweDA2QSwgMHgwNzUsIDB4MDI5LCAweDA3NywgMHgwQUIsIDB4MDBELCAweDA5OSwKKwkweDA3NCwgMHgwQTUsIDB4MDRGLCAweDA3MiwgMHgwQTAsIDB4MEFBLCAweDA0QSwgMHgwQzYsCisJMHgwRjMsIDB4MDY2LCAweDA2NiwgMHgwQzYsIDB4MDM5LCAweDA4MiwgMHgwQUYsIDB4MDc1LAorCTB4MEE2LCAweDA2RiwgMHgwMTQsIDB4MDZCLCAweDBDRSwgMHgwMDUsIDB4MDcwLCAweDA3MywKKwkweDA5NiwgMHgwODIsIDB4MDNFLCAweDA3NSwgMHgwMjgsIDB4MEUxLCAweDAzQSwgMHgwQTcsCisJMHgwQUQsIDB4MDQ0LCAweDA2MCwgMHgwMTYsIDB4MDUyLCAweDBCNiwgMHgwMUQsIDB4MDdBLAorCTB4MEI2LCAweDBCMywgMHgwMjQsIDB4MEJCLCAweDA4NiwgMHgwQTcsIDB4MDUyLCAweDA5OCwKKwkweDAwNCwgMHgwREEsIDB4MDdDLCAweDBFMiwgMHgwQTEsIDB4MDg3LCAweDA5QywgMHgwNTUsCisJMHgwRjcsIDB4MDlDLCAweDBCNSwgMHgwQUMsIDB4MDJDLCAweDA5NSwgMHgwMzMsIDB4MEI5LAorCTB4MDMxLCAweDAwNSwgMHgwRDksIDB4MDUzLCAweDBENiwgMHgwQTIsIDB4MDMwLCAweDAwQiwKKwkweDAyOSwgMHgwNUIsIDB4MDAyLCAweDAyRSwgMHgwNjEsIDB4MDVBLCAweDAxNywgMHgwRTYsCisJMHgwOUMsIDB4MEIzLCAweDAyQSwgMHgwN0EsIDB4MEM1LCAweDA0MCwgMHgwMjEsIDB4MEE4LAorCTB4MDkxLCAweDBDRSwgMHgwMDUsIDB4MDI3LCAweDBGMywgMHgwQTUsIDB4MDg4LCAweDA2NCwKKwkweDBDMSwgMHgwNzIsIDB4MDY1LCAweDA0RiwgMHgwNTgsIDB4MDE0LCAweDAwQywgMHgwOEQsCisJMHgwN0UsIDB4MEYzLCAweDA4MSwgMHgwNDQsIDB4MDVDLCAweDBFRiwgMHgwNDEsIDB4MEM3LAorCTB4MDNBLCAweDBCRSwgMHgwMDIsIDB4MEZBLCAweDBBOSwgMHgwRUEsIDB4MENFLCAweDBDQywKKwkweDBBOSwgMHgwMjksIDB4MDUzLCAweDBENiwgMHgwQTIsIDB4MDQ2LCAweDA0NywgMHgwREQsCisJMHgwN0EsIDB4MEMwLCAweDBBMywgMHgwMDAsIDB4MDg2LCAweDBFMiwgMHgwOUIsIDB4MDI5LAorCTB4MDc4LCAweDA4QiwgMHgwODEsIDB4MDA5LCAweDA5OCwgMHgwNzAsIDB4MDlCLCAweDAyOSwKKwkweDA3OSwgMHgwNUQsIDB4MEQ5LCAweDA3MiwgMHgwRUQsIDB4MDk0LCAweDBCQywgMHgwQjksCisJMHgwNzYsIDB4MDEzLCAweDAzQiwgMHgwMkEsIDB4MDVELCAweDBCMiwgMHgwOTcsIDB4MDk1LAorCTB4MDJFLCAweDBEOSwgMHgwNEIsIDB4MENBLCAweDA3RCwgMHgwNUIsIDB4MDU5LCAweDA5NCwKKwkweDBDQSwgMHgwMUMsIDB4MDI0LCAweDBFRSwgMHgwQzcsIDB4MDk0LCAweDBCQywgMHgwQzAsCisJMHgwMjYsIDB4MEQzLCAweDBFNywgMHgwMTUsIDB4MDBDLCAweDAzQywgMHgwRTIsIDB4MEFDLAorCTB4MEZFLCAweDA3QiwgMHgwNEEsIDB4MDIyLCAweDBFNywgMHgwOEEsIDB4MDg1LCAweDBGOSwKKwkweDA5RSwgMHgwNTksIDB4MDk3LCAweDA3QSwgMHgwOEQsIDB4MDBDLCAweDBDQiwgMHgwQTUsCisJMHgwMjcsIDB4MEYzLCAweDBBMCwgMHgwNDEsIDB4MDcyLCAweDA2MiwgMHgwMTksIDB4MDM3LAorCTB4MERFLCAweDA3MCwgMHgwMjgsIDB4MDhCLCAweDA5QywgMHgwOEEsIDB4MDBFLCAweDAzOSwKKwkweDBENCwgMHgwOEQsIDB4MDBGLCAweDA1NiwgMHgwMzYsIDB4MDZELCAweDAwOSwgMHgwNEUsCisJMHgwQkQsIDB4MDU5LCAweDAyQywgMHgwQ0UsIDB4MEE1LCAweDA2QiwgMHgwMEIsIDB4MDIyLAorCTB4MEQ5LCAweDA5RCwgMHgwQzksIDB4MEIyLCAweDA5NywgMHgwQkUsIDB4MEYzLCAweDA4MSwKKwkweDA0QSwgMHgwN0QsIDB4MDY1LCAweDBBMywgMHgwMDAsIDB4MDkzLCAweDA4RiwgMHgwNjcsCisJMHgwMjksIDB4MDc4LCAweDBDMiwgMHgwNEQsIDB4MEMxLCAweDBEMSwgMHgwMDYsIDB4MDgyLAorCTB4MDMxLCAweDBBRiwgMHgwMDcsIDB4MDM4LCAweDAzNCwgMHgwMTEsIDB4MEYzLCAweDBBOCwKKwkweDAyQSwgMHgwOUUsIDB4MEE4LCAweDA2NiwgMHgwMUEsIDB4MEE0LCAweDBBNSwgMHgwNEYsCisJMHgwNUEsIDB4MDBDLCAweDAxMSwgMHgwOEYsIDB4MEFBLCAweDA3QiwgMHgwRDAsIDB4MDY1LAorCTB4MDQ5LCAweDA0NSwgMHgwQkQsIDB4MEU5LCAweDA2MiwgMHgwRDIsIDB4MEIxLCAweDA5RSwKKwkweDA2QywgMHgwQ0MsIDB4MEM2LCAweDAxOSwgMHgwODcsIDB4MDA5LCAweDBDMywgMHgwOEUsCisJMHgwNzUsIDB4MDQxLCAweDAxRiwgMHgwM0EsIDB4MEE1LCAweDAxMywgMHgwRDUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNUEsIDB4MENDLCAweDA5MAorIH07CisKKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19TTUNUUikgfHwgZGVmaW5lZChDT05GSUdfU01DVFJfTU9EVUxFKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQzYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKQEAgLTAsMCArMSwyNDEwIEBACisvKgorICogIHRtczM4MHRyLmM6IEEgbmV0d29yayBkcml2ZXIgbGlicmFyeSBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzgwLWJhc2VkCisgKiAgICAgICAgICAgICAgVG9rZW4gUmluZyBBZGFwdGVycy4KKyAqCisgKiAgT3JpZ2luYWxseSBza3RyLmM6IFdyaXR0ZW4gMTk5NyBieSBDaHJpc3RvcGggR29vcworICoKKyAqICBBIGZpbmUgcmVzdWx0IG9mIHRoZSBMaW51eCBTeXN0ZW1zIE5ldHdvcmsgQXJjaGl0ZWN0dXJlIFByb2plY3QuCisgKiAgaHR0cDovL3d3dy5saW51eC1zbmEub3JnCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICBUaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIGNhcmQgc3VwcG9ydDoKKyAqCS0gdG1zcGNpIChHZW5lcmljIFBDSSBjYXJkIHN1cHBvcnQpCisgKgktIGFieXNzIChNYWRnZSBQQ0kgc3VwcG9ydCkKKyAqICAgICAgLSB0bXNpc2EgKFN5c0tvbm5lY3QgVFI0LzE2IElTQSkKKyAqCisgKiAgU291cmNlczoKKyAqICAJLSBUaGUgaGFyZHdhcmUgcmVsYXRlZCBwYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgdGFrZSBmcm9tCisgKiAgCSAgdGhlIFN5c0tvbm5lY3QgVG9rZW4gUmluZyBkcml2ZXIgZm9yIFdpbmRvd3MgTlQuCisgKiAgCS0gSSB1c2VkIHRoZSBJQk0gVG9rZW4gUmluZyBkcml2ZXIgJ2libXRyLmMnIGFzIGEgYmFzZSBmb3IgdGhpcworICogIAkgIGRyaXZlciwgYXMgd2VsbCBhcyB0aGUgJ3NrZWxldG9uLmMnIGRyaXZlciBieSBEb25hbGQgQmVja2VyLgorICogIAktIEFsc28gdmFyaW91cyBvdGhlciBkcml2ZXJzIGluIHRoZSBsaW51eCBzb3VyY2UgdHJlZSB3ZXJlIHRha2VuCisgKiAgCSAgYXMgc2FtcGxlcyBmb3Igc29tZSB0YXNrcy4KKyAqICAgICAgLSBUSSBUTVMzODAgU2Vjb25kLUdlbmVyYXRpb24gVG9rZW4gUmluZyBVc2VyJ3MgR3VpZGUKKyAqICAJLSBUSSBkYXRhc2hlZXRzIGZvciByZXNwZWN0aXZlIGNoaXBzCisgKiAgCS0gRGF2aWQgSGVpbiBhdCBUZXhhcyBJbnN0cnVtZW50cyAKKyAqICAJLSBWYXJpb3VzIE1hZGdlIGVtcGxveWVlcworICoKKyAqICBNYWludGFpbmVyKHMpOgorICogICAgSlMJSmF5IFNjaHVsaXN0CQlqc2NobHN0QHNhbWJhLm9yZworICogICAgQ0cJQ2hyaXN0b3BoIEdvb3MJCWNnb29zQHN5c2tvbm5lY3QuZGUKKyAqICAgIEFGCUFkYW0gRnJpdHpsZXIJCW1pZEBhdWsuY3gKKyAqICAgIE1MUCAgICAgICBNaWtlIFBoaWxsaXBzICAgICAgICAgICBwaGlsbGltQGFtdHJhay5jb20KKyAqICAgIEpGCUpvY2hlbiBGcmllZHJpY2gJam9jaGVuQHNjcmFtLmRlCisgKiAgICAgCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkyOS1BdWctOTcJQ0cJQ3JlYXRlZAorICoJMDQtQXByLTk4CUNHCUZpeGVkIHByb2JsZW1zIGNhdXNlZCBieSB0b2tfdGltZXJfY2hlY2sKKyAqCTEwLUFwci05OAlDRwlGaXhlZCBsb2NrdXBzIGF0IGNhYmxlIGRpc2Nvbm5lY3Rpb24KKyAqCTI3LU1heS05OAlKUwlGb3JtYXRlZCB0byBMaW51eCBLZXJuZWwgRm9ybWF0CisgKgkzMS1NYXktOTgJSlMJSGFja2VkIGluIFBDSSBzdXBwb3J0CisgKgkxNi1KdW4tOTgJSlMJTW9kdWxpemVkIGZvciBtdWx0aXBsZSBjYXJkcyB3aXRoIG9uZSBkcml2ZXIKKyAqCSAgIFNlcC05OQlBRglSZW5hbWVkIHRvIHRtczM4MHRyIChzdXBwb3J0cyBtb3JlIHRoYW4gU0sncykKKyAqICAgICAgMjMtU2VwLTk5CUFGICAgICAgQWRkZWQgQ29tcGFxIGFuZCBUaG9tYXMtQ29ucmFkIFBDSSBzdXBwb3J0CisgKgkJCQlGaXhlZCBhIGJ1ZyBjYXVzaW5nIGRvdWJsZSBjb3BpZXMgb24gUENJCisgKgkJCQlGaXhlZCBmb3IgbmV3IG11bHRpY2FzdCBzdHVmZiAoMi4yLzIuMykKKyAqCTI1LVNlcC05OQlBRglVcGVkIFRQTF9OVU0gZnJvbSAzIHRvIDkKKyAqCQkJCVJlbW92ZWQgZXh0cmFuZW91cyAnTm8gZnJlZSBUUEwnCisgKgkyMi1EZWMtOTkJQUYJQWRkZWQgTWFkZ2UgUENJIE1rMiBzdXBwb3J0IGFuZCBnZW5lcmFsaXplZAorICoJCQkJcGFydHMgb2YgdGhlIGluaXRpbGl6YXRpb24gcHJvY2VkdXJlLgorICoJMzAtRGVjLTk5CUFGCVR1cm5lZCB0bXMzODB0ciBpbnRvIGEgbGlicmFyeSBhbGEgODM5MC4KKyAqCQkJCU1hZGdlIHN1cHBvcnQgaXMgcHJvdmlkZWQgaW4gdGhlIGFieXNzIG1vZHVsZQorICoJCQkJR2VuZXJpYyBQQ0kgc3VwcG9ydCBpcyBpbiB0aGUgdG1zcGNpIG1vZHVsZS4KKyAqCTMwLU5vdi0wMAlKRglVcGRhdGVkIFBDSSBjb2RlIHRvIHN1cHBvcnQgSU8gTU1VIHZpYQorICoJCQkJcGNpX21hcF9zdGF0aWMoKS4gQWxwaGEgdXNlcyB0aGlzIE1NVSBmb3IgSVNBCisgKgkJCQlhcyB3ZWxsLgorICogICAgICAxNC1KYW4tMDEJSkYJRml4IERNQSBvbiBpZmRvd24vaWZ1cCBzZXF1ZW5jZXMuIFNvbWUgCisgKiAgICAgIAkJCWNsZWFudXAuCisgKgkxMy1KYW4tMDIJSkYJQWRkIHNwaW5sb2NrIHRvIGZpeCByYWNlIGNvbmRpdGlvbi4KKyAqCTA5LU5vdi0wMglKRglGaXhlZCBwcmludGtzIHRvIG5vdCBTUEFNIHRoZSBjb25zb2xlIGR1cmluZworICoJCQkJbm9ybWFsIG9wZXJhdGlvbi4KKyAqCTMwLURlYy0wMglKRglSZW1vdmVkIGluY29ycmVjdCBfX2luaXQgZnJvbSAKKyAqCQkJCXRtczM4MHRyX2luaXRfY2FyZC4KKyAqICAgICAgCQkJCisgKiAgVG8gZG86CisgKiAgICAxLiBNdWx0aS9Ccm9hZGNhc3QgcGFja2V0IGhhbmRsaW5nICh0aGlzIG1heSBoYXZlIGZpeGVkIGl0c2VsZikKKyAqICAgIDIuIFdyaXRlIGEgc2t0cmlzYSBtb2R1bGUgdGhhdCBpbmNsdWRlcyB0aGUgb2xkIElTQSBzdXBwb3J0IChkb25lKQorICogICAgMy4gQWxsb3cgbW9kdWxlcyB0byBsb2FkIHRoZWlyIG93biBtaWNyb2NvZGUKKyAqICAgIDQuIFNwZWVkIHVwIHRoZSBCVUQgcHJvY2VzcyAtLSBmcmVlemluZyB0aGUga2VybmVsIGZvciAzK3NlYyBpcworICogICAgICAgICBxdWl0ZSB1bmFjY2VwdGFibGUuCisgKiAgICA1LiBTdGlsbCBhIGZldyByZW1haW5pbmcgc3RhbGxzIHdoZW4gdGhlIGNhYmxlIGlzIHVucGx1Z2dlZC4KKyAqLworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAidG1zMzgwdHIuYzogdjEuMTAgMzAvMTIvMjAwMiBieSBDaHJpc3RvcGggR29vcywgQWRhbSBGcml0emxlclxuIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInRtczM4MHRyLmgiCQkvKiBPdXIgU3R1ZmYgKi8KKworLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgMiBmb3IgZGVidWcsIGFuZAorICogMyBmb3IgdmVyeSB2ZXJib3NlIGRlYnVnLgorICovCisjaWZuZGVmIFRNUzM4MFRSX0RFQlVHCisjZGVmaW5lIFRNUzM4MFRSX0RFQlVHIDAKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCB0bXMzODB0cl9kZWJ1ZyA9IFRNUzM4MFRSX0RFQlVHOworCitzdGF0aWMgc3RydWN0IGRldmljZSB0bXNfZGV2aWNlOworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKiBBbHBoYWJldGljYWwgYnkgZnVuY3Rpb24gbmFtZS4KKyAqLworCisvKiAiQSIgKi8KKy8qICJCIiAqLworc3RhdGljIGludCAgICAgIHRtczM4MHRyX2JyaW5ndXBfZGlhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiQyIgKi8KK3N0YXRpYyB2b2lkCXRtczM4MHRyX2NhbmNlbF90eF9xdWV1ZShzdHJ1Y3QgbmV0X2xvY2FsKiB0cCk7CitzdGF0aWMgaW50IAl0bXMzODB0cl9jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY2hrX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9jaGtfb3V0c3RhbmRpbmdfY21kcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9jaGtfc3JjX2FkZHIodW5zaWduZWQgY2hhciAqZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmh3X2FkZHIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdG1zMzgwdHJfY2hrX3NzYihzdHJ1Y3QgbmV0X2xvY2FsICp0cCwgdW5zaWduZWQgc2hvcnQgSXJxVHlwZSk7CitpbnQJIAl0bXMzODB0cl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9jbWRfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJEIiAqLworc3RhdGljIHZvaWQgCXRtczM4MHRyX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiBUTVMzODBUUl9ERUJVRyA+IDAKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9kdW1wKHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW5ndGgpOworI2VuZGlmCisvKiAiRSIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9leGVjX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBDb21tYW5kKTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9leGVjX3NpZmNtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgV3JpdGVWYWx1ZSk7CisvKiAiRiIgKi8KKy8qICJHIiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0bXMzODB0cl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiSCIgKi8KK3N0YXRpYyBpbnQgCXRtczM4MHRyX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJJIiAqLworc3RhdGljIGludCAJdG1zMzgwdHJfaW5pdF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX2luaXRfaXBiKHN0cnVjdCBuZXRfbG9jYWwgKnRwKTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9pbml0X25ldF9sb2NhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9pbml0X29wYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJNIiAqLworLyogIk8iICovCitpbnQJCXRtczM4MHRyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiUCIgKi8KKy8qICJSIiAqLworc3RhdGljIHZvaWQgCXRtczM4MHRyX3Jjdl9zdGF0dXNfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAJdG1zMzgwdHJfcmVhZF9wdHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfcmVhZF9yYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqRGF0YSwKKwkJCXVuc2lnbmVkIHNob3J0IEFkZHJlc3MsIGludCBMZW5ndGgpOworc3RhdGljIGludCAJdG1zMzgwdHJfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9yZXNldF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfcmluZ19zdGF0dXNfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIlMiICovCitzdGF0aWMgaW50IAl0bXMzODB0cl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXRtczM4MHRyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKKy8qICJUIiAqLworc3RhdGljIHZvaWQgCXRtczM4MHRyX3RpbWVyX2Noayh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3RpbWVyX2VuZF93YWl0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfdHhfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJVIiAqLworc3RhdGljIHZvaWQgCXRtczM4MHRyX3VwZGF0ZV9yY3Zfc3RhdHMoc3RydWN0IG5ldF9sb2NhbCAqdHAsCisJCQl1bnNpZ25lZCBjaGFyIERhdGFQdHJbXSwgdW5zaWduZWQgaW50IExlbmd0aCk7CisvKiAiVyIgKi8KK3ZvaWQJIAl0bXMzODB0cl93YWl0KHVuc2lnbmVkIGxvbmcgdGltZSk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfd3JpdGVfcnBsX3N0YXR1cyhSUEwgKnJwbCwgdW5zaWduZWQgaW50IFN0YXR1cyk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfd3JpdGVfdHBsX3N0YXR1cyhUUEwgKnRwbCwgdW5zaWduZWQgaW50IFN0YXR1cyk7CisKKyNkZWZpbmUgU0lGUkVBREIocmVnKSAoKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c2lmcmVhZGIoZGV2LCByZWcpKQorI2RlZmluZSBTSUZXUklURUIodmFsLCByZWcpICgoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5zaWZ3cml0ZWIoZGV2LCB2YWwsIHJlZykpCisjZGVmaW5lIFNJRlJFQURXKHJlZykgKCgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnNpZnJlYWR3KGRldiwgcmVnKSkKKyNkZWZpbmUgU0lGV1JJVEVXKHZhbCwgcmVnKSAoKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c2lmd3JpdGV3KGRldiwgdmFsLCByZWcpKQorCisKKworI2lmIDAgLyogVE1TMzgwVFJfREVCVUcgPiAwICovCitzdGF0aWMgaW50IG1hZGdlbWNfc2lmcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBvbGQsIGNoazEsIGNoazI7CisJCisJb2xkID0gU0lGUkVBREIoU0lGQURSKTsgIC8qIEdldCB0aGUgb2xkIFNJRkFEUiB2YWx1ZSAqLworCisgICAgICAgIGNoazEgPSAwOyAgICAgICAvKiBCZWdpbiB3aXRoIGNoZWNrIHZhbHVlIDAgKi8KKyAgICAgICAgZG8geworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICAvKiBXcml0ZSBuZXcgU0lGQURSIHZhbHVlICovCisJCVNJRldSSVRFQihjaGsxLCBTSUZBRFIpOworCQljaGsyID0gU0lGUkVBREIoU0lGQURSKTsKKwkJaWYgKGNoazIgIT0gY2hrMSkKKwkJCXJldHVybiAtMTsKKwkJCisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDEpOworICAgICAgICAgICAgICAgIC8qIFJlYWQsIGludmVydCBhbmQgd3JpdGUgKi8KKwkJY2hrMiA9IFNJRlJFQURCKFNJRkFERCk7CisJCWlmIChjaGsyICE9IGNoazEpCisJCQlyZXR1cm4gLTE7CisKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgY2hrMiBePSAweDBGRTsKKwkJU0lGV1JJVEVCKGNoazIsIFNJRkFEUik7CisKKyAgICAgICAgICAgICAgICAvKiBSZWFkLCBpbnZlcnQgYW5kIGNvbXBhcmUgKi8KKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMSk7CisJCWNoazIgPSBTSUZSRUFEQihTSUZBREQpOworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICBjaGsyIF49IDB4MEZFOworCisgICAgICAgICAgICAgICAgaWYoY2hrMSAhPSBjaGsyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7ICAgIC8qIE5vIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICBjaGsxIC09IDI7CisgICAgICAgIH0gd2hpbGUoY2hrMSAhPSAwKTsgICAgIC8qIFJlcGVhdCAxMjggdGltZXMgKGFsbCBieXRlIHZhbHVlcykgKi8KKworCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOyAvKiBzYW5pdHkgKi8KKyAgICAgICAgLyogUmVzdG9yZSB0aGUgU0lGQURSIHZhbHVlICovCisJU0lGV1JJVEVCKG9sZCwgU0lGQURSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCBzb21ldGltZSBhZnRlcgorICogYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitpbnQgdG1zMzgwdHJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCQorCS8qIGluaXQgdGhlIHNwaW5sb2NrICovCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZ0cC0+dGltZXIpOworCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKworI2lmZGVmIENPTkZJR19JU0EKKwlpZihkZXYtPmRtYSA+IDApIAorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXNldF9kbWFfbW9kZShkZXYtPmRtYSwgRE1BX01PREVfQ0FTQ0FERSk7CisJCWVuYWJsZV9kbWEoZGV2LT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisjZW5kaWYKKwkKKwllcnIgPSB0bXMzODB0cl9jaGlwc2V0X2luaXQoZGV2KTsKKyAgCWlmKGVycikKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGlwc2V0IGluaXRpYWxpemF0aW9uIGVycm9yXG4iLCAKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybiAoLTEpOworCX0KKworCXRwLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIDMwKkhaOworCXRwLT50aW1lci5mdW5jdGlvbgk9IHRtczM4MHRyX3RpbWVyX2VuZF93YWl0OworCXRwLT50aW1lci5kYXRhCQk9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFkYXB0ZXIgUkFNIHNpemU6ICVkS1xuIiwgCisJICAgICAgIGRldi0+bmFtZSwgdG1zMzgwdHJfcmVhZF9wdHIoZGV2KSk7CisKKwl0bXMzODB0cl9lbmFibGVfaW50ZXJydXB0cyhkZXYpOworCXRtczM4MHRyX29wZW5fYWRhcHRlcihkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgZnJvbSBoYXJkd2FyZS4gSWYgaW50ZXJydXB0IGRvZXMgbm90IGNvbWUsCisJICogdGhlcmUgd2lsbCBiZSBhIHRpbWVvdXQgZnJvbSB0aGUgdGltZXIuCisJICovCisJdHAtPlNsZWVwaW5nID0gMTsKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ0cC0+d2FpdF9mb3JfdG9rX2ludCk7CisJZGVsX3RpbWVyKCZ0cC0+dGltZXIpOworCisJLyogSWYgQWRhcHRlclZpcnRPcGVuRmxhZyBpcyAxLCB0aGUgYWRhcHRlciBpcyBub3cgb3BlbiBmb3IgdXNlICovCisJaWYodHAtPkFkYXB0ZXJWaXJ0T3BlbkZsYWcgPT0gMCkKKwl7CisJCXRtczM4MHRyX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwl0cC0+U3RhcnRUaW1lID0gamlmZmllczsKKworCS8qIFN0YXJ0IGZ1bmN0aW9uIGNvbnRyb2wgdGltZXIgKi8KKwl0cC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyAyKkhaOworCXRwLT50aW1lci5mdW5jdGlvbgk9IHRtczM4MHRyX3RpbWVyX2NoazsKKwl0cC0+dGltZXIuZGF0YQkJPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRpbWVvdXQgZnVuY3Rpb24gd2hpbGUgd2FpdGluZyBmb3IgZXZlbnQKKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfdGltZXJfZW5kX3dhaXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UqKWRhdGE7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYodHAtPlNsZWVwaW5nKQorCXsKKwkJdHAtPlNsZWVwaW5nID0gMDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cC0+d2FpdF9mb3JfdG9rX2ludCk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY2hpcHNldAorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2NoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJdG1zMzgwdHJfaW5pdF9pcGIodHApOworCXRtczM4MHRyX2luaXRfb3BiKGRldik7CisJdG1zMzgwdHJfaW5pdF9uZXRfbG9jYWwoZGV2KTsKKworCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZXNldHRpbmcgYWRhcHRlci4uLlxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSB0bXMzODB0cl9yZXNldF9hZGFwdGVyKGRldik7CisJaWYoZXJyIDwgMCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQnJpbmd1cCBkaWFncy4uLlxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSB0bXMzODB0cl9icmluZ3VwX2RpYWdzKGRldik7CisJaWYoZXJyIDwgMCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW5pdCBhZGFwdGVyLi4uXG4iLCBkZXYtPm5hbWUpOworCWVyciA9IHRtczM4MHRyX2luaXRfYWRhcHRlcihkZXYpOworCWlmKGVyciA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUhXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplcyB0aGUgbmV0X2xvY2FsIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfaW5pdF9uZXRfbG9jYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFidWY7CisKKwl0cC0+c2NiLkNNRAk9IDA7CisJdHAtPnNjYi5QYXJtWzBdID0gMDsKKwl0cC0+c2NiLlBhcm1bMV0gPSAwOworCisJdHAtPnNzYi5TVFMJPSAwOworCXRwLT5zc2IuUGFybVswXSA9IDA7CisJdHAtPnNzYi5QYXJtWzFdID0gMDsKKwl0cC0+c3NiLlBhcm1bMl0gPSAwOworCisJdHAtPkNNRHF1ZXVlCT0gMDsKKworCXRwLT5BZGFwdGVyT3BlbkZsYWcJPSAwOworCXRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID0gMDsKKwl0cC0+U2NiSW5Vc2UJCT0gMDsKKwl0cC0+T3BlbkNvbW1hbmRJc3N1ZWQJPSAwOworCXRwLT5SZU9wZW5JblByb2dyZXNzCT0gMDsKKwl0cC0+SGFsdEluUHJvZ3Jlc3MJPSAwOworCXRwLT5UcmFuc21pdEhhbHRTY2hlZHVsZWQgPSAwOworCXRwLT5Mb2JlV2lyZUZhdWx0TG9nZ2VkCT0gMDsKKwl0cC0+TGFzdE9wZW5TdGF0dXMJPSAwOworCXRwLT5NYXhQYWNrZXRTaXplCT0gREVGQVVMVF9QQUNLRVRfU0laRTsKKworCS8qIENyZWF0ZSBjaXJjdWxhciBjaGFpbiBvZiB0cmFuc21pdCBsaXN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBUUExfTlVNOyBpKyspCisJeworCQl0cC0+VHBsW2ldLk5leHRUUExBZGRyID0gaHRvbmwoKChjaGFyICopKCZ0cC0+VHBsWyhpKzEpICUgVFBMX05VTV0pIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsgLyogRE1BIGJ1ZmZlciBtYXkgYmUgTU1VIGRyaXZlbiAqLworCQl0cC0+VHBsW2ldLlN0YXR1cwk9IDA7CisJCXRwLT5UcGxbaV0uRnJhbWVTaXplCT0gMDsKKwkJdHAtPlRwbFtpXS5GcmFnTGlzdFswXS5EYXRhQ291bnQJPSAwOworCQl0cC0+VHBsW2ldLkZyYWdMaXN0WzBdLkRhdGFBZGRyCQk9IDA7CisJCXRwLT5UcGxbaV0uTmV4dFRQTFB0cgk9ICZ0cC0+VHBsWyhpKzEpICUgVFBMX05VTV07CisJCXRwLT5UcGxbaV0uTURhdGEJPSBOVUxMOworCQl0cC0+VHBsW2ldLlRQTEluZGV4CT0gaTsKKwkJdHAtPlRwbFtpXS5ETUFCdWZmCT0gMDsKKwkJdHAtPlRwbFtpXS5CdXN5RmxhZwk9IDA7CisJfQorCisJdHAtPlRwbEZyZWUgPSB0cC0+VHBsQnVzeSA9ICZ0cC0+VHBsWzBdOworCisJLyogQ3JlYXRlIGNpcmN1bGFyIGNoYWluIG9mIHJlY2VpdmUgbGlzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlBMX05VTTsgaSsrKQorCXsKKwkJdHAtPlJwbFtpXS5OZXh0UlBMQWRkciA9IGh0b25sKCgoY2hhciAqKSgmdHAtPlJwbFsoaSsxKSAlIFJQTF9OVU1dKSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7IC8qIERNQSBidWZmZXIgbWF5IGJlIE1NVSBkcml2ZW4gKi8KKwkJdHAtPlJwbFtpXS5TdGF0dXMgPSAoUlhfVkFMSUQgfCBSWF9TVEFSVF9GUkFNRSB8IFJYX0VORF9GUkFNRSB8IFJYX0ZSQU1FX0lSUSk7CisJCXRwLT5ScGxbaV0uRnJhbWVTaXplID0gMDsKKwkJdHAtPlJwbFtpXS5GcmFnTGlzdFswXS5EYXRhQ291bnQgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpdHAtPk1heFBhY2tldFNpemUpOworCisJCS8qIEFsbG9jIHNrYiBhbmQgcG9pbnQgYWRhcHRlciB0byBkYXRhIGFyZWEgKi8KKwkJdHAtPlJwbFtpXS5Ta2IgPSBkZXZfYWxsb2Nfc2tiKHRwLT5NYXhQYWNrZXRTaXplKTsKKwkJCXRwLT5ScGxbaV0uRE1BQnVmZiA9IDA7CisKKwkJLyogc2tiID09IE5VTEwgPyB0aGVuIHVzZSBsb2NhbCBidWZmZXIgKi8KKwkJaWYodHAtPlJwbFtpXS5Ta2IgPT0gTlVMTCkKKwkJeworCQkJdHAtPlJwbFtpXS5Ta2JTdGF0ID0gU0tCX1VOQVZBSUxBQkxFOworCQkJdHAtPlJwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5Mb2NhbFJ4QnVmZmVyc1tpXSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQl0cC0+UnBsW2ldLk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW2ldOworCQl9CisJCWVsc2UJLyogU0tCICE9IE5VTEwgKi8KKwkJeworCQkJdHAtPlJwbFtpXS5Ta2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQodHAtPlJwbFtpXS5Ta2IsIHRwLT5NYXhQYWNrZXRTaXplKTsKKworCQkJLyogZGF0YSB1bnJlYWNoYWJsZSBmb3IgRE1BID8gdGhlbiB1c2UgbG9jYWwgYnVmZmVyICovCisJCQlkbWFidWYgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPlJwbFtpXS5Ta2ItPmRhdGEsIHRwLT5NYXhQYWNrZXRTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYodHAtPmRtYWxpbWl0ICYmIChkbWFidWYgKyB0cC0+TWF4UGFja2V0U2l6ZSA+IHRwLT5kbWFsaW1pdCkpCisJCQl7CisJCQkJdHAtPlJwbFtpXS5Ta2JTdGF0ID0gU0tCX0RBVEFfQ09QWTsKKwkJCQl0cC0+UnBsW2ldLkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPkxvY2FsUnhCdWZmZXJzW2ldIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQl0cC0+UnBsW2ldLk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW2ldOworCQkJfQorCQkJZWxzZQkvKiBETUEgZGlyZWN0bHkgaW4gc2tiLT5kYXRhICovCisJCQl7CisJCQkJdHAtPlJwbFtpXS5Ta2JTdGF0ID0gU0tCX0RNQV9ESVJFQ1Q7CisJCQkJdHAtPlJwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKGRtYWJ1Zik7CisJCQkJdHAtPlJwbFtpXS5NRGF0YSA9IHRwLT5ScGxbaV0uU2tiLT5kYXRhOworCQkJCXRwLT5ScGxbaV0uRE1BQnVmZiA9IGRtYWJ1ZjsKKwkJCX0KKwkJfQorCisJCXRwLT5ScGxbaV0uTmV4dFJQTFB0ciA9ICZ0cC0+UnBsWyhpKzEpICUgUlBMX05VTV07CisJCXRwLT5ScGxbaV0uUlBMSW5kZXggPSBpOworCX0KKworCXRwLT5ScGxIZWFkID0gJnRwLT5ScGxbMF07CisJdHAtPlJwbFRhaWwgPSAmdHAtPlJwbFtSUExfTlVNLTFdOworCXRwLT5ScGxUYWlsLT5TdGF0dXMgPSAoUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBSWF9GUkFNRV9JUlEpOworCisJcmV0dXJuOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlciBibG9jay4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfaW5pdF9pcGIoc3RydWN0IG5ldF9sb2NhbCAqdHApCit7CisJdHAtPmlwYi5Jbml0X09wdGlvbnMJPSBCVVJTVF9NT0RFOworCXRwLT5pcGIuQ01EX1N0YXR1c19JVgk9IDA7CisJdHAtPmlwYi5UWF9JVgkJPSAwOworCXRwLT5pcGIuUlhfSVYJCT0gMDsKKwl0cC0+aXBiLlJpbmdfU3RhdHVzX0lWCT0gMDsKKwl0cC0+aXBiLlNDQl9DbGVhcl9JVgk9IDA7CisJdHAtPmlwYi5BZGFwdGVyX0NIS19JVgk9IDA7CisJdHAtPmlwYi5SWF9CdXJzdF9TaXplCT0gQlVSU1RfU0laRTsKKwl0cC0+aXBiLlRYX0J1cnN0X1NpemUJPSBCVVJTVF9TSVpFOworCXRwLT5pcGIuRE1BX0Fib3J0X1RocmhsZCA9IERNQV9SRVRSSUVTOworCXRwLT5pcGIuU0NCX0FkZHIJPSAwOworCXRwLT5pcGIuU1NCX0FkZHIJPSAwOworCisJcmV0dXJuOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgdGhlIG9wZW4gcGFyYW1ldGVyIGJsb2NrLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9pbml0X29wYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCXVuc2lnbmVkIGxvbmcgQWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBScGxTaXplICAgID0gUlBMX1NJWkU7CisJdW5zaWduZWQgc2hvcnQgVHBsU2l6ZSAgICA9IFRQTF9TSVpFOworCXVuc2lnbmVkIHNob3J0IEJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRTsKKwlpbnQgaTsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5vY3BsLk9QRU5PcHRpb25zIAkgPSAwOworCXRwLT5vY3BsLk9QRU5PcHRpb25zIAl8PSBFTkFCTEVfRlVMTF9EVVBMRVhfU0VMRUNUSU9OOworCXRwLT5vY3BsLkZ1bGxEdXBsZXggCSA9IDA7CisJdHAtPm9jcGwuRnVsbER1cGxleCAJfD0gT1BFTl9GVUxMX0RVUExFWF9PRkY7CisKKyAgICAgICAgLyogCisJICogU2V0IG5vZGUgYWRkcmVzcyAKKwkgKgorCSAqIFdlIGdvIGFoZWFkIGFuZCBwdXQgaXQgaW4gdGhlIE9QQiBldmVuIHRob3VnaCBvbgorCSAqIG1vc3Qgb2YgdGhlIGdlbmVyaWMgYWRhcHRlcnMgdGhpcyBpc24ndCByZXF1aXJlZC4KKwkgKiBJdHMgc2ltcGxlciB0aGlzIHdheS4gIC0tIEFTRgorCSAqLworICAgICAgICBmb3IgKGk9MDtpPDY7aSsrKQorICAgICAgICAgICAgICAgIHRwLT5vY3BsLk5vZGVBZGRyW2ldID0gKCh1bnNpZ25lZCBjaGFyICopZGV2LT5kZXZfYWRkcilbaV07CisKKwl0cC0+b2NwbC5Hcm91cEFkZHIJID0gMDsKKwl0cC0+b2NwbC5GdW5jdEFkZHIJID0gMDsKKwl0cC0+b2NwbC5SeExpc3RTaXplCSA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClScGxTaXplKTsKKwl0cC0+b2NwbC5UeExpc3RTaXplCSA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClUcGxTaXplKTsKKwl0cC0+b2NwbC5CdWZTaXplCSA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClCdWZmZXJTaXplKTsKKwl0cC0+b2NwbC5SZXNlcnZlZAkgPSAwOworCXRwLT5vY3BsLlRYQnVmTWluCSA9IFRYX0JVRl9NSU47CisJdHAtPm9jcGwuVFhCdWZNYXgJID0gVFhfQlVGX01BWDsKKworCUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+UHJvZHVjdElEIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKworCXRwLT5vY3BsLlByb2RJREFkZHJbMF0JID0gTE9XT1JEKEFkZHIpOworCXRwLT5vY3BsLlByb2RJREFkZHJbMV0JID0gSElXT1JEKEFkZHIpOworCisJcmV0dXJuOworfQorCisvKgorICogU2VuZCBPUEVOIGNvbW1hbmQgdG8gYWRhcHRlcgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9vcGVuX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZih0cC0+T3BlbkNvbW1hbmRJc3N1ZWQpCisJCXJldHVybjsKKworCXRwLT5PcGVuQ29tbWFuZElzc3VlZCA9IDE7CisJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19PUEVOKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIENsZWFyIHRoZSBhZGFwdGVyJ3MgaW50ZXJydXB0IGZsYWcuIENsZWFyIHN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlCisgKiAoU0lOVEVOKTogZGlzYWJsZSBhZGFwdGVyIHRvIHN5c3RlbSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlTSUZXUklURUIoMCwgU0lGQUNMKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFNldCB0aGUgYWRhcHRlcidzIGludGVycnVwdCBmbGFnLiBTZXQgc3lzdGVtIGludGVycnVwdCBlbmFibGUKKyAqIChTSU5URU4pOiBlbmFibGUgYWRhcHRlciB0byBzeXN0ZW0gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlTSUZXUklURUIoQUNMX1NJTlRFTiwgU0lGQUNMKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFB1dCBjb21tYW5kIGluIGNvbW1hbmQgcXVldWUsIHRyeSB0byBleGVjdXRlIGl0LgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9leGVjX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBDb21tYW5kKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5DTURxdWV1ZSB8PSBDb21tYW5kOworCXRtczM4MHRyX2Noa19vdXRzdGFuZGluZ19jbWRzKGRldik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHRtczM4MHRyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB3ZSBhcmUgYnJva2VuLgorCSAqIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLgorCSAqCisJICogUmVzZXR0aW5nIHRoZSB0b2tlbiByaW5nIGFkYXB0ZXIgdGFrZXMgYSBsb25nIHRpbWUgc28ganVzdAorCSAqIGZha2UgdHJhbnNtaXNzaW9uIHRpbWUgYW5kIGdvIG9uIHRyeWluZy4gT3VyIG93biB0aW1lb3V0CisJICogcm91dGluZSBpcyBpbiB0bXMzODB0cl90aW1lcl9jaGsoKQorCSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIEdldHMgc2tiIGZyb20gc3lzdGVtLCBxdWV1ZXMgaXQgYW5kIGNoZWNrcyBpZiBpdCBjYW4gYmUgc2VudAorICovCitzdGF0aWMgaW50IHRtczM4MHRyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwllcnIgPSB0bXMzODB0cl9oYXJkd2FyZV9zZW5kX3BhY2tldChza2IsIGRldik7CisJaWYodHAtPlRwbEZyZWUtPk5leHRUUExQdHItPkJ1c3lGbGFnKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIChlcnIpOworfQorCisvKgorICogTW92ZSBmcmFtZXMgaW50byBhZGFwdGVyIHR4IHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgdG1zMzgwdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlUUEwgKnRwbDsKKwlzaG9ydCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFidWYsIG5ld2J1ZjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAKKwkvKiBUcnkgdG8gZ2V0IGEgZnJlZSBUUEwgZnJvbSB0aGUgY2hhaW4uCisJICoKKwkgKiBOT1RFOiBXZSAqbXVzdCogYWx3YXlzIGxlYXZlIG9uZSB1bnVzZWQgVFBMIGluIHRoZSBjaGFpbiwKKwkgKiBiZWNhdXNlIG90aGVyd2lzZSB0aGUgYWRhcHRlciBtaWdodCBzZW5kIGZyYW1lcyB0d2ljZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwlpZih0cC0+VHBsRnJlZS0+TmV4dFRQTFB0ci0+QnVzeUZsYWcpICB7IC8qIE5vIGZyZWUgVFBMICovCisJCWlmICh0bXMzODB0cl9kZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIGZyZWUgVFBMXG4iLCBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkbWFidWYgPSAwOworCisJLyogSXMgYnVmZmVyIHJlYWNoYWJsZSBmb3IgQnVzbWFzdGVyLURNQT8gKi8KKworCWxlbmd0aAk9IHNrYi0+bGVuOworCWRtYWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsIGxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYodHAtPmRtYWxpbWl0ICYmIChkbWFidWYgKyBsZW5ndGggPiB0cC0+ZG1hbGltaXQpKSB7CisJCS8qIENvcHkgZnJhbWUgdG8gbG9jYWwgYnVmZmVyICovCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIGRtYWJ1ZiwgbGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZG1hYnVmICA9IDA7CisJCWkgCT0gdHAtPlRwbEZyZWUtPlRQTEluZGV4OworCQlidWYgCT0gdHAtPkxvY2FsVHhCdWZmZXJzW2ldOworCQltZW1jcHkoYnVmLCBza2ItPmRhdGEsIGxlbmd0aCk7CisJCW5ld2J1ZiAJPSAoKGNoYXIgKilidWYgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXI7CisJfQorCWVsc2UgeworCQkvKiBTZW5kIGRpcmVjdCBmcm9tIHNrYi0+ZGF0YSAqLworCQluZXdidWYJPSBkbWFidWY7CisJCWJ1Zgk9IHNrYi0+ZGF0YTsKKwl9CisJLyogU291cmNlIGFkZHJlc3MgaW4gcGFja2V0PyAqLworCXRtczM4MHRyX2Noa19zcmNfYWRkcihidWYsIGRldi0+ZGV2X2FkZHIpOworCXRwLT5MYXN0U2VuZFRpbWUJPSBqaWZmaWVzOworCXRwbCAJCQk9IHRwLT5UcGxGcmVlOwkvKiBHZXQgdGhlICJmcmVlIiBUUEwgKi8KKwl0cGwtPkJ1c3lGbGFnIAkJPSAxOwkJLyogTWFyayBUUEwgYXMgYnVzeSAqLworCXRwLT5UcGxGcmVlIAkJPSB0cGwtPk5leHRUUExQdHI7CisgICAgCisJLyogU2F2ZSB0aGUgc2tiIGZvciBkZWxheWVkIHJldHVybiBvZiBza2IgdG8gc3lzdGVtICovCisJdHBsLT5Ta2IgPSBza2I7CisJdHBsLT5ETUFCdWZmID0gZG1hYnVmOworCXRwbC0+RnJhZ0xpc3RbMF0uRGF0YUNvdW50ID0gY3B1X3RvX2JlMTYoKHVuc2lnbmVkIHNob3J0KWxlbmd0aCk7CisJdHBsLT5GcmFnTGlzdFswXS5EYXRhQWRkciAgPSBodG9ubChuZXdidWYpOworCisJLyogV3JpdGUgdGhlIGRhdGEgbGVuZ3RoIGluIHRoZSB0cmFuc21pdCBsaXN0LiAqLworCXRwbC0+RnJhbWVTaXplIAk9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClsZW5ndGgpOworCXRwbC0+TURhdGEgCT0gYnVmOworCisJLyogVHJhbnNtaXQgdGhlIGZyYW1lIGFuZCBzZXQgdGhlIHN0YXR1cyB2YWx1ZXMuICovCisJdG1zMzgwdHJfd3JpdGVfdHBsX3N0YXR1cyh0cGwsIFRYX1ZBTElEIHwgVFhfU1RBUlRfRlJBTUUKKwkJCQl8IFRYX0VORF9GUkFNRSB8IFRYX1BBU1NfU1JDX0FERFIKKwkJCQl8IFRYX0ZSQU1FX0lSUSk7CisKKwkvKiBMZXQgYWRhcHRlciBzZW5kIHRoZSBmcmFtZS4gKi8KKwl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIENNRF9UWF9WQUxJRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogV3JpdGUgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSAnU3RhdHVzJyBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIFRQTC4KKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiBhbnkgVFBMIG11c3QgYmUKKyAqIG1vZGlmaWVkIGJ5IHRoZSBkcml2ZXIsIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBvdGhlcndpc2UgY2hhbmdlIHRoZQorICogb3JkZXIgb2YgaW5zdHJ1Y3Rpb25zIHN1Y2ggdGhhdCB3cml0aW5nIHRoZSBUUEwgc3RhdHVzIG1heSBiZSBleGVjdXRlZCBhdAorICogYW4gdW5kZXNpcmVhYmxlIHRpbWUuIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyB1c2VkLCB0aGUgc3RhdHVzIGlzIGFsd2F5cworICogd3JpdHRlbiB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXMoVFBMICp0cGwsIHVuc2lnbmVkIGludCBTdGF0dXMpCit7CisJdHBsLT5TdGF0dXMgPSBTdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHRtczM4MHRyX2Noa19zcmNfYWRkcih1bnNpZ25lZCBjaGFyICpmcmFtZSwgdW5zaWduZWQgY2hhciAqaHdfYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIFNSQml0OworCisJaWYoKCgodW5zaWduZWQgbG9uZylmcmFtZVs4XSkgJiB+MHg4MCkgIT0gMCkJLyogQ29tcGFyZSA0IGJ5dGVzICovCisJCXJldHVybjsKKwlpZigodW5zaWduZWQgc2hvcnQpZnJhbWVbMTJdICE9IDApCQkvKiBDb21wYXJlIDIgYnl0ZXMgKi8KKwkJcmV0dXJuOworCisJU1JCaXQgPSBmcmFtZVs4XSAmIDB4ODA7CisJbWVtY3B5KCZmcmFtZVs4XSwgaHdfYWRkciwgNik7CisJZnJhbWVbOF0gfD0gU1JCaXQ7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgdGltZXIgcm91dGluZTogQ2hlY2sgaWYgYWRhcHRlciBzdGlsbCBvcGVuIGFuZCB3b3JraW5nLCByZW9wZW4gaWYgbm90LiAKKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfdGltZXJfY2hrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilkYXRhOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKHRwLT5IYWx0SW5Qcm9ncmVzcykKKwkJcmV0dXJuOworCisJdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoZGV2KTsKKwlpZih0aW1lX2JlZm9yZSh0cC0+TGFzdFNlbmRUaW1lICsgU0VORF9USU1FT1VULCBqaWZmaWVzKQorCQkmJiAodHAtPlRwbEZyZWUgIT0gdHAtPlRwbEJ1c3kpKQorCXsKKwkJLyogQW55dGhpbmcgdG8gc2VuZCwgYnV0IHN0YWxsZWQgdG9vIGxvbmcgKi8KKwkJdHAtPkxhc3RTZW5kVGltZSA9IGppZmZpZXM7CisJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfQ0xPU0UpOwkvKiBEb2VzIHJlb3BlbiBhdXRvbWF0aWNhbGx5ICovCisJfQorCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMipIWjsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwlpZih0cC0+QWRhcHRlck9wZW5GbGFnIHx8IHRwLT5SZU9wZW5JblByb2dyZXNzKQorCQlyZXR1cm47CisJdHAtPlJlT3BlbkluUHJvZ3Jlc3MgPSAxOworCXRtczM4MHRyX29wZW5fYWRhcHRlcihkZXYpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjogSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLgorICovCitpcnFyZXR1cm5fdCB0bXMzODB0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCXVuc2lnbmVkIHNob3J0IGlycV90eXBlOworCWludCBoYW5kbGVkID0gMDsKKworCWlmKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaXJxX3R5cGUgPSBTSUZSRUFEVyhTSUZTVFMpOworCisJd2hpbGUoaXJxX3R5cGUgJiBTVFNfU1lTVEVNX0lSUSkgeworCQloYW5kbGVkID0gMTsKKwkJaXJxX3R5cGUgJj0gU1RTX0lSUV9NQVNLOworCisJCWlmKCF0bXMzODB0cl9jaGtfc3NiKHRwLCBpcnFfdHlwZSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogREFUQSBMQVRFIG9jY3VycmVkXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2goaXJxX3R5cGUpIHsKKwkJY2FzZSBTVFNfSVJRX1JFQ0VJVkVfU1RBVFVTOgorCQkJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KGRldik7CisJCQl0bXMzODB0cl9yY3Zfc3RhdHVzX2lycShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVFNfSVJRX1RSQU5TTUlUX1NUQVRVUzoKKwkJCS8qIENoZWNrIGlmIFRSQU5TTUlULkhBTFQgY29tbWFuZCBpcyBjb21wbGV0ZSAqLworCQkJaWYodHAtPnNzYi5QYXJtWzBdICYgQ09NTUFORF9DT01QTEVURSkgeworCQkJCXRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUgPSAwOworCQkJCQl0cC0+VHJhbnNtaXRIYWx0U2NoZWR1bGVkID0gMDsKKworCQkJCQkvKiBJc3N1ZSBhIG5ldyB0cmFuc21pdCBjb21tYW5kLiAqLworCQkJCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1RSQU5TTUlUKTsKKwkJCQl9CisKKwkJCQl0bXMzODB0cl9yZXNldF9pbnRlcnJ1cHQoZGV2KTsKKwkJCQl0bXMzODB0cl90eF9zdGF0dXNfaXJxKGRldik7CisJCQkJYnJlYWs7CisKKwkJY2FzZSBTVFNfSVJRX0NPTU1BTkRfU1RBVFVTOgorCQkJLyogVGhlIFNTQiBjb250YWlucyBzdGF0dXMgb2YgbGFzdCBjb21tYW5kCisJCQkgKiBvdGhlciB0aGFuIHJlY2VpdmUvdHJhbnNtaXQuCisJCQkgKi8KKwkJCXRtczM4MHRyX2NtZF9zdGF0dXNfaXJxKGRldik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfU0NCX0NMRUFSOgorCQkJLyogVGhlIFNDQiBpcyBmcmVlIGZvciBhbm90aGVyIGNvbW1hbmQuICovCisJCQl0cC0+U2NiSW5Vc2UgPSAwOworCQkJdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoZGV2KTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU1RTX0lSUV9SSU5HX1NUQVRVUzoKKwkJCXRtczM4MHRyX3Jpbmdfc3RhdHVzX2lycShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVFNfSVJRX0FEQVBURVJfQ0hFQ0s6CisJCQl0bXMzODB0cl9jaGtfaXJxKGRldik7CisJCQlicmVhazsKKworCQljYXNlIFNUU19JUlFfTExDX1NUQVRVUzoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ0bXMzODB0cjogdW5leHBlY3RlZCBMTEMgc3RhdHVzIElSUVxuIik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfVElNRVI6CisJCQlwcmludGsoS0VSTl9ERUJVRyAidG1zMzgwdHI6IHVuZXhwZWN0ZWQgVGltZXIgSVJRXG4iKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU1RTX0lSUV9SRUNFSVZFX1BFTkRJTkc6CisJCQlwcmludGsoS0VSTl9ERUJVRyAidG1zMzgwdHI6IHVuZXhwZWN0ZWQgUmVjZWl2ZSBQZW5kaW5nIElSUVxuIik7CisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVua25vd24gVG9rZW4gUmluZyBJUlEgKDB4JTA0eClcbiIsIGlycV90eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVzZXQgc3lzdGVtIGludGVycnVwdCBpZiBub3QgYWxyZWFkeSBkb25lLiAqLworCQlpZihpcnFfdHlwZSAhPSBTVFNfSVJRX1RSQU5TTUlUX1NUQVRVUworCQkJJiYgaXJxX3R5cGUgIT0gU1RTX0lSUV9SRUNFSVZFX1NUQVRVUykgeworCQkJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KGRldik7CisJCX0KKworCQlpcnFfdHlwZSA9IFNJRlJFQURXKFNJRlNUUyk7CisJfQorCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiAgUmVzZXQgdGhlIElOVEVSUlVQVCBTWVNURU0gYml0IGFuZCBpc3N1ZSBTU0IgQ0xFQVIgY29tbWFuZC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCVNTQiAqc3NiID0gJnRwLT5zc2I7CisKKwkvKgorCSAqIFtXb3JrYXJvdW5kIGZvciAiRGF0YSBMYXRlIl0KKwkgKiBTZXQgYWxsIGZpZWxkcyBvZiB0aGUgU1NCIHRvIHdlbGwtZGVmaW5lZCB2YWx1ZXMgc28gd2UgY2FuCisJICogY2hlY2sgaWYgdGhlIGFkYXB0ZXIgaGFzIHdyaXR0ZW4gdGhlIFNTQi4KKwkgKi8KKworCXNzYi0+U1RTCT0gKHVuc2lnbmVkIHNob3J0KSAtMTsKKwlzc2ItPlBhcm1bMF0gCT0gKHVuc2lnbmVkIHNob3J0KSAtMTsKKwlzc2ItPlBhcm1bMV0gCT0gKHVuc2lnbmVkIHNob3J0KSAtMTsKKwlzc2ItPlBhcm1bMl0gCT0gKHVuc2lnbmVkIHNob3J0KSAtMTsKKworCS8qIEZyZWUgU1NCIGJ5IGlzc3VpbmcgU1NCX0NMRUFSIGNvbW1hbmQgYWZ0ZXIgcmVhZGluZyBJUlEgY29kZQorCSAqIGFuZCBjbGVhciBTVFNfU1lTVEVNX0lSUSBiaXQ6IGVuYWJsZSBhZGFwdGVyIGZvciBmdXJ0aGVyIGludGVycnVwdHMuCisJICovCisJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBDTURfU1NCX0NMRUFSIHwgQ01EX0NMRUFSX1NZU1RFTV9JUlEpOworCisJcmV0dXJuOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIFNTQiBoYXMgYWN0dWFsbHkgYmVlbiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0bXMzODB0cl9jaGtfc3NiKHN0cnVjdCBuZXRfbG9jYWwgKnRwLCB1bnNpZ25lZCBzaG9ydCBJcnFUeXBlKQoreworCVNTQiAqc3NiID0gJnRwLT5zc2I7CS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBTU0IuICovCisKKwkvKiBDIDAgMSAyIElOVEVSUlVQVCBDT0RFCisJICogLSAtIC0gLSAtLS0tLS0tLS0tLS0tLQorCSAqIDEgMSAxIDEgVFJBTlNNSVQgU1RBVFVTCisJICogMSAxIDEgMSBSRUNFSVZFIFNUQVRVUworCSAqIDEgPyA/IDAgQ09NTUFORCBTVEFUVVMKKwkgKiAwIDAgMCAwIFNDQiBDTEVBUgorCSAqIDEgMSAwIDAgUklORyBTVEFUVVMKKwkgKiAwIDAgMCAwIEFEQVBURVIgQ0hFQ0sKKwkgKgorCSAqIDAgPSBTU0IgZmllbGQgbm90IGFmZmVjdGVkIGJ5IGludGVycnVwdAorCSAqIDEgPSBTU0IgZmllbGQgaXMgYWZmZWN0ZWQgYnkgaW50ZXJydXB0CisJICoKKwkgKiBDID0gU1NCIEFERFJFU1MgKzA6IENPTU1BTkQKKwkgKiAwID0gU1NCIEFERFJFU1MgKzI6IFNUQVRVUyAwCisJICogMSA9IFNTQiBBRERSRVNTICs0OiBTVEFUVVMgMQorCSAqIDIgPSBTU0IgQUREUkVTUyArNjogU1RBVFVTIDIKKwkgKi8KKworCS8qIENoZWNrIGlmIHRoaXMgaW50ZXJydXB0IGRvZXMgdXNlIHRoZSBTU0IuICovCisKKwlpZihJcnFUeXBlICE9IFNUU19JUlFfVFJBTlNNSVRfU1RBVFVTCisJCSYmIElycVR5cGUgIT0gU1RTX0lSUV9SRUNFSVZFX1NUQVRVUworCQkmJiBJcnFUeXBlICE9IFNUU19JUlFfQ09NTUFORF9TVEFUVVMKKwkJJiYgSXJxVHlwZSAhPSBTVFNfSVJRX1JJTkdfU1RBVFVTKQorCXsKKwkJcmV0dXJuICgxKTsJLyogU1NCIG5vdCBpbnZvbHZlZC4gKi8KKwl9CisKKwkvKiBOb3RlOiBBbGwgZmllbGRzIG9mIHRoZSBTU0IgaGF2ZSBiZWVuIHNldCB0byBhbGwgb25lcyAoLTEpIGFmdGVyIGl0CisJICogaGFzIGxhc3QgYmVlbiB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSAoc2VlIERyaXZlcklzcigpKS4KKwkgKgorCSAqIENoZWNrIGlmIHRoZSBhZmZlY3RlZCBTU0IgZmllbGRzIGFyZSBzdGlsbCB1bmNoYW5nZWQuCisJICovCisKKwlpZihzc2ItPlNUUyA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQorCQlyZXR1cm4gKDApOwkvKiBDb21tYW5kIGZpZWxkIG5vdCB5ZXQgYXZhaWxhYmxlLiAqLworCWlmKElycVR5cGUgPT0gU1RTX0lSUV9DT01NQU5EX1NUQVRVUykKKwkJcmV0dXJuICgxKTsJLyogU3RhdHVzIGZpZWxkcyBub3QgYWx3YXlzIGFmZmVjdGVkLiAqLworCWlmKHNzYi0+UGFybVswXSA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQorCQlyZXR1cm4gKDApOwkvKiBTdGF0dXMgMSBmaWVsZCBub3QgeWV0IGF2YWlsYWJsZS4gKi8KKwlpZihJcnFUeXBlID09IFNUU19JUlFfUklOR19TVEFUVVMpCisJCXJldHVybiAoMSk7CS8qIFN0YXR1cyAyICYgMyBmaWVsZHMgbm90IGFmZmVjdGVkLiAqLworCisJLyogTm90ZTogQXQgdGhpcyBwb2ludCwgdGhlIGludGVycnVwdCBpcyBlaXRoZXIgVFJBTlNNSVQgb3IgUkVDRUlWRS4gKi8KKwlpZihzc2ItPlBhcm1bMV0gPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJcmV0dXJuICgwKTsJLyogU3RhdHVzIDIgZmllbGQgbm90IHlldCBhdmFpbGFibGUuICovCisJaWYoc3NiLT5QYXJtWzJdID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCisJCXJldHVybiAoMCk7CS8qIFN0YXR1cyAzIGZpZWxkIG5vdCB5ZXQgYXZhaWxhYmxlLiAqLworCisJcmV0dXJuICgxKTsJLyogQWxsIFNTQiBmaWVsZHMgaGF2ZSBiZWVuIHdyaXR0ZW4gYnkgdGhlIGFkYXB0ZXIuICovCit9CisKKy8qCisgKiBFdmFsdWF0ZXMgdGhlIGNvbW1hbmQgcmVzdWx0cyBzdGF0dXMgaW4gdGhlIFNTQiBzdGF0dXMgZmllbGQuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2NtZF9zdGF0dXNfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IHNzYl9jbWQsIHNzYl9wYXJtXzA7CisJdW5zaWduZWQgc2hvcnQgc3NiX3Bhcm1fMTsKKwljaGFyICpvcGVuX2VyciA9ICJPcGVuIGVycm9yIC0iOworCWNoYXIgKmNvZGVfZXJyID0gIk9wZW4gY29kZSAtIjsKKworCS8qIENvcHkgdGhlIHNzYiB2YWx1ZXMgdG8gbG9jYWwgdmFyaWFibGVzICovCisJc3NiX2NtZCAgICA9IHRwLT5zc2IuU1RTOworCXNzYl9wYXJtXzAgPSB0cC0+c3NiLlBhcm1bMF07CisJc3NiX3Bhcm1fMSA9IHRwLT5zc2IuUGFybVsxXTsKKworCWlmKHNzYl9jbWQgPT0gT1BFTikKKwl7CisJCXRwLT5TbGVlcGluZyA9IDA7CisJCWlmKCF0cC0+UmVPcGVuSW5Qcm9ncmVzcykKKwkgICAgCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRwLT53YWl0X2Zvcl90b2tfaW50KTsKKworCQl0cC0+T3BlbkNvbW1hbmRJc3N1ZWQgPSAwOworCQl0cC0+U2NiSW5Vc2UgPSAwOworCisJCWlmKChzc2JfcGFybV8wICYgMHgwMEZGKSA9PSBHT09EX0NPTVBMRVRJT04pCisJCXsKKwkJCS8qIFN1Y2Nlc3MsIHRoZSBhZGFwdGVyIGlzIG9wZW4uICovCisJCQl0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZAk9IDA7CisJCQl0cC0+QWRhcHRlck9wZW5GbGFnIAk9IDE7CisJCQl0cC0+QWRhcHRlclZpcnRPcGVuRmxhZyA9IDE7CisJCQl0cC0+VHJhbnNtaXRDb21tYW5kQWN0aXZlID0gMDsKKwkJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfVFJBTlNNSVQpOworCQkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19SRUNFSVZFKTsKKworCQkJaWYodHAtPlJlT3BlbkluUHJvZ3Jlc3MpCisJCQkJdHAtPlJlT3BlbkluUHJvZ3Jlc3MgPSAwOworCisJCQlyZXR1cm47CisJCX0KKwkJZWxzZSAJLyogVGhlIGFkYXB0ZXIgZGlkIG5vdCBvcGVuLiAqLworCQl7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIE5PREVfQUREUl9FUlJPUikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm9kZSBhZGRyZXNzIGVycm9yXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCSAgICAJCWlmKHNzYl9wYXJtXzAgJiBMSVNUX1NJWkVfRVJST1IpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpc3Qgc2l6ZSBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgQlVGX1NJWkVfRVJST1IpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJ1ZmZlciBzaXplIGVycm9yXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCSAgICAJCWlmKHNzYl9wYXJtXzAgJiBUWF9CVUZfQ09VTlRfRVJST1IpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4IGJ1ZmZlciBjb3VudCBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgSU5WQUxJRF9PUEVOX09QVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBvcGVuIG9wdGlvblxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgT1BFTl9FUlJPUikKKwkJCXsKKwkJCQkvKiBTaG93IHRoZSBvcGVuIHBoYXNlLiAqLworCQkJCXN3aXRjaChzc2JfcGFybV8wICYgT1BFTl9QSEFTRVNfTUFTSykKKwkJCQl7CisJCQkJCWNhc2UgTE9CRV9NRURJQV9URVNUOgorCQkJCQkJaWYoIXRwLT5Mb2JlV2lyZUZhdWx0TG9nZ2VkKQorCQkJCQkJeworCQkJCQkJCXRwLT5Mb2JlV2lyZUZhdWx0TG9nZ2VkID0gMTsKKwkJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgTG9iZSB3aXJlIGZhdWx0IChjaGVjayBjYWJsZSAhKS5cbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkgICAgCQkJCX0KKwkJCQkJCXRwLT5SZU9wZW5JblByb2dyZXNzCT0gMTsKKwkJCQkJCXRwLT5BZGFwdGVyT3BlbkZsYWcgCT0gMDsKKwkJCQkJCXRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID0gMTsKKwkJCQkJCXRtczM4MHRyX29wZW5fYWRhcHRlcihkZXYpOworCQkJCQkJcmV0dXJuOworCisJCQkJCWNhc2UgUEhZU0lDQUxfSU5TRVJUSU9OOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFBoeXNpY2FsIGluc2VydGlvbi5cbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBRERSRVNTX1ZFUklGSUNBVElPTjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBBZGRyZXNzIHZlcmlmaWNhdGlvbi5cbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBQQVJUSUNJUEFUSU9OX0lOX1JJTkdfUE9MTDoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQYXJ0aWNpcGF0aW9uIGluIHJpbmcgcG9sbC5cbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBSRVFVRVNUX0lOSVRJQUxJU0FUSU9OOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFJlcXVlc3QgaW5pdGlhbGlzYXRpb24uXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgRlVMTERVUExFWF9DSEVDSzoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBGdWxsIGR1cGxleCBjaGVjay5cbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBVbmtub3duIG9wZW4gcGhhc2VcbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogU2hvdyB0aGUgb3BlbiBlcnJvcnMuICovCisJCQkJc3dpdGNoKHNzYl9wYXJtXzAgJiBPUEVOX0VSUk9SX0NPREVTX01BU0spCisJCQkJeworCQkJCQljYXNlIE9QRU5fRlVOQ1RJT05fRkFJTFVSRToKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX0ZVTkNUSU9OX0ZBSUxVUkUiLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9GVU5DVElPTl9GQUlMVVJFOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1NJR05BTF9MT1NTOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE9QRU5fU0lHTkFMX0xPU1NcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1NJR05BTF9MT1NTOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1RJTUVPVVQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9USU1FT1VUXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9USU1FT1VUOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1JJTkdfRkFJTFVSRToKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1JJTkdfRkFJTFVSRVxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fUklOR19GQUlMVVJFOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1JJTkdfQkVBQ09OSU5HOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE9QRU5fUklOR19CRUFDT05JTkdcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JJTkdfQkVBQ09OSU5HOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX0RVUExJQ0FURV9OT0RFQUREUjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX0RVUExJQ0FURV9OT0RFQUREUlxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRFVQTElDQVRFX05PREVBRERSOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1JFUVVFU1RfSU5JVDoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1JFUVVFU1RfSU5JVFxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fUkVRVUVTVF9JTklUOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBPUEVOX1JFTU9WRV9SRUNFSVZFRDoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1JFTU9WRV9SRUNFSVZFRCIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JFTU9WRV9SRUNFSVZFRDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9GVUxMRFVQTEVYX1NFVDoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX0ZVTExEVVBMRVhfU0VUXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9GVUxMRFVQTEVYX1NFVDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgVW5rbm93biBvcGVuIGVyciBjb2RlIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRlVOQ1RJT05fRkFJTFVSRTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdHAtPkFkYXB0ZXJPcGVuRmxhZyAJPSAwOworCQkJdHAtPkFkYXB0ZXJWaXJ0T3BlbkZsYWcgPSAwOworCisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoc3NiX2NtZCAhPSBSRUFEX0VSUk9SX0xPRykKKwkJCXJldHVybjsKKworCQkvKiBBZGQgdmFsdWVzIGZyb20gdGhlIGVycm9yIGxvZyB0YWJsZSB0byB0aGUgTUFDCisJCSAqIHN0YXRpc3RpY3MgY291bnRlcnMgYW5kIHVwZGF0ZSB0aGUgZXJyb3Jsb2d0YWJsZQorCQkgKiBtZW1vcnkuCisJCSAqLworCQl0cC0+TWFjU3RhdC5saW5lX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5MaW5lX0Vycm9yOworCQl0cC0+TWFjU3RhdC5idXJzdF9lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuQnVyc3RfRXJyb3I7CisJCXRwLT5NYWNTdGF0LkFfQ19lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuQVJJX0ZDSV9FcnJvcjsKKwkJdHAtPk1hY1N0YXQubG9zdF9mcmFtZXMgKz0gdHAtPmVycm9ybG9ndGFibGUuTG9zdF9GcmFtZV9FcnJvcjsKKwkJdHAtPk1hY1N0YXQucmVjdl9jb25nZXN0X2NvdW50ICs9IHRwLT5lcnJvcmxvZ3RhYmxlLlJ4X0Nvbmdlc3RfRXJyb3I7CisJCXRwLT5NYWNTdGF0LnJ4X2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5SeF9Db25nZXN0X0Vycm9yOworCQl0cC0+TWFjU3RhdC5mcmFtZV9jb3BpZWRfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkZyYW1lX0NvcGllZF9FcnJvcjsKKwkJdHAtPk1hY1N0YXQudG9rZW5fZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLlRva2VuX0Vycm9yOworCQl0cC0+TWFjU3RhdC5kdW1teTEgKz0gdHAtPmVycm9ybG9ndGFibGUuRE1BX0J1c19FcnJvcjsKKwkJdHAtPk1hY1N0YXQuZHVtbXkxICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkRNQV9QYXJpdHlfRXJyb3I7CisJCXRwLT5NYWNTdGF0LmFib3J0X2RlbGltaXRlcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuQWJvcnREZWxpbWV0ZXJzOworCQl0cC0+TWFjU3RhdC5mcmVxdWVuY3lfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkZyZXF1ZW5jeV9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuaW50ZXJuYWxfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkludGVybmFsX0Vycm9yOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gdG1zMzgwdHJfb3BlbigpLgorICovCitpbnQgdG1zMzgwdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWRlbF90aW1lcigmdHAtPnRpbWVyKTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeCBoZXJlLiAqLworCisJdHAtPkhhbHRJblByb2dyZXNzIAk9IDE7CisJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19DTE9TRSk7CisJdHAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgMSpIWjsKKwl0cC0+dGltZXIuZnVuY3Rpb24gCT0gdG1zMzgwdHJfdGltZXJfZW5kX3dhaXQ7CisJdHAtPnRpbWVyLmRhdGEgCQk9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwl0bXMzODB0cl9lbmFibGVfaW50ZXJydXB0cyhkZXYpOworCisJdHAtPlNsZWVwaW5nID0gMTsKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ0cC0+d2FpdF9mb3JfdG9rX2ludCk7CisJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDA7CisgICAgCisJZGVsX3RpbWVyKCZ0cC0+dGltZXIpOworCXRtczM4MHRyX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworICAgCisjaWZkZWYgQ09ORklHX0lTQQorCWlmKGRldi0+ZG1hID4gMCkgCisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCWRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorI2VuZGlmCisJCisJU0lGV1JJVEVXKDB4RkYwMCwgU0lGQ01EKTsKKyNpZiAwCisJaWYoZGV2LT5kbWEgPiAwKSAvKiB3aGF0IHRoZT8gKi8KKwkJU0lGV1JJVEVCKDB4ZmYsIFBPU1JFRyk7CisjZW5kaWYKKwl0bXMzODB0cl9jYW5jZWxfdHhfcXVldWUodHApOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuCisgKiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdG1zMzgwdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikmdHAtPk1hY1N0YXQpOworfQorCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgT3Blbk9wdGlvbnM7CisJCisJT3Blbk9wdGlvbnMgPSB0cC0+b2NwbC5PUEVOT3B0aW9ucyAmCisJCX4oUEFTU19BREFQVEVSX01BQ19GUkFNRVMKKwkJICB8IFBBU1NfQVRURU5USU9OX0ZSQU1FUworCQkgIHwgUEFTU19CRUFDT05fTUFDX0ZSQU1FUworCQkgIHwgQ09QWV9BTExfTUFDX0ZSQU1FUworCQkgIHwgQ09QWV9BTExfTk9OX01BQ19GUkFNRVMpOworCQorCXRwLT5vY3BsLkZ1bmN0QWRkciA9IDA7CisJCisJaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlPcGVuT3B0aW9ucyB8PSBDT1BZX0FMTF9OT05fTUFDX0ZSQU1FUyB8CisJCQlDT1BZX0FMTF9NQUNfRlJBTUVTOworCWVsc2UKKwl7CisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCXsKKwkJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlLiAqLworCQkJdHAtPm9jcGwuRnVuY3RBZGRyID0gMHhGRkZGRkZGRjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWludCBpOworCQkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJCQlmb3IgKGk9MDsgaTwgZGV2LT5tY19jb3VudDsgaSsrKQorCQkJeworCQkJCSgoY2hhciAqKSgmdHAtPm9jcGwuRnVuY3RBZGRyKSlbMF0gfD0KKwkJCQkJbWNsaXN0LT5kbWlfYWRkclsyXTsKKwkJCQkoKGNoYXIgKikoJnRwLT5vY3BsLkZ1bmN0QWRkcikpWzFdIHw9CisJCQkJCW1jbGlzdC0+ZG1pX2FkZHJbM107CisJCQkJKChjaGFyICopKCZ0cC0+b2NwbC5GdW5jdEFkZHIpKVsyXSB8PQorCQkJCQltY2xpc3QtPmRtaV9hZGRyWzRdOworCQkJCSgoY2hhciAqKSgmdHAtPm9jcGwuRnVuY3RBZGRyKSlbM10gfD0KKwkJCQkJbWNsaXN0LT5kbWlfYWRkcls1XTsKKwkJCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7CisJCQl9CisJCX0KKwkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19TRVRfRlVOQ1RfQUREUik7CisJfQorCQorCXRwLT5vY3BsLk9QRU5PcHRpb25zID0gT3Blbk9wdGlvbnM7CisJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19NT0RJRllfT1BFTl9QQVJNUyk7CisJcmV0dXJuOworfQorCisvKgorICogV2FpdCBmb3Igc29tZSB0aW1lIChtaWNyb3NlY29uZHMpCisgKi8KK3ZvaWQgdG1zMzgwdHJfd2FpdCh1bnNpZ25lZCBsb25nIHRpbWUpCit7CisjaWYgMAorCWxvbmcgdG1wOworCQorCXRtcCA9IGppZmZpZXMgKyB0aW1lLygxMDAwMDAwL0haKTsKKwlkbyB7CisgIAkJY3VycmVudC0+c3RhdGUgCQk9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJdG1wID0gc2NoZWR1bGVfdGltZW91dCh0bXApOworCX0gd2hpbGUodGltZV9hZnRlcih0bXAsIGppZmZpZXMpKTsKKyNlbHNlCisJdWRlbGF5KHRpbWUpOworI2VuZGlmCisJcmV0dXJuOworfQorCisvKgorICogV3JpdGUgYSBjb21tYW5kIHZhbHVlIHRvIHRoZSBTSUZDTUQgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZXhlY19zaWZjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IFdyaXRlVmFsdWUpCit7CisJdW5zaWduZWQgc2hvcnQgY21kOworCXVuc2lnbmVkIHNob3J0IFNpZlN0c1ZhbHVlOworCXVuc2lnbmVkIGxvbmcgbG9vcF9jb3VudGVyOworCisJV3JpdGVWYWx1ZSA9ICgoV3JpdGVWYWx1ZSBeIENNRF9TWVNURU1fSVJRKSB8IENNRF9JTlRFUlJVUFRfQURBUFRFUik7CisJY21kID0gKHVuc2lnbmVkIHNob3J0KVdyaXRlVmFsdWU7CisJbG9vcF9jb3VudGVyID0gMCw1ICogODAwMDAwOworCWRvIHsKKwkJU2lmU3RzVmFsdWUgPSBTSUZSRUFEVyhTSUZTVFMpOworCX0gd2hpbGUoKFNpZlN0c1ZhbHVlICYgQ01EX0lOVEVSUlVQVF9BREFQVEVSKSAmJiBsb29wX2NvdW50ZXItLSk7CisJU0lGV1JJVEVXKGNtZCwgU0lGQ01EKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFByb2Nlc3NlcyBhZGFwdGVyIGhhcmR3YXJlIHJlc2V0LCBoYWx0cyBhZGFwdGVyIGFuZCBkb3dubG9hZHMgZmlybXdhcmUsCisgKiBjbGVhcnMgdGhlIGhhbHQgYml0LgorICovCitzdGF0aWMgaW50IHRtczM4MHRyX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgKmZ3X3B0cjsKKwl1bnNpZ25lZCBzaG9ydCBjb3VudCwgYywgY291bnQyOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkgPSBOVUxMOworCisJc3RybmNweSh0bXNfZGV2aWNlLmJ1c19pZCxkZXYtPm5hbWUsIEJVU19JRF9TSVpFKTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgInRtczM4MHRyLmJpbiIsICZ0bXNfZGV2aWNlKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmlybXdhcmUgJXMgaXMgbWlzc2luZywgY2Fubm90IHN0YXJ0LlxuIiwKKwkJCWRldi0+bmFtZSwgInRtczM4MHRyLmJpbiIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmd19wdHIgPSAodW5zaWduZWQgc2hvcnQgKilmd19lbnRyeS0+ZGF0YTsKKwljb3VudDIgPSBmd19lbnRyeS0+c2l6ZSAvIDI7CisKKwkvKiBIYXJkd2FyZSBhZGFwdGVyIHJlc2V0ICovCisJU0lGV1JJVEVXKEFDTF9BUkVTRVQsIFNJRkFDTCk7CisJdG1zMzgwdHJfd2FpdCg0MCk7CisJCisJYyA9IFNJRlJFQURXKFNJRkFDTCk7CisJdG1zMzgwdHJfd2FpdCgyMCk7CisKKwlpZihkZXYtPmRtYSA9PSAwKQkvKiBGb3IgUENJIGFkYXB0ZXJzICovCisJeworCQljICY9IH4oQUNMX05TRUxPVVQwIHwgQUNMX05TRUxPVVQxKTsJLyogQ2xlYXIgYml0cyAqLworCQlpZih0cC0+c2V0bnNlbG91dCkKKwkJICBjIHw9ICgqdHAtPnNldG5zZWxvdXQpKGRldik7CisJfQorCisJLyogSW4gY2FzZSBhIGNvbW1hbmQgaXMgcGVuZGluZyAtIGZvcmdldCBpdCAqLworCXRwLT5TY2JJblVzZSA9IDA7CisKKwljICY9IH5BQ0xfQVJFU0VUOwkJLyogQ2xlYXIgYWRhcHRlciByZXNldCBiaXQgKi8KKwljIHw9ICBBQ0xfQ1BIQUxUOwkJLyogSGFsdCBhZGFwdGVyIENQVSwgYWxsb3cgZG93bmxvYWQgKi8KKwljIHw9IEFDTF9CT09UOworCWMgfD0gQUNMX1NJTlRFTjsKKwljICY9IH5BQ0xfUFNETUFFTjsJCS8qIENsZWFyIHBzZXVkbyBkbWEgYml0ICovCisJU0lGV1JJVEVXKGMsIFNJRkFDTCk7CisJdG1zMzgwdHJfd2FpdCg0MCk7CisKKwljb3VudCA9IDA7CisJLyogRG93bmxvYWQgZmlybXdhcmUgdmlhIERJTyBpbnRlcmZhY2U6ICovCisJZG8geworCQlpZiAoY291bnQyIDwgMykgY29udGludWU7CisKKwkJLyogRG93bmxvYWQgZmlyc3QgYWRkcmVzcyBwYXJ0ICovCisJCVNJRldSSVRFVygqZndfcHRyLCBTSUZBRFgpOworCQlmd19wdHIrKzsKKwkJY291bnQyLS07CisJCS8qIERvd25sb2FkIHNlY29uZCBhZGRyZXNzIHBhcnQgKi8KKwkJU0lGV1JJVEVXKCpmd19wdHIsIFNJRkFERCk7CisJCWZ3X3B0cisrOworCQljb3VudDItLTsKKworCQlpZigoY291bnQgPSAqZndfcHRyKSAhPSAwKQkvKiBMb2FkIGxvb3AgY291bnRlciAqLworCQl7CisJCQlmd19wdHIrKzsJLyogRG93bmxvYWQgYmxvY2sgZGF0YSAqLworCQkJY291bnQyLS07CisJCQlpZiAoY291bnQgPiBjb3VudDIpIGNvbnRpbnVlOworCisJCQlmb3IoOyBjb3VudCA+IDA7IGNvdW50LS0pCisJCQl7CisJCQkJU0lGV1JJVEVXKCpmd19wdHIsIFNJRklOQyk7CisJCQkJZndfcHRyKys7CisJCQkJY291bnQyLS07CisJCQl9CisJCX0KKwkJZWxzZQkvKiBTdG9wLCBpZiBsYXN0IGJsb2NrIGRvd25sb2FkZWQgKi8KKwkJeworCQkJYyA9IFNJRlJFQURXKFNJRkFDTCk7CisJCQljICY9ICh+QUNMX0NQSEFMVCB8IEFDTF9TSU5URU4pOworCisJCQkvKiBDbGVhciBDUEhBTFQgYW5kIHN0YXJ0IEJVRCAqLworCQkJU0lGV1JJVEVXKGMsIFNJRkFDTCk7CisJCQlpZiAoZndfZW50cnkpCisJCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfSB3aGlsZShjb3VudCA9PSAwKTsKKworCWlmIChmd19lbnRyeSkKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkYXB0ZXIgRG93bmxvYWQgRmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAoLTEpOworfQorCisvKgorICogU3RhcnRzIGJyaW5nIHVwIGRpYWdub3N0aWNzIG9mIHRva2VuIHJpbmcgYWRhcHRlciBhbmQgZXZhbHVhdGVzCisgKiBkaWFnbm9zdGljIHJlc3VsdHMuCisgKi8KK3N0YXRpYyBpbnQgdG1zMzgwdHJfYnJpbmd1cF9kaWFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsb29wX2NudCwgcmV0cnlfY250OworCXVuc2lnbmVkIHNob3J0IFN0YXR1czsKKworCXRtczM4MHRyX3dhaXQoSEFMRl9TRUNPTkQpOworCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgRVhFQ19TT0ZUX1JFU0VUKTsKKwl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKworCXJldHJ5X2NudCA9IEJVRF9NQVhfUkVUUklFUzsJLyogbWF4aW1hbCBudW1iZXIgb2YgcmV0cnlzICovCisKKwlkbyB7CisJCXJldHJ5X2NudC0tOworCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiQlVELVN0YXR1czogIik7CisJCWxvb3BfY250ID0gQlVEX01BWF9MT09QQ05UOwkvKiBtYXhpbXVtOiB0aHJlZSBzZWNvbmRzKi8KKwkJZG8gewkJCS8qIEluc3BlY3QgQlVEIHJlc3VsdHMgKi8KKwkJCWxvb3BfY250LS07CisJCQl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwkJCVN0YXR1cyA9IFNJRlJFQURXKFNJRlNUUyk7CisJCQlTdGF0dXMgJj0gU1RTX01BU0s7CisKKwkJCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICUwNFggXG4iLCBTdGF0dXMpOworCQkJLyogQlVEIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KKwkJCWlmKFN0YXR1cyA9PSBTVFNfSU5JVElBTElaRSkKKwkJCQlyZXR1cm4gKDEpOworCQkvKiBVbnJlY292ZXJhYmxlIGhhcmR3YXJlIGVycm9yLCBCVUQgbm90IGNvbXBsZXRlZD8gKi8KKwkJfSB3aGlsZSgobG9vcF9jbnQgPiAwKSAmJiAoKFN0YXR1cyAmIChTVFNfRVJST1IgfCBTVFNfVEVTVCkpCisJCQkhPSAoU1RTX0VSUk9SIHwgU1RTX1RFU1QpKSk7CisKKwkJLyogRXJyb3IgcHJldmVudGluZyBjb21wbGV0aW9uIG9mIEJVRCAqLworCQlpZihyZXRyeV9jbnQgPiAwKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRhcHRlciBTb2Z0d2FyZSBSZXNldC5cbiIsIAorCQkJCWRldi0+bmFtZSk7CisJCQl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIEVYRUNfU09GVF9SRVNFVCk7CisJCQl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwkJfQorCX0gd2hpbGUocmV0cnlfY250ID4gMCk7CisKKwlTdGF0dXMgPSBTSUZSRUFEVyhTSUZTVFMpOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkd2FyZSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkvKiBIYXJkd2FyZSBlcnJvciBvY2N1cnJlZCEgKi8KKwlTdGF0dXMgJj0gMHgwMDFmOworCWlmIChTdGF0dXMgJiAweDAwMTApCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCVUQgRXJyb3I6IFRpbWVvdXRcbiIsIGRldi0+bmFtZSk7CisJZWxzZSBpZiAoKFN0YXR1cyAmIDB4MDAwZikgPiA2KQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQlVEIEVycm9yOiBJbGxlZ2FsIEZhaWx1cmVcbiIsIGRldi0+bmFtZSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQnJpbmcgVXAgRGlhZ25vc3RpY3MgRXJyb3IgKCUwNFgpIG9jY3VycmVkXG4iLCBkZXYtPm5hbWUsIFN0YXR1cyAmIDB4MDAwZik7CisKKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIENvcHkgaW5pdGlhbGlzYXRpb24gZGF0YSB0byBhZGFwdGVyIG1lbW9yeSwgYmVnaW5uaW5nIGF0IGFkZHJlc3MKKyAqIDE6MEEwMDsgU3RhcnRpbmcgRE1BIHRlc3QgYW5kIGV2YWx1YXRpbmcgcmVzdWx0IGJpdHMuCisgKi8KK3N0YXRpYyBpbnQgdG1zMzgwdHJfaW5pdF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY29uc3QgdW5zaWduZWQgY2hhciBTQ0JfVGVzdFs2XSA9IHsweDAwLCAweDAwLCAweEMxLCAweEUyLCAweEQ0LCAweDhCfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIFNTQl9UZXN0WzhdID0gezB4RkYsIDB4RkYsIDB4RDEsIDB4RDcsCisJCQkJCQkweEM1LCAweEQ5LCAweEMzLCAweEQ0fTsKKwl2b2lkICpwdHIgPSAodm9pZCAqKSZ0cC0+aXBiOworCXVuc2lnbmVkIHNob3J0ICppcGJfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopcHRyOworCXVuc2lnbmVkIGNoYXIgKmNiX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopICZ0cC0+c2NiOworCXVuc2lnbmVkIGNoYXIgKnNiX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopICZ0cC0+c3NiOworCXVuc2lnbmVkIHNob3J0IFN0YXR1czsKKwlpbnQgaSwgbG9vcF9jbnQsIHJldHJ5X2NudDsKKworCS8qIE5vcm1hbGl6ZTogYnl0ZSBvcmRlciBsb3cvaGlnaCwgd29yZCBvcmRlciBoaWdoL2xvdyEgKG9ubHkgSVBCISkgKi8KKwl0cC0+aXBiLlNDQl9BZGRyID0gU1dBUFcoKChjaGFyICopJnRwLT5zY2IgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCXRwLT5pcGIuU1NCX0FkZHIgPSBTV0FQVygoKGNoYXIgKikmdHAtPnNzYiAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1ZmZlciAocmVhbCk6ICVseFxuIiwgZGV2LT5uYW1lLCAobG9uZykgJnRwLT5zY2IpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1ZmZlciAodmlydCk6ICVseFxuIiwgZGV2LT5uYW1lLCAobG9uZykgKChjaGFyICopJnRwLT5zY2IgLSAoY2hhciAqKXRwKSArIChsb25nKSB0cC0+ZG1hYnVmZmVyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKERNQSkgOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpIHRwLT5kbWFidWZmZXIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1ZmZlciAodHApICA6ICVseFxuIiwgZGV2LT5uYW1lLCAobG9uZykgdHApOworCX0KKwkvKiBNYXhpbXVtOiB0aHJlZSBpbml0aWFsaXphdGlvbiByZXRyaWVzICovCisJcmV0cnlfY250ID0gSU5JVF9NQVhfUkVUUklFUzsKKworCWRvIHsKKwkJcmV0cnlfY250LS07CisKKwkJLyogVHJhbnNmZXIgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKwkJU0lGV1JJVEVXKDB4MDAwMSwgU0lGQURYKTsKKworCQkvKiBUbyBhZGRyZXNzIDAwMDE6MEEwMCBvZiBhZGFwdGVyIFJBTSAqLworCQlTSUZXUklURVcoMHgwQTAwLCBTSUZBREQpOworCisJCS8qIFdyaXRlIDExIHdvcmRzIHRvIGFkYXB0ZXIgUkFNICovCisJCWZvcihpID0gMDsgaSA8IDExOyBpKyspCisJCQlTSUZXUklURVcoaXBiX3B0cltpXSwgU0lGSU5DKTsKKworCQkvKiBFeGVjdXRlIFNDQiBhZGFwdGVyIGNvbW1hbmQgKi8KKwkJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBDTURfRVhFQ1VURSk7CisKKwkJbG9vcF9jbnQgPSBJTklUX01BWF9MT09QQ05UOwkvKiBNYXhpbXVtOiAxMSBzZWNvbmRzICovCisKKwkJLyogV2hpbGUgcmVtYWluaW5nIHJldHJpZXMsIG5vIGVycm9yIGFuZCBub3QgY29tcGxldGVkICovCisJCWRvIHsKKwkJCVN0YXR1cyA9IDA7CisJCQlsb29wX2NudC0tOworCQkJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisKKwkJCS8qIE1hc2sgaW50ZXJlc3Rpbmcgc3RhdHVzIGJpdHMgKi8KKwkJCVN0YXR1cyA9IFNJRlJFQURXKFNJRlNUUyk7CisJCQlTdGF0dXMgJj0gU1RTX01BU0s7CisJCX0gd2hpbGUoKChTdGF0dXMgJihTVFNfSU5JVElBTElaRSB8IFNUU19FUlJPUiB8IFNUU19URVNUKSkgIT0gMCkKKwkJCSYmICgoU3RhdHVzICYgU1RTX0VSUk9SKSA9PSAwKSAmJiAobG9vcF9jbnQgIT0gMCkpOworCisJCWlmKChTdGF0dXMgJiAoU1RTX0lOSVRJQUxJWkUgfCBTVFNfRVJST1IgfCBTVFNfVEVTVCkpID09IDApCisJCXsKKwkJCS8qIEluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCB3aXRob3V0IGVycm9yICovCisJCQlpID0gMDsKKwkJCWRvIHsJLyogVGVzdCBpZiBjb250ZW50cyBvZiBTQ0IgaXMgdmFsaWQgKi8KKwkJCQlpZihTQ0JfVGVzdFtpXSAhPSAqKGNiX3B0ciArIGkpKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERNQSBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJCS8qIERNQSBkYXRhIGVycm9yOiB3cm9uZyBkYXRhIGluIFNDQiAqLworCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQl9CisJCQkJaSsrOworCQkJfSB3aGlsZShpIDwgNik7CisKKwkJCWkgPSAwOworCQkJZG8gewkvKiBUZXN0IGlmIGNvbnRlbnRzIG9mIFNTQiBpcyB2YWxpZCAqLworCQkJCWlmKFNTQl9UZXN0W2ldICE9ICooc2JfcHRyICsgaSkpCisJCQkJCS8qIERNQSBkYXRhIGVycm9yOiB3cm9uZyBkYXRhIGluIFNTQiAqLworCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlpKys7CisJCQl9IHdoaWxlIChpIDwgOCk7CisKKwkJCXJldHVybiAoMSk7CS8qIEFkYXB0ZXIgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZigoU3RhdHVzICYgU1RTX0VSUk9SKSAhPSAwKQorCQkJeworCQkJCS8qIEluaXRpYWxpemF0aW9uIGVycm9yIG9jY3VycmVkICovCisJCQkJU3RhdHVzID0gU0lGUkVBRFcoU0lGU1RTKTsKKwkJCQlTdGF0dXMgJj0gU1RTX0VSUk9SX01BU0s7CisJCQkJLyogU2hvd0luaXRpYWxpc2F0aW9uRXJyb3JDb2RlKFN0YXR1cyk7ICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXR1cyBlcnJvcjogJWRcbiIsIGRldi0+bmFtZSwgU3RhdHVzKTsKKwkJCQlyZXR1cm4gKC0xKTsgLyogVW5yZWNvdmVyYWJsZSBlcnJvciAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHJldHJ5X2NudCA+IDApCisJCQkJeworCQkJCQkvKiBSZXNldCBhZGFwdGVyIGFuZCB0cnkgaW5pdCBhZ2FpbiAqLworCQkJCQl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIEVYRUNfU09GVF9SRVNFVCk7CisJCQkJCXRtczM4MHRyX3dhaXQoSEFMRl9TRUNPTkQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUocmV0cnlfY250ID4gMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUmV0cnkgZXhjZWVkZWRcbiIsIGRldi0+bmFtZSk7CisJcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBDaGVjayBmb3Igb3V0c3RhbmRpbmcgY29tbWFuZHMgaW4gY29tbWFuZCBxdWV1ZSBhbmQgdHJpZXMgdG8gZXhlY3V0ZQorICogY29tbWFuZCBpbW1lZGlhdGVseS4gQ29ycmVzcG9uZGluZyBjb21tYW5kIGZsYWcgaW4gY29tbWFuZCBxdWV1ZSBpcyBjbGVhcmVkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jaGtfb3V0c3RhbmRpbmdfY21kcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIEFkZHIgPSAwOworCisJaWYodHAtPkNNRHF1ZXVlID09IDApCisJCXJldHVybjsJCS8qIE5vIGNvbW1hbmQgZXhlY3V0aW9uICovCisKKwkvKiBJZiBTQ0IgaW4gdXNlOiBubyBjb21tYW5kICovCisJaWYodHAtPlNjYkluVXNlID09IDEpCisJCXJldHVybjsKKworCS8qIENoZWNrIGlmIGFkYXB0ZXIgaXMgb3BlbmVkLCBhdm9pZGluZyBDT01NQU5EX1JFSkVDVAorCSAqIGludGVycnVwdCBieSB0aGUgYWRhcHRlciEKKwkgKi8KKwlpZih0cC0+QWRhcHRlck9wZW5GbGFnID09IDApCisJeworCQlpZih0cC0+Q01EcXVldWUgJiBPQ19PUEVOKQorCQl7CisJCQkvKiBFeGVjdXRlIE9QRU4gY29tbWFuZAkqLworCQkJdHAtPkNNRHF1ZXVlIF49IE9DX09QRU47CisKKwkJCUFkZHIgPSBodG9ubCgoKGNoYXIgKikmdHAtPm9jcGwgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKEFkZHIpOworCQkJdHAtPnNjYi5QYXJtWzFdID0gSElXT1JEKEFkZHIpOworCQkJdHAtPnNjYi5DTUQgPSBPUEVOOworCQl9CisJCWVsc2UKKwkJCS8qIE5vIE9QRU4gY29tbWFuZCBxdWV1ZWQsIGJ1dCBhZGFwdGVyIGNsb3NlZC4gTm90ZToKKwkJCSAqIFdlJ2xsIHRyeSB0byByZS1vcGVuIHRoZSBhZGFwdGVyIGluIERyaXZlclBvbGwoKQorCQkJICovCisJCQlyZXR1cm47CQkvKiBObyBhZGFwdGVyIGNvbW1hbmQgaXNzdWVkICovCisJfQorCWVsc2UKKwl7CisJCS8qIEFkYXB0ZXIgaXMgb3BlbjsgZXZhbHVhdGUgY29tbWFuZCBxdWV1ZTogdHJ5IHRvIGV4ZWN1dGUKKwkJICogb3V0c3RhbmRpbmcgY29tbWFuZHMgKGRlcGVuZGluZyBvbiBwcmlvcml0eSEpIENMT1NFCisJCSAqIGNvbW1hbmQgcXVldWVkCisJCSAqLworCQlpZih0cC0+Q01EcXVldWUgJiBPQ19DTE9TRSkKKwkJeworCQkJdHAtPkNNRHF1ZXVlIF49IE9DX0NMT1NFOworCQkJdHAtPkFkYXB0ZXJPcGVuRmxhZyA9IDA7CisJCQl0cC0+c2NiLlBhcm1bMF0gPSAwOyAvKiBQYXJtWzBdLCBQYXJtWzFdIGFyZSBpZ25vcmVkICovCisJCQl0cC0+c2NiLlBhcm1bMV0gPSAwOyAvKiBidXQgc2hvdWxkIGJlIHNldCB0byB6ZXJvISAqLworCQkJdHAtPnNjYi5DTUQgPSBDTE9TRTsKKwkJCWlmKCF0cC0+SGFsdEluUHJvZ3Jlc3MpCisJCQkJdHAtPkNNRHF1ZXVlIHw9IE9DX09QRU47IC8qIHJlLW9wZW4gYWRhcHRlciAqLworCQkJZWxzZQorCQkJCXRwLT5DTURxdWV1ZSA9IDA7CS8qIG5vIG1vcmUgY29tbWFuZHMgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1JFQ0VJVkUpCisJCQl7CisJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1JFQ0VJVkU7CisJCQkJQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5ScGxIZWFkIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQoQWRkcik7CisJCQkJdHAtPnNjYi5QYXJtWzFdID0gSElXT1JEKEFkZHIpOworCQkJCXRwLT5zY2IuQ01EID0gUkVDRUlWRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19UUkFOU01JVF9IQUxUKQorCQkJCXsKKwkJCQkJLyogTk9URTogVFJBTlNNSVQuSEFMVCBtdXN0IGJlIGNoZWNrZWQgCisJCQkJCSAqIGJlZm9yZSBUUkFOU01JVC4KKwkJCQkJICovCisJCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19UUkFOU01JVF9IQUxUOworCQkJCQl0cC0+c2NiLkNNRCA9IFRSQU5TTUlUX0hBTFQ7CisKKwkJCQkJLyogUGFybVswXSBhbmQgUGFybVsxXSBhcmUgaWdub3JlZAorCQkJCQkgKiBidXQgc2hvdWxkIGJlIHNldCB0byB6ZXJvIQorCQkJCQkgKi8KKwkJCQkJdHAtPnNjYi5QYXJtWzBdID0gMDsKKwkJCQkJdHAtPnNjYi5QYXJtWzFdID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYodHAtPkNNRHF1ZXVlICYgT0NfVFJBTlNNSVQpCisJCQkJCXsKKwkJCQkJCS8qIE5PVEU6IFRSQU5TTUlUIG11c3QgYmUgCisJCQkJCQkgKiBjaGVja2VkIGFmdGVyIFRSQU5TTUlULkhBTFQKKwkJCQkJCSAqLworCQkJCQkJaWYodHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSkKKwkJCQkJCXsKKwkJCQkJCQlpZighdHAtPlRyYW5zbWl0SGFsdFNjaGVkdWxlZCkKKwkJCQkJCQl7CisJCQkJCQkJCXRwLT5UcmFuc21pdEhhbHRTY2hlZHVsZWQgPSAxOworCQkJCQkJCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1RSQU5TTUlUX0hBTFQpIDsKKwkJCQkJCQl9CisJCQkJCQkJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDA7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCisJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfVFJBTlNNSVQ7CisJCQkJCQl0bXMzODB0cl9jYW5jZWxfdHhfcXVldWUodHApOworCQkJCQkJQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5UcGxCdXN5IC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQkJCXRwLT5zY2IuUGFybVswXSA9IExPV09SRChBZGRyKTsKKwkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCQkJCXRwLT5zY2IuQ01EID0gVFJBTlNNSVQ7CisJCQkJCQl0cC0+VHJhbnNtaXRDb21tYW5kQWN0aXZlID0gMTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX01PRElGWV9PUEVOX1BBUk1TKQorCQkJCQkJeworCQkJCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19NT0RJRllfT1BFTl9QQVJNUzsKKwkJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSB0cC0+b2NwbC5PUEVOT3B0aW9uczsgLyogbmV3IE9QRU4gb3B0aW9ucyovCisJCQkJCQkJdHAtPnNjYi5QYXJtWzBdIHw9IEVOQUJMRV9GVUxMX0RVUExFWF9TRUxFQ1RJT047CisJCQkJCQkJdHAtPnNjYi5QYXJtWzFdID0gMDsgLyogaXMgaWdub3JlZCBidXQgc2hvdWxkIGJlIHplcm8gKi8KKwkJCQkJCQl0cC0+c2NiLkNNRCA9IE1PRElGWV9PUEVOX1BBUk1TOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1NFVF9GVU5DVF9BRERSKQorCQkJCQkJCXsKKwkJCQkJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1NFVF9GVU5DVF9BRERSOworCQkJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQodHAtPm9jcGwuRnVuY3RBZGRyKTsKKwkJCQkJCQkJdHAtPnNjYi5QYXJtWzFdID0gSElXT1JEKHRwLT5vY3BsLkZ1bmN0QWRkcik7CisJCQkJCQkJCXRwLT5zY2IuQ01EID0gU0VUX0ZVTkNUX0FERFI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1NFVF9HUk9VUF9BRERSKQorCQkJCQkJCQl7CisJCQkJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfU0VUX0dST1VQX0FERFI7CisJCQkJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQodHAtPm9jcGwuR3JvdXBBZGRyKTsKKwkJCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRCh0cC0+b2NwbC5Hcm91cEFkZHIpOworCQkJCQkJCQkJdHAtPnNjYi5DTUQgPSBTRVRfR1JPVVBfQUREUjsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1JFQURfRVJST1JfTE9HKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19SRUFEX0VSUk9SX0xPRzsKKwkJCQkJCQkJCQlBZGRyID0gaHRvbmwoKChjaGFyICopJnRwLT5lcnJvcmxvZ3RhYmxlIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQkJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQoQWRkcik7CisJCQkJCQkJCQkJdHAtPnNjYi5QYXJtWzFdID0gSElXT1JEKEFkZHIpOworCQkJCQkJCQkJCXRwLT5zY2IuQ01EID0gUkVBRF9FUlJPUl9MT0c7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hlY2tGb3JPdXRzdGFuZGluZ0NvbW1hbmQ6IHVua25vd24gQ29tbWFuZFxuIik7CisJCQkJCQkJCQkJdHAtPkNNRHF1ZXVlID0gMDsKKwkJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl0cC0+U2NiSW5Vc2UgPSAxOwkvKiBTZXQgc2VtYXBob3JlOiBTQ0IgaW4gdXNlLiAqLworCisJLyogRXhlY3V0ZSBTQ0IgYW5kIGdlbmVyYXRlIElSUSB3aGVuIGRvbmUuICovCisJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBDTURfRVhFQ1VURSB8IENNRF9TQ0JfUkVRVUVTVCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJUlEgY29uZGl0aW9uczogc2lnbmFsIGxvc3Mgb24gdGhlIHJpbmcsIHRyYW5zbWl0IG9yIHJlY2VpdmUgb2YgYmVhY29uCisgKiBmcmFtZXMgKGRpc2FibGVkIGlmIGJpdCAxIG9mIE9QRU4gb3B0aW9uIGlzIHNldCk7IHJlcG9ydCBlcnJvciBNQUMKKyAqIGZyYW1lIHRyYW5zbWl0IChkaXNhYmxlZCBpZiBiaXQgMiBvZiBPUEVOIG9wdGlvbiBpcyBzZXQpOyBvcGVuIG9yIHNob3J0CisgKiBjaXJjdWl0IGZhdWx0IG9uIHRoZSBsb2JlIGlzIGRldGVjdGVkOyByZW1vdmUgTUFDIGZyYW1lIHJlY2VpdmVkOworICogZXJyb3IgY291bnRlciBvdmVyZmxvdyAoMjU1KTsgb3BlbmVkIGFkYXB0ZXIgaXMgdGhlIG9ubHkgc3RhdGlvbiBpbiByaW5nLgorICogQWZ0ZXIgc29tZSBvZiB0aGUgSVJRcyB0aGUgYWRhcHRlciBpcyBjbG9zZWQhCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3Jpbmdfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5DdXJyZW50UmluZ1N0YXR1cyA9IGJlMTZfdG9fY3B1KCh1bnNpZ25lZCBzaG9ydCl0cC0+c3NiLlBhcm1bMF0pOworCisJLyogRmlyc3Q6IGZpbGwgdXAgc3RhdGlzdGljcyAqLworCWlmKHRwLT5zc2IuUGFybVswXSAmIFNJR05BTF9MT1NTKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpZ25hbCBMb3NzXG4iLCBkZXYtPm5hbWUpOworCQl0cC0+TWFjU3RhdC5saW5lX2Vycm9ycysrOworCX0KKworCS8qIEFkYXB0ZXIgaXMgY2xvc2VkLCBidXQgaW5pdGlhbGl6ZWQgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBMT0JFX1dJUkVfRkFVTFQpCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTG9iZSBXaXJlIEZhdWx0LCBSZW9wZW4gQWRhcHRlclxuIiwgCisJCQlkZXYtPm5hbWUpOworCQl0cC0+TWFjU3RhdC5saW5lX2Vycm9ycysrOworCX0KKworCWlmKHRwLT5zc2IuUGFybVswXSAmIFJJTkdfUkVDT1ZFUlkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIFJlY292ZXJ5XG4iLCBkZXYtPm5hbWUpOworCisJLyogQ291bnRlciBvdmVyZmxvdzogcmVhZCBlcnJvciBsb2cgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBDT1VOVEVSX09WRVJGTE9XKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvdW50ZXIgT3ZlcmZsb3dcbiIsIGRldi0+bmFtZSk7CisJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfUkVBRF9FUlJPUl9MT0cpOworCX0KKworCS8qIEFkYXB0ZXIgaXMgY2xvc2VkLCBidXQgaW5pdGlhbGl6ZWQgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBSRU1PVkVfUkVDRUlWRUQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZW1vdmUgUmVjZWl2ZWQsIFJlb3BlbiBBZGFwdGVyXG4iLCAKKwkJCWRldi0+bmFtZSk7CisKKwkvKiBBZGFwdGVyIGlzIGNsb3NlZCwgYnV0IGluaXRpYWxpemVkICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgQVVUT19SRU1PVkFMX0VSUk9SKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQXV0byBSZW1vdmFsIEVycm9yLCBSZW9wZW4gQWRhcHRlclxuIiwgCisJCQlkZXYtPm5hbWUpOworCisJaWYodHAtPnNzYi5QYXJtWzBdICYgSEFSRF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhcmQgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBTT0ZUX0VSUk9SKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogU29mdCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKworCWlmKHRwLT5zc2IuUGFybVswXSAmIFRSQU5TTUlUX0JFQUNPTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0IEJlYWNvblxuIiwgZGV2LT5uYW1lKTsKKworCWlmKHRwLT5zc2IuUGFybVswXSAmIFNJTkdMRV9TVEFUSU9OKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogU2luZ2xlIFN0YXRpb25cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBDaGVjayBpZiBhZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCAqLworCWlmKHRwLT5zc2IuUGFybVswXSAmIEFEQVBURVJfQ0xPU0VEKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkYXB0ZXIgY2xvc2VkIChSZW9wZW5pbmcpLCIgCisJCQkiQ3VycmVudFJpbmdTdGF0ICV4XG4iLAorCQkJZGV2LT5uYW1lLCB0cC0+Q3VycmVudFJpbmdTdGF0dXMpOworCQl0cC0+QWRhcHRlck9wZW5GbGFnID0gMDsKKwkJdG1zMzgwdHJfb3Blbl9hZGFwdGVyKGRldik7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogSXNzdWVkIGlmIGFkYXB0ZXIgaGFzIGVuY291bnRlcmVkIGFuIHVucmVjb3ZlcmFibGUgaGFyZHdhcmUKKyAqIG9yIHNvZnR3YXJlIGVycm9yLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jaGtfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgQWRhcHRlckNoZWNrQmxvY2tbNF07CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdHAtPkFkYXB0ZXJPcGVuRmxhZyA9IDA7CS8qIEFkYXB0ZXIgY2xvc2VkIG5vdyAqLworCisJLyogUGFnZSBudW1iZXIgb2YgYWRhcHRlciBtZW1vcnkgKi8KKwlTSUZXUklURVcoMHgwMDAxLCBTSUZBRFgpOworCS8qIEFkZHJlc3Mgb2Zmc2V0ICovCisJU0lGV1JJVEVXKENIRUNLQUREUiwgU0lGQURSKTsKKworCS8qIFJlYWRpbmcgOCBieXRlIGFkYXB0ZXIgY2hlY2sgYmxvY2suICovCisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlBZGFwdGVyQ2hlY2tCbG9ja1tpXSA9IFNJRlJFQURXKFNJRklOQyk7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFkYXB0ZXJDaGVja0Jsb2NrOiAiLCBkZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcHJpbnRrKCIlMDRYIiwgQWRhcHRlckNoZWNrQmxvY2tbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCisJc3dpdGNoKEFkYXB0ZXJDaGVja0Jsb2NrWzBdKQorCXsKKwkJY2FzZSBESU9fUEFSSVRZOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERJTyBwYXJpdHkgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIERNQV9SRUFEX0FCT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgRE1BIHJlYWQgb3BlcmF0aW9uIGFib3J0ZWQ6XG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlzd2l0Y2ggKEFkYXB0ZXJDaGVja0Jsb2NrWzFdKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZW91dFxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbM10pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGFyaXR5IGVycm9yXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRkcmVzczogJTA0WCAlMDRYXG4iLAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbMl0sIAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbM10pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMjogCisJCQkJCXByaW50ayhLRVJOX0lORk8gIkJ1cyBlcnJvclxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIGVycm9yLlxuIik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBETUFfV1JJVEVfQUJPUlQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRE1BIHdyaXRlIG9wZXJhdGlvbiBhYm9ydGVkOiBcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCXN3aXRjaCAoQWRhcHRlckNoZWNrQmxvY2tbMV0pCisJCQl7CisJCQkJY2FzZSAwOiAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZW91dFxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE6IAorCQkJCQlwcmludGsoS0VSTl9JTkZPICJQYXJpdHkgZXJyb3JcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwgCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1szXSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAyOiAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQnVzIGVycm9yXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRkcmVzczogJTA0WCAlMDRYXG4iLAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbMl0sIAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbM10pOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gZXJyb3IuXG4iKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElMTEVHQUxfT1BfQ09ERToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbGxlZ2FsIG9wZXJhdGlvbiBjb2RlIGluIGZpcm13YXJlXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQkvKiBQYXJtWzAtM106IGFkYXB0ZXIgaW50ZXJuYWwgcmVnaXN0ZXIgUjEzLVIxNSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBQQVJJVFlfRVJST1JTOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkYXB0ZXIgaW50ZXJuYWwgYnVzIHBhcml0eSBlcnJvclxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUkFNX0RBVEFfRVJST1I6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUkFNIGRhdGEgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBQYXJtWzAtMV06IE1TVy9MU1cgYWRkcmVzcyBvZiBSQU0gbG9jYXRpb24uICovCisJCQlicmVhazsKKworCQljYXNlIFJBTV9QQVJJVFlfRVJST1I6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUkFNIHBhcml0eSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0xXTogTVNXL0xTVyBhZGRyZXNzIG9mIFJBTSBsb2NhdGlvbi4gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUklOR19VTkRFUlJVTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcm5hbCBETUEgdW5kZXJydW4gZGV0ZWN0ZWRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5WQUxJRF9JUlE6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5yZWNvZ25pemVkIGludGVycnVwdCBkZXRlY3RlZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgSU5WQUxJRF9FUlJPUl9JUlE6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5yZWNvZ25pemVkIGVycm9yIGludGVycnVwdCBkZXRlY3RlZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgSU5WQUxJRF9YT1A6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5yZWNvZ25pemVkIFhPUCByZXF1ZXN0IGRldGVjdGVkXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQkvKiBQYXJtWzAtM106IGFkYXB0ZXIgaW50ZXJuYWwgcmVnaXN0ZXIgUjEzLVIxNSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmtub3duIHN0YXR1cyIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwl9CisKKwlpZih0bXMzODB0cl9jaGlwc2V0X2luaXQoZGV2KSA9PSAxKQorCXsKKwkJLyogUmVzdGFydCBvZiBmaXJtd2FyZSBzdWNjZXNzZnVsICovCisJCXRwLT5BZGFwdGVyT3BlbkZsYWcgPSAxOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIEludGVybmFsIGFkYXB0ZXIgcG9pbnRlciB0byBSQU0gZGF0YSBhcmUgY29waWVkIGZyb20gYWRhcHRlciBpbnRvCisgKiBob3N0IHN5c3RlbS4KKyAqLworc3RhdGljIGludCB0bXMzODB0cl9yZWFkX3B0cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBhZGFwdGVycmFtOworCisJdG1zMzgwdHJfcmVhZF9yYW0oZGV2LCAodW5zaWduZWQgY2hhciAqKSZ0cC0+aW50cHRycy5CdXJuZWRJbkFkZHJQdHIsCisJCQlBREFQVEVSX0lOVF9QVFJTLCAxNik7CisJdG1zMzgwdHJfcmVhZF9yYW0oZGV2LCAodW5zaWduZWQgY2hhciAqKSZhZGFwdGVycmFtLAorCQkJY3B1X3RvX2JlMTYoKHVuc2lnbmVkIHNob3J0KXRwLT5pbnRwdHJzLkFkYXB0ZXJSQU1QdHIpLCAyKTsKKwlyZXR1cm4gYmUxNl90b19jcHUoYWRhcHRlcnJhbSk7IAorfQorCisvKgorICogUmVhZHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhZGFwdGVyIHRvIHN5c3RlbSBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3JlYWRfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKkRhdGEsCisJCQkJdW5zaWduZWQgc2hvcnQgQWRkcmVzcywgaW50IExlbmd0aCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBvbGRfc2lmYWR4LCBvbGRfc2lmYWRyLCBJbldvcmQ7CisKKwkvKiBTYXZlIHRoZSBjdXJyZW50IHZhbHVlcyAqLworCW9sZF9zaWZhZHggPSBTSUZSRUFEVyhTSUZBRFgpOworCW9sZF9zaWZhZHIgPSBTSUZSRUFEVyhTSUZBRFIpOworCisJLyogUGFnZSBudW1iZXIgb2YgYWRhcHRlciBtZW1vcnkgKi8KKwlTSUZXUklURVcoMHgwMDAxLCBTSUZBRFgpOworCS8qIEFkZHJlc3Mgb2Zmc2V0IGluIGFkYXB0ZXIgUkFNICovCisgICAgICAgIFNJRldSSVRFVyhBZGRyZXNzLCBTSUZBRFIpOworCisJLyogQ29weSBsZW4gYnl0ZSBmcm9tIGFkYXB0ZXIgbWVtb3J5IHRvIHN5c3RlbSBkYXRhIGFyZWEuICovCisJaSA9IDA7CisJZm9yKDs7KQorCXsKKwkJSW5Xb3JkID0gU0lGUkVBRFcoU0lGSU5DKTsKKworCQkqKERhdGEgKyBpKSA9IEhJQllURShJbldvcmQpOwkvKiBXcml0ZSBmaXJzdCBieXRlICovCisJCWlmKCsraSA9PSBMZW5ndGgpCQkvKiBBbGwgaXMgZG9uZSBicmVhayAqLworCQkJYnJlYWs7CisKKwkJKihEYXRhICsgaSkgPSBMT0JZVEUoSW5Xb3JkKTsJLyogV3JpdGUgc2Vjb25kIGJ5dGUgKi8KKwkJaWYgKCsraSA9PSBMZW5ndGgpCQkvKiBBbGwgaXMgZG9uZSBicmVhayAqLworCQkJYnJlYWs7CisJfQorCisJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXMgKi8KKwlTSUZXUklURVcob2xkX3NpZmFkeCwgU0lGQURYKTsKKwlTSUZXUklURVcob2xkX3NpZmFkciwgU0lGQURSKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIENhbmNlbCBhbGwgcXVldWVkIHBhY2tldHMgaW4gdGhlIHRyYW5zbWlzc2lvbiBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfY2FuY2VsX3R4X3F1ZXVlKHN0cnVjdCBuZXRfbG9jYWwqIHRwKQoreworCVRQTCAqdHBsOworCisJLyoKKwkgKiBOT1RFOiBUaGVyZSBtdXN0IG5vdCBiZSBhbiBhY3RpdmUgVFJBTlNNSVQgY29tbWFuZCBwZW5kaW5nLCB3aGVuCisJICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisJICovCisJaWYodHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSkKKwkJcmV0dXJuOworCisJZm9yKDs7KQorCXsKKwkJdHBsID0gdHAtPlRwbEJ1c3k7CisJCWlmKCF0cGwtPkJ1c3lGbGFnKQorCQkJYnJlYWs7CisJCS8qICJSZW1vdmUiIFRQTCBmcm9tIGJ1c3kgbGlzdC4gKi8KKwkJdHAtPlRwbEJ1c3kgPSB0cGwtPk5leHRUUExQdHI7CisJCXRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXModHBsLCAwKTsJLyogQ2xlYXIgVkFMSUQgYml0ICovCisJCXRwbC0+QnVzeUZsYWcgPSAwOwkJLyogImZyZWUiIFRQTCAqLworCisJCXByaW50ayhLRVJOX0lORk8gIkNhbmNlbCB0eCAoJTA4bFhoKS5cbiIsICh1bnNpZ25lZCBsb25nKXRwbCk7CisJCWlmICh0cGwtPkRNQUJ1ZmYpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cGwtPkRNQUJ1ZmYsIHRwbC0+U2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueSh0cGwtPlNrYik7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0cmFuc21pdCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJ5IHRoZQorICogYWRhcHRlci4gRm9yIGEgY29tbWFuZCBjb21wbGV0ZSBpbnRlcnJ1cHQsIGl0IGlzIGNoZWNrZWQgaWYgd2UgaGF2ZSB0bworICogaXNzdWUgYSBuZXcgdHJhbnNtaXQgY29tbWFuZCBvciBub3QuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3R4X3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciBIaWdoQnl0ZSwgSGlnaEFjLCBMb3dBYzsKKwlUUEwgKnRwbDsKKworCS8qIE5PVEU6IEF0IHRoaXMgcG9pbnQgdGhlIFNTQiBmcm9tIFRSQU5TTUlUIFNUQVRVUyBpcyBubyBsb25nZXIKKwkgKiBhdmFpbGFibGUsIGJlY2F1c2UgdGhlIENMRUFSIFNTQiBjb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLgorCSAqCisJICogUHJvY2VzcyBhbGwgY29tcGxldGUgdHJhbnNtaXNzaW9ucy4KKwkgKi8KKworCWZvcig7OykKKwl7CisJCXRwbCA9IHRwLT5UcGxCdXN5OworCQlpZighdHBsLT5CdXN5RmxhZyB8fCAodHBsLT5TdGF0dXMKKwkJCSYgKFRYX1ZBTElEIHwgVFhfRlJBTUVfQ09NUExFVEUpKQorCQkJIT0gVFhfRlJBTUVfQ09NUExFVEUpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogIlJlbW92ZSIgVFBMIGZyb20gYnVzeSBsaXN0LiAqLworCQl0cC0+VHBsQnVzeSA9IHRwbC0+TmV4dFRQTFB0ciA7CisKKwkJLyogQ2hlY2sgdGhlIHRyYW5zbWl0IHN0YXR1cyBmaWVsZCBvbmx5IGZvciBkaXJlY3RlZCBmcmFtZXMqLworCQlpZihESVJFQ1RFRF9GUkFNRSh0cGwpICYmICh0cGwtPlN0YXR1cyAmIFRYX0VSUk9SKSA9PSAwKQorCQl7CisJCQlIaWdoQnl0ZSA9IEdFVF9UUkFOU01JVF9TVEFUVVNfSElHSF9CWVRFKHRwbC0+U3RhdHVzKTsKKwkJCUhpZ2hBYyAgID0gR0VUX0ZSQU1FX1NUQVRVU19ISUdIX0FDKEhpZ2hCeXRlKTsKKwkJCUxvd0FjICAgID0gR0VUX0ZSQU1FX1NUQVRVU19MT1dfQUMoSGlnaEJ5dGUpOworCisJCQlpZigoSGlnaEFjICE9IExvd0FjKSB8fCAoSGlnaEFjID09IEFDX05PVF9SRUNPR05JWkVEKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IChEQT0lMDhsWCBub3QgcmVjb2duaXplZClcbiIsCisJCQkJCWRldi0+bmFtZSwKKwkJCQkJKih1bnNpZ25lZCBsb25nICopJnRwbC0+TURhdGFbMisyXSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERpcmVjdGVkIGZyYW1lIHR4J2RcbiIsIAorCQkJCQkJZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCFESVJFQ1RFRF9GUkFNRSh0cGwpKQorCQkJeworCQkJCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBCcm9hZGNhc3QgZnJhbWUgdHgnZFxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQl9CisJCX0KKworCQl0cC0+TWFjU3RhdC50eF9wYWNrZXRzKys7CisJCWlmICh0cGwtPkRNQUJ1ZmYpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cGwtPkRNQUJ1ZmYsIHRwbC0+U2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2lycSh0cGwtPlNrYik7CisJCXRwbC0+QnVzeUZsYWcgPSAwOwkvKiAiZnJlZSIgVFBMICovCisJfQorCisJaWYoIXRwLT5UcGxGcmVlLT5OZXh0VFBMUHRyLT5CdXN5RmxhZykKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybjsKK30KKworLyoKKyAqIENhbGxlZCBpZiBhIGZyYW1lIHJlY2VpdmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlci4KKyAqIENoZWNrIGlmIHRoZSBmcmFtZSBpcyB2YWxpZCBhbmQgaW5kaWNhdGUgaXQgdG8gc3lzdGVtLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9yY3Zfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICpSZWNlaXZlRGF0YVB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBMZW5ndGgsIExlbmd0aDI7CisJUlBMICpycGw7CisJUlBMICpTYXZlSGVhZDsKKwlkbWFfYWRkcl90IGRtYWJ1ZjsKKworCS8qIE5PVEU6IEF0IHRoaXMgcG9pbnQgdGhlIFNTQiBmcm9tIFJFQ0VJVkUgU1RBVFVTIGlzIG5vIGxvbmdlcgorCSAqIGF2YWlsYWJsZSwgYmVjYXVzZSB0aGUgQ0xFQVIgU1NCIGNvbW1hbmQgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQuCisJICoKKwkgKiBQcm9jZXNzIGFsbCBjb21wbGV0ZSByZWNlaXZlcy4KKwkgKi8KKworCWZvcig7OykKKwl7CisJCXJwbCA9IHRwLT5ScGxIZWFkOworCQlpZihycGwtPlN0YXR1cyAmIFJYX1ZBTElEKQorCQkJYnJlYWs7CQkvKiBSUEwgc3RpbGwgaW4gdXNlIGJ5IGFkYXB0ZXIgKi8KKworCQkvKiBGb3J3YXJkIFJQTEhlYWQgcG9pbnRlciB0byBuZXh0IGxpc3QuICovCisJCVNhdmVIZWFkID0gdHAtPlJwbEhlYWQ7CisJCXRwLT5ScGxIZWFkID0gcnBsLT5OZXh0UlBMUHRyOworCisJCS8qIEdldCB0aGUgZnJhbWUgc2l6ZSAoQnl0ZSBzd2FwIGZvciBJbnRlbCkuCisJCSAqIERvIHRoaXMgZWFybHkgKHNlZSB3b3JrYXJvdW5kIGNvbW1lbnQgYmVsb3cpCisJCSAqLworCQlMZW5ndGggPSBiZTE2X3RvX2NwdSgodW5zaWduZWQgc2hvcnQpcnBsLT5GcmFtZVNpemUpOworCisJCS8qIENoZWNrIGlmIHRoZSBGcmFtZV9TdGFydCwgRnJhbWVfRW5kIGFuZAorCQkgKiBGcmFtZV9Db21wbGV0ZSBiaXRzIGFyZSBzZXQuCisJCSAqLworCQlpZigocnBsLT5TdGF0dXMgJiBWQUxJRF9TSU5HTEVfQlVGRkVSX0ZSQU1FKQorCQkJPT0gVkFMSURfU0lOR0xFX0JVRkZFUl9GUkFNRSkKKwkJeworCQkJUmVjZWl2ZURhdGFQdHIgPSBycGwtPk1EYXRhOworCisJCQkvKiBXb3JrYXJvdW5kIGZvciBkZWxheWVkIHdyaXRlIG9mIEZyYW1lU2l6ZSBvbiBJU0EKKwkJCSAqIChGcmFtZVNpemUgaXMgZmFsc2UgYnV0IHZhbGlkLWJpdCBpcyByZXNldCkKKwkJCSAqIEZyYW1lIHNpemUgaXMgc2V0IHRvIHplcm8gd2hlbiB0aGUgUlBMIGlzIGZyZWVkLgorCQkJICogTGVuZ3RoMiBpcyB0aGVyZSBiZWNhdXNlIHRoZXJlIGhhdmUgYWxzbyBiZWVuCisJCQkgKiBjYXNlcyB3aGVyZSB0aGUgRnJhbWVTaXplIHdhcyBwYXJ0aWFsbHkgd3JpdHRlbgorCQkJICovCisJCQlMZW5ndGgyID0gYmUxNl90b19jcHUoKHVuc2lnbmVkIHNob3J0KXJwbC0+RnJhbWVTaXplKTsKKworCQkJaWYoTGVuZ3RoID09IDAgfHwgTGVuZ3RoICE9IExlbmd0aDIpCisJCQl7CisJCQkJdHAtPlJwbEhlYWQgPSBTYXZlSGVhZDsKKwkJCQlicmVhazsJLyogUmV0dXJuIHRvIHRtczM4MHRyX2ludGVycnVwdCAqLworCQkJfQorCQkJdG1zMzgwdHJfdXBkYXRlX3Jjdl9zdGF0cyh0cCxSZWNlaXZlRGF0YVB0cixMZW5ndGgpOworCQkJICAKKwkJCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBhY2tldCBMZW5ndGggJTA0WCAoJWQpXG4iLAorCQkJCQlkZXYtPm5hbWUsIExlbmd0aCwgTGVuZ3RoKTsKKwkJCSAgCisJCQkvKiBJbmRpY2F0ZSB0aGUgcmVjZWl2ZWQgZnJhbWUgdG8gc3lzdGVtIHRoZQorCQkJICogYWRhcHRlciBkb2VzIHRoZSBTb3VyY2UtUm91dGluZyBwYWRkaW5nIGZvciAKKwkJCSAqIHVzLiBTZWU6IE9wZW5PcHRpb25zIGluIHRtczM4MHRyX2luaXRfb3BiKCkKKwkJCSAqLworCQkJc2tiID0gcnBsLT5Ta2I7CisJCQlpZihycGwtPlNrYlN0YXQgPT0gU0tCX1VOQVZBSUxBQkxFKQorCQkJeworCQkJCS8qIFRyeSBhZ2FpbiB0byBhbGxvY2F0ZSBza2IgKi8KKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHRwLT5NYXhQYWNrZXRTaXplKTsKKwkJCQlpZihza2IgPT0gTlVMTCkKKwkJCQl7CisJCQkJCS8qIFVwZGF0ZSBTdGF0cyA/PyAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlza2ItPmRldgk9IGRldjsKKwkJCQkJc2tiX3B1dChza2IsIHRwLT5NYXhQYWNrZXRTaXplKTsKKwkJCQkJcnBsLT5Ta2JTdGF0IAk9IFNLQl9EQVRBX0NPUFk7CisJCQkJCVJlY2VpdmVEYXRhUHRyIAk9IHJwbC0+TURhdGE7CisJCQkJfQorCQkJfQorCisJCQlpZihza2IgJiYgKHJwbC0+U2tiU3RhdCA9PSBTS0JfREFUQV9DT1BZCisJCQkJfHwgcnBsLT5Ta2JTdGF0ID09IFNLQl9ETUFfRElSRUNUKSkKKwkJCXsKKwkJCQlpZihycGwtPlNrYlN0YXQgPT0gU0tCX0RBVEFfQ09QWSkKKwkJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgUmVjZWl2ZURhdGFQdHIsIExlbmd0aCk7CisKKwkJCQkvKiBEZWxpdmVyIGZyYW1lIHRvIHN5c3RlbSAqLworCQkJCXJwbC0+U2tiID0gTlVMTDsKKwkJCQlza2JfdHJpbShza2IsTGVuZ3RoKTsKKwkJCQlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl9CisJCX0KKwkJZWxzZQkvKiBJbnZhbGlkIGZyYW1lICovCisJCXsKKwkJCWlmKHJwbC0+U2tiICE9IE5VTEwpCisJCQkJZGV2X2tmcmVlX3NrYl9pcnEocnBsLT5Ta2IpOworCisJCQkvKiBTa2lwIGxpc3QuICovCisJCQlpZihycGwtPlN0YXR1cyAmIFJYX1NUQVJUX0ZSQU1FKQorCQkJCS8qIEZyYW1lIHN0YXJ0IGJpdCBpcyBzZXQgLT4gb3ZlcmZsb3cuICovCisJCQkJdHAtPk1hY1N0YXQucnhfZXJyb3JzKys7CisJCX0KKwkJaWYgKHJwbC0+RE1BQnVmZikKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHJwbC0+RE1BQnVmZiwgdHAtPk1heFBhY2tldFNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlycGwtPkRNQUJ1ZmYgPSAwOworCisJCS8qIEFsbG9jYXRlIG5ldyBza2IgZm9yIHJwbCAqLworCQlycGwtPlNrYiA9IGRldl9hbGxvY19za2IodHAtPk1heFBhY2tldFNpemUpOworCQkvKiBza2IgPT0gTlVMTCA/IHRoZW4gdXNlIGxvY2FsIGJ1ZmZlciAqLworCQlpZihycGwtPlNrYiA9PSBOVUxMKQorCQl7CisJCQlycGwtPlNrYlN0YXQgPSBTS0JfVU5BVkFJTEFCTEU7CisJCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCXJwbC0+TURhdGEgPSB0cC0+TG9jYWxSeEJ1ZmZlcnNbcnBsLT5SUExJbmRleF07CisJCX0KKwkJZWxzZQkvKiBza2IgIT0gTlVMTCAqLworCQl7CisJCQlycGwtPlNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3B1dChycGwtPlNrYiwgdHAtPk1heFBhY2tldFNpemUpOworCisJCQkvKiBEYXRhIHVucmVhY2hhYmxlIGZvciBETUEgPyB0aGVuIHVzZSBsb2NhbCBidWZmZXIgKi8KKwkJCWRtYWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBycGwtPlNrYi0+ZGF0YSwgdHAtPk1heFBhY2tldFNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlpZih0cC0+ZG1hbGltaXQgJiYgKGRtYWJ1ZiArIHRwLT5NYXhQYWNrZXRTaXplID4gdHAtPmRtYWxpbWl0KSkKKwkJCXsKKwkJCQlycGwtPlNrYlN0YXQgPSBTS0JfREFUQV9DT1BZOworCQkJCXJwbC0+RnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+TG9jYWxSeEJ1ZmZlcnNbcnBsLT5SUExJbmRleF0gLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCQkJCXJwbC0+TURhdGEgPSB0cC0+TG9jYWxSeEJ1ZmZlcnNbcnBsLT5SUExJbmRleF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogRE1BIGRpcmVjdGx5IGluIHNrYi0+ZGF0YSAqLworCQkJCXJwbC0+U2tiU3RhdCA9IFNLQl9ETUFfRElSRUNUOworCQkJCXJwbC0+RnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubChkbWFidWYpOworCQkJCXJwbC0+TURhdGEgPSBycGwtPlNrYi0+ZGF0YTsKKwkJCQlycGwtPkRNQUJ1ZmYgPSBkbWFidWY7CisJCQl9CisJCX0KKworCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFDb3VudCA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydCl0cC0+TWF4UGFja2V0U2l6ZSk7CisJCXJwbC0+RnJhbWVTaXplID0gMDsKKworCQkvKiBQYXNzIHRoZSBsYXN0IFJQTCBiYWNrIHRvIHRoZSBhZGFwdGVyICovCisJCXRwLT5ScGxUYWlsLT5GcmFtZVNpemUgPSAwOworCisJCS8qIFJlc2V0IHRoZSBDU1RBVCBmaWVsZCBpbiB0aGUgbGlzdC4gKi8KKwkJdG1zMzgwdHJfd3JpdGVfcnBsX3N0YXR1cyh0cC0+UnBsVGFpbCwgUlhfVkFMSUQgfCBSWF9GUkFNRV9JUlEpOworCisJCS8qIEN1cnJlbnQgUlBMIGJlY29tZXMgbGFzdCBvbmUgaW4gbGlzdC4gKi8KKwkJdHAtPlJwbFRhaWwgPSB0cC0+UnBsVGFpbC0+TmV4dFJQTFB0cjsKKworCQkvKiBJbmZvcm0gYWRhcHRlciBhYm91dCBSUEwgdmFsaWQuICovCisJCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX1JYX1ZBTElEKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgYW55IFJQTCBtdXN0IGJlCisgKiBtb2RpZmllZCBieSB0aGUgZHJpdmVyLCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgb3RoZXJ3aXNlIGNoYW5nZSB0aGUKKyAqIG9yZGVyIG9mIGluc3RydWN0aW9ucyBzdWNoIHRoYXQgd3JpdGluZyB0aGUgUlBMIHN0YXR1cyBtYXkgYmUgZXhlY3V0ZWQKKyAqIGF0IGFuIHVuZGVzaXJlYWJsZSB0aW1lLiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCwgdGhlIHN0YXR1cyBpcworICogYWx3YXlzIHdyaXR0ZW4gd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl93cml0ZV9ycGxfc3RhdHVzKFJQTCAqcnBsLCB1bnNpZ25lZCBpbnQgU3RhdHVzKQoreworCXJwbC0+U3RhdHVzID0gU3RhdHVzOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHN0YXRpc3RpYyBjb3VudGVycyBpbiBtYWMtPk1hY1N0YXQuCisgKiBJdCBkaWZmZXJ0aWF0ZXMgYmV0d2VlbiBkaXJlY3RlZCBhbmQgYnJvYWRjYXN0L211bHRpY2FzdCAoID09ZnVuY3Rpb25hbCkKKyAqIGZyYW1lcy4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfdXBkYXRlX3Jjdl9zdGF0cyhzdHJ1Y3QgbmV0X2xvY2FsICp0cCwgdW5zaWduZWQgY2hhciBEYXRhUHRyW10sCisJCQkJCXVuc2lnbmVkIGludCBMZW5ndGgpCit7CisJdHAtPk1hY1N0YXQucnhfcGFja2V0cysrOworCXRwLT5NYWNTdGF0LnJ4X2J5dGVzICs9IExlbmd0aDsKKwkKKwkvKiBUZXN0IGZ1bmN0aW9uYWwgYml0ICovCisJaWYoRGF0YVB0clsyXSAmIEdST1VQX0JJVCkKKwkJdHAtPk1hY1N0YXQubXVsdGljYXN0Kys7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgdG1zMzgwdHJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyOworCQorCWlmICh0cC0+QWRhcHRlck9wZW5GbGFnIHx8IHRwLT5BZGFwdGVyVmlydE9wZW5GbGFnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IE1BQy9MQUEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCisjaWYgVE1TMzgwVFJfREVCVUcgPiAwCisvKgorICogRHVtcCBQYWNrZXQgKGRhdGEpCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2R1bXAodW5zaWduZWQgY2hhciAqRGF0YSwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbGVuZ3RoIC8gODsgaSsrLCBqICs9IDgpCisJeworCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgRGF0YVtqKzBdLERhdGFbaisxXSxEYXRhW2orMl0sRGF0YVtqKzNdLAorCQkgICAgICAgRGF0YVtqKzRdLERhdGFbais1XSxEYXRhW2orNl0sRGF0YVtqKzddKTsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKwordm9pZCB0bXNkZXZfdGVybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5kbWFidWZmZXIsIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSwKKwkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKK30KKworaW50IHRtc2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZG1hbGltaXQsIAorCQlzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0bXNfbG9jYWw7CisKKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXRtc19sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdG1zX2xvY2FsLT53YWl0X2Zvcl90b2tfaW50KTsKKwl0bXNfbG9jYWwtPmRtYWxpbWl0ID0gZG1hbGltaXQ7CisJdG1zX2xvY2FsLT5wZGV2ID0gcGRldjsKKwl0bXNfbG9jYWwtPmRtYWJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsICh2b2lkICopdG1zX2xvY2FsLAorCSAgICBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKHRtc19sb2NhbC0+ZG1hYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpID4gZG1hbGltaXQpCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IG5vdCBhY2Nlc3NpYmxlIGZvciBETUFcbiIsCisJCQlkZXYtPm5hbWUpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJLyogVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhcmQgZHJpdmVyIGlmIG5lZWRlZCAqLworCWRldi0+b3BlbgkJPSB0bXMzODB0cl9vcGVuOworCWRldi0+c3RvcAkJPSB0bXMzODB0cl9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsCQk9IE5VTEw7IAorCWRldi0+aGFyZF9zdGFydF94bWl0CT0gdG1zMzgwdHJfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHRtczM4MHRyX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaOworCWRldi0+Z2V0X3N0YXRzCQk9IHRtczM4MHRyX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ0bXMzODB0cl9zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MJPSB0bXMzODB0cl9zZXRfbWFjX2FkZHJlc3M7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorCitFWFBPUlRfU1lNQk9MKHRtczM4MHRyX29wZW4pOworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKHRtczM4MHRyX2ludGVycnVwdCk7CitFWFBPUlRfU1lNQk9MKHRtc2Rldl9pbml0KTsKK0VYUE9SVF9TWU1CT0wodG1zZGV2X3Rlcm0pOworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl93YWl0KTsKKworc3RydWN0IG1vZHVsZSAqVE1TMzgwX21vZHVsZSA9IE5VTEw7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCQorCVRNUzM4MF9tb2R1bGUgPSAmX190aGlzX21vZHVsZTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCVRNUzM4MF9tb2R1bGUgPSBOVUxMOworfQorI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyB0bXMzODB0ci5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyB0bXMzODB0ci5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzViYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuaApAQCAtMCwwICsxLDExNDEgQEAKKy8qIAorICogdG1zMzgwdHIuaDogVEkgVE1TMzgwIFRva2VuIFJpbmcgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIEF1dGhvcnM6CisgKiAtIENocmlzdG9waCBHb29zIDxjZ29vc0BzeXNrb25uZWN0LmRlPgorICogLSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UTVMzODBUUl9ICisjZGVmaW5lIF9fTElOVVhfVE1TMzgwVFJfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIG1vZHVsZSBwcm90b3R5cGVzICovCitpbnQgdG1zMzgwdHJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB0bXMzODB0cl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2lycXJldHVybl90IHRtczM4MHRyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2ludCB0bXNkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGRtYWxpbWl0LAorCQlzdHJ1Y3QgcGNpX2RldiAqcGRldik7Cit2b2lkIHRtc2Rldl90ZXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB0bXMzODB0cl93YWl0KHVuc2lnbmVkIGxvbmcgdGltZSk7CisKKyNkZWZpbmUgVE1TMzgwVFJfTUFYX0FEQVBURVJTIDcKKworI2RlZmluZSBTRU5EX1RJTUVPVVQgMTAqSFoKKworI2RlZmluZSBUUl9SQ0ZfTE9OR0VTVF9GUkFNRV9NQVNLIDB4MDA3MAorI2RlZmluZSBUUl9SQ0ZfRlJBTUU0SyAweDAwMzAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIEJpdCBvcmRlciBmb3IgYWRhcHRlciBjb21tdW5pY2F0aW9uIHdpdGggRE1BCQkgICAgKi8KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KKy8qICBCaXQgIDggfCA5fCAxMHwgMTF8fCAxMnwgMTN8IDE0fCAxNXx8IDB8IDF8IDJ8IDN8fCA0fCA1fCA2fCA3fCAgKi8KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KKy8qICBUaGUgYnl0ZXMgaW4gYSB3b3JkIG11c3QgYmUgYnl0ZSBzd2FwcGVkLiBBbHNvLCBpZiBhIGRvdWJsZQkgICAgKi8KKy8qICB3b3JkIGlzIHVzZWQgZm9yIHN0b3JhZ2UsIHRoZW4gdGhlIHdvcmRzLCBhcyB3ZWxsIGFzIHRoZSBieXRlcywgKi8KKy8qICBtdXN0IGJlIHN3YXBwZWQuIAkJCQkJCSAgICAqLworLyogIEJpdCBvcmRlciBmb3IgYWRhcHRlciBjb21tdW5pY2F0aW9uIHdpdGggRElPIAkJICAgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKiAgQml0ICAwIHwgMXwgMnwgM3x8IDR8IDV8IDZ8IDd8fCA4fCA5fCAxMHwgMTF8fCAxMnwgMTN8IDE0fCAxNXwgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3YXAgd29yZHMgb2YgYSBsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXQVBXKHgpICgoKHgpIDw8IDE2KSB8ICgoeCkgPj4gMTYpKQorCisvKiBHZXQgdGhlIGxvdyBieXRlIG9mIGEgd29yZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTE9CWVRFKHcpICAgICAgICgodW5zaWduZWQgY2hhcikodykpCisKKy8qIEdldCB0aGUgaGlnaCBieXRlIG9mIGEgd29yZC4gICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBISUJZVEUodykgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgodW5zaWduZWQgc2hvcnQpKHcpID4+IDgpKQorCisvKiBHZXQgdGhlIGxvdyB3b3JkIG9mIGEgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTE9XT1JEKGwpICAgICAgICgodW5zaWduZWQgc2hvcnQpKGwpKQorCisvKiBHZXQgdGhlIGhpZ2ggd29yZCBvZiBhIGxvbmcuICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSElXT1JEKGwpICAgICAgICgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBsb25nKShsKSA+PiAxNikpCisKKworCisvKiBUb2tlbiByaW5nIGFkYXB0ZXIgSS9PIGFkZHJlc3NlcyBmb3Igbm9ybWFsIG1vZGUuICovCisKKy8qCisgKiBUaGUgU0lGIHJlZ2lzdGVycy4gIENvbW1vbiB0byBhbGwgYWRhcHRlcnMuCisgKi8KKy8qIEJhc2ljIFNJRiAoU1JTWCA9IDApICovCisjZGVmaW5lIFNJRkRBVCAgICAgIAkJMHgwMAkvKiBTSUYvRE1BIGRhdGEuICovCisjZGVmaW5lIFNJRklOQyAgICAgIAkJMHgwMiAgCS8qIElPIFdvcmQgZGF0YSB3aXRoIGF1dG8gaW5jcmVtZW50LiAqLworI2RlZmluZSBTSUZJTkggICAgICAJCTB4MDMgIAkvKiBJTyBCeXRlIGRhdGEgd2l0aCBhdXRvIGluY3JlbWVudC4gKi8KKyNkZWZpbmUgU0lGQURSICAgICAgCQkweDA0ICAJLyogU0lGL0RNQSBBZGRyZXNzLiAqLworI2RlZmluZSBTSUZDTUQgICAgICAJCTB4MDYgIAkvKiBTSUYgQ29tbWFuZC4gKi8KKyNkZWZpbmUgU0lGU1RTICAgICAgCQkweDA2ICAJLyogU0lGIFN0YXR1cy4gKi8KKworLyogIkV4dGVuZGVkIiBTSUYgKFNSU1ggPSAxKSAqLworI2RlZmluZSBTSUZBQ0wgICAgICAJCTB4MDggIAkvKiBTSUYgQWRhcHRlciBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBTSUZBREQgICAgICAJCTB4MGEgCS8qIFNJRi9ETUEgQWRkcmVzcy4gLS0gMHgwYSAqLworI2RlZmluZSBTSUZBRFggICAgICAJCTB4MGMgICAgIC8qIDB4MGMgKi8KKyNkZWZpbmUgRE1BTEVOICAgICAgCQkweDBlIAkvKiBTSUYgRE1BIGxlbmd0aC4gLS0gMHgwZSAqLworCisvKgorICogUE9TIFJlZ2lzdGVycy4gIE9ubHkgZm9yIElTQSBBZGFwdGVycy4KKyAqLworI2RlZmluZSBQT1NSRUcgICAgICAJCTB4MTAgCS8qIEFkYXB0ZXIgUHJvZ3JhbSBPcHRpb24gU2VsZWN0IChQT1MpCisJCQkgCQkgKiBSZWdpc3RlcjogYmFzZSBJTyBhZGRyZXNzICsgMTYgYnl0ZS4KKwkJCSAJCSAqLworI2RlZmluZSBQT1NSRUdfMiAgICAJCTI0TCAJLyogb25seSBmb3IgVFI0LzE2KyBhZGFwdGVyCisJCQkgCQkgKiBiYXNlIElPIGFkZHJlc3MgKyAyNCBieXRlLiAtLSAweDE4CisJCQkgCQkgKi8KKworLyogU0lGQ01EIGNvbW1hbmQgY29kZXMgKGhpZ2gtbG93KSAqLworI2RlZmluZSBDTURfSU5URVJSVVBUX0FEQVBURVIgICAweDgwMDAgIC8qIENhdXNlIGludGVybmFsIGFkYXB0ZXIgaW50ZXJydXB0ICovCisjZGVmaW5lIENNRF9BREFQVEVSX1JFU0VUICAgCTB4NDAwMCAgLyogSGFyZHdhcmUgcmVzZXQgb2YgYWRhcHRlciAqLworI2RlZmluZSBDTURfU1NCX0NMRUFSCQkweDIwMDAgIC8qIEFja25vd2xlZGdlIHRvIGFkYXB0ZXIgdG8KKwkJCQkJICogc3lzdGVtIGludGVycnVwdHMuCisJCQkJCSAqLworI2RlZmluZSBDTURfRVhFQ1VURQkJMHgxMDAwCS8qIEV4ZWN1dGUgU0NCIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1NDQl9SRVFVRVNUCQkweDA4MDAgIC8qIFJlcXVlc3QgYWRhcHRlciB0byBpbnRlcnJ1cHQKKwkJCQkJICogc3lzdGVtIHdoZW4gU0NCIGlzIGF2YWlsYWJsZSBmb3IKKwkJCQkJICogYW5vdGhlciBjb21tYW5kLgorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX1JYX0NPTlRJTlVFCQkweDA0MDAgIC8qIENvbnRpbnVlIHJlY2VpdmUgYWZ0ZXIgb2RkIHBvaW50ZXIKKwkJCQkJICogc3RvcC4gKG9kZCBwb2ludGVyIHJlY2VpdmUgbWV0aG9kKQorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX1JYX1ZBTElECQkweDAyMDAgIC8qIE5vdyBhY3R1YWwgUlBMIGlzIHZhbGlkLiAqLworI2RlZmluZSBDTURfVFhfVkFMSUQJCTB4MDEwMCAgLyogTm93IGFjdHVhbCBUUEwgaXMgdmFsaWQuICh2YWxpZAorCQkJCQkgKiBiaXQgcmVjZWl2ZS90cmFuc21pdCBtZXRob2QpCisJCQkJCSAqLworI2RlZmluZSBDTURfU1lTVEVNX0lSUQkJMHgwMDgwICAvKiBBZGFwdGVyLXRvLWF0dGFjaGVkLXN5c3RlbQorCQkJCQkgKiBpbnRlcnJ1cHQgaXMgcmVzZXQuCisJCQkJCSAqLworI2RlZmluZSBDTURfQ0xFQVJfU1lTVEVNX0lSUQkweDAwODAJLyogQ2xlYXIgU1lTVEVNX0lOVEVSUlVQVCBiaXQuCisJCQkJCSAqICh3cml0ZTogMT1pZ25vcmUsIDA9cmVzZXQpCisJCQkJCSAqLworI2RlZmluZSBFWEVDX1NPRlRfUkVTRVQJCTB4RkYwMCAgLyogYWRhcHRlciBzb2Z0IHJlc2V0LiAocmVzdGFydAorCQkJCQkgKiBhZGFwdGVyIGFmdGVyIGhhcmR3YXJlIHJlc2V0KQorCQkJCQkgKi8KKworCisvKiBBQ0wgY29tbWFuZHMgKGhpZ2gtbG93KSAqLworI2RlZmluZSBBQ0xfU1dITERBCQkweDA4MDAgIC8qIFNvZnR3YXJlIGhvbGQgYWNrbm93bGVkZ2UuICovCisjZGVmaW5lIEFDTF9TV0RESVIJCTB4MDQwMCAgLyogRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24uICovCisjZGVmaW5lIEFDTF9TV0hSUQkJMHgwMjAwICAvKiBQc2V1ZG8gRE1BIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgQUNMX1BTRE1BRU4JCTB4MDEwMCAgLyogRW5hYmxlIHBzZXVkbyBzeXN0ZW0gRE1BLiAqLworI2RlZmluZSBBQ0xfQVJFU0VUCQkweDAwODAgIC8qIEFkYXB0ZXIgaGFyZHdhcmUgcmVzZXQgY29tbWFuZC4KKwkJCQkJICogKGhlbGQgaW4gcmVzZXQgY29uZGl0aW9uIGFzCisJCQkJCSAqIGxvbmcgYXMgYml0IGlzIHNldCkKKwkJCQkJICovCisjZGVmaW5lIEFDTF9DUEhBTFQJCTB4MDA0MCAgLyogQ29tbXVuaWNhdGlvbiBwcm9jZXNzb3IgaGFsdC4KKwkJCQkJICogKGNhbiBvbmx5IGJlIHNldCB3aGlsZSBBQ0xfQVJFU0VUCisJCQkJCSAqIGJpdCBpcyBzZXQ7IHByZXZlbnRzIGFkYXB0ZXIKKwkJCQkJICogcHJvY2Vzc29yIGZyb20gZXhlY3V0aW5nIGNvZGUgd2hpbGUKKwkJCQkJICogZG93bmxvYWRpbmcgZmlybXdhcmUpCisJCQkJCSAqLworI2RlZmluZSBBQ0xfQk9PVAkJMHgwMDIwCisjZGVmaW5lIEFDTF9TSU5URU4JCTB4MDAwOCAgLyogU3lzdGVtIGludGVycnVwdCBlbmFibGUvZGlzYWJsZQorCQkJCQkgKiAoMS8wKTogY2FuIGJlIHdyaXR0ZW4gaWYgQUNMX0FSRVNFVAorCQkJCQkgKiBpcyB6ZXJvLgorCQkJCQkgKi8KKyNkZWZpbmUgQUNMX1BFTiAgICAgICAgICAgICAgICAgMHgwMDA0CisKKyNkZWZpbmUgQUNMX05TRUxPVVQwICAgICAgICAgICAgMHgwMDAyIAorI2RlZmluZSBBQ0xfTlNFTE9VVDEgICAgICAgICAgICAweDAwMDEJLyogTlNFTE9VVHggaGF2ZSBhIGNhcmQtc3BlY2lmaWMKKwkJCQkJICogbWVhbmluZyBmb3Igc2V0dGluZyByaW5nIHNwZWVkLgorCQkJCQkgKi8KKworI2RlZmluZSBQU19ETUFfTUFTSwkJKEFDTF9TV0hSUSB8IEFDTF9QU0RNQUVOKQorCisKKy8qIFNJRlNUUyByZWdpc3RlciByZXR1cm4gY29kZXMgKGhpZ2gtbG93KSAqLworI2RlZmluZSBTVFNfU1lTVEVNX0lSUQkJMHgwMDgwCS8qIEFkYXB0ZXItdG8tYXR0YWNoZWQtc3lzdGVtCisJCQkJCSAqIGludGVycnVwdCBpcyB2YWxpZC4KKwkJCQkJICovCisjZGVmaW5lIFNUU19JTklUSUFMSVpFCQkweDAwNDAgIC8qIElOSVRJQUxJWkUgc3RhdHVzLiAocmVhZHkgdG8KKwkJCQkJICogaW5pdGlhbGl6ZSkKKwkJCQkJICovCisjZGVmaW5lIFNUU19URVNUCQkweDAwMjAgIC8qIFRFU1Qgc3RhdHVzLiAoQlVEIG5vdCBjb21wbGV0ZWQpICovCisjZGVmaW5lIFNUU19FUlJPUgkJMHgwMDEwICAvKiBFUlJPUiBzdGF0dXMuICh1bnJlY292ZXJhYmxlCisJCQkJCSAqIEhXIGVycm9yIG9jY3VycmVkKQorCQkJCQkgKi8KKyNkZWZpbmUgU1RTX01BU0sJCTB4MDBGMCAgLyogTWFzayBpbnRlcmVzdGluZyBzdGF0dXMgYml0cy4gKi8KKyNkZWZpbmUgU1RTX0VSUk9SX01BU0sJCTB4MDAwRiAgLyogR2V0IEVycm9yIENvZGUgYnkgbWFza2luZyB0aGUKKwkJCQkJICogaW50ZXJydXB0IGNvZGUgYml0cy4KKwkJCQkJICovCisjZGVmaW5lIEFEQVBURVJfSU5UX1BUUlMJMHgwQTAwICAvKiBBZGRyZXNzIG9mZnNldCBvZiBhZGFwdGVyIGludGVybmFsCisJCQkJCSAqIHBvaW50ZXJzIDAxOjBhMDAgKGhpZ2gtbG93KSBoYXZlIHRvCisJCQkJCSAqIGJlIHJlYWQgYWZ0ZXIgaW5pdCBhbmQgYmVmb3JlIG9wZW4uCisJCQkJCSAqLworCisKKy8qIEludGVycnVwdCBDb2RlcyAob25seSBNQUMgSVJRcykgKi8KKyNkZWZpbmUgU1RTX0lSUV9BREFQVEVSX0NIRUNLCTB4MDAwMAkvKiB1bnJlY292ZXJhYmxlIGhhcmR3YXJlIG9yCisJCQkJCSAqIHNvZnR3YXJlIGVycm9yLgorCQkJCQkgKi8gCisjZGVmaW5lIFNUU19JUlFfUklOR19TVEFUVVMJMHgwMDA0ICAvKiBTU0IgaXMgdXBkYXRlZCB3aXRoIHJpbmcgc3RhdHVzLiAqLworI2RlZmluZSBTVFNfSVJRX0xMQ19TVEFUVVMJMHgwMDA1CS8qIE5vdCB1c2VkIGluIE1BQy1vbmx5IG1pY3JvY29kZSAqLworI2RlZmluZSBTVFNfSVJRX1NDQl9DTEVBUgkweDAwMDYJLyogU0NCIGNsZWFyLCBmb2xsb3dpbmcgYW4KKwkJCQkJICogU0NCX1JFUVVFU1QgSVJRLgorCQkJCQkgKi8KKyNkZWZpbmUgU1RTX0lSUV9USU1FUgkJMHgwMDA3CS8qIE5vdCBub3JtYWxseSB1c2VkIGluIE1BQyB1Y29kZSAqLworI2RlZmluZSBTVFNfSVJRX0NPTU1BTkRfU1RBVFVTCTB4MDAwOAkvKiBTU0IgaXMgdXBkYXRlZCB3aXRoIGNvbW1hbmQgCisJCQkJCSAqIHN0YXR1cy4KKwkJCQkJICovIAorI2RlZmluZSBTVFNfSVJRX1JFQ0VJVkVfU1RBVFVTCTB4MDAwQQkvKiBTU0IgaXMgdXBkYXRlZCB3aXRoIHJlY2VpdmUKKwkJCQkJICogc3RhdHVzLgorCQkJCQkgKi8KKyNkZWZpbmUgU1RTX0lSUV9UUkFOU01JVF9TVEFUVVMJMHgwMDBDCS8qIFNTQiBpcyB1cGRhdGVkIHdpdGggdHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0dXMKKwkJCQkJICovCisjZGVmaW5lIFNUU19JUlFfUkVDRUlWRV9QRU5ESU5HCTB4MDAwRQkvKiBOb3QgdXNlZCBpbiBNQUMtb25seSBtaWNyb2NvZGUgKi8KKyNkZWZpbmUgU1RTX0lSUV9NQVNLCQkweDAwMEYJLyogPSBTVFNfRVJST1JfTUFTSy4gKi8KKworCisvKiBUUkFOU01JVF9TVEFUVVMgY29tcGxldGlvbiBjb2RlOiAoU1NCLlBhcm1bMF0pICovCisjZGVmaW5lIENPTU1BTkRfQ09NUExFVEUJMHgwMDgwCS8qIFRSQU5TTUlUIGNvbW1hbmQgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGF2b2lkIHRoaXMhKSBpc3N1ZSBhbm90aGVyIHRyYW5zbWl0CisJCQkJCSAqIHRvIHNlbmQgYWRkaXRpb25hbCBmcmFtZXMuCisJCQkJCSAqLworI2RlZmluZSBGUkFNRV9DT01QTEVURQkJMHgwMDQwCS8qIEZyYW1lIGhhcyBiZWVuIHRyYW5zbWl0dGVkOworCQkJCQkgKiBJTlRFUlJVUFRfRlJBTUUgYml0IHdhcyBzZXQgaW4gdGhlCisJCQkJCSAqIENTVEFUIHJlcXVlc3Q7IGluZGljYXRpb24gb2YgcG9zc2libHkKKwkJCQkJICogbW9yZSB0aGFuIG9uZSBmcmFtZSB0cmFuc21pc3Npb25zIQorCQkJCQkgKiBTU0IuUGFybVswLTFdOiAzMiBiaXQgcG9pbnRlciB0bworCQkJCQkgKiBUUEwgb2YgbGFzdCBmcmFtZS4KKwkJCQkJICovCisjZGVmaW5lIExJU1RfRVJST1IJCTB4MDAyMAkvKiBFcnJvciBpbiBvbmUgb2YgdGhlIFRQTHMgdGhhdAorCQkJCQkgKiBjb21wb3NlIHRoZSBmcmFtZTsgVFJBTlNNSVQKKwkJCQkJICogdGVybWluYXRlZDsgUGFybVsxLTJdOiAzMmJpdCBwb2ludGVyCisJCQkJCSAqIHRvIFRQTCB3aGljaCBzdGFydHMgdGhlIGVycm9yCisJCQkJCSAqIGZyYW1lOyBlcnJvciBkZXRhaWxzIGluIGJpdHMgOC0xMy4KKwkJCQkJICogKDE0PykKKwkJCQkJICovCisjZGVmaW5lIEZSQU1FX1NJWkVfRVJST1IJMHg4MDAwCS8qIEZSQU1FX1NJWkUgZG9lcyBub3QgZXF1YWwgdGhlIHN1bSBvZgorCQkJCQkgKiB0aGUgdmFsaWQgREFUQV9DT1VOVCBmaWVsZHM7CisJCQkJCSAqIEZSQU1FX1NJWkUgbGVzcyB0aGFuIGhlYWRlciBwbHVzCisJCQkJCSAqIGluZm9ybWF0aW9uIGZpZWxkLiAoMTUgYnl0ZXMgKworCQkJCQkgKiByb3V0aW5nIGZpZWxkKSBPciBpZiBGUkFNRV9TSVpFCisJCQkJCSAqIHdhcyBzcGVjaWZpZWQgYXMgemVybyBpbiBvbmUgbGlzdC4KKwkJCQkJICovCisjZGVmaW5lIFRYX1RIUkVTSE9MRAkJMHg0MDAwCS8qIEZSQU1FX1NJWkUgZ3JlYXRlciB0aGFuIChCVUZGRVJfU0laRQorCQkJCQkgKiAtIDkpICogVFhfQlVGX01BWC4KKwkJCQkJICovCisjZGVmaW5lIE9ERF9BRERSRVNTCQkweDIwMDAJLyogT2RkIGZvcndhcmQgcG9pbnRlciB2YWx1ZSBpcworCQkJCQkgKiByZWFkIG9uIGEgbGlzdCB3aXRob3V0IEVORF9GUkFNRQorCQkJCQkgKiBpbmRpY2F0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgRlJBTUVfRVJST1IJCTB4MTAwMAkvKiBTVEFSVF9GUkFNRSBiaXQgKG5vdCkgYW50aWNpcGF0ZWQsCisJCQkJCSAqIGJ1dCAobm90KSBzZXQuCisJCQkJCSAqLworI2RlZmluZSBBQ0NFU1NfUFJJT1JJVFlfRVJST1IJMHgwODAwCS8qIEFjY2VzcyBwcmlvcml0eSByZXF1ZXN0ZWQgaGFzIG5vdAorCQkJCQkgKiBiZWVuIGFsbG93ZWQuCisJCQkJCSAqLworI2RlZmluZSBVTkVOQUJMRURfTUFDX0ZSQU1FCTB4MDQwMAkvKiBNQUMgZnJhbWUgaGFzIHNvdXJjZSBjbGFzcyBvZiB6ZXJvCisJCQkJCSAqIG9yIE1BQyBmcmFtZSBQQ0YgQVRUTiBmaWVsZCBpcworCQkJCQkgKiBncmVhdGVyIHRoYW4gb25lLgorCQkJCQkgKi8KKyNkZWZpbmUgSUxMRUdBTF9GUkFNRV9GT1JNQVQJMHgwMjAwCS8qIEJpdCAwIG9yIEZDIGZpZWxkIHdhcyBzZXQgdG8gb25lLiAqLworCisKKy8qCisgKiBTaW5jZSB3ZSBuZWVkIHRvIHN1cHBvcnQgc29tZSBmdW5jdGlvbnMgZXZlbiBpZiB0aGUgYWRhcHRlciBpcyBpbiBhCisgKiBDTE9TRUQgc3RhdGUsIHdlIGhhdmUgYSAocHNldWRvLSkgY29tbWFuZCBxdWV1ZSB3aGljaCBob2xkcyBjb21tYW5kcworICogdGhhdCBhcmUgb3V0c3RhbmRpZyB0byBiZSBleGVjdXRlZC4KKyAqCisgKiBFYWNoIHRpbWUgYSBjb21tYW5kIGNvbXBsZXRlcywgYW4gaW50ZXJydXB0IG9jY3VycyBhbmQgdGhlIG5leHQKKyAqIGNvbW1hbmQgaXMgZXhlY3V0ZWQuIFRoZSBjb21tYW5kIHF1ZXVlIGlzIGFjdHVhbGx5IGEgc2ltcGxlIHdvcmQgd2l0aCAKKyAqIGEgYml0IGZvciBlYWNoIG91dHN0YW5kaWcgY29tbWFuZC4gVGhlcmVmb3JlIHRoZSBjb21tYW5kcyB3aWxsIG5vdCBiZQorICogZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgaGF2ZSBiZWVuIHF1ZXVlZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIGNvbW1hbmQgY29kZSBiaXRzIGFuZCB0aGUgY29tbWFuZCBxdWV1ZToKKyAqLworI2RlZmluZSBPQ19PUEVOCQkJMHgwMDAxCS8qIE9QRU4gY29tbWFuZCAqLworI2RlZmluZSBPQ19UUkFOU01JVAkJMHgwMDAyCS8qIFRSQU5TTUlUIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfVFJBTlNNSVRfSEFMVAkweDAwMDQJLyogVFJBTlNNSVRfSEFMVCBjb21tYW5kICovCisjZGVmaW5lIE9DX1JFQ0VJVkUJCTB4MDAwOAkvKiBSRUNFSVZFIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfQ0xPU0UJCTB4MDAxMAkvKiBDTE9TRSBjb21tYW5kICovCisjZGVmaW5lIE9DX1NFVF9HUk9VUF9BRERSCTB4MDAyMAkvKiBTRVRfR1JPVVBfQUREUiBjb21tYW5kICovCisjZGVmaW5lIE9DX1NFVF9GVU5DVF9BRERSCTB4MDA0MAkvKiBTRVRfRlVOQ1RfQUREUiBjb21tYW5kICovCisjZGVmaW5lIE9DX1JFQURfRVJST1JfTE9HCTB4MDA4MAkvKiBSRUFEX0VSUk9SX0xPRyBjb21tYW5kICovCisjZGVmaW5lIE9DX1JFQURfQURBUFRFUgkJMHgwMTAwCS8qIFJFQURfQURBUFRFUiBjb21tYW5kICovCisjZGVmaW5lIE9DX01PRElGWV9PUEVOX1BBUk1TCTB4MDQwMAkvKiBNT0RJRllfT1BFTl9QQVJNUyBjb21tYW5kICovCisjZGVmaW5lIE9DX1JFU1RPUkVfT1BFTl9QQVJNUwkweDA4MDAJLyogUkVTVE9SRV9PUEVOX1BBUk1TIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfU0VUX0ZJUlNUXzE2X0dST1VQCTB4MTAwMAkvKiBTRVRfRklSU1RfMTZfR1JPVVAgY29tbWFuZCAqLworI2RlZmluZSBPQ19TRVRfQlJJREdFX1BBUk1TCTB4MjAwMAkvKiBTRVRfQlJJREdFX1BBUk1TIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfQ09ORklHX0JSSURHRV9QQVJNUwkweDQwMDAJLyogQ09ORklHX0JSSURHRV9QQVJNUyBjb21tYW5kICovCisKKyNkZWZpbmUgT1BFTgkJCTB4MDMwMAkvKiBDOiBvcGVuIGNvbW1hbmQuIFM6IGNvbXBsZXRpb24uICovCisjZGVmaW5lIFRSQU5TTUlUCQkweDA0MDAJLyogQzogdHJhbnNtaXQgY29tbWFuZC4gUzogY29tcGxldGlvbgorCQkJCQkgKiBzdGF0dXMuIChyZWplY3Q6IENPTU1BTkRfUkVKRUNUIGlmCisJCQkJCSAqIGFkYXB0ZXIgbm90IG9wZW5lZCwgVFJBTlNNSVQgYWxyZWFkeQorCQkJCQkgKiBpc3N1ZWQgb3IgYWRkcmVzcyBwYXNzZWQgaW4gdGhlIFNDQgorCQkJCQkgKiBub3Qgd29yZCBhbGlnbmVkKQorCQkJCQkgKi8KKyNkZWZpbmUgVFJBTlNNSVRfSEFMVAkJMHgwNTAwCS8qIEM6IGludGVycnVwdCBUWCBUUEwgY2hhaW47IGlmIG5vCisJCQkJCSAqIFRSQU5TTUlUIGNvbW1hbmQgaXNzdWVkLCB0aGUgY29tbWFuZAorCQkJCQkgKiBpcyBpZ25vcmVkIChjb21wbGV0aW9uIHdpdGggVFJBTlNNSVQKKwkJCQkJICogc3RhdHVzICgweDA0MDApISkKKwkJCQkJICovCisjZGVmaW5lIFJFQ0VJVkUJCQkweDA2MDAJLyogQzogcmVjZWl2ZSBjb21tYW5kLiBTOiBjb21wbGV0aW9uCisJCQkJCSAqIHN0YXR1cy4gKHJlamVjdDogQ09NTUFORF9SRUpFQ1QgaWYKKwkJCQkJICogYWRhcHRlciBub3Qgb3BlbmVkLCBSRUNFSVZFIGFscmVhZHkKKwkJCQkJICogaXNzdWVkIG9yIGFkZHJlc3MgcGFzc2VkIGluIHRoZSBTQ0IgCisJCQkJCSAqIG5vdCB3b3JkIGFsaWduZWQpCisJCQkJCSAqLworI2RlZmluZSBDTE9TRQkJCTB4MDcwMAkvKiBDOiBjbG9zZSBhZGFwdGVyLiBTOiBjb21wbGV0aW9uLgorCQkJCQkgKiAoQ09NTUFORF9SRUpFQ1QgaWYgYWRhcHRlciBub3Qgb3BlbikKKwkJCQkJICovCisjZGVmaW5lIFNFVF9HUk9VUF9BRERSCQkweDA4MDAJLyogQzogYWx0ZXIgYWRhcHRlciBncm91cCBhZGRyZXNzIGFmdGVyCisJCQkJCSAqIE9QRU4uIFM6IGNvbXBsZXRpb24uIChDT01NQU5EX1JFSkVDVAorCQkJCQkgKiBpZiBhZGFwdGVyIG5vdCBvcGVuKQorCQkJCQkgKi8KKyNkZWZpbmUgU0VUX0ZVTkNUX0FERFIJCTB4MDkwMAkvKiBDOiBhbHRlciBhZGFwdGVyIGZ1bmN0aW9uYWwgYWRkcmVzcworCQkJCQkgKiBhZnRlciBPUEVOLiBTOiBjb21wbGV0aW9uLgorCQkJCQkgKiAoQ09NTUFORF9SRUpFQ1QgaWYgYWRhcHRlciBub3Qgb3BlbikKKwkJCQkJICovCisjZGVmaW5lIFJFQURfRVJST1JfTE9HCQkweDBBMDAJLyogQzogcmVhZCBhZGFwdGVyIGVycm9yIGNvdW50ZXJzLgorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAoY29tbWFuZCBpZ25vcmVkCisJCQkJCSAqIGlmIGFkYXB0ZXIgbm90IG9wZW4hKQorCQkJCQkgKi8KKyNkZWZpbmUgUkVBRF9BREFQVEVSCQkweDBCMDAJLyogQzogcmVhZCBkYXRhIGZyb20gYWRhcHRlciBtZW1vcnkuCisJCQkJCSAqIChpbXBvcnRhbnQ6IGFmdGVyIGluaXQgYW5kIGJlZm9yZQorCQkJCQkgKiBvcGVuISkgUzogY29tcGxldGlvbi4gKEFEQVBURVJfQ0hFQ0sKKwkJCQkJICogaW50ZXJydXB0IGlmIHVuZGVmaW5lZCBzdG9yYWdlIGFyZWEKKwkJCQkJICogcmVhZCkKKwkJCQkJICovCisjZGVmaW5lIE1PRElGWV9PUEVOX1BBUk1TCTB4MEQwMAkvKiBDOiBtb2RpZnkgc29tZSBhZGFwdGVyIG9wZXJhdGlvbmFsCisJCQkJCSAqIHBhcmFtZXRlcnMuIChiaXQgY29ycmVzcG9uZGVuZCB0bworCQkJCQkgKiBXUkFQX0lOVEVSRkFDRSBpcyBpZ25vcmVkKQorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OiAKKwkJCQkJICogQ09NTUFORF9SRUpFQ1QpCisJCQkJCSAqLworI2RlZmluZSBSRVNUT1JFX09QRU5fUEFSTVMJMHgwRTAwCS8qIEM6IG1vZGlmeSBzb21lIGFkYXB0ZXIgb3BlcmF0aW9uYWwKKwkJCQkJICogcGFyYW1ldGVycy4gKGJpdCBjb3JyZXNwb25kZW5kCisJCQkJCSAqIHRvIFdSQVBfSU5URVJGQUNFIGlzIGlnbm9yZWQpCisJCQkJCSAqIFM6IGNvbXBsZXRpb24uIChyZWplY3Q6CisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKyNkZWZpbmUgU0VUX0ZJUlNUXzE2X0dST1VQCTB4MEYwMAkvKiBDOiBhbHRlciB0aGUgZmlyc3QgdHdvIGJ5dGVzIGluCisJCQkJCSAqIGFkYXB0ZXIgZ3JvdXAgYWRkcmVzcy4KKwkJCQkJICogUzogY29tcGxldGlvbi4gKHJlamVjdDoKKwkJCQkJICogQ09NTUFORF9SRUpFQ1QpCisJCQkJCSAqLworI2RlZmluZSBTRVRfQlJJREdFX1BBUk1TCTB4MTAwMAkvKiBDOiB2YWx1ZXMgYW5kIGNvbmRpdGlvbnMgZm9yIHRoZQorCQkJCQkgKiBhZGFwdGVyIGhhcmR3YXJlIHRvIHVzZSB3aGVuIGZyYW1lcworCQkJCQkgKiBhcmUgY29waWVkIGZvciBmb3J3YXJkaW5nLgorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OgorCQkJCQkgKiBDT01NQU5EX1JFSkVDVCkKKwkJCQkJICovCisjZGVmaW5lIENPTkZJR19CUklER0VfUEFSTVMJMHgxMTAwCS8qIEM6IC4uCisJCQkJCSAqIFM6IGNvbXBsZXRpb24uIChyZWplY3Q6CisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKworI2RlZmluZSBTUEVFRF80CQkJNAorI2RlZmluZSBTUEVFRF8xNgkJMTYJLyogRGVmYXVsdCB0cmFuc21pc3Npb24gc3BlZWQgICovCisKKworLyogSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyIEJsb2NrIChJUEIpOyB3b3JkIGFsaWdubWVudCBuZWNlc3NhcnkhICovCisjZGVmaW5lIEJVUlNUX1NJWkUJMHgwMDE4CS8qIERlZmF1bHQgYnVyc3Qgc2l6ZSAqLworI2RlZmluZSBCVVJTVF9NT0RFCTB4OUYwMAkvKiBCdXJzdCBtb2RlIGVuYWJsZSAqLworI2RlZmluZSBETUFfUkVUUklFUwkweDA1MDUJLyogTWFnaWMgRE1BIHJldHJ5IG51bWJlci4uLiAqLworCisjZGVmaW5lIENZQ0xFX1RJTUUJMwkvKiBEZWZhdWx0IEFULWJ1cyBjeWNsZSB0aW1lOiA1MDAgbnMKKwkJCQkgKiAobGF0ZXIgYWRhcHRlciB2ZXJzaW9uOiBmaXggIGN5Y2xlIHRpbWUhKQorCQkJCSAqLworI2RlZmluZSBMSU5FX1NQRUVEX0JJVAkweDgwCisKKy8qIE1hY3JvIGRlZmluaXRpb24gZm9yIHRoZSB3YWl0IGZ1bmN0aW9uLiAqLworI2RlZmluZSBPTkVfU0VDT05EX1RJQ0tTCTEwMDAwMDAKKyNkZWZpbmUgSEFMRl9TRUNPTkQJCShPTkVfU0VDT05EX1RJQ0tTIC8gMikKKyNkZWZpbmUgT05FX1NFQ09ORAkJKE9ORV9TRUNPTkRfVElDS1MpCisjZGVmaW5lIFRXT19TRUNPTkRTCQkoT05FX1NFQ09ORF9USUNLUyAqIDIpCisjZGVmaW5lIFRIUkVFX1NFQ09ORFMJCShPTkVfU0VDT05EX1RJQ0tTICogMykKKyNkZWZpbmUgRk9VUl9TRUNPTkRTCQkoT05FX1NFQ09ORF9USUNLUyAqIDQpCisjZGVmaW5lIEZJVkVfU0VDT05EUwkJKE9ORV9TRUNPTkRfVElDS1MgKiA1KQorCisjZGVmaW5lIEJVRkZFUl9TSVpFIAkJMjA0OAkvKiBCdWZmZXJzIG9uIEFkYXB0ZXIgKi8KKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgSW5pdF9PcHRpb25zOwkvKiBJbml0aWFsaXplIHdpdGggYnVyc3QgbW9kZTsKKwkJCQkJICogTExDIGRpc2FibGVkLiAoTUFDIG9ubHkpCisJCQkJCSAqLworCisJLyogSW50ZXJydXB0IHZlY3RvcnMgdGhlIGFkYXB0ZXIgcGxhY2VzIG9uIGF0dGFjaGVkIHN5c3RlbSBidXMuICovCisJdV9pbnQ4X3QgIENNRF9TdGF0dXNfSVY7ICAgIC8qIEludGVycnVwdCB2ZWN0b3I6IGNvbW1hbmQgc3RhdHVzLiAqLworCXVfaW50OF90ICBUWF9JVjsJICAgIC8qIEludGVycnVwdCB2ZWN0b3I6IHRyYW5zbWl0LiAqLworCXVfaW50OF90ICBSWF9JVjsJICAgIC8qIEludGVycnVwdCB2ZWN0b3I6IHJlY2VpdmUuICovCisJdV9pbnQ4X3QgIFJpbmdfU3RhdHVzX0lWOyAgIC8qIEludGVycnVwdCB2ZWN0b3I6IHJpbmcgc3RhdHVzLiAqLworCXVfaW50OF90ICBTQ0JfQ2xlYXJfSVY7CSAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiBTQ0IgY2xlYXIuICovCisJdV9pbnQ4X3QgIEFkYXB0ZXJfQ0hLX0lWOyAgIC8qIEludGVycnVwdCB2ZWN0b3I6IGFkYXB0ZXIgY2hlY2suICovCisKKwl1X2ludDE2X3QgUlhfQnVyc3RfU2l6ZTsgICAgLyogTWF4LiBudW1iZXIgb2YgdHJhbnNmZXIgY3ljbGVzLiAqLworCXVfaW50MTZfdCBUWF9CdXJzdF9TaXplOyAgICAvKiBEdXJpbmcgRE1BIGJ1cnN0OyBldmVuIHZhbHVlISAqLworCXVfaW50MTZfdCBETUFfQWJvcnRfVGhyaGxkOyAvKiBOdW1iZXIgb2YgRE1BIHJldHJpZXMuICovCisKKwl1X2ludDMyX3QgU0NCX0FkZHI7ICAgLyogU0NCIGFkZHJlc3M6IGV2ZW4sIHdvcmQgYWxpZ25lZCwgaGlnaC1sb3cgKi8KKwl1X2ludDMyX3QgU1NCX0FkZHI7ICAgLyogU1NCIGFkZHJlc3M6IGV2ZW4sIHdvcmQgYWxpZ25lZCwgaGlnaC1sb3cgKi8KK30gSVBCLCAqSVBCX1B0cjsKKyNwcmFnbWEgcGFjaygpCisKKy8qCisgKiBPUEVOIENvbW1hbmQgUGFyYW1ldGVyIExpc3QgKE9DUEwpIChjYW4gYmUgcmV1c2VkLCBpZiB0aGUgYWRhcHRlciBoYXMgdG8KKyAqIGJlIHJlb3BlbmVkKQorICovCisjZGVmaW5lIEJVRkZFUl9TSVpFCTIwNDgJCS8qIEJ1ZmZlcnMgb24gQWRhcHRlci4gKi8KKyNkZWZpbmUgVFBMX1NJWkUJOCs2KlRYX0ZSQUdfTlVNIC8qIERlcGVuZGluZyBvbiBmcmFnbWVudHMgcGVyIFRQTC4gKi8KKyNkZWZpbmUgUlBMX1NJWkUJMTQJCS8qICh3aXRoIFRJIGZpcm13YXJlIHYyLjI2IGhhbmRsaW5nCisJCQkJCSAqIHVwIHRvIG5pbmUgZnJhZ21lbnRzIHBvc3NpYmxlKQorCQkJCQkgKi8KKyNkZWZpbmUgVFhfQlVGX01JTgkyMAkJLyogPz8/IChTdGVwaGFuOiBjYWxjdWxhdGlvbiB3aXRoICovCisjZGVmaW5lIFRYX0JVRl9NQVgJNDAJCS8qIEJVRkZFUl9TSVpFIGFuZCBNQVhfRlJBTUVfU0laRSkgPz8/IAorCQkJCQkgKi8KKyNkZWZpbmUgRElTQUJMRV9FQVJMWV9UT0tFTl9SRUxFQVNFIAkweDEwMDAKKworLyogT1BFTiBPcHRpb25zIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgV1JBUF9JTlRFUkZBQ0UJCTB4MDA4MAkvKiBJbnNlcnRpbmcgb21pdHRlZCBmb3IgdGVzdAorCQkJCQkgKiBwdXJwb3NlczsgdHJhbnNtaXQgZGF0YSBhcHBlYXJzCisJCQkJCSAqIGFzIHJlY2VpdmUgZGF0YS4gKHVzZWZ1bCBmb3IKKwkJCQkJICogdGVzdGluZzsgY2hhbmdlOiBDTE9TRSBuZWNlc3NhcnkpCisJCQkJCSAqLworI2RlZmluZSBESVNBQkxFX0hBUkRfRVJST1IJMHgwMDQwCS8qIE9uIEhBUkRfRVJST1IgJiBUUkFOU01JVF9CRUFDT04KKwkJCQkJICogbm8gUklORy5TVEFUVVMgaW50ZXJydXB0LgorCQkJCQkgKi8KKyNkZWZpbmUgRElTQUJMRV9TT0ZUX0VSUk9SCTB4MDAyMAkvKiBPbiBTT0ZUX0VSUk9SLCBubyBSSU5HLlNUQVRVUworCQkJCQkgKiBpbnRlcnJ1cHQuCisJCQkJCSAqLworI2RlZmluZSBQQVNTX0FEQVBURVJfTUFDX0ZSQU1FUwkweDAwMTAJLyogUGFzc2luZyB1bnN1cHBvcnRlZCBNQUMgZnJhbWVzCisJCQkJCSAqIHRvIHN5c3RlbS4KKwkJCQkJICovCisjZGVmaW5lIFBBU1NfQVRURU5USU9OX0ZSQU1FUwkweDAwMDgJLyogQWxsIGNoYW5nZWQgYXR0ZW50aW9uIE1BQyBmcmFtZXMgYXJlCisJCQkJCSAqIHBhc3NlZCB0byB0aGUgc3lzdGVtLgorCQkJCQkgKi8KKyNkZWZpbmUgUEFEX1JPVVRJTkdfRklFTEQJMHgwMDA0CS8qIFJvdXRpbmcgZmllbGQgaXMgcGFkZGVkIHRvIDE4CisJCQkJCSAqIGJ5dGVzLgorCQkJCQkgKi8KKyNkZWZpbmUgRlJBTUVfSE9MRAkJMHgwMDAyCS8qQWRhcHRlciB3YWl0cyBmb3IgZW50aXJlIGZyYW1lIGJlZm9yZQorCQkJCQkgKiBpbml0aWF0aW5nIERNQSB0cmFuc2Zlcjsgb3RoZXJ3aXNlOgorCQkJCQkgKiBETUEgdHJhbnNmZXIgaW5pdGlhdGlvbiBpZiBpbnRlcm5hbAorCQkJCQkgKiBidWZmZXIgZmlsbGVkLgorCQkJCQkgKi8KKyNkZWZpbmUgQ09OVEVOREVSCQkweDAwMDEJLyogQWRhcHRlciBwYXJ0aWNpcGF0ZXMgaW4gdGhlIG1vbml0b3IKKwkJCQkJICogY29udGVudGlvbiBwcm9jZXNzLgorCQkJCQkgKi8KKyNkZWZpbmUgUEFTU19CRUFDT05fTUFDX0ZSQU1FUwkweDgwMDAJLyogQWRhcHRlciBwYXNzZXMgYmVhY29uIE1BQyBmcmFtZXMKKwkJCQkJICogdG8gdGhlIHN5c3RlbS4KKwkJCQkJICovCisjZGVmaW5lIEVBUkxZX1RPS0VOX1JFTEVBU0UgCTB4MTAwMAkvKiBPbmx5IHZhbGlkIGluIDE2IE1icHMgb3BlcmF0aW9uOworCQkJCQkgKiAwID0gRVRSLiAobm8gZWZmZWN0IGluIDQgTWJwcworCQkJCQkgKiBvcGVyYXRpb24pCisJCQkJCSAqLworI2RlZmluZSBDT1BZX0FMTF9NQUNfRlJBTUVTCTB4MDQwMAkvKiBBbGwgTUFDIGZyYW1lcyBhcmUgY29waWVkIHRvCisJCQkJCSAqIHRoZSBzeXN0ZW0uIChhZnRlciBPUEVOOiBkdXBsaWNhdGUKKwkJCQkJICogYWRkcmVzcyB0ZXN0IChEQVQpIE1BQyBmcmFtZSBpcyAKKwkJCQkJICogZmlyc3QgcmVjZWl2ZWQgZnJhbWUgY29waWVkIHRvIHRoZQorCQkJCQkgKiBzeXN0ZW0pCisJCQkJCSAqLworI2RlZmluZSBDT1BZX0FMTF9OT05fTUFDX0ZSQU1FUwkweDAyMDAJLyogQWxsIG5vbiBNQUMgZnJhbWVzIGFyZSBjb3BpZWQgdG8KKwkJCQkJICogdGhlIHN5c3RlbS4KKwkJCQkJICovCisjZGVmaW5lIFBBU1NfRklSU1RfQlVGX09OTFkJMHgwMTAwCS8qIFBhc3NlcyBvbmx5IGZpcnN0IGludGVybmFsIGJ1ZmZlcgorCQkJCQkgKiBvZiBlYWNoIHJlY2VpdmVkIGZyYW1lOyBGcmFtZVNpemUKKwkJCQkJICogb2YgUlBMcyBtdXN0IGNvbnRhaW4gaW50ZXJuYWwKKwkJCQkJICogQlVGRkVSX1NJWkUgYml0cyBmb3IgcHJvbWlzY291cyBtb2RlLgorCQkJCQkgKi8KKyNkZWZpbmUgRU5BQkxFX0ZVTExfRFVQTEVYX1NFTEVDVElPTgkweDIwMDAgCisgCQkJCQkvKiBFbmFibGUgdGhlIHVzZSBvZiBmdWxsLWR1cGxleAorCQkJCQkgKiBzZXR0aW5ncyB3aXRoIGJpdHMgaW4gYnl0ZSAyMiBpbgorCQkJCQkgKiBvY3BsLiAobmV3IGZlYXR1cmUgaW4gZmlybXdhcmUKKwkJCQkJICogdmVyc2lvbiAzLjA5KQorCQkJCQkgKi8KKworLyogRnVsbC1kdXBsZXggc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1BFTl9GVUxMX0RVUExFWF9PRkYJMHgwMDAwCisjZGVmaW5lIE9QRU5fRlVMTF9EVVBMRVhfT04JMHgwMGMwCisjZGVmaW5lIE9QRU5fRlVMTF9EVVBMRVhfQVVUTwkweDAwODAKKworI2RlZmluZSBQUk9EX0lEX1NJWkUJMTgJLyogTGVuZ3RoIG9mIHByb2R1Y3QgSUQuICovCisKKyNkZWZpbmUgVFhfRlJBR19OVU0JMwkgLyogTnVtYmVyIG9mIGZyYWdtZW50cyB1c2VkIGluIG9uZSBUUEwuICovCisjZGVmaW5lIFRYX01PUkVfRlJBR01FTlRTIDB4ODAwMCAvKiBCaXQgc2V0IGluIERhdGFDb3VudCB0byBpbmRpY2F0ZSBtb3JlCisJCQkJICAqIGZyYWdtZW50cyBmb2xsb3dpbmcuCisJCQkJICAqLworCisvKiBYWFggaXMgdGhlcmUgc29tZSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/ICovCisjZGVmaW5lIElTQV9NQVhfQUREUkVTUyAJMHgwMGZmZmZmZgorI2RlZmluZSBQQ0lfTUFYX0FERFJFU1MJCTB4ZmZmZmZmZmYKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90IE9QRU5PcHRpb25zOworCXVfaW50OF90ICBOb2RlQWRkcls2XTsJLyogQWRhcHRlciBub2RlIGFkZHJlc3M7IHVzZSBST00gCisJCQkJICogYWRkcmVzcworCQkJCSAqLworCXVfaW50MzJfdCBHcm91cEFkZHI7CS8qIE11bHRpY2FzdDogaGlnaCBvcmRlcgorCQkJCSAqIGJ5dGVzID0gMHhDMDAwCisJCQkJICovCisJdV9pbnQzMl90IEZ1bmN0QWRkcjsJLyogSGlnaCBvcmRlciBieXRlcyA9IDB4QzAwMCAqLworCXVfaW50MTZfdCBSeExpc3RTaXplOwkvKiBSUEwgc2l6ZTogMCAoPTI2KSwgMTQsIDIwIG9yCisJCQkJICogMjYgYnl0ZXMgcmVhZCBieSB0aGUgYWRhcHRlci4KKwkJCQkgKiAoRGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgCisJCQkJICogZnJhZ21lbnRzL2xpc3QpCisJCQkJICovCisJdV9pbnQxNl90IFR4TGlzdFNpemU7CS8qIFRQTCBzaXplICovCisJdV9pbnQxNl90IEJ1ZlNpemU7CS8qIElzIGF1dG9tYXRpY2FsbHkgcm91bmRlZCB1cCB0byB0aGUKKwkJCQkgKiBuZWFyZXN0IG5LIGJvdW5kYXJ5LgorCQkJCSAqLworCXVfaW50MTZfdCBGdWxsRHVwbGV4OworCXVfaW50MTZfdCBSZXNlcnZlZDsKKwl1X2ludDhfdCAgVFhCdWZNaW47CS8qIE51bWJlciBvZiBhZGFwdGVyIGJ1ZmZlcnMgcmVzZXJ2ZWQKKwkJCQkgKiBmb3IgdHJhbnNtaXNzaW9uIGEgbWluaW11bSBvZiAyCisJCQkJICogYnVmZmVycyBtdXN0IGJlIGFsbG9jYXRlZC4KKwkJCQkgKi8KKwl1X2ludDhfdCAgVFhCdWZNYXg7CS8qIE1heGltdW0gbnVtYmVyIG9mIGFkYXB0ZXIgYnVmZmVycworCQkJCSAqIGZvciB0cmFuc21pdDsgYSBtaW5pbXVtIG9mIDIgYnVmZmVycworCQkJCSAqIG11c3QgYmUgYXZhaWxhYmxlIGZvciByZWNlaXZlLgorCQkJCSAqIERlZmF1bHQ6IDYKKwkJCQkgKi8KKwl1X2ludDE2X3QgUHJvZElEQWRkclsyXTsvKiBQb2ludGVyIHRvIHByb2R1Y3QgSUQuICovCit9IE9QQiwgKk9QQl9QdHI7CisjcHJhZ21hIHBhY2soKQorCisvKgorICogU0NCOiBhZGFwdGVyIGNvbW1hbmRzIGVuYWJsZWQgYnkgdGhlIGhvc3Qgc3lzdGVtIHN0YXJ0ZWQgYnkgd3JpdGluZworICogQ01EX0lOVEVSUlVQVF9BREFQVEVSIHwgQ01EX0VYRUNVVEUgKHxTQ0JfUkVRVUVTVCkgdG8gdGhlIFNJRkNNRCBJTworICogcmVnaXN0ZXIuIChzcGVjaWFsIGNhc2U6IHwgQ01EX1NZU1RFTV9JUlEgZm9yIGluaXRpYWxpemF0aW9uKQorICovCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDE2X3QgQ01EOwkJLyogQ29tbWFuZCBjb2RlICovCisJdV9pbnQxNl90IFBhcm1bMl07CS8qIFBvaW50ZXIgdG8gQ29tbWFuZCBQYXJhbWV0ZXIgQmxvY2sgKi8KK30gU0NCOwkvKiBTeXN0ZW0gQ29tbWFuZCBCbG9jayAoMzIgYml0IHBoeXNpY2FsIGFkZHJlc3M7IGJpZyBlbmRpYW4pKi8KKyNwcmFnbWEgcGFjaygpCisKKy8qCisgKiBTU0I6IGFkYXB0ZXIgY29tbWFuZCByZXR1cm4gc3RhdHVzIGNhbiBiZSBldmFsdWF0ZWQgYWZ0ZXIgQ09NTUFORF9TVEFUVVMKKyAqIGFkYXB0ZXIgdG8gc3lzdGVtIGludGVycnVwdCBhZnRlciByZWFkaW5nIFNTQiwgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgU1NCCisgKiBoYXMgdG8gYmUgdG9sZCB0aGUgYWRhcHRlciBieSB3cml0aW5nIENNRF9JTlRFUlJVUFRfQURBUFRFUiB8IENNRF9TU0JfQ0xFQVIKKyAqIGluIHRoZSBTSUZDTUQgSU8gcmVnaXN0ZXIuCisgKi8KKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50MTZfdCBTVFM7CQkvKiBTdGF0dXMgY29kZSAqLworCXVfaW50MTZfdCBQYXJtWzNdOwkvKiBQYXJhbWV0ZXIgb3IgcG9pbnRlciB0byBTdGF0dXMgUGFyYW1ldGVyCisJCQkJICogQmxvY2suCisJCQkJICovCit9IFNTQjsJLyogU3lzdGVtIFN0YXR1cyBCbG9jayAoYmlnIGVuZGlhbiAtIHBoeXNpY2FsIGFkZHJlc3MpICAqLworI3ByYWdtYSBwYWNrKCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IEJ1cm5lZEluQWRkclB0cjsJLyogUG9pbnRlciB0byBhZGFwdGVyIGJ1cm5lZCBpbgorCQkJCQkgKiBhZGRyZXNzLiAoQklBKQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCBTb2Z0d2FyZUxldmVsUHRyOy8qIFBvaW50ZXIgdG8gc29mdHdhcmUgbGV2ZWwgZGF0YS4gKi8KKwl1bnNpZ25lZCBzaG9ydCBBZGFwdGVyQWRkclB0cjsJLyogUG9pbnRlciB0byBhZGFwdGVyIGFkZHJlc3Nlcy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBBZGFwdGVyUGFybXNQdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBwYXJhbWV0ZXJzLiAqLworCXVuc2lnbmVkIHNob3J0IE1BQ0J1ZmZlclB0cjsJLyogUG9pbnRlciB0byBNQUMgYnVmZmVyLiAoaW50ZXJuYWwpICovCisJdW5zaWduZWQgc2hvcnQgTExDQ291bnRlcnNQdHI7CS8qIFBvaW50ZXIgdG8gTExDIGNvdW50ZXJzLiAgKi8KKwl1bnNpZ25lZCBzaG9ydCBTcGVlZEZsYWdQdHI7CS8qIFBvaW50ZXIgdG8gZGF0YSByYXRlIGZsYWcuCisJCQkJCSAqICg0LzE2IE1icHMpCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0IEFkYXB0ZXJSQU1QdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBSQU0gZm91bmQuIChLQikgKi8KK30gSU5UUFRSUzsJLyogQWRhcHRlciBpbnRlcm5hbCBwb2ludGVycyAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDhfdCAgTGluZV9FcnJvcjsJCS8qIExpbmUgZXJyb3I6IGNvZGUgdmlvbGF0aW9uIGluCisJCQkJCSAqIGZyYW1lIG9yIGluIGEgdG9rZW4sIG9yIEZDUyBlcnJvci4KKwkJCQkJICovCisJdV9pbnQ4X3QgIEludGVybmFsX0Vycm9yOwkvKiBJQk0gc3BlY2lmaWMuIChSZXNlcnZlZF8xKSAqLworCXVfaW50OF90ICBCdXJzdF9FcnJvcjsKKwl1X2ludDhfdCAgQVJJX0ZDSV9FcnJvcjsJLyogQVJJL0ZDSSBiaXQgemVybyBpbiBBTVAgb3IKKwkJCQkJICogU01QIE1BQyBmcmFtZS4KKwkJCQkJICovCisJdV9pbnQ4X3QgIEFib3J0RGVsaW1ldGVyczsJLyogSUJNIHNwZWNpZmljLiAoUmVzZXJ2ZWRfMikgKi8KKwl1X2ludDhfdCAgUmVzZXJ2ZWRfMzsKKwl1X2ludDhfdCAgTG9zdF9GcmFtZV9FcnJvcjsJLyogUmVjZWl2ZSBvZiBlbmQgb2YgdHJhbnNtaXR0ZWQKKwkJCQkJICogZnJhbWUgZmFpbGVkLgorCQkJCQkgKi8KKwl1X2ludDhfdCAgUnhfQ29uZ2VzdF9FcnJvcjsJLyogQWRhcHRlciBpbiByZXBlYXQgbW9kZSBoYXMgbm90CisJCQkJCSAqIGVub3VnaCBidWZmZXIgc3BhY2UgdG8gY29weSBpbmNvbWluZworCQkJCQkgKiBmcmFtZS4KKwkJCQkJICovCisJdV9pbnQ4X3QgIEZyYW1lX0NvcGllZF9FcnJvcjsJLyogQVJJIGJpdCBub3QgemVybyBpbiBmcmFtZQorCQkJCQkgKiBhZGRyZXNzZWQgdG8gYWRhcHRlci4KKwkJCQkJICovCisJdV9pbnQ4X3QgIEZyZXF1ZW5jeV9FcnJvcjsJLyogSUJNIHNwZWNpZmljLiAoUmVzZXJ2ZWRfNCkgKi8KKwl1X2ludDhfdCAgVG9rZW5fRXJyb3I7CQkvKiAoYWN0aXZlIG9ubHkgaW4gbW9uaXRvciBzdGF0aW9uKSAqLworCXVfaW50OF90ICBSZXNlcnZlZF81OworCXVfaW50OF90ICBETUFfQnVzX0Vycm9yOwkvKiBETUEgYnVzIGVycm9ycyBub3QgZXhjZWVkaW5nIHRoZQorCQkJCQkgKiBhYm9ydCB0aHJlc2hvbGRzLgorCQkJCQkgKi8KKwl1X2ludDhfdCAgRE1BX1Bhcml0eV9FcnJvcjsJLyogRE1BIHBhcml0eSBlcnJvcnMgbm90IGV4Y2VlZGluZworCQkJCQkgKiB0aGUgYWJvcnQgdGhyZXNob2xkcy4KKwkJCQkJICovCit9IEVSUk9SVEFCOwkvKiBBZGFwdGVyIGVycm9yIGNvdW50ZXJzICovCisjcHJhZ21hIHBhY2soKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlbmQgYW5kIFJlY2VpdmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDE2X3QgRGF0YUNvdW50OwkvKiBWYWx1ZSAwLCBldmVuIGFuZCBvZGQgdmFsdWVzIGFyZQorCQkJCSAqIHBlcm1pdHRlZDsgdmFsdWUgaXMgdW5hbHRlcmVkIG1vc3QKKwkJCQkgKiBzaWduaWZpY2FudCBiaXQgc2V0OiBmb2xsb3dpbmcKKwkJCQkgKiBmcmFnbWVudHMgbGFzdCBmcmFnbWVudDogbW9zdAorCQkJCSAqIHNpZ25pZmljYW50IGJpdCBpcyBub3QgZXZhbHVhdGVkLgorCQkJCSAqICg/Pz8pCisJCQkJICovCisJdV9pbnQzMl90IERhdGFBZGRyOwkvKiBQb2ludGVyIHRvIGZyYW1lIGRhdGEgZnJhZ21lbnQ7CisJCQkJICogZXZlbiBvciBvZGQuCisJCQkJICovCit9IEZyYWdtZW50OworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBNQVhfRlJBR19OVU1CRVJTICAgIDkJLyogTWF4aW1hbCBudW1iZXIgb2YgZnJhZ21lbnRzIHBvc3NpYmxlIHRvIHVzZQorCQkJCSAqIGluIG9uZSBSUEwvVFBMLiAoZGVwZW5kaW5nIG9uIFRJIGZpcm13YXJlIAorCQkJCSAqIHZlcnNpb24pCisJCQkJICovCisKKy8qCisgKiBBQyAoMSksIEZDICgxKSwgRHN0ICg2KSwgU3JjICg2KSwgUklGICgxOCksIERhdGEgKDQ0NzIpID0gNDUwNAorICogVGhlIHBhY2tldCBzaXplIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd3M6IDU0OCwgMTUwMiwgMjA4NCwgNDUwNCwgODE3NiwKKyAqIDExNDM5LCAxNzgzMi4gUmVmZXIgdG8gVE1TMzgwIFNlY29uZCBHZW5lcmF0aW9uIFRva2VuIFJpbmcgVXNlcidzIEd1aWRlCisgKiBQYWdlIDItMjcuCisgKi8KKyNkZWZpbmUgSEVBREVSX1NJWkUJCSgxICsgMSArIDYgKyA2KQorI2RlZmluZSBTUkNfU0laRQkJMTgKKyNkZWZpbmUgTUlOX0RBVEFfU0laRQkJNTE2CisjZGVmaW5lIERFRkFVTFRfREFUQV9TSVpFCTQ0NzIKKyNkZWZpbmUgTUFYX0RBVEFfU0laRQkJMTc4MDAKKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9TSVpFIChIRUFERVJfU0laRSArIFNSQ19TSVpFICsgREVGQVVMVF9EQVRBX1NJWkUpCisjZGVmaW5lIE1JTl9QQUNLRVRfU0laRSAgICAgKEhFQURFUl9TSVpFICsgU1JDX1NJWkUgKyBNSU5fREFUQV9TSVpFKQorI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUgICAgIChIRUFERVJfU0laRSArIFNSQ19TSVpFICsgTUFYX0RBVEFfU0laRSkKKworLyoKKyAqIE1hY3JvcyB0byBkZWFsIHdpdGggdGhlIGZyYW1lIHN0YXR1cyBmaWVsZC4KKyAqLworI2RlZmluZSBBQ19OT1RfUkVDT0dOSVpFRAkweDAwCisjZGVmaW5lIEdST1VQX0JJVAkJMHg4MAorI2RlZmluZSBHRVRfVFJBTlNNSVRfU1RBVFVTX0hJR0hfQllURShUcykgKCh1bnNpZ25lZCBjaGFyKSgoVHMpID4+IDgpKQorI2RlZmluZSBHRVRfRlJBTUVfU1RBVFVTX0hJR0hfQUMoRnMpCSAgKCh1bnNpZ25lZCBjaGFyKSgoKEZzKSAmIDB4QzApID4+IDYpKQorI2RlZmluZSBHRVRfRlJBTUVfU1RBVFVTX0xPV19BQyhGcykgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgoKEZzKSAmIDB4MEMpID4+IDIpKQorI2RlZmluZSBESVJFQ1RFRF9GUkFNRShDb250ZXh0KSAgICAgICAgICAgKCEoKENvbnRleHQpLT5NRGF0YVsyXSAmIEdST1VQX0JJVCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VuZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGRlZmluZSBUWF9DU1RBVCBfUkVRVUVTVCAoUikgYW5kIF9DT01QTEVURSAoQykgdmFsdWVzIChoaWdoLWxvdykgKi8KKworI2RlZmluZSBUWF9WQUxJRAkJMHgwMDgwCS8qIFI6IHNldCB2aWEgVFJBTlNNSVQuVkFMSUQgaW50ZXJydXB0LgorCQkJCQkgKiBDOiBhbHdheXMgcmVzZXQgdG8gemVybyEKKwkJCQkJICovCisjZGVmaW5lIFRYX0ZSQU1FX0NPTVBMRVRFCTB4MDA0MAkvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8uCisJCQkJCSAqIEM6IHNldCB0byBvbmUuCisJCQkJCSAqLworI2RlZmluZSBUWF9TVEFSVF9GUkFNRQkJMHgwMDIwICAvKiBSOiBzdGFydCBvZiBhIGZyYW1lOiAxIAorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9FTkRfRlJBTUUJCTB4MDAxMCAgLyogUjogZW5kIG9mIGEgZnJhbWU6IDEKKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfRlJBTUVfSVJRCQkweDAwMDggIC8qIFI6IHJlcXVlc3QgaW50ZXJydXB0IGdlbmVyYXRpb24KKwkJCQkJICogYWZ0ZXIgdHJhbnNtaXNzaW9uLgorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9FUlJPUgkJMHgwMDA0ICAvKiBSOiByZXNlcnZlZC4KKwkJCQkJICogQzogc2V0IHRvIG9uZSBpZiBFcnJvciBvY2N1cnJlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX0lOVEVSRlJBTUVfV0FJVAkweDAwMDQKKyNkZWZpbmUgVFhfUEFTU19DUkMJCTB4MDAwMiAgLyogUjogc2V0IGlmIENSQyB2YWx1ZSBpcyBhbHJlYWR5CisJCQkJCSAqIGNhbGN1bGF0ZWQuICh2YWxpZCBvbmx5IGluCisJCQkJCSAqIEZSQU1FX1NUQVJUIFRQTCkKKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfUEFTU19TUkNfQUREUgkweDAwMDEgIC8qIFI6IGFkYXB0ZXIgdXNlcyBleHBsaWNpdCBmcmFtZQorCQkJCQkgKiBzb3VyY2UgYWRkcmVzcyBhbmQgZG9lcyBub3Qgb3ZlcndyaXRlCisJCQkJCSAqIHdpdGggdGhlIGFkYXB0ZXIgbm9kZSBhZGRyZXNzLgorCQkJCQkgKiAodmFsaWQgb25seSBpbiBGUkFNRV9TVEFSVCBUUEwpCisJCQkJCSAqCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX1NUUklQX0ZTCQkweEZGMDAgIC8qIFI6IHJlc2VydmVkLgorCQkJCQkgKiBDOiBpZiBubyBUcmFuc21pc3Npb24gRXJyb3IsCisJCQkJCSAqIGZpZWxkIGNvbnRhaW5zIGNvcHkgb2YgRlMgYnl0ZSBhZnRlcgorCQkJCQkgKiBzdHJpcHBpbmcgb2YgZnJhbWUuCisJCQkJCSAqLworCisvKgorICogU3RydWN0dXJlIG9mIFRyYW5zbWl0IFBhcmFtZXRlciBMaXN0cyAoVFBMcykgKG9ubHkgb25lIGZyYW1lIGV2ZXJ5IFRQTCwKKyAqIGJ1dCBwb3NzaWJseSBtdWx0aXBsZSBUUExzIGZvciBvbmUgZnJhbWUpIHRoZSBsZW5ndGggb2YgdGhlIFRQTHMgaGFzIHRvIGJlCisgKiBpbml0aWFsaXplZCBpbiB0aGUgT1BMLiAoT1BFTiBwYXJhbWV0ZXIgbGlzdCkKKyAqLworI2RlZmluZSBUUExfTlVNCQkzCS8qIE51bWJlciBvZiBUcmFuc21pdCBQYXJhbWV0ZXIgTGlzdHMuCisJCQkJICogISEgTVVTVCBCRSA+PSAzICEhCisJCQkJICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3Qgc19UUEwgVFBMOworCitzdHJ1Y3Qgc19UUEwgewkvKiBUcmFuc21pdCBQYXJhbWV0ZXIgTGlzdCAoYWxpZ24gb24gZXZlbiB3b3JkIGJvdW5kYXJpZXMpICovCisJdV9pbnQzMl90IE5leHRUUExBZGRyOwkJLyogUG9pbnRlciB0byBuZXh0IFRQTCBpbiBjaGFpbjsgaWYKKwkJCQkJICogcG9pbnRlciBpcyBvZGQ6IHRoaXMgaXMgdGhlIGxhc3QKKwkJCQkJICogVFBMLiBQb2ludGluZyB0byBpdHNlbGYgY2FuIGNhdXNlCisJCQkJCSAqIHByb2JsZW1zIQorCQkJCQkgKi8KKwl2b2xhdGlsZSB1X2ludDE2X3QgU3RhdHVzOwkvKiBJbml0aWFsaXplZCBieSB0aGUgYWRhcHRlcjoKKwkJCQkJICogQ1NUQVRfUkVRVUVTVCBpbXBvcnRhbnQ6IHVwZGF0ZSBsZWFzdAorCQkJCQkgKiBzaWduaWZpY2FudCBiaXQgZmlyc3QhIFNldCBieSB0aGUKKwkJCQkJICogYWRhcHRlcjogQ1NUQVRfQ09NUExFVEUgc3RhdHVzLgorCQkJCQkgKi8KKwl1X2ludDE2X3QgRnJhbWVTaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkCisJCQkJCSAqIGFzIGEgZnJhbWUgaW5jbHVkaW5nIEFDL0ZDLAorCQkJCQkgKiBEZXN0aW5hdGlvbiwgU291cmNlLCBSb3V0aW5nIGZpZWxkCisJCQkJCSAqIG5vdCBpbmNsdWRpbmcgQ1JDLCBGUywgRW5kIERlbGltaXRlcgorCQkJCQkgKiAodmFsaWQgb25seSBpZiBTVEFSVF9GUkFNRSBiaXQgaW4gCisJCQkJCSAqIENTVEFUIG5vbnplcm8pIG11c3Qgbm90IGJlIHplcm8gaW4KKwkJCQkJICogYW55IGxpc3Q7IG1heGltdW0gdmFsdWU6IChCVUZGRVJfU0laRQorCQkJCQkgKiAtIDgpICogVFhfQlVGX01BWCBzdW0gb2YgRGF0YUNvdW50CisJCQkJCSAqIHZhbHVlcyBpbiBGcmFnbWVudExpc3QgbXVzdCBlcXVhbAorCQkJCQkgKiBGcmFtZV9TaXplIHZhbHVlIGluIFNUQVJUX0ZSQU1FIFRQTCEKKwkJCQkJICogZnJhbWUgZGF0YSBmcmFnbWVudCBsaXN0LgorCQkJCQkgKi8KKworCS8qIFRQTC9SUEwgc2l6ZSBpbiBPUEVOIHBhcmFtZXRlciBsaXN0IGRlcGVuZGluZyBvbiBtYXhpbWFsCisJICogbnVtYmVycyBvZiBmcmFnbWVudHMgdXNlZCBpbiBvbmUgcGFyYW1ldGVyIGxpc3QuCisJICovCisJRnJhZ21lbnQgRnJhZ0xpc3RbVFhfRlJBR19OVU1dOwkvKiBNYXhpbXVtOiBuaW5lIGZyYW1lIGZyYWdtZW50cyBpbiBvbmUKKwkJCQkJICogVFBMIGFjdHVhbCB2ZXJzaW9uIG9mIGZpcm13YXJlOiA5CisJCQkJCSAqIGZyYWdtZW50cyBwb3NzaWJsZS4KKwkJCQkJICovCisjcHJhZ21hIHBhY2soKQorCisJLyogU3BlY2lhbCBwcm9wcmlldGFyeSBkYXRhIGFuZCBwcmVjYWxjdWxhdGlvbnMgKi8KKworCVRQTCAqTmV4dFRQTFB0cjsJCS8qIFBvaW50ZXIgdG8gbmV4dCBUUEwgaW4gY2hhaW4uICovCisJdW5zaWduZWQgY2hhciAqTURhdGE7CisJc3RydWN0IHNrX2J1ZmYgKlNrYjsKKwl1bnNpZ25lZCBjaGFyIFRQTEluZGV4OworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgQnVzeUZsYWc7LyogRmxhZzogVFBMIGJ1c3k/ICovCisJZG1hX2FkZHJfdCBETUFCdWZmOwkJLyogRE1BIElPIGJ1cyBhZGRyZXNzIGZyb20gcGNpX21hcCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tUmVjZWl2ZSBGdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogZGVmaW5lIFJFQ0VJVkVfQ1NUQVRfUkVRVUVTVCAoUikgYW5kIFJFQ0VJVkVfQ1NUQVRfQ09NUExFVEUgKEMpIHZhbHVlcy4KKyAqIChoaWdoLWxvdykKKyAqLworI2RlZmluZSBSWF9WQUxJRAkJMHgwMDgwCS8qIFI6IHNldDsgdGVsbCBhZGFwdGVyIHdpdGgKKwkJCQkJICogUkVDRUlWRS5WQUxJRCBpbnRlcnJ1cHQuCisJCQkJCSAqIEM6IHJlc2V0IHRvIHplcm8uCisJCQkJCSAqLworI2RlZmluZSBSWF9GUkFNRV9DT01QTEVURQkweDAwNDAgIC8qIFI6IG11c3QgYmUgcmVzZXQgdG8gemVybywKKwkJCQkJICogQzogc2V0IHRvIG9uZS4KKwkJCQkJICovCisjZGVmaW5lIFJYX1NUQVJUX0ZSQU1FCQkweDAwMjAgIC8qIFI6IG11c3QgYmUgcmVzZXQgdG8gemVyby4KKwkJCQkJICogQzogc2V0IHRvIG9uZSBvbiB0aGUgbGlzdC4KKwkJCQkJICovCisjZGVmaW5lIFJYX0VORF9GUkFNRQkJMHgwMDEwICAvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8uCisJCQkJCSAqIEM6IHNldCB0byBvbmUgb24gdGhlIGxpc3QKKwkJCQkJICogdGhhdCBlbmRzIHRoZSBmcmFtZS4KKwkJCQkJICovCisjZGVmaW5lIFJYX0ZSQU1FX0lSUQkJMHgwMDA4ICAvKiBSOiByZXF1ZXN0IGludGVycnVwdCBnZW5lcmF0aW9uCisJCQkJCSAqIGFmdGVyIHJlY2VpdmUuCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFJYX0lOVEVSRlJBTUVfV0FJVAkweDAwMDQgIC8qIFI6IGFmdGVyIHJlY2VpdmluZyBhIGZyYW1lOgorCQkJCQkgKiBpbnRlcnJ1cHQgYW5kIHdhaXQgZm9yIGEKKwkJCQkJICogUkVDRUlWRS5DT05USU5VRS4KKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUEFTU19DUkMJCTB4MDAwMiAgLyogUjogaWYgc2V0LCB0aGUgYWRhcHRlciBpbmNsdWRlcworCQkJCQkgKiB0aGUgQ1JDIGluIGRhdGEgcGFzc2VkLiAobGFzdCBmb3VyIAorCQkJCQkgKiBieXRlczsgdmFsaWQgb25seSBpZiBGUkFNRV9TVEFSVCBpcworCQkJCQkgKiBzZXQpCisJCQkJCSAqIEM6IHNldCwgaWYgQ1JDIGlzIGluY2x1ZGVkIGluCisJCQkJCSAqIHJlY2VpdmVkIGRhdGEuCisJCQkJCSAqLworI2RlZmluZSBSWF9QQVNTX1NSQ19BRERSCTB4MDAwMSAgLyogUjogYWRhcHRlciB1c2VzIGV4cGxpY2l0IGZyYW1lCisJCQkJCSAqIHNvdXJjZSBhZGRyZXNzIGFuZCBkb2VzIG5vdAorCQkJCQkgKiBvdmVyd3JpdGUgd2l0aCB0aGUgYWRhcHRlciBub2RlCisJCQkJCSAqIGFkZHJlc3MuICh2YWxpZCBvbmx5IGlmIEZSQU1FX1NUQVJUCisJCQkJCSAqIGlzIHNldCkKKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUkVDRUlWRV9GUwkJMHhGQzAwICAvKiBSOiByZXNlcnZlZDsgbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBvbiBsaXN0cyB3aXRoIFNUQVJUX0ZSQU1FLCBmaWVsZAorCQkJCQkgKiBjb250YWlucyBmcmFtZSBzdGF0dXMgZmllbGQgZnJvbQorCQkJCQkgKiByZWNlaXZlZCBmcmFtZTsgb3RoZXJ3aXNlIGNsZWFyZWQuCisJCQkJCSAqLworI2RlZmluZSBSWF9BRERSX01BVENICQkweDAzMDAgIC8qIFI6IHJlc2VydmVkOyBtdXN0IGJlIHJlc2V0IHRvIHplcm8uCisJCQkJCSAqIEM6IGFkZHJlc3MgbWF0Y2ggY29kZSBtYXNrLgorCQkJCQkgKi8gCisjZGVmaW5lIFJYX1NUQVRVU19NQVNLCQkweDAwRkYgIC8qIE1hc2sgZm9yIHJlY2VpdmUgc3RhdHVzIGJpdHMuICovCisKKyNkZWZpbmUgUlhfSU5URVJOX0FERFJfTUFUQ0ggICAgMHgwMTAwICAvKiBDOiBpbnRlcm5hbGx5IGFkZHJlc3MgbWF0Y2guICovCisjZGVmaW5lIFJYX0VYVEVSTl9BRERSX01BVENIICAgIDB4MDIwMCAgLyogQzogZXh0ZXJuYWxseSBtYXRjaGVkIHZpYQorCQkJCQkgKiBYTUFUQ0gvWEZBSUwgaW50ZXJmYWNlLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfSU5URVhUX0FERFJfTUFUQ0ggICAgMHgwMzAwICAvKiBDOiBpbnRlcm5hbGx5IGFuZCBleHRlcm5hbGx5CisJCQkJCSAqIG1hdGNoZWQuCisJCQkJCSAqLworI2RlZmluZSBSWF9SRUFEWSAoUlhfVkFMSUQgfCBSWF9GUkFNRV9JUlEpIC8qIFJlYWR5IGZvciByZWNlaXZlLiAqLworCisvKiBDb25zdGFudHMgZm9yIENvbW1hbmQgU3RhdHVzIEludGVycnVwdC4KKyAqIENPTU1BTkRfUkVKRUNUIHN0YXR1cyBmaWVsZCBiaXQgZnVuY3Rpb25zIChTU0IuUGFybVswXSkKKyAqLworI2RlZmluZSBJTExFR0FMX0NPTU1BTkQJCTB4MDA4MAkvKiBTZXQgaWYgYW4gdW5rbm93biBjb21tYW5kCisJCQkJCSAqIGlzIGlzc3VlZCB0byB0aGUgYWRhcHRlcgorCQkJCQkgKi8KKyNkZWZpbmUgQUREUkVTU19FUlJPUgkJMHgwMDQwICAvKiBTZXQgaWYgYW55IGFkZHJlc3MgZmllbGQgaW4KKwkJCQkJICogdGhlIFNDQiBpcyBvZGQuIChub3Qgd29yZCBhbGlnbmVkKQorCQkJCQkgKi8KKyNkZWZpbmUgQURBUFRFUl9PUEVOCQkweDAwMjAgIC8qIENvbW1hbmQgaXNzdWVkIGlsbGVnYWwgd2l0aAorCQkJCQkgKiBvcGVuIGFkYXB0ZXIuCisJCQkJCSAqLworI2RlZmluZSBBREFQVEVSX0NMT1NFCQkweDAwMTAgIC8qIENvbW1hbmQgaXNzdWVkIGlsbGVnYWwgd2l0aAorCQkJCQkgKiBjbG9zZWQgYWRhcHRlci4KKwkJCQkJICovCisjZGVmaW5lIFNBTUVfQ09NTUFORAkJMHgwMDA4ICAvKiBDb21tYW5kIGlzc3VlZCB3aXRoIHNhbWUgY29tbWFuZAorCQkJCQkgKiBhbHJlYWR5IGV4ZWN1dGluZy4KKwkJCQkJICovCisKKy8qIE9QRU5fQ09NUExFVElPTiB2YWx1ZXMgKFNTQi5QYXJtWzBdLCBNU0IpICovCisjZGVmaW5lIE5PREVfQUREUl9FUlJPUgkJMHgwMDQwICAvKiBXcm9uZyBhZGRyZXNzIG9yIEJJQSByZWFkCisJCQkJCSAqIHplcm8gYWRkcmVzcy4KKwkJCQkJICovCisjZGVmaW5lIExJU1RfU0laRV9FUlJPUgkJMHgwMDIwICAvKiBJZiBMaXN0X1NpemUgdmFsdWUgbm90IGluIDAsCisJCQkJCSAqIDE0LCAyMCwgMjYuCisJCQkJCSAqLworI2RlZmluZSBCVUZfU0laRV9FUlJPUgkJMHgwMDEwICAvKiBOb3QgZW5vdWdoIGF2YWlsYWJsZSBtZW1vcnkgZm9yCisJCQkJCSAqIHR3byBidWZmZXJzLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfQlVGX0NPVU5UX0VSUk9SCTB4MDAwNCAgLyogUmVtYWluaW5nIHJlY2VpdmUgYnVmZmVycyBsZXNzIHRoYW4KKwkJCQkJICogdHdvLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9FUlJPUgkJMHgwMDAyCS8qIEVycm9yIGR1cmluZyByaW5nIGluc2VydGlvbjsgbW9yZQorCQkJCQkgKiBpbmZvcm1hdGlvbiBpbiBiaXRzIDgtMTUuCisJCQkJCSAqLworCisvKiBTdGFuZGFyZCByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgR09PRF9DT01QTEVUSU9OCQkweDAwODAgIC8qID1PUEVOX1NVQ0NFU1NGVUxMICovCisjZGVmaW5lIElOVkFMSURfT1BFTl9PUFRJT04JMHgwMDAxICAvKiBPUEVOIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkKKwkJCQkJICogdGhlIGFkYXB0ZXIuCisJCQkJCSAqLworCisvKiBPUEVOIHBoYXNlczsgZGV0YWlscyBvZiBPUEVOX0VSUk9SIChTU0IuUGFybVswXSwgTFNCKSAgICAgICAgICAgICovCisjZGVmaW5lIE9QRU5fUEhBU0VTX01BU0sgICAgICAgICAgICAweEYwMDAgIC8qIENoZWNrIG9ubHkgdGhlIGJpdHMgOC0xMS4gKi8KKyNkZWZpbmUgTE9CRV9NRURJQV9URVNUICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQSFlTSUNBTF9JTlNFUlRJT04gICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEFERFJFU1NfVkVSSUZJQ0FUSU9OICAgICAgICAweDMwMDAKKyNkZWZpbmUgUEFSVElDSVBBVElPTl9JTl9SSU5HX1BPTEwgIDB4NDAwMAorI2RlZmluZSBSRVFVRVNUX0lOSVRJQUxJU0FUSU9OICAgICAgMHg1MDAwCisjZGVmaW5lIEZVTExEVVBMRVhfQ0hFQ0sgICAgICAgICAgICAweDYwMDAKKworLyogT1BFTiBlcnJvciBjb2RlczsgZGV0YWlscyBvZiBPUEVOX0VSUk9SIChTU0IuUGFybVswXSwgTFNCKSAqLworI2RlZmluZSBPUEVOX0VSUk9SX0NPREVTX01BU0sJMHgwRjAwICAvKiBDaGVjayBvbmx5IHRoZSBiaXRzIDEyLTE1LiAqLworI2RlZmluZSBPUEVOX0ZVTkNUSU9OX0ZBSUxVUkUgICAweDAxMDAgIC8qIFVuYWJsZSB0byB0cmFuc21pdCB0byBpdHNlbGYgb3IKKwkJCQkJICogZnJhbWVzIHJlY2VpdmVkIGJlZm9yZSBpbnNlcnRpb24uCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1NJR05BTF9MT1NTCTB4MDIwMAkvKiBTaWduYWwgbG9zcyBjb25kaXRpb24gZGV0ZWN0ZWQgYXQKKwkJCQkJICogcmVjZWl2ZXIuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1RJTUVPVVQJCTB4MDUwMAkvKiBJbnNlcnRpb24gdGltZXIgZXhwaXJlZCBiZWZvcmUKKwkJCQkJICogbG9naWNhbCBpbnNlcnRpb24uCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1JJTkdfRkFJTFVSRQkweDA2MDAJLyogVW5hYmxlIHRvIHJlY2VpdmUgb3duIHJpbmcgcHVyZ2UKKwkJCQkJICogTUFDIGZyYW1lcy4KKwkJCQkJICovCisjZGVmaW5lIE9QRU5fUklOR19CRUFDT05JTkcJMHgwNzAwCS8qIEJlYWNvbiBNQUMgZnJhbWUgcmVjZWl2ZWQgYWZ0ZXIKKwkJCQkJICogcmluZyBpbnNlcnRpb24uCisJCQkJCSAqLworI2RlZmluZSBPUEVOX0RVUExJQ0FURV9OT0RFQUREUgkweDA4MDAgIC8qIE90aGVyIHN0YXRpb24gaW4gcmluZyBmb3VuZAorCQkJCQkgKiB3aXRoIHRoZSBzYW1lIGFkZHJlc3MuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1JFUVVFU1RfSU5JVAkweDA5MDAJLyogUlBTIHByZXNlbnQgYnV0IGRvZXMgbm90IHJlc3BvbmQuICovCisjZGVmaW5lIE9QRU5fUkVNT1ZFX1JFQ0VJVkVEICAgIDB4MEEwMCAgLyogQWRhcHRlciByZWNlaXZlZCBhIHJlbW92ZSBhZGFwdGVyCisJCQkJCSAqIE1BQyBmcmFtZS4KKwkJCQkJICovCisjZGVmaW5lIE9QRU5fRlVMTERVUExFWF9TRVQJMHgwRDAwCS8qIEdvdCB0aGlzIHdpdGggZnVsbCBkdXBsZXggb24gd2hlbgorCQkJCQkgKiB0cnlpbmcgdG8gY29ubmVjdCB0byBhIG5vcm1hbCByaW5nLgorCQkJCQkgKi8KKworLyogU0VUX0JSSURHRV9QQVJNUyByZXR1cm4gY29kZXM6ICovCisjZGVmaW5lIEJSSURHRV9JTlZBTElEX01BWF9MRU4gIDB4NDAwMCAgLyogTUFYX1JPVVRJTkdfRklFTERfTEVOR1RIIG9kZCwKKwkJCQkJICogbGVzcyB0aGFuIDYgb3IgPiAzMC4KKwkJCQkJICovCisjZGVmaW5lIEJSSURHRV9JTlZBTElEX1NSQ19SSU5HIDB4MjAwMCAgLyogU09VUkNFX1JJTkcgbnVtYmVyIHplcm8sIHRvbyBsYXJnZQorCQkJCQkgKiBvciA9IFRBUkdFVF9SSU5HLgorCQkJCQkgKi8KKyNkZWZpbmUgQlJJREdFX0lOVkFMSURfVFJHX1JJTkcgMHgxMDAwICAvKiBUQVJHRVRfUklORyBudW1iZXIgemVybywgdG9vIGxhcmdlCisJCQkJCSAqIG9yID0gU09VUkNFX1JJTkcuCisJCQkJCSAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9CUkRHRV9OTyAweDA4MDAgIC8qIEJSSURHRV9OVU1CRVIgdG9vIGxhcmdlLiAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9PUFRJT05TICAweDA0MDAgIC8qIEludmFsaWQgYnJpZGdlIG9wdGlvbnMuICovCisjZGVmaW5lIEJSSURHRV9ESUFHU19GQUlMRUQgICAgIDB4MDIwMCAgLyogRGlhZ25vc3RpY3Mgb2YgVE1TMzgwU1JBIGZhaWxlZC4gKi8KKyNkZWZpbmUgQlJJREdFX05PX1NSQSAgICAgICAgICAgMHgwMTAwICAvKiBUaGUgVE1TMzgwU1JBIGRvZXMgbm90IGV4aXN0IGluIEhXCisJCQkJCSAqIGNvbmZpZ3VyYXRpb24uCisJCQkJCSAqLworCisvKgorICogQnJpbmcgVXAgRGlhZ25vc3RpY3MgZXJyb3IgY29kZXMuCisgKi8KKyNkZWZpbmUgQlVEX0lOSVRJQUxfRVJST1IgICAgICAgMHgwCisjZGVmaW5lIEJVRF9DSEVDS1NVTV9FUlJPUiAgICAgIDB4MQorI2RlZmluZSBCVURfQURBUFRFUl9SQU1fRVJST1IgICAweDIKKyNkZWZpbmUgQlVEX0lOU1RSVUNUSU9OX0VSUk9SICAgMHgzCisjZGVmaW5lIEJVRF9DT05URVhUX0VSUk9SICAgICAgIDB4NAorI2RlZmluZSBCVURfUFJPVE9DT0xfRVJST1IgICAgICAweDUKKyNkZWZpbmUgQlVEX0lOVEVSRkFDRV9FUlJPUgkweDYKKworLyogQlVEIGNvbnN0YW50cyAqLworI2RlZmluZSBCVURfTUFYX1JFVFJJRVMgICAgICAgICAzCisjZGVmaW5lIEJVRF9NQVhfTE9PUENOVCAgICAgICAgIDYKKyNkZWZpbmUgQlVEX1RJTUVPVVQgICAgICAgICAgICAgMzAwMAorCisvKiBJbml0aWFsaXphdGlvbiBjb25zdGFudHMgKi8KKyNkZWZpbmUgSU5JVF9NQVhfUkVUUklFUyAgICAgICAgMwkvKiBNYXhpbXVtIHRocmVlIHJldHJpZXMuICovCisjZGVmaW5lIElOSVRfTUFYX0xPT1BDTlQgICAgICAgIDIyICAgICAgLyogTWF4aW11bSBsb29wIGNvdW50cy4gKi8KKworLyogUklORyBTVEFUVVMgZmllbGQgdmFsdWVzIChoaWdoL2xvdykgKi8KKyNkZWZpbmUgU0lHTkFMX0xPU1MgICAgICAgICAgICAgMHgwMDgwICAvKiBMb3NzIG9mIHNpZ25hbCBvbiB0aGUgcmluZworCQkJCQkgKiBkZXRlY3RlZC4KKwkJCQkJICovCisjZGVmaW5lIEhBUkRfRVJST1IgICAgICAgICAgICAgIDB4MDA0MCAgLyogVHJhbnNtaXR0aW5nIG9yIHJlY2VpdmluZyBiZWFjb24KKwkJCQkJICogZnJhbWVzLgorCQkJCQkgKi8KKyNkZWZpbmUgU09GVF9FUlJPUiAgICAgICAgICAgICAgMHgwMDIwICAvKiBSZXBvcnQgZXJyb3IgTUFDIGZyYW1lCisJCQkJCSAqIHRyYW5zbWl0dGVkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFJBTlNNSVRfQkVBQ09OICAgICAgICAgMHgwMDEwICAvKiBUcmFuc21pdHRpbmcgYmVhY29uIGZyYW1lcyBvbiB0aGUKKwkJCQkJICogcmluZy4KKwkJCQkJICovCisjZGVmaW5lIExPQkVfV0lSRV9GQVVMVCAgICAgICAgIDB4MDAwOCAgLyogT3BlbiBvciBzaG9ydCBjaXJjdWl0IGluIHRoZQorCQkJCQkgKiBjYWJsZSB0byBjb25jZW50cmF0b3I7IGFkYXB0ZXIKKwkJCQkJICogY2xvc2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgQVVUT19SRU1PVkFMX0VSUk9SICAgICAgMHgwMDA0ICAvKiBMb2JlIHdyYXAgdGVzdCBmYWlsZWQsIGRlaW5zZXJ0ZWQ7CisJCQkJCSAqIGFkYXB0ZXIgY2xvc2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgUkVNT1ZFX1JFQ0VJVkVEICAgICAgICAgMHgwMDAxICAvKiBSZWNlaXZlZCBhIHJlbW92ZSByaW5nIHN0YXRpb24gTUFDCisJCQkJCSAqIE1BQyBmcmFtZSByZXF1ZXN0OyBhZGFwdGVyIGNsb3NlZC4KKwkJCQkJICovCisjZGVmaW5lIENPVU5URVJfT1ZFUkZMT1cgICAgICAgIDB4ODAwMCAgLyogT3ZlcmZsb3cgb2Ygb25lIG9mIHRoZSBhZGFwdGVycworCQkJCQkgKiBlcnJvciBjb3VudGVyczsgUkVBRC5FUlJPUi5MT0cuCisJCQkJCSAqLworI2RlZmluZSBTSU5HTEVfU1RBVElPTiAgICAgICAgICAweDQwMDAgIC8qIEFkYXB0ZXIgaXMgdGhlIG9ubHkgc3RhdGlvbiBvbiB0aGUKKwkJCQkJICogcmluZy4KKwkJCQkJICovCisjZGVmaW5lIFJJTkdfUkVDT1ZFUlkgICAgICAgICAgIDB4MjAwMCAgLyogQ2xhaW0gdG9rZW4gTUFDIGZyYW1lcyBvbiB0aGUgcmluZzsKKwkJCQkJICogcmVzZXQgYWZ0ZXIgcmluZyBwdXJnZSBmcmFtZS4KKwkJCQkJICovCisKKyNkZWZpbmUgQURBUFRFUl9DTE9TRUQgKExPQkVfV0lSRV9GQVVMVCB8IEFVVE9fUkVNT1ZBTF9FUlJPUiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgUkVNT1ZFX1JFQ0VJVkVEKQorCisvKiBBZGFwdGVyX2NoZWNrX2Jsb2NrLlN0YXR1cyBmaWVsZCBiaXQgYXNzaWdubWVudHM6ICovCisjZGVmaW5lIERJT19QQVJJVFkgICAgICAgICAgICAgIDB4ODAwMCAgLyogQWRhcHRlciBkZXRlY3RzIGJhZCBwYXJpdHkKKwkJCQkJICogdGhyb3VnaCBkaXJlY3QgSS9PIGFjY2Vzcy4KKwkJCQkJICovCisjZGVmaW5lIERNQV9SRUFEX0FCT1JUICAgICAgICAgIDB4NDAwMCAgLyogQWJvcnRpbmcgRE1BIHJlYWQgb3BlcmF0aW9uCisJCQkJCSAqIGZyb20gc3lzdGVtIFBhcm1bMF06IDA9dGltZW91dCwKKwkJCQkJICogMT1wYXJpdHkgZXJyb3IsIDI9YnVzIGVycm9yOworCQkJCQkgKiBQYXJtWzFdOiAzMiBiaXQgcG9pbnRlciB0byBob3N0CisJCQkJCSAqIHN5c3RlbSBhZGRyZXNzIGF0IGZhaWx1cmUuCisJCQkJCSAqLworI2RlZmluZSBETUFfV1JJVEVfQUJPUlQgICAgICAgICAweDIwMDAgIC8qIEFib3J0aW5nIERNQSB3cml0ZSBvcGVyYXRpb24KKwkJCQkJICogdG8gc3lzdGVtLiAocGFyYW1ldGVycyBhbmFsb2dvdXMgdG8KKwkJCQkJICogRE1BX1JFQURfQUJPUlQpCisJCQkJCSAqLworI2RlZmluZSBJTExFR0FMX09QX0NPREUgICAgICAgICAweDEwMDAgIC8qIElsbGVnYWwgb3BlcmF0aW9uIGNvZGUgaW4gdGhlCisJCQkJCSAqIHRoZSBhZGFwdGVycyBmaXJtd2FyZSBQYXJtWzBdLTI6CisJCQkJCSAqIGNvbW11bmljYXRpb25zIHByb2Nlc3NvciByZWdpc3RlcnMKKwkJCQkJICogUjEzLVIxNS4KKwkJCQkJICovCisjZGVmaW5lIFBBUklUWV9FUlJPUlMgICAgICAgICAgIDB4MDgwMCAgLyogQWRhcHRlciBkZXRlY3RzIGludGVybmFsIGJ1cworCQkJCQkgKiBwYXJpdHkgZXJyb3IuCisJCQkJCSAqLworI2RlZmluZSBSQU1fREFUQV9FUlJPUiAgICAgICAgICAweDAwODAgIC8qIFZhbGlkIG9ubHkgZHVyaW5nIFJBTSB0ZXN0aW5nOworCQkJCQkgKiBSQU0gZGF0YSBlcnJvciBQYXJtWzAtMV06IDMyIGJpdAorCQkJCQkgKiBwb2ludGVyIHRvIFJBTSBsb2NhdGlvbi4KKwkJCQkJICovCisjZGVmaW5lIFJBTV9QQVJJVFlfRVJST1IgICAgICAgIDB4MDA0MCAgLyogVmFsaWQgb25seSBkdXJpbmcgUkFNIHRlc3Rpbmc7CisJCQkJCSAqIFJBTSBwYXJpdHkgZXJyb3IgUGFybVswLTFdOiAzMiBiaXQKKwkJCQkJICogcG9pbnRlciB0byBSQU0gbG9jYXRpb24uCisJCQkJCSAqLworI2RlZmluZSBSSU5HX1VOREVSUlVOICAgICAgICAgICAweDAwMjAgIC8qIEludGVybmFsIERNQSB1bmRlcnJ1biB3aGVuCisJCQkJCSAqIHRyYW5zbWl0dGluZyBvbnRvIHJpbmcuCisJCQkJCSAqLworI2RlZmluZSBJTlZBTElEX0lSUSAgICAgICAgICAgICAweDAwMDggIC8qIFVucmVjb2duaXplZCBpbnRlcnJ1cHQgZ2VuZXJhdGVkCisJCQkJCSAqIGludGVybmFsIHRvIGFkYXB0ZXIgUGFybVswLTJdOgorCQkJCQkgKiBhZGFwdGVyIHJlZ2lzdGVyIFIxMy1SMTUuCisJCQkJCSAqLworI2RlZmluZSBJTlZBTElEX0VSUk9SX0lSUSAgICAgICAweDAwMDQgIC8qIFVucmVjb2duaXplZCBlcnJvciBpbnRlcnJ1cHQKKwkJCQkJICogZ2VuZXJhdGVkIFBhcm1bMC0yXTogYWRhcHRlciByZWdpc3RlcgorCQkJCQkgKiBSMTMtUjE1LgorCQkJCQkgKi8KKyNkZWZpbmUgSU5WQUxJRF9YT1AgICAgICAgICAgICAgMHgwMDAyICAvKiBVbnJlY29nbml6ZWQgWE9QIHJlcXVlc3QgaW4KKwkJCQkJICogY29tbXVuaWNhdGlvbiBwcm9jZXNzb3IgUGFybVswLTJdOgorCQkJCQkgKiBhZGFwdGVyIHJlZ2lzdGVyIFIxMy1SMTUuCisJCQkJCSAqLworI2RlZmluZSBDSEVDS0FERFIgICAgICAgICAgICAgICAweDA1RTAgIC8qIEFkYXB0ZXIgY2hlY2sgc3RhdHVzIGluZm9ybWF0aW9uCisJCQkJCSAqIGFkZHJlc3Mgb2Zmc2V0LgorCQkJCQkgKi8KKyNkZWZpbmUgUk9NX1BBR0VfMCAgICAgICAgICAgICAgMHgwMDAwICAvKiBBZGFwdGVyIFJPTSBwYWdlIDAuICovCisKKy8qCisgKiBSRUNFSVZFLlNUQVRVUyBpbnRlcnJ1cHQgcmVzdWx0IFNTQiB2YWx1ZXM6IChoaWdoLWxvdykKKyAqIChSRUNFSVZFX0NPTVBMRVRFIGZpZWxkIGJpdCBkZWZpbml0aW9ucyBpbiBTU0IuUGFybVswXSkKKyAqLworI2RlZmluZSBSWF9DT01QTEVURSAgICAgICAgICAgICAweDAwODAgIC8qIFNTQi5QYXJtWzBdOyBTU0IuUGFybVsxXTogMzIKKwkJCQkJICogYml0IHBvaW50ZXIgdG8gbGFzdCBSUEwuCisJCQkJCSAqLworI2RlZmluZSBSWF9TVVNQRU5ERUQgICAgICAgICAgICAweDAwNDAgIC8qIFNTQi5QYXJtWzBdOyBTU0IuUGFybVsxXTogMzIKKwkJCQkJICogYml0IHBvaW50ZXIgdG8gUlBMIHdpdGggb2RkCisJCQkJCSAqIGZvcndhcmQgcG9pbnRlci4KKwkJCQkJICovCisKKy8qIFZhbGlkIHJlY2VpdmUgQ1NUQVQ6ICovCisjZGVmaW5lIFJYX0ZSQU1FX0NPTlRST0xfQklUUyAoUlhfVkFMSUQgfCBSWF9TVEFSVF9GUkFNRSB8IFJYX0VORF9GUkFNRSB8IFwKKwkJCSAgICAgICBSWF9GUkFNRV9DT01QTEVURSkKKyNkZWZpbmUgVkFMSURfU0lOR0xFX0JVRkZFUl9GUkFNRSAoUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBcCisJCQkJICAgUlhfRlJBTUVfQ09NUExFVEUpCisKK3R5cGVkZWYgZW51bSBTS0JfU1RBVCBTS0JfU1RBVDsKK2VudW0gU0tCX1NUQVQgeworCVNLQl9VTkFWQUlMQUJMRSwKKwlTS0JfRE1BX0RJUkVDVCwKKwlTS0JfREFUQV9DT1BZCit9OworCisvKiBSZWNlaXZlIFBhcmFtZXRlciBMaXN0IChSUEwpIFRoZSBsZW5ndGggb2YgdGhlIFJQTHMgaGFzIHRvIGJlIGluaXRpYWxpemVkIAorICogaW4gdGhlIE9QTC4gKE9QRU4gcGFyYW1ldGVyIGxpc3QpCisgKi8KKyNkZWZpbmUgUlBMX05VTQkJMworCisjZGVmaW5lIFJYX0ZSQUdfTlVNICAgICAxCS8qIE1heGltYWwgbnVtYmVyIG9mIHVzZWQgZnJhZ21lbnRzIGluIG9uZSBSUEwuCisJCQkJICogKHVwIHRvIGZpcm13YXJlIHYyLjI0OiAzLCBub3c6IHVwIHRvIDkpCisJCQkJICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3Qgc19SUEwgUlBMOworc3RydWN0IHNfUlBMIHsJLyogUmVjZWl2ZSBQYXJhbWV0ZXIgTGlzdCAqLworCXVfaW50MzJfdCBOZXh0UlBMQWRkcjsJCS8qIFBvaW50ZXIgdG8gbmV4dCBSUEwgaW4gY2hhaW4KKwkJCQkJICogKG5vcm1hbGl6ZWQgPSBwaHlzaWNhbCAzMiBiaXQKKwkJCQkJICogYWRkcmVzcykgaWYgcG9pbnRlciBpcyBvZGQ6IHRoaXMKKwkJCQkJICogaXMgbGFzdCBSUEwuIFBvaW50aW5nIHRvIGl0c2VsZiBjYW4KKwkJCQkJICogY2F1c2UgcHJvYmxlbXMhCisJCQkJCSAqLworCXZvbGF0aWxlIHVfaW50MTZfdCBTdGF0dXM7CS8qIFNldCBieSBjcmVhdGlvbiBvZiBSZWNlaXZlIFBhcmFtZXRlcgorCQkJCQkgKiBMaXN0IFJFQ0VJVkVfQ1NUQVRfQ09NUExFVEUgc2V0IGJ5CisJCQkJCSAqIGFkYXB0ZXIgaW4gbGlzdHMgdGhhdCBzdGFydCBvciBlbmQKKwkJCQkJICogYSBmcmFtZS4KKwkJCQkJICovCisJdm9sYXRpbGUgdV9pbnQxNl90IEZyYW1lU2l6ZTsJIC8qIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBhcyBhCisJCQkJCSAqIGZyYW1lIGluY2x1ZGluZyBBQy9GQywgRGVzdGluYXRpb24sCisJCQkJCSAqIFNvdXJjZSwgUm91dGluZyBmaWVsZCBub3QgaW5jbHVkaW5nIAorCQkJCQkgKiBDUkMsIEZTIChGcmFtZSBTdGF0dXMpLCBFbmQgRGVsaW1pdGVyCisJCQkJCSAqICh2YWxpZCBvbmx5IGlmIFNUQVJUX0ZSQU1FIGJpdCBpbiAKKwkJCQkJICogQ1NUQVQgbm9uemVybykgbXVzdCBub3QgYmUgemVybyBpbgorCQkJCQkgKiBhbnkgbGlzdDsgbWF4aW11bSB2YWx1ZTogKEJVRkZFUl9TSVpFCisJCQkJCSAqIC0gOCkgKiBUWF9CVUZfTUFYIHN1bSBvZiBEYXRhQ291bnQKKwkJCQkJICogdmFsdWVzIGluIEZyYWdtZW50TGlzdCBtdXN0IGVxdWFsCisJCQkJCSAqIEZyYW1lX1NpemUgdmFsdWUgaW4gU1RBUlRfRlJBTUUgVFBMIQorCQkJCQkgKiBmcmFtZSBkYXRhIGZyYWdtZW50IGxpc3QKKwkJCQkJICovCisKKwkvKiBUUEwvUlBMIHNpemUgaW4gT1BFTiBwYXJhbWV0ZXIgbGlzdCBkZXBlbmRpbmcgb24gbWF4aW1hbCBudW1iZXJzCisJICogb2YgZnJhZ21lbnRzIHVzZWQgaW4gb25lIHBhcmFtZXRlciBsaXN0LgorCSAqLworCUZyYWdtZW50IEZyYWdMaXN0W1JYX0ZSQUdfTlVNXTsJLyogTWF4aW11bTogbmluZSBmcmFtZSBmcmFnbWVudHMgaW4KKwkJCQkJICogb25lIFRQTC4gQWN0dWFsIHZlcnNpb24gb2YgZmlybXdhcmU6CisJCQkJCSAqIDkgZnJhZ21lbnRzIHBvc3NpYmxlLgorCQkJCQkgKi8KKyNwcmFnbWEgcGFjaygpCisKKwkvKiBTcGVjaWFsIHByb3ByaWV0YXJ5IGRhdGEgYW5kIHByZWNhbGN1bGF0aW9ucy4gKi8KKwlSUEwgKk5leHRSUExQdHI7CS8qIExvZ2ljYWwgcG9pbnRlciB0byBuZXh0IFJQTCBpbiBjaGFpbi4gKi8KKwl1bnNpZ25lZCBjaGFyICpNRGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqU2tiOworCVNLQl9TVEFUIFNrYlN0YXQ7CisJaW50IFJQTEluZGV4OworCWRtYV9hZGRyX3QgRE1BQnVmZjsJCS8qIERNQSBJTyBidXMgYWRkcmVzcyBmcm9tIHBjaV9tYXAgKi8KK307CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLwordHlwZWRlZiBzdHJ1Y3QgbmV0X2xvY2FsIHsKKyNwcmFnbWEgcGFjaygxKQorCUlQQiBpcGI7CS8qIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlciBCbG9jay4gKi8KKwlTQ0Igc2NiOwkvKiBTeXN0ZW0gQ29tbWFuZCBCbG9jazogc3lzdGVtIHRvIGFkYXB0ZXIgCisJCQkgKiBjb21tdW5pY2F0aW9uLgorCQkJICovCisJU1NCIHNzYjsJLyogU3lzdGVtIFN0YXR1cyBCbG9jazogYWRhcHRlciB0byBzeXN0ZW0gCisJCQkgKiBjb21tdW5pY2F0aW9uLgorCQkJICovCisJT1BCIG9jcGw7CS8qIE9wZW4gT3B0aW9ucyBQYXJhbWV0ZXIgQmxvY2suICovCisKKwlFUlJPUlRBQiBlcnJvcmxvZ3RhYmxlOwkvKiBBZGFwdGVyIHN0YXRpc3RpYyBlcnJvciBjb3VudGVycy4KKwkJCQkgKiAocmVhZCBmcm9tIGFkYXB0ZXIgbWVtb3J5KQorCQkJCSAqLworCXVuc2lnbmVkIGNoYXIgUHJvZHVjdElEW1BST0RfSURfU0laRSArIDFdOyAvKiBQcm9kdWN0IElEICovCisjcHJhZ21hIHBhY2soKQorCisJVFBMIFRwbFtUUExfTlVNXTsKKwlUUEwgKlRwbEZyZWU7CisJVFBMICpUcGxCdXN5OworCXVuc2lnbmVkIGNoYXIgTG9jYWxUeEJ1ZmZlcnNbVFBMX05VTV1bREVGQVVMVF9QQUNLRVRfU0laRV07CisKKwlSUEwgUnBsW1JQTF9OVU1dOworCVJQTCAqUnBsSGVhZDsKKwlSUEwgKlJwbFRhaWw7CisJdW5zaWduZWQgY2hhciBMb2NhbFJ4QnVmZmVyc1tSUExfTlVNXVtERUZBVUxUX1BBQ0tFVF9TSVpFXTsKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWludCBEYXRhUmF0ZTsKKwl1bnNpZ25lZCBjaGFyIFNjYkluVXNlOworCXVuc2lnbmVkIHNob3J0IENNRHF1ZXVlOworCisJdW5zaWduZWQgbG9uZyBBZGFwdGVyT3BlbkZsYWc6MTsKKwl1bnNpZ25lZCBsb25nIEFkYXB0ZXJWaXJ0T3BlbkZsYWc6MTsKKwl1bnNpZ25lZCBsb25nIE9wZW5Db21tYW5kSXNzdWVkOjE7CisJdW5zaWduZWQgbG9uZyBUcmFuc21pdENvbW1hbmRBY3RpdmU6MTsKKwl1bnNpZ25lZCBsb25nIFRyYW5zbWl0SGFsdFNjaGVkdWxlZDoxOworCXVuc2lnbmVkIGxvbmcgSGFsdEluUHJvZ3Jlc3M6MTsKKwl1bnNpZ25lZCBsb25nIExvYmVXaXJlRmF1bHRMb2dnZWQ6MTsKKwl1bnNpZ25lZCBsb25nIFJlT3BlbkluUHJvZ3Jlc3M6MTsKKwl1bnNpZ25lZCBsb25nIFNsZWVwaW5nOjE7CisKKwl1bnNpZ25lZCBsb25nIExhc3RPcGVuU3RhdHVzOworCXVuc2lnbmVkIHNob3J0IEN1cnJlbnRSaW5nU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgTWF4UGFja2V0U2l6ZTsKKwkKKwl1bnNpZ25lZCBsb25nIFN0YXJ0VGltZTsKKwl1bnNpZ25lZCBsb25nIExhc3RTZW5kVGltZTsKKworCXN0cnVjdCB0cl9zdGF0aXN0aWNzIE1hY1N0YXQ7CS8qIE1BQyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCisJdW5zaWduZWQgbG9uZyBkbWFsaW1pdDsgLyogdGhlIG1heCBETUEgYWRkcmVzcyAoaWUsIElTQSkgKi8KKwlkbWFfYWRkcl90ICAgIGRtYWJ1ZmZlcjsgLyogdGhlIERNQSBidXMgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvCisJCQkJICAgIHByaXYuIE1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHZpcnRfdG9fYnVzKCkKKwkJCQkgICAgZm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBJTyBNTVUgKEFscGhhKSAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgd2FpdF9mb3JfdG9rX2ludDsKKworCUlOVFBUUlMgaW50cHRyczsJLyogSW50ZXJuYWwgYWRhcHRlciBwb2ludGVyLiBNdXN0IGJlIHJlYWQKKwkJCQkgKiBiZWZvcmUgT1BFTiBjb21tYW5kLgorCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICgqc2V0bnNlbG91dCkoc3RydWN0IG5ldF9kZXZpY2UgKik7CisJdW5zaWduZWQgc2hvcnQgKCpzaWZyZWFkYikoc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgc2hvcnQpOworCXZvaWQgKCpzaWZ3cml0ZWIpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CisJdW5zaWduZWQgc2hvcnQgKCpzaWZyZWFkdykoc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgc2hvcnQpOworCXZvaWQgKCpzaWZ3cml0ZXcpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CisKKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAgICAgIC8qIFNNUCBwcm90ZWN0aW9uICovCisJdm9pZCAqdG1zcHJpdjsKK30gTkVUX0xPQ0FMOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9fTElOVVhfVE1TMzgwVFJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGRiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zcGNpLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiAgdG1zcGNpLmM6IEEgZ2VuZXJpYyBuZXR3b3JrIGRyaXZlciBmb3IgVE1TMzgwLWJhc2VkIFBDSSB0b2tlbiByaW5nIGNhcmRzLgorICoKKyAqICBXcml0dGVuIDE5OTkgYnkgQWRhbSBGcml0emxlcgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKgktIFN5c0tvbm5lY3QgVFI0LzE2KCspIFBDSQkoU0stNDU5MCkKKyAqCS0gU3lzS29ubmVjdCBUUjQvMTYgUENJCQkoU0stNDU5MSkKKyAqICAgICAgLSBDb21wYXEgVFIgNC8xNiBQQ0kKKyAqICAgICAgLSBUaG9tYXMtQ29ucmFkIFRDNDA0OCA0LzE2IFBDSSAKKyAqICAgICAgLSAzQ29tIDNDMzM5IFRva2VuIExpbmsgVmVsb2NpdHkKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEFGCUFkYW0gRnJpdHpsZXIJCW1pZEBhdWsuY3gKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkzMC1EZWMtOTkJQUYJU3BsaXQgb2ZmIGZyb20gdGhlIHRtczM4MHRyIGRyaXZlci4KKyAqCTIyLUphbi0wMAlBRglVcGRhdGVkIHRvIHVzZSBpbmRpcmVjdCByZWFkL3dyaXRlcworICoJMjMtTm92LTAwCUpHCU5ldyBQQ0kgQVBJLCBjbGVhbnVwcworICoKKyAqICBUT0RPOgorICoJMS4gU2VlIGlmIHdlIGNhbiB1c2UgTU1JTyBpbnN0ZWFkIG9mIHBvcnQgYWNjZXNzZXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorInRtc3BjaS5jOiB2MS4wMiAyMy8xMS8yMDAwIGJ5IEFkYW0gRnJpdHpsZXJcbiI7CisKKyNkZWZpbmUgVE1TX1BDSV9JT19FWFRFTlQgMzIKKworc3RydWN0IGNhcmRfaW5mbyB7CisJdW5zaWduZWQgY2hhciBuc2Vsb3V0WzJdOyAvKiBOU0VMT1VUIHZhbHMgZm9yIDRtYihbMF0pIGFuZCAxNm1iKFsxXSkgKi8KKwljaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBjYXJkX2luZm8gY2FyZF9pbmZvX3RhYmxlW10gPSB7CisJeyB7MHgwMywgMHgwMX0sICJDb21wYXEgNC8xNiBUUiBQQ0kifSwKKwl7IHsweDAzLCAweDAxfSwgIlNLIE5FVCBUUiA0LzE2IFBDSSJ9LAorCXsgezB4MDMsIDB4MDF9LCAiVGhvbWFzLUNvbnJhZCBUQzQwNDggUENJIDQvMTYifSwKKwl7IHsweDAzLCAweDAxfSwgIjNDb20gVG9rZW4gTGluayBWZWxvY2l0eSJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRtc3BjaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfVE9LRU5SSU5HLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9UUiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9UQ09OUkFELCBQQ0lfREVWSUNFX0lEX1RDT05SQURfVE9LRU5SSU5HLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzMzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMyB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRtc3BjaV9wY2lfdGJsKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdm9pZCB0bXNfcGNpX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHRtc19wY2lfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG1zX3BjaV9zaWZyZWFkYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bXNfcGNpX3NpZnJlYWR3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgdG1zX3BjaV9zaWZ3cml0ZWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgdG1zX3BjaV9zaWZ3cml0ZXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0dyh2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdG1zX3BjaV9hdHRhY2goc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CQorCXN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGludCBwY2lfaXJxX2xpbmU7CisJdW5zaWduZWQgbG9uZyBwY2lfaW9hZGRyOworCXN0cnVjdCBjYXJkX2luZm8gKmNhcmRpbmZvID0gJmNhcmRfaW5mb190YWJsZVtlbnQtPmRyaXZlcl9kYXRhXTsKKwkJCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFJlbW92ZSBJL08gc3BhY2UgbWFya2VyIGluIGJpdCAwLiAqLworCXBjaV9pcnFfbGluZSA9IHBkZXYtPmlycTsKKwlwY2lfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKworCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBmb3VuZCBhIHZhbGlkIGNhcmQuICovCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lfaW9hZGRyLCBUTVNfUENJX0lPX0VYVEVOVCwgZGV2LT5uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF90cmRldjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHRtczM4MHRyX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXRfcmVnaW9uOworCisJZGV2LT5iYXNlX2FkZHIJPSBwY2lfaW9hZGRyOworCWRldi0+aXJxIAk9IHBjaV9pcnFfbGluZTsKKwlkZXYtPmRtYQk9IDA7CisKKwlwcmludGsoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBjYXJkaW5mby0+bmFtZSk7CisJcHJpbnRrKCIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJCQorCXRtc19wY2lfcmVhZF9lZXByb20oZGV2KTsKKworCXByaW50aygiJXM6ICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKwkJCisJcmV0ID0gdG1zZGV2X2luaXQoZGV2LCBQQ0lfTUFYX0FERFJFU1MsIHBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGRldi0+cHJpdi5cbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCisJdHAgPSBkZXYtPnByaXY7CisJdHAtPnNldG5zZWxvdXQgPSB0bXNfcGNpX3NldG5zZWxvdXRfcGluczsKKwkJCisJdHAtPnNpZnJlYWRiID0gdG1zX3BjaV9zaWZyZWFkYjsKKwl0cC0+c2lmcmVhZHcgPSB0bXNfcGNpX3NpZnJlYWR3OworCXRwLT5zaWZ3cml0ZWIgPSB0bXNfcGNpX3NpZndyaXRlYjsKKwl0cC0+c2lmd3JpdGV3ID0gdG1zX3BjaV9zaWZ3cml0ZXc7CisJCQorCW1lbWNweSh0cC0+UHJvZHVjdElELCBjYXJkaW5mby0+bmFtZSwgUFJPRF9JRF9TSVpFICsgMSk7CisKKwl0cC0+dG1zcHJpdiA9IGNhcmRpbmZvOworCisJZGV2LT5vcGVuID0gdG1zMzgwdHJfb3BlbjsKKwlkZXYtPnN0b3AgPSB0bXMzODB0cl9jbG9zZTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X3Rtc2RldjsKKwkKKwlyZXR1cm4gMDsKKworZXJyX291dF90bXNkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXRtc2Rldl90ZXJtKGRldik7CitlcnJfb3V0X2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CitlcnJfb3V0X3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihwY2lfaW9hZGRyLCBUTVNfUENJX0lPX0VYVEVOVCk7CitlcnJfb3V0X3RyZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWRzIE1BQyBhZGRyZXNzIGZyb20gYWRhcHRlciBSQU0sIHdoaWNoIHNob3VsZCd2ZSByZWFkIGl0IGZyb20KKyAqIHRoZSBvbmJvYXJkIFJPTS4gIAorICoKKyAqIENhbGxpbmcgdGhpcyBvbiBhIGJvYXJkIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBpdCBjYW4gYmUgYSB2ZXJ5CisgKiBkYW5nZXJvdXMgdGhpbmcuICBUaGUgTWFkZ2UgYm9hcmQsIGZvciBpbnN0YW5jZSwgd2lsbCBsb2NrIHlvdXIKKyAqIG1hY2hpbmUgaGFyZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiAgTHVja2lseSwgaXRzIHN1cHBvcnRlZCBpbiBhCisgKiBzZXBhcmF0ZSBkcml2ZXIuICAtLUFTRgorICovCitzdGF0aWMgdm9pZCB0bXNfcGNpX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJCisJLyogQWRkcmVzczogMDAwMDowMDAwICovCisJdG1zX3BjaV9zaWZ3cml0ZXcoZGV2LCAwLCBTSUZBRFgpOworCXRtc19wY2lfc2lmd3JpdGV3KGRldiwgMCwgU0lGQURSKTsJCisJCisJLyogUmVhZCBzaXggYnl0ZSBNQUMgYWRkcmVzcyBkYXRhICovCisJZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gdG1zX3BjaV9zaWZyZWFkdyhkZXYsIFNJRklOQykgPj4gODsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHRtc19wY2lfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY2FyZF9pbmZvICpjYXJkaW5mbyA9IHRwLT50bXNwcml2OworICAKKwlpZih0cC0+RGF0YVJhdGUgPT0gU1BFRURfNCkKKwkJdmFsIHw9IGNhcmRpbmZvLT5uc2Vsb3V0WzBdOwkvKiBTZXQgNE1icHMgKi8KKwllbHNlCisJCXZhbCB8PSBjYXJkaW5mby0+bnNlbG91dFsxXTsJLyogU2V0IDE2TWJwcyAqLworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0bXNfcGNpX2RldGFjaCAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghZGV2KQorCQlCVUcoKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBUTVNfUENJX0lPX0VYVEVOVCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJdG1zZGV2X3Rlcm0oZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRtc19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJ0bXNwY2kiLAorCS5pZF90YWJsZQk9IHRtc3BjaV9wY2lfdGJsLAorCS5wcm9iZQkJPSB0bXNfcGNpX2F0dGFjaCwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRtc19wY2lfZGV0YWNoKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRtc19wY2lfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdG1zX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdG1zX3BjaV9ybW1vZCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZ0bXNfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRtc19wY2lfaW5pdCk7Cittb2R1bGVfZXhpdCh0bXNfcGNpX3JtbW9kKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyB0bXNwY2kuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zcGNpLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMgYi9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisKKworc3RhdGljIHUxNiB0MjExNDJfY3NyMTNbXSA9IHsgMHgwMDAxLCAweDAwMDksIDB4MDAwOSwgMHgwMDAwLCAweDAwMDEsIH07Cit1MTYgdDIxMTQyX2NzcjE0W10gPQkgICAgeyAweEZGRkYsIDB4MDcwNSwgMHgwNzA1LCAweDAwMDAsIDB4N0YzRCwgfTsKK3N0YXRpYyB1MTYgdDIxMTQyX2NzcjE1W10gPSB7IDB4MDAwOCwgMHgwMDA2LCAweDAwMEUsIDB4MDAwOCwgMHgwMDA4LCB9OworCisKKy8qIEhhbmRsZSB0aGUgMjExNDMgdW5pcXVlbHk6IGRvIGF1dG9zZWxlY3Qgd2l0aCBOV2F5LCBub3QgdGhlIEVFUFJPTSBsaXN0CisgICBvZiBhdmFpbGFibGUgdHJhbnNjZWl2ZXJzLiAgKi8KK3ZvaWQgdDIxMTQyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCWludCBuZXdfY3NyNiA9IDA7CisKKwlpZiAodHVsaXBfZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyBuZWdvdGlhdGlvbiBzdGF0dXMgJTguOHgsICVzLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgY3NyMTIsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCWlmICh0dWxpcF9jaGVja19kdXBsZXgoZGV2KSA8IDApIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQluZXh0X3RpY2sgPSAzKkhaOworCQl9IGVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJbmV4dF90aWNrID0gNjAqSFo7CisJCX0KKwl9IGVsc2UgaWYgKHRwLT5ud2F5c2V0KSB7CisJCS8qIERvbid0IHNjcmV3IHVwIGEgbmVnb3RpYXRlZCBzZXNzaW9uISAqLworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogVXNpbmcgTldheS1zZXQgJXMgbWVkaWEsIGNzcjEyICU4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBjc3IxMik7CisJfSBlbHNlIGlmICh0cC0+bWVkaWFsb2NrKSB7CisJCQk7CisJfSBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gMykgeworCQlpZiAoY3NyMTIgJiAyKSB7CS8qIE5vIDEwMG1icHMgbGluayBiZWF0LCByZXZlcnQgdG8gMTBtYnBzLiAqLworCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPIiVzOiBObyAyMTE0MyAxMDBiYXNlVHggbGluayBiZWF0LCAlOC44eCwgIgorCQkJCQkgICAidHJ5aW5nIE5XYXkuXG4iLCBkZXYtPm5hbWUsIGNzcjEyKTsKKwkJCXQyMTE0Ml9zdGFydF9ud2F5KGRldik7CisJCQluZXh0X3RpY2sgPSAzKkhaOworCQl9CisJfSBlbHNlIGlmICgoY3NyMTIgJiAweDcwMDApICE9IDB4NTAwMCkgeworCQkvKiBOZWdvdGlhdGlvbiBmYWlsZWQuICBTZWFyY2ggbWVkaWEgdHlwZXMuICovCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyBuZWdvdGlhdGlvbiBmYWlsZWQsIHN0YXR1cyAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBjc3IxMik7CisJCWlmICghKGNzcjEyICYgNCkpIHsJCS8qIDEwbWJwcyBsaW5rIGJlYXQgZ29vZC4gKi8KKwkJCW5ld19jc3I2ID0gMHg4MjQyMDAwMDsKKwkJCWRldi0+aWZfcG9ydCA9IDA7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJaW93cml0ZTMyKDB4MDAwM0ZGRkYsIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUxNih0MjExNDJfY3NyMTVbZGV2LT5pZl9wb3J0XSwgaW9hZGRyICsgQ1NSMTUpOworCQkJaW93cml0ZTMyKHQyMTE0Ml9jc3IxM1tkZXYtPmlmX3BvcnRdLCBpb2FkZHIgKyBDU1IxMyk7CisJCX0gZWxzZSB7CisJCQkvKiBTZWxlY3QgMTAwbWJwcyBwb3J0IHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJCQluZXdfY3NyNiA9IDB4ODM4NjAwMDA7CisJCQlkZXYtPmlmX3BvcnQgPSAzOworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDNGRjdGLCBpb2FkZHIgKyBDU1IxNCk7CisJCQlpb3dyaXRlMTYoOCwgaW9hZGRyICsgQ1NSMTUpOworCQkJaW93cml0ZTMyKDEsIGlvYWRkciArIENTUjEzKTsKKwkJfQorCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogVGVzdGluZyBuZXcgMjExNDMgbWVkaWEgJXMuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0pOworCQlpZiAobmV3X2NzcjYgIT0gKHRwLT5jc3I2ICYgfjB4MDBENSkpIHsKKwkJCXRwLT5jc3I2ICY9IDB4MDBENTsKKwkJCXRwLT5jc3I2IHw9IG5ld19jc3I2OworCQkJaW93cml0ZTMyKDB4MDMwMSwgaW9hZGRyICsgQ1NSMTIpOworCQkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkJfQorCQluZXh0X3RpY2sgPSAzKkhaOworCX0KKworCS8qIG1vZF90aW1lciBzeW5jaHJvbml6ZXMgdXMgd2l0aCBwb3RlbnRpYWwgYWRkX3RpbWVyIGNhbGxzCisJICogZnJvbSBpbnRlcnJ1cHRzLgorCSAqLworCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7Cit9CisKKwordm9pZCB0MjExNDJfc3RhcnRfbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBjc3IxNCA9ICgodHAtPnN5bV9hZHZlcnRpc2UgJiAweDA3ODApIDw8IDkpICB8CisJCSgodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwMjApIDw8IDEpIHwgMHhmZmJmOworCisJZGV2LT5pZl9wb3J0ID0gMDsKKwl0cC0+bndheSA9IHRwLT5tZWRpYXNlbnNlID0gMTsKKwl0cC0+bndheXNldCA9IHRwLT5scGFyID0gMDsKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc3RhcnRpbmcgMjExNDMgYXV0b25lZ290aWF0aW9uLCBjc3IxND0lOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGNzcjE0KTsKKwlpb3dyaXRlMzIoMHgwMDAxLCBpb2FkZHIgKyBDU1IxMyk7CisJdWRlbGF5KDEwMCk7CisJaW93cml0ZTMyKGNzcjE0LCBpb2FkZHIgKyBDU1IxNCk7CisJdHAtPmNzcjYgPSAweDgyNDIwMDAwIHwgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDQwID8gRnVsbER1cGxleCA6IDApOworCWlvd3JpdGUzMih0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisJaWYgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5jc3IxNWRpcikgeworCQlpb3dyaXRlMzIodHAtPm10YWJsZS0+Y3NyMTVkaXIsIGlvYWRkciArIENTUjE1KTsKKwkJaW93cml0ZTMyKHRwLT5tdGFibGUtPmNzcjE1dmFsLCBpb2FkZHIgKyBDU1IxNSk7CisJfSBlbHNlCisJCWlvd3JpdGUxNigweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKwlpb3dyaXRlMzIoMHgxMzAxLCBpb2FkZHIgKyBDU1IxMik7IAkJLyogVHJpZ2dlciBOV0FZLiAqLworfQorCisKKwordm9pZCB0MjExNDJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyBsaW5rIHN0YXR1cyBpbnRlcnJ1cHQgJTguOHgsIENTUjUgJXgsICIKKwkJCSAgICIlOC44eC5cbiIsIGRldi0+bmFtZSwgY3NyMTIsIGNzcjUsIGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSk7CisKKwkvKiBJZiBOV2F5IGZpbmlzaGVkIGFuZCB3ZSBoYXZlIGEgbmVnb3RpYXRlZCBwYXJ0bmVyIGNhcGFiaWxpdHkuICovCisJaWYgKHRwLT5ud2F5ICAmJiAgIXRwLT5ud2F5c2V0ICAmJiAgKGNzcjEyICYgMHg3MDAwKSA9PSAweDUwMDApIHsKKwkJaW50IHNldHVwX2RvbmUgPSAwOworCQlpbnQgbmVnb3RpYXRlZCA9IHRwLT5zeW1fYWR2ZXJ0aXNlICYgKGNzcjEyID4+IDE2KTsKKwkJdHAtPmxwYXIgPSBjc3IxMiA+PiAxNjsKKwkJdHAtPm53YXlzZXQgPSAxOworCQlpZiAobmVnb3RpYXRlZCAmIDB4MDEwMCkJCWRldi0+aWZfcG9ydCA9IDU7CisJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwODApCWRldi0+aWZfcG9ydCA9IDM7CisJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwNDApCWRldi0+aWZfcG9ydCA9IDQ7CisJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwMjApCWRldi0+aWZfcG9ydCA9IDA7CisJCWVsc2UgeworCQkJdHAtPm53YXlzZXQgPSAwOworCQkJaWYgKChjc3IxMiAmIDIpID09IDAgICYmICAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAxODApKQorCQkJCWRldi0+aWZfcG9ydCA9IDM7CisJCX0KKwkJdHAtPmZ1bGxfZHVwbGV4ID0gKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFBbHdheXNGRCkgPyAxOjA7CisKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkgeworCQkJaWYgKHRwLT5ud2F5c2V0KQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gJXMgYmFzZWQgb24gbGluayAiCisJCQkJCSAgICJuZWdvdGlhdGlvbiAlNC40eCAmICU0LjR4ID0gJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCB0cC0+c3ltX2FkdmVydGlzZSwKKwkJCQkJICAgdHAtPmxwYXIsIG5lZ290aWF0ZWQpOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvbmVnb3RpYXRpb24gZmFpbGVkLCB1c2luZyAlcywiCisJCQkJCSAgICIgbGluayBiZWF0IHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sIGNzcjEyKTsKKwkJfQorCisJCWlmICh0cC0+bXRhYmxlKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCB0cC0+bXRhYmxlLT5sZWFmY291bnQ7IGkrKykKKwkJCQlpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gZGV2LT5pZl9wb3J0KSB7CisJCQkJCWludCBzdGFydHVwID0gISAoKHRwLT5jaGlwX2lkID09IERDMjExNDMgJiYgdHAtPnJldmlzaW9uID09IDY1KSk7CisJCQkJCXRwLT5jdXJfaW5kZXggPSBpOworCQkJCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCBzdGFydHVwKTsKKwkJCQkJc2V0dXBfZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQlpZiAoICEgc2V0dXBfZG9uZSkgeworCQkJdHAtPmNzcjYgPSAoZGV2LT5pZl9wb3J0ICYgMSA/IDB4ODM4RTAwMDAgOiAweDgyNDIwMDAwKSB8ICh0cC0+Y3NyNiAmIDB4MjBmZik7CisJCQlpZiAodHAtPmZ1bGxfZHVwbGV4KQorCQkJCXRwLT5jc3I2IHw9IDB4MDIwMDsKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisJCX0KKyNpZiAwCQkJCQkJCS8qIFJlc3RhcnQgc2hvdWxkbid0IGJlIG5lZWRlZC4gKi8KKwkJaW93cml0ZTMyKHRwLT5jc3I2IHwgUnhPbiwgaW9hZGRyICsgQ1NSNik7CisJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBSZXN0YXJ0aW5nIFR4IGFuZCBSeCwgQ1NSNSBpcyAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSk7CisjZW5kaWYKKwkJdHVsaXBfc3RhcnRfcnh0eCh0cCk7CisJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBTZXR0aW5nIENTUjYgJTguOHgvJXggQ1NSMTIgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgdHAtPmNzcjYsIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLAorCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisJfSBlbHNlIGlmICgodHAtPm53YXlzZXQgICYmICAoY3NyNSAmIDB4MDgwMDAwMDApCisJCQkJJiYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpCisJCQkJJiYgKGNzcjEyICYgMikgPT0gMikgfHwKKwkJCSAgICh0cC0+bndheSAmJiAoY3NyNSAmIChUUExua0ZhaWwpKSkpIHsKKwkJLyogTGluayBibGV3PyBNYXliZSByZXN0YXJ0IE5XYXkuICovCisJCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCX0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDMgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNSkgeworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgJXMgbGluayBiZWF0ICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIChjc3IxMiAmIDIpID8gImZhaWxlZCIgOiAiZ29vZCIpOworCQlpZiAoKGNzcjEyICYgMikgICYmICAhIHRwLT5tZWRpYWxvY2spIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCQkJdDIxMTQyX3N0YXJ0X253YXkoZGV2KTsKKwkJCXRwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKDMqSFopOworCQkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCQl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSA1KQorCQkJaW93cml0ZTMyKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIH4weDA4MCwgaW9hZGRyICsgQ1NSMTQpOworCX0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDAgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNCkgeworCQlpZiAoKGNzcjEyICYgNCkgPT0gMCkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzIDEwYmFzZVQgbGluayBiZWF0IGdvb2QuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICghKGNzcjEyICYgNCkpIHsJCS8qIDEwbWJwcyBsaW5rIGJlYXQgZ29vZC4gKi8KKwkJaWYgKHR1bGlwX2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgMTBtYnBzIHNlbnNlZCBtZWRpYS5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwl9IGVsc2UgaWYgKHRwLT5ud2F5c2V0KSB7CisJCWlmICh0dWxpcF9kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzIHVzaW5nIE5XYXktc2V0ICVzLCBjc3I2ICU4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCB0cC0+Y3NyNik7CisJfSBlbHNlIHsJCS8qIDEwMG1icHMgbGluayBiZWF0IGdvb2QuICovCisJCWlmICh0dWxpcF9kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzIDEwMGJhc2VUeCBzZW5zZWQgbWVkaWEuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IDM7CisJCXRwLT5jc3I2ID0gMHg4MzhFMDAwMCB8ICh0cC0+Y3NyNiAmIDB4MjBmZik7CisJCWlvd3JpdGUzMigweDAwMDNGRjdGLCBpb2FkZHIgKyBDU1IxNCk7CisJCWlvd3JpdGUzMigweDAzMDEsIGlvYWRkciArIENTUjEyKTsKKwkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3R1bGlwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjZGFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL0tjb25maWcKQEAgLTAsMCArMSwxNjYgQEAKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKFBDSSB8fCBFSVNBIHx8IENBUkRCVVMpCisKK2NvbmZpZyBORVRfVFVMSVAKKwlib29sICJcIlR1bGlwXCIgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBzZWxlY3RzIHRoZSAiVHVsaXAiIGZhbWlseSBvZiBFSVNBL1BDSSBuZXR3b3JrIGNhcmRzLgorCitjb25maWcgREUyMTA0WAorCXRyaXN0YXRlICJFYXJseSBERUNjaGlwIFR1bGlwIChkYzIxMDR4KSBQQ0kgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZGV2ZWxvcGVkIGZvciB0aGUgU01DIEV0aGVyUG93ZXIgc2VyaWVzIEV0aGVybmV0CisJICBjYXJkcyBhbmQgYWxzbyB3b3JrcyB3aXRoIGNhcmRzIGJhc2VkIG9uIHRoZSBERUNjaGlwCisJICAyMTA0MCAoVHVsaXAgc2VyaWVzKSBjaGlwcy4gIFNvbWUgTGlua1N5cyBQQ0kgY2FyZHMgYXJlCisJICBvZiB0aGlzIHR5cGUuICAoSWYgeW91ciBjYXJkIGlzIE5PVCBTTUMgRXRoZXJQb3dlciAxMC8xMDAgUENJCisJICAoc21jOTMzMmRzdCksIHlvdSBjYW4gYWxzbyB0cnkgdGhlIGRyaXZlciBmb3IgIkdlbmVyaWMgREVDY2hpcCIKKwkgIGNhcmRzLCBiZWxvdy4gIEhvd2V2ZXIsIG1vc3QgcGVvcGxlIHdpdGggYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlCisJICB3aWxsIHNheSBZIGhlcmUuKSBEbyByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgZGUyMTA0eC4KKworY29uZmlnIFRVTElQCisJdHJpc3RhdGUgIkRFQ2NoaXAgVHVsaXAgKGRjMjExNHgpIFBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGRldmVsb3BlZCBmb3IgdGhlIFNNQyBFdGhlclBvd2VyIHNlcmllcyBFdGhlcm5ldAorCSAgY2FyZHMgYW5kIGFsc28gd29ya3Mgd2l0aCBjYXJkcyBiYXNlZCBvbiB0aGUgREVDY2hpcCAKKwkgIDIxMTQwIChUdWxpcCBzZXJpZXMpIGNoaXBzLiAgU29tZSBMaW5rU3lzIFBDSSBjYXJkcyBhcmUKKwkgIG9mIHRoaXMgdHlwZS4gIChJZiB5b3VyIGNhcmQgaXMgTk9UIFNNQyBFdGhlclBvd2VyIDEwLzEwMCBQQ0kKKwkgIChzbWM5MzMyZHN0KSwgeW91IGNhbiBhbHNvIHRyeSB0aGUgZHJpdmVyIGZvciAiR2VuZXJpYyBERUNjaGlwIgorCSAgY2FyZHMsIGFib3ZlLiAgSG93ZXZlciwgbW9zdCBwZW9wbGUgd2l0aCBhIG5ldHdvcmsgY2FyZCBvZiB0aGlzIHR5cGUKKwkgIHdpbGwgc2F5IFkgaGVyZS4pIERvIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB0dWxpcC4KKworY29uZmlnIFRVTElQX01XSQorCWJvb2wgIk5ldyBidXMgY29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFRVTElQICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgY29uZmlndXJlcyB5b3VyIFR1bGlwIGNhcmQgc3BlY2lmaWNhbGx5IGZvciB0aGUgY2FyZCBhbmQKKwkgIHN5c3RlbSBjYWNoZSBsaW5lIHNpemUgdHlwZSB5b3UgYXJlIHVzaW5nLgorCisJICBUaGlzIGlzIGV4cGVyaW1lbnRhbCBjb2RlLCBub3QgeWV0IHRlc3RlZCBvbiBtYW55IGJvYXJkcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFRVTElQX01NSU8KKwlib29sICJVc2UgUENJIHNoYXJlZCBtZW0gZm9yIE5JQyByZWdpc3RlcnMiCisJZGVwZW5kcyBvbiBUVUxJUAorCWhlbHAKKwkgIFVzZSBQQ0kgc2hhcmVkIG1lbW9yeSBmb3IgdGhlIE5JQyByZWdpc3RlcnMsIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2gKKwkgIHRoZSBUdWxpcCdzIFBJTyAocHJvZ3JhbW1lZCBJL08gcG9ydHMpLiAgRmFzdGVyLCBidXQgY291bGQgcHJvZHVjZQorCSAgb2JzY3VyZSBidWdzIGlmIHlvdXIgbWFpbmJvYXJkIGhhcyBtZW1vcnkgY29udHJvbGxlciB0aW1pbmcgaXNzdWVzLgorCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgVFVMSVBfTkFQSQorCWJvb2wgIlVzZSBOQVBJIFJYIHBvbGxpbmcgIgorCWRlcGVuZHMgb24gVFVMSVAKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OCisJYm9vbCAiVXNlIEludGVycnVwdCBNaXRpZ2F0aW9uICIKKwlkZXBlbmRzIG9uIFRVTElQX05BUEkKKwktLS1oZWxwLS0tCisJICBVc2UgSFcgdG8gcmVkdWNlIFJYIGludGVycnVwdHMuIE5vdCBzdHJpY3QgbmVjZXNzYXJ5IHNpbmNlIE5BUEkgcmVkdWNlcworCSAgUlggaW50ZXJydXB0cyBidXQgaXRzZWxmLiBBbHRob3VnaCB0aGlzIHJlZHVjZXMgUlggaW50ZXJydXB0cyBldmVuIGF0CisJICBsb3cgbGV2ZWxzIHRyYWZmaWMgYXQgdGhlIGNvc3Qgb2YgYSBzbWFsbCBsYXRlbmN5LgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkuCisKK2NvbmZpZyBERTRYNQorCXRyaXN0YXRlICJHZW5lcmljIERFQ2NoaXAgJiBESUdJVEFMIEV0aGVyV09SS1MgUENJL0VJU0EiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgKFBDSSB8fCBFSVNBKQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIERJR0lUQUwgc2VyaWVzIG9mIFBDSS9FSVNBIEV0aGVybmV0IGNhcmRzLgorCSAgVGhlc2UgaW5jbHVkZSB0aGUgREU0MjUsIERFNDM0LCBERTQzNSwgREU0NTAgYW5kIERFNTAwIG1vZGVscy4gIElmCisJICB5b3UgaGF2ZSBhIG5ldHdvcmsgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkIHRoZQorCSAgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBNb3JlIHNwZWNpZmljCisJICBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZTR4NS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGRlNHg1LgorCitjb25maWcgV0lOQk9ORF84NDAKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODljODQwIEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgUENJCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgV2luYm9uZCBXODljODQwIGNoaXAuICBJdCBhbHNvIHdvcmtzIHdpdGggCisJICB0aGUgVFg5ODgyIGNoaXAgb24gdGhlIENvbXBleCBSTDEwMC1BVFggYm9hcmQuCisJICBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvZHJpdmVycy5odG1sPi4KKworY29uZmlnIERNOTEwMgorCXRyaXN0YXRlICJEYXZpY29tIERNOTEweC9ETTk4MHggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBpcyBmb3IgRE05MTAyKEEpL0RNOTEzMi9ETTk4MDEgY29tcGF0aWJsZSBQQ0kgY2FyZHMgZnJvbQorCSAgRGF2aWNvbSAoPGh0dHA6Ly93d3cuZGF2aWNvbS5jb20udHcvPikuICBJZiB5b3UgaGF2ZSBzdWNoIGEgbmV0d29yaworCSAgKEV0aGVybmV0KSBjYXJkLCBzYXkgWS4gIFNvbWUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZG1mZS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGRtZmUuCisKK2NvbmZpZyBQQ01DSUFfWElSQ09NCisJdHJpc3RhdGUgIlhpcmNvbSBDYXJkQnVzIHN1cHBvcnQgKG5ldyBkcml2ZXIpIgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIENBUkRCVVMKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIERpZ2l0YWwgIlR1bGlwIiBFdGhlcm5ldCBDYXJkQnVzIGFkYXB0ZXJzLgorCSAgSXQgc2hvdWxkIHdvcmsgd2l0aCBtb3N0IERFQyAyMSo0Ki1iYXNlZCBjaGlwcy9ldGhlcmNhcmRzLCBhcyB3ZWxsCisJICBhcyB3aXRoIHdvcmstYWxpa2UgY2hpcHMgZnJvbSBMaXRlLU9uIChQTklDKSBhbmQgTWFjcm9uaXggKE1YSUMpIGFuZAorCSAgQVNJWC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB4aXJjb21fY2IuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX1hJUlRVTElQCisJdHJpc3RhdGUgIlhpcmNvbSBUdWxpcC1saWtlIENhcmRCdXMgc3VwcG9ydCAob2xkIGRyaXZlcikiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgQ0FSREJVUyAmJiBCUk9LRU5fT05fU01QCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBEaWdpdGFsICJUdWxpcCIgRXRoZXJuZXQgQ2FyZEJ1cyBhZGFwdGVycy4KKwkgIEl0IHNob3VsZCB3b3JrIHdpdGggbW9zdCBERUMgMjEqNCotYmFzZWQgY2hpcHMvZXRoZXJjYXJkcywgYXMgd2VsbAorCSAgYXMgd2l0aCB3b3JrLWFsaWtlIGNoaXBzIGZyb20gTGl0ZS1PbiAoUE5JQykgYW5kIE1hY3Jvbml4IChNWElDKSBhbmQKKwkgIEFTSVguCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgeGlyY29tX3R1bGlwX2NiLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3R1bGlwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjliNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggIlR1bGlwIiBmYW1pbHkgbmV0d29yayBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1BDTUNJQV9YSVJUVUxJUCkJKz0geGlyY29tX3R1bGlwX2NiLm8KK29iai0kKENPTkZJR19QQ01DSUFfWElSQ09NKQkrPSB4aXJjb21fY2Iubworb2JqLSQoQ09ORklHX0RNOTEwMikJCSs9IGRtZmUubworb2JqLSQoQ09ORklHX1dJTkJPTkRfODQwKQkrPSB3aW5ib25kLTg0MC5vCitvYmotJChDT05GSUdfREUyMTA0WCkJCSs9IGRlMjEwNHgubworb2JqLSQoQ09ORklHX1RVTElQKQkJKz0gdHVsaXAubworb2JqLSQoQ09ORklHX0RFNFg1KQkJKz0gZGU0eDUubworCisjIERlY2xhcmUgbXVsdGktcGFydCBkcml2ZXJzLgorCit0dWxpcC1vYmpzCQkJOj0gZWVwcm9tLm8gaW50ZXJydXB0Lm8gbWVkaWEubyBcCisJCQkJICAgdGltZXIubyB0dWxpcF9jb3JlLm8JCVwKKwkJCQkgICAyMTE0Mi5vIHBuaWMubyBwbmljMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4ZTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMCwwICsxLDIxODcgQEAKKy8qIGRlMjEwNHguYzogQSBMaW51eCBQQ0kgRXRoZXJuZXQgZHJpdmVyIGZvciBJbnRlbC9EaWdpdGFsIDIxMDQwLzEgY2hpcHMuICovCisvKgorCUNvcHlyaWdodCAyMDAxLDIwMDMgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCisJQ29weXJpZ2h0IDE5OTQsIDE5OTUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCSAgICBbZGU0eDUuY10KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4JCSAgICBbdHVsaXAuY10KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJVE9ETywgaW4gcm91Z2ggcHJpb3JpdHkgb3JkZXI6CisJKiBTdXBwb3J0IGZvcmNpbmcgbWVkaWEgdHlwZSB3aXRoIGEgbW9kdWxlIHBhcmFtZXRlciwKKwkgIGxpa2UgZGwyay5jL3N1bmRhbmNlLmMKKwkqIENvbnN0YW50cyAobW9kdWxlIHBhcm1zPykgZm9yIFJ4IHdvcmsgbGltaXQKKwkqIENvbXBsZXRlIHJlc2V0IG9uIFBjaUVycgorCSogSnVtYm8gZnJhbWVzIC8gZGV2LT5jaGFuZ2VfbXR1CisJKiBBZGp1c3QgUnggRklGTyB0aHJlc2hvbGQgYW5kIE1heCBSeCBETUEgYnVyc3Qgb24gUnggRklGTyBlcnJvcgorCSogQWRqdXN0IFR4IEZJRk8gdGhyZXNob2xkIGFuZCBNYXggVHggRE1BIGJ1cnN0IG9uIFR4IEZJRk8gZXJyb3IKKwkqIEltcGxlbWVudCBUeCBzb2Z0d2FyZSBpbnRlcnJ1cHQgbWl0aWdhdGlvbiB2aWEKKwkgIFR4IGRlc2NyaXB0b3IgYml0CisKKyAqLworCisjZGVmaW5lIERSVl9OQU1FCQkiZGUyMTA0eCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjciCisjZGVmaW5lIERSVl9SRUxEQVRFCQkiTWFyIDE3LCAyMDA0IgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiIFBDSSBFdGhlcm5ldCBkcml2ZXIgdiIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbC9EaWdpdGFsIDIxMDQwLzEgc2VyaWVzIFBDSSBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworbW9kdWxlX3BhcmFtIChkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MgKGRlYnVnLCAiZGUyMTA0eCBiaXRtYXBwZWQgbWVzc2FnZSBlbmFibGUgbnVtYmVyIik7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktYnVmZmVyIFJ4IHN0cnVjdHVyZS4gKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSBcCisgICAgICAgIHx8IGRlZmluZWQoX19zcGFyY18pIHx8IGRlZmluZWQoX19pYTY0X18pIFwKKyAgICAgICAgfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX19taXBzX18pCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDE1MTg7CisjZWxzZQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxMDA7CisjZW5kaWYKK21vZHVsZV9wYXJhbSAocnhfY29weWJyZWFrLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAocnhfY29weWJyZWFrLCAiZGUyMTA0eCBCcmVha3BvaW50IGF0IHdoaWNoIFJ4IHBhY2tldHMgYXJlIGNvcGllZCIpOworCisjZGVmaW5lIFBGWAkJCURSVl9OQU1FICI6ICIKKworI2RlZmluZSBERV9ERUZfTVNHX0VOQUJMRQkoTkVUSUZfTVNHX0RSVgkJfCBcCisJCQkJIE5FVElGX01TR19QUk9CRSAJfCBcCisJCQkJIE5FVElGX01TR19MSU5LCQl8IFwKKwkJCQkgTkVUSUZfTVNHX0lGRE9XTgl8IFwKKwkJCQkgTkVUSUZfTVNHX0lGVVAJCXwgXAorCQkJCSBORVRJRl9NU0dfUlhfRVJSCXwgXAorCQkJCSBORVRJRl9NU0dfVFhfRVJSKQorCisjZGVmaW5lIERFX1JYX1JJTkdfU0laRQkJNjQKKyNkZWZpbmUgREVfVFhfUklOR19TSVpFCQk2NAorI2RlZmluZSBERV9SSU5HX0JZVEVTCQlcCisJCSgoc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1JYX1JJTkdfU0laRSkgKwlcCisJCShzaXplb2Yoc3RydWN0IGRlX2Rlc2MpICogREVfVFhfUklOR19TSVpFKSkKKyNkZWZpbmUgTkVYVF9UWChOKQkJKCgoTikgKyAxKSAmIChERV9UWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9SWChOKQkJKCgoTikgKyAxKSAmIChERV9SWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoQ1ApCQkJCQlcCisJKCgoQ1ApLT50eF90YWlsIDw9IChDUCktPnR4X2hlYWQpID8JCQlcCisJICAoQ1ApLT50eF90YWlsICsgKERFX1RYX1JJTkdfU0laRSAtIDEpIC0gKENQKS0+dHhfaGVhZCA6CVwKKwkgIChDUCktPnR4X3RhaWwgLSAoQ1ApLT50eF9oZWFkIC0gMSkKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisjZGVmaW5lIFJYX09GRlNFVAkJMgorCisjZGVmaW5lIERFX1NFVFVQX1NLQgkJKChzdHJ1Y3Qgc2tfYnVmZiAqKSAxKQorI2RlZmluZSBERV9EVU1NWV9TS0IJCSgoc3RydWN0IHNrX2J1ZmYgKikgMikKKyNkZWZpbmUgREVfU0VUVVBfRlJBTUVfV09SRFMJOTYKKyNkZWZpbmUgREVfRUVQUk9NX1dPUkRTCQkyNTYKKyNkZWZpbmUgREVfRUVQUk9NX1NJWkUJCShERV9FRVBST01fV09SRFMgKiBzaXplb2YodTE2KSkKKyNkZWZpbmUgREVfTUFYX01FRElBCQk1CisKKyNkZWZpbmUgREVfTUVESUFfVFBfQVVUTwkwCisjZGVmaW5lIERFX01FRElBX0JOQwkJMQorI2RlZmluZSBERV9NRURJQV9BVUkJCTIKKyNkZWZpbmUgREVfTUVESUFfVFAJCTMKKyNkZWZpbmUgREVfTUVESUFfVFBfRkQJCTQKKyNkZWZpbmUgREVfTUVESUFfSU5WQUxJRAlERV9NQVhfTUVESUEKKyNkZWZpbmUgREVfTUVESUFfRklSU1QJCTAKKyNkZWZpbmUgREVfTUVESUFfTEFTVAkJKERFX01BWF9NRURJQSAtIDEpCisjZGVmaW5lIERFX0FVSV9CTkMJCShTVVBQT1JURURfQVVJIHwgU1VQUE9SVEVEX0JOQykKKworI2RlZmluZSBERV9USU1FUl9MSU5LCQkoNjAgKiBIWikKKyNkZWZpbmUgREVfVElNRVJfTk9fTElOSwkoNSAqIEhaKQorCisjZGVmaW5lIERFX05VTV9SRUdTCQkxNgorI2RlZmluZSBERV9SRUdTX1NJWkUJCShERV9OVU1fUkVHUyAqIHNpemVvZih1MzIpKQorI2RlZmluZSBERV9SRUdTX1ZFUgkJMQorCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCSg2KkhaKQorCisjZGVmaW5lIERFX1VOQUxJR05FRF8xNihhKQkodTE2KShnZXRfdW5hbGlnbmVkKCh1MTYgKikoYSkpKQorCisvKiBUaGlzIGlzIGEgbXlzdGVyaW91cyB2YWx1ZSB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIENTUjExIGluIHRoZSAyMTA0MCAob25seSkKKyAgIHRvIHN1cHBvcnQgYSBwcmUtTldheSBmdWxsLWR1cGxleCBzaWduYWxpbmcgbWVjaGFuaXNtIHVzaW5nIHNob3J0IGZyYW1lcy4KKyAgIE5vIG9uZSBrbm93cyB3aGF0IGl0IHNob3VsZCBiZSwgYnV0IGlmIGxlZnQgYXQgaXRzIGRlZmF1bHQgdmFsdWUgc29tZQorICAgMTBiYXNlMighKSBwYWNrZXRzIHRyaWdnZXIgYSBmdWxsLWR1cGxleC1yZXF1ZXN0IGludGVycnVwdC4gKi8KKyNkZWZpbmUgRlVMTF9EVVBMRVhfTUFHSUMJMHg2OTY5CisKK2VudW0geworCS8qIE5JQyByZWdpc3RlcnMgKi8KKwlCdXNNb2RlCQkJPSAweDAwLAorCVR4UG9sbAkJCT0gMHgwOCwKKwlSeFBvbGwJCQk9IDB4MTAsCisJUnhSaW5nQWRkcgkJPSAweDE4LAorCVR4UmluZ0FkZHIJCT0gMHgyMCwKKwlNYWNTdGF0dXMJCT0gMHgyOCwKKwlNYWNNb2RlCQkJPSAweDMwLAorCUludHJNYXNrCQk9IDB4MzgsCisJUnhNaXNzZWQJCT0gMHg0MCwKKwlST01DbWQJCQk9IDB4NDgsCisJQ1NSMTEJCQk9IDB4NTgsCisJU0lBU3RhdHVzCQk9IDB4NjAsCisJQ1NSMTMJCQk9IDB4NjgsCisJQ1NSMTQJCQk9IDB4NzAsCisJQ1NSMTUJCQk9IDB4NzgsCisJUENJUE0JCQk9IDB4NDAsCisKKwkvKiBCdXNNb2RlIGJpdHMgKi8KKwlDbWRSZXNldAkJPSAoMSA8PCAwKSwKKwlDYWNoZUFsaWduMTYJCT0gMHgwMDAwODAwMCwKKwlCdXJzdExlbjQJCT0gMHgwMDAwMDQwMCwKKworCS8qIFJ4L1R4UG9sbCBiaXRzICovCisJTm9ybWFsVHhQb2xsCQk9ICgxIDw8IDApLAorCU5vcm1hbFJ4UG9sbAkJPSAoMSA8PCAwKSwKKworCS8qIFR4L1J4IGRlc2NyaXB0b3Igc3RhdHVzIGJpdHMgKi8KKwlEZXNjT3duCQkJPSAoMSA8PCAzMSksCisJUnhFcnJvcgkJCT0gKDEgPDwgMTUpLAorCVJ4RXJyTG9uZwkJPSAoMSA8PCA3KSwKKwlSeEVyckNSQwkJPSAoMSA8PCAxKSwKKwlSeEVyckZJRk8JCT0gKDEgPDwgMCksCisJUnhFcnJSdW50CQk9ICgxIDw8IDExKSwKKwlSeEVyckZyYW1lCQk9ICgxIDw8IDE0KSwKKwlSaW5nRW5kCQkJPSAoMSA8PCAyNSksCisJRmlyc3RGcmFnCQk9ICgxIDw8IDI5KSwKKwlMYXN0RnJhZwkJPSAoMSA8PCAzMCksCisJVHhFcnJvcgkJCT0gKDEgPDwgMTUpLAorCVR4RklGT1VuZGVyCQk9ICgxIDw8IDEpLAorCVR4TGlua0ZhaWwJCT0gKDEgPDwgMikgfCAoMSA8PCAxMCkgfCAoMSA8PCAxMSksCisJVHhNYXhDb2wJCT0gKDEgPDwgOCksCisJVHhPV0MJCQk9ICgxIDw8IDkpLAorCVR4SmFiYmVyCQk9ICgxIDw8IDE0KSwKKwlTZXR1cEZyYW1lCQk9ICgxIDw8IDI3KSwKKwlUeFN3SW50CQkJPSAoMSA8PCAzMSksCisKKwkvKiBNYWNTdGF0dXMgYml0cyAqLworCUludHJPSwkJCT0gKDEgPDwgMTYpLAorCUludHJFcnIJCQk9ICgxIDw8IDE1KSwKKwlSeEludHIJCQk9ICgxIDw8IDYpLAorCVJ4RW1wdHkJCQk9ICgxIDw8IDcpLAorCVR4SW50cgkJCT0gKDEgPDwgMCksCisJVHhFbXB0eQkJCT0gKDEgPDwgMiksCisJUGNpRXJyCQkJPSAoMSA8PCAxMyksCisJVHhTdGF0ZQkJCT0gKDEgPDwgMjIpIHwgKDEgPDwgMjEpIHwgKDEgPDwgMjApLAorCVJ4U3RhdGUJCQk9ICgxIDw8IDE5KSB8ICgxIDw8IDE4KSB8ICgxIDw8IDE3KSwKKwlMaW5rRmFpbAkJPSAoMSA8PCAxMiksCisJTGlua1Bhc3MJCT0gKDEgPDwgNCksCisJUnhTdG9wcGVkCQk9ICgxIDw8IDgpLAorCVR4U3RvcHBlZAkJPSAoMSA8PCAxKSwKKworCS8qIE1hY01vZGUgYml0cyAqLworCVR4RW5hYmxlCQk9ICgxIDw8IDEzKSwKKwlSeEVuYWJsZQkJPSAoMSA8PCAxKSwKKwlSeFR4CQkJPSBUeEVuYWJsZSB8IFJ4RW5hYmxlLAorCUZ1bGxEdXBsZXgJCT0gKDEgPDwgOSksCisJQWNjZXB0QWxsTXVsdGljYXN0CT0gKDEgPDwgNyksCisJQWNjZXB0QWxsUGh5cwkJPSAoMSA8PCA2KSwKKwlCT0NudAkJCT0gKDEgPDwgNSksCisJTWFjTW9kZUNsZWFyCQk9ICgxPDwxMikgfCAoMTw8MTEpIHwgKDE8PDEwKSB8ICgxPDw4KSB8ICgxPDwzKSB8CisJCQkJICBSeFR4IHwgQk9DbnQgfCBBY2NlcHRBbGxQaHlzIHwgQWNjZXB0QWxsTXVsdGljYXN0LAorCisJLyogUk9NQ21kIGJpdHMgKi8KKwlFRV9TSElGVF9DTEsJCT0gMHgwMiwJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworCUVFX0NTCQkJPSAweDAxLAkvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisJRUVfREFUQV9XUklURQkJPSAweDA0LAkvKiBEYXRhIGZyb20gdGhlIFR1bGlwIHRvIEVFUFJPTS4gKi8KKwlFRV9XUklURV8wCQk9IDB4MDEsCisJRUVfV1JJVEVfMQkJPSAweDA1LAorCUVFX0RBVEFfUkVBRAkJPSAweDA4LAkvKiBEYXRhIGZyb20gdGhlIEVFUFJPTSBjaGlwLiAqLworCUVFX0VOQgkJCT0gKDB4NDgwMCB8IEVFX0NTKSwKKworCS8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworCUVFX1JFQURfQ01ECQk9IDYsCisKKwkvKiBSeE1pc3NlZCBiaXRzICovCisJUnhNaXNzZWRPdmVyCQk9ICgxIDw8IDE2KSwKKwlSeE1pc3NlZE1hc2sJCT0gMHhmZmZmLAorCisJLyogU1JPTS1yZWxhdGVkIGJpdHMgKi8KKwlTUk9NQzBJbmZvTGVhZgkJPSAyNywKKwlNZWRpYUJsb2NrTWFzawkJPSAweDNmLAorCU1lZGlhQ3VzdG9tQ1NScwkJPSAoMSA8PCA2KSwKKwkKKwkvKiBQQ0lQTSBiaXRzICovCisJUE1fU2xlZXAJCT0gKDEgPDwgMzEpLAorCVBNX1Nub296ZQkJPSAoMSA8PCAzMCksCisJUE1fTWFzawkJCT0gUE1fU2xlZXAgfCBQTV9Tbm9vemUsCisJCisJLyogU0lBU3RhdHVzIGJpdHMgKi8KKwlOV2F5U3RhdGUJCT0gKDEgPDwgMTQpIHwgKDEgPDwgMTMpIHwgKDEgPDwgMTIpLAorCU5XYXlSZXN0YXJ0CQk9ICgxIDw8IDEyKSwKKwlOb25zZWxQb3J0QWN0aXZlCT0gKDEgPDwgOSksCisJTGlua0ZhaWxTdGF0dXMJCT0gKDEgPDwgMiksCisJTmV0Q3huRXJyCQk9ICgxIDw8IDEpLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBkZV9pbnRyX21hc2sgPQorCUludHJPSyB8IEludHJFcnIgfCBSeEludHIgfCBSeEVtcHR5IHwgVHhJbnRyIHwgVHhFbXB0eSB8CisJTGlua1Bhc3MgfCBMaW5rRmFpbCB8IFBjaUVycjsKKworLyoKKyAqIFNldCB0aGUgcHJvZ3JhbW1hYmxlIGJ1cnN0IGxlbmd0aCB0byA0IGxvbmd3b3JkcyBmb3IgYWxsOgorICogRE1BIGVycm9ycyByZXN1bHQgd2l0aG91dCB0aGVzZSB2YWx1ZXMuIENhY2hlIGFsaWduIDE2IGxvbmcuCisgKi8KK3N0YXRpYyBjb25zdCB1MzIgZGVfYnVzX21vZGUgPSBDYWNoZUFsaWduMTYgfCBCdXJzdExlbjQ7CisKK3N0cnVjdCBkZV9zcm9tX21lZGlhX2Jsb2NrIHsKKwl1OAkJCW9wdHM7CisJdTE2CQkJY3NyMTM7CisJdTE2CQkJY3NyMTQ7CisJdTE2CQkJY3NyMTU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYgeworCXUxNgkJCWRlZmF1bHRfbWVkaWE7CisJdTgJCQluX2Jsb2NrczsKKwl1OAkJCXVudXNlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZV9kZXNjIHsKKwl1MzIJCQlvcHRzMTsKKwl1MzIJCQlvcHRzMjsKKwl1MzIJCQlhZGRyMTsKKwl1MzIJCQlhZGRyMjsKK307CisKK3N0cnVjdCBtZWRpYV9pbmZvIHsKKwl1MTYJCQl0eXBlOwkvKiBERV9NRURJQV94eHggKi8KKwl1MTYJCQljc3IxMzsKKwl1MTYJCQljc3IxNDsKKwl1MTYJCQljc3IxNTsKK307CisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkqc2tiOworCWRtYV9hZGRyX3QJCW1hcHBpbmc7Cit9OworCitzdHJ1Y3QgZGVfcHJpdmF0ZSB7CisJdW5zaWduZWQJCXR4X2hlYWQ7CisJdW5zaWduZWQJCXR4X3RhaWw7CisJdW5zaWduZWQJCXJ4X3RhaWw7CisKKwl2b2lkCQkJX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgZGVfZGVzYwkJKnJ4X3Jpbmc7CisJc3RydWN0IGRlX2Rlc2MJCSp0eF9yaW5nOworCXN0cnVjdCByaW5nX2luZm8JdHhfc2tiW0RFX1RYX1JJTkdfU0laRV07CisJc3RydWN0IHJpbmdfaW5mbwlyeF9za2JbREVfUlhfUklOR19TSVpFXTsKKwl1bnNpZ25lZAkJcnhfYnVmX3N6OworCWRtYV9hZGRyX3QJCXJpbmdfZG1hOworCisJdTMyCQkJbXNnX2VuYWJsZTsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKworCXUxNgkJCXNldHVwX2ZyYW1lW0RFX1NFVFVQX0ZSQU1FX1dPUkRTXTsKKworCXUzMgkJCW1lZGlhX3R5cGU7CisJdTMyCQkJbWVkaWFfc3VwcG9ydGVkOworCXUzMgkJCW1lZGlhX2FkdmVydGlzZTsKKwlzdHJ1Y3QgbWVkaWFfaW5mbwltZWRpYVtERV9NQVhfTUVESUFdOworCXN0cnVjdCB0aW1lcl9saXN0CW1lZGlhX3RpbWVyOworCisJdTgJCQkqZWVfZGF0YTsKKwl1bnNpZ25lZAkJYm9hcmRfaWR4OworCXVuc2lnbmVkCQlkZTIxMDQwIDogMTsKKwl1bnNpZ25lZAkJbWVkaWFfbG9jayA6IDE7Cit9OworCisKK3N0YXRpYyB2b2lkIGRlX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRlX3R4IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpOworc3RhdGljIHZvaWQgZGVfY2xlYW5fcmluZ3MgKHN0cnVjdCBkZV9wcml2YXRlICpkZSk7CitzdGF0aWMgdm9pZCBkZV9tZWRpYV9pbnRlcnJ1cHQgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyIHN0YXR1cyk7CitzdGF0aWMgdm9pZCBkZTIxMDQwX21lZGlhX3RpbWVyICh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZGUyMTA0MV9tZWRpYV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVfb2tfdG9fYWR2ZXJ0aXNlIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiBuZXdfbWVkaWEpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRlX3BjaV90YmwpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhX25hbWVbREVfTUFYX01FRElBXSA9IHsKKwkiMTBiYXNlVCBhdXRvIiwKKwkiQk5DIiwKKwkiQVVJIiwKKwkiMTBiYXNlVC1IRCIsCisJIjEwYmFzZVQtRkQiCit9OworCisvKiAyMTA0MCB0cmFuc2NlaXZlciByZWdpc3RlciBzZXR0aW5nczoKKyAqIFRQIEFVVE8odW51c2VkKSwgQk5DKHVudXNlZCksIEFVSSwgVFAsIFRQIEZEKi8KK3N0YXRpYyB1MTYgdDIxMDQwX2NzcjEzW10gPSB7IDAsIDAsIDB4OEYwOSwgMHg4RjAxLCAweDhGMDEsIH07CitzdGF0aWMgdTE2IHQyMTA0MF9jc3IxNFtdID0geyAwLCAwLCAweDA3MDUsIDB4RkZGRiwgMHhGRkZELCB9Oworc3RhdGljIHUxNiB0MjEwNDBfY3NyMTVbXSA9IHsgMCwgMCwgMHgwMDA2LCAweDAwMDAsIDB4MDAwMCwgfTsKKworLyogMjEwNDEgdHJhbnNjZWl2ZXIgcmVnaXN0ZXIgc2V0dGluZ3M6IFRQIEFVVE8sIEJOQywgQVVJLCBUUCwgVFAgRkQqLworc3RhdGljIHUxNiB0MjEwNDFfY3NyMTNbXSA9IHsgMHhFRjAxLCAweEVGMDksIDB4RUYwOSwgMHhFRjAxLCAweEVGMDksIH07CitzdGF0aWMgdTE2IHQyMTA0MV9jc3IxNFtdID0geyAweEZGRkYsIDB4RjdGRCwgMHhGN0ZELCAweDZGM0YsIDB4NkYzRCwgfTsKK3N0YXRpYyB1MTYgdDIxMDQxX2NzcjE1W10gPSB7IDB4MDAwOCwgMHgwMDA2LCAweDAwMEUsIDB4MDAwOCwgMHgwMDA4LCB9OworCisKKyNkZWZpbmUgZHIzMihyZWcpCQlyZWFkbChkZS0+cmVncyArIChyZWcpKQorI2RlZmluZSBkdzMyKHJlZyx2YWwpCQl3cml0ZWwoKHZhbCksIGRlLT5yZWdzICsgKHJlZykpCisKKworc3RhdGljIHZvaWQgZGVfcnhfZXJyX2FjY3QgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdW5zaWduZWQgcnhfdGFpbCwKKwkJCSAgICB1MzIgc3RhdHVzLCB1MzIgbGVuKQoreworCWlmIChuZXRpZl9tc2dfcnhfZXJyIChkZSkpCisJCXByaW50ayAoS0VSTl9ERUJVRworCQkJIiVzOiByeCBlcnIsIHNsb3QgJWQgc3RhdHVzIDB4JXggbGVuICVkXG4iLAorCQkJZGUtPmRldi0+bmFtZSwgcnhfdGFpbCwgc3RhdHVzLCBsZW4pOworCisJaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKwkJLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJaWYgKChzdGF0dXMgJiAweGZmZmYpICE9IDB4N2ZmZikgeworCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoZGUpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgIgorCQkJCQkgICAic3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCBzdGF0dXMgJTguOHghXG4iLAorCQkJCQkgICBkZS0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJZGUtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4RXJyb3IpIHsKKwkJLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICovCisJCWRlLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworCQlpZiAoc3RhdHVzICYgMHgwODkwKSBkZS0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJ4RXJyQ1JDKSBkZS0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJ4RXJyRklGTykgZGUtPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCX0KK30KKworc3RhdGljIHZvaWQgZGVfcnggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCByeF90YWlsID0gZGUtPnJ4X3RhaWw7CisJdW5zaWduZWQgcnhfd29yayA9IERFX1JYX1JJTkdfU0laRTsKKwl1bnNpZ25lZCBkcm9wID0gMDsKKwlpbnQgcmM7CisKKwl3aGlsZSAocnhfd29yay0tKSB7CisJCXUzMiBzdGF0dXMsIGxlbjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqY29weV9za2I7CisJCXVuc2lnbmVkIGNvcHlpbmdfc2tiLCBidWZsZW47CisKKwkJc2tiID0gZGUtPnJ4X3NrYltyeF90YWlsXS5za2I7CisJCWlmICghc2tiKQorCQkJQlVHKCk7CisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZS0+cnhfcmluZ1tyeF90YWlsXS5vcHRzMSk7CisJCWlmIChzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisKKwkJbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKwkJbWFwcGluZyA9IGRlLT5yeF9za2JbcnhfdGFpbF0ubWFwcGluZzsKKworCQlpZiAodW5saWtlbHkoZHJvcCkpIHsKKwkJCWRlLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byByeF9uZXh0OworCQl9CisKKwkJaWYgKHVubGlrZWx5KChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApKSB7CisJCQlkZV9yeF9lcnJfYWNjdChkZSwgcnhfdGFpbCwgc3RhdHVzLCBsZW4pOworCQkJZ290byByeF9uZXh0OworCQl9CisKKwkJY29weWluZ19za2IgPSAobGVuIDw9IHJ4X2NvcHlicmVhayk7CisKKwkJaWYgKHVubGlrZWx5KG5ldGlmX21zZ19yeF9zdGF0dXMoZGUpKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnggc2xvdCAlZCBzdGF0dXMgMHgleCBsZW4gJWQgY29weWluZz8gJWRcbiIsCisJCQkgICAgICAgZGUtPmRldi0+bmFtZSwgcnhfdGFpbCwgc3RhdHVzLCBsZW4sCisJCQkgICAgICAgY29weWluZ19za2IpOworCisJCWJ1ZmxlbiA9IGNvcHlpbmdfc2tiID8gKGxlbiArIFJYX09GRlNFVCkgOiBkZS0+cnhfYnVmX3N6OworCQljb3B5X3NrYiA9IGRldl9hbGxvY19za2IgKGJ1Zmxlbik7CisJCWlmICh1bmxpa2VseSghY29weV9za2IpKSB7CisJCQlkZS0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWRyb3AgPSAxOworCQkJcnhfd29yayA9IDEwMDsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCQljb3B5X3NrYi0+ZGV2ID0gZGUtPmRldjsKKworCQlpZiAoIWNvcHlpbmdfc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRlLT5wZGV2LCBtYXBwaW5nLAorCQkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJCW1hcHBpbmcgPQorCQkJZGUtPnJ4X3NrYltyeF90YWlsXS5tYXBwaW5nID0KKwkJCQlwY2lfbWFwX3NpbmdsZShkZS0+cGRldiwgY29weV9za2ItPnRhaWwsCisJCQkJCSAgICAgICBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZS0+cnhfc2tiW3J4X3RhaWxdLnNrYiA9IGNvcHlfc2tiOworCQl9IGVsc2UgeworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRlLT5wZGV2LCBtYXBwaW5nLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgUlhfT0ZGU0VUKTsKKwkJCW1lbWNweShza2JfcHV0KGNvcHlfc2tiLCBsZW4pLCBza2ItPnRhaWwsIGxlbik7CisKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBXZSdsbCByZXVzZSB0aGUgb3JpZ2luYWwgcmluZyBidWZmZXIuICovCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyAoc2tiLCBkZS0+ZGV2KTsKKworCQlkZS0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGUtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGUtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCXJjID0gbmV0aWZfcnggKHNrYik7CisJCWlmIChyYyA9PSBORVRfUlhfRFJPUCkKKwkJCWRyb3AgPSAxOworCityeF9uZXh0OgorCQlkZS0+cnhfcmluZ1tyeF90YWlsXS5vcHRzMSA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQlpZiAocnhfdGFpbCA9PSAoREVfUlhfUklOR19TSVpFIC0gMSkpCisJCQlkZS0+cnhfcmluZ1tyeF90YWlsXS5vcHRzMiA9CisJCQkJY3B1X3RvX2xlMzIoUmluZ0VuZCB8IGRlLT5yeF9idWZfc3opOworCQllbHNlCisJCQlkZS0+cnhfcmluZ1tyeF90YWlsXS5vcHRzMiA9IGNwdV90b19sZTMyKGRlLT5yeF9idWZfc3opOworCQlkZS0+cnhfcmluZ1tyeF90YWlsXS5hZGRyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCQlyeF90YWlsID0gTkVYVF9SWChyeF90YWlsKTsKKwl9CisKKwlpZiAoIXJ4X3dvcmspCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeCB3b3JrIGxpbWl0IHJlYWNoZWRcbiIsIGRlLT5kZXYtPm5hbWUpOworCisJZGUtPnJ4X3RhaWwgPSByeF90YWlsOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkcjMyKE1hY1N0YXR1cyk7CisJaWYgKCghKHN0YXR1cyAmIChJbnRyT0t8SW50ckVycikpKSB8fCAoc3RhdHVzID09IDB4RkZGRikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmIChuZXRpZl9tc2dfaW50cihkZSkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ciwgc3RhdHVzICUwOHggbW9kZSAlMDh4IGRlc2MgJXUvJXUvJXVcbiIsCisJCSAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIGRyMzIoTWFjTW9kZSksIGRlLT5yeF90YWlsLCBkZS0+dHhfaGVhZCwgZGUtPnR4X3RhaWwpOworCisJZHczMihNYWNTdGF0dXMsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgKFJ4SW50ciB8IFJ4RW1wdHkpKSB7CisJCWRlX3J4KGRlKTsKKwkJaWYgKHN0YXR1cyAmIFJ4RW1wdHkpCisJCQlkdzMyKFJ4UG9sbCwgTm9ybWFsUnhQb2xsKTsKKwl9CisKKwlzcGluX2xvY2soJmRlLT5sb2NrKTsKKworCWlmIChzdGF0dXMgJiAoVHhJbnRyIHwgVHhFbXB0eSkpCisJCWRlX3R4KGRlKTsKKworCWlmIChzdGF0dXMgJiAoTGlua1Bhc3MgfCBMaW5rRmFpbCkpCisJCWRlX21lZGlhX2ludGVycnVwdChkZSwgc3RhdHVzKTsKKworCXNwaW5fdW5sb2NrKCZkZS0+bG9jayk7CisKKwlpZiAoc3RhdHVzICYgUGNpRXJyKSB7CisJCXUxNiBwY2lfc3RhdHVzOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRlLT5wZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZS0+cGRldiwgUENJX1NUQVRVUywgcGNpX3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBidXMgZXJyb3IsIHN0YXR1cz0lMDh4LCBQQ0kgc3RhdHVzPSUwNHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cywgcGNpX3N0YXR1cyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBkZV90eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIHR4X2hlYWQgPSBkZS0+dHhfaGVhZDsKKwl1bnNpZ25lZCB0eF90YWlsID0gZGUtPnR4X3RhaWw7CisKKwl3aGlsZSAodHhfdGFpbCAhPSB0eF9oZWFkKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXUzMiBzdGF0dXM7CisKKwkJcm1iKCk7CisJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KGRlLT50eF9yaW5nW3R4X3RhaWxdLm9wdHMxKTsKKwkJaWYgKHN0YXR1cyAmIERlc2NPd24pCisJCQlicmVhazsKKworCQlza2IgPSBkZS0+dHhfc2tiW3R4X3RhaWxdLnNrYjsKKwkJaWYgKCFza2IpCisJCQlCVUcoKTsKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBERV9EVU1NWV9TS0IpKQorCQkJZ290byBuZXh0OworCisJCWlmICh1bmxpa2VseShza2IgPT0gREVfU0VUVVBfU0tCKSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgZGUtPnR4X3NrYlt0eF90YWlsXS5tYXBwaW5nLAorCQkJCQkgc2l6ZW9mKGRlLT5zZXR1cF9mcmFtZSksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgZGUtPnR4X3NrYlt0eF90YWlsXS5tYXBwaW5nLAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJaWYgKHN0YXR1cyAmIExhc3RGcmFnKSB7CisJCQlpZiAoc3RhdHVzICYgVHhFcnJvcikgeworCQkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGRlKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBlcnIsIHN0YXR1cyAweCV4XG4iLAorCQkJCQkgICAgICAgZGUtPmRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQlkZS0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeE9XQykKKwkJCQkJZGUtPm5ldF9zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4TWF4Q29sKQorCQkJCQlkZS0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4TGlua0ZhaWwpCisJCQkJCWRlLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhGSUZPVW5kZXIpCisJCQkJCWRlLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQlpZiAobmV0aWZfbXNnX3R4X2RvbmUoZGUpKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGRvbmUsIHNsb3QgJWRcbiIsIGRlLT5kZXYtPm5hbWUsIHR4X3RhaWwpOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJfQorCituZXh0OgorCQlkZS0+dHhfc2tiW3R4X3RhaWxdLnNrYiA9IE5VTEw7CisKKwkJdHhfdGFpbCA9IE5FWFRfVFgodHhfdGFpbCk7CisJfQorCisJZGUtPnR4X3RhaWwgPSB0eF90YWlsOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGUtPmRldikgJiYgKFRYX0JVRkZTX0FWQUlMKGRlKSA+IChERV9UWF9SSU5HX1NJWkUgLyA0KSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGUtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgZGVfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGVudHJ5LCB0eF9mcmVlOworCXUzMiBtYXBwaW5nLCBsZW4sIGZsYWdzID0gRmlyc3RGcmFnIHwgTGFzdEZyYWc7CisJc3RydWN0IGRlX2Rlc2MgKnR4ZDsKKworCXNwaW5fbG9ja19pcnEoJmRlLT5sb2NrKTsKKworCXR4X2ZyZWUgPSBUWF9CVUZGU19BVkFJTChkZSk7CisJaWYgKHR4X2ZyZWUgPT0gMCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisJdHhfZnJlZS0tOworCisJZW50cnkgPSBkZS0+dHhfaGVhZDsKKworCXR4ZCA9ICZkZS0+dHhfcmluZ1tlbnRyeV07CisKKwlsZW4gPSBza2ItPmxlbjsKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoZW50cnkgPT0gKERFX1RYX1JJTkdfU0laRSAtIDEpKQorCQlmbGFncyB8PSBSaW5nRW5kOworCWlmICghdHhfZnJlZSB8fCAodHhfZnJlZSA9PSAoREVfVFhfUklOR19TSVpFIC8gMikpKQorCQlmbGFncyB8PSBUeFN3SW50OworCWZsYWdzIHw9IGxlbjsKKwl0eGQtPm9wdHMyID0gY3B1X3RvX2xlMzIoZmxhZ3MpOworCXR4ZC0+YWRkcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKworCWRlLT50eF9za2JbZW50cnldLnNrYiA9IHNrYjsKKwlkZS0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZzsKKwl3bWIoKTsKKworCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl3bWIoKTsKKworCWRlLT50eF9oZWFkID0gTkVYVF9UWChlbnRyeSk7CisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoZGUpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgc2tibGVuICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeSwgc2tiLT5sZW4pOworCisJaWYgKHR4X2ZyZWUgPT0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJZHczMihUeFBvbGwsIE5vcm1hbFR4UG9sbCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIGRlLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KKworI3VuZGVmIHNldF9iaXRfbGUKKyNkZWZpbmUgc2V0X2JpdF9sZShpLHApIGRvIHsgKChjaGFyICopKHApKVsoaSkvOF0gfD0gKDE8PCgoaSklOCkpOyB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX2hhc2godTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXUxNiBoYXNoX3RhYmxlWzMyXTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKwl1MTYgKmVhZGRyczsKKworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCXNldF9iaXRfbGUoMjU1LCBoYXNoX3RhYmxlKTsgCQkJLyogQnJvYWRjYXN0IGVudHJ5ICovCisJLyogVGhpcyBzaG91bGQgd29yayBvbiBiaWctZW5kaWFuIG1hY2hpbmVzIGFzIHdlbGwuICovCisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQlpbnQgaW5kZXggPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgxZmY7CisKKwkJc2V0X2JpdF9sZShpbmRleCwgaGFzaF90YWJsZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCSpzZXR1cF9mcm0rKyA9IGhhc2hfdGFibGVbaV07CisJCQkqc2V0dXBfZnJtKysgPSBoYXNoX3RhYmxlW2ldOworCQl9CisJCXNldHVwX2ZybSA9ICZkZS0+c2V0dXBfZnJhbWVbMTMqNl07CisJfQorCisJLyogRmlsbCB0aGUgZmluYWwgZW50cnkgd2l0aCBvdXIgcGh5c2ljYWwgYWRkcmVzcy4gKi8KKwllYWRkcnMgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfc2V0dXBfZnJhbWVfcGVyZmVjdCh1MTYgKnNldHVwX2ZybSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwkvKiBXZSBoYXZlIDw9IDE0IGFkZHJlc3NlcyBzbyB3ZSBjYW4gdXNlIHRoZSB3b25kZXJmdWwKKwkgICAxNiBhZGRyZXNzIHBlcmZlY3QgZmlsdGVyaW5nIG9mIHRoZSBUdWxpcC4gKi8KKwlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJZWFkZHJzID0gKHUxNiAqKW1jbGlzdC0+ZG1pX2FkZHI7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJfQorCS8qIEZpbGwgdGhlIHVudXNlZCBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworCW1lbXNldChzZXR1cF9mcm0sIDB4ZmYsICgxNS1pKSoxMik7CisJc2V0dXBfZnJtID0gJmRlLT5zZXR1cF9mcmFtZVsxNSo2XTsKKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKKworc3RhdGljIHZvaWQgX19kZV9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdTMyIG1hY21vZGU7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXUzMiBtYXBwaW5nOworCXN0cnVjdCBkZV9kZXNjICp0eGQ7CisJc3RydWN0IGRlX2Rlc2MgKmR1bW15X3R4ZCA9IE5VTEw7CisKKwltYWNtb2RlID0gZHIzMihNYWNNb2RlKSAmIH4oQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5cyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJbWFjbW9kZSB8PSBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRBbGxQaHlzOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGRldi0+bWNfY291bnQgPiAxMDAwKSB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHdlbGwgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltYWNtb2RlIHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm90ZSB0aGF0IG9ubHkgdGhlIGxvdy1hZGRyZXNzIHNob3J0d29yZCBvZiBzZXR1cF9mcmFtZSBpcyB2YWxpZCEKKwkgICBUaGUgdmFsdWVzIGFyZSBkb3VibGVkIGZvciBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuICovCisJaWYgKGRldi0+bWNfY291bnQgPiAxNCkJLyogTXVzdCB1c2UgYSBtdWx0aWNhc3QgaGFzaCB0YWJsZS4gKi8KKwkJYnVpbGRfc2V0dXBfZnJhbWVfaGFzaCAoZGUtPnNldHVwX2ZyYW1lLCBkZXYpOworCWVsc2UKKwkJYnVpbGRfc2V0dXBfZnJhbWVfcGVyZmVjdCAoZGUtPnNldHVwX2ZyYW1lLCBkZXYpOworCisJLyoKKwkgKiBOb3cgYWRkIHRoaXMgZnJhbWUgdG8gdGhlIFR4IGxpc3QuCisJICovCisKKwllbnRyeSA9IGRlLT50eF9oZWFkOworCisJLyogQXZvaWQgYSBjaGlwIGVycmF0YSBieSBwcmVmaXhpbmcgYSBkdW1teSBlbnRyeS4gKi8KKwlpZiAoZW50cnkgIT0gMCkgeworCQlkZS0+dHhfc2tiW2VudHJ5XS5za2IgPSBERV9EVU1NWV9TS0I7CisKKwkJZHVtbXlfdHhkID0gJmRlLT50eF9yaW5nW2VudHJ5XTsKKwkJZHVtbXlfdHhkLT5vcHRzMiA9IChlbnRyeSA9PSAoREVfVFhfUklOR19TSVpFIC0gMSkpID8KKwkJCQkgICBjcHVfdG9fbGUzMihSaW5nRW5kKSA6IDA7CisJCWR1bW15X3R4ZC0+YWRkcjEgPSAwOworCisJCS8qIE11c3Qgc2V0IERlc2NPd25lZCBsYXRlciB0byBhdm9pZCByYWNlIHdpdGggY2hpcCAqLworCisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJfQorCisJZGUtPnR4X3NrYltlbnRyeV0uc2tiID0gREVfU0VUVVBfU0tCOworCWRlLT50eF9za2JbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nID0KKwkgICAgcGNpX21hcF9zaW5nbGUgKGRlLT5wZGV2LCBkZS0+c2V0dXBfZnJhbWUsCisJCQkgICAgc2l6ZW9mIChkZS0+c2V0dXBfZnJhbWUpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIFB1dCB0aGUgc2V0dXAgZnJhbWUgb24gdGhlIFR4IGxpc3QuICovCisJdHhkID0gJmRlLT50eF9yaW5nW2VudHJ5XTsKKwlpZiAoZW50cnkgPT0gKERFX1RYX1JJTkdfU0laRSAtIDEpKQorCQl0eGQtPm9wdHMyID0gY3B1X3RvX2xlMzIoU2V0dXBGcmFtZSB8IFJpbmdFbmQgfCBzaXplb2YgKGRlLT5zZXR1cF9mcmFtZSkpOworCWVsc2UKKwkJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKFNldHVwRnJhbWUgfCBzaXplb2YgKGRlLT5zZXR1cF9mcmFtZSkpOworCXR4ZC0+YWRkcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKwl3bWIoKTsKKworCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl3bWIoKTsKKworCWlmIChkdW1teV90eGQpIHsKKwkJZHVtbXlfdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQl3bWIoKTsKKwl9CisKKwlkZS0+dHhfaGVhZCA9IE5FWFRfVFgoZW50cnkpOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKGRlKSA8IDApCisJCUJVRygpOworCWlmIChUWF9CVUZGU19BVkFJTChkZSkgPT0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCWR3MzIoVHhQb2xsLCBOb3JtYWxUeFBvbGwpOworCitvdXQ6CisJaWYgKG1hY21vZGUgIT0gZHIzMihNYWNNb2RlKSkKKwkJZHczMihNYWNNb2RlLCBtYWNtb2RlKTsKK30KKworc3RhdGljIHZvaWQgZGVfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmRlLT5sb2NrLCBmbGFncyk7CisJX19kZV9zZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkZS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVfcnhfbWlzc2VkKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyIHJ4X21pc3NlZCkKK3sKKwlpZiAodW5saWtlbHkocnhfbWlzc2VkICYgUnhNaXNzZWRPdmVyKSkKKwkJZGUtPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IFJ4TWlzc2VkTWFzazsKKwllbHNlCisJCWRlLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAocnhfbWlzc2VkICYgUnhNaXNzZWRNYXNrKTsKK30KKworc3RhdGljIHZvaWQgX19kZV9nZXRfc3RhdHMoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiB0bXAgPSBkcjMyKFJ4TWlzc2VkKTsgLyogc2VsZi1jbGVhcmluZyAqLworCisJZGVfcnhfbWlzc2VkKGRlLCB0bXApOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisgCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKyAJCV9fZGVfZ2V0X3N0YXRzKGRlKTsKKwlzcGluX3VubG9ja19pcnEoJmRlLT5sb2NrKTsKKworCXJldHVybiAmZGUtPm5ldF9zdGF0czsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVfaXNfcnVubmluZyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXJldHVybiAoZHIzMihNYWNTdGF0dXMpICYgKFJ4U3RhdGUgfCBUeFN0YXRlKSkgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQgZGVfc3RvcF9yeHR4IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdTMyIG1hY21vZGU7CisJdW5zaWduZWQgaW50IHdvcmsgPSAxMDAwOworCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSk7CisJaWYgKG1hY21vZGUgJiBSeFR4KSB7CisJCWR3MzIoTWFjTW9kZSwgbWFjbW9kZSAmIH5SeFR4KTsKKwkJZHIzMihNYWNNb2RlKTsKKwl9CisKKwl3aGlsZSAoLS13b3JrID4gMCkgeworCQlpZiAoIWRlX2lzX3J1bm5pbmcoZGUpKQorCQkJcmV0dXJuOworCQljcHVfcmVsYXgoKTsKKwl9CisJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRpbWVvdXQgZXhwaXJlZCBzdG9wcGluZyBETUFcbiIsIGRlLT5kZXYtPm5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVfc3RhcnRfcnh0eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBtYWNtb2RlOworCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSk7CisJaWYgKChtYWNtb2RlICYgUnhUeCkgIT0gUnhUeCkgeworCQlkdzMyKE1hY01vZGUsIG1hY21vZGUgfCBSeFR4KTsKKwkJZHIzMihNYWNNb2RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX3N0b3BfaHcgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKworCXVkZWxheSg1KTsKKwlkdzMyKEludHJNYXNrLCAwKTsKKworCWRlX3N0b3Bfcnh0eChkZSk7CisKKwlkdzMyKE1hY1N0YXR1cywgZHIzMihNYWNTdGF0dXMpKTsKKworCXVkZWxheSgxMCk7CisKKwlkZS0+cnhfdGFpbCA9IDA7CisJZGUtPnR4X2hlYWQgPSBkZS0+dHhfdGFpbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX2xpbmtfdXAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZS0+ZGV2KSkgeworCQluZXRpZl9jYXJyaWVyX29uKGRlLT5kZXYpOworCQlpZiAobmV0aWZfbXNnX2xpbmsoZGUpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsIG1lZGlhICVzXG4iLAorCQkJICAgICAgIGRlLT5kZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX2xpbmtfZG93bihzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGUtPmRldikpIHsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGUtPmRldik7CisJCWlmIChuZXRpZl9tc2dfbGluayhkZSkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBkZS0+ZGV2LT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX3NldF9tZWRpYSAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIG1lZGlhID0gZGUtPm1lZGlhX3R5cGU7CisJdTMyIG1hY21vZGUgPSBkcjMyKE1hY01vZGUpOworCisJaWYgKGRlX2lzX3J1bm5pbmcoZGUpKQorCQlCVUcoKTsKKworCWlmIChkZS0+ZGUyMTA0MCkKKwkJZHczMihDU1IxMSwgRlVMTF9EVVBMRVhfTUFHSUMpOworCWR3MzIoQ1NSMTMsIDApOyAvKiBSZXNldCBwaHkgKi8KKwlkdzMyKENTUjE0LCBkZS0+bWVkaWFbbWVkaWFdLmNzcjE0KTsKKwlkdzMyKENTUjE1LCBkZS0+bWVkaWFbbWVkaWFdLmNzcjE1KTsKKwlkdzMyKENTUjEzLCBkZS0+bWVkaWFbbWVkaWFdLmNzcjEzKTsKKworCS8qIG11c3QgZGVsYXkgMTBtcyBiZWZvcmUgd3JpdGluZyB0byBvdGhlciByZWdpc3RlcnMsCisJICogZXNwZWNpYWxseSBDU1I2CisJICovCisJbWRlbGF5KDEwKTsKKworCWlmIChtZWRpYSA9PSBERV9NRURJQV9UUF9GRCkKKwkJbWFjbW9kZSB8PSBGdWxsRHVwbGV4OworCWVsc2UKKwkJbWFjbW9kZSAmPSB+RnVsbER1cGxleDsKKwkKKwlpZiAobmV0aWZfbXNnX2xpbmsoZGUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXQgbGluayAlc1xuIgorCQkgICAgICAgS0VSTl9JTkZPICIlczogICAgbW9kZSAweCV4LCBzaWEgMHgleCwweCV4LDB4JXgsMHgleFxuIgorCQkgICAgICAgS0VSTl9JTkZPICIlczogICAgc2V0IG1vZGUgMHgleCwgc2V0IHNpYSAweCV4LDB4JXgsMHgleFxuIiwKKwkJICAgICAgIGRlLT5kZXYtPm5hbWUsIG1lZGlhX25hbWVbbWVkaWFdLAorCQkgICAgICAgZGUtPmRldi0+bmFtZSwgZHIzMihNYWNNb2RlKSwgZHIzMihTSUFTdGF0dXMpLAorCQkgICAgICAgZHIzMihDU1IxMyksIGRyMzIoQ1NSMTQpLCBkcjMyKENTUjE1KSwKKwkJICAgICAgIGRlLT5kZXYtPm5hbWUsIG1hY21vZGUsIGRlLT5tZWRpYVttZWRpYV0uY3NyMTMsCisJCSAgICAgICBkZS0+bWVkaWFbbWVkaWFdLmNzcjE0LCBkZS0+bWVkaWFbbWVkaWFdLmNzcjE1KTsKKwl9CisJaWYgKG1hY21vZGUgIT0gZHIzMihNYWNNb2RlKSkKKwkJZHczMihNYWNNb2RlLCBtYWNtb2RlKTsKK30KKworc3RhdGljIHZvaWQgZGVfbmV4dF9tZWRpYSAoc3RydWN0IGRlX3ByaXZhdGUgKmRlLCB1MzIgKm1lZGlhLAorCQkJICAgdW5zaWduZWQgaW50IG5fbWVkaWEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9tZWRpYTsgaSsrKSB7CisJCWlmIChkZV9va190b19hZHZlcnRpc2UoZGUsIG1lZGlhW2ldKSkgeworCQkJZGUtPm1lZGlhX3R5cGUgPSBtZWRpYVtpXTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGUyMTA0MF9tZWRpYV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqKSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZS0+ZGV2OworCXUzMiBzdGF0dXMgPSBkcjMyKFNJQVN0YXR1cyk7CisJdW5zaWduZWQgaW50IGNhcnJpZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwljYXJyaWVyID0gKHN0YXR1cyAmIE5ldEN4bkVycikgPyAwIDogMTsKKwkJCisJaWYgKGNhcnJpZXIpIHsKKwkJaWYgKGRlLT5tZWRpYV90eXBlICE9IERFX01FRElBX0FVSSAmJiAoc3RhdHVzICYgTGlua0ZhaWxTdGF0dXMpKQorCQkJZ290byBub19saW5rX3lldDsKKworCQlkZS0+bWVkaWFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBERV9USU1FUl9MSU5LOworCQlhZGRfdGltZXIoJmRlLT5tZWRpYV90aW1lcik7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJZGVfbGlua191cChkZSk7CisJCWVsc2UKKwkJCWlmIChuZXRpZl9tc2dfdGltZXIoZGUpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIG9rLCBzdGF0dXMgJXhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFfbmFtZVtkZS0+bWVkaWFfdHlwZV0sCisJCQkJICAgICAgIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwlkZV9saW5rX2Rvd24oZGUpOwkKKworCWlmIChkZS0+bWVkaWFfbG9jaykKKwkJcmV0dXJuOworCisJaWYgKGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0FVSSkgeworCQl1MzIgbmV4dF9zdGF0ZSA9IERFX01FRElBX1RQOworCQlkZV9uZXh0X21lZGlhKGRlLCAmbmV4dF9zdGF0ZSwgMSk7CisJfSBlbHNlIHsKKwkJdTMyIG5leHRfc3RhdGUgPSBERV9NRURJQV9BVUk7CisJCWRlX25leHRfbWVkaWEoZGUsICZuZXh0X3N0YXRlLCAxKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zdG9wX3J4dHgoZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc2V0X21lZGlhKGRlKTsKKwlkZV9zdGFydF9yeHR4KGRlKTsKKworbm9fbGlua195ZXQ6CisJZGUtPm1lZGlhX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgREVfVElNRVJfTk9fTElOSzsKKwlhZGRfdGltZXIoJmRlLT5tZWRpYV90aW1lcik7CisKKwlpZiAobmV0aWZfbXNnX3RpbWVyKGRlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIGxpbmssIHRyeWluZyBtZWRpYSAlcywgc3RhdHVzICV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYV9uYW1lW2RlLT5tZWRpYV90eXBlXSwgc3RhdHVzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZV9va190b19hZHZlcnRpc2UgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyIG5ld19tZWRpYSkKK3sKKwlzd2l0Y2ggKG5ld19tZWRpYSkgeworCWNhc2UgREVfTUVESUFfVFBfQVVUTzoKKwkJaWYgKCEoZGUtPm1lZGlhX2FkdmVydGlzZSAmIEFEVkVSVElTRURfQXV0b25lZykpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCEoZGUtPm1lZGlhX2FkdmVydGlzZSAmIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKSkpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9CTkM6CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0JOQykpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9BVUk6CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0FVSSkpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9UUDoKKwkJaWYgKCEoZGUtPm1lZGlhX2FkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIERFX01FRElBX1RQX0ZEOgorCQlpZiAoIShkZS0+bWVkaWFfYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGUyMTA0MV9tZWRpYV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqKSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZS0+ZGV2OworCXUzMiBzdGF0dXMgPSBkcjMyKFNJQVN0YXR1cyk7CisJdW5zaWduZWQgaW50IGNhcnJpZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwljYXJyaWVyID0gKHN0YXR1cyAmIE5ldEN4bkVycikgPyAwIDogMTsKKwkJCisJaWYgKGNhcnJpZXIpIHsKKwkJaWYgKChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9UUF9BVVRPIHx8CisJCSAgICAgZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfVFAgfHwKKwkJICAgICBkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9UUF9GRCkgJiYKKwkJICAgIChzdGF0dXMgJiBMaW5rRmFpbFN0YXR1cykpCisJCQlnb3RvIG5vX2xpbmtfeWV0OworCisJCWRlLT5tZWRpYV90aW1lci5leHBpcmVzID0gamlmZmllcyArIERFX1RJTUVSX0xJTks7CisJCWFkZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyKTsKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQlkZV9saW5rX3VwKGRlKTsKKwkJZWxzZQorCQkJaWYgKG5ldGlmX21zZ190aW1lcihkZSkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgb2ssIG1vZGUgJXggc3RhdHVzICV4XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdLAorCQkJCSAgICAgICBkcjMyKE1hY01vZGUpLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJZGVfbGlua19kb3duKGRlKTsJCisKKwkvKiBpZiBtZWRpYSB0eXBlIGxvY2tlZCwgZG9uJ3Qgc3dpdGNoIG1lZGlhICovCisJaWYgKGRlLT5tZWRpYV9sb2NrKQorCQlnb3RvIHNldF9tZWRpYTsKKworCS8qIGlmIGFjdGl2aXR5IGRldGVjdGVkLCB1c2UgdGhhdCBhcyBoaW50IGZvciBuZXcgbWVkaWEgdHlwZSAqLworCWlmIChzdGF0dXMgJiBOb25zZWxQb3J0QWN0aXZlKSB7CisJCXVuc2lnbmVkIGludCBoYXZlX21lZGlhID0gMTsKKworCQkvKiBpZiBBVUkvQk5DIHNlbGVjdGVkLCB0aGVuIGFjdGl2aXR5IGlzIG9uIFRQIHBvcnQgKi8KKwkJaWYgKGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0FVSSB8fAorCQkgICAgZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfQk5DKSB7CisJCQlpZiAoZGVfb2tfdG9fYWR2ZXJ0aXNlKGRlLCBERV9NRURJQV9UUF9BVVRPKSkKKwkJCQlkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX1RQX0FVVE87CisJCQllbHNlCisJCQkJaGF2ZV9tZWRpYSA9IDA7CisJCX0KKworCQkvKiBUUCBzZWxlY3RlZC4gIElmIHRoZXJlIGlzIG9ubHkgVFAgYW5kIEJOQywgdGhlbiBpdCdzIEJOQyAqLworCQllbHNlIGlmICgoKGRlLT5tZWRpYV9zdXBwb3J0ZWQgJiBERV9BVUlfQk5DKSA9PSBTVVBQT1JURURfQk5DKSAmJgorCQkJIGRlX29rX3RvX2FkdmVydGlzZShkZSwgREVfTUVESUFfQk5DKSkKKwkJCWRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfQk5DOworCisJCS8qIFRQIHNlbGVjdGVkLiAgSWYgdGhlcmUgaXMgb25seSBUUCBhbmQgQVVJLCB0aGVuIGl0J3MgQVVJICovCisJCWVsc2UgaWYgKCgoZGUtPm1lZGlhX3N1cHBvcnRlZCAmIERFX0FVSV9CTkMpID09IFNVUFBPUlRFRF9BVUkpICYmCisJCQkgZGVfb2tfdG9fYWR2ZXJ0aXNlKGRlLCBERV9NRURJQV9BVUkpKQorCQkJZGUtPm1lZGlhX3R5cGUgPSBERV9NRURJQV9BVUk7CisKKwkJLyogb3RoZXJ3aXNlLCBpZ25vcmUgdGhlIGhpbnQgKi8KKwkJZWxzZQorCQkJaGF2ZV9tZWRpYSA9IDA7CisKKwkJaWYgKGhhdmVfbWVkaWEpCisJCQlnb3RvIHNldF9tZWRpYTsKKwl9CisKKwkvKgorCSAqIEFic2VudCBvciBhbWJpZ3VvdXMgYWN0aXZpdHkgaGludCwgbW92ZSB0byBuZXh0IGFkdmVydGlzZWQKKwkgKiBtZWRpYSBzdGF0ZS4gIElmIGRlLT5tZWRpYV90eXBlIGlzIGxlZnQgdW5jaGFuZ2VkLCB0aGlzCisJICogc2ltcGx5IHJlc2V0cyB0aGUgUEhZIGFuZCByZWxvYWRzIHRoZSBjdXJyZW50IG1lZGlhIHNldHRpbmdzLgorCSAqLworCWlmIChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9BVUkpIHsKKwkJdTMyIG5leHRfc3RhdGVzW10gPSB7IERFX01FRElBX0JOQywgREVfTUVESUFfVFBfQVVUTyB9OworCQlkZV9uZXh0X21lZGlhKGRlLCBuZXh0X3N0YXRlcywgQVJSQVlfU0laRShuZXh0X3N0YXRlcykpOworCX0gZWxzZSBpZiAoZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfQk5DKSB7CisJCXUzMiBuZXh0X3N0YXRlc1tdID0geyBERV9NRURJQV9UUF9BVVRPLCBERV9NRURJQV9BVUkgfTsKKwkJZGVfbmV4dF9tZWRpYShkZSwgbmV4dF9zdGF0ZXMsIEFSUkFZX1NJWkUobmV4dF9zdGF0ZXMpKTsKKwl9IGVsc2UgeworCQl1MzIgbmV4dF9zdGF0ZXNbXSA9IHsgREVfTUVESUFfQVVJLCBERV9NRURJQV9CTkMsIERFX01FRElBX1RQX0FVVE8gfTsKKwkJZGVfbmV4dF9tZWRpYShkZSwgbmV4dF9zdGF0ZXMsIEFSUkFZX1NJWkUobmV4dF9zdGF0ZXMpKTsKKwl9CisJCitzZXRfbWVkaWE6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc3RvcF9yeHR4KGRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3NldF9tZWRpYShkZSk7CisJZGVfc3RhcnRfcnh0eChkZSk7CisKK25vX2xpbmtfeWV0OgorCWRlLT5tZWRpYV90aW1lci5leHBpcmVzID0gamlmZmllcyArIERFX1RJTUVSX05PX0xJTks7CisJYWRkX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCisJaWYgKG5ldGlmX21zZ190aW1lcihkZSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBsaW5rLCB0cnlpbmcgbWVkaWEgJXMsIHN0YXR1cyAleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFfbmFtZVtkZS0+bWVkaWFfdHlwZV0sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX21lZGlhX2ludGVycnVwdCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlLCB1MzIgc3RhdHVzKQoreworCWlmIChzdGF0dXMgJiBMaW5rUGFzcykgeworCQlkZV9saW5rX3VwKGRlKTsKKwkJbW9kX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIsIGppZmZpZXMgKyBERV9USU1FUl9MSU5LKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIShzdGF0dXMgJiBMaW5rRmFpbCkpCisJCUJVRygpOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGUtPmRldikpIHsKKwkJZGVfbGlua19kb3duKGRlKTsKKwkJbW9kX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIsIGppZmZpZXMgKyBERV9USU1FUl9OT19MSU5LKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGVfcmVzZXRfbWFjIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdTMyIHN0YXR1cywgdG1wOworCisJLyoKKwkgKiBSZXNldCBNQUMuICBkZTR4NS5jIGFuZCB0dWxpcC5jIGV4YW1pbmVkIGZvciAiYWR2aWNlIgorCSAqIGluIHRoaXMgYXJlYS4KKwkgKi8KKworCWlmIChkcjMyKEJ1c01vZGUpID09IDB4ZmZmZmZmZmYpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwgaG9sZGluZyBiaXQgMCBzZXQgYXQgbGVhc3QgNTAgUENJIGN5Y2xlcy4gKi8KKwlkdzMyIChCdXNNb2RlLCBDbWRSZXNldCk7CisJbWRlbGF5ICgxKTsKKworCWR3MzIgKEJ1c01vZGUsIGRlX2J1c19tb2RlKTsKKwltZGVsYXkgKDEpOworCisJZm9yICh0bXAgPSAwOyB0bXAgPCA1OyB0bXArKykgeworCQlkcjMyIChCdXNNb2RlKTsKKwkJbWRlbGF5ICgxKTsKKwl9CisKKwltZGVsYXkgKDEpOworCisJc3RhdHVzID0gZHIzMihNYWNTdGF0dXMpOworCWlmIChzdGF0dXMgJiAoUnhTdGF0ZSB8IFR4U3RhdGUpKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChzdGF0dXMgPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX2FkYXB0ZXJfd2FrZSAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBwbWN0bDsKKworCWlmIChkZS0+ZGUyMTA0MCkKKwkJcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRlLT5wZGV2LCBQQ0lQTSwgJnBtY3RsKTsKKwlpZiAocG1jdGwgJiBQTV9NYXNrKSB7CisJCXBtY3RsICY9IH5QTV9NYXNrOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRlLT5wZGV2LCBQQ0lQTSwgcG1jdGwpOworCisJCS8qIGRlNHg1LmMgZGVsYXlzLCBzbyB3ZSBkbyB0b28gKi8KKwkJbXNsZWVwKDEwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX2FkYXB0ZXJfc2xlZXAgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgcG1jdGw7CisKKwlpZiAoZGUtPmRlMjEwNDApCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sICZwbWN0bCk7CisJcG1jdGwgfD0gUE1fU2xlZXA7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sIHBtY3RsKTsKK30KKworc3RhdGljIGludCBkZV9pbml0X2h3IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRlLT5kZXY7CisJdTMyIG1hY21vZGU7CisJaW50IHJjOworCisJZGVfYWRhcHRlcl93YWtlKGRlKTsKKwkKKwltYWNtb2RlID0gZHIzMihNYWNNb2RlKSAmIH5NYWNNb2RlQ2xlYXI7CisKKwlyYyA9IGRlX3Jlc2V0X21hYyhkZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkZV9zZXRfbWVkaWEoZGUpOyAvKiByZXNldCBwaHkgKi8KKworCWR3MzIoUnhSaW5nQWRkciwgZGUtPnJpbmdfZG1hKTsKKwlkdzMyKFR4UmluZ0FkZHIsIGRlLT5yaW5nX2RtYSArIChzaXplb2Yoc3RydWN0IGRlX2Rlc2MpICogREVfUlhfUklOR19TSVpFKSk7CisKKwlkdzMyKE1hY01vZGUsIFJ4VHggfCBtYWNtb2RlKTsKKworCWRyMzIoUnhNaXNzZWQpOyAvKiBzZWxmLWNsZWFyaW5nICovCisKKwlkdzMyKEludHJNYXNrLCBkZV9pbnRyX21hc2spOworCisJZGVfc2V0X3J4X21vZGUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlX3JlZmlsbF9yeCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGRlLT5yeF9idWZfc3opOworCQlpZiAoIXNrYikKKwkJCWdvdG8gZXJyX291dDsKKworCQlza2ItPmRldiA9IGRlLT5kZXY7CisKKwkJZGUtPnJ4X3NrYltpXS5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsCisJCQlza2ItPnRhaWwsIGRlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRlLT5yeF9za2JbaV0uc2tiID0gc2tiOworCisJCWRlLT5yeF9yaW5nW2ldLm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJCWlmIChpID09IChERV9SWF9SSU5HX1NJWkUgLSAxKSkKKwkJCWRlLT5yeF9yaW5nW2ldLm9wdHMyID0KKwkJCQljcHVfdG9fbGUzMihSaW5nRW5kIHwgZGUtPnJ4X2J1Zl9zeik7CisJCWVsc2UKKwkJCWRlLT5yeF9yaW5nW2ldLm9wdHMyID0gY3B1X3RvX2xlMzIoZGUtPnJ4X2J1Zl9zeik7CisJCWRlLT5yeF9yaW5nW2ldLmFkZHIxID0gY3B1X3RvX2xlMzIoZGUtPnJ4X3NrYltpXS5tYXBwaW5nKTsKKwkJZGUtPnJ4X3JpbmdbaV0uYWRkcjIgPSAwOworCX0KKworCXJldHVybiAwOworCitlcnJfb3V0OgorCWRlX2NsZWFuX3JpbmdzKGRlKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBkZV9pbml0X3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJbWVtc2V0KGRlLT50eF9yaW5nLCAwLCBzaXplb2Yoc3RydWN0IGRlX2Rlc2MpICogREVfVFhfUklOR19TSVpFKTsKKwlkZS0+dHhfcmluZ1tERV9UWF9SSU5HX1NJWkUgLSAxXS5vcHRzMiA9IGNwdV90b19sZTMyKFJpbmdFbmQpOworCisJZGUtPnJ4X3RhaWwgPSAwOworCWRlLT50eF9oZWFkID0gZGUtPnR4X3RhaWwgPSAwOworCisJcmV0dXJuIGRlX3JlZmlsbF9yeCAoZGUpOworfQorCitzdGF0aWMgaW50IGRlX2FsbG9jX3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJZGUtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZS0+cGRldiwgREVfUklOR19CWVRFUywgJmRlLT5yaW5nX2RtYSk7CisJaWYgKCFkZS0+cnhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJZGUtPnR4X3JpbmcgPSAmZGUtPnJ4X3JpbmdbREVfUlhfUklOR19TSVpFXTsKKwlyZXR1cm4gZGVfaW5pdF9yaW5ncyhkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX2NsZWFuX3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdW5zaWduZWQgaTsKKworCW1lbXNldChkZS0+cnhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1JYX1JJTkdfU0laRSk7CisJZGUtPnJ4X3JpbmdbREVfUlhfUklOR19TSVpFIC0gMV0ub3B0czIgPSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKKwl3bWIoKTsKKwltZW1zZXQoZGUtPnR4X3JpbmcsIDAsIHNpemVvZihzdHJ1Y3QgZGVfZGVzYykgKiBERV9UWF9SSU5HX1NJWkUpOworCWRlLT50eF9yaW5nW0RFX1RYX1JJTkdfU0laRSAtIDFdLm9wdHMyID0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7CisJd21iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGRlLT5yeF9za2JbaV0uc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRlLT5wZGV2LCBkZS0+cnhfc2tiW2ldLm1hcHBpbmcsCisJCQkJCSBkZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihkZS0+cnhfc2tiW2ldLnNrYik7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREVfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRlLT50eF9za2JbaV0uc2tiOworCQlpZiAoKHNrYikgJiYgKHNrYiAhPSBERV9EVU1NWV9TS0IpKSB7CisJCQlpZiAoc2tiICE9IERFX1NFVFVQX1NLQikgeworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlkZS0+bmV0X3N0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKGRlLT5wZGV2LAorCQkJCQlkZS0+dHhfc2tiW2ldLm1hcHBpbmcsCisJCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwKKwkJCQkJZGUtPnR4X3NrYltpXS5tYXBwaW5nLAorCQkJCQlzaXplb2YoZGUtPnNldHVwX2ZyYW1lKSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQl9CisJCX0KKwl9CisKKwltZW1zZXQoJmRlLT5yeF9za2IsIDAsIHNpemVvZihzdHJ1Y3QgcmluZ19pbmZvKSAqIERFX1JYX1JJTkdfU0laRSk7CisJbWVtc2V0KCZkZS0+dHhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKiBERV9UWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBkZV9mcmVlX3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJZGVfY2xlYW5fcmluZ3MoZGUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGUtPnBkZXYsIERFX1JJTkdfQllURVMsIGRlLT5yeF9yaW5nLCBkZS0+cmluZ19kbWEpOworCWRlLT5yeF9yaW5nID0gTlVMTDsKKwlkZS0+dHhfcmluZyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZGVfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoZGUpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVuYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKworCWRlLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCXJjID0gZGVfYWxsb2NfcmluZ3MoZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByaW5nIGFsbG9jYXRpb24gZmFpbHVyZSwgZXJyPSVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGRlX2luaXRfaHcoZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBoL3cgaW5pdCBmYWlsdXJlLCBlcnI9JWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZGVfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgcmVxdWVzdCBmYWlsdXJlLCBlcnI9JWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCByYyk7CisJCWdvdG8gZXJyX291dF9odzsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCW1vZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyLCBqaWZmaWVzICsgREVfVElNRVJfTk9fTElOSyk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9odzoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zdG9wX2h3KGRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCitlcnJfb3V0X2ZyZWU6CisJZGVfZnJlZV9yaW5ncyhkZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRlX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24oZGUpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpc2FibGluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisKKwlkZWxfdGltZXJfc3luYygmZGUtPm1lZGlhX3RpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3N0b3BfaHcoZGUpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlLT5sb2NrLCBmbGFncyk7CisJCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlkZV9mcmVlX3JpbmdzKGRlKTsKKwlkZV9hZGFwdGVyX3NsZWVwKGRlKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGUtPnBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogTklDIHN0YXR1cyAlMDh4IG1vZGUgJTA4eCBzaWEgJTA4eCBkZXNjICV1LyV1LyV1XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRyMzIoTWFjU3RhdHVzKSwgZHIzMihNYWNNb2RlKSwgZHIzMihTSUFTdGF0dXMpLAorCSAgICAgICBkZS0+cnhfdGFpbCwgZGUtPnR4X2hlYWQsIGRlLT50eF90YWlsKTsKKworCWRlbF90aW1lcl9zeW5jKCZkZS0+bWVkaWFfdGltZXIpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNwaW5fbG9ja19pcnEoJmRlLT5sb2NrKTsKKworCWRlX3N0b3BfaHcoZGUpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCQorCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCV9fZGVfZ2V0X3N0YXRzKGRlKTsKKworCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJZGVfY2xlYW5fcmluZ3MoZGUpOworCisJZGVfaW5pdF9odyhkZSk7CisJCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBfX2RlX2dldF9yZWdzKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTggKmJ1ZikKK3sKKwlpbnQgaTsKKwl1MzIgKnJidWYgPSAodTMyICopYnVmOworCQorCS8qIHJlYWQgYWxsIENTUnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgREVfTlVNX1JFR1M7IGkrKykKKwkJcmJ1ZltpXSA9IGRyMzIoaSAqIDgpOworCisJLyogaGFuZGxlIHNlbGYtY2xlYXJpbmcgUnhNaXNzZWQgY291bnRlciwgQ1NSOCAqLworCWRlX3J4X21pc3NlZChkZSwgcmJ1Zls4XSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZV9nZXRfc2V0dGluZ3Moc3RydWN0IGRlX3ByaXZhdGUgKmRlLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJZWNtZC0+c3VwcG9ydGVkID0gZGUtPm1lZGlhX3N1cHBvcnRlZDsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWVjbWQtPmFkdmVydGlzaW5nID0gZGUtPm1lZGlhX2FkdmVydGlzZTsKKwkKKwlzd2l0Y2ggKGRlLT5tZWRpYV90eXBlKSB7CisJY2FzZSBERV9NRURJQV9BVUk6CisJCWVjbWQtPnBvcnQgPSBQT1JUX0FVSTsKKwkJZWNtZC0+c3BlZWQgPSA1OworCQlicmVhazsKKwljYXNlIERFX01FRElBX0JOQzoKKwkJZWNtZC0+cG9ydCA9IFBPUlRfQk5DOworCQllY21kLT5zcGVlZCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCQlicmVhazsKKwl9CisJCisJaWYgKGRyMzIoTWFjTW9kZSkgJiBGdWxsRHVwbGV4KQorCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCisJaWYgKGRlLT5tZWRpYV9sb2NrKQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCWVsc2UKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCisJLyogaWdub3JlIG1heHR4cGt0LCBtYXhyeHBrdCBmb3Igbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RlX3NldF9zZXR0aW5ncyhzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwl1MzIgbmV3X21lZGlhOworCXVuc2lnbmVkIGludCBtZWRpYV9sb2NrOworCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwICYmIGVjbWQtPnNwZWVkICE9IDUgJiYgZWNtZC0+c3BlZWQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRlLT5kZTIxMDQwICYmIGVjbWQtPnNwZWVkID09IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+cG9ydCAhPSBQT1JUX1RQICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9BVUkgJiYgZWNtZC0+cG9ydCAhPSBQT1JUX0JOQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRlLT5kZTIxMDQwICYmIGVjbWQtPnBvcnQgPT0gUE9SVF9CTkMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT50cmFuc2NlaXZlciAhPSBYQ1ZSX0lOVEVSTkFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUgJiYgZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgfmRlLT5tZWRpYV9zdXBwb3J0ZWQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCisJICAgICghKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9BdXRvbmVnKSkpCisJCXJldHVybiAtRUlOVkFMOworCQorCXN3aXRjaCAoZWNtZC0+cG9ydCkgeworCWNhc2UgUE9SVF9BVUk6CisJCW5ld19tZWRpYSA9IERFX01FRElBX0FVSTsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX0FVSSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0JOQzoKKwkJbmV3X21lZGlhID0gREVfTUVESUFfQk5DOworCQlpZiAoIShlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQk5DKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJCW5ld19tZWRpYSA9IERFX01FRElBX1RQX0FVVE87CisJCWVsc2UgaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCW5ld19tZWRpYSA9IERFX01FRElBX1RQX0ZEOworCQllbHNlCisJCQluZXdfbWVkaWEgPSBERV9NRURJQV9UUDsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX1RQKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIShlY21kLT5hZHZlcnRpc2luZyAmIChBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCQorCW1lZGlhX2xvY2sgPSAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgPyAwIDogMTsKKwkKKwlpZiAoKG5ld19tZWRpYSA9PSBkZS0+bWVkaWFfdHlwZSkgJiYKKwkgICAgKG1lZGlhX2xvY2sgPT0gZGUtPm1lZGlhX2xvY2spICYmCisJICAgIChlY21kLT5hZHZlcnRpc2luZyA9PSBkZS0+bWVkaWFfYWR2ZXJ0aXNlKSkKKwkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gY2hhbmdlICovCisJICAgIAorCWRlX2xpbmtfZG93bihkZSk7CisJZGVfc3RvcF9yeHR4KGRlKTsKKwkKKwlkZS0+bWVkaWFfdHlwZSA9IG5ld19tZWRpYTsKKwlkZS0+bWVkaWFfbG9jayA9IG1lZGlhX2xvY2s7CisJZGUtPm1lZGlhX2FkdmVydGlzZSA9IGVjbWQtPmFkdmVydGlzaW5nOworCWRlX3NldF9tZWRpYShkZSk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShkZS0+cGRldikpOworCWluZm8tPmVlZHVtcF9sZW4gPSBERV9FRVBST01fU0laRTsKK30KKworc3RhdGljIGludCBkZV9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gREVfUkVHU19TSVpFOworfQorCitzdGF0aWMgaW50IGRlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJmRlLT5sb2NrKTsKKwlyYyA9IF9fZGVfZ2V0X3NldHRpbmdzKGRlLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmRlLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisJcmMgPSBfX2RlX3NldF9zZXR0aW5ncyhkZSwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1MzIgZGVfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJcmV0dXJuIGRlLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBkZV9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG1zZ2x2bCkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlkZS0+bXNnX2VuYWJsZSA9IG1zZ2x2bDsKK30KKworc3RhdGljIGludCBkZV9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCWlmICghZGUtPmVlX2RhdGEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoKGVlcHJvbS0+b2Zmc2V0ICE9IDApIHx8IChlZXByb20tPm1hZ2ljICE9IDApIHx8CisJICAgIChlZXByb20tPmxlbiAhPSBERV9FRVBST01fU0laRSkpCisJCXJldHVybiAtRUlOVkFMOworCW1lbWNweShkYXRhLCBkZS0+ZWVfZGF0YSwgZWVwcm9tLT5sZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1MzIgc3RhdHVzOworCisJaWYgKGRlLT5tZWRpYV90eXBlICE9IERFX01FRElBX1RQX0FVVE8pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRlLT5kZXYpKQorCQlkZV9saW5rX2Rvd24oZGUpOworCisJc3RhdHVzID0gZHIzMihTSUFTdGF0dXMpOworCWR3MzIoU0lBU3RhdHVzLCAoc3RhdHVzICYgfk5XYXlTdGF0ZSkgfCBOV2F5UmVzdGFydCk7CisJaWYgKG5ldGlmX21zZ19saW5rKGRlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgbndheSByZXN0YXJ0LCBzdGF0dXMgJXgsJXhcbiIsCisJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBzdGF0dXMsIGRyMzIoU0lBU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXJlZ3MtPnZlcnNpb24gPSAoREVfUkVHU19WRVIgPDwgMikgfCBkZS0+ZGUyMTA0MDsKKworCXNwaW5fbG9ja19pcnEoJmRlLT5sb2NrKTsKKwlfX2RlX2dldF9yZWdzKGRlLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnEoJmRlLT5sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBkZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuZ2V0X2RydmluZm8JCT0gZGVfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSBkZV9nZXRfcmVnc19sZW4sCisJLmdldF9zZXR0aW5ncwkJPSBkZV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBkZV9zZXRfc2V0dGluZ3MsCisJLmdldF9tc2dsZXZlbAkJPSBkZV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBkZV9zZXRfbXNnbGV2ZWwsCisJLmdldF9lZXByb20JCT0gZGVfZ2V0X2VlcHJvbSwKKwkubndheV9yZXNldAkJPSBkZV9ud2F5X3Jlc2V0LAorCS5nZXRfcmVncwkJPSBkZV9nZXRfcmVncywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkZTIxMDQwX2dldF9tYWNfYWRkcmVzcyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIGk7CisKKwlkdzMyIChST01DbWQsIDApOwkvKiBSZXNldCB0aGUgcG9pbnRlciB3aXRoIGEgZHVtbXkgd3JpdGUuICovCisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CisJCWRvCisJCQl2YWx1ZSA9IGRyMzIoUk9NQ21kKTsKKwkJd2hpbGUgKHZhbHVlIDwgMCAmJiAtLWJvZ3VzY250ID4gMCk7CisJCWRlLT5kZXYtPmRldl9hZGRyW2ldID0gdmFsdWU7CisJCXVkZWxheSgxKTsKKwkJaWYgKGJvZ3VzY250IDw9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidGltZW91dCByZWFkaW5nIDIxMDQwIE1BQyBhZGRyZXNzIGJ5dGUgJXVcbiIsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGRlMjEwNDBfZ2V0X21lZGlhX2luZm8oc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZGUtPm1lZGlhX3R5cGUgPSBERV9NRURJQV9UUDsKKwlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfQVVJOworCWRlLT5tZWRpYV9hZHZlcnRpc2UgPSBkZS0+bWVkaWFfc3VwcG9ydGVkOworCisJZm9yIChpID0gMDsgaSA8IERFX01BWF9NRURJQTsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIERFX01FRElBX0FVSToKKwkJY2FzZSBERV9NRURJQV9UUDoKKwkJY2FzZSBERV9NRURJQV9UUF9GRDoKKwkJCWRlLT5tZWRpYVtpXS50eXBlID0gaTsKKwkJCWRlLT5tZWRpYVtpXS5jc3IxMyA9IHQyMTA0MF9jc3IxM1tpXTsKKwkJCWRlLT5tZWRpYVtpXS5jc3IxNCA9IHQyMTA0MF9jc3IxNFtpXTsKKwkJCWRlLT5tZWRpYVtpXS5jc3IxNSA9IHQyMTA0MF9jc3IxNVtpXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGUtPm1lZGlhW2ldLnR5cGUgPSBERV9NRURJQV9JTlZBTElEOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIE5vdGU6IHRoaXMgcm91dGluZSByZXR1cm5zIGV4dHJhIGRhdGEgYml0cyBmb3Igc2l6ZSBkZXRlY3Rpb24uICovCitzdGF0aWMgdW5zaWduZWQgX19pbml0IHR1bGlwX3JlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqcmVncywgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgcmV0dmFsID0gMDsKKwl2b2lkIF9faW9tZW0gKmVlX2FkZHIgPSByZWdzICsgUk9NQ21kOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IGFkZHJfbGVuKTsKKworCXdyaXRlbChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXdyaXRlbChFRV9FTkIsIGVlX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKwkJd3JpdGVsKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQlyZWFkbChlZV9hZGRyKTsKKwkJd3JpdGVsKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQlyZWFkbChlZV9hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgocmVhZGwoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCX0KKwl3cml0ZWwoRUVfRU5CLCBlZV9hZGRyKTsKKwlyZWFkbChlZV9hZGRyKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCXdyaXRlbChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQlyZWFkbChlZV9hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgocmVhZGwoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCQl3cml0ZWwoRUVfRU5CLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCXdyaXRlbChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkZTIxMDQxX2dldF9zcm9tX2luZm8gKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpLCBzYV9vZmZzZXQgPSAwLCBvZnM7CisJdTggZWVfZGF0YVtERV9FRVBST01fU0laRSArIDZdID0ge307CisJdW5zaWduZWQgZWVfYWRkcl9zaXplID0gdHVsaXBfcmVhZF9lZXByb20oZGUtPnJlZ3MsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCXN0cnVjdCBkZV9zcm9tX2luZm9fbGVhZiAqaWw7CisJdm9pZCAqYnVmcDsKKworCS8qIGRvd25sb2FkIGVudGlyZSBlZXByb20gKi8KKwlmb3IgKGkgPSAwOyBpIDwgREVfRUVQUk9NX1dPUkRTOyBpKyspCisJCSgodTE2ICopZWVfZGF0YSlbaV0gPQorCQkJbGUxNl90b19jcHUodHVsaXBfcmVhZF9lZXByb20oZGUtPnJlZ3MsIGksIGVlX2FkZHJfc2l6ZSkpOworCisJLyogREVDIG5vdyBoYXMgYSBzcGVjaWZpY2F0aW9uIGJ1dCBlYXJseSBib2FyZCBtYWtlcnMKKwkgICBqdXN0IHB1dCB0aGUgYWRkcmVzcyBpbiB0aGUgZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKwkvKiBUaGlzIGRvZXMgIG1lbWNtcChlZWRhdGEsIGVlZGF0YSsxNiwgOCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSArKykKKwkJaWYgKGVlX2RhdGFbaV0gIT0gZWVfZGF0YVsxNitpXSkKKwkJCXNhX29mZnNldCA9IDIwOworCisJLyogc3RvcmUgTUFDIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSArKykKKwkJZGUtPmRldi0+ZGV2X2FkZHJbaV0gPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworCisJLyogZ2V0IG9mZnNldCBvZiBjb250cm9sbGVyIDAgaW5mbyBsZWFmLiAgaWdub3JlIDJuZCBieXRlLiAqLworCW9mcyA9IGVlX2RhdGFbU1JPTUMwSW5mb0xlYWZdOworCWlmIChvZnMgPj0gKHNpemVvZihlZV9kYXRhKSAtIHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYpIC0gc2l6ZW9mKHN0cnVjdCBkZV9zcm9tX21lZGlhX2Jsb2NrKSkpCisJCWdvdG8gYmFkX3Nyb207CisKKwkvKiBnZXQgcG9pbnRlciB0byBpbmZvIGxlYWYgKi8KKwlpbCA9IChzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYgKikgJmVlX2RhdGFbb2ZzXTsKKworCS8qIHBhcmFub2lhIGNoZWNrcyAqLworCWlmIChpbC0+bl9ibG9ja3MgPT0gMCkKKwkJZ290byBiYWRfc3JvbTsKKwlpZiAoKHNpemVvZihlZV9kYXRhKSAtIG9mcykgPAorCSAgICAoc2l6ZW9mKHN0cnVjdCBkZV9zcm9tX2luZm9fbGVhZikgKyAoc2l6ZW9mKHN0cnVjdCBkZV9zcm9tX21lZGlhX2Jsb2NrKSAqIGlsLT5uX2Jsb2NrcykpKQorCQlnb3RvIGJhZF9zcm9tOworCisJLyogZ2V0IGRlZmF1bHQgbWVkaWEgdHlwZSAqLworCXN3aXRjaCAoREVfVU5BTElHTkVEXzE2KCZpbC0+ZGVmYXVsdF9tZWRpYSkpIHsKKwljYXNlIDB4MDAwMTogIGRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfQk5DOyBicmVhazsKKwljYXNlIDB4MDAwMjogIGRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfQVVJOyBicmVhazsKKwljYXNlIDB4MDIwNDogIGRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfVFBfRkQ7IGJyZWFrOworCWRlZmF1bHQ6IGRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfVFBfQVVUTzsgYnJlYWs7CisJfQorCQorCWlmIChuZXRpZl9tc2dfcHJvYmUoZGUpKQorCQlwcmludGsoS0VSTl9JTkZPICJkZSVkOiBTUk9NIGxlYWYgb2Zmc2V0ICV1LCBkZWZhdWx0IG1lZGlhICVzXG4iLAorCQkgICAgICAgZGUtPmJvYXJkX2lkeCwgb2ZzLAorCQkgICAgICAgbWVkaWFfbmFtZVtkZS0+bWVkaWFfdHlwZV0pOworCisJLyogaW5pdCBTSUEgcmVnaXN0ZXIgdmFsdWVzIHRvIGRlZmF1bHRzICovCisJZm9yIChpID0gMDsgaSA8IERFX01BWF9NRURJQTsgaSsrKSB7CisJCWRlLT5tZWRpYVtpXS50eXBlID0gREVfTUVESUFfSU5WQUxJRDsKKwkJZGUtPm1lZGlhW2ldLmNzcjEzID0gMHhmZmZmOworCQlkZS0+bWVkaWFbaV0uY3NyMTQgPSAweGZmZmY7CisJCWRlLT5tZWRpYVtpXS5jc3IxNSA9IDB4ZmZmZjsKKwl9CisKKwkvKiBwYXJzZSBtZWRpYSBibG9ja3MgdG8gc2VlIHdoYXQgbWVkaWFzIGFyZSBzdXBwb3J0ZWQsCisJICogYW5kIGlmIGFueSBjdXN0b20gQ1NSIHZhbHVlcyBhcmUgcHJvdmlkZWQKKwkgKi8KKwlidWZwID0gKCh2b2lkICopaWwpICsgc2l6ZW9mKCppbCk7CisJZm9yIChpID0gMDsgaSA8IGlsLT5uX2Jsb2NrczsgaSsrKSB7CisJCXN0cnVjdCBkZV9zcm9tX21lZGlhX2Jsb2NrICppYiA9IGJ1ZnA7CisJCXVuc2lnbmVkIGlkeDsKKworCQkvKiBpbmRleCBiYXNlZCBvbiBtZWRpYSB0eXBlIGluIG1lZGlhIGJsb2NrICovCisJCXN3aXRjaChpYi0+b3B0cyAmIE1lZGlhQmxvY2tNYXNrKSB7CisJCWNhc2UgMDogLyogMTBiYXNlVCAqLworCQkJZGUtPm1lZGlhX3N1cHBvcnRlZCB8PSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfMTBiYXNlVF9IYWxmCisJCQkJCSAgfCBTVVBQT1JURURfQXV0b25lZzsKKwkJCWlkeCA9IERFX01FRElBX1RQOworCQkJZGUtPm1lZGlhW0RFX01FRElBX1RQX0FVVE9dLnR5cGUgPSBERV9NRURJQV9UUF9BVVRPOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogQk5DICovCisJCQlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9CTkM7CisJCQlpZHggPSBERV9NRURJQV9CTkM7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBBVUkgKi8KKwkJCWRlLT5tZWRpYV9zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0FVSTsKKwkJCWlkeCA9IERFX01FRElBX0FVSTsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qIDEwYmFzZVQtRkQgKi8KKwkJCWRlLT5tZWRpYV9zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAorCQkJCQkgIHwgU1VQUE9SVEVEX0F1dG9uZWc7CisJCQlpZHggPSBERV9NRURJQV9UUF9GRDsKKwkJCWRlLT5tZWRpYVtERV9NRURJQV9UUF9BVVRPXS50eXBlID0gREVfTUVESUFfVFBfQVVUTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBiYWRfc3JvbTsKKwkJfQorCisJCWRlLT5tZWRpYVtpZHhdLnR5cGUgPSBpZHg7CisKKwkJaWYgKG5ldGlmX21zZ19wcm9iZShkZSkpCisJCQlwcmludGsoS0VSTl9JTkZPICJkZSVkOiAgIG1lZGlhIGJsb2NrICMldTogJXMiLAorCQkJICAgICAgIGRlLT5ib2FyZF9pZHgsIGksCisJCQkgICAgICAgbWVkaWFfbmFtZVtkZS0+bWVkaWFbaWR4XS50eXBlXSk7CisKKwkJYnVmcCArPSBzaXplb2YgKGliLT5vcHRzKTsKKworCQlpZiAoaWItPm9wdHMgJiBNZWRpYUN1c3RvbUNTUnMpIHsKKwkJCWRlLT5tZWRpYVtpZHhdLmNzcjEzID0gREVfVU5BTElHTkVEXzE2KCZpYi0+Y3NyMTMpOworCQkJZGUtPm1lZGlhW2lkeF0uY3NyMTQgPSBERV9VTkFMSUdORURfMTYoJmliLT5jc3IxNCk7CisJCQlkZS0+bWVkaWFbaWR4XS5jc3IxNSA9IERFX1VOQUxJR05FRF8xNigmaWItPmNzcjE1KTsKKwkJCWJ1ZnAgKz0gc2l6ZW9mKGliLT5jc3IxMykgKyBzaXplb2YoaWItPmNzcjE0KSArCisJCQkJc2l6ZW9mKGliLT5jc3IxNSk7CisKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUoZGUpKQorCQkJCXByaW50aygiICgleCwleCwleClcbiIsCisJCQkJICAgICAgIGRlLT5tZWRpYVtpZHhdLmNzcjEzLAorCQkJCSAgICAgICBkZS0+bWVkaWFbaWR4XS5jc3IxNCwKKwkJCQkgICAgICAgZGUtPm1lZGlhW2lkeF0uY3NyMTUpOworCQkJCSAgICAgICAKKwkJfSBlbHNlIGlmIChuZXRpZl9tc2dfcHJvYmUoZGUpKQorCQkJcHJpbnRrKCJcbiIpOworCisJCWlmIChidWZwID4gKCh2b2lkICopJmVlX2RhdGFbREVfRUVQUk9NX1NJWkUgLSAzXSkpCisJCQlicmVhazsKKwl9CisKKwlkZS0+bWVkaWFfYWR2ZXJ0aXNlID0gZGUtPm1lZGlhX3N1cHBvcnRlZDsKKworZmlsbF9kZWZhdWx0czoKKwkvKiBmaWxsIGluIGRlZmF1bHRzLCBmb3IgY2FzZXMgd2hlcmUgY3VzdG9tIENTUnMgbm90IHVzZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgREVfTUFYX01FRElBOyBpKyspIHsKKwkJaWYgKGRlLT5tZWRpYVtpXS5jc3IxMyA9PSAweGZmZmYpCisJCQlkZS0+bWVkaWFbaV0uY3NyMTMgPSB0MjEwNDFfY3NyMTNbaV07CisJCWlmIChkZS0+bWVkaWFbaV0uY3NyMTQgPT0gMHhmZmZmKQorCQkJZGUtPm1lZGlhW2ldLmNzcjE0ID0gdDIxMDQxX2NzcjE0W2ldOworCQlpZiAoZGUtPm1lZGlhW2ldLmNzcjE1ID09IDB4ZmZmZikKKwkJCWRlLT5tZWRpYVtpXS5jc3IxNSA9IHQyMTA0MV9jc3IxNVtpXTsKKwl9CisKKwlkZS0+ZWVfZGF0YSA9IGttYWxsb2MoREVfRUVQUk9NX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChkZS0+ZWVfZGF0YSkKKwkJbWVtY3B5KGRlLT5lZV9kYXRhLCAmZWVfZGF0YVswXSwgREVfRUVQUk9NX1NJWkUpOworCisJcmV0dXJuOworCitiYWRfc3JvbToKKwkvKiBmb3IgZXJyb3IgY2FzZXMsIGl0J3Mgb2sgdG8gYXNzdW1lIHdlIHN1cHBvcnQgYWxsIHRoZXNlICovCisJZm9yIChpID0gMDsgaSA8IERFX01BWF9NRURJQTsgaSsrKQorCQlkZS0+bWVkaWFbaV0udHlwZSA9IGk7CisJZGUtPm1lZGlhX3N1cHBvcnRlZCA9CisJCVNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJU1VQUE9SVEVEX0F1dG9uZWcgfAorCQlTVVBQT1JURURfVFAgfAorCQlTVVBQT1JURURfQVVJIHwKKwkJU1VQUE9SVEVEX0JOQzsKKwlnb3RvIGZpbGxfZGVmYXVsdHM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGU7CisJaW50IHJjOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlsb25nIHBjaWFkZHI7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKworCWJvYXJkX2lkeCsrOworCisjaWZuZGVmIE1PRFVMRQorCWlmIChib2FyZF9pZHggPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworI2VuZGlmCisKKwkvKiBhbGxvY2F0ZSBhIG5ldyBldGhlcm5ldCBkZXZpY2Ugc3RydWN0dXJlLCBhbmQgZmlsbCBpbiBkZWZhdWx0cyAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZGVfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCWRldi0+b3BlbiA9IGRlX29wZW47CisJZGV2LT5zdG9wID0gZGVfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkZV9zZXRfcnhfbW9kZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGRlX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBkZV9nZXRfc3RhdHM7CisJZGV2LT5ldGh0b29sX29wcyA9ICZkZV9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSBkZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGUgPSBkZXYtPnByaXY7CisJZGUtPmRlMjEwNDAgPSBlbnQtPmRyaXZlcl9kYXRhID09IDAgPyAxIDogMDsKKwlkZS0+cGRldiA9IHBkZXY7CisJZGUtPmRldiA9IGRldjsKKwlkZS0+bXNnX2VuYWJsZSA9IChkZWJ1ZyA8IDAgPyBERV9ERUZfTVNHX0VOQUJMRSA6IGRlYnVnKTsKKwlkZS0+Ym9hcmRfaWR4ID0gYm9hcmRfaWR4OworCXNwaW5fbG9ja19pbml0ICgmZGUtPmxvY2spOworCWluaXRfdGltZXIoJmRlLT5tZWRpYV90aW1lcik7CisJaWYgKGRlLT5kZTIxMDQwKQorCQlkZS0+bWVkaWFfdGltZXIuZnVuY3Rpb24gPSBkZTIxMDQwX21lZGlhX3RpbWVyOworCWVsc2UKKwkJZGUtPm1lZGlhX3RpbWVyLmZ1bmN0aW9uID0gZGUyMTA0MV9tZWRpYV90aW1lcjsKKwlkZS0+bWVkaWFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogd2FrZSB1cCBkZXZpY2UsIGFzc2lnbiByZXNvdXJjZXMgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwkvKiByZXNlcnZlIFBDSSByZXNvdXJjZXMgdG8gZW5zdXJlIGRyaXZlciBhdG9taWNpdHkgKi8KKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBJUlEgdmFsdWUgKi8KKwlpZiAocGRldi0+aXJxIDwgMikgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgaXJxICglZCkgZm9yIHBjaSBkZXYgJXNcbiIsCisJCSAgICAgICBwZGV2LT5pcnEsIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCS8qIG9idGFpbiBhbmQgY2hlY2sgdmFsaWRpdHkgb2YgUENJIEkvTyBhZGRyZXNzICovCisJcGNpYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlpZiAoIXBjaWFkZHIpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBNTUlPIHJlc291cmNlIGZvciBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSA8IERFX1JFR1NfU0laRSkgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk1NSU8gcmVzb3VyY2UgKCVseCkgdG9vIHNtYWxsIG9uIHBjaSBkZXYgJXNcbiIsCisJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCisJLyogcmVtYXAgQ1NSIHJlZ2lzdGVycyAqLworCXJlZ3MgPSBpb3JlbWFwX25vY2FjaGUocGNpYWRkciwgREVfUkVHU19TSVpFKTsKKwlpZiAoIXJlZ3MpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIFBDSSBNTUlPICglbHhAJWx4KSBvbiBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgcGNpYWRkciwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZWdzOworCWRlLT5yZWdzID0gcmVnczsKKworCWRlX2FkYXB0ZXJfd2FrZShkZSk7CisKKwkvKiBtYWtlIHN1cmUgaGFyZHdhcmUgaXMgbm90IHJ1bm5pbmcgKi8KKwlyYyA9IGRlX3Jlc2V0X21hYyhkZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZXNldCBNQUMsIHBjaSBkZXYgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9pb21hcDsKKwl9CisKKwkvKiBnZXQgTUFDIGFkZHJlc3MsIGluaXRpYWxpemUgZGVmYXVsdCBtZWRpYSB0eXBlIGFuZAorCSAqIGdldCBsaXN0IG9mIHN1cHBvcnRlZCBtZWRpYQorCSAqLworCWlmIChkZS0+ZGUyMTA0MCkgeworCQlkZTIxMDQwX2dldF9tYWNfYWRkcmVzcyhkZSk7CisJCWRlMjEwNDBfZ2V0X21lZGlhX2luZm8oZGUpOworCX0gZWxzZSB7CisJCWRlMjEwNDFfZ2V0X3Nyb21faW5mbyhkZSk7CisJfQorCisJLyogcmVnaXN0ZXIgbmV3IG5ldHdvcmsgaW50ZXJmYWNlIHdpdGgga2VybmVsICovCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9pb21hcDsKKworCS8qIHByaW50IGluZm8gYWJvdXQgYm9hcmQgYW5kIGludGVyZmFjZSBqdXN0IHJlZ2lzdGVyZWQgKi8KKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JWx4LCAiCisJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgIgorCQkiSVJRICVkXG4iLAorCQlkZXYtPm5hbWUsCisJCWRlLT5kZTIxMDQwID8gIjIxMDQwIiA6ICIyMTA0MSIsCisJCWRldi0+YmFzZV9hZGRyLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQlkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQlkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdLAorCQlkZXYtPmlycSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8qIGVuYWJsZSBidXNtYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIHB1dCBhZGFwdGVyIHRvIHNsZWVwICovCisJZGVfYWRhcHRlcl9zbGVlcChkZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb21hcDoKKwlpZiAoZGUtPmVlX2RhdGEpCisJCWtmcmVlKGRlLT5lZV9kYXRhKTsKKwlpb3VubWFwKHJlZ3MpOworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCWlmICghZGV2KQorCQlCVUcoKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChkZS0+ZWVfZGF0YSkKKwkJa2ZyZWUoZGUtPmVlX2RhdGEpOworCWlvdW5tYXAoZGUtPnJlZ3MpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgZGVfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyAoZGV2KSkgeworCQlkZWxfdGltZXJfc3luYygmZGUtPm1lZGlhX3RpbWVyKTsKKworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCXNwaW5fbG9ja19pcnEoJmRlLT5sb2NrKTsKKworCQlkZV9zdG9wX2h3KGRlKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQkKKwkJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJCV9fZGVfZ2V0X3N0YXRzKGRlKTsKKworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQlkZV9jbGVhbl9yaW5ncyhkZSk7CisKKwkJZGVfYWRhcHRlcl9zbGVlcChkZSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl9IGVsc2UgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJZ290byBvdXQ7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJZGVfaW5pdF9odyhkZSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwl9IGVsc2UgeworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfQorb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRlX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBkZV9wY2lfdGJsLAorCS5wcm9iZQkJPSBkZV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGRlX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gZGVfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGRlX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoIiVzIiwgdmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmZGVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlX2V4aXQgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmZGVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGVfaW5pdCk7Cittb2R1bGVfZXhpdChkZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODAwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCkBAIC0wLDAgKzEsNTc3OCBAQAorLyogIGRlNHg1LmM6IEEgRElHSVRBTCBEQzIxeDR4IERFQ2NoaXAgYW5kIERFNDI1L0RFNDM0L0RFNDM1L0RFNDUwL0RFNTAwCisgICAgICAgICAgICAgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKworICAgIENvcHlyaWdodCAxOTk0LCAxOTk1IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisgICAgVGVzdGluZyByZXNvdXJjZXMgZm9yIHRoaXMgZHJpdmVyIGhhdmUgYmVlbiBtYWRlIGF2YWlsYWJsZQorICAgIGluIHBhcnQgYnkgTkFTQSBBbWVzIFJlc2VhcmNoIENlbnRlciAobWphY29iQG5hcy5uYXNhLmdvdikuCisKKyAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGF0IGRhdmllc0BtYW5pYWMudWx0cmFuZXQuY29tLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SICAgSU1QTElFRAorICAgIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICAgIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICAgIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICAgIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICAgIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICAgIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIE9yaWdpbmFsbHksICAgdGhpcyAgZHJpdmVyICB3YXMgICAgd3JpdHRlbiAgZm9yIHRoZSAgRGlnaXRhbCAgIEVxdWlwbWVudAorICAgIENvcnBvcmF0aW9uIHNlcmllcyBvZiBFdGhlcldPUktTIGV0aGVybmV0IGNhcmRzOgorCisgICAgICAgIERFNDI1IFRQL0NPQVggRUlTQQorCURFNDM0IFRQIFBDSQorCURFNDM1IFRQL0NPQVgvQVVJIFBDSQorCURFNDUwIFRQL0NPQVgvQVVJIFBDSQorCURFNTAwIDEwLzEwMCBQQ0kgRmFzdGVybmV0CisKKyAgICBidXQgaXQgIHdpbGwgIG5vdyBhdHRlbXB0ICB0byAgc3VwcG9ydCBhbGwgIGNhcmRzIHdoaWNoICAgY29uZm9ybSB0byB0aGUKKyAgICBEaWdpdGFsIFNlbWljb25kdWN0b3IgICBTUk9NICAgU3BlY2lmaWNhdGlvbi4gICAgVGhlICBkcml2ZXIgICBjdXJyZW50bHkKKyAgICByZWNvZ25pc2VzIHRoZSBmb2xsb3dpbmcgY2hpcHM6CisKKyAgICAgICAgREMyMTA0MCAgKG5vIFNST00pIAorCURDMjEwNDFbQV0gIAorCURDMjExNDBbQV0gCisJREMyMTE0MiAKKwlEQzIxMTQzIAorCisgICAgU28gZmFyIHRoZSBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisKKyAgICAgICAgS0lOR1NUT04KKwlMaW5rc3lzCisJWk5ZWDM0MgorCVNNQzg0MzIKKwlTTUM5MzMyICh3L25ldyBTUk9NKQorCVpOWVgzMVs0NV0KKwlaTllYMzQ2IDEwLzEwMCA0IHBvcnQgKGNhbiBhY3QgYXMgYSAxMC8xMDAgYnJpZGdlISkgCisKKyAgICBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIHJlbGF0aXZlbHkgYnVzeSBuZXR3b3JrIHVzaW5nIHRoZSBERTQyNSwKKyAgICBERTQzNCwgREU0MzUgYW5kIERFNTAwIGNhcmRzIGFuZCBiZW5jaG1hcmtlZCB3aXRoICd0dGNwJzogaXQgdHJhbnNmZXJyZWQKKyAgICAxNk0gb2YgZGF0YSB0byBhIERFQ3N0YXRpb24gNTAwMC8yMDAgYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgIFRDUCAgICAgICAgICAgVURQCisgICAgICAgICAgICAgVFggICAgIFJYICAgICBUWCAgICAgUlgKKyAgICBERTQyNSAgIDEwMzBrICA5OTdrICAgMTE3MGsgIDExMjhrCisgICAgREU0MzQgICAxMDYzayAgOTk1ayAgIDExNzBrICAxMTI1aworICAgIERFNDM1ICAgMTA2M2sgIDk5NWsgICAxMTcwayAgMTEyNWsKKyAgICBERTUwMCAgIDEwNjNrICA5OThrICAgMTE3MGsgIDExMjVrICBpbiAxME1iL3MgbW9kZQorCisgICAgQWxsICB2YWx1ZXMgYXJlIHR5cGljYWwgKGluICAga0J5dGVzL3NlYykgZnJvbSBhICBzYW1wbGUgIG9mIDQgZm9yICBlYWNoCisgICAgbWVhc3VyZW1lbnQuIFRoZWlyIGVycm9yIGlzICsvLTIwayBvbiBhIHF1aWV0IChwcml2YXRlKSBuZXR3b3JrIGFuZCBhbHNvCisgICAgZGVwZW5kIG9uIHdoYXQgbG9hZCB0aGUgQ1BVIGhhcy4KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIGRyaXZlciAgaGFzIGJlZW4gd3JpdHRlbiBzdWJzdGFudGlhbGx5ICBmcm9tICBzY3JhdGNoLCBhbHRob3VnaCBpdHMKKyAgICBpbmhlcml0YW5jZSBvZiBzdHlsZSBhbmQgc3RhY2sgaW50ZXJmYWNlIGZyb20gJ2V3cmszLmMnIGFuZCBpbiB0dXJuIGZyb20KKyAgICBEb25hbGQgQmVja2VyJ3MgJ2xhbmNlLmMnIHNob3VsZCBiZSBvYnZpb3VzLiBXaXRoIHRoZSBtb2R1bGUgYXV0b2xvYWQgb2YKKyAgICBldmVyeSAgdXNhYmxlIERFQ2NoaXAgYm9hcmQsICBJICBwaW5jaGVkIERvbmFsZCdzICduZXh0X21vZHVsZScgZmllbGQgdG8KKyAgICBsaW5rIG15IG1vZHVsZXMgdG9nZXRoZXIuCisKKyAgICBVcHRvIDE1IEVJU0EgY2FyZHMgY2FuIGJlIHN1cHBvcnRlZCB1bmRlciB0aGlzIGRyaXZlciwgbGltaXRlZCBwcmltYXJpbHkKKyAgICBieSB0aGUgYXZhaWxhYmxlIElSUSBsaW5lcy4gIEkgaGF2ZSAgY2hlY2tlZCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgb2YKKyAgICBtdWx0aXBsZSBkZXBjYSwgRXRoZXJXT1JLUyAzIGNhcmRzIGFuZCBkZTR4NSBjYXJkcyBhbmQgIGhhdmUgbm90IGZvdW5kIGEKKyAgICBwcm9ibGVtIHlldCAocHJvdmlkZWQgeW91IGhhdmUgYXQgbGVhc3QgZGVwY2EuYyB2MC4zOCkgLi4uCisKKyAgICBQQ0kgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCAgdG8gYWxsb3cgdGhlIGRyaXZlciAgdG8gd29yayB3aXRoIHRoZSBERTQzNCwKKyAgICBERTQzNSwgREU0NTAgYW5kIERFNTAwIGNhcmRzLiBUaGUgSS9PIGFjY2Vzc2VzIGFyZSBhIGJpdCBvZiBhIGtsdWRnZSBkdWUKKyAgICB0byB0aGUgZGlmZmVyZW5jZXMgaW4gdGhlIEVJU0EgYW5kIFBDSSBDU1IgYWRkcmVzcyBvZmZzZXRzIGZyb20gdGhlIGJhc2UKKyAgICBhZGRyZXNzLgorCisgICAgVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzICBkcml2ZXIgYXMgYSBsb2FkYWJsZSAgbW9kdWxlIGhhcyBiZWVuIGluY2x1ZGVkCisgICAgYW5kIHVzZWQgZXh0ZW5zaXZlbHkgIGR1cmluZyB0aGUgZHJpdmVyIGRldmVsb3BtZW50ICAodG8gc2F2ZSB0aG9zZSBsb25nCisgICAgcmVib290IHNlcXVlbmNlcykuICBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCAgdW5kZXIgUENJIGFuZCBFSVNBIGhhcyBiZWVuCisgICAgYWNoaWV2ZWQgYnkgbGV0dGluZyB0aGUgZHJpdmVyIGF1dG9wcm9iZSBhcyBpZiBpdCB3ZXJlIGNvbXBpbGVkIGludG8gdGhlCisgICAga2VybmVsLiBEbyBtYWtlIHN1cmUgIHlvdSdyZSBub3Qgc2hhcmluZyAgaW50ZXJydXB0cyB3aXRoIGFueXRoaW5nICB0aGF0CisgICAgY2Fubm90IGFjY29tbW9kYXRlICBpbnRlcnJ1cHQgIHNoYXJpbmchCisKKyAgICBUbyB1dGlsaXNlIHRoaXMgYWJpbGl0eSwgeW91IGhhdmUgdG8gZG8gOCB0aGluZ3M6CisKKyAgICAwKSBoYXZlIGEgY29weSBvZiB0aGUgbG9hZGFibGUgbW9kdWxlcyBjb2RlIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4KKyAgICAxKSBjb3B5IGRlNHg1LmMgZnJvbSB0aGUgIC9saW51eC9kcml2ZXJzL25ldCBkaXJlY3RvcnkgdG8geW91ciBmYXZvdXJpdGUKKyAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgIDIpIGZvciBmaXhlZCAgYXV0b3Byb2JlcyAobm90ICByZWNvbW1lbmRlZCksICBlZGl0IHRoZSBzb3VyY2UgY29kZSAgbmVhcgorICAgIGxpbmUgNTU5NCB0byByZWZsZWN0IHRoZSBJL08gYWRkcmVzcyAgeW91J3JlIHVzaW5nLCBvciBhc3NpZ24gdGhlc2Ugd2hlbgorICAgIGxvYWRpbmcgYnk6CisKKyAgICAgICAgICAgICAgICAgICBpbnNtb2QgZGU0eDUgaW89MHhnaGggICAgICAgICAgIHdoZXJlIGcgPSBidXMgbnVtYmVyCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaCA9IGRldmljZSBudW1iZXIgICAKKworICAgICAgIE5COiBhdXRvcHJvYmluZyBmb3IgbW9kdWxlcyBpcyBub3cgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIFlvdSBtYXkganVzdAorICAgICAgICAgICB1c2U6CisKKyAgICAgICAgICAgICAgICAgICBpbnNtb2QgZGU0eDUKKworICAgICAgICAgICB0byBsb2FkIGFsbCBhdmFpbGFibGUgYm9hcmRzLiBGb3IgYSBzcGVjaWZpYyBib2FyZCwgc3RpbGwgdXNlCisJICAgdGhlICdpbz0/JyBhYm92ZS4KKyAgICAzKSBjb21waWxlICBkZTR4NS5jLCBidXQgaW5jbHVkZSAtRE1PRFVMRSBpbiAgdGhlIGNvbW1hbmQgbGluZSB0byBlbnN1cmUKKyAgICB0aGF0IHRoZSBjb3JyZWN0IGJpdHMgYXJlIGNvbXBpbGVkIChzZWUgZW5kIG9mIHNvdXJjZSBjb2RlKS4KKyAgICA0KSBpZiB5b3UgYXJlIHdhbnRpbmcgdG8gYWRkIGEgbmV3ICBjYXJkLCBnb3RvIDUuIE90aGVyd2lzZSwgcmVjb21waWxlIGEKKyAgICBrZXJuZWwgd2l0aCB0aGUgZGU0eDUgY29uZmlndXJhdGlvbiB0dXJuZWQgb2ZmIGFuZCByZWJvb3QuCisgICAgNSkgaW5zbW9kIGRlNHg1IFtpbz0weGdoaF0KKyAgICA2KSBydW4gdGhlIG5ldCBzdGFydHVwIGJpdHMgZm9yIHlvdXIgbmV3IGV0aD8/IGludGVyZmFjZShzKSBtYW51YWxseSAKKyAgICAodXN1YWxseSAvZXRjL3JjLmluZXRbMTJdIGF0IGJvb3QgdGltZSkuIAorICAgIDcpIGVuam95IQorCisgICAgVG8gdW5sb2FkIGEgbW9kdWxlLCB0dXJuIG9mZiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UocykgCisgICAgJ2lmY29uZmlnIGV0aD8/IGRvd24nIHRoZW4gJ3JtbW9kIGRlNHg1Jy4KKworICAgIEF1dG9tZWRpYSBkZXRlY3Rpb24gaXMgaW5jbHVkZWQgc28gdGhhdCBpbiAgcHJpbmNpcGFsIHlvdSBjYW4gZGlzY29ubmVjdAorICAgIGZyb20sIGUuZy4gIFRQLCByZWNvbm5lY3QgIHRvIEJOQyAgYW5kICB0aGluZ3Mgd2lsbCBzdGlsbCB3b3JrICAoYWZ0ZXIgYQorICAgIHBhdXNlIHdoaWxzdCB0aGUgICBkcml2ZXIgZmlndXJlcyBvdXQgICB3aGVyZSBpdHMgbWVkaWEgd2VudCkuICBNeSB0ZXN0cworICAgIHVzaW5nIHBpbmcgc2hvd2VkIHRoYXQgaXQgYXBwZWFycyB0byB3b3JrLi4uLgorCisgICAgQnkgIGRlZmF1bHQsICB0aGUgZHJpdmVyIHdpbGwgIG5vdyAgIGF1dG9kZXRlY3QgYW55ICBERUNjaGlwIGJhc2VkIGNhcmQuCisgICAgU2hvdWxkIHlvdSBoYXZlIGEgbmVlZCB0byByZXN0cmljdCB0aGUgZHJpdmVyIHRvIERJR0lUQUwgb25seSBjYXJkcywgeW91CisgICAgY2FuIGNvbXBpbGUgd2l0aCBhICBERUNfT05MWSBkZWZpbmUsIG9yIGlmICBsb2FkaW5nIGFzIGEgbW9kdWxlLCB1c2UgdGhlCisgICAgJ2RlY19vbmx5PTEnICBwYXJhbWV0ZXIuIAorCisgICAgSSd2ZSBjaGFuZ2VkIHRoZSB0aW1pbmcgcm91dGluZXMgdG8gIHVzZSB0aGUga2VybmVsIHRpbWVyIGFuZCBzY2hlZHVsaW5nCisgICAgZnVuY3Rpb25zICBzbyB0aGF0IHRoZSAgaGFuZ3MgIGFuZCBvdGhlciBhc3NvcnRlZCBwcm9ibGVtcyB0aGF0IG9jY3VycmVkCisgICAgd2hpbGUgYXV0b3NlbnNpbmcgdGhlICBtZWRpYSAgc2hvdWxkIGJlIGdvbmUuICBBICBib251cyAgZm9yIHRoZSBEQzIxMDQwCisgICAgYXV0byAgbWVkaWEgc2Vuc2UgYWxnb3JpdGhtIGlzICB0aGF0IGl0IGNhbiBub3cgIHVzZSBvbmUgdGhhdCBpcyBtb3JlIGluCisgICAgbGluZSB3aXRoIHRoZSAgcmVzdCAodGhlIERDMjEwNDAgIGNoaXAgZG9lc24ndCAgaGF2ZSBhIGhhcmR3YXJlICB0aW1lcikuCisgICAgVGhlIGRvd25zaWRlIGlzIHRoZSAxICdqaWZmaWVzJyAoMTBtcykgcmVzb2x1dGlvbi4KKworICAgIElFRUUgODAyLjN1IE1JSSBpbnRlcmZhY2UgY29kZSBoYXMgIGJlZW4gYWRkZWQgaW4gYW50aWNpcGF0aW9uIHRoYXQgc29tZQorICAgIHByb2R1Y3RzIG1heSB1c2UgaXQgaW4gdGhlIGZ1dHVyZS4KKworICAgIFRoZSBTTUM5MzMyIGNhcmQgIGhhcyBhIG5vbi1jb21wbGlhbnQgU1JPTSAgd2hpY2ggbmVlZHMgZml4aW5nIC0gIEkgaGF2ZQorICAgIHBhdGNoZWQgdGhpcyAgZHJpdmVyIHRvIGRldGVjdCBpdCAgYmVjYXVzZSB0aGUgU1JPTSBmb3JtYXQgdXNlZCBjb21wbGllcworICAgIHRvIGEgcHJldmlvdXMgREVDLVNURCBmb3JtYXQuCisKKyAgICBJIGhhdmUgcmVtb3ZlZCB0aGUgYnVmZmVyIGNvcGllcyBuZWVkZWQgZm9yIHJlY2VpdmUgb24gSW50ZWxzLiAgSSBjYW5ub3QKKyAgICByZW1vdmUgdGhlbSBmb3IgICBBbHBoYXMgc2luY2UgIHRoZSAgVHVsaXAgaGFyZHdhcmUgICBvbmx5IGRvZXMgbG9uZ3dvcmQKKyAgICBhbGlnbmVkICBETUEgdHJhbnNmZXJzICBhbmQgIHRoZSAgQWxwaGFzIGdldCAgIGFsaWdubWVudCB0cmFwcyB3aXRoICBub24KKyAgICBsb25nd29yZCBhbGlnbmVkIGRhdGEgY29waWVzICh3aGljaCBtYWtlcyB0aGVtIHJlYWxseSBzbG93KS4gTm8gY29tbWVudC4KKworICAgIEkgIGhhdmUgYWRkZWQgU1JPTSBkZWNvZGluZyAgcm91dGluZXMgdG8gbWFrZSB0aGlzICBkcml2ZXIgd29yayB3aXRoIGFueQorICAgIGNhcmQgdGhhdCAgc3VwcG9ydHMgdGhlIERpZ2l0YWwgIFNlbWljb25kdWN0b3IgU1JPTSBzcGVjLiBUaGlzIHdpbGwgaGVscAorICAgIGFsbCAgY2FyZHMgcnVubmluZyB0aGUgZGMyMTE0eCAgc2VyaWVzIGNoaXBzIGluIHBhcnRpY3VsYXIuICBDYXJkcyB1c2luZworICAgIHRoZSBkYzIxMDR4ICBjaGlwcyBzaG91bGQgcnVuIGNvcnJlY3RseSB3aXRoICB0aGUgYmFzaWMgIGRyaXZlci4gIEknbSBpbgorICAgIGRlYnQgdG8gPG1qYWNvYkBmZXJhbC5jb20+IGZvciB0aGUgIHRlc3RpbmcgYW5kIGZlZWRiYWNrIHRoYXQgaGVscGVkIGdldAorICAgIHRoaXMgZmVhdHVyZSB3b3JraW5nLiAgU28gZmFyIHdlIGhhdmUgIHRlc3RlZCBLSU5HU1RPTiwgU01DODQzMiwgU01DOTMzMgorICAgICh3aXRoIHRoZSBsYXRlc3QgU1JPTSBjb21wbHlpbmcgIHdpdGggdGhlIFNST00gc3BlYyAgVjM6IHRoZWlyIGZpcnN0IHdhcworICAgIGJyb2tlbiksIFpOWVgzNDIgIGFuZCAgTGlua1N5cy4gWllOWDMxNCAoZHVhbCAgMjEwNDEgIE1BQykgYW5kICBaTllYIDMxNQorICAgIChxdWFkIDIxMDQxIE1BQykgIGNhcmRzIGFsc28gIGFwcGVhciAgdG8gd29yayBkZXNwaXRlIHRoZWlyICBpbmNvcnJlY3RseQorICAgIHdpcmVkIElSUXMuCisKKyAgICBJIGhhdmUgYWRkZWQgYSB0ZW1wb3JhcnkgZml4IGZvciBpbnRlcnJ1cHQgcHJvYmxlbXMgd2hlbiBzb21lIFNDU0kgY2FyZHMKKyAgICBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgYXMgdGhlIERFQ2NoaXAgYmFzZWQgIGNhcmRzLiBUaGUgcHJvYmxlbSBvY2N1cnMKKyAgICBiZWNhdXNlICB0aGUgU0NTSSBjYXJkIHdhbnRzIHRvICBncmFiIHRoZSBpbnRlcnJ1cHQgIGFzIGEgZmFzdCBpbnRlcnJ1cHQKKyAgICAocnVucyB0aGUgICBzZXJ2aWNlIHJvdXRpbmUgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCAgIG9mZikgdnMuICB0aGlzIGNhcmQKKyAgICB3aGljaCByZWFsbHkgbmVlZHMgdG8gcnVuIHRoZSBzZXJ2aWNlIHJvdXRpbmUgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvbi4KKyAgICBUaGlzIGRyaXZlciB3aWxsICBub3cgICBhZGQgdGhlIGludGVycnVwdCBzZXJ2aWNlICAgcm91dGluZSAgYXMgIGEgIGZhc3QKKyAgICBpbnRlcnJ1cHQgaWYgaXQgICBpcyBib3VuY2VkIGZyb20gdGhlICAgc2xvdyBpbnRlcnJ1cHQuICBUSElTIElTIE5PVCAgIEEKKyAgICBSRUNPTU1FTkRFRCBXQVkgVE8gUlVOIFRIRSBEUklWRVIgIGFuZCBoYXMgYmVlbiBkb25lICBmb3IgYSBsaW1pdGVkIHRpbWUKKyAgICB1bnRpbCAgcGVvcGxlICAgc29ydCAgb3V0IHRoZWlyICBjb21wYXRpYmlsaXR5ICAgIGlzc3VlcyBhbmQgdGhlICBrZXJuZWwKKyAgICBpbnRlcnJ1cHQgIHNlcnZpY2UgY29kZSAgaXMgIGZpeGVkLiAgIFlPVSAgU0hPVUxEIFNFUEFSQVRFIE9VVCAgVEhFIEZBU1QKKyAgICBJTlRFUlJVUFQgQ0FSRFMgRlJPTSBUSEUgU0xPVyBJTlRFUlJVUFQgQ0FSRFMgdG8gZW5zdXJlIHRoYXQgdGhleSBkbyBub3QKKyAgICBydW4gb24gdGhlIHNhbWUgaW50ZXJydXB0LiBQQ01DSUEvQ2FyZEJ1cyBpcyBhbm90aGVyIGNhbiBvZiB3b3Jtcy4uLgorCisgICAgRmluYWxseSwgSSB0aGluayAgSSBoYXZlIHJlYWxseSAgZml4ZWQgIHRoZSBtb2R1bGUgIGxvYWRpbmcgcHJvYmxlbSB3aXRoCisgICAgbW9yZSB0aGFuIG9uZSBERUNjaGlwIGJhc2VkICBjYXJkLiAgQXMgYSAgc2lkZSBlZmZlY3QsIEkgZG9uJ3QgbWVzcyB3aXRoCisgICAgdGhlICBkZXZpY2Ugc3RydWN0dXJlIGFueSAgbW9yZSB3aGljaCBtZWFucyB0aGF0ICBpZiBtb3JlIHRoYW4gMSBjYXJkIGluCisgICAgMi4wLnggaXMgICAgaW5zdGFsbGVkICg0ICBpbiAgIDIuMS54KSwgIHRoZSAgdXNlciAgIHdpbGwgaGF2ZSAgIHRvICBlZGl0CisgICAgbGludXgvZHJpdmVycy9uZXQvU3BhY2UuYyAgdG8gbWFrZSByb29tIGZvciAgdGhlbS4gSGVuY2UsIG1vZHVsZSBsb2FkaW5nCisgICAgaXMgIHRoZSBwcmVmZXJyZWQgd2F5IHRvIHVzZSAgIHRoaXMgZHJpdmVyLCBzaW5jZSAgaXQgIGRvZXNuJ3QgaGF2ZSB0aGlzCisgICAgbGltaXRhdGlvbi4KKworICAgIFdoZXJlIFNST00gbWVkaWEgIGRldGVjdGlvbiBpcyB1c2VkIGFuZCAgZnVsbCBkdXBsZXggaXMgc3BlY2lmaWVkIGluIHRoZQorICAgIFNST00sICB0aGUgZmVhdHVyZSBpcyAgaWdub3JlZCB1bmxlc3MgIGxwLT5wYXJhbXMuZmR4ICBpcyBzZXQgYXQgY29tcGlsZQorICAgIHRpbWUgIE9SIGR1cmluZyAgYSAgIG1vZHVsZSBsb2FkICAoaW5zbW9kICBkZTR4NSAgIGFyZ3M9J2V0aD8/OmZkeCcgW3NlZQorICAgIGJlbG93XSkuICBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgIGlzIG5vIHdheSAgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgZnVsbAorICAgIGR1cGxleCAgIGxpbmtzICBleGNlcHQgdGhyb3VnaCAgIGF1dG9uZWdvdGlhdGlvbi4gICAgV2hlbiBJICBpbmNsdWRlIHRoZQorICAgIGF1dG9uZWdvdGlhdGlvbiBmZWF0dXJlIGluICB0aGUgU1JPTSBhdXRvY29uZiAgY29kZSwgdGhpcyBkZXRlY3Rpb24gd2lsbAorICAgIG9jY3VyIGF1dG9tYXRpY2FsbHkgZm9yIHRoYXQgY2FzZS4KKworICAgIENvbW1hbmQgIGxpbmUgYXJndW1lbnRzIGFyZSAgbm93ICBhbGxvd2VkLCBzaW1pbGFyICB0byBwYXNzaW5nIGFyZ3VtZW50cworICAgIHRocm91Z2ggTElMTy4gVGhpcyB3aWxsIGFsbG93IGEgcGVyIGFkYXB0ZXIgYm9hcmQgIHNldCB1cCBvZiBmdWxsIGR1cGxleAorICAgIGFuZCBtZWRpYS4gVGhlIG9ubHkgbGV4aWNhbCBjb25zdHJhaW50cyAgYXJlOiB0aGUgYm9hcmQgbmFtZSAoZGV2LT5uYW1lKQorICAgIGFwcGVhcnMgaW4gdGhlIGxpc3QgYmVmb3JlIGl0cyAgcGFyYW1ldGVycy4gIFRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgZW5kcworICAgIGVpdGhlciBhdCB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdCBvciB3aXRoIGFub3RoZXIgYm9hcmQgbmFtZS4gIFRoZQorICAgIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBhbGxvd2VkOgorCisgICAgICAgICAgICBmZHggICAgICAgIGZvciBmdWxsIGR1cGxleAorCSAgICBhdXRvc2Vuc2UgIHRvIHNldCB0aGUgbWVkaWEvc3BlZWQ7IHdpdGggdGhlIGZvbGxvd2luZyAKKwkgICAgICAgICAgICAgICBzdWItcGFyYW1ldGVyczoKKwkJICAgICAgIFRQLCBUUF9OVywgQk5DLCBBVUksIEJOQ19BVUksIDEwME1iLCAxME1iLCBBVVRPCisKKyAgICBDYXNlIHNlbnNpdGl2aXR5IGlzIGltcG9ydGFudCAgZm9yICB0aGUgc3ViLXBhcmFtZXRlcnMuIFRoZXkgKm11c3QqICAgYmUKKyAgICB1cHBlciBjYXNlLiBFeGFtcGxlczoKKworICAgICAgICBpbnNtb2QgZGU0eDUgYXJncz0nZXRoMTpmZHggYXV0b3NlbnNlPUJOQyBldGgwOmF1dG9zZW5zZT0xMDBNYicuCisKKyAgICBGb3IgYSBjb21waWxlZCBpbiBkcml2ZXIsIGF0IG9yIGFib3ZlIGxpbmUgNTQ4LCBwbGFjZSBlLmcuCisJI2RlZmluZSBERTRYNV9QQVJNICJldGgwOmZkeCBhdXRvc2Vuc2U9QVVJIGV0aDI6YXV0b3NlbnNlPVRQIgorCisgICAgWWVzLCAgSSBrbm93IGZ1bGwgZHVwbGV4IGlzbid0ICBwZXJtaXNzaWJsZSBvbiBCTkMgIG9yIEFVSTsgdGhleSdyZSBqdXN0CisgICAgZXhhbXBsZXMuIEJ5IGRlZmF1bHQsIGZ1bGwgZHVwbGV4IGlzIHR1cm5lZCBvZmYgYW5kICBBVVRPIGlzIHRoZSBkZWZhdWx0CisgICAgYXV0b3NlbnNlIHNldHRpbmcuICBJbiByZWFsaXR5LCBJIGV4cGVjdCBvbmx5ICB0aGUgZnVsbCBkdXBsZXggb3B0aW9uIHRvCisgICAgYmUgdXNlZC4gTm90ZSB0aGUgdXNlIG9mIHNpbmdsZSBxdW90ZXMgaW4gdGhlIHR3byBleGFtcGxlcyBhYm92ZSBhbmQgdGhlCisgICAgbGFjayBvZiBjb21tYXMgdG8gc2VwYXJhdGUgaXRlbXMuIEFMU08sIHlvdSBtdXN0IGdldCB0aGUgcmVxdWVzdGVkIG1lZGlhCisgICAgY29ycmVjdCBpbiByZWxhdGlvbiB0byB3aGF0IHRoZSBhZGFwdGVyIFNST00gc2F5cyBpdCBoYXMuIFRoZXJlJ3Mgbm8gd2F5CisgICAgdG8gIGRldGVybWluZSB0aGlzIGluICBhZHZhbmNlIG90aGVyIHRoYW4gYnkgIHRyaWFsIGFuZCBlcnJvciBhbmQgY29tbW9uCisgICAgc2Vuc2UsIGUuZy4gY2FsbCBhIEJOQyBjb25uZWN0b3JlZCBwb3J0ICdCTkMnLCBub3QgJzEwTWInLgorCisgICAgQ2hhbmdlZCB0aGUgYnVzIHByb2JpbmcuICBFSVNBIHVzZWQgdG8gYmUgIGRvbmUgZmlyc3QsICBmb2xsb3dlZCBieSBQQ0kuCisgICAgTW9zdCBwZW9wbGUgcHJvYmFibHkgZG9uJ3QgZXZlbiBrbm93ICB3aGF0IGEgZGU0MjUgaXMgdG9kYXkgYW5kIHRoZSBFSVNBCisgICAgcHJvYmUgaGFzIG1lc3NlZCAgdXAgc29tZSBTQ1NJIGNhcmRzICBpbiB0aGUgcGFzdCwgIHNvIG5vdyBQQ0kgaXMgYWx3YXlzCisgICAgcHJvYmVkICBmaXJzdCAgZm9sbG93ZWQgYnkgIEVJU0EgaWYgIGEpIHRoZSBhcmNoaXRlY3R1cmUgYWxsb3dzIEVJU0EgYW5kCisgICAgZWl0aGVyICBiKSB0aGVyZSBoYXZlIGJlZW4gbm8gUENJIGNhcmRzIGRldGVjdGVkIG9yICBjKSBhbiBFSVNBIHByb2JlIGlzCisgICAgZm9yY2VkIGJ5ICB0aGUgdXNlci4gIFRvIGZvcmNlICBhIHByb2JlICBpbmNsdWRlICAiZm9yY2VfZWlzYSIgIGluICB5b3VyCisgICAgaW5zbW9kICJhcmdzIiBsaW5lOyAgZm9yIGJ1aWx0LWluIGtlcm5lbHMgZWl0aGVyIGNoYW5nZSB0aGUgZHJpdmVyIHRvIGRvCisgICAgdGhpcyAgYXV0b21hdGljYWxseSAgb3IgaW5jbHVkZSAgI2RlZmluZSBERTRYNV9GT1JDRV9FSVNBICBvbiBvciAgYmVmb3JlCisgICAgbGluZSAxMDQwIGluIHRoZSBkcml2ZXIuCisKKyAgICBUTyBETzogCisgICAgLS0tLS0tCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5CisgICAgLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVmVyc2lvbiAgIERhdGUgICAgICAgIERlc2NyaXB0aW9uCisgIAorICAgICAgMC4xICAgICAxNy1Ob3YtOTQgICBJbml0aWFsIHdyaXRpbmcuIEFMUEhBIGNvZGUgcmVsZWFzZS4KKyAgICAgIDAuMiAgICAgMTMtSmFuLTk1ICAgQWRkZWQgUENJIHN1cHBvcnQgZm9yIERFNDM1J3MuCisgICAgICAwLjIxICAgIDE5LUphbi05NSAgIEFkZGVkIGF1dG8gbWVkaWEgZGV0ZWN0aW9uLgorICAgICAgMC4yMiAgICAxMC1GZWItOTUgICBGaXggaW50ZXJydXB0IGhhbmRsZXIgY2FsbCA8Y2hyaXNAY29zeS5zYmcuYWMuYXQ+LgorICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4uCisJCQkgIEFkZCByZXF1ZXN0L3JlbGVhc2VfcmVnaW9uIGNvZGUuCisJCQkgIEFkZCBsb2FkYWJsZSBtb2R1bGVzIHN1cHBvcnQgZm9yIFBDSS4KKwkJCSAgQ2xlYW4gdXAgbG9hZGFibGUgbW9kdWxlcyBzdXBwb3J0LgorICAgICAgMC4yMyAgICAyOC1GZWItOTUgICBBZGRlZCBEQzIxMDQxIGFuZCBEQzIxMTQwIHN1cHBvcnQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggbWlzc2VkIGZyYW1lIGNvdW50ZXIgdmFsdWUgYW5kIGluaXRpYWxpc2F0aW9uLgorCQkJICBGaXhlZCBFSVNBIHByb2JlLgorICAgICAgMC4yNCAgICAxMS1BcHItOTUgICBDaGFuZ2UgZGVsYXkgcm91dGluZSB0byB1c2UgPGxpbnV4L3VkZWxheT4uCisgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBUWF9CVUZGU19BVkFJTCBtYWNyby4KKwkJCSAgQ2hhbmdlIG1lZGlhIGF1dG9kZXRlY3Rpb24gdG8gYWxsb3cgbWFudWFsIHNldHRpbmcuCisJCQkgIENvbXBsZXRlZCBERTUwMCAoREMyMTE0MCkgc3VwcG9ydC4KKyAgICAgIDAuMjQxICAgMTgtQXByLTk1ICAgSW50ZXJpbSByZWxlYXNlIHdpdGhvdXQgREU1MDAgQXV0b3NlbnNlIEFsZ29yaXRobS4KKyAgICAgIDAuMjQyICAgMTAtTWF5LTk1ICAgTWlub3IgY2hhbmdlcy4KKyAgICAgIDAuMzAgICAgMTItSnVuLTk1ICAgVGltZXIgZml4IGZvciBEQzIxMTQwLgorICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0YWJpbGl0eSBjaGFuZ2VzLgorCQkJICBBZGQgQUxQSEEgY2hhbmdlcyBmcm9tIDxqZXN0YWJyb0BhbnQudGF5MS5kZWMuY29tPi4KKwkJCSAgQWRkIERFNTAwIHNlbWkgYXV0b21hdGljIGF1dG9zZW5zZS4KKwkJCSAgQWRkIExpbmsgRmFpbCBpbnRlcnJ1cHQgVFAgZmFpbHVyZSBkZXRlY3Rpb24uCisJCQkgIEFkZCB0aW1lciBiYXNlZCBsaW5rIGNoYW5nZSBkZXRlY3Rpb24uCisJCQkgIFBsdWdnZWQgYSBtZW1vcnkgbGVhayBpbiBkZTR4NV9xdWV1ZV9wa3QoKS4KKyAgICAgIDAuMzEgICAgMTMtSnVuLTk1ICAgRml4ZWQgUENJIHN0dWZmIGZvciAxLjMuMS4KKyAgICAgIDAuMzIgICAgMjYtSnVuLTk1ICAgQWRkZWQgdmVyaWZ5X2FyZWEoKSBjYWxscyBpbiBkZTR4NV9pb2N0bCgpIGZyb20gYQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uIGJ5IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+LgorICAgICAgMC4zMyAgICAgOC1BdWctOTUgICBBZGQgc2hhcmVkIGludGVycnVwdCBzdXBwb3J0IChub3QgcmVsZWFzZWQgeWV0KS4KKyAgICAgIDAuMzMxICAgMjEtQXVnLTk1ICAgRml4IGRlNHg1X29wZW4oKSB3aXRoIGZhc3QgQ1BVcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGRlNHg1X2ludGVycnVwdCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggZGMyMTE0MF9hdXRvY29uZigpIG1lc3MuCisJCQkgIE5vIHNoYXJlZCBpbnRlcnJ1cHQgc3VwcG9ydC4KKyAgICAgIDAuMzMyICAgMTEtU2VwLTk1ICAgQWRkZWQgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorICAgICAgMC40MCAgICAgNS1NYXItOTYgICBGaXggc2V0dXAgZnJhbWUgdGltZW91dCA8bWFhcnRlbmJAaHBrdWlwYy5jZXJuLmNoPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGtlcm5lbCB0aW1lciBjb2RlIChoL3cgaXMgdG9vIGZsYWt5KS4KKwkJCSAgQWRkIE1JSSBiYXNlZCBQSFkgYXV0b3NlbnNlLgorCQkJICBBZGQgbmV3IG11bHRpY2FzdGluZyBjb2RlLgorCQkJICBBZGQgbmV3IGF1dG9zZW5zZSBhbGdvcml0aG1zIGZvciBtZWRpYS9tb2RlIAorCQkJICBzZWxlY3Rpb24gdXNpbmcga2VybmVsIHNjaGVkdWxpbmcvdGltaW5nLgorCQkJICBSZS1mb3JtYXR0ZWQuCisJCQkgIE1hZGUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgPGplZmZAcm91dGVyLnBhdGNoLm5ldD46CisJCQkgICAgQ2hhbmdlIGRyaXZlciB0byBkZXRlY3QgYWxsIERFQ2NoaXAgYmFzZWQgY2FyZHMKKwkJCSAgICB3aXRoIERFQ19PTkxZIHJlc3RyaWN0aW9uIGEgc3BlY2lhbCBjYXNlLgorCQkJICAgIENoYW5nZWQgZHJpdmVyIHRvIGF1dG9wcm9iZSBhcyBhIG1vZHVsZS4gTm8gaXJxCisJCQkgICAgY2hlY2tpbmcgaXMgZG9uZSBub3cgLSBhc3N1bWUgQklPUyBpcyBnb29kIQorCQkJICBBZGRlZCBTTUM5MzMyIGRldGVjdGlvbiA8bWFuYWJlQFJveS5kc2wudHV0aWNzLmFjLmpwPgorICAgICAgMC40MSAgICAyMS1NYXItOTYgICBEb24ndCBjaGVjayBmb3IgZ2V0X2h3X2FkZHIgY2hlY2tzdW0gdW5sZXNzIERFQyBjYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgPG5pbGVzQGF4cDc0NWdzZmMubmFzYS5nb3Y+CisJCQkgIEZpeCBmb3IgbXVsdGlwbGUgUENJIGNhcmRzIHJlcG9ydGVkIGJ5IDxqb3NAeG9zLm5sPgorCQkJICBEdWgsIHB1dCB0aGUgU0FfU0hJUlEgZmxhZyBpbnRvIHJlcXVlc3RfaW50ZXJydXB0KCkuCisJCQkgIEZpeCBTTUMgZXRoZXJuZXQgYWRkcmVzcyBpbiBlbmV0X2RldFtdLgorCQkJICBQcmludCBjaGlwIG5hbWUgaW5zdGVhZCBvZiAiVU5LTk9XTiIgZHVyaW5nIGJvb3QuCisgICAgICAwLjQyICAgIDI2LUFwci05NiAgIEZpeCBNSUkgd3JpdGUgVEEgYml0IGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggYnVnIGluIGRjMjEwNDAgYW5kIGRjMjEwNDEgYXV0b3NlbnNlIGNvZGUuCisJCQkgIFJlbW92ZSBidWZmZXIgY29waWVzIG9uIHJlY2VpdmUgZm9yIEludGVscy4KKwkJCSAgQ2hhbmdlIHNrX2J1ZmYgaGFuZGxpbmcgZHVyaW5nIG1lZGlhIGRpc2Nvbm5lY3RzIHRvCisJCQkgICBlbGltaW5hdGUgRFVQIHBhY2tldHMuCisJCQkgIEFkZCBkeW5hbWljIFRYIHRocmVzaG9sZGluZy4KKwkJCSAgQ2hhbmdlIGFsbCBjaGlwcyB0byB1c2UgcGVyZmVjdCBtdWx0aWNhc3QgZmlsdGVyaW5nLgorCQkJICBGaXggYWxsb2NfZGV2aWNlKCkgYnVnIDxqYXJpQG1hcmtrdXMyLmZpbXIuZmk+CisgICAgICAwLjQzICAgMjEtSnVuLTk2ICAgIEZpeCB1bmNvbm5lY3RlZCBtZWRpYSBUWCByZXRyeSBidWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBBY2N0b24gdG8gdGhlIGxpc3Qgb2YgYnJva2VuIGNhcmRzLgorCQkJICBGaXggVFggdW5kZXItcnVuIGJ1ZyBmb3Igbm9uIERDMjExNDAgY2hpcHMuCisJCQkgIEZpeCBib290IGNvbW1hbmQgcHJvYmUgYnVnIGluIGFsbG9jX2RldmljZSgpIGFzCisJCQkgICByZXBvcnRlZCBieSA8a29lbi5nYWRleW5lQGJhcmNvLmNvbT4gYW5kIAorCQkJICAgPG9yYXZhQG5ldGhlci50a3kuaHV0LmZpPi4KKwkJCSAgQWRkIGNhY2hlIGxvY2tzIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiBhcworCQkJICAgcmVwb3J0ZWQgYnkgPGNzZEBtaWNyb3BsZXguY29tPiBhbmQgCisJCQkgICA8YmFiYUBiZWNrbWFuLnVpdWMuZWR1Pi4KKwkJCSAgVXBncmFkZWQgYWxsb2NfZGV2aWNlKCkgY29kZS4KKyAgICAgIDAuNDMxICAyOC1KdW4tOTYgICAgRml4IHBvdGVudGlhbCBidWcgaW4gcXVldWVfcGt0KCkgZnJvbSBkaXNjdXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggPGNzZEBtaWNyb3BsZXguY29tPgorICAgICAgMC40NCAgIDEzLUF1Zy05NiAgICBGaXggUlggb3ZlcmZsb3cgYnVnIGluIDIxMTRbMDIzXSBjaGlwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IEVJU0EgcHJvYmUgYnVncyByZXBvcnRlZCBieSA8b3MyQGtwaS5raGFya292LnVhPgorCQkJICBhbmQgPG1pY2hhZWxAY29tcHVyZXguY29tPi4KKyAgICAgIDAuNDQxICAgOS1TZXAtOTYgICAgQ2hhbmdlIGRjMjEwNDFfYXV0b2NvbmYoKSB0byBwcm9iZSBxdWlldCBCTkMgbWVkaWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBsb29wYmFjayBwYWNrZXQuCisgICAgICAwLjQ0MiAgIDktU2VwLTk2ICAgIEluY2x1ZGUgQVVJIGluIGRjMjEwNDEgbWVkaWEgcHJpbnRvdXQuIEJ1ZyByZXBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPGJoYXRAbXVuZG9vay5jcy5tdS5PWi5BVT4KKyAgICAgIDAuNDUgICAgOC1EZWMtOTYgICAgSW5jbHVkZSBlbmRpYW4gZnVuY3Rpb25zIGZvciBQUEMgdXNlLCBmcm9tIHdvcmsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA8Y29ydEBjcy5ubXQuZWR1PiBhbmQgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgorICAgICAgMC40NTEgIDI4LURlYy05NiAgICBBZGRlZCBmaXggdG8gYWxsb3cgYXV0b3Byb2JlIGZvciBtb2R1bGVzIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uIGZyb20gPG1qYWNvYkBmZXJhbC5jb20+LgorICAgICAgMC41ICAgIDMwLUphbi05NyAgICBBZGRlZCBTUk9NIGRlY29kaW5nIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlZCBkZWJ1ZyBmbGFncy4KKwkJCSAgRml4IHNsZWVwL3dha2V1cCBjYWxscyBmb3IgUENJIGNhcmRzLCBidWcgcmVwb3J0ZWQKKwkJCSAgIGJ5IDxjcm9zc0Bnd2VlcC5sa2cuZGVjLmNvbT4uCisJCQkgIEFkZGVkIG11bHRpLU1BQywgb25lIFNST00gZmVhdHVyZSBmcm9tIGRpc2N1c3Npb24KKwkJCSAgIHdpdGggPG1qYWNvYkBmZXJhbC5jb20+LgorCQkJICBBZGRlZCBmdWxsIG1vZHVsZSBhdXRvcHJvYmUgY2FwYWJpbGl0eS4KKwkJCSAgQWRkZWQgYXR0ZW1wdCB0byB1c2UgYW4gU01DOTMzMiB3aXRoIGJyb2tlbiBTUk9NLgorCQkJICBBZGRlZCBmaXggZm9yIFpZTlggbXVsdGktbWFjIGNhcmRzIHRoYXQgZGlkbid0CisJCQkgICBnZXQgdGhlaXIgSVJRcyB3aXJlZCBjb3JyZWN0bHkuCisgICAgICAwLjUxICAgMTMtRmViLTk3ICAgIEFkZGVkIGVuZGlhbiBmaXhlcyBmb3IgdGhlIFNST00gYWNjZXNzZXMgZnJvbQorCQkJICAgPHBhdWJlcnRAaXJhbS5lcz4KKwkJCSAgRml4IGluaXRfY29ubmVjdGlvbigpIHRvIHJlbW92ZSBleHRyYSBkZXZpY2UgcmVzZXQuCisJCQkgIEZpeCBNQUMvUEhZIHJlc2V0IG9yZGVyaW5nIGluIGRjMjExNDBtX2F1dG9jb25mKCkuCisJCQkgIEZpeCBpbml0aWFsaXNhdGlvbiBwcm9ibGVtIHdpdGggbHAtPnRpbWVvdXQgaW4KKwkJCSAgIHR5cGVYX2luZm9ibG9jaygpIGZyb20gPHBhdWJlcnRAaXJhbS5lcz4uCisJCQkgIEZpeCBNSUkgUEhZIHJlc2V0IHByb2JsZW0gZnJvbSB3b3JrIGRvbmUgYnkKKwkJCSAgIDxwYXViZXJ0QGlyYW0uZXM+LgorICAgICAgMC41MiAgIDI2LUFwci05NyAgICBTb21lIGNoYW5nZXMgbWF5IG5vdCBjcmVkaXQgdGhlIHJpZ2h0IHBlb3BsZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc2sgY3Jhc2ggbWVhbnQgSSBsb3N0IHNvbWUgbWFpbC4KKwkJCSAgQ2hhbmdlIFJYIGludGVycnVwdCByb3V0aW5lIHRvIGRyb3AgcmF0aGVyIHRoYW4gCisJCQkgICBkZWZlciBwYWNrZXRzIHRvIGF2b2lkIGhhbmcgcmVwb3J0ZWQgYnkgCisJCQkgICA8Zy50aG9tYXNAb3Blbmdyb3VwLm9yZz4uCisJCQkgIEZpeCBzcm9tX2V4ZWMoKSB0byByZXR1cm4gZm9yIENPTVBBQ1QgYW5kIHR5cGUgMQorCQkJICAgaW5mb2Jsb2Nrcy4KKwkJCSAgQWRkZWQgREMyMTE0MiBhbmQgREMyMTE0MyBmdW5jdGlvbnMuCisJCQkgIEFkZGVkIGJ5dGUgY291bnRlcnMgZnJvbSA8cGhpbEB0YXplbmRhLmRlbW9uLmNvLnVrPgorCQkJICBBZGRlZCBTQV9JTlRFUlJVUFQgdGVtcG9yYXJ5IGZpeCBmcm9tIAorCQkJICAgPG1qYWNvYkBmZXJhbC5jb20+LgorICAgICAgMC41MyAgIDEyLU5vdi05NyAgICBGaXggdGhlICpfcHJvYmUoKSB0byBpbmNsdWRlICdldGg/PycgbmFtZSBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBsb2FkOiBidWcgcmVwb3J0ZWQgYnkKKwkJCSAgIDxQaWV0ZS5Ccm9va3NAY2wuY2FtLmFjLnVrPgorCQkJICBGaXggbXVsdGktTUFDLCBvbmUgU1JPTSwgdG8gd29yayB3aXRoIDIxMTR4IGNoaXBzOgorCQkJICAgYnVnIHJlcG9ydGVkIGJ5IDxjbWV0ekBpbm5lci5uZXQ+LgorCQkJICBNYWtlIGFib3ZlIHNlYXJjaCBpbmRlcGVuZGVudCBvZiBCSU9TIGRldmljZSBzY2FuCisJCQkgICBkaXJlY3Rpb24uCisJCQkgIENvbXBsZXRlZCBEQzIxMTRbMjNdIGF1dG9zZW5zZSBmdW5jdGlvbnMuCisgICAgICAwLjUzMSAgMjEtRGVjLTk3ICAgIEZpeCBERTUwMC1YQSAxMDBNYi9zIGJ1ZyByZXBvcnRlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb2JpbkBpbnRlcmNvcmUuY29tCisJCQkgIEZpeCB0eXBlMV9pbmZvYmxvY2soKSBidWcgaW50cm9kdWNlZCBpbiAwLjUzLCBmcm9tCisJCQkgICBwcm9ibGVtIHJlcG9ydHMgYnkgCisJCQkgICA8cGFybWVlQHBvc3RlY3NzLm5jcmZyYW4uZnJhbmNlLm5jci5jb20+IGFuZAorCQkJICAgPGpvQGljZS5kaWxsaW5nZW4uYmF5bmV0LmRlPi4KKwkJCSAgQWRkZWQgYXJndW1lbnQgbGlzdCB0byBzZXQgdXAgZWFjaCBib2FyZCBmcm9tIGVpdGhlcgorCQkJICAgYSBtb2R1bGUncyBjb21tYW5kIGxpbmUgb3IgYSBjb21waWxlZCBpbiAjZGVmaW5lLgorCQkJICBBZGRlZCBnZW5lcmljIE1JSSBQSFkgZnVuY3Rpb25hbGl0eSB0byBkZWFsIHdpdGgKKwkJCSAgIG5ld2VyIFBIWSBjaGlwcy4KKwkJCSAgRml4IHRoZSBtZXNzIGluIDIuMS42Ny4KKyAgICAgIDAuNTMyICAgNS1KYW4tOTggICAgRml4IGJ1ZyBpbiBtaWlfZ2V0X3BoeSgpIHJlcG9ydGVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlZGhhdEBjb2NvY28ubmV0Pi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBpbiBwY2lfcHJvYmUoKSBmb3IgNjQgYml0IHN5c3RlbXMgcmVwb3J0ZWQKKwkJCSAgIGJ5IDxiZWxsaW90dEBhY2Nlc3NvbmUuY29tPi4KKyAgICAgIDAuNTMzICAgOS1KYW4tOTggICAgRml4IG1vcmUgNjQgYml0IGJ1Z3MgcmVwb3J0ZWQgYnkgPGphbEBjcy5icm93bi5lZHU+LgorICAgICAgMC41MzQgIDI0LUphbi05OCAgICBGaXggbGFzdCAoPykgZW5kaWFuIGJ1ZyBmcm9tIDxnZWVydEBsaW51eC1tNjhrLm9yZz4KKyAgICAgIDAuNTM1ICAyMS1GZWItOTggICAgRml4IEV0aGVybmV0IEFkZHJlc3MgUFJPTSByZXNldCBidWcgZm9yIERDMjEwNDAuCisgICAgICAwLjUzNiAgMjEtTWFyLTk4ICAgIENoYW5nZSBwY2lfcHJvYmUoKSB0byB1c2UgdGhlIHBjaV9kZXYgc3RydWN0dXJlLgorCQkJICAqKkluY29tcGF0aWJsZSB3aXRoIDIuMC54IGZyb20gaGVyZS4qKgorICAgICAgMC41NDAgICA1LUp1bC05OCAgICBBdG9taWNpemUgYXNzZXJ0aW9uIG9mIGRldi0+aW50ZXJydXB0IGZvciBTTVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPGxtYUB2YXJlc2VhcmNoLmNvbT4KKwkJCSAgQWRkIFRQLCBBVUkgYW5kIEJOQyBjYXNlcyB0byAyMTE0MG1fYXV0b2NvbmYoKSBmb3IKKwkJCSAgIGNhc2Ugd2hlcmUgYSAyMTE0MCB1bmRlciBTUk9NIGNvbnRyb2wgdXNlcywgZS5nLiBBVUkKKwkJCSAgIGZyb20gcHJvYmxlbSByZXBvcnQgYnkgPGRlbGNoaW5pQGxwbnAwOS5pbjJwMy5mcj4KKwkJCSAgQWRkIE1JSSBwYXJhbGxlbCBkZXRlY3Rpb24gdG8gMjExNHhfYXV0b2NvbmYoKSBmb3IKKwkJCSAgIGNhc2Ugd2hlcmUgbm8gYXV0b25lZ290aWF0aW9uIHBhcnRuZXIgZXhpc3RzIGZyb20KKwkJCSAgIHByb2JsZW0gcmVwb3J0IGJ5IDxtbGFwc2xleUBuZGlyZWN0LmNvLnVrPi4KKwkJCSAgQWRkIGFiaWxpdHkgdG8gZm9yY2UgY29ubmVjdGlvbiB0eXBlIGRpcmVjdGx5IGV2ZW4KKwkJCSAgIHdoZW4gdXNpbmcgU1JPTSBjb250cm9sIGZyb20gcHJvYmxlbSByZXBvcnQgYnkKKwkJCSAgIDxlYXJsQGV4aXMubmV0Pi4KKwkJCSAgVXBkYXRlZCB0aGUgUENJIGludGVyZmFjZSB0byBjb25mb3JtIHdpdGggdGhlIGxhdGVzdAorCQkJICAgdmVyc2lvbi4gSSBob3BlIG5vdGhpbmcgaXMgYnJva2VuLi4uCisgICAgICAgICAgCQkgIEFkZCBUWCBkb25lIGludGVycnVwdCBtb2RpZmljYXRpb24gZnJvbSBzdWdnZXN0aW9uCisJCQkgICBieSA8QXVzdGluLkRvbm5lbGx5QGNsLmNhbS5hYy51az4uCisJCQkgIEZpeCBpc19hbmNfY2FwYWJsZSgpIGJ1ZyByZXBvcnRlZCBieSAKKwkJCSAgIDxBdXN0aW4uRG9ubmVsbHlAY2wuY2FtLmFjLnVrPi4KKwkJCSAgRml4IHR5cGVbMTNdX2luZm9ibG9jaygpIGJ1ZzogZHVyaW5nIE1JSSBzZWFyY2gsIFBIWQorCQkJICAgbHAtPnJzdCBub3QgcnVuIGJlY2F1c2UgbHAtPmlibiBub3QgaW5pdGlhbGlzZWQgLQorCQkJICAgZnJvbSByZXBvcnQgJiBmaXggYnkgPHBhdWJlcnRAaXJhbS5lcz4uCisJCQkgIEZpeCBwcm9iZSBidWcgd2l0aCBFSVNBICYgUENJIGNhcmRzIHByZXNlbnQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0IGJ5IDxlaXJpa0BuZXRjb20uY29tPi4KKyAgICAgIDAuNTQxICAyNC1BdWctOTggICAgRml4IGNvbXBpbGVyIHByb2JsZW1zIGFzc29jaWF0ZWQgd2l0aCBpMzg2LXN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BzIGZyb20gbXVsdGlwbGUgYnVnIHJlcG9ydHMgYW5kIHRlbXBvcmFyeSBmaXgKKwkJCSAgIGZyb20gPHBhdWJlcnRAaXJhbS5lcz4uCisJCQkgIEZpeCBwY2lfcHJvYmUoKSB0byBjb3JyZWN0bHkgZW11bGF0ZSB0aGUgb2xkCisJCQkgICBwY2liaW9zX2ZpbmRfY2xhc3MoKSBmdW5jdGlvbi4KKwkJCSAgQWRkIGFuX2V4Y2VwdGlvbigpIGZvciBvbGQgWllOWDM0NiBhbmQgZml4IGNvbXBpbGUKKwkJCSAgIHdhcm5pbmcgb24gUFBDICYgU1BBUkMsIGZyb20gPGVjZEBza3luZXQuYmU+LgorCQkJICBGaXggbGFzdFBDSSB0byBjb3JyZWN0bHkgd29yayB3aXRoIGNvbXBpbGVkIGluCisJCQkgICBrZXJuZWxzIGFuZCBtb2R1bGVzIGZyb20gYnVnIHJlcG9ydCBieSAKKwkJCSAgIDxabGF0a28uQ2FsdXNpY0BDQVJOZXQuaHI+IGV0IGFsLgorICAgICAgMC41NDIgIDE1LVNlcC05OCAgICBGaXggZGMyMTE0eF9hdXRvY29uZigpIHRvIHN0b3AgbXVsdGlwbGUgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbWVkaWEgaXMgdW5jb25uZWN0ZWQuCisJCQkgIENoYW5nZSBkZXYtPmludGVycnVwdCB0byBscC0+aW50ZXJydXB0IHRvIGVuc3VyZQorCQkJICAgYWxpZ25tZW50IGZvciBBbHBoYSdzIGFuZCBhdm9pZCB0aGVpciB1bmFsaWduZWQKKwkJCSAgIGFjY2VzcyB0cmFwcy4gVGhpcyBmbGFnIGlzIG1lcmVseSBmb3IgbG9nIG1lc3NhZ2VzOgorCQkJICAgc2hvdWxkIGRvIHNvbWV0aGluZyBtb3JlIGRlZmluaXRpdmUgdGhvdWdoLi4uCisgICAgICAwLjU0MyAgMzAtRGVjLTk4ICAgIEFkZCBTTVAgc3BpbiBsb2NraW5nLgorICAgICAgMC41NDQgICA4LU1heS05OSAgICBGaXggZm9yIGJ1Z2d5IFNST00gaW4gTW90b3JvbGEgZW1iZWRkZWQgYm9hcmRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIDIxMTQzIGJ5IDxtbXBvcnRlckBob21lLmNvbT4uCisJCQkgIENoYW5nZSBQQ0kvRUlTQSBidXMgcHJvYmluZyBvcmRlci4KKyAgICAgIDAuNTQ1ICAyOC1Ob3YtOTkgICAgRnVydGhlciBNb3RvIFNST00gYnVnIGZpeCBmcm9tIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1wb3J0ZXJAZW5nLm1jZC5tb3QuY29tPgorICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgZG91YmxlIGNoZWNraW5nIGZvciBERUJVR19SWCBpbiBkZTR4NV9kYmdfcngoKQorCQkJICAgZnJvbSByZXBvcnQgYnkgPGdlZXJ0QGxpbnV4LW02OGsub3JnPgorICAgICAgMC41NDYgIDIyLUZlYi0wMSAgICBGaXhlcyBBbHBoYSBYUDEwMDAgb29wcy4gIFRoZSBzcm9tX3NlYXJjaCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNhdXNpbmcgYSBwYWdlIGZhdWx0IHdoZW4gaW5pdGlhbGl6aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgJ3BiJywgb24gYSBub24gZGU0eDUgUENJIGRldmljZSwgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhIFBDSSBicmlkZ2UgKERFQyBjaGlwIDIxMTUyKS4gVGhlIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncGInIGlzIG5vdyBvbmx5IGluaXRpYWxpemVkIGlmIGEgZGU0eDUgY2hpcCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZnJhbmNlQGhhbmRoZWxkcy5vcmc+ICAKKyAgICAgIDAuNTQ3ICAwOC1Ob3YtMDEgICAgVXNlIGxpYnJhcnkgY3JjMzIgZnVuY3Rpb25zIGJ5IDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAgICAgIDAuNTQ4ICAzMC1BdWctMDMgICAgQmlnIDIuNiBjbGVhbnVwLiBQb3J0ZWQgdG8gUENJL0VJU0EgcHJvYmluZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgRE1BIEFQSXMuIEZpeGVkIERFNDI1IHN1cHBvcnQgb24gQWxwaGEuCisJCQkgICA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KKworI2luY2x1ZGUgImRlNHg1LmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0gImRlNHg1LmM6VjAuNTQ2IDIwMDEvMDIvMjIgZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb21cbiI7CisKKyNkZWZpbmUgY19jaGFyIGNvbnN0IGNoYXIKKyNkZWZpbmUgVFdJRERMRShhKSAodV9zaG9ydClsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1X3Nob3J0ICopKGEpKSkKKworLyoKKyoqIE1JSSBJbmZvcm1hdGlvbgorKi8KK3N0cnVjdCBwaHlfdGFibGUgeworICAgIGludCByZXNldDsgICAgICAgICAgICAgIC8qIEhhcmQgcmVzZXQgcmVxdWlyZWQ/ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgLyogSUVFRSBPVUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgdGE7ICAgICAgICAgICAgICAgICAvKiBPbmUgY3ljbGUgVEEgdGltZSAtIDgwMi4zdSBpcyBjb25mdXNpbmcgaGVyZSAqLworICAgIHN0cnVjdCB7ICAgICAgICAgICAgICAgIC8qIE5vbiBhdXRvbmVnb3RpYXRpb24gKHBhcmFsbGVsKSBzcGVlZCBkZXQuICAgICovCisJaW50IHJlZzsKKwlpbnQgbWFzazsKKwlpbnQgdmFsdWU7CisgICAgfSBzcGQ7Cit9OworCitzdHJ1Y3QgbWlpX3BoeSB7CisgICAgaW50IHJlc2V0OyAgICAgICAgICAgICAgLyogSGFyZCByZXNldCByZXF1aXJlZD8gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaWQ7ICAgICAgICAgICAgICAgICAvKiBJRUVFIE9VSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCB0YTsgICAgICAgICAgICAgICAgIC8qIE9uZSBjeWNsZSBUQSB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RydWN0IHsgICAgICAgICAgICAgICAgLyogTm9uIGF1dG9uZWdvdGlhdGlvbiAocGFyYWxsZWwpIHNwZWVkIGRldC4gKi8KKwlpbnQgcmVnOworCWludCBtYXNrOworCWludCB2YWx1ZTsKKyAgICB9IHNwZDsKKyAgICBpbnQgYWRkcjsgICAgICAgICAgICAgICAvKiBNSUkgYWRkcmVzcyBmb3IgdGhlIFBIWSAgICAgICAgICAgICAgICAgICAqLworICAgIHVfY2hhciAgKmdlcDsgICAgICAgICAgIC8qIFN0YXJ0IG9mIEdFUCBzZXF1ZW5jZSBibG9jayBpbiBTUk9NICAgICAgICovCisgICAgdV9jaGFyICAqcnN0OyAgICAgICAgICAgLyogU3RhcnQgb2YgcmVzZXQgc2VxdWVuY2UgaW4gU1JPTSAgICAgICAgICAgKi8KKyAgICB1X2ludCBtYzsgICAgICAgICAgICAgICAvKiBNZWRpYSBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVfaW50IGFuYTsgICAgICAgICAgICAgIC8qIE5XYXkgQWR2ZXJ0aXNlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdV9pbnQgZmR4OyAgICAgICAgICAgICAgLyogRnVsbCBEdXBsZVggY2FwYWJpbGl0ZXMgZm9yIGVhY2ggbWVkaWEgICAgKi8KKyAgICB1X2ludCB0dG07ICAgICAgICAgICAgICAvKiBUcmFuc21pdCBUaHJlc2hvbGQgTW9kZSBmb3IgZWFjaCBtZWRpYSAgICAqLworICAgIHVfaW50IG1jaTsgICAgICAgICAgICAgIC8qIDIxMTQyIE1JSSBDb25uZWN0b3IgSW50ZXJydXB0IGluZm8gICAgICAgICovCit9OworCisjZGVmaW5lIERFNFg1X01BWF9QSFkgOCAgICAgLyogQWxsb3cgdXB0byA4IGF0dGFjaGVkIFBIWSBkZXZpY2VzIHBlciBib2FyZCAqLworCitzdHJ1Y3Qgc2lhX3BoeSB7CisgICAgdV9jaGFyIG1jOyAgICAgICAgICAgICAgLyogTWVkaWEgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2NoYXIgZXh0OyAgICAgICAgICAgICAvKiBjc3IxMy0xNSB2YWxpZCB3aGVuIHNldCAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBjc3IxMzsgICAgICAgICAgICAgIC8qIFNJQSBDb25uZWN0aXZpdHkgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisgICAgaW50IGNzcjE0OyAgICAgICAgICAgICAgLyogU0lBIFRYL1JYIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgY3NyMTU7ICAgICAgICAgICAgICAvKiBTSUEgR2VuZXJhbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBnZXBjOyAgICAgICAgICAgICAgIC8qIFNJQSBHRVAgQ29udHJvbCBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICovCisgICAgaW50IGdlcDsgICAgICAgICAgICAgICAgLyogU0lBIEdFUCBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKKy8qCisqKiBEZWZpbmUgdGhlIGtub3cgdW5pdmVyc2Ugb2YgUEhZIGRldmljZXMgdGhhdCBjYW4gYmUKKyoqIHJlY29nbmlzZWQgYnkgdGhpcyBkcml2ZXIuCisqLworc3RhdGljIHN0cnVjdCBwaHlfdGFibGUgcGh5X2luZm9bXSA9IHsKKyAgICB7MCwgTkFUSU9OQUxfVFgsIDEsIHsweDE5LCAweDQwLCAweDAwfX0sICAgICAgIC8qIE5hdGlvbmFsIFRYICAgICAgKi8KKyAgICB7MSwgQlJPQURDT01fVDQsIDEsIHsweDEwLCAweDAyLCAweDAyfX0sICAgICAgIC8qIEJyb2FkY29tIFQ0ICAgICAgKi8KKyAgICB7MCwgU0VFUV9UNCAgICAsIDEsIHsweDEyLCAweDEwLCAweDEwfX0sICAgICAgIC8qIFNFRVEgVDQgICAgICAgICAgKi8KKyAgICB7MCwgQ1lQUkVTU19UNCAsIDEsIHsweDA1LCAweDIwLCAweDIwfX0sICAgICAgIC8qIEN5cHJlc3MgVDQgICAgICAgKi8KKyAgICB7MCwgMHg3ODEwICAgICAsIDEsIHsweDE0LCAweDA4MDAsIDB4MDgwMH19ICAgIC8qIExldmVsIE9uZSBMVFg5NzAgKi8KK307CisKKy8qCisqKiBUaGVzZSBHRU5FUklDIHZhbHVlcyBhc3N1bWVzIHRoYXQgdGhlIFBIWSBkZXZpY2VzIGZvbGxvdyA4MDIuM3UgYW5kCisqKiBhbGxvdyBwYXJhbGxlbCBkZXRlY3Rpb24gdG8gc2V0IHRoZSBsaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3Rlci4KKyoqIERldGVjdGlvbiBvZiAxMDBCYXNlLVRYIFtIL0YgRHVwbGV4XSBhbmQgMTAwQmFzZS1UNCBpcyBzdXBwb3J0ZWQuCisqLworI2RlZmluZSBHRU5FUklDX1JFRyAgIDB4MDUgICAgICAvKiBBdXRvbmVnLiBMaW5rIFBhcnRuZXIgQWR2ZXJ0aXNlbWVudCBSZWcuICovCisjZGVmaW5lIEdFTkVSSUNfTUFTSyAgTUlJX0FOTFBBXzEwME0gLyogQWxsIDEwME1iL3MgVGVjaG5vbG9naWVzICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0VORVJJQ19WQUxVRSBNSUlfQU5MUEFfMTAwTSAvKiAxMDBCLVRYLCAxMDBCLVRYIEZEWCwgMTAwQi1UNCAgICAgICAqLworCisvKgorKiogRGVmaW5lIHNwZWNpYWwgU1JPTSBkZXRlY3Rpb24gY2FzZXMKKyovCitzdGF0aWMgY19jaGFyIGVuZXRfZGV0W11bRVRIX0FMRU5dID0geworICAgIHsweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwfSwKKyAgICB7MHgwMCwgMHgwMCwgMHhlOCwgMHgwMCwgMHgwMCwgMHgwMH0KK307CisKKyNkZWZpbmUgU01DICAgIDEKKyNkZWZpbmUgQUNDVE9OIDIKKworLyoKKyoqIFNST00gUmVwYWlyIGRlZmluaXRpb25zLiBJZiBhIGJyb2tlbiBTUk9NIGlzIGRldGVjdGVkIGEgY2FyZCBtYXkKKyoqIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGhlbHAgZmlndXJlIG91dCB3aGF0IHRvIGRvLiBUaGlzIGlzIGEKKyoqICJzdGFiIGluIHRoZSBkYXJrIiBhbmQgc28gZmFyIGZvciBTTUM5MzMyJ3Mgb25seS4KKyovCitzdGF0aWMgY19jaGFyIHNyb21fcmVwYWlyX2luZm9bXVsxMDBdID0geworICAgIHsweDAwLDB4MWUsMHgwMCwweDAwLDB4MDAsMHgwOCwgICAgICAgICAgICAgLyogU01DOTMzMiAqLworICAgICAweDFmLDB4MDEsMHg4ZiwweDAxLDB4MDAsMHgwMSwweDAwLDB4MDIsCisgICAgIDB4MDEsMHgwMCwweDAwLDB4NzgsMHhlMCwweDAxLDB4MDAsMHg1MCwKKyAgICAgMHgwMCwweDE4LH0KK307CisKKworI2lmZGVmIERFNFg1X0RFQlVHCitzdGF0aWMgaW50IGRlNHg1X2RlYnVnID0gREU0WDVfREVCVUc7CisjZWxzZQorLypzdGF0aWMgaW50IGRlNHg1X2RlYnVnID0gKERFQlVHX01JSSB8IERFQlVHX1NST00gfCBERUJVR19QQ0lDRkcgfCBERUJVR19NRURJQSB8IERFQlVHX1ZFUlNJT04pOyovCitzdGF0aWMgaW50IGRlNHg1X2RlYnVnID0gKERFQlVHX01FRElBIHwgREVCVUdfVkVSU0lPTik7CisjZW5kaWYKKworLyoKKyoqIEFsbG93IHBlciBhZGFwdGVyIHNldCB1cC4gRm9yIG1vZHVsZXMgdGhpcyBpcyBzaW1wbHkgYSBjb21tYW5kIGxpbmUKKyoqIHBhcmFtZXRlciwgZS5nLjogCisqKiBpbnNtb2QgZGU0eDUgYXJncz0nZXRoMTpmZHggYXV0b3NlbnNlPUJOQyBldGgwOmF1dG9zZW5zZT0xMDBNYicuCisqKgorKiogRm9yIGEgY29tcGlsZWQgaW4gZHJpdmVyLCBwbGFjZSBlLmcuCisqKiAgICAgI2RlZmluZSBERTRYNV9QQVJNICJldGgwOmZkeCBhdXRvc2Vuc2U9QVVJIGV0aDI6YXV0b3NlbnNlPVRQIgorKiogaGVyZQorKi8KKyNpZmRlZiBERTRYNV9QQVJNCitzdGF0aWMgY2hhciAqYXJncyA9IERFNFg1X1BBUk07CisjZWxzZQorc3RhdGljIGNoYXIgKmFyZ3M7CisjZW5kaWYKKworc3RydWN0IHBhcmFtZXRlcnMgeworICAgIGludCBmZHg7CisgICAgaW50IGF1dG9zZW5zZTsKK307CisKKyNkZWZpbmUgREU0WDVfQVVUT1NFTlNFX01TIDI1MCAgICAgIC8qIG1zZWMgYXV0b3NlbnNlIHRpY2sgKERFNTAwKSAqLworCisjZGVmaW5lIERFNFg1X05EQSAweGZmZTAgICAgICAgICAgICAvKiBObyBEZXZpY2UgKEkvTykgQWRkcmVzcyAqLworCisvKgorKiogRXRoZXJuZXQgUFJPTSBkZWZpbmVzCisqLworI2RlZmluZSBQUk9CRV9MRU5HVEggICAgMzIKKyNkZWZpbmUgRVRIX1BST01fU0lHICAgIDB4QUE1NTAwRkZVTAorCisvKgorKiogRXRoZXJuZXQgSW5mbworKi8KKyNkZWZpbmUgUEtUX0JVRl9TWgkxNTM2ICAgICAgICAgICAgLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggVHgvUnggYnVmZmVyICovCisjZGVmaW5lIElFRUU4MDJfM19TWiAgICAxNTE4ICAgICAgICAgICAgLyogUGFja2V0ICsgQ1JDICovCisjZGVmaW5lIE1BWF9QS1RfU1ogICAJMTUxNCAgICAgICAgICAgIC8qIE1heGltdW0gZXRoZXJuZXQgcGFja2V0IGxlbmd0aCAqLworI2RlZmluZSBNQVhfREFUX1NaICAgCTE1MDAgICAgICAgICAgICAvKiBNYXhpbXVtIGV0aGVybmV0IGRhdGEgbGVuZ3RoICovCisjZGVmaW5lIE1JTl9EQVRfU1ogICAJMSAgICAgICAgICAgICAgIC8qIE1pbmltdW0gZXRoZXJuZXQgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgUEtUX0hEUl9MRU4gICAgIDE0ICAgICAgICAgICAgICAvKiBBZGRyZXNzZXMgYW5kIGRhdGEgbGVuZ3RoIGluZm8gKi8KKyNkZWZpbmUgRkFLRV9GUkFNRV9MRU4gIChNQVhfUEtUX1NaICsgMSkKKyNkZWZpbmUgUVVFVUVfUEtUX1RJTUVPVVQgKDMqSFopICAgICAgICAvKiAzIHNlY29uZCB0aW1lb3V0ICovCisKKworLyoKKyoqIEVJU0EgYnVzIGRlZmluZXMKKyovCisjZGVmaW5lIERFNFg1X0VJU0FfSU9fUE9SVFMgICAweDBjMDAgICAgLyogSS9PIHBvcnQgYmFzZSBhZGRyZXNzLCBzbG90IDAgKi8KKyNkZWZpbmUgREU0WDVfRUlTQV9UT1RBTF9TSVpFIDB4MTAwICAgICAvKiBJL08gYWRkcmVzcyBleHRlbnQgKi8KKworI2RlZmluZSBFSVNBX0FMTE9XRURfSVJRX0xJU1QgIHs1LCA5LCAxMCwgMTF9CisKKyNkZWZpbmUgREU0WDVfU0lHTkFUVVJFIHsiREU0MjUiLCJERTQzNCIsIkRFNDM1IiwiREU0NTAiLCJERTUwMCJ9CisjZGVmaW5lIERFNFg1X05BTUVfTEVOR1RIIDgKKworc3RhdGljIGNfY2hhciAqZGU0eDVfc2lnbmF0dXJlc1tdID0gREU0WDVfU0lHTkFUVVJFOworCisvKgorKiogRXRoZXJuZXQgUFJPTSBkZWZpbmVzIGZvciBEQzIxMDQwCisqLworI2RlZmluZSBQUk9CRV9MRU5HVEggICAgMzIKKyNkZWZpbmUgRVRIX1BST01fU0lHICAgIDB4QUE1NTAwRkZVTAorCisvKgorKiogUENJIEJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBQQ0lfTUFYX0JVU19OVU0gICAgICA4CisjZGVmaW5lIERFNFg1X1BDSV9UT1RBTF9TSVpFIDB4ODAgICAgICAgLyogSS9PIGFkZHJlc3MgZXh0ZW50ICovCisjZGVmaW5lIERFNFg1X0NMQVNTX0NPREUgICAgIDB4MDAwMjAwMDAgLyogTmV0d29yayBjb250cm9sbGVyLCBFdGhlcm5ldCAqLworCisvKgorKiogTWVtb3J5IEFsaWdubWVudC4gRWFjaCBkZXNjcmlwdG9yIGlzIDQgbG9uZ3dvcmRzIGxvbmcuIFRvIGZvcmNlIGEKKyoqIHBhcnRpY3VsYXIgYWxpZ25tZW50IG9uIHRoZSBUWCBkZXNjcmlwdG9yLCBhZGp1c3QgREVTQ19TS0lQX0xFTiBhbmQKKyoqIERFU0NfQUxJR04uIEFMSUdOIGFsaWducyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBtZW1vcnkgYXJlYQorKiogYW5kIGhlbmNlIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcncyBmaXJzdCBlbnRyeS4gCisqLworI2RlZmluZSBERTRYNV9BTElHTjQgICAgICAoKHVfbG9uZyk0IC0gMSkgICAgIC8qIDEgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR044ICAgICAgKCh1X2xvbmcpOCAtIDEpICAgICAvKiAyIGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIERFNFg1X0FMSUdOMTYgICAgICgodV9sb25nKTE2IC0gMSkgICAgLyogNCBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBERTRYNV9BTElHTjMyICAgICAoKHVfbG9uZykzMiAtIDEpICAgIC8qIDggbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR042NCAgICAgKCh1X2xvbmcpNjQgLSAxKSAgICAvKiAxNiBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBERTRYNV9BTElHTjEyOCAgICAoKHVfbG9uZykxMjggLSAxKSAgIC8qIDMyIGxvbmd3b3JkIGFsaWduICovCisKKyNkZWZpbmUgREU0WDVfQUxJR04gICAgICAgICBERTRYNV9BTElHTjMyICAgICAgICAgICAvKiBLZWVwIHRoZSBEQzIxMDQwIGhhcHB5Li4uICovCisjZGVmaW5lIERFNFg1X0NBQ0hFX0FMSUdOICAgQ0FMXzE2TE9ORworI2RlZmluZSBERVNDX1NLSVBfTEVOIERTTF8wICAgICAgICAgICAgIC8qIE11c3QgYWdyZWUgd2l0aCBERVNDX0FMSUdOICovCisvKiNkZWZpbmUgREVTQ19BTElHTiAgICB1MzIgZHVtbXlbNF07ICAvICogTXVzdCBhZ3JlZSB3aXRoIERFU0NfU0tJUF9MRU4gKi8KKyNkZWZpbmUgREVTQ19BTElHTgorCisjaWZuZGVmIERFQ19PTkxZICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIFJFQURNRS5kZTR4NSBmb3IgdXNpbmcgdGhpcyAqLworc3RhdGljIGludCBkZWNfb25seTsKKyNlbHNlCitzdGF0aWMgaW50IGRlY19vbmx5ID0gMTsKKyNlbmRpZgorCisvKgorKiogREU0WDUgSVJRIEVOQUJMRS9ESVNBQkxFCisqLworI2RlZmluZSBFTkFCTEVfSVJRcyB7IFwKKyAgICBpbXIgfD0gbHAtPmlycV9lbjtcCisgICAgb3V0bChpbXIsIERFNFg1X0lNUik7ICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIERJU0FCTEVfSVJRcyB7XAorICAgIGltciA9IGlubChERTRYNV9JTVIpO1wKKyAgICBpbXIgJj0gfmxwLT5pcnFfZW47XAorICAgIG91dGwoaW1yLCBERTRYNV9JTVIpOyAgICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIElSUXMgKi9cCit9CisKKyNkZWZpbmUgVU5NQVNLX0lSUXMge1wKKyAgICBpbXIgfD0gbHAtPmlycV9tYXNrO1wKKyAgICBvdXRsKGltciwgREU0WDVfSU1SKTsgICAgICAgICAgICAgICAvKiBVbm1hc2sgdGhlIElSUXMgKi9cCit9CisKKyNkZWZpbmUgTUFTS19JUlFzIHtcCisgICAgaW1yID0gaW5sKERFNFg1X0lNUik7XAorICAgIGltciAmPSB+bHAtPmlycV9tYXNrO1wKKyAgICBvdXRsKGltciwgREU0WDVfSU1SKTsgICAgICAgICAgICAgICAvKiBNYXNrIHRoZSBJUlFzICovXAorfQorCisvKgorKiogREU0WDUgU1RBUlQvU1RPUAorKi8KKyNkZWZpbmUgU1RBUlRfREU0WDUge1wKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKTtcCisgICAgb21yIHw9IE9NUl9TVCB8IE9NUl9TUjtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7ICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBUWCBhbmQvb3IgUlggKi9cCit9CisKKyNkZWZpbmUgU1RPUF9ERTRYNSB7XAorICAgIG9tciA9IGlubChERTRYNV9PTVIpO1wKKyAgICBvbXIgJj0gfihPTVJfU1R8T01SX1NSKTtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7ICAgICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgVFggYW5kL29yIFJYICovIFwKK30KKworLyoKKyoqIERFNFg1IFNJQSBSRVNFVAorKi8KKyNkZWZpbmUgUkVTRVRfU0lBIG91dGwoMCwgREU0WDVfU0lDUik7ICAvKiBSZXNldCBTSUEgY29ubmVjdGl2aXR5IHJlZ3MgKi8KKworLyoKKyoqIERFNTAwIEFVVE9TRU5TRSBUSU1FUiBJTlRFUlZBTCAoTUlMTElTRUNTKQorKi8KKyNkZWZpbmUgREU0WDVfQVVUT1NFTlNFX01TICAyNTAKKworLyoKKyoqIFNST00gU3RydWN0dXJlCisqLworc3RydWN0IGRlNHg1X3Nyb20geworICAgIGNoYXIgc3ViX3ZlbmRvcl9pZFsyXTsKKyAgICBjaGFyIHN1Yl9zeXN0ZW1faWRbMl07CisgICAgY2hhciByZXNlcnZlZFsxMl07CisgICAgY2hhciBpZF9ibG9ja19jcmM7CisgICAgY2hhciByZXNlcnZlZDI7CisgICAgY2hhciB2ZXJzaW9uOworICAgIGNoYXIgbnVtX2NvbnRyb2xsZXJzOworICAgIGNoYXIgaWVlZV9hZGRyWzZdOworICAgIGNoYXIgaW5mb1sxMDBdOworICAgIHNob3J0IGNoa3N1bTsKK307CisjZGVmaW5lIFNVQl9WRU5ET1JfSUQgMHg1MDBhCisKKy8qCisqKiBERTRYNSBEZXNjcmlwdG9ycy4gTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBSWCBidWZmZXJzIGFyZSBjb250aWd1b3VzCisqKiBhbmQgaGF2ZSBzaXplcyBvZiBib3RoIGEgcG93ZXIgb2YgMiBhbmQgYSBtdWx0aXBsZSBvZiA0LgorKiogQSBzaXplIG9mIDI1NiBieXRlcyBmb3IgZWFjaCBidWZmZXIgY291bGQgYmUgY2hvc2VuIGJlY2F1c2Ugb3ZlciA5MCUgb2YKKyoqIGFsbCBwYWNrZXRzIGluIG91ciBuZXR3b3JrIGFyZSA8MjU2IGJ5dGVzIGxvbmcgYW5kIDY0IGxvbmd3b3JkIGFsaWdubWVudAorKiogaXMgcG9zc2libGUuIDE1MzYgc2hvd2VkIGJldHRlciAndHRjcCcgcGVyZm9ybWFuY2UuIFRha2UgeW91ciBwaWNrLiAzMiBUWAorKiogZGVzY3JpcHRvcnMgYXJlIG5lZWRlZCBmb3IgbWFjaGluZXMgd2l0aCBhbiBBTFBIQSBDUFUuCisqLworI2RlZmluZSBOVU1fUlhfREVTQyA4ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAgICovCisjZGVmaW5lIE5VTV9UWF9ERVNDIDMyICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFRYIGRlc2NyaXB0b3JzICAgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWiAgMTUzNiAgICAgICAgICAgICAgICAvKiBQb3dlciBvZiAyIGZvciBrbWFsbG9jIGFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE11bHRpcGxlIG9mIDQgZm9yIERDMjEwNDAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3dzIDUxMiBieXRlIGFsaWdubWVudCAgKi8KK3N0cnVjdCBkZTR4NV9kZXNjIHsKKyAgICB2b2xhdGlsZSBzMzIgc3RhdHVzOworICAgIHUzMiBkZXMxOworICAgIHUzMiBidWY7CisgICAgdTMyIG5leHQ7CisgICAgREVTQ19BTElHTgorfTsKKworLyoKKyoqIFRoZSBERTRYNSBwcml2YXRlIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgREU0WDVfUEtUX1NUQVRfU1ogMTYKKyNkZWZpbmUgREU0WDVfUEtUX0JJTl9TWiAgMTI4ICAgICAgICAgICAgLyogU2hvdWxkIGJlID49MTAwIHVubGVzcyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2UgREU0WDVfUEtUX1NUQVRfU1ogKi8KKworc3RydWN0IHBrdF9zdGF0cyB7CisJdV9pbnQgYmluc1tERTRYNV9QS1RfU1RBVF9TWl07ICAgICAgLyogUHJpdmF0ZSBzdGF0cyBjb3VudGVycyAgICAgICAqLworCXVfaW50IHVuaWNhc3Q7CisJdV9pbnQgbXVsdGljYXN0OworCXVfaW50IGJyb2FkY2FzdDsKKwl1X2ludCBleGNlc3NpdmVfY29sbGlzaW9uczsKKwl1X2ludCB0eF91bmRlcnJ1bnM7CisJdV9pbnQgZXhjZXNzaXZlX3VuZGVycnVuczsKKwl1X2ludCByeF9ydW50X2ZyYW1lczsKKwl1X2ludCByeF9jb2xsaXNpb247CisJdV9pbnQgcnhfZHJpYmJsZTsKKwl1X2ludCByeF9vdmVyZmxvdzsKK307CisKK3N0cnVjdCBkZTR4NV9wcml2YXRlIHsKKyAgICBjaGFyIGFkYXB0ZXJfbmFtZVs4MF07ICAgICAgICAgICAgICAgICAgLyogQWRhcHRlciBuYW1lICAgICAgICAgICAgICAgICAqLworICAgIHVfbG9uZyBpbnRlcnJ1cHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlnbmVkIElTUiBmbGFnICAgICAgICAgICAgICovCisgICAgc3RydWN0IGRlNHg1X2Rlc2MgKnJ4X3Jpbmc7CQkgICAgLyogUlggZGVzY3JpcHRvciByaW5nICAgICAgICAgICAqLworICAgIHN0cnVjdCBkZTR4NV9kZXNjICp0eF9yaW5nOwkJICAgIC8qIFRYIGRlc2NyaXB0b3IgcmluZyAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiW05VTV9UWF9ERVNDXTsgICAgLyogVFggc2tiIGZvciBmcmVlaW5nIHdoZW4gc2VudCAqLworICAgIHN0cnVjdCBza19idWZmICpyeF9za2JbTlVNX1JYX0RFU0NdOyAgICAvKiBSWCBza2IncyAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IHJ4X25ldywgcnhfb2xkOyAgICAgICAgICAgICAgICAgICAgIC8qIFJYIGRlc2NyaXB0b3IgcmluZyBwb2ludGVycyAgKi8KKyAgICBpbnQgdHhfbmV3LCB0eF9vbGQ7ICAgICAgICAgICAgICAgICAgICAgLyogVFggZGVzY3JpcHRvciByaW5nIHBvaW50ZXJzICAqLworICAgIGNoYXIgc2V0dXBfZnJhbWVbU0VUVVBfRlJBTUVfTEVOXTsgICAgICAvKiBIb2xkcyBNQ0EgYW5kIFBBIGluZm8uICAgICAgICovCisgICAgY2hhciBmcmFtZVs2NF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1pbiBzaXplZCBwYWNrZXQgZm9yIGxvb3BiYWNrKi8KKyAgICBzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRhcHRlciBzcGVjaWZpYyBzcGlubG9jayAgICAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOyAgICAgICAgICAvKiBQdWJsaWMgc3RhdHMgICAgICAgICAgICAgICAgICovCisgICAgc3RydWN0IHBrdF9zdGF0cyBwa3RTdGF0czsJICAgICAgICAgICAgLyogUHJpdmF0ZSBzdGF0cyBjb3VudGVycwkgICAgKi8KKyAgICBjaGFyIHJ4UmluZ1NpemU7CisgICAgY2hhciB0eFJpbmdTaXplOworICAgIGludCAgYnVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFSVNBIG9yIFBDSSAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICBidXNfbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDSSBCdXMgbnVtYmVyICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgIGRldmljZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV2aWNlIG51bWJlciBvbiBQQ0kgYnVzICAgICAqLworICAgIGludCAgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGFwdGVyIE9QRU5FRCBvciBDTE9TRUQgICAgICovCisgICAgaW50ICBjaGlwc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERDMjEwNDAsIERDMjEwNDEgb3IgREMyMTE0MCAgKi8KKyAgICBzMzIgIGlycV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IE1hc2sgKEVuYWJsZSkgYml0cyAqLworICAgIHMzMiAgaXJxX2VuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdW1tYXJ5IGludGVycnVwdCBiaXRzICAgICAgICovCisgICAgaW50ICBtZWRpYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lZGlhIChlZyBUUCksIG1vZGUgKGVnIDEwMEIpKi8KKyAgICBpbnQgIGNfbWVkaWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIGxhc3QgbWVkaWEgY29ubiAqLworICAgIGludCAgZmR4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZWRpYSBmdWxsIGR1cGxleCBmbGFnICAgICAgICovCisgICAgaW50ICBsaW5rT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgaXMgT0sgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgIGF1dG9zZW5zZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3cvZGlzYWxsb3cgYXV0b3NlbnNpbmcgICAqLworICAgIGludCAgdHhfZW5hYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgZGVzY3JpcHRvciBwb2xsaW5nICAgICovCisgICAgaW50ICBzZXR1cF9mOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldHVwIGZyYW1lIGZpbHRlcmluZyB0eXBlICAgKi8KKyAgICBpbnQgIGxvY2FsX3N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdGUgd2l0aGluIGEgJ21lZGlhJyBzdGF0ZSAqLworICAgIHN0cnVjdCBtaWlfcGh5IHBoeVtERTRYNV9NQVhfUEhZXTsgICAgICAvKiBMaXN0IG9mIGF0dGFjaGVkIFBIWSBkZXZpY2VzICovCisgICAgc3RydWN0IHNpYV9waHkgc2lhOyAgICAgICAgICAgICAgICAgICAgIC8qIFNJQSBQSFkgSW5mb3JtYXRpb24gICAgICAgICAgKi8KKyAgICBpbnQgIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5kZXggdG8gYWN0aXZlIFBIWSBkZXZpY2UgICAqLworICAgIGludCAgbWlpX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYXR0YWNoZWQgUEhZJ3MgICAgICovCisgICAgaW50ICB0aW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjaGVkdWxpbmcgY291bnRlciAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsgICAgICAgICAgICAgICAgLyogVGltZXIgaW5mbyBmb3Iga2VybmVsICAgICAgICAqLworICAgIGludCB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgZ2xvYmFsIHBlciBjYXJkICAgICovCisgICAgc3RydWN0IHsKKwl1X2xvbmcgbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2NrIHRoZSBjYWNoZSBhY2Nlc3NlcyAgICAgICovCisJczMyIGNzcjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgQnVzIE1vZGUgUmVnaXN0ZXIgICAgICAqLworCXMzMiBjc3I2OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIE9wZXJhdGluZyBNb2RlIFJlZy4gICAgKi8KKwlzMzIgY3NyNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBJUlEgTWFzayBSZWdpc3RlciAgICAgICovCisJczMyIGdlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgR2VuZXJhbCBQdXJwb3NlIFJlZy4gICAqLworCXMzMiBnZXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgaW5mbyBmb3IgR0VQICAgICAgICAgKi8KKwlzMzIgY3NyMTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBTSUEgQ29ubmVjdGl2aXR5IFJlZy4gICovCisJczMyIGNzcjE0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgU0lBIFRYL1JYIFJlZ2lzdGVyICAgICAqLworCXMzMiBjc3IxNTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIFNJQSBHZW5lcmFsIFJlZ2lzdGVyICAgKi8KKwlpbnQgc2F2ZV9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGlmIHN0YXRlIGFscmVhZHkgc2F2ZWQgICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgKHJlLW9yZGVyZWQpIHNrYidzICAqLworICAgIH0gY2FjaGU7CisgICAgc3RydWN0IGRlNHg1X3Nyb20gc3JvbTsgICAgICAgICAgICAgICAgIC8qIEEgY29weSBvZiB0aGUgU1JPTSAgICAgICAgICAgKi8KKyAgICBpbnQgY2ZydjsJCQkJICAgIC8qIENhcmQgQ0ZSViBjb3B5ICovCisgICAgaW50IHJ4X292ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciAnUlggb3ZlcmZsb3cnIHRhZyAgKi8KKyAgICBpbnQgdXNlU1JPTTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIG5vbi1ERUMgY2FyZCB1c2UgU1JPTSAgICAqLworICAgIGludCB1c2VNSUk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmZvYmxvY2sgdXNpbmcgdGhlIE1JSSAgICAgICovCisgICAgaW50IGFzQml0VmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG9zZW5zZSBiaXRzIGluIEdFUD8gICAgICAgKi8KKyAgICBpbnQgYXNQb2xhcml0eTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9PiBhc3NlcnRlZCBoaWdoICAgICAgICAgICAqLworICAgIGludCBhc0JpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvc2Vuc2UgYml0IG51bWJlciBpbiBHRVAgICovCisgICAgaW50IGRlZk1lZGl1bTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNST00gZGVmYXVsdCBtZWRpdW0gICAgICAgICAgKi8KKyAgICBpbnQgdGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBpbmZvYmxvY2sgbnVtYmVyICAgICAgICAqLworICAgIGludCBpbmZvYmxvY2tfaW5pdDsgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlZCB0aGlzIGluZm9ibG9jaz8gICovCisgICAgaW50IGluZm9sZWFmX29mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIFNST00gaW5mb2xlYWYgZm9yIGNvbnRyb2xsZXIgKi8KKyAgICBzMzIgaW5mb2Jsb2NrX2NzcjY7ICAgICAgICAgICAgICAgICAgICAgLyogY3NyNiB2YWx1ZSBpbiBTUk9NIGluZm9ibG9jayAqLworICAgIGludCBpbmZvYmxvY2tfbWVkaWE7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZvYmxvY2sgbWVkaWEgICAgICAgICAgICAgICovCisgICAgaW50ICgqaW5mb2xlYWZfZm4pKHN0cnVjdCBuZXRfZGV2aWNlICopOyAgICAvKiBQb2ludGVyIHRvIGluZm9sZWFmIGZ1bmN0aW9uICovCisgICAgdV9jaGFyICpyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gVHlwZSA1IHJlc2V0IGluZm8gKi8KKyAgICB1X2NoYXIgIGlibjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5mb2Jsb2NrIG51bWJlciAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBwYXJhbWV0ZXJzIHBhcmFtczsgICAgICAgICAgICAgICAvKiBDb21tYW5kIGxpbmUvICNkZWZpbmVkIHBhcmFtcyAqLworICAgIHN0cnVjdCBkZXZpY2UgKmdlbmRldjsJICAgICAgICAgICAgLyogR2VuZXJpYyBkZXZpY2UgKi8KKyAgICBkbWFfYWRkcl90IGRtYV9yaW5nczsJCSAgICAvKiBETUEgaGFuZGxlIGZvciByaW5ncwkgICAgKi8KKyAgICBpbnQgZG1hX3NpemU7CQkJICAgIC8qIFNpemUgb2YgdGhlIERNQSBhcmVhCSAgICAqLworICAgIGNoYXIgKnJ4X2J1ZnM7CQkJICAgIC8qIHJ4IGJ1ZnMgb24gYWxwaGEsIHNwYXJjLCAuLi4gKi8KK307CisKKy8qCisqKiBUbyBnZXQgYXJvdW5kIGNlcnRhaW4gcG94eSBjYXJkcyB0aGF0IGRvbid0IHByb3ZpZGUgYW4gU1JPTQorKiogZm9yIHRoZSBzZWNvbmQgYW5kIG1vcmUgREVDY2hpcCwgSSBoYXZlIHRvIGtleSBvZmYgdGhlIGZpcnN0CisqKiBjaGlwJ3MgYWRkcmVzcy4gSSdsbCBhc3N1bWUgdGhlcmUncyBub3QgYSBiYWQgU1JPTSBpZmY6CisqKgorKiogICAgICBvIHRoZSBjaGlwc2V0IGlzIHRoZSBzYW1lCisqKiAgICAgIG8gdGhlIGJ1cyBudW1iZXIgaXMgdGhlIHNhbWUgYW5kID4gMAorKiogICAgICBvIHRoZSBzdW0gb2YgYWxsIHRoZSByZXR1cm5lZCBodyBhZGRyZXNzIGJ5dGVzIGlzIDAgb3IgMHg1ZmEKKyoqCisqKiBBbHNvIGhhdmUgdG8gc2F2ZSB0aGUgaXJxIGZvciB0aG9zZSBjYXJkcyB3aG9zZSBoYXJkd2FyZSBkZXNpZ25lcnMKKyoqIGNhbid0IGZvbGxvdyB0aGUgUENJIHRvIFBDSSBCcmlkZ2UgQXJjaGl0ZWN0dXJlIHNwZWMuCisqLworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IGNoaXBzZXQ7CisgICAgaW50IGJ1czsKKyAgICBpbnQgaXJxOworICAgIHVfY2hhciBhZGRyW0VUSF9BTEVOXTsKK30gbGFzdCA9IHswLH07CisKKy8qCisqKiBUaGUgdHJhbnNtaXQgcmluZyBmdWxsIGNvbmRpdGlvbiBpcyBkZXNjcmliZWQgYnkgdGhlIHR4X29sZCBhbmQgdHhfbmV3CisqKiBwb2ludGVycyBieToKKyoqICAgIHR4X29sZCAgICAgICAgICAgID0gdHhfbmV3ICAgIEVtcHR5IHJpbmcKKyoqICAgIHR4X29sZCAgICAgICAgICAgID0gdHhfbmV3KzEgIEZ1bGwgcmluZworKiogICAgdHhfb2xkK3R4UmluZ1NpemUgPSB0eF9uZXcrMSAgRnVsbCByaW5nICAod3JhcHBlZCBjb25kaXRpb24pCisqLworI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKKwkJCWxwLT50eF9vbGQrbHAtPnR4UmluZ1NpemUtbHAtPnR4X25ldy0xOlwKKwkJCWxwLT50eF9vbGQgICAgICAgICAgICAgICAtbHAtPnR4X25ldy0xKQorCisjZGVmaW5lIFRYX1BLVF9QRU5ESU5HIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpCisKKy8qCisqKiBQdWJsaWMgRnVuY3Rpb25zCisqLworc3RhdGljIGludCAgICAgZGU0eDVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3F1ZXVlX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkZTR4NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50ICAgICBkZTR4NV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgIG5ldF9kZXZpY2Vfc3RhdHMgKmRlNHg1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2xvY2FsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBrdF9sZW4pOworc3RhdGljIHZvaWQgICAgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CisKKy8qCisqKiBQcml2YXRlIGZ1bmN0aW9ucworKi8KK3N0YXRpYyBpbnQgICAgIGRlNHg1X2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSwgc3RydWN0IGRldmljZSAqZ2VuZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9zd19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV90eHVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfcnhfb3ZmYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCAgICAgYXV0b2NvbmZfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBjcmVhdGVfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmZyYW1lLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkICAgIGxvYWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgdTMyIGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgICAgIGRjMjEwNDBfYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkYzIxMDQxX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0MG1fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkYzIxMTR4X2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgc3JvbV9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3N1c3BlY3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRpbWVvdXQsIGludCBwcmV2X3N0YXRlLCBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KSwgaW50ICgqYXNmbikoc3RydWN0IG5ldF9kZXZpY2UgKikpOworc3RhdGljIGludCAgICAgZGMyMTA0MF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyMTMsIGludCBjc3IxNCwgaW50IGNzcjE1LCBpbnQgdGltZW91dCwgaW50IG5leHRfc3RhdGUsIGludCBzdXNwZWN0X3N0YXRlLCBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KSk7CitzdGF0aWMgaW50ICAgICB0ZXN0X21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBpcnFzLCBzMzIgaXJxX21hc2ssIHMzMiBjc3IxMywgczMyIGNzcjE0LCBzMzIgY3NyMTUsIHMzMiBtc2VjKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfZm9yXzEwME1iKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtc2VjKTsKK3N0YXRpYyBpbnQgICAgIHdhaXRfZm9yX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICB0ZXN0X21paV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlZywgaW50IG1hc2ssIGludCBwb2wsIGxvbmcgbXNlYyk7CitzdGF0aWMgaW50ICAgICBpc19zcGRfMTAwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgaXNfMTAwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgaXNfMTBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBpc19hbmNfY2FwYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHBpbmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1zZWMpOworc3RhdGljIHN0cnVjdCBza19idWZmICpkZTR4NV9hbGxvY19yeF9idWZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmRleCwgaW50IGxlbik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfZnJlZV90eF9idWZmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3NhdmVfc2ticyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3JzdF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9jYWNoZV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmxhZyk7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9wdXRfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9wdXRiX2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCAgc2tfYnVmZiAqZGU0eDVfZ2V0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfc2V0dXBfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3Jlc2V0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHJlc2V0X2luaXRfc2lhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBzaWNyLCBzMzIgc3RyciwgczMyIHNpZ3IpOworc3RhdGljIGludCAgICAgdGVzdF9hbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGlycXMsIHMzMiBpcnFfbWFzaywgczMyIG1zZWMpOworc3RhdGljIGludCAgICAgdGVzdF90cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgbXNlYyk7CitzdGF0aWMgaW50ICAgICBFSVNBX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCAgICAgUENJX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHApOworc3RhdGljIHZvaWQgICAgRGV2aWNlUHJlc2VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlKTsKK3N0YXRpYyB2b2lkICAgIGVuZXRfYWRkcl9yc3QodV9sb25nIGFwcm9tX2FkZHIpOworc3RhdGljIGludCAgICAgZGU0eDVfYmFkX3Nyb20oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKTsKK3N0YXRpYyBzaG9ydCAgIHNyb21fcmQodV9sb25nIGFkZHJlc3MsIHVfY2hhciBvZmZzZXQpOworc3RhdGljIHZvaWQgICAgc3JvbV9sYXRjaCh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcmVzcyk7CitzdGF0aWMgdm9pZCAgICBzcm9tX2NvbW1hbmQodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOworc3RhdGljIHZvaWQgICAgc3JvbV9hZGRyZXNzKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyZXNzLCB1X2NoYXIgb2Zmc2V0KTsKK3N0YXRpYyBzaG9ydCAgIHNyb21fZGF0YSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcmVzcyk7CisvKnN0YXRpYyB2b2lkICAgIHNyb21fYnVzeSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcmVzcyk7Ki8KK3N0YXRpYyB2b2lkICAgIHNlbmR0b19zcm9tKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKTsKK3N0YXRpYyBpbnQgICAgIGdldGZyb21fc3JvbSh1X2xvbmcgYWRkcik7CitzdGF0aWMgaW50ICAgICBzcm9tX21hcF9tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHNyb21faW5mb2xlYWZfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHNyb21faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHNyb21fZXhlYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgbWlpX3JkKHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIG1paV93cihpbnQgZGF0YSwgdV9jaGFyIHBoeXJlZywgdV9jaGFyIHBoeWFkZHIsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCAgICAgbWlpX3JkYXRhKHVfbG9uZyBpb2FkZHIpOworc3RhdGljIHZvaWQgICAgbWlpX3dkYXRhKGludCBkYXRhLCBpbnQgbGVuLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIG1paV90YSh1X2xvbmcgcncsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCAgICAgbWlpX3N3YXAoaW50IGRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQgICAgbWlpX2FkZHJlc3ModV9jaGFyIGFkZHIsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIHZvaWQgICAgc2VuZHRvX21paSh1MzIgY29tbWFuZCwgaW50IGRhdGEsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCAgICAgZ2V0ZnJvbV9taWkodTMyIGNvbW1hbmQsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCAgICAgbWlpX2dldF9vdWkodV9jaGFyIHBoeWFkZHIsIHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCAgICAgbWlpX2dldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBTZXRNdWx0aWNhc3RGaWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHNyb21fcmVwYWlyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjYXJkKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfYmFkX2VuZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cyk7CitzdGF0aWMgaW50ICAgICBhbl9leGNlcHRpb24oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKTsKK3N0YXRpYyBjaGFyICAgICpidWlsZF9zZXR1cF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCAgICBkaXNhYmxlX2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGVuYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRpbWVfb3V0KTsKK3N0YXRpYyBsb25nICAgIGRlNHg1X3N3aXRjaF9tYWNfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGdlcF9yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGdlcF93cihzMzIgZGF0YSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICB0aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKCpmbikodV9sb25nIGRhdGEpLCB1X2xvbmcgZGF0YSwgdV9sb25nIG1zZWMpOworc3RhdGljIHZvaWQgICAgeWF3bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQgICAgZGU0eDVfcGFyc2VfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfZGJnX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBrKTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2RiZ19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2RiZ19zcm9tKHN0cnVjdCBkZTR4NV9zcm9tICpwKTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2RiZ19yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3N0cm5jbXAoY2hhciAqYSwgY2hhciAqYiwgaW50IG4pOworc3RhdGljIGludCAgICAgZGMyMTA0MV9pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRjMjExNDBfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkYzIxMTQyX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0M19pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHR5cGUwX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICB0eXBlMV9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTJfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIHR5cGUzX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICB0eXBlNF9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTVfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIGNvbXBhY3RfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKKworLyoKKyoqIE5vdGUgbm93IHRoYXQgbW9kdWxlIGF1dG9wcm9iaW5nIGlzIGFsbG93ZWQgdW5kZXIgRUlTQSBhbmQgUENJLiBUaGUKKyoqIElSUSBsaW5lcyB3aWxsIG5vdCBiZSBhdXRvLWRldGVjdGVkOyBpbnN0ZWFkIEknbGwgcmVseSBvbiB0aGUgQklPU2VzCisqKiB0byAiZG8gdGhlIHJpZ2h0IHRoaW5nIi4KKyovCisKK3N0YXRpYyBpbnQgaW89MHgwOy8qIEVESVQgVEhJUyBMSU5FIEZPUiBZT1VSIENPTkZJR1VSQVRJT04gSUYgTkVFREVEICAgICAgICAqLworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGU0eDVfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVjX29ubHksIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYXJncywgY2hhcnAsIDApOworCitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiZGU0eDUgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhkZTR4NV9kZWJ1ZywgImRlNHg1IGRlYnVnIG1hc2siKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjX29ubHksICJkZTR4NSBwcm9iZSBvbmx5IGZvciBEaWdpdGFsIGJvYXJkcyAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhhcmdzLCAiZGU0eDUgZnVsbCBkdXBsZXggYW5kIG1lZGlhIHR5cGUgc2V0dGluZ3M7IHNlZSBkZTR4NS5jIGZvciBkZXRhaWxzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisqKiBMaXN0IHRoZSBTUk9NIGluZm9sZWFmIGZ1bmN0aW9ucyBhbmQgY2hpcHNldHMKKyovCitzdHJ1Y3QgSW5mb0xlYWYgeworICAgIGludCBjaGlwc2V0OworICAgIGludCAoKmZuKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK307CitzdGF0aWMgc3RydWN0IEluZm9MZWFmIGluZm9sZWFmX2FycmF5W10gPSB7CisgICAge0RDMjEwNDEsIGRjMjEwNDFfaW5mb2xlYWZ9LAorICAgIHtEQzIxMTQwLCBkYzIxMTQwX2luZm9sZWFmfSwKKyAgICB7REMyMTE0MiwgZGMyMTE0Ml9pbmZvbGVhZn0sCisgICAge0RDMjExNDMsIGRjMjExNDNfaW5mb2xlYWZ9Cit9OworI2RlZmluZSBJTkZPTEVBRl9TSVpFIChzaXplb2YoaW5mb2xlYWZfYXJyYXkpLyhzaXplb2YoaW50KStzaXplb2YoaW50ICopKSkKKworLyoKKyoqIExpc3QgdGhlIFNST00gaW5mbyBibG9jayBmdW5jdGlvbnMKKyovCitzdGF0aWMgaW50ICgqZGNfaW5mb2Jsb2NrW10pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciwgdV9jaGFyICopID0geworICAgIHR5cGUwX2luZm9ibG9jaywKKyAgICB0eXBlMV9pbmZvYmxvY2ssCisgICAgdHlwZTJfaW5mb2Jsb2NrLAorICAgIHR5cGUzX2luZm9ibG9jaywKKyAgICB0eXBlNF9pbmZvYmxvY2ssCisgICAgdHlwZTVfaW5mb2Jsb2NrLAorICAgIGNvbXBhY3RfaW5mb2Jsb2NrCit9OworCisjZGVmaW5lIENPTVBBQ1QgKHNpemVvZihkY19pbmZvYmxvY2spL3NpemVvZihpbnQgKikgLSAxKQorCisvKgorKiogTWlzY2VsbGFuZW91cyBkZWZpbmVzLi4uCisqLworI2RlZmluZSBSRVNFVF9ERTRYNSB7XAorICAgIGludCBpO1wKKyAgICBpPWlubChERTRYNV9CTVIpO1wKKyAgICBtZGVsYXkoMSk7XAorICAgIG91dGwoaSB8IEJNUl9TV1IsIERFNFg1X0JNUik7XAorICAgIG1kZWxheSgxKTtcCisgICAgb3V0bChpLCBERTRYNV9CTVIpO1wKKyAgICBtZGVsYXkoMSk7XAorICAgIGZvciAoaT0wO2k8NTtpKyspIHtpbmwoREU0WDVfQk1SKTsgbWRlbGF5KDEpO31cCisgICAgbWRlbGF5KDEpO1wKK30KKworI2RlZmluZSBQSFlfSEFSRF9SRVNFVCB7XAorICAgIG91dGwoR0VQX0hSU1QsIERFNFg1X0dFUCk7ICAgICAgICAgICAvKiBIYXJkIFJFU0VUIHRoZSBQSFkgZGV2LiAqL1wKKyAgICBtZGVsYXkoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzZXJ0IGZvciAxbXMgKi9cCisgICAgb3V0bCgweDAwLCBERTRYNV9HRVApO1wKKyAgICBtZGVsYXkoMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgMm1zICovXAorfQorCisMCitzdGF0aWMgaW50IF9fZGV2aW5pdCAKK2RlNHg1X2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSwgc3RydWN0IGRldmljZSAqZ2VuZGV2KQoreworICAgIGNoYXIgbmFtZVtERTRYNV9OQU1FX0xFTkdUSCArIDFdOworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworICAgIGludCBpLCBzdGF0dXM9MDsKKworICAgIGdlbmRldi0+ZHJpdmVyX2RhdGEgPSBkZXY7CisKKyAgICAvKiBFbnN1cmUgd2UncmUgbm90IHNsZWVwaW5nICovCisgICAgaWYgKGxwLT5idXMgPT0gRUlTQSkgeworCW91dGIoV0FLRVVQLCBQQ0lfQ0ZQTSk7CisgICAgfSBlbHNlIHsKKwlwZGV2ID0gdG9fcGNpX2RldiAoZ2VuZGV2KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGREFfUFNNLCBXQUtFVVApOworICAgIH0KKyAgICBtZGVsYXkoMTApOworCisgICAgUkVTRVRfREU0WDU7CisgICAgCisgICAgaWYgKChpbmwoREU0WDVfU1RTKSAmIChTVFNfVFMgfCBTVFNfUlMpKSAhPSAwKSB7CisJcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcmR3YXJlIGNvdWxkIG5vdCByZXNldCAqLworICAgIH0KKyAgICAKKyAgICAvKiAKKyAgICAqKiBOb3cgZmluZCBvdXQgd2hhdCBraW5kIG9mIERDMjEwNDAvREMyMTA0MS9EQzIxMTQwIGJvYXJkIHdlIGhhdmUuCisgICAgKi8KKyAgICBscC0+dXNlU1JPTSA9IEZBTFNFOworICAgIGlmIChscC0+YnVzID09IFBDSSkgeworCVBDSV9zaWduYXR1cmUobmFtZSwgbHApOworICAgIH0gZWxzZSB7CisJRUlTQV9zaWduYXR1cmUobmFtZSwgZ2VuZGV2KTsKKyAgICB9CisgICAgCisgICAgaWYgKCpuYW1lID09ICdcMCcpIHsgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgZm91bmQgYSBib2FyZCBzaWduYXR1cmUgKi8KKwlyZXR1cm4gLUVOWElPOworICAgIH0KKyAgICAKKyAgICBkZXYtPmJhc2VfYWRkciA9IGlvYmFzZTsKKyAgICBwcmludGsgKCIlczogJXMgYXQgMHglMDRseCIsIGdlbmRldi0+YnVzX2lkLCBuYW1lLCBpb2Jhc2UpOworICAgIAorICAgIHByaW50aygiLCBoL3cgYWRkcmVzcyAiKTsKKyAgICBzdGF0dXMgPSBnZXRfaHdfYWRkcihkZXYpOworICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAtIDE7IGkrKykgeyAgICAgLyogZ2V0IHRoZSBldGhlcm5ldCBhZGRyLiAqLworCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgfQorICAgIHByaW50aygiJTIuMngsXG4iLCBkZXYtPmRldl9hZGRyW2ldKTsKKyAgICAKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKwlwcmludGsoIiAgICAgIHdoaWNoIGhhcyBhbiBFdGhlcm5ldCBQUk9NIENSQyBlcnJvci5cbiIpOworCXJldHVybiAtRU5YSU87CisgICAgfSBlbHNlIHsKKwlscC0+Y2FjaGUuZ2VwYyA9IEdFUF9JTklUOworCWxwLT5hc0JpdCA9IEdFUF9TTE5LOworCWxwLT5hc1BvbGFyaXR5ID0gR0VQX1NMTks7CisJbHAtPmFzQml0VmFsaWQgPSBUUlVFOworCWxwLT50aW1lb3V0ID0gLTE7CisJbHAtPmdlbmRldiA9IGdlbmRldjsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCWluaXRfdGltZXIoJmxwLT50aW1lcik7CisJZGU0eDVfcGFyc2VfcGFyYW1zKGRldik7CisKKwkvKgorCSoqIENob29zZSBjb3JyZWN0IGF1dG9zZW5zaW5nIGluIGNhc2Ugc29tZW9uZSBtZXNzZWQgdXAKKwkqLworICAgICAgICBscC0+YXV0b3NlbnNlID0gbHAtPnBhcmFtcy5hdXRvc2Vuc2U7CisgICAgICAgIGlmIChscC0+Y2hpcHNldCAhPSBEQzIxMTQwKSB7CisgICAgICAgICAgICBpZiAoKGxwLT5jaGlwc2V0PT1EQzIxMDQwKSAmJiAobHAtPnBhcmFtcy5hdXRvc2Vuc2UmVFBfTlcpKSB7CisgICAgICAgICAgICAgICAgbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBUUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobHAtPmNoaXBzZXQ9PURDMjEwNDEpICYmIChscC0+cGFyYW1zLmF1dG9zZW5zZSZCTkNfQVVJKSkgeworICAgICAgICAgICAgICAgIGxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQk5DOworICAgICAgICAgICAgfQorICAgICAgICB9CisJbHAtPmZkeCA9IGxwLT5wYXJhbXMuZmR4OworCXNwcmludGYobHAtPmFkYXB0ZXJfbmFtZSwiJXMgKCVzKSIsIG5hbWUsIGdlbmRldi0+YnVzX2lkKTsKKworCWxwLT5kbWFfc2l6ZSA9IChOVU1fUlhfREVTQyArIE5VTV9UWF9ERVNDKSAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyk7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkKERFNFg1X0RPX01FTUNQWSkKKwlscC0+ZG1hX3NpemUgKz0gUlhfQlVGRl9TWiAqIE5VTV9SWF9ERVNDICsgREU0WDVfQUxJR047CisjZW5kaWYKKwlscC0+cnhfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudChnZW5kZXYsIGxwLT5kbWFfc2l6ZSwKKwkJCQkJICZscC0+ZG1hX3JpbmdzLCBHRlBfQVRPTUlDKTsKKwlpZiAobHAtPnJ4X3JpbmcgPT0gTlVMTCkgeworCSAgICByZXR1cm4gLUVOT01FTTsKKwl9CisKKwlscC0+dHhfcmluZyA9IGxwLT5yeF9yaW5nICsgTlVNX1JYX0RFU0M7CisJICAgIAorCS8qCisJKiogU2V0IHVwIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcgKEludGVscykKKwkqKiBBbGxvY2F0ZSBjb250aWd1b3VzIHJlY2VpdmUgYnVmZmVycywgbG9uZyB3b3JkIGFsaWduZWQgKEFscGhhcykgCisJKi8KKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pICYmICFkZWZpbmVkKERFNFg1X0RPX01FTUNQWSkKKwlmb3IgKGk9MDsgaTxOVU1fUlhfREVTQzsgaSsrKSB7CisJICAgIGxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJICAgIGxwLT5yeF9yaW5nW2ldLmRlczEgPSBjcHVfdG9fbGUzMihSWF9CVUZGX1NaKTsKKwkgICAgbHAtPnJ4X3JpbmdbaV0uYnVmID0gMDsKKwkgICAgbHAtPnJ4X3JpbmdbaV0ubmV4dCA9IDA7CisJICAgIGxwLT5yeF9za2JbaV0gPSAoc3RydWN0IHNrX2J1ZmYgKikgMTsgICAgIC8qIER1bW15IGVudHJ5ICovCisJfQorCisjZWxzZQorCXsKKwkJZG1hX2FkZHJfdCBkbWFfcnhfYnVmczsKKworCQlkbWFfcnhfYnVmcyA9IGxwLT5kbWFfcmluZ3MgKyAoTlVNX1JYX0RFU0MgKyBOVU1fVFhfREVTQykKKwkJICAgICAgCSogc2l6ZW9mKHN0cnVjdCBkZTR4NV9kZXNjKTsKKwkJZG1hX3J4X2J1ZnMgPSAoZG1hX3J4X2J1ZnMgKyBERTRYNV9BTElHTikgJiB+REU0WDVfQUxJR047CisJCWxwLT5yeF9idWZzID0gKGNoYXIgKikoKChsb25nKShscC0+cnhfcmluZyArIE5VTV9SWF9ERVNDCisJCSAgICAgIAkrIE5VTV9UWF9ERVNDKSArIERFNFg1X0FMSUdOKSAmIH5ERTRYNV9BTElHTik7CisJCWZvciAoaT0wOyBpPE5VTV9SWF9ERVNDOyBpKyspIHsKKwkgICAgCQlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCSAgICAJCWxwLT5yeF9yaW5nW2ldLmRlczEgPSBjcHVfdG9fbGUzMihSWF9CVUZGX1NaKTsKKwkgICAgCQlscC0+cnhfcmluZ1tpXS5idWYgPQorCQkJCWNwdV90b19sZTMyKGRtYV9yeF9idWZzK2kqUlhfQlVGRl9TWik7CisJICAgIAkJbHAtPnJ4X3JpbmdbaV0ubmV4dCA9IDA7CisJICAgIAkJbHAtPnJ4X3NrYltpXSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAxOyAvKiBEdW1teSBlbnRyeSAqLworCQl9CisKKwl9CisjZW5kaWYKKworCWJhcnJpZXIoKTsKKworCWxwLT5yeFJpbmdTaXplID0gTlVNX1JYX0RFU0M7CisJbHAtPnR4UmluZ1NpemUgPSBOVU1fVFhfREVTQzsKKwkgICAgCisJLyogV3JpdGUgdGhlIGVuZCBvZiBsaXN0IG1hcmtlciB0byB0aGUgZGVzY3JpcHRvciBsaXN0cyAqLworCWxwLT5yeF9yaW5nW2xwLT5yeFJpbmdTaXplIC0gMV0uZGVzMSB8PSBjcHVfdG9fbGUzMihSRF9SRVIpOworCWxwLT50eF9yaW5nW2xwLT50eFJpbmdTaXplIC0gMV0uZGVzMSB8PSBjcHVfdG9fbGUzMihURF9URVIpOworCisJLyogVGVsbCB0aGUgYWRhcHRlciB3aGVyZSB0aGUgVFgvUlggcmluZ3MgYXJlIGxvY2F0ZWQuICovCisJb3V0bChscC0+ZG1hX3JpbmdzLCBERTRYNV9SUkJBKTsKKwlvdXRsKGxwLT5kbWFfcmluZ3MgKyBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyksCisJICAgICBERTRYNV9UUkJBKTsKKwkgICAgCisJLyogSW5pdGlhbGlzZSB0aGUgSVJRIG1hc2sgYW5kIEVuYWJsZS9EaXNhYmxlICovCisJbHAtPmlycV9tYXNrID0gSU1SX1JJTSB8IElNUl9USU0gfCBJTVJfVFVNIHwgSU1SX1VOTTsKKwlscC0+aXJxX2VuICAgPSBJTVJfTklNIHwgSU1SX0FJTTsKKworCS8qIENyZWF0ZSBhIGxvb3BiYWNrIHBhY2tldCBmcmFtZSBmb3IgbGF0ZXIgbWVkaWEgcHJvYmluZyAqLworCWNyZWF0ZV9wYWNrZXQoZGV2LCBscC0+ZnJhbWUsIHNpemVvZihscC0+ZnJhbWUpKTsKKworCS8qIENoZWNrIGlmIHRoZSBSWCBvdmVyZmxvdyBidWcgbmVlZHMgdGVzdGluZyBmb3IgKi8KKwlpID0gbHAtPmNmcnYgJiAweDAwMDAwMGZlOworCWlmICgobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgJiYgKGkgPT0gMHgyMCkpIHsKKwkgICAgbHAtPnJ4X292ZiA9IDE7CisJfQorCisJLyogSW5pdGlhbGlzZSB0aGUgU1JPTSBwb2ludGVycyBpZiBwb3NzaWJsZSAqLworCWlmIChscC0+dXNlU1JPTSkgeworCSAgICBscC0+c3RhdGUgPSBJTklUSUFMSVNFRDsKKwkgICAgaWYgKHNyb21faW5mb2xlYWZfaW5mbyhkZXYpKSB7CisJICAgICAgICBkbWFfZnJlZV9jb2hlcmVudCAoZ2VuZGV2LCBscC0+ZG1hX3NpemUsCisJCQkgICAgICAgbHAtPnJ4X3JpbmcsIGxwLT5kbWFfcmluZ3MpOworCQlyZXR1cm4gLUVOWElPOworCSAgICB9CisJICAgIHNyb21faW5pdChkZXYpOworCX0KKworCWxwLT5zdGF0ZSA9IENMT1NFRDsKKworCS8qCisJKiogQ2hlY2sgZm9yIGFuIE1JSSBpbnRlcmZhY2UKKwkqLworCWlmICgobHAtPmNoaXBzZXQgIT0gREMyMTA0MCkgJiYgKGxwLT5jaGlwc2V0ICE9IERDMjEwNDEpKSB7CisJICAgIG1paV9nZXRfcGh5KGRldik7CisJfQorCQorI2lmbmRlZiBfX3NwYXJjX3Y5X18KKwlwcmludGsoIiAgICAgIGFuZCByZXF1aXJlcyBJUlElZCAocHJvdmlkZWQgYnkgJXMpLlxuIiwgZGV2LT5pcnEsCisjZWxzZQorCXByaW50aygiICAgICAgYW5kIHJlcXVpcmVzIElSUSV4IChwcm92aWRlZCBieSAlcykuXG4iLCBkZXYtPmlycSwKKyNlbmRpZgorCSAgICAgICAoKGxwLT5idXMgPT0gUENJKSA/ICJQQ0kgQklPUyIgOiAiRUlTQSBDTkZHIikpOworICAgIH0KKyAgICAKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19WRVJTSU9OKSB7CisJcHJpbnRrKHZlcnNpb24pOworICAgIH0KKyAgICAKKyAgICAvKiBUaGUgREU0WDUtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCBnZW5kZXYpOworICAgIGRldi0+b3BlbiA9ICZkZTR4NV9vcGVuOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRlNHg1X3F1ZXVlX3BrdDsKKyAgICBkZXYtPnN0b3AgPSAmZGU0eDVfY2xvc2U7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmZGU0eDVfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBkZXYtPmRvX2lvY3RsID0gJmRlNHg1X2lvY3RsOworICAgIAorICAgIGRldi0+bWVtX3N0YXJ0ID0gMDsKKyAgICAKKyAgICAvKiBGaWxsIGluIHRoZSBnZW5lcmljIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBpZiAoKHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KSkpIHsKKwkgICAgZG1hX2ZyZWVfY29oZXJlbnQgKGdlbmRldiwgbHAtPmRtYV9zaXplLAorCQkJICAgICAgIGxwLT5yeF9yaW5nLCBscC0+ZG1hX3JpbmdzKTsKKwkgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgCisgICAgLyogTGV0IHRoZSBhZGFwdGVyIHNsZWVwIHRvIHNhdmUgcG93ZXIgKi8KKyAgICB5YXduKGRldiwgU0xFRVApOworICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwwKK3N0YXRpYyBpbnQKK2RlNHg1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgc3RhdHVzID0gMDsKKyAgICBzMzIgb21yOworCisgICAgLyogQWxsb2NhdGUgdGhlIFJYIGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGk9MDsgaTxscC0+cnhSaW5nU2l6ZTsgaSsrKSB7CisJaWYgKGRlNHg1X2FsbG9jX3J4X2J1ZmYoZGV2LCBpLCAwKSA9PSBOVUxMKSB7CisJICAgIGRlNHg1X2ZyZWVfcnhfYnVmZnMoZGV2KTsKKwkgICAgcmV0dXJuIC1FQUdBSU47CisJfQorICAgIH0KKworICAgIC8qCisgICAgKiogV2FrZSB1cCB0aGUgYWRhcHRlcgorICAgICovCisgICAgeWF3bihkZXYsIFdBS0VVUCk7CisKKyAgICAvKiAKKyAgICAqKiBSZS1pbml0aWFsaXplIHRoZSBERTRYNS4uLiAKKyAgICAqLworICAgIHN0YXR1cyA9IGRlNHg1X2luaXQoZGV2KTsKKyAgICBzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworICAgIGxwLT5zdGF0ZSA9IE9QRU47CisgICAgZGU0eDVfZGJnX29wZW4oZGV2KTsKKyAgICAKKyAgICBpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopZGU0eDVfaW50ZXJydXB0LCBTQV9TSElSUSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+YWRhcHRlcl9uYW1lLCBkZXYpKSB7CisJcHJpbnRrKCJkZTR4NV9vcGVuKCk6IFJlcXVlc3RlZCBJUlElZCBpcyBidXN5IC0gYXR0ZW1waW5nIEZBU1QvU0hBUkUuLi4iLCBkZXYtPmlycSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZTR4NV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+YWRhcHRlcl9uYW1lLCBkZXYpKSB7CisJICAgIHByaW50aygiXG4gICAgICAgICAgICAgIENhbm5vdCBnZXQgSVJRLSByZWNvbmZpZ3VyZSB5b3VyIGhhcmR3YXJlLlxuIik7CisJICAgIGRpc2FibGVfYXN0KGRldik7CisJICAgIGRlNHg1X2ZyZWVfcnhfYnVmZnMoZGV2KTsKKwkgICAgZGU0eDVfZnJlZV90eF9idWZmcyhkZXYpOworCSAgICB5YXduKGRldiwgU0xFRVApOworCSAgICBscC0+c3RhdGUgPSBDTE9TRUQ7CisJICAgIHJldHVybiAtRUFHQUlOOworCX0gZWxzZSB7CisJICAgIHByaW50aygiXG4gICAgICAgICAgICAgIFN1Y2NlZWRlZCwgYnV0IHlvdSBzaG91bGQgcmVjb25maWd1cmUgeW91ciBoYXJkd2FyZSB0byBhdm9pZCB0aGlzLlxuIik7CisJICAgIHByaW50aygiV0FSTklORzogdGhlcmUgbWF5IGJlIElSUSByZWxhdGVkIHByb2JsZW1zIGluIGhlYXZpbHkgbG9hZGVkIHN5c3RlbXMuXG4iKTsKKwl9CisgICAgfQorCisgICAgbHAtPmludGVycnVwdCA9IFVOTUFTS19JTlRFUlJVUFRTOworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIAorICAgIFNUQVJUX0RFNFg1OworCQorICAgIGRlNHg1X3NldHVwX2ludHIoZGV2KTsKKyAgICAKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19PUEVOKSB7CisJcHJpbnRrKCJcdHN0czogIDB4JTA4eFxuIiwgaW5sKERFNFg1X1NUUykpOworCXByaW50aygiXHRibXI6ICAweCUwOHhcbiIsIGlubChERTRYNV9CTVIpKTsKKwlwcmludGsoIlx0aW1yOiAgMHglMDh4XG4iLCBpbmwoREU0WDVfSU1SKSk7CisJcHJpbnRrKCJcdG9tcjogIDB4JTA4eFxuIiwgaW5sKERFNFg1X09NUikpOworCXByaW50aygiXHRzaXNyOiAweCUwOHhcbiIsIGlubChERTRYNV9TSVNSKSk7CisJcHJpbnRrKCJcdHNpY3I6IDB4JTA4eFxuIiwgaW5sKERFNFg1X1NJQ1IpKTsKKwlwcmludGsoIlx0c3RycjogMHglMDh4XG4iLCBpbmwoREU0WDVfU1RSUikpOworCXByaW50aygiXHRzaWdyOiAweCUwOHhcbiIsIGlubChERTRYNV9TSUdSKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBJbml0aWFsaXplIHRoZSBERTRYNSBvcGVyYXRpbmcgY29uZGl0aW9ucy4gTkI6IGEgY2hpcCBwcm9ibGVtIHdpdGggdGhlCisqKiBEQzIxMTQwIHJlcXVpcmVzIHVzaW5nIHBlcmZlY3QgZmlsdGVyaW5nIG1vZGUgZm9yIHRoYXQgY2hpcC4gU2luY2UgSSBjYW4ndAorKiogc2VlIHdoeSBJJ2Qgd2FudCA+IDE0IG11bHRpY2FzdCBhZGRyZXNzZXMsIEkgaGF2ZSBjaGFuZ2VkIGFsbCBjaGlwcyB0byB1c2UKKyoqIHRoZSBwZXJmZWN0IGZpbHRlcmluZyBtb2RlLiBLZWVwIHRoZSBETUEgYnVyc3QgbGVuZ3RoIGF0IDg6IHRoZXJlIHNlZW1zCisqKiB0byBiZSBkYXRhIGNvcnJ1cHRpb24gcHJvYmxlbXMgaWYgaXQgaXMgbGFyZ2VyIChVRFAgZXJyb3JzIHNlZW4gZnJvbSBhCisqKiB0dGNwIHNvdXJjZSkuCisqLworc3RhdGljIGludAorZGU0eDVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreyAgCisgICAgLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxzdCBzZXR0aW5nIHVwIHRoZSBoYXJkd2FyZSAqLworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAKKyAgICBkZTR4NV9zd19yZXNldChkZXYpOworICAgIAorICAgIC8qIEF1dG9jb25maWd1cmUgdGhlIGNvbm5lY3RlZCBwb3J0ICovCisgICAgYXV0b2NvbmZfbWVkaWEoZGV2KTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGU0eDVfc3dfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgaiwgc3RhdHVzID0gMDsKKyAgICBzMzIgYm1yLCBvbXI7CisgICAgCisgICAgLyogU2VsZWN0IHRoZSBNSUkgb3IgU1JMIHBvcnQgbm93IGFuZCBSRVNFVCB0aGUgTUFDICovCisgICAgaWYgKCFscC0+dXNlU1JPTSkgeworCWlmIChscC0+cGh5W2xwLT5hY3RpdmVdLmlkICE9IDApIHsKKwkgICAgbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX1NEUCB8IE9NUl9QUyB8IE9NUl9IQkQ7CisJfSBlbHNlIHsKKwkgICAgbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX1NEUCB8IE9NUl9UVE07CisJfQorCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIC8qIAorICAgICoqIFNldCB0aGUgcHJvZ3JhbW1hYmxlIGJ1cnN0IGxlbmd0aCB0byA4IGxvbmd3b3JkcyBmb3IgYWxsIHRoZSBEQzIxMTQwCisgICAgKiogRmFzdGVybmV0IGNoaXBzIGFuZCA0IGxvbmd3b3JkcyBmb3IgYWxsIG90aGVyczogRE1BIGVycm9ycyByZXN1bHQKKyAgICAqKiB3aXRob3V0IHRoZXNlIHZhbHVlcy4gQ2FjaGUgYWxpZ24gMTYgbG9uZy4KKyAgICAqLworICAgIGJtciA9IChscC0+Y2hpcHNldD09REMyMTE0MCA/IFBCTF84IDogUEJMXzQpIHwgREVTQ19TS0lQX0xFTiB8IERFNFg1X0NBQ0hFX0FMSUdOOworICAgIGJtciB8PSAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZik9PURDMjExNHggPyBCTVJfUk1MIDogMCk7CisgICAgb3V0bChibXIsIERFNFg1X0JNUik7CisKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKSAmIH5PTVJfUFI7ICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW9tciB8PSAoT01SX1NEUCB8IE9NUl9TQik7CisgICAgfQorICAgIGxwLT5zZXR1cF9mID0gUEVSRkVDVDsKKyAgICBvdXRsKGxwLT5kbWFfcmluZ3MsIERFNFg1X1JSQkEpOworICAgIG91dGwobHAtPmRtYV9yaW5ncyArIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBkZTR4NV9kZXNjKSwKKwkgREU0WDVfVFJCQSk7CisgICAgCisgICAgbHAtPnJ4X25ldyA9IGxwLT5yeF9vbGQgPSAwOworICAgIGxwLT50eF9uZXcgPSBscC0+dHhfb2xkID0gMDsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbHAtPnJ4UmluZ1NpemU7IGkrKykgeworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKyAgICB9CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGxwLT50eFJpbmdTaXplOyBpKyspIHsKKwlscC0+dHhfcmluZ1tpXS5zdGF0dXMgPSBjcHVfdG9fbGUzMigwKTsKKyAgICB9CisgICAgCisgICAgYmFycmllcigpOworCisgICAgLyogQnVpbGQgdGhlIHNldHVwIGZyYW1lIGRlcGVuZGluZyBvbiBmaWx0ZXJpbmcgbW9kZSAqLworICAgIFNldE11bHRpY2FzdEZpbHRlcihkZXYpOworICAgIAorICAgIGxvYWRfcGFja2V0KGRldiwgbHAtPnNldHVwX2ZyYW1lLCBQRVJGRUNUX0Z8VERfU0VUfFNFVFVQX0ZSQU1FX0xFTiwgKHN0cnVjdCBza19idWZmICopMSk7CisgICAgb3V0bChvbXJ8T01SX1NULCBERTRYNV9PTVIpOworCisgICAgLyogUG9sbCBmb3Igc2V0dXAgZnJhbWUgY29tcGxldGlvbiAoYWRhcHRlciBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBub3cpICovCisKKyAgICBmb3IgKGo9MCwgaT0wOyhpPDUwMCkgJiYgKGo9PTApO2krKykgeyAgICAgICAvKiBVcHRvIDUwMG1zIGRlbGF5ICovCisJbWRlbGF5KDEpOworCWlmICgoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2xwLT50eF9uZXddLnN0YXR1cykgPj0gMCkgaj0xOworICAgIH0KKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9wIGV2ZXJ5dGhpbmchICovCisKKyAgICBpZiAoaiA9PSAwKSB7CisJcHJpbnRrKCIlczogU2V0dXAgZnJhbWUgdGltZWQgb3V0LCBzdGF0dXMgJTA4eFxuIiwgZGV2LT5uYW1lLCAKKwkgICAgICAgaW5sKERFNFg1X1NUUykpOworCXN0YXR1cyA9IC1FSU87CisgICAgfQorICAgIAorICAgIGxwLT50eF9uZXcgPSAoKytscC0+dHhfbmV3KSAlIGxwLT50eFJpbmdTaXplOworICAgIGxwLT50eF9vbGQgPSBscC0+dHhfbmV3OworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogCisqKiBXcml0ZXMgYSBzb2NrZXQgYnVmZmVyIGFkZHJlc3MgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHRyYW5zbWl0IGRlc2NyaXB0b3IuCisqLworc3RhdGljIGludAorZGU0eDVfcXVldWVfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdV9sb25nIGZsYWdzID0gMDsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBpZiAobHAtPnR4X2VuYWJsZSA9PSBOTykgeyAgICAgICAgICAgICAgICAgICAvKiBDYW5ub3Qgc2VuZCBmb3Igbm93ICovCisJcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qCisgICAgKiogQ2xlYW4gb3V0IHRoZSBUWCByaW5nIGFzeW5jaHJvbm91c2x5IHRvIGludGVycnVwdHMgLSBzb21ldGltZXMgdGhlCisgICAgKiogaW50ZXJydXB0cyBhcmUgbG9zdCBieSBkZWxheWVkIGRlc2NyaXB0b3Igc3RhdHVzIHVwZGF0ZXMgcmVsYXRpdmUgdG8KKyAgICAqKiB0aGUgaXJxIGFzc2VydGlvbiwgZXNwZWNpYWxseSB3aXRoIGEgYnVzeSBQQ0kgYnVzLgorICAgICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZGU0eDVfdHgoZGV2KTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgLyogVGVzdCBpZiBjYWNoZSBpcyBhbHJlYWR5IGxvY2tlZCAtIHJlcXVldWUgc2tiIGlmIHNvICovCisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmbHAtPmNhY2hlLmxvY2spICYmICFscC0+aW50ZXJydXB0KSAKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmcgZnVsbCBvciBzdGFsZSBza2IgKi8KKyAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpIHx8ICh1X2xvbmcpIGxwLT50eF9za2JbbHAtPnR4X25ld10gPiAxKSB7CisJaWYgKGxwLT5pbnRlcnJ1cHQpIHsKKwkgICAgZGU0eDVfcHV0Yl9jYWNoZShkZXYsIHNrYik7ICAgICAgICAgIC8qIFJlcXVldWUgdGhlIGJ1ZmZlciAqLworCX0gZWxzZSB7CisJICAgIGRlNHg1X3B1dF9jYWNoZShkZXYsIHNrYik7CisJfQorCWlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX1RYKSB7CisJICAgIHByaW50aygiJXM6IHRyYW5zbWl0IGJ1c3ksIGxvc3QgbWVkaWEgb3Igc3RhbGUgc2tiIGZvdW5kOlxuICBTVFM6JTA4eFxuICB0YnVzeTolZFxuICBJTVI6JTA4eFxuICBPTVI6JTA4eFxuIFN0YWxlIHNrYjogJXNcbiIsZGV2LT5uYW1lLCBpbmwoREU0WDVfU1RTKSwgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLCBpbmwoREU0WDVfSU1SKSwgaW5sKERFNFg1X09NUiksICgodV9sb25nKSBscC0+dHhfc2tiW2xwLT50eF9uZXddID4gMSkgPyAiWUVTIiA6ICJOTyIpOworCX0KKyAgICB9IGVsc2UgaWYgKHNrYi0+bGVuID4gMCkgeworCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBzdHVmZiBxdWV1ZWQgbG9jYWxseSwgdXNlIHRoYXQgZmlyc3QgKi8KKwlpZiAobHAtPmNhY2hlLnNrYiAmJiAhbHAtPmludGVycnVwdCkgeworCSAgICBkZTR4NV9wdXRfY2FjaGUoZGV2LCBza2IpOworCSAgICBza2IgPSBkZTR4NV9nZXRfY2FjaGUoZGV2KTsKKwl9CisKKwl3aGlsZSAoc2tiICYmICFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgICAgKHVfbG9uZykgbHAtPnR4X3NrYltscC0+dHhfbmV3XSA8PSAxKSB7CisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJICAgIGxvYWRfcGFja2V0KGRldiwgc2tiLT5kYXRhLCBURF9JQyB8IFREX0xTIHwgVERfRlMgfCBza2ItPmxlbiwgc2tiKTsKKyAJICAgIGxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkgICAgb3V0bChQT0xMX0RFTUFORCwgREU0WDVfVFBEKTsvKiBTdGFydCB0aGUgVFggKi8KKwkJCisJICAgIGxwLT50eF9uZXcgPSAoKytscC0+dHhfbmV3KSAlIGxwLT50eFJpbmdTaXplOworCSAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJICAgIAorCSAgICBpZiAoVFhfQlVGRlNfQVZBSUwpIHsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsgICAgICAgICAvKiBBbm90aGVyIHBrdCBtYXkgYmUgcXVldWVkICovCisJICAgIH0KKwkgICAgc2tiID0gZGU0eDVfZ2V0X2NhY2hlKGRldik7CisJICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJfQorCWlmIChza2IpIGRlNHg1X3B1dGJfY2FjaGUoZGV2LCBza2IpOworICAgIH0KKyAgICAKKyAgICBscC0+Y2FjaGUubG9jayA9IDA7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogVGhlIERFNFg1IGludGVycnVwdCBoYW5kbGVyLiAKKyoqIAorKiogSS9PIFJlYWQvV3JpdGVzIHRocm91Z2ggaW50ZXJtZWRpYXRlIFBDSSBicmlkZ2VzIGFyZSBuZXZlciAncG9zdGVkJywKKyoqIHNvIHRoYXQgdGhlIGFzc2VydGVkIGludGVycnVwdCBhbHdheXMgaGFzIHNvbWUgcmVhbCBkYXRhIHRvIHdvcmsgd2l0aCAtCisqKiBpZiB0aGVzZSBJL08gYWNjZXNzZXMgYXJlIGV2ZXIgY2hhbmdlZCB0byBtZW1vcnkgYWNjZXNzZXMsIGVuc3VyZSB0aGUKKyoqIFNUUyB3cml0ZSBpcyByZWFkIGltbWVkaWF0ZWx5IHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBpZiB0aGUgYWRhcHRlcgorKiogaXMgbm90IG9uIGJ1cyAwLiBMb3N0IGludGVycnVwdHMgY2FuIHN0aWxsIG9jY3VyIHdoZW4gdGhlIFBDSSBidXMgbG9hZAorKiogaXMgaGlnaCBhbmQgZGVzY3JpcHRvciBzdGF0dXMgYml0cyBjYW5ub3QgYmUgc2V0IGJlZm9yZSB0aGUgYXNzb2NpYXRlZAorKiogaW50ZXJydXB0IGlzIGFzc2VydGVkIGFuZCB0aGlzIHJvdXRpbmUgZW50ZXJlZC4KKyovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2RlNHg1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwOworICAgIHMzMiBpbXIsIG9tciwgc3RzLCBsaW1pdDsKKyAgICB1X2xvbmcgaW9iYXNlOworICAgIHVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKyAgICAKKyAgICBpZiAoZGV2ID09IE5VTEwpIHsKKwlwcmludGsgKCJkZTR4NV9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJcmV0dXJuIElSUV9OT05FOworICAgIH0KKyAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3Bpbl9sb2NrKCZscC0+bG9jayk7CisgICAgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCisgICAgRElTQUJMRV9JUlFzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuc3VyZSBub24gcmUtZW50cmFuY3kgKi8KKworICAgIGlmICh0ZXN0X2FuZF9zZXRfYml0KE1BU0tfSU5URVJSVVBUUywgKHZvaWQqKSAmbHAtPmludGVycnVwdCkpCisJcHJpbnRrKCIlczogUmUtZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyLlxuIiwgZGV2LT5uYW1lKTsKKworICAgIHN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJCisgICAgZm9yIChsaW1pdD0wOyBsaW1pdDw4OyBsaW1pdCsrKSB7CisJc3RzID0gaW5sKERFNFg1X1NUUyk7ICAgICAgICAgICAgLyogUmVhZCBJUlEgc3RhdHVzICovCisJb3V0bChzdHMsIERFNFg1X1NUUyk7ICAgICAgICAgICAgLyogUmVzZXQgdGhlIGJvYXJkIGludGVycnVwdHMgKi8KKwkgICAgCisJaWYgKCEoc3RzICYgbHAtPmlycV9tYXNrKSkgYnJlYWs7LyogQWxsIGRvbmUgKi8KKwloYW5kbGVkID0gMTsKKwkgICAgCisJaWYgKHN0cyAmIChTVFNfUkkgfCBTVFNfUlUpKSAgICAgLyogUnggaW50ZXJydXB0IChwYWNrZXRbc10gYXJyaXZlZCkgKi8KKwkgIGRlNHg1X3J4KGRldik7CisJICAgIAorCWlmIChzdHMgJiAoU1RTX1RJIHwgU1RTX1RVKSkgICAgIC8qIFR4IGludGVycnVwdCAocGFja2V0IHNlbnQpICovCisJICBkZTR4NV90eChkZXYpOyAKKwkgICAgCisJaWYgKHN0cyAmIFNUU19MTkYpIHsgICAgICAgICAgICAgLyogVFAgTGluayBoYXMgZmFpbGVkICovCisJICAgIGxwLT5pcnFfbWFzayAmPSB+SU1SX0xGTTsKKwl9CisJICAgIAorCWlmIChzdHMgJiBTVFNfVU5GKSB7ICAgICAgICAgICAgIC8qIFRyYW5zbWl0IHVuZGVycnVuICovCisJICAgIGRlNHg1X3R4dXIoZGV2KTsKKwl9CisJICAgIAorCWlmIChzdHMgJiBTVFNfU0UpIHsgICAgICAgICAgICAgIC8qIEJ1cyBFcnJvciAqLworCSAgICBTVE9QX0RFNFg1OworCSAgICBwcmludGsoIiVzOiBGYXRhbCBidXMgZXJyb3Igb2NjdXJyZWQsIHN0cz0lIzh4LCBkZXZpY2Ugc3RvcHBlZC5cbiIsCisJCSAgIGRldi0+bmFtZSwgc3RzKTsKKwkgICAgc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwkgICAgcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKyAgICB9CisKKyAgICAvKiBMb2FkIHRoZSBUWCByaW5nIHdpdGggYW55IGxvY2FsbHkgc3RvcmVkIHBhY2tldHMgKi8KKyAgICBpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmbHAtPmNhY2hlLmxvY2spKSB7CisJd2hpbGUgKGxwLT5jYWNoZS5za2IgJiYgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiBscC0+dHhfZW5hYmxlKSB7CisJICAgIGRlNHg1X3F1ZXVlX3BrdChkZTR4NV9nZXRfY2FjaGUoZGV2KSwgZGV2KTsKKwl9CisJbHAtPmNhY2hlLmxvY2sgPSAwOworICAgIH0KKworICAgIGxwLT5pbnRlcnJ1cHQgPSBVTk1BU0tfSU5URVJSVVBUUzsKKyAgICBFTkFCTEVfSVJRczsKKyAgICBzcGluX3VubG9jaygmbHAtPmxvY2spOworICAgIAorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50CitkZTR4NV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBlbnRyeTsKKyAgICBzMzIgc3RhdHVzOworICAgIAorICAgIGZvciAoZW50cnk9bHAtPnJ4X25ldzsgKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKT49MDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk9bHAtPnJ4X25ldykgeworCXN0YXR1cyA9IChzMzIpbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJCisJaWYgKGxwLT5yeF9vdmYpIHsKKwkgICAgaWYgKGlubChERTRYNV9NRkMpICYgTUZDX0ZPQ00pIHsKKwkJZGU0eDVfcnhfb3ZmYyhkZXYpOworCQlicmVhazsKKwkgICAgfQorCX0KKworCWlmIChzdGF0dXMgJiBSRF9GUykgeyAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIHN0YXJ0IG9mIGZyYW1lICovCisJICAgIGxwLT5yeF9vbGQgPSBlbnRyeTsKKwl9CisJCisJaWYgKHN0YXR1cyAmIFJEX0xTKSB7ICAgICAgICAgICAgICAgICAvKiBWYWxpZCBmcmFtZSBzdGF0dXMgKi8KKwkgICAgaWYgKGxwLT50eF9lbmFibGUpIGxwLT5saW5rT0srKzsKKwkgICAgaWYgKHN0YXR1cyAmIFJEX0VTKSB7CSAgICAgIC8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBzdGF0cy4gKi8KKwkJaWYgKHN0YXR1cyAmIChSRF9SRiB8IFJEX1RMKSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUkRfQ0UpICAgICAgICAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUkRfT0YpICAgICAgICAgICBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX1RMKSAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX1JGKSAgICAgICAgICAgbHAtPnBrdFN0YXRzLnJ4X3J1bnRfZnJhbWVzKys7CisJCWlmIChzdGF0dXMgJiBSRF9DUykgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9jb2xsaXNpb24rKzsKKwkJaWYgKHN0YXR1cyAmIFJEX0RCKSAgICAgICAgICAgbHAtPnBrdFN0YXRzLnJ4X2RyaWJibGUrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX09GKSAgICAgICAgICAgbHAtPnBrdFN0YXRzLnJ4X292ZXJmbG93Kys7CisJICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHZhbGlkIGZyYW1lIHJlY2VpdmVkICovCisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXNob3J0IHBrdF9sZW4gPSAoc2hvcnQpKGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAxNikgLSA0OworCQkKKwkJaWYgKChza2IgPSBkZTR4NV9hbGxvY19yeF9idWZmKGRldiwgZW50cnksIHBrdF9sZW4pKSA9PSBOVUxMKSB7CisJCSAgICBwcmludGsoIiVzOiBJbnN1ZmZpY2llbnQgbWVtb3J5OyBudWtpbmcgcGFja2V0LlxuIiwgCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSk7CisJCSAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgeworCQkgICAgZGU0eDVfZGJnX3J4KHNrYiwgcGt0X2xlbik7CisKKwkJICAgIC8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisJCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkgICAgZGU0eDVfbG9jYWxfc3RhdHMoZGV2LCBza2ItPmRhdGEsIHBrdF9sZW4pOworCQkgICAgbmV0aWZfcngoc2tiKTsKKwkJICAgIAorCQkgICAgLyogVXBkYXRlIHN0YXRzICovCisJCSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAJCSAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCSAgICB9CisJICAgIAorCSAgICAvKiBDaGFuZ2UgYnVmZmVyIG93bmVyc2hpcCBmb3IgdGhpcyBmcmFtZSwgYmFjayB0byB0aGUgYWRhcHRlciAqLworCSAgICBmb3IgKDtscC0+cnhfb2xkIT1lbnRyeTtscC0+cnhfb2xkPSgrK2xwLT5yeF9vbGQpJWxwLT5yeFJpbmdTaXplKSB7CisJCWxwLT5yeF9yaW5nW2xwLT5yeF9vbGRdLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKwkJYmFycmllcigpOworCSAgICB9CisJICAgIGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisJICAgIGJhcnJpZXIoKTsKKwl9CisJCisJLyoKKwkqKiBVcGRhdGUgZW50cnkgaW5mb3JtYXRpb24KKwkqLworCWxwLT5yeF9uZXcgPSAoKytscC0+cnhfbmV3KSAlIGxwLT5yeFJpbmdTaXplOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZTR4NV9mcmVlX3R4X2J1ZmYoc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwLCBpbnQgZW50cnkpCit7CisgICAgZG1hX3VubWFwX3NpbmdsZShscC0+Z2VuZGV2LCBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0uYnVmKSwKKwkJICAgICBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0uZGVzMSkgJiBURF9UQlMxLAorCQkgICAgIERNQV9UT19ERVZJQ0UpOworICAgIGlmICgodV9sb25nKSBscC0+dHhfc2tiW2VudHJ5XSA+IDEpCisJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnR4X3NrYltlbnRyeV0pOworICAgIGxwLT50eF9za2JbZW50cnldID0gTlVMTDsKK30KKworLyoKKyoqIEJ1ZmZlciBzZW50IC0gY2hlY2sgZm9yIFRYIGJ1ZmZlciBlcnJvcnMuCisqLworc3RhdGljIGludAorZGU0eDVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgZW50cnk7CisgICAgczMyIHN0YXR1czsKKyAgICAKKyAgICBmb3IgKGVudHJ5ID0gbHAtPnR4X29sZDsgZW50cnkgIT0gbHAtPnR4X25ldzsgZW50cnkgPSBscC0+dHhfb2xkKSB7CisJc3RhdHVzID0gKHMzMilsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKwlpZiAoc3RhdHVzIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBub3Qgc2VudCB5ZXQgKi8KKwkgICAgYnJlYWs7CisJfSBlbHNlIGlmIChzdGF0dXMgIT0gMHg3ZmZmZmZmZikgeyAgICAvKiBOb3Qgc2V0dXAgZnJhbWUgKi8KKwkgICAgaWYgKHN0YXR1cyAmIFREX0VTKSB7ICAgICAgICAgICAgIC8qIEFuIGVycm9yIGhhcHBlbmVkICovCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsgCisJCWlmIChzdGF0dXMgJiBURF9OQykgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBURF9MQykgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFREX1VGKSBscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFREX0VDKSBscC0+cGt0U3RhdHMuZXhjZXNzaXZlX2NvbGxpc2lvbnMrKzsKKwkJaWYgKHN0YXR1cyAmIFREX0RFKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkgICAgCisJCWlmIChUWF9QS1RfUEVORElORykgeworCQkgICAgb3V0bChQT0xMX0RFTUFORCwgREU0WDVfVFBEKTsvKiBSZXN0YXJ0IGEgc3RhbGxlZCBUWCAqLworCQl9CisJICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBhY2tldCBzZW50ICovCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWlmIChscC0+dHhfZW5hYmxlKSBscC0+bGlua09LKys7CisJICAgIH0KKwkgICAgLyogVXBkYXRlIHRoZSBjb2xsaXNpb24gY291bnRlciAqLworCSAgICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAoKHN0YXR1cyAmIFREX0VDKSA/IDE2IDogCisJCQkJICAgICAgICAgICAgICAgICAgICAgICgoc3RhdHVzICYgVERfQ0MpID4+IDMpKTsKKworCSAgICAvKiBGcmVlIHRoZSBidWZmZXIuICovCisJICAgIGlmIChscC0+dHhfc2tiW2VudHJ5XSAhPSBOVUxMKQorCSAgICAJZGU0eDVfZnJlZV90eF9idWZmKGxwLCBlbnRyeSk7CisJfQorCQorCS8qIFVwZGF0ZSBhbGwgdGhlIHBvaW50ZXJzICovCisJbHAtPnR4X29sZCA9ICgrK2xwLT50eF9vbGQpICUgbHAtPnR4UmluZ1NpemU7CisgICAgfQorCisgICAgLyogQW55IHJlc291cmNlcyBhdmFpbGFibGU/ICovCisgICAgaWYgKFRYX0JVRkZTX0FWQUlMICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCWlmIChscC0+aW50ZXJydXB0KQorCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZWxzZQorCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIH0KKwkKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGU0eDVfYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIAorICAgIGRpc2FibGVfYXN0KGRldik7CisgICAgCisgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJbmV4dF90aWNrID0gc3JvbV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW5leHRfdGljayA9IGRjMjExNDBtX2F1dG9jb25mKGRldik7CisgICAgfSBlbHNlIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSB7CisJbmV4dF90aWNrID0gZGMyMTA0MV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCW5leHRfdGljayA9IGRjMjEwNDBfYXV0b2NvbmYoZGV2KTsKKyAgICB9CisgICAgbHAtPmxpbmtPSyA9IDA7CisgICAgZW5hYmxlX2FzdChkZXYsIG5leHRfdGljayk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3R4dXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgb21yOworCisgICAgb21yID0gaW5sKERFNFg1X09NUik7CisgICAgaWYgKCEob21yICYgT01SX1NGKSB8fCAobHAtPmNoaXBzZXQ9PURDMjEwNDEpIHx8IChscC0+Y2hpcHNldD09REMyMTA0MCkpIHsKKwlvbXIgJj0gfihPTVJfU1R8T01SX1NSKTsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwl3aGlsZSAoaW5sKERFNFg1X1NUUykgJiBTVFNfVFMpOworCWlmICgob21yICYgT01SX1RSKSA8IE9NUl9UUikgeworCSAgICBvbXIgKz0gMHg0MDAwOworCX0gZWxzZSB7CisJICAgIG9tciB8PSBPTVJfU0Y7CisJfQorCW91dGwob21yIHwgT01SX1NUIHwgT01SX1NSLCBERTRYNV9PTVIpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCAKK2RlNHg1X3J4X292ZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgb21yOworCisgICAgb21yID0gaW5sKERFNFg1X09NUik7CisgICAgb3V0bChvbXIgJiB+T01SX1NSLCBERTRYNV9PTVIpOworICAgIHdoaWxlIChpbmwoREU0WDVfU1RTKSAmIFNUU19SUyk7CisKKyAgICBmb3IgKDsgKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tscC0+cnhfbmV3XS5zdGF0dXMpPj0wOykgeworCWxwLT5yeF9yaW5nW2xwLT5yeF9uZXddLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKwlscC0+cnhfbmV3ID0gKCsrbHAtPnJ4X25ldyAlIGxwLT5yeFJpbmdTaXplKTsKKyAgICB9CisKKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGU0eDVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgaW1yLCBvbXI7CisgICAgCisgICAgZGlzYWJsZV9hc3QoZGV2KTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19DTE9TRSkgeworCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICU4Ljh4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpbmwoREU0WDVfU1RTKSk7CisgICAgfQorICAgIAorICAgIC8qIAorICAgICoqIFdlIHN0b3AgdGhlIERFNFg1IGhlcmUuLi4gbWFzayBpbnRlcnJ1cHRzIGFuZCBzdG9wIFRYICYgUlgKKyAgICAqLworICAgIERJU0FCTEVfSVJRczsKKyAgICBTVE9QX0RFNFg1OworICAgIAorICAgIC8qIEZyZWUgdGhlIGFzc29jaWF0ZWQgaXJxICovCisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgbHAtPnN0YXRlID0gQ0xPU0VEOworCisgICAgLyogRnJlZSBhbnkgc29ja2V0IGJ1ZmZlcnMgKi8KKyAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKGRldik7CisgICAgZGU0eDVfZnJlZV90eF9idWZmcyhkZXYpOworICAgIAorICAgIC8qIFB1dCB0aGUgYWRhcHRlciB0byBzbGVlcCB0byBzYXZlIHBvd2VyICovCisgICAgeWF3bihkZXYsIFNMRUVQKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2RlNHg1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIGxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gKGludCkoaW5sKERFNFg1X01GQykgJiAoTUZDX09WRkwgfCBNRkNfQ05UUikpOworICAgIAorICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfbG9jYWxfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgcGt0X2xlbikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgZm9yIChpPTE7IGk8REU0WDVfUEtUX1NUQVRfU1otMTsgaSsrKSB7CisgICAgICAgIGlmIChwa3RfbGVuIDwgKGkqREU0WDVfUEtUX0JJTl9TWikpIHsKKwkgICAgbHAtPnBrdFN0YXRzLmJpbnNbaV0rKzsKKwkgICAgaSA9IERFNFg1X1BLVF9TVEFUX1NaOworCX0KKyAgICB9CisgICAgaWYgKGJ1ZlswXSAmIDB4MDEpIHsgICAgICAgICAgLyogTXVsdGljYXN0L0Jyb2FkY2FzdCAqLworICAgICAgICBpZiAoKCooczMyICopJmJ1ZlswXSA9PSAtMSkgJiYgKCooczE2ICopJmJ1Zls0XSA9PSAtMSkpIHsKKwkgICAgbHAtPnBrdFN0YXRzLmJyb2FkY2FzdCsrOworCX0gZWxzZSB7CisJICAgIGxwLT5wa3RTdGF0cy5tdWx0aWNhc3QrKzsKKwl9CisgICAgfSBlbHNlIGlmICgoKihzMzIgKikmYnVmWzBdID09ICooczMyICopJmRldi0+ZGV2X2FkZHJbMF0pICYmCisJICAgICAgICgqKHMxNiAqKSZidWZbNF0gPT0gKihzMTYgKikmZGV2LT5kZXZfYWRkcls0XSkpIHsKKyAgICAgICAgbHAtPnBrdFN0YXRzLnVuaWNhc3QrKzsKKyAgICB9CisJCQorICAgIGxwLT5wa3RTdGF0cy5iaW5zWzBdKys7ICAgICAgIC8qIER1cGxpY2F0ZXMgc3RhdHMucnhfcGFja2V0cyAqLworICAgIGlmIChscC0+cGt0U3RhdHMuYmluc1swXSA9PSAwKSB7IC8qIFJlc2V0IGNvdW50ZXJzICovCisgICAgICAgIG1lbXNldCgoY2hhciAqKSZscC0+cGt0U3RhdHMsIDAsIHNpemVvZihscC0+cGt0U3RhdHMpKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBSZW1vdmVzIHRoZSBURF9JQyBmbGFnIGZyb20gcHJldmlvdXMgZGVzY3JpcHRvciB0byBpbXByb3ZlIFRYIHBlcmZvcm1hbmNlLgorKiogSWYgdGhlIGZsYWcgaXMgY2hhbmdlZCBvbiBhIGRlc2NyaXB0b3IgdGhhdCBpcyBiZWluZyByZWFkIGJ5IHRoZSBoYXJkd2FyZSwKKyoqIEkgYXNzdW1lIFBDSSB0cmFuc2FjdGlvbiBvcmRlcmluZyB3aWxsIG1lYW4geW91IGFyZSBlaXRoZXIgc3VjY2Vzc2Z1bCBvcgorKioganVzdCBtaXNzIGFzc2VydGluZyB0aGUgY2hhbmdlIHRvIHRoZSBoYXJkd2FyZS4gQW55d2F5IHlvdSdyZSBtZXNzaW5nIHdpdGgKKyoqIGEgZGVzY3JpcHRvciB5b3UgZG9uJ3Qgb3duLCBidXQgdGhpcyBzaG91bGRuJ3Qga2lsbCB0aGUgY2hpcCBwcm92aWRlZAorKiogdGhlIGRlc2NyaXB0b3IgcmVnaXN0ZXIgaXMgcmVhZCBvbmx5IHRvIHRoZSBoYXJkd2FyZS4KKyovCitzdGF0aWMgdm9pZAorbG9hZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCB1MzIgZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgZW50cnkgPSAobHAtPnR4X25ldyA/IGxwLT50eF9uZXctMSA6IGxwLT50eFJpbmdTaXplLTEpOworICAgIGRtYV9hZGRyX3QgYnVmX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGxwLT5nZW5kZXYsIGJ1ZiwgZmxhZ3MgJiBURF9UQlMxLCBETUFfVE9fREVWSUNFKTsKKworICAgIGxwLT50eF9yaW5nW2xwLT50eF9uZXddLmJ1ZiA9IGNwdV90b19sZTMyKGJ1Zl9kbWEpOworICAgIGxwLT50eF9yaW5nW2xwLT50eF9uZXddLmRlczEgJj0gY3B1X3RvX2xlMzIoVERfVEVSKTsKKyAgICBscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5kZXMxIHw9IGNwdV90b19sZTMyKGZsYWdzKTsKKyAgICBscC0+dHhfc2tiW2xwLT50eF9uZXddID0gc2tiOworICAgIGxwLT50eF9yaW5nW2VudHJ5XS5kZXMxICY9IGNwdV90b19sZTMyKH5URF9JQyk7CisgICAgYmFycmllcigpOworCisgICAgbHAtPnR4X3JpbmdbbHAtPnR4X25ld10uc3RhdHVzID0gY3B1X3RvX2xlMzIoVF9PV04pOworICAgIGJhcnJpZXIoKTsKK30KKworLyoKKyoqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorKi8KK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIC8qIEZpcnN0LCBkb3VibGUgY2hlY2sgdGhhdCB0aGUgYWRhcHRlciBpcyBvcGVuICovCisgICAgaWYgKGxwLT5zdGF0ZSA9PSBPUEVOKSB7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeyAgICAgICAgIC8qIHNldCBwcm9taXNjdW91cyBtb2RlICovCisJICAgIHUzMiBvbXI7CisJICAgIG9tciA9IGlubChERTRYNV9PTVIpOworCSAgICBvbXIgfD0gT01SX1BSOworCSAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKwl9IGVsc2UgeyAKKwkgICAgU2V0TXVsdGljYXN0RmlsdGVyKGRldik7CisJICAgIGxvYWRfcGFja2V0KGRldiwgbHAtPnNldHVwX2ZyYW1lLCBURF9JQyB8IFBFUkZFQ1RfRiB8IFREX1NFVCB8IAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRVUF9GUkFNRV9MRU4sIChzdHJ1Y3Qgc2tfYnVmZiAqKTEpOworCSAgICAKKwkgICAgbHAtPnR4X25ldyA9ICgrK2xwLT50eF9uZXcpICUgbHAtPnR4UmluZ1NpemU7CisJICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7ICAgICAgIC8qIFN0YXJ0IHRoZSBUWCAqLworCSAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9CisgICAgfQorfQorCisvKgorKiogQ2FsY3VsYXRlIHRoZSBoYXNoIGNvZGUgYW5kIHVwZGF0ZSB0aGUgbG9naWNhbCBhZGRyZXNzIGZpbHRlcgorKiogZnJvbSBhIGxpc3Qgb2YgZXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyoqIExpdHRsZSBlbmRpYW4gY3JjIG9uZSBsaW5lciBmcm9tIE1hdHQgVGhvbWFzLCBERUMuCisqLworc3RhdGljIHZvaWQKK1NldE11bHRpY2FzdEZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGRldl9tY19saXN0ICpkbWk9ZGV2LT5tY19saXN0OworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgaiwgYml0LCBieXRlOworICAgIHUxNiBoYXNoY29kZTsKKyAgICB1MzIgb21yLCBjcmM7CisgICAgY2hhciAqcGE7CisgICAgdW5zaWduZWQgY2hhciAqYWRkcnM7CisKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKTsKKyAgICBvbXIgJj0gfihPTVJfUFIgfCBPTVJfUE0pOworICAgIHBhID0gYnVpbGRfc2V0dXBfZnJhbWUoZGV2LCBBTEwpOyAgICAgICAgLyogQnVpbGQgdGhlIGJhc2ljIGZyYW1lICovCisgICAgCisgICAgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDE0KSkgeworCW9tciB8PSBPTVJfUE07ICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXNzIGFsbCBtdWx0aWNhc3RzICovCisgICAgfSBlbHNlIGlmIChscC0+c2V0dXBfZiA9PSBIQVNIX1BFUkYpIHsgICAvKiBIYXNoIEZpbHRlcmluZyAqLworCWZvciAoaT0wO2k8ZGV2LT5tY19jb3VudDtpKyspIHsgICAgICAvKiBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSBsaXN0ICovCisJICAgIGFkZHJzPWRtaS0+ZG1pX2FkZHI7CisJICAgIGRtaT1kbWktPm5leHQ7CisJICAgIGlmICgoKmFkZHJzICYgMHgwMSkgPT0gMSkgeyAgICAgIC8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLyAKKwkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRycyk7CisJCWhhc2hjb2RlID0gY3JjICYgSEFTSF9CSVRTOyAgLyogaGFzaGNvZGUgaXMgOSBMU2Igb2YgQ1JDICovCisJCQorCQlieXRlID0gaGFzaGNvZGUgPj4gMzsgICAgICAgIC8qIGJpdFszLThdIC0+IGJ5dGUgaW4gZmlsdGVyICovCisJCWJpdCA9IDEgPDwgKGhhc2hjb2RlICYgMHgwNyk7LyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KKwkJCisJCWJ5dGUgPDw9IDE7ICAgICAgICAgICAgICAgICAgLyogY2FsYyBvZmZzZXQgaW50byBzZXR1cCBmcmFtZSAqLworCQlpZiAoYnl0ZSAmIDB4MDIpIHsKKwkJICAgIGJ5dGUgLT0gMTsKKwkJfQorCQlscC0+c2V0dXBfZnJhbWVbYnl0ZV0gfD0gYml0OworCSAgICB9CisJfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyZmVjdCBmaWx0ZXJpbmcgKi8KKwlmb3IgKGo9MDsgajxkZXYtPm1jX2NvdW50OyBqKyspIHsKKwkgICAgYWRkcnM9ZG1pLT5kbWlfYWRkcjsKKwkgICAgZG1pPWRtaS0+bmV4dDsKKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAKKwkJKihwYSArIChpJjEpKSA9ICphZGRycysrOworCQlpZiAoaSAmIDB4MDEpIHBhICs9IDQ7CisJICAgIH0KKwl9CisgICAgfQorICAgIG91dGwob21yLCBERTRYNV9PTVIpOworICAgIAorICAgIHJldHVybjsKK30KKworI2lmZGVmIENPTkZJR19FSVNBCisKK3N0YXRpYyB1X2NoYXIgZGU0eDVfaXJxW10gPSBFSVNBX0FMTE9XRURfSVJRX0xJU1Q7CisKK3N0YXRpYyBpbnQgX19pbml0IGRlNHg1X2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CisJdV9sb25nIGlvYmFzZTsKKwl1X2NoYXIgaXJxLCByZWd2YWw7CisJdV9zaG9ydCB2ZW5kb3I7CisJdTMyIGNmaWQ7CisJaW50IHN0YXR1cywgZGV2aWNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwOworCisJZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChnZW5kZXYpOworCWlvYmFzZSA9IGVkZXYtPmJhc2VfYWRkcjsKKworCWlmICghcmVxdWVzdF9yZWdpb24gKGlvYmFzZSwgREU0WDVfRUlTQV9UT1RBTF9TSVpFLCAiZGU0eDUiKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghcmVxdWVzdF9yZWdpb24gKGlvYmFzZSArIERFNFg1X0VJU0FfSU9fUE9SVFMsCisJCQkgICAgIERFNFg1X0VJU0FfVE9UQUxfU0laRSwgImRlNHg1IikpIHsKKwkJc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIHJlbGVhc2VfcmVnXzE7CisJfQorCQorCWlmICghKGRldiA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKHN0cnVjdCBkZTR4NV9wcml2YXRlKSkpKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gcmVsZWFzZV9yZWdfMjsKKwl9CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWNmaWQgPSAodTMyKSBpbmwoUENJX0NGSUQpOworCWxwLT5jZnJ2ID0gKHVfc2hvcnQpIGlubChQQ0lfQ0ZSVik7CisJZGV2aWNlID0gKGNmaWQgPj4gOCkgJiAweDAwZmZmZjAwOworCXZlbmRvciA9ICh1X3Nob3J0KSBjZmlkOworCSAgICAKKwkvKiBSZWFkIHRoZSBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisJcmVndmFsID0gaW5iKEVJU0FfUkVHMCkgJiAoRVIwX0lOVEwgfCBFUjBfSU5UVCk7CisjaWZkZWYgQ09ORklHX0FMUEhBCisJLyogTG9va3MgbGlrZSB0aGUgSmVuc2VuIGZpcm13YXJlIChyZXYgMi4yKSBkb2Vzbid0IHJlYWxseQorCSAqIGNhcmUgYWJvdXQgdGhlIEVJU0EgY29uZmlndXJhdGlvbiwgYW5kIHRodXMgZG9lc24ndAorCSAqIGNvbmZpZ3VyZSB0aGUgUExYIGJyaWRnZSBwcm9wZXJseS4gT2ggd2VsbC4uLiBTaW1wbHkgbWltaWMKKwkgKiB0aGUgRUlTQSBjb25maWcgZmlsZSB0byBzb3J0IGl0IG91dC4gKi8KKwkKKwkvKiBFSVNBIFJFRzE6IEFzc2VydCBEZWNDaGlwIDIxMDQwIEhXIFJlc2V0ICovCisJb3V0YiAoRVIxX0lBTSB8IDEsIEVJU0FfUkVHMSk7CisJbWRlbGF5ICgxKTsKKworICAgICAgICAvKiBFSVNBIFJFRzE6IERlYXNzZXJ0IERlY0NoaXAgMjEwNDAgSFcgUmVzZXQgKi8KKwlvdXRiIChFUjFfSUFNLCBFSVNBX1JFRzEpOworCW1kZWxheSAoMSk7CisKKwkvKiBFSVNBIFJFRzM6IFIvVyBCdXJzdCBUcmFuc2ZlciBFbmFibGUgKi8KKwlvdXRiIChFUjNfQldFIHwgRVIzX0JSRSwgRUlTQV9SRUczKTsKKwkKKwkvKiAzMl9iaXQgc2xhdmUvbWFzdGVyLCBQcmVlbXB0IFRpbWU9MjMgYmNsa3MsIFVubGF0Y2hlZCBJbnRlcnJ1cHQgKi8KKwlvdXRiIChFUjBfQlNXIHwgRVIwX0JNVyB8IEVSMF9FUFQgfCByZWd2YWwsIEVJU0FfUkVHMCk7CisjZW5kaWYKKwlpcnEgPSBkZTR4NV9pcnFbKHJlZ3ZhbCA+PiAxKSAmIDB4MDNdOworCQorCWlmIChpc19EQzIxMTR4KSB7CisJICAgIGRldmljZSA9ICgobHAtPmNmcnYgJiBDRlJWX1JOKSA8IERDMjExNHhfQlJLID8gREMyMTE0MiA6IERDMjExNDMpOworCX0KKwlscC0+Y2hpcHNldCA9IGRldmljZTsKKwlscC0+YnVzID0gRUlTQTsKKworCS8qIFdyaXRlIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKwlvdXRsKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUFTVEVSLCBQQ0lfQ0ZDUyk7CisJb3V0bCgweDAwMDA2MDAwLCBQQ0lfQ0ZMVCk7CisJb3V0bChpb2Jhc2UsIFBDSV9DQklPKTsKKwkgICAgCisJRGV2aWNlUHJlc2VudChkZXYsIEVJU0FfQVBST00pOworCisJZGV2LT5pcnEgPSBpcnE7CisKKwlpZiAoIShzdGF0dXMgPSBkZTR4NV9od19pbml0IChkZXYsIGlvYmFzZSwgZ2VuZGV2KSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZnJlZV9uZXRkZXYgKGRldik7CisgcmVsZWFzZV9yZWdfMjoKKwlyZWxlYXNlX3JlZ2lvbiAoaW9iYXNlICsgREU0WDVfRUlTQV9JT19QT1JUUywgREU0WDVfRUlTQV9UT1RBTF9TSVpFKTsKKyByZWxlYXNlX3JlZ18xOgorCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkZTR4NV9laXNhX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdV9sb25nIGlvYmFzZTsKKworCWRldiA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisJaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCisJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSArIERFNFg1X0VJU0FfSU9fUE9SVFMsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSwgREU0WDVfRUlTQV9UT1RBTF9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGRlNHg1X2Vpc2FfaWRzW10gPSB7CisgICAgICAgIHsgIkRFQzQyNTAiLCAwIH0sCS8qIDAgaXMgdGhlIGJvYXJkIG5hbWUgaW5kZXguLi4gKi8KKyAgICAgICAgeyAiIiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGRlNHg1X2Vpc2FfZHJpdmVyID0geworICAgICAgICAuaWRfdGFibGUgPSBkZTR4NV9laXNhX2lkcywKKyAgICAgICAgLmRyaXZlciAgID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgID0gImRlNHg1IiwKKyAgICAgICAgICAgICAgICAucHJvYmUgICA9IGRlNHg1X2Vpc2FfcHJvYmUsCisgICAgICAgICAgICAgICAgLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoZGU0eDVfZWlzYV9yZW1vdmUpLAorICAgICAgICB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCBkZTR4NV9laXNhX2lkcyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKworLyoKKyoqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGN1cnJlbnQgYnVzICh3aGljaCBpcyA+MCkgZm9yIGEgREVDY2hpcCB3aXRoIGFuCisqKiBTUk9NLCBzbyB0aGF0IGluIG11bHRpcG9ydCBjYXJkcyB0aGF0IGhhdmUgb25lIFNST00gc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgCisqKiBERUNjaGlwcywgd2UgY2FuIGZpbmQgdGhlIGJhc2UgU1JPTSBpcnJlc3BlY3RpdmUgb2YgdGhlIEJJT1Mgc2NhbiBkaXJlY3Rpb24uCisqKiBGb3Igc2luZ2xlIHBvcnQgY2FyZHMgdGhpcyBpcyBhIHRpbWUgd2FzdGVyLi4uCisqLworc3RhdGljIHZvaWQgX19kZXZpbml0IAorc3JvbV9zZWFyY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgdV9jaGFyIHBiOworICAgIHVfc2hvcnQgdmVuZG9yLCBzdGF0dXM7CisgICAgdV9pbnQgaXJxID0gMCwgZGV2aWNlOworICAgIHVfbG9uZyBpb2Jhc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHVwcGVyIDMyIGJpdHMgaW4gQWxwaGFzICovCisgICAgaW50IGksIGosIGNmcnY7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3YWxrID0gJnBkZXYtPmJ1c19saXN0OworCisgICAgZm9yICh3YWxrID0gd2Fsay0+bmV4dDsgd2FsayAhPSAmcGRldi0+YnVzX2xpc3Q7IHdhbGsgPSB3YWxrLT5uZXh0KSB7CisJc3RydWN0IHBjaV9kZXYgKnRoaXNfZGV2ID0gcGNpX2Rldl9iKHdhbGspOworCisJLyogU2tpcCB0aGUgcGNpX2J1cyBsaXN0IGVudHJ5ICovCisJaWYgKGxpc3RfZW50cnkod2Fsaywgc3RydWN0IHBjaV9idXMsIGRldmljZXMpID09IHBkZXYtPmJ1cykgY29udGludWU7CisKKwl2ZW5kb3IgPSB0aGlzX2Rldi0+dmVuZG9yOworCWRldmljZSA9IHRoaXNfZGV2LT5kZXZpY2UgPDwgODsKKwlpZiAoIShpc19EQzIxMDQwIHx8IGlzX0RDMjEwNDEgfHwgaXNfREMyMTE0MCB8fCBpc19EQzIxMTR4KSkgY29udGludWU7CisKKwkvKiBHZXQgdGhlIGNoaXAgY29uZmlndXJhdGlvbiByZXZpc2lvbiByZWdpc3RlciAqLworCXBiID0gdGhpc19kZXYtPmJ1cy0+bnVtYmVyOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0aGlzX2RldiwgUENJX1JFVklTSU9OX0lELCAmY2Zydik7CisKKwkvKiBTZXQgdGhlIGRldmljZSBudW1iZXIgaW5mb3JtYXRpb24gKi8KKwlscC0+ZGV2aWNlID0gUENJX1NMT1QodGhpc19kZXYtPmRldmZuKTsKKwlscC0+YnVzX251bSA9IHBiOworCSAgICAKKwkvKiBTZXQgdGhlIGNoaXBzZXQgaW5mb3JtYXRpb24gKi8KKwlpZiAoaXNfREMyMTE0eCkgeworCSAgICBkZXZpY2UgPSAoKGNmcnYgJiBDRlJWX1JOKSA8IERDMjExNHhfQlJLID8gREMyMTE0MiA6IERDMjExNDMpOworCX0KKwlscC0+Y2hpcHNldCA9IGRldmljZTsKKworCS8qIEdldCB0aGUgYm9hcmQgSS9PIGFkZHJlc3MgKDY0IGJpdHMgb24gc3BhcmM2NCkgKi8KKwlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQodGhpc19kZXYsIDApOworCisJLyogRmV0Y2ggdGhlIElSUSB0byBiZSB1c2VkICovCisJaXJxID0gdGhpc19kZXYtPmlycTsKKwlpZiAoKGlycSA9PSAwKSB8fCAoaXJxID09IDB4ZmYpIHx8ICgoaW50KWlycSA9PSAtMSkpIGNvbnRpbnVlOworCSAgICAKKwkvKiBDaGVjayBpZiBJL08gYWNjZXNzZXMgYXJlIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0aGlzX2RldiwgUENJX0NPTU1BTkQsICZzdGF0dXMpOworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX0lPKSkgY29udGludWU7CisKKwkvKiBTZWFyY2ggZm9yIGEgdmFsaWQgU1JPTSBhdHRhY2hlZCB0byB0aGlzIERFQ2NoaXAgKi8KKwlEZXZpY2VQcmVzZW50KGRldiwgREU0WDVfQVBST00pOworCWZvciAoaj0wLCBpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICBqICs9ICh1X2NoYXIpICooKHVfY2hhciAqKSZscC0+c3JvbSArIFNST01fSFdBREQgKyBpKTsKKwl9CisJaWYgKChqICE9IDApICYmIChqICE9IDB4NWZhKSkgeworCSAgICBsYXN0LmNoaXBzZXQgPSBkZXZpY2U7CisJICAgIGxhc3QuYnVzID0gcGI7CisJICAgIGxhc3QuaXJxID0gaXJxOworCSAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CisJCWxhc3QuYWRkcltpXSA9ICh1X2NoYXIpKigodV9jaGFyICopJmxwLT5zcm9tICsgU1JPTV9IV0FERCArIGkpOworCSAgICB9CisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogUENJIGJ1cyBJL08gZGV2aWNlIHByb2JlCisqKiBOQjogUENJIEkvTyBhY2Nlc3NlcyBhbmQgQnVzIE1hc3RlcmluZyBhcmUgZW5hYmxlZCBieSB0aGUgUENJIEJJT1MsIG5vdAorKiogdGhlIGRyaXZlci4gU29tZSBQQ0kgQklPUydzLCBwcmUgVjIuMSwgbmVlZCB0aGUgc2xvdCArIGZlYXR1cmVzIHRvIGJlCisqKiBlbmFibGVkIGJ5IHRoZSB1c2VyIGZpcnN0IGluIHRoZSBzZXQgdXAgdXRpbGl0eS4gSGVuY2Ugd2UganVzdCBjaGVjayBmb3IKKyoqIGVuYWJsZWQgZmVhdHVyZXMgYW5kIHNpbGVudGx5IGlnbm9yZSB0aGUgY2FyZCBpZiB0aGV5J3JlIG5vdC4KKyoqCisqKiBTVE9QIFBSRVNTOiBTb21lIEJJT1MncyBfX3JlcXVpcmVfXyB0aGUgZHJpdmVyIHRvIGVuYWJsZSB0aGUgYnVzIG1hc3RlcmluZworKiogYml0LiBIZXJlLCBjaGVjayBmb3IgSS9PIGFjY2Vzc2VzIGFuZCB0aGVuIHNldCBCTS4gSWYgeW91IHB1dCB0aGUgY2FyZCBpbgorKiogYSBub24gQk0gc2xvdCwgeW91J3JlIG9uIHlvdXIgb3duIChhbmQgY29tcGxhaW4gdG8gdGhlIFBDIHZlbmRvciB0aGF0IHlvdXIKKyoqIFBDIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgUENJIHN0YW5kYXJkKSEKKyoqCisqKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY29tcGF0aWJsZSB3aXRoIHRoZSAqbGF0ZXN0KiAyLjEueCBrZXJuZWxzLiBGb3IgMi4wLngKKyoqIGtlcm5lbHMgdXNlIHRoZSBWMC41MzVbbl0gZHJpdmVycy4KKyovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRlNHg1X3BjaV9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwl1X2NoYXIgcGIsIHBidXMgPSAwLCBkZXZfbnVtLCBkbnVtID0gMCwgdGltZXI7CisJdV9zaG9ydCB2ZW5kb3IsIHN0YXR1czsKKwl1X2ludCBpcnEgPSAwLCBkZXZpY2U7CisJdV9sb25nIGlvYmFzZSA9IDA7CS8qIENsZWFyIHVwcGVyIDMyIGJpdHMgaW4gQWxwaGFzICovCisJaW50IGVycm9yOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwOworCisJZGV2X251bSA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlwYiA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCisJaWYgKGlvKSB7IC8qIHByb2JlIGEgc2luZ2xlIFBDSSBkZXZpY2UgKi8KKwkJcGJ1cyA9ICh1X3Nob3J0KShpbyA+PiA4KTsKKwkJZG51bSA9ICh1X3Nob3J0KShpbyAmIDB4ZmYpOworCQlpZiAoKHBidXMgIT0gcGIpIHx8IChkbnVtICE9IGRldl9udW0pKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdmVuZG9yID0gcGRldi0+dmVuZG9yOworCWRldmljZSA9IHBkZXYtPmRldmljZSA8PCA4OworCWlmICghKGlzX0RDMjEwNDAgfHwgaXNfREMyMTA0MSB8fCBpc19EQzIxMTQwIHx8IGlzX0RDMjExNHgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE9rLCB0aGUgZGV2aWNlIHNlZW1zIHRvIGJlIGZvciB1cy4gKi8KKwlpZiAoKGVycm9yID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpKSkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCEoZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZiAoc3RydWN0IGRlNHg1X3ByaXZhdGUpKSkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGRpc2FibGVfZGV2OworCX0KKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+YnVzID0gUENJOworCWxwLT5idXNfbnVtID0gMDsKKwkKKwkvKiBTZWFyY2ggZm9yIGFuIFNST00gb24gdGhpcyBidXMgKi8KKwlpZiAobHAtPmJ1c19udW0gIT0gcGIpIHsKKwkgICAgbHAtPmJ1c19udW0gPSBwYjsKKwkgICAgc3JvbV9zZWFyY2goZGV2LCBwZGV2KTsKKwl9CisKKwkvKiBHZXQgdGhlIGNoaXAgY29uZmlndXJhdGlvbiByZXZpc2lvbiByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZscC0+Y2Zydik7CisKKwkvKiBTZXQgdGhlIGRldmljZSBudW1iZXIgaW5mb3JtYXRpb24gKi8KKwlscC0+ZGV2aWNlID0gZGV2X251bTsKKwlscC0+YnVzX251bSA9IHBiOworCQorCS8qIFNldCB0aGUgY2hpcHNldCBpbmZvcm1hdGlvbiAqLworCWlmIChpc19EQzIxMTR4KSB7CisJICAgIGRldmljZSA9ICgobHAtPmNmcnYgJiBDRlJWX1JOKSA8IERDMjExNHhfQlJLID8gREMyMTE0MiA6IERDMjExNDMpOworCX0KKwlscC0+Y2hpcHNldCA9IGRldmljZTsKKworCS8qIEdldCB0aGUgYm9hcmQgSS9PIGFkZHJlc3MgKDY0IGJpdHMgb24gc3BhcmM2NCkgKi8KKwlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwkvKiBGZXRjaCB0aGUgSVJRIHRvIGJlIHVzZWQgKi8KKwlpcnEgPSBwZGV2LT5pcnE7CisJaWYgKChpcnEgPT0gMCkgfHwgKGlycSA9PSAweGZmKSB8fCAoKGludClpcnEgPT0gLTEpKSB7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX2RldjsKKwl9CisJICAgIAorCS8qIENoZWNrIGlmIEkvTyBhY2Nlc3NlcyBhbmQgQnVzIE1hc3RlcmluZyBhcmUgZW5hYmxlZCAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKyNpZmRlZiBfX3Bvd2VycGNfXworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX0lPKSkgeworCSAgICBzdGF0dXMgfD0gUENJX0NPTU1BTkRfSU87CisJICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgc3RhdHVzKTsKKwkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZzdGF0dXMpOworCX0KKyNlbmRpZiAvKiBfX3Bvd2VycGNfXyAqLworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX0lPKSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCisJaWYgKCEoc3RhdHVzICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgeworCSAgICBzdGF0dXMgfD0gUENJX0NPTU1BTkRfTUFTVEVSOworCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwl9CisJaWYgKCEoc3RhdHVzICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCisJLyogQ2hlY2sgdGhlIGxhdGVuY3kgdGltZXIgZm9yIHZhbHVlcyA+PSAweDYwICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZ0aW1lcik7CisJaWYgKHRpbWVyIDwgMHg2MCkgeworCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NjApOworCX0KKworCURldmljZVByZXNlbnQoZGV2LCBERTRYNV9BUFJPTSk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChpb2Jhc2UsIERFNFg1X1BDSV9UT1RBTF9TSVpFLCAiZGU0eDUiKSkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2RldjsKKwl9CisKKwlkZXYtPmlycSA9IGlycTsKKwkKKwlpZiAoKGVycm9yID0gZGU0eDVfaHdfaW5pdChkZXYsIGlvYmFzZSwgJnBkZXYtPmRldikpKSB7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlyZXR1cm4gMDsKKworIHJlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSwgREU0WDVfUENJX1RPVEFMX1NJWkUpOworIGZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2IChkZXYpOworIGRpc2FibGVfZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGU0eDVfcGNpX3JlbW92ZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1X2xvbmcgaW9iYXNlOworCisJZGV2ID0gcGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCWlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSwgREU0WDVfUENJX1RPVEFMX1NJWkUpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZTR4NV9wY2lfdGJsW10gPSB7CisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAorICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUywKKyAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMyB9LAorICAgICAgICB7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGU0eDVfcGNpX2RyaXZlciA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlNHg1IiwKKyAgICAgICAgLmlkX3RhYmxlICAgICAgID0gZGU0eDVfcGNpX3RibCwKKyAgICAgICAgLnByb2JlICAgICAgICAgID0gZGU0eDVfcGNpX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhpdF9wIChkZTR4NV9wY2lfcmVtb3ZlKSwKK307CisKKyNlbmRpZgorCisvKgorKiogQXV0byBjb25maWd1cmUgdGhlIG1lZGlhIGhlcmUgcmF0aGVyIHRoYW4gc2V0dGluZyB0aGUgcG9ydCBhdCBjb21waWxlCisqKiB0aW1lLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGRlNHg1X2luaXQoKSBhbmQgd2hlbiBhIGxvc3Mgb2YgbWVkaWEgaXMKKyoqIGRldGVjdGVkIChleGNlc3NpdmUgY29sbGlzaW9ucywgbG9zcyBvZiBjYXJyaWVyLCBubyBjYXJyaWVyIG9yIGxpbmsgZmFpbAorKiogW1RQXSBvciBubyByZWNlbnQgcmVjZWl2ZSBhY3Rpdml0eSkgdG8gY2hlY2sgd2hldGhlciB0aGUgdXNlciBoYXMgYmVlbiAKKyoqIHNuZWFreSBhbmQgY2hhbmdlZCB0aGUgcG9ydCBvbiB1cy4KKyovCitzdGF0aWMgaW50CithdXRvY29uZl9tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisKKyAgICBscC0+bGlua09LID0gMDsKKyAgICBscC0+Y19tZWRpYSA9IEFVVE87ICAgICAgICAgICAgICAgICAgICAgLyogQm9ndXMgbGFzdCBtZWRpYSAqLworICAgIGRpc2FibGVfYXN0KGRldik7CisgICAgaW5sKERFNFg1X01GQyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFplcm8gdGhlIGxvc3QgZnJhbWVzIGNvdW50ZXIgKi8KKyAgICBscC0+bWVkaWEgPSBJTklUOworICAgIGxwLT50Y291bnQgPSAwOworCisgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJbmV4dF90aWNrID0gc3JvbV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCW5leHRfdGljayA9IGRjMjEwNDBfYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjEwNDEpIHsKKwluZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisgICAgfSBlbHNlIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJbmV4dF90aWNrID0gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKKyAgICB9CisKKyAgICBlbmFibGVfYXN0KGRldiwgbmV4dF90aWNrKTsKKyAgICAKKyAgICByZXR1cm4gKGxwLT5tZWRpYSk7Cit9CisKKy8qCisqKiBBdXRvY29uZmlndXJlIHRoZSBtZWRpYSB3aGVuIHVzaW5nIHRoZSBEQzIxMDQwLiBBVUkgY2Fubm90IGJlIGRpc3Rpbmd1aXNoZWQKKyoqIGZyb20gQk5DIGFzIHRoZSBwb3J0IGhhcyBhIGp1bXBlciB0byBzZXQgdGhpY2sgb3IgdGhpbiB3aXJlLiBXaGVuIHNldCBmb3IKKyoqIEJOQywgdGhlIEJOQyBwb3J0IHdpbGwgaW5kaWNhdGUgYWN0aXZpdHkgaWYgaXQncyBub3QgdGVybWluYXRlZCBjb3JyZWN0bHkuCisqKiBUaGUgb25seSB3YXkgdG8gdGVzdCBmb3IgdGhhdCBpcyB0byBwbGFjZSBhIGxvb3BiYWNrIHBhY2tldCBvbnRvIHRoZQorKiogbmV0d29yayBhbmQgd2F0Y2ggZm9yIGVycm9ycy4gU2luY2Ugd2UncmUgbWVzc2luZyB3aXRoIHRoZSBpbnRlcnJ1cHQgbWFzaworKiogcmVnaXN0ZXIsIGRpc2FibGUgdGhlIGJvYXJkIGludGVycnVwdHMgYW5kIGRvIG5vdCBhbGxvdyBhbnkgbW9yZSBwYWNrZXRzIHRvCisqKiBiZSBxdWV1ZWQgdG8gdGhlIGhhcmR3YXJlLiBSZS1lbmFibGUgZXZlcnl0aGluZyBvbmx5IHdoZW4gdGhlIG1lZGlhIGlzCisqKiBmb3VuZC4KKyoqIEkgbWF5IGhhdmUgdG8gImFnZSBvdXQiIGxvY2FsbHkgcXVldWVkIHBhY2tldHMgc28gdGhhdCB0aGUgaGlnaGVyIGxheWVyCisqKiB0aW1lb3V0cyBkb24ndCBlZmZlY3RpdmVseSBkdXBsaWNhdGUgcGFja2V0cyBvbiB0aGUgbmV0d29yay4KKyovCitzdGF0aWMgaW50CitkYzIxMDQwX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICBzMzIgaW1yOworICAgIAorICAgIHN3aXRjaCAobHAtPm1lZGlhKSB7CisgICAgY2FzZSBJTklUOgorCURJU0FCTEVfSVJRczsKKwlscC0+dHhfZW5hYmxlID0gTk87CisJbHAtPnRpbWVvdXQgPSAtMTsKKwlkZTR4NV9zYXZlX3NrYnMoZGV2KTsKKwlpZiAoKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykgfHwgKGxwLT5hdXRvc2Vuc2UgPT0gVFApKSB7CisJICAgIGxwLT5tZWRpYSA9IFRQOworCX0gZWxzZSBpZiAoKGxwLT5hdXRvc2Vuc2UgPT0gQk5DKSB8fCAobHAtPmF1dG9zZW5zZSA9PSBBVUkpIHx8IChscC0+YXV0b3NlbnNlID09IEJOQ19BVUkpKSB7CisJICAgIGxwLT5tZWRpYSA9IEJOQ19BVUk7CisJfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IEVYVF9TSUEpIHsKKwkgICAgbHAtPm1lZGlhID0gRVhUX1NJQTsKKwl9IGVsc2UgeworCSAgICBscC0+bWVkaWEgPSBOQzsKKwl9CisJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwluZXh0X3RpY2sgPSBkYzIxMDQwX2F1dG9jb25mKGRldik7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUDoKKwluZXh0X3RpY2sgPSBkYzIxMDQwX3N0YXRlKGRldiwgMHg4ZjAxLCAweGZmZmYsIDB4MDAwMCwgMzAwMCwgQk5DX0FVSSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBfU1VTUEVDVCwgdGVzdF90cCk7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUF9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBUUCwgdGVzdF90cCwgZGMyMTA0MF9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBCTkM6CisgICAgY2FzZSBBVUk6CisgICAgY2FzZSBCTkNfQVVJOgorCW5leHRfdGljayA9IGRjMjEwNDBfc3RhdGUoZGV2LCAweDhmMDksIDB4MDcwNSwgMHgwMDA2LCAzMDAwLCBFWFRfU0lBLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOQ19BVUlfU1VTUEVDVCwgcGluZ19tZWRpYSk7CisJYnJlYWs7CisJCisgICAgY2FzZSBCTkNfQVVJX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEJOQ19BVUksIHBpbmdfbWVkaWEsIGRjMjEwNDBfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgRVhUX1NJQToKKwluZXh0X3RpY2sgPSBkYzIxMDQwX3N0YXRlKGRldiwgMHgzMDQxLCAweDAwMDAsIDB4MDAwNiwgMzAwMCwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DLCBFWFRfU0lBX1NVU1BFQ1QsIHBpbmdfbWVkaWEpOworCWJyZWFrOworCQorICAgIGNhc2UgRVhUX1NJQV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBFWFRfU0lBLCBwaW5nX21lZGlhLCBkYzIxMDQwX2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIE5DOgorCS8qIGRlZmF1bHQgdG8gVFAgZm9yIGFsbCAqLworCXJlc2V0X2luaXRfc2lhKGRldiwgMHg4ZjAxLCAweGZmZmYsIDB4MDAwMCk7CisJaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnR4X2VuYWJsZSA9IE5POworCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbmV4dF90aWNrOworfQorCitzdGF0aWMgaW50CitkYzIxMDQwX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3IxMywgaW50IGNzcjE0LCBpbnQgY3NyMTUsIGludCB0aW1lb3V0LAorCSAgICAgIGludCBuZXh0X3N0YXRlLCBpbnQgc3VzcGVjdF9zdGF0ZSwgCisJICAgICAgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCkpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIGludCBsaW5rQmFkOworCisgICAgc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKyAgICBjYXNlIDA6CisJcmVzZXRfaW5pdF9zaWEoZGV2LCBjc3IxMywgY3NyMTQsIGNzcjE1KTsKKwlscC0+bG9jYWxfc3RhdGUrKzsKKwluZXh0X3RpY2sgPSA1MDA7CisJYnJlYWs7CisJICAgIAorICAgIGNhc2UgMToKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgbGlua0JhZCA9IGZuKGRldiwgdGltZW91dCk7CisJICAgIGlmIChsaW5rQmFkIDwgMCkgeworCQluZXh0X3RpY2sgPSBsaW5rQmFkICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAobGlua0JhZCAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkJICAgIGxwLT5tZWRpYSA9IG5leHRfc3RhdGU7CisJCX0gZWxzZSB7CisJCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCSAgICBscC0+bWVkaWEgPSBzdXNwZWN0X3N0YXRlOworCSAgICBuZXh0X3RpY2sgPSAzMDAwOworCX0KKwlicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworc3RhdGljIGludAorZGU0eDVfc3VzcGVjdF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdGltZW91dCwgaW50IHByZXZfc3RhdGUsCisJCSAgICAgIGludCAoKmZuKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpLAorCQkgICAgICBpbnQgKCphc2ZuKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgaW50IGxpbmtCYWQ7CisKKyAgICBzd2l0Y2ggKGxwLT5sb2NhbF9zdGF0ZSkgeworICAgIGNhc2UgMToKKwlpZiAobHAtPmxpbmtPSykgeworCSAgICBscC0+bWVkaWEgPSBwcmV2X3N0YXRlOworCX0gZWxzZSB7CisJICAgIGxwLT5sb2NhbF9zdGF0ZSsrOworCSAgICBuZXh0X3RpY2sgPSBhc2ZuKGRldik7CisJfQorCWJyZWFrOworCisgICAgY2FzZSAyOgorCWxpbmtCYWQgPSBmbihkZXYsIHRpbWVvdXQpOworCWlmIChsaW5rQmFkIDwgMCkgeworCSAgICBuZXh0X3RpY2sgPSBsaW5rQmFkICYgflRJTUVSX0NCOworCX0gZWxzZSBpZiAoIWxpbmtCYWQpIHsKKwkgICAgbHAtPmxvY2FsX3N0YXRlLS07CisJICAgIGxwLT5tZWRpYSA9IHByZXZfc3RhdGU7CisJfSBlbHNlIHsKKwkgICAgbHAtPm1lZGlhID0gSU5JVDsKKwkgICAgbHAtPnRjb3VudCsrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gbmV4dF90aWNrOworfQorCisvKgorKiogQXV0b2NvbmZpZ3VyZSB0aGUgbWVkaWEgd2hlbiB1c2luZyB0aGUgREMyMTA0MS4gQVVJIG5lZWRzIHRvIGJlIHRlc3RlZAorKiogYmVmb3JlIEJOQywgYmVjYXVzZSB0aGUgQk5DIHBvcnQgd2lsbCBpbmRpY2F0ZSBhY3Rpdml0eSBpZiBpdCdzIG5vdAorKiogdGVybWluYXRlZCBjb3JyZWN0bHkuIFRoZSBvbmx5IHdheSB0byB0ZXN0IGZvciB0aGF0IGlzIHRvIHBsYWNlIGEgbG9vcGJhY2sKKyoqIHBhY2tldCBvbnRvIHRoZSBuZXR3b3JrIGFuZCB3YXRjaCBmb3IgZXJyb3JzLiBTaW5jZSB3ZSdyZSBtZXNzaW5nIHdpdGgKKyoqIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciwgZGlzYWJsZSB0aGUgYm9hcmQgaW50ZXJydXB0cyBhbmQgZG8gbm90IGFsbG93CisqKiBhbnkgbW9yZSBwYWNrZXRzIHRvIGJlIHF1ZXVlZCB0byB0aGUgaGFyZHdhcmUuIFJlLWVuYWJsZSBldmVyeXRoaW5nIG9ubHkKKyoqIHdoZW4gdGhlIG1lZGlhIGlzIGZvdW5kLgorKi8KK3N0YXRpYyBpbnQKK2RjMjEwNDFfYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgc3RzLCBpcnFzLCBpcnFfbWFzaywgaW1yLCBvbXI7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICAKKyAgICBzd2l0Y2ggKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDoKKwlESVNBQkxFX0lSUXM7CisJbHAtPnR4X2VuYWJsZSA9IE5POworCWxwLT50aW1lb3V0ID0gLTE7CisJZGU0eDVfc2F2ZV9za2JzKGRldik7ICAgICAgICAgIC8qIFNhdmUgbm9uIHRyYW5zbWl0dGVkIHNrYidzICovCisJaWYgKChscC0+YXV0b3NlbnNlID09IEFVVE8pIHx8IChscC0+YXV0b3NlbnNlID09IFRQX05XKSkgeworCSAgICBscC0+bWVkaWEgPSBUUDsgICAgICAgICAgICAvKiBPbiBjaGlwIGF1dG8gbmVnb3RpYXRpb24gaXMgYnJva2VuICovCisJfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IFRQKSB7CisJICAgIGxwLT5tZWRpYSA9IFRQOworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBCTkMpIHsKKwkgICAgbHAtPm1lZGlhID0gQk5DOworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBBVUkpIHsKKwkgICAgbHAtPm1lZGlhID0gQVVJOworCX0gZWxzZSB7CisJICAgIGxwLT5tZWRpYSA9IE5DOworCX0KKwlscC0+bG9jYWxfc3RhdGUgPSAwOworCW5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKwlicmVhazsKKwkKKyAgICBjYXNlIFRQX05XOgorCWlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgb21yID0gaW5sKERFNFg1X09NUik7LyogU2V0IHVwIGZ1bGwgZHVwbGV4IGZvciB0aGUgYXV0b25lZ290aWF0ZSAqLworCSAgICBvdXRsKG9tciB8IE9NUl9GRFgsIERFNFg1X09NUik7CisJfQorCWlycXMgPSBTVFNfTE5GIHwgU1RTX0xOUDsKKwlpcnFfbWFzayA9IElNUl9MRk0gfCBJTVJfTFBNOworCXN0cyA9IHRlc3RfbWVkaWEoZGV2LCBpcnFzLCBpcnFfbWFzaywgMHhlZjAxLCAweGZmZmYsIDB4MDAwOCwgMjQwMCk7CisJaWYgKHN0cyA8IDApIHsKKwkgICAgbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCX0gZWxzZSB7CisJICAgIGlmIChzdHMgJiBTVFNfTE5QKSB7CisJCWxwLT5tZWRpYSA9IEFOUzsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPm1lZGlhID0gQVVJOworCSAgICB9CisJICAgIG5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBTlM6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGlycXMgPSBTVFNfTE5QOworCSAgICBpcnFfbWFzayA9IElNUl9MUE07CisJICAgIHN0cyA9IHRlc3RfYW5zKGRldiwgaXJxcywgaXJxX21hc2ssIDMwMDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKHN0cyAmIFNUU19MTlApICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCSAgICBscC0+bWVkaWEgPSBUUDsKKwkJICAgIG5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDE7CisJCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCSAgICBscC0+bWVkaWEgPSBBTlNfU1VTUEVDVDsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBTlNfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgQU5TLCB0ZXN0X3RwLCBkYzIxMDQxX2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIFRQOgorCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgICAgICAgICAvKiBTZXQgdXAgaGFsZiBkdXBsZXggZm9yIFRQICovCisJCW91dGwob21yICYgfk9NUl9GRFgsIERFNFg1X09NUik7CisJICAgIH0KKwkgICAgaXJxcyA9IFNUU19MTkYgfCBTVFNfTE5QOworCSAgICBpcnFfbWFzayA9IElNUl9MRk0gfCBJTVJfTFBNOworCSAgICBzdHMgPSB0ZXN0X21lZGlhKGRldixpcnFzLCBpcnFfbWFzaywgMHhlZjAxLCAweGZmM2YsIDB4MDAwOCwgMjQwMCk7CisJICAgIGlmIChzdHMgPCAwKSB7CisJCW5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCEoc3RzICYgU1RTX0xOUCkgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJICAgIGlmIChpbmwoREU0WDVfU0lTUikgJiBTSVNSX05SQSkgeworCQkJbHAtPm1lZGlhID0gQVVJOyAgICAgICAvKiBOb24gc2VsZWN0ZWQgcG9ydCBhY3Rpdml0eSAqLworCQkgICAgfSBlbHNlIHsKKwkJCWxwLT5tZWRpYSA9IEJOQzsKKwkJICAgIH0KKwkJICAgIG5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDE7CisJCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCSAgICBscC0+bWVkaWEgPSBUUF9TVVNQRUNUOworCSAgICBuZXh0X3RpY2sgPSAzMDAwOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIFRQX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIFRQLCB0ZXN0X3RwLCBkYzIxMDQxX2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEFVSToKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgICAgICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBBVUkgKi8KKwkJb3V0bChvbXIgJiB+T01SX0ZEWCwgREU0WDVfT01SKTsKKwkgICAgfQorCSAgICBpcnFzID0gMDsKKwkgICAgaXJxX21hc2sgPSAwOworCSAgICBzdHMgPSB0ZXN0X21lZGlhKGRldixpcnFzLCBpcnFfbWFzaywgMHhlZjA5LCAweGY3M2QsIDB4MDAwZSwgMTAwMCk7CisJICAgIGlmIChzdHMgPCAwKSB7CisJCW5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCEoaW5sKERFNFg1X1NJU1IpICYgU0lTUl9TUkEpICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCSAgICBscC0+bWVkaWEgPSBCTkM7CisJCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAxOworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gQVVJX1NVU1BFQ1Q7CisJICAgIG5leHRfdGljayA9IDMwMDA7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQVVJX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEFVSSwgcGluZ19tZWRpYSwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBCTkM6CisJc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKwljYXNlIDA6CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJb21yID0gaW5sKERFNFg1X09NUik7ICAgICAgICAgIC8qIFNldCB1cCBoYWxmIGR1cGxleCBmb3IgQk5DICovCisJCW91dGwob21yICYgfk9NUl9GRFgsIERFNFg1X09NUik7CisJICAgIH0KKwkgICAgaXJxcyA9IDA7CisJICAgIGlycV9tYXNrID0gMDsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDB4ZWYwOSwgMHhmNzNkLCAweDAwMDYsIDEwMDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWxwLT5sb2NhbF9zdGF0ZSsrOyAgICAgICAgICAgICAvKiBFbnN1cmUgbWVkaWEgY29ubmVjdGVkICovCisJCW5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSAxOgorCSAgICBpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkJaWYgKChzdHMgPSBwaW5nX21lZGlhKGRldiwgMzAwMCkpIDwgMCkgeworCQkgICAgbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCQl9IGVsc2UgeworCQkgICAgaWYgKHN0cykgeworCQkJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkJCWxwLT5tZWRpYSA9IE5DOworCQkgICAgfSBlbHNlIHsKKwkJCWRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJbHAtPm1lZGlhID0gQk5DX1NVU1BFQ1Q7CisJCW5leHRfdGljayA9IDMwMDA7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQk5DX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEJOQywgcGluZ19tZWRpYSwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBOQzoKKwlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgLyogU2V0IHVwIGZ1bGwgZHVwbGV4IGZvciB0aGUgYXV0b25lZ290aWF0ZSAqLworCW91dGwob21yIHwgT01SX0ZEWCwgREU0WDVfT01SKTsKKwlyZXNldF9pbml0X3NpYShkZXYsIDB4ZWYwMSwgMHhmZmZmLCAweDAwMDgpOy8qIEluaXRpYWxpc2UgdGhlIFNJQSAqLworCWlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50eF9lbmFibGUgPSBOTzsKKwlicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworLyoKKyoqIFNvbWUgYXV0b25lZ290aWF0aW9uIGNoaXBzIGFyZSBicm9rZW4gaW4gdGhhdCB0aGV5IGRvIG5vdCByZXR1cm4gdGhlCisqKiBhY2tub3dsZWRnZSBiaXQgKGFubHBhICYgTUlJX0FOTFBBX0FDSykgaW4gdGhlIGxpbmsgcGFydG5lciBhZHZlcnRpc2VtZW50CisqKiByZWdpc3RlciwgZXhjZXB0IGF0IHRoZSBmaXJzdCBwb3dlciB1cCBuZWdvdGlhdGlvbi4KKyovCitzdGF0aWMgaW50CitkYzIxMTQwbV9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGFuYSwgYW5scGEsIGNhcCwgY3IsIHNsbmssIHNyOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgdV9sb25nIGltciwgb21yLCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBzd2l0Y2gobHAtPm1lZGlhKSB7CisgICAgY2FzZSBJTklUOiAKKyAgICAgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCSAgICBESVNBQkxFX0lSUXM7CisJICAgIGxwLT50eF9lbmFibGUgPSBGQUxTRTsKKwkgICAgbHAtPmxpbmtPSyA9IDA7CisJICAgIGRlNHg1X3NhdmVfc2ticyhkZXYpOyAgICAgICAgICAvKiBTYXZlIG5vbiB0cmFuc21pdHRlZCBza2IncyAqLworCX0KKwlpZiAoKG5leHRfdGljayA9IGRlNHg1X3Jlc2V0X3BoeShkZXYpKSA8IDApIHsKKwkgICAgbmV4dF90aWNrICY9IH5USU1FUl9DQjsKKwl9IGVsc2UgeworCSAgICBpZiAobHAtPnVzZVNST00pIHsKKwkJaWYgKHNyb21fbWFwX21lZGlhKGRldikgPCAwKSB7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICByZXR1cm4gbmV4dF90aWNrOworCQl9CisJCXNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0uZ2VwKTsKKwkJaWYgKGxwLT5pbmZvYmxvY2tfbWVkaWEgPT0gQU5TKSB7CisJCSAgICBhbmEgPSBscC0+cGh5W2xwLT5hY3RpdmVdLmFuYSB8IE1JSV9BTkFfQ1NNQTsKKwkJICAgIG1paV93cihhbmEsIE1JSV9BTkEsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlscC0+dG1wID0gTUlJX1NSX0FTU0M7ICAgICAvKiBGYWtlIG91dCB0aGUgTUlJIHNwZWVkIHNldCAqLworCQlTRVRfMTBNYjsKKwkJaWYgKGxwLT5hdXRvc2Vuc2UgPT0gXzEwME1iKSB7CisJCSAgICBscC0+bWVkaWEgPSBfMTAwTWI7CisJCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBfMTBNYikgeworCQkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJCX0gZWxzZSBpZiAoKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykgJiYgCisJCQkgICAgICAgICAgICAoKHNyPWlzX2FuY19jYXBhYmxlKGRldikpICYgTUlJX1NSX0FOQykpIHsKKwkJICAgIGFuYSA9ICgoKHNyID4+IDYpICYgTUlJX0FOQV9UQUYpIHwgTUlJX0FOQV9DU01BKTsKKwkJICAgIGFuYSAmPSAobHAtPmZkeCA/IH4wIDogfk1JSV9BTkFfRkRBTSk7CisJCSAgICBtaWlfd3IoYW5hLCBNSUlfQU5BLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBscC0+bWVkaWEgPSBBTlM7CisJCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSB7CisJCSAgICBscC0+bWVkaWEgPSBTUERfREVUOworCQl9IGVsc2UgaWYgKGlzX3NwZF8xMDAoZGV2KSAmJiBpc18xMDBfdXAoZGV2KSkgeworCQkgICAgbHAtPm1lZGlhID0gXzEwME1iOworCQl9IGVsc2UgeworCQkgICAgbHAtPm1lZGlhID0gTkM7CisJCX0KKwkgICAgfQorCSAgICBscC0+bG9jYWxfc3RhdGUgPSAwOworCSAgICBuZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEFOUzoKKwlzd2l0Y2ggKGxwLT5sb2NhbF9zdGF0ZSkgeworCWNhc2UgMDoKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQltaWlfd3IoTUlJX0NSX0FTU0UgfCBNSUlfQ1JfUkFOLCBNSUlfQ1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkgICAgfQorCSAgICBjciA9IHRlc3RfbWlpX3JlZyhkZXYsIE1JSV9DUiwgTUlJX0NSX1JBTiwgRkFMU0UsIDUwMCk7CisJICAgIGlmIChjciA8IDApIHsKKwkJbmV4dF90aWNrID0gY3IgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmIChjcikgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkJICAgIGxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUrKzsKKwkJfQorCQluZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgICAKKwljYXNlIDE6CisJICAgIGlmICgoc3I9dGVzdF9taWlfcmVnKGRldiwgTUlJX1NSLCBNSUlfU1JfQVNTQywgVFJVRSwgMjAwMCkpIDwgMCkgeworCQluZXh0X3RpY2sgPSBzciAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkJaWYgKHNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MhICovCisJCSAgICBscC0+dG1wID0gTUlJX1NSX0FTU0M7CisJCSAgICBhbmxwYSA9IG1paV9yZChNSUlfQU5MUEEsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkJICAgIGFuYSA9IG1paV9yZChNSUlfQU5BLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBpZiAoIShhbmxwYSAmIE1JSV9BTkxQQV9SRikgJiYgCisJCQkgKGNhcCA9IGFubHBhICYgTUlJX0FOTFBBX1RBRiAmIGFuYSkpIHsKKwkJCWlmIChjYXAgJiBNSUlfQU5BXzEwME0pIHsKKwkJCSAgICBscC0+ZmR4ID0gKChhbmEgJiBhbmxwYSAmIE1JSV9BTkFfRkRBTSAmIE1JSV9BTkFfMTAwTSkgPyBUUlVFIDogRkFMU0UpOworCQkJICAgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkJCX0gZWxzZSBpZiAoY2FwICYgTUlJX0FOQV8xME0pIHsKKwkJCSAgICBscC0+ZmR4ID0gKChhbmEgJiBhbmxwYSAmIE1JSV9BTkFfRkRBTSAmIE1JSV9BTkFfMTBNKSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJCSAgICBscC0+bWVkaWEgPSBfMTBNYjsKKwkJCX0KKwkJICAgIH0KKwkJfSAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBmYWlsZWQgdG8gZmluaXNoICovCisJCW5leHRfdGljayA9IGRjMjExNDBtX2F1dG9jb25mKGRldik7CisJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIGZhaWxlZCB0byBzdGFydCAqLworCSAgICBicmVhazsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBTUERfREVUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENob29zZSAxME1iL3Mgb3IgMTAwTWIvcyAqLworICAgICAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJICAgIGxwLT50bXAgPSAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCA/IE1JSV9TUl9MS1MgOiAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+Z2VwX3JkKGRldikgJiBHRVBfTE5QKSk7CisJICAgIFNFVF8xMDBNYl9QREVUOworCX0KKyAgICAgICAgaWYgKChzbG5rID0gdGVzdF9mb3JfMTAwTWIoZGV2LCA2NTAwKSkgPCAwKSB7CisJICAgIG5leHRfdGljayA9IHNsbmsgJiB+VElNRVJfQ0I7CisJfSBlbHNlIHsKKwkgICAgaWYgKGlzX3NwZF8xMDAoZGV2KSAmJiBpc18xMDBfdXAoZGV2KSkgeworCQlscC0+bWVkaWEgPSBfMTAwTWI7CisJICAgIH0gZWxzZSBpZiAoKCFpc19zcGRfMTAwKGRldikgJiYgKGlzXzEwX3VwKGRldikgJiBscC0+dG1wKSkpIHsKKwkJbHAtPm1lZGlhID0gXzEwTWI7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IE5DOworCSAgICB9CisJICAgIG5leHRfdGljayA9IGRjMjExNDBtX2F1dG9jb25mKGRldik7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgXzEwME1iOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgMTAwTWIvcyAqLworICAgICAgICBuZXh0X3RpY2sgPSAzMDAwOworCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBTRVRfMTAwTWI7CisJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCX0gZWxzZSB7CisJICAgIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQlpZiAoIWlzXzEwMF91cChkZXYpIHx8ICghbHAtPnVzZVNST00gJiYgIWlzX3NwZF8xMDAoZGV2KSkpIHsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIGNhc2UgQk5DOgorICAgIGNhc2UgQVVJOgorICAgIGNhc2UgXzEwTWI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgMTBNYi9zICovCisgICAgICAgIG5leHRfdGljayA9IDMwMDA7CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIFNFVF8xME1iOworCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJaWYgKCFpc18xMF91cChkZXYpIHx8ICghbHAtPnVzZVNST00gJiYgaXNfc3BkXzEwMChkZXYpKSkgeworCQkgICAgbHAtPm1lZGlhID0gSU5JVDsKKwkJICAgIGxwLT50Y291bnQrKzsKKwkJICAgIG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKwkJfQorCSAgICB9CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgTkM6CisgICAgICAgIGlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50eF9lbmFibGUgPSBGQUxTRTsKKwlicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworLyoKKyoqIFRoaXMgcm91dGluZSBtYXkgYmUgbWVyZ2VkIGludG8gZGMyMTE0MG1fYXV0b2NvbmYoKSBzb21ldGltZSBhcyBJJ20KKyoqIGNoYW5naW5nIGhvdyBJIGZpZ3VyZSBvdXQgdGhlIG1lZGlhIC0gYnV0IHRyeWluZyB0byBrZWVwIGl0IGJhY2t3YXJkcworKiogY29tcGF0aWJsZSB3aXRoIHRoZSBkZTUwMC14YSBhbmQgZGU1MDAtYWEuCisqKiBXaGV0aGVyIGl0J3MgQk5DLCBBVUksIFNZTSBvciBNSUkgaXMgc29ydGVkIG91dCBpbiB0aGUgaW5mb2Jsb2NrCisqKiBmdW5jdGlvbnMgYW5kIHNldCBkdXJpbmcgZGU0eDVfbWFjX3BvcnQoKSBhbmQvb3IgZGU0eDVfcmVzZXRfcGh5KCkuCisqKiBUaGlzIHJvdXRpbmUganVzdCBoYXMgdG8gZmlndXJlIG91dCB3aGV0aGVyIDEwTWIvcyBvciAxMDBNYi9zIGlzCisqKiBhY3RpdmUuCisqKiBXaGVuIGF1dG9uZWdvdGlhdGlvbiBpcyB3b3JraW5nLCB0aGUgQU5TIHBhcnQgc2VhcmNoZXMgdGhlIFNST00gZm9yCisqKiB0aGUgaGlnaGVzdCBjb21tb24gc3BlZWQgKFRQKSBsaW5rIHRoYXQgYm90aCBjYW4gcnVuIGFuZCBpZiB0aGF0IGNhbgorKiogYmUgZnVsbCBkdXBsZXguIFRoYXQgaW5mb2Jsb2NrIGlzIGV4ZWN1dGVkIGFuZCB0aGVuIHRoZSBsaW5rIHNwZWVkIHNldC4KKyoqCisqKiBPbmx5IF8xME1iIGFuZCBfMTAwTWIgYXJlIHRlc3RlZCBoZXJlLgorKi8KK3N0YXRpYyBpbnQKK2RjMjExNHhfYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgY3IsIGFubHBhLCBhbmEsIGNhcCwgaXJxcywgaXJxX21hc2ssIGltciwgb21yLCBzbG5rLCBzciwgc3RzOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisKKyAgICBzd2l0Y2ggKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDoKKyAgICAgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCSAgICBESVNBQkxFX0lSUXM7CisJICAgIGxwLT50eF9lbmFibGUgPSBGQUxTRTsKKwkgICAgbHAtPmxpbmtPSyA9IDA7CisgICAgICAgICAgICBscC0+dGltZW91dCA9IC0xOworCSAgICBkZTR4NV9zYXZlX3NrYnMoZGV2KTsgICAgICAgICAgICAvKiBTYXZlIG5vbiB0cmFuc21pdHRlZCBza2IncyAqLworCSAgICBpZiAobHAtPnBhcmFtcy5hdXRvc2Vuc2UgJiB+QVVUTykgeworCQlzcm9tX21hcF9tZWRpYShkZXYpOyAgICAgICAgIC8qIEZpeGVkIG1lZGlhIHJlcXVlc3RlZCAgICAgICovCisJCWlmIChscC0+bWVkaWEgIT0gbHAtPnBhcmFtcy5hdXRvc2Vuc2UpIHsKKwkJICAgIGxwLT50Y291bnQrKzsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICByZXR1cm4gbmV4dF90aWNrOworCQl9CisJCWxwLT5tZWRpYSA9IElOSVQ7CisJICAgIH0KKwl9CisJaWYgKChuZXh0X3RpY2sgPSBkZTR4NV9yZXNldF9waHkoZGV2KSkgPCAwKSB7CisJICAgIG5leHRfdGljayAmPSB+VElNRVJfQ0I7CisJfSBlbHNlIHsKKwkgICAgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gXzEwME1iKSB7CisJCWxwLT5tZWRpYSA9IF8xMDBNYjsKKwkgICAgfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IF8xME1iKSB7CisJCWxwLT5tZWRpYSA9IF8xME1iOworCSAgICB9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gVFApIHsKKwkJbHAtPm1lZGlhID0gVFA7CisJICAgIH0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBCTkMpIHsKKwkJbHAtPm1lZGlhID0gQk5DOworCSAgICB9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVJKSB7CisJCWxwLT5tZWRpYSA9IEFVSTsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJaWYgKChscC0+aW5mb2Jsb2NrX21lZGlhID09IEFOUykgJiYgCisJCSAgICAgICAgICAgICAgICAgICAgKChzcj1pc19hbmNfY2FwYWJsZShkZXYpKSAmIE1JSV9TUl9BTkMpKSB7CisJCSAgICBhbmEgPSAoKChzciA+PiA2KSAmIE1JSV9BTkFfVEFGKSB8IE1JSV9BTkFfQ1NNQSk7CisJCSAgICBhbmEgJj0gKGxwLT5mZHggPyB+MCA6IH5NSUlfQU5BX0ZEQU0pOworCQkgICAgbWlpX3dyKGFuYSwgTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgbHAtPm1lZGlhID0gQU5TOworCQl9CisJICAgIH0KKwkgICAgbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkgICAgbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworICAgICAgICB9CisJYnJlYWs7CisJCisgICAgY2FzZSBBTlM6CisJc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKwljYXNlIDA6CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJbWlpX3dyKE1JSV9DUl9BU1NFIHwgTUlJX0NSX1JBTiwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJICAgIH0KKwkgICAgY3IgPSB0ZXN0X21paV9yZWcoZGV2LCBNSUlfQ1IsIE1JSV9DUl9SQU4sIEZBTFNFLCA1MDApOworCSAgICBpZiAoY3IgPCAwKSB7CisJCW5leHRfdGljayA9IGNyICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoY3IpIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCSAgICBscC0+bWVkaWEgPSBTUERfREVUOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlKys7CisJCX0KKwkJbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgICAKKwljYXNlIDE6CisJICAgIGlmICgoc3I9dGVzdF9taWlfcmVnKGRldiwgTUlJX1NSLCBNSUlfU1JfQVNTQywgVFJVRSwgMjAwMCkpIDwgMCkgeworCQluZXh0X3RpY2sgPSBzciAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkJaWYgKHNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MhICovCisJCSAgICBscC0+dG1wID0gTUlJX1NSX0FTU0M7CisJCSAgICBhbmxwYSA9IG1paV9yZChNSUlfQU5MUEEsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkJICAgIGFuYSA9IG1paV9yZChNSUlfQU5BLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBpZiAoIShhbmxwYSAmIE1JSV9BTkxQQV9SRikgJiYgCisJCQkgKGNhcCA9IGFubHBhICYgTUlJX0FOTFBBX1RBRiAmIGFuYSkpIHsKKwkJCWlmIChjYXAgJiBNSUlfQU5BXzEwME0pIHsKKwkJCSAgICBscC0+ZmR4ID0gKChhbmEgJiBhbmxwYSAmIE1JSV9BTkFfRkRBTSAmIE1JSV9BTkFfMTAwTSkgPyBUUlVFIDogRkFMU0UpOworCQkJICAgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkJCX0gZWxzZSBpZiAoY2FwICYgTUlJX0FOQV8xME0pIHsKKwkJCSAgICBscC0+ZmR4ID0gKChhbmEgJiBhbmxwYSAmIE1JSV9BTkFfRkRBTSAmIE1JSV9BTkFfMTBNKSA/IFRSVUUgOiBGQUxTRSk7CisJCQkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJCQl9CisJCSAgICB9CisJCX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gZmFpbGVkIHRvIGZpbmlzaCAqLworCQluZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIGZhaWxlZCB0byBzdGFydCAgKi8KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBBVUk6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJb21yID0gaW5sKERFNFg1X09NUik7ICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBBVUkgICAgICAgICovCisJCW91dGwob21yICYgfk9NUl9GRFgsIERFNFg1X09NUik7CisJICAgIH0KKwkgICAgaXJxcyA9IDA7CisJICAgIGlycV9tYXNrID0gMDsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDAsIDAsIDAsIDEwMDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKGlubChERTRYNV9TSVNSKSAmIFNJU1JfU1JBKSAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPm1lZGlhID0gQk5DOworCQkgICAgbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlID0gMTsKKwkJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJICAgIGxwLT5tZWRpYSA9IEFVSV9TVVNQRUNUOworCSAgICBuZXh0X3RpY2sgPSAzMDAwOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEFVSV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBBVUksIHBpbmdfbWVkaWEsIGRjMjExNHhfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DOgorCXN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisJY2FzZSAwOgorCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgICAgICAgICAvKiBTZXQgdXAgaGFsZiBkdXBsZXggZm9yIEJOQyAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSAwOworCSAgICBpcnFfbWFzayA9IDA7CisJICAgIHN0cyA9IHRlc3RfbWVkaWEoZGV2LGlycXMsIGlycV9tYXNrLCAwLCAwLCAwLCAxMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlscC0+bG9jYWxfc3RhdGUrKzsgICAgICAgICAgICAgLyogRW5zdXJlIG1lZGlhIGNvbm5lY3RlZCAqLworCQluZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgMToKKwkgICAgaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJCWlmICgoc3RzID0gcGluZ19tZWRpYShkZXYsIDMwMDApKSA8IDApIHsKKwkJICAgIG5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChzdHMpIHsKKwkJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCQlscC0+dGNvdW50Kys7CisJCQlscC0+bWVkaWEgPSBJTklUOworCQkgICAgfSBlbHNlIHsKKwkJCWRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJbHAtPm1lZGlhID0gQk5DX1NVU1BFQ1Q7CisJCW5leHRfdGljayA9IDMwMDA7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQk5DX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEJOQywgcGluZ19tZWRpYSwgZGMyMTE0eF9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBTUERfREVUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENob29zZSAxME1iL3Mgb3IgMTAwTWIvcyAqLworCSAgaWYgKHNyb21fbWFwX21lZGlhKGRldikgPCAwKSB7CisJICAgICAgbHAtPnRjb3VudCsrOworCSAgICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJICAgICAgcmV0dXJuIG5leHRfdGljazsKKwkgIH0KKwkgIGlmIChscC0+bWVkaWEgPT0gXzEwME1iKSB7CisJICAgICAgaWYgKChzbG5rID0gdGVzdF9mb3JfMTAwTWIoZGV2LCA2NTAwKSkgPCAwKSB7CisJCSAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJICByZXR1cm4gIChzbG5rICYgflRJTUVSX0NCKTsKKwkgICAgICB9CisJICB9IGVsc2UgeworCSAgICAgIGlmICh3YWl0X2Zvcl9saW5rKGRldikgPCAwKSB7CisJCSAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJICByZXR1cm4gUERFVF9MSU5LX1dBSVQ7CisJICAgICAgfQorCSAgfQorCSAgaWYgKGxwLT5tZWRpYSA9PSBBTlMpIHsgICAgICAgICAgIC8qIERvIE1JSSBwYXJhbGxlbCBkZXRlY3Rpb24gKi8KKwkgICAgICBpZiAoaXNfc3BkXzEwMChkZXYpKSB7CisJCSAgbHAtPm1lZGlhID0gXzEwME1iOworCSAgICAgIH0gZWxzZSB7CisJCSAgbHAtPm1lZGlhID0gXzEwTWI7CisJICAgICAgfQorCSAgICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkgIH0gZWxzZSBpZiAoKChscC0+bWVkaWEgPT0gXzEwME1iKSAmJiBpc18xMDBfdXAoZGV2KSkgfHwKKwkJICAgICAoKChscC0+bWVkaWEgPT0gXzEwTWIpIHx8IChscC0+bWVkaWEgPT0gVFApIHx8CisJCSAgICAgICAobHAtPm1lZGlhID09IEJOQykgICB8fCAobHAtPm1lZGlhID09IEFVSSkpICYmIAorCQkgICAgICBpc18xMF91cChkZXYpKSkgeworCSAgICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkgIH0gZWxzZSB7CisJICAgICAgbHAtPnRjb3VudCsrOworCSAgICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJICB9CisJICBicmVhazsKKwkKKyAgICBjYXNlIF8xME1iOgorICAgICAgICBuZXh0X3RpY2sgPSAzMDAwOworCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBTRVRfMTBNYjsKKwkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJfSBlbHNlIHsKKwkgICAgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWlmICghaXNfMTBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmIGlzX3NwZF8xMDAoZGV2KSkpIHsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIGNhc2UgXzEwME1iOgorICAgICAgICBuZXh0X3RpY2sgPSAzMDAwOworCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBTRVRfMTAwTWI7CisJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCX0gZWxzZSB7CisJICAgIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQlpZiAoIWlzXzEwMF91cChkZXYpIHx8ICghbHAtPnVzZVNST00gJiYgIWlzX3NwZF8xMDAoZGV2KSkpIHsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJbHAtPnRjb3VudCsrOworcHJpbnRrKCJIdWg/OiBtZWRpYTolMDJ4XG4iLCBscC0+bWVkaWEpOworCWxwLT5tZWRpYSA9IElOSVQ7CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKK3N0YXRpYyBpbnQKK3Nyb21fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgcmV0dXJuIGxwLT5pbmZvbGVhZl9mbihkZXYpOworfQorCisvKgorKiogVGhpcyBtYXBwaW5nIGtlZXBzIHRoZSBvcmlnaW5hbCBtZWRpYSBjb2RlcyBhbmQgRkRYIGZsYWcgdW5jaGFuZ2VkLgorKiogV2hpbGUgaXQgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBpdCBoZWxwcyBtZSBmb3IgdGhlIG1vbWVudC4uLgorKiogVGhlIGVhcmx5IHJldHVybiBhdm9pZHMgYSBtZWRpYSBzdGF0ZSAvIFNST00gbWVkaWEgc3BhY2UgY2xhc2guCisqLworc3RhdGljIGludAorc3JvbV9tYXBfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgbHAtPmZkeCA9IDA7CisgICAgaWYgKGxwLT5pbmZvYmxvY2tfbWVkaWEgPT0gbHAtPm1lZGlhKSAKKyAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKGxwLT5pbmZvYmxvY2tfbWVkaWEpIHsKKyAgICAgIGNhc2UgU1JPTV8xMEJBU0VURjoKKwlpZiAoIWxwLT5wYXJhbXMuZmR4KSByZXR1cm4gLTE7CisJbHAtPmZkeCA9IFRSVUU7CisgICAgICBjYXNlIFNST01fMTBCQVNFVDoKKwlpZiAobHAtPnBhcmFtcy5mZHggJiYgIWxwLT5mZHgpIHJldHVybiAtMTsKKwlpZiAoKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHx8ICgobHAtPmNoaXBzZXQgJiB+MHgwMGZmKSA9PSBEQzIxMTR4KSkgeworCSAgICBscC0+bWVkaWEgPSBfMTBNYjsKKwl9IGVsc2UgeworCSAgICBscC0+bWVkaWEgPSBUUDsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU1JPTV8xMEJBU0UyOgorCWxwLT5tZWRpYSA9IEJOQzsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwQkFTRTU6CisJbHAtPm1lZGlhID0gQVVJOworCWJyZWFrOworCisgICAgICBjYXNlIFNST01fMTAwQkFTRVRGOgorICAgICAgICBpZiAoIWxwLT5wYXJhbXMuZmR4KSByZXR1cm4gLTE7CisJbHAtPmZkeCA9IFRSVUU7CisgICAgICBjYXNlIFNST01fMTAwQkFTRVQ6CisJaWYgKGxwLT5wYXJhbXMuZmR4ICYmICFscC0+ZmR4KSByZXR1cm4gLTE7CisJbHAtPm1lZGlhID0gXzEwME1iOworCWJyZWFrOworCisgICAgICBjYXNlIFNST01fMTAwQkFTRVQ0OgorCWxwLT5tZWRpYSA9IF8xMDBNYjsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VGRjoKKwlpZiAoIWxwLT5wYXJhbXMuZmR4KSByZXR1cm4gLTE7CisJbHAtPmZkeCA9IFRSVUU7CisgICAgICBjYXNlIFNST01fMTAwQkFTRUY6IAorCWlmIChscC0+cGFyYW1zLmZkeCAmJiAhbHAtPmZkeCkgcmV0dXJuIC0xOworCWxwLT5tZWRpYSA9IF8xMDBNYjsKKwlicmVhazsKKworICAgICAgY2FzZSBBTlM6CisJbHAtPm1lZGlhID0gQU5TOworCWxwLT5mZHggPSBscC0+cGFyYW1zLmZkeDsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDogCisJcHJpbnRrKCIlczogQmFkIG1lZGlhIGNvZGUgWyVkXSBkZXRlY3RlZCBpbiBTUk9NIVxuIiwgZGV2LT5uYW1lLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5pbmZvYmxvY2tfbWVkaWEpOworCXJldHVybiAtMTsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2luaXRfY29ubmVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfbG9uZyBmbGFncyA9IDA7CisKKyAgICBpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisgICAgICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCWxwLT5jX21lZGlhID0gbHAtPm1lZGlhOyAgICAgICAgICAvKiBTdG9wIHNjcm9sbGluZyBtZWRpYSBtZXNzYWdlcyAqLworICAgIH0KKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGRlNHg1X3JzdF9kZXNjX3JpbmcoZGV2KTsKKyAgICBkZTR4NV9zZXR1cF9pbnRyKGRldik7CisgICAgbHAtPnR4X2VuYWJsZSA9IFlFUzsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7CisKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBHZW5lcmFsIFBIWSByZXNldCBmdW5jdGlvbi4gU29tZSBNSUkgZGV2aWNlcyBkb24ndCByZXNldCBjb3JyZWN0bHkKKyoqIHNpbmNlIHRoZWlyIE1JSSBhZGRyZXNzIHBpbnMgY2FuIGZsb2F0IGF0IHZvbHRhZ2VzIHRoYXQgYXJlIGRlcGVuZGVudAorKiogb24gdGhlIHNpZ25hbCBwaW4gdXNlLiBEbyBhIGRvdWJsZSByZXNldCB0byBlbnN1cmUgYSByZXNldC4KKyovCitzdGF0aWMgaW50CitkZTR4NV9yZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgbmV4dF90aWNrID0gMDsKKworICAgIGlmICgobHAtPnVzZVNST00pIHx8IChscC0+cGh5W2xwLT5hY3RpdmVdLmlkKSkgeworCWlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJCWlmIChscC0+cGh5W2xwLT5hY3RpdmVdLnJzdCkgeworCQkgICAgc3JvbV9leGVjKGRldiwgbHAtPnBoeVtscC0+YWN0aXZlXS5yc3QpOworCQkgICAgc3JvbV9leGVjKGRldiwgbHAtPnBoeVtscC0+YWN0aXZlXS5yc3QpOworCQl9IGVsc2UgaWYgKGxwLT5yc3QpIHsgICAgICAgICAgLyogVHlwZSA1IGluZm9ibG9jayByZXNldCAqLworCQkgICAgc3JvbV9leGVjKGRldiwgbHAtPnJzdCk7CisJCSAgICBzcm9tX2V4ZWMoZGV2LCBscC0+cnN0KTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlQSFlfSEFSRF9SRVNFVDsKKwkgICAgfQorCSAgICBpZiAobHAtPnVzZU1JSSkgeworCSAgICAgICAgbWlpX3dyKE1JSV9DUl9SU1QsIE1JSV9DUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisJaWYgKGxwLT51c2VNSUkpIHsKKwkgICAgbmV4dF90aWNrID0gdGVzdF9taWlfcmVnKGRldiwgTUlJX0NSLCBNSUlfQ1JfUlNULCBGQUxTRSwgNTAwKTsKKwl9CisgICAgfSBlbHNlIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJUEhZX0hBUkRfUkVTRVQ7CisgICAgfQorCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworc3RhdGljIGludAordGVzdF9tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgaXJxcywgczMyIGlycV9tYXNrLCBzMzIgY3NyMTMsIHMzMiBjc3IxNCwgczMyIGNzcjE1LCBzMzIgbXNlYykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgc3RzLCBjc3IxMjsKKyAgICAKKyAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJbHAtPnRpbWVvdXQgPSBtc2VjLzEwMDsKKwlpZiAoIWxwLT51c2VTUk9NKSB7ICAgICAgLyogQWxyZWFkeSBkb25lIGlmIGJ5IFNST00sIGVsc2UgZGMyMTA0WzAxXSAqLworCSAgICByZXNldF9pbml0X3NpYShkZXYsIGNzcjEzLCBjc3IxNCwgY3NyMTUpOworCX0KKworCS8qIHNldCB1cCB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwlvdXRsKGlycV9tYXNrLCBERTRYNV9JTVIpOworCisJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN0cyA9IGlubChERTRYNV9TVFMpOworCW91dGwoc3RzLCBERTRYNV9TVFMpOworCQorCS8qIGNsZWFyIGNzcjEyIE5SQSBhbmQgU1JBIGJpdHMgKi8KKwlpZiAoKGxwLT5jaGlwc2V0ID09IERDMjEwNDEpIHx8IGxwLT51c2VTUk9NKSB7CisJICAgIGNzcjEyID0gaW5sKERFNFg1X1NJU1IpOworCSAgICBvdXRsKGNzcjEyLCBERTRYNV9TSVNSKTsKKwl9CisgICAgfQorICAgIAorICAgIHN0cyA9IGlubChERTRYNV9TVFMpICYgflRJTUVSX0NCOworICAgIAorICAgIGlmICghKHN0cyAmIGlycXMpICYmIC0tbHAtPnRpbWVvdXQpIHsKKwlzdHMgPSAxMDAgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWxwLT50aW1lb3V0ID0gLTE7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdHM7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfdHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHNpc3I7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisgICAgfQorICAgIAorICAgIHNpc3IgPSAoaW5sKERFNFg1X1NJU1IpICYgflRJTUVSX0NCKSAmIChTSVNSX0xLRiB8IFNJU1JfTkNSKTsKKworICAgIGlmIChzaXNyICYmIC0tbHAtPnRpbWVvdXQpIHsKKwlzaXNyID0gMTAwIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc2lzcjsKK30KKworLyoKKyoqIFNhbXBsZXMgdGhlIDEwME1iIExpbmsgU3RhdGUgU2lnbmFsLiBUaGUgc2FtcGxlIGludGVydmFsIGlzIGltcG9ydGFudAorKiogYmVjYXVzZSB0b28gZmFzdCBhIHJhdGUgY2FuIGdpdmUgZXJyb25lb3VzIHJlc3VsdHMgYW5kIGNvbmZ1c2UgdGhlCisqKiBzcGVlZCBzZW5zZSBhbGdvcml0aG0uCisqLworI2RlZmluZSBTQU1QTEVfSU5URVJWQUwgNTAwICAvKiBtcyAqLworI2RlZmluZSBTQU1QTEVfREVMQVkgICAgMjAwMCAvKiBtcyAqLworc3RhdGljIGludAordGVzdF9mb3JfMTAwTWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgZ2VwID0gMCwgcmV0ID0gKChscC0+Y2hpcHNldCAmIH4weDAwZmYpPT1EQzIxMTR4PyAtMSA6R0VQX1NMTkspOworCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWlmICgobXNlYy9TQU1QTEVfSU5URVJWQUwpIDw9IDApIHJldHVybiAwOworCWlmIChtc2VjID4gU0FNUExFX0RFTEFZKSB7CisJICAgIGxwLT50aW1lb3V0ID0gKG1zZWMgLSBTQU1QTEVfREVMQVkpL1NBTVBMRV9JTlRFUlZBTDsKKwkgICAgZ2VwID0gU0FNUExFX0RFTEFZIHwgVElNRVJfQ0I7CisJICAgIHJldHVybiBnZXA7CisJfSBlbHNlIHsKKwkgICAgbHAtPnRpbWVvdXQgPSBtc2VjL1NBTVBMRV9JTlRFUlZBTDsKKwl9CisgICAgfQorICAgIAorICAgIGlmIChscC0+cGh5W2xwLT5hY3RpdmVdLmlkIHx8IGxwLT51c2VTUk9NKSB7CisJZ2VwID0gaXNfMTAwX3VwKGRldikgfCBpc19zcGRfMTAwKGRldik7CisgICAgfSBlbHNlIHsKKwlnZXAgPSAofmdlcF9yZChkZXYpICYgKEdFUF9TTE5LIHwgR0VQX0xOUCkpOworICAgIH0KKyAgICBpZiAoIShnZXAgJiByZXQpICYmIC0tbHAtPnRpbWVvdXQpIHsKKwlnZXAgPSBTQU1QTEVfSU5URVJWQUwgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWxwLT50aW1lb3V0ID0gLTE7CisgICAgfQorICAgIAorICAgIHJldHVybiBnZXA7Cit9CisKK3N0YXRpYyBpbnQKK3dhaXRfZm9yX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gMTsKKyAgICB9CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0LS0pIHsKKwlyZXR1cm4gVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyoqCisqKgorKi8KK3N0YXRpYyBpbnQKK3Rlc3RfbWlpX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVnLCBpbnQgbWFzaywgaW50IHBvbCwgbG9uZyBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IHRlc3Q7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IG1zZWMvMTAwOworICAgIH0KKyAgICAKKyAgICBpZiAocG9sKSBwb2wgPSB+MDsKKyAgICByZWcgPSBtaWlfcmQoKHVfY2hhcilyZWcsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKSAmIG1hc2s7CisgICAgdGVzdCA9IChyZWcgXiBwb2wpICYgbWFzazsKKyAgICAKKyAgICBpZiAodGVzdCAmJiAtLWxwLT50aW1lb3V0KSB7CisJcmVnID0gMTAwIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50Citpc19zcGRfMTAwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHNwZDsKKyAgICAKKyAgICBpZiAobHAtPnVzZU1JSSkgeworCXNwZCA9IG1paV9yZChscC0+cGh5W2xwLT5hY3RpdmVdLnNwZC5yZWcsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwlzcGQgPSB+KHNwZCBeIGxwLT5waHlbbHAtPmFjdGl2ZV0uc3BkLnZhbHVlKTsKKwlzcGQgJj0gbHAtPnBoeVtscC0+YWN0aXZlXS5zcGQubWFzazsKKyAgICB9IGVsc2UgaWYgKCFscC0+dXNlU1JPTSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkZTUwMC14YSAqLworCXNwZCA9ICgofmdlcF9yZChkZXYpKSAmIEdFUF9TTE5LKTsKKyAgICB9IGVsc2UgeworCWlmICgobHAtPmlibiA9PSAyKSB8fCAhbHAtPmFzQml0VmFsaWQpCisJICAgIHJldHVybiAoKGxwLT5jaGlwc2V0ID09IERDMjExNDMpPyh+aW5sKERFNFg1X1NJU1IpJlNJU1JfTFMxMDApOjApOworCisJc3BkID0gKGxwLT5hc0JpdFZhbGlkICYgKGxwLT5hc1BvbGFyaXR5IF4gKGdlcF9yZChkZXYpICYgbHAtPmFzQml0KSkpIHwKKwkgICAgICAgICAgKGxwLT5saW5rT0sgJiB+bHAtPmFzQml0VmFsaWQpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3BkOworfQorCitzdGF0aWMgaW50Citpc18xMDBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnVzZU1JSSkgeworCS8qIERvdWJsZSByZWFkIGZvciBzdGlja3kgYml0cyAmIHRlbXBvcmFyeSBkcm9wcyAqLworCW1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwlyZXR1cm4gKG1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKSAmIE1JSV9TUl9MS1MpOworICAgIH0gZWxzZSBpZiAoIWxwLT51c2VTUk9NKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZTUwMC14YSAqLworCXJldHVybiAoKH5nZXBfcmQoZGV2KSkgJiBHRVBfU0xOSyk7CisgICAgfSBlbHNlIHsKKwlpZiAoKGxwLT5pYm4gPT0gMikgfHwgIWxwLT5hc0JpdFZhbGlkKQorCSAgICByZXR1cm4gKChscC0+Y2hpcHNldCA9PSBEQzIxMTQzKT8ofmlubChERTRYNV9TSVNSKSZTSVNSX0xTMTAwKTowKTsKKworICAgICAgICByZXR1cm4gKChscC0+YXNCaXRWYWxpZCYobHAtPmFzUG9sYXJpdHleKGdlcF9yZChkZXYpJmxwLT5hc0JpdCkpKSB8CisJCShscC0+bGlua09LICYgfmxwLT5hc0JpdFZhbGlkKSk7CisgICAgfQorfQorCitzdGF0aWMgaW50Citpc18xMF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIGlmIChscC0+dXNlTUlJKSB7CisJLyogRG91YmxlIHJlYWQgZm9yIHN0aWNreSBiaXRzICYgdGVtcG9yYXJ5IGRyb3BzICovCisJbWlpX3JkKE1JSV9TUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCXJldHVybiAobWlpX3JkKE1JSV9TUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpICYgTUlJX1NSX0xLUyk7CisgICAgfSBlbHNlIGlmICghbHAtPnVzZVNST00pIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlNTAwLXhhICovCisJcmV0dXJuICgofmdlcF9yZChkZXYpKSAmIEdFUF9MTlApOworICAgIH0gZWxzZSB7CisJaWYgKChscC0+aWJuID09IDIpIHx8ICFscC0+YXNCaXRWYWxpZCkKKwkgICAgcmV0dXJuICgoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkgPworCQkgICAgKH5pbmwoREU0WDVfU0lTUikmU0lTUl9MUzEwKToKKwkJICAgIDApOworCisJcmV0dXJuICgobHAtPmFzQml0VmFsaWQmKGxwLT5hc1BvbGFyaXR5XihnZXBfcmQoZGV2KSZscC0+YXNCaXQpKSkgfAorCQkobHAtPmxpbmtPSyAmIH5scC0+YXNCaXRWYWxpZCkpOworICAgIH0KK30KKworc3RhdGljIGludAoraXNfYW5jX2NhcGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7CisJcmV0dXJuIChtaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkpOworICAgIH0gZWxzZSBpZiAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkgeworCXJldHVybiAoaW5sKERFNFg1X1NJU1IpICYgU0lTUl9MUE4pID4+IDEyOworICAgIH0gZWxzZSB7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKgorKiogU2VuZCBhIHBhY2tldCBvbnRvIHRoZSBtZWRpYSBhbmQgd2F0Y2ggZm9yIHNlbmQgZXJyb3JzIHRoYXQgaW5kaWNhdGUgdGhlCisqKiBtZWRpYSBpcyBiYWQgb3IgdW5jb25uZWN0ZWQuCisqLworc3RhdGljIGludAorcGluZ19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXNlYykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgc2lzcjsKKyAgICAKKyAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJbHAtPnRpbWVvdXQgPSBtc2VjLzEwMDsKKwkKKwlscC0+dG1wID0gbHAtPnR4X25ldzsgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIHJpbmcgcG9zaXRpb24gKi8KKwlsb2FkX3BhY2tldChkZXYsIGxwLT5mcmFtZSwgVERfTFMgfCBURF9GUyB8IHNpemVvZihscC0+ZnJhbWUpLCAoc3RydWN0IHNrX2J1ZmYgKikxKTsKKwlscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKwlvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOworICAgIH0KKyAgICAKKyAgICBzaXNyID0gaW5sKERFNFg1X1NJU1IpOworCisgICAgaWYgKCghKHNpc3IgJiBTSVNSX05DUikpICYmIAorCSgoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2xwLT50bXBdLnN0YXR1cykgPCAwKSAmJiAKKwkgKC0tbHAtPnRpbWVvdXQpKSB7CisJc2lzciA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJaWYgKCghKHNpc3IgJiBTSVNSX05DUikpICYmIAorCSAgICAhKGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2xwLT50bXBdLnN0YXR1cykgJiAoVF9PV04gfCBURF9FUykpICYmCisJICAgIGxwLT50aW1lb3V0KSB7CisJICAgIHNpc3IgPSAwOworCX0gZWxzZSB7CisJICAgIHNpc3IgPSAxOworCX0KKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc2lzcjsKK30KKworLyoKKyoqIFRoaXMgZnVuY3Rpb24gZG9lcyAyIHRoaW5nczogb24gSW50ZWxzIGl0IGttYWxsb2MncyBhbm90aGVyIGJ1ZmZlciB0bworKiogcmVwbGFjZSB0aGUgb25lIGFib3V0IHRvIGJlIHBhc3NlZCB1cC4gT24gQWxwaGEncyBpdCBrbWFsbG9jcyBhIGJ1ZmZlcgorKiogaW50byB3aGljaCB0aGUgcGFja2V0IGlzIGNvcGllZC4KKyovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorZGU0eDVfYWxsb2NfcnhfYnVmZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIGludCBsZW4pCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcDsKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgIWRlZmluZWQoREU0WDVfRE9fTUVNQ1BZKQorICAgIHN0cnVjdCBza19idWZmICpyZXQ7CisgICAgdV9sb25nIGk9MCwgdG1wOworCisgICAgcCA9IGRldl9hbGxvY19za2IoSUVFRTgwMl8zX1NaICsgREU0WDVfQUxJR04gKyAyKTsKKyAgICBpZiAoIXApIHJldHVybiBOVUxMOworCisgICAgcC0+ZGV2ID0gZGV2OworICAgIHRtcCA9IHZpcnRfdG9fYnVzKHAtPmRhdGEpOworICAgIGkgPSAoKHRtcCArIERFNFg1X0FMSUdOKSAmIH5ERTRYNV9BTElHTikgLSB0bXA7CisgICAgc2tiX3Jlc2VydmUocCwgaSk7CisgICAgbHAtPnJ4X3JpbmdbaW5kZXhdLmJ1ZiA9IGNwdV90b19sZTMyKHRtcCArIGkpOworCisgICAgcmV0ID0gbHAtPnJ4X3NrYltpbmRleF07CisgICAgbHAtPnJ4X3NrYltpbmRleF0gPSBwOworCisgICAgaWYgKCh1X2xvbmcpIHJldCA+IDEpIHsKKwlza2JfcHV0KHJldCwgbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworCisjZWxzZQorICAgIGlmIChscC0+c3RhdGUgIT0gT1BFTikgcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKTE7IC8qIEZha2Ugb3V0IHRoZSBvcGVuICovCisKKyAgICBwID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKyAgICBpZiAoIXApIHJldHVybiBOVUxMOworCisgICAgcC0+ZGV2ID0gZGV2OworICAgIHNrYl9yZXNlcnZlKHAsIDIpOwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpZ24gKi8KKyAgICBpZiAoaW5kZXggPCBscC0+cnhfb2xkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXcmFwcGVkIGJ1ZmZlciAqLworCXNob3J0IHRsZW4gPSAobHAtPnJ4UmluZ1NpemUgLSBscC0+cnhfb2xkKSAqIFJYX0JVRkZfU1o7CisJbWVtY3B5KHNrYl9wdXQocCx0bGVuKSxscC0+cnhfYnVmcyArIGxwLT5yeF9vbGQgKiBSWF9CVUZGX1NaLHRsZW4pOworCW1lbWNweShza2JfcHV0KHAsbGVuLXRsZW4pLGxwLT5yeF9idWZzLGxlbi10bGVuKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5lYXIgYnVmZmVyICovCisJbWVtY3B5KHNrYl9wdXQocCxsZW4pLGxwLT5yeF9idWZzICsgbHAtPnJ4X29sZCAqIFJYX0JVRkZfU1osbGVuKTsKKyAgICB9CisJCSAgICAKKyAgICByZXR1cm4gcDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZnJlZV9yeF9idWZmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxscC0+cnhSaW5nU2l6ZTsgaSsrKSB7CisJaWYgKCh1X2xvbmcpIGxwLT5yeF9za2JbaV0gPiAxKSB7CisJICAgIGRldl9rZnJlZV9za2IobHAtPnJ4X3NrYltpXSk7CisJfQorCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJbHAtPnJ4X3NrYltpXSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKTE7ICAgIC8qIER1bW15IGVudHJ5ICovCisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZnJlZV90eF9idWZmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxscC0+dHhSaW5nU2l6ZTsgaSsrKSB7CisJaWYgKGxwLT50eF9za2JbaV0pCisJICAgIGRlNHg1X2ZyZWVfdHhfYnVmZihscCwgaSk7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKyAgICB9CisKKyAgICAvKiBVbmxvYWQgdGhlIGxvY2FsbHkgcXVldWVkIHBhY2tldHMgKi8KKyAgICB3aGlsZSAobHAtPmNhY2hlLnNrYikgeworCWRldl9rZnJlZV9za2IoZGU0eDVfZ2V0X2NhY2hlKGRldikpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIFdoZW4gYSB1c2VyIHB1bGxzIGEgY29ubmVjdGlvbiwgdGhlIERFQ2NoaXAgY2FuIGVuZCB1cCBpbiBhCisqKiAncnVubmluZyAtIHdhaXRpbmcgZm9yIGVuZCBvZiB0cmFuc21pc3Npb24nIHN0YXRlLiBUaGlzIG1lYW5zIHRoYXQgd2UKKyoqIGhhdmUgdG8gcGVyZm9ybSBhIGNoaXAgc29mdCByZXNldCB0byBlbnN1cmUgdGhhdCB3ZSBjYW4gc3luY2hyb25pemUKKyoqIHRoZSBoYXJkd2FyZSBhbmQgc29mdHdhcmUgYW5kIG1ha2UgYW55IG1lZGlhIHByb2JlcyB1c2luZyBhIGxvb3BiYWNrCisqKiBwYWNrZXQgbWVhbmluZ2Z1bC4KKyovCitzdGF0aWMgdm9pZAorZGU0eDVfc2F2ZV9za2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIG9tcjsKKworICAgIGlmICghbHAtPmNhY2hlLnNhdmVfY250KSB7CisJU1RPUF9ERTRYNTsKKwlkZTR4NV90eChkZXYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmx1c2ggYW55IHNlbnQgc2tiJ3MgKi8KKwlkZTR4NV9mcmVlX3R4X2J1ZmZzKGRldik7CisJZGU0eDVfY2FjaGVfc3RhdGUoZGV2LCBERTRYNV9TQVZFX1NUQVRFKTsKKwlkZTR4NV9zd19yZXNldChkZXYpOworCWRlNHg1X2NhY2hlX3N0YXRlKGRldiwgREU0WDVfUkVTVE9SRV9TVEFURSk7CisJbHAtPmNhY2hlLnNhdmVfY250Kys7CisJU1RBUlRfREU0WDU7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfcnN0X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworICAgIHMzMiBvbXI7CisKKyAgICBpZiAobHAtPmNhY2hlLnNhdmVfY250KSB7CisJU1RPUF9ERTRYNTsKKwlvdXRsKGxwLT5kbWFfcmluZ3MsIERFNFg1X1JSQkEpOworCW91dGwobHAtPmRtYV9yaW5ncyArIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBkZTR4NV9kZXNjKSwKKwkgICAgIERFNFg1X1RSQkEpOworICAgIAorCWxwLT5yeF9uZXcgPSBscC0+cnhfb2xkID0gMDsKKwlscC0+dHhfbmV3ID0gbHAtPnR4X29sZCA9IDA7CisgICAgCisJZm9yIChpID0gMDsgaSA8IGxwLT5yeFJpbmdTaXplOyBpKyspIHsKKwkgICAgbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoUl9PV04pOworCX0KKyAgICAKKwlmb3IgKGkgPSAwOyBpIDwgbHAtPnR4UmluZ1NpemU7IGkrKykgeworCSAgICBscC0+dHhfcmluZ1tpXS5zdGF0dXMgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisgICAgCisJYmFycmllcigpOworCWxwLT5jYWNoZS5zYXZlX2NudC0tOworCVNUQVJUX0RFNFg1OworICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfY2FjaGVfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZsYWcpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBzd2l0Y2goZmxhZykgeworICAgICAgY2FzZSBERTRYNV9TQVZFX1NUQVRFOgorCWxwLT5jYWNoZS5jc3IwID0gaW5sKERFNFg1X0JNUik7CisJbHAtPmNhY2hlLmNzcjYgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9TVCB8IE9NUl9TUikpOworCWxwLT5jYWNoZS5jc3I3ID0gaW5sKERFNFg1X0lNUik7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREU0WDVfUkVTVE9SRV9TVEFURToKKwlvdXRsKGxwLT5jYWNoZS5jc3IwLCBERTRYNV9CTVIpOworCW91dGwobHAtPmNhY2hlLmNzcjYsIERFNFg1X09NUik7CisJb3V0bChscC0+Y2FjaGUuY3NyNywgREU0WDVfSU1SKTsKKwlpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCSAgICBnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJICAgIGdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpOworCX0gZWxzZSB7CisJICAgIHJlc2V0X2luaXRfc2lhKGRldiwgbHAtPmNhY2hlLmNzcjEzLCBscC0+Y2FjaGUuY3NyMTQsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+Y2FjaGUuY3NyMTUpOworCX0KKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9wdXRfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBza19idWZmICpwOworCisgICAgaWYgKGxwLT5jYWNoZS5za2IpIHsKKwlmb3IgKHA9bHAtPmNhY2hlLnNrYjsgcC0+bmV4dDsgcD1wLT5uZXh0KTsKKwlwLT5uZXh0ID0gc2tiOworICAgIH0gZWxzZSB7CisJbHAtPmNhY2hlLnNrYiA9IHNrYjsKKyAgICB9CisgICAgc2tiLT5uZXh0ID0gTlVMTDsKKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3B1dGJfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBza19idWZmICpwID0gbHAtPmNhY2hlLnNrYjsKKworICAgIGxwLT5jYWNoZS5za2IgPSBza2I7CisgICAgc2tiLT5uZXh0ID0gcDsKKworICAgIHJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2RlNHg1X2dldF9jYWNoZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHNrX2J1ZmYgKnAgPSBscC0+Y2FjaGUuc2tiOworCisgICAgaWYgKHApIHsKKwlscC0+Y2FjaGUuc2tiID0gcC0+bmV4dDsKKwlwLT5uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyoqIENoZWNrIHRoZSBBdXRvIE5lZ290aWF0aW9uIFN0YXRlLiBSZXR1cm4gT0sgd2hlbiBhIGxpbmsgcGFzcyBpbnRlcnJ1cHQKKyoqIGlzIHJlY2VpdmVkIGFuZCB0aGUgYXV0by1uZWdvdGlhdGlvbiBzdGF0dXMgaXMgTldBWSBPSy4KKyovCitzdGF0aWMgaW50Cit0ZXN0X2FucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgaXJxcywgczMyIGlycV9tYXNrLCBzMzIgbXNlYykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgc3RzLCBhbnM7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisJb3V0bChpcnFfbWFzaywgREU0WDVfSU1SKTsKKwkKKwkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJc3RzID0gaW5sKERFNFg1X1NUUyk7CisJb3V0bChzdHMsIERFNFg1X1NUUyk7CisgICAgfQorICAgIAorICAgIGFucyA9IGlubChERTRYNV9TSVNSKSAmIFNJU1JfQU5TOworICAgIHN0cyA9IGlubChERTRYNV9TVFMpICYgflRJTUVSX0NCOworICAgIAorICAgIGlmICghKHN0cyAmIGlycXMpICYmIChhbnMgXiBBTlNfTldPSykgJiYgLS1scC0+dGltZW91dCkgeworCXN0cyA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHN0czsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3NldHVwX2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgaW1yLCBzdHM7CisgICAgCisgICAgaWYgKGlubChERTRYNV9PTVIpICYgT01SX1NSKSB7ICAgLyogT25seSB1bm1hc2sgaWYgVFgvUlggaXMgZW5hYmxlZCAqLworCWltciA9IDA7CisJVU5NQVNLX0lSUXM7CisJc3RzID0gaW5sKERFNFg1X1NUUyk7ICAgICAgICAvKiBSZXNldCBhbnkgcGVuZGluZyAoc3RhbGUpIGludGVycnVwdHMgKi8KKwlvdXRsKHN0cywgREU0WDVfU1RTKTsKKwlFTkFCTEVfSVJRczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisvKgorKioKKyovCitzdGF0aWMgdm9pZAorcmVzZXRfaW5pdF9zaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGNzcjEzLCBzMzIgY3NyMTQsIHMzMiBjc3IxNSkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIFJFU0VUX1NJQTsKKyAgICBpZiAobHAtPnVzZVNST00pIHsKKwlpZiAobHAtPmlibiA9PSAzKSB7CisJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0KTsKKwkgICAgc3JvbV9leGVjKGRldiwgbHAtPnBoeVtscC0+YWN0aXZlXS5nZXApOworCSAgICBvdXRsKDEsIERFNFg1X1NJQ1IpOworCSAgICByZXR1cm47CisJfSBlbHNlIHsKKwkgICAgY3NyMTUgPSBscC0+Y2FjaGUuY3NyMTU7CisJICAgIGNzcjE0ID0gbHAtPmNhY2hlLmNzcjE0OworCSAgICBjc3IxMyA9IGxwLT5jYWNoZS5jc3IxMzsKKwkgICAgb3V0bChjc3IxNSB8IGxwLT5jYWNoZS5nZXBjLCBERTRYNV9TSUdSKTsKKwkgICAgb3V0bChjc3IxNSB8IGxwLT5jYWNoZS5nZXAsIERFNFg1X1NJR1IpOworCX0KKyAgICB9IGVsc2UgeworCW91dGwoY3NyMTUsIERFNFg1X1NJR1IpOworICAgIH0KKyAgICBvdXRsKGNzcjE0LCBERTRYNV9TVFJSKTsKKyAgICBvdXRsKGNzcjEzLCBERTRYNV9TSUNSKTsKKworICAgIG1kZWxheSgxMCk7CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBDcmVhdGUgYSBsb29wYmFjayBldGhlcm5ldCBwYWNrZXQKKyovCitzdGF0aWMgdm9pZAorY3JlYXRlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpmcmFtZSwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBjaGFyICpidWYgPSBmcmFtZTsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7ICAgICAgICAgICAgIC8qIFVzZSB0aGlzIHNvdXJjZSBhZGRyZXNzICovCisJKmJ1ZisrID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICB9CisgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAgICAgICAgICAgICAvKiBVc2UgdGhpcyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJKmJ1ZisrID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICB9CisgICAgCisgICAgKmJ1ZisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgbGVuZ3RoICgyIGJ5dGVzKSAqLworICAgICpidWYrKyA9IDE7CisgICAgCisgICAgcmV0dXJuOworfQorCisvKgorKiogTG9vayBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkIG5hbWUgaW4gdGhlIEVJU0EgY29uZmlndXJhdGlvbiBzcGFjZQorKi8KK3N0YXRpYyBpbnQKK0VJU0Ffc2lnbmF0dXJlKGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKyAgICBpbnQgaSwgc3RhdHVzID0gMCwgc2lnbGVuID0gc2l6ZW9mKGRlNHg1X3NpZ25hdHVyZXMpL3NpemVvZihjX2NoYXIgKik7CisgICAgc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCisgICAgKm5hbWUgPSAnXDAnOworICAgIGVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKyAgICBpID0gZWRldi0+aWQuZHJpdmVyX2RhdGE7CisKKyAgICBpZiAoaSA+PSAwICYmIGkgPCBzaWdsZW4pIHsKKwkgICAgc3RyY3B5IChuYW1lLCBkZTR4NV9zaWduYXR1cmVzW2ldKTsKKwkgICAgc3RhdHVzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gdGhlIGRldmljZSBuYW1lIHN0cmluZyAqLworfQorCisvKgorKiogTG9vayBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkIG5hbWUgaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisqLworc3RhdGljIGludAorUENJX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHApCit7CisgICAgaW50IGksIHN0YXR1cyA9IDAsIHNpZ2xlbiA9IHNpemVvZihkZTR4NV9zaWduYXR1cmVzKS9zaXplb2YoY19jaGFyICopOworICAgIAorICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQwKSB7CisJc3RyY3B5KG5hbWUsICJERTQzNC81Iik7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlYXJjaCBmb3IgYSBERUMgbmFtZSBpbiB0aGUgU1JPTSAqLworCWludCBpID0gKigoY2hhciAqKSZscC0+c3JvbSArIDE5KSAqIDM7CisJc3RybmNweShuYW1lLCAoY2hhciAqKSZscC0+c3JvbSArIDI2ICsgaSwgOCk7CisgICAgfQorICAgIG5hbWVbOF0gPSAnXDAnOworICAgIGZvciAoaT0wOyBpPHNpZ2xlbjsgaSsrKSB7CisJaWYgKHN0cnN0cihuYW1lLGRlNHg1X3NpZ25hdHVyZXNbaV0pIT1OVUxMKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gc2lnbGVuKSB7CisJaWYgKGRlY19vbmx5KSB7CisJICAgICpuYW1lID0gJ1wwJzsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBjaGlwIG5hbWUgdG8gYXZvaWQgY29uZnVzaW9uICovCisJICAgIHN0cmNweShuYW1lLCAoKChscC0+Y2hpcHNldCA9PSBEQzIxMDQwKSA/ICJEQzIxMDQwIiA6CisJCQkgICAoKGxwLT5jaGlwc2V0ID09IERDMjEwNDEpID8gIkRDMjEwNDEiIDoKKwkJCSAgICAoKGxwLT5jaGlwc2V0ID09IERDMjExNDApID8gIkRDMjExNDAiIDoKKwkJCSAgICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQyKSA/ICJEQzIxMTQyIiA6CisJCQkgICAgICAoKGxwLT5jaGlwc2V0ID09IERDMjExNDMpID8gIkRDMjExNDMiIDogIlVOS05PV04iCisJCQkgICAgICkpKSkpKSk7CisJfQorCWlmIChscC0+Y2hpcHNldCAhPSBEQzIxMDQxKSB7CisJICAgIGxwLT51c2VTUk9NID0gVFJVRTsgICAgICAgICAgICAgLyogY2FyZCBpcyBub3QgcmVjb2duaXNhYmx5IERFQyAqLworCX0KKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlscC0+dXNlU1JPTSA9IFRSVUU7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBTZXQgdXAgdGhlIEV0aGVybmV0IFBST00gY291bnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIEV0aGVybmV0IGFkZHJlc3Mgb24KKyoqIHRoZSBEQzIxMDQwLCBlbHNlICByZWFkIHRoZSBTUk9NIGZvciB0aGUgb3RoZXIgY2hpcHMuCisqKiBUaGUgU1JPTSBtYXkgbm90IGJlIHByZXNlbnQgaW4gYSBtdWx0aS1NQUMgY2FyZCwgc28gZmlyc3QgcmVhZCB0aGUKKyoqIE1BQyBhZGRyZXNzIGFuZCBjaGVjayBmb3IgYSBiYWQgYWRkcmVzcy4gSWYgdGhlcmUgaXMgYSBiYWQgb25lIHRoZW4gZXhpdAorKiogaW1tZWRpYXRlbHkgd2l0aCB0aGUgcHJpb3Igc3JvbSBjb250ZW50cyBpbnRhY3QgKHRoZSBoL3cgYWRkcmVzcyB3aWxsCisqKiBiZSBmaXhlZCB1cCBsYXRlcikuCisqLworc3RhdGljIHZvaWQKK0RldmljZVByZXNlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGFwcm9tX2FkZHIpCit7CisgICAgaW50IGksIGo9MDsKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQwKSB7CisJaWYgKGxwLT5idXMgPT0gRUlTQSkgeworCSAgICBlbmV0X2FkZHJfcnN0KGFwcm9tX2FkZHIpOyAvKiBSZXNldCBFdGhlcm5ldCBBZGRyZXNzIFJPTSBQb2ludGVyICovCisJfSBlbHNlIHsKKwkgICAgb3V0bCgwLCBhcHJvbV9hZGRyKTsgICAgICAgLyogUmVzZXQgRXRoZXJuZXQgQWRkcmVzcyBST00gUG9pbnRlciAqLworCX0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgbmV3IHNyb20gKi8KKwl1X3Nob3J0IHRtcCwgKnAgPSAoc2hvcnQgKikoKGNoYXIgKikmbHAtPnNyb20gKyBTUk9NX0hXQUREKTsKKwlmb3IgKGk9MDsgaTwoRVRIX0FMRU4+PjEpOyBpKyspIHsKKwkgICAgdG1wID0gc3JvbV9yZChhcHJvbV9hZGRyLCAoU1JPTV9IV0FERD4+MSkgKyBpKTsKKwkgICAgKnAgPSBsZTE2X3RvX2NwdSh0bXApOworCSAgICBqICs9ICpwKys7CisJfQorCWlmICgoaiA9PSAwKSB8fCAoaiA9PSAweDJmZmZkKSkgeworCSAgICByZXR1cm47CisJfQorCisJcD0oc2hvcnQgKikmbHAtPnNyb207CisJZm9yIChpPTA7IGk8KHNpemVvZihzdHJ1Y3QgZGU0eDVfc3JvbSk+PjEpOyBpKyspIHsKKwkgICAgdG1wID0gc3JvbV9yZChhcHJvbV9hZGRyLCBpKTsKKwkgICAgKnArKyA9IGxlMTZfdG9fY3B1KHRtcCk7CisJfQorCWRlNHg1X2RiZ19zcm9tKChzdHJ1Y3QgZGU0eDVfc3JvbSAqKSZscC0+c3JvbSk7CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyoqIFNpbmNlIHRoZSB3cml0ZSBvbiB0aGUgRW5ldCBQUk9NIHJlZ2lzdGVyIGRvZXNuJ3Qgc2VlbSB0byByZXNldCB0aGUgUFJPTQorKiogcG9pbnRlciBjb3JyZWN0bHkgKGF0IGxlYXN0IG9uIG15IERFNDI1IEVJU0EgY2FyZCksIHRoaXMgcm91dGluZSBzaG91bGQgZG8KKyoqIGl0Li4uZnJvbSBkZXBjYS5jLgorKi8KK3N0YXRpYyB2b2lkCitlbmV0X2FkZHJfcnN0KHVfbG9uZyBhcHJvbV9hZGRyKQoreworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1MzIgYTsKKwkgICAgdTMyIGI7CisJfSBsbHNpZzsKKwljaGFyIFNpZ1tzaXplb2YodTMyKSA8PCAxXTsKKyAgICB9IGRldjsKKyAgICBzaG9ydCBzaWdMZW5ndGg9MDsKKyAgICBzOCBkYXRhOworICAgIGludCBpLCBqOworICAgIAorICAgIGRldi5sbHNpZy5hID0gRVRIX1BST01fU0lHOworICAgIGRldi5sbHNpZy5iID0gRVRIX1BST01fU0lHOworICAgIHNpZ0xlbmd0aCA9IHNpemVvZih1MzIpIDw8IDE7CisgICAgCisgICAgZm9yIChpPTAsaj0wO2o8c2lnTGVuZ3RoICYmIGk8UFJPQkVfTEVOR1RIK3NpZ0xlbmd0aC0xO2krKykgeworCWRhdGEgPSBpbmIoYXByb21fYWRkcik7CisJaWYgKGRldi5TaWdbal0gPT0gZGF0YSkgeyAgICAvKiB0cmFjayBzaWduYXR1cmUgKi8KKwkgICAgaisrOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogbG9zdCBzaWduYXR1cmU7IGJlZ2luIHNlYXJjaCBhZ2FpbiAqLworCSAgICBpZiAoZGF0YSA9PSBkZXYuU2lnWzBdKSB7ICAvKiByYXJlIGNhc2UuLi4uICovCisJCWo9MTsKKwkgICAgfSBlbHNlIHsKKwkJaj0wOworCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBGb3IgdGhlIGJhZCBzdGF0dXMgY2FzZSBhbmQgbm8gU1JPTSwgdGhlbiBhZGQgb25lIHRvIHRoZSBwcmV2aW91cworKiogYWRkcmVzcy4gSG93ZXZlciwgbmVlZCB0byBhZGQgb25lIGJhY2t3YXJkcyBpbiBjYXNlIHdlIGhhdmUgMHhmZgorKiogYXMgb25lIG9yIG1vcmUgb2YgdGhlIGJ5dGVzLiBPbmx5IHRoZSBsYXN0IDMgYnl0ZXMgc2hvdWxkIGJlIGNoZWNrZWQKKyoqIGFzIHRoZSBmaXJzdCB0aHJlZSBhcmUgaW52YXJpYW50IC0gYXNzaWduZWQgdG8gYW4gb3JnYW5pc2F0aW9uLgorKi8KK3N0YXRpYyBpbnQKK2dldF9od19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBicm9rZW4sIGksIGssIHRtcCwgc3RhdHVzID0gMDsKKyAgICB1X3Nob3J0IGosY2hrc3VtOworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBicm9rZW4gPSBkZTR4NV9iYWRfc3JvbShscCk7CisKKyAgICBmb3IgKGk9MCxrPTAsaj0wO2o8MztqKyspIHsKKwlrIDw8PSAxOworCWlmIChrID4gMHhmZmZmKSBrLT0weGZmZmY7CisJCisJaWYgKGxwLT5idXMgPT0gUENJKSB7CisJICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQwKSB7CisJCXdoaWxlICgodG1wID0gaW5sKERFNFg1X0FQUk9NKSkgPCAwKTsKKwkJayArPSAodV9jaGFyKSB0bXA7CisJCWRldi0+ZGV2X2FkZHJbaSsrXSA9ICh1X2NoYXIpIHRtcDsKKwkJd2hpbGUgKCh0bXAgPSBpbmwoREU0WDVfQVBST00pKSA8IDApOworCQlrICs9ICh1X3Nob3J0KSAodG1wIDw8IDgpOworCQlkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJICAgIH0gZWxzZSBpZiAoIWJyb2tlbikgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKHVfY2hhcikgbHAtPnNyb20uaWVlZV9hZGRyW2ldOyBpKys7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSAodV9jaGFyKSBscC0+c3JvbS5pZWVlX2FkZHJbaV07IGkrKzsKKwkgICAgfSBlbHNlIGlmICgoYnJva2VuID09IFNNQykgfHwgKGJyb2tlbiA9PSBBQ0NUT04pKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSAqKCh1X2NoYXIgKikmbHAtPnNyb20gKyBpKTsgaSsrOworCQlkZXYtPmRldl9hZGRyW2ldID0gKigodV9jaGFyICopJmxwLT5zcm9tICsgaSk7IGkrKzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGsgKz0gKHVfY2hhcikgKHRtcCA9IGluYihFSVNBX0FQUk9NKSk7CisJICAgIGRldi0+ZGV2X2FkZHJbaSsrXSA9ICh1X2NoYXIpIHRtcDsKKwkgICAgayArPSAodV9zaG9ydCkgKCh0bXAgPSBpbmIoRUlTQV9BUFJPTSkpIDw8IDgpOworCSAgICBkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJfQorCQorCWlmIChrID4gMHhmZmZmKSBrLT0weGZmZmY7CisgICAgfQorICAgIGlmIChrID09IDB4ZmZmZikgaz0wOworICAgIAorICAgIGlmIChscC0+YnVzID09IFBDSSkgeworCWlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQwKSB7CisJICAgIHdoaWxlICgodG1wID0gaW5sKERFNFg1X0FQUk9NKSkgPCAwKTsKKwkgICAgY2hrc3VtID0gKHVfY2hhcikgdG1wOworCSAgICB3aGlsZSAoKHRtcCA9IGlubChERTRYNV9BUFJPTSkpIDwgMCk7CisJICAgIGNoa3N1bSB8PSAodV9zaG9ydCkgKHRtcCA8PCA4KTsKKwkgICAgaWYgKChrICE9IGNoa3N1bSkgJiYgKGRlY19vbmx5KSkgc3RhdHVzID0gLTE7CisJfQorICAgIH0gZWxzZSB7CisJY2hrc3VtID0gKHVfY2hhcikgaW5iKEVJU0FfQVBST00pOworCWNoa3N1bSB8PSAodV9zaG9ydCkgKGluYihFSVNBX0FQUk9NKSA8PCA4KTsKKwlpZiAoKGsgIT0gY2hrc3VtKSAmJiAoZGVjX29ubHkpKSBzdGF0dXMgPSAtMTsKKyAgICB9CisKKyAgICAvKiBJZiBwb3NzaWJsZSwgdHJ5IHRvIGZpeCBhIGJyb2tlbiBjYXJkIC0gU01DIG9ubHkgc28gZmFyICovCisgICAgc3JvbV9yZXBhaXIoZGV2LCBicm9rZW4pOworCisjaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCisgICAgLyogCisgICAgKiogSWYgdGhlIGFkZHJlc3Mgc3RhcnRzIHdpdGggMDAgYTAsIHdlIGhhdmUgdG8gYml0LXJldmVyc2UKKyAgICAqKiBlYWNoIGJ5dGUgb2YgdGhlIGFkZHJlc3MuCisgICAgKi8KKyAgICBpZiAoIChfbWFjaGluZSAmIF9NQUNIX1BtYWMpICYmCisJIChkZXYtPmRldl9hZGRyWzBdID09IDApICYmCisJIChkZXYtPmRldl9hZGRyWzFdID09IDB4YTApICkKKyAgICB7CisJICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQorCSAgICB7CisJCSAgICBpbnQgeCA9IGRldi0+ZGV2X2FkZHJbaV07CisJCSAgICB4ID0gKCh4ICYgMHhmKSA8PCA0KSArICgoeCAmIDB4ZjApID4+IDQpOworCQkgICAgeCA9ICgoeCAmIDB4MzMpIDw8IDIpICsgKCh4ICYgMHhjYykgPj4gMik7CisJCSAgICBkZXYtPmRldl9hZGRyW2ldID0gKCh4ICYgMHg1NSkgPDwgMSkgKyAoKHggJiAweGFhKSA+PiAxKTsKKwkgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KKworICAgIC8qIFRlc3QgZm9yIGEgYmFkIGVuZXQgYWRkcmVzcyAqLworICAgIHN0YXR1cyA9IHRlc3RfYmFkX2VuZXQoZGV2LCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIFRlc3QgZm9yIGVuZXQgYWRkcmVzc2VzIGluIHRoZSBmaXJzdCAzMiBieXRlcy4gVGhlIGJ1aWx0LWluIHN0cm5jbXAKKyoqIGRpZG4ndCBzZWVtIHRvIHdvcmsgaGVyZS4uLj8KKyovCitzdGF0aWMgaW50CitkZTR4NV9iYWRfc3JvbShzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHApCit7CisgICAgaW50IGksIHN0YXR1cyA9IDA7CisKKyAgICBmb3IgKGk9MDsgaTxzaXplb2YoZW5ldF9kZXQpL0VUSF9BTEVOOyBpKyspIHsKKwlpZiAoIWRlNHg1X3N0cm5jbXAoKGNoYXIgKikmbHAtPnNyb20sIChjaGFyICopJmVuZXRfZGV0W2ldLCAzKSAmJgorCSAgICAhZGU0eDVfc3RybmNtcCgoY2hhciAqKSZscC0+c3JvbSsweDEwLCAoY2hhciAqKSZlbmV0X2RldFtpXSwgMykpIHsKKwkgICAgaWYgKGkgPT0gMCkgeworCQlzdGF0dXMgPSBTTUM7CisJICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisJCXN0YXR1cyA9IEFDQ1RPTjsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorZGU0eDVfc3RybmNtcChjaGFyICphLCBjaGFyICpiLCBpbnQgbikKK3sKKyAgICBpbnQgcmV0PTA7CisKKyAgICBmb3IgKDtuICYmICFyZXQ7bi0tKSB7CisJcmV0ID0gKmErKyAtICpiKys7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3Nyb21fcmVwYWlyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjYXJkKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBzd2l0Y2goY2FyZCkgeworICAgICAgY2FzZSBTTUM6CisJbWVtc2V0KChjaGFyICopJmxwLT5zcm9tLCAwLCBzaXplb2Yoc3RydWN0IGRlNHg1X3Nyb20pKTsKKwltZW1jcHkobHAtPnNyb20uaWVlZV9hZGRyLCAoY2hhciAqKWRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobHAtPnNyb20uaW5mbywgKGNoYXIgKikmc3JvbV9yZXBhaXJfaW5mb1tTTUMtMV0sIDEwMCk7CisJbHAtPnVzZVNST00gPSBUUlVFOworCWJyZWFrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIEFzc3VtZSB0aGF0IHRoZSBpcnEncyBkbyBub3QgZm9sbG93IHRoZSBQQ0kgc3BlYyAtIHRoaXMgaXMgc2VlbXMKKyoqIHRvIGJlIHRydWUgc28gZmFyICgyIGZvciAyKS4KKyovCitzdGF0aWMgaW50Cit0ZXN0X2JhZF9lbmV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaSwgdG1wOworCisgICAgZm9yICh0bXA9MCxpPTA7IGk8RVRIX0FMRU47IGkrKykgdG1wICs9ICh1X2NoYXIpZGV2LT5kZXZfYWRkcltpXTsKKyAgICBpZiAoKHRtcCA9PSAwKSB8fCAodG1wID09IDB4NWZhKSkgeworCWlmICgobHAtPmNoaXBzZXQgPT0gbGFzdC5jaGlwc2V0KSAmJiAKKwkgICAgKGxwLT5idXNfbnVtID09IGxhc3QuYnVzKSAmJiAobHAtPmJ1c19udW0gPiAwKSkgeworCSAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSBkZXYtPmRldl9hZGRyW2ldID0gbGFzdC5hZGRyW2ldOworCSAgICBmb3IgKGk9RVRIX0FMRU4tMTsgaT4yOyAtLWkpIHsKKwkJZGV2LT5kZXZfYWRkcltpXSArPSAxOworCQlpZiAoZGV2LT5kZXZfYWRkcltpXSAhPSAwKSBicmVhazsKKwkgICAgfQorCSAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSBsYXN0LmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCSAgICBpZiAoIWFuX2V4Y2VwdGlvbihscCkpIHsKKwkJZGV2LT5pcnEgPSBsYXN0LmlycTsKKwkgICAgfQorCisJICAgIHN0YXR1cyA9IDA7CisJfQorICAgIH0gZWxzZSBpZiAoIXN0YXR1cykgeworCWxhc3QuY2hpcHNldCA9IGxwLT5jaGlwc2V0OworCWxhc3QuYnVzID0gbHAtPmJ1c19udW07CisJbGFzdC5pcnEgPSBkZXYtPmlycTsKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSBsYXN0LmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBMaXN0IG9mIGJvYXJkIGV4Y2VwdGlvbnMgd2l0aCBjb3JyZWN0bHkgd2lyZWQgSVJRcworKi8KK3N0YXRpYyBpbnQKK2FuX2V4Y2VwdGlvbihzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHApCit7CisgICAgaWYgKCgqKHVfc2hvcnQgKilscC0+c3JvbS5zdWJfdmVuZG9yX2lkID09IDB4MDBjMCkgJiYgCisJKCoodV9zaG9ydCAqKWxwLT5zcm9tLnN1Yl9zeXN0ZW1faWQgPT0gMHg5NWUwKSkgeworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyoqIFNST00gUmVhZAorKi8KK3N0YXRpYyBzaG9ydAorc3JvbV9yZCh1X2xvbmcgYWRkciwgdV9jaGFyIG9mZnNldCkKK3sKKyAgICBzZW5kdG9fc3JvbShTUk9NX1JEIHwgU1JPTV9TUiwgYWRkcik7CisgICAgCisgICAgc3JvbV9sYXRjaChTUk9NX1JEIHwgU1JPTV9TUiB8IERUX0NTLCBhZGRyKTsKKyAgICBzcm9tX2NvbW1hbmQoU1JPTV9SRCB8IFNST01fU1IgfCBEVF9JTiB8IERUX0NTLCBhZGRyKTsKKyAgICBzcm9tX2FkZHJlc3MoU1JPTV9SRCB8IFNST01fU1IgfCBEVF9DUywgYWRkciwgb2Zmc2V0KTsKKyAgICAKKyAgICByZXR1cm4gc3JvbV9kYXRhKFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZAorc3JvbV9sYXRjaCh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKyAgICBzZW5kdG9fc3JvbShjb21tYW5kLCBhZGRyKTsKKyAgICBzZW5kdG9fc3JvbShjb21tYW5kIHwgRFRfQ0xLLCBhZGRyKTsKKyAgICBzZW5kdG9fc3JvbShjb21tYW5kLCBhZGRyKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzcm9tX2NvbW1hbmQodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICAgc3JvbV9sYXRjaChjb21tYW5kLCBhZGRyKTsKKyAgICBzcm9tX2xhdGNoKGNvbW1hbmQsIGFkZHIpOworICAgIHNyb21fbGF0Y2goKGNvbW1hbmQgJiAweDAwMDBmZjAwKSB8IERUX0NTLCBhZGRyKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzcm9tX2FkZHJlc3ModV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIsIHVfY2hhciBvZmZzZXQpCit7CisgICAgaW50IGksIGE7CisgICAgCisgICAgYSA9IG9mZnNldCA8PCAyOworICAgIGZvciAoaT0wOyBpPDY7IGkrKywgYSA8PD0gMSkgeworCXNyb21fbGF0Y2goY29tbWFuZCB8ICgoYSAmIDB4ODApID8gRFRfSU4gOiAwKSwgYWRkcik7CisgICAgfQorICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICBpID0gKGdldGZyb21fc3JvbShhZGRyKSA+PiAzKSAmIDB4MDE7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgc2hvcnQKK3Nyb21fZGF0YSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICBzaG9ydCB3b3JkID0gMDsKKyAgICBzMzIgdG1wOworICAgIAorICAgIGZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwlzZW5kdG9fc3JvbShjb21tYW5kICB8IERUX0NMSywgYWRkcik7CisJdG1wID0gZ2V0ZnJvbV9zcm9tKGFkZHIpOworCXNlbmR0b19zcm9tKGNvbW1hbmQsIGFkZHIpOworCQorCXdvcmQgPSAod29yZCA8PCAxKSB8ICgodG1wID4+IDMpICYgMHgwMSk7CisgICAgfQorICAgIAorICAgIHNlbmR0b19zcm9tKGNvbW1hbmQgJiAweDAwMDBmZjAwLCBhZGRyKTsKKyAgICAKKyAgICByZXR1cm4gd29yZDsKK30KKworLyoKK3N0YXRpYyB2b2lkCitzcm9tX2J1c3kodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICBzZW5kdG9fc3JvbSgoY29tbWFuZCAmIDB4MDAwMGZmMDApIHwgRFRfQ1MsIGFkZHIpOworICAgCisgICB3aGlsZSAoISgoZ2V0ZnJvbV9zcm9tKGFkZHIpID4+IDMpICYgMHgwMSkpIHsKKyAgICAgICBtZGVsYXkoMSk7CisgICB9CisgICAKKyAgIHNlbmR0b19zcm9tKGNvbW1hbmQgJiAweDAwMDBmZjAwLCBhZGRyKTsKKyAgIAorICAgcmV0dXJuOworfQorKi8KKworc3RhdGljIHZvaWQKK3NlbmR0b19zcm9tKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworICAgIG91dGwoY29tbWFuZCwgYWRkcik7CisgICAgdWRlbGF5KDEpOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorZ2V0ZnJvbV9zcm9tKHVfbG9uZyBhZGRyKQoreworICAgIHMzMiB0bXA7CisgICAgCisgICAgdG1wID0gaW5sKGFkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50Citzcm9tX2luZm9sZWFmX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpLCBjb3VudDsKKyAgICB1X2NoYXIgKnA7CisKKyAgICAvKiBGaW5kIHRoZSBpbmZvbGVhZiBkZWNvZGVyIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyB0aGlzIGNoaXBzZXQgKi8KKyAgICBmb3IgKGk9MDsgaTxJTkZPTEVBRl9TSVpFOyBpKyspIHsKKwlpZiAobHAtPmNoaXBzZXQgPT0gaW5mb2xlYWZfYXJyYXlbaV0uY2hpcHNldCkgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IElORk9MRUFGX1NJWkUpIHsKKwlscC0+dXNlU1JPTSA9IEZBTFNFOworCXByaW50aygiJXM6IENhbm5vdCBmaW5kIGNvcnJlY3QgY2hpcHNldCBmb3IgU1JPTSBkZWNvZGluZyFcbiIsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUpOworCXJldHVybiAtRU5YSU87CisgICAgfQorCisgICAgbHAtPmluZm9sZWFmX2ZuID0gaW5mb2xlYWZfYXJyYXlbaV0uZm47CisKKyAgICAvKiBGaW5kIHRoZSBpbmZvcm1hdGlvbiBvZmZzZXQgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB1c2UgKi8KKyAgICBjb3VudCA9ICooKHVfY2hhciAqKSZscC0+c3JvbSArIDE5KTsKKyAgICBwICA9ICh1X2NoYXIgKikmbHAtPnNyb20gKyAyNjsKKworICAgIGlmIChjb3VudCA+IDEpIHsKKwlmb3IgKGk9Y291bnQ7IGk7IC0taSwgcCs9MykgeworCSAgICBpZiAobHAtPmRldmljZSA9PSAqcCkgYnJlYWs7CisJfQorCWlmIChpID09IDApIHsKKwkgICAgbHAtPnVzZVNST00gPSBGQUxTRTsKKwkgICAgcHJpbnRrKCIlczogQ2Fubm90IGZpbmQgY29ycmVjdCBQQ0kgZGV2aWNlIFslZF0gZm9yIFNST00gZGVjb2RpbmchXG4iLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgbHAtPmRldmljZSk7CisJICAgIHJldHVybiAtRU5YSU87CisJfQorICAgIH0KKworICAgIGxwLT5pbmZvbGVhZl9vZmZzZXQgPSBUV0lERExFKHArMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyoqIFRoaXMgcm91dGluZSBsb2FkcyBhbnkgdHlwZSAxIG9yIDMgTUlJIGluZm8gaW50byB0aGUgbWlpIGRldmljZQorKiogc3RydWN0IGFuZCBleGVjdXRlcyBhbnkgdHlwZSA1IGNvZGUgdG8gcmVzZXQgUEhZIGRldmljZXMgZm9yIHRoaXMKKyoqIGNvbnRyb2xsZXIuCisqKiBUaGUgaW5mbyBmb3IgdGhlIE1JSSBkZXZpY2VzIHdpbGwgYmUgdmFsaWQgc2luY2UgdGhlIGluZGV4IHVzZWQKKyoqIHdpbGwgZm9sbG93IHRoZSBkaXNjb3ZlcnkgcHJvY2VzcyBmcm9tIE1JSSBhZGRyZXNzIDEtMzEgdGhlbiAwLgorKi8KK3N0YXRpYyB2b2lkCitzcm9tX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciAqcCA9ICh1X2NoYXIgKikmbHAtPnNyb20gKyBscC0+aW5mb2xlYWZfb2Zmc2V0OworICAgIHVfY2hhciBjb3VudDsKKworICAgIHArPTI7CisgICAgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwlscC0+Y2FjaGUuZ2VwYyA9ICgqcCsrIHwgR0VQX0NUUkwpOworCWdlcF93cihscC0+Y2FjaGUuZ2VwYywgZGV2KTsKKyAgICB9CisKKyAgICAvKiBCbG9jayBjb3VudCAqLworICAgIGNvdW50ID0gKnArKzsKKworICAgIC8qIEp1bXAgdGhlIGluZm9ibG9ja3MgdG8gZmluZCB0eXBlcyAqLworICAgIGZvciAoO2NvdW50OyAtLWNvdW50KSB7CisJaWYgKCpwIDwgMTI4KSB7CisJICAgIHAgKz0gQ09NUEFDVF9MRU47CisJfSBlbHNlIGlmICgqKHArMSkgPT0gNSkgeworCSAgICB0eXBlNV9pbmZvYmxvY2soZGV2LCAxLCBwKTsKKwkgICAgcCArPSAoKCpwICYgQkxPQ0tfTEVOKSArIDEpOworCX0gZWxzZSBpZiAoKihwKzEpID09IDQpIHsKKwkgICAgcCArPSAoKCpwICYgQkxPQ0tfTEVOKSArIDEpOworCX0gZWxzZSBpZiAoKihwKzEpID09IDMpIHsKKwkgICAgdHlwZTNfaW5mb2Jsb2NrKGRldiwgMSwgcCk7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSAyKSB7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSAxKSB7CisJICAgIHR5cGUxX2luZm9ibG9jayhkZXYsIDEsIHApOworCSAgICBwICs9ICgoKnAgJiBCTE9DS19MRU4pICsgMSk7CisJfSBlbHNlIHsKKwkgICAgcCArPSAoKCpwICYgQkxPQ0tfTEVOKSArIDEpOworCX0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBBIGdlbmVyaWMgcm91dGluZSB0aGF0IHdyaXRlcyBHRVAgY29udHJvbCwgZGF0YSBhbmQgcmVzZXQgaW5mb3JtYXRpb24KKyoqIHRvIHRoZSBHRVAgcmVnaXN0ZXIgKDIxMTQwKSBvciBjc3IxNSBHRVAgcG9ydGlvbiAoMjExNFsyM10pLgorKi8KK3N0YXRpYyB2b2lkCitzcm9tX2V4ZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfY2hhciBjb3VudCA9IChwID8gKnArKyA6IDApOworICAgIHVfc2hvcnQgKncgPSAodV9zaG9ydCAqKXA7CisKKyAgICBpZiAoKChscC0+aWJuICE9IDEpICYmIChscC0+aWJuICE9IDMpICYmIChscC0+aWJuICE9IDUpKSB8fCAhY291bnQpIHJldHVybjsKKworICAgIGlmIChscC0+Y2hpcHNldCAhPSBEQzIxMTQwKSBSRVNFVF9TSUE7CisgCisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlnZXBfd3IoKChscC0+Y2hpcHNldD09REMyMTE0MCkgJiYgKGxwLT5pYm4hPTUpID8gCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA6IFRXSURETEUodysrKSksIGRldik7CisJbWRlbGF5KDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMm1zIHBlciBhY3Rpb24gKi8KKyAgICB9CisKKyAgICBpZiAobHAtPmNoaXBzZXQgIT0gREMyMTE0MCkgeworCW91dGwobHAtPmNhY2hlLmNzcjE0LCBERTRYNV9TVFJSKTsKKwlvdXRsKGxwLT5jYWNoZS5jc3IxMywgREU0WDVfU0lDUik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogQmFzaWNhbGx5IHRoaXMgZnVuY3Rpb24gaXMgYSBOT1Agc2luY2UgaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQsCisqKiB1bmxlc3MgSSBpbXBsZW1lbnQgdGhlIERDMjEwNDEgU1JPTSBmdW5jdGlvbnMuIFRoZXJlJ3Mgbm8gbmVlZAorKiogc2luY2UgdGhlIGV4aXN0aW5nIGNvZGUgd2lsbCBiZSBzYXRpc2ZhY3RvcnkgZm9yIGFsbCBib2FyZHMuCisqLworc3RhdGljIGludCAKK2RjMjEwNDFfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByZXR1cm4gREU0WDVfQVVUT1NFTlNFX01TOworfQorCitzdGF0aWMgaW50IAorZGMyMTE0MF9pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGNvdW50ID0gMDsKKyAgICB1X2NoYXIgKnAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgbHAtPmluZm9sZWFmX29mZnNldDsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgLyogUmVhZCB0aGUgY29ubmVjdGlvbiB0eXBlICovCisgICAgcCs9MjsKKworICAgIC8qIEdFUCBjb250cm9sICovCisgICAgbHAtPmNhY2hlLmdlcGMgPSAoKnArKyB8IEdFUF9DVFJMKTsKKworICAgIC8qIEJsb2NrIGNvdW50ICovCisgICAgY291bnQgPSAqcCsrOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoKnAgPCAxMjgpIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbQ09NUEFDVF0oZGV2LCBjb3VudCwgcCk7CisgICAgfSBlbHNlIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbKihwKzEpXShkZXYsIGNvdW50LCBwKTsKKyAgICB9CisKKyAgICBpZiAobHAtPnRjb3VudCA9PSBjb3VudCkgeworCWxwLT5tZWRpYSA9IE5DOworICAgICAgICBpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dGNvdW50ID0gMDsKKwlscC0+dHhfZW5hYmxlID0gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIG5leHRfdGljayAmIH5USU1FUl9DQjsKK30KKworc3RhdGljIGludCAKK2RjMjExNDJfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBjb3VudCA9IDA7CisgICAgdV9jaGFyICpwID0gKHVfY2hhciAqKSZscC0+c3JvbSArIGxwLT5pbmZvbGVhZl9vZmZzZXQ7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKworICAgIC8qIFJlYWQgdGhlIGNvbm5lY3Rpb24gdHlwZSAqLworICAgIHArPTI7CisKKyAgICAvKiBCbG9jayBjb3VudCAqLworICAgIGNvdW50ID0gKnArKzsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKCpwIDwgMTI4KSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHApOworICAgIH0gZWxzZSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrWyoocCsxKV0oZGV2LCBjb3VudCwgcCk7CisgICAgfQorCisgICAgaWYgKGxwLT50Y291bnQgPT0gY291bnQpIHsKKwlscC0+bWVkaWEgPSBOQzsKKyAgICAgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnRjb3VudCA9IDA7CisJbHAtPnR4X2VuYWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2sgJiB+VElNRVJfQ0I7Cit9CisKK3N0YXRpYyBpbnQgCitkYzIxMTQzX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgY291bnQgPSAwOworICAgIHVfY2hhciAqcCA9ICh1X2NoYXIgKikmbHAtPnNyb20gKyBscC0+aW5mb2xlYWZfb2Zmc2V0OworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisKKyAgICAvKiBSZWFkIHRoZSBjb25uZWN0aW9uIHR5cGUgKi8KKyAgICBwKz0yOworCisgICAgLyogQmxvY2sgY291bnQgKi8KKyAgICBjb3VudCA9ICpwKys7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgqcCA8IDEyOCkgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwKTsKKyAgICB9IGVsc2UgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1sqKHArMSldKGRldiwgY291bnQsIHApOworICAgIH0KKyAgICBpZiAobHAtPnRjb3VudCA9PSBjb3VudCkgeworCWxwLT5tZWRpYSA9IE5DOworICAgICAgICBpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dGNvdW50ID0gMDsKKwlscC0+dHhfZW5hYmxlID0gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIG5leHRfdGljayAmIH5USU1FUl9DQjsKK30KKworLyoKKyoqIFRoZSBjb21wYWN0IGluZm9ibG9jayBpcyBvbmx5IGRlc2lnbmVkIGZvciBEQzIxMTQwW0FdIGNoaXBzLCBzbworKiogd2UnbGwgcmV1c2UgdGhlIGRjMjExNDBtX2F1dG9jb25mIGZ1bmN0aW9uLiBOb24gTUlJIG1lZGlhIG9ubHkuCisqLworc3RhdGljIGludCAKK2NvbXBhY3RfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGZsYWdzLCBjc3I2OworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK0NPTVBBQ1RfTEVOKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArQ09NUEFDVF9MRU4pOworCX0gZWxzZSB7CisJICAgIHJldHVybiBkY19pbmZvYmxvY2tbKihwK0NPTVBBQ1RfTEVOKzEpXShkZXYsIGNvdW50LCBwK0NPTVBBQ1RfTEVOKTsKKwl9CisgICAgfQorCisgICAgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IENPTVBBQ1Q7CisgICAgICAgIGxwLT5hY3RpdmUgPSAwOworCWdlcF93cihscC0+Y2FjaGUuZ2VwYywgZGV2KTsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gKCpwKyspICYgQ09NUEFDVF9NQzsKKwlscC0+Y2FjaGUuZ2VwID0gKnArKzsKKwljc3I2ID0gKnArKzsKKwlmbGFncyA9ICpwKys7CisKKwlscC0+YXNCaXRWYWxpZCA9IChmbGFncyAmIDB4ODApID8gMCA6IC0xOworCWxwLT5kZWZNZWRpdW0gPSAoZmxhZ3MgJiAweDQwKSA/IC0xIDogMDsKKwlscC0+YXNCaXQgPSAxIDw8ICgoY3NyNiA+PiAxKSAmIDB4MDcpOworCWxwLT5hc1BvbGFyaXR5ID0gKChjc3I2ICYgMHg4MCkgPyAtMSA6IDApICYgbHAtPmFzQml0OworCWxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9ERUYgfCAoKGNzcjYgJiAweDcxKSA8PCAxOCk7CisJbHAtPnVzZU1JSSA9IEZBTFNFOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNDBtX2F1dG9jb25mKGRldik7Cit9CisKKy8qCisqKiBUaGlzIGJsb2NrIGRlc2NyaWJlcyBub24gTUlJIG1lZGlhIGZvciB0aGUgREMyMTE0MFtBXSBvbmx5LgorKi8KK3N0YXRpYyBpbnQgCit0eXBlMF9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgZmxhZ3MsIGNzcjYsIGxlbiA9ICgqcCAmIEJMT0NLX0xFTikrMTsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKC0tY291bnQgPiBscC0+dGNvdW50KSB7CisJaWYgKCoocCtsZW4pIDwgMTI4KSB7CisJICAgIHJldHVybiBkY19pbmZvYmxvY2tbQ09NUEFDVF0oZGV2LCBjb3VudCwgcCtsZW4pOworCX0gZWxzZSB7CisJICAgIHJldHVybiBkY19pbmZvYmxvY2tbKihwK2xlbisxKV0oZGV2LCBjb3VudCwgcCtsZW4pOworCX0KKyAgICB9CisKKyAgICBpZiAoKGxwLT5tZWRpYSA9PSBJTklUKSAmJiAobHAtPnRpbWVvdXQgPCAwKSkgeworICAgICAgICBscC0+aWJuID0gMDsKKyAgICAgICAgbHAtPmFjdGl2ZSA9IDA7CisgICAgICAgIGdlcF93cihscC0+Y2FjaGUuZ2VwYywgZGV2KTsKKwlwKz0yOworCWxwLT5pbmZvYmxvY2tfbWVkaWEgPSAoKnArKykgJiBCTE9DSzBfTUM7CisJbHAtPmNhY2hlLmdlcCA9ICpwKys7CisJY3NyNiA9ICpwKys7CisJZmxhZ3MgPSAqcCsrOworCisJbHAtPmFzQml0VmFsaWQgPSAoZmxhZ3MgJiAweDgwKSA/IDAgOiAtMTsKKwlscC0+ZGVmTWVkaXVtID0gKGZsYWdzICYgMHg0MCkgPyAtMSA6IDA7CisJbHAtPmFzQml0ID0gMSA8PCAoKGNzcjYgPj4gMSkgJiAweDA3KTsKKwlscC0+YXNQb2xhcml0eSA9ICgoY3NyNiAmIDB4ODApID8gLTEgOiAwKSAmIGxwLT5hc0JpdDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfREVGIHwgKChjc3I2ICYgMHg3MSkgPDwgMTgpOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworfQorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVuZGVyIGNvbnN0cnVjdGlvbiEgKi8KKworc3RhdGljIGludCAKK3R5cGUxX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgcCArPSAyOworICAgIGlmIChscC0+c3RhdGUgPT0gSU5JVElBTElTRUQpIHsKKyAgICAgICAgbHAtPmlibiA9IDE7CisJbHAtPmFjdGl2ZSA9ICpwKys7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5nZXAgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKCpwICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5yc3QgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKCpwICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5tYyAgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5hbmEgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5mZHggPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS50dG0gPSBUV0lERExFKHApOworCXJldHVybiAwOworICAgIH0gZWxzZSBpZiAoKGxwLT5tZWRpYSA9PSBJTklUKSAmJiAobHAtPnRpbWVvdXQgPCAwKSkgeworICAgICAgICBscC0+aWJuID0gMTsKKyAgICAgICAgbHAtPmFjdGl2ZSA9ICpwOworCWxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9NSUlfMTAwOworCWxwLT51c2VNSUkgPSBUUlVFOworCWxwLT5pbmZvYmxvY2tfbWVkaWEgPSBBTlM7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKK30KKworc3RhdGljIGludCAKK3R5cGUyX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDI7CisgICAgICAgIGxwLT5hY3RpdmUgPSAwOworCXAgKz0gMjsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gKCpwKSAmIE1FRElBX0NPREU7CisKKyAgICAgICAgaWYgKCgqcCsrKSAmIEVYVF9GSUVMRCkgeworCSAgICBscC0+Y2FjaGUuY3NyMTMgPSBUV0lERExFKHApOyBwICs9IDI7CisJICAgIGxwLT5jYWNoZS5jc3IxNCA9IFRXSURETEUocCk7IHAgKz0gMjsKKwkgICAgbHAtPmNhY2hlLmNzcjE1ID0gVFdJRERMRShwKTsgcCArPSAyOworCX0gZWxzZSB7CisJICAgIGxwLT5jYWNoZS5jc3IxMyA9IENTUjEzOworCSAgICBscC0+Y2FjaGUuY3NyMTQgPSBDU1IxNDsKKwkgICAgbHAtPmNhY2hlLmNzcjE1ID0gQ1NSMTU7CisJfQorICAgICAgICBscC0+Y2FjaGUuZ2VwYyA9ICgoczMyKShUV0lERExFKHApKSA8PCAxNik7IHAgKz0gMjsKKyAgICAgICAgbHAtPmNhY2hlLmdlcCAgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOworCWxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9TSUE7CisJbHAtPnVzZU1JSSA9IEZBTFNFOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKK30KKworc3RhdGljIGludCAKK3R5cGUzX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgcCArPSAyOworICAgIGlmIChscC0+c3RhdGUgPT0gSU5JVElBTElTRUQpIHsKKyAgICAgICAgbHAtPmlibiA9IDM7CisgICAgICAgIGxwLT5hY3RpdmUgPSAqcCsrOworCWlmIChNT1RPX1NST01fQlVHKSBscC0+YWN0aXZlID0gMDsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLmdlcCA9ICgqcCA/IHAgOiBOVUxMKTsgcCArPSAoMiAqICgqcCkgKyAxKTsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLnJzdCA9ICgqcCA/IHAgOiBOVUxMKTsgcCArPSAoMiAqICgqcCkgKyAxKTsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLm1jICA9IFRXSURETEUocCk7IHAgKz0gMjsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLmFuYSA9IFRXSURETEUocCk7IHAgKz0gMjsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLmZkeCA9IFRXSURETEUocCk7IHAgKz0gMjsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLnR0bSA9IFRXSURETEUocCk7IHAgKz0gMjsKKwlscC0+cGh5W2xwLT5hY3RpdmVdLm1jaSA9ICpwOworCXJldHVybiAwOworICAgIH0gZWxzZSBpZiAoKGxwLT5tZWRpYSA9PSBJTklUKSAmJiAobHAtPnRpbWVvdXQgPCAwKSkgeworICAgICAgICBscC0+aWJuID0gMzsKKwlscC0+YWN0aXZlID0gKnA7CisJaWYgKE1PVE9fU1JPTV9CVUcpIGxwLT5hY3RpdmUgPSAwOworCWxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9NSUlfMTAwOworCWxwLT51c2VNSUkgPSBUUlVFOworCWxwLT5pbmZvYmxvY2tfbWVkaWEgPSBBTlM7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0eF9hdXRvY29uZihkZXYpOworfQorCitzdGF0aWMgaW50IAordHlwZTRfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGZsYWdzLCBjc3I2LCBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDQ7CisgICAgICAgIGxwLT5hY3RpdmUgPSAwOworCXArPTI7CisJbHAtPmluZm9ibG9ja19tZWRpYSA9ICgqcCsrKSAmIE1FRElBX0NPREU7CisgICAgICAgIGxwLT5jYWNoZS5jc3IxMyA9IENTUjEzOyAgICAgICAgICAgICAgLyogSGFyZCBjb2RlZCBkZWZhdWx0cyAqLworCWxwLT5jYWNoZS5jc3IxNCA9IENTUjE0OworCWxwLT5jYWNoZS5jc3IxNSA9IENTUjE1OworICAgICAgICBscC0+Y2FjaGUuZ2VwYyA9ICgoczMyKShUV0lERExFKHApKSA8PCAxNik7IHAgKz0gMjsKKyAgICAgICAgbHAtPmNhY2hlLmdlcCAgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOyBwICs9IDI7CisJY3NyNiA9ICpwKys7CisJZmxhZ3MgPSAqcCsrOworCisJbHAtPmFzQml0VmFsaWQgPSAoZmxhZ3MgJiAweDgwKSA/IDAgOiAtMTsKKwlscC0+ZGVmTWVkaXVtID0gKGZsYWdzICYgMHg0MCkgPyAtMSA6IDA7CisJbHAtPmFzQml0ID0gMSA8PCAoKGNzcjYgPj4gMSkgJiAweDA3KTsKKwlscC0+YXNQb2xhcml0eSA9ICgoY3NyNiAmIDB4ODApID8gLTEgOiAwKSAmIGxwLT5hc0JpdDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfREVGIHwgKChjc3I2ICYgMHg3MSkgPDwgMTgpOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTR4X2F1dG9jb25mKGRldik7Cit9CisKKy8qCisqKiBUaGlzIGJsb2NrIHR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gZm9yIHJlc2V0dGluZyBleHRlcm5hbCBkZXZpY2VzCisqKiAoY2hpcHMpIHRocm91Z2ggdGhlIEdlbmVyYWwgUHVycG9zZSBSZWdpc3Rlci4KKyovCitzdGF0aWMgaW50IAordHlwZTVfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGxlbiA9ICgqcCAmIEJMT0NLX0xFTikrMTsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKC0tY291bnQgPiBscC0+dGNvdW50KSB7CisJaWYgKCoocCtsZW4pIDwgMTI4KSB7CisJICAgIHJldHVybiBkY19pbmZvYmxvY2tbQ09NUEFDVF0oZGV2LCBjb3VudCwgcCtsZW4pOworCX0gZWxzZSB7CisJICAgIHJldHVybiBkY19pbmZvYmxvY2tbKihwK2xlbisxKV0oZGV2LCBjb3VudCwgcCtsZW4pOworCX0KKyAgICB9CisKKyAgICAvKiBNdXN0IGJlIGluaXRpYWxpemluZyB0byBydW4gdGhpcyBjb2RlICovCisgICAgaWYgKChscC0+c3RhdGUgPT0gSU5JVElBTElTRUQpIHx8IChscC0+bWVkaWEgPT0gSU5JVCkpIHsKKwlwKz0yOworICAgICAgICBscC0+cnN0ID0gcDsKKyAgICAgICAgc3JvbV9leGVjKGRldiwgbHAtPnJzdCk7CisgICAgfQorCisgICAgcmV0dXJuIERFNFg1X0FVVE9TRU5TRV9NUzsKK30KKworLyoKKyoqIE1JSSBSZWFkL1dyaXRlCisqLworCitzdGF0aWMgaW50CittaWlfcmQodV9jaGFyIHBoeXJlZywgdV9jaGFyIHBoeWFkZHIsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgbWlpX3dkYXRhKE1JSV9QUkVBTUJMRSwgIDIsIGlvYWRkcik7ICAgLyogU3RhcnQgb2YgMzQgYml0IHByZWFtYmxlLi4uICAgICovCisgICAgbWlpX3dkYXRhKE1JSV9QUkVBTUJMRSwgMzIsIGlvYWRkcik7ICAgLyogLi4uY29udGludWVkICAgICAgICAgICAgICAgICAgICovCisgICAgbWlpX3dkYXRhKE1JSV9TVFJELCA0LCBpb2FkZHIpOyAgICAgICAgLyogU0ZEIGFuZCBSZWFkIG9wZXJhdGlvbiAgICAgICAgICovCisgICAgbWlpX2FkZHJlc3MocGh5YWRkciwgaW9hZGRyKTsgICAgICAgICAgLyogUEhZIGFkZHJlc3MgdG8gYmUgYWNjZXNzZWQgICAgICovCisgICAgbWlpX2FkZHJlc3MocGh5cmVnLCBpb2FkZHIpOyAgICAgICAgICAgLyogUEhZIFJlZ2lzdGVyIHRvIHJlYWQgICAgICAgICAgICovCisgICAgbWlpX3RhKE1JSV9TVFJELCBpb2FkZHIpOyAgICAgICAgICAgICAgLyogVHVybiBhcm91bmQgdGltZSAtIDIgTURDICAgICAgICovCisgICAgCisgICAgcmV0dXJuIG1paV9yZGF0YShpb2FkZHIpOyAgICAgICAgICAgICAgLyogUmVhZCBkYXRhICAgICAgICAgICAgICAgICAgICAgICovCit9CisKK3N0YXRpYyB2b2lkCittaWlfd3IoaW50IGRhdGEsIHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKQoreworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsICAyLCBpb2FkZHIpOyAgIC8qIFN0YXJ0IG9mIDM0IGJpdCBwcmVhbWJsZS4uLiAgICAqLworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsIDMyLCBpb2FkZHIpOyAgIC8qIC4uLmNvbnRpbnVlZCAgICAgICAgICAgICAgICAgICAqLworICAgIG1paV93ZGF0YShNSUlfU1RXUiwgNCwgaW9hZGRyKTsgICAgICAgIC8qIFNGRCBhbmQgV3JpdGUgb3BlcmF0aW9uICAgICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeWFkZHIsIGlvYWRkcik7ICAgICAgICAgIC8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeXJlZywgaW9hZGRyKTsgICAgICAgICAgIC8qIFBIWSBSZWdpc3RlciB0byB3cml0ZSAgICAgICAgICAqLworICAgIG1paV90YShNSUlfU1RXUiwgaW9hZGRyKTsgICAgICAgICAgICAgIC8qIFR1cm4gYXJvdW5kIHRpbWUgLSAyIE1EQyAgICAgICAqLworICAgIGRhdGEgPSBtaWlfc3dhcChkYXRhLCAxNik7ICAgICAgICAgICAgIC8qIFN3YXAgZGF0YSBiaXQgb3JkZXJpbmcgICAgICAgICAqLworICAgIG1paV93ZGF0YShkYXRhLCAxNiwgaW9hZGRyKTsgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorbWlpX3JkYXRhKHVfbG9uZyBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgczMyIHRtcCA9IDA7CisgICAgCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykgeworCXRtcCA8PD0gMTsKKwl0bXAgfD0gZ2V0ZnJvbV9taWkoTUlJX01SRCB8IE1JSV9SRCwgaW9hZGRyKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQKK21paV93ZGF0YShpbnQgZGF0YSwgaW50IGxlbiwgdV9sb25nIGlvYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgZGF0YSwgaW9hZGRyKTsKKwlkYXRhID4+PSAxOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCittaWlfYWRkcmVzcyh1X2NoYXIgYWRkciwgdV9sb25nIGlvYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICAKKyAgICBhZGRyID0gbWlpX3N3YXAoYWRkciwgNSk7CisgICAgZm9yIChpPTA7IGk8NTsgaSsrKSB7CisJc2VuZHRvX21paShNSUlfTVdSIHwgTUlJX1dSLCBhZGRyLCBpb2FkZHIpOworCWFkZHIgPj49IDE7CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK21paV90YSh1X2xvbmcgcncsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgaWYgKHJ3ID09IE1JSV9TVFdSKSB7CisJc2VuZHRvX21paShNSUlfTVdSIHwgTUlJX1dSLCAxLCBpb2FkZHIpOyAgCisJc2VuZHRvX21paShNSUlfTVdSIHwgTUlJX1dSLCAwLCBpb2FkZHIpOyAgCisgICAgfSBlbHNlIHsKKwlnZXRmcm9tX21paShNSUlfTVJEIHwgTUlJX1JELCBpb2FkZHIpOyAgICAgICAgLyogVHJpLXN0YXRlIE1ESU8gKi8KKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50CittaWlfc3dhcChpbnQgZGF0YSwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgdG1wID0gMDsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCXRtcCA8PD0gMTsKKwl0bXAgfD0gKGRhdGEgJiAxKTsKKwlkYXRhID4+PSAxOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgdm9pZAorc2VuZHRvX21paSh1MzIgY29tbWFuZCwgaW50IGRhdGEsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgdTMyIGo7CisgICAgCisgICAgaiA9IChkYXRhICYgMSkgPDwgMTc7CisgICAgb3V0bChjb21tYW5kIHwgaiwgaW9hZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgb3V0bChjb21tYW5kIHwgTUlJX01EQyB8IGosIGlvYWRkcik7CisgICAgdWRlbGF5KDEpOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorZ2V0ZnJvbV9taWkodTMyIGNvbW1hbmQsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgb3V0bChjb21tYW5kLCBpb2FkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICBvdXRsKGNvbW1hbmQgfCBNSUlfTURDLCBpb2FkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm4gKChpbmwoaW9hZGRyKSA+PiAxOSkgJiAxKTsKK30KKworLyoKKyoqIEhlcmUncyAzIHdheXMgdG8gY2FsY3VsYXRlIHRoZSBPVUkgZnJvbSB0aGUgSUQgcmVnaXN0ZXJzLgorKi8KK3N0YXRpYyBpbnQKK21paV9nZXRfb3VpKHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKQoreworLyoKKyAgICB1bmlvbiB7CisJdV9zaG9ydCByZWc7CisJdV9jaGFyIGJyZWdbMl07CisgICAgfSBhOworICAgIGludCBpLCByMiwgcjMsIHJldD0wOyovCisgICAgaW50IHIyLCByMzsKKworICAgIC8qIFJlYWQgcjIgYW5kIHIzICovCisgICAgcjIgPSBtaWlfcmQoTUlJX0lEMCwgcGh5YWRkciwgaW9hZGRyKTsKKyAgICByMyA9IG1paV9yZChNSUlfSUQxLCBwaHlhZGRyLCBpb2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VFUSBhbmQgQ3lwcmVzcyB3YXkgKiAvCisgICAgLyAqIFNodWZmbGUgcjIgYW5kIHIzICogLworICAgIGEucmVnPTA7CisgICAgcjMgPSAoKHIzPj4xMCl8KHIyPDw2KSkmMHgwZmY7CisgICAgcjIgPSAoKHIyPj4yKSYweDNmZmYpOworCisgICAgLyAqIEJpdCByZXZlcnNlIHIzICogLworICAgIGZvciAoaT0wO2k8ODtpKyspIHsKKwlyZXQ8PD0xOworCXJldCB8PSAocjMmMSk7CisJcjM+Pj0xOworICAgIH0KKworICAgIC8gKiBCaXQgcmV2ZXJzZSByMiAqIC8KKyAgICBmb3IgKGk9MDtpPDE2O2krKykgeworCWEucmVnPDw9MTsKKwlhLnJlZyB8PSAocjImMSk7CisJcjI+Pj0xOworICAgIH0KKworICAgIC8gKiBTd2FwIHIyIGJ5dGVzICogLworICAgIGk9YS5icmVnWzBdOworICAgIGEuYnJlZ1swXT1hLmJyZWdbMV07CisgICAgYS5icmVnWzFdPWk7CisKKyAgICByZXR1cm4gKChhLnJlZzw8OCl8cmV0KTsgKi8gICAgICAgICAgICAgICAgIC8qIFNFRVEgYW5kIEN5cHJlc3Mgd2F5ICovCisvKiAgICByZXR1cm4gKChyMjw8Nil8KHVfaW50KShyMz4+MTApKTsgKi8gICAgICAvKiBOQVRJT05BTCBhbmQgQlJPQURDT00gd2F5ICovCisgICAgcmV0dXJuIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoSSBkaWQgaXQpIE15IHdheSAqLworfQorCisvKgorKiogVGhlIFNST00gc3BlYyBmb3JjZXMgdXMgdG8gc2VhcmNoIGFkZHJlc3NlcyBbMS0zMSAwXS4gQnVtbWVyLgorKi8KK3N0YXRpYyBpbnQKK21paV9nZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGosIGssIG4sIGxpbWl0PXNpemVvZihwaHlfaW5mbykvc2l6ZW9mKHN0cnVjdCBwaHlfdGFibGUpOworICAgIGludCBpZDsKKyAgICAKKyAgICBscC0+YWN0aXZlID0gMDsKKyAgICBscC0+dXNlTUlJID0gVFJVRTsKKworICAgIC8qIFNlYXJjaCB0aGUgTUlJIGFkZHJlc3Mgc3BhY2UgZm9yIHBvc3NpYmxlIFBIWSBkZXZpY2VzICovCisgICAgZm9yIChuPTAsIGxwLT5taWlfY250PTAsIGk9MTsgISgoaT09MSkgJiYgKG49PTEpKTsgaT0oaSsxKSVERTRYNV9NQVhfTUlJKSB7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyID0gaTsKKwlpZiAoaT09MCkgbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgY3ljbGVzICovCisJd2hpbGUgKGRlNHg1X3Jlc2V0X3BoeShkZXYpPDApIHVkZWxheSgxMDApOy8qIFdhaXQgZm9yIHJlc2V0ICovCisJaWQgPSBtaWlfZ2V0X291aShpLCBERTRYNV9NSUkpOyAKKwlpZiAoKGlkID09IDApIHx8IChpZCA9PSA2NTUzNSkpIGNvbnRpbnVlOyAgLyogVmFsaWQgSUQ/ICovCisJZm9yIChqPTA7IGo8bGltaXQ7IGorKykgeyAgICAgICAgICAgICAgICAgIC8qIFNlYXJjaCBQSFkgdGFibGUgKi8KKwkgICAgaWYgKGlkICE9IHBoeV9pbmZvW2pdLmlkKSBjb250aW51ZTsgICAgLyogSUQgbWF0Y2g/ICovCisJICAgIGZvciAoaz0wOyBscC0+cGh5W2tdLmlkICYmIChrIDwgREU0WDVfTUFYX1BIWSk7IGsrKyk7CisJICAgIGlmIChrIDwgREU0WDVfTUFYX1BIWSkgeworCQltZW1jcHkoKGNoYXIgKikmbHAtPnBoeVtrXSwKKwkJICAgICAgIChjaGFyICopJnBoeV9pbmZvW2pdLCBzaXplb2Yoc3RydWN0IHBoeV90YWJsZSkpOworCQlscC0+cGh5W2tdLmFkZHIgPSBpOworCQlscC0+bWlpX2NudCsrOworCQlscC0+YWN0aXZlKys7CisJICAgIH0gZWxzZSB7CisJCWdvdG8gcHVyZ2F0b3J5OyAgICAgICAgICAgICAgICAgICAgLyogU3RvcCB0aGUgc2VhcmNoICovCisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWlmICgoaiA9PSBsaW1pdCkgJiYgKGkgPCBERTRYNV9NQVhfTUlJKSkgeworCSAgICBmb3IgKGs9MDsgbHAtPnBoeVtrXS5pZCAmJiAoayA8IERFNFg1X01BWF9QSFkpOyBrKyspOworCSAgICBscC0+cGh5W2tdLmFkZHIgPSBpOworCSAgICBscC0+cGh5W2tdLmlkID0gaWQ7CisJICAgIGxwLT5waHlba10uc3BkLnJlZyA9IEdFTkVSSUNfUkVHOyAgICAgIC8qIEFOTFBBIHJlZ2lzdGVyICAgICAgICAgKi8KKwkgICAgbHAtPnBoeVtrXS5zcGQubWFzayA9IEdFTkVSSUNfTUFTSzsgICAgLyogMTAwTWIvcyB0ZWNobm9sb2dpZXMgICAqLworCSAgICBscC0+cGh5W2tdLnNwZC52YWx1ZSA9IEdFTkVSSUNfVkFMVUU7ICAvKiBUWCAmIFQ0LCBIL0YgRHVwbGV4ICAgICovCisJICAgIGxwLT5taWlfY250Kys7CisJICAgIGxwLT5hY3RpdmUrKzsKKwkgICAgcHJpbnRrKCIlczogVXNpbmcgZ2VuZXJpYyBNSUkgZGV2aWNlIGNvbnRyb2wuIElmIHRoZSBib2FyZCBkb2Vzbid0IG9wZXJhdGUsIFxucGxlYXNlIG1haWwgdGhlIGZvbGxvd2luZyBkdW1wIHRvIHRoZSBhdXRob3I6XG4iLCBkZXYtPm5hbWUpOworCSAgICBqID0gZGU0eDVfZGVidWc7CisJICAgIGRlNHg1X2RlYnVnIHw9IERFQlVHX01JSTsKKwkgICAgZGU0eDVfZGJnX21paShkZXYsIGspOworCSAgICBkZTR4NV9kZWJ1ZyA9IGo7CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgfQorICBwdXJnYXRvcnk6CisgICAgbHAtPmFjdGl2ZSA9IDA7CisgICAgaWYgKGxwLT5waHlbMF0uaWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgUEhZIGRldmljZXMgKi8KKwlmb3IgKGs9MDsgbHAtPnBoeVtrXS5pZCAmJiAoayA8IERFNFg1X01BWF9QSFkpOyBrKyspIHsgLypGb3IgZWFjaCBQSFkqLworCSAgICBtaWlfd3IoTUlJX0NSX1JTVCwgTUlJX0NSLCBscC0+cGh5W2tdLmFkZHIsIERFNFg1X01JSSk7CisJICAgIHdoaWxlIChtaWlfcmQoTUlJX0NSLCBscC0+cGh5W2tdLmFkZHIsIERFNFg1X01JSSkgJiBNSUlfQ1JfUlNUKTsKKwkgICAgCisJICAgIGRlNHg1X2RiZ19taWkoZGV2LCBrKTsKKwl9CisgICAgfQorICAgIGlmICghbHAtPm1paV9jbnQpIGxwLT51c2VNSUkgPSBGQUxTRTsKKworICAgIHJldHVybiBscC0+bWlpX2NudDsKK30KKworc3RhdGljIGNoYXIgKgorYnVpbGRfc2V0dXBfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwYSA9IGxwLT5zZXR1cF9mcmFtZTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBzZXR1cCBmcmFtZSAqLworICAgIGlmIChtb2RlID09IEFMTCkgeworCW1lbXNldChscC0+c2V0dXBfZnJhbWUsIDAsIFNFVFVQX0ZSQU1FX0xFTik7CisgICAgfQorICAgIAorICAgIGlmIChscC0+c2V0dXBfZiA9PSBIQVNIX1BFUkYpIHsKKwlmb3IgKHBhPWxwLT5zZXR1cF9mcmFtZStJTVBFUkZfUEFfT0ZGU0VULCBpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICAqKHBhICsgaSkgPSBkZXYtPmRldl9hZGRyW2ldOyAgICAgICAgICAgICAgICAgLyogSG9zdCBhZGRyZXNzICovCisJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gMjsKKwl9CisJKihscC0+c2V0dXBfZnJhbWUgKyAoSEFTSF9UQUJMRV9MRU4gPj4gMykgLSAzKSA9IDB4ODA7CisgICAgfSBlbHNlIHsKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7IC8qIEhvc3QgYWRkcmVzcyAqLworCSAgICAqKHBhICsgKGkmMSkpID0gZGV2LT5kZXZfYWRkcltpXTsKKwkgICAgaWYgKGkgJiAweDAxKSBwYSArPSA0OworCX0KKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7IC8qIEJyb2FkY2FzdCBhZGRyZXNzICovCisJICAgICoocGEgKyAoaSYxKSkgPSAoY2hhcikgMHhmZjsKKwkgICAgaWYgKGkgJiAweDAxKSBwYSArPSA0OworCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIHBhOyAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyB0byB0aGUgbmV4dCBlbnRyeSAqLworfQorCitzdGF0aWMgdm9pZAorZW5hYmxlX2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGltZV9vdXQpCit7CisgICAgdGltZW91dChkZXYsICh2b2lkICopJmRlNHg1X2FzdCwgKHVfbG9uZylkZXYsIHRpbWVfb3V0KTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkaXNhYmxlX2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgCisgICAgZGVsX3RpbWVyKCZscC0+dGltZXIpOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGxvbmcKK2RlNHg1X3N3aXRjaF9tYWNfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHMzMiBvbXI7CisKKyAgICBTVE9QX0RFNFg1OworCisgICAgLyogQXNzZXJ0IHRoZSBPTVJfUFMgYml0IGluIENTUjYgKi8KKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01SX0ZEWCkpOworICAgIG9tciB8PSBscC0+aW5mb2Jsb2NrX2NzcjY7CisgICAgaWYgKG9tciAmIE9NUl9QUykgb21yIHw9IE9NUl9IQkQ7CisgICAgb3V0bChvbXIsIERFNFg1X09NUik7CisgICAgCisgICAgLyogU29mdCBSZXNldCAqLworICAgIFJFU0VUX0RFNFg1OworICAgIAorICAgIC8qIFJlc3RvcmUgdGhlIEdFUCAtIGVzcGVjaWFsbHkgZm9yIENPTVBBQ1QgYW5kIFR5cGUgMCBJbmZvYmxvY2tzICovCisgICAgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwlnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJZ2VwX3dyKGxwLT5jYWNoZS5nZXAsIGRldik7CisgICAgfSBlbHNlIGlmICgobHAtPmNoaXBzZXQgJiB+MHgwZmYpID09IERDMjExNHgpIHsKKwlyZXNldF9pbml0X3NpYShkZXYsIGxwLT5jYWNoZS5jc3IxMywgbHAtPmNhY2hlLmNzcjE0LCBscC0+Y2FjaGUuY3NyMTUpOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgQ1NSNiAqLworICAgIG91dGwob21yLCBERTRYNV9PTVIpOworCisgICAgLyogUmVzZXQgQ1NSOCAqLworICAgIGlubChERTRYNV9NRkMpOworCisgICAgcmV0dXJuIG9tcjsKK30KKworc3RhdGljIHZvaWQKK2dlcF93cihzMzIgZGF0YSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJb3V0bChkYXRhLCBERTRYNV9HRVApOworICAgIH0gZWxzZSBpZiAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkgeworCW91dGwoKGRhdGE8PDE2KSB8IGxwLT5jYWNoZS5jc3IxNSwgREU0WDVfU0lHUik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50CitnZXBfcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJcmV0dXJuIGlubChERTRYNV9HRVApOworICAgIH0gZWxzZSBpZiAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkgeworCXJldHVybiAoaW5sKERFNFg1X1NJR1IpICYgMHgwMDBmZmZmZik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKCpmbikodV9sb25nIGRhdGEpLCB1X2xvbmcgZGF0YSwgdV9sb25nIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgZHQ7CisgICAgCisgICAgLyogRmlyc3QsIGNhbmNlbCBhbnkgcGVuZGluZyB0aW1lciBldmVudHMgKi8KKyAgICBkZWxfdGltZXIoJmxwLT50aW1lcik7CisgICAgCisgICAgLyogQ29udmVydCBtc2VjIHRvIHRpY2tzICovCisgICAgZHQgPSAobXNlYyAqIEhaKSAvIDEwMDA7CisgICAgaWYgKGR0PT0wKSBkdD0xOworICAgIAorICAgIC8qIFNldCB1cCB0aW1lciAqLworICAgIGluaXRfdGltZXIoJmxwLT50aW1lcik7CisgICAgbHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgZHQ7CisgICAgbHAtPnRpbWVyLmZ1bmN0aW9uID0gZm47CisgICAgbHAtPnRpbWVyLmRhdGEgPSBkYXRhOworICAgIGFkZF90aW1lcigmbHAtPnRpbWVyKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCit5YXduKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0ZSkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmICgobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgfHwgKGxwLT5jaGlwc2V0ID09IERDMjExNDApKSByZXR1cm47CisKKyAgICBpZihscC0+YnVzID09IEVJU0EpIHsKKwlzd2l0Y2goc3RhdGUpIHsKKwkgIGNhc2UgV0FLRVVQOgorCSAgICBvdXRiKFdBS0VVUCwgUENJX0NGUE0pOworCSAgICBtZGVsYXkoMTApOworCSAgICBicmVhazsKKworCSAgY2FzZSBTTk9PWkU6CisJICAgIG91dGIoU05PT1pFLCBQQ0lfQ0ZQTSk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNMRUVQOgorCSAgICBvdXRsKDAsIERFNFg1X1NJQ1IpOworCSAgICBvdXRiKFNMRUVQLCBQQ0lfQ0ZQTSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldiAobHAtPmdlbmRldik7CisJc3dpdGNoKHN0YXRlKSB7CisJICBjYXNlIFdBS0VVUDoKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgV0FLRVVQKTsKKwkgICAgbWRlbGF5KDEwKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05PT1pFOgorCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGREFfUFNNLCBTTk9PWkUpOworCSAgICBicmVhazsKKworCSAgY2FzZSBTTEVFUDoKKwkgICAgb3V0bCgwLCBERTRYNV9TSUNSKTsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgU0xFRVApOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfcGFyc2VfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBjaGFyICpwLCAqcSwgdDsKKworICAgIGxwLT5wYXJhbXMuZmR4ID0gMDsKKyAgICBscC0+cGFyYW1zLmF1dG9zZW5zZSA9IEFVVE87CisKKyAgICBpZiAoYXJncyA9PSBOVUxMKSByZXR1cm47CisKKyAgICBpZiAoKHAgPSBzdHJzdHIoYXJncywgZGV2LT5uYW1lKSkpIHsKKwlpZiAoIShxID0gc3Ryc3RyKHArc3RybGVuKGRldi0+bmFtZSksICJldGgiKSkpIHEgPSBwICsgc3RybGVuKHApOworCXQgPSAqcTsKKwkqcSA9ICdcMCc7CisKKwlpZiAoc3Ryc3RyKHAsICJmZHgiKSB8fCBzdHJzdHIocCwgIkZEWCIpKSBscC0+cGFyYW1zLmZkeCA9IDE7CisKKwlpZiAoc3Ryc3RyKHAsICJhdXRvc2Vuc2UiKSB8fCBzdHJzdHIocCwgIkFVVE9TRU5TRSIpKSB7CisJICAgIGlmIChzdHJzdHIocCwgIlRQIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBUUDsKKwkgICAgfSBlbHNlIGlmIChzdHJzdHIocCwgIlRQX05XIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBUUF9OVzsKKwkgICAgfSBlbHNlIGlmIChzdHJzdHIocCwgIkJOQyIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQk5DOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiQVVJIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBBVUk7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJCTkNfQVVJIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBCTkM7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICIxME1iIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBfMTBNYjsKKwkgICAgfSBlbHNlIGlmIChzdHJzdHIocCwgIjEwME1iIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBfMTAwTWI7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJBVVRPIikpIHsKKwkJbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBBVVRPOworCSAgICB9CisJfQorCSpxID0gdDsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9kYmdfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfT1BFTikgeworCXByaW50aygiJXM6IGRlNHg1IG9wZW5pbmcgd2l0aCBpcnEgJWRcbiIsZGV2LT5uYW1lLGRldi0+aXJxKTsKKwlwcmludGsoIlx0cGh5c2ljYWwgYWRkcmVzczogIik7CisJZm9yIChpPTA7aTw2O2krKykgeworCSAgICBwcmludGsoIiUyLjJ4OiIsKHNob3J0KWRldi0+ZGV2X2FkZHJbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJEZXNjcmlwdG9yIGhlYWQgYWRkcmVzc2VzOlxuIik7CisJcHJpbnRrKCJcdDB4JTguOGx4ICAweCU4LjhseFxuIiwodV9sb25nKWxwLT5yeF9yaW5nLCh1X2xvbmcpbHAtPnR4X3JpbmcpOworCXByaW50aygiRGVzY3JpcHRvciBhZGRyZXNzZXM6XG5SWDogIik7CisJZm9yIChpPTA7aTxscC0+cnhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQlwcmludGsoIjB4JTguOGx4ICAiLCh1X2xvbmcpJmxwLT5yeF9yaW5nW2ldLnN0YXR1cyk7CisJICAgIH0KKwl9CisJcHJpbnRrKCIuLi4weCU4LjhseFxuIiwodV9sb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXMpOworCXByaW50aygiVFg6ICIpOworCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJcHJpbnRrKCIweCU4LjhseCAgIiwgKHVfbG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwkgICAgfQorCX0KKwlwcmludGsoIi4uLjB4JTguOGx4XG4iLCAodV9sb25nKSZscC0+dHhfcmluZ1tpXS5zdGF0dXMpOworCXByaW50aygiRGVzY3JpcHRvciBidWZmZXJzOlxuUlg6ICIpOworCWZvciAoaT0wO2k8bHAtPnJ4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJcHJpbnRrKCIweCU4Ljh4ICAiLGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLmJ1ZikpOworCSAgICB9CisJfQorCXByaW50aygiLi4uMHglOC44eFxuIixsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpKTsKKwlwcmludGsoIlRYOiAiKTsKKwlmb3IgKGk9MDtpPGxwLT50eFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXByaW50aygiMHglOC44eCAgIiwgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYnVmKSk7CisJICAgIH0KKwl9CisJcHJpbnRrKCIuLi4weCU4Ljh4XG4iLCBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tpXS5idWYpKTsKKwlwcmludGsoIlJpbmcgc2l6ZTogXG5SWDogJWRcblRYOiAlZFxuIiwgCisJICAgICAgIChzaG9ydClscC0+cnhSaW5nU2l6ZSwgCisJICAgICAgIChzaG9ydClscC0+dHhSaW5nU2l6ZSk7IAorICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9kYmdfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBrKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIGlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX01JSSkgeworCXByaW50aygiXG5NSUkgZGV2aWNlIGFkZHJlc3M6ICVkXG4iLCBscC0+cGh5W2tdLmFkZHIpOworCXByaW50aygiTUlJIENSOiAgJXhcbiIsbWlpX3JkKE1JSV9DUixscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJcHJpbnRrKCJNSUkgU1I6ICAleFxuIixtaWlfcmQoTUlJX1NSLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwlwcmludGsoIk1JSSBJRDA6ICV4XG4iLG1paV9yZChNSUlfSUQwLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwlwcmludGsoIk1JSSBJRDE6ICV4XG4iLG1paV9yZChNSUlfSUQxLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwlpZiAobHAtPnBoeVtrXS5pZCAhPSBCUk9BRENPTV9UNCkgeworCSAgICBwcmludGsoIk1JSSBBTkE6ICV4XG4iLG1paV9yZCgweDA0LGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwkgICAgcHJpbnRrKCJNSUkgQU5DOiAleFxuIixtaWlfcmQoMHgwNSxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJfQorCXByaW50aygiTUlJIDE2OiAgJXhcbiIsbWlpX3JkKDB4MTAsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCWlmIChscC0+cGh5W2tdLmlkICE9IEJST0FEQ09NX1Q0KSB7CisJICAgIHByaW50aygiTUlJIDE3OiAgJXhcbiIsbWlpX3JkKDB4MTEsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCSAgICBwcmludGsoIk1JSSAxODogICV4XG4iLG1paV9yZCgweDEyLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwl9IGVsc2UgeworCSAgICBwcmludGsoIk1JSSAyMDogICV4XG4iLG1paV9yZCgweDE0LGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwl9CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2RiZ19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgCisgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCWlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX01FRElBKSB7CisJICAgIHByaW50aygiJXM6IG1lZGlhIGlzICVzJXNcbiIsIGRldi0+bmFtZSwKKwkJICAgKGxwLT5tZWRpYSA9PSBOQyAgPyAidW5jb25uZWN0ZWQsIGxpbmsgZG93biBvciBpbmNvbXBhdGlibGUgY29ubmVjdGlvbiIgOgorCQkgICAgKGxwLT5tZWRpYSA9PSBUUCAgPyAiVFAiIDoKKwkJICAgICAobHAtPm1lZGlhID09IEFOUyA/ICJUUC9Od2F5IiA6CisJCSAgICAgIChscC0+bWVkaWEgPT0gQk5DID8gIkJOQyIgOiAKKwkJICAgICAgIChscC0+bWVkaWEgPT0gQVVJID8gIkFVSSIgOiAKKwkJCShscC0+bWVkaWEgPT0gQk5DX0FVSSA/ICJCTkMvQVVJIiA6IAorCQkJIChscC0+bWVkaWEgPT0gRVhUX1NJQSA/ICJFWFQgU0lBIiA6IAorCQkJICAobHAtPm1lZGlhID09IF8xMDBNYiAgPyAiMTAwTWIvcyIgOgorCQkJICAgKGxwLT5tZWRpYSA9PSBfMTBNYiAgID8gIjEwTWIvcyIgOgorCQkJICAgICI/Pz8iCisJCQkgICAgKSkpKSkpKSkpLCAobHAtPmZkeD8iIGZ1bGwgZHVwbGV4LiI6Ii4iKSk7CisJfQorCWxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9kYmdfc3JvbShzdHJ1Y3QgZGU0eDVfc3JvbSAqcCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX1NST00pIHsKKwlwcmludGsoIlN1Yi1zeXN0ZW0gVmVuZG9yIElEOiAlMDR4XG4iLCAqKCh1X3Nob3J0ICopcC0+c3ViX3ZlbmRvcl9pZCkpOworCXByaW50aygiU3ViLXN5c3RlbSBJRDogICAgICAgICUwNHhcbiIsICooKHVfc2hvcnQgKilwLT5zdWJfc3lzdGVtX2lkKSk7CisJcHJpbnRrKCJJRCBCbG9jayBDUkM6ICAgICAgICAgJTAyeFxuIiwgKHVfY2hhcikocC0+aWRfYmxvY2tfY3JjKSk7CisJcHJpbnRrKCJTUk9NIHZlcnNpb246ICAgICAgICAgJTAyeFxuIiwgKHVfY2hhcikocC0+dmVyc2lvbikpOworCXByaW50aygiIyBjb250cm9sbGVyczogICAgICAgICAlMDJ4XG4iLCAodV9jaGFyKShwLT5udW1fY29udHJvbGxlcnMpKTsKKworCXByaW50aygiSGFyZHdhcmUgQWRkcmVzczogICAgICIpOworCWZvciAoaT0wO2k8RVRIX0FMRU4tMTtpKyspIHsKKwkgICAgcHJpbnRrKCIlMDJ4OiIsICh1X2NoYXIpKihwLT5pZWVlX2FkZHIraSkpOworCX0KKwlwcmludGsoIiUwMnhcbiIsICh1X2NoYXIpKihwLT5pZWVlX2FkZHIraSkpOworCXByaW50aygiQ1JDIGNoZWNrc3VtOiAgICAgICAgICUwNHhcbiIsICh1X3Nob3J0KShwLT5jaGtzdW0pKTsKKwlmb3IgKGk9MDsgaTw2NDsgaSsrKSB7CisJICAgIHByaW50aygiJTNkICUwNHhcbiIsIGk8PDEsICh1X3Nob3J0KSooKHVfc2hvcnQgKilwK2kpKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX3J4KHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19SWCkgeworCXByaW50aygiUjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggPC0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggbGVuL1NBUDolMDJ4JTAyeCBbJWRdXG4iLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVswXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMV0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzJdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVszXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbNF0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzVdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs2XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbN10sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzhdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs5XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMTBdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVsxMV0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzEyXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMTNdLAorCSAgICAgICBsZW4pOworCWZvciAoaj0wOyBsZW4+MDtqKz0xNiwgbGVuLT0xNikgeworCSAgcHJpbnRrKCIgICAgJTAzeDogIixqKTsKKwkgIGZvciAoaT0wOyBpPDE2ICYmIGk8bGVuOyBpKyspIHsKKwkgICAgcHJpbnRrKCIlMDJ4ICIsKHVfY2hhcilza2ItPmRhdGFbaStqXSk7CisJICB9CisJICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIFBlcmZvcm0gSU9DVEwgY2FsbCBmdW5jdGlvbnMgaGVyZS4gU29tZSBhcmUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFuZCB0aGUKKyoqIGVmZmVjdGl2ZSB1aWQgaXMgY2hlY2tlZCBpbiB0aG9zZSBjYXNlcy4gSW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgZXZlbnRzCisqKiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgbXkgdGVzdGluZy4KKyovCitzdGF0aWMgaW50CitkZTR4NV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGRlNHg1X2lvY3RsICppb2MgPSAoc3RydWN0IGRlNHg1X2lvY3RsICopICZycS0+aWZyX2lmcnU7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCBqLCBzdGF0dXMgPSAwOworICAgIHMzMiBvbXI7CisgICAgdW5pb24geworCXU4ICBhZGRyWzE0NF07CisJdTE2IHN2YWxbNzJdOworCXUzMiBsdmFsWzM2XTsKKyAgICB9IHRtcDsKKyAgICB1X2xvbmcgZmxhZ3MgPSAwOworICAgIAorICAgIHN3aXRjaChpb2MtPmNtZCkgeworICAgIGNhc2UgREU0WDVfR0VUX0hXQUREUjogICAgICAgICAgIC8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCWlvYy0+bGVuID0gRVRIX0FMRU47CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICB0bXAuYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJfQorCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAuYWRkciwgaW9jLT5sZW4pKSByZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfU0VUX0hXQUREUjogICAgICAgICAgIC8qIFNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlpZiAoY29weV9mcm9tX3VzZXIodG1wLmFkZHIsIGlvYy0+ZGF0YSwgRVRIX0FMRU4pKSByZXR1cm4gLUVGQVVMVDsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CisJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSB0bXAuYWRkcltpXTsKKwl9CisJYnVpbGRfc2V0dXBfZnJhbWUoZGV2LCBQSFlTX0FERFJfT05MWSk7CisJLyogU2V0IHVwIHRoZSBkZXNjcmlwdG9yIGFuZCBnaXZlIG93bmVyc2hpcCB0byB0aGUgY2FyZCAqLworCWxvYWRfcGFja2V0KGRldiwgbHAtPnNldHVwX2ZyYW1lLCBURF9JQyB8IFBFUkZFQ1RfRiB8IFREX1NFVCB8IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRVUF9GUkFNRV9MRU4sIChzdHJ1Y3Qgc2tfYnVmZiAqKTEpOworCWxwLT50eF9uZXcgPSAoKytscC0+dHhfbmV3KSAlIGxwLT50eFJpbmdTaXplOworCW91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7ICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHRoZSBUWCAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsgICAgICAgICAgICAgICAgICAgICAgLyogVW5sb2NrIHRoZSBUWCByaW5nICovCisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X1NFVF9QUk9NOiAgICAgICAgICAgICAvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlvbXIgPSBpbmwoREU0WDVfT01SKTsKKwlvbXIgfD0gT01SX1BSOworCW91dGwob21yLCBERTRYNV9PTVIpOworCWRldi0+ZmxhZ3MgfD0gSUZGX1BST01JU0M7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X0NMUl9QUk9NOiAgICAgICAgICAgICAvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCW9tciA9IGlubChERTRYNV9PTVIpOworCW9tciAmPSB+T01SX1BSOworCW91dGwob21yLCBERTRYNV9PTVIpOworCWRldi0+ZmxhZ3MgJj0gfklGRl9QUk9NSVNDOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9TQVlfQk9POiAgICAgICAgICAgICAgLyogU2F5ICJCb28hIiB0byB0aGUga2VybmVsIGxvZyBmaWxlICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCXByaW50aygiJXM6IEJvbyFcbiIsIGRldi0+bmFtZSk7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X01DQV9FTjogICAgICAgICAgICAgICAvKiBFbmFibGUgcGFzcyBhbGwgbXVsdGljYXN0IGFkZHJlc3NpbmcgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJb21yID0gaW5sKERFNFg1X09NUik7CisJb21yIHw9IE9NUl9QTTsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfR0VUX1NUQVRTOiAgICAgICAgICAgIC8qIEdldCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKyAgICB7CisgICAgICAgIHN0cnVjdCBwa3Rfc3RhdHMgc3RhdGJ1ZjsKKwlpb2MtPmxlbiA9IHNpemVvZihzdGF0YnVmKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwltZW1jcHkoJnN0YXRidWYsICZscC0+cGt0U3RhdHMsIGlvYy0+bGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCAmc3RhdGJ1ZiwgaW9jLT5sZW4pKSAKKwkJcmV0dXJuIC1FRkFVTFQ7IAorCWJyZWFrOworICAgIH0KKyAgICBjYXNlIERFNFg1X0NMUl9TVEFUUzogICAgICAgICAgICAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbWVtc2V0KCZscC0+cGt0U3RhdHMsIDAsIHNpemVvZihscC0+cGt0U3RhdHMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9HRVRfT01SOiAgICAgICAgICAgICAgLyogR2V0IHRoZSBPTVIgUmVnaXN0ZXIgY29udGVudHMgKi8KKwl0bXAuYWRkclswXSA9IGlubChERTRYNV9PTVIpOworCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAuYWRkciwgMSkpIHJldHVybiAtRUZBVUxUOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9TRVRfT01SOiAgICAgICAgICAgICAgLyogU2V0IHRoZSBPTVIgUmVnaXN0ZXIgY29udGVudHMgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC5hZGRyLCBpb2MtPmRhdGEsIDEpKSByZXR1cm4gLUVGQVVMVDsKKwlvdXRsKHRtcC5hZGRyWzBdLCBERTRYNV9PTVIpOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9HRVRfUkVHOiAgICAgICAgICAgICAgLyogR2V0IHRoZSBERTRYNSBSZWdpc3RlcnMgKi8KKwlqID0gMDsKKwl0bXAubHZhbFswXSA9IGlubChERTRYNV9TVFMpOyBqKz00OworCXRtcC5sdmFsWzFdID0gaW5sKERFNFg1X0JNUik7IGorPTQ7CisJdG1wLmx2YWxbMl0gPSBpbmwoREU0WDVfSU1SKTsgais9NDsKKwl0bXAubHZhbFszXSA9IGlubChERTRYNV9PTVIpOyBqKz00OworCXRtcC5sdmFsWzRdID0gaW5sKERFNFg1X1NJU1IpOyBqKz00OworCXRtcC5sdmFsWzVdID0gaW5sKERFNFg1X1NJQ1IpOyBqKz00OworCXRtcC5sdmFsWzZdID0gaW5sKERFNFg1X1NUUlIpOyBqKz00OworCXRtcC5sdmFsWzddID0gaW5sKERFNFg1X1NJR1IpOyBqKz00OworCWlvYy0+bGVuID0gajsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkgcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7CisJCisjZGVmaW5lIERFNFg1X0RVTVAgICAgICAgICAgICAgIDB4MGYgLyogRHVtcCB0aGUgREU0WDUgU3RhdHVzICovCisvKgkKKyAgICAgIGNhc2UgREU0WDVfRFVNUDoKKwlqID0gMDsKKwl0bXAuYWRkcltqKytdID0gZGV2LT5pcnE7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICB0bXAuYWRkcltqKytdID0gZGV2LT5kZXZfYWRkcltpXTsKKwl9CisJdG1wLmFkZHJbaisrXSA9IGxwLT5yeFJpbmdTaXplOworCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpbHAtPnJ4X3Jpbmc7IGorPTQ7CisJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZylscC0+dHhfcmluZzsgais9NDsKKwkKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpJmxwLT5yeF9yaW5nW2ldLnN0YXR1czsgais9NDsKKwkgICAgfQorCX0KKwl0bXAubHZhbFtqPj4yXSA9IChsb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXM7IGorPTQ7CisJZm9yIChpPTA7aTxscC0+dHhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQl0bXAubHZhbFtqPj4yXSA9IChsb25nKSZscC0+dHhfcmluZ1tpXS5zdGF0dXM7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzOyBqKz00OworCQorCWZvciAoaT0wO2k8bHAtPnJ4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJZm9yIChpPTA7aTxscC0+dHhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQl0bXAubHZhbFtqPj4yXSA9IChzMzIpbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYnVmKTsgais9NDsKKwkgICAgfQorCX0KKwl0bXAubHZhbFtqPj4yXSA9IChzMzIpbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYnVmKTsgais9NDsKKwkKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplO2krKyl7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsgais9NDsKKwl9CisJZm9yIChpPTA7aTxscC0+dHhSaW5nU2l6ZTtpKyspeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLnN0YXR1cyk7IGorPTQ7CisJfQorCQorCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X0JNUik7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1RQRCk7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1JQRCk7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1JSQkEpOyBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1RSQkEpOyBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1NUUyk7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X09NUik7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X0lNUik7ICBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gbHAtPmNoaXBzZXQ7IGorPTQ7IAorCWlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gZ2VwX3JkKGRldik7ICBqKz00OworCX0gZWxzZSB7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1NJU1IpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TSUNSKTsgais9NDsKKwkgICAgdG1wLmx2YWxbaj4+Ml0gPSBpbmwoREU0WDVfU1RSUik7IGorPTQ7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1NJR1IpOyBqKz00OyAKKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSBscC0+cGh5W2xwLT5hY3RpdmVdLmlkOyBqKz00OyAKKwlpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gbHAtPmFjdGl2ZTsgais9NDsgCisJICAgIHRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfQ1IsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIHRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfU1IsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIHRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfSUQwLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0lEMSxscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkgICAgaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgIT0gQlJPQURDT01fVDQpIHsKKwkJdG1wLmx2YWxbaj4+Ml09bWlpX3JkKE1JSV9BTkEsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfQU5MUEEsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIH0KKwkgICAgdG1wLmx2YWxbaj4+Ml09bWlpX3JkKDB4MTAsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIGlmIChscC0+cGh5W2xwLT5hY3RpdmVdLmlkICE9IEJST0FEQ09NX1Q0KSB7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZCgweDExLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCQl0bXAubHZhbFtqPj4yXT1taWlfcmQoMHgxMixscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkgICAgfSBlbHNlIHsKKwkJdG1wLmx2YWxbaj4+Ml09bWlpX3JkKDB4MTQsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIH0KKwl9CisJCisJdG1wLmFkZHJbaisrXSA9IGxwLT50eFJpbmdTaXplOworCXRtcC5hZGRyW2orK10gPSBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldik7CisJCisJaW9jLT5sZW4gPSBqOworCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAuYWRkciwgaW9jLT5sZW4pKSByZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKKworKi8KKyAgICBkZWZhdWx0OgorCXJldHVybiAtRU9QTk9UU1VQUDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgZGU0eDVfbW9kdWxlX2luaXQgKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKyNpZmRlZiBDT05GSUdfUENJCisJZXJyID0gcGNpX21vZHVsZV9pbml0ICgmZGU0eDVfcGNpX2RyaXZlcik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVyciB8PSBlaXNhX2RyaXZlcl9yZWdpc3RlciAoJmRlNHg1X2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlNHg1X21vZHVsZV9leGl0ICh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZkZTR4NV9wY2lfZHJpdmVyKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJmRlNHg1X2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdCAoZGU0eDVfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGRlNHg1X21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmggYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzdhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5oCkBAIC0wLDAgKzEsMTAyOSBAQAorLyoKKyAgICBDb3B5cmlnaHQgMTk5NCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byAgdGhlIHRlcm1zIG9mIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgIFRoZSBhdXRob3IgbWF5ICAgIGJlICByZWFjaGVkIGFzIGRhdmllc0B3YW50b24ubGtnLmRlYy5jb20gIG9yICAgRGlnaXRhbAorICAgIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgNTUwIEtpbmcgU3RyZWV0LCBMaXR0bGV0b24gTUEgMDE0NjAuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogREMyMTA0MCBDU1I8MS4uMTU+IFJlZ2lzdGVyIEFkZHJlc3MgTWFwCisqLworI2RlZmluZSBERTRYNV9CTVIgICAgaW9iYXNlKygweDAwMCA8PCBscC0+YnVzKSAgLyogQnVzIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfVFBEICAgIGlvYmFzZSsoMHgwMDggPDwgbHAtPmJ1cykgIC8qIFRyYW5zbWl0IFBvbGwgRGVtYW5kIFJlZyAqLworI2RlZmluZSBERTRYNV9SUEQgICAgaW9iYXNlKygweDAxMCA8PCBscC0+YnVzKSAgLyogUmVjZWl2ZSBQb2xsIERlbWFuZCBSZWcgKi8KKyNkZWZpbmUgREU0WDVfUlJCQSAgIGlvYmFzZSsoMHgwMTggPDwgbHAtPmJ1cykgIC8qIFJYIFJpbmcgQmFzZSBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBERTRYNV9UUkJBICAgaW9iYXNlKygweDAyMCA8PCBscC0+YnVzKSAgLyogVFggUmluZyBCYXNlIEFkZHJlc3MgUmVnICovCisjZGVmaW5lIERFNFg1X1NUUyAgICBpb2Jhc2UrKDB4MDI4IDw8IGxwLT5idXMpICAvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfT01SICAgIGlvYmFzZSsoMHgwMzAgPDwgbHAtPmJ1cykgIC8qIE9wZXJhdGlvbiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0lNUiAgICBpb2Jhc2UrKDB4MDM4IDw8IGxwLT5idXMpICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9NRkMgICAgaW9iYXNlKygweDA0MCA8PCBscC0+YnVzKSAgLyogTWlzc2VkIEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgREU0WDVfQVBST00gIGlvYmFzZSsoMHgwNDggPDwgbHAtPmJ1cykgIC8qIEV0aGVybmV0IEFkZHJlc3MgUFJPTSAqLworI2RlZmluZSBERTRYNV9CUk9NICAgaW9iYXNlKygweDA0OCA8PCBscC0+YnVzKSAgLyogQm9vdCBST00gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU1JPTSAgIGlvYmFzZSsoMHgwNDggPDwgbHAtPmJ1cykgIC8qIFNlcmlhbCBST00gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfTUlJICAgIGlvYmFzZSsoMHgwNDggPDwgbHAtPmJ1cykgIC8qIE1JSSBJbnRlcmZhY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfRERSICAgIGlvYmFzZSsoMHgwNTAgPDwgbHAtPmJ1cykgIC8qIERhdGEgRGlhZ25vc3RpYyBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9GRFIgICAgaW9iYXNlKygweDA1OCA8PCBscC0+YnVzKSAgLyogRnVsbCBEdXBsZXggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfR1BUICAgIGlvYmFzZSsoMHgwNTggPDwgbHAtPmJ1cykgIC8qIEdlbmVyYWwgUHVycG9zZSBUaW1lciBSZWcuKi8KKyNkZWZpbmUgREU0WDVfR0VQICAgIGlvYmFzZSsoMHgwNjAgPDwgbHAtPmJ1cykgIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TSVNSICAgaW9iYXNlKygweDA2MCA8PCBscC0+YnVzKSAgLyogU0lBIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TSUNSICAgaW9iYXNlKygweDA2OCA8PCBscC0+YnVzKSAgLyogU0lBIENvbm5lY3Rpdml0eSBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TVFJSICAgaW9iYXNlKygweDA3MCA8PCBscC0+YnVzKSAgLyogU0lBIFRYL1JYIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1NJR1IgICBpb2Jhc2UrKDB4MDc4IDw8IGxwLT5idXMpICAvKiBTSUEgR2VuZXJhbCBSZWdpc3RlciAqLworCisvKgorKiogRUlTQSBSZWdpc3RlciBBZGRyZXNzIE1hcAorKi8KKyNkZWZpbmUgRUlTQV9JRCAgICAgIGlvYmFzZSsweDBjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVycyAqLyAKKyNkZWZpbmUgRUlTQV9JRDAgICAgIGlvYmFzZSsweDBjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDAgKi8gCisjZGVmaW5lIEVJU0FfSUQxICAgICBpb2Jhc2UrMHgwYzgxICAgLyogRUlTQSBJRCBSZWdpc3RlciAxICovIAorI2RlZmluZSBFSVNBX0lEMiAgICAgaW9iYXNlKzB4MGM4MiAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMiAqLyAKKyNkZWZpbmUgRUlTQV9JRDMgICAgIGlvYmFzZSsweDBjODMgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDMgKi8gCisjZGVmaW5lIEVJU0FfQ1IgICAgICBpb2Jhc2UrMHgwYzg0ICAgLyogRUlTQSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEVJU0FfUkVHMCAgICBpb2Jhc2UrMHgwYzg4ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRUlTQV9SRUcxICAgIGlvYmFzZSsweDBjODkgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFSVNBX1JFRzIgICAgaW9iYXNlKzB4MGM4YSAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIEVJU0FfUkVHMyAgICBpb2Jhc2UrMHgwYzhmICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRUlTQV9BUFJPTSAgIGlvYmFzZSsweDBjOTAgICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKworLyoKKyoqIFBDSS9FSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIEFkZHJlc3MgTWFwCisqLworI2RlZmluZSBQQ0lfQ0ZJRCAgICAgaW9iYXNlKzB4MDAwOCAgIC8qIFBDSSBDb25maWd1cmF0aW9uIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DRkNTICAgICBpb2Jhc2UrMHgwMDBjICAgLyogUENJIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DRlJWICAgICBpb2Jhc2UrMHgwMDE4ICAgLyogUENJIFJldmlzaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DRkxUICAgICBpb2Jhc2UrMHgwMDFjICAgLyogUENJIExhdGVuY3kgVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NCSU8gICAgIGlvYmFzZSsweDAwMjggICAvKiBQQ0kgQmFzZSBJL08gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NCTUEgICAgIGlvYmFzZSsweDAwMmMgICAvKiBQQ0kgQmFzZSBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0JFUiAgICAgaW9iYXNlKzB4MDAzMCAgIC8qIFBDSSBFeHBhbnNpb24gUk9NIEJhc2UgQWRkcmVzcyBSZWcuICovCisjZGVmaW5lIFBDSV9DRklUICAgICBpb2Jhc2UrMHgwMDNjICAgLyogUENJIENvbmZpZ3VyYXRpb24gSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DRkRBICAgICBpb2Jhc2UrMHgwMDQwICAgLyogUENJIERyaXZlciBBcmVhIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DRkREICAgICBpb2Jhc2UrMHgwMDQxICAgLyogUENJIERyaXZlciBEZXBlbmRlbnQgQXJlYSBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZQTSAgICAgaW9iYXNlKzB4MDA0MyAgIC8qIFBDSSBQb3dlciBNYW5hZ2VtZW50IEFyZWEgUmVnaXN0ZXIgKi8KKworLyoKKyoqIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwIGJpdCBkZWZpbml0aW9ucworKi8KKyNkZWZpbmUgRVIwX0JTVyAgICAgICAweDgwICAgICAgICAgICAvKiBFSVNBIEJ1cyBTbGF2ZSBXaWR0aCwgMTogMzIgYml0cyAqLworI2RlZmluZSBFUjBfQk1XICAgICAgIDB4NDAgICAgICAgICAgIC8qIEVJU0EgQnVzIE1hc3RlciBXaWR0aCwgMTogMzIgYml0cyAqLworI2RlZmluZSBFUjBfRVBUICAgICAgIDB4MjAgICAgICAgICAgIC8qIEVJU0EgUFJFRU1QVCBUaW1lLCAwOiAyMyBCQ0xLcyAqLworI2RlZmluZSBFUjBfSVNUUyAgICAgIDB4MTAgICAgICAgICAgIC8qIEludGVycnVwdCBTdGF0dXMgKFgpICovCisjZGVmaW5lIEVSMF9MSSAgICAgICAgMHgwOCAgICAgICAgICAgLyogTGF0Y2ggSW50ZXJydXB0cyAqLworI2RlZmluZSBFUjBfSU5UTCAgICAgIDB4MDYgICAgICAgICAgIC8qIElOVGVycnVwdCBMZXZlbCAqLworI2RlZmluZSBFUjBfSU5UVCAgICAgIDB4MDEgICAgICAgICAgIC8qIElOVGVycnVwdCBUeXBlLCAwOiBMZXZlbCwgMTogRWRnZSAqLworCisvKgorKiogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgYml0IGRlZmluaXRpb25zCisqLworI2RlZmluZSBFUjFfSUFNICAgICAgIDB4ZTAgICAgICAgICAgIC8qIElTQSBBZGRyZXNzIE1vZGUgKi8KKyNkZWZpbmUgRVIxX0lBRSAgICAgICAweDEwICAgICAgICAgICAvKiBJU0EgQWRkcmVzc2luZyBFbmFibGUgKi8KKyNkZWZpbmUgRVIxX1VQSU4gICAgICAweDBmICAgICAgICAgICAvKiBVc2VyIFBpbnMgKi8KKworLyoKKyoqIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyIGJpdCBkZWZpbml0aW9ucworKi8KKyNkZWZpbmUgRVIyX0JSUyAgICAgICAweGMwICAgICAgICAgICAvKiBCb290IFJPTSBTaXplICovCisjZGVmaW5lIEVSMl9CUkEgICAgICAgMHgzYyAgICAgICAgICAgLyogQm9vdCBST00gQWRkcmVzcyA8MTY6MTM+ICovCisKKy8qCisqKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyBiaXQgZGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIEVSM19CV0UgICAgICAgMHg0MCAgICAgICAgICAgLyogQnVyc3QgV3JpdGUgRW5hYmxlICovCisjZGVmaW5lIEVSM19CUkUgICAgICAgMHgwNCAgICAgICAgICAgLyogQnVyc3QgUmVhZCBFbmFibGUgKi8KKyNkZWZpbmUgRVIzX0xTUiAgICAgICAweDAyICAgICAgICAgICAvKiBMb2NhbCBTb2Z0d2FyZSBSZXNldCAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gSUQgUmVnaXN0ZXIgKFBDSV9DRklEKS4gVGhlIERldmljZSBJRHMgYXJlIGxlZnQKKyoqIHNoaWZ0ZWQgOCBiaXRzIHRvIGFsbG93IGRldGVjdGlvbiBvZiBEQzIxMTQyIGFuZCBEQzIxMTQzIHZhcmlhbnRzIHdpdGgKKyoqIHRoZSBjb25maWd1cmF0aW9uIHJldmlzaW9uIHJlZ2lzdGVyIHN0ZXAgbnVtYmVyLgorKi8KKyNkZWZpbmUgQ0ZJRF9ESUQgICAgMHhmZjAwICAgICAgICAgICAvKiBEZXZpY2UgSUQgKi8KKyNkZWZpbmUgQ0ZJRF9WSUQgICAgMHgwMGZmICAgICAgICAgICAvKiBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgREMyMTA0MF9ESUQgMHgwMjAwICAgICAgICAgICAvKiBVbmlxdWUgRGV2aWNlIElEICMgKi8KKyNkZWZpbmUgREMyMTA0MF9WSUQgMHgxMDExICAgICAgICAgICAvKiBEQzIxMDQwIE1hbnVmYWN0dXJlciAqLworI2RlZmluZSBEQzIxMDQxX0RJRCAweDE0MDAgICAgICAgICAgIC8qIFVuaXF1ZSBEZXZpY2UgSUQgIyAqLworI2RlZmluZSBEQzIxMDQxX1ZJRCAweDEwMTEgICAgICAgICAgIC8qIERDMjEwNDEgTWFudWZhY3R1cmVyICovCisjZGVmaW5lIERDMjExNDBfRElEIDB4MDkwMCAgICAgICAgICAgLyogVW5pcXVlIERldmljZSBJRCAjICovCisjZGVmaW5lIERDMjExNDBfVklEIDB4MTAxMSAgICAgICAgICAgLyogREMyMTE0MCBNYW51ZmFjdHVyZXIgKi8KKyNkZWZpbmUgREMyMTE0eF9ESUQgMHgxOTAwICAgICAgICAgICAvKiBVbmlxdWUgRGV2aWNlIElEICMgKi8KKyNkZWZpbmUgREMyMTE0eF9WSUQgMHgxMDExICAgICAgICAgICAvKiBEQzIxMTRbMjNdIE1hbnVmYWN0dXJlciAqLworCisvKgorKiogQ2hpcHNldCBkZWZpbmVzCisqLworI2RlZmluZSBEQzIxMDQwICAgICBEQzIxMDQwX0RJRAorI2RlZmluZSBEQzIxMDQxICAgICBEQzIxMDQxX0RJRAorI2RlZmluZSBEQzIxMTQwICAgICBEQzIxMTQwX0RJRAorI2RlZmluZSBEQzIxMTR4ICAgICBEQzIxMTR4X0RJRAorI2RlZmluZSBEQzIxMTQyICAgICAoREMyMTE0eF9ESUQgfCAweDAwMTApCisjZGVmaW5lIERDMjExNDMgICAgIChEQzIxMTR4X0RJRCB8IDB4MDAzMCkKKyNkZWZpbmUgREMyMTE0eF9CUksgMHgwMDIwICAgICAgICAgICAvKiBDRlJWIGJyZWFrIGJldHdlZW4gREMyMTE0MiAmIERDMjExNDMgKi8KKworI2RlZmluZSBpc19EQzIxMDQwICgodmVuZG9yID09IERDMjEwNDBfVklEKSAmJiAoZGV2aWNlID09IERDMjEwNDBfRElEKSkKKyNkZWZpbmUgaXNfREMyMTA0MSAoKHZlbmRvciA9PSBEQzIxMDQxX1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMDQxX0RJRCkpCisjZGVmaW5lIGlzX0RDMjExNDAgKCh2ZW5kb3IgPT0gREMyMTE0MF9WSUQpICYmIChkZXZpY2UgPT0gREMyMTE0MF9ESUQpKQorI2RlZmluZSBpc19EQzIxMTR4ICgodmVuZG9yID09IERDMjExNHhfVklEKSAmJiAoZGV2aWNlID09IERDMjExNHhfRElEKSkKKyNkZWZpbmUgaXNfREMyMTE0MiAoKHZlbmRvciA9PSBEQzIxMTR4X1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMTQyKSkKKyNkZWZpbmUgaXNfREMyMTE0MyAoKHZlbmRvciA9PSBEQzIxMTR4X1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMTQzKSkKKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIChQQ0lfQ0ZDUykKKyovCisjZGVmaW5lIENGQ1NfRFBFICAgIDB4ODAwMDAwMDAgICAgICAgLyogRGV0ZWN0ZWQgUGFyaXR5IEVycm9yIChTKSAqLworI2RlZmluZSBDRkNTX1NTRSAgICAweDQwMDAwMDAwICAgICAgIC8qIFNpZ25hbCBTeXN0ZW0gRXJyb3IgICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19STUEgICAgMHgyMDAwMDAwMCAgICAgICAvKiBSZWNlaXZlIE1hc3RlciBBYm9ydCAgKFMpICovCisjZGVmaW5lIENGQ1NfUlRBICAgIDB4MTAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBUYXJnZXQgQWJvcnQgIChTKSAqLworI2RlZmluZSBDRkNTX0RTVCAgICAweDA2MDAwMDAwICAgICAgIC8qIERFVlNFTCBUaW1pbmcgICAgICAgICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19EUFIgICAgMHgwMTAwMDAwMCAgICAgICAvKiBEYXRhIFBhcml0eSBSZXBvcnQgICAgKFMpICovCisjZGVmaW5lIENGQ1NfRkJCICAgIDB4MDA4MDAwMDAgICAgICAgLyogRmFzdCBCYWNrLVRvLUJhY2sgICAgIChTKSAqLworI2RlZmluZSBDRkNTX1NFRSAgICAweDAwMDAwMTAwICAgICAgIC8qIFN5c3RlbSBFcnJvciBFbmFibGUgICAoQykgKi8KKyNkZWZpbmUgQ0ZDU19QRVIgICAgMHgwMDAwMDA0MCAgICAgICAvKiBQYXJpdHkgRXJyb3IgUmVzcG9uc2UgKEMpICovCisjZGVmaW5lIENGQ1NfTU8gICAgIDB4MDAwMDAwMDQgICAgICAgLyogTWFzdGVyIE9wZXJhdGlvbiAgICAgIChDKSAqLworI2RlZmluZSBDRkNTX01TQSAgICAweDAwMDAwMDAyICAgICAgIC8qIE1lbW9yeSBTcGFjZSBBY2Nlc3MgICAoQykgKi8KKyNkZWZpbmUgQ0ZDU19JT1NBICAgMHgwMDAwMDAwMSAgICAgICAvKiBJL08gU3BhY2UgQWNjZXNzICAgICAgKEMpICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBSZXZpc2lvbiBSZWdpc3RlciAoUENJX0NGUlYpCisqLworI2RlZmluZSBDRlJWX0JDICAgICAweGZmMDAwMDAwICAgICAgIC8qIEJhc2UgQ2xhc3MgKi8KKyNkZWZpbmUgQ0ZSVl9TQyAgICAgMHgwMGZmMDAwMCAgICAgICAvKiBTdWJjbGFzcyAqLworI2RlZmluZSBDRlJWX1JOICAgICAweDAwMDAwMGYwICAgICAgIC8qIFJldmlzaW9uIE51bWJlciAqLworI2RlZmluZSBDRlJWX1NOICAgICAweDAwMDAwMDBmICAgICAgIC8qIFN0ZXAgTnVtYmVyICovCisjZGVmaW5lIEJBU0VfQ0xBU1MgIDB4MDIwMDAwMDAgICAgICAgLyogSW5kaWNhdGVzIE5ldHdvcmsgQ29udHJvbGxlciAqLworI2RlZmluZSBTVUJfQ0xBU1MgICAweDAwMDAwMDAwICAgICAgIC8qIEluZGljYXRlcyBFdGhlcm5ldCBDb250cm9sbGVyICovCisjZGVmaW5lIFNURVBfTlVNQkVSIDB4MDAwMDAwMjAgICAgICAgLyogSW5jcmVtZW50cyBmb3IgZnV0dXJlIGNoaXBzICovCisjZGVmaW5lIFJFVl9OVU1CRVIgIDB4MDAwMDAwMDMgICAgICAgLyogMHgwMCwgMHgwMSwgMHgwMiwgMHgwMzogUmV2IGluIFN0ZXAgKi8KKyNkZWZpbmUgQ0ZSVl9NQVNLICAgMHhmZmZmMDAwMCAgICAgICAvKiBSZWdpc3RlciBtYXNrICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBMYXRlbmN5IFRpbWVyIFJlZ2lzdGVyIChQQ0lfQ0ZMVCkKKyovCisjZGVmaW5lIENGTFRfQkMgICAgIDB4MDAwMGZmMDAgICAgICAgLyogTGF0ZW5jeSBUaW1lciBiaXRzICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBCYXNlIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIChQQ0lfQ0JJTykKKyovCisjZGVmaW5lIENCSU9fTUFTSyAgIC0xMjggICAgICAgICAgICAgLyogQmFzZSBJL08gQWRkcmVzcyBNYXNrICovCisjZGVmaW5lIENCSU9fSU9TSSAgIDB4MDAwMDAwMDEgICAgICAgLyogSS9PIFNwYWNlIEluZGljYXRvciAoUk8sIHZhbHVlIGlzIDEpICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZSBSZWdpc3RlciAoUENJX0NDSVMpCisqLworI2RlZmluZSBDQ0lTX1JPTUkgICAweGYwMDAwMDAwICAgICAgIC8qIFJPTSBJbWFnZSAqLworI2RlZmluZSBDQ0lTX0FTTyAgICAweDBmZmZmZmY4ICAgICAgIC8qIEFkZHJlc3MgU3BhY2UgT2Zmc2V0ICovCisjZGVmaW5lIENDSVNfQVNJICAgIDB4MDAwMDAwMDcgICAgICAgLyogQWRkcmVzcyBTcGFjZSBJbmRpY2F0b3IgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIFN1YnN5c3RlbSBJRCBSZWdpc3RlciAoUENJX1NTSUQpCisqLworI2RlZmluZSBTU0lEX1NTSUQgICAweGZmZmYwMDAwICAgICAgIC8qIFN1YnN5c3RlbSBJRCAqLworI2RlZmluZSBTU0lEX1NWSUQgICAweDAwMDBmZmZmICAgICAgIC8qIFN1YnN5c3RlbSBWZW5kb3IgSUQgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIEV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChQQ0lfQ0JFUikKKyovCisjZGVmaW5lIENCRVJfTUFTSyAgIDB4ZmZmZmZjMDAgICAgICAgLyogRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MgTWFzayAqLworI2RlZmluZSBDQkVSX1JPTUUgICAweDAwMDAwMDAxICAgICAgIC8qIFJPTSBFbmFibGUgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIEludGVycnVwdCBSZWdpc3RlciAoUENJX0NGSVQpCisqLworI2RlZmluZSBDRklUX01YTFQgICAweGZmMDAwMDAwICAgICAgIC8qIE1BWF9MQVQgVmFsdWUgKDAuMjV1cyBwZXJpb2RzKSAqLworI2RlZmluZSBDRklUX01OR1QgICAweDAwZmYwMDAwICAgICAgIC8qIE1JTl9HTlQgVmFsdWUgKDAuMjV1cyBwZXJpb2RzKSAqLworI2RlZmluZSBDRklUX0lSUVAgICAweDAwMDBmZjAwICAgICAgIC8qIEludGVycnVwdCBQaW4gKi8KKyNkZWZpbmUgQ0ZJVF9JUlFMICAgMHgwMDAwMDBmZiAgICAgICAvKiBJbnRlcnJ1cHQgTGluZSAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gUG93ZXIgTWFuYWdlbWVudCBBcmVhIFJlZ2lzdGVyIChQQ0lfQ0ZQTSkKKyovCisjZGVmaW5lIFNMRUVQICAgICAgIDB4ODAgICAgICAgICAgICAgLyogUG93ZXIgU2F2aW5nIFNsZWVwIE1vZGUgKi8KKyNkZWZpbmUgU05PT1pFICAgICAgMHg0MCAgICAgICAgICAgICAvKiBQb3dlciBTYXZpbmcgU25vb3plIE1vZGUgKi8KKyNkZWZpbmUgV0FLRVVQICAgICAgMHgwMCAgICAgICAgICAgICAvKiBQb3dlciBTYXZpbmcgV2FrZXVwICovCisKKyNkZWZpbmUgUENJX0NGREFfRFNVIDB4NDEgICAgICAgICAgICAvKiA4IGJpdCBDb25maWd1cmF0aW9uIFNwYWNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0NGREFfUFNNIDB4NDMgICAgICAgICAgICAvKiA4IGJpdCBDb25maWd1cmF0aW9uIFNwYWNlIEFkZHJlc3MgKi8KKworLyoKKyoqIERDMjEwNDAgQnVzIE1vZGUgUmVnaXN0ZXIgKERFNFg1X0JNUikKKyovCisjZGVmaW5lIEJNUl9STUwgICAgMHgwMDIwMDAwMCAgICAgICAvKiBbTWVtb3J5XSBSZWFkIE11bHRpcGxlICovCisjZGVmaW5lIEJNUl9EQk8gICAgMHgwMDEwMDAwMCAgICAgICAvKiBEZXNjcmlwdG9yIEJ5dGUgT3JkZXJpbmcgKEVuZGlhbikgKi8KKyNkZWZpbmUgQk1SX1RBUCAgICAweDAwMGUwMDAwICAgICAgIC8qIFRyYW5zbWl0IEF1dG9tYXRpYyBQb2xsaW5nICovCisjZGVmaW5lIEJNUl9EQVMgICAgMHgwMDAxMDAwMCAgICAgICAvKiBEaWFnbm9zdGljIEFkZHJlc3MgU3BhY2UgKi8KKyNkZWZpbmUgQk1SX0NBTCAgICAweDAwMDBjMDAwICAgICAgIC8qIENhY2hlIEFsaWdubWVudCAqLworI2RlZmluZSBCTVJfUEJMICAgIDB4MDAwMDNmMDAgICAgICAgLyogUHJvZ3JhbW1hYmxlIEJ1cnN0IExlbmd0aCAqLworI2RlZmluZSBCTVJfQkxFICAgIDB4MDAwMDAwODAgICAgICAgLyogQmlnL0xpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUgQk1SX0RTTCAgICAweDAwMDAwMDdjICAgICAgIC8qIERlc2NyaXB0b3IgU2tpcCBMZW5ndGggKi8KKyNkZWZpbmUgQk1SX0JBUiAgICAweDAwMDAwMDAyICAgICAgIC8qIEJ1cyBBUmJpdHJhdGlvbiAqLworI2RlZmluZSBCTVJfU1dSICAgIDB4MDAwMDAwMDEgICAgICAgLyogU29mdHdhcmUgUmVzZXQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltaW5ncyBoZXJlIGFyZSBmb3IgMTBCQVNFLVQvQVVJIG9ubHkqLworI2RlZmluZSBUQVBfTk9QT0xMIDB4MDAwMDAwMDAgICAgICAgLyogTm8gYXV0b21hdGljIHBvbGxpbmcgKi8KKyNkZWZpbmUgVEFQXzIwMFVTICAweDAwMDIwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDIwMHVzICovCisjZGVmaW5lIFRBUF84MDBVUyAgMHgwMDA0MDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSA4MDB1cyAqLworI2RlZmluZSBUQVBfMV82TVMgIDB4MDAwNjAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgMS42bXMgKi8KKyNkZWZpbmUgVEFQXzEyXzhVUyAweDAwMDgwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDEyLjh1cyAqLworI2RlZmluZSBUQVBfMjVfNlVTIDB4MDAwYTAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgMjUuNnVzICovCisjZGVmaW5lIFRBUF81MV8yVVMgMHgwMDBjMDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSA1MS4ydXMgKi8KKyNkZWZpbmUgVEFQXzEwMl80VVMgMHgwMDBlMDAwMCAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDEwMi40dXMgKi8KKworI2RlZmluZSBDQUxfTk9VU0UgIDB4MDAwMDAwMDAgICAgICAgLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQ0FMXzhMT05HICAweDAwMDA0MDAwICAgICAgIC8qIDgtbG9uZ3dvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lIENBTF8xNkxPTkcgMHgwMDAwODAwMCAgICAgICAvKiAxNi1sb25nd29yZCBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgQ0FMXzMyTE9ORyAweDAwMDBjMDAwICAgICAgIC8qIDMyLWxvbmd3b3JkIGFsaWdubWVudCAqLworCisjZGVmaW5lIFBCTF8wICAgICAgMHgwMDAwMDAwMCAgICAgICAvKiAgRE1BIGJ1cnN0IGxlbmd0aCA9IGFtb3VudCBpbiBSWCBGSUZPICovCisjZGVmaW5lIFBCTF8xICAgICAgMHgwMDAwMDEwMCAgICAgICAvKiAgMSBsb25nd29yZCAgRE1BIGJ1cnN0IGxlbmd0aCAqLworI2RlZmluZSBQQkxfMiAgICAgIDB4MDAwMDAyMDAgICAgICAgLyogIDIgbG9uZ3dvcmRzIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzQgICAgICAweDAwMDAwNDAwICAgICAgIC8qICA0IGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIFBCTF84ICAgICAgMHgwMDAwMDgwMCAgICAgICAvKiAgOCBsb25nd29yZHMgRE1BIGJ1cnN0IGxlbmd0aCAqLworI2RlZmluZSBQQkxfMTYgICAgIDB4MDAwMDEwMDAgICAgICAgLyogMTYgbG9uZ3dvcmRzIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzMyICAgICAweDAwMDAyMDAwICAgICAgIC8qIDMyIGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisKKyNkZWZpbmUgRFNMXzAgICAgICAweDAwMDAwMDAwICAgICAgIC8qICAwIGxvbmd3b3JkICAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzEgICAgICAweDAwMDAwMDA0ICAgICAgIC8qICAxIGxvbmd3b3JkICAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzIgICAgICAweDAwMDAwMDA4ICAgICAgIC8qICAyIGxvbmd3b3JkcyAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzQgICAgICAweDAwMDAwMDEwICAgICAgIC8qICA0IGxvbmd3b3JkcyAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzggICAgICAweDAwMDAwMDIwICAgICAgIC8qICA4IGxvbmd3b3JkcyAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzE2ICAgICAweDAwMDAwMDQwICAgICAgIC8qIDE2IGxvbmd3b3JkcyAvIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRFNMXzMyICAgICAweDAwMDAwMDgwICAgICAgIC8qIDMyIGxvbmd3b3JkcyAvIGRlc2NyaXB0b3IgKi8KKworLyoKKyoqIERDMjEwNDAgVHJhbnNtaXQgUG9sbCBEZW1hbmQgUmVnaXN0ZXIgKERFNFg1X1RQRCkKKyovCisjZGVmaW5lIFRQRCAgICAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBUcmFuc21pdCBQb2xsIERlbWFuZCAqLworCisvKgorKiogREMyMTA0MCBSZWNlaXZlIFBvbGwgRGVtYW5kIFJlZ2lzdGVyIChERTRYNV9SUEQpCisqLworI2RlZmluZSBSUEQgICAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogUmVjZWl2ZSBQb2xsIERlbWFuZCAqLworCisvKgorKiogREMyMTA0MCBSZWNlaXZlIFJpbmcgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChERTRYNV9SUkJBKQorKi8KKyNkZWZpbmUgUlJCQSAgICAgICAweGZmZmZmZmZjICAgICAgIC8qIFJYIERlc2NyaXB0b3IgTGlzdCBTdGFydCBBZGRyZXNzICovCisKKy8qCisqKiBEQzIxMDQwIFRyYW5zbWl0IFJpbmcgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChERTRYNV9UUkJBKQorKi8KKyNkZWZpbmUgVFJCQSAgICAgICAweGZmZmZmZmZjICAgICAgIC8qIFRYIERlc2NyaXB0b3IgTGlzdCBTdGFydCBBZGRyZXNzICovCisKKy8qCisqKiBTdGF0dXMgUmVnaXN0ZXIgKERFNFg1X1NUUykKKyovCisjZGVmaW5lIFNUU19HUEkgICAgMHgwNDAwMDAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgUG9ydCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1RTX0JFICAgICAweDAzODAwMDAwICAgICAgIC8qIEJ1cyBFcnJvciBCaXRzICovCisjZGVmaW5lIFNUU19UUyAgICAgMHgwMDcwMDAwMCAgICAgICAvKiBUcmFuc21pdCBQcm9jZXNzIFN0YXRlICovCisjZGVmaW5lIFNUU19SUyAgICAgMHgwMDBlMDAwMCAgICAgICAvKiBSZWNlaXZlIFByb2Nlc3MgU3RhdGUgKi8KKyNkZWZpbmUgU1RTX05JUyAgICAweDAwMDEwMDAwICAgICAgIC8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworI2RlZmluZSBTVFNfQUlTICAgIDB4MDAwMDgwMDAgICAgICAgLyogQWJub3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgKi8KKyNkZWZpbmUgU1RTX0VSICAgICAweDAwMDA0MDAwICAgICAgIC8qIEVhcmx5IFJlY2VpdmUgKi8KKyNkZWZpbmUgU1RTX0ZCRSAgICAweDAwMDAyMDAwICAgICAgIC8qIEZhdGFsIEJ1cyBFcnJvciAqLworI2RlZmluZSBTVFNfU0UgICAgIDB4MDAwMDIwMDAgICAgICAgLyogU3lzdGVtIEVycm9yICovCisjZGVmaW5lIFNUU19MTkYgICAgMHgwMDAwMTAwMCAgICAgICAvKiBMaW5rIEZhaWwgKi8KKyNkZWZpbmUgU1RTX0ZEICAgICAweDAwMDAwODAwICAgICAgIC8qIEZ1bGwtRHVwbGV4IFNob3J0IEZyYW1lIFJlY2VpdmVkICovCisjZGVmaW5lIFNUU19UTSAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBUaW1lciBFeHBpcmVkIChEQzIxMDQxKSAqLworI2RlZmluZSBTVFNfRVRJICAgIDB4MDAwMDA0MDAgICAgICAgLyogRWFybHkgVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIFNUU19BVCAgICAgMHgwMDAwMDQwMCAgICAgICAvKiBBVUkvVFAgUGluICovCisjZGVmaW5lIFNUU19SV1QgICAgMHgwMDAwMDIwMCAgICAgICAvKiBSZWNlaXZlIFdhdGNoZG9nIFRpbWUtT3V0ICovCisjZGVmaW5lIFNUU19SUFMgICAgMHgwMDAwMDEwMCAgICAgICAvKiBSZWNlaXZlIFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBTVFNfUlUgICAgIDB4MDAwMDAwODAgICAgICAgLyogUmVjZWl2ZSBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgU1RTX1JJICAgICAweDAwMDAwMDQwICAgICAgIC8qIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIFNUU19VTkYgICAgMHgwMDAwMDAyMCAgICAgICAvKiBUcmFuc21pdCBVbmRlcmZsb3cgKi8KKyNkZWZpbmUgU1RTX0xOUCAgICAweDAwMDAwMDEwICAgICAgIC8qIExpbmsgUGFzcyAqLworI2RlZmluZSBTVFNfQU5DICAgIDB4MDAwMDAwMTAgICAgICAgLyogQXV0b25lZ290aWF0aW9uIENvbXBsZXRlICovCisjZGVmaW5lIFNUU19USlQgICAgMHgwMDAwMDAwOCAgICAgICAvKiBUcmFuc21pdCBKYWJiZXIgVGltZS1PdXQgKi8KKyNkZWZpbmUgU1RTX1RVICAgICAweDAwMDAwMDA0ICAgICAgIC8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworI2RlZmluZSBTVFNfVFBTICAgIDB4MDAwMDAwMDIgICAgICAgLyogVHJhbnNtaXQgUHJvY2VzcyBTdG9wcGVkICovCisjZGVmaW5lIFNUU19USSAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBFQl9QQVIgICAgIDB4MDAwMDAwMDAgICAgICAgLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIEVCX01BICAgICAgMHgwMDgwMDAwMCAgICAgICAvKiBNYXN0ZXIgQWJvcnQgKi8KKyNkZWZpbmUgRUJfVEEgICAgICAweDAxMDAwMDAwICAgICAgIC8qIFRhcmdldCBBYm9ydCAqLworI2RlZmluZSBFQl9SRVMwICAgIDB4MDE4MDAwMDAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRUJfUkVTMSAgICAweDAyMDAwMDAwICAgICAgIC8qIFJlc2VydmVkICovCisKKyNkZWZpbmUgVFNfU1RPUCAgICAweDAwMDAwMDAwICAgICAgIC8qIFN0b3BwZWQgKi8KKyNkZWZpbmUgVFNfRlREICAgICAweDAwMTAwMDAwICAgICAgIC8qIEZldGNoIFRyYW5zbWl0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFNfV0VPVCAgICAweDAwMjAwMDAwICAgICAgIC8qIFdhaXQgZm9yIEVuZCBPZiBUcmFuc21pc3Npb24gKi8KKyNkZWZpbmUgVFNfUURBVCAgICAweDAwMzAwMDAwICAgICAgIC8qIFF1ZXVlIHNrYiBkYXRhIGludG8gVFggRklGTyAqLworI2RlZmluZSBUU19SRVMgICAgIDB4MDA0MDAwMDAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFNfU1BLVCAgICAweDAwNTAwMDAwICAgICAgIC8qIFNldHVwIFBhY2tldCAqLworI2RlZmluZSBUU19TVVNQICAgIDB4MDA2MDAwMDAgICAgICAgLyogU3VzcGVuZGVkICovCisjZGVmaW5lIFRTX0NMVEQgICAgMHgwMDcwMDAwMCAgICAgICAvKiBDbG9zZSBUcmFuc21pdCBEZXNjcmlwdG9yICovCisKKyNkZWZpbmUgUlNfU1RPUCAgICAweDAwMDAwMDAwICAgICAgIC8qIFN0b3BwZWQgKi8KKyNkZWZpbmUgUlNfRlJEICAgICAweDAwMDIwMDAwICAgICAgIC8qIEZldGNoIFJlY2VpdmUgRGVzY3JpcHRvciAqLworI2RlZmluZSBSU19DRU9SICAgIDB4MDAwNDAwMDAgICAgICAgLyogQ2hlY2sgZm9yIEVuZCBvZiBSZWNlaXZlIFBhY2tldCAqLworI2RlZmluZSBSU19XRlJQICAgIDB4MDAwNjAwMDAgICAgICAgLyogV2FpdCBmb3IgUmVjZWl2ZSBQYWNrZXQgKi8KKyNkZWZpbmUgUlNfU1VTUCAgICAweDAwMDgwMDAwICAgICAgIC8qIFN1c3BlbmRlZCAqLworI2RlZmluZSBSU19DTFJEICAgIDB4MDAwYTAwMDAgICAgICAgLyogQ2xvc2UgUmVjZWl2ZSBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJTX0ZMVVNIICAgMHgwMDBjMDAwMCAgICAgICAvKiBGbHVzaCBSWCBGSUZPICovCisjZGVmaW5lIFJTX1FSRlMgICAgMHgwMDBlMDAwMCAgICAgICAvKiBRdWV1ZSBSWCBGSUZPIGludG8gUlggU2tiICovCisKKyNkZWZpbmUgSU5UX0NBTkNFTCAweDAwMDFmZmZmICAgICAgIC8qIEZvciB6ZXJvaW5nIGFsbCBpbnRlcnJ1cHQgc291cmNlcyAqLworCisvKgorKiogT3BlcmF0aW9uIE1vZGUgUmVnaXN0ZXIgKERFNFg1X09NUikKKyovCisjZGVmaW5lIE9NUl9TQyAgICAgMHg4MDAwMDAwMCAgICAgICAvKiBTcGVjaWFsIENhcHR1cmUgRWZmZWN0IEVuYWJsZSAqLworI2RlZmluZSBPTVJfUkEgICAgIDB4NDAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBBbGwgKi8KKyNkZWZpbmUgT01SX1NEUCAgICAweDAyMDAwMDAwICAgICAgIC8qIFNEIFBvbGFyaXR5IC0gTVVTVCBCRSBBU1NFUlRFRCAqLworI2RlZmluZSBPTVJfU0NSICAgIDB4MDEwMDAwMDAgICAgICAgLyogU2NyYW1ibGVyIE1vZGUgKi8KKyNkZWZpbmUgT01SX1BDUyAgICAweDAwODAwMDAwICAgICAgIC8qIFBDUyBGdW5jdGlvbiAqLworI2RlZmluZSBPTVJfVFRNICAgIDB4MDA0MDAwMDAgICAgICAgLyogVHJhbnNtaXQgVGhyZXNob2xkIE1vZGUgKi8KKyNkZWZpbmUgT01SX1NGICAgICAweDAwMjAwMDAwICAgICAgIC8qIFN0b3JlIGFuZCBGb3J3YXJkICovCisjZGVmaW5lIE9NUl9IQkQgICAgMHgwMDA4MDAwMCAgICAgICAvKiBIZWFydEJlYXQgRGlzYWJsZSAqLworI2RlZmluZSBPTVJfUFMgICAgIDB4MDAwNDAwMDAgICAgICAgLyogUG9ydCBTZWxlY3QgKi8KKyNkZWZpbmUgT01SX0NBICAgICAweDAwMDIwMDAwICAgICAgIC8qIENhcHR1cmUgRWZmZWN0IEVuYWJsZSAqLworI2RlZmluZSBPTVJfQlAgICAgIDB4MDAwMTAwMDAgICAgICAgLyogQmFjayBQcmVzc3VyZSAqLworI2RlZmluZSBPTVJfVFIgICAgIDB4MDAwMGMwMDAgICAgICAgLyogVGhyZXNob2xkIENvbnRyb2wgQml0cyAqLworI2RlZmluZSBPTVJfU1QgICAgIDB4MDAwMDIwMDAgICAgICAgLyogU3RhcnQvU3RvcCBUcmFuc21pc3Npb24gQ29tbWFuZCAqLworI2RlZmluZSBPTVJfRkMgICAgIDB4MDAwMDEwMDAgICAgICAgLyogRm9yY2UgQ29sbGlzaW9uIE1vZGUgKi8KKyNkZWZpbmUgT01SX09NICAgICAweDAwMDAwYzAwICAgICAgIC8qIE9wZXJhdGluZyBNb2RlICovCisjZGVmaW5lIE9NUl9GRFggICAgMHgwMDAwMDIwMCAgICAgICAvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIE9NUl9GS0QgICAgMHgwMDAwMDEwMCAgICAgICAvKiBGbGFreSBPc2NpbGxhdG9yIERpc2FibGUgKi8KKyNkZWZpbmUgT01SX1BNICAgICAweDAwMDAwMDgwICAgICAgIC8qIFBhc3MgQWxsIE11bHRpY2FzdCAqLworI2RlZmluZSBPTVJfUFIgICAgIDB4MDAwMDAwNDAgICAgICAgLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBPTVJfU0IgICAgIDB4MDAwMDAwMjAgICAgICAgLyogU3RhcnQvU3RvcCBCYWNrb2ZmIENvdW50ZXIgKi8KKyNkZWZpbmUgT01SX0lGICAgICAweDAwMDAwMDEwICAgICAgIC8qIEludmVyc2UgRmlsdGVyaW5nICovCisjZGVmaW5lIE9NUl9QQiAgICAgMHgwMDAwMDAwOCAgICAgICAvKiBQYXNzIEJhZCBGcmFtZXMgKi8KKyNkZWZpbmUgT01SX0hPICAgICAweDAwMDAwMDA0ICAgICAgIC8qIEhhc2ggT25seSBGaWx0ZXJpbmcgTW9kZSAqLworI2RlZmluZSBPTVJfU1IgICAgIDB4MDAwMDAwMDIgICAgICAgLyogU3RhcnQvU3RvcCBSZWNlaXZlICovCisjZGVmaW5lIE9NUl9IUCAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBIYXNoL1BlcmZlY3QgUmVjZWl2ZSBGaWx0ZXJpbmcgTW9kZSAqLworCisjZGVmaW5lIFRSXzcyICAgICAgMHgwMDAwMDAwMCAgICAgICAvKiBUaHJlc2hvbGQgc2V0IHRvIDcyICgxMjgpIGJ5dGVzICovCisjZGVmaW5lIFRSXzk2ICAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBUaHJlc2hvbGQgc2V0IHRvIDk2ICgyNTYpIGJ5dGVzICovCisjZGVmaW5lIFRSXzEyOCAgICAgMHgwMDAwODAwMCAgICAgICAvKiBUaHJlc2hvbGQgc2V0IHRvIDEyOCAoNTEyKSBieXRlcyAqLworI2RlZmluZSBUUl8xNjAgICAgIDB4MDAwMGMwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byAxNjAgKDEwMjQpIGJ5dGVzICovCisKKyNkZWZpbmUgT01SX0RFRiAgICAgKE9NUl9TRFApCisjZGVmaW5lIE9NUl9TSUEgICAgIChPTVJfU0RQIHwgT01SX1RUTSkKKyNkZWZpbmUgT01SX1NZTSAgICAgKE9NUl9TRFAgfCBPTVJfU0NSIHwgT01SX1BDUyB8IE9NUl9IQkQgfCBPTVJfUFMpCisjZGVmaW5lIE9NUl9NSUlfMTAgIChPTVJfU0RQIHwgT01SX1RUTSB8IE9NUl9QUykKKyNkZWZpbmUgT01SX01JSV8xMDAgKE9NUl9TRFAgfCBPTVJfSEJEIHwgT01SX1BTKQorCisvKgorKiogREMyMTA0MCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAoREU0WDVfSU1SKQorKi8KKyNkZWZpbmUgSU1SX0dQTSAgICAweDA0MDAwMDAwICAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBQb3J0IE1hc2sgKi8KKyNkZWZpbmUgSU1SX05JTSAgICAweDAwMDEwMDAwICAgICAgIC8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSBNYXNrICovCisjZGVmaW5lIElNUl9BSU0gICAgMHgwMDAwODAwMCAgICAgICAvKiBBYm5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSBNYXNrICovCisjZGVmaW5lIElNUl9FUk0gICAgMHgwMDAwNDAwMCAgICAgICAvKiBFYXJseSBSZWNlaXZlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0ZCTSAgICAweDAwMDAyMDAwICAgICAgIC8qIEZhdGFsIEJ1cyBFcnJvciBNYXNrICovCisjZGVmaW5lIElNUl9TRU0gICAgMHgwMDAwMjAwMCAgICAgICAvKiBTeXN0ZW0gRXJyb3IgTWFzayAqLworI2RlZmluZSBJTVJfTEZNICAgIDB4MDAwMDEwMDAgICAgICAgLyogTGluayBGYWlsIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0ZETSAgICAweDAwMDAwODAwICAgICAgIC8qIEZ1bGwtRHVwbGV4IChTaG9ydCBGcmFtZSkgTWFzayAqLworI2RlZmluZSBJTVJfVE1NICAgIDB4MDAwMDA4MDAgICAgICAgLyogVGltZXIgRXhwaXJlZCBNYXNrIChEQzIxMDQxKSAqLworI2RlZmluZSBJTVJfRVRNICAgIDB4MDAwMDA0MDAgICAgICAgLyogRWFybHkgVHJhbnNtaXQgSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU1SX0FUTSAgICAweDAwMDAwNDAwICAgICAgIC8qIEFVSS9UUCBTd2l0Y2ggTWFzayAqLworI2RlZmluZSBJTVJfUldNICAgIDB4MDAwMDAyMDAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyBUaW1lLU91dCBNYXNrICovCisjZGVmaW5lIElNUl9SU00gICAgMHgwMDAwMDEwMCAgICAgICAvKiBSZWNlaXZlIFN0b3BwZWQgTWFzayAqLworI2RlZmluZSBJTVJfUlVNICAgIDB4MDAwMDAwODAgICAgICAgLyogUmVjZWl2ZSBCdWZmZXIgVW5hdmFpbGFibGUgTWFzayAqLworI2RlZmluZSBJTVJfUklNICAgIDB4MDAwMDAwNDAgICAgICAgLyogUmVjZWl2ZSBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBJTVJfVU5NICAgIDB4MDAwMDAwMjAgICAgICAgLyogVW5kZXJmbG93IEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIElNUl9BTk0gICAgMHgwMDAwMDAxMCAgICAgICAvKiBBdXRvbmVnb3RpYXRpb24gQ29tcGxldGUgTWFzayAqLworI2RlZmluZSBJTVJfTFBNICAgIDB4MDAwMDAwMTAgICAgICAgLyogTGluayBQYXNzICovCisjZGVmaW5lIElNUl9USk0gICAgMHgwMDAwMDAwOCAgICAgICAvKiBUcmFuc21pdCBUaW1lLU91dCBKYWJiZXIgTWFzayAqLworI2RlZmluZSBJTVJfVFVNICAgIDB4MDAwMDAwMDQgICAgICAgLyogVHJhbnNtaXQgQnVmZmVyIFVuYXZhaWxhYmxlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RTTSAgICAweDAwMDAwMDAyICAgICAgIC8qIFRyYW5zbWlzc2lvbiBTdG9wcGVkIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RJTSAgICAweDAwMDAwMDAxICAgICAgIC8qIFRyYW5zbWl0IEludGVycnVwdCBNYXNrICovCisKKy8qCisqKiBNaXNzZWQgRnJhbWVzIGFuZCBGSUZPIE92ZXJmbG93IENvdW50ZXJzIChERTRYNV9NRkMpCisqLworI2RlZmluZSBNRkNfRk9DTyAgIDB4MTAwMDAwMDAgICAgICAgLyogRklGTyBPdmVyZmxvdyBDb3VudGVyIE92ZXJmbG93IEJpdCAqLworI2RlZmluZSBNRkNfRk9DICAgIDB4MGZmZTAwMDAgICAgICAgLyogRklGTyBPdmVyZmxvdyBDb3VudGVyIEJpdHMgKi8KKyNkZWZpbmUgTUZDX09WRkwgICAweDAwMDEwMDAwICAgICAgIC8qIE1pc3NlZCBGcmFtZXMgQ291bnRlciBPdmVyZmxvdyBCaXQgKi8KKyNkZWZpbmUgTUZDX0NOVFIgICAweDAwMDBmZmZmICAgICAgIC8qIE1pc3NlZCBGcmFtZXMgQ291bnRlciBCaXRzICovCisjZGVmaW5lIE1GQ19GT0NNICAgMHgxZmZlMDAwMCAgICAgICAvKiBGSUZPIE92ZXJmbG93IENvdW50ZXIgTWFzayAqLworCisvKgorKiogREMyMTA0MCBFdGhlcm5ldCBBZGRyZXNzIFBST00gKERFNFg1X0FQUk9NKQorKi8KKyNkZWZpbmUgQVBST01fRE4gICAweDgwMDAwMDAwICAgICAgIC8qIERhdGEgTm90IFZhbGlkICovCisjZGVmaW5lIEFQUk9NX0RUICAgMHgwMDAwMDBmZiAgICAgICAvKiBBZGRyZXNzIEJ5dGUgKi8KKworLyoKKyoqIERDMjEwNDEgQm9vdC9FdGhlcm5ldCBBZGRyZXNzIFJPTSAoREU0WDVfQlJPTSkKKyovCisjZGVmaW5lIEJST01fTU9ERSAweDAwMDA4MDAwICAgICAgIC8qIE1PREVfMTogMCwgIE1PREVfMDogMSAgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgQlJPTV9SRCAgIDB4MDAwMDQwMDAgICAgICAgLyogUmVhZCBmcm9tIEJvb3QgUk9NICovCisjZGVmaW5lIEJST01fV1IgICAweDAwMDAyMDAwICAgICAgIC8qIFdyaXRlIHRvIEJvb3QgUk9NICovCisjZGVmaW5lIEJST01fQlIgICAweDAwMDAxMDAwICAgICAgIC8qIFNlbGVjdCBCb290IFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBCUk9NX1NSICAgMHgwMDAwMDgwMCAgICAgICAvKiBTZWxlY3QgU2VyaWFsIFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBCUk9NX1JFRyAgMHgwMDAwMDQwMCAgICAgICAvKiBFeHRlcm5hbCBSZWdpc3RlciBTZWxlY3QgKi8KKyNkZWZpbmUgQlJPTV9EVCAgIDB4MDAwMDAwZmYgICAgICAgLyogRGF0YSBCeXRlICovCisKKy8qCisqKiBEQzIxMDQxIFNlcmlhbC9FdGhlcm5ldCBBZGRyZXNzIFJPTSAoREU0WDVfU1JPTSwgREU0WDVfTUlJKQorKi8KKyNkZWZpbmUgTUlJX01ESSAgIDB4MDAwODAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgRGF0YSBJbiAqLworI2RlZmluZSBNSUlfTURPICAgMHgwMDA2MDAwMCAgICAgICAvKiBNSUkgTWFuYWdlbWVudCBNb2RlL0RhdGEgT3V0ICovCisjZGVmaW5lIE1JSV9NUkQgICAweDAwMDQwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERlZmluZSBSZWFkIE1vZGUgKi8KKyNkZWZpbmUgTUlJX01XUiAgIDB4MDAwMDAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgRGVmaW5lIFdyaXRlIE1vZGUgKi8KKyNkZWZpbmUgTUlJX01EVCAgIDB4MDAwMjAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgRGF0YSBPdXQgKi8KKyNkZWZpbmUgTUlJX01EQyAgIDB4MDAwMTAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgQ2xvY2sgKi8KKyNkZWZpbmUgTUlJX1JEICAgIDB4MDAwMDQwMDAgICAgICAgLyogUmVhZCBmcm9tIE1JSSAqLworI2RlZmluZSBNSUlfV1IgICAgMHgwMDAwMjAwMCAgICAgICAvKiBXcml0ZSB0byBNSUkgKi8KKyNkZWZpbmUgTUlJX1NFTCAgIDB4MDAwMDA4MDAgICAgICAgLyogU2VsZWN0IE1JSSB3aGVuIFJFU0VUICovCisKKyNkZWZpbmUgU1JPTV9NT0RFIDB4MDAwMDgwMDAgICAgICAgLyogTU9ERV8xOiAwLCAgTU9ERV8wOiAxICAocmVhZCBvbmx5KSAqLworI2RlZmluZSBTUk9NX1JEICAgMHgwMDAwNDAwMCAgICAgICAvKiBSZWFkIGZyb20gQm9vdCBST00gKi8KKyNkZWZpbmUgU1JPTV9XUiAgIDB4MDAwMDIwMDAgICAgICAgLyogV3JpdGUgdG8gQm9vdCBST00gKi8KKyNkZWZpbmUgU1JPTV9CUiAgIDB4MDAwMDEwMDAgICAgICAgLyogU2VsZWN0IEJvb3QgUk9NIHdoZW4gc2V0ICovCisjZGVmaW5lIFNST01fU1IgICAweDAwMDAwODAwICAgICAgIC8qIFNlbGVjdCBTZXJpYWwgUk9NIHdoZW4gc2V0ICovCisjZGVmaW5lIFNST01fUkVHICAweDAwMDAwNDAwICAgICAgIC8qIEV4dGVybmFsIFJlZ2lzdGVyIFNlbGVjdCAqLworI2RlZmluZSBTUk9NX0RUICAgMHgwMDAwMDBmZiAgICAgICAvKiBEYXRhIEJ5dGUgKi8KKworI2RlZmluZSBEVF9PVVQgICAgMHgwMDAwMDAwOCAgICAgICAvKiBTZXJpYWwgRGF0YSBPdXQgKi8KKyNkZWZpbmUgRFRfSU4gICAgIDB4MDAwMDAwMDQgICAgICAgLyogU2VyaWFsIERhdGEgSW4gKi8KKyNkZWZpbmUgRFRfQ0xLICAgIDB4MDAwMDAwMDIgICAgICAgLyogU2VyaWFsIFJPTSBDbG9jayAqLworI2RlZmluZSBEVF9DUyAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBTZXJpYWwgUk9NIENoaXAgU2VsZWN0ICovCisKKyNkZWZpbmUgTUlJX1BSRUFNQkxFIDB4ZmZmZmZmZmYgICAgLyogTUlJIE1hbmFnZW1lbnQgUHJlYW1ibGUgKi8KKyNkZWZpbmUgTUlJX1RFU1QgICAgIDB4YWFhYWFhYWEgICAgLyogTUlJIFRlc3QgU2lnbmFsICovCisjZGVmaW5lIE1JSV9TVFJEICAgICAweDA2ICAgICAgICAgIC8qIFN0YXJ0IG9mIEZyYW1lK09wIENvZGU6IHVzZSBsb3cgbmliYmxlICovCisjZGVmaW5lIE1JSV9TVFdSICAgICAweDBhICAgICAgICAgIC8qIFN0YXJ0IG9mIEZyYW1lK09wIENvZGU6IHVzZSBsb3cgbmliYmxlICovCisKKyNkZWZpbmUgTUlJX0NSICAgICAgIDB4MDAgICAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfU1IgICAgICAgMHgwMSAgICAgICAgICAvKiBNSUkgTWFuYWdlbWVudCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0lEMCAgICAgIDB4MDIgICAgICAgICAgLyogUEhZIElkZW50aWZpZXIgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBNSUlfSUQxICAgICAgMHgwMyAgICAgICAgICAvKiBQSFkgSWRlbnRpZmllciBSZWdpc3RlciAxICovCisjZGVmaW5lIE1JSV9BTkEgICAgICAweDA0ICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBNSUlfQU5MUEEgICAgMHgwNSAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIExpbmsgUGFydG5lciBBYmlsaXR5ICovCisjZGVmaW5lIE1JSV9BTkUgICAgICAweDA2ICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gRXhwYW5zaW9uICovCisjZGVmaW5lIE1JSV9BTlAgICAgICAweDA3ICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gTmV4dCBQYWdlIFRYICovCisKKyNkZWZpbmUgREU0WDVfTUFYX01JSSAzMiAgICAgICAgICAgLyogTWF4aW11bSBhZGRyZXNzIG9mIE1JSSBQSFkgZGV2aWNlcyAqLworCisvKgorKiogTUlJIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlcgorKi8KKyNkZWZpbmUgTUlJX0NSX1JTVCAgMHg4MDAwICAgICAgICAgLyogUkVTRVQgdGhlIFBIWSBjaGlwICovCisjZGVmaW5lIE1JSV9DUl9MUEJLIDB4NDAwMCAgICAgICAgIC8qIExvb3BiYWNrIGVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfU1BEICAweDIwMDAgICAgICAgICAvKiAwOiAxME1iL3M7IDE6IDEwME1iL3MgKi8KKyNkZWZpbmUgTUlJX0NSXzEwICAgMHgwMDAwICAgICAgICAgLyogU2V0IDEwTWIvcyAqLworI2RlZmluZSBNSUlfQ1JfMTAwICAweDIwMDAgICAgICAgICAvKiBTZXQgMTAwTWIvcyAqLworI2RlZmluZSBNSUlfQ1JfQVNTRSAweDEwMDAgICAgICAgICAvKiBBdXRvIFNwZWVkIFNlbGVjdCBFbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1BEICAgMHgwODAwICAgICAgICAgLyogUG93ZXIgRG93biAqLworI2RlZmluZSBNSUlfQ1JfSVNPTCAweDA0MDAgICAgICAgICAvKiBJc29sYXRlIE1vZGUgKi8KKyNkZWZpbmUgTUlJX0NSX1JBTiAgMHgwMjAwICAgICAgICAgLyogUmVzdGFydCBBdXRvIE5lZ290aWF0aW9uICovCisjZGVmaW5lIE1JSV9DUl9GRE0gIDB4MDEwMCAgICAgICAgIC8qIEZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgTUlJX0NSX0NURSAgMHgwMDgwICAgICAgICAgLyogQ29sbGlzaW9uIFRlc3QgRW5hYmxlICovCisKKy8qCisqKiBNSUkgTWFuYWdlbWVudCBTdGF0dXMgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9TUl9UNEMgIDB4ODAwMCAgICAgICAgIC8qIDEwMEJBU0UtVDQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfVFhGRCAweDQwMDAgICAgICAgICAvKiAxMDBCQVNFLVRYIEZ1bGwgRHVwbGV4IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1RYSEQgMHgyMDAwICAgICAgICAgLyogMTAwQkFTRS1UWCBIYWxmIER1cGxleCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9URkQgIDB4MTAwMCAgICAgICAgIC8qIDEwQkFTRS1UIEZ1bGwgRHVwbGV4IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1RIRCAgMHgwODAwICAgICAgICAgLyogMTBCQVNFLVQgSGFsZiBEdXBsZXggY2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfQVNTQyAweDAwMjAgICAgICAgICAvKiBBdXRvIFNwZWVkIFNlbGVjdGlvbiBDb21wbGV0ZSovCisjZGVmaW5lIE1JSV9TUl9SRkQgIDB4MDAxMCAgICAgICAgIC8qIFJlbW90ZSBGYXVsdCBEZXRlY3RlZCAqLworI2RlZmluZSBNSUlfU1JfQU5DICAweDAwMDggICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX0xLUyAgMHgwMDA0ICAgICAgICAgLyogTGluayBTdGF0dXMgKi8KKyNkZWZpbmUgTUlJX1NSX0pBQkQgMHgwMDAyICAgICAgICAgLyogSmFiYmVyIERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfWEMgICAweDAwMDEgICAgICAgICAvKiBFeHRlbmRlZCBDYXBhYmlsaXRpZXMgKi8KKworLyoKKyoqIE1JSSBNYW5hZ2VtZW50IEF1dG8gTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgorKi8KKyNkZWZpbmUgTUlJX0FOQV9UQUYgIDB4MDNlMCAgICAgICAgLyogVGVjaG5vbG9neSBBYmlsaXR5IEZpZWxkICovCisjZGVmaW5lIE1JSV9BTkFfVDRBTSAweDAyMDAgICAgICAgIC8qIFQ0IFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfVFhBTSAweDAxODAgICAgICAgIC8qIFRYIFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfRkRBTSAweDAxNDAgICAgICAgIC8qIEZ1bGwgRHVwbGV4IFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfSERBTSAweDAyYTAgICAgICAgIC8qIEhhbGYgRHVwbGV4IFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfMTAwTSAweDAzODAgICAgICAgIC8qIDEwME1iIFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfMTBNICAweDAwNjAgICAgICAgIC8qIDEwTWIgVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOQV9DU01BIDB4MDAwMSAgICAgICAgLyogQ1NNQS1DRCBDYXBhYmxlICovCisKKy8qCisqKiBNSUkgTWFuYWdlbWVudCBBdXRvIE5lZ290aWF0aW9uIFJlbW90ZSBFbmQgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9BTkxQQV9OUCAgIDB4ODAwMCAgICAgIC8qIE5leHQgUGFnZSAoRW5hYmxlKSAqLworI2RlZmluZSBNSUlfQU5MUEFfQUNLICAweDQwMDAgICAgICAvKiBSZW1vdGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX1JGICAgMHgyMDAwICAgICAgLyogUmVtb3RlIEZhdWx0ICovCisjZGVmaW5lIE1JSV9BTkxQQV9UQUYgIDB4MDNlMCAgICAgIC8qIFRlY2hub2xvZ3kgQWJpbGl0eSBGaWVsZCAqLworI2RlZmluZSBNSUlfQU5MUEFfVDRBTSAweDAyMDAgICAgICAvKiBUNCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfVFhBTSAweDAxODAgICAgICAvKiBUWCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfRkRBTSAweDAxNDAgICAgICAvKiBGdWxsIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfSERBTSAweDAyYTAgICAgICAvKiBIYWxmIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfMTAwTSAweDAzODAgICAgICAvKiAxMDBNYiBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfMTBNICAweDAwNjAgICAgICAvKiAxME1iIFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkxQQV9DU01BIDB4MDAwMSAgICAgIC8qIENTTUEtQ0QgQ2FwYWJsZSAqLworCisvKgorKiogU1JPTSBNZWRpYSBEZWZpbml0aW9ucyAoQUJHIFNST00gU2VjdGlvbikKKyovCisjZGVmaW5lIE1FRElBX05XQVkgICAgIDB4MDA4MCAgICAgIC8qIE53YXkgKEF1dG8gTmVnb3RpYXRpb24pIG9uIFBIWSAqLworI2RlZmluZSBNRURJQV9NSUkgICAgICAweDAwNDAgICAgICAvKiBNSUkgUHJlc2VudCBvbiB0aGUgYWRhcHRlciAqLworI2RlZmluZSBNRURJQV9GSUJSRSAgICAweDAwMDggICAgICAvKiBGaWJyZSBNZWRpYSBwcmVzZW50ICovCisjZGVmaW5lIE1FRElBX0FVSSAgICAgIDB4MDAwNCAgICAgIC8qIEFVSSBNZWRpYSBwcmVzZW50ICovCisjZGVmaW5lIE1FRElBX1RQICAgICAgIDB4MDAwMiAgICAgIC8qIFRQIE1lZGlhIHByZXNlbnQgKi8KKyNkZWZpbmUgTUVESUFfQk5DICAgICAgMHgwMDAxICAgICAgLyogQk5DIE1lZGlhIHByZXNlbnQgKi8KKworLyoKKyoqIFNST00gRGVmaW5pdGlvbnMgKERpZ2l0YWwgU2VtaWNvbmR1Y3RvciBGb3JtYXQpCisqLworI2RlZmluZSBTUk9NX1NTVklEICAgICAweDAwMDAgICAgICAvKiBTdWItc3lzdGVtIFZlbmRvciBJRCBvZmZzZXQgKi8KKyNkZWZpbmUgU1JPTV9TU0lEICAgICAgMHgwMDAyICAgICAgLyogU3ViLXN5c3RlbSBJRCBvZmZzZXQgKi8KKyNkZWZpbmUgU1JPTV9DSVNQTCAgICAgMHgwMDA0ICAgICAgLyogQ2FyZEJ1cyBDSVMgUG9pbnRlciBsb3cgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fQ0lTUEggICAgIDB4MDAwNiAgICAgIC8qIENhcmRCdXMgQ0lTIFBvaW50ZXIgaGlnaCBvZmZzZXQgKi8KKyNkZWZpbmUgU1JPTV9JRENSQyAgICAgMHgwMDEwICAgICAgLyogSUQgQmxvY2sgQ1JDIG9mZnNldCovCisjZGVmaW5lIFNST01fUlNWRDIgICAgIDB4MDAxMSAgICAgIC8qIElEIFJlc2VydmVkIDIgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fU0ZWICAgICAgIDB4MDAxMiAgICAgIC8qIFNST00gRm9ybWF0IFZlcnNpb24gb2Zmc2V0ICovCisjZGVmaW5lIFNST01fQ0NOVCAgICAgIDB4MDAxMyAgICAgIC8qIENvbnRyb2xsZXIgQ291bnQgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fSFdBREQgICAgIDB4MDAxNCAgICAgIC8qIEhhcmR3YXJlIEFkZHJlc3Mgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fTVJTVkQgICAgIDB4MDA3YyAgICAgIC8qIE1hbnVmYWN0dXJlciBSZXNlcnZlZCBvZmZzZXQqLworI2RlZmluZSBTUk9NX0NSQyAgICAgICAweDAwN2UgICAgICAvKiBTUk9NIENSQyBvZmZzZXQgKi8KKworLyoKKyoqIFNST00gTWVkaWEgQ29ubmVjdGlvbiBEZWZpbml0aW9ucworKi8KKyNkZWZpbmUgU1JPTV8xMEJUICAgICAgMHgwMDAwICAgICAgLyogIDEwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTBCVE4gICAgIDB4MDEwMCAgICAgIC8qICAxMEJBU0UtVCB3aXRoIE53YXkgKi8KKyNkZWZpbmUgU1JPTV8xMEJURiAgICAgMHgwMjA0ICAgICAgLyogIDEwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTBCVE5MUCAgIDB4MDQwMCAgICAgIC8qICAxMEJBU0UtVCB3aXRob3V0IExpbmsgUGFzcyB0ZXN0ICovCisjZGVmaW5lIFNST01fMTBCMiAgICAgIDB4MDAwMSAgICAgIC8qICAxMEJBU0UtMiAoQk5DKSAqLworI2RlZmluZSBTUk9NXzEwQjUgICAgICAweDAwMDIgICAgICAvKiAgMTBCQVNFLTUgKEFVSSkgKi8KKyNkZWZpbmUgU1JPTV8xMDBCVEggICAgMHgwMDAzICAgICAgLyogIDEwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJURiAgICAweDAyMDUgICAgICAvKiAgMTAwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTAwQlQ0ICAgIDB4MDAwNiAgICAgIC8qICAxMDBCQVNFLVQ0ICovCisjZGVmaW5lIFNST01fMTAwQkZYICAgIDB4MDAwNyAgICAgIC8qICAxMDBCQVNFLUZYIGhhbGYgZHVwbGV4IChGaWJlcikgKi8KKyNkZWZpbmUgU1JPTV9NMTBCVCAgICAgMHgwMDA5ICAgICAgLyogIE1JSSAxMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMEJURiAgICAweDAyMGEgICAgICAvKiAgTUlJIDEwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fTTEwMEJUICAgIDB4MDAwZCAgICAgIC8qICBNSUkgMTAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fTTEwMEJURiAgIDB4MDIwZSAgICAgIC8qICBNSUkgMTAwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fTTEwMEJUNCAgIDB4MDAwZiAgICAgIC8qICBNSUkgMTAwQkFTRS1UNCAqLworI2RlZmluZSBTUk9NX00xMDBCRiAgICAweDAwMTAgICAgICAvKiAgTUlJIDEwMEJBU0UtRlggaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV9NMTAwQkZGICAgMHgwMjExICAgICAgLyogIE1JSSAxMDBCQVNFLUZYIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fUERBICAgICAgIDB4MDgwMCAgICAgIC8qICBQb3dlcnVwICYgRHluYW1pYyBBdXRvc2Vuc2UgKi8KKyNkZWZpbmUgU1JPTV9QQU8gICAgICAgMHg4ODAwICAgICAgLyogIFBvd2VydXAgQXV0b3NlbnNlIE9ubHkgKi8KKyNkZWZpbmUgU1JPTV9OU01JICAgICAgMHhmZmZmICAgICAgLyogIE5vIFNlbGVjdGVkIE1lZGlhIEluZm9ybWF0aW9uICovCisKKy8qCisqKiBTUk9NIE1lZGlhIERlZmluaXRpb25zCisqLworI2RlZmluZSBTUk9NXzEwQkFTRVQgICAweDAwMDAgICAgICAvKiAgMTBCQVNFLVQgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV8xMEJBU0UyICAgMHgwMDAxICAgICAgLyogIDEwQkFTRS0yIChCTkMpICovCisjZGVmaW5lIFNST01fMTBCQVNFNSAgIDB4MDAwMiAgICAgIC8qICAxMEJBU0UtNSAoQVVJKSAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VUICAweDAwMDMgICAgICAvKiAgMTAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTBCQVNFVEYgIDB4MDAwNCAgICAgIC8qICAxMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VURiAweDAwMDUgICAgICAvKiAgMTAwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTAwQkFTRVQ0IDB4MDAwNiAgICAgIC8qICAxMDBCQVNFLVQ0ICovCisjZGVmaW5lIFNST01fMTAwQkFTRUYgIDB4MDAwNyAgICAgIC8qICAxMDBCQVNFLUZYIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTAwQkFTRUZGIDB4MDAwOCAgICAgIC8qICAxMDBCQVNFLUZYIGZ1bGwgZHVwbGV4ICovCisKKyNkZWZpbmUgQkxPQ0tfTEVOICAgICAgMHg3ZiAgICAgICAgLyogRXh0ZW5kZWQgYmxvY2tzIGxlbmd0aCBtYXNrICovCisjZGVmaW5lIEVYVF9GSUVMRCAgICAgIDB4NDAgICAgICAgIC8qIEV4dGVuZGVkIGJsb2NrcyBleHRlbnNpb24gZmllbGQgYml0ICovCisjZGVmaW5lIE1FRElBX0NPREUgICAgIDB4M2YgICAgICAgIC8qIEV4dGVuZGVkIGJsb2NrcyBtZWRpYSBjb2RlIG1hc2sgKi8KKworLyoKKyoqIFNST00gQ29tcGFjdCBGb3JtYXQgQmxvY2sgTWFza3MKKyovCisjZGVmaW5lIENPTVBBQ1RfRkkgICAgICAweDgwICAgICAgIC8qIEZvcm1hdCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgQ09NUEFDVF9MRU4gICAgIDB4MDQgICAgICAgLyogTGVuZ3RoICovCisjZGVmaW5lIENPTVBBQ1RfTUMgICAgICAweDNmICAgICAgIC8qIE1lZGlhIENvZGUgKi8KKworLyoKKyoqIFNST00gRXh0ZW5kZWQgRm9ybWF0IEJsb2NrIFR5cGUgMCBNYXNrcworKi8KKyNkZWZpbmUgQkxPQ0swX0ZJICAgICAgMHg4MCAgICAgICAgLyogRm9ybWF0IEluZGljYXRvciAqLworI2RlZmluZSBCTE9DSzBfTUNTICAgICAweDgwICAgICAgICAvKiBNZWRpYSBDb2RlIGJ5dGUgU2lnbiAqLworI2RlZmluZSBCTE9DSzBfTUMgICAgICAweDNmICAgICAgICAvKiBNZWRpYSBDb2RlICovCisKKy8qCisqKiBEQzIxMDQwIEZ1bGwgRHVwbGV4IFJlZ2lzdGVyIChERTRYNV9GRFIpCisqLworI2RlZmluZSBGRFJfRkRBQ1YgIDB4MDAwMGZmZmYgICAgICAvKiBGdWxsIER1cGxleCBBdXRvIENvbmZpZ3VyYXRpb24gVmFsdWUgKi8KKworLyoKKyoqIERDMjEwNDEgR2VuZXJhbCBQdXJwb3NlIFRpbWVyIFJlZ2lzdGVyIChERTRYNV9HUFQpCisqLworI2RlZmluZSBHUFRfQ09OICAweDAwMDEwMDAwICAgICAgICAvKiBPbmUgc2hvdDogMCwgIENvbnRpbnVvdXM6IDEgKi8KKyNkZWZpbmUgR1BUX1ZBTCAgMHgwMDAwZmZmZiAgICAgICAgLyogVGltZXIgVmFsdWUgKi8KKworLyoKKyoqIERDMjExNDAgR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIChERTRYNV9HRVApIChoYXJkd2FyZSBkZXBlbmRlbnQgYml0cykKKyovCisvKiBWYWxpZCBPTkxZIGZvciBERTUwMCBoYXJkd2FyZSAqLworI2RlZmluZSBHRVBfTE5QICAweDAwMDAwMDgwICAgICAgICAvKiBMaW5rIFBhc3MgICAgICAgICAgICAgICAoaW5wdXQpICAgICAgICAqLworI2RlZmluZSBHRVBfU0xOSyAweDAwMDAwMDQwICAgICAgICAvKiBTWU0gTElOSyAgICAgICAgICAgICAgICAoaW5wdXQpICAgICAgICAqLworI2RlZmluZSBHRVBfU0RFVCAweDAwMDAwMDIwICAgICAgICAvKiBTaWduYWwgRGV0ZWN0ICAgICAgICAgICAoaW5wdXQpICAgICAgICAqLworI2RlZmluZSBHRVBfSFJTVCAweDAwMDAwMDEwICAgICAgICAvKiBIYXJkIFJFU0VUICh0byBQSFkpICAgICAob3V0cHV0KSAgICAgICAqLworI2RlZmluZSBHRVBfRkRYRCAweDAwMDAwMDA4ICAgICAgICAvKiBGdWxsIER1cGxleCBEaXNhYmxlICAgICAob3V0cHV0KSAgICAgICAqLworI2RlZmluZSBHRVBfUEhZTCAweDAwMDAwMDA0ICAgICAgICAvKiBQSFkgTG9vcGJhY2sgICAgICAgICAgICAob3V0cHV0KSAgICAgICAqLworI2RlZmluZSBHRVBfRkxFRCAweDAwMDAwMDAyICAgICAgICAvKiBGb3JjZSBBY3Rpdml0eSBMRUQgb24gICAob3V0cHV0KSAgICAgICAqLworI2RlZmluZSBHRVBfTU9ERSAweDAwMDAwMDAxICAgICAgICAvKiAwOiAxME1iL3MsICAxOiAxMDBNYi9zICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHRVBfSU5JVCAweDAwMDAwMTFmICAgICAgICAvKiBTZXR1cCBpbnB1dHMgKDApIGFuZCBvdXRwdXRzICgxKSAgICAgICAqLworI2RlZmluZSBHRVBfQ1RSTCAweDAwMDAwMTAwICAgICAgICAvKiBHRVAgY29udHJvbCBiaXQgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorKiogU0lBIFJlZ2lzdGVyIERlZmF1bHRzCisqLworI2RlZmluZSBDU1IxMyAweDAwMDAwMDAxCisjZGVmaW5lIENTUjE0IDB4MDAwM2ZmN2YgICAgICAgICAgIC8qIEF1dG9uZWdvdGlhdGlvbiBkaXNhYmxlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTUjE1IDB4MDAwMDAwMDgKKworLyoKKyoqIFNJQSBTdGF0dXMgUmVnaXN0ZXIgKERFNFg1X1NJU1IpCisqLworI2RlZmluZSBTSVNSX0xQQyAgIDB4ZmZmZjAwMDAgICAgICAvKiBMaW5rIFBhcnRuZXIncyBDb2RlIFdvcmQgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0xQTiAgIDB4MDAwMDgwMDAgICAgICAvKiBMaW5rIFBhcnRuZXIgTmVnb3RpYWJsZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0FOUyAgIDB4MDAwMDcwMDAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIEFyYml0cmF0aW9uIFN0YXRlICAgICAqLworI2RlZmluZSBTSVNSX05TTiAgIDB4MDAwMDA4MDAgICAgICAvKiBOb24gU3RhYmxlIE5MUHMgRGV0ZWN0ZWQgKERDMjEwNDEpICAgICAqLworI2RlZmluZSBTSVNSX1RSRiAgIDB4MDAwMDA4MDAgICAgICAvKiBUcmFuc21pdCBSZW1vdGUgRmF1bHQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX05TTkQgIDB4MDAwMDA0MDAgICAgICAvKiBOb24gU3RhYmxlIE5MUHMgRGV0ZWN0ZWQgKERDMjExNDIpICAgICAqLworI2RlZmluZSBTSVNSX0FOUl9GRFMgMHgwMDAwMDQwMCAgICAvKiBBdXRvIE5lZ290aWF0ZSBSZXN0YXJ0L0Z1bGwgRHVwbGV4IFNlbC4qLworI2RlZmluZSBTSVNSX1RSQSAgIDB4MDAwMDAyMDAgICAgICAvKiAxMEJBU0UtVCBSZWNlaXZlIFBvcnQgQWN0aXZpdHkgICAgICAgICAqLworI2RlZmluZSBTSVNSX05SQSAgIDB4MDAwMDAyMDAgICAgICAvKiBOb24gU2VsZWN0ZWQgUG9ydCBSZWNlaXZlIEFjdGl2aXR5ICAgICAqLworI2RlZmluZSBTSVNSX0FSQSAgIDB4MDAwMDAxMDAgICAgICAvKiBBVUkgUmVjZWl2ZSBQb3J0IEFjdGl2aXR5ICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX1NSQSAgIDB4MDAwMDAxMDAgICAgICAvKiBTZWxlY3RlZCBQb3J0IFJlY2VpdmUgQWN0aXZpdHkgICAgICAgICAqLworI2RlZmluZSBTSVNSX0RBTyAgIDB4MDAwMDAwODAgICAgICAvKiBQTEwgQWxsIE9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0RBWiAgIDB4MDAwMDAwNDAgICAgICAvKiBQTEwgQWxsIFplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0RTUCAgIDB4MDAwMDAwMjAgICAgICAvKiBQTEwgU2VsZi1UZXN0IFBhc3MgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0RTRCAgIDB4MDAwMDAwMTAgICAgICAvKiBQTEwgU2VsZi1UZXN0IERvbmUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0FQUyAgIDB4MDAwMDAwMDggICAgICAvKiBBdXRvIFBvbGFyaXR5IFN0YXRlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0xLRiAgIDB4MDAwMDAwMDQgICAgICAvKiBMaW5rIEZhaWwgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0xTMTAgIDB4MDAwMDAwMDQgICAgICAvKiAxME1iL3MgTGluayBGYWlsIFN0YXR1cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX05DUiAgIDB4MDAwMDAwMDIgICAgICAvKiBOZXR3b3JrIENvbm5lY3Rpb24gRXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX0xTMTAwIDB4MDAwMDAwMDIgICAgICAvKiAxMDBNYi9zIExpbmsgRmFpbCBTdGF0dXMgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX1BBVUkgIDB4MDAwMDAwMDEgICAgICAvKiBBVUlfVFAgSW5kaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTSVNSX01SQSAgIDB4MDAwMDAwMDEgICAgICAvKiBNSUkgUmVjZWl2ZSBQb3J0IEFjdGl2aXR5ICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEFOU19ORElTICAgMHgwMDAwMDAwMCAgICAgIC8qIE53YXkgZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19URElTICAgMHgwMDAwMTAwMCAgICAgIC8qIFRyYW5zbWl0IERpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19BREVUICAgMHgwMDAwMjAwMCAgICAgIC8qIEFiaWxpdHkgRGV0ZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19BQ0sgICAgMHgwMDAwMzAwMCAgICAgIC8qIEFja25vd2xlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19DQUNLICAgMHgwMDAwNDAwMCAgICAgIC8qIENvbXBsZXRlIEFja25vd2xlZGdlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19OV09LICAgMHgwMDAwNTAwMCAgICAgIC8qIE53YXkgT0sgLSBGTFAgTGluayBHb29kICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOU19MQ0hLICAgMHgwMDAwNjAwMCAgICAgIC8qIExpbmsgQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU0lTUl9SU1QgICAweDAwMDAwMzAxICAgICAgLyogQ1NSMTIgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9BTlIgICAweDAwMDAxMzAxICAgICAgLyogQXV0b25lZ290aWF0aW9uIHJlc3RhcnQgICAgICAgICAgICAgICAgKi8KKworLyoKKyoqIFNJQSBDb25uZWN0aXZpdHkgUmVnaXN0ZXIgKERFNFg1X1NJQ1IpCisqLworI2RlZmluZSBTSUNSX1NETSAgIDB4ZmZmZjAwMDAgICAgICAgLyogU0lBIERpYWdub3N0aWNzIE1vZGUgKi8KKyNkZWZpbmUgU0lDUl9PRTU3ICAweDAwMDA4MDAwICAgICAgIC8qIE91dHB1dCBFbmFibGUgNSA2IDcgKi8KKyNkZWZpbmUgU0lDUl9PRTI0ICAweDAwMDA0MDAwICAgICAgIC8qIE91dHB1dCBFbmFibGUgMiA0ICovCisjZGVmaW5lIFNJQ1JfT0UxMyAgMHgwMDAwMjAwMCAgICAgICAvKiBPdXRwdXQgRW5hYmxlIDEgMyAqLworI2RlZmluZSBTSUNSX0lFICAgIDB4MDAwMDEwMDAgICAgICAgLyogSW5wdXQgRW5hYmxlICovCisjZGVmaW5lIFNJQ1JfRVhUICAgMHgwMDAwMDAwMCAgICAgICAvKiBTSUEgTVVYIFNlbGVjdCBFeHRlcm5hbCBTSUEgTW9kZSAqLworI2RlZmluZSBTSUNSX0RfU0lBIDB4MDAwMDA0MDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBTSUEgU2lncyAqLworI2RlZmluZSBTSUNSX0RQTEwgIDB4MDAwMDA4MDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBEUExMIFNpZ3MqLworI2RlZmluZSBTSUNSX0FQTEwgIDB4MDAwMDBhMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBEUExMIFNpZ3MqLworI2RlZmluZSBTSUNSX0RfUnhNIDB4MDAwMDBjMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBSeE0gU2lncyAqLworI2RlZmluZSBTSUNSX01fUnhNIDB4MDAwMDBkMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBSeE0gU2lncyAqLworI2RlZmluZSBTSUNSX0xOS1QgIDB4MDAwMDBlMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRGlhZ25vc3RpY3MgLSBMaW5rIFRlc3QqLworI2RlZmluZSBTSUNSX1NFTCAgIDB4MDAwMDBmMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgQVVJIG9yIFRQIHdpdGggTEVEcyAqLworI2RlZmluZSBTSUNSX0FTRSAgIDB4MDAwMDAwODAgICAgICAgLyogQVBMTCBTdGFydCBFbmFibGUqLworI2RlZmluZSBTSUNSX1NJTSAgIDB4MDAwMDAwNDAgICAgICAgLyogU2VyaWFsIEludGVyZmFjZSBJbnB1dCBNdWx0aXBsZXhlciAqLworI2RlZmluZSBTSUNSX0VOSSAgIDB4MDAwMDAwMjAgICAgICAgLyogRW5jb2RlciBJbnB1dCBNdWx0aXBsZXhlciAqLworI2RlZmluZSBTSUNSX0VEUCAgIDB4MDAwMDAwMTAgICAgICAgLyogU0lBIFBMTCBFeHRlcm5hbCBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgU0lDUl9BVUkgICAweDAwMDAwMDA4ICAgICAgIC8qIDEwQmFzZS1UICgwKSBvciBBVUkgKDEpICovCisjZGVmaW5lIFNJQ1JfQ0FDICAgMHgwMDAwMDAwNCAgICAgICAvKiBDU1IgQXV0byBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNJQ1JfUFMgICAgMHgwMDAwMDAwMiAgICAgICAvKiBQaW4gQVVJL1RQIFNlbGVjdGlvbiAqLworI2RlZmluZSBTSUNSX1NSTCAgIDB4MDAwMDAwMDEgICAgICAgLyogU0lBIFJlc2V0ICovCisjZGVmaW5lIFNJQV9SRVNFVCAgMHgwMDAwMDAwMCAgICAgICAvKiBTSUEgUmVzZXQgVmFsdWUgKi8KKworLyoKKyoqIFNJQSBUcmFuc21pdCBhbmQgUmVjZWl2ZSBSZWdpc3RlciAoREU0WDVfU1RSUikKKyovCisjZGVmaW5lIFNUUlJfVEFTICAgMHgwMDAwODAwMCAgICAgICAvKiAxMEJhc2UtVC9BVUkgQXV0b3NlbnNpbmcgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfU1BQICAgMHgwMDAwNDAwMCAgICAgICAvKiBTZXQgUG9sYXJpdHkgUGx1cyAqLworI2RlZmluZSBTVFJSX0FQRSAgIDB4MDAwMDIwMDAgICAgICAgLyogQXV0byBQb2xhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9MVEUgICAweDAwMDAxMDAwICAgICAgIC8qIExpbmsgVGVzdCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9TUUUgICAweDAwMDAwODAwICAgICAgIC8qIFNpZ25hbCBRdWFsaXR5IEVuYWJsZSAqLworI2RlZmluZSBTVFJSX0NMRCAgIDB4MDAwMDA0MDAgICAgICAgLyogQ29sbGlzaW9uIERldGVjdCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9DU1EgICAweDAwMDAwMjAwICAgICAgIC8qIENvbGxpc2lvbiBTcXVlbGNoIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX1JTUSAgIDB4MDAwMDAxMDAgICAgICAgLyogUmVjZWl2ZSBTcXVlbGNoIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX0FORSAgIDB4MDAwMDAwODAgICAgICAgLyogQXV0byBOZWdvdGlhdGUgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfSERFICAgMHgwMDAwMDA0MCAgICAgICAvKiBIYWxmIER1cGxleCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9DUEVOICAweDAwMDAwMDMwICAgICAgIC8qIENvbXBlbnNhdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9MU0UgICAweDAwMDAwMDA4ICAgICAgIC8qIExpbmsgUHVsc2UgU2VuZCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9EUkVOICAweDAwMDAwMDA0ICAgICAgIC8qIERyaXZlciBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9MQksgICAweDAwMDAwMDAyICAgICAgIC8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX0VDRU4gIDB4MDAwMDAwMDEgICAgICAgLyogRW5jb2RlciBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9SRVNFVCAweGZmZmZmZmZmICAgICAgIC8qIFJlc2V0IHZhbHVlIGZvciBTVFJSICovCisKKy8qCisqKiBTSUEgR2VuZXJhbCBSZWdpc3RlciAoREU0WDVfU0lHUikKKyovCisjZGVmaW5lIFNJR1JfUk1JICAgMHg0MDAwMDAwMCAgICAgICAvKiBSZWNlaXZlIE1hdGNoIEludGVycnVwdCAqLworI2RlZmluZSBTSUdSX0dJMSAgIDB4MjAwMDAwMDAgICAgICAgLyogR2VuZXJhbCBQb3J0IEludGVycnVwdCAxICovCisjZGVmaW5lIFNJR1JfR0kwICAgMHgxMDAwMDAwMCAgICAgICAvKiBHZW5lcmFsIFBvcnQgSW50ZXJydXB0IDAgKi8KKyNkZWZpbmUgU0lHUl9DV0UgICAweDA4MDAwMDAwICAgICAgIC8qIENvbnRyb2wgV3JpdGUgRW5hYmxlICovCisjZGVmaW5lIFNJR1JfUk1FICAgMHgwNDAwMDAwMCAgICAgICAvKiBSZWNlaXZlIE1hdGNoIEVuYWJsZSAqLworI2RlZmluZSBTSUdSX0dFSTEgIDB4MDIwMDAwMDAgICAgICAgLyogR0VQIEludGVycnVwdCBFbmFibGUgb24gUG9ydCAxICovCisjZGVmaW5lIFNJR1JfR0VJMCAgMHgwMTAwMDAwMCAgICAgICAvKiBHRVAgSW50ZXJydXB0IEVuYWJsZSBvbiBQb3J0IDAgKi8KKyNkZWZpbmUgU0lHUl9MR1MzICAweDAwODAwMDAwICAgICAgIC8qIExFRC9HRVAzIFNlbGVjdCAqLworI2RlZmluZSBTSUdSX0xHUzIgIDB4MDA0MDAwMDAgICAgICAgLyogTEVEL0dFUDIgU2VsZWN0ICovCisjZGVmaW5lIFNJR1JfTEdTMSAgMHgwMDIwMDAwMCAgICAgICAvKiBMRUQvR0VQMSBTZWxlY3QgKi8KKyNkZWZpbmUgU0lHUl9MR1MwICAweDAwMTAwMDAwICAgICAgIC8qIExFRC9HRVAwIFNlbGVjdCAqLworI2RlZmluZSBTSUdSX01EICAgIDB4MDAwZjAwMDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIE1vZGUgYW5kIERhdGEgKi8KKyNkZWZpbmUgU0lHUl9MVjIgICAweDAwMDA4MDAwICAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBMRUQyIHZhbHVlICovCisjZGVmaW5lIFNJR1JfTEUyICAgMHgwMDAwNDAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMiBlbmFibGUgKi8KKyNkZWZpbmUgU0lHUl9GUkwgICAweDAwMDAyMDAwICAgICAgIC8qIEZvcmNlIFJlY2VpdmVyIExvdyAqLworI2RlZmluZSBTSUdSX0RQU1QgIDB4MDAwMDEwMDAgICAgICAgLyogUExMIFNlbGYgVGVzdCBTdGFydCAqLworI2RlZmluZSBTSUdSX0xTRCAgIDB4MDAwMDA4MDAgICAgICAgLyogTEVEIFN0cmV0Y2ggRGlzYWJsZSAqLworI2RlZmluZSBTSUdSX0ZMRiAgIDB4MDAwMDA0MDAgICAgICAgLyogRm9yY2UgTGluayBGYWlsICovCisjZGVmaW5lIFNJR1JfRlVTUSAgMHgwMDAwMDIwMCAgICAgICAvKiBGb3JjZSBVbnNxdWVsY2ggKi8KKyNkZWZpbmUgU0lHUl9UU0NLICAweDAwMDAwMTAwICAgICAgIC8qIFRlc3QgQ2xvY2sgKi8KKyNkZWZpbmUgU0lHUl9MVjEgICAweDAwMDAwMDgwICAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBMRUQxIHZhbHVlICovCisjZGVmaW5lIFNJR1JfTEUxICAgMHgwMDAwMDA0MCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMSBlbmFibGUgKi8KKyNkZWZpbmUgU0lHUl9SV1IgICAweDAwMDAwMDIwICAgICAgIC8qIFJlY2VpdmUgV2F0Y2hkb2cgUmVsZWFzZSAqLworI2RlZmluZSBTSUdSX1JXRCAgIDB4MDAwMDAwMTAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyBEaXNhYmxlICovCisjZGVmaW5lIFNJR1JfQUJNICAgMHgwMDAwMDAwOCAgICAgICAvKiBCTkM6IDAsICBBVUk6MSAqLworI2RlZmluZSBTSUdSX0pDSyAgIDB4MDAwMDAwMDQgICAgICAgLyogSmFiYmVyIENsb2NrICovCisjZGVmaW5lIFNJR1JfSFVKICAgMHgwMDAwMDAwMiAgICAgICAvKiBIb3N0IFVuamFiICovCisjZGVmaW5lIFNJR1JfSkJEICAgMHgwMDAwMDAwMSAgICAgICAvKiBKYWJiZXIgRGlzYWJsZSAqLworI2RlZmluZSBTSUdSX1JFU0VUIDB4ZmZmZjAwMDAgICAgICAgLyogUmVzZXQgdmFsdWUgZm9yIFNJR1IgKi8KKworLyoKKyoqIFJlY2VpdmUgRGVzY3JpcHRvciBCaXQgU3VtbWFyeQorKi8KKyNkZWZpbmUgUl9PV04gICAgICAweDgwMDAwMDAwICAgICAgIC8qIE93biBCaXQgKi8KKyNkZWZpbmUgUkRfRkYgICAgICAweDQwMDAwMDAwICAgICAgIC8qIEZpbHRlcmluZyBGYWlsICovCisjZGVmaW5lIFJEX0ZMICAgICAgMHgzZmZmMDAwMCAgICAgICAvKiBGcmFtZSBMZW5ndGggKi8KKyNkZWZpbmUgUkRfRVMgICAgICAweDAwMDA4MDAwICAgICAgIC8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgUkRfTEUgICAgICAweDAwMDA0MDAwICAgICAgIC8qIExlbmd0aCBFcnJvciAqLworI2RlZmluZSBSRF9EVCAgICAgIDB4MDAwMDMwMDAgICAgICAgLyogRGF0YSBUeXBlICovCisjZGVmaW5lIFJEX1JGICAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBSdW50IEZyYW1lICovCisjZGVmaW5lIFJEX01GICAgICAgMHgwMDAwMDQwMCAgICAgICAvKiBNdWx0aWNhc3QgRnJhbWUgKi8KKyNkZWZpbmUgUkRfRlMgICAgICAweDAwMDAwMjAwICAgICAgIC8qIEZpcnN0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkRfTFMgICAgICAweDAwMDAwMTAwICAgICAgIC8qIExhc3QgRGVzY3JpcHRvciAqLworI2RlZmluZSBSRF9UTCAgICAgIDB4MDAwMDAwODAgICAgICAgLyogRnJhbWUgVG9vIExvbmcgKi8KKyNkZWZpbmUgUkRfQ1MgICAgICAweDAwMDAwMDQwICAgICAgIC8qIENvbGxpc2lvbiBTZWVuICovCisjZGVmaW5lIFJEX0ZUICAgICAgMHgwMDAwMDAyMCAgICAgICAvKiBGcmFtZSBUeXBlICovCisjZGVmaW5lIFJEX1JKICAgICAgMHgwMDAwMDAxMCAgICAgICAvKiBSZWNlaXZlIFdhdGNoZG9nICovCisjZGVmaW5lIFJEX1JFICAgICAgMHgwMDAwMDAwOCAgICAgICAvKiBSZXBvcnQgb24gTUlJIEVycm9yICovCisjZGVmaW5lIFJEX0RCICAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBEcmliYmxpbmcgQml0ICovCisjZGVmaW5lIFJEX0NFICAgICAgMHgwMDAwMDAwMiAgICAgICAvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgUkRfT0YgICAgICAweDAwMDAwMDAxICAgICAgIC8qIE92ZXJmbG93ICovCisKKyNkZWZpbmUgUkRfUkVSICAgICAweDAyMDAwMDAwICAgICAgIC8qIFJlY2VpdmUgRW5kIE9mIFJpbmcgKi8KKyNkZWZpbmUgUkRfUkNIICAgICAweDAxMDAwMDAwICAgICAgIC8qIFNlY29uZCBBZGRyZXNzIENoYWluZWQgKi8KKyNkZWZpbmUgUkRfUkJTMiAgICAweDAwM2ZmODAwICAgICAgIC8qIEJ1ZmZlciAyIFNpemUgKi8KKyNkZWZpbmUgUkRfUkJTMSAgICAweDAwMDAwN2ZmICAgICAgIC8qIEJ1ZmZlciAxIFNpemUgKi8KKworLyoKKyoqIFRyYW5zbWl0IERlc2NyaXB0b3IgQml0IFN1bW1hcnkKKyovCisjZGVmaW5lIFRfT1dOICAgICAgMHg4MDAwMDAwMCAgICAgICAvKiBPd24gQml0ICovCisjZGVmaW5lIFREX0VTICAgICAgMHgwMDAwODAwMCAgICAgICAvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFREX1RPICAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBUcmFuc21pdCBKYWJiZXIgVGltZS1PdXQgKi8KKyNkZWZpbmUgVERfTE8gICAgICAweDAwMDAwODAwICAgICAgIC8qIExvc3MgT2YgQ2FycmllciAqLworI2RlZmluZSBURF9OQyAgICAgIDB4MDAwMDA0MDAgICAgICAgLyogTm8gQ2FycmllciAqLworI2RlZmluZSBURF9MQyAgICAgIDB4MDAwMDAyMDAgICAgICAgLyogTGF0ZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgVERfRUMgICAgICAweDAwMDAwMTAwICAgICAgIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFREX0hGICAgICAgMHgwMDAwMDA4MCAgICAgICAvKiBIZWFydGJlYXQgRmFpbCAqLworI2RlZmluZSBURF9DQyAgICAgIDB4MDAwMDAwNzggICAgICAgLyogQ29sbGlzaW9uIENvdW50ZXIgKi8KKyNkZWZpbmUgVERfTEYgICAgICAweDAwMDAwMDA0ICAgICAgIC8qIExpbmsgRmFpbCAqLworI2RlZmluZSBURF9VRiAgICAgIDB4MDAwMDAwMDIgICAgICAgLyogVW5kZXJmbG93IEVycm9yICovCisjZGVmaW5lIFREX0RFICAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBEZWZlcnJlZCAqLworCisjZGVmaW5lIFREX0lDICAgICAgMHg4MDAwMDAwMCAgICAgICAvKiBJbnRlcnJ1cHQgT24gQ29tcGxldGlvbiAqLworI2RlZmluZSBURF9MUyAgICAgIDB4NDAwMDAwMDAgICAgICAgLyogTGFzdCBTZWdtZW50ICovCisjZGVmaW5lIFREX0ZTICAgICAgMHgyMDAwMDAwMCAgICAgICAvKiBGaXJzdCBTZWdtZW50ICovCisjZGVmaW5lIFREX0ZUMSAgICAgMHgxMDAwMDAwMCAgICAgICAvKiBGaWx0ZXJpbmcgVHlwZSAqLworI2RlZmluZSBURF9TRVQgICAgIDB4MDgwMDAwMDAgICAgICAgLyogU2V0dXAgUGFja2V0ICovCisjZGVmaW5lIFREX0FDICAgICAgMHgwNDAwMDAwMCAgICAgICAvKiBBZGQgQ1JDIERpc2FibGUgKi8KKyNkZWZpbmUgVERfVEVSICAgICAweDAyMDAwMDAwICAgICAgIC8qIFRyYW5zbWl0IEVuZCBPZiBSaW5nICovCisjZGVmaW5lIFREX1RDSCAgICAgMHgwMTAwMDAwMCAgICAgICAvKiBTZWNvbmQgQWRkcmVzcyBDaGFpbmVkICovCisjZGVmaW5lIFREX0RQRCAgICAgMHgwMDgwMDAwMCAgICAgICAvKiBEaXNhYmxlZCBQYWRkaW5nICovCisjZGVmaW5lIFREX0ZUMCAgICAgMHgwMDQwMDAwMCAgICAgICAvKiBGaWx0ZXJpbmcgVHlwZSAqLworI2RlZmluZSBURF9UQlMyICAgIDB4MDAzZmY4MDAgICAgICAgLyogQnVmZmVyIDIgU2l6ZSAqLworI2RlZmluZSBURF9UQlMxICAgIDB4MDAwMDA3ZmYgICAgICAgLyogQnVmZmVyIDEgU2l6ZSAqLworCisjZGVmaW5lIFBFUkZFQ1RfRiAgMHgwMDAwMDAwMAorI2RlZmluZSBIQVNIX0YgICAgIFREX0ZUMAorI2RlZmluZSBJTlZFUlNFX0YgIFREX0ZUMQorI2RlZmluZSBIQVNIX09fRiAgIChURF9GVDEgfCBURF9GMCkKKworLyoKKyoqIE1lZGlhIC8gbW9kZSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb25zCisqKiBVc2VyIHNlbGVjdGFibGU6CisqLworI2RlZmluZSBUUCAgICAgICAgICAgICAgMHgwMDQwICAgICAvKiAxMEJhc2UtVCAobm93IGVxdWl2IHRvIF8xME1iKSAgICAgICAgKi8KKyNkZWZpbmUgVFBfTlcgICAgICAgICAgIDB4MDAwMiAgICAgLyogMTBCYXNlLVQgd2l0aCBOd2F5ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJOQyAgICAgICAgICAgICAweDAwMDQgICAgIC8qIFRoaW53aXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBVUkgICAgICAgICAgICAgMHgwMDA4ICAgICAvKiBUaGlja3dpcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk5DX0FVSSAgICAgICAgIDB4MDAxMCAgICAgLyogQk5DL0FVSSBvbiBEQzIxMDQwIGluZGlzdGluZ3Vpc2hhYmxlICovCisjZGVmaW5lIF8xME1iICAgICAgICAgICAweDAwNDAgICAgIC8qIDEwTWIvcyBFdGhlcm5ldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfMTAwTWIgICAgICAgICAgMHgwMDgwICAgICAvKiAxMDBNYi9zIEV0aGVybmV0ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVVUTyAgICAgICAgICAgIDB4NDAwMCAgICAgLyogQXV0byBzZW5zZSB0aGUgbWVkaWEgb3Igc3BlZWQgICAgICAgICovCisKKy8qCisqKiBJbnRlcm5hbCBzdGF0ZXMKKyovCisjZGVmaW5lIE5DICAgICAgICAgICAgICAweDAwMDAgICAgIC8qIE5vIENvbm5lY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlMgICAgICAgICAgICAgMHgwMDIwICAgICAvKiBJbnRlcm1lZGlhdGUgQXV0b05lZ290aWF0aW9uIFN0YXRlICAgKi8KKyNkZWZpbmUgU1BEX0RFVCAgICAgICAgIDB4MDEwMCAgICAgLyogUGFyYWxsZWwgc3BlZWQgZGV0ZWN0aW9uICAgICAgICAgICAgICovCisjZGVmaW5lIElOSVQgICAgICAgICAgICAweDAyMDAgICAgIC8qIEluaXRpYWwgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFWFRfU0lBICAgICAgICAgMHgwNDAwICAgICAvKiBFeHRlcm5hbCBTSUEgZm9yIG1vdGhlcmJvYXJkIGNoaXAgICAgKi8KKyNkZWZpbmUgQU5TX1NVU1BFQ1QgICAgIDB4MDgwMiAgICAgLyogU3VzcGVjdCB0aGUgQU5TIChUUCkgcG9ydCBpcyBkb3duICAgICovCisjZGVmaW5lIFRQX1NVU1BFQ1QgICAgICAweDA4MDMgICAgIC8qIFN1c3BlY3QgdGhlIFRQIHBvcnQgaXMgZG93biAgICAgICAgICAqLworI2RlZmluZSBCTkNfQVVJX1NVU1BFQ1QgMHgwODA0ICAgICAvKiBTdXNwZWN0IHRoZSBCTkMgb3IgQVVJIHBvcnQgaXMgZG93biAgKi8KKyNkZWZpbmUgRVhUX1NJQV9TVVNQRUNUIDB4MDgwNSAgICAgLyogU3VzcGVjdCB0aGUgRVhUIFNJQSBwb3J0IGlzIGRvd24gICAgICovCisjZGVmaW5lIEJOQ19TVVNQRUNUICAgICAweDA4MDYgICAgIC8qIFN1c3BlY3QgdGhlIEJOQyBwb3J0IGlzIGRvd24gICAgICAgICAqLworI2RlZmluZSBBVUlfU1VTUEVDVCAgICAgMHgwODA3ICAgICAvKiBTdXNwZWN0IHRoZSBBVUkgcG9ydCBpcyBkb3duICAgICAgICAgKi8KKyNkZWZpbmUgTUlJICAgICAgICAgICAgIDB4MTAwMCAgICAgLyogTUlJIG9uIHRoZSAyMTE0MyAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVElNRVJfQ0IgICAgICAgIDB4ODAwMDAwMDAgLyogVGltZXIgY2FsbGJhY2sgZGV0ZWN0aW9uICAgICAgICAgICAgICovCisKKy8qCisqKiBERTRYNSBERUJVRyBPcHRpb25zCisqLworI2RlZmluZSBERUJVR19OT05FICAgICAgMHgwMDAwICAgICAvKiBObyBERUJVRyBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19WRVJTSU9OICAgMHgwMDAxICAgICAvKiBQcmludCB2ZXJzaW9uIG1lc3NhZ2UgKi8KKyNkZWZpbmUgREVCVUdfTUVESUEgICAgIDB4MDAwMiAgICAgLyogUHJpbnQgbWVkaWEgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfVFggICAgICAgIDB4MDAwNCAgICAgLyogUHJpbnQgVFggKHF1ZXVlX3BrdCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfUlggICAgICAgIDB4MDAwOCAgICAgLyogUHJpbnQgUlggKGRlNHg1X3J4KSBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19TUk9NICAgICAgMHgwMDEwICAgICAvKiBQcmludCBTUk9NIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX01JSSAgICAgICAweDAwMjAgICAgIC8qIFByaW50IE1JSSBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19PUEVOICAgICAgMHgwMDQwICAgICAvKiBQcmludCBkZTR4NV9vcGVuKCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfQ0xPU0UgICAgIDB4MDA4MCAgICAgLyogUHJpbnQgZGU0eDVfY2xvc2UoKSBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19QQ0lDRkcgICAgMHgwMTAwCisjZGVmaW5lIERFQlVHX0FMTCAgICAgICAweDAxZmYKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMKKyovCisjZGVmaW5lIFBDSSAgMAorI2RlZmluZSBFSVNBIDEKKworI2RlZmluZSBIQVNIX1RBQkxFX0xFTiAgIDUxMiAgICAgICAvKiBCaXRzICovCisjZGVmaW5lIEhBU0hfQklUUyAgICAgICAgMHgwMWZmICAgIC8qIDkgTFMgYml0cyAqLworCisjZGVmaW5lIFNFVFVQX0ZSQU1FX0xFTiAgMTkyICAgICAgIC8qIEJ5dGVzICovCisjZGVmaW5lIElNUEVSRl9QQV9PRkZTRVQgMTU2ICAgICAgIC8qIEJ5dGVzICovCisKKyNkZWZpbmUgUE9MTF9ERU1BTkQgICAgICAgICAgMQorCisjZGVmaW5lIExPU1RfTUVESUFfVEhSRVNIT0xEIDMKKworI2RlZmluZSBNQVNLX0lOVEVSUlVQVFMgICAgICAxCisjZGVmaW5lIFVOTUFTS19JTlRFUlJVUFRTICAgIDAKKworI2RlZmluZSBERTRYNV9TVFJMRU4gICAgICAgICA4CisKKyNkZWZpbmUgREU0WDVfSU5JVCAgICAgICAgICAgMCAgICAgLyogSW5pdGlhbGlzYXRpb24gdGltZSAqLworI2RlZmluZSBERTRYNV9SVU4gICAgICAgICAgICAxICAgICAvKiBSdW4gdGltZSAqLworCisjZGVmaW5lIERFNFg1X1NBVkVfU1RBVEUgICAgIDAKKyNkZWZpbmUgREU0WDVfUkVTVE9SRV9TVEFURSAgMQorCisvKgorKiogQWRkcmVzcyBGaWx0ZXJpbmcgTW9kZXMKKyovCisjZGVmaW5lIFBFUkZFQ1QgICAgICAgICAgICAgIDAgICAgIC8qIDE2IHBlcmZlY3QgcGh5c2ljYWwgYWRkcmVzc2VzICovCisjZGVmaW5lIEhBU0hfUEVSRiAgICAgICAgICAgIDEgICAgIC8qIDEgcGVyZmVjdCwgNTEyIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUEVSRkVDVF9SRUogICAgICAgICAgMiAgICAgLyogUmVqZWN0IDE2IHBlcmZlY3QgcGh5c2ljYWwgYWRkcmVzc2VzICovCisjZGVmaW5lIEFMTF9IQVNIICAgICAgICAgICAgIDMgICAgIC8qIEhhc2hlcyBhbGwgcGh5c2ljYWwgJiBtdWx0aWNhc3QgYWRkcnMgKi8KKworI2RlZmluZSBBTEwgICAgICAgICAgICAgICAgICAwICAgICAvKiBDbGVhciBvdXQgYWxsIHRoZSBzZXR1cCBmcmFtZSAqLworI2RlZmluZSBQSFlTX0FERFJfT05MWSAgICAgICAxICAgICAvKiBVcGRhdGUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb25seSAqLworCisvKgorKiogQm9vbGVhbnMKKyovCisjZGVmaW5lIE5PICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFlFUyAgICAgICAgICAgICAgICAgIH4wCisjZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgIH4wCisKKy8qCisqKiBBZGFwdGVyIHN0YXRlCisqLworI2RlZmluZSBJTklUSUFMSVNFRCAgICAgICAgICAwICAgICAvKiBBZnRlciBoL3cgaW5pdGlhbGlzZWQgYW5kIG1lbSBhbGxvYydkICovCisjZGVmaW5lIENMT1NFRCAgICAgICAgICAgICAgIDEgICAgIC8qIFJlYWR5IGZvciBvcGVuaW5nICovCisjZGVmaW5lIE9QRU4gICAgICAgICAgICAgICAgIDIgICAgIC8qIFJ1bm5pbmcgKi8KKworLyoKKyoqIFZhcmlvdXMgd2FpdCB0aW1lcworKi8KKyNkZWZpbmUgUERFVF9MSU5LX1dBSVQgICAgMTIwMCAgICAvKiBtc2VjcyB0byB3YWl0IGZvciBsaW5rIGRldGVjdCBiaXRzICAgICAqLworI2RlZmluZSBBTlNfRklOSVNIX1dBSVQgICAxMDAwICAgIC8qIG1zZWNzIHRvIHdhaXQgZm9yIGxpbmsgZGV0ZWN0IGJpdHMgICAgICovCisKKy8qCisqKiBJRUVFIE9VSXMgZm9yIHZhcmlvdXMgUEhZIHZlbmRvci9jaGlwIGNvbWJvcyAtIFJlZyAyIHZhbHVlcyBvbmx5LiBTaW5jZQorKiogdGhlIHZlbmRvcnMgc2VlbSBzcGxpdCA1MC01MCBvbiBob3cgdG8gY2FsY3VsYXRlIHRoZSBPVUkgcmVnaXN0ZXIgdmFsdWVzCisqKiBhbnl3YXksIGp1c3QgcmVhZGluZyBSZWcyIHNlZW1zIHJlYXNvbmFibGUgZm9yIG5vdyBbc2VlIGRlNHg1X2dldF9vdWkoKV0uCisqLworI2RlZmluZSBOQVRJT05BTF9UWCAweDIwMDAKKyNkZWZpbmUgQlJPQURDT01fVDQgMHgwM2UwCisjZGVmaW5lIFNFRVFfVDQgICAgIDB4MDAxNgorI2RlZmluZSBDWVBSRVNTX1Q0ICAweDAwMTQKKworLyoKKyoqIFNwZWVkIFNlbGVjdGlvbiBzdHVmZgorKi8KKyNkZWZpbmUgU0VUXzEwTWIge1wKKyAgaWYgKChscC0+cGh5W2xwLT5hY3RpdmVdLmlkKSAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7XAorICAgIG9tciA9IGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKTtcCisgICAgaWYgKChscC0+dG1wICE9IE1JSV9TUl9BU1NDKSB8fCAobHAtPmF1dG9zZW5zZSAhPSBBVVRPKSkge1wKKyAgICAgIG1paV93cihNSUlfQ1JfMTB8KGxwLT5mZHg/TUlJX0NSX0ZETTowKSwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIH1cCisgICAgb21yIHw9ICgobHAtPmZkeCA/IE9NUl9GRFggOiAwKSB8IE9NUl9UVE0pO1wKKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTtcCisgICAgaWYgKCFscC0+dXNlU1JPTSkgbHAtPmNhY2hlLmdlcCA9IDA7XAorICB9IGVsc2UgaWYgKGxwLT51c2VTUk9NICYmICFscC0+dXNlTUlJKSB7XAorICAgIG9tciA9IChpbmwoREU0WDVfT01SKSAmIH4oT01SX1BTIHwgT01SX0hCRCB8IE9NUl9UVE0gfCBPTVJfUENTIHwgT01SX1NDUiB8IE9NUl9GRFgpKTtcCisgICAgb21yIHw9IChscC0+ZmR4ID8gT01SX0ZEWCA6IDApO1wKKyAgICBvdXRsKG9tciB8IChscC0+aW5mb2Jsb2NrX2NzcjYgJiB+KE9NUl9TQ1IgfCBPTVJfSEJEKSksIERFNFg1X09NUik7XAorICB9IGVsc2Uge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG9tciB8PSAobHAtPmZkeCA/IE9NUl9GRFggOiAwKTtcCisgICAgb3V0bChvbXIgfCBPTVJfU0RQIHwgT01SX1RUTSwgREU0WDVfT01SKTtcCisgICAgbHAtPmNhY2hlLmdlcCA9IChscC0+ZmR4ID8gMCA6IEdFUF9GRFhEKTtcCisgICAgZ2VwX3dyKGxwLT5jYWNoZS5nZXAsIGRldik7XAorICB9XAorfQorCisjZGVmaW5lIFNFVF8xMDBNYiB7XAorICBpZiAoKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQpICYmICghbHAtPnVzZVNST00gfHwgbHAtPnVzZU1JSSkpIHtcCisgICAgaW50IGZkeD0wO1wKKyAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCA9PSBOQVRJT05BTF9UWCkge1wKKyAgICAgICAgbWlpX3dyKG1paV9yZCgweDE4LCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkgJiB+MHgyMDAwLFwKKyAgICAgICAgICAgICAgICAgICAgICAweDE4LCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIH1cCisgICAgb21yID0gaW5sKERFNFg1X09NUikgJiB+KE9NUl9UVE0gfCBPTVJfUENTIHwgT01SX1NDUiB8IE9NUl9GRFgpO1wKKyAgICBzciA9IG1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTtcCisgICAgaWYgKCEoc3IgJiBNSUlfQU5BX1Q0QU0pICYmIGxwLT5mZHgpIGZkeD0xO1wKKyAgICBpZiAoKGxwLT50bXAgIT0gTUlJX1NSX0FTU0MpIHx8IChscC0+YXV0b3NlbnNlICE9IEFVVE8pKSB7XAorICAgICAgbWlpX3dyKE1JSV9DUl8xMDB8KGZkeD9NSUlfQ1JfRkRNOjApLCBNSUlfQ1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTtcCisgICAgfVwKKyAgICBpZiAoZmR4KSBvbXIgfD0gT01SX0ZEWDtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7XAorICAgIGlmICghbHAtPnVzZVNST00pIGxwLT5jYWNoZS5nZXAgPSAwO1wKKyAgfSBlbHNlIGlmIChscC0+dXNlU1JPTSAmJiAhbHAtPnVzZU1JSSkge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG9tciB8PSAobHAtPmZkeCA/IE9NUl9GRFggOiAwKTtcCisgICAgb3V0bChvbXIgfCBscC0+aW5mb2Jsb2NrX2NzcjYsIERFNFg1X09NUik7XAorICB9IGVsc2Uge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG9tciB8PSAobHAtPmZkeCA/IE9NUl9GRFggOiAwKTtcCisgICAgb3V0bChvbXIgfCBPTVJfU0RQIHwgT01SX1BTIHwgT01SX0hCRCB8IE9NUl9QQ1MgfCBPTVJfU0NSLCBERTRYNV9PTVIpO1wKKyAgICBscC0+Y2FjaGUuZ2VwID0gKGxwLT5mZHggPyAwIDogR0VQX0ZEWEQpIHwgR0VQX01PREU7XAorICAgIGdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpO1wKKyAgfVwKK30KKworLyogRklYIE1FIHNvIEkgZG9uJ3QgamFtIDEwTWIgbmV0d29ya3MgKi8KKyNkZWZpbmUgU0VUXzEwME1iX1BERVQge1wKKyAgaWYgKChscC0+cGh5W2xwLT5hY3RpdmVdLmlkKSAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7XAorICAgIG1paV93cihNSUlfQ1JfMTAwfE1JSV9DUl9BU1NFLCBNSUlfQ1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIGlmIChscC0+dXNlU1JPTSAmJiAhbHAtPnVzZU1JSSkge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9UVE0gfCBPTVJfUENTIHwgT01SX1NDUiB8IE9NUl9GRFgpKTtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7XAorICB9IGVsc2Uge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG91dGwob21yIHwgT01SX1NEUCB8IE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfUENTLCBERTRYNV9PTVIpO1wKKyAgICBscC0+Y2FjaGUuZ2VwID0gKEdFUF9GRFhEIHwgR0VQX01PREUpO1wKKyAgICBnZXBfd3IobHAtPmNhY2hlLmdlcCwgZGV2KTtcCisgIH1cCit9CisKKy8qCisqKiBJbmNsdWRlIHRoZSBJT0NUTCBzdHVmZgorKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNkZWZpbmUJREU0WDVJT0NUTAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgZGU0eDVfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsZW47ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBfX3VzZXIgKmRhdGE7ICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCit9OworCisvKiAKKyoqIFJlY29nbmlzZWQgY29tbWFuZHMgZm9yIHRoZSBkcml2ZXIgCisqLworI2RlZmluZSBERTRYNV9HRVRfSFdBRERSCTB4MDEgLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X1NFVF9IV0FERFIJMHgwMiAvKiBTZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgREU0WDVfU0VUX1BST00gIAkweDAzIC8qIFNldCBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIERFNFg1X0NMUl9QUk9NICAJMHgwNCAvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIERFNFg1X1NBWV9CT08JICAgICAgICAweDA1IC8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworI2RlZmluZSBERTRYNV9HRVRfTUNBICAgCTB4MDYgLyogR2V0IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgREU0WDVfU0VUX01DQSAgIAkweDA3IC8qIFNldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X0NMUl9NQ0EgICAgCTB4MDggLyogQ2xlYXIgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBERTRYNV9NQ0FfRU4gICAgCTB4MDkgLyogRW5hYmxlIGEgbXVsdGljYXN0IGFkZHJlc3MgZ3JvdXAgKi8KKyNkZWZpbmUgREU0WDVfR0VUX1NUQVRTICAJMHgwYSAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIERFNFg1X0NMUl9TVEFUUyAJMHgwYiAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgREU0WDVfR0VUX09NUiAgICAgICAgICAgMHgwYyAvKiBHZXQgdGhlIE9NUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBERTRYNV9TRVRfT01SICAgICAgICAgICAweDBkIC8qIFNldCB0aGUgT01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisjZGVmaW5lIERFNFg1X0dFVF9SRUcgICAgICAgICAgIDB4MGUgLyogR2V0IHRoZSBERTRYNSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNT1RPX1NST01fQlVHICAgICgobHAtPmFjdGl2ZSA9PSA4KSAmJiAoKChsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKCgoczMyICopZGV2LT5kZXZfYWRkcikpKSkmMHgwMGZmZmZmZik9PTB4M2UwMDA4KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVmMzNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCkBAIC0wLDAgKzEsMjA2NiBAQAorLyoKKyAgICBBIERhdmljb20gRE05MTAyL0RNOTEwMkEvRE05MTAyQStETTk4MDEvRE05MTAyQStETTk4MDIgTklDIGZhc3QKKyAgICBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICAgIENvcHlyaWdodCAoQykgMTk5NyAgU3RlbiBXYW5nCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIERBVklDT00gV2ViLVNpdGU6IHd3dy5kYXZpY29tLmNvbS50dworCisgICAgQXV0aG9yOiBTdGVuIFdhbmcsIDg4Ni0zLTU3OTg3OTctODUxNywgRS1tYWlsOiBzdGVuX3dhbmdAZGF2aWNvbS5jb20udHcKKyAgICBNYWludGFpbmVyOiBUb2JpYXMgUmluZ3N0cm9tIDx0b3JpQHVuaGFwcHkubWluZS5udT4KKworICAgIChDKUNvcHlyaWdodCAxOTk3LTE5OTggREFWSUNPTSBTZW1pY29uZHVjdG9yLEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgIE1hcmNlbG8gVG9zYXR0aSA8bWFyY2Vsb0Bjb25lY3RpdmEuY29tLmJyPiA6CisgICAgTWFkZSBpdCBjb21waWxlIGluIDIuMyAoZGV2aWNlIHRvIG5ldF9kZXZpY2UpCisKKyAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiA6CisgICAgQ2xlYW5lZCB1cCBmb3Iga2VybmVsIG1lcmdlLgorICAgIFJlbW92ZWQgdGhlIGJhY2sgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgUmVmb3JtYXR0ZWQsIGZpeGluZyBzcGVsbGluZyBldGMgYXMgSSB3ZW50CisgICAgUmVtb3ZlZCBJUlEgMC0xNSBhc3N1bXB0aW9uCisKKyAgICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+IDoKKyAgICBVcGRhdGVkIHRvIHVzZSBuZXcgUENJIGRyaXZlciBBUEkuCisgICAgUmVzb3VyY2UgdXNhZ2UgY2xlYW51cHMuCisgICAgUmVwb3J0IGRyaXZlciB2ZXJzaW9uIHRvIHVzZXIuCisKKyAgICBUb2JpYXMgUmluZ3N0cm9tIDx0b3JpQHVuaGFwcHkubWluZS5udT4gOgorICAgIENsZWFuZWQgdXAgYW5kIGFkZGVkIFNNUCBzYWZldHkuICBUaGFua3MgZ28gdG8gSmVmZiBHYXJ6aWssCisgICAgQW5kcmV3IE1vcnRvbiBhbmQgRnJhbmsgRGF2aXMgZm9yIHRoZSBTTVAgc2FmZXR5IGZpeGVzLgorCisgICAgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4gOgorICAgIENsZWFuZWQgdXAgcG9pbnRlciBhcml0aG1ldGljcy4KKyAgICBGaXhlZCBhIGxvdCBvZiA2NGJpdCBpc3N1ZXMuCisgICAgQ2xlYW5lZCB1cCBwcmludGsoKXMgYSBiaXQuCisgICAgRml4ZWQgc29tZSBvYnZpb3VzIGJpZyBlbmRpYW4gcHJvYmxlbXMuCisKKyAgICBUb2JpYXMgUmluZ3N0cm9tIDx0b3JpQHVuaGFwcHkubWluZS5udT4gOgorICAgIFVzZSB0aW1lX2FmdGVyIGZvciBqaWZmaWVzIGNhbGN1bGF0aW9uLiAgQWRkZWQgZXRodG9vbAorICAgIHN1cHBvcnQuICBVcGRhdGVkIFBDSSByZXNvdXJjZSBhbGxvY2F0aW9uLiAgRG8gbm90CisgICAgZm9yZ2V0IHRvIHVubWFwIFBDSSBtYXBwZWQgc2ticy4KKworICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgICAgQWRkZWQgbmV3IFBDSSBpZGVudGlmaWVycyBwcm92aWRlZCBieSBDbGVhciBaaGFuZyBhdCBBTGkgCisgICAgZm9yIHRoZWlyIDE1NjMgZXRoZXJuZXQgZGV2aWNlLgorCisgICAgVE9ETworCisgICAgSW1wbGVtZW50IHBjaV9kcml2ZXI6OnN1c3BlbmQoKSBhbmQgcGNpX2RyaXZlcjo6cmVzdW1lKCkKKyAgICBwb3dlciBtYW5hZ2VtZW50IG1ldGhvZHMuCisKKyAgICBDaGVjayBvbiA2NCBiaXQgYm94ZXMuCisgICAgQ2hlY2sgYW5kIGZpeCBvbiBiaWcgZW5kaWFuIGJveGVzLgorCisgICAgVGVzdCBhbmQgbWFrZSBzdXJlIFBDSSBsYXRlbmN5IGlzIG5vdyBjb3JyZWN0IGZvciBhbGwgY2FzZXMuCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJkbWZlIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4zNi40IgorI2RlZmluZSBEUlZfUkVMREFURQkiMjAwMi0wMS0xNyIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworCisvKiBCb2FyZC9TeXN0ZW0vRGVidWcgaW5mb3JtYXRpb24vZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFBDSV9ETTkxMzJfSUQgICAweDkxMzIxMjgyICAgICAgLyogRGF2aWNvbSBETTkxMzIgSUQgKi8KKyNkZWZpbmUgUENJX0RNOTEwMl9JRCAgIDB4OTEwMjEyODIgICAgICAvKiBEYXZpY29tIERNOTEwMiBJRCAqLworI2RlZmluZSBQQ0lfRE05MTAwX0lEICAgMHg5MTAwMTI4MiAgICAgIC8qIERhdmljb20gRE05MTAwIElEICovCisjZGVmaW5lIFBDSV9ETTkwMDlfSUQgICAweDkwMDkxMjgyICAgICAgLyogRGF2aWNvbSBETTkwMDkgSUQgKi8KKworI2RlZmluZSBETTkxMDJfSU9fU0laRSAgMHg4MAorI2RlZmluZSBETTkxMDJBX0lPX1NJWkUgMHgxMDAKKyNkZWZpbmUgVFhfTUFYX1NFTkRfQ05UIDB4MSAgICAgICAgICAgICAvKiBNYXhpbXVtIHR4IHBhY2tldCBwZXIgdGltZSAqLworI2RlZmluZSBUWF9ERVNDX0NOVCAgICAgMHgxMCAgICAgICAgICAgIC8qIEFsbG9jYXRlZCBUeCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBSWF9ERVNDX0NOVCAgICAgMHgyMCAgICAgICAgICAgIC8qIEFsbG9jYXRlZCBSeCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBUWF9GUkVFX0RFU0NfQ05UIChUWF9ERVNDX0NOVCAtIDIpCS8qIE1heCBUWCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgVFhfV0FLRV9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAzKQkvKiBUWCB3YWtldXAgY291bnQgKi8KKyNkZWZpbmUgREVTQ19BTExfQ05UICAgIChUWF9ERVNDX0NOVCArIFJYX0RFU0NfQ05UKQorI2RlZmluZSBUWF9CVUZfQUxMT0MgICAgMHg2MDAKKyNkZWZpbmUgUlhfQUxMT0NfU0laRSAgIDB4NjIwCisjZGVmaW5lIERNOTEwWF9SRVNFVCAgICAxCisjZGVmaW5lIENSMF9ERUZBVUxUICAgICAweDAwRTAwMDAwICAgICAgLyogVFggJiBSWCBidXJzdCBtb2RlICovCisjZGVmaW5lIENSNl9ERUZBVUxUICAgICAweDAwMDgwMDAwICAgICAgLyogSEQgKi8KKyNkZWZpbmUgQ1I3X0RFRkFVTFQgICAgIDB4MTgwYzEKKyNkZWZpbmUgQ1IxNV9ERUZBVUxUICAgIDB4MDYgICAgICAgICAgICAvKiBUeEphYmJlciBSeFdhdGNoZG9nICovCisjZGVmaW5lIFRERVMwX0VSUl9NQVNLICAweDQzMDIgICAgICAgICAgLyogVFhKVCwgTEMsIEVDLCBGVUUgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIDE1MTQKKyNkZWZpbmUgRE1GRV9NQVhfTVVMVElDQVNUIDE0CisjZGVmaW5lIFJYX0NPUFlfU0laRQkxMDAKKyNkZWZpbmUgTUFYX0NIRUNLX1BBQ0tFVCAweDgwMDAKKyNkZWZpbmUgRE05ODAxX05PSVNFX0ZMT09SIDgKKyNkZWZpbmUgRE05ODAyX05PSVNFX0ZMT09SIDUKKworI2RlZmluZSBETUZFXzEwTUhGICAgICAgMAorI2RlZmluZSBETUZFXzEwME1IRiAgICAgMQorI2RlZmluZSBETUZFXzEwTUZEICAgICAgNAorI2RlZmluZSBETUZFXzEwME1GRCAgICAgNQorI2RlZmluZSBETUZFX0FVVE8gICAgICAgOAorI2RlZmluZSBETUZFXzFNX0hQTkEgICAgMHgxMAorCisjZGVmaW5lIERNRkVfVFhUSF83MgkweDQwMDAwMAkvKiBUWCBUSCA3MiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF85NgkweDQwNDAwMAkvKiBUWCBUSCA5NiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF8xMjgJMHgwMDAwCQkvKiBUWCBUSCAxMjggYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfMjU2CTB4NDAwMAkJLyogVFggVEggMjU2IGJ5dGUgKi8KKyNkZWZpbmUgRE1GRV9UWFRIXzUxMgkweDgwMDAJCS8qIFRYIFRIIDUxMiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF8xSwkweEMwMDAJCS8qIFRYIFRIIDFLICBieXRlICovCisKKyNkZWZpbmUgRE1GRV9USU1FUl9XVVQgIChqaWZmaWVzICsgSFogKiAxKS8qIHRpbWVyIHdha2V1cCB0aW1lIDogMSBzZWNvbmQgKi8KKyNkZWZpbmUgRE1GRV9UWF9USU1FT1VUICgoMypIWikvMikJLyogdHggcGFja2V0IHRpbWUtb3V0IHRpbWUgMS41IHMiICovCisjZGVmaW5lIERNRkVfVFhfS0lDSyAJKEhaLzIpCS8qIHR4IHBhY2tldCBLaWNrLW91dCB0aW1lIDAuNSBzIiAqLworCisjZGVmaW5lIERNRkVfREJVRyhkYnVnX25vdywgbXNnLCB2YWx1ZSkgaWYgKGRtZmVfZGVidWcgfHwgKGRidWdfbm93KSkgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzICVseFxuIiwgKG1zZyksIChsb25nKSAodmFsdWUpKQorCisjZGVmaW5lIFNIT1dfTUVESUFfVFlQRShtb2RlKSBwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogQ2hhbmdlIFNwZWVkIHRvICVzTWh6ICVzIGR1cGxleFxuIixtb2RlICYgMSA/IjEwMCI6IjEwIiwgbW9kZSAmIDQgPyAiZnVsbCI6ImhhbGYiKTsKKworCisvKiBDUjkgZGVmaW5pdGlvbjogU1JPTS9NSUkgKi8KKyNkZWZpbmUgQ1I5X1NST01fUkVBRCAgIDB4NDgwMAorI2RlZmluZSBDUjlfU1JDUyAgICAgICAgMHgxCisjZGVmaW5lIENSOV9TUkNMSyAgICAgICAweDIKKyNkZWZpbmUgQ1I5X0NSRE9VVCAgICAgIDB4OAorI2RlZmluZSBTUk9NX0RBVEFfMCAgICAgMHgwCisjZGVmaW5lIFNST01fREFUQV8xICAgICAweDQKKyNkZWZpbmUgUEhZX0RBVEFfMSAgICAgIDB4MjAwMDAKKyNkZWZpbmUgUEhZX0RBVEFfMCAgICAgIDB4MDAwMDAKKyNkZWZpbmUgTURDTEtIICAgICAgICAgIDB4MTAwMDAKKworI2RlZmluZSBQSFlfUE9XRVJfRE9XTgkweDgwMAorCisjZGVmaW5lIFNST01fVjQxX0NPREUgICAweDE0CisKKyNkZWZpbmUgU1JPTV9DTEtfV1JJVEUoZGF0YSwgaW9hZGRyKSBvdXRsKGRhdGF8Q1I5X1NST01fUkVBRHxDUjlfU1JDUyxpb2FkZHIpO3VkZWxheSg1KTtvdXRsKGRhdGF8Q1I5X1NST01fUkVBRHxDUjlfU1JDU3xDUjlfU1JDTEssaW9hZGRyKTt1ZGVsYXkoNSk7b3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1MsaW9hZGRyKTt1ZGVsYXkoNSk7CisKKyNkZWZpbmUgX19DSEtfSU9fU0laRShwY2lfaWQsIGRldl9yZXYpICggKChwY2lfaWQpPT1QQ0lfRE05MTMyX0lEKSB8fCAoKGRldl9yZXYpID49IDB4MDIwMDAwMzApICkgPyBETTkxMDJBX0lPX1NJWkU6IERNOTEwMl9JT19TSVpFCisjZGVmaW5lIENIS19JT19TSVpFKHBjaV9kZXYsIGRldl9yZXYpIF9fQ0hLX0lPX1NJWkUoKChwY2lfZGV2KS0+ZGV2aWNlIDw8IDE2KSB8IChwY2lfZGV2KS0+dmVuZG9yLCBkZXZfcmV2KQorCisvKiBTdGVuIENoZWNrICovCisjZGVmaW5lIERFVklDRSBuZXRfZGV2aWNlCisKKy8qIFN0cnVjdHVyZS9lbnVtIGRlY2xhcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0cnVjdCB0eF9kZXNjIHsKKyAgICAgICAgdTMyIHRkZXMwLCB0ZGVzMSwgdGRlczIsIHRkZXMzOyAvKiBEYXRhIGZvciB0aGUgY2FyZCAqLworICAgICAgICBjaGFyICp0eF9idWZfcHRyOyAgICAgICAgICAgICAgIC8qIERhdGEgZm9yIHVzICovCisgICAgICAgIHN0cnVjdCB0eF9kZXNjICpuZXh0X3R4X2Rlc2M7Cit9IF9fYXR0cmlidXRlX18oKCBhbGlnbmVkKDMyKSApKTsKKworc3RydWN0IHJ4X2Rlc2MgeworCXUzMiByZGVzMCwgcmRlczEsIHJkZXMyLCByZGVzMzsgLyogRGF0YSBmb3IgdGhlIGNhcmQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiX3B0cjsJLyogRGF0YSBmb3IgdXMgKi8KKwlzdHJ1Y3QgcnhfZGVzYyAqbmV4dF9yeF9kZXNjOworfSBfX2F0dHJpYnV0ZV9fKCggYWxpZ25lZCgzMikgKSk7CisKK3N0cnVjdCBkbWZlX2JvYXJkX2luZm8geworCXUzMiBjaGlwX2lkOwkJCS8qIENoaXAgdmVuZG9yL0RldmljZSBJRCAqLworCXUzMiBjaGlwX3JldmlzaW9uOwkJLyogQ2hpcCByZXZpc2lvbiAqLworCXN0cnVjdCBERVZJQ0UgKm5leHRfZGV2OwkvKiBuZXh0IGRldmljZSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkJLyogUENJIGRldmljZSAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCWxvbmcgaW9hZGRyOwkJCS8qIEkvTyBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgY3IwX2RhdGE7CisJdTMyIGNyNV9kYXRhOworCXUzMiBjcjZfZGF0YTsKKwl1MzIgY3I3X2RhdGE7CisJdTMyIGNyMTVfZGF0YTsKKworCS8qIHBvaW50ZXIgZm9yIG1lbW9yeSBwaHlzaWNhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBidWZfcG9vbF9kbWFfcHRyOwkvKiBUeCBidWZmZXIgcG9vbCBtZW1vcnkgKi8KKwlkbWFfYWRkcl90IGJ1Zl9wb29sX2RtYV9zdGFydDsJLyogVHggYnVmZmVyIHBvb2wgYWxpZ24gZHdvcmQgKi8KKwlkbWFfYWRkcl90IGRlc2NfcG9vbF9kbWFfcHRyOwkvKiBkZXNjcmlwdG9yIHBvb2wgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBmaXJzdF90eF9kZXNjX2RtYTsKKwlkbWFfYWRkcl90IGZpcnN0X3J4X2Rlc2NfZG1hOworCisJLyogZGVzY3JpcHRvciBwb2ludGVyICovCisJdW5zaWduZWQgY2hhciAqYnVmX3Bvb2xfcHRyOwkvKiBUeCBidWZmZXIgcG9vbCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBjaGFyICpidWZfcG9vbF9zdGFydDsJLyogVHggYnVmZmVyIHBvb2wgYWxpZ24gZHdvcmQgKi8KKwl1bnNpZ25lZCBjaGFyICpkZXNjX3Bvb2xfcHRyOwkvKiBkZXNjcmlwdG9yIHBvb2wgbWVtb3J5ICovCisJc3RydWN0IHR4X2Rlc2MgKmZpcnN0X3R4X2Rlc2M7CisJc3RydWN0IHR4X2Rlc2MgKnR4X2luc2VydF9wdHI7CisJc3RydWN0IHR4X2Rlc2MgKnR4X3JlbW92ZV9wdHI7CisJc3RydWN0IHJ4X2Rlc2MgKmZpcnN0X3J4X2Rlc2M7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4X2luc2VydF9wdHI7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4X3JlYWR5X3B0cjsJLyogcGFja2V0IGNvbWUgcG9pbnRlciAqLworCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0X2NudDsJLyogdHJhbnNtaXR0ZWQgcGFja2V0IGNvdW50ICovCisJdW5zaWduZWQgbG9uZyB0eF9xdWV1ZV9jbnQ7CS8qIHdhaXQgdG8gc2VuZCBwYWNrZXQgY291bnQgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2F2YWlsX2NudDsJLyogYXZhaWxhYmxlIHJ4IGRlc2NyaXB0b3IgY291bnQgKi8KKwl1bnNpZ25lZCBsb25nIGludGVydmFsX3J4X2NudDsJLyogcnggcGFja2V0IGNvdW50IGEgY2FsbGJhY2sgdGltZSAqLworCisJdTE2IEhQTkFfY29tbWFuZDsJCS8qIEZvciBIUE5BIHJlZ2lzdGVyIDE2ICovCisJdTE2IEhQTkFfdGltZXI7CQkJLyogRm9yIEhQTkEgcmVtb3RlIGRldmljZSBjaGVjayAqLworCXUxNiBkYnVnX2NudDsKKwl1MTYgTklDX2NhcGFiaWxpdHk7CQkvKiBOSUMgbWVkaWEgY2FwYWJpbGl0eSAqLworCXUxNiBQSFlfcmVnNDsJCQkvKiBTYXZlZCBQaHl4Y2VyIHJlZ2lzdGVyIDQgdmFsdWUgKi8KKworCXU4IEhQTkFfcHJlc2VudDsJCS8qIDA6bm9uZSwgMTpETTk4MDEsIDI6RE05ODAyICovCisJdTggY2hpcF90eXBlOwkJCS8qIEtlZXAgRE05MTAyQSBjaGlwIHR5cGUgKi8KKwl1OCBtZWRpYV9tb2RlOwkJCS8qIHVzZXIgc3BlY2lmeSBtZWRpYSBtb2RlICovCisJdTggb3BfbW9kZTsJCQkvKiByZWFsIHdvcmsgbWVkaWEgbW9kZSAqLworCXU4IHBoeV9hZGRyOworCXU4IGxpbmtfZmFpbGVkOwkJCS8qIEV2ZXIgbGluayBmYWlsZWQgKi8KKwl1OCB3YWl0X3Jlc2V0OwkJCS8qIEhhcmR3YXJlIGZhaWxlZCwgbmVlZCB0byByZXNldCAqLworCXU4IGRtOTEweF9jaGtfbW9kZTsJCS8qIE9wZXJhdGluZyBtb2RlIGNoZWNrICovCisJdTggZmlyc3RfaW5fY2FsbGJhY2s7CQkvKiBGbGFnIHRvIHJlY29yZCBzdGF0ZSAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJLyogU3lzdGVtIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCS8qIERyaXZlciBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCisJdW5zaWduZWQgbG9uZyB0eF9maWZvX3VuZGVycnVuOworCXVuc2lnbmVkIGxvbmcgdHhfbG9zc19jYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgdHhfbm9fY2FycmllcjsKKwl1bnNpZ25lZCBsb25nIHR4X2xhdGVfY29sbGlzaW9uOworCXVuc2lnbmVkIGxvbmcgdHhfZXhjZXNzaXZlX2NvbGxpc2lvbjsKKwl1bnNpZ25lZCBsb25nIHR4X2phYmJlcl90aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgcmVzZXRfY291bnQ7CisJdW5zaWduZWQgbG9uZyByZXNldF9jcjg7CisJdW5zaWduZWQgbG9uZyByZXNldF9mYXRhbDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X1RYdGltZW91dDsKKworCS8qIE5JQyBTUk9NIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHNyb21bMTI4XTsKK307CisKK2VudW0gZG1mZV9vZmZzZXRzIHsKKwlEQ1IwID0gMHgwMCwgRENSMSA9IDB4MDgsIERDUjIgPSAweDEwLCBEQ1IzID0gMHgxOCwgRENSNCA9IDB4MjAsCisJRENSNSA9IDB4MjgsIERDUjYgPSAweDMwLCBEQ1I3ID0gMHgzOCwgRENSOCA9IDB4NDAsIERDUjkgPSAweDQ4LAorCURDUjEwID0gMHg1MCwgRENSMTEgPSAweDU4LCBEQ1IxMiA9IDB4NjAsIERDUjEzID0gMHg2OCwgRENSMTQgPSAweDcwLAorCURDUjE1ID0gMHg3OAorfTsKKworZW51bSBkbWZlX0NSNl9iaXRzIHsKKwlDUjZfUlhTQyA9IDB4MiwgQ1I2X1BCRiA9IDB4OCwgQ1I2X1BNID0gMHg0MCwgQ1I2X1BBTSA9IDB4ODAsCisJQ1I2X0ZETSA9IDB4MjAwLCBDUjZfVFhTQyA9IDB4MjAwMCwgQ1I2X1NUSSA9IDB4MTAwMDAwLAorCUNSNl9TRlQgPSAweDIwMDAwMCwgQ1I2X1JYQSA9IDB4NDAwMDAwMDAsIENSNl9OT19QVVJHRSA9IDB4MjAwMDAwMDAKK307CisKKy8qIEdsb2JhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBfX2RldmluaXRkYXRhIHByaW50ZWRfdmVyc2lvbjsKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlLRVJOX0lORk8gRFJWX05BTUUgIjogRGF2aWNvbSBETTl4eHggbmV0IGRyaXZlciwgdmVyc2lvbiAiCisJRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworc3RhdGljIGludCBkbWZlX2RlYnVnOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1mZV9tZWRpYV9tb2RlID0gRE1GRV9BVVRPOworc3RhdGljIHUzMiBkbWZlX2NyNl91c2VyX3NldDsKKworLyogRm9yIG1vZHVsZSBpbnB1dCBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgdTMyIGNyNnNldDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1vZGUgPSA4Oworc3RhdGljIHU4IGNoa21vZGUgPSAxOworc3RhdGljIHU4IEhQTkFfbW9kZTsJCS8qIERlZmF1bHQ6IExvdyBQb3dlci9IaWdoIFNwZWVkICovCitzdGF0aWMgdTggSFBOQV9yeF9jbWQ7CQkvKiBEZWZhdWx0OiBEaXNhYmxlIFJ4IHJlbW90ZSBjb21tYW5kICovCitzdGF0aWMgdTggSFBOQV90eF9jbWQ7CQkvKiBEZWZhdWx0OiBEb24ndCBpc3N1ZSByZW1vdGUgY29tbWFuZCAqLworc3RhdGljIHU4IEhQTkFfTm9pc2VGbG9vcjsJLyogRGVmYXVsdDogSFBOQSBOb2lzZUZsb29yICovCitzdGF0aWMgdTggU0ZfbW9kZTsJCS8qIFNwZWNpYWwgRnVuY3Rpb246IDE6VkxBTiwgMjpSWCBGbG93IENvbnRyb2wKKwkJCQkgICA0OiBUWCBwYXVzZSBwYWNrZXQgKi8KKworCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGRtZmVfb3BlbihzdHJ1Y3QgREVWSUNFICopOworc3RhdGljIGludCBkbWZlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyBpbnQgZG1mZV9zdG9wKHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICopOworc3RhdGljIHZvaWQgZG1mZV9zZXRfZmlsdGVyX21vZGUoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIHUxNiByZWFkX3Nyb21fd29yZChsb25nICxpbnQpOworc3RhdGljIGlycXJldHVybl90IGRtZmVfaW50ZXJydXB0KGludCAsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHBvbGxfZG1mZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGRtZmVfZGVzY3JpcHRvcl9pbml0KHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9yeF9idWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jcjYodTMyLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHNlbmRfZmlsdGVyX2ZyYW1lKHN0cnVjdCBERVZJQ0UgKiAsaW50KTsKK3N0YXRpYyB2b2lkIGRtOTEzMl9pZF90YWJsZShzdHJ1Y3QgREVWSUNFICogLGludCk7CitzdGF0aWMgdTE2IHBoeV9yZWFkKHVuc2lnbmVkIGxvbmcsIHU4LCB1OCwgdTMyKTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nLCB1OCwgdTgsIHUxNiwgdTMyKTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHVuc2lnbmVkIGxvbmcsIHUzMik7CitzdGF0aWMgdTE2IHBoeV9yZWFkXzFiaXQodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdTggZG1mZV9zZW5zZV9zcGVlZChzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9wcm9jZXNzX21vZGUoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfdGltZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW5saW5lIHUzMiBjYWxfQ1JDKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCB1OCk7CitzdGF0aWMgdm9pZCBkbWZlX3J4X3BhY2tldChzdHJ1Y3QgREVWSUNFICosIHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfdHhfcGt0KHN0cnVjdCBERVZJQ0UgKiwgc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfcmV1c2Vfc2tiKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiwgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZCBkbWZlX2R5bmFtaWNfcmVzZXQoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfZnJlZV9yeGJ1ZmZlcihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9pbml0X2RtOTEweChzdHJ1Y3QgREVWSUNFICopOworc3RhdGljIHZvaWQgZG1mZV9wYXJzZV9zcm9tKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAxKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiwgaW50KTsKK3N0YXRpYyB2b2lkIGRtZmVfcHJvZ3JhbV9ETTk4MDIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfSFBOQV9yZW1vdGVfY21kX2NoayhzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogKTsKK3N0YXRpYyB2b2lkIGRtZmVfc2V0X3BoeXhjZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKKworLyogRE05MTBYIG5ldHdvcmsgYmFvcmQgcm91dGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglTZWFyY2ggRE05MTBYIGJvYXJkICxhbGxvY2F0ZSBzcGFjZSBhbmQgcmVnaXN0ZXIgaXQKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkbWZlX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYjsJLyogYm9hcmQgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1MzIgZGV2X3JldiwgcGNpX3BtcjsKKwlpbnQgaSwgZXJyOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2luaXRfb25lKCkiLCAwKTsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKworCS8qIEluaXQgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmRiKSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogMzItYml0IFBDSSBETUEgbm90IGF2YWlsYWJsZS5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwkvKiBFbmFibGUgTWFzdGVyL0lPIGFjY2VzcywgRGlzYWJsZSBtZW1vcnkgYWNjZXNzICovCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwlpZiAoIXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogSS9PIGJhc2UgaXMgemVyb1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCS8qIFJlYWQgQ2hpcCByZXZpc2lvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZkZXZfcmV2KTsKKworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgKENIS19JT19TSVpFKHBkZXYsIGRldl9yZXYpKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEFsbG9jYXRlZCBJL08gc2l6ZSB0b28gc21hbGxcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKyNpZiAwCS8qIHBjaV97ZW5hYmxlX2RldmljZSxzZXRfbWFzdGVyfSBzZXRzIG1pbmltdW0gbGF0ZW5jeSBmb3IgdXMgbm93ICovCisKKwkvKiBTZXQgTGF0ZW5jeSBUaW1lciA4MGggKi8KKwkvKiBGSVhNRTogc2V0dGluZyB2YWx1ZXMgPiAzMiBicmVha3Mgc29tZSBTaVMgNTU5eCBzdHVmZi4KKwkgICBOZWVkIGEgUENJIHF1aXJrLi4gKi8KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CisjZW5kaWYKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogRmFpbGVkIHRvIHJlcXVlc3QgUENJIHJlZ2lvbnNcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwkvKiBJbml0IHN5c3RlbSAmIGRldmljZSAqLworCWRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEFsbG9jYXRlIFR4L1J4IGRlc2NyaXB0b3IgbWVtb3J5ICovCisJZGItPmRlc2NfcG9vbF9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogREVTQ19BTExfQ05UICsgMHgyMCwgJmRiLT5kZXNjX3Bvb2xfZG1hX3B0cik7CisJZGItPmJ1Zl9wb29sX3B0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX0JVRl9BTExPQyAqIFRYX0RFU0NfQ05UICsgNCwgJmRiLT5idWZfcG9vbF9kbWFfcHRyKTsKKworCWRiLT5maXJzdF90eF9kZXNjID0gKHN0cnVjdCB0eF9kZXNjICopIGRiLT5kZXNjX3Bvb2xfcHRyOworCWRiLT5maXJzdF90eF9kZXNjX2RtYSA9IGRiLT5kZXNjX3Bvb2xfZG1hX3B0cjsKKwlkYi0+YnVmX3Bvb2xfc3RhcnQgPSBkYi0+YnVmX3Bvb2xfcHRyOworCWRiLT5idWZfcG9vbF9kbWFfc3RhcnQgPSBkYi0+YnVmX3Bvb2xfZG1hX3B0cjsKKworCWRiLT5jaGlwX2lkID0gZW50LT5kcml2ZXJfZGF0YTsKKwlkYi0+aW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWRiLT5jaGlwX3JldmlzaW9uID0gZGV2X3JldjsKKworCWRiLT5wZGV2ID0gcGRldjsKKworCWRldi0+YmFzZV9hZGRyID0gZGItPmlvYWRkcjsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlkZXYtPm9wZW4gPSAmZG1mZV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRtZmVfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmZG1mZV9zdG9wOworCWRldi0+Z2V0X3N0YXRzID0gJmRtZmVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmRtZmVfc2V0X2ZpbHRlcl9tb2RlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmcG9sbF9kbWZlOworI2VuZGlmCisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJc3Bpbl9sb2NrX2luaXQoJmRiLT5sb2NrKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmcGNpX3Btcik7CisJcGNpX3BtciAmPSAweDcwMDAwOworCWlmICggKHBjaV9wbXIgPT0gMHgxMDAwMCkgJiYgKGRldl9yZXYgPT0gMHgwMjAwMDAzMSkgKQorCQlkYi0+Y2hpcF90eXBlID0gMTsJLyogRE05MTAyQSBFMyAqLworCWVsc2UKKwkJZGItPmNoaXBfdHlwZSA9IDA7CisKKwkvKiByZWFkIDY0IHdvcmQgc3JvbSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCSgodTE2ICopIGRiLT5zcm9tKVtpXSA9IGNwdV90b19sZTE2KHJlYWRfc3JvbV93b3JkKGRiLT5pb2FkZHIsIGkpKTsKKworCS8qIFNldCBOb2RlIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gZGItPnNyb21bMjAgKyBpXTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfcmVzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERhdmljb20gRE0lMDRseCBhdCBwY2klcywiLAorCQlkZXYtPm5hbWUsCisJCWVudC0+ZHJpdmVyX2RhdGEgPj4gMTYsCisJCXBjaV9uYW1lKHBkZXYpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTAyeCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiLCBpcnEgJWQuXG4iLCBkZXYtPmlycSk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXRfZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRtZmVfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfcmVtb3ZlX29uZSgpIiwgMCk7CisKKyAJaWYgKGRldikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRiLT5wZGV2LCBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICoKKwkJCQkJREVTQ19BTExfQ05UICsgMHgyMCwgZGItPmRlc2NfcG9vbF9wdHIsCisgCQkJCQlkYi0+ZGVzY19wb29sX2RtYV9wdHIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRiLT5wZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsCisJCQkJCWRiLT5idWZfcG9vbF9wdHIsIGRiLT5idWZfcG9vbF9kbWFfcHRyKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsJLyogZnJlZSBib2FyZCBpbmZvcm1hdGlvbiAqLworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorCisJRE1GRV9EQlVHKDAsICJkbWZlX3JlbW92ZV9vbmUoKSBleGl0IiwgMCk7Cit9CisKKworLyoKKyAqCU9wZW4gdGhlIGludGVyZmFjZS4KKyAqCVRoZSBpbnRlcmZhY2UgaXMgb3BlbmVkIHdoZW5ldmVyICJpZmNvbmZpZyIgYWN0aXZlcyBpdC4KKyAqLworCitzdGF0aWMgaW50IGRtZmVfb3BlbihzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfb3BlbiIsIDApOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZkbWZlX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogc3lzdGVtIHZhcmlhYmxlIGluaXQgKi8KKwlkYi0+Y3I2X2RhdGEgPSBDUjZfREVGQVVMVCB8IGRtZmVfY3I2X3VzZXJfc2V0OworCWRiLT50eF9wYWNrZXRfY250ID0gMDsKKwlkYi0+dHhfcXVldWVfY250ID0gMDsKKwlkYi0+cnhfYXZhaWxfY250ID0gMDsKKwlkYi0+bGlua19mYWlsZWQgPSAxOworCWRiLT53YWl0X3Jlc2V0ID0gMDsKKworCWRiLT5maXJzdF9pbl9jYWxsYmFjayA9IDA7CisJZGItPk5JQ19jYXBhYmlsaXR5ID0gMHhmOwkvKiBBbGwgY2FwYWJpbGl0eSovCisJZGItPlBIWV9yZWc0ID0gMHgxZTA7CisKKwkvKiBDUjYgb3BlcmF0aW9uIG1vZGUgZGVjaXNpb24gKi8KKwlpZiAoICFjaGttb2RlIHx8IChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKSB8fAorCQkoZGItPmNoaXBfcmV2aXNpb24gPj0gMHgwMjAwMDAzMCkgKSB7CisgICAgCQlkYi0+Y3I2X2RhdGEgfD0gRE1GRV9UWFRIXzI1NjsKKwkJZGItPmNyMF9kYXRhID0gQ1IwX0RFRkFVTFQ7CisJCWRiLT5kbTkxMHhfY2hrX21vZGU9NDsJCS8qIEVudGVyIHRoZSBub3JtYWwgbW9kZSAqLworIAl9IGVsc2UgeworCQlkYi0+Y3I2X2RhdGEgfD0gQ1I2X1NGVDsJLyogU3RvcmUgJiBGb3J3YXJkIG1vZGUgKi8KKwkJZGItPmNyMF9kYXRhID0gMDsKKwkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDE7CS8qIEVudGVyIHRoZSBjaGVjayBtb2RlICovCisJfQorCisJLyogSW5pdGlsaXplIERNOTEwWCBib2FyZCAqLworCWRtZmVfaW5pdF9kbTkxMHgoZGV2KTsKKworCS8qIEFjdGl2ZSBTeXN0ZW0gSW50ZXJmYWNlICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJLyogc2V0IGFuZCBhY3RpdmUgYSB0aW1lciBwcm9jZXNzICovCisJaW5pdF90aW1lcigmZGItPnRpbWVyKTsKKwlkYi0+dGltZXIuZXhwaXJlcyA9IERNRkVfVElNRVJfV1VUICsgSFogKiAyOworCWRiLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWRiLT50aW1lci5mdW5jdGlvbiA9ICZkbWZlX3RpbWVyOworCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCisKKy8qCUluaXRpbGl6ZSBETTkxMFggYm9hcmQKKyAqCVJlc2V0IERNOTEwWCBib2FyZAorICoJSW5pdGlsaXplIFRYL1J4IGRlc2NyaXB0b3IgY2hhaW4gc3RydWN0dXJlCisgKglTZW5kIHRoZSBzZXQtdXAgZnJhbWUKKyAqCUVuYWJsZSBUeC9SeCBtYWNoaW5lCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9pbml0X2RtOTEweChzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGItPmlvYWRkcjsKKworCURNRkVfREJVRygwLCAiZG1mZV9pbml0X2RtOTEweCgpIiwgMCk7CisKKwkvKiBSZXNldCBETTkxMHggTUFDIGNvbnRyb2xsZXIgKi8KKwlvdXRsKERNOTEwWF9SRVNFVCwgaW9hZGRyICsgRENSMCk7CS8qIFJFU0VUIE1BQyAqLworCXVkZWxheSgxMDApOworCW91dGwoZGItPmNyMF9kYXRhLCBpb2FkZHIgKyBEQ1IwKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBQaHkgYWRkciA6IERNOTEwKEEpMi9ETTkxMzIvOTgwMSwgcGh5IGFkZHJlc3MgPSAxICovCisJZGItPnBoeV9hZGRyID0gMTsKKworCS8qIFBhcnNlciBTUk9NIGFuZCBtZWRpYSBtb2RlICovCisJZG1mZV9wYXJzZV9zcm9tKGRiKTsKKwlkYi0+bWVkaWFfbW9kZSA9IGRtZmVfbWVkaWFfbW9kZTsKKworCS8qIFJFU0VUIFBoeXhjZXIgQ2hpcCBieSBHUFIgcG9ydCBiaXQgNyAqLworCW91dGwoMHgxODAsIGlvYWRkciArIERDUjEyKTsJCS8qIExldCBiaXQgNyBvdXRwdXQgcG9ydCAqLworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSB7CisJCW91dGwoMHg4MCwgaW9hZGRyICsgRENSMTIpOwkvKiBJc3N1ZSBSRVNFVCBzaWduYWwgKi8KKwkJbWRlbGF5KDMwMCk7CQkJLyogRGVsYXkgMzAwIG1zICovCisJfQorCW91dGwoMHgwLCBpb2FkZHIgKyBEQ1IxMik7CS8qIENsZWFyIFJFU0VUIHNpZ25hbCAqLworCisJLyogUHJvY2VzcyBQaHl4Y2VyIE1lZGlhIE1vZGUgKi8KKwlpZiAoICEoZGItPm1lZGlhX21vZGUgJiAweDEwKSApCS8qIEZvcmNlIDFNIG1vZGUgKi8KKwkJZG1mZV9zZXRfcGh5eGNlcihkYik7CisKKwkvKiBNZWRpYSBNb2RlIFByb2Nlc3MgKi8KKwlpZiAoICEoZGItPm1lZGlhX21vZGUgJiBETUZFX0FVVE8pICkKKwkJZGItPm9wX21vZGUgPSBkYi0+bWVkaWFfbW9kZTsgCS8qIEZvcmNlIE1vZGUgKi8KKworCS8qIEluaXRpbGlhemUgVHJhbnNtaXQvUmVjZWl2ZSBkZWNyaXB0b3IgYW5kIENSMy80ICovCisJZG1mZV9kZXNjcmlwdG9yX2luaXQoZGIsIGlvYWRkcik7CisKKwkvKiBJbml0IENSNiB0byBwcm9ncmFtIERNOTEweCBvcGVyYXRpb24gKi8KKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgaW9hZGRyKTsKKworCS8qIFNlbmQgc2V0dXAgZnJhbWUgKi8KKwlpZiAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkKKwkJZG05MTMyX2lkX3RhYmxlKGRldiwgZGV2LT5tY19jb3VudCk7CS8qIERNOTEzMiAqLworCWVsc2UKKwkJc2VuZF9maWx0ZXJfZnJhbWUoZGV2LCBkZXYtPm1jX2NvdW50KTsJLyogRE05MTAyL0RNOTEwMkEgKi8KKworCS8qIEluaXQgQ1I3LCBpbnRlcnJ1cHQgYWN0aXZlIGJpdCAqLworCWRiLT5jcjdfZGF0YSA9IENSN19ERUZBVUxUOworCW91dGwoZGItPmNyN19kYXRhLCBpb2FkZHIgKyBEQ1I3KTsKKworCS8qIEluaXQgQ1IxNSwgVHggamFiYmVyIGFuZCBSeCB3YXRjaGRvZyB0aW1lciAqLworCW91dGwoZGItPmNyMTVfZGF0YSwgaW9hZGRyICsgRENSMTUpOworCisJLyogRW5hYmxlIERNOTEwWCBUeC9SeCBmdW5jdGlvbiAqLworCWRiLT5jcjZfZGF0YSB8PSBDUjZfUlhTQyB8IENSNl9UWFNDIHwgMHg0MDAwMDsKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgaW9hZGRyKTsKK30KKworCisvKgorICoJSGFyZHdhcmUgc3RhcnQgdHJhbnNtaXNzaW9uLgorICoJU2VuZCBhIHBhY2tldCB0byBtZWRpYSBmcm9tIHRoZSB1cHBlciBsYXllci4KKyAqLworCitzdGF0aWMgaW50IGRtZmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3N0YXJ0X3htaXQiLCAwKTsKKworCS8qIFJlc291cmNlIGZsYWcgY2hlY2sgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBUb28gbGFyZ2UgcGFja2V0IGNoZWNrICovCisJaWYgKHNrYi0+bGVuID4gTUFYX1BBQ0tFVF9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBiaWcgcGFja2V0ID0gJWRcbiIsICh1MTYpc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJLyogTm8gVHggcmVzb3VyY2UgY2hlY2ssIGl0IG5ldmVyIGhhcHBlbiBucm9tYWxseSAqLworCWlmIChkYi0+dHhfcXVldWVfY250ID49IFRYX0ZSRUVfREVTQ19DTlQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IE5vIFR4IHJlc291cmNlICVsZFxuIiwgZGItPnR4X3F1ZXVlX2NudCk7CisJCXJldHVybiAxOworCX0KKworCS8qIERpc2FibGUgTklDIGludGVycnVwdCAqLworCW91dGwoMCwgZGV2LT5iYXNlX2FkZHIgKyBEQ1I3KTsKKworCS8qIHRyYW5zbWl0IHRoaXMgcGFja2V0ICovCisJdHhwdHIgPSBkYi0+dHhfaW5zZXJ0X3B0cjsKKwltZW1jcHkodHhwdHItPnR4X2J1Zl9wdHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXR4cHRyLT50ZGVzMSA9IGNwdV90b19sZTMyKDB4ZTEwMDAwMDAgfCBza2ItPmxlbik7CisKKwkvKiBQb2ludCB0byBuZXh0IHRyYW5zbWl0IGZyZWUgZGVzY3JpcHRvciAqLworCWRiLT50eF9pbnNlcnRfcHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKworCS8qIFRyYW5zbWl0IFBhY2tldCBQcm9jZXNzICovCisJaWYgKCAoIWRiLT50eF9xdWV1ZV9jbnQpICYmIChkYi0+dHhfcGFja2V0X2NudCA8IFRYX01BWF9TRU5EX0NOVCkgKSB7CisJCXR4cHRyLT50ZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwkvKiBTZXQgb3duZXIgYml0ICovCisJCWRiLT50eF9wYWNrZXRfY250Kys7CQkJLyogUmVhZHkgdG8gc2VuZCAqLworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsJLyogSXNzdWUgVHggcG9sbGluZyAqLworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsJCS8qIHNhdmVkIHRpbWUgc3RhbXAgKi8KKwl9IGVsc2UgeworCQlkYi0+dHhfcXVldWVfY250Kys7CQkJLyogcXVldWUgVFggcGFja2V0ICovCisJCW91dGwoMHgxLCBkZXYtPmJhc2VfYWRkciArIERDUjEpOwkvKiBJc3N1ZSBUeCBwb2xsaW5nICovCisJfQorCisJLyogVHggcmVzb3VyY2UgY2hlY2sgKi8KKwlpZiAoIGRiLT50eF9xdWV1ZV9jbnQgPCBUWF9GUkVFX0RFU0NfQ05UICkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJLyogUmVzdG9yZSBDUjcgdG8gZW5hYmxlIGludGVycnVwdCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJb3V0bChkYi0+Y3I3X2RhdGEsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CisKKwkvKiBmcmVlIHRoaXMgU0tCICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCVN0b3AgdGhlIGludGVyZmFjZS4KKyAqCVRoZSBpbnRlcmZhY2UgaXMgc3RvcHBlZCB3aGVuIGl0IGlzIGJyb3VnaHQuCisgKi8KKworc3RhdGljIGludCBkbWZlX3N0b3Aoc3RydWN0IERFVklDRSAqZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3N0b3AiLCAwKTsKKworCS8qIGRpc2FibGUgc3lzdGVtICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogZGVsZXRlZCB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZkYi0+dGltZXIpOworCisJLyogUmVzZXQgJiBzdG9wIERNOTEwWCBib2FyZCAqLworCW91dGwoRE05MTBYX1JFU0VULCBpb2FkZHIgKyBEQ1IwKTsKKwl1ZGVsYXkoNSk7CisJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMCwgMHg4MDAwLCBkYi0+Y2hpcF9pZCk7CisKKwkvKiBmcmVlIGludGVycnVwdCAqLworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogZnJlZSBhbGxvY2F0ZWQgcnggYnVmZmVyICovCisJZG1mZV9mcmVlX3J4YnVmZmVyKGRiKTsKKworI2lmIDAKKwkvKiBzaG93IHN0YXRpc3RpYyBjb3VudGVyICovCisJcHJpbnRrKERSVl9OQU1FICI6IEZVOiVseCBFQzolbHggTEM6JWx4IE5DOiVseCBMT0M6JWx4IFRYSlQ6JWx4IFJFU0VUOiVseCBSQ1I4OiVseCBGQUw6JWx4IFRUOiVseFxuIiwKKwkJZGItPnR4X2ZpZm9fdW5kZXJydW4sIGRiLT50eF9leGNlc3NpdmVfY29sbGlzaW9uLAorCQlkYi0+dHhfbGF0ZV9jb2xsaXNpb24sIGRiLT50eF9ub19jYXJyaWVyLCBkYi0+dHhfbG9zc19jYXJyaWVyLAorCQlkYi0+dHhfamFiYmVyX3RpbWVvdXQsIGRiLT5yZXNldF9jb3VudCwgZGItPnJlc2V0X2NyOCwKKwkJZGItPnJlc2V0X2ZhdGFsLCBkYi0+cmVzZXRfVFh0aW1lb3V0KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCURNOTEwMiBpbnN0ZXJydXB0IGhhbmRsZXIKKyAqCXJlY2VpdmUgdGhlIHBhY2tldCB0byB1cHBlciBsYXllciwgZnJlZSB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0CisgKi8KKworc3RhdGljIGlycXJldHVybl90IGRtZmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IERFVklDRSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfaW50ZXJydXB0KCkiLCAwKTsKKworCWlmICghZGV2KSB7CisJCURNRkVfREJVRygxLCAiZG1mZV9pbnRlcnJ1cHQoKSB3aXRob3V0IERFVklDRSBhcmciLCAwKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJLyogR290IERNOTEwWCBzdGF0dXMgKi8KKwlkYi0+Y3I1X2RhdGEgPSBpbmwoaW9hZGRyICsgRENSNSk7CisJb3V0bChkYi0+Y3I1X2RhdGEsIGlvYWRkciArIERDUjUpOworCWlmICggIShkYi0+Y3I1X2RhdGEgJiAweGMxKSApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBpbiBDUjcgdG8gc29sdmUgdGhlIGludGVycnVwdCBlZGdlIHByb2JsZW0gKi8KKwlvdXRsKDAsIGlvYWRkciArIERDUjcpOworCisJLyogQ2hlY2sgc3lzdGVtIHN0YXR1cyAqLworCWlmIChkYi0+Y3I1X2RhdGEgJiAweDIwMDApIHsKKwkJLyogc3lzdGVtIGJ1cyBlcnJvciBoYXBwZW4gKi8KKwkJRE1GRV9EQlVHKDEsICJTeXN0ZW0gYnVzIGVycm9yIGhhcHBlbi4gQ1I1PSIsIGRiLT5jcjVfZGF0YSk7CisJCWRiLT5yZXNldF9mYXRhbCsrOworCQlkYi0+d2FpdF9yZXNldCA9IDE7CS8qIE5lZWQgdG8gUkVTRVQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCSAvKiBSZWNlaXZlZCB0aGUgY29taW5nIHBhY2tldCAqLworCWlmICggKGRiLT5jcjVfZGF0YSAmIDB4NDApICYmIGRiLT5yeF9hdmFpbF9jbnQgKQorCQlkbWZlX3J4X3BhY2tldChkZXYsIGRiKTsKKworCS8qIHJlYWxsb2NhdGUgcnggZGVzY3JpcHRvciBidWZmZXIgKi8KKwlpZiAoZGItPnJ4X2F2YWlsX2NudDxSWF9ERVNDX0NOVCkKKwkJYWxsb2NhdGVfcnhfYnVmZmVyKGRiKTsKKworCS8qIEZyZWUgdGhlIHRyYW5zbWl0dGVkIGRlc2NyaXB0b3IgKi8KKwlpZiAoIGRiLT5jcjVfZGF0YSAmIDB4MDEpCisJCWRtZmVfZnJlZV90eF9wa3QoZGV2LCBkYik7CisKKwkvKiBNb2RlIENoZWNrICovCisJaWYgKGRiLT5kbTkxMHhfY2hrX21vZGUgJiAweDIpIHsKKwkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDB4NDsKKwkJZGItPmNyNl9kYXRhIHw9IDB4MTAwOworCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisJfQorCisJLyogUmVzdG9yZSBDUjcgdG8gZW5hYmxlIGludGVycnVwdCBtYXNrICovCisJb3V0bChkYi0+Y3I3X2RhdGEsIGlvYWRkciArIERDUjcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KKworc3RhdGljIHZvaWQgcG9sbF9kbWZlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGVfaXJxIGhlcmUgaXMgbm90IHZlcnkgbmljZSwgYnV0IHdpdGggdGhlIGxvY2tsZXNzCisJICAgaW50ZXJydXB0IGhhbmRsZXIgd2UgaGF2ZSBubyBvdGhlciBjaG9pY2UuICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCWRtZmVfaW50ZXJydXB0IChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisvKgorICoJRnJlZSBUWCByZXNvdXJjZSBhZnRlciBUWCBjb21wbGV0ZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZnJlZV90eF9wa3Qoc3RydWN0IERFVklDRSAqZGV2LCBzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIpCit7CisJc3RydWN0IHR4X2Rlc2MgKnR4cHRyOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTMyIHRkZXMwOworCisJdHhwdHIgPSBkYi0+dHhfcmVtb3ZlX3B0cjsKKwl3aGlsZShkYi0+dHhfcGFja2V0X2NudCkgeworCQl0ZGVzMCA9IGxlMzJfdG9fY3B1KHR4cHRyLT50ZGVzMCk7CisJCS8qIHByaW50ayhEUlZfTkFNRSAiOiB0ZGVzMD0leFxuIiwgdGRlczApOyAqLworCQlpZiAodGRlczAgJiAweDgwMDAwMDAwKQorCQkJYnJlYWs7CisKKwkJLyogQSBwYWNrZXQgc2VudCBjb21wbGV0ZWQgKi8KKwkJZGItPnR4X3BhY2tldF9jbnQtLTsKKwkJZGItPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLworCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7CisJCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KKwkJCWRiLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKKwkJCWRiLT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CisJCQlpZiAodGRlczAgJiBUREVTMF9FUlJfTUFTSykgeworCQkJCWRiLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCQkJCWlmICh0ZGVzMCAmIDB4MDAwMikgewkvKiBVbmRlclJ1biAqLworCQkJCQlkYi0+dHhfZmlmb191bmRlcnJ1bisrOworCQkJCQlpZiAoICEoZGItPmNyNl9kYXRhICYgQ1I2X1NGVCkgKSB7CisJCQkJCQlkYi0+Y3I2X2RhdGEgPSBkYi0+Y3I2X2RhdGEgfCBDUjZfU0ZUOworCQkJCQkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh0ZGVzMCAmIDB4MDEwMCkKKwkJCQkJZGItPnR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb24rKzsKKwkJCQlpZiAodGRlczAgJiAweDAyMDApCisJCQkJCWRiLT50eF9sYXRlX2NvbGxpc2lvbisrOworCQkJCWlmICh0ZGVzMCAmIDB4MDQwMCkKKwkJCQkJZGItPnR4X25vX2NhcnJpZXIrKzsKKwkJCQlpZiAodGRlczAgJiAweDA4MDApCisJCQkJCWRiLT50eF9sb3NzX2NhcnJpZXIrKzsKKwkJCQlpZiAodGRlczAgJiAweDQwMDApCisJCQkJCWRiLT50eF9qYWJiZXJfdGltZW91dCsrOworCQkJfQorCQl9CisKKyAgICAJCXR4cHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKwl9LyogRW5kIG9mIHdoaWxlICovCisKKwkvKiBVcGRhdGUgVFggcmVtb3ZlIHBvaW50ZXIgdG8gbmV4dCAqLworCWRiLT50eF9yZW1vdmVfcHRyID0gdHhwdHI7CisKKwkvKiBTZW5kIHRoZSBUeCBwYWNrZXQgaW4gcXVldWUgKi8KKwlpZiAoIChkYi0+dHhfcGFja2V0X2NudCA8IFRYX01BWF9TRU5EX0NOVCkgJiYgZGItPnR4X3F1ZXVlX2NudCApIHsKKwkJdHhwdHItPnRkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CS8qIFNldCBvd25lciBiaXQgKi8KKwkJZGItPnR4X3BhY2tldF9jbnQrKzsJCQkvKiBSZWFkeSB0byBzZW5kICovCisJCWRiLT50eF9xdWV1ZV9jbnQtLTsKKwkJb3V0bCgweDEsIGlvYWRkciArIERDUjEpOwkJLyogSXNzdWUgVHggcG9sbGluZyAqLworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsJCS8qIHNhdmVkIHRpbWUgc3RhbXAgKi8KKwl9CisKKwkvKiBSZXNvdXJjZSBhdmFpbGFibGUgY2hlY2sgKi8KKwlpZiAoIGRiLT50eF9xdWV1ZV9jbnQgPCBUWF9XQUtFX0RFU0NfQ05UICkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBBY3RpdmUgdXBwZXIgbGF5ZXIsIHNlbmQgYWdhaW4gKi8KK30KKworCisvKgorICoJQ2FsY3VsYXRlIHRoZSBDUkMgdmFsdWRlIG9mIHRoZSBSeCBwYWNrZXQKKyAqCWZsYWcgPSAJMSA6IHJldHVybiB0aGUgcmV2ZXJzZSBDUkMgKGZvciB0aGUgcmVjZWl2ZWQgcGFja2V0IENSQykKKyAqCQkwIDogcmV0dXJuIHRoZSBub3JtYWwgQ1JDIChmb3IgSGFzaCBUYWJsZSBpbmRleCkKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBjYWxfQ1JDKHVuc2lnbmVkIGNoYXIgKiBEYXRhLCB1bnNpZ25lZCBpbnQgTGVuLCB1OCBmbGFnKQoreworCXUzMiBjcmMgPSBjcmMzMih+MCwgRGF0YSwgTGVuKTsKKwlpZiAoZmxhZykgY3JjID0gfmNyYzsKKwlyZXR1cm4gY3JjOworfQorCisKKy8qCisgKglSZWNlaXZlIHRoZSBjb21lIHBhY2tldCBhbmQgcGFzcyB0byB1cHBlciBsYXllcgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcnhfcGFja2V0KHN0cnVjdCBERVZJQ0UgKmRldiwgc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXN0cnVjdCByeF9kZXNjICpyeHB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByeGxlbjsKKwl1MzIgcmRlczA7CisKKwlyeHB0ciA9IGRiLT5yeF9yZWFkeV9wdHI7CisKKwl3aGlsZShkYi0+cnhfYXZhaWxfY250KSB7CisJCXJkZXMwID0gbGUzMl90b19jcHUocnhwdHItPnJkZXMwKTsKKwkJaWYgKHJkZXMwICYgMHg4MDAwMDAwMCkJLyogcGFja2V0IG93bmVyIGNoZWNrICovCisJCQlicmVhazsKKworCQlkYi0+cnhfYXZhaWxfY250LS07CisJCWRiLT5pbnRlcnZhbF9yeF9jbnQrKzsKKworCQlwY2lfdW5tYXBfc2luZ2xlKGRiLT5wZGV2LCBsZTMyX3RvX2NwdShyeHB0ci0+cmRlczIpLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAoIChyZGVzMCAmIDB4MzAwKSAhPSAweDMwMCkgeworCQkJLyogQSBwYWNrZXQgd2l0aG91dCBGaXJzdC9MYXN0IGZsYWcgKi8KKwkJCS8qIHJldXNlIHRoaXMgU0tCICovCisJCQlETUZFX0RCVUcoMCwgIlJldXNlIFNLIGJ1ZmZlciwgcmRlczAiLCByZGVzMCk7CisJCQlkbWZlX3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOworCQl9IGVsc2UgeworCQkJLyogQSBwYWNrZXQgd2l0aCBGaXJzdC9MYXN0IGZsYWcgKi8KKwkJCXJ4bGVuID0gKCAocmRlczAgPj4gMTYpICYgMHgzZmZmKSAtIDQ7CisKKwkJCS8qIGVycm9yIHN1bW1hcnkgYml0IGNoZWNrICovCisJCQlpZiAocmRlczAgJiAweDgwMDApIHsKKwkJCQkvKiBUaGlzIGlzIGEgZXJyb3IgcGFja2V0ICovCisJCQkJLy9wcmludGsoRFJWX05BTUUgIjogcmRlczA6ICVseFxuIiwgcmRlczApOworCQkJCWRiLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlpZiAocmRlczAgJiAxKQorCQkJCQlkYi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAocmRlczAgJiAyKQorCQkJCQlkYi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCWlmIChyZGVzMCAmIDB4ODApCisJCQkJCWRiLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQl9CisKKwkJCWlmICggIShyZGVzMCAmIDB4ODAwMCkgfHwKKwkJCQkoKGRiLT5jcjZfZGF0YSAmIENSNl9QTSkgJiYgKHJ4bGVuPjYpKSApIHsKKwkJCQlza2IgPSByeHB0ci0+cnhfc2tiX3B0cjsKKworCQkJCS8qIFJlY2VpdmVkIFBhY2tldCBDUkMgY2hlY2sgbmVlZCBvciBub3QgKi8KKwkJCQlpZiAoIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMSkgJiYKKwkJCQkJKGNhbF9DUkMoc2tiLT50YWlsLCByeGxlbiwgMSkgIT0KKwkJCQkJKCoodTMyICopIChza2ItPnRhaWwrcnhsZW4pICkpKSB7IC8qIEZJWE1FICg/KSAqLworCQkJCQkvKiBGb3VuZCBhIGVycm9yIHJlY2VpdmVkIHBhY2tldCAqLworCQkJCQlkbWZlX3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOworCQkJCQlkYi0+ZG05MTB4X2Noa19tb2RlID0gMzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBHb29kIHBhY2tldCwgc2VuZCB0byB1cHBlciBsYXllciAqLworCQkJCQkvKiBTaG9yc3QgcGFja2V0IHVzZWQgbmV3IFNLQiAqLworCQkJCQlpZiAoIChyeGxlbiA8IFJYX0NPUFlfU0laRSkgJiYKKwkJCQkJCSggKHNrYiA9IGRldl9hbGxvY19za2IocnhsZW4gKyAyKSApCisJCQkJCQkhPSBOVUxMKSApIHsKKwkJCQkJCS8qIHNpemUgbGVzcyB0aGFuIENPUFlfU0laRSwgYWxsb2NhdGUgYSByeGxlbiBTS0IgKi8KKwkJCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogMTZieXRlIGFsaWduICovCisJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHJ4bGVuKSwgcnhwdHItPnJ4X3NrYl9wdHItPnRhaWwsIHJ4bGVuKTsKKwkJCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9wdXQoc2tiLCByeGxlbik7CisJCQkJCX0KKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJZGItPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJZGItPnN0YXRzLnJ4X2J5dGVzICs9IHJ4bGVuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogUmV1c2UgU0tCIGJ1ZmZlciB3aGVuIHRoZSBwYWNrZXQgaXMgZXJyb3IgKi8KKwkJCQlETUZFX0RCVUcoMCwgIlJldXNlIFNLIGJ1ZmZlciwgcmRlczAiLCByZGVzMCk7CisJCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKKwkJCX0KKwkJfQorCisJCXJ4cHRyID0gcnhwdHItPm5leHRfcnhfZGVzYzsKKwl9CisKKwlkYi0+cnhfcmVhZHlfcHRyID0gcnhwdHI7Cit9CisKKworLyoKKyAqCUdldCBzdGF0aXN0aWNzIGZyb20gZHJpdmVyLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGRtZmVfZ2V0X3N0YXRzKHN0cnVjdCBERVZJQ0UgKmRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfZ2V0X3N0YXRzIiwgMCk7CisJcmV0dXJuICZkYi0+c3RhdHM7Cit9CisKKworLyoKKyAqIFNldCBETTkxMFggbXVsdGljYXN0IGFkZHJlc3MKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3NldF9maWx0ZXJfbW9kZShzdHJ1Y3QgREVWSUNFICogZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3NldF9maWx0ZXJfbW9kZSgpIiwgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCURNRkVfREJVRygwLCAiRW5hYmxlIFBST00gTW9kZSIsIDApOworCQlkYi0+Y3I2X2RhdGEgfD0gQ1I2X1BNIHwgQ1I2X1BCRjsKKwkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19jb3VudCA+IERNRkVfTUFYX01VTFRJQ0FTVCkgeworCQlETUZFX0RCVUcoMCwgIlBhc3MgYWxsIG11bHRpY2FzdCBhZGRyZXNzIiwgZGV2LT5tY19jb3VudCk7CisJCWRiLT5jcjZfZGF0YSAmPSB+KENSNl9QTSB8IENSNl9QQkYpOworCQlkYi0+Y3I2X2RhdGEgfD0gQ1I2X1BBTTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCURNRkVfREJVRygwLCAiU2V0IG11bHRpY2FzdCBhZGRyZXNzIiwgZGV2LT5tY19jb3VudCk7CisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCisJCWRtOTEzMl9pZF90YWJsZShkZXYsIGRldi0+bWNfY291bnQpOwkvKiBETTkxMzIgKi8KKwllbHNlCisJCXNlbmRfZmlsdGVyX2ZyYW1lKGRldiwgZGV2LT5tY19jb3VudCk7IAkvKiBETTkxMDIvRE05MTAyQSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaWYgKG5wLT5wZGV2KQorCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wZGV2KSk7CisJZWxzZQorCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiRUlTQSAweCVseCAlZCIsCisJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyoKKyAqCUEgcGVyaW9kaWMgdGltZXIgcm91dGluZQorICoJRHluYW1pYyBtZWRpYSBzZW5zZSwgYWxsb2NhdGUgUnggYnVmZmVyLi4uCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTMyIHRtcF9jcjg7CisJdW5zaWduZWQgY2hhciB0bXBfY3IxMjsKKwlzdHJ1Y3QgREVWSUNFICpkZXYgPSAoc3RydWN0IERFVklDRSAqKSBkYXRhOworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURNRkVfREJVRygwLCAiZG1mZV90aW1lcigpIiwgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwkvKiBNZWRpYSBtb2RlIHByb2Nlc3Mgd2hlbiBMaW5rIE9LIGJlZm9yZSBlbnRlciB0aGlzIHJvdXRlICovCisJaWYgKGRiLT5maXJzdF9pbl9jYWxsYmFjayA9PSAwKSB7CisJCWRiLT5maXJzdF9pbl9jYWxsYmFjayA9IDE7CisJCWlmIChkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZD09UENJX0RNOTEwMl9JRCkpIHsKKwkJCWRiLT5jcjZfZGF0YSAmPSB+MHg0MDAwMDsKKwkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4MTAwMCwgZGItPmNoaXBfaWQpOworCQkJZGItPmNyNl9kYXRhIHw9IDB4NDAwMDA7CisJCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisJCQlkYi0+dGltZXIuZXhwaXJlcyA9IERNRkVfVElNRVJfV1VUICsgSFogKiAyOworCQkJYWRkX3RpbWVyKCZkYi0+dGltZXIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCisJLyogT3BlcmF0aW5nIE1vZGUgQ2hlY2sgKi8KKwlpZiAoIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMHgxKSAmJgorCQkoZGItPnN0YXRzLnJ4X3BhY2tldHMgPiBNQVhfQ0hFQ0tfUEFDS0VUKSApCisJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAweDQ7CisKKwkvKiBEeW5hbWljIHJlc2V0IERNOTEwWCA6IHN5c3RlbSBlcnJvciBvciB0cmFuc21pdCB0aW1lLW91dCAqLworCXRtcF9jcjggPSBpbmwoZGItPmlvYWRkciArIERDUjgpOworCWlmICggKGRiLT5pbnRlcnZhbF9yeF9jbnQ9PTApICYmICh0bXBfY3I4KSApIHsKKwkJZGItPnJlc2V0X2NyOCsrOworCQlkYi0+d2FpdF9yZXNldCA9IDE7CisJfQorCWRiLT5pbnRlcnZhbF9yeF9jbnQgPSAwOworCisJLyogVFggcG9sbGluZyBraWNrIG1vbml0b3IgKi8KKwlpZiAoIGRiLT50eF9wYWNrZXRfY250ICYmCisJICAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyBETUZFX1RYX0tJQ0spICkgeworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsgICAvKiBUeCBwb2xsaW5nIGFnYWluICovCisKKwkJLyogVFggVGltZW91dCAqLworCQlpZiAoIHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2LT50cmFuc19zdGFydCArIERNRkVfVFhfVElNRU9VVCkgKSB7CisJCQlkYi0+cmVzZXRfVFh0aW1lb3V0Kys7CisJCQlkYi0+d2FpdF9yZXNldCA9IDE7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHggdGltZW91dCAtIHJlc2V0dGluZ1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl9CisJfQorCisJaWYgKGRiLT53YWl0X3Jlc2V0KSB7CisJCURNRkVfREJVRygwLCAiRHluYW1pYyBSZXNldCBkZXZpY2UiLCBkYi0+dHhfcGFja2V0X2NudCk7CisJCWRiLT5yZXNldF9jb3VudCsrOworCQlkbWZlX2R5bmFtaWNfcmVzZXQoZGV2KTsKKwkJZGItPmZpcnN0X2luX2NhbGxiYWNrID0gMDsKKwkJZGItPnRpbWVyLmV4cGlyZXMgPSBETUZFX1RJTUVSX1dVVDsKKwkJYWRkX3RpbWVyKCZkYi0+dGltZXIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogTGluayBzdGF0dXMgY2hlY2ssIER5bmFtaWMgbWVkaWEgdHlwZSBjaGFuZ2UgKi8KKwlpZiAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkKKwkJdG1wX2NyMTIgPSBpbmIoZGItPmlvYWRkciArIERDUjkgKyAzKTsJLyogRE05MTMyICovCisJZWxzZQorCQl0bXBfY3IxMiA9IGluYihkYi0+aW9hZGRyICsgRENSMTIpOwkvKiBETTkxMDIvRE05MTAyQSAqLworCisJaWYgKCAoKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMDJfSUQpICYmCisJCShkYi0+Y2hpcF9yZXZpc2lvbiA9PSAweDAyMDAwMDMwKSkgfHwKKwkJKChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKSAmJgorCQkoZGItPmNoaXBfcmV2aXNpb24gPT0gMHgwMjAwMDAxMCkpICkgeworCQkvKiBETTkxMDJBIENoaXAgKi8KKwkJaWYgKHRtcF9jcjEyICYgMikKKwkJCXRtcF9jcjEyID0gMHgwOwkJLyogTGluayBmYWlsZWQgKi8KKwkJZWxzZQorCQkJdG1wX2NyMTIgPSAweDM7CS8qIExpbmsgT0sgKi8KKwl9CisKKwlpZiAoICEodG1wX2NyMTIgJiAweDMpICYmICFkYi0+bGlua19mYWlsZWQgKSB7CisJCS8qIExpbmsgRmFpbGVkICovCisJCURNRkVfREJVRygwLCAiTGluayBGYWlsZWQiLCB0bXBfY3IxMik7CisJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisKKwkJLyogRm9yIEZvcmNlIDEwLzEwME0gSGFsZi9GdWxsIG1vZGU6IEVuYWJsZSBBdXRvLU5lZ28gbW9kZSAqLworCQkvKiBBVVRPIG9yIGZvcmNlIDFNIEhvbWVydW4vTG9uZ3J1biBkb24ndCBuZWVkICovCisJCWlmICggIShkYi0+bWVkaWFfbW9kZSAmIDB4MzgpICkKKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4MTAwMCwgZGItPmNoaXBfaWQpOworCisJCS8qIEFVVE8gbW9kZSwgaWYgSU5UIHBoeXhjZXIgbGluayBmYWlsZWQsIHNlbGVjdCBFWFQgZGV2aWNlICovCisJCWlmIChkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykgeworCQkJLyogMTAvMTAwTSBsaW5rIGZhaWxlZCwgdXNlZCAxTSBIb21lLU5ldCAqLworCQkJZGItPmNyNl9kYXRhfD0weDAwMDQwMDAwOwkvKiBiaXQxOD0xLCBNSUkgKi8KKwkJCWRiLT5jcjZfZGF0YSY9fjB4MDAwMDAyMDA7CS8qIGJpdDk9MCwgSEQgbW9kZSAqLworCQkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQl9CisJfSBlbHNlCisJCWlmICgodG1wX2NyMTIgJiAweDMpICYmIGRiLT5saW5rX2ZhaWxlZCkgeworCQkJRE1GRV9EQlVHKDAsICJMaW5rIGxpbmsgT0siLCB0bXBfY3IxMik7CisJCQlkYi0+bGlua19mYWlsZWQgPSAwOworCisJCQkvKiBBdXRvIFNlbnNlIFNwZWVkICovCisJCQlpZiAoIChkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykgJiYKKwkJCQlkbWZlX3NlbnNlX3NwZWVkKGRiKSApCisJCQkJZGItPmxpbmtfZmFpbGVkID0gMTsKKwkJCWRtZmVfcHJvY2Vzc19tb2RlKGRiKTsKKwkJCS8qIFNIT1dfTUVESUFfVFlQRShkYi0+b3BfbW9kZSk7ICovCisJCX0KKworCS8qIEhQTkEgcmVtb3RlIGNvbW1hbmQgY2hlY2sgKi8KKwlpZiAoZGItPkhQTkFfY29tbWFuZCAmIDB4ZjAwKSB7CisJCWRiLT5IUE5BX3RpbWVyLS07CisJCWlmICghZGItPkhQTkFfdGltZXIpCisJCQlkbWZlX0hQTkFfcmVtb3RlX2NtZF9jaGsoZGIpOworCX0KKworCS8qIFRpbWVyIGFjdGl2ZSBhZ2FpbiAqLworCWRiLT50aW1lci5leHBpcmVzID0gRE1GRV9USU1FUl9XVVQ7CisJYWRkX3RpbWVyKCZkYi0+dGltZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqCUR5bmFtaWMgcmVzZXQgdGhlIERNOTEwWCBib2FyZAorICoJU3RvcCBETTkxMFggYm9hcmQKKyAqCUZyZWUgVHgvUnggYWxsb2NhdGVkIG1lbW9yeQorICoJUmVzZXQgRE05MTBYIGJvYXJkCisgKglSZS1pbml0aWxpemUgRE05MTBYIGJvYXJkCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9keW5hbWljX3Jlc2V0KHN0cnVjdCBERVZJQ0UgKmRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfZHluYW1pY19yZXNldCgpIiwgMCk7CisKKwkvKiBTb3B0IE1BQyBjb250cm9sbGVyICovCisJZGItPmNyNl9kYXRhICY9IH4oQ1I2X1JYU0MgfCBDUjZfVFhTQyk7CS8qIERpc2FibGUgVHgvUnggKi8KKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGV2LT5iYXNlX2FkZHIpOworCW91dGwoMCwgZGV2LT5iYXNlX2FkZHIgKyBEQ1I3KTsJCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJb3V0bChpbmwoZGV2LT5iYXNlX2FkZHIgKyBEQ1I1KSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1I1KTsKKworCS8qIERpc2FibGUgdXBwZXIgbGF5ZXIgaW50ZXJmYWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogRnJlZSBSeCBBbGxvY2F0ZSBidWZmZXIgKi8KKwlkbWZlX2ZyZWVfcnhidWZmZXIoZGIpOworCisJLyogc3lzdGVtIHZhcmlhYmxlIGluaXQgKi8KKwlkYi0+dHhfcGFja2V0X2NudCA9IDA7CisJZGItPnR4X3F1ZXVlX2NudCA9IDA7CisJZGItPnJ4X2F2YWlsX2NudCA9IDA7CisJZGItPmxpbmtfZmFpbGVkID0gMTsKKwlkYi0+d2FpdF9yZXNldCA9IDA7CisKKwkvKiBSZS1pbml0aWxpemUgRE05MTBYIGJvYXJkICovCisJZG1mZV9pbml0X2RtOTEweChkZXYpOworCisJLyogUmVzdGFydCB1cHBlciBsYXllciBpbnRlcmZhY2UgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoKKyAqCWZyZWUgYWxsIGFsbG9jYXRlZCByeCBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfcnhidWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCURNRkVfREJVRygwLCAiZG1mZV9mcmVlX3J4YnVmZmVyKCkiLCAwKTsKKworCS8qIGZyZWUgYWxsb2NhdGVkIHJ4IGJ1ZmZlciAqLworCXdoaWxlIChkYi0+cnhfYXZhaWxfY250KSB7CisJCWRldl9rZnJlZV9za2IoZGItPnJ4X3JlYWR5X3B0ci0+cnhfc2tiX3B0cik7CisJCWRiLT5yeF9yZWFkeV9wdHIgPSBkYi0+cnhfcmVhZHlfcHRyLT5uZXh0X3J4X2Rlc2M7CisJCWRiLT5yeF9hdmFpbF9jbnQtLTsKKwl9Cit9CisKKworLyoKKyAqCVJldXNlIHRoZSBTSyBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3JldXNlX3NrYihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiwgc3RydWN0IHNrX2J1ZmYgKiBza2IpCit7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4cHRyID0gZGItPnJ4X2luc2VydF9wdHI7CisKKwlpZiAoIShyeHB0ci0+cmRlczAgJiBjcHVfdG9fbGUzMigweDgwMDAwMDAwKSkpIHsKKwkJcnhwdHItPnJ4X3NrYl9wdHIgPSBza2I7CisJCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT50YWlsLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CisJCXdtYigpOworCQlyeHB0ci0+cmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKwkJZGItPnJ4X2F2YWlsX2NudCsrOworCQlkYi0+cnhfaW5zZXJ0X3B0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CisJfSBlbHNlCisJCURNRkVfREJVRygwLCAiU0sgQnVmZmVyIHJldXNlIG1ldGhvZCBlcnJvciIsIGRiLT5yeF9hdmFpbF9jbnQpOworfQorCisKKy8qCisgKglJbml0aWFsaXplIHRyYW5zbWl0L1JlY2VpdmUgZGVzY3JpcHRvcgorICoJVXNpbmcgQ2hhaW4gc3RydWN0dXJlLCBhbmQgYWxsb2NhdGUgVHgvUnggYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9kZXNjcmlwdG9yX2luaXQoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIsIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXN0cnVjdCB0eF9kZXNjICp0bXBfdHg7CisJc3RydWN0IHJ4X2Rlc2MgKnRtcF9yeDsKKwl1bnNpZ25lZCBjaGFyICp0bXBfYnVmOworCWRtYV9hZGRyX3QgdG1wX3R4X2RtYSwgdG1wX3J4X2RtYTsKKwlkbWFfYWRkcl90IHRtcF9idWZfZG1hOworCWludCBpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2Rlc2NyaXB0b3JfaW5pdCgpIiwgMCk7CisKKwkvKiB0eCBkZXNjcmlwdG9yIHN0YXJ0IHBvaW50ZXIgKi8KKwlkYi0+dHhfaW5zZXJ0X3B0ciA9IGRiLT5maXJzdF90eF9kZXNjOworCWRiLT50eF9yZW1vdmVfcHRyID0gZGItPmZpcnN0X3R4X2Rlc2M7CisJb3V0bChkYi0+Zmlyc3RfdHhfZGVzY19kbWEsIGlvYWRkciArIERDUjQpOyAgICAgLyogVFggREVTQyBhZGRyZXNzICovCisKKwkvKiByeCBkZXNjcmlwdG9yIHN0YXJ0IHBvaW50ZXIgKi8KKwlkYi0+Zmlyc3RfcnhfZGVzYyA9ICh2b2lkICopZGItPmZpcnN0X3R4X2Rlc2MgKyBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogVFhfREVTQ19DTlQ7CisJZGItPmZpcnN0X3J4X2Rlc2NfZG1hID0gIGRiLT5maXJzdF90eF9kZXNjX2RtYSArIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBUWF9ERVNDX0NOVDsKKwlkYi0+cnhfaW5zZXJ0X3B0ciA9IGRiLT5maXJzdF9yeF9kZXNjOworCWRiLT5yeF9yZWFkeV9wdHIgPSBkYi0+Zmlyc3RfcnhfZGVzYzsKKwlvdXRsKGRiLT5maXJzdF9yeF9kZXNjX2RtYSwgaW9hZGRyICsgRENSMyk7CS8qIFJYIERFU0MgYWRkcmVzcyAqLworCisJLyogSW5pdCBUcmFuc21pdCBjaGFpbiAqLworCXRtcF9idWYgPSBkYi0+YnVmX3Bvb2xfc3RhcnQ7CisJdG1wX2J1Zl9kbWEgPSBkYi0+YnVmX3Bvb2xfZG1hX3N0YXJ0OworCXRtcF90eF9kbWEgPSBkYi0+Zmlyc3RfdHhfZGVzY19kbWE7CisJZm9yICh0bXBfdHggPSBkYi0+Zmlyc3RfdHhfZGVzYywgaSA9IDA7IGkgPCBUWF9ERVNDX0NOVDsgaSsrLCB0bXBfdHgrKykgeworCQl0bXBfdHgtPnR4X2J1Zl9wdHIgPSB0bXBfYnVmOworCQl0bXBfdHgtPnRkZXMwID0gY3B1X3RvX2xlMzIoMCk7CisJCXRtcF90eC0+dGRlczEgPSBjcHVfdG9fbGUzMigweDgxMDAwMDAwKTsJLyogSUMsIGNoYWluICovCisJCXRtcF90eC0+dGRlczIgPSBjcHVfdG9fbGUzMih0bXBfYnVmX2RtYSk7CisJCXRtcF90eF9kbWEgKz0gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKwkJdG1wX3R4LT50ZGVzMyA9IGNwdV90b19sZTMyKHRtcF90eF9kbWEpOworCQl0bXBfdHgtPm5leHRfdHhfZGVzYyA9IHRtcF90eCArIDE7CisJCXRtcF9idWYgPSB0bXBfYnVmICsgVFhfQlVGX0FMTE9DOworCQl0bXBfYnVmX2RtYSA9IHRtcF9idWZfZG1hICsgVFhfQlVGX0FMTE9DOworCX0KKwkoLS10bXBfdHgpLT50ZGVzMyA9IGNwdV90b19sZTMyKGRiLT5maXJzdF90eF9kZXNjX2RtYSk7CisJdG1wX3R4LT5uZXh0X3R4X2Rlc2MgPSBkYi0+Zmlyc3RfdHhfZGVzYzsKKworCSAvKiBJbml0IFJlY2VpdmUgZGVzY3JpcHRvciBjaGFpbiAqLworCXRtcF9yeF9kbWE9ZGItPmZpcnN0X3J4X2Rlc2NfZG1hOworCWZvciAodG1wX3J4ID0gZGItPmZpcnN0X3J4X2Rlc2MsIGkgPSAwOyBpIDwgUlhfREVTQ19DTlQ7IGkrKywgdG1wX3J4KyspIHsKKwkJdG1wX3J4LT5yZGVzMCA9IGNwdV90b19sZTMyKDApOworCQl0bXBfcngtPnJkZXMxID0gY3B1X3RvX2xlMzIoMHgwMTAwMDYwMCk7CisJCXRtcF9yeF9kbWEgKz0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwkJdG1wX3J4LT5yZGVzMyA9IGNwdV90b19sZTMyKHRtcF9yeF9kbWEpOworCQl0bXBfcngtPm5leHRfcnhfZGVzYyA9IHRtcF9yeCArIDE7CisJfQorCSgtLXRtcF9yeCktPnJkZXMzID0gY3B1X3RvX2xlMzIoZGItPmZpcnN0X3J4X2Rlc2NfZG1hKTsKKwl0bXBfcngtPm5leHRfcnhfZGVzYyA9IGRiLT5maXJzdF9yeF9kZXNjOworCisJLyogcHJlLWFsbG9jYXRlIFJ4IGJ1ZmZlciAqLworCWFsbG9jYXRlX3J4X2J1ZmZlcihkYik7Cit9CisKKworLyoKKyAqCVVwZGF0ZSBDUjYgdmFsdWUKKyAqCUZpcnN0bHkgc3RvcCBETTkxMFggLCB0aGVuIHdyaXR0ZW4gdmFsdWUgYW5kIHN0YXJ0CisgKi8KKworc3RhdGljIHZvaWQgdXBkYXRlX2NyNih1MzIgY3I2X2RhdGEsIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiBjcjZfdG1wOworCisJY3I2X3RtcCA9IGNyNl9kYXRhICYgfjB4MjAwMjsgICAgICAgICAgIC8qIHN0b3AgVHgvUnggKi8KKwlvdXRsKGNyNl90bXAsIGlvYWRkciArIERDUjYpOworCXVkZWxheSg1KTsKKwlvdXRsKGNyNl9kYXRhLCBpb2FkZHIgKyBEQ1I2KTsKKwl1ZGVsYXkoNSk7Cit9CisKKworLyoKKyAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTMyCisgKglUaGlzIHNldHVwIGZyYW1lIGluaXRpbGl6ZSBETTkxMFggYWRkcmVzcyBmaWx0ZXIgbW9kZQorKi8KKworc3RhdGljIHZvaWQgZG05MTMyX2lkX3RhYmxlKHN0cnVjdCBERVZJQ0UgKmRldiwgaW50IG1jX2NudCkKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jcHRyOworCXUxNiAqIGFkZHJwdHI7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcisweGMwOwkJLyogSUQgVGFibGUgKi8KKwl1MzIgaGFzaF92YWw7CisJdTE2IGksIGhhc2hfdGFibGVbNF07CisKKwlETUZFX0RCVUcoMCwgImRtOTEzMl9pZF90YWJsZSgpIiwgMCk7CisKKwkvKiBOb2RlIGFkZHJlc3MgKi8KKwlhZGRycHRyID0gKHUxNiAqKSBkZXYtPmRldl9hZGRyOworCW91dHcoYWRkcnB0clswXSwgaW9hZGRyKTsKKwlpb2FkZHIgKz0gNDsKKwlvdXR3KGFkZHJwdHJbMV0sIGlvYWRkcik7CisJaW9hZGRyICs9IDQ7CisJb3V0dyhhZGRycHRyWzJdLCBpb2FkZHIpOworCWlvYWRkciArPSA0OworCisJLyogQ2xlYXIgSGFzaCBUYWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWhhc2hfdGFibGVbaV0gPSAweDA7CisKKwkvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCWhhc2hfdGFibGVbM10gPSAweDgwMDA7CisKKwkvKiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgaW4gSGFzaCBUYWJsZSA6IDY0IGJpdHMgKi8KKwlmb3IgKG1jcHRyID0gZGV2LT5tY19saXN0LCBpID0gMDsgaSA8IG1jX2NudDsgaSsrLCBtY3B0ciA9IG1jcHRyLT5uZXh0KSB7CisJCWhhc2hfdmFsID0gY2FsX0NSQyggKGNoYXIgKikgbWNwdHItPmRtaV9hZGRyLCA2LCAwKSAmIDB4M2Y7CisJCWhhc2hfdGFibGVbaGFzaF92YWwgLyAxNl0gfD0gKHUxNikgMSA8PCAoaGFzaF92YWwgJSAxNik7CisJfQorCisJLyogV3JpdGUgdGhlIGhhc2ggdGFibGUgdG8gTUFDIE1EIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgaW9hZGRyICs9IDQpCisJCW91dHcoaGFzaF90YWJsZVtpXSwgaW9hZGRyKTsKK30KKworCisvKgorICoJU2VuZCBhIHNldHVwIGZyYW1lIGZvciBETTkxMDIvRE05MTAyQQorICoJVGhpcyBzZXR1cCBmcmFtZSBpbml0aWxpemUgRE05MTBYIGFkZHJlc3MgZmlsdGVyIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgREVWSUNFICpkZXYsIGludCBtY19jbnQpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNwdHI7CisJc3RydWN0IHR4X2Rlc2MgKnR4cHRyOworCXUxNiAqIGFkZHJwdHI7CisJdTMyICogc3VwdHI7CisJaW50IGk7CisKKwlETUZFX0RCVUcoMCwgInNlbmRfZmlsdGVyX2ZyYW1lKCkiLCAwKTsKKworCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7CisJc3VwdHIgPSAodTMyICopIHR4cHRyLT50eF9idWZfcHRyOworCisJLyogTm9kZSBhZGRyZXNzICovCisJYWRkcnB0ciA9ICh1MTYgKikgZGV2LT5kZXZfYWRkcjsKKwkqc3VwdHIrKyA9IGFkZHJwdHJbMF07CisJKnN1cHRyKysgPSBhZGRycHRyWzFdOworCSpzdXB0cisrID0gYWRkcnB0clsyXTsKKworCS8qIGJyb2FkY2FzdCBhZGRyZXNzICovCisJKnN1cHRyKysgPSAweGZmZmY7CisJKnN1cHRyKysgPSAweGZmZmY7CisJKnN1cHRyKysgPSAweGZmZmY7CisKKwkvKiBmaXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzICovCisJZm9yIChtY3B0ciA9IGRldi0+bWNfbGlzdCwgaSA9IDA7IGkgPCBtY19jbnQ7IGkrKywgbWNwdHIgPSBtY3B0ci0+bmV4dCkgeworCQlhZGRycHRyID0gKHUxNiAqKSBtY3B0ci0+ZG1pX2FkZHI7CisJCSpzdXB0cisrID0gYWRkcnB0clswXTsKKwkJKnN1cHRyKysgPSBhZGRycHRyWzFdOworCQkqc3VwdHIrKyA9IGFkZHJwdHJbMl07CisJfQorCisJZm9yICg7IGk8MTQ7IGkrKykgeworCQkqc3VwdHIrKyA9IDB4ZmZmZjsKKwkJKnN1cHRyKysgPSAweGZmZmY7CisJCSpzdXB0cisrID0gMHhmZmZmOworCX0KKworCS8qIHByZXBhcmUgdGhlIHNldHVwIGZyYW1lICovCisJZGItPnR4X2luc2VydF9wdHIgPSB0eHB0ci0+bmV4dF90eF9kZXNjOworCXR4cHRyLT50ZGVzMSA9IGNwdV90b19sZTMyKDB4ODkwMDAwYzApOworCisJLyogUmVzb3VyY2UgQ2hlY2sgYW5kIFNlbmQgdGhlIHNldHVwIHBhY2tldCAqLworCWlmICghZGItPnR4X3BhY2tldF9jbnQpIHsKKwkJLyogUmVzb3VyY2UgRW1wdHkgKi8KKwkJZGItPnR4X3BhY2tldF9jbnQrKzsKKwkJdHhwdHItPnRkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhIHwgMHgyMDAwLCBkZXYtPmJhc2VfYWRkcik7CisJCW91dGwoMHgxLCBkZXYtPmJhc2VfYWRkciArIERDUjEpOwkvKiBJc3N1ZSBUeCBwb2xsaW5nICovCisJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkZXYtPmJhc2VfYWRkcik7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0gZWxzZQorCQlkYi0+dHhfcXVldWVfY250Kys7CS8qIFB1dCBpbiBUWCBxdWV1ZSAqLworfQorCisKKy8qCisgKglBbGxvY2F0ZSByeCBidWZmZXIsCisgKglBcyBwb3NzaWJsZSBhcyBhbGxvY2F0ZSBtYXhpdW1uIFJ4IGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX3J4X2J1ZmZlcihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYikKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhwdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXJ4cHRyID0gZGItPnJ4X2luc2VydF9wdHI7CisKKwl3aGlsZShkYi0+cnhfYXZhaWxfY250IDwgUlhfREVTQ19DTlQpIHsKKwkJaWYgKCAoIHNrYiA9IGRldl9hbGxvY19za2IoUlhfQUxMT0NfU0laRSkgKSA9PSBOVUxMICkKKwkJCWJyZWFrOworCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsgLyogRklYTUUgKD8pICovCisJCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT50YWlsLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CisJCXdtYigpOworCQlyeHB0ci0+cmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKwkJcnhwdHIgPSByeHB0ci0+bmV4dF9yeF9kZXNjOworCQlkYi0+cnhfYXZhaWxfY250Kys7CisJfQorCisJZGItPnJ4X2luc2VydF9wdHIgPSByeHB0cjsKK30KKworCisvKgorICoJUmVhZCBvbmUgd29yZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBST00KKyAqLworCitzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcgaW9hZGRyLCBpbnQgb2Zmc2V0KQoreworCWludCBpOworCXUxNiBzcm9tX2RhdGEgPSAwOworCWxvbmcgY3I5X2lvYWRkciA9IGlvYWRkciArIERDUjk7CisKKwlvdXRsKENSOV9TUk9NX1JFQUQsIGNyOV9pb2FkZHIpOworCW91dGwoQ1I5X1NST01fUkVBRCB8IENSOV9TUkNTLCBjcjlfaW9hZGRyKTsKKworCS8qIFNlbmQgdGhlIFJlYWQgQ29tbWFuZCAxMTBiICovCisJU1JPTV9DTEtfV1JJVEUoU1JPTV9EQVRBXzEsIGNyOV9pb2FkZHIpOworCVNST01fQ0xLX1dSSVRFKFNST01fREFUQV8xLCBjcjlfaW9hZGRyKTsKKwlTUk9NX0NMS19XUklURShTUk9NX0RBVEFfMCwgY3I5X2lvYWRkcik7CisKKwkvKiBTZW5kIHRoZSBvZmZzZXQgKi8KKwlmb3IgKGkgPSA1OyBpID49IDA7IGktLSkgeworCQlzcm9tX2RhdGEgPSAob2Zmc2V0ICYgKDEgPDwgaSkpID8gU1JPTV9EQVRBXzEgOiBTUk9NX0RBVEFfMDsKKwkJU1JPTV9DTEtfV1JJVEUoc3JvbV9kYXRhLCBjcjlfaW9hZGRyKTsKKwl9CisKKwlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUywgY3I5X2lvYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUyB8IENSOV9TUkNMSywgY3I5X2lvYWRkcik7CisJCXVkZWxheSg1KTsKKwkJc3JvbV9kYXRhID0gKHNyb21fZGF0YSA8PCAxKSB8ICgoaW5sKGNyOV9pb2FkZHIpICYgQ1I5X0NSRE9VVCkgPyAxIDogMCk7CisJCW91dGwoQ1I5X1NST01fUkVBRCB8IENSOV9TUkNTLCBjcjlfaW9hZGRyKTsKKwkJdWRlbGF5KDUpOworCX0KKworCW91dGwoQ1I5X1NST01fUkVBRCwgY3I5X2lvYWRkcik7CisJcmV0dXJuIHNyb21fZGF0YTsKK30KKworCisvKgorICoJQXV0byBzZW5zZSB0aGUgbWVkaWEgbW9kZQorICovCisKK3N0YXRpYyB1OCBkbWZlX3NlbnNlX3NwZWVkKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwl1OCBFcnJGbGFnID0gMDsKKwl1MTYgcGh5X21vZGU7CisKKwkvKiBDUjYgYml0MTg9MCwgc2VsZWN0IDEwLzEwME0gKi8KKwl1cGRhdGVfY3I2KCAoZGItPmNyNl9kYXRhICYgfjB4NDAwMDApLCBkYi0+aW9hZGRyKTsKKworCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxLCBkYi0+Y2hpcF9pZCk7CisJcGh5X21vZGUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDEsIGRiLT5jaGlwX2lkKTsKKworCWlmICggKHBoeV9tb2RlICYgMHgyNCkgPT0gMHgyNCApIHsKKwkJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCS8qIERNOTEzMiAqLworCQkJcGh5X21vZGUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDcsIGRiLT5jaGlwX2lkKSAmIDB4ZjAwMDsKKwkJZWxzZSAJCQkJLyogRE05MTAyL0RNOTEwMkEgKi8KKwkJCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpICYgMHhmMDAwOworCQkvKiBwcmludGsoRFJWX05BTUUgIjogUGh5X21vZGUgJXggIixwaHlfbW9kZSk7ICovCisJCXN3aXRjaCAocGh5X21vZGUpIHsKKwkJY2FzZSAweDEwMDA6IGRiLT5vcF9tb2RlID0gRE1GRV8xME1IRjsgYnJlYWs7CisJCWNhc2UgMHgyMDAwOiBkYi0+b3BfbW9kZSA9IERNRkVfMTBNRkQ7IGJyZWFrOworCQljYXNlIDB4NDAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwME1IRjsgYnJlYWs7CisJCWNhc2UgMHg4MDAwOiBkYi0+b3BfbW9kZSA9IERNRkVfMTAwTUZEOyBicmVhazsKKwkJZGVmYXVsdDogZGItPm9wX21vZGUgPSBETUZFXzEwTUhGOworCQkJRXJyRmxhZyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWRiLT5vcF9tb2RlID0gRE1GRV8xME1IRjsKKwkJRE1GRV9EQlVHKDAsICJMaW5rIEZhaWxlZCA6IiwgcGh5X21vZGUpOworCQlFcnJGbGFnID0gMTsKKwl9CisKKwlyZXR1cm4gRXJyRmxhZzsKK30KKworCisvKgorICoJU2V0IDEwLzEwMCBwaHl4Y2VyIGNhcGFiaWxpdHkKKyAqCUFVVE8gbW9kZSA6IHBoeXhjZXIgcmVnaXN0ZXI0IGlzIE5JQyBjYXBhYmlsaXR5CisgKglGb3JjZSBtb2RlOiBwaHl4Y2VyIHJlZ2lzdGVyNCBpcyB0aGUgZm9yY2UgbWVkaWEKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3NldF9waHl4Y2VyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiKQoreworCXUxNiBwaHlfcmVnOworCisJLyogU2VsZWN0IDEwLzEwME0gcGh5eGNlciAqLworCWRiLT5jcjZfZGF0YSAmPSB+MHg0MDAwMDsKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisKKwkvKiBETTkwMDkgQ2hpcDogUGh5eGNlciByZWcxOCBiaXQxMj0wICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkwMDlfSUQpIHsKKwkJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTgsIGRiLT5jaGlwX2lkKSAmIH4weDEwMDA7CisJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE4LCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisJfQorCisJLyogUGh5eGNlciBjYXBhYmlsaXR5IHNldHRpbmcgKi8KKwlwaHlfcmVnID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCA0LCBkYi0+Y2hpcF9pZCkgJiB+MHgwMWUwOworCisJaWYgKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSB7CisJCS8qIEFVVE8gTW9kZSAqLworCQlwaHlfcmVnIHw9IGRiLT5QSFlfcmVnNDsKKwl9IGVsc2UgeworCQkvKiBGb3JjZSBNb2RlICovCisJCXN3aXRjaChkYi0+bWVkaWFfbW9kZSkgeworCQljYXNlIERNRkVfMTBNSEY6IHBoeV9yZWcgfD0gMHgyMDsgYnJlYWs7CisJCWNhc2UgRE1GRV8xME1GRDogcGh5X3JlZyB8PSAweDQwOyBicmVhazsKKwkJY2FzZSBETUZFXzEwME1IRjogcGh5X3JlZyB8PSAweDgwOyBicmVhazsKKwkJY2FzZSBETUZFXzEwME1GRDogcGh5X3JlZyB8PSAweDEwMDsgYnJlYWs7CisJCX0KKwkJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkwMDlfSUQpIHBoeV9yZWcgJj0gMHg2MTsKKwl9CisKKyAgCS8qIFdyaXRlIG5ldyBjYXBhYmlsaXR5IHRvIFBoeXhjZXIgUmVnNCAqLworCWlmICggIShwaHlfcmVnICYgMHgwMWUwKSkgeworCQlwaHlfcmVnfD1kYi0+UEhZX3JlZzQ7CisJCWRiLT5tZWRpYV9tb2RlfD1ETUZFX0FVVE87CisJfQorCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDQsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKworIAkvKiBSZXN0YXJ0IEF1dG8tTmVnb3RpYXRpb24gKi8KKwlpZiAoIGRiLT5jaGlwX3R5cGUgJiYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMDJfSUQpICkKKwkJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMCwgMHgxODAwLCBkYi0+Y2hpcF9pZCk7CisJaWYgKCAhZGItPmNoaXBfdHlwZSApCisJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4MTIwMCwgZGItPmNoaXBfaWQpOworfQorCisKKy8qCisgKglQcm9jZXNzIG9wLW1vZGUKKyAqCUFVVE8gbW9kZSA6IFBIWSBjb250cm9sbGVyIGluIEF1dG8tbmVnb3RpYXRpb24gTW9kZQorICoJRm9yY2UgbW9kZTogUEhZIGNvbnRyb2xsZXIgaW4gZm9yY2UgbW9kZSB3aXRoIEhVQgorICoJCQlOLXdheSBmb3JjZSBjYXBhYmlsaXR5IHdpdGggU1dJVENICisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9wcm9jZXNzX21vZGUoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIpCit7CisJdTE2IHBoeV9yZWc7CisKKwkvKiBGdWxsIER1cGxleCBNb2RlIENoZWNrICovCisJaWYgKGRiLT5vcF9tb2RlICYgMHg0KQorCQlkYi0+Y3I2X2RhdGEgfD0gQ1I2X0ZETTsJLyogU2V0IEZ1bGwgRHVwbGV4IEJpdCAqLworCWVsc2UKKwkJZGItPmNyNl9kYXRhICY9IH5DUjZfRkRNOwkvKiBDbGVhciBGdWxsIER1cGxleCBCaXQgKi8KKworCS8qIFRyYW5zY2l2ZXIgU2VsZWN0aW9uICovCisJaWYgKGRiLT5vcF9tb2RlICYgMHgxMCkJCS8qIDFNIEhvbWVQTkEgKi8KKwkJZGItPmNyNl9kYXRhIHw9IDB4NDAwMDA7LyogRXh0ZXJuYWwgTUlJIHNlbGVjdCAqLworCWVsc2UKKwkJZGItPmNyNl9kYXRhICY9IH4weDQwMDAwOy8qIEludGVybmFsIDEwLzEwMCB0cmFuc2NpdmVyICovCisKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisKKwkvKiAxMC8xMDBNIHBoeXhjZXIgZm9yY2UgbW9kZSBuZWVkICovCisJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgMHgxOCkpIHsKKwkJLyogRm9yZWNlIE1vZGUgKi8KKwkJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgNiwgZGItPmNoaXBfaWQpOworCQlpZiAoICEocGh5X3JlZyAmIDB4MSkgKSB7CisJCQkvKiBwYXJ0ZXIgd2l0aG91dCBOLVdheSBjYXBhYmlsaXR5ICovCisJCQlwaHlfcmVnID0gMHgwOworCQkJc3dpdGNoKGRiLT5vcF9tb2RlKSB7CisJCQljYXNlIERNRkVfMTBNSEY6IHBoeV9yZWcgPSAweDA7IGJyZWFrOworCQkJY2FzZSBETUZFXzEwTUZEOiBwaHlfcmVnID0gMHgxMDA7IGJyZWFrOworCQkJY2FzZSBETUZFXzEwME1IRjogcGh5X3JlZyA9IDB4MjAwMDsgYnJlYWs7CisJCQljYXNlIERNRkVfMTAwTUZEOiBwaHlfcmVnID0gMHgyMTAwOyBicmVhazsKKwkJCX0KKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKyAgICAgICAJCQlpZiAoIGRiLT5jaGlwX3R5cGUgJiYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMDJfSUQpICkKKwkJCQltZGVsYXkoMjApOworCQkJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMCwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworCQl9CisJfQorfQorCisKKy8qCisgKglXcml0ZSBhIHdvcmQgdG8gUGh5IHJlZ2lzdGVyCisgKi8KKworc3RhdGljIHZvaWQgcGh5X3dyaXRlKHVuc2lnbmVkIGxvbmcgaW9iYXNlLCB1OCBwaHlfYWRkciwgdTggb2Zmc2V0LCB1MTYgcGh5X2RhdGEsIHUzMiBjaGlwX2lkKQoreworCXUxNiBpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCisJaWYgKGNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgeworCQlpb2FkZHIgPSBpb2Jhc2UgKyAweDgwICsgb2Zmc2V0ICogNDsKKwkJb3V0dyhwaHlfZGF0YSwgaW9hZGRyKTsKKwl9IGVsc2UgeworCQkvKiBETTkxMDIvRE05MTAyQSBDaGlwICovCisJCWlvYWRkciA9IGlvYmFzZSArIERDUjk7CisKKwkJLyogU2VuZCAzMyBzeW5jaHJvbml6YXRpb24gY2xvY2sgdG8gUGh5IGNvbnRyb2xsZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM1OyBpKyspCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgc3RhcnQgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCB3cml0ZSBjb21tYW5kKDAxKSB0byBQaHkgKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIFBoeSBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBwaHlfYWRkciAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCByZWdpc3RlciBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBvZmZzZXQgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCisJCS8qIHdyaXR0ZW4gdHJhc25pdGlvbiAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCisJCS8qIFdyaXRlIGEgd29yZCBkYXRhIHRvIFBIWSBjb250cm9sbGVyICovCisJCWZvciAoIGkgPSAweDgwMDA7IGkgPiAwOyBpID4+PSAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBwaHlfZGF0YSAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCk7CisJfQorfQorCisKKy8qCisgKglSZWFkIGEgd29yZCBkYXRhIGZyb20gcGh5IHJlZ2lzdGVyCisgKi8KKworc3RhdGljIHUxNiBwaHlfcmVhZCh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCwgdTMyIGNoaXBfaWQpCit7CisJaW50IGk7CisJdTE2IHBoeV9kYXRhOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCisJaWYgKGNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgeworCQkvKiBETTkxMzIgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyAweDgwICsgb2Zmc2V0ICogNDsKKwkJcGh5X2RhdGEgPSBpbncoaW9hZGRyKTsKKwl9IGVsc2UgeworCQkvKiBETTkxMDIvRE05MTAyQSBDaGlwICovCisJCWlvYWRkciA9IGlvYmFzZSArIERDUjk7CisKKwkJLyogU2VuZCAzMyBzeW5jaHJvbml6YXRpb24gY2xvY2sgdG8gUGh5IGNvbnRyb2xsZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM1OyBpKyspCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgc3RhcnQgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCByZWFkIGNvbW1hbmQoMTApIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCisJCS8qIFNlbmQgUGh5IGFkZHJlc3MgKi8KKwkJZm9yIChpID0gMHgxMDsgaSA+IDA7IGkgPSBpID4+IDEpCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIHBoeV9hZGRyICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wKTsKKworCQkvKiBTZW5kIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwkJZm9yIChpID0gMHgxMDsgaSA+IDA7IGkgPSBpID4+IDEpCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIG9mZnNldCAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCk7CisKKwkJLyogU2tpcCB0cmFuc2l0aW9uIHN0YXRlICovCisJCXBoeV9yZWFkXzFiaXQoaW9hZGRyKTsKKworCQkvKiByZWFkIDE2Yml0IGRhdGEgKi8KKwkJZm9yIChwaHlfZGF0YSA9IDAsIGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJcGh5X2RhdGEgPDw9IDE7CisJCQlwaHlfZGF0YSB8PSBwaHlfcmVhZF8xYml0KGlvYWRkcik7CisJCX0KKwl9CisKKwlyZXR1cm4gcGh5X2RhdGE7Cit9CisKKworLyoKKyAqCVdyaXRlIG9uZSBiaXQgZGF0YSB0byBQaHkgQ29udHJvbGxlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MzIgcGh5X2RhdGEpCit7CisJb3V0bChwaHlfZGF0YSwgaW9hZGRyKTsJCQkvKiBNSUkgQ2xvY2sgTG93ICovCisJdWRlbGF5KDEpOworCW91dGwocGh5X2RhdGEgfCBNRENMS0gsIGlvYWRkcik7CS8qIE1JSSBDbG9jayBIaWdoICovCisJdWRlbGF5KDEpOworCW91dGwocGh5X2RhdGEsIGlvYWRkcik7CQkJLyogTUlJIENsb2NrIExvdyAqLworCXVkZWxheSgxKTsKK30KKworCisvKgorICoJUmVhZCBvbmUgYml0IHBoeSBkYXRhIGZyb20gUEhZIGNvbnRyb2xsZXIKKyAqLworCitzdGF0aWMgdTE2IHBoeV9yZWFkXzFiaXQodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJdTE2IHBoeV9kYXRhOworCisJb3V0bCgweDUwMDAwLCBpb2FkZHIpOworCXVkZWxheSgxKTsKKwlwaHlfZGF0YSA9ICggaW5sKGlvYWRkcikgPj4gMTkgKSAmIDB4MTsKKwlvdXRsKDB4NDAwMDAsIGlvYWRkcik7CisJdWRlbGF5KDEpOworCisJcmV0dXJuIHBoeV9kYXRhOworfQorCisKKy8qCisgKglQYXJzZXIgU1JPTSBhbmQgbWVkaWEgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcGFyc2Vfc3JvbShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIpCit7CisJY2hhciAqIHNyb20gPSBkYi0+c3JvbTsKKwlpbnQgZG1mZV9tb2RlLCB0bXBfcmVnOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3BhcnNlX3Nyb20oKSAiLCAwKTsKKworCS8qIEluaXQgQ1IxNSAqLworCWRiLT5jcjE1X2RhdGEgPSBDUjE1X0RFRkFVTFQ7CisKKwkvKiBDaGVjayBTUk9NIFZlcnNpb24gKi8KKwlpZiAoICggKGludCkgc3JvbVsxOF0gJiAweGZmKSA9PSBTUk9NX1Y0MV9DT0RFKSB7CisJCS8qIFNST00gVjQuMDEgKi8KKwkJLyogR2V0IE5JQyBzdXBwb3J0IG1lZGlhIG1vZGUgKi8KKwkJZGItPk5JQ19jYXBhYmlsaXR5ID0gbGUxNl90b19jcHVwKHNyb20gKyAzNCk7CisJCWRiLT5QSFlfcmVnNCA9IDA7CisJCWZvciAodG1wX3JlZyA9IDE7IHRtcF9yZWcgPCAweDEwOyB0bXBfcmVnIDw8PSAxKSB7CisJCQlzd2l0Y2goIGRiLT5OSUNfY2FwYWJpbGl0eSAmIHRtcF9yZWcgKSB7CisJCQljYXNlIDB4MTogZGItPlBIWV9yZWc0IHw9IDB4MDAyMDsgYnJlYWs7CisJCQljYXNlIDB4MjogZGItPlBIWV9yZWc0IHw9IDB4MDA0MDsgYnJlYWs7CisJCQljYXNlIDB4NDogZGItPlBIWV9yZWc0IHw9IDB4MDA4MDsgYnJlYWs7CisJCQljYXNlIDB4ODogZGItPlBIWV9yZWc0IHw9IDB4MDEwMDsgYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBNZWRpYSBNb2RlIEZvcmNlIG9yIG5vdCBjaGVjayAqLworCQlkbWZlX21vZGUgPSBsZTMyX3RvX2NwdXAoc3JvbSArIDM0KSAmIGxlMzJfdG9fY3B1cChzcm9tICsgMzYpOworCQlzd2l0Y2goZG1mZV9tb2RlKSB7CisJCWNhc2UgMHg0OiBkbWZlX21lZGlhX21vZGUgPSBETUZFXzEwME1IRjsgYnJlYWs7CS8qIDEwME1IRiAqLworCQljYXNlIDB4MjogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xME1GRDsgYnJlYWs7CS8qIDEwTUZEICovCisJCWNhc2UgMHg4OiBkbWZlX21lZGlhX21vZGUgPSBETUZFXzEwME1GRDsgYnJlYWs7CS8qIDEwME1GRCAqLworCQljYXNlIDB4MTAwOgorCQljYXNlIDB4MjAwOiBkbWZlX21lZGlhX21vZGUgPSBETUZFXzFNX0hQTkE7IGJyZWFrOy8qIEhvbWVQTkEgKi8KKwkJfQorCisJCS8qIFNwZWNpYWwgRnVuY3Rpb24gc2V0dGluZyAqLworCQkvKiBWTEFOIGZ1bmN0aW9uICovCisJCWlmICggKFNGX21vZGUgJiAweDEpIHx8IChzcm9tWzQzXSAmIDB4ODApICkKKwkJCWRiLT5jcjE1X2RhdGEgfD0gMHg0MDsKKworCQkvKiBGbG93IENvbnRyb2wgKi8KKwkJaWYgKCAoU0ZfbW9kZSAmIDB4MikgfHwgKHNyb21bNDBdICYgMHgxKSApCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4NDAwOworCisJCS8qIFRYIHBhdXNlIHBhY2tldCAqLworCQlpZiAoIChTRl9tb2RlICYgMHg0KSB8fCAoc3JvbVs0MF0gJiAweGUpICkKKwkJCWRiLT5jcjE1X2RhdGEgfD0gMHg5ODAwOworCX0KKworCS8qIFBhcnNlIEhQTkEgcGFyYW1ldGVyICovCisJZGItPkhQTkFfY29tbWFuZCA9IDE7CisKKwkvKiBBY2NlcHQgcmVtb3RlIGNvbW1hbmQgb3Igbm90ICovCisJaWYgKEhQTkFfcnhfY21kID09IDApCisJCWRiLT5IUE5BX2NvbW1hbmQgfD0gMHg4MDAwOworCisJIC8qIElzc3VlIHJlbW90ZSBjb21tYW5kICYgb3BlcmF0aW9uIG1vZGUgKi8KKwlpZiAoSFBOQV90eF9jbWQgPT0gMSkKKwkJc3dpdGNoKEhQTkFfbW9kZSkgewkvKiBJc3N1ZSBSZW1vdGUgQ29tbWFuZCAqLworCQljYXNlIDA6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwOTA0OyBicmVhazsKKwkJY2FzZSAxOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MGEwMDsgYnJlYWs7CisJCWNhc2UgMjogZGItPkhQTkFfY29tbWFuZCB8PSAweDA1MDY7IGJyZWFrOworCQljYXNlIDM6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwNjAyOyBicmVhazsKKwkJfQorCWVsc2UKKwkJc3dpdGNoKEhQTkFfbW9kZSkgewkvKiBEb24ndCBJc3N1ZSAqLworCQljYXNlIDA6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwMDA0OyBicmVhazsKKwkJY2FzZSAxOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwMDsgYnJlYWs7CisJCWNhc2UgMjogZGItPkhQTkFfY29tbWFuZCB8PSAweDAwMDY7IGJyZWFrOworCQljYXNlIDM6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwMDAyOyBicmVhazsKKwkJfQorCisJLyogQ2hlY2sgRE05ODAxIG9yIERNOTgwMiBwcmVzZW50IG9yIG5vdCAqLworCWRiLT5IUE5BX3ByZXNlbnQgPSAwOworCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhfDB4NDAwMDAsIGRiLT5pb2FkZHIpOworCXRtcF9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDMsIGRiLT5jaGlwX2lkKTsKKwlpZiAoICggdG1wX3JlZyAmIDB4ZmZmMCApID09IDB4YjkwMCApIHsKKwkJLyogRE05ODAxIG9yIERNOTgwMiBwcmVzZW50ICovCisJCWRiLT5IUE5BX3RpbWVyID0gODsKKwkJaWYgKCBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDMxLCBkYi0+Y2hpcF9pZCkgPT0gMHg0NDA0KSB7CisJCQkvKiBETTk4MDEgSG9tZVJ1biAqLworCQkJZGItPkhQTkFfcHJlc2VudCA9IDE7CisJCQlkbWZlX3Byb2dyYW1fRE05ODAxKGRiLCB0bXBfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERNOTgwMiBMb25nUnVuICovCisJCQlkYi0+SFBOQV9wcmVzZW50ID0gMjsKKwkJCWRtZmVfcHJvZ3JhbV9ETTk4MDIoZGIpOworCQl9CisJfQorCit9CisKKworLyoKKyAqCUluaXQgSG9tZVJ1biBETTk4MDEKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAxKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYiwgaW50IEhQTkFfcmV2KQoreworCXVpbnQgcmVnMTcsIHJlZzI1OworCisJaWYgKCAhSFBOQV9Ob2lzZUZsb29yICkgSFBOQV9Ob2lzZUZsb29yID0gRE05ODAxX05PSVNFX0ZMT09SOworCXN3aXRjaChIUE5BX3JldikgeworCWNhc2UgMHhiOTAwOiAvKiBETTk4MDEgRTMgKi8KKwkJZGItPkhQTkFfY29tbWFuZCB8PSAweDEwMDA7CisJCXJlZzI1ID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNCwgZGItPmNoaXBfaWQpOworCQlyZWcyNSA9ICggKHJlZzI1ICsgSFBOQV9Ob2lzZUZsb29yKSAmIDB4ZmYpIHwgMHhmMDAwOworCQlyZWcxNyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKTsKKwkJYnJlYWs7CisJY2FzZSAweGI5MDE6IC8qIERNOTgwMSBFNCAqLworCQlyZWcyNSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjUsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMjUgPSAocmVnMjUgJiAweGZmMDApICsgSFBOQV9Ob2lzZUZsb29yOworCQlyZWcxNyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMTcgPSAocmVnMTcgJiAweGZmZjApICsgSFBOQV9Ob2lzZUZsb29yICsgMzsKKwkJYnJlYWs7CisJY2FzZSAweGI5MDI6IC8qIERNOTgwMSBFNSAqLworCWNhc2UgMHhiOTAzOiAvKiBETTk4MDEgRTYgKi8KKwlkZWZhdWx0OgorCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MTAwMDsKKwkJcmVnMjUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzI1ID0gKHJlZzI1ICYgMHhmZjAwKSArIEhQTkFfTm9pc2VGbG9vciAtIDU7CisJCXJlZzE3ID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpOworCQlyZWcxNyA9IChyZWcxNyAmIDB4ZmZmMCkgKyBIUE5BX05vaXNlRmxvb3I7CisJCWJyZWFrOworCX0KKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCByZWcxNywgZGItPmNoaXBfaWQpOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCByZWcyNSwgZGItPmNoaXBfaWQpOworfQorCisKKy8qCisgKglJbml0IEhvbWVSdW4gRE05ODAyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIpCit7CisJdWludCBwaHlfcmVnOworCisJaWYgKCAhSFBOQV9Ob2lzZUZsb29yICkgSFBOQV9Ob2lzZUZsb29yID0gRE05ODAyX05PSVNFX0ZMT09SOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE2LCBkYi0+SFBOQV9jb21tYW5kLCBkYi0+Y2hpcF9pZCk7CisJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjUsIGRiLT5jaGlwX2lkKTsKKwlwaHlfcmVnID0gKCBwaHlfcmVnICYgMHhmZjAwKSArIEhQTkFfTm9pc2VGbG9vcjsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNSwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworfQorCisKKy8qCisgKglDaGVjayByZW1vdGUgSFBOQSBwb3dlciBhbmQgc3BlZWQgc3RhdHVzLiBJZiBub3QgY29ycmVjdCwKKyAqCWlzc3VlIGNvbW1hbmQgYWdhaW4uCisqLworCitzdGF0aWMgdm9pZCBkbWZlX0hQTkFfcmVtb3RlX2NtZF9jaGsoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXVpbnQgcGh5X3JlZzsKKworCS8qIEdvdCByZW1vdGUgZGV2aWNlIHN0YXR1cyAqLworCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCkgJiAweDYwOworCXN3aXRjaChwaHlfcmVnKSB7CisJY2FzZSAweDAwOiBwaHlfcmVnID0gMHgwYTAwO2JyZWFrOyAvKiBMUC9MUyAqLworCWNhc2UgMHgyMDogcGh5X3JlZyA9IDB4MDkwMDticmVhazsgLyogTFAvSFMgKi8KKwljYXNlIDB4NDA6IHBoeV9yZWcgPSAweDA2MDA7YnJlYWs7IC8qIEhQL0xTICovCisJY2FzZSAweDYwOiBwaHlfcmVnID0gMHgwNTAwO2JyZWFrOyAvKiBIUC9IUyAqLworCX0KKworCS8qIENoZWNrIHJlbW90ZSBkZXZpY2Ugc3RhdHVzIG1hdGNoIG91ciBzZXR0aW5nIG90IG5vdCAqLworCWlmICggcGh5X3JlZyAhPSAoZGItPkhQTkFfY29tbWFuZCAmIDB4MGYwMCkgKSB7CisJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE2LCBkYi0+SFBOQV9jb21tYW5kLCBkYi0+Y2hpcF9pZCk7CisJCWRiLT5IUE5BX3RpbWVyPTg7CisJfSBlbHNlCisJCWRiLT5IUE5BX3RpbWVyPTYwMDsJLyogTWF0Y2gsIGV2ZXJ5IDEwIG1pbnV0ZXMsIGNoZWNrICovCit9CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZG1mZV9wY2lfdGJsW10gPSB7CisJeyAweDEyODIsIDB4OTEzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUENJX0RNOTEzMl9JRCB9LAorCXsgMHgxMjgyLCAweDkxMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9ETTkxMDJfSUQgfSwKKwl7IDB4MTI4MiwgMHg5MTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBQQ0lfRE05MTAwX0lEIH0sCisJeyAweDEyODIsIDB4OTAwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUENJX0RNOTAwOV9JRCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkbWZlX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkbWZlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZG1mZSIsCisJLmlkX3RhYmxlCT0gZG1mZV9wY2lfdGJsLAorCS5wcm9iZQkJPSBkbWZlX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZG1mZV9yZW1vdmVfb25lKSwKK307CisKK01PRFVMRV9BVVRIT1IoIlN0ZW4gV2FuZywgc3Rlbl93YW5nQGRhdmljb20uY29tLnR3Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRhdmljb20gRE05MTBYIGZhc3QgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtb2RlLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbShjcjZzZXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2hrbW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oSFBOQV9tb2RlLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbShIUE5BX3J4X2NtZCwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oSFBOQV90eF9jbWQsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKEhQTkFfTm9pc2VGbG9vciwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oU0ZfbW9kZSwgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGF2aWNvbSBETTl4eHggZW5hYmxlIGRlYnVnZ2luZyAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiRGF2aWNvbSBETTl4eHg6IEJpdCAwOiAxMC8xMDBNYnBzLCBiaXQgMjogZHVwbGV4LCBiaXQgODogSG9tZVBOQSIpOworTU9EVUxFX1BBUk1fREVTQyhTRl9tb2RlLCAiRGF2aWNvbSBETTl4eHggc3BlY2lhbCBmdW5jdGlvbiAoYml0IDA6IFZMQU4sIGJpdCAxIEZsb3cgQ29udHJvbCwgYml0IDI6IFRYIHBhdXNlIHBhY2tldCkiKTsKKworLyoJRGVzY3JpcHRpb246CisgKgl3aGVuIHVzZXIgdXNlZCBpbnNtb2QgdG8gYWRkIG1vZHVsZSwgc3lzdGVtIGludm9rZWQgaW5pdF9tb2R1bGUoKQorICoJdG8gaW5pdGlsaXplIGFuZCByZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkbWZlX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKHZlcnNpb24pOworCXByaW50ZWRfdmVyc2lvbiA9IDE7CisKKwlETUZFX0RCVUcoMCwgImluaXRfbW9kdWxlKCkgIiwgZGVidWcpOworCisJaWYgKGRlYnVnKQorCQlkbWZlX2RlYnVnID0gZGVidWc7CS8qIHNldCBkZWJ1ZyBmbGFnICovCisJaWYgKGNyNnNldCkKKwkJZG1mZV9jcjZfdXNlcl9zZXQgPSBjcjZzZXQ7CisKKyAJc3dpdGNoKG1vZGUpIHsKKyAgIAljYXNlIERNRkVfMTBNSEY6CisJY2FzZSBETUZFXzEwME1IRjoKKwljYXNlIERNRkVfMTBNRkQ6CisJY2FzZSBETUZFXzEwME1GRDoKKwljYXNlIERNRkVfMU1fSFBOQToKKwkJZG1mZV9tZWRpYV9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJZGVmYXVsdDpkbWZlX21lZGlhX21vZGUgPSBETUZFX0FVVE87CisJCWJyZWFrOworCX0KKworCWlmIChIUE5BX21vZGUgPiA0KQorCQlIUE5BX21vZGUgPSAwOwkJLyogRGVmYXVsdDogTFAvSFMgKi8KKwlpZiAoSFBOQV9yeF9jbWQgPiAxKQorCQlIUE5BX3J4X2NtZCA9IDA7CS8qIERlZmF1bHQ6IElnbm9yZWQgcmVtb3RlIGNtZCAqLworCWlmIChIUE5BX3R4X2NtZCA+IDEpCisJCUhQTkFfdHhfY21kID0gMDsJLyogRGVmYXVsdDogRG9uJ3QgaXNzdWUgcmVtb3RlIGNtZCAqLworCWlmIChIUE5BX05vaXNlRmxvb3IgPiAxNSkKKwkJSFBOQV9Ob2lzZUZsb29yID0gMDsKKworCXJjID0gcGNpX21vZHVsZV9pbml0KCZkbWZlX2RyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCURlc2NyaXB0aW9uOgorICoJd2hlbiB1c2VyIHVzZWQgcm1tb2QgdG8gZGVsZXRlIG1vZHVsZSwgc3lzdGVtIGludm9rZWQgY2xlYW5fbW9kdWxlKCkKKyAqCXRvIHVuLXJlZ2lzdGVyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzLgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbWZlX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJRE1GRV9EQlVHKDAsICJkbWZlX2NsZWFuX21vZHVsZSgpICIsIGRlYnVnKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRtZmVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZG1mZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkbWZlX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1YmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisKKworLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLworLyogVGhlIG1haW4gcm91dGluZSB0byBwYXJzZSB0aGUgdmVyeSBjb21wbGljYXRlZCBTUk9NIHN0cnVjdHVyZS4KKyAgIFNlYXJjaCB3d3cuZGlnaXRhbC5jb20gZm9yICIyMVg0IFNST00iIHRvIGdldCBkZXRhaWxzLgorICAgVGhpcyBjb2RlIGlzIHZlcnkgY29tcGxleCwgYW5kIHdpbGwgcmVxdWlyZSBjaGFuZ2VzIHRvIHN1cHBvcnQKKyAgIGFkZGl0aW9uYWwgY2FyZHMsIHNvIEknbGwgYmUgdmVyYm9zZSBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLgorICAgKi8KKworLyogS25vd24gY2FyZHMgdGhhdCBoYXZlIG9sZC1zdHlsZSBFRVBST01zLiAqLworc3RhdGljIHN0cnVjdCBlZXByb21fZml4dXAgZWVwcm9tX2ZpeHVwc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisgIHsiQXNhbnRlIiwgMCwgMCwgMHg5NCwgezB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDEwMCwgMHgwMThjLAorCQkJICAweDAwMDAsIDB4MDAwMCwgMHhlMDc4LCAweDAwMDEsIDB4MDA1MCwgMHgwMDE4IH19LAorICB7IlNNQzkzMzJEU1QiLCAwLCAwLCAweEMwLCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDQxZiwKKwkJCSAgIDB4MDAwMCwgMHgwMDlFLCAvKiAxMGJhc2VUICovCisJCQkgICAweDAwMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworCQkJICAgMHgwOTAzLCAweDAwNkQsIC8qIDEwMGJhc2VUeCAqLworCQkJICAgMHgwOTA1LCAweDAwNkQsIC8qIDEwMGJhc2VUeC1GRCAqLyB9fSwKKyAgeyJDb2dlbnQgRU0xMDAiLCAwLCAwLCAweDkyLCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDYzZiwKKwkJCQkgMHgwMTA3LCAweDgwMjEsIC8qIDEwMGJhc2VGeCAqLworCQkJCSAweDAxMDgsIDB4ODAyMSwgLyogMTAwYmFzZUZ4LUZEICovCisJCQkJIDB4MDEwMCwgMHgwMDlFLCAvKiAxMGJhc2VUICovCisJCQkJIDB4MDEwNCwgMHgwMDlFLCAvKiAxMGJhc2VULUZEICovCisJCQkJIDB4MDEwMywgMHgwMDZELCAvKiAxMDBiYXNlVHggKi8KKwkJCQkgMHgwMTA1LCAweDAwNkQsIC8qIDEwMGJhc2VUeC1GRCAqLyB9fSwKKyAgeyJNYXh0ZWNoIE5YLTExMCIsIDAsIDAsIDB4RTgsIHsgMHgxZTAwLCAweDAwMDAsIDB4MDgwMCwgMHgwNTEzLAorCQkJCSAgIDB4MTAwMSwgMHgwMDlFLCAvKiAxMGJhc2UyLCBDU1IxMiAweDEwKi8KKwkJCQkgICAweDAwMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworCQkJCSAgIDB4MDAwNCwgMHgwMDlFLCAvKiAxMGJhc2VULUZEICovCisJCQkJICAgMHgwMzAzLCAweDAwNkQsIC8qIDEwMGJhc2VUeCwgQ1NSMTIgMHgwMyAqLworCQkJCSAgIDB4MDMwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgQ1NSMTIgMHgwMyAqL319LAorICB7IkFjY3RvbiBFTjEyMDciLCAwLCAwLCAweEU4LCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDUxRiwKKwkJCQkgIDB4MUIwMSwgMHgwMDAwLCAvKiAxMGJhc2UyLCAgIENTUjEyIDB4MUIgKi8KKwkJCQkgIDB4MEIwMCwgMHgwMDlFLCAvKiAxMGJhc2VULCAgIENTUjEyIDB4MEIgKi8KKwkJCQkgIDB4MEIwNCwgMHgwMDlFLCAvKiAxMGJhc2VULUZELENTUjEyIDB4MEIgKi8KKwkJCQkgIDB4MUIwMywgMHgwMDZELCAvKiAxMDBiYXNlVHgsIENTUjEyIDB4MUIgKi8KKwkJCQkgIDB4MUIwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgQ1NSMTIgMHgxQiAqLworICAgfX0sCisgIHsiTmV0V2luZGVyIiwgMHgwMCwgMHgxMCwgMHg1NywKKwkvKiBEZWZhdWx0IG1lZGlhID0gTUlJCisJICogTUlJIGJsb2NrLCByZXNldCBzZXF1ZW5jZSAoMykgPSAweDA4MjEgMHgwMDAwIDB4MDAwMSwgY2FwYWJpbGl0aWVzIDB4MDFlMQorCSAqLworCXsgMHgxZTAwLCAweDAwMDAsIDB4MDAwYiwgMHg4ZjAxLCAweDAxMDMsIDB4MDMwMCwgMHgwODIxLCAweDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4MDFlMSB9CisgIH0sCisgIHtOVUxMfX07CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmJsb2NrX25hbWVbXSBfX2RldmluaXRkYXRhID0geworCSIyMTE0MCBub24tTUlJIiwKKwkiMjExNDAgTUlJIFBIWSIsCisJIjIxMTQyIFNlcmlhbCBQSFkiLAorCSIyMTE0MiBNSUkgUEhZIiwKKwkiMjExNDMgU1lNIFBIWSIsCisJIjIxMTQzIHJlc2V0IG1ldGhvZCIKK307CisKKworLyoqCisgKiB0dWxpcF9idWlsZF9mYWtlX21lZGlhdGFibGUgLSBCdWlsZCBhIGZha2UgbWVkaWF0YWJsZSBlbnRyeS4KKyAqIEB0cDogUHRyIHRvIHRoZSB0dWxpcCBwcml2YXRlIGRhdGEuCisgKgorICogU29tZSBjYXJkcyBsaWtlIHRoZSAzeDUgSFNDIGNhcmRzIChKMzUxNEEpIGRvIG5vdCBoYXZlIGEgc3RhbmRhcmQgCisgKiBzcm9tIGFuZCBjYW4gbm90IGJlIGhhbmRsZWQgdW5kZXIgdGhlIGZpeHVwIHJvdXRpbmUuICBUaGVzZSBjYXJkcworICogc3RpbGwgbmVlZCBhIHZhbGlkIG1lZGlhdGFibGUgZW50cnkgZm9yIGNvcnJlY3QgY3NyMTIgc2V0dXAgYW5kIAorICogbWlpIGhhbmRsaW5nLgorICogCisgKiBTaW5jZSB0aGlzIGlzIGN1cnJlbnRseSBhIHBhcmlzYy1saW51eCBzcGVjaWZpYyBmdW5jdGlvbiwgdGhlCisgKiAjaWZkZWYgX19ocHBhX18gc2hvdWxkIGNvbXBsZXRlbHkgb3B0aW1pemUgdGhpcyBmdW5jdGlvbiBhd2F5IGZvcgorICogbm9uLXBhcmlzYyBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHR1bGlwX2J1aWxkX2Zha2VfbWVkaWF0YWJsZShzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHApCit7CisjaWZkZWYgQ09ORklHX0dTQworCWlmICh0cC0+ZmxhZ3MgJiBORUVEU19GQUtFX01FRElBX1RBQkxFKSB7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxlYWZkYXRhW10gPQorCQkJeyAweDAxLCAgICAgICAvKiBwaHkgbnVtYmVyICovCisJCQkgIDB4MDIsICAgICAgIC8qIGdwciBzZXR1cCBzZXF1ZW5jZSBsZW5ndGggKi8KKwkJCSAgMHgwMiwgMHgwMCwgLyogZ3ByIHNldHVwIHNlcXVlbmNlICovCisJCQkgIDB4MDIsICAgICAgIC8qIHBoeSByZXNldCBzZXF1ZW5jZSBsZW5ndGggKi8KKwkJCSAgMHgwMSwgMHgwMCwgLyogcGh5IHJlc2V0IHNlcXVlbmNlICovCisJCQkgIDB4MDAsIDB4NzgsIC8qIG1lZGlhIGNhcGFiaWxpdGllcyAqLworCQkJICAweDAwLCAweGUwLCAvKiBud2F5IGFkdmVydGlzbWVudCAqLworCQkJICAweDAwLCAweDA1LCAvKiBmZHggYml0IG1hcCAqLworCQkJICAweDAwLCAweDA2ICAvKiB0dG0gYml0IG1hcCAqLworCQkJfTsKKworCQl0cC0+bXRhYmxlID0gKHN0cnVjdCBtZWRpYXRhYmxlICopCisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKyBzaXplb2Yoc3RydWN0IG1lZGlhbGVhZiksIEdGUF9LRVJORUwpOworCisJCWlmICh0cC0+bXRhYmxlID09IE5VTEwpCisJCQlyZXR1cm47IC8qIEhvcnJpYmxlLCBpbXBvc3NpYmxlIGZhaWx1cmUuICovCisKKwkJdHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhID0gMHg4MDA7CisJCXRwLT5tdGFibGUtPmxlYWZjb3VudCA9IDE7CisJCXRwLT5tdGFibGUtPmNzcjEyZGlyID0gMHgzZjsgLyogaW5wdXRzIG9uIGJpdDcgZm9yIGhzYy1wY2ksIGJpdDYgZm9yIHBjaS1meCAqLworCQl0cC0+bXRhYmxlLT5oYXNfbm9ubWlpID0gMDsKKwkJdHAtPm10YWJsZS0+aGFzX3Jlc2V0ID0gMDsKKwkJdHAtPm10YWJsZS0+aGFzX21paSA9IDE7CisJCXRwLT5tdGFibGUtPmNzcjE1ZGlyID0gdHAtPm10YWJsZS0+Y3NyMTV2YWwgPSAwOworCQl0cC0+bXRhYmxlLT5tbGVhZlswXS50eXBlID0gMTsKKwkJdHAtPm10YWJsZS0+bWxlYWZbMF0ubWVkaWEgPSAxMTsKKwkJdHAtPm10YWJsZS0+bWxlYWZbMF0ubGVhZmRhdGEgPSAmbGVhZmRhdGFbMF07CisJCXRwLT5mbGFncyB8PSBIQVNfUEhZX0lSUTsKKwkJdHAtPmNzcjEyX3NoYWRvdyA9IC0xOworCX0KKyNlbmRpZiAKK30KKwordm9pZCBfX2RldmluaXQgdHVsaXBfcGFyc2VfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogVGhlIGxhc3QgbWVkaWEgaW5mbyBsaXN0IHBhcnNlZCwgZm9yIG11bHRpcG9ydCBib2FyZHMuICAqLworCXN0YXRpYyBzdHJ1Y3QgbWVkaWF0YWJsZSAqbGFzdF9tZWRpYXRhYmxlOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyICpsYXN0X2VlX2RhdGE7CisJc3RhdGljIGludCBjb250cm9sbGVyX2luZGV4OworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqZWVfZGF0YSA9IHRwLT5lZXByb207CisJaW50IGk7CisKKwl0cC0+bXRhYmxlID0gTlVMTDsKKwkvKiBEZXRlY3QgYW4gb2xkLXN0eWxlIChTQSBvbmx5KSBFRVBST00gbGF5b3V0OgorCSAgIG1lbWNtcChlZWRhdGEsIGVlZGF0YSsxNiwgOCkuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKyspCisJCWlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisJCQlicmVhazsKKwlpZiAoaSA+PSA4KSB7CisJCWlmIChlZV9kYXRhWzBdID09IDB4ZmYpIHsKKwkJCWlmIChsYXN0X21lZGlhdGFibGUpIHsKKwkJCQljb250cm9sbGVyX2luZGV4Kys7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICBDb250cm9sbGVyICVkIG9mIG11bHRpcG9ydCBib2FyZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY29udHJvbGxlcl9pbmRleCk7CisJCQkJdHAtPm10YWJsZSA9IGxhc3RfbWVkaWF0YWJsZTsKKwkJCQllZV9kYXRhID0gbGFzdF9lZV9kYXRhOworCQkJCWdvdG8gc3Vic2VxdWVudF9ib2FyZDsKKwkJCX0gZWxzZQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgTWlzc2luZyBFRVBST00sIHRoaXMgaW50ZXJmYWNlIG1heSAiCisJCQkJCSAgICJub3Qgd29yayBjb3JyZWN0bHkhXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCSAgLyogRG8gYSBmaXgtdXAgYmFzZWQgb24gdGhlIHZlbmRvciBoYWxmIG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MgcHJlZml4LiAqLworCSAgZm9yIChpID0gMDsgZWVwcm9tX2ZpeHVwc1tpXS5uYW1lOyBpKyspIHsKKwkJaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gZWVwcm9tX2ZpeHVwc1tpXS5hZGRyMAorCQkJJiYgIGRldi0+ZGV2X2FkZHJbMV0gPT0gZWVwcm9tX2ZpeHVwc1tpXS5hZGRyMQorCQkJJiYgIGRldi0+ZGV2X2FkZHJbMl0gPT0gZWVwcm9tX2ZpeHVwc1tpXS5hZGRyMikgeworCQkgIGlmIChkZXYtPmRldl9hZGRyWzJdID09IDB4RTggICYmICBlZV9kYXRhWzB4MWFdID09IDB4NTUpCisJCQkgIGkrKzsJCQkvKiBBbiBBY2N0b24gRU4xMjA3LCBub3QgYW4gb3V0bGF3IE1heHRlY2guICovCisJCSAgbWVtY3B5KGVlX2RhdGEgKyAyNiwgZWVwcm9tX2ZpeHVwc1tpXS5uZXd0YWJsZSwKKwkJCQkgc2l6ZW9mKGVlcHJvbV9maXh1cHNbaV0ubmV3dGFibGUpKTsKKwkJICBwcmludGsoS0VSTl9JTkZPICIlczogT2xkIGZvcm1hdCBFRVBST00gb24gJyVzJyBib2FyZC4gIFVzaW5nIgorCQkJCSAiIHN1YnN0aXR1dGUgbWVkaWEgY29udHJvbCBpbmZvLlxuIiwKKwkJCQkgZGV2LT5uYW1lLCBlZXByb21fZml4dXBzW2ldLm5hbWUpOworCQkgIGJyZWFrOworCQl9CisJICB9CisJICBpZiAoZWVwcm9tX2ZpeHVwc1tpXS5uYW1lID09IE5VTEwpIHsgLyogTm8gZml4dXAgZm91bmQuICovCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9sZCBzdHlsZSBFRVBST00gd2l0aCBubyBtZWRpYSBzZWxlY3Rpb24gIgorCQkJCSAiaW5mb3JtYXRpb24uXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCSAgfQorCX0KKworCWNvbnRyb2xsZXJfaW5kZXggPSAwOworCWlmIChlZV9kYXRhWzE5XSA+IDEpIHsJCS8qIE11bHRpcG9ydCBib2FyZC4gKi8KKwkJbGFzdF9lZV9kYXRhID0gZWVfZGF0YTsKKwl9CitzdWJzZXF1ZW50X2JvYXJkOgorCisJaWYgKGVlX2RhdGFbMjddID09IDApIHsJCS8qIE5vIHZhbGlkIG1lZGlhIHRhYmxlLiAqLworCQl0dWxpcF9idWlsZF9mYWtlX21lZGlhdGFibGUodHApOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGNoYXIgKnAgPSAodm9pZCAqKWVlX2RhdGEgKyBlZV9kYXRhWzI3XTsKKwkJdW5zaWduZWQgY2hhciBjc3IxMmRpciA9IDA7CisJCWludCBjb3VudCwgbmV3X2FkdmVydGlzZSA9IDA7CisJCXN0cnVjdCBtZWRpYXRhYmxlICptdGFibGU7CisJCXUxNiBtZWRpYSA9IGdldF91MTYocCk7CisKKwkJcCArPSAyOworCQlpZiAodHAtPmZsYWdzICYgQ1NSMTJfSU5fU1JPTSkKKwkJCWNzcjEyZGlyID0gKnArKzsKKwkJY291bnQgPSAqcCsrOworCisJICAgICAgICAvKiB0aGVyZSBpcyBubyBwaHkgaW5mb3JtYXRpb24sIGRvbid0IGV2ZW4gdHJ5IHRvIGJ1aWxkIG10YWJsZSAqLworCSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5vIHBoeSBpbmZvLCBhYm9ydGluZyBtdGFibGUgYnVpbGRcbiIsIGRldi0+bmFtZSk7CisJCSAgICAgICAgcmV0dXJuOworCQl9CisKKwkJbXRhYmxlID0gKHN0cnVjdCBtZWRpYXRhYmxlICopCisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKyBjb3VudCpzaXplb2Yoc3RydWN0IG1lZGlhbGVhZiksCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAobXRhYmxlID09IE5VTEwpCisJCQlyZXR1cm47CQkJCS8qIEhvcnJpYmxlLCBpbXBvc3NpYmxlIGZhaWx1cmUuICovCisJCWxhc3RfbWVkaWF0YWJsZSA9IHRwLT5tdGFibGUgPSBtdGFibGU7CisJCW10YWJsZS0+ZGVmYXVsdG1lZGlhID0gbWVkaWE7CisJCW10YWJsZS0+bGVhZmNvdW50ID0gY291bnQ7CisJCW10YWJsZS0+Y3NyMTJkaXIgPSBjc3IxMmRpcjsKKwkJbXRhYmxlLT5oYXNfbm9ubWlpID0gbXRhYmxlLT5oYXNfbWlpID0gbXRhYmxlLT5oYXNfcmVzZXQgPSAwOworCQltdGFibGUtPmNzcjE1ZGlyID0gbXRhYmxlLT5jc3IxNXZhbCA9IDA7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICBFRVBST00gZGVmYXVsdCBtZWRpYSB0eXBlICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJICAgbWVkaWEgJiAweDA4MDAgPyAiQXV0b3NlbnNlIiA6IG1lZGlhbmFtZVttZWRpYSAmIE1FRElBX01BU0tdKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXN0cnVjdCBtZWRpYWxlYWYgKmxlYWYgPSAmbXRhYmxlLT5tbGVhZltpXTsKKworCQkJaWYgKChwWzBdICYgMHg4MCkgPT0gMCkgeyAvKiAyMTE0MCBDb21wYWN0IGJsb2NrLiAqLworCQkJCWxlYWYtPnR5cGUgPSAwOworCQkJCWxlYWYtPm1lZGlhID0gcFswXSAmIDB4M2Y7CisJCQkJbGVhZi0+bGVhZmRhdGEgPSBwOworCQkJCWlmICgocFsyXSAmIDB4NjEpID09IDB4MDEpCS8qIEJvZ3VzLCBidXQgWm55eCBib2FyZHMgZG8gaXQuICovCisJCQkJCW10YWJsZS0+aGFzX21paSA9IDE7CisJCQkJcCArPSA0OworCQkJfSBlbHNlIHsKKwkJCQlsZWFmLT50eXBlID0gcFsxXTsKKwkJCQlpZiAocFsxXSA9PSAweDA1KSB7CisJCQkJCW10YWJsZS0+aGFzX3Jlc2V0ID0gaTsKKwkJCQkJbGVhZi0+bWVkaWEgPSBwWzJdICYgMHgwZjsKKwkJCQl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERNOTEwWCAmJiBwWzFdID09IDB4ODApIHsKKwkJCQkJLyogSGFjayB0byBpZ25vcmUgRGF2aWNvbSBkZWxheSBwZXJpb2QgYmxvY2sgKi8KKwkJCQkJbXRhYmxlLT5sZWFmY291bnQtLTsKKwkJCQkJY291bnQtLTsKKwkJCQkJaS0tOworCQkJCQlsZWFmLT5sZWFmZGF0YSA9IHAgKyAyOworCQkJCQlwICs9IChwWzBdICYgMHgzZikgKyAxOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKHBbMV0gJiAxKSB7CisJCQkJCWludCBncHJfbGVuLCByZXNldF9sZW47CisKKwkJCQkJbXRhYmxlLT5oYXNfbWlpID0gMTsKKwkJCQkJbGVhZi0+bWVkaWEgPSAxMTsKKwkJCQkJZ3ByX2xlbj1wWzNdKjI7CisJCQkJCXJlc2V0X2xlbj1wWzQrZ3ByX2xlbl0qMjsKKwkJCQkJbmV3X2FkdmVydGlzZSB8PSBnZXRfdTE2KCZwWzcrZ3ByX2xlbityZXNldF9sZW5dKTsKKwkJCQl9IGVsc2UgeworCQkJCQltdGFibGUtPmhhc19ub25taWkgPSAxOworCQkJCQlsZWFmLT5tZWRpYSA9IHBbMl0gJiBNRURJQV9NQVNLOworCQkJCQkvKiBEYXZpY29tJ3MgbWVkaWEgbnVtYmVyIGZvciAxMDBCYXNlVFggaXMgc3RyYW5nZSAqLworCQkJCQlpZiAodHAtPmNoaXBfaWQgPT0gRE05MTBYICYmIGxlYWYtPm1lZGlhID09IDEpCisJCQkJCQlsZWFmLT5tZWRpYSA9IDM7CisJCQkJCXN3aXRjaCAobGVhZi0+bWVkaWEpIHsKKwkJCQkJY2FzZSAwOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDAyMDsgYnJlYWs7CisJCQkJCWNhc2UgNDogbmV3X2FkdmVydGlzZSB8PSAweDAwNDA7IGJyZWFrOworCQkJCQljYXNlIDM6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDgwOyBicmVhazsKKwkJCQkJY2FzZSA1OiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDEwMDsgYnJlYWs7CisJCQkJCWNhc2UgNjogbmV3X2FkdmVydGlzZSB8PSAweDAyMDA7IGJyZWFrOworCQkJCQl9CisJCQkJCWlmIChwWzFdID09IDIgICYmICBsZWFmLT5tZWRpYSA9PSAwKSB7CisJCQkJCQlpZiAocFsyXSAmIDB4NDApIHsKKwkJCQkJCQl1MzIgYmFzZTE1ID0gZ2V0X3VuYWxpZ25lZCgodTE2KikmcFs3XSk7CisJCQkJCQkJbXRhYmxlLT5jc3IxNWRpciA9CisJCQkJCQkJCShnZXRfdW5hbGlnbmVkKCh1MTYqKSZwWzldKTw8MTYpICsgYmFzZTE1OworCQkJCQkJCW10YWJsZS0+Y3NyMTV2YWwgPQorCQkJCQkJCQkoZ2V0X3VuYWxpZ25lZCgodTE2KikmcFsxMV0pPDwxNikgKyBiYXNlMTU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW10YWJsZS0+Y3NyMTVkaXIgPSBnZXRfdW5hbGlnbmVkKCh1MTYqKSZwWzNdKTw8MTY7CisJCQkJCQkJbXRhYmxlLT5jc3IxNXZhbCA9IGdldF91bmFsaWduZWQoKHUxNiopJnBbNV0pPDwxNjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlsZWFmLT5sZWFmZGF0YSA9IHAgKyAyOworCQkJCXAgKz0gKHBbMF0gJiAweDNmKSArIDE7CisJCQl9CisJCQlpZiAodHVsaXBfZGVidWcgPiAxICAmJiAgbGVhZi0+bWVkaWEgPT0gMTEpIHsKKwkJCQl1bnNpZ25lZCBjaGFyICpicCA9IGxlYWYtPmxlYWZkYXRhOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgTUlJIGludGVyZmFjZSBQSFkgJWQsIHNldHVwL3Jlc2V0ICIKKwkJCQkJICAgInNlcXVlbmNlcyAlZC8lZCBsb25nLCBjYXBhYmlsaXRpZXMgJTIuMnggJTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGJwWzBdLCBicFsxXSwgYnBbMiArIGJwWzFdKjJdLAorCQkJCQkgICBicFs1ICsgYnBbMiArIGJwWzFdKjJdKjJdLCBicFs0ICsgYnBbMiArIGJwWzFdKjJdKjJdKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgSW5kZXggIyVkIC0gTWVkaWEgJXMgKCMlZCkgZGVzY3JpYmVkICIKKwkJCQkgICAiYnkgYSAlcyAoJWQpIGJsb2NrLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGksIG1lZGlhbmFtZVtsZWFmLT5tZWRpYSAmIDE1XSwgbGVhZi0+bWVkaWEsCisJCQkJICAgbGVhZi0+dHlwZSA8IEFSUkFZX1NJWkUoYmxvY2tfbmFtZSkgPyBibG9ja19uYW1lW2xlYWYtPnR5cGVdIDogIjx1bmtub3duPiIsCisJCQkJICAgbGVhZi0+dHlwZSk7CisJCX0KKwkJaWYgKG5ld19hZHZlcnRpc2UpCisJCQl0cC0+c3ltX2FkdmVydGlzZSA9IG5ld19hZHZlcnRpc2U7CisJfQorfQorLyogUmVhZGluZyBhIHNlcmlhbCBFRVBST00gaXMgYSAiYml0IiBncnVuZ3ksIGJ1dCB3ZSB3b3JrIG91ciB3YXkgdGhyb3VnaDotPi4qLworCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDIJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJMHgwMQkvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUJMHgwNAkvKiBEYXRhIGZyb20gdGhlIFR1bGlwIHRvIEVFUFJPTS4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkweDAxCisjZGVmaW5lIEVFX1dSSVRFXzEJMHgwNQorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwOAkvKiBEYXRhIGZyb20gdGhlIEVFUFJPTSBjaGlwLiAqLworI2RlZmluZSBFRV9FTkIJCSgweDQ4MDAgfCBFRV9DUykKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBFdmVuIGF0IDMzTWh6IGN1cnJlbnQgUENJIGltcGxlbWVudGF0aW9ucyBkb24ndCBvdmVycnVuIHRoZSBFRVBST00gY2xvY2suCisgICBXZSBhZGQgYSBidXMgdHVybi1hcm91bmQgdG8gaW5zdXJlIHRoYXQgdGhpcyByZW1haW5zIHRydWUuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpCWlvcmVhZDMyKGVlX2FkZHIpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYpCisKKy8qIE5vdGU6IHRoaXMgcm91dGluZSByZXR1cm5zIGV4dHJhIGRhdGEgYml0cyBmb3Igc2l6ZSBkZXRlY3Rpb24uICovCitpbnQgX19kZXZpbml0IHR1bGlwX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IHRwLT5iYXNlX2FkZHIgKyBDU1I5OworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IGFkZHJfbGVuKTsKKworCWlvd3JpdGUzMihFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCWlvd3JpdGUzMihFRV9FTkIsIGVlX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKwkJaW93cml0ZTMyKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJaW93cml0ZTMyKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCX0KKwlpb3dyaXRlMzIoRUVfRU5CLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCQlpb3dyaXRlMzIoRUVfRU5CLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCWlvd3JpdGUzMihFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXJldHVybiAodHAtPmZsYWdzICYgSEFTX1NXQVBQRURfU0VFUFJPTSkgPyBzd2FiMTYocmV0dmFsKSA6IHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMgYi9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI1Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKQEAgLTAsMCArMSw3ODYgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKK2ludCB0dWxpcF9yeF9jb3B5YnJlYWs7Cit1bnNpZ25lZCBpbnQgdHVsaXBfbWF4X2ludGVycnVwdF93b3JrOworCisjaWZkZWYgQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorI2RlZmluZSBNSVRfU0laRSAxNQorI2RlZmluZSBNSVRfVEFCTEUgMTUgLyogV2UgdXNlIDAgb3IgbWF4ICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWl0X3RhYmxlW01JVF9TSVpFKzFdID0KK3sKKyAgICAgICAgLyogIENSUzExIDIxMTQzIGhhcmR3YXJlIE1pdGlnYXRpb24gQ29udHJvbCBJbnRlcnJ1cHQKKyAgICAgICAgICAgIFdlIHVzZSBvbmx5IFJYIG1pdGlnYXRpb24gd2Ugb3RoZXIgdGVjaG5pcXVlcyBmb3IKKyAgICAgICAgICAgIFRYIGludHIuIG1pdGlnYXRpb24uCisKKyAgICAgICAgICAgMzEgICAgQ3ljbGUgU2l6ZSAodGltZXIgY29udHJvbCkKKyAgICAgICAgICAgMzA6MjcgVFggdGltZXIgaW4gMTYgKiBDeWNsZSBzaXplCisgICAgICAgICAgIDI2OjI0IFRYIE5vIHBrdHMgYmVmb3JlIEludC4KKyAgICAgICAgICAgMjM6MjAgUlggdGltZXIgaW4gQ3ljbGUgc2l6ZQorICAgICAgICAgICAxOToxNyBSWCBObyBwa3RzIGJlZm9yZSBJbnQuCisgICAgICAgICAgIDE2ICAgICAgIENvbnRpbnVlcyBNb2RlIChDTSkKKyAgICAgICAgKi8KKworICAgICAgICAweDAsICAgICAgICAgICAgIC8qIElNIGRpc2FibGVkICovCisgICAgICAgIDB4ODAxNTAwMDAsICAgICAgLyogUlggdGltZSA9IDEsIFJYIHBrdHMgPSAyLCBDTSA9IDEgKi8KKyAgICAgICAgMHg4MDE1MDAwMCwKKyAgICAgICAgMHg4MDI3MDAwMCwKKyAgICAgICAgMHg4MDM3MDAwMCwKKyAgICAgICAgMHg4MDQ5MDAwMCwKKyAgICAgICAgMHg4MDU5MDAwMCwKKyAgICAgICAgMHg4MDY5MDAwMCwKKyAgICAgICAgMHg4MDdCMDAwMCwKKyAgICAgICAgMHg4MDhCMDAwMCwKKyAgICAgICAgMHg4MDlEMDAwMCwKKyAgICAgICAgMHg4MEFEMDAwMCwKKyAgICAgICAgMHg4MEJEMDAwMCwKKyAgICAgICAgMHg4MENGMDAwMCwKKyAgICAgICAgMHg4MERGMDAwMCwKKy8vICAgICAgIDB4ODBGRjAwMDAgICAgICAvKiBSWCB0aW1lID0gMTYsIFJYIHBrdHMgPSA3LCBDTSA9IDEgKi8KKyAgICAgICAgMHg4MEYxMDAwMCAgICAgIC8qIFJYIHRpbWUgPSAxNiwgUlggcGt0cyA9IDAsIENNID0gMSAqLworfTsKKyNlbmRpZgorCisKK2ludCB0dWxpcF9yZWZpbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKwlpbnQgcmVmaWxsZWQgPSAwOworCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHRwLT5jdXJfcnggLSB0cC0+ZGlydHlfcnggPiAwOyB0cC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IHRwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IgPT0gTlVMTCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCQkJc2tiID0gdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT50YWlsLCBQS1RfQlVGX1NaLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CisKKwkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisJCQlyZWZpbGxlZCsrOworCQl9CisJCXRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duZWQpOworCX0KKwlpZih0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpZigoKGlvcmVhZDMyKHRwLT5iYXNlX2FkZHIgKyBDU1I1KT4+MTcpJjB4MDcpID09IDQpIHsKKwkJCS8qIFJ4IHN0b3BwZWQgZHVlIHRvIG91dCBvZiBidWZmZXJzLAorCQkJICogcmVzdGFydCBpdAorCQkJICovCisJCQlpb3dyaXRlMzIoMHgwMSwgdHAtPmJhc2VfYWRkciArIENTUjIpOworCQl9CisJfQorCXJldHVybiByZWZpbGxlZDsKK30KKworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisKK3ZvaWQgb29tX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKK30KKworaW50IHR1bGlwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB0cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCByeF93b3JrX2xpbWl0ID0gKmJ1ZGdldDsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gZG9uZTsKKworCWlmIChyeF93b3JrX2xpbWl0ID4gZGV2LT5xdW90YSkKKwkJcnhfd29ya19saW1pdCA9IGRldi0+cXVvdGE7CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OCisKKy8qIHRoYXQgb25lIGJ1ZmZlciBpcyBuZWVkZWQgZm9yIG1pdCBhY3RpdmF0aW9uOyBvciBtaWdodCBiZSBhCisgICBidWcgaW4gdGhlIHJpbmcgYnVmZmVyIGNvZGU7IGNoZWNrIGxhdGVyIC0tIEpIUyovCisKKyAgICAgICAgaWYgKHJ4X3dvcmtfbGltaXQgPj1SWF9SSU5HX1NJWkUpIHJ4X3dvcmtfbGltaXQtLTsKKyNlbmRpZgorCisJaWYgKHR1bGlwX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiB0dWxpcF9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJICAgdHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisKKyAgICAgICBkbyB7CisJCWlmIChpb3JlYWQzMih0cC0+YmFzZV9hZGRyICsgQ1NSNSkgPT0gMHhmZmZmZmZmZikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiB0dWxpcF9wb2xsKCksIGhhcmR3YXJlIGRpc2FwcGVhcmVkLlxuIik7CisJCQlicmVhazsKKwkJfQorICAgICAgICAgICAgICAgLyogQWNrbm93bGVkZ2UgY3VycmVudCBSWCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigoUnhJbnRyIHwgUnhOb0J1ZiksIHRwLT5iYXNlX2FkZHIgKyBDU1I1KTsKKyAKKyAKKyAgICAgICAgICAgICAgIC8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQgaXMgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworICAgICAgICAgICAgICAgd2hpbGUgKCAhICh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY093bmVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgczMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworIAorIAorICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFID09IHRwLT5jdXJfcngpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbiB0dWxpcF9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZW50cnksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLXJ4X3dvcmtfbGltaXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm90X2RvbmU7CisgCisgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU4Ljh4IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICYgUnhEZXNjRmF0YWxFcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDg5MCkgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiAweDAwMDQpIHRwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiAweDAwMDIpIHRwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDAxKSB0cC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgIAorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdF9sZW4gPiAxNTE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbiwgcGt0X2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuID0gMTUxODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfbGVuIDwgdHVsaXBfcnhfY29weWJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZShza2IsIDIpOyAgICAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwKKwkJCQkJCQkJICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJCSAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwKKwkJCQkJCQkJICAgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJCSAgICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8qIFBhc3MgdXAgdGhlIHNrYiBhbHJlYWR5IG9uIHRoZSBSeCByaW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdGVtcCA9IHNrYl9wdXQoc2tiID0gdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9sZW4pOworICAKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGZhdWx0OiBUaGUgc2tidWZmIGFkZHJlc3NlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG8gbm90IG1hdGNoIGluIHR1bGlwX3J4OiAlMDh4IHZzLiAlMDhsbHggJXAgLyAlcC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5oZWFkLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCsrOworCisgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gKCsrdHAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+Y3VyX3J4IC0gdHAtPmRpcnR5X3J4ID4gUlhfUklOR19TSVpFLzQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVsaXBfcmVmaWxsX3J4KGRldik7CisgCisgICAgICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgICAgLyogTmV3IGFjayBzdHJhdGVneS4uLiBpcnEgZG9lcyBub3QgYWNrIFJ4IGFueSBsb25nZXIKKyAgICAgICAgICAgICAgICAgIGhvcGVmdWxseSB0aGlzIGhlbHBzICovCisgCisgICAgICAgICAgICAgICAvKiBSZWFsbHkgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIGhlcmUuLi4gSWYgbmV3IHBhY2tldCBhcnJpdmVzCisgICAgICAgICAgICAgICAgKiBhbmQgYW4gaXJxIGFycml2ZXMgKHR4IG9yIGp1c3QgZHVlIHRvIG9jY2FzaW9uYWxseSB1bnNldAorICAgICAgICAgICAgICAgICogbWFzayksIGl0IHdpbGwgYmUgYWNrZWQgYnkgaXJxIGhhbmRsZXIsIGJ1dCBuZXcgdGhyZWFkCisgICAgICAgICAgICAgICAgKiBpcyBub3Qgc2NoZWR1bGVkLiBJdCBpcyBtYWpvciBob2xlIGluIGRlc2lnbi4KKyAgICAgICAgICAgICAgICAqIE5vIGlkZWEgaG93IHRvIGZpeCB0aGlzIGlmICJwbGF5aW5nIHdpdGggZmlyZSIgd2lsbCBmYWlsCisgICAgICAgICAgICAgICAgKiB0b21vcnJvdyAobmlnaHQgMDExMDI5KS4gSWYgaXQgd2lsbCBub3QgZmFpbCwgd2Ugd29uCisgICAgICAgICAgICAgICAgKiBmaW5hbGx5OiBhbW91bnQgb2YgSU8gZGlkIG5vdCBpbmNyZWFzZSBhdCBhbGwuICovCisgICAgICAgfSB3aGlsZSAoKGlvcmVhZDMyKHRwLT5iYXNlX2FkZHIgKyBDU1I1KSAmIFJ4SW50cikpOworIAorZG9uZToKKyAKKyAjaWZkZWYgQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorICAKKyAgICAgICAgICAvKiBXZSB1c2UgdGhpcyBzaW1wbGlzdGljIHNjaGVtZSBmb3IgSU0uIEl0J3MgcHJvdmVuIGJ5CisgICAgICAgICAgICAgcmVhbCBsaWZlIGluc3RhbGxhdGlvbnMuIFdlIGNhbiBoYXZlIElNIGVuYWJsZWQKKyAgICAgICAgICAgIGNvbnRpbnVlc2x5IGJ1dCB0aGlzIHdvdWxkIGNhdXNlIHVubmVjZXNzYXJ5IGxhdGVuY3kuIAorICAgICAgICAgICAgVW5mb3J0dW5lbHkgd2UgY2FuJ3QgdXNlIGFsbCB0aGUgTkVUX1JYXyogZmVlZGJhY2sgaGVyZS4gCisgICAgICAgICAgICBUaGlzIHdvdWxkIHR1cm4gb24gSU0gZm9yIGRldmljZXMgdGhhdCBpcyBub3QgY29udHJpYnV0aW5nIAorICAgICAgICAgICAgdG8gYmFja2xvZyBjb25nZXN0aW9uIHdpdGggdW5uZWNlc3NhcnkgbGF0ZW5jeS4gCisgIAorICAgICAgICAgICAgIFdlIG1vbml0b3IgdGhlIHRoZSBkZXZpY2UgUlgtcmluZyBhbmQgaGF2ZToKKyAgCisgICAgICAgICAgICAgSFcgSW50ZXJydXB0IE1pdGlnYXRpb24gZWl0aGVyIE9OIG9yIE9GRi4KKyAgCisgICAgICAgICAgICBPTjogIE1vcmUgdGhlbiAxIHBrdCByZWNlaXZlZCAocGVyIGludHIuKSBPUiB3ZSBhcmUgZHJvcHBpbmcgCisgICAgICAgICAgICAgT0ZGOiBPbmx5IDEgcGt0IHJlY2VpdmVkCisgICAgICAgICAgICAKKyAgICAgICAgICAgICBOb3RlLiBXZSBvbmx5IHVzZSBtaW4gYW5kIG1heCAoMCwgMTUpIHNldHRpbmdzIGZyb20gbWl0X3RhYmxlICovCisgIAorICAKKyAgICAgICAgICBpZiggdHAtPmZsYWdzICYgIEhBU19JTlRSX01JVElHQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgaWYoIHJlY2VpdmVkID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiggISB0cC0+bWl0X29uICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1pdF9vbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzIobWl0X3RhYmxlW01JVF9UQUJMRV0sIHRwLT5iYXNlX2FkZHIgKyBDU1IxMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdHAtPm1pdF9vbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5taXRfb24gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIHRwLT5iYXNlX2FkZHIgKyBDU1IxMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworI2VuZGlmIC8qIENPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT04gKi8KKyAKKyAgICAgICAgIGRldi0+cXVvdGEgLT0gcmVjZWl2ZWQ7CisgICAgICAgICAqYnVkZ2V0IC09IHJlY2VpdmVkOworIAorICAgICAgICAgdHVsaXBfcmVmaWxsX3J4KGRldik7CisgICAgICAgICAKKyAgICAgICAgIC8qIElmIFJYIHJpbmcgaXMgbm90IGZ1bGwgd2UgYXJlIG91dCBvZiBtZW1vcnkuICovCisgICAgICAgICBpZiAodHAtPnJ4X2J1ZmZlcnNbdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFXS5za2IgPT0gTlVMTCkgZ290byBvb207CisgCisgICAgICAgICAvKiBSZW1vdmUgdXMgZnJvbSBwb2xsaW5nIGxpc3QgYW5kIGVuYWJsZSBSWCBpbnRyLiAqLworIAorICAgICAgICAgbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKyAgICAgICAgIGlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCB0cC0+YmFzZV9hZGRyK0NTUjcpOworIAorICAgICAgICAgLyogVGhlIGxhc3Qgb3AgaGFwcGVucyBhZnRlciBwb2xsIGNvbXBsZXRpb24uIFdoaWNoIG1lYW5zIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgKiAxLiBpdCBjYW4gcmFjZSB3aXRoIGRpc2FibGluZyBpcnFzIGluIGlycSBoYW5kbGVyCisgICAgICAgICAgKiAyLiBpdCBjYW4gcmFjZSB3aXRoIGRpc2UvZW5hYmxpbmcgaXJxcyBpbiBvdGhlciBwb2xsIHRocmVhZHMKKyAgICAgICAgICAqIDMuIGlmIGFuIGlycSByYWlzZWQgYWZ0ZXIgYmVnaW5uaW5nIGxvb3AsIGl0IHdpbGwgYmUgaW1tZWRpYXRlbHkKKyAgICAgICAgICAqICAgIHRyaWdnZXJlZCBoZXJlLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFN1bW1hcml6aW5nOiB0aGUgbG9naWMgcmVzdWx0cyBpbiBzb21lIHJlZHVuZGFudCBpcnFzIGJvdGgKKyAgICAgICAgICAqIGR1ZSB0byByYWNlcyBpbiBtYXNraW5nIGFuZCBkdWUgdG8gdG9vIGxhdGUgYWNraW5nIG9mIGFscmVhZHkKKyAgICAgICAgICAqIHByb2Nlc3NlZCBpcnFzLiBCdXQgaXQgbXVzdCBub3QgcmVzdWx0IGluIGxvc2luZyBldmVudHMuCisgICAgICAgICAgKi8KKyAKKyAgICAgICAgIHJldHVybiAwOworIAorIG5vdF9kb25lOgorICAgICAgICAgaWYgKCFyZWNlaXZlZCkgeworCisgICAgICAgICAgICAgICAgIHJlY2VpdmVkID0gZGV2LT5xdW90YTsgLyogTm90IHRvIGhhcHBlbiAqLworICAgICAgICAgfQorICAgICAgICAgZGV2LT5xdW90YSAtPSByZWNlaXZlZDsKKyAgICAgICAgICpidWRnZXQgLT0gcmVjZWl2ZWQ7CisgCisgICAgICAgICBpZiAodHAtPmN1cl9yeCAtIHRwLT5kaXJ0eV9yeCA+IFJYX1JJTkdfU0laRS8yIHx8CisgICAgICAgICAgICAgdHAtPnJ4X2J1ZmZlcnNbdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFXS5za2IgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgdHVsaXBfcmVmaWxsX3J4KGRldik7CisgCisgICAgICAgICBpZiAodHAtPnJ4X2J1ZmZlcnNbdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFXS5za2IgPT0gTlVMTCkgZ290byBvb207CisgCisgICAgICAgICByZXR1cm4gMTsKKyAKKyAKKyBvb206ICAgIC8qIEV4ZWN1dGVkIHdpdGggUlggaW50cyBkaXNhYmxlZCAqLworIAorICAgICAgICAgCisgICAgICAgICAvKiBTdGFydCB0aW1lciwgc3RvcCBwb2xsaW5nLCBidXQgZG8gbm90IGVuYWJsZSByeCBpbnRlcnJ1cHRzLiAqLworICAgICAgICAgbW9kX3RpbWVyKCZ0cC0+b29tX3RpbWVyLCBqaWZmaWVzKzEpOworICAgICAgIAorICAgICAgICAgLyogVGhpbms6IHRpbWVyX3BlbmRpbmcoKSB3YXMgYW4gZXhwbGljaXQgc2lnbmF0dXJlIG9mIGJ1Zy4KKyAgICAgICAgICAqIFRpbWVyIGNhbiBiZSBwZW5kaW5nIG5vdyBidXQgZmlyZWQgYW5kIGNvbXBsZXRlZAorICAgICAgICAgICogYmVmb3JlIHdlIGRpZCBuZXRpZl9yeF9jb21wbGV0ZSgpLiBTZWU/IFdlIHdvdWxkIGxvc2UgaXQuICovCisgCisgICAgICAgICAvKiByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIHBvbGxpbmcgbGlzdCAqLworICAgICAgICAgbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKyAKKyAgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBDT05GSUdfVFVMSVBfTkFQSSAqLworCitzdGF0aWMgaW50IHR1bGlwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB0cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCByeF93b3JrX2xpbWl0ID0gdHAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0gdHAtPmN1cl9yeDsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCisJaWYgKHR1bGlwX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiB0dWxpcF9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJICAgdHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCBpcyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKCAhICh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY093bmVkKSkpIHsKKwkJczMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluIHR1bGlwX3J4KCksIGVudHJ5ICVkICU4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGVudHJ5LCBzdGF0dXMpOworCQlpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworCQkJaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKwkJCQkvKiBJbmdvcmUgZWFybGllciBidWZmZXJzLiAqLworCQkJCWlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKwkJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgIgorCQkJCQkJCSAgICJzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIHN0YXR1cyAlOC44eCFcbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCQl0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgUnhEZXNjRmF0YWxFcnIpIHsKKwkJCQkvKiBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCQlpZiAoc3RhdHVzICYgMHgwODkwKSB0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwMDQpIHRwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDAyKSB0cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwMDEpIHRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9ICgoc3RhdHVzID4+IDE2KSAmIDB4N2ZmKSAtIDQ7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChwa3RfbGVuID4gMTUxOCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCb2d1cyBwYWNrZXQgc2l6ZSBvZiAlZCAoJSN4KS5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbiwgcGt0X2xlbik7CisJCQkJcGt0X2xlbiA9IDE1MTg7CisJCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0KKyNlbmRpZgorCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgdHVsaXBfcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LAorCQkJCQkJCSAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCQkgICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKyNpZiAhIGRlZmluZWQoX19hbHBoYV9fKQorCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorCQkJCQkJIHBrdF9sZW4sIDApOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKyNlbHNlCisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCQkgICAgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKwkJCQkgICAgICAgcGt0X2xlbik7CisjZW5kaWYKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsCisJCQkJCQkJICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCSAgICAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsgCS8qIFBhc3MgdXAgdGhlIHNrYiBhbHJlYWR5IG9uIHRoZSBSeCByaW5nLiAqLworCQkJCWNoYXIgKnRlbXAgPSBza2JfcHV0KHNrYiA9IHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IsCisJCQkJCQkgICAgIHBrdF9sZW4pOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCQlpZiAodHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgIT0KKwkJCQkgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGZhdWx0OiBUaGUgc2tidWZmIGFkZHJlc3NlcyAiCisJCQkJCSAgICAgICAiZG8gbm90IG1hdGNoIGluIHR1bGlwX3J4OiAlMDh4IHZzLiAlTHggJXAgLyAlcC5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsCisJCQkJCSAgICAgICBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksCisJCQkJCSAgICAgICAobG9uZyBsb25nKXRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkgICAgICAgc2tiLT5oZWFkLCB0ZW1wKTsKKwkJCQl9CisjZW5kaWYKKworCQkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCQl0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCQl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IDA7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJCQluZXRpZl9yeChza2IpOworCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJdHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXRwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCXJlY2VpdmVkKys7CisJCWVudHJ5ID0gKCsrdHAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCXJldHVybiByZWNlaXZlZDsKK30KKyNlbmRpZiAgLyogQ09ORklHX1RVTElQX05BUEkgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGh5X2ludGVycnVwdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBfX2hwcGFfXworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNzcjEyID0gaW9yZWFkMzIodHAtPmJhc2VfYWRkciArIENTUjEyKSAmIDB4ZmY7CisKKwlpZiAoY3NyMTIgIT0gdHAtPmNzcjEyX3NoYWRvdykgeworCQkvKiBhY2sgaW50ZXJydXB0ICovCisJCWlvd3JpdGUzMihjc3IxMiB8IDB4MDIsIHRwLT5iYXNlX2FkZHIgKyBDU1IxMik7CisJCXRwLT5jc3IxMl9zaGFkb3cgPSBjc3IxMjsKKwkJLyogZG8gbGluayBjaGFuZ2Ugc3R1ZmYgKi8KKwkJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CisJCXR1bGlwX2NoZWNrX2R1cGxleChkZXYpOworCQlzcGluX3VubG9jaygmdHAtPmxvY2spOworCQkvKiBjbGVhciBpcnEgYWNrIGJpdCAqLworCQlpb3dyaXRlMzIoY3NyMTIgJiB+MHgwMiwgdHAtPmJhc2VfYWRkciArIENTUjEyKTsKKworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitpcnFyZXR1cm5fdCB0dWxpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2luc3RhbmNlOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBjc3I1OworCWludCBtaXNzZWQ7CisJaW50IHJ4ID0gMDsKKwlpbnQgdHggPSAwOworCWludCBvaSA9IDA7CisJaW50IG1heHJ4ID0gUlhfUklOR19TSVpFOworCWludCBtYXh0eCA9IFRYX1JJTkdfU0laRTsKKwlpbnQgbWF4b2kgPSBUWF9SSU5HX1NJWkU7CisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwlpbnQgcnhkID0gMDsKKyNlbHNlCisJaW50IGVudHJ5OworI2VuZGlmCisJdW5zaWduZWQgaW50IHdvcmtfY291bnQgPSB0dWxpcF9tYXhfaW50ZXJydXB0X3dvcms7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisJLyogTGV0J3Mgc2VlIHdoZXRoZXIgdGhlIGludGVycnVwdCByZWFsbHkgaXMgZm9yIHVzICovCisJY3NyNSA9IGlvcmVhZDMyKGlvYWRkciArIENTUjUpOworCisgICAgICAgIGlmICh0cC0+ZmxhZ3MgJiBIQVNfUEhZX0lSUSkgCisJICAgICAgICBoYW5kbGVkID0gcGh5X2ludGVycnVwdCAoZGV2KTsKKyAgICAKKwlpZiAoKGNzcjUgJiAoTm9ybWFsSW50cnxBYm5vcm1hbEludHIpKSA9PSAwKQorCQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKKworCXRwLT5uaXIrKzsKKworCWRvIHsKKworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisKKwkJaWYgKCFyeGQgJiYgKGNzcjUgJiAoUnhJbnRyIHwgUnhOb0J1ZikpKSB7CisJCQlyeGQrKzsKKwkJCS8qIE1hc2sgUlggaW50cnMgYW5kIGFkZCB0aGUgZGV2aWNlIHRvIHBvbGwgbGlzdC4gKi8KKwkJCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzJn5SeFBvbGxJbnQsIGlvYWRkciArIENTUjcpOworCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJCQorCQkJaWYgKCEoY3NyNSZ+KEFibm9ybWFsSW50cnxOb3JtYWxJbnRyfFJ4UG9sbEludHxUUExua1Bhc3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJfQorCQkKKyAgICAgICAgICAgICAgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyB3ZSBoYW5kbGUgaGVyZSBBU0FQCisgICAgICAgICAgICAgICAgICB0aGUgcG9sbCBmdW5jdGlvbiBkb2VzIFJ4IGFuZCBSeE5vQnVmIGFja2luZyAqLworCQkKKwkJaW93cml0ZTMyKGNzcjUgJiAweDAwMDFmZjNmLCBpb2FkZHIgKyBDU1I1KTsKKworI2Vsc2UgCisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQlpb3dyaXRlMzIoY3NyNSAmIDB4MDAwMWZmZmYsIGlvYWRkciArIENTUjUpOworCisKKwkJaWYgKGNzcjUgJiAoUnhJbnRyIHwgUnhOb0J1ZikpIHsKKwkJCQlyeCArPSB0dWxpcF9yeChkZXYpOworCQkJdHVsaXBfcmVmaWxsX3J4KGRldik7CisJCX0KKworI2VuZGlmIC8qICBDT05GSUdfVFVMSVBfTkFQSSAqLworCQkKKwkJaWYgKHR1bGlwX2RlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0ICBjc3I1PSUjOC44eCBuZXcgY3NyNT0lIzguOHguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgY3NyNSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkpOworCQkKKworCQlpZiAoY3NyNSAmIChUeE5vQnVmIHwgVHhEaWVkIHwgVHhJbnRyIHwgVGltZXJJbnQpKSB7CisJCQl1bnNpZ25lZCBpbnQgZGlydHlfdHg7CisKKwkJCXNwaW5fbG9jaygmdHAtPmxvY2spOworCisJCQlmb3IgKGRpcnR5X3R4ID0gdHAtPmRpcnR5X3R4OyB0cC0+Y3VyX3R4IC0gZGlydHlfdHggPiAwOworCQkJCSBkaXJ0eV90eCsrKSB7CisJCQkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOwkJCS8qIEl0IHN0aWxsIGhhcyBub3QgYmVlbiBUeGVkICovCisKKwkJCQkvKiBDaGVjayBmb3IgUnggZmlsdGVyIHNldHVwIGZyYW1lcy4gKi8KKwkJCQlpZiAodHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9PSBOVUxMKSB7CisJCQkJCS8qIHRlc3QgYmVjYXVzZSBkdW1teSBmcmFtZXMgbm90IG1hcHBlZCAqLworCQkJCQlpZiAodHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcpCisJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCQkJCSB0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCQkgc2l6ZW9mKHRwLT5zZXR1cF9mcmFtZSksCisJCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoc3RhdHVzICYgMHg4MDAwKSB7CisJCQkJCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgorCQkJCQl0cC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiAweDQxMDQpIHRwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgMHgwQzAwKSB0cC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MDIwMCkgdHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MDAwMikgdHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCWlmICgoc3RhdHVzICYgMHgwMDgwKSAmJiB0cC0+ZnVsbF9kdXBsZXggPT0gMCkKKwkJCQkJCXRwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHAtPnN0YXRzLnR4X2J5dGVzICs9CisJCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiLT5sZW47CisJCQkJCXRwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgPj4gMykgJiAxNTsKKwkJCQkJdHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQl9CisKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCSB0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiLT5sZW4sCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJZGV2X2tmcmVlX3NrYl9pcnEodHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYik7CisJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCQkJCXR4Kys7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHRwLT5jdXJfdHggLSBkaXJ0eV90eCA+IFRYX1JJTkdfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgZGlydHlfdHgsIHRwLT5jdXJfdHgpOworCQkJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAodHAtPmN1cl90eCAtIGRpcnR5X3R4IDwgVFhfUklOR19TSVpFIC0gMikKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJaWYgKGNzcjUgJiBUeERpZWQpIHsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhlIHRyYW5zbWl0dGVyIHN0b3BwZWQuIgorCQkJCQkJICAgIiAgQ1NSNSBpcyAleCwgQ1NSNiAleCwgbmV3IENTUjYgJXguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBjc3I1LCBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwgdHAtPmNzcjYpOworCQkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQl9CisJCQlzcGluX3VubG9jaygmdHAtPmxvY2spOworCQl9CisKKwkJLyogTG9nIGVycm9ycy4gKi8KKwkJaWYgKGNzcjUgJiBBYm5vcm1hbEludHIpIHsJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeSBiaXQuICovCisJCQlpZiAoY3NyNSA9PSAweGZmZmZmZmZmKQorCQkJCWJyZWFrOworCQkJaWYgKGNzcjUgJiBUeEphYmJlcikgdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKGNzcjUgJiBUeEZJRk9VbmRlcmZsb3cpIHsKKwkJCQlpZiAoKHRwLT5jc3I2ICYgMHhDMDAwKSAhPSAweEMwMDApCisJCQkJCXRwLT5jc3I2ICs9IDB4NDAwMDsJLyogQnVtcCB1cCB0aGUgVHggdGhyZXNob2xkICovCisJCQkJZWxzZQorCQkJCQl0cC0+Y3NyNiB8PSAweDAwMjAwMDAwOyAgLyogU3RvcmUtbi1mb3J3YXJkLiAqLworCQkJCS8qIFJlc3RhcnQgdGhlIHRyYW5zbWl0IHByb2Nlc3MuICovCisJCQkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMSk7CisJCQl9CisJCQlpZiAoY3NyNSAmIChSeERpZWQgfCBSeE5vQnVmKSkgeworCQkJCWlmICh0cC0+ZmxhZ3MgJiBDT01FVF9NQUNfQUREUikgeworCQkJCQlpb3dyaXRlMzIodHAtPm1jX2ZpbHRlclswXSwgaW9hZGRyICsgMHhBQyk7CisJCQkJCWlvd3JpdGUzMih0cC0+bWNfZmlsdGVyWzFdLCBpb2FkZHIgKyAweEIwKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY3NyNSAmIFJ4RGllZCkgewkJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCQkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQl0dWxpcF9zdGFydF9yeHR4KHRwKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBOQjogdDIxMTQyX2xua19jaGFuZ2UoKSBkb2VzIGEgZGVsX3RpbWVyX3N5bmMoKSwgc28gYmUgY2FyZWZ1bCBpZiB0aGlzCisJCQkgKiBjYWxsIGlzIGV2ZXIgZG9uZSB1bmRlciB0aGUgc3BpbmxvY2sKKwkJCSAqLworCQkJaWYgKGNzcjUgJiAoVFBMbmtQYXNzIHwgVFBMbmtGYWlsIHwgMHgwODAwMDAwMCkpIHsKKwkJCQlpZiAodHAtPmxpbmtfY2hhbmdlKQorCQkJCQkodHAtPmxpbmtfY2hhbmdlKShkZXYsIGNzcjUpOworCQkJfQorCQkJaWYgKGNzcjUgJiBTeXRlbUVycm9yKSB7CisJCQkJaW50IGVycm9yID0gKGNzcjUgPj4gMjMpICYgNzsKKwkJCQkvKiBvb3BzLCB3ZSBoaXQgYSBQQ0kgZXJyb3IuICBUaGUgY29kZSBwcm9kdWNlZCBjb3JyZXNwb25kcworCQkJCSAqIHRvIHRoZSByZWFzb246CisJCQkJICogIDAgLSBwYXJpdHkgZXJyb3IKKwkJCQkgKiAgMSAtIG1hc3RlciBhYm9ydAorCQkJCSAqICAyIC0gdGFyZ2V0IGFib3J0CisJCQkJICogTm90ZSB0aGF0IG9uIHBhcml0eSBlcnJvciwgd2Ugc2hvdWxkIGRvIGEgc29mdHdhcmUgcmVzZXQKKwkJCQkgKiBvZiB0aGUgY2hpcCB0byBnZXQgaXQgYmFjayBpbnRvIGEgc2FuZSBzdGF0ZSAoYWNjb3JkaW5nCisJCQkJICogdG8gdGhlIDIxMTQyLzMgZG9jcyB0aGF0IGlzKS4KKwkJCQkgKiAgIC0tIHJtaworCQkJCSAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICglbHUpIFN5c3RlbSBFcnJvciBvY2N1cnJlZCAoJWQpXG4iLAorCQkJCQlkZXYtPm5hbWUsIHRwLT5uaXIsIGVycm9yKTsKKwkJCX0KKwkJCS8qIENsZWFyIGFsbCBlcnJvciBzb3VyY2VzLCBpbmNsdWRlZCB1bmRvY3VtZW50ZWQgb25lcyEgKi8KKwkJCWlvd3JpdGUzMigweDA4MDBmN2JhLCBpb2FkZHIgKyBDU1I1KTsKKwkJCW9pKys7CisJCX0KKwkJaWYgKGNzcjUgJiBUaW1lckludCkgeworCisJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlLWVuYWJsaW5nIGludGVycnVwdHMsICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBjc3I1KTsKKwkJCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCBpb2FkZHIgKyBDU1I3KTsKKwkJCXRwLT50dGltZXIgPSAwOworCQkJb2krKzsKKwkJfQorCQlpZiAodHggPiBtYXh0eCB8fCByeCA+IG1heHJ4IHx8IG9pID4gbWF4b2kpIHsKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgZHVyaW5nIGFuIGludGVycnVwdCwgIgorCQkJCQkgICAiY3NyNT0weCU4Ljh4LiAoJWx1KSAoJWQsJWQsJWQpXG4iLCBkZXYtPm5hbWUsIGNzcjUsIHRwLT5uaXIsIHR4LCByeCwgb2kpOworCisgICAgICAgICAgICAgICAgICAgICAgIC8qIEFja25vd2xlZGdlIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMigweDgwMDFmZmZmLCBpb2FkZHIgKyBDU1I1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+ZmxhZ3MgJiBIQVNfSU5UUl9NSVRJR0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAvKiBKb3NpcCBMb25jYXJpYyBhdCBJQ0FTRSBkaWQgZXh0ZW5zaXZlIGV4cGVyaW1lbnRhdGlvbgorCQkJdG8gZGV2ZWxvcCBhIGdvb2QgaW50ZXJydXB0IG1pdGlnYXRpb24gc2V0dGluZy4qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzIoMHg4YjI0MDAwMCwgaW9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQkJCS8qIHRoZSBMQzgyQzE2OCBkb2Vzbid0IGhhdmUgYSBodyB0aW1lci4qLworCQkJCWlvd3JpdGUzMigweDAwLCBpb2FkZHIgKyBDU1I3KTsKKwkJCQltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKEhaLzUwKSk7CisJCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXNrIGFsbCBpbnRlcnJ1cHRpbmcgc291cmNlcywgc2V0IHRpbWVyIHRvCisJCQkJcmUtZW5hYmxlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzIoKCh+Y3NyNSkgJiAweDAwMDFlYmVmKSB8IEFibm9ybWFsSW50ciB8IFRpbWVySW50LCBpb2FkZHIgKyBDU1I3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKDB4MDAxMiwgaW9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJYnJlYWs7CisJCX0KKworCQl3b3JrX2NvdW50LS07CisJCWlmICh3b3JrX2NvdW50ID09IDApCisJCQlicmVhazsKKworCQljc3I1ID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSk7CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCQlpZiAocnhkKQorCQkJY3NyNSAmPSB+UnhQb2xsSW50OworCX0gd2hpbGUgKChjc3I1ICYgKFR4Tm9CdWYgfCAKKwkJCSAgVHhEaWVkIHwgCisJCQkgIFR4SW50ciB8IAorCQkJICBUaW1lckludCB8CisJCQkgIC8qIEFibm9ybWFsIGludHIuICovCisJCQkgIFJ4RGllZCB8IAorCQkJICBUeEZJRk9VbmRlcmZsb3cgfCAKKwkJCSAgVHhKYWJiZXIgfCAKKwkJCSAgVFBMbmtGYWlsIHwgIAorCQkJICBTeXRlbUVycm9yICkpICE9IDApOworI2Vsc2UgCisJfSB3aGlsZSAoKGNzcjUgJiAoTm9ybWFsSW50cnxBYm5vcm1hbEludHIpKSAhPSAwKTsKKworCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCisJLyogY2hlY2sgaWYgdGhlIGNhcmQgaXMgaW4gc3VzcGVuZCBtb2RlICovCisJZW50cnkgPSB0cC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJaWYgKHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IgPT0gTlVMTCkgeworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGluIHJ4IHN1c3BlbmQgbW9kZTogKCVsdSkgKHRwLT5jdXJfcnggPSAldSwgdHRpbWVyID0gJWQsIHJ4ID0gJWQpIGdvL3N0YXkgaW4gc3VzcGVuZCBtb2RlXG4iLCBkZXYtPm5hbWUsIHRwLT5uaXIsIHRwLT5jdXJfcngsIHRwLT50dGltZXIsIHJ4KTsKKwkJaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJCQlpb3dyaXRlMzIoMHgwMCwgaW9hZGRyICsgQ1NSNyk7CisJCQltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKEhaLzUwKSk7CisJCX0gZWxzZSB7CisJCQlpZiAodHAtPnR0aW1lciA9PSAwIHx8IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxMSkgJiAweGZmZmYpID09IDApIHsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW4gcnggc3VzcGVuZCBtb2RlOiAoJWx1KSBzZXQgdGltZXJcbiIsIGRldi0+bmFtZSwgdHAtPm5pcik7CisJCQkJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMgfCBUaW1lckludCwKKwkJCQkJaW9hZGRyICsgQ1NSNyk7CisJCQkJaW93cml0ZTMyKFRpbWVySW50LCBpb2FkZHIgKyBDU1I1KTsKKwkJCQlpb3dyaXRlMzIoMTIsIGlvYWRkciArIENTUjExKTsKKwkJCQl0cC0+dHRpbWVyID0gMTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfVFVMSVBfTkFQSSAqLworCisJaWYgKChtaXNzZWQgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I4KSAmIDB4MWZmZmYpKSB7CisJCXRwLT5zdGF0cy5yeF9kcm9wcGVkICs9IG1pc3NlZCAmIDB4MTAwMDAgPyAweDEwMDAwIDogbWlzc2VkOworCX0KKworCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzcjU9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZTA5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisKKworLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMgb3IgZnV0dXJlIDY2TWh6IFBDSS4gKi8KKyNkZWZpbmUgbWRpb19kZWxheSgpIGlvcmVhZDMyKG1kaW9fYWRkcikKKworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIEl0IGlzIGp1c3QgZGlmZmVyZW50IGVub3VnaCBmcm9tIHRoZSBFRVBST00gcHJvdG9jb2wKKyAgIHRvIG5vdCBzaGFyZSBjb2RlLiAgVGhlIG1heGl1bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gKi8KKyNkZWZpbmUgTURJT19TSElGVF9DTEsJCTB4MTAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMAkweDAwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEJMHgyMDAwMAorI2RlZmluZSBNRElPX0VOQgkJMHgwMDAwMCAvKiBJZ25vcmUgdGhlIDB4MDIwMDAgZGF0YWJvb2sgc2V0dGluZy4gKi8KKyNkZWZpbmUgTURJT19FTkJfSU4JCTB4NDAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJCTB4ODAwMDAKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY29tZXRfbWlpcmVnMm9mZnNldFszMl0gPSB7CisJMHhCNCwgMHhCOCwgMHhCQywgMHhDMCwgIDB4QzQsIDB4QzgsIDB4Q0MsIDAsICAwLDAsMCwwLCAgMCwwLDAsMCwKKwkwLDB4RDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDAsIDAsIDB4RDQsIDB4RDgsIDB4REMsIH07CisKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworaW50IHR1bGlwX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgcmVhZF9jbWQgPSAoMHhmNiA8PCAxMCkgfCAoKHBoeV9pZCAmIDB4MWYpIDw8IDUpIHwgbG9jYXRpb247CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxvY2F0aW9uICYgfjB4MWYpCisJCXJldHVybiAweGZmZmY7CisKKwlpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQgICYmICBwaHlfaWQgPT0gMzApIHsKKwkJaWYgKGNvbWV0X21paXJlZzJvZmZzZXRbbG9jYXRpb25dKQorCQkJcmV0dXJuIGlvcmVhZDMyKGlvYWRkciArIGNvbWV0X21paXJlZzJvZmZzZXRbbG9jYXRpb25dKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJCWludCBpID0gMTAwMDsKKwkJaW93cml0ZTMyKDB4NjAwMjAwMDAgKyAocGh5X2lkPDwyMykgKyAobG9jYXRpb248PDE4KSwgaW9hZGRyICsgMHhBMCk7CisJCWlvcmVhZDMyKGlvYWRkciArIDB4QTApOworCQlpb3JlYWQzMihpb2FkZHIgKyAweEEwKTsKKwkJd2hpbGUgKC0taSA+IDApIHsKKwkJCWJhcnJpZXIoKTsKKwkJCWlmICggISAoKHJldHZhbCA9IGlvcmVhZDMyKGlvYWRkciArIDB4QTApKSAmIDB4ODAwMDAwMDApKQorCQkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsICYgMHhmZmZmOworCX0KKworCWlmKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgdHAtPnJldmlzaW9uID49IDB4NDApIHsKKwkJaW50IHZhbHVlOworCQlpbnQgaSA9IDEwMDA7CisJCQorCQl2YWx1ZSA9IGlvcmVhZDMyKGlvYWRkciArIENTUjkpOworCQlpb3dyaXRlMzIodmFsdWUgJiAweEZGRUZGRkZGLCBpb2FkZHIgKyBDU1I5KTsKKwkJCisJCXZhbHVlID0gKHBoeV9pZCA8PCAyMSkgfCAobG9jYXRpb24gPDwgMTYpIHwgMHgwODAwMDAwMDsKKwkJaW93cml0ZTMyKHZhbHVlLCBpb2FkZHIgKyBDU1IxMCk7CisJCQorCQl3aGlsZSgtLWkgPiAwKSB7CisJCQltZGlvX2RlbGF5KCk7CisJCQlpZihpb3JlYWQzMihpb2FkZHIgKyBDU1IxMCkgJiAweDEwMDAwMDAwKQorCQkJCWJyZWFrOworCQl9CisJCXJldHZhbCA9IGlvcmVhZDMyKGlvYWRkciArIENTUjEwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXR2YWwgJiAweEZGRkY7CisJfQorCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogMDsKKworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQzMihtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCXJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKwordm9pZCB0dWxpcF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWludCBjbWQgPSAoMHg1MDAyIDw8IDE2KSB8ICgocGh5X2lkICYgMHgxZikgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCAodmFsICYgMHhmZmZmKTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdm9pZCBfX2lvbWVtICptZGlvX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobG9jYXRpb24gJiB+MHgxZikKKwkJcmV0dXJuOworCisJaWYgKHRwLT5jaGlwX2lkID09IENPTUVUICYmIHBoeV9pZCA9PSAzMCkgeworCQlpZiAoY29tZXRfbWlpcmVnMm9mZnNldFtsb2NhdGlvbl0pCisJCQlpb3dyaXRlMzIodmFsLCBpb2FkZHIgKyBjb21ldF9taWlyZWcyb2Zmc2V0W2xvY2F0aW9uXSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJCWludCBpID0gMTAwMDsKKwkJaW93cml0ZTMyKGNtZCwgaW9hZGRyICsgMHhBMCk7CisJCWRvIHsKKwkJCWJhcnJpZXIoKTsKKwkJCWlmICggISAoaW9yZWFkMzIoaW9hZGRyICsgMHhBMCkgJiAweDgwMDAwMDAwKSkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1pID4gMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmICh0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmIHRwLT5yZXZpc2lvbiA+PSAweDQwKSB7CisJCWludCB2YWx1ZTsKKwkJaW50IGkgPSAxMDAwOworCQkKKwkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKKwkJaW93cml0ZTMyKHZhbHVlICYgMHhGRkVGRkZGRiwgaW9hZGRyICsgQ1NSOSk7CisJCQorCQl2YWx1ZSA9IChwaHlfaWQgPDwgMjEpIHwgKGxvY2F0aW9uIDw8IDE2KSB8IDB4MDQwMDAwMDAgfCAodmFsICYgMHhGRkZGKTsKKwkJaW93cml0ZTMyKHZhbHVlLCBpb2FkZHIgKyBDU1IxMCk7CisJCQorCQl3aGlsZSgtLWkgPiAwKSB7CisJCQlpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTApICYgMHgxMDAwMDAwMCkKKwkJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwl9CisJCQorCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgMzIgbG9naWMgb25lcy4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworfQorCisKKy8qIFNldCB1cCB0aGUgdHJhbnNjZWl2ZXIgY29udHJvbCByZWdpc3RlcnMgZm9yIHRoZSBzZWxlY3RlZCBtZWRpYSB0eXBlLiAqLwordm9pZCB0dWxpcF9zZWxlY3RfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0dXApCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJc3RydWN0IG1lZGlhdGFibGUgKm10YWJsZSA9IHRwLT5tdGFibGU7CisJdTMyIG5ld19jc3I2OworCWludCBpOworCisJaWYgKG10YWJsZSkgeworCQlzdHJ1Y3QgbWVkaWFsZWFmICptbGVhZiA9ICZtdGFibGUtPm1sZWFmW3RwLT5jdXJfaW5kZXhdOworCQl1bnNpZ25lZCBjaGFyICpwID0gbWxlYWYtPmxlYWZkYXRhOworCQlzd2l0Y2ggKG1sZWFmLT50eXBlKSB7CisJCWNhc2UgMDoJCQkJCS8qIDIxMTQwIG5vbi1NSUkgeGN2ci4gKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVc2luZyBhIDIxMTQwIG5vbi1NSUkgdHJhbnNjZWl2ZXIiCisJCQkJCSAgICIgd2l0aCBjb250cm9sIHNldHRpbmcgJTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBbMV0pOworCQkJZGV2LT5pZl9wb3J0ID0gcFswXTsKKwkJCWlmIChzdGFydHVwKQorCQkJCWlvd3JpdGUzMihtdGFibGUtPmNzcjEyZGlyIHwgMHgxMDAsIGlvYWRkciArIENTUjEyKTsKKwkJCWlvd3JpdGUzMihwWzFdLCBpb2FkZHIgKyBDU1IxMik7CisJCQluZXdfY3NyNiA9IDB4MDIwMDAwMDAgfCAoKHBbMl0gJiAweDcxKSA8PCAxOCk7CisJCQlicmVhazsKKwkJY2FzZSAyOiBjYXNlIDQ6IHsKKwkJCXUxNiBzZXR1cFs1XTsKKwkJCXUzMiBjc3IxM3ZhbCwgY3NyMTR2YWwsIGNzcjE1ZGlyLCBjc3IxNXZhbDsKKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQkJc2V0dXBbaV0gPSBnZXRfdTE2KCZwW2kqMiArIDFdKTsKKworCQkJZGV2LT5pZl9wb3J0ID0gcFswXSAmIE1FRElBX01BU0s7CisJCQlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUFsd2F5c0ZEKQorCQkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisKKwkJCWlmIChzdGFydHVwICYmIG10YWJsZS0+aGFzX3Jlc2V0KSB7CisJCQkJc3RydWN0IG1lZGlhbGVhZiAqcmxlYWYgPSAmbXRhYmxlLT5tbGVhZlttdGFibGUtPmhhc19yZXNldF07CisJCQkJdW5zaWduZWQgY2hhciAqcnN0ID0gcmxlYWYtPmxlYWZkYXRhOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIHRoZSB0cmFuc2NlaXZlci5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUpOworCQkJCWZvciAoaSA9IDA7IGkgPCByc3RbMF07IGkrKykKKwkJCQkJaW93cml0ZTMyKGdldF91MTYocnN0ICsgMSArIChpPDwxKSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKwkJCX0KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAyMTE0MyBub24tTUlJICVzIHRyYW5zY2VpdmVyIGNvbnRyb2wgIgorCQkJCQkgICAiJTQuNHgvJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBzZXR1cFswXSwgc2V0dXBbMV0pOworCQkJaWYgKHBbMF0gJiAweDQwKSB7CS8qIFNJQSAoQ1NSMTMtMTUpIHNldHVwIHZhbHVlcyBhcmUgcHJvdmlkZWQuICovCisJCQkJY3NyMTN2YWwgPSBzZXR1cFswXTsKKwkJCQljc3IxNHZhbCA9IHNldHVwWzFdOworCQkJCWNzcjE1ZGlyID0gKHNldHVwWzNdPDwxNikgfCBzZXR1cFsyXTsKKwkJCQljc3IxNXZhbCA9IChzZXR1cFs0XTw8MTYpIHwgc2V0dXBbMl07CisJCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCQlpb3dyaXRlMzIoY3NyMTR2YWwsIGlvYWRkciArIENTUjE0KTsKKwkJCQlpb3dyaXRlMzIoY3NyMTVkaXIsIGlvYWRkciArIENTUjE1KTsJLyogRGlyZWN0aW9uICovCisJCQkJaW93cml0ZTMyKGNzcjE1dmFsLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERhdGEgKi8KKwkJCQlpb3dyaXRlMzIoY3NyMTN2YWwsIGlvYWRkciArIENTUjEzKTsKKwkJCX0gZWxzZSB7CisJCQkJY3NyMTN2YWwgPSAxOworCQkJCWNzcjE0dmFsID0gMDsKKwkJCQljc3IxNWRpciA9IChzZXR1cFswXTw8MTYpIHwgMHgwMDA4OworCQkJCWNzcjE1dmFsID0gKHNldHVwWzFdPDwxNikgfCAweDAwMDg7CisJCQkJaWYgKGRldi0+aWZfcG9ydCA8PSA0KQorCQkJCQljc3IxNHZhbCA9IHQyMTE0Ml9jc3IxNFtkZXYtPmlmX3BvcnRdOworCQkJCWlmIChzdGFydHVwKSB7CisJCQkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQkJCWlvd3JpdGUzMihjc3IxNHZhbCwgaW9hZGRyICsgQ1NSMTQpOworCQkJCX0KKwkJCQlpb3dyaXRlMzIoY3NyMTVkaXIsIGlvYWRkciArIENTUjE1KTsJLyogRGlyZWN0aW9uICovCisJCQkJaW93cml0ZTMyKGNzcjE1dmFsLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERhdGEgKi8KKwkJCQlpZiAoc3RhcnR1cCkgaW93cml0ZTMyKGNzcjEzdmFsLCBpb2FkZHIgKyBDU1IxMyk7CisJCQl9CisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIFNldHRpbmcgQ1NSMTUgdG8gJTguOHgvJTguOHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGNzcjE1ZGlyLCBjc3IxNXZhbCk7CisJCQlpZiAobWxlYWYtPnR5cGUgPT0gNCkKKwkJCQluZXdfY3NyNiA9IDB4ODIwMjAwMDAgfCAoKHNldHVwWzJdICYgMHg3MSkgPDwgMTgpOworCQkJZWxzZQorCQkJCW5ld19jc3I2ID0gMHg4MjQyMDAwMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogY2FzZSAzOiB7CisJCQlpbnQgcGh5X251bSA9IHBbMF07CisJCQlpbnQgaW5pdF9sZW5ndGggPSBwWzFdOworCQkJdTE2ICptaXNjX2luZm8sIHRtcF9pbmZvOworCisJCQlkZXYtPmlmX3BvcnQgPSAxMTsKKwkJCW5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKwkJCWlmIChtbGVhZi0+dHlwZSA9PSAzKSB7CS8qIDIxMTQyICovCisJCQkJdTE2ICppbml0X3NlcXVlbmNlID0gKHUxNiopKHArMik7CisJCQkJdTE2ICpyZXNldF9zZXF1ZW5jZSA9ICYoKHUxNiopKHArMykpW2luaXRfbGVuZ3RoXTsKKwkJCQlpbnQgcmVzZXRfbGVuZ3RoID0gcFsyICsgaW5pdF9sZW5ndGgqMl07CisJCQkJbWlzY19pbmZvID0gcmVzZXRfc2VxdWVuY2UgKyByZXNldF9sZW5ndGg7CisJCQkJaWYgKHN0YXJ0dXApCisJCQkJCWZvciAoaSA9IDA7IGkgPCByZXNldF9sZW5ndGg7IGkrKykKKwkJCQkJCWlvd3JpdGUzMihnZXRfdTE2KCZyZXNldF9zZXF1ZW5jZVtpXSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgaW5pdF9sZW5ndGg7IGkrKykKKwkJCQkJaW93cml0ZTMyKGdldF91MTYoJmluaXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisJCQl9IGVsc2UgeworCQkJCXU4ICppbml0X3NlcXVlbmNlID0gcCArIDI7CisJCQkJdTggKnJlc2V0X3NlcXVlbmNlID0gcCArIDMgKyBpbml0X2xlbmd0aDsKKwkJCQlpbnQgcmVzZXRfbGVuZ3RoID0gcFsyICsgaW5pdF9sZW5ndGhdOworCQkJCW1pc2NfaW5mbyA9ICh1MTYqKShyZXNldF9zZXF1ZW5jZSArIHJlc2V0X2xlbmd0aCk7CisJCQkJaWYgKHN0YXJ0dXApIHsKKwkJCQkJaW93cml0ZTMyKG10YWJsZS0+Y3NyMTJkaXIgfCAweDEwMCwgaW9hZGRyICsgQ1NSMTIpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVzZXRfbGVuZ3RoOyBpKyspCisJCQkJCQlpb3dyaXRlMzIocmVzZXRfc2VxdWVuY2VbaV0sIGlvYWRkciArIENTUjEyKTsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCisJCQkJCWlvd3JpdGUzMihpbml0X3NlcXVlbmNlW2ldLCBpb2FkZHIgKyBDU1IxMik7CisJCQl9CisJCQl0bXBfaW5mbyA9IGdldF91MTYoJm1pc2NfaW5mb1sxXSk7CisJCQlpZiAodG1wX2luZm8pCisJCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9udW1dID0gdG1wX2luZm8gfCAxOworCQkJaWYgKHRtcF9pbmZvICYmIHN0YXJ0dXAgPCAyKSB7CisJCQkJaWYgKHRwLT5taWlfYWR2ZXJ0aXNlID09IDApCisJCQkJCXRwLT5taWlfYWR2ZXJ0aXNlID0gdHAtPmFkdmVydGlzaW5nW3BoeV9udW1dOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIEFkdmVydGlzaW5nICU0LjR4IG9uIE1JSSAlZC5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIHRwLT5taWlfYWR2ZXJ0aXNlLCB0cC0+cGh5c1twaHlfbnVtXSk7CisJCQkJdHVsaXBfbWRpb193cml0ZShkZXYsIHRwLT5waHlzW3BoeV9udW1dLCA0LCB0cC0+bWlpX2FkdmVydGlzZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIDU6IGNhc2UgNjogeworCQkJdTE2IHNldHVwWzVdOworCisJCQluZXdfY3NyNiA9IDA7IC8qIEZJWE1FICovCisKKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQkJc2V0dXBbaV0gPSBnZXRfdTE2KCZwW2kqMiArIDFdKTsKKworCQkJaWYgKHN0YXJ0dXAgJiYgbXRhYmxlLT5oYXNfcmVzZXQpIHsKKwkJCQlzdHJ1Y3QgbWVkaWFsZWFmICpybGVhZiA9ICZtdGFibGUtPm1sZWFmW210YWJsZS0+aGFzX3Jlc2V0XTsKKwkJCQl1bnNpZ25lZCBjaGFyICpyc3QgPSBybGVhZi0+bGVhZmRhdGE7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZXNldHRpbmcgdGhlIHRyYW5zY2VpdmVyLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSk7CisJCQkJZm9yIChpID0gMDsgaSA8IHJzdFswXTsgaSsrKQorCQkJCQlpb3dyaXRlMzIoZ2V0X3UxNihyc3QgKyAxICsgKGk8PDEpKSA8PCAxNiwgaW9hZGRyICsgQ1NSMTUpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgSW52YWxpZCBtZWRpYSB0YWJsZSBzZWxlY3Rpb24gJWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1sZWFmLT50eXBlKTsKKwkJCW5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKwkJfQorCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVc2luZyBtZWRpYSB0eXBlICVzLCBDU1IxMiBpcyAlMi4yeC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikgJiAweGZmKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJCWlmIChzdGFydHVwICYmICEgdHAtPm1lZGlhbG9jaykKKwkJCWRldi0+aWZfcG9ydCA9IHRwLT5taWlfY250ID8gMTEgOiAwOworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQTklDIFBIWSBzdGF0dXMgaXMgJTMuM3gsIG1lZGlhICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIDB4QjgpLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJCWlmICh0cC0+bWlpX2NudCkgeworCQkJbmV3X2NzcjYgPSAweDgxMEMwMDAwOworCQkJaW93cml0ZTMyKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworCQkJaW93cml0ZTMyKDB4MDIwMUIwN0EsIGlvYWRkciArIDB4QjgpOworCQl9IGVsc2UgaWYgKHN0YXJ0dXApIHsKKwkJCS8qIFN0YXJ0IHdpdGggMTBtYnBzIHRvIGRvIGF1dG9uZWdvdGlhdGlvbi4gKi8KKwkJCWlvd3JpdGUzMigweDMyLCBpb2FkZHIgKyBDU1IxMik7CisJCQluZXdfY3NyNiA9IDB4MDA0MjAwMDA7CisJCQlpb3dyaXRlMzIoMHgwMDAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisJCQlpb3dyaXRlMzIoMHgwMjAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisJCX0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDMgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNSkgeworCQkJaW93cml0ZTMyKDB4MzMsIGlvYWRkciArIENTUjEyKTsKKwkJCW5ld19jc3I2ID0gMHgwMTg2MDAwMDsKKwkJCS8qIFRyaWdnZXIgYXV0b25lZ290aWF0aW9uLiAqLworCQkJaW93cml0ZTMyKHN0YXJ0dXAgPyAweDAyMDFGODY4IDogMHgwMDAxRjg2OCwgaW9hZGRyICsgMHhCOCk7CisJCX0gZWxzZSB7CisJCQlpb3dyaXRlMzIoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworCQkJbmV3X2NzcjYgPSAweDAwNDIwMDAwOworCQkJaW93cml0ZTMyKDB4MUYwNzgsIGlvYWRkciArIDB4QjgpOworCQl9CisJfSBlbHNlIHsJCQkJCS8qIFVua25vd24gY2hpcCB0eXBlIHdpdGggbm8gbWVkaWEgdGFibGUuICovCisJCWlmICh0cC0+ZGVmYXVsdF9wb3J0ID09IDApCisJCQlkZXYtPmlmX3BvcnQgPSB0cC0+bWlpX2NudCA/IDExIDogMzsKKwkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkJbmV3X2NzcjYgPSAweDAyMEUwMDAwOworCQl9IGVsc2UgaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc0Z4KSB7CisJCQluZXdfY3NyNiA9IDB4MDI4NjAwMDA7CisJCX0gZWxzZQorCQkJbmV3X2NzcjYgPSAweDAzODYwMDAwOworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBtZWRpYSBkZXNjcmlwdGlvbiB0YWJsZSwgYXNzdW1pbmcgIgorCQkJCSAgICIlcyB0cmFuc2NlaXZlciwgQ1NSMTIgJTIuMnguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpKTsKKwl9CisKKwl0cC0+Y3NyNiA9IG5ld19jc3I2IHwgKHRwLT5jc3I2ICYgMHhmZGZmKSB8ICh0cC0+ZnVsbF9kdXBsZXggPyAweDAyMDAgOiAwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgIENoZWNrIHRoZSBNSUkgbmVnb3RpYXRlZCBkdXBsZXggYW5kIGNoYW5nZSB0aGUgQ1NSNiBzZXR0aW5nIGlmCisgIHJlcXVpcmVkLgorICBSZXR1cm4gMCBpZiBldmVyeXRoaW5nIGlzIE9LLgorICBSZXR1cm4gPCAwIGlmIHRoZSB0cmFuc2NlaXZlciBpcyBtaXNzaW5nIG9yIGhhcyBubyBsaW5rIGJlYXQuCisgICovCitpbnQgdHVsaXBfY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYm1zciwgbHBhLCBuZWdvdGlhdGVkLCBuZXdfY3NyNjsKKworCWJtc3IgPSB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNU1IpOworCWxwYSA9IHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIHN0YXR1cyAlNC40eCwgTGluayBwYXJ0bmVyIHJlcG9ydCAiCisJCQkgICAiJTQuNHguXG4iLCBkZXYtPm5hbWUsIGJtc3IsIGxwYSk7CisJaWYgKGJtc3IgPT0gMHhmZmZmKQorCQlyZXR1cm4gLTI7CisJaWYgKChibXNyICYgQk1TUl9MU1RBVFVTKSA9PSAwKSB7CisJCWludCBuZXdfYm1zciA9IHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1TUik7CisJCWlmICgobmV3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpID09IDApIHsKKwkJCWlmICh0dWxpcF9kZWJ1ZyAgPiAxKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBsaW5rIGJlYXQgb24gdGhlIE1JSSBpbnRlcmZhY2UsIgorCQkJCQkgICAiIHN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgbmV3X2Jtc3IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCW5lZ290aWF0ZWQgPSBscGEgJiB0cC0+YWR2ZXJ0aXNpbmdbMF07CisJdHAtPmZ1bGxfZHVwbGV4ID0gbWlpX2R1cGxleCh0cC0+ZnVsbF9kdXBsZXhfbG9jaywgbmVnb3RpYXRlZCk7CisKKwluZXdfY3NyNiA9IHRwLT5jc3I2OworCisJaWYgKG5lZ290aWF0ZWQgJiBMUEFfMTAwKSBuZXdfY3NyNiAmPSB+VHhUaHJlc2hvbGQ7CisJZWxzZQkJCSAgbmV3X2NzcjYgfD0gVHhUaHJlc2hvbGQ7CisJaWYgKHRwLT5mdWxsX2R1cGxleCkgbmV3X2NzcjYgfD0gRnVsbER1cGxleDsKKwllbHNlCQkgICAgIG5ld19jc3I2ICY9IH5GdWxsRHVwbGV4OworCisJaWYgKG5ld19jc3I2ICE9IHRwLT5jc3I2KSB7CisJCXRwLT5jc3I2ID0gbmV3X2NzcjY7CisJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisKKwkJaWYgKHR1bGlwX2RlYnVnID4gMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkiCisJCQkJICAgIiMlZCBsaW5rIHBhcnRuZXIgY2FwYWJpbGl0eSBvZiAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsCisJCQkJICAgdHAtPnBoeXNbMF0sIGxwYSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIF9fZGV2aW5pdCB0dWxpcF9maW5kX21paSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJvYXJkX2lkeCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwaHluLCBwaHlfaWR4ID0gMDsKKwlpbnQgbWlpX3JlZzA7CisJaW50IG1paV9hZHZlcnQ7CisJdW5zaWduZWQgaW50IHRvX2FkdmVydCwgbmV3X2JtY3IsIGFuZV9zd2l0Y2g7CisKKwkvKiBGaW5kIHRoZSBjb25uZWN0ZWQgTUlJIHhjdnJzLgorCSAgIERvaW5nIHRoaXMgaW4gb3BlbigpIHdvdWxkIGFsbG93IGRldGVjdGluZyBleHRlcm5hbCB4Y3ZycyBsYXRlciwKKwkgICBidXQgdGFrZXMgbXVjaCB0aW1lLiAqLworCWZvciAocGh5biA9IDE7IHBoeW4gPD0gMzIgJiYgcGh5X2lkeCA8IHNpemVvZiAodHAtPnBoeXMpOyBwaHluKyspIHsKKwkJaW50IHBoeSA9IHBoeW4gJiAweDFmOworCQlpbnQgbWlpX3N0YXR1cyA9IHR1bGlwX21kaW9fcmVhZCAoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJaWYgKChtaWlfc3RhdHVzICYgMHg4MzAxKSA9PSAweDgwMDEgfHwKKwkJICAgICgobWlpX3N0YXR1cyAmIEJNU1JfMTAwQkFTRTQpID09IDAKKwkJICAgICAmJiAobWlpX3N0YXR1cyAmIDB4NzgwMCkgIT0gMCkpIHsKKwkJCS8qIHByZXNlcnZlIEJlY2tlciBsb2dpYywgZ2FpbiBpbmRlbnRhdGlvbiBsZXZlbCAqLworCQl9IGVsc2UgeworCQkJY29udGludWU7CisJCX0KKworCQltaWlfcmVnMCA9IHR1bGlwX21kaW9fcmVhZCAoZGV2LCBwaHksIE1JSV9CTUNSKTsKKwkJbWlpX2FkdmVydCA9IHR1bGlwX21kaW9fcmVhZCAoZGV2LCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQlhbmVfc3dpdGNoID0gMDsKKworCQkvKiBpZiBub3QgYWR2ZXJ0aXNpbmcgYXQgYWxsLCBnZW4gYW4KKwkJICogYWR2ZXJ0aXNpbmcgdmFsdWUgZnJvbSB0aGUgY2FwYWJpbGl0eQorCQkgKiBiaXRzIGluIEJNU1IKKwkJICovCisJCWlmICgobWlpX2FkdmVydCAmIEFEVkVSVElTRV9BTEwpID09IDApIHsKKwkJCXVuc2lnbmVkIGludCB0bXBhZHYgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQltaWlfYWR2ZXJ0ID0gKCh0bXBhZHYgPj4gNikgJiAweDNlMCkgfCAxOworCQl9CisKKwkJaWYgKHRwLT5taWlfYWR2ZXJ0aXNlKSB7CisJCQl0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeF0gPQorCQkJdG9fYWR2ZXJ0ID0gdHAtPm1paV9hZHZlcnRpc2U7CisJCX0gZWxzZSBpZiAodHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdKSB7CisJCQl0b19hZHZlcnQgPSB0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeF07CisJCX0gZWxzZSB7CisJCQl0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeF0gPQorCQkJdHAtPm1paV9hZHZlcnRpc2UgPQorCQkJdG9fYWR2ZXJ0ID0gbWlpX2FkdmVydDsKKwkJfQorCisJCXRwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisKKwkJcHJpbnRrIChLRVJOX0lORk8gInR1bGlwJWQ6ICBNSUkgdHJhbnNjZWl2ZXIgIyVkICIKKwkJCSJjb25maWcgJTQuNHggc3RhdHVzICU0LjR4IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCWJvYXJkX2lkeCwgcGh5LCBtaWlfcmVnMCwgbWlpX3N0YXR1cywgbWlpX2FkdmVydCk7CisKKwkJLyogRml4dXAgZm9yIERMaW5rIHdpdGggbWlzd2lyZWQgUEhZLiAqLworCQlpZiAobWlpX2FkdmVydCAhPSB0b19hZHZlcnQpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyAidHVsaXAlZDogIEFkdmVydGlzaW5nICU0LjR4IG9uIFBIWSAlZCwiCisJCQkJIiBwcmV2aW91c2x5IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCQlib2FyZF9pZHgsIHRvX2FkdmVydCwgcGh5LCBtaWlfYWR2ZXJ0KTsKKwkJCXR1bGlwX21kaW9fd3JpdGUgKGRldiwgcGh5LCA0LCB0b19hZHZlcnQpOworCQl9CisKKwkJLyogRW5hYmxlIGF1dG9uZWdvdGlhdGlvbjogc29tZSBib2FyZHMgZGVmYXVsdCB0byBvZmYuICovCisJCWlmICh0cC0+ZGVmYXVsdF9wb3J0ID09IDApIHsKKwkJCW5ld19ibWNyID0gbWlpX3JlZzAgfCBCTUNSX0FORU5BQkxFOworCQkJaWYgKG5ld19ibWNyICE9IG1paV9yZWcwKSB7CisJCQkJbmV3X2JtY3IgfD0gQk1DUl9BTlJFU1RBUlQ7CisJCQkJYW5lX3N3aXRjaCA9IDE7CisJCQl9CisJCX0KKwkJLyogLi4ub3IgZGlzYWJsZSBud2F5LCBpZiBmb3JjaW5nIG1lZGlhICovCisJCWVsc2UgeworCQkJbmV3X2JtY3IgPSBtaWlfcmVnMCAmIH5CTUNSX0FORU5BQkxFOworCQkJaWYgKG5ld19ibWNyICE9IG1paV9yZWcwKQorCQkJCWFuZV9zd2l0Y2ggPSAxOworCQl9CisKKwkJLyogY2xlYXIgb3V0IGJpdHMgd2UgbmV2ZXIgd2FudCBhdCB0aGlzIHBvaW50ICovCisJCW5ld19ibWNyICY9IH4oQk1DUl9DVFNUIHwgQk1DUl9GVUxMRFBMWCB8IEJNQ1JfSVNPTEFURSB8CisJCQkgICAgICBCTUNSX1BET1dOIHwgQk1DUl9TUEVFRDEwMCB8IEJNQ1JfTE9PUEJBQ0sgfAorCQkJICAgICAgQk1DUl9SRVNFVCk7CisKKwkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCW5ld19ibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJCWlmICh0dWxpcF9tZWRpYV9jYXBbdHAtPmRlZmF1bHRfcG9ydF0gJiBNZWRpYUlzMTAwKQorCQkJbmV3X2JtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKworCQlpZiAobmV3X2JtY3IgIT0gbWlpX3JlZzApIHsKKwkJCS8qIHNvbWUgcGh5cyBuZWVkIHRoZSBBTkUgc3dpdGNoIHRvCisJCQkgKiBoYXBwZW4gYmVmb3JlIGZvcmNlZCBtZWRpYSBzZXR0aW5ncworCQkJICogd2lsbCAidGFrZS4iICBIb3dldmVyLCB3ZSB3cml0ZSB0aGUKKwkJCSAqIHNhbWUgdmFsdWUgdHdpY2UgaW4gb3JkZXIgbm90IHRvCisJCQkgKiBjb25mdXNlIHRoZSBzYW5lIHBoeXMuCisJCQkgKi8KKwkJCWlmIChhbmVfc3dpdGNoKSB7CisJCQkJdHVsaXBfbWRpb193cml0ZSAoZGV2LCBwaHksIE1JSV9CTUNSLCBuZXdfYm1jcik7CisJCQkJdWRlbGF5ICgxMCk7CisJCQl9CisJCQl0dWxpcF9tZGlvX3dyaXRlIChkZXYsIHBoeSwgTUlJX0JNQ1IsIG5ld19ibWNyKTsKKwkJfQorCX0KKwl0cC0+bWlpX2NudCA9IHBoeV9pZHg7CisJaWYgKHRwLT5tdGFibGUgJiYgdHAtPm10YWJsZS0+aGFzX21paSAmJiBwaHlfaWR4ID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gInR1bGlwJWQ6ICoqKldBUk5JTkcqKio6IE5vIE1JSSB0cmFuc2NlaXZlciBmb3VuZCFcbiIsCisJCQlib2FyZF9pZHgpOworCQl0cC0+cGh5c1swXSA9IDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jIGIvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTgwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKworCit2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXUzMiBwaHlfcmVnID0gaW9yZWFkMzIoaW9hZGRyICsgMHhCOCk7CisJdTMyIG5ld19jc3I2ID0gdHAtPmNzcjYgJiB+MHg0MEM0MDIwMDsKKworCWlmIChwaHlfcmVnICYgMHg3ODAwMDAwMCkgeyAvKiBJZ25vcmUgYmFzZVQ0ICovCisJCWlmIChwaHlfcmVnICYgMHgyMDAwMDAwMCkJCWRldi0+aWZfcG9ydCA9IDU7CisJCWVsc2UgaWYgKHBoeV9yZWcgJiAweDQwMDAwMDAwKQlkZXYtPmlmX3BvcnQgPSAzOworCQllbHNlIGlmIChwaHlfcmVnICYgMHgxMDAwMDAwMCkJZGV2LT5pZl9wb3J0ID0gNDsKKwkJZWxzZSBpZiAocGh5X3JlZyAmIDB4MDgwMDAwMDApCWRldi0+aWZfcG9ydCA9IDA7CisJCXRwLT5ud2F5c2V0ID0gMTsKKwkJbmV3X2NzcjYgPSAoZGV2LT5pZl9wb3J0ICYgMSkgPyAweDAxODYwMDAwIDogMHgwMDQyMDAwMDsKKwkJaW93cml0ZTMyKDB4MzIgfCAoZGV2LT5pZl9wb3J0ICYgMSksIGlvYWRkciArIENTUjEyKTsKKwkJaWYgKGRldi0+aWZfcG9ydCAmIDEpCisJCQlpb3dyaXRlMzIoMHgxRjg2OCwgaW9hZGRyICsgMHhCOCk7CisJCWlmIChwaHlfcmVnICYgMHgzMDAwMDAwMCkgeworCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCW5ld19jc3I2IHw9IDB4MDAwMDAyMDA7CisJCX0KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyBhdXRvbmVnb3RpYXRlZCBzdGF0dXMgJTguOHgsICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHBoeV9yZWcsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJaWYgKHRwLT5jc3I2ICE9IG5ld19jc3I2KSB7CisJCQl0cC0+Y3NyNiA9IG5ld19jc3I2OworCQkJLyogUmVzdGFydCBUeCAqLworCQkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJfQorfQorCit2b2lkIHBuaWNfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgcGh5X3JlZyA9IGlvcmVhZDMyKGlvYWRkciArIDB4QjgpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQTklDIGxpbmsgY2hhbmdlZCBzdGF0ZSAlOC44eCwgQ1NSNSAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHBoeV9yZWcsIGNzcjUpOworCWlmIChpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSAmIFRQTG5rRmFpbCkgeworCQlpb3dyaXRlMzIoKGlvcmVhZDMyKGlvYWRkciArIENTUjcpICYgflRQTG5rRmFpbCkgfCBUUExua1Bhc3MsIGlvYWRkciArIENTUjcpOworCQkvKiBJZiB3ZSB1c2UgYW4gZXh0ZXJuYWwgTUlJLCB0aGVuIHdlIG11c3RuJ3QgdXNlIHRoZQorCQkgKiBpbnRlcm5hbCBuZWdvdGlhdGlvbi4KKwkJICovCisJCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpCisJCQlyZXR1cm47CisJCWlmICghIHRwLT5ud2F5c2V0ICB8fCAgamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQgPiAxKkhaKSB7CisJCQl0cC0+Y3NyNiA9IDB4MDA0MjAwMDAgfCAodHAtPmNzcjYgJiAweDAwMDBmZGZmKTsKKwkJCWlvd3JpdGUzMih0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisJCQlpb3dyaXRlMzIoMHgzMCwgaW9hZGRyICsgQ1NSMTIpOworCQkJaW93cml0ZTMyKDB4MDIwMUYwNzgsIGlvYWRkciArIDB4QjgpOyAvKiBUdXJuIG9uIGF1dG9uZWdvdGlhdGlvbi4gKi8KKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJfSBlbHNlIGlmIChpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSAmIFRQTG5rUGFzcykgeworCQlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCQlzcGluX2xvY2soJnRwLT5sb2NrKTsKKwkJCXR1bGlwX2NoZWNrX2R1cGxleChkZXYpOworCQkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXBuaWNfZG9fbndheShkZXYpOworCQl9CisJCWlvd3JpdGUzMigoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNykgJiB+VFBMbmtQYXNzKSB8IFRQTG5rRmFpbCwgaW9hZGRyICsgQ1NSNyk7CisJfQorfQorCit2b2lkIHBuaWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKworCWlmKCFpb3JlYWQzMihpb2FkZHIgKyBDU1I3KSkgeworCQkvKiB0aGUgdGltZXIgd2FzIGNhbGxlZCBkdWUgdG8gYSB3b3JrIG92ZXJmbG93CisJCSAqIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gU2tpcCB0aGUgY29ubmVjdGlvbgorCQkgKiBjaGVja3MsIHRoZSBuaWMgaXMgZGVmaW5pdGl2ZWx5IHNwZWFraW5nIHdpdGgKKwkJICogaGlzIGxpbmsgcGFydG5lci4KKwkJICovCisJCWdvdG8gdG9vX2dvb2RfY29ubmVjdGlvbjsKKwl9CisKKwlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJaWYgKHR1bGlwX2NoZWNrX2R1cGxleChkZXYpID4gMCkKKwkJCW5leHRfdGljayA9IDMqSFo7CisJCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCX0gZWxzZSB7CisJCWludCBjc3IxMiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjEyKTsKKwkJaW50IG5ld19jc3I2ID0gdHAtPmNzcjYgJiB+MHg0MEM0MDIwMDsKKwkJaW50IHBoeV9yZWcgPSBpb3JlYWQzMihpb2FkZHIgKyAweEI4KTsKKwkJaW50IGNzcjUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KTsKKworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQTklDIHRpbWVyIFBIWSBzdGF0dXMgJTguOHgsICVzICIKKwkJCQkgICAiQ1NSNSAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBwaHlfcmVnLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyNSk7CisJCWlmIChwaHlfcmVnICYgMHgwNDAwMDAwMCkgewkvKiBSZW1vdGUgbGluayBmYXVsdCAqLworCQkJaW93cml0ZTMyKDB4MDIwMUYwNzgsIGlvYWRkciArIDB4QjgpOworCQkJbmV4dF90aWNrID0gMSpIWjsKKwkJCXRwLT5ud2F5c2V0ID0gMDsKKwkJfSBlbHNlIGlmIChwaHlfcmVnICYgMHg3ODAwMDAwMCkgeyAvKiBJZ25vcmUgYmFzZVQ0ICovCisJCQlwbmljX2RvX253YXkoZGV2KTsKKwkJCW5leHRfdGljayA9IDYwKkhaOworCQl9IGVsc2UgaWYgKGNzcjUgJiBUUExua0ZhaWwpIHsgLyogMTAwYmFzZVR4IGxpbmsgYmVhdCAqLworCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIGxpbmsgYmVhdCBmYWlsZWQsIENTUjEyICU0LjR4LCAiCisJCQkJCSAgICJDU1I1ICU4Ljh4LCBQSFkgJTMuM3guXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBjc3IxMiwKKwkJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksIGlvcmVhZDMyKGlvYWRkciArIDB4QjgpKTsKKwkJCW5leHRfdGljayA9IDMqSFo7CisJCQlpZiAodHAtPm1lZGlhbG9jaykgeworCQkJfSBlbHNlIGlmICh0cC0+bndheXNldCAgJiYgIChkZXYtPmlmX3BvcnQgJiAxKSkgeworCQkJCW5leHRfdGljayA9IDEqSFo7CisJCQl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAwKSB7CisJCQkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJCQlpb3dyaXRlMzIoMHgzMywgaW9hZGRyICsgQ1NSMTIpOworCQkJCW5ld19jc3I2ID0gMHgwMTg2MDAwMDsKKwkJCQlpb3dyaXRlMzIoMHgxRjg2OCwgaW9hZGRyICsgMHhCOCk7CisJCQl9IGVsc2UgeworCQkJCWRldi0+aWZfcG9ydCA9IDA7CisJCQkJaW93cml0ZTMyKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKwkJCQluZXdfY3NyNiA9IDB4MDA0MjAwMDA7CisJCQkJaW93cml0ZTMyKDB4MUYwNzgsIGlvYWRkciArIDB4QjgpOworCQkJfQorCQkJaWYgKHRwLT5jc3I2ICE9IG5ld19jc3I2KSB7CisJCQkJdHAtPmNzcjYgPSBuZXdfY3NyNjsKKwkJCQkvKiBSZXN0YXJ0IFR4ICovCisJCQkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2hhbmdpbmcgUE5JQyBjb25maWd1cmF0aW9uIHRvICVzICIKKwkJCQkJCSAgICIlcy1kdXBsZXgsIENTUjYgJTguOHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKwkJCQkJCSAgIHRwLT5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgbmV3X2NzcjYpOworCQkJfQorCQl9CisJfQordG9vX2dvb2RfY29ubmVjdGlvbjoKKwltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworCWlmKCFpb3JlYWQzMihpb2FkZHIgKyBDU1I3KSkgeworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3IHRpbWVyIHdha2V1cC5cbiIsIGRldi0+bmFtZSk7CisJCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwkJdHVsaXBfcmVmaWxsX3J4KGRldik7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvcG5pYzIuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmNGE5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvcG5pYzIuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisgICAgICAgIE1vZGlmaWVkIHRvIGhlcCBzdXBwb3J0IFBOSUNfSUkgYnkgS2V2aW4gQi4gSGVuZHJpY2tzCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworCisvKiBVbmRlcnN0YW5kaW5nIHRoZSBQTklDX0lJIC0gZXZlcnl0aGluZyBpcyB0aGlzIGZpbGUgaXMgYmFzZWQKKyAqIG9uIHRoZSBQTklDX0lJX1BERiBkYXRhc2hlZXQgd2hpY2ggaXMgc29yZWx5IGxhY2tpbmcgaW4gZGV0YWlsCisgKgorICogQXMgSSB1bmRlcnN0YW5kIHRoaW5ncywgaGVyZSBhcmUgdGhlIHJlZ2lzdGVycyBhbmQgYml0cyB0aGF0CisgKiBleHBsYWluIHRoZSBtYXNrcyBhbmQgY29uc3RhbnRzIHVzZWQgaW4gdGhpcyBmaWxlIHRoYXQgYXJlCisgKiBlaXRoZXIgZGlmZmVyZW50IGZyb20gdGhlIDIxMTQyLzMgb3IgaW1wb3J0YW50IGZvciBiYXNpYyBvcGVyYXRpb24uCisgKgorICoKKyAqIENTUiA2ICAobWFzayA9IDB4ZmUzYmQxZmQgb2YgYml0cyBub3QgdG8gY2hhbmdlKQorICogLS0tLS0KKyAqIEJpdCAyNCAgICAtIFNDUgorICogQml0IDIzICAgIC0gUENTCisgKiBCaXQgMjIgICAgLSBUVE0gKFRyYXNtaXQgVGhyZXNob2xkIE1vZGUpCisgKiBCaXQgMTggICAgLSBQb3J0IFNlbGVjdAorICogQml0IDEzICAgIC0gU3RhcnQgLSAxLCBTdG9wIC0gMCBUcmFuc21pc3Npb25zCisgKiBCaXQgMTE6MTAgLSBMb29wIEJhY2sgT3BlcmF0aW9uIE1vZGUKKyAqIEJpdCA5ICAgICAtIEZ1bGwgRHVwbGV4IG1vZGUgKEFkdmVydGlzZSAxMEJhc2VULUZEIGlzIENTUjE0PDc+IGlzIHNldCkKKyAqIEJpdCAxICAgICAtIFN0YXJ0IC0gMSwgU3RvcCAtIDAgUmVjZWl2ZQorICoKKyAqCisgKiBDU1IgMTQgIChtYXNrID0gMHhmZmYwZWUzOSBvZiBiaXRzIG5vdCB0byBjaGFuZ2UpCisgKiAtLS0tLS0KKyAqIEJpdCAxOSAgICAtIFBBVVNFLVBhdXNlCisgKiBCaXQgMTggICAgLSBBZHZlcnRpc2UgVDQKKyAqIEJpdCAxNyAgICAtIEFkdmVydGlzZSAxMDBiYXNlVHgtRkQKKyAqIEJpdCAxNiAgICAtIEFkdmVydGlzZSAxMDBiYXNlVHgtSEQKKyAqIEJpdCAxMiAgICAtIExURSAtIExpbmsgVGVzdCBFbmFibGUKKyAqIEJpdCA3ICAgICAtIEFORSAtIEF1dG8gTmVnb3RpYXRlIEVuYWJsZQorICogQml0IDYgICAgIC0gSERFIC0gQWR2ZXJ0aXNlIDEwYmFzZVQtSEQKKyAqIEJpdCAyICAgICAtIFJlc2V0IHRvIFBvd2VyIGRvd24gLSBrZXB0IGFzIDEgZm9yIG5vcm1hbCBvcGVyYXRpb24KKyAqIEJpdCAxICAgICAtICBMb29wIEJhY2sgZW5hYmxlIGZvciAxMGJhc2VUIE1DQworICoKKyAqCisgKiBDU1IgMTIKKyAqIC0tLS0tLQorICogQml0IDI1ICAgIC0gUGFydG5lciBjYW4gZG8gVDQKKyAqIEJpdCAyNCAgICAtIFBhcnRuZXIgY2FuIGRvIDEwMGJhc2VUeC1GRAorICogQml0IDIzICAgIC0gUGFydG5lciBjYW4gZG8gMTAwYmFzZVR4LUhECisgKiBCaXQgMjIgICAgLSBQYXJ0bmVyIGNhbiBkbyAxMGJhc2VULUZECisgKiBCaXQgMjEgICAgLSBQYXJ0bmVyIGNhbiBkbyAxMGJhc2VULUhECisgKiBCaXQgMTUgICAgLSBMUE4gaXMgMSBpZiBhbGwgYWJvdmUgYml0cyBhcmUgdmFsaWQgb3RoZXIgd2lzZSAwCisgKiBCaXQgMTQ6MTIgLSBhdXRvbmVnb3RpYXRpb24gc3RhdGUgKHdyaXRlIDAwMSB0byBzdGFydCBhdXRvbmVnb3RpYXRlKQorICogQml0IDMgICAgIC0gQXV0b3BvbGFyaXR5IHN0YXRlCisgKiBCaXQgMiAgICAgLSBMUzEwQiAtIGxpbmsgc3RhdGUgb2YgMTBiYXNlVCAwIC0gZ29vZCwgMSAtIGZhaWxlZAorICogQml0IDEgICAgIC0gTFMxMDBCIC0gbGluayBzdGF0ZSBvZiAxMDBiYXNlVCAwIC0gZ29vZCwgMS0gZmFpbGQKKyAqCisgKgorICogRGF0YSBQb3J0IFNlbGVjdGlvbiBJbmZvCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDU1IxNDw3PiAgIENTUjY8MTg+ICAgIENTUjY8MjI+ICAgIENTUjY8MjM+ICAgIENTUjY8MjQ+ICAgTU9ERS9QT1JUCisgKiAgIDEgICAgICAgICAgIDAgICAgICAgICAgIDAgKFgpICAgICAgIDAgKFgpICAgICAgIDEgICAgICAgIE5XQVkKKyAqICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICAgMCAoWCkgICAgICAgMCAgICAgICAgMTBiYXNlVAorICogICAwICAgICAgICAgICAxICAgICAgICAgICAwICAgICAgICAgICAxICAgICAgICAgICAxIChYKSAgICAxMDBiYXNlVAorICoKKyAqCisgKi8KKworCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKwordm9pZCBwbmljMl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHR1bGlwX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgbmVnb3RpYXRpb24gc3RhdHVzICU4Ljh4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisKKwlpZiAobmV4dF90aWNrKSB7CisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7CisJfQorfQorCisKK3ZvaWQgcG5pYzJfc3RhcnRfbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworICAgICAgICBpbnQgY3NyMTQ7CisgICAgICAgIGludCBjc3IxMjsKKworICAgICAgICAvKiBzZXQgdXAgd2hhdCB0byBhZHZlcnRpc2UgZHVyaW5nIHRoZSBuZWdvdGlhdGlvbiAqLworCisgICAgICAgIC8qIGxvYWQgaW4gY3NyMTQgIGFuZCBtYXNrIG9mZiBiaXRzIG5vdCB0byB0b3VjaAorICAgICAgICAgKiBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGV4cGxhaW5zIG1hc2sgdmFsdWUKKyAgICAgICAgICovCisJY3NyMTQgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTQpICYgMHhmZmYwZWUzOSk7CisKKyAgICAgICAgLyogYml0IDE3IC0gYWR2ZXRpc2UgMTAwYmFzZVR4LUZEICovCisgICAgICAgIGlmICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDEwMCkgY3NyMTQgfD0gMHgwMDAyMDAwMDsKKworICAgICAgICAvKiBiaXQgMTYgLSBhZHZlcnRpc2UgMTAwYmFzZVR4LUhEICovCisgICAgICAgIGlmICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDA4MCkgY3NyMTQgfD0gMHgwMDAxMDAwMDsKKworICAgICAgICAvKiBiaXQgNiAtIGFkdmVydGlzZSAxMGJhc2VULUhEICovCisgICAgICAgIGlmICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDAyMCkgY3NyMTQgfD0gMHgwMDAwMDA0MDsKKworICAgICAgICAvKiBOb3cgc2V0IGJpdCAxMiBMaW5rIFRlc3QgRW5hYmxlLCBCaXQgNyBBdXRvbmVnb3RpYXRpb24gRW5hYmxlCisgICAgICAgICAqIGFuZCBiaXQgMCBEb24ndCBQb3dlckRvd24gMTBiYXNlVAorICAgICAgICAgKi8KKyAgICAgICAgY3NyMTQgfD0gMHgwMDAwMTE4NDsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzdGFydGluZyBQTklDMiBhdXRvbmVnb3RpYXRpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAiY3NyMTQ9JTguOHguXG4iLCBkZXYtPm5hbWUsIGNzcjE0KTsKKworICAgICAgICAvKiB0ZWxsIHBuaWMyX2xua19jaGFuZ2Ugd2UgYXJlIGRvaW5nIGFuIG53YXkgbmVnb3RpYXRpb24gKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCXRwLT5ud2F5ID0gdHAtPm1lZGlhc2Vuc2UgPSAxOworCXRwLT5ud2F5c2V0ID0gdHAtPmxwYXIgPSAwOworCisgICAgICAgIC8qIG5vdyB3ZSBoYXZlIHRvIHNldCB1cCBjc3I2IGZvciBOV0FZIHN0YXRlICovCisKKwl0cC0+Y3NyNiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjYpOworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogT24gRW50cnkgdG8gTndheSwgIgorICAgICAgICAgICAgICAgICAgICAgICJjc3I2PSU4Ljh4LlxuIiwgZGV2LT5uYW1lLCB0cC0+Y3NyNik7CisKKyAgICAgICAgLyogbWFzayBvZmYgYW55IGJpdHMgbm90IHRvIHRvdWNoCisgICAgICAgICAqIGNvbW1lbnQgYXQgdG9wIG9mIGZpbGUgZXhwbGFpbnMgbWFzayB2YWx1ZQorICAgICAgICAgKi8KKwl0cC0+Y3NyNiA9IHRwLT5jc3I2ICYgMHhmZTNiZDFmZDsKKworICAgICAgICAvKiBkb24ndCBmb3JnZXQgdGhhdCBiaXQgOSBpcyBhbHNvIHVzZWQgZm9yIGFkdmVydGlzaW5nICovCisgICAgICAgIC8qIGFkdmVydGlzZSAxMGJhc2VULUZEIGZvciB0aGUgbmVnb3RpYXRpb24gKGJpdCA5KSAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwNDApIHRwLT5jc3I2IHw9IDB4MDAwMDAyMDA7CisKKyAgICAgICAgLyogc2V0IGJpdCAyNCBmb3IgbndheSBuZWdvdGlhdGlvbiBtb2RlIC4uLgorICAgICAgICAgKiBzZWUgRGF0YSBQb3J0IFNlbGVjdGlvbiBjb21tZW50IGF0IHRvcCBvZiBmaWxlCisgICAgICAgICAqIGFuZCAiU3RvcCIgLSByZXNldCBib3RoIFRyYW5zbWl0IChiaXQgMTMpIGFuZCBSZWNlaXZlIChiaXQgMSkKKyAgICAgICAgICovCisgICAgICAgIHRwLT5jc3I2IHw9IDB4MDEwMDAwMDA7CisJaW93cml0ZTMyKGNzcjE0LCBpb2FkZHIgKyBDU1IxNCk7CisJaW93cml0ZTMyKHRwLT5jc3I2LCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgdWRlbGF5KDEwMCk7CisKKyAgICAgICAgLyogYWxsIHNldCB1cCBzbyBub3cgZm9yY2UgdGhlIG5lZ290aWF0aW9uIHRvIGJlZ2luICovCisKKyAgICAgICAgLyogcmVhZCBpbiBjdXJyZW50IHZhbHVlcyBhbmQgbWFzayBvZmYgYWxsIGJ1dCB0aGUKKwkgKiBBdXRvbmVnb3RpYXRpb24gYml0cyAxNDoxMi4gIFdyaXRpbmcgYSAwMDEgdG8gdGhvc2UgYml0cworICAgICAgICAgKiBzaG91bGQgc3RhcnQgdGhlIGF1dG9uZWdvdGlhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgY3NyMTIgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpICYgMHhmZmZmOGZmZik7CisgICAgICAgIGNzcjEyIHw9IDB4MTAwMDsKKwlpb3dyaXRlMzIoY3NyMTIsIGlvYWRkciArIENTUjEyKTsKK30KKworCisKK3ZvaWQgcG5pYzJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKyAgICAgICAgaW50IGNzcjE0OworCisgICAgICAgIC8qIHJlYWQgdGhlIHN0YXVzIHJlZ2lzdGVyIHRvIGZpbmQgb3V0IHdoYXQgaXMgdXAgKi8KKwlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiBQTklDMiBsaW5rIHN0YXR1cyBpbnRlcnJ1cHQgJTguOHgsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBDU1I1ICV4LCAlOC44eC5cbiIsIGRldi0+bmFtZSwgY3NyMTIsCisgICAgICAgICAgICAgICAgICAgICAgIGNzcjUsIGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSk7CisKKwkvKiBJZiBOV2F5IGZpbmlzaGVkIGFuZCB3ZSBoYXZlIGEgbmVnb3RpYXRlZCBwYXJ0bmVyIGNhcGFiaWxpdHkuCisgICAgICAgICAqIGNoZWNrIGJpdHMgMTQ6MTIgZm9yIGJpdCBwYXR0ZXJuIDEwMSAtIGFsbCBpcyBnb29kCisgICAgICAgICAqLworCWlmICh0cC0+bndheSAgJiYgICF0cC0+bndheXNldCkgeworCisJICAgICAgICAvKiB3ZSBkaWQgYW4gYXV0byBuZWdvdGlhdGlvbiAqLworCisgICAgICAgICAgICAgICAgaWYgKChjc3IxMiAmIDB4NzAwMCkgPT0gMHg1MDAwKSB7CisKKwkgICAgICAgICAgICAgICAvKiBuZWdvdGlhdGlvbiBlbmRlZCBzdWNjZXNzZnVsbHkgKi8KKworCSAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbGluayBwYXJ0bmVycyByZXBseSBhbmQgbWFzayBvdXQgYWxsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgKiBiaXRzIDI0LTIxIHdoaWNoIHNob3cgdGhlIHBhcnRuZXJzIGNhcGFiaWxpdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBtYXRjaCB0aG9zZSB0byB3aGF0IHdlIGFkdmVydGlzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICogdGhlbiBiZWdpbiB0byBpbnRlcnByZXQgdGhlIHJlc3VsdHMgb2YgdGhlIG5lZ290aWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgKiBBbHdheXMgZ28gaW4gdGhpcyBvcmRlciA6ICh3ZSBhcmUgaWdub3JpbmcgVDQgZm9yIG5vdykKKyAgICAgICAgICAgICAgICAgICAgICAgICogICAgIDEwMGJhc2VUeC1GRCwgMTAwYmFzZVR4LUhELCAxMGJhc2VULUZELCAxMGJhc2VULUhECisgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCSAgICAgICAgaW50IG5lZ290aWF0ZWQgPSAoKGNzcjEyID4+IDE2KSAmIDB4MDFFMCkgJiB0cC0+c3ltX2FkdmVydGlzZTsKKwkJICAgICAgICB0cC0+bHBhciA9IChjc3IxMiA+PiAxNik7CisJCSAgICAgICAgdHAtPm53YXlzZXQgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVnb3RpYXRlZCAmIDB4MDEwMCkgICAgICAgIGRldi0+aWZfcG9ydCA9IDU7CisJCSAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRlZCAmIDB4MDA4MCkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJICAgICAgICBlbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDQwKQlkZXYtPmlmX3BvcnQgPSA0OworCQkJZWxzZSBpZiAobmVnb3RpYXRlZCAmIDB4MDAyMCkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJCWVsc2UgeworCQkJICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorCQkgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZ1bm55IGF1dG9uZWdvdGlhdGUgcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3NyMTIgJTguOHggYWR2ZXJ0aXNpbmcgJTQuNHhcbiIsCisJCQkgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgY3NyMTIsIHRwLT5zeW1fYWR2ZXJ0aXNlKTsKKwkJCSAgICAgdHAtPm53YXlzZXQgPSAwOworCQkJICAgICAvKiBzbyBjaGVjayAgaWYgMTAwYmFzZVR4IGxpbmsgc3RhdGUgaXMgb2theSAqLworCQkJICAgICBpZiAoKGNzcjEyICYgMikgPT0gMCAgJiYgICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDE4MCkpCisJCQkgICAgICAgZGV2LT5pZl9wb3J0ID0gMzsKKwkJCX0KKworCQkJLyogbm93IHJlY29yZCB0aGUgZHVwbGV4IHRoYXQgd2FzIG5lZ290aWF0ZWQgKi8KKwkJCXRwLT5mdWxsX2R1cGxleCA9IDA7CisJCQlpZiAoKGRldi0+aWZfcG9ydCA9PSA0KSB8fCAoZGV2LT5pZl9wb3J0ID09IDUpKQorCQkJICAgICAgIHRwLT5mdWxsX2R1cGxleCA9IDE7CisKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpIHsKKwkJCSAgICAgICBpZiAodHAtPm53YXlzZXQpCisJCQkgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN3aXRjaGluZyB0byAlcyBiYXNlZCBvbiBsaW5rICIKKwkJCQkgICAgIm5lZ290aWF0aW9uICU0LjR4ICYgJTQuNHggPSAlNC40eC5cbiIsCisJCQkJICAgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zeW1fYWR2ZXJ0aXNlLCB0cC0+bHBhciwgbmVnb3RpYXRlZCk7CisJCQl9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRvIHR1cm4gb2ZmIGJpdCA3IC0gYXV0b25lZ290aWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlIHNvIHdlIGNhbiBwcm9wZXJseSBlbmQgbndheSBtb2RlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2V0IGR1cGxleCAoaWUuIHVzZSBjc3I2PDk+IGFnYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisJICAgICAgICAgICAgICAgIGNzcjE0ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIDB4ZmZmZmZmN2YpOworICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKGNzcjE0LGlvYWRkciArIENTUjE0KTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgc2V0IHRoZSBkYXRhIHBvcnQgYW5kIG9wZXJhdGluZyBtb2RlCisJCQkgKiAoc2VlIHRoZSBEYXRhIFBvcnQgU2VsZWN0aW9uIGNvbW1lbnRzIGF0CisJCQkgKiB0aGUgdG9wIG9mIHRoZSBmaWxlCisJCQkgKi8KKworCQkJLyogZ2V0IGN1cnJlbnQgY3NyNiBhbmQgbWFzayBvZmYgYml0cyBub3QgdG8gdG91Y2ggKi8KKwkJCS8qIHNlZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlICovCisKKwkJCXRwLT5jc3I2ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjYpICYgMHhmZTNiZDFmZCk7CisKKwkJCS8qIHNvIGlmIHVzaW5nIGlmX3BvcnQgMyBvciA1IHRoZW4gc2VsZWN0IHRoZSAxMDBiYXNlVAorCQkJICogcG9ydCBlbHNlIHNlbGVjdCB0aGUgMTBiYXNlVCBwb3J0LgorCQkJICogU2VlIHRoZSBEYXRhIFBvcnQgU2VsZWN0aW9uIHRhYmxlIGF0IHRoZSB0b3AKKwkJCSAqIG9mIHRoZSBmaWxlIHdoaWNoIHdhcyB0YWtlbiBmcm9tIHRoZSBQTklDX0lJLlBERgorCQkJICogZGF0YXNoZWV0CisJCQkgKi8KKwkJCWlmIChkZXYtPmlmX3BvcnQgJiAxKSB0cC0+Y3NyNiB8PSAweDAxODQwMDAwOworCQkJZWxzZSB0cC0+Y3NyNiB8PSAweDAwNDAwMDAwOworCisJCQkvKiBub3cgc2V0IHRoZSBmdWxsIGR1cGxleCBiaXQgYXBwcm9wcmlhdGVseSAqLworCQkJaWYgKHRwLT5mdWxsX2R1cGxleCkgdHAtPmNzcjYgfD0gMHgwMDAwMDIwMDsKKworCQkJaW93cml0ZTMyKDEsIGlvYWRkciArIENTUjEzKTsKKworCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgU2V0dGluZyBDU1I2ICU4Ljh4LyV4IENTUjEyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU4Ljh4LlxuIiwgZGV2LT5uYW1lLCB0cC0+Y3NyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNiksIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisKKwkJCS8qIG5vdyB0aGUgZm9sbG93aW5nIGFjdHVhbGx5IHdyaXRlcyBvdXQgdGhlCisJCQkgKiBuZXcgY3NyNiB2YWx1ZXMKKwkJCSAqLworCQkJdHVsaXBfc3RhcnRfcnh0eCh0cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworCSAgICAgICAgfSBlbHNlIHsKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9uZWdvdGlhdGlvbiBmYWlsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAlcywgbGluayBiZWF0IHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBjc3IxMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRvIHR1cm4gb2ZmIGJpdCA3IC0gYXV0b25lZ290aWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlIHNvIHdlIGRvbid0IGZvcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisJICAgICAgICAgICAgICAgIGNzcjE0ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIDB4ZmZmZmZmN2YpOworICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKGNzcjE0LGlvYWRkciArIENTUjE0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hhdCBzaG91bGQgd2UgZG8gd2hlbiBhdXRvbmVnb3RpYXRlIGZhaWxzPworICAgICAgICAgICAgICAgICAgICAgICAgICogc2hvdWxkIHdlIHRyeSBhZ2FpbiBvciBkZWZhdWx0IHRvIGJhc2VsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlLiAgSSBqdXN0IGRvbid0IGtub3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIG5vdyBkZWZhdWx0IHRvIHNvbWUgYmFzZWxpbmUgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkgICAgICAgICAgICAgICAgIGRldi0+aWZfcG9ydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm53YXkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxMGJhc2VUeC1IRCAtIHNlZSBEYXRhIFBvcnQgU2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICogY29tbWVudCBnaXZlbiBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJICAgICAgICAgICAgICAgICB0cC0+Y3NyNiA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIDB4ZmUzYmQxZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jc3I2IHw9IDB4MDA0MDAwMDA7CisKKwkgICAgICAgICAgICAgICAgIHR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKwkJfQorCX0KKworCWlmICgodHAtPm53YXlzZXQgICYmICAoY3NyNSAmIDB4MDgwMDAwMDApCisJCQkgICYmIChkZXYtPmlmX3BvcnQgPT0gMyAgfHwgIGRldi0+aWZfcG9ydCA9PSA1KQorCQkJICAmJiAoY3NyMTIgJiAyKSA9PSAyKSB8fCAodHAtPm53YXkgJiYgKGNzcjUgJiAoVFBMbmtGYWlsKSkpKSB7CisKKwkJLyogTGluayBibGV3PyBNYXliZSByZXN0YXJ0IE5XYXkuICovCisKKwkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVWdoISBMaW5rIGJsZXc/XG4iLCBkZXYtPm5hbWUpOworCisJCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJCXRwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKDMqSFopOworCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisJfQorCisKKyAgICAgICAgaWYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpIHsKKworCSAgICAgICAgLyogd2UgYXJlIGF0IDEwMG1iIGFuZCBhIHBvdGVudGlhbCBsaW5rIGNoYW5nZSBvY2N1cnJlZCAqLworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiBQTklDMiAlcyBsaW5rIGJlYXQgJXMuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJICAgKGNzcjEyICYgMikgPyAiZmFpbGVkIiA6ICJnb29kIik7CisKKyAgICAgICAgICAgICAgICAvKiBjaGVjayAxMDAgbGluayBiZWF0ICovCisKKyAgICAgICAgICAgICAgICB0cC0+bndheSA9IDA7CisgICAgICAgICAgICAgICAgdHAtPm53YXlzZXQgPSAxOworCisgICAgICAgICAgICAgICAgLyogaWYgZmFpbGVkIHRoZW4gdHJ5IGRvaW5nIGFuIG53YXkgdG8gZ2V0IGluIHN5bmMgKi8KKwkJaWYgKChjc3IxMiAmIDIpICAmJiAgISB0cC0+bWVkaWFsb2NrKSB7CisJCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJCXBuaWMyX3N0YXJ0X253YXkoZGV2KTsKKwkJCXRwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKDMqSFopOworICAgICAgIAkJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCAgfHwgIGRldi0+aWZfcG9ydCA9PSA0KSB7CisKKwkgICAgICAgIC8qIHdlIGFyZSBhdCAxMG1iIGFuZCBhIHBvdGVudGlhbCBsaW5rIGNoYW5nZSBvY2N1cnJlZCAqLworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiBQTklDMiAlcyBsaW5rIGJlYXQgJXMuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJICAgKGNzcjEyICYgNCkgPyAiZmFpbGVkIiA6ICJnb29kIik7CisKKworICAgICAgICAgICAgICAgIHRwLT5ud2F5ID0gMDsKKyAgICAgICAgICAgICAgICB0cC0+bndheXNldCA9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBpZiBmYWlsZWQsIHRyeSBkb2luZyBhbiBud2F5IHRvIGdldCBpbiBzeW5jICovCisJCWlmICgoY3NyMTIgJiA0KSAgJiYgICEgdHAtPm1lZGlhbG9jaykgeworCQkJZGVsX3RpbWVyX3N5bmMoJnRwLT50aW1lcik7CisJCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKyAgICAgICAJCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0lORk8iJXM6IFBOSUMyIExpbmsgQ2hhbmdlIERlZmF1bHQ/XG4iLGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogaWYgYWxsIGVsc2UgZmFpbHMgZGVmYXVsdCB0byB0cnlpbmcgMTBiYXNlVC1IRCAqLworCWRldi0+aWZfcG9ydCA9IDA7CisKKyAgICAgICAgLyogbWFrZSBzdXJlIGF1dG9uZWdvdGlhdGUgZW5hYmxlIGlzIG9mZiAqLworCWNzcjE0ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIDB4ZmZmZmZmN2YpOworICAgICAgICBpb3dyaXRlMzIoY3NyMTQsaW9hZGRyICsgQ1NSMTQpOworCisgICAgICAgIC8qIHNldCB0byAxMGJhc2VUeC1IRCAtIHNlZSBEYXRhIFBvcnQgU2VsZWN0aW9uCisgICAgICAgICAqIGNvbW1lbnQgZ2l2ZW4gYXQgdGhlIHRvcCBvZiB0aGUgZmlsZQorICAgICAgICAgKi8KKwl0cC0+Y3NyNiA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIDB4ZmUzYmQxZmQpOworICAgICAgICB0cC0+Y3NyNiB8PSAweDAwNDAwMDAwOworCisJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNTY4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisKKwordm9pZCB0dWxpcF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdTMyIGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCWludCBuZXh0X3RpY2sgPSAyKkhaOworCisJaWYgKHR1bGlwX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aWNrLCAlcywgc3RhdHVzICU4Ljh4IG1vZGUiCisJCQkgICAiICU4Ljh4IFNJQSAlOC44eCAlOC44eCAlOC44eCAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLCBjc3IxMiwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTMpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTQpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNSkpOworCX0KKwlzd2l0Y2ggKHRwLT5jaGlwX2lkKSB7CisJY2FzZSBEQzIxMTQwOgorCWNhc2UgREMyMTE0MjoKKwljYXNlIE1YOTg3MTM6CisJY2FzZSBDT01QRVg5ODgxOgorCWNhc2UgRE05MTBYOgorCWNhc2UgVUxJNTI2WDoKKwlkZWZhdWx0OiB7CisJCXN0cnVjdCBtZWRpYWxlYWYgKm1sZWFmOworCQl1bnNpZ25lZCBjaGFyICpwOworCQlpZiAodHAtPm10YWJsZSA9PSBOVUxMKSB7CS8qIE5vIEVFUFJPTSBpbmZvLCB1c2UgZ2VuZXJpYyBjb2RlLiAqLworCQkJLyogTm90IG11Y2ggdGhhdCBjYW4gYmUgZG9uZS4KKwkJCSAgIEFzc3VtZSB0aGlzIGEgZ2VuZXJpYyBNSUkgb3IgU1lNIHRyYW5zY2VpdmVyLiAqLworCQkJbmV4dF90aWNrID0gNjAqSFo7CisJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogbmV0d29yayBtZWRpYSBtb25pdG9yIENTUjYgJTguOHggIgorCQkJCQkgICAiQ1NSMTIgMHglMi4yeC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNiksIGNzcjEyICYgMHhmZik7CisJCQlicmVhazsKKwkJfQorCQltbGVhZiA9ICZ0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XTsKKwkJcCA9IG1sZWFmLT5sZWFmZGF0YTsKKwkJc3dpdGNoIChtbGVhZi0+dHlwZSkgeworCQljYXNlIDA6IGNhc2UgNDogeworCQkJLyogVHlwZSAwIHNlcmlhbCBvciA0IFNZTSB0cmFuc2NlaXZlci4gIENoZWNrIHRoZSBsaW5rIGJlYXQgYml0LiAqLworCQkJaW50IG9mZnNldCA9IG1sZWFmLT50eXBlID09IDQgPyA1IDogMjsKKwkJCXM4IGJpdG51bSA9IHBbb2Zmc2V0XTsKKwkJCWlmIChwW29mZnNldCsxXSAmIDB4ODApIHsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyIlczogVHJhbnNjZWl2ZXIgbW9uaXRvciB0aWNrICIKKwkJCQkJCSAgICJDU1IxMj0lIzIuMngsIG5vIG1lZGlhIHNlbnNlLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgY3NyMTIpOworCQkJCWlmIChtbGVhZi0+dHlwZSA9PSA0KSB7CisJCQkJCWlmIChtbGVhZi0+bWVkaWEgPT0gMyAmJiAoY3NyMTIgJiAweDAyKSkKKwkJCQkJCWdvdG8gc2VsZWN0X25leHRfbWVkaWE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zY2VpdmVyIG1vbml0b3IgdGljazogQ1NSMTI9JSMyLjJ4IgorCQkJCQkgICAiIGJpdCAlZCBpcyAlZCwgZXhwZWN0aW5nICVkLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBjc3IxMiwgKGJpdG51bSA+PiAxKSAmIDcsCisJCQkJCSAgIChjc3IxMiAmICgxIDw8ICgoYml0bnVtID4+IDEpICYgNykpKSAhPSAwLAorCQkJCQkgICAoYml0bnVtID49IDApKTsKKwkJCS8qIENoZWNrIHRoYXQgdGhlIHNwZWNpZmllZCBiaXQgaGFzIHRoZSBwcm9wZXIgdmFsdWUuICovCisJCQlpZiAoKGJpdG51bSA8IDApICE9CisJCQkJKChjc3IxMiAmICgxIDw8ICgoYml0bnVtID4+IDEpICYgNykpKSAhPSAwKSkgeworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTGluayBiZWF0IGRldGVjdGVkIGZvciAlcy5cbiIsIGRldi0+bmFtZSwKKwkJCQkJICAgICAgIG1lZGlhbmFtZVttbGVhZi0+bWVkaWEgJiBNRURJQV9NQVNLXSk7CisJCQkJaWYgKChwWzJdICYgMHg2MSkgPT0gMHgwMSkJLyogQm9ndXMgWm55eCBib2FyZC4gKi8KKwkJCQkJZ290byBhY3R1YWxseV9taWk7CisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCWlmICh0cC0+bWVkaWFsb2NrKQorCQkJCWJyZWFrOworCSAgc2VsZWN0X25leHRfbWVkaWE6CisJCQlpZiAoLS10cC0+Y3VyX2luZGV4IDwgMCkgeworCQkJCS8qIFdlIHN0YXJ0IGFnYWluLCBidXQgc2hvdWxkIGluc3RlYWQgbG9vayBmb3IgZGVmYXVsdC4gKi8KKwkJCQl0cC0+Y3VyX2luZGV4ID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKwkJCX0KKwkJCWRldi0+aWZfcG9ydCA9IHRwLT5tdGFibGUtPm1sZWFmW3RwLT5jdXJfaW5kZXhdLm1lZGlhOworCQkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc0ZEKQorCQkJCWdvdG8gc2VsZWN0X25leHRfbWVkaWE7IC8qIFNraXAgRkQgZW50cmllcy4gKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBsaW5rIGJlYXQgb24gbWVkaWEgJXMsIgorCQkJCSAgICAgICAiIHRyeWluZyB0cmFuc2NlaXZlciB0eXBlICVzLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbbWxlYWYtPm1lZGlhICYgTUVESUFfTUFTS10sCisJCQkJICAgICAgIG1lZGlhbmFtZVt0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XS5tZWRpYV0pOworCQkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgMCk7CisJCQkvKiBSZXN0YXJ0IHRoZSB0cmFuc21pdCBwcm9jZXNzLiAqLworCQkJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkJCW5leHRfdGljayA9ICgyNCpIWikvMTA7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6ICBjYXNlIDM6CQkvKiAyMTE0MCwgMjExNDIgTUlJICovCisJCWFjdHVhbGx5X21paToKKwkJCWlmICh0dWxpcF9jaGVja19kdXBsZXgoZGV2KSA8IDApIHsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJCW5leHRfdGljayA9IDMqSFo7CisJCQl9IGVsc2UgeworCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCQluZXh0X3RpY2sgPSA2MCpIWjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CQkJCQkvKiAyMTE0MiBzZXJpYWwgYmxvY2sgaGFzIG5vIGxpbmsgYmVhdC4gKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWJyZWFrOworCX0KKwkvKiBtb2RfdGltZXIgc3luY2hyb25pemVzIHVzIHdpdGggcG90ZW50aWFsIGFkZF90aW1lciBjYWxscworCSAqIGZyb20gaW50ZXJydXB0cy4KKwkgKi8KKwltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworfQorCisKK3ZvaWQgbXhpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHR1bGlwX2RlYnVnID4gMykgeworCQlwcmludGsoS0VSTl9JTkZPIiVzOiBNWElDIG5lZ290aWF0aW9uIHN0YXR1cyAlOC44eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisJfQorCWlmIChuZXh0X3RpY2spIHsKKwkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKKwl9Cit9CisKKwordm9pZCBjb21ldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgbmV4dF90aWNrID0gNjAqSFo7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvbWV0IGxpbmsgc3RhdHVzICU0LjR4IHBhcnRuZXIgY2FwYWJpbGl0eSAiCisJCQkgICAiJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLAorCQkJICAgdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIDEpLAorCQkJICAgdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIDUpKTsKKwkvKiBtb2RfdGltZXIgc3luY2hyb25pemVzIHVzIHdpdGggcG90ZW50aWFsIGFkZF90aW1lciBjYWxscworCSAqIGZyb20gaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAodHVsaXBfY2hlY2tfZHVwbGV4KGRldikgPCAwKQorCQl7IG5ldGlmX2NhcnJpZXJfb2ZmKGRldik7IH0KKwllbHNlCisJCXsgbmV0aWZfY2Fycmllcl9vbihkZXYpOyB9CisJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaCBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKQEAgLTAsMCArMSw0OTMgQEAKKy8qCisJZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaAorCisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2lmbmRlZiBfX05FVF9UVUxJUF9IX18KKyNkZWZpbmUgX19ORVRfVFVMSVBfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworCisKKy8qIHVuZGVmaW5lLCBvciBkZWZpbmUgdG8gdmFyaW91cyBkZWJ1Z2dpbmcgbGV2ZWxzICg+NCA9PSBvYnNjZW5lIGxldmVscykgKi8KKyNkZWZpbmUgVFVMSVBfREVCVUcgMQorCisvKiB1bmRlZmluZSBVU0VfSU9fT1BTIGZvciBNTUlPLCBkZWZpbmUgZm9yIFBJTyAqLworI2lmZGVmIENPTkZJR19UVUxJUF9NTUlPCisjIHVuZGVmIFVTRV9JT19PUFMKKyNlbHNlCisjIGRlZmluZSBVU0VfSU9fT1BTIDEKKyNlbmRpZgorCisKKworc3RydWN0IHR1bGlwX2NoaXBfdGFibGUgeworCWNoYXIgKmNoaXBfbmFtZTsKKwlpbnQgaW9fc2l6ZTsKKwlpbnQgdmFsaWRfaW50cnM7CS8qIENTUjcgaW50ZXJydXB0IGVuYWJsZSBzZXR0aW5ncyAqLworCWludCBmbGFnczsKKwl2b2lkICgqbWVkaWFfdGltZXIpICh1bnNpZ25lZCBsb25nIGRhdGEpOworfTsKKworCitlbnVtIHRibF9mbGFnIHsKKwlIQVNfTUlJCQkJPSAweDAwMDEsCisJSEFTX01FRElBX1RBQkxFCQk9IDB4MDAwMiwKKwlDU1IxMl9JTl9TUk9NCQk9IDB4MDAwNCwKKwlBTFdBWVNfQ0hFQ0tfTUlJCT0gMHgwMDA4LAorCUhBU19BQ1BJCQk9IDB4MDAxMCwKKwlNQ19IQVNIX09OTFkJCT0gMHgwMDIwLCAvKiBIYXNoLW9ubHkgbXVsdGljYXN0IGZpbHRlci4gKi8KKwlIQVNfUE5JQ05XQVkJCT0gMHgwMDgwLAorCUhBU19OV0FZCQk9IDB4MDA0MCwgLyogVXNlcyBpbnRlcm5hbCBOV2F5IHhjdnIuICovCisJSEFTX0lOVFJfTUlUSUdBVElPTgk9IDB4MDEwMCwKKwlJU19BU0lYCQkJPSAweDAyMDAsCisJSEFTXzgwMjNYCQk9IDB4MDQwMCwKKwlDT01FVF9NQUNfQUREUgkJPSAweDA4MDAsCisJSEFTX1BDSV9NV0kJCT0gMHgxMDAwLAorCUhBU19QSFlfSVJRCQk9IDB4MjAwMCwKKwlIQVNfU1dBUFBFRF9TRUVQUk9NCT0gMHg0MDAwLAorCU5FRURTX0ZBS0VfTUVESUFfVEFCTEUJPSAweDgwMDAsCit9OworCisKKy8qIGNoaXAgdHlwZXMuICBjYXJlZnVsISAgb3JkZXIgaXMgVkVSWSBJTVBPUlRBTlQgaGVyZSwgYXMgdGhlc2UKKyAqIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGRyaXZlciBhcyBpbmRpY2VzIGludG8gYXJyYXlzICovCisvKiBOb3RlIDIxMTQyID09IDIxMTQzLiAqLworZW51bSBjaGlwcyB7CisJREMyMTA0MCA9IDAsCisJREMyMTA0MSA9IDEsCisJREMyMTE0MCA9IDIsCisJREMyMTE0MiA9IDMsIERDMjExNDMgPSAzLAorCUxDODJDMTY4LAorCU1YOTg3MTMsCisJTVg5ODcxNSwKKwlNWDk4NzI1LAorCUFYODgxNDAsCisJUE5JQzIsCisJQ09NRVQsCisJQ09NUEVYOTg4MSwKKwlJMjExNDUsCisJRE05MTBYLAorCUNPTkVYQU5ULAorCVVMSTUyNlgKK307CisKKworZW51bSBNZWRpYUlzIHsKKwlNZWRpYUlzRkQgPSAxLAorCU1lZGlhQWx3YXlzRkQgPSAyLAorCU1lZGlhSXNNSUkgPSA0LAorCU1lZGlhSXNGeCA9IDgsCisJTWVkaWFJczEwMCA9IDE2Cit9OworCisKKy8qIE9mZnNldHMgdG8gdGhlIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlcnMsICJDU1JzIi4gIEFsbCBhY2Nlc3NlcworICAgbXVzdCBiZSBsb25nd29yZCBpbnN0cnVjdGlvbnMgYW5kIHF1YWR3b3JkIGFsaWduZWQuICovCitlbnVtIHR1bGlwX29mZnNldHMgeworCUNTUjAgPSAwLAorCUNTUjEgPSAweDA4LAorCUNTUjIgPSAweDEwLAorCUNTUjMgPSAweDE4LAorCUNTUjQgPSAweDIwLAorCUNTUjUgPSAweDI4LAorCUNTUjYgPSAweDMwLAorCUNTUjcgPSAweDM4LAorCUNTUjggPSAweDQwLAorCUNTUjkgPSAweDQ4LAorCUNTUjEwID0gMHg1MCwKKwlDU1IxMSA9IDB4NTgsCisJQ1NSMTIgPSAweDYwLAorCUNTUjEzID0gMHg2OCwKKwlDU1IxNCA9IDB4NzAsCisJQ1NSMTUgPSAweDc4LAorfTsKKworLyogcmVnaXN0ZXIgb2Zmc2V0IGFuZCBiaXRzIGZvciBDRkREIFBDSSBjb25maWcgcmVnICovCitlbnVtIHBjaV9jZmdfZHJpdmVyX3JlZyB7CisJQ0ZERCA9IDB4NDAsCisJQ0ZERF9TbGVlcCA9ICgxIDw8IDMxKSwKKwlDRkREX1Nub296ZSA9ICgxIDw8IDMwKSwKK307CisKKyNkZWZpbmUgUnhQb2xsSW50IChSeEludHJ8UnhOb0J1ZnxSeERpZWR8UnhKYWJiZXIpCisKKy8qIFRoZSBiaXRzIGluIHRoZSBDU1I1IHN0YXR1cyByZWdpc3RlcnMsIG1vc3RseSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KK2VudW0gc3RhdHVzX2JpdHMgeworCVRpbWVySW50ID0gMHg4MDAsCisJU3l0ZW1FcnJvciA9IDB4MjAwMCwKKwlUUExua0ZhaWwgPSAweDEwMDAsCisJVFBMbmtQYXNzID0gMHgxMCwKKwlOb3JtYWxJbnRyID0gMHgxMDAwMCwKKwlBYm5vcm1hbEludHIgPSAweDgwMDAsCisJUnhKYWJiZXIgPSAweDIwMCwKKwlSeERpZWQgPSAweDEwMCwKKwlSeE5vQnVmID0gMHg4MCwKKwlSeEludHIgPSAweDQwLAorCVR4RklGT1VuZGVyZmxvdyA9IDB4MjAsCisJVHhKYWJiZXIgPSAweDA4LAorCVR4Tm9CdWYgPSAweDA0LAorCVR4RGllZCA9IDB4MDIsCisJVHhJbnRyID0gMHgwMSwKK307CisKKy8qIGJpdCBtYXNrIGZvciBDU1I1IFRYL1JYIHByb2Nlc3Mgc3RhdGUgKi8KKyNkZWZpbmUgQ1NSNV9UUwkweDAwNzAwMDAwCisjZGVmaW5lIENTUjVfUlMJMHgwMDBlMDAwMAorCitlbnVtIHR1bGlwX21vZGVfYml0cyB7CisJVHhUaHJlc2hvbGQJCT0gKDEgPDwgMjIpLAorCUZ1bGxEdXBsZXgJCT0gKDEgPDwgOSksCisJVHhPbgkJCT0gMHgyMDAwLAorCUFjY2VwdEJyb2FkY2FzdAkJPSAweDAxMDAsCisJQWNjZXB0QWxsTXVsdGljYXN0CT0gMHgwMDgwLAorCUFjY2VwdEFsbFBoeXMJCT0gMHgwMDQwLAorCUFjY2VwdFJ1bnQJCT0gMHgwMDA4LAorCVJ4T24JCQk9IDB4MDAwMiwKKwlSeFR4CQkJPSAoVHhPbiB8IFJ4T24pLAorfTsKKworCitlbnVtIHR1bGlwX2J1c2NvbmZpZ19iaXRzIHsKKwlNV0kJCQk9ICgxIDw8IDI0KSwKKwlNUkwJCQk9ICgxIDw8IDIzKSwKKwlNUk0JCQk9ICgxIDw8IDIxKSwKKwlDQUxTaGlmdAkJPSAxNCwKKwlCdXJzdExlblNoaWZ0CQk9IDgsCit9OworCisKKy8qIFRoZSBUdWxpcCBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHR1bGlwX3J4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMTsKKwl1MzIgYnVmZmVyMjsKK307CisKKworc3RydWN0IHR1bGlwX3R4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMTsKKwl1MzIgYnVmZmVyMjsJCS8qIFdlIHVzZSBvbmx5IGJ1ZmZlciAxLiAgKi8KK307CisKKworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duZWQgPSAweDgwMDAwMDAwLAorCVJ4RGVzY0ZhdGFsRXJyID0gMHg4MDAwLAorCVJ4V2hvbGVQa3QgPSAweDAzMDAsCit9OworCisKK2VudW0gdDIxMTQzX2NzcjZfYml0cyB7CisJY3NyNl9zYyA9ICgxPDwzMSksCisJY3NyNl9yYSA9ICgxPDwzMCksCisJY3NyNl9pZ25fZGVzdF9tc2IgPSAoMTw8MjYpLAorCWNzcjZfbWJvID0gKDE8PDI1KSwKKwljc3I2X3NjciA9ICgxPDwyNCksICAvKiBzY3JhbWJsZSBtb2RlIGZsYWc6IGNhbid0IGJlIHNldCAqLworCWNzcjZfcGNzID0gKDE8PDIzKSwgIC8qIEVuYWJsZXMgUENTIGZ1bmN0aW9ucyAoc3ltYm9sIG1vZGUgcmVxdWlyZXMgY3NyNl9wcyBiZSBzZXQpIGRlZmF1bHQgaXMgc2V0ICovCisJY3NyNl90dG0gPSAoMTw8MjIpLCAgLyogVHJhbnNtaXQgVGhyZXNob2xkIE1vZGUsIHNldCBmb3IgMTBiYXNlVCwgMCBmb3IgMTAwQmFzZVRYICovCisJY3NyNl9zZiA9ICgxPDwyMSksICAgLyogU3RvcmUgYW5kIGZvcndhcmQuIElmIHNldCBpZ25vcmVzIFRSIGJpdHMgKi8KKwljc3I2X2hiZCA9ICgxPDwxOSksICAvKiBIZWFydCBiZWF0IGRpc2FibGUuIERpc2FibGVzIFNRRSBmdW5jdGlvbiBpbiAxMGJhc2VUICovCisJY3NyNl9wcyA9ICgxPDwxOCksICAgLyogUG9ydCBTZWxlY3QuIDAgKGRlZnVhbHQpID0gMTBiYXNlVCwgMSA9IDEwMGJhc2VUWDogY2FuJ3QgYmUgc2V0ICovCisJY3NyNl9jYSA9ICgxPDwxNyksICAgLyogQ29sbGlzaW9uIE9mZnNldCBFbmFibGUuIElmIHNldCB1c2VzIHNwZWNpYWwgYWxnb3JpdGhtIGluIGxvdyBjb2xsaXNpb24gc2l0dWF0aW9ucyAqLworCWNzcjZfdHJoID0gKDE8PDE1KSwgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBoaWdoIGJpdCAqLworCWNzcjZfdHJsID0gKDE8PDE0KSwgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBsb3cgYml0ICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVGhpcyB0YWJsZSBzaG93cyB0cmFuc21pdCB0aHJlc2hvbGQgdmFsdWVzIGJhc2VkIG9uIG1lZGlhICAgKgorCSAqIGFuZCB0aGVzZSB0d28gcmVnaXN0ZXJzIChmcm9tIFBOSUMxICYgMiBkb2NzKSBOb3RlOiB0aGlzIGlzICoKKwkgKiBhbGwgbWVhbmluZ2xlc3MgaWYgc2YgaXMgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqICh0cmgsdHJsKSAqIDEwMEJhc2VUWCAqIDEwQmFzZVQgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqICAgKDAsMCkgICAqICAgICAxMjggICAqICAgIDcyICAgKgorCSAqICAgKDAsMSkgICAqICAgICAyNTYgICAqICAgIDk2ICAgKgorCSAqICAgKDEsMCkgICAqICAgICA1MTIgICAqICAgMTI4ICAgKgorCSAqICAgKDEsMSkgICAqICAgIDEwMjQgICAqICAgMTYwICAgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWNzcjZfZmMgPSAoMTw8MTIpLCAgIC8qIEZvcmNlcyBhIGNvbGxpc2lvbiBpbiBuZXh0IHRyYW5zbWlzc2lvbiAoZm9yIHRlc3RpbmcgaW4gbG9vcGJhY2sgbW9kZSkgKi8KKwljc3I2X29tX2ludF9sb29wID0gKDE8PDEwKSwgLyogaW50ZXJuYWwgKEZJRk8pIGxvb3BiYWNrIGZsYWcgKi8KKwljc3I2X29tX2V4dF9sb29wID0gKDE8PDExKSwgLyogZXh0ZXJuYWwgKFBNRCkgbG9vcGJhY2sgZmxhZyAqLworCS8qIHNldCBib3RoIGFuZCB5b3UgZ2V0IChQSFkpIGxvb3BiYWNrICovCisJY3NyNl9mZCA9ICgxPDw5KSwgICAgLyogRnVsbCBkdXBsZXggbW9kZSwgZGlzYWJsZXMgaGVhcmJlYXQsIG5vIGxvb3BiYWNrICovCisJY3NyNl9wbSA9ICgxPDw3KSwgICAgLyogUGFzcyBBbGwgTXVsdGljYXN0ICovCisJY3NyNl9wciA9ICgxPDw2KSwgICAgLyogUHJvbWlzY3VvdXMgbW9kZSAqLworCWNzcjZfc2IgPSAoMTw8NSksICAgIC8qIFN0YXJ0KDEpL1N0b3AoMCkgYmFja29mZiBjb3VudGVyICovCisJY3NyNl9pZiA9ICgxPDw0KSwgICAgLyogSW52ZXJzZSBGaWx0ZXJpbmcsIHJlamVjdHMgb25seSBhZGRyZXNzZXMgaW4gYWRkcmVzcyB0YWJsZTogY2FuJ3QgYmUgc2V0ICovCisJY3NyNl9wYiA9ICgxPDwzKSwgICAgLyogUGFzcyBCYWQgRnJhbWVzLCAoMSkgY2F1c2VzIGV2ZW4gYmFkIGZyYW1lcyB0byBiZSBwYXNzZWQgb24gKi8KKwljc3I2X2hvID0gKDE8PDIpLCAgICAvKiBIYXNoLW9ubHkgZmlsdGVyaW5nIG1vZGU6IGNhbid0IGJlIHNldCAqLworCWNzcjZfaHAgPSAoMTw8MCksICAgIC8qIEhhc2gvUGVyZmVjdCBSZWNlaXZlIEZpbHRlcmluZyBNb2RlOiBjYW4ndCBiZSBzZXQgKi8KKworCWNzcjZfbWFza19jYXB0dXJlID0gKGNzcjZfc2MgfCBjc3I2X2NhKSwKKwljc3I2X21hc2tfZGVmc3RhdGUgPSAoY3NyNl9tYXNrX2NhcHR1cmUgfCBjc3I2X21ibyksCisJY3NyNl9tYXNrX2hkY2FwID0gKGNzcjZfbWFza19kZWZzdGF0ZSB8IGNzcjZfaGJkIHwgY3NyNl9wcyksCisJY3NyNl9tYXNrX2hkY2FwdHQgPSAoY3NyNl9tYXNrX2hkY2FwICB8IGNzcjZfdHJoIHwgY3NyNl90cmwpLAorCWNzcjZfbWFza19mdWxsY2FwID0gKGNzcjZfbWFza19oZGNhcHR0IHwgY3NyNl9mZCksCisJY3NyNl9tYXNrX2Z1bGxwcm9taXNjID0gKGNzcjZfcHIgfCBjc3I2X3BtKSwKKwljc3I2X21hc2tfZmlsdGVycyA9IChjc3I2X2hwIHwgY3NyNl9obyB8IGNzcjZfaWYpLAorCWNzcjZfbWFza18xMDBidCA9IChjc3I2X3NjciB8IGNzcjZfcGNzIHwgY3NyNl9oYmQpLAorfTsKKworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCTMyCisjZGVmaW5lIFJYX1JJTkdfU0laRQkxMjggCisjZGVmaW5lIE1FRElBX01BU0sgICAgIDMxCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4gKi8KKworI2RlZmluZSBUVUxJUF9NSU5fQ0FDSEVfTElORQk4CS8qIGluIHVuaXRzIG9mIDMyLWJpdCB3b3JkcyAqLworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19ocHBhX18pCisvKiBUaGUgVWx0cmFTcGFyYyBQQ0kgY29udHJvbGxlcnMgd2lsbCBkaXNjb25uZWN0IGF0IGV2ZXJ5IDY0LWJ5dGUKKyAqIGNyb3NzaW5nIGFueXdheXMgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gdGVsbCBUdWxpcCB0byBidXJzdAorICogYW55IG1vcmUgdGhhbiB0aGF0LgorICovCisjZGVmaW5lIFRVTElQX01BWF9DQUNIRV9MSU5FCTE2CS8qIGluIHVuaXRzIG9mIDMyLWJpdCB3b3JkcyAqLworI2Vsc2UKKyNkZWZpbmUgVFVMSVBfTUFYX0NBQ0hFX0xJTkUJMzIJLyogaW4gdW5pdHMgb2YgMzItYml0IHdvcmRzICovCisjZW5kaWYKKworCisvKiBSaW5nLXdyYXAgZmxhZyBpbiBsZW5ndGggZmllbGQsIHVzZSBmb3IgbGFzdCByaW5nIGVudHJ5LgorCTB4MDEwMDAwMDAgbWVhbnMgY2hhaW4gb24gYnVmZmVyMiBhZGRyZXNzLAorCTB4MDIwMDAwMDAgbWVhbnMgdXNlIHRoZSByaW5nIHN0YXJ0IGFkZHJlc3MgaW4gQ1NSMi8zLgorICAgTm90ZTogU29tZSB3b3JrLWFsaWtlIGNoaXBzIGRvIG5vdCBmdW5jdGlvbiBjb3JyZWN0bHkgaW4gY2hhaW5lZCBtb2RlLgorICAgVGhlIEFTSVggY2hpcCB3b3JrcyBvbmx5IGluIGNoYWluZWQgbW9kZS4KKyAgIFRodXMgd2UgaW5kaWNhdGVzIHJpbmcgbW9kZSwgYnV0IGFsd2F5cyB3cml0ZSB0aGUgJ25leHQnIGZpZWxkIGZvcgorICAgY2hhaW5lZCBtb2RlIGFzIHdlbGwuCisqLworI2RlZmluZSBERVNDX1JJTkdfV1JBUCAweDAyMDAwMDAwCisKKworI2RlZmluZSBFRVBST01fU0laRSA1MTIgCS8qIDIgPDwgRUVQUk9NX0FERFJMRU4gKi8KKworCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworI2lmIGRlZmluZWQoX19pMzg2X18pCQkJLyogQUtBIGdldF91bmFsaWduZWQoKSAqLworI2RlZmluZSBnZXRfdTE2KHB0cikgKCoodTE2ICopKHB0cikpCisjZWxzZQorI2RlZmluZSBnZXRfdTE2KHB0cikgKCgodTgqKShwdHIpKVswXSArICgoKHU4KikocHRyKSlbMV08PDgpKQorI2VuZGlmCisKK3N0cnVjdCBtZWRpYWxlYWYgeworCXU4IHR5cGU7CisJdTggbWVkaWE7CisJdW5zaWduZWQgY2hhciAqbGVhZmRhdGE7Cit9OworCisKK3N0cnVjdCBtZWRpYXRhYmxlIHsKKwl1MTYgZGVmYXVsdG1lZGlhOworCXU4IGxlYWZjb3VudDsKKwl1OCBjc3IxMmRpcjsJCS8qIEdlbmVyYWwgcHVycG9zZSBwaW4gZGlyZWN0aW9ucy4gKi8KKwl1bnNpZ25lZCBoYXNfbWlpOjE7CisJdW5zaWduZWQgaGFzX25vbm1paToxOworCXVuc2lnbmVkIGhhc19yZXNldDo2OworCXUzMiBjc3IxNWRpcjsKKwl1MzIgY3NyMTV2YWw7CQkvKiAyMTE0MyBOV2F5IHNldHRpbmcuICovCisJc3RydWN0IG1lZGlhbGVhZiBtbGVhZlswXTsKK307CisKKworc3RydWN0IG1lZGlhaW5mbyB7CisJc3RydWN0IG1lZGlhaW5mbyAqbmV4dDsKKwlpbnQgaW5mb190eXBlOworCWludCBpbmRleDsKKwl1bnNpZ25lZCBjaGFyICppbmZvOworfTsKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlkbWFfYWRkcl90CW1hcHBpbmc7Cit9OworCisKK3N0cnVjdCB0dWxpcF9wcml2YXRlIHsKKwljb25zdCBjaGFyICpwcm9kdWN0X25hbWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfbW9kdWxlOworCXN0cnVjdCB0dWxpcF9yeF9kZXNjICpyeF9yaW5nOworCXN0cnVjdCB0dWxpcF90eF9kZXNjICp0eF9yaW5nOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCByaW5nX2luZm8gdHhfYnVmZmVyc1tUWF9SSU5HX1NJWkVdOworCS8qIFRoZSBhZGRyZXNzZXMgb2YgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCByaW5nX2luZm8gcnhfYnVmZmVyc1tSWF9SSU5HX1NJWkVdOworCXUxNiBzZXR1cF9mcmFtZVs5Nl07CS8qIFBzZXVkby1UeCBmcmFtZSB0byBpbml0IGFkZHJlc3MgdGFibGUuICovCisJaW50IGNoaXBfaWQ7CisJaW50IHJldmlzaW9uOworCWludCBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IG9vbV90aW1lcjsgICAgLyogT3V0IG9mIG1lbW9yeSB0aW1lci4gKi8KKwl1MzIgbWNfZmlsdGVyWzJdOworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IG1paV9sb2NrOworCXVuc2lnbmVkIGludCBjdXJfcngsIGN1cl90eDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKworI2lmZGVmIAlDT05GSUdfVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OCisgICAgICAgIGludCBtaXRfb247CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJLyogRnVsbC1kdXBsZXggb3BlcmF0aW9uIHJlcXVlc3RlZC4gKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXhfbG9jazoxOworCXVuc2lnbmVkIGludCBmYWtlX2FkZHI6MTsJLyogTXVsdGlwb3J0IGJvYXJkIGZha2VkIGFkZHJlc3MuICovCisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwl1bnNpZ25lZCBpbnQgbWVkaWEyOjQ7CS8qIFNlY29uZGFyeSBtb25pdG9yZWQgbWVkaWEgcG9ydC4gKi8KKwl1bnNpZ25lZCBpbnQgbWVkaWFsb2NrOjE7CS8qIERvbid0IHNlbnNlIG1lZGlhIHR5cGUuICovCisJdW5zaWduZWQgaW50IG1lZGlhc2Vuc2U6MTsJLyogTWVkaWEgc2Vuc2luZyBpbiBwcm9ncmVzcy4gKi8KKwl1bnNpZ25lZCBpbnQgbndheToxLCBud2F5c2V0OjE7CQkvKiAyMTE0MyBpbnRlcm5hbCBOV2F5LiAqLworCXVuc2lnbmVkIGludCBjc3IwOwkvKiBDU1IwIHNldHRpbmcuICovCisJdW5zaWduZWQgaW50IGNzcjY7CS8qIEN1cnJlbnQgQ1NSNiBjb250cm9sIHNldHRpbmdzLiAqLworCXVuc2lnbmVkIGNoYXIgZWVwcm9tW0VFUFJPTV9TSVpFXTsJLyogU2VyaWFsIEVFUFJPTSBjb250ZW50cy4gKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IGNzcjUpOworCXUxNiBzeW1fYWR2ZXJ0aXNlLCBtaWlfYWR2ZXJ0aXNlOyAvKiBOV2F5IGNhcGFiaWxpdGllcyBhZHZlcnRpc2VkLiAgKi8KKwl1MTYgbHBhcjsJCS8qIDIxMTQzIExpbmsgcGFydG5lciBhYmlsaXR5LiAqLworCXUxNiBhZHZlcnRpc2luZ1s0XTsKKwlzaWduZWQgY2hhciBwaHlzWzRdLCBtaWlfY250OwkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwlzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworCWludCBjdXJfaW5kZXg7CQkvKiBDdXJyZW50IG1lZGlhIGluZGV4LiAqLworCWludCBzYXZlZF9pZl9wb3J0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWludCB0dGltZXI7CisJaW50IHN1c3Bfcng7CisJdW5zaWduZWQgbG9uZyBuaXI7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNzcjEyX3NoYWRvdzsKKwlpbnQgcGFkMDsJCS8qIFVzZWQgZm9yIDgtYnl0ZSBhbGlnbm1lbnQgKi8KK307CisKKworc3RydWN0IGVlcHJvbV9maXh1cCB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIGFkZHIwOworCXVuc2lnbmVkIGNoYXIgYWRkcjE7CisJdW5zaWduZWQgY2hhciBhZGRyMjsKKwl1MTYgbmV3dGFibGVbMzJdOwkvKiBNYXggbGVuZ3RoIGJlbG93LiAqLworfTsKKworCisvKiAyMTE0Mi5jICovCitleHRlcm4gdTE2IHQyMTE0Ml9jc3IxNFtdOwordm9pZCB0MjExNDJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgdDIxMTQyX3N0YXJ0X253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHQyMTE0Ml9sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKKworCisvKiBQTklDMi5jICovCit2b2lkIHBuaWMyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpOwordm9pZCBwbmljMl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwordm9pZCBwbmljMl9zdGFydF9ud2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBwbmljMl9sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKKworLyogZWVwcm9tLmMgKi8KK3ZvaWQgdHVsaXBfcGFyc2VfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHR1bGlwX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKTsKKworLyogaW50ZXJydXB0LmMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgdHVsaXBfbWF4X2ludGVycnVwdF93b3JrOworZXh0ZXJuIGludCB0dWxpcF9yeF9jb3B5YnJlYWs7CitpcnFyZXR1cm5fdCB0dWxpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgdHVsaXBfcmVmaWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCitpbnQgdHVsaXBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CisjZW5kaWYKKworCisvKiBtZWRpYS5jICovCitpbnQgdHVsaXBfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7Cit2b2lkIHR1bGlwX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOwordm9pZCB0dWxpcF9zZWxlY3RfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0dXApOworaW50IHR1bGlwX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgdHVsaXBfZmluZF9taWkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBib2FyZF9pZHgpOworCisvKiBwbmljLmMgKi8KK3ZvaWQgcG5pY19kb19ud2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBwbmljX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpOwordm9pZCBwbmljX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8qIHRpbWVyLmMgKi8KK3ZvaWQgdHVsaXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgbXhpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwordm9pZCBjb21ldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKiB0dWxpcF9jb3JlLmMgKi8KK2V4dGVybiBpbnQgdHVsaXBfZGVidWc7CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhbmFtZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgdHVsaXBfbWVkaWFfY2FwW107CitleHRlcm4gc3RydWN0IHR1bGlwX2NoaXBfdGFibGUgdHVsaXBfdGJsW107Cit2b2lkIG9vbV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHU4IHQyMTA0MF9jc3IxM1tdOworCitzdGF0aWMgaW5saW5lIHZvaWQgdHVsaXBfc3RhcnRfcnh0eChzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHApCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWlvd3JpdGUzMih0cC0+Y3NyNiB8IFJ4VHgsIGlvYWRkciArIENTUjYpOworCWJhcnJpZXIoKTsKKwkodm9pZCkgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNik7IC8qIG1taW8gc3luYyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHVsaXBfc3RvcF9yeHR4KHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdTMyIGNzcjYgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KTsKKworCWlmIChjc3I2ICYgUnhUeCkgeworCQl1bnNpZ25lZCBpPTEzMDAvMTA7CisJCWlvd3JpdGUzMihjc3I2ICYgflJ4VHgsIGlvYWRkciArIENTUjYpOworCQliYXJyaWVyKCk7CisJCS8qIHdhaXQgdW50aWwgaW4tZmxpZ2h0IGZyYW1lIGNvbXBsZXRlcy4KKwkJICogTWF4IHRpbWUgQCAxMEJUOiAxNTAwKjhiLzEwTWJwcyA9PSAxMjAwdXMgKCsgMTAwdXMgbWFyZ2luKQorCQkgKiBUeXBpY2FsbHkgZXhwZWN0IHRoaXMgbG9vcCB0byBlbmQgaW4gPCA1MCB1cyBvbiAxMDBCVC4KKwkJICovCisJCXdoaWxlICgtLWkgJiYgKGlvcmVhZDMyKGlvYWRkciArIENTUjUpICYgKENTUjVfVFN8Q1NSNV9SUykpKQorCQkJdWRlbGF5KDEwKTsKKworCQlpZiAoIWkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR1bGlwX3N0b3Bfcnh0eCgpIGZhaWxlZFxuIiwKKwkJCQkJcGNpX25hbWUodHAtPnBkZXYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dWxpcF9yZXN0YXJ0X3J4dHgoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworCWlmKCEodHAtPmNoaXBfaWQgPT0gVUxJNTI2WCAmJiAKKwkJKHRwLT5yZXZpc2lvbiA9PSAweDQwIHx8IHRwLT5yZXZpc2lvbiA9PSAweDUwKSkpIHsKKwkJdHVsaXBfc3RvcF9yeHR4KHRwKTsKKwkJdWRlbGF5KDUpOworCX0KKwl0dWxpcF9zdGFydF9yeHR4KHRwKTsKK30KKworI2VuZGlmIC8qIF9fTkVUX1RVTElQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOThiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTAsMCArMSwxODYxIEBACisvKiB0dWxpcF9jb3JlLmM6IEEgREVDIDIxeDR4LWZhbWlseSBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworCisvKgorCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBEUlZfTkFNRQkidHVsaXAiCisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04gICAgIjEuMS4xMy1OQVBJIiAvKiBLZWVwIGF0IGxlYXN0IGZvciB0ZXN0ICovCisjZWxzZQorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xLjEzIgorI2VuZGlmCisjZGVmaW5lIERSVl9SRUxEQVRFCSJNYXkgMTEsIDIwMDIiCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIF9fc3BhcmNfXworI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNlbmRpZgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJIkxpbnV4IFR1bGlwIGRyaXZlciB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworCisvKiBBIGZldyB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuICovCisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDI1OworCisjZGVmaW5lIE1BWF9VTklUUyA4CisvKiBVc2VkIHRvIHBhc3MgdGhlIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworc3RhdGljIGludCBtdHVbTUFYX1VOSVRTXTsJCQkvKiBKdW1ibyBNVFUgZm9yIGludGVyZmFjZXMuICovCisKKy8qICBUaGUgcG9zc2libGUgbWVkaWEgdHlwZXMgdGhhdCBjYW4gYmUgc2V0IGluIG9wdGlvbnNbXSBhcmU6ICovCitjb25zdCBjaGFyICogY29uc3QgbWVkaWFuYW1lWzMyXSA9IHsKKwkiMTBiYXNlVCIsICIxMGJhc2UyIiwgIkFVSSIsICIxMDBiYXNlVHgiLAorCSIxMGJhc2VULUZEWCIsICIxMDBiYXNlVHgtRkRYIiwgIjEwMGJhc2VUNCIsICIxMDBiYXNlRngiLAorCSIxMDBiYXNlRngtRkRYIiwgIk1JSSAxMGJhc2VUIiwgIk1JSSAxMGJhc2VULUZEWCIsICJNSUkiLAorCSIxMGJhc2VUKGZvcmNlZCkiLCAiTUlJIDEwMGJhc2VUeCIsICJNSUkgMTAwYmFzZVR4LUZEWCIsICJNSUkgMTAwYmFzZVQ0IiwKKwkiTUlJIDEwMGJhc2VGeC1IRFgiLCAiTUlJIDEwMGJhc2VGeC1GRFgiLCAiSG9tZS1QTkEgMU1icHMiLCAiSW52YWxpZC0xOSIsCisJIiIsIiIsIiIsIiIsICIiLCIiLCIiLCIiLCAgIiIsIiIsIiIsIlRyYW5zY2VpdmVyIHJlc2V0IiwKK307CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktYnVmZmVyIFJ4IHN0cnVjdHVyZS4gKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSBcCisJfHwgZGVmaW5lZChfX3NwYXJjXykgfHwgZGVmaW5lZChfX2lhNjRfXykgXAorCXx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworI2VuZGlmCisKKy8qCisgIFNldCB0aGUgYnVzIHBlcmZvcm1hbmNlIHJlZ2lzdGVyLgorCVR5cGljYWw6IFNldCAxNiBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIG5vIGJ1cnN0IGxpbWl0LgorCUNhY2hlIGFsaWdubWVudCBiaXRzIDE1OjE0CSAgICAgQnVyc3QgbGVuZ3RoIDEzOjgKKwkJMDAwMAlObyBhbGlnbm1lbnQgIDB4MDAwMDAwMDAgdW5saW1pdGVkCQkwODAwIDggbG9uZ3dvcmRzCisJCTQwMDAJOCAgbG9uZ3dvcmRzCQkwMTAwIDEgbG9uZ3dvcmQJCTEwMDAgMTYgbG9uZ3dvcmRzCisJCTgwMDAJMTYgbG9uZ3dvcmRzCQkwMjAwIDIgbG9uZ3dvcmRzCTIwMDAgMzIgbG9uZ3dvcmRzCisJCUMwMDAJMzIgIGxvbmd3b3JkcwkJMDQwMCA0IGxvbmd3b3JkcworCVdhcm5pbmc6IG1hbnkgb2xkZXIgNDg2IHN5c3RlbXMgYXJlIGJyb2tlbiBhbmQgcmVxdWlyZSBzZXR0aW5nIDB4MDBBMDQ4MDAKKwkgICA4IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgOCBsb25nd29yZCBidXJzdC4KKwlUb0RvOiBOb24tSW50ZWwgc2V0dGluZyBjb3VsZCBiZSBiZXR0ZXIuCisqLworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHhFMDAwOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4ODAwMDsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKQorLyogVGhlIFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXJzIHdpbGwgZGlzY29ubmVjdCBhdCBldmVyeSA2NC1ieXRlCisgKiBjcm9zc2luZyBhbnl3YXlzIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHRlbGwgVHVsaXAgdG8gYnVyc3QKKyAqIGFueSBtb3JlIHRoYW4gdGhhdC4KKyAqLworc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4OTAwMDsKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX3NoX18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg0ODAwOworI2VsaWYgZGVmaW5lZChfX21pcHNfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDAyMDAwMDAgfCAweDQwMDA7CisjZWxzZQorI3dhcm5pbmcgUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB1bmRlZmluZWQhCitzdGF0aWMgaW50IGNzcjAgPSAweDAwQTAwMDAwIHwgMHg0ODAwOworI2VuZGlmCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDQqSFopCisKKworTU9EVUxFX0FVVEhPUigiVGhlIExpbnV4IEtlcm5lbCBUZWFtIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRpZ2l0YWwgMjEqNCogVHVsaXAgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Cittb2R1bGVfcGFyYW0odHVsaXBfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjc3IwLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CisKKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworI2lmZGVmIFRVTElQX0RFQlVHCitpbnQgdHVsaXBfZGVidWcgPSBUVUxJUF9ERUJVRzsKKyNlbHNlCitpbnQgdHVsaXBfZGVidWcgPSAxOworI2VuZGlmCisKKworCisvKgorICogVGhpcyB0YWJsZSB1c2UgZHVyaW5nIG9wZXJhdGlvbiBmb3IgY2FwYWJpbGl0aWVzIGFuZCBtZWRpYSB0aW1lci4KKyAqCisgKiBJdCBpcyBpbmRleGVkIHZpYSB0aGUgdmFsdWVzIGluICdlbnVtIGNoaXBzJworICovCisKK3N0cnVjdCB0dWxpcF9jaGlwX3RhYmxlIHR1bGlwX3RibFtdID0geworICB7IH0sIC8qIHBsYWNlaG9sZGVyIGZvciBhcnJheSwgc2xvdCB1bnVzZWQgY3VycmVudGx5ICovCisgIHsgfSwgLyogcGxhY2Vob2xkZXIgZm9yIGFycmF5LCBzbG90IHVudXNlZCBjdXJyZW50bHkgKi8KKworICAvKiBEQzIxMTQwICovCisgIHsgIkRpZ2l0YWwgRFMyMTE0MCBUdWxpcCIsIDEyOCwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IEhBU19QQ0lfTVdJLCB0dWxpcF90aW1lciB9LAorCisgIC8qIERDMjExNDIsIERDMjExNDMgKi8KKyAgeyAiRGlnaXRhbCBEUzIxMTQzIFR1bGlwIiwgMTI4LCAweDA4MDFmYmZmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBBTFdBWVNfQ0hFQ0tfTUlJIHwgSEFTX0FDUEkgfCBIQVNfTldBWQorCXwgSEFTX0lOVFJfTUlUSUdBVElPTiB8IEhBU19QQ0lfTVdJLCB0MjExNDJfdGltZXIgfSwKKworICAvKiBMQzgyQzE2OCAqLworICB7ICJMaXRlLU9uIDgyYzE2OCBQTklDIiwgMjU2LCAweDAwMDFmYmVmLAorCUhBU19NSUkgfCBIQVNfUE5JQ05XQVksIHBuaWNfdGltZXIgfSwKKworICAvKiBNWDk4NzEzICovCisgIHsgIk1hY3Jvbml4IDk4NzEzIFBNQUMiLCAxMjgsIDB4MDAwMWViZWYsCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00sIG14aWNfdGltZXIgfSwKKworICAvKiBNWDk4NzE1ICovCisgIHsgIk1hY3Jvbml4IDk4NzE1IFBNQUMiLCAyNTYsIDB4MDAwMWViZWYsCisJSEFTX01FRElBX1RBQkxFLCBteGljX3RpbWVyIH0sCisKKyAgLyogTVg5ODcyNSAqLworICB7ICJNYWNyb25peCA5ODcyNSBQTUFDIiwgMjU2LCAweDAwMDFlYmVmLAorCUhBU19NRURJQV9UQUJMRSwgbXhpY190aW1lciB9LAorCisgIC8qIEFYODgxNDAgKi8KKyAgeyAiQVNJWCBBWDg4MTQwIiwgMTI4LCAweDAwMDFmYmZmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIHwgTUNfSEFTSF9PTkxZCisJfCBJU19BU0lYLCB0dWxpcF90aW1lciB9LAorCisgIC8qIFBOSUMyICovCisgIHsgIkxpdGUtT24gUE5JQy1JSSIsIDI1NiwgMHgwODAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX05XQVkgfCBIQVNfODAyM1ggfCBIQVNfUENJX01XSSwgcG5pYzJfdGltZXIgfSwKKworICAvKiBDT01FVCAqLworICB7ICJBRE10ZWsgQ29tZXQiLCAyNTYsIDB4MDAwMWFiZWYsCisJSEFTX01JSSB8IE1DX0hBU0hfT05MWSB8IENPTUVUX01BQ19BRERSLCBjb21ldF90aW1lciB9LAorCisgIC8qIENPTVBFWDk4ODEgKi8KKyAgeyAiQ29tcGV4IDk4ODEgUE1BQyIsIDEyOCwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSwgbXhpY190aW1lciB9LAorCisgIC8qIEkyMTE0NSAqLworICB7ICJJbnRlbCBEUzIxMTQ1IFR1bGlwIiwgMTI4LCAweDA4MDFmYmZmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBBTFdBWVNfQ0hFQ0tfTUlJIHwgSEFTX0FDUEkKKwl8IEhBU19OV0FZIHwgSEFTX1BDSV9NV0ksIHQyMTE0Ml90aW1lciB9LAorCisgIC8qIERNOTEwWCAqLworICB7ICJEYXZpY29tIERNOTEwMi9ETTkxMDJBIiwgMTI4LCAweDAwMDFlYmVmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIHwgSEFTX0FDUEksCisJdHVsaXBfdGltZXIgfSwKKworICAvKiBSUzcxMTIgKi8KKyAgeyAiQ29uZXhhbnQgTEFOZmluaXR5IiwgMjU2LCAweDAwMDFlYmVmLAorCUhBU19NSUkgfCBIQVNfQUNQSSwgdHVsaXBfdGltZXIgfSwKKworICAgLyogVUxpNTI2WCAqLworICAgeyAiVUxpIE01MjYxL001MjYzIiwgMTI4LCAweDAwMDFlYmVmLAorICAgICAgICBIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IEhBU19BQ1BJLCB0dWxpcF90aW1lciB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHVsaXBfcGNpX3RibFtdID0geworCXsgMHgxMDExLCAweDAwMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERDMjExNDAgfSwKKwl7IDB4MTAxMSwgMHgwMDE5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBEQzIxMTQzIH0sCisJeyAweDExQUQsIDB4MDAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTEM4MkMxNjggfSwKKwl7IDB4MTBkOSwgMHgwNTEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWDk4NzEzIH0sCisJeyAweDEwZDksIDB4MDUzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcxNSB9LAorLyoJeyAweDEwZDksIDB4MDUzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcyNSB9LCovCisJeyAweDEyNUIsIDB4MTQwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVg4ODE0MCB9LAorCXsgMHgxMUFELCAweGMxMTUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBOSUMyIH0sCisJeyAweDEzMTcsIDB4MDk4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTMxNywgMHgwOTg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMzE3LCAweDE5ODUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzMTcsIDB4OTUxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTNEMSwgMHhBQjAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxM0QxLCAweEFCMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzRDEsIDB4QUIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTA0QSwgMHgwOTgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMDRBLCAweDI3NzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEyNTksIDB4YTEyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTFGNiwgMHg5ODgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01QRVg5ODgxIH0sCisJeyAweDgwODYsIDB4MDAzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSTIxMTQ1IH0sCisJeyAweDEyODIsIDB4OTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRE05MTBYIH0sCisJeyAweDEyODIsIDB4OTEwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRE05MTBYIH0sCisJeyAweDExMTMsIDB4MTIxNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTExMywgMHgxMjE3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWDk4NzE1IH0sCisJeyAweDExMTMsIDB4OTUxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTE4NiwgMHgxNTQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMTg2LCAweDE1NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExODYsIDB4MTU5MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTRmMSwgMHgxODAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT05FWEFOVCB9LAorCXsgMHgxNjI2LCAweDg0MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDE3MzcsIDB4QUIwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTczNywgMHhBQjA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxN0IzLCAweEFCMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisgCXsgMHgxMGI5LCAweDUyNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFVMSTUyNlggfSwJLyogQUxpIDE1NjMgaW50ZWdyYXRlZCBldGhlcm5ldCAqLworIAl7IDB4MTBiOSwgMHg1MjYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBVTEk1MjZYIH0sCS8qIEFMaSAxNTYzIGludGVncmF0ZWQgZXRoZXJuZXQgKi8KKwl7IDB4MTBiNywgMHg5MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LCAvKiAzQ29tIDNDU09ITzEwMEItVFggKi8KKwl7IH0gLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHVsaXBfcGNpX3RibCk7CisKKworLyogQSBmdWxsLWR1cGxleCBtYXAgZm9yIG1lZGlhIHR5cGVzLiAqLworY29uc3QgY2hhciB0dWxpcF9tZWRpYV9jYXBbMzJdID0KK3swLDAsMCwxNiwgIDMsMTksMTYsMjQsICAyNyw0LDcsNSwgMCwyMCwyMywyMCwgIDI4LDMxLDAsMCwgfTsKKworc3RhdGljIHZvaWQgdHVsaXBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR1bGlwX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdHVsaXBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdHVsaXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdHVsaXBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR1bGlwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnR1bGlwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcHJpdmF0ZV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBwb2xsX3R1bGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHR1bGlwX3NldF9wb3dlcl9zdGF0ZSAoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwLAorCQkJCSAgIGludCBzbGVlcCwgaW50IHNub296ZSkKK3sKKwlpZiAodHAtPmZsYWdzICYgSEFTX0FDUEkpIHsKKwkJdTMyIHRtcCwgbmV3dG1wOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKHRwLT5wZGV2LCBDRkRELCAmdG1wKTsKKwkJbmV3dG1wID0gdG1wICYgfihDRkREX1NsZWVwIHwgQ0ZERF9Tbm9vemUpOworCQlpZiAoc2xlZXApCisJCQluZXd0bXAgfD0gQ0ZERF9TbGVlcDsKKwkJZWxzZSBpZiAoc25vb3plKQorCQkJbmV3dG1wIHw9IENGRERfU25vb3plOworCQlpZiAodG1wICE9IG5ld3RtcCkKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHRwLT5wZGV2LCBDRkRELCBuZXd0bXApOworCX0KKworfQorCisKK3N0YXRpYyB2b2lkIHR1bGlwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDMqSFo7CisJaW50IGk7CisKKwkvKiBXYWtlIHRoZSBjaGlwIGZyb20gc2xlZXAvc25vb3plIG1vZGUuICovCisJdHVsaXBfc2V0X3Bvd2VyX3N0YXRlICh0cCwgMCwgMCk7CisKKwkvKiBPbiBzb21lIGNoaXAgcmV2cyB3ZSBtdXN0IHNldCB0aGUgTUlJL1NZTSBwb3J0IGJlZm9yZSB0aGUgcmVzZXQhPyAqLworCWlmICh0cC0+bWlpX2NudCAgfHwgICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkpCisJCWlvd3JpdGUzMigweDAwMDQwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKworCS8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLworCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBDU1IwKTsKKwl1ZGVsYXkoMTAwKTsKKworCS8qIERlYXNzZXJ0IHJlc2V0LgorCSAgIFdhaXQgdGhlIHNwZWNpZmllZCA1MCBQQ0kgY3ljbGVzIGFmdGVyIGEgcmVzZXQgYnkgaW5pdGlhbGl6aW5nCisJICAgVHggYW5kIFJ4IHF1ZXVlcyBhbmQgdGhlIGFkZHJlc3MgZmlsdGVyIGxpc3QuICovCisJaW93cml0ZTMyKHRwLT5jc3IwLCBpb2FkZHIgKyBDU1IwKTsKKwl1ZGVsYXkoMTAwKTsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHVsaXBfdXAoKSwgaXJxPT0lZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJaW93cml0ZTMyKHRwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgQ1NSMyk7CisJaW93cml0ZTMyKHRwLT50eF9yaW5nX2RtYSwgaW9hZGRyICsgQ1NSNCk7CisJdHAtPmN1cl9yeCA9IHRwLT5jdXJfdHggPSAwOworCXRwLT5kaXJ0eV9yeCA9IHRwLT5kaXJ0eV90eCA9IDA7CisKKwlpZiAodHAtPmZsYWdzICYgTUNfSEFTSF9PTkxZKSB7CisJCXUzMiBhZGRyX2xvdyA9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKHUzMiAqKWRldi0+ZGV2X2FkZHIpKTsKKwkJdTMyIGFkZHJfaGlnaCA9IGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKHUxNiAqKShkZXYtPmRldl9hZGRyKzQpKSk7CisJCWlmICh0cC0+Y2hpcF9pZCA9PSBBWDg4MTQwKSB7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJaW93cml0ZTMyKGFkZHJfbG93LCAgaW9hZGRyICsgQ1NSMTQpOworCQkJaW93cml0ZTMyKDEsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMihhZGRyX2hpZ2gsIGlvYWRkciArIENTUjE0KTsKKwkJfSBlbHNlIGlmICh0cC0+ZmxhZ3MgJiBDT01FVF9NQUNfQUREUikgeworCQkJaW93cml0ZTMyKGFkZHJfbG93LCAgaW9hZGRyICsgMHhBNCk7CisJCQlpb3dyaXRlMzIoYWRkcl9oaWdoLCBpb2FkZHIgKyAweEE4KTsKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyAweEFDKTsKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyAweEIwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRoaXMgaXMgc2V0X3J4X21vZGUoKSwgYnV0IHdpdGhvdXQgc3RhcnRpbmcgdGhlIHRyYW5zbWl0dGVyLiAqLworCQl1MTYgKmVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCQl1MTYgKnNldHVwX2ZybSA9ICZ0cC0+c2V0dXBfZnJhbWVbMTUqNl07CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCQkvKiAyMTE0MCBidWc6IHlvdSBtdXN0IGFkZCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuICovCisJCW1lbXNldCh0cC0+c2V0dXBfZnJhbWUsIDB4ZmYsIHNpemVvZih0cC0+c2V0dXBfZnJhbWUpKTsKKwkJLyogRmlsbCB0aGUgZmluYWwgZW50cnkgb2YgdGhlIHRhYmxlIHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOworCQkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsKKwkJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07CisKKwkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+c2V0dXBfZnJhbWUsCisJCQkJCSBzaXplb2YodHAtPnNldHVwX2ZyYW1lKSwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0cC0+dHhfYnVmZmVyc1t0cC0+Y3VyX3R4XS5za2IgPSBOVUxMOworCQl0cC0+dHhfYnVmZmVyc1t0cC0+Y3VyX3R4XS5tYXBwaW5nID0gbWFwcGluZzsKKworCQkvKiBQdXQgdGhlIHNldHVwIGZyYW1lIG9uIHRoZSBUeCBsaXN0LiAqLworCQl0cC0+dHhfcmluZ1t0cC0+Y3VyX3R4XS5sZW5ndGggPSBjcHVfdG9fbGUzMigweDA4MDAwMDAwIHwgMTkyKTsKKwkJdHAtPnR4X3JpbmdbdHAtPmN1cl90eF0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCQl0cC0+dHhfcmluZ1t0cC0+Y3VyX3R4XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duZWQpOworCisJCXRwLT5jdXJfdHgrKzsKKwl9CisKKwl0cC0+c2F2ZWRfaWZfcG9ydCA9IGRldi0+aWZfcG9ydDsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IHRwLT5kZWZhdWx0X3BvcnQ7CisKKwkvKiBBbGxvdyBzZWxlY3RpbmcgYSBkZWZhdWx0IG1lZGlhLiAqLworCWkgPSAwOworCWlmICh0cC0+bXRhYmxlID09IE5VTEwpCisJCWdvdG8gbWVkaWFfcGlja2VkOworCWlmIChkZXYtPmlmX3BvcnQpIHsKKwkJaW50IGxvb2tpbmdfZm9yID0gdHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJID8gMTEgOgorCQkJKGRldi0+aWZfcG9ydCA9PSAxMiA/IDAgOiBkZXYtPmlmX3BvcnQpOworCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisJCQlpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gbG9va2luZ19mb3IpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgdXNlci1zcGVjaWZpZWQgbWVkaWEgJXMuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJCQlnb3RvIG1lZGlhX3BpY2tlZDsKKwkJCX0KKwl9CisJaWYgKCh0cC0+bXRhYmxlLT5kZWZhdWx0bWVkaWEgJiAweDA4MDApID09IDApIHsKKwkJaW50IGxvb2tpbmdfZm9yID0gdHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhICYgTUVESUFfTUFTSzsKKwkJZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorCQkJaWYgKHRwLT5tdGFibGUtPm1sZWFmW2ldLm1lZGlhID09IGxvb2tpbmdfZm9yKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIEVFUFJPTS1zZXQgbWVkaWEgJXMuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtsb29raW5nX2Zvcl0pOworCQkJCWdvdG8gbWVkaWFfcGlja2VkOworCQkJfQorCX0KKwkvKiBTdGFydCBzZW5zaW5nIGZpcnN0IG5vbi1mdWxsLWR1cGxleCBtZWRpYS4gKi8KKwlmb3IgKGkgPSB0cC0+bXRhYmxlLT5sZWFmY291bnQgLSAxOworCQkgKHR1bGlwX21lZGlhX2NhcFt0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYV0gJiBNZWRpYUFsd2F5c0ZEKSAmJiBpID4gMDsgaS0tKQorCQk7CittZWRpYV9waWNrZWQ6CisKKwl0cC0+Y3NyNiA9IDA7CisJdHAtPmN1cl9pbmRleCA9IGk7CisJdHAtPm53YXlzZXQgPSAwOworCisJaWYgKGRldi0+aWZfcG9ydCkgeworCQlpZiAodHAtPmNoaXBfaWQgPT0gREMyMTE0MyAgJiYKKwkJICAgICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpKSB7CisJCQkvKiBXZSBtdXN0IHJlc2V0IHRoZSBtZWRpYSBDU1JzIHdoZW4gd2UgZm9yY2Utc2VsZWN0IE1JSSBtb2RlLiAqLworCQkJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworCQkJaW93cml0ZTMyKDB4MDAwOCwgaW9hZGRyICsgQ1NSMTUpOworCQl9CisJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDEpOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gREMyMTE0MikgeworCQlpZiAodHAtPm1paV9jbnQpIHsKKwkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDEpOworCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgTUlJIHRyYW5zY2VpdmVyICVkLCBzdGF0dXMgIgorCQkJCQkgICAiJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHRwLT5waHlzWzBdLCB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgMSkpOworCQkJaW93cml0ZTMyKGNzcjZfbWFza19kZWZzdGF0ZSwgaW9hZGRyICsgQ1NSNik7CisJCQl0cC0+Y3NyNiA9IGNzcjZfbWFza19oZGNhcDsKKwkJCWRldi0+aWZfcG9ydCA9IDExOworCQkJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworCQl9IGVsc2UKKwkJCXQyMTE0Ml9zdGFydF9ud2F5KGRldik7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBQTklDMikgeworCSAgICAgICAgLyogZm9yIGluaXRpYWwgc3RhcnR1cCBhZHZlcnRpc2UgMTAvMTAwIEZ1bGwgYW5kIEhhbGYgKi8KKwkgICAgICAgIHRwLT5zeW1fYWR2ZXJ0aXNlID0gMHgwMUUwOworICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBhdXRvbmVnb3RpYXRlIGVuZCBpbnRlcnJ1cHQgKi8KKwkgICAgICAgIGlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIrQ1NSNSl8IDB4MDAwMDgwMTAsIGlvYWRkciArIENTUjUpOworCSAgICAgICAgaW93cml0ZTMyKGlvcmVhZDMyKGlvYWRkcitDU1I3KXwgMHgwMDAwODAxMCwgaW9hZGRyICsgQ1NSNyk7CisJCXBuaWMyX3N0YXJ0X253YXkoZGV2KTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4ICAmJiAgISB0cC0+bWVkaWFsb2NrKSB7CisJCWlmICh0cC0+bWlpX2NudCkgeworCQkJZGV2LT5pZl9wb3J0ID0gMTE7CisJCQl0cC0+Y3NyNiA9IDB4ODE0QzAwMDAgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisJCQlpb3dyaXRlMzIoMHgwMDAxLCBpb2FkZHIgKyBDU1IxNSk7CisJCX0gZWxzZSBpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkgJiBUUExua1Bhc3MpCisJCQlwbmljX2RvX253YXkoZGV2KTsKKwkJZWxzZSB7CisJCQkvKiBTdGFydCB3aXRoIDEwbWJwcyB0byBkbyBhdXRvbmVnb3RpYXRpb24uICovCisJCQlpb3dyaXRlMzIoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworCQkJdHAtPmNzcjYgPSAweDAwNDIwMDAwOworCQkJaW93cml0ZTMyKDB4MDAwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQkJaW93cml0ZTMyKDB4MDIwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQkJbmV4dF90aWNrID0gMSpIWjsKKwkJfQorCX0gZWxzZSBpZiAoKHRwLT5jaGlwX2lkID09IE1YOTg3MTMgfHwgdHAtPmNoaXBfaWQgPT0gQ09NUEVYOTg4MSkKKwkJCSAgICYmICEgdHAtPm1lZGlhbG9jaykgeworCQlkZXYtPmlmX3BvcnQgPSAwOworCQl0cC0+Y3NyNiA9IDB4MDE4ODAwMDAgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisJCWlvd3JpdGUzMigweDBmMzcwMDAwIHwgaW9yZWFkMTYoaW9hZGRyICsgMHg4MCksIGlvYWRkciArIDB4ODApOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gTVg5ODcxNSB8fCB0cC0+Y2hpcF9pZCA9PSBNWDk4NzI1KSB7CisJCS8qIFByb3ZpZGVkIGJ5IEJPTE8sIE1hY3Jvbml4IC0gMTIvMTAvMTk5OC4gKi8KKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJdHAtPmNzcjYgPSAweDAxYTgwMjAwOworCQlpb3dyaXRlMzIoMHgwZjM3MDAwMCB8IGlvcmVhZDE2KGlvYWRkciArIDB4ODApLCBpb2FkZHIgKyAweDgwKTsKKwkJaW93cml0ZTMyKDB4MTEwMDAgfCBpb3JlYWQxNihpb2FkZHIgKyAweGEwKSwgaW9hZGRyICsgMHhhMCk7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCB8fCB0cC0+Y2hpcF9pZCA9PSBDT05FWEFOVCkgeworCQkvKiBFbmFibGUgYXV0b21hdGljIFR4IHVuZGVycnVuIHJlY292ZXJ5LiAqLworCQlpb3dyaXRlMzIoaW9yZWFkMzIoaW9hZGRyICsgMHg4OCkgfCAxLCBpb2FkZHIgKyAweDg4KTsKKwkJZGV2LT5pZl9wb3J0ID0gdHAtPm1paV9jbnQgPyAxMSA6IDA7CisJCXRwLT5jc3I2ID0gMHgwMDA0MDAwMDsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IEFYODgxNDApIHsKKwkJdHAtPmNzcjYgPSB0cC0+bWlpX2NudCA/IDB4MDAwNDAxMDAgOiAweDAwMDAwMTAwOworCX0gZWxzZQorCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAxKTsKKworCS8qIFN0YXJ0IHRoZSBjaGlwJ3MgVHggdG8gcHJvY2VzcyBzZXR1cCBmcmFtZS4gKi8KKwl0dWxpcF9zdG9wX3J4dHgodHApOworCWJhcnJpZXIoKTsKKwl1ZGVsYXkoNSk7CisJaW93cml0ZTMyKHRwLT5jc3I2IHwgVHhPbiwgaW9hZGRyICsgQ1NSNik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNSk7CisJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMsIGlvYWRkciArIENTUjcpOworCXR1bGlwX3N0YXJ0X3J4dHgodHApOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IyKTsJCS8qIFJ4IHBvbGwgZGVtYW5kICovCisKKwlpZiAodHVsaXBfZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSB0dWxpcF91cCgpLCBDU1IwICU4Ljh4LCBDU1I1ICU4Ljh4IENTUjYgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IwKSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSk7CisJfQorCisJLyogU2V0IHRoZSB0aW1lciB0byBzd2l0Y2ggdG8gY2hlY2sgZm9yIGxpbmsgYmVhdCBhbmQgcGVyaGFwcyBzd2l0Y2gKKwkgICB0byBhbiBhbHRlcm5hdGUgbWVkaWEgdHlwZS4gKi8KKwl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVChuZXh0X3RpY2spOworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCWluaXRfdGltZXIoJnRwLT5vb21fdGltZXIpOworICAgICAgICB0cC0+b29tX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgICAgIHRwLT5vb21fdGltZXIuZnVuY3Rpb24gPSBvb21fdGltZXI7CisjZW5kaWYKK30KKworc3RhdGljIGludAordHVsaXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmdHVsaXBfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCXR1bGlwX2luaXRfcmluZyAoZGV2KTsKKworCXR1bGlwX3VwIChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB0dWxpcF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpIHsKKwkJLyogRG8gbm90aGluZyAtLSB0aGUgbWVkaWEgbW9uaXRvciBzaG91bGQgaGFuZGxlIHRoaXMuICovCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZW91dCB1c2luZyBNSUkgZGV2aWNlLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gREMyMTE0MCB8fCB0cC0+Y2hpcF9pZCA9PSBEQzIxMTQyCisJCQkgICB8fCB0cC0+Y2hpcF9pZCA9PSBNWDk4NzEzIHx8IHRwLT5jaGlwX2lkID09IENPTVBFWDk4ODEKKwkJCSAgIHx8IHRwLT5jaGlwX2lkID09IERNOTEwWCB8fCB0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAyMTE0MCB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwgIgorCQkJICAgIlNJQSAlOC44eCAlOC44eCAlOC44eCAlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTMpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCksIGlvcmVhZDMyKGlvYWRkciArIENTUjE1KSk7CisJCWlmICggISB0cC0+bWVkaWFsb2NrICAmJiAgdHAtPm10YWJsZSkgeworCQkJZG8KKwkJCQktLXRwLT5jdXJfaW5kZXg7CisJCQl3aGlsZSAodHAtPmN1cl9pbmRleCA+PSAwCisJCQkJICAgJiYgKHR1bGlwX21lZGlhX2NhcFt0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XS5tZWRpYV0KKwkJCQkJICAgJiBNZWRpYUlzRkQpKTsKKwkJCWlmICgtLXRwLT5jdXJfaW5kZXggPCAwKSB7CisJCQkJLyogV2Ugc3RhcnQgYWdhaW4sIGJ1dCBzaG91bGQgaW5zdGVhZCBsb29rIGZvciBkZWZhdWx0LiAqLworCQkJCXRwLT5jdXJfaW5kZXggPSB0cC0+bXRhYmxlLT5sZWFmY291bnQgLSAxOworCQkJfQorCQkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgMCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzd2l0Y2hpbmcgdG8gJXMgIgorCQkJCSAgICJtZWRpYS5cbiIsIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0pOworCQl9CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBQTklDMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUE5JQzIgdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsICIKKwkJICAgICAgICJDU1I2LzcgJTguOHggLyAlOC44eCBDU1IxMiAlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAoaW50KWlvcmVhZDMyKGlvYWRkciArIENTUjUpLCAoaW50KWlvcmVhZDMyKGlvYWRkciArIENTUjYpLAorCQkgICAgICAgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1I3KSwgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwgQ1NSMTIgIgorCQkJICAgIiU4Ljh4LCByZXNldHRpbmcuLi5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIENTUjUpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCQlkZXYtPmlmX3BvcnQgPSAwOworCX0KKworI2lmIGRlZmluZWQod2F5X3Rvb19tYW55X21lc3NhZ2VzKQorCWlmICh0dWxpcF9kZWJ1ZyA+IDMpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJdTggKmJ1ZiA9ICh1OCAqKSh0cC0+cnhfcmluZ1tpXS5idWZmZXIxKTsKKwkJCWludCBqOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUyZDogJTguOHggJTguOHggJTguOHggJTguOHggICIKKwkJCQkgICAiJTIuMnggJTIuMnggJTIuMnguXG4iLAorCQkJCSAgIGksICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjIsCisJCQkJICAgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisJCQlmb3IgKGogPSAwOyBidWZbal0gIT0gMHhlZSAmJiBqIDwgMTYwMDsgaisrKQorCQkJCWlmIChqIDwgMTAwKSBwcmludGsoIiAlMi4yeCIsIGJ1ZltqXSk7CisJCQlwcmludGsoIiBqPSVkLlxuIiwgaik7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlOC44eDogIiwgKGludCl0cC0+cnhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU4Ljh4IiwgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5zdGF0dXMpOworCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHICIgIFR4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnR4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJLyogU3RvcCBhbmQgcmVzdGFydCB0aGUgY2hpcCdzIFR4IHByb2Nlc3NlcyAuICovCisKKwl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMSk7CisKKwl0cC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJdHAtPnN1c3BfcnggPSAwOworCXRwLT50dGltZXIgPSAwOworCXRwLT5uaXIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDB4MDAwMDAwMDA7CisJCXRwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1opOworCQl0cC0+cnhfcmluZ1tpXS5idWZmZXIyID0gY3B1X3RvX2xlMzIodHAtPnJ4X3JpbmdfZG1hICsgc2l6ZW9mKHN0cnVjdCB0dWxpcF9yeF9kZXNjKSAqIChpICsgMSkpOworCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+cnhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwl0cC0+cnhfcmluZ1tpLTFdLmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogfCBERVNDX1JJTkdfV1JBUCk7CisJdHAtPnJ4X3JpbmdbaS0xXS5idWZmZXIyID0gY3B1X3RvX2xlMzIodHAtPnJ4X3JpbmdfZG1hKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJLyogTm90ZSB0aGUgcmVjZWl2ZSBidWZmZXIgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkLgorCQkgICBkZXZfYWxsb2Nfc2tiKCkgcHJvdmlkZXMgMTYgYnl0ZSBhbGlnbm1lbnQuICBCdXQgZG8gKm5vdCoKKwkJICAgdXNlIHNrYl9yZXNlcnZlKCkgdG8gYWxpZ24gdGhlIElQIGhlYWRlciEgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCXRwLT5yeF9idWZmZXJzW2ldLnNrYiA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT50YWlsLAorCQkJCQkgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJdHAtPnJ4X2J1ZmZlcnNbaV0ubWFwcGluZyA9IG1hcHBpbmc7CisJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJdHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsJLyogT3duZWQgYnkgVHVsaXAgY2hpcCAqLworCQl0cC0+cnhfcmluZ1tpXS5idWZmZXIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisJfQorCXRwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorCSAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT50eF9idWZmZXJzW2ldLnNrYiA9IE5VTEw7CisJCXRwLT50eF9idWZmZXJzW2ldLm1hcHBpbmcgPSAwOworCQl0cC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAweDAwMDAwMDAwOworCQl0cC0+dHhfcmluZ1tpXS5idWZmZXIyID0gY3B1X3RvX2xlMzIodHAtPnR4X3JpbmdfZG1hICsgc2l6ZW9mKHN0cnVjdCB0dWxpcF90eF9kZXNjKSAqIChpICsgMSkpOworCX0KKwl0cC0+dHhfcmluZ1tpLTFdLmJ1ZmZlcjIgPSBjcHVfdG9fbGUzMih0cC0+dHhfcmluZ19kbWEpOworfQorCitzdGF0aWMgaW50Cit0dWxpcF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisJdTMyIGZsYWc7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSB0cC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IHNrYjsKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZzsKKwl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCisJaWYgKHRwLT5jdXJfdHggLSB0cC0+ZGlydHlfdHggPCBUWF9SSU5HX1NJWkUvMikgey8qIFR5cGljYWwgcGF0aCAqLworCQlmbGFnID0gMHg2MDAwMDAwMDsgLyogTm8gaW50ZXJydXB0ICovCisJfSBlbHNlIGlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID09IFRYX1JJTkdfU0laRS8yKSB7CisJCWZsYWcgPSAweGUwMDAwMDAwOyAvKiBUeC1kb25lIGludHIuICovCisJfSBlbHNlIGlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFIC0gMikgeworCQlmbGFnID0gMHg2MDAwMDAwMDsgLyogTm8gVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSB7CQkvKiBMZWF2ZSByb29tIGZvciBzZXRfcnhfbW9kZSgpIHRvIGZpbGwgZW50cmllcy4gKi8KKwkJZmxhZyA9IDB4ZTAwMDAwMDA7IC8qIFR4LWRvbmUgaW50ci4gKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKwlpZiAoZW50cnkgPT0gVFhfUklOR19TSVpFLTEpCisJCWZsYWcgPSAweGUwMDAwMDAwIHwgREVTQ19SSU5HX1dSQVA7CisKKwl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCBmbGFnKTsKKwkvKiBpZiB3ZSB3ZXJlIHVzaW5nIFRyYW5zbWl0IEF1dG9tYXRpYyBQb2xsaW5nLCB3ZSB3b3VsZCBuZWVkIGEKKwkgKiB3bWIoKSBoZXJlLiAqLworCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duZWQpOworCXdtYigpOworCisJdHAtPmN1cl90eCsrOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCWlvd3JpdGUzMigwLCB0cC0+YmFzZV9hZGRyICsgQ1NSMSk7CisKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR1bGlwX2NsZWFuX3R4X3Jpbmcoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworCXVuc2lnbmVkIGludCBkaXJ0eV90eDsKKworCWZvciAoZGlydHlfdHggPSB0cC0+ZGlydHlfdHggOyB0cC0+Y3VyX3R4IC0gZGlydHlfdHggPiAwOworCQlkaXJ0eV90eCsrKSB7CisJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlpbnQgc3RhdHVzID0gbGUzMl90b19jcHUodHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsJLyogSXQgd2Fzbid0IFR4ZWQgKi8KKwkJCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIFR4IGZpbHRlciBzZXR1cCBmcmFtZXMuICovCisJCWlmICh0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJCS8qIHRlc3QgYmVjYXVzZSBkdW1teSBmcmFtZXMgbm90IG1hcHBlZCAqLworCQkJaWYgKHRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nKQorCQkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQlzaXplb2YodHAtPnNldHVwX2ZyYW1lKSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2ItPmxlbiwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCWRldl9rZnJlZV9za2JfaXJxKHRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IpOworCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgdHVsaXBfZG93biAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGVsX3RpbWVyX3N5bmMgKCZ0cC0+dGltZXIpOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisJZGVsX3RpbWVyX3N5bmMgKCZ0cC0+b29tX3RpbWVyKTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyICgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I3KTsKKworCS8qIFN0b3AgdGhlIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJdHVsaXBfc3RvcF9yeHR4KHRwKTsKKworCS8qIHByZXBhcmUgcmVjZWl2ZSBidWZmZXJzICovCisJdHVsaXBfcmVmaWxsX3J4KGRldik7CisKKwkvKiByZWxlYXNlIGFueSB1bmNvbnN1bWVkIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwl0dWxpcF9jbGVhbl90eF9yaW5nKHRwKTsKKworCWlmIChpb3JlYWQzMiAoaW9hZGRyICsgQ1NSNikgIT0gMHhmZmZmZmZmZikKKwkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIgKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlpbml0X3RpbWVyKCZ0cC0+dGltZXIpOworCXRwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXRwLT50aW1lci5mdW5jdGlvbiA9IHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0ubWVkaWFfdGltZXI7CisKKwlkZXYtPmlmX3BvcnQgPSB0cC0+c2F2ZWRfaWZfcG9ydDsKKworCS8qIExlYXZlIHRoZSBkcml2ZXIgaW4gc25vb3plLCBub3Qgc2xlZXAsIG1vZGUuICovCisJdHVsaXBfc2V0X3Bvd2VyX3N0YXRlICh0cCwgMCwgMSk7Cit9CisKKworc3RhdGljIGludCB0dWxpcF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwl0dWxpcF9kb3duIChkZXYpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCQkJZGV2LT5uYW1lLCBpb3JlYWQzMiAoaW9hZGRyICsgQ1NSNSkpOworCisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPnJ4X2J1ZmZlcnNbaV0uc2tiOworCQlkbWFfYWRkcl90IG1hcHBpbmcgPSB0cC0+cnhfYnVmZmVyc1tpXS5tYXBwaW5nOworCisJCXRwLT5yeF9idWZmZXJzW2ldLnNrYiA9IE5VTEw7CisJCXRwLT5yeF9idWZmZXJzW2ldLm1hcHBpbmcgPSAwOworCisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CS8qIE5vdCBvd25lZCBieSBUdWxpcCBjaGlwLiAqLworCQl0cC0+cnhfcmluZ1tpXS5sZW5ndGggPSAwOworCQl0cC0+cnhfcmluZ1tpXS5idWZmZXIxID0gMHhCQURGMDBEMDsJLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBtYXBwaW5nLCBQS1RfQlVGX1NaLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0cC0+dHhfYnVmZmVyc1tpXS5za2I7CisKKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+dHhfYnVmZmVyc1tpXS5tYXBwaW5nLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJfQorCQl0cC0+dHhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+dHhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0dWxpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOCkgJiAweGZmZmY7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCB0dWxpcF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSB0dWxpcF9nZXRfZHJ2aW5mbworfTsKKworLyogUHJvdmlkZSBpb2N0bCgpIGNhbGxzIHRvIGV4YW1pbmUgdGhlIE1JSSB4Y3ZyIHN0YXRlLiAqLworc3RhdGljIGludCBwcml2YXRlX2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJY29uc3QgdW5zaWduZWQgaW50IHBoeV9pZHggPSAwOworCWludCBwaHkgPSB0cC0+cGh5c1twaHlfaWR4XSAmIDB4MWY7CisJdW5zaWduZWQgaW50IHJlZ251bSA9IGRhdGEtPnJlZ19udW07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJaWYgKHRwLT5taWlfY250KQorCQkJZGF0YS0+cGh5X2lkID0gcGh5OworCQllbHNlIGlmICh0cC0+ZmxhZ3MgJiBIQVNfTldBWSkKKwkJCWRhdGEtPnBoeV9pZCA9IDMyOworCQllbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCkKKwkJCWRhdGEtPnBoeV9pZCA9IDE7CisJCWVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSAzMiAmJiAodHAtPmZsYWdzICYgSEFTX05XQVkpKSB7CisJCQlpbnQgY3NyMTIgPSBpb3JlYWQzMiAoaW9hZGRyICsgQ1NSMTIpOworCQkJaW50IGNzcjE0ID0gaW9yZWFkMzIgKGlvYWRkciArIENTUjE0KTsKKwkJCXN3aXRjaCAocmVnbnVtKSB7CisJCQljYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGNzcjE0PDw1KSAmIDB4MTAwMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2LT5pZl9wb3J0ID09IDUgJiYgdHAtPm53YXlzZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnZhbF9vdXQgPSAweDEwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0gKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdJk1lZGlhSXMxMDAgPyAweDIwMDAgOiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0mTWVkaWFJc0ZEID8gMHgwMTAwIDogMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnZhbF9vdXQgPQorCQkJCQkweDE4NDggKworCQkJCQkoKGNzcjEyJjB4NzAwMCkgPT0gMHg1MDAwID8gMHgyMCA6IDApICsKKwkJCQkJKChjc3IxMiYweDA2KSA9PSA2ID8gMCA6IDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0IHw9IDB4NjA0ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2ZXJ0aXNlZCB2YWx1ZSwgYm9ndXMgMTBiYXNlVHgtRkQgdmFsdWUgZnJvbSBDU1I2LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0KKwkJCQkJKChpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSA+PiAzKSAmIDB4MDA0MCkgKworCQkJCQkoKGNzcjE0ID4+IDEpICYgMHgyMCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0IHw9ICgoY3NyMTQgPj4gOSkgJiAweDAzQzApOworCQkJCWJyZWFrOworCQkJY2FzZSA1OiBkYXRhLT52YWxfb3V0ID0gdHAtPmxwYXI7IGJyZWFrOworCQkJZGVmYXVsdDogZGF0YS0+dmFsX291dCA9IDA7IGJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJZGF0YS0+dmFsX291dCA9IHR1bGlwX21kaW9fcmVhZCAoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCByZWdudW0pOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZSAoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAocmVnbnVtICYgfjB4MWYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSBwaHkpIHsKKwkJCXUxNiB2YWx1ZSA9IGRhdGEtPnZhbF9pbjsKKwkJCXN3aXRjaCAocmVnbnVtKSB7CisJCQljYXNlIDA6CS8qIENoZWNrIGZvciBhdXRvbmVnb3RpYXRpb24gb24gb3IgcmVzZXQuICovCisJCQkJdHAtPmZ1bGxfZHVwbGV4X2xvY2sgPSAodmFsdWUgJiAweDkwMDApID8gMCA6IDE7CisJCQkJaWYgKHRwLT5mdWxsX2R1cGxleF9sb2NrKQorCQkJCQl0cC0+ZnVsbF9kdXBsZXggPSAodmFsdWUgJiAweDAxMDApID8gMSA6IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdID0KKwkJCQl0cC0+bWlpX2FkdmVydGlzZSA9IGRhdGEtPnZhbF9pbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZGF0YS0+cGh5X2lkID09IDMyICYmICh0cC0+ZmxhZ3MgJiBIQVNfTldBWSkpIHsKKwkJCXUxNiB2YWx1ZSA9IGRhdGEtPnZhbF9pbjsKKwkJCWlmIChyZWdudW0gPT0gMCkgeworCQkJICBpZiAoKHZhbHVlICYgMHgxMjAwKSA9PSAweDEyMDApIHsKKwkJCSAgICBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5pYzJfc3RhcnRfbndheSAoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJCSAgIHQyMTE0Ml9zdGFydF9ud2F5IChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCSAgfQorCQkJfSBlbHNlIGlmIChyZWdudW0gPT0gNCkKKwkJCQl0cC0+c3ltX2FkdmVydGlzZSA9IHZhbHVlOworCQl9IGVsc2UgeworCQkJdHVsaXBfbWRpb193cml0ZSAoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCByZWdudW0sIGRhdGEtPnZhbF9pbik7CisJCX0KKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIE5vdGUgdGhhdCB3ZSBvbmx5IHVzZSBleGNsdXNpb24gYXJvdW5kIGFjdHVhbGx5IHF1ZXVlaW5nIHRoZQorICAgbmV3IGZyYW1lLCBub3QgYXJvdW5kIGZpbGxpbmcgdHAtPnNldHVwX2ZyYW1lLiAgVGhpcyBpcyBub24tZGV0ZXJtaW5pc3RpYworICAgd2hlbiByZS1lbnRlcmVkIGJ1dCBzdGlsbCBjb3JyZWN0LiAqLworCisjdW5kZWYgc2V0X2JpdF9sZQorI2RlZmluZSBzZXRfYml0X2xlKGkscCkgZG8geyAoKGNoYXIgKikocCkpWyhpKS84XSB8PSAoMTw8KChpKSU4KSk7IH0gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgYnVpbGRfc2V0dXBfZnJhbWVfaGFzaCh1MTYgKnNldHVwX2ZybSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBoYXNoX3RhYmxlWzMyXTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKwl1MTYgKmVhZGRyczsKKworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCXNldF9iaXRfbGUoMjU1LCBoYXNoX3RhYmxlKTsgCQkJLyogQnJvYWRjYXN0IGVudHJ5ICovCisJLyogVGhpcyBzaG91bGQgd29yayBvbiBiaWctZW5kaWFuIG1hY2hpbmVzIGFzIHdlbGwuICovCisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQlpbnQgaW5kZXggPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgxZmY7CisKKwkJc2V0X2JpdF9sZShpbmRleCwgaGFzaF90YWJsZSk7CisKKwl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJKnNldHVwX2ZybSsrID0gaGFzaF90YWJsZVtpXTsKKwkJKnNldHVwX2ZybSsrID0gaGFzaF90YWJsZVtpXTsKKwl9CisJc2V0dXBfZnJtID0gJnRwLT5zZXR1cF9mcmFtZVsxMyo2XTsKKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX3BlcmZlY3QodTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKwl1MTYgKmVhZGRyczsKKworCS8qIFdlIGhhdmUgPD0gMTQgYWRkcmVzc2VzIHNvIHdlIGNhbiB1c2UgdGhlIHdvbmRlcmZ1bAorCSAgIDE2IGFkZHJlc3MgcGVyZmVjdCBmaWx0ZXJpbmcgb2YgdGhlIFR1bGlwLiAqLworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQ7CisJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwl9CisJLyogRmlsbCB0aGUgdW51c2VkIGVudHJpZXMgd2l0aCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuICovCisJbWVtc2V0KHNldHVwX2ZybSwgMHhmZiwgKDE1LWkpKjEyKTsKKwlzZXR1cF9mcm0gPSAmdHAtPnNldHVwX2ZyYW1lWzE1KjZdOworCisJLyogRmlsbCB0aGUgZmluYWwgZW50cnkgd2l0aCBvdXIgcGh5c2ljYWwgYWRkcmVzcy4gKi8KKwllYWRkcnMgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsKKwkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBjc3I2OworCisJY3NyNiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjYpICYgfjB4MDBENTsKKworCXRwLT5jc3I2ICY9IH4weDAwRDU7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJdHAtPmNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5czsKKwkJY3NyNiB8PSBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRBbGxQaHlzOworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gMTAwMCkgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHdlbGwgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQl0cC0+Y3NyNiB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisJCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCX0gZWxzZQlpZiAodHAtPmZsYWdzICYgTUNfSEFTSF9PTkxZKSB7CisJCS8qIFNvbWUgd29yay1hbGlrZXMgaGF2ZSBvbmx5IGEgNjQtZW50cnkgaGFzaCBmaWx0ZXIgdGFibGUuICovCisJCS8qIFNob3VsZCB2ZXJpZnkgY29ycmVjdG5lc3Mgb24gYmlnLWVuZGlhbi9fX3Bvd2VycGNfXyAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisJCWlmIChkZXYtPm1jX2NvdW50ID4gNjQpIHsJCS8qIEFyYml0cmFyeSBub24tZWZmZWN0aXZlIGxpbWl0LiAqLworCQkJdHAtPmNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCQkJY3NyNiB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisJCX0gZWxzZSB7CisJCQl1MzIgbWNfZmlsdGVyWzJdID0gezAsIDB9OwkJIC8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCQkJaW50IGZpbHRlcmJpdDsKKwkJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJCWlmICh0cC0+ZmxhZ3MgJiBDT01FVF9NQUNfQUREUikKKwkJCQkJZmlsdGVyYml0ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKTsKKwkJCQllbHNlCisJCQkJCWZpbHRlcmJpdCA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQkJZmlsdGVyYml0ICY9IDB4M2Y7CisJCQkJbWNfZmlsdGVyW2ZpbHRlcmJpdCA+PiA1XSB8PSAxIDw8IChmaWx0ZXJiaXQgJiAzMSk7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMikgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRkZWQgZmlsdGVyIGZvciAlMi4yeDolMi4yeDolMi4yeDoiCisJCQkJCQkgICAiJTIuMng6JTIuMng6JTIuMnggICU4Ljh4IGJpdCAlZC5cbiIsIGRldi0+bmFtZSwKKwkJCQkJCSAgIG1jbGlzdC0+ZG1pX2FkZHJbMF0sIG1jbGlzdC0+ZG1pX2FkZHJbMV0sCisJCQkJCQkgICBtY2xpc3QtPmRtaV9hZGRyWzJdLCBtY2xpc3QtPmRtaV9hZGRyWzNdLAorCQkJCQkJICAgbWNsaXN0LT5kbWlfYWRkcls0XSwgbWNsaXN0LT5kbWlfYWRkcls1XSwKKwkJCQkJCSAgIGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkciksIGZpbHRlcmJpdCk7CisJCQkJfQorCQkJfQorCQkJaWYgKG1jX2ZpbHRlclswXSA9PSB0cC0+bWNfZmlsdGVyWzBdICAmJgorCQkJCW1jX2ZpbHRlclsxXSA9PSB0cC0+bWNfZmlsdGVyWzFdKQorCQkJCTsJCQkJLyogTm8gY2hhbmdlLiAqLworCQkJZWxzZSBpZiAodHAtPmZsYWdzICYgSVNfQVNJWCkgeworCQkJCWlvd3JpdGUzMigyLCBpb2FkZHIgKyBDU1IxMyk7CisJCQkJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgQ1NSMTQpOworCQkJCWlvd3JpdGUzMigzLCBpb2FkZHIgKyBDU1IxMyk7CisJCQkJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgQ1NSMTQpOworCQkJfSBlbHNlIGlmICh0cC0+ZmxhZ3MgJiBDT01FVF9NQUNfQUREUikgeworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMF0sIGlvYWRkciArIDB4QUMpOworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIDB4QjApOworCQkJfQorCQkJdHAtPm1jX2ZpbHRlclswXSA9IG1jX2ZpbHRlclswXTsKKwkJCXRwLT5tY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMV07CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1MzIgdHhfZmxhZ3MgPSAweDA4MDAwMDAwIHwgMTkyOworCisJCS8qIE5vdGUgdGhhdCBvbmx5IHRoZSBsb3ctYWRkcmVzcyBzaG9ydHdvcmQgb2Ygc2V0dXBfZnJhbWUgaXMgdmFsaWQhCisJCSAgIFRoZSB2YWx1ZXMgYXJlIGRvdWJsZWQgZm9yIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4gKi8KKwkJaWYgKGRldi0+bWNfY291bnQgPiAxNCkgeyAvKiBNdXN0IHVzZSBhIG11bHRpY2FzdCBoYXNoIHRhYmxlLiAqLworCQkJYnVpbGRfc2V0dXBfZnJhbWVfaGFzaCh0cC0+c2V0dXBfZnJhbWUsIGRldik7CisJCQl0eF9mbGFncyA9IDB4MDg0MDAwMDAgfCAxOTI7CisJCX0gZWxzZSB7CisJCQlidWlsZF9zZXR1cF9mcmFtZV9wZXJmZWN0KHRwLT5zZXR1cF9mcmFtZSwgZGV2KTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID4gVFhfUklOR19TSVpFIC0gMikgeworCQkJLyogU2FtZSBzZXR1cCByZWNlbnRseSBxdWV1ZWQsIHdlIG5lZWQgbm90IGFkZCBpdC4gKi8KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCBlbnRyeTsKKwkJCWludCBkdW1teSA9IC0xOworCisJCQkvKiBOb3cgYWRkIHRoaXMgZnJhbWUgdG8gdGhlIFR4IGxpc3QuICovCisKKwkJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCisJCQlpZiAoZW50cnkgIT0gMCkgeworCQkJCS8qIEF2b2lkIGEgY2hpcCBlcnJhdGEgYnkgcHJlZml4aW5nIGEgZHVtbXkgZW50cnkuIERvbid0IGRvCisJCQkJICAgdGhpcyBvbiB0aGUgVUxJNTI2WCBhcyBpdCB0cmlnZ2VycyBhIGRpZmZlcmVudCBwcm9ibGVtICovCisJCQkJaWYgKCEodHAtPmNoaXBfaWQgPT0gVUxJNTI2WCAmJiAodHAtPnJldmlzaW9uID0gMHg0MCB8fCB0cC0+cmV2aXNpb24gPT0gMHg1MCkpKSB7CisJCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IDA7CisJCQkJCXRwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPQorCQkJCQkJKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKSA/IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQKSA6IDA7CisJCQkJCXRwLT50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gMDsKKwkJCQkJLyogTXVzdCBzZXQgRGVzY093bmVkIGxhdGVyIHRvIGF2b2lkIHJhY2Ugd2l0aCBjaGlwICovCisJCQkJCWR1bW15ID0gZW50cnk7CisJCQkJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCQkJCX0KKwkJCX0KKworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9CisJCQkJcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5zZXR1cF9mcmFtZSwKKwkJCQkJICAgICAgIHNpemVvZih0cC0+c2V0dXBfZnJhbWUpLAorCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQkvKiBQdXQgdGhlIHNldHVwIGZyYW1lIG9uIHRoZSBUeCBsaXN0LiAqLworCQkJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKQorCQkJCXR4X2ZsYWdzIHw9IERFU0NfUklOR19XUkFQOwkJLyogV3JhcCByaW5nLiAqLworCQkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKHR4X2ZsYWdzKTsKKwkJCXRwLT50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0KKwkJCQljcHVfdG9fbGUzMih0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyk7CisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwkJCWlmIChkdW1teSA+PSAwKQorCQkJCXRwLT50eF9yaW5nW2R1bW15XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duZWQpOworCQkJaWYgKHRwLT5jdXJfdHggLSB0cC0+ZGlydHlfdHggPj0gVFhfUklOR19TSVpFIC0gMikKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCisJaW93cml0ZTMyKGNzcjYsIGlvYWRkciArIENTUjYpOworfQorCisjaWZkZWYgQ09ORklHX1RVTElQX01XSQorc3RhdGljIHZvaWQgX19kZXZpbml0IHR1bGlwX213aV9jb25maWcgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTggY2FjaGU7CisJdTE2IHBjaV9jb21tYW5kOworCXUzMiBjc3IwOworCisJaWYgKHR1bGlwX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0dWxpcF9td2lfY29uZmlnKClcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKworCXRwLT5jc3IwID0gY3NyMCA9IDA7CisKKwkvKiBpZiB3ZSBoYXZlIGFueSBjYWNoZSBsaW5lIHNpemUgYXQgYWxsLCB3ZSBjYW4gZG8gTVJNICovCisJY3NyMCB8PSBNUk07CisKKwkvKiAuLi5hbmQgYmFycmluZyBoYXJkd2FyZSBidWdzLCBNV0kgKi8KKwlpZiAoISh0cC0+Y2hpcF9pZCA9PSBEQzIxMTQzICYmIHRwLT5yZXZpc2lvbiA9PSA2NSkpCisJCWNzcjAgfD0gTVdJOworCisJLyogc2V0IG9yIGRpc2FibGUgTVdJIGluIHRoZSBzdGFuZGFyZCBQQ0kgY29tbWFuZCBiaXQuCisJICogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlICBtd2kgaXMgZGVzaXJlZCBidXQgbm90IGF2YWlsYWJsZQorCSAqLworCWlmIChjc3IwICYgTVdJKQlwY2lfc2V0X213aShwZGV2KTsKKwllbHNlCQlwY2lfY2xlYXJfbXdpKHBkZXYpOworCisJLyogcmVhZCByZXN1bHQgZnJvbSBoYXJkd2FyZSAoaW4gY2FzZSBiaXQgcmVmdXNlZCB0byBlbmFibGUpICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKChjc3IwICYgTVdJKSAmJiAoIShwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpKSkKKwkJY3NyMCAmPSB+TVdJOworCisJLyogaWYgY2FjaGUgbGluZSBzaXplIGhhcmR3aXJlZCB0byB6ZXJvLCBubyBNV0kgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmY2FjaGUpOworCWlmICgoY3NyMCAmIE1XSSkgJiYgKGNhY2hlID09IDApKSB7CisJCWNzcjAgJj0gfk1XSTsKKwkJcGNpX2NsZWFyX213aShwZGV2KTsKKwl9CisKKwkvKiBhc3NpZ24gcGVyLWNhY2hlbGluZS1zaXplIGNhY2hlIGFsaWdubWVudCBhbmQKKwkgKiBidXJzdCBsZW5ndGggdmFsdWVzCisJICovCisJc3dpdGNoIChjYWNoZSkgeworCWNhc2UgODoKKwkJY3NyMCB8PSBNUkwgfCAoMSA8PCBDQUxTaGlmdCkgfCAoMTYgPDwgQnVyc3RMZW5TaGlmdCk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWNzcjAgfD0gTVJMIHwgKDIgPDwgQ0FMU2hpZnQpIHwgKDE2IDw8IEJ1cnN0TGVuU2hpZnQpOworCQlicmVhazsKKwljYXNlIDMyOgorCQljc3IwIHw9IE1STCB8ICgzIDw8IENBTFNoaWZ0KSB8ICgzMiA8PCBCdXJzdExlblNoaWZ0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2FjaGUgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiBpZiB3ZSBoYXZlIGEgZ29vZCBjYWNoZSBsaW5lIHNpemUsIHdlIGJ5IG5vdyBoYXZlIGEgZ29vZAorCSAqIGNzcjAsIHNvIHNhdmUgaXQgYW5kIGV4aXQKKwkgKi8KKwlpZiAoY2FjaGUpCisJCWdvdG8gb3V0OworCisJLyogd2UgZG9uJ3QgaGF2ZSBhIGdvb2QgY3NyMCBvciBjYWNoZSBsaW5lIHNpemUsIGRpc2FibGUgTVdJICovCisJaWYgKGNzcjAgJiBNV0kpIHsKKwkJcGNpX2NsZWFyX213aShwZGV2KTsKKwkJY3NyMCAmPSB+TVdJOworCX0KKworCS8qIHNhbmUgZGVmYXVsdHMgZm9yIGJ1cnN0IGxlbmd0aCBhbmQgY2FjaGUgYWxpZ25tZW50CisJICogb3JpZ2luYWxseSBmcm9tIGRlNHg1IGRyaXZlcgorCSAqLworCWNzcjAgfD0gKDggPDwgQnVyc3RMZW5TaGlmdCkgfCAoMSA8PCBDQUxTaGlmdCk7CisKK291dDoKKwl0cC0+Y3NyMCA9IGNzcjA7CisJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNV0kgY29uZmlnIGNhY2hlbGluZT0lZCwgY3NyMD0lMDh4XG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIGNhY2hlLCBjc3IwKTsKK30KKyNlbmRpZgorCisvKgorICoJQ2hpcHMgdGhhdCBoYXZlIHRoZSBNUk0vcmVzZXJ2ZWQgYml0IHF1aXJrIGFuZCB0aGUgYnVyc3QgcXVpcmsuIFRoYXQKKyAqCWlzIHRoZSBETTkxMFggYW5kIHRoZSBvbiBjaGlwIFVMaSBkZXZpY2VzCisgKi8KKyAKK3N0YXRpYyBpbnQgdHVsaXBfdWxpX2RtX3F1aXJrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT52ZW5kb3IgPT0gMHgxMjgyICYmIHBkZXYtPmRldmljZSA9PSAweDkxMDIpCisJCXJldHVybiAxOworCWlmIChwZGV2LT52ZW5kb3IgPT0gMHgxMGI5ICYmIHBkZXYtPmRldmljZSA9PSAweDUyNjEpCisJCXJldHVybiAxOworCWlmIChwZGV2LT52ZW5kb3IgPT0gMHgxMGI5ICYmIHBkZXYtPmRldmljZSA9PSAweDUyNjMpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0dWxpcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cDsKKwkvKiBTZWUgbm90ZSBiZWxvdyBvbiB0aGUgbXVsdGlwb3J0IGNhcmRzLiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfcGh5c19hZGRyWzZdID0gezB4MDAsICdMJywgJ2knLCAnbicsICd1JywgJ3gnfTsKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZWFybHlfNDg2X2NoaXBzZXRzW10gPSB7CisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDI0KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV80OTYpIH0sCisJCXsgfSwKKwl9OworCXN0YXRpYyBpbnQgbGFzdF9pcnE7CisJc3RhdGljIGludCBtdWx0aXBvcnRfY250OwkvKiBGb3IgZm91ci1wb3J0IGJvYXJkcyB3L29uZSBFRVBST00gKi8KKwl1OCBjaGlwX3JldjsKKwlpbnQgaSwgaXJxOworCXVuc2lnbmVkIHNob3J0IHN1bTsKKwl1bnNpZ25lZCBjaGFyICplZV9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlpbnQgY2hpcF9pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCWNvbnN0IGNoYXIgKmNoaXBfbmFtZSA9IHR1bGlwX3RibFtjaGlwX2lkeF0uY2hpcF9uYW1lOworCXVuc2lnbmVkIGludCBlZXByb21fbWlzc2luZyA9IDA7CisJdW5zaWduZWQgaW50IGZvcmNlX2NzcjAgPSAwOworCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb247CQkvKiBBbHJlYWR5IHByaW50ZWQgdmVyc2lvbiBpbmZvLiAqLworCWlmICh0dWxpcF9kZWJ1ZyA+IDAgICYmICBkaWRfdmVyc2lvbisrID09IDApCisJCXByaW50ayAoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworI2VuZGlmCisKKwlib2FyZF9pZHgrKzsKKworCS8qCisJICoJTGFuIG1lZGlhIHdpcmUgYSB0dWxpcCBjaGlwIHRvIGEgd2FuIGludGVyZmFjZS4gTmVlZHMgYSB2ZXJ5CisJICoJZGlmZmVyZW50IGRyaXZlciAobG1jIGRyaXZlcikKKwkgKi8KKworICAgICAgICBpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0xNQykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAic2tpcHBpbmcgTE1DIGNhcmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKglFYXJseSBETTkxMDAncyBuZWVkIHNvZnR3YXJlIENSQyBhbmQgdGhlIERNRkUgZHJpdmVyCisJICovCisKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTI4MiAmJiBwZGV2LT5kZXZpY2UgPT0gMHg5MTAwKQorCXsKKwkJdTMyIGRldl9yZXY7CisJCS8qIFJlYWQgQ2hpcCByZXZpc2lvbiAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JFVklTSU9OX0lELCAmZGV2X3Jldik7CisJCWlmKGRldl9yZXYgPCAweDAyMDAwMDMwKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJza2lwcGluZyBlYXJseSBETTkxMDAgd2l0aCBDcmMgYnVnICh1c2UgZG1mZSlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwkvKgorCSAqCUxvb2tzIGZvciBlYXJseSBQQ0kgY2hpcHNldHMgd2hlcmUgcGVvcGxlIHJlcG9ydCBoYW5ncworCSAqCXdpdGhvdXQgdGhlIHdvcmthcm91bmRzIGJlaW5nIG9uLgorCSAqLworCisJLyogMS4gSW50ZWwgU2F0dXJuLiBTd2l0Y2ggdG8gOCBsb25nIHdvcmRzIGJ1cnN0LCA4IGxvbmcgd29yZCBjYWNoZQorCSAgICAgIGFsaWduZWQuICBBcmllcyBtaWdodCBuZWVkIHRoaXMgdG9vLiBUaGUgU2F0dXJuIGVycmF0YSBhcmUgbm90IAorCSAgICAgIHByZXR0eSByZWFkaW5nIGJ1dCB0aGFua2Z1bGx5IGl0J3MgYW4gb2xkIDQ4NiBjaGlwc2V0LgorCisJICAgMi4gVGhlIGRyZWFkZWQgU2lTNDk2IDQ4NiBjaGlwc2V0LiBTYW1lIHdvcmthcm91bmQgYXMgSW50ZWwKKwkgICAgICBTYXR1cm4uCisJKi8KKworCWlmIChwY2lfZGV2X3ByZXNlbnQoZWFybHlfNDg2X2NoaXBzZXRzKSkgeworCQljc3IwID0gTVJMIHwgTVJNIHwgKDggPDwgQnVyc3RMZW5TaGlmdCkgfCAoMSA8PCBDQUxTaGlmdCk7CisJCWZvcmNlX2NzcjAgPSAxOworCX0KKworCS8qIGJ1Z2ZpeDogdGhlIEFTSVggbXVzdCBoYXZlIGEgYnVyc3QgbGltaXQgb3IgaG9ycmlibGUgdGhpbmdzIGhhcHBlbi4gKi8KKwlpZiAoY2hpcF9pZHggPT0gQVg4ODE0MCkgeworCQlpZiAoKGNzcjAgJiAweDNmMDApID09IDApCisJCQljc3IwIHw9IDB4MjAwMDsKKwl9CisKKwkvKiBQTklDIGRvZXNuJ3QgaGF2ZSBNV0kvTVJML01STS4uLiAqLworCWlmIChjaGlwX2lkeCA9PSBMQzgyQzE2OCkKKwkJY3NyMCAmPSB+MHhmZmYxMDAwMDsgLyogemVybyByZXNlcnZlZCBiaXRzIDMxOjIwLCAxNiAqLworCisJLyogRE05MTAyQSBoYXMgdHJvdWJsZXMgd2l0aCBNUk0gJiBjbGVhciByZXNlcnZlZCBiaXRzIDI0OjIyLCAyMCwgMTYsIDc6MSAqLworCWlmICh0dWxpcF91bGlfZG1fcXVpcmsocGRldikpIHsKKwkJY3NyMCAmPSB+MHgwMWYxMDBmZjsKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykKKyAgICAgICAgICAgICAgICBjc3IwID0gKGNzcjAgJiB+MHhmZjAwKSB8IDB4ZTAwMDsKKyNlbmRpZgorCX0KKwkvKgorCSAqCUFuZCBiYWNrIHRvIGJ1c2luZXNzCisJICovCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlgKKwkJCSJDYW5ub3QgZW5hYmxlIHR1bGlwIGJvYXJkICMlZCwgYWJvcnRpbmdcbiIsCisJCQlib2FyZF9pZHgpOworCQlyZXR1cm4gaTsKKwl9CisKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBhbGxvY19ldGhlcmRldiBlbnN1cmVzIGFsaWduZWQgYW5kIHplcm9lZCBwcml2YXRlIHN0cnVjdHVyZXMgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mICgqdHApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiZXRoZXIgZGV2aWNlIGFsbG9jIGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlpZiAocGNpX3Jlc291cmNlX2xlbiAocGRldiwgMCkgPCB0dWxpcF90YmxbY2hpcF9pZHhdLmlvX3NpemUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBJL08gcmVnaW9uICgweCVseEAweCVseCkgdG9vIHNtYWxsLCAiCisJCQkiYWJvcnRpbmdcbiIsIHBjaV9uYW1lKHBkZXYpLAorCQkJcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMCksCisJCQlwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCS8qIGdyYWIgYWxsIHJlc291cmNlcyBmcm9tIGJvdGggUElPIGFuZCBNTUlPIHJlZ2lvbnMsIGFzIHdlCisJICogZG9uJ3Qgd2FudCBhbnlvbmUgZWxzZSBtZXNzaW5nIGFyb3VuZCB3aXRoIG91ciBoYXJkd2FyZSAqLworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAidHVsaXAiKSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisjaWZuZGVmIFVTRV9JT19PUFMKKwlpb2FkZHIgPSAgcGNpX2lvbWFwKHBkZXYsIDEsIHR1bGlwX3RibFtjaGlwX2lkeF0uaW9fc2l6ZSk7CisjZWxzZQorCWlvYWRkciA9ICBwY2lfaW9tYXAocGRldiwgMCwgdHVsaXBfdGJsW2NoaXBfaWR4XS5pb19zaXplKTsKKyNlbmRpZgorCWlmICghaW9hZGRyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgUENJX1JFVklTSU9OX0lELCAmY2hpcF9yZXYpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgJ3RwJworCSAqIGl0IGlzIHplcm9lZCBhbmQgYWxpZ25lZCBpbiBhbGxvY19ldGhlcmRldgorCSAqLworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCB0dWxpcF9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRSArCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdHVsaXBfdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUsCisJCQkJCSAgICZ0cC0+cnhfcmluZ19kbWEpOworCWlmICghdHAtPnJ4X3JpbmcpCisJCWdvdG8gZXJyX291dF9tdGFibGU7CisJdHAtPnR4X3JpbmcgPSAoc3RydWN0IHR1bGlwX3R4X2Rlc2MgKikodHAtPnJ4X3JpbmcgKyBSWF9SSU5HX1NJWkUpOworCXRwLT50eF9yaW5nX2RtYSA9IHRwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkU7CisKKwl0cC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCXRwLT5mbGFncyA9IHR1bGlwX3RibFtjaGlwX2lkeF0uZmxhZ3M7CisJdHAtPnBkZXYgPSBwZGV2OworCXRwLT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJdHAtPnJldmlzaW9uID0gY2hpcF9yZXY7CisJdHAtPmNzcjAgPSBjc3IwOworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRwLT5taWlfbG9jayk7CisJaW5pdF90aW1lcigmdHAtPnRpbWVyKTsKKwl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwl0cC0+dGltZXIuZnVuY3Rpb24gPSB0dWxpcF90YmxbdHAtPmNoaXBfaWRdLm1lZGlhX3RpbWVyOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTVdJCisJaWYgKCFmb3JjZV9jc3IwICYmICh0cC0+ZmxhZ3MgJiBIQVNfUENJX01XSSkpCisJCXR1bGlwX213aV9jb25maWcgKHBkZXYsIGRldik7CisjZWxzZQorCS8qIE1XSSBpcyBicm9rZW4gZm9yIERDMjExNDMgcmV2IDY1Li4uICovCisJaWYgKGNoaXBfaWR4ID09IERDMjExNDMgJiYgY2hpcF9yZXYgPT0gNjUpCisJCXRwLT5jc3IwICY9IH5NV0k7CisjZW5kaWYKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXR1bGlwX3N0b3Bfcnh0eCh0cCk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworI2lmZGVmIENPTkZJR19HU0MKKwlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0hQKSB7CisJCXN3aXRjaCAocGRldi0+c3Vic3lzdGVtX2RldmljZSkgeworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCWNhc2UgMHgxMDYxOgorCQljYXNlIDB4MTA2MjoKKwkJY2FzZSAweDEwNjM6CisJCWNhc2UgMHgxMDk4OgorCQljYXNlIDB4MTA5OToKKwkJY2FzZSAweDEwRUU6CisJCQl0cC0+ZmxhZ3MgfD0gSEFTX1NXQVBQRURfU0VFUFJPTSB8IE5FRURTX0ZBS0VfTUVESUFfVEFCTEU7CisJCQljaGlwX25hbWUgPSAiR1NDIERTMjExNDAgVHVsaXAiOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLworCWlvcmVhZDMyKGlvYWRkciArIENTUjgpOworCisJLyogVGhlIHN0YXRpb24gYWRkcmVzcyBST00gaXMgcmVhZCBieXRlIHNlcmlhbGx5LiAgVGhlIHJlZ2lzdGVyIG11c3QKKwkgICBiZSBwb2xsZWQsIHdhaXRpbmcgZm9yIHRoZSB2YWx1ZSB0byBiZSByZWFkIGJpdCBzZXJpYWxseSBmcm9tIHRoZQorCSAgIEVFUFJPTS4KKwkgICAqLworCWVlX2RhdGEgPSB0cC0+ZWVwcm9tOworCXN1bSA9IDA7CisJaWYgKGNoaXBfaWR4ID09IExDODJDMTY4KSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CisJCQlpb3dyaXRlMzIoMHg2MDAgfCBpLCBpb2FkZHIgKyAweDk4KTsKKwkJCWRvCisJCQkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKKwkJCXdoaWxlICh2YWx1ZSA8IDAgICYmIC0tYm9ndXNjbnQgPiAwKTsKKwkJCXB1dF91bmFsaWduZWQobGUxNl90b19jcHUodmFsdWUpLCAoKHUxNiopZGV2LT5kZXZfYWRkcikgKyBpKTsKKwkJCXN1bSArPSB2YWx1ZSAmIDB4ZmZmZjsKKwkJfQorCX0gZWxzZSBpZiAoY2hpcF9pZHggPT0gQ09NRVQpIHsKKwkJLyogTm8gbmVlZCB0byByZWFkIHRoZSBFRVBST00uICovCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIoaW9yZWFkMzIoaW9hZGRyICsgMHhBNCkpLCAodTMyICopZGV2LT5kZXZfYWRkcik7CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMTYoaW9yZWFkMzIoaW9hZGRyICsgMHhBOCkpLCAodTE2ICopKGRldi0+ZGV2X2FkZHIgKyA0KSk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICsrKQorCQkJc3VtICs9IGRldi0+ZGV2X2FkZHJbaV07CisJfSBlbHNlIHsKKwkJLyogQSBzZXJpYWwgRUVQUk9NIGludGVyZmFjZSwgd2UgcmVhZCBub3cgYW5kIHNvcnQgaXQgb3V0IGxhdGVyLiAqLworCQlpbnQgc2Ffb2Zmc2V0ID0gMDsKKwkJaW50IGVlX2FkZHJfc2l6ZSA9IHR1bGlwX3JlYWRfZWVwcm9tKGRldiwgMHhmZiwgOCkgJiAweDQwMDAwID8gOCA6IDY7CisKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0cC0+ZWVwcm9tKTsgaSs9MikgeworCQkJdTE2IGRhdGEgPSB0dWxpcF9yZWFkX2VlcHJvbShkZXYsIGkvMiwgZWVfYWRkcl9zaXplKTsKKwkJCWVlX2RhdGFbaV0gPSBkYXRhICYgMHhmZjsKKwkJCWVlX2RhdGFbaSArIDFdID0gZGF0YSA+PiA4OworCQl9CisKKwkJLyogREVDIG5vdyBoYXMgYSBzcGVjaWZpY2F0aW9uIChzZWUgTm90ZXMpIGJ1dCBlYXJseSBib2FyZCBtYWtlcnMKKwkJICAganVzdCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisJCS8qIFRoaXMgZG9lcyAgbWVtY21wKGVlX2RhdGEsIGVlX2RhdGErMTYsIDgpICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJaWYgKGVlX2RhdGFbaV0gIT0gZWVfZGF0YVsxNitpXSkKKwkJCQlzYV9vZmZzZXQgPSAyMDsKKwkJaWYgKGNoaXBfaWR4ID09IENPTkVYQU5UKSB7CisJCQkvKiBDaGVjayB0aGF0IHRoZSB0dXBsZSB0eXBlIGFuZCBsZW5ndGggaXMgY29ycmVjdC4gKi8KKwkJCWlmIChlZV9kYXRhWzB4MTk4XSA9PSAweDA0ICAmJiAgZWVfZGF0YVsweDE5OV0gPT0gNikKKwkJCQlzYV9vZmZzZXQgPSAweDE5QTsKKwkJfSBlbHNlIGlmIChlZV9kYXRhWzBdID09IDB4ZmYgICYmICBlZV9kYXRhWzFdID09IDB4ZmYgJiYKKwkJCQkgICBlZV9kYXRhWzJdID09IDApIHsKKwkJCXNhX29mZnNldCA9IDI7CQkvKiBHcnJyLCBkYW1uIE1hdHJveCBib2FyZHMuICovCisJCQltdWx0aXBvcnRfY250ID0gNDsKKwkJfQorI2lmZGVmIENPTkZJR19EREI1NDc2CisJCWlmICgocGRldi0+YnVzLT5udW1iZXIgPT0gMCkgJiYgKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSA2KSkgeworCQkJLyogRERCNTQ3NiBNQUMgYWRkcmVzcyBpbiBmaXJzdCBFRVBST00gbG9jYXRpb25zLiAqLworICAgICAgICAgICAgICAgICAgICAgICBzYV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtZWRpYSB0YWJsZSBlaXRoZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZsYWdzICY9IH5IQVNfTUVESUFfVEFCTEU7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRERCNTQ3NworICAgICAgICAgICAgICAgaWYgKChwZGV2LT5idXMtPm51bWJlciA9PSAwKSAmJiAoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIEREQjU0NzcgTUFDIGFkZHJlc3MgaW4gZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWVkaWEgdGFibGUgZWl0aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mbGFncyAmPSB+SEFTX01FRElBX1RBQkxFOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUFNfQ09CQUxUCisgICAgICAgICAgICAgICBpZiAoKHBkZXYtPmJ1cy0+bnVtYmVyID09IDApICYmIAorICAgICAgICAgICAgICAgICAgICgoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDcpIHx8CisgICAgICAgICAgICAgICAgICAgIChQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMTIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2JhbHQgTUFDIGFkZHJlc3MgaW4gZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWVkaWEgdGFibGUgZWl0aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mbGFncyAmPSB+SEFTX01FRElBX1RBQkxFOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0dTQworCQkvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGJyb2tlbiBzcm9tICovCisJCWlmIChlZV9kYXRhWzBdID09IDB4NjEgJiYgZWVfZGF0YVsxXSA9PSAweDEwKSB7CisJCQkvKiBwY2lfdmVuZG9yX2lkIGFuZCBzdWJzeXN0ZW1faWQgYXJlIHN3YXBwZWQgKi8KKwkJCWVlX2RhdGFbMF0gPSBlZV9kYXRhWzJdOworCQkJZWVfZGF0YVsxXSA9IGVlX2RhdGFbM107CisJCQllZV9kYXRhWzJdID0gMHg2MTsKKwkJCWVlX2RhdGFbM10gPSAweDEwOworCisJCQkvKiBIU0MtUENJIGJvYXJkcyBuZWVkIHRvIGJlIGJ5dGUtc3dhcGVkIGFuZCBzaGlmdGVkCisJCQkgKiB1cCAxIHdvcmQuICBUaGlzIHNoaWZ0IG5lZWRzIHRvIGhhcHBlbiBhdCB0aGUgZW5kCisJCQkgKiBvZiB0aGUgTUFDIGZpcnN0IGJlY2F1c2Ugb2YgdGhlIDIgYnl0ZSBvdmVybGFwLgorCQkJICovCisJCQlmb3IgKGkgPSA0OyBpID49IDA7IGkgLT0gMikgeworCQkJCWVlX2RhdGFbMTcgKyBpICsgM10gPSBlZV9kYXRhWzE3ICsgaV07CisJCQkJZWVfZGF0YVsxNiArIGkgKyA1XSA9IGVlX2RhdGFbMTYgKyBpXTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKyspIHsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworCQkJc3VtICs9IGVlX2RhdGFbaSArIHNhX29mZnNldF07CisJCX0KKwl9CisJLyogTGl0ZS1PbiBib2FyZHMgaGF2ZSB0aGUgYWRkcmVzcyBieXRlLXN3YXBwZWQuICovCisJaWYgKChkZXYtPmRldl9hZGRyWzBdID09IDB4QTAgIHx8ICBkZXYtPmRldl9hZGRyWzBdID09IDB4QzAgfHwgZGV2LT5kZXZfYWRkclswXSA9PSAweDAyKQorCQkmJiAgZGV2LT5kZXZfYWRkclsxXSA9PSAweDAwKQorCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSs9MikgeworCQkJY2hhciB0bXAgPSBkZXYtPmRldl9hZGRyW2ldOworCQkJZGV2LT5kZXZfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaSsxXTsKKwkJCWRldi0+ZGV2X2FkZHJbaSsxXSA9IHRtcDsKKwkJfQorCS8qIE9uIHRoZSBaeW54IDMxNSBFdGhlcmFycmF5IGFuZCBvdGhlciBtdWx0aXBvcnQgYm9hcmRzIG9ubHkgdGhlCisJICAgZmlyc3QgVHVsaXAgaGFzIGFuIEVFUFJPTS4KKwkgICBPbiBTcGFyYyBzeXN0ZW1zIHRoZSBtYWMgYWRkcmVzcyBpcyBoZWxkIGluIHRoZSBPQlAgcHJvcGVydHkKKwkgICAibG9jYWwtbWFjLWFkZHJlc3MiLgorCSAgIFRoZSBhZGRyZXNzZXMgb2YgdGhlIHN1YnNlcXVlbnQgcG9ydHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZmlyc3QuCisJICAgTWFueSBQQ0kgQklPU2VzIGFsc28gaW5jb3JyZWN0bHkgcmVwb3J0IHRoZSBJUlEgbGluZSwgc28gd2UgY29ycmVjdAorCSAgIHRoYXQgaGVyZSBhcyB3ZWxsLiAqLworCWlmIChzdW0gPT0gMCAgfHwgc3VtID09IDYqMHhmZikgeworI2lmIGRlZmluZWQoX19zcGFyY19fKQorCQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKyNlbmRpZgorCQllZXByb21fbWlzc2luZyA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV07CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBsYXN0X3BoeXNfYWRkcltpXSArIDE7CisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisJCWlmICgocGNwICE9IE5VTEwpICYmIHByb21fZ2V0cHJvcGxlbihwY3AtPnByb21fbm9kZSwKKwkJCSJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKKwkJCXByb21fZ2V0cHJvcGVydHkocGNwLT5wcm9tX25vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCisJCQkgICAgZGV2LT5kZXZfYWRkciwgNik7CisJCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoX19pMzg2X18pCQkvKiBQYXRjaCB1cCB4ODYgQklPUyBidWcuICovCisJCWlmIChsYXN0X2lycSkKKwkJCWlycSA9IGxhc3RfaXJxOworI2VuZGlmCisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbGFzdF9waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCWxhc3RfaXJxID0gaXJxOworCWRldi0+aXJxID0gaXJxOworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKGJvYXJkX2lkeCA+PSAwICAmJiAgYm9hcmRfaWR4IDwgTUFYX1VOSVRTKSB7CisJCWlmIChvcHRpb25zW2JvYXJkX2lkeF0gJiBNRURJQV9NQVNLKQorCQkJdHAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbnNbYm9hcmRfaWR4XSAmIE1FRElBX01BU0s7CisJCWlmICgob3B0aW9uc1tib2FyZF9pZHhdICYgRnVsbER1cGxleCkgfHwgZnVsbF9kdXBsZXhbYm9hcmRfaWR4XSA+IDApCisJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCQlpZiAobXR1W2JvYXJkX2lkeF0gPiAwKQorCQkJZGV2LT5tdHUgPSBtdHVbYm9hcmRfaWR4XTsKKwl9CisJaWYgKGRldi0+bWVtX3N0YXJ0ICYgTUVESUFfTUFTSykKKwkJdHAtPmRlZmF1bHRfcG9ydCA9IGRldi0+bWVtX3N0YXJ0ICYgTUVESUFfTUFTSzsKKwlpZiAodHAtPmRlZmF1bHRfcG9ydCkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0dWxpcCVkOiBUcmFuc2NlaXZlciBzZWxlY3Rpb24gZm9yY2VkIHRvICVzLlxuIiwKKwkJICAgICAgIGJvYXJkX2lkeCwgbWVkaWFuYW1lW3RwLT5kZWZhdWx0X3BvcnQgJiBNRURJQV9NQVNLXSk7CisJCXRwLT5tZWRpYWxvY2sgPSAxOworCQlpZiAodHVsaXBfbWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJfQorCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCXRwLT5mdWxsX2R1cGxleF9sb2NrID0gMTsKKworCWlmICh0dWxpcF9tZWRpYV9jYXBbdHAtPmRlZmF1bHRfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCXUxNiBtZWRpYTJhZHZlcnRbXSA9IHsgMHgyMCwgMHg0MCwgMHgwM2UwLCAweDYwLCAweDgwLCAweDEwMCwgMHgyMDAgfTsKKwkJdHAtPm1paV9hZHZlcnRpc2UgPSBtZWRpYTJhZHZlcnRbdHAtPmRlZmF1bHRfcG9ydCAtIDldOworCQl0cC0+bWlpX2FkdmVydGlzZSB8PSAodHAtPmZsYWdzICYgSEFTXzgwMjNYKTsgLyogTWF0Y2hpbmcgYml0cyEgKi8KKwl9CisKKwlpZiAodHAtPmZsYWdzICYgSEFTX01FRElBX1RBQkxFKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAidHVsaXAlZCIsIGJvYXJkX2lkeCk7CS8qIGhhY2sgKi8KKwkJdHVsaXBfcGFyc2VfZWVwcm9tKGRldik7CisJCXN0cmNweShkZXYtPm5hbWUsICJldGglZCIpOwkJCS8qIHVuLWhhY2sgKi8KKwl9CisKKwlpZiAoKHRwLT5mbGFncyAmIEFMV0FZU19DSEVDS19NSUkpIHx8CisJCSh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgfHwKKwkJKCAhIHRwLT5tdGFibGUgICYmICAodHAtPmZsYWdzICYgSEFTX01JSSkpKSB7CisJCWlmICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgeworCQkJZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorCQkJCWlmICh0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYSA9PSAxMSkgeworCQkJCQl0cC0+Y3VyX2luZGV4ID0gaTsKKwkJCQkJdHAtPnNhdmVkX2lmX3BvcnQgPSBkZXYtPmlmX3BvcnQ7CisJCQkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDIpOworCQkJCQlkZXYtPmlmX3BvcnQgPSB0cC0+c2F2ZWRfaWZfcG9ydDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQl9CisKKwkJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkJICAgRG9pbmcgdGhpcyBpbiBvcGVuKCkgd291bGQgYWxsb3cgZGV0ZWN0aW5nIGV4dGVybmFsIHhjdnJzCisJCSAgIGxhdGVyLCBidXQgdGFrZXMgbXVjaCB0aW1lLiAqLworCQl0dWxpcF9maW5kX21paSAoZGV2LCBib2FyZF9pZHgpOworCX0KKworCS8qIFRoZSBUdWxpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IHR1bGlwX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0dWxpcF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9IHR1bGlwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwlkZXYtPnBvbGwgPSB0dWxpcF9wb2xsOworCWRldi0+d2VpZ2h0ID0gMTY7CisjZW5kaWYKKwlkZXYtPnN0b3AgPSB0dWxpcF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHR1bGlwX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gcHJpdmF0ZV9pb2N0bDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmcG9sbF90dWxpcDsKKyNlbmRpZgorCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yaW5nOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHJldiAlZCBhdCAlcCwiLAorCSAgICAgICBkZXYtPm5hbWUsIGNoaXBfbmFtZSwgY2hpcF9yZXYsIGlvYWRkcik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlpZiAoZWVwcm9tX21pc3NpbmcpCisJCXByaW50aygiIEVFUFJPTSBub3QgcHJlc2VudCwiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMlgiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgSVJRICVkLlxuIiwgaXJxKTsKKworICAgICAgICBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpCisJCXRwLT5saW5rX2NoYW5nZSA9IHBuaWMyX2xua19jaGFuZ2U7CisJZWxzZSBpZiAodHAtPmZsYWdzICYgSEFTX05XQVkpCisJCXRwLT5saW5rX2NoYW5nZSA9IHQyMTE0Ml9sbmtfY2hhbmdlOworCWVsc2UgaWYgKHRwLT5mbGFncyAmIEhBU19QTklDTldBWSkKKwkJdHAtPmxpbmtfY2hhbmdlID0gcG5pY19sbmtfY2hhbmdlOworCisJLyogUmVzZXQgdGhlIHhjdnIgaW50ZXJmYWNlIGFuZCB0dXJuIG9uIGhlYXJ0YmVhdC4gKi8KKwlzd2l0Y2ggKGNoaXBfaWR4KSB7CisJY2FzZSBEQzIxMTQwOgorCWNhc2UgRE05MTBYOgorCWNhc2UgVUxJNTI2WDoKKwlkZWZhdWx0OgorCQlpZiAodHAtPm10YWJsZSkKKwkJCWlvd3JpdGUzMih0cC0+bXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisJCWJyZWFrOworCWNhc2UgREMyMTE0MjoKKwkJaWYgKHRwLT5taWlfY250ICB8fCAgdHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCQlpb3dyaXRlMzIoY3NyNl9tYXNrX2RlZnN0YXRlLCBpb2FkZHIgKyBDU1I2KTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUzMihjc3I2X21hc2tfaGRjYXAsIGlvYWRkciArIENTUjYpOworCQl9IGVsc2UKKwkJCXQyMTE0Ml9zdGFydF9ud2F5KGRldik7CisJCWJyZWFrOworCWNhc2UgUE5JQzI6CisJICAgICAgICAvKiBqdXN0IGRvIGEgcmVzZXQgZm9yIHNhbml0eSBzYWtlICovCisJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworCQlicmVhazsKKwljYXNlIExDODJDMTY4OgorCQlpZiAoICEgdHAtPm1paV9jbnQpIHsKKwkJCXRwLT5ud2F5ID0gMTsKKwkJCXRwLT5ud2F5c2V0ID0gMDsKKwkJCWlvd3JpdGUzMihjc3I2X3R0bSB8IGNzcjZfY2EsIGlvYWRkciArIENTUjYpOworCQkJaW93cml0ZTMyKDB4MzAsIGlvYWRkciArIENTUjEyKTsKKwkJCWlvd3JpdGUzMigweDAwMDFGMDc4LCBpb2FkZHIgKyBDU1I2KTsKKwkJCWlvd3JpdGUzMigweDAyMDFGMDc4LCBpb2FkZHIgKyBDU1I2KTsgLyogVHVybiBvbiBhdXRvbmVnb3RpYXRpb24uICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBNWDk4NzEzOgorCWNhc2UgQ09NUEVYOTg4MToKKwkJaW93cml0ZTMyKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjYpOworCQlpb3dyaXRlMzIoMHgwMDA3MTFDMCwgaW9hZGRyICsgQ1NSMTQpOyAvKiBUdXJuIG9uIE5XYXkuICovCisJCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBDU1IxMyk7CisJCWJyZWFrOworCWNhc2UgTVg5ODcxNToKKwljYXNlIE1YOTg3MjU6CisJCWlvd3JpdGUzMigweDAxYTgwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKwkJaW93cml0ZTMyKDB4RkZGRkZGRkYsIGlvYWRkciArIENTUjE0KTsKKwkJaW93cml0ZTMyKDB4MDAwMDEwMDAsIGlvYWRkciArIENTUjEyKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FVDoKKwkJLyogTm8gaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5LiAqLworCQlicmVhazsKKwl9CisKKwkvKiBwdXQgdGhlIGNoaXAgaW4gc25vb3plIG1vZGUgdW50aWwgb3BlbmVkICovCisJdHVsaXBfc2V0X3Bvd2VyX3N0YXRlICh0cCwgMCwgMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3Jpbmc6CisJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwKKwkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkUgKworCQkJICAgICBzaXplb2YgKHN0cnVjdCB0dWxpcF90eF9kZXNjKSAqIFRYX1JJTkdfU0laRSwKKwkJCSAgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisKK2Vycl9vdXRfbXRhYmxlOgorCWlmICh0cC0+bXRhYmxlKQorCQlrZnJlZSAodHAtPm10YWJsZSk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgdHVsaXBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nIChkZXYpICYmIG5ldGlmX2RldmljZV9wcmVzZW50IChkZXYpKSB7CisJCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisJCXR1bGlwX2Rvd24gKGRldik7CisJCS8qIHBjaV9wb3dlcl9vZmYocGRldiwgLTEpOyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHR1bGlwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nIChkZXYpICYmICFuZXRpZl9kZXZpY2VfcHJlc2VudCAoZGV2KSkgeworI2lmIDEKKwkJcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworI2VuZGlmCisJCS8qIHBjaV9wb3dlcl9vbihwZGV2KTsgKi8KKwkJdHVsaXBfdXAgKGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2ggKGRldik7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHR1bGlwX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cDsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50IChwZGV2LAorCQkJICAgICBzaXplb2YgKHN0cnVjdCB0dWxpcF9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRSArCisJCQkgICAgIHNpemVvZiAoc3RydWN0IHR1bGlwX3R4X2Rlc2MpICogVFhfUklOR19TSVpFLAorCQkJICAgICB0cC0+cnhfcmluZywgdHAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAodHAtPm10YWJsZSkKKwkJa2ZyZWUgKHRwLT5tdGFibGUpOworCXBjaV9pb3VubWFwKHBkZXYsIHRwLT5iYXNlX2FkZHIpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgTlVMTCk7CisKKwkvKiBwY2lfcG93ZXJfb2ZmIChwZGV2LCAtMSk7ICovCit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCisKK3N0YXRpYyB2b2lkIHBvbGxfdHVsaXAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogZGlzYWJsZV9pcnEgaGVyZSBpcyBub3QgdmVyeSBuaWNlLCBidXQgd2l0aCB0aGUgbG9ja2xlc3MKKwkgICBpbnRlcnJ1cHQgaGFuZGxlciB3ZSBoYXZlIG5vIG90aGVyIGNob2ljZS4gKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJdHVsaXBfaW50ZXJydXB0IChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHVsaXBfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHR1bGlwX3BjaV90YmwsCisJLnByb2JlCQk9IHR1bGlwX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHVsaXBfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSB0dWxpcF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdHVsaXBfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB0dWxpcF9pbml0ICh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50ayAoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworI2VuZGlmCisKKwkvKiBjb3B5IG1vZHVsZSBwYXJtcyBpbnRvIGdsb2JhbHMgKi8KKwl0dWxpcF9yeF9jb3B5YnJlYWsgPSByeF9jb3B5YnJlYWs7CisJdHVsaXBfbWF4X2ludGVycnVwdF93b3JrID0gbWF4X2ludGVycnVwdF93b3JrOworCisJLyogcHJvYmUgZm9yIGFuZCBpbml0IGJvYXJkcyAqLworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZ0dWxpcF9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0dWxpcF9jbGVhbnVwICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnR1bGlwX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQodHVsaXBfaW5pdCk7Cittb2R1bGVfZXhpdCh0dWxpcF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTY0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCkBAIC0wLDAgKzEsMTcxNiBAQAorLyogd2luYm9uZC04NDAuYzogQSBMaW51eCBQQ0kgbmV0d29yayBhZGFwdGVyIGRldmljZSBkcml2ZXIuICovCisvKgorCVdyaXR0ZW4gMTk5OC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvZHJpdmVycy5odG1sCisKKwlEbyBub3QgcmVtb3ZlIHRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisJRG8gbm90IGNoYW5nZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB1bmxlc3MgYW4gaW1wcm92ZW1lbnQgaGFzIGJlZW4gbWFkZS4KKwlNZXJlbHkgcmVtb3ZpbmcgbXkgbmFtZSwgYXMgQ29tcGV4IGhhcyBkb25lIGluIHRoZSBwYXN0LCBkb2VzIG5vdCBjb3VudAorCWFzIGFuIGltcHJvdmVtZW50LgorCisJQ2hhbmdlbG9nOgorCSogcG9ydGVkIHRvIDIuNAorCQk/Pz8KKwkqIHNwaW4gbG9jayB1cGRhdGUsIG1lbW9yeSBiYXJyaWVycywgbmV3IHN0eWxlIGRtYSBtYXBwaW5ncworCQlsaW1pdCBlYWNoIHR4IGJ1ZmZlciB0byA8IDEwMjQgYnl0ZXMKKwkJcmVtb3ZlIERlc2NJbnRyIGZyb20gUnggZGVzY3JpcHRvcnMgKHRoYXQncyBhbiBUeCBmbGFnKQorCQlyZW1vdmUgbmV4dCBwb2ludGVyIGZyb20gVHggZGVzY3JpcHRvcnMKKwkJc3luY2hyb25pemUgdHhfcV9ieXRlcworCQlzb2Z0d2FyZSByZXNldCBpbiB0eF90aW1lb3V0CisJCQlDb3B5cmlnaHQgKEMpIDIwMDAgTWFuZnJlZCBTcHJhdWwKKwkqIGZ1cnRoZXIgY2xlYW51cHMKKwkJcG93ZXIgbWFuYWdlbWVudC4KKwkJc3VwcG9ydCBmb3IgYmlnIGVuZGlhbiBkZXNjcmlwdG9ycworCQkJQ29weXJpZ2h0IChDKSAyMDAxIE1hbmZyZWQgU3ByYXVsCisgIAkqIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKKwkqIFJlcGxhY2Ugc29tZSBNSUktcmVsYXRlZCBtYWdpYyBudW1iZXJzIHdpdGggY29uc3RhbnRzIChqZ2FyemlrKQorICAKKwlUT0RPOgorCSogZW5hYmxlIHBjaV9wb3dlcl9vZmYKKwkqIFdha2UtT24tTEFOCisqLworICAKKyNkZWZpbmUgRFJWX05BTUUJIndpbmJvbmQtODQwIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMS1kIgorI2RlZmluZSBEUlZfUkVMREFURQkiTm92LTE3LTIwMDEiCisKKworLyogQXV0b21hdGljYWxseSBleHRyYWN0ZWQgY29uZmlndXJhdGlvbiBpbmZvOgorcHJvYmUtZnVuYzogd2luYm9uZDg0MF9wcm9iZQorY29uZmlnLWluOiB0cmlzdGF0ZSAnV2luYm9uZCBXODljODQwIEV0aGVybmV0IHN1cHBvcnQnIENPTkZJR19XSU5CT05EXzg0MAorCitjLWhlbHAtbmFtZTogV2luYm9uZCBXODljODQwIFBDSSBFdGhlcm5ldCBzdXBwb3J0CitjLWhlbHAtc3ltYm9sOiBDT05GSUdfV0lOQk9ORF84NDAKK2MtaGVscDogVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBXaW5ib25kIFc4OWM4NDAgY2hpcC4gIEl0IGFsc28gd29ya3Mgd2l0aAorYy1oZWxwOiB0aGUgVFg5ODgyIGNoaXAgb24gdGhlIENvbXBleCBSTDEwMC1BVFggYm9hcmQuCitjLWhlbHA6IE1vcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIAorYy1oZWxwOiBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbAorKi8KKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgJzg0MCB1c2VzIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKiBVc2VkIHRvIHBhc3MgdGhlIG1lZGlhIHR5cGUsIGV0Yy4KKyAgIEJvdGggJ29wdGlvbnNbXScgYW5kICdmdWxsX2R1cGxleFtdJyBzaG91bGQgZXhpc3QgZm9yIGRyaXZlcgorICAgaW50ZXJvcGVyYWJpbGl0eS4KKyAgIFRoZSBtZWRpYSB0eXBlIGlzIHVzdWFsbHkgcGFzc2VkIGluICdvcHRpb25zW10nLgorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkxNgorI2RlZmluZSBUWF9RVUVVRV9MRU4JMTAJCS8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAgKi8KKyNkZWZpbmUgVFhfUVVFVUVfTEVOX1JFU1RBUlQJNQorI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKworI2RlZmluZSBUWF9CVUZMSU1JVAkoMTAyNC0xMjgpCisKKy8qIFRoZSBwcmVzdW1lZCBGSUZPIHNpemUgZm9yIHdvcmtpbmcgYXJvdW5kIHRoZSBUeC1GSUZPLW92ZXJmbG93IGJ1Zy4KKyAgIFRvIGF2b2lkIG92ZXJmbG93aW5nIHdlIGRvbid0IHF1ZXVlIGFnYWluIHVudGlsIHdlIGhhdmUgcm9vbSBmb3IgYQorICAgZnVsbC1zaXplIHBhY2tldC4KKyAqLworI2RlZmluZSBUWF9GSUZPX1NJWkUgKDIwNDgpCisjZGVmaW5lIFRYX0JVR19GSUZPX0xJTUlUIChUWF9GSUZPX1NJWkUtMTUxNC0xNikKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisvKiBJbmNsdWRlIGZpbGVzLCBkZXNpZ25lZCB0byBzdXBwb3J0IG1vc3Qga2VybmVsIHZlcnNpb25zIDIuMC4wIGFuZCBsYXRlci4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAoMi40IHBvcnQpICIgRFJWX1JFTERBVEUgIiAgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbFxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBXODljODQwIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIndpbmJvbmQtODQwIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIndpbmJvbmQtODQwIGRlYnVnIGxldmVsICgwLTYpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIndpbmJvbmQtODQwIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJ3aW5ib25kLTg0MCBtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJ3aW5ib25kLTg0MDogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJ3aW5ib25kLTg0MCBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFdpbmJvbmQgdzg5Yzg0MCBjaGlwLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworTm9uZS4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK1RoaXMgY2hpcCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIERpZ2l0YWwgMjEqNCogIlR1bGlwIiBmYW1pbHkuICBUaGUgZmlyc3QKK3R3ZWx2ZSByZWdpc3RlcnMgYW5kIHRoZSBkZXNjcmlwdG9yIGZvcm1hdCBhcmUgbmVhcmx5IGlkZW50aWNhbC4gIFJlYWQgYQorVHVsaXAgbWFudWFsIGZvciBvcGVyYXRpb25hbCBkZXRhaWxzLgorCitBIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgbXVsdGljYXN0IGZpbHRlciBhbmQgc3RhdGlvbiBhZGRyZXNzIGFyZQorc3RvcmVkIGluIHJlZ2lzdGVycyByYXRoZXIgdGhhbiBsb2FkZWQgdGhyb3VnaCBhIHBzZXVkby10cmFuc21pdCBwYWNrZXQuCisKK1VubGlrZSB0aGUgVHVsaXAsIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGxpbWl0ZWQgdG8gMUtCLiAgVG8gdHJhbnNtaXQgYQorZnVsbC1zaXplZCBwYWNrZXQgd2UgbXVzdCB1c2UgYm90aCBkYXRhIGJ1ZmZlcnMgaW4gYSBkZXNjcmlwdG9yLiAgVGh1cyB0aGUKK2RyaXZlciB1c2VzIHJpbmcgbW9kZSB3aGVyZSBkZXNjcmlwdG9ycyBhcmUgaW1wbGljaXRseSBzZXF1ZW50aWFsIGluIG1lbW9yeSwKK3JhdGhlciB0aGFuIHVzaW5nIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBhZGRyZXNzIGFzIGEgY2hhaW4gcG9pbnRlciB0bworc3Vic2VxdWVudCBkZXNjcmlwdG9ycy4KKworSVYuIE5vdGVzCisKK0lmIHlvdSBhcmUgZ29pbmcgdG8gYWxtb3N0IGNsb25lIGEgVHVsaXAsIHdoeSBub3QgZ28gYWxsIHRoZSB3YXkgYW5kIGF2b2lkCit0aGUgbmVlZCBmb3IgYSBuZXcgZHJpdmVyPworCitJVmIuIFJlZmVyZW5jZXMKKworaHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0LzEwMG1icHMuaHRtbAoraHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0L05XYXkuaHRtbAoraHR0cDovL3d3dy53aW5ib25kLmNvbS50dy8KKworSVZjLiBFcnJhdGEKKworQSBob3JyaWJsZSBidWcgZXhpc3RzIGluIHRoZSB0cmFuc21pdCBGSUZPLiAgQXBwYXJlbnRseSB0aGUgY2hpcCBkb2Vzbid0Citjb3JyZWN0bHkgZGV0ZWN0IGEgZnVsbCBGSUZPLCBhbmQgcXVldWluZyBtb3JlIHRoYW4gMjA0OCBieXRlcyBtYXkgcmVzdWx0IGluCitzaWxlbnQgZGF0YSBjb3JydXB0aW9uLgorCitUZXN0IHdpdGggJ3BpbmcgLXMgMTAwMDAnIG9uIGEgZmFzdCBjb21wdXRlci4KKworKi8KKworDAorCisvKgorICBQQ0kgcHJvYmUgdGFibGUuCisqLworZW51bSBwY2lfaWRfZmxhZ3NfYml0cyB7CisgICAgICAgIC8qIFNldCBQQ0kgY29tbWFuZCByZWdpc3RlciBiaXRzIGJlZm9yZSBjYWxsaW5nIHByb2JlMSgpLiAqLworICAgICAgICBQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisgICAgICAgIC8qIFJlYWQgYW5kIG1hcCB0aGUgc2luZ2xlIGZvbGxvd2luZyBQQ0kgQkFSLiAqLworICAgICAgICBQQ0lfQUREUjA9MDw8NCwgUENJX0FERFIxPTE8PDQsIFBDSV9BRERSMj0yPDw0LCBQQ0lfQUREUjM9Mzw8NCwKKyAgICAgICAgUENJX0FERFJfNjRCSVRTPTB4MTAwLCBQQ0lfTk9fQUNQSV9XQUtFPTB4MjAwLCBQQ0lfTk9fTUlOX0xBVEVOQ1k9MHg0MDAsCit9OworZW51bSBjaGlwX2NhcGFiaWxpdHlfZmxhZ3MgeworCUNhbkhhdmVNSUk9MSwgSGFzQnJva2VuVHg9MiwgQWx3YXlzRkRYPTQsIEZEWE9uTm9NSUk9OCx9OworI2lmZGVmIFVTRV9JT19PUFMKKyNkZWZpbmUgVzg0MF9GTEFHUyAoUENJX1VTRVNfSU8gfCBQQ0lfQUREUjAgfCBQQ0lfVVNFU19NQVNURVIpCisjZWxzZQorI2RlZmluZSBXODQwX0ZMQUdTIChQQ0lfVVNFU19NRU0gfCBQQ0lfQUREUjEgfCBQQ0lfVVNFU19NQVNURVIpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHc4NDBfcGNpX3RibFtdID0geworCXsgMHgxMDUwLCAweDA4NDAsIFBDSV9BTllfSUQsIDB4ODE1MywgICAgIDAsIDAsIDAgfSwKKwl7IDB4MTA1MCwgMHgwODQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyAweDExZjYsIDB4MjAxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB3ODQwX3BjaV90YmwpOworCitzdHJ1Y3QgcGNpX2lkX2luZm8geworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICBzdHJ1Y3QgbWF0Y2hfaW5mbyB7CisgICAgICAgICAgICAgICAgaW50ICAgICBwY2ksIHBjaV9tYXNrLCBzdWJzeXN0ZW0sIHN1YnN5c3RlbV9tYXNrOworICAgICAgICAgICAgICAgIGludCByZXZpc2lvbiwgcmV2aXNpb25fbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT25seSA4IGJpdHMuICovCisgICAgICAgIH0gaWQ7CisgICAgICAgIGVudW0gcGNpX2lkX2ZsYWdzX2JpdHMgcGNpX2ZsYWdzOworICAgICAgICBpbnQgaW9fc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZGVkIGZvciBJL08gcmVnaW9uIGNoZWNrIG9yIGlvcmVtYXAoKS4gKi8KKyAgICAgICAgaW50IGRydl9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlciB1c2UsIGludGVuZGVkIGFzIGNhcGFiaWxpdHkgZmxhZ3MuICovCit9Oworc3RhdGljIHN0cnVjdCBwY2lfaWRfaW5mbyBwY2lfaWRfdGJsW10gPSB7CisJeyJXaW5ib25kIFc4OWM4NDAiLAkJCS8qIFNvbWV0aW1lIGEgTGV2ZWwtT25lIHN3aXRjaCBjYXJkLiAqLworCSB7IDB4MDg0MDEwNTAsIDB4ZmZmZmZmZmYsIDB4ODE1MzAwMDAsIDB4ZmZmZjAwMDAgfSwKKwkgVzg0MF9GTEFHUywgMTI4LCBDYW5IYXZlTUlJIHwgSGFzQnJva2VuVHggfCBGRFhPbk5vTUlJfSwKKwl7IldpbmJvbmQgVzg5Yzg0MCIsIHsgMHgwODQwMTA1MCwgMHhmZmZmZmZmZiwgfSwKKwkgVzg0MF9GTEFHUywgMTI4LCBDYW5IYXZlTUlJIHwgSGFzQnJva2VuVHh9LAorCXsiQ29tcGV4IFJMMTAwLUFUWCIsIHsgMHgyMDExMTFGNiwgMHhmZmZmZmZmZix9LAorCSBXODQwX0ZMQUdTLCAxMjgsIENhbkhhdmVNSUkgfCBIYXNCcm9rZW5UeH0sCisJe05VTEwsfSwJCQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UsIGhvd2V2ZXIgc29tZSB4ODYgc3lzdGVtcworICAgd29yayBvbmx5IHdpdGggSS9PIHNwYWNlIGFjY2Vzc2VzLiAgUGFzcyAtRFVTRV9JT19PUFMgdG8gdXNlIFBDSSBJL08gc3BhY2UKKyAgIGFjY2Vzc2VzIGluc3RlYWQgb2YgbWVtb3J5IHNwYWNlLiAqLworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuCisgICBXaGlsZSBzaW1pbGFyIHRvIHRoZSBUdWxpcCwgdGhlc2UgcmVnaXN0ZXJzIGFyZSBsb25nd29yZCBhbGlnbmVkLgorICAgTm90ZTogSXQncyBub3QgdXNlZnVsIHRvIGRlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3IgZXZlcnkgcmVnaXN0ZXIgYml0IGluCisgICB0aGUgZGV2aWNlLiAgVGhlIG5hbWUgY2FuIG9ubHkgcGFydGlhbGx5IGRvY3VtZW50IHRoZSBzZW1hbnRpY3MgYW5kIG1ha2UKKyAgIHRoZSBkcml2ZXIgbG9uZ2VyIGFuZCBtb3JlIGRpZmZpY3VsdCB0byByZWFkLgorKi8KK2VudW0gdzg0MF9vZmZzZXRzIHsKKwlQQ0lCdXNDZmc9MHgwMCwgVHhTdGFydERlbWFuZD0weDA0LCBSeFN0YXJ0RGVtYW5kPTB4MDgsCisJUnhSaW5nUHRyPTB4MEMsIFR4UmluZ1B0cj0weDEwLAorCUludHJTdGF0dXM9MHgxNCwgTmV0d29ya0NvbmZpZz0weDE4LCBJbnRyRW5hYmxlPTB4MUMsCisJUnhNaXNzZWQ9MHgyMCwgRUVDdHJsPTB4MjQsIE1JSUN0cmw9MHgyNCwgQm9vdFJvbT0weDI4LCBHUFRpbWVyPTB4MkMsCisJQ3VyUnhEZXNjQWRkcj0weDMwLCBDdXJSeEJ1ZkFkZHI9MHgzNCwJCQkvKiBEZWJ1ZyB1c2UgKi8KKwlNdWx0aWNhc3RGaWx0ZXIwPTB4MzgsIE11bHRpY2FzdEZpbHRlcjE9MHgzQywgU3RhdGlvbkFkZHI9MHg0MCwKKwlDdXJUeERlc2NBZGRyPTB4NEMsIEN1clR4QnVmQWRkcj0weDUwLAorfTsKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9lbmFibGUgcmVnaXN0ZXJzLiAqLworLyogVGhlIGJpdHMgaW4gdGhlIEludHIgU3RhdHVzL0VuYWJsZSByZWdpc3RlcnMsIG1vc3RseSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisJTm9ybWFsSW50cj0weDEwMDAwLCBBYm5vcm1hbEludHI9MHg4MDAwLAorCUludHJQQ0lFcnI9MHgyMDAwLCBUaW1lckludD0weDgwMCwKKwlJbnRyUnhEaWVkPTB4MTAwLCBSeE5vQnVmPTB4ODAsIEludHJSeERvbmU9MHg0MCwKKwlUeEZJRk9VbmRlcmZsb3c9MHgyMCwgUnhFcnJJbnRyPTB4MTAsCisJVHhJZGxlPTB4MDQsIEludHJUeFN0b3BwZWQ9MHgwMiwgSW50clR4RG9uZT0weDAxLAorfTsKKworLyogQml0cyBpbiB0aGUgTmV0d29ya0NvbmZpZyByZWdpc3Rlci4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRFcnI9MHg4MCwgQWNjZXB0UnVudD0weDQwLAorCUFjY2VwdEJyb2FkY2FzdD0weDIwLCBBY2NlcHRNdWx0aWNhc3Q9MHgxMCwKKwlBY2NlcHRBbGxQaHlzPTB4MDgsIEFjY2VwdE15UGh5cz0weDAyLAorfTsKKworZW51bSBtaWlfcmVnX2JpdHMgeworCU1ESU9fU2hpZnRDbGs9MHgxMDAwMCwgTURJT19EYXRhSW49MHg4MDAwMCwgTURJT19EYXRhT3V0PTB4MjAwMDAsCisJTURJT19FbmJPdXRwdXQ9MHg0MDAwMCwgTURJT19FbmJJbiA9IDB4MDAwMDAsCit9OworCisvKiBUaGUgVHVsaXAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCB3ODQwX3J4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMTsKKwl1MzIgYnVmZmVyMjsKK307CisKK3N0cnVjdCB3ODQwX3R4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMSwgYnVmZmVyMjsKK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NFbmRSaW5nPTB4MDIwMDAwMDAsIERlc2NVc2VMaW5rPTB4MDEwMDAwMDAsCisJRGVzY1dob2xlUGt0PTB4NjAwMDAwMDAsIERlc2NTdGFydFBrdD0weDIwMDAwMDAwLCBEZXNjRW5kUGt0PTB4NDAwMDAwMDAsCisJRGVzY0ludHI9MHg4MDAwMDAwMCwKK307CisKKyNkZWZpbmUgTUlJX0NOVAkJMSAvKiB3aW5ib25kIG9ubHkgc3VwcG9ydHMgb25lIE1JSSAqLworc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwlzdHJ1Y3Qgdzg0MF9yeF9kZXNjICpyeF9yaW5nOworCWRtYV9hZGRyX3QJcnhfYWRkcltSWF9SSU5HX1NJWkVdOworCXN0cnVjdCB3ODQwX3R4X2Rlc2MgKnR4X3Jpbmc7CisJZG1hX2FkZHJfdAl0eF9hZGRyW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByaW5nX2RtYV9hZGRyOworCS8qIFRoZSBhZGRyZXNzZXMgb2YgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIGxhdGVyIGZyZWUoKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIE1lZGlhIG1vbml0b3JpbmcgdGltZXIuICovCisJLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBzb21lIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJc3BpbmxvY2tfdCBsb2NrOworCWludCBjaGlwX2lkLCBkcnZfZmxhZ3M7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJaW50IGNzcjY7CisJc3RydWN0IHc4NDBfcnhfZGVzYyAqcnhfaGVhZF9kZXNjOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCQkJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworCXVuc2lnbmVkIGludCB0eF9xX2J5dGVzOworCXVuc2lnbmVkIGludCB0eF9mdWxsOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKwlpbnQgbWlpX2NudDsJCQkJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXNbTUlJX0NOVF07CQkvKiBNSUkgZGV2aWNlIGFkZHJlc3NlcywgYnV0IG9ubHkgdGhlIGZpcnN0IGlzIHVzZWQgKi8KKwl1MzIgbWlpOworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Cit9OworCitzdGF0aWMgaW50ICBlZXByb21fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgIG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50ICBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHVwZGF0ZV9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZGV2X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBpbml0X3J4dHhfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmcmVlX3J4dHhfcmluZ3Moc3RydWN0IG5ldGRldl9wcml2YXRlICpucCk7CitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFsbG9jX3JpbmdkZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJlZV9yaW5nZGVzYyhzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wKTsKK3N0YXRpYyBpbnQgIHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIGludCAgbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHUzMiBfX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaW50ICBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKworc3RhdGljIGludCBfX2RldmluaXQgdzg0MF9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJc3RhdGljIGludCBmaW5kX2NudDsKKwlpbnQgY2hpcF9pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBpcnE7CisJaW50IGksIG9wdGlvbiA9IGZpbmRfY250IDwgTUFYX1VOSVRTID8gb3B0aW9uc1tmaW5kX2NudF0gOiAwOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBiYXIgPSAxOworCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwweEZGRkZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXaW5ib25kLTg0MDogRGV2aWNlICVzIGRpc2FibGVkIGR1ZSB0byBETUEgbGltaXRhdGlvbnMuXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpucCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkKKwkJZ290byBlcnJfb3V0X25ldGRldjsKKyNpZmRlZiBVU0VfSU9fT1BTCisJYmFyID0gMDsKKyNlbmRpZgorCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIHBjaV9pZF90YmxbY2hpcF9pZHhdLmlvX3NpemUpOworCWlmICghaW9hZGRyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0gbGUxNl90b19jcHUoZWVwcm9tX3JlYWQoaW9hZGRyLCBpKSk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLgorCSAgIE5vIGhvbGQgdGltZSByZXF1aXJlZCEgKi8KKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgUENJQnVzQ2ZnKTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5wY2lfZGV2ID0gcGRldjsKKwlucC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCW5wLT5kcnZfZmxhZ3MgPSBwY2lfaWRfdGJsW2NoaXBfaWR4XS5kcnZfZmxhZ3M7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlucC0+bWlpX2lmLmRldiA9IGRldjsKKwlucC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlucC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCW5wLT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKG9wdGlvbiA+IDApIHsKKwkJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCWlmIChvcHRpb24gJiAxNSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpZ25vcmluZyB1c2VyIHN1cHBsaWVkIG1lZGlhIHR5cGUgJWQiLAorCQkJCWRldi0+bmFtZSwgb3B0aW9uICYgMTUpOworCX0KKwlpZiAoZmluZF9jbnQgPCBNQVhfVU5JVFMgICYmICBmdWxsX2R1cGxleFtmaW5kX2NudF0gPiAwKQorCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKworCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCQlucC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMTsKKworCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OworCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChpKQorCQlnb3RvIGVycl9vdXRfY2xlYXJkZXY7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXAsICIsCisJCSAgIGRldi0+bmFtZSwgcGNpX2lkX3RibFtjaGlwX2lkeF0ubmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCisJaWYgKG5wLT5kcnZfZmxhZ3MgJiBDYW5IYXZlTUlJKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBNSUlfQ05UOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYgIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJbnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlucC0+bWlpX2lmLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCQlucC0+bWlpID0gKG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX1BIWVNJRDEpIDw8IDE2KSsKKwkJCQkJCW1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX1BIWVNJRDIpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgUEhZICU4Ljh4aCBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiMHglNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbnAtPm1paSwgcGh5LCBtaWlfc3RhdHVzLCBucC0+bWlpX2lmLmFkdmVydGlzaW5nKTsKKwkJCX0KKwkJfQorCQlucC0+bWlpX2NudCA9IHBoeV9pZHg7CisJCW5wLT5taWlfaWYucGh5X2lkID0gbnAtPnBoeXNbMF07CisJCWlmIChwaHlfaWR4ID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUlJIFBIWSBub3QgZm91bmQgLS0gdGhpcyBkZXZpY2UgbWF5ICIKKwkJCQkJICAgIm5vdCBvcGVyYXRlIGNvcnJlY3RseS5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlmaW5kX2NudCsrOworCXJldHVybiAwOworCitlcnJfb3V0X2NsZWFyZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKwwKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuICBUaGVzZSBhcmUKKyAgIG9mdGVuIHNlcmlhbCBiaXQgc3RyZWFtcyBnZW5lcmF0ZWQgYnkgdGhlIGhvc3QgcHJvY2Vzc29yLgorICAgVGhlIGV4YW1wbGUgYmVsb3cgaXMgZm9yIHRoZSBjb21tb24gOTNjNDYgRUVQUk9NLCA2NCAxNiBiaXQgd29yZHMuICovCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgZnV0dXJlIDY2TWh6IGFjY2VzcyBtYXkgbmVlZAorICAgYSBkZWxheS4gIE5vdGUgdGhhdCBwcmUtMi4wLjM0IGtlcm5lbHMgaGFkIGEgY2FjaGUtYWxpZ25tZW50IGJ1ZyB0aGF0CisgICBtYWRlIHVkZWxheSgpIHVucmVsaWFibGUuCisgICBUaGUgb2xkIG1ldGhvZCBvZiB1c2luZyBhbiBJU0EgYWNjZXNzIGFzIGEgZGVsYXksIF9fU0xPV19ET1dOX0lPX18sIGlzCisgICBkZXByaWNhdGVkLgorKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KGVlX2FkZHIpCWlvcmVhZDMyKGVlX2FkZHIpCisKK2VudW0gRUVQUk9NX0N0cmxfQml0cyB7CisJRUVfU2hpZnRDbGs9MHgwMiwgRUVfV3JpdGUwPTB4ODAxLCBFRV9Xcml0ZTE9MHg4MDUsCisJRUVfQ2hpcFNlbGVjdD0weDgwMSwgRUVfRGF0YUluPTB4MDgsCit9OworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KK2VudW0gRUVQUk9NX0NtZHMgeworCUVFX1dyaXRlQ21kPSg1IDw8IDYpLCBFRV9SZWFkQ21kPSg2IDw8IDYpLCBFRV9FcmFzZUNtZD0oNyA8PCA2KSwKK307CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gYWRkciArIEVFQ3RybDsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JlYWRDbWQ7CisJaW93cml0ZTMyKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX1dyaXRlMSA6IEVFX1dyaXRlMDsKKwkJaW93cml0ZTMyKGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoZWVfYWRkcik7CisJCWlvd3JpdGUzMihkYXRhdmFsIHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoZWVfYWRkcik7CisJfQorCWlvd3JpdGUzMihFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoRUVfQ2hpcFNlbGVjdCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQzMihlZV9hZGRyKSAmIEVFX0RhdGFJbikgPyAxIDogMCk7CisJCWlvd3JpdGUzMihFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlpb3dyaXRlMzIoMCwgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisJUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorCU1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisJZm9yIGRldGFpbHMuCisKKwlUaGUgbWF4aW11bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSBtaW5pbXVtIHRpbWluZyBpcyB1c3VhbGx5CisJbWV0IGJ5IGJhY2stdG8tYmFjayAzM01oeiBQQ0kgY3ljbGVzLiAqLworI2RlZmluZSBtZGlvX2RlbGF5KG1kaW9fYWRkcikgaW9yZWFkMzIobWRpb19hZGRyKQorCisvKiBTZXQgaWZmIGEgTUlJIHRyYW5zY2VpdmVyIG9uIGFueSBpbnRlcmZhY2UgcmVxdWlyZXMgbWRpbyBwcmVhbWJsZS4KKyAgIFRoaXMgb25seSBzZXQgd2l0aCBvbGRlciB0cmFuc2NlaXZlcnMsIHNvIHRoZSBleHRyYQorICAgY29kZSBzaXplIG9mIGEgcGVyLWludGVyZmFjZSBmbGFnIGlzIG5vdCB3b3J0aHdoaWxlLiAqLworc3RhdGljIGNoYXIgbWlpX3ByZWFtYmxlX3JlcXVpcmVkID0gMTsKKworI2RlZmluZSBNRElPX1dSSVRFMCAoTURJT19FbmJPdXRwdXQpCisjZGVmaW5lIE1ESU9fV1JJVEUxIChNRElPX0RhdGFPdXQgfCBNRElPX0VuYk91dHB1dCkKKworLyogR2VuZXJhdGUgdGhlIHByZWFtYmxlIHJlcXVpcmVkIGZvciBpbml0aWFsIHN5bmNocm9uaXphdGlvbiBhbmQKKyAgIGEgZmV3IG9sZGVyIHRyYW5zY2VpdmVycy4gKi8KK3N0YXRpYyB2b2lkIG1kaW9fc3luYyh2b2lkIF9faW9tZW0gKm1kaW9fYWRkcikKK3sKKwlpbnQgYml0cyA9IDMyOworCisJLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyBhdCBsZWFzdCAzMiBsb2dpYyBvbmVzLiAqLworCXdoaWxlICgtLWJpdHMgPj0gMCkgeworCQlpb3dyaXRlMzIoTURJT19XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwkJaW93cml0ZTMyKE1ESU9fV1JJVEUxIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2VfYWRkciArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisJCWlvd3JpdGUzMihkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCWlvd3JpdGUzMihkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDIwOyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VuYkluLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDMyKG1kaW9fYWRkcikgJiBNRElPX0RhdGFJbikgPyAxIDogMCk7CisJCWlvd3JpdGUzMihNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptZGlvX2FkZHIgPSBucC0+YmFzZV9hZGRyICsgTUlJQ3RybDsKKwlpbnQgbWlpX2NtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb248PDE4KSB8IHZhbHVlOworCWludCBpOworCisJaWYgKGxvY2F0aW9uID09IDQgICYmICBwaHlfaWQgPT0gbnAtPnBoeXNbMF0pCisJCW5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSB2YWx1ZTsKKworCWlmIChtaWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhtZGlvX2FkZHIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisJCWlvd3JpdGUzMihkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCWlvd3JpdGUzMihkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VuYkluLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCWlvd3JpdGUzMihNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KKwlyZXR1cm47Cit9CisKKwwKK3N0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgUENJQnVzQ2ZnKTsJCS8qIFJlc2V0ICovCisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJaSA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaW50cl9oYW5kbGVyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHc4OWM4NDBfb3BlbigpIGlycSAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCWlmKChpPWFsbG9jX3JpbmdkZXNjKGRldikpKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWlmIChkZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSBuZXRkZXZfb3BlbigpLlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZucC0+dGltZXIpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEqSFo7CisJbnAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJbnAtPnRpbWVyLmZ1bmN0aW9uID0gJm5ldGRldl90aW1lcjsJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmbnAtPnRpbWVyKTsKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCXJldHVybiBpOworfQorCisjZGVmaW5lIE1JSV9EQVZJQ09NX0RNOTEwMQkweDAxODFiODAwCisKK3N0YXRpYyBpbnQgdXBkYXRlX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZHVwbGV4LCBmYXN0ZXRoLCByZXN1bHQsIG1paV9yZWc7CisKKwkvKiBCU01SICovCisJbWlpX3JlZyA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1TUik7CisKKwlpZiAobWlpX3JlZyA9PSAweGZmZmYpCisJCXJldHVybiBucC0+Y3NyNjsKKwkvKiByZXJlYWQ6IHRoZSBsaW5rIHN0YXR1cyBiaXQgaXMgc3RpY2t5ICovCisJbWlpX3JlZyA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1TUik7CisJaWYgKCEobWlpX3JlZyAmIDB4NCkpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJaWYgKGRlYnVnKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgIyVkIHJlcG9ydHMgbm8gbGluay4gRGlzYWJsaW5nIHdhdGNoZG9nLlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+cGh5c1swXSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9CisJCXJldHVybiBucC0+Y3NyNjsKKwl9CisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSAjJWQgbGluayBpcyBiYWNrLiBFbmFibGluZyB3YXRjaGRvZy5cbiIsCisJCQkJZGV2LT5uYW1lLCBucC0+cGh5c1swXSk7CisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwl9CisJCisJaWYgKChucC0+bWlpICYgfjB4ZikgPT0gTUlJX0RBVklDT01fRE05MTAxKSB7CisJCS8qIElmIHRoZSBsaW5rIHBhcnRuZXIgZG9lc24ndCBzdXBwb3J0IGF1dG9uZWdvdGlhdGlvbgorCQkgKiB0aGUgTUlJIGRldGVjdHMgaXQncyBhYmlsaXRpZXMgd2l0aCB0aGUgInBhcmFsbGVsIGRldGVjdGlvbiIuCisJCSAqIFNvbWUgTUlJcyB1cGRhdGUgdGhlIExQQSByZWdpc3RlciB0byB0aGUgcmVzdWx0IG9mIHRoZSBwYXJhbGxlbAorCQkgKiBkZXRlY3Rpb24sIHNvbWUgZG9uJ3QuCisJCSAqIFRoZSBEYXZpY29tIFBIWSBbYXQgbGVhc3QgMDE4MWI4MDBdIGRvZXNuJ3QuCisJCSAqIEluc3RlYWQgYml0IDkgYW5kIDEzIG9mIHRoZSBCTUNSIGFyZSB1cGRhdGVkIHRvIHRoZSByZXN1bHQKKwkJICogb2YgdGhlIG5lZ290aWF0aW9uLi4KKwkJICovCisJCW1paV9yZWcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCQlkdXBsZXggPSBtaWlfcmVnICYgQk1DUl9GVUxMRFBMWDsKKwkJZmFzdGV0aCA9IG1paV9yZWcgJiBCTUNSX1NQRUVEMTAwOworCX0gZWxzZSB7CisJCWludCBuZWdvdGlhdGVkOworCQltaWlfcmVnCT0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9MUEEpOworCQluZWdvdGlhdGVkID0gbWlpX3JlZyAmIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmc7CisKKwkJZHVwbGV4ID0gKG5lZ290aWF0ZWQgJiBMUEFfMTAwRlVMTCkgfHwgKChuZWdvdGlhdGVkICYgMHgwMkMwKSA9PSBMUEFfMTBGVUxMKTsKKwkJZmFzdGV0aCA9IG5lZ290aWF0ZWQgJiAweDM4MDsKKwl9CisJZHVwbGV4IHw9IG5wLT5taWlfaWYuZm9yY2VfbWVkaWE7CisJLyogcmVtb3ZlIGZhc3RldGhlciBhbmQgZnVsbGR1cGxleCAqLworCXJlc3VsdCA9IG5wLT5jc3I2ICYgfjB4MjAwMDAyMDA7CisJaWYgKGR1cGxleCkKKwkJcmVzdWx0IHw9IDB4MjAwOworCWlmIChmYXN0ZXRoKQorCQlyZXN1bHQgfD0gMHgyMDAwMDAwMDsKKwlpZiAocmVzdWx0ICE9IG5wLT5jc3I2ICYmIGRlYnVnKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyAlZE1CaXQtJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSMlZFxuIiwKKwkJCQkgZGV2LT5uYW1lLCBmYXN0ZXRoID8gMTAwIDogMTAsIAorCQkJICAgCWR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgbnAtPnBoeXNbMF0pOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgUlhUWF9USU1FT1VUCTIwMDAKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfY3NyNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKwlpbnQgbGltaXQgPSBSWFRYX1RJTUVPVVQ7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCW5ldyA9IDA7CisJaWYgKG5ldz09bnAtPmNzcjYpCisJCXJldHVybjsKKwkvKiBzdG9wIGJvdGggVHggYW5kIFJ4IHByb2Nlc3NlcyAqLworCWlvd3JpdGUzMihucC0+Y3NyNiAmIH4weDIwMDIsIGlvYWRkciArIE5ldHdvcmtDb25maWcpOworCS8qIHdhaXQgdW50aWwgdGhleSBoYXZlIHJlYWxseSBzdG9wcGVkICovCisJZm9yICg7OykgeworCQlpbnQgY3NyNSA9IGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpOworCQlpbnQgdDsKKworCQl0ID0gKGNzcjUgPj4gMTcpICYgMHgwNzsKKwkJaWYgKHQ9PTB8fHQ9PTEpIHsKKwkJCS8qIHJ4IHN0b3BwZWQgKi8KKwkJCXQgPSAoY3NyNSA+PiAyMCkgJiAweDA3OworCQkJaWYgKHQ9PTB8fHQ9PTEpCisJCQkJYnJlYWs7CisJCX0KKworCQlsaW1pdC0tOworCQlpZighbGltaXQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3VsZG4ndCBzdG9wIHJ4dHgsIEludHJTdGF0dXMgJXhoLlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBjc3I1KTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisJbnAtPmNzcjYgPSBuZXc7CisJLyogYW5kIHJlc3RhcnQgdGhlbSB3aXRoIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLworCWlvd3JpdGUzMihucC0+Y3NyNiwgaW9hZGRyICsgTmV0d29ya0NvbmZpZyk7CisJaWYgKG5ldyAmIDB4MjAwKQorCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aW1lciB0aWNrLCBzdGF0dXMgJTguOHggIgorCQkJICAgImNvbmZpZyAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgTmV0d29ya0NvbmZpZykpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwl1cGRhdGVfY3NyNihkZXYsIHVwZGF0ZV9saW5rKGRldikpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEwKkhaOworCWFkZF90aW1lcigmbnAtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yeHR4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nWzBdOworCW5wLT50eF9yaW5nID0gKHN0cnVjdCB3ODQwX3R4X2Rlc2MqKSZucC0+cnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCisJLyogSW5pdGlhbCBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLmxlbmd0aCA9IG5wLT5yeF9idWZfc3o7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCW5wLT5yeF9yaW5nW2ktMV0ubGVuZ3RoIHw9IERlc2NFbmRSaW5nOworCisJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCW5wLT5yeF9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsc2tiLT50YWlsLAorCQkJCQlza2ItPmxlbixQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCW5wLT5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSBucC0+cnhfYWRkcltpXTsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gRGVzY093bjsKKwl9CisKKwlucC0+Y3VyX3J4ID0gMDsKKwlucC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCS8qIEluaXRpYWxpemUgdGhlIFR4IGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlucC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKwlucC0+dHhfZnVsbCA9IDA7CisJbnAtPnR4X3FfYnl0ZXMgPSBucC0+ZGlydHlfdHggPSBucC0+Y3VyX3R4ID0gMDsKKworCWlvd3JpdGUzMihucC0+cmluZ19kbWFfYWRkciwgbnAtPmJhc2VfYWRkciArIFJ4UmluZ1B0cik7CisJaW93cml0ZTMyKG5wLT5yaW5nX2RtYV9hZGRyK3NpemVvZihzdHJ1Y3Qgdzg0MF9yeF9kZXNjKSpSWF9SSU5HX1NJWkUsCisJCW5wLT5iYXNlX2FkZHIgKyBUeFJpbmdQdHIpOworCit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcnh0eF9yaW5ncyhzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUqIG5wKQoreworCWludCBpOworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQlucC0+cnhfYWRkcltpXSwKKwkJCQkJCW5wLT5yeF9za2J1ZmZbaV0tPmxlbiwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2J1ZmZbaV0pOworCQl9CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKG5wLT50eF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQlucC0+dHhfYWRkcltpXSwKKwkJCQkJCW5wLT50eF9za2J1ZmZbaV0tPmxlbiwKKwkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+dHhfc2tidWZmW2ldKTsKKwkJfQorCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaW93cml0ZTgoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgU3RhdGlvbkFkZHIgKyBpKTsKKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworI2lmZGVmIF9fQklHX0VORElBTgorCWkgPSAoMTw8MjApOwkvKiBCaWctZW5kaWFuIGRlc2NyaXB0b3JzICovCisjZWxzZQorCWkgPSAwOworI2VuZGlmCisJaSB8PSAoMHgwNDw8Mik7CQkvKiBza2lwIGxlbmd0aCA0IHUzMiAqLworCWkgfD0gMHgwMjsJCS8qIGdpdmUgUnggcHJpb3JpdHkgKi8KKworCS8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4KKwkgICA0ODY6IFNldCA4IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgOCBsb25nd29yZCBidXJzdC4KKwkgICA1ODY6IFNldCAxNiBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIG5vIGJ1cnN0IGxpbWl0LgorCSAgIENhY2hlIGFsaWdubWVudCBiaXRzIDE1OjE0CSAgICAgQnVyc3QgbGVuZ3RoIDEzOjgKKwkJMDAwMAk8bm90IGFsbG93ZWQ+IAkJMDAwMCBhbGlnbiB0byBjYWNoZQkwODAwIDggbG9uZ3dvcmRzCisJCTQwMDAJOCAgbG9uZ3dvcmRzCQkwMTAwIDEgbG9uZ3dvcmQJCTEwMDAgMTYgbG9uZ3dvcmRzCisJCTgwMDAJMTYgbG9uZ3dvcmRzCQkwMjAwIDIgbG9uZ3dvcmRzCTIwMDAgMzIgbG9uZ3dvcmRzCisJCUMwMDAJMzIgIGxvbmd3b3JkcwkJMDQwMCA0IGxvbmd3b3JkcyAqLworCisjaWYgZGVmaW5lZCAoX19pMzg2X18pICYmICFkZWZpbmVkKE1PRFVMRSkKKwkvKiBXaGVuIG5vdCBhIG1vZHVsZSB3ZSBjYW4gd29yayBhcm91bmQgYnJva2VuICc0ODYgUENJIGJvYXJkcy4gKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPD0gNCkgeworCQlpIHw9IDB4NDgwMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoaXMgaXMgYSAzODYvNDg2IFBDSSBzeXN0ZW0sIHNldHRpbmcgY2FjaGUgIgorCQkJICAgImFsaWdubWVudCB0byA4IGxvbmd3b3Jkcy5cbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJaSB8PSAweEUwMDA7CisJfQorI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlpIHw9IDB4RTAwMDsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCWkgfD0gMHg0ODAwOworI2Vsc2UKKyN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkCisJaSB8PSAweDQ4MDA7CisjZW5kaWYKKwlpb3dyaXRlMzIoaSwgaW9hZGRyICsgUENJQnVzQ2ZnKTsKKworCW5wLT5jc3I2ID0gMDsKKwkvKiAxMjggYnl0ZSBUeCB0aHJlc2hvbGQ7IAorCQlUcmFuc21pdCBvbjsgUmVjZWl2ZSBvbjsgKi8KKwl1cGRhdGVfY3NyNihkZXYsIDB4MDAwMjIwMDIgfCB1cGRhdGVfbGluayhkZXYpIHwgX19zZXRfcnhfbW9kZShkZXYpKTsKKworCS8qIENsZWFyIGFuZCBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIoMHgxQTBGNSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJaW93cml0ZTMyKDB4MUEwRjUsIGlvYWRkciArIEludHJFbmFibGUpOworCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFJ4U3RhcnREZW1hbmQpOworfQorCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU4Ljh4LCIKKwkJICAgIiByZXNldHRpbmcuLi5cbiIsIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgSW50clN0YXR1cykpOworCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlcDogIiwgbnAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpbnAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyAlcDogIiwgbnAtPnR4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsIG5wLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgIlR4IGN1ciAlZCBUeCBkaXJ0eSAlZCBUeCBGdWxsICVkLCBxIGJ5dGVzICVkLlxuIiwKKwkJCQlucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsIG5wLT50eF9mdWxsLCBucC0+dHhfcV9ieXRlcyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlR4IERlc2NyaXB0b3IgYWRkciAleGguXG4iLGlvcmVhZDMyKGlvYWRkcisweDRDKSk7CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCS8qCisJICogVW5kZXIgaGlnaCBsb2FkIGRpcnR5X3R4IGFuZCB0aGUgaW50ZXJuYWwgdHggZGVzY3JpcHRvciBwb2ludGVyCisJICogY29tZSBvdXQgb2Ygc3luYywgdGh1cyBwZXJmb3JtIGEgc29mdHdhcmUgcmVzZXQgYW5kIHJlaW5pdGlhbGl6ZQorCSAqIGV2ZXJ5dGhpbmcuCisJICovCisKKwlpb3dyaXRlMzIoMSwgbnAtPmJhc2VfYWRkcitQQ0lCdXNDZmcpOworCXVkZWxheSgxKTsKKworCWZyZWVfcnh0eF9yaW5ncyhucCk7CisJaW5pdF9yeHR4X3JpbmdzKGRldik7CisJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIGludCBhbGxvY19yaW5nZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbnAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTAwID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMzIpOworCisJbnAtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChucC0+cGNpX2RldiwKKwkJCXNpemVvZihzdHJ1Y3Qgdzg0MF9yeF9kZXNjKSpSWF9SSU5HX1NJWkUgKworCQkJc2l6ZW9mKHN0cnVjdCB3ODQwX3R4X2Rlc2MpKlRYX1JJTkdfU0laRSwKKwkJCSZucC0+cmluZ19kbWFfYWRkcik7CisJaWYoIW5wLT5yeF9yaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbml0X3J4dHhfcmluZ3MoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yaW5nZGVzYyhzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wKQoreworCXBjaV9mcmVlX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHc4NDBfcnhfZGVzYykqUlhfUklOR19TSVpFICsKKwkJCXNpemVvZihzdHJ1Y3Qgdzg0MF90eF9kZXNjKSpUWF9SSU5HX1NJWkUsCisJCQlucC0+cnhfcmluZywgbnAtPnJpbmdfZG1hX2FkZHIpOworCit9CisKK3N0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBlbnRyeTsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBmaWVsZAorCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCW5wLT50eF9hZGRyW2VudHJ5XSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCXNrYi0+ZGF0YSxza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwlucC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IG5wLT50eF9hZGRyW2VudHJ5XTsKKwlpZiAoc2tiLT5sZW4gPCBUWF9CVUZMSU1JVCkgeworCQlucC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gRGVzY1dob2xlUGt0IHwgc2tiLT5sZW47CisJfSBlbHNlIHsKKwkJaW50IGxlbiA9IHNrYi0+bGVuIC0gVFhfQlVGTElNSVQ7CisKKwkJbnAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjIgPSBucC0+dHhfYWRkcltlbnRyeV0rVFhfQlVGTElNSVQ7CisJCW5wLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBEZXNjV2hvbGVQa3QgfCAobGVuIDw8IDExKSB8IFRYX0JVRkxJTUlUOworCX0KKwlpZihlbnRyeSA9PSBUWF9SSU5HX1NJWkUtMSkKKwkJbnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCB8PSBEZXNjRW5kUmluZzsKKworCS8qIE5vdyBhY3F1aXJlIHRoZSBpcnEgc3BpbmxvY2suCisJICogVGhlIGRpZmZpY3VsdCByYWNlIGlzIHRoZSB0aGUgb3JkZXJpbmcgYmV0d2VlbgorCSAqIGluY3JlYXNpbmcgbnAtPmN1cl90eCBhbmQgc2V0dGluZyBEZXNjT3duOgorCSAqIC0gaWYgbnAtPmN1cl90eCBpcyBpbmNyZWFzZWQgZmlyc3QgdGhlIGludGVycnVwdAorCSAqICAgaGFuZGxlciBjb3VsZCBjb25zaWRlciB0aGUgcGFja2V0IGFzIHRyYW5zbWl0dGVkCisJICogICBzaW5jZSBEZXNjT3duIGlzIGNsZWFyZWQuCisJICogLSBJZiBEZXNjT3duIGlzIHNldCBmaXJzdCB0aGUgTklDIGNvdWxkIHJlcG9ydCB0aGUKKwkgKiAgIHBhY2tldCBhcyBzZW50LCBidXQgdGhlIGludGVycnVwdCBoYW5kbGVyIHdvdWxkIGlnbm9yZSBpdAorCSAqICAgc2luY2UgdGhlIG5wLT5jdXJfdHggd2FzIG5vdCB5ZXQgaW5jcmVhc2VkLgorCSAqLworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlucC0+Y3VyX3R4Kys7CisKKwl3bWIoKTsgLyogZmx1c2ggbGVuZ3RoLCBidWZmZXIxLCBidWZmZXIyICovCisJbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd247CisJd21iKCk7IC8qIGZsdXNoIHN0YXR1cyBhbmQga2ljayB0aGUgaGFyZHdhcmUgKi8KKwlpb3dyaXRlMzIoMCwgbnAtPmJhc2VfYWRkciArIFR4U3RhcnREZW1hbmQpOworCW5wLT50eF9xX2J5dGVzICs9IHNrYi0+bGVuOworCS8qIFdvcmsgYXJvdW5kIGhvcnJpYmxlIGJ1ZyBpbiB0aGUgY2hpcCBieSBtYXJraW5nIHRoZSBxdWV1ZSBhcyBmdWxsCisJICAgd2hlbiB3ZSBkbyBub3QgaGF2ZSBGSUZPIHJvb20gZm9yIGEgbWF4aW11bSBzaXplZCBwYWNrZXQuICovCisJaWYgKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPiBUWF9RVUVVRV9MRU4gfHwKKwkJKChucC0+ZHJ2X2ZsYWdzICYgSGFzQnJva2VuVHgpICYmIG5wLT50eF9xX2J5dGVzID4gVFhfQlVHX0ZJRk9fTElNSVQpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJd21iKCk7CisJCW5wLT50eF9mdWxsID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChkZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZvciAoOyBucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID4gMDsgbnAtPmRpcnR5X3R4KyspIHsKKwkJaW50IGVudHJ5ID0gbnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlpbnQgdHhfc3RhdHVzID0gbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1czsKKworCQlpZiAodHhfc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAodHhfc3RhdHVzICYgMHg4MDAwKSB7IAkvKiBUaGVyZSB3YXMgYW4gZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKGRlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisjZW5kaWYKKwkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDAxMDQpIG5wLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MEM4MCkgbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgMHgwMjAwKSBucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDAwMikgbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoKHR4X3N0YXR1cyAmIDB4MDA4MCkgJiYgbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9PSAwKQorCQkJCW5wLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCX0gZWxzZSB7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChkZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBzbG90ICVkIG9rLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGVudHJ5LCB0eF9zdGF0dXMpOworI2VuZGlmCisJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgPj4gMykgJiAxNTsKKwkJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LG5wLT50eF9hZGRyW2VudHJ5XSwKKwkJCQkJbnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCW5wLT50eF9xX2J5dGVzIC09IG5wLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCWRldl9rZnJlZV9za2JfaXJxKG5wLT50eF9za2J1ZmZbZW50cnldKTsKKwkJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCX0KKwlpZiAobnAtPnR4X2Z1bGwgJiYKKwkJbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTl9SRVNUQVJUICYmCisJCW5wLT50eF9xX2J5dGVzIDwgVFhfQlVHX0ZJRk9fTElNSVQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQlucC0+dHhfZnVsbCA9IDA7CisJCXdtYigpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKwlpbnQgd29ya19saW1pdCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiBJUlFfTk9ORTsKKwlkbyB7CisJCXUzMiBpbnRyX3N0YXR1cyA9IGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpOworCisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQlpb3dyaXRlMzIoaW50cl9zdGF0dXMgJiAweDAwMWZmZmYsIGlvYWRkciArIEludHJTdGF0dXMpOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKworCQlpZiAoKGludHJfc3RhdHVzICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhEb25lIHwgUnhOb0J1ZikpCisJCQluZXRkZXZfcngoZGV2KTsKKwkJaWYgKGludHJfc3RhdHVzICYgUnhOb0J1ZikKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoVHhJZGxlIHwgSW50clR4RG9uZSkgJiYKKwkJCW5wLT5jdXJfdHggIT0gbnAtPmRpcnR5X3R4KSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCW5ldGRldl90eF9kb25lKGRldik7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisKKwkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIChBYm5vcm1hbEludHIgfCBUeEZJRk9VbmRlcmZsb3cgfCBJbnRyUENJRXJyIHwKKwkJCQkJCSAgIFRpbWVySW50IHwgSW50clR4U3RvcHBlZCkpCisJCQluZXRkZXZfZXJyb3IoZGV2LCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKC0td29ya19saW1pdCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJCSAgICJzdGF0dXM9MHglNC40eC5cbiIsIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCQkJLyogU2V0IHRoZSB0aW1lciB0byByZS1lbmFibGUgdGhlIG90aGVyIGludGVycnVwdHMgYWZ0ZXIKKwkJCSAgIDEwKjgydXNlYyB0aWNrcy4gKi8KKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJCQlpb3dyaXRlMzIoQWJub3JtYWxJbnRyIHwgVGltZXJJbnQsIGlvYWRkciArIEludHJFbmFibGUpOworCQkJCWlvd3JpdGUzMigxMCwgaW9hZGRyICsgR1BUaW1lcik7CisJCQl9CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChkZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGJ1dCBzZXBhcmF0ZWQKKyAgIGZvciBjbGFyaXR5IGFuZCBiZXR0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gKi8KK3N0YXRpYyBpbnQgbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gbnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgd29ya19saW1pdCA9IG5wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIG5wLT5jdXJfcng7CisKKwlpZiAoZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gbmV0ZGV2X3J4KCksIGVudHJ5ICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBlbnRyeSwgbnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKC0td29ya19saW1pdCA+PSAwKSB7CisJCXN0cnVjdCB3ODQwX3J4X2Rlc2MgKmRlc2MgPSBucC0+cnhfaGVhZF9kZXNjOworCQlzMzIgc3RhdHVzID0gZGVzYy0+c3RhdHVzOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBzdGF0dXMgd2FzICU4Ljh4LlxuIiwKKwkJCQkgICBzdGF0dXMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworCQkJaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKwkJCQkvKiBJbmdvcmUgZWFybGllciBidWZmZXJzLiAqLworCQkJCWlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSBzcGFubmVkICIKKwkJCQkJCSAgICJtdWx0aXBsZSBidWZmZXJzLCBlbnRyeSAlI3ggc3RhdHVzICU0LjR4IVxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl9yeCwgc3RhdHVzKTsKKwkJCQkJbnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCS8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworCQkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZSBlcnJvciwgUnggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworCQkJCWlmIChzdGF0dXMgJiAweDA4OTApIG5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIDB4MDA0QykgbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwMDIpIG5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCQkJaW50IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChkZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJCSAgICIgc3RhdHVzICV4LlxuIiwgcGt0X2xlbiwgc3RhdHVzKTsKKyNlbmRpZgorCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhaworCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldixucC0+cnhfYWRkcltlbnRyeV0sCisJCQkJCQkJICAgIG5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LG5wLT5yeF9hZGRyW2VudHJ5XSwKKwkJCQkJCQkgICAgICAgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldixucC0+cnhfYWRkcltlbnRyeV0sCisJCQkJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOworCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgkJCQkvKiBSZW1vdmUgYWZ0ZXIgdGVzdGluZy4gKi8KKwkJCS8qIFlvdSB3aWxsIHdhbnQgdGhpcyBpbmZvIGZvciB0aGUgaW5pdGlhbCBkZWJ1Zy4gKi8KKwkJCWlmIChkZWJ1ZyA+IDUpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggZGF0YSAlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDoiCisJCQkJCSAgICIlMi4yeCAlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeCAlMi4yeCUyLjJ4ICIKKwkJCQkJICAgIiVkLiVkLiVkLiVkLlxuIiwKKwkJCQkJICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwgc2tiLT5kYXRhWzNdLAorCQkJCQkgICBza2ItPmRhdGFbNF0sIHNrYi0+ZGF0YVs1XSwgc2tiLT5kYXRhWzZdLCBza2ItPmRhdGFbN10sCisJCQkJCSAgIHNrYi0+ZGF0YVs4XSwgc2tiLT5kYXRhWzldLCBza2ItPmRhdGFbMTBdLAorCQkJCQkgICBza2ItPmRhdGFbMTFdLCBza2ItPmRhdGFbMTJdLCBza2ItPmRhdGFbMTNdLAorCQkJCQkgICBza2ItPmRhdGFbMTRdLCBza2ItPmRhdGFbMTVdLCBza2ItPmRhdGFbMTZdLAorCQkJCQkgICBza2ItPmRhdGFbMTddKTsKKyNlbmRpZgorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWVudHJ5ID0gKCsrbnAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJCW5wLT5yeF9oZWFkX2Rlc2MgPSAmbnAtPnJ4X3JpbmdbZW50cnldOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyBucC0+Y3VyX3J4IC0gbnAtPmRpcnR5X3J4ID4gMDsgbnAtPmRpcnR5X3J4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZW50cnkgPSBucC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmIChucC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCW5wLT5yeF9hZGRyW2VudHJ5XSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJCXNrYi0+dGFpbCwKKwkJCQkJCQlza2ItPmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbZW50cnldOworCQl9CisJCXdtYigpOworCQlucC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gRGVzY093bjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFibm9ybWFsIGV2ZW50LCAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwlpZiAoaW50cl9zdGF0dXMgPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuOworCXNwaW5fbG9jaygmbnAtPmxvY2spOworCWlmIChpbnRyX3N0YXR1cyAmIFR4RklGT1VuZGVyZmxvdykgeworCQlpbnQgbmV3OworCQkvKiBCdW1wIHVwIHRoZSBUeCB0aHJlc2hvbGQgKi8KKyNpZiAwCisJCS8qIFRoaXMgY2F1c2VzIGxvdHMgb2YgZHJvcHBlZCBwYWNrZXRzLAorCQkgKiBhbmQgdW5kZXIgaGlnaCBsb2FkIGV2ZW4gdHhfdGltZW91dHMKKwkJICovCisJCW5ldyA9IG5wLT5jc3I2ICsgMHg0MDAwOworI2Vsc2UKKwkJbmV3ID0gKG5wLT5jc3I2ID4+IDE0KSYweDdmOworCQlpZiAobmV3IDwgNjQpCisJCQluZXcgKj0gMjsKKwkJIGVsc2UKKwkJIAluZXcgPSAxMjc7IC8qIGxvYWQgZnVsbCBwYWNrZXQgYmVmb3JlIHN0YXJ0aW5nICovCisJCW5ldyA9IChucC0+Y3NyNiAmIH4oMHg3RiA8PCAxNCkpIHwgKG5ldzw8MTQpOworI2VuZGlmCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggdW5kZXJmbG93LCBuZXcgY3NyNiAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIG5ldyk7CisJCXVwZGF0ZV9jc3I2KGRldiwgbmV3KTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgSW50clJ4RGllZCkgewkJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgVGltZXJJbnQpIHsKKwkJLyogUmUtZW5hYmxlIG90aGVyIGludGVycnVwdHMuICovCisJCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQkJaW93cml0ZTMyKDB4MUEwRjUsIGlvYWRkciArIEludHJFbmFibGUpOworCX0KKwlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBSeE1pc3NlZCkgJiAweGZmZmY7CisJaW93cml0ZTMyKDAsIGlvYWRkciArIFJ4U3RhcnREZW1hbmQpOworCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJLyogVGhlIGNoaXAgb25seSBuZWVkIHJlcG9ydCBmcmFtZSBzaWxlbnRseSBkcm9wcGVkLiAqLworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIFJ4TWlzc2VkKSAmIDB4ZmZmZjsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiAmbnAtPnN0YXRzOworfQorCisKK3N0YXRpYyB1MzIgX19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKwl1MzIgbWNfZmlsdGVyWzJdOwkJCS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXUzMiByeF9tb2RlOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5cworCQkJfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCQkgICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBmaWx0ZXJiaXQgPSAoZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNikgXiAweDNGOworCQkJZmlsdGVyYml0ICY9IDB4M2Y7CisJCQltY19maWx0ZXJbZmlsdGVyYml0ID4+IDVdIHw9IDEgPDwgKGZpbHRlcmJpdCAmIDMxKTsKKwkJfQorCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCX0KKwlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKKwlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKwlyZXR1cm4gcnhfbW9kZTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcnhfbW9kZSA9IF9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJdXBkYXRlX2NzcjYoZGV2LCAobnAtPmNzcjYgJiB+MHgwMEY4KSB8IHJ4X21vZGUpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkgKGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZucC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmbnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCWRlYnVnID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBuZXRkZXZfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBuZXRkZXZfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gbmV0ZGV2X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSAoKHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5waHlzWzBdICYgMHgxZjsKKwkJLyogRmFsbCBUaHJvdWdoICovCisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWRhdGEtPnZhbF9vdXQgPSBtZGlvX3JlYWQoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCW1kaW9fd3JpdGUoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgZGF0YS0+dmFsX2luKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICU4Ljh4ICIKKwkJCSAgICJDb25maWcgJTguOHguXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgTmV0d29ya0NvbmZpZykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsIG5wLT5jdXJfcngsIG5wLT5kaXJ0eV9yeCk7CisJfQorCisgCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJdXBkYXRlX2NzcjYoZGV2LCAwKTsKKwlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXdtYigpOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCWlmIChpb3JlYWQzMihpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKSAhPSAweGZmZmZmZmZmKQorCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBSeE1pc3NlZCkgJiAweGZmZmY7CisKKyNpZmRlZiBfX2kzODZfXworCWlmIChkZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKEtFUk5fREVCVUciICBUeCByaW5nIGF0ICU4Ljh4OlxuIiwKKwkJCSAgIChpbnQpbnAtPnR4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlNC40eCAlNC40eCAlOC44eC5cbiIsCisJCQkJICAgaSwgbnAtPnR4X3JpbmdbaV0ubGVuZ3RoLAorCQkJCSAgIG5wLT50eF9yaW5nW2ldLnN0YXR1cywgbnAtPnR4X3JpbmdbaV0uYnVmZmVyMSk7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyAiICBSeCByaW5nICU4Ljh4OlxuIiwKKwkJCSAgIChpbnQpbnAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIyVkIGRlc2MuICU0LjR4ICU0LjR4ICU4Ljh4XG4iLAorCQkJCSAgIGksIG5wLT5yeF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICBucC0+cnhfcmluZ1tpXS5zdGF0dXMsIG5wLT5yeF9yaW5nW2ldLmJ1ZmZlcjEpOworCQl9CisJfQorI2VuZGlmIC8qIF9faTM4Nl9fIGRlYnVnZ2luZyBvbmx5ICovCisKKwlkZWxfdGltZXJfc3luYygmbnAtPnRpbWVyKTsKKworCWZyZWVfcnh0eF9yaW5ncyhucCk7CisJZnJlZV9yaW5nZGVzYyhucCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHc4NDBfcmVtb3ZlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfaW91bm1hcChwZGV2LCBucC0+YmFzZV9hZGRyKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyoKKyAqIHN1c3BlbmQvcmVzdW1lIHN5bmNocm9uaXphdGlvbjoKKyAqIC0gb3BlbiwgY2xvc2UsIGRvX2lvY3RsOgorICogCXJ0bmxfbG9jaywgJiBuZXRpZl9kZXZpY2VfZGV0YWNoIGFmdGVyIHRoZSBydG5sX3VubG9jay4KKyAqIC0gZ2V0X3N0YXRzOgorICogCXNwaW5fbG9ja19pcnEobnAtPmxvY2spLCBkb2Vzbid0IHRvdWNoIGh3IGlmIG5vdCBwcmVzZW50CisgKiAtIGhhcmRfc3RhcnRfeG1pdDoKKyAqIAluZXRpZl9zdG9wX3F1ZXVlICsgc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworICogLSB0eF90aW1lb3V0OgorICogCW5ldGlmX2RldmljZV9kZXRhY2ggKyBzcGluX3VubG9ja193YWl0KCZkZXYtPnhtaXRfbG9jayk7CisgKiAtIHNldF9tdWx0aWNhc3RfbGlzdAorICogCW5ldGlmX2RldmljZV9kZXRhY2ggKyBzcGluX3VubG9ja193YWl0KCZkZXYtPnhtaXRfbG9jayk7CisgKiAtIGludGVycnVwdCBoYW5kbGVyCisgKiAJZG9lc24ndCB0b3VjaCBodyBpZiBub3QgcHJlc2VudCwgc3luY2hyb25pemVfaXJxIHdhaXRzIGZvcgorICogCXJ1bm5pbmcgaW5zdGFuY2VzIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBEaXNhYmxpbmcgaHcgcmVxdWlyZXMgY2xlYXJpbmcgY3NyNiAmIEludHJFbmFibGUuCisgKiB1cGRhdGVfY3NyNiAmIGFsbCBmdW5jdGlvbiB0aGF0IHdyaXRlIEludHJFbmFibGUgY2hlY2sgbmV0aWZfZGV2aWNlX3ByZXNlbnQKKyAqIGJlZm9yZSBzZXR0aW5ncyBhbnkgYml0cy4KKyAqCisgKiBEZXRhY2ggbXVzdCBvY2N1ciB1bmRlciBzcGluX3VubG9ja19pcnEoKSwgaW50ZXJydXB0cyBmcm9tIGEgZGV0YWNoZWQKKyAqIGRldmljZSB3b3VsZCBjYXVzZSBhbiBpcnEgc3Rvcm0uCisgKi8KK3N0YXRpYyBpbnQgdzg0MF9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCXJ0bmxfbG9jaygpOworCWlmIChuZXRpZl9ydW5uaW5nIChkZXYpKSB7CisJCWRlbF90aW1lcl9zeW5jKCZucC0+dGltZXIpOworCisJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQl1cGRhdGVfY3NyNihkZXYsIDApOworCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwkJc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQorCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBSeE1pc3NlZCkgJiAweGZmZmY7CisKKwkJLyogbm8gbW9yZSBoYXJkd2FyZSBhY2Nlc3NlcyBiZWhpbmQgdGhpcyBsaW5lLiAqLworCisJCWlmIChucC0+Y3NyNikgQlVHKCk7CisJCWlmIChpb3JlYWQzMihpb2FkZHIgKyBJbnRyRW5hYmxlKSkgQlVHKCk7CisKKwkJLyogcGNpX3Bvd2VyX29mZihwZGV2LCAtMSk7ICovCisKKwkJZnJlZV9yeHR4X3JpbmdzKG5wKTsKKwl9IGVsc2UgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdzg0MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gb3V0OyAvKiBkZXZpY2Ugbm90IHN1c3BlbmRlZCAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJLyoJcGNpX3Bvd2VyX29uKHBkZXYpOyAqLworCisJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJaW93cml0ZTMyKDEsIG5wLT5iYXNlX2FkZHIrUENJQnVzQ2ZnKTsKKwkJaW9yZWFkMzIobnAtPmJhc2VfYWRkcitQQ0lCdXNDZmcpOworCQl1ZGVsYXkoMSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJaW5pdF9yeHR4X3JpbmdzKGRldik7CisJCWluaXRfcmVnaXN0ZXJzKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQltb2RfdGltZXIoJm5wLT50aW1lciwgamlmZmllcyArIDEqSFopOworCX0gZWxzZSB7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwl9CitvdXQ6CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdzg0MF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gdzg0MF9wY2lfdGJsLAorCS5wcm9iZQkJPSB3ODQwX3Byb2JlMSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHc4NDBfcmVtb3ZlMSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSB3ODQwX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB3ODQwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgdzg0MF9pbml0KHZvaWQpCit7CisJcHJpbnRrKHZlcnNpb24pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnc4NDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHc4NDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdzg0MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh3ODQwX2luaXQpOworbW9kdWxlX2V4aXQodzg0MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYzRmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCkBAIC0wLDAgKzEsMTI3NyBAQAorLyoKKyAqIHhpcmNvbV9jYjogQSBkcml2ZXIgZm9yIHRoZSAodHVsaXAtbGlrZSkgWGlyY29tIENhcmRidXMgZXRoZXJuZXQgY2FyZHMgCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyAoQykgYnkgdGhlIHJlc3BlY3RpdmUgYXV0aG9ycywgYW5kIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqIExpY2Vuc2UuCisgKgorICogV3JpdHRlbiBieSBBcmphbiB2YW4gZGUgVmVuIGZvciBSZWQgSGF0LCBJbmMuCisgKiBCYXNlZCBvbiB3b3JrIGJ5IEplZmYgR2FyemlrLCBEb3VnIExlZGZvcmQgYW5kIERvbmFsZCBCZWNrZXIgCisgKgorICogIAlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoKKyAqIAkkSWQ6IHhpcmNvbV9jYi5jLHYgMS4zMyAyMDAxLzAzLzE5IDE0OjAyOjA3IGFyamFudiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBlbnRlcih4KSAgIHByaW50aygiRW50ZXI6ICVzLCAlcyBsaW5lICVpXG4iLHgsX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIGxlYXZlKHgpICAgcHJpbnRrKCJMZWF2ZTogJXMsICVzIGxpbmUgJWlcbiIseCxfX0ZJTEVfXyxfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lIGVudGVyKHgpICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxlYXZlKHgpICAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhpcmNvbSBDYXJkYnVzIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworCisvKiBJTyByZWdpc3RlcnMgb24gdGhlIGNhcmQsIG9mZnNldHMgKi8KKyNkZWZpbmUgQ1NSMAkweDAwCisjZGVmaW5lIENTUjEJMHgwOAorI2RlZmluZSBDU1IyCTB4MTAKKyNkZWZpbmUgQ1NSMwkweDE4CisjZGVmaW5lIENTUjQJMHgyMAorI2RlZmluZSBDU1I1CTB4MjgKKyNkZWZpbmUgQ1NSNgkweDMwCisjZGVmaW5lIENTUjcJMHgzOAorI2RlZmluZSBDU1I4CTB4NDAKKyNkZWZpbmUgQ1NSOQkweDQ4CisjZGVmaW5lIENTUjEwCTB4NTAKKyNkZWZpbmUgQ1NSMTEJMHg1OAorI2RlZmluZSBDU1IxMgkweDYwCisjZGVmaW5lIENTUjEzCTB4NjgKKyNkZWZpbmUgQ1NSMTQJMHg3MAorI2RlZmluZSBDU1IxNQkweDc4CisjZGVmaW5lIENTUjE2CTB4ODAKKworLyogUENJIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfUE9XRVJNR01UIAkweDQwCisKKy8qIE9mZnNldHMgb2YgdGhlIGJ1ZmZlcnMgd2l0aGluIHRoZSBkZXNjcmlwdG9yIHBhZ2VzLCBpbiBieXRlcyAqLworCisjZGVmaW5lIE5VTURFU0NSSVBUT1JTIDQKKworc3RhdGljIGludCBidWZmZXJvZmZzZXRzW05VTURFU0NSSVBUT1JTXSA9IHsxMjgsMjA0OCw0MDk2LDYxNDR9OworCisKK3N0cnVjdCB4aXJjb21fcHJpdmF0ZSB7CisJLyogU2VuZCBhbmQgcmVjZWl2ZSBidWZmZXJzLCBrZXJuZWwtYWRkcmVzc2FibGUgYW5kIGRtYSBhZGRyZXNzYWJsZSBmb3JtcyAqLworCisJdW5zaWduZWQgaW50ICpyeF9idWZmZXI7CisJdW5zaWduZWQgaW50ICp0eF9idWZmZXI7CisKKwlkbWFfYWRkcl90IHJ4X2RtYV9oYW5kbGU7CisJZG1hX2FkZHJfdCB0eF9kbWFfaGFuZGxlOworCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYls0XTsKKworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDsKKwlpbnQgb3BlbjsKKwkKKwkvKiB0cmFuc21pdF91c2VkIGlzIHRoZSByb3RhdGluZyBjb3VudGVyIHRoYXQgaW5kaWNhdGVzIHdoaWNoIHRyYW5zbWl0CisJICAgZGVzY3JpcHRvciBoYXMgdG8gYmUgdXNlZCBuZXh0ICovCisJaW50IHRyYW5zbWl0X3VzZWQ7CisKKwkvKiBTcGlubG9jayB0byBzZXJpYWxpemUgcmVnaXN0ZXIgb3BlcmF0aW9ucy4KKwkgICBJdCBtdXN0IGJlIGhlbHQgd2hpbGUgbWFuaXB1bGF0aW5nIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorCSAgIENTUjAsIENTUjYsIENTUjcsIENTUjksIENTUjEwLCBDU1IxNQorCSAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKK307CisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCB4aXJjb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCB4aXJjb21fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB4aXJjb21faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB4aXJjb21fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV91cChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCB4aXJjb21fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGludmVzdGlnYXRlX3JlYWRfZGVzY3JpcHRvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCwgaW50IGRlc2NuciwgdW5zaWduZWQgaW50IGJ1ZmZlcm9mZnNldCk7CitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCwgaW50IGRlc2NuciwgdW5zaWduZWQgaW50IGJ1ZmZlcm9mZnNldCk7CitzdGF0aWMgdm9pZCByZWFkX21hY19hZGRyZXNzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCB0cmFuc2NlaXZlcl92b29kb28oc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY2FyZChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgdHJpZ2dlcl90cmFuc21pdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgdHJpZ2dlcl9yZWNlaXZlKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBzZXR1cF9kZXNjcmlwdG9ycyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgcmVtb3ZlX2Rlc2NyaXB0b3JzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgaW50IGxpbmtfc3RhdHVzX2NoYW5nZWQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGFjdGl2YXRlX3JlY2VpdmVyKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBkZWFjdGl2YXRlX3JlY2VpdmVyKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBhY3RpdmF0ZV90cmFuc21pdHRlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV90cmFuc21pdHRlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0KHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBlbmFibGVfbGlua19pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2ludGVycnVwdHMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyBpbnQgbGlua19zdGF0dXMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKKworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB4aXJjb21fcGNpX3RhYmxlW10gPSB7CisJezB4MTE1RCwgMHgwMDAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJezAsfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgeGlyY29tX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB4aXJjb21fb3BzID0geworCS5uYW1lCQk9ICJ4aXJjb21fY2IiLCAKKwkuaWRfdGFibGUJPSB4aXJjb21fcGNpX3RhYmxlLCAKKwkucHJvYmUJCT0geGlyY29tX3Byb2JlLCAKKwkucmVtb3ZlCQk9IHhpcmNvbV9yZW1vdmUsIAorCS5zdXNwZW5kID1OVUxMLAorCS5yZXN1bWUgPU5VTEwKK307CisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBwcmludF9iaW5hcnkodW5zaWduZWQgaW50IG51bWJlcikKK3sKKwlpbnQgaSxpMjsKKwljaGFyIGJ1ZmZlcls2NF07CisJbWVtc2V0KGJ1ZmZlciwwLDY0KTsKKwlpMj0wOworCWZvciAoaT0zMTtpPj0wO2ktLSkgeworCQlpZiAobnVtYmVyICYgKDE8PGkpKQorCQkJYnVmZmVyW2kyKytdPScxJzsKKwkJZWxzZQorCQkJYnVmZmVyW2kyKytdPScwJzsKKwkJaWYgKChpJjMpPT0wKSAKKwkJCWJ1ZmZlcltpMisrXT0nICc7CisJfQorCXByaW50aygiJXNcbiIsYnVmZmVyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqcHJpdmF0ZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAieGlyY29tX2NiIik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwcml2YXRlLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCit9OworCisvKiB4aXJjb21fcHJvYmUgaXMgdGhlIGNvZGUgdGhhdCBnZXRzIGNhbGxlZCBvbiBkZXZpY2UgaW5zZXJ0aW9uLgorICAgaXQgc2V0cyB1cCB0aGUgaGFyZHdhcmUgYW5kIHJlZ2lzdGVycyB0aGUgZGV2aWNlIHRvIHRoZSBuZXR3b3JrbGF5ZXIuCisgICAKKyAgIFRPRE86IFNlbmQgMSBvciAyICJkdW1teSIgcGFja2V0cyBoZXJlIGFzIHRoZSBjYXJkIHNlZW1zIHRvIGRpc2NhcmQgdGhlCisgICAgICAgICBmaXJzdCB0d28gcGFja2V0cyB0aGF0IGdldCBzZW5kLCBhbmQgcHVtcCBoYXRlcyB0aGF0LgorICAgICAgICAgCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHhpcmNvbV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqcHJpdmF0ZTsKKwl1bnNpZ25lZCBjaGFyIGNoaXBfcmV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgdG1wMTY7CisJZW50ZXIoInhpcmNvbV9wcm9iZSIpOworCQorCS8qIEZpcnN0IGRvIHRoZSBQQ0kgaW5pdGlhbGlzYXRpb24gKi8KKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBkaXNhYmxlIGFsbCBwb3dlcm1hbmFnZW1lbnQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9QT1dFUk1HTVQsIDB4MDAwMCk7CisJCisJcGNpX3NldF9tYXN0ZXIocGRldik7IC8qIFdoeSBpc24ndCB0aGlzIGRvbmUgYnkgcGNpX2VuYWJsZV9kZXZpY2UgPyovCisKKwkvKiBjbGVhciBQQ0kgc3RhdHVzLCBpZiBhbnkgKi8gCisJcGNpX3JlYWRfY29uZmlnX3dvcmQgKHBkZXYsUENJX1NUQVRVUywgJnRtcDE2KTsgCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkIChwZGV2LCBQQ0lfU1RBVFVTLHRtcDE2KTsKKwkKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZjaGlwX3Jldik7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIDEyOCwgInhpcmNvbV9jYiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBmYWlsZWQgdG8gYWxsb2NhdGUgaW8tcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogCisJICAgQmVmb3JlIGNoYW5naW5nIHRoZSBoYXJkd2FyZSwgYWxsb2NhdGUgdGhlIG1lbW9yeS4KKwkgICBUaGlzIHdheSwgd2UgY2FuIGZhaWwgZ3JhY2VmdWxseSBpZiBub3QgZW5vdWdoIG1lbW9yeQorCSAgIGlzIGF2YWlsYWJsZS4gCisJICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBmYWlsZWQgdG8gYWxsb2NhdGUgZXRoZXJkZXZcbiIpOworCQlnb3RvIGRldmljZV9mYWlsOworCX0KKwlwcml2YXRlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwkvKiBBbGxvY2F0ZSB0aGUgc2VuZC9yZWNlaXZlIGJ1ZmZlcnMgKi8KKwlwcml2YXRlLT5yeF9idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LDgxOTIsJnByaXZhdGUtPnJ4X2RtYV9oYW5kbGUpOworCWlmIChwcml2YXRlLT5yeF9idWZmZXIgPT0gTlVMTCkgeworIAkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fcHJvYmU6IG5vIG1lbW9yeSBmb3IgcnggYnVmZmVyIFxuIik7CisJCWdvdG8gcnhfYnVmX2ZhaWw7CisJfQkKKwlwcml2YXRlLT50eF9idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LDgxOTIsJnByaXZhdGUtPnR4X2RtYV9oYW5kbGUpOworCWlmIChwcml2YXRlLT50eF9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9wcm9iZTogbm8gbWVtb3J5IGZvciB0eCBidWZmZXIgXG4iKTsKKwkJZ290byB0eF9idWZfZmFpbDsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCisJcHJpdmF0ZS0+ZGV2ID0gZGV2OworCXByaXZhdGUtPnBkZXYgPSBwZGV2OworCXByaXZhdGUtPmlvX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXZhdGUtPmxvY2spOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyID0gcHJpdmF0ZS0+aW9fcG9ydDsKKwkKKwlpbml0aWFsaXplX2NhcmQocHJpdmF0ZSk7CisJcmVhZF9tYWNfYWRkcmVzcyhwcml2YXRlKTsKKwlzZXR1cF9kZXNjcmlwdG9ycyhwcml2YXRlKTsKKwkKKwlkZXYtPm9wZW4gPSAmeGlyY29tX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmeGlyY29tX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJnhpcmNvbV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZ4aXJjb21fZ2V0X3N0YXRzOworCWRldi0+cHJpdiA9IHByaXZhdGU7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZ4aXJjb21fcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fcHJvYmU6IG5ldGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkLlxuIik7CisJCWdvdG8gcmVnX2ZhaWw7CisJfQorCQkKKwlwcmludGsoS0VSTl9JTkZPICIlczogWGlyY29tIGNhcmRidXMgcmV2aXNpb24gJWkgYXQgaXJxICVpIFxuIiwgZGV2LT5uYW1lLCBjaGlwX3JldiwgcGRldi0+aXJxKTsKKwkvKiBzdGFydCB0aGUgdHJhbnNtaXR0ZXIgdG8gZ2V0IGEgaGVhcnRiZWF0ICovCisJLyogVE9ETzogc2VuZCAyIGR1bW15IHBhY2tldHMgaGVyZSAqLworCXRyYW5zY2VpdmVyX3Zvb2Rvbyhwcml2YXRlKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdmF0ZS0+bG9jayxmbGFncyk7CisJYWN0aXZhdGVfdHJhbnNtaXR0ZXIocHJpdmF0ZSk7CisJYWN0aXZhdGVfcmVjZWl2ZXIocHJpdmF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdmF0ZS0+bG9jayxmbGFncyk7CisJCisJdHJpZ2dlcl9yZWNlaXZlKHByaXZhdGUpOworCQorCWxlYXZlKCJ4aXJjb21fcHJvYmUiKTsKKwlyZXR1cm4gMDsKKworcmVnX2ZhaWw6CisJa2ZyZWUocHJpdmF0ZS0+dHhfYnVmZmVyKTsKK3R4X2J1Zl9mYWlsOgorCWtmcmVlKHByaXZhdGUtPnJ4X2J1ZmZlcik7CityeF9idWZfZmFpbDoKKwlmcmVlX25ldGRldihkZXYpOworZGV2aWNlX2ZhaWw6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyoKKyB4aXJjb21fcmVtb3ZlIGlzIGNhbGxlZCBvbiBtb2R1bGUtdW5sb2FkIG9yIG9uIGRldmljZS1lamVjdC4KKyBpdCB1bnJlZ2lzdGVycyB0aGUgaXJxLCBpby1yZWdpb24gYW5kIG5ldHdvcmsgZGV2aWNlLgorIEludGVycnVwdHMgYW5kIHN1Y2ggYXJlIGFscmVhZHkgc3RvcHBlZCBpbiB0aGUgImlmY29uZmlnIGV0aFggZG93biIKKyBjb2RlLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgeGlyY29tX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisKKwllbnRlcigieGlyY29tX3JlbW92ZSIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiw4MTkyLGNhcmQtPnJ4X2J1ZmZlcixjYXJkLT5yeF9kbWFfaGFuZGxlKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsODE5MixjYXJkLT50eF9idWZmZXIsY2FyZC0+dHhfZG1hX2hhbmRsZSk7CisKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMTI4KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWxlYXZlKCJ4aXJjb21fcmVtb3ZlIik7Cit9IAorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgaTsKKworCWVudGVyKCJ4aXJjb21faW50ZXJydXB0XG4iKTsKKworCXNwaW5fbG9jaygmY2FyZC0+bG9jayk7CisJc3RhdHVzID0gaW5sKGNhcmQtPmlvX3BvcnQrQ1NSNSk7CisKKyNpZmRlZiBERUJVRwkKKwlwcmludF9iaW5hcnkoc3RhdHVzKTsKKwlwcmludGsoInR4IHN0YXR1cyAweCUwOHggMHglMDh4IFxuIixjYXJkLT50eF9idWZmZXJbMF0sY2FyZC0+dHhfYnVmZmVyWzRdKTsKKwlwcmludGsoInJ4IHN0YXR1cyAweCUwOHggMHglMDh4IFxuIixjYXJkLT5yeF9idWZmZXJbMF0sY2FyZC0+cnhfYnVmZmVyWzRdKTsKKyNlbmRpZgkKKwkvKiBIYW5kbGUgc2hhcmVkIGlycSBhbmQgaG90cGx1ZyAqLworCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZmZmZmZmZikgeworCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAobGlua19zdGF0dXNfY2hhbmdlZChjYXJkKSkgeworCQlpbnQgbmV3bGluazsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInhpcmNvbV9jYjogTGluayBzdGF0dXMgaGFzIGNoYW5nZWQgXG4iKTsKKwkJbmV3bGluayA9IGxpbmtfc3RhdHVzKGNhcmQpOworCQlwcmludGsoS0VSTl9JTkZPICAieGlyY29tX2NiOiBMaW5rIGlzICVpIG1iaXQgXG4iLG5ld2xpbmspOworCQlpZiAobmV3bGluaykKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCisJfQorCisJLyogQ2xlYXIgYWxsIHJlbWFpbmluZyBpbnRlcnJ1cHRzICovCQorCXN0YXR1cyB8PSAweGZmZmZmZmZmOyAvKiBGSVhNRTogbWFrZSB0aGlzIGNsZWFyIG9ubHkgdGhlCisJCQkJICAgICAgICByZWFsIGV4aXN0aW5nIGJpdHMgKi8KKwlvdXRsKHN0YXR1cyxjYXJkLT5pb19wb3J0K0NTUjUpOworCQorCisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKyspIAorCQlpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKGRldixjYXJkLGksYnVmZmVyb2Zmc2V0c1tpXSk7CisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKyspIAorCQlpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3IoZGV2LGNhcmQsaSxidWZmZXJvZmZzZXRzW2ldKTsKKworCQorCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwlsZWF2ZSgieGlyY29tX2ludGVycnVwdCIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB4aXJjb21fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuZXh0ZGVzY3JpcHRvcjsKKwlpbnQgZGVzYzsKKwllbnRlcigieGlyY29tX3N0YXJ0X3htaXQiKTsKKwkKKwljYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7CisJCisJLyogRmlyc3Qgc2VlIGlmIHdlIGNhbiBmcmVlIHNvbWUgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGRlc2M9MDtkZXNjPE5VTURFU0NSSVBUT1JTO2Rlc2MrKykgCisJCWludmVzdGlnYXRlX3dyaXRlX2Rlc2NyaXB0b3IoZGV2LGNhcmQsZGVzYyxidWZmZXJvZmZzZXRzW2Rlc2NdKTsKKwkKKwkKKwluZXh0ZGVzY3JpcHRvciA9IChjYXJkLT50cmFuc21pdF91c2VkICsxKSAlIChOVU1ERVNDUklQVE9SUyk7CisJZGVzYyA9IGNhcmQtPnRyYW5zbWl0X3VzZWQ7CisJCisJLyogb25seSBzZW5kIHRoZSBwYWNrZXQgaWYgdGhlIGRlc2NyaXB0b3IgaXMgZnJlZSAqLworCWlmIChjYXJkLT50eF9idWZmZXJbNCpkZXNjXT09MCkgeworCQkJLyogQ29weSB0aGUgcGFja2V0IGRhdGE7IHplcm8gdGhlIG1lbW9yeSBmaXJzdCBhcyB0aGUgY2FyZAorCQkJICAgc29tZXRpbWVzIHNlbmRzIG1vcmUgdGhhbiB5b3UgYXNrIGl0IHRvLiAqLworCQkJCisJCQltZW1zZXQoJmNhcmQtPnR4X2J1ZmZlcltidWZmZXJvZmZzZXRzW2Rlc2NdLzRdLDAsMTUzNik7CisJCQltZW1jcHkoJihjYXJkLT50eF9idWZmZXJbYnVmZmVyb2Zmc2V0c1tkZXNjXS80XSksc2tiLT5kYXRhLHNrYi0+bGVuKTsKKwkKKwkKKwkJCS8qIEZJWE1FOiBUaGUgc3BlY2lmaWNhdGlvbiB0ZWxscyB1cyB0aGF0IHRoZSBsZW5ndGggd2Ugc2VuZCBIQVMgdG8gYmUgYSBtdWx0aXBsZSBvZgorCQkJICAgNCBieXRlcy4gKi8KKwkJCSAgIAorCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzYysxXSA9IHNrYi0+bGVuOworCQkJaWYgKGRlc2MgPT0gTlVNREVTQ1JJUFRPUlMtMSkKKwkJCQljYXJkLT50eF9idWZmZXJbNCpkZXNjKzFdIHw9ICgxPDwyNSk7ICAvKiBiaXQgMjU6IGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgcmluZyAqLworCisJCQljYXJkLT50eF9idWZmZXJbNCpkZXNjKzFdIHw9IDB4RjAwMDAwMDA7CisJCQkJCQkgLyogMHhGMC4uLiBtZWFucyB3YW50IGludGVycnVwdHMqLyAKKwkJCWNhcmQtPnR4X3NrYltkZXNjXSA9IHNrYjsKKwkJCQorCQkJd21iKCk7CisJCQkvKiBUaGlzIGdpdmVzIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjYXJkICovCisJCQljYXJkLT50eF9idWZmZXJbNCpkZXNjXSA9IDB4ODAwMDAwMDA7CisJCQl0cmlnZ2VyX3RyYW5zbWl0KGNhcmQpOworCQkJaWYgKCgoaW50KWNhcmQtPnR4X2J1ZmZlcltuZXh0ZGVzY3JpcHRvcio0XSk8MCkgewkvKiBuZXh0IGRlc2NyaXB0b3IgaXMgb2NjdXBpZWQuLi4gKi8KKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQl9CisJCQljYXJkLT50cmFuc21pdF91c2VkID0gbmV4dGRlc2NyaXB0b3I7CisJCQlsZWF2ZSgieGlyY29tLXN0YXJ0X3htaXQgLSBzZW50Iik7CQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7CisJCQlyZXR1cm4gMDsKKwl9CisJCisKKworCS8qIFVoIG9oLi4uIG5vIGZyZWUgZGVzY3JpcHRvci4uLiBkcm9wIHRoZSBwYWNrZXQgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7CisJdHJpZ2dlcl90cmFuc21pdChjYXJkKTsKKwkKKwlyZXR1cm4gLUVJTzsKK30KKworCisKKworc3RhdGljIGludCB4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqeHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXR2YWw7CisJZW50ZXIoInhpcmNvbV9vcGVuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAieGlyY29tIGNhcmRidXMgYWRhcHRvciBmb3VuZCwgcmVnaXN0ZXJpbmcgYXMgJXMsIHVzaW5nIGlycSAlaSBcbiIsZGV2LT5uYW1lLGRldi0+aXJxKTsKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnhpcmNvbV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlsZWF2ZSgieGlyY29tX29wZW4gLSBObyBJUlEiKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJeGlyY29tX3VwKHhwKTsKKwl4cC0+b3BlbiA9IDE7CisJbGVhdmUoInhpcmNvbV9vcGVuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZW50ZXIoInhpcmNvbV9jbG9zZSIpOworCWNhcmQgPSBuZXRkZXZfcHJpdihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogd2UgZG9uJ3Qgd2FudCBuZXcgcGFja2V0cyAqLworCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQorCWRpc2FibGVfYWxsX2ludGVycnVwdHMoY2FyZCk7CisjaWYgMAkKKwkvKiBXZSBjYW4gZW5hYmxlIHRoaXMgYWdhaW4gb25jZSB3ZSBzZW5kIGR1bW15IHBhY2tldHMgb24gaWZjb25maWcgZXRoWCB1cCAqLworCWRlYWN0aXZhdGVfcmVjZWl2ZXIoY2FyZCk7CisJZGVhY3RpdmF0ZV90cmFuc21pdHRlcihjYXJkKTsKKyNlbmRpZgkKKwlyZW1vdmVfZGVzY3JpcHRvcnMoY2FyZCk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7CisJCisJY2FyZC0+b3BlbiA9IDA7CisJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwkKKwlsZWF2ZSgieGlyY29tX2Nsb3NlIik7CisJCisJcmV0dXJuIDA7CisJCit9CisKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgcmV0dXJuICZjYXJkLT5zdGF0czsKK30gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgeGlyY29tX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwl4aXJjb21faW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jYXJkKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW50ZXIoImluaXRpYWxpemVfY2FyZCIpOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJLyogRmlyc3Q6IHJlc2V0IHRoZSBjYXJkICovCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1IwKTsKKwl2YWwgfD0gMHgwMTsJCS8qIFNvZnR3YXJlIHJlc2V0ICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IwKTsKKworCXVkZWxheSgxMDApOwkJLyogZ2l2ZSB0aGUgY2FyZCBzb21lIHRpbWUgdG8gcmVzZXQgKi8KKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisJdmFsICY9IH4weDAxOwkJLyogZGlzYWJsZSBTb2Z0d2FyZSByZXNldCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisKKworCXZhbCA9IDA7CQkvKiBWYWx1ZSAweDAwIGlzIGEgc2FmZSBhbmQgY29uc2VydmF0aXZlIHZhbHVlIAorCQkJCSAgIGZvciB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjApOworCisKKwlkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKGNhcmQpOworCWRlYWN0aXZhdGVfcmVjZWl2ZXIoY2FyZCk7CisJZGVhY3RpdmF0ZV90cmFuc21pdHRlcihjYXJkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWxlYXZlKCJpbml0aWFsaXplX2NhcmQiKTsKK30KKworLyoKK3RyaWdnZXJfdHJhbnNtaXQgY2F1c2VzIHRoZSBjYXJkIHRvIGNoZWNrIGZvciBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQuCitUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB3cml0aW5nIHRvIHRoZSBDU1IxIHBvcnQuIFRoZSBkb2N1bWVudGF0aW9uCitjbGFpbXMgdGhhdCB0aGUgYWN0IG9mIHdyaXRpbmcgaXMgc3VmZmljaWVudCBhbmQgdGhhdCB0aGUgdmFsdWUgaXMKK2lnbm9yZWQ7IEkgY2hvc2UgemVyby4KKyovCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3RyYW5zbWl0KHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJ0cmlnZ2VyX3RyYW5zbWl0Iik7CisKKwl2YWwgPSAwOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMSk7CisKKwlsZWF2ZSgidHJpZ2dlcl90cmFuc21pdCIpOworfQorCisvKgordHJpZ2dlcl9yZWNlaXZlIGNhdXNlcyB0aGUgY2FyZCB0byBjaGVjayBmb3IgZW1wdHkgZnJhbWVzIGluIHRoZQorZGVzY3JpcHRvciBsaXN0IGluIHdoaWNoIHBhY2tldHMgY2FuIGJlIHJlY2VpdmVkLgorVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd3JpdGluZyB0byB0aGUgQ1NSMiBwb3J0LiBUaGUgZG9jdW1lbnRhdGlvbgorY2xhaW1zIHRoYXQgdGhlIGFjdCBvZiB3cml0aW5nIGlzIHN1ZmZpY2llbnQgYW5kIHRoYXQgdGhlIHZhbHVlIGlzCitpZ25vcmVkOyBJIGNob3NlIHplcm8uCisqLworc3RhdGljIHZvaWQgdHJpZ2dlcl9yZWNlaXZlKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJ0cmlnZ2VyX3JlY2VpdmUiKTsKKworCXZhbCA9IDA7CisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IyKTsKKworCWxlYXZlKCJ0cmlnZ2VyX3JlY2VpdmUiKTsKK30KKworLyoKK3NldHVwX2Rlc2NyaXB0b3JzIGluaXRpYWxpemVzIHRoZSBzZW5kIGFuZCByZWNlaXZlIGJ1ZmZlcnMgdG8gYmUgdmFsaWQKK2Rlc2NyaXB0b3JzIGFuZCBwcm9ncmFtcyB0aGUgYWRkcmVzc2VzIGludG8gdGhlIGNhcmQuCisqLworc3RhdGljIHZvaWQgc2V0dXBfZGVzY3JpcHRvcnMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJaW50IGk7CisJZW50ZXIoInNldHVwX2Rlc2NyaXB0b3JzIik7CisKKworCWlmIChjYXJkLT5yeF9idWZmZXIgPT0gTlVMTCkKKwkJQlVHKCk7CisJaWYgKGNhcmQtPnR4X2J1ZmZlciA9PSBOVUxMKQorCQlCVUcoKTsKKworCS8qIFJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKwltZW1zZXQoY2FyZC0+cnhfYnVmZmVyLCAwLCAxMjgpOwkvKiBjbGVhciB0aGUgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGk9MDtpPE5VTURFU0NSSVBUT1JTO2krKyApIHsKKworCQkvKiBSeCBEZXNjcjA6IEl0J3MgZW1wdHksIGxldCB0aGUgY2FyZCBvd24gaXQsIG5vIGVycm9ycyAtPiAweDgwMDAwMDAwICovCisJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAwXSA9IDB4ODAwMDAwMDA7CisJCS8qIFJ4IERlc2NyMTogYnVmZmVyIDEgaXMgMTUzNiBieXRlcywgYnVmZmVyIDIgaXMgMCBieXRlcyAqLworCQljYXJkLT5yeF9idWZmZXJbaSo0ICsgMV0gPSAxNTM2OworCQlpZiAoaT09TlVNREVTQ1JJUFRPUlMtMSkKKwkJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAxXSB8PSAoMSA8PCAyNSk7IC8qIGJpdCAyNSBpcyAibGFzdCBkZXNjcmlwdG9yIiAqLworCisJCS8qIFJ4IERlc2NyMjogYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisJCSAgIHdlIHN0b3JlIHRoZSBidWZmZXIgYXQgdGhlIDJuZCBoYWxmIG9mIHRoZSBwYWdlICovCisJCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgY2FyZC0+cnhfZG1hX2hhbmRsZTsKKwkJY2FyZC0+cnhfYnVmZmVyW2kqNCArIDJdID0gY3B1X3RvX2xlMzIoYWRkcmVzcyArIGJ1ZmZlcm9mZnNldHNbaV0pOworCQkvKiBSeCBEZXNjMzogYWRkcmVzcyBvZiAybmQgYnVmZmVyIC0+IDAgKi8KKwkJY2FyZC0+cnhfYnVmZmVyW2kqNCArIDNdID0gMDsKKwl9CisJCisJd21iKCk7CisJLyogV3JpdGUgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGFkZHJlc3MgdG8gdGhlIGNhcmQgKi8KKwlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQtPnJ4X2RtYV9oYW5kbGU7CisJdmFsID0gY3B1X3RvX2xlMzIoYWRkcmVzcyk7IAorCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMyk7CS8qIFJlY2VpdmUgZGVzY3IgbGlzdCBhZGRyZXNzICovCisKKworCS8qIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJbWVtc2V0KGNhcmQtPnR4X2J1ZmZlciwgMCwgMTI4KTsJLyogY2xlYXIgdGhlIGRlc2NyaXB0b3JzICovCisJCisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKysgKSB7CisJCS8qIFR4IERlc2NyMDogRW1wdHksIHdlIG93biBpdCwgbm8gZXJyb3JzIC0+IDB4MDAwMDAwMDAgKi8KKwkJY2FyZC0+dHhfYnVmZmVyW2kqNCArIDBdID0gMHgwMDAwMDAwMDsKKwkJLyogVHggRGVzY3IxOiBidWZmZXIgMSBpcyAxNTM2IGJ5dGVzLCBidWZmZXIgMiBpcyAwIGJ5dGVzICovCisJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAxXSA9IDE1MzY7CisJCWlmIChpPT1OVU1ERVNDUklQVE9SUy0xKQorCQkJY2FyZC0+dHhfYnVmZmVyW2kqNCArIDFdIHw9ICgxIDw8IDI1KTsgLyogYml0IDI1IGlzICJsYXN0IGRlc2NyaXB0b3IiICovCisJCQorCQkvKiBUeCBEZXNjcjI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorCQkgICB3ZSBzdG9yZSB0aGUgYnVmZmVyIGF0IHRoZSAybmQgaGFsZiBvZiB0aGUgcGFnZSAqLworCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQtPnR4X2RtYV9oYW5kbGU7CisJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAyXSA9IGNwdV90b19sZTMyKGFkZHJlc3MgKyBidWZmZXJvZmZzZXRzW2ldKTsKKwkJLyogVHggRGVzYzM6IGFkZHJlc3Mgb2YgMm5kIGJ1ZmZlciAtPiAwICovCisJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAzXSA9IDA7CisJfQorCisJd21iKCk7CisJLyogd2l0ZSB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nIHRvIHRoZSBjYXJkICovCisJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT50eF9kbWFfaGFuZGxlOworCXZhbCA9Y3B1X3RvX2xlMzIoYWRkcmVzcyk7CisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I0KTsJLyogeG1pdCBkZXNjciBsaXN0IGFkZHJlc3MgKi8KKworCWxlYXZlKCJzZXR1cF9kZXNjcmlwdG9ycyIpOworfQorCisvKgorcmVtb3ZlX2Rlc2NyaXB0b3JzIGluZm9ybXMgdGhlIGNhcmQgdGhlIGRlc2NyaXB0b3JzIGFyZSBubyBsb25nZXIKK3ZhbGlkIGJ5IHNldHRpbmcgdGhlIGFkZHJlc3MgaW4gdGhlIGNhcmQgdG8gMHgwMC4KKyovCitzdGF0aWMgdm9pZCByZW1vdmVfZGVzY3JpcHRvcnMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoInJlbW92ZV9kZXNjcmlwdG9ycyIpOworCisJdmFsID0gMDsKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjMpOwkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNCk7CS8qIFNlbmQgZGVzY3JpcHRvciBhZGRyZXNzICovCisKKwlsZWF2ZSgicmVtb3ZlX2Rlc2NyaXB0b3JzIik7Cit9CisKKy8qCitsaW5rX3N0YXR1c19jaGFuZ2VkIHJldHVybnMgMSBpZiB0aGUgY2FyZCBoYXMgaW5kaWNhdGVkIHRoYXQKK3RoZSBsaW5rIHN0YXR1cyBoYXMgY2hhbmdlZC4gVGhlIG5ldyBsaW5rIHN0YXR1cyBoYXMgdG8gYmUgcmVhZCBmcm9tIENTUjEyLgorCitUaGlzIGZ1bmN0aW9uIGFsc28gY2xlYXJzIHRoZSBzdGF0dXMtYml0LgorKi8KK3N0YXRpYyBpbnQgbGlua19zdGF0dXNfY2hhbmdlZChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigibGlua19zdGF0dXNfY2hhbmdlZCIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I1KTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisKKwlpZiAoKHZhbCAmICgxIDw8IDI3KSkgPT0gMCkgewkvKiBubyBjaGFuZ2UgKi8KKwkJbGVhdmUoImxpbmtfc3RhdHVzX2NoYW5nZWQgLSBub2NoYW5nZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjbGVhciB0aGUgZXZlbnQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdCBpbiB0aGUKKwkgICBzdGF0dXMgcmVnaXN0ZXIuICovCisJdmFsID0gKDEgPDwgMjcpOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNSk7CisKKwlsZWF2ZSgibGlua19zdGF0dXNfY2hhbmdlZCAtIGNoYW5nZWQiKTsKKwlyZXR1cm4gMTsKK30KKworCisvKgordHJhbnNtaXRfYWN0aXZlIHJldHVybnMgMSBpZiB0aGUgdHJhbnNtaXR0ZXIgb24gdGhlIGNhcmQgaXMKK2luIGEgbm9uLXN0b3BwZWQgc3RhdGUuCisqLworc3RhdGljIGludCB0cmFuc21pdF9hY3RpdmUoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoInRyYW5zbWl0X2FjdGl2ZSIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I1KTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisKKwlpZiAoKHZhbCAmICg3IDw8IDIwKSkgPT0gMCkgewkvKiB0cmFuc21pdHRlciBkaXNhYmxlZCAqLworCQlsZWF2ZSgidHJhbnNtaXRfYWN0aXZlIC0gaW5hY3RpdmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVhdmUoInRyYW5zbWl0X2FjdGl2ZSAtIGFjdGl2ZSIpOworCXJldHVybiAxOworfQorCisvKgorcmVjZWl2ZV9hY3RpdmUgcmV0dXJucyAxIGlmIHRoZSByZWNlaXZlciBvbiB0aGUgY2FyZCBpcworaW4gYSBub24tc3RvcHBlZCBzdGF0ZS4KKyovCitzdGF0aWMgaW50IHJlY2VpdmVfYWN0aXZlKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJyZWNlaXZlX2FjdGl2ZSIpOworCisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjUpOwkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKworCWlmICgodmFsICYgKDcgPDwgMTcpKSA9PSAwKSB7CS8qIHJlY2VpdmVyIGRpc2FibGVkICovCisJCWxlYXZlKCJyZWNlaXZlX2FjdGl2ZSAtIGluYWN0aXZlIik7CisJCXJldHVybiAwOworCX0KKworCWxlYXZlKCJyZWNlaXZlX2FjdGl2ZSAtIGFjdGl2ZSIpOworCXJldHVybiAxOworfQorCisvKgorYWN0aXZhdGVfcmVjZWl2ZXIgZW5hYmxlcyB0aGUgcmVjZWl2ZXIgb24gdGhlIGNhcmQuCitCZWZvcmUgYmVpbmcgYWxsb3dlZCB0byBhY3RpdmUgdGhlIHJlY2VpdmVyLCB0aGUgcmVjZWl2ZXIKK211c3QgYmUgY29tcGxldGVseSBkZS1hY3RpdmF0ZWQuIFRvIGFjaGlldmUgdGhpcywKK3RoaXMgY29kZSBhY3R1YWxseSBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgZmlyc3Q7IHRoZW4gaXQgd2FpdHMgZm9yIHRoZSAKK3JlY2VpdmVyIHRvIGJlY29tZSBpbmFjdGl2ZSwgdGhlbiBpdCBhY3RpdmF0ZXMgdGhlIHJlY2VpdmVyIGFuZCB0aGVuCitpdCB3YWl0cyBmb3IgdGhlIHJlY2VpdmVyIHRvIGJlIGFjdGl2ZS4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGFjdGl2YXRlX3JlY2VpdmVyKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjb3VudGVyOworCWVudGVyKCJhY3RpdmF0ZV9yZWNlaXZlciIpOworCisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjYpOwkvKiBPcGVyYXRpb24gbW9kZSAqLworCQorCS8qIElmIHRoZSAiYWN0aXZlIiBiaXQgaXMgc2V0IGFuZCB0aGUgcmVjZWl2ZXIgaXMgYWxyZWFkeQorCSAgIGFjdGl2ZSwgbm8gbmVlZCB0byBkbyB0aGUgZXhwZW5zaXZlIHRoaW5nICovCisJaWYgKCh2YWwmMikgJiYgKHJlY2VpdmVfYWN0aXZlKGNhcmQpKSkKKwkJcmV0dXJuOworCQorCQorCXZhbCA9IHZhbCAmIH4yOwkJLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAoIXJlY2VpdmVfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogUmVjZWl2ZXIgZmFpbGVkIHRvIGRlYWN0aXZhdGVcbiIpOworCX0KKworCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjYpOwkvKiBPcGVyYXRpb24gbW9kZSAqLworCXZhbCA9IHZhbCB8IDI7CQkJCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJLyogbm93IHdhaXQgZm9yIHRoZSBjYXJkIHRvIGFjdGl2YXRlIGFnYWluICovCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAocmVjZWl2ZV9hY3RpdmUoY2FyZCkpCisJCQlicmVhazsKKwkJLyogd2FpdCBhIHdoaWxlICovCisJCXVkZWxheSg1MCk7CisJCWNvdW50ZXItLTsKKwkJaWYgKGNvdW50ZXIgPD0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX2NiOiBSZWNlaXZlciBmYWlsZWQgdG8gcmUtYWN0aXZhdGVcbiIpOworCX0KKworCWxlYXZlKCJhY3RpdmF0ZV9yZWNlaXZlciIpOworfQorCisvKgorZGVhY3RpdmF0ZV9yZWNlaXZlciBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgb24gdGhlIGNhcmQuCitUbyBhY2hpZXZlIHRoaXMgdGhpcyBjb2RlIGRpc2FibGVzIHRoZSByZWNlaXZlciBmaXJzdDsgCit0aGVuIGl0IHdhaXRzIGZvciB0aGUgcmVjZWl2ZXIgdG8gYmVjb21lIGluYWN0aXZlLgorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiZGVhY3RpdmF0ZV9yZWNlaXZlciIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgJiB+MjsJCQkJLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAoIXJlY2VpdmVfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogUmVjZWl2ZXIgZmFpbGVkIHRvIGRlYWN0aXZhdGVcbiIpOworCX0KKworCisJbGVhdmUoImRlYWN0aXZhdGVfcmVjZWl2ZXIiKTsKK30KKworCisvKgorYWN0aXZhdGVfdHJhbnNtaXR0ZXIgZW5hYmxlcyB0aGUgdHJhbnNtaXR0ZXIgb24gdGhlIGNhcmQuCitCZWZvcmUgYmVpbmcgYWxsb3dlZCB0byBhY3RpdmUgdGhlIHRyYW5zbWl0dGVyLCB0aGUgdHJhbnNtaXR0ZXIKK211c3QgYmUgY29tcGxldGVseSBkZS1hY3RpdmF0ZWQuIFRvIGFjaGlldmUgdGhpcywKK3RoaXMgY29kZSBhY3R1YWxseSBkaXNhYmxlcyB0aGUgdHJhbnNtaXR0ZXIgZmlyc3Q7IHRoZW4gaXQgd2FpdHMgZm9yIHRoZSAKK3RyYW5zbWl0dGVyIHRvIGJlY29tZSBpbmFjdGl2ZSwgdGhlbiBpdCBhY3RpdmF0ZXMgdGhlIHRyYW5zbWl0dGVyIGFuZCB0aGVuCitpdCB3YWl0cyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIGJlIGFjdGl2ZSBhZ2Fpbi4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGFjdGl2YXRlX3RyYW5zbWl0dGVyKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjb3VudGVyOworCWVudGVyKCJhY3RpdmF0ZV90cmFuc21pdHRlciIpOworCisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjYpOwkvKiBPcGVyYXRpb24gbW9kZSAqLworCisJLyogSWYgdGhlICJhY3RpdmUiIGJpdCBpcyBzZXQgYW5kIHRoZSByZWNlaXZlciBpcyBhbHJlYWR5CisJICAgYWN0aXZlLCBubyBuZWVkIHRvIGRvIHRoZSBleHBlbnNpdmUgdGhpbmcgKi8JIAorCWlmICgodmFsJigxPDwxMykpICYmICh0cmFuc21pdF9hY3RpdmUoY2FyZCkpKQorCQlyZXR1cm47CisKKwl2YWwgPSB2YWwgJiB+KDEgPDwgMTMpOwkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNik7CisKKwljb3VudGVyID0gMTA7CisJd2hpbGUgKGNvdW50ZXIgPiAwKSB7CisJCWlmICghdHJhbnNtaXRfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogVHJhbnNtaXR0ZXIgZmFpbGVkIHRvIGRlYWN0aXZhdGVcbiIpOworCX0KKworCS8qIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjYpOwkvKiBPcGVyYXRpb24gbW9kZSAqLworCXZhbCA9IHZhbCB8ICgxIDw8IDEzKTsJLyogZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNik7CisKKwkvKiBub3cgd2FpdCBmb3IgdGhlIGNhcmQgdG8gYWN0aXZhdGUgYWdhaW4gKi8KKwljb3VudGVyID0gMTA7CisJd2hpbGUgKGNvdW50ZXIgPiAwKSB7CisJCWlmICh0cmFuc21pdF9hY3RpdmUoY2FyZCkpCisJCQlicmVhazsKKwkJLyogd2FpdCBhIHdoaWxlICovCisJCXVkZWxheSg1MCk7CisJCWNvdW50ZXItLTsKKwkJaWYgKGNvdW50ZXIgPD0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX2NiOiBUcmFuc21pdHRlciBmYWlsZWQgdG8gcmUtYWN0aXZhdGVcbiIpOworCX0KKworCWxlYXZlKCJhY3RpdmF0ZV90cmFuc21pdHRlciIpOworfQorCisvKgorZGVhY3RpdmF0ZV90cmFuc21pdHRlciBkaXNhYmxlcyB0aGUgdHJhbnNtaXR0ZXIgb24gdGhlIGNhcmQuCitUbyBhY2hpZXZlIHRoaXMgdGhpcyBjb2RlIGRpc2FibGVzIHRoZSB0cmFuc21pdHRlciBmaXJzdDsgCit0aGVuIGl0IHdhaXRzIGZvciB0aGUgdHJhbnNtaXR0ZXIgdG8gYmVjb21lIGluYWN0aXZlLgorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV90cmFuc21pdHRlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiZGVhY3RpdmF0ZV90cmFuc21pdHRlciIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgJiB+MjsJCS8qIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCWNvdW50ZXIgPSAyMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKCF0cmFuc21pdF9hY3RpdmUoY2FyZCkpCisJCQlicmVhazsKKwkJLyogd2FpdCBhIHdoaWxlICovCisJCXVkZWxheSg1MCk7CisJCWNvdW50ZXItLTsKKwkJaWYgKGNvdW50ZXIgPD0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX2NiOiBUcmFuc21pdHRlciBmYWlsZWQgdG8gZGVhY3RpdmF0ZVxuIik7CisJfQorCisKKwlsZWF2ZSgiZGVhY3RpdmF0ZV90cmFuc21pdHRlciIpOworfQorCisKKy8qCitlbmFibGVfdHJhbnNtaXRfaW50ZXJydXB0IGVuYWJsZXMgdGhlIHRyYW5zbWl0IGludGVycnVwdAorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIHZvaWQgZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdCIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXZhbCB8PSAxOwkJCQkvKiBlbmFibGUgdGhlIHRyYW5zbWl0IGludGVycnVwdCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CisKKwlsZWF2ZSgiZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdCIpOworfQorCisKKy8qCitlbmFibGVfcmVjZWl2ZV9pbnRlcnJ1cHQgZW5hYmxlcyB0aGUgcmVjZWl2ZSBpbnRlcnJ1cHQKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9yZWNlaXZlX2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0Iik7CisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjcpOwkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdmFsID0gdmFsIHwgKDEgPDwgNik7CQkJLyogZW5hYmxlIHRoZSByZWNlaXZlIGludGVycnVwdCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CisKKwlsZWF2ZSgiZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0Iik7Cit9CisKKy8qCitlbmFibGVfbGlua19pbnRlcnJ1cHQgZW5hYmxlcyB0aGUgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnVwdAorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIHZvaWQgZW5hYmxlX2xpbmtfaW50ZXJydXB0KHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJlbmFibGVfbGlua19pbnRlcnJ1cHQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl2YWwgPSB2YWwgfCAoMSA8PCAyNyk7CQkJLyogZW5hYmxlIHRoZSBsaW5rIHN0YXR1cyBjaGFnZSBpbnRlcnJ1cHQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV9saW5rX2ludGVycnVwdCIpOworfQorCisKKworLyoKK2Rpc2FibGVfYWxsX2ludGVycnVwdHMgZGlzYWJsZXMgYWxsIGludGVycnVwdHMKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2ludGVycnVwdHMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImVuYWJsZV9hbGxfaW50ZXJydXB0cyIpOworCQorCXZhbCA9IDA7CQkJCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImRpc2FibGVfYWxsX2ludGVycnVwdHMiKTsKK30KKworLyoKK2VuYWJsZV9jb21tb25faW50ZXJydXB0cyBlbmFibGVzIHNldmVyYWwgd2VpcmQgaW50ZXJydXB0cworCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIHZvaWQgZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJlbmFibGVfbGlua19pbnRlcnJ1cHQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl2YWwgfD0gKDE8PDE2KTsgLyogTm9ybWFsIEludGVycnVwdCBTdW1tYXJ5ICovCisJdmFsIHw9ICgxPDwxNSk7IC8qIEFibm9ybWFsIEludGVycnVwdCBTdW1tYXJ5ICovCisJdmFsIHw9ICgxPDwxMyk7IC8qIEZhdGFsIGJ1cyBlcnJvciAqLworCXZhbCB8PSAoMTw8OCk7ICAvKiBSZWNlaXZlIFByb2Nlc3MgU3RvcHBlZCAqLworCXZhbCB8PSAoMTw8Nyk7ICAvKiBSZWNlaXZlIEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworCXZhbCB8PSAoMTw8NSk7ICAvKiBUcmFuc21pdCBVbmRlcmZsb3cgKi8KKwl2YWwgfD0gKDE8PDIpOyAgLyogVHJhbnNtaXQgQnVmZmVyIFVuYXZhaWxhYmxlICovCisJdmFsIHw9ICgxPDwxKTsgIC8qIFRyYW5zbWl0IFByb2Nlc3MgU3RvcHBlZCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CisKKwlsZWF2ZSgiZW5hYmxlX2xpbmtfaW50ZXJydXB0Iik7Cit9CisKKy8qCitlbmFibGVfcHJvbWlzYyBzdGFydHMgcHJvbWlzYyBtb2RlCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgaW50IGVuYWJsZV9wcm9taXNjKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJlbmFibGVfcHJvbWlzYyIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJCisJdmFsID0gdmFsIHwgKDEgPDwgNik7CQorCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNik7CisKKwlsZWF2ZSgiZW5hYmxlX3Byb21pc2MiKTsKKwlyZXR1cm4gMTsKK30KKworCisKKworLyogCitsaW5rX3N0YXR1cygpIGNoZWNrcyB0aGUgdGhlIGxpbmtzIHN0YXR1cyBhbmQgd2lsbCByZXR1cm4gMCBmb3Igbm8gbGluaywgMTAgZm9yIDEwbWJpdCBsaW5rIGFuZCAxMDAgZm9yLi4gZ3Vlc3Mgd2hhdC4KKworTXVzdCBiZSBjYWxsZWQgaW4gbG9ja2VkIHN0YXRlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorKi8KK3N0YXRpYyBpbnQgbGlua19zdGF0dXMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImxpbmtfc3RhdHVzIik7CisJCisJdmFsID0gaW5iKGNhcmQtPmlvX3BvcnQgKyBDU1IxMik7CisJCisJaWYgKCEodmFsJigxPDwyKSkpICAvKiBiaXQgMiBpcyAwIGZvciAxMG1iaXQgbGluaywgMSBmb3Igbm90IGFuIDEwbWJpdCBsaW5rICovCisJCXJldHVybiAxMDsKKwlpZiAoISh2YWwmKDE8PDEpKSkgIC8qIGJpdCAxIGlzIDAgZm9yIDEwMG1iaXQgbGluaywgMSBmb3Igbm90IGFuIDEwMG1iaXQgbGluayAqLworCQlyZXR1cm4gMTAwOworCQkKKwkvKiBJZiB3ZSBnZXQgaGVyZSAtPiBubyBsaW5rIGF0IGFsbCAqLwkKKworCWxlYXZlKCJsaW5rX3N0YXR1cyIpOworCXJldHVybiAwOworfQorCisKKworCisKKy8qCisgIHJlYWRfbWFjX2FkZHJlc3MoKSByZWFkcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSB0aGUgTklDIGFuZCBzdG9yZXMgaXQgaW4gdGhlICJkZXYiIHN0cnVjdHVyZS4KKyAKKyAgVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIHNwaW5sb2NrIGl0c2VsZiBhbmQgY2FuLCBhcyBhIHJlc3VsdCwgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbHQuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfbWFjX2FkZHJlc3Moc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGNoYXIgaiwgdHVwbGUsIGxpbmssIGRhdGFfaWQsIGRhdGFfY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWVudGVyKCJyZWFkX21hY19hZGRyZXNzIik7CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlvdXRsKDEgPDwgMTIsIGNhcmQtPmlvX3BvcnQgKyBDU1I5KTsJLyogZW5hYmxlIGJvb3Qgcm9tIGFjY2VzcyAqLworCWZvciAoaSA9IDB4MTAwOyBpIDwgMHgxZjc7IGkgKz0gbGluayArIDIpIHsKKwkJb3V0bChpLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTApOworCQl0dXBsZSA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAxLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTApOworCQlsaW5rID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I5KSAmIDB4ZmY7CisJCW91dGwoaSArIDIsIGNhcmQtPmlvX3BvcnQgKyBDU1IxMCk7CisJCWRhdGFfaWQgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMywgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJZGF0YV9jb3VudCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQlpZiAoKHR1cGxlID09IDB4MjIpICYmIChkYXRhX2lkID09IDB4MDQpICYmIChkYXRhX2NvdW50ID09IDB4MDYpKSB7CisJCQkvKiAKKwkJCSAqIFRoaXMgaXMgaXQuICBXZSBoYXZlIHRoZSBkYXRhIHdlIHdhbnQuCisJCQkgKi8KKwkJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKwkJCQlvdXRsKGkgKyBqICsgNCwgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJCQljYXJkLT5kZXYtPmRldl9hZGRyW2pdID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I5KSAmIDB4ZmY7CisJCQl9CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChsaW5rID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJWMlMi4yWCIsIGkgPyAnOicgOiAnICcsIGNhcmQtPmRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCWxlYXZlKCJyZWFkX21hY19hZGRyZXNzIik7Cit9CisKKworLyoKKyB0cmFuc2NlaXZlcl92b29kb28oKSBlbmFibGVzIHRoZSBleHRlcm5hbCBVVFAgcGx1ZyB0aGluZ3kuCisgaXQncyBjYWxsZWQgdm9vZG9vIGFzIEkgc3RvbGUgdGhpcyBjb2RlIGFuZCBjYW5ub3QgY3Jvc3MtcmVmZXJlbmNlCisgaXQgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdHJhbnNjZWl2ZXJfdm9vZG9vKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZW50ZXIoInRyYW5zY2VpdmVyX3Zvb2RvbyIpOworCisJLyogZGlzYWJsZSBhbGwgcG93ZXJtYW5hZ2VtZW50ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjYXJkLT5wZGV2LCBQQ0lfUE9XRVJNR01ULCAweDAwMDApOworCisJc2V0dXBfZGVzY3JpcHRvcnMoY2FyZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJb3V0bCgweDAwMDgsIGNhcmQtPmlvX3BvcnQgKyBDU1IxNSk7CisgICAgICAgIHVkZWxheSgyNSk7ICAKKyAgICAgICAgb3V0bCgweGE4MDUwMDAwLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTUpOworICAgICAgICB1ZGVsYXkoMjUpOworICAgICAgICBvdXRsKDB4YTAwZjAwMDAsIGNhcmQtPmlvX3BvcnQgKyBDU1IxNSk7CisgICAgICAgIHVkZWxheSgyNSk7CisgICAgICAgIAorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShjYXJkLT5kZXYpOworCWxlYXZlKCJ0cmFuc2NlaXZlcl92b29kb28iKTsKK30KKworCitzdGF0aWMgdm9pZCB4aXJjb21fdXAoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwllbnRlcigieGlyY29tX3VwIik7CisKKwkvKiBkaXNhYmxlIGFsbCBwb3dlcm1hbmFnZW1lbnQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNhcmQtPnBkZXYsIFBDSV9QT1dFUk1HTVQsIDB4MDAwMCk7CisKKwlzZXR1cF9kZXNjcmlwdG9ycyhjYXJkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkKKwllbmFibGVfbGlua19pbnRlcnJ1cHQoY2FyZCk7CisJZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdChjYXJkKTsKKwllbmFibGVfcmVjZWl2ZV9pbnRlcnJ1cHQoY2FyZCk7CisJZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKGNhcmQpOworCWVuYWJsZV9wcm9taXNjKGNhcmQpOworCQorCS8qIFRoZSBjYXJkIGNhbiBoYXZlIHJlY2VpdmVkIHBhY2tldHMgYWxyZWFkeSwgcmVhZCB0aGVtIGF3YXkgbm93ICovCisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKyspIAorCQlpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3IoY2FyZC0+ZGV2LGNhcmQsaSxidWZmZXJvZmZzZXRzW2ldKTsKKworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXRyaWdnZXJfcmVjZWl2ZShjYXJkKTsKKwl0cmlnZ2VyX3RyYW5zbWl0KGNhcmQpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGNhcmQtPmRldik7CisJbGVhdmUoInhpcmNvbV91cCIpOworfQorCisvKiBCdWZmZXJvZmZzZXQgaXMgaW4gQllURVMgKi8KK3N0YXRpYyB2b2lkIGludmVzdGlnYXRlX3JlYWRfZGVzY3JpcHRvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCwgaW50IGRlc2NuciwgdW5zaWduZWQgaW50IGJ1ZmZlcm9mZnNldCkKK3sKKwkJaW50IHN0YXR1czsJCQorCQkKKwkJZW50ZXIoImludmVzdGlnYXRlX3JlYWRfZGVzY3JpcHRvciIpOworCQlzdGF0dXMgPSBjYXJkLT5yeF9idWZmZXJbNCpkZXNjbnJdOworCQkKKwkJaWYgKChzdGF0dXMgPiAwKSkgewkvKiBwYWNrZXQgcmVjZWl2ZWQgKi8KKwkJCisJCQkvKiBUT0RPOiBkaXNjYXJkIGVycm9yIHBhY2tldHMgKi8KKwkJCQorCQkJc2hvcnQgcGt0X2xlbiA9ICgoc3RhdHVzID4+IDE2KSAmIDB4N2ZmKSAtIDQ7CS8qIG1pbnVzIDQsIHdlIGRvbid0IHdhbnQgdGhlIENSQyAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHBrdF9sZW4gPiAxNTE4KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFBhY2tldCBsZW5ndGggJWkgaXMgYm9ndXMgXG4iLHBrdF9sZW4pOworCQkJCXBrdF9sZW4gPSAxNTE4OworCQkJfQorCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCAodW5zaWduZWQgY2hhciopJmNhcmQtPnJ4X2J1ZmZlcltidWZmZXJvZmZzZXQgLyA0XSwgcGt0X2xlbiwgMCk7CisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQljYXJkLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQljYXJkLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCisJCSAgICAgIG91dDoKKwkJCS8qIGdpdmUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBjYXJkICovCisJCQljYXJkLT5yeF9idWZmZXJbNCpkZXNjbnJdID0gIDB4ODAwMDAwMDA7CisJCQl0cmlnZ2VyX3JlY2VpdmUoY2FyZCk7CisJCX0KKworCQlsZWF2ZSgiaW52ZXN0aWdhdGVfcmVhZF9kZXNjcmlwdG9yIik7CisKK30KKworCisvKiBCdWZmZXJvZmZzZXQgaXMgaW4gQllURVMgKi8KK3N0YXRpYyB2b2lkIGludmVzdGlnYXRlX3dyaXRlX2Rlc2NyaXB0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkLCBpbnQgZGVzY25yLCB1bnNpZ25lZCBpbnQgYnVmZmVyb2Zmc2V0KQoreworCQlpbnQgc3RhdHVzOworCisJCWVudGVyKCJpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yIik7CisJCQorCQlzdGF0dXMgPSBjYXJkLT50eF9idWZmZXJbNCpkZXNjbnJdOworI2lmIDAJCQorCQlpZiAoc3RhdHVzICYgMHg4MDAwKSB7CS8qIE1ham9yIGVycm9yICovCisJCQlwcmludGsoS0VSTl9FUlIgIk1ham9yIHRyYW5zbWl0IGVycm9yIHN0YXR1cyAleCBcbiIsIHN0YXR1cyk7CisJCQljYXJkLT50eF9idWZmZXJbNCpkZXNjbnJdID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKyNlbmRpZgorCQlpZiAoc3RhdHVzID4gMCkgewkvKiBiaXQgMzEgaXMgMCB3aGVuIGRvbmUgKi8KKwkJCWlmIChjYXJkLT50eF9za2JbZGVzY25yXSE9TlVMTCkgeworCQkJCWNhcmQtPnN0YXRzLnR4X2J5dGVzICs9IGNhcmQtPnR4X3NrYltkZXNjbnJdLT5sZW47CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoY2FyZC0+dHhfc2tiW2Rlc2Nucl0pOworCQkJfQorCQkJY2FyZC0+dHhfc2tiW2Rlc2Nucl0gPSBOVUxMOworCQkJLyogQml0IDggaW4gdGhlIHN0YXR1cyBmaWVsZCBpcyAxIGlmIHRoZXJlIHdhcyBhIGNvbGxpc2lvbiAqLworCQkJaWYgKHN0YXR1cyYoMTw8OCkpCisJCQkJY2FyZC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXSA9IDA7IC8qIGRlc2NyaXB0b3IgaXMgZnJlZSBhZ2FpbiAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCWNhcmQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisJCWxlYXZlKCJpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yIik7CisJCQorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHhpcmNvbV9pbml0KHZvaWQpCit7CisJcGNpX3JlZ2lzdGVyX2RyaXZlcigmeGlyY29tX29wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4aXJjb21fZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmeGlyY29tX29wcyk7Cit9IAorCittb2R1bGVfaW5pdCh4aXJjb21faW5pdCkgCittb2R1bGVfZXhpdCh4aXJjb21fZXhpdCkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNjYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKQEAgLTAsMCArMSwxNzQ4IEBACisvKiB4aXJjb21fdHVsaXBfY2IuYzogQSBYaXJjb20gQ0JFLTEwMCBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTE5OTkgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUxpbnV4IGtlcm5lbC1zcGVjaWZpYyBjaGFuZ2VzOgorCisJTEsxLjAgKElvbiBCYWR1bGVzY3UpCisJLSBNYWpvciBjbGVhbnVwCisJLSBVc2UgMi40IFBDSSBBUEkKKwktIFN1cHBvcnQgZXRodG9vbAorCS0gUmV3cml0ZSBwZXJmZWN0IGZpbHRlci9oYXNoIGNvZGUKKwktIFVzZSBpbnRlcnJ1cHRzIGZvciBtZWRpYSBjaGFuZ2VzCisKKwlMSzEuMSAoSW9uIEJhZHVsZXNjdSkKKwktIERpc2FsbG93IG5lZ290aWF0aW9uIG9mIHVuc3VwcG9ydGVkIGZ1bGwtZHVwbGV4IG1vZGVzCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJ4aXJjb21fdHVsaXBfY2IiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjkxK0xLMS4xIgorI2RlZmluZSBEUlZfUkVMREFURQkiT2N0b2JlciAxMSwgMjAwMSIKKworI2RlZmluZSBDQVJEQlVTIDEKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworCisjZGVmaW5lIHhpcmNvbV9kZWJ1ZyBkZWJ1ZworI2lmZGVmIFhJUkNPTV9ERUJVRworc3RhdGljIGludCB4aXJjb21fZGVidWcgPSBYSVJDT01fREVCVUc7CisjZWxzZQorc3RhdGljIGludCB4aXJjb21fZGVidWcgPSAxOworI2VuZGlmCisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDI1OworCisjZGVmaW5lIE1BWF9VTklUUyA0CisvKiBVc2VkIHRvIHBhc3MgdGhlIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworc3RhdGljIGludCBtdHVbTUFYX1VOSVRTXTsJCQkvKiBKdW1ibyBNVFUgZm9yIGludGVyZmFjZXMuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGVmZmljaWVuY3kuCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFJYX1JJTkdfU0laRQkzMgorCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCisjaWZkZWYgX19hbHBoYV9fCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDE1MTg7CisjZWxzZQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxMDA7CisjZW5kaWYKKworLyoKKyAgU2V0IHRoZSBidXMgcGVyZm9ybWFuY2UgcmVnaXN0ZXIuCisJVHlwaWNhbDogU2V0IDE2IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgbm8gYnVyc3QgbGltaXQuCisJQ2FjaGUgYWxpZ25tZW50IGJpdHMgMTU6MTQJICAgICBCdXJzdCBsZW5ndGggMTM6OAorCQkwMDAwCU5vIGFsaWdubWVudCAgMHgwMDAwMDAwMCB1bmxpbWl0ZWQJCTA4MDAgOCBsb25nd29yZHMKKwkJNDAwMAk4ICBsb25nd29yZHMJCTAxMDAgMSBsb25nd29yZAkJMTAwMCAxNiBsb25nd29yZHMKKwkJODAwMAkxNiBsb25nd29yZHMJCTAyMDAgMiBsb25nd29yZHMJMjAwMCAzMiBsb25nd29yZHMKKwkJQzAwMAkzMiAgbG9uZ3dvcmRzCQkwNDAwIDQgbG9uZ3dvcmRzCisJV2FybmluZzogbWFueSBvbGRlciA0ODYgc3lzdGVtcyBhcmUgYnJva2VuIGFuZCByZXF1aXJlIHNldHRpbmcgMHgwMEEwNDgwMAorCSAgIDggbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCA4IGxvbmd3b3JkIGJ1cnN0LgorCVRvRG86IE5vbi1JbnRlbCBzZXR0aW5nIGNvdWxkIGJlIGJldHRlci4KKyovCisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4RTAwMDsKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQjAwMDAwIHwgMHg4MDAwOworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQjAwMDgwIHwgMHg4MDAwOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDgwMDA7CisjZWxzZQorI3dhcm5pbmcgUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB1bmRlZmluZWQhCitzdGF0aWMgaW50IGNzcjAgPSAweDAwQTAwMDAwIHwgMHg0ODAwOworI2VuZGlmCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKDQgKiBIWikKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkJCS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisjZGVmaW5lIFBLVF9TRVRVUF9TWgkJMTkyCQkJLyogU2l6ZSBvZiB0aGUgc2V0dXAgZnJhbWUgKi8KKworLyogUENJIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfUE9XRVJNR01UIAkweDQwCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorS0VSTl9JTkZPIERSVl9OQU1FICIuYyBkZXJpdmVkIGZyb20gdHVsaXAuYzp2MC45MSA0LzE0Lzk5IGJlY2tlckBzY3lsZC5jb21cbiIKK0tFUk5fSU5GTyAiIHVub2ZmaWNpYWwgMi40Lngga2VybmVsIHBvcnQsIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICJcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpcmNvbSBDQkUtMTAwIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjc3IwLCBpbnQsIDApOworCittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciB3YXMgZm9ya2VkIGZyb20gdGhlIGRyaXZlciBmb3IgdGhlIERFQ2NoaXAgIlR1bGlwIiwKK0RpZ2l0YWwncyBzaW5nbGUtY2hpcCBldGhlcm5ldCBjb250cm9sbGVycyBmb3IgUENJLiAgSXQgc3VwcG9ydHMgWGlyY29tJ3MKK2FsbW9zdC1UdWxpcC1jb21wYXRpYmxlIENCRS0xMDAgQ2FyZEJ1cyBhZGFwdGVycy4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHByZWZlcmFibHkgc2hvdWxkIGFzc2lnbiB0aGUKK1BDSSBJTlRBIHNpZ25hbCB0byBhbiBvdGhlcndpc2UgdW51c2VkIHN5c3RlbSBJUlEgbGluZS4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGUgWGlyY29tIGNhbiB1c2UgZWl0aGVyIHJpbmcgYnVmZmVycyBvciBsaXN0cyBvZiBUeCBhbmQgUnggZGVzY3JpcHRvcnMuCitUaGlzIGRyaXZlciB1c2VzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHJpbmdzIG9mIFJ4IGFuZCBUeCBkZXNjcmlwdG9ycywgc2V0IGF0Citjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgYWxsb2NhdGVzIHNrYnVmZnMKK2ZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0IG9wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUKK1hpcmNvbSBhcyByZWNlaXZlIGRhdGEgYnVmZmVycy4gIFdoZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuCitSWF9DT1BZQlJFQUsgYnl0ZXMgbG9uZywgYSBmcmVzaCBza2J1ZmYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMKK2NvcGllZCB0byB0aGUgbmV3IHNrYnVmZi4gIFdoZW4gdGhlIGluY29taW5nIGZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcworcGFzc2VkIGRpcmVjdGx5IHVwIHRoZSBwcm90b2NvbCBzdGFjayBhbmQgcmVwbGFjZWQgYnkgYSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZi4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgRm9yIHNtYWxsIGZyYW1lcyB0aGUgY29weWluZyBjb3N0IGlzIG5lZ2xpZ2libGUgKGVzcC4gY29uc2lkZXJpbmcKK3RoYXQgd2UgYXJlIHByZS1sb2FkaW5nIHRoZSBjYWNoZSB3aXRoIGltbWVkaWF0ZWx5IHVzZWZ1bCBoZWFkZXIKK2luZm9ybWF0aW9uKS4gIEZvciBsYXJnZSBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBub24tdHJpdmlhbCwgYW5kIHRoZQorbGFyZ2VyIGNvcHkgbWlnaHQgZmx1c2ggdGhlIGNhY2hlIG9mIHVzZWZ1bCBkYXRhLiAgQSBzdWJ0bGUgYXNwZWN0IG9mIHRoaXMKK2Nob2ljZSBpcyB0aGF0IHRoZSBYaXJjb20gb25seSByZWNlaXZlcyBpbnRvIGxvbmd3b3JkIGFsaWduZWQgYnVmZmVycywgdGh1cwordGhlIElQIGhlYWRlciBhdCBvZmZzZXQgMTQgaXNuJ3QgbG9uZ3dvcmQgYWxpZ25lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorQ29waWVkIGZyYW1lcyBhcmUgcHV0IGludG8gdGhlIG5ldyBza2J1ZmYgYXQgYW4gb2Zmc2V0IG9mICIrMiIsIHRodXMgY29weWluZworaGFzIHRoZSBiZW5lZmljaWFsIGVmZmVjdCBvZiBhbGlnbmluZyB0aGUgSVAgaGVhZGVyIGFuZCBwcmVsb2FkaW5nIHRoZQorY2FjaGUuCisKK0lJSUMuIFN5bmNocm9uaXphdGlvbgorVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBvdGhlciBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAndHAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIChUaGUgVHgtZG9uZSBpbnRlcnJ1cHQgY2FuJ3QgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9mZiwgc28KK3dlIGNhbid0IGF2b2lkIHRoZSBpbnRlcnJ1cHQgb3ZlcmhlYWQgYnkgaGF2aW5nIHRoZSBUeCByb3V0aW5lIHJlYXAgdGhlIFR4CitzdGF0cy4pCSBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIHF1ZXVlIGVudHJ5IGFzIGVtcHR5IGJ5IHNldHRpbmcKK3RoZSAnYmFzZScgdG8gemVyby4JIElmZiB0aGUgJ3RwLT50eF9mdWxsJyBmbGFnIGlzIHNldCwgaXQgY2xlYXJzIGJvdGggdGhlCit0eF9mdWxsIGFuZCB0YnVzeSBmbGFncy4KKworSVYuIE5vdGVzCisKK0lWYi4gUmVmZXJlbmNlcworCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy9OV2F5Lmh0bWwKK2h0dHA6Ly93d3cuZGlnaXRhbC5jb20gIChzZWFyY2ggZm9yIGN1cnJlbnQgMjEqNCogZGF0YXNoZWV0cyBhbmQgIjIxWDQgU1JPTSIpCitodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9EUC9EUDgzODQwQS5odG1sCisKK0lWYy4gRXJyYXRhCisKKyovCisKKy8qIEEgZnVsbC1kdXBsZXggbWFwIGZvciBtZWRpYSB0eXBlcy4gKi8KK2VudW0gTWVkaWFJcyB7CisJTWVkaWFJc0ZEID0gMSwgTWVkaWFBbHdheXNGRD0yLCBNZWRpYUlzTUlJPTQsIE1lZGlhSXNGeD04LAorCU1lZGlhSXMxMDA9MTZ9Oworc3RhdGljIGNvbnN0IGNoYXIgbWVkaWFfY2FwW10gPQorezAsMCwwLDE2LCAgMywxOSwxNiwyNCwgIDI3LDQsNyw1LCAwLDIwLDIzLDIwIH07CisKKy8qIE9mZnNldHMgdG8gdGhlIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlcnMsICJDU1JzIi4gIEFsbCBhY2Nlc3NlcworICAgbXVzdCBiZSBsb25nd29yZCBpbnN0cnVjdGlvbnMgYW5kIHF1YWR3b3JkIGFsaWduZWQuICovCitlbnVtIHhpcmNvbV9vZmZzZXRzIHsKKwlDU1IwPTAsICAgIENTUjE9MHgwOCwgQ1NSMj0weDEwLCBDU1IzPTB4MTgsIENTUjQ9MHgyMCwgQ1NSNT0weDI4LAorCUNTUjY9MHgzMCwgQ1NSNz0weDM4LCBDU1I4PTB4NDAsIENTUjk9MHg0OCwgQ1NSMTA9MHg1MCwgQ1NSMTE9MHg1OCwKKwlDU1IxMj0weDYwLCBDU1IxMz0weDY4LCBDU1IxND0weDcwLCBDU1IxNT0weDc4LCBDU1IxNj0weDA0LCB9OworCisvKiBUaGUgYml0cyBpbiB0aGUgQ1NSNSBzdGF0dXMgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIHN0YXR1c19iaXRzIHsKKwlMaW5rQ2hhbmdlPTB4MDgwMDAwMDAsCisJTm9ybWFsSW50cj0weDEwMDAwLCBOb3JtYWxJbnRyTWFzaz0weDAwMDE0MDQ1LAorCUFibm9ybWFsSW50cj0weDgwMDAsIEFibm9ybWFsSW50ck1hc2s9MHgwYTAwYTVhMiwKKwlSZXNlcnZlZEludHJNYXNrPTB4ZTAwMDFhMTgsCisJRWFybHlSeEludHI9MHg0MDAwLCBCdXNFcnJvckludHI9MHgyMDAwLAorCUVhcmx5VHhJbnRyPTB4NDAwLCBSeERpZWQ9MHgxMDAsIFJ4Tm9CdWY9MHg4MCwgUnhJbnRyPTB4NDAsCisJVHhGSUZPVW5kZXJmbG93PTB4MjAsIFR4Tm9CdWY9MHgwNCwgVHhEaWVkPTB4MDIsIFR4SW50cj0weDAxLAorfTsKKworZW51bSBjc3IwX2NvbnRyb2xfYml0cyB7CisJRW5hYmxlTVdJPTB4MDEwMDAwMDAsIEVuYWJsZU1STD0weDAwODAwMDAwLAorCUVuYWJsZU1STT0weDAwMjAwMDAwLCBFcXVhbEJ1c1ByaW89MHgwMiwKKwlTb2Z0d2FyZVJlc2V0PTB4MDEsCit9OworCitlbnVtIGNzcjZfY29udHJvbF9iaXRzIHsKKwlSZWNlaXZlQWxsQml0PTB4NDAwMDAwMDAsIEFsbE11bHRpQml0PTB4ODAsIFByb21pc2NCaXQ9MHg0MCwKKwlIYXNoRmlsdGVyQml0PTB4MDEsIEZ1bGxEdXBsZXhCaXQ9MHgwMjAwLAorCVR4VGhyZXNoMTA9MHg0MDAwMDAsIFR4U3RvcmVGb3J3PTB4MjAwMDAwLAorCVR4VGhyZXNoTWFzaz0weGMwMDAsIFR4VGhyZXNoU2hpZnQ9MTQsCisJRW5hYmxlVHg9MHgyMDAwLCBFbmFibGVSeD0weDAyLAorCVJlc2VydmVkWmVyb01hc2s9MHg4ZDkzMDEzNCwgUmVzZXJ2ZWRPbmVNYXNrPTB4MzIwYzAwMDAsCisJRW5hYmxlVHhSeD0oRW5hYmxlVHggfCBFbmFibGVSeCksCit9OworCisKK2VudW0gdGJsX2ZsYWcgeworCUhBU19NSUk9MSwgSEFTX0FDUEk9MiwKK307CitzdGF0aWMgc3RydWN0IHhpcmNvbV9jaGlwX3RhYmxlIHsKKwljaGFyICpjaGlwX25hbWU7CisJaW50IHZhbGlkX2ludHJzOwkJCS8qIENTUjcgaW50ZXJydXB0IGVuYWJsZSBzZXR0aW5ncyAqLworCWludCBmbGFnczsKK30geGlyY29tX3RibFtdID0geworICB7ICJYaXJjb20gQ2FyZGJ1cyBBZGFwdGVyIiwKKwlMaW5rQ2hhbmdlIHwgTm9ybWFsSW50ciB8IEFibm9ybWFsSW50ciB8IEJ1c0Vycm9ySW50ciB8CisJUnhEaWVkIHwgUnhOb0J1ZiB8IFJ4SW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IFR4Tm9CdWYgfCBUeERpZWQgfCBUeEludHIsCisJSEFTX01JSSB8IEhBU19BQ1BJLCB9LAorICB7IE5VTEwsIH0sCit9OworLyogVGhpcyBtYXRjaGVzIHRoZSB0YWJsZSBhYm92ZS4gKi8KK2VudW0gY2hpcHMgeworCVgzMjAxXzMsCit9OworCisKKy8qIFRoZSBYaXJjb20gUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCB4aXJjb21fcnhfZGVzYyB7CisJczMyIHN0YXR1czsKKwlzMzIgbGVuZ3RoOworCXUzMiBidWZmZXIxLCBidWZmZXIyOworfTsKKworc3RydWN0IHhpcmNvbV90eF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjEsIGJ1ZmZlcjI7CQkJCS8qIFdlIHVzZSBvbmx5IGJ1ZmZlciAxLiAgKi8KK307CisKK2VudW0gdHhfZGVzYzBfc3RhdHVzX2JpdHMgeworCVR4MERlc2NPd25lZD0weDgwMDAwMDAwLCBUeDBEZXNjRXJyb3I9MHg4MDAwLCBUeDBOb0NhcnJpZXI9MHgwODAwLAorCVR4MExhdGVDb2xsPTB4MDIwMCwgVHgwTWFueUNvbGw9MHgwMTAwLCBUeDBVbmRlcmZsb3c9MHgwMiwKK307CitlbnVtIHR4X2Rlc2MxX3N0YXR1c19iaXRzIHsKKwlUeDFDb21wbEludHI9MHg4MDAwMDAwMCwgVHgxTGFzdFNlZz0weDQwMDAwMDAwLCBUeDFGaXJzdFNlZz0weDIwMDAwMDAwLAorCVR4MVNldHVwUGt0PTB4MDgwMDAwMDAsIFR4MURpc2FibGVDUkM9MHgwNDAwMDAwMCwgVHgxUmluZ1dyYXA9MHgwMjAwMDAwMCwKKwlUeDFDaGFpbkRlc2M9MHgwMTAwMDAwMCwgVHgxTm9QYWQ9MHg4MDAwMDAsIFR4MUhhc2hTZXR1cD0weDQwMDAwMCwKKwlUeDFXaG9sZVBrdD0oVHgxRmlyc3RTZWcgfCBUeDFMYXN0U2VnKSwKK307CitlbnVtIHJ4X2Rlc2MwX3N0YXR1c19iaXRzIHsKKwlSeDBEZXNjT3duZWQ9MHg4MDAwMDAwMCwgUngwRGVzY0Vycm9yPTB4ODAwMCwgUngwTm9TcGFjZT0weDQwMDAsCisJUngwUnVudD0weDA4MDAsIFJ4ME1jYXN0UGt0PTB4MDQwMCwgUngwRmlyc3RTZWc9MHgwMjAwLCBSeDBMYXN0U2VnPTB4MDEwMCwKKwlSeDBIdWdlRnJhbWU9MHg4MCwgUngwQ1JDRXJyb3I9MHgwMiwKKwlSeDBXaG9sZVBrdD0oUngwRmlyc3RTZWcgfCBSeDBMYXN0U2VnKSwKK307CitlbnVtIHJ4X2Rlc2MxX3N0YXR1c19iaXRzIHsKKwlSeDFSaW5nV3JhcD0weDAyMDAwMDAwLCBSeDFDaGFpbkRlc2M9MHgwMTAwMDAwMCwKK307CisKK3N0cnVjdCB4aXJjb21fcHJpdmF0ZSB7CisJc3RydWN0IHhpcmNvbV9yeF9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgeGlyY29tX3R4X2Rlc2MgdHhfcmluZ1tUWF9SSU5HX1NJWkVdOworCS8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworI2lmZGVmIENBUkRCVVMKKwkvKiBUaGUgWDMyMDEtMyByZXF1aXJlcyA0LWJ5dGUgYWxpZ25lZCB0eCBidWZzICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X2FsaWduZWRfc2tidWZmW1RYX1JJTkdfU0laRV07CisjZW5kaWYKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJdTE2IHNldHVwX2ZyYW1lW1BLVF9TRVRVUF9TWiAvIHNpemVvZih1MTYpXTsJLyogUHNldWRvLVR4IGZyYW1lIHRvIGluaXQgYWRkcmVzcyB0YWJsZS4gKi8KKwlpbnQgY2hpcF9pZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBjdXJfdHg7CQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwl1bnNpZ25lZCBpbnQgZGlydHlfcngsIGRpcnR5X3R4OwkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCXVuc2lnbmVkIGludCB0eF9mdWxsOjE7CQkJCS8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXVuc2lnbmVkIGludCBzcGVlZDEwMDoxOworCXVuc2lnbmVkIGludCBmdWxsX2R1cGxleDoxOwkJCS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisJdW5zaWduZWQgaW50IGF1dG9uZWc6MTsKKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwl1bnNpZ25lZCBpbnQgb3BlbjoxOworCXVuc2lnbmVkIGludCBjc3IwOwkJCQkJLyogQ1NSMCBzZXR0aW5nLiAqLworCXVuc2lnbmVkIGludCBjc3I2OwkJCQkJLyogQ3VycmVudCBDU1I2IGNvbnRyb2wgc2V0dGluZ3MuICovCisJdTE2IHRvX2FkdmVydGlzZTsJCQkJCS8qIE5XYXkgY2FwYWJpbGl0aWVzIGFkdmVydGlzZWQuICAqLworCXUxNiBhZHZlcnRpc2luZ1s0XTsKKwlzaWduZWQgY2hhciBwaHlzWzRdLCBtaWlfY250OwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJaW50IHNhdmVkX2lmX3BvcnQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIHZvaWQgeGlyY29tX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGlyY29tX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGlyY29tX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB4aXJjb21faW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGlyY29tX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGlyY29tX21lZGlhX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB4aXJjb21faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB4aXJjb21fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHM7CisKKworLyogVGhlIFhpcmNvbSBjYXJkcyBhcmUgcGlja3kgYWJvdXQgd2hlbiBjZXJ0YWluIGJpdHMgaW4gQ1NSNiBjYW4gYmUKKyAgIG1hbmlwdWxhdGVkLiAgS2VpdGggT3dlbnMgPGthb3NAb2NzLmNvbS5hdT4uICovCitzdGF0aWMgdm9pZCBvdXRsX0NTUjYodTMyIG5ld2NzcjYsIGxvbmcgaW9hZGRyKQoreworCWNvbnN0IGludCBzdHJpY3RfYml0cyA9CisJCVR4VGhyZXNoMTAgfCBUeFN0b3JlRm9ydyB8IFR4VGhyZXNoTWFzayB8IEVuYWJsZVR4UnggfCBGdWxsRHVwbGV4Qml0OworICAgIGludCBjc3I1LCBjc3I1XzIyXzIwLCBjc3I1XzE5XzE3LCBjdXJyY3NyNiwgYXR0ZW1wdHMgPSAyMDA7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzYXZlX2ZsYWdzKGZsYWdzKTsKKyAgICBjbGkoKTsKKwkvKiBtYXNrIG91dCB0aGUgcmVzZXJ2ZWQgYml0cyB0aGF0IGFsd2F5cyByZWFkIDAgb24gdGhlIFhpcmNvbSBjYXJkcyAqLworCW5ld2NzcjYgJj0gflJlc2VydmVkWmVyb01hc2s7CisJLyogb3IgaW4gdGhlIHJlc2VydmVkIGJpdHMgdGhhdCBhbHdheXMgcmVhZCAxICovCisJbmV3Y3NyNiB8PSBSZXNlcnZlZE9uZU1hc2s7CisgICAgY3VycmNzcjYgPSBpbmwoaW9hZGRyICsgQ1NSNik7CisgICAgaWYgKCgobmV3Y3NyNiAmIHN0cmljdF9iaXRzKSA9PSAoY3VycmNzcjYgJiBzdHJpY3RfYml0cykpIHx8CisJKChjdXJyY3NyNiAmIH5FbmFibGVUeFJ4KSA9PSAwKSkgeworCQlvdXRsKG5ld2NzcjYsIGlvYWRkciArIENTUjYpOwkvKiBzYWZlICovCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisgICAgfQorICAgIC8qIG1ha2Ugc3VyZSB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGFyZSBzdG9wcGVkIGZpcnN0ICovCisgICAgY3VycmNzcjYgJj0gfkVuYWJsZVR4Ung7CisgICAgd2hpbGUgKDEpIHsKKwkJY3NyNSA9IGlubChpb2FkZHIgKyBDU1I1KTsKKwkJaWYgKGNzcjUgPT0gMHhmZmZmZmZmZikKKwkJCWJyZWFrOyAgLyogY2Fubm90IHJlYWQgY3NyNSwgY2FyZCByZW1vdmVkPyAqLworCQljc3I1XzIyXzIwID0gY3NyNSAmIDB4NzAwMDAwOworCQljc3I1XzE5XzE3ID0gY3NyNSAmIDB4MGUwMDAwOworCQlpZiAoKGNzcjVfMjJfMjAgPT0gMCB8fCBjc3I1XzIyXzIwID09IDB4NjAwMDAwKSAmJgorCQkJKGNzcjVfMTlfMTcgPT0gMCB8fCBjc3I1XzE5XzE3ID09IDB4ODAwMDAgfHwgY3NyNV8xOV8xNyA9PSAweGMwMDAwKSkKKwkJCWJyZWFrOyAgLyogYm90aCBhcmUgc3RvcHBlZCBvciBzdXNwZW5kZWQgKi8KKwkJaWYgKCEtLWF0dGVtcHRzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IG91dGxfQ1NSNiB0b28gbWFueSBhdHRlbXB0cywiCisJCQkJICAgImNzcjU9MHglMDh4XG4iLCBjc3I1KTsKKwkJCW91dGwobmV3Y3NyNiwgaW9hZGRyICsgQ1NSNik7ICAvKiB1bnNhZmUgYnV0IGRvIGl0IGFueXdheSAqLworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJb3V0bChjdXJyY3NyNiwgaW9hZGRyICsgQ1NSNik7CisJCXVkZWxheSgxKTsKKyAgICB9CisgICAgLyogbm93IGl0IGlzIHNhZmUgdG8gY2hhbmdlIGNzcjYgKi8KKyAgICBvdXRsKG5ld2NzcjYsIGlvYWRkciArIENTUjYpOworICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByZWFkX21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIHR1cGxlLCBsaW5rLCBkYXRhX2lkLCBkYXRhX2NvdW50OworCisJLyogWGlyY29tIGhhcyBpdHMgYWRkcmVzcyBzdG9yZWQgaW4gdGhlIENJUzsKKwkgKiB3ZSBhY2Nlc3MgaXQgdGhyb3VnaCB0aGUgYm9vdCByb20gaW50ZXJmYWNlIGZvciBub3cKKwkgKiB0aGlzIG1pZ2h0IG5vdCB3b3JrLCBhcyB0aGUgQ0lTIGlzIG5vdCBwYXJzZWQgYnV0IEkKKwkgKiAoZGFuaWxvKSB1c2UgdGhlIG9mZnNldCBJIGZvdW5kIG9uIG15IGNhcmQncyBDSVMgISEhCisJICoKKwkgKiBEb3VnIExlZGZvcmQ6IEkgY2hhbmdlZCB0aGlzIHJvdXRpbmUgYXJvdW5kIHNvIHRoYXQgaXQKKwkgKiB3YWxrcyB0aGUgQ0lTIG1lbW9yeSBzcGFjZSwgcGFyc2luZyB0aGUgY29uZmlnIGl0ZW1zLCBhbmQKKwkgKiBmaW5kcyB0aGUgcHJvcGVyIGxhbl9ub2RlX2lkIHR1cGxlIGFuZCB1c2VzIHRoZSBkYXRhCisJICogc3RvcmVkIHRoZXJlLgorCSAqLworCW91dGwoMSA8PCAxMiwgaW9hZGRyICsgQ1NSOSk7IC8qIGVuYWJsZSBib290IHJvbSBhY2Nlc3MgKi8KKwlmb3IgKGkgPSAweDEwMDsgaSA8IDB4MWY3OyBpICs9IGxpbmsrMikgeworCQlvdXRsKGksIGlvYWRkciArIENTUjEwKTsKKwkJdHVwbGUgPSBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAxLCBpb2FkZHIgKyBDU1IxMCk7CisJCWxpbmsgPSBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAyLCBpb2FkZHIgKyBDU1IxMCk7CisJCWRhdGFfaWQgPSBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAzLCBpb2FkZHIgKyBDU1IxMCk7CisJCWRhdGFfY291bnQgPSBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweGZmOworCQlpZiAoICh0dXBsZSA9PSAweDIyKSAmJgorCQkJIChkYXRhX2lkID09IDB4MDQpICYmIChkYXRhX2NvdW50ID09IDB4MDYpICkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgaXQuICBXZSBoYXZlIHRoZSBkYXRhIHdlIHdhbnQuCisJCQkgKi8KKwkJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKwkJCQlvdXRsKGkgKyBqICsgNCwgaW9hZGRyICsgQ1NSMTApOworCQkJCWRldi0+ZGV2X2FkZHJbal0gPSBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweGZmOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobGluayA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogbG9jYXRlIHRoZSBNSUkgaW50ZXJmYWNlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtLgorICogd2UgZGlzYWJsZSBmdWxsLWR1cGxleCBtb2RlcyBoZXJlLAorICogYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlbS4KKyAqLworc3RhdGljIHZvaWQgZmluZF9taWlfdHJhbnNjZWl2ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHBoeSwgcGh5X2lkeDsKKworCWlmIChtZWRpYV9jYXBbdHAtPmRlZmF1bHRfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCXUxNiBtZWRpYTJhZHZlcnRbXSA9IHsgMHgyMCwgMHg0MCwgMHgwM2UwLCAweDYwLCAweDgwLCAweDEwMCwgMHgyMDAgfTsKKwkJdHAtPnRvX2FkdmVydGlzZSA9IG1lZGlhMmFkdmVydFt0cC0+ZGVmYXVsdF9wb3J0IC0gOV07CisJfSBlbHNlCisJCXRwLT50b19hZHZlcnRpc2UgPQorCQkJLypBRFZFUlRJU0VfMTAwQkFTRTQgfCBBRFZFUlRJU0VfMTAwRlVMTCB8Ki8gQURWRVJUSVNFXzEwMEhBTEYgfAorCQkJLypBRFZFUlRJU0VfMTBGVUxMIHwqLyBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFX0NTTUE7CisKKwkvKiBGaW5kIHRoZSBjb25uZWN0ZWQgTUlJIHhjdnJzLgorCSAgIERvaW5nIHRoaXMgaW4gb3BlbigpIHdvdWxkIGFsbG93IGRldGVjdGluZyBleHRlcm5hbCB4Y3ZycyBsYXRlciwKKwkgICBidXQgdGFrZXMgbXVjaCB0aW1lLiAqLworCWZvciAocGh5ID0gMCwgcGh5X2lkeCA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YodHAtPnBoeXMpOyBwaHkrKykgeworCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0JNU1IpOworCQlpZiAoKG1paV9zdGF0dXMgJiAoQk1TUl8xMDBCQVNFNCB8IEJNU1JfMTAwSEFMRiB8IEJNU1JfMTBIQUxGKSkgPT0gQk1TUl8xMDBCQVNFNCB8fAorCQkJKChtaWlfc3RhdHVzICYgQk1TUl8xMDBCQVNFNCkgPT0gMCAmJgorCQkJIChtaWlfc3RhdHVzICYgKEJNU1JfMTAwRlVMTCB8IEJNU1JfMTAwSEFMRiB8IEJNU1JfMTBGVUxMIHwgQk1TUl8xMEhBTEYpKSAhPSAwKSkgeworCQkJaW50IG1paV9yZWcwID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1DUik7CisJCQlpbnQgbWlpX2FkdmVydCA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQlpbnQgcmVnNCA9ICgobWlpX3N0YXR1cyA+PiA2KSAmIHRwLT50b19hZHZlcnRpc2UpIHwgQURWRVJUSVNFX0NTTUE7CisJCQl0cC0+cGh5c1twaHlfaWR4XSA9IHBoeTsKKwkJCXRwLT5hZHZlcnRpc2luZ1twaHlfaWR4KytdID0gcmVnNDsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgTUlJIHRyYW5zY2VpdmVyICMlZCAiCisJCQkJICAgImNvbmZpZyAlNC40eCBzdGF0dXMgJTQuNHggYWR2ZXJ0aXNpbmcgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfcmVnMCwgbWlpX3N0YXR1cywgbWlpX2FkdmVydCk7CisJCX0KKwl9CisJdHAtPm1paV9jbnQgPSBwaHlfaWR4OworCWlmIChwaHlfaWR4ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICoqKldBUk5JTkcqKio6IE5vIE1JSSB0cmFuc2NlaXZlciBmb3VuZCFcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQl0cC0+cGh5c1swXSA9IDA7CisJfQorfQorCisKKy8qCisgKiBUbyBxdW90ZSBBcmphbiB2YW4gZGUgVmVuOgorICogICB0cmFuc2NlaXZlcl92b29kb28oKSBlbmFibGVzIHRoZSBleHRlcm5hbCBVVFAgcGx1ZyB0aGluZ3kuCisgKiAgIGl0J3MgY2FsbGVkIHZvb2RvbyBhcyBJIHN0b2xlIHRoaXMgY29kZSBhbmQgY2Fubm90IGNyb3NzLXJlZmVyZW5jZQorICogICBpdCB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uLgorICogQWN0dWFsbHkgaXQgc2VlbXMgdG8gZ28gbGlrZSB0aGlzOgorICogLSBHUElPMiBlbmFibGVzIHRoZSBNSUkgaXRzZWxmIHNvIHdlIGNhbiB0YWxrIHRvIGl0LiBUaGUgTUlJIGdldHMgcmVzZXQKKyAqICAgc28gYW55IHByaW9yIE1JSSBzZXR0aW5ncyBhcmUgbG9zdC4KKyAqIC0gR1BJTzAgZW5hYmxlcyB0aGUgVFAgcG9ydCBzbyB0aGUgTUlJIGNhbiB0YWxrIHRvIHRoZSBuZXR3b3JrLgorICogLSBhIHNvZnR3YXJlIHJlc2V0IHdpbGwgcmVzZXQgYm90aCBHUElPIHBpbnMuCisgKiBJIGFsc28gbW92ZWQgdGhlIHNvZnR3YXJlIHJlc2V0IGhlcmUsIGJlY2F1c2UgZG9pbmcgaXQgaW4geGlyY29tX3VwKCkKKyAqIHJlcXVpcmVkIGVuYWJsaW5nIHRoZSBHUElPIHBpbnMgZWFjaCB0aW1lLCB3aGljaCByZXNldCB0aGUgTUlJIGVhY2ggdGltZS4KKyAqIFRodXMgd2UgY291bGRuJ3QgY29udHJvbCB0aGUgTUlJIC0tIHdoaWNoIHN1Y2tzIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdworICogaG93IHRvIGhhbmRsZSBmdWxsLWR1cGxleCBtb2RlcyBzbyB3ZSAqbXVzdCogZGlzYWJsZSB0aGVtLgorICovCitzdGF0aWMgdm9pZCB0cmFuc2NlaXZlcl92b29kb28oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogUmVzZXQgdGhlIGNoaXAsIGhvbGRpbmcgYml0IDAgc2V0IGF0IGxlYXN0IDUwIFBDSSBjeWNsZXMuICovCisJb3V0bChTb2Z0d2FyZVJlc2V0LCBpb2FkZHIgKyBDU1IwKTsKKwl1ZGVsYXkoMik7CisKKwkvKiBEZWFzc2VydCByZXNldC4gKi8KKwlvdXRsKHRwLT5jc3IwLCBpb2FkZHIgKyBDU1IwKTsKKworCS8qIFJlc2V0IHRoZSB4Y3ZyIGludGVyZmFjZSBhbmQgdHVybiBvbiBoZWFydGJlYXQuICovCisJb3V0bCgweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKwl1ZGVsYXkoNSk7ICAvKiBUaGUgZGVsYXlzIGFyZSBYaXJjb20tcmVjb21tZW5kZWQgdG8gZ2l2ZSB0aGUKKwkJCQkgKiBjaGlwc2V0IHRpbWUgdG8gcmVzZXQgdGhlIGFjdHVhbCBoYXJkd2FyZQorCQkJCSAqIG9uIHRoZSBQQ01DSUEgY2FyZAorCQkJCSAqLworCW91dGwoMHhhODA1MDAwMCwgaW9hZGRyICsgQ1NSMTUpOworCXVkZWxheSg1KTsKKwlvdXRsKDB4YTAwZjAwMDAsIGlvYWRkciArIENTUjE1KTsKKwl1ZGVsYXkoNSk7CisKKwlvdXRsX0NTUjYoMCwgaW9hZGRyKTsKKwkvL291dGxfQ1NSNihGdWxsRHVwbGV4Qml0LCBpb2FkZHIpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHhpcmNvbV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cDsKKwlzdGF0aWMgaW50IGJvYXJkX2lkeCA9IC0xOworCWludCBjaGlwX2lkeCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlsb25nIGlvYWRkcjsKKwlpbnQgaTsKKwl1OCBjaGlwX3JldjsKKworLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwkvL3ByaW50ayhLRVJOX0lORk8gInhpcmNvbV9pbml0X29uZSglcylcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKworCWJvYXJkX2lkeCsrOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdHApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSIERSVl9OQU1FICIlZDogY2Fubm90IGFsbG9jIGV0aGVyZGV2LCBhYm9ydGluZ1xuIiwgYm9hcmRfaWR4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBkZXYtPm5hbWUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgRFJWX05BTUUgIiAlZDogY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIsIGJvYXJkX2lkeCk7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwkvKiBCcmluZyB0aGUgY2hpcCBvdXQgb2Ygc2xlZXAgbW9kZS4KKwkgICBDYXV0aW9uOiBTbm9vemUgbW9kZSBkb2VzIG5vdCB3b3JrIHdpdGggc29tZSBib2FyZHMhICovCisJaWYgKHhpcmNvbV90YmxbY2hpcF9pZHhdLmZsYWdzICYgSEFTX0FDUEkpCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX1BPV0VSTUdNVCwgMCk7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlvdXRsX0NTUjYoaW5sKGlvYWRkciArIENTUjYpICYgfkVuYWJsZVR4UngsIGlvYWRkcik7CisJLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKwkodm9sYXRpbGUgaW50KWlubChpb2FkZHIgKyBDU1I4KTsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisJdHAtPnBkZXYgPSBwZGV2OworCXRwLT5jaGlwX2lkID0gY2hpcF9pZHg7CisJLyogQnVnRml4ZXM6IFRoZSAyMTE0My1URCBoYW5ncyB3aXRoIFBDSSBXcml0ZS1hbmQtSW52YWxpZGF0ZSBjeWNsZXMuICovCisJLyogWFhYOiBpcyB0aGlzIG5lY2Vzc2FyeSBmb3IgWGlyY29tPyAqLworCXRwLT5jc3IwID0gY3NyMCAmIH5FbmFibGVNV0k7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChib2FyZF9pZHggPj0gMCAmJiBib2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJdHAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbnNbYm9hcmRfaWR4XSAmIDE1OworCQlpZiAoKG9wdGlvbnNbYm9hcmRfaWR4XSAmIDB4OTApIHx8IGZ1bGxfZHVwbGV4W2JvYXJkX2lkeF0gPiAwKQorCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaWYgKG10dVtib2FyZF9pZHhdID4gMCkKKwkJCWRldi0+bXR1ID0gbXR1W2JvYXJkX2lkeF07CisJfQorCWlmIChkZXYtPm1lbV9zdGFydCkKKwkJdHAtPmRlZmF1bHRfcG9ydCA9IGRldi0+bWVtX3N0YXJ0OworCWlmICh0cC0+ZGVmYXVsdF9wb3J0KSB7CisJCWlmIChtZWRpYV9jYXBbdHAtPmRlZmF1bHRfcG9ydF0gJiBNZWRpYUFsd2F5c0ZEKQorCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwl9CisJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJdHAtPmF1dG9uZWcgPSAwOworCWVsc2UKKwkJdHAtPmF1dG9uZWcgPSAxOworCXRwLT5zcGVlZDEwMCA9IDE7CisKKwkvKiBUaGUgWGlyY29tLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJnhpcmNvbV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnhpcmNvbV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZ4aXJjb21fY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmeGlyY29tX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gJnhpcmNvbV9pb2N0bDsKKyNpZmRlZiBIQVZFX01VTFRJQ0FTVAorCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworI2VuZGlmCisJZGV2LT50eF90aW1lb3V0ID0geGlyY29tX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CisKKwl0cmFuc2NlaXZlcl92b29kb28oZGV2KTsKKworCXJlYWRfbWFjX2FkZHJlc3MoZGV2KTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmY2hpcF9yZXYpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyByZXYgJWQgYXQgJSMzbHgsIiwKKwkgICAgICAgZGV2LT5uYW1lLCB4aXJjb21fdGJsW2NoaXBfaWR4XS5jaGlwX25hbWUsIGNoaXBfcmV2LCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJWMlMi4yWCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiLCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisKKwlpZiAoeGlyY29tX3RibFtjaGlwX2lkeF0uZmxhZ3MgJiBIQVNfTUlJKSB7CisJCWZpbmRfbWlpX3RyYW5zY2VpdmVycyhkZXYpOworCQljaGVja19kdXBsZXgoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisvKiBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKyAgIGZvciBkZXRhaWxzLiAqLworCisvKiBUaGUgbWF4aW11bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSBtaW5pbXVtIHRpbWluZyBpcyB1c3VhbGx5CisgICBtZXQgYnkgYmFjay10by1iYWNrIFBDSSBJL08gY3ljbGVzLCBidXQgd2UgaW5zZXJ0IGEgZGVsYXkgdG8gYXZvaWQKKyAgICJvdmVyY2xvY2tpbmciIGlzc3VlcyBvciBmdXR1cmUgNjZNaHogUENJLiAqLworI2RlZmluZSBtZGlvX2RlbGF5KCkgaW5sKG1kaW9fYWRkcikKKworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIEl0IGlzIGp1c3QgZGlmZmVyZW50IGVub3VnaCBmcm9tIHRoZSBFRVBST00gcHJvdG9jb2wKKyAgIHRvIG5vdCBzaGFyZSBjb2RlLiAgVGhlIG1heGl1bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gKi8KKyNkZWZpbmUgTURJT19TSElGVF9DTEsJMHgxMDAwMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwIDB4MDAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMSAweDIwMDAwCisjZGVmaW5lIE1ESU9fRU5CCQkweDAwMDAwCQkvKiBJZ25vcmUgdGhlIDB4MDIwMDAgZGF0YWJvb2sgc2V0dGluZy4gKi8KKyNkZWZpbmUgTURJT19FTkJfSU4JCTB4NDAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJMHg4MDAwMAorCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJaW50IHJlYWRfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCWludCByZXR2YWwgPSAwOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbG9uZyBtZGlvX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworCisJLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyBhdCBsZWFzdCAzMiBsb2dpYyBvbmVzLiAqLworCWZvciAoaSA9IDMyOyBpID49IDA7IGktLSkgeworCQlvdXRsKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gTURJT19EQVRBX1dSSVRFMSA6IDA7CisKKwkJb3V0bChNRElPX0VOQiB8IGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChNRElPX0VOQiB8IGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCW91dGwoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKG1kaW9fYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJCW91dGwoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKwlpbnQgY21kID0gKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbiA8PCAxOCkgfCB2YWx1ZTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgMzIgbG9naWMgb25lcy4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAoY21kICYgKDEgPDwgaSkpID8gTURJT19EQVRBX1dSSVRFMSA6IDA7CisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlvdXRsKE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK3hpcmNvbV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwl4aXJjb21faW5pdF9yaW5nKGRldik7CisJLyogQ2xlYXIgdGhlIHR4IHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCXRwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJfQorCisJaWYgKHhpcmNvbV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogeGlyY29tX3VwKCkgaXJxICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwlvdXRsKHZpcnRfdG9fYnVzKHRwLT5yeF9yaW5nKSwgaW9hZGRyICsgQ1NSMyk7CisJb3V0bCh2aXJ0X3RvX2J1cyh0cC0+dHhfcmluZyksIGlvYWRkciArIENTUjQpOworCisJdHAtPnNhdmVkX2lmX3BvcnQgPSBkZXYtPmlmX3BvcnQ7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSB0cC0+ZGVmYXVsdF9wb3J0OworCisJdHAtPmNzcjYgPSBUeFRocmVzaDEwIC8qfCBGdWxsRHVwbGV4Qml0Ki87CQkJCQkJLyogWFhYOiB3aHkgMTAgYW5kIG5vdCAxMDA/ICovCisKKwlzZXRfcnhfbW9kZShkZXYpOworCisJLyogU3RhcnQgdGhlIGNoaXAncyBUeCB0byBwcm9jZXNzIHNldHVwIGZyYW1lLiAqLworCW91dGxfQ1NSNih0cC0+Y3NyNiwgaW9hZGRyKTsKKwlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVUeCwgaW9hZGRyKTsKKworCS8qIEFja25vd2xlZGdlIGFsbCBvdXRzdGFuZGluZyBpbnRlcnJ1cHRzIHNvdXJjZXMgKi8KKwlvdXRsKHhpcmNvbV90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCBpb2FkZHIgKyBDU1I1KTsKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKHhpcmNvbV90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCBpb2FkZHIgKyBDU1I3KTsKKwkvKiBFbmFibGUgUnggKi8KKwlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVUeFJ4LCBpb2FkZHIpOworCS8qIFJ4IHBvbGwgZGVtYW5kICovCisJb3V0bCgwLCBpb2FkZHIgKyBDU1IyKTsKKworCS8qIFRlbGwgdGhlIG5ldCBsYXllciB3ZSdyZSByZWFkeSAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJLyogQ2hlY2sgY3VycmVudCBtZWRpYSBzdGF0ZSAqLworCXhpcmNvbV9tZWRpYV9jaGFuZ2UoZGV2KTsKKworCWlmICh4aXJjb21fZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSB4aXJjb21fdXAoKSwgQ1NSMCAlOC44eCwgQ1NSNSAlOC44eCBDU1I2ICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW5sKGlvYWRkciArIENTUjApLCBpbmwoaW9hZGRyICsgQ1NSNSksCisJCQkgICBpbmwoaW9hZGRyICsgQ1NSNikpOworCX0KK30KKworCitzdGF0aWMgaW50Cit4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmeGlyY29tX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl4aXJjb21fdXAoZGV2KTsKKwl0cC0+b3BlbiA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB4aXJjb21fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAobWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCS8qIERvIG5vdGhpbmcgLS0gdGhlIG1lZGlhIG1vbml0b3Igc2hvdWxkIGhhbmRsZSB0aGlzLiAqLworCQlpZiAoeGlyY29tX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lb3V0IHVzaW5nIE1JSSBkZXZpY2UuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJfQorCisjaWYgZGVmaW5lZCh3YXlfdG9vX21hbnlfbWVzc2FnZXMpCisJaWYgKHhpcmNvbV9kZWJ1ZyA+IDMpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJdTggKmJ1ZiA9ICh1OCAqKSh0cC0+cnhfcmluZ1tpXS5idWZmZXIxKTsKKwkJCWludCBqOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUyZDogJTguOHggJTguOHggJTguOHggJTguOHggICIKKwkJCQkgICAiJTIuMnggJTIuMnggJTIuMnguXG4iLAorCQkJCSAgIGksICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjIsCisJCQkJICAgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisJCQlmb3IgKGogPSAwOyBidWZbal0gIT0gMHhlZSAmJiBqIDwgMTYwMDsgaisrKQorCQkJCWlmIChqIDwgMTAwKSBwcmludGsoIiAlMi4yeCIsIGJ1ZltqXSk7CisJCQlwcmludGsoIiBqPSVkLlxuIiwgaik7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlOC44eDogIiwgKGludCl0cC0+cnhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU4Ljh4IiwgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5zdGF0dXMpOworCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHICIgIFR4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnR4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJLyogU3RvcCBhbmQgcmVzdGFydCB0aGUgY2hpcCdzIFR4L1J4IHByb2Nlc3NlcyAuICovCisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlUngsIGlvYWRkcik7CisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJb3V0bCgwLCBpb2FkZHIgKyBDU1IxKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCB4aXJjb21faW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwl0cC0+dHhfZnVsbCA9IDA7CisJdHAtPmN1cl9yeCA9IHRwLT5jdXJfdHggPSAwOworCXRwLT5kaXJ0eV9yeCA9IHRwLT5kaXJ0eV90eCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJdHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gUEtUX0JVRl9TWjsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMiA9IHZpcnRfdG9fYnVzKCZ0cC0+cnhfcmluZ1tpKzFdKTsKKwkJdHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisJdHAtPnJ4X3JpbmdbaS0xXS5sZW5ndGggPSBQS1RfQlVGX1NaIHwgUngxUmluZ1dyYXA7CisJdHAtPnJ4X3JpbmdbaS0xXS5idWZmZXIyID0gdmlydF90b19idXMoJnRwLT5yeF9yaW5nWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkvKiBOb3RlIHRoZSByZWNlaXZlIGJ1ZmZlciBtdXN0IGJlIGxvbmd3b3JkIGFsaWduZWQuCisJCSAgIGRldl9hbGxvY19za2IoKSBwcm92aWRlcyAxNiBieXRlIGFsaWdubWVudC4gIEJ1dCBkbyAqbm90KgorCQkgICB1c2Ugc2tiX3Jlc2VydmUoKSB0byBhbGlnbiB0aGUgSVAgaGVhZGVyISAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJdHAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJdHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gUngwRGVzY093bmVkOwkvKiBPd25lZCBieSBYaXJjb20gY2hpcCAqLworCQl0cC0+cnhfcmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT50YWlsKTsKKwl9CisJdHAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKwkvKiBUaGUgVHggYnVmZmVyIGRlc2NyaXB0b3IgaXMgZmlsbGVkIGluIGFzIG5lZWRlZCwgYnV0IHdlCisJICAgZG8gbmVlZCB0byBjbGVhciB0aGUgb3duZXJzaGlwIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCXRwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXRwLT50eF9yaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cygmdHAtPnR4X3JpbmdbaSsxXSk7CisjaWZkZWYgQ0FSREJVUworCQlpZiAodHAtPmNoaXBfaWQgPT0gWDMyMDFfMykKKwkJCXRwLT50eF9hbGlnbmVkX3NrYnVmZltpXSA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisjZW5kaWYgLyogQ0FSREJVUyAqLworCX0KKwl0cC0+dHhfcmluZ1tpLTFdLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cygmdHAtPnR4X3JpbmdbMF0pOworfQorCisKK3N0YXRpYyBpbnQKK3hpcmNvbV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCXUzMiBmbGFnOworCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGJhc2UgYWRkcmVzcworCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gdHAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCXRwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworI2lmZGVmIENBUkRCVVMKKwlpZiAodHAtPmNoaXBfaWQgPT0gWDMyMDFfMykgeworCQltZW1jcHkodHAtPnR4X2FsaWduZWRfc2tidWZmW2VudHJ5XS0+ZGF0YSxza2ItPmRhdGEsc2tiLT5sZW4pOworCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHRwLT50eF9hbGlnbmVkX3NrYnVmZltlbnRyeV0tPmRhdGEpOworCX0gZWxzZQorI2VuZGlmCisJCXRwLT50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT5kYXRhKTsKKworCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFLzIpIHsvKiBUeXBpY2FsIHBhdGggKi8KKwkJZmxhZyA9IFR4MVdob2xlUGt0OyAvKiBObyBpbnRlcnJ1cHQgKi8KKwl9IGVsc2UgaWYgKHRwLT5jdXJfdHggLSB0cC0+ZGlydHlfdHggPT0gVFhfUklOR19TSVpFLzIpIHsKKwkJZmxhZyA9IFR4MVdob2xlUGt0IHwgVHgxQ29tcGxJbnRyOyAvKiBUeC1kb25lIGludHIuICovCisJfSBlbHNlIGlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFIC0gMikgeworCQlmbGFnID0gVHgxV2hvbGVQa3Q7IC8qIE5vIFR4LWRvbmUgaW50ci4gKi8KKwl9IGVsc2UgeworCQkvKiBMZWF2ZSByb29tIGZvciBzZXRfcnhfbW9kZSgpIHRvIGZpbGwgZW50cmllcy4gKi8KKwkJZmxhZyA9IFR4MVdob2xlUGt0IHwgVHgxQ29tcGxJbnRyOyAvKiBUeC1kb25lIGludHIuICovCisJCXRwLT50eF9mdWxsID0gMTsKKwl9CisJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRSAtIDEpCisJCWZsYWcgfD0gVHgxV2hvbGVQa3QgfCBUeDFDb21wbEludHIgfCBUeDFSaW5nV3JhcDsKKworCXRwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBza2ItPmxlbiB8IGZsYWc7CisJdHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IFR4MERlc2NPd25lZDsJLyogUGFzcyBvd25lcnNoaXAgdG8gdGhlIGNoaXAuICovCisJdHAtPmN1cl90eCsrOworCWlmICh0cC0+dHhfZnVsbCkKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwllbHNlCisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJb3V0bCgwLCBkZXYtPmJhc2VfYWRkciArIENTUjEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB4aXJjb21fbWVkaWFfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgcmVnMCwgcmVnMSwgcmVnNCwgcmVnNTsKKwl1MzIgY3NyNiA9IGlubChpb2FkZHIgKyBDU1I2KSwgbmV3Y3NyNjsKKworCS8qIHJlc2V0IHN0YXR1cyBmaXJzdCAqLworCW1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUik7CisJbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKworCXJlZzAgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCXJlZzEgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNU1IpOworCisJaWYgKHJlZzEgJiBCTVNSX0xTVEFUVVMpIHsKKwkJLyogbGluayBpcyB1cCAqLworCQlpZiAocmVnMCAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJCS8qIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkICovCisJCQlyZWc0ID0gbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UpOworCQkJcmVnNSA9IG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJCWlmIChyZWc0ICYgQURWRVJUSVNFXzEwMEZVTEwgJiYgcmVnNSAmIExQQV8xMDBGVUxMKSB7CisJCQkJdHAtPnNwZWVkMTAwID0gMTsKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIGlmIChyZWc0ICYgQURWRVJUSVNFXzEwMEhBTEYgJiYgcmVnNSAmIExQQV8xMDBIQUxGKSB7CisJCQkJdHAtPnNwZWVkMTAwID0gMTsKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIGlmIChyZWc0ICYgQURWRVJUSVNFXzEwRlVMTCAmJiByZWc1ICYgTFBBXzEwRlVMTCkgeworCQkJCXRwLT5zcGVlZDEwMCA9IDA7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJdHAtPnNwZWVkMTAwID0gMDsKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogYXV0b25lZ290aWF0aW9uIGlzIGRpc2FibGVkICovCisJCQlpZiAocmVnMCAmIEJNQ1JfU1BFRUQxMDApCisJCQkJdHAtPnNwZWVkMTAwID0gMTsKKwkJCWVsc2UKKwkJCQl0cC0+c3BlZWQxMDAgPSAwOworCQkJaWYgKHJlZzAgJiBCTUNSX0ZVTExEUExYKQorCQkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCQllbHNlCisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgaXMgdXAsIHJ1bm5pbmcgYXQgJXNNYml0ICVzLWR1cGxleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgIHRwLT5zcGVlZDEwMCA/ICIxMDAiIDogIjEwIiwKKwkJICAgICAgIHRwLT5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJbmV3Y3NyNiA9IGNzcjYgJiB+RnVsbER1cGxleEJpdDsKKwkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCW5ld2NzcjYgfD0gRnVsbER1cGxleEJpdDsKKwkJaWYgKG5ld2NzcjYgIT0gY3NyNikKKwkJCW91dGxfQ1NSNihuZXdjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgaXMgZG93blxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IHJlZzA7CisKKwltZGlvX3dyaXRlKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwl1ZGVsYXkoNTAwKTsKKwl3aGlsZSAobWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTUNSKSAmIEJNQ1JfUkVTRVQpOworCisJcmVnMCA9IG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUik7CisJbWRpb193cml0ZShkZXYsIHRwLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFLCB0cC0+YWR2ZXJ0aXNpbmdbMF0pOworCisJaWYgKHRwLT5hdXRvbmVnKSB7CisJCXJlZzAgJj0gfihCTUNSX1NQRUVEMTAwIHwgQk1DUl9GVUxMRFBMWCk7CisJCXJlZzAgfD0gQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUOworCX0gZWxzZSB7CisJCXJlZzAgJj0gfihCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCQlpZiAodHAtPnNwZWVkMTAwKQorCQkJcmVnMCB8PSBCTUNSX1NQRUVEMTAwOworCQlpZiAodHAtPmZ1bGxfZHVwbGV4KQorCQkJcmVnMCB8PSBCTUNSX0ZVTExEUExYOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgZm9yY2VkIHRvICVzTWJpdCAlcy1kdXBsZXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICB0cC0+c3BlZWQxMDAgPyAiMTAwIiA6ICIxMCIsCisJCSAgICAgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCX0KKwltZGlvX3dyaXRlKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTUNSLCByZWcwKTsKK30KKworCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNSwgd29ya19idWRnZXQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJc3Bpbl9sb2NrICgmdHAtPmxvY2spOworCisJZG8geworCQljc3I1ID0gaW5sKGlvYWRkciArIENTUjUpOworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJb3V0bChjc3I1ICYgMHgwMDAxZmZmZiwgaW9hZGRyICsgQ1NSNSk7CisKKwkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAgY3NyNT0lIzguOHggbmV3IGNzcjU9JSM4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGNzcjUsIGlubChkZXYtPmJhc2VfYWRkciArIENTUjUpKTsKKworCQlpZiAoY3NyNSA9PSAweGZmZmZmZmZmKQorCQkJYnJlYWs7CS8qIGFsbCBiaXRzIHNldCwgYXNzdW1lIFBDTUNJQSBjYXJkIHJlbW92ZWQgKi8KKworCQlpZiAoKGNzcjUgJiAoTm9ybWFsSW50cnxBYm5vcm1hbEludHIpKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKGNzcjUgJiAoUnhJbnRyIHwgUnhOb0J1ZikpCisJCQl3b3JrX2J1ZGdldCAtPSB4aXJjb21fcngoZGV2KTsKKworCQlpZiAoY3NyNSAmIChUeE5vQnVmIHwgVHhEaWVkIHwgVHhJbnRyKSkgeworCQkJdW5zaWduZWQgaW50IGRpcnR5X3R4OworCisJCQlmb3IgKGRpcnR5X3R4ID0gdHAtPmRpcnR5X3R4OyB0cC0+Y3VyX3R4IC0gZGlydHlfdHggPiAwOworCQkJCSBkaXJ0eV90eCsrKSB7CisJCQkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQkJaW50IHN0YXR1cyA9IHRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CisKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCQkJCS8qIENoZWNrIGZvciBSeCBmaWx0ZXIgc2V0dXAgZnJhbWVzLiAqLworCQkJCWlmICh0cC0+dHhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKQorCQkJCSAgY29udGludWU7CisKKwkJCQlpZiAoc3RhdHVzICYgVHgwRGVzY0Vycm9yKSB7CisJCQkJCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKwkJCQkJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgVHgwTWFueUNvbGwpIHsKKwkJCQkJCXRwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQl9CisJCQkJCWlmIChzdGF0dXMgJiBUeDBOb0NhcnJpZXIpIHRwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgVHgwTGF0ZUNvbGwpIHRwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiBUeDBVbmRlcmZsb3cpIHRwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisJCQkJCXRwLT5zdGF0cy50eF9ieXRlcyArPSB0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoICYgMHg3ZmY7CisJCQkJCXRwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgPj4gMykgJiAxNTsKKwkJCQkJdHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQl9CisKKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJZGV2X2tmcmVlX3NrYl9pcnEodHAtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJCXRwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAodHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gVFhfUklOR19TSVpFKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVkLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBkaXJ0eV90eCwgdHAtPmN1cl90eCwgdHAtPnR4X2Z1bGwpOworCQkJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAodHAtPnR4X2Z1bGwgJiYKKwkJCSAgICB0cC0+Y3VyX3R4IC0gZGlydHlfdHggIDwgVFhfUklOR19TSVpFIC0gMikKKwkJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCAqLworCQkJCXRwLT50eF9mdWxsID0gMDsKKworCQkJaWYgKHRwLT50eF9mdWxsKQorCQkJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCQllbHNlCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKworCQkJdHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCQlpZiAoY3NyNSAmIFR4RGllZCkgeworCQkJCWlmICh4aXJjb21fZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhlIHRyYW5zbWl0dGVyIHN0b3BwZWQuIgorCQkJCQkJICAgIiAgQ1NSNSBpcyAleCwgQ1NSNiAleCwgbmV3IENTUjYgJXguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBjc3I1LCBpbmwoaW9hZGRyICsgQ1NSNiksIHRwLT5jc3I2KTsKKwkJCQlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVSeCwgaW9hZGRyKTsKKwkJCQlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVUeFJ4LCBpb2FkZHIpOworCQkJfQorCQl9CisKKwkJLyogTG9nIGVycm9ycy4gKi8KKwkJaWYgKGNzcjUgJiBBYm5vcm1hbEludHIpIHsJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeSBiaXQuICovCisJCQlpZiAoY3NyNSAmIExpbmtDaGFuZ2UpCisJCQkJeGlyY29tX21lZGlhX2NoYW5nZShkZXYpOworCQkJaWYgKGNzcjUgJiBUeEZJRk9VbmRlcmZsb3cpIHsKKwkJCQlpZiAoKHRwLT5jc3I2ICYgVHhUaHJlc2hNYXNrKSAhPSBUeFRocmVzaE1hc2spCisJCQkJCXRwLT5jc3I2ICs9ICgxIDw8IFR4VGhyZXNoU2hpZnQpOwkvKiBCdW1wIHVwIHRoZSBUeCB0aHJlc2hvbGQgKi8KKwkJCQllbHNlCisJCQkJCXRwLT5jc3I2IHw9IFR4U3RvcmVGb3J3OyAgLyogU3RvcmUtbi1mb3J3YXJkLiAqLworCQkJCS8qIFJlc3RhcnQgdGhlIHRyYW5zbWl0IHByb2Nlc3MuICovCisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlUngsIGlvYWRkcik7CisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkJCX0KKwkJCWlmIChjc3I1ICYgUnhEaWVkKSB7CQkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwkJCQl0cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5sKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCQkJCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVR4UngsIGlvYWRkcik7CisJCQl9CisJCQkvKiBDbGVhciBhbGwgZXJyb3Igc291cmNlcywgaW5jbHVkZWQgdW5kb2N1bWVudGVkIG9uZXMhICovCisJCQlvdXRsKDB4MDgwMGY3YmEsIGlvYWRkciArIENTUjUpOworCQl9CisJCWlmICgtLXdvcmtfYnVkZ2V0IDwgMCkgeworCQkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgZHVyaW5nIGFuIGludGVycnVwdCwgIgorCQkJCQkgICAiY3NyNT0weCU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBjc3I1KTsKKwkJCS8qIEFja25vd2xlZGdlIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwkJCW91dGwoMHg4MDAxZmZmZiwgaW9hZGRyICsgQ1NSNSk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKHhpcmNvbV9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzcjU9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW5sKGlvYWRkciArIENTUjUpKTsKKworCXNwaW5fdW5sb2NrICgmdHAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyBpbnQKK3hpcmNvbV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IHRwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IHJ4X3dvcmtfbGltaXQgPSB0cC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSB0cC0+Y3VyX3J4OworCWludCB3b3JrX2RvbmUgPSAwOworCisJaWYgKHhpcmNvbV9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4geGlyY29tX3J4KCksIGVudHJ5ICVkICU4Ljh4LlxuIiwgZW50cnksCisJCQkgICB0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKwkvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID49IDApIHsKKwkJczMyIHN0YXR1cyA9IHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXM7CisKKwkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIHhpcmNvbV9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJCSAgIHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCQlpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworCQkJaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKwkJCQkvKiBJZ25vcmUgZWFybGllciBidWZmZXJzLiAqLworCQkJCWlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKwkJCQkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKwkJCQkJCQkgICAic3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCBzdGF0dXMgJTguOHghXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4MERlc2NFcnJvcikgeworCQkJCS8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworCQkJCWlmICh4aXJjb21fZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCQlpZiAoc3RhdHVzICYgKFJ4MFJ1bnQgfCBSeDBIdWdlRnJhbWUpKSB0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBSeDBDUkNFcnJvcikgdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAocGt0X2xlbiA+IDE1MTgpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4sIHBrdF9sZW4pOworCQkJCXBrdF9sZW4gPSAxNTE4OworCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQl9CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKyNpZiAhIGRlZmluZWQoX19hbHBoYV9fKQorCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBidXNfdG9fdmlydCh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksCisJCQkJCQkJCSBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisjZWxzZQorCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJCSAgIGJ1c190b192aXJ0KHRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSwgcGt0X2xlbik7CisjZW5kaWYKKwkJCQl3b3JrX2RvbmUrKzsKKwkJCX0gZWxzZSB7IAkvKiBQYXNzIHVwIHRoZSBza2IgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKwkJCQlza2JfcHV0KHNrYiA9IHRwLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQl0cC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJdHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkJZW50cnkgPSAoKyt0cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgdHAtPmN1cl9yeCAtIHRwLT5kaXJ0eV9yeCA+IDA7IHRwLT5kaXJ0eV9yeCsrKSB7CisJCWVudHJ5ID0gdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAodHAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXNrYiA9IHRwLT5yeF9za2J1ZmZbZW50cnldID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT50YWlsKTsKKwkJCXdvcmtfZG9uZSsrOworCQl9CisJCXRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBSeDBEZXNjT3duZWQ7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworCitzdGF0aWMgdm9pZAoreGlyY29tX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKDAsIGlvYWRkciArIENTUjcpOworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCW91dGxfQ1NSNihpbmwoaW9hZGRyICsgQ1NSNikgJiB+RW5hYmxlVHhSeCwgaW9hZGRyKTsKKworCWlmIChpbmwoaW9hZGRyICsgQ1NSNikgIT0gMHhmZmZmZmZmZikKKwkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5sKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCisJZGV2LT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7Cit9CisKKworc3RhdGljIGludAoreGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW5sKGlvYWRkciArIENTUjUpKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQl4aXJjb21fZG93bihkZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0cC0+cnhfc2tidWZmW2ldOworCQl0cC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJdHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsJCS8qIE5vdCBvd25lZCBieSBYaXJjb20gY2hpcC4gKi8KKwkJdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gMDsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IDB4QkFERjAwRDA7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAodHAtPnR4X3NrYnVmZltpXSkKKwkJCWRldl9rZnJlZV9za2IodHAtPnR4X3NrYnVmZltpXSk7CisJCXRwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKworCXRwLT5vcGVuID0gMDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlubChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKworCXJldHVybiAmdHAtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHhpcmNvbV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWVjbWQtPnN1cHBvcnRlZCA9CisJCQlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCVNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJU1VQUE9SVEVEX01JSTsKKworCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9NSUk7CisJaWYgKHRwLT5hZHZlcnRpc2luZ1swXSAmIEFEVkVSVElTRV8xMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCWlmICh0cC0+YWR2ZXJ0aXNpbmdbMF0gJiBBRFZFUlRJU0VfMTBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwlpZiAodHAtPmFkdmVydGlzaW5nWzBdICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAodHAtPmFkdmVydGlzaW5nWzBdICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwlpZiAodHAtPmF1dG9uZWcpIHsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJfSBlbHNlCisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisKKwllY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWVjbWQtPnBoeV9hZGRyZXNzID0gdHAtPnBoeXNbMF07CisJZWNtZC0+c3BlZWQgPSB0cC0+c3BlZWQxMDAgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwllY21kLT5kdXBsZXggPSB0cC0+ZnVsbF9kdXBsZXggPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCWVjbWQtPm1heHR4cGt0ID0gVFhfUklOR19TSVpFIC8gMjsKKwllY21kLT5tYXhyeHBrdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGlyY29tX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGF1dG9uZWcsIHNwZWVkMTAwLCBmdWxsX2R1cGxleDsKKworCWF1dG9uZWcgPSAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSk7CisJc3BlZWQxMDAgPSAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKTsKKwlmdWxsX2R1cGxleCA9IChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpOworCisJdHAtPmF1dG9uZWcgPSBhdXRvbmVnOworCWlmIChzcGVlZDEwMCAhPSB0cC0+c3BlZWQxMDAgfHwKKwkgICAgZnVsbF9kdXBsZXggIT0gdHAtPmZ1bGxfZHVwbGV4KSB7CisJCXRwLT5zcGVlZDEwMCA9IHNwZWVkMTAwOworCQl0cC0+ZnVsbF9kdXBsZXggPSBmdWxsX2R1cGxleDsKKwkJLyogY2hhbmdlIGFkdmVydGlzaW5nIGJpdHMgKi8KKwkJdHAtPmFkdmVydGlzaW5nWzBdICY9IH4oQURWRVJUSVNFXzEwSEFMRiB8CisJCQkJICAgICBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMDBGVUxMIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMDBCQVNFNCk7CisJCWlmIChzcGVlZDEwMCkgeworCQkJaWYgKGZ1bGxfZHVwbGV4KQorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJCWVsc2UKKwkJCQl0cC0+YWR2ZXJ0aXNpbmdbMF0gfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCX0gZWxzZSB7CisJCQlpZiAoZnVsbF9kdXBsZXgpCisJCQkJdHAtPmFkdmVydGlzaW5nWzBdIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCQllbHNlCisJCQkJdHAtPmFkdmVydGlzaW5nWzBdIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCX0KKwl9CisJY2hlY2tfZHVwbGV4KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhpcmNvbV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBkZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IHhpcmNvbV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IHhpcmNvbV9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0geGlyY29tX2dldF9kcnZpbmZvLAorfTsKKworLyogUHJvdmlkZSBpb2N0bCgpIGNhbGxzIHRvIGV4YW1pbmUgdGhlIE1JSSB4Y3ZyIHN0YXRlLiAqLworc3RhdGljIGludCB4aXJjb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgKmRhdGEgPSAodTE2ICopJnJxLT5pZnJfaWZydTsKKwlpbnQgcGh5ID0gdHAtPnBoeXNbMF0gJiAweDFmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2goY21kKSB7CisJLyogTGVnYWN5IG1paS1kaWFnIGludGVyZmFjZSAqLworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJaWYgKHRwLT5taWlfY250KQorCQkJZGF0YVswXSA9IHBoeTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAwOworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJZGF0YVszXSA9IG1kaW9fcmVhZChkZXYsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZik7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCWNsaSgpOworCQlpZiAoZGF0YVswXSA9PSB0cC0+cGh5c1swXSkgeworCQkJdTE2IHZhbHVlID0gZGF0YVsyXTsKKwkJCXN3aXRjaCAoZGF0YVsxXSkgeworCQkJY2FzZSAwOgorCQkJCWlmICh2YWx1ZSAmIChCTUNSX1JFU0VUIHwgQk1DUl9BTkVOQUJMRSkpCisJCQkJCS8qIEF1dG9uZWdvdGlhdGlvbi4gKi8KKwkJCQkJdHAtPmF1dG9uZWcgPSAxOworCQkJCWVsc2UgeworCQkJCQl0cC0+ZnVsbF9kdXBsZXggPSAodmFsdWUgJiBCTUNSX0ZVTExEUExYKSA/IDEgOiAwOworCQkJCQl0cC0+YXV0b25lZyA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSA9IHZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQkJY2hlY2tfZHVwbGV4KGRldik7CisJCX0KKwkJbWRpb193cml0ZShkZXYsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIE5vdGUgdGhhdCB3ZSBvbmx5IHVzZSBleGNsdXNpb24gYXJvdW5kIGFjdHVhbGx5IHF1ZXVlaW5nIHRoZQorICAgbmV3IGZyYW1lLCBub3QgYXJvdW5kIGZpbGxpbmcgdHAtPnNldHVwX2ZyYW1lLiAgVGhpcyBpcyBub24tZGV0ZXJtaW5pc3RpYworICAgd2hlbiByZS1lbnRlcmVkIGJ1dCBzdGlsbCBjb3JyZWN0LiAqLworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpOworCXUxNiAqZWFkZHJzLCAqc2V0dXBfZnJtOworCXUzMiB0eF9mbGFnczsKKwlpbnQgaTsKKworCXRwLT5jc3I2ICY9IH4oQWxsTXVsdGlCaXQgfCBQcm9taXNjQml0IHwgSGFzaEZpbHRlckJpdCk7CisJY3NyNiAmPSB+KEFsbE11bHRpQml0IHwgUHJvbWlzY0JpdCB8IEhhc2hGaWx0ZXJCaXQpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCXRwLT5jc3I2IHw9IFByb21pc2NCaXQ7CisJCWNzcjYgfD0gUHJvbWlzY0JpdDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChkZXYtPm1jX2NvdW50ID4gMTAwMCkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsIC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJdHAtPmNzcjYgfD0gQWxsTXVsdGlCaXQ7CisJCWNzcjYgfD0gQWxsTXVsdGlCaXQ7CisJCWdvdG8gb3V0OworCX0KKworCXR4X2ZsYWdzID0gVHgxV2hvbGVQa3QgfCBUeDFTZXR1cFBrdCB8IFBLVF9TRVRVUF9TWjsKKworCS8qIE5vdGUgdGhhdCBvbmx5IHRoZSBsb3ctYWRkcmVzcyBzaG9ydHdvcmQgb2Ygc2V0dXBfZnJhbWUgaXMgdmFsaWQhICovCisJc2V0dXBfZnJtID0gdHAtPnNldHVwX2ZyYW1lOworCW1jbGlzdCA9IGRldi0+bWNfbGlzdDsKKworCS8qIEZpbGwgdGhlIGZpcnN0IGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1swXSk7IHNldHVwX2ZybSArPSAyOworCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMV0pOyBzZXR1cF9mcm0gKz0gMjsKKwkqc2V0dXBfZnJtID0gY3B1X3RvX2xlMTYoZWFkZHJzWzJdKTsgc2V0dXBfZnJtICs9IDI7CisKKwlpZiAoZGV2LT5tY19jb3VudCA+IDE0KSB7IC8qIE11c3QgdXNlIGEgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCXUzMiAqaGFzaF90YWJsZSA9ICh1MzIgKikodHAtPnNldHVwX2ZyYW1lICsgNCAqIDEyKTsKKwkJdTMyIGhhc2gsIGhhc2gyOworCisJCXR4X2ZsYWdzIHw9IFR4MUhhc2hTZXR1cDsKKwkJdHAtPmNzcjYgfD0gSGFzaEZpbHRlckJpdDsKKwkJY3NyNiB8PSBIYXNoRmlsdGVyQml0OworCisJCS8qIEZpbGwgdGhlIHVudXNlZCAzIGVudHJpZXMgd2l0aCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuCisJCSAgIEF0IGxlYXN0IG9uZSBlbnRyeSAqbXVzdCogY29udGFpbiB0aGUgYnJvYWRjYXN0IGFkZHJlc3MhISEqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCX0KKworCQkvKiBUcnVseSBicmFpbi1kYW1hZ2VkIGhhc2ggZmlsdGVyIGxheW91dCAqLworCQkvKiBYWFg6IG5vdCBzdXJlIGlmIEkgc2hvdWxkIHRha2UgdGhlIGxhc3Qgb3IgdGhlIGZpcnN0IDkgYml0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXUzMiAqaHB0cjsKKwkJCWhhc2ggPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgxZmY7CisJCQlpZiAoaGFzaCA8IDM4NCkgeworCQkJCWhhc2gyID0gaGFzaCArICgoaGFzaCA+PiA0KSA8PCA0KSArCisJCQkJCSgoaGFzaCA+PiA1KSA8PCA1KTsKKwkJCX0gZWxzZSB7CisJCQkJaGFzaCAtPSAzODQ7CisJCQkJaGFzaDIgPSA2NCArIGhhc2ggKyAoaGFzaCA+PiA0KSAqIDgwOworCQkJfQorCQkJaHB0ciA9ICZoYXNoX3RhYmxlW2hhc2gyICYgfjB4MWZdOworCQkJKmhwdHIgfD0gY3B1X3RvX2xlMzIoMSA8PCAoaGFzaDIgJiAweDFmKSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIDw9IDE0IG1jYXN0IGFkZHJlc3NlcyBzbyB3ZSBjYW4gdXNlIFhpcmNvbSdzCisJCSAgIHdvbmRlcmZ1bCAxNi1hZGRyZXNzIHBlcmZlY3QgZmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWVhZGRycyA9ICh1MTYgKiltY2xpc3QtPmRtaV9hZGRyOworCQkJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1swXSk7IHNldHVwX2ZybSArPSAyOworCQkJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1sxXSk7IHNldHVwX2ZybSArPSAyOworCQkJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1syXSk7IHNldHVwX2ZybSArPSAyOworCQl9CisJCS8qIEZpbGwgdGhlIHVudXNlZCBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLgorCQkgICBBdCBsZWFzdCBvbmUgZW50cnkgKm11c3QqIGNvbnRhaW4gdGhlIGJyb2FkY2FzdCBhZGRyZXNzISEhKi8KKwkJZm9yICg7IGkgPCAxNTsgaSsrKSB7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCX0KKwl9CisKKwkvKiBOb3cgYWRkIHRoaXMgZnJhbWUgdG8gdGhlIFR4IGxpc3QuICovCisJaWYgKHRwLT5jdXJfdHggLSB0cC0+ZGlydHlfdHggPiBUWF9SSU5HX1NJWkUgLSAyKSB7CisJCS8qIFNhbWUgc2V0dXAgcmVjZW50bHkgcXVldWVkLCB3ZSBuZWVkIG5vdCBhZGQgaXQuICovCisJCS8qIFhYWDogSHVoPyBBbGwgaXQgbWVhbnMgaXMgdGhhdCB0aGUgVHggbGlzdCBpcyBmdWxsLi4uKi8KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1bnNpZ25lZCBpbnQgZW50cnk7CisJCWludCBkdW1teSA9IC0xOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwkJZW50cnkgPSB0cC0+Y3VyX3R4KysgJSBUWF9SSU5HX1NJWkU7CisKKwkJaWYgKGVudHJ5ICE9IDApIHsKKwkJCS8qIEF2b2lkIGEgY2hpcCBlcnJhdGEgYnkgcHJlZml4aW5nIGEgZHVtbXkgZW50cnkuICovCisJCQl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0KKwkJCQkoZW50cnkgPT0gVFhfUklOR19TSVpFIC0gMSkgPyBUeDFSaW5nV3JhcCA6IDA7CisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IDA7CisJCQkvKiByYWNlIHdpdGggY2hpcCwgc2V0IFR4MERlc2NPd25lZCBsYXRlciAqLworCQkJZHVtbXkgPSBlbnRyeTsKKwkJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCQl9CisKKwkJdHAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkvKiBQdXQgdGhlIHNldHVwIGZyYW1lIG9uIHRoZSBUeCBsaXN0LiAqLworCQlpZiAoZW50cnkgPT0gVFhfUklOR19TSVpFIC0gMSkKKwkJCXR4X2ZsYWdzIHw9IFR4MVJpbmdXcmFwOwkJLyogV3JhcCByaW5nLiAqLworCQl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gdHhfZmxhZ3M7CisJCXRwLT50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXModHAtPnNldHVwX2ZyYW1lKTsKKwkJdHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IFR4MERlc2NPd25lZDsKKwkJaWYgKHRwLT5jdXJfdHggLSB0cC0+ZGlydHlfdHggPj0gVFhfUklOR19TSVpFIC0gMikgeworCQkJdHAtPnR4X2Z1bGwgPSAxOworCQkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJfQorCQlpZiAoZHVtbXkgPj0gMCkKKwkJCXRwLT50eF9yaW5nW2R1bW15XS5zdGF0dXMgPSBUeDBEZXNjT3duZWQ7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJCW91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisJfQorCitvdXQ6CisJb3V0bF9DU1I2KGNzcjYsIGlvYWRkcik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHhpcmNvbV9wY2lfdGFibGVbXSA9IHsKKyAgeyAweDExNUQsIDB4MDAwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgWDMyMDFfMyB9LAorICB7MH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHhpcmNvbV9wY2lfdGFibGUpOworCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgeGlyY29tX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaW50ayhLRVJOX0lORk8gInhpcmNvbV9zdXNwZW5kKCVzKVxuIiwgZGV2LT5uYW1lKTsKKwlpZiAodHAtPm9wZW4pCisJCXhpcmNvbV9kb3duKGRldik7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeGlyY29tX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaW50ayhLRVJOX0lORk8gInhpcmNvbV9yZXN1bWUoJXMpXG4iLCBkZXYtPm5hbWUpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LDApOworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogQnJpbmcgdGhlIGNoaXAgb3V0IG9mIHNsZWVwIG1vZGUuCisJICAgQ2F1dGlvbjogU25vb3plIG1vZGUgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUgYm9hcmRzISAqLworCWlmICh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS5mbGFncyAmIEhBU19BQ1BJKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBQQ0lfUE9XRVJNR01ULCAwKTsKKworCXRyYW5zY2VpdmVyX3Zvb2RvbyhkZXYpOworCWlmICh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS5mbGFncyAmIEhBU19NSUkpCisJCWNoZWNrX2R1cGxleChkZXYpOworCisJaWYgKHRwLT5vcGVuKQorCQl4aXJjb21fdXAoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgeGlyY29tX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gInhpcmNvbV9yZW1vdmVfb25lKCVzKVxuIiwgZGV2LT5uYW1lKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHhpcmNvbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0geGlyY29tX3BjaV90YWJsZSwKKwkucHJvYmUJCT0geGlyY29tX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoeGlyY29tX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0geGlyY29tX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB4aXJjb21fcmVzdW1lCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHhpcmNvbV9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ4aXJjb21fZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgeGlyY29tX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnhpcmNvbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4aXJjb21faW5pdCkKK21vZHVsZV9leGl0KHhpcmNvbV9leGl0KQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZlZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiAgVFVOIC0gVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlci4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgJElkOiB0dW4uYyx2IDEuMTUgMjAwMi8wMy8wMSAwMjo0NDoyNCBtYXhrIEV4cCAkCisgKi8KKworLyoKKyAqICBDaGFuZ2VzOgorICoKKyAqICBNYXJrIFNtaXRoIDxtYXJrenp6c21pdGhAeWFob28uY29tLmF1PgorICogICBVc2UgcmFuZG9tX2V0aGVyX2FkZHIoKSBmb3IgdGFwIE1BQyBhZGRyZXNzLgorICoKKyAqICBIYXJhbGQgUm9lbGxlIDxoYXJhbGQucm9lbGxlQGlmaS5sbXUuZGU+ICAyMDA0LzA0LzIwCisgKiAgICBGaXhlcyBpbiBwYWNrZXQgZHJvcHBpbmcsIHF1ZXVlIGxlbmd0aCBzZXR0aW5nIGFuZCBxdWV1ZSB3YWtldXAuCisgKiAgICBJbmNyZWFzZWQgZGVmYXVsdCB0eCBxdWV1ZSBsZW5ndGguCisgKiAgICBBZGRlZCBldGh0b29sIEFQSS4KKyAqICAgIE1pbm9yIGNsZWFudXBzCisgKgorICogIERhbmllbCBQb2RsZWpza2kgPHVuZGVybGV5QHVuZGVybGV5LmV1Lm9yZz4KKyAqICAgIE1vZGlmaWNhdGlvbnMgZm9yIDIuMy45OS1wcmU1IGtlcm5lbC4KKyAqLworCisjZGVmaW5lIERSVl9OQU1FCSJ0dW4iCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjYiCisjZGVmaW5lIERSVl9ERVNDUklQVElPTgkiVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlciIKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiKEMpIDE5OTktMjAwNCBNYXggS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPiIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgVFVOX0RFQlVHCitzdGF0aWMgaW50IGRlYnVnOworI2VuZGlmCisKKy8qIE5ldHdvcmsgZGV2aWNlIHBhcnQgb2YgdGhlIGRyaXZlciAqLworCitzdGF0aWMgTElTVF9IRUFEKHR1bl9kZXZfbGlzdCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHR1bl9ldGh0b29sX29wczsKKworLyogTmV0IGRldmljZSBvcGVuLiAqLworc3RhdGljIGludCB0dW5fbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBOZXQgZGV2aWNlIGNsb3NlLiAqLworc3RhdGljIGludCB0dW5fbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBOZXQgZGV2aWNlIHN0YXJ0IHhtaXQgKi8KK3N0YXRpYyBpbnQgdHVuX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX25ldF94bWl0ICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCisJLyogRHJvcCBwYWNrZXQgaWYgaW50ZXJmYWNlIGlzIG5vdCBhdHRhY2hlZCAqLworCWlmICghdHVuLT5hdHRhY2hlZCkKKwkJZ290byBkcm9wOworCisJLyogUGFja2V0IGRyb3BwaW5nICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnR1bi0+cmVhZHEpID49IGRldi0+dHhfcXVldWVfbGVuKSB7CisJCWlmICghKHR1bi0+ZmxhZ3MgJiBUVU5fT05FX1FVRVVFKSkgeworCQkJLyogTm9ybWFsIHF1ZXVlaW5nIG1vZGUuICovCisJCQkvKiBQYWNrZXQgc2NoZWR1bGVyIGhhbmRsZXMgZHJvcHBpbmcgb2YgZnVydGhlciBwYWNrZXRzLiAqLworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCQkvKiBXZSB3b24ndCBzZWUgYWxsIGRyb3BwZWQgcGFja2V0cyBpbmRpdmlkdWFsbHksIHNvIG92ZXJydW4KKwkJCSAqIGVycm9yIGlzIG1vcmUgYXBwcm9wcmlhdGUuICovCisJCQl0dW4tPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQkvKiBTaW5nbGUgcXVldWUgbW9kZS4KKwkJCSAqIERyaXZlciBoYW5kbGVzIGRyb3BwaW5nIG9mIGFsbCBwYWNrZXRzIGl0c2VsZi4gKi8KKwkJCWdvdG8gZHJvcDsKKwkJfQorCX0KKworCS8qIFF1ZXVlIHBhY2tldCAqLworCXNrYl9xdWV1ZV90YWlsKCZ0dW4tPnJlYWRxLCBza2IpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogTm90aWZ5IGFuZCB3YWtlIHVwIHJlYWRlciBwcm9jZXNzICovCisJaWYgKHR1bi0+ZmxhZ3MgJiBUVU5fRkFTWU5DKQorCQlraWxsX2Zhc3luYygmdHVuLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR1bi0+cmVhZF93YWl0KTsKKwlyZXR1cm4gMDsKKworZHJvcDoKKwl0dW4tPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIEFkZCB0aGUgc3BlY2lmaWVkIEV0aGVybmV0IGFkZHJlc3MgdG8gdGhpcyBtdWx0aWNhc3QgZmlsdGVyLiAqLworc3RhdGljIHZvaWQKK2FkZF9tdWx0aSh1MzIqIGZpbHRlciwgY29uc3QgdTgqIGFkZHIpCit7CisJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcikgPj4gMjY7CisJZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7Cit9CisKKy8qKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBFdGhlcm5ldCBhZGRyZXMgZnJvbSB0aGlzIG11bHRpY2FzdCBmaWx0ZXIuICovCitzdGF0aWMgdm9pZAorZGVsX211bHRpKHUzMiogZmlsdGVyLCBjb25zdCB1OCogYWRkcikKK3sKKwlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRyKSA+PiAyNjsKKwlmaWx0ZXJbYml0X25yID4+IDVdICY9IH4oMSA8PCAoYml0X25yICYgMzEpKTsKK30KKworLyoqIFVwZGF0ZSB0aGUgbGlzdCBvZiBtdWx0aWNhc3QgZ3JvdXBzIHRvIHdoaWNoIHRoZSBuZXR3b3JrIGRldmljZSBiZWxvbmdzLgorICogVGhpcyBsaXN0IGlzIHVzZWQgdG8gZmlsdGVyIHBhY2tldHMgYmVpbmcgc2VudCBmcm9tIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIHRvCisgKiB0aGUgbmV0d29yayBkZXZpY2UuICovCitzdGF0aWMgdm9pZAordHVuX25ldF9tY2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKwlEQkcoS0VSTl9ERUJVRyAiJXM6IHR1bl9uZXRfbWNsaXN0OiBtY19jb3VudCAlZFxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisJbWVtc2V0KHR1bi0+Y2hyX2ZpbHRlciwgMCwgc2l6ZW9mIHR1bi0+Y2hyX2ZpbHRlcik7CisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBpIDwgZGV2LT5tY19jb3VudCAmJiBtY2xpc3QgIT0gTlVMTDsKKwkJCWkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCWFkZF9tdWx0aSh0dW4tPm5ldF9maWx0ZXIsIG1jbGlzdC0+ZG1pX2FkZHIpOworCQlEQkcoS0VSTl9ERUJVRyAiJXM6IHR1bl9uZXRfbWNsaXN0OiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQlkZXYtPm5hbWUsCisJCQkJbWNsaXN0LT5kbWlfYWRkclswXSwgbWNsaXN0LT5kbWlfYWRkclsxXSwgbWNsaXN0LT5kbWlfYWRkclsyXSwKKwkJCQltY2xpc3QtPmRtaV9hZGRyWzNdLCBtY2xpc3QtPmRtaV9hZGRyWzRdLCBtY2xpc3QtPmRtaV9hZGRyWzVdKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdHVuX25ldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmdHVuLT5zdGF0czsKK30KKworLyogSW5pdGlhbGl6ZSBuZXQgZGV2aWNlLiAqLworc3RhdGljIHZvaWQgdHVuX25ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisgICAKKwlzd2l0Y2ggKHR1bi0+ZmxhZ3MgJiBUVU5fVFlQRV9NQVNLKSB7CisJY2FzZSBUVU5fVFVOX0RFVjoKKwkJLyogUG9pbnQtdG8tUG9pbnQgVFVOIERldmljZSAqLworCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7CisJCWRldi0+YWRkcl9sZW4gPSAwOworCQlkZXYtPm10dSA9IDE1MDA7CisKKwkJLyogWmVybyBoZWFkZXIgbGVuZ3RoICovCisJCWRldi0+dHlwZSA9IEFSUEhSRF9OT05FOyAKKwkJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUCB8IElGRl9NVUxUSUNBU1Q7CisJCWRldi0+dHhfcXVldWVfbGVuID0gVFVOX1JFQURRX1NJWkU7ICAvKiBXZSBwcmVmZXIgb3VyIG93biBxdWV1ZSBsZW5ndGggKi8KKwkJYnJlYWs7CisKKwljYXNlIFRVTl9UQVBfREVWOgorCQkvKiBFdGhlcm5ldCBUQVAgRGV2aWNlICovCisJCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdHVuX25ldF9tY2xpc3Q7CisKKwkJZXRoZXJfc2V0dXAoZGV2KTsKKwkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CisJCWRldi0+dHhfcXVldWVfbGVuID0gVFVOX1JFQURRX1NJWkU7ICAvKiBXZSBwcmVmZXIgb3VyIG93biBxdWV1ZSBsZW5ndGggKi8KKwkJYnJlYWs7CisJfQorfQorCisvKiBDaGFyYWN0ZXIgZGV2aWNlIHBhcnQgKi8KKworLyogUG9sbCAqLworc3RhdGljIHVuc2lnbmVkIGludCB0dW5fY2hyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreyAgCisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfcG9sbFxuIiwgdHVuLT5kZXYtPm5hbWUpOworCisJcG9sbF93YWl0KGZpbGUsICZ0dW4tPnJlYWRfd2FpdCwgd2FpdCk7CisgCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnR1bi0+cmVhZHEpKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gbWFzazsKK30KKworLyogR2V0IHBhY2tldCBmcm9tIHVzZXIgc3BhY2UgYnVmZmVyICovCitzdGF0aWMgX19pbmxpbmVfXyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgaW92ZWMgKml2LCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHR1bl9waSBwaSA9IHsgMCwgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkgfTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBsZW4gPSBjb3VudCwgYWxpZ24gPSAwOworCisJaWYgKCEodHVuLT5mbGFncyAmIFRVTl9OT19QSSkpIHsKKwkJaWYgKChsZW4gLT0gc2l6ZW9mKHBpKSkgPiBjb3VudCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmKG1lbWNweV9mcm9taW92ZWMoKHZvaWQgKikmcGksIGl2LCBzaXplb2YocGkpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgodHVuLT5mbGFncyAmIFRVTl9UWVBFX01BU0spID09IFRVTl9UQVBfREVWKQorCQlhbGlnbiA9IE5FVF9JUF9BTElHTjsKKyAKKwlpZiAoIShza2IgPSBhbGxvY19za2IobGVuICsgYWxpZ24sIEdGUF9LRVJORUwpKSkgeworCQl0dW4tPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGFsaWduKQorCQlza2JfcmVzZXJ2ZShza2IsIGFsaWduKTsKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgbGVuKSwgaXYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc2tiLT5kZXYgPSB0dW4tPmRldjsKKwlzd2l0Y2ggKHR1bi0+ZmxhZ3MgJiBUVU5fVFlQRV9NQVNLKSB7CisJY2FzZSBUVU5fVFVOX0RFVjoKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPnByb3RvY29sID0gcGkucHJvdG87CisJCWJyZWFrOworCWNhc2UgVFVOX1RBUF9ERVY6CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi0+ZGV2KTsKKwkJYnJlYWs7CisJfTsKKworCWlmICh0dW4tPmZsYWdzICYgVFVOX05PQ0hFQ0tTVU0pCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisgCisJbmV0aWZfcnhfbmkoc2tiKTsKKwl0dW4tPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgICAKKwl0dW4tPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwl0dW4tPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCXJldHVybiBjb3VudDsKK30gCisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGlvdl90b3RhbChjb25zdCBzdHJ1Y3QgaW92ZWMgKml2LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzaXplX3QgbGVuOworCisJZm9yIChpID0gMCwgbGVuID0gMDsgaSA8IGNvdW50OyBpKyspIAorCQlsZW4gKz0gaXZbaV0uaW92X2xlbjsKKworCXJldHVybiBsZW47Cit9CisKKy8qIFdyaXRldiAqLworc3RhdGljIHNzaXplX3QgdHVuX2Nocl93cml0ZXYoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKml2LCAKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXR1bikKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX2Nocl93cml0ZSAlbGRcbiIsIHR1bi0+ZGV2LT5uYW1lLCBjb3VudCk7CisKKwlyZXR1cm4gdHVuX2dldF91c2VyKHR1biwgKHN0cnVjdCBpb3ZlYyAqKSBpdiwgaW92X3RvdGFsKGl2LCBjb3VudCkpOworfQorCisvKiBXcml0ZSAqLworc3RhdGljIHNzaXplX3QgdHVuX2Nocl93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCAKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgaXYgPSB7ICh2b2lkIF9fdXNlciAqKSBidWYsIGNvdW50IH07CisJcmV0dXJuIHR1bl9jaHJfd3JpdGV2KGZpbGUsICZpdiwgMSwgcG9zKTsKK30KKworLyogUHV0IHBhY2tldCB0byB0aGUgdXNlciBzcGFjZSBidWZmZXIgKi8KK3N0YXRpYyBfX2lubGluZV9fIHNzaXplX3QgdHVuX3B1dF91c2VyKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBpb3ZlYyAqaXYsIGludCBsZW4pCit7CisJc3RydWN0IHR1bl9waSBwaSA9IHsgMCwgc2tiLT5wcm90b2NvbCB9OworCXNzaXplX3QgdG90YWwgPSAwOworCisJaWYgKCEodHVuLT5mbGFncyAmIFRVTl9OT19QSSkpIHsKKwkJaWYgKChsZW4gLT0gc2l6ZW9mKHBpKSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGxlbiA8IHNrYi0+bGVuKSB7CisJCQkvKiBQYWNrZXQgd2lsbCBiZSBzdHJpcGVkICovCisJCQlwaS5mbGFncyB8PSBUVU5fUEtUX1NUUklQOworCQl9CisgCisJCWlmIChtZW1jcHlfdG9pb3ZlYyhpdiwgKHZvaWQgKikgJnBpLCBzaXplb2YocGkpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0b3RhbCArPSBzaXplb2YocGkpOworCX0gICAgICAgCisKKwlsZW4gPSBtaW5fdChpbnQsIHNrYi0+bGVuLCBsZW4pOworCisJc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBpdiwgbGVuKTsKKwl0b3RhbCArPSBsZW47CisKKwl0dW4tPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl0dW4tPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKworCXJldHVybiB0b3RhbDsKK30KKworLyogUmVhZHYgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaXYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNzaXplX3QgbGVuLCByZXQgPSAwOworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfcmVhZFxuIiwgdHVuLT5kZXYtPm5hbWUpOworCisJbGVuID0gaW92X3RvdGFsKGl2LCBjb3VudCk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoJnR1bi0+cmVhZF93YWl0LCAmd2FpdCk7CisJd2hpbGUgKGxlbikgeworCQljb25zdCB1OCBvbmVzWyBFVEhfQUxFTl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwkJdTggYWRkclsgRVRIX0FMRU5dOworCQlpbnQgYml0X25yOworCisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCisJCS8qIFJlYWQgZnJhbWVzIGZyb20gdGhlIHF1ZXVlICovCisJCWlmICghKHNrYj1za2JfZGVxdWV1ZSgmdHVuLT5yZWFkcSkpKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBOb3RoaW5nIHRvIHJlYWQsIGxldCdzIHNsZWVwICovCisJCQlzY2hlZHVsZSgpOworCQkJY29udGludWU7CisJCX0KKwkJbmV0aWZfd2FrZV9xdWV1ZSh0dW4tPmRldik7CisKKwkJLyoqIERlY2lkZSB3aGV0aGVyIHRvIGFjY2VwdCB0aGlzIHBhY2tldC4gVGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvCisJCSAqIGJlaGF2ZSBpZGVudGljYWxseSB0byBhbiBFdGhlcm5ldCBpbnRlcmZhY2UuIEFjY2VwdCB0aGUgcGFja2V0IGlmCisJCSAqIC0gd2UgYXJlIHByb21pc2N1b3VzLgorCQkgKiAtIHRoZSBwYWNrZXQgaXMgYWRkcmVzc2VkIHRvIHVzLgorCQkgKiAtIHRoZSBwYWNrZXQgaXMgYnJvYWRjYXN0LgorCQkgKiAtIHRoZSBwYWNrZXQgaXMgbXVsdGljYXN0IGFuZAorCQkgKiAgIC0gd2UgYXJlIG11bHRpY2FzdCBwcm9taXNjb3VzLgorCQkgKiAgIC0gd2UgYmVsb25nIHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAuCisJCSAqLworCQltZW1jcHkoYWRkciwgc2tiLT5kYXRhLAorCQkgICAgICAgbWluX3Qoc2l6ZV90LCBzaXplb2YgYWRkciwgc2tiLT5sZW4pKTsKKwkJYml0X25yID0gZXRoZXJfY3JjKHNpemVvZiBhZGRyLCBhZGRyKSA+PiAyNjsKKwkJaWYgKCh0dW4tPmlmX2ZsYWdzICYgSUZGX1BST01JU0MpIHx8CisJCQkJbWVtY21wKGFkZHIsIHR1bi0+ZGV2X2FkZHIsIHNpemVvZiBhZGRyKSA9PSAwIHx8CisJCQkJbWVtY21wKGFkZHIsIG9uZXMsIHNpemVvZiBhZGRyKSA9PSAwIHx8CisJCQkJKCgoYWRkclswXSA9PSAxICYmIGFkZHJbMV0gPT0gMCAmJiBhZGRyWzJdID09IDB4NWUpIHx8CisJCQkJICAoYWRkclswXSA9PSAweDMzICYmIGFkZHJbMV0gPT0gMHgzMykpICYmCisJCQkJICgodHVuLT5pZl9mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkJCQkgICh0dW4tPmNocl9maWx0ZXJbYml0X25yID4+IDVdICYgKDEgPDwgKGJpdF9uciAmIDMxKSkpKSkpIHsKKwkJCURCRyhLRVJOX0RFQlVHICIlczogdHVuX2Nocl9yZWFkdjogYWNjZXB0ZWQ6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCQl0dW4tPmRldi0+bmFtZSwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwKKwkJCQkJYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJCQlyZXQgPSB0dW5fcHV0X3VzZXIodHVuLCBza2IsIChzdHJ1Y3QgaW92ZWMgKikgaXYsIGxlbik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJREJHKEtFUk5fREVCVUcgIiVzOiB0dW5fY2hyX3JlYWR2OiByZWplY3RlZDogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJCXR1bi0+ZGV2LT5uYW1lLCBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLAorCQkJCQlhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHVuLT5yZWFkX3dhaXQsICZ3YWl0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlYWQgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCAKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpb3ZlYyBpdiA9IHsgYnVmLCBjb3VudCB9OworCXJldHVybiB0dW5fY2hyX3JlYWR2KGZpbGUsICZpdiwgMSwgcG9zKTsKK30KKworc3RhdGljIHZvaWQgdHVuX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ0dW4tPnJlYWRxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0dW4tPnJlYWRfd2FpdCk7CisKKwl0dW4tPm93bmVyID0gLTE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuID0gdHVuX25ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdHVuX25ldF94bWl0OworCWRldi0+c3RvcCA9IHR1bl9uZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB0dW5fbmV0X3N0YXRzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmdHVuX2V0aHRvb2xfb3BzOworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworfQorCitzdGF0aWMgc3RydWN0IHR1bl9zdHJ1Y3QgKnR1bl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW47CisKKwlBU1NFUlRfUlROTCgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodHVuLCAmdHVuX2Rldl9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcCh0dW4tPmRldi0+bmFtZSwgbmFtZSwgSUZOQU1TSVopKQorCQkgICAgcmV0dXJuIHR1bjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB0dW5fc2V0X2lmZihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlmcmVxICppZnIpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1bjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisKKwl0dW4gPSB0dW5fZ2V0X2J5X25hbWUoaWZyLT5pZnJfbmFtZSk7CisJaWYgKHR1bikgeworCQlpZiAodHVuLT5hdHRhY2hlZCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJLyogQ2hlY2sgcGVybWlzc2lvbnMgKi8KKwkJaWYgKHR1bi0+b3duZXIgIT0gLTEgJiYKKwkJICAgIGN1cnJlbnQtPmV1aWQgIT0gdHVuLT5vd25lciAmJiAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJfSAKKwllbHNlIGlmIChfX2Rldl9nZXRfYnlfbmFtZShpZnItPmlmcl9uYW1lKSkgCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgeworCQljaGFyICpuYW1lOworCQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCQllcnIgPSAtRUlOVkFMOworCisJCS8qIFNldCBkZXYgdHlwZSAqLworCQlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfVFVOKSB7CisJCQkvKiBUVU4gZGV2aWNlICovCisJCQlmbGFncyB8PSBUVU5fVFVOX0RFVjsKKwkJCW5hbWUgPSAidHVuJWQiOworCQl9IGVsc2UgaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX1RBUCkgeworCQkJLyogVEFQIGRldmljZSAqLworCQkJZmxhZ3MgfD0gVFVOX1RBUF9ERVY7CisJCQluYW1lID0gInRhcCVkIjsKKwkJfSBlbHNlIAorCQkJZ290byBmYWlsZWQ7CisgICAKKwkJaWYgKCppZnItPmlmcl9uYW1lKQorCQkJbmFtZSA9IGlmci0+aWZyX25hbWU7CisKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgdHVuX3N0cnVjdCksIG5hbWUsCisJCQkJICAgdHVuX3NldHVwKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQl0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCQl0dW4tPmRldiA9IGRldjsKKwkJdHVuLT5mbGFncyA9IGZsYWdzOworCQkvKiBCZSBwcm9taXNjdW91cyBieSBkZWZhdWx0IHRvIG1haW50YWluIHByZXZpb3VzIGJlaGF2aW91ci4gKi8KKwkJdHVuLT5pZl9mbGFncyA9IElGRl9QUk9NSVNDOworCQkvKiBHZW5lcmF0ZSByYW5kb20gRXRoZXJuZXQgYWRkcmVzcy4gKi8KKwkJKih1MTYgKil0dW4tPmRldl9hZGRyID0gaHRvbnMoMHgwMEZGKTsKKwkJZ2V0X3JhbmRvbV9ieXRlcyh0dW4tPmRldl9hZGRyICsgc2l6ZW9mKHUxNiksIDQpOworCQltZW1zZXQodHVuLT5jaHJfZmlsdGVyLCAwLCBzaXplb2YgdHVuLT5jaHJfZmlsdGVyKTsKKworCQl0dW5fbmV0X2luaXQoZGV2KTsKKworCQlpZiAoc3RyY2hyKGRldi0+bmFtZSwgJyUnKSkgeworCQkJZXJyID0gZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpOworCQkJaWYgKGVyciA8IDApCisJCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCX0KKworCQllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UodHVuLT5kZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQorCQlsaXN0X2FkZCgmdHVuLT5saXN0LCAmdHVuX2Rldl9saXN0KTsKKwl9CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX3NldF9pZmZcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCWlmIChpZnItPmlmcl9mbGFncyAmIElGRl9OT19QSSkKKwkJdHVuLT5mbGFncyB8PSBUVU5fTk9fUEk7CisKKwlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfT05FX1FVRVVFKQorCQl0dW4tPmZsYWdzIHw9IFRVTl9PTkVfUVVFVUU7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSB0dW47CisJdHVuLT5hdHRhY2hlZCA9IDE7CisKKwlzdHJjcHkoaWZyLT5pZnJfbmFtZSwgdHVuLT5kZXYtPm5hbWUpOworCXJldHVybiAwOworCisgZXJyX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisgZmFpbGVkOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdHVuX2Nocl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciogYXJncCA9ICh2b2lkIF9fdXNlciopYXJnOworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZiAoY21kID09IFRVTlNFVElGRiB8fCBfSU9DX1RZUEUoY21kKSA9PSAweDg5KQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgYXJncCwgc2l6ZW9mIGlmcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjbWQgPT0gVFVOU0VUSUZGICYmICF0dW4pIHsKKwkJaW50IGVycjsKKworCQlpZnIuaWZyX25hbWVbSUZOQU1TSVotMV0gPSAnXDAnOworCisJCXJ0bmxfbG9jaygpOworCQllcnIgPSB0dW5fc2V0X2lmZihmaWxlLCAmaWZyKTsKKwkJcnRubF91bmxvY2soKTsKKworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpZnIsIHNpemVvZihpZnIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXR1bikKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX2Nocl9pb2N0bCBjbWQgJWRcbiIsIHR1bi0+ZGV2LT5uYW1lLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRVTlNFVE5PQ1NVTToKKwkJLyogRGlzYWJsZS9FbmFibGUgY2hlY2tzdW0gKi8KKwkJaWYgKGFyZykKKwkJCXR1bi0+ZmxhZ3MgfD0gVFVOX05PQ0hFQ0tTVU07CisJCWVsc2UKKwkJCXR1bi0+ZmxhZ3MgJj0gflRVTl9OT0NIRUNLU1VNOworCisJCURCRyhLRVJOX0lORk8gIiVzOiBjaGVja3N1bSAlc1xuIiwKKwkJICAgIHR1bi0+ZGV2LT5uYW1lLCBhcmcgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFRVTlNFVFBFUlNJU1Q6CisJCS8qIERpc2FibGUvRW5hYmxlIHBlcnNpc3QgbW9kZSAqLworCQlpZiAoYXJnKQorCQkJdHVuLT5mbGFncyB8PSBUVU5fUEVSU0lTVDsKKwkJZWxzZQorCQkJdHVuLT5mbGFncyAmPSB+VFVOX1BFUlNJU1Q7CisKKwkJREJHKEtFUk5fSU5GTyAiJXM6IHBlcnNpc3QgJXNcbiIsCisJCSAgICB0dW4tPmRldi0+bmFtZSwgYXJnID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisJCWJyZWFrOworCisJY2FzZSBUVU5TRVRPV05FUjoKKwkJLyogU2V0IG93bmVyIG9mIHRoZSBkZXZpY2UgKi8KKwkJdHVuLT5vd25lciA9ICh1aWRfdCkgYXJnOworCisJCURCRyhLRVJOX0lORk8gIiVzOiBvd25lciBzZXQgdG8gJWRcbiIsIHR1bi0+ZGV2LT5uYW1lLCB0dW4tPm93bmVyKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBUVU5fREVCVUcKKwljYXNlIFRVTlNFVERFQlVHOgorCQl0dW4tPmRlYnVnID0gYXJnOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBTSU9DR0lGRkxBR1M6CisJCWlmci5pZnJfZmxhZ3MgPSB0dW4tPmlmX2ZsYWdzOworCQlpZiAoY29weV90b191c2VyKCBhcmdwLCAmaWZyLCBzaXplb2YgaWZyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NJRkZMQUdTOgorCQkvKiogU2V0IHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgaW50ZXJmYWNlIGZsYWdzLiBDdXJyZW50bHkgb25seQorCQkgKiBJRkZfUFJPTUlTQyBhbmQgSUZGX0FMTE1VTFRJIGFyZSB1c2VkLiAqLworCQl0dW4tPmlmX2ZsYWdzID0gaWZyLmlmcl9mbGFnczsKKwkJREJHKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSBmbGFncyAweCVseFxuIiwKKwkJCQl0dW4tPmRldi0+bmFtZSwgdHVuLT5pZl9mbGFncyk7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DR0lGSFdBRERSOgorCQltZW1jcHkoaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgdHVuLT5kZXZfYWRkciwKKwkJCQltaW4oc2l6ZW9mIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHNpemVvZiB0dW4tPmRldl9hZGRyKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoIGFyZ3AsICZpZnIsIHNpemVvZiBpZnIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DU0lGSFdBRERSOgorCQkvKiogU2V0IHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgaGFyZHdhcmUgYWRkcmVzcy4gVGhpcyBpcyB1c2VkIHdoZW4KKwkJICogZmlsdGVyaW5nIHBhY2tldHMgYmVpbmcgc2VudCBmcm9tIHRoZSBuZXR3b3JrIGRldmljZSB0byB0aGUgY2hhcmFjdGVyCisJCSAqIGRldmljZS4gKi8KKwkJbWVtY3B5KHR1bi0+ZGV2X2FkZHIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsCisJCQkJbWluKHNpemVvZiBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBzaXplb2YgdHVuLT5kZXZfYWRkcikpOworCQlEQkcoS0VSTl9ERUJVRyAiJXM6IHNldCBoYXJkd2FyZSBhZGRyZXNzOiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQl0dW4tPmRldi0+bmFtZSwKKwkJCQl0dW4tPmRldl9hZGRyWzBdLCB0dW4tPmRldl9hZGRyWzFdLCB0dW4tPmRldl9hZGRyWzJdLAorCQkJCXR1bi0+ZGV2X2FkZHJbM10sIHR1bi0+ZGV2X2FkZHJbNF0sIHR1bi0+ZGV2X2FkZHJbNV0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ0FERE1VTFRJOgorCQkvKiogQWRkIHRoZSBzcGVjaWZpZWQgZ3JvdXAgdG8gdGhlIGNoYXJhY3RlciBkZXZpY2UncyBtdWx0aWNhc3QgZmlsdGVyCisJCSAqIGxpc3QuICovCisJCWFkZF9tdWx0aSh0dW4tPmNocl9maWx0ZXIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEpOworCQlEQkcoS0VSTl9ERUJVRyAiJXM6IGFkZCBtdWx0aTogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbMF0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzFdLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzJdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVszXSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVs0XSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbNV0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ0RFTE1VTFRJOgorCQkvKiogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZ3JvdXAgZnJvbSB0aGUgY2hhcmFjdGVyIGRldmljZSdzIG11bHRpY2FzdAorCQkgKiBmaWx0ZXIgbGlzdC4gKi8KKwkJZGVsX211bHRpKHR1bi0+Y2hyX2ZpbHRlciwgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSk7CisJCURCRyhLRVJOX0RFQlVHICIlczogZGVsIG11bHRpOiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQl0dW4tPmRldi0+bmFtZSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVswXSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbMV0sCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbMl0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzNdLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzRdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVs1XSk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bl9jaHJfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIXR1bikKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX2Nocl9mYXN5bmMgJWRcbiIsIHR1bi0+ZGV2LT5uYW1lLCBvbik7CisKKwlpZiAoKHJldCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmdHVuLT5mYXN5bmMpKSA8IDApCisJCXJldHVybiByZXQ7IAorIAorCWlmIChvbikgeworCQlyZXQgPSBmX3NldG93bihmaWxlLCBjdXJyZW50LT5waWQsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJdHVuLT5mbGFncyB8PSBUVU5fRkFTWU5DOworCX0gZWxzZSAKKwkJdHVuLT5mbGFncyAmPSB+VFVOX0ZBU1lOQzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bl9jaHJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJREJHMShLRVJOX0lORk8gInR1blg6IHR1bl9jaHJfb3BlblxuIik7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5fY2hyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXR1bikKKwkJcmV0dXJuIDA7CisKKwlEQkcoS0VSTl9JTkZPICIlczogdHVuX2Nocl9jbG9zZVxuIiwgdHVuLT5kZXYtPm5hbWUpOworCisJdHVuX2Nocl9mYXN5bmMoLTEsIGZpbGUsIDApOworCisJcnRubF9sb2NrKCk7CisKKwkvKiBEZXRhY2ggZnJvbSBuZXQgZGV2aWNlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl0dW4tPmF0dGFjaGVkID0gMDsKKworCS8qIERyb3AgcmVhZCBxdWV1ZSAqLworCXNrYl9xdWV1ZV9wdXJnZSgmdHVuLT5yZWFkcSk7CisKKwlpZiAoISh0dW4tPmZsYWdzICYgVFVOX1BFUlNJU1QpKSB7CisJCWxpc3RfZGVsKCZ0dW4tPmxpc3QpOworCQl1bnJlZ2lzdGVyX25ldGRldmljZSh0dW4tPmRldik7CisJfQorCisJcnRubF91bmxvY2soKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0dW5fZm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwJCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVhZAk9IHR1bl9jaHJfcmVhZCwKKwkucmVhZHYJPSB0dW5fY2hyX3JlYWR2LAorCS53cml0ZQk9IHR1bl9jaHJfd3JpdGUsCisJLndyaXRldiA9IHR1bl9jaHJfd3JpdGV2LAorCS5wb2xsCT0gdHVuX2Nocl9wb2xsLAorCS5pb2N0bAk9IHR1bl9jaHJfaW9jdGwsCisJLm9wZW4JPSB0dW5fY2hyX29wZW4sCisJLnJlbGVhc2UgPSB0dW5fY2hyX2Nsb3NlLAorCS5mYXN5bmMgPSB0dW5fY2hyX2Zhc3luYwkJCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdHVuX21pc2NkZXYgPSB7CisJLm1pbm9yID0gVFVOX01JTk9SLAorCS5uYW1lID0gInR1biIsCisJLmZvcHMgPSAmdHVuX2ZvcHMsCisJLmRldmZzX25hbWUgPSAibmV0L3R1biIsCit9OworCisvKiBldGh0b29sIGludGVyZmFjZSAqLworCitzdGF0aWMgaW50IHR1bl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJY21kLT5zdXBwb3J0ZWQJCT0gMDsKKwljbWQtPmFkdmVydGlzaW5nCT0gMDsKKwljbWQtPnNwZWVkCQk9IFNQRUVEXzEwOworCWNtZC0+ZHVwbGV4CQk9IERVUExFWF9GVUxMOworCWNtZC0+cG9ydAkJPSBQT1JUX1RQOworCWNtZC0+cGh5X2FkZHJlc3MJPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIJPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+YXV0b25lZwkJPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdAkJPSAwOworCWNtZC0+bWF4cnhwa3QJCT0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHVuX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCisJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgeworCWNhc2UgVFVOX1RVTl9ERVY6CisJCXN0cmNweShpbmZvLT5idXNfaW5mbywgInR1biIpOworCQlicmVhazsKKwljYXNlIFRVTl9UQVBfREVWOgorCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJ0YXAiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdTMyIHR1bl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBUVU5fREVCVUcKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdHVuLT5kZWJ1ZzsKKyNlbHNlCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHR1bl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworI2lmZGVmIFRVTl9ERUJVRworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXR1bi0+ZGVidWcgPSB2YWx1ZTsKKyNlbmRpZgorfQorCitzdGF0aWMgdTMyIHR1bl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiB0dW4tPmF0dGFjaGVkOworfQorCitzdGF0aWMgdTMyIHR1bl9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAodHVuLT5mbGFncyAmIFRVTl9OT0NIRUNLU1VNKSA9PSAwOworfQorCitzdGF0aWMgaW50IHR1bl9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoZGF0YSkKKwkJdHVuLT5mbGFncyAmPSB+VFVOX05PQ0hFQ0tTVU07CisJZWxzZQorCQl0dW4tPmZsYWdzIHw9IFRVTl9OT0NIRUNLU1VNOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHR1bl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0gdHVuX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JPSB0dW5fZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAk9IHR1bl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9IHR1bl9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rCT0gdHVuX2dldF9saW5rLAorCS5nZXRfcnhfY3N1bQk9IHR1bl9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JPSB0dW5fc2V0X3J4X2NzdW0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR1bl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0dW46ICVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAidHVuOiAlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ0dW5fbWlzY2Rldik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJ0dW46IENhbid0IHJlZ2lzdGVyIG1pc2MgZGV2aWNlICVkXG4iLCBUVU5fTUlOT1IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR1bl9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgKm54dDsKKworCW1pc2NfZGVyZWdpc3RlcigmdHVuX21pc2NkZXYpOyAgCisKKwlydG5sX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHVuLCBueHQsICZ0dW5fZGV2X2xpc3QsIGxpc3QpIHsKKwkJREJHKEtFUk5fSU5GTyAiJXMgY2xlYW5lZCB1cFxuIiwgdHVuLT5kZXYtPm5hbWUpOworCQl1bnJlZ2lzdGVyX25ldGRldmljZSh0dW4tPmRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7CisJCit9CisKK21vZHVsZV9pbml0KHR1bl9pbml0KTsKK21vZHVsZV9leGl0KHR1bl9jbGVhbnVwKTsKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFRVTl9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLWZpcm13YXJlLmggYi9kcml2ZXJzL25ldC90eXBob29uLWZpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmNDdkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24tZmlybXdhcmUuaApAQCAtMCwwICsxLDM3NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDA0IDNDb20gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIG9mIHRoZSAzYzk5MGltZy5oCisgKiBtaWNyb2NvZGUgc29mdHdhcmUgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiAzQ29tIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSAzQ09NIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFVTRVIgQUNLTk9XTEVER0VTIEFORCBBR1JFRVMgVEhBVCBQVVJDSEFTRSBPUiBVU0UgT0YgVEhFIDNjOTkwaW1nLmgKKyAqIE1JQ1JPQ09ERSBTT0ZUV0FSRSBXSUxMIE5PVCBDUkVBVEUgT1IgR0lWRSBHUk9VTkRTIEZPUiBBIExJQ0VOU0UgQlkKKyAqIElNUExJQ0FUSU9OLCBFU1RPUFBFTCwgT1IgT1RIRVJXSVNFIElOIEFOWSBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTCisgKiAoUEFURU5ULCBDT1BZUklHSFQsIFRSQURFIFNFQ1JFVCwgTUFTSyBXT1JLLCBPUiBPVEhFUiBQUk9QUklFVEFSWSBSSUdIVCkKKyAqIEVNQk9ESUVEIElOIEFOWSBPVEhFUiAzQ09NIEhBUkRXQVJFIE9SIFNPRlRXQVJFIEVJVEhFUiBTT0xFTFkgT1IgSU4KKyAqIENPTUJJTkFUSU9OIFdJVEggVEhFIDNjOTkwaW1nLmggTUlDUk9DT0RFIFNPRlRXQVJFCisgKi8gCisKKyAvKiB2ZXIgMDMuMDAxLjAwOCAqLworc3RhdGljIGNvbnN0IHU4IHR5cGhvb25fZmlybXdhcmVfaW1hZ2VbXSA9IHsKKzB4NTQsIDB4NTksIDB4NTAsIDB4NDgsIDB4NGYsIDB4NGYsIDB4NGUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhjYiwgMHg5OSwgMHhiMSwgMHhkNCwgCisweDRjLCAweGI4LCAweGQwLCAweDRiLCAweDMyLCAweDAyLCAweGQ0LCAweGVlLCAweDczLCAweDdlLCAweDBiLCAweDEzLCAKKzB4OWIsIDB4YzAsIDB4YWUsIDB4ZjQsIDB4NDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4ZmMsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgzOSwgMHgwMCwgMHgwMCwgMHhlYSwgMHgwNSwgMHgwMCwgMHgwMCwgMHhlYSwgCisweDA0LCAweDAwLCAweDAwLCAweGVhLCAweDAzLCAweDAwLCAweDAwLCAweGVhLCAweDAyLCAweDAwLCAweDAwLCAweGVhLCAKKzB4MDEsIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MzIsIDB4MDIsIDB4MDAsIDB4ZWEsIDB4YzUsIDB4MTQsIDB4MDAsIDB4ZWEsIAorMHgwNywgMHgwMCwgMHgyZCwgMHhlOSwgMHgwZSwgMHgwMCwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHgwZiwgMHhlMSwgCisweGQwLCAweDIwLCAweDlmLCAweGU1LCAweDEyLCAweGZmLCAweDJmLCAweGUxLCAweGZlLCAweGZmLCAweGZmLCAweGVhLCAKKzB4MDEsIDB4MDAsIDB4ODAsIDB4ZTAsIDB4MDQsIDB4MjAsIDB4ODEsIDB4ZTQsIDB4MDEsIDB4MDAsIDB4NTAsIDB4ZTEsIAorMHhmYywgMHhmZiwgMHhmZiwgMHgxYSwgMHgwZSwgMHhmMCwgMHhhMCwgMHhlMSwgMHgwMCwgMHhhMCwgMHhhMCwgMHhlMSwgCisweDBlLCAweGIwLCAweGEwLCAweGUxLCAweDAwLCAweDAwLCAweGEwLCAweGUzLCAweGE4LCAweDEwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIDB4YTQsIDB4MTAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIAorMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgMHgwMCwgMHgwMCwgMHg5MSwgMHhlNSwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMywgCisweDAwLCAweDAwLCAweDgxLCAweGU1LCAweGQ3LCAweDAwLCAweGEwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4ODgsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4ZGIsIDB4MDAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIAorMHg3YywgMHhkMCwgMHg5ZiwgMHhlNSwgMHhkMiwgMHgwMCwgMHhhMCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDc0LCAweGQwLCAweDlmLCAweGU1LCAweGQxLCAweDAwLCAweGEwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4NmMsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4OWIsIDB4MTQsIDB4MDAsIDB4ZWIsIDB4ZDMsIDB4MDAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHg2MCwgMHhkMCwgMHg5ZiwgMHhlNSwgMHg2MCwgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDYwLCAweDEwLCAweDlmLCAweGU1LCAweDYwLCAweDIwLCAweDlmLCAweGU1LCAweGRiLCAweGZmLCAweGZmLCAweGViLCAKKzB4NWMsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4NWMsIDB4MTAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MjAsIDB4YTAsIDB4ZTMsIAorMHhkNywgMHhmZiwgMHhmZiwgMHhlYiwgMHg1NCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHg1NCwgMHgxMCwgMHg5ZiwgMHhlNSwgCisweGQ0LCAweGZmLCAweGZmLCAweGViLCAweDBhLCAweDAwLCAweGEwLCAweGUxLCAweDBiLCAweGYwLCAweGEwLCAweGUxLCAKKzB4ZDMsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4ZDQsIDB4ZmYsIDB4ZmYsIDB4ZWIsIAorMHgzYywgMHhhMCwgMHg5ZiwgMHhlNSwgMHgxYSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhjNiwgMHhmZiwgMHhmZiwgMHhlYSwgCisweDE1LCAweDIxLCAweGZmLCAweGZmLCAweDBjLCAweDAwLCAweDEwLCAweDAwLCAweDFjLCAweDAwLCAweDEwLCAweDAwLCAKKzB4M2MsIDB4MzgsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4MzcsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4M2YsIDB4MDAsIDB4ODAsIAorMHg3YywgMHgzNCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHgzMCwgMHgwMCwgMHg4MCwgCisweGFkLCAweGRlLCAweGFkLCAweGRlLCAweGIwLCAweGJiLCAweDAwLCAweDAwLCAweDI0LCAweGFiLCAweDIwLCAweDQwLCAKKzB4NDgsIDB4MjksIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4YmQsIDB4YmEsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NTgsIDB4NTcsIDB4MDAsIDB4MDAsIDB4ODYsIDB4NGIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4ZmYsIDB4ZmYsIAorMHhiMCwgMHhiNSwgMHgwNywgMHgxYywgMHgxMiwgMHg0ZCwgMHgwMCwgMHgyNCwgMHgyOCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweDFlLCAweGQwLCAweDM4LCAweDFjLCAweDEwLCAweDQ5LCAweDA0LCAweGYwLCAweDdiLCAweGZkLCAweDI5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4MjgsIDB4MTUsIDB4ZDAsIDB4MzgsIDB4MDEsIDB4MGQsIDB4NDksIAorMHg0MCwgMHgxOCwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg0MSwgMHg2YiwgMHg4MCwgMHgyOSwgCisweDBjLCAweGQyLCAweDAxLCAweDMxLCAweDQxLCAweDYzLCAweDI4LCAweDY4LCAweGMxLCAweDY5LCAweGMwLCAweDQ2LCAKKzB4MjksIDB4NjAsIDB4MzksIDB4MDcsIDB4NDEsIDB4NjAsIDB4MDQsIDB4NjIsIDB4YzcsIDB4NjIsIDB4YjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyMCwgMHgxYywgMHhmYSwgMHhlNywgMHhlOCwgMHgxNywgMHgwMCwgMHg4MCwgCisweGVlLCAweDA1LCAweDAwLCAweDAwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAweDAyLCAweDQ5LCAweDBhLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4YzIsIDB4NjEsIDB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHhlOCwgMHgxNywgMHgwMCwgMHg4MCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweGUxLCAweDAwLCAweDEwLCAweGEwLCAweGUxLCAKKzB4YzAsIDB4MTAsIDB4ODEsIDB4ZTMsIDB4MDEsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgCisweGMwLCAweDAwLCAweDgwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAKKzB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4YzAsIDB4MDAsIDB4YzAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHg0MCwgMHgwMCwgMHg4MCwgMHhlMywgCisweDAwLCAweGYwLCAweDIxLCAweGUxLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweDAwLCAweDBmLCAweGUxLCAKKzB4ODAsIDB4MDAsIDB4MTAsIDB4ZTMsIDB4ODAsIDB4MDAsIDB4ODAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgwMCwgMHg1MCwgMHhlMywgCisweDAwLCAweDAwLCAweDBmLCAweGUxLCAweDgwLCAweDAwLCAweGMwLCAweDEzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4ODAsIDB4MDAsIDB4YzAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHg5MSwgMHgwMCwgMHgwMCwgMHhlMCwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAxLCAweDIwLCAweDgwLCAweGUwLCAweDAxLCAweDAwLCAweDgwLCAweGUwLCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ODAsIDB4YjUsIDB4MDgsIDB4NGYsIDB4NjQsIDB4MjgsIDB4MDQsIDB4ZDMsIAorMHg2NCwgMHgyMCwgMHgzOCwgMHg2MywgMHgwMCwgMHgyMCwgMHhjMCwgMHg0MywgMHgwMywgMHhlMCwgMHgzOCwgMHg2MywgCisweDA0LCAweDQ5LCAweDA1LCAweGYwLCAweDAxLCAweGZiLCAweDc4LCAweDYzLCAweGI4LCAweDYzLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODgsIDB4MTMsIDB4MDAsIDB4MDAsIAorMHg4MCwgMHhiNCwgMHgxMCwgMHg0YiwgMHgwMCwgMHgyMiwgMHgxZiwgMHg2YiwgMHg2NCwgMHgyZiwgMHgwMywgMHhkMiwgCisweDA5LCAweDY4LCAweDA5LCAweDY4LCAweDQ5LCAweDA4LCAweDAyLCAweGQyLCAweDEwLCAweDFjLCAweDgwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MTksIDB4MWMsIDB4ZGIsIDB4NmIsIDB4NGYsIDB4NmIsIDB4YmIsIDB4NDIsIDB4MDUsIDB4ZDIsIAorMHg0MCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgxOCwgMHgxOCwgMHhjOCwgMHg2MywgMHhmMSwgMHhlNywgCisweDQxLCAweDY4LCAweDA1LCAweDRiLCAweDE5LCAweDQzLCAweDQxLCAweDYwLCAweDA0LCAweDQ4LCAweGMxLCAweDZiLCAKKzB4MDEsIDB4MzEsIDB4YzEsIDB4NjMsIDB4MDIsIDB4MjAsIDB4ZTgsIDB4ZTcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgCisweDE1LCAweDRjLCAweDAwLCAweDIwLCAweDIxLCAweDZiLCAweDY0LCAweDI5LCAweDBiLCAweGQyLCAweGI5LCAweDZlLCAKKzB4NDksIDB4MDgsIDB4MDgsIDB4ZDMsIDB4MjEsIDB4NmMsIDB4YTIsIDB4NmIsIDB4OTEsIDB4NDIsIDB4MDcsIDB4ZDIsIAorMHhmYSwgMHgxZCwgMHgzOSwgMHgzMiwgMHg1MiwgMHg4YiwgMHg4OSwgMHgxOCwgMHgyMSwgMHg2NCwgMHg5MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDc4LCAweDZhLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDQ4LCAweDYyLCAKKzB4MzgsIDB4NmIsIDB4MDIsIDB4ZjAsIDB4MmQsIDB4ZmUsIDB4MzgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4ZTgsIDB4ZmEsIAorMHgwMSwgMHgyMCwgMHhiYiwgMHgyMywgMHgxYiwgMHgwMSwgMHhlMSwgMHgxOCwgMHhjOCwgMHg3MywgMHgwNSwgMHg0OSwgCisweDBhLCAweDZjLCAweDEyLCAweDE4LCAweDBhLCAweDY0LCAweDA0LCAweDQ5LCAweDhhLCAweDZkLCAweDEyLCAweDE4LCAKKzB4OGEsIDB4NjUsIDB4ZTQsIDB4ZTcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNCwgMHgwYSwgMHg0OCwgMHhjMCwgMHg2ZCwgMHgwMiwgMHgyMywgCisweDE4LCAweDQwLCAweDA5LCAweDRhLCAweDAwLCAweDIxLCAweDAwLCAweDI4LCAweDAzLCAweGQwLCAweGQxLCAweDYzLCAKKzB4MTEsIDB4NjQsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDYsIDB4NDgsIDB4MDcsIDB4NjgsIDB4N2IsIDB4MWMsIAorMHgwMywgMHg2MCwgMHgwYSwgMHgyZiwgMHhmNywgMHhkMywgMHgwMSwgMHg2MCwgMHhmMywgMHhlNywgMHgwMCwgMHgwMCwgCisweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGUwLCAweDAxLCAweDAwLCAweDgwLCAKKzB4NzAsIDB4NDcsIDB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MDAsIDB4MGMsIDB4MTAsIDB4MTgsIDB4MGEsIDB4MDQsIAorMHgxMiwgMHgwYywgMHgwOSwgMHgwYywgMHg1MSwgMHgxOCwgMHgwOCwgMHgxOCwgMHgwMSwgMHgwYywgMHgwNSwgMHhkMCwgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDAwLCAweDBjLCAweDA4LCAweDE4LCAweDAxLCAweDBjLCAweGY5LCAweGQxLCAKKzB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4NzAsIDB4NDcsIDB4ODAsIDB4YjQsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MjksIAorMHgxOCwgMHhkMCwgMHg0ZiwgMHgwOCwgMHg3YiwgMHgxZSwgMHgwMCwgMHgyZiwgCisweDA2LCAweGQwLCAweDA3LCAweDg4LCAweGJhLCAweDE4LCAweDAyLCAweDMwLCAweDFmLCAweDFjLCAweDAxLCAweDNiLCAKKzB4MDAsIDB4MmYsIDB4ZjgsIDB4ZDEsIDB4NDksIDB4MDgsIDB4MDMsIDB4ZDMsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHg4MiwgMHgxOCwgMHgxMCwgMHgwYywgMHgwNSwgMHhkMCwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDExLCAweDBjLCAweDQyLCAweDE4LCAweDEwLCAweDBjLCAweGY5LCAweGQxLCAweDEwLCAweDA0LCAweDAwLCAweDBjLCAKKzB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ODAsIDB4YjUsIDB4ODMsIDB4ODksIDB4YzcsIDB4ODksIDB4ZmIsIDB4MTgsIAorMHgwNywgMHg4YSwgMHhmYiwgMHgxOCwgMHg0NywgMHg4YSwgMHhmYiwgMHgxOCwgMHg0MCwgMHg3YSwgMHgwMCwgMHgwMiwgCisweGM3LCAweDE4LCAweDM4LCAweDBjLCAweDA1LCAweGQwLCAweDM4LCAweDA0LCAweDAwLCAweDBjLCAweDNiLCAweDBjLCAKKzB4YzcsIDB4MTgsIDB4MzgsIDB4MGMsIDB4ZjksIDB4ZDEsIDB4MDgsIDB4MWMsIDB4MTEsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHhjOCwgMHhmZiwgMHgwMSwgMHgxYywgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhiMCwgMHhmZiwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDkwLCAweGI1LCAweDAyLCAweDIzLCAweDgyLCAweDY4LCAweDFhLCAweDQwLCAKKzB4MDAsIDB4MjcsIDB4MDAsIDB4MmEsIDB4MGYsIDB4ZDAsIDB4MGEsIDB4NGEsIDB4OTMsIDB4NjksIDB4MDEsIDB4MzMsIAorMHg5MywgMHg2MSwgMHgwYSwgMHg2OCwgMHg4YiwgMHg2OCwgMHg5YSwgMHgxOCwgMHgwMCwgMHg2OCwgMHgxYywgMHgxOCwgCisweDU3LCAweDgxLCAweDA5LCAweDY5LCAweDEwLCAweDFjLCAweGZmLCAweGY3LCAweGFjLCAweGZmLCAweGMwLCAweDQzLCAKKzB4NjAsIDB4ODEsIDB4MzgsIDB4MWMsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNCwgMHgyMywgMHg4MiwgMHg2OCwgMHgxYSwgMHg0MCwgCisweDAwLCAweDI3LCAweDAwLCAweDJhLCAweDExLCAweGQwLCAweDRhLCAweDY4LCAweDUyLCAweDA5LCAweDBlLCAweGQzLCAKKzB4MDksIDB4NGEsIDB4MTMsIDB4NmEsIDB4MDEsIDB4MzMsIDB4MTMsIDB4NjIsIDB4Y2IsIDB4NjgsIDB4MDIsIDB4NjgsIAorMHg5YywgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwOCwgMHgzYSwgMHgxYSwgMHg0MywgMHgxMiwgMHg2OCwgCisweDAwLCAweGYwLCAweDJlLCAweGY4LCAweDIwLCAweDgyLCAweDM4LCAweDFjLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4ODAsIDB4MjMsIAorMHg4MiwgMHg2OCwgMHgxYSwgMHg0MCwgMHgwMCwgMHgyNCwgMHgwMCwgMHgyYSwgMHgxNSwgMHhkMCwgMHg0YSwgMHg2OCwgCisweDkyLCAweDA5LCAweDEyLCAweGQzLCAweDBiLCAweDRhLCAweGQzLCAweDY5LCAweDAxLCAweDMzLCAweGQzLCAweDYxLCAKKzB4Y2IsIDB4NjgsIDB4MDIsIDB4NjgsIDB4OWYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4M2EsIAorMHgxYSwgMHg0MywgMHgxMiwgMHg2OCwgMHgwMCwgMHhmMCwgMHgwZSwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwMCwgMHhkMSwgCisweDA0LCAweDQ4LCAweGMwLCAweDQ2LCAweGY4LCAweDgwLCAweDIwLCAweDFjLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHhiMCwgMHhiNSwgMHgxNCwgMHgxYywgMHgwNSwgMHgxYywgMHgwZiwgMHgxYywgMHgzOCwgMHg2OSwgMHhiOSwgMHg2OCwgCisweDQxLCAweDE4LCAweDM4LCAweDY4LCAweGZmLCAweGY3LCAweDUzLCAweGZmLCAweGMwLCAweDQzLCAweDAxLCAweDA0LCAKKzB4MDksIDB4MGMsIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MzksIDB4ZmYsIDB4MDQsIDB4MWMsIDB4YjgsIDB4NjgsIAorMHg3OSwgMHg2OSwgMHg0MCwgMHgxOCwgMHg2OSwgMHg2OCwgMHg4OCwgMHg0MiwgMHgwYywgMHhkMiwgMHgyYSwgMHg2OCwgCisweDEyLCAweDE4LCAweDA5LCAweDFhLCAweDEwLCAweDFjLCAweDAwLCAweGYwLCAweDA1LCAweGY5LCAweGMwLCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MjYsIDB4ZmYsIDB4MDQsIDB4MWMsIAorMHhlMCwgMHg0MywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDgwLCAweGI1LCAweDA3LCAweDFjLCAweGI4LCAweDZiLCAweGMwLCAweDA4LCAweDFhLCAweGQzLCAweGI4LCAweDZhLCAKKzB4ZjksIDB4NmIsIDB4NDAsIDB4MTgsIDB4NzksIDB4NmMsIDB4MDAsIDB4ZjAsIDB4ZWQsIDB4ZjgsIDB4YzAsIDB4NDMsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwYSwgMHg0OCwgMHgwNywgMHhkMCwgMHgyMCwgMHgyMywgMHhiOSwgMHg2OSwgCisweDE5LCAweDQzLCAweGI5LCAweDYxLCAweDAxLCAweDZiLCAweDAxLCAweDMxLCAweDAxLCAweDYzLCAweDA3LCAweGUwLCAKKzB4ZmYsIDB4MjMsIDB4MDEsIDB4MzMsIDB4YjksIDB4NjksIDB4MTksIDB4NDMsIDB4YjksIDB4NjEsIDB4NDEsIDB4NmEsIAorMHgwMSwgMHgzMSwgMHg0MSwgMHg2MiwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDA3LCAweDFjLCAweGI4LCAweDZiLCAweDQxLCAweDA5LCAKKzB4MWMsIDB4ZDMsIDB4YzAsIDB4MDgsIDB4MWEsIDB4ZDMsIDB4ZjgsIDB4MWQsIDB4MzksIDB4MzAsIDB4MDAsIDB4N2IsIAorMHgwNiwgMHgyOCwgMHgxNSwgMHhkMSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg1MywgMHhmOCwgMHgwMSwgMHgxYywgCisweDBhLCAweDQ4LCAweDA3LCAweGQwLCAweDQwLCAweDIzLCAweGI5LCAweDY5LCAKKzB4MTksIDB4NDMsIDB4YjksIDB4NjEsIDB4ODEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4ODEsIDB4NjMsIDB4MDcsIDB4ZTAsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwMiwgMHhiOSwgMHg2OSwgMHgxOSwgMHg0MywgMHhiOSwgMHg2MSwgMHhjMSwgMHg2YSwgCisweDAxLCAweDMxLCAweGMxLCAweDYyLCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4YjgsIDB4NmIsIDB4ODEsIDB4MDksIAorMHgyYywgMHhkMywgMHhjMCwgMHgwOCwgMHgyYSwgMHhkMywgMHhmOCwgMHgxZCwgMHgzOSwgMHgzMCwgMHgwMCwgMHg3YiwgCisweDExLCAweDI4LCAweDI1LCAweGQxLCAweGI4LCAweDZhLCAweDM5LCAweDZjLCAweDQwLCAweDE4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MDYsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MDUsIDB4MDQsIDB4MmQsIDB4MGMsIAorMHgwZiwgMHg0YywgMHgxMSwgMHhkMCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgxZiwgMHhmOCwgMHgwMCwgMHgyOCwgCisweDBjLCAweGQwLCAweGE4LCAweDQyLCAweDAyLCAweGQxLCAweDBjLCAweDRiLCAweDk4LCAweDQyLCAweDA3LCAweGQwLCAKKzB4ODAsIDB4MjMsIDB4YjgsIDB4NjksIDB4MTgsIDB4NDMsIDB4YjgsIDB4NjEsIDB4NjAsIDB4NmIsIDB4MDEsIDB4MzAsIAorMHg2MCwgMHg2MywgMHgwNywgMHhlMCwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgMHhiOCwgMHg2OSwgMHgxOCwgMHg0MywgCisweGI4LCAweDYxLCAweGEwLCAweDZhLCAweDAxLCAweDMwLCAweGEwLCAweDYyLCAweDAwLCAweDIwLCAweGIwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHhmMCwgMHhiNSwgMHhmZiwgMHhiMCwgMHg5OSwgMHhiMCwgMHgwNCwgMHgxYywgMHhlMCwgMHg2YiwgMHg2MSwgMHg2YywgCisweDA5LCAweDE4LCAweDAzLCAweGFhLCAweDg1LCAweDE4LCAweGEzLCAweDZhLCAweDAwLCAweDIwLCAweDhhLCAweDA4LCAKKzB4MDEsIDB4MzIsIDB4OTcsIDB4OTIsIDB4MDcsIDB4ZDAsIDB4ODIsIDB4MDAsIDB4OWYsIDB4NTgsIDB4MDMsIDB4YWUsIAorMHhiNywgMHg1MCwgMHg5NywgMHg5YSwgMHgwMSwgMHgzMCwgMHg4MiwgMHg0MiwgMHhmNywgMHhkOCwgMHg2MCwgMHg2YSwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA0LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4MDIsIDB4OTAsIDB4MDIsIDB4YWYsIDB4M2YsIDB4ODgsIDB4MDMsIDB4YTgsIDB4ZmYsIDB4ZjcsIDB4ODcsIDB4ZmUsIAorMHhjMCwgMHg0MywgMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHg2ZCwgMHhmZSwgCisweDA3LCAweDFjLCAweGUwLCAweDZiLCAweGExLCAweDZjLCAweDQwLCAweDE4LCAweDYxLCAweDZhLCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MDgsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4OTEsIAorMHgwMSwgMHhhOSwgMHgwOSwgMHg4OCwgMHgwMSwgMHgzMSwgMHg4OCwgMHg0MiwgMHgwYywgMHhkMiwgMHhhMiwgMHg2YSwgCisweDEyLCAweDE4LCAweDA5LCAweDFhLCAweDEwLCAweDFjLCAweDAwLCAweGYwLCAweDJmLCAweGY4LCAweGMwLCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NTAsIDB4ZmUsIDB4MDcsIDB4MWMsIAorMHhhOCwgMHg4OSwgMHhlOSwgMHg4OSwgMHgwOCwgMHgxOCwgMHgyOSwgMHg4YSwgMHgwOCwgMHgxOCwgMHg2OSwgMHg4YSwgCisweDA4LCAweDE4LCAweDY5LCAweDdhLCAweDA5LCAweDAyLCAweDA4LCAweDE4LCAweGExLCAweDZjLCAweDYyLCAweDZjLCAKKzB4ODksIDB4MWEsIDB4MGEsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MTEsIDB4MDIsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIAorMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwOSwgMHgxOCwgMHgwOCwgMHgwYywgMHgwNSwgMHhkMCwgMHgwOCwgMHgwNCwgCisweDAwLCAweDBjLCAweDA5LCAweDBjLCAweDQxLCAweDE4LCAweDA4LCAweDBjLCAweGY5LCAweGQxLCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4MmYsIDB4ZmUsIDB4YzAsIDB4NDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4N2YsIDB4YjAsIAorMHgxOSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhiMCwgMHhiNCwgMHgwMCwgMHgyMiwgCisweDAwLCAweDI5LCAweDJlLCAweGQwLCAweDgzLCAweDA3LCAweDliLCAweDBmLCAweGRjLCAweDAwLCAweDQ3LCAweDE4LCAKKzB4MDQsIDB4MjUsIDB4ZWYsIDB4MWIsIDB4YmYsIDB4MDcsIDB4YmYsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4ODAsIDB4MDgsIAorMHg4MCwgMHgwMCwgMHg1OSwgMHgxOCwgMHgwMywgMHgzMSwgMHg4OSwgMHgwOCwgMHg0ZCwgMHgxZSwgMHgwMiwgMHhjOCwgCisweGUxLCAweDQwLCAweGExLCAweDQwLCAweDZiLCAweDFlLCAweDAwLCAweDJkLCAweDA5LCAweGQwLCAweDBjLCAweDA0LCAKKzB4MjQsIDB4MGMsIDB4YTIsIDB4MTgsIDB4MDksIDB4MGMsIDB4OGEsIDB4MTgsIDB4MDIsIDB4YzgsIDB4MWMsIDB4MWMsIAorMHgwMSwgMHgzYiwgMHgwMCwgMHgyYywgMHhmNSwgMHhkMSwgMHhiOSwgMHg0MCwgMHgwOCwgMHgxYywgMHhmOCwgMHg0MCwgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDg5LCAweDE4LCAweDAwLCAweDBjLCAweDQyLCAweDE4LCAweDEwLCAweDBjLCAKKzB4MDUsIDB4ZDAsIDB4MTAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MTEsIDB4MGMsIDB4NDIsIDB4MTgsIDB4MTAsIDB4MGMsIAorMHhmOSwgMHhkMSwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwYywgMHhiMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDkwLCAweGI0LCAweDAwLCAweDIwLCAweDAxLCAweDI3LCAweDExLCAweDQ5LCAweDQyLCAweDAwLCAweDEyLCAweDE4LCAKKzB4ZDIsIDB4MDAsIDB4NTMsIDB4MTgsIDB4OWMsIDB4NjgsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHgxYiwgMHgwMywgMHgxYiwgMHgwYiwgMHg4YSwgMHg1OCwgCisweDEyLCAweDAzLCAweDEyLCAweDBiLCAweDkzLCAweDQyLCAweDBjLCAweGQxLCAweDAxLCAweDMwLCAweDA0LCAweDI4LCAKKzB4ZWMsIDB4ZDMsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NmEsIDB4MDEsIDB4MDMsIDB4MDksIDB4MGIsIDB4MDcsIDB4NDgsIAorMHgwMCwgMHg2ZiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwYiwgMHg4MSwgMHg0MiwgMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgCisweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweGZiLCAweGU3LCAweGE4LCAweDAzLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4NDAsIDB4MTQsIDB4NDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OTgsIDB4YjQsIDB4MTQsIDB4NGEsIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHg4MywgMHgwMCwgMHgxMywgMHg0OCwgMHhjMCwgMHg1OCwgMHgwNywgMHgwMywgCisweDNmLCAweDBiLCAweDEyLCAweDQ4LCAweGMwLCAweDU4LCAweDAyLCAweDAzLCAweDEyLCAweDBiLCAweDExLCAweDQ4LCAKKzB4YzAsIDB4NTgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MGIsIDB4MTAsIDB4NGMsIDB4ZTQsIDB4NTgsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHg5YiwgMHgwMCwgMHhjYywgMHgwMCwgMHgwMSwgMHgyMSwgCisweDk4LCAweDQyLCAweDAxLCAweGQxLCAweDA4LCAweDFjLCAweDA5LCAweGUwLCAweDk4LCAweDQyLCAweDAzLCAweGQ5LCAKKzB4MTAsIDB4MWEsIDB4ZGEsIDB4MWIsIDB4ODAsIDB4MTgsIDB4MDAsIDB4ZTAsIDB4MTgsIDB4MWEsIDB4ODQsIDB4NDIsIAorMHhmNCwgMHhkMywgMHgwMCwgMHgyMCwgMHg5OCwgMHhiYywgMHg3MCwgMHg0NywgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgCisweDIwLCAweDA0LCAweDAwLCAweDgwLCAweDI4LCAweDA0LCAweDAwLCAweDgwLCAweDA4LCAweDA0LCAweDAwLCAweDgwLCAKKzB4MTgsIDB4MDQsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MTMsIDB4MDQsIDB4MDAsIDB4ZDAsIDB4MDEsIDB4M2EsIAorMHg4MCwgMHgwMCwgMHgwYiwgMHgxYywgMHgxMywgMHg0OSwgMHgwZiwgMHg1OCwgMHhjMCwgMHg0NiwgMHgzYiwgMHg2MCwgCisweDBiLCAweDU4LCAweGMwLCAweDQ2LCAweDVhLCAweDYwLCAweDBhLCAweDU4LCAweDA4LCAweDMyLCAweDEwLCAweDRiLCAKKzB4MWIsIDB4NTgsIDB4OWEsIDB4NDIsIDB4MDEsIDB4ZDMsIDB4MGYsIDB4NGEsIDB4MTIsIDB4NTgsIDB4MGYsIDB4NGIsIAorMHgxZiwgMHg1OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzYiwgMHg0MywgMHgxYiwgMHg2OCwgMHg5YiwgMHgwMCwgCisweDE3LCAweDAzLCAweDNmLCAweDBiLCAweDlmLCAweDQyLCAweDA2LCAweGQxLCAweDBhLCAweDQ4LCAweGMxLCAweDY4LCAKKzB4MDEsIDB4MzEsIDB4YzEsIDB4NjAsIDB4MDEsIDB4MjAsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDgsIDB4NGIsIAorMHgxYiwgMHg1OCwgMHhjMCwgMHg0NiwgMHgxYSwgMHg2MCwgMHgwYSwgMHg1MCwgMHgwMCwgMHgyMCwgMHhmNiwgMHhlNywgCisweDA4LCAweDA0LCAweDAwLCAweDgwLCAweDI4LCAweDA0LCAweDAwLCAweDgwLCAweDIwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4MTgsIDB4MDQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MDQsIDB4MDAsIDB4ODAsIAorMHhmZiwgMHg1ZiwgMHgyZCwgMHhlOSwgMHg0OCwgMHhmZSwgMHhmZiwgMHhlYiwgMHgwMSwgMHhiNiwgMHhhMCwgMHhlMywgCisweDAxLCAweGIxLCAweDhiLCAweGUyLCAweDAyLCAweDhhLCAweGEwLCAweGUzLCAweDAxLCAweDdhLCAweGEwLCAweGUzLCAKKzB4MDEsIDB4YTksIDB4YTAsIDB4ZTMsIDB4MDEsIDB4NTYsIDB4YTAsIDB4ZTMsIDB4YzgsIDB4NjAsIDB4OWYsIDB4ZTUsIAorMHhjOCwgMHg5MCwgMHg5ZiwgMHhlNSwgMHgxNCwgMHg0MCwgMHg5YiwgMHhlNSwgMHgwMCwgMHgwMCwgMHg1NCwgMHhlMywgCisweDJjLCAweDAwLCAweDAwLCAweDBhLCAweDAzLCAweDBhLCAweDE0LCAweGUzLCAweDExLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MGMsIDB4MDAsIDB4OTYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4NTAsIDB4ZTMsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgwMSwgMHgwYSwgMHgxNCwgMHhlMywgMHgwNSwgMHgwMCwgMHgwMCwgMHgwYSwgMHgxYywgMHgwMCwgMHg5NiwgMHhlNSwgCisweDAxLCAweDBhLCAweGMwLCAweGUzLCAweDFjLCAweDAwLCAweDg2LCAweGU1LCAweDFjLCAweDAwLCAweDg1LCAweGU1LCAKKzB4MTQsIDB4NzAsIDB4ODUsIDB4ZTUsIDB4MDYsIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MDIsIDB4MGEsIDB4MTQsIDB4ZTMsIAorMHgwNCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgxYywgMHgwMCwgMHg5NiwgMHhlNSwgMHgwMiwgMHgwYSwgMHhjMCwgMHhlMywgCisweDFjLCAweDAwLCAweDg2LCAweGU1LCAweDFjLCAweDAwLCAweDg1LCAweGU1LCAweDE0LCAweDgwLCAweDg1LCAweGU1LCAKKzB4MDEsIDB4MDksIDB4MTQsIDB4ZTMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIAorMHgwMSwgMHgwOSwgMHhjMCwgMHhlMywgMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgCisweDE0LCAweGEwLCAweDg1LCAweGU1LCAweDAyLCAweDAwLCAweDE0LCAweGUzLCAweDQwLCAweDAwLCAweDAwLCAweDFiLCAKKzB4MDEsIDB4MDAsIDB4MTQsIDB4ZTMsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDIsIDB4MGIsIDB4MTQsIDB4ZTMsIAorMHg2NywgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMSwgMHgwYiwgMHgxNCwgMHhlMywgMHgyMCwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDE4LCAweDAwLCAweDk5LCAweGU1LCAweDAxLCAweDAwLCAweDgwLCAweGUyLCAweDE4LCAweDAwLCAweDg5LCAweGU1LCAKKzB4ZDUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIDB4MDEsIDB4MGEsIDB4YzAsIDB4ZTMsIAorMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgCisweDE0LCAweDcwLCAweDg1LCAweGU1LCAweGUxLCAweGZmLCAweGZmLCAweGVhLCAweGZmLCAweDVmLCAweGJkLCAweGU4LCAKKzB4MDQsIDB4ZjAsIDB4NWUsIDB4ZTIsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHgxMCwgMHgxMCwgMHgxZiwgMHhlNSwgMHgxNCwgMHgzMCwgMHg5MSwgMHhlNSwgMHgwMCwgMHgyMCwgMHhjMywgMHhlMSwgCisweDE0LCAweDIwLCAweDgxLCAweGU1LCAweDAxLCAweDE2LCAweGEwLCAweGUzLCAweDBjLCAweDIwLCAweDgxLCAweGU1LCAKKzB4MGIsIDB4MTIsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIDB4MTgsIDB4MTAsIDB4OWYsIDB4ZTUsIAorMHhiMCwgMHgyNCwgMHhkMSwgMHhlMSwgMHgwMSwgMHgyMCwgMHg4MiwgMHhlMiwgMHhiMCwgMHgyNCwgMHhjMSwgMHhlMSwgCisweDNjLCAweDIwLCAweDkxLCAweGU1LCAweDAwLCAweDAwLCAweDgyLCAweGUxLCAweDNjLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHhmZSwgMHhmZiwgMHhmZiwgMHhlYSwgMHgwMSwgMHgwYiwgMHhhMCwgMHhlMywgMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgCisweDE0LCAweDAwLCAweDgxLCAweGU1LCAweDAwLCAweDFhLCAweDgxLCAweGUxLCAweDI0LCAweDIwLCAweDkxLCAweGU1LCAKKzB4NzAsIDB4MDAsIDB4MWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjAsIDB4ODAsIDB4ZTUsIAorMHgyOCwgMHgxMCwgMHg5MSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgxMCwgMHg4MCwgMHhlNSwgCisweDJjLCAweDIwLCAweDkwLCAweGU1LCAweDAxLCAweDIwLCAweDgyLCAweGUyLCAweDJjLCAweDIwLCAweDgwLCAweGU1LCAKKzB4M2YsIDB4MDAsIDB4MDEsIDB4ZTIsIDB4M2YsIDB4MDAsIDB4NTAsIDB4ZTMsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4MTEsIAorMHgxOCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MCwgMHhlNSwgMHgwMSwgMHgxMCwgMHg4MSwgMHhlMiwgCisweDAwLCAweDEwLCAweDgwLCAweGU1LCAweDAyLCAweDE4LCAweGEwLCAweGUzLCAweDBiLCAweDAyLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MzAsIDB4MDQsIDB4MDAsIDB4ODAsIAorMHgwMSwgMHgwNiwgMHhhMCwgMHhlMywgMHgwMSwgMHgwMSwgMHg4MCwgMHhlMiwgMHgwMCwgMHgxMCwgMHg5MCwgMHhlNSwgCisweDAxLCAweDA4LCAweDExLCAweGUzLCAweDBiLCAweDEwLCAweGEwLCAweGUzLCAweDAyLCAweDE5LCAweDgxLCAweGUyLCAKKzB4MDUsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MjAsIDB4OTAsIDB4ZTUsIDB4NDIsIDB4MjgsIDB4YjAsIDB4ZTEsIAorMHgwNSwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhlNSwgMHgwMiwgMHgwYywgMHgxMCwgMHhlMywgCisweDAyLCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDA3LCAweGEwLCAweGUzLCAweDRjLCAweDExLCAweDgwLCAweGU1LCAKKzB4MDMsIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MGMsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHg0MCwgMHgxMCwgMHg4MCwgMHhlNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhlYSwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDA2LCAweGEwLCAweGUzLCAweDAxLCAweDAxLCAweDgwLCAweGUyLCAKKzB4MDAsIDB4MTAsIDB4OTAsIDB4ZTUsIDB4MDEsIDB4MDgsIDB4MTEsIDB4ZTMsIDB4MGMsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMiwgMHgxOSwgMHg4MSwgMHhlMiwgMHgwNSwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgyMCwgMHg5MCwgMHhlNSwgCisweDQyLCAweDI4LCAweGIwLCAweGUxLCAweDA1LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDkwLCAweGU1LCAKKzB4MDIsIDB4MGMsIDB4MTAsIDB4ZTMsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4MDcsIDB4YTAsIDB4ZTMsIAorMHg0YywgMHgxMSwgMHg4MCwgMHhlNSwgMHgwMywgMHgwMCwgMHgwMCwgMHhlYSwgMHg0YywgMHgwMCwgMHgxZiwgMHhlNSwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDEwLCAweDgwLCAweGU1LCAweGZmLCAweGZmLCAweGZmLCAweGVhLCAKKzB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MDIsIDB4MWIsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4MDYsIDB4YTAsIDB4ZTMsIAorMHgxNCwgMHgxMCwgMHg4MCwgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHg4MCwgMHgyMSwgMHgxZiwgMHhlNSwgCisweDE0LCAweDMwLCAweDkyLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDgwLCAweGU1LCAKKzB4MWMsIDB4MDAsIDB4OTIsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgxNCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMSwgMHgwNiwgMHhhMCwgMHhlMywgCisweDFjLCAweDEwLCAweDgyLCAweGU1LCAweDBjLCAweDEwLCAweDgwLCAweGU1LCAweDFjLCAweDEwLCAweDkyLCAweGU1LCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHhjMCwgMHgyMSwgMHgxZiwgMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAxLCAweDE2LCAweGEwLCAweGUzLCAweDE0LCAweDAwLCAweDgyLCAweGU1LCAweDBjLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MWMsIDB4MDAsIDB4OTIsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4ODEsIDB4ZTUsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHg4MCwgMHhiNSwgMHgwZiwgMHgxYywgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDE3LCAweGY4LCAweDAwLCAweDI4LCAweDAyLCAweGQwLCAweDM4LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4OTIsIDB4ZjgsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg4MCwgMHhiNSwgMHgwZiwgMHgxYywgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwOSwgMHhmOCwgMHgwMCwgMHgyOCwgCisweDAyLCAweGQwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDg0LCAweGY4LCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjAsIDB4YjQsIDB4MDcsIDB4NjgsIDB4M2EsIDB4NzgsIDB4ZDIsIDB4MDcsIAorMHhkMiwgMHgwZiwgMHgwMCwgMHgyNCwgMHgwMCwgMHgyYSwgMHgwMywgMHhkMCwgMHhmZiwgMHgyMiwgMHgwMSwgMHgzMiwgCisweDQyLCAweDYwLCAweDAwLCAweGUwLCAweDQ0LCAweDYwLCAweDNhLCAweDdiLCAweDdiLCAweDdiLCAweDFiLCAweDAyLCAKKzB4MWEsIDB4NDMsIDB4ODEsIDB4MmEsIDB4MDgsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4NDIsIDB4NjgsIAorMHgxYSwgMHg0MywgMHg0MiwgMHg2MCwgMHgwNCwgMHgyMiwgMHhiZiwgMHgxOCwgMHg4MiwgMHg2MCwgMHgwMCwgMHhlMCwgCisweDg0LCAweDYwLCAweDNhLCAweDdiLCAweDdiLCAweDdiLCAweDFiLCAweDAyLCAweDFhLCAweDQzLCAweDA4LCAweDJhLCAKKzB4MDYsIDB4ZDEsIDB4MDYsIDB4MjMsIDB4NDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4NDEsIDB4NjAsIDB4ODEsIDB4NjgsIAorMHgwZSwgMHgzMSwgMHgzYywgMHhlMCwgMHhjMSwgMHgyMywgMHhkYiwgMHgwMCwgMHg5YSwgMHg0MiwgMHgwMywgMHhkMSwgCisweDQxLCAweDY4LCAweDI0LCAweDRiLCAweDE5LCAweDQzLCAweDNlLCAweGUwLCAweDIzLCAweDRiLCAweDlhLCAweDQyLCAKKzB4MDQsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDMsIDB4NDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MzYsIDB4ZTAsIAorMHgxMywgMHgwMiwgMHgxMiwgMHgwYSwgMHgxMiwgMHgwNiwgMHgxMiwgMHgwZSwgMHgxYSwgMHg0MywgMHgxMiwgMHgwNCwgCisweDEyLCAweDBjLCAweDJlLCAweDNhLCAweDFjLCAweDRiLCAweDlhLCAweDQyLCAweDJkLCAweGQ4LCAweDAxLCAweDI1LCAKKzB4NDIsIDB4NjgsIDB4MTUsIDB4NDMsIDB4NDUsIDB4NjAsIDB4YmEsIDB4N2IsIDB4ZmIsIDB4N2IsIDB4MWIsIDB4MDIsIAorMHgxYSwgMHg0MywgMHgxOCwgMHg0YiwgMHg5YSwgMHg0MiwgMHgyMiwgMHhkMSwgMHhmYiwgMHgxZCwgMHgwOSwgMHgzMywgCisweDQ0LCAweGNiLCAweDliLCAweDA3LCAweGRiLCAweDBlLCAweGRhLCAweDQwLCAweDViLCAweDQyLCAweDIwLCAweDMzLCAKKzB4OWUsIDB4NDAsIDB4MTYsIDB4NDMsIDB4MDMsIDB4MmUsIDB4MTgsIDB4ZDEsIDB4MzksIDB4N2QsIDB4N2IsIDB4N2QsIAorMHgxYiwgMHgwMiwgMHgxOSwgMHg0MywgMHgwOCwgMHgyOSwgMHgwNywgMHhkMSwgMHgwNCwgMHgyMSwgMHgyOSwgMHg0MywgCisweDQxLCAweDYwLCAweDgxLCAweDY4LCAweDE2LCAweDMxLCAweDgxLCAweDYwLCAweDAxLCAweDIxLCAweDBhLCAweGUwLCAKKzB4YzEsIDB4MjMsIDB4ZGIsIDB4MDAsIDB4OTksIDB4NDIsIDB4MDQsIDB4ZDEsIDB4MDEsIDB4MjEsIDB4ODksIDB4MDMsIAorMHgyOSwgMHg0MywgMHg0MSwgMHg2MCwgMHgwMCwgMHhlMCwgMHg4NCwgMHg2MCwgMHgwMCwgMHgyMSwgMHgwOCwgMHgxYywgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDAyLCAweDQwLCAweDAwLCAweDAwLCAweDgxLCAweDgwLCAweDAwLCAweDAwLCAKKzB4YWUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YjQsIDB4NDIsIDB4NjgsIAorMHhkMSwgMHgwOCwgMHgzZiwgMHhkMywgMHgwMSwgMHg2OCwgMHg4MywgMHg2OCwgMHg1OSwgMHgxOCwgMHgwMiwgMHgzOSwgCisweDhmLCAweDc4LCAweDNmLCAweDA3LCAweDNmLCAweDBmLCAweDA1LCAweDJmLCAweDAzLCAweGQxLCAweGRhLCAweDFkLCAKKzB4MGQsIDB4MzIsIDB4YzIsIDB4NjAsIDB4MDUsIDB4ZTAsIDB4YmYsIDB4MDAsIDB4ZGIsIDB4MTksIDB4YzMsIDB4NjAsIAorMHgwOCwgMHgyMywgMHgxYSwgMHg0MywgMHg0MiwgMHg2MCwgMHg4YSwgMHg3OCwgMHgxMiwgMHgwNywgMHgxMiwgMHgwZiwgCisweDkyLCAweDAwLCAweDAyLCAweDYxLCAweDBhLCAweDc5LCAweDRiLCAweDc5LCAweDFiLCAweDAyLCAweDFhLCAweDQzLCAKKzB4MTMsIDB4MDIsIDB4MTIsIDB4MGEsIDB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MWEsIDB4NDMsIDB4MTIsIDB4MDQsIAorMHgxMiwgMHgwYywgMHg0MiwgMHg2MSwgMHhjYSwgMHg3YSwgMHgwNiwgMHgyYSwgMHgwMywgMHhkMSwgMHgxMCwgMHgyMywgCisweDQyLCAweDY4LCAweDFhLCAweDQzLCAweDEwLCAweGUwLCAweDExLCAweDJhLCAweDAzLCAweGQxLCAweDIwLCAweDIzLCAKKzB4NDIsIDB4NjgsIDB4MWEsIDB4NDMsIDB4MGEsIDB4ZTAsIDB4MzMsIDB4MmEsIDB4MDMsIDB4ZDEsIDB4NDAsIDB4MjMsIAorMHg0MiwgMHg2OCwgMHgxYSwgMHg0MywgMHgwNCwgMHhlMCwgMHgzMiwgMHgyYSwgMHgwMywgMHhkMSwgMHg4MCwgMHgyMywgCisweDQyLCAweDY4LCAweDFhLCAweDQzLCAweDQyLCAweDYwLCAweGM5LCAweDdhLCAweGMwLCAweDQ2LCAweDAxLCAweDc2LCAKKzB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MGEsIDB4NzgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4NjAsIDB4NGIsIDB4NzgsIAorMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHgwMiwgMHg2MCwgMHg4YiwgMHg3OCwgMHgxYiwgMHgwNCwgMHgxYSwgMHg0MywgCisweDAyLCAweDYwLCAweGM5LCAweDc4LCAweDA5LCAweDA2LCAweDExLCAweDQzLCAweDAxLCAweDYwLCAweDcwLCAweDQ3LCAKKzB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4NDgsIDB4NjgsIDB4ODAsIDB4MDksIDB4MjYsIDB4ZDMsIDB4YjgsIDB4NmEsIAorMHhjOSwgMHg2OCwgMHg0MCwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMiwgMHgzMCwgMHgxOCwgMHg0MywgCisweDAwLCAweDY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDExLCAweDIzLCAweDliLCAweDAyLCAweDk4LCAweDQyLCAKKzB4MTgsIDB4ZDEsIDB4NzgsIDB4NmEsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg2MiwgMHgzOCwgMHg2YiwgMHgwMiwgMHhmMCwgMHhkYSwgMHhmOCwgMHgzOCwgMHgxYywgMHgwMSwgMHhmMCwgCisweDk1LCAweGZkLCAweDAxLCAweDIwLCAweDA3LCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDczLCAweDA3LCAweDQ5LCAKKzB4NGEsIDB4NmMsIDB4MTIsIDB4MTgsIDB4NGEsIDB4NjQsIDB4MDYsIDB4NDksIDB4OGEsIDB4NmQsIDB4MTIsIDB4MTgsIAorMHg4YSwgMHg2NSwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYSwgMHhlNywgCisweDE4LCAweDFhLCAweDAwLCAweDgwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAKKzB4ODEsIDB4MDcsIDB4MTksIDB4ZDAsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgwMSwgMHgxZCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwMiwgMHgwMiwgCisweDEyLCAweDBlLCAweDEyLCAweDA2LCAweDAwLCAweDBhLCAweGZmLCAweDIzLCAweDFiLCAweDA0LCAweDE4LCAweDQwLCAKKzB4MTAsIDB4NDMsIDB4MGEsIDB4MGEsIDB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MTAsIDB4NDMsIDB4MDksIDB4MDIsIAorMHgxYiwgMHgwYSwgMHgxOSwgMHg0MCwgMHgwOCwgMHg0MywgMHg3MCwgMHg0NywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDAxLCAweDA2LCAweDAyLCAweDAyLCAweGZmLCAweDIzLCAweDFiLCAweDA0LCAKKzB4MWEsIDB4NDAsIDB4MTEsIDB4NDMsIDB4MDIsIDB4MGEsIDB4MWIsIDB4MGEsIDB4MWEsIDB4NDAsIDB4MTEsIDB4NDMsIAorMHgwMCwgMHgwZSwgMHgwOCwgMHg0MywgMHhlZCwgMHhlNywgMHgwMCwgMHgwMCwgMHhmMCwgMHhiNSwgMHgwNCwgMHgyMywgCisweDgxLCAweDZiLCAweDE5LCAweDQwLCAweDAwLCAweDIyLCAweDAwLCAweDI5LCAweDQ2LCAweGQwLCAweGM3LCAweDFkLCAKKzB4MzksIDB4MzcsIDB4MzksIDB4N2IsIDB4MzMsIDB4MjksIDB4MDEsIDB4ZDAsIDB4MzIsIDB4MjksIDB4M2YsIDB4ZDEsIAorMHgwMSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg0YSwgMHg2NSwgMHhjNCwgMHgxZCwgMHgyZCwgMHgzNCwgMHhjZCwgMHgxZCwgCisweDJkLCAweDM1LCAweDAwLCAweDIyLCAweDkzLCAweDAwLCAweGU2LCAweDU4LCAweGMwLCAweDQ2LCAweGVlLCAweDUwLCAKKzB4MDEsIDB4MzIsIDB4MDcsIDB4MmEsIDB4ZjgsIDB4ZDMsIDB4ODIsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NGEsIDB4NjMsIAorMHg4MiwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4YSwgMHg2MiwgMHg3YSwgMHg4YiwgMHhjYiwgMHgxZCwgMHgzOSwgMHgzMywgCisweDVhLCAweDgzLCAweDQwLCAweDZhLCAweGMwLCAweDQ2LCAweDQ4LCAweDYyLCAweDEyLCAweDQ4LCAweDAxLCAweDI3LCAKKzB4NDIsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MTAsIDB4ZDEsIDB4YzIsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MTMsIDB4ZDEsIAorMHg0MiwgMHg2OSwgMHgwMCwgMHgyYSwgMHgwZCwgMHhkMSwgMHgwMSwgMHg2MSwgMHhjMSwgMHg2MCwgMHgwMSwgMHg2YSwgCisweDAyLCAweDI5LCAweDAyLCAweGQzLCAweDIwLCAweDMwLCAweDA3LCAweDcxLCAweDBjLCAweGUwLCAweDAwLCAweGYwLCAKKzB4MTMsIDB4ZjgsIDB4MDksIDB4ZTAsIDB4YzIsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDEsIDB4MDEsIDB4NjEsIAorMHhjMSwgMHg2MCwgMHgwMywgMHhlMCwgMHgwMiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg1MSwgMHg2NSwgMHgwMSwgMHg2MSwgCisweDM4LCAweDFjLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDEwLCAweDFjLCAweGZhLCAweGU3LCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4MWUsIDB4NDksIDB4MDAsIDB4MjIsIDB4Y2IsIDB4NjgsIAorMHgwMCwgMHgyYiwgMHgzNCwgMHhkMCwgMHhjOCwgMHgxZCwgMHhmOSwgMHgzMCwgMHg4MywgMHg2MiwgMHhjYiwgMHg2OCwgCisweDliLCAweDZhLCAweGMwLCAweDQ2LCAweGMzLCAweDYyLCAweGNmLCAweDY5LCAweDdiLCAweDAwLCAweGRmLCAweDE5LCAKKzB4N2YsIDB4MDIsIDB4MTcsIDB4NGIsIDB4ZmYsIDB4MTgsIDB4ZmYsIDB4MzcsIDB4NjUsIDB4MzcsIDB4ODMsIDB4NjMsIAorMHgwNywgMHg2MywgMHhjYiwgMHgxZCwgMHhmZiwgMHgzMywgMHg1YSwgMHgzMywgMHgxYSwgMHg3MiwgMHhjYiwgMHg2OSwgCisweDAwLCAweDJiLCAweDAxLCAweGQwLCAweGNhLCAweDYxLCAweDAxLCAweGUwLCAweDAxLCAweDIzLCAweGNiLCAweDYxLCAKKzB4MGYsIDB4MWMsIDB4YzksIDB4NjgsIDB4NDksIDB4NmEsIDB4MDksIDB4ODksIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjMsIAorMHhmOCwgMHgxZCwgMHhmZiwgMHgzMCwgMHgzYSwgMHgzMCwgMHg0MiwgMHg2MCwgMHgwMiwgMHg4MiwgMHg4MiwgMHg2MCwgCisweGMyLCAweDYwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGNlLCAweGZhLCAweDM4LCAweDZhLCAweDAxLCAweDMwLCAKKzB4MzgsIDB4NjIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGEsIDB4ZjgsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgxMCwgMHgxYywgMHhmYSwgMHhlNywgMHgwMCwgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweGYwLCAweGI1LCAweDA3LCAweDFjLCAweGY5LCAweDFkLCAweGY5LCAweDMxLCAKKzB4ODgsIDB4NmEsIDB4YzIsIDB4MWQsIDB4MmQsIDB4MzIsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4MzIsIAorMHgxYSwgMHg0MywgMHhjOCwgMHg2YSwgMHgxMiwgMHg2OCwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgMHg4MCwgMHgxOCwgCisweDgyLCAweDc5LCAweGMzLCAweDc5LCAweDFiLCAweDAyLCAweDFhLCAweDQzLCAweDEzLCAweDAyLCAweDEyLCAweDBhLCAKKzB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MWEsIDB4NDMsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MDIsIDB4MzgsIAorMHg5MiwgMHgwNCwgMHg5MiwgMHgwYywgMHgwMCwgMHgyNiwgMHgyNSwgMHg0ZCwgCisweGVjLCAweDFkLCAweGZmLCAweDM0LCAweDNhLCAweDM0LCAweDAwLCAweDJhLCAweDA0LCAweGQwLCAweDIwLCAweDhhLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4MTgsIDB4NDMsIDB4MmIsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHhjMiwgMHgxZCwgMHgwZCwgMHgzMiwgMHgxYSwgMHg0MywgMHgxMiwgMHg2OCwgMHgxMiwgMHgwNCwgMHgxMiwgMHgzMCwgCisweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDEwLCAweDQzLCAweDAzLCAweDFjLCAKKzB4ZjgsIDB4MWQsIDB4ZmYsIDB4MzAsIDB4NGEsIDB4MzAsIDB4ODIsIDB4NzgsIDB4YzgsIDB4NmIsIDB4MTksIDB4MWMsIAorMHgwMiwgMHhmMCwgMHgwMiwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwNCwgMHhkYSwgMHgyMCwgMHg4YSwgMHhmZiwgMHgyMywgCisweDAxLCAweDMzLCAweDE4LCAweDQzLCAweDBlLCAweGUwLCAweGY5LCAweDFkLCAweGZmLCAweDMxLCAweDNhLCAweDMxLCAKKzB4MDgsIDB4NjAsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MWMsIDB4ZjgsIAorMHgwMCwgMHgyOCwgMHgxNCwgMHhkMSwgMHgyMCwgMHg4YSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgMHgxOCwgMHg0MywgCisweDIwLCAweDgyLCAweDIxLCAweDhhLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGEyLCAweGZiLCAweGU4LCAweDY4LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4NTQsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHhlOCwgMHg2MCwgMHgzMCwgMHgxYywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMSwgMHgyMCwgCisweGZhLCAweGU3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweGY4LCAweGI1LCAweDA3LCAweDFjLCAKKzB4ZmMsIDB4MWQsIDB4ZjksIDB4MzQsIDB4YTAsIDB4NmIsIDB4YTYsIDB4NmEsIDB4YzUsIDB4MWQsIDB4MGQsIDB4MzUsIAorMHgzOCwgMHg0OCwgMHhjMCwgMHg2YSwgMHg0YiwgMHgwMCwgMHg1OSwgMHgxOCwgMHg0OSwgMHgwMSwgMHg0MiwgMHgxOCwgCisweDAxLCAweDIwLCAweDgwLCAweDA3LCAweDEwLCAweDQzLCAweDAwLCAweDY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAKKzB4MDAsIDB4OTAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDAsIDB4MWQsIDB4MDUsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHgzOCwgMHgxYywgMHgyOSwgMHgxYywgMHgwMCwgMHhmMCwgMHhjMiwgMHhmYSwgMHhhOCwgMHg4OCwgCisweDQxLCAweDA3LCAweDAxLCAweGQwLCAweDAwLCAweDIwLCAweDUxLCAweGUwLCAweDI5LCAweDg5LCAweDA5LCAweDE4LCAKKzB4NjAsIDB4NmIsIDB4ODEsIDB4NDIsIDB4ZjgsIDB4ZDgsIDB4NjksIDB4ODksIDB4ZWEsIDB4ODgsIDB4ODksIDB4MTgsIAorMHg4MSwgMHg0MiwgMHhmMywgMHhkOCwgMHgwMCwgMHg5OCwgMHgwMSwgMHgyOCwgMHgyNSwgMHhkMSwgMHhlMCwgMHg2YSwgCisweGYxLCAweDZiLCAweDQwLCAweDE4LCAweDcxLCAweDZjLCAweGZhLCAweDFkLCAweGNkLCAweDMyLCAweDAxLCAweGYwLCAKKzB4MzMsIDB4ZjksIDB4ZmEsIDB4MWQsIDB4ZmYsIDB4MzIsIDB4M2EsIDB4MzIsIDB4ZTAsIDB4NmEsIDB4NTEsIDB4NjksIAorMHg0MCwgMHgxOCwgMHhjMywgMHgxZCwgMHgwMywgMHgzMywgMHgwMCwgMHgyMCwgMHg4MSwgMHgwMCwgMHg1ZSwgMHg1OCwgCisweGM5LCAweDE5LCAweGZmLCAweDMxLCAweDAxLCAweDMxLCAweDRlLCAweDYxLCAweDAxLCAweDMwLCAweDA0LCAweDI4LCAKKzB4ZjYsIDB4ZDMsIDB4ZTAsIDB4NmEsIDB4NTEsIDB4NjksIDB4NDAsIDB4MTgsIDB4YzEsIDB4MWQsIDB4MDUsIDB4MzEsIAorMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgMHg0MywgMHgwMCwgMHhjYSwgMHg1MiwgMHgwMSwgMHgzMCwgMHgwNiwgMHgyOCwgCisweGZhLCAweGQzLCAweDI5LCAweDFjLCAweDExLCAweDRhLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweGFlLCAweGZiLCAKKzB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIDB4NjAsIDB4NmIsIDB4MDIsIDB4NDMsIDB4MDEsIDB4MjAsIDB4MjEsIDB4NmIsIAorMHhmZiwgMHhmNywgMHhhNiwgMHhmYiwgMHgwMSwgMHgyMiwgMHg1MiwgMHgwNCwgMHg2MCwgMHg2YiwgMHgwMiwgMHg0MywgCisweDAwLCAweDIwLCAweGUxLCAweDZhLCAweGZmLCAweGY3LCAweDllLCAweGZiLCAweGExLCAweDZiLCAweDA4LCAweDRhLCAKKzB4MDEsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4OTksIDB4ZmIsIDB4MDMsIDB4MjAsIDB4MDYsIDB4NDksIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg2MiwgMHgwMSwgMHgyMCwgMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDU0LCAweDAwLCAweDAzLCAweDAwLCAweDE0LCAweDAwLCAweDBmLCAweDAwLCAKKzB4NmMsIDB4MDcsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4OGQsIDB4YjAsIDB4MDAsIDB4MjAsIDB4YjUsIDB4NGEsIAorMHhkNSwgMHgxZCwgMHhmOSwgMHgzNSwgMHg2OCwgMHg2MiwgMHgwMSwgMHgyMCwgMHgwMCwgMHgwNSwgMHhiMywgMHg0OSwgCisweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGE4LCAweDZhLCAweGM0LCAweDFkLCAweDJkLCAweDM0LCAweGIxLCAweDQ4LCAKKzB4YzAsIDB4NmEsIDB4ZDcsIDB4MWQsIDB4ZmYsIDB4MzcsIDB4M2EsIDB4MzcsIDB4MzksIDB4NjgsIDB4NGIsIDB4MDAsIAorMHg1OSwgMHgxOCwgMHg0OSwgMHgwMSwgMHg0MCwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhjMSwgMHgxZCwgCisweDA1LCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDA4LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDksIDB4OTAsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MGEsIAorMHgwYSwgMHg5MCwgMHgwYSwgMHg5OCwgMHhhNCwgMHg0ZSwgMHgwMSwgMHgyOCwgMHg1OSwgMHhkMSwgMHgyOCwgMHg2YiwgCisweGEyLCAweDY4LCAweDgwLCAweDE4LCAweGEyLCAweDRhLCAweDIxLCAweDY5LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4ZjAsIDB4MjYsIDB4ZjksIDB4MjgsIDB4NmIsIDB4NzksIDB4NjksIAorMHg0MCwgMHgxOCwgMHhjMSwgMHgxZCwgMHgwNSwgMHgzMSwgMHgwMCwgMHgyMCwgMHg4MiwgMHgwMCwgMHg5OCwgMHg0YiwgCisweGQzLCAweDE4LCAweGZmLCAweDMzLCAweDAxLCAweDMzLCAweDViLCAweDY5LCAweGMwLCAweDQ2LCAweDhiLCAweDUwLCAKKzB4MDEsIDB4MzAsIDB4MDQsIDB4MjgsIDB4ZjQsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4MzEsIDB4MWMsIDB4ODIsIDB4MDAsIAorMHg1NiwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwNCwgMHhhZSwgCisweGIzLCAweDUwLCAweDAxLCAweDMwLCAweDAzLCAweDI4LCAweGY0LCAweGQzLCAweDAwLCAweDIwLCAweDA4LCAweDkwLCAKKzB4OTAsIDB4NDksIDB4NDIsIDB4MDAsIDB4OGIsIDB4NWEsIDB4YjIsIDB4NWEsIDB4OTMsIDB4NDIsIDB4MTMsIDB4ZDAsIAorMHg4ZSwgMHg0OCwgMHhjMSwgMHg4OSwgMHgwMSwgMHgzMSwgMHhjMSwgMHg4MSwgMHhiOCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweDAzLCAweGQxLCAweDM4LCAweDhhLCAweDEwLCAweDIzLCAweDE4LCAweDQzLCAweDcxLCAweGUwLCAweDM4LCAweDhhLCAKKzB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4NmQsIDB4ZTAsIDB4MDAsIDB4ZjAsIDB4MTEsIDB4ZjksIDB4MDEsIDB4ZjAsIAorMHg2NywgMHhmZiwgMHhmNSwgMHhlMCwgMHgwMSwgMHgzMCwgMHgwNiwgMHgyOCwgMHhlMywgMHhkMywgMHgwOCwgMHg5OCwgCisweDAwLCAweDI4LCAweDBjLCAweGQxLCAweGI4LCAweDY4LCAweDQxLCAweDFjLCAweGI5LCAweDYwLCAweDAwLCAweDI4LCAKKzB4MDMsIDB4ZDEsIDB4MzgsIDB4OGEsIDB4MDEsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MDIsIDB4ZTAsIDB4MzgsIDB4OGEsIAorMHgwNCwgMHgyMywgMHgxOCwgMHg0MywgMHgzOCwgMHg4MiwgMHg3OCwgMHg2OCwgMHgwMSwgMHgzMCwgMHg3OCwgMHg2MCwgCisweDYyLCAweGUwLCAweDBhLCAweDk4LCAweDAyLCAweDI4LCAweDVmLCAweGQxLCAweDA5LCAweDk4LCAweDQwLCAweDBjLCAKKzB4NzMsIDB4ZDMsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZTAsIDB4MWQsIDB4MDEsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHhlMSwgMHgxZCwgMHgwZCwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHg0MCwgMHgxOCwgCisweDBjLCAweDM4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDAwLCAweDIxLCAweDhhLCAweDAwLCAweDZiLCAweDRiLCAKKzB4ZDYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MDQsIDB4YWUsIAorMHhiMywgMHg1MCwgMHgwMSwgMHgzMSwgMHgwMywgMHgyOSwgMHhmMywgMHhkMywgMHgwMCwgMHgyMSwgMHg4MywgMHgxZSwgCisweDBjLCAweDkzLCAweDY4LCAweDRhLCAweDE2LCAweDZiLCAweGMwLCAweDQ2LCAweDBiLCAweDk2LCAweDhhLCAweDAwLCAKKzB4MGMsIDB4OWIsIDB4OWIsIDB4MTgsIDB4MGIsIDB4OWUsIDB4OWUsIDB4MTksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHg2ZSwgMHg0NiwgMHhiMywgMHg1MCwgMHgwMSwgMHgzMSwgMHgwNCwgMHgyOSwgCisweGYxLCAweGQzLCAweDY5LCAweDQ2LCAweDhiLCAweDFjLCAweDA3LCAweDkzLCAweDAwLCAweDIxLCAweDA4LCAweDkxLCAKKzB4MDQsIDB4YWUsIDB4NGEsIDB4MDAsIDB4MDcsIDB4OWIsIDB4OWIsIDB4NWEsIDB4YjIsIDB4NWEsIDB4OTMsIDB4NDIsIAorMHgxMSwgMHhkMCwgMHg1OCwgMHg0OCwgMHhjMSwgMHg4OSwgMHgwMSwgMHgzMSwgMHhjMSwgMHg4MSwgMHhmOCwgMHg2OCwgCisweDQxLCAweDFjLCAweGY5LCAweDYwLCAweDAwLCAweDI4LCAweDAzLCAweGQxLCAweDM4LCAweDhhLCAweDIwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MDIsIDB4ZTAsIDB4MzgsIDB4OGEsIDB4ODAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4ODIsIAorMHg4ZiwgMHhlNywgMHgwMSwgMHgzMSwgMHgwNiwgMHgyOSwgMHhlNCwgMHhkMywgMHgwOCwgMHg5OSwgMHgwMCwgMHgyOSwgCisweDBkLCAweGQxLCAweGY5LCAweDY4LCAweDRhLCAweDFjLCAweGZhLCAweDYwLCAweDAwLCAweDI5LCAweDA0LCAweGQxLCAKKzB4MzksIDB4OGEsIDB4MDIsIDB4MjMsIDB4MTksIDB4NDMsIDB4MDMsIDB4ZTAsIDB4MGMsIDB4ZTAsIDB4MzksIDB4OGEsIAorMHgwOCwgMHgyMywgMHgxOSwgMHg0MywgMHgzOSwgMHg4MiwgMHgyOSwgMHg2YiwgMHgwOCwgMHgxOCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDAxLCAweDM4LCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAweDIwLCAweDc2LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZTAsIDB4MWQsIDB4MTEsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIAorMHgwMSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwMCwgMHhlMCwgMHgxOSwgMHhlMCwgMHgzNSwgMHg0OCwgMHgyYSwgMHg2YiwgCisweGMwLCAweDQ2LCAweGVhLCAweDYyLCAweDA0LCAweDI5LCAweDRmLCAweGQxLCAweDAxLCAweDIxLCAweGM2LCAweDFkLCAKKzB4ZmYsIDB4MzYsIDB4NWEsIDB4MzYsIDB4MzEsIDB4NzIsIDB4MGEsIDB4OTksIDB4MDIsIDB4MjksIDB4MWUsIDB4ZDEsIAorMHgwOSwgMHg5OSwgMHgwOSwgMHgwZSwgMHg0OSwgMHgwNiwgMHgxYSwgMHhkMSwgMHhlMSwgMHgxZCwgMHgwNSwgMHgzMSwgCisweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA2LCAweDA5LCAweDBlLCAweDA4LCAweDM5LCAweDFhLCAweGUwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZTAsIDB4MWQsIDB4MDEsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIAorMHhlMSwgMHgxZCwgMHgwZCwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHg0MCwgMHgxOCwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweGY5LCAweDY4LCAweDRhLCAweDFjLCAweGZhLCAweDYwLCAweDAwLCAweDI5LCAweGJjLCAweGQxLCAKKzB4YjYsIDB4ZTcsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZTEsIDB4MWQsIAorMHgwNSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHhhMSwgMHg2MCwgCisweGU4LCAweDZhLCAweGMwLCAweDQ2LCAweDIwLCAweDYwLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDg4LCAweGZjLCAKKzB4MjAsIDB4N2UsIDB4MzMsIDB4MjgsIDB4MDEsIDB4ZDAsIDB4MzIsIDB4MjgsIDB4MTEsIDB4ZDEsIDB4MDEsIDB4MjEsIAorMHgxNCwgMHg0YywgMHhjMCwgMHg0NiwgMHhmOSwgMHg2MCwgMHhiOSwgMHg2MCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDg1LCAweGY4LCAweDI4LCAweDZiLCAweGE5LCAweDZhLCAweGMwLCAweDQ2LCAweDg4LCAweDYyLCAweDIwLCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4YzAsIDB4ZmQsIDB4MDAsIDB4MjgsIDB4MTEsIDB4ZDEsIDB4MGUsIDB4ZTAsIDB4MDAsIDB4MjAsIAorMHgzMCwgMHg3MiwgMHgxMSwgMHhlMCwgMHgzMywgMHgyOSwgMHgwMSwgMHhkMCwgMHgzMiwgMHgyOSwgMHgwZCwgMHhkMSwgCisweDA3LCAweDFjLCAweDAwLCAweGYwLCAweDcxLCAweGY4LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweGIwLCAweGZkLCAKKzB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4ZjAsIDB4NzAsIDB4ZmUsIDB4MGQsIDB4YjAsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhmMCwgMHgxMiwgMHhmOCwgMHhmNiwgMHhlNywgMHgwMCwgMHgwMCwgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAKKzB4YWMsIDB4YWIsIDB4MjAsIDB4NDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4ODAsIDB4ODIsIDB4MDcsIDB4MDAsIDB4ODAsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNywgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNSwgMHgyNSwgMHg0OCwgCisweDQxLCAweDY4LCAweDAxLCAweDMxLCAweDQxLCAweDYwLCAweDI0LCAweDRmLCAweGY5LCAweDFkLCAweGY5LCAweDMxLCAKKzB4MDAsIDB4MjQsIDB4ODgsIDB4NmEsIDB4ZmEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4OTQsIDB4NjEsIDB4MDQsIDB4MjIsIAorMHhmYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg2MCwgMHgxMCwgMHgyMiwgMHhmYiwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDlhLCAweDYxLCAweGZhLCAweDFkLCAweGZmLCAweDMyLCAweDVhLCAweDMyLCAweDEzLCAweDdhLCAweDFiLCAweDRhLCAKKzB4MDAsIDB4MmIsIDB4MGIsIDB4ZDAsIDB4MTUsIDB4OGEsIDB4MmUsIDB4MGEsIDB4MzYsIDB4MDIsIDB4MzMsIDB4MjMsIAorMHgyYiwgMHg0MCwgMHg5YiwgMHgwMCwgMHgxZSwgMHg0MywgMHhjYywgMHgyMywgMHgyYiwgMHg0MCwgMHg5YiwgMHgwOCwgCisweDMzLCAweDQzLCAweDEzLCAweDgyLCAweDEyLCAweDhhLCAweGZiLCAweDY4LCAweGMwLCAweDQ2LCAweGRhLCAweDgzLCAKKzB4NGEsIDB4NmIsIDB4ZmIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZGEsIDB4ODEsIDB4MGEsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg4MiwgMHg2MiwgMHhjNCwgMHg2MiwgMHhjMywgMHgxZCwgMHgzOSwgMHgzMywgMHg0YSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDVhLCAweDgzLCAweDA0LCAweDIzLCAweDAyLCAweDY4LCAweDFhLCAweDQzLCAweDAyLCAweDYwLCAweDg4LCAweDZhLCAKKzB4MDEsIDB4ZjAsIDB4MzIsIDB4ZmEsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4NTQsIDB4MzAsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOCwgMHg2MCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4YWMsIDB4MDcsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4YzEsIDB4MWQsIDB4ZjksIDB4MzEsIDB4OGEsIDB4NmEsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkMSwgMHgxZCwgMHg0NSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweDBiLCAweDA2LCAweDFiLCAweDBlLCAweDAxLCAweDI3LCAweGMxLCAweDFkLCAweGZmLCAweDMxLCAweDRhLCAweDMxLCAKKzB4MzMsIDB4MmIsIDB4MDUsIDB4ZDEsIDB4OGIsIDB4NzAsIDB4MDEsIDB4MWMsIDB4MTAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgwZiwgMHhmOCwgMHgwNiwgMHhlMCwgMHgzMiwgMHgyYiwgMHgwOCwgMHhkMSwgMHg4YiwgMHg3MCwgMHgwMSwgMHgxYywgCisweDEwLCAweDFjLCAweDAwLCAweGYwLCAweDNjLCAweGY4LCAweDM4LCAweDFjLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4ODgsIDB4NzAsIDB4ZjksIDB4ZTcsIDB4OTAsIDB4YjQsIDB4Y2EsIDB4MWQsIAorMHhmOSwgMHgzMiwgMHgzMywgMHgyNywgMHhjYywgMHgxZCwgMHhmZiwgMHgzNCwgMHg0YSwgMHgzNCwgMHhkMywgMHg2YSwgCisweGMwLCAweDQ2LCAweGE3LCAweDcwLCAweGZmLCAweDMxLCAweDQxLCAweDMxLCAweDA3LCAweDZjLCAweGMwLCAweDQ2LCAKKzB4NGYsIDB4NjEsIDB4ZmIsIDB4MTgsIDB4MzksIDB4MWMsIDB4OWYsIDB4MWUsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHhmYywgMHgxYywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHgxYiwgMHgwNiwgMHgxYiwgMHgwZSwgMHg5YiwgMHgwMCwgCisweDFiLCAweDA0LCAweDFiLCAweDBjLCAweGM5LCAweDE4LCAweDA4LCAweDMxLCAweDAxLCAweDY0LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4YjksIDB4MWMsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MzQsIDB4MzAsIDB4MDEsIDB4NzYsIAorMHhmOCwgMHgxZCwgMHgwMSwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHhiOSwgMHgxZCwgCisweDE5LCAweDQzLCAweGQwLCAweDYzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDA4LCAweDQzLCAKKzB4ZDAsIDB4NjMsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4YjAsIDB4YjUsIDB4Y2EsIDB4MWQsIDB4ZjksIDB4MzIsIAorMHhjNSwgMHgxZCwgMHgyZCwgMHgzNSwgMHgzMiwgMHgyMCwgMHhjZiwgMHgxZCwgCisweGZmLCAweDM3LCAweDRhLCAweDM3LCAweGQzLCAweDZhLCAweGMwLCAweDQ2LCAweGI4LCAweDcwLCAweGNjLCAweDFkLCAKKzB4ZmYsIDB4MzQsIDB4M2EsIDB4MzQsIDB4ZTgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjEsIDB4MTAsIDB4MzAsIAorMHhlOCwgMHg2MCwgMHg2MCwgMHg2OSwgMHhjMCwgMHgxOCwgMHg4NywgMHgxZSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDM4LCAweDFkLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDAwLCAweDA0LCAweGI5LCAweDFjLCAweDE5LCAweDQzLCAKKzB4ZDAsIDB4NjMsIDB4MDksIDB4NjgsIDB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDgsIDB4NDMsIDB4ZDAsIDB4NjMsIAorMHhmOCwgMHgxZCwgMHgwMywgMHgzMCwgMHhmZiwgMHhmNywgMHhmYywgMHhmYiwgMHgyMCwgMHg2MiwgMHhmOCwgMHgxZCwgCisweDA3LCAweDMwLCAweGZmLCAweGY3LCAweGY3LCAweGZiLCAweDYwLCAweDYyLCAweDAwLCAweDIwLCAweDI4LCAweDc2LCAKKzB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjcsIDB4YjUsIDB4ODEsIDB4YjAsIDB4MDEsIDB4OTgsIAorMHhjNywgMHgxZCwgMHhmOSwgMHgzNywgMHhiOCwgMHg2YSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNCwgMHgxZCwgCisweDA1LCAweDM0LCAweDIzLCAweDQzLCAweDFjLCAweDY4LCAweGZmLCAweDIzLCAweGZlLCAweDMzLCAweDIzLCAweDQwLCAKKzB4N2YsIDB4NmIsIDB4M2YsIDB4MDQsIDB4M2IsIDB4NDMsIDB4MGIsIDB4NjAsIDB4MzQsIDB4MzAsIDB4MWMsIDB4MWMsIAorMHg4MCwgMHgyMywgMHgyMywgMHg0MCwgMHgwMSwgMHg5ZiwgMHhmZiwgMHgzNywgMHg0MSwgMHgzNywgMHgwMCwgMHgyYiwgCisweDNjLCAweGQwLCAweDBjLCAweDIzLCAweDAwLCAweDkzLCAweDAwLCAweDIzLCAweDlkLCAweDAwLCAweGFlLCAweDE4LCAKKzB4MzYsIDB4NjksIDB4NmQsIDB4MTgsIDB4NmUsIDB4NjEsIDB4MDEsIDB4MzMsIDB4MDUsIDB4MmIsIDB4ZjcsIDB4ZDMsIAorMHgwMCwgMHgyMywgMHg5ZCwgMHgwMCwgMHhhZSwgMHgxOCwgMHg3NiwgMHg2YSwgMHg2ZCwgMHgxOCwgMHhhZSwgMHg2MiwgCisweDAxLCAweDMzLCAweDA1LCAweDJiLCAweGY3LCAweGQzLCAweDAxLCAweDliLCAweGZmLCAweDMzLCAweDUxLCAweDMzLCAKKzB4OWIsIDB4NzgsIDB4MzMsIDB4MmIsIDB4MGUsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzUsIDB4MWQsIAorMHgwMSwgMHgzNSwgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHg0YiwgMHg4MSwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGM1LCAweDFkLCAweDBkLCAweDM1LCAweDJiLCAweDQzLCAweDFiLCAweDY4LCAweDE2LCAweGUwLCAKKzB4N2IsIDB4NjksIDB4YzAsIDB4NDYsIDB4NGIsIDB4ODEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzUsIDB4MWQsIAorMHgwZCwgMHgzNSwgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHg3ZCwgMHg2OSwgMHg1ZCwgMHgxYiwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGM2LCAweDFkLCAweDAxLCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweGViLCAweDE4LCAKKzB4MGMsIDB4M2IsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4OTMsIDB4NGIsIDB4ODEsIDB4Y2IsIDB4ODAsIAorMHg2MywgMHgwOSwgMHg0OSwgMHhkMywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhjNCwgMHgxZCwgMHgwNSwgMHgzNCwgCisweDIzLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAweDBiLCAweDgxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4YzQsIDB4MWQsIDB4MGQsIDB4MzQsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MGMsIDB4ODksIDB4MWIsIDB4MWIsIAorMHgwMCwgMHg5YywgMHgxYywgMHgxYiwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwOCwgMHgzMCwgMHgxOCwgMHg0MywgCisweDAwLCAweDY4LCAweDIwLCAweDE4LCAweDg4LCAweDgwLCAweDM4LCAweDZhLCAweDA0LCAweDBlLCAweGZmLCAweDIzLCAKKzB4MWIsIDB4MDQsIDB4MDMsIDB4NDAsIDB4MWIsIDB4MGEsIDB4MWMsIDB4NDMsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIAorMHgwMywgMHg0MCwgMHgxYiwgMHgwMiwgMHgyMywgMHg0MywgMHgwMCwgMHgwNiwgMHgxOCwgMHg0MywgMHhjOCwgMHg2MCwgCisweDc4LCAweDZhLCAweDA3LCAweDBlLCAweGZmLCAweDIzLCAweDFiLCAweDA0LCAweDAzLCAweDQwLCAweDFiLCAweDBhLCAKKzB4MWYsIDB4NDMsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4MDMsIDB4NDAsIDB4MWIsIDB4MDIsIDB4M2IsIDB4NDMsIAorMHgwMCwgMHgwNiwgMHgxOCwgMHg0MywgMHgwOCwgMHg2MSwgMHhkMCwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjOCwgMHg2MywgCisweDkwLCAweDZiLCAweGMwLCAweDQ2LCAweDA4LCAweDY0LCAweDUwLCAweDZjLCAweGMwLCAweDQ2LCAweDQ4LCAweDY0LCAKKzB4MTAsIDB4NmMsIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjQsIDB4ZDAsIDB4NmMsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjQsIAorMHg5MCwgMHg2YywgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NSwgMHgwMiwgMHhlMCwgMHgwMCwgMHgyMywgMHgwYiwgMHg4MSwgCisweDhiLCAweDgwLCAweDA0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAKKzB4MGYsIDB4NGEsIDB4OTMsIDB4ODksIDB4MDEsIDB4MzMsIDB4OTMsIDB4ODEsIDB4YzIsIDB4MWQsIDB4ZjksIDB4MzIsIAorMHgwNCwgMHgyMywgMHg5MCwgMHg2YSwgMHhjMCwgMHg0NiwgMHhjMywgMHg2MCwgMHgxMCwgMHgyMywgMHg4MywgMHg2MSwgCisweGNiLCAweDBhLCAweDAxLCAweGQzLCAweDE4LCAweDIzLCAweDgzLCAweDYxLCAweGMxLCAweDgzLCAweDUxLCAweDZiLCAKKzB4YzAsIDB4NDYsIDB4YzEsIDB4ODEsIDB4NTEsIDB4NmIsIDB4YzIsIDB4MWQsIDB4MzksIDB4MzIsIDB4NTEsIDB4ODMsIAorMHgwNCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwMSwgMHhmMCwgMHhjMiwgMHhmOCwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MWIsIDB4NGMsIDB4MjAsIDB4NmEsIDB4MDIsIDB4MjgsIDB4MWIsIDB4ZDIsIDB4MDAsIDB4MjAsIAorMHhlNywgMHgxZCwgMHgxOSwgMHgzNywgMHgzOCwgMHg3MSwgMHhlMSwgMHg2OCwgMHhlMCwgMHgxZCwgMHhmOSwgMHgzMCwgCisweDAwLCAweDI5LCAweDE1LCAweGQwLCAweDQyLCAweDZhLCAweDAwLCAweDJhLCAweDEyLCAweGQxLCAweDAxLCAweDI1LCAKKzB4MGEsIDB4ZTAsIDB4ZmYsIDB4ZjcsIDB4ODksIDB4ZmIsIDB4MDAsIDB4MjgsIDB4MDksIDB4ZDEsIDB4MjAsIDB4NmEsIAorMHgwMiwgMHgyOCwgMHgwMCwgMHhkMywgMHgzZCwgMHg3MSwgMHhlMCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgCisweDM4LCAweDc5LCAweDAwLCAweDI4LCAweGYxLCAweGQwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NDAsIDB4NmEsIDB4MDAsIDB4MjgsIDB4ZjksIDB4ZDEsIDB4MDAsIDB4MjksIDB4ZjcsIDB4ZDEsIDB4NjAsIDB4NjksIAorMHgwMCwgMHgyOCwgMHgwNCwgMHhkMCwgMHgwNiwgMHg0OCwgMHgwMCwgMHg2OCwgMHgwMywgMHhmMCwgMHhhOCwgMHhmYywgCisweGVmLCAweGU3LCAweDYwLCAweDY4LCAweDAwLCAweDI4LCAweGVjLCAweGQwLCAweDAwLCAweGYwLCAweDVhLCAweGY4LCAKKzB4ZTksIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4MzQsIDB4MDQsIDB4MDAsIDB4ODAsIAorMHhiMCwgMHhiNSwgMHgwNywgMHgxYywgMHgyMCwgMHgyMywgMHhiOCwgMHg2OCwgMHgxOCwgMHg0MCwgMHgwMSwgMHgyNCwgCisweDAwLCAweDI1LCAweDAwLCAweDI4LCAweDBiLCAweGQxLCAweDM4LCAweDZhLCAweDAwLCAweDI4LCAweDAzLCAweGQxLCAKKzB4MjgsIDB4MWMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MWYsIDB4NDgsIDB4MDEsIDB4NmUsIAorMHgwMSwgMHgzMSwgMHgwMSwgMHg2NiwgMHgwMywgMHhlMCwgMHg0OCwgMHg2OCwgMHhjNCwgMHgyMywgMHgxOCwgMHg0MCwgCisweDAzLCAweGQxLCAweDM4LCAweDZhLCAweDAwLCAweGYwLCAweDBjLCAweGZjLCAweDJmLCAweGUwLCAweDM4LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4MWMsIDB4ZmMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4N2IsIDB4ZmEsIDB4YjgsIDB4NjgsIAorMHhjMCwgMHgwOCwgMHgwMiwgMHhkMywgMHgzOCwgMHg2YSwgMHgwMCwgMHhmMCwgMHhkMSwgMHhmYiwgMHhiOCwgMHg2OCwgCisweDM5LCAweDZhLCAweGMwLCAweDQ2LCAweDg4LCAweDYwLCAweDM4LCAweDZhLCAweGMwLCAweDQ2LCAweGM1LCAweDYwLCAKKzB4MTAsIDB4NDgsIDB4NDEsIDB4NjgsIDB4MDAsIDB4MjksIDB4MTEsIDB4ZDEsIDB4YzEsIDB4NjgsIDB4MDAsIDB4MjksIAorMHgwOSwgMHhkMSwgMHg0MSwgMHg2OSwgMHgwMCwgMHgyOSwgMHgwNiwgMHhkMSwgMHgzOSwgMHg2YSwgMHhjMCwgMHg0NiwgCisweDgxLCAweDYwLCAweDQxLCAweDYwLCAweDAwLCAweGYwLCAweDE0LCAweGY4LCAweDBiLCAweGUwLCAweDM5LCAweDZhLCAKKzB4YzAsIDB4NDYsIDB4ODEsIDB4NjAsIDB4NDEsIDB4NjAsIDB4MDYsIDB4ZTAsIDB4MzksIDB4NmEsIDB4ODIsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhkMSwgMHg2MCwgMHgzOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4MSwgMHg2MCwgMHgyMCwgMHgxYywgCisweGJkLCAweGU3LCAweDAwLCAweDAwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjUsIDB4MGIsIDB4NGMsIDB4NjcsIDB4NjgsIDB4MDAsIDB4MmYsIDB4MGYsIDB4ZDAsIDB4MzgsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHgxMiwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwYSwgMHhkMSwgMHg2MCwgMHg2OCwgMHhjMCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDYwLCAweDYwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGMzLCAweGZiLCAweDAwLCAweDIwLCAKKzB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MjAsIDB4ZmEsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgMHhmZSwgMHgxZCwgMHg0OSwgMHgzNiwgCisweDMwLCAweDc4LCAweDQwLCAweDAwLCAweGMwLCAweDE5LCAweDg1LCAweDhiLCAweDMzLCAweDRjLCAweDM0LCAweDRiLCAKKzB4OWQsIDB4NDIsIDB4M2MsIDB4ZDAsIDB4MzgsIDB4MWMsIDB4MjEsIDB4MWMsIDB4MmEsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgxZCwgMHhmOSwgMHgzMSwgMHg0OCwgMHg4MCwgMHg2YSwgMHg1OCwgMHgyMSwgMHg2OSwgMHg0MywgMHg0MCwgMHgxOCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAKKzB4MmMsIDB4NGQsIDB4MDEsIDB4MjgsIDB4MWEsIDB4ZDEsIDB4MzAsIDB4NzgsIDB4YzAsIDB4MTksIDB4YzEsIDB4MWQsIAorMHgxOSwgMHgzMSwgMHgwOCwgMHg3YSwgMHgzYSwgMHg2OCwgMHg4MCwgMHgxOCwgMHgwOSwgMHg3YiwgMHhlYSwgMHgxZCwgCisweDIxLCAweDMyLCAweDAwLCAweGYwLCAweGUzLCAweGZjLCAweDMwLCAweDc4LCAweGMwLCAweDE5LCAweDIwLCAweDMwLCAKKzB4MDAsIDB4NzksIDB4MzksIDB4NjgsIDB4NDAsIDB4MTgsIDB4YzEsIDB4MWQsIDB4MDUsIDB4MzEsIDB4MDAsIDB4MjAsIAorMHgwMCwgMHgyMywgMHg0MiwgMHgwMCwgMHg4YiwgMHg1MiwgMHgwMSwgMHgzMCwgMHgwNiwgMHgyOCwgMHhmYSwgMHhkMywgCisweGEwLCAweDg4LCAweDQxLCAweDA3LCAweDBiLCAweGQxLCAweDIxLCAweDg5LCAweDA5LCAweDE4LCAweDc4LCAweDY4LCAKKzB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4ODEsIDB4NDIsIDB4MDQsIDB4ZDgsIDB4NjEsIDB4ODksIDB4ZTIsIDB4ODgsIAorMHg4OSwgMHgxOCwgMHg4MSwgMHg0MiwgMHgwMywgMHhkOSwgMHgwMCwgMHgyMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDIxLCAweDFjLCAweDE0LCAweDRhLCAweDAwLCAweDIwLCAweGZlLCAweGY3LCAweDVhLCAweGZmLCAKKzB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIDB4NzgsIDB4NjgsIDB4MDIsIDB4NDMsIAorMHgwMSwgMHgyMCwgMHgzOSwgMHg2OCwgMHhmZSwgMHhmNywgMHg1MiwgMHhmZiwgMHgwMSwgMHgyMiwgMHg1MiwgMHgwNCwgCisweDc4LCAweDY4LCAweDAyLCAweDQzLCAweDAwLCAweDIwLCAweDM5LCAweDY4LCAweGZlLCAweGY3LCAweDRhLCAweGZmLCAKKzB4MGIsIDB4NDksIDB4MGMsIDB4NGEsIDB4MDEsIDB4MjAsIDB4ZmUsIDB4ZjcsIDB4NDUsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHhlOSwgMHgxZCwgMHgxOSwgMHgzMSwgMHg0OCwgMHg3MSwgMHgwMiwgMHgyMSwgMHhlYSwgMHgxZCwgMHhmOSwgMHgzMiwgCisweDUxLCAweDYyLCAweGQ5LCAweGU3LCAweDI4LCAweGFjLCAweDIwLCAweDQwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4NTQsIDB4MDAsIDB4MDMsIDB4MDAsIAorMHgxNCwgMHhhYywgMHgyMCwgMHg0MCwgMHgxNCwgMHgwMCwgMHgwNywgMHgwMCwgMHhmMCwgMHhiNSwgMHg4MywgMHhiMCwgCisweDAwLCAweDIxLCAweDRmLCAweDQ4LCAweGMyLCAweDFkLCAweGY5LCAweDMyLCAweDUxLCAweDYyLCAweDAxLCAweDIxLCAKKzB4YzksIDB4MDQsIDB4NGQsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4YzEsIDB4MWQsIDB4MTksIDB4MzEsIAorMHg0OSwgMHg3OSwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMSwgMHg0YSwgMHg0OCwgMHgwMCwgMHg2OCwgMHgwMywgMHhmMCwgCisweDliLCAweGZiLCAweDg3LCAweGUwLCAweDQ1LCAweDQ4LCAweDQ3LCAweDY4LCAweGZjLCAweDFkLCAweDQ5LCAweDM0LCAKKzB4MjEsIDB4NzgsIDB4NDgsIDB4MDAsIDB4YzAsIDB4MTksIDB4ODAsIDB4OGIsIDB4NDQsIDB4NGEsIDB4OTIsIDB4NmEsIAorMHg1OCwgMHgyMywgMHg1OCwgMHg0MywgMHgxNSwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhlYSwgMHgxZCwgCisweDA1LCAweDMyLCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAweDA4LCAweDM1LCAweDJiLCAweDQzLCAweDFkLCAweDY4LCAKKzB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4MmIsIDB4NDAsIDB4MWIsIDB4MGEsIDB4M2MsIDB4NGQsIDB4MDEsIDB4MmIsIAorMHgyNCwgMHhkMSwgMHhjOCwgMHgxOSwgMHhjMSwgMHgxZCwgMHgxOSwgMHgzMSwgMHgwOCwgMHg3YSwgMHgzYSwgMHg2OCwgCisweDgwLCAweDE4LCAweDM5LCAweDRhLCAweDA5LCAweDdiLCAweDAwLCAweGYwLCAweGM1LCAweGZjLCAweDIwLCAweDc4LCAKKzB4YzAsIDB4MTksIDB4MjAsIDB4MzAsIDB4MDAsIDB4NzksIDB4MzksIDB4NjgsIDB4NDEsIDB4MTgsIDB4MDAsIDB4MjAsIAorMHg4MiwgMHgwMCwgMHg1MywgMHgxOSwgMHg5YiwgMHg2ZSwgMHg2ZSwgMHg0NiwgMHhiMywgMHg1MCwgMHgwMSwgMHgzMCwgCisweDAzLCAweDI4LCAweGY3LCAweGQzLCAweGNhLCAweDFkLCAweDA1LCAweDMyLCAweDY5LCAweDQ2LCAweDAwLCAweDIwLCAKKzB4NDMsIDB4MDAsIDB4Y2QsIDB4NWEsIDB4YzAsIDB4NDYsIDB4ZDUsIDB4NTIsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIAorMHhmOCwgMHhkMywgMHgyZCwgMHhlMCwgMHgwMiwgMHgyYiwgMHgyYiwgMHhkMSwgMHgxMSwgMHgwYSwgMHgyOSwgMHhkMywgCisweDAwLCAweDIxLCAweDhhLCAweDAwLCAweDUzLCAweDE5LCAweDliLCAweDZlLCAweDZlLCAweDQ2LCAweGIzLCAweDUwLCAKKzB4MDEsIDB4MzEsIDB4MDMsIDB4MjksIDB4ZjcsIDB4ZDMsIDB4MjEsIDB4NzgsIDB4NDksIDB4MDAsIDB4YzksIDB4MTksIAorMHgwOSwgMHg4ZiwgMHgzYSwgMHg2OCwgMHg4YiwgMHgxOCwgMHg2YSwgMHg0NiwgMHgwMCwgMHgyMSwgMHg0ZCwgMHgwMCwgCisweDU2LCAweDViLCAweGMwLCAweDQ2LCAweDVlLCAweDUzLCAweDAxLCAweDMxLCAweDA2LCAweDI5LCAweGY4LCAweGQzLCAKKzB4MTksIDB4NDksIDB4OGEsIDB4NmEsIDB4MTMsIDB4MTgsIDB4MWEsIDB4NmQsIDB4MDAsIDB4OWQsIDB4NTUsIDB4NDAsIAorMHgxOSwgMHg0YSwgMHhkNiwgMHg2OCwgMHg3NSwgMHg0MCwgMHgxZCwgMHg2NSwgMHg4OSwgMHg2YSwgMHgwOCwgMHgxOCwgCisweDQxLCAweDZkLCAweDAyLCAweDliLCAweDU5LCAweDQwLCAweDkyLCAweDY5LCAweDUxLCAweDQwLCAweDQxLCAweDY1LCAKKzB4MjAsIDB4NzgsIDB4NDEsIDB4MWUsIDB4MjEsIDB4NzAsIDB4MDAsIDB4MjgsIDB4MGQsIDB4ZDAsIDB4MzgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhmNCwgMHhmZSwgMHgwMCwgMHgyOCwgMHgwZCwgMHhkMSwgMHgwOCwgMHg0YSwgMHg1MCwgMHg2OCwgCisweGMwLCAweDY4LCAweGMwLCAweDQ2LCAweDUwLCAweDYwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGE0LCAweGZhLCAKKzB4MDIsIDB4ZTAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NzMsIDB4ZmEsIDB4MDEsIDB4ZjAsIDB4ZGUsIDB4ZmEsIAorMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDM4LCAweDA0LCAweDAwLCAweDgwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAKKzB4YWMsIDB4YWIsIDB4MjAsIDB4NDAsIDB4OTQsIDB4MDYsIDB4MDAsIDB4ODAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHhmMCwgMHhiNSwgMHg4MiwgMHhiMCwgMHg2OSwgMHg0YiwgMHg5ZiwgMHg2YSwgMHg1OCwgMHgyMywgMHg1YSwgMHg0MywgCisweGJhLCAweDE4LCAweGMzLCAweDFkLCAweDQ5LCAweDMzLCAweDFmLCAweDc4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4ZDQsIDB4MWQsIDB4MDEsIDB4MzQsIDB4MjMsIDB4NDMsIDB4MWQsIDB4NjgsIDB4NDMsIDB4NjgsIDB4MWMsIDB4MDQsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNiwgMHgxZCwgMHgwNSwgMHgzNiwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgCisweDFjLCAweDQzLCAweDQyLCAweDIzLCAweDFjLCAweDQzLCAweDBjLCAweDYwLCAweGZmLCAweDI2LCAweDM2LCAweDAyLCAKKzB4MmUsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4OWUsIDB4NDIsIDB4NzQsIDB4ZDEsIDB4NmIsIDB4MGMsIAorMHgyYiwgMHhkMywgMHhjMywgMHgxOSwgMHgyMCwgMHgzMywgMHgxYiwgMHg3OSwgCisweGMwLCAweDQ2LCAweDRiLCAweDgxLCAweDdiLCAweDAwLCAweDFiLCAweDE4LCAweDFiLCAweDhmLCAweDRjLCAweDg5LCAKKzB4MWIsIDB4MWIsIDB4Y2IsIDB4ODAsIDB4MDAsIDB4MjQsIDB4YTYsIDB4MDAsIDB4MDEsIDB4OTYsIDB4YjMsIDB4MTgsIAorMHhkZSwgMHgxZCwgMHgwOSwgMHgzNiwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgCisweDAxLCAweDllLCAweDc2LCAweDE4LCAweDczLCAweDYxLCAweDAxLCAweDM0LCAweDA1LCAweDJjLCAweGYwLCAweGQzLCAKKzB4MDAsIDB4MjQsIDB4YTYsIDB4MDAsIDB4MDAsIDB4OTYsIDB4YjMsIDB4MTgsIDB4ZGUsIDB4MWQsIDB4MWQsIDB4MzYsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwMCwgMHg5ZSwgMHg3NiwgMHgxOCwgCisweGIzLCAweDYyLCAweDAxLCAweDM0LCAweDA1LCAweDJjLCAweGYwLCAweGQzLCAweDA2LCAweGUwLCAweDAwLCAweDIzLCAKKzB4NGIsIDB4ODEsIDB4Y2IsIDB4ODAsIDB4NDAsIDB4MjMsIDB4OWMsIDB4NDMsIDB4MGMsIDB4NjAsIDB4MjMsIDB4MWMsIAorMHg2YiwgMHgwZSwgMHg0YSwgMHhkMywgMHhjMywgMHgxOSwgMHgyMCwgMHgzMywgMHgxYiwgMHg3OSwgMHgxMCwgMHgzMywgCisweDBiLCAweDgxLCAweDdiLCAweDAwLCAweDFiLCAweDE4LCAweDFiLCAweDhmLCAweDBmLCAweDg5LCAweGRiLCAweDFiLCAKKzB4OGIsIDB4ODAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIDB4MzUsIDB4MzQsIDB4MjMsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhjYiwgMHg2MywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNCwgMHgxZCwgCisweDMxLCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAweDBiLCAweDY0LCAweGFiLCAweDBlLCAKKzB4MjEsIDB4ZDIsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIDB4M2QsIDB4MzQsIDB4MjMsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHg0YiwgMHg2NCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNCwgMHgxZCwgCisweDM5LCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAweDhiLCAweDY0LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIDB4NDUsIDB4MzQsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHhjYiwgMHg2NCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNCwgMHgxZCwgMHg0MSwgMHgzNCwgMHgyMywgMHg0MywgCisweDFiLCAweDY4LCAweGMwLCAweDQ2LCAweDBiLCAweDY1LCAweDAwLCAweGUwLCAweDBmLCAweGUwLCAweGZiLCAweDFmLCAKKzB4MDEsIDB4M2IsIDB4MWIsIDB4MDQsIDB4MWIsIDB4MGMsIDB4MDcsIDB4NjgsIDB4ZmYsIDB4MTgsIDB4MDMsIDB4NjksIAorMHgwOCwgMHgxYywgMHgzOSwgMHgxYywgMHgwMCwgMHhmMCwgMHgzNCwgMHhmOCwgMHgyYywgMHhlMCwgMHgwMCwgMHgyMywgCisweDBiLCAweDgxLCAweDhiLCAweDgwLCAweDI4LCAweGUwLCAweDAwLCAweDIzLCAweDhiLCAweDgwLCAweDBiLCAweDgxLCAKKzB4YzMsIDB4MTksIDB4MjAsIDB4MzMsIDB4MWIsIDB4N2EsIDB4YzAsIDB4NDYsIDB4NGIsIDB4ODEsIDB4N2IsIDB4MDAsIAorMHgxOCwgMHgxOCwgMHgwMCwgMHg4ZSwgMHhjMCwgMHg0NiwgMHhjOCwgMHg4MCwgMHgwMCwgMHgyMCwgMHg4NywgMHgwMCwgCisweGJiLCAweDE4LCAweGRjLCAweDFkLCAweDA5LCAweDM0LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDIzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4N2YsIDB4MTgsIDB4N2IsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MDUsIDB4MjgsIDB4ZjIsIDB4ZDMsIAorMHgwMCwgMHgyMCwgMHg4NywgMHgwMCwgMHhiYiwgMHgxOCwgMHhkYywgMHgxZCwgMHgxZCwgMHgzNCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweDdmLCAweDE4LCAweGJiLCAweDYyLCAweDAxLCAweDMwLCAKKzB4MDUsIDB4MjgsIDB4ZjIsIDB4ZDMsIDB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNCwgMHgxZiwgMHgxYywgMHgzYiwgMHgwYywgMHgxOCwgMHhkMiwgCisweDE3LCAweDZkLCAweDExLCAweDRiLCAweGMwLCAweDQ2LCAweGRmLCAweDYwLCAweDUyLCAweDZkLCAweGMwLCAweDQ2LCAKKzB4MWEsIDB4NjEsIDB4YzcsIDB4NjAsIDB4MWEsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDIsIDB4NjEsIDB4ZDgsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg4MCwgMHhkOCwgMHg2OCwgMHgwMCwgMHgwYywgMHg0OCwgMHg4MCwgMHgxOCwgMHg2OSwgCisweGMwLCAweDQ2LCAweDg4LCAweDgwLCAweDE4LCAweDY5LCAweDAwLCAweDBjLCAweGM4LCAweDgwLCAweDgwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4NGEsIDB4ODgsIDB4MTIsIDB4MDQsIDB4MGIsIDB4ODgsIDB4MWEsIDB4NDMsIDB4YzIsIDB4NjAsIAorMHg4YSwgMHg4OCwgMHhjOSwgMHg4OCwgMHgwOSwgMHgwNCwgMHgxMSwgMHg0MywgMHgwMSwgMHg2MSwgMHhmMiwgMHhlNywgCisweDJjLCAweDA3LCAweDAwLCAweDgwLCAweGYxLCAweGI1LCAweDg4LCAweGIwLCAweDAwLCAweDIyLCAweDA4LCAweDk4LCAKKzB4MDAsIDB4NmEsIDB4MDgsIDB4OWIsIDB4OTksIDB4NjgsIDB4NDksIDB4MGEsIDB4MDIsIDB4ZDMsIDB4MDEsIDB4MjcsIAorMHhmZiwgMHgwMywgMHgwMCwgMHhlMCwgMHgwMCwgMHgyNywgMHgwMywgMHg4YiwgMHgwMCwgMHgyYiwgMHgxOSwgMHhkMCwgCisweGEzLCAweDQ5LCAweDg5LCAweDZhLCAweDFjLCAweDFjLCAweDU4LCAweDIzLCAweDYzLCAweDQzLCAweGM5LCAweDE4LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4NTgsIDB4MzksIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MDksIDB4MDQsIAorMHgwOSwgMHgwYywgMHgwMiwgMHgyOSwgMHgwMiwgMHhkMSwgMHgwOCwgMHgyMywgMHgxZiwgMHg0MywgMHgwNywgMHhlMCwgCisweDQxLCAweDhiLCAweDAwLCAweDI5LCAweDAyLCAweGQwLCAweDBjLCAweDIzLCAKKzB4MWYsIDB4NDMsIDB4MDEsIDB4ZTAsIDB4MDQsIDB4MjMsIDB4MWYsIDB4NDMsIDB4ODMsIDB4OGEsIDB4MDAsIDB4MmIsIAorMHgxOCwgMHhkMCwgMHg5NSwgMHg0OSwgMHg4OSwgMHg2YSwgMHgxYywgMHgxYywgMHg1OCwgMHgyMywgMHg2MywgMHg0MywgCisweGM5LCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU4LCAweDM5LCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDIsIDB4MjksIDB4MDEsIDB4ZDEsIDB4MGYsIDB4NDMsIDB4MDcsIDB4ZTAsIAorMHhjMSwgMHg4YSwgMHgwMCwgMHgyOSwgMHgwMiwgMHhkMCwgMHgwMywgMHgyMywgMHgxZiwgMHg0MywgMHgwMSwgMHhlMCwgCisweDAxLCAweDIzLCAweDFmLCAweDQzLCAweGMxLCAweDFkLCAweDM5LCAweDMxLCAweDA3LCAweDkxLCAweDRiLCAweDg5LCAKKzB4MGMsIDB4ODksIDB4MWMsIDB4MTksIDB4MjQsIDB4MDQsIDB4MjQsIDB4MGMsIDB4MDgsIDB4OWQsIDB4MmQsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMSwgMHg5NSwgMHhjOSwgMHg4OCwgMHg3ZCwgMHgwOCwgMHgxYSwgMHhkMywgMHgxYSwgMHgxYywgCisweGMzLCAweDFkLCAweDE5LCAweDMzLCAweDFhLCAweDcyLCAweDA3LCAweDlhLCAweDkyLCAweDg5LCAweGMwLCAweDQ2LCAKKzB4MWEsIDB4NzMsIDB4MDcsIDB4OWEsIDB4MTIsIDB4ODksIDB4YzAsIDB4NDYsIDB4MDIsIDB4ODYsIDB4MDQsIDB4ODcsIAorMHg4MiwgMHg4YSwgMHgwMSwgMHgzYSwgMHg4MiwgMHg4MywgMHgwMSwgMHgyMiwgMHgxOSwgMHg3MSwgMHgwOCwgMHg5YiwgCisweDFiLCAweDY4LCAweDViLCAweDE4LCAweDViLCAweDc4LCAweDliLCAweDAwLCAweDFiLCAweDA0LCAweDFiLCAweDBjLCAKKzB4MDgsIDB4MzMsIDB4NTksIDB4MTgsIDB4YmIsIDB4MDgsIDB4NDcsIDB4ZDMsIDB4MDcsIDB4OWIsIDB4NWIsIDB4ODksIAorMHg4NSwgMHgxOCwgMHgwNiwgMHg5NSwgMHgyMCwgMHgzNSwgMHgyYiwgMHg3MiwgMHgwNywgMHg5YiwgMHg5YiwgMHg4OSwgCisweGMwLCAweDQ2LCAweDJiLCAweDczLCAweDA3LCAweDliLCAweDFiLCAweDg5LCAweDJlLCAweDFjLCAweDU1LCAweDAwLCAKKzB4MmQsIDB4MTgsIDB4MDUsIDB4OTUsIDB4MmIsIDB4ODYsIDB4MDAsIDB4MmEsIDB4MDEsIDB4ZDAsIDB4YzMsIDB4OGEsIAorMHgwMCwgMHhlMCwgMHg4MywgMHg4YSwgMHgwMSwgMHgzYiwgMHgwNSwgMHg5ZCwgMHhjMCwgMHg0NiwgMHhhYiwgMHg4MywgCisweDMxLCAweDcxLCAweDY1LCAweDRiLCAweDlkLCAweDZhLCAweDA1LCAweDliLCAweDllLCAweDhiLCAweDU4LCAweDIzLCAKKzB4NzMsIDB4NDMsIDB4ZWIsIDB4MTgsIDB4ZGQsIDB4MWQsIDB4MDEsIDB4MzUsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgyYiwgMHg0MywgMHgxZCwgMHg2OCwgMHgyYiwgMHgwZSwgMHg1YiwgMHgwNiwgMHgwMSwgMHhkMSwgMHgwOCwgMHgzMSwgCisweDAwLCAweGUwLCAweDEwLCAweDMxLCAweDgxLCAweDIzLCAweDViLCAweDAyLCAweDFkLCAweDQwLCAweDlkLCAweDQyLCAKKzB4MDMsIDB4ZDEsIDB4ZTMsIDB4MWYsIDB4MDUsIDB4M2IsIDB4MWMsIDB4MDQsIDB4MjQsIDB4MGMsIDB4MDUsIDB4OWIsIAorMHhjMCwgMHg0NiwgMHgxYywgMHg4NywgMHgwOCwgMHg5YiwgMHgxYiwgMHg2OCwgMHgxYiwgMHgxOSwgMHgxMCwgMHgzYiwgCisweDliLCAweDdiLCAweDA2LCAweDlkLCAweDQwLCAweDM1LCAweDJiLCAweDcwLCAweDJiLCAweDc4LCAweDAyLCAweDMzLCAKKzB4ZTMsIDB4MWEsIDB4MWMsIDB4MDQsIDB4MjQsIDB4MGMsIDB4MDEsIDB4MzIsIDB4YmIsIDB4MDgsIDB4OWIsIDB4MDcsIAorMHg2ZCwgMHhkMCwgMHg4MywgMHgxOCwgMHgyMCwgMHgzMywgMHgwNCwgMHg5MywgMHgxOSwgMHg3MiwgMHgwMSwgMHg5YiwgCisweDVkLCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDJiLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA3LCAKKzB4MWIsIDB4MGYsIDB4OWIsIDB4MDAsIDB4MDQsIDB4OWUsIDB4YzAsIDB4NDYsIDB4MzMsIDB4NzMsIDB4MDAsIDB4OTUsIAorMHgyYiwgMHg3OCwgMHgxYiwgMHgwNywgMHgxYiwgMHgwZiwgMHg5YiwgMHgwMCwgMHgwNCwgMHg5ZCwgMHhjMCwgMHg0NiwgCisweDJiLCAweDczLCAweDAwLCAweDlkLCAweGViLCAweDc4LCAweGFkLCAweDc4LCAweDFiLCAweDAyLCAweDFkLCAweDQzLCAKKzB4MmIsIDB4MDIsIDB4MmQsIDB4MGEsIDB4MmQsIDB4MDYsIDB4MmQsIDB4MGUsIDB4MmIsIDB4NDMsIDB4NTUsIDB4MDAsIAorMHgyZCwgMHgxOCwgMHgyYiwgMHg4NiwgMHgwNCwgMHg5YiwgMHhjMCwgMHg0NiwgMHg1OSwgMHg3MiwgMHgwNCwgMHg5YiwgCisweDFiLCAweDdiLCAweDJlLCAweDFjLCAweDA0LCAweDlkLCAweGMwLCAweDQ2LCAweDZiLCAweDczLCAweDMzLCAweDhlLCAKKzB4YzAsIDB4NDYsIDB4NzMsIDB4ODYsIDB4MDAsIDB4OWQsIDB4MmIsIDB4NzgsIDB4MWIsIDB4MDcsIDB4MWIsIDB4MGYsIAorMHg5YiwgMHgwMCwgMHgxYiwgMHgwNCwgMHgxYiwgMHgwYywgMHg1OSwgMHgxOCwgMHgwNCwgMHgyNSwgMHgzZCwgMHg0MCwgCisweDBlLCAweGQwLCAweDM0LCAweDg3LCAweDAzLCAweDhiLCAweDAxLCAweDNiLCAweGIzLCAweDgzLCAweDEzLCAweDFjLCAKKzB4MWIsIDB4MTgsIDB4MjAsIDB4MzMsIDB4MTksIDB4NzEsIDB4MDEsIDB4OWIsIDB4NWIsIDB4MTgsIDB4NWIsIDB4NzgsIAorMHg5YiwgMHgwMCwgMHg1OSwgMHgxOCwgMHgwOCwgMHgzMSwgMHgwMSwgMHgzMiwgMHgzYiwgMHgwOSwgMHgzNywgMHhkMywgCisweDAwLCAweDJkLCAweDAxLCAweGQwLCAweDQzLCAweDhiLCAweDAwLCAweGUwLCAweDAzLCAweDhiLCAweDU1LCAweDAwLCAKKzB4MmQsIDB4MTgsIDB4MDEsIDB4M2IsIDB4YWIsIDB4ODMsIDB4ODMsIDB4MTgsIDB4MDMsIDB4OTMsIDB4MjAsIDB4MzMsIAorMHgxOSwgMHg3MSwgMHgyMCwgMHg0YiwgMHg5ZCwgMHg2YSwgMHg1MywgMHgwMCwgMHgxYiwgMHgxOCwgMHgwMiwgMHg5MywgCisweDllLCAweDhiLCAweDU4LCAweDIzLCAweDczLCAweDQzLCAweGViLCAweDE4LCAweGRkLCAweDFkLCAweDAxLCAweDM1LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MmIsIDB4NDMsIDB4MWQsIDB4NjgsIAorMHgyYiwgMHgwZSwgMHg1YiwgMHgwNiwgMHgwMiwgMHhkMSwgMHgwOCwgMHgzMSwgMHgwMSwgMHhlMCwgMHgxNSwgMHhlMCwgCisweDEwLCAweDMxLCAweDgxLCAweDIzLCAweDViLCAweDAyLCAweDFkLCAweDQwLCAweDlkLCAweDQyLCAweDAzLCAweGQxLCAKKzB4ZTMsIDB4MWYsIDB4MDUsIDB4M2IsIDB4MWMsIDB4MDQsIDB4MjQsIDB4MGMsIDB4MDIsIDB4OWIsIDB4YzAsIDB4NDYsIAorMHgxYywgMHg4NywgMHgwOCwgMHg5YiwgMHgxYiwgMHg2OCwgMHgxYiwgMHgxOSwgMHgxMCwgMHgzYiwgMHg5YiwgMHg3YiwgCisweDAzLCAweDljLCAweDQwLCAweDM0LCAweDIzLCAweDcwLCAweDAxLCAweDMyLCAweDA3LCAweDliLCAweGMwLCAweDQ2LCAKKzB4ZDksIDB4ODAsIDB4NTEsIDB4MWUsIDB4YzMsIDB4MWQsIDB4NDksIDB4MzMsIDB4MTksIDB4NzAsIDB4MDcsIDB4NjEsIAorMHgwNCwgMHgyYSwgMHgwNiwgMHhkMiwgMHgwNiwgMHg0OSwgMHg1MywgMHgwMCwgMHgxYiwgMHgxOCwgMHg5OSwgMHg4MywgCisweDAxLCAweDMyLCAweDA0LCAweDJhLCAweGY5LCAweGQzLCAweDA5LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHg3MCwgMHg0NywgMHg4MCwgMHhiNSwgMHg4YywgMHhiMCwgMHgwNywgMHgxYywgMHgxMiwgMHg0OCwgMHgwMSwgMHg2OCwgCisweDAxLCAweDMxLCAweDAxLCAweDYwLCAweDM4LCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweDc4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4OTAsIDB4YjgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4MGQsIDB4NDgsIAorMHg0MSwgMHg2OCwgMHhjOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDRmLCAweGY4LCAweGI4LCAweDY4LCAweDQwLCAweDA5LCAweDA2LCAweGQzLCAweDEwLCAweDIzLCAweDAyLCAweDk4LCAKKzB4MTgsIDB4NDMsIDB4MDIsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDIsIDB4ZjAsIDB4ZTEsIDB4ZmYsIDB4NjgsIDB4NDYsIAorMHgwMiwgMHhmMCwgMHg5YSwgMHhmZSwgMHgwYywgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDhjLCAweGIwLCAKKzB4MDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4NDEsIDB4NjgsIDB4MDUsIDB4NGIsIDB4MTksIDB4NDMsIAorMHgwMSwgMHg5MSwgMHgwMCwgMHhmMCwgMHgyZiwgMHhmOCwgMHg2OCwgMHg0NiwgMHgwMiwgMHhmMCwgMHg4NCwgMHhmZSwgCisweDBjLCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGEwLCAKKzB4MDIsIDB4NmEsIDB4MDMsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MTMsIDB4NjAsIDB4NDAsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg1MCwgMHg2MCwgMHg0MCwgMHgzMiwgMHg0OCwgMHg2OCwgMHhjMCwgMHg0NiwgMHg5MCwgMHg4MCwgMHhjOCwgMHg2OCwgCisweGMwLCAweDQ2LCAweGQwLCAweDgwLCAweDQ4LCAweDY5LCAweGMwLCAweDQ2LCAweDEwLCAweDgxLCAweDg4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4NTAsIDB4ODEsIDB4MDgsIDB4N2UsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NzMsIDB4MDgsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg5MCwgMHg4MSwgMHg3MCwgMHg0NywgMHgwNCwgMHg0OSwgMHgwOCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweDAwLCAweGQxLCAweDcwLCAweDQ3LCAweGMyLCAweDY4LCAweGMwLCAweDQ2LCAweDBhLCAweDYwLCAweGZhLCAweGU3LCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4MDIsIDB4NDksIDB4MGEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YzIsIDB4NjAsIAorMHgwOCwgMHg2MCwgMHg3MCwgMHg0NywgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHhiMCwgMHhiNCwgMHgwMCwgMHgyMiwgCisweDEyLCAweDRmLCAweDdjLCAweDdmLCAweDAxLCAweDM0LCAweDdjLCAweDc3LCAweDAzLCAweDIzLCAweGZjLCAweDFkLCAKKzB4MTksIDB4MzQsIDB4MzgsIDB4NjIsIDB4NzksIDB4NjIsIDB4MjMsIDB4NzIsIDB4MGUsIDB4NGMsIDB4MjUsIDB4NjgsIAorMHg2YiwgMHgwYywgMHgwNSwgMHhkMiwgMHgyMywgMHg2OCwgMHgxYiwgMHgwYywgMHgxMCwgMHhkMSwgMHgyNCwgMHg2OCwgCisweGEzLCAweDBhLCAweDBkLCAweGQzLCAweDAxLCAweDIzLCAweDBhLCAweDRmLCAweGMwLCAweDQ2LCAweGZiLCAweDYyLCAKKzB4MDksIDB4NGYsIDB4MGEsIDB4NGIsIDB4YzAsIDB4NDYsIDB4ZGYsIDB4NjAsIDB4OTksIDB4NjAsIDB4NTgsIDB4NjAsIAorMHgxMCwgMHgxYywgMHgxOCwgMHg2MCwgMHgwMSwgMHgzMiwgMHhmYiwgMHhlNywgMHgxMCwgMHgxYywgMHgzOCwgMHg2NCwgCisweDAxLCAweDMyLCAweGZiLCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDIsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHhmMCwgMHhiNSwgMHg0NywgMHg0ZiwgMHgzOCwgMHg2OCwgMHg0NywgMHg0ZSwgMHg0NywgMHg0ZCwgMHgwNywgMHgyMywgCisweDViLCAweDAyLCAweGVjLCAweDE4LCAweDAwLCAweDI4LCAweDFkLCAweGQxLCAweDIwLCAweDZiLCAweDAxLCAweDMwLCAKKzB4MjAsIDB4NjMsIDB4NDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4NDMsIDB4NDgsIDB4NDEsIDB4NjksIAorMHgwMCwgMHgyOSwgMHgxMywgMHhkMCwgMHhjMSwgMHgxZCwgMHg2OSwgMHgzMSwgMHgwOSwgMHg3YiwgMHgwMCwgMHgyOSwgCisweDBlLCAweGQwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDAxLCAweDZkLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ODEsIDB4NjEsIDB4YzIsIDB4NjksIDB4OTEsIDB4NDIsIDB4MDQsIDB4ZDAsIDB4ZjEsIDB4NmMsIAorMHgwMSwgMHgzMSwgMHhmMSwgMHg2NCwgMHgwMSwgMHhmMCwgMHg1MCwgMHhmZSwgCisweDM4LCAweDY4LCAweDAxLCAweDI4LCAweDE3LCAweGQxLCAweDM3LCAweDQ4LCAweDQxLCAweDY5LCAweDAwLCAweDI5LCAKKzB4MTMsIDB4ZDAsIDB4YzEsIDB4MWQsIDB4NjksIDB4MzEsIDB4MDksIDB4N2IsIDB4MDAsIDB4MjksIDB4MGUsIDB4ZDAsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMSwgMHg2ZCwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDgxLCAweDYxLCAweGMyLCAweDY5LCAweDkxLCAweDQyLCAweDA0LCAweGQwLCAweGYxLCAweDZjLCAweDAxLCAweDMxLCAKKzB4ZjEsIDB4NjQsIDB4MDEsIDB4ZjAsIDB4MzUsIDB4ZmUsIDB4MzgsIDB4NjgsIDB4MDIsIDB4MjgsIDB4MmYsIDB4ZDEsIAorMHhiYiwgMHgyMywgMHgxYiwgMHgwMSwgMHhlZSwgMHgxOCwgMHg3MCwgMHg3YiwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgCisweDAwLCAweDIwLCAweDcwLCAweDczLCAweDAwLCAweGYwLCAweDRhLCAweGZkLCAweDMwLCAweDdiLCAweDAwLCAweDI4LCAKKzB4MDIsIDB4ZDAsIDB4NzgsIDB4NjgsIDB4MDIsIDB4ZjAsIDB4YWEsIDB4ZmYsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIAorMHhlOCwgMHgxOCwgMHhjMCwgMHg4YiwgMHgwNCwgMHgyNiwgMHgwNiwgMHg0MCwgMHhlMCwgMHg2YSwgMHhiMCwgMHg0MiwgCisweDE0LCAweGQwLCAweGY4LCAweDY4LCAweDAxLCAweDMwLCAweGY4LCAweDYwLCAweDE5LCAweDI4LCAweDExLCAweGQzLCAKKzB4MWIsIDB4NDgsIDB4MDEsIDB4N2IsIDB4MDAsIDB4MjksIDB4MGQsIDB4ZDEsIDB4ZmYsIDB4MzAsIDB4NDEsIDB4MzAsIAorMHg0MCwgMHg3OCwgMHgwMCwgMHgyOCwgMHgwOCwgMHhkMSwgMHhiOCwgMHg2OCwgMHgwMiwgMHhmMCwgMHg5MCwgMHhmZiwgCisweDAwLCAweDIwLCAweGY4LCAweDYwLCAweGU2LCAweDYyLCAweDAxLCAweGUwLCAweDAwLCAweDIwLCAweGY4LCAweDYwLCAKKzB4MzgsIDB4NjgsIDB4MDMsIDB4MjgsIDB4MGIsIDB4ZDEsIDB4ZWMsIDB4MWQsIDB4NzksIDB4MzQsIDB4ZTAsIDB4NmIsIAorMHg4MCwgMHgwOCwgMHgwMiwgMHhkMywgMHgwMiwgMHgyMCwgMHgwMiwgMHhmMCwgMHgwNywgMHhmYywgMHgwMiwgMHgyMywgCisweGUwLCAweDZiLCAweDk4LCAweDQzLCAweGUwLCAweDYzLCAweDM4LCAweDY4LCAweDAxLCAweDMwLCAweDM4LCAweDYwLCAKKzB4MDMsIDB4MjgsIDB4MDEsIDB4ZDksIDB4MDAsIDB4MjAsIDB4MzgsIDB4NjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgzYywgMHgwNCwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDY0LCAweDJkLCAweDAwLCAweDgwLCAKKzB4ZTQsIDB4MmMsIDB4MDAsIDB4ODAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjQsIDB4MWQsIDB4NDgsIAorMHg4NCwgMHg4YSwgMHgxZCwgMHg0YSwgMHgxMywgMHg4YSwgMHhjMSwgMHgxZCwgMHgwOSwgMHgzMSwgMHgwMSwgMHgyNywgCisweDljLCAweDQyLCAweDAzLCAweGQxLCAweDQzLCAweDhhLCAweDU0LCAweDhhLCAweGEzLCAweDQyLCAweDEwLCAweGQwLCAKKzB4MGIsIDB4NzgsIDB4MDAsIDB4MmIsIDB4MGQsIDB4ZDAsIDB4NGIsIDB4NzgsIDB4MDAsIDB4MmIsIDB4MGEsIDB4ZDAsIAorMHg0NCwgMHg4YiwgMHg5MywgMHg4YSwgMHg5YywgMHg0MiwgMHgwNCwgMHhkYywgMHgxMywgMHg0YiwgMHhjMCwgMHg0NiwgCisweDVmLCAweDYwLCAweDk3LCAweDgyLCAweDAxLCAweGUwLCAweDAxLCAweDMzLCAweDkzLCAweDgyLCAweGMzLCAweDhiLCAKKzB4NWMsIDB4MWMsIDB4YzQsIDB4ODMsIDB4ODQsIDB4OGIsIDB4YTMsIDB4NDIsIDB4MGUsIDB4ZGIsIDB4ODQsIDB4OGEsIAorMHgwNSwgMHg4YiwgMHgwMCwgMHgyMywgMHhhYywgMHg0MiwgMHgwNSwgMHhkYSwgMHg0NCwgMHg4YSwgMHhjNSwgMHg4YSwgCisweGFjLCAweDQyLCAweDAxLCAweGRhLCAweDRiLCAweDcwLCAweDAwLCAweGUwLCAweDRmLCAweDcwLCAweDQzLCAweDgyLCAKKzB4ODMsIDB4ODIsIDB4YzMsIDB4ODMsIDB4NDEsIDB4OGEsIDB4YzAsIDB4NDYsIDB4NTEsIDB4ODIsIDB4ODAsIDB4OGEsIAorMHhjMCwgMHg0NiwgMHgxMCwgMHg4MiwgMHhiMCwgMHhiYywgMHg3MCwgMHg0NywgMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDNjLCAweDA0LCAweDAwLCAweDgwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAweGY3LCAweGI1LCAweDkxLCAweGIwLCAKKzB4NmIsIDB4NDYsIDB4ODQsIDB4MWUsIDB4MTIsIDB4OTksIDB4MTQsIDB4MjksIDB4MWEsIDB4ZDksIDB4MDAsIDB4MjAsIAorMHg4MSwgMHgwMCwgMHg2NywgMHg1OCwgMHhjMCwgMHg0NiwgMHg1NywgMHg1MCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgCisweDAwLCAweDBlLCAweDEwLCAweDI4LCAweGY2LCAweGQzLCAweDAwLCAweDIxLCAweDA1LCAweDIwLCAweDg3LCAweDAwLCAKKzB4ZDYsIDB4NTksIDB4NGYsIDB4MWMsIDB4M2QsIDB4MDYsIDB4MmQsIDB4MGUsIDB4MGYsIDB4MWMsIDB4YmYsIDB4MDAsIAorMHhkZSwgMHg1MSwgMHgyOSwgMHgxYywgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgxMCwgMHgyOCwgCisweGYxLCAweGQzLCAweDA5LCAweGUwLCAweDAwLCAweDIwLCAweDgxLCAweDAwLCAweDYzLCAweDU4LCAweGMwLCAweDQ2LCAKKzB4NTMsIDB4NTAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MDYsIDB4MjgsIDB4ZjYsIDB4ZDMsIAorMHgwMCwgMHgyMCwgMHhlMCwgMHg3MCwgMHgyMCwgMHg3MiwgMHg2MCwgMHg3MiwgMHhhMCwgMHg3MiwgMHgyMCwgMHg3MywgCisweDYwLCAweDczLCAweDEyLCAweDk5LCAweDE0LCAweDI5LCAweDM3LCAweGQ5LCAweDY5LCAweDQ2LCAweDhlLCAweDFjLCAKKzB4OTEsIDB4NzgsIDB4MDksIDB4MDcsIDB4MDksIDB4MGYsIDB4ODksIDB4MDAsIDB4MTQsIDB4MzksIDB4MGQsIDB4MDYsIAorMHgyZCwgMHgxNiwgMHgwMCwgMHgyNywgMHgwMCwgMHgyZCwgMHgxYiwgMHhkZCwgMHhmMCwgMHgxOSwgMHgxMCwgMHhhOSwgCisweDAwLCAweGYwLCAweDNkLCAweGY4LCAweDAwLCAweDI4LCAweDBlLCAweGQwLCAKKzB4MDAsIDB4MjAsIDB4MTAsIDB4YTksIDB4MDksIDB4NzgsIDB4MDAsIDB4MjksIDB4MDksIDB4ZGQsIDB4MDAsIDB4MjIsIAorMHgzOSwgMHgxOCwgMHg3MiwgMHg1NCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgxMCwgMHhhOSwgCisweDA5LCAweDc4LCAweDg4LCAweDQyLCAweGY2LCAweGRiLCAweDEwLCAweGE4LCAweDAwLCAweDc4LCAweDM4LCAweDE4LCAKKzB4MDcsIDB4MDYsIDB4M2YsIDB4MGUsIDB4YWYsIDB4NDIsIDB4ZTMsIDB4ZGIsIDB4NjgsIDB4NDYsIDB4ZTIsIDB4MWQsIAorMHgwZCwgMHgzMiwgMHgwMCwgMHgyMSwgMHhhYiwgMHgwOCwgMHg1ZiwgMHgxYywgMHgwOCwgMHhkMCwgMHg4YiwgMHgwMCwgCisweGM0LCAweDU4LCAweGMwLCAweDQ2LCAweGQ0LCAweDUwLCAweDAxLCAweDMxLCAweDA5LCAweDA2LCAweDA5LCAweDBlLCAKKzB4OGYsIDB4NDIsIDB4ZjYsIDB4ZDgsIDB4MTQsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg5MCwgMHhiNCwgMHg4NywgMHgxZSwgMHgwMCwgMHgyMCwgMHg4OSwgMHgwOCwgMHg0YiwgMHgxYywgMHgwOCwgMHhkMCwgCisweDgxLCAweDAwLCAweDU0LCAweDU4LCAweGMwLCAweDQ2LCAweDdjLCAweDUwLCAweDAxLCAweDMwLCAweDAwLCAweDA2LCAKKzB4MDAsIDB4MGUsIDB4ODMsIDB4NDIsIDB4ZjYsIDB4ZDgsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ODAsIDB4YjQsIAorMHgwMiwgMHg3OCwgMHhkMiwgMHgwNiwgMHhkMiwgMHgwZSwgMHgwMCwgMHgyMywgMHgwMSwgMHgyNywgMHgwMSwgMHgyYSwgCisweDAxLCAweGRjLCAweDBmLCAweDcwLCAweDExLCAweGUwLCAweDQwLCAweDc4LCAweGMwLCAweDQ2LCAweDA4LCAweDcwLCAKKzB4MTQsIDB4MmEsIDB4MDQsIDB4ZDEsIDB4MDgsIDB4NDgsIDB4MDEsIDB4N2EsIDB4MDEsIDB4MzEsIDB4MDEsIDB4NzIsIAorMHgwNywgMHhlMCwgMHgwMiwgMHgyYSwgMHgwNSwgMHhkMCwgMHgwNSwgMHgyYSwgMHgwMywgMHhkMCwgMHgwNiwgMHgyYSwgCisweDAxLCAweGQwLCAweDE1LCAweDJhLCAweDAyLCAweGQxLCAweDE4LCAweDFjLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MzgsIDB4MWMsIDB4ZmIsIDB4ZTcsIDB4ZTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4YjUsIDB4MGYsIDB4NDgsIAorMHgwMSwgMHgyMywgMHgxYiwgMHgwNiwgMHg0MSwgMHg2OSwgMHg5OSwgMHg0MywgMHgxYSwgMHgwOSwgMHg0MSwgMHg2MSwgCisweGQxLCAweDYwLCAweDAwLCAweDIxLCAweGExLCAweDIyLCAweDUyLCAweDAzLCAweDkxLCAweDYxLCAweDE5LCAweDFjLCAKKzB4MDksIDB4NGEsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIAorMHg4MCwgMHg2OSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHgwMiwgMHhmMCwgMHg2MSwgMHhmZSwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDA0LCAweDQ4LCAweDQxLCAweDg4LCAweDAxLCAweDMxLCAweDQxLCAweDgwLCAweGY4LCAweGU3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4ZTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhmMCwgMHhiNSwgMHg4NiwgMHhiMCwgMHg5NSwgMHg0YSwgMHhkMCwgMHg2OCwgCisweGQ3LCAweDFkLCAweDc5LCAweDM3LCAweDAxLCAweDI4LCAweDA5LCAweGQxLCAweDM4LCAweDg5LCAweDAwLCAweDI4LCAKKzB4MDYsIDB4ZDEsIDB4ZDAsIDB4NmYsIDB4MDIsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIAorMHgxNCwgMHgyMCwgMHgzOCwgMHg4MSwgMHg4ZSwgMHg0YywgMHg2MSwgMHg2YSwgMHg4ZSwgMHg0OCwgMHhjMywgMHg2YiwgCisweDU5LCAweDE4LCAweGMxLCAweDYzLCAweGEwLCAweDZhLCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGQ0LCAweDE4LCAKKzB4YTAsIDB4NjIsIDB4MjEsIDB4NmEsIDB4MDksIDB4MDMsIDB4MDksIDB4MGIsIDB4ODEsIDB4NDIsIDB4MDUsIDB4ZDEsIAorMHgwMSwgMHgyMCwgMHg0MCwgMHgwNCwgMHg4NywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhmMywgMHhlMCwgCisweGJiLCAweDhhLCAweDU4LCAweDFjLCAweGI4LCAweDgyLCAweDNkLCAweDhiLCAweDAxLCAweDIwLCAweDAwLCAweDIxLCAKKzB4YWIsIDB4NDIsIDB4MDQsIDB4ZGIsIDB4ZDMsIDB4MWQsIDB4ODksIDB4MzMsIDB4NTgsIDB4NzAsIDB4YjksIDB4ODIsIAorMHhmOSwgMHg4MywgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhkMywgMHgxOCwgMHgwNSwgMHg5MywgMHg1YiwgMHg2OSwgCisweDBmLCAweDJiLCAweDczLCAweGQyLCAweDAwLCAweDIxLCAweDdjLCAweDRmLCAweGMwLCAweDQ2LCAweDM5LCAweDYxLCAKKzB4MjEsIDB4NmEsIDB4OGEsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4NGIsIDB4NjgsIDB4MWUsIDB4MGMsIAorMHgzNiwgMHgwNCwgMHhmZCwgMHgxZiwgMHgwOSwgMHgzZCwgMHgwMCwgMHgyZSwgMHgwNSwgMHhkMSwgMHgzYiwgMHgyYSwgCisweDAzLCAweGQzLCAweDAxLCAweDIzLCAweGRiLCAweDAyLCAweDlhLCAweDQyLCAweDAxLCAweGQ5LCAweGE4LCAweDczLCAKKzB4YzgsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMywgMHg5MSwgMHgwMywgMHhhOSwgMHgwOSwgMHg4OCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDc5LCAweDgyLCAweDQ5LCAweDA5LCAweDA1LCAweDMxLCAweDA5LCAweDA2LCAweDA5LCAweDBlLCAKKzB4NjksIDB4NGUsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTYsIDB4NjksIDB4NDgsIDB4NDMsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHgwMSwgMHg5MywgMHg4MywgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MywgMHhjMiwgMHgxZCwgMHgxMSwgMHgzMiwgCisweDgwLCAweDY5LCAweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDkyLCAweDY4LCAweGIzLCAweDA3LCAweDFhLCAweDQzLCAKKzB4MTIsIDB4NjgsIDB4OTAsIDB4NDIsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4MjAsIAorMHgwZCwgMHhlMCwgMHg5MCwgMHg0MiwgMHgwNSwgMHhkOSwgMHgwMCwgMHg5YiwgMHgxOCwgMHgxYSwgMHgwMSwgMHg5YiwgCisweGQyLCAweDFhLCAweDgyLCAweDE4LCAweDAwLCAweGUwLCAweDEyLCAweDFhLCAweDAxLCAweDIwLCAweDA5LCAweDAxLCAKKzB4OTEsIDB4NDIsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4MDEsIDB4MjgsIDB4NjUsIDB4ZDEsIDB4NTEsIDB4NDksIAorMHgyMCwgMHg2OSwgMHgwMCwgMHgyOCwgMHg2MiwgMHhkMCwgMHgwNSwgMHg5OSwgMHg0OCwgMHg2OSwgMHgwMSwgMHgzMCwgCisweDQ4LCAweDYxLCAweDAyLCAweDIwLCAweDIxLCAweDZhLCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweGYwLCAKKzB4YTcsIDB4ZmMsIDB4NzgsIDB4NjMsIDB4YmUsIDB4NjAsIDB4NDksIDB4NDksIDB4MjIsIDB4NmEsIDB4YTMsIDB4NmIsIAorMHhkMywgMHgxOCwgMHg2NiwgMHg2YiwgMHhiMywgMHg0MiwgMHgwMCwgMHhkOSwgMHgyMiwgMHg2YiwgMHhjMCwgMHg0NiwgCisweGJhLCAweDYyLCAweGJhLCAweDZhLCAweDBjLCAweDMyLCAweGZhLCAweDYyLCAweDAwLCAweDIyLCAweGZhLCAweDYxLCAKKzB4MDMsIDB4YWEsIDB4NTIsIDB4ODgsIDB4ZDIsIDB4MDksIDB4MDMsIDB4ZDMsIDB4MDEsIDB4MjIsIDB4MDAsIDB4ZTAsIAorMHg3YiwgMHhlMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgyMiwgMHg3YSwgMHg2MCwgMHg3YSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDAyLCAweDYwLCAweDc4LCAweDhhLCAweDQxLCAweDRlLCAweDYwLCAweDI4LCAweDA0LCAweGRjLCAweGIwLCAweDgzLCAKKzB4NzgsIDB4OGEsIDB4YzAsIDB4NDYsIDB4ZjAsIDB4ODMsIDB4MDgsIDB4ZTAsIDB4NjAsIDB4MjAsIDB4YjAsIDB4ODMsIAorMHg3OSwgMHg4YSwgMHhmOCwgMHg2YSwgMHg0MiwgMHgxOCwgMHg2MywgMHg2YiwgMHg5YSwgMHg0MiwgMHgwMywgMHhkOCwgCisweGYxLCAweDgzLCAweDAwLCAweDIyLCAweDNhLCAweDYzLCAweDA1LCAweGUwLCAweDIxLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4MzksIDB4NjMsIDB4NjEsIDB4NmIsIDB4MDgsIDB4MWEsIDB4ZjAsIDB4ODMsIDB4MmQsIDB4NDksIDB4NzgsIDB4NmIsIAorMHg0MiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhiYSwgMHg2MCwgMHg4MiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmYSwgMHg2MCwgCisweDAyLCAweDY5LCAweGMwLCAweDQ2LCAweDdhLCAweDYxLCAweDQwLCAweDY5LCAweGMwLCAweDQ2LCAweGI4LCAweDYxLCAKKzB4MmUsIDB4NGIsIDB4YzgsIDB4MTgsIDB4MDQsIDB4OTAsIDB4MDAsIDB4ZjAsIDB4MzcsIDB4ZjksIDB4MDQsIDB4OTgsIAorMHgwMCwgMHhmMCwgMHg4OCwgMHhmOCwgMHgwMCwgMHhmMCwgMHhmNiwgMHhmYSwgMHg3OCwgMHg4YSwgMHhmMSwgMHg4YiwgCisweDg4LCAweDQyLCAweDA0LCAweGQxLCAweGY5LCAweDZhLCAweDA4LCAweDE4LCAweDA0LCAweGUwLCAweDM4LCAweGUwLCAKKzB4MzIsIDB4ZTAsIDB4M2EsIDB4NmIsIDB4MTAsIDB4MTgsIDB4NDAsIDB4MWEsIDB4ODEsIDB4MDcsIDB4MDIsIDB4ZDAsIAorMHg4MCwgMHgwOCwgMHg4MCwgMHgwMCwgMHgwNCwgMHgzMCwgMHg2MSwgMHg2YiwgMHgwOSwgMHgxYSwgMHhhMiwgMHg2YiwgCisweDkxLCAweDQyLCAweDAwLCAweGQyLCAweDIwLCAweDZiLCAweGMwLCAweDQ2LCAweDIwLCAweDYyLCAweGU4LCAweDdiLCAKKzB4MDAsIDB4MjgsIDB4MDgsIDB4ZDAsIDB4MDAsIDB4MjIsIDB4ZWEsIDB4NzMsIDB4MDUsIDB4OTksIDB4NDgsIDB4NjksIAorMHgwMSwgMHgzOCwgMHg0OCwgMHg2MSwgMHg3OCwgMHg2YiwgMHgwMCwgMHhmMCwgMHg3MywgMHhmYSwgMHgxOCwgMHg0OCwgCisweDgwLCAweDZhLCAweDgwLCAweDA2LCAweDgwLCAweDBlLCAweDAxLCAweDI4LCAweDBhLCAweGQxLCAweDIwLCAweDZhLCAKKzB4MDAsIDB4MDMsIDB4MDAsIDB4MGIsIDB4MGIsIDB4NGMsIDB4YTEsIDB4NmEsIDB4ODgsIDB4NDIsIDB4MDMsIDB4ZDAsIAorMHgwNiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNCwgCisweDA4LCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDA2LCAweGUwLCAweGUwLCAweDY4LCAweDAwLCAweDI4LCAKKzB4MDEsIDB4ZDAsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4ZmEsIDB4MDEsIDB4MjAsIDB4YTgsIDB4NzMsIDB4ZWQsIDB4ZTcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHg0MCwgMHgxNCwgMHg0MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDI4LCAweDFhLCAweDAwLCAweDgwLCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAKKzB4YTgsIDB4MDMsIDB4MDAsIDB4ODAsIDB4NjgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4YzQsIDB4MGIsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHg3OCwgMHg2YSwgMHg0MCwgMHg4OSwgCisweGZmLCAweDIxLCAweDAxLCAweDMxLCAweDAxLCAweDQwLCAweDEwLCAweDQ4LCAweDAyLCAweGQxLCAweDgxLCAweDZjLCAKKzB4MDEsIDB4MzEsIDB4ODEsIDB4NjQsIDB4NzksIDB4NmEsIDB4NDksIDB4ODksIDB4NDksIDB4MGIsIDB4MDIsIDB4ZDIsIAorMHg0MSwgMHg2YywgMHgwMSwgMHgzMSwgMHg0MSwgMHg2NCwgMHgwYiwgMHg0OCwgMHg0MSwgMHg2YSwgMHgwMSwgMHgzMSwgCisweDQxLCAweDYyLCAweDc4LCAweDZhLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDQ4LCAweDYyLCAweDM4LCAweDZiLCAKKzB4MDAsIDB4ZjAsIDB4ZjgsIDB4ZmIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjMsIDB4ZjgsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHg0OSwgMHhjMCwgMHg0NiwgMHhjOCwgMHg3MywgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGE0LCAweDJhLCAweDAwLCAweDgwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDE4LCAweDFhLCAweDAwLCAweDgwLCAKKzB4ZjgsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MDAsIDB4MjIsIDB4ZjksIDB4MWQsIDB4NjEsIDB4MzEsIDB4MGQsIDB4MWMsIAorMHg3OCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHg0MCwgMHg4OSwgCisweDAzLCAweDBjLCAweDAxLCAweGQyLCAweDQwLCAweDBhLCAweDAzLCAweGQyLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4YzEsIDB4ZmYsIDB4NjcsIDB4ZTAsIDB4MzUsIDB4NDgsIDB4YzAsIDB4NmIsIDB4MDAsIDB4MDksIDB4MWYsIDB4ZDMsIAorMHgwOCwgMHg3OCwgMHg0MCwgMHgwOCwgMHgxYywgMHhkMiwgMHgwMCwgMHgyMCwgMHg0MywgMHgwMCwgMHhjYywgMHg1YSwgCisweDMxLCAweDRlLCAweDllLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGYzLCAweDE4LCAweDFiLCAweDg4LCAKKzB4OWMsIDB4NDIsIDB4MGUsIDB4ZDAsIDB4YjgsIDB4NjksIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjEsIAorMHhmOCwgMHg2OCwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDI3LCAweGY5LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDc0LCAweGY4LCAweDQ2LCAweGUwLCAweDAxLCAweDMwLCAKKzB4MDMsIDB4MjgsIDB4ZTMsIDB4ZGIsIDB4MDIsIDB4MjAsIDB4NDMsIDB4MDAsIDB4NWMsIDB4MTgsIDB4ZTQsIDB4ODgsIAorMHgyMiwgMHg0ZSwgMHg5ZSwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhmMywgMHgxOCwgMHgxYiwgMHg4OCwgCisweDljLCAweDQyLCAweDAzLCAweGQxLCAweDAxLCAweDIzLCAweDAxLCAweDM4LCAweGQ4LCAweDQyLCAweGYwLCAweGRjLCAKKzB4MDEsIDB4MjMsIDB4ZDgsIDB4NDIsIDB4YzQsIDB4ZDAsIDB4MWIsIDB4NGUsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIAorMHhmMCwgMHgxOCwgMHg0MCwgMHg2OSwgMHgwMCwgMHgyOCwgMHgyNCwgMHhkMCwgMHg3ZCwgMHg2MywgMHgwMCwgMHg5OCwgCisweDQwLCAweDg5LCAweDAwLCAweDBjLCAweDFmLCAweGQyLCAweDAwLCAweDI0LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAKKzB4ZjAsIDB4MTgsIDB4YzAsIDB4NmIsIDB4MzUsIDB4MWMsIDB4MDAsIDB4MjgsIDB4MTcsIDB4ZDAsIDB4ZmUsIDB4MWQsIAorMHgyZCwgMHgzNiwgMHhhMiwgMHgwMCwgMHg1MiwgMHgxOSwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhkMiwgMHgxOCwgCisweGQyLCAweDZiLCAweDM4LCAweDFjLCAweDMxLCAweDFjLCAweDAyLCAweGYwLCAweDdiLCAweGZjLCAweDAxLCAweDI4LCAKKzB4MGUsIDB4ZDAsIDB4MDEsIDB4MzQsIDB4YTAsIDB4MDAsIDB4NDAsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHhjMCwgMHgxOCwgMHhjMCwgMHg2YiwgMHgwMCwgMHgyOCwgMHhlYSwgMHhkMSwgMHgwMSwgMHhlMCwgMHgwMSwgMHgyYSwgCisweDAyLCAweGQwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDA4LCAweGY4LCAweGY4LCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhiOCwgMHg2OSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MSwgCisweGY4LCAweDY4LCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDc4LCAweDZhLCAweDQwLCAweDg5LCAKKzB4MDEsIDB4MGMsIDB4MGUsIDB4ZDIsIDB4NDAsIDB4MGEsIDB4MGMsIDB4ZDMsIDB4MzgsIDB4NjgsIDB4NDAsIDB4MDgsIAorMHgwMiwgMHhkMywgMHgzOCwgMHgxYywgMHgwMiwgMHhmMCwgMHgwYywgMHhmYywgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweGJiLCAweGY4LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDA4LCAweGY4LCAweDAyLCAweGUwLCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4MzAsIDB4ZmYsIDB4MDEsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMSwgMHgyMSwgMHgwMCwgMHg2YiwgMHg0MCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMSwgMHg2MCwgMHg3MCwgMHg0NywgCisweGIwLCAweGI0LCAweGMxLCAweDFkLCAweDM5LCAweDMxLCAweDA5LCAweDhiLCAweDg5LCAweDA4LCAweDA5LCAweDA0LCAKKzB4MDksIDB4MGMsIDB4ODQsIDB4NmEsIDB4YzIsIDB4MWQsIDB4NjEsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjksIAorMHgwYywgMHhkZCwgMHg4NywgMHgwMCwgMHgzZCwgMHgxOSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyYiwgMHg0MywgCisweDFiLCAweDY4LCAweGMwLCAweDQ2LCAweGQzLCAweDUxLCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAKKzB4ODgsIDB4NDIsIDB4ZjIsIDB4ZGIsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4YTAsIDB4YjAsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhjMSwgMHgxZCwgMHgyMSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDBiLCAweDkxLCAweGMxLCAweDFkLCAweDUzLCAweDMxLCAweDE5LCAweDQzLCAweDFmLCAweDkxLCAKKzB4MDksIDB4NjgsIDB4MDEsIDB4YWYsIDB4ZmEsIDB4MWQsIDB4MzksIDB4MzIsIDB4MWUsIDB4OTIsIDB4MTcsIDB4YWIsIAorMHg1OSwgMHg4MCwgMHgzYSwgMHg0OSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwYSwgMHg2YSwgMHgxMywgMHg0MywgCisweGNjLCAweDFkLCAweDExLCAweDM0LCAweDg5LCAweDY5LCAweDA5LCAweDAzLCAweDA5LCAweDBiLCAweDIyLCAweDY5LCAKKzB4ZTUsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MWQsIDB4OTUsIDB4ZmMsIDB4MWQsIDB4MzksIDB4MzQsIDB4NjQsIDB4OGIsIAorMHg2NCwgMHgwOSwgMHgwNSwgMHgzNCwgMHgyNCwgMHgwNiwgMHgyNCwgMHgwZSwgMHgxYywgMHg5NCwgMHg1NiwgMHgxYSwgCisweDFiLCAweDk2LCAweDFjLCAweDljLCAweDJlLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDAxLCAweDI2LCAKKzB4MWQsIDB4OWQsIDB4MWEsIDB4NjgsIDB4OTEsIDB4NDIsIDB4MDEsIDB4ZDEsIDB4MzIsIDB4MWMsIDB4MGIsIDB4ZTAsIAorMHg5MSwgMHg0MiwgMHgwMywgMHhkOSwgMHg1MiwgMHgxYiwgMHgxYiwgMHg5ZSwgMHhiNSwgMHgxOCwgMHgwMCwgMHhlMCwgCisweDU1LCAweDFhLCAweDAxLCAweDIyLCAweDI0LCAweDAxLCAweGFjLCAweDQyLCAKKzB4MDAsIDB4ZDMsIDB4MDAsIDB4MjIsIDB4MDEsIDB4MmEsIDB4ZTYsIDB4ZDEsIDB4OTEsIDB4MDcsIDB4MDEsIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgzOSwgMHg2MCwgMHg5MywgMHgwNywgMHgwMSwgMHgxZCwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweDc5LCAweDYwLCAweGMxLCAweDFkLCAweDAxLCAweDMxLCAweDE5LCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4YjksIDB4NjAsIDB4MWYsIDB4OTksIDB4MDksIDB4NjgsIDB4MWUsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHg1MSwgMHg4MywgMHhjMSwgMHgxZCwgMHgxZCwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDM4LCAweDYzLCAweDc5LCAweDYyLCAweGMxLCAweDFkLCAweDExLCAweDMxLCAweDE5LCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4YjksIDB4NjEsIDB4YzEsIDB4MWQsIDB4MDUsIDB4MzEsIDB4MTksIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2MCwgMHhjMSwgMHgxZCwgMHgxNywgMHgzMSwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweGY5LCAweDgzLCAweDBlLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ZjgsIDB4ODEsIDB4MzgsIDB4NjgsIDB4NDAsIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MzgsIDB4MWMsIAorMHgwMiwgMHhmMCwgMHg1YywgMHhmYiwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwYiwgMHhmOCwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDU4LCAweGZmLCAweDIwLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YTgsIDB4MDMsIDB4MDAsIDB4ODAsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4ZjgsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHhmOCwgMHgxZCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg4YiwgMHgzOSwgMHg0YSwgMHg5MSwgMHg0MiwgMHgwMCwgMHhkZCwgCisweDQyLCAweDgzLCAweDQyLCAweDhiLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDAxLCAweDIwLCAweDNhLCAweDFkLCAKKzB4MDYsIDB4Y2EsIDB4YmIsIDB4NmEsIDB4MDIsIDB4ZjAsIDB4MGUsIDB4ZmYsIDB4MzMsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgwMCwgMHg5MiwgMHgzMywgMHg0ZSwgMHgzMCwgMHg2YSwgMHgzMywgMHg0YywgMHhlMSwgMHg2ZCwgMHg0MSwgMHgxOCwgCisweDM4LCAweDZiLCAweGMzLCAweDFkLCAweDA1LCAweDMzLCAweDAxLCAweDIwLCAweDcyLCAweDZhLCAweDAyLCAweGYwLCAKKzB4ZmIsIDB4ZmUsIDB4ZTAsIDB4NmQsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MjUsIDB4YjEsIDB4NmEsIDB4ODEsIDB4NDIsIAorMHgwMSwgMHhkOCwgMHhlNSwgMHg2NSwgMHgwMCwgMHhlMCwgMHhlMCwgMHg2NSwgMHgyZiwgMHgyMywgMHg5YiwgMHgwMSwgCisweDIwLCAweDFjLCAweGUxLCAweDZkLCAweGU0LCAweDE4LCAweDIyLCAweDY4LCAweDkyLCAweDAwLCAweDI3LCAweDRiLCAKKzB4YzAsIDB4NDYsIDB4OTksIDB4NTAsIDB4MjYsIDB4NDgsIDB4YzEsIDB4NmIsIDB4NGEsIDB4MDgsIDB4MDUsIDB4ZDMsIAorMHg0OSwgMHgwOCwgMHg0OSwgMHgwMCwgMHhjMSwgMHg2MywgMHgwMSwgMHgyMCwgMHgwMSwgMHhmMCwgMHhkNiwgMHhmZiwgCisweDIyLCAweDRhLCAweDFmLCAweDQ4LCAweGMxLCAweDFkLCAweDg5LCAweDMxLCAweDBiLCAweDc4LCAweDAwLCAweDJiLCAKKzB4MDIsIDB4ZDAsIDB4NDksIDB4NzgsIDB4MDAsIDB4MjksIDB4MDAsIDB4ZDEsIDB4MWUsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgwMCwgMHg5MiwgMHgyMCwgMHg2OCwgMHg4MCwgMHgwMCwgMHgxOSwgMHg0YiwgMHhjMywgMHgxOCwgMHgwNSwgMHhjZSwgCisweGMxLCAweDFkLCAweDExLCAweDMxLCAweDAxLCAweDIwLCAweDAyLCAweGYwLCAweGM3LCAweGZlLCAweDE0LCAweDQ4LCAKKzB4MjEsIDB4NjgsIDB4MDEsIDB4MzEsIDB4MjEsIDB4NjAsIDB4MTcsIDB4MjksIDB4MDAsIDB4ZDMsIDB4MjUsIDB4NjAsIAorMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwZCwgMHg2NSwgMHg3OSwgMHg2YSwgMHgzYSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDUxLCAweDYyLCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDY4LCAweDAwLCAweDI5LCAKKzB4MDMsIDB4ZDEsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4ODEsIDB4NjAsIDB4MDQsIDB4ZTAsIDB4MzksIDB4NmIsIAorMHhjMiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgxMSwgMHg2NSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjMSwgMHg2MCwgCisweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGVhLCAweDA1LCAweDAwLCAweDAwLCAKKzB4MTgsIDB4MDAsIDB4MTQsIDB4MDIsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg0NCwgMHg4MiwgMHgyMCwgMHg0MCwgMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMiwgCisweDA0LCAweDAwLCAweDAwLCAweDAzLCAweGYwLCAweGI1LCAweDExLCAweDRlLCAweGZmLCAweDI1LCAweDAxLCAweDM1LCAKKzB4MTAsIDB4NGYsIDB4YzAsIDB4NDYsIDB4MzUsIDB4NjAsIDB4NzgsIDB4NjksIDB4MDEsIDB4MzgsIDB4NzgsIDB4NjEsIAorMHhiYywgMHg2OCwgMHgwMCwgMHgyYywgMHgxMCwgMHhkMCwgMHgyMCwgMHg2ZCwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MCwgCisweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDIxLCAweGY4LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDA0LCAweGZhLCAKKzB4MDgsIDB4NDgsIDB4ODAsIDB4NmEsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDcsIDB4ZTksIDB4ZDEsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwNSwgMHg0OCwgMHhjMSwgMHg3OSwgMHgwMSwgMHgzMSwgMHhjMSwgMHg3MSwgCisweGY3LCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDI4LCAweDFiLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMSwgMHgyMCwgMHg4MCwgMHgwMywgMHgwMSwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHg3MCwgMHg0NywgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAweDM4LCAweDY4LCAweGMwLCAweDA4LCAKKzB4MDksIDB4ZDMsIDB4MWQsIDB4NDgsIDB4MDEsIDB4NmEsIDB4MDEsIDB4MzksIDB4MDEsIDB4NjIsIDB4MjAsIDB4MzAsIAorMHgwMCwgMHg3OSwgMHgwMCwgMHgyOCwgMHgwMSwgMHhkMCwgMHhmZSwgMHhmNywgMHhlOSwgMHhmZCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGY4LCAweDFkLCAweDFkLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDE2LCAweDRjLCAKKzB4NjEsIDB4NmEsIDB4ODEsIDB4NDIsIDB4MjEsIDB4ZDEsIDB4MDEsIDB4MWMsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMSwgMHgyOSwgMHgxYSwgMHhkMSwgMHgwMCwgMHhmMCwgMHgyMiwgMHhmOCwgCisweDYwLCAweDYyLCAweDYwLCAweDZhLCAweDIxLCAweDZhLCAweDg4LCAweDQyLCAweDA1LCAweGQwLCAweDAxLCAweDIxLCAKKzB4ODksIDB4MDcsIDB4MDEsIDB4NDMsIDB4MDksIDB4NjgsIDB4MDksIDB4MDQsIDB4ZjIsIDB4ZDAsIDB4NTEsIDB4MjEsIAorMHg4OSwgMHgwMywgMHg2MiwgMHg2YSwgMHgyMywgMHg2YiwgMHg5YSwgMHg0MiwgMHgwMiwgMHhkMSwgMHg2MCwgMHg2YiwgCisweGEyLCAweDZiLCAweDgwLCAweDFhLCAweDA0LCAweDM4LCAweGM4LCAweDYwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzksIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZjcsIDB4ZTcsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweGMxLCAweDFkLCAweDAxLCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAKKzB4MDgsIDB4MTgsIDB4MGQsIDB4MzAsIDB4ODEsIDB4MDcsIDB4MDIsIDB4ZDAsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIAorMHgwNCwgMHgzMCwgMHgwNCwgMHg0OSwgMHg4YSwgMHg2YiwgMHgxMiwgMHgxOCwgMHg0YiwgMHg2YiwgMHg5YSwgMHg0MiwgCisweDAwLCAweGQ5LCAweDA4LCAweDZiLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGU4LCAweDFhLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4MDQsIDB4NDgsIDB4YzAsIDB4NjgsIDB4MTAsIDB4MjgsIDB4MDEsIDB4ZDMsIDB4MDAsIDB4ZjAsIAorMHgwNSwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgCisweDg4LCAweGI1LCAweDBjLCAweDRmLCAweDM4LCAweDc5LCAweDAwLCAweDI4LCAweDExLCAweGQxLCAweDBiLCAweDQ5LCAKKzB4MTAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4ZjUsIDB4ZmQsIDB4MDAsIDB4MjgsIDB4MGIsIDB4ZDAsIDB4MDEsIDB4MjAsIAorMHgzOCwgMHg3MSwgMHgwOCwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwNywgMHg0OCwgMHg0MiwgMHg2OCwgCisweDA3LCAweDRiLCAweDAxLCAweDY4LCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweGRmLCAweGZkLCAweDg4LCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4ZjUsIDB4MmMsIDB4ZmYsIDB4ZmYsIAorMHgxMCwgMHgwMCwgMHgzNSwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgCisweDkwLCAweGI1LCAweDAxLCAweDIwLCAweDQwLCAweDAyLCAweDEwLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAKKzB4MGYsIDB4NGYsIDB4MTAsIDB4MjEsIDB4ZjgsIDB4MWQsIDB4M2QsIDB4MzAsIDB4MDIsIDB4ZjAsIDB4NGMsIDB4ZmMsIAorMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhmYywgMHgxOCwgMHhlMCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgwMSwgMHhkMCwgCisweDAwLCAweGYwLCAweDE0LCAweGY4LCAweDAwLCAweDIwLCAweGM5LCAweDIzLCAweDFiLCAweDAxLCAweGY5LCAweDE4LCAKKzB4MDgsIDB4NzEsIDB4ZTAsIDB4NjgsIDB4MTAsIDB4MjgsIDB4MDQsIDB4ZDMsIDB4MDEsIDB4MjAsIDB4YmIsIDB4MjMsIAorMHgxYiwgMHgwMSwgMHhmOSwgMHgxOCwgMHg0OCwgMHg3MywgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGY4LCAweGI1LCAweDM3LCAweDQ4LCAKKzB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzEsIDB4MTgsIDB4YzksIDB4NjgsIDB4MzUsIDB4NGQsIDB4MTAsIDB4MjksIAorMHgwMCwgMHhkOSwgMHgxMCwgMHgyMSwgMHg2OSwgMHg2MiwgMHgzMiwgMHg0OCwgMHhjMSwgMHg2YywgMHgwMCwgMHg2ZSwgCisweDgxLCAweDQyLCAweDA3LCAweGQ5LCAweDA4LCAweDFhLCAweDA3LCAweDA5LCAweDAwLCAweDI0LCAweDY4LCAweDZhLCAKKzB4YjgsIDB4NDIsIDB4MTIsIDB4ZDIsIDB4MDcsIDB4MWMsIDB4MTAsIDB4ZTAsIDB4ODEsIDB4NDIsIDB4MmEsIDB4ZDIsIAorMHgyYywgMHg0YSwgMHg1MiwgMHg2YiwgMHgxMCwgMHgxYSwgMHgwNywgMHgwOSwgMHg2OCwgMHg2YSwgMHhiOCwgMHg0MiwgCisweDA1LCAweGQ5LCAweDBjLCAweDA5LCAweDM5LCAweDE5LCAweDg4LCAweDQyLCAweDAzLCAweGQyLCAweGM0LCAweDFiLCAKKzB4MDEsIDB4ZTAsIDB4MDAsIDB4MjQsIDB4MDcsIDB4MWMsIDB4M2UsIDB4MTksIDB4MzAsIDB4MDEsIDB4MjUsIDB4NDksIAorMHgwMiwgMHhmMCwgMHg4NCwgMHhmZCwgMHgwMCwgMHgyOCwgMHgzZCwgMHhkMCwgMHgyMywgMHg0OCwgMHgwMCwgMHgyYywgCisweDFhLCAweGQxLCAweDFlLCAweDQ5LCAweDNhLCAweDAxLCAweDZmLCAweDYyLCAweDA5LCAweDZlLCAweDhjLCAweDE4LCAKKzB4MWQsIDB4NGQsIDB4NmIsIDB4NmIsIDB4YTMsIDB4NDIsIDB4MDAsIDB4ZDgsIDB4ZTQsIDB4MWEsIDB4MWUsIDB4NGIsIAorMHgxYSwgMHg0MywgMHgwMCwgMHg5MiwgMHhlYSwgMHg2YSwgMHg1MSwgMHgxOCwgCisweDJhLCAweDZiLCAweDAzLCAweDFjLCAweDIwLCAweGUwLCAweDFiLCAweDQ4LCAweDAxLCAweDZiLCAweDAxLCAweDMxLCAKKzB4MDEsIDB4NjMsIDB4MDAsIDB4MjAsIDB4NjgsIDB4NjIsIDB4ZjgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgxMCwgMHg0OSwgMHgyNCwgMHgwMSwgMHgzZiwgMHgwMSwgMHgxMSwgMHgyMiwgMHg1MiwgMHgwNSwgMHgzYSwgMHg0MywgCisweDZlLCAweDYyLCAweDAwLCAweDkyLCAweDBlLCAweDRkLCAweGVhLCAweDZhLCAweDA5LCAweDZlLCAweDUxLCAweDE4LCAKKzB4MDMsIDB4MWMsIDB4MDYsIDB4MWMsIDB4MDAsIDB4MjAsIDB4MmEsIDB4NmIsIDB4MDIsIDB4ZjAsIDB4NGEsIDB4ZmQsIAorMHgwYywgMHg0YSwgMHgyMiwgMHg0MywgMHgwMCwgMHg5MiwgMHhiYiwgMHgxOSwgMHhlOSwgMHg2YSwgMHgyYSwgMHg2YiwgCisweDAwLCAweDIwLCAweDAyLCAweGYwLCAweDQxLCAweGZkLCAweDAzLCAweDQ4LCAweGMwLCAweDQ2LCAweDA0LCAweDY2LCAKKzB4MDAsIDB4ZjAsIDB4MTAsIDB4ZjgsIDB4MDEsIDB4MjAsIDB4ZGEsIDB4ZTcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgyOCwgMHgxYiwgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHg1ZCwgMHgyZSwgMHhmZiwgMHhmZiwgCisweDQ0LCAweDgwLCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDM2LCAweDAyLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4MDQsIDB4NDgsIDB4MDEsIDB4NmUsIDB4MDQsIDB4NGEsIDB4ODAsIDB4MzAsIDB4ZDEsIDB4NjAsIDB4MDIsIDB4MjMsIAorMHhjMSwgMHg2YiwgMHgxOSwgMHg0MywgMHhjMSwgMHg2MywgMHg3MCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDkwLCAweGVlLCAweDIwLCAweDQwLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDAxLCAweDIwLCAweDgwLCAweDAyLCAKKzB4MWMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4MjcsIDB4MWIsIDB4NGUsIDB4MzMsIDB4MjMsIAorMHg5YiwgMHgwMSwgMHhmNSwgMHgxOCwgMHg2OCwgMHg2YSwgMHgwMCwgMHgyOCwgMHgxZCwgMHhkOSwgMHgxOSwgMHg0YywgCisweDY4LCAweDQ2LCAweDEwLCAweDIxLCAweDAyLCAweGYwLCAweDkwLCAweGZiLCAweDY4LCAweDQ2LCAweDAwLCAweGYwLCAKKzB4MzMsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZDAsIDB4MTUsIDB4NDksIDB4NDgsIDB4NjksIDB4MDEsIDB4MzAsIAorMHg0OCwgMHg2MSwgMHgwYSwgMHhlMCwgMHgxMywgMHg0OSwgMHg2MCwgMHg3YiwgMHgwMSwgMHgzMCwgMHg2MCwgMHg3MywgCisweDg4LCAweDc5LCAweDAxLCAweDMwLCAweDg4LCAweDcxLCAweDExLCAweDQ4LCAweDAwLCAweDY4LCAweDAyLCAweGYwLCAKKzB4NjUsIDB4ZjksIDB4NjgsIDB4NmEsIDB4MDEsIDB4MzcsIDB4YjgsIDB4NDIsIDB4ZTIsIDB4ZDgsIDB4YmIsIDB4MjMsIAorMHgxYiwgMHgwMSwgMHhmMCwgMHgxOCwgMHg4MSwgMHg3YiwgMHgwMCwgMHgyOSwgMHgwMywgMHhkMCwgMHgwMCwgMHgyMSwgCisweDgxLCAweDczLCAweGZmLCAweGY3LCAweDA1LCAweGZiLCAweGZmLCAweGY3LCAweGUzLCAweGZlLCAweDA0LCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhiMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgwOCwgMHg4MywgMHgyMCwgMHg0MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDU4LCAweDA0LCAweDAwLCAweDgwLCAweDkwLCAweGI0LCAweDE3LCAweDRmLCAKKzB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZjksIDB4MTgsIDB4MDAsIDB4MjIsIDB4Y2IsIDB4NjgsIDB4MDAsIDB4MmIsIAorMHgyMywgMHhkMCwgMHgwMSwgMHgzYiwgMHhjYiwgMHg2MCwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhmZiwgMHgxOCwgCisweGJiLCAweDY5LCAweDFjLCAweDZkLCAweGMwLCAweDQ2LCAweGJjLCAweDYxLCAweDA0LCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NWMsIDB4NjAsIDB4NDQsIDB4NjgsIDB4YzAsIDB4NDYsIDB4OWMsIDB4NjAsIDB4ODQsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHgxYywgMHg2MSwgMHhjMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHg1OCwgMHg2MSwgMHgxYSwgMHg2NSwgMHgwOCwgMHg2OSwgCisweDQyLCAweDFjLCAweDBhLCAweDYxLCAweDAwLCAweDI4LCAweDAzLCAweGQwLCAweDM4LCAweDZhLCAweGMwLCAweDQ2LCAKKzB4MDMsIDB4NjUsIDB4MDAsIDB4ZTAsIDB4ZmIsIDB4NjEsIDB4M2IsIDB4NjIsIDB4MTgsIDB4MWMsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgxMCwgMHgxYywgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDBhLCAweDRhLCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGQxLCAweDE4LCAweGM4LCAweDY5LCAweDE5LCAweDIzLCAKKzB4ZGIsIDB4MDEsIDB4ZDIsIDB4MTgsIDB4MTMsIDB4NjksIDB4MDAsIDB4MmIsIDB4MDYsIDB4ZDAsIDB4MDEsIDB4M2IsIAorMHgxMywgMHg2MSwgMHhjYSwgMHg2OSwgMHgxMiwgMHg2ZCwgMHhjMCwgMHg0NiwgMHhjYSwgMHg2MSwgMHg3MCwgMHg0NywgCisweDAwLCAweDIxLCAweDExLCAweDYxLCAweGZiLCAweGU3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDYsIDB4NGEsIDB4MTEsIDB4NjksIDB4NGIsIDB4MWMsIDB4MTMsIDB4NjEsIDB4NDAsIDB4MzIsIDB4MDAsIDB4MjksIAorMHgwMSwgMHhkMCwgMHhkMSwgMHg2OSwgMHgwMCwgMHhlMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHg2NSwgMHhkMCwgMHg2MSwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGU4LCAweDFhLCAweDAwLCAweDgwLCAweDA2LCAweDRhLCAweGQxLCAweDY4LCAKKzB4NGIsIDB4MWMsIDB4ZDMsIDB4NjAsIDB4NDAsIDB4MzIsIDB4MDAsIDB4MjksIDB4MDEsIDB4ZDAsIDB4OTEsIDB4NjksIAorMHgwMCwgMHhlMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHg2NSwgMHg5MCwgMHg2MSwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweGU4LCAweDFhLCAweDAwLCAweDgwLCAweDkwLCAweGI0LCAweDAwLCAweDIxLCAKKzB4MGYsIDB4NGEsIDB4OTcsIDB4ODksIDB4OTIsIDB4NmEsIDB4NGIsIDB4MDAsIDB4MWIsIDB4MTgsIDB4OWIsIDB4OGEsIAorMHgwMCwgMHgyYiwgMHgxMiwgMHhkMCwgMHhiYiwgMHg0MiwgMHgxMCwgMHhkYywgMHgxYywgMHgxYywgMHg1OCwgMHgyMywgCisweDYzLCAweDQzLCAweGQzLCAweDE4LCAweGRjLCAweDFmLCAweDQ5LCAweDNjLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIDB4MWIsIDB4MGUsIDB4MDMsIDB4MmIsIDB4MDIsIDB4ZDAsIAorMHgwMCwgMHgyMCwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMSwgMHgzMSwgMHgwNCwgMHgyOSwgMHhlNCwgMHhkMywgCisweDAxLCAweDIwLCAweGY4LCAweGU3LCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAweGY3LCAweGI1LCAweDg2LCAweGIwLCAKKzB4M2QsIDB4NGEsIDB4MDcsIDB4MWMsIDB4ZDEsIDB4NjksIDB4OGYsIDB4NDAsIDB4MDMsIDB4MWMsIDB4MTQsIDB4NmEsIAorMHhlMywgMHg0MCwgMHg1ZiwgMHg0MCwgMHgwNywgMHg5ZSwgMHg4ZSwgMHg0MCwgMHg3NywgMHg0MCwgMHhjZiwgMHg0MCwgCisweDk0LCAweDY5LCAweGMwLCAweDQ2LCAweDA1LCAweDk0LCAweDAzLCAweDFjLCAweGEzLCAweDQwLCAweDAwLCAweDI1LCAKKzB4MTQsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDQsIDB4OTQsIDB4MDAsIDB4MmMsIDB4NWQsIDB4ZDksIDB4MWMsIDB4MWMsIAorMHgzMiwgMHg0ZSwgMHgyNiwgMHg0MywgMHg5NCwgMHg2OSwgMHhlNiwgMHg0MCwgMHgzMywgMHgxYywgMHgwMywgMHg5NiwgCisweDUzLCAweDZhLCAweGMwLCAweDQ2LCAweDAyLCAweDkzLCAweGQyLCAweDZhLCAweGMwLCAweDQ2LCAweDAxLCAweDkyLCAKKzB4YmIsIDB4MDAsIDB4MDIsIDB4OWEsIDB4ZDIsIDB4NTgsIDB4MTMsIDB4MWMsIDB4MDUsIDB4OWMsIDB4ZTMsIDB4NDAsIAorMHgwMywgMHg5YywgMHhhMywgMHg0MiwgMHgzZSwgMHhkMSwgMHg4YSwgMHg0MCwgMHhjYSwgMHg0MCwgMHgxNCwgMHgxYywgCisweDYzLCAweDAwLCAweDFiLCAweDE5LCAweDViLCAweDAxLCAweDAxLCAweDlhLCAweGQyLCAweDE4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4MDEsIDB4MzYsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIAorMHgxYiwgMHgwZSwgMHgwMywgMHgyYiwgMHgyYywgMHhkMSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNiwgMHgxZCwgCisweDUxLCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDA3LCAweDllLCAweDFlLCAweDQwLCAweDAwLCAweDk2LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4NDksIDB4MzYsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHg4MywgMHg0MiwgMHgxYiwgMHhkMSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHhkNiwgMHgxZCwgMHg0ZCwgMHgzNiwgCisweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDAwLCAweDllLCAweGIzLCAweDQyLCAweDEyLCAweGQxLCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MDgsIDB4OWIsIAorMHgzMiwgMHgyYiwgMHgwNCwgMHhkMSwgMHgwMiwgMHgyYSwgMHgwNywgMHhkMSwgMHgyMCwgMHgwNCwgMHgwMCwgMHgxNCwgCisweDBmLCAweGUwLCAweDA4LCAweDliLCAweDMzLCAweDJiLCAweDAxLCAweGQxLCAweDAxLCAweDJhLCAweGY3LCAweGQwLCAKKzB4MDQsIDB4OWEsIDB4MDEsIDB4MzcsIDB4OTcsIDB4NDIsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4MjcsIDB4MDQsIDB4OWEsIAorMHgwMSwgMHgzNSwgMHhhYSwgMHg0MiwgMHhhZSwgMHhkOCwgMHgwMCwgMHgyMCwgMHhjMCwgMHg0MywgMHgwOSwgMHhiMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MjcsIDB4NGQsIDB4NjgsIDB4NjksIDB4MDAsIDB4MjgsIAorMHgwNiwgMHhkMCwgMHgyNiwgMHg0OCwgMHgwMCwgMHg2OCwgMHgwMiwgMHhmMCwgMHgyYiwgMHhmOCwgMHhmMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDIzLCAweDRjLCAweDAwLCAweDI2LCAweGEwLCAweDY4LCAweDIzLCAweDRmLCAKKzB4MDAsIDB4MjgsIDB4MTYsIDB4ZDAsIDB4MGYsIDB4ZTAsIDB4MjgsIDB4NmEsIDB4MDIsIDB4MjgsIDB4MDIsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHgzOCwgMHg3MSwgMHgwZiwgMHhlMCwgMHhhNiwgMHg2MCwgMHhmZCwgMHhmNywgMHhkZSwgMHhmZSwgCisweDAwLCAweDI4LCAweGVhLCAweGQxLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAweDAxLCAweGQzLCAweDAxLCAweDIwLCAKKzB4MzgsIDB4NzEsIDB4ZTgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4MzgsIDB4NzksIDB4MDAsIDB4MjgsIAorMHhlOSwgMHhkMCwgMHg2OCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgxYiwgMHhkMCwgMHgwMSwgMHgyMCwgMHhhMCwgMHg2MCwgCisweGZlLCAweGY3LCAweGJjLCAweGZiLCAweDAwLCAweDI4LCAweGQ2LCAweGQxLCAweDY4LCAweDY4LCAweDAwLCAweDI4LCAKKzB4ZjYsIDB4ZDEsIDB4MTEsIDB4ZTAsIDB4MDAsIDB4MjgsIDB4ZDAsIDB4ZDEsIDB4MjgsIDB4NmEsIDB4MDIsIDB4MjgsIAorMHgwMiwgMHhkMywgMHgwMSwgMHgyMCwgMHgzOCwgMHg3MSwgMHhjYSwgMHhlNywgMHhhNiwgMHg2MCwgMHhmZCwgMHhmNywgCisweGI5LCAweGZlLCAweDAwLCAweDI4LCAweGM1LCAweGQxLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAweDAxLCAweGQzLCAKKzB4MDEsIDB4MjAsIDB4MzgsIDB4NzEsIDB4ZTgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4YmQsIDB4ZDAsIDB4MzgsIDB4NzksIAorMHgwMCwgMHgyOCwgMHhlNywgMHhkMCwgMHhiOSwgMHhlNywgMHgwMCwgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDVjLCAweDA0LCAweDAwLCAweDgwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDhjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg5MCwgMHhiNSwgMHg0MCwgMHgyMCwgMHgxZCwgMHg0OSwgMHhjMCwgMHg0NiwgCisweDA4LCAweDYwLCAweDAxLCAweGYwLCAweDlkLCAweGZjLCAweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDQxLCAweDY4LCAKKzB4MTksIDB4NDAsIDB4MGMsIDB4MGYsIDB4NjEsIDB4MDEsIDB4MDksIDB4MWIsIDB4ODksIDB4MDAsIDB4MTgsIDB4NGEsIAorMHg4ZiwgMHgxOCwgMHgwMSwgMHgyMSwgMHgzOSwgMHg4MCwgMHg4MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg3OSwgMHg2NSwgCisweDQxLCAweDZhLCAweGMwLCAweDQ2LCAweDc5LCAweDY3LCAweGI5LCAweDZjLCAweGZhLCAweDZjLCAweDg5LCAweDE4LCAKKzB4YjksIDB4NjQsIDB4MDAsIDB4MjEsIDB4ZjksIDB4NjQsIDB4YmEsIDB4NmIsIDB4M2IsIDB4NmQsIDB4ZDIsIDB4MTgsIAorMHhiYSwgMHg2MywgMHgzOSwgMHg2NSwgMHg0MiwgMHg2YSwgMHgyMCwgMHgzMiwgMHg1MSwgMHg3MSwgMHg3OSwgMHg2ZCwgCisweDdhLCAweDZmLCAweGQyLCAweDZkLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweGZjLCAweGY3LCAweGNhLCAweGZmLCAKKzB4MjAsIDB4MDEsIDB4MDksIDB4NDksIDB4NDAsIDB4MTgsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIAorMHg0MSwgMHg2YiwgMHgwMSwgMHgzOSwgMHg0MSwgMHg2MywgMHg3OCwgMHg2ZiwgMHgwMSwgMHhmMCwgMHhjNiwgMHhmYiwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4NDAsIDB4MjAsIAorMHgxMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwMSwgMHhmMCwgMHg1OSwgMHhmYywgMHgwNywgMHgxYywgCisweDQwLCAweDY4LCAweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDE4LCAweDQwLCAweDA2LCAweDBmLCAweDcwLCAweDAxLCAKKzB4ODAsIDB4MWIsIDB4ODAsIDB4MDAsIDB4MGMsIDB4NDksIDB4NDQsIDB4MTgsIDB4YjgsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHg2MCwgMHg2NSwgMHg3OCwgMHg2YSwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2NywgMHg4MCwgMHg2ZiwgMHgwNSwgMHgxZCwgCisweGU1LCAweDYzLCAweGI5LCAweDY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweDg5LCAweGY5LCAweDM4LCAweDFjLCAKKzB4MjEsIDB4MWMsIDB4MzIsIDB4MWMsIDB4MmIsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MjAsIDB4ZjgsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDRiLCAweDZmLCAweDliLCAweDZmLCAweDFmLCAweDFkLCAweGNmLCAweDYzLCAweDA1LCAweDY4LCAKKzB4MDAsIDB4MjMsIDB4ODQsIDB4NjksIDB4YTQsIDB4MDgsIDB4MDgsIDB4ZDAsIDB4OWMsIDB4MDAsIDB4MmUsIDB4NTksIAorMHhjMCwgMHg0NiwgMHgzZSwgMHg1MSwgMHg4NCwgMHg2OSwgMHhhNCwgMHgwOCwgMHgwMSwgMHgzMywgMHg5YywgMHg0MiwgCisweGY2LCAweGQ4LCAweDNiLCAweDFjLCAweDAwLCAweGYwLCAweDAzLCAweGY4LCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4ZmYsIDB4YjUsIDB4ODEsIDB4YjAsIDB4MDQsIDB4MWMsIDB4MWQsIDB4MWMsIDB4MGYsIDB4MWMsIAorMHg0NiwgMHg0OCwgMHgwMSwgMHg2OSwgMHgwMSwgMHgzMSwgMHgwMSwgMHg2MSwgMHhmOSwgMHgxZCwgMHg1MSwgMHgzMSwgCisweGJkLCAweDY1LCAweDAwLCAweDkxLCAweDIwLCAweDFjLCAweGZkLCAweGY3LCAweDVkLCAweGZjLCAweGY4LCAweDZkLCAKKzB4NDAsIDB4MDksIDB4MzYsIDB4ZDIsIDB4YjgsIDB4NmQsIDB4MDYsIDB4N2IsIDB4NDMsIDB4N2IsIDB4MWIsIDB4MDIsIAorMHgxZSwgMHg0MywgMHgxNywgMHgyMSwgMHg0OSwgMHgwMiwgMHgwMSwgMHg3MywgMHgwYiwgMHgwYSwgMHg0MywgMHg3MywgCisweDAwLCAweDk5LCAweDIwLCAweDFjLCAweGZkLCAweGY3LCAweDRjLCAweGZjLCAweGI4LCAweDZkLCAweGMwLCAweDQ2LCAKKzB4MDYsIDB4NzMsIDB4MzMsIDB4MGEsIDB4NDMsIDB4NzMsIDB4ZjgsIDB4NmQsIDB4NDAsIDB4MDksIDB4MjAsIDB4ZDIsIAorMHg2MCwgMHg2OCwgMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMywgMHg5OCwgMHgwMSwgMHhmMCwgMHhjYywgMHhmYywgCisweDYwLCAweDY4LCAweDMyLCAweDRiLCAweDE4LCAweDQzLCAweDYwLCAweDYwLCAweDIwLCAweDFjLCAweDAxLCAweGYwLCAKKzB4MzUsIDB4ZmQsIDB4MDAsIDB4MjUsIDB4N2QsIDB4NjAsIDB4YmQsIDB4NjAsIDB4M2QsIDB4NjQsIDB4N2QsIDB4NjQsIAorMHgyMCwgMHgxYywgMHhmYywgMHhmNywgMHgzMSwgMHhmZiwgMHgzOCwgMHg4OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgCisweDM4LCAweDgwLCAweDdkLCAweDYyLCAweDI5LCAweDQ4LCAweGMwLCAweDQ2LCAweGI4LCAweDYyLCAweDM4LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4YTAsIDB4ZmIsIDB4NDQsIDB4ZTAsIDB4MjAsIDB4NjgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgwOCwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHg3OCwgMHg2NCwgMHg2MCwgMHg2OCwgCisweDAyLCAweDA0LCAweDEyLCAweDBjLCAweDc4LCAweDZlLCAweDAxLCAweDI2LCAweGMxLCAweDFkLCAweDBkLCAweDMxLCAKKzB4OGEsIDB4NDIsIDB4MDIsIDB4ZDIsIDB4M2EsIDB4NjQsIDB4MDgsIDB4MWMsIDB4MGUsIDB4ZTAsIDB4NDEsIDB4MTksIAorMHg4OSwgMHg4OSwgMHhmMCwgMHgyMywgMHgxOSwgMHg0MCwgMHgwOSwgMHgwOSwgMHg4OSwgMHgwMCwgMHg0MCwgMHgxOCwgCisweGY4LCAweDYwLCAweGY5LCAweDYxLCAweDYxLCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDgxLCAweDQyLCAKKzB4MTYsIDB4ZDIsIDB4MzksIDB4NjQsIDB4NjMsIDB4NjgsIDB4MTksIDB4MDQsIDB4MDksIDB4MGMsIDB4NDAsIDB4MWEsIAorMHgwMywgMHgzMCwgMHg4MCwgMHgwOCwgMHg4MiwgMHgwMCwgMHhhMCwgMHg2MSwgCisweDIwLCAweDY4LCAweDA5LCAweDE4LCAweDliLCAweDE4LCAweDYzLCAweDYwLCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAKKzB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZmEsIDB4N2UsIDB4ODAsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhiZiwgMHhmYiwgMHgwYiwgMHhlMCwgMHhiOSwgMHg2OCwgMHgwOCwgMHgxYSwgMHgwMCwgMHgyNSwgMHg3OCwgMHg2MiwgCisweGJkLCAweDYyLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDNjLCAweGZjLCAweDIwLCAweDFjLCAweDM5LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4NjQsIDB4ZjgsIDB4MDUsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhjMCwgCisweGYwLCAweGI1LCAweDA0LCAweDFjLCAweDBmLCAweDFjLCAweDM4LCAweDZjLCAweGY5LCAweDZiLCAweDBkLCAweDE4LCAKKzB4MjEsIDB4NjgsIDB4NDEsIDB4MTgsIDB4MDAsIDB4MjAsIDB4YTIsIDB4NjksIDB4MDAsIDB4MmEsIDB4MGIsIDB4ZDksIAorMHg4MiwgMHgwMCwgMHg1NiwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgCisweGMwLCAweDQ2LCAweGFiLCAweDUwLCAweGEyLCAweDY5LCAweDAxLCAweDMwLCAweDgyLCAweDQyLCAweGYzLCAweGQ4LCAKKzB4NzgsIDB4NmUsIDB4ZjksIDB4NmIsIDB4MDksIDB4MTgsIDB4ODksIDB4ODksIDB4ZjAsIDB4MjMsIDB4MTksIDB4NDAsIAorMHgwOSwgMHgwOSwgMHg4OSwgMHgwMCwgMHg0MCwgMHgxOCwgMHhmOCwgMHg2MCwgMHhmOSwgMHg2MSwgMHgyMCwgMHg2OCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDM4LCAweDE4LCAweDQzLCAweDAxLCAweDY4LCAweDc4LCAweDZjLCAKKzB4ZmMsIDB4ZjcsIDB4OTUsIDB4ZmYsIDB4NzgsIDB4NjQsIDB4NjAsIDB4NjgsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHhmOCwgMHg2OCwgMHg4MSwgMHg0MiwgMHgxOSwgMHhkMiwgMHgzOSwgMHg2NCwgMHg2MywgMHg2OCwgMHgxOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDQwLCAweDFhLCAweDAzLCAweDMwLCAweDgwLCAweDA4LCAweDgyLCAweDAwLCAweGEwLCAweDYxLCAKKzB4MjAsIDB4NjgsIDB4MDksIDB4MTgsIDB4OWIsIDB4MTgsIDB4NjMsIDB4NjAsIDB4YzMsIDB4MWYsIDB4MDUsIDB4M2IsIAorMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg1NiwgMHhmYSwgMHgwMSwgMHgyMCwgMHg3OCwgMHg4MCwgMHgyMCwgMHgxYywgCisweDAwLCAweGYwLCAweDVlLCAweGZiLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGI5LCAweDY4LCAKKzB4MDgsIDB4MWEsIDB4NzgsIDB4NjIsIDB4MDAsIDB4MjAsIDB4YjgsIDB4NjIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhkOSwgMHhmYiwgMHgyMCwgMHgxYywgMHgzOSwgMHgxYywgMHgwMCwgMHhmMCwgMHgwMSwgMHhmOCwgMHhlZiwgMHhlNywgCisweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDA0LCAweDFjLCAweDBmLCAweDFjLCAweDhlLCAweDQ4LCAweDQxLCAweDY5LCAKKzB4MDEsIDB4MzEsIDB4NDEsIDB4NjEsIDB4MDMsIDB4MjAsIDB4MDAsIDB4MDcsIDB4NjEsIDB4NjgsIDB4MDgsIDB4NDAsIAorMHgwNiwgMHgwZiwgMHgwYSwgMHgwNCwgMHgxMiwgMHgwYywgMHgyMCwgMHg2OCwgMHgxMSwgMHgxOCwgMHhmYiwgMHg2OCwgCisweGQyLCAweDFhLCAweDdiLCAweDY4LCAweDlkLCAweDFhLCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAweDM4LCAweDFjLCAKKzB4MmEsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MjYsIDB4ZmEsIDB4MDAsIDB4MjAsIDB4NzgsIDB4ODAsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHgyZSwgMHhmYiwgMHg2MCwgMHg2OCwgMHg0MCwgMHgxOSwgMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgCisweDYwLCAweDYwLCAweDMwLCAweDFjLCAweDAxLCAweGYwLCAweGUwLCAweGZiLCAweDdkLCAweDRlLCAweDBiLCAweDIzLCAKKzB4MWIsIDB4MDIsIDB4ZjAsIDB4MTgsIDB4MDAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MTksIDB4ZDAsIDB4MDAsIDB4MjUsIAorMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhmMCwgMHgxOCwgMHhjMCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgxMiwgMHhkMCwgCisweGFhLCAweDAwLCAweDkyLCAweDE5LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAweGQyLCAweDE4LCAweGQyLCAweDY4LCAKKzB4MjAsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDEsIDB4ZjAsIDB4MWMsIDB4ZmUsIDB4MDEsIDB4MzUsIDB4YTgsIDB4MDAsIAorMHg4MCwgMHgxOSwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhjMCwgMHgxOCwgMHhjMCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweGVjLCAweGQxLCAweGY4LCAweDZiLCAweDAxLCAweDFmLCAweDhhLCAweDFjLCAweGZhLCAweDYzLCAweGZhLCAweDY4LCAKKzB4N2QsIDB4NmMsIDB4MDAsIDB4ZjAsIDB4YmIsIDB4ZjksIDB4YzAsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHgyOCwgMHgxYywgMHhmYywgMHhmNywgMHgxMCwgMHhmZiwgMHgwMywgMHg5MCwgMHhmOSwgMHg2YiwgMHgzYSwgMHg2ZSwgCisweDhlLCAweDE4LCAweDIwLCAweDY4LCAweDEyLCAweDE4LCAweDAxLCAweDkyLCAweDdhLCAweDZlLCAweDhkLCAweDE4LCAKKzB4MTEsIDB4MTgsIDB4MDIsIDB4OTEsIDB4YzgsIDB4MWQsIDB4MDksIDB4MzAsIDB4ZTAsIDB4NjAsIDB4YjEsIDB4ODgsIAorMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwOCwgMHg0MywgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDc4LCAweDYxLCAweDY4LCAweDY4LCAweDAxLCAweDBlLCAweGZmLCAweDIyLCAweDEyLCAweDA0LCAKKzB4MDIsIDB4NDAsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDIsIDB4MDIsIDB4NDAsIAorMHgxMiwgMHgwMiwgMHgxMSwgMHg0MywgMHgwMCwgMHgwNiwgMHgwOCwgMHg0MywgMHgzOCwgMHg2MSwgMHhhOCwgMHg4OSwgCisweDA5LCAweDIzLCAweDFiLCAweDAyLCAweDE4LCAweDQwLCAweGI4LCAweDYxLCAKKzB4YTgsIDB4ODksIDB4OTgsIDB4NDMsIDB4YTgsIDB4ODEsIDB4YTgsIDB4ODksIDB4MDIsIDB4OTksIDB4YzAsIDB4NDYsIAorMHg4OCwgMHg4MSwgMHgwMCwgMHgyMCwgMHg3MCwgMHg4MCwgMHhiMCwgMHg4MCwgMHg3MCwgMHg4MSwgMHg2OCwgMHg2MCwgCisweDI4LCAweDgyLCAweGI5LCAweDZlLCAweDMwLCAweDFjLCAweGZjLCAweGY3LCAweGU4LCAweGZlLCAweDM4LCAweDg2LCAKKzB4ZmEsIDB4NjksIDB4MzAsIDB4MWMsIDB4MjksIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MDMsIDB4ZmYsIDB4NzgsIDB4ODYsIAorMHgzZCwgMHg4ZSwgMHg3OCwgMHg4ZSwgMHgwMywgMHg5OSwgMHhmYywgMHhmNywgMHhjOCwgMHhmZSwgMHgwMCwgMHg5MCwgCisweDYwLCAweDY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDM5LCAweDZlLCAweDQxLCAweDFhLCAweDA5LCAweDA0LCAKKzB4MDksIDB4MGMsIDB4N2EsIDB4NmUsIDB4ODIsIDB4MWEsIDB4MTMsIDB4MDQsIDB4MWIsIDB4MGMsIDB4MWEsIDB4MDIsIAorMHgxYiwgMHgwYSwgMHgxYSwgMHg0MywgMHgxNiwgMHgwNCwgMHgzNiwgMHgwYywgMHhiYSwgMHg2OCwgMHg4MiwgMHg0MiwgCisweDAxLCAweGQyLCAweDAwLCAweDIwLCAweDAwLCAweGUwLCAweDEwLCAweDFhLCAweGI4LCAweDYwLCAweDA4LCAweDAyLCAKKzB4MDksIDB4MTIsIDB4MDksIDB4MDYsIDB4MDksIDB4MGUsIDB4MDgsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg4MCwgMHgyOCwgMHgxYywgMHhmYywgMHhmNywgMHhhMywgMHhmZSwgCisweDA1LCAweDFjLCAweDAwLCAweDk4LCAweDMxLCAweDFjLCAweGZjLCAweGY3LCAweDllLCAweGZlLCAweDA2LCAweDFjLCAKKzB4NzgsIDB4NjksIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MGEsIDB4MDgsIDB4NDMsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgMHg4MSwgMHg4MCwgMHgyOCwgMHgxYywgCisweGZjLCAweGY3LCAweDhmLCAweGZlLCAweDc5LCAweDY5LCAweDAxLCAweDMxLCAweGMwLCAweDQzLCAweDc5LCAweDYxLCAKKzB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4ODEsIDB4MzgsIDB4NjksIDB4MDEsIDB4MGUsIDB4ZmYsIDB4MjIsIAorMHgxMiwgMHgwNCwgMHgwMiwgMHg0MCwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgMHhmZiwgMHgyMiwgMHgxMiwgMHgwMiwgCisweDAyLCAweDQwLCAweDEyLCAweDAyLCAweDExLCAweDQzLCAweDAwLCAweDA2LCAweDAxLCAweDQzLCAweDMwLCAweDFjLCAKKzB4ZmMsIDB4ZjcsIDB4NzcsIDB4ZmUsIDB4MzksIDB4NjksIDB4N2EsIDB4NjgsIDB4ODksIDB4MTgsIDB4MzksIDB4NjEsIAorMHhiOSwgMHg2OCwgMHgwMCwgMHgyOSwgMHgwOSwgMHhkMSwgMHgwMiwgMHg5OSwgMHg4OSwgMHg4OSwgMHhiYSwgMHg2OSwgCisweDExLCAweDQzLCAweDAyLCAweDlhLCAweGMwLCAweDQ2LCAweDkxLCAweDgxLCAweGI5LCAweDY5LCAweGZjLCAweGY3LCAKKzB4NjYsIDB4ZmUsIDB4MjAsIDB4ODIsIDB4MDAsIDB4MjAsIDB4NjAsIDB4ODIsIDB4ZjgsIDB4NmQsIDB4NDEsIDB4MDgsIAorMHgxNiwgMHhkMywgMHg4MCwgMHgwYSwgMHgwYSwgMHhkMywgMHg2MCwgMHg2OCwgMHgxMCwgMHgzOCwgMHgwMSwgMHgwNCwgCisweDA5LCAweDBjLCAweDA4LCAweDAyLCAweDA5LCAweDBhLCAweDA4LCAweDQzLCAweDIxLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4ODIsIDB4MDksIDB4ZTAsIDB4NjAsIDB4NjgsIDB4MGMsIDB4MzgsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgyMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHg4OCwgMHg4MSwgCisweDA0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjEsIDB4YjUsIDB4ODQsIDB4YjAsIDB4NmUsIDB4NGQsIDB4MjgsIDB4NjksIAorMHgwMSwgMHgyMiwgMHgwNCwgMHg5OSwgMHg4YSwgMHg0MCwgMHg5MCwgMHg0MywgMHgyOCwgMHg2MSwgMHgwNCwgMHg5OCwgCisweDQzLCAweDAxLCAweDE4LCAweDFhLCAweDgwLCAweDAwLCAweDE2LCAweDFjLCAweDY5LCAweDQ5LCAweDQ0LCAweDE4LCAKKzB4ZTAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTAsIDB4YTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIAorMHgwMCwgMHgyNiwgMHgyNiwgMHhlMCwgMHg2NSwgMHg0OCwgMHg0MSwgMHg2OSwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MSwgCisweDA0LCAweDk4LCAweGZjLCAweGY3LCAweDA5LCAweGZkLCAweDA3LCAweDFjLCAweDAzLCAweGQxLCAweDI4LCAweDY5LCAKKzB4MzAsIDB4NDMsIDB4MjgsIDB4NjEsIDB4YjUsIDB4ZTAsIDB4YTAsIDB4NjgsIDB4NjUsIDB4NjgsIDB4YTgsIDB4NDIsIAorMHgwMCwgMHhkMiwgMHgwNSwgMHgxYywgMHhhMSwgMHg2YywgMHhhOSwgMHg0MiwgMHgxNiwgMHhkMiwgMHg0MCwgMHgxYSwgCisweDYyLCAweDZhLCAweDEwLCAweDFhLCAweDAwLCAweDI2LCAweDYwLCAweDYyLCAweGE2LCAweDYwLCAweGE2LCAweDYyLCAKKzB4MjAsIDB4ODgsIDB4NDgsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MjAsIDB4ODAsIDB4MGQsIDB4MWMsIDB4MDksIDB4ZDEsIAorMHgzOCwgMHgxYywgMHhmYywgMHhmNywgMHgxOSwgMHhmZCwgMHgwMywgMHgyMCwgMHg2MCwgMHg4MCwgMHg2NiwgMHg2MCwgCisweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDhkLCAweGY5LCAweDk2LCAweGUwLCAweGUxLCAweDY4LCAweDM4LCAweDY4LCAKKzB4MDksIDB4MTgsIDB4YzMsIDB4MWYsIDB4MDUsIDB4M2IsIDB4MjAsIDB4MWMsIDB4MDIsIDB4MzksIDB4MmEsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHhjZCwgMHhmOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhkNywgMHhmOSwgMHhlMCwgMHg2OCwgCisweDQ2LCAweDE5LCAweDc4LCAweDY4LCAweDMwLCAweDQzLCAweDc4LCAweDYwLCAweDA0LCAweDk4LCAweDMxLCAweDFjLCAKKzB4MDEsIDB4ZjAsIDB4ODgsIDB4ZmEsIDB4MjEsIDB4NmUsIDB4MDAsIDB4OTgsIAorMHgwOCwgMHgxOCwgMHgwMSwgMHg5MCwgMHg3MCwgMHgxYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHg2MSwgMHg2ZSwgCisweDcxLCAweDFhLCAweDBhLCAweDA0LCAweDEyLCAweDBjLCAweDExLCAweDAyLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDIsIDB4OTEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MGEsIDB4MDgsIDB4NDMsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg4MCwgMHgyMCwgMHg4ZSwgCisweGZjLCAweGY3LCAweGNiLCAweGZkLCAweDA2LCAweDFjLCAweDYwLCAweDhlLCAweDAyLCAweDk5LCAweGZjLCAweGY3LCAKKzB4YzYsIDB4ZmQsIDB4MDMsIDB4OTAsIDB4NjAsIDB4NjksIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDgsIDB4MDIsIAorMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgCisweDgxLCAweDgwLCAweDMwLCAweDFjLCAweGZjLCAweGY3LCAweGI3LCAweGZkLCAweDYxLCAweDY5LCAweDAxLCAweDMxLCAKKzB4YzAsIDB4NDMsIDB4NjEsIDB4NjEsIDB4MDEsIDB4OTksIDB4YzAsIDB4NDYsIDB4NDgsIDB4ODEsIDB4NjAsIDB4NmUsIAorMHgwMCwgMHg5OSwgMHg0NiwgMHgxOCwgMHgyMCwgMHg2OSwgMHgwMSwgMHgwZSwgMHhmZiwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDAyLCAweDQwLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAweGZmLCAweDIyLCAweDEyLCAweDAyLCAweDAyLCAweDQwLCAKKzB4MTIsIDB4MDIsIDB4MTEsIDB4NDMsIDB4MDAsIDB4MDYsIDB4MDEsIDB4NDMsIDB4NzEsIDB4NjAsIDB4MDMsIDB4OTgsIAorMHhmYywgMHhmNywgMHg5YiwgMHhmZCwgMHgyMSwgMHg2OSwgMHg0OSwgMHgxOSwgMHgyMSwgMHg2MSwgMHhhMSwgMHg2OCwgCisweDQ5LCAweDFiLCAweGExLCAweDYwLCAweDA2LCAweGQxLCAweGIxLCAweDg5LCAweGEyLCAweDY5LCAweDExLCAweDQzLCAKKzB4YjEsIDB4ODEsIDB4YTEsIDB4NjksIDB4ZmMsIDB4ZjcsIDB4OGQsIDB4ZmQsIDB4MzgsIDB4ODIsIDB4NjEsIDB4NmUsIAorMHgzOCwgMHg2OCwgMHgwOSwgMHgxOCwgMHgwZSwgMHgzMSwgMHhmOSwgMHg2MCwgMHhlMiwgMHg2OCwgMHgwMCwgMHg5OSwgCisweDA0LCAweDM4LCAweDAwLCAweGYwLCAweDRjLCAweGY4LCAweDAyLCAweDIwLCAweDc4LCAweDgyLCAweGUwLCAweDZkLCAKKzB4NDEsIDB4MDgsIDB4MTYsIDB4ZDMsIDB4ODAsIDB4MGEsIDB4MGEsIDB4ZDMsIDB4NzgsIDB4NjgsIDB4MTAsIDB4MzgsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgzOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweGM4LCAweDgxLCAweDA5LCAweGUwLCAweDc4LCAweDY4LCAweDBjLCAweDM4LCAweDAxLCAweDA0LCAKKzB4MDksIDB4MGMsIDB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MzksIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg4MSwgMHgwNSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweGQwLCAweDJjLCAweDAwLCAweDgwLCAweDVjLCAweDJiLCAweDAwLCAweDgwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4ZjcsIDB4YjUsIDB4MDMsIDB4MWMsIDB4MGYsIDB4MWMsIDB4MDAsIDB4MjAsIDB4MWMsIDB4NjgsIDB4MjYsIDB4MDQsIAorMHgzMSwgMHgxYywgMHgxZCwgMHgxZCwgMHhmYywgMHhmNywgMHg1MSwgMHhmZCwgMHg0MCwgMHhjNywgMHgwMiwgMHg5YSwgCisweGQxLCAweDFjLCAweDg5LCAweDA4LCAweDAxLCAweDM5LCAweDRhLCAweDFlLCAweDAyLCAweDkyLCAweDAwLCAweDI5LCAKKzB4MGQsIDB4ZDAsIDB4MjEsIDB4MGMsIDB4MTAsIDB4Y2QsIDB4MjIsIDB4MDQsIDB4MGEsIDB4NDMsIDB4MTEsIDB4MWMsIAorMHgxNiwgMHgxYywgMHhmYywgMHhmNywgMHg0MCwgMHhmZCwgMHg0MCwgMHhjNywgMHgwMiwgMHg5OSwgMHg0YSwgMHgxZSwgCisweDAyLCAweDkyLCAweDAwLCAweDI5LCAweGYxLCAweGQxLCAweDAzLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4ODksIDB4MDgsIDB4ODksIDB4MDAsIDB4MDMsIDB4MzIsIAorMHg5MywgMHgwOCwgMHg1YSwgMHgxZSwgMHgwMCwgMHgyYiwgMHgwNSwgMHhkMCwgMHgwOCwgMHhjOSwgMHgwOCwgMHhjMCwgCisweDEzLCAweDFjLCAweDAxLCAweDNhLCAweDAwLCAweDJiLCAweGY5LCAweGQxLCAweDcwLCAweDQ3LCAweGZmLCAweGI1LCAKKzB4ODYsIDB4YjAsIDB4MTcsIDB4MWMsIDB4MDAsIDB4MjYsIDB4MDYsIDB4OTgsIDB4ODAsIDB4NmMsIDB4YzAsIDB4MWIsIAorMHgwNiwgMHg5OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2NCwgMHgwMSwgMHgyMCwgMHhjMCwgMHgwNSwgMHgwNiwgMHg5OSwgCisweDg5LCAweDZiLCAweGMwLCAweDQ2LCAweDAxLCAweDkxLCAweDA2LCAweDk5LCAweDRjLCAweDZiLCAweDY3LCAweGUwLCAKKzB4MjEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTEsIDB4NjEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDMsIDB4OTEsIAorMHhhMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwNCwgMHg5MSwgMHgwMiwgMHhhOSwgMHg0OSwgMHg4OCwgMHhiOSwgMHg0MiwgCisweDA4LCAweGQyLCAweDAyLCAweGFkLCAweDZkLCAweDg4LCAweDAyLCAweGE5LCAweDQ5LCAweDg4LCAweDdmLCAweDFhLCAKKzB4MDAsIDB4MjEsIDB4MDIsIDB4YWIsIDB4NTksIDB4ODAsIDB4MTksIDB4ZTAsIDB4MDIsIDB4YTksIDB4NDksIDB4ODgsIAorMHhjOSwgMHgxYiwgMHgwMiwgMHhhYiwgMHg1OSwgMHg4MCwgMHgzZCwgMHgxYywgMHgwMCwgMHgyNywgMHgwMSwgMHgyMSwgCisweDQ5LCAweDA2LCAweDA3LCAweDliLCAweDlhLCAweDA3LCAweDkyLCAweDBmLCAweDBkLCAweGQwLCAweGViLCAweDA2LCAKKzB4ZGIsIDB4MGUsIDB4MDgsIDB4ZDAsIDB4MWUsIDB4MmIsIDB4MDgsIDB4ZDMsIDB4MWUsIDB4MmIsIDB4MDIsIDB4ZDEsIAorMHgwMywgMHgyYSwgMHgwNCwgMHhkMSwgMHgwMSwgMHhlMCwgMHgwMiwgMHgyYSwgCisweDAxLCAweGQzLCAweDAxLCAweDI2LCAweDAwLCAweDIxLCAweDI5LCAweDQzLCAweDAxLCAweDQzLCAweDBhLCAweDFjLCAKKzB4MDAsIDB4OTEsIDB4MDAsIDB4MjAsIDB4MDMsIDB4OTksIDB4MDQsIDB4OWEsIDB4MDcsIDB4OWIsIDB4MDEsIDB4ZjAsIAorMHg1YiwgMHhmZiwgMHgwNywgMHg5OSwgMHg0OSwgMHgxOSwgMHgwNywgMHg5MSwgMHgwMCwgMHgyZSwgMHgwYSwgMHhkMCwgCisweDFkLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDFkLCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAKKzB4MDAsIDB4MjAsIDB4MDcsIDB4OWIsIDB4MDEsIDB4ZjAsIDB4NGMsIDB4ZmYsIDB4MDAsIDB4MjYsIDB4MDIsIDB4YTgsIAorMHg0MCwgMHg4OCwgMHgwMCwgMHgyOCwgMHgwYywgMHhkMCwgMHgwMywgMHg5OCwgMHg0MCwgMHgxOSwgMHgwMywgMHg5MCwgCisweDAyLCAweDk4LCAweGMwLCAweDQ2LCAweDIwLCAweDYwLCAweDAzLCAweDk4LCAweGMwLCAweDQ2LCAweDYwLCAweDYwLCAKKzB4MDQsIDB4OTgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjAsIDB4MDMsIDB4ZTAsIDB4MDEsIDB4OTgsIDB4MDEsIDB4MzgsIAorMHgwMSwgMHg5MCwgMHgxMCwgMHgzNCwgMHgwNiwgMHg5OCwgMHhjMCwgMHg0NiwgMHg0NCwgMHg2MywgMHgwMSwgMHg5OCwgCisweDA2LCAweDk5LCAweGMwLCAweDQ2LCAweDg4LCAweDYzLCAweDAwLCAweDIwLCAweDAwLCAweDJmLCAweDAyLCAweGQwLCAKKzB4MDEsIDB4OTksIDB4MDAsIDB4MjksIDB4OTIsIDB4ZDEsIDB4MDksIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIAorMHgwNiwgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwOSwgMHg5YiwgMHgwMSwgMHhmMCwgCisweDFmLCAweGZmLCAweDBhLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDAsIDB4NTMsIDB4MDIsIAorMHg5MCwgMHhiNSwgMHgwYywgMHgxYywgMHgwNywgMHgxYywgMHgzOCwgMHg2OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDA4LCAweDM4LCAweDE4LCAweDQzLCAweDAxLCAweDY4LCAweDM4LCAweDhhLCAweGZjLCAweGY3LCAweDg1LCAweGZjLCAKKzB4YzAsIDB4NDMsIDB4ZjksIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDgsIDB4ODAsIDB4NzgsIDB4OGEsIDB4MzksIDB4NjgsIAorMHgwOCwgMHgxYSwgMHgzOCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMSwgMHhmMCwgMHg4YiwgMHhmOSwgMHgzOCwgMHgxYywgCisweGZjLCAweGY3LCAweDhjLCAweGZiLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDMzLCAweGZlLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4YjUsIDB4MDEsIDB4ODgsIDB4OGEsIDB4MDksIDB4MjEsIDB4ZDMsIAorMHhjYSwgMHgwOSwgMHgxZiwgMHhkMiwgMHg4YSwgMHgwOCwgMHgxZCwgMHhkMywgMHgwMCwgMHgyMSwgMHgwMSwgMHg4MCwgCisweDQxLCAweDgwLCAweDQ3LCAweDZmLCAweDQwLCAweDZkLCAweGZhLCAweDFkLCAweDE5LCAweDMyLCAweDUxLCAweDcxLCAKKzB4ZmEsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MTAsIDB4NjAsIDB4M2EsIDB4NmUsIDB4YzAsIDB4NDYsIDB4MTAsIDB4NjAsIAorMHgwYywgMHg0OCwgMHhjMCwgMHg0NiwgMHg4MSwgMHg2MywgMHhjMSwgMHg2YiwgMHg0OSwgMHgwOCwgMHg0OSwgMHgwMCwgCisweGMxLCAweDYzLCAweDAxLCAweDIwLCAweDAwLCAweGYwLCAweGNjLCAweGZmLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4NmIsIDB4ZmYsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4MjMsIDB4MTksIDB4NDMsIAorMHgwMSwgMHg4MCwgMHgwMSwgMHg4OCwgMHg0OSwgMHgwOSwgMHhmNiwgMHhkMiwgMHgwMCwgMHhmMCwgMHhiMCwgMHhmOCwgCisweGYzLCAweGU3LCAweDAwLCAweDAwLCAweGU4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MTAsIDB4MWMsIDB4MGQsIDB4MWMsIDB4MDAsIDB4MjQsIDB4NWUsIDB4MWUsIDB4MDAsIDB4MmIsIDB4MTksIDB4ZDAsIAorMHgwMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgzOSwgMHg2MCwgMHg0MSwgMHg4OCwgMHgwYywgMHgxOSwgMHg0MSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDc5LCAweDYwLCAweDgxLCAweDY4LCAweGMwLCAweDQ2LCAweGI5LCAweDYwLCAweGMxLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4MTAsIDB4MzAsIDB4MTAsIDB4MzcsIDB4ZTksIDB4NmEsIDB4ODEsIDB4NDIsIAorMHgwMiwgMHhkOCwgMHgyOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhlYywgMHhmZiwgMHgzMSwgMHgxYywgMHgwMSwgMHgzZSwgCisweDAwLCAweDI5LCAweGU1LCAweGQxLCAweDIwLCAweDFjLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MjEsIDB4YzEsIDB4NjEsIDB4MDUsIDB4NDksIDB4MGEsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MDEsIDB4ZDEsIAorMHgwOCwgMHg2MCwgMHgwMiwgMHhlMCwgMHg0YSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkMCwgMHg2MSwgMHg0OCwgMHg2MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGQwLCAweDJjLCAweDAwLCAweDgwLCAweDAzLCAweDQ5LCAweDA4LCAweDY4LCAKKzB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4YzIsIDB4NjksIDB4YzAsIDB4NDYsIDB4MGEsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHgwMCwgMHgyMSwgMHg4MSwgMHg2NywgMHgwNSwgMHg0OSwgMHg4YSwgMHg2OCwgCisweDAwLCAweDJhLCAweDAxLCAweGQxLCAweDg4LCAweDYwLCAweDAyLCAweGUwLCAweGNhLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4OTAsIDB4NjcsIDB4YzgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4MmMsIDB4MDAsIDB4ODAsIAorMHgwMywgMHg0OSwgMHg4OCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgMHg4MiwgMHg2ZiwgMHhjMCwgMHg0NiwgCisweDhhLCAweDYwLCAweDcwLCAweDQ3LCAweGQwLCAweDJjLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4ODAsIDB4MjAsIDB4MTMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZmYsIDB4ZjcsIAorMHhkNSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgxYiwgMHhkMCwgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHg0MSwgMHg2OCwgCisweDE5LCAweDQwLCAweDBhLCAweDBmLCAweDUxLCAweDAxLCAweDg5LCAweDFhLCAweDg5LCAweDAwLCAweDBkLCAweDRiLCAKKzB4YzksIDB4MTgsIDB4NGIsIDB4ODgsIDB4MDAsIDB4MmIsIDB4MDQsIDB4ZDEsIDB4MTEsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHgzYiwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMSwgMHgyYiwgMHgwMiwgMHhkMSwgMHhmZiwgMHhmNywgCisweDA1LCAweGZjLCAweGY4LCAweGU3LCAweDAyLCAweDJiLCAweGY2LCAweGQxLCAweGZmLCAweGY3LCAweDRlLCAweGZiLCAKKzB4ZjMsIDB4ZTcsIDB4MDQsIDB4NDgsIDB4MDEsIDB4NmQsIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjUsIDB4ZWUsIDB4ZTcsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDAwLCAweGI1LCAweDIwLCAweDIwLCAweDBkLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGZmLCAweGY3LCAKKzB4YmYsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MGUsIDB4ZDAsIDB4MDEsIDB4ODgsIDB4MjAsIDB4MjMsIDB4MTksIDB4NDMsIAorMHgwMSwgMHg4MCwgMHgwMSwgMHg4OCwgMHgxMCwgMHgyMywgMHg5OSwgMHg0MywgMHgwMSwgMHg4MCwgMHgwMSwgMHg4OCwgCisweDA5LCAweDBhLCAweDAxLCAweGQzLCAweGZmLCAweGY3LCAweDJlLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDMsIDB4NDgsIDB4MDEsIDB4NmQsIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjUsIDB4ZjgsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHg5OCwgMHhiNSwgMHgwNywgMHgxYywgCisweDIyLCAweDQ4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweDIyLCAweDQ4LCAweGMzLCAweDFkLCAweDQxLCAweDMzLCAKKzB4NDEsIDB4NmQsIDB4ODIsIDB4NmQsIDB4ODAsIDB4NmMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MGIsIDB4OWMsIDB4NjgsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHg5OCwgMHg0MiwgMHgwMCwgMHhkMSwgCisweDBjLCAweGUwLCAweDk4LCAweDQyLCAweDAzLCAweGQ5LCAweDEwLCAweDFhLCAweDU5LCAweDFhLCAweDQxLCAweDE4LCAKKzB4MDAsIDB4ZTAsIDB4MTksIDB4MWEsIDB4MDEsIDB4MjAsIDB4MTAsIDB4MjksIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MjAsIAorMHgwMCwgMHgyOCwgMHgxZiwgMHhkMCwgMHg3OCwgMHg2YSwgMHhmOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgCisweGI4LCAweDZhLCAweGY5LCAweDZhLCAweGMwLCAweDQ2LCAweDQ4LCAweDYwLCAweDEwLCAweDRhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4ZmIsIDB4NmEsIDB4MGYsIDB4NDgsIDB4NDIsIDB4NmQsIDB4MDMsIDB4MjAsIDB4MzksIDB4NmEsIAorMHgwMSwgMHhmMCwgMHhlMiwgMHhmZCwgMHgzOCwgMHg4OCwgMHgxMCwgMHgyMywgMHgxOCwgMHg0MywgMHgzOCwgMHg4MCwgCisweDM4LCAweDg4LCAweDQwLCAweDIzLCAweDk4LCAweDQzLCAweDM4LCAweDgwLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4NTUsIDB4ZmYsIDB4OTgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MzgsIDB4ODgsIDB4NDAsIDB4MjMsIAorMHgxOCwgMHg0MywgMHgzOCwgMHg4MCwgMHhmNywgMHhlNywgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgCisweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDA4LCAweDAwLCAweDExLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4NDAsIDB4MjAsIDB4MmMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4ZjAsIAorMHhmZCwgMHhmZSwgMHgwNywgMHgxYywgMHg0MCwgMHg2OCwgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHgxOCwgMHg0MCwgCisweDA1LCAweDBmLCAweDY4LCAweDAxLCAweDQwLCAweDFiLCAweDgwLCAweDAwLCAweDI2LCAweDQ5LCAweDQ0LCAweDE4LCAKKzB4MjAsIDB4ODgsIDB4MDIsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MjAsIDB4ODAsIDB4MjAsIDB4ODgsIDB4NDEsIDB4MDgsIAorMHgzNCwgMHhkMywgMHg0MCwgMHgwOCwgMHg0MCwgMHgwMCwgMHgyMCwgMHg4MCwgMHhhMCwgMHg2YywgMHhlMSwgMHg2YywgCisweDQwLCAweDE4LCAweGEwLCAweDY0LCAweDAwLCAweDIwLCAweGUwLCAweDY0LCAweGExLCAweDZiLCAweDIyLCAweDZkLCAKKzB4ODksIDB4MTgsIDB4YTEsIDB4NjMsIDB4MjAsIDB4NjUsIDB4YjgsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjUsIAorMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHg3OCwgMHg2OCwgMHgxOCwgMHg0MCwgMHg3OCwgMHg2MCwgMHg2MSwgMHg2OCwgCisweDM2LCAweDMxLCAweDk0LCAweDI5LCAweDA0LCAweGQ4LCAweDM4LCAweDIzLCAweDE4LCAweDQzLCAweDc4LCAweDYwLCAKKzB4MzgsIDB4MjAsIDB4MDMsIDB4ZTAsIDB4OTQsIDB4MjMsIDB4MTgsIDB4NDMsIDB4NzgsIDB4NjAsIDB4OTQsIDB4MjAsIAorMHhiOCwgMHg2MSwgMHgzOSwgMHg2OCwgMHg3OCwgMHg2OCwgMHgwMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgyMCwgMHgxYywgCisweGNiLCAweDFmLCAweDA1LCAweDNiLCAweGZmLCAweGY3LCAweGQ3LCAweGZkLCAweDAyLCAweDIwLCAweDYwLCAweDgwLCAKKzB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZGYsIDB4ZmUsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgzOCwgMHgxYywgMHhmYywgMHhmNywgMHgwNywgMHhmYSwgMHgyOCwgMHgwMSwgMHgwNiwgMHg0OSwgMHg0MCwgMHgxOCwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAweDQxLCAweDZiLCAweDAxLCAweDM5LCAweDQxLCAweDYzLCAKKzB4ZWYsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwMCwgMHgyNywgCisweDBmLCAweDRjLCAweDBkLCAweGUwLCAweDQyLCAweDZiLCAweDAxLCAweDNhLCAweDQyLCAweDYzLCAweDAwLCAweDJhLCAKKzB4MDUsIDB4ZGMsIDB4MDIsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NDIsIDB4NjMsIDB4YzAsIDB4NmEsIDB4MDEsIDB4ZjAsIAorMHhjNiwgMHhmOSwgMHgwMSwgMHgzNywgMHgwYiwgMHgyZiwgMHgwNywgMHhkMiwgMHgzOCwgMHgwMSwgMHgwMCwgMHgxOSwgCisweDMzLCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDZhLCAweDAwLCAweDI5LCAweGU5LCAweGQxLCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDYsIDB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4OTAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDEwLCAweDQ4LCAweGMxLCAweDY4LCAweDAxLCAweDMxLCAweGMxLCAweDYwLCAweDBmLCAweDQ5LCAweGM4LCAweDY4LCAKKzB4MDEsIDB4MjgsIDB4MTcsIDB4ZDEsIDB4YzgsIDB4MWQsIDB4NzksIDB4MzAsIDB4MDIsIDB4ODksIDB4MDAsIDB4MmEsIAorMHgxMiwgMHhkMCwgMHgwMSwgMHgzYSwgMHgwMiwgMHg4MSwgMHgwMiwgMHg4OSwgMHgwMCwgMHgyYSwgMHgwZCwgMHhkMSwgCisweDQyLCAweDg5LCAweDAwLCAweDJhLCAweDA4LCAweGQxLCAweGM5LCAweDZmLCAweDAyLCAweDIzLCAweDBhLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4MGEsIDB4NjAsIDB4MDQsIDB4MjEsIDB4MDEsIDB4ODEsIDB4MDEsIDB4MjEsIDB4MDAsIDB4ZTAsIAorMHgwMCwgMHgyMSwgMHg0MSwgMHg4MSwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwOCwgMHg4MywgMHgyMCwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGIwLCAweGI1LCAweDA3LCAweDFjLCAweDAxLCAweDIzLCAweGY4LCAweDFkLCAKKzB4NjksIDB4MzAsIDB4MDMsIDB4NzMsIDB4MWUsIDB4NDgsIDB4YzIsIDB4MWQsIDB4NzksIDB4MzIsIDB4NTQsIDB4OGEsIAorMHg2MSwgMHgxYywgMHg1MSwgMHg4MiwgMHhkNSwgMHg4YSwgMHgwMCwgMHgyMSwgMHhhYywgMHg0MiwgMHgwNCwgMHhkYiwgCisweGM0LCAweDFkLCAweDg5LCAweDM0LCAweDYzLCAweDcwLCAweDUxLCAweDgyLCAweGQxLCAweDgzLCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4M2EsIDB4NmQsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YmEsIDB4NjEsIAorMHhmYiwgMHg2OSwgMHg5YSwgMHg0MiwgMHgwNiwgMHhkMSwgMHhmOCwgMHg2YywgMHgxMiwgMHg0OSwgMHhjMCwgMHg0NiwgCisweDA4LCAweDYwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDc5LCAweDYxLCAweDQxLCAweDY5LCAKKzB4ZmEsIDB4NmMsIDB4OTEsIDB4NDMsIDB4NDEsIDB4NjEsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDUsIDB4YzEsIDB4NjAsIAorMHgzOCwgMHg2OSwgMHgwMiwgMHgyOCwgMHhmMSwgMHhkMCwgMHhiOCwgMHg2OSwgMHhmOSwgMHg2OSwgMHg0MSwgMHgxYSwgCisweDAxLCAweGQ1LCAweDc4LCAweDZkLCAweDQxLCAweDE4LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBlLCAweGY4LCAKKzB4ZjksIDB4NjksIDB4MDksIDB4MTgsIDB4ZjksIDB4NjEsIDB4NzgsIDB4NmQsIDB4ODEsIDB4NDIsIDB4ZTIsIDB4ZDMsIAorMHgwOCwgMHgxYSwgMHhmOCwgMHg2MSwgMHhkZiwgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGY4LCAweGI1LCAweDA0LCAweDFjLCAweDBmLCAweDFjLCAweGZmLCAweDIzLCAKKzB4MjEsIDB4MzMsIDB4OWYsIDB4NDIsIDB4MDEsIDB4ZDksIDB4ZmYsIDB4MjcsIDB4MjEsIDB4MzcsIDB4ZTEsIDB4NmUsIAorMHgzOCwgMHgxYywgMHgwMSwgMHhmMCwgMHhjYiwgMHhmYywgMHgyZCwgMHg0ZCwgMHgwMCwgMHgyOCwgMHgxMywgMHhkMSwgCisweGUwLCAweDFkLCAweDQ5LCAweDMwLCAweDAxLCAweDdhLCAweDAxLCAweDIzLCAweDE5LCAweDQzLCAweDAxLCAweDcyLCAKKzB4MjksIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MjksIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIAorMHgwMCwgMHgyMCwgMHgyYiwgMHgxYywgMHgwMSwgMHhmMCwgMHhiMCwgMHhmYywgMHgwMCwgMHgyMCwgMHhmOCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDIwLCAweDY5LCAweDAxLCAweDMwLCAweDIwLCAweDYxLCAweDIzLCAweDQ5LCAKKzB4YzgsIDB4MWQsIDB4YjksIDB4MzAsIDB4MDIsIDB4NmIsIDB4OTIsIDB4MDAsIDB4NTEsIDB4MTgsIDB4YzAsIDB4MzEsIAorMHgwZiwgMHg2MSwgMHgwMSwgMHg2YiwgMHgwMSwgMHgzMSwgMHg4OSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwMSwgMHg2MywgCisweDIwLCAweDZiLCAweGMyLCAweDE5LCAweDYxLCAweDZkLCAweDhhLCAweDQyLCAweDAzLCAweGQ4LCAweDIzLCAweDIyLCAKKzB4MTIsIDB4MDUsIDB4M2EsIDB4NDMsIDB4MDUsIDB4ZTAsIDB4MDksIDB4MWEsIDB4N2UsIDB4MWEsIDB4MDcsIDB4ZDEsIAorMHgyMywgMHgyMiwgMHgxMiwgMHgwNSwgMHgwYSwgMHg0MywgMHgwMCwgMHg5MiwgMHg2MSwgMHg2ZSwgMHgwOSwgMHgxOCwgCisweGEyLCAweDZlLCAweDEwLCAweGUwLCAweDExLCAweDIyLCAweDUyLCAweDA1LCAweDBhLCAweDQzLCAweDAwLCAweDkyLCAKKzB4NjEsIDB4NmUsIDB4MDksIDB4MTgsIDB4MDAsIDB4MjAsIDB4YTIsIDB4NmUsIDB4MmIsIDB4MWMsIDB4MDEsIDB4ZjAsIAorMHg3ZCwgMHhmYywgMHgyMywgMHgyMiwgMHgxMiwgMHgwNSwgMHgzMiwgMHg0MywgMHgwMCwgMHg5MiwgMHg2MSwgMHg2ZSwgCisweGEyLCAweDZlLCAweDAwLCAweDIwLCAweDJiLCAweDFjLCAweDAxLCAweGYwLCAweDczLCAweGZjLCAweDIwLCAweDZiLCAKKzB4YzAsIDB4MTksIDB4MDAsIDB4MDksIDB4MDAsIDB4MDEsIDB4NjEsIDB4NmQsIDB4ODEsIDB4NDIsIDB4MDAsIDB4ZDgsIAorMHg0MCwgMHgxYSwgMHgyMCwgMHg2MywgMHgzOCwgMHgxYywgMHhiOCwgMHhlNywgCisweDQ0LCAweDgwLCAweDIwLCAweDQwLCAweDA0LCAweDAwLCAweDFiLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4MDEsIDB4MjAsIDB4YzAsIDB4MDMsIDB4MGQsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwYywgMHg0OSwgMHhjOCwgMHgxZCwgMHg0OSwgMHgzMCwgMHgwMiwgMHg3YSwgCisweDAwLCAweDI3LCAweDAwLCAweDJhLCAweDAzLCAweGQwLCAweDA3LCAweDcyLCAweDA4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4MzcsIDB4ZmYsIDB4MDgsIDB4NDksIDB4YzgsIDB4MWQsIDB4NDksIDB4MzAsIDB4MDIsIDB4N2EsIDB4MDAsIDB4MmEsIAorMHgwMywgMHhkMCwgMHgwNywgMHg3MiwgMHgwOCwgMHgxYywgMHhmZiwgMHhmNywgMHgyZCwgMHhmZiwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY0LCAweDJkLCAweDAwLCAweDgwLCAKKzB4ZTQsIDB4MmMsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MTAsIDB4MjAsIDB4MTgsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhmOCwgMHg2OCwgMHgwMSwgMHgzMCwgMHhmOCwgMHg2MCwgMHgxNiwgMHg0OCwgCisweGM0LCAweDFkLCAweGI5LCAweDM0LCAweDYxLCAweDZiLCAweDg5LCAweDAwLCAweDA5LCAweDE4LCAweGMwLCAweDMxLCAKKzB4MDksIDB4NjksIDB4N2EsIDB4NjgsIDB4OTIsIDB4MDAsIDB4ZDIsIDB4MTksIDB4NTEsIDB4NjQsIDB4NjEsIDB4NmIsIAorMHg4OSwgMHgwMCwgMHgwOCwgMHgxOCwgMHhjMCwgMHgzMCwgMHgwMSwgMHg2OSwgMHg3OCwgMHg2OCwgMHg4MCwgMHgwMCwgCisweGMwLCAweDE5LCAweGMwLCAweDZiLCAweDAxLCAweGYwLCAweGEyLCAweGZhLCAweDAxLCAweDIzLCAweDc4LCAweDY4LCAKKzB4NTgsIDB4NDAsIDB4NzgsIDB4NjAsIDB4NjAsIDB4NmIsIDB4MDEsIDB4MzAsIDB4ODAsIDB4MDcsIDB4ODAsIDB4MGYsIAorMHg2MCwgMHg2MywgMHhmOCwgMHgxZCwgMHgxOSwgMHgzMCwgMHg0MCwgMHg3OSwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMSwgCisweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDA3LCAweGY4LCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgzOSwgMHg0OCwgMHhjMCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgwNSwgMHhkMCwgMHhiOCwgMHg2YSwgMHhjMCwgMHg2OCwgCisweDgwLCAweDA5LCAweDAxLCAweGQzLCAweDAyLCAweDIwLCAweDAwLCAweGUwLCAweDc4LCAweDZmLCAweGZjLCAweGY3LCAKKzB4NTksIDB4ZjgsIDB4MDQsIDB4MWMsIDB4MDYsIDB4ZDEsIDB4MDEsIDB4MjAsIDB4ZjksIDB4MWQsIDB4MTksIDB4MzEsIAorMHgwOCwgMHg3MSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhmOCwgMHg2YywgMHgyZiwgMHg0OSwgCisweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGJhLCAweDZhLCAweDM4LCAweDFjLCAweDIxLCAweDFjLCAweDAwLCAweGYwLCAKKzB4NTksIDB4ZjgsIDB4NjcsIDB4NjIsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDEsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgwYiwgMHhmZCwgMHhlYywgMHhlNywgMHhmOSwgMHg2ZCwgMHgwOSwgMHg2OCwgMHgwOSwgMHgxOCwgMHgwOSwgMHgwOSwgCisweDA5LCAweDAxLCAweDdhLCAweDZkLCAweDhhLCAweDQyLCAweDAwLCAweGQ4LCAweDg5LCAweDFhLCAweGExLCAweDYyLCAKKzB4YjksIDB4NjgsIDB4ODksIDB4MDAsIDB4YzksIDB4MTksIDB4NGEsIDB4NmMsIDB4MDAsIDB4MmEsIDB4MDcsIDB4ZDAsIAorMHg0YSwgMHg2YywgMHgxMiwgMHgxYSwgMHg0YSwgMHg2NCwgMHg4MCwgMHgwOCwgMHg4MCwgMHgwMCwgMHhiOSwgMHg2YSwgCisweDA4LCAweDE4LCAweGI4LCAweDYyLCAweDM4LCAweDY4LCAweGI5LCAweDZhLCAweDgwLCAweDAwLCAweGMwLCAweDE5LCAKKzB4NDIsIDB4NmIsIDB4OTEsIDB4NDIsIDB4MGUsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4NDEsIDB4NjQsIDB4YjgsIDB4NmEsIAorMHgzOSwgMHg2OCwgMHg4OSwgMHgwMCwgMHhjOSwgMHgxOSwgMHg0OSwgMHg2YiwgMHg0MCwgMHgxYSwgMHhiOCwgMHg2MiwgCisweGI5LCAweDY4LCAweDg5LCAweDAwLCAweGM5LCAweDE5LCAweGM5LCAweDZiLCAweDQwLCAweDE4LCAweGI4LCAweDYyLCAKKzB4YjgsIDB4NjgsIDB4ODEsIDB4MDAsIDB4YzksIDB4MTksIDB4NDksIDB4NmMsIDB4MDAsIDB4MjksIDB4YjgsIDB4ZDEsIAorMHhiOSwgMHg2YSwgMHhmYSwgMHg2YiwgMHg5MSwgMHg0MiwgMHhiNCwgMHhkMCwgMHgzYSwgMHg2YywgMHg5MSwgMHg0MiwgCisweGIxLCAweGQwLCAweDAxLCAweDIzLCAweDU4LCAweDQwLCAweGI4LCAweDYwLCAweDgwLCAweDAwLCAweGMwLCAweDE5LCAKKzB4YzAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4YjgsIDB4NjIsIDB4ZjgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIAorMHgwMSwgMHgzOCwgMHhmOCwgMHg2MCwgMHgzOCwgMHg2OSwgMHgwMCwgMHgyOCwgMHhhMSwgMHhkMCwgMHgwMSwgMHgzOCwgCisweDM4LCAweDYxLCAweDllLCAweGU3LCAweDY4LCAweDE5LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4ZjcsIDB4YjUsIDB4OTAsIDB4YjAsIDB4MDQsIDB4MWMsIDB4MGQsIDB4MWMsIDB4MDAsIDB4MjAsIDB4MDUsIDB4OTAsIAorMHgwMiwgMHg5MCwgMHgwMCwgMHgyMiwgMHgwMSwgMHg5MiwgMHhmOSwgMHg0OCwgMHhjMCwgMHg2YSwgMHhjMCwgMHg0NiwgCisweGE4LCAweDYxLCAweGEwLCAweDY4LCAweDgxLCAweDAwLCAweDA5LCAweDE5LCAweDQ5LCAweDZiLCAweGMwLCAweDQ2LCAKKzB4MjAsIDB4NjAsIDB4ZTEsIDB4NjIsIDB4MTIsIDB4OWEsIDB4ZDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YTgsIDB4NjAsIAorMHgxMiwgMHg5YSwgMHg1MSwgMHg3OCwgMHhjMCwgMHg0NiwgMHgwYywgMHg5MSwgMHhmMCwgMHg0OCwgMHhjMCwgMHg0NiwgCisweDAzLCAweDkwLCAweGQ3LCAweDFkLCAweDA5LCAweDM3LCAweGUwLCAweDZhLCAKKzB4YzEsIDB4MWIsIDB4MDksIDB4MDksIDB4ZTMsIDB4MWQsIDB4MTksIDB4MzMsIDB4MGMsIDB4OWEsIDB4YzAsIDB4NDYsIAorMHgwZiwgMHg5MywgMHhlYiwgMHg0YiwgMHhjMCwgMHg0NiwgMHgwZSwgMHg5MywgMHg5MSwgMHg0MiwgMHgwMSwgMHhkMywgCisweGI4LCAweDQyLCAweDIxLCAweGQ4LCAweGUxLCAweDY4LCAweDAyLCAweDI5LCAweDFlLCAweGQyLCAweDAxLCAweDIwLCAKKzB4MGYsIDB4OTksIDB4YzAsIDB4NDYsIDB4NDgsIDB4NzEsIDB4MDAsIDB4MjAsIDB4MDMsIDB4OTksIDB4MDEsIDB4ZjAsIAorMHg1NywgMHhmYiwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMSwgMHgwZSwgMHg5YiwgMHhkOCwgMHg2YiwgMHgwMSwgMHgzMCwgCisweGQ4LCAweDYzLCAweDAxLCAweDIwLCAweDgwLCAweDA2LCAweDAwLCAweDI3LCAweDY4LCAweDYwLCAweGFmLCAweDYxLCAKKzB4ZGQsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4ZGQsIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIAorMHhkYywgMHg0YiwgMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHgzYSwgMHhmYiwgMHgzOCwgMHgxYywgMHg1YywgMHhlMywgCisweGI4LCAweDQyLCAweDAzLCAweGQ4LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDdiLCAweGZjLCAweDA3LCAweDFjLCAKKzB4ZDcsIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4NjQsIDB4ZDAsIDB4MzgsIDB4NzgsIDB4NDAsIDB4MDcsIAorMHg0MCwgMHgwZiwgMHgwMywgMHgyOCwgMHg2MCwgMHhkMSwgMHgwNSwgMHg5OCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgCisweDAwLCAweDBlLCAweDA1LCAweDkwLCAweDM4LCAweDc4LCAweGYwLCAweDIzLCAweDE4LCAweDQwLCAweDU4LCAweGQxLCAKKzB4ZTAsIDB4NmEsIDB4YzAsIDB4MWIsIDB4MDAsIDB4MDksIDB4MGMsIDB4OTksIDB4ODgsIDB4NDIsIDB4MDIsIDB4ZDIsIAorMHhlMCwgMHg2OCwgMHgwMiwgMHgyOCwgMHgwNSwgMHhkMywgMHhjYiwgMHg0OSwgMHg4OCwgMHg2OCwgMHgwMCwgMHhmMCwgCisweDgzLCAweGZmLCAweDA2LCAweDFjLCAweDA2LCAweGQxLCAweDAzLCAweDliLCAweDI4LCAweDFjLCAweDM5LCAweDFjLCAKKzB4MjIsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4OGIsIDB4ZmMsIDB4MTYsIDB4ZTEsIDB4MmUsIDB4NjIsIDB4ZjgsIDB4NjgsIAorMHgwMCwgMHgyOCwgMHgwZCwgMHhkMCwgMHhiOCwgMHg4OSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHhjMSwgMHg0OSwgCisweGM5LCAweDY4LCAweDAwLCAweGYwLCAweDcwLCAweGZmLCAweGY4LCAweDg5LCAweDAwLCAweDI4LCAweDAzLCAweGQwLCAKKzB4YmQsIDB4NDksIDB4YzksIDB4NjgsIDB4MDAsIDB4ZjAsIDB4NjksIDB4ZmYsIDB4N2EsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg3MiwgMHg2MSwgMHhiOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhiMSwgMHg2MSwgMHgzMCwgMHgxYywgMHhiOCwgMHg0OSwgCisweDA5LCAweDY4LCAweDAwLCAweGYwLCAweDVlLCAweGZmLCAweDAwLCAweDI4LCAweDE3LCAweGQxLCAweDMwLCAweDFjLCAKKzB4YjQsIDB4NDksIDB4NDksIDB4NjgsIDB4MDAsIDB4ZjAsIDB4NTcsIDB4ZmYsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIAorMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgyNywgMHhmYywgMHgwNywgMHgxYywgCisweDY4LCAweDY4LCAweGFmLCAweDRiLCAweDE4LCAweDQzLCAweDY4LCAweDYwLCAweDAwLCAweDIwLCAweGE4LCAweDYxLCAKKzB4YWMsIDB4MjMsIDB4YTgsIDB4NjgsIDB4OTgsIDB4NDMsIDB4YTgsIDB4NjAsIDB4YjAsIDB4ZTAsIDB4YTgsIDB4NjksIAorMHhhOCwgMHgyOCwgMHgwMSwgMHhkMiwgMHhhOCwgMHgyMCwgMHhhOCwgMHg2MSwgMHgxMCwgMHgzNywgMHhlMCwgMHg2YSwgCisweGI4LCAweDQyLCAweDZjLCAweGQ4LCAweDljLCAweGUwLCAweGE1LCAweGUwLCAweGE0LCAweGUwLCAweDEwLCAweDI4LCAKKzB4NjgsIDB4ZDEsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4NjgsIDB4NjgsIDB4MTgsIDB4NDAsIDB4MDEsIDB4MGYsIAorMHg0OCwgMHgwMSwgMHg0MCwgMHgxYSwgMHg4MCwgMHgwMCwgMHhhMCwgMHg0YSwgMHg4MiwgMHgxOCwgMHgwMSwgMHg5MiwgCisweDc4LCAweDg4LCAweDQyLCAweDBiLCAweDMxLCAweGQzLCAweDgyLCAweDBiLCAweDJmLCAweGQzLCAweDlkLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIDB4MDIsIDB4MjAsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4MTAsIDB4ODAsIAorMHg3OCwgMHg4OCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwZCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MCwgCisweGI4LCAweDY4LCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDkwLCAweDYwLCAweDc4LCAweDY4LCAweDAxLCAweDlhLCAKKzB4YzAsIDB4NDYsIDB4MTAsIDB4NjIsIDB4MDAsIDB4MjAsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NjQsIAorMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MywgMHg4OCwgMHgwMiwgMHg4ZiwgMHg0OSwgMHg0MCwgMHgxOCwgCisweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDUwLCAweDYzLCAweDAxLCAweDlhLCAweDUwLCAweDY4LCAweDM2LCAweDMwLCAKKzB4OTQsIDB4MjgsIDB4MDEsIDB4ZDgsIDB4MzgsIDB4MjAsIDB4MDAsIDB4ZTAsIDB4OTQsIDB4MjAsIDB4YTgsIDB4NjEsIAorMHgxMCwgMHgzNywgMHhlMCwgMHg2YSwgMHhiOCwgMHg0MiwgMHgyOCwgMHhkOCwgMHg1OCwgMHhlMCwgMHg3YSwgMHg4OCwgCisweDkyLCAweDBiLCAweDAzLCAweGQzLCAweDg1LCAweDQ4LCAweGMwLCAweDQ2LCAweDAzLCAweDkwLCAweDIzLCAweGUwLCAKKzB4MDEsIDB4MjIsIDB4MTIsIDB4MDMsIDB4MDIsIDB4NDAsIDB4ODMsIDB4NGIsIDB4MWQsIDB4ZDAsIDB4MDMsIDB4OTMsIAorMHgwMCwgMHgwNSwgMHgwMCwgMHgwZCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MCwgMHhiOCwgMHg2OCwgCisweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDkwLCAweDYwLCAweDc4LCAweDY4LCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4MTAsIDB4NjIsIDB4MDAsIDB4MjAsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIAorMHg5MCwgMHg2NCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MywgMHg4OCwgMHgwMiwgMHg3NSwgMHg0OSwgCisweDQwLCAweDE4LCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDUwLCAweDYzLCAweDAyLCAweGUwLCAweDMzLCAweGUwLCAKKzB4MmEsIDB4ZTAsIDB4MDMsIDB4OTMsIDB4MDEsIDB4MjAsIDB4MGYsIDB4OTksIDB4YzAsIDB4NDYsIDB4NDgsIDB4NzEsIAorMHgxMiwgMHg5YSwgMHg1MCwgMHg3OCwgMHgwNSwgMHg5OSwgMHg0MywgMHgxYSwgMHgwYiwgMHg5MywgMHgxMCwgMHgzNywgCisweGUwLCAweDZhLCAweGI4LCAweDQyLCAweDAzLCAweGQ4LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDkyLCAweGZiLCAKKzB4MDcsIDB4MWMsIDB4MDEsIDB4OWEsIDB4NTAsIDB4NmIsIDB4OTEsIDB4NmIsIDB4MDksIDB4MDEsIDB4NDAsIDB4MTgsIAorMHgwYiwgMHg5YiwgMHgyMSwgMHgxYywgMHgzYSwgMHgxYywgMHhmZiwgMHhmNywgMHg3ZCwgMHhmYiwgMHgwMSwgMHg5YSwgCisweGMwLCAweDQ2LCAweGQwLCAweDY0LCAweDAxLCAweDlhLCAweDBiLCAweDliLCAweGMwLCAweDQ2LCAweDEzLCAweDY1LCAKKzB4MDEsIDB4MjMsIDB4NWIsIDB4MDYsIDB4NjgsIDB4NjgsIDB4MTgsIDB4NDMsIDB4NjgsIDB4NjAsIDB4MDAsIDB4MjAsIAorMHhhOCwgMHg2MSwgMHgwZCwgMHhlMCwgMHgxMCwgMHgzNywgMHhlMCwgMHg2YSwgMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgCisweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDcxLCAweGZiLCAweDA3LCAweDFjLCAweDM4LCAweDc4LCAweDQwLCAweDA3LCAKKzB4NDAsIDB4MGYsIDB4MDMsIDB4MjgsIDB4MDAsIDB4ZDEsIDB4ZjgsIDB4ZTYsIDB4YTgsIDB4NjksIDB4MDMsIDB4OTksIAorMHgwMSwgMHhmMCwgMHgyNiwgMHhmYSwgMHgwMCwgMHgyOCwgMHgyYSwgMHhkMSwgMHgzOCwgMHgxYywgMHgyMSwgMHgxYywgCisweDAwLCAweGYwLCAweDc5LCAweGZiLCAweGE4LCAweDY4LCAweDgwLCAweDA5LCAweDA0LCAweGQzLCAweDMwLCAweDFjLCAKKzB4NDksIDB4NDksIDB4NDksIDB4NjgsIDB4MDAsIDB4ZjAsIDB4ODEsIDB4ZmUsIDB4NDEsIDB4NDksIDB4MDAsIDB4MjAsIAorMHgwMSwgMHhmMCwgMHgxNCwgMHhmYSwgMHgwMCwgMHgyOCwgMHgwNCwgMHhkMSwgMHgwZSwgMHg5YiwgMHhkOCwgMHg2YiwgCisweDAxLCAweDMwLCAweGQ4LCAweDYzLCAweDExLCAweGUwLCAweDAxLCAweDIwLCAweDBmLCAweDk5LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NzEsIDB4ODAsIDB4MDYsIDB4MDAsIDB4MjcsIDB4NjgsIDB4NjAsIDB4YWYsIDB4NjEsIDB4M2EsIDB4NGEsIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgzOSwgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgzOSwgMHg0YiwgCisweDAwLCAweDIwLCAweDAxLCAweGYwLCAweGYzLCAweGY5LCAweDAwLCAweDIwLCAweDE1LCAweGUyLCAweDA1LCAweDk4LCAKKzB4MGMsIDB4OTksIDB4MDgsIDB4MWEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MGMsIDB4OTAsIDB4MGIsIDB4OTAsIAorMHgwYywgMHg5OCwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHgwMSwgMHgyMCwgMHgwZiwgMHg5OSwgMHhjMCwgMHg0NiwgCisweDQ4LCAweDcxLCAweDI4LCAweDY4LCAweGMwLCAweDQ2LCAweDA0LCAweDkwLCAweDAwLCAweDI2LCAweDAwLCAweDIwLCAKKzB4MDgsIDB4OTAsIDB4MDAsIDB4MjIsIDB4MGEsIDB4OTIsIDB4MGMsIDB4OTgsIDB4MDEsIDB4MzgsIDB4MGQsIDB4OTAsIAorMHhhMywgMHhlMCwgMHg3OCwgMHg4OCwgMHg4YSwgMHgxYiwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgMHg5MCwgMHg0MiwgCisweDA1LCAweGRkLCAweDA3LCAweDkyLCAweDgwLCAweDFhLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDA4LCAweDkwLCAKKzB4MDAsIDB4ZTAsIDB4MDcsIDB4OTAsIDB4MDgsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MDcsIDB4ZDEsIDB4MGQsIDB4OTgsIAorMHgwYSwgMHg5YSwgMHg5MCwgMHg0MiwgMHgwNywgMHhkZCwgMHgwNywgMHg5OCwgMHgzMCwgMHgxOCwgMHg4OCwgMHg0MiwgCisweDAzLCAweGQ4LCAweDAxLCAweDIwLCAweDQwLCAweDA1LCAweDA2LCAweDkwLCAweDFjLCAweGUwLCAweDExLCAweDIwLCAKKzB4NDAsIDB4MDUsIDB4MDYsIDB4OTAsIDB4YTgsIDB4NjgsIDB4OGMsIDB4MjMsIDB4MTgsIDB4NDAsIDB4MDIsIDB4ZDEsIAorMHgyMCwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwNiwgMHg5MCwgMHhiMSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwZiwgMHhkMCwgCisweDA3LCAweDk4LCAweGMwLCAweDA2LCAweGMwLCAweDBlLCAweDA4LCAweGQwLCAweDFlLCAweDI4LCAweDA5LCAweGRiLCAKKzB4MWUsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4MDMsIDB4MjksIDB4MDUsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDIsIDB4MjksIAorMHgwMiwgMHhkMywgMHgwMSwgMHgyMCwgMHgwMiwgMHg5MCwgMHhkZSwgMHhlNywgMHgwYSwgMHg5YSwgMHgwMCwgMHgyYSwgCisweDA0LCAweGQxLCAweDAxLCAweDIzLCAweGRiLCAweDA1LCAweDA2LCAweDk4LCAweDE4LCAweDQzLCAweDA2LCAweDkwLCAKKzB4MDcsIDB4OTgsIDB4MDYsIDB4OTksIDB4MDgsIDB4NDMsIDB4MDIsIDB4MWMsIDB4MDAsIDB4OTAsIDB4MDQsIDB4OTgsIAorMHg4MywgMHgxOSwgMHgxZCwgMHhlMCwgMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMSwgMHg0OSwgMHhmZiwgMHhmZiwgCisweDI4LCAweDBmLCAweDAwLCAweDgwLCAweDA0LCAweDAwLCAweDEyLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIDB4NjgsIDB4MTksIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDQsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgMHg1NSwgMHgzMiwgMHhmZiwgMHhmZiwgCisweGFjLCAweDVlLCAweDIxLCAweDQwLCAweDBkLCAweDNkLCAweGZmLCAweGZmLCAweGNkLCAweDMxLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MzIsIDB4MDIsIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIDB4MDYsIDB4Y2EsIDB4MDEsIDB4ZjAsIAorMHg2YiwgMHhmOSwgMHgwNywgMHg5OCwgMHgzNiwgMHgxOCwgMHgwMiwgMHg5OCwgCisweDAwLCAweDI4LCAweDE2LCAweGQwLCAweGE4LCAweDY4LCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDA0LCAweGQxLCAKKzB4MDksIDB4MjMsIDB4NWIsIDB4MDQsIDB4MDYsIDB4OTgsIDB4MTgsIDB4NDMsIDB4MDYsIDB4OTAsIDB4MDYsIDB4OTgsIAorMHhjMiwgMHg0YSwgMHgwMiwgMHg0MywgMHgwMCwgMHg5MiwgMHgwNCwgMHg5OCwgMHg4MywgMHgxOSwgMHhjMSwgMHg0OCwgCisweDAxLCAweDZkLCAweDQyLCAweDZkLCAweDAwLCAweDIwLCAweDAxLCAweGYwLCAweDUxLCAweGY5LCAweDAwLCAweDIwLCAKKzB4MDIsIDB4OTAsIDB4MDgsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MGIsIDB4ZDEsIDB4MGIsIDB4OWIsIDB4MDEsIDB4M2IsIAorMHgwYiwgMHg5MywgMHgxMCwgMHgzNywgMHhlMCwgMHg2YSwgMHhiOCwgMHg0MiwgMHgwYywgMHhkOCwgMHgyMCwgMHgxYywgCisweDAwLCAweGYwLCAweDhhLCAweGZhLCAweDA3LCAweDFjLCAweDA3LCAweGUwLCAweDc4LCAweDY4LCAweDA3LCAweDlhLCAKKzB4ODAsIDB4MTgsIDB4NzgsIDB4NjAsIDB4NzgsIDB4ODgsIDB4MDcsIDB4OWEsIDB4ODAsIDB4MWEsIDB4NzgsIDB4ODAsIAorMHgwYSwgMHg5YSwgMHg1MCwgMHgxYywgMHgwMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgwYSwgMHg5MiwgMHgwYywgMHg5OCwgCisweDBhLCAweDlhLCAweDgyLCAweDQyLCAweDAzLCAweGRhLCAweGE5LCAweDY5LCAweGIxLCAweDQyLCAweDAwLCAweGQ5LCAKKzB4NTMsIDB4ZTcsIDB4YTgsIDB4NjksIDB4YjAsIDB4NDIsIDB4NmIsIDB4ZDEsIDB4YTgsIDB4NjgsIDB4MDEsIDB4MDksIAorMHg2OSwgMHhkMiwgMHgwOCwgMHg5YSwgMHgwMCwgMHgyYSwgMHg1NiwgMHhkMCwgMHgwYywgMHg5OSwgMHgwYSwgMHg5YSwgCisweDhhLCAweDQyLCAweDNlLCAweGRiLCAweGIxLCAweDA3LCAweDg5LCAweDBmLCAweDBjLCAweGQwLCAweDA4LCAweDlhLCAKKzB4ZDIsIDB4MDYsIDB4ZDIsIDB4MGUsIDB4MGIsIDB4ZDAsIDB4MWUsIDB4MmEsIDB4MDYsIDB4ZGIsIDB4MWUsIDB4MmEsIAorMHgwMiwgMHhkMSwgMHgwMywgMHgyOSwgMHgwNSwgMHhkMCwgMHgwMSwgMHhlMCwgMHgwMiwgMHgyOSwgMHgwMiwgMHhkMiwgCisweDAyLCAweDk5LCAweDAwLCAweDI5LCAweDIxLCAweGQwLCAweDA4LCAweDlhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAKKzB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIDB4MDYsIDB4Y2EsIDB4MDEsIDB4ZjAsIAorMHgwMSwgMHhmOSwgMHgwOCwgMHg5OCwgMHgzNiwgMHgxOCwgMHhhOCwgMHg2OCwgMHg4YywgMHgyMywgMHgxOCwgMHg0MCwgCisweDAyLCAweGQwLCAweDAxLCAweDIwLCAweDQwLCAweDA2LCAweDAwLCAweGUwLCAweDkyLCAweDQ4LCAweDAxLCAweDIyLCAKKzB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4OGUsIDB4NDgsIDB4MDEsIDB4NmQsIAorMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHhlYywgMHhmOCwgMHgwMCwgMHgyMCwgMHgwMiwgMHg5MCwgCisweDE1LCAweGUwLCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDAyLCAweGQwLCAweDAxLCAweDIwLCAweDQwLCAweDA2LCAKKzB4MDAsIDB4ZTAsIDB4ODgsIDB4NDgsIDB4MDgsIDB4OWEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4ZTAsIDB4MDgsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwNCwgMHg5OCwgMHg4MywgMHgxOSwgMHgwMCwgMHgyMCwgMHgzYSwgMHgxZCwgCisweDA2LCAweGNhLCAweDAxLCAweGYwLCAweGQ1LCAweGY4LCAweDA4LCAweDk4LCAweDM2LCAweDE4LCAweDEwLCAweDM3LCAKKzB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MDMsIDB4ZDgsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MTQsIDB4ZmEsIAorMHgwNywgMHgxYywgMHg2OCwgMHg2OCwgMHg4MCwgMHgwZSwgMHg2YiwgMHhkMiwgMHgwYSwgMHg5OCwgMHhjMCwgMHg0NiwgCisweDA5LCAweDkwLCAweDBjLCAweDk5LCAweDg4LCAweDQyLCAweDVjLCAweGRhLCAweDBkLCAweDk4LCAweDA5LCAweDk5LCAKKzB4ODgsIDB4NDIsIDB4MDMsIDB4ZDAsIDB4N2EsIDB4ODgsIDB4MWUsIDB4ZTAsIDB4NWYsIDB4ZTAsIDB4NWUsIDB4ZTAsIAorMHg3OCwgMHg4OCwgMHgwMSwgMHgyMiwgMHg1MiwgMHgwNiwgMHgwMiwgMHg0MywgMHhhOSwgMHg2OCwgMHg4YywgMHgyMywgCisweDE5LCAweDQwLCAweDAyLCAweGQxLCAweDA5LCAweDIzLCAweDViLCAweDA0LCAweDFhLCAweDQzLCAweGIxLCAweDA3LCAKKzB4ODksIDB4MGYsIDB4MGUsIDB4ZDAsIDB4YzMsIDB4MDYsIDB4ZGIsIDB4MGUsIDB4MDgsIDB4ZDAsIDB4MWUsIDB4MmIsIAorMHgwOSwgMHhkYiwgMHgxZSwgMHgyYiwgMHgwMiwgMHhkMSwgMHgwMywgMHgyOSwgMHgwNSwgMHhkMSwgMHgwMSwgMHhlMCwgCisweDAyLCAweDI5LCAweDAyLCAweGQzLCAweDAxLCAweDIxLCAweDAyLCAweDkxLCAweDAyLCAweDFjLCAweDA5LCAweDk4LCAKKzB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDUsIDB4MWEsIDB4NDMsIDB4MDAsIDB4OTIsIAorMHgwNCwgMHg5OCwgMHg4MywgMHgxOSwgMHgwMCwgMHgyMCwgMHgzYSwgMHgxZCwgMHgwNiwgMHhjYSwgMHgwMSwgMHhmMCwgCisweDhmLCAweGY4LCAweDc4LCAweDg4LCAweDg2LCAweDE5LCAweDEwLCAweDM3LCAweDAyLCAweDk4LCAweDAwLCAweDI4LCAKKzB4MTQsIDB4ZDAsIDB4YTgsIDB4NjgsIDB4OGMsIDB4MjMsIDB4MTgsIDB4NDAsIDB4MDIsIDB4ZDAsIDB4MDEsIDB4MjAsIAorMHg0MCwgMHgwNiwgMHgwMCwgMHhlMCwgMHg1NywgMHg0OCwgMHgwMSwgMHgyMiwgMHgwMiwgMHg0MywgMHgwMCwgMHg5MiwgCisweDA0LCAweDk4LCAweDgzLCAweDE5LCAweDUzLCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAweDAwLCAweDIwLCAKKzB4MDEsIDB4ZjAsIDB4NzYsIDB4ZjgsIDB4MDAsIDB4MjAsIDB4MDIsIDB4OTAsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIAorMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHhiNiwgMHhmOSwgMHgwNywgMHgxYywgMHgwOSwgMHg5OCwgCisweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDA5LCAweDkwLCAKKzB4MGMsIDB4OTksIDB4ODgsIDB4NDIsIDB4YTIsIDB4ZGIsIDB4NjgsIDB4NjgsIDB4MzAsIDB4NDMsIDB4MDEsIDB4MDQsIAorMHgwOSwgMHgwYywgMHg2OCwgMHg2MCwgMHhlOCwgMHg2YSwgMHgwMCwgMHhmMCwgMHg3YiwgMHhmYSwgMHgyOCwgMHhlMCwgCisweDI3LCAweGUwLCAweGE4LCAweDY4LCAweDAwLCAweDA5LCAweDE0LCAweGQzLCAweDY4LCAweDY4LCAweDgwLCAweDBlLCAKKzB4MTUsIDB4ZDIsIDB4MDEsIDB4OWEsIDB4MDAsIDB4MmEsIDB4MTIsIDB4ZDAsIDB4MDEsIDB4OWEsIDB4NTAsIDB4NmIsIAorMHgwYiwgMHg5YiwgMHgyMSwgMHgxYywgMHgzYSwgMHgxYywgMHhmZiwgMHhmNywgMHg4OSwgMHhmOSwgMHgwMSwgMHg5YSwgCisweGMwLCAweDQ2LCAweDkwLCAweDY0LCAweDAxLCAweDlhLCAweDBiLCAweDliLCAweGMwLCAweDQ2LCAweDkzLCAweDYzLCAKKzB4MDMsIDB4ZTAsIDB4ZTgsIDB4NmEsIDB4MzEsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NWQsIDB4ZmEsIDB4NjgsIDB4NjgsIAorMHgzMCwgMHg0MywgMHg2OCwgMHg2MCwgMHhhOCwgMHg2OSwgMHhiMCwgMHg0MiwgMHgwNSwgMHhkOSwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDgwLCAweDFiLCAweDAwLCAweGYwLCAweGVlLCAweGY5LCAweGFlLCAweDYxLCAweGE4LCAweDY4LCAKKzB4OGMsIDB4MjMsIDB4MTgsIDB4NDAsIDB4MGIsIDB4ZDAsIDB4MmYsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIAorMHgwNCwgMHg5OCwgMHhjMywgMHgxZiwgMHgwNSwgMHgzYiwgMHgyYSwgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgCisweDAwLCAweDIwLCAweDAxLCAweGYwLCAweDIzLCAweGY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDIwLCAweDZkLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjEsIDB4ZTEsIDB4NjksIDB4ODEsIDB4NDIsIAorMHgxMiwgMHhkMCwgMHgyMiwgMHg2OSwgMHgwMiwgMHgyYSwgMHgwZiwgMHhkMiwgMHg0MSwgMHgxYSwgMHgwMSwgMHhkNSwgCisweDYwLCAweDZkLCAweDQxLCAweDE4LCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDNmLCAweGZiLCAweGUxLCAweDY5LCAKKzB4NDAsIDB4MTgsIDB4ZTAsIDB4NjEsIDB4NjEsIDB4NmQsIDB4ODgsIDB4NDIsIDB4MjQsIDB4ZDMsIDB4NDAsIDB4MWEsIAorMHhlMCwgMHg2MSwgMHgyMSwgMHhlMCwgMHg4MSwgMHg0MiwgMHgxZiwgMHhkMSwgMHgyMCwgMHg2OSwgMHgwMiwgMHgyOCwgCisweDFjLCAweGQyLCAweDAxLCAweDIwLCAweDYwLCAweDYxLCAweDE4LCAweDQ4LCAweDQxLCAweDY5LCAweGUyLCAweDZjLCAKKzB4MGEsIDB4NDMsIDB4NDIsIDB4NjEsIDB4ODEsIDB4NjksIDB4ZTMsIDB4NmMsIDB4OTksIDB4NDMsIDB4ODEsIDB4NjEsIAorMHgwMSwgMHgyMSwgMHgwOSwgMHgwNSwgMHhjYSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MSwgCisweDhiLCAweDAyLCAweDIwLCAweDZkLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAweGEwLCAweDYxLCAKKzB4ZTEsIDB4NjksIDB4ODEsIDB4NDIsIDB4MDIsIDB4ZDAsIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4Y2MsIDB4ZmEsIAorMHgyOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwZiwgMHhmOSwgMHgwYywgMHg5OCwgMHgwNSwgMHg5OSwgMHg0MCwgMHgxOCwgCisweDAwLCAweDAxLCAweDEwLCAweDMwLCAweDY4LCAweDYxLCAweDEzLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgxMiwgMHgwMiwgMHgwNCwgMHgwMCwgMHg1MiwgMHgwMiwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDQwLCAweDIwLCAweDJkLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweGYwLCAKKzB4MDMsIDB4ZjksIDB4MDcsIDB4MWMsIDB4ODEsIDB4NjksIDB4NDQsIDB4NmEsIDB4YTAsIDB4NmYsIDB4MDAsIDB4ZjAsIAorMHg0NSwgMHhmZSwgMHgwMCwgMHgyMCwgMHhlMSwgMHgxZCwgMHgxOSwgMHgzMSwgMHg0OCwgMHg3MSwgMHg3OSwgMHg2OCwgCisweGM5LCAweDBlLCAweDA5LCAweGQzLCAweGY4LCAweDZhLCAweDAwLCAweDAxLCAweDI0LCAweDQ5LCAweDQwLCAweDE4LCAKKzB4MjQsIDB4NGIsIDB4YzAsIDB4MTgsIDB4MDEsIDB4NjgsIDB4MDEsIDB4MzksIDB4MDEsIDB4NjAsIDB4MzYsIDB4ZTAsIAorMHhlMSwgMHg2ZCwgMHgwOSwgMHg2OCwgMHgyMiwgMHg2ZSwgMHhjMCwgMHg0NiwgMHgxMSwgMHg2MCwgMHgyMCwgMHg0ZSwgCisweGY1LCAweDFkLCAweDc5LCAweDM1LCAweDAxLCAweDIzLCAweGU5LCAweDZiLCAweDE5LCAweDQzLCAweGU5LCAweDYzLCAKKzB4YjksIDB4NmEsIDB4ZTIsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4YjksIDB4NmEsIDB4MjIsIDB4NmUsIAorMHhjMCwgMHg0NiwgMHgxMSwgMHg2MCwgMHg2MSwgMHg2OSwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMSwgMHhhOSwgMHg2YiwgCisweDAxLCAweDMxLCAweGE5LCAweDYzLCAweDA4LCAweDI5LCAweDA3LCAweGQzLCAweGE4LCAweDYzLCAweDAxLCAweDIwLCAKKzB4MDAsIDB4ZjAsIDB4ODYsIDB4ZjgsIDB4ZTgsIDB4NmIsIDB4NDAsIDB4MDgsIDB4NDAsIDB4MDAsIDB4ZTgsIDB4NjMsIAorMHg3OCwgMHg2OCwgMHg4MSwgMHgwZSwgMHgwZiwgMHhkMiwgMHgwYiwgMHgyMywgMHgxYiwgMHgwMiwgMHhmMSwgMHgxOCwgCisweGM5LCAweDY4LCAweDAwLCAweDI5LCAweDA2LCAweGQwLCAweDAwLCAweDA4LCAweDA0LCAweGQyLCAweDIwLCAweDFjLCAKKzB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NDMsIDB4ZjgsIDB4MDIsIDB4ZTAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgwNSwgMHhmYSwgMHgzOCwgMHgxYywgMHhmYiwgMHhmNywgMHgwNiwgMHhmYywgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDBiLCAweGY4LCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIDB4YjQsIDB4MGMsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhmOCwgMHgxZCwgMHgxOSwgMHgzMCwgCisweDAxLCAweDc5LCAweDAwLCAweDI5LCAweDA0LCAweGQwLCAweDAwLCAweDIxLCAweDAxLCAweDcxLCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4NTYsIDB4ZmIsIDB4ZjgsIDB4NjgsIDB4MDIsIDB4MjgsIDB4MGQsIDB4ZDAsIDB4YjgsIDB4NjgsIAorMHg4MCwgMHgwMCwgMHhjMiwgMHgxOSwgMHg1MCwgMHg2YywgMHgwMCwgMHgyOCwgMHgxMSwgMHhkMCwgMHhiOCwgMHg2YSwgCisweDQxLCAweDc4LCAweDA5LCAweDAxLCAweDEwLCAweDMxLCAweDUyLCAweDZiLCAweDEwLCAweDFhLCAweDg4LCAweDQyLCAKKzB4MDUsIDB4ZDMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NDIsIDB4ZmIsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHgyOCwgMHhmYSwgMHhmOCwgMHhlNywgMHg3OCwgMHg2OCwgCisweDgwLCAweDAwLCAweGMwLCAweDE5LCAweGMwLCAweDZiLCAweGMwLCAweDQ2LCAweGI4LCAweDYyLCAweGYxLCAweGU3LCAKKzB4YjAsIDB4YjUsIDB4ODcsIDB4YjAsIDB4MGYsIDB4MWMsIDB4ODAsIDB4NmYsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTAsIAorMHgwMCwgMHgyNCwgMHgxMywgMHg0ZCwgMHgwYiwgMHgyMywgMHgxYiwgMHgwMiwgMHhlOCwgMHgxOCwgMHg4MCwgMHg2OSwgCisweDAwLCAweDI4LCAweDE3LCAweGQwLCAweDY5LCAweDQ2LCAweGEyLCAweDAwLCAweDUyLCAweDE5LCAweDBiLCAweDIzLCAKKzB4MWIsIDB4MDIsIDB4ZDIsIDB4MTgsIDB4OTIsIDB4NjksIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4OTIsIDB4ZmIsIAorMHgwMCwgMHgyOCwgMHgwOSwgMHhkMSwgMHgwMSwgMHgzNCwgMHhhMCwgMHgwMCwgMHg0MCwgMHgxOSwgMHgwYiwgMHgyMywgCisweDFiLCAweDAyLCAweGMwLCAweDE4LCAweDgwLCAweDY5LCAweDAwLCAweDI4LCAweGVhLCAweGQxLCAweDAxLCAweGUwLCAKKzB4MDEsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4OWQsIDB4ZjksIDB4MDcsIDB4YjAsIAorMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGI4LCAweGI1LCAweGMyLCAweDA3LCAweGQyLCAweDBmLCAweDE2LCAweDRjLCAweDE2LCAweDQ5LCAweDAxLCAweGQwLCAKKzB4MDgsIDB4MjIsIDB4MDgsIDB4ZTAsIDB4ODIsIDB4MDgsIDB4MDUsIDB4ZDMsIDB4MGMsIDB4MjIsIDB4YTQsIDB4MTgsIAorMHgwYiwgMHg2OCwgMHhkZiwgMHgxZCwgMHgxNSwgMHgzNywgMHgwMywgMHhlMCwgMHgxYywgMHgyMiwgMHgwYiwgMHg2OCwgCisweGRmLCAweDFkLCAweDA5LCAweDM3LCAweDBmLCAweDRiLCAweDFkLCAweDc4LCAweDAwLCAweDJkLCAweDEzLCAweGQwLCAKKzB4NWIsIDB4NzgsIDB4MDAsIDB4MmIsIDB4MTAsIDB4ZDAsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDYsIDB4MWEsIDB4NDMsIAorMHgwMCwgMHgyOCwgMHgwMSwgMHhkMSwgMHg1YiwgMHgwOCwgMHgxYSwgMHg0MywgMHgwMCwgMHg5MiwgMHg0YSwgMHg2OCwgCisweDAxLCAweDIwLCAweDM5LCAweDFjLCAweDIzLCAweDFjLCAweDAwLCAweGYwLCAweGRmLCAweGZlLCAweGI4LCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDYsIDB4MWEsIDB4NDMsIDB4ZjEsIDB4ZTcsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHhmOCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDIxLCAweGMxLCAweDYxLCAweDA1LCAweDQ5LCAweDhhLCAweDY4LCAweDAwLCAweDJhLCAweDAxLCAweGQxLCAKKzB4ODgsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4Y2EsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZDAsIDB4NjEsIDB4YzgsIDB4NjAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwMywgMHg0OSwgMHg4OCwgMHg2OCwgCisweDAwLCAweDI4LCAweDAyLCAweGQwLCAweGMyLCAweDY5LCAweGMwLCAweDQ2LCAweDhhLCAweDYwLCAweDcwLCAweDQ3LCAKKzB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIDB4MDEsIDB4MWMsIDB4MDEsIDB4MjMsIDB4ODgsIDB4NjgsIDB4NTgsIDB4NDAsIAorMHg4OCwgMHg2MCwgMHhjYSwgMHg2OCwgMHgwMSwgMHgzYSwgMHhjYSwgMHg2MCwgMHgwYSwgMHg2OSwgMHgwMSwgMHgzYSwgCisweDgwLCAweDAwLCAweDBhLCAweDYxLCAweDQyLCAweDE4LCAweGQwLCAweDZiLCAweDUzLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4Y2IsIDB4NjIsIDB4MGIsIDB4NjgsIDB4OWIsIDB4MDAsIDB4NTksIDB4MTgsIDB4NDksIDB4NmMsIDB4NTMsIDB4NmMsIAorMHhjOSwgMHgxOCwgMHg1MSwgMHg2NCwgMHg3MCwgMHg0NywgMHg4YSwgMHg2OCwgMHg5MiwgMHgwMCwgMHg1MiwgMHgxOCwgCisweGQzLCAweDZiLCAweDgzLCAweDQyLCAweDE3LCAweGQxLCAweGQwLCAweDFkLCAweDNkLCAweDMwLCAweDBhLCAweDY4LCAKKzB4OTIsIDB4MDAsIDB4NTIsIDB4MTgsIDB4NTIsIDB4NmMsIDB4MDMsIDB4NjgsIDB4OWEsIDB4MWEsIDB4MDIsIDB4NjAsIAorMHgwMSwgMHgyMywgMHg4OCwgMHg2OCwgMHg1OCwgMHg0MCwgMHg4OCwgMHg2MCwgMHhjYSwgMHg2OCwgMHgwMSwgMHgzMiwgCisweGNhLCAweDYwLCAweDBhLCAweDY5LCAweDAxLCAweDMyLCAweDgwLCAweDAwLCAweDQwLCAweDE4LCAweDBhLCAweDYxLCAKKzB4NDAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjIsIDB4NzAsIDB4NDcsIDB4YjgsIDB4YjUsIDB4MDQsIDB4MWMsIAorMHgxZCwgMHgxYywgMHgxNywgMHgxYywgMHgwOCwgMHgxYywgMHgzOSwgMHgxYywgMHhmZiwgMHhmNywgMHhkOSwgMHhmZiwgCisweDAwLCAweDIwLCAweDI5LCAweDFjLCAweDAwLCAweGYwLCAweDdjLCAweGZlLCAweDAxLCAweDIwLCAweGY5LCAweDFkLCAKKzB4MTksIDB4MzEsIDB4NDgsIDB4NzEsIDB4ODAsIDB4MDYsIDB4NjAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4YTAsIDB4NjEsIAorMHgwNiwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwNiwgMHg0OCwgCisweDAxLCAweDZkLCAweDQyLCAweDZkLCAweDA1LCAweDRiLCAweDAwLCAweDIwLCAweDAwLCAweGYwLCAweDYyLCAweGZlLCAKKzB4YjgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTIsIDB4MDIsIAorMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgMHgwNiwgMHg0OSwgMHgwYSwgMHg2OCwgCisweDEwLCAweDE4LCAweDA4LCAweDYwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDk4LCAweDQyLCAweDAzLCAweGQ5LCAKKzB4MDMsIDB4NDksIDB4MGEsIDB4NzksIDB4MDEsIDB4MzIsIDB4MGEsIDB4NzEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHg4MCwgMHgwOCwgMHg4MCwgMHgwMCwgCisweDA2LCAweDQ5LCAweDBhLCAweDY4LCAweDEwLCAweDE4LCAweDA4LCAweDYwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAKKzB4OTgsIDB4NDIsIDB4MDMsIDB4ZDksIDB4MDMsIDB4NDksIDB4MGEsIDB4NzksIDB4MDEsIDB4MzIsIDB4MGEsIDB4NzEsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDAzLCAweDMwLCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAweDA2LCAweDQ5LCAweDBhLCAweDY4LCAweDEwLCAweDE4LCAKKzB4MDgsIDB4NjAsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4OTgsIDB4NDIsIDB4MDMsIDB4ZDksIDB4MDMsIDB4NDksIAorMHgwYSwgMHg3OSwgMHgwMSwgMHgzMiwgMHgwYSwgMHg3MSwgMHg3MCwgMHg0NywgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDAyLCAweDQ4LCAweDQxLCAweDc5LCAweDAxLCAweDMxLCAweDQxLCAweDcxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4OTAsIDB4YjQsIDB4ODIsIDB4MDAsIAorMHgxNywgMHg0YiwgMHg5YSwgMHg1OCwgMHg4YiwgMHgwNywgMHgwMiwgMHhkMCwgMHg4OSwgMHgwOCwgMHgwYiwgMHgxZCwgCisweDAxLCAweGUwLCAweDg5LCAweDA4LCAweGNiLCAweDFjLCAweDExLCAweDY5LCAweGQ3LCAweDY4LCAweDEyLCAweDRjLCAKKzB4ODAsIDB4MDAsIDB4MjAsIDB4NTgsIDB4NDAsIDB4NjgsIDB4YjksIDB4NDIsIDB4MDMsIDB4ZDEsIDB4ODEsIDB4NDIsIAorMHgxOSwgMHhkOSwgMHgxMSwgMHg2OCwgMHgxNywgMHhlMCwgMHgwMCwgMHgyNCwgMHhiOSwgMHg0MiwgMHgwOSwgMHhkOSwgCisweDgxLCAweDQyLCAweDEyLCAweGQ5LCAweDExLCAweDY4LCAweDc4LCAweDFhLCAweDAwLCAweGQ1LCAweDAzLCAweDMwLCAKKzB4ODAsIDB4MTAsIDB4OTgsIDB4NDIsIDB4MGIsIDB4ZDgsIDB4MDcsIDB4ZTAsIDB4ODEsIDB4NDIsIDB4MDUsIDB4ZDgsIAorMHg3OCwgMHgxYSwgMHgwMCwgMHhkNSwgMHgwMywgMHgzMCwgMHg4MCwgMHgxMCwgMHg5OCwgMHg0MiwgMHgwMiwgMHhkOCwgCisweDIwLCAweDFjLCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweGM4LCAweDFkLCAweDA1LCAweDMwLCAweGZhLCAweGU3LCAKKzB4NzAsIDB4MDQsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4ODAsIDB4MDAsIDB4MGYsIDB4NGEsIDB4MTcsIDB4NTgsIAorMHg4OCwgMHgwNywgMHgwMiwgMHhkMCwgMHg4OCwgMHgwOCwgMHgwNCwgMHgzMCwgMHgwMSwgMHhlMCwgMHg4OCwgMHgwOCwgCisweDAzLCAweDMwLCAweDM5LCAweDY5LCAweDdhLCAweDY4LCAweDkxLCAweDQyLCAweDA5LCAweGQ5LCAweDM5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MzksIDB4NjEsIDB4ZjksIDB4NjgsIDB4N2EsIDB4NjgsIDB4OTEsIDB4NDIsIDB4MDIsIDB4ZDksIAorMHgzOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2MCwgMHg4MSwgMHgwMCwgMHgzOCwgMHg2OSwgMHgwMCwgMHhmMCwgCisweGQxLCAweGZkLCAweDM4LCAweDYxLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4NzAsIDB4MDQsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDMsIDB4MjEsIDB4MDksIDB4MDcsIDB4MDEsIDB4NDAsIAorMHgwYywgMHgwZiwgMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMSwgMHgyMiwgMHg5MiwgMHgwNywgMHgwMiwgMHg0MCwgCisweGEzLCAweDAwLCAweDFjLCAweDRmLCAweGZmLCAweDU4LCAweDg5LCAweDA3LCAweDg5LCAweDBmLCAweDAwLCAweDA0LCAKKzB4MDAsIDB4MGMsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MjksIDB4MDAsIDB4ZDAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MmEsIAorMHgwMSwgMHhkMCwgMHgwMiwgMHgzMCwgMHgwMCwgMHhlMCwgMHgwMywgMHgzMCwgMHhmOSwgMHg2OCwgMHg3YSwgMHg2OCwgCisweDkxLCAweDQyLCAweDAyLCAweGQ5LCAweDM5LCAweDY4LCAweGMwLCAweDQ2LCAweGY5LCAweDYwLCAweDgxLCAweDAwLCAKKzB4ZjgsIDB4NjgsIDB4MDAsIDB4ZjAsIDB4YTUsIDB4ZmQsIDB4ZjgsIDB4NjAsIDB4MGYsIDB4NDgsIDB4MDAsIDB4NjksIAorMHgwMCwgMHgyOCwgMHgwNSwgMHhkMCwgMHgwMSwgMHgyMCwgMHhhMCwgMHg0MCwgMHgwMiwgMHhkMCwgMHgyMCwgMHgxYywgCisweGZlLCAweGY3LCAweGNhLCAweGZjLCAweDBiLCAweDQ5LCAweGM4LCAweDFkLCAweDE5LCAweDMwLCAweDAzLCAweDc5LCAKKzB4MDAsIDB4MjIsIDB4MDAsIDB4MmIsIDB4MDUsIDB4ZDEsIDB4MDksIDB4NDksIDB4YzgsIDB4MWQsIDB4MTksIDB4MzAsIAorMHgwMywgMHg3OSwgMHgwMCwgMHgyYiwgMHgwMywgMHhkMCwgMHgwMiwgMHg3MSwgMHgwOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDc5LCAweGY5LCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDcwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4ZDAsIDB4MmMsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4ZTQsIDB4MmMsIDB4MDAsIDB4ODAsIAorMHhiMCwgMHhiNSwgMHgyYiwgMHg0OSwgMHgwOSwgMHg3OSwgMHgwMCwgMHgyOSwgMHgwMywgMHhkMSwgMHg0MSwgMHg2OCwgCisweDI5LCAweDRiLCAweDE5LCAweDQzLCAweDQxLCAweDYwLCAweDgxLCAweDY4LCAKKzB4NDksIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MDksIDB4MjEsIDB4MDksIDB4MDQsIDB4MDEsIDB4ZTAsIDB4MGQsIDB4MjEsIAorMHgwOSwgMHgwNCwgMHgwYywgMHhjOCwgMHgwOCwgMHgzOCwgMHgxOSwgMHg0MywgMHg4NywgMHg2OCwgMHhiYiwgMHgwYSwgCisweDAzLCAweGQzLCAweDQzLCAweDY4LCAweDViLCAweDA4LCAweDAwLCAweGQzLCAweDAxLCAweDMxLCAweDQwLCAweDY4LCAKKzB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4MTgsIDB4NDAsIDB4MDcsIDB4MGYsIDB4ZjgsIDB4MDAsIDB4MWQsIDB4NGMsIAorMHgwMCwgMHgxOSwgMHgyMywgMHg2OCwgMHhjMCwgMHgxOCwgMHg1MCwgMHgzMCwgMHgwMCwgMHg3OSwgMHgwMSwgMHgyOCwgCisweDEwLCAweGQxLCAweDYwLCAweDY4LCAweDAxLCAweDI4LCAweDBkLCAweGQwLCAweDEwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4NzEsIDB4ZjgsIDB4MzgsIDB4MDEsIDB4MDAsIDB4MTksIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIAorMHg0MSwgMHg2YiwgMHgwMSwgMHgzOSwgMHg0MSwgMHg2MywgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDM4LCAweDAxLCAweDAwLCAweDE5LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAweDAzLCAweDZiLCAKKzB4NWQsIDB4MWMsIDB4MDUsIDB4NjMsIDB4YmQsIDB4MDIsIDB4MmQsIDB4MTksIDB4ZGIsIDB4MDAsIDB4ZWIsIDB4MTgsIAorMHg4MCwgMHgzMywgMHgxOSwgMHg2MywgMHhkYSwgMHg2MiwgMHg4MSwgMHg2YiwgMHgwMSwgMHgzMSwgMHg4MSwgMHg2MywgCisweDAxLCAweDIxLCAweGI5LCAweDQwLCAweDIyLCAweDY4LCAweDExLCAweDQzLCAweDIxLCAweDYwLCAweDAxLCAweDZiLCAKKzB4ODAsIDB4MjksIDB4ZTIsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4MDEsIDB4NjMsIDB4ZGYsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDFmLCAweDRlLCAweDcwLCAweDY4LCAweDAwLCAweDI4LCAweDM2LCAweGQxLCAweDAwLCAweDI0LCAKKzB4YjEsIDB4NjgsIDB4NDgsIDB4MWMsIDB4YzksIDB4MDAsIDB4ODksIDB4MTksIDB4YjAsIDB4NjAsIDB4MzIsIDB4NjgsIAorMHg4OSwgMHgxOCwgMHg2MCwgMHgzMSwgMHgwZCwgMHg3YiwgMHgwOCwgMHgyOCwgMHgwMCwgMHhkMywgMHhiNCwgMHg2MCwgCisweDI4LCAweDAxLCAweDgwLCAweDE5LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAweDg3LCAweDZiLCAKKzB4MDAsIDB4MmYsIDB4MjEsIDB4ZDAsIDB4YzEsIDB4NmEsIDB4NGIsIDB4MWMsIDB4YWEsIDB4MDIsIDB4OTIsIDB4MTksIAorMHhjOSwgMHgwMCwgMHg1MSwgMHgxOCwgMHg4MCwgMHgzMSwgMHhjMywgMHg2MiwgMHhjYSwgMHg2YSwgMHgwOSwgMHg2YiwgCisweDAxLCAweDNmLCAweDg3LCAweDYzLCAweDgwLCAweDJiLCAweDAwLCAweGQzLCAweGM0LCAweDYyLCAweDAwLCAweDJmLCAKKzB4MDYsIDB4ZDEsIDB4MDEsIDB4MjcsIDB4YWYsIDB4NDAsIDB4M2IsIDB4MWMsIDB4ZGIsIDB4NDMsIDB4MzcsIDB4NjgsIAorMHgzYiwgMHg0MCwgMHgzMywgMHg2MCwgMHg0MywgMHg2YiwgMHgwMSwgMHgzYiwgMHg0MywgMHg2MywgMHgxMCwgMHgxYywgCisweDM3LCAweDFjLCAweDAwLCAweGYwLCAweDA5LCAweGY4LCAweDc4LCAweDY4LCAweDAwLCAweDI4LCAweGM5LCAweGQwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHhjZCwgMHgwZiwgMHhlZCwgMHgwNywgMHgwMSwgMHgyNCwgMHgwMCwgMHgyNywgMHgyZSwgMHg0YiwgCisweDJlLCAweDRhLCAweDAwLCAweDJkLCAweDFkLCAweGQwLCAweGQ4LCAweDZhLCAweDAxLCAweDMwLCAweGQ4LCAweDYyLCAKKzB4MTAsIDB4MWMsIDB4NTIsIDB4NjksIDB4MDAsIDB4MmEsIDB4MTIsIDB4ZDAsIDB4MDIsIDB4NjksIDB4NTMsIDB4MWMsIAorMHg5MiwgMHgwMCwgMHgxMiwgMHgxOCwgMHgwMywgMHg2MSwgMHg5MSwgMHg2MSwgMHg0MSwgMHg2OSwgMHgwMSwgMHgzMSwgCisweDQxLCAweDYxLCAweDAyLCAweDY5LCAweDBmLCAweDJhLCAweDAwLCAweGQzLCAweDA3LCAweDYxLCAweDBmLCAweDI5LCAKKzB4MDAsIDB4ZDMsIDB4NDQsIDB4NjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhlZSwgMHhmZSwgMHhmOCwgMHhlNywgMHgxNSwgMHg2OSwgMHg2ZSwgMHgxYywgMHhhZCwgMHgwMCwgCisweGFkLCAweDE4LCAweDE2LCAweDYxLCAweGE5LCAweDYxLCAweDU1LCAweDY5LCAweDAxLCAweDM1LCAweDU1LCAweDYxLCAKKzB4MTYsIDB4NjksIDB4MGYsIDB4MmUsIDB4MDAsIDB4ZDMsIDB4MTcsIDB4NjEsIDB4MGYsIDB4MmQsIDB4MDAsIDB4ZDMsIAorMHg1NCwgMHg2MCwgMHg4YywgMHgwMiwgMHhhNCwgMHgwYSwgMHgxNiwgMHg0ZiwgMHgzYSwgMHg2ZiwgMHhmZCwgMHg2OCwgCisweGY5LCAweDFkLCAweDc5LCAweDMxLCAweDAxLCAweDJkLCAweDBjLCAweGQxLCAweGRiLCAweDZkLCAweDViLCAweDA4LCAKKzB4MDksIDB4ZDMsIDB4MGIsIDB4ODksIDB4MDAsIDB4MmIsIDB4MDYsIDB4ZDEsIDB4ZmQsIDB4NmYsIDB4MDMsIDB4M2IsIAorMHgyZSwgMHg2OCwgMHgzMywgMHg0MCwgMHgyYiwgMHg2MCwgMHgxNCwgMHgyMywgMHgwYiwgMHg4MSwgMHgxMCwgMHg2MCwgCisweDgwLCAweDA3LCAweDgwLCAweDBhLCAweDIwLCAweDQzLCAweDAzLCAweDA0LCAweDAwLCAweGQwLCAweDAxLCAweDM4LCAKKzB4NTAsIDB4NjAsIDB4MDksIDB4NmEsIDB4MDgsIDB4MzIsIDB4OTEsIDB4NDIsIDB4MDAsIDB4ZDgsIDB4MDcsIDB4NGEsIAorMHgwMCwgMHgwZCwgMHgwMiwgMHhkMywgMHg1MSwgMHgyMCwgMHg4MCwgMHgwMywgMHg4MiwgMHg2MSwgMHgzYSwgMHg2NywgCisweGJlLCAweGU3LCAweDAwLCAweDAwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIAorMHhiMCwgMHhiNSwgMHgwMCwgMHgyOCwgMHgwNCwgMHhkMSwgMHgwMSwgMHgyMCwgMHhjMCwgMHgwNSwgMHgxNiwgMHg0OSwgCisweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDE1LCAweDRjLCAweDAwLCAweDI1LCAweDY3LCAweDY5LCAweDAwLCAweDJmLCAKKzB4MTYsIDB4ZDAsIDB4ZTAsIDB4NjgsIDB4NDEsIDB4MWMsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTksIDB4ZTEsIDB4NjAsIAorMHg4MCwgMHg2OSwgMHgwMSwgMHgzZiwgMHhmZiwgMHhmNywgMHg5NCwgMHhmZSwgMHhlMCwgMHg2OCwgMHgwZiwgMHgyOCwgCisweDAwLCAweGQzLCAweGU1LCAweDYwLCAweGUwLCAweDY4LCAweDgwLCAweDAwLCAweDAwLCAweDE5LCAweDgwLCAweDY5LCAKKzB4MDAsIDB4MDgsIDB4MDEsIDB4ZDMsIDB4MDAsIDB4MmYsIDB4ZWEsIDB4ZDEsIDB4NjcsIDB4NjEsIDB4MDMsIDB4ZTAsIAorMHgwOCwgMHg0OCwgMHgwMSwgMHg2ZCwgMHgwMSwgMHgzMSwgMHgwMSwgMHg2NSwgMHg2NSwgMHg2MCwgMHgyMCwgMHg2OCwgCisweDAwLCAweDI4LCAweDAxLCAweGQwLCAweGZmLCAweGY3LCAweDI2LCAweGZmLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHhiMCwgMHhiNCwgMHgxMCwgMHgyMywgCisweDgyLCAweDY4LCAweDEzLCAweDQwLCAweDAwLCAweDIxLCAweDAwLCAweDJiLCAweDE1LCAweGQwLCAweDBjLCAweDRiLCAKKzB4MWEsIDB4NDAsIDB4MTIsIDB4MDEsIDB4ODEsIDB4MjQsIDB4MTQsIDB4NDMsIDB4MDIsIDB4NjgsIDB4MTUsIDB4NjgsIAorMHgxMywgMHgxZCwgMHg4MCwgMHhjYiwgMHgxYiwgMHg2OCwgMHgwNCwgMHgzYSwgMHgwMiwgMHg2MCwgMHgyMCwgMHhjMiwgCisweDgwLCAweGMyLCAweDA4LCAweGMyLCAweDE0LCAweDYwLCAweDQyLCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDQsIDB4MzIsIDB4MWEsIDB4NDMsIDB4NDIsIDB4NjAsIDB4MDgsIDB4MWMsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHhmMCwgMHhmZiwgMHgwZiwgMHhmMCwgMHhiNCwgMHg4MiwgMHg2OCwgMHg1MywgMHgwOSwgMHgzNCwgMHhkMywgCisweDFiLCAweDRiLCAweDFhLCAweDQwLCAweDEyLCAweDAxLCAweDgxLCAweDI2LCAweDE2LCAweDQzLCAweDAzLCAweDY4LCAKKzB4MWQsIDB4NjgsIDB4MWYsIDB4MWQsIDB4MTAsIDB4Y2YsIDB4M2YsIDB4NjgsIDB4MDQsIDB4M2IsIDB4MDMsIDB4NjAsIAorMHgyMCwgMHhjMywgMHgxMCwgMHhjMywgMHg4MCwgMHhjMywgMHgxZSwgMHg2MCwgMHg0MywgMHg2OCwgMHgxZiwgMHgxZCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDNiLCAweDQzLCAweDQzLCAweDYwLCAweGNiLCAweDZiLCAweDE4LCAweDFmLCAKKzB4YzgsIDB4NjMsIDB4ODAsIDB4Y2IsIDB4ODAsIDB4YzAsIDB4MWMsIDB4NjgsIDB4MWYsIDB4MWQsIDB4MDMsIDB4MWQsIAorMHgwNCwgMHg2MCwgMHgzOCwgMHgxYywgMHgzZiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgxZiwgMHg2MCwgMHgxZiwgMHgxZCwgCisweDQzLCAweDY4LCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDgxLCAweDIzLCAweDIzLCAweDQzLCAweDNiLCAweDYwLCAKKzB4NDAsIDB4NjgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDQsIDB4MTAsIDB4NDMsIDB4NzgsIDB4NjAsIDB4MDgsIDB4NmUsIAorMHgwNCwgMHgzMCwgMHgwOCwgMHg2NiwgMHg0OCwgMHg2ZSwgMHgwNCwgMHgzMCwgMHg0OCwgMHg2NiwgMHgwMCwgMHgyMCwgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweGYwLCAweGZmLCAweDBmLCAweDgwLCAweGI0LCAweDgxLCAweDZhLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4Y2EsIDB4MWQsIDB4MDUsIDB4MzIsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIAorMHhjZiwgMHgxZCwgMHgwMSwgMHgzNywgMHgzYiwgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhjYiwgMHg2MCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDBmLCAweDFkLCAweDNiLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4OGIsIDB4NjAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MGIsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MGMsIDB4YzEsIAorMHgwMiwgMHg2MiwgMHgwMSwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwYSwgMHg2MiwgMHgwNCwgMHgyMywgMHg4MSwgMHg2OSwgCisweDE5LCAweDQzLCAweDgxLCAweDYxLCAweDAyLCAweDZiLCAweGMwLCAweDQ2LCAweDkxLCAweDYxLCAweDgxLCAweDZhLCAKKzB4MDQsIDB4MzEsIDB4ODEsIDB4NjIsIDB4MDIsIDB4NmIsIDB4YzAsIDB4NDYsIDB4OTEsIDB4NjIsIDB4YzEsIDB4MWQsIAorMHgzOSwgMHgzMSwgMHg0YSwgMHg4YiwgMHgwNCwgMHgzYSwgMHg0YSwgMHg4MywgMHg0OSwgMHg4YiwgMHgwMiwgMHg2YiwgCisweDQwLCAweDMyLCAweDUxLCAweDgzLCAweGMxLCAweDg5LCAweDA0LCAweDM5LCAweGMxLCAweDgxLCAweGMxLCAweDY4LCAKKzB4MDAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzEsIDB4NjAsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHg0NywgMHgwOCwgMHg0NywgMHgxMCwgMHg0NywgMHgxOCwgMHg0NywgMHgyMCwgMHg0NywgMHgyOCwgMHg0NywgCisweDMwLCAweDQ3LCAweDM4LCAweDQ3LCAweDMwLCAweDQwLCAweDJkLCAweGU5LCAweDBjLCAweGMwLCAweDlkLCAweGU1LCAKKzB4MGMsIDB4NDgsIDB4YTAsIDB4ZTEsIDB4MjQsIDB4NDgsIDB4YjAsIDB4ZTEsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgwMSwgMHhjMCwgMHg0YywgMHhlMiwgMHgxOCwgMHg0MCwgMHhhMCwgMHhlMywgMHg2NCwgMHg1MSwgMHg5ZiwgMHhlNSwgCisweDk0LCAweDUwLCAweDIwLCAweGUwLCAweDAwLCAweDUwLCAweDkwLCAweGU1LCAweDE0LCAweDQwLCAweDkwLCAweGU1LCAKKzB4MDAsIDB4MzAsIDB4ODUsIDB4ZTUsIDB4MDQsIDB4YzAsIDB4ODUsIDB4ZTUsIDB4MDgsIDB4MTAsIDB4ODUsIDB4ZTUsIAorMHgwYywgMHgyMCwgMHg4NSwgMHhlNSwgMHgxMCwgMHgxMCwgMHg5MCwgMHhlNSwgCisweDEwLCAweDUwLCAweDg1LCAweGUyLCAweDAxLCAweDAwLCAweDU1LCAweGUxLCAweDBjLCAweDUwLCAweDkwLCAweDU1LCAKKzB4MDQsIDB4MDAsIDB4NTUsIDB4ZTEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDQsIDB4MTAsIDB4OTAsIDB4ZTUsIAorMHgwMCwgMHg1MCwgMHg4MCwgMHhlNSwgMHgwMCwgMHg1MCwgMHg4MSwgMHhlNSwgMHgwMCwgMHgwMCwgMHhhMCwgMHhlMywgCisweDMwLCAweDQwLCAweGJkLCAweGU4LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweDMwLCAweDkzLCAweGU1LCAKKzB4MDgsIDB4MjAsIDB4OTAsIDB4ZTUsIDB4MDEsIDB4MzEsIDB4ODMsIDB4ZTMsIDB4MDIsIDB4MzYsIDB4ODMsIDB4ZTMsIAorMHgwMywgMHgwMCwgMHg1NSwgMHhlMSwgMHgxNCwgMHgzMCwgMHg4MCwgMHhlNSwgMHhmMiwgMHhmZiwgMHhmZiwgMHgxYSwgCisweDAxLCAweDAwLCAweGEwLCAweGUzLCAweGY0LCAweGZmLCAweGZmLCAweGVhLCAweDAxLCAweDA2LCAweDFjLCAweGUzLCAKKzB4ZjEsIDB4ZmYsIDB4ZmYsIDB4MGEsIDB4ZWMsIDB4MTAsIDB4OWYsIDB4ZTUsIDB4MDIsIDB4YzYsIDB4Y2MsIDB4ZTMsIAorMHg1NCwgMHgyMCwgMHg5MSwgMHhlNSwgMHhlNCwgMHgzMCwgMHg5ZiwgMHhlNSwgMHg1MCwgMHgxMCwgMHg5MSwgMHhlNSwgCisweGQ5LCAweGZmLCAweGZmLCAweGVhLCAweGYwLCAweDQ3LCAweDJkLCAweGU5LCAweDIwLCAweGMwLCAweDlkLCAweGU1LCAKKzB4MGMsIDB4NjgsIDB4YTAsIDB4ZTEsIDB4MjYsIDB4NjgsIDB4YjAsIDB4ZTEsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgxOCwgMHg0MCwgMHhhMCwgMHhlMywgMHhiOCwgMHg1MCwgMHg5ZiwgMHhlNSwgMHg5NCwgMHgwMCwgMHgwMCwgMHhlMCwgCisweDA1LCAweDAwLCAweDgwLCAweGUwLCAweDA4LCAweDQwLCAweDkwLCAweGU1LCAweDA0LCAweDgwLCAweDkwLCAweGU1LCAKKzB4MDAsIDB4NzAsIDB4YTAsIDB4ZTMsIDB4MWYsIDB4YzAsIDB4YTAsIDB4ZTMsIDB4MDIsIDB4YzQsIDB4OGMsIDB4ZTMsIAorMHgwMCwgMHg1MCwgMHg5MCwgMHhlNSwgMHgxMCwgMHg5MCwgMHg5MCwgMHhlNSwgMHgxNCwgMHhhMCwgMHg5MCwgMHhlNSwgCisweDAwLCAweDMwLCAweDg1LCAweGU1LCAweDA0LCAweGMwLCAweDg1LCAweGU1LCAweDA4LCAweDEwLCAweDg1LCAweGU1LCAKKzB4MGMsIDB4MjAsIDB4ODUsIDB4ZTUsIDB4MTAsIDB4NTAsIDB4ODUsIDB4ZTIsIDB4MDksIDB4MDAsIDB4NTUsIDB4ZTEsIAorMHgwYywgMHg1MCwgMHg5MCwgMHg1NSwgMHgwYSwgMHgwMCwgMHg1NSwgMHhlMSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwYSwgCisweDAzLCAweDcwLCAweDE3LCAweGUyLCAweDIwLCAweDEwLCAweDgxLCAweGUyLCAweDIwLCAweDMwLCAweDgzLCAweGUyLCAKKzB4MGEsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NjAsIDB4OTYsIDB4ZTIsIDB4MDEsIDB4NzAsIDB4ODcsIDB4ZTIsIAorMHgwOSwgMHgwMCwgMHgwMCwgMHgwYSwgMHgyMCwgMHg2MCwgMHg0NiwgMHhlMiwgMHgyMCwgMHgwMCwgMHg1NiwgMHhlMywgCisweGVjLCAweGZmLCAweGZmLCAweGNhLCAweDAwLCAweDcwLCAweGEwLCAweGUzLCAweDAxLCAweGMwLCAweDQ2LCAweGUyLCAKKzB4MDIsIDB4YzQsIDB4OGMsIDB4ZTMsIDB4MDAsIDB4NjAsIDB4YTAsIDB4ZTMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgwMCwgMHg1MCwgMHg4OCwgMHhlNSwgMHhmMiwgMHhmZiwgMHhmZiwgMHhlYSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDUwLCAweDgwLCAweGU1LCAweDAxLCAweDAwLCAweGEwLCAweGUxLCAweGYwLCAweDQ3LCAweGJkLCAweGU4LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4YTAsIDB4OTQsIDB4ZTUsIDB4MGEsIDB4MDAsIDB4NTUsIDB4ZTEsIAorMHgxNCwgMHhhMCwgMHg4MCwgMHhlNSwgMHhlNSwgMHhmZiwgMHhmZiwgMHgxYSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweGY1LCAweGZmLCAweGZmLCAweGVhLCAweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4ODAsIDB4MjAsIDB4NDAsIDB4NjgsIDB4ODIsIDB4OWYsIDB4ZTUsIDB4MGIsIDB4OTIsIDB4YTAsIDB4ZTMsIAorMHg2NCwgMHhhMiwgMHg5ZiwgMHhlNSwgMHg1OCwgMHhiMCwgMHg5YSwgMHhlNSwgMHgwZSwgMHhmMCwgMHhhMCwgMHhlMSwgCisweDU0LCAweGIwLCAweDlhLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDNmLCAweDQwLCAweDJkLCAweGU5LCAKKzB4MDAsIDB4MDAsIDB4NGYsIDB4ZTEsIDB4MWYsIDB4MDAsIDB4MDAsIDB4ZTIsIDB4MTIsIDB4MDAsIDB4NTAsIDB4ZTMsIAorMHg1NCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHg4MCwgMHgwMCwgMHhjMCwgMHhlMywgCisweDAwLCAweGYwLCAweDIxLCAweGUxLCAweDA0LCAweDUwLCAweGEwLCAweGUzLCAweDAwLCAweDQwLCAweDk5LCAweGU1LCAKKzB4MDksIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MDIsIDB4MDAsIDB4MTQsIDB4ZTMsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHg4MCwgMHgwMCwgMHgxNCwgMHhlMywgMHg1OSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgyMCwgMHgwMCwgMHgxNCwgMHhlMywgCisweDU5LCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweDA3LCAweDE0LCAweGUzLCAweDU5LCAweDAwLCAweDAwLCAweDFiLCAKKzB4MDEsIDB4MDYsIDB4MTQsIDB4ZTMsIDB4NTksIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDgsIDB4MDAsIDB4MTQsIDB4ZTMsIAorMHg0NSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMiwgMHgwNSwgMHgxNCwgMHhlMywgMHg0YSwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDAyLCAweDA4LCAweDE0LCAweGUzLCAweDRiLCAweDAwLCAweDAwLCAweDFiLCAweGU1LCAweDBlLCAweDE0LCAweGUzLCAKKzB4MDcsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDQsIDB4MjAsIDB4OTgsIDB4ZTUsIDB4MGMsIDB4MTAsIDB4OTgsIDB4ZTUsIAorMHgwNCwgMHgzMCwgMHg1MiwgMHhlMiwgMHgzYywgMHgzMCwgMHhhMCwgMHhiMywgMHgwNCwgMHgzMCwgMHg4OCwgMHhlNSwgCisweDAyLCAweDAwLCAweDkxLCAweGU3LCAweDBmLCAweGUwLCAweGEwLCAweGUxLCAKKzB4MTAsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDEsIDB4NTAsIDB4NTUsIDB4ZTIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgwMCwgMHg0MCwgMHg5OSwgMHhlNSwgMHgwYywgMHgwMCwgMHg5YSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgxNCwgMHhlMSwgCisweDFiLCAweGZmLCAweDJmLCAweDExLCAweDA4LCAweDAwLCAweDlhLCAweGU1LCAweDAwLCAweDAwLCAweDE0LCAweGUxLCAKKzB4MGIsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDEsIDB4MGMsIDB4MTQsIDB4ZTMsIDB4OTgsIDB4MDEsIDB4OWYsIDB4MTUsIAorMHgwZiwgMHhlMCwgMHhhMCwgMHgxMSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwMiwgMHgwNCwgMHgxNCwgMHhlMywgCisweDhjLCAweDAxLCAweDlmLCAweDE1LCAweDBmLCAweGUwLCAweGEwLCAweDExLCAweDEwLCAweGZmLCAweDJmLCAweDExLCAKKzB4MDEsIDB4MDksIDB4MTQsIDB4ZTMsIDB4ODAsIDB4MDEsIDB4OWYsIDB4MTUsIDB4MGYsIDB4ZTAsIDB4YTAsIDB4MTEsIAorMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwNCwgMHgwMCwgMHg5YSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgxNCwgMHhlMSwgCisweDE2LCAweDAwLCAweDAwLCAweDBhLCAweDU0LCAweGUwLCAweDhmLCAweGUyLCAweDA0LCAweDAwLCAweDE0LCAweGUzLCAKKzB4NDAsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDIsIDB4MGEsIDB4MTQsIDB4ZTMsIAorMHg0NCwgMHgwMCwgMHg5YSwgMHgxNSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwMiwgMHgwOSwgMHgxNCwgMHhlMywgCisweDQ4LCAweDAwLCAweDlhLCAweDE1LCAweDEwLCAweGZmLCAweDJmLCAweDExLCAweDAxLCAweDAyLCAweDE0LCAweGUzLCAKKzB4NGMsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDEsIDB4MDQsIDB4MTQsIDB4ZTMsIAorMHg1MCwgMHgwMCwgMHg5YSwgMHgxNSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwMSwgMHgwYSwgMHgxNCwgMHhlMywgCisweDIxLCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweDAwLCAweDE0LCAweGUzLCAweDBlLCAweDAwLCAweDAwLCAweDFiLCAKKzB4MTAsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MTQsIDB4ZTEsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHgwMCwgMHg0MCwgMHg5OSwgMHhlNSwgMHgwNCwgMHg1MCwgMHhhMCwgMHhlMywgMHgwMCwgMHg0MCwgMHg5NCwgMHhlMiwgCisweDFiLCAweGZmLCAweDJmLCAweDExLCAweDNmLCAweDQwLCAweGJkLCAweGU4LCAweDA0LCAweGYwLCAweDVlLCAweGUyLCAKKzB4YzAsIDB4MDAsIDB4ODAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4NjEsIDB4ZTEsIDB4ZmEsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgxOCwgMHgwMCwgMHg5YSwgMHhlNSwgMHgxYywgMHgxMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgCisweDU0LCAweGIwLCAweDlhLCAweGU1LCAweDFjLCAweDEwLCAweDlhLCAweGU1LCAweDE0LCAweDAwLCAweDlhLCAweGU1LCAKKzB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MjAsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4YTAsIDB4ZTMsIAorMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgyNCwgMHgxMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgCisweDI4LCAweDEwLCAweDlhLCAweGU1LCAweDExLCAweGZmLCAweDJmLCAweGUxLCAweDJjLCAweDEwLCAweDlhLCAweGU1LCAKKzB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MzAsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHgzNCwgMHgxMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhlYSwgCisweDM4LCAweGUwLCAweDlhLCAweGU1LCAweDNjLCAweDEwLCAweDlhLCAweGU1LCAweDE4LCAweDAwLCAweDlhLCAweGU1LCAKKzB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MzgsIDB4ZTAsIDB4OWEsIDB4ZTUsIDB4M2MsIDB4MTAsIDB4OWEsIDB4ZTUsIAorMHgxNCwgMHgwMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgMHg2NCwgMHgyMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDMwLCAweDkyLCAweGU1LCAweDAwLCAweDMwLCAweDUzLCAweGUwLCAweDBhLCAweDAwLCAweDAwLCAweGJhLCAKKzB4MDAsIDB4MzAsIDB4ODIsIDB4ZTUsIDB4MGMsIDB4MDAsIDB4OTIsIDB4ZTUsIDB4MDgsIDB4MzAsIDB4OTIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg5MSwgMHhlMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMywgMHgxMCwgMHg4MCwgMHhlNywgCisweDA0LCAweDMwLCAweDUzLCAweGUyLCAweDNjLCAweDMwLCAweGEwLCAweGIzLCAweDA4LCAweDMwLCAweDgyLCAweGU1LCAKKzB4MDEsIDB4MDAsIDB4YTAsIDB4ZTMsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4M2MsIDB4MTAsIDB4OWYsIDB4ZTUsIAorMHgwMCwgMHgwMCwgMHg5MSwgMHhlNSwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMiwgMHgwMCwgMHgwMCwgMHg4MSwgMHhlNSwgCisweDAwLCAweDAwLCAweGEwLCAweGUzLCAweGY4LCAweGZmLCAweGZmLCAweGVhLCAweDEwLCAweDAwLCAweDlmLCAweGU1LCAKKzB4MDgsIDB4MTAsIDB4OTAsIDB4ZTUsIDB4MDQsIDB4MTAsIDB4NTEsIDB4ZTIsIDB4M2MsIDB4MTAsIDB4YTAsIDB4YjMsIAorMHgwOCwgMHgxMCwgMHg4MCwgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGNjLCAweDA0LCAweDAwLCAweDgwLCAweDcxLCAweDJiLCAweGZmLCAweGZmLCAweGQxLCAweDNkLCAweGZmLCAweGZmLCAKKzB4YzksIDB4MmIsIDB4ZmYsIDB4ZmYsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4YzksIDB4MWMsIDB4ODksIDB4MDgsIAorMHg4OSwgMHgwMCwgMHgwMSwgMHgyMywgMHg4NSwgMHg0YSwgMHg1YiwgMHgwNywgMHgxOCwgMHg0MywgMHgxMywgMHg2OCwgCisweDViLCAweDE4LCAweDEzLCAweDYwLCAweDAwLCAweDFmLCAweDgxLCAweGEzLCAweDViLCAweDFhLCAweDE4LCAweDQ3LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweDk4LCAweDAwLCAweDlmLCAweGU1LCAweDk4LCAweDEwLCAweDlmLCAweGU1LCAweDAxLCAweDIwLCAweDQwLCAweGUwLCAKKzB4OTQsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDMsIDB4MDAsIDB4NTAsIDB4ZTEsIAorMHgwMywgMHgwMCwgMHgwMCwgMHgxYSwgMHgwNCwgMHgxMCwgMHg4MSwgMHhlMiwgMHgwNCwgMHgyMCwgMHg1MiwgMHhlMiwgCisweDAwLCAweDAwLCAweDAwLCAweDBhLCAweGY4LCAweGZmLCAweGZmLCAweGVhLCAweDc4LCAweDAwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MjAsIDB4ODAsIDB4ZTUsIDB4NzQsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4NzQsIDB4MTAsIDB4OWYsIDB4ZTUsIAorMHgwMSwgMHgyMCwgMHg0MCwgMHhlMCwgMHg2MCwgMHgzMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhlNSwgCisweDAzLCAweDAwLCAweDUwLCAweGUxLCAweDAzLCAweDAwLCAweDAwLCAweDFhLCAweDA0LCAweDEwLCAweDgxLCAweGUyLCAKKzB4MDQsIDB4MjAsIDB4NTIsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHg1MCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgyMCwgMHg4MCwgMHhlNSwgMHg0YywgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDRjLCAweDEwLCAweDlmLCAweGU1LCAweDAxLCAweDIwLCAweDQwLCAweGUwLCAweDJjLCAweDMwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDMsIDB4MDAsIDB4NTAsIDB4ZTEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MWEsIAorMHgwNCwgMHgxMCwgMHg4MSwgMHhlMiwgMHgwNCwgMHgyMCwgMHg1MiwgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgCisweGY4LCAweGZmLCAweGZmLCAweGVhLCAweDI4LCAweDAwLCAweDlmLCAweGU1LCAweDAwLCAweDIwLCAweDgwLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4N2MsIDB4MzQsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MzAsIDB4MDAsIDB4ODAsIAorMHhhZCwgMHhkZSwgMHhhZCwgMHhkZSwgMHhjMCwgMHgwNCwgMHgwMCwgMHg4MCwgMHhmYywgMHgzNywgMHgwMCwgMHg4MCwgCisweDgwLCAweDM0LCAweDAwLCAweDgwLCAweGM0LCAweDA0LCAweDAwLCAweDgwLCAweGZjLCAweDNmLCAweDAwLCAweDgwLCAKKzB4NDAsIDB4MzgsIDB4MDAsIDB4ODAsIDB4YzgsIDB4MDQsIDB4MDAsIDB4ODAsIDB4NzgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg3MSwgMHhlYSwgMHhmZiwgMHhlYSwgMHg3OCwgMHg0NywgMHgwMCwgMHgwMCwgMHgzOSwgMHhmZSwgMHhmZiwgMHhlYSwgCisweDc4LCAweDQ3LCAweDAwLCAweDAwLCAweDYzLCAweGZlLCAweGZmLCAweGVhLCAweDc4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MWIsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4NzgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NmIsIDB4ZWEsIDB4ZmYsIDB4ZWEsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgCisweDI4LCAweDA0LCAweDAwLCAweDAwLCAweGY4LCAweDNkLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjksIDB4MGIsIDB4ZmYsIDB4ZmYsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNSwgMHgwYiwgMHhmZiwgMHhmZiwgMHgwMywgMHhmZiwgMHgwNiwgMHg1NCwgCisweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDc1LCAweDA0LCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4YTEsIDB4MDUsIDB4ZmYsIDB4ZmYsIDB4MDQsIDB4ZmYsIDB4MDcsIDB4NTQsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHhiNSwgMHgwNCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMSwgMHgwNSwgMHhmZiwgMHhmZiwgCisweDA1LCAweGZmLCAweDA1LCAweDU0LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDM5LCAweDA0LCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4MDUsIDB4ZmYsIDB4ZmYsIDB4MDEsIDB4ZmYsIDB4MDQsIDB4MDAsIAorMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHgxOCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDYxLCAweDBlLCAweGZmLCAweGZmLCAweDAyLCAweGZmLCAweDAyLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4YTEsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjEsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHhmZiwgMHhmZiwgMHgwMSwgMHg0NCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlkLCAweDBkLCAweGZmLCAweGZmLCAweDA2LCAweDAwLCAweGZmLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M2QsIDB4NTAsIDB4ZmYsIDB4ZmYsIDB4ODEsIDB4NTAsIDB4ZmYsIDB4ZmYsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHg0OCwgMHgwNSwgMHgwMCwgMHg4MCwgMHgxMSwgMHg3NSwgMHgyMSwgMHg0MCwgMHgxYiwgMHg3NSwgMHgyMSwgMHg0MCwgCisweDMxLCAweDc1LCAweDIxLCAweDQwLCAweDQ5LCAweDc1LCAweDIxLCAweDQwLCAKKzB4NTUsIDB4NzUsIDB4MjEsIDB4NDAsIDB4NjMsIDB4NzUsIDB4MjEsIDB4NDAsIDB4N2QsIDB4NzUsIDB4MjEsIDB4NDAsIAorMHhhOSwgMHg3NSwgMHgyMSwgMHg0MCwgMHg2ZCwgMHg3NiwgMHgyMSwgMHg0MCwgMHhjNSwgMHg3NiwgMHgyMSwgMHg0MCwgCisweGQzLCAweDc2LCAweDIxLCAweDQwLCAweGRkLCAweDc2LCAweDIxLCAweDQwLCAweGU3LCAweDc2LCAweDIxLCAweDQwLCAKKzB4OTksIDB4NzcsIDB4MjEsIDB4NDAsIDB4YTcsIDB4NzcsIDB4MjEsIDB4NDAsIDB4YjUsIDB4NzcsIDB4MjEsIDB4NDAsIAorMHg2MSwgMHg3OCwgMHgyMSwgMHg0MCwgMHg1ZiwgMHg3YywgMHgyMSwgMHg0MCwgMHhlOSwgMHg3YywgMHgyMSwgMHg0MCwgCisweDg5LCAweDdkLCAweDIxLCAweDQwLCAweGJkLCAweDdlLCAweDIxLCAweDQwLCAweGM5LCAweDdlLCAweDIxLCAweDQwLCAKKzB4MjksIDB4N2YsIDB4MjEsIDB4NDAsIDB4OGQsIDB4N2YsIDB4MjEsIDB4NDAsIDB4YjksIDB4N2YsIDB4MjEsIDB4NDAsIAorMHhkZCwgMHg3ZiwgMHgyMSwgMHg0MCwgMHgxZCwgMHg4MCwgMHgyMSwgMHg0MCwgMHg0NSwgMHg4MCwgMHgyMSwgMHg0MCwgCisweDhkLCAweDgwLCAweDIxLCAweDQwLCAweDlkLCAweDgwLCAweDIxLCAweDQwLCAweGM1LCAweDgwLCAweDIxLCAweDQwLCAKKzB4ZDUsIDB4ODAsIDB4MjEsIDB4NDAsIDB4MWQsIDB4ODEsIDB4MjEsIDB4NDAsIDB4NWIsIDB4ODEsIDB4MjEsIDB4NDAsIAorMHhiMSwgMHg4MSwgMHgyMSwgMHg0MCwgMHgxMSwgMHg4MiwgMHgyMSwgMHg0MCwgMHgxYiwgMHg4MiwgMHgyMSwgMHg0MCwgCisweDFmLCAweDgyLCAweDIxLCAweDQwLCAweDhkLCAweDgyLCAweDIxLCAweDQwLCAweGQ5LCAweDgyLCAweDIxLCAweDQwLCAKKzB4MzEsIDB4ODMsIDB4MjEsIDB4NDAsIDB4NmQsIDB4ODMsIDB4MjEsIDB4NDAsIDB4ZDEsIDB4ODMsIDB4MjEsIDB4NDAsIAorMHgwOSwgMHg4NCwgMHgyMSwgMHg0MCwgMHgxOSwgMHg4NCwgMHgyMSwgMHg0MCwgMHg1MSwgMHg4NCwgMHgyMSwgMHg0MCwgCisweDYxLCAweDg0LCAweDIxLCAweDQwLCAweDc1LCAweDg0LCAweDIxLCAweDQwLCAweDlkLCAweDg0LCAweDIxLCAweDQwLCAKKzB4YTcsIDB4ODQsIDB4MjEsIDB4NDAsIDB4YjEsIDB4ODQsIDB4MjEsIDB4NDAsIDB4MTUsIDB4ODUsIDB4MjEsIDB4NDAsIAorMHg0NSwgMHg4NSwgMHgyMSwgMHg0MCwgMHg1MSwgMHg4NSwgMHgyMSwgMHg0MCwgMHhjNSwgMHg4NSwgMHgyMSwgMHg0MCwgCisweGNmLCAweDg1LCAweDIxLCAweDQwLCAweGQ5LCAweDg1LCAweDIxLCAweDQwLCAweGUzLCAweDg1LCAweDIxLCAweDQwLCAKKzB4ZWQsIDB4ODUsIDB4MjEsIDB4NDAsIDB4ZjcsIDB4ODUsIDB4MjEsIDB4NDAsIDB4MDEsIDB4ODYsIDB4MjEsIDB4NDAsIAorMHgwYiwgMHg4NiwgMHgyMSwgMHg0MCwgMHgxNSwgMHg4NiwgMHgyMSwgMHg0MCwgMHgwMSwgMHg4OSwgMHgyMSwgMHg0MCwgCisweDFmLCAweDg2LCAweDIxLCAweDQwLCAweDI5LCAweDg2LCAweDIxLCAweDQwLCAweDMzLCAweDg2LCAweDIxLCAweDQwLCAKKzB4M2QsIDB4ODYsIDB4MjEsIDB4NDAsIDB4NjUsIDB4ODYsIDB4MjEsIDB4NDAsIDB4NmYsIDB4ODYsIDB4MjEsIDB4NDAsIAorMHhkMSwgMHg4NiwgMHgyMSwgMHg0MCwgMHhkYiwgMHg4NiwgMHgyMSwgMHg0MCwgMHhlNSwgMHg4NiwgMHgyMSwgMHg0MCwgCisweGVmLCAweDg2LCAweDIxLCAweDQwLCAweGY5LCAweDg2LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4MDMsIDB4ODcsIDB4MjEsIDB4NDAsIDB4NjksIDB4ODcsIDB4MjEsIDB4NDAsIDB4YjUsIDB4ODcsIDB4MjEsIDB4NDAsIAorMHhmOSwgMHg4NywgMHgyMSwgMHg0MCwgMHgwOSwgMHg4OCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDU1LCAweDg4LCAweDIxLCAweDQwLCAweDU5LCAweDg4LCAweDIxLCAweDQwLCAweDVkLCAweDg4LCAweDIxLCAweDQwLCAKKzB4YjUsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZGQsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZTksIDB4ODgsIDB4MjEsIDB4NDAsIAorMHhlZCwgMHg4OCwgMHgyMSwgMHg0MCwgMHhmMSwgMHg4OCwgMHgyMSwgMHg0MCwgMHhmNSwgMHg4OCwgMHgyMSwgMHg0MCwgCisweGY5LCAweDg4LCAweDIxLCAweDQwLCAweGZkLCAweDg4LCAweDIxLCAweDQwLCAweDJkLCAweDg1LCAweDIxLCAweDQwLCAKKzB4ODksIDB4ODUsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHgwZCwgMHg4OSwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgMHhlMSwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHg2YiwgMHg3OCwgMHgyMSwgMHg0MCwgMHhmNSwgMHg3YiwgMHgyMSwgMHg0MCwgMHgzMSwgMHg3YywgMHgyMSwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWMsIDB4MDEsIDB4MTgsIDB4NDAsIDB4NTgsIDB4MDEsIDB4MTgsIDB4NDAsIAorMHgyNCwgMHhhMywgMHgyMCwgMHg0MCwgMHgyNCwgMHhhNywgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDZjLCAweDAxLCAweDE4LCAweDQwLCAweDY4LCAweDAxLCAweDE4LCAweDQwLCAKKzB4MjQsIDB4ODMsIDB4MjAsIDB4NDAsIDB4MjQsIDB4YTMsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHgwMSwgMHgxOCwgMHg0MCwgMHg3OCwgMHgwMSwgMHgxOCwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGMsIDB4MDEsIDB4MTgsIDB4NDAsIAorMHg4OCwgMHgwMSwgMHgxOCwgMHg0MCwgMHgyNCwgMHhhOSwgMHgyMCwgMHg0MCwgMHgyNCwgMHhhYiwgMHgyMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDgsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTIsIDB4MDAsIAorMHgxYywgMHgwMCwgMHgxMiwgMHgwMCwgMHgyNCwgMHhhOCwgMHgyMCwgMHg0MCwgMHhhNCwgMHhhOCwgMHgyMCwgMHg0MCwgCisweGE0LCAweGE4LCAweDIwLCAweDQwLCAweDI0LCAweGE5LCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4ZDEsIDB4YTgsIDB4MjEsIDB4NDAsIDB4MmQsIDB4YWEsIDB4MjEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHg4OSwgMHg3MCwgMHgyMSwgMHg0MCwgMHhjOSwgMHhhMSwgMHgyMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NTcsIDB4ODksIDB4MjEsIDB4NDAsIDB4ZDEsIDB4YTgsIDB4MjEsIDB4NDAsIDB4YzUsIDB4MmYsIDB4ZmYsIDB4ZmYsIAorMHgwNSwgMHgyMSwgMHhmZiwgMHhmZiwgMHhlZiwgMHgyMCwgMHhmZiwgMHhmZiwgMHg1OSwgMHhhNywgMHgyMSwgMHg0MCwgCisweDM0LCAweDJlLCAweDAwLCAweDgwLCAweDQ4LCAweDJlLCAweDAwLCAweDgwLCAweDVjLCAweDJlLCAweDAwLCAweDgwLCAKKzB4MzAsIDB4MzMsIDB4M2EsIDB4MzEsIDB4MzEsIDB4M2EsIDB4MzEsIDB4MzEsIDB4MDAsIDB4MzAsIDB4MzcsIDB4MmYsIAorMHgzMiwgMHgzMywgMHgyZiwgMHgzMCwgMHgzMSwgMHgwMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMSwgMHgzNSwgCisweDM2LCAweDM5LCAweDAwLCAweDQzLCAweDZmLCAweDcwLCAweDc5LCAweDcyLCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAKKzB4MjAsIDB4MjgsIDB4NjMsIDB4MjksIDB4MjAsIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MjAsIDB4MzMsIDB4NDMsIAorMHg2ZiwgMHg2ZCwgMHgyMCwgMHg0MywgMHg2ZiwgMHg3MiwgMHg3MCwgMHg2ZiwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2OSwgCisweDZmLCAweDZlLCAweDBhLCAweDAwLCAweDA4LCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGMsIDB4NTMsIDB4ZmYsIDB4ZmYsIAorMHgyNywgMHhmMCwgMHg3ZCwgMHhmZCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHhkYSwgMHgwZSwgMHg4MiwgMHgwMCwgCisweDAxLCAweDQwLCAweDY0LCAweDA0LCAweDY0LCAweDJkLCAweDAwLCAweDgwLCAweGU0LCAweDJjLCAweDAwLCAweDgwLCAKKzB4NjksIDB4M2UsIDB4ZmYsIDB4ZmYsIDB4YzksIDB4NGYsIDB4ZmYsIDB4ZmYsIDB4ZDUsIDB4MjQsIDB4ZmYsIDB4ZmYsIAorMHhjOSwgMHgzYiwgMHhmZiwgMHhmZiwgMHgyOSwgMHgzYywgMHhmZiwgMHhmZiwgMHgxOSwgMHgxYSwgMHhmZiwgMHhmZiwgCisweDY1LCAweDExLCAweGZmLCAweGZmLCAweGNjLCAweDUzLCAweGZmLCAweGZmLCAweDIxLCAweDQwLCAweGZmLCAweGZmLCAKKzB4ODksIDB4NzAsIDB4MjEsIDB4NDAsIDB4NDksIDB4NzIsIDB4MjEsIDB4NDAsIDB4ZDksIDB4M2YsIDB4ZmYsIDB4ZmYsIAorMHgyMSwgMHg5YSwgMHgyMSwgMHg0MCwgMHg4NSwgMHgyNCwgMHhmZiwgMHhmZiwgMHg2NCwgMHg1MywgMHhmZiwgMHhmZiwgCisweDhjLCAweDUzLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4ODAsIDB4MzAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgMHhiMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHg3YiwgMHgwZSwgMHgwMCwgMHgwMCwgCisweDAwLCAweDZlLCAweDIxLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4ZWQsIDB4ODksIDB4MjEsIDB4NDAsIDB4OGIsIDB4ODksIDB4MjEsIDB4NDAsIDB4YTUsIDB4OGMsIDB4MjEsIDB4NDAsIAorMHgwNSwgMHg4ZCwgMHgyMSwgMHg0MCwgMHhjZCwgMHg4ZCwgMHgyMSwgMHg0MCwgMHg4YiwgMHg4YiwgMHgyMSwgMHg0MCwgCisweGE5LCAweDhlLCAweDIxLCAweDQwLCAweDE1LCAweDhmLCAweDIxLCAweDQwLCAweDY5LCAweDhiLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NTksIDB4YmQsIDB4MjEsIDB4NDAsIDB4YzEsIDB4YmQsIDB4MjEsIDB4NDAsIDB4MmQsIDB4YmUsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHgyMCwgMHgwYSwgMHg0YSwgMHgwYiwgMHgyMywgMHgxYiwgMHgwMiwgMHhkMSwgMHgxOCwgMHgyZCwgMHgyMywgCisweDliLCAweDAxLCAweGQzLCAweDE4LCAweDg4LCAweDYxLCAweGQ4LCAweDYwLCAweGQ4LCAweDYzLCAweDgwLCAweDMyLCAKKzB4YzgsIDB4NjAsIDB4MDgsIDB4NjEsIDB4NDgsIDB4NjEsIDB4ZDAsIDB4NjIsIDB4MDMsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg2MCwgMHg4OCwgMHg2MCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGZlLCAweDAzLCAweDAwLCAweDAwLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDBjLCAweDFjLCAweDA1LCAweDFjLCAKKzB4MDAsIDB4MjMsIDB4MDAsIDB4OTMsIDB4ZmYsIDB4ZjcsIDB4ZGUsIDB4ZmYsIDB4NjgsIDB4NDksIDB4MGIsIDB4MjMsIAorMHgxYiwgMHgwMiwgMHhjZiwgMHgxOCwgMHg3OCwgMHg2OCwgMHgyOCwgMHg0MCwgCisweDAwLCAweDIyLCAweGY4LCAweDYwLCAweDNhLCAweDYxLCAweGJhLCAweDY4LCAweDIyLCAweDQwLCAweDdhLCAweDYxLCAKKzB4MGMsIDB4MWMsIDB4NDEsIDB4MDksIDB4MDMsIDB4ZDIsIDB4NTEsIDB4MDksIDB4MDEsIDB4ZDIsIDB4ODAsIDB4MGEsIAorMHgwMiwgMHhkMywgMHg2MCwgMHg0OCwgMHgwMCwgMHhmMCwgMHhjMiwgMHhmOCwgMHgwMSwgMHgyMCwgMHhmOSwgMHg2OCwgCisweDQ5LCAweDA5LCAweDAzLCAweGQyLCAweDc5LCAweDY5LCAweDQ5LCAweDA5LCAweDAwLCAweGQyLCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MDMsIDB4ZjAsIDB4ZDQsIDB4ZmEsIDB4ZjgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHg3MCwgMHhkMCwgMHgwMCwgMHgyMywgMHgwMiwgMHg5MywgMHgwMSwgMHg5MywgMHg1NCwgMHg0YSwgMHgwMSwgMHgyMywgCisweDE4LCAweDQzLCAweGY4LCAweDYwLCAweDAwLCAweDIwLCAweGQ1LCAweDFkLCAweDc5LCAweDM1LCAweDAzLCAweDk1LCAKKzB4MDEsIDB4MjQsIDB4MDAsIDB4MjEsIDB4NGYsIDB4NGQsIDB4ZmEsIDB4NjgsIDB4MjIsIDB4NDAsIDB4MzksIDB4ZDAsIAorMHg4YSwgMHgwMCwgMHg1MiwgMHgxOCwgMHg5MiwgMHgwMCwgMHg0ZSwgMHg0YiwgMHg5YiwgMHg1YywgMHgxZSwgMHgxYywgCisweDgzLCAweDQyLCAweDA0LCAweGQwLCAweDRiLCAweDRiLCAweGQzLCAweDE4LCAweDViLCAweDc4LCAweDgzLCAweDQyLCAKKzB4MmMsIDB4ZDEsIDB4NDksIDB4NGIsIDB4ZDIsIDB4MTgsIDB4ZDMsIDB4NzgsIDB4MDMsIDB4OWQsIDB4ZWQsIDB4NmEsIAorMHhhYiwgMHg0MiwgMHgwMiwgMHhkOSwgMHgwMywgMHg5ZCwgMHhjMCwgMHg0NiwgMHhlYiwgMHg2MiwgMHg1MywgMHg2OCwgCisweDViLCAweDA4LCAweDAxLCAweGQzLCAweDAxLCAweDIzLCAweDAwLCAweDkzLCAweDg2LCAweDQyLCAweDBhLCAweGQxLCAKKzB4OTUsIDB4NjgsIDB4MDIsIDB4OWIsIDB4NWUsIDB4MWMsIDB4MDIsIDB4OTYsIDB4OWIsIDB4MDAsIDB4M2MsIDB4NGUsIAorMHg5ZSwgMHgxOSwgMHgwYiwgMHgyMywgMHgxYiwgMHgwMiwgMHhmMywgMHgxOCwgMHg5ZCwgMHg2MSwgMHg1MywgMHg3OCwgCisweDgzLCAweDQyLCAweDBkLCAweGQxLCAweGQyLCAweDY4LCAweDAxLCAweDliLCAweDVkLCAweDFjLCAweDAxLCAweDk1LCAKKzB4OWIsIDB4MDAsIDB4MzUsIDB4NGQsIDB4NWQsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZWIsIDB4MTgsIAorMHhkYSwgMHg2MCwgMHgzYSwgMHg2OSwgMHgwMSwgMHgzMiwgMHgzYSwgMHg2MSwgMHg2NCwgMHgwMCwgMHgwMSwgMHgzMSwgCisweDBiLCAweDI5LCAweGJkLCAweGQzLCAweDAxLCAweDMwLCAweDA5LCAweDI4LCAweGI4LCAweGQzLCAweDAwLCAweDIwLCAKKzB4MDIsIDB4OWIsIDB4OTksIDB4MDAsIDB4MmIsIDB4NGEsIDB4ODksIDB4MTgsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIAorMHhjOSwgMHgxOCwgMHg4OCwgMHg2MSwgMHgwMSwgMHg5YiwgMHg5OSwgMHgwMCwgMHg4OSwgMHgxOCwgMHgyZCwgMHgyMywgCisweDliLCAweDAxLCAweGM5LCAweDE4LCAweGM4LCAweDYwLCAweDAwLCAweDliLCAweDAwLCAweDJiLCAweDBjLCAweGQxLCAKKzB4ODEsIDB4MDAsIDB4ODksIDB4MTgsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4YzksIDB4MTgsIDB4Y2IsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg4YiwgMHg2MSwgMHgwMSwgMHgzMCwgMHgwYiwgMHgyOCwgMHhmNCwgMHhkMywgMHgwOCwgMHhlMCwgCisweDA3LCAweGUwLCAweDAzLCAweDlkLCAweGU4LCAweDZhLCAweDMwLCAweDI4LCAweDAzLCAweGQyLCAweDMwLCAweDIwLCAKKzB4MDMsIDB4OWQsIDB4YzAsIDB4NDYsIDB4ZTgsIDB4NjIsIDB4MTksIDB4NGEsIDB4NzgsIDB4NjksIDB4MDAsIDB4MjgsIAorMHgyYSwgMHhkMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHgyMywgMHgxOCwgMHg0MywgMHg3OCwgMHg2MSwgMHgwMCwgMHgyMCwgCisweDAxLCAweDI0LCAweDAwLCAweDIyLCAweDEzLCAweDRlLCAweDdiLCAweDY5LCAweDIzLCAweDQwLCAweDEwLCAweGQwLCAKKzB4OTMsIDB4MDAsIDB4OWIsIDB4MTgsIDB4OWIsIDB4MDAsIDB4MTIsIDB4NGQsIDB4NWIsIDB4MTksIDB4OWQsIDB4NzgsIAorMHg4NSwgMHg0MiwgMHgwOCwgMHhkMSwgMHgxZCwgMHg2OSwgMHgwYiwgMHgxYywgMHg5YiwgMHgwMCwgMHg5ZSwgMHgxOSwgCisweDJkLCAweDIzLCAweDliLCAweDAxLCAweGYzLCAweDE4LCAweGRkLCAweDYzLCAweDAxLCAweDMxLCAweDY0LCAweDAwLCAKKzB4MDEsIDB4MzIsIDB4MGIsIDB4MmEsIDB4ZTYsIDB4ZDMsIDB4MDEsIDB4MzAsIDB4MDksIDB4MjgsIDB4ZTEsIDB4ZDMsIAorMHgwMCwgMHgyMCwgMHg4OSwgMHgwMCwgMHgwNCwgMHg0YSwgMHg4OSwgMHgxOCwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgCisweGM5LCAweDE4LCAweGM4LCAweDYzLCAweDA0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MzAsIDB4NTMsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHg0NywgMHgwOCwgMHg0NywgMHgxMCwgMHg0NywgMHgxOCwgMHg0NywgMHg3OCwgMHg0NywgMHhjMCwgMHg0NiwgCisweDE4LCAweGMwLCAweDlmLCAweGU1LCAweDFjLCAweGZmLCAweDJmLCAweGUxLCAweDc4LCAweDQ3LCAweGMwLCAweDQ2LCAKKzB4MTAsIDB4YzAsIDB4OWYsIDB4ZTUsIDB4MWMsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4NzgsIDB4NDcsIDB4YzAsIDB4NDYsIAorMHgwOCwgMHhjMCwgMHg5ZiwgMHhlNSwgMHgxYywgMHhmZiwgMHgyZiwgMHhlMSwgMHgzOCwgMHg1MiwgMHhmZiwgMHhmZiwgCisweDg4LCAweDUxLCAweGZmLCAweGZmLCAweGQ1LCAweGIwLCAweDIxLCAweDQwLCAweGYwLCAweGI1LCAweDA0LCAweDIwLCAKKzB4MWEsIDB4NDksIDB4MDEsIDB4MjUsIDB4MDgsIDB4NjAsIDB4MWEsIDB4NGYsIDB4YmIsIDB4MjMsIDB4MWIsIDB4MDEsIAorMHhmOCwgMHgxOCwgMHgwNSwgMHg3MywgMHgxOCwgMHg0OCwgMHg0MSwgMHg2YiwgMHgyYywgMHgwNSwgMHgwMCwgMHgyMCwgCisweDdhLCAweDZlLCAweDE3LCAweDRiLCAweDhhLCAweDQyLCAweDFkLCAweGQwLCAKKzB4MTksIDB4N2IsIDB4MDAsIDB4MjksIDB4MTcsIDB4ZDEsIDB4ZDksIDB4MWQsIDB4ZmYsIDB4MzEsIDB4M2EsIDB4MzEsIAorMHg0OSwgMHg3OCwgMHgxZSwgMHgxYywgMHgwMCwgMHgyOSwgMHgxMCwgMHhkMSwgMHhiMCwgMHg2MCwgMHgxMCwgMHgyMCwgCisweDcwLCAweDYwLCAweDEwLCAweDRhLCAweDEwLCAweDQ5LCAweGZmLCAweGY3LCAweGMzLCAweGZmLCAweDAwLCAweDI4LCAKKzB4MDcsIDB4ZDAsIDB4MzUsIDB4NzMsIDB4MDQsIDB4MjMsIDB4YjgsIDB4NjksIDB4MTgsIDB4NDMsIDB4YjgsIDB4NjEsIAorMHgyMCwgMHg2MSwgMHgwMCwgMHhmMCwgMHgxNywgMHhmOCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDE4LCAweDczLCAweDA0LCAweDIzLCAweGI4LCAweDY5LCAweDk4LCAweDQzLCAweGI4LCAweDYxLCAweDIwLCAweDYxLCAKKzB4ZjUsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMSwgMHgxOCwgMHg0MCwgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgMHgyMCwgMHg1NSwgMHhmZiwgMHhmZiwgCisweDdkLCAweDcxLCAweDIxLCAweDQwLCAweGY4LCAweGI1LCAweDE1LCAweDRmLCAweDM5LCAweDZjLCAweDE1LCAweDQ4LCAKKzB4NDAsIDB4NmUsIDB4MGMsIDB4MWEsIDB4MTQsIDB4NGUsIDB4NzEsIDB4NjgsIDB4MTQsIDB4NGQsIDB4YTEsIDB4NDIsIAorMHgwNiwgMHhkOCwgMHgxNCwgMHg0YSwgMHgwYSwgMHg0MywgMHgwMCwgMHg5MiwgMHhiOSwgMHg2YiwgMHgwOSwgMHgxOCwgCisweGZhLCAweDZiLCAweDExLCAweGUwLCAweDExLCAweDIyLCAweDUyLCAweDA1LCAweDIyLCAweDQzLCAweDAwLCAweDkyLCAKKzB4YjksIDB4NmIsIDB4MDksIDB4MTgsIDB4MDAsIDB4MjAsIDB4ZmEsIDB4NmIsIDB4MmIsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHg4ZCwgMHhmZiwgMHg3MCwgMHg2OCwgMHgwMCwgMHgxYiwgMHgwYSwgMHg0YSwgMHgwMiwgMHg0MywgMHgwMCwgMHg5MiwgCisweGI5LCAweDZiLCAweGZhLCAweDZiLCAweDAwLCAweDIwLCAweDJiLCAweDFjLCAweGZmLCAweGY3LCAweDgyLCAweGZmLCAKKzB4ZjgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDM3LCAweDAyLCAweGYwLCAweGI1LCAweDJiLCAweDRmLCAweGI4LCAweDY4LCAweDc5LCAweDY4LCAKKzB4YzAsIDB4MTksIDB4MjAsIDB4MzAsIDB4MjksIDB4NGEsIDB4ZmYsIDB4ZjcsIDB4NjMsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHhjMCwgMHgwMiwgMHgyOCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhiOSwgMHg2OCwgMHgzOCwgMHgxYywgCisweDI2LCAweDRkLCAweDAwLCAweDI0LCAweDI2LCAweDRlLCAweGVmLCAweDFkLCAweDc5LCAweDM3LCAweDAwLCAweDI5LCAKKzB4MzEsIDB4ZDEsIDB4MzEsIDB4NjgsIDB4MGEsIDB4NzgsIDB4MTIsIDB4MGEsIDB4MDMsIDB4ZDIsIDB4MDQsIDB4NzMsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg0OSwgMHg3OCwgMHgwMCwgMHgyOSwgMHgwYywgMHhkMSwgCisweDA1LCAweDFjLCAweDQwLCAweDY4LCAweDAwLCAweGYwLCAweDNlLCAweGY5LCAweDMwLCAweDY4LCAweDAwLCAweGYwLCAKKzB4NjcsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MjYsIDB4ZDEsIDB4MmMsIDB4NzMsIDB4ZmYsIDB4ZjcsIDB4NTgsIDB4ZmYsIAorMHgyMiwgMHhlMCwgMHgwOSwgMHgwMSwgMHgwNywgMHgxYywgMHg0MSwgMHg2MCwgMHgwOCwgMHgxYywgMHgxNywgMHg0YSwgCisweDE3LCAweDQ5LCAweGZmLCAweGY3LCAweDM1LCAweGZmLCAweDAwLCAweDI4LCAweDA3LCAweGQxLCAweDNjLCAweDczLCAKKzB4MDQsIDB4MjMsIDB4YTgsIDB4NjksIDB4OTgsIDB4NDMsIDB4OTksIDB4MDQsIDB4YTgsIDB4NjEsIDB4MDgsIDB4NjEsIAorMHhkYSwgMHhlNywgMHgxMCwgMHgyMCwgMHgwMCwgMHhmMCwgMHgyMCwgMHhmOSwgMHgxMCwgMHgyMCwgMHhiOCwgMHg2MCwgCisweGZmLCAweGY3LCAweDgyLCAweGZmLCAweGQyLCAweGU3LCAweDA1LCAweDFjLCAweDQwLCAweDY4LCAweDAwLCAweGYwLCAKKzB4MTcsIDB4ZjksIDB4MzAsIDB4NjgsIDB4MDAsIDB4ZjAsIDB4NDAsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4ZDgsIDB4ZDAsIAorMHgwMiwgMHgyMywgMHhmOCwgMHg2YiwgMHgxOCwgMHg0MywgMHhmOCwgMHg2MywgMHhjNCwgMHhlNywgMHgwMCwgMHgwMCwgCisweDI4LCAweDA1LCAweDAwLCAweDgwLCAweGE1LCAweDU1LCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZTQsIDB4MDEsIDB4MDAsIDB4ODAsIDB4MjAsIDB4NTUsIDB4ZmYsIDB4ZmYsIAorMHg3ZCwgMHg3MSwgMHgyMSwgMHg0MCwgMHg5MCwgMHhiNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwMywgMHgxMCwgMHg0OSwgCisweDAwLCAweDI3LCAweDA4LCAweDYwLCAweDBmLCAweDRjLCAweGUwLCAweDFkLCAweGZmLCAweDMwLCAweDNhLCAweDMwLCAKKzB4NDcsIDB4NzAsIDB4ZTAsIDB4NjksIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4NjksIDB4MDAsIDB4ZjAsIAorMHhkNywgMHhmOCwgMHhlMCwgMHg2OSwgMHgwMCwgMHgyOCwgMHgwMSwgMHhkMCwgMHhlNywgMHg2MSwgMHgwMSwgMHhlMCwgCisweDAxLCAweDIwLCAweGUwLCAweDYxLCAweDA3LCAweDQ4LCAweDAyLCAweDIzLCAweGMxLCAweDZiLCAweDE5LCAweDQzLCAKKzB4YzEsIDB4NjMsIDB4MjcsIDB4NzMsIDB4ZmYsIDB4ZjcsIDB4MDAsIDB4ZmYsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgCisweGU4LCAweDBlLCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDc4LCAweDg4LCAKKzB4NmQsIDB4MjgsIDB4MDMsIDB4ZGIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhmNywgMHhmOCwgMHgxNywgMHhlMCwgMHg4MCwgMHgwMCwgMHgwZCwgMHg0OSwgMHgwOSwgMHg1OCwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweGNiLCAweGZlLCAweDAwLCAweDI4LCAweDBmLCAweGQxLCAweDM5LCAweDc4LCAweGM5LCAweDA5LCAKKzB4MGMsIDB4ZDMsIDB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2YsIDB4ZjgsIDB4NjgsIDB4NDYsIAorMHgwMCwgMHgyMSwgMHgwMCwgMHhmMCwgMHgwYiwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyMCwgCisweDAwLCAweGUwLCAweDAwLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ZTgsIDB4MDEsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4ODIsIDB4YjAsIDB4MDIsIDB4MWMsIDB4NDEsIDB4NGIsIAorMHhkZCwgMHgxZCwgMHhmZiwgMHgzNSwgMHgzYSwgMHgzNSwgMHgyZiwgMHg3OCwgMHgwMCwgMHgyZiwgMHgwMSwgMHhkMCwgCisweDAwLCAweDI3LCAweDAwLCAweGUwLCAweDAxLCAweDI3LCAweDJmLCAweDcwLCAweDJmLCAweDc4LCAweGZiLCAweDAwLCAKKzB4ZGIsIDB4MTksIDB4NWIsIDB4MDEsIDB4M2EsIDB4NGYsIDB4ZGMsIDB4MTksIDB4NDAsIDB4NzgsIDB4MDAsIDB4MDEsIAorMHhjNywgMHgxZCwgMHgwOSwgMHgzNywgMHgwMCwgMHgyMCwgMHg4MywgMHgwMCwgMHhkNiwgMHg1OCwgMHhjMCwgMHg0NiwgCisweGU2LCAweDUwLCAweDAxLCAweDMwLCAweDA0LCAweDI4LCAweGY4LCAweGQzLCAweDAwLCAweDI5LCAweDBmLCAweGQwLCAKKzB4MDAsIDB4MjIsIDB4YmIsIDB4MDgsIDB4MDEsIDB4OTMsIDB4ODMsIDB4NDIsIDB4MGIsIDB4ZDksIDB4MTMsIDB4MWMsIAorMHg5YiwgMHgwMCwgMHhjYiwgMHg1OCwgMHg4NiwgMHgwMCwgMHhhMywgMHg1MSwgMHgwMSwgMHg5YiwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMyLCAweDgzLCAweDQyLCAweGY1LCAweGQ4LCAweDAwLCAweGUwLCAweDEwLCAweDI3LCAweDJiLCAweDQ4LCAKKzB4MDIsIDB4NmQsIDB4ODAsIDB4NmUsIDB4MmEsIDB4NDksIDB4ODIsIDB4NDIsIDB4MDMsIDB4ZDgsIDB4ODIsIDB4MWEsIAorMHhjYiwgMHg2YywgMHg5YSwgMHgxYSwgMHgwMCwgMHhlMCwgMHgxMiwgMHgxYSwgMHhiYSwgMHg0MiwgMHgwNSwgMHhkOCwgCisweDI2LCAweDQ4LCAweDgxLCAweDZiLCAweDAxLCAweDMxLCAweDgxLCAweDYzLCAweDAxLCAweDIwLCAweDM3LCAweGUwLCAKKzB4YzMsIDB4MTksIDB4Y2EsIDB4NmMsIDB4OTMsIDB4NDIsIDB4MDgsIDB4ZDgsIDB4MjIsIDB4NGEsIDB4M2EsIDB4NDMsIAorMHgwMCwgMHg5MiwgMHgwYSwgMHgxYywgMHg0OSwgMHg2YywgMHgwOSwgMHgxOCwgMHg5MiwgMHg2YywgMHgyMywgMHgxYywgCisweDEyLCAweGUwLCAweDE2LCAweDFhLCAweDAwLCAweDk2LCAweDFiLCAweDQ5LCAweDQ5LCAweDZjLCAweDA5LCAweDE4LCAKKzB4MTksIDB4NDgsIDB4ODIsIDB4NmMsIDB4MDMsIDB4MjAsIDB4MjMsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NWUsIDB4ZmUsIAorMHhiOCwgMHgxYiwgMHgxOCwgMHg0YSwgMHgwMiwgMHg0MywgMHgwMCwgMHg5MiwgMHhhMywgMHgxOSwgMHgxNCwgMHg0OCwgCisweDgyLCAweDZjLCAweDQxLCAweDZjLCAweDAzLCAweDIwLCAweGZmLCAweGY3LCAweDUzLCAweGZlLCAweDAxLCAweDIwLCAKKzB4MGQsIDB4NDksIDB4YzAsIDB4NDYsIDB4NjgsIDB4NzAsIDB4OGEsIDB4NjksIDB4OTIsIDB4MDAsIDB4NTIsIDB4MTgsIAorMHgxNywgMHg2MSwgMHg4YSwgMHg2OSwgMHgwMCwgMHgyYSwgMHgwMiwgMHhkMCwgMHgwMCwgMHgyNywgMHg4ZiwgMHg2MSwgCisweDAwLCAweGUwLCAweDg4LCAweDYxLCAweDBjLCAweDQ4LCAweDAyLCAweDIzLCAweGMxLCAweDZiLCAweDE5LCAweDQzLCAKKzB4YzEsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDEsIDB4MjcsIDB4MGEsIDB4NDksIDB4YzAsIDB4NDYsIDB4NGYsIDB4NzMsIAorMHgwMiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgCisweDUwLCAweGJhLCAweDIwLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDIsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgxOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwNywgMHg0OSwgMHg4YSwgMHg2ZSwgMHgxMCwgMHgxOCwgMHgwNywgMHg0YSwgCisweGQyLCAweDZjLCAweDEzLCAweDA0LCAweDFiLCAweDBjLCAweDgzLCAweDQyLCAweDAwLCAweGQ4LCAweDgwLCAweDFhLCAKKzB4ODgsIDB4NjYsIDB4ODgsIDB4NmUsIDB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIDB4NDgsIDB4NjEsIDB4NzAsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgCisweDA2LCAweDQ5LCAweDRhLCAweDZlLCAweDEwLCAweDE4LCAweDA2LCAweDRhLCAweDEyLCAweDZjLCAweDgyLCAweDQyLCAKKzB4MDAsIDB4ZDgsIDB4ODAsIDB4MWEsIDB4NDgsIDB4NjYsIDB4NDgsIDB4NmUsIDB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MSwgMHg3MCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDkwLCAweGVlLCAweDIwLCAweDQwLCAweDA1LCAweDIyLCAweDBhLCAweDYwLCAweDgyLCAweDg4LCAweGMwLCAweDQ2LCAKKzB4OGEsIDB4ODAsIDB4MDAsIDB4MjIsIDB4NGEsIDB4NzAsIDB4NDAsIDB4ODgsIDB4YzAsIDB4NDYsIDB4NDgsIDB4ODAsIAorMHhjYSwgMHg4MCwgMHg4YSwgMHg2MCwgMHhjYSwgMHg2MCwgMHg3MCwgMHg0NywgMHgwNSwgMHgyMiwgMHgwMiwgMHg2MCwgCisweDAwLCAweDIyLCAweDgyLCAweDgwLCAweDQyLCAweDcwLCAweDQxLCAweDgwLCAweGMyLCAweDgwLCAweDgyLCAweDYwLCAKKzB4YzIsIDB4NjAsIDB4NzAsIDB4NDcsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIDB4MGUsIDB4NDgsIAorMHg0MSwgMHg2YiwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MywgMHg2OSwgMHg0NiwgCisweDM4LCAweDFjLCAweGZmLCAweGY3LCAweGRkLCAweGZmLCAweDM4LCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAKKzB4NDUsIDB4MjAsIDB4MDAsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDEsIDB4MjcsIDB4ZGYsIDB4ODAsIDB4NjgsIDB4NDYsIAorMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHgxMSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgwMSwgMHhkMSwgMHgzOCwgMHgxYywgCisweDAwLCAweGUwLCAweDAwLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4YzEsIDB4ODgsIDB4MDksIDB4NGEsIAorMHhjMCwgMHg0NiwgMHg5MSwgMHg4MSwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHhiZCwgMHhmZiwgMHgwMSwgMHgyMCwgCisweDQwLCAweDAyLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAKKzB4ZjUsIDB4ZmUsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHhmZiwgMHhmNywgMHhjMywgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAxLCAweDIwLCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDcxLCAweGExLCAweDIxLCAKKzB4NDksIDB4MDMsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgyMCwgMHgwNCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MSwgMHhmZiwgMHgyMSwgMHhhMSwgMHgyMiwgCisweDUyLCAweDAzLCAweDAxLCAweDMxLCAweDkxLCAweDYwLCAweDcwLCAweDQ3LCAweDI4LCAweDBmLCAweDAwLCAweDgwLCAKKzB4MDIsIDB4MjAsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHgwMSwgMHgyMCwgMHg0MCwgMHgwMiwgMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgMHg4OCwgMHg2MCwgMHgwMCwgMHgyMCwgCisweDcwLCAweDQ3LCAweGMwLCAweDg4LCAweGMwLCAweDA2LCAweGMwLCAweDBlLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAKKzB4NDgsIDB4NjEsIDB4MDIsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjMsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwOCwgMHg0OSwgMHgwZiwgMHg2YiwgCisweDY5LCAweDQ2LCAweGZmLCAweGY3LCAweDcxLCAweGZmLCAweGY4LCAweDA2LCAweGMwLCAweDBlLCAweDAxLCAweGFiLCAKKzB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4YTksIDB4ZmUsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDgwLCAweGI1LCAweDg1LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4NWIsIDB4ZmYsIDB4ZjgsIDB4ODgsIDB4MDQsIDB4YTksIDB4MDMsIDB4ZjAsIDB4YzksIDB4ZmYsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHgwMSwgMHhhOCwgMHg0MCwgMHg4OCwgMHgwMCwgMHgyOCwgMHgwZiwgMHhkMCwgMHgwMSwgMHhhOCwgCisweDQwLCAweDg4LCAweDgwLCAweDA4LCAweDAzLCAweDM4LCAweDgwLCAweDA4LCAweDAxLCAweDMwLCAweDA0LCAweDNiLCAKKzB4NTgsIDB4NzAsIDB4MDQsIDB4OTgsIDB4MDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTEsIDB4NDAsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMywgMHg5MCwgMHgwNSwgMHhlMCwgMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgCisweDE4LCAweDQzLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDA0LCAweDk4LCAweGMxLCAweDFkLCAweDAxLCAweDMxLCAKKzB4NjgsIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4NzUsIDB4ZmUsIDB4MDEsIDB4MjAsIDB4MDUsIDB4YjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgxNCwgMHg0ZiwgMHgzOSwgMHg3YiwgCisweDAwLCAweDI5LCAweDIwLCAweGQxLCAweGY5LCAweDFkLCAweGZmLCAweDMxLCAweDNhLCAweDMxLCAweDQ5LCAweDc4LCAKKzB4MDAsIDB4MjksIDB4MWEsIDB4ZDEsIDB4MTAsIDB4NDksIDB4MDUsIDB4MjIsIDB4MDAsIDB4OTIsIDB4MDgsIDB4MjIsIAorMHgwMCwgMHhhYiwgMHg1YSwgMHg4MCwgMHg5OCwgMHg4MCwgMHgwNiwgMHgyMCwgMHgwMCwgMHhhYiwgMHg1OCwgMHg3MCwgCisweDAwLCAweDI0LCAweGRjLCAweDgwLCAweDA4LCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkwLCAweDQ4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIDB4MDEsIDB4MjAsIDB4MzgsIDB4NzMsIDB4NjgsIDB4NDYsIDB4MDgsIDB4MzEsIAorMHhmZiwgMHhmNywgMHg0YywgMHhmZSwgMHgwMCwgMHgyOCwgMHgwMCwgMHhkMCwgMHgzYywgMHg3MywgMHgwNCwgMHhiMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAKKzB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIDB4NjksIDB4NDYsIAorMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhmOSwgMHhmZSwgMHhiYSwgMHg2OCwgMHgwZCwgMHg0YywgMHgwZSwgMHg0OCwgCisweDAwLCAweDJhLCAweDA1LCAweGQxLCAweDBkLCAweDQ5LCAweGZmLCAweGY3LCAweGU0LCAweGZjLCAweDAwLCAweDI4LCAKKzB4MGMsIDB4ZGEsIDB4MDUsIDB4ZTAsIDB4YjksIDB4ODgsIDB4MGIsIDB4NGIsIDB4ZmYsIDB4ZjcsIDB4ZGYsIDB4ZmMsIAorMHgwMCwgMHgyOCwgMHgwNSwgMHhkYSwgMHgwMSwgMHhhYiwgMHg1YywgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgCisweGZmLCAweGY3LCAweDIyLCAweGZlLCAweDAwLCAweDIwLCAweDA0LCAweGIwLCAKKzB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHgwZCwgMHg3NiwgMHgyMSwgMHg0MCwgMHhjMSwgMHhiZCwgMHgyMSwgMHg0MCwgMHg1OSwgMHhiZCwgMHgyMSwgMHg0MCwgCisweDAwLCAweGI1LCAweGMwLCAweDg4LCAweDAzLCAweGYwLCAweDJlLCAweGZmLCAweDAwLCAweDIwLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4ZTIsIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHhmZiwgMHhmNywgMHhkZCwgMHhmZSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweDAxLCAweDFjLCAweDAyLCAweDIwLCAweDAwLCAweGYwLCAweDAyLCAweGY4LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YjAsIDB4YjUsIDB4YzYsIDB4YjAsIDB4MDcsIDB4MWMsIDB4MDgsIDB4MWMsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIAorMHhiNSwgMHhmZSwgMHgyMSwgMHg0OCwgMHhmZiwgMHhmNywgMHhhNCwgMHhmYywgMHgwNCwgMHgxYywgMHgyMCwgMHg0YSwgCisweDAwLCAweDIxLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweGEwLCAweGZjLCAweDAwLCAweDI4LCAweDI3LCAweGQwLCAKKzB4MDQsIDB4YTksIDB4MWQsIDB4NGEsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4OTksIDB4ZmMsIDB4MDQsIDB4YTgsIAorMHgwMCwgMHgyMywgMHgwMSwgMHgyZiwgMHgwNiwgMHhkMSwgMHgwYywgMHhhYSwgMHgwMiwgMHgzMiwgMHgwMCwgMHgyMSwgCisweDEzLCAweDYwLCAweDAxLCAweDMxLCAweDEwLCAweDI5LCAweGZiLCAweGQzLCAweDAxLCAweDY4LCAweDA0LCAweDI5LCAKKzB4MDQsIDB4ZDksIDB4ODksIDB4MDgsIDB4MDMsIDB4MzksIDB4ODksIDB4MDgsIDB4MDEsIDB4MzEsIDB4MDAsIDB4ZTAsIAorMHgxOSwgMHgxYywgMHgwMCwgMHhhYiwgMHg1OSwgMHg3MCwgMHgwNiwgMHhhOSwgMHgwOSwgMHg3OCwgMHhjMCwgMHg0NiwgCisweGQ5LCAweDgwLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkwLCAweDA3LCAweDk4LCAweGMwLCAweDQ2LCAKKzB4MDMsIDB4OTAsIDB4MDQsIDB4MzMsIDB4MDgsIDB4YWQsIDB4MDIsIDB4ZTAsIDB4NDUsIDB4MjAsIDB4MDAsIDB4YWIsIAorMHgxOCwgMHg3MCwgMHgwOSwgMHg0OSwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHg2ZSwgMHhmYywgMHg2OCwgMHg0NiwgCisweDI5LCAweDFjLCAweGZmLCAweGY3LCAweGI3LCAweGZkLCAweDAxLCAweDIwLCAweDQ2LCAweGIwLCAweGIwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjQsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4NTksIDB4YjEsIDB4MjEsIDB4NDAsIAorMHg5ZCwgMHhhZiwgMHgyMSwgMHg0MCwgMHgzYywgMHgwMiwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHgwMSwgMHgxYywgCisweDAyLCAweDIwLCAweDAwLCAweGYwLCAweDEwLCAweGY4LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAKKzB4MDEsIDB4MWMsIDB4MDEsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4YTIsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHgwMSwgMHgxYywgMHgwMSwgMHgyMCwgMHgwMCwgMHhmMCwgMHgwMiwgMHhmOCwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweGYwLCAweGI1LCAweGM3LCAweGIwLCAweDA0LCAweDFjLCAweDBmLCAweDFjLCAweDM4LCAweDFjLCAKKzB4MDEsIDB4YTksIDB4ZmYsIDB4ZjcsIDB4NGQsIDB4ZmUsIDB4MjEsIDB4NDgsIDB4ZmYsIDB4ZjcsIDB4M2MsIDB4ZmMsIAorMHgwMCwgMHg5MCwgMHg3OCwgMHg3OCwgMHgwMCwgMHgwMSwgMHhiYSwgMHg2OCwgMHgwNCwgMHgzMCwgMHhmYywgMHgyYSwgCisweDI1LCAweGQ4LCAweGZmLCAweDIzLCAweDA5LCAweDMzLCAweDk4LCAweDQyLCAweDIxLCAweGQ4LCAweDE5LCAweDJjLCAKKzB4MWYsIDB4ZDgsIDB4ZmQsIDB4ODgsIDB4ZjgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDUsIDB4OTAsIDB4ZjksIDB4MWQsIAorMHgwOSwgMHgzMSwgMHgwNiwgMHhhYiwgMHgwMCwgMHgyMCwgMHg3ZSwgMHg3OCwgMHgwMCwgMHgyZSwgMHgwZCwgMHhkZCwgCisweDQwLCAweGM5LCAweDQwLCAweGMzLCAweDQwLCAweGM5LCAweDQwLCAweGMzLCAweDQwLCAweGM5LCAweDQwLCAweGMzLCAKKzB4NDAsIDB4YzksIDB4NDAsIDB4YzMsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4N2UsIDB4NzgsIAorMHg4NiwgMHg0MiwgMHhmMSwgMHhkYywgMHgyMCwgMHgxYywgMHgwNSwgMHhhOSwgMHgyYiwgMHgxYywgMHhmZiwgMHhmNywgCisweDIxLCAweGZjLCAweDAwLCAweDI4LCAweDA1LCAweGQwLCAweDAxLCAweGE4LCAweDAwLCAweDc4LCAweDQwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MDEsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDcsIDB4NDksIDB4MDAsIDB4OTgsIDB4ZmYsIDB4ZjcsIAorMHgwNiwgMHhmYywgMHgwMCwgMHgyMSwgMHgwMSwgMHhhOCwgMHhmZiwgMHhmNywgMHg0ZiwgMHhmZCwgMHgwMSwgMHgyMCwgCisweDQ3LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAKKzB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4MWIsIDB4ZmUsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHhmMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHgwNywgMHgxYywgMHhmYywgMHg4OCwgMHgyNSwgMHg0ZCwgCisweDY4LCAweDY4LCAweDAxLCAweDMwLCAweDY5LCAweDQ2LCAweDY4LCAweDYwLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4ZjUsIDB4ZmQsIDB4MTAsIDB4MmMsIDB4MDgsIDB4ZDMsIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIAorMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgMHgxNywgMHhlMCwgCisweDc4LCAweDc4LCAweDgyLCAweDAwLCAweGZiLCAweDFkLCAweDA5LCAweDMzLCAweDAwLCAweDIwLCAweGI5LCAweDY4LCAKKzB4MDAsIDB4MmEsIDB4MTUsIDB4ZDksIDB4NDAsIDB4Y2IsIDB4MGYsIDB4MWMsIAorMHgwMSwgMHgzMSwgMHhiZSwgMHg0MiwgMHgwZCwgMHhkMCwgMHgwMCwgMHhhYSwgMHgxMiwgMHg3OCwgMHg0MCwgMHgyMywgCisweDFhLCAweDQzLCAweDAwLCAweGFiLCAweDFhLCAweDcwLCAweDA0LCAweDIyLCAweGRhLCAweDgwLCAweDAyLCAweDkwLCAKKzB4MDMsIDB4OTEsIDB4MDQsIDB4MzMsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4MTUsIDB4ZTAsIDB4MDEsIDB4MzAsIAorMHg5MCwgMHg0MiwgMHhlOSwgMHhkMywgMHgwMCwgMHhhYiwgMHg1YywgMHg3MCwgMHgwMiwgMHg5NCwgMHg2OSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAzLCAweDkxLCAweGEyLCAweDAwLCAweDAwLCAweDIwLCAweDEwLCAweDMzLCAweDAwLCAweDJhLCAKKzB4MDUsIDB4ZDksIDB4MGYsIDB4MWMsIDB4ODAsIDB4YzMsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzEsIDB4OTAsIDB4NDIsIAorMHhmOSwgMHhkMywgMHg2OCwgMHg0NiwgMHgwNCwgMHhhOSwgMHhmZiwgMHhmNywgMHhmNywgMHhmYywgMHgwMSwgMHgyMCwgCisweDQ2LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDljLCAweDAzLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MjMsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDEsIDB4MjEsIDB4NDIsIDB4MDksIDB4MDAsIDB4ZDMsIAorMHgwMCwgMHgyMSwgMHgwMCwgMHgyNywgMHgzYSwgMHgxYywgMHg0MywgMHgwYiwgMHgwMCwgMHhkMiwgMHgwMiwgMHgyMiwgCisweDExLCAweDQzLCAweDFlLCAweDRhLCAweDIwLCAweDI0LCAweGQzLCAweDY4LCAweDAxLCAweDJiLCAweDJlLCAweGQxLCAKKzB4ODAsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjQsIDB4MGMsIDB4NDMsIDB4MjAsIDB4MWMsIDB4MWIsIDB4MjMsIAorMHhkYiwgMHgwMSwgMHhkMSwgMHgxOCwgMHg4OSwgMHg4YiwgMHgwOSwgMHgwYiwgMHgwMCwgMHhkMiwgMHgwNCwgMHgyNywgCisweDM4LCAweDQzLCAweGQxLCAweDZmLCAweDA5LCAweDY4LCAweDA5LCAweDBhLCAweDA3LCAweGQyLCAweGQxLCAweDFkLCAKKzB4NzksIDB4MzEsIDB4MDksIDB4NjgsIDB4MDksIDB4NjgsIDB4MDksIDB4MGEsIDB4MDEsIDB4ZDMsIDB4MDgsIDB4MjMsIAorMHgxOCwgMHg0MywgMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgMHhkMSwgMHgxOCwgMHg4OSwgMHg3OSwgMHgwMywgMHgyOSwgCisweDAyLCAweGQxLCAweGZmLCAweDIzLCAweDAxLCAweDMzLCAweDE4LCAweDQzLCAweDBiLCAweDQ5LCAweDA5LCAweDZhLCAKKzB4MTAsIDB4MjIsIDB4NGIsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjIsIDB4MTAsIDB4NDMsIDB4ODksIDB4MDcsIAorMHg4OSwgMHgwZiwgMHg4OSwgMHgwMSwgMHgwOCwgMHg0MywgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHg0MCwgMHgwYywgCisweDAwLCAweGQyLCAweDAwLCAweDI0LCAweDBjLCAweDQzLCAweDIwLCAweDFjLCAweGVjLCAweGU3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIAorMHhmMCwgMHhiNSwgMHgzYSwgMHg0YywgMHgyMCwgMHgxYywgMHgwNCwgMHhmMCwgMHgwNywgMHhmYSwgMHgzOSwgMHg0OCwgCisweGUzLCAweDIzLCAweDFiLCAweDAxLCAweGM3LCAweDE4LCAweGI5LCAweDc5LCAweDM3LCAweDRlLCAweGM1LCAweDFkLCAKKzB4NzksIDB4MzUsIDB4MDYsIDB4MjksIDB4NjIsIDB4ZDIsIDB4MDIsIDB4YTMsIDB4NWIsIDB4NWMsIDB4NWIsIDB4MDAsIAorMHg5ZiwgMHg0NCwgMHgwMCwgMHgxYywgMHgwMywgMHgwZSwgMHgxZSwgMHgzNywgMHg0ZSwgMHg1NSwgMHgwMSwgMHgyMCwgCisweGI4LCAweDcxLCAweDAwLCAweDIwLCAweGIwLCAweDYwLCAweGZmLCAweGY3LCAweDk1LCAweGZmLCAweDA1LCAweDIzLCAKKzB4OTgsIDB4NDMsIDB4MDAsIDB4ZjAsIDB4NmYsIDB4ZjgsIDB4MGMsIDB4ZTAsIDB4ZmYsIDB4ZjcsIDB4OGUsIDB4ZmYsIAorMHhjMCwgMHgwOCwgMHgwNiwgMHhkMywgMHhiMCwgMHg2OCwgMHg0MSwgMHgxYywgMHhiMSwgMHg2MCwgMHgwYSwgMHgyOCwgCisweDAzLCAweGQ5LCAweDA0LCAweDIwLCAweDAwLCAweGUwLCAweDAyLCAweDIwLCAweGI4LCAweDcxLCAweDY0LCAweDIyLCAKKzB4MjAsIDB4MWMsIDB4MmIsIDB4ZTAsIDB4MDYsIDB4MWMsIDB4YzAsIDB4NmYsIDB4ODAsIDB4MjMsIDB4MDEsIDB4NjgsIAorMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwMywgMHgyMCwgMHhiOCwgMHg3MSwgMHgyMCwgMHgxYywgMHgyMCwgMHg0YSwgCisweDAwLCAweDIxLCAweDA0LCAweGYwLCAweDk5LCAweGY5LCAweGYwLCAweDZmLCAweDA0LCAweDIzLCAweDAxLCAweDY4LCAKKzB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MjgsIDB4NjgsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwNSwgMHgyMSwgMHhiOSwgMHg3MSwgMHgyOSwgMHg2OCwgCisweDA0LCAweDIzLCAweDBhLCAweDY4LCAweDlhLCAweDQzLCAweDBhLCAweDYwLCAweGMwLCAweDZmLCAweDAxLCAweDY4LCAKKzB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZmYsIDB4ZjcsIDB4NWEsIDB4ZmYsIDB4MDgsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHhmMCwgMHgzNCwgMHhmOCwgMHgyMCwgMHgxYywgMHgxMCwgMHg0YSwgMHgwMCwgMHgyMSwgMHgwNCwgMHhmMCwgCisweDc3LCAweGY5LCAweGU1LCAweGU3LCAweGZmLCAweGY3LCAweDRlLCAweGZmLCAweDA0LCAweDIzLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4ZjAsIDB4MjgsIDB4ZjgsIDB4ZGUsIDB4ZTcsIDB4MDAsIDB4MjAsIDB4MjksIDB4NjgsIDB4NjAsIDB4MjMsIAorMHgwYSwgMHg2OCwgMHg5YSwgMHg0MywgMHgwYSwgMHg2MCwgMHhmZiwgMHhmNywgMHhlMywgMHhmYSwgMHhkNSwgMHhlNywgCisweDA2LCAweDIwLCAweGI4LCAweDcxLCAweGQyLCAweGU3LCAweDAwLCAweDAwLCAweGE5LCAweDc5LCAweDIxLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OWMsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MzAsIDB4NzUsIDB4MDAsIDB4MDAsIAorMHgxMCwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNSwgMHgwMCwgMHgyMCwgCisweDA0LCAweDQ5LCAweGMwLCAweDQ2LCAweDg4LCAweDcxLCAweDA0LCAweDQ4LCAweDAxLCAweDIyLCAweDAwLCAweDIxLCAKKzB4MDQsIDB4ZjAsIDB4NGUsIDB4ZjksIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTgsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhhOSwgMHg3OSwgMHgyMSwgMHg0MCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgMHgzMSwgMHg0OCwgMHgwMCwgMHg2OCwgCisweDc5LCAweDA4LCAweDAzLCAweGQzLCAweDEwLCAweDIzLCAweDAxLCAweDFjLCAweDk5LCAweDQzLCAweDAxLCAweGUwLCAKKzB4MTAsIDB4MjEsIDB4MDEsIDB4NDMsIDB4MmQsIDB4NGMsIDB4ZTIsIDB4NjgsIDB4MDEsIDB4MmEsIDB4MDUsIDB4ZDEsIAorMHgyMiwgMHg3OSwgMHgwMCwgMHgyYSwgMHgwMiwgMHhkMCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwMiwgMHgxOSwgMHg0MywgCisweDgxLCAweDQyLCAweDAyLCAweGQwLCAweDAxLCAweDIwLCAweDAwLCAweDA1LCAweDAxLCAweDYwLCAweGUwLCAweDY4LCAKKzB4MDEsIDB4MjgsIDB4MjAsIDB4ZDEsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZTAsIDB4MTgsIDB4ODAsIDB4OGIsIAorMHhmOSwgMHgwOCwgMHgwNCwgMHhkMywgMHgwMSwgMHgyMywgMHhkYiwgMHgwMiwgMHgwMSwgMHgxYywgMHg5OSwgMHg0MywgCisweDAxLCAweGUwLCAweDAxLCAweDIxLCAweGM5LCAweDAyLCAweDgxLCAweDQyLCAweDAyLCAweGQwLCAweDAwLCAweDIwLCAKKzB4MDIsIDB4ZjAsIDB4MWEsIDB4ZmIsIDB4MzgsIDB4MDksIDB4MDcsIDB4ZDMsIDB4ZTAsIDB4NmYsIDB4ODAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHg5OSwgMHg0MywgMHgwMSwgMHg2MCwgMHhlMCwgMHgxOCwgMHgwMCwgMHg2OCwgMHgwMCwgMHhlMCwgCisweGUwLCAweDZmLCAweDgwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDE1LCAweDQ4LCAKKzB4MDEsIDB4NmEsIDB4NzgsIDB4MDksIDB4MDMsIDB4ZDMsIDB4ZmYsIDB4MjAsIDB4MDEsIDB4MzAsIDB4MDgsIDB4NDMsIAorMHgwMywgMHhlMCwgMHhmZiwgMHgyMywgMHgwOCwgMHgxYywgMHgwMSwgMHgzMywgMHg5OCwgMHg0MywgMHg4MCwgMHgwOCwgCisweDgwLCAweDAwLCAweGJhLCAweDA5LCAweDkyLCAweDA3LCAweDkyLCAweDBmLCAweDEwLCAweDQzLCAweDg4LCAweDQyLCAKKzB4MDIsIDB4ZDAsIDB4MGMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjIsIDB4ZTEsIDB4NjgsIDB4MDEsIDB4MjksIAorMHgwOCwgMHhkMSwgMHg3OSwgMHgwYSwgMHgwNiwgMHhkMywgMHhmZiwgMHgyMywgMHgwNCwgMHgzMywgMHgxOCwgMHg0MCwgCisweDAzLCAweDI4LCAweDAxLCAweGQxLCAweGZmLCAweGY3LCAweDhlLCAweGZmLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhjMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg4MCwgMHhiNSwgMHhmZiwgMHhmNywgCisweGIxLCAweGZlLCAweDgwLCAweDA5LCAweDFiLCAweGQyLCAweDBmLCAweDQ4LCAweGUzLCAweDIzLCAweDFiLCAweDAxLCAKKzB4YzEsIDB4MTgsIDB4NGEsIDB4NzksIDB4MDAsIDB4MmEsIDB4MTQsIDB4ZDEsIDB4MDEsIDB4MjIsIDB4NGEsIDB4NzEsIAorMHgwMCwgMHgyNywgMHg4MCwgMHgzMCwgMHgwMCwgMHg2OCwgMHg2MCwgMHgyMywgMHgwMSwgMHg2OCwgMHg5OSwgMHg0MywgCisweDAxLCAweDYwLCAweDA4LCAweDQ4LCAweDA2LCAweGUwLCAweDAyLCAweDIwLCAweDAyLCAweGYwLCAweDhjLCAweGZjLCAKKzB4MDcsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4NWIsIDB4ZmMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MzYsIDB4ZmEsIAorMHhmNSwgMHhlNywgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGY0LCAweDAxLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4MzcsIDB4ZmMsIDB4ZmYsIDB4ZjcsIDB4ODUsIDB4ZmUsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4MDgsIDB4NDgsIAorMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHgwNywgMHg0OCwgMHgwMCwgMHg2YSwgMHhjMCwgMHg0NiwgCisweDAzLCAweDkwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweDY3LCAweGZiLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIAorMHhjMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgMHg2OSwgMHg0NiwgCisweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDE3LCAweGZjLCAweGY4LCAweDg4LCAweGZmLCAweGY3LCAweDQyLCAweGZmLCAKKzB4ZmYsIDB4ZjcsIDB4NjIsIDB4ZmUsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHg0YywgMHhmYiwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweGIwLCAweGI1LCAweGM2LCAweGIwLCAweGM3LCAweDg4LCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4MDEsIDB4ZmMsIDB4MDEsIDB4MjQsIDB4MWEsIDB4NGIsIDB4OWYsIDB4NDIsIDB4MGEsIDB4ZDksIDB4MDAsIDB4YTgsIAorMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgCisweGQ4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDIwLCAweGUwLCAweDE0LCAweDQ4LCAweGZmLCAweGY3LCAKKzB4ZTEsIDB4ZjksIDB4MDUsIDB4MWMsIDB4MTMsIDB4NGEsIDB4MzgsIDB4MWMsIDB4MDQsIDB4YTksIDB4ZmYsIDB4ZjcsIAorMHhkZCwgMHhmOSwgMHgxMiwgMHg0OSwgMHgyOCwgMHgxYywgMHhmZiwgMHhmNywgMHhkOCwgMHhmOSwgMHgwMSwgMHgyZiwgCisweDA2LCAweGQxLCAweDBjLCAweGE5LCAweDAwLCAweDIwLCAweDAwLCAweDIyLCAKKzB4MGEsIDB4NjAsIDB4MDEsIDB4MzAsIDB4MTAsIDB4MjgsIDB4ZmIsIDB4ZDMsIDB4MTAsIDB4MjAsIDB4MDAsIDB4YWIsIAorMHg1OCwgMHg3MCwgMHgwNCwgMHg5OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHgwNSwgMHg5OCwgMHhjMCwgMHg0NiwgCisweDAzLCAweDkwLCAweDY4LCAweDQ2LCAweDA2LCAweGE5LCAweGZmLCAweGY3LCAweDBmLCAweGZiLCAweDIwLCAweDFjLCAKKzB4NDYsIDB4YjAsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZmYsIDB4MDEsIDB4MDAsIDB4MDAsIAorMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgMHg5ZCwgMHhhZiwgMHgyMSwgMHg0MCwgMHgzYywgMHgwMiwgMHhmZiwgMHhmZiwgCisweGYwLCAweGI1LCAweGM2LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4YmIsIDB4ZmIsIDB4ZmMsIDB4ODgsIDB4NzgsIDB4NzgsIDB4MDEsIDB4MjUsIDB4MTAsIDB4MjgsIDB4MDEsIDB4ZDEsIAorMHgxOSwgMHgyYywgMHgwOSwgMHhkOSwgMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgCisweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDAyLCAweDIwLCAweGQ4LCAweDgwLCAweDA0LCAweDMzLCAweDI3LCAweGUwLCAKKzB4YjgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDQsIDB4OTAsIDB4ZjgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDUsIDB4OTAsIAorMHgwNiwgMHhhYSwgMHhmYiwgMHgxZCwgMHgwOSwgMHgzMywgMHgwMCwgMHgyMSwgMHg3OCwgMHg3OCwgMHgwMCwgMHgyOCwgCisweDBkLCAweGRkLCAweDAwLCAweDIwLCAweDQwLCAweGNiLCAweDQwLCAweGMyLCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAKKzB4MDAsIDB4MGMsIDB4MDQsIDB4MjgsIDB4ZjgsIDB4ZGIsIDB4NDgsIDB4MWMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHg3OCwgMHg3OCwgMHg4OCwgMHg0MiwgMHhmMSwgMHhkYywgMHgwYiwgMHg0OCwgMHhmZiwgMHhmNywgMHg3ZSwgMHhmOSwgCisweDA3LCAweDFjLCAweDBhLCAweDRhLCAweDIwLCAweDFjLCAweDA0LCAweGE5LCAweGZmLCAweGY3LCAweDdhLCAweGY5LCAKKzB4MDgsIDB4NDksIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NzUsIDB4ZjksIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHhiZSwgMHhmYSwgMHgyOCwgMHgxYywgMHg0NiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAweGM1LCAweGFmLCAweDIxLCAweDQwLCAKKzB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4ZjAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDQsIDB4MWMsIDB4MDAsIDB4MjcsIAorMHhlNiwgMHg4OCwgMHhhMiwgMHg2OCwgMHg0NywgMHg0OSwgMHgwOCwgMHg3OSwgMHgwMCwgMHgyOCwgMHgwOCwgMHhkMCwgCisweDAwLCAweDJlLCAweDAxLCAweGQwLCAweDAxLCAweDJlLCAweDAxLCAweGQxLCAweDAxLCAweDI3LCAweDAxLCAweGUwLCAKKzB4MDQsIDB4MmUsIDB4MDAsIDB4ZDEsIDB4MDMsIDB4MjYsIDB4MDEsIDB4MjUsIDB4NDEsIDB4NDgsIDB4MDUsIDB4MmUsIAorMHg2NiwgMHhkMiwgMHgwMiwgMHhhMywgMHg5YiwgMHg1ZCwgMHg1YiwgMHgwMCwgMHg5ZiwgMHg0NCwgMHgwMCwgMHgxYywgCisweDAzLCAweDA2LCAweDA4LCAweDBjLCAweDEwLCAweDAwLCAweDA1LCAweDgwLCAweDAwLCAweDIzLCAweDAzLCAweGUwLCAKKzB4MDUsIDB4ODAsIDB4MDUsIDB4ZTAsIDB4MDAsIDB4MjMsIDB4MDMsIDB4ODAsIDB4NDMsIDB4ODAsIDB4MDYsIDB4ZTAsIAorMHgwMCwgMHgyMywgMHgwMywgMHg4MCwgMHg0NSwgMHg4MCwgMHgwMiwgMHhlMCwgMHhmZiwgMHgyMywgMHgwMSwgMHgzMywgCisweDAzLCAweDgwLCAweGNiLCAweDFkLCAweDc5LCAweDMzLCAweDllLCAweDg5LCAweDAxLCAweDIzLCAweDViLCAweDAyLCAKKzB4OWUsIDB4NDIsIDB4MDIsIDB4ZGIsIDB4ZDIsIDB4MDcsIDB4ZDIsIDB4MGYsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MjIsIAorMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhjOSwgMHgxOCwgMHg4OSwgMHg4OCwgMHhmZiwgMHgyMywgMHhlMSwgMHgzMywgCisweDk5LCAweDQzLCAweDAxLCAweDIzLCAweDE5LCAweDQzLCAweDA2LCAweDg4LCAweGZmLCAweDMzLCAweDllLCAweDQyLCAKKzB4MGQsIDB4ZDEsIDB4ZmYsIDB4MjAsIDB4ZTEsIDB4MzAsIDB4MDgsIDB4NDMsIDB4MDAsIDB4MmEsIDB4MDQsIDB4ZDEsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwMiwgMHg5OCwgMHg0MywgMHgwMSwgMHgxYywgMHgyMCwgMHhlMCwgMHgwMSwgMHgyMSwgCisweDg5LCAweDAyLCAweDAxLCAweDQzLCAweDFjLCAweGUwLCAweDAxLCAweDJlLCAweDBhLCAweGQxLCAweDQwLCAweDg4LCAKKzB4MDEsIDB4MjgsIDB4MDQsIDB4ZDEsIDB4NjAsIDB4MjMsIDB4MTksIDB4NDMsIDB4MDAsIDB4MmEsIDB4MTMsIDB4ZDAsIAorMHgwYywgMHhlMCwgMHgyMCwgMHgyMywgMHgxOSwgMHg0MywgMHgwZiwgMHhlMCwgMHgwMCwgMHgyZSwgMHgwZCwgMHhkMSwgCisweDQwLCAweDg4LCAweDAxLCAweDI4LCAweDA4LCAweGQxLCAweGZmLCAweDIzLCAweDgxLCAweDMzLCAweDE5LCAweDQzLCAKKzB4MDAsIDB4MmEsIDB4MDUsIDB4ZDAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4MTksIDB4NDMsIDB4MDEsIDB4ZTAsIAorMHg4MCwgMHgyMywgMHgxOSwgMHg0MywgMHgwNCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg3NSwgMHhmOSwgMHgwOSwgMHgyMSwgCisweDQ5LCAweDAyLCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweDcwLCAweGY5LCAweDAwLCAweDJmLCAweDAyLCAweGQxLCAKKzB4MDAsIDB4MjAsIDB4MTIsIDB4ZTAsIDB4ZmYsIDB4ZTcsIDB4NjksIDB4NDYsIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHhlZiwgMHhmYSwgMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgCisweDE4LCAweDcwLCAweDAyLCAweDIwLCAweGQ4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDA0LCAweDMzLCAKKzB4ZmYsIDB4ZjcsIDB4MjIsIDB4ZmEsIDB4MjgsIDB4MWMsIDB4MDQsIDB4YjAsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDg4LCAweDFjLCAweDAwLCAweDgwLCAweGMwLCAweDg4LCAweDUxLCAweDIxLCAweDg5LCAweDAzLCAweDA4LCAweDYyLCAKKzB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4ODAsIDB4YjUsIDB4MTYsIDB4NGYsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MjgsIAorMHgwNywgMHhkMSwgMHgzNywgMHgyMywgMHg5YiwgMHgwMSwgMHhmOCwgMHgxOCwgMHg0MCwgMHg4YSwgMHg4MCwgMHgyMSwgCisweDAxLCAweDQzLCAweDFiLCAweDIwLCAweDA3LCAweGUwLCAweDZkLCAweDIzLCAweDViLCAweDAxLCAweGY4LCAweDE4LCAKKzB4ODAsIDB4OGIsIDB4MDEsIDB4MjEsIDB4NDksIDB4MDMsIDB4MDEsIDB4NDMsIDB4MTAsIDB4MjAsIDB4MDIsIDB4ZjAsIAorMHgzMywgMHhmOSwgMHgwMSwgMHgyMCwgMHg3MSwgMHgyMywgMHg1YiwgMHgwMSwgMHhmOSwgMHgxOCwgMHgwOCwgMHg4MCwgCisweDQ4LCAweDgwLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGY4LCAweDE4LCAweDgwLCAweDhiLCAweDAxLCAweDIzLCAKKzB4MWIsIDB4MDMsIDB4OTgsIDB4NDMsIDB4NDEsIDB4MjEsIDB4MDksIDB4MDIsIDB4MDEsIDB4NDMsIDB4MDAsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHgyMCwgMHhmOSwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDE3LCAweDRmLCAweGY4LCAweDY4LCAweDAxLCAweDI4LCAKKzB4MDgsIDB4ZDEsIDB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjgsIDB4MTgsIDB4NDAsIDB4OGEsIDB4ODAsIDB4MjMsIAorMHg5OCwgMHg0MywgMHgwMSwgMHgxYywgMHgxYiwgMHgyMCwgMHgwOCwgMHhlMCwgMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgCisweGY4LCAweDE4LCAweDgwLCAweDhiLCAweDAxLCAweDIzLCAweDViLCAweDAzLCAweDk4LCAweDQzLCAweDAxLCAweDFjLCAKKzB4MTAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4MDEsIDB4ZjksIDB4ZmYsIDB4MjAsIDB4NzEsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHhmOSwgMHgxOCwgMHgwMSwgMHgzMCwgMHgwOCwgMHg4MCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhmOCwgMHgxOCwgCisweDgwLCAweDhiLCAweDQxLCAweDIzLCAweDFiLCAweDAyLCAweDk4LCAweDQzLCAweDA5LCAweDIxLCAweDQ5LCAweDAyLCAKKzB4MDEsIDB4NDMsIDB4MDAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4ZWUsIDB4ZjgsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweDA4LCAweDQ5LCAweGNmLCAweDZhLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAweDY5LCAweGZhLCAweGI4LCAweDA1LCAKKzB4ODAsIDB4MGQsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIAorMHhhMSwgMHhmOSwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweDAwLCAweDE0LCAweDQwLCAweGMwLCAweDg4LCAweDlmLCAweDIzLCAweDE4LCAweDQwLCAweDA1LCAweDQ5LCAKKzB4YzksIDB4NmEsIDB4MWIsIDB4MjMsIDB4NWIsIDB4MDEsIDB4MTksIDB4NDAsIDB4MDgsIDB4NDMsIDB4MDMsIDB4NDksIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg2MiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDQwLCAweDAwLCAweDE0LCAweDAwLCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAweDBkLCAweDQ5LCAweDBmLCAweDZhLCAKKzB4MDEsIDB4MmYsIDB4MDEsIDB4ZDEsIDB4ZmYsIDB4MDMsIDB4MDcsIDB4ZTAsIDB4MDIsIDB4MmYsIDB4MDEsIDB4ZDEsIAorMHgzZiwgMHgwMywgMHgwMywgMHhlMCwgMHgwMCwgMHgyZiwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyNywgMHhmZiwgMHgwMiwgCisweDY5LCAweDQ2LCAweGZmLCAweGY3LCAweDM1LCAweGZhLCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4NmYsIDB4ZjksIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgyMCwgMHgxNCwgMHg0MCwgMHhjMiwgMHg4OCwgMHhhMSwgMHgyMCwgCisweDQwLCAweDAzLCAweDAwLCAweDIxLCAweDAxLCAweDIzLCAweDViLCAweDAzLCAweDlhLCAweDQyLCAweDAxLCAweGQxLCAKKzB4MDIsIDB4MjIsIDB4MDQsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDMsIDB4OWEsIDB4NDIsIDB4MDIsIDB4ZDEsIAorMHgwMSwgMHgyMiwgMHgwMiwgMHg2MiwgMHgwMCwgMHhlMCwgMHgwMSwgMHg2MiwgMHgwOCwgMHgxYywgMHg3MCwgMHg0NywgCisweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDAyLCAweGYwLCAweDlmLCAweGY4LCAweDY5LCAweDQ2LCAKKzB4MDQsIDB4MWMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MGEsIDB4ZmEsIDB4MDEsIDB4YWIsIDB4NWMsIDB4ODAsIAorMHgwOSwgMHg0ZiwgMHhmOCwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgCisweGZmLCAweGY3LCAweDQwLCAweGY5LCAweGY4LCAweDZkLCAweGMwLCAweDA3LCAweGMwLCAweDBmLCAweDA1LCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4YzgsIDB4NjIsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg2OCwgMHgxYywgMHgwMCwgMHg4MCwgCisweGMwLCAweDg4LCAweDAyLCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDYxLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIAorMHhlMywgMHhmOSwgMHgwNiwgMHg0OCwgMHhjMCwgMHg2OCwgMHgwMSwgMHhhYiwgCisweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweDFiLCAweGY5LCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDgwLCAweDAwLCAweDE0LCAweDAwLCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAweDY5LCAweDQ2LCAweDg3LCAweDY4LCAKKzB4ZmYsIDB4ZjcsIDB4YzYsIDB4ZjksIDB4MjAsIDB4MmYsIDB4MDcsIDB4ZDIsIDB4NzgsIDB4MDAsIDB4MGMsIDB4NDksIAorMHg0MCwgMHgxOCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4MCwgMHg4YiwgMHgwNiwgMHhlMCwgCisweDAwLCAweGE4LCAweDAwLCAweDc4LCAweDQwLCAweDIzLCAweDE4LCAweDQzLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAKKzB4MDIsIDB4MjAsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIAorMHhlZiwgMHhmOCwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweGMxLCAweDg4LCAweDgyLCAweDY4LCAKKzB4MjAsIDB4MmEsIDB4MDQsIDB4ZDIsIDB4MTAsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MTcsIDB4ZjgsIDB4MDAsIDB4MjAsIAorMHgxMCwgMHhlMCwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg5YSwgMHhmOSwgMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgCisweDQwLCAweDIzLCAweDE4LCAweDQzLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDAyLCAweDIwLCAweGQ4LCAweDgwLCAKKzB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4MDQsIDB4MzMsIDB4ZmYsIDB4ZjcsIDB4Y2QsIDB4ZjgsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHhjNywgMHg4OCwgCisweDY5LCAweDQ2LCAweGZmLCAweGY3LCAweDgzLCAweGY5LCAweDEwLCAweDQ4LCAweGZlLCAweGY3LCAweDcyLCAweGZmLCAKKzB4MDIsIDB4MjAsIDB4MzksIDB4MWMsIDB4MDIsIDB4ZjAsIDB4ZjIsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MDYsIDB4ZDAsIAorMHgwMiwgMHgyMCwgMHgzOSwgMHgxYywgMHgwMiwgMHhmMCwgMHgzNiwgMHhmZiwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgCisweDAyLCAweGUwLCAweDQ1LCAweDIwLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDA3LCAweDQ5LCAweDIwLCAweDFjLCAKKzB4ZmUsIDB4ZjcsIDB4NWYsIDB4ZmYsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4YTgsIDB4ZjgsIAorMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDI0LCAweDAyLCAweGZmLCAweGZmLCAweDNjLCAweDAyLCAweGZmLCAweGZmLCAweGIwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4YzcsIDB4ODgsIDB4NjksIDB4NDYsIDB4ODQsIDB4NjgsIDB4ZmYsIDB4ZjcsIDB4NTcsIDB4ZjksIDB4MTAsIDB4NDgsIAorMHhmZSwgMHhmNywgMHg0NiwgMHhmZiwgMHgwZiwgMHg0YSwgMHgwMiwgMHgyMCwgMHgzOSwgMHgxYywgMHhmZSwgMHhmNywgCisweDQzLCAweGZmLCAweDAwLCAweDI4LCAweDA2LCAweGQwLCAweDBkLCAweDRiLCAweDAyLCAweDIwLCAweDM5LCAweDFjLCAKKzB4MjIsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4M2MsIDB4ZmYsIDB4MDIsIDB4ZTAsIDB4NDUsIDB4MjAsIDB4MDAsIDB4YWIsIAorMHgxOCwgMHg3MCwgMHgwOSwgMHg0OSwgMHgyOCwgMHgxYywgMHhmZSwgMHhmNywgMHgzMiwgMHhmZiwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZmLCAweGY3LCAweDdiLCAweGY4LCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweGIwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjQsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4NTksIDB4YjEsIDB4MjEsIDB4NDAsIAorMHg1OSwgMHhiMCwgMHgyMSwgMHg0MCwgMHgzYywgMHgwMiwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHhmZiwgMHhmNywgCisweDQzLCAweGY5LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDgwLCAweGI0LCAKKzB4YzIsIDB4ODgsIDB4MTksIDB4NGIsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIDB4MDAsIDB4MmEsIDB4MDMsIDB4ZDEsIAorMHgxOCwgMHg2YiwgMHgxMCwgMHgyMywgMHg5OCwgMHg0MywgMHgwNCwgMHhlMCwgMHgwMSwgMHgyYSwgMHgwNCwgMHhkMSwgCisweDE4LCAweDZiLCAweDEwLCAweDIzLCAweDE4LCAweDQzLCAweDQ4LCAweDYxLCAweDFmLCAweGUwLCAweDAyLCAweDJhLCAKKzB4MWQsIDB4ZDEsIDB4YzIsIDB4NjgsIDB4ODcsIDB4NjgsIDB4MDAsIDB4MjAsIDB4M2IsIDB4MWMsIDB4YzMsIDB4NDAsIAorMHhkYiwgMHgwNywgMHhkYiwgMHgwZiwgMHg5YiwgMHgwMiwgMHgwMywgMHg0MywgMHgwYiwgMHg2MSwgMHgwMSwgMHgzMCwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDIwLCAweDI4LCAweGYzLCAweGRiLCAweDAwLCAweDIwLCAweDEzLCAweDFjLCAKKzB4YzMsIDB4NDAsIDB4ZGIsIDB4MDcsIDB4ZGIsIDB4MGYsIDB4OWIsIDB4MDIsIDB4YzcsIDB4MWQsIDB4MTksIDB4MzcsIAorMHgzYiwgMHg0MywgMHgwYiwgMHg2MSwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgyMCwgMHgyOCwgCisweGYxLCAweGRiLCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweDAwLCAweDE0LCAweDQwLCAKKzB4ODAsIDB4YjQsIDB4YzIsIDB4ODgsIDB4ODEsIDB4NjgsIDB4MTAsIDB4MDIsIDB4MTIsIDB4MGEsIDB4MTAsIDB4NDMsIAorMHgwMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgwYywgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg2MCwgMHgwYywgMHg0YiwgCisweGMwLCAweDQ2LCAweDFhLCAweDgwLCAweDBhLCAweDBjLCAweDE3LCAweDAyLCAKKzB4MTIsIDB4MTIsIDB4M2EsIDB4NDMsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4NDIsIDB4NjAsIDB4NWEsIDB4ODAsIAorMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwYSwgMHgwMiwgMHgwOSwgMHgwYSwgMHgxMSwgMHg0MywgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDgxLCAweDYwLCAweDk5LCAweDgwLCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4NDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MjgsIDB4MWIsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjUsIDB4ODQsIDB4YjAsIAorMHgxMywgMHg0OSwgMHgwYSwgMHg2OCwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgxMywgMHgwMiwgMHgxMiwgMHgxMiwgCisweDEzLCAweDQzLCAweDRhLCAweDY4LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDFmLCAweDFjLCAweDEzLCAweDAyLCAKKzB4MTIsIDB4MTIsIDB4MTMsIDB4NDMsIDB4ODksIDB4NjgsIDB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MGEsIDB4MDIsIAorMHgwOSwgMHgxMiwgMHgxMSwgMHg0MywgMHgwYywgMHgwNCwgMHgyNCwgMHgwYywgMHg2OSwgMHg0NiwgMHgxZCwgMHgxYywgCisweGZmLCAweGY3LCAweGFlLCAweGY4LCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAweDI4LCAweDA0LCAweDIwLCAweDQzLCAKKzB4MDIsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4ZTUsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHhiMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweGMxLCAweDg4LCAweDgyLCAweDY4LCAweDA4LCAweDAyLCAweDA5LCAweDBhLCAweDA4LCAweDQzLCAweDAwLCAweDA0LCAKKzB4MDAsIDB4MGMsIDB4MGEsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MTAsIDB4MGMsIDB4MDMsIDB4MDIsIAorMHgwMCwgMHgxMiwgMHgxOCwgMHg0MywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOCwgMHg2MSwgMHgxMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDAyLCAweDAyLCAweDAwLCAweDBhLCAweDEwLCAweDQzLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAKKzB4NDgsIDB4NjEsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MTQsIDB4MDAsIAorMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgxNiwgMHg0YiwgMHhkOSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgCisweDBhLCAweDAyLCAweDA5LCAweDEyLCAweDExLCAweDQzLCAweDFhLCAweDY5LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAKKzB4MTcsIDB4MDIsIDB4MTIsIDB4MTIsIDB4M2EsIDB4NDMsIDB4NWIsIDB4NjksIDB4MWIsIDB4MDQsIDB4MWIsIDB4MGMsIAorMHgxZiwgMHgwMiwgMHgxYiwgMHgxMiwgMHgzYiwgMHg0MywgMHgxZiwgMHgwNCwgMHgzZiwgMHgwYywgMHgwNSwgMHgyMywgCisweDAwLCAweDkzLCAweDg0LCAweDg4LCAweDAxLCAweGFiLCAweDFjLCAweDgwLCAweDAwLCAweDI0LCAweDA0LCAweDNiLCAKKzB4NWMsIDB4NzAsIDB4NDAsIDB4ODgsIDB4MDAsIDB4YWIsIDB4NTgsIDB4ODAsIDB4ZDksIDB4ODAsIDB4MTAsIDB4MDQsIAorMHgzOCwgMHg0MywgMHgwMiwgMHg5MCwgMHgwMywgMHg5NCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgCisweDk1LCAweGZmLCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIDB4MDAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MGIsIDB4NDksIDB4OGEsIDB4NmEsIAorMHgwNSwgMHgyMSwgMHgwMCwgMHg5MSwgMHg4MSwgMHg4OCwgMHgwMSwgMHhhYiwgMHgxOSwgMHg4MCwgMHgwMCwgMHgyMSwgCisweDA0LCAweDNiLCAweDU5LCAweDcwLCAweDQwLCAweDg4LCAweDAwLCAweGFiLCAweDU4LCAweDgwLCAweGRhLCAweDgwLCAKKzB4MDIsIDB4OTEsIDB4MDMsIDB4OTEsIDB4NjgsIDB4NDYsIDB4ZmUsIDB4ZjcsIDB4NzksIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweGMwLCAweDg4LCAweDAyLCAweDQ5LCAweGMwLCAweDQ2LCAweDg4LCAweDYyLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4YzAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MGIsIDB4NDksIDB4MGEsIDB4NmEsIAorMHgwNSwgMHgyMSwgMHgwMCwgMHg5MSwgMHg4MSwgMHg4OCwgMHgwMSwgMHhhYiwgMHgxOSwgMHg4MCwgMHgwMCwgMHgyMSwgCisweDA0LCAweDNiLCAweDU5LCAweDcwLCAweDQwLCAweDg4LCAweDAwLCAweGFiLCAweDU4LCAweDgwLCAweGRhLCAweDgwLCAKKzB4MDIsIDB4OTEsIDB4MDMsIDB4OTEsIDB4NjgsIDB4NDYsIDB4ZmUsIDB4ZjcsIDB4NTUsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHgwNCwgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweGMwLCAweDg4LCAweDAyLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYyLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4YzAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4YjUsIDB4YzAsIDB4ODgsIDB4MDIsIDB4NDksIDB4ZmUsIDB4ZjcsIAorMHhmNCwgMHhmZCwgMHgwMCwgMHgyMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3NSwgMHgwMiwgMHhmZiwgMHhmZiwgCisweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDY5LCAweDQ2LCAweGZlLCAweGY3LCAweGY3LCAweGZmLCAweDA2LCAweDQ4LCAKKzB4MDAsIDB4NmIsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIAorMHgyZiwgMHhmZiwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweGZkLCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZjgsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhmMywgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDA3LCAweDFjLCAweDEwLCAweDQ4LCAweGZlLCAweGY3LCAweGM2LCAweGZkLCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDIsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MjEsIAorMHgwYywgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMSwgMHg3MSwgMHgwYywgMHg0OCwgMHgwMiwgMHg2OCwgMHg1MiwgMHgwYywgCisweDA1LCAweGQyLCAweDAyLCAweDY4LCAweDEyLCAweDBjLCAweDA2LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAKKzB4MDMsIDB4ZDMsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YzcsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4MDcsIDB4NDgsIAorMHhjMCwgMHg0NiwgMHgwNywgMHg2NCwgMHgwOCwgMHgxYywgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGQ1LCAweDk0LCAweDIxLCAweDQwLCAweDI4LCAweDBmLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4MDEsIDB4MjAsIAorMHgwMywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MiwgMHgxMiwgMHgyMCwgMHhmZiwgMHhmNywgMHhjYiwgMHhmZiwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDg4LCAweDFjLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweDIwLCAKKzB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIDB4NDgsIDB4NzIsIDB4MTUsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4YmYsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgwMSwgMHhmMCwgCisweGY5LCAweGZmLCAweDAxLCAweDIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4MDcsIDB4MWMsIDB4ZjgsIDB4ODgsIDB4MDIsIDB4ZjAsIDB4ZmUsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MGMsIDB4ZDEsIAorMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZSwgMHhmNywgMHg4MiwgMHhmZiwgMHgwNiwgMHg0OCwgMHgwMSwgMHhhYiwgCisweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweGJiLCAweGZlLCAweDAxLCAweDIwLCAKKzB4MDAsIDB4ZTAsIDB4MDAsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHhmZSwgMHhmNywgCisweDZkLCAweGZmLCAweDAxLCAweDI3LCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAweDA5LCAweDQ4LCAweDgxLCAweDg5LCAKKzB4MDksIDB4MDQsIDB4YzIsIDB4ODksIDB4MTEsIDB4NDMsIDB4MDIsIDB4OTEsIDB4ODEsIDB4ODgsIDB4MDksIDB4MDQsIAorMHhjMCwgMHg4OCwgMHgwOCwgMHg0MywgMHgwMywgMHg5MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgCisweDliLCAweGZlLCAweDM4LCAweDFjLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NjksIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg2NCwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDVmLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAKKzB4ZmUsIDB4ZjcsIDB4NWEsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIAorMHg1NSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg1MCwgMHhmZiwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDRiLCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NDYsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg0MSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweGZlLCAweGY3LCAweDNjLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAKKzB4MzcsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4MzIsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHg4YywgMHhiMCwgMHgwOCwgMHhhOSwgMHhmZSwgMHhmNywgCisweDEzLCAweGZmLCAweDY5LCAweDQ2LCAweDA4LCAweGE4LCAweDAyLCAweGYwLCAweGE5LCAweGZmLCAweDAyLCAweDIwLCAKKzB4MDgsIDB4YWIsIDB4NTgsIDB4NzAsIDB4NjksIDB4NDYsIDB4MDgsIDB4YTgsIDB4ZmUsIDB4ZjcsIDB4NDgsIDB4ZmUsIAorMHgwMSwgMHgyMCwgMHgwYywgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgCisweDE5LCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAKKzB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4ZjgsIDB4ZmUsIDB4ZmEsIDB4ODgsIDB4MTIsIDB4NDksIAorMHgwMSwgMHgyNCwgMHhjOCwgMHgxZCwgMHg4OSwgMHgzMCwgMHgwMCwgMHgyYSwgMHgwZiwgMHhkMCwgMHgwNCwgMHg3MCwgCisweDQ0LCAweDcwLCAweGI4LCAweDY4LCAweDAwLCAweDBjLCAweDgwLCAweDMxLCAweGM4LCAweDgyLCAweGI4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4ODMsIDB4ZjgsIDB4NjgsIDB4MDAsIDB4MGMsIDB4NDgsIDB4ODMsIDB4ZjgsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg4OCwgMHg4MywgMHgwMiwgMHhlMCwgMHgwMCwgMHgyMSwgCisweDAxLCAweDcwLCAweDQxLCAweDcwLCAweDA2LCAweDQ4LCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4MTcsIDB4ZmUsIDB4MjAsIDB4MWMsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDAwLCAweGI1LCAweGZlLCAweGY3LCAweGUzLCAweGZlLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAKKzB4ZmUsIDB4ZjcsIDB4ZGUsIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIAorMHhkOSwgMHhmZSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhkNCwgMHhmZSwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweGNmLCAweGZlLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIDB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIAorMHhmZSwgMHhmNywgMHhhZSwgMHhmZSwgMHhmOCwgMHg4OCwgMHgwMywgMHgyNCwgMHhlNCwgMHgwNCwgMHgwNCwgMHg0MywgCisweDAzLCAweDIzLCAweGRiLCAweDA0LCAweDljLCAweDQyLCAweDAyLCAweGQzLCAweDBmLCAweDRiLCAweDljLCAweDQyLCAKKzB4MDYsIDB4ZDksIDB4MGYsIDB4NDgsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZSwgMHhmNywgMHhkYywgMHhmZCwgMHgwMSwgMHgyMCwgMHg4MCwgMHgwNywgMHgyMCwgMHg0MywgMHgwMCwgMHg2OCwgCisweDAwLCAweDIxLCAweDAwLCAweGFiLCAweDU5LCAweDcwLCAweGZhLCAweDg4LCAweGMwLCAweDQ2LCAweGRhLCAweDgwLCAKKzB4MDIsIDB4OTAsIDB4MDMsIDB4OTEsIDB4NjgsIDB4NDYsIDB4MDQsIDB4MzMsIDB4ZmUsIDB4ZjcsIDB4Y2MsIDB4ZmQsIAorMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweGUwLCAweDAwLCAweDE4LCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4MDcsIDB4MWMsIDB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4N2IsIDB4ZmUsIDB4ZjgsIDB4ODgsIAorMHgwMywgMHgyMywgMHhkYiwgMHgwNCwgMHgxOCwgMHg0MywgMHg5OCwgMHg0MiwgMHgwMiwgMHhkMywgMHgwYSwgMHg0YiwgCisweDk4LCAweDQyLCAweDA4LCAweGQ5LCAweDA5LCAweDQ4LCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4YWIsIDB4ZmQsIDB4MDEsIDB4MjAsIDB4MDMsIDB4ZTAsIDB4YjksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMSwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGUwLCAweDAwLCAweDE4LCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4ODAsIDB4YjUsIDB4ODYsIDB4YjAsIDB4MDIsIDB4YTksIDB4ZmUsIDB4ZjcsIDB4NTcsIDB4ZmUsIDB4MDEsIDB4MjcsIAorMHgwMiwgMHhhYiwgMHg1ZiwgMHg3MCwgMHgwMCwgMHgyMCwgMHhkOCwgMHg4MCwgMHgwYSwgMHg0OCwgMHg0MSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA0LCAweDkxLCAweDgxLCAweDY4LCAweGMwLCAweDQ2LCAweDA1LCAweDkxLCAweGMxLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4NDAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDEsIDB4OTAsIDB4NjksIDB4NDYsIAorMHgwMiwgMHhhOCwgMHhmZSwgMHhmNywgMHg4MSwgMHhmZCwgMHgzOCwgMHgxYywgMHgwNiwgMHhiMCwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDE5LCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweGMxLCAweDY4LCAKKzB4ODAsIDB4NjgsIDB4ZmUsIDB4ZjcsIDB4NDcsIDB4ZmIsIDB4MDAsIDB4MjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgCisweDY4LCAweDQ2LCAweDUwLCAweDIxLCAweGZlLCAweGY3LCAweDM2LCAweGZlLCAweDAxLCAweGFiLCAweDVjLCAweDgwLCAKKzB4MDIsIDB4OTcsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4NjEsIDB4ZmQsIDB4MDQsIDB4YjAsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgCisweDY4LCAweDQ2LCAweDUxLCAweDIxLCAweGZlLCAweGY3LCAweDI0LCAweGZlLCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAKKzB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4NTAsIDB4ZmQsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDAwLCAweDI3LCAweDEyLCAweDQ5LCAweDA5LCAweDY4LCAweDEyLCAweDRhLCAKKzB4MTIsIDB4NmIsIDB4MTAsIDB4MjMsIDB4MWEsIDB4NDAsIDB4MDEsIDB4MjQsIDB4MDAsIDB4MmEsIDB4MDAsIDB4ZDAsIAorMHgwMSwgMHgyNywgMHg4YSwgMHgwYywgMHgwMywgMHhkMywgMHgzYSwgMHgwNCwgMHgxMiwgMHgwYywgMHgwMiwgMHgyNywgCisweDE3LCAweDQzLCAweGM5LCAweDBjLCAweDAzLCAweGQzLCAweDM5LCAweDA0LCAweDA5LCAweDBjLCAweDA0LCAweDI3LCAKKzB4MGYsIDB4NDMsIDB4NjksIDB4NDYsIDB4ZmUsIDB4ZjcsIDB4ZWMsIDB4ZmQsIDB4MDEsIDB4YWIsIDB4NWYsIDB4ODAsIAorMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgMHgyNiwgMHhmZCwgMHgyMCwgMHgxYywgMHgwNCwgMHhiMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4MDAsIDB4YjUsIDB4ODQsIDB4YjAsIAorMHg2OSwgMHg0NiwgMHhmZSwgMHhmNywgMHhkNywgMHhmZCwgMHgwNiwgMHg0OCwgMHhjMCwgMHg2ZCwgMHgwMSwgMHhhYiwgCisweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDBmLCAweGZkLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhkZCwgMHhmZCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3MCwgMHg0NywgCisweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhjYiwgMHhmZCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDgwLCAweGI1LCAweDg1LCAweGIwLCAweDAxLCAweGE5LCAweGZlLCAweGY3LCAweGFiLCAweGZkLCAweDAwLCAweDIwLCAKKzB4MDEsIDB4YWIsIDB4NTgsIDB4NzAsIDB4MGMsIDB4NDksIDB4YzksIDB4NjgsIDB4MDEsIDB4MjcsIDB4MDEsIDB4MjksIAorMHgwMiwgMHhkMSwgMHgwMywgMHg5NywgMHgwNCwgMHg5NywgMHgwMSwgMHhlMCwgMHgwMywgMHg5NywgMHgwNCwgMHg5MCwgCisweDY4LCAweDQ2LCAweDAxLCAweGYwLCAweDMzLCAweGZkLCAweDAyLCAweGFiLCAweDAwLCAweDk4LCAweGMwLCAweDQ2LCAKKzB4NTgsIDB4ODAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4YTgsIDB4ZmUsIDB4ZjcsIDB4ZDMsIDB4ZmMsIDB4MzgsIDB4MWMsIAorMHgwNSwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDA0LCAweDQ5LCAweDAwLCAweDIwLCAweDAwLCAweDIyLCAweDBhLCAweDcwLCAweDAxLCAweDMwLCAKKzB4MDEsIDB4MzEsIDB4NjgsIDB4MjgsIDB4ZmEsIDB4ZDMsIDB4NzAsIDB4NDcsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHgyMiwgMHg4OCwgMHg0MiwgMHgwMywgMHhkMywgMHg0MCwgMHgxYSwgMHgwMSwgMHgzMiwgMHg4OCwgMHg0MiwgCisweGZiLCAweGQyLCAweDEwLCAweDFjLCAweDcwLCAweDQ3LCAweDg4LCAweDQyLCAweDAyLCAweGQzLCAweDQwLCAweDFhLCAKKzB4ODgsIDB4NDIsIDB4ZmMsIDB4ZDIsIDB4NzAsIDB4NDcsIDB4OTAsIDB4YjQsIDB4MDEsIDB4MWMsIDB4ZmYsIDB4MjcsIAorMHgwNCwgMHgyOSwgMHgyNywgMHhkYSwgMHgwMCwgMHgyMCwgMHgxNCwgMHg0YSwgMHg0MywgMHgwMCwgMHgxYiwgMHgxOCwgCisweGRiLCAweDAwLCAweGQ0LCAweDU4LCAweDYzLCAweDBjLCAweDFhLCAweGQyLCAweDRiLCAweDAwLCAweDU5LCAweDE4LCAKKzB4YzksIDB4MDAsIDB4NTcsIDB4NTgsIDB4NDMsIDB4MDAsIDB4MWIsIDB4MTgsIDB4ZGIsIDB4MDAsIDB4ZDcsIDB4NTAsIAorMHg4OSwgMHgxOCwgMHg5YSwgMHgxOCwgMHg0ZiwgMHg2OCwgMHhjMCwgMHg0NiwgMHg1NywgMHg2MCwgMHg4YiwgMHg2OCwgCisweGMwLCAweDQ2LCAweDkzLCAweDYwLCAweDBiLCAweDY5LCAweGMwLCAweDQ2LCAweDEzLCAweDYxLCAweDRiLCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4NTMsIDB4NjEsIDB4YzksIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZDEsIDB4NjAsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgwNCwgMHgyOCwgMHhkOSwgMHhkYiwgCisweDM4LCAweDFjLCAweGY2LCAweGU3LCAweDQwLCAweGFiLCAweDIwLCAweDQwLCAweGY3LCAweGI1LCAweGM0LCAweGIwLCAKKzB4MDQsIDB4MWMsIDB4MDAsIDB4MjAsIDB4NDYsIDB4OWEsIDB4MTEsIDB4MjEsIDB4MTEsIDB4NDAsIDB4NmUsIDB4ZDAsIAorMHgwMCwgMHgyNywgMHg3OSwgMHgwMCwgMHhjOSwgMHgxOSwgMHhjOSwgMHgwMCwgMHg1NywgMHg0YSwgMHg1MSwgMHg1OCwgCisweDQ5LCAweDBjLCAweDAzLCAweGQyLCAweDAxLCAweDMwLCAweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDA0LCAweGUwLCAKKzB4NzksIDB4MWMsIDB4MGYsIDB4MDYsIDB4M2YsIDB4MGUsIDB4MDQsIDB4MmYsIDB4ZWYsIDB4ZGIsIDB4MDAsIDB4MjgsIAorMHg1YiwgMHhkMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHgyMiwgMHgwMCwgMHg5MiwgMHg0MCwgMHgyMywgMHgwMCwgMHgyMSwgCisweDAwLCAweDIwLCAweDAyLCAweGFhLCAweDAwLCAweGYwLCAweDg4LCAweGZhLCAweDA0LCAweGE5LCAweDAwLCAweDIwLCAKKzB4ODIsIDB4MDAsIDB4OGEsIDB4NTgsIDB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4YTIsIDB4NDIsIDB4MDMsIDB4ZDEsIAorMHg3MiwgMHgxYywgMHgxNiwgMHgwNiwgMHgzNiwgMHgwZSwgMHgwNCwgMHhlMCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgCisweDAwLCAweDBlLCAweDEwLCAweDI4LCAweGYwLCAweGRiLCAweDAwLCAweDJlLCAweDNkLCAweGQwLCAweDA0LCAweDJjLCAKKzB4M2UsIDB4ZDEsIDB4ODAsIDB4MDAsIDB4MDgsIDB4NTgsIDB4NDAsIDB4MDEsIDB4ODAsIDB4MGQsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHg5MiwgMHgxMCwgMHgyMywgMHgwMCwgMHgyMSwgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgMHg2OCwgMHhmYSwgCisweDAwLCAweDIxLCAweDAxLCAweDkxLCAweDAyLCAweGE4LCAweDA1LCAweDk5LCAweDQ5LCAweDBjLCAweDg5LCAweDA1LCAKKzB4MjksIDB4ZDAsIDB4YzEsIDB4NjgsIDB4MGEsIDB4MDYsIDB4MTIsIDB4MGUsIDB4NDUsIDB4OWIsIDB4OWEsIDB4NDIsIAorMHgxMSwgMHhkMSwgMHhjMCwgMHg2OCwgMHg0MCwgMHgwMSwgMHg4NiwgMHgwZCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg5MiwgCisweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDMwLCAweDFjLCAweDAyLCAweGFhLCAweDAwLCAweGYwLCAweDUwLCAweGZhLCAKKzB4MDEsIDB4OTksIDB4MDIsIDB4OWQsIDB4NDgsIDB4MWMsIDB4MDEsIDB4MDYsIAorMHgwOSwgMHgwZSwgMHgwMSwgMHg5MSwgMHgwZSwgMHhlMCwgMHg0OCwgMHgwMSwgMHg4NiwgMHgwZCwgMHgwMCwgMHgyMiwgCisweDAwLCAweDkyLCAweDEwLCAweDIzLCAweDAwLCAweDIxLCAweDMwLCAweDFjLCAweDAyLCAweGFhLCAweDAwLCAweGYwLCAKKzB4M2YsIDB4ZmEsIDB4MDIsIDB4YTgsIDB4MDUsIDB4OTksIDB4NDksIDB4MGMsIDB4ODksIDB4MDUsIDB4ZDgsIDB4ZDEsIAorMHgwMSwgMHg5OSwgMHgwMCwgMHgyOSwgMHgwZiwgMHhkMSwgMHhmZiwgMHgyMCwgMHgzZCwgMHhlMCwgMHg0MCwgMHhlMCwgCisweDgwLCAweDAwLCAweDA4LCAweDU4LCAweDQwLCAweDAxLCAweDg2LCAweDBkLCAweDAwLCAweDIyLCAweDAwLCAweDkyLCAKKzB4MGMsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MzAsIDB4MWMsIDB4MDIsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4MjgsIDB4ZmEsIAorMHgwMiwgMHg5ZCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgwNCwgMHg0NiwgMHg5YSwgMHgxMCwgMHg0MywgMHg3OSwgMHgwMCwgCisweGM5LCAweDE5LCAweGM5LCAweDAwLCAweDE3LCAweDRhLCAweGMwLCAweDQ2LCAweDUwLCAweDUwLCAweDMwLCAweDFjLCAKKzB4OGUsIDB4MTgsIDB4NzAsIDB4NjAsIDB4MTAsIDB4MjAsIDB4MDQsIDB4MmMsIDB4MDAsIDB4ZDAsIDB4MGMsIDB4MjAsIAorMHgwNCwgMHgxYywgMHhiMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMSwgMHg0NiwgMHg5YSwgMHgxMSwgMHg0MCwgCisweDIwLCAweDI5LCAweDAwLCAweGQwLCAweDI4LCAweDFjLCAweDMwLCAweDYxLCAweDI4LCAweDE5LCAweGZmLCAweDIxLCAKKzB4ZmYsIDB4MzAsIDB4MDgsIDB4MzAsIDB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4MTksIDB4ZmYsIDB4NDMsIDB4MDEsIAorMHgxOCwgMHgxOCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHg3MCwgMHg2MSwgMHgwMCwgMHgyMCwgMHg1MCwgMHgyMSwgCisweDQ2LCAweDlhLCAweDExLCAweDQwLCAweDUwLCAweDI5LCAweDAwLCAweGQxLCAweDI4LCAweDFjLCAweGYwLCAweDYwLCAKKzB4MzgsIDB4MWMsIDB4NDcsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZmYsIDB4MjAsIAorMHhmOSwgMHhlNywgMHgwMCwgMHgwMCwgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHg4MCwgMHhiNCwgMHgwMCwgMHgyMywgCisweDAwLCAweDIyLCAweDAwLCAweDI5LCAweDA2LCAweGQ5LCAweDg3LCAweDVjLCAweDdiLCAweDQwLCAweDFiLCAweDA2LCAKKzB4MWIsIDB4MGUsIDB4MDEsIDB4MzIsIDB4OGEsIDB4NDIsIDB4ZjgsIDB4ZDMsIDB4ZDgsIDB4NDMsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHhmMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHgwNCwgMHgyOCwgCisweDA3LCAweGRhLCAweDQxLCAweDAwLCAweDA5LCAweDE4LCAweGM5LCAweDAwLCAweDQ1LCAweDkxLCAweDQxLCAweDRhLCAKKzB4NTEsIDB4NTgsIDB4NGIsIDB4MGMsIDB4MDIsIDB4ZDIsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4NzYsIDB4ZTAsIAorMHgwMSwgMHgyMywgMHg1YiwgMHgwNCwgMHgxOSwgMHg0MCwgMHg0MywgMHgwMCwgMHgxOCwgMHgxOCwgMHhjMCwgMHgwMCwgCisweDNhLCAweDRhLCAweDE0LCAweDE4LCAweDAwLCAweDI5LCAweDYxLCAweGQwLCAweDAwLCAweDIxLCAweDAyLCAweDkxLCAKKzB4MjAsIDB4NjksIDB4YTEsIDB4NjgsIDB4NDUsIDB4MTgsIDB4MzAsIDB4ZDAsIDB4ZmYsIDB4MjEsIDB4NjgsIDB4MWUsIAorMHgwOSwgMHgzMSwgMHhmZiwgMHhmNywgMHhjZCwgMHhmZSwgMHg2MSwgMHg2OCwgMHg0MCwgMHgxOCwgMHgwMSwgMHg5MCwgCisweDAxLCAweDk4LCAweDgxLCAweDQyLCAweDAyLCAweGQxLCAweGE2LCAweDY4LCAweGFmLCAweDFiLCAweDA5LCAweGUwLCAKKzB4MDAsIDB4MjYsIDB4ZmYsIDB4MjEsIDB4MjgsIDB4MWMsIDB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4YzcsIDB4ZmUsIAorMHgwNywgMHgxYywgMHgwMSwgMHhkMSwgMHhmZiwgMHgyNywgMHgwOSwgMHgzNywgMHgwMCwgMHgyMiwgMHgwMCwgMHg5MiwgCisweDAxLCAweDk4LCAweDMxLCAweDFjLCAweDAzLCAweGFhLCAweDNiLCAweDFjLCAweDAwLCAweGYwLCAweDllLCAweGY5LCAKKzB4MDMsIDB4YTgsIDB4MzksIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4YWMsIDB4ZmYsIDB4YzAsIDB4NDMsIDB4MDIsIDB4OTksIAorMHg0OCwgMHg0MCwgMHgwMSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwMiwgMHg5MSwgMHhlZCwgMHgxYiwgMHhhMCwgMHg2OCwgCisweGE4LCAweDQyLCAweDAwLCAweGQxLCAweDAwLCAweDI1LCAweDAwLCAweDJkLCAweGNlLCAweGQ4LCAweDAyLCAweDk5LCAKKzB4Y2YsIDB4NDMsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIDB4MGMsIDB4MjMsIDB4MDAsIDB4MjEsIDB4NjAsIDB4NjgsIAorMHgwMywgMHhhYSwgMHgwMCwgMHhmMCwgMHg4MywgMHhmOSwgMHgyMCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwMywgMHg5MCwgCisweDA1LCAweDk4LCAweDAwLCAweDBhLCAweDAwLCAweDAyLCAweDM5LCAweDA2LCAweDA5LCAweDBlLCAweDA4LCAweDQzLCAKKzB4MDUsIDB4OTAsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4OTgsIDB4NDMsIDB4MDUsIDB4OTAsIDB4MGMsIDB4MjEsIAorMHgwMywgMHhhOCwgMHhmZiwgMHhmNywgMHg4MywgMHhmZiwgMHhmZiwgMHgyMywgMHgxYiwgMHgwMiwgMHgwNSwgMHg5OSwgCisweDk5LCAweDQzLCAweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDAwLCAweDAyLCAweDA4LCAweDQzLCAweDA1LCAweDkwLCAKKzB4MGMsIDB4MjMsIDB4MDAsIDB4MjEsIDB4NjAsIDB4NjgsIDB4MDMsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4Y2EsIDB4ZjksIAorMHgwMCwgMHgyMCwgMHg0NSwgMHg5OSwgMHgwNiwgMHg0YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg1MCwgMHhjMSwgMHg0MywgCisweDYxLCAweDYwLCAweGExLCAweDYwLCAweGUxLCAweDYwLCAweDIxLCAweDYxLCAweDYxLCAweDYxLCAweDQ2LCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHhiMCwgMHhiNCwgMHg0YywgMHg0MiwgMHgwMCwgMHgyOSwgMHgwMCwgMHhkYiwgCisweDBjLCAweDFjLCAweDAwLCAweDI3LCAweGZmLCAweDQzLCAweDA0LCAweDI4LCAweDIxLCAweGRhLCAweDEyLCAweDRkLCAKKzB4NDMsIDB4MDAsIDB4MTgsIDB4MTgsIDB4YzAsIDB4MDAsIDB4NDAsIDB4MTksIDB4MDEsIDB4MmEsIDB4MDUsIDB4ZDAsIAorMHgwMiwgMHgyYSwgMHgwOSwgMHhkMCwgMHgwMywgMHgyYSwgMHgxNiwgMHhkMSwgMHgwMSwgMHg2OSwgMHgwYiwgMHhlMCwgCisweDAwLCAweDI5LCAweDEyLCAweGRiLCAweDAyLCAweDY5LCAweDhhLCAweDQyLCAweDBmLCAweGQzLCAweDA1LCAweGUwLCAKKzB4MDAsIDB4MjksIDB4MDcsIDB4ZGEsIDB4YzEsIDB4NjgsIDB4YTEsIDB4NDIsIDB4MDksIDB4ZDMsIDB4MDksIDB4MWIsIAorMHhjMSwgMHg2MCwgMHhjMCwgMHg2OCwgMHhiMCwgMHhiYywgMHg3MCwgMHg0NywgMHhjMSwgMHg2OCwgMHgwOSwgMHgxOSwgCisweDAyLCAweDY5LCAweDkxLCAweDQyLCAweGY2LCAweGQ5LCAweDM4LCAweDFjLCAweGY2LCAweGU3LCAweDAwLCAweDAwLCAKKzB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIDB4ZjAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MTcsIDB4MWMsIDB4MGQsIDB4MWMsIAorMHgwMCwgMHgyMSwgMHgwMiwgMHg5MSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgxOCwgMHhkMiwgMHgwMCwgMHgyYywgMHg0OSwgCisweDhiLCAweDU4LCAweDFiLCAweDA2LCAweDFiLCAweDBlLCAweDAxLCAweDkzLCAweDAwLCAweDIzLCAweGRiLCAweDQzLCAKKzB4MDQsIDB4MjgsIDB4MDIsIDB4ZGEsIDB4MDEsIDB4OTgsIDB4NDAsIDB4MDgsIDB4MDEsIDB4ZDIsIDB4MTgsIDB4MWMsIAorMHg0NiwgMHhlMCwgMHg1NCwgMHgxOCwgMHhlMCwgMHg2OCwgMHhjMiwgMHgxOSwgMHgyMSwgMHg2OSwgMHg4YSwgMHg0MiwgCisweDAwLCAweGQ5LCAweDBmLCAweDFhLCAweDAwLCAweDJmLCAweDNjLCAweGQ5LCAweGEwLCAweDY4LCAweGUxLCAweDY4LCAKKzB4NDAsIDB4MTgsIDB4ZmYsIDB4MjEsIDB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4MGQsIDB4ZmUsIDB4NjEsIDB4NjgsIAorMHg0NiwgMHgxOCwgMHhhMCwgMHg2OCwgMHhlMSwgMHg2OCwgMHg0MCwgMHgxOCwgMHhmZiwgMHgyMSwgMHgwOSwgMHgzMSwgCisweGZmLCAweGY3LCAweDBkLCAweGZlLCAweGMyLCAweDE5LCAweGZmLCAweDIxLCAweDA5LCAweDMxLCAweDhhLCAweDQyLCAKKzB4MTQsIDB4ZDksIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MGIsIDB4MWEsIDB4MDMsIDB4OTMsIAorMHgwMSwgMHgxYywgMHgzMCwgMHgxYywgMHgyYSwgMHgxYywgMHgwMCwgMHhmMCwgMHhlMSwgMHhmOCwgMHhlMCwgMHg2OCwgCisweDAzLCAweDliLCAweGMwLCAweDE4LCAweGUwLCAweDYwLCAweDAzLCAweDliLCAweDVkLCAweDE5LCAweGZmLCAweDFhLCAKKzB4MDIsIDB4OTgsIDB4MTgsIDB4MTgsIDB4MDIsIDB4OTAsIDB4MTAsIDB4ZTAsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIAorMHgwMCwgMHg5MiwgMHgwMSwgMHgxYywgMHgzMCwgMHgxYywgMHgyYSwgMHgxYywgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgCisweGNkLCAweGY4LCAweGUwLCAweDY4LCAweGMwLCAweDE5LCAweGVkLCAweDE5LCAweGUwLCAweDYwLCAweDAyLCAweDk4LCAKKzB4YzAsIDB4MTksIDB4MDIsIDB4OTAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MmYsIDB4YzIsIDB4ZDgsIDB4MDIsIDB4OTgsIAorMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgCisweGYwLCAweGI1LCAweDgzLCAweGIwLCAweDE3LCAweDFjLCAweDBkLCAweDFjLCAweDAwLCAweDIxLCAweDAxLCAweDkxLCAKKzB4NDIsIDB4MDAsIDB4MTIsIDB4MTgsIDB4ZDIsIDB4MDAsIDB4MDIsIDB4OTIsIDB4MzAsIDB4NDksIDB4OGEsIDB4NTgsIAorMHgxMiwgMHgwNiwgMHgxMiwgMHgwZSwgMHgwMCwgMHgyNCwgMHhlNCwgMHg0MywgMHgwNCwgMHgyOCwgMHgwMSwgMHhkYSwgCisweDUwLCAweDA5LCAweDAxLCAweGQyLCAweDIwLCAweDFjLCAweDUxLCAweGUwLCAweDAyLCAweDlhLCAweDU0LCAweDE4LCAKKzB4ZTAsIDB4NjgsIDB4YzIsIDB4MTksIDB4NjAsIDB4NjksIDB4ODIsIDB4NDIsIDB4MDEsIDB4ZDksIDB4MjIsIDB4NjksIAorMHg4NywgMHgxYSwgMHgwMCwgMHgyZiwgMHg0NSwgMHhkOSwgMHgyNSwgMHg0ZSwgMHhhMCwgMHg2OCwgMHhlMSwgMHg2OCwgCisweDQwLCAweDE4LCAweGZmLCAweDIxLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweGE3LCAweGZkLCAweDYxLCAweDY4LCAKKzB4NDAsIDB4MTgsIDB4MDAsIDB4OTAsIDB4YTAsIDB4NjgsIDB4ZTEsIDB4NjgsIDB4NDAsIDB4MTgsIDB4ZmYsIDB4MjEsIAorMHgwOSwgMHgzMSwgMHhmZiwgMHhmNywgMHhhNiwgMHhmZCwgMHgwMiwgMHg5YSwgMHhiMSwgMHg1OCwgMHgwMSwgMHgyMywgCisweDViLCAweDA0LCAweDE5LCAweDQzLCAweGIxLCAweDUwLCAweGMxLCAweDE5LCAweGZmLCAweDIyLCAweDA5LCAweDMyLCAKKzB4OTEsIDB4NDIsIDB4MTMsIDB4ZDksIDB4MTMsIDB4MWEsIDB4MDEsIDB4MWMsIDB4MDAsIDB4OTgsIDB4MmEsIDB4MWMsIAorMHgxZSwgMHgxYywgMHgwMCwgMHhmMCwgMHhkZiwgMHhmOCwgMHhlMCwgMHg2OCwgMHg4MCwgMHgxOSwgMHg3NSwgMHgxOSwgCisweGUwLCAweDYwLCAweDIxLCAweDY5LCAweDg4LCAweDQyLCAweDAwLCAweGQ5LCAweDIwLCAweDYxLCAweGJmLCAweDFiLCAKKzB4MDEsIDB4OTgsIDB4MzAsIDB4MTgsIDB4MDEsIDB4OTAsIDB4MTIsIDB4ZTAsIDB4MDEsIDB4MWMsIDB4MDAsIDB4OWUsIAorMHgzMCwgMHgxYywgMHgyYSwgMHgxYywgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgMHhjYiwgMHhmOCwgMHhlMCwgMHg2OCwgCisweGMwLCAweDE5LCAweGVkLCAweDE5LCAweGUwLCAweDYwLCAweDIxLCAweDY5LCAweDg4LCAweDQyLCAweDAwLCAweGQ5LCAKKzB4MjAsIDB4NjEsIDB4MDEsIDB4OTgsIDB4YzAsIDB4MTksIDB4MDEsIDB4OTAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MmYsIAorMHhiOSwgMHhkOCwgMHgwMSwgMHg5OCwgMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweGFiLCAweDIwLCAweDQwLCAweGIwLCAweGI1LCAweGMzLCAweGIwLCAKKzB4MGMsIDB4MWMsIDB4MDAsIDB4MjcsIDB4ZmEsIDB4NDMsIDB4MDQsIDB4MjgsIDB4MDYsIDB4ZGEsIDB4NDEsIDB4MDAsIAorMHgwOSwgMHgxOCwgMHhjOSwgMHgwMCwgMHgxNCwgMHg0OCwgMHg0NSwgMHg1OCwgMHg2YiwgMHgwYywgMHgwNCwgMHhkMiwgCisweDEwLCAweDFjLCAweDQzLCAweGIwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDYyLCAweDA5LCAKKzB4MWIsIDB4ZDMsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIDB4MDgsIDB4MTgsIDB4NDAsIDB4NjgsIDB4MGMsIDB4MjMsIAorMHgwMCwgMHgyMSwgMHgwMSwgMHhhYSwgMHgwMCwgMHhmMCwgMHgzMCwgMHhmOCwgMHgxMSwgMHgyYywgMHgwZCwgMHhkMCwgCisweDEyLCAweDJjLCAweDBkLCAweGQwLCAweDEzLCAweDJjLCAweDA1LCAweGQwLCAweDE0LCAweDJjLCAweDBhLCAweGQxLCAKKzB4MDMsIDB4OTgsIDB4MDAsIDB4MDQsIDB4MDcsIDB4MGUsIDB4MDYsIDB4ZTAsIDB4MDMsIDB4OTgsIDB4MDcsIDB4MDYsIAorMHgzZiwgMHgwZSwgMHgwMiwgMHhlMCwgMHgwMSwgMHg5ZiwgMHgwMCwgMHhlMCwgMHgwMiwgMHg5ZiwgMHgzOCwgMHgxYywgCisweGRiLCAweGU3LCAweDAwLCAweDAwLCAweDQwLCAweGFiLCAweDIwLCAweDQwLCAweDAzLCAweDQ5LCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MjIsIDB4MGEsIDB4NTQsIDB4MDEsIDB4MzAsIDB4NjAsIDB4MjgsIDB4ZmIsIDB4ZDMsIDB4NzAsIDB4NDcsIAorMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHgwMCwgMHhiNSwgMHgwMiwgMHhmMCwgMHg2ZiwgMHhmYSwgMHg1NywgMHgyMCwgCisweDAyLCAweGYwLCAweGNjLCAweGY5LCAweDAyLCAweGYwLCAweDQwLCAweGY5LCAweDAwLCAweDBhLCAweGZiLCAweGQzLCAKKzB4MDIsIDB4ZjAsIDB4NGUsIDB4ZmEsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4ODIsIDB4YjAsIAorMHgwNywgMHg5ZCwgMHgxNCwgMHgxYywgMHgxZiwgMHgxYywgMHgzMCwgMHg0YSwgMHhkMiwgMHg2ZiwgMHgyMCwgMHgyMywgCisweDE2LCAweDY4LCAweDllLCAweDQzLCAweDE2LCAweDYwLCAweDMzLCAweDFjLCAweGZmLCAweDIyLCAweDAxLCAweDMyLCAKKzB4MmEsIDB4NDAsIDB4NDAsIDB4MDIsIDB4MDgsIDB4NDMsIDB4MDUsIDB4MGEsIDB4MDYsIDB4MWMsIDB4MDAsIDB4MGMsIAorMHgwMSwgMHg5MCwgMHgwMCwgMHgyYSwgMHgyMCwgMHhkMCwgMHgwMiwgMHhmMCwgMHg0YiwgMHhmYSwgMHg1MywgMHgyMCwgCisweDAyLCAweGYwLCAweGE4LCAweGY5LCAweDAxLCAweDk4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweDAyLCAweGYwLCAKKzB4YTMsIDB4ZjksIDB4MjgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4YTAsIDB4ZjksIDB4MzAsIDB4MWMsIDB4MDIsIDB4ZjAsIAorMHg5ZCwgMHhmOSwgMHgwMiwgMHhmMCwgMHgyMywgMHhmYSwgMHhmZiwgMHhmNywgMHhjNywgMHhmZiwgMHgwMiwgMHhmMCwgCisweDM3LCAweGZhLCAweDU0LCAweDIwLCAweDAyLCAweGYwLCAweDk0LCAweGY5LCAweDAwLCAweDk4LCAweDAyLCAweGYwLCAKKzB4OTEsIDB4ZjksIDB4MjgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4OGUsIDB4ZjksIDB4MzAsIDB4MWMsIDB4MTQsIDB4ZTAsIAorMHgwMiwgMHhmMCwgMHgyYSwgMHhmYSwgMHg1MiwgMHgyMCwgMHgwMiwgMHhmMCwgMHg4NywgMHhmOSwgMHgwMSwgMHg5OCwgCisweDAyLCAweGYwLCAweDg0LCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweDgxLCAweGY5LCAweDMwLCAweDFjLCAKKzB4MDIsIDB4ZjAsIDB4N2UsIDB4ZjksIDB4MDAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4N2IsIDB4ZjksIDB4MDAsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHg3OCwgMHhmOSwgMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg3NSwgMHhmOSwgMHgwMCwgMHgyMCwgCisweDAyLCAweGYwLCAweDcyLCAweGY5LCAweDAwLCAweDJmLCAweDA1LCAweGQ5LCAweDAyLCAweGYwLCAweGU0LCAweGY4LCAKKzB4MjAsIDB4NzAsIDB4MDEsIDB4MzQsIDB4MDEsIDB4M2YsIDB4ZjksIDB4ZDEsIDB4MDIsIDB4ZjAsIDB4ZjAsIDB4ZjksIAorMHgwNCwgMHg0YSwgMHhkMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgCisweDAyLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjUsIDB4ODIsIDB4YjAsIDB4MTQsIDB4MWMsIDB4MWYsIDB4MWMsIDB4NDIsIDB4MDIsIDB4MGEsIDB4NDMsIAorMHgxNSwgMHgxYywgMHgwMSwgMHgyOCwgMHg1NCwgMHhkMCwgMHgyYywgMHg0OSwgMHhjOCwgMHg2ZiwgMHgyMCwgMHgyMywgCisweDAyLCAweDY4LCAweDlhLCAweDQzLCAweDAyLCAweDYwLCAweGM4LCAweDZmLCAweDQwLCAweDIzLCAweDAxLCAweDY4LCAKKzB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDIsIDB4ZjAsIDB4ZTYsIDB4ZjksIDB4NTMsIDB4MjAsIDB4MDIsIDB4ZjAsIAorMHg0MywgMHhmOSwgMHgyOCwgMHgwYywgMHgwNiwgMHgxYywgMHgwMiwgMHhmMCwgMHgzZiwgMHhmOSwgMHgyOCwgMHgwYSwgCisweDAxLCAweDkwLCAweDAwLCAweDkwLCAweDAyLCAweGYwLCAweDNhLCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAKKzB4MzcsIDB4ZjksIDB4MDIsIDB4ZjAsIDB4YmQsIDB4ZjksIDB4ZmYsIDB4ZjcsIDB4NjEsIDB4ZmYsIDB4MDIsIDB4ZjAsIAorMHhkMSwgMHhmOSwgMHg4NCwgMHgyMCwgMHgwMiwgMHhmMCwgMHgyZSwgMHhmOSwgMHgzMCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDJiLCAweGY5LCAweDAwLCAweDk4LCAweDAyLCAweGYwLCAweDI4LCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAKKzB4MjUsIDB4ZjksIDB4MDAsIDB4MmYsIDB4MDUsIDB4ZDksIDB4MjAsIDB4NzgsIDB4MDEsIDB4MzQsIDB4MDIsIDB4ZjAsIAorMHgxZiwgMHhmOSwgMHgwMSwgMHgzZiwgMHhmOSwgMHhkMSwgMHgwMiwgMHhmMCwgMHhhMywgMHhmOSwgMHgwMiwgMHhmMCwgCisweGI5LCAweGY5LCAweDgzLCAweDIwLCAweDAyLCAweGYwLCAweDE2LCAweGY5LCAweDMwLCAweDFjLCAweDAyLCAweGYwLCAKKzB4MTMsIDB4ZjksIDB4MDEsIDB4OTgsIDB4MDIsIDB4ZjAsIDB4MTAsIDB4ZjksIAorMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgMHgwZCwgMHhmOSwgMHgwMiwgMHhmMCwgMHg5MywgMHhmOSwgMHhmZiwgMHhmNywgCisweDM3LCAweGZmLCAweDA3LCAweDQ5LCAweGM4LCAweDZmLCAweDQwLCAweDIzLCAweDAyLCAweDY4LCAweDlhLCAweDQzLCAKKzB4MDIsIDB4NjAsIDB4YzgsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIAorMHgwMiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDgwLCAweGI1LCAweDAxLCAweGYwLCAweDhmLCAweGY4LCAweDA2LCAweDRmLCAKKzB4YzAsIDB4NDYsIDB4ZjgsIDB4NjAsIDB4MDEsIDB4ZjAsIDB4ZjIsIDB4ZjgsIDB4NzgsIDB4ODAsIDB4MDEsIDB4ZjAsIAorMHhiMSwgMHhmOCwgMHgzOCwgMHg3MSwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweGYwLCAweDA1LCAweGY5LCAweDAyLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4ODAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwYiwgMHg0OCwgMHhjMSwgMHg2OCwgMHgwMSwgMHgyOSwgMHgxMSwgMHhkMSwgMHhjMSwgMHg2ZiwgMHgwMiwgMHgyMywgCisweDBhLCAweDY4LCAweDFhLCAweDQzLCAweDBhLCAweDYwLCAweGMxLCAweDZmLCAweDgwLCAweDIzLCAweDBhLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4MGEsIDB4NjAsIDB4YzEsIDB4MTgsIDB4MDgsIDB4NjgsIDB4ODIsIDB4MjMsIDB4MDIsIDB4NjgsIAorMHgxYSwgMHg0MywgMHgwMiwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwOCwgMHg4MSwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI0LCAweDRhLCAweDQ5LCAweGNhLCAweDFkLCAweDlkLCAweDMyLCAKKzB4MDAsIDB4MjAsIDB4MDAsIDB4MjcsIDB4ODMsIDB4MDAsIDB4ZDcsIDB4NTAsIDB4MDEsIDB4MzAsIDB4MTcsIDB4MjgsIAorMHhmYSwgMHhkMywgMHg0NiwgMHg0YywgMHgwMCwgMHgyMCwgMHg4MiwgMHgwMCwgMHhhNywgMHg1MCwgMHgwMSwgMHgzMCwgCisweDIwLCAweDI4LCAweGZhLCAweGQzLCAweDQzLCAweDRhLCAweDAwLCAweDIwLCAweDgzLCAweDAwLCAweGQ3LCAweDUwLCAKKzB4MDEsIDB4MzAsIDB4MjAsIDB4MjgsIDB4ZmEsIDB4ZDMsIDB4YTcsIDB4NjEsIDB4OTcsIDB4NjEsIDB4NGYsIDB4NjUsIAorMHg4ZiwgMHg2NSwgMHgzZiwgMHg0ZCwgMHhjMCwgMHg0NiwgMHgyZiwgMHg2MCwgMHg2ZiwgMHg2MCwgMHhhZiwgMHg2MCwgCisweGFmLCAweDYxLCAweGVmLCAweDYwLCAweDJmLCAweDYxLCAweDZmLCAweDYxLCAweDAwLCAweDIwLCAweGMxLCAweDAwLCAKKzB4MDksIDB4MTgsIDB4NDksIDB4MDEsIDB4MzUsIDB4NGIsIDB4YzksIDB4MTgsIDB4ODYsIDB4MDAsIDB4Y2IsIDB4MWQsIAorMHhmOSwgMHgzMywgMHgzNCwgMHg0YywgMHgzNCwgMHgxOSwgMHhlMywgMHg2MywgMHgxMSwgMHgyMywgMHg1YiwgMHgwMSwgCisweGNiLCAweDE4LCAweDYzLCAweDYzLCAweDBkLCAweDIzLCAweDliLCAweDAxLCAweGNiLCAweDE4LCAweGI0LCAweDE4LCAKKzB4ZTMsIDB4NjMsIDB4MjMsIDB4MjMsIDB4NWIsIDB4MDEsIDB4YzksIDB4MTgsIDB4NjEsIDB4NjMsIDB4MDEsIDB4MzAsIAorMHgwMiwgMHgyOCwgMHhlNCwgMHhkYiwgMHgyOSwgMHg0OCwgMHhjMSwgMHgxZCwgMHhmOSwgMHgzMSwgMHgyOSwgMHg0YywgCisweGMwLCAweDQ2LCAweGExLCAweDYyLCAweDYxLCAweDZiLCAweDBkLCAweDIzLCAweDliLCAweDAxLCAweGUxLCAweDYyLCAKKzB4YzEsIDB4MTgsIDB4OTEsIDB4NjIsIDB4NTEsIDB4NmIsIDB4YzAsIDB4NDYsIDB4ZDEsIDB4NjIsIDB4MDgsIDB4MjEsIAorMHhlMSwgMHg2NCwgMHgyNSwgMHg0OSwgMHhjMCwgMHg0NiwgMHgyMSwgMHg2NSwgMHgyNCwgMHg0OSwgMHgwYiwgMHg2OSwgCisweGMwLCAweDQ2LCAweDYzLCAweDY1LCAweGMzLCAweDFkLCAweDRkLCAweDMzLCAweGUzLCAweDY1LCAweDI1LCAweDY2LCAKKzB4OGIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NjMsIDB4NjYsIDB4Y2IsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YTMsIDB4NjYsIAorMHgxZSwgMHg0YiwgMHhjMCwgMHg0NiwgMHhlMywgMHg2NiwgMHgyNywgMHg2NywgMHgwYiwgMHgyMywgMHhkYiwgMHgwMSwgCisweGMzLCAweDE4LCAweGEzLCAweDY3LCAweDY3LCAweDY3LCAweDAxLCAweDI2LCAweGUzLCAweDFkLCAweDY5LCAweDMzLCAKKzB4NjYsIDB4NjEsIDB4ZTcsIDB4NjEsIDB4MWYsIDB4NzMsIDB4MDIsIDB4MjMsIDB4ZDMsIDB4NjQsIDB4MTcsIDB4NGIsIAorMHhjMCwgMHg0NiwgMHgxMywgMHg2NSwgMHhjYiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg1MywgMHg2NSwgMHhjMywgMHgxZCwgCisweDUxLCAweDMzLCAweGQzLCAweDY1LCAweDJiLCAweDFkLCAweDEzLCAweDY2LCAweDRiLCAweDY5LCAweGMwLCAweDQ2LCAKKzB4NTMsIDB4NjYsIDB4ODksIDB4NjksIDB4YzAsIDB4NDYsIDB4OTEsIDB4NjYsIDB4MGYsIDB4NDksIDB4YzAsIDB4NDYsIAorMHhkMSwgMHg2NiwgMHgxNiwgMHg2NywgMHgwZiwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg5MCwgMHg2NywgCisweDU2LCAweDY3LCAweGQ3LCAweDYxLCAweGQwLCAweDFkLCAweDY5LCAweDMwLCAweDU2LCAweDYxLCAweDA3LCAweDczLCAKKzB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZTQsIDB4MmMsIDB4MDAsIDB4ODAsIAorMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHgzMCwgMHgwMSwgMHgxOCwgMHgwMCwgCisweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDAwLCAweDU1LCAweGZmLCAweGZmLCAweDM4LCAweDAxLCAweDE4LCAweDAwLCAKKzB4MTAsIDB4NTUsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4MDAsIDB4MjEsIDB4MWUsIDB4NGEsIDB4YmIsIDB4MjMsIAorMHgxYiwgMHgwMSwgMHhkNywgMHgxOCwgMHhmOSwgMHg3MywgMHgxOSwgMHgyMywgCisweGRiLCAweDAxLCAweGQwLCAweDE4LCAweDAxLCAweDI0LCAweGNkLCAweDIzLCAweDFiLCAweDAxLCAweGQzLCAweDE4LCAKKzB4YzEsIDB4NjEsIDB4MWMsIDB4NzAsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDMsIDB4MTgsIDB4OTksIDB4NjAsIAorMHhiOSwgMHg3MywgMHg1OSwgMHg2MSwgMHgyZiwgMHgyMywgMHg5YiwgMHgwMSwgMHhkMywgMHgxOCwgMHgxOSwgMHg2MCwgCisweDEzLCAweDRiLCAweDUxLCAweDI3LCAweGJmLCAweDAzLCAweDAzLCAweDYzLCAweDNiLCAweDYwLCAweDg0LCAweDY5LCAKKzB4ZTQsIDB4MTgsIDB4NDQsIDB4NjMsIDB4MDQsIDB4M2MsIDB4N2MsIDB4NjAsIDB4MDEsIDB4MjQsIDB4ZTQsIDB4MDIsIAorMHg4NCwgMHg2MywgMHgwZSwgMHg0YywgMHhjMCwgMHg0NiwgMHhiYywgMHg2MCwgMHgwNCwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDQ0LCAweDYyLCAweDg0LCAweDY5LCAweGU0LCAweDE4LCAweDBiLCAweDRiLCAweGUzLCAweDE4LCAweGZiLCAweDYwLCAKKzB4MDMsIDB4NmIsIDB4YzAsIDB4NDYsIDB4ODMsIDB4NjIsIDB4NDMsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDMsIDB4NjIsIAorMHhjMSwgMHg2MywgMHg1MSwgMHg2NCwgMHg5MSwgMHg2NCwgMHhkMSwgMHg2NSwgMHhkMSwgMHg2NiwgMHg5MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDIwLCAweDQwLCAKKzB4ZmMsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4ZjcsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjQsIDB4MDAsIDB4MjIsIAorMHgxYiwgMHg0OSwgMHhjOSwgMHgyMywgMHgxYiwgMHgwMSwgMHhjOCwgMHgxOCwgMHgwMiwgMHg3MSwgMHgwMSwgMHgyMCwgCisweGJiLCAweDIzLCAweDFiLCAweDAxLCAweGNiLCAweDE4LCAweDU4LCAweDczLCAweDE3LCAweDQ4LCAweDAzLCAweDFjLCAKKzB4MDAsIDB4MjcsIDB4ZGMsIDB4MWQsIDB4YzEsIDB4MzQsIDB4MWMsIDB4NjUsIDB4MjMsIDB4MWMsIDB4MDEsIDB4MzcsIAorMHgzZiwgMHgyZiwgMHhmOCwgMHhkMywgMHgxYSwgMHg2NSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjZiwgMHgxOCwgCisweDMzLCAweDIzLCAweDliLCAweDAxLCAweGNiLCAweDE4LCAweDNhLCAweDYxLCAweDk4LCAweDYxLCAweDQwLCAweDIwLCAKKzB4ZjgsIDB4NjAsIDB4ZGEsIDB4NjEsIDB4MWEsIDB4NjIsIDB4Y2EsIDB4NjQsIDB4MGEsIDB4NjYsIDB4MGMsIDB4NDgsIAorMHhjMCwgMHg0NiwgMHhjMiwgMHg2MCwgMHgwYiwgMHg0OCwgMHgwMCwgMHg2YiwgMHhjMCwgMHgwNiwgMHhjMCwgMHgwZSwgCisweGY4LCAweDYzLCAweDBhLCAweDQ4LCAweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDE5LCAweDgwLCAweDQxLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4NTksIDB4ODAsIDB4ODAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4OTgsIDB4ODAsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiYywgMHgyMCwgMHg0MCwgCisweDkwLCAweGVlLCAweDIwLCAweDQwLCAweDgwLCAweDAwLCAweDE0LCAweDQwLCAweDQwLCAweDAwLCAweDE0LCAweDQwLCAKKzB4MDAsIDB4MjAsIDB4MGEsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NzMsIDB4Y2IsIDB4MWQsIDB4ZmYsIDB4MzMsIAorMHgzYSwgMHgzMywgMHg4OCwgMHg2MSwgMHhjOCwgMHg2MSwgMHgxOCwgMHg3MCwgMHgwNiwgMHg0YSwgMHhjMCwgMHg0NiwgCisweDEwLCAweDY1LCAweDUwLCAweDY2LCAweDkwLCAweDY2LCAweDA4LCAweDcwLCAweDU4LCAweDcwLCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4MDgsIDB4NzMsIDB4NzAsIDB4NDcsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNCwgMHgyZiwgMHg0OSwgMHgyZiwgMHg0YSwgMHhjMCwgMHg0NiwgCisweDExLCAweDYxLCAweDAxLCAweDIzLCAweDliLCAweDAyLCAweGM4LCAweDE4LCAweDUwLCAweDYxLCAweDJkLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4MTAsIDB4NjIsIDB4ZGIsIDB4MDAsIDB4YzMsIDB4MTgsIDB4NTMsIDB4NjIsIDB4MDAsIDB4MjMsIAorMHgxMywgMHg2MywgMHg1MywgMHg2MywgMHgyOSwgMHg0YSwgMHgyYSwgMHg0ZiwgMHhkNCwgMHgxZCwgMHhmZiwgMHgzNCwgCisweGZhLCAweDM0LCAweDE0LCAweGM3LCAweDA4LCAweDNmLCAweDNiLCAweDYxLCAweDFjLCAweDFmLCAweDdjLCAweDYxLCAKKzB4MjYsIDB4NGYsIDB4YzAsIDB4NDYsIDB4MzksIDB4NjAsIDB4YjgsIDB4NjEsIDB4NzksIDB4NjEsIDB4ZjgsIDB4NjIsIAorMHgzYiwgMHg2MywgMHg3YiwgMHg2NCwgMHhiYSwgMHg2NCwgMHhmYSwgMHg2NSwgMHgyMiwgMHg0ZiwgMHhmZSwgMHgxZCwgCisweGY5LCAweDM2LCAweDIyLCAweDRkLCAweGVjLCAweDFkLCAweDc5LCAweDM0LCAweDI2LCAweDYyLCAweDUxLCAweDI2LCAKKzB4YjYsIDB4MDMsIDB4MzcsIDB4NjEsIDB4MjQsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NzQsIDB4NjEsIDB4MmYsIDB4NjcsIAorMHgxZCwgMHg0ZCwgMHgwOSwgMHgyNywgMHg3ZiwgMHgwNCwgMHhlYywgMHgxZCwgMHg3NSwgMHgzNCwgMHg3YywgMHg2MCwgCisweDNkLCAweDYwLCAweDFiLCAweDRjLCAweGMwLCAweDQ2LCAweDNjLCAweDYxLCAweGU2LCAweDFkLCAweDc1LCAweDM2LCAKKzB4N2UsIDB4NjEsIDB4MTksIDB4NGYsIDB4YzAsIDB4NDYsIDB4N2MsIDB4NjAsIDB4M2QsIDB4NjAsIDB4MGYsIDB4MWMsIAorMHgwMCwgMHgyMSwgMHhmZiwgMHgyNCwgMHgwMSwgMHgzNCwgMHgxZCwgMHgxYywgMHg4YiwgMHgwMCwgMHhmZCwgMHg1MCwgCisweDAxLCAweDMxLCAweGExLCAweDQyLCAweGZhLCAweGQzLCAweDAxLCAweDFjLCAweDAwLCAweDIwLCAweDAxLCAweDI3LCAKKzB4ZmYsIDB4MDIsIDB4ODMsIDB4MDAsIDB4Y2QsIDB4NTAsIDB4MDEsIDB4MzAsIDB4YjgsIDB4NDIsIDB4ZmEsIDB4ZDMsIAorMHgwMCwgMHgyMCwgMHg4MSwgMHgwMCwgMHg1NSwgMHg1MCwgMHgwMSwgMHgzMCwgMHg4MCwgMHgyOCwgMHhmYSwgMHhkMywgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDI0LCAweGEzLCAweDIwLCAweDQwLCAKKzB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4MjQsIDB4ODMsIDB4MjAsIDB4NDAsIDB4MjQsIDB4YTksIDB4MjAsIDB4NDAsIAorMHg4MCwgMHgwMSwgMHgxOCwgMHgwMCwgMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgMHgyNCwgMHhhNywgMHgyMCwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDI0LCAweGE4LCAweDIwLCAweDQwLCAweGE0LCAweGE4LCAweDIwLCAweDQwLCAKKzB4MDgsIDB4MDQsIDB4MDAsIDB4ODAsIDB4YjgsIDB4YjUsIDB4MmMsIDB4NDgsIDB4ZmQsIDB4ZjcsIDB4YmEsIDB4ZmQsIAorMHgwMSwgMHgyMCwgMHgyYiwgMHg0OSwgMHgwYSwgMHg2OCwgMHg1MiwgMHgwYywgMHgwNiwgMHhkMiwgMHgwYSwgMHg2OCwgCisweDEyLCAweDBjLCAweDAyLCAweGQxLCAweDBhLCAweDY4LCAweDkyLCAweDBhLCAweDAwLCAweGQyLCAweDAwLCAweDIwLCAKKzB4MDQsIDB4MDYsIDB4MjQsIDB4MGUsIDB4MjUsIDB4NGEsIDB4ZDcsIDB4MWQsIDB4MGQsIDB4MzcsIDB4MDAsIDB4MjMsIAorMHgwMCwgMHgyMCwgMHg5ZCwgMHgwMCwgMHg3OCwgMHg1MSwgMHgwMSwgMHgzMywgMHgwNCwgMHgyYiwgMHhmYSwgMHhkMywgCisweDAxLCAweDI3LCAweDNmLCAweDA1LCAweDUwLCAweDYxLCAweGY4LCAweDYwLCAweGQwLCAweDYxLCAweGY4LCAweDYxLCAKKzB4MDAsIDB4MjMsIDB4ZGIsIDB4NDMsIDB4OTMsIDB4NjEsIDB4M2IsIDB4NjEsIDB4MTMsIDB4NjIsIDB4M2IsIDB4NjIsIAorMHgwMCwgMHgyNywgMHgxYiwgMHg0YiwgMHg4ZCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5NSwgMHg4ZCwgMHg2OSwgCisweGMwLCAweDQ2LCAweDAwLCAweDk1LCAweDAwLCAweDJjLCAweDBiLCAweGQwLCAweGRkLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTUsIDB4OWQsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTUsIDB4NWQsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHgwMCwgMHg5NSwgMHgxZCwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5NSwgMHgwMSwgMHgzNywgMHg0MCwgMHgyZiwgCisweGU4LCAweGQzLCAweDAwLCAweDI3LCAweDZjLCAweDQ2LCAweDAxLCAweDIzLCAweDViLCAweDA3LCAweDFjLCAweDQzLCAKKzB4MDEsIDB4ZTAsIDB4MjAsIDB4NjAsIDB4MDEsIDB4MzcsIDB4MGQsIDB4NjgsIDB4MmIsIDB4MDksIDB4MDIsIDB4ZDIsIAorMHg4MCwgMHgyZiwgMHhmOCwgMHhkMywgMHgwMSwgMHhlMCwgMHg4MCwgMHgyZiwgMHgwMywgMHhkMywgMHgwOCwgMHg0OSwgCisweDRiLCAweDZlLCAweDAxLCAweDMzLCAweDRiLCAweDY2LCAweGQwLCAweDYyLCAweGI4LCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDEsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMSwgMHgxOCwgMHg0MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDkwLCAweGI0LCAweDAwLCAweDIxLCAweDBlLCAweDRmLCAweDBmLCAweDRhLCAweDAwLCAweDIwLCAweDRjLCAweDAxLCAKKzB4NjQsIDB4MWEsIDB4YTQsIDB4MDAsIDB4YTMsIDB4MTgsIDB4NTgsIDB4NjAsIDB4OTgsIDB4NjAsIDB4MTgsIDB4NjQsIAorMHg1OCwgMHg2NCwgMHgxMCwgMHg1MywgMHg1OCwgMHg4MCwgMHhjYywgMHgwMCwgMHhlNCwgMHgxOSwgMHg5OCwgMHg2NywgCisweGRjLCAweDYyLCAweDAxLCAweDMxLCAweDAzLCAweDI5LCAweGVlLCAweGQzLCAweDA2LCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjAsIDB4NDgsIDB4NjAsIDB4ODgsIDB4NjAsIDB4YzgsIDB4NjAsIDB4MDgsIDB4NjEsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhhYywgMHg2NiwgMHgyMSwgMHg0MCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGQwLCAweDJjLCAweDAwLCAweDgwLCAweDY0LCAweDIxLCAweDA1LCAweDQ4LCAweGMwLCAweDQ2LCAweDAxLCAweDYzLCAKKzB4MDAsIDB4MjEsIDB4YzksIDB4NDMsIDB4NDEsIDB4NjMsIDB4ODEsIDB4NjMsIDB4MDAsIDB4MjEsIDB4YzEsIDB4NjMsIAorMHgwMSwgMHg2NCwgMHg3MCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNCwgMHgwMSwgMHgyMCwgCisweDQwLCAweDAyLCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDNjLCAweDIwLCAweDQ4LCAweDYwLCAKKzB4ODgsIDB4NjAsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDcsIDB4NGEsIAorMHg4NywgMHgwMCwgMHhjYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg1MSwgMHgwMSwgMHgzMCwgMHgxMCwgMHgyOCwgCisweGY4LCAweGQzLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGU0LCAweDJkLCAweDAwLCAweDgwLCAKKzB4ZjQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4NWQsIDB4NGMsIDB4ZmYsIDB4ZmYsIDB4MTIsIDB4NDksIDB4MTMsIDB4NDgsIAorMHg2NywgMHgyMywgMHg5YiwgMHgwMSwgMHhjYSwgMHgxOCwgMHgwNiwgMHhjMCwgMHgwOCwgMHgzOCwgMHgxMSwgMHg0YiwgCisweGNhLCAweDE4LCAweGMxLCAweDYwLCAweDgyLCAweDYwLCAweDAxLCAweDYxLCAweDBmLCAweDQ5LCAweDEwLCAweDQ4LCAKKzB4YTcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4Y2EsIDB4MTgsIDB4MDYsIDB4YzAsIDB4MDgsIDB4MzgsIDB4MGUsIDB4NGIsIAorMHhjYSwgMHgxOCwgMHhjMSwgMHg2MCwgMHg4MiwgMHg2MCwgMHgwMSwgMHg2MSwgMHgwYywgMHg0OCwgMHgwZCwgMHg0OSwgCisweDY3LCAweDIzLCAweDliLCAweDAxLCAweGMyLCAweDE4LCAweDA1LCAweGMxLCAweDA4LCAweDM5LCAweDA1LCAweDRiLCAKKzB4YzIsIDB4MTgsIDB4YzgsIDB4NjAsIDB4OGEsIDB4NjAsIDB4MDgsIDB4NjEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhhYywgMHgxZSwgMHgyMSwgMHg0MCwgMHg0OCwgMHgyZSwgMHgwMCwgMHg4MCwgMHhmYywgMHgxZiwgMHgwMCwgMHgwMCwgCisweGFjLCAweGVlLCAweDIwLCAweDQwLCAweDM0LCAweDJlLCAweDAwLCAweDgwLCAweGZjLCAweDJmLCAweDAwLCAweDAwLCAKKzB4YWMsIDB4M2UsIDB4MjEsIDB4NDAsIDB4NWMsIDB4MmUsIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhiNCwgMHgwMCwgMHgyMSwgMHg0MCwgMHg0YywgMHgwMCwgMHgyMCwgMHgwYSwgMHgwMSwgMHgxMiwgMHgxOSwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGQyLCAweDE4LCAweGQwLCAweDYyLCAweDEwLCAweDYzLCAweDUwLCAweDYzLCAKKzB4OTAsIDB4NjMsIDB4MDEsIDB4MzEsIDB4MDMsIDB4MjksIDB4ZjMsIDB4ZDMsIDB4M2EsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MywgMHg0OCwgMHg2MywgMHg4OCwgMHg2MywgMHgyMCwgMHg2MCwgMHgwMSwgMHgyMSwgMHhlMywgMHgxZCwgCisweDU5LCAweDMzLCAweDYwLCAweDYwLCAweDE5LCAweDcxLCAweDE4LCAweDcyLCAweDk4LCAweDcxLCAweDk4LCAweDcyLCAKKzB4NTksIDB4NzEsIDB4NTgsIDB4NzIsIDB4ZDgsIDB4NzEsIDB4ZDgsIDB4NzIsIDB4ZTIsIDB4MWQsIDB4NDksIDB4MzIsIAorMHgxMSwgMHg3MywgMHgxOSwgMHg3MCwgMHg5MCwgMHg3MywgMHg5OCwgMHg3MCwgMHg1MSwgMHg3MywgMHg1OSwgMHg3MCwgCisweGQwLCAweDczLCAweGQ4LCAweDcwLCAweDExLCAweDcxLCAweDExLCAweDcyLCAweDkwLCAweDcxLCAweDkwLCAweDcyLCAKKzB4NTAsIDB4NzEsIDB4NTAsIDB4NzIsIDB4ZDAsIDB4NzEsIDB4ZDAsIDB4NzIsIDB4MTgsIDB4NzMsIDB4MDIsIDB4MjIsIAorMHhlNywgMHgxZCwgMHg2OSwgMHgzNywgMHgzYSwgMHg3MCwgMHg5OSwgMHg3MywgMHhiYSwgMHg3MCwgMHg1OCwgMHg3MywgCisweDc4LCAweDcwLCAweGQ4LCAweDczLCAweGY4LCAweDcwLCAweDM5LCAweDcxLCAweDNhLCAweDcyLCAweGI5LCAweDcxLCAKKzB4YjksIDB4NzIsIDB4NzgsIDB4NzEsIDB4N2EsIDB4NzIsIDB4ZjksIDB4NzEsIDB4ZjksIDB4NzIsIDB4MzksIDB4NzMsIAorMHhlMywgMHgxZCwgMHg3OSwgMHgzMywgMHgxYSwgMHg3MCwgMHhiOSwgMHg3MywgMHg5OSwgMHg3MCwgMHg3OCwgMHg3MywgCisweDVhLCAweDcwLCAweGY5LCAweDczLCAweGQ5LCAweDcwLCAweDFhLCAweDcxLCAweDFhLCAweDcyLCAweDk5LCAweDcxLCAKKzB4OWEsIDB4NzIsIDB4NTgsIDB4NzEsIDB4NWEsIDB4NzIsIDB4ZDksIDB4NzEsIDB4ZGEsIDB4NzIsIDB4MTksIDB4NzMsIAorMHhlNywgMHgxZCwgMHg4OSwgMHgzNywgMHgzYSwgMHg3MCwgMHg5OSwgMHg3MywgMHhiOSwgMHg3MCwgMHg1OCwgMHg3MywgCisweDdhLCAweDcwLCAweGQ5LCAweDczLCAweGY5LCAweDcwLCAweDM5LCAweDcxLCAweDNhLCAweDcyLCAweGI5LCAweDcxLCAKKzB4YjksIDB4NzIsIDB4NzgsIDB4NzEsIDB4N2EsIDB4NzIsIDB4ZjksIDB4NzEsIDB4ZjksIDB4NzIsIDB4M2EsIDB4NzMsIAorMHhlMywgMHgxZCwgMHg5OSwgMHgzMywgMHgxYSwgMHg3MCwgMHhiOSwgMHg3MywgMHg5YSwgMHg3MCwgMHg3OCwgMHg3MywgCisweDVhLCAweDcwLCAweGY5LCAweDczLCAweGRhLCAweDcwLCAweDE5LCAweDcxLCAweDFhLCAweDcyLCAweDk5LCAweDcxLCAKKzB4OTksIDB4NzIsIDB4NTgsIDB4NzEsIDB4NWEsIDB4NzIsIDB4ZDksIDB4NzEsIDB4ZDksIDB4NzIsIDB4MjAsIDB4NjEsIAorMHhlMCwgMHg2MCwgMHg2MCwgMHg2MSwgMHhhMCwgMHg2MCwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweGEwLCAweDFjLCAweDAwLCAweDgwLCAweGU4LCAweDE5LCAweDAwLCAweDgwLCAweDgxLCAweDIwLCAweDAwLCAweDAyLCAKKzB4MDEsIDB4NDksIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjIsIDB4NzAsIDB4NDcsIDB4YzAsIDB4MDAsIDB4MTQsIDB4MDAsIAorMHgwOSwgMHg0OSwgMHgwYSwgMHg0YiwgMHhjOCwgMHgxOCwgMHgwNCwgMHgzYiwgMHhjOSwgMHgxOCwgMHgwOCwgMHg2MCwgCisweDAwLCAweDIxLCAweGMyLCAweDFkLCAweDI5LCAweDMyLCAweGMyLCAweDYxLCAweDEwLCAweDFjLCAweDAxLCAweDMxLCAKKzB4MDgsIDB4MjksIDB4ZjgsIDB4ZDMsIDB4YzEsIDB4MWYsIDB4MjksIDB4MzksIDB4MDAsIDB4MjAsIDB4YzgsIDB4NjEsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4NCwgMHgwOSwgMHgwMCwgMHgwMCwgCisweDA2LCAweDQ4LCAweDA3LCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDgwLCAweDQ4LCAweDgwLCAweDAwLCAweDIwLCAKKzB4ODgsIDB4ODAsIDB4YzgsIDB4ODAsIDB4ODgsIDB4NjAsIDB4MDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4NDgsIDB4NjEsIAorMHg4OCwgMHg2MSwgMHg3MCwgMHg0NywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDAwLCAweDIxLCAweDA2LCAweDQ4LCAweGMyLCAweDFkLCAweDE5LCAweDMyLCAKKzB4YzEsIDB4NjAsIDB4MDEsIDB4NjEsIDB4YzEsIDB4NjEsIDB4MDEsIDB4NjIsIDB4MTEsIDB4NzEsIDB4ZmYsIDB4MzAsIAorMHgwMSwgMHgzMCwgMHg0MSwgMHg2MiwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDA5LCAweDQ4LCAweDBhLCAweDRiLCAweGMwLCAweDQ2LCAweDE4LCAweDYwLCAweDAwLCAweDIxLCAweGMyLCAweDFkLCAKKzB4NGQsIDB4MzIsIDB4YzIsIDB4NjAsIDB4MTAsIDB4MWMsIDB4MDEsIDB4MzEsIDB4MTQsIDB4MjksIDB4ZjgsIDB4ZDMsIAorMHhjMSwgMHgxZiwgMHg0ZCwgMHgzOSwgMHgwMCwgMHgyMCwgMHhjOCwgMHg2MCwgMHg1OCwgMHg2MCwgMHg5OCwgMHg2MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGQ4LCAweDA3LCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4MGIsIDB4NDksIDB4MGIsIDB4NDgsIDB4ZmQsIDB4ZjcsIDB4ZWEsIDB4ZmIsIDB4MGIsIDB4NDgsIAorMHgwMCwgMHg2YSwgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHg5OCwgMHg0MywgMHgwOSwgMHg0OSwgMHhjMCwgMHg0NiwgCisweDA4LCAweDYyLCAweDA5LCAweDQ4LCAweGMxLCAweDY4LCAweDAxLCAweDI5LCAweDA0LCAweGQxLCAweGMwLCAweDZmLCAKKzB4ODAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhjMSwgMHhiZCwgMHgyMSwgMHg0MCwgMHg3NSwgMHg5OCwgMHgyMSwgMHg0MCwgCisweGMwLCAweDAwLCAweDE4LCAweDQwLCAweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4MGYsIDB4NDgsIDB4YzEsIDB4NjgsIDB4MDEsIDB4MjksIDB4MDQsIDB4ZDEsIDB4YzAsIDB4NmYsIAorMHg4MCwgMHgyMywgMHgwMSwgMHg2OCwgMHg5OSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwYiwgMHg0YiwgMHgwYywgMHg0OCwgCisweDBjLCAweDRhLCAweDAwLCAweDIxLCAweGZkLCAweGY3LCAweGJmLCAweGZiLCAweDBiLCAweDQ4LCAweDQxLCAweDhkLCAKKzB4MDEsIDB4MzEsIDB4NDEsIDB4ODUsIDB4MDAsIDB4MjEsIDB4YzEsIDB4ODUsIDB4MDksIDB4NDgsIDB4MDAsIDB4NmEsIAorMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHgxOCwgMHg0MywgMHgwOCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MiwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDU5LCAweGJkLCAweDIxLCAweDQwLCAKKzB4NzUsIDB4OTgsIDB4MjEsIDB4NDAsIDB4YjgsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHhjMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhmMCwgMHhiNSwgMHgxYiwgMHg0YywgCisweDEwLCAweDI2LCAweGUwLCAweDY4LCAweDAxLCAweDI4LCAweDA4LCAweGQxLCAweDYwLCAweDg4LCAweDAwLCAweDI4LCAKKzB4MDUsIDB4ZDEsIDB4MjAsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4MTksIDB4MjAsIDB4YTAsIDB4NjcsIAorMHgwMCwgMHhlMCwgMHhhNiwgMHg2NywgMHgwMCwgMHgyMCwgMHgwNywgMHgyMywgMHg1YiwgMHgwMiwgMHhlNSwgMHgxOCwgCisweGMxLCAweDQzLCAweGU4LCAweDYxLCAweDY5LCAweDYyLCAweDU5LCAweDA4LCAweGExLCAweDI3LCAweDdmLCAweDAzLCAKKzB4NzksIDB4NjAsIDB4MGYsIDB4MjEsIDB4NzksIDB4NjAsIDB4ZTEsIDB4MWQsIDB4YjksIDB4MzEsIDB4MDgsIDB4NzEsIAorMHgwMSwgMHgyMCwgMHhiOCwgMHg2MCwgMHg0MCwgMHgwMiwgMHhiOCwgMHg2MCwgMHgwMCwgMHhmMCwgMHg0YywgMHhmYSwgCisweDAwLCAweGYwLCAweGYwLCAweGZhLCAweDA0LCAweDIwLCAweGI4LCAweDYwLCAweDA3LCAweDIwLCAweDc4LCAweDYxLCAKKzB4N2UsIDB4NjAsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZTAsIDB4MTgsIDB4YzAsIDB4OGIsIDB4MDQsIDB4MjMsIAorMHgxOCwgMHg0MCwgMHhlOCwgMHg2MiwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI0LCAweDAyLCAweDFjLCAweDAwLCAweDIwLCAweGZmLCAweDIzLCAKKzB4MDEsIDB4MzMsIDB4OWEsIDB4NDIsIDB4MDgsIDB4ZDAsIDB4MDEsIDB4MjksIDB4MDAsIDB4ZDEsIDB4MDEsIDB4MjAsIAorMHgwMCwgMHgyYSwgMHgwMSwgMHhkMSwgMHgwMiwgMHgyMywgMHgxOCwgMHg0MywgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDFiLCAweDRhLCAweGQ3LCAweDY4LCAweDFhLCAweDRiLCAweDE5LCAweDc5LCAweDFjLCAweDFjLCAweDM3LCAweDIzLCAKKzB4OWIsIDB4MDEsIDB4ZTMsIDB4MTgsIDB4MDEsIDB4MmYsIDB4MGQsIDB4ZDEsIDB4NTcsIDB4ODgsIDB4MDAsIDB4MmYsIAorMHgwYSwgMHhkMSwgMHgwMCwgMHgyOSwgMHgwYSwgMHhkMSwgMHg1OSwgMHg4YiwgMHgwYSwgMHgwOSwgMHgwMCwgMHhkMywgCisweDAyLCAweDIwLCAweDQ5LCAweDA5LCAweGU4LCAweGQzLCAweDAxLCAweDIzLCAweDE4LCAweDQzLCAweGU1LCAweGU3LCAKKzB4MDAsIDB4MjksIDB4MDMsIDB4ZDAsIDB4OTgsIDB4OGEsIDB4ODAsIDB4MDcsIDB4ODAsIDB4MGYsIDB4ZGYsIDB4ZTcsIAorMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhkMSwgMHgxOCwgMHg4YSwgMHg4OCwgMHhmZiwgMHgyNywgMHgwMSwgMHgzNywgCisweDE3LCAweDQwLCAweDBhLCAweDQ5LCAweGM5LCAweDg4LCAweDAzLCAweGQwLCAweDRiLCAweDBhLCAweDAxLCAweGQzLCAKKzB4MDMsIDB4MjAsIDB4ZDEsIDB4ZTcsIDB4MTMsIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MGIsIDB4MGEsIDB4MDEsIDB4ZDMsIAorMHgwMiwgMHgyMCwgMHhjYiwgMHhlNywgMHhkMiwgMHgwOSwgMHhjOSwgMHhkMywgMHhjOSwgMHgwOSwgMHhjNywgMHhkMywgCisweDAxLCAweDIwLCAweGM1LCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDA4LCAweDFjLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjUsIDB4YzEsIDB4YjAsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDcsIDB4NTIsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MCwgMHg1MiwgMHg0OCwgMHg0MiwgMHg2OSwgMHg0MCwgMHgwZCwgMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgCisweDQ4LCAweDYwLCAweDUwLCAweDQ4LCAweGMwLCAweDZhLCAweDUwLCAweDRiLCAweDE4LCAweDQzLCAweDAwLCAweDIxLCAKKzB4MDMsIDB4MDMsIDB4MWIsIDB4MGIsIDB4NGUsIDB4NGMsIDB4MjcsIDB4NmYsIDB4M2QsIDB4MDMsIDB4MmQsIDB4MGIsIAorMHhlNywgMHgxZCwgMHg3OSwgMHgzNywgMHhhYiwgMHg0MiwgMHgxYywgMHhkMCwgMHhlMywgMHgxZCwgMHg3OSwgMHgzMywgCisweDFiLCAweDZhLCAweGMwLCAweDQ2LCAweDQwLCAweDkzLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDAzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4Y2MsIDB4MDAsIDB4NmUsIDB4NDYsIDB4MzMsIDB4NTEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgwNiwgMHgxZCwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHg2YywgMHg0NCwgMHg2MywgMHg2MCwgMHgwOCwgMHgzMCwgCisweDAxLCAweDMxLCAweDQwLCAweDliLCAweDgzLCAweDQyLCAweDAwLCAweGQ4LCAweDNmLCAweDQ4LCAweDAzLCAweDAzLCAKKzB4MWIsIDB4MGIsIDB4YWIsIDB4NDIsIDB4ZTcsIDB4ZDEsIDB4MDAsIDB4MjAsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDMsIAorMHgxMywgMHg0MCwgMHgzYywgMHg0YywgMHgwMywgMHhkMCwgMHg2MywgMHg2YSwgMHgwMSwgMHgzMywgMHg2MywgMHg2MiwgCisweDA5LCAweGUwLCAweDEzLCAweDBiLCAweDAzLCAweGQzLCAweDIzLCAweDZhLCAKKzB4MDEsIDB4MzMsIDB4MjMsIDB4NjIsIDB4MDMsIDB4ZTAsIDB4MzcsIDB4NGIsIDB4NWMsIDB4NmQsIDB4MDEsIDB4MzQsIAorMHg1YywgMHg2NSwgMHgwMCwgMHgyOSwgMHgwOSwgMHhkMCwgMHgwMywgMHgxYywgMHhkYywgMHgwMCwgMHgyMywgMHgxYywgCisweDZiLCAweDQ0LCAweDVjLCAweDY4LCAweDAxLCAweDMwLCAweDIzLCAweDBkLCAweDAxLCAweGQyLCAweDg4LCAweDQyLCAKKzB4ZjUsIDB4ZDEsIDB4MzAsIDB4NGMsIDB4MjUsIDB4NjgsIDB4NmIsIDB4MGMsIDB4MDUsIDB4ZDIsIDB4MjMsIDB4NjgsIAorMHgxYiwgMHgwYywgMHgwOCwgMHhkMSwgMHgyNCwgMHg2OCwgMHhhMywgMHgwYSwgMHgwNSwgMHhkMywgMHgyMCwgMHgyNCwgCisweDJiLCAweDRiLCAweGMwLCAweDQ2LCAweDVjLCAweDYyLCAweDAwLCAweDI0LCAweDVjLCAweDYyLCAweDI1LCAweDRiLCAKKzB4MjMsIDB4NGMsIDB4NTEsIDB4MjYsIDB4YjYsIDB4MDMsIDB4MjMsIDB4NjcsIDB4MzMsIDB4NjEsIDB4M2QsIDB4NmEsIAorMHhjMCwgMHg0NiwgMHg3NSwgMHg2MSwgMHgwMiwgMHgyNSwgMHhhMSwgMHgyNiwgMHg3NiwgMHgwMywgMHg3NSwgMHg2MCwgCisweDAxLCAweDI1LCAweGI1LCAweDYwLCAweGU2LCAweDFkLCAweGI5LCAweDM2LCAweDM1LCAweDcxLCAweDg4LCAweDQyLCAKKzB4MjEsIDB4ZDAsIDB4MjUsIDB4MWMsIDB4YzMsIDB4MDAsIDB4NmMsIDB4NDYsIDB4ZTQsIDB4NTgsIDB4MmUsIDB4NmYsIAorMHg2YiwgMHg0NCwgMHgzNCwgMHg2MCwgMHg1YiwgMHg2OCwgMHgyYywgMHg2ZiwgMHhjMCwgMHg0NiwgMHg2MywgMHg2MCwgCisweDJiLCAweDZmLCAweDA4LCAweDMzLCAweDJiLCAweDY3LCAweDNjLCAweDZhLCAweGEzLCAweDQyLCAweDAyLCAweGQzLCAKKzB4MTIsIDB4NGIsIDB4YzAsIDB4NDYsIDB4MmIsIDB4NjcsIDB4MDMsIDB4MWMsIDB4ZGIsIDB4MDAsIDB4NmIsIDB4NDQsIAorMHg1YywgMHg2OCwgMHgwMSwgMHgzMCwgMHgyMywgMHgwZCwgMHgwNCwgMHhkMywgMHg1MSwgMHgyNCwgMHhhNCwgMHgwMywgCisweDJiLCAweDZmLCAweGMwLCAweDQ2LCAweGEzLCAweDYxLCAweDg4LCAweDQyLCAweGRlLCAweGQxLCAweDEwLCAweDBiLCAKKzB4MDMsIDB4ZDMsIDB4MGUsIDB4NDksIDB4MDEsIDB4MjAsIDB4ZmQsIDB4ZjcsIDB4NzQsIDB4ZmEsIDB4NDEsIDB4YjAsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDAwLCAweDAxLCAweDE0LCAweDQwLCAweDAwLCAweDQwLCAweDE0LCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgCisweGM5LCAweDRmLCAweGZmLCAweGZmLCAweGYwLCAweGI0LCAweDAwLCAweDIxLCAweDAwLCAweDIzLCAweDA3LCAweDIyLCAKKzB4MDYsIDB4MjQsIDB4NDcsIDB4NGYsIDB4YzAsIDB4NDYsIDB4M2MsIDB4NjEsIDB4M2EsIDB4NjEsIDB4MDEsIDB4MzMsIAorMHgyMCwgMHgyYiwgMHhmOSwgMHhkMywgMHgwNCwgMHgyNSwgMHgzZCwgMHg2MSwgMHgwNSwgMHgyMywgMHgzYiwgMHg2MSwgCisweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDNkLCAweDYxLCAweDNiLCAweDYxLCAKKzB4M2YsIDB4NGQsIDB4YWIsIDB4NmYsIDB4ZGUsIDB4MDgsIDB4MDIsIDB4MjMsIDB4MWUsIDB4NDAsIDB4MDQsIDB4MjMsIAorMHgzMywgMHg0MywgMHgzYiwgMHg2MSwgMHgwNSwgMHgyMywgMHgzMywgMHg0MywgMHgzYiwgMHg2MSwgMHhhYiwgMHg2ZiwgCisweDllLCAweDA4LCAweDAyLCAweDIzLCAweDFlLCAweDQwLCAweDA0LCAweDIzLCAweDMzLCAweDQzLCAweDNiLCAweDYxLCAKKzB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4YWIsIDB4NmYsIDB4NWUsIDB4MDgsIDB4MDIsIDB4MjMsIAorMHgxZSwgMHg0MCwgMHgwNCwgMHgyMywgMHgzMywgMHg0MywgMHgzYiwgMHg2MSwgMHgwNSwgMHgyMywgMHgzMywgMHg0MywgCisweDNiLCAweDYxLCAweDAyLCAweDIzLCAweGFlLCAweDZmLCAweDFlLCAweDQwLCAweDA0LCAweDIzLCAweDMzLCAweDQzLCAKKzB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4YWIsIDB4NmYsIDB4NWQsIDB4MDAsIAorMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHgwNSwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweGM1LCAweDA4LCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDA0LCAweDIzLCAKKzB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4ODUsIDB4MDgsIAorMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHgwNSwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDQ1LCAweDA4LCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDA0LCAweDIzLCAKKzB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDIsIDB4MjUsIAorMHgwNSwgMHg0MCwgMHgwNCwgMHgyMywgMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHgwNSwgMHgyMywgMHgyYiwgMHg0MywgCisweDNiLCAweDYxLCAweDQwLCAweDAwLCAweDAyLCAweDIzLCAweDE4LCAweDQwLCAweDA0LCAweDIzLCAweDAzLCAweDQzLCAKKzB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4NjEsIDB4MDAsIDB4MjUsIDB4M2QsIDB4NjEsIAorMHgwMSwgMHgyMywgMHgzYiwgMHg2MSwgMHgzZCwgMHg2MSwgMHgzYiwgMHg2MSwgMHgwMCwgMHgyMCwgMHgzZCwgMHg2MSwgCisweDBkLCAweDRiLCAweDFiLCAweDY5LCAweDQ5LCAweDAwLCAweDFlLCAweDFjLCAweDAyLCAweDIzLCAweDMzLCAweDQwLCAKKzB4MTksIDB4NDMsIDB4MDEsIDB4MjMsIDB4M2IsIDB4NjEsIDB4MDEsIDB4MzAsIAorMHgxMCwgMHgyOCwgMHhmMiwgMHhkMywgMHgwMiwgMHgyMCwgMHgzOCwgMHg2MSwgMHgwMywgMHgyMCwgMHgzOCwgMHg2MSwgCisweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDM4LCAweDYxLCAweDQ4LCAweDA4LCAKKzB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ODAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgMHhmMCwgMHhiNCwgMHgwMCwgMHgyNCwgMHgwNywgMHgyMywgMHgwNiwgMHgyNywgCisweDQ0LCAweDRhLCAweGMwLCAweDQ2LCAweDE3LCAweDYxLCAweDEzLCAweDYxLCAweDAxLCAweDM0LCAweDIwLCAweDJjLCAKKzB4ZjksIDB4ZDMsIDB4MDQsIDB4MjYsIDB4MTYsIDB4NjEsIDB4MDUsIDB4MjQsIDB4MTQsIDB4NjEsIDB4MTcsIDB4NjEsIAorMHgwNywgMHgyMywgMHgxMywgMHg2MSwgMHgxNiwgMHg2MSwgMHgxNCwgMHg2MSwgMHgxNywgMHg2MSwgMHgxMywgMHg2MSwgCisweDNjLCAweDRiLCAweDliLCAweDZmLCAweGRkLCAweDA4LCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDJiLCAweDFjLCAKKzB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIDB4MTUsIDB4NjEsIDB4MzcsIDB4NGIsIDB4OWIsIDB4NmYsIAorMHg5ZCwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgMHgxMywgMHg2MSwgCisweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDMyLCAweDRiLCAweDliLCAweDZmLCAweDVkLCAweDA4LCAweDAyLCAweDIzLCAKKzB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIDB4MTUsIDB4NjEsIAorMHgyZCwgMHg0YiwgMHg5ZCwgMHg2ZiwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgCisweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDI5LCAweDRiLCAweDliLCAweDZmLCAweDVkLCAweDAwLCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIAorMHgxNSwgMHg2MSwgMHhjNSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgCisweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDg1LCAweDA4LCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAKKzB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIDB4MTUsIDB4NjEsIDB4NDUsIDB4MDgsIAorMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgMHgxMywgMHg2MSwgMHgyNSwgMHg0MywgCisweDE1LCAweDYxLCAweDAyLCAweDI1LCAweDA1LCAweDQwLCAweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAKKzB4MjUsIDB4NDMsIDB4MTUsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MDIsIDB4MjMsIDB4MTgsIDB4NDAsIDB4MDMsIDB4MWMsIAorMHgzMywgMHg0MywgMHgxMywgMHg2MSwgMHgyMCwgMHg0MywgMHgxMCwgMHg2MSwgMHgxNywgMHg2MSwgMHgwNywgMHgyMywgCisweDEzLCAweDYxLCAweDE2LCAweDYxLCAweDE0LCAweDYxLCAweDRjLCAweDAwLCAweDAwLCAweDIwLCAweDBmLCAweDIxLCAKKzB4MjUsIDB4MWMsIDB4Y2QsIDB4NDAsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIAorMHgxMywgMHg2MSwgMHgwNSwgMHgyMywgMHgyYiwgMHg0MywgMHgxMywgMHg2MSwgMHgwMSwgMHgzMCwgMHgwMSwgMHgzOSwgCisweDEwLCAweDI4LCAweGYxLCAweGQzLCAweDE3LCAweDYxLCAweDA3LCAweDIzLCAweDEzLCAweDYxLCAweDE3LCAweDYxLCAKKzB4MTMsIDB4NjEsIDB4MDMsIDB4MjAsIDB4MTAsIDB4NjEsIDB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg4MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNSwgMHg0ZiwgMHg0ZCwgCisweDA4LCAweDIxLCAweDAyLCAweDIwLCAweDJhLCAweDFjLCAweGZkLCAweGY3LCAweDI3LCAweGY5LCAweDRkLCAweDRjLCAKKzB4NzEsIDB4MjMsIDB4NWIsIDB4MDEsIDB4ZTcsIDB4MTgsIDB4MzgsIDB4ODAsIDB4MWEsIDB4MjEsIDB4MDIsIDB4MjAsIAorMHgyYSwgMHgxYywgMHhmZCwgMHhmNywgMHgxZCwgMHhmOSwgMHg3OCwgMHg4MCwgMHgyMCwgMHg3OSwgMHgwMCwgMHgyOCwgCisweDBiLCAweGQwLCAweDAwLCAweDIwLCAweDM4LCAweDgwLCAweGUwLCAweDY4LCAweDAxLCAweDI4LCAweDEwLCAweGQxLCAKKzB4NDQsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4MTgsIDB4NDMsIDB4OTksIDB4MDIsIAorMHgwOCwgMHg2MCwgMHhlMCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwNiwgMHhkMSwgMHg2MCwgMHg4OCwgMHgwMCwgMHgyOCwgCisweDAzLCAweGQxLCAweGY5LCAweDIxLCAweDEyLCAweDIwLCAweGZmLCAweGY3LCAweDQzLCAweGZmLCAweDAxLCAweDIxLCAKKzB4YzksIDB4MDMsIDB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4M2UsIDB4ZmYsIDB4MDAsIDB4MjUsIDB4N2QsIDB4MjYsIAorMHhmNiwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMSwgMHgzNSwgMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHg5YywgMHhmZSwgCisweDAwLCAweDBjLCAweDAxLCAweGQzLCAweGI1LCAweDQyLCAweGY3LCAweGQzLCAweDAwLCAweDI1LCAweDA1LCAweGUwLCAKKzB4MDMsIDB4MjEsIDB4MDksIDB4MDMsIDB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4MmIsIDB4ZmYsIDB4MDEsIDB4MzUsIAorMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHg4ZCwgMHhmZSwgMHg0MCwgMHgwYiwgMHgwMSwgMHhkMiwgMHhiNSwgMHg0MiwgCisweGYyLCAweGQzLCAweDA0LCAweDIwLCAweGZmLCAweGY3LCAweDg2LCAweGZlLCAweGZmLCAweDIzLCAweGUxLCAweDMzLCAKKzB4OTgsIDB4NDMsIDB4MDEsIDB4MjEsIDB4MDEsIDB4NDMsIDB4MzgsIDB4ODgsIDB4ZmYsIDB4MjMsIDB4MDEsIDB4MzMsIAorMHg5OCwgMHg0MiwgMHgwMywgMHhkMSwgMHgyZiwgMHgyMywgMHg1YiwgMHgwMSwgCisweDE5LCAweDQzLCAweDE2LCAweGUwLCAweDAxLCAweDI4LCAweDA5LCAweGQxLCAweDc4LCAweDg4LCAweDAxLCAweDI4LCAKKzB4MDMsIDB4ZDEsIDB4MjMsIDB4MjMsIDB4NWIsIDB4MDEsIDB4MTksIDB4NDMsIDB4MGQsIDB4ZTAsIDB4MjAsIDB4MjMsIAorMHgxOSwgMHg0MywgMHgwYSwgMHhlMCwgMHgwMCwgMHgyOCwgMHgwOCwgMHhkMSwgMHg3OCwgMHg4OCwgMHgwMSwgMHgyOCwgCisweDAzLCAweGQxLCAweDBiLCAweDIzLCAweGRiLCAweDAxLCAweDE5LCAweDQzLCAweDAxLCAweGUwLCAweDgwLCAweDIzLCAKKzB4MTksIDB4NDMsIDB4MDQsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4ZjgsIDB4ZmUsIDB4MDksIDB4MjEsIDB4NDksIDB4MDIsIAorMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHhmMywgMHhmZSwgMHhlMCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgwYywgMHhkMSwgCisweDAwLCAweDIxLCAweDFiLCAweDIwLCAweGZmLCAweGY3LCAweGVjLCAweGZlLCAweDFhLCAweDIwLCAweGZmLCAweGY3LCAKKzB4NGYsIDB4ZmUsIDB4MDEsIDB4MjEsIDB4YzksIDB4MDMsIDB4MDEsIDB4NDMsIDB4MWEsIDB4MjAsIDB4ZmYsIDB4ZjcsIAorMHhlMywgMHhmZSwgMHgwMCwgMHgyNywgMHgwMywgMHhlMCwgMHgwOCwgMHgyZiwgMHgwMSwgMHhkMywgMHgwZiwgMHgyZiwgCisweDA4LCAweGQ5LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDQwLCAweGZlLCAweDc5LCAweDAwLCAweDA5LCAweDE5LCAKKzB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzksIDB4MTgsIDB4ODgsIDB4ODMsIDB4MDEsIDB4MzcsIDB4MjAsIDB4MmYsIAorMHhlZiwgMHhkMywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhlZCwgMHhhZiwgMHgyMSwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDgxLCAweGIwLCAweDEzLCAweDQ4LCAKKzB4MDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4NDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHg4MSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHhjMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgCisweDAxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAKKzB4ODEsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4YzEsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHgwMSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHg0MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgCisweDgxLCAweDZhLCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweGMwLCAweDZhLCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAKKzB4MDEsIDB4YjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDgsIDB4MTQsIDB4NDAsIDB4ZjAsIDB4YjUsIDB4ODMsIDB4YjAsIAorMHg2OCwgMHg0ZCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhlZiwgMHgxOCwgMHhmOCwgMHg4YiwgMHgwNCwgMHgyMiwgCisweDAyLCAweDQwLCAweDAyLCAweDkyLCAweDcxLCAweDIzLCAweDViLCAweDAxLCAweGU4LCAweDE4LCAweDAxLCAweDg4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4OTEsIDB4NDAsIDB4ODgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTAsIDB4MDAsIDB4MjQsIAorMHgwMywgMHhlMCwgMHgwOCwgMHgyYywgMHgwMSwgMHhkMywgMHgwZiwgMHgyYywgMHgwOCwgMHhkOSwgMHgyMCwgMHgxYywgCisweGZmLCAweGY3LCAweGU4LCAweGZkLCAweDYxLCAweDAwLCAweDQ5LCAweDE5LCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAKKzB4YzksIDB4MTgsIDB4ODgsIDB4ODMsIDB4MDEsIDB4MzQsIDB4MjAsIDB4MmMsIDB4ZWYsIDB4ZDMsIDB4NTgsIDB4NGMsIAorMHhlMCwgMHg2OSwgMHgwMCwgMHgyOCwgMHgxNSwgMHhkMCwgMHg1NywgMHg0ZSwgMHgyMCwgMHgyNSwgMHgwMSwgMHgzZCwgCisweDUzLCAweDQ5LCAweGUwLCAweDY5LCAweDMwLCAweDQwLCAweDBiLCAweGQwLCAweDY4LCAweDAwLCAweDQwLCAweDE4LCAKKzB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4ODEsIDB4OGIsIDB4MjgsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHg2NSwgMHhmZSwgMHhlMCwgMHg2OSwgMHhiMCwgMHg0MywgMHhlMCwgMHg2MSwgMHg3NiwgMHgwOCwgMHgwMCwgMHgyZCwgCisweGViLCAweGQxLCAweDAxLCAweDIwLCAweGZmLCAweGY3LCAweGMyLCAweGZkLCAweDQ4LCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4ZjgsIDB4ODMsIDB4ZjgsIDB4OGIsIDB4YzIsIDB4MDgsIDB4MjUsIDB4ZDMsIDB4Y2EsIDB4NjgsIDB4MDEsIDB4MmEsIAorMHgxMywgMHhkMSwgMHgwYSwgMHg3OSwgMHgwMCwgMHgyYSwgMHgxZiwgMHhkMSwgMHg0OSwgMHg4OCwgMHgwMCwgMHgyOSwgCisweDFjLCAweGQxLCAweDAxLCAweDk5LCAweDQzLCAweDRhLCAweDAwLCAweDI5LCAweDA1LCAweGQwLCAweDAxLCAweDI5LCAKKzB4MTYsIDB4ZDEsIDB4NTEsIDB4OGIsIDB4YzksIDB4MDgsIDB4MTMsIDB4ZDIsIDB4MGYsIDB4ZTAsIDB4NTEsIDB4OGIsIAorMHgwOSwgMHgwOSwgMHgwZiwgMHhkMiwgMHgwYiwgMHhlMCwgMHgwYSwgMHg3OSwgMHgwMCwgMHgyYSwgMHgwYiwgMHhkMSwgCisweDZkLCAweDIzLCAweDViLCAweDAxLCAweGM5LCAweDE4LCAweDhhLCAweDg4LCAweGM5LCAweDg4LCAweDExLCAweDQwLCAKKzB4NDksIDB4MDksIDB4MDksIDB4MDcsIDB4MDIsIDB4ZDEsIDB4MDQsIDB4MjMsIDB4OTgsIDB4NDMsIDB4ZjgsIDB4ODMsIAorMHhmOCwgMHg4YiwgMHgwNCwgMHgyMSwgMHgwMSwgMHg0MCwgMHgwMiwgMHg5YSwgMHgxZiwgMHhkMCwgMHhiOSwgMHg4YiwgCisweDRhLCAweDBiLCAweDI3LCAweGQzLCAweDgwLCAweDA5LCAweDI1LCAweGQzLCAweGZmLCAweDIzLCAweDAxLCAweDk4LCAKKzB4MDEsIDB4MzMsIDB4OTgsIDB4NDIsIDB4MjAsIDB4ZDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4OTgsIDB4MDEsIDB4MjgsIAorMHgwMCwgMHhkMSwgMHgwNSwgMHgwMiwgMHgwMSwgMHg5OCwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMSwgMHgwMSwgMHgyMywgCisweDViLCAweDAzLCAweDFkLCAweDQzLCAweGE5LCAweDQyLCAweDEzLCAweGQwLCAKKzB4MDAsIDB4MjAsIDB4MjksIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MTAsIDB4ZmUsIDB4YmQsIDB4ODMsIDB4MDAsIDB4MjAsIAorMHhjMCwgMHg0MywgMHg2MCwgMHg2MiwgMHgwYSwgMHhlMCwgMHhiOCwgMHg4YiwgMHg0MCwgMHgwYiwgMHgwNywgMHhkMiwgCisweDA5LCAweDIxLCAweDQ5LCAweDAyLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweDAzLCAweGZlLCAweDA5LCAweDIwLCAKKzB4NDAsIDB4MDIsIDB4YjgsIDB4ODMsIDB4ZjgsIDB4OGIsIDB4YzAsIDB4MDgsIDB4MmQsIDB4ZDMsIDB4MWQsIDB4NDgsIAorMHhjNywgMHg2YSwgMHgwMSwgMHg5OCwgMHgwMCwgMHg5OSwgMHhmZiwgMHhmNywgMHg1MSwgMHhmYywgMHhjMiwgMHgwNywgCisweGQyLCAweDBmLCAweDFhLCAweDQ5LCAweDAzLCAweGQwLCAweDA0LCAweDIzLCAweGNkLCAweDZkLCAweDJiLCAweDQzLCAKKzB4MDMsIDB4ZTAsIDB4MDQsIDB4MjMsIDB4Y2QsIDB4NmQsIDB4OWQsIDB4NDMsIDB4MmIsIDB4MWMsIDB4Y2IsIDB4NjUsIAorMHg4MywgMHgwOCwgMHgwMywgMHhkMywgMHgwMiwgMHgyMywgMHhjZCwgMHg2ZCwgMHgyYiwgMHg0MywgMHgwMywgMHhlMCwgCisweDAyLCAweDIzLCAweGNkLCAweDZkLCAweDlkLCAweDQzLCAweDJiLCAweDFjLCAweGNiLCAweDY1LCAweDYxLCAweDZhLCAKKzB4ODEsIDB4NDIsIDB4MGMsIDB4ZDAsIDB4NjAsIDB4NjIsIDB4MGUsIDB4NDgsIDB4MDAsIDB4MmEsIDB4MDMsIDB4ZDAsIAorMHhmZiwgMHgyMSwgMHgyMSwgMHgzMSwgMHgzOSwgMHg0MywgMHgwMywgMHhlMCwgMHhmZiwgMHgyMywgMHgyMSwgMHgzMywgCisweDlmLCAweDQzLCAweDM5LCAweDFjLCAweGMxLCAweDYyLCAweDAzLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4NjgsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgyOCwgMHgxYywgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDQwLCAweDAwLCAweDE0LCAweDAwLCAweDkwLCAweGI0LCAweDAxLCAweDIyLCAKKzB4MjAsIDB4MjgsIDB4MGYsIDB4ZDIsIDB4NDMsIDB4MDAsIDB4MGYsIDB4MWMsIDB4MDcsIDB4NDksIDB4NWMsIDB4MTgsIAorMHgzNywgMHgyMywgMHg5YiwgMHgwMSwgMHhlMywgMHgxOCwgMHg5ZiwgMHg4MywgMHg4MiwgMHg0MCwgMHgwNywgMHgyMywgCisweDViLCAweDAyLCAweGM5LCAweDE4LCAweDEwLCAweDFjLCAweGNhLCAweDY5LCAweDEwLCAweDQzLCAweGM4LCAweDYxLCAKKzB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MGIsIDB4NDgsIDB4NDAsIDB4NjksIAorMHgwYiwgMHg0OSwgMHhjOSwgMHg4YiwgMHgwNCwgMHgyMiwgMHgwYSwgMHg0MCwgMHgwYSwgMHg0OSwgMHgwNiwgMHhkMCwgCisweDAxLCAweDIzLCAweGRiLCAweDAyLCAweDk4LCAweDQzLCAweDAxLCAweDIzLCAweGNhLCAweDZkLCAweDFhLCAweDQzLCAKKzB4MDUsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDIsIDB4MTgsIDB4NDMsIDB4Y2EsIDB4NmQsIDB4NTIsIDB4MDgsIAorMHg1MiwgMHgwMCwgMHhjYSwgMHg2NSwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweGU4LCAweDFiLCAweDAwLCAweDgwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4ZmYsIDB4ZjcsIDB4ZGUsIDB4ZmYsIDB4MDEsIDB4MWMsIDB4MDUsIDB4MjAsIDB4MDAsIDB4OTAsIDB4MDAsIDB4MjAsIAorMHgwMSwgMHhhYiwgMHgxOCwgMHg4MCwgMHgwNCwgMHgzYiwgMHg1OCwgMHg3MCwgMHgxYiwgMHgyMiwgMHgwMCwgMHhhYiwgCisweDVhLCAweDgwLCAweGQ5LCAweDgwLCAweDA1LCAweDQ5LCAweGM5LCAweDZkLCAweGMwLCAweDQ2LCAweDAyLCAweDkxLCAKKzB4MDMsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmQsIDB4ZjcsIDB4NzksIDB4ZjgsIDB4MDQsIDB4YjAsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHgwZiwgMHg0OCwgMHgwMSwgMHg2OCwgCisweDQ5LCAweDBjLCAweDA1LCAweGQyLCAweDAxLCAweDY4LCAweDA5LCAweDBjLCAweDA2LCAweGQxLCAweDAwLCAweDY4LCAKKzB4ODAsIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MGIsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MGMsIDB4MDEsIDB4ZTAsIAorMHgwYSwgMHg0OCwgMHg4MCwgMHg2YywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOSwgMHg0YiwgMHg5OCwgMHg0MiwgCisweDA1LCAweGQwLCAweDAyLCAweDMzLCAweDk4LCAweDQyLCAweDAyLCAweGQwLCAweDA3LCAweDRiLCAweDk4LCAweDQyLCAKKzB4MDEsIDB4ZDEsIDB4MDEsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MjAsIDB4ZmMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgCisweDA0LCAweDk5LCAweDAwLCAweDAwLCAweDA3LCAweDk5LCAweDAwLCAweDAwLCAweDkwLCAweGI0LCAweDAxLCAweDI0LCAKKzB4MjEsIDB4MWMsIDB4MTgsIDB4NDgsIDB4MDIsIDB4NjgsIDB4NTIsIDB4MGMsIDB4MDYsIDB4ZDIsIDB4MDIsIDB4NjgsIAorMHgxMiwgMHgwYywgMHgwMiwgMHhkMSwgMHgwMCwgMHg2OCwgMHg4MCwgMHgwYSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMSwgCisweDA5LCAweDA2LCAweDA5LCAweDBlLCAweDEyLCAweDRmLCAweDEzLCAweDRhLCAweDAyLCAweGQwLCAweDM4LCAweDY4LCAKKzB4MDAsIDB4MGMsIDB4MDAsIDB4ZTAsIDB4OTAsIDB4NmMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MTAsIDB4NGIsIAorMHg5OCwgMHg0MiwgMHgwOCwgMHhkMCwgMHgwMiwgMHgzMywgMHg5OCwgMHg0MiwgMHgwNSwgMHhkMCwgMHgwZSwgMHg0YiwgCisweDk4LCAweDQyLCAweDAyLCAweGQwLCAweDAyLCAweDNiLCAweDk4LCAweDQyLCAweDBjLCAweGQxLCAweDAwLCAweDI5LCAKKzB4MDIsIDB4ZDAsIDB4ZjgsIDB4NmEsIDB4MDAsIDB4MGMsIDB4MDAsIDB4ZTAsIAorMHhkMCwgMHg2YywgMHg0MCwgMHgwYSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyNCwgMHgyMCwgMHgwNiwgMHgwMCwgMHgwZSwgCisweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweGZiLCAweGU3LCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4OTksIDB4MDAsIDB4MDAsIAorMHgwNywgMHg5OSwgMHgwMCwgMHgwMCwgMHgwYywgMHg0OCwgMHgwMSwgMHg2OCwgMHg0OSwgMHgwYywgMHgwNSwgMHhkMiwgCisweDAxLCAweDY4LCAweDA5LCAweDBjLCAweDA1LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDAyLCAweGQzLCAKKzB4MDgsIDB4NDgsIDB4ODAsIDB4NjgsIDB4MDEsIDB4ZTAsIDB4MDgsIDB4NDgsIDB4NDAsIDB4NmMsIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHgwMCwgMHgyMSwgMHgwMywgMHgyOCwgMHgwMywgMHhkMCwgMHg0MCwgMHgwOCwgMHgwMSwgMHhkMywgCisweDAxLCAweDIwLCAweDcwLCAweDQ3LCAweDA4LCAweDFjLCAweGZjLCAweGU3LCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MDEsIDB4MjcsIAorMHgxYSwgMHg0YywgMHgyNSwgMHg2OCwgMHhmZiwgMHhmNywgMHg3MiwgMHhmZiwgMHgwMywgMHgxYywgMHgxOSwgMHg0YSwgCisweDAyLCAweDIxLCAweDAxLCAweDI2LCAweDE4LCAweDQ4LCAweDAxLCAweDJiLCAweDFiLCAweGQxLCAweGNiLCAweDA0LCAKKzB4MWUsIDB4NjAsIDB4NTUsIDB4MjMsIDB4MDMsIDB4NjAsIDB4MDAsIDB4MjMsIDB4NDMsIDB4NjAsIDB4MDYsIDB4NjgsIAorMHg1NSwgMHgyZSwgMHgxYiwgMHhkMSwgMHhhYSwgMHgyNiwgMHgwNiwgMHg2MCwgMHg0MywgMHg2MCwgMHgwMywgMHg2OCwgCisweGFhLCAweDJiLCAweDE1LCAweGQxLCAweDA5LCAweDIzLCAweDAzLCAweDYwLCAweDA1LCAweDIzLCAweDBmLCAweDRmLCAKKzB4YzAsIDB4NDYsIDB4M2IsIDB4NjAsIDB4MDMsIDB4MjMsIDB4MGUsIDB4NGYsIDB4YzAsIDB4NDYsIDB4M2IsIDB4NjAsIAorMHgxMSwgMHg2MCwgMHgwNywgMHg2OCwgMHgwOCwgMHhlMCwgMHgwOCwgMHgyMywgMHgyMywgMHg2MCwgMHgwNCwgMHgyMywgCisweDBhLCAweDRmLCAweGMwLCAweDQ2LCAweDNiLCAweDYwLCAweDExLCAweDYwLCAweDA2LCAweDYwLCAweDI3LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MjUsIDB4NjAsIDB4MzgsIDB4MWMsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMiwgMHg0MCwgCisweDAwLCAweDAwLCAweDJhLCAweDQwLCAweDAwLCAweDAwLCAweDI2LCAweDQwLCAweDAwLCAweDAwLCAweDI4LCAweDQwLCAKKzB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MzAsIDB4ZmYsIDB4MDEsIDB4MjgsIDB4MDUsIDB4ZDEsIAorMHgxOSwgMHg0OCwgMHgwMCwgMHg2OCwgMHgxOSwgMHg0OSwgMHg0OSwgMHg2YiwgMHgwOCwgMHg0MCwgMHgyMiwgMHhlMCwgCisweDE4LCAweDQ4LCAweDAxLCAweDY4LCAweDQ5LCAweDBjLCAweDA1LCAweGQyLCAweDAxLCAweDY4LCAweDA5LCAweDBjLCAKKzB4MDYsIDB4ZDEsIDB4MDAsIDB4NjgsIDB4ODAsIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MTQsIDB4NDgsIDB4MDAsIDB4NjgsIAorMHgwMCwgMHgwYywgMHgwMSwgMHhlMCwgMHgxMywgMHg0OCwgMHg4MCwgMHg2YywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDEyLCAweDRiLCAweGMwLCAweDE4LCAweDA4LCAweDI4LCAweDBiLCAweGQyLCAweDAxLCAweGEzLCAweDFiLCAweDVjLCAKKzB4NWIsIDB4MDAsIDB4OWYsIDB4NDQsIDB4MDUsIDB4MDMsIDB4MDcsIDB4MDMsIDB4MDcsIDB4MDcsIDB4MDUsIDB4MDMsIAorMHgwMywgMHgyMCwgMHgwMiwgMHhlMCwgMHgwMSwgMHgyMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgyMSwgCisweDM4LCAweDYwLCAweDgwLCAweDA3LCAweDAwLCAweGQxLCAweDAwLCAweDIxLCAweDA4LCAweDA2LCAweDAwLCAweDBlLCAKKzB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MzQsIDB4NmUsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgxMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgxOCwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGZlLCAweDY2LCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDgyLCAweGIwLCAKKzB4MDcsIDB4MWMsIDB4MDEsIDB4MjAsIDB4MDEsIDB4OTAsIDB4ZmYsIDB4ZjcsIDB4ZTcsIDB4ZmUsIDB4MDEsIDB4MjgsIAorMHgxMywgMHhkMSwgMHgzOCwgMHgyZiwgMHgwMSwgMHhkMCwgMHhhOCwgMHgyZiwgMHgwNywgMHhkMSwgMHgwMCwgMHgyNiwgCisweGY2LCAweDQzLCAweDM0LCAweDFjLCAweGE4LCAweDJmLCAweDAyLCAweGQxLCAweDMwLCAweDFjLCAweDAwLCAweDk2LCAKKzB4MzUsIDB4MWMsIDB4MTEsIDB4MjAsIDB4MDAsIDB4MDQsIDB4MDYsIDB4NjIsIDB4NDQsIDB4NjIsIDB4ODUsIDB4NjIsIAorMHgwMCwgMHg5OSwgMHhjMCwgMHg0NiwgMHhjMSwgMHg2MiwgMHgwMCwgMHgyMSwgMHgwOCwgMHg0OCwgMHhjMCwgMHg0NiwgCisweDAxLCAweDYwLCAweDM4LCAweDJmLCAweDAxLCAweGQwLCAweGE4LCAweDJmLCAweDA1LCAweGQxLCAweDAxLCAweDIxLCAKKzB4MDEsIDB4NjAsIDB4YTgsIDB4MmYsIDB4MDEsIDB4ZDEsIDB4MDMsIDB4MjEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4OTgsIAorMHgwMiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgzNCwgMHg2ZSwgMHgyMSwgMHg0MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MTIsIDB4NGMsIDB4MjEsIDB4NjgsIDB4MTIsIDB4NDgsIDB4ODEsIDB4NDIsIDB4MGIsIDB4ZDAsIDB4MDAsIDB4MjMsIAorMHgyMSwgMHgxYywgMHhlMiwgMHgxZCwgMHhjMSwgMHgzMiwgMHgwMCwgMHhlMCwgCisweDA4LCAweGMxLCAweDkxLCAweDQyLCAweGZjLCAweGQzLCAweDIwLCAweDYwLCAweGM4LCAweDIwLCAweGEwLCAweDgwLCAKKzB4NjcsIDB4NzIsIDB4MzgsIDB4MDEsIDB4MDAsIDB4ZjAsIDB4MTgsIDB4ZjgsIDB4MjcsIDB4NzIsIDB4MGEsIDB4NDgsIAorMHhjMCwgMHg0NiwgMHhlMCwgMHg2MCwgMHgwOSwgMHgyZiwgMHgwMCwgMHhkYiwgMHgwMCwgMHgyNywgMHhlMCwgMHgxOSwgCisweDAxLCAweDdkLCAweDAxLCAweDMxLCAweDAxLCAweDc1LCAweGUwLCAweDg4LCAweDAxLCAweDMwLCAweGUwLCAweDgwLCAKKzB4MDEsIDB4MjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHhlZSwgMHhmZiwgMHhjMCwgMHhkMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgwMywgMHg4MCwgMHhiNCwgMHgwOCwgMHg0YSwgCisweGQxLCAweDFkLCAweDg5LCAweDMxLCAweDBiLCAweDdhLCAweDIwLCAweDJiLCAweDAxLCAweGQzLCAweDAwLCAweDIzLCAKKzB4MGIsIDB4NzIsIDB4MDcsIDB4MWMsIDB4MDgsIDB4N2EsIDB4NDMsIDB4MWMsIDB4MGIsIDB4NzIsIDB4ODAsIDB4MTgsIAorMHg5MCwgMHgzMCwgMHg0NywgMHg3MiwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgCisweDA3LCAweDQ5LCAweDAxLCAweDIyLCAweDEyLCAweDA0LCAweDA4LCAweDY4LCAweDAyLCAweDQwLCAweDAxLCAweDIwLCAKKzB4MDAsIDB4MmEsIDB4MDYsIDB4ZDEsIDB4MGEsIDB4NjgsIDB4MTIsIDB4MGMsIDB4MDIsIDB4ZDEsIDB4MDksIDB4NjgsIAorMHg4OSwgMHgwYSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDkwLCAweGI1LCAweDA3LCAweDFjLCAweDA5LCAweDRjLCAweDM4LCAweDFjLCAweDIxLCAweDFjLCAweGZjLCAweGY3LCAKKzB4OTEsIDB4ZmYsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGUsIDB4ZjgsIDB4MDEsIDB4MjMsIDB4ZDgsIDB4NDIsIAorMHgwMSwgMHhkMSwgMHgwMCwgMHgwYywgMHhlMCwgMHg4MCwgMHgwMCwgMHgyMSwgMHgyMCwgMHgxYywgMHhmYywgMHhmNywgCisweGM1LCAweGZlLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGM0LCAweDY2LCAweDIxLCAweDQwLCAKKzB4ZjgsIDB4YjUsIDB4MDcsIDB4MWMsIDB4NzksIDB4N2EsIDB4NzYsIDB4NDgsIDB4MDAsIDB4MjMsIDB4NzYsIDB4NGMsIAorMHgwMSwgMHgyOSwgMHg1ZCwgMHhkMSwgMHhhMiwgMHg4OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHhhMSwgMHg4OSwgCisweDhhLCAweDQyLCAweDc0LCAweGRhLCAweGZhLCAweDdhLCAweDAwLCAweDJhLCAweDE1LCAweGQwLCAweDdhLCAweDZjLCAKKzB4MDAsIDB4MmEsIDB4MTIsIDB4ZDAsIDB4OGEsIDB4NDIsIDB4MTAsIDB4ZDgsIDB4MDAsIDB4OWEsIDB4NTEsIDB4MWMsIAorMHhhMSwgMHg4MCwgMHhhMSwgMHg4OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg4MSwgMHg3OCwgMHg2YywgMHg2YiwgMHg0ZSwgCisweGMwLCAweDQ2LCAweGYwLCAweDgwLCAweGEwLCAweDZhLCAweDU4LCAweDIzLCAweDc5LCAweDZjLCAweDU5LCAweDQzLCAKKzB4NDAsIDB4MTgsIDB4YzEsIDB4MWEsIDB4MjgsIDB4ZTAsIDB4MjIsIDB4ODgsIDB4MDEsIDB4MzIsIDB4MTIsIDB4MDQsIAorMHgxMiwgMHgwYywgMHgyMiwgMHg4MCwgMHg4YSwgMHg0MiwgMHgwMCwgMHhkYiwgMHgyMywgMHg4MCwgMHgwMCwgMHgyMiwgCisweDAwLCAweDI5LCAweDY5LCAweGRkLCAweDVmLCAweDRjLCAweGE0LCAweDZhLCAweDVlLCAweDRiLCAweDFkLCAweDg4LCAKKzB4NTgsIDB4MjMsIDB4NmIsIDB4NDMsIDB4ZTMsIDB4MTgsIDB4ZGUsIDB4MWQsIDB4MDEsIDB4MzYsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgxYiwgMHgwNiwgMHgxNSwgMHhkMSwgMHg1OCwgMHg0OSwgCisweDAwLCAweDlhLCAweDAxLCAweDMyLCAweDhhLCAweDgwLCAweDhhLCAweDg4LCAweGMwLCAweDQ2LCAweDQyLCAweDgxLCAKKzB4MDgsIDB4ODgsIDB4MDEsIDB4MzAsIDB4NTQsIDB4NGUsIDB4YzAsIDB4NDYsIDB4ZjAsIDB4ODAsIDB4NTgsIDB4MjAsIAorMHg2OCwgMHg0MywgMHgyMSwgMHgxOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgzOSwgMHhmYiwgMHhmMCwgMHg4OCwgCisweDAwLCAweDA0LCAweDAwLCAweDE0LCAweDk1LCAweGUwLCAweDRkLCAweDRiLCAweDAxLCAweDM1LCAweDJkLCAweDA0LCAKKzB4MmQsIDB4MGMsIDB4MWQsIDB4ODAsIDB4OGQsIDB4NDIsIDB4MDEsIDB4ZGIsIDB4MDAsIDB4MjUsIDB4MWQsIDB4ODAsIAorMHgwMSwgMHgzMiwgMHgxMiwgMHgwNCwgMHgxMiwgMHgxNCwgMHg5MSwgMHg0MiwgMHhjZSwgMHhkYywgMHg4MSwgMHhlMCwgCisweGUxLCAweDg4LCAweGUyLCAweDg5LCAweDkxLCAweDQyLCAweDE4LCAweGRhLCAweGY5LCAweDdhLCAweDAwLCAweDI5LCAKKzB4MmYsIDB4ZDAsIDB4NzksIDB4NmMsIDB4NDksIDB4MDQsIDB4NDksIDB4MGMsIDB4NzksIDB4NjQsIDB4MmEsIDB4ZDAsIAorMHhlMiwgMHg4OSwgMHg5MSwgMHg0MiwgMHgyNywgMHhkOCwgMHhlMSwgMHg4OCwgMHgwMSwgMHgzMSwgMHhlMSwgMHg4MCwgCisweGUxLCAweDg4LCAweGMwLCAweDQ2LCAweDgxLCAweDgxLCAweDAxLCAweDIzLCAweGRiLCAweDAzLCAweDc4LCAweDZjLCAKKzB4MTgsIDB4NDMsIDB4M2EsIDB4NGUsIDB4YzAsIDB4NDYsIDB4ZjAsIDB4ODAsIDB4MDAsIDB4ZTAsIDB4NjMsIDB4ZTAsIAorMHhlMCwgMHg2YSwgMHg3OSwgMHg2YywgMHg0YiwgMHgwMCwgMHg1OSwgMHgxOCwgMHg0OSwgMHgwMSwgMHg0MCwgMHgxOCwgCisweGMxLCAweDFmLCAweDU5LCAweDM5LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBmLCAweGZiLCAweGUwLCAweDZhLCAKKzB4NzksIDB4NmMsIDB4NGEsIDB4MDAsIDB4NTIsIDB4MTgsIDB4NTIsIDB4MDEsIDB4ODAsIDB4MTgsIDB4MDEsIDB4MzksIAorMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHg2MCwgMHgzOCwgMHgwMCwgMHhmMCwgMHg4OSwgMHhmYiwgMHhiNiwgMHhlNywgCisweDRhLCAweGUwLCAweDYxLCAweDg4LCAweDAxLCAweDMxLCAweDA5LCAweDA0LCAKKzB4MDksIDB4MGMsIDB4NjEsIDB4ODAsIDB4ZTIsIDB4ODksIDB4OTEsIDB4NDIsIDB4MDAsIDB4ZGIsIDB4NjMsIDB4ODAsIAorMHgwMCwgMHgyMSwgMHgwMCwgMHgyYSwgMHgzZSwgMHhkZCwgMHgyNCwgMHg0YywgMHhlNCwgMHg2YSwgMHgyMywgMHg0YiwgCisweDVkLCAweDg4LCAweDZiLCAweDAwLCAweDViLCAweDE5LCAweDViLCAweDAxLCAweGUzLCAweDE4LCAweGRlLCAweDFkLCAKKzB4MDEsIDB4MzYsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIAorMHgyMCwgMHhkMSwgMHgxYywgMHg0ZSwgMHhmMSwgMHg4OCwgMHgwMSwgMHgzMSwgMHhmMSwgMHg4MCwgMHhmMSwgMHg4OCwgCisweGMwLCAweDQ2LCAweDgxLCAweDgxLCAweDcwLCAweDg4LCAweDAxLCAweDIzLCAweGRiLCAweDAzLCAweDAxLCAweDMwLCAKKzB4MTgsIDB4NDMsIDB4MTcsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4ODAsIDB4NjgsIDB4MDAsIDB4NDAsIDB4MTksIAorMHg0MCwgMHgwMSwgMHgyMSwgMHgxOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhjZiwgMHhmYSwgMHg3MSwgMHg4OCwgCisweDRhLCAweDAwLCAweDUyLCAweDE4LCAweDUyLCAweDAxLCAweGYwLCAweDZhLCAweDgwLCAweDE4LCAweDAwLCAweGYwLCAKKzB4NGQsIDB4ZmIsIDB4MGUsIDB4NDksIDB4YzgsIDB4ODgsIDB4NzksIDB4ZTcsIDB4MGIsIDB4NGIsIDB4MDEsIDB4MzUsIAorMHgyZCwgMHgwNCwgMHgyZCwgMHgwYywgMHg1ZCwgMHg4MCwgMHg5NSwgMHg0MiwgMHgwMSwgMHhkYiwgMHgwMCwgMHgyNSwgCisweDVkLCAweDgwLCAweDAxLCAweDMxLCAweDA5LCAweDA0LCAweDA5LCAweDE0LCAweDhhLCAweDQyLCAweGMyLCAweGRjLCAKKzB4MDEsIDB4ODksIDB4MDEsIDB4MzEsIDB4MDEsIDB4ODEsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4ZjgsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg0YywgMHgyYiwgMHgwMCwgMHg4MCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweGM0LCAweDY2LCAweDIxLCAweDQwLCAweGYwLCAweGI0LCAweDA2LCAweDFjLCAweDAxLCAweDIzLCAweGRiLCAweDAzLCAKKzB4MzMsIDB4NDAsIDB4MDEsIDB4MjQsIDB4NDQsIDB4NGYsIDB4MDAsIDB4MjAsIDB4NDQsIDB4NGEsIDB4NDUsIDB4NGQsIAorMHhkMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHgwMCwgMHgyYiwgMHg0MSwgMHhkMCwgMHhlMywgMHgwMywgMHhmMywgMHgxYSwgCisweDczLCAweGQwLCAweGVlLCAweDg5LCAweDllLCAweDQyLCAweDcxLCAweGQzLCAweGVlLCAweDg4LCAweDAwLCAweDJlLCAKKzB4NmQsIDB4ZDAsIDB4ZWQsIDB4NmEsIDB4NWUsIDB4MWUsIDB4NzMsIDB4MDAsIDB4OWIsIDB4MTksIDB4NWIsIDB4MDEsIAorMHhlZCwgMHgxOCwgMHhhZSwgMHg2OCwgMHgzNiwgMHgwNiwgMHgzNiwgMHgwZSwgMHgwMywgMHgyZSwgMHgwMiwgMHhkMCwgCisweGNlLCAweDg5LCAweDAxLCAweDM2LCAweGNlLCAweDgxLCAweDQwLCAweDM1LCAweGFkLCAweDhiLCAweGFkLCAweDAwLCAKKzB4MzUsIDB4NGUsIDB4NzYsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NzAsIDB4NTEsIDB4NTUsIDB4ODksIDB4MDEsIDB4MzUsIAorMHg1NSwgMHg4MSwgMHgzMiwgMHg0ZSwgMHhmMiwgMHg2YSwgMHhkMiwgMHgxOCwgMHg5MCwgMHg2MCwgMHhmMiwgMHg2YSwgCisweGQyLCAweDE4LCAweDkwLCAweDYzLCAweGYyLCAweDZhLCAweGQyLCAweDE4LCAweGQwLCAweDYzLCAweGYyLCAweDZhLCAKKzB4ZDIsIDB4MTgsIDB4MTAsIDB4NjQsIDB4ZjIsIDB4NmEsIDB4ZDIsIDB4MTgsIDB4NTAsIDB4NjQsIDB4ZjIsIDB4NmEsIAorMHhkMiwgMHgxOCwgMHg5MCwgMHg2NCwgMHhmMiwgMHg2YSwgMHhkMiwgMHgxOCwgMHhkMCwgMHg2NCwgMHhmMCwgMHg4OCwgCisweDAxLCAweDM4LCAweGYwLCAweDgwLCAweGYwLCAweDg4LCAweGMwLCAweDQ2LCAweDg4LCAweDgxLCAweDI0LCAweDQ5LCAKKzB4MDAsIDB4MjgsIDB4MzksIDB4ZDEsIDB4NGYsIDB4ODAsIDB4MzcsIDB4ZTAsIDB4MDAsIDB4MmUsIDB4MzgsIDB4ZDksIAorMHhhYiwgMHg4OSwgMHhiMywgMHg0MiwgMHgzMCwgMHhkMywgMHhhYiwgMHg4OCwgMHgwMCwgMHgyYiwgMHgyYywgMHhkMCwgCisweDUzLCAweDg5LCAweDAxLCAweDMzLCAweDUzLCAweDgxLCAweDJhLCAweDFjLCAweGFkLCAweDZhLCAweDU4LCAweDIzLCAKKzB4MDEsIDB4M2UsIDB4NzMsIDB4NDMsIDB4ZWQsIDB4MTgsIDB4YWUsIDB4NjgsIDB4MzYsIDB4MDYsIDB4MzYsIDB4MGUsIAorMHgwMywgMHgyZSwgMHgwMiwgMHhkMCwgMHhjZSwgMHg4OSwgMHgwMSwgMHgzNiwgMHhjZSwgMHg4MSwgMHhhOCwgMHg2MCwgCisweDk1LCAweDZhLCAweGVkLCAweDE4LCAweGE4LCAweDYzLCAweDk1LCAweDZhLCAweGVkLCAweDE4LCAweGU4LCAweDYzLCAKKzB4OTUsIDB4NmEsIDB4ZWQsIDB4MTgsIDB4MjgsIDB4NjQsIDB4OTUsIDB4NmEsIDB4ZWQsIDB4MTgsIDB4NjgsIDB4NjQsIAorMHg5NSwgMHg2YSwgMHhlZCwgMHgxOCwgMHhhOCwgMHg2NCwgMHg5NSwgMHg2YSwgMHhlYiwgMHgxOCwgMHhkOCwgMHg2NCwgCisweDkwLCAweDg4LCAweDAxLCAweDM4LCAweDkwLCAweDgwLCAweDkwLCAweDg4LCAweGMwLCAweDQ2LCAweDQ4LCAweDgxLCAKKzB4MDAsIDB4MjgsIDB4MDMsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDQsIDB4ZTAsIDB4MDMsIDB4ZTAsIDB4MTcsIDB4ODAsIAorMHgyMCwgMHgxYywgMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHhjYSwgMHg4OSwgMHgwMSwgMHgzMiwgMHhjYSwgMHg4MSwgCisweGY5LCAweGU3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4MDAsIDB4MjEsIDB4NDEsIDB4NjAsIDB4MTAsIDB4NDksIAorMHg0YSwgMHg2OCwgMHgwMCwgMHgyYSwgMHgxMCwgMHhkMSwgMHhjYSwgMHg2OCwgMHgwMCwgMHgyYSwgMHgwNCwgMHhkMCwgCisweGNhLCAweDFkLCAweDE5LCAweDMyLCAweDEyLCAweDc5LCAweDAwLCAweDJhLCAweDA4LCAweGQwLCAweDRhLCAweDY5LCAKKzB4MDAsIDB4MmEsIDB4MGIsIDB4ZDEsIDB4ODgsIDB4NjEsIDB4NDgsIDB4NjEsIAorMHgwMCwgMHhmMCwgMHgxMCwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg0YSwgMHg2OSwgMHgwMCwgMHgyYSwgCisweDAyLCAweGQxLCAweDg4LCAweDYxLCAweDQ4LCAweDYxLCAweGY3LCAweGU3LCAweDhhLCAweDY5LCAweGMwLCAweDQ2LCAKKzB4NTAsIDB4NjAsIDB4ODgsIDB4NjEsIDB4ZjIsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHhiMCwgMHhiNSwgMHgyYSwgMHg0OCwgMHg0MCwgMHg2OSwgMHgwMCwgMHgyOCwgMHg0YywgMHhkMCwgMHgwOCwgMHgyMiwgCisweGMxLCAweDY4LCAweDBhLCAweDQwLCAweDAwLCAweDI3LCAweDI3LCAweDRiLCAweGQ5LCAweDFkLCAweGI5LCAweDMxLCAKKzB4MDAsIDB4MmEsIDB4MTEsIDB4ZDAsIDB4MDQsIDB4MjIsIDB4MjUsIDB4NGMsIDB4YzAsIDB4NDYsIDB4MGMsIDB4NjEsIAorMHgyNCwgMHg0YywgMHhjMCwgMHg0NiwgMHg0YywgMHg2MiwgMHgyNCwgMHg0YywgMHhjMCwgMHg0NiwgMHg4YywgMHg2MiwgCisweDIzLCAweDRjLCAweGMwLCAweDQ2LCAweGNjLCAweDYyLCAweDIzLCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYzLCAKKzB4NGYsIDB4NjMsIDB4MTIsIDB4ZTAsIDB4MDUsIDB4MjIsIDB4MjEsIDB4NGMsIDB4YzAsIDB4NDYsIDB4MGMsIDB4NjEsIAorMHgyMCwgMHg0YywgMHhjMCwgMHg0NiwgMHg0YywgMHg2MiwgMHgyMCwgMHg0YywgMHhjMCwgMHg0NiwgMHg4YywgMHg2MiwgCisweDFmLCAweDRjLCAweGMwLCAweDQ2LCAweGNjLCAweDYyLCAweDFmLCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYzLCAKKzB4MWUsIDB4NGMsIDB4YzAsIDB4NDYsIDB4NGMsIDB4NjMsIDB4NDAsIDB4MjQsIDB4Y2MsIDB4ODIsIDB4NGYsIDB4ODMsIAorMHgxYywgMHg0ZiwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyYSwgMHgwYywgMHhkOSwgMHg4YywgMHgwMCwgMHgwNSwgMHgxOSwgCisweDZkLCAweDZhLCAweDdkLCAweDQwLCAweGU0LCAweDE4LCAweGZmLCAweDM0LCAweDAxLCAweDM0LCAweDY1LCAweDYyLCAKKzB4MDEsIDB4MzEsIDB4OTEsIDB4NDIsIDB4ZjQsIDB4ZDMsIDB4MTAsIDB4MjksIDB4MDcsIDB4ZDIsIDB4OGEsIDB4MDAsIAorMHhkMiwgMHgxOCwgMHhmZiwgMHgzMiwgMHgwMSwgMHgzMiwgMHg1NywgMHg2MiwgMHgwMSwgMHgzMSwgMHgxMCwgMHgyOSwgCisweGY3LCAweGQzLCAweDExLCAweDQ5LCAweDAwLCAweGYwLCAweDIyLCAweGY4LCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4YWMsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHgyOCwgMHgwMSwgMHg0MCwgMHgwMCwgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgCisweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLCAweDIwLCAweDAxLCAweDQwLCAweDAwLCAKKzB4NjcsIDB4NDUsIDB4MjMsIDB4MDEsIDB4ZWYsIDB4Y2QsIDB4YWIsIDB4ODksIDB4OTgsIDB4YmEsIDB4ZGMsIDB4ZmUsIAorMHgxMCwgMHgzMiwgMHg1NCwgMHg3NiwgMHhjMywgMHhkMiwgMHhlMSwgMHhmMCwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgCisweDMwLCAweDgwLCAweDIwLCAweDQwLCAweGIwLCAweGI1LCAweDBmLCAweDFjLCAweDE1LCAweDRkLCAweGU5LCAweDFkLCAKKzB4YzksIDB4MzEsIDB4MTUsIDB4NGMsIDB4MjMsIDB4MWMsIDB4MTUsIDB4NGEsIDB4MDAsIDB4MjAsIDB4ZmMsIDB4ZjcsIAorMHg0NCwgMHhmYiwgMHhlOSwgMHgxZCwgMHhmZiwgMHgzMSwgMHgxZSwgMHgzMSwgMHgyMywgMHgxYywgMHgwZCwgMHgxYywgCisweDExLCAweDRhLCAweDAxLCAweDIwLCAweGZjLCAweGY3LCAweDNiLCAweGZiLCAweDI5LCAweDFjLCAweDIzLCAweDFjLCAKKzB4MGUsIDB4NGEsIDB4MDAsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4MzUsIDB4ZmIsIDB4MzksIDB4MWMsIDB4MjMsIDB4MWMsIAorMHgwYywgMHg0YSwgMHgwMSwgMHgyMCwgMHhmYywgMHhmNywgMHgyZiwgMHhmYiwgMHgwMCwgMHgyMSwgMHgwYiwgMHg0OCwgCisweGMyLCAweDFkLCAweDE5LCAweDMyLCAweDUxLCAweDcxLCAweDAxLCAweDIxLCAweGZmLCAweDMwLCAweDAxLCAweDMwLCAKKzB4NDEsIDB4NjIsIDB4MDgsIDB4MWMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhhYywgMHhhYiwgMHgyMCwgMHg0MCwgMHg3NSwgMHgwOCwgMHhmZiwgMHhmZiwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwgCisweDQwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweDAwLCAweDA3LCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjUsIDB4MzcsIDB4NGEsIDB4NTAsIDB4NjksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4MzAsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgzMywgMHg0YiwgMHgwMSwgMHgyOSwgCisweDQ5LCAweGQxLCAweDFmLCAweDY4LCAweDE5LCAweDFjLCAweDMyLCAweDRiLCAweDlmLCAweDQyLCAweDA0LCAweGQxLCAKKzB4ZmYsIDB4ZjcsIDB4M2UsIDB4ZmYsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjMsIAorMHg5ZiwgMHgwMCwgMHhjYywgMHg1OSwgMHg1NSwgMHg2OSwgMHhlZiwgMHgxOSwgMHgzYywgMHg2MSwgMHgwMSwgMHgzMywgCisweDA1LCAweDJiLCAweGY3LCAweGQzLCAweDAwLCAweDBhLCAweDAwLCAweDAyLCAweDAyLCAweDIzLCAweDE4LCAweDQzLCAKKzB4NTMsIDB4NjksIDB4YzAsIDB4NDYsIDB4OTgsIDB4NjAsIDB4NTAsIDB4NjksIDB4MDgsIDB4MjMsIDB4YzIsIDB4NjgsIAorMHgxMywgMHg0MCwgMHgyNSwgMHg0ZiwgMHhmYSwgMHgxZCwgMHhiOSwgMHgzMiwgMHgwMCwgMHgyYiwgMHgwMiwgMHhkMCwgCisweDA0LCAweDIzLCAweDIzLCAweDRjLCAweDAxLCAweGUwLCAweDA1LCAweDIzLCAweDIyLCAweDRjLCAweGMwLCAweDQ2LCAKKzB4MTQsIDB4NjEsIDB4NDAsIDB4MjQsIDB4ZDQsIDB4ODIsIDB4MDAsIDB4MjQsIDB4NTQsIDB4ODMsIDB4MjAsIDB4NGMsIAorMHgwMCwgMHgyMiwgMHgwMCwgMHgyYiwgMHgwYywgMHhkOSwgMHg5NSwgMHgwMCwgCisweDQ2LCAweDE5LCAweDc2LCAweDZhLCAweDY2LCAweDQwLCAweGVkLCAweDE5LCAweGZmLCAweDM1LCAweDAxLCAweDM1LCAKKzB4NmUsIDB4NjIsIDB4MDEsIDB4MzIsIDB4OWEsIDB4NDIsIDB4ZjQsIDB4ZDMsIDB4MTAsIDB4MmEsIDB4MDcsIDB4ZDIsIAorMHg5MywgMHgwMCwgMHhkYiwgMHgxOSwgMHhmZiwgMHgzMywgMHgwMSwgMHgzMywgMHg1YywgMHg2MiwgMHgwMSwgMHgzMiwgCisweDEwLCAweDJhLCAweGY3LCAweGQzLCAweGZmLCAweGY3LCAweDcwLCAweGZmLCAweGJjLCAweGU3LCAweDAwLCAweDIxLCAKKzB4OGYsIDB4MDAsIDB4ZGMsIDB4NTksIDB4NTUsIDB4NjksIDB4ZWYsIDB4MTksIDB4N2MsIDB4NjIsIDB4MDEsIDB4MzEsIAorMHgwNSwgMHgyOSwgMHhmNywgMHhkMywgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgwMywgMHgyMywgMHgxOCwgMHg0MywgCisweDUxLCAweDY5LCAweGMwLCAweDQ2LCAweDg4LCAweDYwLCAweDUwLCAweDY5LCAweDQwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NTAsIDB4NjEsIDB4MDksIDB4NDgsIDB4ZmMsIDB4ZjcsIDB4YTQsIDB4ZmEsIDB4YTQsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgzMCwgMHg4MCwgMHgyMCwgMHg0MCwgMHg2NywgMHg0NSwgMHgyMywgMHgwMSwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweDI4LCAweDAxLCAweDQwLCAweDAwLCAweDIwLCAweDAxLCAweDQwLCAweDAwLCAKKzB4NWMsIDB4NWMsIDB4NWMsIDB4NWMsIDB4MTEsIDB4MzEsIDB4ZmYsIDB4ZmYsIDB4ZjAsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgzYiwgMHg0OCwgMHgzYywgMHg0YywgMHgwOCwgMHgyMSwgMHgyMCwgMHg2MCwgMHhhMSwgMHg4MCwgMHgwMCwgMHgyMCwgCisweDIwLCAweDgxLCAweGUxLCAweDgwLCAweDYwLCAweDgxLCAweDM5LCAweDQ4LCAweGMwLCAweDQ2LCAweGUwLCAweDYwLCAKKzB4MzgsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MjAsIDB4NjEsIDB4MzgsIDB4NDgsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjEsIAorMHgzNywgMHg0OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2MSwgMHgzNywgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2MSwgCisweDM2LCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDYyLCAweDM2LCAweDQ4LCAweGMwLCAweDQ2LCAweDYwLCAweDYyLCAKKzB4MzUsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjIsIDB4MzUsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ZTAsIDB4NjIsIAorMHgzNCwgMHg0OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MywgMHgzNCwgMHg0OCwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2MywgCisweDMzLCAweDQ4LCAweGMwLCAweDQ2LCAweGEwLCAweDYzLCAweDMzLCAweDQ4LCAweGMwLCAweDQ2LCAweGUwLCAweDYzLCAKKzB4MzIsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MjAsIDB4NjQsIDB4MzIsIDB4NDgsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjQsIAorMHgzMSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2NCwgMHgzMSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2NCwgCisweDMwLCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDY1LCAweDMwLCAweDQ5LCAweGM4LCAweDY4LCAweDAyLCAweDA0LCAKKzB4ODksIDB4NjksIDB4NGEsIDB4NDAsIDB4ZTMsIDB4MWQsIDB4NzksIDB4MzMsIDB4MDksIDB4MDQsIDB4YzksIDB4NDMsIAorMHhjMCwgMHg0MywgMHg0OCwgMHg0MCwgMHhlMSwgMHgxZCwgMHhiOSwgMHgzMSwgMHhkYSwgMHg2MywgMHgwOCwgMHg2MCwgCisweDI5LCAweDRkLCAweDIxLCAweDFjLCAweDJiLCAweDFjLCAweDI5LCAweDRhLCAweDAwLCAweDIwLCAweGZjLCAweGY3LCAKKzB4M2UsIDB4ZmEsIDB4MjgsIDB4NGEsIDB4ZTEsIDB4MWQsIDB4YjUsIDB4MzEsIDB4MDEsIDB4MjAsIDB4MmIsIDB4MWMsIAorMHgwZSwgMHgxYywgMHhmYywgMHhmNywgMHgzNiwgMHhmYSwgMHgyNCwgMHg0YSwgMHgwMCwgMHgyMCwgMHgzMSwgMHgxYywgCisweDJiLCAweDFjLCAweGZjLCAweGY3LCAweDMwLCAweGZhLCAweGUxLCAweDFkLCAweDRkLCAweDMxLCAweDJiLCAweDFjLCAKKzB4MjAsIDB4NGEsIDB4MDEsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4MjksIDB4ZmEsIDB4ZTAsIDB4MWQsIDB4NWQsIDB4MzAsIAorMHgwMSwgMHg2OCwgMHgwMCwgMHgyOSwgMHhmYywgMHhkMCwgMHg2MCwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgzOCwgMHg2NSwgCisweDIwLCAweDZlLCAweGMwLCAweDQ2LCAweDc4LCAweDY1LCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ODAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4OGMsIDB4YjksIDB4MjAsIDB4NDAsIDB4ODEsIDB4ODEsIDB4NDgsIDB4YmQsIAorMHg3OSwgMHg1NiwgMHgyMywgMHg4YywgMHg5MywgMHgwYywgMHg4MiwgMHg5NSwgMHgxZCwgMHgwZSwgMHgxMiwgMHhjZiwgCisweDliLCAweDNiLCAweGMwLCAweGU5LCAweGU2LCAweDU1LCAweDdjLCAweDgyLCAweDk5LCAweGY2LCAweDc4LCAweDAyLCAKKzB4ZDEsIDB4ZDcsIDB4MjUsIDB4NzMsIDB4NzIsIDB4OGMsIDB4MzMsIDB4MTAsIDB4ZjcsIDB4MDMsIDB4ZjEsIDB4NDIsIAorMHg2YywgMHg5YiwgMHg0YSwgMHhhNywgMHg4MiwgMHg4ZSwgMHgyMywgMHhhOSwgMHg5MCwgMHhiMSwgMHg4MiwgMHg4ZSwgCisweGRjLCAweDNmLCAweGZiLCAweDI5LCAweDAwLCAweDYyLCAweDIyLCAweDQ1LCAweDg4LCAweDJiLCAweGYxLCAweDg1LCAKKzB4MTIsIDB4NjEsIDB4ZDEsIDB4NzMsIDB4NmUsIDB4YjEsIDB4MTEsIDB4MTYsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHg3NSwgMHgwOCwgMHhmZiwgMHhmZiwgMHg1NCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgCisweDE0LCAweDAwLCAweDAzLCAweDAwLCAweDgwLCAweGI1LCAweDBmLCAweDFjLCAweDM5LCAweDFjLCAweDAwLCAweGYwLCAKKzB4MzMsIDB4ZjgsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NGMsIDB4ZmYsIDB4MDMsIDB4NDgsIDB4MDEsIDB4ODksIAorMHgwMSwgMHgzMSwgMHgwMSwgMHg4MSwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA0LCAweDFjLCAKKzB4MGYsIDB4MWMsIDB4MjAsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MWYsIDB4ZjgsIDB4ZTAsIDB4NjgsIAorMHgwMSwgMHgwZSwgMHhmZiwgMHgyMiwgMHgxMiwgMHgwNCwgMHgwMiwgMHg0MCwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgCisweGZmLCAweDIyLCAweDEyLCAweDAyLCAweDAyLCAweDQwLCAweDEyLCAweDAyLCAweDExLCAweDQzLCAweDAwLCAweDA2LCAKKzB4MDgsIDB4NDMsIDB4MzgsIDB4NjUsIDB4MjAsIDB4NjksIDB4YzAsIDB4NDYsIDB4NzgsIDB4NjUsIDB4NjAsIDB4NjksIAorMHhjMCwgMHg0NiwgMHhiOCwgMHg2NSwgMHgwMywgMHg0OCwgMHgwMSwgMHg4OSwgMHgwMSwgMHgzMSwgMHgwMSwgMHg4MSwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjUsIDB4MDAsIDB4MjIsIDB4OTMsIDB4MDAsIDB4MWYsIDB4MTgsIDB4YmYsIDB4NjksIDB4NWIsIDB4MTgsIAorMHg1ZiwgMHg2MiwgMHgwMSwgMHgzMiwgMHgwNSwgMHgyYSwgMHhmNywgMHhkMywgMHgwNywgMHg3YSwgMHhmYiwgMHgwOCwgCisweDAzLCAweGQzLCAweDAwLCAweDIzLCAweDkyLCAweDAwLCAweDUyLCAweDE4LCAweDEzLCAweDYyLCAweDA3LCAweDZiLCAKKzB4YzAsIDB4NDYsIDB4OGYsIDB4NjMsIDB4YzcsIDB4NmEsIDB4YzAsIDB4NDYsIDB4Y2YsIDB4NjMsIDB4ODcsIDB4NmIsIAorMHhjMCwgMHg0NiwgMHgwZiwgMHg2NCwgMHg0NywgMHg2YiwgMHhjMCwgMHg0NiwgMHg0ZiwgMHg2NCwgMHgwNywgMHg2YywgCisweGMwLCAweDQ2LCAweDhmLCAweDY0LCAweGMyLCAweDZiLCAweGMwLCAweDQ2LCAweGNhLCAweDY0LCAweGMyLCAweDg4LCAKKzB4YzAsIDB4NDYsIDB4MGEsIDB4ODAsIDB4ODIsIDB4N2EsIDB4MTIsIDB4MDYsIDB4MDMsIDB4N2EsIDB4MWIsIDB4MDQsIAorMHgxYSwgMHg0MywgMHhjMywgMHg4OCwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHg0MywgMHg3YSwgMHhkYiwgMHgwNywgCisweDFhLCAweDQzLCAweDhhLCAweDYwLCAweDE3LCAweDFjLCAweDgzLCAweDdhLCAweDVhLCAweDA4LCAweDA1LCAweGQzLCAKKzB4MTQsIDB4MjIsIDB4MWMsIDB4MWMsIDB4YTMsIDB4MDgsIDB4MDIsIDB4ZDIsIDB4MTUsIDB4MjIsIDB4MDAsIDB4ZTAsIAorMHgwMCwgMHgyMiwgMHgwMCwgMHg3YSwgMHg0MywgMHgwOCwgMHgxMCwgMHhkMywgMHhjMCwgMHgwOCwgMHgwMiwgMHhkMywgCisweDg4LCAweDIwLCAweDEwLCAweDQzLCAweDAxLCAweGUwLCAweDgwLCAweDIwLCAweDEwLCAweDQzLCAweDNhLCAweDBhLCAKKzB4MTIsIDB4MDIsIDB4MDEsIDB4MjMsIDB4MWEsIDB4NDMsIDB4YzgsIDB4NjAsIDB4OGEsIDB4NjAsIDB4MDgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHg3OCwgMHhmZCwgMHgwNSwgMHhlMCwgMHgzOCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgwMywgMHgyMywgCisweDE4LCAweDQzLCAweDg4LCAweDYwLCAweGNhLCAweDYwLCAweDAzLCAweDQ4LCAweDAxLCAweDg5LCAweDAxLCAweDMxLCAKKzB4MDEsIDB4ODEsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNCwgMHgwMiwgMHg2ZCwgMHgxNCwgMHg0YywgMHgxNSwgMHgxYywgMHhlNywgMHg2OSwgMHhiZCwgMHg0MCwgCisweDEzLCAweDFjLCAweDI2LCAweDZhLCAweGYzLCAweDQwLCAweDVkLCAweDQwLCAweDJlLCAweDFjLCAweDQ1LCAweDZkLCAKKzB4YmQsIDB4NDAsIDB4NmUsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzUsIDB4MWMsIDB4ZmQsIDB4NDAsIDB4MmYsIDB4MWMsIAorMHhiYiwgMHgwMCwgMHg2NSwgMHg2YSwgMHhlYiwgMHg1OCwgMHgwMCwgMHgyYiwgMHgwOCwgMHhkMCwgMHgyMywgMHg2OSwgCisweDAxLCAweDM3LCAweDlmLCAweDQyLCAweDAwLCAweGQzLCAweDAwLCAweDI3LCAweGJlLCAweDAwLCAweGFlLCAweDU5LCAKKzB4MDAsIDB4MmUsIDB4ZjcsIDB4ZDEsIDB4YTQsIDB4NjksIDB4YTIsIDB4NDAsIDB4MTEsIDB4NDMsIDB4MDUsIDB4NGIsIAorMHgxOSwgMHg0MywgMHhiYSwgMHgwMCwgMHhhOSwgMHg1MCwgMHg0MCwgMHgzMCwgMHg4NywgMHg4MywgMHhmMCwgMHhiYywgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4YjQsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MjksIDB4MDUsIDB4ZDksIDB4MDcsIDB4NzgsIAorMHg3YSwgMHg0MCwgMHgwMSwgMHgzMCwgMHgwMSwgMHgzMywgMHg4YiwgMHg0MiwgMHhmOSwgMHhkMywgMHhkMCwgMHg0MywgCisweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweGYwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MDAsIDB4MjQsIDB4ZmYsIDB4MjYsIDB4MDksIDB4MzYsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4OWEsIDB4ZjgsIAorMHgwMCwgMHhmMCwgMHhiOCwgMHhmOSwgMHgwNSwgMHgxYywgMHgwMCwgMHhmMCwgMHhjNywgMHhmYSwgMHgzZCwgMHg3MCwgCisweDI4LCAweDFjLCAweDAxLCAweDM3LCAweDAxLCAweDM0LCAweGI0LCAweDQyLCAweGYxLCAweGQzLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4YjUsIDB4MDAsIDB4ZjAsIDB4OTMsIDB4ZjgsIDB4MDAsIDB4ZjAsIAorMHhhNywgMHhmOSwgMHgwNywgMHgxYywgMHgwMCwgMHhmMCwgMHhiNiwgMHhmYSwgMHgzOCwgMHgwYSwgMHhmNiwgMHhkMywgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYzLCAweGI1LCAweDgyLCAweGIwLCAweDAyLCAweDk4LCAKKzB4NDEsIDB4MDIsIDB4NTMsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4NjQsIDB4ZjgsIDB4MDAsIDB4ZjAsIDB4YTgsIDB4ZmEsIAorMHhmZiwgMHhmNywgMHhlOCwgMHhmZiwgMHgwMCwgMHgyNCwgMHgwMCwgMHgyMCwgMHgwMSwgMHg5MCwgMHgyZSwgMHgyMCwgCisweDAwLCAweDkwLCAweDAwLCAweDI1LCAweDAwLCAweDI3LCAweDAyLCAweDk4LCAweDAxLCAweDI4LCAweDA0LCAweGQxLCAKKzB4MDAsIDB4OTgsIDB4ODQsIDB4NDIsIDB4MDEsIDB4ZDMsIDB4MDAsIDB4MjYsIAorMHgwOSwgMHhlMCwgMHgwMSwgMHg5OCwgMHg0MSwgMHgxYywgMHgwMSwgMHg5MSwgMHgwMCwgMHhmMCwgMHg2MCwgMHhmOCwgCisweDAwLCAweGYwLCAweDdlLCAweGY5LCAweDA2LCAweDFjLCAweDAwLCAweGYwLCAweDhkLCAweGZhLCAweGY4LCAweDAwLCAKKzB4ODYsIDB4NDAsIDB4MzUsIDB4NDMsIDB4MDEsIDB4MzQsIDB4MDEsIDB4MzcsIDB4MDQsIDB4MmYsIDB4ZTYsIDB4ZDMsIAorMHgwMywgMHg5OSwgMHgyMCwgMHhjMSwgMHgwMywgMHg5MSwgMHhmZiwgMHgyMywgMHgwOSwgMHgzMywgMHg5YywgMHg0MiwgCisweGRkLCAweGQzLCAweDA0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYwLCAweGI1LCAKKzB4MDQsIDB4MWMsIDB4MGYsIDB4MWMsIDB4MDEsIDB4MmMsIDB4MmEsIDB4ZDAsIDB4MTYsIDB4NDgsIDB4YzAsIDB4NmYsIAorMHg0MCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwMCwgMHgyNiwgMHgyMCwgMHhjZiwgCisweGIxLCAweDAwLCAweDg0LCAweDIwLCAweDAwLCAweGYwLCAweDI0LCAweGY4LCAweDI4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZGYsIDB4ZjksIDB4MjgsIDB4MGEsIDB4MDAsIDB4ZjAsIDB4ZGMsIDB4ZjksIDB4MjgsIDB4MGMsIDB4MDAsIDB4ZjAsIAorMHhkOSwgMHhmOSwgMHgyOCwgMHgwZSwgMHgwMCwgMHhmMCwgMHhkNiwgMHhmOSwgMHgwMCwgMHhmMCwgMHg1YywgMHhmYSwgCisweDAxLCAweDM2LCAweDQyLCAweDJlLCAweGU5LCAweGQzLCAweDYxLCAweDAyLCAweDgzLCAweDIwLCAweDAwLCAweGYwLCAKKzB4MGYsIDB4ZjgsIDB4MDAsIDB4ZjAsIDB4NTMsIDB4ZmEsIDB4ZmYsIDB4ZjcsIDB4OTMsIDB4ZmYsIDB4MDQsIDB4NDgsIAorMHhjMCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMSwgMHg2OCwgMHg5OSwgMHg0MywgMHgwMSwgMHg2MCwgMHhmMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA0LCAweDFjLCAKKzB4MGYsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NTksIDB4ZmEsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZjksIAorMHgzOCwgMHgwYywgMHgwMCwgMHhmMCwgMHhiMywgMHhmOSwgMHgzOCwgMHgwYSwgMHgwMCwgMHhmMCwgMHhiMCwgMHhmOSwgCisweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGFkLCAweGY5LCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4MDEsIDB4MWMsIDB4NTQsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4ZTcsIDB4ZmYsIDB4MDAsIDB4MjAsIAorMHgwMCwgMHhmMCwgMHhhMiwgMHhmOSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHgwMCwgMHhmMCwgCisweDNkLCAweGZhLCAweDU3LCAweDIwLCAweDAwLCAweGYwLCAweDlhLCAweGY5LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4OTAsIDB4YjUsIDB4MDgsIDB4NGYsIDB4ZmEsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MTQsIDB4NjgsIDB4OWMsIDB4NDMsIAorMHgxNCwgMHg2MCwgMHgyMywgMHgxYywgMHhmZiwgMHhmNywgMHg2NSwgMHhmZiwgMHhmOCwgMHg2ZiwgMHgyMCwgMHgyMywgCisweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDgsIDB4NGYsIDB4ZmEsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgxNCwgMHg2OCwgMHg5YywgMHg0MywgMHgxNCwgMHg2MCwgMHgyMywgMHgxYywgMHhmZiwgMHhmNywgMHg4NywgMHhmZiwgCisweGY4LCAweDZmLCAweDIwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MDQsIDB4MWMsIAorMHgwZiwgMHgxYywgMHgxOCwgMHg0ZSwgMHhmMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMSwgMHg2OCwgMHg5OSwgMHg0MywgCisweDAxLCAweDYwLCAweDYxLCAweDAyLCAweDUzLCAweDIwLCAweGZmLCAweGY3LCAweGE1LCAweGZmLCAweDAwLCAweGYwLCAKKzB4ZTksIDB4ZjksIDB4ZmYsIDB4ZjcsIDB4MjksIDB4ZmYsIDB4ZjgsIDB4MWQsIDB4MDUsIDB4MzAsIDB4MDEsIDB4MmMsIAorMHgwMywgMHhkMSwgMHgyMiwgMHgyZiwgMHgwMSwgMHhkMywgMHgwMCwgMHgyNywgMHgwZiwgMHhlMCwgMHg0NCwgMHgxYywgCisweGZmLCAweGY3LCAweGFhLCAweGZmLCAweDAwLCAweGYwLCAweGM4LCAweGY4LCAweDA3LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZDcsIDB4ZjksIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4YTIsIDB4ZmYsIDB4MDAsIDB4ZjAsIDB4YzAsIDB4ZjgsIAorMHgwNSwgMHgxYywgMHgwMCwgMHhmMCwgMHhjZiwgMHhmOSwgMHhmMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDI4LCAweDAyLCAweDM4LCAweDQzLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4YzIsIDB4YjAsIAorMHgxNCwgMHgxYywgMHgwZCwgMHgxYywgMHgwNywgMHgxYywgMHgwMSwgMHgyZiwgMHgyZiwgMHhkMCwgMHg3OSwgMHgwMiwgCisweDE5LCAweDRlLCAweGYwLCAweDZmLCAweDIwLCAweDIzLCAweDAyLCAweDY4LCAweDlhLCAweDQzLCAweDAyLCAweDYwLCAKKzB4NTMsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4NmIsIDB4ZmYsIDB4MDAsIDB4ZjAsIDB4YWYsIDB4ZjksIDB4ZmYsIDB4ZjcsIAorMHhlZiwgMHhmZSwgMHg2OCwgMHg0NiwgMHhmZiwgMHhmNywgMHhkNiwgMHhmZSwgMHg2YSwgMHg0NiwgMHhlOCwgMHgxZCwgCisweDA1LCAweDMwLCAweDE0LCAweDU0LCAweDIxLCAweDBhLCAweDY4LCAweDQ0LCAweDQxLCAweDcwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4OTksIDB4MGMsIDB4MzAsIDB4ZmYsIDB4ZjcsIDB4YmEsIDB4ZmUsIDB4MDIsIDB4YWIsIDB4MTgsIDB4NzAsIAorMHgwMCwgMHgyMCwgMHg1OCwgMHg3MCwgMHg2OCwgMHg0NiwgMHgwYywgMHgyMSwgCisweGZmLCAweGY3LCAweGIyLCAweGZlLCAweDAyLCAweGFiLCAweDU4LCAweDcwLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4MTUsIDB4ZmYsIDB4ZjAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIAorMHgwMSwgMHg2MCwgMHg0MiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGZmLCAweGI1LCAweGMyLCAweGIwLCAweDA3LCAweDFjLCAweDAxLCAweDJmLCAKKzB4MDEsIDB4ZDEsIDB4MDEsIDB4MjAsIDB4MzYsIDB4ZTAsIDB4NmIsIDB4NDYsIDB4MDAsIDB4MjAsIDB4YzQsIDB4NDMsIAorMHgxMCwgMHhjMywgMHgwMSwgMHgzMCwgMHg0MiwgMHgyOCwgMHhmYiwgMHhkMywgMHg2OCwgMHg0NiwgMHgwYywgMHgzMCwgCisweDAzLCAweDFjLCAweDAwLCAweDI0LCAweDAwLCAweDJhLCAweDBhLCAweGQ5LCAweDBlLCAweDg4LCAweGMwLCAweDQ2LCAKKzB4MDYsIDB4NzAsIDB4MGUsIDB4ODgsIDB4MzYsIDB4MTIsIDB4NDYsIDB4NzAsIDB4MDIsIDB4MzAsIDB4MDIsIDB4MzEsIAorMHgwMiwgMHgzNCwgMHg5NCwgMHg0MiwgMHhmNCwgMHhkMywgMHgwMCwgMHg5MiwgMHgxOCwgMHgxYywgMHgxMSwgMHgxYywgCisweGZmLCAweGY3LCAweDdjLCAweGZlLCAweDA0LCAweDFjLCAweDAwLCAweDIwLCAweDAxLCAweDkwLCAweDAyLCAweGFiLCAKKzB4MWMsIDB4NzAsIDB4NTgsIDB4NzAsIDB4OWQsIDB4NzAsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MjEsIDB4ZmYsIDB4ZjcsIAorMHg3MSwgMHhmZSwgMHgwMiwgMHhhYiwgMHg1OCwgMHg3MCwgMHg0NSwgMHg5YiwgMHgxZCwgMHgwNiwgMHgyZCwgMHgwZSwgCisweGFjLCAweDQyLCAweDAzLCAweGQxLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDNlLCAweGZmLCAKKzB4MDEsIDB4MjAsIDB4YWMsIDB4NDIsIDB4MDAsIDB4ZDEsIDB4MDAsIDB4MjAsIDB4NDYsIDB4YjAsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhiMCwgMHhiNSwgMHhjMiwgMHhiMCwgMHgwZiwgMHgxYywgMHg0MSwgMHgwMiwgCisweDE0LCAweDRjLCAweGUwLCAweDZmLCAweDIwLCAweDIzLCAweDAyLCAweDY4LCAweDlhLCAweDQzLCAweDAyLCAweDYwLCAKKzB4NTMsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4ZWYsIDB4ZmUsIDB4MDAsIDB4ZjAsIDB4MzMsIDB4ZjksIDB4ZmYsIDB4ZjcsIAorMHg3MywgMHhmZSwgMHg2OCwgMHg0NiwgMHhmZiwgMHhmNywgMHg1YSwgMHhmZSwgMHhlMCwgMHg2ZiwgMHgyMCwgMHgyMywgCisweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAyLCAweGFkLCAweDAxLCAweDYwLCAweDZkLCAweDc4LCAweDAwLCAweDI0LCAKKzB4MDIsIDB4YWIsIDB4NWMsIDB4NzAsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4M2MsIDB4ZmUsIAorMHhhOCwgMHg0MiwgMHgwMiwgMHhkMSwgMHgwMCwgMHg5OCwgMHg4NywgMHg0MiwgMHgwMSwgMHhkMywgMHgyMCwgMHgxYywgCisweDAwLCAweGUwLCAweDAxLCAweDIwLCAweDQyLCAweGIwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4NDYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTAsIDB4ZTMsIAorMHhiNCwgMHgyMiwgMHg5ZiwgMHhlNSwgMHhiNCwgMHgzMiwgMHg5ZiwgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIAorMHg4MSwgMHgwMywgMHg4MCwgMHhlMSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIDB4MDEsIDB4MDMsIDB4ODAsIDB4ZTEsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIDB4ODEsIDB4MDIsIDB4ODAsIDB4ZTEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAKKzB4MDEsIDB4MDIsIDB4ODAsIDB4ZTEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDgxLCAweDAxLCAweDgwLCAweGUxLCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDAxLCAweDAxLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgCisweDgxLCAweDAwLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgCisweDAxLCAweDAwLCAweDgwLCAweGUxLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAKKzB4YTQsIDB4MjEsIDB4OWYsIDB4ZTUsIDB4YTgsIDB4MzEsIDB4OWYsIDB4ZTUsIDB4YTAsIDB4MTMsIDB4YTAsIDB4ZTEsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MjAsIDB4MTMsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4YTAsIDB4MTIsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDIwLCAweDEyLCAweGEwLCAweGUxLCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweGEwLCAweDExLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDIwLCAweDExLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHhhMCwgMHgxMCwgMHhhMCwgMHhlMSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmYywgMHg0NiwgMHg2MCwgMHg0NywgMHhhMCwgMHgzMCwgMHg5ZiwgMHhlNSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAweDcwLCAweDMwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZmMsIDB4NDYsIDB4NjAsIDB4NDcsIDB4MzQsIDB4MjAsIDB4OWYsIDB4ZTUsIAorMHgzYywgMHgzMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGY4LCAweDAwLCAweDE4LCAweDQwLCAKKzB4MDQsIDB4MDEsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4ZmMsIDB4MDAsIDB4MTgsIDB4NDAsIAorMHg4MCwgMHhiNSwgMHgwMCwgMHhmMCwgMHgwYywgMHhmOCwgMHgwMCwgMHgyNywgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDQ3LCAweGY4LCAweDc4LCAweDFjLCAweDA3LCAweDA0LCAweDNmLCAweDBjLCAweDBjLCAweDJmLCAweGY3LCAweGRkLCAKKzB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MWQsIDB4NDgsIAorMHgwMiwgMHg2OCwgMHgxZCwgMHg0OSwgMHg4YiwgMHg2OSwgMHhkMiwgMHgxOCwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2NiwgCisweDhhLCAweDZhLCAweDQzLCAweDY4LCAweDliLCAweDE4LCAweDQzLCAweDYwLCAweDkzLCAweDQyLCAweDAyLCAweGQyLCAKKzB4ODIsIDB4NjgsIDB4MDEsIDB4MzIsIDB4ODIsIDB4NjAsIDB4YzIsIDB4NjgsIDB4MGIsIDB4NmEsIDB4ZDIsIDB4MTgsIAorMHhjMiwgMHg2MCwgMHg0MiwgMHg2OSwgMHhjYiwgMHg2OCwgMHhkMiwgMHgxOCwgMHg0MiwgMHg2MSwgMHhjMiwgMHg2OSwgCisweDhiLCAweDY4LCAweGQyLCAweDE4LCAweGMyLCAweDYxLCAweDAyLCAweDY5LCAweDBiLCAweDY5LCAweGQyLCAweDE4LCAKKzB4MDIsIDB4NjEsIDB4ODIsIDB4NjksIDB4MGIsIDB4NjgsIDB4ZDIsIDB4MTgsIDB4ODIsIDB4NjEsIDB4MDIsIDB4NmIsIAorMHhjYiwgMHg2OSwgMHhkMiwgMHgxOCwgMHgwMiwgMHg2MywgMHg0YSwgMHg2YSwgMHg0MywgMHg2YiwgMHg5YiwgMHgxOCwgCisweDQzLCAweDYzLCAweDkzLCAweDQyLCAweDAyLCAweGQyLCAweDgyLCAweDZiLCAweDAxLCAweDMyLCAweDgyLCAweDYzLCAKKzB4YzIsIDB4NmIsIDB4NGIsIDB4NjksIDB4ZDIsIDB4MTgsIDB4YzIsIDB4NjMsIDB4MDIsIDB4NmMsIDB4YzksIDB4NmEsIAorMHg1MSwgMHgxOCwgMHgwMSwgMHg2NCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDA4LCAweDE0LCAweDQwLCAweDg4LCAweGI1LCAweDY5LCAweDQ2LCAweDAwLCAweGYwLCAweDE3LCAweGY4LCAKKzB4ODEsIDB4MDgsIDB4MGEsIDB4ZDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjksIDB4MDcsIDB4ZDksIDB4MDAsIDB4MjIsIAorMHg4MywgMHgwMCwgMHgwMCwgMHg5ZiwgMHhjMCwgMHg0NiwgMHhmYSwgMHg1MCwgMHgwMSwgMHgzMCwgMHg4OCwgMHg0MiwgCisweGY4LCAweGQzLCAweDg4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweDAwLCAweGYwLCAKKzB4MDQsIDB4ZjgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHgyOCwgMHgwYSwgMHhkMCwgMHgwMSwgMHgyOCwgMHgwYSwgMHhkMCwgMHgwMiwgMHgyOCwgMHgwYywgMHhkMCwgCisweDAzLCAweDI4LCAweDAyLCAweGQxLCAweDA3LCAweDQ4LCAweDFjLCAweDIyLCAweDA4LCAweDYwLCAweDEwLCAweDFjLCAKKzB4NzAsIDB4NDcsIDB4MDYsIDB4NDgsIDB4MDQsIDB4ZTAsIDB4MDYsIDB4NDgsIDB4NTAsIDB4MjIsIDB4MDgsIDB4NjAsIAorMHhmNywgMHhlNywgMHgwNSwgMHg0OCwgMHg2OCwgMHgyMiwgMHgwOCwgMHg2MCwgMHhmMywgMHhlNywgMHgwMCwgMHgwMCwgCisweDA4LCAweDgzLCAweDIwLCAweDQwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4YjQsIDB4MDMsIDB4MjIsIDB4YzIsIDB4ODAsIDB4MTUsIDB4NGEsIAorMHhjMCwgMHg0NiwgMHg4MiwgMHg2MCwgMHgxNCwgMHg0YSwgMHgxMiwgMHg4OCwgMHgwMSwgMHgzMiwgMHhjMiwgMHg2MCwgCisweDAwLCAweDIwLCAweDEzLCAweDRhLCAweDEzLCAweDVjLCAweGMwLCAweDQ2LCAweDBiLCAweDcwLCAweDAxLCAweDMwLCAKKzB4MDEsIDB4MzEsIDB4MDgsIDB4MjgsIDB4ZjgsIDB4ZDMsIDB4MjAsIDB4MjIsIDB4MGEsIDB4NzAsIDB4MDEsIDB4MzEsIAorMHgwMCwgMHgyMCwgMHgwZSwgMHg0YiwgMHgxZiwgMHg1YywgMHhjMCwgMHg0NiwgMHgwZiwgMHg3MCwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMxLCAweDA4LCAweDI4LCAweGY4LCAweGQzLCAweDBhLCAweDcwLCAweDAxLCAweDMxLCAweDAwLCAweDIwLCAKKzB4MDksIDB4NGEsIDB4MTMsIDB4NWMsIDB4YzAsIDB4NDYsIDB4MGIsIDB4NzAsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzEsIAorMHgwOCwgMHgyOCwgMHhmOCwgMHhkMywgMHgwMCwgMHgyMCwgMHgwOCwgMHg3MCwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDA4LCAweDEwLCAweDAwLCAweDAzLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDdjLCAweDA0LCAweDAwLCAweDgwLCAKKzB4ODUsIDB4MDQsIDB4MDAsIDB4ODAsIDB4OGUsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4MDEsIDB4MjMsIAorMHgwYSwgMHg0OCwgMHhjMSwgMHgxZCwgMHg4OSwgMHgzMSwgMHg0YiwgMHg3MCwgMHgwMCwgMHgyMiwgMHgwYSwgMHg3MCwgCisweDY0LCAweDIxLCAweDgwLCAweDMwLCAweGMxLCAweDgyLCAweDAxLCAweDgzLCAweDQzLCAweDgzLCAweDdkLCAweDIxLCAKKzB4YzksIDB4MDAsIDB4ODEsIDB4ODMsIDB4YzIsIDB4ODMsIDB4MDQsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MDAsIDB4MjEsIAorMHgwMCwgMHhmMCwgMHg4ZSwgMHhmYiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGI1LCAweDIyLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweGZmLCAweGY3LCAweGUxLCAweGZmLCAweDEzLCAweDQ4LCAKKzB4MDIsIDB4MjIsIDB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4ODAsIDB4ZmIsIDB4MDEsIDB4MjMsIDB4ZDgsIDB4NDIsIAorMHgwYSwgMHhkMSwgMHgxMCwgMHg0OCwgMHhjMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHhjYSwgMHg4OCwgMHgwMSwgMHgzMiwgCisweGNhLCAweDgwLCAweDgxLCAweDc5LCAweDAxLCAweDMxLCAweDgxLCAweDcxLCAweGZkLCAweGY3LCAweDcwLCAweGY5LCAKKzB4MGIsIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDEsIDB4MjgsIDB4MDUsIDB4ZDEsIDB4MGEsIDB4NDgsIDB4N2QsIDB4MjIsIAorMHhkMiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHhmMCwgMHg2OCwgMHhmYiwgMHgwOCwgMHg0OCwgMHhmYiwgMHhmNywgCisweGUxLCAweGZjLCAweDA4LCAweDQ4LCAweDI4LCAweDIyLCAweDAwLCAweDIxLCAweDAwLCAweGYwLCAweDYwLCAweGZiLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NzksIDB4MjEsIDB4ZmYsIDB4ZmYsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhhNSwgMHg3YiwgMHgyMSwgMHg0MCwgCisweDk1LCAweDJjLCAweGZmLCAweGZmLCAweDU5LCAweDAzLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweDEwLCAweDIwLCAKKzB4MGYsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MGYsIDB4NGEsIDB4MGYsIDB4NDgsIDB4NjQsIDB4MjEsIAorMHhmYiwgMHhmNywgMHhjNiwgMHhmYywgMHgwZSwgMHg0OCwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgMHgwMSwgMHg2OCwgCisweDBhLCAweDQwLCAweDA4LCAweDIxLCAweDAwLCAweDJhLCAweDA1LCAweGQxLCAweDAyLCAweDY4LCAweDEyLCAweDBjLCAKKzB4MDcsIDB4ZDEsIDB4MDAsIDB4NjgsIDB4ODAsIDB4MGEsIDB4MDQsIDB4ZDMsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHhjMSwgMHg2MCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwNywgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMSwgMHg2NCwgCisweGY5LCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGE1LCAweDU1LCAweGZmLCAweGZmLCAKKzB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhmOCwgMHhiNSwgMHgyNywgMHg0OCwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDAxLCAweDY4LCAweDBhLCAweDQwLCAweDA3LCAweDIxLCAweDAwLCAweDJhLCAweDA1LCAweGQxLCAweDAyLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDYsIDB4ZDEsIDB4MDAsIDB4NjgsIDB4ODAsIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MjEsIDB4NDgsIAorMHhjMCwgMHg0NiwgMHhjMSwgMHg2MCwgMHgwMiwgMHhlMCwgMHgyMCwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMSwgMHg2NCwgCisweDFmLCAweDQ4LCAweGZiLCAweGY3LCAweDg3LCAweGZjLCAweDFmLCAweDQ4LCAweGMxLCAweDZiLCAweGZmLCAweDI5LCAKKzB4ZmMsIDB4ZDEsIDB4ODEsIDB4NmIsIDB4NDIsIDB4NmIsIDB4MTYsIDB4MWMsIDB4MGYsIDB4MWMsIDB4MWMsIDB4NGMsIAorMHgxMCwgMHgyMywgMHg2MCwgMHg2OSwgMHgxOCwgMHg0MywgMHg2MCwgMHg2MSwgMHhhMSwgMHg2OSwgMHg5OSwgMHg0MywgCisweDFkLCAweDA0LCAweGExLCAweDYxLCAweGU4LCAweDYwLCAweGEwLCAweDY5LCAweGMwLCAweDQ2LCAweDI4LCAweDYxLCAKKzB4MTYsIDB4NGEsIDB4MTcsIDB4NDksIDB4NjQsIDB4MjAsIDB4ZmIsIDB4ZjcsIDB4NmYsIDB4ZmMsIDB4MTYsIDB4NGEsIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgxNSwgMHg0YiwgMHgwMCwgMHgyMCwgMHgzOSwgMHgxYywgMHgzMiwgMHgxYywgCisweGZiLCAweGY3LCAweDZlLCAweGZjLCAweDEzLCAweDQ4LCAweGMxLCAweDY4LCAweDA4LCAweDI5LCAweGZjLCAweGQxLCAKKzB4MTIsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4NWQsIDB4ZmMsIDB4MTAsIDB4MjMsIDB4NjAsIDB4NjksIDB4OTgsIDB4NDMsIAorMHg2MCwgMHg2MSwgMHhlOCwgMHg2MCwgMHgwMSwgMHgyMCwgMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgMHhlMSwgMHgxOCwgCisweGM4LCAweDcxLCAweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHgwMCwgMHgwMSwgMHgxOCwgMHg0MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgyMCwgMHg1NSwgMHhmZiwgMHhmZiwgCisweGI1LCAweGI2LCAweDIxLCAweDQwLCAweDY0LCAweDAwLCAweDMwLCAweDAyLCAweDQ0LCAweDgwLCAweDIwLCAweDQwLCAKKzB4NDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4ZjQsIDB4MDEsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4ZmQsIDB4ZjcsIAorMHgwMSwgMHhmZiwgMHgwNiwgMHg0OCwgMHhmYiwgMHhmNywgMHgzMiwgMHhmYywgMHhmZCwgMHhmNywgMHhkNiwgMHhmZSwgCisweGZlLCAweGY3LCAweDA0LCAweGY4LCAweGZlLCAweGY3LCAweDE2LCAweGY4LCAweGZlLCAweGY3LCAweDI0LCAweGY4LCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTEsIDB4MDMsIDB4ZmYsIDB4ZmYsIDB4OTAsIDB4YjUsIDB4ZmQsIDB4ZjcsIAorMHg2YiwgMHhmYywgMHgzNCwgMHg0ZiwgMHgwMCwgMHgyNCwgMHhmOSwgMHg2OCwgMHhmOCwgMHgxZCwgMHg3OSwgMHgzMCwgCisweDAxLCAweDI5LCAweDBmLCAweGQxLCAweDMxLCAweDQ5LCAweGMwLCAweDQ2LCAweGY5LCAweDY3LCAweDMxLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4NjAsIDB4MzAsIDB4NDksIDB4YzAsIDB4NDYsIDB4MGMsIDB4NjAsIDB4NGMsIDB4NjAsIAorMHg4YywgMHg2MCwgMHhjYywgMHg2MCwgMHgwYywgMHg2MSwgMHg0YywgMHg2MSwgMHg4YywgMHg2MSwgMHgwNCwgMHhlMCwgCisweGY5LCAweDFkLCAweDdkLCAweDMxLCAweGY5LCAweDY3LCAweDEyLCAweGMwLCAweDA4LCAweDM4LCAweDAwLCAweDY4LCAKKzB4NjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZjgsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHhmOCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDk5LCAweDQzLCAweDAxLCAweDYwLCAweDAwLCAweGYwLCAweDU0LCAweGY4LCAweGZkLCAweGY3LCAweDRlLCAweGZjLCAKKzB4MDAsIDB4ZjAsIDB4NWUsIDB4ZjksIDB4ZmQsIDB4ZjcsIDB4NzMsIDB4ZjgsIDB4ZmYsIDB4ZjcsIDB4MGMsIDB4ZmUsIAorMHhmZCwgMHhmNywgMHgyZSwgMHhmZSwgMHhmZCwgMHhmNywgMHhiNiwgMHhmZCwgMHhmZCwgMHhmNywgMHhjMiwgMHhmZSwgCisweGZkLCAweGY3LCAweDU0LCAweGZkLCAweGZkLCAweGY3LCAweDBhLCAweGZkLCAweGZkLCAweGY3LCAweDk0LCAweGZkLCAKKzB4MDAsIDB4ZjAsIDB4MWEsIDB4ZmEsIDB4ZmQsIDB4ZjcsIDB4OWMsIDB4ZmYsIDB4ZmQsIDB4ZjcsIDB4MGEsIDB4ZmYsIAorMHhmZCwgMHhmNywgMHhkMiwgMHhmZSwgMHhmZCwgMHhmNywgMHgzYywgMHhmYywgMHhmYiwgMHhmNywgMHhkYywgMHhmYSwgCisweGZmLCAweGY3LCAweDljLCAweGZmLCAweDcxLCAweDIzLCAweDViLCAweDAxLCAKKzB4ZjgsIDB4MTgsIDB4MDQsIDB4NzIsIDB4NDQsIDB4NzIsIDB4MDcsIDB4MjMsIDB4NWIsIDB4MDIsIDB4ZjgsIDB4MTgsIAorMHgwNCwgMHg2MywgMHhmOCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwMiwgMHhkMSwgMHhhOCwgMHgyMCwgMHhmZSwgMHhmNywgCisweGIxLCAweGZkLCAweDA5LCAweDQ4LCAweGMwLCAweDQ2LCAweDQ0LCAweDYyLCAweDAwLCAweGYwLCAweDE4LCAweGZhLCAKKzB4MDcsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4YmQsIDB4ZmIsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMSwgMHgxMSwgMHg0MCwgMHgwNCwgMHgwMSwgMHgxMSwgMHg0MCwgCisweDAwLCAweDAxLCAweDExLCAweDAwLCAweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDE1LCAweDhmLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4YjUsIDB4MDQsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4YWEsIDB4ZmIsIDB4ZmQsIDB4ZjcsIDB4NWUsIDB4ZmYsIAorMHhmZCwgMHhmNywgMHgyNCwgMHhmYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgxNSwgMHg5OSwgMHgyMSwgMHg0MCwgCisweGZhLCAweDIxLCAweDAzLCAweDQ4LCAweGMwLCAweDQ2LCAweDQxLCAweDYyLCAweDQwLCAweDIxLCAweDQxLCAweDYyLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDcsIDB4NDgsIDB4NDEsIDB4NjksIAorMHgwNywgMHg0YiwgMHgxOSwgMHg0MywgMHg0MSwgMHg2MSwgMHg4MiwgMHg2OSwgMHg5YSwgMHg0MywgMHg4MiwgMHg2MSwgCisweDAxLCAweDIyLCAweDEyLCAweDA1LCAweGQxLCAweDYwLCAweDgwLCAweDY5LCAweGMwLCAweDQ2LCAweDEwLCAweDYxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZmUsIDB4YWYsIDB4OWEsIDB4MTAsIAorMHgwMCwgMHhiNSwgMHgwMiwgMHg0OCwgMHhmYiwgMHhmNywgMHg4MCwgMHhmYiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGM4LCAweDU3LCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDI0LCAweDRjLCAweDAxLCAweDIxLCAweDA5LCAweDA0LCAKKzB4MjAsIDB4NjgsIDB4MDEsIDB4NDAsIDB4MDksIDB4MjAsIDB4MjIsIDB4NGUsIDB4MjIsIDB4NGQsIDB4MDAsIDB4MjksIAorMHgwNSwgMHhkMSwgMHgyMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNCwgMHhkMSwgMHgyMSwgMHg2OCwgMHg4OSwgMHgwYSwgCisweDAxLCAweGQzLCAweGYwLCAweDYwLCAweDAwLCAweGUwLCAweDI4LCAweDY0LCAweDFkLCAweDQ4LCAweGZiLCAweGY3LCAKKzB4NjUsIDB4ZmIsIDB4MWQsIDB4NGYsIDB4MWQsIDB4NDksIDB4ODgsIDB4NjksIDB4MDEsIDB4MzAsIDB4ODgsIDB4NjEsIAorMHgzOCwgMHg3YSwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMSwgMHg3OCwgMHg3YSwgMHgwMCwgMHgyOCwgMHgxZiwgMHhkMCwgCisweDE5LCAweDQ4LCAweGZiLCAweGY3LCAweDU3LCAweGZiLCAweDE5LCAweDQ4LCAweGZiLCAweGY3LCAweDU0LCAweGZiLCAKKzB4MDAsIDB4MjgsIDB4ZmEsIDB4ZDEsIDB4MzgsIDB4N2EsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4MTYsIDB4NDgsIAorMHhmYiwgMHhmNywgMHg0YywgMHhmYiwgMHgwMSwgMHgyMSwgMHgwOSwgMHgwNCwgMHgyMCwgMHg2OCwgMHgwMSwgMHg0MCwgCisweDE0LCAweDIwLCAweDAwLCAweDI5LCAweDA1LCAweGQxLCAweDIxLCAweDY4LCAweDA5LCAweDBjLCAweDA0LCAweGQxLCAKKzB4MjEsIDB4NjgsIDB4ODksIDB4MGEsIDB4MDEsIDB4ZDMsIDB4ZjAsIDB4NjAsIDB4MDEsIDB4ZTAsIDB4MjgsIDB4NjQsIAorMHhmZiwgMHhlNywgMHhmZSwgMHhlNywgMHhmZiwgMHhmNywgMHg2NSwgMHhmZCwgMHgwYiwgMHg0OCwgMHhmYiwgMHhmNywgCisweDM1LCAweGZiLCAweGZmLCAweGY3LCAweGFmLCAweGZmLCAweGNkLCAweGU3LCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwOCwgMHg4MywgMHgyMCwgMHg0MCwgMHhmNCwgMHgwMSwgMHhmZiwgMHhmZiwgCisweGI1LCAweDA3LCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDk5LCAweDlmLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MjAsIDB4MDcsIDB4NGEsIDB4MDEsIDB4MjEsIDB4MDksIDB4MDUsIDB4NTAsIDB4NjEsIDB4YzgsIDB4NjAsIAorMHhkMCwgMHg2MSwgMHhjOCwgMHg2MSwgMHgwMywgMHgyMywgMHhkYiwgMHgwNCwgMHgwMywgMHg0YSwgMHgwMSwgMHgyMSwgCisweGQxLCAweDYzLCAweDU4LCAweDYwLCAweGZjLCAweGU3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4ODAsIDB4YjUsIDB4YzAsIDB4YjAsIDB4MDEsIDB4MjIsIDB4MDAsIDB4MjEsIAorMHgwYSwgMHgyMCwgMHhmYywgMHhmNywgMHhkMSwgMHhmZiwgMHgwNywgMHgxYywgMHhmZiwgMHgyZiwgMHgyOCwgMHhkMCwgCisweDY5LCAweDQ2LCAweGZmLCAweDIyLCAweDM4LCAweDFjLCAweDAxLCAweDMyLCAweGZkLCAweGY3LCAweDU0LCAweGY5LCAKKzB4ZmYsIDB4MjMsIDB4MDEsIDB4MzMsIDB4OTgsIDB4NDIsIDB4MWIsIDB4ZDEsIDB4MGQsIDB4OTgsIDB4MDAsIDB4MDksIAorMHgxOCwgMHhkMywgMHgzOCwgMHgxYywgMHhmZCwgMHhmNywgMHg4ZCwgMHhmOCwgMHgwZSwgMHg0OSwgMHgwMSwgMHgyMiwgCisweDEyLCAweDA0LCAweDA4LCAweDY4LCAweDAyLCAweDQwLCAweDBkLCAweDQ4LCAweDA1LCAweGQxLCAweDBhLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDYsIDB4ZDEsIDB4MDksIDB4NjgsIDB4ODksIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MGEsIDB4NDksIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHgwMiwgMHhlMCwgMHgwOSwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NCwgCisweGZmLCAweGY3LCAweGJjLCAweGZmLCAweDM4LCAweDFjLCAweGZkLCAweGY3LCAweDc0LCAweGY4LCAweDQwLCAweGIwLCAKKzB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHgwNywgMHg4MCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDE3LCAweDQ5LCAweDAxLCAweDIyLCAweDEyLCAweDA0LCAKKzB4MDgsIDB4NjgsIDB4MDIsIDB4NDAsIDB4MDYsIDB4MjAsIDB4MDAsIDB4MmEsIDB4MDUsIDB4ZDEsIDB4MGEsIDB4NjgsIAorMHgxMiwgMHgwYywgMHgwNiwgMHhkMSwgMHgwOSwgMHg2OCwgMHg4OSwgMHgwYSwgMHgwMywgMHhkMywgMHgxMSwgMHg0OSwgCisweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDAyLCAweGUwLCAweDEwLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDY0LCAKKzB4MDMsIDB4MjAsIDB4ZmUsIDB4ZjcsIDB4ZDMsIDB4ZmMsIDB4ZmIsIDB4ZjcsIDB4MGQsIDB4ZmYsIDB4MDEsIDB4MjMsIAorMHgxOCwgMHg0MywgMHhmYiwgMHhmNywgMHhlNywgMHhmZiwgMHhmZiwgMHhmNywgMHg4MywgMHhmZSwgMHhmZiwgMHhmNywgCisweDlkLCAweGZmLCAweGZmLCAweGY3LCAweDA1LCAweGZlLCAweGZmLCAweGY3LCAweGY1LCAweGZlLCAweGZmLCAweGY3LCAKKzB4MDksIDB4ZmYsIDB4ZmYsIDB4ZjcsIDB4OWIsIDB4ZmQsIDB4ZmYsIDB4ZjcsIDB4MjEsIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGYwLCAweGI0LCAweDQ2LCAweDRhLCAweDAxLCAweDIxLCAweGM5LCAweDAzLCAKKzB4NDUsIDB4NGQsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZWMsIDB4MTgsIDB4YTEsIDB4NjEsIDB4MjgsIDB4ODgsIAorMHg0MCwgMHgwNCwgMHg0MywgMHg0YiwgMHhjMCwgMHgxOCwgMHg4NywgMHgxYSwgMHgwNCwgMHgyMCwgMHhhZiwgMHg2MCwgCisweDQxLCAweDRlLCAweGMwLCAweDQ2LCAweGIwLCAweDYxLCAweDA4LCAweDIwLCAweGM4LCAweDIzLCAweDQzLCAweDQzLCAKKzB4YmIsIDB4NDIsIDB4MjEsIDB4ZDksIDB4NDEsIDB4MDAsIDB4M2QsIDB4NGUsIDB4YzAsIDB4NDYsIDB4MzEsIDB4NjEsIAorMHhiNiwgMHg2OSwgMHgyMCwgMHgyMywgMHg5YiwgMHgxYiwgMHgzYSwgMHg0ZSwgMHhjMCwgMHg0NiwgMHhmMywgMHg2MSwgCisweDEwLCAweDNiLCAweDMzLCAweDYyLCAweDhiLCAweDAwLCAweGZmLCAweDFhLCAweDQwLCAweDA4LCAweDgxLCAweDQyLCAKKzB4MTcsIDB4ZDMsIDB4YjgsIDB4MjMsIDB4NDMsIDB4NDMsIDB4YmIsIDB4NDIsIDB4MDgsIDB4ZDksIDB4NDEsIDB4MWUsIAorMHgzMiwgMHg0YiwgMHhjMCwgMHg0NiwgMHg5OSwgMHg4MSwgMHhkOSwgMHg4MSwgMHg0MCwgMHgwMCwgMHgwMiwgMHgzOCwgCisweDU4LCAweDYxLCAweDBhLCAweGUwLCAweDAxLCAweDMwLCAweDgxLCAweDQyLCAweGVmLCAweGQyLCAweDA2LCAweGUwLCAKKzB4MmMsIDB4NGUsIDB4YjMsIDB4NjksIDB4MDEsIDB4MzMsIDB4YjMsIDB4NjEsIDB4NDAsIDB4MDAsIDB4ODgsIDB4NDIsIAorMHhkMiwgMHhkOSwgMHgyYSwgMHg0OSwgMHgwMCwgMHgyMCwgMHhhMywgMHg2OSwgMHg5YiwgMHgwOCwgMHgwNywgMHhkMCwgCisweDI4LCAweDRiLCAweDg3LCAweDAwLCAweGNiLCAweDUxLCAweGE3LCAweDY5LCAweGJmLCAweDA4LCAweDAxLCAweDMwLCAKKzB4ODcsIDB4NDIsIDB4ZjgsIDB4ZDgsIDB4MjIsIDB4NDksIDB4YzAsIDB4NDYsIDB4OGEsIDB4NjIsIDB4OGMsIDB4ODksIAorMHg1OCwgMHgyMCwgMHg2MCwgMHg0MywgMHg4NywgMHgxOCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyYywgCisweDBhLCAweGRkLCAweDU4LCAweDIzLCAweDQzLCAweDQzLCAweDhjLCAweDZhLCAweGUzLCAweDE4LCAweDAxLCAweDMwLCAKKzB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4OWEsIDB4NjAsIDB4OGIsIDB4ODksIDB4ODMsIDB4NDIsIDB4ZjQsIDB4ZGMsIAorMHhjZiwgMHg2MiwgMHhjYywgMHg4OSwgMHg2MCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg0MCwgMHgwMSwgMHhjNywgMHgxOSwgCisweDAwLCAweDIwLCAweDAwLCAweDJjLCAweDBiLCAweGRkLCAweDQzLCAweDAwLCAweDFiLCAweDE4LCAweDViLCAweDAxLCAKKzB4Y2MsIDB4NmEsIDB4ZTMsIDB4MTgsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4OWEsIDB4NjAsIAorMHhjYiwgMHg4OSwgMHg4MywgMHg0MiwgMHhmMywgMHhkYywgMHg0ZiwgMHg2MiwgMHgwMCwgMHgyMCwgMHgwYiwgMHg2OSwgCisweDAwLCAweDJiLCAweDA3LCAweGQ5LCAweDg3LCAweDAwLCAweDRiLCAweDZhLCAweGMwLCAweDQ2LCAweGRhLCAweDUxLCAKKzB4MGIsIDB4NjksIDB4MDEsIDB4MzAsIDB4ODMsIDB4NDIsIDB4ZjcsIDB4ZDgsIDB4NDksIDB4NmEsIDB4ODAsIDB4MDAsIAorMHgwOCwgMHgxOCwgMHgwNCwgMHgzOCwgMHgyOCwgMHg2MSwgMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgCisweGIwLCAweGJlLCAweDIxLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDIwLCAweDQwLCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MDAsIDB4YWQsIDB4ZGUsIDB4MDAsIAorMHgwYSwgMHg0OCwgMHgwMSwgMHgyMywgMHgxYiwgMHgwNiwgMHg0MSwgMHg2OSwgMHg5OSwgMHg0MywgMHgxYSwgMHgwOSwgCisweDQxLCAweDYxLCAweGQxLCAweDYwLCAweDAwLCAweDIxLCAweGExLCAweDIyLCAweDUyLCAweDAzLCAweDkxLCAweDYxLCAKKzB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4ODEsIDB4NjEsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDYsIAorMHg1OSwgMHgwNSwgMHgwOCwgMHg2MCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDgwLCAweGI0LCAweDAyLCAweDFjLCAweDBiLCAweDQ4LCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGMzLCAweDE4LCAKKzB4OWEsIDB4NjEsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDYsIDB4NDIsIDB4NjksIDB4MWEsIDB4NDMsIDB4NDIsIDB4NjEsIAorMHg4NywgMHg2OSwgMHg5ZiwgMHg0MywgMHgwMSwgMHgyMywgMHgxYiwgMHgwNSwgCisweDg3LCAweDYxLCAweGRhLCAweDYwLCAweDgwLCAweDY5LCAweGMwLCAweDQ2LCAweDE4LCAweDYxLCAweGExLCAweDIwLCAKKzB4NDAsIDB4MDMsIDB4ODEsIDB4NjEsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHhiNSwgMHhmZiwgMHhmNywgMHhjOSwgMHhmZiwgMHgwMCwgMHgyMCwgMHgwMCwgMHhmMCwgMHgyMCwgMHhmOCwgCisweDAwLCAweDIwLCAweDA5LCAweDQ5LCAweDAwLCAweDIyLCAweDAzLCAweDAxLCAweDVmLCAweDE4LCAweDMzLCAweDIzLCAKKzB4OWIsIDB4MDEsIDB4ZmIsIDB4MTgsIDB4OWEsIDB4NjIsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIDB4ZjYsIDB4ZDMsIAorMHgwNCwgMHg0OCwgMHgwMSwgMHgyMiwgMHgwMCwgMHgyMSwgMHgwMCwgMHhmMCwgMHgzMywgMHhmOCwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDFkLCAweDNlLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4YjUsIDB4MDIsIDB4NDgsIDB4MDAsIDB4ZjAsIDB4MDQsIDB4ZjgsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhhOCwgMHg2MSwgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNCwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNSwgMHgwZiwgMHg0YiwgCisweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDAwLCAweDI4LCAweDBlLCAweGQwLCAweGM4LCAweDYxLCAweDE4LCAweDFjLCAKKzB4NTksIDB4NjksIDB4NTMsIDB4MDEsIDB4MTksIDB4NDMsIDB4NDEsIDB4NjEsIDB4ODcsIDB4NjksIDB4OWYsIDB4NDMsIAorMHg4NywgMHg2MSwgMHhkMSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMCwgMHg2MSwgMHg4MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDE4LCAweDFjLCAweDVmLCAweDY5LCAweDAxLCAweDIzLCAweDViLCAweDA2LCAweDlmLCAweDQzLCAKKzB4NDcsIDB4NjEsIDB4ZDcsIDB4NjAsIDB4MDAsIDB4MjAsIDB4YzgsIDB4NjEsIDB4ZjMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhiMCwgMHhiNCwgMHgwNywgMHgxYywgMHgwMCwgMHgyMCwgMHgxNywgMHg0YywgCisweDAzLCAweDAxLCAweDFkLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGViLCAweDE4LCAweDlkLCAweDZhLCAKKzB4YmQsIDB4NDIsIDB4MDUsIDB4ZDEsIDB4MWQsIDB4NmIsIDB4OTUsIDB4NDIsIDB4MDIsIDB4ZDEsIDB4ZGIsIDB4NmEsIAorMHg4YiwgMHg0MiwgMHgxYywgMHhkMCwgMHgwMSwgMHgzMCwgMHgwYiwgMHgyOCwgMHhlZSwgMHhkMywgMHgwMCwgMHgyMCwgCisweDAzLCAweDAxLCAweDFkLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGViLCAweDE4LCAweDliLCAweDZhLCAKKzB4MDAsIDB4MmIsIDB4MDksIDB4ZDEsIDB4MDMsIDB4MDEsIDB4MWMsIDB4MTksIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHhlMywgMHgxOCwgMHgxYSwgMHg2MywgMHhkOSwgMHg2MiwgMHg1YSwgMHg2MywgMHg5ZiwgMHg2MiwgMHgwMiwgMHhlMCwgCisweDAxLCAweDMwLCAweDBiLCAweDI4LCAweGVhLCAweGQzLCAweDBiLCAweDI4LCAweDAxLCAweGQxLCAweDAwLCAweDIwLCAKKzB4YzAsIDB4NDMsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhiNCwgMHgwMSwgMHgxYywgMHgwMCwgMHgyMiwgMHgwMSwgMHgyMCwgMHgxNiwgMHg0ZiwgMHgwMSwgMHhlMCwgCisweDAwLCAweDJhLCAweDA3LCAweGQxLCAweDAzLCAweDAxLCAweGRjLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAKKzB4ZTMsIDB4MTgsIDB4OWIsIDB4NjksIDB4OGIsIDB4NDIsIDB4MTEsIDB4ZDEsIDB4MDIsIDB4MDEsIDB4ZDIsIDB4MTksIAorMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhkMiwgMHgxOCwgMHg5MywgMHg2YSwgMHhjMCwgMHg0NiwgMHg5MywgMHg2MSwgCisweGQzLCAweDZhLCAweGMwLCAweDQ2LCAweGQzLCAweDYxLCAweDEzLCAweDZiLCAweGMwLCAweDQ2LCAweDEzLCAweDYyLCAKKzB4NTMsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NTMsIDB4NjIsIDB4MDEsIDB4MjIsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIAorMHhlMCwgMHhkMywgMHgwNywgMHg0YiwgMHgwMCwgMHgyYSwgMHgwMiwgMHhkMSwgMHg5YSwgMHg2OCwgMHg4YSwgMHg0MiwgCisweDAzLCAweGQxLCAweDAwLCAweDIxLCAweDk5LCAweDYwLCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAKKzB4YzAsIDB4NDMsIDB4ZmEsIDB4ZTcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZTgsIDB4MWIsIDB4MDAsIDB4ODAsIAorMHgwYiwgMHgyOCwgMHgxNywgMHhkYSwgMHgwYywgMHg0OSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwNiwgMHg4YSwgMHg2OSwgCisweDEzLCAweDQzLCAweDAxLCAweDIyLCAweDEyLCAweDA1LCAweDhiLCAweDYxLCAweDEzLCAweDYxLCAweDAwLCAweDAxLCAKKzB4NDAsIDB4MTgsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4MDMsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg0MywgMHg2MywgMHg1MywgMHgwMSwgMHg4OCwgMHg2OSwgMHg5OCwgMHg0MywgMHg4OCwgMHg2MSwgMHgxMCwgMHg2MSwgCisweDAxLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweGZjLCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MDgsIDB4NGEsIDB4ZDAsIDB4NjksIDB4MDAsIDB4MjEsIDB4MDcsIDB4NGYsIDB4ZDMsIDB4NjksIAorMHg4MywgMHg0MiwgMHgwMiwgMHhkOSwgMHhmYywgMHgxYSwgMHgyMCwgMHgxOCwgMHgwMCwgMHhlMCwgMHhjMCwgMHgxYSwgCisweDA5LCAweDE4LCAweDE4LCAweDFjLCAweGI5LCAweDQyLCAweGY0LCAweGQ5LCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4MjAsIDB4MTQsIDB4NDAsIDB4YTgsIDB4NjEsIDB4MDAsIDB4MDAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgwMCwgMHgyNCwgMHgwMCwgMHgyZiwgMHgwNCwgMHhkMywgMHhmZiwgMHhmNywgMHhlMywgMHhmZiwgMHgwMSwgMHgzNCwgCisweGJjLCAweDQyLCAweGZhLCAweGQ5LCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQzMzdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0wLDAgKzEsMjY3MyBAQAorLyogdHlwaG9vbi5jOiBBIExpbnV4IEV0aGVybmV0IGRldmljZSBkcml2ZXIgZm9yIDNDb20gM0NSOTkwIGZhbWlseSBvZiBOSUNzICovCisvKgorCVdyaXR0ZW4gMjAwMi0yMDA0IGJ5IERhdmlkIERpbGxvdyA8ZGF2ZUB0aGVkaWxsb3dzLm9yZz4KKwlCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gMTk5OC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+IGFuZAorCUxpbnV4IDIuMi54IGRyaXZlciBieSBEYXZpZCBQLiBNY0xlYW4gPGRhdmlkcG1jbGVhbkB5YWhvby5jb20+LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgb24gYSBwdWJsaWMgd2ViIHNpdGUuIEl0IG1heSBlbmFibGUKKwljcnlwdG9ncmFwaGljIGNhcGFiaWxpdGllcyBvZiB0aGUgM0NvbSBoYXJkd2FyZSwgYW5kIG1heSBiZQorCWV4cG9ydGVkIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgdW5kZXIgTGljZW5zZSBFeGNlcHRpb24gIlRTVSIKKwlwdXJzdWFudCB0byAxNSBDLkYuUi4gU2VjdGlvbiA3NDAuMTMoZSkuCisKKwlUaGlzIHdvcmsgd2FzIGZ1bmRlZCBieSB0aGUgTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSB1bmRlcgorCXRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSBwcm9qZWN0IG51bWJlciAwMjc0REQwNkQxIGFuZCBOTE0gcHJvamVjdAorCW51bWJlciBZMS1MTS0yMDE1LTAxLgorCisJVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSAzQ29tIDNDUjk5MCBGYW1pbHkgb2YgY2FyZHMgd2l0aCB0aGUKKwkzWFAgUHJvY2Vzc29yLiBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24geDg2IGFuZCBzcGFyYzY0LgorCisJS05PV04gSVNTVUVTOgorCSopIFRoZSBjdXJyZW50IGZpcm13YXJlIGFsd2F5cyBzdHJpcHMgdGhlIFZMQU4gdGFnIG9mZiwgZXZlbiBpZgorCQl3ZSB0ZWxsIGl0IG5vdCB0by4gWW91IHNob3VsZCBmaWx0ZXIgVkxBTnMgYXQgdGhlIHN3aXRjaAorCQlhcyBhIHdvcmthcm91bmQgKGdvb2QgcHJhY3RpY2UgaW4gYW55IGV2ZW50KSB1bnRpbCB3ZSBjYW4KKwkJZ2V0IHRoaXMgZml4ZWQuCisJKikgQ2Fubm90IERNQSBSeCBwYWNrZXRzIHRvIGEgMiBieXRlIGFsaWduZWQgYWRkcmVzcy4gQWxzbyBmaXJtd2FyZQorCQlpc3N1ZS4gSG9wZWZ1bGx5IDNDb20gd2lsbCBmaXggaXQuCisJKikgV2FpdGluZyBmb3IgYSBjb21tYW5kIHJlc3BvbnNlIHRha2VzIDhtcyBkdWUgdG8gbm9uLXByZWVtcHRhYmxlCisJCXBvbGxpbmcuIE9ubHkgc2lnbmlmaWNhbnQgZm9yIGdldHRpbmcgc3RhdHMgYW5kIGNyZWF0aW5nCisJCVNBcywgYnV0IGFuIHVnbHkgd2FydCBuZXZlciB0aGUgbGVzcy4KKworCVRPRE86CisJKikgRG9lc24ndCBkbyBJUFNFQyBvZmZsb2FkaW5nLiBZZXQuIEtlZXAgeWVyIHBhbnRzIG9uLCBpdCdzIGNvbWluZy4KKwkqKSBBZGQgbW9yZSBzdXBwb3J0IGZvciBldGh0b29sIChlc3BlY2lhbGx5IGZvciBOSUMgc3RhdHMpCisJKikgQWxsb3cgZGlzYWJsaW5nIG9mIFJYIGNoZWNrc3VtIG9mZmxvYWRpbmcKKwkqKSBGaXggTUFDIGNoYW5naW5nIHRvIHdvcmsgd2hpbGUgdGhlIGludGVyZmFjZSBpcyB1cAorCQkoTmVlZCB0byBwdXQgY29tbWFuZHMgb24gdGhlIFRYIHJpbmcsIHdoaWNoIGNoYW5nZXMKKwkJdGhlIGxvY2tpbmcpCisJKikgQWRkIGluIEZDUyB0byB7cngsdHh9X2J5dGVzLCBzaW5jZSB0aGUgaGFyZHdhcmUgZG9lc24ndC4gU2VlCisJCWh0dHA6Ly9vc3Muc2dpLmNvbS9jZ2ktYmluL21lc2cuY2dpP2E9bmV0ZGV2Jmk9MjAwMzEyMTUxNTIyMTEuNzAwM2ZlOGUucmRkdW5sYXAlNDBvc2RsLm9yZworKi8KKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICogU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLgorICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKworLyogU2hvdWxkIHdlIHVzZSBNTUlPIG9yIFBvcnQgSU8/CisgKiAwOiBQb3J0IElPCisgKiAxOiBNTUlPCisgKiAyOiBUcnkgTU1JTywgZmFsbGJhY2sgdG8gUG9ydCBJTworICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVzZV9tbWlvID0gMjsKKworLyogZW5kIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICovCitzdGF0aWMgY29uc3QgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuCisgKiBUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgKiBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgKiBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgKiBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4KKyAqCisgKiBXZSBkb24ndCBjdXJyZW50bHkgdXNlIHRoZSBIaSBUeCByaW5nIHNvLCBkb24ndCBtYWtlIGl0IHZlcnkgYmlnLgorICoKKyAqIEJld2FyZSB0aGF0IGlmIHdlIHN0YXJ0IHVzaW5nIHRoZSBIaSBUeCByaW5nLCB3ZSB3aWxsIG5lZWQgdG8gY2hhbmdlCisgKiB0eXBob29uX251bV9mcmVlX3R4KCkgYW5kIHR5cGhvb25fdHhfY29tcGxldGUoKSB0byBhY2NvdW50IGZvciB0aGF0LgorICovCisjZGVmaW5lIFRYSElfRU5UUklFUwkJMgorI2RlZmluZSBUWExPX0VOVFJJRVMJCTEyOAorI2RlZmluZSBSWF9FTlRSSUVTCQkzMgorI2RlZmluZSBDT01NQU5EX0VOVFJJRVMJCTE2CisjZGVmaW5lIFJFU1BPTlNFX0VOVFJJRVMJMzIKKworI2RlZmluZSBDT01NQU5EX1JJTkdfU0laRQkoQ09NTUFORF9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYykpCisjZGVmaW5lIFJFU1BPTlNFX1JJTkdfU0laRQkoUkVTUE9OU0VfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcmVzcF9kZXNjKSkKKworLyogVGhlIDNYUCB3aWxsIHByZWxvYWQgYW5kIHJlbW92ZSA2NCBlbnRyaWVzIGZyb20gdGhlIGZyZWUgYnVmZmVyCisgKiBsaXN0LCBhbmQgd2UgbmVlZCBvbmUgZW50cnkgdG8ga2VlcCB0aGUgcmluZyBmcm9tIHdyYXBwaW5nLCBzbyAKKyAqIHRvIGtlZXAgdGhpcyBhIHBvd2VyIG9mIHR3bywgd2UgdXNlIDEyOCBlbnRyaWVzLgorICovCisjZGVmaW5lIFJYRlJFRV9FTlRSSUVTCQkxMjgKKyNkZWZpbmUgUlhFTlRfRU5UUklFUwkJKFJYRlJFRV9FTlRSSUVTIC0gMSkKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJ0eXBob29uIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04gCSIxLjUuNyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSIwNS8wMS8wNyIKKyNkZWZpbmUgUEZYCQkJRFJWX01PRFVMRV9OQU1FICI6ICIKKyNkZWZpbmUgRVJSX1BGWAkJCUtFUk5fRVJSIFBGWAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInR5cGhvb24uaCIKKyNpbmNsdWRlICJ0eXBob29uLWZpcm13YXJlLmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyAgICAidHlwaG9vbi5jOiB2ZXJzaW9uICIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBEaWxsb3cgPGRhdmVAdGhlZGlsbG93cy5vcmc+Iik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCIzQ29tIFR5cGhvb24gRmFtaWx5ICgzQzk5MCwgM0NSOTkwLCBhbmQgdmFyaWFudHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIlBhY2tldHMgc21hbGxlciB0aGFuIHRoaXMgYXJlIGNvcGllZCBhbmQgIgorCQkJICAgICAgICJ0aGUgYnVmZmVyIGdpdmVuIGJhY2sgdG8gdGhlIE5JQy4gRGVmYXVsdCAiCisJCQkgICAgICAgImlzIDIwMC4iKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX21taW8sICJVc2UgTU1JTyAoMSkgb3IgUElPKDApIHRvIGFjY2VzcyB0aGUgTklDLiAiCisJCQkgICAiRGVmYXVsdCBpcyB0byB0cnkgTU1JTyBhbmQgZmFsbGJhY2sgdG8gUElPLiIpOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbW1pbywgaW50LCAwKTsKKworI2lmIGRlZmluZWQoTkVUSUZfRl9UU08pICYmIE1BWF9TS0JfRlJBR1MgPiAzMgorI3dhcm5pbmcgVHlwaG9vbiBvbmx5IHN1cHBvcnRzIDMyIGVudHJpZXMgaW4gaXRzIFNHIGxpc3QgZm9yIFRTTywgZGlzYWJsaW5nIFRTTworI3VuZGVmIE5FVElGX0ZfVFNPCisjZW5kaWYKKworI2lmIFRYTE9fRU5UUklFUyA8PSAoMiAqIE1BWF9TS0JfRlJBR1MpCisjZXJyb3IgVFggcmluZyB0b28gc21hbGwhCisjZW5kaWYKKworc3RydWN0IHR5cGhvb25fY2FyZF9pbmZvIHsKKwljaGFyICpuYW1lOworCWludCBjYXBhYmlsaXRpZXM7Cit9OworCisjZGVmaW5lIFRZUEhPT05fQ1JZUFRPX05PTkUJCTB4MDAKKyNkZWZpbmUgVFlQSE9PTl9DUllQVE9fREVTCQkweDAxCisjZGVmaW5lIFRZUEhPT05fQ1JZUFRPXzNERVMJCTB4MDIKKyNkZWZpbmUJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEUJCTB4MDQKKyNkZWZpbmUgVFlQSE9PTl9GSUJFUgkJCTB4MDgKKyNkZWZpbmUgVFlQSE9PTl9XQUtFVVBfTkVFRFNfUkVTRVQJMHgxMAorCitlbnVtIHR5cGhvb25fY2FyZHMgeworCVRZUEhPT05fVFggPSAwLCBUWVBIT09OX1RYOTUsIFRZUEhPT05fVFg5NywgVFlQSE9PTl9TVlIsCisJVFlQSE9PTl9TVlI5NSwgVFlQSE9PTl9TVlI5NywgVFlQSE9PTl9UWE0sIFRZUEhPT05fQlNWUiwKKwlUWVBIT09OX0ZYOTUsIFRZUEhPT05fRlg5NywgVFlQSE9PTl9GWDk1U1ZSLCBUWVBIT09OX0ZYOTdTVlIsCisJVFlQSE9PTl9GWE0sCit9OworCisvKiBkaXJlY3RseSBpbmRleGVkIGJ5IGVudW0gdHlwaG9vbl9jYXJkcywgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwaG9vbl9jYXJkX2luZm8gdHlwaG9vbl9jYXJkX2luZm9bXSBfX2RldmluaXRkYXRhID0geworCXsgIjNDb20gVHlwaG9vbiAoM0M5OTAtVFgpIiwKKwkJVFlQSE9PTl9DUllQVE9fTk9ORX0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtVFgtOTUpIiwKKwkJVFlQSE9PTl9DUllQVE9fREVTfSwKKwl7ICIzQ29tIFR5cGhvb24gKDNDUjk5MC1UWC05NykiLAorCSAJVFlQSE9PTl9DUllQVE9fREVTIHwgVFlQSE9PTl9DUllQVE9fM0RFU30sCisJeyAiM0NvbSBUeXBob29uICgzQzk5MFNWUikiLAorCQlUWVBIT09OX0NSWVBUT19OT05FfSwKKwl7ICIzQ29tIFR5cGhvb24gKDNDUjk5MFNWUjk1KSIsCisJCVRZUEhPT05fQ1JZUFRPX0RFU30sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTBTVlI5NykiLAorCSAJVFlQSE9PTl9DUllQVE9fREVTIHwgVFlQSE9PTl9DUllQVE9fM0RFU30sCisJeyAiM0NvbSBUeXBob29uMiAoM0M5OTBCLVRYLU0pIiwKKwkJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEV9LAorCXsgIjNDb20gVHlwaG9vbjIgKDNDOTkwQlNWUikiLAorCQlUWVBIT09OX0NSWVBUT19WQVJJQUJMRX0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtRlgtOTUpIiwKKwkJVFlQSE9PTl9DUllQVE9fREVTIHwgVFlQSE9PTl9GSUJFUn0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtRlgtOTcpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVMgfCBUWVBIT09OX0ZJQkVSfSwKKwl7ICIzQ29tIFR5cGhvb24gKDNDUjk5MC1GWC05NSBTZXJ2ZXIpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fRklCRVJ9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLUZYLTk3IFNlcnZlcikiLAorCSAJVFlQSE9PTl9DUllQVE9fREVTIHwgVFlQSE9PTl9DUllQVE9fM0RFUyB8IFRZUEhPT05fRklCRVJ9LAorCXsgIjNDb20gVHlwaG9vbjIgKDNDOTkwQi1GWC05NykiLAorCQlUWVBIT09OX0NSWVBUT19WQVJJQUJMRSB8IFRZUEhPT05fRklCRVJ9LAorfTsKKworLyogTm90ZXMgb24gdGhlIG5ldyBzdWJzeXN0ZW0gbnVtYmVyaW5nIHNjaGVtZToKKyAqIGJpdHMgMC0xIGluZGljYXRlIGNyeXB0byBjYXBhYmlsaXRlczogKDApIHZhcmlhYmxlLCAoMSkgREVTLCBvciAoMikgM0RFUworICogYml0IDQgaW5kaWNhdGVzIGlmIHRoaXMgY2FyZCBoYXMgc2VjdXJlZCBmaXJtd2FyZSAod2UgZG9uJ3Qgc3VwcG9ydCBpdCkKKyAqIGJpdCA4IGluZGljYXRlcyBpZiB0aGlzIGlzIGEgKDApIGNvcHBlciBvciAoMSkgZmliZXIgY2FyZAorICogYml0cyAxMi0xNiBpbmRpY2F0ZSBjYXJkIHR5cGU6ICgwKSBjbGllbnQgYW5kICgxKSBzZXJ2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR5cGhvb25fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCxUWVBIT09OX1RYIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfVFhfOTUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBIT09OX1RYOTUgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MF9UWF85NywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fVFg5NyB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwQiwKKwkgIFBDSV9BTllfSUQsIDB4MTAwMCwgMCwgMCwgVFlQSE9PTl9UWE0gfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MEIsCisJICBQQ0lfQU5ZX0lELCAweDExMDIsIDAsIDAsIFRZUEhPT05fRlhNIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBCLAorCSAgUENJX0FOWV9JRCwgMHgyMDAwLCAwLCAwLCBUWVBIT09OX0JTVlIgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MF9GWCwKKwkgIFBDSV9BTllfSUQsIDB4MTEwMSwgMCwgMCwgVFlQSE9PTl9GWDk1IH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfRlgsCisJICBQQ0lfQU5ZX0lELCAweDExMDIsIDAsIDAsIFRZUEhPT05fRlg5NyB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwX0ZYLAorCSAgUENJX0FOWV9JRCwgMHgyMTAxLCAwLCAwLCBUWVBIT09OX0ZYOTVTVlIgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MF9GWCwKKwkgIFBDSV9BTllfSUQsIDB4MjEwMiwgMCwgMCwgVFlQSE9PTl9GWDk3U1ZSIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBTVlI5NSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fU1ZSOTUgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MFNWUjk3LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQSE9PTl9TVlI5NyB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwU1ZSLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQSE9PTl9TVlIgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHlwaG9vbl9wY2lfdGJsKTsKKworLyogRGVmaW5lIHRoZSBzaGFyZWQgbWVtb3J5IGFyZWEKKyAqIEFsaWduIGV2ZXJ5dGhpbmcgdGhlIDNYUCB3aWxsIG5vcm1hbGx5IGJlIHVzaW5nLgorICogV2UnbGwgbmVlZCB0byBtb3ZlL2FsaWduIHR4SGkgaWYgd2Ugc3RhcnQgdXNpbmcgdGhhdCByaW5nLgorICovCisjZGVmaW5lIF9fM3hwX2FsaWduZWQJX19fX2NhY2hlbGluZV9hbGlnbmVkCitzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQgeworCXN0cnVjdCB0eXBob29uX2ludGVyZmFjZQlpZmFjZTsKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzCQlpbmRleGVzCQkJX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgdHhfZGVzYwkJCXR4TG9bVFhMT19FTlRSSUVTXSAJX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgcnhfZGVzYwkJCXJ4TG9bUlhfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgcnhfZGVzYwkJCXJ4SGlbUlhfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgY21kX2Rlc2MJCQljbWRbQ09NTUFORF9FTlRSSUVTXQlfXzN4cF9hbGlnbmVkOworCXN0cnVjdCByZXNwX2Rlc2MJCXJlc3BbUkVTUE9OU0VfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgcnhfZnJlZQkJCXJ4QnVmZltSWEZSRUVfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwl1MzIJCQkJemVyb1dvcmQ7CisJc3RydWN0IHR4X2Rlc2MJCQl0eEhpW1RYSElfRU5UUklFU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJ4YnVmZl9lbnQgeworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdAlkbWFfYWRkcjsKK307CisKK3N0cnVjdCB0eXBob29uIHsKKwkvKiBUeCBjYWNoZSBsaW5lIHNlY3Rpb24gKi8KKwlzdHJ1Y3QgdHJhbnNtaXRfcmluZyAJdHhMb1JpbmcJX19fX2NhY2hlbGluZV9hbGlnbmVkOwkKKwlzdHJ1Y3QgcGNpX2RldiAqCXR4X3BkZXY7CisJdm9pZCBfX2lvbWVtCQkqdHhfaW9hZGRyOworCXUzMgkJCXR4bG9fZG1hX2FkZHI7CisKKwkvKiBJcnEvUnggY2FjaGUgbGluZSBzZWN0aW9uICovCisJdm9pZCBfX2lvbWVtCQkqaW9hZGRyCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlczsKKwl1OAkJCWF3YWl0aW5nX3Jlc3A7CisJdTgJCQlkdXBsZXg7CisJdTgJCQlzcGVlZDsKKwl1OAkJCWNhcmRfc3RhdGU7CisJc3RydWN0IGJhc2ljX3JpbmcJcnhMb1Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKglwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICoJZGV2OworCXNwaW5sb2NrX3QJCXN0YXRlX2xvY2s7CisJc3RydWN0IHZsYW5fZ3JvdXAgKgl2bGdycDsKKwlzdHJ1Y3QgYmFzaWNfcmluZwlyeEhpUmluZzsKKwlzdHJ1Y3QgYmFzaWNfcmluZwlyeEJ1ZmZSaW5nOworCXN0cnVjdCByeGJ1ZmZfZW50CXJ4YnVmZmVyc1tSWEVOVF9FTlRSSUVTXTsKKworCS8qIGdlbmVyYWwgc2VjdGlvbiAqLworCXNwaW5sb2NrX3QJCWNvbW1hbmRfbG9jawlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGJhc2ljX3JpbmcJY21kUmluZzsKKwlzdHJ1Y3QgYmFzaWNfcmluZwlyZXNwUmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0c19zYXZlZDsKKwljb25zdCBjaGFyICoJCW5hbWU7CisJc3RydWN0IHR5cGhvb25fc2hhcmVkICoJc2hhcmVkOworCWRtYV9hZGRyX3QJCXNoYXJlZF9kbWE7CisJdTE2CQkJeGN2cl9zZWxlY3Q7CisJdTE2CQkJd29sX2V2ZW50czsKKwl1MzIJCQlvZmZsb2FkOworCisJLyogdW51c2VkIHN0dWZmIChmdXR1cmUgdXNlKSAqLworCWludAkJCWNhcGFiaWxpdGllczsKKwlzdHJ1Y3QgdHJhbnNtaXRfcmluZyAJdHhIaVJpbmc7Cit9OworCitlbnVtIGNvbXBsZXRpb25fd2FpdF92YWx1ZXMgeworCU5vV2FpdCA9IDAsIFdhaXROb1NsZWVwLCBXYWl0U2xlZXAsCit9OworCisvKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGhvb24uY2FyZF9zdGF0ZSB2YXJpYWJsZS4KKyAqIFRoZXNlIGRldGVybWluZSB3aGVyZSB0aGUgc3RhdGlzdGljcyB3aWxsIGNvbWUgZnJvbSBpbiBnZXRfc3RhdHMoKS4KKyAqIFRoZSBzbGVlcCBpbWFnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzdGF0aXN0aWNzIHdlIG5lZWQuCisgKi8KK2VudW0gc3RhdGVfdmFsdWVzIHsKKwlTbGVlcGluZyA9IDAsIFJ1bm5pbmcsCit9OworCisvKiBQQ0kgd3JpdGVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBwb3N0ZWQgaW4gb3JkZXIsIGJ1dCBvdXRzdGFuZGluZyB3cml0ZXMKKyAqIGNhbm5vdCBwYXNzIGEgcmVhZCwgc28gdGhpcyBmb3JjZXMgY3VycmVudCB3cml0ZXMgdG8gcG9zdC4KKyAqLworI2RlZmluZSB0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyh4KSBcCisJZG8geyBpZihsaWtlbHkodXNlX21taW8pKSBpb3JlYWQzMih4K1RZUEhPT05fUkVHX0hFQVJUQkVBVCk7IH0gd2hpbGUoMCkKKworLyogV2UnbGwgd2FpdCB1cCB0byBzaXggc2Vjb25kcyBmb3IgYSByZXNldCwgYW5kIGhhbGYgYSBzZWNvbmQgbm9ybWFsbHkuCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9VREVMQVkJCQk1MAorI2RlZmluZSBUWVBIT09OX1JFU0VUX1RJTUVPVVRfU0xFRVAJKDYgKiBIWikKKyNkZWZpbmUgVFlQSE9PTl9SRVNFVF9USU1FT1VUX05PU0xFRVAJKCg2ICogMTAwMDAwMCkgLyBUWVBIT09OX1VERUxBWSkKKyNkZWZpbmUgVFlQSE9PTl9XQUlUX1RJTUVPVVQJCSgoMTAwMDAwMCAvIDIpIC8gVFlQSE9PTl9VREVMQVkpCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA1LCAyOCkKKyNkZWZpbmUgdHlwaG9vbl9zeW5jaHJvbml6ZV9pcnEoeCkgc3luY2hyb25pemVfaXJxKCkKKyNlbHNlCisjZGVmaW5lIHR5cGhvb25fc3luY2hyb25pemVfaXJxKHgpIHN5bmNocm9uaXplX2lycSh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE5FVElGX0ZfVFNPKQorI2RlZmluZSBza2JfdHNvX3NpemUoeCkJCShza2Jfc2hpbmZvKHgpLT50c29fc2l6ZSkKKyNkZWZpbmUgVFNPX05VTV9ERVNDUklQVE9SUwkyCisjZGVmaW5lIFRTT19PRkZMT0FEX09OCQlUWVBIT09OX09GRkxPQURfVENQX1NFR01FTlQKKyNlbHNlCisjZGVmaW5lIE5FVElGX0ZfVFNPIAkJMAorI2RlZmluZSBza2JfdHNvX3NpemUoeCkgCTAKKyNkZWZpbmUgVFNPX05VTV9ERVNDUklQVE9SUwkwCisjZGVmaW5lIFRTT19PRkZMT0FEX09OCQkwCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQsIGNvbnN0IGludCBudW1fZW50cmllcykKK3sKKwkvKiBJbmNyZW1lbnQgYSByaW5nIGluZGV4IC0tIHdlIGNhbiB1c2UgdGhpcyBmb3IgYWxsIHJpbmdzIGV4ZWNlcHQKKwkgKiB0aGUgUnggcmluZ3MsIGFzIHRoZXkgdXNlIGRpZmZlcmVudCBzaXplIGRlc2NyaXB0b3JzCisJICogb3RoZXJ3aXNlLCBldmVyeXRoaW5nIGlzIHRoZSBzYW1lIHNpemUgYXMgYSBjbWRfZGVzYworCSAqLworCSppbmRleCArPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpOworCSppbmRleCAlPSBudW1fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25faW5jX2NtZF9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJdHlwaG9vbl9pbmNfaW5kZXgoaW5kZXgsIGNvdW50LCBDT01NQU5EX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25faW5jX3Jlc3BfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50KQoreworCXR5cGhvb25faW5jX2luZGV4KGluZGV4LCBjb3VudCwgUkVTUE9OU0VfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9pbmNfcnhmcmVlX2luZGV4KHUzMiAqaW5kZXgsIGNvbnN0IGludCBjb3VudCkKK3sKKwl0eXBob29uX2luY19pbmRleChpbmRleCwgY291bnQsIFJYRlJFRV9FTlRSSUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY190eF9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJLyogaWYgd2Ugc3RhcnQgdXNpbmcgdGhlIEhpIFR4IHJpbmcsIHRoaXMgbmVlZHMgdXBkYXRlaW5nICovCisJdHlwaG9vbl9pbmNfaW5kZXgoaW5kZXgsIGNvdW50LCBUWExPX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25faW5jX3J4X2luZGV4KHUzMiAqaW5kZXgsIGNvbnN0IGludCBjb3VudCkKK3sKKwkvKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICE9IHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpICovCisJKmluZGV4ICs9IGNvdW50ICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwkqaW5kZXggJT0gUlhfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fcmVzZXQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCB3YWl0X3R5cGUpCit7CisJaW50IGksIGVyciA9IDA7CisJaW50IHRpbWVvdXQ7CisKKwlpZih3YWl0X3R5cGUgPT0gV2FpdE5vU2xlZXApCisJCXRpbWVvdXQgPSBUWVBIT09OX1JFU0VUX1RJTUVPVVRfTk9TTEVFUDsKKwllbHNlCisJCXRpbWVvdXQgPSBUWVBIT09OX1JFU0VUX1RJTUVPVVRfU0xFRVA7CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCisJaW93cml0ZTMyKFRZUEhPT05fUkVTRVRfQUxMLCBpb2FkZHIgKyBUWVBIT09OX1JFR19TT0ZUX1JFU0VUKTsKKwl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCXVkZWxheSgxKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9SRVNFVF9OT05FLCBpb2FkZHIgKyBUWVBIT09OX1JFR19TT0ZUX1JFU0VUKTsKKworCWlmKHdhaXRfdHlwZSAhPSBOb1dhaXQpIHsKKwkJZm9yKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCQlpZihpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19TVEFUVVMpID09CisJCQkgICBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKQorCQkJCWdvdG8gb3V0OworCisJCQlpZih3YWl0X3R5cGUgPT0gV2FpdFNsZWVwKSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQl9IGVsc2UKKwkJCQl1ZGVsYXkoVFlQSE9PTl9VREVMQVkpOworCQl9CisKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwl9CisKK291dDoKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCisJLyogVGhlIDNYUCBzZWVtcyB0byBuZWVkIGEgbGl0dGxlIGV4dHJhIHRpbWUgdG8gY29tcGxldGUgdGhlIGxvYWQKKwkgKiBvZiB0aGUgc2xlZXAgaW1hZ2UgYmVmb3JlIHdlIGNhbiByZWxpYWJseSBib290IGl0LiBGYWlsdXJlIHRvCisJICogZG8gdGhpcyBvY2Nhc2lvbmFsbHkgcmVzdWx0cyBpbiBhIGh1bmcgYWRhcHRlciBhZnRlciBib290IGluCisJICogdHlwaG9vbl9pbml0X29uZSgpIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBNQUMgYWRkcmVzcyBvcgorCSAqIHB1dHRpbmcgdGhlIGNhcmQgdG8gc2xlZXAuIDNDb20ncyBkcml2ZXIgd2FpdHMgNW1zLCBidXQKKwkgKiB0aGF0IHNlZW1zIHRvIGJlIG92ZXJraWxsLiBIb3dldmVyLCBpZiB3ZSBjYW4gc2xlZXAsIHdlIG1pZ2h0CisJICogYXMgd2VsbCBnaXZlIGl0IHRoYXQgbXVjaCB0aW1lLiBPdGhlcndpc2UsIHdlJ2xsIGdpdmUgaXQgNTAwdXMsCisJICogd2hpY2ggc2hvdWxkIGJlIGVub3VnaCAoSSd2ZSBzZWUgaXQgd29yayB3ZWxsIGF0IDEwMHVzLCBidXQgc3RpbGwKKwkgKiBzYXcgb2NjYXNpb25hbCBwcm9ibGVtcy4pCisJICovCisJaWYod2FpdF90eXBlID09IFdhaXRTbGVlcCkKKwkJbXNsZWVwKDUpOworCWVsc2UKKwkJdWRlbGF5KDUwMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordHlwaG9vbl93YWl0X3N0YXR1cyh2b2lkIF9faW9tZW0gKmlvYWRkciwgdTMyIHdhaXRfdmFsdWUpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBUWVBIT09OX1dBSVRfVElNRU9VVDsgaSsrKSB7CisJCWlmKGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykgPT0gd2FpdF92YWx1ZSkKKwkJCWdvdG8gb3V0OworCQl1ZGVsYXkoVFlQSE9PTl9VREVMQVkpOworCX0KKworCWVyciA9IC1FVElNRURPVVQ7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25fbWVkaWFfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByZXNwX2Rlc2MgKnJlc3ApCit7CisJaWYocmVzcC0+cGFybTEgJiBUWVBIT09OX01FRElBX1NUQVRfTk9fTElOSykKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwllbHNlCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2hlbGxvKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlzdHJ1Y3QgYmFzaWNfcmluZyAqcmluZyA9ICZ0cC0+Y21kUmluZzsKKwlzdHJ1Y3QgY21kX2Rlc2MgKmNtZDsKKworCS8qIFdlIG9ubHkgZ2V0IGEgaGVsbG8gcmVxdWVzdCBpZiB3ZSd2ZSBub3Qgc2VudCBhbnl0aGluZyB0byB0aGUKKwkgKiBjYXJkIGluIGEgbG9uZyB3aGlsZS4gSWYgdGhlIGxvY2sgaXMgaGVsZCwgdGhlbiB3ZSdyZSBpbiB0aGUKKwkgKiBwcm9jZXNzIG9mIGlzc3VpbmcgYSBjb21tYW5kLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlc3BvbmQuCisJICovCisJaWYoc3Bpbl90cnlsb2NrKCZ0cC0+Y29tbWFuZF9sb2NrKSkgeworCQljbWQgPSAoc3RydWN0IGNtZF9kZXNjICopKHJpbmctPnJpbmdCYXNlICsgcmluZy0+bGFzdFdyaXRlKTsKKwkJdHlwaG9vbl9pbmNfY21kX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIDEpOworCisJCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRShjbWQsIFRZUEhPT05fQ01EX0hFTExPX1JFU1ApOworCQlzbXBfd21iKCk7CisJCWlvd3JpdGUzMihyaW5nLT5sYXN0V3JpdGUsIHRwLT5pb2FkZHIgKyBUWVBIT09OX1JFR19DTURfUkVBRFkpOworCQlzcGluX3VubG9jaygmdHAtPmNvbW1hbmRfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50Cit0eXBob29uX3Byb2Nlc3NfcmVzcG9uc2Uoc3RydWN0IHR5cGhvb24gKnRwLCBpbnQgcmVzcF9zaXplLAorCQkJCXN0cnVjdCByZXNwX2Rlc2MgKnJlc3Bfc2F2ZSkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJc3RydWN0IHJlc3BfZGVzYyAqcmVzcDsKKwl1OCAqYmFzZSA9IHRwLT5yZXNwUmluZy5yaW5nQmFzZTsKKwlpbnQgY291bnQsIGxlbiwgd3JhcF9sZW47CisJdTMyIGNsZWFyZWQ7CisJdTMyIHJlYWR5OworCisJY2xlYXJlZCA9IGxlMzJfdG9fY3B1KGluZGV4ZXMtPnJlc3BDbGVhcmVkKTsKKwlyZWFkeSA9IGxlMzJfdG9fY3B1KGluZGV4ZXMtPnJlc3BSZWFkeSk7CisJd2hpbGUoY2xlYXJlZCAhPSByZWFkeSkgeworCQlyZXNwID0gKHN0cnVjdCByZXNwX2Rlc2MgKikoYmFzZSArIGNsZWFyZWQpOworCQljb3VudCA9IHJlc3AtPm51bURlc2MgKyAxOworCQlpZihyZXNwX3NhdmUgJiYgcmVzcC0+c2VxTm8pIHsKKwkJCWlmKGNvdW50ID4gcmVzcF9zaXplKSB7CisJCQkJcmVzcF9zYXZlLT5mbGFncyA9IFRZUEhPT05fUkVTUF9FUlJPUjsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisKKwkJCXdyYXBfbGVuID0gMDsKKwkJCWxlbiA9IGNvdW50ICogc2l6ZW9mKCpyZXNwKTsKKwkJCWlmKHVubGlrZWx5KGNsZWFyZWQgKyBsZW4gPiBSRVNQT05TRV9SSU5HX1NJWkUpKSB7CisJCQkJd3JhcF9sZW4gPSBjbGVhcmVkICsgbGVuIC0gUkVTUE9OU0VfUklOR19TSVpFOworCQkJCWxlbiA9IFJFU1BPTlNFX1JJTkdfU0laRSAtIGNsZWFyZWQ7CisJCQl9CisKKwkJCW1lbWNweShyZXNwX3NhdmUsIHJlc3AsIGxlbik7CisJCQlpZih1bmxpa2VseSh3cmFwX2xlbikpIHsKKwkJCQlyZXNwX3NhdmUgKz0gbGVuIC8gc2l6ZW9mKCpyZXNwKTsKKwkJCQltZW1jcHkocmVzcF9zYXZlLCBiYXNlLCB3cmFwX2xlbik7CisJCQl9CisKKwkJCXJlc3Bfc2F2ZSA9IE5VTEw7CisJCX0gZWxzZSBpZihyZXNwLT5jbWQgPT0gVFlQSE9PTl9DTURfUkVBRF9NRURJQV9TVEFUVVMpIHsKKwkJCXR5cGhvb25fbWVkaWFfc3RhdHVzKHRwLT5kZXYsIHJlc3ApOworCQl9IGVsc2UgaWYocmVzcC0+Y21kID09IFRZUEhPT05fQ01EX0hFTExPX1JFU1ApIHsKKwkJCXR5cGhvb25faGVsbG8odHApOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHVtcGluZyB1bmV4cGVjdGVkIHJlc3BvbnNlICIKKwkJCSAgICAgICAiMHglMDR4OiVkOjB4JTAyeDoweCUwNHg6JTA4eDolMDh4XG4iLAorCQkJICAgICAgIHRwLT5uYW1lLCBsZTE2X3RvX2NwdShyZXNwLT5jbWQpLAorCQkJICAgICAgIHJlc3AtPm51bURlc2MsIHJlc3AtPmZsYWdzLAorCQkJICAgICAgIGxlMTZfdG9fY3B1KHJlc3AtPnBhcm0xKSwKKwkJCSAgICAgICBsZTMyX3RvX2NwdShyZXNwLT5wYXJtMiksCisJCQkgICAgICAgbGUzMl90b19jcHUocmVzcC0+cGFybTMpKTsKKwkJfQorCitjbGVhbnVwOgorCQl0eXBob29uX2luY19yZXNwX2luZGV4KCZjbGVhcmVkLCBjb3VudCk7CisJfQorCisJaW5kZXhlcy0+cmVzcENsZWFyZWQgPSBjcHVfdG9fbGUzMihjbGVhcmVkKTsKKwl3bWIoKTsKKwlyZXR1cm4gKHJlc3Bfc2F2ZSA9PSBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3R5cGhvb25fbnVtX2ZyZWUoaW50IGxhc3RXcml0ZSwgaW50IGxhc3RSZWFkLCBpbnQgcmluZ1NpemUpCit7CisJLyogdGhpcyB3b3JrcyBmb3IgYWxsIGRlc2NyaXB0b3JzIGJ1dCByeF9kZXNjLCBhcyB0aGV5IGFyZSBhCisJICogZGlmZmVyZW50IHNpemUgdGhhbiB0aGUgY21kX2Rlc2MgLS0gZXZlcnlvbmUgZWxzZSBpcyB0aGUgc2FtZQorCSAqLworCWxhc3RXcml0ZSAvPSBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKKwlsYXN0UmVhZCAvPSBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKKwlyZXR1cm4gKHJpbmdTaXplICsgbGFzdFJlYWQgLSBsYXN0V3JpdGUgLSAxKSAlIHJpbmdTaXplOworfQorCitzdGF0aWMgaW5saW5lIGludAordHlwaG9vbl9udW1fZnJlZV9jbWQoc3RydWN0IHR5cGhvb24gKnRwKQoreworCWludCBsYXN0V3JpdGUgPSB0cC0+Y21kUmluZy5sYXN0V3JpdGU7CisJaW50IGNtZENsZWFyZWQgPSBsZTMyX3RvX2NwdSh0cC0+aW5kZXhlcy0+Y21kQ2xlYXJlZCk7CisKKwlyZXR1cm4gdHlwaG9vbl9udW1fZnJlZShsYXN0V3JpdGUsIGNtZENsZWFyZWQsIENPTU1BTkRfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eXBob29uX251bV9mcmVlX3Jlc3Aoc3RydWN0IHR5cGhvb24gKnRwKQoreworCWludCByZXNwUmVhZHkgPSBsZTMyX3RvX2NwdSh0cC0+aW5kZXhlcy0+cmVzcFJlYWR5KTsKKwlpbnQgcmVzcENsZWFyZWQgPSBsZTMyX3RvX2NwdSh0cC0+aW5kZXhlcy0+cmVzcENsZWFyZWQpOworCisJcmV0dXJuIHR5cGhvb25fbnVtX2ZyZWUocmVzcFJlYWR5LCByZXNwQ2xlYXJlZCwgUkVTUE9OU0VfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eXBob29uX251bV9mcmVlX3R4KHN0cnVjdCB0cmFuc21pdF9yaW5nICpyaW5nKQoreworCS8qIGlmIHdlIHN0YXJ0IHVzaW5nIHRoZSBIaSBUeCByaW5nLCB0aGlzIG5lZWRzIHVwZGF0aW5nICovCisJcmV0dXJuIHR5cGhvb25fbnVtX2ZyZWUocmluZy0+bGFzdFdyaXRlLCByaW5nLT5sYXN0UmVhZCwgVFhMT19FTlRSSUVTKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9pc3N1ZV9jb21tYW5kKHN0cnVjdCB0eXBob29uICp0cCwgaW50IG51bV9jbWQsIHN0cnVjdCBjbWRfZGVzYyAqY21kLAorCQkgICAgICBpbnQgbnVtX3Jlc3AsIHN0cnVjdCByZXNwX2Rlc2MgKnJlc3ApCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCBiYXNpY19yaW5nICpyaW5nID0gJnRwLT5jbWRSaW5nOworCXN0cnVjdCByZXNwX2Rlc2MgbG9jYWxfcmVzcDsKKwlpbnQgaSwgZXJyID0gMDsKKwlpbnQgZ290X3Jlc3A7CisJaW50IGZyZWVDbWQsIGZyZWVSZXNwOworCWludCBsZW4sIHdyYXBfbGVuOworCisJc3Bpbl9sb2NrKCZ0cC0+Y29tbWFuZF9sb2NrKTsKKworCWZyZWVDbWQgPSB0eXBob29uX251bV9mcmVlX2NtZCh0cCk7CisJZnJlZVJlc3AgPSB0eXBob29uX251bV9mcmVlX3Jlc3AodHApOworCisJaWYoZnJlZUNtZCA8IG51bV9jbWQgfHwgZnJlZVJlc3AgPCBudW1fcmVzcCkgeworCQlwcmludGsoIiVzOiBubyBkZXNjcyBmb3IgY21kLCBoYWQgKG5lZWRlZCkgJWQgKCVkKSBjbWQsICIKKwkJCSIlZCAoJWQpIHJlc3BcbiIsIHRwLT5uYW1lLCBmcmVlQ21kLCBudW1fY21kLAorCQkJZnJlZVJlc3AsIG51bV9yZXNwKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYoY21kLT5mbGFncyAmIFRZUEhPT05fQ01EX1JFU1BPTkQpIHsKKwkJLyogSWYgd2UncmUgZXhwZWN0aW5nIGEgcmVzcG9uc2UsIGJ1dCB0aGUgY2FsbGVyIGhhc24ndCBnaXZlbgorCQkgKiB1cyBhIHBsYWNlIHRvIHB1dCBpdCwgd2UnbGwgcHJvdmlkZSBvbmUuCisJCSAqLworCQl0cC0+YXdhaXRpbmdfcmVzcCA9IDE7CisJCWlmKHJlc3AgPT0gTlVMTCkgeworCQkJcmVzcCA9ICZsb2NhbF9yZXNwOworCQkJbnVtX3Jlc3AgPSAxOworCQl9CisJfQorCisJd3JhcF9sZW4gPSAwOworCWxlbiA9IG51bV9jbWQgKiBzaXplb2YoKmNtZCk7CisJaWYodW5saWtlbHkocmluZy0+bGFzdFdyaXRlICsgbGVuID4gQ09NTUFORF9SSU5HX1NJWkUpKSB7CisJCXdyYXBfbGVuID0gcmluZy0+bGFzdFdyaXRlICsgbGVuIC0gQ09NTUFORF9SSU5HX1NJWkU7CisJCWxlbiA9IENPTU1BTkRfUklOR19TSVpFIC0gcmluZy0+bGFzdFdyaXRlOworCX0KKworCW1lbWNweShyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSwgY21kLCBsZW4pOworCWlmKHVubGlrZWx5KHdyYXBfbGVuKSkgeworCQlzdHJ1Y3QgY21kX2Rlc2MgKndyYXBfcHRyID0gY21kOworCQl3cmFwX3B0ciArPSBsZW4gLyBzaXplb2YoKmNtZCk7CisJCW1lbWNweShyaW5nLT5yaW5nQmFzZSwgd3JhcF9wdHIsIHdyYXBfbGVuKTsKKwl9CisKKwl0eXBob29uX2luY19jbWRfaW5kZXgoJnJpbmctPmxhc3RXcml0ZSwgbnVtX2NtZCk7CisKKwkvKiAiSSBmZWVsIGEgcHJlc2VuY2UuLi4gYW5vdGhlciB3YXJyaW9yIGlzIG9uIHRoZSB0aGUgbWVzYS4iCisJICovCisJd21iKCk7CisJaW93cml0ZTMyKHJpbmctPmxhc3RXcml0ZSwgdHAtPmlvYWRkciArIFRZUEhPT05fUkVHX0NNRF9SRUFEWSk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXModHAtPmlvYWRkcik7CisKKwlpZigoY21kLT5mbGFncyAmIFRZUEhPT05fQ01EX1JFU1BPTkQpID09IDApCisJCWdvdG8gb3V0OworCisJLyogVWdoLiBXZSdsbCBiZSBoZXJlIGFib3V0IDhtcywgc3Bpbm5pbmcgb3VyIHRodW1icywgdW5hYmxlIHRvCisJICogcHJlZW1wdCBvciBkbyBhbnl0aGluZyBvdGhlciB0aGFuIHRha2UgaW50ZXJydXB0cy4gU28sIGRvbid0CisJICogd2FpdCBmb3IgYSByZXNwb25zZSB1bmxlc3MgeW91IGhhdmUgdG8uCisJICoKKwkgKiBJJ3ZlIHRob3VnaHQgYWJvdXQgdHJ5aW5nIHRvIHNsZWVwIGhlcmUsIGJ1dCB3ZSdyZSBjYWxsZWQKKwkgKiBmcm9tIG1hbnkgY29udGV4dHMgdGhhdCBkb24ndCBhbGxvdyB0aGF0LiBBbHNvLCBnaXZlbiB0aGUgd2F5CisJICogM0NvbSBoYXMgaW1wbGVtZW50ZWQgaXJxIGNvYWxlc2NpbmcsIHdlIHdvdWxkIGxpa2VseSB0aW1lb3V0IC0tCisJICogdGhpcyBoYXMgYmVlbiBvYnNlcnZlZCBpbiByZWFsIGxpZmUhCisJICoKKwkgKiBUaGUgYmlnIGtpbGxlciBpcyB3ZSBoYXZlIHRvIHdhaXQgdG8gZ2V0IHN0YXRzIGZyb20gdGhlIGNhcmQsCisJICogdGhvdWdoIHdlIGNvdWxkIGdvIHRvIGEgcGVyaW9kaWMgcmVmcmVzaCBvZiB0aG9zZSBpZiB3ZSBkb24ndAorCSAqIG1pbmQgdGhlbSBnZXR0aW5nIHNvbWV3aGF0IHN0YWxlLiBUaGUgcmVzdCBvZiB0aGUgd2FpdGluZworCSAqIGNvbW1hbmRzIG9jY3VyIGR1cmluZyBvcGVuL2Nsb3NlL3N1c3BlbmQvcmVzdW1lLCBzbyB0aGV5IGFyZW4ndAorCSAqIHRpbWUgY3JpdGljYWwuIENyZWF0aW5nIFNBcyBpbiB0aGUgZnV0dXJlIHdpbGwgYWxzbyBoYXZlIHRvCisJICogd2FpdCBoZXJlLgorCSAqLworCWdvdF9yZXNwID0gMDsKKwlmb3IoaSA9IDA7IGkgPCBUWVBIT09OX1dBSVRfVElNRU9VVCAmJiAhZ290X3Jlc3A7IGkrKykgeworCQlpZihpbmRleGVzLT5yZXNwQ2xlYXJlZCAhPSBpbmRleGVzLT5yZXNwUmVhZHkpCisJCQlnb3RfcmVzcCA9IHR5cGhvb25fcHJvY2Vzc19yZXNwb25zZSh0cCwgbnVtX3Jlc3AsCisJCQkJCQkJCXJlc3ApOworCQl1ZGVsYXkoVFlQSE9PTl9VREVMQVkpOworCX0KKworCWlmKCFnb3RfcmVzcCkgeworCQllcnIgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb2xsZWN0IHRoZSBlcnJvciByZXNwb25zZSBldmVuIGlmIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCisJICogcmVzdCBvZiB0aGUgcmVzcG9uc2UKKwkgKi8KKwlpZihyZXNwLT5mbGFncyAmIFRZUEhPT05fUkVTUF9FUlJPUikKKwkJZXJyID0gLUVJTzsKKworb3V0OgorCWlmKHRwLT5hd2FpdGluZ19yZXNwKSB7CisJCXRwLT5hd2FpdGluZ19yZXNwID0gMDsKKwkJc21wX3dtYigpOworCisJCS8qIFVnaC4gSWYgYSByZXNwb25zZSB3YXMgYWRkZWQgdG8gdGhlIHJpbmcgYmV0d2VlbgorCQkgKiB0aGUgY2FsbCB0byB0eXBob29uX3Byb2Nlc3NfcmVzcG9uc2UoKSBhbmQgdGhlIGNsZWFyaW5nCisJCSAqIG9mIHRwLT5hd2FpdGluZ19yZXNwLCB3ZSBjb3VsZCBoYXZlIG1pc3NlZCB0aGUgaW50ZXJydXB0CisJCSAqIGFuZCBpdCBjb3VsZCBoYW5nIGluIHRoZSByaW5nIGFuIGluZGV0ZXJtaW5hdGUgYW1vdW50IG9mCisJCSAqIHRpbWUuIFNvLCBjaGVjayBmb3IgaXQsIGFuZCBpbnRlcnJ1cHQgb3Vyc2VsdmVzIGlmIHRoaXMKKwkJICogaXMgdGhlIGNhc2UuCisJCSAqLworCQlpZihpbmRleGVzLT5yZXNwQ2xlYXJlZCAhPSBpbmRleGVzLT5yZXNwUmVhZHkpCisJCQlpb3dyaXRlMzIoMSwgdHAtPmlvYWRkciArIFRZUEhPT05fUkVHX1NFTEZfSU5URVJSVVBUKTsKKwl9CisKKwlzcGluX3VubG9jaygmdHAtPmNvbW1hbmRfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25fdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGNtZF9kZXNjIHhwX2NtZDsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJaWYoIXRwLT52bGdycCAhPSAhZ3JwKSB7CisJCS8qIFdlJ3ZlIGVpdGhlciBiZWVuIHR1cm5lZCBvbiBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yIHdlJ3ZlCisJCSAqIGJlZW4gdHVybmVkIG9mZi4gVXBkYXRlIHRoZSAzWFAuCisJCSAqLworCQlpZihncnApCisJCQl0cC0+b2ZmbG9hZCB8PSBUWVBIT09OX09GRkxPQURfVkxBTjsKKwkJZWxzZQorCQkJdHAtPm9mZmxvYWQgJj0gflRZUEhPT05fT0ZGTE9BRF9WTEFOOworCisJCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgdXAsIHRoZSBydW50aW1lIGlzIHJ1bm5pbmcgLS0gYW5kIHdlCisJCSAqIG11c3QgYmUgdXAgZm9yIHRoZSB2bGFuIGNvcmUgdG8gY2FsbCB1cy4KKwkJICoKKwkJICogRG8gdGhlIGNvbW1hbmQgb3V0c2lkZSBvZiB0aGUgc3BpbiBsb2NrLCBhcyBpdCBpcyBzbG93LgorCQkgKi8KKwkJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwKKwkJCQkJVFlQSE9PTl9DTURfU0VUX09GRkxPQURfVEFTS1MpOworCQl4cF9jbWQucGFybTIgPSB0cC0+b2ZmbG9hZDsKKwkJeHBfY21kLnBhcm0zID0gdHAtPm9mZmxvYWQ7CisJCXNwaW5fdW5sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJCWlmKGVyciA8IDApCisJCQlwcmludGsoIiVzOiB2bGFuIG9mZmxvYWQgZXJyb3IgJWRcbiIsIHRwLT5uYW1lLCAtZXJyKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJfQorCisJLyogbm93IG1ha2UgdGhlIGNoYW5nZSB2aXNpYmxlICovCisJdHAtPnZsZ3JwID0gZ3JwOworCXNwaW5fdW5sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJaWYodHAtPnZsZ3JwKQorCQl0cC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25fdHNvX2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZywKKwkJCXUzMiByaW5nX2RtYSkKK3sKKwlzdHJ1Y3QgdGNwb3B0X2Rlc2MgKnRjcGQ7CisJdTMyIHRjcGRfb2Zmc2V0ID0gcmluZ19kbWE7CisKKwl0Y3BkID0gKHN0cnVjdCB0Y3BvcHRfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArIHR4UmluZy0+bGFzdFdyaXRlKTsKKwl0Y3BkX29mZnNldCArPSB0eFJpbmctPmxhc3RXcml0ZTsKKwl0Y3BkX29mZnNldCArPSBvZmZzZXRvZihzdHJ1Y3QgdGNwb3B0X2Rlc2MsIGJ5dGVzVHgpOworCXR5cGhvb25faW5jX3R4X2luZGV4KCZ0eFJpbmctPmxhc3RXcml0ZSwgMSk7CisKKwl0Y3BkLT5mbGFncyA9IFRZUEhPT05fT1BUX0RFU0MgfCBUWVBIT09OX09QVF9UQ1BfU0VHOworCXRjcGQtPm51bURlc2MgPSAxOworCXRjcGQtPm1zc19mbGFncyA9IGNwdV90b19sZTE2KHNrYl90c29fc2l6ZShza2IpKTsKKwl0Y3BkLT5tc3NfZmxhZ3MgfD0gVFlQSE9PTl9UU09fRklSU1QgfCBUWVBIT09OX1RTT19MQVNUOworCXRjcGQtPnJlc3BBZGRyTG8gPSBjcHVfdG9fbGUzMih0Y3BkX29mZnNldCk7CisJdGNwZC0+Ynl0ZXNUeCA9IGNwdV90b19sZTMyKHNrYi0+bGVuKTsKKwl0Y3BkLT5zdGF0dXMgPSAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqdHhSaW5nOworCXN0cnVjdCB0eF9kZXNjICp0eGQsICpmaXJzdF90eGQ7CisJZG1hX2FkZHJfdCBza2JfZG1hOworCWludCBudW1EZXNjOworCisJLyogd2UgaGF2ZSB0d28gcmluZ3MgdG8gY2hvb3NlIGZyb20sIGJ1dCB3ZSBvbmx5IHVzZSB0eExvIGZvciBub3cKKwkgKiBJZiB3ZSBzdGFydCB1c2luZyB0aGUgSGkgcmluZyBhcyB3ZWxsLCB3ZSdsbCBuZWVkIHRvIHVwZGF0ZQorCSAqIHR5cGhvb25fc3RvcF9ydW50aW1lKCksIHR5cGhvb25faW50ZXJydXB0KCksIHR5cGhvb25fbnVtX2ZyZWVfdHgoKSwKKwkgKiBhbmQgVFhISV9FTlRJUkVTIHRvIG1hdGNoLCBhcyB3ZWxsIGFzIHVwZGF0ZSB0aGUgVFNPIGNvZGUgYmVsb3cKKwkgKiB0byBnZXQgdGhlIHJpZ2h0IERNQSBhZGRyZXNzCisJICovCisJdHhSaW5nID0gJnRwLT50eExvUmluZzsKKworCS8qIFdlIG5lZWQgb25lIGRlc2NyaXB0b3IgZm9yIGVhY2ggZnJhZ21lbnQgb2YgdGhlIHNrX2J1ZmYsIHBsdXMgdGhlCisJICogb25lIGZvciB0aGUgLT5kYXRhIGFyZWEgb2YgaXQuCisJICoKKwkgKiBUaGUgZG9jcyBzYXkgYSBtYXhpbXVtIG9mIDE2IGZyYWdtZW50IGRlc2NyaXB0b3JzIHBlciBUQ1Agb3B0aW9uCisJICogZGVzY3JpcHRvciwgdGhlbiBtYWtlIGEgbmV3IHBhY2tldCBkZXNjcmlwdG9yIGFuZCBvcHRpb24gZGVzY3JpcHRvcgorCSAqIGZvciB0aGUgbmV4dCAxNiBmcmFnbWVudHMuIFRoZSBlbmdpbmVlcnMgc2F5IGp1c3QgYW4gb3B0aW9uCisJICogZGVzY3JpcHRvciBpcyBuZWVkZWQuIEkndmUgdGVzdGVkIHVwIHRvIDI2IGZyYWdtZW50cyB3aXRoIGEgc2luZ2xlCisJICogcGFja2V0IGRlc2NyaXB0b3Ivb3B0aW9uIGRlc2NyaXB0b3IgY29tYm8sIHNvIEkgdXNlIHRoYXQgZm9yIG5vdy4KKwkgKgorCSAqIElmIHByb2JsZW1zIGRldmVsb3Agd2l0aCBUU08sIGNoZWNrIHRoaXMgZmlyc3QuCisJICovCisJbnVtRGVzYyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCWlmKHNrYl90c29fc2l6ZShza2IpKQorCQludW1EZXNjKys7CisKKwkvKiBXaGVuIGNoZWNraW5nIGZvciBmcmVlIHNwYWNlIGluIHRoZSByaW5nLCB3ZSBuZWVkIHRvIGFsc28KKwkgKiBhY2NvdW50IGZvciB0aGUgaW5pdGlhbCBUeCBkZXNjcmlwdG9yLCBhbmQgd2UgYWx3YXlzIG11c3QgbGVhdmUKKwkgKiBhdCBsZWFzdCBvbmUgZGVzY3JpcHRvciB1bnVzZWQgaW4gdGhlIHJpbmcgc28gdGhhdCBpdCBkb2Vzbid0CisJICogd3JhcCBhbmQgbG9vayBlbXB0eS4KKwkgKgorCSAqIFRoZSBvbmx5IHRpbWUgd2Ugc2hvdWxkIGxvb3AgaGVyZSBpcyB3aGVuIHdlIGhpdCB0aGUgcmFjZQorCSAqIGJldHdlZW4gbWFya2luZyB0aGUgcXVldWUgYXdha2UgYW5kIHVwZGF0aW5nIHRoZSBjbGVhcmVkIGluZGV4LgorCSAqIEp1c3QgbG9vcCBhbmQgaXQgd2lsbCBhcHBlYXIuIFRoaXMgY29tZXMgZnJvbSB0aGUgYWNlbmljIGRyaXZlci4KKwkgKi8KKwl3aGlsZSh1bmxpa2VseSh0eXBob29uX251bV9mcmVlX3R4KHR4UmluZykgPCAobnVtRGVzYyArIDIpKSkKKwkJc21wX3JtYigpOworCisJZmlyc3RfdHhkID0gKHN0cnVjdCB0eF9kZXNjICopICh0eFJpbmctPnJpbmdCYXNlICsgdHhSaW5nLT5sYXN0V3JpdGUpOworCXR5cGhvb25faW5jX3R4X2luZGV4KCZ0eFJpbmctPmxhc3RXcml0ZSwgMSk7CisKKwlmaXJzdF90eGQtPmZsYWdzID0gVFlQSE9PTl9UWF9ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOworCWZpcnN0X3R4ZC0+bnVtRGVzYyA9IDA7CisJZmlyc3RfdHhkLT5sZW4gPSAwOworCWZpcnN0X3R4ZC0+YWRkciA9ICh1NjQpKCh1bnNpZ25lZCBsb25nKSBza2IpICYgMHhmZmZmZmZmZjsKKwlmaXJzdF90eGQtPmFkZHJIaSA9ICh1NjQpKCh1bnNpZ25lZCBsb25nKSBza2IpID4+IDMyOworCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzID0gMDsKKworCWlmKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCS8qIFRoZSAzWFAgd2lsbCBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgVURQL1RDUCAqLworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PSBUWVBIT09OX1RYX1BGX1RDUF9DSEtTVU07CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9IFRZUEhPT05fVFhfUEZfVURQX0NIS1NVTTsKKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0gVFlQSE9PTl9UWF9QRl9JUF9DSEtTVU07CisJfQorCisJaWYodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9CisJCSAgICBUWVBIT09OX1RYX1BGX0lOU0VSVF9WTEFOIHwgVFlQSE9PTl9UWF9QRl9WTEFOX1BSSU9SSVRZOworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PQorCQkgICAgY3B1X3RvX2xlMzIoaHRvbnModmxhbl90eF90YWdfZ2V0KHNrYikpIDw8CisJCQkJVFlQSE9PTl9UWF9QRl9WTEFOX1RBR19TSElGVCk7CisJfQorCisJaWYoc2tiX3Rzb19zaXplKHNrYikpIHsKKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0gVFlQSE9PTl9UWF9QRl9UQ1BfU0VHTUVOVDsKKwkJZmlyc3RfdHhkLT5udW1EZXNjKys7CisKKwkJdHlwaG9vbl90c29fZmlsbChza2IsIHR4UmluZywgdHAtPnR4bG9fZG1hX2FkZHIpOworCX0KKworCXR4ZCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArIHR4UmluZy0+bGFzdFdyaXRlKTsKKwl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJLyogTm8gbmVlZCB0byB3b3JyeSBhYm91dCBwYWRkaW5nIHBhY2tldCAtLSB0aGUgZmlybXdhcmUgcGFkcworCSAqIGl0IHdpdGggemVyb3MgdG8gRVRIX1pMRU4gZm9yIHVzLgorCSAqLworCWlmKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCkgeworCQlza2JfZG1hID0gcGNpX21hcF9zaW5nbGUodHAtPnR4X3BkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eGQtPmZsYWdzID0gVFlQSE9PTl9GUkFHX0RFU0MgfCBUWVBIT09OX0RFU0NfVkFMSUQ7CisJCXR4ZC0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOworCQl0eGQtPmFkZHIgPSBjcHVfdG9fbGUzMihza2JfZG1hKTsKKwkJdHhkLT5hZGRySGkgPSAwOworCQlmaXJzdF90eGQtPm51bURlc2MrKzsKKwl9IGVsc2UgeworCQlpbnQgaSwgbGVuOworCisJCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCXNrYl9kbWEgPSBwY2lfbWFwX3NpbmdsZSh0cC0+dHhfcGRldiwgc2tiLT5kYXRhLCBsZW4sCisJCQkJICAgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCXR4ZC0+ZmxhZ3MgPSBUWVBIT09OX0ZSQUdfREVTQyB8IFRZUEhPT05fREVTQ19WQUxJRDsKKwkJdHhkLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCQl0eGQtPmFkZHIgPSBjcHVfdG9fbGUzMihza2JfZG1hKTsKKwkJdHhkLT5hZGRySGkgPSAwOworCQlmaXJzdF90eGQtPm51bURlc2MrKzsKKworCQlmb3IoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCXZvaWQgKmZyYWdfYWRkcjsKKworCQkJdHhkID0gKHN0cnVjdCB0eF9kZXNjICopICh0eFJpbmctPnJpbmdCYXNlICsKKwkJCQkJCXR4UmluZy0+bGFzdFdyaXRlKTsKKwkJCXR5cGhvb25faW5jX3R4X2luZGV4KCZ0eFJpbmctPmxhc3RXcml0ZSwgMSk7CisKKwkJCWxlbiA9IGZyYWctPnNpemU7CisJCQlmcmFnX2FkZHIgPSAodm9pZCAqKSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKworCQkJCQkJZnJhZy0+cGFnZV9vZmZzZXQ7CisJCQlza2JfZG1hID0gcGNpX21hcF9zaW5nbGUodHAtPnR4X3BkZXYsIGZyYWdfYWRkciwgbGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQl0eGQtPmZsYWdzID0gVFlQSE9PTl9GUkFHX0RFU0MgfCBUWVBIT09OX0RFU0NfVkFMSUQ7CisJCQl0eGQtPmxlbiA9IGNwdV90b19sZTE2KGxlbik7CisJCQl0eGQtPmFkZHIgPSBjcHVfdG9fbGUzMihza2JfZG1hKTsKKwkJCXR4ZC0+YWRkckhpID0gMDsKKwkJCWZpcnN0X3R4ZC0+bnVtRGVzYysrOworCQl9CisJfQorCisJLyogS2ljayB0aGUgM1hQCisJICovCisJd21iKCk7CisJaW93cml0ZTMyKHR4UmluZy0+bGFzdFdyaXRlLCB0cC0+dHhfaW9hZGRyICsgdHhSaW5nLT53cml0ZVJlZ2lzdGVyKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSByb29tIHRvIHB1dCB0aGUgd29yc3QgY2FzZSBwYWNrZXQgb24gdGhlCisJICogcXVldWUsIHRoZW4gd2UgbXVzdCBzdG9wIHRoZSBxdWV1ZS4gV2UgbmVlZCAyIGV4dHJhCisJICogZGVzY3JpcHRvcnMgLS0gb25lIHRvIHByZXZlbnQgcmluZyB3cmFwLCBhbmQgb25lIGZvciB0aGUKKwkgKiBUeCBoZWFkZXIuCisJICovCisJbnVtRGVzYyA9IE1BWF9TS0JfRlJBR1MgKyBUU09fTlVNX0RFU0NSSVBUT1JTICsgMTsKKworCWlmKHR5cGhvb25fbnVtX2ZyZWVfdHgodHhSaW5nKSA8IChudW1EZXNjICsgMikpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCS8qIEEgVHggY29tcGxldGUgSVJRIGNvdWxkIGhhdmUgZ290dGVuIGluYmV0d2VlbiwgbWFraW5nCisJCSAqIHRoZSByaW5nIGZyZWUgYWdhaW4uIE9ubHkgbmVlZCB0byByZWNoZWNrIGhlcmUsIHNpbmNlCisJCSAqIFR4IGlzIHNlcmlhbGl6ZWQuCisJCSAqLworCQlpZih0eXBob29uX251bV9mcmVlX3R4KHR4UmluZykgPj0gKG51bURlc2MgKyAyKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJdTMyIG1jX2ZpbHRlclsyXTsKKwl1MTYgZmlsdGVyOworCisJZmlsdGVyID0gVFlQSE9PTl9SWF9GSUxURVJfRElSRUNURUQgfCBUWVBIT09OX1JYX0ZJTFRFUl9CUk9BRENBU1Q7CisJaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlmaWx0ZXIgfD0gVFlQSE9PTl9SWF9GSUxURVJfUFJPTUlTQ09VUzsKKwl9IGVsc2UgaWYoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KSB8fAorCQkgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlmaWx0ZXIgfD0gVFlQSE9PTl9SWF9GSUxURVJfQUxMX01DQVNUOworCX0gZWxzZSBpZihkZXYtPm1jX2NvdW50KSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlpbnQgaTsKKworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvcihpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJaW50IGJpdCA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgJiAweDNmOworCQkJbWNfZmlsdGVyW2JpdCA+PiA1XSB8PSAxIDw8IChiaXQgJiAweDFmKTsKKwkJfQorCisJCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLAorCQkJCQkgVFlQSE9PTl9DTURfU0VUX01VTFRJQ0FTVF9IQVNIKTsKKwkJeHBfY21kLnBhcm0xID0gVFlQSE9PTl9NQ0FTVF9IQVNIX1NFVDsKKwkJeHBfY21kLnBhcm0yID0gY3B1X3RvX2xlMzIobWNfZmlsdGVyWzBdKTsKKwkJeHBfY21kLnBhcm0zID0gY3B1X3RvX2xlMzIobWNfZmlsdGVyWzFdKTsKKwkJdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKworCQlmaWx0ZXIgfD0gVFlQSE9PTl9SWF9GSUxURVJfTUNBU1RfSEFTSDsKKwl9CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfU0VUX1JYX0ZJTFRFUik7CisJeHBfY21kLnBhcm0xID0gZmlsdGVyOworCXR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fZG9fZ2V0X3N0YXRzKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHAtPnN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYXZlZCA9ICZ0cC0+c3RhdHNfc2F2ZWQ7CisJc3RydWN0IGNtZF9kZXNjIHhwX2NtZDsKKwlzdHJ1Y3QgcmVzcF9kZXNjIHhwX3Jlc3BbN107CisJc3RydWN0IHN0YXRzX3Jlc3AgKnMgPSAoc3RydWN0IHN0YXRzX3Jlc3AgKikgeHBfcmVzcDsKKwlpbnQgZXJyOworCisJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUkVBRF9TVEFUUyk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCA3LCB4cF9yZXNwKTsKKwlpZihlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogM0NvbSdzIExpbnV4IGRyaXZlciB1c2VzIHR4TXVsdGlwbGVDb2xsaXNpb25zIGFzIGl0J3MKKwkgKiBjb2xsaXNpb25zIHZhbHVlLCBidXQgdGhlcmUgaXMgc29tZSBvdGhlciBjb2xsaXNpb24gaW5mbyBhcyB3ZWxsLi4uCisJICoKKwkgKiBUaGUgZXh0cmEgc3RhdHVzIHJlcG9ydGVkIHdvdWxkIGJlIGEgZ29vZCBjYW5kaWRhdGUgZm9yCisJICogZXRodG9vbF9vcHMtPmdldF97c3RyaW5ncyxzdGF0c30oKQorCSAqLworCXN0YXRzLT50eF9wYWNrZXRzID0gbGUzMl90b19jcHUocy0+dHhQYWNrZXRzKTsKKwlzdGF0cy0+dHhfYnl0ZXMgPSBsZTMyX3RvX2NwdShzLT50eEJ5dGVzKTsKKwlzdGF0cy0+dHhfZXJyb3JzID0gbGUzMl90b19jcHUocy0+dHhDYXJyaWVyTG9zdCk7CisJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzID0gbGUzMl90b19jcHUocy0+dHhDYXJyaWVyTG9zdCk7CisJc3RhdHMtPmNvbGxpc2lvbnMgPSBsZTMyX3RvX2NwdShzLT50eE11bHRpcGxlQ29sbGlzaW9ucyk7CisJc3RhdHMtPnJ4X3BhY2tldHMgPSBsZTMyX3RvX2NwdShzLT5yeFBhY2tldHNHb29kKTsKKwlzdGF0cy0+cnhfYnl0ZXMgPSBsZTMyX3RvX2NwdShzLT5yeEJ5dGVzR29vZCk7CisJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gbGUzMl90b19jcHUocy0+cnhGaWZvT3ZlcnJ1bnMpOworCXN0YXRzLT5yeF9lcnJvcnMgPSBsZTMyX3RvX2NwdShzLT5yeEZpZm9PdmVycnVucykgKworCQkJbGUzMl90b19jcHUocy0+QmFkU1NEKSArIGxlMzJfdG9fY3B1KHMtPnJ4Q3JjRXJyb3JzKTsKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnJ4Q3JjRXJyb3JzKTsKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnJ4T3ZlcnNpemVkKTsKKwl0cC0+c3BlZWQgPSAocy0+bGlua1N0YXR1cyAmIFRZUEhPT05fTElOS18xMDBNQlBTKSA/CisJCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwl0cC0+ZHVwbGV4ID0gKHMtPmxpbmtTdGF0dXMgJiBUWVBIT09OX0xJTktfRlVMTF9EVVBMRVgpID8KKwkJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisKKwkvKiBhZGQgaW4gdGhlIHNhdmVkIHN0YXRpc3RpY3MKKwkgKi8KKwlzdGF0cy0+dHhfcGFja2V0cyArPSBzYXZlZC0+dHhfcGFja2V0czsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2F2ZWQtPnR4X2J5dGVzOworCXN0YXRzLT50eF9lcnJvcnMgKz0gc2F2ZWQtPnR4X2Vycm9yczsKKwlzdGF0cy0+Y29sbGlzaW9ucyArPSBzYXZlZC0+Y29sbGlzaW9uczsKKwlzdGF0cy0+cnhfcGFja2V0cyArPSBzYXZlZC0+cnhfcGFja2V0czsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2F2ZWQtPnJ4X2J5dGVzOworCXN0YXRzLT5yeF9maWZvX2Vycm9ycyArPSBzYXZlZC0+cnhfZmlmb19lcnJvcnM7CisJc3RhdHMtPnJ4X2Vycm9ycyArPSBzYXZlZC0+cnhfZXJyb3JzOworCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHNhdmVkLT5yeF9jcmNfZXJyb3JzOworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHNhdmVkLT5yeF9sZW5ndGhfZXJyb3JzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCit0eXBob29uX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2F2ZWQgPSAmdHAtPnN0YXRzX3NhdmVkOworCisJc21wX3JtYigpOworCWlmKHRwLT5jYXJkX3N0YXRlID09IFNsZWVwaW5nKQorCQlyZXR1cm4gc2F2ZWQ7CisKKwlpZih0eXBob29uX2RvX2dldF9zdGF0cyh0cCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGdldHRpbmcgc3RhdHNcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiBzYXZlZDsKKwl9CisKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKKworCWlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRwLT5wZGV2OworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJc3RydWN0IHJlc3BfZGVzYyB4cF9yZXNwWzNdOworCisJc21wX3JtYigpOworCWlmKHRwLT5jYXJkX3N0YXRlID09IFNsZWVwaW5nKSB7CisJCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiU2xlZXAgaW1hZ2UiKTsKKwl9IGVsc2UgeworCQlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SRUFEX1ZFUlNJT05TKTsKKwkJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAzLCB4cF9yZXNwKSA8IDApIHsKKwkJCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiVW5rbm93biBydW50aW1lIik7CisJCX0gZWxzZSB7CisJCQl1MzIgc2xlZXBfdmVyID0geHBfcmVzcFswXS5wYXJtMjsKKwkJCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIDMyLCAiJTAyeC4lMDN4LiUwM3giLAorCQkJCSBzbGVlcF92ZXIgPj4gMjQsIChzbGVlcF92ZXIgPj4gMTIpICYgMHhmZmYsIAorCQkJCSBzbGVlcF92ZXIgJiAweGZmZik7CisJCX0KKwl9CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGNpX2RldikpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQlTVVBQT1JURURfQXV0b25lZzsKKworCXN3aXRjaCAodHAtPnhjdnJfc2VsZWN0KSB7CisJY2FzZSBUWVBIT09OX1hDVlJfMTBIQUxGOgorCQljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CisJCWJyZWFrOworCWNhc2UgVFlQSE9PTl9YQ1ZSXzEwRlVMTDoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCQlicmVhazsKKwljYXNlIFRZUEhPT05fWENWUl8xMDBIQUxGOgorCQljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOworCQlicmVhazsKKwljYXNlIFRZUEhPT05fWENWUl8xMDBGVUxMOgorCQljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQlicmVhazsKKwljYXNlIFRZUEhPT05fWENWUl9BVVRPTkVHOgorCQljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJICAgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCWJyZWFrOworCX0KKworCWlmKHRwLT5jYXBhYmlsaXRpZXMgJiBUWVBIT09OX0ZJQkVSKSB7CisJCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0ZJQlJFOworCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCX0gZWxzZSB7CisJCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkgICAgCQkJU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJCVNVUFBPUlRFRF9UUDsKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1RQOworCQljbWQtPnBvcnQgPSBQT1JUX1RQOworCX0KKworCS8qIG5lZWQgdG8gZ2V0IHN0YXRzIHRvIG1ha2UgdGhlc2UgbGluayBzcGVlZC9kdXBsZXggdmFsaWQgKi8KKwl0eXBob29uX2RvX2dldF9zdGF0cyh0cCk7CisJY21kLT5zcGVlZCA9IHRwLT5zcGVlZDsKKwljbWQtPmR1cGxleCA9IHRwLT5kdXBsZXg7CisJY21kLT5waHlfYWRkcmVzcyA9IDA7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJaWYodHAtPnhjdnJfc2VsZWN0ID09IFRZUEhPT05fWENWUl9BVVRPTkVHKQorCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwllbHNlCisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwljbWQtPm1heHR4cGt0ID0gMTsKKwljbWQtPm1heHJ4cGt0ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IHhjdnI7CisJaW50IGVycjsKKworCWVyciA9IC1FSU5WQUw7CisJaWYoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXhjdnIgPSBUWVBIT09OX1hDVlJfQVVUT05FRzsKKwl9IGVsc2UgeworCQlpZihjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikgeworCQkJaWYoY21kLT5zcGVlZCA9PSBTUEVFRF8xMCkKKwkJCQl4Y3ZyID0gVFlQSE9PTl9YQ1ZSXzEwSEFMRjsKKwkJCWVsc2UgaWYoY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApCisJCQkJeGN2ciA9IFRZUEhPT05fWENWUl8xMDBIQUxGOworCQkJZWxzZQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCWlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTApCisJCQkJeGN2ciA9IFRZUEhPT05fWENWUl8xMEZVTEw7CisJCQllbHNlIGlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJCXhjdnIgPSBUWVBIT09OX1hDVlJfMTAwRlVMTDsKKwkJCWVsc2UKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlCisJCQlnb3RvIG91dDsKKwl9CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QpOworCXhwX2NtZC5wYXJtMSA9IGNwdV90b19sZTE2KHhjdnIpOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwl0cC0+eGN2cl9zZWxlY3QgPSB4Y3ZyOworCWlmKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl0cC0+c3BlZWQgPSAweGZmOwkvKiBpbnZhbGlkICovCisJCXRwLT5kdXBsZXggPSAweGZmOwkvKiBpbnZhbGlkICovCisJfSBlbHNlIHsKKwkJdHAtPnNwZWVkID0gY21kLT5zcGVlZDsKKwkJdHAtPmR1cGxleCA9IGNtZC0+ZHVwbGV4OworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQzsKKwl3b2wtPndvbG9wdHMgPSAwOworCWlmKHRwLT53b2xfZXZlbnRzICYgVFlQSE9PTl9XQUtFX0xJTktfRVZFTlQpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwlpZih0cC0+d29sX2V2ZW50cyAmIFRZUEhPT05fV0FLRV9NQUdJQ19QS1QpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCW1lbXNldCgmd29sLT5zb3Bhc3MsIDAsIHNpemVvZih3b2wtPnNvcGFzcykpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZih3b2wtPndvbG9wdHMgJiB+KFdBS0VfUEhZIHwgV0FLRV9NQUdJQykpCisJCXJldHVybiAtRUlOVkFMOworCisJdHAtPndvbF9ldmVudHMgPSAwOworCWlmKHdvbC0+d29sb3B0cyAmIFdBS0VfUEhZKQorCQl0cC0+d29sX2V2ZW50cyB8PSBUWVBIT09OX1dBS0VfTElOS19FVkVOVDsKKwlpZih3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQl0cC0+d29sX2V2ZW50cyB8PSBUWVBIT09OX1dBS0VfTUFHSUNfUEtUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIKK3R5cGhvb25fZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBGb3Igbm93LCB3ZSBkb24ndCBhbGxvdyB0dXJuaW5nIG9mZiBSWCBjaGVja3N1bXMuCisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKK3sKKwllcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBSWEVOVF9FTlRSSUVTOworCWVyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwllcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmcgPSAwOworCWVyaW5nLT50eF9tYXhfcGVuZGluZyA9IFRYTE9fRU5UUklFUyAtIDE7CisKKwllcmluZy0+cnhfcGVuZGluZyA9IFJYRU5UX0VOVFJJRVM7CisJZXJpbmctPnJ4X21pbmlfcGVuZGluZyA9IDA7CisJZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworCWVyaW5nLT50eF9wZW5kaW5nID0gVFhMT19FTlRSSUVTIC0gMTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0eXBob29uX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gdHlwaG9vbl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB0eXBob29uX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gdHlwaG9vbl9nZXRfZHJ2aW5mbywKKwkuZ2V0X3dvbAkJPSB0eXBob29uX2dldF93b2wsCisJLnNldF93b2wJCT0gdHlwaG9vbl9zZXRfd29sLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcnhfY3N1bQkJPSB0eXBob29uX2dldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9jc3VtLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbwkJPSBldGh0b29sX29wX3NldF90c28sCisJLmdldF9yaW5ncGFyYW0JCT0gdHlwaG9vbl9nZXRfcmluZ3BhcmFtLAorfTsKKworc3RhdGljIGludAordHlwaG9vbl93YWl0X2ludGVycnVwdCh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCWZvcihpID0gMDsgaSA8IFRZUEhPT05fV0FJVF9USU1FT1VUOyBpKyspIHsKKwkJaWYoaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpICYKKwkJICAgVFlQSE9PTl9JTlRSX0JPT1RDTUQpCisJCQlnb3RvIG91dDsKKwkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwl9CisKKwllcnIgPSAtRVRJTUVET1VUOworCitvdXQ6CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9CT09UQ01ELCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBzaGFyZWRfb2Zmc2V0KHgpCW9mZnNldG9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCwgeCkKKworc3RhdGljIHZvaWQKK3R5cGhvb25faW5pdF9pbnRlcmZhY2Uoc3RydWN0IHR5cGhvb24gKnRwKQoreworCXN0cnVjdCB0eXBob29uX2ludGVyZmFjZSAqaWZhY2UgPSAmdHAtPnNoYXJlZC0+aWZhY2U7CisJZG1hX2FkZHJfdCBzaGFyZWRfZG1hOworCisJbWVtc2V0KHRwLT5zaGFyZWQsIDAsIHNpemVvZihzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQpKTsKKworCS8qIFRoZSAqSGkgbWVtYmVycyBvZiBpZmFjZSBhcmUgYWxsIGluaXQnZCB0byB6ZXJvIGJ5IHRoZSBtZW1zZXQoKS4KKwkgKi8KKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KGluZGV4ZXMpOworCWlmYWNlLT5yaW5nSW5kZXggPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQodHhMbyk7CisJaWZhY2UtPnR4TG9BZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnR4TG9TaXplID0gY3B1X3RvX2xlMzIoVFhMT19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KHR4SGkpOworCWlmYWNlLT50eEhpQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT50eEhpU2l6ZSA9IGNwdV90b19sZTMyKFRYSElfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChyeEJ1ZmYpOworCWlmYWNlLT5yeEJ1ZmZBZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnJ4QnVmZlNpemUgPSBjcHVfdG9fbGUzMihSWEZSRUVfRU5UUklFUyAqCisJCQkJCXNpemVvZihzdHJ1Y3QgcnhfZnJlZSkpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChyeExvKTsKKwlpZmFjZS0+cnhMb0FkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+cnhMb1NpemUgPSBjcHVfdG9fbGUzMihSWF9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KHJ4SGkpOworCWlmYWNlLT5yeEhpQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT5yeEhpU2l6ZSA9IGNwdV90b19sZTMyKFJYX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQoY21kKTsKKwlpZmFjZS0+Y21kQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT5jbWRTaXplID0gY3B1X3RvX2xlMzIoQ09NTUFORF9SSU5HX1NJWkUpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChyZXNwKTsKKwlpZmFjZS0+cmVzcEFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+cmVzcFNpemUgPSBjcHVfdG9fbGUzMihSRVNQT05TRV9SSU5HX1NJWkUpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldCh6ZXJvV29yZCk7CisJaWZhY2UtPnplcm9BZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisKKwl0cC0+aW5kZXhlcyA9ICZ0cC0+c2hhcmVkLT5pbmRleGVzOworCXRwLT50eExvUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT50eExvOworCXRwLT50eEhpUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT50eEhpOworCXRwLT5yeExvUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yeExvOworCXRwLT5yeEhpUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yeEhpOworCXRwLT5yeEJ1ZmZSaW5nLnJpbmdCYXNlID0gKHU4ICopIHRwLT5zaGFyZWQtPnJ4QnVmZjsKKwl0cC0+Y21kUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5jbWQ7CisJdHAtPnJlc3BSaW5nLnJpbmdCYXNlID0gKHU4ICopIHRwLT5zaGFyZWQtPnJlc3A7CisKKwl0cC0+dHhMb1Jpbmcud3JpdGVSZWdpc3RlciA9IFRZUEhPT05fUkVHX1RYX0xPX1JFQURZOworCXRwLT50eEhpUmluZy53cml0ZVJlZ2lzdGVyID0gVFlQSE9PTl9SRUdfVFhfSElfUkVBRFk7CisKKwl0cC0+dHhsb19kbWFfYWRkciA9IGlmYWNlLT50eExvQWRkcjsKKwl0cC0+Y2FyZF9zdGF0ZSA9IFNsZWVwaW5nOworCXNtcF93bWIoKTsKKworCXRwLT5vZmZsb2FkID0gVFlQSE9PTl9PRkZMT0FEX0lQX0NIS1NVTSB8IFRZUEhPT05fT0ZGTE9BRF9UQ1BfQ0hLU1VNOworCXRwLT5vZmZsb2FkIHw9IFRZUEhPT05fT0ZGTE9BRF9VRFBfQ0hLU1VNIHwgVFNPX09GRkxPQURfT047CisKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmNvbW1hbmRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRwLT5zdGF0ZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25faW5pdF9yaW5ncyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJbWVtc2V0KHRwLT5pbmRleGVzLCAwLCBzaXplb2Yoc3RydWN0IHR5cGhvb25faW5kZXhlcykpOworCisJdHAtPnR4TG9SaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPnR4SGlSaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPnJ4TG9SaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPnJ4SGlSaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPnJ4QnVmZlJpbmcubGFzdFdyaXRlID0gMDsKKwl0cC0+Y21kUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5jbWRSaW5nLmxhc3RXcml0ZSA9IDA7CisKKwl0cC0+dHhMb1JpbmcubGFzdFJlYWQgPSAwOworCXRwLT50eEhpUmluZy5sYXN0UmVhZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHR5cGhvb24gKnRwKQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wZGV2OworCXN0cnVjdCB0eXBob29uX2ZpbGVfaGVhZGVyICpmSGRyOworCXN0cnVjdCB0eXBob29uX3NlY3Rpb25faGVhZGVyICpzSGRyOworCXU4ICppbWFnZV9kYXRhOworCXZvaWQgKmRwYWdlOworCWRtYV9hZGRyX3QgZHBhZ2VfZG1hOworCXVuc2lnbmVkIGludCBjc3VtOworCXUzMiBpcnFFbmFibGVkOworCXUzMiBpcnFNYXNrZWQ7CisJdTMyIG51bVNlY3Rpb25zOworCXUzMiBzZWN0aW9uX2xlbjsKKwl1MzIgbGVuOworCXUzMiBsb2FkX2FkZHI7CisJdTMyIGhtYWM7CisJaW50IGk7CisJaW50IGVycjsKKworCWVyciA9IC1FSU5WQUw7CisJZkhkciA9IChzdHJ1Y3QgdHlwaG9vbl9maWxlX2hlYWRlciAqKSB0eXBob29uX2Zpcm13YXJlX2ltYWdlOworCWltYWdlX2RhdGEgPSAodTggKikgZkhkcjsKKworCWlmKG1lbWNtcChmSGRyLT50YWcsICJUWVBIT09OIiwgOCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBmaXJtd2FyZSBpbWFnZSFcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIENhbm5vdCBqdXN0IG1hcCB0aGUgZmlybXdhcmUgaW1hZ2UgdXNpbmcgcGNpX21hcF9zaW5nbGUoKSBhcworCSAqIHRoZSBmaXJtd2FyZSBpcyBwYXJ0IG9mIHRoZSBrZXJuZWwvbW9kdWxlIGltYWdlLCBzbyB3ZSBhbGxvY2F0ZQorCSAqIHNvbWUgY29uc2lzdGVudCBtZW1vcnkgdG8gY29weSB0aGUgc2VjdGlvbnMgaW50bywgYXMgaXQgaXMgc2ltcGxlciwKKwkgKiBhbmQgc2hvcnQtbGl2ZWQuIElmIHdlIGV2ZXIgc3BsaXQgb3V0IGFuZCByZXF1aXJlIGEgdXNlcmxhbmQKKwkgKiBmaXJtd2FyZSBsb2FkZXIsIHRoZW4gd2UgY2FuIHJldmlzaXQgdGhpcy4KKwkgKi8KKwllcnIgPSAtRU5PTUVNOworCWRwYWdlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUEFHRV9TSVpFLCAmZHBhZ2VfZG1hKTsKKwlpZighZHBhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gRE1BIG1lbSBmb3IgZmlybXdhcmVcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlycUVuYWJsZWQgPSBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX0VOQUJMRSk7CisJaW93cml0ZTMyKGlycUVuYWJsZWQgfCBUWVBIT09OX0lOVFJfQk9PVENNRCwKKwkgICAgICAgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCWlycU1hc2tlZCA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKGlycU1hc2tlZCB8IFRZUEhPT05fSU5UUl9CT09UQ01ELAorCSAgICAgICBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCisJZXJyID0gLUVUSU1FRE9VVDsKKwlpZih0eXBob29uX3dhaXRfc3RhdHVzKGlvYWRkciwgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhcmQgcmVhZHkgdGltZW91dFxuIiwgdHAtPm5hbWUpOworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKworCW51bVNlY3Rpb25zID0gbGUzMl90b19jcHUoZkhkci0+bnVtU2VjdGlvbnMpOworCWxvYWRfYWRkciA9IGxlMzJfdG9fY3B1KGZIZHItPnN0YXJ0QWRkcik7CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0JPT1RDTUQsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpb3dyaXRlMzIobG9hZF9hZGRyLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9CT09UX0FERFIpOworCWhtYWMgPSBsZTMyX3RvX2NwdShmSGRyLT5obWFjRGlnZXN0WzBdKTsKKwlpb3dyaXRlMzIoaG1hYywgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18wKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFsxXSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfMSk7CisJaG1hYyA9IGxlMzJfdG9fY3B1KGZIZHItPmhtYWNEaWdlc3RbMl0pOworCWlvd3JpdGUzMihobWFjLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzIpOworCWhtYWMgPSBsZTMyX3RvX2NwdShmSGRyLT5obWFjRGlnZXN0WzNdKTsKKwlpb3dyaXRlMzIoaG1hYywgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18zKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFs0XSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfNCk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1JVTlRJTUVfSU1BR0UsIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJaW1hZ2VfZGF0YSArPSBzaXplb2Yoc3RydWN0IHR5cGhvb25fZmlsZV9oZWFkZXIpOworCisJLyogVGhlIGlvcmVhZDMyKCkgaW4gdHlwaG9vbl93YWl0X2ludGVycnVwdCgpIHdpbGwgZm9yY2UgdGhlCisJICogbGFzdCB3cml0ZSB0byB0aGUgY29tbWFuZCByZWdpc3RlciB0byBwb3N0LCBzbworCSAqIHdlIGRvbid0IG5lZWQgYSB0eXBob29uX3Bvc3RfcGNpX3dyaXRlcygpIGFmdGVyIGl0LgorCSAqLworCWZvcihpID0gMDsgaSA8IG51bVNlY3Rpb25zOyBpKyspIHsKKwkJc0hkciA9IChzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlciAqKSBpbWFnZV9kYXRhOworCQlpbWFnZV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlcik7CisJCWxvYWRfYWRkciA9IGxlMzJfdG9fY3B1KHNIZHItPnN0YXJ0QWRkcik7CisJCXNlY3Rpb25fbGVuID0gbGUzMl90b19jcHUoc0hkci0+bGVuKTsKKworCQl3aGlsZShzZWN0aW9uX2xlbikgeworCQkJbGVuID0gbWluX3QodTMyLCBzZWN0aW9uX2xlbiwgUEFHRV9TSVpFKTsKKworCQkJaWYodHlwaG9vbl93YWl0X2ludGVycnVwdChpb2FkZHIpIDwgMCB8fAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSAhPQorCQkJICAgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfU0VHTUVOVCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNlZ21lbnQgcmVhZHkgdGltZW91dFxuIiwKKwkJCQkgICAgICAgdHAtPm5hbWUpOworCQkJCWdvdG8gZXJyX291dF9pcnE7CisJCQl9CisKKwkJCS8qIERvIGFuIHBzZXVkbyBJUHY0IGNoZWNrc3VtIG9uIHRoZSBkYXRhIC0tIGZpcnN0CisJCQkgKiBuZWVkIHRvIGNvbnZlcnQgZWFjaCB1MTYgdG8gY3B1IG9yZGVyIGJlZm9yZQorCQkJICogc3VtbWluZy4gRm9ydHVuYXRlbHksIGR1ZSB0byB0aGUgcHJvcGVydGllcyBvZgorCQkJICogdGhlIGNoZWNrc3VtLCB3ZSBjYW4gZG8gdGhpcyBvbmNlLCBhdCB0aGUgZW5kLgorCQkJICovCisJCQljc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhpbWFnZV9kYXRhLCBkcGFnZSwKKwkJCQkJCQkgbGVuLCAwKTsKKwkJCWNzdW0gPSBjc3VtX2ZvbGQoY3N1bSk7CisJCQljc3VtID0gbGUxNl90b19jcHUoY3N1bSk7CisKKwkJCWlvd3JpdGUzMihsZW4sIGlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfTEVOR1RIKTsKKwkJCWlvd3JpdGUzMihjc3VtLCBpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0NIRUNLU1VNKTsKKwkJCWlvd3JpdGUzMihsb2FkX2FkZHIsCisJCQkJCWlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfREVTVF9BRERSKTsKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0RBVEFfSEkpOworCQkJaW93cml0ZTMyKGRwYWdlX2RtYSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9EQVRBX0xPKTsKKwkJCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKGlvYWRkcik7CisJCQlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1NFR19BVkFJTEFCTEUsCisJCQkgICAgICAgaW9hZGRyICsgVFlQSE9PTl9SRUdfQ09NTUFORCk7CisKKwkJCWltYWdlX2RhdGEgKz0gbGVuOworCQkJbG9hZF9hZGRyICs9IGxlbjsKKwkJCXNlY3Rpb25fbGVuIC09IGxlbjsKKwkJfQorCX0KKworCWlmKHR5cGhvb25fd2FpdF9pbnRlcnJ1cHQoaW9hZGRyKSA8IDAgfHwKKwkgICBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19TVEFUVVMpICE9CisJICAgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfU0VHTUVOVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmaW5hbCBzZWdtZW50IHJlYWR5IHRpbWVvdXRcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX0ROTERfQ09NUExFVEUsIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0JPT1QpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib290IHJlYWR5IHRpbWVvdXQsIHN0YXR1cyAweCUweFxuIiwKKwkJICAgICAgIHRwLT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19TVEFUVVMpKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwllcnIgPSAwOworCitlcnJfb3V0X2lycToKKwlpb3dyaXRlMzIoaXJxTWFza2VkLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCWlvd3JpdGUzMihpcnFFbmFibGVkLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX0VOQUJMRSk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgZHBhZ2UsIGRwYWdlX2RtYSk7CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordHlwaG9vbl9ib290XzNYUChzdHJ1Y3QgdHlwaG9vbiAqdHAsIHUzMiBpbml0aWFsX3N0YXR1cykKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5pb2FkZHI7CisKKwlpZih0eXBob29uX3dhaXRfc3RhdHVzKGlvYWRkciwgaW5pdGlhbF9zdGF0dXMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib290IHJlYWR5IHRpbWVvdXRcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBvdXRfdGltZW91dDsKKwl9CisKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9SRUNPUkRfQUREUl9ISSk7CisJaW93cml0ZTMyKHRwLT5zaGFyZWRfZG1hLCBpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX1JFQ09SRF9BRERSX0xPKTsKKwl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCWlvd3JpdGUzMihUWVBIT09OX0JPT1RDTURfUkVHX0JPT1RfUkVDT1JELAorCQkJCWlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1JVTk5JTkcpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib290IGZpbmlzaCB0aW1lb3V0IChzdGF0dXMgMHgleClcbiIsCisJCSAgICAgICB0cC0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSk7CisJCWdvdG8gb3V0X3RpbWVvdXQ7CisJfQorCisJLyogQ2xlYXIgdGhlIFRyYW5zbWl0IGFuZCBDb21tYW5kIHJlYWR5IHJlZ2lzdGVycworCSAqLworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19UWF9ISV9SRUFEWSk7CisJaW93cml0ZTMyKDAsIGlvYWRkciArIFRZUEhPT05fUkVHX0NNRF9SRUFEWSk7CisJaW93cml0ZTMyKDAsIGlvYWRkciArIFRZUEhPT05fUkVHX1RYX0xPX1JFQURZKTsKKwl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCWlvd3JpdGUzMihUWVBIT09OX0JPT1RDTURfQk9PVCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQ09NTUFORCk7CisKKwlyZXR1cm4gMDsKKworb3V0X3RpbWVvdXQ6CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyB1MzIKK3R5cGhvb25fY2xlYW5fdHgoc3RydWN0IHR5cGhvb24gKnRwLCBzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqdHhSaW5nLAorCQkJdm9sYXRpbGUgdTMyICogaW5kZXgpCit7CisJdTMyIGxhc3RSZWFkID0gdHhSaW5nLT5sYXN0UmVhZDsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHg7CisJZG1hX2FkZHJfdCBza2JfZG1hOworCWludCBkbWFfbGVuOworCWludCB0eXBlOworCisJd2hpbGUobGFzdFJlYWQgIT0gbGUzMl90b19jcHUoKmluZGV4KSkgeworCQl0eCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArIGxhc3RSZWFkKTsKKwkJdHlwZSA9IHR4LT5mbGFncyAmIFRZUEhPT05fVFlQRV9NQVNLOworCisJCWlmKHR5cGUgPT0gVFlQSE9PTl9UWF9ERVNDKSB7CisJCQkvKiBUaGlzIHR4X2Rlc2MgZGVzY3JpYmVzIGEgcGFja2V0LgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIHB0ciA9IHR4LT5hZGRyIHwgKCh1NjQpdHgtPmFkZHJIaSA8PCAzMik7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIHB0cjsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0gZWxzZSBpZih0eXBlID09IFRZUEhPT05fRlJBR19ERVNDKSB7CisJCQkvKiBUaGlzIHR4X2Rlc2MgZGVzY3JpYmVzIGEgbWVtb3J5IG1hcHBpbmcuIEZyZWUgaXQuCisJCQkgKi8KKwkJCXNrYl9kbWEgPSAoZG1hX2FkZHJfdCkgbGUzMl90b19jcHUodHgtPmFkZHIpOworCQkJZG1hX2xlbiA9IGxlMTZfdG9fY3B1KHR4LT5sZW4pOworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiX2RtYSwgZG1hX2xlbiwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKworCQl0eC0+ZmxhZ3MgPSAwOworCQl0eXBob29uX2luY190eF9pbmRleCgmbGFzdFJlYWQsIDEpOworCX0KKworCXJldHVybiBsYXN0UmVhZDsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25fdHhfY29tcGxldGUoc3RydWN0IHR5cGhvb24gKnRwLCBzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqdHhSaW5nLAorCQkJdm9sYXRpbGUgdTMyICogaW5kZXgpCit7CisJdTMyIGxhc3RSZWFkOworCWludCBudW1EZXNjID0gTUFYX1NLQl9GUkFHUyArIDE7CisKKwkvKiBUaGlzIHdpbGwgbmVlZCBjaGFuZ2luZyBpZiB3ZSBzdGFydCB0byB1c2UgdGhlIEhpIFR4IHJpbmcuICovCisJbGFzdFJlYWQgPSB0eXBob29uX2NsZWFuX3R4KHRwLCB0eFJpbmcsIGluZGV4KTsKKwlpZihuZXRpZl9xdWV1ZV9zdG9wcGVkKHRwLT5kZXYpICYmIHR5cGhvb25fbnVtX2ZyZWUodHhSaW5nLT5sYXN0V3JpdGUsCisJCQkJbGFzdFJlYWQsIFRYTE9fRU5UUklFUykgPiAobnVtRGVzYyArIDIpKQorCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOworCisJdHhSaW5nLT5sYXN0UmVhZCA9IGxhc3RSZWFkOworCXNtcF93bWIoKTsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25fcmVjeWNsZV9yeF9za2Ioc3RydWN0IHR5cGhvb24gKnRwLCB1MzIgaWR4KQoreworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlzdHJ1Y3QgcnhidWZmX2VudCAqcnhiID0gJnRwLT5yeGJ1ZmZlcnNbaWR4XTsKKwlzdHJ1Y3QgYmFzaWNfcmluZyAqcmluZyA9ICZ0cC0+cnhCdWZmUmluZzsKKwlzdHJ1Y3QgcnhfZnJlZSAqcjsKKworCWlmKChyaW5nLT5sYXN0V3JpdGUgKyBzaXplb2YoKnIpKSAlIChSWEZSRUVfRU5UUklFUyAqIHNpemVvZigqcikpID09CisJCQkJaW5kZXhlcy0+cnhCdWZmQ2xlYXJlZCkgeworCQkvKiBubyByb29tIGluIHJpbmcsIGp1c3QgZHJvcCB0aGUgc2tiCisJCSAqLworCQlkZXZfa2ZyZWVfc2tiX2FueShyeGItPnNrYik7CisJCXJ4Yi0+c2tiID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCXIgPSAoc3RydWN0IHJ4X2ZyZWUgKikgKHJpbmctPnJpbmdCYXNlICsgcmluZy0+bGFzdFdyaXRlKTsKKwl0eXBob29uX2luY19yeGZyZWVfaW5kZXgoJnJpbmctPmxhc3RXcml0ZSwgMSk7CisJci0+dmlydEFkZHIgPSBpZHg7CisJci0+cGh5c0FkZHIgPSBjcHVfdG9fbGUzMihyeGItPmRtYV9hZGRyKTsKKworCS8qIFRlbGwgdGhlIGNhcmQgYWJvdXQgaXQgKi8KKwl3bWIoKTsKKwlpbmRleGVzLT5yeEJ1ZmZSZWFkeSA9IGNwdV90b19sZTMyKHJpbmctPmxhc3RXcml0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fYWxsb2Nfcnhfc2tiKHN0cnVjdCB0eXBob29uICp0cCwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YiA9ICZ0cC0+cnhidWZmZXJzW2lkeF07CisJc3RydWN0IGJhc2ljX3JpbmcgKnJpbmcgPSAmdHAtPnJ4QnVmZlJpbmc7CisJc3RydWN0IHJ4X2ZyZWUgKnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJcnhiLT5za2IgPSBOVUxMOworCisJaWYoKHJpbmctPmxhc3RXcml0ZSArIHNpemVvZigqcikpICUgKFJYRlJFRV9FTlRSSUVTICogc2l6ZW9mKCpyKSkgPT0KKwkJCQlpbmRleGVzLT5yeEJ1ZmZDbGVhcmVkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJaWYoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKyNpZiAwCisJLyogUGxlYXNlLCAzY29tLCBmaXggdGhlIGZpcm13YXJlIHRvIGFsbG93IERNQSB0byBhIHVuYWxpZ25lZAorCSAqIGFkZHJlc3MhIFByZXR0eSBwbGVhc2U/CisJICovCisJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKyNlbmRpZgorCisJc2tiLT5kZXYgPSB0cC0+ZGV2OworCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJCQkgIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkvKiBTaW5jZSBubyBjYXJkIGRvZXMgNjQgYml0IERBQywgdGhlIGhpZ2ggYml0cyB3aWxsIG5ldmVyCisJICogY2hhbmdlIGZyb20gemVyby4KKwkgKi8KKwlyID0gKHN0cnVjdCByeF9mcmVlICopIChyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSk7CisJdHlwaG9vbl9pbmNfcnhmcmVlX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIDEpOworCXItPnZpcnRBZGRyID0gaWR4OworCXItPnBoeXNBZGRyID0gY3B1X3RvX2xlMzIoZG1hX2FkZHIpOworCXJ4Yi0+c2tiID0gc2tiOworCXJ4Yi0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKKworCS8qIFRlbGwgdGhlIGNhcmQgYWJvdXQgaXQgKi8KKwl3bWIoKTsKKwlpbmRleGVzLT5yeEJ1ZmZSZWFkeSA9IGNwdV90b19sZTMyKHJpbmctPmxhc3RXcml0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fcngoc3RydWN0IHR5cGhvb24gKnRwLCBzdHJ1Y3QgYmFzaWNfcmluZyAqcnhSaW5nLCB2b2xhdGlsZSB1MzIgKiByZWFkeSwKKwkgICB2b2xhdGlsZSB1MzIgKiBjbGVhcmVkLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCByeF9kZXNjICpyeDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV3X3NrYjsKKwlzdHJ1Y3QgcnhidWZmX2VudCAqcnhiOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTMyIGxvY2FsX3JlYWR5OworCXUzMiByeGFkZHI7CisJaW50IHBrdF9sZW47CisJdTMyIGlkeDsKKwl1MzIgY3N1bV9iaXRzOworCWludCByZWNlaXZlZDsKKworCXJlY2VpdmVkID0gMDsKKwlsb2NhbF9yZWFkeSA9IGxlMzJfdG9fY3B1KCpyZWFkeSk7CisJcnhhZGRyID0gbGUzMl90b19jcHUoKmNsZWFyZWQpOworCXdoaWxlKHJ4YWRkciAhPSBsb2NhbF9yZWFkeSAmJiBidWRnZXQgPiAwKSB7CisJCXJ4ID0gKHN0cnVjdCByeF9kZXNjICopIChyeFJpbmctPnJpbmdCYXNlICsgcnhhZGRyKTsKKwkJaWR4ID0gcngtPmFkZHI7CisJCXJ4YiA9ICZ0cC0+cnhidWZmZXJzW2lkeF07CisJCXNrYiA9IHJ4Yi0+c2tiOworCQlkbWFfYWRkciA9IHJ4Yi0+ZG1hX2FkZHI7CisKKwkJdHlwaG9vbl9pbmNfcnhfaW5kZXgoJnJ4YWRkciwgMSk7CisKKwkJaWYocngtPmZsYWdzICYgVFlQSE9PTl9SWF9FUlJPUikgeworCQkJdHlwaG9vbl9yZWN5Y2xlX3J4X3NrYih0cCwgaWR4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGt0X2xlbiA9IGxlMTZfdG9fY3B1KHJ4LT5mcmFtZUxlbik7CisKKwkJaWYocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgorCQkgICAobmV3X3NrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQluZXdfc2tiLT5kZXYgPSB0cC0+ZGV2OworCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLAorCQkJCQkJICAgIFBLVF9CVUZfU1osCisJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0obmV3X3NrYiwgc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsCisJCQkJCQkgICAgICAgUEtUX0JVRl9TWiwKKwkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3B1dChuZXdfc2tiLCBwa3RfbGVuKTsKKwkJCXR5cGhvb25fcmVjeWNsZV9yeF9za2IodHAsIGlkeCk7CisJCX0gZWxzZSB7CisJCQluZXdfc2tiID0gc2tiOworCQkJc2tiX3B1dChuZXdfc2tiLCBwa3RfbGVuKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIGRtYV9hZGRyLCBQS1RfQlVGX1NaLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJdHlwaG9vbl9hbGxvY19yeF9za2IodHAsIGlkeCk7CisJCX0KKwkJbmV3X3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfc2tiLCB0cC0+ZGV2KTsKKwkJY3N1bV9iaXRzID0gcngtPnJ4U3RhdHVzICYgKFRZUEhPT05fUlhfSVBfQ0hLX0dPT0QgfAorCQkJVFlQSE9PTl9SWF9VRFBfQ0hLX0dPT0QgfCBUWVBIT09OX1JYX1RDUF9DSEtfR09PRCk7CisJCWlmKGNzdW1fYml0cyA9PQorCQkgICAoVFlQSE9PTl9SWF9JUF9DSEtfR09PRCB8IFRZUEhPT05fUlhfVENQX0NIS19HT09EKQorCQkgICB8fCBjc3VtX2JpdHMgPT0KKwkJICAgKFRZUEhPT05fUlhfSVBfQ0hLX0dPT0QgfCBUWVBIT09OX1JYX1VEUF9DSEtfR09PRCkpIHsKKwkJCW5ld19za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQl9IGVsc2UKKwkJCW5ld19za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwkJc3Bpbl9sb2NrKCZ0cC0+c3RhdGVfbG9jayk7CisJCWlmKHRwLT52bGdycCAhPSBOVUxMICYmIHJ4LT5yeFN0YXR1cyAmIFRZUEhPT05fUlhfVkxBTikKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihuZXdfc2tiLCB0cC0+dmxncnAsCisJCQkJCQkgbnRvaGwocngtPnZsYW5UYWcpICYgMHhmZmZmKTsKKwkJZWxzZQorCQkJbmV0aWZfcmVjZWl2ZV9za2IobmV3X3NrYik7CisJCXNwaW5fdW5sb2NrKCZ0cC0+c3RhdGVfbG9jayk7CisKKwkJdHAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCXJlY2VpdmVkKys7CisJCWJ1ZGdldC0tOworCX0KKwkqY2xlYXJlZCA9IGNwdV90b19sZTMyKHJ4YWRkcik7CisKKwlyZXR1cm4gcmVjZWl2ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2ZpbGxfZnJlZV9yaW5nKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwl1MzIgaTsKKworCWZvcihpID0gMDsgaSA8IFJYRU5UX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3QgcnhidWZmX2VudCAqcnhiID0gJnRwLT5yeGJ1ZmZlcnNbaV07CisJCWlmKHJ4Yi0+c2tiKQorCQkJY29udGludWU7CisJCWlmKHR5cGhvb25fYWxsb2Nfcnhfc2tiKHRwLCBpKSA8IDApCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKnRvdGFsX2J1ZGdldCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlpbnQgb3JpZ19idWRnZXQgPSAqdG90YWxfYnVkZ2V0OworCWludCBidWRnZXQsIHdvcmtfZG9uZSwgZG9uZTsKKworCXJtYigpOworCWlmKCF0cC0+YXdhaXRpbmdfcmVzcCAmJiBpbmRleGVzLT5yZXNwUmVhZHkgIT0gaW5kZXhlcy0+cmVzcENsZWFyZWQpCisJCQl0eXBob29uX3Byb2Nlc3NfcmVzcG9uc2UodHAsIDAsIE5VTEwpOworCisJaWYobGUzMl90b19jcHUoaW5kZXhlcy0+dHhMb0NsZWFyZWQpICE9IHRwLT50eExvUmluZy5sYXN0UmVhZCkKKwkJdHlwaG9vbl90eF9jb21wbGV0ZSh0cCwgJnRwLT50eExvUmluZywgJmluZGV4ZXMtPnR4TG9DbGVhcmVkKTsKKworCWlmKG9yaWdfYnVkZ2V0ID4gZGV2LT5xdW90YSkKKwkJb3JpZ19idWRnZXQgPSBkZXYtPnF1b3RhOworCisJYnVkZ2V0ID0gb3JpZ19idWRnZXQ7CisJd29ya19kb25lID0gMDsKKwlkb25lID0gMTsKKworCWlmKGluZGV4ZXMtPnJ4SGlDbGVhcmVkICE9IGluZGV4ZXMtPnJ4SGlSZWFkeSkgeworCQl3b3JrX2RvbmUgPSB0eXBob29uX3J4KHRwLCAmdHAtPnJ4SGlSaW5nLCAmaW5kZXhlcy0+cnhIaVJlYWR5LAorCQkJICAgCQkmaW5kZXhlcy0+cnhIaUNsZWFyZWQsIGJ1ZGdldCk7CisJCWJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJfQorCisJaWYoaW5kZXhlcy0+cnhMb0NsZWFyZWQgIT0gaW5kZXhlcy0+cnhMb1JlYWR5KSB7CisJCXdvcmtfZG9uZSArPSB0eXBob29uX3J4KHRwLCAmdHAtPnJ4TG9SaW5nLCAmaW5kZXhlcy0+cnhMb1JlYWR5LAorCQkJICAgCQkmaW5kZXhlcy0+cnhMb0NsZWFyZWQsIGJ1ZGdldCk7CisJfQorCisJaWYod29ya19kb25lKSB7CisJCSp0b3RhbF9idWRnZXQgLT0gd29ya19kb25lOworCQlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKworCQlpZih3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCisJCQlkb25lID0gMDsKKwl9CisKKwlpZihsZTMyX3RvX2NwdShpbmRleGVzLT5yeEJ1ZmZDbGVhcmVkKSA9PSB0cC0+cnhCdWZmUmluZy5sYXN0V3JpdGUpIHsKKwkJLyogcnhCdWZmIHJpbmcgaXMgZW1wdHksIHRyeSB0byBmaWxsIGl0LiAqLworCQl0eXBob29uX2ZpbGxfZnJlZV9yaW5nKHRwKTsKKwl9CisKKwlpZihkb25lKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfTk9ORSwKKwkJCQl0cC0+aW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwkJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXModHAtPmlvYWRkcik7CisJfQorCisJcmV0dXJuIChkb25lID8gMCA6IDEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3R5cGhvb25faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCXUzMiBpbnRyX3N0YXR1czsKKworCWludHJfc3RhdHVzID0gaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCWlmKCEoaW50cl9zdGF0dXMgJiBUWVBIT09OX0lOVFJfSE9TVF9JTlQpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpb3dyaXRlMzIoaW50cl9zdGF0dXMsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwkJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yLCBwb2xsIGFscmVhZHkgc2NoZWR1bGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2ZyZWVfcnhfcmluZ3Moc3RydWN0IHR5cGhvb24gKnRwKQoreworCXUzMiBpOworCisJZm9yKGkgPSAwOyBpIDwgUlhFTlRfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCByeGJ1ZmZfZW50ICpyeGIgPSAmdHAtPnJ4YnVmZmVyc1tpXTsKKwkJaWYocnhiLT5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHJ4Yi0+ZG1hX2FkZHIsIFBLVF9CVUZfU1osCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHJ4Yi0+c2tiKTsKKwkJCXJ4Yi0+c2tiID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludAordHlwaG9vbl9zbGVlcChzdHJ1Y3QgdHlwaG9vbiAqdHAsIHBjaV9wb3dlcl90IHN0YXRlLCB1MTYgZXZlbnRzKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBkZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGVycjsKKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX0VOQUJMRV9XQUtFX0VWRU5UUyk7CisJeHBfY21kLnBhcm0xID0gZXZlbnRzOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0eXBob29uX3NsZWVwKCk6IHdha2UgZXZlbnRzIGNtZCBlcnIgJWRcbiIsCisJCQkJdHAtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX0dPVE9fU0xFRVApOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0eXBob29uX3NsZWVwKCk6IHNsZWVwIGNtZCBlcnIgJWRcbiIsCisJCQkJdHAtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1NMRUVQSU5HKSA8IDApCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogU2luY2Ugd2UgY2Fubm90IG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgbGluayB3aGlsZSBzbGVlcGluZywKKwkgKiB0ZWxsIHRoZSB3b3JsZCBpdCB3ZW50IGF3YXkuCisJICovCisJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisKKwlwY2lfZW5hYmxlX3dha2UodHAtPnBkZXYsIHN0YXRlLCAxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3dha2V1cChzdHJ1Y3QgdHlwaG9vbiAqdHAsIGludCB3YWl0X3R5cGUpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5pb2FkZHI7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwkvKiBQb3N0IDIueC54IHZlcnNpb25zIG9mIHRoZSBTbGVlcCBJbWFnZSByZXF1aXJlIGEgcmVzZXQgYmVmb3JlCisJICogd2UgY2FuIGRvd25sb2FkIHRoZSBSdW50aW1lIEltYWdlLiBCdXQgbGV0J3Mgbm90IG1ha2UgdXNlcnMgb2YKKwkgKiB0aGUgb2xkIGZpcm13YXJlIHBheSBmb3IgdGhlIHJlc2V0LgorCSAqLworCWlvd3JpdGUzMihUWVBIT09OX0JPT1RDTURfV0FLRVVQLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKwlpZih0eXBob29uX3dhaXRfc3RhdHVzKGlvYWRkciwgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkgPCAwIHx8CisJCQkodHAtPmNhcGFiaWxpdGllcyAmIFRZUEhPT05fV0FLRVVQX05FRURTX1JFU0VUKSkKKwkJcmV0dXJuIHR5cGhvb25fcmVzZXQoaW9hZGRyLCB3YWl0X3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fc3RhcnRfcnVudGltZShzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGVycjsKKworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisJdHlwaG9vbl9maWxsX2ZyZWVfcmluZyh0cCk7CisKKwllcnIgPSB0eXBob29uX2Rvd25sb2FkX2Zpcm13YXJlKHRwKTsKKwlpZihlcnIgPCAwKSB7CisJCXByaW50aygiJXM6IGNhbm5vdCBsb2FkIHJ1bnRpbWUgb24gM1hQXG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCWlmKHR5cGhvb25fYm9vdF8zWFAodHAsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0JPT1QpIDwgMCkgeworCQlwcmludGsoIiVzOiBjYW5ub3QgYm9vdCAzWFBcbiIsIHRwLT5uYW1lKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9NQVhfUEtUX1NJWkUpOworCXhwX2NtZC5wYXJtMSA9IGNwdV90b19sZTE2KFBLVF9CVUZfU1opOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfU0VUX01BQ19BRERSRVNTKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNihudG9ocygqKHUxNiAqKSZkZXYtPmRldl9hZGRyWzBdKSk7CisJeHBfY21kLnBhcm0yID0gY3B1X3RvX2xlMzIobnRvaGwoKih1MzIgKikmZGV2LT5kZXZfYWRkclsyXSkpOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKiBEaXNhYmxlIElSUSBjb2FsZXNjaW5nIC0tIHdlIGNhbiByZWVuYWJsZSBpdCB3aGVuIDNDb20gZ2l2ZXMKKwkgKiB1cyBzb21lIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRyb2wgaXQuCisJICovCisJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfSVJRX0NPQUxFU0NFX0NUUkwpOworCXhwX2NtZC5wYXJtMSA9IDA7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9YQ1ZSX1NFTEVDVCk7CisJeHBfY21kLnBhcm0xID0gdHAtPnhjdnJfc2VsZWN0OworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfVkxBTl9UWVBFX1dSSVRFKTsKKwl4cF9jbWQucGFybTEgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KEVUSF9QXzgwMjFRKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTKTsKKwlzcGluX2xvY2tfYmgoJnRwLT5zdGF0ZV9sb2NrKTsKKwl4cF9jbWQucGFybTIgPSB0cC0+b2ZmbG9hZDsKKwl4cF9jbWQucGFybTMgPSB0cC0+b2ZmbG9hZDsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCXNwaW5fdW5sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwl0eXBob29uX3NldF9yeF9tb2RlKGRldik7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfVFhfRU5BQkxFKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUlhfRU5BQkxFKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJdHAtPmNhcmRfc3RhdGUgPSBSdW5uaW5nOworCXNtcF93bWIoKTsKKworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfRU5BQkxFX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfTk9ORSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwl0eXBob29uX3Jlc2V0KGlvYWRkciwgV2FpdE5vU2xlZXApOworCXR5cGhvb25fZnJlZV9yeF9yaW5ncyh0cCk7CisJdHlwaG9vbl9pbml0X3JpbmdzKHRwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3N0b3BfcnVudGltZShzdHJ1Y3QgdHlwaG9vbiAqdHAsIGludCB3YWl0X3R5cGUpCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCB0cmFuc21pdF9yaW5nICp0eExvID0gJnRwLT50eExvUmluZzsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5pb2FkZHI7CisJc3RydWN0IGNtZF9kZXNjIHhwX2NtZDsKKwlpbnQgaTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBlYXJseSwgc2luY2Ugd2UgY2FuJ3Qgc2NoZWR1bGUgYSBwb2xsCisJICogd2hlbiBjYWxsZWQgd2l0aCAhbmV0aWZfcnVubmluZygpLiBUaGlzIHdpbGwgYmUgcG9zdGVkCisJICogd2hlbiB3ZSBmb3JjZSB0aGUgcG9zdGluZyBvZiB0aGUgY29tbWFuZC4KKwkgKi8KKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SWF9ESVNBQkxFKTsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCisJLyogV2FpdCAxLzIgc2VjIGZvciBhbnkgb3V0c3RhbmRpbmcgdHJhbnNtaXRzIHRvIG9jY3VyCisJICogV2UnbGwgY2xlYW51cCBhZnRlciB0aGUgcmVzZXQgaWYgdGhpcyB0aW1lcyBvdXQuCisJICovCisJZm9yKGkgPSAwOyBpIDwgVFlQSE9PTl9XQUlUX1RJTUVPVVQ7IGkrKykgeworCQlpZihpbmRleGVzLT50eExvQ2xlYXJlZCA9PSBjcHVfdG9fbGUzMih0eExvLT5sYXN0V3JpdGUpKQorCQkJYnJlYWs7CisJCXVkZWxheShUWVBIT09OX1VERUxBWSk7CisJfQorCisJaWYoaSA9PSBUWVBIT09OX1dBSVRfVElNRU9VVCkKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IGhhbHQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIFR4IHRvIGNvbXBsZXRlXG4iLAorCQkgICAgICAgdHAtPm5hbWUpOworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1RYX0RJU0FCTEUpOworCXR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisKKwkvKiBzYXZlIHRoZSBzdGF0aXN0aWNzIHNvIHdoZW4gd2UgYnJpbmcgdGhlIGludGVyZmFjZSB1cCBhZ2FpbiwKKwkgKiB0aGUgdmFsdWVzIHJlcG9ydGVkIHRvIHVzZXJzcGFjZSBhcmUgY29ycmVjdC4KKwkgKi8KKwl0cC0+Y2FyZF9zdGF0ZSA9IFNsZWVwaW5nOworCXNtcF93bWIoKTsKKwl0eXBob29uX2RvX2dldF9zdGF0cyh0cCk7CisJbWVtY3B5KCZ0cC0+c3RhdHNfc2F2ZWQsICZ0cC0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX0hBTFQpOworCXR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisKKwlpZih0eXBob29uX3dhaXRfc3RhdHVzKGlvYWRkciwgVFlQSE9PTl9TVEFUVVNfSEFMVEVEKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVkIG91dCB3YWl0aW5nIGZvciAzWFAgdG8gaGFsdFxuIiwKKwkJICAgICAgIHRwLT5uYW1lKTsKKworCWlmKHR5cGhvb25fcmVzZXQoaW9hZGRyLCB3YWl0X3R5cGUpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVzZXQgM1hQXG4iLCB0cC0+bmFtZSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIGNsZWFudXAgYW55IG91dHN0YW5kaW5nIFR4IHBhY2tldHMgKi8KKwlpZihpbmRleGVzLT50eExvQ2xlYXJlZCAhPSBjcHVfdG9fbGUzMih0eExvLT5sYXN0V3JpdGUpKSB7CisJCWluZGV4ZXMtPnR4TG9DbGVhcmVkID0gY3B1X3RvX2xlMzIodHhMby0+bGFzdFdyaXRlKTsKKwkJdHlwaG9vbl9jbGVhbl90eCh0cCwgJnRwLT50eExvUmluZywgJmluZGV4ZXMtPnR4TG9DbGVhcmVkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3R5cGhvb25fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZih0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIFdhaXROb1NsZWVwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCByZXNldCBpbiB0eCB0aW1lb3V0XG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQlnb3RvIHRydWVseV9kZWFkOworCX0KKworCS8qIElmIHdlIGV2ZXIgc3RhcnQgdXNpbmcgdGhlIEhpIHJpbmcsIGl0IHdpbGwgbmVlZCBjbGVhbmluZyB0b28gKi8KKwl0eXBob29uX2NsZWFuX3R4KHRwLCAmdHAtPnR4TG9SaW5nLCAmdHAtPmluZGV4ZXMtPnR4TG9DbGVhcmVkKTsKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCisJaWYodHlwaG9vbl9zdGFydF9ydW50aW1lKHRwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHN0YXJ0IHJ1bnRpbWUgaW4gdHggdGltZW91dFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJZ290byB0cnVlbHlfZGVhZDsKKyAgICAgICAgfQorCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybjsKKwordHJ1ZWx5X2RlYWQ6CisJLyogUmVzZXQgdGhlIGhhcmR3YXJlLCBhbmQgdHVybiBvZmYgY2FycmllciB0byBhdm9pZCBtb3JlIHRpbWVvdXRzICovCisJdHlwaG9vbl9yZXNldCh0cC0+aW9hZGRyLCBOb1dhaXQpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWVyciA9IHR5cGhvb25fd2FrZXVwKHRwLCBXYWl0U2xlZXApOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHdha2V1cCBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0X3NsZWVwOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmdHlwaG9vbl9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCWRldi0+bmFtZSwgZGV2KTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIG91dF9zbGVlcDsKKworCWVyciA9IHR5cGhvb25fc3RhcnRfcnVudGltZSh0cCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBvdXRfaXJxOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKKworb3V0X2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworb3V0X3NsZWVwOgorCWlmKHR5cGhvb25fYm9vdF8zWFAodHAsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVib290IGludG8gc2xlZXAgaW1nXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCXR5cGhvb25fcmVzZXQodHAtPmlvYWRkciwgTm9XYWl0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgUENJX0QzaG90LCAwKSA8IDApIAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ28gYmFjayB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYodHlwaG9vbl9zdG9wX3J1bnRpbWUodHAsIFdhaXRTbGVlcCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc3RvcCBydW50aW1lXG4iLCBkZXYtPm5hbWUpOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGlycSBoYW5kbGVyIHJ1bm5pbmcgb24gYSBkaWZmZXJlbnQgQ1BVLiAqLworCXR5cGhvb25fc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXR5cGhvb25fZnJlZV9yeF9yaW5ncyh0cCk7CisJdHlwaG9vbl9pbml0X3JpbmdzKHRwKTsKKworCWlmKHR5cGhvb25fYm9vdF8zWFAodHAsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGJvb3Qgc2xlZXAgaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisKKwlpZih0eXBob29uX3NsZWVwKHRwLCBQQ0lfRDNob3QsIDApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHB1dCBjYXJkIHRvIHNsZWVwXG4iLCBkZXYtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQKK3R5cGhvb25fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIElmIHdlJ3JlIGRvd24sIHJlc3VtZSB3aGVuIHdlIGFyZSB1cHBlZC4KKwkgKi8KKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCWlmKHR5cGhvb25fd2FrZXVwKHRwLCBXYWl0Tm9TbGVlcCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNyaXRpY2FsOiBjb3VsZCBub3Qgd2FrZSB1cCBpbiByZXN1bWVcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJZ290byByZXNldDsKKwl9CisKKwlpZih0eXBob29uX3N0YXJ0X3J1bnRpbWUodHApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjcml0aWNhbDogY291bGQgbm90IHN0YXJ0IHJ1bnRpbWUgaW4gIgorCQkJCSJyZXN1bWVcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gcmVzZXQ7CisJfQorCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK3Jlc2V0OgorCXR5cGhvb25fcmVzZXQodHAtPmlvYWRkciwgTm9XYWl0KTsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGNtZF9kZXNjIHhwX2NtZDsKKworCS8qIElmIHdlJ3JlIGRvd24sIHdlJ3JlIGFscmVhZHkgc3VzcGVuZGVkLgorCSAqLworCWlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJaWYodHAtPnZsZ3JwICYmIHRwLT53b2xfZXZlbnRzICYgVFlQSE9PTl9XQUtFX01BR0lDX1BLVCkgeworCQlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZG8gV0FLRV9NQUdJQyB3aXRoIFZMQU5TXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlpZih0eXBob29uX3N0b3BfcnVudGltZSh0cCwgV2FpdE5vU2xlZXApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc3RvcCBydW50aW1lXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG5lZWRfcmVzdW1lOworCX0KKworCXR5cGhvb25fZnJlZV9yeF9yaW5ncyh0cCk7CisJdHlwaG9vbl9pbml0X3JpbmdzKHRwKTsKKworCWlmKHR5cGhvb25fYm9vdF8zWFAodHAsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gYm9vdCBzbGVlcCBpbWFnZVxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfU0VUX01BQ19BRERSRVNTKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNihudG9ocygqKHUxNiAqKSZkZXYtPmRldl9hZGRyWzBdKSk7CisJeHBfY21kLnBhcm0yID0gY3B1X3RvX2xlMzIobnRvaGwoKih1MzIgKikmZGV2LT5kZXZfYWRkclsyXSkpOworCWlmKHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBzZXQgbWFjIGFkZHJlc3MgaW4gc3VzcGVuZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlnb3RvIG5lZWRfcmVzdW1lOworCX0KKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9TRVRfUlhfRklMVEVSKTsKKwl4cF9jbWQucGFybTEgPSBUWVBIT09OX1JYX0ZJTFRFUl9ESVJFQ1RFRCB8IFRZUEhPT05fUlhfRklMVEVSX0JST0FEQ0FTVDsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc2V0IHJ4IGZpbHRlciBpbiBzdXNwZW5kXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWdvdG8gbmVlZF9yZXN1bWU7CisJfQorCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgc3RhdGUsIHRwLT53b2xfZXZlbnRzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHB1dCBjYXJkIHRvIHNsZWVwXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG5lZWRfcmVzdW1lOworCX0KKworCXJldHVybiAwOworCituZWVkX3Jlc3VtZToKKwl0eXBob29uX3Jlc3VtZShwZGV2KTsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2VuYWJsZV93YWtlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUsIGludCBlbmFibGUpCit7CisJcmV0dXJuIHBjaV9lbmFibGVfd2FrZShwZGV2LCBzdGF0ZSwgZW5hYmxlKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdAordHlwaG9vbl90ZXN0X21taW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMSwgMTI4KTsKKwlpbnQgbW9kZSA9IDA7CisJdTMyIHZhbDsKKworCWlmKCFpb2FkZHIpCisJCWdvdG8gb3V0OworCisJaWYoaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSAhPQorCQkJCVRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpCisJCWdvdG8gb3V0X3VubWFwOworCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCisJLyogT2ssIHNlZSBpZiB3ZSBjYW4gY2hhbmdlIG91ciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGJ5CisJICogc2VuZGluZyBvdXJzZWx2ZXMgYW4gaW50ZXJydXB0LiBJZiBzbywgdGhlbiBNTUlPIHdvcmtzLgorCSAqIFRoZSA1MHVzZWMgZGVsYXkgaXMgYXJiaXRyYXJ5IC0tIGl0IGNvdWxkIHByb2JhYmx5IGJlIHNtYWxsZXIuCisJICovCisJdmFsID0gaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCWlmKCh2YWwgJiBUWVBIT09OX0lOVFJfU0VMRikgPT0gMCkgeworCQlpb3dyaXRlMzIoMSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfU0VMRl9JTlRFUlJVUFQpOworCQlpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJCXVkZWxheSg1MCk7CisJCXZhbCA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwkJaWYodmFsICYgVFlQSE9PTl9JTlRSX1NFTEYpCisJCQltb2RlID0gMTsKKwl9CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfTk9ORSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCWlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworb3V0X3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CisKK291dDoKKwlpZighbW9kZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhbGxpbmcgYmFjayB0byBwb3J0IElPXG4iKTsKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3R5cGhvb25faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBkaWRfdmVyc2lvbiA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHA7CisJaW50IGNhcmRfaWQgPSAoaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXZvaWQgKnNoYXJlZDsKKwlkbWFfYWRkcl90IHNoYXJlZF9kbWE7CisJc3RydWN0IGNtZF9kZXNjIHhwX2NtZDsKKwlzdHJ1Y3QgcmVzcF9kZXNjIHhwX3Jlc3BbM107CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlpZighZGlkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdHApKTsKKwlpZihkZXYgPT0gTlVMTCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IHVuYWJsZSB0byBhbGxvYyBuZXcgbmV0IGRldmljZVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IHVuYWJsZSB0byBlbmFibGUgZGV2aWNlXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycm9yX291dF9kZXY7CisJfQorCisJZXJyID0gcGNpX3NldF9td2kocGRldik7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IHVuYWJsZSB0byBzZXQgTVdJXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X2Rpc2FibGU7CisJfQorCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKworCS8qIHNhbml0eSBjaGVja3Mgb24gSU8gYW5kIE1NSU8gQkFScworCSAqLworCWlmKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrKEVSUl9QRlgKKwkJICAgICAgICIlczogcmVnaW9uICMxIG5vdCBhIFBDSSBJTyByZXNvdXJjZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisJaWYocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSA8IDEyOCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IEludmFsaWQgUENJIElPIHJlZ2lvbiBzaXplLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKwlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlwcmludGsoRVJSX1BGWAorCQkgICAgICAgIiVzOiByZWdpb24gIzEgbm90IGEgUENJIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX291dF9td2k7CisJfQorCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCAxMjgpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBJbnZhbGlkIFBDSSBNTUlPIHJlZ2lvbiBzaXplLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInR5cGhvb24iKTsKKwlpZihlcnIgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY291bGQgbm90IHJlcXVlc3QgcmVnaW9uc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKworCS8qIG1hcCBvdXIgcmVnaXN0ZXJzCisJICovCisJaWYodXNlX21taW8gIT0gMCAmJiB1c2VfbW1pbyAhPSAxKQorCQl1c2VfbW1pbyA9IHR5cGhvb25fdGVzdF9tbWlvKHBkZXYpOworCisJaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIHVzZV9tbWlvLCAxMjgpOworCWlmICghaW9hZGRyKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY2Fubm90IHJlbWFwIHJlZ2lzdGVycywgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X3JlZ2lvbnM7CisJfQorCisJLyogYWxsb2NhdGUgcGNpIGRtYSBzcGFjZSBmb3IgcnggYW5kIHR4IGRlc2NyaXB0b3IgcmluZ3MKKwkgKi8KKwlzaGFyZWQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2hhcmVkKSwKKwkJCQkgICAgICAmc2hhcmVkX2RtYSk7CisJaWYoIXNoYXJlZCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5XG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX291dF9yZW1hcDsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPnNoYXJlZCA9IChzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQgKikgc2hhcmVkOworCXRwLT5zaGFyZWRfZG1hID0gc2hhcmVkX2RtYTsKKwl0cC0+cGRldiA9IHBkZXY7CisJdHAtPnR4X3BkZXYgPSBwZGV2OworCXRwLT5pb2FkZHIgPSBpb2FkZHI7CisJdHAtPnR4X2lvYWRkciA9IGlvYWRkcjsKKwl0cC0+ZGV2ID0gZGV2OworCisJLyogSW5pdCBzZXF1ZW5jZToKKwkgKiAxKSBSZXNldCB0aGUgYWRhcHRlciB0byBjbGVhciBhbnkgYmFkIGp1anUKKwkgKiAyKSBSZWxvYWQgdGhlIHNsZWVwIGltYWdlCisJICogMykgQm9vdCB0aGUgc2xlZXAgaW1hZ2UKKwkgKiA0KSBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MuCisJICogNSkgUHV0IHRoZSBjYXJkIHRvIHNsZWVwLgorCSAqLworCWlmICh0eXBob29uX3Jlc2V0KGlvYWRkciwgV2FpdFNsZWVwKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjb3VsZCBub3QgcmVzZXQgM1hQXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X2RtYTsKKwl9CisKKwkvKiBOb3cgdGhhdCB3ZSd2ZSByZXNldCB0aGUgM1hQIGFuZCBhcmUgc3VyZSBpdCdzIG5vdCBnb2luZyB0bworCSAqIHdyaXRlIGFsbCBvdmVyIG1lbW9yeSwgZW5hYmxlIGJ1cyBtYXN0ZXJpbmcsIGFuZCBzYXZlIG91cgorCSAqIHN0YXRlIGZvciByZXN1bWluZyBhZnRlciBhIHN1c3BlbmQuCisJICovCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwkvKiBkZXYtPm5hbWUgaXMgbm90IHZhbGlkIHVudGlsIHdlIHJlZ2lzdGVyLCBidXQgd2UgbmVlZCB0bworCSAqIHVzZSBzb21lIGNvbW1vbiByb3V0aW5lcyB0byBpbml0aWFsaXplIHRoZSBjYXJkLiBTbyB0aGF0IHRob3NlCisJICogcm91dGluZXMgcHJpbnQgdGhlIHJpZ2h0IG5hbWUsIHdlIGtlZXAgb3VyIG91biBwb2ludGVyIHRvIHRoZSBuYW1lCisJICovCisJdHAtPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKworCXR5cGhvb25faW5pdF9pbnRlcmZhY2UodHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjYW5ub3QgYm9vdCAzWFAgc2xlZXAgaW1hZ2VcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1JFQURfTUFDX0FERFJFU1MpOworCWlmKHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMSwgeHBfcmVzcCkgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY2Fubm90IHJlYWQgTUFDIGFkZHJlc3NcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCSoodTE2ICopJmRldi0+ZGV2X2FkZHJbMF0gPSBodG9ucyhsZTE2X3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0xKSk7CisJKih1MzIgKikmZGV2LT5kZXZfYWRkclsyXSA9IGh0b25sKGxlMzJfdG9fY3B1KHhwX3Jlc3BbMF0ucGFybTIpKTsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogQ291bGQgbm90IG9idGFpbiB2YWxpZCBldGhlcm5ldCBhZGRyZXNzLCAiCisJCSAgICAgICAiYWJvcnRpbmdcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfcmVzZXQ7CisJfQorCisJLyogUmVhZCB0aGUgU2xlZXAgSW1hZ2UgdmVyc2lvbiBsYXN0LCBzbyB0aGUgcmVzcG9uc2UgaXMgdmFsaWQKKwkgKiBsYXRlciB3aGVuIHdlIHByaW50IG91dCB0aGUgdmVyc2lvbiByZXBvcnRlZC4KKwkgKi8KKwlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SRUFEX1ZFUlNJT05TKTsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDMsIHhwX3Jlc3ApIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IENvdWxkIG5vdCBnZXQgU2xlZXAgSW1hZ2UgdmVyc2lvblxuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfcmVzZXQ7CisJfQorCisJdHAtPmNhcGFiaWxpdGllcyA9IHR5cGhvb25fY2FyZF9pbmZvW2NhcmRfaWRdLmNhcGFiaWxpdGllczsKKwl0cC0+eGN2cl9zZWxlY3QgPSBUWVBIT09OX1hDVlJfQVVUT05FRzsKKworCS8qIFR5cGhvb24gMS4wIFNsZWVwIEltYWdlcyByZXR1cm4gb25lIHJlc3BvbnNlIGRlc2NyaXB0b3IgdG8gdGhlCisJICogUkVBRF9WRVJTSU9OUyBjb21tYW5kLiBUaG9zZSB2ZXJzaW9ucyBhcmUgT0sgYWZ0ZXIgd2FraW5nIHVwCisJICogZnJvbSBzbGVlcCB3aXRob3V0IG5lZWRpbmcgYSByZXNldC4gVHlwaG9vbiAxLjErIFNsZWVwIEltYWdlcworCSAqIHNlZW0gdG8gbmVlZCBhIGxpdHRsZSBleHRyYSBoZWxwIHRvIGdldCBzdGFydGVkLiBTaW5jZSB3ZSBkb24ndAorCSAqIGtub3cgaG93IHRvIG51ZGdlIGl0IGFsb25nLCBqdXN0IGtpY2sgaXQuCisJICovCisJaWYoeHBfcmVzcFswXS5udW1EZXNjICE9IDApCisJCXRwLT5jYXBhYmlsaXRpZXMgfD0gVFlQSE9PTl9XQUtFVVBfTkVFRFNfUkVTRVQ7CisKKwlpZih0eXBob29uX3NsZWVwKHRwLCBQQ0lfRDNob3QsIDApIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNhbm5vdCBwdXQgYWRhcHRlciB0byBzbGVlcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJvcl9vdXRfcmVzZXQ7CisJfQorCisJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4JCT0gdHlwaG9vbl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gdHlwaG9vbl9zdGFydF90eDsKKwlkZXYtPnN0b3AJCT0gdHlwaG9vbl9jbG9zZTsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IHR5cGhvb25fc2V0X3J4X21vZGU7CisJZGV2LT50eF90aW1lb3V0CQk9IHR5cGhvb25fdHhfdGltZW91dDsKKwlkZXYtPnBvbGwJCT0gdHlwaG9vbl9wb2xsOworCWRldi0+d2VpZ2h0CQk9IDE2OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCWRldi0+Z2V0X3N0YXRzCQk9IHR5cGhvb25fZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gdHlwaG9vbl9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyCT0gdHlwaG9vbl92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZAk9IHR5cGhvb25fdmxhbl9yeF9raWxsX3ZpZDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmdHlwaG9vbl9ldGh0b29sX29wcyk7CisKKwkvKiBXZSBjYW4gaGFuZGxlIHNjYXR0ZXIgZ2F0aGVyLCB1cCB0byAxNiBlbnRyaWVzLCBhbmQKKwkgKiB3ZSBjYW4gZG8gSVAgY2hlY2tzdW1taW5nIChvbmx5IHZlcnNpb24gNCwgZG9oLi4uKQorCSAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCisJaWYocmVnaXN0ZXJfbmV0ZGV2KGRldikgPCAwKQorCQlnb3RvIGVycm9yX291dF9yZXNldDsKKworCS8qIGZpeHVwIG91ciBsb2NhbCBuYW1lICovCisJdHAtPm5hbWUgPSBkZXYtPm5hbWU7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlcyAweCVseCwgIiwKKwkgICAgICAgZGV2LT5uYW1lLCB0eXBob29uX2NhcmRfaW5mb1tjYXJkX2lkXS5uYW1lLAorCSAgICAgICB1c2VfbW1pbyA/ICJNTUlPIiA6ICJJTyIsIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCB1c2VfbW1pbykpOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4XG4iLCBkZXYtPmRldl9hZGRyW2ldKTsKKworCS8qIHhwX3Jlc3Agc3RpbGwgY29udGFpbnMgdGhlIHJlc3BvbnNlIHRvIHRoZSBSRUFEX1ZFUlNJT05TIGNvbW1hbmQuCisJICogRm9yIGRlYnVnZ2luZywgbGV0IHRoZSB1c2VyIGtub3cgd2hhdCB2ZXJzaW9uIGhlIGhhcy4KKwkgKi8KKwlpZih4cF9yZXNwWzBdLm51bURlc2MgPT0gMCkgeworCQkvKiBUaGlzIGlzIHRoZSBUeXBob29uIDEuMCB0eXBlIFNsZWVwIEltYWdlLCBsYXN0IDE2IGJpdHMKKwkJICogb2YgdmVyc2lvbiBpcyBNb250aC9EYXkgb2YgYnVpbGQuCisJCSAqLworCQl1MTYgbW9udGhkYXkgPSBsZTMyX3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0yKSAmIDB4ZmZmZjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR5cGhvb24gMS4wIFNsZWVwIEltYWdlIGJ1aWx0ICIKKwkJCSIlMDJ1LyUwMnUvMjAwMFxuIiwgZGV2LT5uYW1lLCBtb250aGRheSA+PiA4LAorCQkJbW9udGhkYXkgJiAweGZmKTsKKwl9IGVsc2UgaWYoeHBfcmVzcFswXS5udW1EZXNjID09IDIpIHsKKwkJLyogVGhpcyBpcyB0aGUgVHlwaG9vbiAxLjErIHR5cGUgU2xlZXAgSW1hZ2UKKwkJICovCisJCXUzMiBzbGVlcF92ZXIgPSBsZTMyX3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0yKTsKKwkJdTggKnZlcl9zdHJpbmcgPSAodTggKikgJnhwX3Jlc3BbMV07CisJCXZlcl9zdHJpbmdbMjVdID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR5cGhvb24gMS4xKyBTbGVlcCBJbWFnZSB2ZXJzaW9uICIKKwkJCSIlMDJ4LiUwM3guJTAzeCAlc1xuIiwgZGV2LT5uYW1lLCBzbGVlcF92ZXIgPj4gMjQsCisJCQkoc2xlZXBfdmVyID4+IDEyKSAmIDB4ZmZmLCBzbGVlcF92ZXIgJiAweGZmZiwKKwkJCXZlcl9zdHJpbmcpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIFNsZWVwIEltYWdlIHZlcnNpb24gIgorCQkJIigldTolMDR4KVxuIiwgZGV2LT5uYW1lLCB4cF9yZXNwWzBdLm51bURlc2MsCisJCQlsZTMyX3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0yKSk7CisJfQorCQkKKwlyZXR1cm4gMDsKKworZXJyb3Jfb3V0X3Jlc2V0OgorCXR5cGhvb25fcmVzZXQoaW9hZGRyLCBOb1dhaXQpOworCitlcnJvcl9vdXRfZG1hOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCksCisJCQkgICAgc2hhcmVkLCBzaGFyZWRfZG1hKTsKK2Vycm9yX291dF9yZW1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyb3Jfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycm9yX291dF9td2k6CisJcGNpX2NsZWFyX213aShwZGV2KTsKK2Vycm9yX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycm9yX291dF9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycm9yX291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3R5cGhvb25fcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwl0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIE5vV2FpdCk7CisJcGNpX2lvdW5tYXAocGRldiwgdHAtPmlvYWRkcik7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2hhcmVkKSwKKwkJCSAgICB0cC0+c2hhcmVkLCB0cC0+c2hhcmVkX2RtYSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHR5cGhvb25fZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSB0eXBob29uX3BjaV90YmwsCisJLnByb2JlCQk9IHR5cGhvb25faW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0eXBob29uX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdHlwaG9vbl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdHlwaG9vbl9yZXN1bWUsCisJLmVuYWJsZV93YWtlCT0gdHlwaG9vbl9lbmFibGVfd2FrZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQKK3R5cGhvb25faW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnR5cGhvb25fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit0eXBob29uX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnR5cGhvb25fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHlwaG9vbl9pbml0KTsKK21vZHVsZV9leGl0KHR5cGhvb25fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmggYi9kcml2ZXJzL25ldC90eXBob29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4ZWU3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uaApAQCAtMCwwICsxLDYxOSBAQAorLyogdHlwaG9vbi5oOgljaGlwIGluZm8gZm9yIHRoZSAzQ29tIDNDUjk5MCBmYW1pbHkgb2YgY29udHJvbGxlcnMgKi8KKy8qCisJV3JpdHRlbiAyMDAyLTIwMDMgYnkgRGF2aWQgRGlsbG93IDxkYXZlQHRoZWRpbGxvd3Mub3JnPgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgb24gYSBwdWJsaWMgd2ViIHNpdGUuIEl0IG1heSBlbmFibGUKKwljcnlwdG9ncmFwaGljIGNhcGFiaWxpdGllcyBvZiB0aGUgM0NvbSBoYXJkd2FyZSwgYW5kIG1heSBiZQorCWV4cG9ydGVkIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgdW5kZXIgTGljZW5zZSBFeGNlcHRpb24gIlRTVSIKKwlwdXJzdWFudCB0byAxNSBDLkYuUi4gU2VjdGlvbiA3NDAuMTMoZSkuCisKKwlUaGlzIHdvcmsgd2FzIGZ1bmRlZCBieSB0aGUgTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSB1bmRlcgorCXRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSBwcm9qZWN0IG51bWJlciAwMjc0REQwNkQxIGFuZCBOTE0gcHJvamVjdAorCW51bWJlciBZMS1MTS0yMDE1LTAxLgorKi8KKworLyogQWxsIFR5cGhvb24gcmluZyBwb3NpdGlvbnMgYXJlIHNwZWNpZmljZWQgaW4gYnl0ZXMsIGFuZCBwb2ludCB0byB0aGUKKyAqIGZpcnN0ICJjbGVhbiIgZW50cnkgaW4gdGhlIHJpbmcgLS0gaWUgdGhlIG5leHQgZW50cnkgd2UgdXNlIGZvciB3aGF0ZXZlcgorICogcHVycG9zZS4KKyAqLworCisvKiBUaGUgVHlwaG9vbiBiYXNpYyByaW5nCisgKiByaW5nQmFzZTogIHdoZXJlIHRoaXMgcmluZyBsaXZlcyAob3VyIHZpcnR1YWwgYWRkcmVzcykKKyAqIGxhc3RXcml0ZTogdGhlIG5leHQgZW50cnkgd2UnbGwgdXNlCisgKi8KK3N0cnVjdCBiYXNpY19yaW5nIHsKKwl1OCAqcmluZ0Jhc2U7CisJdTMyIGxhc3RXcml0ZTsKK307CisKKy8qIFRoZSBUeXBvb24gdHJhbnNtaXQgcmluZyAtLSBzYW1lIGFzIGEgYmFzaWMgcmluZywgcGx1czoKKyAqIGxhc3RSZWFkOiAgICAgIHdoZXJlIHdlJ3JlIGF0IGluIHJlZ2FyZCB0byBjbGVhbmluZyB1cCB0aGUgcmluZworICogd3JpdGVSZWdpc3RlcjogcmVnaXN0ZXIgdG8gdXNlIGZvciB3cml0aW5nIChkaWZmZXJlbnQgZm9yIEhpICYgTG8gcmluZ3MpCisgKi8KK3N0cnVjdCB0cmFuc21pdF9yaW5nIHsKKwl1OCAqcmluZ0Jhc2U7CisJdTMyIGxhc3RXcml0ZTsKKwl1MzIgbGFzdFJlYWQ7CisJaW50IHdyaXRlUmVnaXN0ZXI7Cit9OworCisvKiBUaGUgaG9zdDwtPlR5cGhvb24gcmluZyBpbmRleCBzdHJ1Y3R1cmUKKyAqIFRoaXMgaW5kaWNhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9ucyBpbiB0aGUgcmluZ3MKKyAqIAorICogQWxsIHZhbHVlcyBtdXN0IGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0IGZvciB0aGUgM1hQCisgKgorICogcnhIaUNsZWFyZWQ6ICAgZW50cnkgd2UndmUgY2xlYXJlZCB0byBpbiB0aGUgSGkgcmVjZWl2ZSByaW5nCisgKiByeExvQ2xlYXJlZDogICBlbnRyeSB3ZSd2ZSBjbGVhcmVkIHRvIGluIHRoZSBMbyByZWNlaXZlIHJpbmcKKyAqIHJ4QnVmZlJlYWR5OiAgIG5leHQgZW50cnkgd2UnbGwgcHV0IGEgZnJlZSBidWZmZXIgaW4KKyAqIHJlc3BDbGVhcmVkOiAgIGVudHJ5IHdlJ3ZlIGNsZWFyZWQgdG8gaW4gdGhlIHJlc3BvbnNlIHJpbmcKKyAqCisgKiB0eExvQ2xlYXJlZDogICBlbnRyeSB0aGUgTklDIGhhcyBjbGVhcmVkIHRvIGluIHRoZSBMbyB0cmFuc21pdCByaW5nCisgKiB0eEhpQ2xlYXJlZDogICBlbnRyeSB0aGUgTklDIGhhcyBjbGVhcmVkIHRvIGluIHRoZSBIaSB0cmFuc21pdCByaW5nCisgKiByeExvUmVhZHk6ICAgICBlbnRyeSB0aGUgTklDIGhhcyBmaWxsZWQgdG8gaW4gdGhlIExvIHJlY2VpdmUgcmluZworICogcnhCdWZmQ2xlYXJlZDogZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCBpbiB0aGUgZnJlZSBidWZmZXIgcmluZworICogY21kQ2xlYXJlZDogICAgZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCBpbiB0aGUgY29tbWFuZCByaW5nCisgKiByZXNwUmVhZHk6ICAgICBlbnRyeSB0aGUgTklDIGhhcyBmaWxsZWQgdG8gaW4gdGhlIHJlc3BvbnNlIHJpbmcKKyAqIHJ4SGlSZWFkeTogICAgIGVudHJ5IHRoZSBOSUMgaGFzIGZpbGxlZCB0byBpbiB0aGUgSGkgcmVjZWl2ZSByaW5nCisgKi8KK3N0cnVjdCB0eXBob29uX2luZGV4ZXMgeworCS8qIFRoZSBmaXJzdCBmb3VyIGFyZSB3cml0dGVuIGJ5IHRoZSBob3N0LCBhbmQgcmVhZCBieSB0aGUgTklDICovCisJdm9sYXRpbGUgdTMyIHJ4SGlDbGVhcmVkOworCXZvbGF0aWxlIHUzMiByeExvQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgcnhCdWZmUmVhZHk7CisJdm9sYXRpbGUgdTMyIHJlc3BDbGVhcmVkOworCisJLyogVGhlIHJlbWFpbmluZyBhcmUgd3JpdHRlbiBieSB0aGUgTklDLCBhbmQgcmVhZCBieSB0aGUgaG9zdCAqLworCXZvbGF0aWxlIHUzMiB0eExvQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgdHhIaUNsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHJ4TG9SZWFkeTsKKwl2b2xhdGlsZSB1MzIgcnhCdWZmQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgY21kQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgcmVzcFJlYWR5OworCXZvbGF0aWxlIHUzMiByeEhpUmVhZHk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIGhvc3Q8LT5UeXBob29uIGludGVyZmFjZQorICogT3VyIG1lYW5zIG9mIGNvbW11bmljYXRpbmcgd2hlcmUgdGhpbmdzIGFyZQorICoKKyAqIEFsbCB2YWx1ZXMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBmb3IgdGhlIDNYUAorICoKKyAqIHJpbmdJbmRleDogICA2NCBiaXQgYnVzIGFkZHJlc3Mgb2YgdGhlIGluZGV4IHN0cnVjdHVyZQorICogdHhMb0FkZHI6ICAgIDY0IGJpdCBidXMgYWRkcmVzcyBvZiB0aGUgTG8gdHJhbnNtaXQgcmluZworICogdHhMb1NpemU6ICAgIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgTG8gdHJhbnNtaXQgcmluZworICogdHhIaSo6ICAgICAgIGFzIGFib3ZlIGZvciB0aGUgSGkgcHJpb3JpdHkgdHJhbnNtaXQgcmluZworICogcnhMbyo6ICAgICAgIGFzIGFib3ZlIGZvciB0aGUgTG8gcHJpb3JpdHkgcmVjZWl2ZSByaW5nCisgKiByeEJ1ZmYqOiAgICAgYXMgYWJvdmUgZm9yIHRoZSBmcmVlIGJ1ZmZlciByaW5nCisgKiBjbWQqOiAgICAgICAgYXMgYWJvdmUgZm9yIHRoZSBjb21tYW5kIHJpbmcKKyAqIHJlc3AqOiAgICAgICBhcyBhYm92ZSBmb3IgdGhlIHJlc3BvbnNlIHJpbmcKKyAqIHplcm9BZGRyOiAgICA2NCBiaXQgYnVzIGFkZHJlc3Mgb2YgYSB6ZXJvIHdvcmQgKGZvciBETUEpCisgKiByeEhpKjogICAgICAgYXMgYWJvdmUgZm9yIHRoZSBIaSBQcmlvcml0eSByZWNlaXZlIHJpbmcKKyAqCisgKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciA2NCBiaXQgYWRkcmVzc2VzLCBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSAzWFAKKyAqIG9ubHkgZG8gMzIgYml0IGFkZHJlc3Nlcywgc28gdGhlICpIaSBmb3IgZWFjaCBvZiB0aGUgYWJvdmUgd2lsbCBhbHdheXMKKyAqIGJlIHplcm8uCisgKi8KK3N0cnVjdCB0eXBob29uX2ludGVyZmFjZSB7CisJdTMyIHJpbmdJbmRleDsKKwl1MzIgcmluZ0luZGV4SGk7CisJdTMyIHR4TG9BZGRyOworCXUzMiB0eExvQWRkckhpOworCXUzMiB0eExvU2l6ZTsKKwl1MzIgdHhIaUFkZHI7CisJdTMyIHR4SGlBZGRySGk7CisJdTMyIHR4SGlTaXplOworCXUzMiByeExvQWRkcjsKKwl1MzIgcnhMb0FkZHJIaTsKKwl1MzIgcnhMb1NpemU7CisJdTMyIHJ4QnVmZkFkZHI7CisJdTMyIHJ4QnVmZkFkZHJIaTsKKwl1MzIgcnhCdWZmU2l6ZTsKKwl1MzIgY21kQWRkcjsKKwl1MzIgY21kQWRkckhpOworCXUzMiBjbWRTaXplOworCXUzMiByZXNwQWRkcjsKKwl1MzIgcmVzcEFkZHJIaTsKKwl1MzIgcmVzcFNpemU7CisJdTMyIHplcm9BZGRyOworCXUzMiB6ZXJvQWRkckhpOworCXUzMiByeEhpQWRkcjsKKwl1MzIgcnhIaUFkZHJIaTsKKwl1MzIgcnhIaVNpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gdHJhbnNtaXQvZnJhZ21lbnQgZGVzY3JpcHRvcgorICoKKyAqIEEgcGFja2V0IGlzIGRlc2NyaWJlZCBieSBhIHBhY2tldCBkZXNjcmlwdG9yLCBmb2xsb3dlZCBieSBvcHRpb24gZGVzY3JpcHRvcnMsCisgKiBpZiBhbnksIHRoZW4gb25lIG9yIG1vcmUgZnJhZ21lbnQgZGVzY3JpcHRvcnMuCisgKiAKKyAqIFBhY2tldCBkZXNjcmlwdG9yOgorICogZmxhZ3M6CURlc2NyaXB0b3IgdHlwZQorICogbGVuOmkJemVybywgb3IgbGVuZ3RoIG9mIHRoaXMgcGFja2V0CisgKiBhZGRyKjoJOCBieXRlcyBvZiBvcGFxdWUgZGF0YSB0byB0aGUgZmlybXdhcmUgLS0gZm9yIHNrYiBwb2ludGVyCisgKiBwcm9jZXNzRmxhZ3M6IERldGVybWluZSBvZmZsb2FkIHRhc2tzIHRvIHBlcmZvcm0gb24gdGhpcyBwYWNrZXQuCisgKgorICogRnJhZ21lbnQgZGVzY3JpcHRvcjoKKyAqIGZsYWdzOglEZXNjcmlwdG9yIHR5cGUKKyAqIGxlbjppCWxlbmd0aCBvZiB0aGlzIGZyYWdtZW50CisgKiBhZGRyOglsb3cgYnl0ZXMgb2YgRE1BIGFkZHJlc3MgZm9yIHRoaXMgcGFydCBvZiB0aGUgcGFja2V0CisgKiBhZGRySGk6CWhpIGJ5dGVzIG9mIERNQSBhZGRyZXNzIGZvciB0aGlzIHBhcnQgb2YgdGhlIHBhY2tldAorICogcHJvY2Vzc0ZsYWdzOiBtdXN0IGJlIHplcm8KKyAqCisgKiBUWVBIT09OX0RFU0NfVkFMSUQgaXMgbm90IG1lbnRpb25lZCBpbiB0aGVpciBkb2NzLCBidXQgdGhlaXIgTGludXgKKyAqIGRyaXZlciB1c2VzIGl0LgorICovCitzdHJ1Y3QgdHhfZGVzYyB7CisJdTggIGZsYWdzOworI2RlZmluZSBUWVBIT09OX1RZUEVfTUFTSwkweDA3CisjZGVmaW5lIAlUWVBIT09OX0ZSQUdfREVTQwkweDAwCisjZGVmaW5lIAlUWVBIT09OX1RYX0RFU0MJCTB4MDEKKyNkZWZpbmUgCVRZUEhPT05fQ01EX0RFU0MJMHgwMgorI2RlZmluZSAJVFlQSE9PTl9PUFRfREVTQwkweDAzCisjZGVmaW5lIAlUWVBIT09OX1JYX0RFU0MJCTB4MDQKKyNkZWZpbmUgCVRZUEhPT05fUkVTUF9ERVNDCTB4MDUKKyNkZWZpbmUgVFlQSE9PTl9PUFRfVFlQRV9NQVNLCTB4ZjAKKyNkZWZpbmUgCVRZUEhPT05fT1BUX0lQU0VDCTB4MDAKKyNkZWZpbmUgCVRZUEhPT05fT1BUX1RDUF9TRUcJMHgxMAorI2RlZmluZSBUWVBIT09OX0NNRF9SRVNQT05ECTB4NDAKKyNkZWZpbmUgVFlQSE9PTl9SRVNQX0VSUk9SCTB4NDAKKyNkZWZpbmUgVFlQSE9PTl9SWF9FUlJPUgkweDQwCisjZGVmaW5lIFRZUEhPT05fREVTQ19WQUxJRAkweDgwCisJdTggIG51bURlc2M7CisJdTE2IGxlbjsKKwl1MzIgYWRkcjsKKwl1MzIgYWRkckhpOworCXUzMiBwcm9jZXNzRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fVFhfUEZfTk9fQ1JDCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfSVBfQ0hLU1VNCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfVENQX0NIS1NVTQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfVENQX1NFR01FTlQJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA4KQorI2RlZmluZSBUWVBIT09OX1RYX1BGX0lOU0VSVF9WTEFOCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9JUFNFQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1ZMQU5fUFJJT1JJVFkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1VEUF9DSEtTVU0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1BBRF9GUkFNRQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1JFU0VSVkVECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDBlMDApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfVkxBTl9NQVNLCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MGZmZmYwMDApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfSU5URVJOQUwJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmMDAwMDAwMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9WTEFOX1RBR19TSElGVAkxMgorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUQ1AgU2VnbWVudGF0aW9uIG9mZmxvYWQgb3B0aW9uIGRlc2NyaXB0b3IKKyAqCisgKiBmbGFnczoJZGVzY3JpcHRvciB0eXBlCisgKiBudW1EZXNjOgltdXN0IGJlIDEKKyAqIG1zc19mbGFnczoJYml0cyAwLTExIChsaXR0bGUgZW5kaWFuKSBhcmUgTVNTLCAxMiBpcyBmaXJzdCBUU08gZGVzY3JpcHRvcgorICoJCQkxMyBpcyBsaXN0IFRTTyBkZXNjcmlwdG9yLCBzZXQgYm90aCBpZiBvbmx5IG9uZSBUU08KKyAqIHJlc3BBZGRyTG86CWxvdyBieXRlcyBvZiBhZGRyZXNzIG9mIHRoZSBieXRlc1R4IGZpZWxkIG9mIHRoaXMgZGVzY3JpcHRvcgorICogYnl0ZXNUeDoJdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgVFNPIHJlcXVlc3QKKyAqIHN0YXR1czoJMCBvbiBjb21wbGV0aW9uCisgKi8KK3N0cnVjdCB0Y3BvcHRfZGVzYyB7CisJdTggIGZsYWdzOworCXU4ICBudW1EZXNjOworCXUxNiBtc3NfZmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fVFNPX0ZJUlNUCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MTAwMCkKKyNkZWZpbmUgVFlQSE9PTl9UU09fTEFTVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDIwMDApCisJdTMyIHJlc3BBZGRyTG87CisJdTMyIGJ5dGVzVHg7CisJdTMyIHN0YXR1czsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgSVBTRUMgT2ZmbG9hZCBkZXNjcmlwdG9yCisgKgorICogZmxhZ3M6CWRlc2NyaXB0b3IgdHlwZQorICogbnVtRGVzYzoJbXVzdCBiZSAxCisgKiBpcHNlY0ZsYWdzOgliaXQgMDogMCAtLSBnZW5lcmF0ZSBJViwgMSAtLSB1c2Ugc3VwcGxpZWQgSVYKKyAqIHNhMSwgc2EyOglTZWN1cml0eSBBc3NvY2lhdGlvbiBJRHMgZm9yIHRoaXMgcGFja2V0CisgKiByZXNlcnZlZDoJc2V0IHRvIDAKKyAqLworc3RydWN0IGlwc2VjX2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgaXBzZWNGbGFnczsKKyNkZWZpbmUgVFlQSE9PTl9JUFNFQ19HRU5fSVYJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDApCisjZGVmaW5lIFRZUEhPT05fSVBTRUNfVVNFX0lWCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorCXUzMiBzYTE7CisJdTMyIHNhMjsKKwl1MzIgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gcmVjZWl2ZSBkZXNjcmlwdG9yIChVcGRhdGVkIGJ5IE5JQykKKyAqCisgKiBmbGFnczogICAgICAgICBEZXNjcmlwdG9yIHR5cGUsIGVycm9yIGluZGljYXRpb24KKyAqIG51bURlc2M6ICAgICAgIEFsd2F5cyB6ZXJvCisgKiBmcmFtZUxlbjogICAgICB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0IHJlY2VpdmVkCisgKiBhZGRyOiAgICAgICAgICBsb3cgMzIgYnl0ZXMgb2YgdGhlIHZpcnR1YWwgYWRkciBwYXNzZWQgaW4gZm9yIHRoaXMgYnVmZmVyCisgKiBhZGRySGk6ICAgICAgICBoaWdoIDMyIGJ5dGVzIG9mIHRoZSB2aXJ0dWFsIGFkZHIgcGFzc2VkIGluIGZvciB0aGlzIGJ1ZmZlcgorICogcnhTdGF0dXM6ICAgICAgRXJyb3IgaWYgc2V0IGluIGZsYWdzLCBvdGhlcndpc2UgcmVzdWx0IG9mIG9mZmxvYWQgcHJvY2Vzc2luZworICogZmlsdGVyUmVzdWx0czogcmVzdWx0cyBvZiBmaWx0ZXJpbmcgb24gcGFja2V0LCBub3QgdXNlZAorICogaXBzZWNSZXN1bHRzOiAgUmVzdWx0cyBvZiBJUFNFQyBwcm9jZXNzaW5nCisgKiB2bGFuVGFnOiAgICAgICB0aGUgODAxLjJxIFRDSSBmcm9tIHRoZSBwYWNrZXQKKyAqLworc3RydWN0IHJ4X2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgZnJhbWVMZW47CisJdTMyIGFkZHI7CisJdTMyIGFkZHJIaTsKKwl1MzIgcnhTdGF0dXM7CisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0lOVEVSTkFMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0ZJRk9fVU5ERVJSVU4JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9CQURfU1NECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX1JVTlQJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMykKKyNkZWZpbmUgVFlQSE9PTl9SWF9FUlJfQ1JDCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX09WRVJTSVpFCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDUpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0FMSUdOCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDYpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0RSSUJCTEUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNykKKyNkZWZpbmUgVFlQSE9PTl9SWF9QUk9UT19NQVNLCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDMpCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fVU5LTk9XTglfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fSVAJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9SWF9QUk9UT19JUFgJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMikKKyNkZWZpbmUgVFlQSE9PTl9SWF9WTEFOCQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX1JYX0lQX0ZSQUcJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JUFNFQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKQorI2RlZmluZSBUWVBIT09OX1JYX0lQX0NIS19GQUlMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMjApCisjZGVmaW5lIFRZUEhPT05fUlhfVENQX0NIS19GQUlMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwNDApCisjZGVmaW5lIFRZUEhPT05fUlhfVURQX0NIS19GQUlMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwODApCisjZGVmaW5lIFRZUEhPT05fUlhfSVBfQ0hLX0dPT0QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9UQ1BfQ0hLX0dPT0QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDIwMCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9VRFBfQ0hLX0dPT0QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDQwMCkKKwl1MTYgZmlsdGVyUmVzdWx0czsKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDdmZmYpCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSRUQJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHg4MDAwKQorCXUxNiBpcHNlY1Jlc3VsdHM7CisjZGVmaW5lIFRZUEhPT05fUlhfT1VURVJfQUhfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9SWF9PVVRFUl9FU1BfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKyNkZWZpbmUgVFlQSE9PTl9SWF9JTk5FUl9BSF9HT09ECV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX1JYX0lOTkVSX0VTUF9HT09ECV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA4KQorI2RlZmluZSBUWVBIT09OX1JYX09VVEVSX0FIX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMTApCisjZGVmaW5lIFRZUEhPT05fUlhfT1VURVJfRVNQX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjApCisjZGVmaW5lIFRZUEhPT05fUlhfSU5ORVJfQUhfRkFJTAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA0MCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JTk5FUl9FU1BfRkFJTAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA4MCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9VTktOT1dOX1NBCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDEwMCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9FU1BfRk9STUFUX0VSUglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDIwMCkKKwl1MzIgdmxhblRhZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVHlwaG9vbiBmcmVlIGJ1ZmZlciBkZXNjcmlwdG9yLCB1c2VkIHRvIGdpdmUgYSBidWZmZXIgdG8gdGhlIE5JQworICoKKyAqIHBoeXNBZGRyOiAgICBsb3cgMzIgYml0cyBvZiB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogcGh5c0FkZHJIaTogIGhpZ2ggMzIgYml0cyBvZiB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciwgYWx3YXlzIHplcm8KKyAqIHZpcnRBZGRyOiAgICBsb3cgMzIgYml0cyBvZiB0aGUgc2tiIGFkZHJlc3MKKyAqIHZpcnRBZGRySGk6ICBoaWdoIDMyIGJpdHMgb2YgdGhlIHNrYiBhZGRyZXNzLCBhbHdheXMgemVybworICoKKyAqIHRoZSB2aXJ0KiBhZGRyZXNzIGlzIGJhc2ljYWxseSB0d28gMzIgYml0IGNvb2tpZXMsIGp1c3QgcGFzc2VkIGJhY2sKKyAqIGZyb20gdGhlIE5JQworICovCitzdHJ1Y3QgcnhfZnJlZSB7CisJdTMyIHBoeXNBZGRyOworCXUzMiBwaHlzQWRkckhpOworCXUzMiB2aXJ0QWRkcjsKKwl1MzIgdmlydEFkZHJIaTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVHlwaG9vbiBjb21tYW5kIGRlc2NyaXB0b3IsIHVzZWQgZm9yIGNvbW1hbmRzIGFuZCByZXNwb25zZXMKKyAqCisgKiBmbGFnczogICBkZXNjcmlwdG9yIHR5cGUKKyAqIG51bURlc2M6IG51bWJlciBvZiBkZXNjcmlwdG9ycyBmb2xsb3dpbmcgaW4gdGhpcyBjb21tYW5kL3Jlc3BvbnNlLAorICoJCQkJaWUsIHplcm8gZm9yIGEgb25lIGRlc2NyaXB0b3IgY29tbWFuZAorICogY21kOiAgICAgdGhlIGNvbW1hbmQKKyAqIHNlcU5vOiAgIHNlcXVlbmNlIG51bWJlciAodW51c2VkKQorICogcGFybTE6ICAgdXNlIHZhcmllcyBieSBjb21tYW5kCisgKiBwYXJtMjogICB1c2UgdmFyaWVzIGJ5IGNvbW1hbmQKKyAqIHBhcm0zOiAgIHVzZSB2YXJpZXMgYnkgY29tbWFuZAorICovCitzdHJ1Y3QgY21kX2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworI2RlZmluZSBUWVBIT09OX0NNRF9UWF9FTkFCTEUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX0NNRF9UWF9ESVNBQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKyNkZWZpbmUgVFlQSE9PTl9DTURfUlhfRU5BQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMykKKyNkZWZpbmUgVFlQSE9PTl9DTURfUlhfRElTQUJMRQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDQpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9SWF9GSUxURVIJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDUpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfU1RBVFMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA3KQorI2RlZmluZSBUWVBIT09OX0NNRF9YQ1ZSX1NFTEVDVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMTMpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9NQVhfUEtUX1NJWkUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMWEpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfTUVESUFfU1RBVFVTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDFiKQorI2RlZmluZSBUWVBIT09OX0NNRF9HT1RPX1NMRUVQCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAyMykKKyNkZWZpbmUgVFlQSE9PTl9DTURfU0VUX01VTFRJQ0FTVF9IQVNICV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDI1KQorI2RlZmluZSBUWVBIT09OX0NNRF9TRVRfTUFDX0FERFJFU1MJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjYpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfTUFDX0FERFJFU1MJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjcpCisjZGVmaW5lIFRZUEhPT05fQ01EX1ZMQU5fVFlQRV9XUklURQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAyYikKKyNkZWZpbmUgVFlQSE9PTl9DTURfQ1JFQVRFX1NBCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAzNCkKKyNkZWZpbmUgVFlQSE9PTl9DTURfREVMRVRFX1NBCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAzNSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfUkVBRF9WRVJTSU9OUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA0MykKKyNkZWZpbmUgVFlQSE9PTl9DTURfSVJRX0NPQUxFU0NFX0NUUkwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDUpCisjZGVmaW5lIFRZUEhPT05fQ01EX0VOQUJMRV9XQUtFX0VWRU5UUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA0OSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfU0VUX09GRkxPQURfVEFTS1MJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNGYpCisjZGVmaW5lIFRZUEhPT05fQ01EX0hFTExPX1JFU1AJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDU3KQorI2RlZmluZSBUWVBIT09OX0NNRF9IQUxUCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA1ZCkKKyNkZWZpbmUgVFlQSE9PTl9DTURfUkVBRF9JUFNFQ19JTkZPCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDVlKQorI2RlZmluZSBUWVBIT09OX0NNRF9HRVRfSVBTRUNfRU5BQkxFCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDY3KQorI2RlZmluZSBUWVBIT09OX0NNRF9HRVRfQ01EX0xWTAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNjkpCisJdTE2IHNlcU5vOworCXUxNiBwYXJtMTsKKwl1MzIgcGFybTI7CisJdTMyIHBhcm0zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUeXBob29uIHJlc3BvbnNlIGRlc2NyaXB0b3IsIHNlZSBjb21tYW5kIGRlc2NyaXB0b3IgZm9yIGRldGFpbHMKKyAqLworc3RydWN0IHJlc3BfZGVzYyB7CisJdTggIGZsYWdzOworCXU4ICBudW1EZXNjOworCXUxNiBjbWQ7CisJdTE2IHNlcU5vOworCXUxNiBwYXJtMTsKKwl1MzIgcGFybTI7CisJdTMyIHBhcm0zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKHgsIGNvbW1hbmQpCQkJCVwKKwlkbyB7IHN0cnVjdCBjbWRfZGVzYyAqX3B0ciA9ICh4KTsJCQkJXAorCQltZW1zZXQoX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYykpOwkJXAorCQlfcHRyLT5mbGFncyA9IFRZUEhPT05fQ01EX0RFU0MgfCBUWVBIT09OX0RFU0NfVkFMSUQ7CVwKKwkJX3B0ci0+Y21kID0gY29tbWFuZDsJCQkJCVwKKwl9IHdoaWxlKDApCisKKy8qIFdlIHNldCBzZXFObyB0byAxIGlmIHdlJ3JlIGV4cGVjdGluZyBhIHJlc3BvbnNlIGZyb20gdGhpcyBjb21tYW5kICovCisjZGVmaW5lIElOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKHgsIGNvbW1hbmQpCQkJCVwKKwlkbyB7IHN0cnVjdCBjbWRfZGVzYyAqX3B0ciA9ICh4KTsJCQkJXAorCQltZW1zZXQoX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYykpOwkJXAorCQlfcHRyLT5mbGFncyA9IFRZUEhPT05fQ01EX1JFU1BPTkQgfCBUWVBIT09OX0NNRF9ERVNDOwlcCisJCV9wdHItPmZsYWdzIHw9IFRZUEhPT05fREVTQ19WQUxJRDsgCQkJXAorCQlfcHRyLT5jbWQgPSBjb21tYW5kOwkJCQkJXAorCQlfcHRyLT5zZXFObyA9IDE7CQkJCQlcCisJfSB3aGlsZSgwKQorCisvKiBUWVBIT09OX0NNRF9TRVRfUlhfRklMVEVSIGZpbHRlciBiaXRzIChjbWQucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfRElSRUNURUQJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX0FMTF9NQ0FTVAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfQlJPQURDQVNUCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUl9QUk9NSVNDT1VTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA4KQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUl9NQ0FTVF9IQVNICV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEwKQorCisvKiBUWVBIT09OX0NNRF9SRUFEX1NUQVRTIHJlc3BvbnNlIGZvcm1hdAorICovCitzdHJ1Y3Qgc3RhdHNfcmVzcCB7CisJdTggIGZsYWdzOworCXU4ICBudW1EZXNjOworCXUxNiBjbWQ7CisJdTE2IHNlcU5vOworCXUxNiB1bnVzZWQ7CisJdTMyIHR4UGFja2V0czsKKwl1NjQgdHhCeXRlczsKKwl1MzIgdHhEZWZlcnJlZDsKKwl1MzIgdHhMYXRlQ29sbGlzaW9uczsKKwl1MzIgdHhDb2xsaXNpb25zOworCXUzMiB0eENhcnJpZXJMb3N0OworCXUzMiB0eE11bHRpcGxlQ29sbGlzaW9uczsKKwl1MzIgdHhFeGNlc3NpdmVDb2xsaXNpb25zOworCXUzMiB0eEZpZm9VbmRlcnJ1bnM7CisJdTMyIHR4TXVsdGljYXN0VHhPdmVyZmxvd3M7CisJdTMyIHR4RmlsdGVyZWQ7CisJdTMyIHJ4UGFja2V0c0dvb2Q7CisJdTY0IHJ4Qnl0ZXNHb29kOworCXUzMiByeEZpZm9PdmVycnVuczsKKwl1MzIgQmFkU1NEOworCXUzMiByeENyY0Vycm9yczsKKwl1MzIgcnhPdmVyc2l6ZWQ7CisJdTMyIHJ4QnJvYWRjYXN0OworCXUzMiByeE11bHRpY2FzdDsKKwl1MzIgcnhPdmVyZmxvdzsKKwl1MzIgcnhGaWx0ZXJlZDsKKwl1MzIgbGlua1N0YXR1czsKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX1NUQVRfTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKQorI2RlZmluZSBUWVBIT09OX0xJTktfR09PRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKQorI2RlZmluZSBUWVBIT09OX0xJTktfQkFECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fTElOS19TUEVFRF9NQVNLCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fTElOS18xMDBNQlBTCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fTElOS18xME1CUFMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0RVUExFWF9NQVNLCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0ZVTExfRFVQTEVYCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0hBTEZfRFVQTEVYCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCkKKwl1MzIgdW51c2VkMjsKKwl1MzIgdW51c2VkMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUWVBIT09OX0NNRF9YQ1ZSX1NFTEVDVCB4Y3ZyIHZhbHVlcyAocmVzcC5wYXJtMSkKKyAqLworI2RlZmluZSBUWVBIT09OX1hDVlJfMTBIQUxGCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBUWVBIT09OX1hDVlJfMTBGVUxMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX1hDVlJfMTAwSEFMRglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwMEZVTEwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDMpCisjZGVmaW5lIFRZUEhPT05fWENWUl9BVVRPTkVHCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorCisvKiBUWVBIT09OX0NNRF9SRUFEX01FRElBX1NUQVRVUyAocmVzcC5wYXJtMSkKKyAqLworI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfQ1JDX1NUUklQX0RJU0FCTEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDQpCisjZGVmaW5lIFRZUEhPT05fTUVESUFfU1RBVF9DT0xMSVNJT05fREVURUNUCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEwKQorI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfQ0FSUklFUl9TRU5TRQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAyMCkKKyNkZWZpbmUgVFlQSE9PTl9NRURJQV9TVEFUX1BPTEFSSVRZX1JFVgkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDA0MDApCisjZGVmaW5lIFRZUEhPT05fTUVESUFfU1RBVF9OT19MSU5LCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDgwMCkKKworLyogVFlQSE9PTl9DTURfU0VUX01VTFRJQ0FTVF9IQVNIIGVuYWJsZSB2YWx1ZXMgKGNtZC5wYXJtMSkKKyAqLworI2RlZmluZSBUWVBIT09OX01DQVNUX0hBU0hfRElTQUJMRQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMCkKKyNkZWZpbmUgVFlQSE9PTl9NQ0FTVF9IQVNIX0VOQUJMRQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9NQ0FTVF9IQVNIX1NFVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisKKy8qIFRZUEhPT05fQ01EX0NSRUFURV9TQSBkZXNjcmlwdG9yIGFuZCBzZXR0aW5ncworICovCitzdHJ1Y3Qgc2FfZGVzY3JpcHRvciB7CisJdTggIGZsYWdzOworCXU4ICBudW1EZXNjOworCXUxNiBjbWQ7CisJdTE2IHNlcU5vOworCXUxNiBtb2RlOworI2RlZmluZSBUWVBIT09OX1NBX01PREVfTlVMTAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDApCisjZGVmaW5lIFRZUEhPT05fU0FfTU9ERV9BSAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fU0FfTU9ERV9FU1AJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAyKQorCXU4ICBoYXNoRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fU0FfSEFTSF9FTkFCTEUJCTB4MDEKKyNkZWZpbmUgVFlQSE9PTl9TQV9IQVNIX1NIQTEJCTB4MDIKKyNkZWZpbmUgVFlQSE9PTl9TQV9IQVNIX01ENQkJMHgwNAorCXU4ICBkaXJlY3Rpb247CisjZGVmaW5lIFRZUEhPT05fU0FfRElSX1JYCQkweDAwCisjZGVmaW5lIFRZUEhPT05fU0FfRElSX1RYCQkweDAxCisJdTggIGVuY3J5cHRpb25GbGFnczsKKyNkZWZpbmUgVFlQSE9PTl9TQV9FTkNSWVBUX0VOQUJMRQkweDAxCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF9ERVMJCTB4MDIKKyNkZWZpbmUgVFlQSE9PTl9TQV9FTkNSWVBUXzNERVMJCTB4MDAKKyNkZWZpbmUgVFlQSE9PTl9TQV9FTkNSWVBUXzNERVNfMktFWQkweDAwCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF8zREVTXzNLRVkJMHgwNAorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfQ0JDCQkweDA4CisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF9FQ0IJCTB4MDAKKwl1OCAgc3BlY2lmeUluZGV4OworI2RlZmluZSBUWVBIT09OX1NBX1NQRUNJRllfSU5ERVgJMHgwMQorI2RlZmluZSBUWVBIT09OX1NBX0dFTkVSQVRFX0lOREVYCTB4MDAKKwl1MzIgU1BJOworCXUzMiBkZXN0QWRkcjsKKwl1MzIgZGVzdE1hc2s7CisJdTggIGludGVnS2V5WzIwXTsKKwl1OCAgY29uZktleVsyNF07CisJdTMyIGluZGV4OworCXUzMiB1bnVzZWQ7CisJdTMyIHVudXNlZDI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVFlQSE9PTl9DTURfU0VUX09GRkxPQURfVEFTS1MgYml0cyAoY21kLnBhcm0yIChUeCkgJiBjbWQucGFybTMgKFJ4KSkKKyAqIFRoaXMgaXMgYWxsIGZvciBJUHY0LgorICovCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9UQ1BfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMikKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX1VEUF9DSEtTVU0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfSVBfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX0lQU0VDCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMTApCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9CQ0FTVF9USFJPVFRMRQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMjApCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9ESENQX1BSRVZFTlQJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfVkxBTgkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfRklMVEVSSU5HCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX1RDUF9TRUdNRU5UCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDIwMCkKKworLyogVFlQSE9PTl9DTURfRU5BQkxFX1dBS0VfRVZFTlRTIGJpdHMgKGNtZC5wYXJtMSkKKyAqLworI2RlZmluZSBUWVBIT09OX1dBS0VfTUFHSUNfUEtUCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDEpCisjZGVmaW5lIFRZUEhPT05fV0FLRV9MSU5LX0VWRU5UCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDIpCisjZGVmaW5lIFRZUEhPT05fV0FLRV9JQ01QX0VDSE8JCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwNCkKKyNkZWZpbmUgVFlQSE9PTl9XQUtFX0FSUAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDA4KQorCisvKiBUaGVzZSBhcmUgdXNlZCB0byBsb2FkIHRoZSBmaXJtd2FyZSBpbWFnZSBvbiB0aGUgTklDCisgKi8KK3N0cnVjdCB0eXBob29uX2ZpbGVfaGVhZGVyIHsKKwl1OCAgdGFnWzhdOworCXUzMiB2ZXJzaW9uOworCXUzMiBudW1TZWN0aW9uczsKKwl1MzIgc3RhcnRBZGRyOworCXUzMiBobWFjRGlnZXN0WzVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB0eXBob29uX3NlY3Rpb25faGVhZGVyIHsKKwl1MzIgbGVuOworCXUxNiBjaGVja3N1bTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIHN0YXJ0QWRkcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVHlwaG9vbiBSZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9SRUdfU09GVF9SRVNFVAkJCTB4MDAKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMJCQkweDA0CisjZGVmaW5lIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFCQkJMHgwOAorI2RlZmluZSBUWVBIT09OX1JFR19JTlRSX01BU0sJCQkweDBjCisjZGVmaW5lIFRZUEhPT05fUkVHX1NFTEZfSU5URVJSVVBUCQkweDEwCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNNwkJCTB4MTQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk02CQkJMHgxOAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTUJCQkweDFjCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNNAkJCTB4MjAKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk0zCQkJMHgyNAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTIJCQkweDI4CisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNMQkJCTB4MmMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk0wCQkJMHgzMAorI2RlZmluZSBUWVBIT09OX1JFR19BUk0ySE9TVDMJCQkweDM0CisjZGVmaW5lIFRZUEhPT05fUkVHX0FSTTJIT1NUMgkJCTB4MzgKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQVJNMkhPU1QxCQkJMHgzYworI2RlZmluZSBUWVBIT09OX1JFR19BUk0ySE9TVDAJCQkweDQwCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9EQVRBX0xPCQlUWVBIT09OX1JFR19IT1NUMkFSTTUKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9EQVRBX0hJCQlUWVBIT09OX1JFR19IT1NUMkFSTTQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9ERVNUX0FERFIJCVRZUEhPT05fUkVHX0hPU1QyQVJNMworI2RlZmluZSBUWVBIT09OX1JFR19CT09UX0NIRUNLU1VNCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9MRU5HVEgJCQlUWVBIT09OX1JFR19IT1NUMkFSTTEKKworI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9CT09UX0FERFIJCVRZUEhPT05fUkVHX0hPU1QyQVJNMQorI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzAJCVRZUEhPT05fUkVHX0hPU1QyQVJNMgorI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzEJCVRZUEhPT05fUkVHX0hPU1QyQVJNMworI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzIJCVRZUEhPT05fUkVHX0hPU1QyQVJNNAorI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzMJCVRZUEhPT05fUkVHX0hPU1QyQVJNNQorI2RlZmluZSBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzQJCVRZUEhPT05fUkVHX0hPU1QyQVJNNgorCisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfUkVDT1JEX0FERFJfSEkJCVRZUEhPT05fUkVHX0hPU1QyQVJNMgorI2RlZmluZSBUWVBIT09OX1JFR19CT09UX1JFQ09SRF9BRERSX0xPCQlUWVBIT09OX1JFR19IT1NUMkFSTTEKKworI2RlZmluZSBUWVBIT09OX1JFR19UWF9MT19SRUFEWQkJCVRZUEhPT05fUkVHX0hPU1QyQVJNMworI2RlZmluZSBUWVBIT09OX1JFR19DTURfUkVBRFkJCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfVFhfSElfUkVBRFkJCQlUWVBIT09OX1JFR19IT1NUMkFSTTEKKworI2RlZmluZSBUWVBIT09OX1JFR19DT01NQU5ECQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0wCisjZGVmaW5lIFRZUEhPT05fUkVHX0hFQVJUQkVBVAkJCVRZUEhPT05fUkVHX0FSTTJIT1NUMworI2RlZmluZSBUWVBIT09OX1JFR19TVEFUVVMJCQlUWVBIT09OX1JFR19BUk0ySE9TVDAKKworLyogM1hQIFJlc2V0IHZhbHVlcyAoVFlQSE9PTl9SRUdfU09GVF9SRVNFVCkKKyAqLworI2RlZmluZSBUWVBIT09OX1JFU0VUX0FMTAkweDdmCisjZGVmaW5lIFRZUEhPT05fUkVTRVRfTk9ORQkweDAwCisKKy8qIDNYUCBpcnEgYml0cyAoVFlQSE9PTl9SRUdfSU5UUntTVEFUVVMsRU5BQkxFLE1BU0t9KQorICoKKyAqIFNvbWUgb2YgdGhlc2UgY2FtZSBmcm9tIE9wZW5CU0QsIGFzIHRoZSAzQ29tIGRvY3MgaGF2ZSBpdCB3cm9uZworICogKElOVFJfU0VMRikgb3IgZG9uJ3QgbGlzdCBpdCBhdCBhbGwgKElOVFJfKl9BQk9SVCkKKyAqCisgKiBFbmFibGluZyBpcnFzIG9uIHRoZSBIZWFydGJlYXQgcmVnIChBcm1Ub0hvc3QzKSBnZXRzIHlvdSBhbiBpcnEKKyAqIGFib3V0IGV2ZXJ5IDhtcywgc28gZG9uJ3QgZG8gaXQuCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0hPU1RfSU5UCQkweDAwMDAwMDAxCisjZGVmaW5lIFRZUEhPT05fSU5UUl9BUk0ySE9TVDAJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0FSTTJIT1NUMQkJMHgwMDAwMDAwNAorI2RlZmluZSBUWVBIT09OX0lOVFJfQVJNMkhPU1QyCQkweDAwMDAwMDA4CisjZGVmaW5lIFRZUEhPT05fSU5UUl9BUk0ySE9TVDMJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0RNQTAJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0RNQTEJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0RNQTIJCTB4MDAwMDAwODAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0RNQTMJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX01BU1RFUl9BQk9SVAkweDAwMDAwMjAwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9UQVJHRVRfQUJPUlQJMHgwMDAwMDQwMAorI2RlZmluZSBUWVBIT09OX0lOVFJfU0VMRgkJMHgwMDAwMDgwMAorI2RlZmluZSBUWVBIT09OX0lOVFJfUkVTRVJWRUQJCTB4ZmZmZmYwMDAKKworI2RlZmluZSBUWVBIT09OX0lOVFJfQk9PVENNRAkJVFlQSE9PTl9JTlRSX0FSTTJIT1NUMAorCisjZGVmaW5lIFRZUEhPT05fSU5UUl9FTkFCTEVfQUxMCQkweGZmZmZmZmVmCisjZGVmaW5lIFRZUEhPT05fSU5UUl9BTEwJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX05PTkUJCTB4MDAwMDAwMDAKKworLyogVGhlIGNvbW1hbmRzIGZvciB0aGUgM1hQIGNoaXAgKFRZUEhPT05fUkVHX0NPTU1BTkQpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9CT09UQ01EX0JPT1QJCQkweDAwCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9XQUtFVVAJCQkweGZhCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9ETkxEX0NPTVBMRVRFCQkweGZiCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9TRUdfQVZBSUxBQkxFCQkweGZjCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9SVU5USU1FX0lNQUdFCQkweGZkCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9SRUdfQk9PVF9SRUNPUkQJCTB4ZmYKKworLyogM1hQIFN0YXR1cyB2YWx1ZXMgKFRZUEhPT05fUkVHX1NUQVRVUykKKyAqLworI2RlZmluZSBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9CT09UCQkweDA3CisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1NFQ09ORF9JTklUCQkweDA4CisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1JVTk5JTkcJCQkweDA5CisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QJCTB4MGQKKyNkZWZpbmUgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfU0VHTUVOVAkweDEwCisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1NMRUVQSU5HCQkJMHgxMQorI2RlZmluZSBUWVBIT09OX1NUQVRVU19IQUxURUQJCQkweDE0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTdkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpAQCAtMCwwICsxLDIwMzUgQEAKKy8qIHZpYS1yaGluZS5jOiBBIExpbnV4IEV0aGVybmV0IGRldmljZSBkcml2ZXIgZm9yIFZJQSBSaGluZSBmYW1pbHkgY2hpcHMuICovCisvKgorCVdyaXR0ZW4gMTk5OC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDdXJyZW50IE1haW50YWluZXI6IFJvZ2VyIEx1ZXRoaSA8cmxAaGVsbGdhdGUuY2g+CisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFZJQSBWVDg2QzEwMEEgUmhpbmUtSS4KKwlJdCBhbHNvIHdvcmtzIHdpdGggdGhlIFJoaW5lLUlJICg2MTAyKSBhbmQgUmhpbmUtSUlJICg2MTA1LzYxMDVMLzYxMDVMT00KKwlhbmQgbWFuYWdlbWVudCBOSUMgNjEwNU0pLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisKKwlUaGlzIGRyaXZlciBjb250YWlucyBzb21lIGNoYW5nZXMgZnJvbSB0aGUgb3JpZ2luYWwgRG9uYWxkIEJlY2tlcgorCXZlcnNpb24uIEhlIG1heSBvciBtYXkgbm90IGJlIGludGVyZXN0ZWQgaW4gYnVnIHJlcG9ydHMgb24gdGhpcworCWNvZGUuIFlvdSBjYW4gZmluZCBoaXMgdmVyc2lvbnMgYXQ6CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay92aWEtcmhpbmUuaHRtbAorCisKKwlMaW51eCBrZXJuZWwgdmVyc2lvbiBoaXN0b3J5OgorCisJTEsxLjEuMDoKKwktIEplZmYgR2FyemlrOiBzb2Z0bmV0ICduIHN0dWZmCisKKwlMSzEuMS4xOgorCS0gSnVzdGluIEd1eWV0dDogc29mdG5ldCBhbmQgbG9ja2luZyBmaXhlcworCS0gSmVmZiBHYXJ6aWs6IHVzZSBQQ0kgaW50ZXJmYWNlCisKKwlMSzEuMS4yOgorCS0gVXJiYW4gV2lkbWFyazogbWlub3IgY2xlYW51cHMsIG1lcmdlcyBmcm9tIEJlY2tlciAxLjAzYS8xLjA0IHZlcnNpb25zCisKKwlMSzEuMS4zOgorCS0gVXJiYW4gV2lkbWFyazogdXNlIFBDSSBETUEgaW50ZXJmYWNlICh3aXRoIHRoYW5rcyB0byB0aGUgZWVwcm8xMDAuYworCQkJIGNvZGUpIHVwZGF0ZSAiVGhlb3J5IG9mIE9wZXJhdGlvbiIgd2l0aAorCQkJIHNvZnRuZXQvbG9ja2luZyBjaGFuZ2VzCisJLSBEYXZlIE1pbGxlcjogUENJIERNQSBhbmQgZW5kaWFuIGZpeHVwcworCS0gSmVmZiBHYXJ6aWs6IE1PRF94eHggcmFjZSBmaXhlcywgdXBkYXRlZCBQQ0kgcmVzb3VyY2UgYWxsb2NhdGlvbgorCisJTEsxLjEuNDoKKwktIFVyYmFuIFdpZG1hcms6IGZpeCBnY2MgMi45NS4yIHByb2JsZW0gYW5kCisJICAgICAgICAgICAgICAgICByZW1vdmUgd3JpdGVsJ3MgdG8gZml4ZWQgYWRkcmVzcyAweDdjCisKKwlMSzEuMS41OgorCS0gVXJiYW4gV2lkbWFyazogbWRpbyBsb2NraW5nLCBib3VuY2UgYnVmZmVyIGNoYW5nZXMKKwkgICAgICAgICAgICAgICAgIG1lcmdlcyBmcm9tIEJlY2tlcnMgMS4wNSB2ZXJzaW9uCisJICAgICAgICAgICAgICAgICBhZGRlZCBuZXRpZl9ydW5uaW5nX29uL29mZiBzdXBwb3J0CisKKwlMSzEuMS42OgorCS0gVXJiYW4gV2lkbWFyazogbWVyZ2VzIGZyb20gQmVja2VycyAxLjA4YiB2ZXJzaW9uIChWVDYxMDIgKyBtZGlvKQorCSAgICAgICAgICAgICAgICAgc2V0IG5ldGlmX3J1bm5pbmdfb24vb2ZmIG9uIHN0YXJ0dXAsIGRlbF90aW1lcl9zeW5jCisKKwlMSzEuMS43OgorCS0gTWFuZnJlZCBTcHJhdWw6IGFkZGVkIHJlc2V0IGludG8gdHhfdGltZW91dAorCisJTEsxLjEuOToKKwktIFVyYmFuIFdpZG1hcms6IG1lcmdlcyBmcm9tIEJlY2tlcnMgMS4xMCB2ZXJzaW9uCisJICAgICAgICAgICAgICAgICAobWVkaWEgc2VsZWN0aW9uICsgZWVwcm9tIHJlbG9hZCkKKwktIERhdmlkIFZyYWJlbDogIG1lcmdlcyBmcm9tIEQtTGluayAiMS4xMSIgdmVyc2lvbgorCSAgICAgICAgICAgICAgICAgKGRpc2FibGUgV09MIGFuZCBQTUUgb24gc3RhcnR1cCkKKworCUxLMS4xLjEwOgorCS0gTWFuZnJlZCBTcHJhdWw6IHVzZSAic2luZ2xlY29weSIgZm9yIHVuYWxpZ25lZCBidWZmZXJzCisJICAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb2NhdGUgYm91bmNlIGJ1ZmZlcnMgZm9yICFSZXFUeEFsaWduIGNhcmRzCisKKwlMSzEuMS4xMToKKwktIERhdmlkIFdvb2Rob3VzZTogU2V0IGRldi0+YmFzZV9hZGRyIGJlZm9yZSB0aGUgZmlyc3QgdGltZSB3ZSBjYWxsCisJCQkgICB3YWl0X2Zvcl9yZXNldCgpLiBJdCdzIGEgbG90IGhhcHBpZXIgdGhhdCB3YXkuCisJCQkgICBGcmVlIG5wLT50eF9idWZzIG9ubHkgaWYgd2UgYWN0dWFsbHkgYWxsb2NhdGVkIGl0LgorCisJTEsxLjEuMTI6CisJLSBNYXJ0aW4gRXJpa3Nzb246IEFsbG93IE1lbW9yeS1NYXBwZWQgSU8gdG8gYmUgZW5hYmxlZC4KKworCUxLMS4xLjEzIChqZ2FyemlrKToKKwktIEFkZCBldGh0b29sIHN1cHBvcnQKKwktIFJlcGxhY2Ugc29tZSBNSUktcmVsYXRlZCBtYWdpYyBudW1iZXJzIHdpdGggY29uc3RhbnRzCisKKwlMSzEuMS4xNCAoSXZhbiBHLik6CisJLSBmaXhlcyBjb21tZW50cyBmb3IgUmhpbmUtSUlJCisJLSByZW1vdmVzIFdfTUFYX1RJTUVPVVQgKHVudXNlZCkKKwktIGFkZHMgSGFzRGF2aWNvbVBoeSBmb3IgUmhpbmUtSSAoYmFzaXM6IGxpbnV4ZmV0IGRyaXZlcjsgbXkgY2FyZAorCSAgaXMgUi1JIGFuZCBoYXMgRGF2aWNvbSBjaGlwLCBmbGFnIGlzIHJlZmVyZW5jZWQgaW4ga2VybmVsIGRyaXZlcikKKwktIHNlbmRzIGNoaXBfaWQgYXMgYSBwYXJhbWV0ZXIgdG8gd2FpdF9mb3JfcmVzZXQgc2luY2UgbnAgaXMgbm90CisJICBpbml0aWFsaXplZCBvbiBmaXJzdCBjYWxsCisJLSBjaGFuZ2VzIG1taW8gImVsc2UgaWYgKGNoaXBfaWQ9PVZUNjEwMikiIHRvICJlbHNlIiBzbyBpdCB3aWxsIHdvcmsKKwkgIGZvciBSaGluZS1JSUkncyAoZG9jdW1lbnRhdGlvbiBzYXlzIHNhbWUgYml0IGlzIGNvcnJlY3QpCisJLSB0cmFuc21pdCBmcmFtZSBxdWV1ZSBtZXNzYWdlIGlzIG9mZiBieSBvbmUgLSBmaXhlZAorCS0gYWRkcyBJbnRyTm9ybWFsU3VtbWFyeSB0byAiU29tZXRoaW5nIFdpY2tlZCIgZXhjbHVzaW9uIGxpc3QKKwkgIHNvIG5vcm1hbCBpbnRlcnJ1cHRzIHdpbGwgbm90IHRyaWdnZXIgdGhlIG1lc3NhZ2UgKHNyYzogRG9uYWxkIEJlY2tlcikKKwkoUm9nZXIgTHVldGhpKQorCS0gc2hvdyBjb25mdXNlZCBjaGlwIHdoZXJlIHRvIGNvbnRpbnVlIGFmdGVyIFR4IGVycm9yCisJLSBsb2NhdGlvbiBvZiBjb2xsaXNpb24gY291bnRlciBpcyBjaGlwIHNwZWNpZmljCisJLSBhbGxvdyBzZWxlY3RpbmcgYmFja29mZiBhbGdvcml0aG0gKG1vZHVsZSBwYXJhbWV0ZXIpCisKKwlMSzEuMS4xNSAoamdhcnppayk6CisJLSBVc2UgbmV3IE1JSSBsaWIgaGVscGVyIGdlbmVyaWNfbWlpX2lvY3RsCisKKwlMSzEuMS4xNiAoUm9nZXIgTHVldGhpKQorCS0gRXRoZXJsZWFrIGZpeAorCS0gSGFuZGxlIFR4IGJ1ZmZlciB1bmRlcnJ1bgorCS0gRml4IGJ1Z3MgaW4gZnVsbCBkdXBsZXggaGFuZGxpbmcKKwktIE5ldyByZXNldCBjb2RlIHVzZXMgImZvcmNlIHJlc2V0IiBjbWQgb24gUmhpbmUtSUkKKwktIFZhcmlvdXMgY2xlYW4gdXBzCisKKwlMSzEuMS4xNyAoUm9nZXIgTHVldGhpKQorCS0gRml4IHJhY2UgaW4gdmlhX3JoaW5lX3N0YXJ0X3R4KCkKKwktIE9uIGVycm9ycywgd2FpdCBmb3IgVHggZW5naW5lIHRvIHR1cm4gb2ZmIGJlZm9yZSBzY2F2ZW5naW5nCisJLSBIYW5kbGUgVHggZGVzY3JpcHRvciB3cml0ZS1iYWNrIHJhY2Ugb24gUmhpbmUtSUkKKwktIEZvcmNlIGZsdXNoaW5nIGZvciBQQ0kgcG9zdGVkIHdyaXRlcworCS0gTW9yZSByZXNldCBjb2RlIGNoYW5nZXMKKworCUxLMS4xLjE4IChSb2dlciBMdWV0aGkpCisJLSBObyBmaWx0ZXJpbmcgbXVsdGljYXN0IGluIHByb21pc2MgbW9kZSAoRWR3YXJkIFBlbmcpCisJLSBGaXggZm9yIFJoaW5lLUkgVHggdGltZW91dHMKKworCUxLMS4xLjE5IChSb2dlciBMdWV0aGkpCisJLSBJbmNyZWFzZSBUeCB0aHJlc2hvbGQgZm9yIHVuc3BlY2lmaWVkIGVycm9ycworCisJTEsxLjIuMC0yLjYgKFJvZ2VyIEx1ZXRoaSkKKwktIE1hc3NpdmUgY2xlYW4tdXAKKwktIFJld3JpdGUgUEhZLCBtZWRpYSBoYW5kbGluZyAocmVtb3ZlIG9wdGlvbnMsIGZ1bGxfZHVwbGV4LCBiYWNrb2ZmKQorCS0gRml4IFR4IGVuZ2luZSByYWNlIGZvciBnb29kCisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJInZpYS1yaGluZSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMi4wLTIuNiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkp1bmUtMTAtMjAwNCIKKworCisvKiBBIGZldyB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiAqLworCitzdGF0aWMgaW50IGRlYnVnID0gMTsJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICAgU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWs7CisKKy8qCisgKiBJbiBjYXNlIHlvdSBhcmUgbG9va2luZyBmb3IgJ29wdGlvbnNbXScgb3IgJ2Z1bGxfZHVwbGV4W10nLCB0aGV5CisgKiBhcmUgZ29uZS4gVXNlIGV0aHRvb2woOCkgaW5zdGVhZC4KKyAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJoaW5lIGhhcyBhIDY0IGVsZW1lbnQgODM5MC1saWtlIGhhc2ggdGFibGUuICovCitzdGF0aWMgY29uc3QgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgVFhfUVVFVUVfTEVOCTEwCS8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMTYKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmM6djEuMTAtTEsiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlclxuIjsKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UuIFNvbWUgZWFybHkgdmVyc2lvbnMKKyAgIG9mIHRoZSBSaGluZSBtYXkgb25seSB3b3JrIGNvcnJlY3RseSB3aXRoIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gKi8KKyNpZmRlZiBDT05GSUdfVklBX1JISU5FX01NSU8KKyNkZWZpbmUgVVNFX01NSU8KKyNlbHNlCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVklBIFJoaW5lIFBDSSBGYXN0IEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiVklBIFJoaW5lIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlZJQSBSaGluZSBkZWJ1ZyBsZXZlbCAoMC03KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJWSUEgUmhpbmUgY29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKKworLyoKKwkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgVklBIDg2YzEwMEEgUmhpbmUtSUkgUENJIEZhc3QgRXRoZXJuZXQKK2NvbnRyb2xsZXIuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitCb2FyZHMgd2l0aCB0aGlzIGNoaXAgYXJlIGZ1bmN0aW9uYWwgb25seSBpbiBhIGJ1cy1tYXN0ZXIgUENJIHNsb3QuCisKK01hbnkgb3BlcmF0aW9uYWwgc2V0dGluZ3MgYXJlIGxvYWRlZCBmcm9tIHRoZSBFRVBST00gdG8gdGhlIENvbmZpZyB3b3JkIGF0CitvZmZzZXQgMHg3OC4gRm9yIG1vc3Qgb2YgdGhlc2Ugc2V0dGluZ3MsIHRoaXMgZHJpdmVyIGFzc3VtZXMgdGhhdCB0aGV5IGFyZQorY29ycmVjdC4KK0lmIHRoaXMgZHJpdmVyIGlzIGNvbXBpbGVkIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlIG9wZXJhdGlvbnMgdGhlIEVFUFJPTQorbXVzdCBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSBtZW1vcnkgb3BzLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK1RoaXMgZHJpdmVyIHVzZXMgdHdvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGZpeGVkLXNpemUgZGVzY3JpcHRvciBsaXN0cworZm9ybWVkIGludG8gcmluZ3MgYnkgYSBicmFuY2ggZnJvbSB0aGUgZmluYWwgZGVzY3JpcHRvciB0byB0aGUgYmVnaW5uaW5nIG9mCit0aGUgbGlzdC4gVGhlIHJpbmcgc2l6ZXMgYXJlIHNldCBhdCBjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLgorCitJSUliL2MuIFRyYW5zbWl0L1JlY2VpdmUgU3RydWN0dXJlCisKK1RoaXMgZHJpdmVyIGF0dGVtcHRzIHRvIHVzZSBhIHplcm8tY29weSByZWNlaXZlIGFuZCB0cmFuc21pdCBzY2hlbWUuCisKK0FsYXMsIGFsbCBkYXRhIGJ1ZmZlcnMgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LCBzbwordGhlIGRyaXZlciBtdXN0IG9mdGVuIGNvcHkgdHJhbnNtaXQgcGFja2V0cyBpbnRvIGJvdW5jZSBidWZmZXJzLgorCitUaGUgZHJpdmVyIGFsbG9jYXRlcyBmdWxsIGZyYW1lIHNpemUgc2tidWZmcyBmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdAorb3BlbigpIHRpbWUgYW5kIHBhc3NlcyB0aGUgc2tiLT5kYXRhIGZpZWxkIHRvIHRoZSBjaGlwIGFzIHJlY2VpdmUgZGF0YQorYnVmZmVycy4gV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2suIEJ1ZmZlcnMgY29uc3VtZWQgdGhpcyB3YXkgYXJlIHJlcGxhY2VkIGJ5IG5ld2x5IGFsbG9jYXRlZAorc2tidWZmcyBpbiB0aGUgbGFzdCBwaGFzZSBvZiByaGluZV9yeCgpLgorCitUaGUgUlhfQ09QWUJSRUFLIHZhbHVlIGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3VzaW5nIGEgZnVsbC1zaXplZCBza2J1ZmYgZm9yIHNtYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdHMgb2YgbGFyZ2VyCitmcmFtZXMuIE5ldyBib2FyZHMgYXJlIHR5cGljYWxseSB1c2VkIGluIGdlbmVyb3VzbHkgY29uZmlndXJlZCBtYWNoaW5lcworYW5kIHRoZSB1bmRlcmZpbGxlZCBidWZmZXJzIGhhdmUgbmVnbGlnaWJsZSBpbXBhY3QgY29tcGFyZWQgdG8gdGhlIGJlbmVmaXQgb2YKK2Egc2luZ2xlIGFsbG9jYXRpb24gc2l6ZSwgc28gdGhlIGRlZmF1bHQgdmFsdWUgb2YgemVybyByZXN1bHRzIGluIG5ldmVyCitjb3B5aW5nIHBhY2tldHMuIFdoZW4gY29weWluZyBpcyBkb25lLCB0aGUgY29zdCBpcyB1c3VhbGx5IG1pdGlnYXRlZCBieSB1c2luZworYSBjb21iaW5lZCBjb3B5L2NoZWNrc3VtIHJvdXRpbmUuIENvcHlpbmcgYWxzbyBwcmVsb2FkcyB0aGUgY2FjaGUsIHdoaWNoIGlzCittb3N0IHVzZWZ1bCB3aXRoIHNtYWxsIGZyYW1lcy4KKworU2luY2UgdGhlIFZJQSBjaGlwcyBhcmUgb25seSBhYmxlIHRvIHRyYW5zZmVyIGRhdGEgdG8gYnVmZmVycyBvbiAzMiBiaXQKK2JvdW5kYXJpZXMsIHRoZSBJUCBoZWFkZXIgYXQgb2Zmc2V0IDE0IGluIGFuIGV0aGVybmV0IGZyYW1lIGlzbid0Citsb25nd29yZCBhbGlnbmVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIENvcHlpbmcgdGhlc2UgdW5hbGlnbmVkIGJ1ZmZlcnMKK2hhcyB0aGUgYmVuZWZpY2lhbCBlZmZlY3Qgb2YgMTYtYnl0ZSBhbGlnbmluZyB0aGUgSVAgaGVhZGVyLgorCitJSUlkLiBTeW5jaHJvbml6YXRpb24KKworVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnByaXYtPmxvY2sgc3BpbmxvY2suIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaAoraXMgc2luZ2xlIHRocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgaW50ZXJydXB0IGhhbmRsaW5nIHNvZnR3YXJlLgorCitUaGUgc2VuZCBwYWNrZXQgdGhyZWFkIGhhcyBwYXJ0aWFsIGNvbnRyb2wgb3ZlciB0aGUgVHggcmluZy4gSXQgbG9ja3MgdGhlCitkZXYtPnByaXYtPmxvY2sgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dCBzbG90IGluIHRoZSByaW5nCitpcyBub3QgYXZhaWxhYmxlIGl0IHN0b3BzIHRoZSB0cmFuc21pdCBxdWV1ZSBieSBjYWxsaW5nIG5ldGlmX3N0b3BfcXVldWUuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBUeCBxdWV1ZSBlbnRyeSBhcworZW1wdHkgYnkgaW5jcmVtZW50aW5nIHRoZSBkaXJ0eV90eCBtYXJrLiBJZiBhdCBsZWFzdCBoYWxmIG9mIHRoZSBlbnRyaWVzIGluCit0aGUgUnggcmluZyBhcmUgYXZhaWxhYmxlIHRoZSB0cmFuc21pdCBxdWV1ZSBpcyB3b2tlbiB1cCBpZiBpdCB3YXMgc3RvcHBlZC4KKworSVYuIE5vdGVzCisKK0lWYi4gUmVmZXJlbmNlcworCitQcmVsaW1pbmFyeSBWVDg2QzEwMEEgbWFudWFsIGZyb20gaHR0cDovL3d3dy52aWEuY29tLnR3LworaHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0LzEwMG1icHMuaHRtbAoraHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0L05XYXkuaHRtbAorZnRwOi8vZnRwLnZpYS5jb20udHcvcHVibGljL2xhbi9Qcm9kdWN0cy9OSUMvVlQ4NkMxMDBBL0RhdGFzaGVldC9WVDg2QzEwMEEwMy5wZGYKK2Z0cDovL2Z0cC52aWEuY29tLnR3L3B1YmxpYy9sYW4vUHJvZHVjdHMvTklDL1ZUNjEwMi9EYXRhc2hlZXQvVlQ2MTAyXzAyMS5QREYKKworCitJVmMuIEVycmF0YQorCitUaGUgVlQ4NkMxMDBBIG1hbnVhbCBpcyBub3QgcmVsaWFibGUgaW5mb3JtYXRpb24uCitUaGUgMzA0MyBjaGlwIGRvZXMgbm90IGhhbmRsZSB1bmFsaWduZWQgdHJhbnNtaXQgb3IgcmVjZWl2ZSBidWZmZXJzLCByZXN1bHRpbmcKK2luIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGZvciBib3VuY2UgYnVmZmVyIGNvcGllcyBvbiB0cmFuc21pdAorYW5kIHVuYWxpZ25lZCBJUCBoZWFkZXJzIG9uIHJlY2VpdmUuCitUaGUgY2hpcCBkb2VzIG5vdCBwYWQgdG8gbWluaW11bSB0cmFuc21pdCBsZW5ndGguCisKKyovCisKKworLyogVGhpcyB0YWJsZSBkcml2ZXMgdGhlIFBDSSBwcm9iZSByb3V0aW5lcy4gSXQncyBtb3N0bHkgYm9pbGVycGxhdGUgaW4gYWxsCisgICBvZiB0aGUgZHJpdmVycywgYW5kIHdpbGwgbGlrZWx5IGJlIHByb3ZpZGVkIGJ5IHNvbWUgZnV0dXJlIGtlcm5lbC4KKyAgIE5vdGUgdGhlIG1hdGNoaW5nIGNvZGUgLS0gdGhlIGZpcnN0IHRhYmxlIGVudHJ5IG1hdGNocyBhbGwgNTYqKiBjYXJkcyBidXQKKyAgIHNlY29uZCBvbmx5IHRoZSAxMjM0IGNhcmQuCisqLworCitlbnVtIHJoaW5lX3JldnMgeworCVZUODZDMTAwQQk9IDB4MDAsCisJVlR1bmtub3duMAk9IDB4MjAsCisJVlQ2MTAyCQk9IDB4NDAsCisJVlQ4MjMxCQk9IDB4NTAsCS8qIEludGVncmF0ZWQgTUFDICovCisJVlQ4MjMzCQk9IDB4NjAsCS8qIEludGVncmF0ZWQgTUFDICovCisJVlQ4MjM1CQk9IDB4NzQsCS8qIEludGVncmF0ZWQgTUFDICovCisJVlQ4MjM3CQk9IDB4NzgsCS8qIEludGVncmF0ZWQgTUFDICovCisJVlR1bmtub3duMQk9IDB4N0MsCisJVlQ2MTA1CQk9IDB4ODAsCisJVlQ2MTA1X0IwCT0gMHg4MywKKwlWVDYxMDVMCQk9IDB4OEEsCisJVlQ2MTA3CQk9IDB4OEMsCisJVlR1bmtub3duMgk9IDB4OEUsCisJVlQ2MTA1TQkJPSAweDkwLAkvKiBNYW5hZ2VtZW50IGFkYXB0ZXIgKi8KK307CisKK2VudW0gcmhpbmVfcXVpcmtzIHsKKwlycVdPTAkJPSAweDAwMDEsCS8qIFdha2UtT24tTEFOIHN1cHBvcnQgKi8KKwlycUZvcmNlUmVzZXQJPSAweDAwMDIsCisJcnE2cGF0dGVybnMJPSAweDAwNDAsCS8qIDYgaW5zdGVhZCBvZiA0IHBhdHRlcm5zIGZvciBXT0wgKi8KKwlycVN0YXR1c1dCUmFjZQk9IDB4MDA4MCwJLyogVHggU3RhdHVzIFdyaXRlYmFjayBFcnJvciBwb3NzaWJsZSAqLworCXJxUmhpbmVJCT0gMHgwMTAwLAkvKiBTZWUgY29tbWVudCBiZWxvdyAqLworfTsKKy8qCisgKiBycVJoaW5lSTogVlQ4NkMxMDBBIChha2EgUmhpbmUtSSkgdXNlcyBkaWZmZXJlbnQgYml0cyB0byBlbmFibGUKKyAqIE1NSU8gYXMgd2VsbCBhcyBmb3IgdGhlIGNvbGxpc2lvbiBjb3VudGVyIGFuZCB0aGUgVHggRklGTyB1bmRlcmZsb3cKKyAqIGluZGljYXRvci4gSW4gYWRkaXRpb24sIFR4IGFuZCBSeCBidWZmZXJzIG5lZWQgdG8gNCBieXRlIGFsaWduZWQuCisgKi8KKworLyogQmV3YXJlIG9mIFBDSSBwb3N0ZWQgd3JpdGVzICovCisjZGVmaW5lIElPU1lOQwlkbyB7IGlvcmVhZDgoaW9hZGRyICsgU3RhdGlvbkFkZHIpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcmhpbmVfcGNpX3RibFtdID0KK3sKKwl7MHgxMTA2LCAweDMwNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sIC8qIFZUODZDMTAwQSAqLworCXsweDExMDYsIDB4MzA2NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwgLyogVlQ2MTAyICovCisJezB4MTEwNiwgMHgzMTA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB9LCAvKiA2MTA1eyxMLExPTX0gKi8KKwl7MHgxMTA2LCAweDMwNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sIC8qIFZUNjEwNU0gKi8KKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcmhpbmVfcGNpX3RibCk7CisKKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KK2VudW0gcmVnaXN0ZXJfb2Zmc2V0cyB7CisJU3RhdGlvbkFkZHI9MHgwMCwgUnhDb25maWc9MHgwNiwgVHhDb25maWc9MHgwNywgQ2hpcENtZD0weDA4LAorCUNoaXBDbWQxPTB4MDksCisJSW50clN0YXR1cz0weDBDLCBJbnRyRW5hYmxlPTB4MEUsCisJTXVsdGljYXN0RmlsdGVyMD0weDEwLCBNdWx0aWNhc3RGaWx0ZXIxPTB4MTQsCisJUnhSaW5nUHRyPTB4MTgsIFR4UmluZ1B0cj0weDFDLCBHRklGT1Rlc3Q9MHg1NCwKKwlNSUlQaHlBZGRyPTB4NkMsIE1JSVN0YXR1cz0weDZELCBQQ0lCdXNDb25maWc9MHg2RSwKKwlNSUlDbWQ9MHg3MCwgTUlJUmVnQWRkcj0weDcxLCBNSUlEYXRhPTB4NzIsIE1BQ1JlZ0VFY3NyPTB4NzQsCisJQ29uZmlnQT0weDc4LCBDb25maWdCPTB4NzksIENvbmZpZ0M9MHg3QSwgQ29uZmlnRD0weDdCLAorCVJ4TWlzc2VkPTB4N0MsIFJ4Q1JDRXJycz0weDdFLCBNaXNjQ21kPTB4ODEsCisJU3RpY2t5SFc9MHg4MywgSW50clN0YXR1czI9MHg4NCwKKwlXT0xjclNldD0weEEwLCBQd2NmZ1NldD0weEExLCBXT0xjZ1NldD0weEEzLCBXT0xjckNscj0weEE0LAorCVdPTGNyQ2xyMT0weEE2LCBXT0xjZ0Nscj0weEE3LAorCVB3cmNzclNldD0weEE4LCBQd3Jjc3JTZXQxPTB4QTksIFB3cmNzckNscj0weEFDLCBQd3Jjc3JDbHIxPTB4QUQsCit9OworCisvKiBCaXRzIGluIENvbmZpZ0QgKi8KK2VudW0gYmFja29mZl9iaXRzIHsKKwlCYWNrT3B0aW9uYWw9MHgwMSwgQmFja01vZGlmeT0weDAyLAorCUJhY2tDYXB0dXJlRWZmZWN0PTB4MDQsIEJhY2tSYW5kb209MHgwOAorfTsKKworI2lmZGVmIFVTRV9NTUlPCisvKiBSZWdpc3RlcnMgd2UgY2hlY2sgdGhhdCBtbWlvIGFuZCByZWcgYXJlIHRoZSBzYW1lLiAqLworc3RhdGljIGNvbnN0IGludCBtbWlvX3ZlcmlmeV9yZWdpc3RlcnNbXSA9IHsKKwlSeENvbmZpZywgVHhDb25maWcsIEludHJFbmFibGUsIENvbmZpZ0EsIENvbmZpZ0IsIENvbmZpZ0MsIENvbmZpZ0QsCisJMAorfTsKKyNlbmRpZgorCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyUnhEb25lPTB4MDAwMSwgSW50clJ4RXJyPTB4MDAwNCwgSW50clJ4RW1wdHk9MHgwMDIwLAorCUludHJUeERvbmU9MHgwMDAyLCBJbnRyVHhFcnJvcj0weDAwMDgsIEludHJUeFVuZGVycnVuPTB4MDIxMCwKKwlJbnRyUENJRXJyPTB4MDA0MCwKKwlJbnRyU3RhdHNNYXg9MHgwMDgwLCBJbnRyUnhFYXJseT0weDAxMDAsCisJSW50clJ4T3ZlcmZsb3c9MHgwNDAwLCBJbnRyUnhEcm9wcGVkPTB4MDgwMCwgSW50clJ4Tm9CdWY9MHgxMDAwLAorCUludHJUeEFib3J0ZWQ9MHgyMDAwLCBJbnRyTGlua0NoYW5nZT0weDQwMDAsCisJSW50clJ4V2FrZVVwPTB4ODAwMCwKKwlJbnRyTm9ybWFsU3VtbWFyeT0weDAwMDMsIEludHJBYm5vcm1hbFN1bW1hcnk9MHhDMjYwLAorCUludHJUeERlc2NSYWNlPTB4MDgwMDAwLAkvKiBtYXBwZWQgZnJvbSBJbnRyU3RhdHVzMiAqLworCUludHJUeEVyclN1bW1hcnk9MHgwODIyMTgsCit9OworCisvKiBCaXRzIGluIFdPTGNyU2V0L1dPTGNyQ2xyIGFuZCBQd3Jjc3JTZXQvUHdyY3NyQ2xyICovCitlbnVtIHdvbF9iaXRzIHsKKwlXT0x1Y2FzdAk9IDB4MTAsCisJV09MbWFnaWMJPSAweDIwLAorCVdPTGJtY2FzdAk9IDB4MzAsCisJV09MbG5rb24JPSAweDQwLAorCVdPTGxua29mZgk9IDB4ODAsCit9OworCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCByeF9kZXNjIHsKKwlzMzIgcnhfc3RhdHVzOworCXUzMiBkZXNjX2xlbmd0aDsgLyogQ2hhaW4gZmxhZywgQnVmZmVyL2ZyYW1lIGxlbmd0aCAqLworCXUzMiBhZGRyOworCXUzMiBuZXh0X2Rlc2M7Cit9Oworc3RydWN0IHR4X2Rlc2MgeworCXMzMiB0eF9zdGF0dXM7CisJdTMyIGRlc2NfbGVuZ3RoOyAvKiBDaGFpbiBmbGFnLCBUeCBDb25maWcsIEZyYW1lIGxlbmd0aCAqLworCXUzMiBhZGRyOworCXUzMiBuZXh0X2Rlc2M7Cit9OworCisvKiBJbml0aWFsIHZhbHVlIGZvciB0eF9kZXNjLmRlc2NfbGVuZ3RoLCBCdWZmZXIgc2l6ZSBnb2VzIHRvIGJpdHMgMC0xMCAqLworI2RlZmluZSBUWERFU0MJCTB4MDBlMDgwMDAKKworZW51bSByeF9zdGF0dXNfYml0cyB7CisJUnhPSz0weDgwMDAsIFJ4V2hvbGVQa3Q9MHgwMzAwLCBSeEVycj0weDAwOEYKK307CisKKy8qIEJpdHMgaW4gKl9kZXNjLipfc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworCURlc2NPd249MHg4MDAwMDAwMAorfTsKKworLyogQml0cyBpbiBDaGlwQ21kLiAqLworZW51bSBjaGlwX2NtZF9iaXRzIHsKKwlDbWRJbml0PTB4MDEsIENtZFN0YXJ0PTB4MDIsIENtZFN0b3A9MHgwNCwgQ21kUnhPbj0weDA4LAorCUNtZFR4T249MHgxMCwgQ21kMVR4RGVtYW5kPTB4MjAsIENtZFJ4RGVtYW5kPTB4NDAsCisJQ21kMUVhcmx5Ung9MHgwMSwgQ21kMUVhcmx5VHg9MHgwMiwgQ21kMUZEdXBsZXg9MHgwNCwKKwlDbWQxTm9UeFBvbGw9MHgwOCwgQ21kMVJlc2V0PTB4ODAsCit9OworCitzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyAqLworCXN0cnVjdCByeF9kZXNjICpyeF9yaW5nOworCXN0cnVjdCB0eF9kZXNjICp0eF9yaW5nOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKworCS8qIFRoZSBhZGRyZXNzZXMgb2YgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90IHJ4X3NrYnVmZl9kbWFbUlhfUklOR19TSVpFXTsKKworCS8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3IgbGF0ZXIgZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90IHR4X3NrYnVmZl9kbWFbVFhfUklOR19TSVpFXTsKKworCS8qIFR4IGJvdW5jZSBidWZmZXJzICovCisJdW5zaWduZWQgY2hhciAqdHhfYnVmW1RYX1JJTkdfU0laRV07CisJdW5zaWduZWQgY2hhciAqdHhfYnVmczsKKwlkbWFfYWRkcl90IHR4X2J1ZnNfZG1hOworCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJbG9uZyBwaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworCXUzMiBxdWlya3M7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4X2hlYWRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwl1OCB3b2xvcHRzOworCisJdTggdHhfdGhyZXNoLCByeF90aHJlc2g7CisKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKK3N0YXRpYyBpbnQgIG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50ICByaGluZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmhpbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHJoaW5lX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHJoaW5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJoaW5lX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmhpbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByaGluZV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIHZvaWQgcmhpbmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJoaW5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaW50ICByaGluZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpnZGV2KTsKKworI2RlZmluZSBSSElORV9XQUlUX0ZPUihjb25kaXRpb24pIGRvIHsJCQkJCVwKKwlpbnQgaT0xMDI0OwkJCQkJCQlcCisJd2hpbGUgKCEoY29uZGl0aW9uKSAmJiAtLWkpCQkJCQlcCisJCTsJCQkJCQkJXAorCWlmIChkZWJ1ZyA+IDEgJiYgaSA8IDUxMikJCQkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICU0ZCBjeWNsZXMgdXNlZCBAICVzOiVkXG4iLAlcCisJCQkJRFJWX05BTUUsIDEwMjQtaSwgX19mdW5jX18sIF9fTElORV9fKTsJXAorfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfaW50cl9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJdTMyIGludHJfc3RhdHVzOworCisJaW50cl9zdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkvKiBPbiBSaGluZS1JSSwgQml0IDMgaW5kaWNhdGVzIFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlLiAqLworCWlmIChycC0+cXVpcmtzICYgcnFTdGF0dXNXQlJhY2UpCisJCWludHJfc3RhdHVzIHw9IGlvcmVhZDgoaW9hZGRyICsgSW50clN0YXR1czIpIDw8IDE2OworCXJldHVybiBpbnRyX3N0YXR1czsKK30KKworLyoKKyAqIEdldCBwb3dlciByZWxhdGVkIHJlZ2lzdGVycyBpbnRvIHNhbmUgc3RhdGUuCisgKiBOb3RpZnkgdXNlciBhYm91dCBwYXN0IFdPTCBldmVudC4KKyAqLworc3RhdGljIHZvaWQgcmhpbmVfcG93ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwl1MTYgd29sc3RhdDsKKworCWlmIChycC0+cXVpcmtzICYgcnFXT0wpIHsKKwkJLyogTWFrZSBzdXJlIGNoaXAgaXMgaW4gcG93ZXIgc3RhdGUgRDAgKi8KKwkJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBTdGlja3lIVykgJiAweEZDLCBpb2FkZHIgKyBTdGlja3lIVyk7CisKKwkJLyogRGlzYWJsZSAiZm9yY2UgUE1FLWVuYWJsZSIgKi8KKwkJaW93cml0ZTgoMHg4MCwgaW9hZGRyICsgV09MY2dDbHIpOworCisJCS8qIENsZWFyIHBvd2VyLWV2ZW50IGNvbmZpZyBiaXRzIChXT0wpICovCisJCWlvd3JpdGU4KDB4RkYsIGlvYWRkciArIFdPTGNyQ2xyKTsKKwkJLyogTW9yZSByZWNlbnQgY2FyZHMgY2FuIG1hbmFnZSB0d28gYWRkaXRpb25hbCBwYXR0ZXJucyAqLworCQlpZiAocnAtPnF1aXJrcyAmIHJxNnBhdHRlcm5zKQorCQkJaW93cml0ZTgoMHgwMywgaW9hZGRyICsgV09MY3JDbHIxKTsKKworCQkvKiBTYXZlIHBvd2VyLWV2ZW50IHN0YXR1cyBiaXRzICovCisJCXdvbHN0YXQgPSBpb3JlYWQ4KGlvYWRkciArIFB3cmNzclNldCk7CisJCWlmIChycC0+cXVpcmtzICYgcnE2cGF0dGVybnMpCisJCQl3b2xzdGF0IHw9IChpb3JlYWQ4KGlvYWRkciArIFB3cmNzclNldDEpICYgMHgwMykgPDwgODsKKworCQkvKiBDbGVhciBwb3dlci1ldmVudCBzdGF0dXMgYml0cyAqLworCQlpb3dyaXRlOCgweEZGLCBpb2FkZHIgKyBQd3Jjc3JDbHIpOworCQlpZiAocnAtPnF1aXJrcyAmIHJxNnBhdHRlcm5zKQorCQkJaW93cml0ZTgoMHgwMywgaW9hZGRyICsgUHdyY3NyQ2xyMSk7CisKKwkJaWYgKHdvbHN0YXQpIHsKKwkJCWNoYXIgKnJlYXNvbjsKKwkJCXN3aXRjaCAod29sc3RhdCkgeworCQkJY2FzZSBXT0xtYWdpYzoKKwkJCQlyZWFzb24gPSAiTWFnaWMgcGFja2V0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV09MbG5rb246CisJCQkJcmVhc29uID0gIkxpbmsgd2VudCB1cCI7CisJCQkJYnJlYWs7CisJCQljYXNlIFdPTGxua29mZjoKKwkJCQlyZWFzb24gPSAiTGluayB3ZW50IGRvd24iOworCQkJCWJyZWFrOworCQkJY2FzZSBXT0x1Y2FzdDoKKwkJCQlyZWFzb24gPSAiVW5pY2FzdCBwYWNrZXQiOworCQkJCWJyZWFrOworCQkJY2FzZSBXT0xibWNhc3Q6CisJCQkJcmVhc29uID0gIk11bHRpY2FzdC9icm9hZGNhc3QgcGFja2V0IjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmVhc29uID0gIlVua25vd24iOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdva2Ugc3lzdGVtIHVwLiBSZWFzb246ICVzLlxuIiwKKwkJCSAgICAgICBEUlZfTkFNRSwgcmVhc29uKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmhpbmVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCWlvd3JpdGU4KENtZDFSZXNldCwgaW9hZGRyICsgQ2hpcENtZDEpOworCUlPU1lOQzsKKworCWlmIChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSAmIENtZDFSZXNldCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzZXQgbm90IGNvbXBsZXRlIHlldC4gIgorCQkJIlRyeWluZyBoYXJkZXIuXG4iLCBEUlZfTkFNRSk7CisKKwkJLyogRm9yY2UgcmVzZXQgKi8KKwkJaWYgKHJwLT5xdWlya3MgJiBycUZvcmNlUmVzZXQpCisJCQlpb3dyaXRlOCgweDQwLCBpb2FkZHIgKyBNaXNjQ21kKTsKKworCQkvKiBSZXNldCBjYW4gdGFrZSBzb21ld2hhdCBsb25nZXIgKHJhcmUpICovCisJCVJISU5FX1dBSVRfRk9SKCEoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kMSkgJiBDbWQxUmVzZXQpKTsKKwl9CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzZXQgJXMuXG4iLCBkZXYtPm5hbWUsCisJCQkoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kMSkgJiBDbWQxUmVzZXQpID8KKwkJCSJmYWlsZWQiIDogInN1Y2NlZWRlZCIpOworfQorCisjaWZkZWYgVVNFX01NSU8KK3N0YXRpYyB2b2lkIGVuYWJsZV9tbWlvKGxvbmcgcGlvYWRkciwgdTMyIHF1aXJrcykKK3sKKwlpbnQgbjsKKwlpZiAocXVpcmtzICYgcnFSaGluZUkpIHsKKwkJLyogTW9yZSByZWNlbnQgZG9jcyBzYXkgdGhhdCB0aGlzIGJpdCBpcyByZXNlcnZlZCAuLi4gKi8KKwkJbiA9IGluYihwaW9hZGRyICsgQ29uZmlnQSkgfCAweDIwOworCQlvdXRiKG4sIHBpb2FkZHIgKyBDb25maWdBKTsKKwl9IGVsc2UgeworCQluID0gaW5iKHBpb2FkZHIgKyBDb25maWdEKSB8IDB4ODA7CisJCW91dGIobiwgcGlvYWRkciArIENvbmZpZ0QpOworCX0KK30KKyNlbmRpZgorCisvKgorICogTG9hZHMgYnl0ZXMgMHgwMC0weDA1LCAweDZFLTB4NkYsIDB4NzgtMHg3QiBmcm9tIEVFUFJPTQorICogKHBsdXMgMHg2QyBmb3IgUmhpbmUtSS9JSSkKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHJoaW5lX3JlbG9hZF9lZXByb20obG9uZyBwaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCW91dGIoMHgyMCwgcGlvYWRkciArIE1BQ1JlZ0VFY3NyKTsKKwlSSElORV9XQUlUX0ZPUighKGluYihwaW9hZGRyICsgTUFDUmVnRUVjc3IpICYgMHgyMCkpOworCisjaWZkZWYgVVNFX01NSU8KKwkvKgorCSAqIFJlbG9hZGluZyBmcm9tIEVFUFJPTSBvdmVyd3JpdGVzIENvbmZpZ0EtRCwgc28gd2UgbXVzdCByZS1lbmFibGUKKwkgKiBNTUlPLiBJZiByZWxvYWRpbmcgRUVQUk9NIHdhcyBkb25lIGZpcnN0IHRoaXMgY291bGQgYmUgYXZvaWRlZCwgYnV0CisJICogaXQgaXMgbm90IGtub3duIGlmIHRoYXQgc3RpbGwgd29ya3Mgd2l0aCB0aGUgIndpbjk4LXJlYm9vdCIgcHJvYmxlbS4KKwkgKi8KKwllbmFibGVfbW1pbyhwaW9hZGRyLCBycC0+cXVpcmtzKTsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgRUVQUk9NLWNvbnRyb2xsZWQgd2FrZS11cCAobWFnaWMgcGFja2V0KSAqLworCWlmIChycC0+cXVpcmtzICYgcnFXT0wpCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ29uZmlnQSkgJiAweEZDLCBpb2FkZHIgKyBDb25maWdBKTsKKworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHJoaW5lX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJcmhpbmVfaW50ZXJydXB0KGRldi0+aXJxLCAodm9pZCAqKWRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmhpbmVfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBsb25nIHBpb2FkZHIpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJcmhpbmVfY2hpcF9yZXNldChkZXYpOworCisJLyogUmhpbmUtSSBuZWVkcyBleHRyYSB0aW1lIHRvIHJlY3VwZXJhdGUgYmVmb3JlIEVFUFJPTSByZWxvYWQgKi8KKwlpZiAocnAtPnF1aXJrcyAmIHJxUmhpbmVJKQorCQltc2xlZXAoNSk7CisKKwkvKiBSZWxvYWQgRUVQUk9NIGNvbnRyb2xsZWQgYnl0ZXMgY2xlYXJlZCBieSBzb2Z0IHJlc2V0ICovCisJcmhpbmVfcmVsb2FkX2VlcHJvbShwaW9hZGRyLCBkZXYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByaGluZV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCByaGluZV9wcml2YXRlICpycDsKKwlpbnQgaSwgcmM7CisJdTggcGNpX3JldjsKKwl1MzIgcXVpcmtzOworCWxvbmcgcGlvYWRkcjsKKwlsb25nIG1lbWFkZHI7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJaW50IGlvX3NpemUsIHBoeV9pZDsKKwljb25zdCBjaGFyICpuYW1lOworI2lmZGVmIFVTRV9NTUlPCisJaW50IGJhciA9IDE7CisjZWxzZQorCWludCBiYXIgPSAwOworI2VuZGlmCisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwlpb19zaXplID0gMjU2OworCXBoeV9pZCA9IDA7CisJcXVpcmtzID0gMDsKKwluYW1lID0gIlJoaW5lIjsKKwlpZiAocGNpX3JldiA8IFZUdW5rbm93bjApIHsKKwkJcXVpcmtzID0gcnFSaGluZUk7CisJCWlvX3NpemUgPSAxMjg7CisJfQorCWVsc2UgaWYgKHBjaV9yZXYgPj0gVlQ2MTAyKSB7CisJCXF1aXJrcyA9IHJxV09MIHwgcnFGb3JjZVJlc2V0OworCQlpZiAocGNpX3JldiA8IFZUNjEwNSkgeworCQkJbmFtZSA9ICJSaGluZSBJSSI7CisJCQlxdWlya3MgfD0gcnFTdGF0dXNXQlJhY2U7CS8qIFJoaW5lLUlJIGV4Y2x1c2l2ZSAqLworCQl9CisJCWVsc2UgeworCQkJcGh5X2lkID0gMTsJLyogSW50ZWdyYXRlZCBQSFksIHBoeV9pZCBmaXhlZCB0byAxICovCisJCQlpZiAocGNpX3JldiA+PSBWVDYxMDVfQjApCisJCQkJcXVpcmtzIHw9IHJxNnBhdHRlcm5zOworCQkJaWYgKHBjaV9yZXYgPCBWVDYxMDVNKQorCQkJCW5hbWUgPSAiUmhpbmUgSUlJIjsKKwkJCWVsc2UKKwkJCQluYW1lID0gIlJoaW5lIElJSSAoTWFuYWdlbWVudCBBZGFwdGVyKSI7CisJCX0KKwl9CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZCAqLworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCBieSAiCisJCSAgICAgICAidGhlIGNhcmQhP1xuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBpb19zaXplKSB8fAorCSAgICAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSA8IGlvX3NpemUpKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnN1ZmZpY2llbnQgUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcGlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwltZW1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHJoaW5lX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQlyYyA9IC1FTk9NRU07CisJCXByaW50ayhLRVJOX0VSUiAiYWxsb2NfZXRoZXJkZXYgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlycC0+cXVpcmtzID0gcXVpcmtzOworCXJwLT5waW9hZGRyID0gcGlvYWRkcjsKKwlycC0+cGRldiA9IHBkZXY7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgaW9fc2l6ZSk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgImlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXMsIHJlZ2lvbiAweCVYICIKKwkJICAgICAgICJAIDB4JWxYXG4iLCBwY2lfbmFtZShwZGV2KSwgaW9fc2l6ZSwgbWVtYWRkcik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKyNpZmRlZiBVU0VfTU1JTworCWVuYWJsZV9tbWlvKHBpb2FkZHIsIHF1aXJrcyk7CisKKwkvKiBDaGVjayB0aGF0IHNlbGVjdGVkIE1NSU8gcmVnaXN0ZXJzIG1hdGNoIHRoZSBQSU8gb25lcyAqLworCWkgPSAwOworCXdoaWxlIChtbWlvX3ZlcmlmeV9yZWdpc3RlcnNbaV0pIHsKKwkJaW50IHJlZyA9IG1taW9fdmVyaWZ5X3JlZ2lzdGVyc1tpKytdOworCQl1bnNpZ25lZCBjaGFyIGEgPSBpbmIocGlvYWRkcityZWcpOworCQl1bnNpZ25lZCBjaGFyIGIgPSByZWFkYihpb2FkZHIrcmVnKTsKKwkJaWYgKGEgIT0gYikgeworCQkJcmMgPSAtRUlPOworCQkJcHJpbnRrKEtFUk5fRVJSICJNTUlPIGRvIG5vdCBtYXRjaCBQSU8gWyUwMnhdICIKKwkJCSAgICAgICAiKCUwMnggIT0gJTAyeClcbiIsIHJlZywgYSwgYik7CisJCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJCX0KKwl9CisjZW5kaWYgLyogVVNFX01NSU8gKi8KKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCXJwLT5iYXNlID0gaW9hZGRyOworCisJLyogR2V0IGNoaXAgcmVnaXN0ZXJzIGludG8gYSBzYW5lIHN0YXRlICovCisJcmhpbmVfcG93ZXJfaW5pdChkZXYpOworCXJoaW5lX2h3X2luaXQoZGV2LCBwaW9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpb3JlYWQ4KGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgTUFDIGFkZHJlc3NcbiIpOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJfQorCisJLyogRm9yIFJoaW5lLUkvSUksIHBoeV9pZCBpcyBsb2FkZWQgZnJvbSBFRVBST00gKi8KKwlpZiAoIXBoeV9pZCkKKwkJcGh5X2lkID0gaW9yZWFkOChpb2FkZHIgKyAweDZDKTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJc3Bpbl9sb2NrX2luaXQoJnJwLT5sb2NrKTsKKwlycC0+bWlpX2lmLmRldiA9IGRldjsKKwlycC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlycC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCXJwLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworCXJwLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKworCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gcmhpbmVfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHJoaW5lX3N0YXJ0X3R4OworCWRldi0+c3RvcCA9IHJoaW5lX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gcmhpbmVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcmhpbmVfc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9IG5ldGRldl9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSByaGluZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSByaGluZV9wb2xsOworI2VuZGlmCisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHfE5FVElGX0ZfSFdfQ1NVTTsKKworCS8qIGRldi0+bmFtZSBub3QgZGVmaW5lZCBiZWZvcmUgcmVnaXN0ZXJfbmV0ZGV2KCkhICovCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBWSUEgJXMgYXQgMHglbHgsICIsCisJICAgICAgIGRldi0+bmFtZSwgbmFtZSwKKyNpZmRlZiBVU0VfTU1JTworCQltZW1hZGRyCisjZWxzZQorCQkobG9uZylpb2FkZHIKKyNlbmRpZgorCQkgKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgcGRldi0+aXJxKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJeworCQl1MTYgbWlpX2NtZDsKKwkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHlfaWQsIDEpOworCQltaWlfY21kID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCBNSUlfQk1DUikgJiB+Qk1DUl9JU09MQVRFOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2lkLCBNSUlfQk1DUiwgbWlpX2NtZCk7CisJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJcnAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgNCk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICIKKwkJCSAgICAgICAiJWQsIHN0YXR1cyAweCU0LjR4IGFkdmVydGlzaW5nICU0LjR4ICIKKwkJCSAgICAgICAiTGluayAlNC40eC5cbiIsIGRldi0+bmFtZSwgcGh5X2lkLAorCQkJICAgICAgIG1paV9zdGF0dXMsIHJwLT5taWlfaWYuYWR2ZXJ0aXNpbmcsCisJCQkgICAgICAgbWRpb19yZWFkKGRldiwgcGh5X2lkLCA1KSk7CisKKwkJCS8qIHNldCBJRkZfUlVOTklORyAqLworCQkJaWYgKG1paV9zdGF0dXMgJiBCTVNSX0xTVEFUVVMpCisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJZWxzZQorCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJfQorCX0KKwlycC0+bWlpX2lmLnBoeV9pZCA9IHBoeV9pZDsKKworCXJldHVybiAwOworCitlcnJfb3V0X3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhbGxvY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICpyaW5nOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisKKwlyaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocnAtPnBkZXYsCisJCQkJICAgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKworCQkJCSAgICBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpLAorCQkJCSAgICAmcmluZ19kbWEpOworCWlmICghcmluZykgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAocnAtPnF1aXJrcyAmIHJxUmhpbmVJKSB7CisJCXJwLT50eF9idWZzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocnAtPnBkZXYsCisJCQkJCQkgICBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFLAorCQkJCQkJICAgJnJwLT50eF9idWZzX2RtYSk7CisJCWlmIChycC0+dHhfYnVmcyA9PSBOVUxMKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJCSAgICBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsKKwkJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCQkgICAgcmluZywgcmluZ19kbWEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlycC0+cnhfcmluZyA9IHJpbmc7CisJcnAtPnR4X3JpbmcgPSByaW5nICsgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwlycC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKwlycC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYSArIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocnAtPnBkZXYsCisJCQkgICAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArCisJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCSAgICBycC0+cnhfcmluZywgcnAtPnJ4X3JpbmdfZG1hKTsKKwlycC0+dHhfcmluZyA9IE5VTEw7CisKKwlpZiAocnAtPnR4X2J1ZnMpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocnAtPnBkZXYsIFBLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkUsCisJCQkJICAgIHJwLT50eF9idWZzLCBycC0+dHhfYnVmc19kbWEpOworCisJcnAtPnR4X2J1ZnMgPSBOVUxMOworCit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX3JidWZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkbWFfYWRkcl90IG5leHQ7CisJaW50IGk7CisKKwlycC0+ZGlydHlfcnggPSBycC0+Y3VyX3J4ID0gMDsKKworCXJwLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKwlycC0+cnhfaGVhZF9kZXNjID0gJnJwLT5yeF9yaW5nWzBdOworCW5leHQgPSBycC0+cnhfcmluZ19kbWE7CisKKwkvKiBJbml0IHRoZSByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAtPnJ4X3JpbmdbaV0ucnhfc3RhdHVzID0gMDsKKwkJcnAtPnJ4X3JpbmdbaV0uZGVzY19sZW5ndGggPSBjcHVfdG9fbGUzMihycC0+cnhfYnVmX3N6KTsKKwkJbmV4dCArPSBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworCQlycC0+cnhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihuZXh0KTsKKwkJcnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisJcnAtPnJ4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihycC0+cnhfcmluZ19kbWEpOworCisJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IocnAtPnJ4X2J1Zl9zeik7CisJCXJwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsgICAgICAgICAgICAgICAgIC8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKworCQlycC0+cnhfc2tidWZmX2RtYVtpXSA9CisJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT50YWlsLCBycC0+cnhfYnVmX3N6LAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+cnhfc2tidWZmX2RtYVtpXSk7CisJCXJwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCX0KKwlycC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cyA9IDA7CisJCXJwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMigweEJBREYwMEQwKTsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAocnAtPnJ4X3NrYnVmZltpXSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQkJIHJwLT5yeF9za2J1ZmZfZG1hW2ldLAorCQkJCQkgcnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IocnAtPnJ4X3NrYnVmZltpXSk7CisJCX0KKwkJcnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGxvY190YnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdCBuZXh0OworCWludCBpOworCisJcnAtPmRpcnR5X3R4ID0gcnAtPmN1cl90eCA9IDA7CisJbmV4dCA9IHJwLT50eF9yaW5nX2RtYTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCXJwLT50eF9yaW5nW2ldLnR4X3N0YXR1cyA9IDA7CisJCXJwLT50eF9yaW5nW2ldLmRlc2NfbGVuZ3RoID0gY3B1X3RvX2xlMzIoVFhERVNDKTsKKwkJbmV4dCArPSBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpOworCQlycC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihuZXh0KTsKKwkJcnAtPnR4X2J1ZltpXSA9ICZycC0+dHhfYnVmc1tpICogUEtUX0JVRl9TWl07CisJfQorCXJwLT50eF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIocnAtPnR4X3JpbmdfZG1hKTsKKworfQorCitzdGF0aWMgdm9pZCBmcmVlX3RidWZzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlycC0+dHhfcmluZ1tpXS50eF9zdGF0dXMgPSAwOworCQlycC0+dHhfcmluZ1tpXS5kZXNjX2xlbmd0aCA9IGNwdV90b19sZTMyKFRYREVTQyk7CisJCXJwLT50eF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMigweEJBREYwMEQwKTsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAocnAtPnR4X3NrYnVmZltpXSkgeworCQkJaWYgKHJwLT50eF9za2J1ZmZfZG1hW2ldKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQkJCSBycC0+dHhfc2tidWZmX2RtYVtpXSwKKwkJCQkJCSBycC0+dHhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQl9CisJCQlkZXZfa2ZyZWVfc2tiKHJwLT50eF9za2J1ZmZbaV0pOworCQl9CisJCXJwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlycC0+dHhfYnVmW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX2NoZWNrX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpbml0X21lZGlhKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCW1paV9jaGVja19tZWRpYSgmcnAtPm1paV9pZiwgZGVidWcsIGluaXRfbWVkaWEpOworCisJaWYgKHJwLT5taWlfaWYuZnVsbF9kdXBsZXgpCisJICAgIGlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpIHwgQ21kMUZEdXBsZXgsCisJCSAgIGlvYWRkciArIENoaXBDbWQxKTsKKwllbHNlCisJICAgIGlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpICYgfkNtZDFGRHVwbGV4LAorCQkgICBpb2FkZHIgKyBDaGlwQ21kMSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaW93cml0ZTgoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgU3RhdGlvbkFkZHIgKyBpKTsKKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworCWlvd3JpdGUxNigweDAwMDYsIGlvYWRkciArIFBDSUJ1c0NvbmZpZyk7CS8qIFR1bmUgY29uZmlndXJhdGlvbj8/PyAqLworCS8qIENvbmZpZ3VyZSBpbml0aWFsIEZJRk8gdGhyZXNob2xkcy4gKi8KKwlpb3dyaXRlOCgweDIwLCBpb2FkZHIgKyBUeENvbmZpZyk7CisJcnAtPnR4X3RocmVzaCA9IDB4MjA7CisJcnAtPnJ4X3RocmVzaCA9IDB4NjA7CQkvKiBXcml0dGVuIGluIHJoaW5lX3NldF9yeF9tb2RlKCkuICovCisKKwlpb3dyaXRlMzIocnAtPnJ4X3JpbmdfZG1hLCBpb2FkZHIgKyBSeFJpbmdQdHIpOworCWlvd3JpdGUzMihycC0+dHhfcmluZ19kbWEsIGlvYWRkciArIFR4UmluZ1B0cik7CisKKwlyaGluZV9zZXRfcnhfbW9kZShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KEludHJSeERvbmUgfCBJbnRyUnhFcnIgfCBJbnRyUnhFbXB0eXwgSW50clJ4T3ZlcmZsb3cgfAorCSAgICAgICBJbnRyUnhEcm9wcGVkIHwgSW50clJ4Tm9CdWYgfCBJbnRyVHhBYm9ydGVkIHwKKwkgICAgICAgSW50clR4RG9uZSB8IEludHJUeEVycm9yIHwgSW50clR4VW5kZXJydW4gfAorCSAgICAgICBJbnRyUENJRXJyIHwgSW50clN0YXRzTWF4IHwgSW50ckxpbmtDaGFuZ2UsCisJICAgICAgIGlvYWRkciArIEludHJFbmFibGUpOworCisJaW93cml0ZTE2KENtZFN0YXJ0IHwgQ21kVHhPbiB8IENtZFJ4T24gfCAoQ21kMU5vVHhQb2xsIDw8IDgpLAorCSAgICAgICBpb2FkZHIgKyBDaGlwQ21kKTsKKwlyaGluZV9jaGVja19tZWRpYShkZXYsIDEpOworfQorCisvKiBFbmFibGUgTUlJIGxpbmsgc3RhdHVzIGF1dG8tcG9sbGluZyAocmVxdWlyZWQgZm9yIEludHJMaW5rQ2hhbmdlKSAqLworc3RhdGljIHZvaWQgcmhpbmVfZW5hYmxlX2xpbmttb24odm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaW93cml0ZTgoMCwgaW9hZGRyICsgTUlJQ21kKTsKKwlpb3dyaXRlOChNSUlfQk1TUiwgaW9hZGRyICsgTUlJUmVnQWRkcik7CisJaW93cml0ZTgoMHg4MCwgaW9hZGRyICsgTUlJQ21kKTsKKworCVJISU5FX1dBSVRfRk9SKChpb3JlYWQ4KGlvYWRkciArIE1JSVJlZ0FkZHIpICYgMHgyMCkpOworCisJaW93cml0ZTgoTUlJX0JNU1IgfCAweDQwLCBpb2FkZHIgKyBNSUlSZWdBZGRyKTsKK30KKworLyogRGlzYWJsZSBNSUkgbGluayBzdGF0dXMgYXV0by1wb2xsaW5nIChyZXF1aXJlZCBmb3IgTURJTyBhY2Nlc3MpICovCitzdGF0aWMgdm9pZCByaGluZV9kaXNhYmxlX2xpbmttb24odm9pZCBfX2lvbWVtICppb2FkZHIsIHUzMiBxdWlya3MpCit7CisJaW93cml0ZTgoMCwgaW9hZGRyICsgTUlJQ21kKTsKKworCWlmIChxdWlya3MgJiBycVJoaW5lSSkgeworCQlpb3dyaXRlOCgweDAxLCBpb2FkZHIgKyBNSUlSZWdBZGRyKTsJLy8gTUlJX0JNU1IKKworCQkvKiBDYW4gYmUgY2FsbGVkIGZyb20gSVNSLiBFdmlsLiAqLworCQltZGVsYXkoMSk7CisKKwkJLyogMHg4MCBtdXN0IGJlIHNldCBpbW1lZGlhdGVseSBiZWZvcmUgdHVybmluZyBpdCBvZmYgKi8KKwkJaW93cml0ZTgoMHg4MCwgaW9hZGRyICsgTUlJQ21kKTsKKworCQlSSElORV9XQUlUX0ZPUihpb3JlYWQ4KGlvYWRkciArIE1JSVJlZ0FkZHIpICYgMHgyMCk7CisKKwkJLyogSGVoLiBOb3cgY2xlYXIgMHg4MCBhZ2Fpbi4gKi8KKwkJaW93cml0ZTgoMCwgaW9hZGRyICsgTUlJQ21kKTsKKwl9CisJZWxzZQorCQlSSElORV9XQUlUX0ZPUihpb3JlYWQ4KGlvYWRkciArIE1JSVJlZ0FkZHIpICYgMHg4MCk7Cit9CisKKy8qIFJlYWQgYW5kIHdyaXRlIG92ZXIgdGhlIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2UuICovCisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdudW0pCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCWludCByZXN1bHQ7CisKKwlyaGluZV9kaXNhYmxlX2xpbmttb24oaW9hZGRyLCBycC0+cXVpcmtzKTsKKworCS8qIHJoaW5lX2Rpc2FibGVfbGlua21vbiBhbHJlYWR5IGNsZWFyZWQgTUlJQ21kICovCisJaW93cml0ZTgocGh5X2lkLCBpb2FkZHIgKyBNSUlQaHlBZGRyKTsKKwlpb3dyaXRlOChyZWdudW0sIGlvYWRkciArIE1JSVJlZ0FkZHIpOworCWlvd3JpdGU4KDB4NDAsIGlvYWRkciArIE1JSUNtZCk7CQkvKiBUcmlnZ2VyIHJlYWQgKi8KKwlSSElORV9XQUlUX0ZPUighKGlvcmVhZDgoaW9hZGRyICsgTUlJQ21kKSAmIDB4NDApKTsKKwlyZXN1bHQgPSBpb3JlYWQxNihpb2FkZHIgKyBNSUlEYXRhKTsKKworCXJoaW5lX2VuYWJsZV9saW5rbW9uKGlvYWRkcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCisJcmhpbmVfZGlzYWJsZV9saW5rbW9uKGlvYWRkciwgcnAtPnF1aXJrcyk7CisKKwkvKiByaGluZV9kaXNhYmxlX2xpbmttb24gYWxyZWFkeSBjbGVhcmVkIE1JSUNtZCAqLworCWlvd3JpdGU4KHBoeV9pZCwgaW9hZGRyICsgTUlJUGh5QWRkcik7CisJaW93cml0ZTgocmVnbnVtLCBpb2FkZHIgKyBNSUlSZWdBZGRyKTsKKwlpb3dyaXRlMTYodmFsdWUsIGlvYWRkciArIE1JSURhdGEpOworCWlvd3JpdGU4KDB4MjAsIGlvYWRkciArIE1JSUNtZCk7CQkvKiBUcmlnZ2VyIHdyaXRlICovCisJUkhJTkVfV0FJVF9GT1IoIShpb3JlYWQ4KGlvYWRkciArIE1JSUNtZCkgJiAweDIwKSk7CisKKwlyaGluZV9lbmFibGVfbGlua21vbihpb2FkZHIpOworfQorCitzdGF0aWMgaW50IHJoaW5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJaW50IHJjOworCisJcmMgPSByZXF1ZXN0X2lycShycC0+cGRldi0+aXJxLCAmcmhpbmVfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLAorCQkJZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmhpbmVfb3BlbigpIGlycSAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJwLT5wZGV2LT5pcnEpOworCisJcmMgPSBhbGxvY19yaW5nKGRldik7CisJaWYgKHJjKSB7CisJCWZyZWVfaXJxKHJwLT5wZGV2LT5pcnEsIGRldik7CisJCXJldHVybiByYzsKKwl9CisJYWxsb2NfcmJ1ZnMoZGV2KTsKKwlhbGxvY190YnVmcyhkZXYpOworCXJoaW5lX2NoaXBfcmVzZXQoZGV2KTsKKwlpbml0X3JlZ2lzdGVycyhkZXYpOworCWlmIChkZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSByaGluZV9vcGVuKCksIHN0YXR1cyAlNC40eCAiCisJCSAgICAgICAiTUlJIHN0YXR1czogJTQuNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBDaGlwQ21kKSwKKwkJICAgICAgIG1kaW9fcmVhZChkZXYsIHJwLT5taWlfaWYucGh5X2lkLCBNSUlfQk1TUikpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByaGluZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU0LjR4LCBQSFkgc3RhdHVzICIKKwkgICAgICAgIiU0LjR4LCByZXNldHRpbmcuLi5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cyksCisJICAgICAgIG1kaW9fcmVhZChkZXYsIHJwLT5taWlfaWYucGh5X2lkLCBNSUlfQk1TUikpOworCisJLyogcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcnggaW50ZXJydXB0cyAqLworCWRpc2FibGVfaXJxKHJwLT5wZGV2LT5pcnEpOworCisJc3Bpbl9sb2NrKCZycC0+bG9jayk7CisKKwkvKiBjbGVhciBhbGwgZGVzY3JpcHRvcnMgKi8KKwlmcmVlX3RidWZzKGRldik7CisJZnJlZV9yYnVmcyhkZXYpOworCWFsbG9jX3RidWZzKGRldik7CisJYWxsb2NfcmJ1ZnMoZGV2KTsKKworCS8qIFJlaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuICovCisJcmhpbmVfY2hpcF9yZXNldChkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisKKwlzcGluX3VubG9jaygmcnAtPmxvY2spOworCWVuYWJsZV9pcnEocnAtPnBkZXYtPmlycSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlycC0+c3RhdHMudHhfZXJyb3JzKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHJoaW5lX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXVuc2lnbmVkIGVudHJ5OworCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkCisJICAgd2l0aCB0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBycC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlycC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKworCWlmICgocnAtPnF1aXJrcyAmIHJxUmhpbmVJKSAmJgorCSAgICAoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIDMpIHx8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgIT0gMCB8fCBza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykpIHsKKwkJLyogTXVzdCB1c2UgYWxpZ25tZW50IGJ1ZmZlci4gKi8KKwkJaWYgKHNrYi0+bGVuID4gUEtUX0JVRl9TWikgeworCQkJLyogcGFja2V0IHRvbyBsb25nLCBkcm9wIGl0ICovCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlycC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQlycC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2tiX2NvcHlfYW5kX2NzdW1fZGV2KHNrYiwgcnAtPnR4X2J1ZltlbnRyeV0pOworCQlycC0+dHhfc2tidWZmX2RtYVtlbnRyeV0gPSAwOworCQlycC0+dHhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHJwLT50eF9idWZzX2RtYSArCisJCQkJCQkgICAgICAocnAtPnR4X2J1ZltlbnRyeV0gLQorCQkJCQkJICAgICAgIHJwLT50eF9idWZzKSk7CisJfSBlbHNlIHsKKwkJcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldID0KKwkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+dHhfc2tidWZmX2RtYVtlbnRyeV0pOworCX0KKworCXJwLT50eF9yaW5nW2VudHJ5XS5kZXNjX2xlbmd0aCA9CisJCWNwdV90b19sZTMyKFRYREVTQyB8IChza2ItPmxlbiA+PSBFVEhfWkxFTiA/IHNrYi0+bGVuIDogRVRIX1pMRU4pKTsKKworCS8qIGxvY2sgZXRoIGlycSAqLworCXNwaW5fbG9ja19pcnEoJnJwLT5sb2NrKTsKKwl3bWIoKTsKKwlycC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJd21iKCk7CisKKwlycC0+Y3VyX3R4Kys7CisKKwkvKiBOb24teDg2IFRvZG86IGV4cGxpY2l0bHkgZmx1c2ggY2FjaGUgbGluZXMgaGVyZS4gKi8KKworCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbCAqLworCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpIHwgQ21kMVR4RGVtYW5kLAorCSAgICAgICBpb2FkZHIgKyBDaGlwQ21kMSk7CisJSU9TWU5DOworCisJaWYgKHJwLT5jdXJfdHggPT0gcnAtPmRpcnR5X3R4ICsgVFhfUVVFVUVfTEVOKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXNwaW5fdW5sb2NrX2lycSgmcnAtPmxvY2spOworCisJaWYgKGRlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGZyYW1lICMlZCBxdWV1ZWQgaW4gc2xvdCAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJwLT5jdXJfdHgtMSwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHJoaW5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJdTMyIGludHJfc3RhdHVzOworCWludCBib2d1c2NudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoKGludHJfc3RhdHVzID0gZ2V0X2ludHJfc3RhdHVzKGRldikpKSB7CisJCWhhbmRsZWQgPSAxOworCisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhEZXNjUmFjZSkKKwkJCWlvd3JpdGU4KDB4MDgsIGlvYWRkciArIEludHJTdGF0dXMyKTsKKwkJaW93cml0ZTE2KGludHJfc3RhdHVzICYgMHhmZmZmLCBpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkJSU9TWU5DOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCwgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4RG9uZSB8IEludHJSeEVyciB8IEludHJSeERyb3BwZWQgfAorCQkgICAgSW50clJ4V2FrZVVwIHwgSW50clJ4RW1wdHkgfCBJbnRyUnhOb0J1ZikpCisJCQlyaGluZV9yeChkZXYpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyVHhFcnJTdW1tYXJ5IHwgSW50clR4RG9uZSkpIHsKKwkJCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeEVyclN1bW1hcnkpIHsKKwkJCQkvKiBBdm9pZCBzY2F2ZW5naW5nIGJlZm9yZSBUeCBlbmdpbmUgdHVybmVkIG9mZiAqLworCQkJCVJISU5FX1dBSVRfRk9SKCEoaW9yZWFkOChpb2FkZHIrQ2hpcENtZCkgJiBDbWRUeE9uKSk7CisJCQkJaWYgKGRlYnVnID4gMiAmJgorCQkJCSAgICBpb3JlYWQ4KGlvYWRkcitDaGlwQ21kKSAmIENtZFR4T24pCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiCisJCQkJCSAgICAgICAicmhpbmVfaW50ZXJydXB0KCkgVHggZW5naW5lIgorCQkJCQkgICAgICAgInN0aWxsIG9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJCXJoaW5lX3R4KGRldik7CisJCX0KKworCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJQQ0lFcnIgfCBJbnRyTGlua0NoYW5nZSB8CisJCQkJICAgSW50clN0YXRzTWF4IHwgSW50clR4RXJyb3IgfCBJbnRyVHhBYm9ydGVkIHwKKwkJCQkgICBJbnRyVHhVbmRlcnJ1biB8IEludHJUeERlc2NSYWNlKSkKKwkJCXJoaW5lX2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkgICAgICAgInN0YXR1cz0lIzguOHguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JTguOHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGJ1dCBpc29sYXRlZAorICAgZm9yIGNsYXJpdHkuICovCitzdGF0aWMgdm9pZCByaGluZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHR4c3RhdHVzID0gMCwgZW50cnkgPSBycC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisKKwlzcGluX2xvY2soJnJwLT5sb2NrKTsKKworCS8qIGZpbmQgYW5kIGNsZWFudXAgZGlydHkgdHggZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAocnAtPmRpcnR5X3R4ICE9IHJwLT5jdXJfdHgpIHsKKwkJdHhzdGF0dXMgPSBsZTMyX3RvX2NwdShycC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzKTsKKwkJaWYgKGRlYnVnID4gNikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgVHggc2NhdmVuZ2UgJWQgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCSAgICAgICBlbnRyeSwgdHhzdGF0dXMpOworCQlpZiAodHhzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisJCWlmICh0eHN0YXR1cyAmIDB4ODAwMCkgeworCQkJaWYgKGRlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGVycm9yLCAiCisJCQkJICAgICAgICJUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHR4c3RhdHVzKTsKKwkJCXJwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIDB4MDQwMCkgcnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhzdGF0dXMgJiAweDAyMDApIHJwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAodHhzdGF0dXMgJiAweDAxMDApIHJwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgMHgwMDgwKSBycC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJaWYgKCgocnAtPnF1aXJrcyAmIHJxUmhpbmVJKSAmJiB0eHN0YXR1cyAmIDB4MDAwMikgfHwKKwkJCSAgICAodHhzdGF0dXMgJiAweDA4MDApIHx8ICh0eHN0YXR1cyAmIDB4MTAwMCkpIHsKKwkJCQlycC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlycC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJCQkJYnJlYWs7IC8qIEtlZXAgdGhlIHNrYiAtIHdlIHRyeSBhZ2FpbiAqLworCQkJfQorCQkJLyogVHJhbnNtaXR0ZXIgcmVzdGFydGVkIGluICdhYm5vcm1hbCcgaGFuZGxlci4gKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChycC0+cXVpcmtzICYgcnFSaGluZUkpCisJCQkJcnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHR4c3RhdHVzID4+IDMpICYgMHgwRjsKKwkJCWVsc2UKKwkJCQlycC0+c3RhdHMuY29sbGlzaW9ucyArPSB0eHN0YXR1cyAmIDB4MEY7CisJCQlpZiAoZGVidWcgPiA2KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJjb2xsaXNpb25zOiAlMS4xeDolMS4xeFxuIiwKKwkJCQkgICAgICAgKHR4c3RhdHVzID4+IDMpICYgMHhGLAorCQkJCSAgICAgICB0eHN0YXR1cyAmIDB4Rik7CisJCQlycC0+c3RhdHMudHhfYnl0ZXMgKz0gcnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCXJwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlpZiAocnAtPnR4X3NrYnVmZl9kbWFbZW50cnldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHJwLT5wZGV2LAorCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkgcnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJCWRldl9rZnJlZV9za2JfaXJxKHJwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQllbnRyeSA9ICgrK3JwLT5kaXJ0eV90eCkgJSBUWF9SSU5HX1NJWkU7CisJfQorCWlmICgocnAtPmN1cl90eCAtIHJwLT5kaXJ0eV90eCkgPCBUWF9RVUVVRV9MRU4gLSA0KQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9jaygmcnAtPmxvY2spOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgaXNvbGF0ZWQKKyAgIGZvciBjbGFyaXR5IGFuZCBiZXR0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHJoaW5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBycC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IHJwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHJwLT5jdXJfcng7CisKKwlpZiAoZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmhpbmVfcngoKSwgZW50cnkgJWQgc3RhdHVzICU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW50cnksCisJCSAgICAgICBsZTMyX3RvX2NwdShycC0+cnhfaGVhZF9kZXNjLT5yeF9zdGF0dXMpKTsKKwl9CisKKwkvKiBJZiBFT1AgaXMgc2V0IG9uIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAoIShycC0+cnhfaGVhZF9kZXNjLT5yeF9zdGF0dXMgJiBjcHVfdG9fbGUzMihEZXNjT3duKSkpIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKmRlc2MgPSBycC0+cnhfaGVhZF9kZXNjOworCQl1MzIgZGVzY19zdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5yeF9zdGF0dXMpOworCQlpbnQgZGF0YV9zaXplID0gZGVzY19zdGF0dXMgPj4gMTY7CisKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgcmhpbmVfcngoKSBzdGF0dXMgaXMgJTguOHguXG4iLAorCQkJICAgICAgIGRlc2Nfc3RhdHVzKTsKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKQorCQkJYnJlYWs7CisJCWlmICgoZGVzY19zdGF0dXMgJiAoUnhXaG9sZVBrdCB8IFJ4RXJyKSkgIT0gUnhXaG9sZVBrdCkgeworCQkJaWYgKChkZXNjX3N0YXR1cyAmIFJ4V2hvbGVQa3QpICE9IFJ4V2hvbGVQa3QpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0ICIKKwkJCQkgICAgICAgImZyYW1lIHNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgZW50cnkgIgorCQkJCSAgICAgICAiJSN4IGxlbmd0aCAlZCBzdGF0dXMgJTguOHghXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBkYXRhX3NpemUsCisJCQkJICAgICAgIGRlc2Nfc3RhdHVzKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0ICIKKwkJCQkgICAgICAgImZyYW1lICVwIHZzICVwLlxuIiwgZGV2LT5uYW1lLAorCQkJCSAgICAgICBycC0+cnhfaGVhZF9kZXNjLCAmcnAtPnJ4X3JpbmdbZW50cnldKTsKKwkJCQlycC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfSBlbHNlIGlmIChkZXNjX3N0YXR1cyAmIFJ4RXJyKSB7CisJCQkJLyogVGhlcmUgd2FzIGEgZXJyb3IuICovCisJCQkJaWYgKGRlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiByaGluZV9yeCgpIFJ4ICIKKwkJCQkJICAgICAgICJlcnJvciB3YXMgJTguOHguXG4iLAorCQkJCQkgICAgICAgZGVzY19zdGF0dXMpOworCQkJCXJwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlpZiAoZGVzY19zdGF0dXMgJiAweDAwMzApIHJwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDQ4KSBycC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAoZGVzY19zdGF0dXMgJiAweDAwMDQpIHJwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoZGVzY19zdGF0dXMgJiAweDAwMDIpIHsKKwkJCQkJLyogdGhpcyBjYW4gYWxzbyBiZSB1cGRhdGVkIG91dHNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJCQkJCXNwaW5fbG9jaygmcnAtPmxvY2spOworCQkJCQlycC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlzcGluX3VubG9jaygmcnAtPmxvY2spOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkvKiBMZW5ndGggc2hvdWxkIG9taXQgdGhlIENSQyAqLworCQkJaW50IHBrdF9sZW4gPSBkYXRhX3NpemUgLSA0OworCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0CisJCQkgICBjb3B5aW5nIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrICYmCisJCQkJKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHJwLT5wZGV2LAorCQkJCQkJCSAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCisJCQkJCQkJICAgIHJwLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkJCSBycC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJCSBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJwLT5wZGV2LAorCQkJCQkJCSAgICAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCisJCQkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IHJwLT5yeF9za2J1ZmZbZW50cnldOworCQkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbmNvbnNpc3RlbnQgUnggIgorCQkJCQkgICAgICAgImRlc2NyaXB0b3IgY2hhaW4uXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJwLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQkJCSBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCisJCQkJCQkgcnAtPnJ4X2J1Zl9zeiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcnAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQlycC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisJCWVudHJ5ID0gKCsrcnAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJCXJwLT5yeF9oZWFkX2Rlc2MgPSAmcnAtPnJ4X3JpbmdbZW50cnldOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyBycC0+Y3VyX3J4IC0gcnAtPmRpcnR5X3J4ID4gMDsgcnAtPmRpcnR5X3J4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZW50cnkgPSBycC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmIChycC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJwLT5yeF9idWZfc3opOworCQkJcnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldID0KKwkJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT50YWlsLAorCQkJCQkgICAgICAgcnAtPnJ4X2J1Zl9zeiwKKwkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlycC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSk7CisJCX0KKwkJcnAtPnJ4X3JpbmdbZW50cnldLnJ4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCX0KK30KKworLyoKKyAqIENsZWFycyB0aGUgInRhbGx5IGNvdW50ZXJzIiBmb3IgQ1JDIGVycm9ycyBhbmQgbWlzc2VkIGZyYW1lcyg/KS4KKyAqIEl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgc29tZSBjaGlwcyBuZWVkIGEgd3JpdGUgb2YgMCB0byBjbGVhcgorICogdGhlc2UsIGZvciBvdGhlcnMgdGhlIGNvdW50ZXJzIGFyZSBzZXQgdG8gMSB3aGVuIHdyaXR0ZW4gdG8gYW5kCisgKiBpbnN0ZWFkIGNsZWFyZWQgd2hlbiByZWFkLiBTbyB3ZSBjbGVhciB0aGVtIGJvdGggd2F5cyAuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3RhbGx5X2NvdW50ZXJzKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeE1pc3NlZCk7CisJaW9yZWFkMTYoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwlpb3JlYWQxNihpb2FkZHIgKyBSeE1pc3NlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3Jlc3RhcnRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwlpbnQgZW50cnkgPSBycC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJdTMyIGludHJfc3RhdHVzOworCisJLyoKKwkgKiBJZiBuZXcgZXJyb3JzIG9jY3VyZWQsIHdlIG5lZWQgdG8gc29ydCB0aGVtIG91dCBiZWZvcmUgZG9pbmcgVHguCisJICogSW4gdGhhdCBjYXNlIHRoZSBJU1Igd2lsbCBiZSBiYWNrIGhlcmUgUlNOIGFueXdheS4KKwkgKi8KKwlpbnRyX3N0YXR1cyA9IGdldF9pbnRyX3N0YXR1cyhkZXYpOworCisJaWYgKChpbnRyX3N0YXR1cyAmIEludHJUeEVyclN1bW1hcnkpID09IDApIHsKKworCQkvKiBXZSBrbm93IGJldHRlciB0aGFuIHRoZSBjaGlwIHdoZXJlIGl0IHNob3VsZCBjb250aW51ZS4gKi8KKwkJaW93cml0ZTMyKHJwLT50eF9yaW5nX2RtYSArIGVudHJ5ICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJICAgICAgIGlvYWRkciArIFR4UmluZ1B0cik7CisKKwkJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kKSB8IENtZFR4T24sCisJCSAgICAgICBpb2FkZHIgKyBDaGlwQ21kKTsKKwkJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kMSkgfCBDbWQxVHhEZW1hbmQsCisJCSAgICAgICBpb2FkZHIgKyBDaGlwQ21kMSk7CisJCUlPU1lOQzsKKwl9CisJZWxzZSB7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJoaW5lX3Jlc3RhcnRfdHgoKSAiCisJCQkgICAgICAgIkFub3RoZXIgZXJyb3Igb2NjdXJlZCAlOC44eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlzcGluX2xvY2soJnJwLT5sb2NrKTsKKworCWlmIChpbnRyX3N0YXR1cyAmIEludHJMaW5rQ2hhbmdlKQorCQlyaGluZV9jaGVja19tZWRpYShkZXYsIDApOworCWlmIChpbnRyX3N0YXR1cyAmIEludHJTdGF0c01heCkgeworCQlycC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeENSQ0VycnMpOworCQlycC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeE1pc3NlZCk7CisJCWNsZWFyX3RhbGx5X2NvdW50ZXJzKGlvYWRkcik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeEFib3J0ZWQpIHsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBYm9ydCAlOC44eCwgZnJhbWUgZHJvcHBlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeFVuZGVycnVuKSB7CisJCWlmIChycC0+dHhfdGhyZXNoIDwgMHhFMCkKKwkJCWlvd3JpdGU4KHJwLT50eF90aHJlc2ggKz0gMHgyMCwgaW9hZGRyICsgVHhDb25maWcpOworCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0dGVyIHVuZGVycnVuLCBUeCAiCisJCQkgICAgICAgInRocmVzaG9sZCBub3cgJTIuMnguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcnAtPnR4X3RocmVzaCk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeERlc2NSYWNlKSB7CisJCWlmIChkZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHggZGVzY3JpcHRvciB3cml0ZS1iYWNrIHJhY2UuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJfQorCWlmICgoaW50cl9zdGF0dXMgJiBJbnRyVHhFcnJvcikgJiYKKwkgICAgKGludHJfc3RhdHVzICYgKEludHJUeEFib3J0ZWQgfAorCSAgICAgSW50clR4VW5kZXJydW4gfCBJbnRyVHhEZXNjUmFjZSkpID09IDApIHsKKwkJaWYgKHJwLT50eF90aHJlc2ggPCAweEUwKSB7CisJCQlpb3dyaXRlOChycC0+dHhfdGhyZXNoICs9IDB4MjAsIGlvYWRkciArIFR4Q29uZmlnKTsKKwkJfQorCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3BlY2lmaWVkIGVycm9yLiBUeCAiCisJCQkgICAgICAgInRocmVzaG9sZCBub3cgJTIuMnguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcnAtPnR4X3RocmVzaCk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyVHhBYm9ydGVkIHwgSW50clR4VW5kZXJydW4gfCBJbnRyVHhEZXNjUmFjZSB8CisJCQkgICBJbnRyVHhFcnJvcikpCisJCXJoaW5lX3Jlc3RhcnRfdHgoZGV2KTsKKworCWlmIChpbnRyX3N0YXR1cyAmIH4oSW50ckxpbmtDaGFuZ2UgfCBJbnRyU3RhdHNNYXggfCBJbnRyVHhVbmRlcnJ1biB8CisJCQkgICAgSW50clR4RXJyb3IgfCBJbnRyVHhBYm9ydGVkIHwgSW50ck5vcm1hbFN1bW1hcnkgfAorCQkJICAgIEludHJUeERlc2NSYWNlKSkgeworCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgIgorCQkJICAgICAgICIlOC44eC5cbiIsIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCX0KKworCXNwaW5fdW5sb2NrKCZycC0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmhpbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnAtPmxvY2ssIGZsYWdzKTsKKwlycC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeENSQ0VycnMpOworCXJwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDE2KGlvYWRkciArIFJ4TWlzc2VkKTsKKwljbGVhcl90YWxseV9jb3VudGVycyhpb2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gJnJwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTggcnhfbW9kZTsJCS8qIE5vdGU6IDB4MDI9YWNjZXB0IHJ1bnQsIDB4MDE9YWNjZXB0IGVycnMgKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJ4X21vZGUgPSAweDFDOworCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJCWlvd3JpdGUzMigweGZmZmZmZmZmLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCWlvd3JpdGUzMigweGZmZmZmZmZmLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKKwkJaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjEpOworCQlyeF9tb2RlID0gMHgwQzsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJfQorCQlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKKwkJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSk7CisJCXJ4X21vZGUgPSAweDBDOworCX0KKwlpb3dyaXRlOChycC0+cnhfdGhyZXNoIHwgcnhfbW9kZSwgaW9hZGRyICsgUnhDb25maWcpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShycC0+cGRldikpOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZycC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmcnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZycC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmcnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZycC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIG1paV9saW5rX29rKCZycC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlkZWJ1ZyA9IHZhbHVlOworfQorCitzdGF0aWMgdm9pZCByaGluZV9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEocnAtPnF1aXJrcyAmIHJxV09MKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDIHwKKwkJCSBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1Q7CS8qIFVudGVzdGVkICovCisJd29sLT53b2xvcHRzID0gcnAtPndvbG9wdHM7CisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcmhpbmVfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3VwcG9ydCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8CisJCSAgICAgIFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVDsJLyogVW50ZXN0ZWQgKi8KKworCWlmICghKHJwLT5xdWlya3MgJiBycVdPTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdvbC0+d29sb3B0cyAmIH5zdXBwb3J0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJnJwLT5sb2NrKTsKKwlycC0+d29sb3B0cyA9IHdvbC0+d29sb3B0czsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IG5ldGRldl9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gbmV0ZGV2X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IG5ldGRldl9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorCS5nZXRfd29sCQk9IHJoaW5lX2dldF93b2wsCisJLnNldF93b2wJCT0gcmhpbmVfc2V0X3dvbCwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmcnAtPm1paV9pZiwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByaGluZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCXNwaW5fbG9ja19pcnEoJnJwLT5sb2NrKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsICIKKwkJICAgICAgICJzdGF0dXMgd2FzICU0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgQ2hpcENtZCkpOworCisJLyogU3dpdGNoIHRvIGxvb3BiYWNrIG1vZGUgdG8gYXZvaWQgaGFyZHdhcmUgcmFjZXMuICovCisJaW93cml0ZTgocnAtPnR4X3RocmVzaCB8IDB4MDIsIGlvYWRkciArIFR4Q29uZmlnKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlpb3dyaXRlMTYoQ21kU3RvcCwgaW9hZGRyICsgQ2hpcENtZCk7CisKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCWZyZWVfaXJxKHJwLT5wZGV2LT5pcnEsIGRldik7CisJZnJlZV9yYnVmcyhkZXYpOworCWZyZWVfdGJ1ZnMoZGV2KTsKKwlmcmVlX3JpbmcoZGV2KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByaGluZV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlwY2lfaW91bm1hcChwZGV2LCBycC0+YmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfc2h1dGRvd24gKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZ2VuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCWlmICghKHJwLT5xdWlya3MgJiBycVdPTCkpCisJCXJldHVybjsgLyogTm90aGluZyB0byBkbyBmb3Igbm9uLVdPTCBhZGFwdGVycyAqLworCisJcmhpbmVfcG93ZXJfaW5pdChkZXYpOworCisJLyogTWFrZSBzdXJlIHdlIHVzZSBwYXR0ZXJuIDAsIDEgYW5kIG5vdCA0LCA1ICovCisJaWYgKHJwLT5xdWlya3MgJiBycTZwYXR0ZXJucykKKwkJaW93cml0ZTgoMHgwNCwgaW9hZGRyICsgMHhBNyk7CisKKwlpZiAocnAtPndvbG9wdHMgJiBXQUtFX01BR0lDKSB7CisJCWlvd3JpdGU4KFdPTG1hZ2ljLCBpb2FkZHIgKyBXT0xjclNldCk7CisJCS8qCisJCSAqIFR1cm4gRUVQUk9NLWNvbnRyb2xsZWQgd2FrZS11cCBiYWNrIG9uIC0tIHNvbWUgaGFyZHdhcmUgbWF5CisJCSAqIG5vdCBjb29wZXJhdGUgb3RoZXJ3aXNlLgorCQkgKi8KKwkJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBDb25maWdBKSB8IDB4MDMsIGlvYWRkciArIENvbmZpZ0EpOworCX0KKworCWlmIChycC0+d29sb3B0cyAmIChXQUtFX0JDQVNUfFdBS0VfTUNBU1QpKQorCQlpb3dyaXRlOChXT0xibWNhc3QsIGlvYWRkciArIFdPTGNnU2V0KTsKKworCWlmIChycC0+d29sb3B0cyAmIFdBS0VfUEhZKQorCQlpb3dyaXRlOChXT0xsbmtvbiB8IFdPTGxua29mZiwgaW9hZGRyICsgV09MY3JTZXQpOworCisJaWYgKHJwLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkKKwkJaW93cml0ZTgoV09MdWNhc3QsIGlvYWRkciArIFdPTGNyU2V0KTsKKworCWlmIChycC0+d29sb3B0cykgeworCQkvKiBFbmFibGUgbGVnYWN5IFdPTCAoZm9yIG9sZCBtb3RoZXJib2FyZHMpICovCisJCWlvd3JpdGU4KDB4MDEsIGlvYWRkciArIFB3Y2ZnU2V0KTsKKwkJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBTdGlja3lIVykgfCAweDA0LCBpb2FkZHIgKyBTdGlja3lIVyk7CisJfQorCisJLyogSGl0IHBvd2VyIHN0YXRlIEQzIChzbGVlcCkgKi8KKwlpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIFN0aWNreUhXKSB8IDB4MDMsIGlvYWRkciArIFN0aWNreUhXKTsKKworCS8qIFRPRE86IENoZWNrIHVzZSBvZiBwY2lfZW5hYmxlX3dha2UoKSAqLworCit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcmhpbmVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJwLT5sb2NrLCBmbGFncyk7CisJcmhpbmVfc2h1dGRvd24oJnBkZXYtPmRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnAtPmxvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJoaW5lX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcmhpbmVfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgInZpYS1yaGluZSAlczogcmVxdWVzdF9pcnEgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCisJcmV0ID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbnRlcmluZyBwb3dlciBzdGF0ZSBEMCAlcyAoJWQpLlxuIiwKKwkJCWRldi0+bmFtZSwgcmV0ID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIiwgcmV0KTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJwLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgVVNFX01NSU8KKwllbmFibGVfbW1pbyhycC0+cGlvYWRkciwgcnAtPnF1aXJrcyk7CisjZW5kaWYKKwlyaGluZV9wb3dlcl9pbml0KGRldik7CisJZnJlZV90YnVmcyhkZXYpOworCWZyZWVfcmJ1ZnMoZGV2KTsKKwlhbGxvY190YnVmcyhkZXYpOworCWFsbG9jX3JidWZzKGRldik7CisJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycC0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciByaGluZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gcmhpbmVfcGNpX3RibCwKKwkucHJvYmUJCT0gcmhpbmVfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyaGluZV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHJoaW5lX3N1c3BlbmQsCisJLnJlc3VtZQkJPSByaGluZV9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCisJLmRyaXZlciA9IHsKKwkJLnNodXRkb3duID0gcmhpbmVfc2h1dGRvd24sCisJfQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCByaGluZV9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZyaGluZV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCByaGluZV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZyaGluZV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHJoaW5lX2luaXQpOworbW9kdWxlX2V4aXQocmhpbmVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTcxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtMCwwICsxLDMzMDMgQEAKKy8qCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBWSUEgcmVmZXJlbmNlIGRyaXZlciAoY29weXJpZ2h0IG1lc3NhZ2UKKyAqIGJlbG93KSBwcm92aWRlZCB0byBSZWQgSGF0IGJ5IFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLiBmb3IKKyAqIGFkZGl0aW9uIHRvIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogVGhlIGNvZGUgaGFzIGJlZW4gbWVyZ2VkIGludG8gb25lIHNvdXJjZSBmaWxlLCBjbGVhbmVkIHVwIHRvIGZvbGxvdworICogTGludXggY29kaW5nIHN0eWxlLCAgcG9ydGVkIHRvIHRoZSBMaW51eCAyLjYga2VybmVsIHRyZWUgYW5kIGNsZWFuZWQKKyAqIGZvciA2NGJpdCBoYXJkd2FyZSBwbGF0Zm9ybXMuCisgKgorICogVE9ETworICoJQmlnLWVuZGlhbiBzdXBwb3J0CisgKglyeF9jb3B5YnJlYWsvYWxpZ25tZW50CisgKglTY2F0dGVyIGdhdGhlcgorICoJTW9yZSB0ZXN0aW5nCisgKgorICogVGhlIGNoYW5nZXMgYXJlIChjKSBDb3B5cmlnaHQgMjAwNCwgUmVkIEhhdCBJbmMuIDxhbGFuQHJlZGhhdC5jb20+CisgKiBBZGRpdGlvbmFsIGZpeGVzIGFuZCBjbGVhbiB1cDogRnJhbmNvaXMgUm9taWV1CisgKgorICogVGhpcyBzb3VyY2UgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIGZvciB1c2UgaW4gc2FmZXR5IGNyaXRpY2FsIHN5c3RlbXMuCisgKgorICogUGxlYXNlIGRpcmVjdCBxdWVyaWVzIGFib3V0IHRoZSByZXZhbXBlZCBkcml2ZXIgdG8gdGhlIGxpbnV4LWtlcm5lbAorICogbGlzdCBub3QgVklBLgorICoKKyAqIE9yaWdpbmFsIGNvZGU6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQXV0aG9yOiBDaHVhbmcgTGlhbmctU2hpbmcsIEFKIEppYW5nCisgKgorICogRGF0ZTogSmFuIDI0LCAyMDAzCisgKgorICogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSAidmlhLXZlbG9jaXR5LmgiCisKKworc3RhdGljIGludCB2ZWxvY2l0eV9uaWNzID0gMDsKK3N0YXRpYyBpbnQgbXNnbGV2ZWwgPSBNU0dfTEVWRUxfSU5GTzsKKworCitzdGF0aWMgaW50IHZlbG9jaXR5X21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHZlbG9jaXR5X2V0aHRvb2xfb3BzOworCisvKgorICAgIERlZmluZSBtb2R1bGUgb3B0aW9ucworKi8KKworTU9EVUxFX0FVVEhPUigiVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgRHJpdmVyIik7CisKKyNkZWZpbmUgVkVMT0NJVFlfUEFSQU0oTixEKSBcCisgICAgICAgIHN0YXRpYyBpbnQgTltNQVhfVU5JVFNdPU9QVElPTl9ERUZBVUxUO1wKKwltb2R1bGVfcGFyYW1fYXJyYXkoTiwgaW50LCBOVUxMLCAwKTsgXAorICAgICAgICBNT0RVTEVfUEFSTV9ERVNDKE4sIEQpOworCisjZGVmaW5lIFJYX0RFU0NfTUlOICAgICA2NAorI2RlZmluZSBSWF9ERVNDX01BWCAgICAgMjU1CisjZGVmaW5lIFJYX0RFU0NfREVGICAgICA2NAorVkVMT0NJVFlfUEFSQU0oUnhEZXNjcmlwdG9ycywgIk51bWJlciBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIik7CisKKyNkZWZpbmUgVFhfREVTQ19NSU4gICAgIDE2CisjZGVmaW5lIFRYX0RFU0NfTUFYICAgICAyNTYKKyNkZWZpbmUgVFhfREVTQ19ERUYgICAgIDY0CitWRUxPQ0lUWV9QQVJBTShUeERlc2NyaXB0b3JzLCAiTnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzIik7CisKKyNkZWZpbmUgVkxBTl9JRF9NSU4gICAgIDAKKyNkZWZpbmUgVkxBTl9JRF9NQVggICAgIDQwOTUKKyNkZWZpbmUgVkxBTl9JRF9ERUYgICAgIDAKKy8qIFZJRF9zZXR0aW5nW10gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgVklEIG9mIE5JQy4KKyAgIDA6IGRlZmF1bHQgVklELgorICAgMS00MDk0OiBvdGhlciBWSURzLgorKi8KK1ZFTE9DSVRZX1BBUkFNKFZJRF9zZXR0aW5nLCAiODAyLjFRIFZMQU4gSUQiKTsKKworI2RlZmluZSBSWF9USFJFU0hfTUlOICAgMAorI2RlZmluZSBSWF9USFJFU0hfTUFYICAgMworI2RlZmluZSBSWF9USFJFU0hfREVGICAgMAorLyogcnhfdGhyZXNoW10gaXMgdXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIHJlY2VpdmUgZmlmbyB0aHJlc2hvbGQuCisgICAwOiBpbmRpY2F0ZSB0aGUgcnhmaWZvIHRocmVzaG9sZCBpcyAxMjggYnl0ZXMuCisgICAxOiBpbmRpY2F0ZSB0aGUgcnhmaWZvIHRocmVzaG9sZCBpcyA1MTIgYnl0ZXMuCisgICAyOiBpbmRpY2F0ZSB0aGUgcnhmaWZvIHRocmVzaG9sZCBpcyAxMDI0IGJ5dGVzLgorICAgMzogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgc3RvcmUgJiBmb3J3YXJkLgorKi8KK1ZFTE9DSVRZX1BBUkFNKHJ4X3RocmVzaCwgIlJlY2VpdmUgZmlmbyB0aHJlc2hvbGQiKTsKKworI2RlZmluZSBETUFfTEVOR1RIX01JTiAgMAorI2RlZmluZSBETUFfTEVOR1RIX01BWCAgNworI2RlZmluZSBETUFfTEVOR1RIX0RFRiAgMAorCisvKiBETUFfbGVuZ3RoW10gaXMgdXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIERNQSBsZW5ndGgKKyAgIDA6IDggRFdPUkRzCisgICAxOiAxNiBEV09SRHMKKyAgIDI6IDMyIERXT1JEcworICAgMzogNjQgRFdPUkRzCisgICA0OiAxMjggRFdPUkRzCisgICA1OiAyNTYgRFdPUkRzCisgICA2OiBTRihmbHVzaCB0aWxsIGVtcGx5KQorICAgNzogU0YoZmx1c2ggdGlsbCBlbXBseSkKKyovCitWRUxPQ0lUWV9QQVJBTShETUFfbGVuZ3RoLCAiRE1BIGxlbmd0aCIpOworCisjZGVmaW5lIFRBR0dJTkdfREVGICAgICAwCisvKiBlbmFibGVfdGFnZ2luZ1tdIGlzIHVzZWQgZm9yIGVuYWJsaW5nIDgwMi4xUSBWSUQgdGFnZ2luZy4KKyAgIDA6IGRpc2FibGUgVklEIHNlZXRpbmcoZGVmYXVsdCkuCisgICAxOiBlbmFibGUgVklEIHNldHRpbmcuCisqLworVkVMT0NJVFlfUEFSQU0oZW5hYmxlX3RhZ2dpbmcsICJFbmFibGUgODAyLjFRIHRhZ2dpbmciKTsKKworI2RlZmluZSBJUF9BTElHX0RFRiAgICAgMAorLyogSVBfYnl0ZV9hbGlnbltdIGlzIHVzZWQgZm9yIElQIGhlYWRlciBEV09SRCBieXRlIGFsaWduZWQKKyAgIDA6IGluZGljYXRlIHRoZSBJUCBoZWFkZXIgd29uJ3QgYmUgRFdPUkQgYnl0ZSBhbGlnbmVkLihEZWZhdWx0KSAuCisgICAxOiBpbmRpY2F0ZSB0aGUgSVAgaGVhZGVyIHdpbGwgYmUgRFdPUkQgYnl0ZSBhbGlnbmVkLgorICAgICAgSW4gc29tZSBlbnZpcm9tZW50LCB0aGUgSVAgaGVhZGVyIHNob3VsZCBiZSBEV09SRCBieXRlIGFsaWduZWQsCisgICAgICBvciB0aGUgcGFja2V0IHdpbGwgYmUgZHJvcGVkIHdoZW4gd2UgcmVjZWl2ZSBpdC4gKGVnOiBJUFZTKQorKi8KK1ZFTE9DSVRZX1BBUkFNKElQX2J5dGVfYWxpZ24sICJFbmFibGUgSVAgaGVhZGVyIGR3b3JkIGFsaWduZWQiKTsKKworI2RlZmluZSBUWF9DU1VNX0RFRiAgICAgMQorLyogdHhjc3VtX29mZmxvYWRbXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBjaGVja3N1bSBvZmZsb2FkIGFiaWxpdHkgb2YgTklDLgorICAgKFdlIG9ubHkgc3VwcG9ydCBSWCBjaGVja3N1bSBvZmZsb2FkIG5vdykKKyAgIDA6IGRpc2FibGUgY3N1bV9vZmZsb2FkW2NoZWNrc3VtIG9mZmxvYWQKKyAgIDE6IGVuYWJsZSBjaGVja3N1bSBvZmZsb2FkLiAoRGVmYXVsdCkKKyovCitWRUxPQ0lUWV9QQVJBTSh0eGNzdW1fb2ZmbG9hZCwgIkVuYWJsZSB0cmFuc21pdCBwYWNrZXQgY2hlY2tzdW0gb2ZmbG9hZCIpOworCisjZGVmaW5lIEZMT1dfQ05UTF9ERUYgICAxCisjZGVmaW5lIEZMT1dfQ05UTF9NSU4gICAxCisjZGVmaW5lIEZMT1dfQ05UTF9NQVggICA1CisKKy8qIGZsb3dfY29udHJvbFtdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGZsb3cgY29udHJvbCBhYmlsaXR5IG9mIE5JQy4KKyAgIDE6IGhhcmR3YXJlIGRlYWZ1bHQgLSBBVVRPIChkZWZhdWx0KS4gVXNlIEhhcmR3YXJlIGRlZmF1bHQgdmFsdWUgaW4gQU5BUi4KKyAgIDI6IGVuYWJsZSBUWCBmbG93IGNvbnRyb2wuCisgICAzOiBlbmFibGUgUlggZmxvdyBjb250cm9sLgorICAgNDogZW5hYmxlIFJYL1RYIGZsb3cgY29udHJvbC4KKyAgIDU6IGRpc2FibGUKKyovCitWRUxPQ0lUWV9QQVJBTShmbG93X2NvbnRyb2wsICJFbmFibGUgZmxvdyBjb250cm9sIGFiaWxpdHkiKTsKKworI2RlZmluZSBNRURfTE5LX0RFRiAwCisjZGVmaW5lIE1FRF9MTktfTUlOIDAKKyNkZWZpbmUgTUVEX0xOS19NQVggNAorLyogc3BlZWRfZHVwbGV4W10gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlIG9mIE5JQy4KKyAgIDA6IGluZGljYXRlIGF1dG9uZWdvdGlhdGlvbiBmb3IgYm90aCBzcGVlZCBhbmQgZHVwbGV4IG1vZGUKKyAgIDE6IGluZGljYXRlIDEwME1icHMgaGFsZiBkdXBsZXggbW9kZQorICAgMjogaW5kaWNhdGUgMTAwTWJwcyBmdWxsIGR1cGxleCBtb2RlCisgICAzOiBpbmRpY2F0ZSAxME1icHMgaGFsZiBkdXBsZXggbW9kZQorICAgNDogaW5kaWNhdGUgMTBNYnBzIGZ1bGwgZHVwbGV4IG1vZGUKKworICAgTm90ZToKKyAgICAgICAgaWYgRUVQUk9NIGhhdmUgYmVlbiBzZXQgdG8gdGhlIGZvcmNlIG1vZGUsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQKKyAgICAgICAgICAgIGJ5IGRyaXZlci4KKyovCitWRUxPQ0lUWV9QQVJBTShzcGVlZF9kdXBsZXgsICJTZXR0aW5nIHRoZSBzcGVlZCBhbmQgZHVwbGV4IG1vZGUiKTsKKworI2RlZmluZSBWQUxfUEtUX0xFTl9ERUYgICAgIDAKKy8qIFZhbFBrdExlbltdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGNoZWNrc3VtIG9mZmxvYWQgYWJpbGl0eSBvZiBOSUMuCisgICAwOiBSZWNlaXZlIGZyYW1lIHdpdGggaW52YWxpZCBsYXllciAyIGxlbmd0aCAoRGVmYXVsdCkKKyAgIDE6IERyb3AgZnJhbWUgd2l0aCBpbnZhbGlkIGxheWVyIDIgbGVuZ3RoCisqLworVkVMT0NJVFlfUEFSQU0oVmFsUGt0TGVuLCAiUmVjZWl2aW5nIG9yIERyb3AgaW52YWxpZCA4MDIuMyBmcmFtZSIpOworCisjZGVmaW5lIFdPTF9PUFRfREVGICAgICAwCisjZGVmaW5lIFdPTF9PUFRfTUlOICAgICAwCisjZGVmaW5lIFdPTF9PUFRfTUFYICAgICA3CisvKiB3b2xfb3B0c1tdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHdha2Ugb24gbGFuIGJlaGF2aW9yLgorICAgMDogV2FrZSB1cCBpZiByZWNldmllZCBhIG1hZ2ljIHBhY2tldC4gKERlZmF1bHQpCisgICAxOiBXYWtlIHVwIGlmIGxpbmsgc3RhdHVzIGlzIG9uL29mZi4KKyAgIDI6IFdha2UgdXAgaWYgcmVjZXZpZWQgYW4gYXJwIHBhY2tldC4KKyAgIDQ6IFdha2UgdXAgaWYgcmVjZXZpZWQgYW55IHVuaWNhc3QgcGFja2V0LgorICAgVGhvc2UgdmFsdWUgY2FuIGJlIHN1bWVkIHVwIHRvIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBvcHRpb24uCisqLworVkVMT0NJVFlfUEFSQU0od29sX29wdHMsICJXYWtlIE9uIExhbiBvcHRpb25zIik7CisKKyNkZWZpbmUgSU5UX1dPUktTX0RFRiAgIDIwCisjZGVmaW5lIElOVF9XT1JLU19NSU4gICAxMAorI2RlZmluZSBJTlRfV09SS1NfTUFYICAgNjQKKworVkVMT0NJVFlfUEFSQU0oaW50X3dvcmtzLCAiTnVtYmVyIG9mIHBhY2tldHMgcGVyIGludGVycnVwdCBzZXJ2aWNlcyIpOworCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIkNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCAqaW5mbyk7CitzdGF0aWMgaW50IHZlbG9jaXR5X2dldF9wY2lfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9wcmludF9pbmZvKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdmVsb2NpdHlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2ZWxvY2l0eV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZlbG9jaXR5X3JlY2VpdmVfZnJhbWUoc3RydWN0IHZlbG9jaXR5X2luZm8gKiwgaW50IGlkeCk7CitzdGF0aWMgaW50IHZlbG9jaXR5X2FsbG9jX3J4X2J1ZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqLCBpbnQgaWR4KTsKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfcmRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9mcmVlX3R4X2J1ZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKik7CitzdGF0aWMgaW50IHZlbG9jaXR5X3NvZnRfcmVzZXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgbWlpX2luaXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBtaWlfc3RhdHVzKTsKK3N0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIHNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKTsKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NodXRkb3duKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9mbG93X2NvbnRyb2xfYWJpbGl0eShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBlbmFibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgaW50IHZlbG9jaXR5X21paV9yZWFkKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICosIHU4IGJ5SWR4LCB1MTYgKiBwZGF0YSk7CitzdGF0aWMgaW50IHZlbG9jaXR5X21paV93cml0ZShzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqLCB1OCBieU1paUFkZHIsIHUxNiBkYXRhKTsKK3N0YXRpYyB1MzIgbWlpX2NoZWNrX21lZGlhX21vZGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKTsKK3N0YXRpYyB1MzIgY2hlY2tfY29ubmVjdGlvbl90eXBlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cyk7CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCB2ZWxvY2l0eV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCB2ZWxvY2l0eV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdGF0aWMgaW50IHZlbG9jaXR5X25ldGRldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIG5vdGlmaWNhdGlvbiwgdm9pZCAqcHRyKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB2ZWxvY2l0eV9pbmV0YWRkcl9ub3RpZmllciA9IHsKKyAgICAgIC5ub3RpZmllcl9jYWxsCT0gdmVsb2NpdHlfbmV0ZGV2X2V2ZW50LAorfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyh2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQodmVsb2NpdHlfZGV2X2xpc3QpOworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9yZWdpc3Rlcl9ub3RpZmllcih2b2lkKQoreworCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZ2ZWxvY2l0eV9pbmV0YWRkcl9ub3RpZmllcik7Cit9CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZ2ZWxvY2l0eV9pbmV0YWRkcl9ub3RpZmllcik7Cit9CisKKyNlbHNlCQkJCS8qIENPTkZJR19QTSAqLworCisjZGVmaW5lIHZlbG9jaXR5X3JlZ2lzdGVyX25vdGlmaWVyKCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIoKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCQkJCS8qICFDT05GSUdfUE0gKi8KKworLyoKKyAqCUludGVybmFsIGJvYXJkIHZhcmlhbnRzLiBBdCB0aGUgbW9tZW50IHdlIGhhdmUgb25seSBvbmUKKyAqLworCitzdGF0aWMgc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsIGNoaXBfaW5mb190YWJsZVtdID0geworCXtDSElQX1RZUEVfVlQ2MTEwLCAiVklBIE5ldHdvcmtpbmcgVmVsb2NpdHkgRmFtaWx5IEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciIsIDI1NiwgMSwgMHgwMEZGRkZGRlVMfSwKKwl7MCwgTlVMTH0KK307CisKKy8qCisgKglEZXNjcmliZSB0aGUgUENJIGRldmljZSBpZGVudGlmaWVycyB0aGF0IHdlIHN1cHBvcnQgaW4gdGhpcworICoJZGV2aWNlIGRyaXZlci4gVXNlZCBmb3IgaG90cGx1ZyBhdXRvbG9hZGluZy4KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmVsb2NpdHlfaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfNjEyWCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpIGNoaXBfaW5mb190YWJsZX0sCisJezAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2ZWxvY2l0eV9pZF90YWJsZSk7CisKKy8qKgorICoJZ2V0X2NoaXBfbmFtZQktIAlpZGVudGlmaWVyIHRvIG5hbWUKKyAqCUBpZDogY2hpcCBpZGVudGlmaWVyCisgKgorICoJR2l2ZW4gYSBjaGlwIGlkZW50aWZpZXIgcmV0dXJuIGEgc3VpdGFibGUgZGVzY3JpcHRpb24uIFJldHVybnMKKyAqCWEgcG9pbnRlciBhIHN0YXRpYyBzdHJpbmcgdmFsaWQgd2hpbGUgdGhlIGRyaXZlciBpcyBsb2FkZWQuCisgKi8KKworc3RhdGljIGNoYXIgX19kZXZpbml0ICpnZXRfY2hpcF9uYW1lKGVudW0gY2hpcF90eXBlIGNoaXBfaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgY2hpcF9pbmZvX3RhYmxlW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlpZiAoY2hpcF9pbmZvX3RhYmxlW2ldLmNoaXBfaWQgPT0gY2hpcF9pZCkKKwkJCWJyZWFrOworCXJldHVybiBjaGlwX2luZm9fdGFibGVbaV0ubmFtZTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9yZW1vdmUxCS0JZGV2aWNlIHVucGx1ZworICoJQHBkZXY6IFBDSSBkZXZpY2UgYmVpbmcgcmVtb3ZlZAorICoKKyAqCURldmljZSB1bmxvYWQgY2FsbGJhY2suIENhbGxlZCBvbiBhbiB1bnBsdWcgb3Igb24gbW9kdWxlCisgKgl1bmxvYWQgZm9yIGVhY2ggYWN0aXZlIGRldmljZSB0aGF0IGlzIHByZXNlbnQuIERpc2Nvbm5lY3RzCisgKgl0aGUgZGV2aWNlIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIgYW5kIGZyZWVzIGFsbCB0aGUgcmVzb3VyY2VzCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZlbG9jaXR5X3JlbW92ZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKworI2lmZGVmIENPTkZJR19QTQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmdmVsb2NpdHlfZGV2X2xpc3QpKQorCQlsaXN0X2RlbCgmdnB0ci0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKHZwdHItPm1hY19yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXZlbG9jaXR5X25pY3MtLTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfaW50X29wdAktCXBhcnNlciBmb3IgaW50ZWdlciBvcHRpb25zCisgKglAb3B0OiBwb2ludGVyIHRvIG9wdGlvbiB2YWx1ZQorICoJQHZhbDogdmFsdWUgdGhlIHVzZXIgcmVxdWVzdGVkIChvciAtMSBmb3IgZGVmYXVsdCkKKyAqCUBtaW46IGxvd2VzdCB2YWx1ZSBhbGxvd2VkCisgKglAbWF4OiBoaWdoZXN0IHZhbHVlIGFsbG93ZWQKKyAqCUBkZWY6IGRlZmF1bHQgdmFsdWUKKyAqCUBuYW1lOiBwcm9wZXJ0eSBuYW1lCisgKglAZGV2OiBkZXZpY2UgbmFtZQorICoKKyAqCVNldCBhbiBpbnRlZ2VyIHByb3BlcnR5IGluIHRoZSBtb2R1bGUgb3B0aW9ucy4gVGhpcyBmdW5jdGlvbiBkb2VzCisgKglhbGwgdGhlIHZlcmlmaWNhdGlvbiBhbmQgY2hlY2tpbmcgYXMgd2VsbCBhcyByZXBvcnRpbmcgc28gdGhhdAorICoJd2UgZG9uJ3QgZHVwbGljYXRlIGNvZGUgZm9yIGVhY2ggb3B0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2ZWxvY2l0eV9zZXRfaW50X29wdChpbnQgKm9wdCwgaW50IHZhbCwgaW50IG1pbiwgaW50IG1heCwgaW50IGRlZiwgY2hhciAqbmFtZSwgY2hhciAqZGV2bmFtZSkKK3sKKwlpZiAodmFsID09IC0xKQorCQkqb3B0ID0gZGVmOworCWVsc2UgaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX05PVElDRSAiJXM6IHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZCwgdGhlIHZhbGlkIHJhbmdlIGlzICglZC0lZClcbiIsCisJCQkJCWRldm5hbWUsIG5hbWUsIG1pbiwgbWF4KTsKKwkJKm9wdCA9IGRlZjsKKwl9IGVsc2UgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyAiJXM6IHNldCB2YWx1ZSBvZiBwYXJhbWV0ZXIgJXMgdG8gJWRcbiIsCisJCQkJCWRldm5hbWUsIG5hbWUsIHZhbCk7CisJCSpvcHQgPSB2YWw7CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3NldF9ib29sX29wdAktCXBhcnNlciBmb3IgYm9vbGVhbiBvcHRpb25zCisgKglAb3B0OiBwb2ludGVyIHRvIG9wdGlvbiB2YWx1ZQorICoJQHZhbDogdmFsdWUgdGhlIHVzZXIgcmVxdWVzdGVkIChvciAtMSBmb3IgZGVmYXVsdCkKKyAqCUBkZWY6IGRlZmF1bHQgdmFsdWUgKHllcy9ubykKKyAqCUBmbGFnOiBudW1lcmljIHZhbHVlIHRvIHNldCBmb3IgdHJ1ZS4KKyAqCUBuYW1lOiBwcm9wZXJ0eSBuYW1lCisgKglAZGV2OiBkZXZpY2UgbmFtZQorICoKKyAqCVNldCBhIGJvb2xlYW4gcHJvcGVydHkgaW4gdGhlIG1vZHVsZSBvcHRpb25zLiBUaGlzIGZ1bmN0aW9uIGRvZXMKKyAqCWFsbCB0aGUgdmVyaWZpY2F0aW9uIGFuZCBjaGVja2luZyBhcyB3ZWxsIGFzIHJlcG9ydGluZyBzbyB0aGF0CisgKgl3ZSBkb24ndCBkdXBsaWNhdGUgY29kZSBmb3IgZWFjaCBvcHRpb24uCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHZlbG9jaXR5X3NldF9ib29sX29wdCh1MzIgKiBvcHQsIGludCB2YWwsIGludCBkZWYsIHUzMiBmbGFnLCBjaGFyICpuYW1lLCBjaGFyICpkZXZuYW1lKQoreworCSgqb3B0KSAmPSAofmZsYWcpOworCWlmICh2YWwgPT0gLTEpCisJCSpvcHQgfD0gKGRlZiA/IGZsYWcgOiAwKTsKKwllbHNlIGlmICh2YWwgPCAwIHx8IHZhbCA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdGhlIHZhbHVlIG9mIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLCB0aGUgdmFsaWQgcmFuZ2UgaXMgKDAtMSlcbiIsIAorCQkJZGV2bmFtZSwgbmFtZSk7CisJCSpvcHQgfD0gKGRlZiA/IGZsYWcgOiAwKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2V0IHBhcmFtZXRlciAlcyB0byAlc1xuIiwgCisJCQlkZXZuYW1lLCBuYW1lLCB2YWwgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKwkJKm9wdCB8PSAodmFsID8gZmxhZyA6IDApOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfb3B0aW9ucwktCXNldCBvcHRpb25zIG9uIGRldmljZQorICoJQG9wdHM6IG9wdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqCUBpbmRleDogaW5kZXggb2Ygb3B0aW9uIHRvIHVzZSBpbiBtb2R1bGUgb3B0aW9ucyBhcnJheQorICoJQGRldm5hbWU6IGRldmljZSBuYW1lCisgKgorICoJVHVybiB0aGUgbW9kdWxlIGFuZCBjb21tYW5kIG9wdGlvbnMgaW50byBhIHNpbmdsZSBzdHJ1Y3R1cmUKKyAqCWZvciB0aGUgY3VycmVudCBkZXZpY2UKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfZ2V0X29wdGlvbnMoc3RydWN0IHZlbG9jaXR5X29wdCAqb3B0cywgaW50IGluZGV4LCBjaGFyICpkZXZuYW1lKQoreworCisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPnJ4X3RocmVzaCwgcnhfdGhyZXNoW2luZGV4XSwgUlhfVEhSRVNIX01JTiwgUlhfVEhSRVNIX01BWCwgUlhfVEhSRVNIX0RFRiwgInJ4X3RocmVzaCIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5ETUFfbGVuZ3RoLCBETUFfbGVuZ3RoW2luZGV4XSwgRE1BX0xFTkdUSF9NSU4sIERNQV9MRU5HVEhfTUFYLCBETUFfTEVOR1RIX0RFRiwgIkRNQV9sZW5ndGgiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+bnVtcngsIFJ4RGVzY3JpcHRvcnNbaW5kZXhdLCBSWF9ERVNDX01JTiwgUlhfREVTQ19NQVgsIFJYX0RFU0NfREVGLCAiUnhEZXNjcmlwdG9ycyIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5udW10eCwgVHhEZXNjcmlwdG9yc1tpbmRleF0sIFRYX0RFU0NfTUlOLCBUWF9ERVNDX01BWCwgVFhfREVTQ19ERUYsICJUeERlc2NyaXB0b3JzIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPnZpZCwgVklEX3NldHRpbmdbaW5kZXhdLCBWTEFOX0lEX01JTiwgVkxBTl9JRF9NQVgsIFZMQU5fSURfREVGLCAiVklEX3NldHRpbmciLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfYm9vbF9vcHQoJm9wdHMtPmZsYWdzLCBlbmFibGVfdGFnZ2luZ1tpbmRleF0sIFRBR0dJTkdfREVGLCBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HLCAiZW5hYmxlX3RhZ2dpbmciLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfYm9vbF9vcHQoJm9wdHMtPmZsYWdzLCB0eGNzdW1fb2ZmbG9hZFtpbmRleF0sIFRYX0NTVU1fREVGLCBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNLCAidHhjc3VtX29mZmxvYWQiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+Zmxvd19jbnRsLCBmbG93X2NvbnRyb2xbaW5kZXhdLCBGTE9XX0NOVExfTUlOLCBGTE9XX0NOVExfTUFYLCBGTE9XX0NOVExfREVGLCAiZmxvd19jb250cm9sIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgSVBfYnl0ZV9hbGlnbltpbmRleF0sIElQX0FMSUdfREVGLCBWRUxPQ0lUWV9GTEFHU19JUF9BTElHTiwgIklQX2J5dGVfYWxpZ24iLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfYm9vbF9vcHQoJm9wdHMtPmZsYWdzLCBWYWxQa3RMZW5baW5kZXhdLCBWQUxfUEtUX0xFTl9ERUYsIFZFTE9DSVRZX0ZMQUdTX1ZBTF9QS1RfTEVOLCAiVmFsUGt0TGVuIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoKGludCAqKSAmb3B0cy0+c3BkX2RweCwgc3BlZWRfZHVwbGV4W2luZGV4XSwgTUVEX0xOS19NSU4sIE1FRF9MTktfTUFYLCBNRURfTE5LX0RFRiwgIk1lZGlhIGxpbmsgbW9kZSIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KChpbnQgKikgJm9wdHMtPndvbF9vcHRzLCB3b2xfb3B0c1tpbmRleF0sIFdPTF9PUFRfTUlOLCBXT0xfT1BUX01BWCwgV09MX09QVF9ERUYsICJXYWtlIE9uIExhbiBvcHRpb25zIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoKGludCAqKSAmb3B0cy0+aW50X3dvcmtzLCBpbnRfd29ya3NbaW5kZXhdLCBJTlRfV09SS1NfTUlOLCBJTlRfV09SS1NfTUFYLCBJTlRfV09SS1NfREVGLCAiSW50ZXJydXB0IHNlcnZpY2Ugd29ya3MiLCBkZXZuYW1lKTsKKwlvcHRzLT5udW1yeCA9IChvcHRzLT5udW1yeCAmIH4zKTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIJLQlpbml0aWFsaXNlIENBTQorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHByb2dyYW0KKyAqCisgKglJbml0aWFsaXplIHRoZSBjb250ZW50IGFkZHJlc3NhYmxlIG1lbW9yeSB1c2VkIGZvciBmaWx0ZXJzLiBMb2FkCisgKglhcHByb3ByaWF0ZWx5IGFjY29yZGluZyB0byB0aGUgcHJlc2VuY2Ugb2YgVkxBTgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfY2FtX2ZpbHRlcihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKworCS8qIFR1cm4gb24gTUNGR19QUUVOLCB0dXJuIG9mZiBNQ0ZHX1JUR09QVCAqLworCVdPUkRfUkVHX0JJVFNfU0VUKE1DRkdfUFFFTiwgTUNGR19SVEdPUFQsICZyZWdzLT5NQ0ZHKTsKKwlXT1JEX1JFR19CSVRTX09OKE1DRkdfVklERlIsICZyZWdzLT5NQ0ZHKTsKKworCS8qIERpc2FibGUgYWxsIENBTXMgKi8KKwltZW1zZXQodnB0ci0+dkNBTW1hc2ssIDAsIHNpemVvZih1OCkgKiA4KTsKKwltZW1zZXQodnB0ci0+bUNBTW1hc2ssIDAsIHNpemVvZih1OCkgKiA4KTsKKwltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPnZDQU1tYXNrLCBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT5tQ0FNbWFzaywgVkVMT0NJVFlfTVVMVElDQVNUX0NBTSk7CisKKwkvKiBFbmFibGUgZmlyc3QgVkNBTSAqLworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RBR0dJTkcpIHsKKwkJLyogSWYgVGFnZ2luZyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgVkxBTiBJRCBpcyBub3QgemVybywgdGhlbgorCQkgICB0dXJuIG9uIE1DRkdfUlRHT1BUIGFsc28gKi8KKwkJaWYgKHZwdHItPm9wdGlvbnMudmlkICE9IDApCisJCQlXT1JEX1JFR19CSVRTX09OKE1DRkdfUlRHT1BULCAmcmVncy0+TUNGRyk7CisKKwkJbWFjX3NldF9jYW0ocmVncywgMCwgKHU4ICopICYgKHZwdHItPm9wdGlvbnMudmlkKSwgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCQl2cHRyLT52Q0FNbWFza1swXSB8PSAxOworCQltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPnZDQU1tYXNrLCBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJfSBlbHNlIHsKKwkJdTE2IHRlbXAgPSAwOworCQltYWNfc2V0X2NhbShyZWdzLCAwLCAodTggKikgJnRlbXAsIFZFTE9DSVRZX1ZMQU5fSURfQ0FNKTsKKwkJdGVtcCA9IDE7CisJCW1hY19zZXRfY2FtX21hc2socmVncywgKHU4ICopICZ0ZW1wLCBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X3Jlc2V0CS0JaGFuZGxlIGEgcmVjZWl2ZSByZXNldAorICoJQHZwdHI6IHZlbG9jaXR5IHdlIGFyZSByZXNldHRpbmcKKyAqCisgKglSZXNldCB0aGUgb3duZXJzaGlwIGFuZCBzdGF0dXMgZm9yIHRoZSByZWNlaXZlIHJpbmcgc2lkZS4KKyAqCUhhbmQgYWxsIHRoZSByZWNlaXZlIHF1ZXVlIHRvIHRoZSBOSUMuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcnhfcmVzZXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaTsKKworCXZwdHItPnJkX2RpcnR5ID0gdnB0ci0+cmRfZmlsbGVkID0gdnB0ci0+cmRfY3VyciA9IDA7CisKKwkvKgorCSAqCUluaXQgc3RhdGUsIGFsbCBSRCBlbnRyaWVzIGJlbG9uZyB0byB0aGUgTklDCisJICovCisJZm9yIChpID0gMDsgaSA8IHZwdHItPm9wdGlvbnMubnVtcng7ICsraSkKKwkJdnB0ci0+cmRfcmluZ1tpXS5yZGVzYzAub3duZXIgPSBPV05FRF9CWV9OSUM7CisKKwl3cml0ZXcodnB0ci0+b3B0aW9ucy5udW1yeCwgJnJlZ3MtPlJCUkRVKTsKKwl3cml0ZWwodnB0ci0+cmRfcG9vbF9kbWEsICZyZWdzLT5SREJhc2VMbyk7CisJd3JpdGV3KDAsICZyZWdzLT5SRElkeCk7CisJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtcnggLSAxLCAmcmVncy0+UkRDU2l6ZSk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yZWdpc3RlcnMJLQlpbml0aWFsaXNlIE1BQyByZWdpc3RlcnMKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBpbml0CisgKglAdHlwZTogdHlwZSBvZiBpbml0aWFsaXNhdGlvbiAoaG90IG9yIGNvbGQpCisgKgorICoJSW5pdGlhbGlzZSB0aGUgTUFDIG9uIGEgcmVzZXQgb3Igb24gZmlyc3Qgc2V0IHVwIG9uIHRoZQorICoJaGFyZHdhcmUuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfaW5pdF9yZWdpc3RlcnMoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIAorCQkJCSAgICBlbnVtIHZlbG9jaXR5X2luaXRfdHlwZSB0eXBlKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBpLCBtaWlfc3RhdHVzOworCisJbWFjX3dvbF9yZXNldChyZWdzKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVkVMT0NJVFlfSU5JVF9SRVNFVDoKKwljYXNlIFZFTE9DSVRZX0lOSVRfV09MOgorCisJCW5ldGlmX3N0b3BfcXVldWUodnB0ci0+ZGV2KTsKKworCQkvKgorCQkgKglSZXNldCBSWCB0byBwcmV2ZW50IFJYIHBvaW50ZXIgbm90IG9uIHRoZSA0WCBsb2NhdGlvbgorCQkgKi8KKwkJdmVsb2NpdHlfcnhfcmVzZXQodnB0cik7CisJCW1hY19yeF9xdWV1ZV9ydW4ocmVncyk7CisJCW1hY19yeF9xdWV1ZV93YWtlKHJlZ3MpOworCisJCW1paV9zdGF0dXMgPSB2ZWxvY2l0eV9nZXRfb3B0X21lZGlhX21vZGUodnB0cik7CisJCWlmICh2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZSh2cHRyLCBtaWlfc3RhdHVzKSAhPSBWRUxPQ0lUWV9MSU5LX0NIQU5HRSkgeworCQkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisJCX0KKworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisKKwkJbWFjX2NsZWFyX2lzcihyZWdzKTsKKwkJd3JpdGVsKENSMF9TVE9QLCAmcmVncy0+Q1IwQ2xyKTsKKwkJd3JpdGVsKChDUjBfRFBPTEwgfCBDUjBfVFhPTiB8IENSMF9SWE9OIHwgQ1IwX1NUUlQpLCAKKwkJCQkJCQkmcmVncy0+Q1IwU2V0KTsKKworCQlicmVhazsKKworCWNhc2UgVkVMT0NJVFlfSU5JVF9DT0xEOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqCURvIHJlc2V0CisJCSAqLworCQl2ZWxvY2l0eV9zb2Z0X3Jlc2V0KHZwdHIpOworCQltZGVsYXkoNSk7CisKKwkJbWFjX2VlcHJvbV9yZWxvYWQocmVncyk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXdyaXRlYih2cHRyLT5kZXYtPmRldl9hZGRyW2ldLCAmKHJlZ3MtPlBBUltpXSkpOworCQl9CisJCS8qCisJCSAqCWNsZWFyIFByZV9BQ1BJIGJpdC4KKwkJICovCisJCUJZVEVfUkVHX0JJVFNfT0ZGKENGR0FfUEFDUEksICYocmVncy0+Q0ZHQSkpOworCQltYWNfc2V0X3J4X3RocmVzaChyZWdzLCB2cHRyLT5vcHRpb25zLnJ4X3RocmVzaCk7CisJCW1hY19zZXRfZG1hX2xlbmd0aChyZWdzLCB2cHRyLT5vcHRpb25zLkRNQV9sZW5ndGgpOworCisJCXdyaXRlYihXT0xDRkdfU0FNIHwgV09MQ0ZHX1NBQiwgJnJlZ3MtPldPTENGR1NldCk7CisJCS8qCisJCSAqCUJhY2sgb2ZmIGFsZ29yaXRobSB1c2Ugb3JpZ2luYWwgSUVFRSBzdGFuZGFyZAorCQkgKi8KKwkJQllURV9SRUdfQklUU19TRVQoQ0ZHQl9PRlNFVCwgKENGR0JfQ1JBTkRPTSB8IENGR0JfQ0FQIHwgQ0ZHQl9NQkEgfCBDRkdCX0JBS09QVCksICZyZWdzLT5DRkdCKTsKKworCQkvKgorCQkgKglJbml0IENBTSBmaWx0ZXIKKwkJICovCisJCXZlbG9jaXR5X2luaXRfY2FtX2ZpbHRlcih2cHRyKTsKKworCQkvKgorCQkgKglTZXQgcGFja2V0IGZpbHRlcjogUmVjZWl2ZSBkaXJlY3RlZCBhbmQgYnJvYWRjYXN0IGFkZHJlc3MKKwkJICovCisJCXZlbG9jaXR5X3NldF9tdWx0aSh2cHRyLT5kZXYpOworCisJCS8qCisJCSAqCUVuYWJsZSBNSUkgYXV0by1wb2xsaW5nCisJCSAqLworCQllbmFibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJCXZwdHItPmludF9tYXNrID0gSU5UX01BU0tfREVGOworCisJCXdyaXRlbChjcHVfdG9fbGUzMih2cHRyLT5yZF9wb29sX2RtYSksICZyZWdzLT5SREJhc2VMbyk7CisJCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4IC0gMSwgJnJlZ3MtPlJEQ1NpemUpOworCQltYWNfcnhfcXVldWVfcnVuKHJlZ3MpOworCQltYWNfcnhfcXVldWVfd2FrZShyZWdzKTsKKworCQl3cml0ZXcodnB0ci0+b3B0aW9ucy5udW10eCAtIDEsICZyZWdzLT5URENTaXplKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+bnVtX3R4cTsgaSsrKSB7CisJCQl3cml0ZWwoY3B1X3RvX2xlMzIodnB0ci0+dGRfcG9vbF9kbWFbaV0pLCAmKHJlZ3MtPlREQmFzZUxvW2ldKSk7CisJCQltYWNfdHhfcXVldWVfcnVuKHJlZ3MsIGkpOworCQl9CisKKwkJaW5pdF9mbG93X2NvbnRyb2xfcmVnaXN0ZXIodnB0cik7CisKKwkJd3JpdGVsKENSMF9TVE9QLCAmcmVncy0+Q1IwQ2xyKTsKKwkJd3JpdGVsKChDUjBfRFBPTEwgfCBDUjBfVFhPTiB8IENSMF9SWE9OIHwgQ1IwX1NUUlQpLCAmcmVncy0+Q1IwU2V0KTsKKworCQltaWlfc3RhdHVzID0gdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHZwdHIpOworCQluZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisKKwkJbWlpX2luaXQodnB0ciwgbWlpX3N0YXR1cyk7CisKKwkJaWYgKHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHZwdHIsIG1paV9zdGF0dXMpICE9IFZFTE9DSVRZX0xJTktfQ0hBTkdFKSB7CisJCQl2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyh2cHRyKTsKKwkJCWlmICghKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9MSU5LX0ZBSUwpKQorCQkJCW5ldGlmX3dha2VfcXVldWUodnB0ci0+ZGV2KTsKKwkJfQorCisJCWVuYWJsZV9mbG93X2NvbnRyb2xfYWJpbGl0eSh2cHRyKTsKKwkJbWFjX2h3X21pYnNfaW5pdChyZWdzKTsKKwkJbWFjX3dyaXRlX2ludF9tYXNrKHZwdHItPmludF9tYXNrLCByZWdzKTsKKwkJbWFjX2NsZWFyX2lzcihyZWdzKTsKKworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9zb2Z0X3Jlc2V0CS0Jc29mdCByZXNldAorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHJlc2V0CisgKgorICoJS2ljayBvZmYgYSBzb2Z0IHJlc2V0IG9mIHRoZSB2ZWxvY2l0eSBhZGFwdGVyIGFuZCB0aGVuIHBvbGwKKyAqCXVudGlsIHRoZSByZXNldCBzZXF1ZW5jZSBoYXMgY29tcGxldGVkIGJlZm9yZSByZXR1cm5pbmcuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9zb2Z0X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBpID0gMDsKKworCXdyaXRlbChDUjBfU0ZSU1QsICZyZWdzLT5DUjBTZXQpOworCisJZm9yIChpID0gMDsgaSA8IFdfTUFYX1RJTUVPVVQ7IGkrKykgeworCQl1ZGVsYXkoNSk7CisJCWlmICghRFdPUkRfUkVHX0JJVFNfSVNfT04oQ1IwX1NGUlNULCAmcmVncy0+Q1IwU2V0KSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IFdfTUFYX1RJTUVPVVQpIHsKKwkJd3JpdGVsKENSMF9GT1JTUlNULCAmcmVncy0+Q1IwU2V0KTsKKwkJLyogRklYTUU6IFBDSSBQT1NUSU5HICovCisJCS8qIGRlbGF5IDJtcyAqLworCQltZGVsYXkoMik7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X2ZvdW5kMQkJLQlzZXQgdXAgZGlzY292ZXJlZCB2ZWxvY2l0eSBjYXJkCisgKglAcGRldjogUENJIGRldmljZQorICoJQGVudDogUENJIGRldmljZSB0YWJsZSBlbnRyeSB0aGF0IG1hdGNoZWQKKyAqCisgKglDb25maWd1cmUgYSBkaXNjb3ZlcmVkIGFkYXB0ZXIgZnJvbSBzY3JhdGNoLiBSZXR1cm4gYSBuZWdhdGl2ZQorICoJZXJybm8gZXJyb3IgY29kZSBvbiBmYWlsdXJlIHBhdGhzLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZlbG9jaXR5X2ZvdW5kMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCAqaW5mbyA9IChzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKikgZW50LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3M7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlpZiAodmVsb2NpdHlfbmljcyA+PSBNQVhfVU5JVFMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFIFZFTE9DSVRZX05BTUUgIjogYWxyZWFkeSBmb3VuZCAlZCBOSUNzLlxuIiwgCisJCQkJdmVsb2NpdHlfbmljcyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbykpOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBWRUxPQ0lUWV9OQU1FICI6IGFsbG9jYXRlIG5ldCBkZXZpY2UgZmFpbGVkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBDaGFpbiBpdCBhbGwgdG9nZXRoZXIgKi8KKwkKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwl2cHRyID0gZGV2LT5wcml2OworCisKKwlpZiAoZmlyc3QpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgVmVyLiAlc1xuIiwgCisJCQlWRUxPQ0lUWV9GVUxMX0RSVl9OQU0sIFZFTE9DSVRZX1ZFUlNJT04pOworCQlwcmludGsoS0VSTl9JTkZPICJDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQgSW5jLlxuIik7CisJCWZpcnN0ID0gMDsKKwl9CisKKwl2ZWxvY2l0eV9pbml0X2luZm8ocGRldiwgdnB0ciwgaW5mbyk7CisKKwl2cHRyLT5kZXYgPSBkZXY7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQgPCAwKSAKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwlyZXQgPSB2ZWxvY2l0eV9nZXRfcGNpX2luZm8odnB0ciwgcGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFZFTE9DSVRZX05BTUUgIjogRmFpbGVkIHRvIGZpbmQgUENJIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgVkVMT0NJVFlfTkFNRSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFZFTE9DSVRZX05BTUUgIjogRmFpbGVkIHRvIGZpbmQgUENJIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCXJlZ3MgPSBpb3JlbWFwKHZwdHItPm1lbWFkZHIsIHZwdHItPmlvX3NpemUpOworCWlmIChyZWdzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcmVsZWFzZV9yZXM7CisJfQorCisJdnB0ci0+bWFjX3JlZ3MgPSByZWdzOworCisJbWFjX3dvbF9yZXNldChyZWdzKTsKKworCWRldi0+YmFzZV9hZGRyID0gdnB0ci0+aW9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKCZyZWdzLT5QQVJbaV0pOworCisKKwl2ZWxvY2l0eV9nZXRfb3B0aW9ucygmdnB0ci0+b3B0aW9ucywgdmVsb2NpdHlfbmljcywgZGV2LT5uYW1lKTsKKworCS8qIAorCSAqCU1hc2sgb3V0IHRoZSBvcHRpb25zIGNhbm5vdCBiZSBzZXQgdG8gdGhlIGNoaXAKKwkgKi8KKwkgCisJdnB0ci0+b3B0aW9ucy5mbGFncyAmPSBpbmZvLT5mbGFnczsKKworCS8qCisJICoJRW5hYmxlIHRoZSBjaGlwIHNwZWNpZmllZCBjYXBiaWxpdGllcworCSAqLworCSAKKwl2cHRyLT5mbGFncyA9IHZwdHItPm9wdGlvbnMuZmxhZ3MgfCAoaW5mby0+ZmxhZ3MgJiAweEZGMDAwMDAwVUwpOworCisJdnB0ci0+d29sX29wdHMgPSB2cHRyLT5vcHRpb25zLndvbF9vcHRzOworCXZwdHItPmZsYWdzIHw9IFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEOworCisJdnB0ci0+cGh5X2lkID0gTUlJX0dFVF9QSFlfSUQodnB0ci0+bWFjX3JlZ3MpOworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5vcGVuID0gdmVsb2NpdHlfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZlbG9jaXR5X3htaXQ7CisJZGV2LT5zdG9wID0gdmVsb2NpdHlfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB2ZWxvY2l0eV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2ZWxvY2l0eV9zZXRfbXVsdGk7CisJZGV2LT5kb19pb2N0bCA9IHZlbG9jaXR5X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmdmVsb2NpdHlfZXRodG9vbF9vcHM7CisJZGV2LT5jaGFuZ2VfbXR1ID0gdmVsb2NpdHlfY2hhbmdlX210dTsKKyNpZmRlZiAgVkVMT0NJVFlfWkVST19DT1BZX1NVUFBPUlQKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CisjZW5kaWYKKworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0pIHsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2lvdW5tYXA7CisKKwl2ZWxvY2l0eV9wcmludF9pbmZvKHZwdHIpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCQorCS8qIGFuZCBsZWF2ZSB0aGUgY2hpcCBwb3dlcmVkIGRvd24gKi8KKwkKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisjaWZkZWYgQ09ORklHX1BNCisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkKCZ2cHRyLT5saXN0LCAmdmVsb2NpdHlfZGV2X2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJfQorI2VuZGlmCisJdmVsb2NpdHlfbmljcysrOworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9pb3VubWFwOgorCWlvdW5tYXAocmVncyk7CitlcnJfcmVsZWFzZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqCXZlbG9jaXR5X3ByaW50X2luZm8JLQlwZXIgZHJpdmVyIGRhdGEKKyAqCUB2cHRyOiB2ZWxvY2l0eQorICoKKyAqCVByaW50IHBlciBkcml2ZXIgZGF0YSBhcyB0aGUga2VybmVsIGRyaXZlciBmaW5kcyBWZWxvY2l0eQorICoJaGFyZHdhcmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfcHJpbnRfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdnB0ci0+ZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIGdldF9jaGlwX25hbWUodnB0ci0+Y2hpcF9pZCkpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBFdGhlcm5ldCBBZGRyZXNzOiAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwgCisJCWRldi0+bmFtZSwgCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sIAorCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X2luZm8JLQlpbml0IHByaXZhdGUgZGF0YQorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUB2cHRyOiBWZWxvY2l0eSBpbmZvCisgKglAaW5mbzogQm9hcmQgdHlwZQorICoKKyAqCVNldCB1cCB0aGUgaW5pdGlhbCB2ZWxvY2l0eV9pbmZvIHN0cnVjdCBmb3IgdGhlIGRldmljZSB0aGF0IGhhcyBiZWVuCisgKglkaXNjb3ZlcmVkLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2ZWxvY2l0eV9pbml0X2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8pCit7CisJbWVtc2V0KHZwdHIsIDAsIHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbykpOworCisJdnB0ci0+cGRldiA9IHBkZXY7CisJdnB0ci0+Y2hpcF9pZCA9IGluZm8tPmNoaXBfaWQ7CisJdnB0ci0+aW9fc2l6ZSA9IGluZm8tPmlvX3NpemU7CisJdnB0ci0+bnVtX3R4cSA9IGluZm8tPnR4cXVldWU7CisJdnB0ci0+bXVsdGljYXN0X2xpbWl0ID0gTUNBTV9TSVpFOworCXNwaW5fbG9ja19pbml0KCZ2cHRyLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdnB0ci0+bGlzdCk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZ2V0X3BjaV9pbmZvCS0JcmV0cmlldmUgUENJIGluZm8gZm9yIGRldmljZQorICoJQHZwdHI6IHZlbG9jaXR5IGRldmljZQorICoJQHBkZXY6IFBDSSBkZXZpY2UgaXQgbWF0Y2hlcworICoKKyAqCVJldHJpZXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBkYXRhIHRoYXQgaW50ZXJlc3RzIHVzIGZyb20KKyAqCXRoZSBrZXJuZWwgUENJIGxheWVyCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdmVsb2NpdHlfZ2V0X3BjaV9pbmZvKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKworCWlmKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnZwdHItPnJldl9pZCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwkJCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwl2cHRyLT5pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJdnB0ci0+bWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwkKKwlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaW9uICMwIGlzIG5vdCBhbiBJL08gcmVzb3VyY2UsIGFib3J0aW5nLlxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT1JFU09VUkNFX0lPKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lvbiAjMSBpcyBhbiBJL08gcmVzb3VyY2UsIGFib3J0aW5nLlxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCAyNTYpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpb24gIzEgaXMgdG9vIHNtYWxsLlxuIiwgCisJCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdnB0ci0+cGRldiA9IHBkZXY7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X3JpbmdzCS0Jc2V0IHVwIERNQSByaW5ncworICoJQHZwdHI6IFZlbG9jaXR5IHRvIHNldCB1cAorICoKKyAqCUFsbG9jYXRlIFBDSSBtYXBwZWQgRE1BIHJpbmdzIGZvciB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgbGF5ZXIKKyAqCXRvIHVzZS4KKyAqLworCitzdGF0aWMgaW50IHZlbG9jaXR5X2luaXRfcmluZ3Moc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHBzaXplOworCXVuc2lnbmVkIGludCB0c2l6ZTsKKwlkbWFfYWRkcl90IHBvb2xfZG1hOworCXU4ICpwb29sOworCisJLyoKKwkgKglBbGxvY2F0ZSBhbGwgUkQvVEQgcmluZ3MgYSBzaW5nbGUgcG9vbCAKKwkgKi8KKwkgCisJcHNpemUgPSB2cHRyLT5vcHRpb25zLm51bXJ4ICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArIAorCQl2cHRyLT5vcHRpb25zLm51bXR4ICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHZwdHItPm51bV90eHE7CisKKwkvKgorCSAqIHBjaV9hbGxvY19jb25zaXN0ZW50KCkgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IGZvciA2NCBieXRlcworCSAqIGFsaWdubWVudAorCSAqLworCXBvb2wgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBwc2l6ZSwgJnBvb2xfZG1hKTsKKworCWlmIChwb29sID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyA6IERNQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCAKKwkJCQkJdnB0ci0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHBvb2wsIDAsIHBzaXplKTsKKworCXZwdHItPnJkX3JpbmcgPSAoc3RydWN0IHJ4X2Rlc2MgKikgcG9vbDsKKworCXZwdHItPnJkX3Bvb2xfZG1hID0gcG9vbF9kbWE7CisKKwl0c2l6ZSA9IHZwdHItPm9wdGlvbnMubnVtdHggKiBQS1RfQlVGX1NaICogdnB0ci0+bnVtX3R4cTsKKwl2cHRyLT50eF9idWZzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodnB0ci0+cGRldiwgdHNpemUsIAorCQkJCQkJJnZwdHItPnR4X2J1ZnNfZG1hKTsKKworCWlmICh2cHRyLT50eF9idWZzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIsIAorCQkJCQl2cHRyLT5kZXYtPm5hbWUpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHZwdHItPnBkZXYsIHBzaXplLCBwb29sLCBwb29sX2RtYSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldCh2cHRyLT50eF9idWZzLCAwLCB2cHRyLT5vcHRpb25zLm51bXR4ICogUEtUX0JVRl9TWiAqIHZwdHItPm51bV90eHEpOworCisJaSA9IHZwdHItPm9wdGlvbnMubnVtcnggKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworCXBvb2wgKz0gaTsKKwlwb29sX2RtYSArPSBpOworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5udW1fdHhxOyBpKyspIHsKKwkJaW50IG9mZnNldCA9IHZwdHItPm9wdGlvbnMubnVtdHggKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpOworCisJCXZwdHItPnRkX3Bvb2xfZG1hW2ldID0gcG9vbF9kbWE7CisJCXZwdHItPnRkX3JpbmdzW2ldID0gKHN0cnVjdCB0eF9kZXNjICopIHBvb2w7CisJCXBvb2wgKz0gb2Zmc2V0OworCQlwb29sX2RtYSArPSBvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X2ZyZWVfcmluZ3MJLQlmcmVlIFBDSSByaW5nIHBvaW50ZXJzCisgKglAdnB0cjogVmVsb2NpdHkgdG8gZnJlZSBmcm9tCisgKgorICoJQ2xlYW4gdXAgdGhlIFBDSSByaW5nIGJ1ZmZlcnMgYWxsb2NhdGVkIHRvIHRoaXMgdmVsb2NpdHkuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV9yaW5ncyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSB2cHRyLT5vcHRpb25zLm51bXJ4ICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArIAorCSAgICAgICB2cHRyLT5vcHRpb25zLm51bXR4ICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHZwdHItPm51bV90eHE7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHZwdHItPnBkZXYsIHNpemUsIHZwdHItPnJkX3JpbmcsIHZwdHItPnJkX3Bvb2xfZG1hKTsKKworCXNpemUgPSB2cHRyLT5vcHRpb25zLm51bXR4ICogUEtUX0JVRl9TWiAqIHZwdHItPm51bV90eHE7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHZwdHItPnBkZXYsIHNpemUsIHZwdHItPnR4X2J1ZnMsIHZwdHItPnR4X2J1ZnNfZG1hKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZlbG9jaXR5X2dpdmVfbWFueV9yeF9kZXNjcyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBhdmFpbCwgZGlydHksIHVudXNhYmxlOworCisJLyoKKwkgKiBSRCBudW1iZXIgbXVzdCBiZSBlcXVhbCB0byA0WCBwZXIgaGFyZHdhcmUgc3BlYworCSAqIChwcm9ncmFtbWluZyBndWlkZSByZXYgMS4yMCwgcC4xMykKKwkgKi8KKwlpZiAodnB0ci0+cmRfZmlsbGVkIDwgNCkKKwkJcmV0dXJuOworCisJd21iKCk7CisKKwl1bnVzYWJsZSA9IHZwdHItPnJkX2ZpbGxlZCAmIDB4MDAwMzsKKwlkaXJ0eSA9IHZwdHItPnJkX2RpcnR5IC0gdW51c2FibGU7CisJZm9yIChhdmFpbCA9IHZwdHItPnJkX2ZpbGxlZCAmIDB4ZmZmYzsgYXZhaWw7IGF2YWlsLS0pIHsKKwkJZGlydHkgPSAoZGlydHkgPiAwKSA/IGRpcnR5IC0gMSA6IHZwdHItPm9wdGlvbnMubnVtcnggLSAxOworCQl2cHRyLT5yZF9yaW5nW2RpcnR5XS5yZGVzYzAub3duZXIgPSBPV05FRF9CWV9OSUM7CisJfQorCisJd3JpdGV3KHZwdHItPnJkX2ZpbGxlZCAmIDB4ZmZmYywgJnJlZ3MtPlJCUkRVKTsKKwl2cHRyLT5yZF9maWxsZWQgPSB1bnVzYWJsZTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9yeF9yZWZpbGwoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IGRpcnR5ID0gdnB0ci0+cmRfZGlydHksIGRvbmUgPSAwLCByZXQgPSAwOworCisJZG8geworCQlzdHJ1Y3QgcnhfZGVzYyAqcmQgPSB2cHRyLT5yZF9yaW5nICsgZGlydHk7CisKKwkJLyogRmluZSBmb3IgYW4gYWxsIHplcm8gUnggZGVzYyBhdCBpbml0IHRpbWUgYXMgd2VsbCAqLworCQlpZiAocmQtPnJkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCQlicmVhazsKKworCQlpZiAoIXZwdHItPnJkX2luZm9bZGlydHldLnNrYikgeworCQkJcmV0ID0gdmVsb2NpdHlfYWxsb2NfcnhfYnVmKHZwdHIsIGRpcnR5KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCWRvbmUrKzsKKwkJZGlydHkgPSAoZGlydHkgPCB2cHRyLT5vcHRpb25zLm51bXJ4IC0gMSkgPyBkaXJ0eSArIDEgOiAwOwkKKwl9IHdoaWxlIChkaXJ0eSAhPSB2cHRyLT5yZF9jdXJyKTsKKworCWlmIChkb25lKSB7CisJCXZwdHItPnJkX2RpcnR5ID0gZGlydHk7CisJCXZwdHItPnJkX2ZpbGxlZCArPSBkb25lOworCQl2ZWxvY2l0eV9naXZlX21hbnlfcnhfZGVzY3ModnB0cik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X3JkX3JpbmcJLQlzZXQgdXAgcmVjZWl2ZSByaW5nCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY29uZmlndXJlCisgKgorICoJQWxsb2NhdGUgYW5kIHNldCB1cCB0aGUgcmVjZWl2ZSBidWZmZXJzIGZvciBlYWNoIHJpbmcgc2xvdCBhbmQKKyAqCWFzc2lnbiB0aGVtIHRvIHRoZSBuZXR3b3JrIGFkYXB0ZXIuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9pbml0X3JkX3Jpbmcoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJdW5zaWduZWQgaW50IHJzaXplID0gc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSAqIAorCQkJCQl2cHRyLT5vcHRpb25zLm51bXJ4OworCisJdnB0ci0+cmRfaW5mbyA9IGttYWxsb2MocnNpemUsIEdGUF9LRVJORUwpOworCWlmKHZwdHItPnJkX2luZm8gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJbWVtc2V0KHZwdHItPnJkX2luZm8sIDAsIHJzaXplKTsKKworCXZwdHItPnJkX2ZpbGxlZCA9IHZwdHItPnJkX2RpcnR5ID0gdnB0ci0+cmRfY3VyciA9IDA7CisKKwlyZXQgPSB2ZWxvY2l0eV9yeF9yZWZpbGwodnB0cik7CisJaWYgKHJldCA8IDApIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBSWCBidWZmZXIuXG4iLCB2cHRyLT5kZXYtPm5hbWUpOworCQl2ZWxvY2l0eV9mcmVlX3JkX3JpbmcodnB0cik7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZnJlZV9yZF9yaW5nCS0JZnJlZSByZWNlaXZlIHJpbmcKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBjbGVhbiB1cAorICoKKyAqCUZyZWUgdGhlIHJlY2VpdmUgYnVmZmVycyBmb3IgZWFjaCByaW5nIHNsb3QgYW5kIGFueQorICoJYXR0YWNoZWQgc29ja2V0IGJ1ZmZlcnMgdGhhdCBuZWVkIHRvIGdvIGF3YXkuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBpOworCisJaWYgKHZwdHItPnJkX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHZwdHItPm9wdGlvbnMubnVtcng7IGkrKykgeworCQlzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqcmRfaW5mbyA9ICYodnB0ci0+cmRfaW5mb1tpXSk7CisKKwkJaWYgKCFyZF9pbmZvLT5za2IpCisJCQljb250aW51ZTsKKwkJcGNpX3VubWFwX3NpbmdsZSh2cHRyLT5wZGV2LCByZF9pbmZvLT5za2JfZG1hLCB2cHRyLT5yeF9idWZfc3osCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJkX2luZm8tPnNrYl9kbWEgPSAoZG1hX2FkZHJfdCkgTlVMTDsKKworCQlkZXZfa2ZyZWVfc2tiKHJkX2luZm8tPnNrYik7CisJCXJkX2luZm8tPnNrYiA9IE5VTEw7CisJfQorCisJa2ZyZWUodnB0ci0+cmRfaW5mbyk7CisJdnB0ci0+cmRfaW5mbyA9IE5VTEw7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF90ZF9yaW5nCS0Jc2V0IHVwIHRyYW5zbWl0IHJpbmcKKyAqCUB2cHRyOgl2ZWxvY2l0eQorICoKKyAqCVNldCB1cCB0aGUgdHJhbnNtaXQgcmluZyBhbmQgY2hhaW4gdGhlIHJpbmcgcG9pbnRlcnMgdG9nZXRoZXIuCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIHBvc2l4IGVycm5vIGNvZGUgZm9yCisgKglmYWlsdXJlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2luaXRfdGRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgaSwgajsKKwlkbWFfYWRkcl90IGN1cnI7CisJc3RydWN0IHR4X2Rlc2MgKnRkOworCXN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICp0ZF9pbmZvOworCXVuc2lnbmVkIGludCB0c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbykgKiAKKwkJCQkJdnB0ci0+b3B0aW9ucy5udW10eDsKKworCS8qIEluaXQgdGhlIFREIHJpbmcgZW50cmllcyAqLworCWZvciAoaiA9IDA7IGogPCB2cHRyLT5udW1fdHhxOyBqKyspIHsKKwkJY3VyciA9IHZwdHItPnRkX3Bvb2xfZG1hW2pdOworCisJCXZwdHItPnRkX2luZm9zW2pdID0ga21hbGxvYyh0c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmKHZwdHItPnRkX2luZm9zW2pdID09IE5VTEwpCisJCXsKKwkJCXdoaWxlKC0taiA+PSAwKQorCQkJCWtmcmVlKHZwdHItPnRkX2luZm9zW2pdKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCh2cHRyLT50ZF9pbmZvc1tqXSwgMCwgdHNpemUpOworCisJCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5vcHRpb25zLm51bXR4OyBpKyssIGN1cnIgKz0gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSkgeworCQkJdGQgPSAmKHZwdHItPnRkX3JpbmdzW2pdW2ldKTsKKwkJCXRkX2luZm8gPSAmKHZwdHItPnRkX2luZm9zW2pdW2ldKTsKKwkJCXRkX2luZm8tPmJ1ZiA9IHZwdHItPnR4X2J1ZnMgKworCQkJCShqICogdnB0ci0+b3B0aW9ucy5udW10eCArIGkpICogUEtUX0JVRl9TWjsKKwkJCXRkX2luZm8tPmJ1Zl9kbWEgPSB2cHRyLT50eF9idWZzX2RtYSArCisJCQkJKGogKiB2cHRyLT5vcHRpb25zLm51bXR4ICsgaSkgKiBQS1RfQlVGX1NaOworCQl9CisJCXZwdHItPnRkX3RhaWxbal0gPSB2cHRyLT50ZF9jdXJyW2pdID0gdnB0ci0+dGRfdXNlZFtqXSA9IDA7CisJfQorCXJldHVybiAwOworfQorCisvKgorICoJRklYTUU6IGNvdWxkIHdlIG1lcmdlIHRoaXMgd2l0aCB2ZWxvY2l0eV9mcmVlX3R4X2J1ZiA/CisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV90ZF9yaW5nX2VudHJ5KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLAorCQkJCQkJCSBpbnQgcSwgaW50IG4pCit7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKiB0ZF9pbmZvID0gJih2cHRyLT50ZF9pbmZvc1txXVtuXSk7CisJaW50IGk7CisJCisJaWYgKHRkX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuOworCQkKKwlpZiAodGRfaW5mby0+c2tiKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0ZF9pbmZvLT5uc2tiX2RtYTsgaSsrKQorCQl7CisJCQlpZiAodGRfaW5mby0+c2tiX2RtYVtpXSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgdGRfaW5mby0+c2tiX2RtYVtpXSwgCisJCQkJCXRkX2luZm8tPnNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQl0ZF9pbmZvLT5za2JfZG1hW2ldID0gKGRtYV9hZGRyX3QpIE5VTEw7CisJCQl9CisJCX0KKwkJZGV2X2tmcmVlX3NrYih0ZF9pbmZvLT5za2IpOworCQl0ZF9pbmZvLT5za2IgPSBOVUxMOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9mcmVlX3RkX3JpbmcJLQlmcmVlIHRkIHJpbmcKKyAqCUB2cHRyOiB2ZWxvY2l0eQorICoKKyAqCUZyZWUgdXAgdGhlIHRyYW5zbWl0IHJpbmcgZm9yIHRoaXMgcGFydGljdWxhciB2ZWxvY2l0eSBhZGFwdGVyLgorICoJV2UgZnJlZSB0aGUgcmluZyBjb250ZW50cyBidXQgbm90IHRoZSByaW5nIGl0c2VsZi4KKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV90ZF9yaW5nKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgaiA8IHZwdHItPm51bV90eHE7IGorKykgeworCQlpZiAodnB0ci0+dGRfaW5mb3Nbal0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+b3B0aW9ucy5udW10eDsgaSsrKSB7CisJCQl2ZWxvY2l0eV9mcmVlX3RkX3JpbmdfZW50cnkodnB0ciwgaiwgaSk7CisKKwkJfQorCQlpZiAodnB0ci0+dGRfaW5mb3Nbal0pIHsKKwkJCWtmcmVlKHZwdHItPnRkX2luZm9zW2pdKTsKKwkJCXZwdHItPnRkX2luZm9zW2pdID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9yeF9zcnYJCS0Jc2VydmljZSBSWCBpbnRlcnJ1cHQKKyAqCUB2cHRyOiB2ZWxvY2l0eQorICoJQHN0YXR1czogYWRhcHRlciBzdGF0dXMgKHVudXNlZCkKKyAqCisgKglXYWxrIHRoZSByZWNlaXZlIHJpbmcgb2YgdGhlIHZlbG9jaXR5IGFkYXB0ZXIgYW5kIHJlbW92ZQorICoJYW55IHJlY2VpdmVkIHBhY2tldHMgZnJvbSB0aGUgcmVjZWl2ZSBxdWV1ZS4gSGFuZCB0aGUgcmluZworICoJc2xvdHMgYmFjayB0byB0aGUgYWRhcHRlciBmb3IgcmV1c2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcnhfc3J2KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ2cHRyLT5zdGF0czsKKwlpbnQgcmRfY3VyciA9IHZwdHItPnJkX2N1cnI7CisJaW50IHdvcmtzID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKnJkID0gdnB0ci0+cmRfcmluZyArIHJkX2N1cnI7CisKKwkJaWYgKCF2cHRyLT5yZF9pbmZvW3JkX2N1cnJdLnNrYikKKwkJCWJyZWFrOworCisJCWlmIChyZC0+cmRlc2MwLm93bmVyID09IE9XTkVEX0JZX05JQykKKwkJCWJyZWFrOworCisJCXJtYigpOworCisJCS8qCisJCSAqCURvbid0IGRyb3AgQ0Ugb3IgUkwgZXJyb3IgZnJhbWUgYWx0aG91Z2ggUlhPSyBpcyBvZmYKKwkJICovCisJCWlmICgocmQtPnJkZXNjMC5SU1IgJiBSU1JfUlhPSykgfHwgKCEocmQtPnJkZXNjMC5SU1IgJiBSU1JfUlhPSykgJiYgKHJkLT5yZGVzYzAuUlNSICYgKFJTUl9DRSB8IFJTUl9STCkpKSkgeworCQkJaWYgKHZlbG9jaXR5X3JlY2VpdmVfZnJhbWUodnB0ciwgcmRfY3VycikgPCAwKQorCQkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQlpZiAocmQtPnJkZXNjMC5SU1IgJiBSU1JfQ1JDKQorCQkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAocmQtPnJkZXNjMC5SU1IgJiBSU1JfRkFFKQorCQkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKworCQkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJfQorCisJCXJkLT5pbnRlbiA9IDE7CisKKwkJdnB0ci0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCQlyZF9jdXJyKys7CisJCWlmIChyZF9jdXJyID49IHZwdHItPm9wdGlvbnMubnVtcngpCisJCQlyZF9jdXJyID0gMDsKKwl9IHdoaWxlICgrK3dvcmtzIDw9IDE1KTsKKworCXZwdHItPnJkX2N1cnIgPSByZF9jdXJyOworCisJaWYgKHdvcmtzID4gMCAmJiB2ZWxvY2l0eV9yeF9yZWZpbGwodnB0cikgPCAwKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJIiVzOiByeCBidWYgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCB2cHRyLT5kZXYtPm5hbWUpOworCX0KKworCVZBUl9VU0VEKHN0YXRzKTsKKwlyZXR1cm4gd29ya3M7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcnhfY3N1bQktCWNoZWNrc3VtIHByb2Nlc3MKKyAqCUByZDogcmVjZWl2ZSBwYWNrZXQgZGVzY3JpcHRvcgorICoJQHNrYjogbmV0d29yayBsYXllciBwYWNrZXQgYnVmZmVyCisgKgorICoJUHJvY2VzcyB0aGUgc3RhdHVzIGJpdHMgZm9yIHRoZSByZWNlaXZlZCBwYWNrZXQgYW5kIGRldGVybWluZQorICoJaWYgdGhlIGNoZWNrc3VtIHdhcyBjb21wdXRlZCBhbmQgdmVyaWZpZWQgYnkgdGhlIGhhcmR3YXJlCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV9yeF9jc3VtKHN0cnVjdCByeF9kZXNjICpyZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwlpZiAocmQtPnJkZXNjMS5DU00gJiBDU01fSVBLVCkgeworCQlpZiAocmQtPnJkZXNjMS5DU00gJiBDU01fSVBPSykgeworCQkJaWYgKChyZC0+cmRlc2MxLkNTTSAmIENTTV9UQ1BLVCkgfHwgCisJCQkJCShyZC0+cmRlc2MxLkNTTSAmIENTTV9VRFBLVCkpIHsKKwkJCQlpZiAoIShyZC0+cmRlc2MxLkNTTSAmIENTTV9UVVBPSykpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0KKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcnhfY29weQktCWluIHBsYWNlIFJ4IGNvcHkgZm9yIHNtYWxsIHBhY2tldHMKKyAqCUByeF9za2I6IG5ldHdvcmsgbGF5ZXIgcGFja2V0IGJ1ZmZlciBjYW5kaWRhdGUKKyAqCUBwa3Rfc2l6ZTogcmVjZWl2ZWQgZGF0YSBzaXplCisgKglAcmQ6IHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3IKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKgorICoJUmVwbGFjZSB0aGUgY3VycmVudCBza2IgdGhhdCBpcyBzY2hlZHVsZWQgZm9yIFJ4IHByb2Nlc3NpbmcgYnkgYQorICoJc2hvcnRlciwgaW1tZWRpYXRseSBhbGxvY2F0ZWQgc2tiLCBpZiB0aGUgcmVjZWl2ZWQgcGFja2V0IGlzIHNtYWxsCisgKgllbm91Z2guIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSByZWNlaXZlZAorICoJcGFja2V0IGlzIHRvbyBiaWcgb3IgaWYgbWVtb3J5IGlzIGV4aGF1c3RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdmVsb2NpdHlfcnhfY29weShzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYiwgaW50IHBrdF9zaXplLAorCQkJCSAgIHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCByZXQgPSAtMTsKKworCWlmIChwa3Rfc2l6ZSA8IHJ4X2NvcHlicmVhaykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKworCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihwa3Rfc2l6ZSArIDIpOworCQlpZiAobmV3X3NrYikgeworCQkJbmV3X3NrYi0+ZGV2ID0gdnB0ci0+ZGV2OworCQkJbmV3X3NrYi0+aXBfc3VtbWVkID0gcnhfc2tiWzBdLT5pcF9zdW1tZWQ7CisKKwkJCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX0lQX0FMSUdOKQorCQkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOworCisJCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgcnhfc2tiWzBdLT50YWlsLCBwa3Rfc2l6ZSk7CisJCQkqcnhfc2tiID0gbmV3X3NrYjsKKwkJCXJldCA9IDA7CisJCX0KKwkJCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaXBoX3JlYWxpZ24JLQlJUCBoZWFkZXIgYWxpZ25tZW50CisgKglAdnB0cjogdmVsb2NpdHkgd2UgYXJlIGhhbmRsaW5nCisgKglAc2tiOiBuZXR3b3JrIGxheWVyIHBhY2tldCBidWZmZXIKKyAqCUBwa3Rfc2l6ZTogcmVjZWl2ZWQgZGF0YSBzaXplCisgKgorICoJQWxpZ24gSVAgaGVhZGVyIG9uIGEgMiBieXRlcyBib3VuZGFyeS4gVGhpcyBiZWhhdmlvciBjYW4gYmUKKyAqCWNvbmZpZ3VyZWQgYnkgdGhlIHVzZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV9pcGhfcmVhbGlnbihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBrdF9zaXplKQoreworCS8qIEZJWE1FIC0gbWVtbW92ZSA/ICovCisJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gcGt0X3NpemU7IGkgPj0gMDsgaS0tKQorCQkJKihza2ItPmRhdGEgKyBpICsgMikgPSAqKHNrYi0+ZGF0YSArIGkpOworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lCS0JcmVjZWl2ZWQgcGFja2V0IHByb2Nlc3NvcgorICoJQHZwdHI6IHZlbG9jaXR5IHdlIGFyZSBoYW5kbGluZworICoJQGlkeDogcmluZyBpbmRleAorICoJCisgKglBIHBhY2tldCBoYXMgYXJyaXZlZC4gV2UgcHJvY2VzcyB0aGUgcGFja2V0IGFuZCBpZiBhcHByb3ByaWF0ZQorICoJcGFzcyB0aGUgZnJhbWUgdXAgdGhlIG5ldHdvcmsgc3RhY2sKKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBpbnQgaWR4KQoreworCXZvaWQgKCpwY2lfYWN0aW9uKShzdHJ1Y3QgcGNpX2RldiAqLCBkbWFfYWRkcl90LCBzaXplX3QsIGludCk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnZwdHItPnN0YXRzOworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpyZF9pbmZvID0gJih2cHRyLT5yZF9pbmZvW2lkeF0pOworCXN0cnVjdCByeF9kZXNjICpyZCA9ICYodnB0ci0+cmRfcmluZ1tpZHhdKTsKKwlpbnQgcGt0X2xlbiA9IHJkLT5yZGVzYzAubGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAocmQtPnJkZXNjMC5SU1IgJiAoUlNSX1NUUCB8IFJTUl9FRFApKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfVkVSQk9TRSwgS0VSTl9FUlIgIiAlcyA6IHRoZSByZWNlaXZlZCBmcmFtZSBzcGFuIG11bHRwbGUgUkRzLlxuIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX01BUikKKwkJdnB0ci0+c3RhdHMubXVsdGljYXN0Kys7CisKKwlza2IgPSByZF9pbmZvLT5za2I7CisJc2tiLT5kZXYgPSB2cHRyLT5kZXY7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiX2RtYSwKKwkJCQkgICAgdnB0ci0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyoKKwkgKglEcm9wIGZyYW1lIG5vdCBtZWV0aW5nIElFRUUgODAyLjMKKwkgKi8KKwkgCisJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfVkFMX1BLVF9MRU4pIHsKKwkJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX1JMKSB7CisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlwY2lfYWN0aW9uID0gcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlOworCisJdmVsb2NpdHlfcnhfY3N1bShyZCwgc2tiKTsKKworCWlmICh2ZWxvY2l0eV9yeF9jb3B5KCZza2IsIHBrdF9sZW4sIHZwdHIpIDwgMCkgeworCQl2ZWxvY2l0eV9pcGhfcmVhbGlnbih2cHRyLCBza2IsIHBrdF9sZW4pOworCQlwY2lfYWN0aW9uID0gcGNpX3VubWFwX3NpbmdsZTsKKwkJcmRfaW5mby0+c2tiID0gTlVMTDsKKwl9CisKKwlwY2lfYWN0aW9uKHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYl9kbWEsIHZwdHItPnJ4X2J1Zl9zeiwKKwkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCXNrYl9wdXQoc2tiLCBwa3RfbGVuIC0gNCk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOwkKKworCXN0YXRzLT5yeF9ieXRlcyArPSBwa3RfbGVuOworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9hbGxvY19yeF9idWYJLQlhbGxvY2F0ZSBhbGlnbmVkIHJlY2VpdmUgYnVmZmVyCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUBpZHg6IHJpbmcgaW5kZXgKKyAqCisgKglBbGxvY2F0ZSBhIG5ldyBmdWxsIHNpemVkIGJ1ZmZlciBmb3IgdGhlIHJlY2VwdGlvbiBvZiBhIGZyYW1lIGFuZAorICoJbWFwIGl0IGludG8gUENJIHNwYWNlIGZvciB0aGUgaGFyZHdhcmUgdG8gdXNlLiBUaGUgaGFyZHdhcmUKKyAqCXJlcXVpcmVzICo2NCogYnl0ZSBhbGlnbm1lbnQgb2YgdGhlIGJ1ZmZlciB3aGljaCBtYWtlcyBsaWZlCisgKglsZXNzIGZ1biB0aGFuIHdvdWxkIGJlIGlkZWFsLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2FsbG9jX3J4X2J1ZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcmQgPSAmKHZwdHItPnJkX3JpbmdbaWR4XSk7CisJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnJkX2luZm8gPSAmKHZwdHItPnJkX2luZm9baWR4XSk7CisKKwlyZF9pbmZvLT5za2IgPSBkZXZfYWxsb2Nfc2tiKHZwdHItPnJ4X2J1Zl9zeiArIDY0KTsKKwlpZiAocmRfaW5mby0+c2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKglEbyB0aGUgZ3ltbmFzdGljcyB0byBnZXQgdGhlIGJ1ZmZlciBoZWFkIGZvciBkYXRhIGF0CisJICoJNjRieXRlIGFsaWdubWVudC4KKwkgKi8KKwlza2JfcmVzZXJ2ZShyZF9pbmZvLT5za2IsICh1bnNpZ25lZCBsb25nKSByZF9pbmZvLT5za2ItPnRhaWwgJiA2Myk7CisJcmRfaW5mby0+c2tiLT5kZXYgPSB2cHRyLT5kZXY7CisJcmRfaW5mby0+c2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYi0+dGFpbCwgdnB0ci0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQorCS8qCisJICoJRmlsbCBpbiB0aGUgZGVzY3JpcHRvciB0byBtYXRjaAorIAkgKi8JCisgCSAKKwkqKCh1MzIgKikgJiAocmQtPnJkZXNjMCkpID0gMDsKKwlyZC0+bGVuID0gY3B1X3RvX2xlMzIodnB0ci0+cnhfYnVmX3N6KTsKKwlyZC0+aW50ZW4gPSAxOworCXJkLT5wYV9sb3cgPSBjcHVfdG9fbGUzMihyZF9pbmZvLT5za2JfZG1hKTsKKwlyZC0+cGFfaGlnaCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdHhfc3J2CQktCXRyYW5zbWl0IGludGVycnVwdCBzZXJ2aWNlCisgKglAdnB0cjsgVmVsb2NpdHkKKyAqCUBzdGF0dXM6CisgKgorICoJU2NhbiB0aGUgcXVldWVzIGxvb2tpbmcgZm9yIHRyYW5zbWl0dGVkIHBhY2tldHMgdGhhdAorICoJd2UgY2FuIGNvbXBsZXRlIGFuZCBjbGVhbiB1cC4gVXBkYXRlIGFueSBzdGF0aXN0aWNzIGFzCisgKgluZWNjZXNzYXJ5LworICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3R4X3NydihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3QgdHhfZGVzYyAqdGQ7CisJaW50IHFudW07CisJaW50IGZ1bGwgPSAwOworCWludCBpZHg7CisJaW50IHdvcmtzID0gMDsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRpbmZvOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ2cHRyLT5zdGF0czsKKworCWZvciAocW51bSA9IDA7IHFudW0gPCB2cHRyLT5udW1fdHhxOyBxbnVtKyspIHsKKwkJZm9yIChpZHggPSB2cHRyLT50ZF90YWlsW3FudW1dOyB2cHRyLT50ZF91c2VkW3FudW1dID4gMDsgCisJCQlpZHggPSAoaWR4ICsgMSkgJSB2cHRyLT5vcHRpb25zLm51bXR4KSB7CisKKwkJCS8qCisJCQkgKglHZXQgVHggRGVzY3JpcHRvcgorCQkJICovCisJCQl0ZCA9ICYodnB0ci0+dGRfcmluZ3NbcW51bV1baWR4XSk7CisJCQl0ZGluZm8gPSAmKHZwdHItPnRkX2luZm9zW3FudW1dW2lkeF0pOworCisJCQlpZiAodGQtPnRkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCQkJYnJlYWs7CisKKwkJCWlmICgod29ya3MrKyA+IDE1KSkKKwkJCQlicmVhazsKKworCQkJaWYgKHRkLT50ZGVzYzAuVFNSICYgVFNSMF9URVJSKSB7CisJCQkJc3RhdHMtPnR4X2Vycm9ycysrOworCQkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQkJaWYgKHRkLT50ZGVzYzAuVFNSICYgVFNSMF9DREgpCisJCQkJCXN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJaWYgKHRkLT50ZGVzYzAuVFNSICYgVFNSMF9DUlMpCisJCQkJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfQUJUKQorCQkJCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQlpZiAodGQtPnRkZXNjMC5UU1IgJiBUU1IwX09XQykKKwkJCQkJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdGRpbmZvLT5za2ItPmxlbjsKKwkJCX0KKwkJCXZlbG9jaXR5X2ZyZWVfdHhfYnVmKHZwdHIsIHRkaW5mbyk7CisJCQl2cHRyLT50ZF91c2VkW3FudW1dLS07CisJCX0KKwkJdnB0ci0+dGRfdGFpbFtxbnVtXSA9IGlkeDsKKworCQlpZiAoQVZBSUxfVEQodnB0ciwgcW51bSkgPCAxKSB7CisJCQlmdWxsID0gMTsKKwkJfQorCX0KKwkvKgorCSAqCUxvb2sgdG8gc2VlIGlmIHdlIHNob3VsZCBraWNrIHRoZSB0cmFuc21pdCBuZXR3b3JrCisJICoJbGF5ZXIgZm9yIG1vcmUgd29yay4KKwkgKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCh2cHRyLT5kZXYpICYmIChmdWxsID09IDApCisJICAgICYmICghKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9MSU5LX0ZBSUwpKSkgeworCQluZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisJfQorCXJldHVybiB3b3JrczsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cwktCWxpbmsgc3RhdHVzIHJlcG9ydGluZworICoJQHZwdHI6IHZlbG9jaXR5IHRvIHJlcG9ydCBvbgorICoKKyAqCVR1cm4gdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSB2ZWxvY2l0eSBjYXJkIGludG8gYSBrZXJuZWwgbG9nCisgKglkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IGxpbmsgc3RhdGUsIGRldGFpbGluZyBzcGVlZCBhbmQgZHVwbGV4CisgKglzdGF0dXMKKyAqLworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKworCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiBmYWlsZWQgdG8gZGV0ZWN0IGNhYmxlIGxpbmtcbiIsIHZwdHItPmRldi0+bmFtZSk7CisJfSBlbHNlIGlmICh2cHRyLT5vcHRpb25zLnNwZF9kcHggPT0gU1BEX0RQWF9BVVRPKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiBMaW5rIGF1dG9uZWdhdGlvbiIsIHZwdHItPmRldi0+bmFtZSk7CisKKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDAwKQorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwMDBNIGJwcyIpOworCQllbHNlIGlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwKQorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwME0gYnBzIik7CisJCWVsc2UKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxME0gYnBzIik7CisKKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBmdWxsIGR1cGxleFxuIik7CisJCWVsc2UKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBoYWxmIGR1cGxleFxuIik7CisJfSBlbHNlIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX05PVElDRSAiJXM6IExpbmsgZm9yY2VkIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwkJc3dpdGNoICh2cHRyLT5vcHRpb25zLnNwZF9kcHgpIHsKKwkJY2FzZSBTUERfRFBYXzEwMF9IQUxGOgorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwME0gYnBzIGhhbGYgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTAwX0ZVTEw6CisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgc3BlZWQgMTAwTSBicHMgZnVsbCBkdXBsZXhcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1BEX0RQWF8xMF9IQUxGOgorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwTSBicHMgaGFsZiBkdXBsZXhcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1BEX0RQWF8xMF9GVUxMOgorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwTSBicHMgZnVsbCBkdXBsZXhcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9lcnJvcgktCWhhbmRsZSBlcnJvciBmcm9tIGNvbnRyb2xsZXIKKyAqCUB2cHRyOiB2ZWxvY2l0eQorICoJQHN0YXR1czogY2FyZCBzdGF0dXMKKyAqCisgKglQcm9jZXNzIGFuIGVycm9yIHJlcG9ydCBmcm9tIHRoZSBoYXJkd2FyZSBhbmQgYXR0ZW1wdCB0byByZWNvdmVyCisgKgl0aGUgY2FyZCBpdHNlbGYuIEF0IHRoZSBtb21lbnQgd2UgY2Fubm90IHJlY292ZXIgZnJvbSBzb21lIAorICoJdGhlb3JldGljYWxseSBpbXBvc3NpYmxlIGVycm9ycyBidXQgdGhpcyBjb3VsZCBiZSBmaXhlZCB1c2luZworICoJdGhlIHBjaV9kZXZpY2VfZmFpbGVkIGxvZ2ljIHRvIGJvdW5jZSB0aGUgaGFyZHdhcmUKKyAqCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2Vycm9yKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBpbnQgc3RhdHVzKQoreworCisJaWYgKHN0YXR1cyAmIElTUl9UWFNUTEkpIHsKKwkJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJURCBzdHJ1Y3R1cmUgZXJycm9yIFREaW5kZXg9JWh4XG4iLCByZWFkdygmcmVncy0+VERJZHhbMF0pKTsKKwkJQllURV9SRUdfQklUU19PTihUWEVTUl9URFNUUiwgJnJlZ3MtPlRYRVNSKTsKKwkJd3JpdGV3KFRSRENTUl9SVU4sICZyZWdzLT5URENTUkNscik7CisJCW5ldGlmX3N0b3BfcXVldWUodnB0ci0+ZGV2KTsKKwkJCisJCS8qIEZJWE1FOiBwb3J0IG92ZXIgdGhlIHBjaV9kZXZpY2VfZmFpbGVkIGNvZGUgYW5kIHVzZSBpdAorCQkgICBoZXJlICovCisJfQorCisJaWYgKHN0YXR1cyAmIElTUl9TUkNJKSB7CisJCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCQlpbnQgbGlua2VkOworCisJCWlmICh2cHRyLT5vcHRpb25zLnNwZF9kcHggPT0gU1BEX0RQWF9BVVRPKSB7CisJCQl2cHRyLT5taWlfc3RhdHVzID0gY2hlY2tfY29ubmVjdGlvbl90eXBlKHJlZ3MpOworCisJCQkvKgorCQkJICoJSWYgaXQgaXMgYSAzMTE5LCBkaXNhYmxlIGZyYW1lIGJ1cnN0aW5nIGluIAorCQkJICoJaGFsZmR1cGxleCBtb2RlIGFuZCBlbmFibGUgaXQgaW4gZnVsbGR1cGxleAorCQkJICoJIG1vZGUKKwkJCSAqLworCQkJaWYgKHZwdHItPnJldl9pZCA8IFJFVl9JRF9WVDMyMTZfQTApIHsKKwkJCQlpZiAodnB0ci0+bWlpX3N0YXR1cyB8IFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJCQlCWVRFX1JFR19CSVRTX09OKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJCQllbHNlCisJCQkJCUJZVEVfUkVHX0JJVFNfT0ZGKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJCX0KKwkJCS8qCisJCQkgKglPbmx5IGVuYWJsZSBDRCBoZWFydCBiZWF0IGNvdW50ZXIgaW4gMTBIRCBtb2RlCisJCQkgKi8KKwkJCWlmICghKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkgJiYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMCkpIHsKKwkJCQlCWVRFX1JFR19CSVRTX09GRihURVNUQ0ZHX0hCRElTLCAmcmVncy0+VEVTVENGRyk7CisJCQl9IGVsc2UgeworCQkJCUJZVEVfUkVHX0JJVFNfT04oVEVTVENGR19IQkRJUywgJnJlZ3MtPlRFU1RDRkcpOworCQkJfQorCQl9CisJCS8qCisJCSAqCUdldCBsaW5rIHN0YXR1cyBmcm9tIFBIWVNSMAorCQkgKi8KKwkJbGlua2VkID0gcmVhZGIoJnJlZ3MtPlBIWVNSMCkgJiBQSFlTUjBfTElOS0dEOworCisJCWlmIChsaW5rZWQpIHsKKwkJCXZwdHItPm1paV9zdGF0dXMgJj0gflZFTE9DSVRZX0xJTktfRkFJTDsKKwkJfSBlbHNlIHsKKwkJCXZwdHItPm1paV9zdGF0dXMgfD0gVkVMT0NJVFlfTElOS19GQUlMOworCQl9CisKKwkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCWVuYWJsZV9mbG93X2NvbnRyb2xfYWJpbGl0eSh2cHRyKTsKKworCQkvKgorCQkgKglSZS1lbmFibGUgYXV0by1wb2xsaW5nIGJlY2F1c2UgU1JDSSB3aWxsIGRpc2FibGUgCisJCSAqCWF1dG8tcG9sbGluZworCQkgKi8KKwkJIAorCQllbmFibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKQorCQkJbmV0aWZfc3RvcF9xdWV1ZSh2cHRyLT5kZXYpOworCQllbHNlCisJCQluZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisKKwl9OworCWlmIChzdGF0dXMgJiBJU1JfTUlCRkkpCisJCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHZwdHIpOworCWlmIChzdGF0dXMgJiBJU1JfTFNURUkpCisJCW1hY19yeF9xdWV1ZV93YWtlKHZwdHItPm1hY19yZWdzKTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9mcmVlX3R4X2J1ZgktCWZyZWUgdHJhbnNtaXQgYnVmZmVyCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUB0ZGluZm86IGJ1ZmZlcgorICoKKyAqCVJlbGVhc2UgYW4gdHJhbnNtaXQgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIHdhcyBwcmVhbGxvY2F0ZWQgdGhlbgorICoJcmVjeWNsZSBpdCwgaWYgbm90IHRoZW4gdW5tYXAgdGhlIGJ1ZmZlci4KKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV90eF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICp0ZGluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRkaW5mby0+c2tiOworCWludCBpOworCisJLyoKKwkgKglEb24ndCB1bm1hcCB0aGUgcHJlLWFsbG9jYXRlZCB0eF9idWZzCisJICovCisJaWYgKHRkaW5mby0+c2tiX2RtYSAmJiAodGRpbmZvLT5za2JfZG1hWzBdICE9IHRkaW5mby0+YnVmX2RtYSkpIHsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGRpbmZvLT5uc2tiX2RtYTsgaSsrKSB7CisjaWZkZWYgVkVMT0NJVFlfWkVST19DT1BZX1NVUFBPUlQKKwkJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgdGRpbmZvLT5za2JfZG1hW2ldLCB0ZC0+dGRlc2MxLmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisjZWxzZQorCQkJcGNpX3VubWFwX3NpbmdsZSh2cHRyLT5wZGV2LCB0ZGluZm8tPnNrYl9kbWFbaV0sIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyNlbmRpZgorCQkJdGRpbmZvLT5za2JfZG1hW2ldID0gMDsKKwkJfQorCX0KKwlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCXRkaW5mby0+c2tiID0gTlVMTDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9vcGVuCQktCWludGVyZmFjZSBhY3RpdmF0aW9uIGNhbGxiYWNrCisgKglAZGV2OiBuZXR3b3JrIGxheWVyIGRldmljZSB0byBvcGVuCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgbGF5ZXIgYnJpbmdzIHRoZSBpbnRlcmZhY2UgdXAuIFJldHVybnMKKyAqCWEgbmVnYXRpdmUgcG9zaXggZXJyb3IgY29kZSBvbiBmYWlsdXJlLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCisgKgorICoJQWxsIHRoZSByaW5nIGFsbG9jYXRpb24gYW5kIHNldCB1cCBpcyBkb25lIG9uIG9wZW4gZm9yIHRoaXMKKyAqCWFkYXB0ZXIgdG8gbWluaW1pc2UgbWVtb3J5IHVzYWdlIHdoZW4gaW5hY3RpdmUKKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaW50IHJldDsKKworCXZwdHItPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTA0ID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMzIpOworCisJcmV0ID0gdmVsb2NpdHlfaW5pdF9yaW5ncyh2cHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB2ZWxvY2l0eV9pbml0X3JkX3JpbmcodnB0cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfZGVzY19yaW5nczsKKworCXJldCA9IHZlbG9jaXR5X2luaXRfdGRfcmluZyh2cHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9yZF9yaW5nOworCQorCS8qIEVuc3VyZSBjaGlwIGlzIHJ1bm5pbmcgKi8JCisJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDApOworCQorCXZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzKHZwdHIsIFZFTE9DSVRZX0lOSVRfQ09MRCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycSh2cHRyLT5wZGV2LT5pcnEsICZ2ZWxvY2l0eV9pbnRyLCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCS8qIFBvd2VyIGRvd24gdGhlIGNoaXAgKi8KKwkJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDNob3QpOworCQlnb3RvIGVycl9mcmVlX3RkX3Jpbmc7CisJfQorCisJbWFjX2VuYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJdnB0ci0+ZmxhZ3MgfD0gVkVMT0NJVFlfRkxBR1NfT1BFTkVEOworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9mcmVlX3RkX3Jpbmc6CisJdmVsb2NpdHlfZnJlZV90ZF9yaW5nKHZwdHIpOworZXJyX2ZyZWVfcmRfcmluZzoKKwl2ZWxvY2l0eV9mcmVlX3JkX3JpbmcodnB0cik7CitlcnJfZnJlZV9kZXNjX3JpbmdzOgorCXZlbG9jaXR5X2ZyZWVfcmluZ3ModnB0cik7CisJZ290byBvdXQ7Cit9CisKKy8qKiAKKyAqCXZlbG9jaXR5X2NoYW5nZV9tdHUJLQlNVFUgY2hhbmdlIGNhbGxiYWNrCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoJQG5ld19tdHU6IGRlc2lyZWQgTVRVCisgKgorICoJSGFuZGxlIHJlcXVlc3RzIGZyb20gdGhlIG5ldHdvcmtpbmcgbGF5ZXIgZm9yIE1UVSBjaGFuZ2Ugb24KKyAqCXRoaXMgaW50ZXJmYWNlLiBJdCBnZXRzIGNhbGxlZCBvbiBhIGNoYW5nZSBieSB0aGUgbmV0d29yayBsYXllci4KKyAqCVJldHVybiB6ZXJvIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIHBvc2l4IGVycm9yIGNvZGUuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvbGRtdHUgPSBkZXYtPm10dTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgobmV3X210dSA8IFZFTE9DSVRZX01JTl9NVFUpIHx8IG5ld19tdHUgPiAoVkVMT0NJVFlfTUFYX01UVSkpIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fTk9USUNFICIlczogSW52YWxpZCBNVFUuXG4iLCAKKwkJCQl2cHRyLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmV3X210dSAhPSBvbGRtdHUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXZlbG9jaXR5X3NodXRkb3duKHZwdHIpOworCisJCXZlbG9jaXR5X2ZyZWVfdGRfcmluZyh2cHRyKTsKKwkJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworCisJCWRldi0+bXR1ID0gbmV3X210dTsKKwkJaWYgKG5ld19tdHUgPiA4MTkyKQorCQkJdnB0ci0+cnhfYnVmX3N6ID0gOSAqIDEwMjQ7CisJCWVsc2UgaWYgKG5ld19tdHUgPiA0MDk2KQorCQkJdnB0ci0+cnhfYnVmX3N6ID0gODE5MjsKKwkJZWxzZQorCQkJdnB0ci0+cnhfYnVmX3N6ID0gNCAqIDEwMjQ7CisKKwkJcmV0ID0gdmVsb2NpdHlfaW5pdF9yZF9yaW5nKHZwdHIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQlyZXQgPSB2ZWxvY2l0eV9pbml0X3RkX3JpbmcodnB0cik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzKHZwdHIsIFZFTE9DSVRZX0lOSVRfQ09MRCk7CisKKwkJbWFjX2VuYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworb3V0X3VubG9jazoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnB0ci0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc2h1dGRvd24JLQlzaHV0IGRvd24gdGhlIGNoaXAKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBkZWFjdGl2YXRlCisgKgorICoJU2h1dHMgZG93biB0aGUgaW50ZXJuYWwgb3BlcmF0aW9ucyBvZiB0aGUgdmVsb2NpdHkgYW5kCisgKglkaXNhYmxlcyBpbnRlcnJ1cHRzLCBhdXRvcG9sbGluZywgdHJhbnNtaXQgYW5kIHJlY2VpdmUKKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfc2h1dGRvd24oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJbWFjX2Rpc2FibGVfaW50KHJlZ3MpOworCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMFNldCk7CisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPlREQ1NSQ2xyKTsKKwl3cml0ZWIoMHhGRiwgJnJlZ3MtPlJEQ1NSQ2xyKTsKKwlzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCW1hY19jbGVhcl9pc3IocmVncyk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfY2xvc2UJCS0JY2xvc2UgYWRhcHRlciBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsYmFjayBmcm9tIHRoZSBuZXR3b3JrIGxheWVyIHdoZW4gdGhlIHZlbG9jaXR5IGlzIGJlaW5nCisgKglkZWFjdGl2YXRlZCBieSB0aGUgbmV0d29yayBsYXllcgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl2ZWxvY2l0eV9zaHV0ZG93bih2cHRyKTsKKworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEKQorCQl2ZWxvY2l0eV9nZXRfaXAodnB0cik7CisJaWYgKGRldi0+aXJxICE9IDApCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkKKwkvKiBQb3dlciBkb3duIHRoZSBjaGlwICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDNob3QpOworCQorCS8qIEZyZWUgdGhlIHJlc291cmNlcyAqLworCXZlbG9jaXR5X2ZyZWVfdGRfcmluZyh2cHRyKTsKKwl2ZWxvY2l0eV9mcmVlX3JkX3JpbmcodnB0cik7CisJdmVsb2NpdHlfZnJlZV9yaW5ncyh2cHRyKTsKKworCXZwdHItPmZsYWdzICY9ICh+VkVMT0NJVFlfRkxBR1NfT1BFTkVEKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV94bWl0CQktCXRyYW5zbWl0IHBhY2tldCBjYWxsYmFjaworICoJQHNrYjogYnVmZmVyIHRvIHRyYW5zbWl0CisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxlZCBieSB0aGUgbmV0d29yIGxheWVyIHRvIHJlcXVlc3QgYSBwYWNrZXQgaXMgcXVldWVkIHRvCisgKgl0aGUgdmVsb2NpdHkuIFJldHVybnMgemVybyBvbiBzdWNjZXNzLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlpbnQgcW51bSA9IDA7CisJc3RydWN0IHR4X2Rlc2MgKnRkX3B0cjsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRpbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4OworCisJaW50IHBrdGxlbiA9IHNrYi0+bGVuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKworCWluZGV4ID0gdnB0ci0+dGRfY3VycltxbnVtXTsKKwl0ZF9wdHIgPSAmKHZwdHItPnRkX3JpbmdzW3FudW1dW2luZGV4XSk7CisJdGRpbmZvID0gJih2cHRyLT50ZF9pbmZvc1txbnVtXVtpbmRleF0pOworCisJdGRfcHRyLT50ZGVzYzEuVENQTFMgPSBUQ1BMU19OT1JNQUw7CisJdGRfcHRyLT50ZGVzYzEuVENSID0gVENSMF9USUM7CisJdGRfcHRyLT50ZF9idWZbMF0ucXVldWUgPSAwOworCisJLyoKKwkgKglQYWQgc2hvcnQgZnJhbWVzLiAKKwkgKi8KKwlpZiAocGt0bGVuIDwgRVRIX1pMRU4pIHsKKwkJLyogQ2Fubm90IG9jY3VyIHVudGlsIFpDIHN1cHBvcnQgKi8KKwkJaWYoc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpKQorCQkJcmV0dXJuIDA7IAorCQlwa3RsZW4gPSBFVEhfWkxFTjsKKwkJbWVtY3B5KHRkaW5mby0+YnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJbWVtc2V0KHRkaW5mby0+YnVmICsgc2tiLT5sZW4sIDAsIEVUSF9aTEVOIC0gc2tiLT5sZW4pOworCQl0ZGluZm8tPnNrYiA9IHNrYjsKKwkJdGRpbmZvLT5za2JfZG1hWzBdID0gdGRpbmZvLT5idWZfZG1hOworCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0gcGt0bGVuOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9sb3cgPSBjcHVfdG9fbGUzMih0ZGluZm8tPnNrYl9kbWFbMF0pOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJdGRfcHRyLT50ZF9idWZbMF0uYnVmc2l6ZSA9IHRkX3B0ci0+dGRlc2MwLnBrdHNpemU7CisJCXRkaW5mby0+bnNrYl9kbWEgPSAxOworCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gMjsKKwl9IGVsc2UKKyNpZmRlZiBWRUxPQ0lUWV9aRVJPX0NPUFlfU1VQUE9SVAorCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gMCkgeworCQlpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJdGRpbmZvLT5za2IgPSBza2I7CisJCWlmIChuZnJhZ3MgPiA2KSB7CisJCQlza2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQyk7CisJCQltZW1jcHkodGRpbmZvLT5idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJdGRpbmZvLT5za2JfZG1hWzBdID0gdGRpbmZvLT5idWZfZG1hOworCQkJdGRfcHRyLT50ZGVzYzAucGt0c2l6ZSA9IAorCQkJdGRfcHRyLT50ZF9idWZbMF0ucGFfbG93ID0gY3B1X3RvX2xlMzIodGRpbmZvLT5za2JfZG1hWzBdKTsKKwkJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2hpZ2ggPSAwOworCQkJdGRfcHRyLT50ZF9idWZbMF0uYnVmc2l6ZSA9IHRkX3B0ci0+dGRlc2MwLnBrdHNpemU7CisJCQl0ZGluZm8tPm5za2JfZG1hID0gMTsKKwkJCXRkX3B0ci0+dGRlc2MxLkNNRFogPSAyOworCQl9IGVsc2UgeworCQkJaW50IGkgPSAwOworCQkJdGRpbmZvLT5uc2tiX2RtYSA9IDA7CisJCQl0ZGluZm8tPnNrYl9kbWFbaV0gPSBwY2lfbWFwX3NpbmdsZSh2cHRyLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCXRkX3B0ci0+dGRlc2MwLnBrdHNpemUgPSBwa3RsZW47CisKKwkJCS8qIEZJWE1FOiBzdXBwb3J0IDQ4Yml0IERNQSBsYXRlciAqLworCQkJdGRfcHRyLT50ZF9idWZbaV0ucGFfbG93ID0gY3B1X3RvX2xlMzIodGRpbmZvLT5za2JfZG1hKTsKKwkJCXRkX3B0ci0+dGRfYnVmW2ldLnBhX2hpZ2ggPSAwOworCQkJdGRfcHRyLT50ZF9idWZbaV0uYnVmc2l6ZSA9IHNrYi0+bGVuLT5za2ItPmRhdGFfbGVuOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbmZyYWdzOyBpKyspIHsKKwkJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQkJdm9pZCAqYWRkciA9ICgodm9pZCAqKSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSArIGZyYWctPnBhZ2Vfb2Zmc2V0KSk7CisKKwkJCQl0ZGluZm8tPnNrYl9kbWFbaSArIDFdID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgYWRkciwgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCQl0ZF9wdHItPnRkX2J1ZltpICsgMV0ucGFfbG93ID0gY3B1X3RvX2xlMzIodGRpbmZvLT5za2JfZG1hW2kgKyAxXSk7CisJCQkJdGRfcHRyLT50ZF9idWZbaSArIDFdLnBhX2hpZ2ggPSAwOworCQkJCXRkX3B0ci0+dGRfYnVmW2kgKyAxXS5idWZzaXplID0gZnJhZy0+c2l6ZTsKKwkJCX0KKwkJCXRkaW5mby0+bnNrYl9kbWEgPSBpIC0gMTsKKwkJCXRkX3B0ci0+dGRlc2MxLkNNRFogPSBpOworCQl9CisKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyoKKwkJICoJTWFwIHRoZSBsaW5lYXIgbmV0d29yayBidWZmZXIgaW50byBQQ0kgc3BhY2UgYW5kCisJCSAqCWFkZCBpdCB0byB0aGUgdHJhbnNtaXQgcmluZy4KKwkJICovCisJCXRkaW5mby0+c2tiID0gc2tiOworCQl0ZGluZm8tPnNrYl9kbWFbMF0gPSBwY2lfbWFwX3NpbmdsZSh2cHRyLT5wZGV2LCBza2ItPmRhdGEsIHBrdGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCXRkX3B0ci0+dGRlc2MwLnBrdHNpemUgPSBwa3RsZW47CisJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVswXSk7CisJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2hpZ2ggPSAwOworCQl0ZF9wdHItPnRkX2J1ZlswXS5idWZzaXplID0gdGRfcHRyLT50ZGVzYzAucGt0c2l6ZTsKKwkJdGRpbmZvLT5uc2tiX2RtYSA9IDE7CisJCXRkX3B0ci0+dGRlc2MxLkNNRFogPSAyOworCX0KKworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RBR0dJTkcpIHsKKwkJdGRfcHRyLT50ZGVzYzEucHFpbmYuVklEID0gKHZwdHItPm9wdGlvbnMudmlkICYgMHhmZmYpOworCQl0ZF9wdHItPnRkZXNjMS5wcWluZi5wcmlvcml0eSA9IDA7CisJCXRkX3B0ci0+dGRlc2MxLnBxaW5mLkNGSSA9IDA7CisJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSBUQ1IwX1ZFVEFHOworCX0KKworCS8qCisJICoJSGFuZGxlIGhhcmR3YXJlIGNoZWNrc3VtCisJICovCisJaWYgKCh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0pCisJCQkJICYmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykpIHsKKwkJc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJdGRfcHRyLT50ZGVzYzEuVENSIHw9IFRDUjBfVENQQ0s7CisJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSAoVENSMF9VRFBDSyk7CisJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSBUQ1IwX0lQQ0s7CisJfQorCXsKKworCQlpbnQgcHJldiA9IGluZGV4IC0gMTsKKworCQlpZiAocHJldiA8IDApCisJCQlwcmV2ID0gdnB0ci0+b3B0aW9ucy5udW10eCAtIDE7CisJCXRkX3B0ci0+dGRlc2MwLm93bmVyID0gT1dORURfQllfTklDOworCQl2cHRyLT50ZF91c2VkW3FudW1dKys7CisJCXZwdHItPnRkX2N1cnJbcW51bV0gPSAoaW5kZXggKyAxKSAlIHZwdHItPm9wdGlvbnMubnVtdHg7CisKKwkJaWYgKEFWQUlMX1REKHZwdHIsIHFudW0pIDwgMSkKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQl0ZF9wdHIgPSAmKHZwdHItPnRkX3JpbmdzW3FudW1dW3ByZXZdKTsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucXVldWUgPSAxOworCQltYWNfdHhfcXVldWVfd2FrZSh2cHRyLT5tYWNfcmVncywgcW51bSk7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9pbnRyCQktCWludGVycnVwdCBjYWxsYmFjaworICoJQGlycTogaW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pbnN0YW5jZTogaW50ZXJydXB0aW5nIGRldmljZQorICoJQHB0X3JlZ3M6IENQVSByZWdpc3RlciBzdGF0ZSBhdCBpbnRlcnJ1cHQKKyAqCisgKglDYWxsZWQgd2hlbmV2ZXIgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUgdmVsb2NpdHkKKyAqCWFkYXB0ZXIgSVJRIGxpbmUuIFdlIG1heSBub3QgYmUgdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0CisgKglhbmQgbmVlZCB0byBpZGVudGlmeSBpbml0aWFsbHkgaWYgd2UgYXJlLCBhbmQgaWYgbm90IGV4aXQgYXMKKyAqCWVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCXUzMiBpc3Jfc3RhdHVzOworCWludCBtYXhfY291bnQgPSAwOworCisKKwlzcGluX2xvY2soJnZwdHItPmxvY2spOworCWlzcl9zdGF0dXMgPSBtYWNfcmVhZF9pc3IodnB0ci0+bWFjX3JlZ3MpOworCisJLyogTm90IHVzID8gKi8KKwlpZiAoaXNyX3N0YXR1cyA9PSAwKSB7CisJCXNwaW5fdW5sb2NrKCZ2cHRyLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCW1hY19kaXNhYmxlX2ludCh2cHRyLT5tYWNfcmVncyk7CisKKwkvKgorCSAqCUtlZXAgcHJvY2Vzc2luZyB0aGUgSVNSIHVudGlsIHdlIGhhdmUgY29tcGxldGVkCisJICoJcHJvY2Vzc2luZyBhbmQgdGhlIGlzcl9zdGF0dXMgYmVjb21lcyB6ZXJvCisJICovCisJIAorCXdoaWxlIChpc3Jfc3RhdHVzICE9IDApIHsKKwkJbWFjX3dyaXRlX2lzcih2cHRyLT5tYWNfcmVncywgaXNyX3N0YXR1cyk7CisJCWlmIChpc3Jfc3RhdHVzICYgKH4oSVNSX1BSWEkgfCBJU1JfUFBSWEkgfCBJU1JfUFRYSSB8IElTUl9QUFRYSSkpKQorCQkJdmVsb2NpdHlfZXJyb3IodnB0ciwgaXNyX3N0YXR1cyk7CisJCWlmIChpc3Jfc3RhdHVzICYgKElTUl9QUlhJIHwgSVNSX1BQUlhJKSkKKwkJCW1heF9jb3VudCArPSB2ZWxvY2l0eV9yeF9zcnYodnB0ciwgaXNyX3N0YXR1cyk7CisJCWlmIChpc3Jfc3RhdHVzICYgKElTUl9QVFhJIHwgSVNSX1BQVFhJKSkKKwkJCW1heF9jb3VudCArPSB2ZWxvY2l0eV90eF9zcnYodnB0ciwgaXNyX3N0YXR1cyk7CisJCWlzcl9zdGF0dXMgPSBtYWNfcmVhZF9pc3IodnB0ci0+bWFjX3JlZ3MpOworCQlpZiAobWF4X2NvdW50ID4gdnB0ci0+b3B0aW9ucy5pbnRfd29ya3MpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBleGNlc3NpdmUgd29yayBhdCBpbnRlcnJ1cHQuXG4iLCAKKwkJCQlkZXYtPm5hbWUpOworCQkJbWF4X2NvdW50ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdnB0ci0+bG9jayk7CisJbWFjX2VuYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKKworfQorCisKKy8qKgorICoJdmVsb2NpdHlfc2V0X211bHRpCS0JZmlsdGVyIGxpc3QgY2hhbmdlIGNhbGxiYWNrCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxlZCBieSB0aGUgbmV0d29yayBsYXllciB3aGVuIHRoZSBmaWx0ZXIgbGlzdHMgbmVlZCB0byBjaGFuZ2UKKyAqCWZvciBhIHZlbG9jaXR5IGFkYXB0ZXIuIFJlbG9hZCB0aGUgQ0FNcyB3aXRoIHRoZSBuZXcgYWRkcmVzcworICoJZmlsdGVyIHJ1bGVzZXQuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCXU4IHJ4X21vZGU7CisJaW50IGk7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NQVJDQU1bMF0pOworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1BUkNBTVs0XSk7CisJCXJ4X21vZGUgPSAoUkNSX0FNIHwgUkNSX0FCIHwgUkNSX1BST00pOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiB2cHRyLT5tdWx0aWNhc3RfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1BUkNBTVswXSk7CisJCXdyaXRlbCgweGZmZmZmZmZmLCAmcmVncy0+TUFSQ0FNWzRdKTsKKwkJcnhfbW9kZSA9IChSQ1JfQU0gfCBSQ1JfQUIpOworCX0gZWxzZSB7CisJCWludCBvZmZzZXQgPSBNQ0FNX1NJWkUgLSB2cHRyLT5tdWx0aWNhc3RfbGltaXQ7CisJCW1hY19nZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2ssIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJbWFjX3NldF9jYW0ocmVncywgaSArIG9mZnNldCwgbWNsaXN0LT5kbWlfYWRkciwgVkVMT0NJVFlfTVVMVElDQVNUX0NBTSk7CisJCQl2cHRyLT5tQ0FNbWFza1sob2Zmc2V0ICsgaSkgLyA4XSB8PSAxIDw8ICgob2Zmc2V0ICsgaSkgJiA3KTsKKwkJfQorCisJCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2ssIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCQlyeF9tb2RlID0gKFJDUl9BTSB8IFJDUl9BQik7CisJfQorCWlmIChkZXYtPm10dSA+IDE1MDApCisJCXJ4X21vZGUgfD0gUkNSX0FMOworCisJQllURV9SRUdfQklUU19PTihyeF9tb2RlLCAmcmVncy0+UkNSKTsKKworfQorCisvKioKKyAqCXZlbG9jaXR5X2dldF9zdGF0dXMJLQlzdGF0aXN0aWNzIGNhbGxiYWNrCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxiYWNrIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIgdG8gYWxsb3cgZHJpdmVyIHN0YXRpc3RpY3MKKyAqCXRvIGJlIHJlc3luY2hyb25pemVkIHdpdGggaGFyZHdhcmUgY29sbGVjdGVkIHN0YXRlLiBJbiB0aGUKKyAqCWNhc2Ugb2YgdGhlIHZlbG9jaXR5IHdlIG5lZWQgdG8gcHVsbCB0aGUgTUlCIGNvdW50ZXJzIGZyb20KKyAqCXRoZSBoYXJkd2FyZSBpbnRvIHRoZSBjb3VudGVycyBiZWZvcmUgbGV0dGluZyB0aGUgbmV0d29yaworICoJbGF5ZXIgZGlzcGxheSB0aGVtLgorICovCisgCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZlbG9jaXR5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCQorCS8qIElmIHRoZSBoYXJkd2FyZSBpcyBkb3duLCBkb24ndCB0b3VjaCBNSUkgKi8KKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gJnZwdHItPnN0YXRzOworCisJc3Bpbl9sb2NrX2lycSgmdnB0ci0+bG9jayk7CisJdmVsb2NpdHlfdXBkYXRlX2h3X21pYnModnB0cik7CisJc3Bpbl91bmxvY2tfaXJxKCZ2cHRyLT5sb2NrKTsKKworCXZwdHItPnN0YXRzLnJ4X3BhY2tldHMgPSB2cHRyLT5taWJfY291bnRlcltIV19NSUJfaWZSeEFsbFBrdHNdOworCXZwdHItPnN0YXRzLnJ4X2Vycm9ycyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZlJ4RXJyb3JQa3RzXTsKKwl2cHRyLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gdnB0ci0+bWliX2NvdW50ZXJbSFdfTUlCX2lmSW5SYW5nZUxlbmd0aEVycm9yc107CisKKy8vICB1bnNpZ25lZCBsb25nICAgcnhfZHJvcHBlZDsgICAgIC8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KKwl2cHRyLT5zdGF0cy5jb2xsaXNpb25zID0gdnB0ci0+bWliX2NvdW50ZXJbSFdfTUlCX2lmVHhFdGhlckNvbGxpc2lvbnNdOworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKy8vICB1bnNpZ25lZCBsb25nICAgcnhfbGVuZ3RoX2Vycm9yczsKKy8vICB1bnNpZ25lZCBsb25nICAgcnhfb3Zlcl9lcnJvcnM7ICAgICAvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgICovCisJdnB0ci0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZlJ4UGt0Q1JDRV07CisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X2ZyYW1lX2Vycm9yczsgICAgLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworLy8gIHVuc2lnbmVkIGxvbmcgICByeF9maWZvX2Vycm9yczsgICAgIC8qIHJlY3YnciBmaWZvIG92ZXJydW4gICAgICAqLworLy8gIHVuc2lnbmVkIGxvbmcgICByeF9taXNzZWRfZXJyb3JzOyAgIC8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQgICAqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisvLyAgdW5zaWduZWQgbG9uZyAgIHR4X2ZpZm9fZXJyb3JzOworCisJcmV0dXJuICZ2cHRyLT5zdGF0czsKK30KKworCisvKioKKyAqCXZlbG9jaXR5X2lvY3RsCQktCWlvY3RsIGVudHJ5IHBvaW50CisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoJQHJxOiBpbnRlcmZhY2UgcmVxdWVzdCBpb2N0bAorICoJQGNtZDogY29tbWFuZCBjb2RlCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaXNzdWVzIGFuIGlvY3RsIHJlcXVlc3QgdG8gdGhlIG5ldHdvcmsKKyAqCWRldmljZSBpbiBxdWVzdGlvbi4gVGhlIHZlbG9jaXR5IGludGVyZmFjZSBzdXBwb3J0cyBNSUkuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJLyogSWYgd2UgYXJlIGFza2VkIGZvciBpbmZvcm1hdGlvbiBhbmQgdGhlIGRldmljZSBpcyBwb3dlcgorCSAgIHNhdmluZyB0aGVuIHdlIG5lZWQgdG8gYnJpbmcgdGhlIGRldmljZSBiYWNrIHVwIHRvIHRhbGsgdG8gaXQgKi8KKwkgICAJCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QwKTsKKwkJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwljYXNlIFNJT0NHTUlJUkVHOgkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJY2FzZSBTSU9DU01JSVJFRzoJLyogV3JpdGUgdG8gTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJcmV0ID0gdmVsb2NpdHlfbWlpX2lvY3RsKGRldiwgcnEsIGNtZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EM2hvdCk7CisJCQorCQkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJRGVmaW5pdGlvbiBmb3Igb3VyIGRldmljZSBkcml2ZXIuIFRoZSBQQ0kgbGF5ZXIgaW50ZXJmYWNlCisgKgl1c2VzIHRoaXMgdG8gaGFuZGxlIGFsbCBvdXIgY2FyZCBkaXNjb3ZlciBhbmQgcGx1Z2dpbmcKKyAqLworIAorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZlbG9jaXR5X2RyaXZlciA9IHsKKyAgICAgIC5uYW1lCT0gVkVMT0NJVFlfTkFNRSwKKyAgICAgIC5pZF90YWJsZQk9IHZlbG9jaXR5X2lkX3RhYmxlLAorICAgICAgLnByb2JlCT0gdmVsb2NpdHlfZm91bmQxLAorICAgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHZlbG9jaXR5X3JlbW92ZTEpLAorI2lmZGVmIENPTkZJR19QTQorICAgICAgLnN1c3BlbmQJPSB2ZWxvY2l0eV9zdXNwZW5kLAorICAgICAgLnJlc3VtZQk9IHZlbG9jaXR5X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X21vZHVsZQktCWxvYWQgdGltZSBmdW5jdGlvbgorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSB2ZWxvY2l0eSBtb2R1bGUgaXMgbG9hZGVkLiBUaGUgUENJIGRyaXZlcgorICoJaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBQQ0kgbGF5ZXIsIGFuZCBpbiB0dXJuIHdpbGwgY2FsbAorICoJdGhlIHByb2JlIGZ1bmN0aW9ucyBmb3IgZWFjaCB2ZWxvY2l0eSBhZGFwdGVyIGluc3RhbGxlZAorICoJaW4gdGhlIHN5c3RlbS4KKyAqLworIAorc3RhdGljIGludCBfX2luaXQgdmVsb2NpdHlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJdmVsb2NpdHlfcmVnaXN0ZXJfbm90aWZpZXIoKTsKKwlyZXQgPSBwY2lfbW9kdWxlX2luaXQoJnZlbG9jaXR5X2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X2NsZWFudXAJLQltb2R1bGUgdW5sb2FkCisgKgorICoJV2hlbiB0aGUgdmVsb2NpdHkgaGFyZHdhcmUgaXMgdW5sb2FkZWQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKglJdCB3aWxsIGNsZWFuIHVwIHRoZSBub3RpZmllcnMgYW5kIHRoZSB1bnJlZ2lzdGVyIHRoZSBQQ0kgCisgKglkcml2ZXIgaW50ZXJmYWNlIGZvciB0aGlzIGhhcmR3YXJlLiBUaGlzIGluIHR1cm4gY2xlYW5zIHVwCisgKglhbGwgZGlzY292ZXJlZCBpbnRlcmZhY2VzIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworIAorc3RhdGljIHZvaWQgX19leGl0IHZlbG9jaXR5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdmVsb2NpdHlfdW5yZWdpc3Rlcl9ub3RpZmllcigpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmVsb2NpdHlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmVsb2NpdHlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodmVsb2NpdHlfY2xlYW51cF9tb2R1bGUpOworCisKKy8qCisgKiBNSUkgYWNjZXNzICwgbWVkaWEgbGluayBtb2RlIHNldHRpbmcgZnVuY3Rpb25zCisgKi8KKyAKKyAKKy8qKgorICoJbWlpX2luaXQJLQlzZXQgdXAgTUlJCisgKglAdnB0cjogdmVsb2NpdHkgYWRhcHRlcgorICoJQG1paV9zdGF0dXM6ICBsaW5rcyB0YXR1cworICoKKyAqCVNldCB1cCB0aGUgUEhZIGZvciB0aGUgY3VycmVudCBsaW5rIHN0YXRlLgorICovCisgCitzdGF0aWMgdm9pZCBtaWlfaW5pdChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgdTMyIG1paV9zdGF0dXMpCit7CisJdTE2IEJNQ1I7CisKKwlzd2l0Y2ggKFBIWUlEX0dFVF9QSFlfSUQodnB0ci0+cGh5X2lkKSkgeworCWNhc2UgUEhZSURfQ0lDQURBX0NTODIwMToKKwkJLyoKKwkJICoJUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09GRigoQU5BUl9BU01ESVIgfCBBTkFSX1BBVVNFKSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCS8qCisJCSAqCVR1cm4gb24gRUNIT0RJUyBiaXQgaW4gTldheS1mb3JjZWQgZnVsbCBtb2RlIGFuZCB0dXJuIGl0CisJCSAqCW9mZiBpdCBpbiBOV2F5LWZvcmNlZCBoYWxmIG1vZGUgZm9yIE5XYXktZm9yY2VkIHYucy4gCisJCSAqCWxlZ2FjeS1mb3JjZWQgaXNzdWUuCisJCSAqLworCQlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJTUlJX1JFR19CSVRTX09OKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCWVsc2UKKwkJCU1JSV9SRUdfQklUU19PRkYoVENTUl9FQ0hPRElTLCBNSUlfUkVHX1RDU1IsIHZwdHItPm1hY19yZWdzKTsKKwkJLyoKKwkJICoJVHVybiBvbiBMaW5rL0FjdGl2aXR5IExFRCBlbmFibGUgYml0IGZvciBDSVM4MjAxCisJCSAqLworCQlNSUlfUkVHX0JJVFNfT04oUExFRF9MQUxCRSwgTUlJX1JFR19QTEVELCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCWNhc2UgUEhZSURfVlQzMjE2XzMyQklUOgorCWNhc2UgUEhZSURfVlQzMjE2XzY0QklUOgorCQkvKgorCQkgKglSZXNldCB0byBoYXJkd2FyZSBkZWZhdWx0CisJCSAqLworCQlNSUlfUkVHX0JJVFNfT04oKEFOQVJfQVNNRElSIHwgQU5BUl9QQVVTRSksIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKglUdXJuIG9uIEVDSE9ESVMgYml0IGluIE5XYXktZm9yY2VkIGZ1bGwgbW9kZSBhbmQgdHVybiBpdAorCQkgKglvZmYgaXQgaW4gTldheS1mb3JjZWQgaGFsZiBtb2RlIGZvciBOV2F5LWZvcmNlZCB2LnMuIAorCQkgKglsZWdhY3ktZm9yY2VkIGlzc3VlCisJCSAqLworCQlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJTUlJX1JFR19CSVRTX09OKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCWVsc2UKKwkJCU1JSV9SRUdfQklUU19PRkYoVENTUl9FQ0hPRElTLCBNSUlfUkVHX1RDU1IsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIWUlEX01BUlZFTExfMTAwMDoKKwljYXNlIFBIWUlEX01BUlZFTExfMTAwMFM6CisJCS8qCisJCSAqCUFzc2VydCBDUlMgb24gVHJhbnNtaXQgCisJCSAqLworCQlNSUlfUkVHX0JJVFNfT04oUFNDUl9BQ1JTVFgsIE1JSV9SRUdfUFNDUiwgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKglSZXNldCB0byBoYXJkd2FyZSBkZWZhdWx0IAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKChBTkFSX0FTTURJUiB8IEFOQVJfUEFVU0UpLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwl2ZWxvY2l0eV9taWlfcmVhZCh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19CTUNSLCAmQk1DUik7CisJaWYgKEJNQ1IgJiBCTUNSX0lTTykgeworCQlCTUNSICY9IH5CTUNSX0lTTzsKKwkJdmVsb2NpdHlfbWlpX3dyaXRlKHZwdHItPm1hY19yZWdzLCBNSUlfUkVHX0JNQ1IsIEJNQ1IpOworCX0KK30KKworLyoqCisgKglzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsCS0JYXV0b3BvbGwgb2ZmCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKgorICoJVHVybiBvZmYgdGhlIGF1dG9wb2xsIGFuZCB3YWl0IGZvciBpdCB0byBkaXNhYmxlIG9uIHRoZSBjaGlwCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKQoreworCXUxNiB3dzsKKworCS8qICB0dXJuIG9mZiBNQVVUTyAqLworCXdyaXRlYigwLCAmcmVncy0+TUlJQ1IpOworCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoQllURV9SRUdfQklUU19JU19PTihNSUlTUl9NSURMRSwgJnJlZ3MtPk1JSVNSKSkKKwkJCWJyZWFrOworCX0KK30KKworLyoqCisgKgllbmFibGVfbWlpX2F1dG9wb2xsCS0JdHVybiBvbiBhdXRvcG9sbGluZworICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoKKyAqCUVuYWJsZSB0aGUgTUlJIGxpbmsgc3RhdHVzIGF1dG9wb2xsIGZlYXR1cmUgb24gdGhlIFZlbG9jaXR5CisgKgloYXJkd2FyZS4gV2FpdCBmb3IgaXQgdG8gZW5hYmxlLgorICovCisKK3N0YXRpYyB2b2lkIGVuYWJsZV9taWlfYXV0b3BvbGwoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKQoreworCWludCBpaTsKKworCXdyaXRlYigwLCAmKHJlZ3MtPk1JSUNSKSk7CisJd3JpdGViKE1JSUFEUl9TV01QTCwgJnJlZ3MtPk1JSUFEUik7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBXX01BWF9USU1FT1VUOyBpaSsrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlJU1JfTUlETEUsICZyZWdzLT5NSUlTUikpCisJCQlicmVhazsKKwl9CisKKwl3cml0ZWIoTUlJQ1JfTUFVVE8sICZyZWdzLT5NSUlDUik7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBXX01BWF9USU1FT1VUOyBpaSsrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKCFCWVRFX1JFR19CSVRTX0lTX09OKE1JSVNSX01JRExFLCAmcmVncy0+TUlJU1IpKQorCQkJYnJlYWs7CisJfQorCit9CisKKy8qKgorICoJdmVsb2NpdHlfbWlpX3JlYWQJLQlyZWFkIE1JSSBkYXRhCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKglAaW5kZXg6IE1JSSByZWdpc3RlciBpbmRleAorICoJQGRhdGE6IGJ1ZmZlciBmb3IgcmVjZWl2ZWQgZGF0YQorICoKKyAqCVBlcmZvcm0gYSBzaW5nbGUgcmVhZCBvZiBhbiBNSUkgMTZiaXQgcmVnaXN0ZXIuIFJldHVybnMgemVybworICoJb24gc3VjY2VzcyBvciAtRVRJTUVET1VUIGlmIHRoZSBQSFkgZGlkIG5vdCByZXNwb25kLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X21paV9yZWFkKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICpyZWdzLCB1OCBpbmRleCwgdTE2ICpkYXRhKQoreworCXUxNiB3dzsKKworCS8qCisJICoJRGlzYWJsZSBNSUlDUl9NQVVUTywgc28gdGhhdCBtaWkgYWRkciBjYW4gYmUgc2V0IG5vcm1hbGx5CisJICovCisJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCXdyaXRlYihpbmRleCwgJnJlZ3MtPk1JSUFEUik7CisKKwlCWVRFX1JFR19CSVRTX09OKE1JSUNSX1JDTUQsICZyZWdzLT5NSUlDUik7CisKKwlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CisJCWlmICghKHJlYWRiKCZyZWdzLT5NSUlDUikgJiBNSUlDUl9SQ01EKSkKKwkJCWJyZWFrOworCX0KKworCSpkYXRhID0gcmVhZHcoJnJlZ3MtPk1JSURBVEEpOworCisJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKwlpZiAod3cgPT0gV19NQVhfVElNRU9VVCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfbWlpX3dyaXRlCS0Jd3JpdGUgTUlJIGRhdGEKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCUBpbmRleDogTUlJIHJlZ2lzdGVyIGluZGV4CisgKglAZGF0YTogMTZiaXQgZGF0YSBmb3IgdGhlIE1JSSByZWdpc3RlcgorICoKKyAqCVBlcmZvcm0gYSBzaW5nbGUgd3JpdGUgdG8gYW4gTUlJIDE2Yml0IHJlZ2lzdGVyLiBSZXR1cm5zIHplcm8KKyAqCW9uIHN1Y2Nlc3Mgb3IgLUVUSU1FRE9VVCBpZiB0aGUgUEhZIGRpZCBub3QgcmVzcG9uZC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9taWlfd3JpdGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKnJlZ3MsIHU4IG1paV9hZGRyLCB1MTYgZGF0YSkKK3sKKwl1MTYgd3c7CisKKwkvKgorCSAqCURpc2FibGUgTUlJQ1JfTUFVVE8sIHNvIHRoYXQgbWlpIGFkZHIgY2FuIGJlIHNldCBub3JtYWxseQorCSAqLworCXNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisKKwkvKiBNSUkgcmVnIG9mZnNldCAqLworCXdyaXRlYihtaWlfYWRkciwgJnJlZ3MtPk1JSUFEUik7CisJLyogc2V0IE1JSSBkYXRhICovCisJd3JpdGV3KGRhdGEsICZyZWdzLT5NSUlEQVRBKTsKKworCS8qIHR1cm4gb24gTUlJQ1JfV0NNRCAqLworCUJZVEVfUkVHX0JJVFNfT04oTUlJQ1JfV0NNRCwgJnJlZ3MtPk1JSUNSKTsKKworCS8qIFdfTUFYX1RJTUVPVVQgaXMgdGhlIHRpbWVvdXQgcGVyaW9kICovCisJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgeworCQl1ZGVsYXkoNSk7CisJCWlmICghKHJlYWRiKCZyZWdzLT5NSUlDUikgJiBNSUlDUl9XQ01EKSkKKwkJCWJyZWFrOworCX0KKwllbmFibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpCisJCXJldHVybiAtRVRJTUVET1VUOworCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZQktCWdldCBtZWRpYSBzZWxlY3Rpb24KKyAqCUB2cHRyOiB2ZWxvY2l0eSBhZGFwdGVyCisgKgorICoJR2V0IHRoZSBtZWRpYSBtb2RlIHN0b3JlZCBpbiBFRVBST00gb3IgbW9kdWxlIG9wdGlvbnMgYW5kIGxvYWQKKyAqCW1paV9zdGF0dXMgYWNjb3JkaW5nbHkuIFRoZSByZXF1ZXN0ZWQgbGluayBzdGF0ZSBpbmZvcm1hdGlvbgorICoJaXMgYWxzbyByZXR1cm5lZC4KKyAqLworIAorc3RhdGljIHUzMiB2ZWxvY2l0eV9nZXRfb3B0X21lZGlhX21vZGUoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJdTMyIHN0YXR1cyA9IDA7CisKKwlzd2l0Y2ggKHZwdHItPm9wdGlvbnMuc3BkX2RweCkgeworCWNhc2UgU1BEX0RQWF9BVVRPOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBTUERfRFBYXzEwMF9GVUxMOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9TUEVFRF8xMDAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUERfRFBYXzEwX0ZVTEw6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMDBfSEFMRjoKKwkJc3RhdHVzID0gVkVMT0NJVFlfU1BFRURfMTAwOworCQlicmVhazsKKwljYXNlIFNQRF9EUFhfMTBfSEFMRjoKKwkJc3RhdHVzID0gVkVMT0NJVFlfU1BFRURfMTA7CisJCWJyZWFrOworCX0KKwl2cHRyLT5taWlfc3RhdHVzID0gc3RhdHVzOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJbWlpX3NldF9hdXRvX29uCQktCWF1dG9uZWdvdGlhdGUgb24KKyAqCUB2cHRyOiB2ZWxvY2l0eQorICoKKyAqCUVuYWJsZSBhdXRvbmVnb3RhdGlvbiBvbiB0aGlzIGludGVyZmFjZQorICovCisgCitzdGF0aWMgdm9pZCBtaWlfc2V0X2F1dG9fb24oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaWYgKE1JSV9SRUdfQklUU19JU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpKQorCQlNSUlfUkVHX0JJVFNfT04oQk1DUl9SRUFVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworCWVsc2UKKwkJTUlJX1JFR19CSVRTX09OKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7Cit9CisKKworLyoKK3N0YXRpYyB2b2lkIG1paV9zZXRfYXV0b19vZmYoc3RydWN0IHZlbG9jaXR5X2luZm8gKiB2cHRyKQoreworICAgIE1JSV9SRUdfQklUU19PRkYoQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKK30KKyovCisKKy8qKgorICoJc2V0X21paV9mbG93X2NvbnRyb2wJLQlmbG93IGNvbnRyb2wgc2V0dXAKKyAqCUB2cHRyOiB2ZWxvY2l0eSBpbnRlcmZhY2UKKyAqCisgKglTZXQgdXAgdGhlIGZsb3cgY29udHJvbCBvbiB0aGlzIGludGVyZmFjZSBhY2NvcmRpbmcgdG8KKyAqCXRoZSBzdXBwbGllZCB1c2VyL2VlcHJvbSBvcHRpb25zLgorICovCisgCitzdGF0aWMgdm9pZCBzZXRfbWlpX2Zsb3dfY29udHJvbChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwkvKkVuYWJsZSBvciBEaXNhYmxlIFBBVVNFIGluIEFOQVIgKi8KKwlzd2l0Y2ggKHZwdHItPm9wdGlvbnMuZmxvd19jbnRsKSB7CisJY2FzZSBGTE9XX0NOVExfVFg6CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihBTkFSX0FTTURJUiwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfUlg6CisJCU1JSV9SRUdfQklUU19PTihBTkFSX1BBVVNFLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9UWF9SWDoKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX0RJU0FCTEU6CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc2V0X21lZGlhX21vZGUJCS0Jc2V0IG1lZGlhIG1vZGUKKyAqCUBtaWlfc3RhdHVzOiBvbGQgTUlJIGxpbmsgc3RhdGUKKyAqCisgKglDaGVjayB0aGUgbWVkaWEgbGluayBzdGF0ZSBhbmQgY29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wKKyAqCVBIWSBhbmQgYWxzbyB2ZWxvY2l0eSBoYXJkd2FyZSBzZXR1cCBhY2NvcmRpbmdseS4gSW4gcGFydGljdWxhcgorICoJd2UgbmVlZCB0byBzZXQgdXAgQ0QgcG9sbGluZyBhbmQgZnJhbWUgYnVyc3RpbmcuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc2V0X21lZGlhX21vZGUoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBtaWlfc3RhdHVzKQoreworCXUzMiBjdXJyX3N0YXR1czsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKworCXZwdHItPm1paV9zdGF0dXMgPSBtaWlfY2hlY2tfbWVkaWFfbW9kZSh2cHRyLT5tYWNfcmVncyk7CisJY3Vycl9zdGF0dXMgPSB2cHRyLT5taWlfc3RhdHVzICYgKH5WRUxPQ0lUWV9MSU5LX0ZBSUwpOworCisJLyogU2V0IG1paSBsaW5rIHN0YXR1cyAqLworCXNldF9taWlfZmxvd19jb250cm9sKHZwdHIpOworCisJLyoKKwkgICBDaGVjayBpZiBuZXcgc3RhdHVzIGlzIGNvbnNpc2VudCB3aXRoIGN1cnJlbnQgc3RhdHVzCisJICAgaWYgKCgobWlpX3N0YXR1cyAmIGN1cnJfc3RhdHVzKSAmIFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFKQorCSAgIHx8IChtaWlfc3RhdHVzPT1jdXJyX3N0YXR1cykpIHsKKwkgICB2cHRyLT5taWlfc3RhdHVzPW1paV9jaGVja19tZWRpYV9tb2RlKHZwdHItPm1hY19yZWdzKTsKKwkgICB2cHRyLT5taWlfc3RhdHVzPWNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7CisJICAgVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiVmVsb2NpdHkgbGluayBubyBjaGFuZ2VcbiIpOworCSAgIHJldHVybiAwOworCSAgIH0KKwkgKi8KKworCWlmIChQSFlJRF9HRVRfUEhZX0lEKHZwdHItPnBoeV9pZCkgPT0gUEhZSURfQ0lDQURBX0NTODIwMSkgeworCQlNSUlfUkVHX0JJVFNfT04oQVVYQ1JfTURQUFMsIE1JSV9SRUdfQVVYQ1IsIHZwdHItPm1hY19yZWdzKTsKKwl9CisKKwkvKgorCSAqCUlmIGNvbm5lY3Rpb24gdHlwZSBpcyBBVVRPCisJICovCisJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICJWZWxvY2l0eSBpcyBBVVRPIG1vZGVcbiIpOworCQkvKiBjbGVhciBmb3JjZSBNQUMgbW9kZSBiaXQgKi8KKwkJQllURV9SRUdfQklUU19PRkYoQ0hJUEdDUl9GQ01PREUsICZyZWdzLT5DSElQR0NSKTsKKwkJLyogc2V0IGR1cGxleCBtb2RlIG9mIE1BQyBhY2NvcmRpbmcgdG8gZHVwbGV4IG1vZGUgb2YgTUlJICovCisJCU1JSV9SRUdfQklUU19PTihBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihHMTAwMENSXzEwMDBGRCB8IEcxMDAwQ1JfMTAwMCwgTUlJX1JFR19HMTAwMENSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihCTUNSX1NQRUVEMUcsIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworCisJCS8qIGVuYWJsZSBBVVRPLU5FR08gbW9kZSAqLworCQltaWlfc2V0X2F1dG9fb24odnB0cik7CisJfSBlbHNlIHsKKwkJdTE2IEFOQVI7CisJCXU4IENISVBHQ1I7CisKKwkJLyoKKwkJICogMS4gaWYgaXQncyAzMTE5LCBkaXNhYmxlIGZyYW1lIGJ1cnN0aW5nIGluIGhhbGZkdXBsZXggbW9kZQorCQkgKiAgICBhbmQgZW5hYmxlIGl0IGluIGZ1bGxkdXBsZXggbW9kZQorCQkgKiAyLiBzZXQgY29ycmVjdCBNSUkvR01JSSBhbmQgaGFsZi9mdWxsIGR1cGxleCBtb2RlIGluIENISVBHQ1IKKwkJICogMy4gb25seSBlbmFibGUgQ0QgaGVhcnQgYmVhdCBjb3VudGVyIGluIDEwSEQgbW9kZQorCQkgKi8KKworCQkvKiBzZXQgZm9yY2UgTUFDIG1vZGUgYml0ICovCisJCUJZVEVfUkVHX0JJVFNfT04oQ0hJUEdDUl9GQ01PREUsICZyZWdzLT5DSElQR0NSKTsKKworCQlDSElQR0NSID0gcmVhZGIoJnJlZ3MtPkNISVBHQ1IpOworCQlDSElQR0NSICY9IH5DSElQR0NSX0ZDR01JSTsKKworCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKSB7CisJCQlDSElQR0NSIHw9IENISVBHQ1JfRkNGRFg7CisJCQl3cml0ZWIoQ0hJUEdDUiwgJnJlZ3MtPkNISVBHQ1IpOworCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAic2V0IFZlbG9jaXR5IHRvIGZvcmNlZCBmdWxsIG1vZGVcbiIpOworCQkJaWYgKHZwdHItPnJldl9pZCA8IFJFVl9JRF9WVDMyMTZfQTApCisJCQkJQllURV9SRUdfQklUU19PRkYoVENSX1RCMkJESVMsICZyZWdzLT5UQ1IpOworCQl9IGVsc2UgeworCQkJQ0hJUEdDUiAmPSB+Q0hJUEdDUl9GQ0ZEWDsKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgInNldCBWZWxvY2l0eSB0byBmb3JjZWQgaGFsZiBtb2RlXG4iKTsKKwkJCXdyaXRlYihDSElQR0NSLCAmcmVncy0+Q0hJUEdDUik7CisJCQlpZiAodnB0ci0+cmV2X2lkIDwgUkVWX0lEX1ZUMzIxNl9BMCkKKwkJCQlCWVRFX1JFR19CSVRTX09OKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJfQorCisJCU1JSV9SRUdfQklUU19PRkYoRzEwMDBDUl8xMDAwRkQgfCBHMTAwMENSXzEwMDAsIE1JSV9SRUdfRzEwMDBDUiwgdnB0ci0+bWFjX3JlZ3MpOworCisJCWlmICghKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkgJiYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMCkpIHsKKwkJCUJZVEVfUkVHX0JJVFNfT0ZGKFRFU1RDRkdfSEJESVMsICZyZWdzLT5URVNUQ0ZHKTsKKwkJfSBlbHNlIHsKKwkJCUJZVEVfUkVHX0JJVFNfT04oVEVTVENGR19IQkRJUywgJnJlZ3MtPlRFU1RDRkcpOworCQl9CisJCS8qIE1JSV9SRUdfQklUU19PRkYoQk1DUl9TUEVFRDFHLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsgKi8KKwkJdmVsb2NpdHlfbWlpX3JlYWQodnB0ci0+bWFjX3JlZ3MsIE1JSV9SRUdfQU5BUiwgJkFOQVIpOworCQlBTkFSICY9ICh+KEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSk7CisJCWlmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwKSB7CisJCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJCUFOQVIgfD0gQU5BUl9UWEZEOworCQkJZWxzZQorCQkJCUFOQVIgfD0gQU5BUl9UWDsKKwkJfSBlbHNlIHsKKwkJCWlmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCQkJQU5BUiB8PSBBTkFSXzEwRkQ7CisJCQllbHNlCisJCQkJQU5BUiB8PSBBTkFSXzEwOworCQl9CisJCXZlbG9jaXR5X21paV93cml0ZSh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19BTkFSLCBBTkFSKTsKKwkJLyogZW5hYmxlIEFVVE8tTkVHTyBtb2RlICovCisJCW1paV9zZXRfYXV0b19vbih2cHRyKTsKKwkJLyogTUlJX1JFR19CSVRTX09OKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7ICovCisJfQorCS8qIHZwdHItPm1paV9zdGF0dXM9bWlpX2NoZWNrX21lZGlhX21vZGUodnB0ci0+bWFjX3JlZ3MpOyAqLworCS8qIHZwdHItPm1paV9zdGF0dXM9Y2hlY2tfY29ubmVjdGlvbl90eXBlKHZwdHItPm1hY19yZWdzKTsgKi8KKwlyZXR1cm4gVkVMT0NJVFlfTElOS19DSEFOR0U7Cit9CisKKy8qKgorICoJbWlpX2NoZWNrX21lZGlhX21vZGUJLQljaGVjayBtZWRpYSBzdGF0ZQorICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoKKyAqCUNoZWNrIHRoZSBjdXJyZW50IE1JSSBzdGF0dXMgYW5kIGRldGVybWluZSB0aGUgbGluayBzdGF0dXMKKyAqCWFjY29yZGluZ2x5CisgKi8KKyAKK3N0YXRpYyB1MzIgbWlpX2NoZWNrX21lZGlhX21vZGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKQoreworCXUzMiBzdGF0dXMgPSAwOworCXUxNiBBTkFSOworCisJaWYgKCFNSUlfUkVHX0JJVFNfSVNfT04oQk1TUl9MTkssIE1JSV9SRUdfQk1TUiwgcmVncykpCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9MSU5LX0ZBSUw7CisKKwlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEcxMDAwQ1JfMTAwMEZELCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTAwMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMOworCWVsc2UgaWYgKE1JSV9SRUdfQklUU19JU19PTihHMTAwMENSXzEwMDAsIE1JSV9SRUdfRzEwMDBDUiwgcmVncykpCisJCXN0YXR1cyB8PSAoVkVMT0NJVFlfU1BFRURfMTAwMCk7CisJZWxzZSB7CisJCXZlbG9jaXR5X21paV9yZWFkKHJlZ3MsIE1JSV9SRUdfQU5BUiwgJkFOQVIpOworCQlpZiAoQU5BUiAmIEFOQVJfVFhGRCkKKwkJCXN0YXR1cyB8PSAoVkVMT0NJVFlfU1BFRURfMTAwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpOworCQllbHNlIGlmIChBTkFSICYgQU5BUl9UWCkKKwkJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDA7CisJCWVsc2UgaWYgKEFOQVIgJiBBTkFSXzEwRkQpCisJCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpOworCQllbHNlCisJCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwKTsKKwl9CisKKwlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCByZWdzKSkgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKChBTkFSICYgKEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSkKKwkJICAgID09IChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpIHsKKwkJCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwIHwgRzEwMDBDUl8xMDAwRkQsIE1JSV9SRUdfRzEwMDBDUiwgcmVncykpCisJCQkJc3RhdHVzIHw9IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHUzMiBjaGVja19jb25uZWN0aW9uX3R5cGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKQoreworCXUzMiBzdGF0dXMgPSAwOworCXU4IFBIWVNSMDsKKwl1MTYgQU5BUjsKKwlQSFlTUjAgPSByZWFkYigmcmVncy0+UEhZU1IwKTsKKworCS8qCisJICAgaWYgKCEoUEhZU1IwICYgUEhZU1IwX0xJTktHRCkpCisJICAgc3RhdHVzfD1WRUxPQ0lUWV9MSU5LX0ZBSUw7CisJICovCisKKwlpZiAoUEhZU1IwICYgUEhZU1IwX0ZEUFgpCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKworCWlmIChQSFlTUjAgJiBQSFlTUjBfU1BERykKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwMDA7CisJaWYgKFBIWVNSMCAmIFBIWVNSMF9TUEQxMCkKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwOworCWVsc2UKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwMDsKKworCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHJlZ3MpKSB7CisJCXZlbG9jaXR5X21paV9yZWFkKHJlZ3MsIE1JSV9SRUdfQU5BUiwgJkFOQVIpOworCQlpZiAoKEFOQVIgJiAoQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKQorCQkgICAgPT0gKEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSkgeworCQkJaWYgKE1JSV9SRUdfQklUU19JU19PTihHMTAwMENSXzEwMDAgfCBHMTAwMENSXzEwMDBGRCwgTUlJX1JFR19HMTAwMENSLCByZWdzKSkKKwkJCQlzdGF0dXMgfD0gVkVMT0NJVFlfQVVUT05FR19FTkFCTEU7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCWVuYWJsZV9mbG93X2NvbnRyb2xfYWJpbGl0eQktCWZsb3cgY29udHJvbAorICoJQHZwdHI6IHZlbG9pdHkgdG8gY29uZmlndXJlCisgKgorICoJU2V0IHVwIGZsb3cgY29udHJvbCBhY2NvcmRpbmcgdG8gdGhlIGZsb3cgY29udHJvbCBvcHRpb25zCisgKglkZXRlcm1pbmVkIGJ5IHRoZSBlZXByb20vY29uZmlndXJhdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBlbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKworCXN3aXRjaCAodnB0ci0+b3B0aW9ucy5mbG93X2NudGwpIHsKKworCWNhc2UgRkxPV19DTlRMX0RFRkFVTFQ6CisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKFBIWVNSMF9SWEZMQywgJnJlZ3MtPlBIWVNSMCkpCisJCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJZWxzZQorCQkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMENscik7CisKKwkJaWYgKEJZVEVfUkVHX0JJVFNfSVNfT04oUEhZU1IwX1RYRkxDLCAmcmVncy0+UEhZU1IwKSkKKwkJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBTZXQpOworCQllbHNlCisJCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9UWDoKKwkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1JYOgorCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMENscik7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfVFhfUlg6CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBTZXQpOworCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9ESVNBQkxFOgorCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMENscik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKKworLyoqCisgKgl2ZWxvY2l0eV9ldGh0b29sX3VwCS0JcHJlIGhvb2sgZm9yIGV0aHRvb2wKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKgorICoJQ2FsbGVkIGJlZm9yZSBhbiBldGh0b29sIG9wZXJhdGlvbi4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlCisgKgljaGlwIGlzIG91dCBvZiBEMyBzdGF0ZSBiZWZvcmUgd2UgcG9rZSBhdCBpdC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9ldGh0b29sX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QwKTsKKwlyZXR1cm4gMDsKK30JCisKKy8qKgorICoJdmVsb2NpdHlfZXRodG9vbF9kb3duCS0JcG9zdCBob29rIGZvciBldGh0b29sCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxlZCBhZnRlciBhbiBldGh0b29sIG9wZXJhdGlvbi4gUmVzdG9yZSB0aGUgY2hpcCBiYWNrIHRvIEQzCisgKglzdGF0ZSBpZiBpdCBpc24ndCBydW5uaW5nLgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9ldGh0b29sX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDNob3QpOworfQorCitzdGF0aWMgaW50IHZlbG9jaXR5X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1MzIgc3RhdHVzOworCXN0YXR1cyA9IGNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7CisKKwljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCWlmIChzdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDApCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJZWxzZQorCQljbWQtPnNwZWVkID0gU1BFRURfMTA7CisJY21kLT5hdXRvbmVnID0gKHN0YXR1cyAmIFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFKSA/IEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFOworCWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJY21kLT5waHlfYWRkcmVzcyA9IHJlYWRiKCZyZWdzLT5NSUlBRFIpICYgMHgxRjsKKworCWlmIChzdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwl1MzIgY3Vycl9zdGF0dXM7CisJdTMyIG5ld19zdGF0dXMgPSAwOworCWludCByZXQgPSAwOworCQorCWN1cnJfc3RhdHVzID0gY2hlY2tfY29ubmVjdGlvbl90eXBlKHZwdHItPm1hY19yZWdzKTsKKwljdXJyX3N0YXR1cyAmPSAoflZFTE9DSVRZX0xJTktfRkFJTCk7CisKKwluZXdfc3RhdHVzIHw9ICgoY21kLT5hdXRvbmVnKSA/IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFIDogMCk7CisJbmV3X3N0YXR1cyB8PSAoKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKSA/IFZFTE9DSVRZX1NQRUVEXzEwMCA6IDApOworCW5ld19zdGF0dXMgfD0gKChjbWQtPnNwZWVkID09IFNQRUVEXzEwKSA/IFZFTE9DSVRZX1NQRUVEXzEwIDogMCk7CisJbmV3X3N0YXR1cyB8PSAoKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSA/IFZFTE9DSVRZX0RVUExFWF9GVUxMIDogMCk7CisKKwlpZiAoKG5ld19zdGF0dXMgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgJiYgKG5ld19zdGF0dXMgIT0gKGN1cnJfc3RhdHVzIHwgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpKSkKKwkJcmV0ID0gLUVJTlZBTDsKKwllbHNlCisJCXZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHZwdHIsIG5ld19zdGF0dXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiB2ZWxvY2l0eV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCXJldHVybiBCWVRFX1JFR19CSVRTX0lTX09OKFBIWVNSMF9MSU5LR0QsICZyZWdzLT5QSFlTUjApICA/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCXN0cmNweShpbmZvLT5kcml2ZXIsIFZFTE9DSVRZX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBWRUxPQ0lUWV9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHZwdHItPnBkZXYpKTsKK30KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZXRodG9vbF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8IFdBS0VfVUNBU1QgfCBXQUtFX0FSUDsKKwl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwkvKgorCSAgIGlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9QSFkpCisJCSAgIHdvbC53b2xvcHRzfD1XQUtFX1BIWTsKKwkJCSAqLworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9VQ0FTVCkKKwkJd29sLT53b2xvcHRzIHw9IFdBS0VfVUNBU1Q7CisJaWYgKHZwdHItPndvbF9vcHRzICYgVkVMT0NJVFlfV09MX0FSUCkKKwkJd29sLT53b2xvcHRzIHw9IFdBS0VfQVJQOworCW1lbWNweSgmd29sLT5zb3Bhc3MsIHZwdHItPndvbF9wYXNzd2QsIDYpOworfQorCitzdGF0aWMgaW50IHZlbG9jaXR5X2V0aHRvb2xfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisKKwlpZiAoISh3b2wtPndvbG9wdHMgJiAoV0FLRV9QSFkgfCBXQUtFX01BR0lDIHwgV0FLRV9VQ0FTVCB8IFdBS0VfQVJQKSkpCisJCXJldHVybiAtRUZBVUxUOworCXZwdHItPndvbF9vcHRzID0gVkVMT0NJVFlfV09MX01BR0lDOworCisJLyoKKwkgICBpZiAod29sLndvbG9wdHMgJiBXQUtFX1BIWSkgeworCSAgIHZwdHItPndvbF9vcHRzfD1WRUxPQ0lUWV9XT0xfUEhZOworCSAgIHZwdHItPmZsYWdzIHw9VkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQ7CisJICAgfQorCSAqLworCisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpIHsKKwkJdnB0ci0+d29sX29wdHMgfD0gVkVMT0NJVFlfV09MX01BR0lDOworCQl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKwl9CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpIHsKKwkJdnB0ci0+d29sX29wdHMgfD0gVkVMT0NJVFlfV09MX1VDQVNUOworCQl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKwl9CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfQVJQKSB7CisJCXZwdHItPndvbF9vcHRzIHw9IFZFTE9DSVRZX1dPTF9BUlA7CisJCXZwdHItPmZsYWdzIHw9IFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEOworCX0KKwltZW1jcHkodnB0ci0+d29sX3Bhc3N3ZCwgd29sLT5zb3Bhc3MsIDYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHZlbG9jaXR5X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBtc2dsZXZlbDsKK30KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwkgbXNnbGV2ZWwgPSB2YWx1ZTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2ZWxvY2l0eV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0JdmVsb2NpdHlfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPQl2ZWxvY2l0eV9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCT0JdmVsb2NpdHlfZ2V0X2RydmluZm8sCisJLmdldF93b2wJPQl2ZWxvY2l0eV9ldGh0b29sX2dldF93b2wsCisJLnNldF93b2wJPQl2ZWxvY2l0eV9ldGh0b29sX3NldF93b2wsCisJLmdldF9tc2dsZXZlbAk9CXZlbG9jaXR5X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCT0JdmVsb2NpdHlfc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawk9CXZlbG9jaXR5X2dldF9saW5rLAorCS5iZWdpbgkJPQl2ZWxvY2l0eV9ldGh0b29sX3VwLAorCS5jb21wbGV0ZQk9CXZlbG9jaXR5X2V0aHRvb2xfZG93bgorfTsKKworLyoqCisgKgl2ZWxvY2l0eV9taWlfaW9jdGwJCS0JTUlJIGlvY3RsIGhhbmRsZXIKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKglAaWZyOiB0aGUgaWZyZXEgYmxvY2sgZm9yIHRoZSBpb2N0bAorICoJQGNtZDogdGhlIGNvbW1hbmQKKyAqCisgKglQcm9jZXNzIE1JSSByZXF1ZXN0cyBtYWRlIHZpYSBpb2N0bCBmcm9tIHRoZSBuZXR3b3JrIGxheWVyLiBUaGVzZQorICoJYXJlIHVzZWQgYnkgdG9vbHMgbGlrZSBrdWR6dSB0byBpbnRlcnJvZ2F0ZSB0aGUgbGluayBzdGF0ZSBvZiB0aGUKKyAqCWhhcmR3YXJlCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlkYXRhID0gaWZfbWlpKGlmcik7CisJaW50IGVycjsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCW1paWRhdGEtPnBoeV9pZCA9IHJlYWRiKCZyZWdzLT5NSUlBRFIpICYgMHgxZjsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYodmVsb2NpdHlfbWlpX3JlYWQodnB0ci0+bWFjX3JlZ3MsIG1paWRhdGEtPnJlZ19udW0gJiAweDFmLCAmKG1paWRhdGEtPnZhbF9vdXQpKSA8IDApCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwkJZXJyID0gdmVsb2NpdHlfbWlpX3dyaXRlKHZwdHItPm1hY19yZWdzLCBtaWlkYXRhLT5yZWdfbnVtICYgMHgxZiwgbWlpZGF0YS0+dmFsX2luKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnB0ci0+bG9jaywgZmxhZ3MpOworCQljaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCQlpZihlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qKgorICoJdmVsb2NpdHlfc2F2ZV9jb250ZXh0CS0Jc2F2ZSByZWdpc3RlcnMKKyAqCUB2cHRyOiB2ZWxvY2l0eSAKKyAqCUBjb250ZXh0OiBidWZmZXIgZm9yIHN0b3JlZCBjb250ZXh0CisgKgorICoJUmV0cmlldmUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB2ZWxvY2l0eSBoYXJkd2FyZQorICoJYW5kIHN0YXNoIGl0IGluIHRoZSBjb250ZXh0IHN0cnVjdHVyZSwgZm9yIHVzZSBieSB0aGUgY29udGV4dAorICoJcmVzdG9yZSBmdW5jdGlvbnMuIFRoaXMgYWxsb3dzIHVzIHRvIHNhdmUgdGhpbmdzIHdlIG5lZWQgYWNyb3NzCisgKglwb3dlciBkb3duIHN0YXRlcworICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zYXZlX2NvbnRleHQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV9jb250ZXh0ICogY29udGV4dCkKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1MTYgaTsKKwl1OCBfX2lvbWVtICpwdHIgPSAodTggX19pb21lbSAqKXJlZ3M7CisKKwlmb3IgKGkgPSBNQUNfUkVHX1BBUjsgaSA8IE1BQ19SRUdfQ1IwX0NMUjsgaSArPSA0KQorCQkqKCh1MzIgKikgKGNvbnRleHQtPm1hY19yZWcgKyBpKSkgPSByZWFkbChwdHIgKyBpKTsKKworCWZvciAoaSA9IE1BQ19SRUdfTUFSOyBpIDwgTUFDX1JFR19URENTUl9DTFI7IGkgKz0gNCkKKwkJKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpID0gcmVhZGwocHRyICsgaSk7CisKKwlmb3IgKGkgPSBNQUNfUkVHX1JEQkFTRV9MTzsgaSA8IE1BQ19SRUdfRklGT19URVNUMDsgaSArPSA0KQorCQkqKCh1MzIgKikgKGNvbnRleHQtPm1hY19yZWcgKyBpKSkgPSByZWFkbChwdHIgKyBpKTsKKworfQorCisvKioKKyAqCXZlbG9jaXR5X3Jlc3RvcmVfY29udGV4dAktCXJlc3RvcmUgcmVnaXN0ZXJzCisgKglAdnB0cjogdmVsb2NpdHkgCisgKglAY29udGV4dDogYnVmZmVyIGZvciBzdG9yZWQgY29udGV4dAorICoKKyAqCVJlbG9hZCB0aGUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB2ZWxvY2l0eSBjb250ZXh0IAorICoJY3JlYXRlZCBieSB2ZWxvY2l0eV9zYXZlX2NvbnRleHQuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3Jlc3RvcmVfY29udGV4dChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHZlbG9jaXR5X2NvbnRleHQgKmNvbnRleHQpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJaW50IGk7CisJdTggX19pb21lbSAqcHRyID0gKHU4IF9faW9tZW0gKilyZWdzOworCisJZm9yIChpID0gTUFDX1JFR19QQVI7IGkgPCBNQUNfUkVHX0NSMF9TRVQ7IGkgKz0gNCkgeworCQl3cml0ZWwoKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwkvKiBKdXN0IHNraXAgY3IwICovCisJZm9yIChpID0gTUFDX1JFR19DUjFfU0VUOyBpIDwgTUFDX1JFR19DUjBfQ0xSOyBpKyspIHsKKwkJLyogQ2xlYXIgKi8KKwkJd3JpdGViKH4oKigodTggKikgKGNvbnRleHQtPm1hY19yZWcgKyBpKSkpLCBwdHIgKyBpICsgNCk7CisJCS8qIFNldCAqLworCQl3cml0ZWIoKigodTggKikgKGNvbnRleHQtPm1hY19yZWcgKyBpKSksIHB0ciArIGkpOworCX0KKworCWZvciAoaSA9IE1BQ19SRUdfTUFSOyBpIDwgTUFDX1JFR19JTVI7IGkgKz0gNCkgeworCQl3cml0ZWwoKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwlmb3IgKGkgPSBNQUNfUkVHX1JEQkFTRV9MTzsgaSA8IE1BQ19SRUdfRklGT19URVNUMDsgaSArPSA0KSB7CisJCXdyaXRlbCgqKCh1MzIgKikgKGNvbnRleHQtPm1hY19yZWcgKyBpKSksIHB0ciArIGkpOworCX0KKworCWZvciAoaSA9IE1BQ19SRUdfVERDU1JfU0VUOyBpIDw9IE1BQ19SRUdfUkRDU1JfU0VUOyBpKyspIHsKKwkJd3JpdGViKCooKHU4ICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKK30KKworLyoqCisgKgl3b2xfY2FsY19jcmMJCS0JV09MIENSQworICoJQHBhdHRlcm46IGRhdGEgcGF0dGVybgorICoJQG1hc2tfcGF0dGVybjogbWFzaworICoKKyAqCUNvbXB1dGUgdGhlIHdha2Ugb24gbGFuIGNyYyBoYXNoZXMgZm9yIHRoZSBwYWNrZXQgaGVhZGVyCisgKgl3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAqLworCitzdGF0aWMgdTE2IHdvbF9jYWxjX2NyYyhpbnQgc2l6ZSwgdTggKiBwYXR0ZXJuLCB1OCAqbWFza19wYXR0ZXJuKQoreworCXUxNiBjcmMgPSAweEZGRkY7CisJdTggbWFzazsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbWFzayA9IG1hc2tfcGF0dGVybltpXTsKKworCQkvKiBTa2lwIHRoaXMgbG9vcCBpZiB0aGUgbWFzayBlcXVhbHMgdG8gemVybyAqLworCQlpZiAobWFzayA9PSAweDAwKQorCQkJY29udGludWU7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJaWYgKChtYXNrICYgMHgwMSkgPT0gMCkgeworCQkJCW1hc2sgPj49IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQltYXNrID4+PSAxOworCQkJY3JjID0gY3JjX2NjaXR0KGNyYywgJihwYXR0ZXJuW2kgKiA4ICsgal0pLCAxKTsKKwkJfQorCX0KKwkvKglGaW5hbGx5LCBpbnZlcnQgdGhlIHJlc3VsdCBvbmNlIHRvIGdldCB0aGUgY29ycmVjdCBkYXRhICovCisJY3JjID0gfmNyYzsKKwlyZXR1cm4gYml0cmV2ZXJzZShjcmMpID4+IDE2OworfQorCisvKioKKyAqCXZlbG9jaXR5X3NldF93b2wJLQlzZXQgdXAgZm9yIHdha2Ugb24gbGFuCisgKglAdnB0cjogdmVsb2NpdHkgdG8gc2V0IFdPTCBzdGF0dXMgb24KKyAqCisgKglTZXQgYSBjYXJkIHVwIGZvciB3YWtlIG9uIGxhbiBlaXRoZXIgYnkgdW5pY2FzdCBvciBieQorICoJQVJQIHBhY2tldC4KKyAqCisgKglGSVhNRTogY2hlY2sgc3RhdGljIGJ1ZmZlciBpcyBzYWZlIGhlcmUKKyAqLworCitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF93b2woc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJc3RhdGljIHU4IGJ1ZlsyNTZdOworCWludCBpOworCisJc3RhdGljIHUzMiBtYXNrX3BhdHRlcm5bMl1bNF0gPSB7CisJCXsweDAwMjAzMDAwLCAweDAwMDAwM0MwLCAweDAwMDAwMDAwLCAweDAwMDAwMDB9LCAvKiBBUlAgKi8KKwkJezB4ZmZmZmYwMDAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4MDAwZmZmZn0JIC8qIE1hZ2ljIFBhY2tldCAqLworCX07CisKKwl3cml0ZXcoMHhGRkZGLCAmcmVncy0+V09MQ1JDbHIpOworCXdyaXRlYihXT0xDRkdfU0FCIHwgV09MQ0ZHX1NBTSwgJnJlZ3MtPldPTENGR1NldCk7CisJd3JpdGV3KFdPTENSX01BR0lDX0VOLCAmcmVncy0+V09MQ1JTZXQpOworCisJLyoKKwkgICBpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfUEhZKQorCSAgIHdyaXRldygoV09MQ1JfTElOS09OX0VOfFdPTENSX0xJTktPRkZfRU4pLCAmcmVncy0+V09MQ1JTZXQpOworCSAqLworCisJaWYgKHZwdHItPndvbF9vcHRzICYgVkVMT0NJVFlfV09MX1VDQVNUKSB7CisJCXdyaXRldyhXT0xDUl9VTklDQVNUX0VOLCAmcmVncy0+V09MQ1JTZXQpOworCX0KKworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9BUlApIHsKKwkJc3RydWN0IGFycF9wYWNrZXQgKmFycCA9IChzdHJ1Y3QgYXJwX3BhY2tldCAqKSBidWY7CisJCXUxNiBjcmM7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihzdHJ1Y3QgYXJwX3BhY2tldCkgKyA3KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJd3JpdGVsKG1hc2tfcGF0dGVyblswXVtpXSwgJnJlZ3MtPkJ5dGVNYXNrWzBdW2ldKTsKKworCQlhcnAtPnR5cGUgPSBodG9ucyhFVEhfUF9BUlApOworCQlhcnAtPmFyX29wID0gaHRvbnMoMSk7CisKKwkJbWVtY3B5KGFycC0+YXJfdGlwLCB2cHRyLT5pcF9hZGRyLCA0KTsKKworCQljcmMgPSB3b2xfY2FsY19jcmMoKHNpemVvZihzdHJ1Y3QgYXJwX3BhY2tldCkgKyA3KSAvIDgsIGJ1ZiwKKwkJCQkodTggKikgJiBtYXNrX3BhdHRlcm5bMF1bMF0pOworCisJCXdyaXRldyhjcmMsICZyZWdzLT5QYXR0ZXJuQ1JDWzBdKTsKKwkJd3JpdGV3KFdPTENSX0FSUF9FTiwgJnJlZ3MtPldPTENSU2V0KTsKKwl9CisKKwlCWVRFX1JFR19CSVRTX09OKFBXQ0ZHX1dPTFRZUEUsICZyZWdzLT5QV0NGR1NldCk7CisJQllURV9SRUdfQklUU19PTihQV0NGR19MRUdBQ1lfV09MRU4sICZyZWdzLT5QV0NGR1NldCk7CisKKwl3cml0ZXcoMHgwRkZGLCAmcmVncy0+V09MU1JDbHIpOworCisJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoUEhZSURfR0VUX1BIWV9JRCh2cHRyLT5waHlfaWQpID09IFBIWUlEX0NJQ0FEQV9DUzgyMDEpCisJCQlNSUlfUkVHX0JJVFNfT04oQVVYQ1JfTURQUFMsIE1JSV9SRUdfQVVYQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQlNSUlfUkVHX0JJVFNfT0ZGKEcxMDAwQ1JfMTAwMEZEIHwgRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHZwdHItPm1hY19yZWdzKTsKKwl9CisKKwlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwMDApCisJCU1JSV9SRUdfQklUU19PTihCTUNSX1JFQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7CisKKwlCWVRFX1JFR19CSVRTX09OKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisKKwl7CisJCXU4IEdDUjsKKwkJR0NSID0gcmVhZGIoJnJlZ3MtPkNISVBHQ1IpOworCQlHQ1IgPSAoR0NSICYgfkNISVBHQ1JfRkNHTUlJKSB8IENISVBHQ1JfRkNGRFg7CisJCXdyaXRlYihHQ1IsICZyZWdzLT5DSElQR0NSKTsKKwl9CisKKwlCWVRFX1JFR19CSVRTX09GRihJU1JfUFdFSSwgJnJlZ3MtPklTUik7CisJLyogVHVybiBvbiBTV1BUQUcganVzdCBiZWZvcmUgZW50ZXJpbmcgcG93ZXIgbW9kZSAqLworCUJZVEVfUkVHX0JJVFNfT04oU1RJQ0tIV19TV1BUQUcsICZyZWdzLT5TVElDS0hXKTsKKwkvKiBHbyB0byBiZWQgLi4uLi4gKi8KKwlCWVRFX1JFR19CSVRTX09OKChTVElDS0hXX0RTMSB8IFNUSUNLSFdfRFMwKSwgJnJlZ3MtPlNUSUNLSFcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZighbmV0aWZfcnVubmluZyh2cHRyLT5kZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2godnB0ci0+ZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisjaWZkZWYgRVRIVE9PTF9HV09MCisJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQpIHsKKwkJdmVsb2NpdHlfZ2V0X2lwKHZwdHIpOworCQl2ZWxvY2l0eV9zYXZlX2NvbnRleHQodnB0ciwgJnZwdHItPmNvbnRleHQpOworCQl2ZWxvY2l0eV9zaHV0ZG93bih2cHRyKTsKKwkJdmVsb2NpdHlfc2V0X3dvbCh2cHRyKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJfSBlbHNlIHsKKwkJdmVsb2NpdHlfc2F2ZV9jb250ZXh0KHZwdHIsICZ2cHRyLT5jb250ZXh0KTsKKwkJdmVsb2NpdHlfc2h1dGRvd24odnB0cik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJfQorI2Vsc2UKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWlmKCFuZXRpZl9ydW5uaW5nKHZwdHItPmRldikpCisJCXJldHVybiAwOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCW1hY193b2xfcmVzZXQodnB0ci0+bWFjX3JlZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwl2ZWxvY2l0eV9yZXN0b3JlX2NvbnRleHQodnB0ciwgJnZwdHItPmNvbnRleHQpOworCXZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzKHZwdHIsIFZFTE9DSVRZX0lOSVRfV09MKTsKKwltYWNfZGlzYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCisJdmVsb2NpdHlfdHhfc3J2KHZwdHIsIDApOworCisJZm9yIChpID0gMDsgaSA8IHZwdHItPm51bV90eHE7IGkrKykgeworCQlpZiAodnB0ci0+dGRfdXNlZFtpXSkgeworCQkJbWFjX3R4X3F1ZXVlX3dha2UodnB0ci0+bWFjX3JlZ3MsIGkpOworCQl9CisJfQorCisJbWFjX2VuYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKHZwdHItPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9uZXRkZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBub3RpZmljYXRpb24sIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBwdHI7CisKKwlpZiAoaWZhKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZmEtPmlmYV9kZXYtPmRldjsKKwkJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHI7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cHRyLCAmdmVsb2NpdHlfZGV2X2xpc3QsIGxpc3QpIHsKKwkJCWlmICh2cHRyLT5kZXYgPT0gZGV2KSB7CisJCQkJdmVsb2NpdHlfZ2V0X2lwKHZwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaCBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzBiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApAQCAtMCwwICsxLDE4NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDMgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBGaWxlOiB2aWEtdmVsb2NpdHkuaAorICoKKyAqIFB1cnBvc2U6IEhlYWRlciBmaWxlIHRvIGRlZmluZSBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZXMuCisgKgorICogQXV0aG9yOiBDaHVhbmcgTGlhbmctU2hpbmcsIEFKIEppYW5nCisgKgorICogRGF0ZTogSmFuIDI0LCAyMDAzCisgKi8KKworCisjaWZuZGVmIFZFTE9DSVRZX0gKKyNkZWZpbmUgVkVMT0NJVFlfSAorCisjZGVmaW5lIFZFTE9DSVRZX1RYX0NTVU1fU1VQUE9SVAorCisjZGVmaW5lIFZFTE9DSVRZX05BTUUgICAgICAgICAgInZpYS12ZWxvY2l0eSIKKyNkZWZpbmUgVkVMT0NJVFlfRlVMTF9EUlZfTkFNICAiVklBIE5ldHdvcmtpbmcgVmVsb2NpdHkgRmFtaWx5IEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciBEcml2ZXIiCisjZGVmaW5lIFZFTE9DSVRZX1ZFUlNJT04gICAgICAgIjEuMTMiCisKKyNkZWZpbmUgUEtUX0JVRl9TWiAgICAgICAgICAxNTQwCisKKyNkZWZpbmUgTUFYX1VOSVRTICAgICAgICAgICA4CisjZGVmaW5lIE9QVElPTl9ERUZBVUxUICAgICAgeyBbMCAuLi4gTUFYX1VOSVRTLTFdID0gLTF9CisKKyNkZWZpbmUgUkVWX0lEX1ZUNjExMCAgICAgICAoMCkKKworI2RlZmluZSBCWVRFX1JFR19CSVRTX09OKHgscCkgICAgICAgZG8geyB3cml0ZWIocmVhZGIoKHApKXwoeCksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBXT1JEX1JFR19CSVRTX09OKHgscCkgICAgICAgZG8geyB3cml0ZXcocmVhZHcoKHApKXwoeCksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19PTih4LHApICAgICAgZG8geyB3cml0ZWwocmVhZGwoKHApKXwoeCksKHApKTt9IHdoaWxlICgwKQorCisjZGVmaW5lIEJZVEVfUkVHX0JJVFNfSVNfT04oeCxwKSAgICAocmVhZGIoKHApKSAmICh4KSkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19JU19PTih4LHApICAgIChyZWFkdygocCkpICYgKHgpKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19JU19PTih4LHApICAgKHJlYWRsKChwKSkgJiAoeCkpCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19PRkYoeCxwKSAgICAgIGRvIHsgd3JpdGViKHJlYWRiKChwKSkgJiAofih4KSksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBXT1JEX1JFR19CSVRTX09GRih4LHApICAgICAgZG8geyB3cml0ZXcocmVhZHcoKHApKSAmICh+KHgpKSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIERXT1JEX1JFR19CSVRTX09GRih4LHApICAgICBkbyB7IHdyaXRlbChyZWFkbCgocCkpICYgKH4oeCkpLChwKSk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBCWVRFX1JFR19CSVRTX1NFVCh4LG0scCkgICAgZG8geyB3cml0ZWIoIChyZWFkYigocCkpICYgKH4obSkpKSB8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19TRVQoeCxtLHApICAgIGRvIHsgd3JpdGV3KCAocmVhZHcoKHApKSAmICh+KG0pKSkgfCh4KSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIERXT1JEX1JFR19CSVRTX1NFVCh4LG0scCkgICBkbyB7IHdyaXRlbCggKHJlYWRsKChwKSkgJiAofihtKSkpfCh4KSwocCkpO30gIHdoaWxlICgwKQorCisjZGVmaW5lIFZBUl9VU0VEKHApICAgICBkbyB7KHApPShwKTt9IHdoaWxlICgwKQorCisvKgorICogUHVycG9zZTogU3RydWN0dXJlcyBmb3IgTUFYIFJYL1RYIGRlc2NyaXB0b3JzLgorICovCisKKworI2RlZmluZSBCX09XTkVEX0JZX0NISVAgICAgIDEKKyNkZWZpbmUgQl9PV05FRF9CWV9IT1NUICAgICAwCisKKy8qCisgKiBCaXRzIGluIHRoZSBSU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSU1JfREVUQUcgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFJTUl9TTlRBRyAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUlNSX1JYRVIgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBSU1JfUkwgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFJTUl9DRSAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUlNSX0ZBRSAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBSU1JfQ1JDICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFJTUl9WSURNICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIEJpdHMgaW4gdGhlIFJTUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFJTUl9SWE9LICAgICAgICAgICAweDgwMDAJLy8gcnggT0sKKyNkZWZpbmUgUlNSX1BGVCAgICAgICAgICAgIDB4NDAwMAkvLyBQZXJmZWN0IGZpbHRlcmluZyBhZGRyZXNzIG1hdGNoCisjZGVmaW5lIFJTUl9NQVIgICAgICAgICAgICAweDIwMDAJLy8gTUFDIGFjY2VwdCBtdWx0aWNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSX0JBUiAgICAgICAgICAgIDB4MTAwMAkvLyBNQUMgYWNjZXB0IGJyb2FkY2FzdCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1JfUEhZICAgICAgICAgICAgMHgwODAwCS8vIE1BQyBhY2NlcHQgcGh5c2ljYWwgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSX1ZUQUcgICAgICAgICAgIDB4MDQwMAkvLyA4MDIuMXAvMXEgdGFnZ2luZyBwYWNrZXQgaW5kaWNhdG9yCisjZGVmaW5lIFJTUl9TVFAgICAgICAgICAgICAweDAyMDAJLy8gc3RhcnQgb2YgcGFja2V0CisjZGVmaW5lIFJTUl9FRFAgICAgICAgICAgICAweDAxMDAJLy8gZW5kIG9mIHBhY2tldAorCisvKgorICogQml0cyBpbiB0aGUgUlNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlNSMV9SWE9LICAgICAgICAgICAweDgwCS8vIHJ4IE9LCisjZGVmaW5lIFJTUjFfUEZUICAgICAgICAgICAgMHg0MAkvLyBQZXJmZWN0IGZpbHRlcmluZyBhZGRyZXNzIG1hdGNoCisjZGVmaW5lIFJTUjFfTUFSICAgICAgICAgICAgMHgyMAkvLyBNQUMgYWNjZXB0IG11bHRpY2FzdCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1IxX0JBUiAgICAgICAgICAgIDB4MTAJLy8gTUFDIGFjY2VwdCBicm9hZGNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSMV9QSFkgICAgICAgICAgICAweDA4CS8vIE1BQyBhY2NlcHQgcGh5c2ljYWwgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSMV9WVEFHICAgICAgICAgICAweDA0CS8vIDgwMi4xcC8xcSB0YWdnaW5nIHBhY2tldCBpbmRpY2F0b3IKKyNkZWZpbmUgUlNSMV9TVFAgICAgICAgICAgICAweDAyCS8vIHN0YXJ0IG9mIHBhY2tldAorI2RlZmluZSBSU1IxX0VEUCAgICAgICAgICAgIDB4MDEJLy8gZW5kIG9mIHBhY2tldAorCisvKgorICogQml0cyBpbiB0aGUgQ1NNIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDU01fSVBPSyAgICAgICAgICAgIDB4NDAJLy9JUCBDaGVja3VzbSB2YWxpZGF0aWFvbiBvaworI2RlZmluZSBDU01fVFVQT0sgICAgICAgICAgIDB4MjAJLy9UQ1AvVURQIENoZWNrdXNtIHZhbGlkYXRpYW9uIG9rCisjZGVmaW5lIENTTV9GUkFHICAgICAgICAgICAgMHgxMAkvL0ZyYWdtZW50IElQIGRhdGFncmFtCisjZGVmaW5lIENTTV9JUEtUICAgICAgICAgICAgMHgwNAkvL1JlY2VpdmVkIGFuIElQIHBhY2tldAorI2RlZmluZSBDU01fVENQS1QgICAgICAgICAgIDB4MDIJLy9SZWNlaXZlZCBhIFRDUCBwYWNrZXQKKyNkZWZpbmUgQ1NNX1VEUEtUICAgICAgICAgICAweDAxCS8vUmVjZWl2ZWQgYSBVRFAgcGFja2V0CisKKy8qCisgKiBCaXRzIGluIHRoZSBUU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUU1IwX0FCVCAgICAgICAgICAgIDB4MDA4MAkvLyBUeCBhYm9ydCBiZWNhdXNlIG9mIGV4Y2Vzc2l2ZSBjb2xsaXNpb24KKyNkZWZpbmUgVFNSMF9PV1QgICAgICAgICAgICAweDAwNDAJLy8gSnVtYm8gZnJhbWUgVHggYWJvcnQKKyNkZWZpbmUgVFNSMF9PV0MgICAgICAgICAgICAweDAwMjAJLy8gT3V0IG9mIHdpbmRvdyBjb2xsaXNpb24KKyNkZWZpbmUgVFNSMF9DT0xTICAgICAgICAgICAweDAwMTAJLy8gZXhwZXJpZW5jZSBjb2xsaXNpb24gaW4gdGhpcyB0cmFuc21pdCBldmVudAorI2RlZmluZSBUU1IwX05DUjMgICAgICAgICAgIDB4MDAwOAkvLyBjb2xsaXNpb24gcmV0cnkgY291bnRlclszXQorI2RlZmluZSBUU1IwX05DUjIgICAgICAgICAgIDB4MDAwNAkvLyBjb2xsaXNpb24gcmV0cnkgY291bnRlclsyXQorI2RlZmluZSBUU1IwX05DUjEgICAgICAgICAgIDB4MDAwMgkvLyBjb2xsaXNpb24gcmV0cnkgY291bnRlclsxXQorI2RlZmluZSBUU1IwX05DUjAgICAgICAgICAgIDB4MDAwMQkvLyBjb2xsaXNpb24gcmV0cnkgY291bnRlclswXQorI2RlZmluZSBUU1IwX1RFUlIgICAgICAgICAgIDB4ODAwMAkvLworI2RlZmluZSBUU1IwX0ZEWCAgICAgICAgICAgIDB4NDAwMAkvLyBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHNlcnZpY2VkIGJ5IGZ1bGwgZHVwbGV4IG1vZGUKKyNkZWZpbmUgVFNSMF9HTUlJICAgICAgICAgICAweDIwMDAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBHTUlJIG1vZGUKKyNkZWZpbmUgVFNSMF9MTktGTCAgICAgICAgICAweDEwMDAJLy8gcGFja2V0IHNlcnZpY2VkIGR1cmluZyBsaW5rIGRvd24KKyNkZWZpbmUgVFNSMF9TSEROICAgICAgICAgICAweDA0MDAJLy8gc2h1dGRvd24gY2FzZQorI2RlZmluZSBUU1IwX0NSUyAgICAgICAgICAgIDB4MDIwMAkvLyBjYXJyaWVyIHNlbnNlIGxvc3QKKyNkZWZpbmUgVFNSMF9DREggICAgICAgICAgICAweDAxMDAJLy8gQVFFIHRlc3QgZmFpbCAoQ0QgaGVhcnRiZWF0KQorCisvKgorICogQml0cyBpbiB0aGUgVFNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVFNSMV9URVJSICAgICAgICAgICAweDgwCS8vCisjZGVmaW5lIFRTUjFfRkRYICAgICAgICAgICAgMHg0MAkvLyBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHNlcnZpY2VkIGJ5IGZ1bGwgZHVwbGV4IG1vZGUKKyNkZWZpbmUgVFNSMV9HTUlJICAgICAgICAgICAweDIwCS8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc2VydmljZWQgYnkgR01JSSBtb2RlCisjZGVmaW5lIFRTUjFfTE5LRkwgICAgICAgICAgMHgxMAkvLyBwYWNrZXQgc2VydmljZWQgZHVyaW5nIGxpbmsgZG93bgorI2RlZmluZSBUU1IxX1NIRE4gICAgICAgICAgIDB4MDQJLy8gc2h1dGRvd24gY2FzZQorI2RlZmluZSBUU1IxX0NSUyAgICAgICAgICAgIDB4MDIJLy8gY2FycmllciBzZW5zZSBsb3N0CisjZGVmaW5lIFRTUjFfQ0RIICAgICAgICAgICAgMHgwMQkvLyBBUUUgdGVzdCBmYWlsIChDRCBoZWFydGJlYXQpCisKKy8vCisvLyBCaXRzIGluIHRoZSBUQ1IwIHJlZ2lzdGVyCisvLworI2RlZmluZSBUQ1IwX1RJQyAgICAgICAgICAgIDB4ODAJLy8gYXNzZXJ0IGludGVycnVwdCBpbW1lZGlhdGVseSB3aGlsZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHNlbmQgY29tcGxldGUKKyNkZWZpbmUgVENSMF9QSUMgICAgICAgICAgICAweDQwCS8vIHByaW9yaXR5IGludGVycnVwdCByZXF1ZXN0LCBJTkEjIGlzIGlzc3VlZCBvdmVyIGFkYXB0aXZlIGludGVycnVwdCBzY2hlbWUKKyNkZWZpbmUgVENSMF9WRVRBRyAgICAgICAgICAweDIwCS8vIGVuYWJsZSBWTEFOIHRhZworI2RlZmluZSBUQ1IwX0lQQ0sgICAgICAgICAgIDB4MTAJLy8gcmVxdWVzdCBJUCAgY2hlY2tzdW0gY2FsY3VsYXRpb24uCisjZGVmaW5lIFRDUjBfVURQQ0sgICAgICAgICAgMHgwOAkvLyByZXF1ZXN0IFVEUCBjaGVja3N1bSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgVENSMF9UQ1BDSyAgICAgICAgICAweDA0CS8vIHJlcXVlc3QgVENQIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorI2RlZmluZSBUQ1IwX0pNQk8gICAgICAgICAgIDB4MDIJLy8gaW5kaWNhdGUgYSBqdW1ibyBwYWNrZXQgaW4gR01BQyBzaWRlCisjZGVmaW5lIFRDUjBfQ1JDICAgICAgICAgICAgMHgwMQkvLyBkaXNhYmxlIENSQyBnZW5lcmF0aW9uCisKKyNkZWZpbmUgVENQTFNfTk9STUFMICAgICAgICAzCisjZGVmaW5lIFRDUExTX1NUQVJUICAgICAgICAgMgorI2RlZmluZSBUQ1BMU19FTkQgICAgICAgICAgIDEKKyNkZWZpbmUgVENQTFNfTUVEICAgICAgICAgICAwCisKKworLy8gbWF4IHRyYW5zbWl0IG9yIHJlY2VpdmUgYnVmZmVyIHNpemUKKyNkZWZpbmUgQ0JfUlhfQlVGX1NJWkUgICAgIDIwNDhVTAkvLyBtYXggYnVmZmVyIHNpemUKKwkJCQkJLy8gTk9URTogbXVzdCBiZSBtdWx0aXBsZSBvZiA0CisKKyNkZWZpbmUgQ0JfTUFYX1JEX05VTSAgICAgICA1MTIJLy8gTUFYICMgb2YgUkQKKyNkZWZpbmUgQ0JfTUFYX1REX05VTSAgICAgICAyNTYJLy8gTUFYICMgb2YgVEQKKworI2RlZmluZSBDQl9JTklUX1JEX05VTV8zMTE5IDEyOAkvLyBpbml0ICMgb2YgUkQsIGZvciBzZXR1cCBWVDMxMTkKKyNkZWZpbmUgQ0JfSU5JVF9URF9OVU1fMzExOSA2NAkvLyBpbml0ICMgb2YgVEQsIGZvciBzZXR1cCBWVDMxMTkKKworI2RlZmluZSBDQl9JTklUX1JEX05VTSAgICAgIDEyOAkvLyBpbml0ICMgb2YgUkQsIGZvciBzZXR1cCBkZWZhdWx0CisjZGVmaW5lIENCX0lOSVRfVERfTlVNICAgICAgNjQJLy8gaW5pdCAjIG9mIFRELCBmb3Igc2V0dXAgZGVmYXVsdAorCisvLyBmb3IgMzExOQorI2RlZmluZSBDQl9URF9SSU5HX05VTSAgICAgIDQJLy8gIyBvZiBURCByaW5ncy4KKyNkZWZpbmUgQ0JfTUFYX1NFR19QRVJfUEtUICA3CS8vIG1heCBkYXRhIHNlZyBwZXIgcGFja2V0IChUeCkKKworCisvKgorICoJSWYgY29sbGlzaW9ucyBleGNlc3MgMTUgdGltZXMgLCB0eCB3aWxsIGFib3J0LCBhbmQKKyAqCWlmIHR4IGZpZm8gdW5kZXJmbG93LCB0eCB3aWxsIGZhaWwKKyAqCXdlIHNob3VsZCB0cnkgdG8gcmVzZW5kIGl0CisgKi8KKworI2RlZmluZSBDQl9NQVhfVFhfQUJPUlRfUkVUUlkgICAzCisKKy8qCisgKglSZWNlaXZlIGRlc2NyaXB0b3IKKyAqLworCitzdHJ1Y3QgcmRlc2MwIHsKKwl1MTYgUlNSOwkJLyogUmVjZWl2ZSBzdGF0dXMgKi8KKwl1MTYgbGVuOjE0OwkJLyogUmVjZWl2ZWQgcGFja2V0IGxlbmd0aCAqLworCXUxNiByZXNlcnZlZDoxOworCXUxNiBvd25lcjoxOwkJLyogV2hvIG93bnMgdGhpcyBidWZmZXIgPyAqLworfTsKKworc3RydWN0IHJkZXNjMSB7CisJdTE2IFBRVEFHOworCXU4IENTTTsKKwl1OCBJUEtUOworfTsKKworc3RydWN0IHJ4X2Rlc2MgeworCXN0cnVjdCByZGVzYzAgcmRlc2MwOworCXN0cnVjdCByZGVzYzEgcmRlc2MxOworCXUzMiBwYV9sb3c7CQkvKiBMb3cgMzIgYml0IFBDSSBhZGRyZXNzICovCisJdTE2IHBhX2hpZ2g7CQkvKiBOZXh0IDE2IGJpdCBQQ0kgYWRkcmVzcyAoNDggdG90YWwpICovCisJdTE2IGxlbjoxNTsJCS8qIEZyYW1lIHNpemUgKi8KKwl1MTYgaW50ZW46MTsJCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqCVRyYW5zbWl0IGRlc2NyaXB0b3IKKyAqLworCitzdHJ1Y3QgdGRlc2MwIHsKKwl1MTYgVFNSOwkJLyogVHJhbnNtaXQgc3RhdHVzIHJlZ2lzdGVyICovCisJdTE2IHBrdHNpemU6MTQ7CQkvKiBTaXplIG9mIGZyYW1lICovCisJdTE2IHJlc2VydmVkOjE7CisJdTE2IG93bmVyOjE7CQkvKiBXaG8gb3ducyB0aGUgYnVmZmVyICovCit9OworCitzdHJ1Y3QgcHFpbmYgewkJCS8qIFByaW9yaXR5IHF1ZXVlIGluZm8gKi8KKwl1MTYgVklEOjEyOworCXUxNiBDRkk6MTsKKwl1MTYgcHJpb3JpdHk6MzsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRkZXNjMSB7CisJc3RydWN0IHBxaW5mIHBxaW5mOworCXU4IFRDUjsKKwl1OCBUQ1BMUzoyOworCXU4IHJlc2VydmVkOjI7CisJdTggQ01EWjo0OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgdGRfYnVmIHsKKwl1MzIgcGFfbG93OworCXUxNiBwYV9oaWdoOworCXUxNiBidWZzaXplOjE0OwkKKwl1MTYgcmVzZXJ2ZWQ6MTsKKwl1MTYgcXVldWU6MTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHR4X2Rlc2MgeworCXN0cnVjdCB0ZGVzYzAgdGRlc2MwOworCXN0cnVjdCB0ZGVzYzEgdGRlc2MxOworCXN0cnVjdCB0ZF9idWYgdGRfYnVmWzddOworfTsKKworc3RydWN0IHZlbG9jaXR5X3JkX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBza2JfZG1hOworfTsKKworLyoqCisgKglhbGxvY19yZF9pbmZvCQktCWFsbG9jYXRlIGFuIHJkIGluZm8gYmxvY2sKKyAqCisgKglBbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgcmVjZWl2ZSBpbmZvIHN0cnVjdHVyZSB1c2VkIGZvciBrZWVwaW5nCisgKgl0cmFjayBvZiBrZXJuZWwgc2lkZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGVhY2ggcmVjZWl2ZQorICoJZGVzY3JpcHRvciB3ZSBhcmUgdXNpbmcKKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICphbGxvY19yZF9pbmZvKHZvaWQpCit7CisJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnB0cjsKKwlpZiAoKHB0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWVsc2UgeworCQltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X3JkX2luZm8pKTsKKwkJcmV0dXJuIHB0cjsKKwl9Cit9CisKKy8qCisgKglVc2VkIHRvIHRyYWNrIHRyYW5zbWl0IHNpZGUgYnVmZmVycy4KKyAqLworCitzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCAqYnVmOworCWludCBuc2tiX2RtYTsKKwlkbWFfYWRkcl90IHNrYl9kbWFbN107CisJZG1hX2FkZHJfdCBidWZfZG1hOworfTsKKworZW51bSAgdmVsb2NpdHlfb3duZXIgeworCU9XTkVEX0JZX0hPU1QgPSAwLAorCU9XTkVEX0JZX05JQyA9IDEKK307CisKKworLyoKKyAqCU1BQyByZWdpc3RlcnMgYW5kIG1hY3Jvcy4KKyAqLworCisKKyNkZWZpbmUgTUNBTV9TSVpFICAgICAgICAgICA2NAorI2RlZmluZSBWQ0FNX1NJWkUgICAgICAgICAgIDY0CisjZGVmaW5lIFRYX1FVRVVFX05PICAgICAgICAgNAorCisjZGVmaW5lIE1BWF9IV19NSUJfQ09VTlRFUiAgMzIKKyNkZWZpbmUgVkVMT0NJVFlfTUlOX01UVSAgICAoMTUxNC0xNCkKKyNkZWZpbmUgVkVMT0NJVFlfTUFYX01UVSAgICAoOTAwMCkKKworLyoKKyAqCVJlZ2lzdGVycyBpbiB0aGUgTUFDCisgKi8KKworI2RlZmluZSBNQUNfUkVHX1BBUiAgICAgICAgIDB4MDAJLy8gcGh5c2ljYWwgYWRkcmVzcworI2RlZmluZSBNQUNfUkVHX1JDUiAgICAgICAgIDB4MDYKKyNkZWZpbmUgTUFDX1JFR19UQ1IgICAgICAgICAweDA3CisjZGVmaW5lIE1BQ19SRUdfQ1IwX1NFVCAgICAgMHgwOAorI2RlZmluZSBNQUNfUkVHX0NSMV9TRVQgICAgIDB4MDkKKyNkZWZpbmUgTUFDX1JFR19DUjJfU0VUICAgICAweDBBCisjZGVmaW5lIE1BQ19SRUdfQ1IzX1NFVCAgICAgMHgwQgorI2RlZmluZSBNQUNfUkVHX0NSMF9DTFIgICAgIDB4MEMKKyNkZWZpbmUgTUFDX1JFR19DUjFfQ0xSICAgICAweDBECisjZGVmaW5lIE1BQ19SRUdfQ1IyX0NMUiAgICAgMHgwRQorI2RlZmluZSBNQUNfUkVHX0NSM19DTFIgICAgIDB4MEYKKyNkZWZpbmUgTUFDX1JFR19NQVIgICAgICAgICAweDEwCisjZGVmaW5lIE1BQ19SRUdfQ0FNICAgICAgICAgMHgxMAorI2RlZmluZSBNQUNfUkVHX0RFQ19CQVNFX0hJIDB4MTgKKyNkZWZpbmUgTUFDX1JFR19EQkZfQkFTRV9ISSAweDFDCisjZGVmaW5lIE1BQ19SRUdfSVNSX0NUTCAgICAgMHgyMAorI2RlZmluZSBNQUNfUkVHX0lTUl9IT1RNUiAgIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfVFNVUFRIUiAweDIwCisjZGVmaW5lIE1BQ19SRUdfSVNSX1JTVVBUSFIgMHgyMAorI2RlZmluZSBNQUNfUkVHX0lTUl9DVEwxICAgIDB4MjEKKyNkZWZpbmUgTUFDX1JFR19UWEVfU1IgICAgICAweDIyCisjZGVmaW5lIE1BQ19SRUdfUlhFX1NSICAgICAgMHgyMworI2RlZmluZSBNQUNfUkVHX0lTUiAgICAgICAgIDB4MjQKKyNkZWZpbmUgTUFDX1JFR19JU1IwICAgICAgICAweDI0CisjZGVmaW5lIE1BQ19SRUdfSVNSMSAgICAgICAgMHgyNQorI2RlZmluZSBNQUNfUkVHX0lTUjIgICAgICAgIDB4MjYKKyNkZWZpbmUgTUFDX1JFR19JU1IzICAgICAgICAweDI3CisjZGVmaW5lIE1BQ19SRUdfSU1SICAgICAgICAgMHgyOAorI2RlZmluZSBNQUNfUkVHX0lNUjAgICAgICAgIDB4MjgKKyNkZWZpbmUgTUFDX1JFR19JTVIxICAgICAgICAweDI5CisjZGVmaW5lIE1BQ19SRUdfSU1SMiAgICAgICAgMHgyQQorI2RlZmluZSBNQUNfUkVHX0lNUjMgICAgICAgIDB4MkIKKyNkZWZpbmUgTUFDX1JFR19URENTUl9TRVQgICAweDMwCisjZGVmaW5lIE1BQ19SRUdfUkRDU1JfU0VUICAgMHgzMgorI2RlZmluZSBNQUNfUkVHX1REQ1NSX0NMUiAgIDB4MzQKKyNkZWZpbmUgTUFDX1JFR19SRENTUl9DTFIgICAweDM2CisjZGVmaW5lIE1BQ19SRUdfUkRCQVNFX0xPICAgMHgzOAorI2RlZmluZSBNQUNfUkVHX1JESU5EWCAgICAgIDB4M0MKKyNkZWZpbmUgTUFDX1JFR19UREJBU0VfTE8gICAweDQwCisjZGVmaW5lIE1BQ19SRUdfUkRDU0laRSAgICAgMHg1MAorI2RlZmluZSBNQUNfUkVHX1REQ1NJWkUgICAgIDB4NTIKKyNkZWZpbmUgTUFDX1JFR19URElORFggICAgICAweDU0CisjZGVmaW5lIE1BQ19SRUdfVERJRFgwICAgICAgMHg1NAorI2RlZmluZSBNQUNfUkVHX1RESURYMSAgICAgIDB4NTYKKyNkZWZpbmUgTUFDX1JFR19URElEWDIgICAgICAweDU4CisjZGVmaW5lIE1BQ19SRUdfVERJRFgzICAgICAgMHg1QQorI2RlZmluZSBNQUNfUkVHX1BBVVNFX1RJTUVSIDB4NUMKKyNkZWZpbmUgTUFDX1JFR19SQlJEVSAgICAgICAweDVFCisjZGVmaW5lIE1BQ19SRUdfRklGT19URVNUMCAgMHg2MAorI2RlZmluZSBNQUNfUkVHX0ZJRk9fVEVTVDEgIDB4NjQKKyNkZWZpbmUgTUFDX1JFR19DQU1BRERSICAgICAweDY4CisjZGVmaW5lIE1BQ19SRUdfQ0FNQ1IgICAgICAgMHg2OQorI2RlZmluZSBNQUNfUkVHX0dGVEVTVCAgICAgIDB4NkEKKyNkZWZpbmUgTUFDX1JFR19GVFNUQ01EICAgICAweDZCCisjZGVmaW5lIE1BQ19SRUdfTUlJQ0ZHICAgICAgMHg2QworI2RlZmluZSBNQUNfUkVHX01JSVNSICAgICAgIDB4NkQKKyNkZWZpbmUgTUFDX1JFR19QSFlTUjAgICAgICAweDZFCisjZGVmaW5lIE1BQ19SRUdfUEhZU1IxICAgICAgMHg2RgorI2RlZmluZSBNQUNfUkVHX01JSUNSICAgICAgIDB4NzAKKyNkZWZpbmUgTUFDX1JFR19NSUlBRFIgICAgICAweDcxCisjZGVmaW5lIE1BQ19SRUdfTUlJREFUQSAgICAgMHg3MgorI2RlZmluZSBNQUNfUkVHX1NPRlRfVElNRVIwIDB4NzQKKyNkZWZpbmUgTUFDX1JFR19TT0ZUX1RJTUVSMSAweDc2CisjZGVmaW5lIE1BQ19SRUdfQ0ZHQSAgICAgICAgMHg3OAorI2RlZmluZSBNQUNfUkVHX0NGR0IgICAgICAgIDB4NzkKKyNkZWZpbmUgTUFDX1JFR19DRkdDICAgICAgICAweDdBCisjZGVmaW5lIE1BQ19SRUdfQ0ZHRCAgICAgICAgMHg3QgorI2RlZmluZSBNQUNfUkVHX0RDRkcwICAgICAgIDB4N0MKKyNkZWZpbmUgTUFDX1JFR19EQ0ZHMSAgICAgICAweDdECisjZGVmaW5lIE1BQ19SRUdfTUNGRzAgICAgICAgMHg3RQorI2RlZmluZSBNQUNfUkVHX01DRkcxICAgICAgIDB4N0YKKworI2RlZmluZSBNQUNfUkVHX1RCSVNUICAgICAgIDB4ODAKKyNkZWZpbmUgTUFDX1JFR19SQklTVCAgICAgICAweDgxCisjZGVmaW5lIE1BQ19SRUdfUE1DQyAgICAgICAgMHg4MgorI2RlZmluZSBNQUNfUkVHX1NUSUNLSFcgICAgIDB4ODMKKyNkZWZpbmUgTUFDX1JFR19NSUJDUiAgICAgICAweDg0CisjZGVmaW5lIE1BQ19SRUdfRUVSU1YgICAgICAgMHg4NQorI2RlZmluZSBNQUNfUkVHX1JFVklEICAgICAgIDB4ODYKKyNkZWZpbmUgTUFDX1JFR19NSUJSRUFEICAgICAweDg4CisjZGVmaW5lIE1BQ19SRUdfQlBNQSAgICAgICAgMHg4QworI2RlZmluZSBNQUNfUkVHX0VFV1JfREFUQSAgIDB4OEMKKyNkZWZpbmUgTUFDX1JFR19CUE1EX1dSICAgICAweDhGCisjZGVmaW5lIE1BQ19SRUdfQlBDTUQgICAgICAgMHg5MAorI2RlZmluZSBNQUNfUkVHX0JQTURfUkQgICAgIDB4OTEKKyNkZWZpbmUgTUFDX1JFR19FRUNIS1NVTSAgICAweDkyCisjZGVmaW5lIE1BQ19SRUdfRUVDU1IgICAgICAgMHg5MworI2RlZmluZSBNQUNfUkVHX0VFUkRfREFUQSAgIDB4OTQKKyNkZWZpbmUgTUFDX1JFR19FQUREUiAgICAgICAweDk2CisjZGVmaW5lIE1BQ19SRUdfRU1CQ01EICAgICAgMHg5NworI2RlZmluZSBNQUNfUkVHX0pNUFNSMCAgICAgIDB4OTgKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjEgICAgICAweDk5CisjZGVmaW5lIE1BQ19SRUdfSk1QU1IyICAgICAgMHg5QQorI2RlZmluZSBNQUNfUkVHX0pNUFNSMyAgICAgIDB4OUIKKyNkZWZpbmUgTUFDX1JFR19DSElQR1NSICAgICAweDlDCisjZGVmaW5lIE1BQ19SRUdfVEVTVENGRyAgICAgMHg5RAorI2RlZmluZSBNQUNfUkVHX0RFQlVHICAgICAgIDB4OUUKKyNkZWZpbmUgTUFDX1JFR19DSElQR0NSICAgICAweDlGCisjZGVmaW5lIE1BQ19SRUdfV09MQ1IwX1NFVCAgMHhBMAorI2RlZmluZSBNQUNfUkVHX1dPTENSMV9TRVQgIDB4QTEKKyNkZWZpbmUgTUFDX1JFR19QV0NGR19TRVQgICAweEEyCisjZGVmaW5lIE1BQ19SRUdfV09MQ0ZHX1NFVCAgMHhBMworI2RlZmluZSBNQUNfUkVHX1dPTENSMF9DTFIgIDB4QTQKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjFfQ0xSICAweEE1CisjZGVmaW5lIE1BQ19SRUdfUFdDRkdfQ0xSICAgMHhBNgorI2RlZmluZSBNQUNfUkVHX1dPTENGR19DTFIgIDB4QTcKKyNkZWZpbmUgTUFDX1JFR19XT0xTUjBfU0VUICAweEE4CisjZGVmaW5lIE1BQ19SRUdfV09MU1IxX1NFVCAgMHhBOQorI2RlZmluZSBNQUNfUkVHX1dPTFNSMF9DTFIgIDB4QUMKKyNkZWZpbmUgTUFDX1JFR19XT0xTUjFfQ0xSICAweEFECisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDMCAgMHhCMAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzEgIDB4QjIKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkMyICAweEI0CisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDMyAgMHhCNgorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzQgIDB4QjgKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM1ICAweEJBCisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDNiAgMHhCQworI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzcgIDB4QkUKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMF8wICAweEMwCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMSAgMHhDNAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0swXzIgIDB4QzgKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMF8zICAweENDCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzFfMCAgMHhEMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzEgIDB4RDQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMV8yICAweEQ4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzFfMyAgMHhEQworI2RlZmluZSBNQUNfUkVHX0JZVEVNU0syXzAgIDB4RTAKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8xICAweEU0CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzJfMiAgMHhFOAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0syXzMgIDB4RUMKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLM18wICAweEYwCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMSAgMHhGNAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0szXzIgIDB4RjgKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLM18zICAweEZDCisKKy8qCisgKglCaXRzIGluIHRoZSBSQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFJDUl9BUyAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBSQ1JfQVAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgUkNSX0FMICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFJDUl9QUk9NICAgICAgICAgICAgMHgxMAorI2RlZmluZSBSQ1JfQUIgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgUkNSX0FNICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFJDUl9BUiAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSQ1JfU0VQICAgICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFRDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVENSX1RCMkJESVMgICAgICAgICAweDgwCisjZGVmaW5lIFRDUl9DT0xUTUMxICAgICAgICAgMHgwOAorI2RlZmluZSBUQ1JfQ09MVE1DMCAgICAgICAgIDB4MDQKKyNkZWZpbmUgVENSX0xCMSAgICAgICAgICAgICAweDAyCS8qIGxvb3BiYWNrWzFdICovCisjZGVmaW5lIFRDUl9MQjAgICAgICAgICAgICAgMHgwMQkvKiBsb29wYmFja1swXSAqLworCisvKgorICoJQml0cyBpbiB0aGUgQ1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjBfVFhPTiAgICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSBDUjBfUlhPTiAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSBDUjBfU1RPUCAgICAgICAgICAgIDB4MDAwMDAwMDJVTAkvKiBzdG9wIE1BQywgZGVmYXVsdCA9IDEgKi8KKyNkZWZpbmUgQ1IwX1NUUlQgICAgICAgICAgICAweDAwMDAwMDAxVUwJLyogc3RhcnQgTUFDICovCisjZGVmaW5lIENSMF9TRlJTVCAgICAgICAgICAgMHgwMDAwODAwMFVMCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIENSMF9UTTFFTiAgICAgICAgICAgMHgwMDAwNDAwMFVMCisjZGVmaW5lIENSMF9UTTBFTiAgICAgICAgICAgMHgwMDAwMjAwMFVMCisjZGVmaW5lIENSMF9EUE9MTCAgICAgICAgICAgMHgwMDAwMDgwMFVMCS8qIGRpc2FibGUgcngvdHggYXV0byBwb2xsaW5nICovCisjZGVmaW5lIENSMF9ESVNBVSAgICAgICAgICAgMHgwMDAwMDEwMFVMCisjZGVmaW5lIENSMF9YT05FTiAgICAgICAgICAgMHgwMDgwMDAwMFVMCisjZGVmaW5lIENSMF9GRFhURkNFTiAgICAgICAgMHgwMDQwMDAwMFVMCS8qIGZ1bGwtZHVwbGV4IFRYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IwX0ZEWFJGQ0VOICAgICAgICAweDAwMjAwMDAwVUwJLyogZnVsbC1kdXBsZXggUlggZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBDUjBfSERYRkNFTiAgICAgICAgIDB4MDAxMDAwMDBVTAkvKiBoYWxmLWR1cGxleCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMF9YSElUSDEgICAgICAgICAgMHgwMDA4MDAwMFVMCS8qIFRYIFhPTiBoaWdoIHRocmVzaG9sZCAxICovCisjZGVmaW5lIENSMF9YSElUSDAgICAgICAgICAgMHgwMDA0MDAwMFVMCS8qIFRYIFhPTiBoaWdoIHRocmVzaG9sZCAwICovCisjZGVmaW5lIENSMF9YTFRIMSAgICAgICAgICAgMHgwMDAyMDAwMFVMCS8qIFRYIHBhdXNlIGZyYW1lIGxvdyB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjBfWExUSDAgICAgICAgICAgIDB4MDAwMTAwMDBVTAkvKiBUWCBwYXVzZSBmcmFtZSBsb3cgdGhyZXNob2xkIDAgKi8KKyNkZWZpbmUgQ1IwX0dTUFJTVCAgICAgICAgICAweDgwMDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0ZPUlNSU1QgICAgICAgICAweDQwMDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0ZQSFlSU1QgICAgICAgICAweDIwMDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0RJQUcgICAgICAgICAgICAweDEwMDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0lOVFBDVEwgICAgICAgICAweDA0MDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0dJTlRNU0sxICAgICAgICAweDAyMDAwMDAwVUwKKyNkZWZpbmUgQ1IwX0dJTlRNU0swICAgICAgICAweDAxMDAwMDAwVUwKKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IxX1NGUlNUICAgICAgICAgICAweDgwCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIENSMV9UTTFFTiAgICAgICAgICAgMHg0MAorI2RlZmluZSBDUjFfVE0wRU4gICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ1IxX0RQT0xMICAgICAgICAgICAweDA4CS8qIGRpc2FibGUgcngvdHggYXV0byBwb2xsaW5nICovCisjZGVmaW5lIENSMV9ESVNBVSAgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ1IyIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjJfWE9ORU4gICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ1IyX0ZEWFRGQ0VOICAgICAgICAweDQwCS8qIGZ1bGwtZHVwbGV4IFRYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IyX0ZEWFJGQ0VOICAgICAgICAweDIwCS8qIGZ1bGwtZHVwbGV4IFJYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IyX0hEWEZDRU4gICAgICAgICAweDEwCS8qIGhhbGYtZHVwbGV4IGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IyX1hISVRIMSAgICAgICAgICAweDA4CS8qIFRYIFhPTiBoaWdoIHRocmVzaG9sZCAxICovCisjZGVmaW5lIENSMl9YSElUSDAgICAgICAgICAgMHgwNAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBDUjJfWExUSDEgICAgICAgICAgIDB4MDIJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAxICovCisjZGVmaW5lIENSMl9YTFRIMCAgICAgICAgICAgMHgwMQkvKiBUWCBwYXVzZSBmcmFtZSBsb3cgdGhyZXNob2xkIDAgKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IzX0dTUFJTVCAgICAgICAgICAweDgwCisjZGVmaW5lIENSM19GT1JTUlNUICAgICAgICAgMHg0MAorI2RlZmluZSBDUjNfRlBIWVJTVCAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ1IzX0RJQUcgICAgICAgICAgICAweDEwCisjZGVmaW5lIENSM19JTlRQQ1RMICAgICAgICAgMHgwNAorI2RlZmluZSBDUjNfR0lOVE1TSzEgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1IzX0dJTlRNU0swICAgICAgICAweDAxCisKKyNkZWZpbmUgSVNSQ1RMX1VEUElOVCAgICAgICAweDgwMDAKKyNkZWZpbmUgSVNSQ1RMX1RTVVBESVMgICAgICAweDQwMDAKKyNkZWZpbmUgSVNSQ1RMX1JTVVBESVMgICAgICAweDIwMDAKKyNkZWZpbmUgSVNSQ1RMX1BNU0sxICAgICAgICAweDEwMDAKKyNkZWZpbmUgSVNSQ1RMX1BNU0swICAgICAgICAweDA4MDAKKyNkZWZpbmUgSVNSQ1RMX0lOVFBEICAgICAgICAweDA0MDAKKyNkZWZpbmUgSVNSQ1RMX0hDUkxEICAgICAgICAweDAyMDAKKyNkZWZpbmUgSVNSQ1RMX1NDUkxEICAgICAgICAweDAxMDAKKworLyoKKyAqCUJpdHMgaW4gdGhlIElTUl9DVEwxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJU1JDVEwxX1VEUElOVCAgICAgIDB4ODAKKyNkZWZpbmUgSVNSQ1RMMV9UU1VQRElTICAgICAweDQwCisjZGVmaW5lIElTUkNUTDFfUlNVUERJUyAgICAgMHgyMAorI2RlZmluZSBJU1JDVEwxX1BNU0sxICAgICAgIDB4MTAKKyNkZWZpbmUgSVNSQ1RMMV9QTVNLMCAgICAgICAweDA4CisjZGVmaW5lIElTUkNUTDFfSU5UUEQgICAgICAgMHgwNAorI2RlZmluZSBJU1JDVEwxX0hDUkxEICAgICAgIDB4MDIKKyNkZWZpbmUgSVNSQ1RMMV9TQ1JMRCAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBUWEVfU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRYRVNSX1RGREJTICAgICAgICAgMHgwOAorI2RlZmluZSBUWEVTUl9URFdCUyAgICAgICAgIDB4MDQKKyNkZWZpbmUgVFhFU1JfVERSQlMgICAgICAgICAweDAyCisjZGVmaW5lIFRYRVNSX1REU1RSICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgUlhFX1NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSWEVTUl9SRkRCUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgUlhFU1JfUkRXQlMgICAgICAgICAweDA0CisjZGVmaW5lIFJYRVNSX1JEUkJTICAgICAgICAgMHgwMgorI2RlZmluZSBSWEVTUl9SRFNUUiAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIElTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSX0lTUjMgICAgICAgICAgICAweDgwMDAwMDAwVUwKKyNkZWZpbmUgSVNSX0lTUjIgICAgICAgICAgICAweDQwMDAwMDAwVUwKKyNkZWZpbmUgSVNSX0lTUjEgICAgICAgICAgICAweDIwMDAwMDAwVUwKKyNkZWZpbmUgSVNSX0lTUjAgICAgICAgICAgICAweDEwMDAwMDAwVUwKKyNkZWZpbmUgSVNSX1RYU1RMSSAgICAgICAgICAweDAyMDAwMDAwVUwKKyNkZWZpbmUgSVNSX1JYU1RMSSAgICAgICAgICAweDAxMDAwMDAwVUwKKyNkZWZpbmUgSVNSX0hGTEQgICAgICAgICAgICAweDAwODAwMDAwVUwKKyNkZWZpbmUgSVNSX1VEUEkgICAgICAgICAgICAweDAwNDAwMDAwVUwKKyNkZWZpbmUgSVNSX01JQkZJICAgICAgICAgICAweDAwMjAwMDAwVUwKKyNkZWZpbmUgSVNSX1NIRE5JICAgICAgICAgICAweDAwMTAwMDAwVUwKKyNkZWZpbmUgSVNSX1BIWUkgICAgICAgICAgICAweDAwMDgwMDAwVUwKKyNkZWZpbmUgSVNSX1BXRUkgICAgICAgICAgICAweDAwMDQwMDAwVUwKKyNkZWZpbmUgSVNSX1RNUjFJICAgICAgICAgICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgSVNSX1RNUjBJICAgICAgICAgICAweDAwMDEwMDAwVUwKKyNkZWZpbmUgSVNSX1NSQ0kgICAgICAgICAgICAweDAwMDA4MDAwVUwKKyNkZWZpbmUgSVNSX0xTVFBFSSAgICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgSVNSX0xTVEVJICAgICAgICAgICAweDAwMDAyMDAwVUwKKyNkZWZpbmUgSVNSX09WRkkgICAgICAgICAgICAweDAwMDAxMDAwVUwKKyNkZWZpbmUgSVNSX0ZMT05JICAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgSVNSX1JBQ0VJICAgICAgICAgICAweDAwMDAwNDAwVUwKKyNkZWZpbmUgSVNSX1RYV0IxSSAgICAgICAgICAweDAwMDAwMjAwVUwKKyNkZWZpbmUgSVNSX1RYV0IwSSAgICAgICAgICAweDAwMDAwMTAwVUwKKyNkZWZpbmUgSVNSX1BUWDNJICAgICAgICAgICAweDAwMDAwMDgwVUwKKyNkZWZpbmUgSVNSX1BUWDJJICAgICAgICAgICAweDAwMDAwMDQwVUwKKyNkZWZpbmUgSVNSX1BUWDFJICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgSVNSX1BUWDBJICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgSVNSX1BUWEkgICAgICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgSVNSX1BSWEkgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgSVNSX1BQVFhJICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgSVNSX1BQUlhJICAgICAgICAgICAweDAwMDAwMDAxVUwKKworLyoKKyAqCUJpdHMgaW4gdGhlIElNUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSU1SX1RYU1RMTSAgICAgICAgICAweDAyMDAwMDAwVUwKKyNkZWZpbmUgSU1SX1VEUElNICAgICAgICAgICAweDAwNDAwMDAwVUwKKyNkZWZpbmUgSU1SX01JQkZJTSAgICAgICAgICAweDAwMjAwMDAwVUwKKyNkZWZpbmUgSU1SX1NIRE5JTSAgICAgICAgICAweDAwMTAwMDAwVUwKKyNkZWZpbmUgSU1SX1BIWUlNICAgICAgICAgICAweDAwMDgwMDAwVUwKKyNkZWZpbmUgSU1SX1BXRUlNICAgICAgICAgICAweDAwMDQwMDAwVUwKKyNkZWZpbmUgSU1SX1RNUjFJTSAgICAgICAgICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgSU1SX1RNUjBJTSAgICAgICAgICAweDAwMDEwMDAwVUwKKworI2RlZmluZSBJTVJfU1JDSU0gICAgICAgICAgIDB4MDAwMDgwMDBVTAorI2RlZmluZSBJTVJfTFNUUEVJTSAgICAgICAgIDB4MDAwMDQwMDBVTAorI2RlZmluZSBJTVJfTFNURUlNICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBJTVJfT1ZGSU0gICAgICAgICAgIDB4MDAwMDEwMDBVTAorI2RlZmluZSBJTVJfRkxPTklNICAgICAgICAgIDB4MDAwMDA4MDBVTAorI2RlZmluZSBJTVJfUkFDRUlNICAgICAgICAgIDB4MDAwMDA0MDBVTAorI2RlZmluZSBJTVJfVFhXQjFJTSAgICAgICAgIDB4MDAwMDAyMDBVTAorI2RlZmluZSBJTVJfVFhXQjBJTSAgICAgICAgIDB4MDAwMDAxMDBVTAorCisjZGVmaW5lIElNUl9QVFgzSU0gICAgICAgICAgMHgwMDAwMDA4MFVMCisjZGVmaW5lIElNUl9QVFgySU0gICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIElNUl9QVFgxSU0gICAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lIElNUl9QVFgwSU0gICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lIElNUl9QVFhJTSAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIElNUl9QUlhJTSAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lIElNUl9QUFRYSU0gICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lIElNUl9QUFJYSU0gICAgICAgICAgMHgwMDAwMDAwMVVMCisKKy8qIDB4MDAxM0ZCMEZVTCAgPSAgaW5pdGlhbCB2YWx1ZSBvZiBJTVIgKi8KKworI2RlZmluZSBJTlRfTUFTS19ERUYgICAgICAgIChJTVJfUFBUWElNfElNUl9QUFJYSU18SU1SX1BUWElNfElNUl9QUlhJTXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1SX1BXRUlNfElNUl9UWFdCMElNfElNUl9UWFdCMUlNfElNUl9GTE9OSU18XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUl9PVkZJTXxJTVJfTFNURUlNfElNUl9MU1RQRUlNfElNUl9TUkNJTXxJTVJfTUlCRklNfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVJfU0hETklNfElNUl9UTVIxSU18SU1SX1RNUjBJTXxJTVJfVFhTVExNKQorCisvKgorICoJQml0cyBpbiB0aGUgVERDU1IwLzEsIFJEQ1NSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVFJEQ1NSX0RFQUQgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVFJEQ1NSX1dBSyAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFJEQ1NSX0FDVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFJEQ1NSX1JVTgkgICAgMHgwMDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDQU1BRERSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDQU1BRERSX0NBTUVOICAgICAgIDB4ODAKKyNkZWZpbmUgQ0FNQUREUl9WQ0FNU0wgICAgICAweDQwCisKKy8qCisgKglCaXRzIGluIHRoZSBDQU1DUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0FNQ1JfUFMxICAgICAgICAgICAweDgwCisjZGVmaW5lIENBTUNSX1BTMCAgICAgICAgICAgMHg0MAorI2RlZmluZSBDQU1DUl9BSVRSUEtUICAgICAgIDB4MjAKKyNkZWZpbmUgQ0FNQ1JfQUlUUjE2ICAgICAgICAweDEwCisjZGVmaW5lIENBTUNSX0NBTVJEICAgICAgICAgMHgwOAorI2RlZmluZSBDQU1DUl9DQU1XUiAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0FNQ1JfUFNfQ0FNX01BU0sgICAweDQwCisjZGVmaW5lIENBTUNSX1BTX0NBTV9EQVRBICAgMHg4MAorI2RlZmluZSBDQU1DUl9QU19NQVIgICAgICAgIDB4MDAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSUNGRyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ0ZHX01QTzEgICAgICAgICAweDgwCisjZGVmaW5lIE1JSUNGR19NUE8wICAgICAgICAgMHg0MAorI2RlZmluZSBNSUlDRkdfTUZEQyAgICAgICAgIDB4MjAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSVNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlTUl9NSURMRSAgICAgICAgIDB4ODAKKworLyoKKyAqCSBCaXRzIGluIHRoZSBQSFlTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFBIWVNSMF9QSFlSU1QgICAgICAgMHg4MAorI2RlZmluZSBQSFlTUjBfTElOS0dEICAgICAgIDB4NDAKKyNkZWZpbmUgUEhZU1IwX0ZEUFggICAgICAgICAweDEwCisjZGVmaW5lIFBIWVNSMF9TUERHICAgICAgICAgMHgwOAorI2RlZmluZSBQSFlTUjBfU1BEMTAgICAgICAgIDB4MDQKKyNkZWZpbmUgUEhZU1IwX1JYRkxDICAgICAgICAweDAyCisjZGVmaW5lIFBIWVNSMF9UWEZMQyAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgUEhZU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBQSFlTUjFfUEhZVEJJICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSUNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlDUl9NQVVUTyAgICAgICAgIDB4ODAKKyNkZWZpbmUgTUlJQ1JfUkNNRCAgICAgICAgICAweDQwCisjZGVmaW5lIE1JSUNSX1dDTUQgICAgICAgICAgMHgyMAorI2RlZmluZSBNSUlDUl9NRFBNICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUlJQ1JfTU9VVCAgICAgICAgICAweDA4CisjZGVmaW5lIE1JSUNSX01ETyAgICAgICAgICAgMHgwNAorI2RlZmluZSBNSUlDUl9NREkgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUlJQ1JfTURDICAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlBRFIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1JSUFEUl9TV01QTCAgICAgICAgMHg4MAorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQV9QTUhDVEcgICAgICAgICAweDA4CisjZGVmaW5lIENGR0FfR1BJTzFQRCAgICAgICAgMHgwNAorI2RlZmluZSBDRkdBX0FCU0hETiAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0ZHQV9QQUNQSSAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDRkdCIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdCX0dUQ0tPUFQgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHQl9NSUlPUFQgICAgICAgICAweDQwCisjZGVmaW5lIENGR0JfQ1JTRU9QVCAgICAgICAgMHgyMAorI2RlZmluZSBDRkdCX09GU0VUICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHQl9DUkFORE9NICAgICAgICAweDA4CisjZGVmaW5lIENGR0JfQ0FQICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDRkdCX01CQSAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0ZHQl9CQUtPUFQgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDRkdDIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdDX0VFTE9BRCAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHQ19CUk9QVCAgICAgICAgICAweDQwCisjZGVmaW5lIENGR0NfRExZRU4gICAgICAgICAgMHgyMAorI2RlZmluZSBDRkdDX0RUU0VMICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHQ19CVFNFTCAgICAgICAgICAweDA4CisjZGVmaW5lIENGR0NfQlBTMiAgICAgICAgICAgMHgwNAkvKiBib290cm9tIHNlbGVjdFsyXSAqLworI2RlZmluZSBDRkdDX0JQUzEgICAgICAgICAgIDB4MDIJLyogYm9vdHJvbSBzZWxlY3RbMV0gKi8KKyNkZWZpbmUgQ0ZHQ19CUFMwICAgICAgICAgICAweDAxCS8qIGJvb3Ryb20gc2VsZWN0WzBdICovCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdEIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdEX0lPRElTICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHRF9NU0xWREFDRU4gICAgICAweDQwCisjZGVmaW5lIENGR0RfQ0ZHREFDRU4gICAgICAgMHgyMAorI2RlZmluZSBDRkdEX1BDSTY0RU4gICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHRF9IVE1STDQgICAgICAgICAweDA4CisKKy8qCisgKglCaXRzIGluIHRoZSBEQ0ZHMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRENGR19YTVdJICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgRENGR19YTVJNICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRENGR19YTVJMICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRENGR19QRVJESVMgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRENGR19NUldBSVQgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRENGR19NV1dBSVQgICAgICAgICAweDAyMDAKKyNkZWZpbmUgRENGR19MQVRNRU4gICAgICAgICAweDAxMDAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1DRkcwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNQ0ZHX1JYQVJCICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBNQ0ZHX1JGVDEgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNQ0ZHX1JGVDAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNQ0ZHX0xPV1RIT1BUICAgICAgIDB4MDAwOAorI2RlZmluZSBNQ0ZHX1BRRU4gICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNQ0ZHX1JUR09QVCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNQ0ZHX1ZJREZSICAgICAgICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiB0aGUgTUNGRzEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1DRkdfVFhBUkIgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIE1DRkdfVFhRQksxICAgICAgICAgMHgwODAwCisjZGVmaW5lIE1DRkdfVFhRQkswICAgICAgICAgMHgwNDAwCisjZGVmaW5lIE1DRkdfVFhRTk9CSyAgICAgICAgMHgwMjAwCisjZGVmaW5lIE1DRkdfU05BUE9QVCAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBQTUNDICByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUE1DQ19EU0kgICAgICAgICAgICAweDgwCisjZGVmaW5lIFBNQ0NfRDJfRElTICAgICAgICAgMHg0MAorI2RlZmluZSBQTUNDX0QxX0RJUyAgICAgICAgIDB4MjAKKyNkZWZpbmUgUE1DQ19EM0NfRU4gICAgICAgICAweDEwCisjZGVmaW5lIFBNQ0NfRDNIX0VOICAgICAgICAgMHgwOAorI2RlZmluZSBQTUNDX0QyX0VOICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUE1DQ19EMV9FTiAgICAgICAgICAweDAyCisjZGVmaW5lIFBNQ0NfRDBfRU4gICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiBTVElDS0hXCisgKi8KKworI2RlZmluZSBTVElDS0hXX1NXUFRBRyAgICAgIDB4MTAKKyNkZWZpbmUgU1RJQ0tIV19XT0xTUiAgICAgICAweDA4CisjZGVmaW5lIFNUSUNLSFdfV09MRU4gICAgICAgMHgwNAorI2RlZmluZSBTVElDS0hXX0RTMSAgICAgICAgIDB4MDIJLyogUi9XIGJ5IHNvZnR3YXJlL2NmZyBjeWNsZSAqLworI2RlZmluZSBTVElDS0hXX0RTMCAgICAgICAgIDB4MDEJLyogc3VzcGVuZCB3ZWxsIERTIHdyaXRlIHBvcnQgKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JQkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUJDUl9NSUJJU1RPSyAgICAgIDB4ODAKKyNkZWZpbmUgTUlCQ1JfTUlCSVNUR08gICAgICAweDQwCisjZGVmaW5lIE1JQkNSX01JQklOQyAgICAgICAgMHgyMAorI2RlZmluZSBNSUJDUl9NSUJISSAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUlCQ1JfTUlCRlJaICAgICAgICAweDA4CisjZGVmaW5lIE1JQkNSX01JQkZMU0ggICAgICAgMHgwNAorI2RlZmluZSBNSUJDUl9NUFRSSU5JICAgICAgIDB4MDIKKyNkZWZpbmUgTUlCQ1JfTUlCQ0xSICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBFRVJTViByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRUVSU1ZfQk9PVF9SUEwgICAgICAoKHU4KSAweDAxKQkgLyogQm9vdCBtZXRob2Qgc2VsZWN0aW9uIGZvciBWVDYxMTAgKi8KKworI2RlZmluZSBFRVJTVl9CT09UX01BU0sgICAgICgodTgpIDB4MDYpCisjZGVmaW5lIEVFUlNWX0JPT1RfSU5UMTkgICAgKCh1OCkgMHgwMCkKKyNkZWZpbmUgRUVSU1ZfQk9PVF9JTlQxOCAgICAoKHU4KSAweDAyKQorI2RlZmluZSBFRVJTVl9CT09UX0xPQ0FMICAgICgodTgpIDB4MDQpCisjZGVmaW5lIEVFUlNWX0JPT1RfQkVWICAgICAgKCh1OCkgMHgwNikKKworCisvKgorICoJQml0cyBpbiBCUENNRAorICovCisKKyNkZWZpbmUgQlBDTURfQlBETkUgICAgICAgICAweDgwCisjZGVmaW5lIEJQQ01EX0VCUFdSICAgICAgICAgMHgwMgorI2RlZmluZSBCUENNRF9FQlBSRCAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIEVFQ1NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBFRUNTUl9FTUJQICAgICAgICAgIDB4NDAJLyogZWVwcm9tIGVtYmVkZWQgcHJvZ3JhbW1pbmcgKi8KKyNkZWZpbmUgRUVDU1JfUkVMT0FEICAgICAgICAweDIwCS8qIGVlcHJvbSBjb250ZW50IHJlbG9hZCAqLworI2RlZmluZSBFRUNTUl9EUE0gICAgICAgICAgIDB4MTAJLyogZWVwcm9tIGRpcmVjdCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBFRUNTUl9FQ1MgICAgICAgICAgIDB4MDgJLyogZWVwcm9tIENTIHBpbiAqLworI2RlZmluZSBFRUNTUl9FQ0sgICAgICAgICAgIDB4MDQJLyogZWVwcm9tIENLIHBpbiAqLworI2RlZmluZSBFRUNTUl9FREkgICAgICAgICAgIDB4MDIJLyogZWVwcm9tIERJIHBpbiAqLworI2RlZmluZSBFRUNTUl9FRE8gICAgICAgICAgIDB4MDEJLyogZWVwcm9tIERPIHBpbiAqLworCisvKgorICoJQml0cyBpbiB0aGUgRU1CQ01EIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBFTUJDTURfRURPTkUgICAgICAgIDB4ODAKKyNkZWZpbmUgRU1CQ01EX0VXRElTICAgICAgICAweDA4CisjZGVmaW5lIEVNQkNNRF9FV0VOICAgICAgICAgMHgwNAorI2RlZmluZSBFTUJDTURfRVdSICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRU1CQ01EX0VSRCAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIFRFU1RDRkcgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRFU1RDRkdfSEJESVMgICAgICAgMHg4MAorCisvKgorICoJQml0cyBpbiBDSElQR0NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDSElQR0NSX0ZDR01JSSAgICAgIDB4ODAKKyNkZWZpbmUgQ0hJUEdDUl9GQ0ZEWCAgICAgICAweDQwCisjZGVmaW5lIENISVBHQ1JfRkNSRVNWICAgICAgMHgyMAorI2RlZmluZSBDSElQR0NSX0ZDTU9ERSAgICAgIDB4MTAKKyNkZWZpbmUgQ0hJUEdDUl9MUFNPUFQgICAgICAweDA4CisjZGVmaW5lIENISVBHQ1JfVE0xVVMgICAgICAgMHgwNAorI2RlZmluZSBDSElQR0NSX1RNMFVTICAgICAgIDB4MDIKKyNkZWZpbmUgQ0hJUEdDUl9QSFlJTlRFTiAgICAweDAxCisKKy8qCisgKglCaXRzIGluIFdPTENSMAorICovCisKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjcgICAgICAweDAwODAJLyogZW5hYmxlIHBhdHRlcm4gbWF0Y2ggZmlsdGVyaW5nICovCisjZGVmaW5lIFdPTENSX01TV09MRU42ICAgICAgMHgwMDQwCisjZGVmaW5lIFdPTENSX01TV09MRU41ICAgICAgMHgwMDIwCisjZGVmaW5lIFdPTENSX01TV09MRU40ICAgICAgMHgwMDEwCisjZGVmaW5lIFdPTENSX01TV09MRU4zICAgICAgMHgwMDA4CisjZGVmaW5lIFdPTENSX01TV09MRU4yICAgICAgMHgwMDA0CisjZGVmaW5lIFdPTENSX01TV09MRU4xICAgICAgMHgwMDAyCisjZGVmaW5lIFdPTENSX01TV09MRU4wICAgICAgMHgwMDAxCisjZGVmaW5lIFdPTENSX0FSUF9FTiAgICAgICAgMHgwMDAxCisKKy8qCisgKglCaXRzIGluIFdPTENSMQorICovCisKKyNkZWZpbmUgV09MQ1JfTElOS09GRl9FTiAgICAgIDB4MDgwMAkvKiBsaW5rIG9mZiBkZXRlY3RlZCBlbmFibGUgKi8KKyNkZWZpbmUgV09MQ1JfTElOS09OX0VOICAgICAgIDB4MDQwMAkvKiBsaW5rIG9uIGRldGVjdGVkIGVuYWJsZSAqLworI2RlZmluZSBXT0xDUl9NQUdJQ19FTiAgICAgICAgMHgwMjAwCS8qIG1hZ2ljIHBhY2tldCBmaWx0ZXIgZW5hYmxlICovCisjZGVmaW5lIFdPTENSX1VOSUNBU1RfRU4gICAgICAweDAxMDAJLyogdW5pY2FzdCBmaWx0ZXIgZW5hYmxlICovCisKKworLyoKKyAqCUJpdHMgaW4gUFdDRkcKKyAqLworCisjZGVmaW5lIFBXQ0ZHX1BIWVBXT1BUICAgICAgICAgIDB4ODAJLyogaW50ZXJuYWwgTUlJIEkvRiB0aW1pbmcgKi8KKyNkZWZpbmUgUFdDRkdfUENJU1RJQ0sgICAgICAgICAgMHg0MAkvKiBQQ0kgc3RpY2t5IFIvVyBlbmFibGUgKi8KKyNkZWZpbmUgUFdDRkdfV09MVFlQRSAgICAgICAgICAgMHgyMAkvKiBwdWxzZSgxKSBvciBidXR0b24gKDApICovCisjZGVmaW5lIFBXQ0ZHX0xFR0NZX1dPTCAgICAgICAgIDB4MTAKKyNkZWZpbmUgUFdDRkdfUE1DU1JfUE1FX1NSICAgICAgMHgwOAorI2RlZmluZSBQV0NGR19QTUNTUl9QTUVfRU4gICAgICAweDA0CS8qIGNvbnRyb2wgYnkgUENJU1RJQ0sgKi8KKyNkZWZpbmUgUFdDRkdfTEVHQUNZX1dPTFNSICAgICAgMHgwMgkvKiBMZWdhY3kgV09MX1NSIHNoYWRvdyAqLworI2RlZmluZSBQV0NGR19MRUdBQ1lfV09MRU4gICAgICAweDAxCS8qIExlZ2FjeSBXT0xfRU4gc2hhZG93ICovCisKKy8qCisgKglCaXRzIGluIFdPTENGRworICovCisKKyNkZWZpbmUgV09MQ0ZHX1BNRU9WUiAgICAgICAgICAgMHg4MAkvKiBmb3IgbGVnYWN5IHVzZSwgZm9yY2UgUE1FRU4gYWx3YXlzICovCisjZGVmaW5lIFdPTENGR19TQU0gICAgICAgICAgICAgIDB4MjAJLyogYWNjZXB0IG11bHRpY2FzdCBjYXNlIHJlc2V0LCBkZWZhdWx0PTAgKi8KKyNkZWZpbmUgV09MQ0ZHX1NBQiAgICAgICAgICAgICAgMHgxMAkvKiBhY2NlcHQgYnJvYWRjYXN0IGNhc2UgcmVzZXQsIGRlZmF1bHQ9MCAqLworI2RlZmluZSBXT0xDRkdfU01JSUFDQyAgICAgICAgICAweDA4CS8qID8/ICovCisjZGVmaW5lIFdPTENGR19TR0VOV0ggICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV09MQ0ZHX1BIWUlOVEVOICAgICAgICAgMHgwMQkvKiAwOlBIWUlOVCB0cmlnZ2VyIGVuYWJsZSwgMTp1c2UgaW50ZXJuYWwgTUlJCisJCQkJCSAgdG8gcmVwb3J0IHN0YXR1cyBjaGFuZ2UgKi8KKy8qCisgKglCaXRzIGluIFdPTFNSMQorICovCisKKyNkZWZpbmUgV09MU1JfTElOS09GRl9JTlQgICAgICAweDA4MDAKKyNkZWZpbmUgV09MU1JfTElOS09OX0lOVCAgICAgICAweDA0MDAKKyNkZWZpbmUgV09MU1JfTUFHSUNfSU5UICAgICAgICAweDAyMDAKKyNkZWZpbmUgV09MU1JfVU5JQ0FTVF9JTlQgICAgICAweDAxMDAKKworLyoKKyAqCUV0aGVybmV0IGFkZHJlc3MgZmlsdGVyIHR5cGUKKyAqLworCisjZGVmaW5lIFBLVF9UWVBFX05PTkUgICAgICAgICAgICAgICAweDAwMDAJLyogVHVybiBvZmYgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgUEtUX1RZUEVfRElSRUNURUQgICAgICAgICAgIDB4MDAwMQkvKiBvYnNlbGV0ZSwgZGlyZWN0ZWQgYWRkcmVzcyBpcyBhbHdheXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgUEtUX1RZUEVfTVVMVElDQVNUICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQS1RfVFlQRV9BTExfTVVMVElDQVNUICAgICAgMHgwMDA0CisjZGVmaW5lIFBLVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUEtUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgIDB4MDAyMAorI2RlZmluZSBQS1RfVFlQRV9MT05HICAgICAgICAgICAgICAgMHgyMDAwCS8qIE5PVEUuLi4uIHRoZSBkZWZpbml0aW9uIG9mIExPTkcgaXMgPjIwNDggYnl0ZXMgaW4gb3VyIGNoaXAgKi8KKyNkZWZpbmUgUEtUX1RZUEVfUlVOVCAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQS1RfVFlQRV9FUlJPUiAgICAgICAgICAgICAgMHg4MDAwCS8qIEFjY2VwdCBlcnJvciBwYWNrZXRzLCBlLmcuIENSQyBlcnJvciAqLworCisvKgorICoJTG9vcGJhY2sgbW9kZQorICovCisKKyNkZWZpbmUgTUFDX0xCX05PTkUgICAgICAgICAweDAwCisjZGVmaW5lIE1BQ19MQl9JTlRFUk5BTCAgICAgMHgwMQorI2RlZmluZSBNQUNfTEJfRVhURVJOQUwgICAgIDB4MDIKKworLyoKKyAqCUVuYWJsZWQgbWFzayB2YWx1ZSBvZiBpcnEKKyAqLworCisjaWYgZGVmaW5lZChfU0lNKQorI2RlZmluZSBJTVJfTUFTS19WQUxVRSAgICAgIDB4MDAzM0ZGMEZVTAkvKiBpbml0aWFsIHZhbHVlIG9mIElNUgorCQkJCQkJICAgc2V0IElNUjAgdG8gMHgwRiBhY2NvcmRpbmcgdG8gc3BlYyAqLworCisjZWxzZQorI2RlZmluZSBJTVJfTUFTS19WQUxVRSAgICAgIDB4MDAxM0ZCMEZVTAkvKiBpbml0aWFsIHZhbHVlIG9mIElNUgorCQkJCQkJICAgaWdub3JlIE1JQkZJLFJBQ0VJIHRvCisJCQkJCQkgICByZWR1Y2UgaW50ci4gZnJlcXVlbmN5CisJCQkJCQkgICBOT1RFLi4uLiBkbyBub3QgZW5hYmxlIE5vQnVmIGludCBtYXNrIGF0IGRyaXZlciBkcml2ZXIKKwkJCQkJCSAgICAgIHdoZW4gKDEpIE5vQnVmIC0+IFJ4VGhyZXNob2xkID0gU0YKKwkJCQkJCQkgICAoMikgT0sgICAgLT4gUnhUaHJlc2hvbGQgPSBvcmlnaW5hbCB2YWx1ZQorCQkJCQkJICovCisjZW5kaWYKKworLyoKKyAqCVJldmlzaW9uIGlkCisgKi8KKworI2RlZmluZSBSRVZfSURfVlQzMTE5X0EwCTB4MDAKKyNkZWZpbmUgUkVWX0lEX1ZUMzExOV9BMQkweDAxCisjZGVmaW5lIFJFVl9JRF9WVDMyMTZfQTAJMHgxMAorCisvKgorICoJTWF4IHRpbWUgb3V0IGRlbGF5IHRpbWUKKyAqLworCisjZGVmaW5lIFdfTUFYX1RJTUVPVVQgICAgICAgMHgwRkZGVQorCisKKy8qCisgKglNQUMgcmVnaXN0ZXJzIGFzIGEgc3RydWN0dXJlLiBDYW5ub3QgYmUgZGlyZWN0bHkgYWNjZXNzZWQgdGhpcworICoJd2F5IGJ1dCBnZW5lcmF0ZXMgb2Zmc2V0cyBmb3IgcmVhZGwvd3JpdGVsKCkgY2FsbHMKKyAqLworCitzdHJ1Y3QgbWFjX3JlZ3MgeworCXZvbGF0aWxlIHU4IFBBUls2XTsJCS8qIDB4MDAgKi8KKwl2b2xhdGlsZSB1OCBSQ1I7CisJdm9sYXRpbGUgdTggVENSOworCisJdm9sYXRpbGUgdTMyIENSMFNldDsJCS8qIDB4MDggKi8KKwl2b2xhdGlsZSB1MzIgQ1IwQ2xyOwkJLyogMHgwQyAqLworCisJdm9sYXRpbGUgdTggTUFSQ0FNWzhdOwkJLyogMHgxMCAqLworCisJdm9sYXRpbGUgdTMyIERlY0Jhc2VIaTsJCS8qIDB4MTggKi8KKwl2b2xhdGlsZSB1MTYgRGJmQmFzZUhpOwkJLyogMHgxQyAqLworCXZvbGF0aWxlIHUxNiByZXNlcnZlZF8xRTsKKworCXZvbGF0aWxlIHUxNiBJU1JDVEw7CQkvKiAweDIwICovCisJdm9sYXRpbGUgdTggVFhFU1I7CisJdm9sYXRpbGUgdTggUlhFU1I7CisKKwl2b2xhdGlsZSB1MzIgSVNSOwkJLyogMHgyNCAqLworCXZvbGF0aWxlIHUzMiBJTVI7CisKKwl2b2xhdGlsZSB1MzIgVERTdGF0dXNQb3J0OwkvKiAweDJDICovCisKKwl2b2xhdGlsZSB1MTYgVERDU1JTZXQ7CQkvKiAweDMwICovCisJdm9sYXRpbGUgdTggUkRDU1JTZXQ7CisJdm9sYXRpbGUgdTggcmVzZXJ2ZWRfMzM7CisJdm9sYXRpbGUgdTE2IFREQ1NSQ2xyOworCXZvbGF0aWxlIHU4IFJEQ1NSQ2xyOworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzM3OworCisJdm9sYXRpbGUgdTMyIFJEQmFzZUxvOwkJLyogMHgzOCAqLworCXZvbGF0aWxlIHUxNiBSRElkeDsJCS8qIDB4M0MgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfM0U7CisKKwl2b2xhdGlsZSB1MzIgVERCYXNlTG9bNF07CS8qIDB4NDAgKi8KKworCXZvbGF0aWxlIHUxNiBSRENTaXplOwkJLyogMHg1MCAqLworCXZvbGF0aWxlIHUxNiBURENTaXplOwkJLyogMHg1MiAqLworCXZvbGF0aWxlIHUxNiBURElkeFs0XTsJCS8qIDB4NTQgKi8KKwl2b2xhdGlsZSB1MTYgdHhfcGF1c2VfdGltZXI7CS8qIDB4NUMgKi8KKwl2b2xhdGlsZSB1MTYgUkJSRFU7CQkvKiAweDVFICovCisKKwl2b2xhdGlsZSB1MzIgRklGT1Rlc3QwOwkJLyogMHg2MCAqLworCXZvbGF0aWxlIHUzMiBGSUZPVGVzdDE7CQkvKiAweDY0ICovCisKKwl2b2xhdGlsZSB1OCBDQU1BRERSOwkJLyogMHg2OCAqLworCXZvbGF0aWxlIHU4IENBTUNSOwkJLyogMHg2OSAqLworCXZvbGF0aWxlIHU4IEdGVEVTVDsJCS8qIDB4NkEgKi8KKwl2b2xhdGlsZSB1OCBGVFNUQ01EOwkJLyogMHg2QiAqLworCisJdm9sYXRpbGUgdTggTUlJQ0ZHOwkJLyogMHg2QyAqLworCXZvbGF0aWxlIHU4IE1JSVNSOworCXZvbGF0aWxlIHU4IFBIWVNSMDsKKwl2b2xhdGlsZSB1OCBQSFlTUjE7CisJdm9sYXRpbGUgdTggTUlJQ1I7CisJdm9sYXRpbGUgdTggTUlJQURSOworCXZvbGF0aWxlIHUxNiBNSUlEQVRBOworCisJdm9sYXRpbGUgdTE2IFNvZnRUaW1lcjA7CS8qIDB4NzQgKi8KKwl2b2xhdGlsZSB1MTYgU29mdFRpbWVyMTsKKworCXZvbGF0aWxlIHU4IENGR0E7CQkvKiAweDc4ICovCisJdm9sYXRpbGUgdTggQ0ZHQjsKKwl2b2xhdGlsZSB1OCBDRkdDOworCXZvbGF0aWxlIHU4IENGR0Q7CisKKwl2b2xhdGlsZSB1MTYgRENGRzsJCS8qIDB4N0MgKi8KKwl2b2xhdGlsZSB1MTYgTUNGRzsKKworCXZvbGF0aWxlIHU4IFRCSVNUOwkJLyogMHg4MCAqLworCXZvbGF0aWxlIHU4IFJCSVNUOworCXZvbGF0aWxlIHU4IFBNQ1BPUlQ7CisJdm9sYXRpbGUgdTggU1RJQ0tIVzsKKworCXZvbGF0aWxlIHU4IE1JQkNSOwkJLyogMHg4NCAqLworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzg1OworCXZvbGF0aWxlIHU4IHJldl9pZDsKKwl2b2xhdGlsZSB1OCBQT1JTVFM7CisKKwl2b2xhdGlsZSB1MzIgTUlCRGF0YTsJCS8qIDB4ODggKi8KKworCXZvbGF0aWxlIHUxNiBFRVdyRGF0YTsKKworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzhFOworCXZvbGF0aWxlIHU4IEJQTURXcjsKKwl2b2xhdGlsZSB1OCBCUENNRDsKKwl2b2xhdGlsZSB1OCBCUE1EUmQ7CisKKwl2b2xhdGlsZSB1OCBFRUNIS1NVTTsJCS8qIDB4OTIgKi8KKwl2b2xhdGlsZSB1OCBFRUNTUjsKKworCXZvbGF0aWxlIHUxNiBFRVJkRGF0YTsJCS8qIDB4OTQgKi8KKwl2b2xhdGlsZSB1OCBFQUREUjsKKwl2b2xhdGlsZSB1OCBFTUJDTUQ7CisKKworCXZvbGF0aWxlIHU4IEpNUFNSMDsJCS8qIDB4OTggKi8KKwl2b2xhdGlsZSB1OCBKTVBTUjE7CisJdm9sYXRpbGUgdTggSk1QU1IyOworCXZvbGF0aWxlIHU4IEpNUFNSMzsKKwl2b2xhdGlsZSB1OCBDSElQR1NSOwkJLyogMHg5QyAqLworCXZvbGF0aWxlIHU4IFRFU1RDRkc7CisJdm9sYXRpbGUgdTggREVCVUc7CisJdm9sYXRpbGUgdTggQ0hJUEdDUjsKKworCXZvbGF0aWxlIHUxNiBXT0xDUlNldDsJCS8qIDB4QTAgKi8KKwl2b2xhdGlsZSB1OCBQV0NGR1NldDsKKwl2b2xhdGlsZSB1OCBXT0xDRkdTZXQ7CisKKwl2b2xhdGlsZSB1MTYgV09MQ1JDbHI7CQkvKiAweEE0ICovCisJdm9sYXRpbGUgdTggUFdDRkdDTFI7CisJdm9sYXRpbGUgdTggV09MQ0ZHQ2xyOworCisJdm9sYXRpbGUgdTE2IFdPTFNSU2V0OwkJLyogMHhBOCAqLworCXZvbGF0aWxlIHUxNiByZXNlcnZlZF9BQTsKKworCXZvbGF0aWxlIHUxNiBXT0xTUkNscjsJCS8qIDB4QUMgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfQUU7CisKKwl2b2xhdGlsZSB1MTYgUGF0dGVybkNSQ1s4XTsJLyogMHhCMCAqLworCXZvbGF0aWxlIHUzMiBCeXRlTWFza1s0XVs0XTsJLyogMHhDMCAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisKK2VudW0gaHdfbWliIHsKKwlIV19NSUJfaWZSeEFsbFBrdHMgPSAwLAorCUhXX01JQl9pZlJ4T2tQa3RzLAorCUhXX01JQl9pZlR4T2tQa3RzLAorCUhXX01JQl9pZlJ4RXJyb3JQa3RzLAorCUhXX01JQl9pZlJ4UnVudE9rUGt0LAorCUhXX01JQl9pZlJ4UnVudEVyclBrdCwKKwlIV19NSUJfaWZSeDY0UGt0cywKKwlIV19NSUJfaWZUeDY0UGt0cywKKwlIV19NSUJfaWZSeDY1VG8xMjdQa3RzLAorCUhXX01JQl9pZlR4NjVUbzEyN1BrdHMsCisJSFdfTUlCX2lmUngxMjhUbzI1NVBrdHMsCisJSFdfTUlCX2lmVHgxMjhUbzI1NVBrdHMsCisJSFdfTUlCX2lmUngyNTZUbzUxMVBrdHMsCisJSFdfTUlCX2lmVHgyNTZUbzUxMVBrdHMsCisJSFdfTUlCX2lmUng1MTJUbzEwMjNQa3RzLAorCUhXX01JQl9pZlR4NTEyVG8xMDIzUGt0cywKKwlIV19NSUJfaWZSeDEwMjRUbzE1MThQa3RzLAorCUhXX01JQl9pZlR4MTAyNFRvMTUxOFBrdHMsCisJSFdfTUlCX2lmVHhFdGhlckNvbGxpc2lvbnMsCisJSFdfTUlCX2lmUnhQa3RDUkNFLAorCUhXX01JQl9pZlJ4SnVtYm9Qa3RzLAorCUhXX01JQl9pZlR4SnVtYm9Qa3RzLAorCUhXX01JQl9pZlJ4TWFjQ29udHJvbEZyYW1lcywKKwlIV19NSUJfaWZUeE1hY0NvbnRyb2xGcmFtZXMsCisJSFdfTUlCX2lmUnhQa3RGQUUsCisJSFdfTUlCX2lmUnhMb25nT2tQa3QsCisJSFdfTUlCX2lmUnhMb25nUGt0RXJyUGt0LAorCUhXX01JQl9pZlRYU1FFRXJyb3JzLAorCUhXX01JQl9pZlJ4Tm9idWYsCisJSFdfTUlCX2lmUnhTeW1ib2xFcnJvcnMsCisJSFdfTUlCX2lmSW5SYW5nZUxlbmd0aEVycm9ycywKKwlIV19NSUJfaWZMYXRlQ29sbGlzaW9ucywKKwlIV19NSUJfU0laRQorfTsKKworZW51bSBjaGlwX3R5cGUgeworCUNISVBfVFlQRV9WVDYxMTAgPSAxLAorfTsKKworc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsIHsKKwllbnVtIGNoaXBfdHlwZSBjaGlwX2lkOworCWNoYXIgKm5hbWU7CisJaW50IGlvX3NpemU7CisJaW50IHR4cXVldWU7CisJdTMyIGZsYWdzOworfTsKKworI2RlZmluZSBtYWNfaHdfbWlic19pbml0KHJlZ3MpIHtcCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NSUJGUlosJigocmVncyktPk1JQkNSKSk7XAorCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCQ0xSLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlkbyB7fVwKKwkJd2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlCQ1JfTUlCQ0xSLCYoKHJlZ3MpLT5NSUJDUikpKTtcCisJQllURV9SRUdfQklUU19PRkYoTUlCQ1JfTUlCRlJaLCYoKHJlZ3MpLT5NSUJDUikpO1wKK30KKworI2RlZmluZSBtYWNfcmVhZF9pc3IocmVncykgIAkJcmVhZGwoJigocmVncyktPklTUikpCisjZGVmaW5lIG1hY193cml0ZV9pc3IocmVncywgeCkgIAl3cml0ZWwoKHgpLCYoKHJlZ3MpLT5JU1IpKQorI2RlZmluZSBtYWNfY2xlYXJfaXNyKHJlZ3MpIAkJd3JpdGVsKDB4ZmZmZmZmZmZMLCYoKHJlZ3MpLT5JU1IpKQorCisjZGVmaW5lIG1hY193cml0ZV9pbnRfbWFzayhtYXNrLCByZWdzKSAJd3JpdGVsKChtYXNrKSwmKChyZWdzKS0+SU1SKSk7CisjZGVmaW5lIG1hY19kaXNhYmxlX2ludChyZWdzKSAgICAgICAJd3JpdGVsKENSMF9HSU5UTVNLMSwmKChyZWdzKS0+Q1IwQ2xyKSkKKyNkZWZpbmUgbWFjX2VuYWJsZV9pbnQocmVncykgICAgCXdyaXRlbChDUjBfR0lOVE1TSzEsJigocmVncyktPkNSMFNldCkpCisKKyNkZWZpbmUgbWFjX2h3X21pYnNfcmVhZChyZWdzLCBNSUJzKSB7XAorCWludCBpO1wKKwlCWVRFX1JFR19CSVRTX09OKE1JQkNSX01QVFJJTkksJigocmVncyktPk1JQkNSKSk7XAorCWZvciAoaT0wO2k8SFdfTUlCX1NJWkU7aSsrKSB7XAorCQkoTUlCcylbaV09cmVhZGwoJigocmVncyktPk1JQkRhdGEpKTtcCisJfVwKK30KKworI2RlZmluZSBtYWNfc2V0X2RtYV9sZW5ndGgocmVncywgbikge1wKKwlCWVRFX1JFR19CSVRTX1NFVCgobiksMHgwNywmKChyZWdzKS0+RENGRykpO1wKK30KKworI2RlZmluZSBtYWNfc2V0X3J4X3RocmVzaChyZWdzLCBuKSB7XAorCUJZVEVfUkVHX0JJVFNfU0VUKChuKSwoTUNGR19SRlQwfE1DRkdfUkZUMSksJigocmVncyktPk1DRkcpKTtcCit9CisKKyNkZWZpbmUgbWFjX3J4X3F1ZXVlX3J1bihyZWdzKSB7XAorCXdyaXRlYihUUkRDU1JfUlVOLCAmKChyZWdzKS0+UkRDU1JTZXQpKTtcCit9CisKKyNkZWZpbmUgbWFjX3J4X3F1ZXVlX3dha2UocmVncykge1wKKwl3cml0ZWIoVFJEQ1NSX1dBSywgJigocmVncyktPlJEQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY190eF9xdWV1ZV9ydW4ocmVncywgbikge1wKKwl3cml0ZXcoVFJEQ1NSX1JVTjw8KChuKSo0KSwmKChyZWdzKS0+VERDU1JTZXQpKTtcCit9CisKKyNkZWZpbmUgbWFjX3R4X3F1ZXVlX3dha2UocmVncywgbikge1wKKwl3cml0ZXcoVFJEQ1NSX1dBSzw8KG4qNCksJigocmVncyktPlREQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY19lZXByb21fcmVsb2FkKHJlZ3MpIHtcCisJaW50IGk9MDtcCisJQllURV9SRUdfQklUU19PTihFRUNTUl9SRUxPQUQsJigocmVncyktPkVFQ1NSKSk7XAorCWRvIHtcCisJCXVkZWxheSgxMCk7XAorCQlpZiAoaSsrPjB4MTAwMCkge1wKKwkJCWJyZWFrO1wKKwkJfVwKKwl9d2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04oRUVDU1JfUkVMT0FELCYoKHJlZ3MpLT5FRUNTUikpKTtcCit9CisKK2VudW0gdmVsb2NpdHlfY2FtX3R5cGUgeworCVZFTE9DSVRZX1ZMQU5fSURfQ0FNID0gMCwKKwlWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNCit9OworCisvKioKKyAqCW1hY19nZXRfY2FtX21hc2sJLQlSZWFkIGEgQ0FNIG1hc2sKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBmb3IgdGhpcyB2ZWxvY2l0eQorICoJQG1hc2s6IGJ1ZmZlciB0byBzdG9yZSBtYXNrCisgKglAY2FtX3R5cGU6IENBTSB0byBmZXRjaAorICoKKyAqCUZldGNoIHRoZSBtYXNrIGJpdHMgb2YgdGhlIHNlbGVjdGVkIENBTSBhbmQgc3RvcmUgdGhlbSBpbnRvIHRoZQorICoJcHJvdmlkZWQgbWFzayBidWZmZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1hY19nZXRfY2FtX21hc2soc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCB1OCAqIG1hc2ssIGVudW0gdmVsb2NpdHlfY2FtX3R5cGUgY2FtX3R5cGUpCit7CisJaW50IGk7CisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX01BU0ssIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfVkNBTVNMLCAmcmVncy0+Q0FNQUREUik7CisJZWxzZQorCQl3cml0ZWIoMCwgJnJlZ3MtPkNBTUFERFIpOworCisJLyogcmVhZCBtYXNrICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJKm1hc2srKyA9IHJlYWRiKCYocmVncy0+TUFSQ0FNW2ldKSk7CisKKwkvKiBkaXNhYmxlIENBTUVOICovCisJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIFNlbGVjdCBtYXIgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19NQVIsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworfQorCisvKioKKyAqCW1hY19zZXRfY2FtX21hc2sJLQlTZXQgYSBDQU0gbWFzaworICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIGZvciB0aGlzIHZlbG9jaXR5CisgKglAbWFzazogQ0FNIG1hc2sgdG8gbG9hZAorICoJQGNhbV90eXBlOiBDQU0gdG8gc3RvcmUKKyAqCisgKglTdG9yZSBhIG5ldyBtYXNrIGludG8gYSBDQU0KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX3NldF9jYW1fbWFzayhzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MsIHU4ICogbWFzaywgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKwkvKiBTZWxlY3QgQ0FNIG1hc2sgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19DQU1fTUFTSywgQ0FNQ1JfUFMxIHwgQ0FNQ1JfUFMwLCAmcmVncy0+Q0FNQ1IpOworCisJaWYgKGNhbV90eXBlID09IFZFTE9DSVRZX1ZMQU5fSURfQ0FNKQorCQl3cml0ZWIoQ0FNQUREUl9DQU1FTiB8IENBTUFERFJfVkNBTVNMLCAmcmVncy0+Q0FNQUREUik7CisJZWxzZQorCQl3cml0ZWIoQ0FNQUREUl9DQU1FTiwgJnJlZ3MtPkNBTUFERFIpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl3cml0ZWIoKm1hc2srKywgJihyZWdzLT5NQVJDQU1baV0pKTsKKwl9CisJLyogZGlzYWJsZSBDQU1FTiAqLworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX3NldF9jYW0JLQlzZXQgQ0FNIGRhdGEKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBvZiB0aGlzIHZlbG9jaXR5CisgKglAaWR4OiBDYW0gaW5kZXgKKyAqCUBhZGRyOiAyIG9yIDYgYnl0ZXMgb2YgQ0FNIGRhdGEKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIGxvYWQKKyAqCisgKglMb2FkIGFuIGFkZHJlc3Mgb3IgdmxhbiB0YWcgaW50byBhIENBTQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfc2V0X2NhbShzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MsIGludCBpZHgsIHU4ICphZGRyLCBlbnVtIHZlbG9jaXR5X2NhbV90eXBlIGNhbV90eXBlKQoreworCWludCBpOworCisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX0RBVEEsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworCWlkeCAmPSAoNjQgLSAxKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBDQU1BRERSX1ZDQU1TTCB8IGlkeCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGV3KCooKHUxNiAqKSBhZGRyKSwgJnJlZ3MtPk1BUkNBTVswXSk7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXdyaXRlYigqYWRkcisrLCAmKHJlZ3MtPk1BUkNBTVtpXSkpOworCQl9CisJfQorCUJZVEVfUkVHX0JJVFNfT04oQ0FNQ1JfQ0FNV1IsICZyZWdzLT5DQU1DUik7CisKKwl1ZGVsYXkoMTApOworCisJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIFNlbGVjdCBtYXIgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19NQVIsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKK30KKworLyoqCisgKgltYWNfZ2V0X2NhbQktCWZldGNoIENBTSBkYXRhCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgb2YgdGhpcyB2ZWxvY2l0eQorICoJQGlkeDogQ2FtIGluZGV4CisgKglAYWRkcjogYnVmZmVyIHRvIGhvbGQgdXAgdG8gNiBieXRlcyBvZiBDQU0gZGF0YQorICoJQGNhbV90eXBlOiBDQU0gdG8gbG9hZAorICoKKyAqCUxvYWQgYW4gYWRkcmVzcyBvciB2bGFuIHRhZyBmcm9tIGEgQ0FNIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZCBieQorICoJdGhlIGNhbGxlci4gVkxBTiB0YWdzIGFyZSAyIGJ5dGVzIHRoZSBhZGRyZXNzIGNhbSBlbnRyaWVzIGFyZSA2LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZ2V0X2NhbShzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MsIGludCBpZHgsIHU4ICphZGRyLCBlbnVtIHZlbG9jaXR5X2NhbV90eXBlIGNhbV90eXBlKQoreworCWludCBpOworCisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX0RBVEEsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworCWlkeCAmPSAoNjQgLSAxKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBDQU1BRERSX1ZDQU1TTCB8IGlkeCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKworCUJZVEVfUkVHX0JJVFNfT04oQ0FNQ1JfQ0FNUkQsICZyZWdzLT5DQU1DUik7CisKKwl1ZGVsYXkoMTApOworCisJaWYgKGNhbV90eXBlID09IFZFTE9DSVRZX1ZMQU5fSURfQ0FNKQorCQkqKCh1MTYgKikgYWRkcikgPSByZWFkdygmKHJlZ3MtPk1BUkNBTVswXSkpOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKywgYWRkcisrKQorCQkJKigodTggKikgYWRkcikgPSByZWFkYigmKHJlZ3MtPk1BUkNBTVtpXSkpOworCisJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIFNlbGVjdCBtYXIgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19NQVIsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKK30KKworLyoqCisgKgltYWNfd29sX3Jlc2V0CS0JcmVzZXQgV09MIGFmdGVyIGV4aXRpbmcgbG93IHBvd2VyCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgb2YgdGhpcyB2ZWxvY2l0eQorICoKKyAqCUNhbGxlZCBhZnRlciB3ZSBkcm9wIG91dCBvZiB3YWtlIG9uIGxhbiBtb2RlIGluIG9yZGVyIHRvCisgKglyZXNldCB0aGUgV2FrZSBvbiBsYW4gZmVhdHVyZXMuIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXN0b3JlCisgKgl0aGUgcmVzdCBvZiB0aGUgbG9naWMgZnJvbSB0aGUgcmVzdWx0IG9mIHNsZWVwL3dha2V1cAorICovCisKK2lubGluZSBzdGF0aWMgdm9pZCBtYWNfd29sX3Jlc2V0KHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKworCS8qIFR1cm4gb2ZmIFNXUFRBRyByaWdodCBhZnRlciBsZWF2aW5nIHBvd2VyIG1vZGUgKi8KKwlCWVRFX1JFR19CSVRTX09GRihTVElDS0hXX1NXUFRBRywgJnJlZ3MtPlNUSUNLSFcpOworCS8qIGNsZWFyIHN0aWNreSBiaXRzICovCisJQllURV9SRUdfQklUU19PRkYoKFNUSUNLSFdfRFMxIHwgU1RJQ0tIV19EUzApLCAmcmVncy0+U1RJQ0tIVyk7CisKKwlCWVRFX1JFR19CSVRTX09GRihDSElQR0NSX0ZDR01JSSwgJnJlZ3MtPkNISVBHQ1IpOworCUJZVEVfUkVHX0JJVFNfT0ZGKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisJLyogZGlzYWJsZSBmb3JjZSBQTUUtZW5hYmxlICovCisJd3JpdGViKFdPTENGR19QTUVPVlIsICZyZWdzLT5XT0xDRkdDbHIpOworCS8qIGRpc2FibGUgcG93ZXItZXZlbnQgY29uZmlnIGJpdCAqLworCXdyaXRldygweEZGRkYsICZyZWdzLT5XT0xDUkNscik7CisJLyogY2xlYXIgcG93ZXIgc3RhdHVzICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPldPTFNSQ2xyKTsKK30KKworCisvKgorICogSGVhZGVyIGZvciBXT0wgZGVmaW5pdGlvbnMuIFVzZWQgdG8gY29tcHV0ZSBoYXNoZXMKKyAqLworCit0eXBlZGVmIHU4IE1DQU1fQUREUltFVEhfQUxFTl07CisKK3N0cnVjdCBhcnBfcGFja2V0IHsKKwl1OCBkZXN0X21hY1tFVEhfQUxFTl07CisJdTggc3JjX21hY1tFVEhfQUxFTl07CisJdTE2IHR5cGU7CisJdTE2IGFyX2hyZDsKKwl1MTYgYXJfcHJvOworCXU4IGFyX2hsbjsKKwl1OCBhcl9wbG47CisJdTE2IGFyX29wOworCXU4IGFyX3NoYVtFVEhfQUxFTl07CisJdTggYXJfc2lwWzRdOworCXU4IGFyX3RoYVtFVEhfQUxFTl07CisJdTggYXJfdGlwWzRdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgX21hZ2ljX3BhY2tldCB7CisJdTggZGVzdF9tYWNbNl07CisJdTggc3JjX21hY1s2XTsKKwl1MTYgdHlwZTsKKwl1OCBNQUNbMTZdWzZdOworCXU4IHBhc3N3b3JkWzZdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKgorICoJU3RvcmUgZm9yIGNoaXAgY29udGV4dCB3aGVuIHNhdmluZyBhbmQgcmVzdG9yaW5nIHN0YXR1cy4gTm90CisgKglhbGwgZmllbGRzIGFyZSBzYXZlZC9yZXN0b3JlZCBjdXJyZW50bHkuCisgKi8KKworc3RydWN0IHZlbG9jaXR5X2NvbnRleHQgeworCXU4IG1hY19yZWdbMjU2XTsKKwlNQ0FNX0FERFIgY2FtX2FkZHJbTUNBTV9TSVpFXTsKKwl1MTYgdmNhbVtWQ0FNX1NJWkVdOworCXUzMiBjYW1tYXNrWzJdOworCXUzMiBwYXRjcmNbMl07CisJdTMyIHBhdHRlcm5bOF07Cit9OworCisKKy8qCisgKglNSUkgcmVnaXN0ZXJzLgorICovCisKKworLyoKKyAqCVJlZ2lzdGVycyBpbiB0aGUgTUlJIChvZmZzZXQgdW5pdCBpcyBXT1JEKQorICovCisKKyNkZWZpbmUgTUlJX1JFR19CTUNSICAgICAgICAweDAwCS8vIHBoeXNpY2FsIGFkZHJlc3MKKyNkZWZpbmUgTUlJX1JFR19CTVNSICAgICAgICAweDAxCS8vCisjZGVmaW5lIE1JSV9SRUdfUEhZSUQxICAgICAgMHgwMgkvLyBPVUkKKyNkZWZpbmUgTUlJX1JFR19QSFlJRDIgICAgICAweDAzCS8vIE9VSSArIE1vZHVsZSBJRCArIFJFViBJRAorI2RlZmluZSBNSUlfUkVHX0FOQVIgICAgICAgIDB4MDQJLy8KKyNkZWZpbmUgTUlJX1JFR19BTkxQQVIgICAgICAweDA1CS8vCisjZGVmaW5lIE1JSV9SRUdfRzEwMDBDUiAgICAgMHgwOQkvLworI2RlZmluZSBNSUlfUkVHX0cxMDAwU1IgICAgIDB4MEEJLy8KKyNkZWZpbmUgTUlJX1JFR19NT0RDRkcgICAgICAweDEwCS8vCisjZGVmaW5lIE1JSV9SRUdfVENTUiAgICAgICAgMHgxNgkvLworI2RlZmluZSBNSUlfUkVHX1BMRUQgICAgICAgIDB4MUIJLy8KKy8vIE5TLCBNWVNPTiBvbmx5CisjZGVmaW5lIE1JSV9SRUdfUENSICAgICAgICAgMHgxNwkvLworLy8gRVNJIG9ubHkKKyNkZWZpbmUgTUlJX1JFR19QQ1NSICAgICAgICAweDE3CS8vCisjZGVmaW5lIE1JSV9SRUdfQVVYQ1IgICAgICAgMHgxQwkvLworCisvLyBNYXJ2ZWxsIDg4RTEwMDAvODhFMTAwMFMKKyNkZWZpbmUgTUlJX1JFR19QU0NSICAgICAgICAweDEwCS8vIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyCisKKy8vCisvLyBCaXRzIGluIHRoZSBCTUNSIHJlZ2lzdGVyCisvLworI2RlZmluZSBCTUNSX1JFU0VUICAgICAgICAgIDB4ODAwMAkvLworI2RlZmluZSBCTUNSX0xCSyAgICAgICAgICAgIDB4NDAwMAkvLworI2RlZmluZSBCTUNSX1NQRUVEMTAwICAgICAgIDB4MjAwMAkvLworI2RlZmluZSBCTUNSX0FVVE8gICAgICAgICAgIDB4MTAwMAkvLworI2RlZmluZSBCTUNSX1BEICAgICAgICAgICAgIDB4MDgwMAkvLworI2RlZmluZSBCTUNSX0lTTyAgICAgICAgICAgIDB4MDQwMAkvLworI2RlZmluZSBCTUNSX1JFQVVUTyAgICAgICAgIDB4MDIwMAkvLworI2RlZmluZSBCTUNSX0ZEWCAgICAgICAgICAgIDB4MDEwMAkvLworI2RlZmluZSBCTUNSX1NQRUVEMUcgICAgICAgIDB4MDA0MAkvLworLy8KKy8vIEJpdHMgaW4gdGhlIEJNU1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEJNU1JfQVVUT0NNICAgICAgICAgMHgwMDIwCS8vCisjZGVmaW5lIEJNU1JfTE5LICAgICAgICAgICAgMHgwMDA0CS8vCisKKy8vCisvLyBCaXRzIGluIHRoZSBBTkFSIHJlZ2lzdGVyCisvLworI2RlZmluZSBBTkFSX0FTTURJUiAgICAgICAgIDB4MDgwMAkvLyBBc3ltbWV0cmljIFBBVVNFIHN1cHBvcnQKKyNkZWZpbmUgQU5BUl9QQVVTRSAgICAgICAgICAweDA0MDAJLy8gU3ltbWV0cmljIFBBVVNFIFN1cHBvcnQKKyNkZWZpbmUgQU5BUl9UNCAgICAgICAgICAgICAweDAyMDAJLy8KKyNkZWZpbmUgQU5BUl9UWEZEICAgICAgICAgICAweDAxMDAJLy8KKyNkZWZpbmUgQU5BUl9UWCAgICAgICAgICAgICAweDAwODAJLy8KKyNkZWZpbmUgQU5BUl8xMEZEICAgICAgICAgICAweDAwNDAJLy8KKyNkZWZpbmUgQU5BUl8xMCAgICAgICAgICAgICAweDAwMjAJLy8KKy8vCisvLyBCaXRzIGluIHRoZSBBTkxQQVIgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEFOTFBBUl9BU01ESVIgICAgICAgMHgwODAwCS8vIEFzeW1tZXRyaWMgUEFVU0Ugc3VwcG9ydAorI2RlZmluZSBBTkxQQVJfUEFVU0UgICAgICAgIDB4MDQwMAkvLyBTeW1tZXRyaWMgUEFVU0UgU3VwcG9ydAorI2RlZmluZSBBTkxQQVJfVDQgICAgICAgICAgIDB4MDIwMAkvLworI2RlZmluZSBBTkxQQVJfVFhGRCAgICAgICAgIDB4MDEwMAkvLworI2RlZmluZSBBTkxQQVJfVFggICAgICAgICAgIDB4MDA4MAkvLworI2RlZmluZSBBTkxQQVJfMTBGRCAgICAgICAgIDB4MDA0MAkvLworI2RlZmluZSBBTkxQQVJfMTAgICAgICAgICAgIDB4MDAyMAkvLworCisvLworLy8gQml0cyBpbiB0aGUgRzEwMDBDUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgRzEwMDBDUl8xMDAwRkQgICAgICAweDAyMDAJLy8gUEhZIGlzIDEwMDAtVCBGdWxsLWR1cGxleCBjYXBhYmxlCisjZGVmaW5lIEcxMDAwQ1JfMTAwMCAgICAgICAgMHgwMTAwCS8vIFBIWSBpcyAxMDAwLVQgSGFsZi1kdXBsZXggY2FwYWJsZQorCisvLworLy8gQml0cyBpbiB0aGUgRzEwMDBTUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgRzEwMDBTUl8xMDAwRkQgICAgICAweDA4MDAJLy8gTFAgUEhZIGlzIDEwMDAtVCBGdWxsLWR1cGxleCBjYXBhYmxlCisjZGVmaW5lIEcxMDAwU1JfMTAwMCAgICAgICAgMHgwNDAwCS8vIExQIFBIWSBpcyAxMDAwLVQgSGFsZi1kdXBsZXggY2FwYWJsZQorCisjZGVmaW5lIFRDU1JfRUNIT0RJUyAgICAgICAgMHgyMDAwCS8vCisjZGVmaW5lIEFVWENSX01EUFBTICAgICAgICAgMHgwMDA0CS8vCisKKy8vIEJpdHMgaW4gdGhlIFBMRUQgcmVnaXN0ZXIKKyNkZWZpbmUgUExFRF9MQUxCRQkJCTB4MDAwNAkvLworCisvLyBNYXJ2ZWxsIDg4RTEwMDAvODhFMTAwMFMgQml0cyBpbiB0aGUgUEhZIHNwZWNpZmljIGNvbnRyb2wgcmVnaXN0ZXIgKDEwaCkKKyNkZWZpbmUgUFNDUl9BQ1JTVFggICAgICAgICAweDA4MDAJLy8gQXNzZXJ0IENSUyBvbiBUcmFuc21pdAorCisjZGVmaW5lIFBIWUlEX0NJQ0FEQV9DUzgyMDEgMHgwMDBGQzQxMFVMCisjZGVmaW5lIFBIWUlEX1ZUMzIxNl8zMkJJVCAgMHgwMDBGQzYxMFVMCisjZGVmaW5lIFBIWUlEX1ZUMzIxNl82NEJJVCAgMHgwMDBGQzYwMFVMCisjZGVmaW5lIFBIWUlEX01BUlZFTExfMTAwMCAgMHgwMTQxMEM1MFVMCisjZGVmaW5lIFBIWUlEX01BUlZFTExfMTAwMFMgMHgwMTQxMEM0MFVMCisKKyNkZWZpbmUgUEhZSURfUkVWX0lEX01BU0sgICAweDAwMDAwMDBGVUwKKworI2RlZmluZSBQSFlJRF9HRVRfUEhZX1JFVl9JRChpKSAgICAgKChpKSAmIFBIWUlEX1JFVl9JRF9NQVNLKQorI2RlZmluZSBQSFlJRF9HRVRfUEhZX0lEKGkpICAgICAgICAgKChpKSAmIH5QSFlJRF9SRVZfSURfTUFTSykKKworI2RlZmluZSBNSUlfUkVHX0JJVFNfT04oeCxpLHApIGRvIHtcCisgICAgdTE2IHc7XAorICAgIHZlbG9jaXR5X21paV9yZWFkKChwKSwoaSksJih3KSk7XAorICAgICh3KXw9KHgpO1wKKyAgICB2ZWxvY2l0eV9taWlfd3JpdGUoKHApLChpKSwodykpO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUlJX1JFR19CSVRTX09GRih4LGkscCkgZG8ge1wKKyAgICB1MTYgdztcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLChpKSwmKHcpKTtcCisgICAgKHcpJj0ofih4KSk7XAorICAgIHZlbG9jaXR5X21paV93cml0ZSgocCksKGkpLCh3KSk7XAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNSUlfUkVHX0JJVFNfSVNfT04oeCxpLHApICh7XAorICAgIHUxNiB3O1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksKGkpLCYodykpO1wKKyAgICAoKGludCkgKCh3KSAmICh4KSkpO30pCisKKyNkZWZpbmUgTUlJX0dFVF9QSFlfSUQocCkgKHtcCisgICAgdTMyIGlkO1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksTUlJX1JFR19QSFlJRDIsKHUxNiAqKSAmaWQpO1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksTUlJX1JFR19QSFlJRDEsKCh1MTYgKikgJmlkKSsxKTtcCisgICAgKGlkKTt9KQorCisvKgorICogSW5saW5lIGRlYnVnIHJvdXRpbmUKKyAqLworCisKK2VudW0gdmVsb2NpdHlfbXNnX2xldmVsIHsKKwlNU0dfTEVWRUxfRVJSID0gMCwJLy9FcnJvcnMgdGhhdCB3aWxsIGNhdXNlIGFibm9ybWFsIG9wZXJhdGlvbi4KKwlNU0dfTEVWRUxfTk9USUNFID0gMSwJLy9Tb21lIGVycm9ycyBuZWVkIHVzZXJzIHRvIGJlIG5vdGlmaWVkLgorCU1TR19MRVZFTF9JTkZPID0gMiwJLy9Ob3JtYWwgbWVzc2FnZS4KKwlNU0dfTEVWRUxfVkVSQk9TRSA9IDMsCS8vV2lsbCByZXBvcnQgYWxsIHRyaXZhbCBlcnJvcnMuCisJTVNHX0xFVkVMX0RFQlVHID0gNAkvL09ubHkgZm9yIGRlYnVnIHB1cnBvc2UuCit9OworCisjaWZkZWYgVkVMT0NJVFlfREVCVUcKKyNkZWZpbmUgQVNTRVJUKHgpIHsgXAorCWlmICghKHgpKSB7IFwKKwkJcHJpbnRrKEtFUk5fRVJSICJhc3NlcnRpb24gJXMgZmFpbGVkOiBmaWxlICVzIGxpbmUgJWRcbiIsICN4LFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pO1wKKwkJQlVHKCk7IFwKKwl9XAorfQorI2RlZmluZSBWRUxPQ0lUWV9EQkcocCxhcmdzLi4uKSBwcmludGsocCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHgpCisjZGVmaW5lIFZFTE9DSVRZX0RCRyh4KQorI2VuZGlmCisKKyNkZWZpbmUgVkVMT0NJVFlfUFJUKGwsIHAsIGFyZ3MuLi4pIGRvIHtpZiAobDw9bXNnbGV2ZWwpIHByaW50ayggcCAsIyNhcmdzKTt9IHdoaWxlICgwKQorCisjZGVmaW5lIFZFTE9DSVRZX1BSVF9DQU1NQVNLKHAsdCkge1wKKwlpbnQgaTtcCisJaWYgKCh0KT09VkVMT0NJVFlfTVVMVElDQVNUX0NBTSkge1wKKyAgICAgICAgCWZvciAoaT0wO2k8KE1DQU1fU0laRS84KTtpKyspXAorCQkJcHJpbnRrKCIlMDJYIiwocCktPm1DQU1tYXNrW2ldKTtcCisJfVwKKwllbHNlIHtcCisJCWZvciAoaT0wO2k8KFZDQU1fU0laRS84KTtpKyspXAorCQkJcHJpbnRrKCIlMDJYIiwocCktPnZDQU1tYXNrW2ldKTtcCisJfVwKKwlwcmludGsoIlxuIik7XAorfQorCisKKworI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX01BR0lDICAgICAgICAgICAgIDB4MDAwMDAwMDBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX1BIWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX0FSUCAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX1VDQVNUICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX0JDQVNUICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX01DQVNUICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfV09MX01BR0lDX1NFQyAgICAgICAgIDB4MDAwMDAwNDBVTAorCisvKgorICoJRmxhZ3MgZm9yIG9wdGlvbnMKKyAqLworCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HICAgICAgICAgMHgwMDAwMDAwMVVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19SWF9DU1VNICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19JUF9BTElHTiAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19WQUxfUEtUX0xFTiAgICAgMHgwMDAwMDAxMFVMCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX0ZMT1dfQ1RSTCAgICAgICAweDAxMDAwMDAwVUwKKworLyoKKyAqCUZsYWdzIGZvciBkcml2ZXIgc3RhdHVzCisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfT1BFTkVEICAgICAgICAgIDB4MDAwMTAwMDBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVk1OU19DT05ORUNURUQgIDB4MDAwMjAwMDBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVk1OU19DT01NSVRURUQgIDB4MDAwNDAwMDBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQgICAgIDB4MDAwODAwMDBVTAorCisvKgorICoJRmxhZ3MgZm9yIE1JSSBzdGF0dXMKKyAqLworCisjZGVmaW5lICAgICBWRUxPQ0lUWV9MSU5LX0ZBSUwgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9TUEVFRF8xMCAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9TUEVFRF8xMDAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9TUEVFRF8xMDAwICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9EVVBMRVhfRlVMTCAgICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GT1JDRURfQllfRUVQUk9NICAgICAgMHgwMDAwMDA0MFVMCisKKy8qCisgKglGb3IgdmVsb2NpdHlfc2V0X21lZGlhX2R1cGxleAorICovCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0xJTktfQ0hBTkdFICAgICAgICAgICAweDAwMDAwMDAxVUwKKworZW51bSBzcGVlZF9vcHQgeworCVNQRF9EUFhfQVVUTyA9IDAsCisJU1BEX0RQWF8xMDBfSEFMRiA9IDEsCisJU1BEX0RQWF8xMDBfRlVMTCA9IDIsCisJU1BEX0RQWF8xMF9IQUxGID0gMywKKwlTUERfRFBYXzEwX0ZVTEwgPSA0Cit9OworCitlbnVtIHZlbG9jaXR5X2luaXRfdHlwZSB7CisJVkVMT0NJVFlfSU5JVF9DT0xEID0gMCwKKwlWRUxPQ0lUWV9JTklUX1JFU0VULAorCVZFTE9DSVRZX0lOSVRfV09MCit9OworCitlbnVtIHZlbG9jaXR5X2Zsb3dfY250bF90eXBlIHsKKwlGTE9XX0NOVExfREVGQVVMVCA9IDEsCisJRkxPV19DTlRMX1RYLAorCUZMT1dfQ05UTF9SWCwKKwlGTE9XX0NOVExfVFhfUlgsCisJRkxPV19DTlRMX0RJU0FCTEUsCit9OworCitzdHJ1Y3QgdmVsb2NpdHlfb3B0IHsKKwlpbnQgbnVtcng7CQkJLyogTnVtYmVyIG9mIFJYIGRlc2NyaXB0b3JzICovCisJaW50IG51bXR4OwkJCS8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAqLworCWVudW0gc3BlZWRfb3B0IHNwZF9kcHg7CQkvKiBNZWRpYSBsaW5rIG1vZGUgKi8KKwlpbnQgdmlkOwkJCS8qIHZsYW4gaWQgKi8KKwlpbnQgRE1BX2xlbmd0aDsJCQkvKiBETUEgbGVuZ3RoICovCisJaW50IHJ4X3RocmVzaDsJCQkvKiBSWF9USFJFU0ggKi8KKwlpbnQgZmxvd19jbnRsOworCWludCB3b2xfb3B0czsJCQkvKiBXYWtlIG9uIGxhbiBvcHRpb25zICovCisJaW50IHRkX2ludF9jb3VudDsKKwlpbnQgaW50X3dvcmtzOworCWludCByeF9iYW5kd2lkdGhfaGk7CisJaW50IHJ4X2JhbmR3aWR0aF9sbzsKKwlpbnQgcnhfYmFuZHdpZHRoX2VuOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJZG1hX2FkZHJfdCByZF9wb29sX2RtYTsKKwlkbWFfYWRkcl90IHRkX3Bvb2xfZG1hW1RYX1FVRVVFX05PXTsKKworCWRtYV9hZGRyX3QgdHhfYnVmc19kbWE7CisJdTggKnR4X2J1ZnM7CisKKwl1OCBpcF9hZGRyWzRdOworCWVudW0gY2hpcF90eXBlIGNoaXBfaWQ7CisKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIG1hY19yZWdzOworCXVuc2lnbmVkIGxvbmcgbWVtYWRkcjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwl1MzIgaW9fc2l6ZTsKKworCXU4IHJldl9pZDsKKworI2RlZmluZSBBVkFJTF9URChwLHEpICAgKChwKS0+b3B0aW9ucy5udW10eC0oKHApLT50ZF91c2VkWyhxKV0pKQorCisJaW50IG51bV90eHE7CisKKwl2b2xhdGlsZSBpbnQgdGRfdXNlZFtUWF9RVUVVRV9OT107CisJaW50IHRkX2N1cnJbVFhfUVVFVUVfTk9dOworCWludCB0ZF90YWlsW1RYX1FVRVVFX05PXTsKKwlzdHJ1Y3QgdHhfZGVzYyAqdGRfcmluZ3NbVFhfUVVFVUVfTk9dOworCXN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICp0ZF9pbmZvc1tUWF9RVUVVRV9OT107CisKKwlpbnQgcmRfY3VycjsKKwlpbnQgcmRfZGlydHk7CisJdTMyIHJkX2ZpbGxlZDsKKwlzdHJ1Y3QgcnhfZGVzYyAqcmRfcmluZzsKKwlzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqcmRfaW5mbzsJLyogSXQncyBhbiBhcnJheSAqLworCisjZGVmaW5lIEdFVF9SRF9CWV9JRFgodnB0ciwgaWR4KSAgICh2cHRyLT5yZF9yaW5nW2lkeF0pCisJdTMyIG1pYl9jb3VudGVyW01BWF9IV19NSUJfQ09VTlRFUl07CisJc3RydWN0IHZlbG9jaXR5X29wdCBvcHRpb25zOworCisJdTMyIGludF9tYXNrOworCisJdTMyIGZsYWdzOworCisJaW50IHJ4X2J1Zl9zejsKKwl1MzIgbWlpX3N0YXR1czsKKwl1MzIgcGh5X2lkOworCWludCBtdWx0aWNhc3RfbGltaXQ7CisKKwl1OCB2Q0FNbWFza1soVkNBTV9TSVpFIC8gOCldOworCXU4IG1DQU1tYXNrWyhNQ0FNX1NJWkUgLyA4KV07CisKKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgd29sX29wdHM7CisJdTggd29sX3Bhc3N3ZFs2XTsKKworCXN0cnVjdCB2ZWxvY2l0eV9jb250ZXh0IGNvbnRleHQ7CisKKwl1MzIgdGlja3M7CisJdTMyIHJ4X2J5dGVzOworCit9OworCisvKioKKyAqCXZlbG9jaXR5X2dldF9pcAkJLQlmaW5kIGFuIElQIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UKKyAqCUB2cHRyOiBWZWxvY2l0eSB0byBxdWVyeQorICoKKyAqCURpZyBvdXQgYW4gSVAgYWRkcmVzcyBmb3IgdGhpcyBpbnRlcmZhY2Ugc28gdGhhdCB3ZSBjYW4KKyAqCWNvbmZpZ3VyZSB3YWtldXAgd2l0aCBXT0wgZm9yIEFSUC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIElQCisgKglhZGRyZXNzZXMgb24gdGhpcyBjaGFpbiB0aGVuIHdlIHVzZSB0aGUgZmlyc3QgLSBtdWx0aS1JUCBXT0wgaXMgbm90CisgKglzdXBwb3J0ZWQuCisgKgorICoJQ0hFQ0sgTUU6IGxvY2tpbmcKKyAqLworCitpbmxpbmUgc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfaXAoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gKHN0cnVjdCBpbl9kZXZpY2UgKikgdnB0ci0+ZGV2LT5pcF9wdHI7CisJc3RydWN0IGluX2lmYWRkciAqaWZhOworCisJaWYgKGluX2RldiAhPSBOVUxMKSB7CisJCWlmYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopIGluX2Rldi0+aWZhX2xpc3Q7CisJCWlmIChpZmEgIT0gTlVMTCkgeworCQkJbWVtY3B5KHZwdHItPmlwX2FkZHIsICZpZmEtPmlmYV9hZGRyZXNzLCA0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzCS0JZmV0Y2ggTUlCIGNvdW50ZXJzIGZyb20gY2hpcAorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHVwZGF0ZQorICoKKyAqCVRoZSB2ZWxvY2l0eSBoYXJkd2FyZSBrZWVwcyBjZXJ0YWluIGNvdW50ZXJzIGluIHRoZSBoYXJkd2FyZQorICogCXNpZGUuIFdlIG5lZWQgdG8gcmVhZCB0aGVzZSB3aGVuIHRoZSB1c2VyIGFza3MgZm9yIHN0YXRpc3RpY3MKKyAqCW9yIHdoZW4gdGhleSBvdmVyZmxvdyAoY2F1c2luZyBhbiBpbnRlcnJ1cHQpLiBUaGUgcmVhZCBvZiB0aGUKKyAqCXN0YXRpc3RpYyBjbGVhcnMgaXQsIHNvIHdlIGtlZXAgcnVubmluZyBtYXN0ZXIgY291bnRlcnMgaW4gdXNlcgorICoJc3BhY2UuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXUzMiB0bXA7CisJaW50IGk7CisJQllURV9SRUdfQklUU19PTihNSUJDUl9NSUJGTFNILCAmKHZwdHItPm1hY19yZWdzLT5NSUJDUikpOworCisJd2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlCQ1JfTUlCRkxTSCwgJih2cHRyLT5tYWNfcmVncy0+TUlCQ1IpKSk7CisKKwlCWVRFX1JFR19CSVRTX09OKE1JQkNSX01QVFJJTkksICYodnB0ci0+bWFjX3JlZ3MtPk1JQkNSKSk7CisJZm9yIChpID0gMDsgaSA8IEhXX01JQl9TSVpFOyBpKyspIHsKKwkJdG1wID0gcmVhZGwoJih2cHRyLT5tYWNfcmVncy0+TUlCRGF0YSkpICYgMHgwMEZGRkZGRlVMOworCQl2cHRyLT5taWJfY291bnRlcltpXSArPSB0bXA7CisJfQorfQorCisvKioKKyAqCWluaXRfZmxvd19jb250cm9sX3JlZ2lzdGVyIAktCXNldCB1cCBmbG93IGNvbnRyb2wKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBjb25maWd1cmUKKyAqCisgKglDb25maWd1cmUgdGhlIGZsb3cgY29udHJvbCByZWdpc3RlcnMgZm9yIHRoaXMgdmVsb2NpdHkgZGV2aWNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2Zsb3dfY29udHJvbF9yZWdpc3RlcihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKworCS8qIFNldCB7WEhJVEgxLCBYSElUSDAsIFhMVEgxLCBYTFRIMH0gaW4gRmxvd0NSMSB0byB7MSwgMCwgMSwgMX0KKwkgICBkZXBlbmQgb24gUkQ9NjQsIGFuZCBUdXJuIG9uIFhOT0VOIGluIEZsb3dDUjEgKi8KKwl3cml0ZWwoKENSMF9YT05FTiB8IENSMF9YSElUSDEgfCBDUjBfWExUSDEgfCBDUjBfWExUSDApLCAmcmVncy0+Q1IwU2V0KTsKKwl3cml0ZWwoKENSMF9GRFhURkNFTiB8IENSMF9GRFhSRkNFTiB8IENSMF9IRFhGQ0VOIHwgQ1IwX1hISVRIMCksICZyZWdzLT5DUjBDbHIpOworCisJLyogU2V0IFR4UGF1c2VUaW1lciB0byAweEZGRkYgKi8KKwl3cml0ZXcoMHhGRkZGLCAmcmVncy0+dHhfcGF1c2VfdGltZXIpOworCisJLyogSW5pdGlhbGl6ZSBSQlJEVSB0byBSeCBidWZmZXIgY291bnQuICovCisJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtcngsICZyZWdzLT5SQlJEVSk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzkxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpAQCAtMCwwICsxLDYwNyBAQAorIworIyB3YW4gZGV2aWNlcyBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIldhbiBpbnRlcmZhY2VzIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCitjb25maWcgV0FOCisJYm9vbCAiV2FuIGludGVyZmFjZXMgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBXaWRlIEFyZWEgTmV0d29ya3MgKFdBTnMpLCBzdWNoIGFzIFguMjUsIEZyYW1lIFJlbGF5IGFuZCBsZWFzZWQKKwkgIGxpbmVzLCBhcmUgdXNlZCB0byBpbnRlcmNvbm5lY3QgTG9jYWwgQXJlYSBOZXR3b3JrcyAoTEFOcykgb3ZlciB2YXN0CisJICBkaXN0YW5jZXMgd2l0aCBkYXRhIHRyYW5zZmVyIHJhdGVzIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gdGhvc2UKKwkgIGFjaGlldmFibGUgd2l0aCBjb21tb25seSB1c2VkIGFzeW5jaHJvbm91cyBtb2RlbSBjb25uZWN0aW9ucy4KKworCSAgVXN1YWxseSwgYSBxdWl0ZSBleHBlbnNpdmUgZXh0ZXJuYWwgZGV2aWNlIGNhbGxlZCBhIGBXQU4gcm91dGVyJyBpcworCSAgbmVlZGVkIHRvIGNvbm5lY3QgdG8gYSBXQU4uIEFzIGFuIGFsdGVybmF0aXZlLCBhIHJlbGF0aXZlbHkKKwkgIGluZXhwZW5zaXZlIFdBTiBpbnRlcmZhY2UgY2FyZCBjYW4gYWxsb3cgeW91ciBMaW51eCBib3ggdG8gZGlyZWN0bHkKKwkgIGNvbm5lY3QgdG8gYSBXQU4uCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSBjYXJkcyBhbmQgd2lzaCB0byB1c2UgaXQgdW5kZXIgTGludXgsCisJICBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZSBXQU4gZHJpdmVyIGZvciB5b3VyIGNhcmQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBhIGNvbXRyb2wgc3YxMSAtIGZvcmNlIGl0IG1vZHVsYXIgZm9yIG5vdy4KK2NvbmZpZyBIT1NURVNTX1NWMTEKKwl0cmlzdGF0ZSAiQ29tdHJvbCBIb3N0ZXNzIFNWLTExIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4gJiYgSVNBICYmIG0KKwloZWxwCisJICBEcml2ZXIgZm9yIENvbXRyb2wgSG9zdGVzcyBTVi0xMSBuZXR3b3JrIGNhcmQgd2hpY2gKKwkgIG9wZXJhdGVzIG9uIGxvdyBzcGVlZCBzeW5jaHJvbm91cyBzZXJpYWwgbGlua3MgYXQgdXAgdG8KKwkgIDI1NkticHMsIHN1cHBvcnRpbmcgUFBQIGFuZCBDaXNjbyBIRExDLgorCisJICBUaGUgZHJpdmVyIHdpbGwgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhvc3Rlc3Nfc3YxMS4KKworIyBUaGUgQ09TQS9TUlAgZHJpdmVyIGhhcyBub3QgYmVlbiB0ZXN0ZWQgYXMgbm9uLW1vZHVsYXIgeWV0LgorY29uZmlnIENPU0EKKwl0cmlzdGF0ZSAiQ09TQS9TUlAgc3luYyBzZXJpYWwgYm9hcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4gJiYgSVNBICYmIG0KKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIENPU0EgYW5kIFNSUCBzeW5jaHJvbm91cyBzZXJpYWwgYm9hcmRzLgorCisJICBUaGVzZSBib2FyZHMgYWxsb3cgdG8gY29ubmVjdCBzeW5jaHJvbm91cyBzZXJpYWwgZGV2aWNlcyAoZm9yIGV4YW1wbGUKKwkgIGJhc2UtYmFuZCBtb2RlbXMsIG9yIGFueSBvdGhlciBkZXZpY2Ugd2l0aCB0aGUgWC4yMSwgVi4yNCwgVi4zNSBvcgorCSAgVi4zNiBpbnRlcmZhY2UpIHRvIHlvdXIgTGludXggYm94LiBUaGUgY2FyZHMgY2FuIHdvcmsgYXMgdGhlCisJICBjaGFyYWN0ZXIgZGV2aWNlLCBzeW5jaHJvbm91cyBQUFAgbmV0d29yayBkZXZpY2UsIG9yIHRoZSBDaXNjbyBIRExDCisJICBuZXR3b3JrIGRldmljZS4KKworCSAgWW91IHdpbGwgbmVlZCB1c2VyLXNwYWNlIHV0aWxpdGllcyBDT1NBIG9yIFNSUCBib2FyZHMgZm9yIGRvd25sb2FkaW5nCisgCSAgdGhlIGZpcm13YXJlIHRvIHRoZSBjYXJkcyBhbmQgdG8gc2V0IHRoZW0gdXAuIExvb2sgYXQgdGhlCisJICA8aHR0cDovL3d3dy5maS5tdW5pLmN6L35rYXMvY29zYS8+IGZvciBtb3JlIGluZm9ybWF0aW9uLiBZb3UgY2FuIGFsc28KKwkgIHJlYWQgdGhlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgPGZpbGU6ZHJpdmVycy9uZXQvd2FuL2Nvc2EuYz4gZm9yCisJICBkZXRhaWxzIGFib3V0IHRoZSBjYXJkcyBhbmQgdGhlIGRyaXZlciBpdHNlbGYuCisKKwkgIFRoZSBkcml2ZXIgd2lsbCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29zYS4KKworY29uZmlnIERTQ0M0CisJdHJpc3RhdGUgIkV0aW5jIFBDSVNZTkMgc2VyaWFsIGJvYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4gJiYgUENJICYmIG0KKwloZWxwCisJICBEcml2ZXIgZm9yIEV0aW5jIFBDSVNZTkMgYm9hcmRzIGJhc2VkIG9uIHRoZSBJbmZpbmVvbiAoZXguIFNpZW1lbnMpCisJICBEU0NDNCBjaGlwc2V0LgorCisJICBUaGlzIGlzIHN1cHBvc2VkIHRvIHdvcmsgd2l0aCB0aGUgZm91ciBwb3J0IGNhcmQuIFRha2UgYSBsb29rIGF0CisJICA8aHR0cDovL3d3dy5jb2dlbml0LmZyL2RzY2M0Lz4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisJICBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRzY2M0LgorCitjb25maWcgRFNDQzRfUENJU1lOQworCWJvb2wgIkV0aW5jIFBDSVNZTkMgZmVhdHVyZXMiCisJZGVwZW5kcyBvbiBEU0NDNAorCWhlbHAKKwkgIER1ZSB0byBFdGluYydzIGRlc2lnbiBjaG9pY2UgZm9yIGl0cyBQQ0lTWU5DIGNhcmRzLCBzb21lIG9wZXJhdGlvbnMKKwkgIGFyZSBvbmx5IGFsbG93ZWQgb24gc3BlY2lmaWMgcG9ydHMgb2YgdGhlIERTQ0M0LiBUaGlzIG9wdGlvbiBpcyB0aGUKKwkgIG9ubHkgd2F5IGZvciB0aGUgZHJpdmVyIHRvIGtub3cgdGhhdCBpdCBzaG91bGRuJ3QgcmV0dXJuIGEgc3VjY2VzcworCSAgY29kZSBmb3IgdGhlc2Ugb3BlcmF0aW9ucy4KKworCSAgUGxlYXNlIHNheSBZIGlmIHlvdXIgY2FyZCBpcyBhbiBFdGluYydzIFBDSVNZTkMuCisKK2NvbmZpZyBEU0NDNF9QQ0lfUlNUCisJYm9vbCAiSGFyZCByZXNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFNDQzQKKwloZWxwCisJICBWYXJpb3VzIERTQ0M0IGJ1Z3MgZm9yYmlkIGFueSByZWxpYWJsZSBzb2Z0d2FyZSByZXNldCBvZiB0aGUgQVNJQy4KKwkgIEFzIGEgcmVwbGFjZW1lbnQsIHNvbWUgdmVuZG9ycyBwcm92aWRlIGEgd2F5IHRvIGFzc2VydCB0aGUgUENJICNSU1QKKwkgIHBpbiBvZiBEU0NDNCB0aHJvdWdoIHRoZSBHUElPIHBvcnQgb2YgdGhlIGNhcmQuIElmIHlvdSBjaG9vc2UgWSwKKwkgIHRoZSBkcml2ZXIgd2lsbCBtYWtlIHVzZSBvZiB0aGlzIGZlYXR1cmUgYmVmb3JlIG1vZHVsZSByZW1vdmFsCisJICAoaS5lLiBybW1vZCkuIFRoZSBmZWF0dXJlIGlzIGtub3duIHRvIGJlIGF2YWlsYWJsZSBvbiBDb21tdGVjaCdzCisJICBjYXJkcy4gQ29udGFjdCB5b3VyIG1hbnVmYWN0dXJlciBmb3IgZGV0YWlscy4KKworCSAgU2F5IFkgaWYgeW91ciBjYXJkIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KKworIworIyBMYW4gTWVkaWEncyBib2FyZC4gQ3VycmVudGx5IDEwMDAsIDEyMDAsIDUyMDAsIDUyNDUKKyMKK2NvbmZpZyBMQU5NRURJQQorCXRyaXN0YXRlICJMYW5NZWRpYSBDb3JwLiBTU0kvVi4zNSwgVDEvRTEsIEhTU0ksIFQzIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFdBTiAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIHRoZSBmb2xsb3dpbmcgTGFuIE1lZGlhIGZhbWlseSBvZiBzZXJpYWwgYm9hcmRzOgorCisJICAtIExNQyAxMDAwIGJvYXJkIGFsbG93cyB5b3UgdG8gY29ubmVjdCBzeW5jaHJvbm91cyBzZXJpYWwgZGV2aWNlcworCSAgKGZvciBleGFtcGxlIGJhc2UtYmFuZCBtb2RlbXMsIG9yIGFueSBvdGhlciBkZXZpY2Ugd2l0aCB0aGUgWC4yMSwKKwkgIFYuMjQsIFYuMzUgb3IgVi4zNiBpbnRlcmZhY2UpIHRvIHlvdXIgTGludXggYm94LgorCisJICAtIExNQyAxMjAwIHdpdGggb24gYm9hcmQgRFNVIGJvYXJkIGFsbG93cyB5b3UgdG8gY29ubmVjdCB5b3VyIExpbnV4CisJICBib3ggZGlyZWN0bHkgdG8gYSBUMSBvciBFMSBjaXJjdWl0LgorCisJICAtIExNQyA1MjAwIGJvYXJkIHByb3ZpZGVzIGEgSFNTSSBpbnRlcmZhY2UgY2FwYWJsZSBvZiBydW5uaW5nIHVwIHRvCisJICA1MiBNYml0cyBwZXIgc2Vjb25kLgorCisJICAtIExNQyA1MjQ1IGJvYXJkIGNvbm5lY3RzIGRpcmVjdGx5IHRvIGEgVDMgY2lyY3VpdCBzYXZpbmcgdGhlCisJICBhZGRpdGlvbmFsIGV4dGVybmFsIGhhcmR3YXJlLgorCisJICBUbyBjaGFuZ2Ugc2V0dGluZyBzdWNoIGFzIHN5bmNQUFAgdnMgQ2lzY28gSERMQyBvciBjbG9jayBzb3VyY2UgeW91CisJICB3aWxsIG5lZWQgbG1jY3RsLiAgSXQgaXMgYXZhaWxhYmxlIGF0IDxmdHA6Ly9mdHAubGFubWVkaWEuY29tLz4KKwkgIChicm9rZW4gbGluaykuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxtYy4KKworIyBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IGEgU2VhbGV2ZWwgYm9hcmQuIEZvcmNlIGl0IG1vZHVsYXIKK2NvbmZpZyBTRUFMRVZFTF80MDIxCisJdHJpc3RhdGUgIlNlYWxldmVsIFN5c3RlbXMgNDAyMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNlYWxldmVsIFN5c3RlbXMgQUNCIDU2IHNlcmlhbCBJL08gYWRhcHRlci4KKworCSAgVGhlIGRyaXZlciB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZWFsZXZlbC4KKworY29uZmlnIFNZTkNMSU5LX1NZTkNQUFAKKwl0cmlzdGF0ZSAiU3luY0xpbmsgSERMQy9TWU5DUFBQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4KKwloZWxwCisJICBFbmFibGVzIEhETEMvU1lOQ1BQUCBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgV0FOIGRyaXZlci4KKworCSAgTm9ybWFsbHkgdGhlIFN5bmNMaW5rIFdBTiBkcml2ZXIgd29ya3Mgd2l0aCB0aGUgbWFpbiBQUFAgZHJpdmVyCisJICA8ZmlsZTpkcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jPiBhbmQgcHBwZCBwcm9ncmFtLgorCSAgSERMQy9TWU5DUFBQIHN1cHBvcnQgYWxsb3dzIHVzZSBvZiB0aGUgQ2lzY28gSERMQy9QUFAgZHJpdmVyCisJICA8ZmlsZTpkcml2ZXJzL25ldC93YW4vc3luY3BwcC5jPi4gVGhlIFN5bmNMaW5rIFdBTiBkcml2ZXIgKGluCisJICBjaGFyYWN0ZXIgZGV2aWNlcykgbXVzdCBhbHNvIGJlIGVuYWJsZWQuCisKKyMgR2VuZXJpYyBIRExDCitjb25maWcgSERMQworCXRyaXN0YXRlICJHZW5lcmljIEhETEMgbGF5ZXIiCisJZGVwZW5kcyBvbiBXQU4KKwloZWxwCisJICBTYXkgWSB0byB0aGlzIG9wdGlvbiBpZiB5b3VyIExpbnV4IGJveCBjb250YWlucyBhIFdBTiAoV2lkZSBBcmVhCisJICBOZXR3b3JrKSBjYXJkIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciBhbmQgeW91IGFyZSBwbGFubmluZyB0bworCSAgY29ubmVjdCB0aGUgYm94IHRvIGEgV0FOLgorCisJICBZb3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgZnJvbQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKwkgIEdlbmVyaWMgSERMQyBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHJhdyBIRExDLCBDaXNjbyBIRExDLCBGcmFtZQorCSAgUmVsYXksIHN5bmNocm9ub3VzIFBvaW50LXRvLVBvaW50IFByb3RvY29sIChQUFApIGFuZCBYLjI1LgorCisgCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaGRsYy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfUkFXCisJYm9vbCAiUmF3IEhETEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgcmF3IEhETEMgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX1JBV19FVEgKKwlib29sICJSYXcgSERMQyBFdGhlcm5ldCBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgcmF3IEhETEMgRXRoZXJuZXQgZGV2aWNlIGVtdWxhdGlvbgorCSAgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIFlvdSB3aWxsIG5lZWQgaXQgZm9yIEV0aGVybmV0IG92ZXIgSERMQyBicmlkZ2VzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSERMQ19DSVNDTworCWJvb2wgIkNpc2NvIEhETEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgQ2lzY28gSERMQyBvdmVyIFdBTiBjb25uZWN0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfRlIKKwlib29sICJGcmFtZSBSZWxheSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQworCWhlbHAKKwkgIEdlbmVyaWMgSERMQyBkcml2ZXIgc3VwcG9ydGluZyBGcmFtZSBSZWxheSBvdmVyIFdBTiBjb25uZWN0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfUFBQCisJYm9vbCAiU3luY2hyb25vdXMgUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgKFBQUCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgUFBQIG92ZXIgV0FOIGNvbm5lY3Rpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSERMQ19YMjUKKwlib29sICJYLjI1IHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIChMQVBCPW0gJiYgSERMQz1tIHx8IExBUEI9eSkKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgWC4yNSBvdmVyIFdBTiBjb25uZWN0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiWC4yNS9MQVBCIHN1cHBvcnQgaXMgZGlzYWJsZWQiCisJZGVwZW5kcyBvbiBXQU4gJiYgSERMQyAmJiAoTEFQQiE9bSB8fCBIRExDIT1tKSAmJiBMQVBCIT15CisKK2NvbmZpZyBQQ0kyMDBTWU4KKwl0cmlzdGF0ZSAiR29yYW1vIFBDSTIwMFNZTiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kKKwloZWxwCisJICBEcml2ZXIgZm9yIFBDSTIwMFNZTiBjYXJkcyBieSBHb3JhbW8gc3AuIGouCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYSBjYXJkLCBzYXkgWSBoZXJlIGFuZCBzZWUKKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNpMjAwc3luLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgV0FOWEwKKwl0cmlzdGF0ZSAiU0JFIEluYy4gd2FuWEwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMgJiYgUENJCisJaGVscAorCSAgRHJpdmVyIGZvciB3YW5YTCBQQ0kgY2FyZHMgYnkgU0JFIEluYy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZIGhlcmUgYW5kIHNlZQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW54bC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFdBTlhMX0JVSUxEX0ZJUk1XQVJFCisJYm9vbCAicmVidWlsZCB3YW5YTCBmaXJtd2FyZSIKKwlkZXBlbmRzIG9uIFdBTlhMICYmICFQUkVWRU5UX0ZJUk1XQVJFX0JVSUxECisJaGVscAorCSAgQWxsb3dzIHlvdSB0byByZWJ1aWxkIGZpcm13YXJlIHJ1biBieSB0aGUgUVVJQ0MgcHJvY2Vzc29yLgorCSAgSXQgcmVxdWlyZXMgYXM2OGssIGxkNjhrIGFuZCBoZXhkdW1wIHByb2dyYW1zLgorCisJICBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdGhpcyBvcHRpb24sIHNheSBOLgorCitjb25maWcgUEMzMDAKKwl0cmlzdGF0ZSAiQ3ljbGFkZXMtUEMzMDAgc3VwcG9ydCAoUlMtMjMyL1YuMzUsIFguMjEsIFQxL0UxIGJvYXJkcykiCisJZGVwZW5kcyBvbiBIRExDICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3IgdGhlIEN5Y2xhZGVzLVBDMzAwIHN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gYm9hcmRzLgorCisJICBUaGVzZSBib2FyZHMgcHJvdmlkZSBzeW5jaHJvbm91cyBzZXJpYWwgaW50ZXJmYWNlcyB0byB5b3VyCisJICBMaW51eCBib3ggKGludGVyZmFjZXMgY3VycmVudGx5IGF2YWlsYWJsZSBhcmUgUlMtMjMyL1YuMzUsIFguMjEgYW5kCisJICBUMS9FMSkuIElmIHlvdSB3aXNoIHRvIHN1cHBvcnQgTXVsdGlsaW5rIFBQUCwgcGxlYXNlIHNlbGVjdCB0aGUKKwkgIG9wdGlvbiBsYXRlciBhbmQgcmVhZCB0aGUgZmlsZSBSRUFETUUubWxwcHAgcHJvdmlkZWQgYnkgUEMzMDAKKwkgIHBhY2thZ2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGMzMDAuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQzMwMF9NTFBQUAorCWJvb2wgIkN5Y2xhZGVzLVBDMzAwIE1MUFBQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQzMwMCAmJiBQUFBfTVVMVElMSU5LICYmIFBQUF9TWU5DX1RUWSAmJiBIRExDX1BQUAorCWhlbHAKKwkgIE11bHRpbGluayBQUFAgb3ZlciB0aGUgUEMzMDAgc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBib2FyZHMuCisKK2NvbW1lbnQgIkN5Y2xhZGVzLVBDMzAwIE1MUFBQIHN1cHBvcnQgaXMgZGlzYWJsZWQuIgorCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgUEMzMDAgJiYgKFBQUD1uIHx8ICFQUFBfTVVMVElMSU5LIHx8IFBQUF9TWU5DX1RUWT1uIHx8ICFIRExDX1BQUCkKKworY29tbWVudCAiUmVmZXIgdG8gdGhlIGZpbGUgUkVBRE1FLm1scHBwLCBwcm92aWRlZCBieSBQQzMwMCBwYWNrYWdlLiIKKwlkZXBlbmRzIG9uIFdBTiAmJiBIRExDICYmIFBDMzAwICYmIChQUFA9biB8fCAhUFBQX01VTFRJTElOSyB8fCBQUFBfU1lOQ19UVFk9biB8fCAhSERMQ19QUFApCisKK2NvbmZpZyBOMgorCXRyaXN0YXRlICJTREwgUklTQ29tL04yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIElTQQorCWhlbHAKKwkgIERyaXZlciBmb3IgUklTQ29tL04yIHNpbmdsZSBvciBkdWFsIGNoYW5uZWwgSVNBIGNhcmRzIGJ5CisJICBTREwgQ29tbXVuaWNhdGlvbnMgSW5jLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGEgY2FyZCwgc2F5IFkgaGVyZSBhbmQgc2VlCisJICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9uZXQvaGRsYy8+LgorCisJICBOb3RlIHRoYXQgTjJjc3UgYW5kIE4yZGRzIGNhcmRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuMi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEMxMDEKKwl0cmlzdGF0ZSAiTW94YSBDMTAxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIElTQQorCWhlbHAKKwkgIERyaXZlciBmb3IgQzEwMSBTdXBlclN5bmMgSVNBIGNhcmRzIGJ5IE1veGEgVGVjaG5vbG9naWVzIENvLiwgTHRkLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGEgY2FyZCwgc2F5IFkgaGVyZSBhbmQgc2VlCisJICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9uZXQvaGRsYy8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjMTAxLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRkFSU1lOQworCXRyaXN0YXRlICJGYXJTeW5jIFQtU2VyaWVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBGYXJTeW5jIFQtU2VyaWVzIFguMjEgKGFuZCBWLjM1L1YuMjQpIGNhcmRzIGJ5CisJICBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KKworCSAgU3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYWxsIHBvcnRzIGF0IHNwZWVkcyB1cCB0bworCSAgOE1iL3MgKDEyOEsgb24gVi4yNCkgdXNpbmcgc3luY2hyb25vdXMgUFBQLCBDaXNjbyBIRExDLCByYXcgSERMQywKKwkgIEZyYW1lIFJlbGF5IG9yIFguMjUvTEFQQi4KKworCSAgSWYgeW91IHdhbnQgdGhlIG1vZHVsZSB0byBiZSBhdXRvbWF0aWNhbGx5IGxvYWRlZCB3aGVuIHRoZSBpbnRlcmZhY2UKKwkgIGlzIHJlZmVyZW5jZWQgdGhlbiB5b3Ugc2hvdWxkIGFkZCAiYWxpYXMgaGRsY1ggZmFyc3luYyIgdG8KKwkgIC9ldGMvbW9kcHJvYmUuY29uZiBmb3IgZWFjaCBpbnRlcmZhY2UsIHdoZXJlIFggaXMgMCwgMSwgMiwgLi4uLCBvcgorCSAgc2ltcGx5IHVzZSAiYWxpYXMgaGRsYyogZmFyc3luYyIgdG8gaW5kaWNhdGUgYWxsIG9mIHRoZW0uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGZhcnN5bmMuCisKK2NvbmZpZyBETENJCisJdHJpc3RhdGUgIkZyYW1lIFJlbGF5IERMQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFdBTgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBGcmFtZSBSZWxheSBwcm90b2NvbC4KKworCSAgRnJhbWUgUmVsYXkgaXMgYSBmYXN0IGxvdy1jb3N0IHdheSB0byBjb25uZWN0IHRvIGEgcmVtb3RlIEludGVybmV0CisJICBhY2Nlc3MgcHJvdmlkZXIgb3IgdG8gZm9ybSBhIHByaXZhdGUgd2lkZSBhcmVhIG5ldHdvcmsuIFRoZSBvbmUKKwkgIHBoeXNpY2FsIGxpbmUgZnJvbSB5b3VyIGJveCB0byB0aGUgbG9jYWwgInN3aXRjaCIgKGkuZS4gdGhlIGVudHJ5CisJICBwb2ludCB0byB0aGUgRnJhbWUgUmVsYXkgbmV0d29yaywgdXN1YWxseSBhdCB0aGUgcGhvbmUgY29tcGFueSkgY2FuCisJICBjYXJyeSBzZXZlcmFsIGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbnMgdG8gb3RoZXIgY29tcHV0ZXJzCisJICBjb25uZWN0ZWQgdG8gdGhlIEZyYW1lIFJlbGF5IG5ldHdvcmsuIEZvciBhIGdlbmVyYWwgZXhwbGFuYXRpb24gb2YKKwkgIHRoZSBwcm90b2NvbCwgY2hlY2sgb3V0IDxodHRwOi8vd3d3Lm1wbHNmb3J1bS5vcmcvPi4KKworCSAgVG8gdXNlIGZyYW1lIHJlbGF5LCB5b3UgbmVlZCBzdXBwb3J0aW5nIGhhcmR3YXJlIChjYWxsZWQgRlJBRCkgYW5kCisJICBjZXJ0YWluIHByb2dyYW1zIGZyb20gdGhlIG5ldC10b29scyBwYWNrYWdlIGFzIGV4cGxhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZyYW1lcmVsYXkudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGxjaS4KKworY29uZmlnIERMQ0lfQ09VTlQKKwlpbnQgIk1heCBvcGVuIERMQ0kiCisJZGVwZW5kcyBvbiBETENJCisJZGVmYXVsdCAiMjQiCisJaGVscAorCSAgTWF4aW1hbCBudW1iZXIgb2YgbG9naWNhbCBwb2ludC10by1wb2ludCBmcmFtZSByZWxheSBjb25uZWN0aW9ucworCSAgKHRoZSBpZGVudGlmaWVycyBvZiB3aGljaCBhcmUgY2FsbGVkIERDTElzKSB0aGF0IHRoZSBkcml2ZXIgY2FuCisJICBoYW5kbGUuCisKKwkgIFRoZSBkZWZhdWx0IGlzIHByb2JhYmx5IGZpbmUuCisKK2NvbmZpZyBETENJX01BWAorCWludCAiTWF4IERMQ0kgcGVyIGRldmljZSIKKwlkZXBlbmRzIG9uIERMQ0kKKwlkZWZhdWx0ICI4IgorCWhlbHAKKwkgIEhvdyBtYW55IGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgZnJhbWUgcmVsYXkgY29ubmVjdGlvbnMgKHRoZQorCSAgaWRlbnRpZmllcnMgb2Ygd2hpY2ggYXJlIGNhbGxlZCBEQ0xJcykgc2hvdWxkIGJlIGhhbmRsZWQgYnkgZWFjaAorCSAgb2YgeW91ciBoYXJkd2FyZSBmcmFtZSByZWxheSBhY2Nlc3MgZGV2aWNlcy4KKworCSAgR28gd2l0aCB0aGUgZGVmYXVsdC4KKworY29uZmlnIFNETEEKKwl0cmlzdGF0ZSAiU0RMQSAoU2FuZ29tYSBTNTAyL1M1MDgpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBETENJICYmIElTQQorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIFNhbmdvbWEgUzUwMkEsIFM1MDJFLCBhbmQgUzUwOCBGcmFtZSBSZWxheSBBY2Nlc3MKKwkgIERldmljZXMuCisKKwkgIFRoZXNlIGFyZSBtdWx0aS1wcm90b2NvbCBjYXJkcywgYnV0IG9ubHkgRnJhbWUgUmVsYXkgaXMgc3VwcG9ydGVkCisJICBieSB0aGUgZHJpdmVyIGF0IHRoaXMgdGltZS4gUGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9mcmFtZXJlbGF5LnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNkbGEuCisKKyMgV2FuIHJvdXRlciBjb3JlLgorY29uZmlnIFdBTl9ST1VURVJfRFJJVkVSUworCWJvb2wgIldBTiByb3V0ZXIgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFdBTiAmJiBXQU5fUk9VVEVSCisJLS0taGVscC0tLQorCSAgQ29ubmVjdCBMQU4gdG8gV0FOIHZpYSBMaW51eCBib3guCisKKwkgIFNlbGVjdCBkcml2ZXIgeW91ciBjYXJkIGFuZCByZW1lbWJlciB0byBzYXkgWSB0byAiV2FuIFJvdXRlci4iCisJICBZb3Ugd2lsbCBuZWVkIHRoZSB3YW4tdG9vbHMgcGFja2FnZSB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWFkOgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0Pi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IFdBTiByb3V0ZXIgZHJpdmVycy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFZFTkRPUl9TQU5HT01BCisJdHJpc3RhdGUgIlNhbmdvbWEgV0FOUElQRSh0bSkgbXVsdGlwcm90b2NvbCBjYXJkcyIKKwlkZXBlbmRzIG9uIFdBTl9ST1VURVJfRFJJVkVSUyAmJiBXQU5fUk9VVEVSICYmIChQQ0kgfHwgSVNBKSAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIFM1MTQtUENJL0lTQSBTeW5jaHJvbm91cyBEYXRhIExpbmsgQWRhcHRlcnMgKFNETEEpLgorCisJICBXQU5QSVBFIGZyb20gU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLiA8aHR0cDovL3d3dy5zYW5nb21hLmNvbS8+CisJICBpcyBhIGZhbWlseSBvZiBpbnRlbGxpZ2VudCBtdWx0aXByb3RvY29sIFdBTiBhZGFwdGVycyB3aXRoIGRhdGEKKwkgIHRyYW5zZmVyIHJhdGVzIHVwIHRvIDRNYnBzLiBDYXJkcyBzdXBwb3J0OgorCisJICAtIFguMjUsIEZyYW1lIFJlbGF5LCBQUFAsIENpc2NvIEhETEMgcHJvdG9jb2xzLgorCisJICAtIEFQSSBmb3IgcHJvdG9jb2xzIGxpa2UgSERMQyAoTEFQQiksIEhETEMgU3RyZWFtaW5nLCBYLjI1LAorCSAgRnJhbWUgUmVsYXkgYW5kIEJpU3luYy4KKworCSAgLSBFdGhlcm5ldCBCcmlkZ2luZyBvdmVyIEZyYW1lIFJlbGF5IHByb3RvY29sLgorCisJICAtIE1VTFRJTElOSyBQUFAKKworCSAgLSBBc3luYyBQUFAgKE1vZGVtIERpYWx1cCkKKworCSAgVGhlIG5leHQgcXVlc3Rpb25zIHdpbGwgYXNrIHlvdSBhYm91dCB0aGUgcHJvdG9jb2xzIHlvdSB3YW50CisJICB0aGUgZHJpdmVyIHRvIHN1cHBvcnQuCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhcmRzLCBzYXkgTSB0byB0aGlzIG9wdGlvbjsKKwkgIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW5waXBlLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhbnBpcGUuCisKK2NvbmZpZyBXQU5QSVBFX0NIRExDCisJYm9vbCAiV0FOUElQRSBDaXNjbyBIRExDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWRU5ET1JfU0FOR09NQQorCS0tLWhlbHAtLS0KKwkgIENvbm5lY3QgYSBXQU5QSVBFIGNhcmQgdG8gYSBsZWFzZWQgbGluZSB1c2luZyB0aGUgQ2lzY28gSERMQy4KKworCSAgLSBTdXBwb3J0cyBEdWFsIFBvcnQgQ2lzY28gSERMQyBvbiB0aGUgUzUxNC1QQ0kvUzUwOC1JU0EgY2FyZHMKKwkgIHdoaWNoIGFsbG93cyB1c2VyIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgSERMQyBzdHJlYW1pbmcgQVBJLgorCisJICAtIENIRExDIFN0cmVhbWluZyBNVUxUSUxJTksgUFBQIHRoYXQgY2FuIGJpbmQgbXVsdGlwbGUgV0FOUElQRSBUMQorCSAgY2FyZHMgaW50byBhIHNpbmdsZSBsb2dpY2FsIGNoYW5uZWwuCisKKwkgIFNheSBZIGFuZCB0aGUgQ2lzY28gSERMQyBzdXBwb3J0LCBIRExDIHN0cmVhbWluZyBBUEkgYW5kCisJICBNVUxUSUxJTksgUFBQIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlci4KKworY29uZmlnIFdBTlBJUEVfRlIKKwlib29sICJXQU5QSVBFIEZyYW1lIFJlbGF5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWRU5ET1JfU0FOR09NQQorCWhlbHAKKwkgIENvbm5lY3QgYSBXQU5QSVBFIGNhcmQgdG8gYSBGcmFtZSBSZWxheSBuZXR3b3JrLCBvciB1c2UgRnJhbWUgRmVsYXkKKwkgIEFQSSB0byBkZXZlbG9wIGN1c3RvbSBhcHBsaWNhdGlvbnMuCisKKwkgIENvbnRhaW5zIHRoZSBFdGhlcm5ldCBCcmlkZ2luZyBvdmVyIEZyYW1lIFJlbGF5IGZlYXR1cmUsIHdoZXJlCisJICBhIFdBTlBJUEUgZnJhbWUgcmVsYXkgbGluayBjYW4gYmUgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBMaW51eAorCSAga2VybmVsIGJyaWRnZS4gVGhlIEZyYW1lIFJlbGF5IG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kKKwkgIGFuZCBTNTA4LUlTQSBjYXJkcy4KKworCSAgU2F5IFkgYW5kIHRoZSBGcmFtZSBSZWxheSBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlci4KKworY29uZmlnIFdBTlBJUEVfWDI1CisJYm9vbCAiV0FOUElQRSBYLjI1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWRU5ET1JfU0FOR09NQQorCWhlbHAKKwkgIENvbm5lY3QgYSBXQU5QSVBFIGNhcmQgdG8gYW4gWC4yNSBuZXR3b3JrLgorCisJICBJbmNsdWRlcyB0aGUgWC4yNSBBUEkgc3VwcG9ydCBmb3IgY3VzdG9tIGFwcGxpY2F0aW9ucyBvdmVyIHRoZQorCSAgWC4yNSBwcm90b2NvbC4gVGhlIFguMjUgb3B0aW9uIGlzIHN1cHBvcnRlZCBvbiBTNTE0LVBDSSBhbmQKKwkgIFM1MDgtSVNBIGNhcmRzLgorCisJICBTYXkgWSBhbmQgdGhlIFguMjUgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX1BQUAorCWJvb2wgIldBTlBJUEUgUFBQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWRU5ET1JfU0FOR09NQQorCWhlbHAKKwkgIENvbm5lY3QgYSBXQU5QSVBFIGNhcmQgdG8gYSBsZWFzZWQgbGluZSB1c2luZyBQb2ludC10by1Qb2ludAorCSAgUHJvdG9jb2wgKFBQUCkuCisKKwkgIFRoZSBQUFAgb3B0aW9uIGlzIHN1cHBvcnRlZCBvbiBTNTE0LVBDSS9TNTA4LUlTQSBjYXJkcy4KKworCSAgU2F5IFkgYW5kIHRoZSBQUFAgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX01VTFRQUFAKKwlib29sICJXQU5QSVBFIE11bHRpLVBvcnQgUFBQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWRU5ET1JfU0FOR09NQQorCWhlbHAKKwkgIENvbm5lY3QgYSBXQU5QSVBFIGNhcmQgdG8gYSBsZWFzZWQgbGluZSB1c2luZyBQb2ludC10by1Qb2ludAorCSAgUHJvdG9jb2wgKFBQUCkuCisKKwkgIFVzZXMgaW4ta2VybmVsIFN5bmNQUFAgcHJvdG9jb2wgb3ZlciB0aGUgU2FuZ29tYSBIRExDIFN0cmVhbWluZworCSAgYWRhcHRlci4gSW4gdGhpcyBjYXNlIGVhY2ggU2FuZ29tYSBhZGFwdGVyIHBvcnQgY2FuIHN1cHBvcnQgYW4KKwkgIGluZGVwZW5kZW50IFBQUCBjb25uZWN0aW9uLiBGb3IgZXhhbXBsZSwgYSBzaW5nbGUgUXVhZC1Qb3J0IFBDSQorCSAgYWRhcHRlciBjYW4gc3VwcG9ydCB1cCB0byBmb3VyIGluZGVwZW5kZW50IFBQUCBsaW5rcy4gVGhlIFBQUAorCSAgb3B0aW9uIGlzIHN1cHBvcnRlZCBvbiBTNTE0LVBDSS9TNTA4LUlTQSBjYXJkcy4KKworCSAgU2F5IFkgYW5kIHRoZSBNdWx0aS1Qb3J0IFBQUCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlci4KKworY29uZmlnIENZQ0xBREVTX1NZTkMKKwl0cmlzdGF0ZSAiQ3ljbG9tIDJYKHRtKSBjYXJkcyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFdBTl9ST1VURVJfRFJJVkVSUyAmJiAoUENJIHx8IElTQSkKKwktLS1oZWxwLS0tCisJICBDeWNsb20gMlggZnJvbSBDeWNsYWRlcyBDb3Jwb3JhdGlvbiA8aHR0cDovL3d3dy5jeWNsYWRlcy5jb20vPiBpcyBhbgorCSAgaW50ZWxsaWdlbnQgbXVsdGlwcm90b2NvbCBXQU4gYWRhcHRlciB3aXRoIGRhdGEgdHJhbnNmZXIgcmF0ZXMgdXAgdG8KKwkgIDUxMiBLYnBzLiBUaGVzZSBjYXJkcyBzdXBwb3J0IHRoZSBYLjI1IGFuZCBTTkEgcmVsYXRlZCBwcm90b2NvbHMuCisKKwkgIFdoaWxlIG5vIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IHRoaXMgdGltZSBwbGVhc2UgZ3JhYiB0aGUKKwkgIHdhbmNvbmZpZyB0YXJiYWxsIGluCisJICA8aHR0cDovL3d3dy5jb25lY3RpdmEuY29tLmJyL35hY21lL2N5Y3N5bi1kZXZlbC8+ICh3aXRoIG1pbm9yIGNoYW5nZXMKKwkgIHRvIG1ha2UgaXQgY29tcGlsZSB3aXRoIHRoZSBjdXJyZW50IHdhbnJvdXRlciBpbmNsdWRlIGZpbGVzOyBlZmZvcnRzCisJICBhcmUgYmVpbmcgbWFkZSB0byB1c2UgdGhlIG9yaWdpbmFsIHBhY2thZ2UgYXZhaWxhYmxlIGF0CisJICA8ZnRwOi8vZnRwLnNhbmdvbWEuY29tLz4pLgorCisJICBGZWVsIGZyZWUgdG8gY29udGFjdCBtZSBvciB0aGUgY3ljc3luLWRldmVsIG1haWxpbmcgbGlzdCBhdAorCSAgPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gYW5kIDxjeWNzeW4tZGV2ZWxAYmF6YXIuY29uZWN0aXZhLmNvbS5icj4gZm9yCisJICBhZGRpdGlvbmFsIGRldGFpbHMsIEkgaG9wZSB0byBoYXZlIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGFzIHNvb24gYXMKKwkgIHBvc3NpYmxlLiAoQ3ljbGFkZXMgQnJhemlsIGlzIHdyaXRpbmcgdGhlIERvY3VtZW50YXRpb24pLgorCisJICBUaGUgbmV4dCBxdWVzdGlvbnMgd2lsbCBhc2sgeW91IGFib3V0IHRoZSBwcm90b2NvbHMgeW91IHdhbnQgdGhlCisJICBkcml2ZXIgdG8gc3VwcG9ydCAoZm9yIG5vdyBvbmx5IFguMjUgaXMgc3VwcG9ydGVkKS4KKworCSAgSWYgeW91IGhhdmUgb25lIG9yIG1vcmUgb2YgdGhlc2UgY2FyZHMsIHNheSBZIHRvIHRoaXMgb3B0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeWNsb214LgorCitjb25maWcgQ1lDTE9NWF9YMjUKKwlib29sICJDeWNsb20gMlggWC4yNSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQ1lDTEFERVNfU1lOQworCWhlbHAKKwkgIENvbm5lY3QgYSBDeWNsb20gMlggY2FyZCB0byBhbiBYLjI1IG5ldHdvcmsuCisKKwkgIEVuYWJsaW5nIFguMjUgc3VwcG9ydCB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTEga0IuCisKKyMgWC4yNSBuZXR3b3JrIGRyaXZlcnMKK2NvbmZpZyBMQVBCRVRIRVIKKwl0cmlzdGF0ZSAiTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFdBTiAmJiBMQVBCICYmIFgyNQorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3IgYSBwc2V1ZG8gZGV2aWNlICh0eXBpY2FsbHkgY2FsbGVkIC9kZXYvbGFwYjApIHdoaWNoIGFsbG93cworCSAgeW91IHRvIG9wZW4gYW4gTEFQQiBwb2ludC10by1wb2ludCBjb25uZWN0aW9uIHRvIHNvbWUgb3RoZXIgY29tcHV0ZXIKKwkgIG9uIHlvdXIgRXRoZXJuZXQgbmV0d29yay4KKworCSAgSW4gb3JkZXIgdG8gZG8gdGhpcywgeW91IG5lZWQgdG8gc2F5IFkgb3IgTSB0byB0aGUgZHJpdmVyIGZvciB5b3VyCisJICBFdGhlcm5ldCBjYXJkIGFzIHdlbGwgYXMgdG8gIkxBUEIgRGF0YSBMaW5rIERyaXZlciIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxhcGJldGhlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFgyNV9BU1kKKwl0cmlzdGF0ZSAiWC4yNSBhc3luYyBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBXQU4gJiYgTEFQQiAmJiBYMjUKKwktLS1oZWxwLS0tCisJICBTZW5kIGFuZCByZWNlaXZlIFguMjUgZnJhbWVzIG92ZXIgcmVndWxhciBhc3luY2hyb25vdXMgc2VyaWFsCisJICBsaW5lcyBzdWNoIGFzIHRlbGVwaG9uZSBsaW5lcyBlcXVpcHBlZCB3aXRoIG9yZGluYXJ5IG1vZGVtcy4KKworCSAgRXhwZXJ0cyBzaG91bGQgbm90ZSB0aGF0IHRoaXMgZHJpdmVyIGRvZXNuJ3QgY3VycmVudGx5IGNvbXBseSB3aXRoCisJICB0aGUgYXN5bmNocm9ub3VzIEhETFMgZnJhbWluZyBwcm90b2NvbHMgaW4gQ0NJVFQgcmVjb21tZW5kYXRpb24gWC4yNS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgeDI1X2FzeS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNCTkkKKwl0cmlzdGF0ZSAiR3JhbmNoIFNCTkkxMiBMZWFzZWQgTGluZSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4gJiYgWDg2CisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciBJU0EgU0JOSTEyLXh4IGNhcmRzIHdoaWNoIGFyZSBsb3cgY29zdCBhbHRlcm5hdGl2ZXMgdG8KKwkgIGxlYXNlZCBsaW5lIG1vZGVtcy4KKworCSAgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYW5kIGxhc3QgdmVyc2lvbnMgb2YgZHJpdmVycyBhbmQKKwkgIHV0aWxpdGllcyBhdCA8aHR0cDovL3d3dy5ncmFuY2gucnUvPi4gSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9uIHlvdQorCSAgY2FuIHNlbmQgZW1haWwgdG8gPHNibmlAZ3JhbmNoLnJ1Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2JuaS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNCTklfTVVMVElMSU5FCisJYm9vbCAiTXVsdGlwbGUgbGluZSBmZWF0dXJlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQk5JCisJaGVscAorCSAgU2NoZWR1bGUgdHJhZmZpYyBmb3Igc29tZSBwYXJhbGxlbCBsaW5lcywgdmlhIFNCTkkxMiBhZGFwdGVycy4KKworCSAgSWYgeW91IGhhdmUgdHdvIGNvbXB1dGVycyBjb25uZWN0ZWQgd2l0aCB0d28gcGFyYWxsZWwgbGluZXMgaXQncworCSAgcG9zc2libGUgdG8gaW5jcmVhc2UgdHJhbnNmZXIgcmF0ZSBuZWFybHkgdHdpY2UuIFlvdSBzaG91bGQgaGF2ZQorCSAgYSBwcm9ncmFtIG5hbWVkICdzYm5pY29uZmlnJyB0byBjb25maWd1cmUgYWRhcHRlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2FuL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vTWFrZWZpbGUKQEAgLTAsMCArMSw4NiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG5ldHdvcmsgKHdhbikgZGV2aWNlIGRyaXZlcnMuCisjCisjIDMgQXVnIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisjCisKK3dhbnBpcGUteQkJCTo9IHNkbGFtYWluLm8gc2RsYV9mdDEubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX1gyNSkJKz0gc2RsYV94MjUubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX0ZSKQkrPSBzZGxhX2ZyLm8KK3dhbnBpcGUtJChDT05GSUdfV0FOUElQRV9DSERMQykJKz0gc2RsYV9jaGRsYy5vCit3YW5waXBlLSQoQ09ORklHX1dBTlBJUEVfUFBQKQkrPSBzZGxhX3BwcC5vCit3YW5waXBlLSQoQ09ORklHX1dBTlBJUEVfTVVMVFBQUCkgKz0gd2FucGlwZV9tdWx0cHBwLm8KK3dhbnBpcGUtb2JqcwkJCTo9ICQod2FucGlwZS15KQorCitjeWNsb214LXkgICAgICAgICAgICAgICAgICAgICAgIDo9IGN5Y3hfbWFpbi5vCitjeWNsb214LSQoQ09ORklHX0NZQ0xPTVhfWDI1KQkrPSBjeWN4X3gyNS5vCitjeWNsb214LW9ianMJCQk6PSAkKGN5Y2xvbXgteSkgIAorCitoZGxjLXkJCQkJOj0gaGRsY19nZW5lcmljLm8KK2hkbGMtJChDT05GSUdfSERMQ19SQVcpCQkrPSBoZGxjX3Jhdy5vCitoZGxjLSQoQ09ORklHX0hETENfUkFXX0VUSCkJKz0gaGRsY19yYXdfZXRoLm8KK2hkbGMtJChDT05GSUdfSERMQ19DSVNDTykJKz0gaGRsY19jaXNjby5vCitoZGxjLSQoQ09ORklHX0hETENfRlIpCQkrPSBoZGxjX2ZyLm8KK2hkbGMtJChDT05GSUdfSERMQ19QUFApCQkrPSBoZGxjX3BwcC5vCitoZGxjLSQoQ09ORklHX0hETENfWDI1KQkJKz0gaGRsY194MjUubworaGRsYy1vYmpzCQkJOj0gJChoZGxjLXkpCisKK3BjMzAwLXkJCQkJOj0gcGMzMDBfZHJ2Lm8KK3BjMzAwLSQoQ09ORklHX1BDMzAwX01MUFBQKQkrPSBwYzMwMF90dHkubworcGMzMDAtb2JqcwkJCTo9ICQocGMzMDAteSkKKworb2JqLSQoQ09ORklHX0hPU1RFU1NfU1YxMSkJKz0gejg1MjMwLm8Jc3luY3BwcC5vCWhvc3Rlc3Nfc3YxMS5vCitvYmotJChDT05GSUdfU0VBTEVWRUxfNDAyMSkJKz0gejg1MjMwLm8Jc3luY3BwcC5vCXNlYWxldmVsLm8KK29iai0kKENPTkZJR19DT1NBKQkJKz0JCXN5bmNwcHAubwljb3NhLm8KK29iai0kKENPTkZJR19GQVJTWU5DKQkJKz0JCXN5bmNwcHAubwlmYXJzeW5jLm8KK29iai0kKENPTkZJR19EU0NDNCkgICAgICAgICAgICAgKz0JCQkJZHNjYzQubworb2JqLSQoQ09ORklHX0xBTk1FRElBKQkJKz0JCXN5bmNwcHAubworb2JqLSQoQ09ORklHX1NZTkNMSU5LX1NZTkNQUFApCSs9CQlzeW5jcHBwLm8KK29iai0kKENPTkZJR19YMjVfQVNZKQkJKz0geDI1X2FzeS5vCisKK29iai0kKENPTkZJR19MQU5NRURJQSkJCSs9IGxtYy8KKworb2JqLSQoQ09ORklHX0RMQ0kpCQkrPSBkbGNpLm8gCitvYmotJChDT05GSUdfU0RMQSkJCSs9IHNkbGEubworaWZlcSAoJChDT05GSUdfV0FOUElQRV9NVUxUUFBQKSx5KQorICBvYmotJChDT05GSUdfVkVORE9SX1NBTkdPTUEpICs9IHNkbGFkcnYubyB3YW5waXBlLm8gc3luY3BwcC5vCQorZWxzZQorICBvYmotJChDT05GSUdfVkVORE9SX1NBTkdPTUEpICs9IHNkbGFkcnYubyB3YW5waXBlLm8KK2VuZGlmCitvYmotJChDT05GSUdfQ1lDTEFERVNfU1lOQykJKz0gY3ljeF9kcnYubyBjeWNsb214Lm8KK29iai0kKENPTkZJR19MQVBCRVRIRVIpCQkrPSBsYXBiZXRoZXIubworb2JqLSQoQ09ORklHX1NCTkkpCQkrPSBzYm5pLm8KK29iai0kKENPTkZJR19QQzMwMCkJCSs9IHBjMzAwLm8KK29iai0kKENPTkZJR19IRExDKQkJKz0gaGRsYy5vCitpZmVxICgkKENPTkZJR19IRExDX1BQUCkseSkKKyAgb2JqLSQoQ09ORklHX0hETEMpCQkrPSBzeW5jcHBwLm8KK2VuZGlmCitvYmotJChDT05GSUdfTjIpCQkrPSBuMi5vCitvYmotJChDT05GSUdfQzEwMSkJCSs9IGMxMDEubworb2JqLSQoQ09ORklHX1dBTlhMKQkJKz0gd2FueGwubworb2JqLSQoQ09ORklHX1BDSTIwMFNZTikJCSs9IHBjaTIwMHN5bi5vCisKK2NsZWFuLWZpbGVzIDo9IHdhbnhsZncuaW5jCiskKG9iaikvd2FueGwubzoJJChvYmopL3dhbnhsZncuaW5jCisKK2lmZXEgKCQoQ09ORklHX1dBTlhMX0JVSUxEX0ZJUk1XQVJFKSx5KQoraWZlcSAoJChBUkNIKSxtNjhrKQorICBBUzY4SyA9ICQoQVMpCisgIExENjhLID0gJChMRCkKK2Vsc2UKKyAgQVM2OEsgPSBhczY4aworICBMRDY4SyA9IGxkNjhrCitlbmRpZgorCitxdWlldF9jbWRfYnVpbGRfd2FueGxmdyA9IEJMRCBGVyAgJEAKKyAgICAgIGNtZF9idWlsZF93YW54bGZ3ID0gXAorCSQoQ1BQKSAtV3AsLU1ELCQoZGVwZmlsZSkgLUkkKHNyY3RyZWUpL2luY2x1ZGUgJDwgfCAkKEFTNjhLKSAtbTY4MzYwIC1vICQob2JqKS93YW54bGZ3Lm87IFwKKwkkKExENjhLKSAtLW9mb3JtYXQgYmluYXJ5IC1UdGV4dCAweDEwMDAgJChvYmopL3dhbnhsZncubyAtbyAkKG9iaikvd2FueGxmdy5iaW47IFwKKwloZXhkdW1wIC12ZSAnIlxuIiAxNi8xICIweCUwMlgsIicgJChvYmopL3dhbnhsZncuYmluIHwgc2VkICdzLzB4ICAsLy9nOzFzL14vc3RhdGljIHU4IGZpcm13YXJlW109ey87JCRzLywkJC9cbn07XG4vJyA+JChvYmopL3dhbnhsZncuaW5jOyBcCisJcm0gLWYgJChvYmopL3dhbnhsZncuYmluICQob2JqKS93YW54bGZ3Lm8KKworJChvYmopL3dhbnhsZncuaW5jOgkkKHNyYykvd2FueGxmdy5TCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGJ1aWxkX3dhbnhsZncpCit0YXJnZXRzICs9IHdhbnhsZncuaW5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2MxMDEuYyBiL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkODU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBNb3hhIEMxMDEgc3luY2hyb25vdXMgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBGb3IgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly9ocS5wbS53YXcucGwvaGRsYy8KKyAqCisgKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgorICogICAgSGl0YWNoaSBIRDY0NTcwIFNDQSBVc2VyJ3MgTWFudWFsCisgKiAgICBNb3hhIEMxMDEgVXNlcidzIE1hbnVhbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaGQ2NDU3MC5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIk1veGEgQzEwMSBkcml2ZXIgdmVyc2lvbjogMS4xNSI7CitzdGF0aWMgY29uc3QgY2hhciogZGV2bmFtZSA9ICJDMTAxIjsKKworI3VuZGVmIERFQlVHX1BLVAorI2RlZmluZSBERUJVR19SSU5HUworCisjZGVmaW5lIEMxMDFfUEFHRSAweDFEMDAKKyNkZWZpbmUgQzEwMV9EVFIgMHgxRTAwCisjZGVmaW5lIEMxMDFfU0NBIDB4MUYwMAorI2RlZmluZSBDMTAxX1dJTkRPV19TSVpFIDB4MjAwMAorI2RlZmluZSBDMTAxX01BUFBFRF9SQU1fU0laRSAweDQwMDAKKworI2RlZmluZSBSQU1fU0laRSAoMjU2ICogMTAyNCkKKyNkZWZpbmUgVFhfUklOR19CVUZGRVJTIDEwCisjZGVmaW5lIFJYX1JJTkdfQlVGRkVSUyAoKFJBTV9TSVpFIC0gQzEwMV9XSU5ET1dfU0laRSkgLwkJXAorCQkJIChzaXplb2YocGt0X2Rlc2MpICsgSERMQ19NQVhfTVJVKSAtIFRYX1JJTkdfQlVGRkVSUykKKworI2RlZmluZSBDTE9DS19CQVNFIDk4MzA0MDAJLyogOS44MzA0IE1IeiAqLworI2RlZmluZSBQQUdFMF9BTFdBWVNfTUFQUEVECisKK3N0YXRpYyBjaGFyICpodzsJCS8qIHBvaW50ZXIgdG8gaHc9eHh4IGNvbW1hbmQgbGluZSBzdHJpbmcgKi8KKworCit0eXBlZGVmIHN0cnVjdCBjYXJkX3MgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBUWCBsb2NrICovCisJdTggX19pb21lbSAqd2luMGJhc2U7CS8qIElTQSB3aW5kb3cgYmFzZSBhZGRyZXNzICovCisJdTMyIHBoeV93aW5iYXNlOwkvKiBJU0EgcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJaW50IHJ4cGFydDsJCS8qIHBhcnRpYWwgZnJhbWUgcmVjZWl2ZWQsIG5leHQgZnJhbWUgaW52YWxpZCovCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXUxNiByeF9yaW5nX2J1ZmZlcnM7CS8qIG51bWJlciBvZiBidWZmZXJzIGluIGEgcmluZyAqLworCXUxNiB0eF9yaW5nX2J1ZmZlcnM7CisJdTE2IGJ1ZmZfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgZmlyc3QgYnVmZmVyIG9mIGZpcnN0IGNoYW5uZWwgKi8KKwl1MTYgcnhpbjsJCS8qIHJ4IHJpbmcgYnVmZmVyICdpbicgcG9pbnRlciAqLworCXUxNiB0eGluOwkJLyogdHggcmluZyBidWZmZXIgJ2luJyBhbmQgJ2xhc3QnIHBvaW50ZXJzICovCisJdTE2IHR4bGFzdDsKKwl1OCByeHMsIHR4cywgdG1jOwkvKiBTQ0EgcmVnaXN0ZXJzICovCisJdTggaXJxOwkJCS8qIElSUSAoMy0xNSkgKi8KKwl1OCBwYWdlOworCisJc3RydWN0IGNhcmRfcyAqbmV4dF9jYXJkOworfWNhcmRfdDsKKwordHlwZWRlZiBjYXJkX3QgcG9ydF90OworCitzdGF0aWMgY2FyZF90ICpmaXJzdF9jYXJkOworc3RhdGljIGNhcmRfdCAqKm5ld19jYXJkID0gJmZpcnN0X2NhcmQ7CisKKworI2RlZmluZSBzY2FfaW4ocmVnLCBjYXJkKQkgICByZWFkYigoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKSkKKyNkZWZpbmUgc2NhX291dCh2YWx1ZSwgcmVnLCBjYXJkKSAgd3JpdGViKHZhbHVlLCAoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKSkKKyNkZWZpbmUgc2NhX2ludyhyZWcsIGNhcmQpCSAgIHJlYWR3KChjYXJkKS0+d2luMGJhc2UgKyBDMTAxX1NDQSArIChyZWcpKQorCisvKiBFREEgYWRkcmVzcyByZWdpc3RlciBtdXN0IGJlIHNldCBpbiBFREFMLCBFREFIIG9yZGVyIC0gOCBiaXQgSVNBIGJ1cyAqLworI2RlZmluZSBzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKSBkbyB7IFwKKwl3cml0ZWIodmFsdWUgJiAweEZGLCAoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKSk7IFwKKwl3cml0ZWIoKHZhbHVlID4+IDggKSAmIDB4RkYsIChjYXJkKS0+d2luMGJhc2UgKyBDMTAxX1NDQSArIChyZWcrMSkpO1wKK30gd2hpbGUoMCkKKworI2RlZmluZSBwb3J0X3RvX2NhcmQocG9ydCkJICAgKHBvcnQpCisjZGVmaW5lIGxvZ19ub2RlKHBvcnQpCQkgICAoMCkKKyNkZWZpbmUgcGh5X25vZGUocG9ydCkJCSAgICgwKQorI2RlZmluZSB3aW5zaXplKGNhcmQpCQkgICAoQzEwMV9XSU5ET1dfU0laRSkKKyNkZWZpbmUgd2luMGJhc2UoY2FyZCkJCSAgICgoY2FyZCktPndpbjBiYXNlKQorI2RlZmluZSB3aW5iYXNlKGNhcmQpICAgICAgCSAgICgoY2FyZCktPndpbjBiYXNlICsgMHgyMDAwKQorI2RlZmluZSBnZXRfcG9ydChjYXJkLCBwb3J0KQkgICAoY2FyZCkKK3N0YXRpYyB2b2lkIHNjYV9tc2NpX2ludHIocG9ydF90ICpwb3J0KTsKKworCitzdGF0aWMgaW5saW5lIHU4IHNjYV9nZXRfcGFnZShjYXJkX3QgKmNhcmQpCit7CisJcmV0dXJuIGNhcmQtPnBhZ2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVud2luKGNhcmRfdCAqY2FyZCwgdTggcGFnZSkKK3sKKwljYXJkLT5wYWdlID0gcGFnZTsKKwl3cml0ZWIocGFnZSwgY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOworfQorCisKKyNpbmNsdWRlICJoZDY0NTd4LmMiCisKKworc3RhdGljIHZvaWQgc2NhX21zY2lfaW50cihwb3J0X3QgKnBvcnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCWNhcmRfdCogY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1OCBzdGF0ID0gc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMSwgY2FyZCk7IC8qIHJlYWQgTVNDSSBTVDEgc3RhdHVzICovCisKKwkvKiBSZXNldCBNU0NJIFRYIHVuZGVycnVuIHN0YXR1cyBiaXQgKi8KKwlzY2Ffb3V0KHN0YXQgJiBTVDFfVURSTiwgTVNDSTBfT0ZGU0VUICsgU1QxLCBjYXJkKTsKKworCWlmIChzdGF0ICYgU1QxX1VEUk4pIHsKKwkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7IC8qIFRYIFVuZGVycnVuIGVycm9yIGRldGVjdGVkICovCisJCXN0YXRzLT50eF9maWZvX2Vycm9ycysrOworCX0KKworCS8qIFJlc2V0IE1TQ0kgQ0RDRCBzdGF0dXMgYml0IC0gdXNlcyBjaCMyIERDRCBpbnB1dCAqLworCXNjYV9vdXQoc3RhdCAmIFNUMV9DRENELCBNU0NJMV9PRkZTRVQgKyBTVDEsIGNhcmQpOworCisJaWYgKHN0YXQgJiBTVDFfQ0RDRCkKKwkJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksCisJCQkJIGRldik7Cit9CisKKworc3RhdGljIHZvaWQgYzEwMV9zZXRfaWZhY2UocG9ydF90ICpwb3J0KQoreworCXU4IHJ4cyA9IHBvcnQtPnJ4cyAmIENMS19CUkdfTUFTSzsKKwl1OCB0eHMgPSBwb3J0LT50eHMgJiBDTEtfQlJHX01BU0s7CisKKwlzd2l0Y2gocG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSkgeworCWNhc2UgQ0xPQ0tfSU5UOgorCQlyeHMgfD0gQ0xLX0JSR19SWDsgLyogVFggY2xvY2sgKi8KKwkJdHhzIHw9IENMS19SWENMS19UWDsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhJTlQ6CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfQlJHX1RYOyAvKiBCUkcgb3V0cHV0ICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UWEZST01SWDoKKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19SWENMS19UWDsgLyogUlggY2xvY2sgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkvKiBFWFRlcm5hbCBjbG9jayAqLworCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0xJTkVfVFg7IC8qIFRYQyBpbnB1dCAqLworCX0KKworCXBvcnQtPnJ4cyA9IHJ4czsKKwlwb3J0LT50eHMgPSB0eHM7CisJc2NhX291dChyeHMsIE1TQ0kxX09GRlNFVCArIFJYUywgcG9ydCk7CisJc2NhX291dCh0eHMsIE1TQ0kxX09GRlNFVCArIFRYUywgcG9ydCk7CisJc2NhX3NldF9wb3J0KHBvcnQpOworfQorCisKK3N0YXRpYyBpbnQgYzEwMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gaGRsY19vcGVuKGRldik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXdyaXRlYigxLCBwb3J0LT53aW4wYmFzZSArIEMxMDFfRFRSKTsKKwlzY2Ffb3V0KDAsIE1TQ0kxX09GRlNFVCArIENUTCwgcG9ydCk7IC8qIFJUUyB1c2VzIGNoIzIgb3V0cHV0ICovCisJc2NhX29wZW4oZGV2KTsKKwkvKiBEQ0QgaXMgY29ubmVjdGVkIHRvIHBvcnQgMiAhQCMkJV4mIC0gZGlzYWJsZSBNU0NJMCBDRENEIGludGVycnVwdCAqLworCXNjYV9vdXQoSUUxX1VEUk4sIE1TQ0kwX09GRlNFVCArIElFMSwgcG9ydCk7CisJc2NhX291dChJRTBfVFhJTlQsIE1TQ0kwX09GRlNFVCArIElFMCwgcG9ydCk7CisKKwloZGxjX3NldF9jYXJyaWVyKCEoc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMywgcG9ydCkgJiBTVDNfRENEKSwgZGV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiMHglWFxuIiwgc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMywgcG9ydCkpOworCisJLyogZW5hYmxlIE1TQ0kxIENEQ0QgaW50ZXJydXB0ICovCisJc2NhX291dChJRTFfQ0RDRCwgTVNDSTFfT0ZGU0VUICsgSUUxLCBwb3J0KTsKKwlzY2Ffb3V0KElFMF9SWElOVEEsIE1TQ0kxX09GRlNFVCArIElFMCwgcG9ydCk7CisJc2NhX291dCgweDQ4LCBJRVIwLCBwb3J0KTsgLyogVFhJTlQgIzAgYW5kIFJYSU5UICMxICovCisJYzEwMV9zZXRfaWZhY2UocG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjMTAxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworCXNjYV9jbG9zZShkZXYpOworCXdyaXRlYigwLCBwb3J0LT53aW4wYmFzZSArIEMxMDFfRFRSKTsKKwlzY2Ffb3V0KENUTF9OT1JUUywgTVNDSTFfT0ZGU0VUICsgQ1RMLCBwb3J0KTsKKwloZGxjX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjMTAxX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKyNpZmRlZiBERUJVR19SSU5HUworCWlmIChjbWQgPT0gU0lPQ0RFVlBSSVZBVEUpIHsKKwkJc2NhX2R1bXBfcmluZ3MoZGV2KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk1TQ0kxOiBTVDogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICAgICAgIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDAsIHBvcnQpLAorCQkgICAgICAgc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMSwgcG9ydCksCisJCSAgICAgICBzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QyLCBwb3J0KSwKKwkJICAgICAgIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIHBvcnQpKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9TWU5DX1NFUklBTDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIobGluZSwgJnBvcnQtPnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX0VYVCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWEZST01SWCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19JTlQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhJTlQpCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBzdWNoIGNsb2NrIHNldHRpbmcgKi8KKworCQlpZiAobmV3X2xpbmUubG9vcGJhY2sgIT0gMCAmJiBuZXdfbGluZS5sb29wYmFjayAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZwb3J0LT5zZXR0aW5ncywgJm5ld19saW5lLCBzaXplKTsgLyogVXBkYXRlIHNldHRpbmdzICovCisJCWMxMDFfc2V0X2lmYWNlKHBvcnQpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworCisKK3N0YXRpYyB2b2lkIGMxMDFfZGVzdHJveV9jYXJkKGNhcmRfdCAqY2FyZCkKK3sKKwlyZWFkYihjYXJkLT53aW4wYmFzZSArIEMxMDFfUEFHRSk7IC8qIFJlc2V0cyBTQ0E/ICovCisKKwlpZiAoY2FyZC0+aXJxKQorCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCisJaWYgKGNhcmQtPndpbjBiYXNlKSB7CisJCWlvdW5tYXAoY2FyZC0+d2luMGJhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+cGh5X3dpbmJhc2UsIEMxMDFfTUFQUEVEX1JBTV9TSVpFKTsKKwl9CisKKwlmcmVlX25ldGRldihjYXJkLT5kZXYpOworCisJa2ZyZWUoY2FyZCk7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBjMTAxX3J1bih1bnNpZ25lZCBsb25nIGlycSwgdW5zaWduZWQgbG9uZyB3aW5iYXNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaGRsY19kZXZpY2UgKmhkbGM7CisJY2FyZF90ICpjYXJkOworCWludCByZXN1bHQ7CisKKwlpZiAoaXJxPDMgfHwgaXJxPjE1IHx8IGlycSA9PSA2KSAvKiBGSVhNRSAqLyB7CisJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogaW52YWxpZCBJUlEgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAod2luYmFzZSA8IDB4QzAwMDAgfHwgd2luYmFzZSA+IDB4REZGRkYgfHwgKHdpbmJhc2UgJiAweDNGRkYpICE9MCkgeworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGludmFsaWQgUkFNIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKGNhcmRfdCksIEdGUF9LRVJORUwpOworCWlmIChjYXJkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKGNhcmRfdCkpOworCisJY2FyZC0+ZGV2ID0gYWxsb2NfaGRsY2RldihjYXJkKTsKKwlpZiAoIWNhcmQtPmRldikgeworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWlmIChyZXF1ZXN0X2lycShpcnEsIHNjYV9pbnRyLCAwLCBkZXZuYW1lLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOworCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCWNhcmQtPmlycSA9IGlycTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHdpbmJhc2UsIEMxMDFfTUFQUEVEX1JBTV9TSVpFLCBkZXZuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGNvdWxkIG5vdCByZXF1ZXN0IFJBTSB3aW5kb3dcbiIpOworCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCWNhcmQtPnBoeV93aW5iYXNlID0gd2luYmFzZTsKKwljYXJkLT53aW4wYmFzZSA9IGlvcmVtYXAod2luYmFzZSwgQzEwMV9NQVBQRURfUkFNX1NJWkUpOworCWlmICghY2FyZC0+d2luMGJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBjb3VsZCBub3QgbWFwIEkvTyBhZGRyZXNzXG4iKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2FyZC0+dHhfcmluZ19idWZmZXJzID0gVFhfUklOR19CVUZGRVJTOworCWNhcmQtPnJ4X3JpbmdfYnVmZmVycyA9IFJYX1JJTkdfQlVGRkVSUzsKKwljYXJkLT5idWZmX29mZnNldCA9IEMxMDFfV0lORE9XX1NJWkU7IC8qIEJ5dGVzIDFEMDAtMUZGRiByZXNlcnZlZCAqLworCisJcmVhZGIoY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOyAvKiBSZXNldHMgU0NBPyAqLworCXVkZWxheSgxMDApOworCXdyaXRlYigwLCBjYXJkLT53aW4wYmFzZSArIEMxMDFfUEFHRSk7CisJd3JpdGViKDAsIGNhcmQtPndpbjBiYXNlICsgQzEwMV9EVFIpOyAvKiBQb3dlci11cCBmb3IgUkFNPyAqLworCisJc2NhX2luaXQoY2FyZCwgMCk7CisKKwlkZXYgPSBwb3J0X3RvX2RldihjYXJkKTsKKwloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5tZW1fc3RhcnQgPSB3aW5iYXNlOworCWRldi0+bWVtX2VuZCA9IHdpbmJhc2UgKyBDMTAxX01BUFBFRF9SQU1fU0laRSAtIDE7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSA1MDsKKwlkZXYtPmRvX2lvY3RsID0gYzEwMV9pb2N0bDsKKwlkZXYtPm9wZW4gPSBjMTAxX29wZW47CisJZGV2LT5zdG9wID0gYzEwMV9jbG9zZTsKKwloZGxjLT5hdHRhY2ggPSBzY2FfYXR0YWNoOworCWhkbGMtPnhtaXQgPSBzY2FfeG1pdDsKKwljYXJkLT5zZXR0aW5ncy5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOworCisJcmVzdWx0ID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImMxMDE6IHVuYWJsZSB0byByZWdpc3RlciBoZGxjIGRldmljZVxuIik7CisJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNjYV9pbml0X3N5bmNfcG9ydChjYXJkKTsgLyogU2V0IHVwIEMxMDEgbWVtb3J5ICovCisJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTW94YSBDMTAxIG9uIElSUSV1LCIKKwkgICAgICAgIiB1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCisJICAgICAgIGRldi0+bmFtZSwgY2FyZC0+aXJxLAorCSAgICAgICBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwkqbmV3X2NhcmQgPSBjYXJkOworCW5ld19jYXJkID0gJmNhcmQtPm5leHRfY2FyZDsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IGMxMDFfaW5pdCh2b2lkKQoreworCWlmIChodyA9PSBOVUxMKSB7CisjaWZkZWYgTU9EVUxFCisJCXByaW50ayhLRVJOX0lORk8gImMxMDE6IG5vIGNhcmQgaW5pdGlhbGl6ZWRcbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5PU1lTOwkvKiBubyBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgYWJvcnQgKi8KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgaXJxLCByYW07CisKKwkJaXJxID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodysrICE9ICcsJykKKwkJCWJyZWFrOworCQlyYW0gPSBzaW1wbGVfc3RydG91bChodywgJmh3LCAwKTsKKworCQlpZiAoKmh3ID09ICc6JyB8fCAqaHcgPT0gJ1x4MCcpCisJCQljMTAxX3J1bihpcnEsIHJhbSk7CisKKwkJaWYgKCpodyA9PSAnXHgwJykKKwkJCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7CisJfXdoaWxlKCpodysrID09ICc6Jyk7CisKKwlwcmludGsoS0VSTl9FUlIgImMxMDE6IGludmFsaWQgaGFyZHdhcmUgcGFyYW1ldGVyc1xuIik7CisJcmV0dXJuIGZpcnN0X2NhcmQgPyAwIDogLUVOT1NZUzsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgYzEwMV9jbGVhbnVwKHZvaWQpCit7CisJY2FyZF90ICpjYXJkID0gZmlyc3RfY2FyZDsKKworCXdoaWxlIChjYXJkKSB7CisJCWNhcmRfdCAqcHRyID0gY2FyZDsKKwkJY2FyZCA9IGNhcmQtPm5leHRfY2FyZDsKKwkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShwb3J0X3RvX2RldihwdHIpKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQocHRyKTsKKwl9Cit9CisKKworbW9kdWxlX2luaXQoYzEwMV9pbml0KTsKK21vZHVsZV9leGl0KGMxMDFfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1veGEgQzEwMSBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK21vZHVsZV9wYXJhbShodywgY2hhcnAsIDA0NDQpOwkvKiBodz1pcnEscmFtOmlycSwuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWE1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC0wLDAgKzEsMjEwMCBAQAorLyogJElkOiBjb3NhLmMsdiAxLjMxIDIwMDAvMDMvMDggMTc6NDc6MTYga2FzIEV4cCAkICovCisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBUaGUgZHJpdmVyIGZvciB0aGUgU1JQIGFuZCBDT1NBIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkcy4KKyAqCisgKiBIQVJEV0FSRSBJTkZPCisgKgorICogQm90aCBjYXJkcyBhcmUgZGV2ZWxvcGVkIGF0IHRoZSBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZSwKKyAqIE1hc2FyeWsgVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5pY3MubXVuaS5jei8pLiBUaGUgaGFyZHdhcmUgaXMKKyAqIGRldmVsb3BlZCBieSBKaXJpIE5vdm90bnkgPG5vdm90bnlAaWNzLm11bmkuY3o+LiBNb3JlIGluZm9ybWF0aW9uCisgKiBhbmQgdGhlIHBob3RvIG9mIGJvdGggY2FyZHMgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LnBhdm91Y2VrLmN6L2Nvc2EuaHRtbC4gVGhlIGNhcmQgZG9jdW1lbnRhdGlvbiwgZmlybXdhcmVzCisgKiBhbmQgb3RoZXIgZ29vZHMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBmdHA6Ly9mdHAuaWNzLm11bmkuY3ovcHViL2Nvc2EvLgorICogRm9yIExpbnV4LXNwZWNpZmljIHV0aWxpdGllcywgc2VlIGJlbG93IGluIHRoZSAiU29mdHdhcmUgaW5mbyIgc2VjdGlvbi4KKyAqIElmIHlvdSB3YW50IHRvIG9yZGVyIHRoZSBjYXJkLCBjb250YWN0IEppcmkgTm92b3RueS4KKyAqCisgKiBUaGUgU1JQIChzZXJpYWwgcG9ydD8sIHRoZSBDemVjaCB3b3JkICJzcnAiIG1lYW5zICJzaWNrbGUiKSBjYXJkCisgKiBpcyBhIDItcG9ydCBpbnRlbGxpZ2VudCAod2l0aCBpdHMgb3duIDgtYml0IENQVSkgc3luY2hyb25vdXMgc2VyaWFsIGNhcmQKKyAqIHdpdGggVi4yNCBpbnRlcmZhY2VzIHVwIHRvIDgwa2IvcyBlYWNoLgorICoKKyAqIFRoZSBDT1NBIChjb21tdW5pY2F0aW9uIHNlcmlhbCBhZGFwdGVyPywgdGhlIEN6ZWNoIHdvcmQgImtvc2EiIG1lYW5zCisgKiAic2N5dGhlIikgaXMgYSBuZXh0LWdlbmVyYXRpb24gc3luYy9hc3luYyBib2FyZCB3aXRoIHR3byBpbnRlcmZhY2VzCisgKiAtIGN1cnJlbnRseSBhbnkgb2YgVi4yNCwgWC4yMSwgVi4zNSBhbmQgVi4zNiBjYW4gYmUgc2VsZWN0ZWQuCisgKiBJdCBoYXMgYSAxNi1iaXQgU0FCODAxNjYgQ1BVIGFuZCBjYW4gZG8gdXAgdG8gMTAgTWIvcyBwZXIgY2hhbm5lbC4KKyAqIFRoZSA4LWNoYW5uZWxzIHZlcnNpb24gaXMgaW4gZGV2ZWxvcG1lbnQuCisgKgorICogQm90aCB0eXBlcyBoYXZlIGRvd25sb2FkYWJsZSBmaXJtd2FyZSBhbmQgY29tbXVuaWNhdGUgdmlhIElTQSBETUEuCisgKiBDT1NBIGNhbiBiZSBhbHNvIGEgYnVzLW1hc3RlcmluZyBkZXZpY2UuCisgKgorICogU09GVFdBUkUgSU5GTworICoKKyAqIFRoZSBob21lcGFnZSBvZiB0aGUgTGludXggZHJpdmVyIGlzIGF0IGh0dHA6Ly93d3cuZmkubXVuaS5jei9+a2FzL2Nvc2EvLgorICogVGhlIENWUyB0cmVlIG9mIExpbnV4IGRyaXZlciBjYW4gYmUgdmlld2VkIHRoZXJlLCBhcyB3ZWxsIGFzIHRoZQorICogZmlybXdhcmUgYmluYXJpZXMgYW5kIHVzZXItc3BhY2UgdXRpbGl0aWVzIGZvciBkb3dubG9hZGluZyB0aGUgZmlybXdhcmUKKyAqIGludG8gdGhlIGNhcmQgYW5kIHNldHRpbmcgdXAgdGhlIGNhcmQuCisgKgorICogVGhlIExpbnV4IGRyaXZlciAodW5saWtlIHRoZSBwcmVzZW50ICpCU0QgZHJpdmVycyA6LSkgY2FuIHdvcmsgZXZlbgorICogZm9yIHRoZSBDT1NBIGFuZCBTUlAgaW4gb25lIGNvbXB1dGVyIGFuZCBhbGxvd3MgZWFjaCBjaGFubmVsIHRvIHdvcmsKKyAqIGluIG9uZSBvZiB0aGUgdGhyZWUgbW9kZXMgKGNoYXJhY3RlciBkZXZpY2UsIENpc2NvIEhETEMsIFN5bmMgUFBQKS4KKyAqCisgKiBBVVRIT1IKKyAqCisgKiBUaGUgTGludXggZHJpdmVyIHdhcyB3cml0dGVuIGJ5IEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4uCisgKgorICogWW91IGNhbiBtYWlsIG1lIGJ1Z2ZpeGVzIGFuZCBldmVuIHN1Y2Nlc3MgcmVwb3J0cy4gSSBhbSBlc3BlY2lhbGx5CisgKiBpbnRlcmVzdGVkIGluIHRoZSBTTVAgYW5kL29yIG11bGl0aS1jaGFubmVsIHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzCisgKiAoSSB3b25kZXIgaWYgSSBkaWQgdGhlIGxvY2tpbmcgcHJvcGVybHkgOi0pLgorICoKKyAqIFRIRSBBVVRIT1IgVVNFRCBUSEUgRk9MTE9XSU5HIFNPVVJDRVMgV0hFTiBQUk9HUkFNTUlORyBUSEUgRFJJVkVSCisgKgorICogVGhlIENPU0EvU1JQIE5ldEJTRCBkcml2ZXIgYnkgWmRlbmVrIFNhbHZldCBhbmQgSXZvcyBDZXJub2hsYXZlaworICogVGhlIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlcgorICogVGhlIFNETCBSaXNjb20vTjIgZHJpdmVyIGJ5IE1pa2UgTmF0YWxlCisgKiBUaGUgQ29tdHJvbCBIb3N0ZXNzIFNWMTEgZHJpdmVyIGJ5IEFsYW4gQ294CisgKiBUaGUgU3luYyBQUFAvQ2lzY28gSERMQyBsYXllciAoc3luY3BwcC5jKSBwb3J0ZWQgdG8gTGludXggYnkgQWxhbiBDb3gKKyAqLworLyoKKyAqICAgICA1LzI1LzE5OTkgOiBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4KKyAqICAgICAgICAgICAgIGZpeGVkIGEgZGVhZGxvY2sgaW4gY29zYV9zcHBwX29wZW4KKyAqLworDAorLyogLS0tLS0tLS0tLSBIZWFkZXJzLCBtYWNyb3MsIGRhdGEgc3RydWN0dXJlcyAtLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI3VuZGVmIENPU0FfU0xPV19JTwkvKiBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5ICovCisjdW5kZWYgUkVBTExZX1NMT1dfSU8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorI2luY2x1ZGUgImNvc2EuaCIKKworLyogTWF4aW11bSBsZW5ndGggb2YgdGhlIGlkZW50aWZpY2F0aW9uIHN0cmluZy4gKi8KKyNkZWZpbmUgQ09TQV9NQVhfSURfU1RSSU5HCTEyOAorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgY2hhbm5lbCBuYW1lICovCisjZGVmaW5lIENPU0FfTUFYX05BTUUJCShzaXplb2YoImNvc2FYWFhjWFhYIikrMSkKKworLyogUGVyLWNoYW5uZWwgZGF0YSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGNoYW5uZWxfZGF0YSB7CisJdm9pZCAqaWZfcHRyOwkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCWludCB1c2FnZTsJLyogVXNhZ2UgY291bnQ7ID4wIGZvciBjaHJkZXYsIC0xIGZvciBuZXRkZXYgKi8KKwlpbnQgbnVtOwkvKiBOdW1iZXIgb2YgdGhlIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhOwkvKiBQb2ludGVyIHRvIHRoZSBwZXItY2FyZCBzdHJ1Y3R1cmUgKi8KKwlpbnQgdHhzaXplOwkvKiBTaXplIG9mIHRyYW5zbWl0dGVkIGRhdGEgKi8KKwljaGFyICp0eGJ1ZjsJLyogVHJhbnNtaXQgYnVmZmVyICovCisJY2hhciBuYW1lW0NPU0FfTUFYX05BTUVdOwkvKiBjaGFubmVsIG5hbWUgKi8KKworCS8qIFRoZSBIVyBsYXllciBpbnRlcmZhY2UgKi8KKwkvKiByb3V0aW5lIGNhbGxlZCBmcm9tIHRoZSBSWCBpbnRlcnJ1cHQgKi8KKwljaGFyICooKnNldHVwX3J4KShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBpbnQgc2l6ZSk7CisJLyogcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgUlggaXMgZG9uZSAoZnJvbSB0aGUgRU9UIGludGVycnVwdCkgKi8KKwlpbnQgKCpyeF9kb25lKShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsKTsKKwkvKiByb3V0aW5lIGNhbGxlZCB3aGVuIHRoZSBUWCBpcyBkb25lIChmcm9tIHRoZSBFT1QgaW50ZXJydXB0KSAqLworCWludCAoKnR4X2RvbmUpKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKKworCS8qIENoYXJhY3RlciBkZXZpY2UgcGFydHMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHJzZW0sIHdzZW07CisJY2hhciAqcnhkYXRhOworCWludCByeHNpemU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgdHh3YWl0cSwgcnh3YWl0cTsKKwlpbnQgdHhfc3RhdHVzLCByeF9zdGF0dXM7CisKKwkvKiBTUFBQL0hETEMgZGV2aWNlIHBhcnRzICovCisJc3RydWN0IHBwcF9kZXZpY2UgcHBwZGV2OworCXN0cnVjdCBza19idWZmICpyeF9za2IsICp0eF9za2I7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCisvKiBjb3NhLT5maXJtd2FyZV9zdGF0dXMgYml0cyAqLworI2RlZmluZSBDT1NBX0ZXX1JFU0VUCQkoMTw8MCkJLyogSXMgdGhlIFJPTSBtb25pdG9yIGFjdGl2ZT8gKi8KKyNkZWZpbmUgQ09TQV9GV19ET1dOTE9BRAkoMTw8MSkJLyogSXMgdGhlIG1pY3JvY29kZSBkb3dubG9hZGVkPyAqLworI2RlZmluZSBDT1NBX0ZXX1NUQVJUCQkoMTw8MikJLyogSXMgdGhlIG1pY3JvY29kZSBydW5uaW5nPyAqLworCitzdHJ1Y3QgY29zYV9kYXRhIHsKKwlpbnQgbnVtOwkJCS8qIENhcmQgbnVtYmVyICovCisJY2hhciBuYW1lW0NPU0FfTUFYX05BTUVdOwkvKiBDYXJkIG5hbWUgLSBlLmcgImNvc2EwIiAqLworCXVuc2lnbmVkIGludCBkYXRhcmVnLCBzdGF0dXNyZWc7CS8qIEkvTyBwb3J0cyAqLworCXVuc2lnbmVkIHNob3J0IGlycSwgZG1hOwkvKiBJUlEgYW5kIERNQSBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGFydGFkZHI7CS8qIEZpcm13YXJlIHN0YXJ0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBidXNtYXN0ZXI7CS8qIFVzZSBidXNtYXN0ZXJpbmc/ICovCisJaW50IG5jaGFubmVsczsJCQkvKiAjIG9mIGNoYW5uZWxzIG9uIHRoaXMgY2FyZCAqLworCWludCBkcml2ZXJfc3RhdHVzOwkJLyogRm9yIGNvbW11bmljYXRpbmcgd2l0aCBmaXJtd2FyZSAqLworCWludCBmaXJtd2FyZV9zdGF0dXM7CQkvKiBEb3dubG9hZGVkLCByZXNldGVkLCBldGMuICovCisJbG9uZyBpbnQgcnhiaXRtYXAsIHR4Yml0bWFwOwkvKiBCaXRtYXAgb2YgY2hhbm5lbHMgd2hvIGFyZSB3aWxsaW5nIHRvIHNlbmQvcmVjZWl2ZSBkYXRhICovCisJbG9uZyBpbnQgcnh0eDsJCQkvKiBSWCBvciBUWCBpbiBwcm9ncmVzcz8gKi8KKwlpbnQgZW5hYmxlZDsKKwlpbnQgdXNhZ2U7CQkJCS8qIHVzYWdlIGNvdW50ICovCisJaW50IHR4Y2hhbiwgdHhzaXplLCByeHNpemU7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqcnhjaGFuOworCWNoYXIgKmJvdW5jZWJ1ZjsKKwljaGFyICp0eGJ1ZiwgKnJ4YnVmOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW47CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBGb3IgZXhjbHVzaXZlIG9wZXJhdGlvbnMgb24gdGhpcyBzdHJ1Y3R1cmUgKi8KKwljaGFyIGlkX3N0cmluZ1tDT1NBX01BWF9JRF9TVFJJTkddOwkvKiBST00gbW9uaXRvciBJRCBzdHJpbmcgKi8KKwljaGFyICp0eXBlOwkJCQkvKiBjYXJkIHR5cGUgKi8KK307CisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBhbGwgdGhlIHBvc3NpYmxlIHBvcnRzIHRvIGJlIGF1dG9wcm9iZWQuCisgKiBJdCBpcyBoZXJlIGJ1dCBpdCBwcm9iYWJseSBpcyBub3QgYSBnb29kIGlkZWEgdG8gdXNlIHRoaXMuCisgKi8KKy8qICNkZWZpbmUgQ09TQV9JU0FfQVVUT1BST0JFCTEgKi8KKworLyoKKyAqIENoYXJhY3RlciBkZXZpY2UgbWFqb3IgbnVtYmVyLiAxMTcgd2FzIGFsbG9jYXRlZCBmb3IgdXMuCisgKiBUaGUgdmFsdWUgb2YgMCBtZWFucyB0byBhbGxvY2F0ZSBhIGZpcnN0IGZyZWUgb25lLgorICovCitzdGF0aWMgaW50IGNvc2FfbWFqb3IgPSAxMTc7CisKKy8qCisgKiBFbmNvZGluZyBvZiB0aGUgbWlub3IgbnVtYmVyczoKKyAqIFRoZSBsb3dlc3QgQ0FSRF9NSU5PUl9CSVRTIGJpdHMgbWVhbnMgdGhlIGNoYW5uZWwgb24gdGhlIHNpbmdsZSBjYXJkLAorICogdGhlIGhpZ2hlc3QgYml0cyBtZWFucyB0aGUgY2FyZCBudW1iZXIuCisgKi8KKyNkZWZpbmUgQ0FSRF9NSU5PUl9CSVRTCTQJLyogSG93IG1hbnkgYml0cyBpbiBtaW5vciBudW1iZXIgYXJlIHJlc2VydmVkCisJCQkJICogZm9yIHRoZSBzaW5nbGUgY2FyZCAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVwZW5kcyBvbiBDQVJEX01JTk9SX0JJVFMuIFVuZm9ydHVuYXRlbHksIHRoZSAiTU9EVUxFX1NUUklORyIKKyAqIG1hY3JvIGRvZXNuJ3QgbGlrZSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSByYXcgbnVtYmVyIGFzIGFuIGFyZ3VtZW50IDotKAorICovCisjZGVmaW5lIE1BWF9DQVJEUwkxNgorLyogI2RlZmluZSBNQVhfQ0FSRFMJKDEgPDwgKDgtQ0FSRF9NSU5PUl9CSVRTKSkgKi8KKworI2RlZmluZSBEUklWRVJfUlhfUkVBRFkJCTB4MDAwMQorI2RlZmluZSBEUklWRVJfVFhfUkVBRFkJCTB4MDAwMgorI2RlZmluZSBEUklWRVJfVFhNQVBfU0hJRlQJMgorI2RlZmluZSBEUklWRVJfVFhNQVBfTUFTSwkweDBjCS8qIEZJWE1FOiAweGZjIGZvciA4LWNoYW5uZWwgdmVyc2lvbiAqLworCisvKgorICogZm9yIGNvc2EtPnJ4dHggLSBpbmRpY2F0ZXMgd2hldGhlciBlaXRoZXIgdHJhbnNtaXQgb3IgcmVjZWl2ZSBpcworICogaW4gcHJvZ3Jlc3MuIFRoZXNlIHZhbHVlcyBhcmUgbWVhbiBudW1iZXIgb2YgdGhlIGJpdC4KKyAqLworI2RlZmluZSBUWEJJVCAwCisjZGVmaW5lIFJYQklUIDEKKyNkZWZpbmUgSVJRQklUIDIKKworI2RlZmluZSBDT1NBX01UVSAyMDAwCS8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyBleGFjdGx5ICovCisKKyN1bmRlZiBERUJVR19EQVRBIC8vMQkvKiBEdW1wIHRoZSBkYXRhIHJlYWQgb3Igd3JpdHRlbiB0byB0aGUgY2hhbm5lbCAqLworI3VuZGVmIERFQlVHX0lSUVMgLy8xCS8qIFByaW50IHRoZSBtZXNzYWdlIHdoZW4gdGhlIElSUSBpcyByZWNlaXZlZCAqLworI3VuZGVmIERFQlVHX0lPICAgLy8xCS8qIER1bXAgdGhlIEkvTyB0cmFmZmljICovCisKKyNkZWZpbmUgVFhfVElNRU9VVAkoNSpIWikKKworLyogTWF5YmUgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5ICovCitzdGF0aWMgc3RydWN0IGNvc2FfZGF0YSBjb3NhX2NhcmRzW01BWF9DQVJEU107CitzdGF0aWMgaW50IG5yX2NhcmRzOworCisjaWZkZWYgQ09TQV9JU0FfQVVUT1BST0JFCitzdGF0aWMgaW50IGlvW01BWF9DQVJEUysxXSAgPSB7IDB4MjIwLCAweDIyOCwgMHgyMTAsIDB4MjE4LCAwLCB9OworLyogTk9URTogRE1BIGlzIG5vdCBhdXRvcHJvYmVkISEhICovCitzdGF0aWMgaW50IGRtYVtNQVhfQ0FSRFMrMV0gPSB7IDEsIDcsIDEsIDcsIDEsIDcsIDEsIDcsIDAsIH07CisjZWxzZQorc3RhdGljIGludCBpb1tNQVhfQ0FSRFMrMV07CitzdGF0aWMgaW50IGRtYVtNQVhfQ0FSRFMrMV07CisjZW5kaWYKKy8qIElSUSBjYW4gYmUgc2FmZWx5IGF1dG9wcm9iZWQgKi8KK3N0YXRpYyBpbnQgaXJxW01BWF9DQVJEUysxXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgfTsKKworLyogZm9yIGNsYXNzIHN0dWZmKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpjb3NhX2NsYXNzOworCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiVGhlIEkvTyBiYXNlcyBvZiB0aGUgQ09TQSBvciBTUlAgY2FyZHMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlRoZSBJUlEgbGluZXMgb2YgdGhlIENPU0Egb3IgU1JQIGNhcmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJUaGUgRE1BIGNoYW5uZWxzIG9mIHRoZSBDT1NBIG9yIFNSUCBjYXJkcyIpOworCitNT0RVTEVfQVVUSE9SKCJKYW4gXCJZZW55YVwiIEthc3ByemFrLCA8a2FzQGZpLm11bmkuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1vZHVsYXIgZHJpdmVyIGZvciB0aGUgQ09TQSBvciBTUlAgc3luY2hyb25vdXMgY2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2VuZGlmCisKKy8qIEkgdXNlIHRoaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisjaWZkZWYgQ09TQV9TTE9XX0lPCisjZGVmaW5lIGNvc2Ffb3V0YiBvdXRiX3AKKyNkZWZpbmUgY29zYV9vdXR3IG91dHdfcAorI2RlZmluZSBjb3NhX2luYiAgaW5iX3AKKyNkZWZpbmUgY29zYV9pbncgIGlud19wCisjZWxzZQorI2RlZmluZSBjb3NhX291dGIgb3V0YgorI2RlZmluZSBjb3NhX291dHcgb3V0dworI2RlZmluZSBjb3NhX2luYiAgaW5iCisjZGVmaW5lIGNvc2FfaW53ICBpbncKKyNlbmRpZgorCisjZGVmaW5lIGlzXzhiaXQoY29zYSkJCSghKGNvc2EtPmRhdGFyZWcgJiAweDA4KSkKKworI2RlZmluZSBjb3NhX2dldHN0YXR1cyhjb3NhKQkoY29zYV9pbmIoY29zYS0+c3RhdHVzcmVnKSkKKyNkZWZpbmUgY29zYV9wdXRzdGF0dXMoY29zYSwgc3RhdCkJKGNvc2Ffb3V0YihzdGF0LCBjb3NhLT5zdGF0dXNyZWcpKQorI2RlZmluZSBjb3NhX2dldGRhdGExNihjb3NhKQkoY29zYV9pbncoY29zYS0+ZGF0YXJlZykpCisjZGVmaW5lIGNvc2FfZ2V0ZGF0YTgoY29zYSkJKGNvc2FfaW5iKGNvc2EtPmRhdGFyZWcpKQorI2RlZmluZSBjb3NhX3B1dGRhdGExNihjb3NhLCBkdCkJKGNvc2Ffb3V0dyhkdCwgY29zYS0+ZGF0YXJlZykpCisjZGVmaW5lIGNvc2FfcHV0ZGF0YTgoY29zYSwgZHQpCShjb3NhX291dGIoZHQsIGNvc2EtPmRhdGFyZWcpKQorCisvKiBJbml0aWFsaXphdGlvbiBzdHVmZiAqLworc3RhdGljIGludCBjb3NhX3Byb2JlKGludCBpb2FkZHIsIGludCBpcnEsIGludCBkbWEpOworCisvKiBIVyBpbnRlcmZhY2UgKi8KK3N0YXRpYyB2b2lkIGNvc2FfZW5hYmxlX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pOworc3RhdGljIHZvaWQgY29zYV9kaXNhYmxlX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pOworc3RhdGljIGludCBjb3NhX3N0YXJ0X3R4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIHZvaWQgY29zYV9raWNrKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpOworc3RhdGljIGludCBjb3NhX2RtYV9hYmxlKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGNoYXIgKmJ1ZiwgaW50IGRhdGEpOworCisvKiBTUFBQL0hETEMgc3R1ZmYgKi8KK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pOworc3RhdGljIHZvaWQgc3BwcF9jaGFubmVsX2RlbGV0ZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyBpbnQgY29zYV9zcHBwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmQpOworc3RhdGljIGludCBjb3NhX3NwcHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmQpOworc3RhdGljIHZvaWQgY29zYV9zcHBwX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmQpOworc3RhdGljIGludCBjb3NhX3NwcHBfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmQpOworc3RhdGljIGNoYXIgKnNwcHBfc2V0dXBfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworc3RhdGljIGludCBzcHBwX3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCk7CitzdGF0aWMgaW50IHNwcHBfdHhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IGNvc2Ffc3BwcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvc2FfbmV0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBDaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgdm9pZCBjaGFyZGV2X2NoYW5uZWxfaW5pdChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyBjaGFyICpjaHJkZXZfc2V0dXBfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworc3RhdGljIGludCBjaHJkZXZfcnhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsKTsKK3N0YXRpYyBpbnQgY2hyZGV2X3R4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworc3RhdGljIHNzaXplX3QgY29zYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGNvc2Ffd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHVuc2lnbmVkIGludCBjb3NhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnBvbGwpOworc3RhdGljIGludCBjb3NhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBjb3NhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBjb3NhX2NoYXJkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2lmZGVmIENPU0FfRkFTWU5DX1dPUktJTkcKK3N0YXRpYyBpbnQgY29zYV9mYXN5bmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbik7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29zYV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBjb3NhX3JlYWQsCisJLndyaXRlCQk9IGNvc2Ffd3JpdGUsCisJLnBvbGwJCT0gY29zYV9wb2xsLAorCS5pb2N0bAkJPSBjb3NhX2NoYXJkZXZfaW9jdGwsCisJLm9wZW4JCT0gY29zYV9vcGVuLAorCS5yZWxlYXNlCT0gY29zYV9yZWxlYXNlLAorI2lmZGVmIENPU0FfRkFTWU5DX1dPUktJTkcKKwkuZmFzeW5jCQk9IGNvc2FfZmFzeW5jLAorI2VuZGlmCit9OworCisvKiBJb2N0bHMgKi8KK3N0YXRpYyBpbnQgY29zYV9zdGFydChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcyk7CitzdGF0aWMgaW50IGNvc2FfcmVzZXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CitzdGF0aWMgaW50IGNvc2FfZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgdm9pZCBfX3VzZXIgKmEpOworc3RhdGljIGludCBjb3NhX3JlYWRtZW0oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgdm9pZCBfX3VzZXIgKmEpOworCisvKiBDT1NBL1NSUCBST00gbW9uaXRvciAqLworc3RhdGljIGludCBkb3dubG9hZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgaW50IGFkZHIsIGludCBsZW4pOworc3RhdGljIGludCBzdGFydG1pY3JvY29kZShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcyk7CitzdGF0aWMgaW50IHJlYWRtZW0oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciBfX3VzZXIgKmRhdGEsIGludCBhZGRyLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgY29zYV9yZXNldF9hbmRfcmVhZF9pZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjaGFyICppZCk7CisKKy8qIEF1eGlsbGlhcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGdldF93YWl0X2RhdGEoc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CitzdGF0aWMgaW50IHB1dF93YWl0X2RhdGEoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpOworc3RhdGljIGludCBwdXRoZXhudW1iZXIoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IG51bWJlcik7CitzdGF0aWMgdm9pZCBwdXRfZHJpdmVyX3N0YXR1cyhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKTsKK3N0YXRpYyB2b2lkIHB1dF9kcml2ZXJfc3RhdHVzX25vbG9jayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKTsKKworLyogSW50ZXJydXB0IGhhbmRsaW5nICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY29zYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29zYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKiBJL08gb3BzIGRlYnVnZ2luZyAqLworI2lmZGVmIERFQlVHX0lPCitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2luKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKTsKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKTsKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfY21kKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKTsKK3N0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19vdXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cyk7CisjZW5kaWYKKworDAorLyogLS0tLS0tLS0tLSBJbml0aWFsaXphdGlvbiBzdHVmZiAtLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGNvc2FfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSB2MS4wOCAoYykgMTk5Ny0yMDAwIEphbiBLYXNwcnphayA8a2FzQGZpLm11bmkuY3o+XG4iKTsKKyNpZmRlZiBDT05GSUdfU01QCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYTogU01QIGZvdW5kLiBQbGVhc2UgbWFpbCBhbnkgc3VjY2Vzcy9mYWlsdXJlIHJlcG9ydHMgdG8gdGhlIGF1dGhvci5cbiIpOworI2VuZGlmCisJaWYgKGNvc2FfbWFqb3IgPiAwKSB7CisJCWlmIChyZWdpc3Rlcl9jaHJkZXYoY29zYV9tYWpvciwgImNvc2EiLCAmY29zYV9mb3BzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogdW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwKKwkJCQljb3NhX21ham9yKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKGNvc2FfbWFqb3I9cmVnaXN0ZXJfY2hyZGV2KDAsICJjb3NhIiwgJmNvc2FfZm9wcykpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb3NhOiB1bmFibGUgdG8gcmVnaXN0ZXIgY2hhcmRldlxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJZm9yIChpPTA7IGk8TUFYX0NBUkRTOyBpKyspCisJCWNvc2FfY2FyZHNbaV0ubnVtID0gLTE7CisJZm9yIChpPTA7IGlvW2ldICE9IDAgJiYgaSA8IE1BWF9DQVJEUzsgaSsrKQorCQljb3NhX3Byb2JlKGlvW2ldLCBpcnFbaV0sIGRtYVtpXSk7CisJaWYgKCFucl9jYXJkcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb3NhOiBubyBkZXZpY2VzIGZvdW5kLlxuIik7CisJCXVucmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlkZXZmc19ta19kaXIoImNvc2EiKTsKKwljb3NhX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgImNvc2EiKTsKKwlpZiAoSVNfRVJSKGNvc2FfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIoY29zYV9jbGFzcyk7CisJCWdvdG8gb3V0X2NocmRldjsKKwl9CisJZm9yIChpPTA7IGk8bnJfY2FyZHM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjb3NhX2NsYXNzLCBNS0RFVihjb3NhX21ham9yLCBpKSwKKwkJCQlOVUxMLCAiY29zYSVkIiwgaSk7CisJCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoY29zYV9tYWpvciwgaSksCisJCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsCisJCQkJImNvc2EvJWQiLCBpKTsKKwkJaWYgKGVycikgeworCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoY29zYV9tYWpvciwgaSkpOworCQkJZ290byBvdXRfY2hyZGV2OwkJCisJCX0KKwl9CisJZXJyID0gMDsKKwlnb3RvIG91dDsKKwkKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoY29zYV9tYWpvciwgImNvc2EiKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoY29zYV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGNvc2FfZXhpdCh2b2lkKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2E7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkaW5nIHRoZSBjb3NhIG1vZHVsZVxuIik7CisKKwlmb3IgKGk9MDsgaTxucl9jYXJkczsgaSsrKSB7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKGNvc2FfbWFqb3IsIGkpKTsKKwkJZGV2ZnNfcmVtb3ZlKCJjb3NhLyVkIiwgaSk7CisJfQorCWNsYXNzX3NpbXBsZV9kZXN0cm95KGNvc2FfY2xhc3MpOworCWRldmZzX3JlbW92ZSgiY29zYSIpOworCWZvciAoY29zYT1jb3NhX2NhcmRzOyBucl9jYXJkcy0tOyBjb3NhKyspIHsKKwkJLyogQ2xlYW4gdXAgdGhlIHBlci1jaGFubmVsIGRhdGEgKi8KKwkJZm9yIChpPTA7IGk8Y29zYS0+bmNoYW5uZWxzOyBpKyspIHsKKwkJCS8qIENoYXJkZXYgZHJpdmVyIGhhcyBubyBhbGxvYydkIHBlci1jaGFubmVsIGRhdGEgKi8KKwkJCXNwcHBfY2hhbm5lbF9kZWxldGUoY29zYS0+Y2hhbitpKTsKKwkJfQorCQkvKiBDbGVhbiB1cCB0aGUgcGVyLWNhcmQgZGF0YSAqLworCQlrZnJlZShjb3NhLT5jaGFuKTsKKwkJa2ZyZWUoY29zYS0+Ym91bmNlYnVmKTsKKwkJZnJlZV9pcnEoY29zYS0+aXJxLCBjb3NhKTsKKwkJZnJlZV9kbWEoY29zYS0+ZG1hKTsKKwkJcmVsZWFzZV9yZWdpb24oY29zYS0+ZGF0YXJlZyxpc184Yml0KGNvc2EpPzI6NCk7CisJfQorCXVucmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIik7Cit9Cittb2R1bGVfZXhpdChjb3NhX2V4aXQpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmVnaXN0ZXIgYWxsIHRoZSBuZXQgZGV2aWNlcyBuZWVkZWQgZm9yIHRoZQorICogc2luZ2xlIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJc3ByaW50ZihjaGFuLT5uYW1lLCAiY29zYSVkYyVkIiwgY2hhbi0+Y29zYS0+bnVtLCBjaGFuLT5udW0pOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hhcmRldiBkYXRhIHN0cnVjdHVyZXMgKi8KKwljaGFyZGV2X2NoYW5uZWxfaW5pdChjaGFuKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBzcHBwIGludGVyZmFjZSAqLworCXNwcHBfY2hhbm5lbF9pbml0KGNoYW4pOworfQorCQorc3RhdGljIGludCBjb3NhX3Byb2JlKGludCBiYXNlLCBpbnQgaXJxLCBpbnQgZG1hKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjb3NhX2NhcmRzK25yX2NhcmRzOworCWludCBpLCBlcnIgPSAwOworCisJbWVtc2V0KGNvc2EsIDAsIHNpemVvZihzdHJ1Y3QgY29zYV9kYXRhKSk7CisKKwkvKiBDaGVja2luZyB2YWxpZGl0eSBvZiBwYXJhbWV0ZXJzOiAqLworCS8qIElSUSBzaG91bGQgYmUgMi03IG9yIDEwLTE1OyBuZWdhdGl2ZSBJUlEgbWVhbnMgYXV0b3Byb2JlICovCisJaWYgKChpcnEgPj0gMCAgJiYgaXJxIDwgMikgfHwgaXJxID4gMTUgfHwgKGlycSA8IDEwICYmIGlycSA+IDcpKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJjb3NhX3Byb2JlOiBpbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBJL08gYWRkcmVzcyBzaG91bGQgYmUgYmV0d2VlbiAweDEwMCBhbmQgMHgzZmYgYW5kIHNob3VsZCBiZQorCSAqIG11bHRpcGxlIG9mIDguICovCisJaWYgKGJhc2UgPCAweDEwMCB8fCBiYXNlID4gMHgzZmYgfHwgYmFzZSAmIDB4NykgeworCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYV9wcm9iZTogaW52YWxpZCBJL08gYWRkcmVzcyAweCV4XG4iLAorCQkJYmFzZSk7CisJCXJldHVybiAtMTsKKwl9CisJLyogRE1BIHNob3VsZCBiZSAwLDEgb3IgMy03ICovCisJaWYgKGRtYSA8IDAgfHwgZG1hID09IDQgfHwgZG1hID4gNykgeworCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYV9wcm9iZTogaW52YWxpZCBETUEgJWRcbiIsIGRtYSk7CisJCXJldHVybiAtMTsKKwl9CisJLyogYW5kIGZpbmFsbHksIG9uIDE2LWJpdCBDT1NBIERNQSBzaG91bGQgYmUgNC03IGFuZCAKKwkgKiBJL08gYmFzZSBzaG91bGQgbm90IGJlIG11bHRpcGxlIG9mIDB4MTAgKi8KKwlpZiAoKChiYXNlICYgMHg4KSAmJiBkbWEgPCA0KSB8fCAoIShiYXNlICYgMHg4KSAmJiBkbWEgPiAzKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYV9wcm9iZTogOC8xNiBiaXQgYmFzZSBhbmQgRE1BIG1pc21hdGNoIgorCQkJIiAoYmFzZT0weCV4LCBkbWE9JWQpXG4iLCBiYXNlLCBkbWEpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29zYS0+ZG1hID0gZG1hOworCWNvc2EtPmRhdGFyZWcgPSBiYXNlOworCWNvc2EtPnN0YXR1c3JlZyA9IGlzXzhiaXQoY29zYSk/YmFzZSsxOmJhc2UrMjsKKwlzcGluX2xvY2tfaW5pdCgmY29zYS0+bG9jayk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIGlzXzhiaXQoY29zYSk/Mjo0LCJjb3NhIikpCisJCXJldHVybiAtMTsKKwkKKwlpZiAoY29zYV9yZXNldF9hbmRfcmVhZF9pZChjb3NhLCBjb3NhLT5pZF9zdHJpbmcpIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiY29zYTogcHJvYmUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBUZXN0IHRoZSB2YWxpZGl0eSBvZiBpZGVudGlmaWNhdGlvbiBzdHJpbmcgKi8KKwlpZiAoIXN0cm5jbXAoY29zYS0+aWRfc3RyaW5nLCAiU1JQIiwgMykpCisJCWNvc2EtPnR5cGUgPSAic3JwIjsKKwllbHNlIGlmICghc3RybmNtcChjb3NhLT5pZF9zdHJpbmcsICJDT1NBIiwgNCkpCisJCWNvc2EtPnR5cGUgPSBpc184Yml0KGNvc2EpPyAiY29zYTgiOiAiY29zYTE2IjsKKwllbHNlIHsKKy8qIFByaW50IGEgd2FybmluZyBvbmx5IGlmIHdlIGFyZSBub3QgYXV0b3Byb2JpbmcgKi8KKyNpZm5kZWYgQ09TQV9JU0FfQVVUT1BST0JFCisJCXByaW50ayhLRVJOX0lORk8gImNvc2E6IHZhbGlkIHNpZ25hdHVyZSBub3QgZm91bmQgYXQgMHgleC5cbiIsCisJCQliYXNlKTsKKyNlbmRpZgorCQllcnIgPSAtMTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBVcGRhdGUgdGhlIG5hbWUgb2YgdGhlIHJlZ2lvbiBub3cgd2Uga25vdyB0aGUgdHlwZSBvZiBjYXJkICovIAorCXJlbGVhc2VfcmVnaW9uKGJhc2UsIGlzXzhiaXQoY29zYSk/Mjo0KTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIGlzXzhiaXQoY29zYSk/Mjo0LCBjb3NhLT50eXBlKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiY29zYTogY2hhbmdpbmcgbmFtZSBhdCAweCV4IGZhaWxlZC5cbiIsIGJhc2UpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTm93IGRvIElSUSBhdXRvcHJvYmUgKi8KKwlpZiAoaXJxIDwgMCkgeworCQl1bnNpZ25lZCBsb25nIGlycXM7CisvKgkJcHJpbnRrKEtFUk5fSU5GTyAiSVJRIGF1dG9wcm9iZVxuIik7ICovCisJCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKwkJLyogCisJCSAqIEVuYWJsZSBpbnRlcnJ1cHQgb24gdHggYnVmZmVyIGVtcHR5IChpdCBzdXJlIGlzKSAKKwkJICogcmVhbGx5IHN1cmUgPworCQkgKiBGSVhNRTogV2hlbiB0aGlzIGNvZGUgaXMgbm90IHVzZWQgYXMgbW9kdWxlLCB3ZSBzaG91bGQKKwkJICogcHJvYmFibHkgY2FsbCB1ZGVsYXkoKSBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHRpYmxlIHNsZWVwLgorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfVFhfSU5UX0VOQSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMzApOworCQlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOworCQkvKiBEaXNhYmxlIGFsbCBJUlFzIGZyb20gdGhlIGNhcmQgKi8KKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisJCS8qIEVtcHR5IHRoZSByZWNlaXZlZCBkYXRhIHJlZ2lzdGVyICovCisJCWNvc2FfZ2V0ZGF0YTgoY29zYSk7CisKKwkJaWYgKGlycSA8IDApIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJjb3NhIElSUSBhdXRvcHJvYmU6IG11bHRpcGxlIGludGVycnVwdHMgb2J0YWluZWQgKCVkLCBib2FyZCBhdCAweCV4KVxuIiwKKwkJCQlpcnEsIGNvc2EtPmRhdGFyZWcpOworCQkJZXJyID0gLTE7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJaWYgKGlycSA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYSBJUlEgYXV0b3Byb2JlOiBubyBpbnRlcnJ1cHQgb2J0YWluZWQgKGJvYXJkIGF0IDB4JXgpXG4iLAorCQkJCWNvc2EtPmRhdGFyZWcpOworCQkvKglyZXR1cm4gLTE7ICovCisJCX0KKwl9CisKKwljb3NhLT5pcnEgPSBpcnE7CisJY29zYS0+bnVtID0gbnJfY2FyZHM7CisJY29zYS0+dXNhZ2UgPSAwOworCWNvc2EtPm5jaGFubmVscyA9IDI7CS8qIEZJWE1FOiBob3cgdG8gZGV0ZXJtaW5lIHRoaXM/ICovCisKKwlpZiAocmVxdWVzdF9pcnEoY29zYS0+aXJxLCBjb3NhX2ludGVycnVwdCwgMCwgY29zYS0+dHlwZSwgY29zYSkpIHsKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKHJlcXVlc3RfZG1hKGNvc2EtPmRtYSwgY29zYS0+dHlwZSkpIHsKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX291dDE7CisJfQorCQorCWNvc2EtPmJvdW5jZWJ1ZiA9IGttYWxsb2MoQ09TQV9NVFUsIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYgKCFjb3NhLT5ib3VuY2VidWYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisJc3ByaW50Zihjb3NhLT5uYW1lLCAiY29zYSVkIiwgY29zYS0+bnVtKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBlci1jaGFubmVsIGRhdGEgKi8KKwljb3NhLT5jaGFuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWxfZGF0YSkqY29zYS0+bmNoYW5uZWxzLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvc2EtPmNoYW4pIHsKKwkgICAgICAgIGVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDM7CisJfQorCW1lbXNldChjb3NhLT5jaGFuLCAwLCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfZGF0YSkqY29zYS0+bmNoYW5uZWxzKTsKKwlmb3IgKGk9MDsgaTxjb3NhLT5uY2hhbm5lbHM7IGkrKykgeworCQljb3NhLT5jaGFuW2ldLmNvc2EgPSBjb3NhOworCQljb3NhLT5jaGFuW2ldLm51bSA9IGk7CisJCWNoYW5uZWxfaW5pdChjb3NhLT5jaGFuK2kpOworCX0KKworCXByaW50ayAoS0VSTl9JTkZPICJjb3NhJWQ6ICVzICglcyBhdCAweCV4IGlycSAlZCBkbWEgJWQpLCAlZCBjaGFubmVsc1xuIiwKKwkJY29zYS0+bnVtLCBjb3NhLT5pZF9zdHJpbmcsIGNvc2EtPnR5cGUsCisJCWNvc2EtPmRhdGFyZWcsIGNvc2EtPmlycSwgY29zYS0+ZG1hLCBjb3NhLT5uY2hhbm5lbHMpOworCisJcmV0dXJuIG5yX2NhcmRzKys7CitlcnJfb3V0MzoKKwlrZnJlZShjb3NhLT5ib3VuY2VidWYpOworZXJyX291dDI6CisJZnJlZV9kbWEoY29zYS0+ZG1hKTsKK2Vycl9vdXQxOgorCWZyZWVfaXJxKGNvc2EtPmlycSwgY29zYSk7CitlcnJfb3V0OgkKKwlyZWxlYXNlX3JlZ2lvbihjb3NhLT5kYXRhcmVnLGlzXzhiaXQoY29zYSk/Mjo0KTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogYWxsb2NhdGluZyByZXNvdXJjZXMgZmFpbGVkXG4iLAorCSAgICAgICBjb3NhLT5udW0pOworCXJldHVybiBlcnI7Cit9CisKKwwKKy8qLS0tLS0tLS0tLSBTUFBQL0hETEMgbmV0ZGV2aWNlIC0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY29zYV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlkLT5vcGVuID0gY29zYV9zcHBwX29wZW47CisJZC0+c3RvcCA9IGNvc2Ffc3BwcF9jbG9zZTsKKwlkLT5oYXJkX3N0YXJ0X3htaXQgPSBjb3NhX3NwcHBfdHg7CisJZC0+ZG9faW9jdGwgPSBjb3NhX3NwcHBfaW9jdGw7CisJZC0+Z2V0X3N0YXRzID0gY29zYV9uZXRfc3RhdHM7CisJZC0+dHhfdGltZW91dCA9IGNvc2Ffc3BwcF90aW1lb3V0OworCWQtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKK30KKworc3RhdGljIHZvaWQgc3BwcF9jaGFubmVsX2luaXQoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZDsKKwljaGFuLT5pZl9wdHIgPSAmY2hhbi0+cHBwZGV2OworCWQgPSBhbGxvY19uZXRkZXYoMCwgY2hhbi0+bmFtZSwgY29zYV9zZXR1cCk7CisJaWYgKCFkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBhbGxvY19uZXRkZXYgZmFpbGVkLlxuIiwgY2hhbi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJY2hhbi0+cHBwZGV2LmRldiA9IGQ7CisJZC0+YmFzZV9hZGRyID0gY2hhbi0+Y29zYS0+ZGF0YXJlZzsKKwlkLT5pcnEgPSBjaGFuLT5jb3NhLT5pcnE7CisJZC0+ZG1hID0gY2hhbi0+Y29zYS0+ZG1hOworCWQtPnByaXYgPSBjaGFuOworCXNwcHBfYXR0YWNoKCZjaGFuLT5wcHBkZXYpOworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX25ldGRldiBmYWlsZWQuXG4iLCBkLT5uYW1lKTsKKwkJc3BwcF9kZXRhY2goZCk7CisJCWZyZWVfbmV0ZGV2KGQpOworCQljaGFuLT5wcHBkZXYuZGV2ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgc3BwcF9jaGFubmVsX2RlbGV0ZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGNoYW4tPnBwcGRldi5kZXYpOworCXNwcHBfZGV0YWNoKGNoYW4tPnBwcGRldi5kZXYpOworCWZyZWVfbmV0ZGV2KGNoYW4tPnBwcGRldi5kZXYpOworCWNoYW4tPnBwcGRldi5kZXYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGNvc2Ffc3BwcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBkLT5wcml2OworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGNoYW4tPmNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCWNoYW4tPmNvc2EtPm5hbWUsIGNoYW4tPmNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJaWYgKGNoYW4tPnVzYWdlICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwcHBfb3BlbiBjYWxsZWQgd2l0aCB1c2FnZSBjb3VudCAlZFxuIiwKKwkJCWNoYW4tPm5hbWUsIGNoYW4tPnVzYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGFuLT5zZXR1cF9yeCA9IHNwcHBfc2V0dXBfcng7CisJY2hhbi0+dHhfZG9uZSA9IHNwcHBfdHhfZG9uZTsKKwljaGFuLT5yeF9kb25lID0gc3BwcF9yeF9kb25lOworCWNoYW4tPnVzYWdlPS0xOworCWNoYW4tPmNvc2EtPnVzYWdlKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCisJZXJyID0gc3BwcF9vcGVuKGQpOworCWlmIChlcnIpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJY2hhbi0+dXNhZ2U9MDsKKwkJY2hhbi0+Y29zYS0+dXNhZ2UtLTsKKwkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkKTsKKwljb3NhX2VuYWJsZV9yeChjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJY2hhbi0+dHhfc2tiID0gc2tiOworCWNvc2Ffc3RhcnRfdHgoY2hhbiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvc2Ffc3BwcF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmICh0ZXN0X2JpdChSWEJJVCwgJmNoYW4tPmNvc2EtPnJ4dHgpKSB7CisJCWNoYW4tPnN0YXRzLnJ4X2Vycm9ycysrOworCQljaGFuLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJfSBlbHNlIHsKKwkJY2hhbi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWNoYW4tPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfQorCWNvc2Ffa2ljayhjaGFuLT5jb3NhKTsKKwlpZiAoY2hhbi0+dHhfc2tiKSB7CisJCWRldl9rZnJlZV9za2IoY2hhbi0+dHhfc2tiKTsKKwkJY2hhbi0+dHhfc2tiID0gTlVMTDsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGNvc2Ffc3BwcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuID0gZC0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkKTsKKwlzcHBwX2Nsb3NlKGQpOworCWNvc2FfZGlzYWJsZV9yeChjaGFuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCWlmIChjaGFuLT5yeF9za2IpIHsKKwkJa2ZyZWVfc2tiKGNoYW4tPnJ4X3NrYik7CisJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisJfQorCWlmIChjaGFuLT50eF9za2IpIHsKKwkJa2ZyZWVfc2tiKGNoYW4tPnR4X3NrYik7CisJCWNoYW4tPnR4X3NrYiA9IE5VTEw7CisJfQorCWNoYW4tPnVzYWdlPTA7CisJY2hhbi0+Y29zYS0+dXNhZ2UtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpzcHBwX3NldHVwX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGludCBzaXplKQoreworCS8qCisJICogV2UgY2FuIHNhZmVseSBmYWxsIGJhY2sgdG8gbm9uLWRtYS1hYmxlIG1lbW9yeSwgYmVjYXVzZSB3ZSBoYXZlCisJICogdGhlIGNvc2EtPmJvdW5jZWJ1ZiBwcmUtYWxsb2NhdGVkLgorCSAqLworCWlmIChjaGFuLT5yeF9za2IpCisJCWtmcmVlX3NrYihjaGFuLT5yeF9za2IpOworCWNoYW4tPnJ4X3NrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJaWYgKGNoYW4tPnJ4X3NrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsCisJCQljaGFuLT5uYW1lKTsKKwkJY2hhbi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY2hhbi0+cHBwZGV2LmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiBza2JfcHV0KGNoYW4tPnJ4X3NrYiwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3BwcF9yeF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJaWYgKCFjaGFuLT5yeF9za2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJ4X2RvbmUgd2l0aCBlbXB0eSBza2IhXG4iLAorCQkJY2hhbi0+bmFtZSk7CisJCWNoYW4tPnN0YXRzLnJ4X2Vycm9ycysrOworCQljaGFuLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCWNoYW4tPnJ4X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKKwljaGFuLT5yeF9za2ItPmRldiA9IGNoYW4tPnBwcGRldi5kZXY7CisJY2hhbi0+cnhfc2tiLT5tYWMucmF3ID0gY2hhbi0+cnhfc2tiLT5kYXRhOworCWNoYW4tPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwljaGFuLT5zdGF0cy5yeF9ieXRlcyArPSBjaGFuLT5jb3NhLT5yeHNpemU7CisJbmV0aWZfcngoY2hhbi0+cnhfc2tiKTsKKwljaGFuLT5yeF9za2IgPSBOVUxMOworCWNoYW4tPnBwcGRldi5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludCBzcHBwX3R4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgaW50IHNpemUpCit7CisJaWYgKCFjaGFuLT50eF9za2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHR4X2RvbmUgd2l0aCBlbXB0eSBza2IhXG4iLAorCQkJY2hhbi0+bmFtZSk7CisJCWNoYW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQljaGFuLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisJZGV2X2tmcmVlX3NrYl9pcnEoY2hhbi0+dHhfc2tiKTsKKwljaGFuLT50eF9za2IgPSBOVUxMOworCWNoYW4tPnN0YXRzLnR4X3BhY2tldHMrKzsKKwljaGFuLT5zdGF0cy50eF9ieXRlcyArPSBzaXplOworCW5ldGlmX3dha2VfcXVldWUoY2hhbi0+cHBwZGV2LmRldik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY29zYV9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuID0gZGV2LT5wcml2OworCXJldHVybiAmY2hhbi0+c3RhdHM7Cit9CisKKwwKKy8qLS0tLS0tLS0tLSBDaGFyYWN0ZXIgZGV2aWNlIC0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY2hhcmRldl9jaGFubmVsX2luaXQoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlpbml0X01VVEVYKCZjaGFuLT5yc2VtKTsKKwlpbml0X01VVEVYKCZjaGFuLT53c2VtKTsKK30KKworc3RhdGljIHNzaXplX3QgY29zYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKwljaGFyICprYnVmOworCisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19TVEFSVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RhcnQgdGhlIGZpcm13YXJlIGZpcnN0IChzdGF0dXMgJWQpXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2hhbi0+cnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCisJaWYgKChjaGFuLT5yeGRhdGEgPSBrbWFsbG9jKENPU0FfTVRVLCBHRlBfRE1BfEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3NhX3JlYWQoKSAtIE9PTVxuIiwgY29zYS0+bmFtZSk7CisJCXVwKCZjaGFuLT5yc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2hhbi0+cnhfc3RhdHVzID0gMDsKKwljb3NhX2VuYWJsZV9yeChjaGFuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlKCZjaGFuLT5yeHdhaXRxLCAmd2FpdCk7CisJd2hpbGUoIWNoYW4tPnJ4X3N0YXR1cykgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgY2hhbi0+cnhfc3RhdHVzID09IDApIHsKKwkJCWNoYW4tPnJ4X3N0YXR1cyA9IDE7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+cnh3YWl0cSwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQl1cCgmY2hhbi0+cnNlbSk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGFuLT5yeHdhaXRxLCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJa2J1ZiA9IGNoYW4tPnJ4ZGF0YTsKKwljb3VudCA9IGNoYW4tPnJ4c2l6ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJdXAoJmNoYW4tPnJzZW0pOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGtidWYsIGNvdW50KSkgeworCQlrZnJlZShrYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWtmcmVlKGtidWYpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNoYXIgKmNocmRldl9zZXR1cF9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBpbnQgc2l6ZSkKK3sKKwkvKiBFeHBlY3Qgc2l6ZSA8PSBDT1NBX01UVSAqLworCWNoYW4tPnJ4c2l6ZSA9IHNpemU7CisJcmV0dXJuIGNoYW4tPnJ4ZGF0YTsKK30KKworc3RhdGljIGludCBjaHJkZXZfcnhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCWlmIChjaGFuLT5yeF9zdGF0dXMpIHsgLyogUmVhZGVyIGhhcyBkaWVkICovCisJCWtmcmVlKGNoYW4tPnJ4ZGF0YSk7CisJCXVwKCZjaGFuLT53c2VtKTsKKwl9CisJY2hhbi0+cnhfc3RhdHVzID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW4tPnJ4d2FpdHEpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGNvc2Ffd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgKmtidWY7CisKKwlpZiAoIShjb3NhLT5maXJtd2FyZV9zdGF0dXMgJiBDT1NBX0ZXX1NUQVJUKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzdGFydCB0aGUgZmlybXdhcmUgZmlyc3QgKHN0YXR1cyAlZClcbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaGFuLT53c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChjb3VudCA+IENPU0FfTVRVKQorCQljb3VudCA9IENPU0FfTVRVOworCQorCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KKwlpZiAoKGtidWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMfEdGUF9ETUEpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNvc2Ffd3JpdGUoKSBPT00gLSBkcm9wcGluZyBwYWNrZXRcbiIsCisJCQljb3NhLT5uYW1lKTsKKwkJdXAoJmNoYW4tPndzZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgY291bnQpKSB7CisJCXVwKCZjaGFuLT53c2VtKTsKKwkJa2ZyZWUoa2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwljaGFuLT50eF9zdGF0dXM9MDsKKwljb3NhX3N0YXJ0X3R4KGNoYW4sIGtidWYsIGNvdW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJYWRkX3dhaXRfcXVldWUoJmNoYW4tPnR4d2FpdHEsICZ3YWl0KTsKKwl3aGlsZSghY2hhbi0+dHhfc3RhdHVzKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBjaGFuLT50eF9zdGF0dXMgPT0gMCkgeworCQkJY2hhbi0+dHhfc3RhdHVzID0gMTsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGFuLT50eHdhaXRxLCAmd2FpdCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCWNoYW4tPnR4X3N0YXR1cyA9IDE7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGFuLT50eHdhaXRxLCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJdXAoJmNoYW4tPndzZW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlrZnJlZShrYnVmKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgY2hyZGV2X3R4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgaW50IHNpemUpCit7CisJaWYgKGNoYW4tPnR4X3N0YXR1cykgeyAvKiBXcml0ZXIgd2FzIGludGVycnVwdGVkICovCisJCWtmcmVlKGNoYW4tPnR4YnVmKTsKKwkJdXAoJmNoYW4tPndzZW0pOworCX0KKwljaGFuLT50eF9zdGF0dXMgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hhbi0+dHh3YWl0cSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29zYV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwb2xsKQoreworCXByaW50ayhLRVJOX0lORk8gImNvc2FfcG9sbCBpcyBoZXJlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3NhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG47CisKKwlpZiAoKG49aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKT4+Q0FSRF9NSU5PUl9CSVRTKQorCQk+PSBucl9jYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJY29zYSA9IGNvc2FfY2FyZHMrbjsKKworCWlmICgobj1pbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpCisJCSYgKCgxPDxDQVJEX01JTk9SX0JJVFMpLTEpKSA+PSBjb3NhLT5uY2hhbm5lbHMpCisJCXJldHVybiAtRU5PREVWOworCWNoYW4gPSBjb3NhLT5jaGFuICsgbjsKKwkKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjaGFuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCWlmIChjaGFuLT51c2FnZSA8IDApIHsgLyogaW4gbmV0ZGV2IG1vZGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljb3NhLT51c2FnZSsrOworCWNoYW4tPnVzYWdlKys7CisKKwljaGFuLT50eF9kb25lID0gY2hyZGV2X3R4X2RvbmU7CisJY2hhbi0+c2V0dXBfcnggPSBjaHJkZXZfc2V0dXBfcng7CisJY2hhbi0+cnhfZG9uZSA9IGNocmRldl9yeF9kb25lOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3NhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb3NhID0gY2hhbm5lbC0+Y29zYTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWNvc2EtPnVzYWdlLS07CisJY2hhbm5lbC0+dXNhZ2UtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT1NBX0ZBU1lOQ19XT1JLSU5HCitzdGF0aWMgc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luY1syNTZdID0geyBOVUxMLCB9OworCisvKiBUbyBiZSBkb25lIC4uLiAqLworc3RhdGljIGludCBjb3NhX2Zhc3luYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworICAgICAgICBpbnQgcG9ydCA9IGltaW5vcihpbm9kZSk7CisgICAgICAgIGludCBydiA9IGZhc3luY19oZWxwZXIoaW5vZGUsIGZpbGUsIG9uLCAmZmFzeW5jW3BvcnRdKTsKKyAgICAgICAgcmV0dXJuIHJ2IDwgMCA/IHJ2IDogMDsKK30KKyNlbmRpZgorCisMCisvKiAtLS0tLS0tLS0tIElvY3RscyAtLS0tLS0tLS0tICovCisKKy8qCisgKiBJb2N0bCBzdWJyb3V0aW5lcyBjYW4gc2FmZWx5IGJlIG1hZGUgaW5saW5lLCBiZWNhdXNlIHRoZXkgYXJlIGNhbGxlZAorICogb25seSBmcm9tIGNvc2FfaW9jdGwoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY29zYV9yZXNldChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCWNoYXIgaWRzdHJpbmdbQ09TQV9NQVhfSURfU1RSSU5HXTsKKwlpZiAoY29zYS0+dXNhZ2UgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IFdBUk5JTkc6IHJlc2V0IHJlcXVlc3RlZCB3aXRoIGNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzICY9IH4oQ09TQV9GV19SRVNFVHxDT1NBX0ZXX1NUQVJUKTsKKwlpZiAoY29zYV9yZXNldF9hbmRfcmVhZF9pZChjb3NhLCBpZHN0cmluZykgPCAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiByZXNldCBmYWlsZWRcbiIsIGNvc2EtPm51bSk7CisJCXJldHVybiAtRUlPOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlc2V0dGluZyBkZXZpY2U6ICVzXG4iLCBjb3NhLT5udW0sCisJCWlkc3RyaW5nKTsKKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgfD0gQ09TQV9GV19SRVNFVDsKKwlyZXR1cm4gMDsKK30KKworLyogSGlnaC1sZXZlbCBmdW5jdGlvbiB0byBkb3dubG9hZCBkYXRhIGludG8gQ09TQSBtZW1vcnkuIENhbGxzIGRvd25sb2FkKCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgY29zYV9kb3dubG9hZCBkOworCWludCBpOworCisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IGRvd25sb2FkIG9mIG1pY3JvY29kZSByZXF1ZXN0ZWQgd2l0aCBjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPnVzYWdlKTsKKwlpZiAoIShjb3NhLT5maXJtd2FyZV9zdGF0dXMgJiBDT1NBX0ZXX1JFU0VUKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKS5cbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmQsIGFyZywgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZC5hZGRyIDwgMCB8fCBkLmFkZHIgPiBDT1NBX01BWF9GSVJNV0FSRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZC5sZW4gPCAwIHx8IGQubGVuID4gQ09TQV9NQVhfRklSTVdBUkVfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKworCS8qIElmIHNvbWV0aGluZyBmYWlscywgZm9yY2UgdGhlIHVzZXIgdG8gcmVzZXQgdGhlIGNhcmQgKi8KKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgJj0gfihDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQpOworCisJaSA9IGRvd25sb2FkKGNvc2EsIGQuY29kZSwgZC5sZW4sIGQuYWRkcik7CisJaWYgKGkgPCAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiBtaWNyb2NvZGUgZG93bmxvYWQgZmFpbGVkOiAlZFxuIiwKKwkJCWNvc2EtPm51bSwgaSk7CisJCXJldHVybiAtRUlPOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IGRvd25sb2FkaW5nIG1pY3JvY29kZSAtIDB4JTA0eCBieXRlcyBhdCAweCUwNHhcbiIsCisJCWNvc2EtPm51bSwgZC5sZW4sIGQuYWRkcik7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzIHw9IENPU0FfRldfUkVTRVR8Q09TQV9GV19ET1dOTE9BRDsKKwlyZXR1cm4gMDsKK30KKworLyogSGlnaC1sZXZlbCBmdW5jdGlvbiB0byByZWFkIENPU0EgbWVtb3J5LiBDYWxscyByZWFkbWVtKCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfcmVhZG1lbShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBjb3NhX2Rvd25sb2FkIGQ7CisJaW50IGk7CisKKwlpZiAoY29zYS0+dXNhZ2UgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IFdBUk5JTkc6IHJlYWRtZW0gcmVxdWVzdGVkIHdpdGggIgorCQkJImNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19SRVNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcmVzZXQgdGhlIGNhcmQgZmlyc3QgKHN0YXR1cyAlZCkuXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmQsIGFyZywgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBJZiBzb21ldGhpbmcgZmFpbHMsIGZvcmNlIHRoZSB1c2VyIHRvIHJlc2V0IHRoZSBjYXJkICovCisJY29zYS0+ZmlybXdhcmVfc3RhdHVzICY9IH5DT1NBX0ZXX1JFU0VUOworCisJaSA9IHJlYWRtZW0oY29zYSwgZC5jb2RlLCBkLmxlbiwgZC5hZGRyKTsKKwlpZiAoaSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHJlYWRpbmcgbWVtb3J5IGZhaWxlZDogJWRcbiIsCisJCQljb3NhLT5udW0sIGkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZWFkaW5nIGNhcmQgbWVtb3J5IC0gMHglMDR4IGJ5dGVzIGF0IDB4JTA0eFxuIiwKKwkJY29zYS0+bnVtLCBkLmxlbiwgZC5hZGRyKTsKKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgfD0gQ09TQV9GV19SRVNFVDsKKwlyZXR1cm4gMDsKK30KKworLyogSGlnaC1sZXZlbCBmdW5jdGlvbiB0byBzdGFydCBtaWNyb2NvZGUuIENhbGxzIHN0YXJ0bWljcm9jb2RlKCkuICovCitzdGF0aWMgaW5saW5lIGludCBjb3NhX3N0YXJ0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBhZGRyZXNzKQoreworCWludCBpOworCisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiBzdGFydCBtaWNyb2NvZGUgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCisJCQljb3NhLT5udW0sIGNvc2EtPnVzYWdlKTsKKworCWlmICgoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgKENPU0FfRldfUkVTRVR8Q09TQV9GV19ET1dOTE9BRCkpCisJCSE9IChDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGRvd25sb2FkIHRoZSBtaWNyb2NvZGUgYW5kL29yIHJlc2V0IHRoZSBjYXJkIGZpcnN0IChzdGF0dXMgJWQpLlxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCWNvc2EtPmZpcm13YXJlX3N0YXR1cyAmPSB+Q09TQV9GV19SRVNFVDsKKwlpZiAoKGk9c3RhcnRtaWNyb2NvZGUoY29zYSwgYWRkcmVzcykpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogc3RhcnQgbWljcm9jb2RlIGF0IDB4JTA0eCBmYWlsZWQ6ICVkXG4iLAorCQkJY29zYS0+bnVtLCBhZGRyZXNzLCBpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogc3RhcnRpbmcgbWljcm9jb2RlIGF0IDB4JTA0eFxuIiwKKwkJY29zYS0+bnVtLCBhZGRyZXNzKTsKKwljb3NhLT5zdGFydGFkZHIgPSBhZGRyZXNzOworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1NUQVJUOworCXJldHVybiAwOworfQorCQkKKy8qIEJ1ZmZlciBvZiBzaXplIGF0IGxlYXN0IENPU0FfTUFYX0lEX1NUUklORyBpcyBleHBlY3RlZCAqLworc3RhdGljIGlubGluZSBpbnQgY29zYV9nZXRpZHN0cihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjaGFyIF9fdXNlciAqc3RyaW5nKQoreworCWludCBsID0gc3RybGVuKGNvc2EtPmlkX3N0cmluZykrMTsKKwlpZiAoY29weV90b191c2VyKHN0cmluZywgY29zYS0+aWRfc3RyaW5nLCBsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGw7Cit9CisKKy8qIEJ1ZmZlciBvZiBzaXplIGF0IGxlYXN0IENPU0FfTUFYX0lEX1NUUklORyBpcyBleHBlY3RlZCAqLworc3RhdGljIGlubGluZSBpbnQgY29zYV9nZXR0eXBlKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGNoYXIgX191c2VyICpzdHJpbmcpCit7CisJaW50IGwgPSBzdHJsZW4oY29zYS0+dHlwZSkrMTsKKwlpZiAoY29weV90b191c2VyKHN0cmluZywgY29zYS0+dHlwZSwgbCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBsOworfQorCitzdGF0aWMgaW50IGNvc2FfaW9jdGxfY29tbW9uKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsCisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3dpdGNoKGNtZCkgeworCWNhc2UgQ09TQUlPUlNFVDoJLyogUmVzZXQgdGhlIGRldmljZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGNvc2FfcmVzZXQoY29zYSk7CisJY2FzZSBDT1NBSU9TVFJUOgkvKiBTdGFydCB0aGUgZmlybXdhcmUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBjb3NhX3N0YXJ0KGNvc2EsIGFyZyk7CisJY2FzZSBDT1NBSU9ET1dOTEQ6CS8qIERvd25sb2FkIHRoZSBmaXJtd2FyZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCisJCXJldHVybiBjb3NhX2Rvd25sb2FkKGNvc2EsIGFyZ3ApOworCWNhc2UgQ09TQUlPUk1FTToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBjb3NhX3JlYWRtZW0oY29zYSwgYXJncCk7CisJY2FzZSBDT1NBSU9SVFlQRToKKwkJcmV0dXJuIGNvc2FfZ2V0dHlwZShjb3NhLCBhcmdwKTsKKwljYXNlIENPU0FJT1JJRFNUUjoKKwkJcmV0dXJuIGNvc2FfZ2V0aWRzdHIoY29zYSwgYXJncCk7CisJY2FzZSBDT1NBSU9OUkNBUkRTOgorCQlyZXR1cm4gbnJfY2FyZHM7CisJY2FzZSBDT1NBSU9OUkNIQU5TOgorCQlyZXR1cm4gY29zYS0+bmNoYW5uZWxzOworCWNhc2UgQ09TQUlPQk1TRVQ6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlpZiAoaXNfOGJpdChjb3NhKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYXJnICE9IENPU0FfQk1fT0ZGICYmIGFyZyAhPSBDT1NBX0JNX09OKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNvc2EtPmJ1c21hc3RlciA9IGFyZzsKKwkJcmV0dXJuIDA7CisJY2FzZSBDT1NBSU9CTUdFVDoKKwkJcmV0dXJuIGNvc2EtPmJ1c21hc3RlcjsKKwl9CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJaW50IGNtZCkKK3sKKwlpbnQgcnY7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKwlydiA9IGNvc2FfaW9jdGxfY29tbW9uKGNoYW4tPmNvc2EsIGNoYW4sIGNtZCwgKHVuc2lnbmVkIGxvbmcpaWZyLT5pZnJfZGF0YSk7CisJaWYgKHJ2ID09IC1FTk9JT0NUTENNRCkgeworCQlyZXR1cm4gc3BwcF9kb19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGNvc2FfY2hhcmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjaGFubmVsLT5jb3NhOworCXJldHVybiBjb3NhX2lvY3RsX2NvbW1vbihjb3NhLCBjaGFubmVsLCBjbWQsIGFyZyk7Cit9CisKKwwKKy8qLS0tLS0tLS0tLSBIVyBsYXllciBpbnRlcmZhY2UgLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlIGhpZ2hlciBsYXllciBjYW4gYmluZCBpdHNlbGYgdG8gdGhlIEhXIGxheWVyIGJ5IHNldHRpbmcgdGhlIGNhbGxiYWNrcworICogaW4gdGhlIGNoYW5uZWxfZGF0YSBzdHJ1Y3R1cmUgYW5kIGJ5IHVzaW5nIHRoZXNlIHJvdXRpbmVzLgorICovCitzdGF0aWMgdm9pZCBjb3NhX2VuYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjaGFuLT5jb3NhOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGNoYW4tPm51bSwgJmNvc2EtPnJ4Yml0bWFwKSkKKwkJcHV0X2RyaXZlcl9zdGF0dXMoY29zYSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvc2FfZGlzYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjaGFuLT5jb3NhOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChjaGFuLT5udW0sICZjb3NhLT5yeGJpdG1hcCkpCisJCXB1dF9kcml2ZXJfc3RhdHVzKGNvc2EpOworfQorCisvKgorICogRklYTUU6IFRoaXMgcm91dGluZSBwcm9iYWJseSBzaG91bGQgY2hlY2sgZm9yIGNvc2Ffc3RhcnRfdHgoKSBjYWxsZWQgd2hlbgorICogdGhlIHByZXZpb3VzIHRyYW5zbWl0IGlzIHN0aWxsIHVuZmluaXNoZWQuIEluIHRoaXMgY2FzZSB0aGUgbm9uLXplcm8KKyAqIHJldHVybiB2YWx1ZSBzaG91bGQgaW5kaWNhdGUgdG8gdGhlIGNhbGxlciB0aGF0IHRoZSBxdWV1aW5nKHNwPykgdXAKKyAqIHRoZSB0cmFuc21pdCBoYXMgZmFpbGVkLgorICovCitzdGF0aWMgaW50IGNvc2Ffc3RhcnRfdHgoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjaGFuLT5jb3NhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgREVCVUdfREFUQQorCWludCBpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkYyVkOiBzdGFydGluZyB0eCgweCV4KSIsIGNoYW4tPmNvc2EtPm51bSwKKwkJY2hhbi0+bnVtLCBsZW4pOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQlwcmludGsoIiAlMDJ4IiwgYnVmW2ldJjB4ZmYpOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJY2hhbi0+dHhidWYgPSBidWY7CisJY2hhbi0+dHhzaXplID0gbGVuOworCWlmIChsZW4gPiBDT1NBX01UVSkKKwkJY2hhbi0+dHhzaXplID0gQ09TQV9NVFU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCisJLyogVGVsbCB0aGUgZmlybXdhcmUgd2UgYXJlIHJlYWR5ICovCisJc2V0X2JpdChjaGFuLT5udW0sICZjb3NhLT50eGJpdG1hcCk7CisJcHV0X2RyaXZlcl9zdGF0dXMoY29zYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2RyaXZlcl9zdGF0dXMoc3RydWN0IGNvc2FfZGF0YSAqY29zYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCisJc3RhdHVzID0gKGNvc2EtPnJ4Yml0bWFwID8gRFJJVkVSX1JYX1JFQURZIDogMCkKKwkJfCAoY29zYS0+dHhiaXRtYXAgPyBEUklWRVJfVFhfUkVBRFkgOiAwKQorCQl8IChjb3NhLT50eGJpdG1hcD8gfihjb3NhLT50eGJpdG1hcDw8RFJJVkVSX1RYTUFQX1NISUZUKQorCQkJJkRSSVZFUl9UWE1BUF9NQVNLIDogMCk7CisJaWYgKCFjb3NhLT5yeHR4KSB7CisJCWlmIChjb3NhLT5yeGJpdG1hcHxjb3NhLT50eGJpdG1hcCkgeworCQkJaWYgKCFjb3NhLT5lbmFibGVkKSB7CisJCQkJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfUlhfSU5UX0VOQSk7CisjaWZkZWYgREVCVUdfSU8KKwkJCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2VuZGlmCisJCQkJY29zYS0+ZW5hYmxlZCA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAoY29zYS0+ZW5hYmxlZCkgeworCQkJY29zYS0+ZW5hYmxlZCA9IDA7CisJCQljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCAwKTsKKyNlbmRpZgorCQl9CisJCWNvc2FfcHV0ZGF0YTgoY29zYSwgc3RhdHVzKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19kYXRhX2NtZChjb3NhLCBzdGF0dXMpOworI2VuZGlmCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IChjb3NhLT5yeGJpdG1hcCA/IERSSVZFUl9SWF9SRUFEWSA6IDApCisJCXwgKGNvc2EtPnR4Yml0bWFwID8gRFJJVkVSX1RYX1JFQURZIDogMCkKKwkJfCAoY29zYS0+dHhiaXRtYXA/IH4oY29zYS0+dHhiaXRtYXA8PERSSVZFUl9UWE1BUF9TSElGVCkKKwkJCSZEUklWRVJfVFhNQVBfTUFTSyA6IDApOworCisJaWYgKGNvc2EtPnJ4Yml0bWFwfGNvc2EtPnR4Yml0bWFwKSB7CisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2lmZGVmIERFQlVHX0lPCisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgU1JfUlhfSU5UX0VOQSk7CisjZW5kaWYKKwkJY29zYS0+ZW5hYmxlZCA9IDE7CisJfSBlbHNlIHsKKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisjaWZkZWYgREVCVUdfSU8KKwkJZGVidWdfc3RhdHVzX291dChjb3NhLCAwKTsKKyNlbmRpZgorCQljb3NhLT5lbmFibGVkID0gMDsKKwl9CisJY29zYV9wdXRkYXRhOChjb3NhLCBzdGF0dXMpOworI2lmZGVmIERFQlVHX0lPCisJZGVidWdfZGF0YV9jbWQoY29zYSwgc3RhdHVzKTsKKyNlbmRpZgorfQorCisvKgorICogVGhlICJraWNrbWUiIGZ1bmN0aW9uOiBXaGVuIHRoZSBETUEgdGltZXMgb3V0LCB0aGlzIGlzIGNhbGxlZCB0bworICogY2xlYW4gdXAgdGhlIGRyaXZlciBzdGF0dXMuCisgKiBGSVhNRTogUHJlbGltaW5hcnkgc3VwcG9ydCwgdGhlIGludGVyZmFjZSBpcyBwcm9iYWJseSB3cm9uZy4KKyAqLworc3RhdGljIHZvaWQgY29zYV9raWNrKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MxOworCWNoYXIgKnMgPSAiKHByb2JhYmx5KSBJUlEiOworCisJaWYgKHRlc3RfYml0KFJYQklULCAmY29zYS0+cnh0eCkpCisJCXMgPSAiUlggRE1BIjsKKwlpZiAodGVzdF9iaXQoVFhCSVQsICZjb3NhLT5yeHR4KSkKKwkJcyA9ICJUWCBETUEiOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHRpbWVvdXQgLSByZXN0YXJ0aW5nLlxuIiwgY29zYS0+bmFtZSwgcyk7IAorCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJY29zYS0+cnh0eCA9IDA7CisKKwlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNvc2EtPmRtYSk7CisJY2xlYXJfZG1hX2ZmKGNvc2EtPmRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFnczEpOworCisJLyogRklYTUU6IEFueXRoaW5nIGVsc2U/ICovCisJdWRlbGF5KDEwMCk7CisJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisJdWRlbGF5KDEwMCk7CisJKHZvaWQpIGNvc2FfZ2V0ZGF0YTgoY29zYSk7CisJdWRlbGF5KDEwMCk7CisJY29zYV9wdXRkYXRhOChjb3NhLCAwKTsKKwl1ZGVsYXkoMTAwKTsKKwlwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soY29zYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIHdob2xlIGJ1ZmZlciBpcyBETUEtYWJsZS4gSXQgbWVhbnMgaXQgaXMgYmVsb3cgdGhlIDE2TSBvZgorICogcGh5c2ljYWwgbWVtb3J5IGFuZCBkb2Vzbid0IHNwYW4gdGhlIDY0ayBib3VuZGFyeS4gRm9yIG5vdyBpdCBzZWVtcworICogU0tCJ3MgbmV2ZXIgZG8gdGhpcywgYnV0IHdlJ2xsIGNoZWNrIHRoaXMgYW55d2F5LgorICovCitzdGF0aWMgaW50IGNvc2FfZG1hX2FibGUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0YXRpYyBpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBiID0gKHVuc2lnbmVkIGxvbmcpYnVmOworCWlmIChiK2xlbiA+PSBNQVhfRE1BX0FERFJFU1MpCisJCXJldHVybiAwOworCWlmICgoYl4gKGIrbGVuKSkgJiAweDEwMDAwKSB7CisJCWlmIChjb3VudCsrIDwgNSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwYWNrZXQgc3Bhbm5pbmcgYSA2NGsgYm91bmRhcnlcbiIsCisJCQkJY2hhbi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworDAorLyogLS0tLS0tLS0tLSBUaGUgU1JQL0NPU0EgUk9NIG1vbml0b3IgZnVuY3Rpb25zIC0tLS0tLS0tLS0gKi8KKworLyoKKyAqIERvd25sb2FkaW5nIFNSUCBtaWNyb2NvZGU6IHNheSAidyIgdG8gU1JQIG1vbml0b3IsIGl0IGFuc3dlcnMgYnkgInc9IiwKKyAqIGRyaXZlcnMgbmVlZCB0byBzYXkgNC1kaWdpdCBoZXggbnVtYmVyIG1lYW5pbmcgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbWljcm9jb2RlCisgKiBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UuIE1vbml0b3IgcmVwbGllcyBieSBzYXlpbmcgIiA9Ii4gTm93IGRyaXZlcgorICogaGFzIHRvIHdyaXRlIDQtZGlnaXQgaGV4IG51bWJlciBtZWFuaW5nIHRoZSBsYXN0IGJ5dGUgYWRkcmVzcyBlbmRlZAorICogYnkgYSBzaW5nbGUgc3BhY2UuIE1vbml0b3IgaGFzIHRvIHJlcGx5IHdpdGggYSBzcGFjZS4gTm93IHRoZSBkb3dubG9hZAorICogYmVnaW5zLiBBZnRlciB0aGUgZG93bmxvYWQgbW9uaXRvciByZXBsaWVzIHdpdGggIlxyXG4uIiAoQ1IgTEYgZG90KS4KKyAqLworc3RhdGljIGludCBkb3dubG9hZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjb25zdCBjaGFyIF9fdXNlciAqbWljcm9jb2RlLCBpbnQgbGVuZ3RoLCBpbnQgYWRkcmVzcykKK3sKKwlpbnQgaTsKKworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICd3JykgPT0gLTEpIHJldHVybiAtMTsKKwlpZiAoKGk9Z2V0X3dhaXRfZGF0YShjb3NhKSkgIT0gJ3cnKSB7IHByaW50aygiZG5sZDogMHglMDR4XG4iLGkpOyByZXR1cm4gLTI7fQorCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICc9JykgcmV0dXJuIC0zOworCisJaWYgKHB1dGhleG51bWJlcihjb3NhLCBhZGRyZXNzKSA8IDApIHJldHVybiAtNDsKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAnICcpID09IC0xKSByZXR1cm4gLTEwOworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICcgJykgcmV0dXJuIC0xMTsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtMTI7CisKKwlpZiAocHV0aGV4bnVtYmVyKGNvc2EsIGFkZHJlc3MrbGVuZ3RoLTEpIDwgMCkgcmV0dXJuIC0xMzsKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAnICcpID09IC0xKSByZXR1cm4gLTE4OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICcgJykgcmV0dXJuIC0xOTsKKworCXdoaWxlIChsZW5ndGgtLSkgeworCQljaGFyIGM7CisjaWZuZGVmIFNSUF9ET1dOTE9BRF9BVF9CT09UCisJCWlmIChnZXRfdXNlcihjLCBtaWNyb2NvZGUpKQorCQkJcmV0dXJuIC0yMzsgLyogPz8/ICovCisjZWxzZQorCQljID0gKm1pY3JvY29kZTsKKyNlbmRpZgorCQlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCBjKSA9PSAtMSkKKwkJCXJldHVybiAtMjA7CisJCW1pY3JvY29kZSsrOworCX0KKworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdccicpIHJldHVybiAtMjE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xuJykgcmV0dXJuIC0yMjsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnLicpIHJldHVybiAtMjM7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJjb3NhJWQ6IGRvd25sb2FkIGNvbXBsZXRlZC5cbiIsIGNvc2EtPm51bSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU3RhcnRpbmcgbWljcm9jb2RlIGlzIGRvbmUgdmlhIHRoZSAiZyIgY29tbWFuZCBvZiB0aGUgU1JQIG1vbml0b3IuCisgKiBUaGUgY2hhdCBzaG91bGQgYmUgdGhlIGZvbGxvd2luZzogImciICJnPSIgIjxhZGRyPjxDUj4iCisgKiAiPENSPjxDUj48TEY+PENSPjxMRj4iLgorICovCitzdGF0aWMgaW50IHN0YXJ0bWljcm9jb2RlKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBhZGRyZXNzKQoreworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICdnJykgPT0gLTEpIHJldHVybiAtMTsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnZycpIHJldHVybiAtMjsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtMzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcykgPCAwKSByZXR1cm4gLTQ7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJ1xyJykgPT0gLTEpIHJldHVybiAtNTsKKwkKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTY7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xyJykgcmV0dXJuIC03OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtODsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTk7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xuJykgcmV0dXJuIC0xMDsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgImNvc2ElZDogbWljcm9jb2RlIHN0YXJ0ZWRcbiIsIGNvc2EtPm51bSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRpbmcgbWVtb3J5IGlzIGRvbmUgdmlhIHRoZSAiciIgY29tbWFuZCBvZiB0aGUgU1JQIG1vbml0b3IuCisgKiBUaGUgY2hhdCBpcyB0aGUgZm9sbG93aW5nICJyIiAicj0iICI8YWRkcj4gIiAiID0iICI8bGFzdF9ieXRlPiAiICIgIgorICogVGhlbiBkcml2ZXIgY2FuIHJlYWQgdGhlIGRhdGEgYW5kIHRoZSBjb252ZXJzYXRpb24gaXMgZmluaXNoZWQKKyAqIGJ5IFNSUCBtb25pdG9yIHNlbmRpbmcgIjxDUj48TEY+LiIgKGRvdCBhdCB0aGUgZW5kKS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm90IG5lZWRlZCBkdXJpbmcgdGhlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHNlcnZlcworICogZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICovCitzdGF0aWMgaW50IHJlYWRtZW0oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciBfX3VzZXIgKm1pY3JvY29kZSwgaW50IGxlbmd0aCwgaW50IGFkZHJlc3MpCit7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJ3InKSA9PSAtMSkgcmV0dXJuIC0xOworCWlmICgoZ2V0X3dhaXRfZGF0YShjb3NhKSkgIT0gJ3InKSByZXR1cm4gLTI7CisJaWYgKChnZXRfd2FpdF9kYXRhKGNvc2EpKSAhPSAnPScpIHJldHVybiAtMzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcykgPCAwKSByZXR1cm4gLTQ7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC01OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICcgJykgcmV0dXJuIC02OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICc9JykgcmV0dXJuIC03OworCisJaWYgKHB1dGhleG51bWJlcihjb3NhLCBhZGRyZXNzK2xlbmd0aC0xKSA8IDApIHJldHVybiAtODsKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAnICcpID09IC0xKSByZXR1cm4gLTk7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJyAnKSByZXR1cm4gLTEwOworCisJd2hpbGUgKGxlbmd0aC0tKSB7CisJCWNoYXIgYzsKKwkJaW50IGk7CisJCWlmICgoaT1nZXRfd2FpdF9kYXRhKGNvc2EpKSA9PSAtMSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2E6IDB4JTA0eCBieXRlcyByZW1haW5pbmdcbiIsCisJCQkJbGVuZ3RoKTsKKwkJCXJldHVybiAtMTE7CisJCX0KKwkJYz1pOworI2lmIDEKKwkJaWYgKHB1dF91c2VyKGMsIG1pY3JvY29kZSkpCisJCQlyZXR1cm4gLTIzOyAvKiA/Pz8gKi8KKyNlbHNlCisJCSptaWNyb2NvZGUgPSBjOworI2VuZGlmCisJCW1pY3JvY29kZSsrOworCX0KKworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdccicpIHJldHVybiAtMjE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xuJykgcmV0dXJuIC0yMjsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnLicpIHJldHVybiAtMjM7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJjb3NhJWQ6IHJlYWRtZW0gY29tcGxldGVkLlxuIiwgY29zYS0+bnVtKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGRldmljZSBhbmQgcmVhZHMgdGhlIGluaXRpYWwgcHJvbXB0CisgKiBvZiB0aGUgZGV2aWNlJ3MgUk9NIG1vbml0b3IuCisgKi8KK3N0YXRpYyBpbnQgY29zYV9yZXNldF9hbmRfcmVhZF9pZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjaGFyICppZHN0cmluZykKK3sKKwlpbnQgaT0wLCBpZD0wLCBwcmV2PTAsIGN1cnI9MDsKKworCS8qIFJlc2V0IHRoZSBjYXJkIC4uLiAqLworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCWNvc2FfZ2V0ZGF0YTgoY29zYSk7CisJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfUlNUKTsKKyNpZmRlZiBNT0RVTEUKKwltc2xlZXAoNTAwKTsKKyNlbHNlCisJdWRlbGF5KDUqMTAwMDAwKTsKKyNlbmRpZgorCS8qIERpc2FibGUgYWxsIElSUXMgZnJvbSB0aGUgY2FyZCAqLworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCisJLyoKKwkgKiBUcnkgdG8gcmVhZCB0aGUgSUQgc3RyaW5nLiBUaGUgY2FyZCB0aGVuIHByaW50cyBvdXQgdGhlCisJICogaWRlbnRpZmljYXRpb24gc3RyaW5nIGVuZGVkIGJ5IHRoZSAiXG5ceDJlIi4KKwkgKgorCSAqIFRoZSBmb2xsb3dpbmcgbG9vcCBpcyBpbmRleGVkIHRocm91Z2ggaSAoaW5zdGVhZCBvZiBpZCkKKwkgKiB0byBhdm9pZCBsb29waW5nIGZvcmV2ZXIgd2hlbiBmb3IgYW55IHJlYXNvbgorCSAqIHRoZSBwb3J0IHJldHVybnMgJ1xyJywgJ1xuJyBvciAnXHgyZScgcGVybWFuZW50bHkuCisJICovCisJZm9yIChpPTA7IGk8Q09TQV9NQVhfSURfU1RSSU5HLTE7IGkrKywgcHJldj1jdXJyKSB7CisJCWlmICgoY3VyciA9IGdldF93YWl0X2RhdGEoY29zYSkpID09IC0xKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3VyciAmPSAweGZmOworCQlpZiAoY3VyciAhPSAnXHInICYmIGN1cnIgIT0gJ1xuJyAmJiBjdXJyICE9IDB4MmUpCisJCQlpZHN0cmluZ1tpZCsrXSA9IGN1cnI7CisJCWlmIChjdXJyID09IDB4MmUgJiYgcHJldiA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCS8qIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgd2hlbiBpPT1DT1NBX01BWF9JRF9TVFJJTkctMSA/ICovCisJaWRzdHJpbmdbaWRdID0gJ1wwJzsKKwlyZXR1cm4gaWQ7Cit9CisKKwwKKy8qIC0tLS0tLS0tLS0gQXV4aWxpYXJ5IHJvdXRpbmVzIGZvciBDT1NBL1NSUCBtb25pdG9yIC0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBnZXRzIHRoZSBkYXRhIGJ5dGUgZnJvbSB0aGUgY2FyZCB3YWl0aW5nIGZvciB0aGUgU1JfUlhfUkRZCisgKiBiaXQgdG8gYmUgc2V0IGluIGEgbG9vcC4gSXQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGV4Y2VwdGlvbmFsIGNhc2VzCisgKiBvbmx5IChmb3IgZXhhbXBsZSB3aGVuIHJlc2V0dGluZyB0aGUgY2FyZCBvciBkb3dubG9hZGluZyB0aGUgZmlybXdhcmUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3dhaXRfZGF0YShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCWludCByZXRyaWVzID0gMTAwMDsKKworCXdoaWxlICgtLXJldHJpZXMpIHsKKwkJLyogcmVhZCBkYXRhIGFuZCByZXR1cm4gdGhlbSAqLworCQlpZiAoY29zYV9nZXRzdGF0dXMoY29zYSkgJiBTUl9SWF9SRFkpIHsKKwkJCXNob3J0IHI7CisJCQlyID0gY29zYV9nZXRkYXRhOChjb3NhKTsKKyNpZiAwCisJCQlwcmludGsoS0VSTl9JTkZPICJjb3NhOiBnZXRfd2FpdF9kYXRhIHJldHVybmluZyBhZnRlciAlZCByZXRyaWVzXG4iLCA5OTktcmV0cmllcyk7CisjZW5kaWYKKwkJCXJldHVybiByOworCQl9CisJCS8qIHNsZWVwIGlmIG5vdCByZWFkeSB0byByZWFkICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2E6IHRpbWVvdXQgaW4gZ2V0X3dhaXRfZGF0YSAoc3RhdHVzIDB4JXgpXG4iLAorCQljb3NhX2dldHN0YXR1cyhjb3NhKSk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGRhdGEgYnl0ZSB0byB0aGUgY2FyZCB3YWl0aW5nIGZvciB0aGUgU1JfVFhfUkRZCisgKiBiaXQgdG8gYmUgc2V0IGluIGEgbG9vcC4gSXQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGV4Y2VwdGlvbmFsIGNhc2VzCisgKiBvbmx5IChmb3IgZXhhbXBsZSB3aGVuIHJlc2V0dGluZyB0aGUgY2FyZCBvciBkb3dubG9hZGluZyB0aGUgZmlybXdhcmUpLgorICovCitzdGF0aWMgaW50IHB1dF93YWl0X2RhdGEoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpCit7CisJaW50IHJldHJpZXMgPSAxMDAwOworCXdoaWxlICgtLXJldHJpZXMpIHsKKwkJLyogcmVhZCBkYXRhIGFuZCByZXR1cm4gdGhlbSAqLworCQlpZiAoY29zYV9nZXRzdGF0dXMoY29zYSkgJiBTUl9UWF9SRFkpIHsKKwkJCWNvc2FfcHV0ZGF0YTgoY29zYSwgZGF0YSk7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHV0ZGF0YTogJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorI2lmIDAKKwkJLyogc2xlZXAgaWYgbm90IHJlYWR5IHRvIHJlYWQgKi8KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisjZW5kaWYKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiB0aW1lb3V0IGluIHB1dF93YWl0X2RhdGEgKHN0YXR1cyAweCV4KVxuIiwKKwkJY29zYS0+bnVtLCBjb3NhX2dldHN0YXR1cyhjb3NhKSk7CisJcmV0dXJuIC0xOworfQorCQorLyogCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgcHV0cyB0aGUgaGV4YWRlY2ltYWwgbnVtYmVyIGludG8gdGhlIFNSUCBtb25pdG9yCisgKiBhbmQgdmVyaWZpZXMgdGhlIHByb3BlciBlY2hvIG9mIHRoZSBzZW50IGJ5dGVzLiBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlICgtMSwtMywtNSwtNykgbWVhbnMgdGhhdCBwdXRfd2FpdF9kYXRhKCkgZmFpbGVkLAorICogKC0yLC00LC02LC04KSBtZWFucyB0aGF0IHJlYWRpbmcgZWNobyBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgcHV0aGV4bnVtYmVyKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBudW1iZXIpCit7CisJY2hhciB0ZW1wWzVdOworCWludCBpOworCisJLyogV2VsbCwgSSBzaG91bGQgcHJvYmFibHkgcmVwbGFjZSB0aGlzIGJ5IHNvbWV0aGluZyBmYXN0ZXIuICovCisJc3ByaW50Zih0ZW1wLCAiJTA0WCIsIG51bWJlcik7CisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsIHRlbXBbaV0pID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcHV0aGV4bnVtYmVyIGZhaWxlZCB0byB3cml0ZSBieXRlICVkXG4iLAorCQkJCWNvc2EtPm51bSwgaSk7CisJCQlyZXR1cm4gLTEtMippOworCQl9CisJCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9IHRlbXBbaV0pIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiBwdXRoZXhodW1iZXIgZmFpbGVkIHRvIHJlYWQgZWNobyBvZiBieXRlICVkXG4iLAorCQkJCWNvc2EtPm51bSwgaSk7CisJCQlyZXR1cm4gLTItMippOworCQl9CisJfQorCXJldHVybiAwOworfQorCisMCisvKiAtLS0tLS0tLS0tIEludGVycnVwdCByb3V0aW5lcyAtLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgaW50ZXJydXB0OgorICogQXQgdGhlIGJlZ2lubmluZyBvZiB0cmFuc21pdCAtIHRoaXMgaGFuZGxlZCBpcyBpbiB0eF9pbnRlcnJ1cHQoKSwKKyAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgcmVjZWl2ZSAtIGl0IGlzIGluIHJ4X2ludGVycnVwdCgpIGFuZAorICogYXQgdGhlIGVuZCBvZiB0cmFuc21pdC9yZWNlaXZlIC0gaXQgaXMgdGhlIGVvdF9pbnRlcnJ1cHQoKSBmdW5jdGlvbi4KKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbXVsdGlwbGV4ZWQgYnkgY29zYV9pbnRlcnJ1cHQoKSBhY2NvcmRpbmcgdG8gdGhlCisgKiBDT1NBIHN0YXR1cyBieXRlLiBJIGhhdmUgbW92ZWQgdGhlIHJ4L3R4L2VvdCBpbnRlcnJ1cHQgaGFuZGxpbmcgaW50bworICogc2VwYXJhdGUgZnVuY3Rpb25zIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBpbmxpbmUsCisgKiBzbyB0aGVyZSBzaG91bGQgYmUgbm8gb3ZlcmhlYWQgb2YgZnVuY3Rpb24gY2FsbC4KKyAqIAorICogSW4gdGhlIENPU0EgYnVzLW1hc3RlciBtb2RlLCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGNhcmQgdGhlIGFkZHJlc3Mgb2YgYQorICogYnVmZmVyLiBVbmZvcnR1bmF0ZWx5LCBDT1NBIG1heSBiZSB0b28gc2xvdyBmb3IgdXMsIHNvIHdlIG11c3QgYnVzeS13YWl0LgorICogSXQncyB0aW1lIHRvIHVzZSB0aGUgYm90dG9tIGhhbGYgOi0oCisgKi8KKworLyoKKyAqIFRyYW5zbWl0IGludGVycnVwdCByb3V0aW5lIC0gY2FsbGVkIHdoZW4gQ09TQSBpcyB3aWxsaW5nIHRvIG9idGFpbgorICogZGF0YSBmcm9tIHRoZSBPUy4gVGhlIG1vc3QgdHJpY2t5IHBhcnQgb2YgdGhlIHJvdXRpbmUgaXMgc2VsZWN0aW9uCisgKiBvZiBjaGFubmVsIHdlIChPUykgd2FudCB0byBzZW5kIHBhY2tldCBmb3IuIEZvciBTUlAgd2Ugc2hvdWxkIHByb2JhYmx5CisgKiB1c2UgdGhlIHJvdW5kLXJvYmluIGFwcHJvYWNoLiBUaGUgbmV3ZXIgQ09TQSBmaXJtd2FyZXMgaGF2ZSBhIHNpbXBsZQorICogZmxvdy1jb250cm9sIC0gaW4gdGhlIHN0YXR1cyB3b3JkIGhhcyBiaXRzIDIgYW5kIDMgc2V0IHRvIDEgbWVhbnMgdGhhdCB0aGUKKyAqIGNoYW5uZWwgMCBvciAxIGRvZXNuJ3Qgd2FudCB0byByZWNlaXZlIGRhdGEuCisgKgorICogSXQgc2VlbXMgdGhlcmUgaXMgYSBidWcgaW4gQ09TQSBmaXJtd2FyZSAobmVlZCB0byB0cmFjZSBpdCBmdXJ0aGVyKToKKyAqIFdoZW4gdGhlIGRyaXZlciBzdGF0dXMgc2F5cyB0aGF0IHRoZSBrZXJuZWwgaGFzIG5vIG1vcmUgZGF0YSBmb3IgdHJhbnNtaXQKKyAqIChlLmcuIGF0IHRoZSBlbmQgb2YgVFggRE1BKSBhbmQgdGhlbiB0aGUga2VybmVsIGNoYW5nZXMgaXRzIG1pbmQKKyAqIChlLmcuIG5ldyBwYWNrZXQgaXMgcXVldWVkIHRvIGhhcmRfc3RhcnRfeG1pdCgpKSwgdGhlIGNhcmQgaXNzdWVzCisgKiB0aGUgVFggaW50ZXJydXB0IGJ1dCBkb2VzIG5vdCBtYXJrIHRoZSBjaGFubmVsIGFzIHJlYWR5LXRvLXRyYW5zbWl0LgorICogVGhlIGZpeCBzZWVtcyB0byBiZSB0byBwdXNoIHRoZSBwYWNrZXQgdG8gQ09TQSBkZXNwaXRlIGl0cyByZXF1ZXN0LgorICogV2UgZmlyc3QgdHJ5IHRvIG9iZXkgdGhlIGNhcmQncyBvcGluaW9uLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gZm9yY2VkIFRYLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfaW50ZXJydXB0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MxOworI2lmZGVmIERFQlVHX0lSUVMKKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IFNSX0RPV05fUkVRVUVTVCBzdGF0dXM9MHglMDR4XG4iLAorCQljb3NhLT5udW0sIHN0YXR1cyk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXNldF9iaXQoVFhCSVQsICZjb3NhLT5yeHR4KTsKKwlpZiAoIXRlc3RfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCS8qIGZsb3cgY29udHJvbCwgc2VlIHRoZSBjb21tZW50IGFib3ZlICovCisJCWludCBpPTA7CisJCWlmICghY29zYS0+dHhiaXRtYXApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBjaGFubmVsIHdhbnRzIGRhdGEgIgorCQkJCSJpbiBUWCBJUlEuIEV4cGVjdCBETUEgdGltZW91dC4iLAorCQkJCWNvc2EtPm5hbWUpOworCQkJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCQkJY2xlYXJfYml0KFRYQklULCAmY29zYS0+cnh0eCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJd2hpbGUoMSkgeworCQkJY29zYS0+dHhjaGFuKys7CisJCQlpKys7CisJCQlpZiAoY29zYS0+dHhjaGFuID49IGNvc2EtPm5jaGFubmVscykKKwkJCQljb3NhLT50eGNoYW4gPSAwOworCQkJaWYgKCEoY29zYS0+dHhiaXRtYXAgJiAoMTw8Y29zYS0+dHhjaGFuKSkpCisJCQkJY29udGludWU7CisJCQlpZiAofnN0YXR1cyAmICgxIDw8IChjb3NhLT50eGNoYW4rRFJJVkVSX1RYTUFQX1NISUZUKSkpCisJCQkJYnJlYWs7CisJCQkvKiBpbiBzZWNvbmQgcGFzcywgYWNjZXB0IGZpcnN0IHJlYWR5LXRvLVRYIGNoYW5uZWwgKi8KKwkJCWlmIChpID4gY29zYS0+bmNoYW5uZWxzKSB7CisJCQkJLyogQ2FuIGJlIHNhZmVseSBpZ25vcmVkICovCisjaWZkZWYgREVCVUdfSVJRUworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRm9yY2luZyBUWCAiCisJCQkJCSJ0byBub3QtcmVhZHkgY2hhbm5lbCAlZFxuIiwKKwkJCQkJY29zYS0+bmFtZSwgY29zYS0+dHhjaGFuKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJY29zYS0+dHhzaXplID0gY29zYS0+Y2hhbltjb3NhLT50eGNoYW5dLnR4c2l6ZTsKKwkJaWYgKGNvc2FfZG1hX2FibGUoY29zYS0+Y2hhbitjb3NhLT50eGNoYW4sCisJCQljb3NhLT5jaGFuW2Nvc2EtPnR4Y2hhbl0udHhidWYsIGNvc2EtPnR4c2l6ZSkpIHsKKwkJCWNvc2EtPnR4YnVmID0gY29zYS0+Y2hhbltjb3NhLT50eGNoYW5dLnR4YnVmOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGNvc2EtPmJvdW5jZWJ1ZiwgY29zYS0+Y2hhbltjb3NhLT50eGNoYW5dLnR4YnVmLAorCQkJCWNvc2EtPnR4c2l6ZSk7CisJCQljb3NhLT50eGJ1ZiA9IGNvc2EtPmJvdW5jZWJ1ZjsKKwkJfQorCX0KKworCWlmIChpc184Yml0KGNvc2EpKSB7CisJCWlmICghdGVzdF9iaXQoSVJRQklULCAmY29zYS0+cnh0eCkpIHsKKwkJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQkJY29zYV9wdXRkYXRhOChjb3NhLCAoKGNvc2EtPnR4Y2hhbiA8PCA1KSAmIDB4ZTApfAorCQkJCSgoY29zYS0+dHhzaXplID4+IDgpICYgMHgxZikpOworI2lmZGVmIERFQlVHX0lPCisJCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQkJZGVidWdfZGF0YV9vdXQoY29zYSwgKChjb3NhLT50eGNoYW4gPDwgNSkgJiAweGUwKXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb3NhLT50eHNpemUgPj4gOCkgJiAweDFmKSk7CisJCQlkZWJ1Z19kYXRhX2luKGNvc2EsIGNvc2FfZ2V0ZGF0YTgoY29zYSkpOworI2Vsc2UKKwkJCWNvc2FfZ2V0ZGF0YTgoY29zYSk7CisjZW5kaWYKKwkJCXNldF9iaXQoSVJRQklULCAmY29zYS0+cnh0eCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoSVJRQklULCAmY29zYS0+cnh0eCk7CisJCQljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKwkJCWNvc2FfcHV0ZGF0YTgoY29zYSwgY29zYS0+dHhzaXplJjB4ZmYpOworI2lmZGVmIERFQlVHX0lPCisJCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIDApOworCQkJZGVidWdfZGF0YV9vdXQoY29zYSwgY29zYS0+dHhzaXplJjB4ZmYpOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9UWF9JTlRfRU5BKTsKKwkJY29zYV9wdXRkYXRhMTYoY29zYSwgKChjb3NhLT50eGNoYW48PDEzKSAmIDB4ZTAwMCkKKwkJCXwgKGNvc2EtPnR4c2l6ZSAmIDB4MWZmZikpOworI2lmZGVmIERFQlVHX0lPCisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgU1JfVFhfSU5UX0VOQSk7CisJCWRlYnVnX2RhdGFfb3V0KGNvc2EsICgoY29zYS0+dHhjaGFuPDwxMykgJiAweGUwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB8IChjb3NhLT50eHNpemUgJiAweDFmZmYpKTsKKwkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhX2dldGRhdGE4KGNvc2EpKTsKKwkJZGVidWdfc3RhdHVzX291dChjb3NhLCAwKTsKKyNlbHNlCisJCWNvc2FfZ2V0ZGF0YTgoY29zYSk7CisjZW5kaWYKKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisJfQorCisJaWYgKGNvc2EtPmJ1c21hc3RlcikgeworCQl1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX2J1cyhjb3NhLT50eGJ1Zik7CisJCWludCBjb3VudD0wOworCQlwcmludGsoS0VSTl9JTkZPICJidXNtYXN0ZXIgSVJRXG4iKTsKKwkJd2hpbGUgKCEoY29zYV9nZXRzdGF0dXMoY29zYSkmU1JfVFhfUkRZKSkgeworCQkJY291bnQrKzsKKwkJCXVkZWxheSgxMCk7CisJCQlpZiAoY291bnQgPiAxMDAwKSBicmVhazsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJzdGF0dXMgJXhcbiIsIGNvc2FfZ2V0c3RhdHVzKGNvc2EpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmVhZHkgYWZ0ZXIgJWQgbG9vcHNcbiIsIGNvdW50KTsKKwkJY29zYV9wdXRkYXRhMTYoY29zYSwgKGFkZHIgPj4gMTYpJjB4ZmZmZik7CisKKwkJY291bnQgPSAwOworCQl3aGlsZSAoIShjb3NhX2dldHN0YXR1cyhjb3NhKSZTUl9UWF9SRFkpKSB7CisJCQljb3VudCsrOworCQkJaWYgKGNvdW50ID4gMTAwMCkgYnJlYWs7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gInJlYWR5IGFmdGVyICVkIGxvb3BzXG4iLCBjb3VudCk7CisJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsIGFkZHIgJjB4ZmZmZik7CisJCWZsYWdzMSA9IGNsYWltX2RtYV9sb2NrKCk7CisJCXNldF9kbWFfbW9kZShjb3NhLT5kbWEsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKGNvc2EtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MxKTsKKwl9IGVsc2UgeworCQkvKiBzdGFydCB0aGUgRE1BICovCisJCWZsYWdzMSA9IGNsYWltX2RtYV9sb2NrKCk7CisJCWRpc2FibGVfZG1hKGNvc2EtPmRtYSk7CisJCWNsZWFyX2RtYV9mZihjb3NhLT5kbWEpOworCQlzZXRfZG1hX21vZGUoY29zYS0+ZG1hLCBETUFfTU9ERV9XUklURSk7CisJCXNldF9kbWFfYWRkcihjb3NhLT5kbWEsIHZpcnRfdG9fYnVzKGNvc2EtPnR4YnVmKSk7CisJCXNldF9kbWFfY291bnQoY29zYS0+ZG1hLCBjb3NhLT50eHNpemUpOworCQllbmFibGVfZG1hKGNvc2EtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MxKTsKKwl9CisJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfVFhfRE1BX0VOQXxTUl9VU1JfSU5UX0VOQSk7CisjaWZkZWYgREVCVUdfSU8KKwlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1RYX0RNQV9FTkF8U1JfVVNSX0lOVF9FTkEpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhfaW50ZXJydXB0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBERUJVR19JUlFTCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBTUl9VUF9SRVFVRVNUXG4iLCBjb3NhLT5udW0pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXNldF9iaXQoUlhCSVQsICZjb3NhLT5yeHR4KTsKKworCWlmIChpc184Yml0KGNvc2EpKSB7CisJCWlmICghdGVzdF9iaXQoSVJRQklULCAmY29zYS0+cnh0eCkpIHsKKwkJCXNldF9iaXQoSVJRQklULCAmY29zYS0+cnh0eCk7CisJCQlwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soY29zYSk7CisJCQljb3NhLT5yeHNpemUgPSBjb3NhX2dldGRhdGE4KGNvc2EpIDw8ODsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUgPj4gOCk7CisjZW5kaWYKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2JpdChJUlFCSVQsICZjb3NhLT5yeHR4KTsKKwkJCWNvc2EtPnJ4c2l6ZSB8PSBjb3NhX2dldGRhdGE4KGNvc2EpICYgMHhmZjsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUgJiAweGZmKTsKKyNlbmRpZgorI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVjZWl2ZSByeHNpemUgPSAoMHglMDR4KS5cbiIsCisJCQkJY29zYS0+bnVtLCBjb3NhLT5yeHNpemUpOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQljb3NhLT5yeHNpemUgPSBjb3NhX2dldGRhdGExNihjb3NhKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19kYXRhX2luKGNvc2EsIGNvc2EtPnJ4c2l6ZSk7CisjZW5kaWYKKyNpZiAwCisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVjZWl2ZSByeHNpemUgPSAoMHglMDR4KS5cbiIsCisJCQljb3NhLT5udW0sIGNvc2EtPnJ4c2l6ZSk7CisjZW5kaWYKKwl9CisJaWYgKCgoY29zYS0+cnhzaXplICYgMHhlMDAwKSA+PiAxMykgPj0gY29zYS0+bmNoYW5uZWxzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeCBmb3IgdW5rbm93biBjaGFubmVsICgweCUwNHgpXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+cnhzaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlnb3RvIHJlamVjdDsKKwl9CisJY29zYS0+cnhjaGFuID0gY29zYS0+Y2hhbiArICgoY29zYS0+cnhzaXplICYgMHhlMDAwKSA+PiAxMyk7CisJY29zYS0+cnhzaXplICY9IDB4MWZmZjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisKKwljb3NhLT5yeGJ1ZiA9IE5VTEw7CisJaWYgKGNvc2EtPnJ4Y2hhbi0+c2V0dXBfcngpCisJCWNvc2EtPnJ4YnVmID0gY29zYS0+cnhjaGFuLT5zZXR1cF9yeChjb3NhLT5yeGNoYW4sIGNvc2EtPnJ4c2l6ZSk7CisKKwlpZiAoIWNvc2EtPnJ4YnVmKSB7CityZWplY3Q6CQkvKiBSZWplY3QgdGhlIHBhY2tldCAqLworCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlamVjdGluZyBwYWNrZXQgb24gY2hhbm5lbCAlZFxuIiwKKwkJCWNvc2EtPm51bSwgY29zYS0+cnhjaGFuLT5udW0pOworCQljb3NhLT5yeGJ1ZiA9IGNvc2EtPmJvdW5jZWJ1ZjsKKwl9CisKKwkvKiBzdGFydCB0aGUgRE1BICovCisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNvc2EtPmRtYSk7CisJY2xlYXJfZG1hX2ZmKGNvc2EtPmRtYSk7CisJc2V0X2RtYV9tb2RlKGNvc2EtPmRtYSwgRE1BX01PREVfUkVBRCk7CisJaWYgKGNvc2FfZG1hX2FibGUoY29zYS0+cnhjaGFuLCBjb3NhLT5yeGJ1ZiwgY29zYS0+cnhzaXplICYgMHgxZmZmKSkgeworCQlzZXRfZG1hX2FkZHIoY29zYS0+ZG1hLCB2aXJ0X3RvX2J1cyhjb3NhLT5yeGJ1ZikpOworCX0gZWxzZSB7CisJCXNldF9kbWFfYWRkcihjb3NhLT5kbWEsIHZpcnRfdG9fYnVzKGNvc2EtPmJvdW5jZWJ1ZikpOworCX0KKwlzZXRfZG1hX2NvdW50KGNvc2EtPmRtYSwgKGNvc2EtPnJ4c2l6ZSYweDFmZmYpKTsKKwllbmFibGVfZG1hKGNvc2EtPmRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9SWF9ETUFfRU5BfFNSX1VTUl9JTlRfRU5BKTsKKwlpZiAoIWlzXzhiaXQoY29zYSkgJiYgKHN0YXR1cyAmIFNSX1RYX1JEWSkpCisJCWNvc2FfcHV0ZGF0YTgoY29zYSwgRFJJVkVSX1JYX1JFQURZKTsKKyNpZmRlZiBERUJVR19JTworCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgU1JfUlhfRE1BX0VOQXxTUl9VU1JfSU5UX0VOQSk7CisJaWYgKCFpc184Yml0KGNvc2EpICYmIChzdGF0dXMgJiBTUl9UWF9SRFkpKQorCQlkZWJ1Z19kYXRhX2NtZChjb3NhLCBEUklWRVJfUlhfUkVBRFkpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW90X2ludGVycnVwdChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWZsYWdzMSA9IGNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoY29zYS0+ZG1hKTsKKwljbGVhcl9kbWFfZmYoY29zYS0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzMSk7CisJaWYgKHRlc3RfYml0KFRYQklULCAmY29zYS0+cnh0eCkpIHsKKwkJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGNvc2EtPmNoYW4rY29zYS0+dHhjaGFuOworCQlpZiAoY2hhbi0+dHhfZG9uZSkKKwkJCWlmIChjaGFuLT50eF9kb25lKGNoYW4sIGNvc2EtPnR4c2l6ZSkpCisJCQkJY2xlYXJfYml0KGNoYW4tPm51bSwgJmNvc2EtPnR4Yml0bWFwKTsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KFJYQklULCAmY29zYS0+cnh0eCkpIHsKKyNpZmRlZiBERUJVR19EQVRBCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkYyVkOiBkb25lIHJ4KDB4JXgpIiwgY29zYS0+bnVtLCAKKwkJCWNvc2EtPnJ4Y2hhbi0+bnVtLCBjb3NhLT5yeHNpemUpOworCQlmb3IgKGk9MDsgaTxjb3NhLT5yeHNpemU7IGkrKykKKwkJCXByaW50ayAoIiAlMDJ4IiwgY29zYS0+cnhidWZbaV0mMHhmZik7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwkJLyogUGFja2V0IGZvciB1bmtub3duIGNoYW5uZWw/ICovCisJCWlmIChjb3NhLT5yeGJ1ZiA9PSBjb3NhLT5ib3VuY2VidWYpCisJCQlnb3RvIG91dDsKKwkJaWYgKCFjb3NhX2RtYV9hYmxlKGNvc2EtPnJ4Y2hhbiwgY29zYS0+cnhidWYsIGNvc2EtPnJ4c2l6ZSkpCisJCQltZW1jcHkoY29zYS0+cnhidWYsIGNvc2EtPmJvdW5jZWJ1ZiwgY29zYS0+cnhzaXplKTsKKwkJaWYgKGNvc2EtPnJ4Y2hhbi0+cnhfZG9uZSkKKwkJCWlmIChjb3NhLT5yeGNoYW4tPnJ4X2RvbmUoY29zYS0+cnhjaGFuKSkKKwkJCQljbGVhcl9iaXQoY29zYS0+cnhjaGFuLT5udW0sICZjb3NhLT5yeGJpdG1hcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHVuZXhwZWN0ZWQgRU9UIGludGVycnVwdFxuIiwKKwkJCWNvc2EtPm51bSk7CisJfQorCS8qCisJICogQ2xlYXIgdGhlIFJYQklULCBUWEJJVCBhbmQgSVJRQklUICh0aGUgbGF0ZXN0IHNob3VsZCBiZQorCSAqIGNsZWFyZWQgYW55d2F5KS4gV2Ugc2hvdWxkIGRvIGl0IGFzIHNvb24gYXMgcG9zc2libGUKKwkgKiBzbyB0aGF0IHdlIGNhbiB0ZWxsIHRoZSBDT1NBIHdlIGFyZSBkb25lIGFuZCB0byBnaXZlIGl0IGEgdGltZQorCSAqIGZvciByZWNvdmVyeS4KKwkgKi8KK291dDoKKwljb3NhLT5yeHR4ID0gMDsKKwlwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soY29zYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY29zYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29zYV8sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2EgPSBjb3NhXzsKK2FnYWluOgorCXN0YXR1cyA9IGNvc2FfZ2V0c3RhdHVzKGNvc2EpOworI2lmZGVmIERFQlVHX0lSUVMKKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IGdvdCBJUlEsIHN0YXR1cyAweCUwMnhcbiIsIGNvc2EtPm51bSwKKwkJc3RhdHVzICYgMHhmZik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JTworCWRlYnVnX3N0YXR1c19pbihjb3NhLCBzdGF0dXMpOworI2VuZGlmCisJc3dpdGNoIChzdGF0dXMgJiBTUl9DTURfRlJPTV9TUlBfTUFTSykgeworCWNhc2UgU1JfRE9XTl9SRVFVRVNUOgorCQl0eF9pbnRlcnJ1cHQoY29zYSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBTUl9VUF9SRVFVRVNUOgorCQlyeF9pbnRlcnJ1cHQoY29zYSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBTUl9FTkRfT0ZfVFJBTlNGRVI6CisJCWVvdF9pbnRlcnJ1cHQoY29zYSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2UgbWF5IGJlIHRvbyBmYXN0IGZvciBTUlAuIFRyeSB0byB3YWl0IGEgYml0IG1vcmUuICovCisJCWlmIChjb3VudCsrIDwgMTAwKSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiB1bmtub3duIHN0YXR1cyAweCUwMnggaW4gSVJRIGFmdGVyICVkIHJldHJpZXNcbiIsCisJCQljb3NhLT5udW0sIHN0YXR1cyAmIDB4ZmYsIGNvdW50KTsKKwl9CisjaWZkZWYgREVCVUdfSVJRUworCWlmIChjb3VudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVkLXRpbWVzIGdvdCB1bmtub3duIHN0YXR1cyBpbiBJUlFcbiIsCisJCQljb3NhLT5uYW1lLCBjb3VudCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcmV0dXJuaW5nIGZyb20gSVJRXG4iLCBjb3NhLT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworDAorLyogLS0tLS0tLS0tLSBJL08gZGVidWdnaW5nIHJvdXRpbmVzIC0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGVzZSByb3V0aW5lcyBjYW4gYmUgdXNlZCB0byBtb25pdG9yIENPU0EvU1JQIEkvTyBhbmQgdG8gcHJpbnRrKCkKKyAqIHRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIG9uIHRoZSBkYXRhIGFuZCBzdGF0dXMgSS9PIHBvcnQgaW4gYQorICogcmVhZGFibGUgd2F5LgorICovCisKKyNpZmRlZiBERUJVR19JTworc3RhdGljIHZvaWQgZGVidWdfc3RhdHVzX2luKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpCit7CisJY2hhciAqczsKKwlzd2l0Y2goc3RhdHVzICYgU1JfQ01EX0ZST01fU1JQX01BU0spIHsKKwljYXNlIFNSX1VQX1JFUVVFU1Q6CisJCXMgPSAiUlhfUkVRIjsKKwkJYnJlYWs7CisJY2FzZSBTUl9ET1dOX1JFUVVFU1Q6CisJCXMgPSAiVFhfUkVRIjsKKwkJYnJlYWs7CisJY2FzZSBTUl9FTkRfT0ZfVFJBTlNGRVI6CisJCXMgPSAiRVRfUkVRIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJOT19SRVEiOworCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBzdGF0dXMgLT4gMHglMDJ4ICglcyVzJXMlcylcbiIsCisJCWNvc2EtPm5hbWUsCisJCXN0YXR1cywKKwkJc3RhdHVzICYgU1JfVVNSX1JRID8gIlVTUl9SUXwiOiIiLAorCQlzdGF0dXMgJiBTUl9UWF9SRFkgPyAiVFhfUkRZfCI6IiIsCisJCXN0YXR1cyAmIFNSX1JYX1JEWSA/ICJSWF9SRFl8IjoiIiwKKwkJcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19vdXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogSU86IHN0YXR1cyA8LSAweCUwMnggKCVzJXMlcyVzJXMlcylcbiIsCisJCWNvc2EtPm5hbWUsCisJCXN0YXR1cywKKwkJc3RhdHVzICYgU1JfUlhfRE1BX0VOQSAgPyAiUlhETUF8IjoiIXJ4ZG1hfCIsCisJCXN0YXR1cyAmIFNSX1RYX0RNQV9FTkEgID8gIlRYRE1BfCI6IiF0eGRtYXwiLAorCQlzdGF0dXMgJiBTUl9SU1QgICAgICAgICA/ICJSRVNFVHwiOiIiLAorCQlzdGF0dXMgJiBTUl9VU1JfSU5UX0VOQSA/ICJVU1JJTlR8IjoiIXVzcmludHwiLAorCQlzdGF0dXMgJiBTUl9UWF9JTlRfRU5BICA/ICJUWElOVHwiOiIhdHhpbnR8IiwKKwkJc3RhdHVzICYgU1JfUlhfSU5UX0VOQSAgPyAiUlhJTlQiOiIhcnhpbnQiKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdfZGF0YV9pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogSU86IGRhdGEgLT4gMHglMDR4XG4iLCBjb3NhLT5uYW1lLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdfZGF0YV9vdXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBkYXRhIDwtIDB4JTA0eFxuIiwgY29zYS0+bmFtZSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfY21kKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogZGF0YSA8LSAweCUwNHggKCVzfCVzKVxuIiwKKwkJY29zYS0+bmFtZSwgZGF0YSwKKwkJZGF0YSAmIFNSX1JEWV9SQ1YgPyAiUlhfUkRZIiA6ICIhcnhfcmR5IiwKKwkJZGF0YSAmIFNSX1JEWV9TTkQgPyAiVFhfUkRZIiA6ICIhdHhfcmR5Iik7Cit9CisjZW5kaWYKKworLyogRU9GIC0tIHRoaXMgZmlsZSBoYXMgbm90IGJlZW4gdHJ1bmNhdGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY29zYS5oIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjhmM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuaApAQCAtMCwwICsxLDExNyBAQAorLyogJElkOiBjb3NhLmgsdiAxLjYgMTk5OS8wMS8wNiAxNDowMjo0NCBrYXMgRXhwICQgKi8KKworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgSmFuICJZZW55YSIgS2FzcHJ6YWsgPGthc0BmaS5tdW5pLmN6PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBDT1NBX0hfXworI2RlZmluZSBDT1NBX0hfXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKy8qIHN0YXR1cyByZWdpc3RlciAtIG91dHB1dCBiaXRzICovCisjZGVmaW5lIFNSX1JYX0RNQV9FTkEgICAweDA0ICAgIC8qIHJlY2VpdmVyIERNQSBlbmFibGUgYml0ICovCisjZGVmaW5lIFNSX1RYX0RNQV9FTkEgICAweDA4ICAgIC8qIHRyYW5zbWl0dGVyIERNQSBlbmFibGUgYml0ICovCisjZGVmaW5lIFNSX1JTVCAgICAgICAgICAweDEwICAgIC8qIFNSUCByZXNldCAqLworI2RlZmluZSBTUl9VU1JfSU5UX0VOQSAgMHgyMCAgICAvKiB1c2VyIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIFNSX1RYX0lOVF9FTkEgICAweDQwICAgIC8qIHRyYW5zbWl0dGVyIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIFNSX1JYX0lOVF9FTkEgICAweDgwICAgIC8qIHJlY2VpdmVyIGludGVycnVwdCBlbmFibGUgYml0ICovCisKKy8qIHN0YXR1cyByZWdpc3RlciAtIGlucHV0IGJpdHMgKi8KKyNkZWZpbmUgU1JfVVNSX1JRICAgICAgIDB4MjAgICAgLyogdXNlciBpbnRlcnJ1cHQgcmVxdWVzdCBwZW5kaW5nICovCisjZGVmaW5lIFNSX1RYX1JEWSAgICAgICAweDQwICAgIC8qIHRyYW5zbWl0dGVyIGVtcHR5IChyZWFkeSkgKi8KKyNkZWZpbmUgU1JfUlhfUkRZICAgICAgIDB4ODAgICAgLyogcmVjZWl2ZXIgZGF0YSByZWFkeSAqLworCisjZGVmaW5lIFNSX1VQX1JFUVVFU1QgICAweDAyICAgIC8qIHJlcXVlc3QgZnJvbSBTUlAgdG8gdHJhbnNmZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCB0byBQQyAqLworI2RlZmluZSBTUl9ET1dOX1JFUVVFU1QgMHgwMSAgICAvKiBTUlAgaXMgYWJsZSB0byB0cmFuc2ZlciBkYXRhIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBQQyB0byBTUlAgKi8KKyNkZWZpbmUgU1JfRU5EX09GX1RSQU5TRkVSICAgICAgMHgwMyAgICAvKiBTUlAgc2lnbmFsaXplIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyICh1cCBvciBkb3duKSAqLworCisjZGVmaW5lIFNSX0NNRF9GUk9NX1NSUF9NQVNLICAgIDB4MDMgICAgLyogbWFzayB0byBnZXQgU1JQIGNvbW1hbmQgKi8KKworLyogYml0cyBpbiBkcml2ZXIgc3RhdHVzIGJ5dGUgZGVmaW5pdGlvbnMgOiAqLworI2RlZmluZSBTUl9SRFlfUkNWICAgICAgMHgwMSAgICAvKiByZWFkeSB0byByZWNlaXZlIHBhY2tldCAqLworI2RlZmluZSBTUl9SRFlfU05EICAgICAgMHgwMiAgICAvKiByZWFkeSB0byBzZW5kIHBhY2tldCAqLworI2RlZmluZSBTUl9DTURfUE5EICAgICAgMHgwNCAgICAvKiBjb21tYW5kIHBlbmRpbmcgKi8gLyogbm90IGN1cnJlbnRseSB1c2VkICovCisKKy8qID8/Pz8gKi8KKyNkZWZpbmUgU1JfUEtUX1VQICAgICAgIDB4MDEgICAgLyogdHJhbnNmZXIgb2YgcGFja2V0IHVwIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNSX1BLVF9ET1dOICAgICAweDAyICAgIC8qIHRyYW5zZmVyIG9mIHBhY2tldCBkb3duIGluIHByb2dyZXNzICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgU1JfTE9BRF9BRERSICAgIDB4NDQwMCAgLyogU1JQIG1pY3JvY29kZSBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1JfU1RBUlRfQUREUiAgIDB4NDQwMCAgLyogU1JQIG1pY3JvY29kZSBzdGFydCBhZGRyZXNzICovCisKKyNkZWZpbmUgQ09TQV9MT0FEX0FERFIgICAgMHg0MDAgIC8qIFNSUCBtaWNyb2NvZGUgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENPU0FfTUFYX0ZJUk1XQVJFX1NJWkUJMHgxMDAwMAorCisvKiBpb2N0bHMgKi8KK3N0cnVjdCBjb3NhX2Rvd25sb2FkIHsKKwlpbnQgYWRkciwgbGVuOworCWNoYXIgX191c2VyICpjb2RlOworfTsKKworLyogUmVzZXQgdGhlIGRldmljZSAqLworI2RlZmluZSBDT1NBSU9SU0VUCV9JTygnQycsMHhmMCkKKworLyogU3RhcnQgbWljcm9jb2RlIGF0IGdpdmVuIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09TQUlPU1RSVAlfSU9XKCdDJywweGYxLCBpbnQpCisKKy8qIFJlYWQgdGhlIGJsb2NrIGZyb20gdGhlIGRldmljZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ09TQUlPUk1FTQlfSU9XUignQycsMHhmMiwgc3RydWN0IGNvc2FfZG93bmxvYWQgKikKKwkvKiBhY3R1YWxseSB0aGUgc3RydWN0IGNvc2FfZG93bmxvYWQgaXRzZWxmOyB0aGlzIGlzIHRvIGtlZXAKKwkgKiB0aGUgaW9jdGwgbnVtYmVyIHNhbWUgYXMgaW4gMi40IGluIG9yZGVyIHRvIGtlZXAgdGhlIHVzZXItc3BhY2UKKwkgKiB1dGlscyBjb21wYXRpYmxlLiAqLworCisvKiBXcml0ZSB0aGUgYmxvY2sgdG8gdGhlIGRldmljZSBtZW1vcnkgKGkuZS4gZG93bmxvYWQgdGhlIG1pY3JvY29kZSkgKi8KKyNkZWZpbmUgQ09TQUlPRE9XTkxECV9JT1coJ0MnLDB4ZjIsIHN0cnVjdCBjb3NhX2Rvd25sb2FkICopCisJLyogYWN0dWFsbHkgdGhlIHN0cnVjdCBjb3NhX2Rvd25sb2FkIGl0c2VsZjsgdGhpcyBpcyB0byBrZWVwCisJICogdGhlIGlvY3RsIG51bWJlciBzYW1lIGFzIGluIDIuNCBpbiBvcmRlciB0byBrZWVwIHRoZSB1c2VyLXNwYWNlCisJICogdXRpbHMgY29tcGF0aWJsZS4gKi8KKworLyogUmVhZCB0aGUgZGV2aWNlIHR5cGUgKG9uZSBvZiAic3JwIiwgImNvc2EiLCBhbmQgImNvc2E4IiBmb3Igbm93KSAqLworI2RlZmluZSBDT1NBSU9SVFlQRQlfSU9SKCdDJywweGYzLCBjaGFyICopCisKKy8qIFJlYWQgdGhlIGRldmljZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUgQ09TQUlPUklEU1RSCV9JT1IoJ0MnLDB4ZjQsIGNoYXIgKikKKy8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcuICovCisjZGVmaW5lIENPU0FfTUFYX0lEX1NUUklORyAxMjgKKworLyogSW5jcmVtZW50L2RlY3JlbWVudCB0aGUgbW9kdWxlIHVzYWdlIGNvdW50IDotKSAqLworLyogI2RlZmluZSBDT1NBSU9NSU5DCV9JTygnQycsMHhmNSkgKi8KKy8qICNkZWZpbmUgQ09TQUlPTURFQwlfSU8oJ0MnLDB4ZjYpICovCisKKy8qIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGNhcmRzIGluc3RhbGxlZCAqLworI2RlZmluZSBDT1NBSU9OUkNBUkRTCV9JTygnQycsMHhmNykKKworLyogR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb24gdGhpcyBjYXJkICovCisjZGVmaW5lIENPU0FJT05SQ0hBTlMJX0lPKCdDJywweGY4KQorCisvKiBTZXQgdGhlIGRyaXZlciBmb3IgdGhlIGJ1cy1tYXN0ZXIgb3BlcmF0aW9ucyAqLworI2RlZmluZSBDT1NBSU9CTVNFVAlfSU9XKCdDJywgMHhmOSwgdW5zaWduZWQgc2hvcnQpCisKKyNkZWZpbmUgQ09TQV9CTV9PRkYJMAkvKiBCdXMtbWFzdGVyaW5nIG9mZiAtIHVzZSBJU0EgRE1BIChkZWZhdWx0KSAqLworI2RlZmluZSBDT1NBX0JNX09OCTEJLyogQnVzLW1hc3RlcmluZyBvbiAtIGZhc3RlciBidXQgdW50ZXN0ZWQgKi8KKworLyogR2V0cyB0aGUgYnVzbWFzdGVyIHN0YXR1cyAqLworI2RlZmluZSBDT1NBSU9CTUdFVAlfSU8oJ0MnLCAweGZhKQorCisjZW5kaWYgLyogIUNPU0FfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzRhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYwpAQCAtMCwwICsxLDU4NiBAQAorLyoKKyogY3ljeF9kcnYuYwlDeWNsb20gMlggU3VwcG9ydCBNb2R1bGUuCisqCisqCQlUaGlzIG1vZHVsZSBpcyBhIGxpYnJhcnkgb2YgY29tbW9uIGhhcmR3YXJlIHNwZWNpZmljCisqCQlmdW5jdGlvbnMgdXNlZCBieSB0aGUgQ3ljbGFkZXMgQ3ljbG9tIDJYIHN5bmMgY2FyZC4KKyoKKyogQXV0aG9yOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbworKgorKiBCYXNlZCBvbiBzZGxhZHJ2LmMgYnkgR2VuZSBLb3ppbiA8Z2VuZWtAY29tcHVzZXJ2ZS5jb20+CisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIDE5OTkvMTEvMTEJYWNtZQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKSwgY29kZQorKgkJCQljbGVhbnVwCisqIDE5OTkvMTEvMDgJYWNtZQkJaW5pdF9jeWMyeCBkZWxldGVkLCBkb2luZyBub3RoaW5nCisqIDE5OTkvMTEvMDYJYWNtZQkJYmFjayB0byByZWFkW2J3XSwgd3JpdGVbYnddIGFuZCBtZW1jcHlfdG8gYW5kCisqCQkJCWZyb21pbyB0byB1c2UgZHBtYmFzZSBpb3JlbWFwZWQKKyogMTk5OS8xMC8yNglhY21lCQl1c2UgaXNhX3JlYWRbYnddLCBpc2Ffd3JpdGVbYnddICYgaXNhX21lbWNweV90bworKgkJCQkmIGZyb21pbworKiAxOTk5LzEwLzIzCWFjbWUJCWNsZWFudXAgdG8gb25seSBzdXBwb3J0cyBjeWNsb20yeDogYWxsIHRoZSBvdGhlcgorKgkJCQlib2FyZHMgYXJlIG5vIGxvbmdlciBtYW51ZmFjdHVyZWQgYnkgY3ljbGFkZXMsCisqCQkJCWlmIHNvbWVvbmUgd2FudHMgdG8gc3VwcG9ydCB0aGVtLi4uIGJlIG15IGd1ZXN0IQorKiAxOTk5LzA1LzI4ICAgIGFjbWUJCWN5Y3hfaW50YWNrICYgY3ljeF9pbnRkZSBnb25lIGZvciBnb29kCisqIDE5OTkvMDUvMTgJYWNtZQkJbG90cyBvZiB1bmxvZ2dlZCB3b3JrLCBzdWJtaXR0aW5nIHRvIExpbnVzLi4uCisqIDE5OTkvMDEvMDMJYWNtZQkJbW9yZSBqdWRpY2lvdXMgdXNlIG9mIGRhdGEgdHlwZXMKKyogMTk5OS8wMS8wMwlhY21lCQlqdWRpY2lvdXMgdXNlIG9mIGRhdGEgdHlwZXMgOj4KKyoJCQkJY3ljeF9pbnRlbiB0cnlpbmcgdG8gcmVzZXQgcGVuZGluZyBpbnRlcnJ1cHRzCisqCQkJCWZyb20gY3ljbG9tIDJ4IC0gSSB0aGluayB0aGlzIGlzbid0IHRoZSB3YXkgdG8KKyoJCQkJZ28sIGJ1dCBmb3Igbm93Li4uCisqIDE5OTkvMDEvMDIJYWNtZQkJY3ljeF9pbnRhY2sgb2ssIEkgdGhpbmsgdGhlcmUncyBub3RoaW5nIHRvIGRvCisqCQkJCXRvIGFjayBhbiBpbnQgaW4gY3ljeF9kcnYuYywgb25seSBoYW5kbGUgaXQgaW4KKyoJCQkJY3l4X2lzciAob3IgaW4gdGhlIG90aGVyIHByb3RvY29sczogY3lwX2lzciwKKyoJCQkJY3lmX2lzciwgd2hlbiB0aGV5IGdldCBpbXBsZW1lbnRlZC4KKyogRGVjIDMxLCAxOTk4CWFjbWUJCWN5Y3hfZGF0YV9ib290ICYgY3ljeF9jb2RlX2Jvb3QgZml4ZWQsIGNyb3NzaW5nCisqCQkJCWZpbmdlcnMgdG8gc2VlIHgyNV9jb25maWd1cmUgaW4gY3ljeF94MjUuYworKgkJCQl3b3JrLi4uIDopCisqIERlYyAyNiwgMTk5OAlhY21lCQlsb2FkIGltcGxlbWVudGF0aW9uIGZpeGVkLCBzZWVtcyB0byB3b3JrISA6KQorKgkJCQljeWN4XzJ4X2RwbWJhc2Vfb3B0aW9ucyB3aXRoIGFsbCB0aGUgcG9zc2libGUKKyoJCQkJRFBNIGFkZHJlc3NlcyAoMjApLgorKgkJCQljeWN4X2ludHIgaW1wbGVtZW50ZWQgKHRlc3QgdGhpcyEpCisqCQkJCWdlbmVyYWwgY29kZSBjbGVhbnVwCisqIERlYyAgOCwgMTk5OAlJdmFuIFBhc3NvcwlDeWNsb20tMlggZmlybXdhcmUgbG9hZCBpbXBsZW1lbnRhdGlvbi4KKyogQXVnICA4LCAxOTk4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBfX2luaXQgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBqaWZmaWVzLCBIWiwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2N5Y3hfZHJ2Lmg+CS8qIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2N5Y3hfY2ZtLmg+CS8qIENZQ1ggZmlybXdhcmUgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5ICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiByZWFkW3dsXSwgd3JpdGVbd2xdLCBpb3JlbWFwLCBpb3VubWFwICovCisKKyNkZWZpbmUJTU9EX1ZFUlNJT04JMAorI2RlZmluZQlNT0RfUkVMRUFTRQk2CisKK01PRFVMRV9BVVRIT1IoIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDeWNsb20gMnggU3luYyBDYXJkIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBIYXJkd2FyZS1zcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgbG9hZF9jeWMyeChzdHJ1Y3QgY3ljeF9odyAqaHcsIHN0cnVjdCBjeWN4X2Zpcm13YXJlICpjZm0sIHUzMiBsZW4pOworc3RhdGljIHZvaWQgY3ljeF9ib290Y2ZnKHN0cnVjdCBjeWN4X2h3ICpodyk7CisKK3N0YXRpYyBpbnQgcmVzZXRfY3ljMngodm9pZCBfX2lvbWVtICphZGRyKTsKK3N0YXRpYyBpbnQgZGV0ZWN0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcik7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBkZWxheV9jeWN4KGludCBzZWMpOworc3RhdGljIGludCBnZXRfb3B0aW9uX2luZGV4KGxvbmcgKm9wdGxpc3QsIGxvbmcgb3B0dmFsKTsKK3N0YXRpYyB1MTYgY2hlY2tzdW0odTggKmJ1ZiwgdTMyIGxlbik7CisKKyNkZWZpbmUgd2FpdF9jeWMoYWRkcikgY3ljeF9leGVjKGFkZHIgKyBDTURfT0ZGU0VUKQorCisvKiBHbG9iYWwgRGF0YSAqLworCisvKiBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBjaGFyIG1vZG5hbWVbXSA9ICJjeWN4X2RydiI7CitzdGF0aWMgY2hhciBmdWxsbmFtZVtdID0gIkN5Y2xvbSAyWCBTdXBwb3J0IE1vZHVsZSI7CitzdGF0aWMgY2hhciBjb3B5cmlnaHRbXSA9ICIoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyAiCisJCQkgICI8YWNtZUBjb25lY3RpdmEuY29tLmJyPiI7CisKKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqIFRoZXNlIGFyZSBhcnJheXMgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgYnkgdmVyaWZpY2F0aW9uIHJvdXRpbmVzLgorICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBhcnJheSBpcyBpdHMgc2l6ZSAoaS5lLiBudW1iZXIgb2Ygb3B0aW9ucykuCisgKi8KK3N0YXRpYyBsb25nIGN5YzJ4X2RwbWJhc2Vfb3B0aW9uc1tdID0geworCTIwLAorCTB4QTAwMDAsIDB4QTQwMDAsIDB4QTgwMDAsIDB4QUMwMDAsIDB4QjAwMDAsIDB4QjQwMDAsIDB4QjgwMDAsCisJMHhCQzAwMCwgMHhDMDAwMCwgMHhDNDAwMCwgMHhDODAwMCwgMHhDQzAwMCwgMHhEMDAwMCwgMHhENDAwMCwKKwkweEQ4MDAwLCAweERDMDAwLCAweEUwMDAwLCAweEU0MDAwLCAweEU4MDAwLCAweEVDMDAwCit9OworCitzdGF0aWMgbG9uZyBjeWN4XzJ4X2lycV9vcHRpb25zW10gID0geyA3LCAzLCA1LCA5LCAxMCwgMTEsIDEyLCAxNSB9OworCisvKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqLworLyogTW9kdWxlICdpbnNlcnQnIGVudHJ5IHBvaW50LgorICogbyBwcmludCBhbm5vdW5jZW1lbnQKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MgKi8KKworaW50IF9faW5pdCBjeWN4X2Rydl9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLCBmdWxsbmFtZSwgTU9EX1ZFUlNJT04sIE1PRF9SRUxFQVNFLAorCQkJIGNvcHlyaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTW9kdWxlICdyZW1vdmUnIGVudHJ5IHBvaW50LgorICogbyByZWxlYXNlIGFsbCByZW1haW5pbmcgc3lzdGVtIHJlc291cmNlcyAqLwordm9pZCBjeWN4X2Rydl9jbGVhbnVwKHZvaWQpCit7Cit9CisKKy8qIEtlcm5lbCBBUElzICovCisvKiBTZXQgdXAgYWRhcHRlci4KKyAqIG8gZGV0ZWN0IGFkYXB0ZXIgdHlwZQorICogbyB2ZXJpZnkgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKiBvIGNoZWNrIGZvciBoYXJkd2FyZSBjb25mbGljdHMKKyAqIG8gc2V0IHVwIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeQorICogbyB0ZXN0IGFkYXB0ZXIgbWVtb3J5CisgKiBvIGxvYWQgZmlybXdhcmUKKyAqIFJldHVybjoJMAlvay4KKyAqCQk8IDAJZXJyb3IgKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9zZXR1cCk7CitpbnQgY3ljeF9zZXR1cChzdHJ1Y3QgY3ljeF9odyAqaHcsIHZvaWQgKmNmbSwgdTMyIGxlbiwgdW5zaWduZWQgbG9uZyBkcG1iYXNlKQoreworCWludCBlcnI7CisKKwkvKiBWZXJpZnkgSVJRIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWlmICghZ2V0X29wdGlvbl9pbmRleChjeWN4XzJ4X2lycV9vcHRpb25zLCBody0+aXJxKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgaXMgaW52YWxpZCFcbiIsIG1vZG5hbWUsIGh3LT5pcnEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXR1cCBhZGFwdGVyIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGFuZCB0ZXN0IG1lbW9yeSAqLworCWlmICghZHBtYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBkcG0gYWRkcmVzcyFcbiIsCisJCQkJbW9kbmFtZSk7CisgCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFnZXRfb3B0aW9uX2luZGV4KGN5YzJ4X2RwbWJhc2Vfb3B0aW9ucywgZHBtYmFzZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVtb3J5IGFkZHJlc3MgMHglbFggaXMgaW52YWxpZCFcbiIsCisJCQkJbW9kbmFtZSwgZHBtYmFzZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWh3LT5kcG1iYXNlID0gaW9yZW1hcChkcG1iYXNlLCBDWUNYX1dJTkRPV1NJWkUpOworCWh3LT5kcG1zaXplID0gQ1lDWF9XSU5ET1dTSVpFOworCisJaWYgKCFkZXRlY3RfY3ljMngoaHctPmRwbWJhc2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFkYXB0ZXIgQ3ljbG9tIDJYIG5vdCBmb3VuZCBhdCAiCisJCQkJImFkZHJlc3MgMHglbFghXG4iLCBtb2RuYW1lLCBkcG1iYXNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvdW5kIEN5Y2xvbSAyWCBjYXJkIGF0IGFkZHJlc3MgMHglbFguXG4iLAorCQkJIG1vZG5hbWUsIGRwbWJhc2UpOworCisJLyogTG9hZCBmaXJtd2FyZS4gSWYgbG9hZGVyIGZhaWxzIHRoZW4gc2h1dCBkb3duIGFkYXB0ZXIgKi8KKwllcnIgPSBsb2FkX2N5YzJ4KGh3LCBjZm0sIGxlbik7CisKKwlpZiAoZXJyKQorCQljeWN4X2Rvd24oaHcpOyAgICAgICAgIC8qIHNodXRkb3duIGFkYXB0ZXIgKi8KKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woY3ljeF9kb3duKTsKK2ludCBjeWN4X2Rvd24oc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCWlvdW5tYXAoaHctPmRwbWJhc2UpOworCXJldHVybiAwOworfQorCisvKiBFbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24uICAqLworRVhQT1JUX1NZTUJPTChjeWN4X2ludGVuKTsKK3ZvaWQgY3ljeF9pbnRlbihzdHJ1Y3QgY3ljeF9odyAqaHcpCit7CisJd3JpdGViKDAsIGh3LT5kcG1iYXNlKTsKK30KKworLyogR2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIGFkYXB0ZXIncyBDUFUuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfaW50cik7Cit2b2lkIGN5Y3hfaW50cihzdHJ1Y3QgY3ljeF9odyAqaHcpCit7CisJd3JpdGV3KDAsIGh3LT5kcG1iYXNlICsgR0VOX0NZQ1hfSU5UUik7Cit9CisKKy8qIEV4ZWN1dGUgQWRhcHRlciBDb21tYW5kLgorICogbyBTZXQgZXhlYyBmbGFnLgorICogbyBCdXN5LXdhaXQgdW50aWwgZmxhZyBpcyByZXNldC4gKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9leGVjKTsKK2ludCBjeWN4X2V4ZWModm9pZCBfX2lvbWVtICphZGRyKQoreworCXUxNiBpID0gMDsKKwkvKiB3YWl0IHRpbGwgYWRkciBjb250ZW50IGlzIHplcm9lZCAqLworCisJd2hpbGUgKHJlYWR3KGFkZHIpKSB7CisJCXVkZWxheSgxMDAwKTsKKworCQlpZiAoKytpID4gNTApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgYWJzb2x1dGUgYWRhcHRlciBtZW1vcnkuCisgKiBUcmFuc2ZlciBkYXRhIGZyb20gYWRhcHRlcidzIG1lbW9yeSB0byBkYXRhIGJ1ZmZlci4gKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9wZWVrKTsKK2ludCBjeWN4X3BlZWsoc3RydWN0IGN5Y3hfaHcgKmh3LCB1MzIgYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKQoreworCWlmIChsZW4gPT0gMSkKKwkJKih1OCopYnVmID0gcmVhZGIoaHctPmRwbWJhc2UgKyBhZGRyKTsKKwllbHNlCisJCW1lbWNweV9mcm9taW8oYnVmLCBody0+ZHBtYmFzZSArIGFkZHIsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgQWJzb2x1dGUgQWRhcHRlciBNZW1vcnkuCisgKiBUcmFuc2ZlciBkYXRhIGZyb20gZGF0YSBidWZmZXIgdG8gYWRhcHRlcidzIG1lbW9yeS4gKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9wb2tlKTsKK2ludCBjeWN4X3Bva2Uoc3RydWN0IGN5Y3hfaHcgKmh3LCB1MzIgYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKQoreworCWlmIChsZW4gPT0gMSkKKwkJd3JpdGViKCoodTgqKWJ1ZiwgaHctPmRwbWJhc2UgKyBhZGRyKTsKKwllbHNlCisJCW1lbWNweV90b2lvKGh3LT5kcG1iYXNlICsgYWRkciwgYnVmLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhcmR3YXJlLVNwZWNpZmljIEZ1bmN0aW9ucyAqLworCisvKiBMb2FkIEF1eCBSb3V0aW5lcyAqLworLyogUmVzZXQgYm9hcmQgaGFyZHdhcmUuCisgICByZXR1cm4gMSBpZiBtZW1vcnkgZXhpc3RzIGF0IGFkZHIgYW5kIDAgaWYgbm90LiAqLworc3RhdGljIGludCBtZW1vcnlfZXhpc3RzKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpbnQgdHJpZXMgPSAwOworCisJZm9yICg7IHRyaWVzIDwgMyA7IHRyaWVzKyspIHsKKwkJd3JpdGV3KFRFU1RfUEFUVEVSTiwgYWRkciArIDB4MTApOworCisJCWlmIChyZWFkdyhhZGRyICsgMHgxMCkgPT0gVEVTVF9QQVRURVJOKQorCQkJaWYgKHJlYWR3KGFkZHIgKyAweDEwKSA9PSBURVNUX1BBVFRFUk4pCisJCQkJcmV0dXJuIDE7CisKKwkJZGVsYXlfY3ljeCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTG9hZCByZXNldCBjb2RlLiAqLworc3RhdGljIHZvaWQgcmVzZXRfbG9hZCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpidWZmZXIsIHUzMiBjbnQpCit7CisJdm9pZCBfX2lvbWVtICpwdF9jb2RlID0gYWRkciArIFJFU0VUX09GRlNFVDsKKwl1MTYgaTsgLyosIGo7ICovCisKKwlmb3IgKGkgPSAwIDsgaSA8IGNudCA7IGkrKykgeworLyoJCWZvciAoaiA9IDAgOyBqIDwgNTAgOyBqKyspOyBEZWxheSAtIEZJWE1FIGJ1c3kgd2FpdGluZy4uLiAqLworCQl3cml0ZWIoKmJ1ZmZlcisrLCBwdF9jb2RlKyspOworCX0KK30KKworLyogTG9hZCBidWZmZXIgdXNpbmcgYm9vdCBpbnRlcmZhY2UuCisgKiBvIGNvcHkgZGF0YSBmcm9tIGJ1ZmZlciB0byBDeWNsb20tWCBtZW1vcnkKKyAqIG8gd2FpdCBmb3IgcmVzZXQgY29kZSB0byBjb3B5IGl0IHRvIHJpZ2h0IHBvcnRpb24gb2YgbWVtb3J5ICovCitzdGF0aWMgaW50IGJ1ZmZlcl9sb2FkKHZvaWQgX19pb21lbSAqYWRkciwgdTggKmJ1ZmZlciwgdTMyIGNudCkKK3sKKwltZW1jcHlfdG9pbyhhZGRyICsgREFUQV9PRkZTRVQsIGJ1ZmZlciwgY250KTsKKwl3cml0ZXcoR0VOX0JPT1RfREFULCBhZGRyICsgQ01EX09GRlNFVCk7CisKKwlyZXR1cm4gd2FpdF9jeWMoYWRkcik7Cit9CisKKy8qIFNldCB1cCBlbnRyeSBwb2ludCBhbmQga2ljayBzdGFydCBDeWNsb20tWCBDUFUuICovCitzdGF0aWMgdm9pZCBjeWN4X3N0YXJ0KHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwkvKiBwdXQgaW4gMHgzMCBvZmZzZXQgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gdG8gdGhlIGNvZGUgZW50cnkgcG9pbnQgKi8KKwl3cml0ZWIoMHhlYSwgYWRkciArIDB4MzApOworCXdyaXRlYigweDAwLCBhZGRyICsgMHgzMSk7CisJd3JpdGViKDB4YzQsIGFkZHIgKyAweDMyKTsKKwl3cml0ZWIoMHgwMCwgYWRkciArIDB4MzMpOworCXdyaXRlYigweDAwLCBhZGRyICsgMHgzNCk7CisKKwkvKiBjbWQgdG8gc3RhcnQgZXhlY3V0aW5nIGNvZGUgKi8KKwl3cml0ZXcoR0VOX1NUQVJULCBhZGRyICsgQ01EX09GRlNFVCk7Cit9CisKKy8qIExvYWQgYW5kIGJvb3QgcmVzZXQgY29kZS4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfcmVzZXRfYm9vdCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpjb2RlLCB1MzIgbGVuKQoreworCXZvaWQgX19pb21lbSAqcHRfc3RhcnQgPSBhZGRyICsgU1RBUlRfT0ZGU0VUOworCisJd3JpdGViKDB4ZWEsIHB0X3N0YXJ0KyspOyAvKiBqbXAgdG8gZjAwMDozZjAwICovCisJd3JpdGViKDB4MDAsIHB0X3N0YXJ0KyspOworCXdyaXRlYigweGZjLCBwdF9zdGFydCsrKTsKKwl3cml0ZWIoMHgwMCwgcHRfc3RhcnQrKyk7CisJd3JpdGViKDB4ZjAsIHB0X3N0YXJ0KTsKKwlyZXNldF9sb2FkKGFkZHIsIGNvZGUsIGxlbik7CisKKwkvKiA4MDE4NiB3YXMgaW4gaG9sZCwgZ28gKi8KKwl3cml0ZWIoMCwgYWRkciArIFNUQVJUX0NQVSk7CisJZGVsYXlfY3ljeCgxKTsKK30KKworLyogTG9hZCBkYXRhLmJpbiBmaWxlIHRocm91Z2ggYm9vdCAocmVzZXQpIGludGVyZmFjZS4gKi8KK3N0YXRpYyBpbnQgY3ljeF9kYXRhX2Jvb3Qodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqY29kZSwgdTMyIGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKnB0X2Jvb3RfY21kID0gYWRkciArIENNRF9PRkZTRVQ7CisJdTMyIGk7CisKKwkvKiBib290IGJ1ZmZlciBsZW5naHQgKi8KKwl3cml0ZXcoQ0ZNX0xPQURfQlVGU1osIHB0X2Jvb3RfY21kICsgc2l6ZW9mKHUxNikpOworCXdyaXRldyhHRU5fREVGUEFSLCBwdF9ib290X2NtZCk7CisKKwlpZiAod2FpdF9jeWMoYWRkcikgPCAwKQorCQlyZXR1cm4gLTE7CisKKwl3cml0ZXcoMCwgcHRfYm9vdF9jbWQgKyBzaXplb2YodTE2KSk7CisJd3JpdGV3KDB4NDAwMCwgcHRfYm9vdF9jbWQgKyAyICogc2l6ZW9mKHUxNikpOworCXdyaXRldyhHRU5fU0VUX1NFRywgcHRfYm9vdF9jbWQpOworCisJaWYgKHdhaXRfY3ljKGFkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMCA7IGkgPCBsZW4gOyBpICs9IENGTV9MT0FEX0JVRlNaKQorCQlpZiAoYnVmZmVyX2xvYWQoYWRkciwgY29kZSArIGksCisJCQkJbWluX3QodTMyLCBDRk1fTE9BRF9CVUZTWiwgKGxlbiAtIGkpKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAhIVxuIiwgbW9kbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCXJldHVybiAwOworfQorCisKKy8qIExvYWQgY29kZS5iaW4gZmlsZSB0aHJvdWdoIGJvb3QgKHJlc2V0KSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IGN5Y3hfY29kZV9ib290KHZvaWQgX19pb21lbSAqYWRkciwgdTggKmNvZGUsIHUzMiBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpwdF9ib290X2NtZCA9IGFkZHIgKyBDTURfT0ZGU0VUOworCXUzMiBpOworCisJLyogYm9vdCBidWZmZXIgbGVuZ2h0ICovCisJd3JpdGV3KENGTV9MT0FEX0JVRlNaLCBwdF9ib290X2NtZCArIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX0RFRlBBUiwgcHRfYm9vdF9jbWQpOworCisJaWYgKHdhaXRfY3ljKGFkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd3JpdGV3KDB4MDAwMCwgcHRfYm9vdF9jbWQgKyBzaXplb2YodTE2KSk7CisJd3JpdGV3KDB4YzQwMCwgcHRfYm9vdF9jbWQgKyAyICogc2l6ZW9mKHUxNikpOworCXdyaXRldyhHRU5fU0VUX1NFRywgcHRfYm9vdF9jbWQpOworCisJaWYgKHdhaXRfY3ljKGFkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMCA7IGkgPCBsZW4gOyBpICs9IENGTV9MT0FEX0JVRlNaKQorCQlpZiAoYnVmZmVyX2xvYWQoYWRkciwgY29kZSArIGksCisJCQkJbWluX3QodTMyLCBDRk1fTE9BRF9CVUZTWiwgKGxlbiAtIGkpKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICEhXG4iLCBtb2RuYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIExvYWQgYWRhcHRlciBmcm9tIHRoZSBtZW1vcnkgaW1hZ2Ugb2YgdGhlIENZQ1ggZmlybXdhcmUgbW9kdWxlLgorICogbyB2ZXJpZnkgZmlybXdhcmUgaW50ZWdyaXR5IGFuZCBjb21wYXRpYmlsaXR5CisgKiBvIHN0YXJ0IGFkYXB0ZXIgdXAgKi8KK3N0YXRpYyBpbnQgbG9hZF9jeWMyeChzdHJ1Y3QgY3ljeF9odyAqaHcsIHN0cnVjdCBjeWN4X2Zpcm13YXJlICpjZm0sIHUzMiBsZW4pCit7CisJaW50IGksIGo7CisJc3RydWN0IGN5Y3hfZndfaGVhZGVyICppbWdfaGRyOworCXU4ICpyZXNldF9pbWFnZSwKKwkgICAqZGF0YV9pbWFnZSwKKwkgICAqY29kZV9pbWFnZTsKKwl2b2lkIF9faW9tZW0gKnB0X2N5Y2xkID0gaHctPmRwbWJhc2UgKyAweDQwMDsKKwl1MTYgY2tzdW07CisKKwkvKiBBbm5vdW5jZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJtd2FyZSBzaWduYXR1cmU9XCIlc1wiXG4iLCBtb2RuYW1lLAorCQkJCQkJCSAgICBjZm0tPnNpZ25hdHVyZSk7CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgc2lnbmF0dXJlICovCisJaWYgKHN0cmNtcChjZm0tPnNpZ25hdHVyZSwgQ0ZNX1NJR05BVFVSRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpsb2FkX2N5YzJ4OiBub3QgQ3ljbG9tLTJYIGZpcm13YXJlIVxuIiwKKwkJCQltb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIHZlcnNpb249JXVcbiIsIG1vZG5hbWUsIGNmbS0+dmVyc2lvbik7CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGZvcm1hdCB2ZXJzaW9uICovCisJaWYgKGNmbS0+dmVyc2lvbiAhPSBDRk1fVkVSU0lPTikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiVzOiBmaXJtd2FyZSBmb3JtYXQgJXUgcmVqZWN0ZWQhICIKKwkJCQkiRXhwZWN0aW5nICV1LlxuIiwKKwkJCQltb2RuYW1lLCBfX0ZVTkNUSU9OX18sIGNmbS0+dmVyc2lvbiwgQ0ZNX1ZFUlNJT04pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGxlbmd0aCBhbmQgY2hlY2tzdW0gKi8KKwlja3N1bSA9IGNoZWNrc3VtKCh1OCopJmNmbS0+aW5mbywgc2l6ZW9mKHN0cnVjdCBjeWN4X2Z3X2luZm8pICsKKwkJCQkJICBjZm0tPmluZm8uY29kZXNpemUpOworLyoKKwlGSVhNRSBjZm0tPmluZm8uY29kZXNpemUgaXMgb2ZmIGJ5IDIKKwlpZiAoKChsZW4gLSBzaXplb2Yoc3RydWN0IGN5Y3hfZmlybXdhcmUpIC0gMSkgIT0gY2ZtLT5pbmZvLmNvZGVzaXplKSB8fAorKi8KKwlpZiAoY2tzdW0gIT0gY2ZtLT5jaGVja3N1bSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiVzOiBmaXJtd2FyZSBjb3JydXB0ZWQhXG4iLAorCQkJCW1vZG5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50ayhLRVJOX0VSUiAiIGNkc2l6ZSA9IDB4JXggKGV4cGVjdGVkIDB4JWx4KVxuIiwKKwkJCQlsZW4gLSAoaW50KXNpemVvZihzdHJ1Y3QgY3ljeF9maXJtd2FyZSkgLSAxLAorCQkJCWNmbS0+aW5mby5jb2Rlc2l6ZSk7CisJCXByaW50ayhLRVJOX0VSUiAiIGNoa3N1bSA9IDB4JXggKGV4cGVjdGVkIDB4JXgpXG4iLAorCQkJCWNrc3VtLCBjZm0tPmNoZWNrc3VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgZXZlcnl0aGluZyBpcyBvaywgc2V0IHJlc2V0LCBkYXRhIGFuZCBjb2RlIHBvaW50ZXJzICovCisJaW1nX2hkciA9IChzdHJ1Y3QgY3ljeF9md19oZWFkZXIgKikmY2ZtLT5pbWFnZTsKKyNpZmRlZiBGSVJNV0FSRV9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIiVzOiVzOiBpbWFnZSBzaXplc1xuIiwgX19GVU5DVElPTl9fLCBtb2RuYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIgcmVzZXQ9JWx1XG4iLCBpbWdfaGRyLT5yZXNldF9zaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGRhdGE9JWx1XG4iLCBpbWdfaGRyLT5kYXRhX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIiAgY29kZT0lbHVcbiIsIGltZ19oZHItPmNvZGVfc2l6ZSk7CisjZW5kaWYKKwlyZXNldF9pbWFnZSA9ICgodTggKilpbWdfaGRyKSArIHNpemVvZihzdHJ1Y3QgY3ljeF9md19oZWFkZXIpOworCWRhdGFfaW1hZ2UgPSByZXNldF9pbWFnZSArIGltZ19oZHItPnJlc2V0X3NpemU7CisJY29kZV9pbWFnZSA9IGRhdGFfaW1hZ2UgKyBpbWdfaGRyLT5kYXRhX3NpemU7CisKKwkvKi0tLS0gU3RhcnQgbG9hZCAtLS0tKi8KKwkvKiBBbm5vdW5jZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2FkaW5nIGZpcm13YXJlICVzIChJRD0ldSkuLi5cbiIsIG1vZG5hbWUsCisJCQkgY2ZtLT5kZXNjclswXSA/IGNmbS0+ZGVzY3IgOiAidW5rbm93biBmaXJtd2FyZSIsCisJCQkgY2ZtLT5pbmZvLmNvZGVpZCk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDUgOyBpKyspIHsKKwkJLyogUmVzZXQgQ3ljbG9tIGhhcmR3YXJlICovCisJCWlmICghcmVzZXRfY3ljMngoaHctPmRwbWJhc2UpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcG0gcHJvYmxlbSBvciBib2FyZCBub3QgZm91bmRcbiIsCisJCQkJCW1vZG5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBMb2FkIHJlc2V0LmJpbiAqLworCQljeWN4X3Jlc2V0X2Jvb3QoaHctPmRwbWJhc2UsIHJlc2V0X2ltYWdlLCBpbWdfaGRyLT5yZXNldF9zaXplKTsKKwkJLyogcmVzZXQgaXMgd2FpdGluZyBmb3IgYm9vdCAqLworCQl3cml0ZXcoR0VOX1BPV0VSX09OLCBwdF9jeWNsZCk7CisJCWRlbGF5X2N5Y3goMSk7CisKKwkJZm9yIChqID0gMCA7IGogPCAzIDsgaisrKQorCQkJaWYgKCFyZWFkdyhwdF9jeWNsZCkpCisJCQkJZ290byByZXNldF9sb2FkZWQ7CisJCQllbHNlCisJCQkJZGVsYXlfY3ljeCgxKTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiByZXNldCBub3Qgc3RhcnRlZC5cbiIsIG1vZG5hbWUpOworCXJldHVybiAtRUlOVkFMOworCityZXNldF9sb2FkZWQ6CisJLyogTG9hZCBkYXRhLmJpbiAqLworCWlmIChjeWN4X2RhdGFfYm9vdChody0+ZHBtYmFzZSwgZGF0YV9pbWFnZSwgaW1nX2hkci0+ZGF0YV9zaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgbG9hZCBkYXRhIGZpbGUuXG4iLCBtb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTG9hZCBjb2RlLmJpbiAqLworCWlmIChjeWN4X2NvZGVfYm9vdChody0+ZHBtYmFzZSwgY29kZV9pbWFnZSwgaW1nX2hkci0+Y29kZV9zaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgbG9hZCBjb2RlIGZpbGUuXG4iLCBtb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUHJlcGFyZSBib290LXRpbWUgY29uZmlndXJhdGlvbiBkYXRhICovCisJY3ljeF9ib290Y2ZnKGh3KTsKKworCS8qIGtpY2stb2ZmIENQVSAqLworCWN5Y3hfc3RhcnQoaHctPmRwbWJhc2UpOworCisJLyogQXJ0aHVyIEdhbnplcnQncyB0aXA6IHdhaXQgYSB3aGlsZSBhZnRlciB0aGUgZmlybXdhcmUgbG9hZGluZy4uLgorCSAgIHNlZyBhYnIgMjYgMTc6MTc6MTIgRVNUIDE5OTkgLSBhY21lICovCisJZGVsYXlfY3ljeCg3KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgbG9hZGVkIVxuIiwgbW9kbmFtZSk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCWN5Y3hfaW50ZW4oaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFByZXBhcmUgYm9vdC10aW1lIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAqIG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGRhdGEgYXJlYQorICAgRnJvbSBhc3luYy5kb2MgLSBWXzMuNC4wIC0gMDcvMTgvMTk5NAorICAgLSBBcyBvZiBub3csIG9ubHkgc3RhdGljIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci4KKyAgICAgU28sIHRoZSBiaXQgVkRfUlhESVJDIG11c3QgYmUgc2V0IGluICd2YWxpZCcuIFRoYXQgbWVhbnMgdGhhdCB1c2VyCisgICAgIHdhbnRzIHRvIHVzZSB0aGUgc3RhdGljIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBjeWN4X2Jvb3RjZmcoc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCS8qIHVzZSBmaXhlZCBidWZmZXJzICovCisJd3JpdGViKEZJWEVEX0JVRkZFUlMsIGh3LT5kcG1iYXNlICsgQ09ORl9PRkZTRVQpOworfQorCisvKiBEZXRlY3QgQ3ljbG9tIDJ4IGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IEN5Y2xvbSAyeCBhZGFwdGVyOgorICogICAgICAgdG8gYmUgY29tcGxldGVkIGJhc2VkIG9uIHRoZSB0ZXN0cyBkb25lIGJlbG93CisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LiAqLworc3RhdGljIGludCBkZXRlY3RfY3ljMngodm9pZCBfX2lvbWVtICphZGRyKQoreworCXJlc2V0X2N5YzJ4KGFkZHIpOworCisJcmV0dXJuIG1lbW9yeV9leGlzdHMoYWRkcik7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKy8qIEdldCBvcHRpb24ncyBpbmRleCBpbnRvIHRoZSBvcHRpb25zIGxpc3QuCisgKglSZXR1cm4gb3B0aW9uJ3MgaW5kZXggKDEgLi4gTikgb3IgemVybyBpZiBvcHRpb24gaXMgaW52YWxpZC4gKi8KK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleChsb25nICpvcHRsaXN0LCBsb25nIG9wdHZhbCkKK3sKKwlpbnQgaSA9IDE7CisKKwlmb3IgKDsgaSA8PSBvcHRsaXN0WzBdOyArK2kpCisJCWlmIChvcHRsaXN0W2ldID09IG9wdHZhbCkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IGFkYXB0ZXIncyBDUFUuICovCitzdGF0aWMgaW50IHJlc2V0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZWIoMCwgYWRkciArIFJTVF9FTkFCTEUpOworCWRlbGF5X2N5Y3goMik7CisJd3JpdGViKDAsIGFkZHIgKyBSU1RfRElTQUJMRSk7CisJZGVsYXlfY3ljeCgyKTsKKworCXJldHVybiBtZW1vcnlfZXhpc3RzKGFkZHIpOworfQorCisvKiBEZWxheSAqLworc3RhdGljIHZvaWQgZGVsYXlfY3ljeChpbnQgc2VjKQoreworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChzZWMgKiBIWik7Cit9CisKKy8qIENhbGN1bGF0ZSAxNi1iaXQgQ1JDIHVzaW5nIENDSVRUIHBvbHlub21pYWwuICovCitzdGF0aWMgdTE2IGNoZWNrc3VtKHU4ICpidWYsIHUzMiBsZW4pCit7CisJdTE2IGNyYyA9IDA7CisJdTE2IG1hc2ssIGZsYWc7CisKKwlmb3IgKDsgbGVuOyAtLWxlbiwgKytidWYpCisJCWZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKwkJCWZsYWcgPSAoY3JjICYgMHg4MDAwKTsKKwkJCWNyYyA8PD0gMTsKKwkJCWNyYyB8PSAoKCpidWYgJiBtYXNrKSA/IDEgOiAwKTsKKworCQkJaWYgKGZsYWcpCisJCQkJY3JjIF49IDB4MTAyMTsKKwkJfQorCisJcmV0dXJuIGNyYzsKK30KKworbW9kdWxlX2luaXQoY3ljeF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChjeWN4X2Rydl9jbGVhbnVwKTsKKworLyogRW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0ODA2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X21haW4uYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyogY3ljeF9tYWluLmMJQ3ljbGFkZXMgQ3ljbG9tIDJYIFdBTiBMaW5rIERyaXZlci4gTWFpbiBtb2R1bGUuCisqCisqIEF1dGhvcjoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KKyoKKyogQmFzZWQgb24gc2RsYW1haW4uYyBieSBHZW5lIEtvemluIDxnZW5la0Bjb21wdXNlcnZlLmNvbT4gJgorKgkJCSBKYXNwcmVldCBTaW5naAk8amFzcHJlZXRAc2FuZ29tYS5jb20+CisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIFBsZWFzZSBsb29rIGF0IHRoZSBiaXRrZWVwZXIgY2hhbmdlbG9nIChvciBhbnkgb3RoZXIgc2NtIHRvb2wgdGhhdCBlbmRzIHVwCisqIGltcG9ydGluZyBiaXRrZWVwZXIgY2hhbmdlbG9nIG9yIHRoYXQgcmVwbGFjZXMgYml0a2VlcGVyIGluIHRoZSBmdXR1cmUgYXMKKyogbWFpbiB0b29sIGZvciBsaW51eCBkZXZlbG9wbWVudCkuCisqIAorKiAyMDAxLzA1LzA5CWFjbWUJCUZpeCBNT0RVTEVfREVTQyBmb3IgZGVidWcsIC5ic3Mgbml0cGlja3MsCisqIAkJCQlzb21lIGNsZWFudXBzCisqIDIwMDAvMDcvMTMJYWNtZQkJcmVtb3ZlIHVzZWxlc3MgI2lmZGVmIE1PRFVMRSBhbmQgY3JhcAorKgkJCQkjaWYgS0VSTkVMX1ZFUlNJT04gPiBibGFoCisqIDIwMDAvMDcvMDYJYWNtZQkJX19leGl0IGF0IGN5Y2xvbXhfY2xlYW51cAorKiAyMDAwLzA0LzAyCWFjbWUJCWRwcmludGsgYW5kIGN5Y3hfZGVidWcKKyogCQkJCW1vZHVsZV9pbml0L21vZHVsZV9leGl0CisqIDIwMDAvMDEvMjEJYWNtZQkJcmVuYW1lIGN5Y2xvbXhfb3BlbiB0byBjeWNsb214X21vZF9pbmNfdXNlX2NvdW50CisqCQkJCWFuZCBjeWNsb214X2Nsb3NlIHRvIGN5Y2xvbXhfbW9kX2RlY191c2VfY291bnQKKyogMjAwMC8wMS8wOAlhY21lCQljbGVhbnVwCisqIDE5OTkvMTEvMDYJYWNtZQkJY3ljeF9kb3duIGJhY2sgdG8gbGlmZSAoaXQgbmVlZHMgdG8gYmUKKyoJCQkJY2FsbGVkIHRvIGlvdW5tYXAgdGhlIGRwbWJhc2UpCisqIDE5OTkvMDgvMDkJYWNtZQkJcmVtb3ZlZCByZWZlcmVuY2VzIHRvIGVuYWJsZV90eF9pbnQKKyoJCQkJdXNlIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIGNsaS9zdGkgaW4KKyoJCQkJY3ljbG9teF9zZXRfc3RhdGUKKyogMTk5OS8wNS8xOQlhY21lCQl3b3JrcyBkaXJlY3RseSBsaW5rZWQgaW50byB0aGUga2VybmVsCisqCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQgZm9yIDIuMy4qIGtlcm5lbAorKiAxOTk5LzA1LzE4CWFjbWUJCW1ham9yIGNsZWFudXAgKHBvbGxpbmcgbm90IG5lZWRlZCksIGV0YworKiAxOTk4LzA4LzI4CWFjbWUJCW1pbm9yIGNsZWFudXAgKGlvY3RscyBmb3IgZmlybXdhcmUgZGVsZXRlZCkKKyoJCQkJcXVldWVfdGFzayBhY3RpdmF0ZWQKKyogMTk5OC8wOC8wOAlhY21lCQlJbml0aWFsIHZlcnNpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIE9TIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSwga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBzdXBwb3J0IGZvciBsb2FkYWJsZSBtb2R1bGVzICovCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uKCksIHJlbGVhc2VfcmVnaW9uKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2N5Y2xvbXguaD4JLyogY3ljbG9teCBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ICAgICAgICAgLyogX19pbml0ICh3aGVuIG5vdCB1c2luZyBhcyBhIG1vZHVsZSkgKi8KKwordW5zaWduZWQgaW50IGN5Y3hfZGVidWc7CisKK01PRFVMRV9BVVRIT1IoIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDeWNsb20gMlggU3luYyBDYXJkIERyaXZlci4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShjeWN4X2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjeWN4X2RlYnVnLCAiY3ljbG9teCBkZWJ1ZyBsZXZlbCIpOworCisvKiBEZWZpbmVzICYgTWFjcm9zICovCisKKyNkZWZpbmUJQ1lDWF9EUlZfVkVSU0lPTgkwCS8qIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lCUNZQ1hfRFJWX1JFTEVBU0UJMTEJLyogcmVsZWFzZSAobWlub3IgdmVyc2lvbikgbnVtYmVyICovCisjZGVmaW5lCUNZQ1hfTUFYX0NBUkRTCQkxCS8qIG1heCBudW1iZXIgb2YgYWRhcHRlcnMgKi8KKworI2RlZmluZQlDT05GSUdfQ1lDWF9DQVJEUyAxCisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworc3RhdGljIGludCBjeWN4X3dhbl9zZXR1cChzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCB3YW5kZXZfY29uZl90ICpjb25mKTsKK3N0YXRpYyBpbnQgY3ljeF93YW5fc2h1dGRvd24oc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY3ljeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIEdsb2JhbCBEYXRhCisgKiBOb3RlOiBBbGwgZGF0YSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQhISEKKyAqLworCisvKiBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBjaGFyIGN5Y3hfZHJ2bmFtZVtdID0gImN5Y2xvbXgiOworc3RhdGljIGNoYXIgY3ljeF9mdWxsbmFtZVtdID0gIkNZQ0xPTSAyWCh0bSkgU3luYyBDYXJkIERyaXZlciI7CitzdGF0aWMgY2hhciBjeWN4X2NvcHlyaWdodFtdID0gIihjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvICIKKwkJCSAgIjxhY21lQGNvbmVjdGl2YS5jb20uYnI+IjsKK3N0YXRpYyBpbnQgY3ljeF9uY2FyZHMgPSBDT05GSUdfQ1lDWF9DQVJEUzsKK3N0YXRpYyBzdHJ1Y3QgY3ljeF9kZXZpY2UgKmN5Y3hfY2FyZF9hcnJheTsJLyogYWRhcHRlciBkYXRhIHNwYWNlICovCisKKy8qIEtlcm5lbCBMb2FkYWJsZSBNb2R1bGUgRW50cnkgUG9pbnRzICovCisKKy8qCisgKiBNb2R1bGUgJ2luc2VydCcgZW50cnkgcG9pbnQuCisgKiBvIHByaW50IGFubm91bmNlbWVudAorICogbyBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICogbyByZWdpc3RlciBhbGwgY2FyZHMgd2l0aCBXQU4gcm91dGVyCisgKiBvIGNhbGlicmF0ZSBDeWNsb20gMlggc2hhcmVkIG1lbW9yeSBhY2Nlc3MgZGVsYXkuCisgKgorICogUmV0dXJuOgkwCU9rCisgKgkJPCAwCWVycm9yLgorICogQ29udGV4dDoJcHJvY2VzcworICovCitpbnQgX19pbml0IGN5Y3hfaW5pdCh2b2lkKQoreworCWludCBjbnQsIGVyciA9IC1FTk9NRU07CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyB2JXUuJXUgJXNcbiIsCisJCWN5Y3hfZnVsbG5hbWUsIENZQ1hfRFJWX1ZFUlNJT04sIENZQ1hfRFJWX1JFTEVBU0UsCisJCWN5Y3hfY29weXJpZ2h0KTsKKworCS8qIFZlcmlmeSBudW1iZXIgb2YgY2FyZHMgYW5kIGFsbG9jYXRlIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWN5Y3hfbmNhcmRzID0gbWluX3QoaW50LCBjeWN4X25jYXJkcywgQ1lDWF9NQVhfQ0FSRFMpOworCWN5Y3hfbmNhcmRzID0gbWF4X3QoaW50LCBjeWN4X25jYXJkcywgMSk7CisJY3ljeF9jYXJkX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN5Y3hfZGV2aWNlKSAqIGN5Y3hfbmNhcmRzLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjeWN4X2NhcmRfYXJyYXkpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KGN5Y3hfY2FyZF9hcnJheSwgMCwgc2l6ZW9mKHN0cnVjdCBjeWN4X2RldmljZSkgKiBjeWN4X25jYXJkcyk7CisKKwkvKiBSZWdpc3RlciBhZGFwdGVycyB3aXRoIFdBTiByb3V0ZXIgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IGN5Y3hfbmNhcmRzOyArK2NudCkgeworCQlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSAmY3ljeF9jYXJkX2FycmF5W2NudF07CisJCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJCXNwcmludGYoY2FyZC0+ZGV2bmFtZSwgIiVzJWQiLCBjeWN4X2Rydm5hbWUsIGNudCArIDEpOworCQl3YW5kZXYtPm1hZ2ljICAgID0gUk9VVEVSX01BR0lDOworCQl3YW5kZXYtPm5hbWUgICAgID0gY2FyZC0+ZGV2bmFtZTsKKwkJd2FuZGV2LT5wcml2YXRlICA9IGNhcmQ7CisJCXdhbmRldi0+c2V0dXAgICAgPSBjeWN4X3dhbl9zZXR1cDsKKwkJd2FuZGV2LT5zaHV0ZG93biA9IGN5Y3hfd2FuX3NodXRkb3duOworCQllcnIgPSByZWdpc3Rlcl93YW5fZGV2aWNlKHdhbmRldik7CisKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgcmVnaXN0cmF0aW9uIGZhaWxlZCB3aXRoICIKKwkJCQkJImVycm9yICVkIVxuIiwKKwkJCQkJY3ljeF9kcnZuYW1lLCBjYXJkLT5kZXZuYW1lLCBlcnIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwllcnIgPSAtRU5PREVWOworCWlmICghY250KSB7CisJCWtmcmVlKGN5Y3hfY2FyZF9hcnJheSk7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSAwOworCWN5Y3hfbmNhcmRzID0gY250OwkvKiBhZGp1c3QgYWN0dWFsIG51bWJlciBvZiBjYXJkcyAqLworb3V0OglyZXR1cm4gZXJyOworfQorCisvKgorICogTW9kdWxlICdyZW1vdmUnIGVudHJ5IHBvaW50LgorICogbyB1bnJlZ2lzdGVyIGFsbCBhZGFwdGVycyBmcm9tIHRoZSBXQU4gcm91dGVyCisgKiBvIHJlbGVhc2UgYWxsIHJlbWFpbmluZyBzeXN0ZW0gcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBjeWN4X2V4aXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKDsgaSA8IGN5Y3hfbmNhcmRzOyArK2kpIHsKKwkJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gJmN5Y3hfY2FyZF9hcnJheVtpXTsKKwkJdW5yZWdpc3Rlcl93YW5fZGV2aWNlKGNhcmQtPmRldm5hbWUpOworCX0KKworCWtmcmVlKGN5Y3hfY2FyZF9hcnJheSk7Cit9CisKKy8qIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqLworLyoKKyAqIFNldHVwL2NvbmZpZ3VyZSBXQU4gbGluayBkcml2ZXIuCisgKiBvIGNoZWNrIGFkYXB0ZXIgc3RhdGUKKyAqIG8gbWFrZSBzdXJlIGZpcm13YXJlIGlzIHByZXNlbnQgaW4gY29uZmlndXJhdGlvbgorICogbyBhbGxvY2F0ZSBpbnRlcnJ1cHQgdmVjdG9yCisgKiBvIHNldHVwIEN5Y2xvbSAyWCBoYXJkd2FyZQorICogbyBjYWxsIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcGVyZm9ybSBwcm90b2NvbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcm91dGVyIGhhbmRsZXMgUk9VVEVSX1NFVFVQIElPQ1RMLiBUaGUKKyAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGlzIGluIGtlcm5lbCBtZW1vcnkgKGluY2x1ZGluZyBleHRlbmRlZCBkYXRhLCBpZgorICogYW55KS4KKyAqLworc3RhdGljIGludCBjeWN4X3dhbl9zZXR1cChzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCB3YW5kZXZfY29uZl90ICpjb25mKQoreworCWludCByYyA9IC1FRkFVTFQ7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkOworCWludCBpcnE7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisKKwlpZiAoIXdhbmRldiB8fCAhd2FuZGV2LT5wcml2YXRlIHx8ICFjb25mKQorCQlnb3RvIG91dDsKKworCWNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJcmMgPSAtRUJVU1k7CisJaWYgKHdhbmRldi0+c3RhdGUgIT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKCFjb25mLT5kYXRhX3NpemUgfHwgIWNvbmYtPmRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmlybXdhcmUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24gIgorCQkJCSJkYXRhIVxuIiwgd2FuZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNvbmYtPmlycSA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGNvbmZpZ3VyZSB3aXRob3V0IElSUSFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgSVJRICovCisJaXJxID0gY29uZi0+aXJxID09IDIgPyA5IDogY29uZi0+aXJxOwkvKiBJUlEyIC0+IElSUTkgKi8KKworCWlmIChyZXF1ZXN0X2lycShpcnEsIGN5Y3hfaXNyLCAwLCB3YW5kZXYtPm5hbWUsIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IHJlc2VydmUgSVJRICVkIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGlycSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENvbmZpZ3VyZSBoYXJkd2FyZSwgbG9hZCBmaXJtd2FyZSwgZXRjLiAqLworCW1lbXNldCgmY2FyZC0+aHcsIDAsIHNpemVvZihjYXJkLT5odykpOworCWNhcmQtPmh3LmlycQkgPSBpcnE7CisJY2FyZC0+aHcuZHBtc2l6ZSA9IENZQ1hfV0lORE9XU0laRTsKKwljYXJkLT5ody5md2lkCSA9IENGSURfWDI1XzJYOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT53YWl0X3N0YXRzKTsKKworCXJjID0gY3ljeF9zZXR1cCgmY2FyZC0+aHcsIGNvbmYtPmRhdGEsIGNvbmYtPmRhdGFfc2l6ZSwgY29uZi0+bWFkZHIpOworCWlmIChyYykKKwkJZ290byBvdXRfaXJxOworCisJLyogSW5pdGlhbGl6ZSBXQU4gZGV2aWNlIGRhdGEgc3BhY2UgKi8KKwl3YW5kZXYtPmlycSAgICAgICA9IGlycTsKKwl3YW5kZXYtPmRtYSAgICAgICA9IHdhbmRldi0+aW9wb3J0ID0gMDsKKwl3YW5kZXYtPm1hZGRyICAgICA9ICh1bnNpZ25lZCBsb25nKWNhcmQtPmh3LmRwbWJhc2U7CisJd2FuZGV2LT5tc2l6ZSAgICAgPSBjYXJkLT5ody5kcG1zaXplOworCXdhbmRldi0+aHdfb3B0WzJdID0gMDsKKwl3YW5kZXYtPmh3X29wdFszXSA9IGNhcmQtPmh3LmZ3aWQ7CisKKwkvKiBQcm90b2NvbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworCXN3aXRjaCAoY2FyZC0+aHcuZndpZCkgeworI2lmZGVmIENPTkZJR19DWUNMT01YX1gyNQorCWNhc2UgQ0ZJRF9YMjVfMlg6CisJCXJjID0gY3ljeF94MjVfd2FuX2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdGhpcyBmaXJtd2FyZSBpcyBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUpOworCQlyYyA9IC1FSU5WQUw7CisJfQorCisJaWYgKHJjKSB7CisJCWN5Y3hfZG93bigmY2FyZC0+aHcpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK291dF9pcnE6CisJZnJlZV9pcnEoaXJxLCBjYXJkKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIFNodXQgZG93biBXQU4gbGluayBkcml2ZXIuCisgKiBvIHNodXQgZG93biBhZGFwdGVyIGhhcmR3YXJlCisgKiBvIHJlbGVhc2Ugc3lzdGVtIHJlc291cmNlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gZGV2aWNlIGlzIGJlaW5nIHVucmVnaXN0ZXJlZCBvcgorICogd2hlbiBpdCBoYW5kbGVzIFJPVVRFUl9ET1dOIElPQ1RMLgorICovCitzdGF0aWMgaW50IGN5Y3hfd2FuX3NodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpCit7CisJaW50IHJldCA9IC1FRkFVTFQ7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICghd2FuZGV2IHx8ICF3YW5kZXYtPnByaXZhdGUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKwlpZiAod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlnb3RvIG91dDsKKworCWNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJd2FuZGV2LT5zdGF0ZSA9IFdBTl9VTkNPTkZJR1VSRUQ7CisJY3ljeF9kb3duKCZjYXJkLT5odyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGlycSAlZCBiZWluZyBmcmVlZCFcbiIsIHdhbmRldi0+bmFtZSwKKwkJCXdhbmRldi0+aXJxKTsKKwlmcmVlX2lycSh3YW5kZXYtPmlycSwgY2FyZCk7CitvdXQ6CXJldHVybiByZXQ7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKy8qCisgKiBDeWNsb20gMlggSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4KKyAqIG8gYWNrbm93bGVkZ2UgQ3ljbG9tIDJYIGhhcmR3YXJlIGludGVycnVwdC4KKyAqIG8gY2FsbCBwcm90b2NvbC1zcGVjaWZpYyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLCBpZiBhbnkuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBjeWN4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IChzdHJ1Y3QgY3ljeF9kZXZpY2UgKilkZXZfaWQ7CisKKwlpZiAoIWNhcmQgfHwgY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCWdvdG8gb3V0OworCisJaWYgKGNhcmQtPmluX2lzcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW50ZXJydXB0IHJlLWVudHJhbmN5IG9uIElSUSAlZCFcbiIsCisJCQkJICAgIGNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5pcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY2FyZC0+aXNyKQorCQljYXJkLT5pc3IoY2FyZCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworb3V0OgorCXJldHVybiBJUlFfTk9ORTsKK30KKworLyogU2V0IFdBTiBkZXZpY2Ugc3RhdGUuICAqLwordm9pZCBjeWN4X3NldF9zdGF0ZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgKnN0cmluZ19zdGF0ZSA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBzdGF0ZSkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXN0cmluZ19zdGF0ZSA9ICJjb25uZWN0ZWQhIjsKKwkJCWJyZWFrOworCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQlzdHJpbmdfc3RhdGUgPSAiZGlzY29ubmVjdGVkISI7CisJCQlicmVhazsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayAlc1xuIiwgY2FyZC0+ZGV2bmFtZSwgc3RyaW5nX3N0YXRlKTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRlID0gc3RhdGU7CisJfQorCisJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCittb2R1bGVfaW5pdChjeWN4X2luaXQpOworbW9kdWxlX2V4aXQoY3ljeF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0OGNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCkBAIC0wLDAgKzEsMTYwOSBAQAorLyoKKyogY3ljeF94MjUuYwlDeWNsb20gMlggV0FOIExpbmsgRHJpdmVyLiAgWC4yNSBtb2R1bGUuCisqCisqIEF1dGhvcjoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KKyoKKyogQmFzZWQgb24gc2RsYV94MjUuYyBieSBHZW5lIEtvemluIDxnZW5la0Bjb21wdXNlcnZlLmNvbT4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogMjAwMS8wMS8xMglhY21lCQl1c2UgZGV2X2tmcmVlX3NrYl9pcnEgb24gaW50ZXJydXB0IGNvbnRleHQKKyogMjAwMC8wNC8wMglhY21lCQlkcHJpbnRrLCBjeWN4X2RlYnVnCisqIAkJCQlmaXhlZCB0aGUgYnVnIGludHJvZHVjZWQgaW4gZ2V0X2Rldl9ieV9sY24gYW5kCisqIAkJCQlnZXRfZGV2X2J5X2R0ZV9hZGRyIGJ5IHRoZSBhbm9ueW1vdXMgaGFja2VyCisqIAkJCQl0aGF0IGNvbnZlcnRlZCB0aGlzIGRyaXZlciB0byBzb2Z0bmV0CisqIDIwMDAvMDEvMDgJYWNtZQkJY2xlYW51cAorKiAxOTk5LzEwLzI3CWFjbWUJCXVzZSBBUlBIUkRfSFdYMjUgc28gdGhhdCB0aGUgWC4yNSBzdGFjayBrbm93CisqCQkJCXRoYXQgd2UgaGF2ZSBhIFguMjUgc3RhY2sgaW1wbGVtZW50ZWQgaW4KKyoJCQkJZmlybXdhcmUgb25ib2FyZAorKiAxOTk5LzEwLzE4CWFjbWUJCXN1cHBvcnQgZm9yIFguMjUgc29ja2V0cyBpbiBpZl9zZW5kLAorKgkJCQliZXdhcmU6IHNvY2tldChBRl9YMjUuLi4pIElTIFdPUksgSU4gUFJPR1JFU1MsCisqCQkJCVRDUC9JUCBvdmVyIFguMjUgdmlhIHdhbnJvdXRlciBub3QgYWZmZWN0ZWQsCisqCQkJCXdvcmtpbmcuCisqIDE5OTkvMTAvMDkJYWNtZQkJY2hhbl9kaXNjIHJlbmFtZWQgdG8gY2hhbl9kaXNjb25uZWN0LAorKiAJCQkJYmVnYW4gYWRkaW5nIHN1cHBvcnQgZm9yIFguMjUgc29ja2V0czoKKyogCQkJCWNvbmYtPnByb3RvY29sIGluIG5ld19pZgorKiAxOTk5LzEwLzA1CWFjbWUJCWZpeGVkIHJldHVybiBFLi4uIHRvIHJldHVybiAtRS4uLgorKiAxOTk5LzA4LzEwCWFjbWUJCXNlcmlhbGl6ZWQgYWNjZXNzIHRvIHRoZSBjYXJkIHRocnUgYSBzcGlubG9jaworKgkJCQlpbiB4MjVfZXhlYworKiAxOTk5LzA4LzA5CWFjbWUJCXJlbW92ZWQgcGVyIGNoYW5uZWwgc3BpbmxvY2tzCisqCQkJCXJlbW92ZWQgcmVmZXJlbmNlcyB0byBlbmFibGVfdHhfaW50CisqIDE5OTkvMDUvMjgJYWNtZQkJZml4ZWQgbmliYmxlX3RvX2J5dGUsIGFja3ZjIG5vdyBwcm9wZXJseSB0cmVhdGVkCisqCQkJCWlmX3NlbmQgc2ltcGxpZmllZAorKiAxOTk5LzA1LzI1CWFjbWUJCWZpeGVkIHQxLCB0MiwgdDIxICYgdDIzIGNvbmZpZ3VyYXRpb24KKyoJCQkJdXNlIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIGNsaS9zdGkgaW4gc29tZSBwb2ludHMKKyogMTk5OS8wNS8yNAlhY21lCQlmaW5pc2hlZCB0aGUgeDI1X2dldF9zdGF0IGZ1bmN0aW9uCisqIDE5OTkvMDUvMjMJYWNtZQkJZGV2LT50eXBlID0gQVJQSFJEX1gyNSAodGNwZHVtcCBvbmx5IHdvcmtzLAorKgkJCQlBRkFJVCwgd2l0aCBBUlBIUkRfRVRIRVIpLiBUaGlzIHNlZW1zIHRvIGJlCisqCQkJCW5lZWRlZCB0byB1c2Ugc29ja2V0KEFGX1gyNSkuLi4KKyoJCQkJTm93IHRoZSBjb25maWcgZmlsZSBtdXN0IHNwZWNpZnkgYSBwZWVyIG1lZGlhCisqCQkJCWFkZHJlc3MgZm9yIHN2YyBjaGFubmVscyBvdmVyIGEgY3Jvc3NvdmVyIGNhYmxlLgorKgkJCQlSZW1vdmVkIGhvbGRfdGltZW91dCBmcm9tIHgyNV9jaGFubmVsX3QsCisqCQkJCW5vdCB1c2VkLgorKgkJCQlBIGxpdHRsZSBlbmhhbmNlbWVudCBpbiB0aGUgREVCVUcgcHJvY2Vzc2luZworKiAxOTk5LzA1LzIyCWFjbWUJCWdvIHRvIERJU0NPTk5FQ1RFRCBpbiBkaXNjb25uZWN0X2NvbmZpcm1faW50ciwKKyoJCQkJaW5zdGVhZCBvZiBjaGFuX2Rpc2MuCisqIDE5OTkvMDUvMTYJbWFyY2VsbwkJZml4ZWQgdGltZXIgaW5pdGlhbGl6YXRpb24gaW4gU1ZDcworKiAxOTk5LzAxLzA1CWFjbWUJCXgyNV9jb25maWd1cmUgbm93IGdldCAobW9zdCBvZikgYWxsCisqCQkJCXBhcmFtZXRlcnMuLi4KKyogMTk5OS8wMS8wNQlhY21lCQlwa3RsZW4gbm93IChjb3JyZWN0bHkpIHVzZXMgbG9nMiAodmFsdWUKKyoJCQkJY29uZmlndXJlZCkKKyogMTk5OS8wMS8wMwlhY21lCQlqdWRpY2lvdXMgdXNlIG9mIGRhdGEgdHlwZXMgKHU4LCB1MTYsIHUzMiwgZXRjKQorKiAxOTk5LzAxLzAzCWFjbWUJCWN5eF9pc3I6IHJlc2V0IGRwbWJhc2UgdG8gYWNrbm93bGVkZ2UKKyoJCQkJaW5kaWNhdGlvbiAoaW50ZXJydXB0IGZyb20gY3ljbG9tIDJ4KQorKiAxOTk5LzAxLzAyCWFjbWUJCWN5eF9pc3I6IGZpcnN0IGhhY2tpbmdzLi4uCisqIDE5OTkvMDEvMDIwMyAgYWNtZSAJCXdoZW4gaW5pdGlhbGl6aW5nIGFuIGFycmF5IGRvbid0IGdpdmUgbGVzcworKgkJCQllbGVtZW50cyB0aGFuIGRlY2xhcmVkLi4uCisqIAkJCQlleGFtcGxlOiBjaGFyIHNlbmRfY21kWzZdID0gIj9ceEZGXHgxMCI7CisqICAgICAgICAgIAkJCXlvdSdsbCBnb25uYSBsb3NlIGEgY291cGxlIGhvdXJzLCAnY2F1c2UgeW91cgorKgkJCQlicmFpbiB3b24ndCBhZG1pdCB0aGF0IHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlCisqCQkJCWFib3ZlIGRlY2xhcmF0aW9uLi4uICB0aGUgc2lkZSBlZmZlY3QgaXMgdGhhdAorKgkJCQltZW1zZXQgaXMgcHV0IGludG8gdGhlIHVucmVzb2x2ZWQgc3ltYm9scworKgkJCQlpbnN0ZWFkIG9mIHVzaW5nIHRoZSBpbmxpbmUgbWVtc2V0IGZ1bmN0aW9ucy4uLgorKiAxOTk5LzAxLzAyICAgIGFjbWUgCQliZWdhbiBjaGFuX2Nvbm5lY3QsIGNoYW5fc2VuZCwgeDI1X3NlbmQKKyogMTk5OC8xMi8zMQlhY21lCQl4MjVfY29uZmlndXJlCisqCQkJCXRoaXMgY29kZSBjYW4gYmUgY29tcGlsZWQgYXMgbm9uIG1vZHVsZQorKiAxOTk4LzEyLzI3CWFjbWUJCWNvZGUgY2xlYW51cAorKgkJCQlJUFggY29kZSB3aXBlZCBvdXQhIGxldCdzIGRlY3JlYXNlIGNvZGUKKyoJCQkJY29tcGxleGl0eSBmb3Igbm93LCByZW1lbWJlcjogSSdtIGxlYXJuaW5nISA6KQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHNfdG9fc3BlZWRfY29kZSBPSworKiAxOTk4LzEyLzI2CWFjbWUJCU1pbmltYWwgZGVidWcgY29kZSBjbGVhbnVwCisqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgorKi8KKworI2RlZmluZSBDWUNMT01YX1gyNV9ERUJVRyAxCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gICAgICAgLyogQVJQSFJEX0hXWDI1ICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSwga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogaHRvbnMoKSwgZXRjLiAqLworCisjaW5jbHVkZSA8bGludXgvY3ljbG9teC5oPgkvKiBDeWNsb20gMlggY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvY3ljeF94MjUuaD4JLyogWC4yNSBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPG5ldC94MjVkZXZpY2UuaD4KKworLyogRGVmaW5lcyAmIE1hY3JvcyAqLworI2RlZmluZSBDWUNYX1gyNV9NQVhfQ01EX1JFVFJZIDUKKyNkZWZpbmUgQ1lDWF9YMjVfQ0hBTl9NVFUgMjA0OAkvKiB1bmZyYWdtZW50ZWQgbG9naWNhbCBjaGFubmVsIE1UVSAqLworCisvKiBEYXRhIFN0cnVjdHVyZXMgKi8KKy8qIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSAnc3RydWN0IG5ldF9kZXZpY2UnIHdlIGNyZWF0ZSBmb3IgZWFjaCBuZXR3b3JrCisgICBpbnRlcmZhY2UgdG8ga2VlcCB0aGUgcmVzdCBvZiBYLjI1IGNoYW5uZWwtc3BlY2lmaWMgZGF0YS4gKi8KK3N0cnVjdCBjeWN4X3gyNV9jaGFubmVsIHsKKwkvKiBUaGlzIG1lbWJlciBtdXN0IGJlIGZpcnN0LiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZTsJLyogV0FOIHNsYXZlICovCisKKwljaGFyIG5hbWVbV0FOX0lGTkFNRV9TWisxXTsJLyogaW50ZXJmYWNlIG5hbWUsIEFTQ0lJWiAqLworCWNoYXIgYWRkcltXQU5fQUREUkVTU19TWisxXTsJLyogbWVkaWEgYWRkcmVzcywgQVNDSUlaICovCisJY2hhciAqbG9jYWxfYWRkcjsJCS8qIGxvY2FsIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAtCisJCQkJCSAgIHN2YyB0aHJ1IGNyb3Nzb3ZlciBjYWJsZSAqLworCXMxNiBsY247CQkJLyogbG9naWNhbCBjaGFubmVsIG51bWJlci9jb25uLnJlcS5rZXkqLworCXU4IGxpbms7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIHRpbWVyIHVzZWQgZm9yIHN2YyBjaGFubmVsIGRpc2MuICovCisJdTE2IHByb3RvY29sOwkJCS8qIGV0aGVydHlwZSwgMCAtIG11bHRpcGxleGVkICovCisJdTggc3ZjOwkJCQkvKiAwIC0gcGVybWFuZW50LCAxIC0gc3dpdGNoZWQgKi8KKwl1OCBzdGF0ZTsJCQkvKiBjaGFubmVsIHN0YXRlICovCisJdTggZHJvcF9zZXF1ZW5jZTsJCS8qIG1hcmsgc2VxdWVuY2UgZm9yIGRyb3BwaW5nICovCisJdTMyIGlkbGVfdG1vdXQ7CQkJLyogc2VjLCBiZWZvcmUgZGlzY29ubmVjdGluZyAqLworCXN0cnVjdCBza19idWZmICpyeF9za2I7CQkvKiByZWNlaXZlIHNvY2tldCBidWZmZXIgKi8KKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQ7CS8qIC0+IG93bmVyICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgaWZzdGF0czsvKiBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworfTsKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IGN5Y3hfd2FuX3VwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KSwKKwkgICBjeWN4X3dhbl9uZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHdhbmlmX2NvbmZfdCAqY29uZiksCisJICAgY3ljeF93YW5fZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgY3ljeF9uZXRkZXZpY2VfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSwKKwkgICBjeWN4X25ldGRldmljZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpLAorCSAgIGN5Y3hfbmV0ZGV2aWNlX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgY3ljeF9uZXRkZXZpY2VfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLAorCQkJCSAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pLAorCSAgIGN5Y3hfbmV0ZGV2aWNlX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpLAorCSAgIGN5Y3hfbmV0ZGV2aWNlX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorCQkJY3ljeF9uZXRkZXZpY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9oYW5kbGVyKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCksCisJICAgIGN5Y3hfeDI1X2lycV90eChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9yeChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9sb2coc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJICAgICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfc3RhdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfY29ubmVjdF9jb25maXJtKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkJIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9kaXNjb25uZWN0X2NvbmZpcm0oc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCQkgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX2Nvbm5lY3Qoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfZGlzY29ubmVjdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9zcHVyaW91cyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpOworCisvKiBYLjI1IGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgY3ljeF94MjVfY29uZmlndXJlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgIHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpLAorCSAgIGN5Y3hfeDI1X2dldF9zdGF0cyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQpLAorCSAgIGN5Y3hfeDI1X3NlbmQoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCB1OCBsaW5rLCB1OCBsY24sIHU4IGJpdG0sCisJCQkgaW50IGxlbiwgdm9pZCAqYnVmKSwKKwkgICBjeWN4X3gyNV9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiksCisJICAgY3ljeF94MjVfZGlzY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHU4IGxpbmssCisJCQkgICAJCXU4IGxjbik7CisKKy8qIGNoYW5uZWwgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NoYW5fY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSwKKwkgICBjeWN4X3gyNV9jaGFuX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSwKKwkgICAgY3ljeF94MjVfY2hhbl9zZW5kX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGV2ZW50KTsKKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKSwKKwkgICAgY3ljeF94MjVfY2hhbl90aW1lcih1bnNpZ25lZCBsb25nIGQpOworCitzdGF0aWMgdm9pZCBuaWJibGVfdG9fYnl0ZSh1OCAqcywgdTggKmQsIHU4IGxlbiwgdTggbmliYmxlKSwKKwkgICAgcmVzZXRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB1OCBicHNfdG9fc3BlZWRfY29kZSh1MzIgYnBzKTsKK3N0YXRpYyB1OCBjeWN4X2xvZzIodTMyIG4pOworCitzdGF0aWMgdW5zaWduZWQgZGVjX3RvX3VpbnQodTggKnN0ciwgaW50IGxlbik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKKwkJCQkJCSAgczE2IGxjbik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgorCWN5Y3hfeDI1X2dldF9kZXZfYnlfZHRlX2FkZHIoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgY2hhciAqZHRlKTsKKworI2lmZGVmIENZQ0xPTVhfWDI1X0RFQlVHCitzdGF0aWMgdm9pZCBoZXhfZHVtcChjaGFyICptc2csIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZW4pOworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9jb25maWcoc3RydWN0IGN5Y3hfeDI1X2NvbmZpZyAqY29uZik7CitzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX3N0YXRzKHN0cnVjdCBjeWN4X3gyNV9zdGF0cyAqc3RhdHMpOworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9kZXZzKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpOworI2Vsc2UKKyNkZWZpbmUgaGV4X2R1bXAobXNnLCBwLCBsZW4pCisjZGVmaW5lIGN5Y3hfeDI1X2R1bXBfY29uZmlnKGNvbmYpCisjZGVmaW5lIGN5Y3hfeDI1X2R1bXBfc3RhdHMoc3RhdHMpCisjZGVmaW5lIGN5Y3hfeDI1X2R1bXBfZGV2cyh3YW5kZXYpCisjZW5kaWYKKy8qIFB1YmxpYyBGdW5jdGlvbnMgKi8KKworLyogWC4yNSBQcm90b2NvbCBJbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1haW4gQ3ljbG9tIDJYIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIFguMjUgZmlybXdhcmUgaXMgcnVubmluZy4KKyAqICBvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgYWRhcHRlciBkYXRhIHNwYWNlLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUuICAqLworaW50IGN5Y3hfeDI1X3dhbl9pbml0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY29uZmlnIGNmZzsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfWDI1KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gSUQgJXUhXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyAqLworCWNhcmQtPm1ib3ggID0gY2FyZC0+aHcuZHBtYmFzZSArIFgyNV9NQk9YX09GRlM7CisJY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnUueC5sb2NrKTsKKworCS8qIENvbmZpZ3VyZSBhZGFwdGVyLiBIZXJlIHdlIHNldCByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIHBhcnNlCisJICogZGV2aWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCSAqIE1vc3QgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB2ZXJpZmllZCBhbmQgY29ycmVjdGVkIChpZgorCSAqIG5lY2Vzc2FyeSkgc2luY2Ugd2UgY2FuJ3QgcmVseSBvbiB0aGUgYWRhcHRlciB0byBkbyBzbyBhbmQgZG9uJ3QKKwkgKiB3YW50IGl0IHRvIGZhaWwgZWl0aGVyLiAqLworCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7CisJY2ZnLmxpbmsgPSAwOworCWNmZy5jbG9jayA9IGNvbmYtPmNsb2NraW5nID09IFdBTk9QVF9FWFRFUk5BTCA/IDggOiA1NTsKKwljZmcuc3BlZWQgPSBicHNfdG9fc3BlZWRfY29kZShjb25mLT5icHMpOworCWNmZy5uM3dpbiA9IDc7CisJY2ZnLm4yd2luID0gMjsKKwljZmcubjIgPSA1OworCWNmZy5udmMgPSAxOworCWNmZy5ucHZjID0gMTsKKwljZmcuZmxhZ3MgPSAweDAyOyAvKiBkZWZhdWx0ID0gVjM1ICovCisJY2ZnLnQxID0gMTA7ICAgLyogbGluZSBjYXJyaWVyIHRpbWVvdXQgKi8KKwljZmcudDIgPSAyOTsgICAvKiB0eCB0aW1lb3V0ICovCisJY2ZnLnQyMSA9IDE4MDsgLyogQ0FMTCB0aW1lb3V0ICovCisJY2ZnLnQyMyA9IDE4MDsgLyogQ0xFQVIgdGltZW91dCAqLworCisJLyogYWRqdXN0IE1UVSAqLworCWlmICghY29uZi0+bXR1IHx8IGNvbmYtPm10dSA+PSA1MTIpCisJCWNhcmQtPndhbmRldi5tdHUgPSA1MTI7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDI1NikKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDI1NjsKKwllbHNlIGlmIChjb25mLT5tdHUgPj0gMTI4KQorCQljYXJkLT53YW5kZXYubXR1ID0gMTI4OworCWVsc2UKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDY0OworCisJY2ZnLnBrdGxlbiA9IGN5Y3hfbG9nMihjYXJkLT53YW5kZXYubXR1KTsKKworCWlmIChjb25mLT5zdGF0aW9uID09IFdBTk9QVF9EVEUpIHsKKwkJY2ZnLmxvY2FkZHIgPSAzOyAvKiBEVEUgKi8KKwkJY2ZnLnJlbWFkZHIgPSAxOyAvKiBEQ0UgKi8KKwl9IGVsc2UgeworCQljZmcubG9jYWRkciA9IDE7IC8qIERDRSAqLworCQljZmcucmVtYWRkciA9IDM7IC8qIERURSAqLworCX0KKworCWlmIChjb25mLT5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKQorCSAgICAgICAgY2ZnLmZsYWdzID0gMDsgICAgICAvKiBGSVhNRSBqdXN0IHJlc2V0IHRoZSAybmQgYml0ICovCisKKwlpZiAoY29uZi0+dS54MjUuaGlfcHZjKSB7CisJCWNhcmQtPnUueC5oaV9wdmMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmhpX3B2YywgNDA5NSk7CisJCWNhcmQtPnUueC5sb19wdmMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmxvX3B2YywgY2FyZC0+dS54LmhpX3B2Yyk7CisJfQorCisJaWYgKGNvbmYtPnUueDI1LmhpX3N2YykgeworCQljYXJkLT51LnguaGlfc3ZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9zdmMsIDQwOTUpOworCQljYXJkLT51LngubG9fc3ZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5sb19zdmMsIGNhcmQtPnUueC5oaV9zdmMpOworCX0KKworCWlmIChjYXJkLT51LngubG9fcHZjID09IDI1NSkKKwkJY2ZnLm5wdmMgPSAwOworCWVsc2UKKwkJY2ZnLm5wdmMgPSBjYXJkLT51LnguaGlfcHZjIC0gY2FyZC0+dS54LmxvX3B2YyArIDE7CisKKwljZmcubnZjID0gY2FyZC0+dS54LmhpX3N2YyAtIGNhcmQtPnUueC5sb19zdmMgKyAxICsgY2ZnLm5wdmM7CisKKwlpZiAoY29uZi0+dS54MjUuaGRsY193aW5kb3cpCisJCWNmZy5uMndpbiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUuaGRsY193aW5kb3csIDcpOworCisJaWYgKGNvbmYtPnUueDI1LnBrdF93aW5kb3cpCisJCWNmZy5uM3dpbiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucGt0X3dpbmRvdywgNyk7CisKKwlpZiAoY29uZi0+dS54MjUudDEpCisJCWNmZy50MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MikKKwkJY2ZnLnQyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MiwgMzApOworCisJaWYgKGNvbmYtPnUueDI1LnQxMV90MjEpCisJCWNmZy50MjEgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxMV90MjEsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MTNfdDIzKQorCQljZmcudDIzID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTNfdDIzLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUubjIpCisJCWNmZy5uMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubjIsIDMwKTsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCWlmIChjeWN4X3gyNV9jb25maWd1cmUoY2FyZCwgJmNmZykpCisJCXJldHVybiAtRUlPOworCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgYWRhcHRlciBkYXRhIHNwYWNlICovCisJY2FyZC0+d2FuZGV2LmJwcwk9IGNvbmYtPmJwczsKKwljYXJkLT53YW5kZXYuaW50ZXJmYWNlCT0gY29uZi0+aW50ZXJmYWNlOworCWNhcmQtPndhbmRldi5jbG9ja2luZwk9IGNvbmYtPmNsb2NraW5nOworCWNhcmQtPndhbmRldi5zdGF0aW9uCT0gY29uZi0+c3RhdGlvbjsKKwljYXJkLT5pc3IJCT0gY3ljeF94MjVfaXJxX2hhbmRsZXI7CisJY2FyZC0+ZXhlYwkJPSBOVUxMOworCWNhcmQtPndhbmRldi51cGRhdGUJPSBjeWN4X3dhbl91cGRhdGU7CisJY2FyZC0+d2FuZGV2Lm5ld19pZgk9IGN5Y3hfd2FuX25ld19pZjsKKwljYXJkLT53YW5kZXYuZGVsX2lmCT0gY3ljeF93YW5fZGVsX2lmOworCWNhcmQtPndhbmRldi5zdGF0ZQk9IFdBTl9ESVNDT05ORUNURUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogV0FOIERldmljZSBEcml2ZXIgRW50cnkgUG9pbnRzICovCisvKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MuICovCitzdGF0aWMgaW50IGN5Y3hfd2FuX3VwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIXdhbmRldiB8fCAhd2FuZGV2LT5wcml2YXRlKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCisJY3ljeF94MjVfZ2V0X3N0YXRzKHdhbmRldi0+cHJpdmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIG5ldyBsb2dpY2FsIGNoYW5uZWwuCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSByb3V0ZXIgd2hlbiBST1VURVJfSUZORVcgSU9DVEwgaXMgYmVpbmcKKyAqIGhhbmRsZWQuCisgKiBvIHBhcnNlIG1lZGlhLSBhbmQgaGFyZHdhcmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogbyBtYWtlIHN1cmUgdGhhdCBhIG5ldyBjaGFubmVsIGNhbiBiZSBjcmVhdGVkCisgKiBvIGFsbG9jYXRlIHJlc291cmNlcywgaWYgbmVjZXNzYXJ5CisgKiBvIHByZXBhcmUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIGZvciByZWdpc3RyYXRpb24uCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZSAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKSAqLworc3RhdGljIGludCBjeWN4X3dhbl9uZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHdhbmlmX2NvbmZfdCAqY29uZikKK3sKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWNvbmYtPm5hbWVbMF0gfHwgc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBpbnRlcmZhY2UgbmFtZSFcbiIsCisJCSAgICAgICBjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJY2hhbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeWN4X3gyNV9jaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGFuLCAwLCBzaXplb2YoKmNoYW4pKTsKKwlzdHJjcHkoY2hhbi0+bmFtZSwgY29uZi0+bmFtZSk7CisJY2hhbi0+Y2FyZCA9IGNhcmQ7CisJY2hhbi0+bGluayA9IGNvbmYtPnBvcnQ7CisJY2hhbi0+cHJvdG9jb2wgPSBjb25mLT5wcm90b2NvbCA/IEVUSF9QX1gyNSA6IEVUSF9QX0lQOworCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisJLyogb25seSB1c2VkIGluIHN2YyBjb25uZWN0ZWQgdGhydSBjcm9zc292ZXIgY2FibGUgKi8KKwljaGFuLT5sb2NhbF9hZGRyID0gTlVMTDsKKworCWlmIChjb25mLT5hZGRyWzBdID09ICdAJykgewkvKiBTVkMgKi8KKwkJaW50IGxlbiA9IHN0cmxlbihjb25mLT5sb2NhbF9hZGRyKTsKKworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gV0FOX0FERFJFU1NfU1opIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBsb2NhbCBhZGRyIHRvbyBsb25nIVxuIiwKKwkJCQkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCQkJa2ZyZWUoY2hhbik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCWNoYW4tPmxvY2FsX2FkZHIgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCisJCQkJaWYgKCFjaGFuLT5sb2NhbF9hZGRyKSB7CisJCQkJCWtmcmVlKGNoYW4pOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQl9CisKKwkJCXN0cm5jcHkoY2hhbi0+bG9jYWxfYWRkciwgY29uZi0+bG9jYWxfYWRkciwKKwkJCQlXQU5fQUREUkVTU19TWik7CisJCX0KKworCQljaGFuLT5zdmMgPSAxOworCQlzdHJuY3B5KGNoYW4tPmFkZHIsICZjb25mLT5hZGRyWzFdLCBXQU5fQUREUkVTU19TWik7CisJCWluaXRfdGltZXIoJmNoYW4tPnRpbWVyKTsKKwkJY2hhbi0+dGltZXIuZnVuY3Rpb24JPSBjeWN4X3gyNV9jaGFuX3RpbWVyOworCQljaGFuLT50aW1lci5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpZGV2OworCisJCS8qIFNldCBjaGFubmVsIHRpbWVvdXRzIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQpICovCisJCWNoYW4tPmlkbGVfdG1vdXQgPSBjb25mLT5pZGxlX3RpbWVvdXQgPyBjb25mLT5pZGxlX3RpbWVvdXQgOiA5MDsKKwl9IGVsc2UgaWYgKGlzX2RpZ2l0KGNvbmYtPmFkZHJbMF0pKSB7CS8qIFBWQyAqLworCQlzMTYgbGNuID0gZGVjX3RvX3VpbnQoY29uZi0+YWRkciwgMCk7CisKKwkJaWYgKGxjbiA+PSBjYXJkLT51LngubG9fcHZjICYmIGxjbiA8PSBjYXJkLT51LnguaGlfcHZjKQorCQkJY2hhbi0+bGNuID0gbGNuOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogUFZDICV1IGlzIG91dCBvZiByYW5nZSBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJCXdhbmRldi0+bmFtZSwgbGNuLCBjaGFuLT5uYW1lKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIG1lZGlhIGFkZHJlc3Mgb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmIChlcnIpIHsKKwkJaWYgKGNoYW4tPmxvY2FsX2FkZHIpCisJCQlrZnJlZShjaGFuLT5sb2NhbF9hZGRyKTsKKworCQlrZnJlZShjaGFuKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIGRhdGEgc3BhY2UgZm9yIHJlZ2lzdHJhdGlvbiAqLworCXN0cmNweShkZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCWRldi0+aW5pdCA9IGN5Y3hfbmV0ZGV2aWNlX2luaXQ7CisJZGV2LT5wcml2ID0gY2hhbjsKKworCXJldHVybiAwOworfQorCisvKiBEZWxldGUgbG9naWNhbCBjaGFubmVsLiAqLworc3RhdGljIGludCBjeWN4X3dhbl9kZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5wcml2KSB7CisJCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJCWlmIChjaGFuLT5zdmMpIHsKKwkJCWlmIChjaGFuLT5sb2NhbF9hZGRyKQorCQkJCWtmcmVlKGNoYW4tPmxvY2FsX2FkZHIpOworCisJCQlpZiAoY2hhbi0+c3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCkKKwkJCQlkZWxfdGltZXIoJmNoYW4tPnRpbWVyKTsKKwkJfQorCisJCWtmcmVlKGNoYW4pOworCQlkZXYtPnByaXYgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKi8KKy8qIEluaXRpYWxpemUgTGludXggbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggaW50ZXJmYWNlLCBkdXJpbmcgTGludXggbmV0d29yaworICogaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbi4gIFJldHVybmluZyBhbnl0aGluZyBidXQgemVybyB3aWxsIGZhaWwgaW50ZXJmYWNlCisgKiByZWdpc3RyYXRpb24uICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSBjeWN4X25ldGRldmljZV9vcGVuOworCWRldi0+c3RvcAkJPSBjeWN4X25ldGRldmljZV9zdG9wOworCWRldi0+aGFyZF9oZWFkZXIJPSBjeWN4X25ldGRldmljZV9oYXJkX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gY3ljeF9uZXRkZXZpY2VfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBjeWN4X25ldGRldmljZV9oYXJkX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gY3ljeF9uZXRkZXZpY2VfZ2V0X3N0YXRzOworCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT5tdHUJCT0gQ1lDWF9YMjVfQ0hBTl9NVFU7CisJZGV2LT50eXBlCQk9IEFSUEhSRF9IV1gyNTsJLyogQVJQIGgvdyB0eXBlICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOwkJLyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCWRldi0+YWRkcl9sZW4JCT0gMDsJCS8qIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisKKwlpZiAoIWNoYW4tPnN2YykKKwkJKih1MTYqKWRldi0+ZGV2X2FkZHIgPSBodG9ucyhjaGFuLT5sY24pOworCisJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSBwYXJhbWV0ZXJzIChqdXN0IGZvciByZWZlcmVuY2UpICovCisJZGV2LT5pcnEJCT0gd2FuZGV2LT5pcnE7CisJZGV2LT5kbWEJCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJCT0gd2FuZGV2LT5pb3BvcnQ7CisJZGV2LT5tZW1fc3RhcnQJCT0gKHVuc2lnbmVkIGxvbmcpd2FuZGV2LT5tYWRkcjsKKwlkZXYtPm1lbV9lbmQJCT0gKHVuc2lnbmVkIGxvbmcpKHdhbmRldi0+bWFkZHIgKworCQkJCQkJICB3YW5kZXYtPm1zaXplIC0gMSk7CisJZGV2LT5mbGFncwkJfD0gSUZGX05PQVJQOworCisJLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIEluaXRpYWxpemUgc29ja2V0IGJ1ZmZlcnMgKi8KKwljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqIG8gaWYgbGluayBpcyBkaXNjb25uZWN0ZWQgdGhlbiBpbml0aWF0ZSBjb25uZWN0aW9uCisgKgorICogUmV0dXJuIDAgaWYgTy5rLiBvciBlcnJuby4gICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOyAvKiBvbmx5IG9uZSBvcGVuIGlzIGFsbG93ZWQgKi8KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyByZXNldCBmbGFncy4KKyAqIG8gaWYgdGhlcmUncyBubyBtb3JlIG9wZW4gY2hhbm5lbHMgdGhlbiBkaXNjb25uZWN0IHBoeXNpY2FsIGxpbmsuICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEIHx8IGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNUSU5HKQorCQljeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3QoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBCdWlsZCBtZWRpYSBoZWFkZXIuCisgKiBvIGVuY2Fwc3VsYXRlIHBhY2tldCBhY2NvcmRpbmcgdG8gZW5jYXBzdWxhdGlvbiB0eXBlLgorICoKKyAqIFRoZSB0cmljayBoZXJlIGlzIHRvIHB1dCBwYWNrZXQgdHlwZSAoRXRoZXJ0eXBlKSBpbnRvICdwcm90b2NvbCcgZmllbGQgb2YKKyAqIHRoZSBzb2NrZXQgYnVmZmVyLCBzbyB0aGF0IHdlIGRvbid0IGZvcmdldCBpdC4gIElmIGVuY2Fwc3VsYXRpb24gZmFpbHMsCisgKiBzZXQgc2tiLT5wcm90b2NvbCB0byAwIGFuZCBkaXNjYXJkIHBhY2tldCBsYXRlci4KKyAqCisgKiBSZXR1cm46CW1lZGlhIGhlYWRlciBsZW5ndGguICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHR5cGUsCisJCQkJICAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc2tiLT5wcm90b2NvbCA9IHR5cGU7CisKKwlyZXR1cm4gZGV2LT5oYXJkX2hlYWRlcl9sZW47Cit9CisKKy8qICogUmUtYnVpbGQgbWVkaWEgaGVhZGVyLgorICogUmV0dXJuOgkxCXBoeXNpY2FsIGFkZHJlc3MgcmVzb2x2ZWQuCisgKgkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZCAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCisvKiBTZW5kIGEgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIHNldCBidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGNoZWNrIGNoYW5uZWwgc3RhdHVzLiBJZiBpdCdzIGRvd24gdGhlbiBpbml0aWF0ZSBhIGNhbGwuCisgKiBvIHBhc3MgYSBwYWNrZXQgdG8gY29ycmVzcG9uZGluZyBXQU4gZGV2aWNlLgorICogbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiBOb3RlczoKKyAqIDEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAyLiBTZXR0aW5nIHRidXN5IGZsYWcgd2lsbCBpbmhpYml0IGZ1cnRoZXIgdHJhbnNtaXQgcmVxdWVzdHMgZnJvbSB0aGUKKyAqICAgIHByb3RvY29sIHN0YWNrIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmICghY2hhbi0+c3ZjKQorCQljaGFuLT5wcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpCisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCWVsc2UgaWYgKGNoYW4tPnN2YyAmJiBjaGFuLT5wcm90b2NvbCAmJgorCQkgY2hhbi0+cHJvdG9jb2wgIT0gc2tiLT5wcm90b2NvbCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHVuc3VwcG9ydGVkIEV0aGVydHlwZSAweCUwNFggb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJICAgICAgIGNhcmQtPmRldm5hbWUsIHNrYi0+cHJvdG9jb2wsIGRldi0+bmFtZSk7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9lcnJvcnM7CisJfSBlbHNlIGlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkgeworCQlzd2l0Y2ggKGNoYW4tPnN0YXRlKSB7CisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCWlmIChjeWN4X3gyNV9jaGFuX2Nvbm5lY3QoZGV2KSkgeworCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJLyogZmFsbCB0aHJ1ICovCisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXJlc2V0X3RpbWVyKGRldik7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJaWYgKGN5Y3hfeDI1X2NoYW5fc2VuZChkZXYsIHNrYikpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJfQorCX0gZWxzZSB7IC8qIGNoYW4tPnByb3RvY29sID09IEVUSF9QX1gyNSAqLworCQlzd2l0Y2ggKHNrYi0+ZGF0YVswXSkgeworCQljYXNlIDA6IGJyZWFrOworCQljYXNlIDE6IC8qIENvbm5lY3QgcmVxdWVzdCAqLworCQkJY3ljeF94MjVfY2hhbl9jb25uZWN0KGRldik7CisJCQlnb3RvIGZyZWVfcGFja2V0OworCQljYXNlIDI6IC8qIERpc2Nvbm5lY3QgcmVxdWVzdCAqLworCQkJY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KGRldik7CisJCQlnb3RvIGZyZWVfcGFja2V0OworCSAgICAgICAgZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHVua25vd24gJWQgeDI1LWlmYWNlIHJlcXVlc3Qgb24gJXMhXG4iLAorCQkJICAgICAgIGNhcmQtPmRldm5hbWUsIHNrYi0+ZGF0YVswXSwgZGV2LT5uYW1lKTsKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9lcnJvcnM7CisJCQlnb3RvIGZyZWVfcGFja2V0OworCQl9CisKKwkJc2tiX3B1bGwoc2tiLCAxKTsgLyogUmVtb3ZlIGNvbnRyb2wgYnl0ZSAqLworCQlyZXNldF90aW1lcihkZXYpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCWlmIChjeWN4X3gyNV9jaGFuX3NlbmQoZGV2LCBza2IpKSB7CisJCQkvKiBwcmVwYXJlIGZvciBmdXR1cmUgcmV0cmFuc21pc3Npb25zICovCisJCQlza2JfcHVzaChza2IsIDEpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworZnJlZV9wYWNrZXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCBFdGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY3ljeF9uZXRkZXZpY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gY2hhbiA/ICZjaGFuLT5pZnN0YXRzIDogTlVMTDsKK30KKworLyogSW50ZXJydXB0IEhhbmRsZXJzICovCisvKiBYLjI1IEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfaGFuZGxlcihzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NtZCBjbWQ7CisJdTE2IHogPSAwOworCisJY2FyZC0+aW5faXNyID0gMTsKKwljYXJkLT5idWZmX2ludF9tb2RlX3VuYnVzeSA9IDA7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgWDI1X1JYTUJPWF9PRkZTLCAmY21kLCBzaXplb2YoY21kKSk7CisKKwlzd2l0Y2ggKGNtZC5jb21tYW5kKSB7CisJY2FzZSBYMjVfREFUQV9JTkRJQ0FUSU9OOgorCQljeWN4X3gyNV9pcnFfcngoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X0FDS19GUk9NX1ZDOgorCQljeWN4X3gyNV9pcnFfdHgoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X0xPRzoKKwkJY3ljeF94MjVfaXJxX2xvZyhjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfU1RBVElTVElDOgorCQljeWN4X3gyNV9pcnFfc3RhdChjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfQ09OTkVDVF9DT05GSVJNOgorCQljeWN4X3gyNV9pcnFfY29ubmVjdF9jb25maXJtKGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9DT05ORUNUX0lORElDQVRJT046CisJCWN5Y3hfeDI1X2lycV9jb25uZWN0KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWN5Y3hfeDI1X2lycV9kaXNjb25uZWN0KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9ESVNDT05ORUNUX0NPTkZJUk06CisJCWN5Y3hfeDI1X2lycV9kaXNjb25uZWN0X2NvbmZpcm0oY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X0xJTkVfT046CisJCWN5Y3hfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQlicmVhazsKKwljYXNlIFgyNV9MSU5FX09GRjoKKwkJY3ljeF9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN5Y3hfeDI1X2lycV9zcHVyaW91cyhjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJfQorCisJY3ljeF9wb2tlKCZjYXJkLT5odywgMCwgJnosIHNpemVvZih6KSk7CisJY3ljeF9wb2tlKCZjYXJkLT5odywgWDI1X1JYTUJPWF9PRkZTLCAmeiwgc2l6ZW9mKHopKTsKKwljYXJkLT5pbl9pc3IgPSAwOworfQorCisvKiBUcmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCW8gUmVsZWFzZSBzb2NrZXQgYnVmZmVyCisgKglvIENsZWFyICd0YnVzeScgZmxhZyAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX3R4KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJdTggbGNuOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKworCS8qIHVuYnVzeSBkZXZpY2UgYW5kIHRoZW4gZGV2X3RpbnQoKTsgKi8KKwlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CisJaWYgKGRldikgeworCQljYXJkLT5idWZmX2ludF9tb2RlX3VuYnVzeSA9IDE7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICIlczphY2t2YyBmb3IgaW5leGlzdGVudCBsY24gJWRcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsIGxjbik7Cit9CisKKy8qIFJlY2VpdmUgaW50ZXJydXB0IGhhbmRsZXIuCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBmcmFnbWVudGVkIElQIHBhY2tldHMgdXNpbmcgTS1iaXQgYWNjb3JkaW5nIHRvIHRoZQorICogUkZDMTM1Ni4KKyAqIG8gbWFwIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgdG8gbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGFsbG9jYXRlIHNvY2tldCBidWZmZXIgb3IgYXBwZW5kIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgZXhpc3Rpbmcgb25lLgorICogbyBpZiBNLWJpdCBpcyByZXNldCAoaS5lLiBpdCdzIHRoZSBsYXN0IHBhY2tldCBpbiBhIHNlcXVlbmNlKSB0aGVuCisgKiAgIGRlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBzb2NrZXQgYnVmZmVyIHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKyAqCisgKiBOb3RlczoKKyAqIDEuIFdoZW4gYWxsb2NhdGluZyBhIHNvY2tldCBidWZmZXIsIGlmIE0tYml0IGlzIHNldCB0aGVuIG1vcmUgZGF0YSBpcworICogICAgY29taW5nIGFuZCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG1heGltdW0gSVAgcGFja2V0IHNpemUKKyAqICAgIGV4cGVjdGVkIG9uIHRoaXMgY2hhbm5lbC4KKyAqIDIuIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGFuZCBYLjI1IHBhY2tldCBoYXMgdG8gYmUgZHJvcHBlZCAoZS5nLiBubworICogICAgc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlKSB0aGUgd2hvbGUgcGFja2V0IHNlcXVlbmNlIG11c3QgYmUgZGlzY2FyZGVkLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX3J4KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBiaXRtLCBsY247CisJaW50IHBrdGxlbiA9IGNtZC0+bGVuIC0gNTsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyA0LCAmYml0bSwgc2l6ZW9mKGJpdG0pKTsKKwliaXRtICY9IDB4MTA7CisKKwlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CisJaWYgKCFkZXYpIHsKKwkJLyogSW52YWxpZCBjaGFubmVsLCBkaXNjYXJkIHBhY2tldCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2aW5nIG9uIG9ycGhhbmVkIExDTiAlZCFcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsIGxjbik7CisJCXJldHVybjsKKwl9CisKKwljaGFuID0gZGV2LT5wcml2OworCXJlc2V0X3RpbWVyKGRldik7CisKKwlpZiAoY2hhbi0+ZHJvcF9zZXF1ZW5jZSkgeworCQlpZiAoIWJpdG0pCisJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMDsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKworCWlmICgoc2tiID0gY2hhbi0+cnhfc2tiKSA9PSBOVUxMKSB7CisJCS8qIEFsbG9jYXRlIG5ldyBzb2NrZXQgYnVmZmVyICovCisJCWludCBidWZzaXplID0gYml0bSA/IGRldi0+bXR1IDogcGt0bGVuOworCisJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfWDI1ID8gMSA6IDApICsKKwkJCQkJIGJ1ZnNpemUgKworCQkJCQkgZGV2LT5oYXJkX2hlYWRlcl9sZW4pKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCQkJIGNhcmQtPmRldm5hbWUpOworCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDE7CisJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUpIC8qIFguMjUgc29ja2V0IGxheWVyIGNvbnRyb2wgKi8KKwkJCS8qIDAgPSBkYXRhIHBhY2tldCAoZGV2X2FsbG9jX3NrYiB6ZXJvZWQgc2tiLT5kYXRhKSAqLworCQkJc2tiX3B1dChza2IsIDEpOworCisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2ItPnByb3RvY29sID0gaHRvbnMoY2hhbi0+cHJvdG9jb2wpOworCQljaGFuLT5yeF9za2IgPSBza2I7CisJfQorCisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgcGt0bGVuKSB7CisJCS8qIE5vIHJvb20gZm9yIHRoZSBwYWNrZXQuIENhbGwgb2ZmIHRoZSB3aG9sZSB0aGluZyEgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJY2hhbi0+cnhfc2tiID0gTlVMTDsKKworCQlpZiAoYml0bSkKKwkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmV4cGVjdGVkbHkgbG9uZyBwYWNrZXQgc2VxdWVuY2UgIgorCQkJIm9uIGludGVyZmFjZSAlcyFcbiIsIGNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJCSsrY2hhbi0+aWZzdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCQlyZXR1cm47CisJfQorCisJLyogQXBwZW5kIHBhY2tldCB0byB0aGUgc29ja2V0IGJ1ZmZlciAgKi8KKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDUsIHNrYl9wdXQoc2tiLCBwa3RsZW4pLCBwa3RsZW4pOworCisJaWYgKGJpdG0pCisJCXJldHVybjsgLyogbW9yZSBkYXRhIGlzIGNvbWluZyAqLworCisJY2hhbi0+cnhfc2tiID0gTlVMTDsJCS8qIGRlcXVldWUgcGFja2V0ICovCisKKwkrK2NoYW4tPmlmc3RhdHMucnhfcGFja2V0czsKKwljaGFuLT5pZnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CQkvKiB0aW1lc3RhbXAgKi8KK30KKworLyogQ29ubmVjdCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9jb25uZWN0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuOworCXU4IGRbMzJdLAorCSAgIGxvY1syNF0sCisJICAgcmVtWzI0XTsKKwl1OCBsY24sIHNpemVsb2MsIHNpemVyZW07CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNSwgJnNpemVsb2MsIHNpemVvZihzaXplbG9jKSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyA2LCBkLCBjbWQtPmxlbiAtIDYpOworCisJc2l6ZXJlbSA9IHNpemVsb2MgPj4gNDsKKwlzaXplbG9jICY9IDB4MEY7CisKKwlsb2NbMF0gPSByZW1bMF0gPSAnXDAnOworCisJaWYgKHNpemVsb2MpCisJCW5pYmJsZV90b19ieXRlKGQsIGxvYywgc2l6ZWxvYywgMCk7CisKKwlpZiAoc2l6ZXJlbSkKKwkJbmliYmxlX3RvX2J5dGUoZCArIChzaXplbG9jID4+IDEpLCByZW0sIHNpemVyZW0sIHNpemVsb2MgJiAxKTsKKworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczpsY249JWQsIGxvY2FsPSVzLCByZW1vdGU9JXNcbiIsCisJCQkgIF9fRlVOQ1RJT05fXywgbGNuLCBsb2MsIHJlbSk7CisKKwlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHdhbmRldiwgcmVtKTsKKwlpZiAoIWRldikgeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb25uZWN0IG5vdCBleHBlY3RlZDogcmVtb3RlICVzIVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwgcmVtKTsKKwkJcmV0dXJuOworCX0KKworCWNoYW4gPSBkZXYtPnByaXY7CisJY2hhbi0+bGNuID0gbGNuOworCWN5Y3hfeDI1X2Nvbm5lY3RfcmVzcG9uc2UoY2FyZCwgY2hhbik7CisJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKK30KKworLyogQ29ubmVjdCBjb25maXJtIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJCSBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpCit7CisJc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbjsKKwl1OCBsY24sIGtleTsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAxLCAma2V5LCBzaXplb2Yoa2V5KSk7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiAlczpsY249JWQsIGtleT0lZFxuIiwKKwkJCSAgY2FyZC0+ZGV2bmFtZSwgX19GVU5DVElPTl9fLCBsY24sIGtleSk7CisKKwlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIC1rZXkpOworCWlmICghZGV2KSB7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJY2xlYXJfYml0KC0ta2V5LCAodm9pZCopJmNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29ubmVjdCBjb25maXJtIG5vdCBleHBlY3RlZDogbGNuICVkLCAiCisJCQkJICJrZXk9JWQhXG4iLCBjYXJkLT5kZXZuYW1lLCBsY24sIGtleSk7CisJCXJldHVybjsKKwl9CisKKwljbGVhcl9iaXQoLS1rZXksICh2b2lkKikmY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJY2hhbiA9IGRldi0+cHJpdjsKKwljaGFuLT5sY24gPSBsY247CisJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKK30KKworLyogRGlzY29ubmVjdCBjb25maXJtIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX2Rpc2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJCSAgICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpCit7CisJc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1OCBsY247CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogJXM6bGNuPSVkXG4iLAorCQkJICBjYXJkLT5kZXZuYW1lLCBfX0ZVTkNUSU9OX18sIGxjbik7CisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmICghZGV2KSB7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ZGlzY29ubmVjdCBjb25maXJtIG5vdCBleHBlY3RlZCE6bGNuICVkXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworCQlyZXR1cm47CisJfQorCisJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKK30KKworLyogZGlzY29ubmVjdCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9kaXNjb25uZWN0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggbGNuOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6bGNuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxjbik7CisKKwlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CisJaWYgKGRldikgeworCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQljeWN4X3gyNV9kaXNjb25uZWN0X3Jlc3BvbnNlKGNhcmQsIGNoYW4tPmxpbmssIGxjbik7CisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJfSBlbHNlCisJCWN5Y3hfeDI1X2Rpc2Nvbm5lY3RfcmVzcG9uc2UoY2FyZCwgMCwgbGNuKTsKK30KKworLyogTE9HIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX2xvZyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKyNpZiBDWUNMT01YX1gyNV9ERUJVRworCWNoYXIgYmZbMjBdOworCXUxNiBzaXplLCB0b3JlYWQsIGxpbmssIG1zZ19jb2RlOworCXU4IGNvZGUsIHJvdXRpbmU7CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJm1zZ19jb2RlLCBzaXplb2YobXNnX2NvZGUpKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDIsICZsaW5rLCBzaXplb2YobGluaykpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNCwgJnNpemUsIHNpemVvZihzaXplKSk7CisJLyogYXQgbW9zdCAyMCBieXRlcyBhcmUgYXZhaWxhYmxlLi4uIHRoYW5rcyB0byBEYW5pZWxhIDopICovCisJdG9yZWFkID0gc2l6ZSA8IDIwID8gc2l6ZSA6IDIwOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMTAsICZiZiwgdG9yZWFkKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDEwICsgdG9yZWFkLCAmY29kZSwgMSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAxMCArIHRvcmVhZCArIDEsICZyb3V0aW5lLCAxKTsKKworCXByaW50ayhLRVJOX0lORk8gImN5Y3hfeDI1X2lycV9oYW5kbGVyOiBYMjVfTE9HICgweDQ1MDApIGluZGljLjpcbiIpOworCXByaW50ayhLRVJOX0lORk8gImNtZC0+YnVmPTB4JVhcbiIsIGNtZC0+YnVmKTsKKwlwcmludGsoS0VSTl9JTkZPICJMb2cgbWVzc2FnZSBjb2RlPTB4JVhcbiIsIG1zZ19jb2RlKTsKKwlwcmludGsoS0VSTl9JTkZPICJMaW5rPSVkXG4iLCBsaW5rKTsKKwlwcmludGsoS0VSTl9JTkZPICJsb2cgY29kZT0weCVYXG4iLCBjb2RlKTsKKwlwcmludGsoS0VSTl9JTkZPICJsb2cgcm91dGluZT0weCVYXG4iLCByb3V0aW5lKTsKKwlwcmludGsoS0VSTl9JTkZPICJNZXNzYWdlIHNpemU9JWRcbiIsIHNpemUpOworCWhleF9kdW1wKCJNZXNzYWdlIiwgYmYsIHRvcmVhZCk7CisjZW5kaWYKK30KKworLyogU1RBVElTVElDIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX3N0YXQoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJICAgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmY2FyZC0+dS54LnN0YXRzLAorCQkgIHNpemVvZihjYXJkLT51Lnguc3RhdHMpKTsKKwloZXhfZHVtcCgiY3ljeF94MjVfaXJxX3N0YXQiLCAodW5zaWduZWQgY2hhciopJmNhcmQtPnUueC5zdGF0cywKKwkJIHNpemVvZihjYXJkLT51Lnguc3RhdHMpKTsKKwljeWN4X3gyNV9kdW1wX3N0YXRzKCZjYXJkLT51Lnguc3RhdHMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+d2FpdF9zdGF0cyk7Cit9CisKKy8qIFNwdXJpb3VzIGludGVycnVwdCBoYW5kbGVyLgorICogbyBwcmludCBhIHdhcm5pbmcKKyAqIElmIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzIGV4Y2VlZGVkIHNvbWUgbGltaXQsIHRoZW4gPz8/ICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfc3B1cmlvdXMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgKDB4JVgpIVxuIiwKKwkJCSBjYXJkLT5kZXZuYW1lLCBjbWQtPmNvbW1hbmQpOworfQorI2lmZGVmIENZQ0xPTVhfWDI1X0RFQlVHCitzdGF0aWMgdm9pZCBoZXhfZHVtcChjaGFyICptc2csIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciBoZXhbMTAyNF0sCisJICAgIAkqIHBoZXggPSBoZXg7CisKKwlpZiAobGVuID49IChzaXplb2YoaGV4KSAvIDIpKQorCQlsZW4gPSAoc2l6ZW9mKGhleCkgLyAyKSAtIDE7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJc3ByaW50ZihwaGV4LCAiJTAyeCIsICpwKyspOworCQlwaGV4ICs9IDI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLCBtc2csIGhleCk7Cit9CisjZW5kaWYKKworLyogQ3ljbG9tIDJYIEZpcm13YXJlLVNwZWNpZmljIEZ1bmN0aW9ucyAqLworLyogRXhlYyBYLjI1IGNvbW1hbmQuICovCitzdGF0aWMgaW50IHgyNV9leGVjKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgaW50IGNvbW1hbmQsIGludCBsaW5rLAorCQkgICAgdm9pZCAqZDEsIGludCBsZW4xLCB2b2lkICpkMiwgaW50IGxlbjIpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NtZCBjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGFkZHIgPSAweDEyMDAgKyAweDJFMCAqIGxpbmsgKyAweDFFMjsKKwl1OCByZXRyeSA9IENZQ1hfWDI1X01BWF9DTURfUkVUUlk7CisJaW50IGVyciA9IDA7CisKKwljLmNvbW1hbmQgPSBjb21tYW5kOworCWMubGluayA9IGxpbms7CisJYy5sZW4gPSBsZW4xICsgbGVuMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT51LngubG9jaywgZmxhZ3MpOworCisJLyogd3JpdGUgY29tbWFuZCAqLworCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIFgyNV9NQk9YX09GRlMsICZjLCBzaXplb2YoYykgLSBzaXplb2YoYy5idWYpKTsKKworCS8qIHdyaXRlIFguMjUgZGF0YSAqLworCWlmIChkMSkgeworCQljeWN4X3Bva2UoJmNhcmQtPmh3LCBhZGRyLCBkMSwgbGVuMSk7CisKKwkJaWYgKGQyKSB7CisJCQlpZiAobGVuMiA+IDI1NCkgeworCQkJCXUzMiBhZGRyMSA9IDB4QTAwICsgMHg0MDAgKiBsaW5rOworCisJCQkJY3ljeF9wb2tlKCZjYXJkLT5odywgYWRkciArIGxlbjEsIGQyLCAyNDkpOworCQkJCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIGFkZHIxLCAoKHU4KilkMikgKyAyNDksCisJCQkJCSAgbGVuMiAtIDI0OSk7CisJCQl9IGVsc2UKKwkJCQljeWN4X3Bva2UoJmNhcmQtPmh3LCBhZGRyICsgbGVuMSwgZDIsIGxlbjIpOworCQl9CisJfQorCisJLyogZ2VuZXJhdGUgaW50ZXJydXB0aW9uLCBleGVjdXRpbmcgY29tbWFuZCAqLworCWN5Y3hfaW50cigmY2FyZC0+aHcpOworCisJLyogd2FpdCB0aWxsIGNhcmQtPm1ib3ggPT0gMCAqLworCWRvIHsKKwkJZXJyID0gY3ljeF9leGVjKGNhcmQtPm1ib3gpOworCX0gd2hpbGUgKHJldHJ5LS0gJiYgZXJyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnUueC5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBDb25maWd1cmUgYWRhcHRlci4gKi8KK3N0YXRpYyBpbnQgY3ljeF94MjVfY29uZmlndXJlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgIHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpCit7CisJc3RydWN0IHsKKwkJdTE2IG5saW5rczsKKwkJc3RydWN0IGN5Y3hfeDI1X2NvbmZpZyBjb25mWzJdOworCX0geDI1X2NtZF9jb25mOworCisJbWVtc2V0KCZ4MjVfY21kX2NvbmYsIDAsIHNpemVvZih4MjVfY21kX2NvbmYpKTsKKwl4MjVfY21kX2NvbmYubmxpbmtzID0gMjsKKwl4MjVfY21kX2NvbmYuY29uZlswXSA9ICpjb25mOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkgaW4gdGhlIHdhbnJvdXRlciBmcmFtZXdvcmsKKwkJICB0byBjb25maWd1cmUgdGhlIHNlY29uZCBsaW5rLCBmb3Igbm93IGxldHMgdXNlIGl0CisJCSAgd2l0aCB0aGUgc2FtZSBjb25maWcgZnJvbSB0aGUgZmlyc3QgbGluaywgZml4aW5nCisJCSAgdGhlIGludGVyZmFjZSB0eXBlIHRvIFJTMjMyLCB0aGUgc3BlZWQgaW4gMzg0MDAgYW5kCisJCSAgdGhlIGNsb2NrIHRvIGV4dGVybmFsICovCisJeDI1X2NtZF9jb25mLmNvbmZbMV0gPSAqY29uZjsKKwl4MjVfY21kX2NvbmYuY29uZlsxXS5saW5rID0gMTsKKwl4MjVfY21kX2NvbmYuY29uZlsxXS5zcGVlZCA9IDU7IC8qIDM4NDAwICovCisJeDI1X2NtZF9jb25mLmNvbmZbMV0uY2xvY2sgPSA4OworCXgyNV9jbWRfY29uZi5jb25mWzFdLmZsYWdzID0gMDsgLyogZGVmYXVsdCA9IFJTMjMyICovCisKKwljeWN4X3gyNV9kdW1wX2NvbmZpZygmeDI1X2NtZF9jb25mLmNvbmZbMF0pOworCWN5Y3hfeDI1X2R1bXBfY29uZmlnKCZ4MjVfY21kX2NvbmYuY29uZlsxXSk7CisKKwlyZXR1cm4geDI1X2V4ZWMoY2FyZCwgWDI1X0NPTkZJRywgMCwKKwkJCSZ4MjVfY21kX2NvbmYsIHNpemVvZih4MjVfY21kX2NvbmYpLCBOVUxMLCAwKTsKK30KKworLyogR2V0IHByb3RvY29sIHN0YXRpc3RpY3MuICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2dldF9zdGF0cyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQpCit7CisJLyogdGhlIGZpcm13YXJlIGV4cGVjdHMgMjAgaW4gdGhlIHNpemUgZmllbGQhISEKKwkgICB0aGFua3MgdG8gRGFuaWVsYSAqLworCWludCBlcnIgPSB4MjVfZXhlYyhjYXJkLCBYMjVfU1RBVElTVElDLCAwLCBOVUxMLCAyMCwgTlVMTCwgMCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+d2FpdF9zdGF0cyk7CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfcGFja2V0cyA9IGNhcmQtPnUueC5zdGF0cy5uMl9yeF9mcmFtZXM7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnJ4X292ZXJfZXJyb3JzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnJ4X2NyY19lcnJvcnM7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAwOyAvKiBub3QgYXZhaWxhYmxlIGZyb20gZncgKi8KKwljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBjYXJkLT51Lnguc3RhdHMucnhfYWJvcnRzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Vycm9ycyA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzID0gY2FyZC0+dS54LnN0YXRzLm4yX3R4X2ZyYW1lczsKKwljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBjYXJkLT51Lnguc3RhdHMudHhfYWJvcnRzOworCWNhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLmNvbGxpc2lvbnMgPSAwOyAvKiBub3QgYXZhaWxhYmxlIGZyb20gZncgKi8KKwljYXJkLT53YW5kZXYuc3RhdHMudHhfZXJyb3JzID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisKKwljeWN4X3gyNV9kdW1wX2RldnMoJmNhcmQtPndhbmRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgbmliYmxlcyAqLworc3RhdGljIGludCBieXRlX3RvX25pYmJsZSh1OCAqcywgdTggKmQsIGNoYXIgKm5pYmJsZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoKm5pYmJsZSAmJiAqcykgeworCQlkW2ldIHw9ICpzKysgLSAnMCc7CisJCSpuaWJibGUgPSAwOworCQkrK2k7CisJfQorCisJd2hpbGUgKCpzKSB7CisJCWRbaV0gPSAoKnMgLSAnMCcpIDw8IDQ7CisJCWlmICgqKHMgKyAxKSkKKwkJCWRbaV0gfD0gKihzICsgMSkgLSAnMCc7CisJCWVsc2UgeworCQkJKm5pYmJsZSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkrK2k7CisJCXMgKz0gMjsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgbmliYmxlX3RvX2J5dGUodTggKnMsIHU4ICpkLCB1OCBsZW4sIHU4IG5pYmJsZSkKK3sKKwlpZiAobmliYmxlKSB7CisJCSpkKysgPSAnMCcgKyAoKnMrKyAmIDB4MEYpOworCQktLWxlbjsKKwl9CisKKwl3aGlsZSAobGVuKSB7CisJCSpkKysgPSAnMCcgKyAoKnMgPj4gNCk7CisKKwkJaWYgKC0tbGVuKSB7CisJCQkqZCsrID0gJzAnICsgKCpzICYgMHgwRik7CisJCQktLWxlbjsKKwkJfSBlbHNlIGJyZWFrOworCisJCSsrczsKKwl9CisKKwkqZCA9ICdcMCc7Cit9CisKKy8qIFBsYWNlIFguMjUgY2FsbC4gKi8KK3N0YXRpYyBpbnQgeDI1X3BsYWNlX2NhbGwoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJICBzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgZXJyID0gMCwKKwkgICAgbGVuOworCWNoYXIgZFs2NF0sCisJICAgICBuaWJibGUgPSAwLAorCSAgICAgbXlsZW4gPSBjaGFuLT5sb2NhbF9hZGRyID8gc3RybGVuKGNoYW4tPmxvY2FsX2FkZHIpIDogMCwKKwkgICAgIHJlbW90ZWxlbiA9IHN0cmxlbihjaGFuLT5hZGRyKTsKKwl1OCBrZXk7CisKKwlpZiAoY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyA9PSB+MFUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRvbyBtYW55IHNpbXVsdGFuZW91cyBjb25uZWN0aW9uICIKKwkJCQkgInJlcXVlc3RzIVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWtleSA9IGZmeihjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKKwlzZXRfYml0KGtleSwgKHZvaWQqKSZjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKKwkrK2tleTsKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6eDI1X3BsYWNlX2NhbGw6a2V5PSVkXG4iLCBjYXJkLT5kZXZuYW1lLCBrZXkpOworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMV0gPSBrZXk7IC8qIHVzZXIga2V5ICovCisJZFsyXSA9IDB4MTA7CisJZFs0XSA9IDB4MEI7CisKKwlsZW4gPSBieXRlX3RvX25pYmJsZShjaGFuLT5hZGRyLCBkICsgNiwgJm5pYmJsZSk7CisKKwlpZiAoY2hhbi0+bG9jYWxfYWRkcikKKwkJbGVuICs9IGJ5dGVfdG9fbmliYmxlKGNoYW4tPmxvY2FsX2FkZHIsIGQgKyA2ICsgbGVuLCAmbmliYmxlKTsKKworCWlmIChuaWJibGUpCisJCSsrbGVuOworCisJZFs1XSA9IG15bGVuIDw8IDQgfCByZW1vdGVsZW47CisJZFs2ICsgbGVuICsgMV0gPSAweENDOyAvKiBUQ1AvSVAgb3ZlciBYLjI1LCB0aGFua3MgdG8gRGFuaWVsYSA6KSAqLworCisJaWYgKChlcnIgPSB4MjVfZXhlYyhjYXJkLCBYMjVfQ09OTkVDVF9SRVFVRVNULCBjaGFuLT5saW5rLAorCQkJICAgICZkLCA3ICsgbGVuICsgMSwgTlVMTCwgMCkpICE9IDApCisJCWNsZWFyX2JpdCgtLWtleSwgKHZvaWQqKSZjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKKwllbHNlCisJCWNoYW4tPmxjbiA9IC1rZXk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBQbGFjZSBYLjI1IENPTk5FQ1QgUkVTUE9OU0UuICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgICAgc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4pCit7CisJdTggZFs4XTsKKworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMF0gPSBkWzNdID0gY2hhbi0+bGNuOworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDBGOworCWRbN10gPSAweENDOyAvKiBUQ1AvSVAgb3ZlciBYLjI1LCB0aGFua3MgRGFuaWVsYSAqLworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9DT05ORUNUX1JFU1BPTlNFLCBjaGFuLT5saW5rLCAmZCwgOCwgTlVMTCwgMCk7Cit9CisKKy8qIFBsYWNlIFguMjUgRElTQ09OTkVDVCBSRVNQT05TRS4gICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2Rpc2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCB1OCBsaW5rLAorCQkJCQl1OCBsY24pCit7CisJY2hhciBkWzVdOworCisJbWVtc2V0KGQsIDAsIHNpemVvZihkKSk7CisJZFswXSA9IGRbM10gPSBsY247CisJZFsyXSA9IDB4MTA7CisJZFs0XSA9IDB4MTc7CisKKwlyZXR1cm4geDI1X2V4ZWMoY2FyZCwgWDI1X0RJU0NPTk5FQ1RfUkVTUE9OU0UsIGxpbmssICZkLCA1LCBOVUxMLCAwKTsKK30KKworLyogQ2xlYXIgWC4yNSBjYWxsLiAgKi8KK3N0YXRpYyBpbnQgeDI1X2NsZWFyX2NhbGwoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCB1OCBsaW5rLCB1OCBsY24sIHU4IGNhdXNlLAorCQkJICB1OCBkaWFnbikKK3sKKwl1OCBkWzddOworCisJbWVtc2V0KGQsIDAsIHNpemVvZihkKSk7CisJZFswXSA9IGRbM10gPSBsY247CisJZFsyXSA9IDB4MTA7CisJZFs0XSA9IDB4MTM7CisJZFs1XSA9IGNhdXNlOworCWRbNl0gPSBkaWFnbjsKKworCXJldHVybiB4MjVfZXhlYyhjYXJkLCBYMjVfRElTQ09OTkVDVF9SRVFVRVNULCBsaW5rLCBkLCA3LCBOVUxMLCAwKTsKK30KKworLyogU2VuZCBYLjI1IGRhdGEgcGFja2V0LiAqLworc3RhdGljIGludCBjeWN4X3gyNV9zZW5kKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywgdTggbGNuLCB1OCBiaXRtLAorCQkJIGludCBsZW4sIHZvaWQgKmJ1ZikKK3sKKwl1OCBkW10gPSAiP1x4RkZceDEwPz8iOworCisJZFswXSA9IGRbM10gPSBsY247CisJZFs0XSA9IGJpdG07CisKKwlyZXR1cm4geDI1X2V4ZWMoY2FyZCwgWDI1X0RBVEFfUkVRVUVTVCwgbGluaywgJmQsIDUsIGJ1ZiwgbGVuKTsKK30KKworLyogTWlzY2VsbGFuZW91cyAqLworLyogRmluZCBuZXR3b3JrIGRldmljZSBieSBpdHMgY2hhbm5lbCBudW1iZXIuICAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LAorCQkJCQkJICBzMTYgbGNuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3YW5kZXYtPmRldjsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbjsKKworCXdoaWxlIChkZXYpIHsKKwkJY2hhbiA9IChzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCopZGV2LT5wcml2OworCisJCWlmIChjaGFuLT5sY24gPT0gbGNuKQorCQkJYnJlYWs7CisJCWRldiA9IGNoYW4tPnNsYXZlOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiBGaW5kIG5ldHdvcmsgZGV2aWNlIGJ5IGl0cyByZW1vdGUgZHRlIGFkZHJlc3MuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgorCWN5Y3hfeDI1X2dldF9kZXZfYnlfZHRlX2FkZHIoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgY2hhciAqZHRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3YW5kZXYtPmRldjsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbjsKKworCXdoaWxlIChkZXYpIHsKKwkJY2hhbiA9IChzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCopZGV2LT5wcml2OworCisJCWlmICghc3RyY21wKGNoYW4tPmFkZHIsIGR0ZSkpCisJCQlicmVhazsKKwkJZGV2ID0gY2hhbi0+c2xhdmU7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qIEluaXRpYXRlIGNvbm5lY3Rpb24gb24gdGhlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqIG8gZm9yIFBWQyB3ZSBqdXN0IGdldCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAqIG8gZm9yIFNWQ3MgcGxhY2UgYW4gWC4yNSBjYWxsCisgKgorICogUmV0dXJuOgkwCWNvbm5lY3RlZAorICoJCT4wCWNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MKKyAqCQk8MAlmYWlsdXJlICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NoYW5fY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoY2hhbi0+c3ZjKSB7CisJCWlmICghY2hhbi0+YWRkclswXSkKKwkJCXJldHVybiAtRUlOVkFMOyAvKiBubyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisKKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBwbGFjaW5nIFguMjUgY2FsbCB0byAlcy4uLlxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUsIGNoYW4tPmFkZHIpOworCisJCWlmICh4MjVfcGxhY2VfY2FsbChjYXJkLCBjaGFuKSkKKwkJCXJldHVybiAtRUlPOworCisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RJTkcpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKworCXJldHVybiAwOworfQorCisvKiBEaXNjb25uZWN0IGxvZ2ljYWwgY2hhbm5lbC4KKyAqIG8gaWYgU1ZDIHRoZW4gY2xlYXIgWC4yNSBjYWxsICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5zdmMpIHsKKwkJeDI1X2NsZWFyX2NhbGwoY2hhbi0+Y2FyZCwgY2hhbi0+bGluaywgY2hhbi0+bGNuLCAwLCAwKTsKKwkJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVElORyk7CisJfSBlbHNlCisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7Cit9CisKKy8qIENhbGxlZCBieSBrZXJuZWwgdGltZXIgKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2NoYW5fdGltZXIodW5zaWduZWQgbG9uZyBkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkOworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJaWYgKGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNURUQpCisJCWN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChkZXYpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZm9yIHN2YyAoJXMpIG5vdCBjb25uZWN0ZWQhXG4iLAorCQkJCWNoYW4tPmNhcmQtPmRldm5hbWUsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lKTsKK30KKworLyogU2V0IGxvZ2ljYWwgY2hhbm5lbCBzdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpzdHJpbmdfc3RhdGUgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChjaGFuLT5zdGF0ZSAhPSBzdGF0ZSkgeworCQlpZiAoY2hhbi0+c3ZjICYmIGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNURUQpCisJCQlkZWxfdGltZXIoJmNoYW4tPnRpbWVyKTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXN0cmluZ19zdGF0ZSA9ICJjb25uZWN0ZWQhIjsKKwkJCSoodTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoY2hhbi0+bGNuKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJlc2V0X3RpbWVyKGRldik7CisKKwkJCWlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUpCisJCQkJY3ljeF94MjVfY2hhbl9zZW5kX2V2ZW50KGRldiwgMSk7CisKKwkJCWJyZWFrOworCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJc3RyaW5nX3N0YXRlID0gImNvbm5lY3RpbmcuLi4iOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RJTkc6CisJCQlzdHJpbmdfc3RhdGUgPSAiZGlzY29ubmVjdGluZy4uLiI7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJc3RyaW5nX3N0YXRlID0gImRpc2Nvbm5lY3RlZCEiOworCisJCQlpZiAoY2hhbi0+c3ZjKSB7CisJCQkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IDA7CisJCQkJY2hhbi0+bGNuID0gMDsKKwkJCX0KKworCQkJaWYgKGNoYW4tPnByb3RvY29sID09IEVUSF9QX1gyNSkKKwkJCQljeWN4X3gyNV9jaGFuX3NlbmRfZXZlbnQoZGV2LCAyKTsKKworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJYnJlYWs7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJmYWNlICVzICVzXG4iLCBjYXJkLT5kZXZuYW1lLAorCQkJCSAgZGV2LT5uYW1lLCBzdHJpbmdfc3RhdGUpOworCQljaGFuLT5zdGF0ZSA9IHN0YXRlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogU2VuZCBwYWNrZXQgb24gYSBsb2dpY2FsIGNoYW5uZWwuCisgKglXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0eF9za2IgZmllbGQgb2YgdGhlIGNoYW5uZWwgZGF0YSBzcGFjZQorICoJcG9pbnRzIHRvIHRoZSB0cmFuc21pdCBzb2NrZXQgYnVmZmVyLiAgV2hlbiB0cmFuc21pc3Npb24gaXMgY29tcGxldGUsCisgKglyZWxlYXNlIHNvY2tldCBidWZmZXIgYW5kIHJlc2V0ICd0YnVzeScgZmxhZy4KKyAqCisgKiBSZXR1cm46CTAJLSB0cmFuc21pc3Npb24gY29tcGxldGUKKyAqCQkxCS0gYnVzeQorICoKKyAqIE5vdGVzOgorICogMS4gSWYgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gTVRVIGZvciB0aGlzIGNoYW5uZWwsIHdlJ2xsIGZyYWdtZW50CisgKiAgICB0aGUgcGFja2V0IGludG8gJ2NvbXBsZXRlIHNlcXVlbmNlJyB1c2luZyBNLWJpdC4KKyAqIDIuIFdoZW4gdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlLCBhbiBldmVudCBub3RpZmljYXRpb24gc2hvdWxkIGJlIGlzc3VlZAorICogICAgdG8gdGhlIHJvdXRlci4gICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NoYW5fc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJaW50IGJpdG0gPSAwOwkJLyogZmluYWwgcGFja2V0ICovCisJdW5zaWduZWQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoc2tiLT5sZW4gPiBjYXJkLT53YW5kZXYubXR1KSB7CisJCWxlbiA9IGNhcmQtPndhbmRldi5tdHU7CisJCWJpdG0gPSAweDEwOwkJLyogc2V0IE0tYml0IChtb3JlIGRhdGEpICovCisJfQorCisJaWYgKGN5Y3hfeDI1X3NlbmQoY2FyZCwgY2hhbi0+bGluaywgY2hhbi0+bGNuLCBiaXRtLCBsZW4sIHNrYi0+ZGF0YSkpCisJCXJldHVybiAxOworCisJaWYgKGJpdG0pIHsKKwkJc2tiX3B1bGwoc2tiLCBsZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKwkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKworCXJldHVybiAwOworfQorCisvKiBTZW5kIGV2ZW50IChjb25uZWN0aW9uLCBkaXNjb25uZWN0aW9uLCBldGMpIHRvIFguMjUgc29ja2V0IGxheWVyICovCisKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2NoYW5fc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gZXZlbnQ7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsJCS8qIHRpbWVzdGFtcCAqLworfQorCisvKiBDb252ZXJ0IGxpbmUgc3BlZWQgaW4gYnBzIHRvIGEgbnVtYmVyIHVzZWQgYnkgY3ljbG9tIDJ4IGNvZGUuICovCitzdGF0aWMgdTggYnBzX3RvX3NwZWVkX2NvZGUodTMyIGJwcykKK3sKKwl1OCBudW1iZXIgPSAwOyAvKiBkZWZhdWx0cyB0byB0aGUgbG93ZXN0ICgxMjAwKSBzcGVlZCA7PiAqLworCisJICAgICBpZiAoYnBzID49IDUxMjAwMCkgbnVtYmVyID0gODsKKwllbHNlIGlmIChicHMgPj0gMjU2MDAwKSBudW1iZXIgPSA3OworCWVsc2UgaWYgKGJwcyA+PSA2NDAwMCkgIG51bWJlciA9IDY7CisJZWxzZSBpZiAoYnBzID49IDM4NDAwKSAgbnVtYmVyID0gNTsKKwllbHNlIGlmIChicHMgPj0gMTkyMDApICBudW1iZXIgPSA0OworCWVsc2UgaWYgKGJwcyA+PSA5NjAwKSAgIG51bWJlciA9IDM7CisJZWxzZSBpZiAoYnBzID49IDQ4MDApICAgbnVtYmVyID0gMjsKKwllbHNlIGlmIChicHMgPj0gMjQwMCkgICBudW1iZXIgPSAxOworCisJcmV0dXJuIG51bWJlcjsKK30KKworLyogbG9nIGJhc2UgMiAqLworc3RhdGljIHU4IGN5Y3hfbG9nMih1MzIgbikKK3sKKwl1OCBsb2cgPSAwOworCisJaWYgKCFuKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChuID4gMSkgeworCQluID4+PSAxOworCQkrK2xvZzsKKwl9CisKKwlyZXR1cm4gbG9nOworfQorCisvKiBDb252ZXJ0IGRlY2ltYWwgc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiBJZiBsZW4gIT0gMCB0aGVuIG9ubHkgJ2xlbicgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGFyZSBjb252ZXJ0ZWQuICovCitzdGF0aWMgdW5zaWduZWQgZGVjX3RvX3VpbnQodTggKnN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWwgPSAwOworCisJaWYgKCFsZW4pCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICg7IGxlbiAmJiBpc19kaWdpdCgqc3RyKTsgKytzdHIsIC0tbGVuKQorCQl2YWwgPSAodmFsICogMTApICsgKCpzdHIgLSAodW5zaWduZWQpICcwJyk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCByZXNldF90aW1lcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJaWYgKGNoYW4tPnN2YykKKwkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcytjaGFuLT5pZGxlX3Rtb3V0KkhaKTsKK30KKyNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9jb25maWcoc3RydWN0IGN5Y3hfeDI1X2NvbmZpZyAqY29uZikKK3sKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJsaW5rIG51bWJlcj0lZFxuIiwgY29uZi0+bGluayk7CisJcHJpbnRrKEtFUk5fSU5GTyAibGluZSBzcGVlZD0lZFxuIiwgY29uZi0+c3BlZWQpOworCXByaW50ayhLRVJOX0lORk8gImNsb2NrPSVzdGVybmFsXG4iLCBjb25mLT5jbG9jayA9PSA4ID8gIkV4IiA6ICJJbiIpOworCXByaW50ayhLRVJOX0lORk8gIiMgbGV2ZWwgMiByZXRyYW5zbS49JWRcbiIsIGNvbmYtPm4yKTsKKwlwcmludGsoS0VSTl9JTkZPICJsZXZlbCAyIHdpbmRvdz0lZFxuIiwgY29uZi0+bjJ3aW4pOworCXByaW50ayhLRVJOX0lORk8gImxldmVsIDMgd2luZG93PSVkXG4iLCBjb25mLT5uM3dpbik7CisJcHJpbnRrKEtFUk5fSU5GTyAiIyBsb2dpY2FsIGNoYW5uZWxzPSVkXG4iLCBjb25mLT5udmMpOworCXByaW50ayhLRVJOX0lORk8gImxldmVsIDMgcGt0IGxlbj0lZFxuIiwgY29uZi0+cGt0bGVuKTsKKwlwcmludGsoS0VSTl9JTkZPICJteSBhZGRyZXNzPSVkXG4iLCBjb25mLT5sb2NhZGRyKTsKKwlwcmludGsoS0VSTl9JTkZPICJyZW1vdGUgYWRkcmVzcz0lZFxuIiwgY29uZi0+cmVtYWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAidDE9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDEpOworCXByaW50ayhLRVJOX0lORk8gInQyPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQyKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0MjE9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDIxKTsKKwlwcmludGsoS0VSTl9JTkZPICIjIFBWQ3M9JWRcbiIsIGNvbmYtPm5wdmMpOworCXByaW50ayhLRVJOX0lORk8gInQyMz0lZCBzZWNvbmRzXG4iLCBjb25mLT50MjMpOworCXByaW50ayhLRVJOX0lORk8gImZsYWdzPTB4JXhcbiIsIGNvbmYtPmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9zdGF0cyhzdHJ1Y3QgY3ljeF94MjVfc3RhdHMgKnN0YXRzKQoreworCXByaW50ayhLRVJOX0lORk8gIlguMjUgc3RhdGlzdGljc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ayhLRVJOX0lORk8gInJ4X2NyY19lcnJvcnM9JWRcbiIsIHN0YXRzLT5yeF9jcmNfZXJyb3JzKTsKKwlwcmludGsoS0VSTl9JTkZPICJyeF9vdmVyX2Vycm9ycz0lZFxuIiwgc3RhdHMtPnJ4X292ZXJfZXJyb3JzKTsKKwlwcmludGsoS0VSTl9JTkZPICJuMl90eF9mcmFtZXM9JWRcbiIsIHN0YXRzLT5uMl90eF9mcmFtZXMpOworCXByaW50ayhLRVJOX0lORk8gIm4yX3J4X2ZyYW1lcz0lZFxuIiwgc3RhdHMtPm4yX3J4X2ZyYW1lcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAidHhfdGltZW91dHM9JWRcbiIsIHN0YXRzLT50eF90aW1lb3V0cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnhfdGltZW91dHM9JWRcbiIsIHN0YXRzLT5yeF90aW1lb3V0cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAibjNfdHhfcGFja2V0cz0lZFxuIiwgc3RhdHMtPm4zX3R4X3BhY2tldHMpOworCXByaW50ayhLRVJOX0lORk8gIm4zX3J4X3BhY2tldHM9JWRcbiIsIHN0YXRzLT5uM19yeF9wYWNrZXRzKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0eF9hYm9ydHM9JWRcbiIsIHN0YXRzLT50eF9hYm9ydHMpOworCXByaW50ayhLRVJOX0lORk8gInJ4X2Fib3J0cz0lZFxuIiwgc3RhdHMtPnJ4X2Fib3J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfZGV2cyhzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3YW5kZXYtPmRldjsKKworCXByaW50ayhLRVJOX0lORk8gIlguMjUgZGV2IHN0YXRlc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAibmFtZTogYWRkcjogICAgICAgICAgIHR4b2ZmOiAgcHJvdG9jb2w6XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJd2hpbGUoZGV2KSB7CisJCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJCXByaW50ayhLRVJOX0lORk8gIiUtNS41cyAlLTE1LjE1cyAgICVkICAgICBFVEhfUF8lc1xuIiwKKwkJCQkgY2hhbi0+bmFtZSwgY2hhbi0+YWRkciwgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLAorCQkJCSBjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9JUCA/ICJJUCIgOiAiWDI1Iik7CisJCWRldiA9IGNoYW4tPnNsYXZlOworCX0KK30KKworI2VuZGlmIC8qIENZQ0xPTVhfWDI1X0RFQlVHICovCisvKiBFbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMgYi9kcml2ZXJzL25ldC93YW4vZGxjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWVjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vZGxjaS5jCkBAIC0wLDAgKzEsNTY2IEBACisvKgorICogRExDSQkJSW1wbGVtZW50YXRpb24gb2YgRnJhbWUgUmVsYXkgcHJvdG9jb2wgZm9yIExpbnV4LCBhY2NvcmRpbmcgdG8KKyAqCQlSRkMgMTQ5MC4gIFRoaXMgZ2VuZXJpYyBkZXZpY2UgcHJvdmlkZXMgZW4vZGVjYXBzdWxhdGlvbiBmb3IgYW4KKyAqCQl1bmRlcmx5aW5nIGhhcmR3YXJlIGRyaXZlci4gIFJvdXRlcyAmIElQcyBhcmUgYXNzaWduZWQgdG8gdGhlc2UKKyAqCQlpbnRlcmZhY2VzLiAgUmVxdWlyZXMgJ2RsY2ljZmcnIHByb2dyYW0gdG8gY3JlYXRlIHVzYWJsZSAKKyAqCQlpbnRlcmZhY2VzLCB0aGUgaW5pdGlhbCBvbmUsICdkbGNpJyBpcyBmb3IgSU9DVEwgdXNlIG9ubHkuCisgKgorICogVmVyc2lvbjoJQCgjKWRsY2kuYwkwLjM1CTQgSmFuIDE5OTcKKyAqCisgKiBBdXRob3I6CU1pa2UgTWNMYWdhbiA8bWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZz4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqCQkwLjE1CU1pa2UgTWNsYWdhbglQYWNrZXQgZnJlZWluZywgYnVnIGluIGttYWxsb2MgY2FsbAorICoJCQkJCURMQ0lfUkVUIGhhbmRsaW5nCisgKgkJMC4yMAlNaWtlIE1jTGFnYW4JTW9yZSBjb25zZXJ2YXRpdmUgb24gd2hpY2ggcGFja2V0cworICoJCQkJCWFyZSByZXR1cm5lZCBmb3IgcmV0cnkgYW5kIHdoaWNoIGFyZQorICoJCQkJCWFyZSBkcm9wcGVkLiAgSWYgRExDSV9SRVRfRFJPUCBpcworICoJCQkJCXJldHVybmVkIGZyb20gdGhlIEZSQUQsIHRoZSBwYWNrZXQgaXMKKyAqCQkJCSAJc2VudCBiYWNrIHRvIExpbnV4IGZvciByZS10cmFuc21pc3Npb24KKyAqCQkwLjI1CU1pa2UgTWNMYWdhbglDb252ZXJ0ZWQgdG8gdXNlIFNJT0MgSU9DVEwgY2FsbHMKKyAqCQkwLjMwCUppbSBGcmVlbWFuCUZpeGVkIHRvIGFsbG93IElQWCB0cmFmZmljCisgKgkJMC4zNQlNaWNoYWVsIEVsaXphYmV0aAlGaXhlZCBpbmNvcnJlY3QgbWVtY3B5X2Zyb21mcworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19ETENJX0NPVU5UICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2ZyYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJETENJIGRyaXZlciB2MC4zNSwgNCBKYW4gMTk5NywgbWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZyI7CisKK3N0YXRpYyBMSVNUX0hFQUQoZGxjaV9kZXZzKTsKKworc3RhdGljIHZvaWQgZGxjaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogCisgKiB0aGVzZSBlbmNhcHN1bGF0ZSB0aGUgUkZDIDE0OTAgcmVxdWlyZW1lbnRzIGFzIHdlbGwgYXMgCisgKiBkZWFsIHdpdGggcGFja2V0IHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uLCB3b3JraW5nIHdpdGgKKyAqIHRoZSB1cHBlciBuZXR3b3JrIGxheWVycyAKKyAqLworCitzdGF0aWMgaW50IGRsY2lfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgZnJoZHIJCWhkcjsKKwlzdHJ1Y3QgZGxjaV9sb2NhbAkqZGxwOworCXVuc2lnbmVkIGludAkJaGxlbjsKKwljaGFyCQkJKmRlc3Q7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwloZHIuY29udHJvbCA9IEZSQURfSV9VSTsKKwlzd2l0Y2godHlwZSkKKwl7CisJCWNhc2UgRVRIX1BfSVA6CisJCQloZHIuSVBfTkxQSUQgPSBGUkFEX1BfSVA7CisJCQlobGVuID0gc2l6ZW9mKGhkci5jb250cm9sKSArIHNpemVvZihoZHIuSVBfTkxQSUQpOworCQkJYnJlYWs7CisKKwkJLyogZmVlbCBmcmVlIHRvIGFkZCBvdGhlciB0eXBlcywgaWYgbmVjZXNzYXJ5ICovCisKKwkJZGVmYXVsdDoKKwkJCWhkci5wYWQgPSBGUkFEX1BfUEFERElORzsKKwkJCWhkci5OTFBJRCA9IEZSQURfUF9TTkFQOworCQkJbWVtc2V0KGhkci5PVUksIDAsIHNpemVvZihoZHIuT1VJKSk7CisJCQloZHIuUElEID0gaHRvbnModHlwZSk7CisJCQlobGVuID0gc2l6ZW9mKGhkcik7CisJCQlicmVhazsKKwl9CisKKwlkZXN0ID0gc2tiX3B1c2goc2tiLCBobGVuKTsKKwlpZiAoIWRlc3QpCisJCXJldHVybigwKTsKKworCW1lbWNweShkZXN0LCAmaGRyLCBobGVuKTsKKworCXJldHVybihobGVuKTsKK30KKworc3RhdGljIHZvaWQgZGxjaV9yZWNlaXZlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscDsKKwlzdHJ1Y3QgZnJoZHIJCSpoZHI7CisJaW50CQkJCQlwcm9jZXNzLCBoZWFkZXI7CisKKwlkbHAgPSBkZXYtPnByaXY7CisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBpbnZhbGlkIGRhdGEgbm8gaGVhZGVyXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwloZHIgPSAoc3RydWN0IGZyaGRyICopIHNrYi0+ZGF0YTsKKwlwcm9jZXNzID0gMDsKKwloZWFkZXIgPSAwOworCXNrYi0+ZGV2ID0gZGV2OworCisJaWYgKGhkci0+Y29udHJvbCAhPSBGUkFEX0lfVUkpCisJeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBJbnZhbGlkIGhlYWRlciBmbGFnIDB4JTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5jb250cm9sKTsKKwkJZGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwl9CisJZWxzZQorCQlzd2l0Y2goaGRyLT5JUF9OTFBJRCkKKwkJeworCQkJY2FzZSBGUkFEX1BfUEFERElORzoKKwkJCQlpZiAoaGRyLT5OTFBJRCAhPSBGUkFEX1BfU05BUCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuc3VwcG9ydGVkIE5MUElEIDB4JTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5OTFBJRCk7CisJCQkJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkgCisJCQkJaWYgKGhkci0+T1VJWzBdICsgaGRyLT5PVUlbMV0gKyBoZHItPk9VSVsyXSAhPSAwKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5zdXBwb3J0ZWQgb3JnYW5pemF0aW9uYWxseSB1bmlxdWUgaWRlbnRpZmllciAweCUwMlgtJTAyWC0lMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPk9VSVswXSwgaGRyLT5PVUlbMV0sIGhkci0+T1VJWzJdKTsKKwkJCQkJZGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogYXQgdGhpcyBwb2ludCwgaXQncyBhbiBFdGhlclR5cGUgZnJhbWUgKi8KKwkJCQloZWFkZXIgPSBzaXplb2Yoc3RydWN0IGZyaGRyKTsKKwkJCQkvKiBBbHJlYWR5IGluIG5ldHdvcmsgb3JkZXIgISAqLworCQkJCXNrYi0+cHJvdG9jb2wgPSBoZHItPlBJRDsKKwkJCQlwcm9jZXNzID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGUkFEX1BfSVA6CisJCQkJaGVhZGVyID0gc2l6ZW9mKGhkci0+Y29udHJvbCkgKyBzaXplb2YoaGRyLT5JUF9OTFBJRCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkJCQlwcm9jZXNzID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGUkFEX1BfU05BUDoKKwkJCWNhc2UgRlJBRF9QX1E5MzM6CisJCQljYXNlIEZSQURfUF9DTE5QOgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuc3VwcG9ydGVkIE5MUElEIDB4JTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5wYWQpOworCQkJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogSW52YWxpZCBwYWQgYnl0ZSAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+cGFkKTsKKwkJCQlkbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWJyZWFrOwkJCQkKKwkJfQorCisJaWYgKHByb2Nlc3MpCisJeworCQkvKiB3ZSd2ZSBzZXQgdXAgdGhlIHByb3RvY29sLCBzbyBkaXNjYXJkIHRoZSBoZWFkZXIgKi8KKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOyAKKwkJc2tiX3B1bGwoc2tiLCBoZWFkZXIpOworCQlkbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRpZl9yeChza2IpOworCQlkbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9CisJZWxzZQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJaW50CQkJCQlyZXQ7CisKKwlyZXQgPSAwOworCisJaWYgKCFza2IgfHwgIWRldikKKwkJcmV0dXJuKDApOworCisJZGxwID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCXJldCA9IGRscC0+c2xhdmUtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRscC0+c2xhdmUpOworCXN3aXRjaCAocmV0KQorCXsKKwkJY2FzZSBETENJX1JFVF9PSzoKKwkJCWRscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQkJY2FzZSBETENJX1JFVF9FUlI6CisJCQlkbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQkJY2FzZSBETENJX1JFVF9EUk9QOgorCQkJZGxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJfQorCS8qIEFsYW4gQ294IHJlY29tbWVuZHMgYWx3YXlzIHJldHVybmluZyAwLCBhbmQgYWx3YXlzIGZyZWVpbmcgdGhlIHBhY2tldCAqLworCS8qIGV4cGVyaWVuY2Ugc3VnZ2VzdCBhIHNsaWdodGx5IG1vcmUgY29uc2VydmF0aXZlIGFwcHJvYWNoICovCisKKwlpZiAoIXJldCkKKwl7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGludCBkbGNpX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGxjaV9jb25mIF9fdXNlciAqY29uZiwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgZGxjaV9jb25mCWNvbmZpZzsKKwlzdHJ1Y3QgZGxjaV9sb2NhbAkqZGxwOworCXN0cnVjdCBmcmFkX2xvY2FsCSpmbHA7CisJaW50CQkJZXJyOworCisJZGxwID0gZGV2LT5wcml2OworCisJZmxwID0gZGxwLT5zbGF2ZS0+cHJpdjsKKworCWlmICghZ2V0KQorCXsKKwkJaWYoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgY29uZiwgc2l6ZW9mKHN0cnVjdCBkbGNpX2NvbmYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29uZmlnLmZsYWdzICYgfkRMQ0lfVkFMSURfRkxBR1MpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisJCW1lbWNweSgmZGxwLT5jb25maWcsICZjb25maWcsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSk7CisJCWRscC0+Y29uZmlndXJlZCA9IDE7CisJfQorCisJZXJyID0gKCpmbHAtPmRsY2lfY29uZikoZGxwLT5zbGF2ZSwgZGV2LCBnZXQpOworCWlmIChlcnIpCisJCXJldHVybihlcnIpOworCisJaWYgKGdldCkKKwl7CisJCWlmKGNvcHlfdG9fdXNlcihjb25mLCAmZGxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuKC1FUEVSTSk7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBETENJX0dFVF9TTEFWRToKKwkJCWlmICghKihzaG9ydCAqKShkZXYtPmRldl9hZGRyKSkKKwkJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJCXN0cm5jcHkoaWZyLT5pZnJfc2xhdmUsIGRscC0+c2xhdmUtPm5hbWUsIHNpemVvZihpZnItPmlmcl9zbGF2ZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBETENJX0dFVF9DT05GOgorCQljYXNlIERMQ0lfU0VUX0NPTkY6CisJCQlpZiAoISooc2hvcnQgKikoZGV2LT5kZXZfYWRkcikpCisJCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCQlyZXR1cm4oZGxjaV9jb25maWcoZGV2LCBpZnItPmlmcl9kYXRhLCBjbWQgPT0gRExDSV9HRVRfQ09ORikpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogCisJCQlyZXR1cm4oLUVPUE5PVFNVUFApOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4oKCpkbHAtPnNsYXZlLT5jaGFuZ2VfbXR1KShkbHAtPnNsYXZlLCBuZXdfbXR1KSk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVycjsKKworCWRscCA9IGRldi0+cHJpdjsKKworCWlmICghKihzaG9ydCAqKShkZXYtPmRldl9hZGRyKSkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRscC0+c2xhdmUpKQorCQlyZXR1cm4oLUVOT1RDT05OKTsKKworCWZscCA9IGRscC0+c2xhdmUtPnByaXY7CisJZXJyID0gKCpmbHAtPmFjdGl2YXRlKShkbHAtPnNsYXZlLCBkZXYpOworCWlmIChlcnIpCisJCXJldHVybihlcnIpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsY2lfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbAkqZGxwOworCXN0cnVjdCBmcmFkX2xvY2FsCSpmbHA7CisJaW50CQkJZXJyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGxwID0gZGV2LT5wcml2OworCisJZmxwID0gZGxwLT5zbGF2ZS0+cHJpdjsKKwllcnIgPSAoKmZscC0+ZGVhY3RpdmF0ZSkoZGxwLT5zbGF2ZSwgZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRsY2lfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscDsKKworCWRscCA9IGRldi0+cHJpdjsKKworCXJldHVybigmZGxwLT5zdGF0cyk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9hZGQoc3RydWN0IGRsY2lfYWRkICpkbGNpKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSptYXN0ZXIsICpzbGF2ZTsKKwlzdHJ1Y3QgZGxjaV9sb2NhbAkqZGxwOworCXN0cnVjdCBmcmFkX2xvY2FsCSpmbHA7CisJaW50CQkJZXJyID0gLUVJTlZBTDsKKworCisJLyogdmFsaWRhdGUgc2xhdmUgZGV2aWNlICovCisJc2xhdmUgPSBkZXZfZ2V0X2J5X25hbWUoZGxjaS0+ZGV2bmFtZSk7CisJaWYgKCFzbGF2ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc2xhdmUtPnR5cGUgIT0gQVJQSFJEX0ZSQUQgfHwgc2xhdmUtPnByaXYgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCisJLyogY3JlYXRlIGRldmljZSBuYW1lICovCisJbWFzdGVyID0gYWxsb2NfbmV0ZGV2KCBzaXplb2Yoc3RydWN0IGRsY2lfbG9jYWwpLCAiZGxjaSVkIiwKKwkJCSAgICAgIGRsY2lfc2V0dXApOworCWlmICghbWFzdGVyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgc2FtZSBzbGF2ZSBub3QgYWxyZWFkeSByZWdpc3RlcmVkICovCisJcnRubF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbHAsICZkbGNpX2RldnMsIGxpc3QpIHsKKwkJaWYgKGRscC0+c2xhdmUgPT0gc2xhdmUpIHsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCX0KKworCWVyciA9IGRldl9hbGxvY19uYW1lKG1hc3RlciwgbWFzdGVyLT5uYW1lKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIyOworCisJKihzaG9ydCAqKShtYXN0ZXItPmRldl9hZGRyKSA9IGRsY2ktPmRsY2k7CisKKwlkbHAgPSAoc3RydWN0IGRsY2lfbG9jYWwgKikgbWFzdGVyLT5wcml2OworCWRscC0+c2xhdmUgPSBzbGF2ZTsKKwlkbHAtPm1hc3RlciA9IG1hc3RlcjsKKworCWZscCA9IHNsYXZlLT5wcml2OworCWVyciA9ICgqZmxwLT5hc3NvYykoc2xhdmUsIG1hc3Rlcik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMjsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShtYXN0ZXIpOworCWlmIChlcnIgPCAwKSAKKwkJZ290byBlcnIyOworCisJc3RyY3B5KGRsY2ktPmRldm5hbWUsIG1hc3Rlci0+bmFtZSk7CisKKwlsaXN0X2FkZCgmZGxwLT5saXN0LCAmZGxjaV9kZXZzKTsKKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuKDApOworCisgZXJyMjoKKwlydG5sX3VubG9jaygpOworCWZyZWVfbmV0ZGV2KG1hc3Rlcik7CisgZXJyMToKKwlkZXZfcHV0KHNsYXZlKTsKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIGludCBkbGNpX2RlbChzdHJ1Y3QgZGxjaV9hZGQgKmRsY2kpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCXN0cnVjdCBuZXRfZGV2aWNlCSptYXN0ZXIsICpzbGF2ZTsKKwlpbnQJCQllcnI7CisKKwkvKiB2YWxpZGF0ZSBzbGF2ZSBkZXZpY2UgKi8KKwltYXN0ZXIgPSBfX2Rldl9nZXRfYnlfbmFtZShkbGNpLT5kZXZuYW1lKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobWFzdGVyKSkgeworCQlyZXR1cm4oLUVCVVNZKTsKKwl9CisKKwlkbHAgPSBtYXN0ZXItPnByaXY7CisJc2xhdmUgPSBkbHAtPnNsYXZlOworCWZscCA9IHNsYXZlLT5wcml2OworCisJcnRubF9sb2NrKCk7CisJZXJyID0gKCpmbHAtPmRlYXNzb2MpKHNsYXZlLCBtYXN0ZXIpOworCWlmICghZXJyKSB7CisJCWxpc3RfZGVsKCZkbHAtPmxpc3QpOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKG1hc3Rlcik7CisKKwkJZGV2X3B1dChzbGF2ZSk7CisJfQorCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIGludCBkbGNpX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRsY2lfYWRkIGFkZDsKKwlpbnQgZXJyOworCQorCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuKC1FUEVSTSk7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmYWRkLCBhcmcsIHNpemVvZihzdHJ1Y3QgZGxjaV9hZGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgU0lPQ0FERERMQ0k6CisJCQllcnIgPSBkbGNpX2FkZCgmYWRkKTsKKworCQkJaWYgKCFlcnIpCisJCQkJaWYoY29weV90b191c2VyKGFyZywgJmFkZCwgc2l6ZW9mKHN0cnVjdCBkbGNpX2FkZCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lPQ0RFTERMQ0k6CisJCQllcnIgPSBkbGNpX2RlbCgmYWRkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCX0KKworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgdm9pZCBkbGNpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscCA9IGRldi0+cHJpdjsKKworCWRldi0+ZmxhZ3MJCT0gMDsKKwlkZXYtPm9wZW4JCT0gZGxjaV9vcGVuOworCWRldi0+c3RvcAkJPSBkbGNpX2Nsb3NlOworCWRldi0+ZG9faW9jdGwJCT0gZGxjaV9kZXZfaW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBkbGNpX3RyYW5zbWl0OworCWRldi0+aGFyZF9oZWFkZXIJPSBkbGNpX2hlYWRlcjsKKwlkZXYtPmdldF9zdGF0cwkJPSBkbGNpX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUJCT0gZGxjaV9jaGFuZ2VfbXR1OworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKworCWRscC0+cmVjZWl2ZQkJPSBkbGNpX3JlY2VpdmU7CisKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0RMQ0k7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBzaXplb2Yoc3RydWN0IGZyaGRyKTsKKwlkZXYtPmFkZHJfbGVuCQk9IHNpemVvZihzaG9ydCk7CisKK30KKworLyogaWYgc2xhdmUgaXMgdW5yZWdpc3RlcmluZywgdGhlbiBjbGVhbnVwIG1hc3RlciAqLworc3RhdGljIGludCBkbGNpX2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcHRyOworCisJaWYgKGV2ZW50ID09IE5FVERFVl9VTlJFR0lTVEVSKSB7CisJCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkbHAsICZkbGNpX2RldnMsIGxpc3QpIHsKKwkJCWlmIChkbHAtPnNsYXZlID09IGRldikgeworCQkJCWxpc3RfZGVsKCZkbHAtPmxpc3QpOworCQkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRscC0+bWFzdGVyKTsKKwkJCQlkZXZfcHV0KGRscC0+c2xhdmUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkbGNpX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gZGxjaV9kZXZfZXZlbnQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2RsY2kodm9pZCkKK3sKKwlkbGNpX2lvY3RsX3NldChkbGNpX2lvY3RsKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRsY2lfbm90aWZpZXIpOworCisJcHJpbnRrKCIlcy5cbiIsIHZlcnNpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbGNpX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbAkqZGxwLCAqbnh0OworCQorCWRsY2lfaW9jdGxfc2V0KE5VTEwpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkbGNpX25vdGlmaWVyKTsKKworCXJ0bmxfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkbHAsIG54dCwgJmRsY2lfZGV2cywgbGlzdCkgeworCQl1bnJlZ2lzdGVyX25ldGRldmljZShkbHAtPm1hc3Rlcik7CisJCWRldl9wdXQoZGxwLT5zbGF2ZSk7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfZGxjaSk7Cittb2R1bGVfZXhpdChkbGNpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWtlIE1jTGFnYW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJhbWUgUmVsYXkgRExDSSBsYXllciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMgYi9kcml2ZXJzL25ldC93YW4vZHNjYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBhNzdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKQEAgLTAsMCArMSwyMDc0IEBACisvKgorICogZHJpdmVycy9uZXQvd2FuL2RzY2M0L2RzY2M0LmM6IGEgRFNDQzQgSERMQyBkcml2ZXIgZm9yIExpbnV4CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgcm9taWV1QGNvZ2VuaXQuZnIuCisgKiBTcGVjaWZpYyBidWcgcmVwb3J0cy9hc2lhbiBmb29kIHdpbGwgYmUgd2VsY29tZS4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byB0aGUgbmljZSBwZW9wbGUgYXQgQ1MtVGVsZWNvbSBmb3IgdGhlIGhhcmR3YXJlIGFuZCB0aGUKKyAqIGFjY2VzcyB0byB0aGUgdGVzdC9tZWFzdXJlIHRvb2xzLgorICoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlb3J5IG9mIE9wZXJhdGlvbgorICoKKyAqIEkuIEJvYXJkIENvbXBhdGliaWxpdHkKKyAqCisgKiBUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBTaWVtZW5zIFBFQjIwNTM0IDQgcG9ydHMgc2VyaWFsCisgKiBjb250cm9sbGVyIGFzIGZvdW5kIG9uIEV0aW5jIFBDSVNZTkMgY2FyZHMuIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKyAqIGNoaXBzZXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuaW5maW5lb24uY29tOgorICogLSBEYXRhIFNoZWV0ICJEU0NDNCwgRE1BIFN1cHBvcnRlZCBTZXJpYWwgQ29tbXVuaWNhdGlvbiBDb250cm9sbGVyIHdpdGgKKyAqIDQgQ2hhbm5lbHMsIFBFQiAyMDUzNCBWZXJzaW9uIDIuMSwgUEVGIDIwNTM0IFZlcnNpb24gMi4xIjsKKyAqIC0gQXBwbGljYXRpb24gSGludCAiTWFuYWdlbWVudCBvZiBEU0NDNCBvbi1jaGlwIEZJRk8gcmVzb3VyY2VzIi4KKyAqIC0gRXJyYXRhIHNoZWV0IERTNSAoY291cnRlc3kgb2YgTWljaGFlbCBTa2Vycml0dCkuCisgKiBKZW5zIERhdmlkIGhhcyBidWlsdCBhbiBhZGFwdGVyIGJhc2VkIG9uIHRoZSBzYW1lIGNoaXBzZXQuIFRha2UgYSBsb29rCisgKiBhdCBodHRwOi8vd3d3LmFmdGhkLnR1LWRhcm1zdGFkdC5kZS9+ZGcxa2pkL3BjaXNjYzQgZm9yIGEgc3BlY2lmaWMKKyAqIGRyaXZlci4KKyAqIFNhbXBsZSBjb2RlICgyIHJldmlzaW9ucykgaXMgYXZhaWxhYmxlIGF0IEluZmluZW9uLgorICoKKyAqIElJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworICoKKyAqIFBjaXN5bmMgY2FuIHRyYW5zbWl0IHNvbWUgY2xvY2sgc2lnbmFsIHRvIHRoZSBvdXRzaWRlIHdvcmxkIG9uIHRoZQorICogKmZpcnN0IHR3byogcG9ydHMgcHJvdmlkZWQgeW91IHB1dCBhIHF1YXJ0eiBhbmQgYSBsaW5lIGRyaXZlciBvbiBpdCBhbmQKKyAqIHJlbW92ZSB0aGUganVtcGVycy4gVGhlIG9wZXJhdGlvbiBpcyBkZXNjcmliZWQgb24gRXRpbmMgd2ViIHNpdGUuIElmIHlvdQorICogZ28gRENFIG9uIHRoZXNlIHBvcnRzLCBkb24ndCBmb3JnZXQgdG8gdXNlIGFuIGFkZXF1YXRlIGNhYmxlLgorICoKKyAqIFNoYXJpbmcgb2YgdGhlIFBDSSBpbnRlcnJ1cHQgbGluZSBmb3IgdGhpcyBib2FyZCBpcyBwb3NzaWJsZS4KKyAqCisgKiBJSUkuIERyaXZlciBvcGVyYXRpb24KKyAqCisgKiBUaGUgcngvdHggb3BlcmF0aW9ucyBhcmUgYmFzZWQgb24gYSBsaW5rZWQgbGlzdCBvZiBkZXNjcmlwdG9ycy4gVGhlIGRyaXZlcgorICogZG9lc24ndCB1c2UgSE9MRCBtb2RlIGFueSBtb3JlLiBIT0xEIG1vZGUgaXMgZGVmaW5pdGVseSBidWdneSBhbmQgdGhlIG1vcmUKKyAqIEkgdHJpZWQgdG8gZml4IGl0LCB0aGUgbW9yZSBpdCBzdGFydGVkIHRvIGxvb2sgbGlrZSAoY29udm9sdXRlZCkgc29mdHdhcmUKKyAqIG11dGF0aW9uIG9mIEx4REEgbWV0aG9kLiBFcnJhdGEgc2hlZXQgRFM1IHN1Z2dlc3RzIHRvIHVzZSBMeERBOiBjb25zaWRlcgorICogdGhpcyBhIHJmYzIxMTkgTVVTVC4KKyAqCisgKiBUeCBkaXJlY3Rpb24KKyAqIFdoZW4gdGhlIHR4IHJpbmcgaXMgZnVsbCwgdGhlIHhtaXQgcm91dGluZSBpc3N1ZXMgYSBjYWxsIHRvIG5ldGRldl9zdG9wLgorICogVGhlIGRldmljZSBpcyBzdXBwb3NlZCB0byBiZSBlbmFibGVkIGFnYWluIGR1cmluZyBhbiBBTExTIGlycSAod2UgY291bGQKKyAqIHVzZSBISSBidXQgYXMgaXQncyBlYXN5IHRvIGxvc2UgZXZlbnRzLCBpdCdzIGZzY2tlZCkuCisgKgorICogUnggZGlyZWN0aW9uCisgKiBUaGUgcmVjZWl2ZWQgZnJhbWVzIGFyZW4ndCBzdXBwb3NlZCB0byBzcGFuIG92ZXIgbXVsdGlwbGUgcmVjZWl2aW5nIGFyZWFzLgorICogSSBtYXkgaW1wbGVtZW50IGl0IHNvbWUgZGF5IGJ1dCBpdCBpc24ndCB0aGUgaGlnaGVzdCByYW5rZWQgaXRlbS4KKyAqCisgKiBJVi4gTm90ZXMKKyAqIFRoZSBjdXJyZW50IGVycm9yIChYRFUsIFJGTykgcmVjb3ZlcnkgY29kZSBpcyB1bnRlc3RlZC4KKyAqIFNvIGZhciwgUkRPIHRha2VzIGhpcyBSWCBjaGFubmVsIGRvd24gYW5kIHRoZSByaWdodCBzZXF1ZW5jZSB0byBlbmFibGUgaXQKKyAqIGFnYWluIGlzIHN0aWxsIGEgbWlzdGVyeS4gSWYgUkRPIGhhcHBlbnMsIHBsYW4gYSByZWJvb3QuIE1vcmUgZGV0YWlscworICogaW4gdGhlIGNvZGUgKE5COiBhcyB0aGlzIGhhcHBlbnMsIFRYIHN0aWxsIHdvcmtzKS4KKyAqIERvbid0IG1lc3MgdGhlIGNhYmxlcyBkdXJpbmcgb3BlcmF0aW9uLCBlc3BlY2lhbGx5IG9uIERURSBwb3J0cy4gSSBkb24ndAorICogc3VnZ2VzdCBpdCBmb3IgRENFIGVpdGhlciBidXQgYXQgbGVhc3Qgb25lIGNhbiBnZXQgc29tZSBtZXNzYWdlcyBpbnN0ZWFkCisgKiBvZiBhIGNvbXBsZXRlIGluc3RhbnQgZnJlZXplLgorICogVGVzdHMgYXJlIGRvbmUgb24gUmV2LiAyMCBvZiB0aGUgc2lsaWNpdW0uIFRoZSBSRE8gaGFuZGxpbmcgY2hhbmdlcyB3aXRoCisgKiB0aGUgZG9jdW1lbnRhdGlvbi9jaGlwc2V0IHJlbGVhc2VzLgorICoKKyAqIFRPRE86CisgKiAtIHRlc3QgWDI1LgorICogLSB1c2UgcG9sbGluZyBhdCBoaWdoIGlycS9zLAorICogLSBwZXJmb3JtYW5jZSBhbmFseXNpcywKKyAqIC0gZW5kaWFubmVzcy4KKyAqCisgKiAyMDAxLzEyLzEwCURhbmllbGEgU3F1YXNzb25pICA8ZGFuaWVsYUBjeWNsYWRlcy5jb20+CisgKiAtIENvbnRyaWJ1dGlvbiB0byBzdXBwb3J0IHRoZSBuZXcgZ2VuZXJpYyBIRExDIGxheWVyLgorICoKKyAqIDIwMDIvMDEJVWVpbW9yCisgKiAtIG9sZCBzdHlsZSBpbnRlcmZhY2UgcmVtb3ZhbAorICogLSBkc2NjNF9yZWxlYXNlX3JpbmcgZml4IChyZWxhdGVkIHRvIERNQSBtYXBwaW5nKQorICogLSBoYXJkX3N0YXJ0X3htaXQgZml4IChoaW50OiBUeFNpemVNYXgpCisgKiAtIG1pc2MgY3JhcGVjdG9teS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKy8qIFZlcnNpb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICIkSWQ6IGRzY2M0LmMsdiAxLjE3MyAyMDAzLzA5LzIwIDIzOjU1OjM0IHJvbWlldSBFeHAgJCBmb3IgTGludXhcbiI7CitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBxdWFydHo7CisKKyNpZmRlZiBDT05GSUdfRFNDQzRfUENJX1JTVAorc3RhdGljIERFQ0xBUkVfTVVURVgoZHNjYzRfc2VtKTsKK3N0YXRpYyB1MzIgZHNjYzRfcGNpX2NvbmZpZ19zdG9yZVsxNl07CisjZW5kaWYKKworI2RlZmluZQlEUlZfTkFNRQkiZHNjYzQiCisKKyN1bmRlZiBEU0NDNF9QT0xMSU5HCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IEZyYW5jb2lzIFJvbWlldSA8cm9taWV1QGNvZ2VuaXQuZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpZW1lbnMgUEVCMjA1MzQgUENJIENvbnRyb2xlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiRW5hYmxlL2Rpc2FibGUgZXh0cmEgbWVzc2FnZXMiKTsKK21vZHVsZV9wYXJhbShxdWFydHosIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHF1YXJ0eiwiSWYgcHJlc2VudCwgb24tYm9hcmQgcXVhcnR6IGZyZXF1ZW5jeSAoSHopIik7CisKKy8qIFN0cnVjdHVyZXMgKi8KKworc3RydWN0IHRoaW5naWUgeworCWludCBkZWZpbmU7CisJdTMyIGJpdHM7Cit9OworCitzdHJ1Y3QgVHhGRCB7CisJdTMyIHN0YXRlOworCXUzMiBuZXh0OworCXUzMiBkYXRhOworCXUzMiBjb21wbGV0ZTsKKwl1MzIgamlmZmllczsgLyogQWxsb3dzIHNpemVvZihUeEZEKSA9PSBzaXplb2YoUnhGRCkgKyBleHRyYSBoYWNrICovCit9OworCitzdHJ1Y3QgUnhGRCB7CisJdTMyIHN0YXRlMTsKKwl1MzIgbmV4dDsKKwl1MzIgZGF0YTsKKwl1MzIgc3RhdGUyOworCXUzMiBlbmQ7Cit9OworCisjZGVmaW5lIERVTU1ZX1NLQl9TSVpFCQk2NAorI2RlZmluZSBUWF9MT1cJCQk4CisjZGVmaW5lIFRYX1JJTkdfU0laRQkJMzIKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkzMgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBUeEZEKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBSeEZEKQorI2RlZmluZSBJUlFfUklOR19TSVpFCQk2NAkJLyogS2VlcCBpdCBhIG11bHRpcGxlIG9mIDMyICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCShIWi8xMCkKKyNkZWZpbmUgRFNDQzRfSFpfTUFYCQkzMzAwMDAwMAorI2RlZmluZSBCUlJfRElWSURFUl9NQVgJCTY0KjB4MDAwMDQwMDAJLyogQ2YgZXJyYXRhIERTNSBwLjEwICovCisjZGVmaW5lIGRldl9wZXJfY2FyZAkJNAorI2RlZmluZSBTQ0NfUkVHSVNURVJTX01BWAkyMwkJLyogQ2YgZXJyYXRhIERTNSBwLjQgKi8KKworI2RlZmluZSBTT1VSQ0VfSUQoZmxhZ3MpCSgoKGZsYWdzKSA+PiAyOCkgJiAweDAzKQorI2RlZmluZSBUT19TSVpFKHN0YXRlKQkJKCgoc3RhdGUpID4+IDE2KSAmIDB4MWZmZikKKworLyoKKyAqIEdpdmVuIHRoZSBvcGVyYXRpbmcgcmFuZ2Ugb2YgTGludXggSERMQywgdGhlIDIgZGVmaW5lcyBiZWxvdyBjb3VsZCBiZQorICogbWFkZSBzaW1wbGVyLiBIb3dldmVyIHRoZXkgYXJlIGEgZmluZSByZW1pbmRlciBmb3IgdGhlIGxpbWl0YXRpb25zIG9mCisgKiB0aGUgZHJpdmVyOiBpdCdzIGJldHRlciB0byBzdGF5IDwgVHhTaXplTWF4IGFuZCA8IFJ4U2l6ZU1heC4KKyAqLworI2RlZmluZSBUT19TVEFURV9UWChsZW4pCWNwdV90b19sZTMyKCgobGVuKSAmIFR4U2l6ZU1heCkgPDwgMTYpCisjZGVmaW5lIFRPX1NUQVRFX1JYKGxlbikJY3B1X3RvX2xlMzIoKFJYX01BWChsZW4pICUgUnhTaXplTWF4KSA8PCAxNikKKyNkZWZpbmUgUlhfTUFYKGxlbikJCSgoKChsZW4pID4+IDUpICsgMSkgPDwgNSkJLyogQ2YgUkxDUiAqLworI2RlZmluZSBTQ0NfUkVHX1NUQVJUKGRwcml2KQkoU0NDX1NUQVJUKyhkcHJpdi0+ZGV2X2lkKSpTQ0NfT0ZGU0VUKQorCitzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgeworICAgICAgICB1MzIgKmlxY2ZnOworICAgICAgICBpbnQgY2ZnX2N1cjsKKyAgICAgICAgc3BpbmxvY2tfdCBsb2NrOworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworICAgICAgICBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnJvb3Q7CisgICAgICAgIGRtYV9hZGRyX3QgaXFjZmdfZG1hOworCXUzMiB4dGFsX2h6OworfTsKKworc3RydWN0IGRzY2M0X2Rldl9wcml2IHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisKKyAgICAgICAgc3RydWN0IFJ4RkQgKnJ4X2ZkOworICAgICAgICBzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisgICAgICAgIHUzMiAqaXFyeDsKKyAgICAgICAgdTMyICppcXR4OworCisJLyogRklYTUU6IGNoZWNrIGFsbCB0aGUgdm9sYXRpbGUgYXJlIHJlcXVpcmVkICovCisgICAgICAgIHZvbGF0aWxlIHUzMiB0eF9jdXJyZW50OworICAgICAgICB1MzIgcnhfY3VycmVudDsKKyAgICAgICAgdTMyIGlxdHhfY3VycmVudDsKKyAgICAgICAgdTMyIGlxcnhfY3VycmVudDsKKworICAgICAgICB2b2xhdGlsZSB1MzIgdHhfZGlydHk7CisgICAgICAgIHZvbGF0aWxlIHUzMiBsdGRhOworICAgICAgICB1MzIgcnhfZGlydHk7CisgICAgICAgIHUzMiBscmRhOworCisgICAgICAgIGRtYV9hZGRyX3QgdHhfZmRfZG1hOworICAgICAgICBkbWFfYWRkcl90IHJ4X2ZkX2RtYTsKKyAgICAgICAgZG1hX2FkZHJfdCBpcXR4X2RtYTsKKyAgICAgICAgZG1hX2FkZHJfdCBpcXJ4X2RtYTsKKworCXUzMiBzY2NfcmVnc1tTQ0NfUkVHSVNURVJTX01BWF07IC8qIENmIGVycmF0YSBEUzUgcC40ICovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworICAgICAgICBzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBjaV9wcml2OworICAgICAgICBzcGlubG9ja190IGxvY2s7CisKKyAgICAgICAgaW50IGRldl9pZDsKKwl2b2xhdGlsZSB1MzIgZmxhZ3M7CisJdTMyIHRpbWVyX2hlbHA7CisKKwl1bnNpZ25lZCBzaG9ydCBlbmNvZGluZzsKKwl1bnNpZ25lZCBzaG9ydCBwYXJpdHk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzZXR0aW5nczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1MzIgX19wYWQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Cit9OworCisvKiBHTE9CQUwgcmVnaXN0ZXJzIGRlZmluaXRpb25zICovCisjZGVmaW5lIEdDTURSICAgMHgwMAorI2RlZmluZSBHU1RBUiAgIDB4MDQKKyNkZWZpbmUgR01PREUgICAweDA4CisjZGVmaW5lIElRTEVOUjAgMHgwQworI2RlZmluZSBJUUxFTlIxIDB4MTAKKyNkZWZpbmUgSVFSWDAgICAweDE0CisjZGVmaW5lIElRVFgwICAgMHgyNAorI2RlZmluZSBJUUNGRyAgIDB4M2MKKyNkZWZpbmUgRklGT0NSMSAweDQ0CisjZGVmaW5lIEZJRk9DUjIgMHg0OAorI2RlZmluZSBGSUZPQ1IzIDB4NGMKKyNkZWZpbmUgRklGT0NSNCAweDM0CisjZGVmaW5lIENIMENGRyAgMHg1MAorI2RlZmluZSBDSDBCUkRBIDB4NTQKKyNkZWZpbmUgQ0gwQlREQSAweDU4CisjZGVmaW5lIENIMEZSREEgMHg5OAorI2RlZmluZSBDSDBGVERBIDB4YjAKKyNkZWZpbmUgQ0gwTFJEQSAweGM4CisjZGVmaW5lIENIMExUREEgMHhlMAorCisvKiBTQ0MgcmVnaXN0ZXJzIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNDQ19TVEFSVAkweDAxMDAKKyNkZWZpbmUgU0NDX09GRlNFVCAgICAgIDB4ODAKKyNkZWZpbmUgQ01EUiAgICAweDAwCisjZGVmaW5lIFNUQVIgICAgMHgwNAorI2RlZmluZSBDQ1IwICAgIDB4MDgKKyNkZWZpbmUgQ0NSMSAgICAweDBjCisjZGVmaW5lIENDUjIgICAgMHgxMAorI2RlZmluZSBCUlIgICAgIDB4MkMKKyNkZWZpbmUgUkxDUiAgICAweDQwCisjZGVmaW5lIElNUiAgICAgMHg1NAorI2RlZmluZSBJU1IgICAgIDB4NTgKKworI2RlZmluZSBHUERJUgkweDA0MDAKKyNkZWZpbmUgR1BEQVRBCTB4MDQwNAorI2RlZmluZSBHUElNCTB4MDQwOAorCisvKiBCaXQgbWFza3MgKi8KKyNkZWZpbmUgRW5jb2RpbmdNYXNrCTB4MDA3MDAwMDAKKyNkZWZpbmUgQ3JjTWFzawkJMHgwMDAwMDAwMworCisjZGVmaW5lIEludFJ4U2NjMAkweDEwMDAwMDAwCisjZGVmaW5lIEludFR4U2NjMAkweDAxMDAwMDAwCisKKyNkZWZpbmUgVHhQb2xsQ21kCTB4MDAwMDA0MDAKKyNkZWZpbmUgUnhBY3RpdmF0ZQkweDA4MDAwMDAwCisjZGVmaW5lIE1URmkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgUmRyCQkweDAwNDAwMDAwCisjZGVmaW5lIFJkdAkJMHgwMDIwMDAwMAorI2RlZmluZSBJZHIJCTB4MDAxMDAwMDAKKyNkZWZpbmUgSWR0CQkweDAwMDgwMDAwCisjZGVmaW5lIFR4U2NjUmVzCTB4MDEwMDAwMDAKKyNkZWZpbmUgUnhTY2NSZXMJMHgwMDAxMDAwMAorI2RlZmluZSBUeFNpemVNYXgJMHgxZmZmCQkvKiBEYXRhc2hlZXQgRFMxIC0gMTEuMS4xLjEgKi8KKyNkZWZpbmUgUnhTaXplTWF4CTB4MWZmYwkJLyogRGF0YXNoZWV0IERTMSAtIDExLjEuMi4xICovCisKKyNkZWZpbmUgQ2NyMENsb2NrTWFzawkweDAwMDAwMDNmCisjZGVmaW5lIENjcjFMb29wTWFzawkweDAwMDAwMjAwCisjZGVmaW5lIElzck1hc2sJCTB4MDAwZmZmZmYKKyNkZWZpbmUgQnJyRXhwTWFzawkweDAwMDAwZjAwCisjZGVmaW5lIEJyck11bHRNYXNrCTB4MDAwMDAwM2YKKyNkZWZpbmUgRW5jb2RpbmdNYXNrCTB4MDA3MDAwMDAKKyNkZWZpbmUgSG9sZAkJMHg0MDAwMDAwMAorI2RlZmluZSBTY2NCdXN5CQkweDEwMDAwMDAwCisjZGVmaW5lIFBvd2VyVXAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgVmlzCQkweDAwMDAxMDAwCisjZGVmaW5lIEZyYW1lT2sJCShGcmFtZVZmciB8IEZyYW1lQ3JjKQorI2RlZmluZSBGcmFtZVZmcgkweDgwCisjZGVmaW5lIEZyYW1lUmRvCTB4NDAKKyNkZWZpbmUgRnJhbWVDcmMJMHgyMAorI2RlZmluZSBGcmFtZVJhYgkweDEwCisjZGVmaW5lIEZyYW1lQWJvcnRlZAkweDAwMDAwMjAwCisjZGVmaW5lIEZyYW1lRW5kCTB4ODAwMDAwMDAKKyNkZWZpbmUgRGF0YUNvbXBsZXRlCTB4NDAwMDAwMDAKKyNkZWZpbmUgTGVuZ3RoQ2hlY2sJMHgwMDAwODAwMAorI2RlZmluZSBTY2NFdnQJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTm9BY2sJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQWN0aW9uCQkweDAwMDAwMDAxCisjZGVmaW5lIEhpRGVzYwkJMHgyMDAwMDAwMAorCisvKiBTQ0MgZXZlbnRzICovCisjZGVmaW5lIFJ4RXZ0CQkweGYwMDAwMDAwCisjZGVmaW5lIFR4RXZ0CQkweDBmMDAwMDAwCisjZGVmaW5lIEFsbHMJCTB4MDAwNDAwMDAKKyNkZWZpbmUgWGR1CQkweDAwMDEwMDAwCisjZGVmaW5lIEN0cwkJMHgwMDAwNDAwMAorI2RlZmluZSBYbXIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgWHByCQkweDAwMDAxMDAwCisjZGVmaW5lIFJkbwkJMHgwMDAwMDA4MAorI2RlZmluZSBSZnMJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQ2QJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUmZvCQkweDAwMDAwMDAyCisjZGVmaW5lIEZsZXgJCTB4MDAwMDAwMDEKKworLyogRE1BIGNvcmUgZXZlbnRzICovCisjZGVmaW5lIENmZwkJMHgwMDIwMDAwMAorI2RlZmluZSBIaQkJMHgwMDA0MDAwMAorI2RlZmluZSBGaQkJMHgwMDAyMDAwMAorI2RlZmluZSBFcnIJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQXJmCQkweDAwMDAwMDAyCisjZGVmaW5lIEFyQWNrCQkweDAwMDAwMDAxCisKKy8qIFN0YXRlIGZsYWdzICovCisjZGVmaW5lIFJlYWR5CQkweDAwMDAwMDAwCisjZGVmaW5lIE5lZWRJRFIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTmVlZElEVAkJMHgwMDAwMDAwMgorI2RlZmluZSBSZG9TZXQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRmFrZVJlc2V0CTB4MDAwMDAwMDgKKworLyogRG9uJ3QgbWFzayBSRE8uIEV2ZXIuICovCisjaWZkZWYgRFNDQzRfUE9MTElORworI2RlZmluZSBFdmVudHNNYXNrCTB4ZmZmZWVmN2YKKyNlbHNlCisjZGVmaW5lIEV2ZW50c01hc2sJMHhmZmZhOGY3YQorI2VuZGlmCisKKy8qIEZ1bmN0aW9ucyBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBkc2NjNF9yeF9pcnEoc3RydWN0IGRzY2M0X3BjaV9wcml2ICosIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqKTsKK3N0YXRpYyB2b2lkIGRzY2M0X3R4X2lycShzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKiwgc3RydWN0IGRzY2M0X2Rldl9wcml2ICopOworc3RhdGljIGludCBkc2NjNF9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKiwgdm9pZCBfX2lvbWVtICppb2FkZHIpOworc3RhdGljIGludCBkc2NjNF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpbnQgZHNjYzRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgZHNjYzRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgZHNjYzRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGRzY2M0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBkc2NjNF9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBkc2NjNF9yZWxlYXNlX3Jpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICopOworc3RhdGljIHZvaWQgZHNjYzRfdGltZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBkc2NjNF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlycXJldHVybl90IGRzY2M0X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpOworc3RhdGljIGludCBkc2NjNF9oZGxjX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworc3RhdGljIGludCBkc2NjNF9zZXRfaWZhY2Uoc3RydWN0IGRzY2M0X2Rldl9wcml2ICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworI2lmZGVmIERTQ0M0X1BPTExJTkcKK3N0YXRpYyBpbnQgZHNjYzRfdHhfcG9sbChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRzY2M0X3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X3RvX2hkbGMoZGV2KS0+cHJpdjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqZHNjYzRfdG9fZGV2KHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcCkKK3sKKwlyZXR1cm4gcC0+ZGV2OworfQorCitzdGF0aWMgdm9pZCBzY2NfcGF0Y2hsKHUzMiBtYXNrLCB1MzIgdmFsdWUsIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0KQoreworCXUzMiBzdGF0ZTsKKworCS8qIENmIHNjY193cml0ZWwgZm9yIGNvbmNlcm4gcmVnYXJkaW5nIHRocmVhZC1zYWZldHkgKi8KKwlzdGF0ZSA9IGRwcml2LT5zY2NfcmVnc1tvZmZzZXQgPj4gMl07CisJc3RhdGUgJj0gfm1hc2s7CisJc3RhdGUgfD0gdmFsdWU7CisJZHByaXYtPnNjY19yZWdzW29mZnNldCA+PiAyXSA9IHN0YXRlOworCXdyaXRlbChzdGF0ZSwgZHByaXYtPmJhc2VfYWRkciArIFNDQ19SRUdfU1RBUlQoZHByaXYpICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgc2NjX3dyaXRlbCh1MzIgYml0cywgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmZzZXQpCit7CisJLyoKKwkgKiBUaHJlYWQtVU5zYWZlLgorCSAqIEFzIG9mIDIwMDIvMDIvMTYsIHRoZXJlIGFyZSBubyB0aHJlYWQgcmFjaW5nIGZvciBhY2Nlc3MuCisJICovCisJZHByaXYtPnNjY19yZWdzW29mZnNldCA+PiAyXSA9IGJpdHM7CisJd3JpdGVsKGJpdHMsIGRwcml2LT5iYXNlX2FkZHIgKyBTQ0NfUkVHX1NUQVJUKGRwcml2KSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNjY19yZWFkbChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBkcHJpdi0+c2NjX3JlZ3Nbb2Zmc2V0ID4+IDJdOworfQorCitzdGF0aWMgdTMyIHNjY19yZWFkbF9zdGFyKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogQ2YgZXJyYXRhIERTNSBwLjQgKi8KKwlyZWFkbChkcHJpdi0+YmFzZV9hZGRyICsgU0NDX1JFR19TVEFSVChkcHJpdikgKyBTVEFSKTsKKwlyZXR1cm4gcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIFNDQ19SRUdfU1RBUlQoZHByaXYpICsgU1RBUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2NjNF9kb190eChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZHByaXYtPmx0ZGEgPSBkcHJpdi0+dHhfZmRfZG1hICsKKyAgICAgICAgICAgICAgICAgICAgICAoKGRwcml2LT50eF9jdXJyZW50LTEpJVRYX1JJTkdfU0laRSkqc2l6ZW9mKHN0cnVjdCBUeEZEKTsKKwl3cml0ZWwoZHByaXYtPmx0ZGEsIGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMVERBICsgZHByaXYtPmRldl9pZCo0KTsKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICpOT1cqICovCisJcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIENIMExUREEgKyBkcHJpdi0+ZGV2X2lkKjQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNjYzRfcnhfdXBkYXRlKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkcHJpdi0+bHJkYSA9IGRwcml2LT5yeF9mZF9kbWEgKworCQkgICAgICAoKGRwcml2LT5yeF9kaXJ0eSAtIDEpJVJYX1JJTkdfU0laRSkqc2l6ZW9mKHN0cnVjdCBSeEZEKTsKKwl3cml0ZWwoZHByaXYtPmxyZGEsIGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMUkRBICsgZHByaXYtPmRldl9pZCo0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZHNjYzRfdHhfZG9uZShzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXJldHVybiBkcHJpdi0+dHhfY3VycmVudCA9PSBkcHJpdi0+dHhfZGlydHk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRzY2M0X3R4X3F1aWVzY2VudChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiByZWFkbChkcHJpdi0+YmFzZV9hZGRyICsgQ0gwRlREQSArIGRwcml2LT5kZXZfaWQqNCkgPT0gZHByaXYtPmx0ZGE7Cit9CisKK2ludCBzdGF0ZV9jaGVjayh1MzIgc3RhdGUsIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCWNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZWJ1ZyA+IDEpIHsKKwlpZiAoU09VUkNFX0lEKHN0YXRlKSAhPSBkcHJpdi0+ZGV2X2lkKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoJXMpOiBTb3VyY2UgSWQ9JWQsIHN0YXRlPSUwOHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1zZywgU09VUkNFX0lEKHN0YXRlKSwgc3RhdGUgKTsKKwkJCXJldCA9IC0xOworCX0KKwlpZiAoc3RhdGUgJiAweDBkZjgwYzAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoJXMpOiBzdGF0ZT0lMDh4IChVRk8gYWxlcnQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtc2csIHN0YXRlKTsKKwkJCXJldCA9IC0xOworCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkc2NjNF90eF9wcmludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkgICAgY2hhciAqbXNnKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhfY3VycmVudD0lMDJkIHR4X2RpcnR5PSUwMmQgKCVzKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkcHJpdi0+dHhfY3VycmVudCwgZHByaXYtPnR4X2RpcnR5LCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBkc2NjNF9yZWxlYXNlX3Jpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRwcml2LT5wY2lfcHJpdi0+cGRldjsKKwlzdHJ1Y3QgVHhGRCAqdHhfZmQgPSBkcHJpdi0+dHhfZmQ7CisJc3RydWN0IFJ4RkQgKnJ4X2ZkID0gZHByaXYtPnJ4X2ZkOworCXN0cnVjdCBza19idWZmICoqc2tidWZmOworCWludCBpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCB0eF9mZCwgZHByaXYtPnR4X2ZkX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCByeF9mZCwgZHByaXYtPnJ4X2ZkX2RtYSk7CisKKwlza2J1ZmYgPSBkcHJpdi0+dHhfc2tidWZmOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoKnNrYnVmZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCB0eF9mZC0+ZGF0YSwgKCpza2J1ZmYpLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKCpza2J1ZmYpOworCQl9CisJCXNrYnVmZisrOworCQl0eF9mZCsrOworCX0KKworCXNrYnVmZiA9IGRwcml2LT5yeF9za2J1ZmY7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmICgqc2tidWZmKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHJ4X2ZkLT5kYXRhLAorCQkJCVJYX01BWChIRExDX01BWF9NUlUpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYigqc2tidWZmKTsKKwkJfQorCQlza2J1ZmYrKzsKKwkJcnhfZmQrKzsKKwl9Cit9CisKK2lubGluZSBpbnQgdHJ5X2dldF9yeF9za2Ioc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBkcHJpdi0+cnhfZGlydHklUlhfUklOR19TSVpFOworCXN0cnVjdCBSeEZEICpyeF9mZCA9IGRwcml2LT5yeF9mZCArIGRpcnR5OworCWNvbnN0IGludCBsZW4gPSBSWF9NQVgoSERMQ19NQVhfTVJVKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXQgPSAwOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCWRwcml2LT5yeF9za2J1ZmZbZGlydHldID0gc2tiOworCWlmIChza2IpIHsKKwkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCXJ4X2ZkLT5kYXRhID0gcGNpX21hcF9zaW5nbGUoZHByaXYtPnBjaV9wcml2LT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCXJ4X2ZkLT5kYXRhID0gKHUzMikgTlVMTDsKKwkJcmV0ID0gLTE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBJUlEvdGhyZWFkL3doYXRldmVyIHNhZmUKKyAqLworc3RhdGljIGludCBkc2NjNF93YWl0X2Fja19jZWMoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKm1zZykKK3sKKwlzOCBpID0gMDsKKworCWRvIHsKKwkJaWYgKCEoc2NjX3JlYWRsX3N0YXIoZHByaXYsIGRldikgJiBTY2NCdXN5KSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBhY2sgKCVkIHRyeSlcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBtc2csIGkpOworCQkJZ290byBkb25lOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxMCk7CisJCXJtYigpOworCX0gd2hpbGUgKCsraSA+IDApOworCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIHRpbWVvdXRcbiIsIGRldi0+bmFtZSwgbXNnKTsKK2RvbmU6CisJcmV0dXJuIChpID49IDApID8gaSA6IC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfZG9fYWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKm1zZykKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGRzY2M0X3ByaXYoZGV2KS0+YmFzZV9hZGRyOworCXMxNiBpID0gMDsKKworCXdyaXRlbChBY3Rpb24sIGlvYWRkciArIEdDTURSKTsKKwlpb2FkZHIgKz0gR1NUQVI7CisJZG8geworCQl1MzIgc3RhdGUgPSByZWFkbChpb2FkZHIpOworCisJCWlmIChzdGF0ZSAmIEFyQWNrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIGFja1xuIiwgZGV2LT5uYW1lLCBtc2cpOworCQkJd3JpdGVsKEFyQWNrLCBpb2FkZHIpOworCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKHN0YXRlICYgQXJmKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBmYWlsZWRcbiIsIGRldi0+bmFtZSwgbXNnKTsKKwkJCXdyaXRlbChBcmYsIGlvYWRkcik7CisJCQlpID0gLTE7CisJCQlnb3RvIGRvbmU7CisJfQorCQlybWIoKTsKKwl9IHdoaWxlICgrK2kgPiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lb3V0XG4iLCBkZXYtPm5hbWUsIG1zZyk7Citkb25lOgorCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc2NjNF94cHJfYWNrKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYpCit7CisJaW50IGN1ciA9IGRwcml2LT5pcXR4X2N1cnJlbnQlSVJRX1JJTkdfU0laRTsKKwlzOCBpID0gMDsKKworCWRvIHsKKwkJaWYgKCEoZHByaXYtPmZsYWdzICYgKE5lZWRJRFIgfCBOZWVkSURUKSkgfHwKKwkJICAgIChkcHJpdi0+aXF0eFtjdXJdICYgWHByKSkKKwkJCWJyZWFrOworCQlzbXBfcm1iKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxMCk7CisJfSB3aGlsZSAoKytpID4gMCk7CisKKwlyZXR1cm4gKGkgPj0gMCApID8gaSA6IC1FQUdBSU47Cit9CisKKyNpZiAwIC8qIGRzY2M0X3tyeC90eH1fcmVzZXQgYXJlIGJvdGggdW5yZWxpYWJsZSAtIG1vcmUgdHdlYWsgbmVlZGVkICovCitzdGF0aWMgdm9pZCBkc2NjNF9yeF9yZXNldChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHByaXYtPnBjaV9wcml2LT5sb2NrLCBmbGFncyk7CisJLyogQ2YgZXJyYXRhIERTNSBwLjYgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMCwgZHByaXYtPmJhc2VfYWRkciArIENIMExSREEgKyBkcHJpdi0+ZGV2X2lkKjQpOworCXNjY19wYXRjaGwoUG93ZXJVcCwgMCwgZHByaXYsIGRldiwgQ0NSMCk7CisJcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIENIMExSREEgKyBkcHJpdi0+ZGV2X2lkKjQpOworCXdyaXRlbChNVEZpfFJkciwgZHByaXYtPmJhc2VfYWRkciArIGRwcml2LT5kZXZfaWQqMHgwYyArIENIMENGRyk7CisJd3JpdGVsKEFjdGlvbiwgZHByaXYtPmJhc2VfYWRkciArIEdDTURSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcHJpdi0+cGNpX3ByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgdm9pZCBkc2NjNF90eF9yZXNldChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUxNiBpID0gMDsKKworCS8qIENmIGVycmF0YSBEUzUgcC43ICovCisJc2NjX3BhdGNobChQb3dlclVwLCAwLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKwlzY2Nfd3JpdGVsKDB4MDAwNTAwMDAsIGRwcml2LCBkZXYsIENDUjIpOworCS8qCisJICogTXVzdCBiZSBsb25nZXIgdGhhbiB0aGUgdGltZSByZXF1aXJlZCB0byBmaWxsIHRoZSBmaWZvLgorCSAqLworCXdoaWxlICghZHNjYzRfdHhfcXVpZXNjZW50KGRwcml2LCBkZXYpICYmICsraSkgeworCQl1ZGVsYXkoMSk7CisJCXdtYigpOworCX0KKworCXdyaXRlbChNVEZpfFJkdCwgZHByaXYtPmJhc2VfYWRkciArIGRwcml2LT5kZXZfaWQqMHgwYyArIENIMENGRyk7CisJaWYgKGRzY2M0X2RvX2FjdGlvbihkZXYsICJSZHQiKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IHJlc2V0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKK30KKyNlbmRpZgorCisvKiBUT0RPOiAoYWIpdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVmaWxsIGEgY29tcGxldGVseSBkZXBsZXRlZCBSWCByaW5nLiAqLworc3RhdGljIGlubGluZSB2b2lkIGRzY2M0X3J4X3NrYihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFJ4RkQgKnJ4X2ZkID0gZHByaXYtPnJ4X2ZkICsgZHByaXYtPnJ4X2N1cnJlbnQlUlhfUklOR19TSVpFOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRwcml2LT5wY2lfcHJpdi0+cGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBwa3RfbGVuOworCisJc2tiID0gZHByaXYtPnJ4X3NrYnVmZltkcHJpdi0+cnhfY3VycmVudCsrJVJYX1JJTkdfU0laRV07CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBza2I9MCAoJXMpXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gcmVmaWxsOworCX0KKwlwa3RfbGVuID0gVE9fU0laRShyeF9mZC0+c3RhdGUyKTsKKwlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHJ4X2ZkLT5kYXRhLCBSWF9NQVgoSERMQ19NQVhfTVJVKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAoKHNrYi0+ZGF0YVstLXBrdF9sZW5dICYgRnJhbWVPaykgPT0gRnJhbWVPaykgeworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbmV0aWZfcngoc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoc2tiLT5kYXRhW3BrdF9sZW5dICYgRnJhbWVSZG8pCisJCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMrKzsKKwkJZWxzZSBpZiAoIShza2ItPmRhdGFbcGt0X2xlbl0gfCB+RnJhbWVDcmMpKQorCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJZWxzZSBpZiAoIShza2ItPmRhdGFbcGt0X2xlbl0gfCB+KEZyYW1lVmZyIHwgRnJhbWVSYWIpKSkKKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWVsc2UKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl9CityZWZpbGw6CisJd2hpbGUgKChkcHJpdi0+cnhfZGlydHkgLSBkcHJpdi0+cnhfY3VycmVudCkgJSBSWF9SSU5HX1NJWkUpIHsKKwkJaWYgKHRyeV9nZXRfcnhfc2tiKGRwcml2LCBkZXYpIDwgMCkKKwkJCWJyZWFrOworCQlkcHJpdi0+cnhfZGlydHkrKzsKKwl9CisJZHNjYzRfcnhfdXBkYXRlKGRwcml2LCBkZXYpOworCXJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCXJ4X2ZkLT5lbmQgPSAweGJhYmVmYWNlOworfQorCitzdGF0aWMgdm9pZCBkc2NjNF9mcmVlMShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcm9vdDsKKwlpbnQgaTsKKworCXBwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXJvb3QgPSBwcHJpdi0+cm9vdDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykKKwkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShkc2NjNF90b19kZXYocm9vdCArIGkpKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykKKwkJZnJlZV9uZXRkZXYocm9vdFtpXS5kZXYpOworCWtmcmVlKHJvb3QpOworCWtmcmVlKHBwcml2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZHNjYzRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpLCByYzsKKworCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dDsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsICJyZWdpc3RlcnMiKTsKKwlpZiAocmMgPCAwKSB7CisJICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCByZXNlcnZlIE1NSU8gcmVnaW9uIChyZWdzKVxuIiwKKwkJCURSVl9OQU1FKTsKKwkgICAgICAgIGdvdG8gZXJyX2Rpc2FibGVfMDsKKwl9CisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMSwgIkxCSSBpbnRlcmZhY2UiKTsKKwlpZiAocmMgPCAwKSB7CisJICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCByZXNlcnZlIE1NSU8gcmVnaW9uIChsYmkpXG4iLAorCQkJRFJWX05BTUUpOworCSAgICAgICAgZ290byBlcnJfZnJlZV9tbWlvX3JlZ2lvbl8xOworCX0KKworCWlvYWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAoIWlvYWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgcmVtYXAgTU1JTyByZWdpb24gJWx4IEAgJWx4XG4iLAorCQkJRFJWX05BTUUsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksCisJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX2ZyZWVfbW1pb19yZWdpb25zXzI7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJTaWVtZW5zIERTQ0M0LCBNTUlPIGF0ICUjbHggKHJlZ3MpLCAlI2x4IChsYmkpLCBJUlEgJWRcbiIsCisJICAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJICAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIHBkZXYtPmlycSk7CisKKwkvKiBDZiBlcnJhdGEgRFM1IHAuMiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHhmOCk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyYyA9IGRzY2M0X2ZvdW5kMShwZGV2LCBpb2FkZHIpOworCWlmIChyYyA8IDApCisJICAgICAgICBnb3RvIGVycl9pb3VubWFwXzM7CisKKwlwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmMgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGRzY2M0X2lycSwgU0FfU0hJUlEsIERSVl9OQU1FLCBwcml2LT5yb290KTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJUlEgJWQgYnVzeVxuIiwgRFJWX05BTUUsIHBkZXYtPmlycSk7CisJCWdvdG8gZXJyX3JlbGVhc2VfNDsKKwl9CisKKwkvKiBwb3dlciB1cC9saXR0bGUgZW5kaWFuL2RtYSBjb3JlIGNvbnRyb2xsZWQgdmlhIGxyZGEvbHRkYSAqLworCXdyaXRlbCgweDAwMDAwMDAxLCBpb2FkZHIgKyBHTU9ERSk7CisJLyogU2hhcmVkIGludGVycnVwdCBxdWV1ZSAqLworCXsKKwkJdTMyIGJpdHM7CisKKwkJYml0cyA9IChJUlFfUklOR19TSVpFID4+IDUpIC0gMTsKKwkJYml0cyB8PSBiaXRzIDw8IDQ7CisJCWJpdHMgfD0gYml0cyA8PCA4OworCQliaXRzIHw9IGJpdHMgPDwgMTY7CisJCXdyaXRlbChiaXRzLCBpb2FkZHIgKyBJUUxFTlIwKTsKKwl9CisJLyogR2xvYmFsIGludGVycnVwdCBxdWV1ZSAqLworCXdyaXRlbCgodTMyKSgoKElSUV9SSU5HX1NJWkUgPj4gNSkgLSAxKSA8PCAyMCksIGlvYWRkciArIElRTEVOUjEpOworCXByaXYtPmlxY2ZnID0gKHUzMiAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQlJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLCAmcHJpdi0+aXFjZmdfZG1hKTsKKwlpZiAoIXByaXYtPmlxY2ZnKQorCQlnb3RvIGVycl9mcmVlX2lycV81OworCXdyaXRlbChwcml2LT5pcWNmZ19kbWEsIGlvYWRkciArIElRQ0ZHKTsKKworCXJjID0gLUVOT01FTTsKKworCS8qCisJICogU0NDIDAtMyBwcml2YXRlIHJ4L3R4IGlycSBzdHJ1Y3R1cmVzCisJICogSVFSWC9UWGkgbmVlZHMgdG8gYmUgc2V0IHNvb24uIExlYXJuZWQgaXQgdGhlIGhhcmQgd2F5Li4uCisJICovCisJZm9yIChpID0gMDsgaSA8IGRldl9wZXJfY2FyZDsgaSsrKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCWRwcml2LT5pcXR4ID0gKHUzMiAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgJmRwcml2LT5pcXR4X2RtYSk7CisJCWlmICghZHByaXYtPmlxdHgpCisJCQlnb3RvIGVycl9mcmVlX2lxdHhfNjsKKwkJd3JpdGVsKGRwcml2LT5pcXR4X2RtYSwgaW9hZGRyICsgSVFUWDAgKyBpKjQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspIHsKKwkJZHByaXYgPSBwcml2LT5yb290ICsgaTsKKwkJZHByaXYtPmlxcnggPSAodTMyICopIHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQlJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLCAmZHByaXYtPmlxcnhfZG1hKTsKKwkJaWYgKCFkcHJpdi0+aXFyeCkKKwkJCWdvdG8gZXJyX2ZyZWVfaXFyeF83OworCQl3cml0ZWwoZHByaXYtPmlxcnhfZG1hLCBpb2FkZHIgKyBJUVJYMCArIGkqNCk7CisJfQorCisJLyogQ2YgYXBwbGljYXRpb24gaGludC4gQmV3YXJlIG9mIGhhcmQtbG9jayBjb25kaXRpb24gb24gdGhyZXNob2xkLiAqLworCXdyaXRlbCgweDQyMTA0MDAwLCBpb2FkZHIgKyBGSUZPQ1IxKTsKKwkvL3dyaXRlbCgweDljZTY5ODAwLCBpb2FkZHIgKyBGSUZPQ1IyKTsKKwl3cml0ZWwoMHhkZWY2ZDgwMCwgaW9hZGRyICsgRklGT0NSMik7CisJLy93cml0ZWwoMHgxMTExMTExMSwgaW9hZGRyICsgRklGT0NSNCk7CisJd3JpdGVsKDB4MTgxODE4MTgsIGlvYWRkciArIEZJRk9DUjQpOworCS8vIEZJWE1FOiBzaG91bGQgZGVwZW5kIG9uIHRoZSBjaGlwc2V0IHJldmlzaW9uCisJd3JpdGVsKDB4MDAwMDAwMGUsIGlvYWRkciArIEZJRk9DUjMpOworCisJd3JpdGVsKDB4ZmYyMDAwMDEsIGlvYWRkciArIEdDTURSKTsKKworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CisKK2Vycl9mcmVlX2lxcnhfNzoKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJZHByaXYgPSBwcml2LT5yb290ICsgaTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLAorCQkJCSAgICBkcHJpdi0+aXFyeCwgZHByaXYtPmlxcnhfZG1hKTsKKwl9CisJaSA9IGRldl9wZXJfY2FyZDsKK2Vycl9mcmVlX2lxdHhfNjoKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJZHByaXYgPSBwcml2LT5yb290ICsgaTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLAorCQkJCSAgICBkcHJpdi0+aXF0eCwgZHByaXYtPmlxdHhfZG1hKTsKKwl9CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLCBwcml2LT5pcWNmZywKKwkJCSAgICBwcml2LT5pcWNmZ19kbWEpOworZXJyX2ZyZWVfaXJxXzU6CisJZnJlZV9pcnEocGRldi0+aXJxLCBwcml2LT5yb290KTsKK2Vycl9yZWxlYXNlXzQ6CisJZHNjYzRfZnJlZTEocGRldik7CitlcnJfaW91bm1hcF8zOgorCWlvdW5tYXAgKGlvYWRkcik7CitlcnJfZnJlZV9tbWlvX3JlZ2lvbnNfMjoKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7CitlcnJfZnJlZV9tbWlvX3JlZ2lvbl8xOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK2Vycl9kaXNhYmxlXzA6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWdvdG8gb3V0OworfTsKKworLyoKKyAqIExldCdzIGhvcGUgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBkZWNlbnQgZW5vdWdoIHRvIHByb3RlY3QgbXkKKyAqIGZlZXQgZnJvbSB0aGUgdXNlcidzIGd1biAtIFVlaW1vcgorICovCitzdGF0aWMgdm9pZCBkc2NjNF9pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5vIGludGVycnVwdHMsIFNDQyBjb3JlIGRpc2FibGVkLiBMZXQncyByZWxheCAqLworCXNjY193cml0ZWwoMHgwMDAwMDAwMCwgZHByaXYsIGRldiwgQ0NSMCk7CisKKwlzY2Nfd3JpdGVsKExlbmd0aENoZWNrIHwgKEhETENfTUFYX01SVSA+PiA1KSwgZHByaXYsIGRldiwgUkxDUik7CisKKwkvKgorCSAqIE5vIGFkZHJlc3MgcmVjb2duaXRpb24vY3JjLUNDSVRUL2N0cyBlbmFibGVkCisJICogU2hhcmVkIGZsYWdzIHRyYW5zbWlzc2lvbiBkaXNhYmxlZCAtIGNmIGVycmF0YSBEUzUgcC4xMQorCSAqIENhcnJpZXIgZGV0ZWN0IGRpc2FibGVkIC0gY2YgZXJyYXRhIHAuMTQKKwkgKiBGSVhNRTogY2FycmllciBkZXRlY3Rpb24vcG9sYXJpdHkgbWF5IGJlIGhhbmRsZWQgbW9yZSBncmFjZWZ1bGx5LgorCSAqLworCXNjY193cml0ZWwoMHgwMjQwODAwMCwgZHByaXYsIGRldiwgQ0NSMSk7CisKKwkvKiBjcmMgbm90IGZvcndhcmRlZCAtIENmIGVycmF0YSBEUzUgcC4xMSAqLworCXNjY193cml0ZWwoMHgwMDA1MDAwOCAmIH5SeEFjdGl2YXRlLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkvLyBjcmMgZm9yd2FyZGVkCisJLy9zY2Nfd3JpdGVsKDB4MDAyNTAwMDggJiB+UnhBY3RpdmF0ZSwgZHByaXYsIGRldiwgQ0NSMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzY2M0X3NldF9xdWFydHooc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgaW50IGh6KQoreworCWludCByZXQgPSAwOworCisJaWYgKChoeiA8IDApIHx8IChoeiA+IERTQ0M0X0haX01BWCkpCisJCXJldCA9IC1FT1BOT1RTVVBQOworCWVsc2UKKwkJZHByaXYtPnBjaV9wcml2LT54dGFsX2h6ID0gaHo7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X2ZvdW5kMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdjsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnJvb3Q7CisJaW50IGksIHJldCA9IC1FTk9NRU07CisKKwlyb290ID0ga21hbGxvYyhkZXZfcGVyX2NhcmQqc2l6ZW9mKCpyb290KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyb290KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGFsbG9jYXRlIGRhdGFcbiIsIERSVl9OQU1FKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwltZW1zZXQocm9vdCwgMCwgZGV2X3Blcl9jYXJkKnNpemVvZigqcm9vdCkpOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wZXJfY2FyZDsgaSsrKSB7CisJCXJvb3RbaV0uZGV2ID0gYWxsb2NfaGRsY2Rldihyb290ICsgaSk7CisJCWlmICghcm9vdFtpXS5kZXYpCisJCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisKKwlwcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHByaXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iLCBEUlZfTkFNRSk7CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKwltZW1zZXQocHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYpKTsKKworCXBwcml2LT5yb290ID0gcm9vdDsKKwlzcGluX2xvY2tfaW5pdCgmcHByaXYtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wZXJfY2FyZDsgaSsrKSB7CisJCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSByb290ICsgaTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmQgPSBkc2NjNF90b19kZXYoZHByaXYpOworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGQpOworCisJICAgICAgICBkLT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CisJCWQtPmluaXQgPSBOVUxMOworCSAgICAgICAgZC0+aXJxID0gcGRldi0+aXJxOworCSAgICAgICAgZC0+b3BlbiA9IGRzY2M0X29wZW47CisJICAgICAgICBkLT5zdG9wID0gZHNjYzRfY2xvc2U7CisJCWQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IE5VTEw7CisJICAgICAgICBkLT5kb19pb2N0bCA9IGRzY2M0X2lvY3RsOworCQlkLT50eF90aW1lb3V0ID0gZHNjYzRfdHhfdGltZW91dDsKKwkJZC0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCQlTRVRfTU9EVUxFX09XTkVSKGQpOworCQlTRVRfTkVUREVWX0RFVihkLCAmcGRldi0+ZGV2KTsKKworCQlkcHJpdi0+ZGV2X2lkID0gaTsKKwkJZHByaXYtPnBjaV9wcml2ID0gcHByaXY7CisJCWRwcml2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJCXNwaW5fbG9ja19pbml0KCZkcHJpdi0+bG9jayk7CisKKwkJaGRsYy0+eG1pdCA9IGRzY2M0X3N0YXJ0X3htaXQ7CisJCWhkbGMtPmF0dGFjaCA9IGRzY2M0X2hkbGNfYXR0YWNoOworCisJCWRzY2M0X2luaXRfcmVnaXN0ZXJzKGRwcml2LCBkKTsKKwkJZHByaXYtPnBhcml0eSA9IFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQ7CisJCWRwcml2LT5lbmNvZGluZyA9IEVOQ09ESU5HX05SWjsKKwkKKwkJcmV0ID0gZHNjYzRfaW5pdF9yaW5nKGQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwkJcmV0ID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXJcbiIsIERSVl9OQU1FKTsKKwkJCWRzY2M0X3JlbGVhc2VfcmluZyhkcHJpdik7CisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCSAgICAgICAgfQorCX0KKworCXJldCA9IGRzY2M0X3NldF9xdWFydHoocm9vdCwgcXVhcnR6KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdW5yZWdpc3RlcjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwcHJpdik7CisJcmV0dXJuIHJldDsKKworZXJyX3VucmVnaXN0ZXI6CisJd2hpbGUgKGktLSA+IDApIHsKKwkJZHNjYzRfcmVsZWFzZV9yaW5nKHJvb3QgKyBpKTsKKwkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShkc2NjNF90b19kZXYocm9vdCArIGkpKTsKKwl9CisJa2ZyZWUocHByaXYpOworCWkgPSBkZXZfcGVyX2NhcmQ7CitlcnJfZnJlZV9kZXY6CisJd2hpbGUgKGktLSA+IDApCisJCWZyZWVfbmV0ZGV2KHJvb3RbaV0uZGV2KTsKKwlrZnJlZShyb290KTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK307CisKKy8qIEZJWE1FOiBnZXQgcmlkIG9mIHRoZSB1bm5lZWRlZCBjb2RlICovCitzdGF0aWMgdm9pZCBkc2NjNF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKy8vCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXY7CisKKwlnb3RvIGRvbmU7Citkb25lOgorICAgICAgICBkcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUWF9USU1FT1VUOworICAgICAgICBhZGRfdGltZXIoJmRwcml2LT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGRzY2M0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBGSVhNRTogc29tZXRoaW5nIGlzIG1pc3NpbmcgdGhlcmUgKi8KK30KKworc3RhdGljIGludCBkc2NjNF9sb29wYmFja19jaGVjayhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzZXR0aW5ncyA9ICZkcHJpdi0+c2V0dGluZ3M7CisKKwlpZiAoc2V0dGluZ3MtPmxvb3BiYWNrICYmIChzZXR0aW5ncy0+Y2xvY2tfdHlwZSAhPSBDTE9DS19JTlQpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc2NjNF90b19kZXYoZHByaXYpOworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb29wYmFjayByZXF1aXJlcyBjbG9ja1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19EU0NDNF9QQ0lfUlNUCisvKgorICogU29tZSBEU0NDNC1iYXNlZCBjYXJkcyB3aXJlcyB0aGUgR1BJTyBwb3J0IGFuZCB0aGUgUENJICNSU1QgcGluIHRvZ2V0aGVyCisgKiBzbyBhcyB0byBwcm92aWRlIGEgc2FmZSB3YXkgdG8gcmVzZXQgdGhlIGFzaWMgd2hpbGUgbm90IHRoZSB3aG9sZSBtYWNoaW5lCisgKiByZWJvb3RpbmcuCisgKgorICogVGhpcyBjb2RlIGRvZXNuJ3QgbmVlZCB0byBiZSBlZmZpY2llbnQuIEtlZXAgSXQgU2ltcGxlCisgKi8KK3N0YXRpYyB2b2lkIGRzY2M0X3BjaV9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaW50IGk7CisKKwlkb3duKCZkc2NjNF9zZW0pOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgaSA8PCAyLCBkc2NjNF9wY2lfY29uZmlnX3N0b3JlICsgaSk7CisKKwkvKiBNYXhpbWFsIExCSSBjbG9jayBkaXZpZGVyICh3aG8gY2FyZXMgPykgYW5kIHdob2xlIEdQSU8gcmFuZ2UuICovCisJd3JpdGVsKDB4MDAxYzAwMDAsIGlvYWRkciArIEdNT0RFKTsKKwkvKiBDb25maWd1cmUgR1BJTyBwb3J0IGFzIG91dHB1dCAqLworCXdyaXRlbCgweDAwMDBmZmZmLCBpb2FkZHIgKyBHUERJUik7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRpb24gKi8KKwl3cml0ZWwoMHgwMDAwZmZmZiwgaW9hZGRyICsgR1BJTSk7CisKKwl3cml0ZWwoMHgwMDAwZmZmZiwgaW9hZGRyICsgR1BEQVRBKTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgaW9hZGRyICsgR1BEQVRBKTsKKworCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KKwlyZWFkbChpb2FkZHIgKyBHU1RBUik7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCgxMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBpIDw8IDIsIGRzY2M0X3BjaV9jb25maWdfc3RvcmVbaV0pOworCXVwKCZkc2NjNF9zZW0pOworfQorI2Vsc2UKKyNkZWZpbmUgZHNjYzRfcGNpX3Jlc2V0KHBkZXYsaW9hZGRyKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfRFNDQzRfUENJX1JTVCAqLworCitzdGF0aWMgaW50IGRzY2M0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXY7CisJaW50IHJldCA9IC1FQUdBSU47CisKKwlpZiAoKGRzY2M0X2xvb3BiYWNrX2NoZWNrKGRwcml2KSA8IDApIHx8ICFkZXYtPmhhcmRfc3RhcnRfeG1pdCkKKwkJZ290byBlcnI7CisKKwlpZiAoKHJldCA9IGhkbGNfb3BlbihkZXYpKSkKKwkJZ290byBlcnI7CisKKwlwcHJpdiA9IGRwcml2LT5wY2lfcHJpdjsKKworCS8qCisJICogRHVlIHRvIHZhcmlvdXMgYnVncywgdGhlcmUgaXMgbm8gd2F5IHRvIHJlbGlhYmx5IHJlc2V0IGEKKwkgKiBzcGVjaWZpYyBwb3J0IChtYW51ZmFjdHVyZXIncyBkZXBlbmRhbnQgc3BlY2lhbCBQQ0kgI1JTVCB3aXJpbmcKKwkgKiBhcGFydDogaXQgYWZmZWN0cyBhbGwgcG9ydHMpLiBUaHVzIHRoZSBkZXZpY2UgZ29lcyBpbiB0aGUgYmVzdAorCSAqIHNpbGVudCBtb2RlIHBvc3NpYmxlIGF0IGRzY2M0X2Nsb3NlKCkgdGltZSBhbmQgc2ltcGx5IGNsYWltcyB0bworCSAqIGJlIHVwIGlmIGl0J3Mgb3BlbmVkIGFnYWluLiBJdCBzdGlsbCBpc24ndCBwb3NzaWJsZSB0byBjaGFuZ2UKKwkgKiB0aGUgSERMQyBjb25maWd1cmF0aW9uIHdpdGhvdXQgcmVib290aW5nIGJ1dCBhdCBsZWFzdCB0aGUgcG9ydHMKKwkgKiBjYW4gYmUgdXAvZG93biBpZmNvbmZpZydlZCB3aXRob3V0IGtpbGxpbmcgdGhlIGhvc3QuCisJICovCisJaWYgKGRwcml2LT5mbGFncyAmIEZha2VSZXNldCkgeworCQlkcHJpdi0+ZmxhZ3MgJj0gfkZha2VSZXNldDsKKwkJc2NjX3BhdGNobCgwLCBQb3dlclVwLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKwkJc2NjX3BhdGNobCgwLCAweDAwMDUwMDAwLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkJc2NjX3dyaXRlbChFdmVudHNNYXNrLCBkcHJpdiwgZGV2LCBJTVIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogdXAgYWdhaW4uXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogSURUK0lEUiBkdXJpbmcgWFBSICovCisJZHByaXYtPmZsYWdzID0gTmVlZElEUiB8IE5lZWRJRFQ7CisKKwlzY2NfcGF0Y2hsKDAsIFBvd2VyVXAgfCBWaXMsIGRwcml2LCBkZXYsIENDUjApOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGlzIGEgYml0IHBhcmFub2lkLi4uCisJICoKKwkgKiBOQjogdGhlIGRhdGFzaGVldCAiLi4uQ0VDIHdpbGwgc3RheSBhY3RpdmUgaWYgdGhlIFNDQyBpcyBpbgorCSAqIHBvd2VyLWRvd24gbW9kZSBvci4uLiIgYW5kIENDUjIuUkFDID0gMSBhcmUgdHdvIGRpZmZlcmVudAorCSAqIHNpdHVhdGlvbnMuCisJICovCisJaWYgKHNjY19yZWFkbF9zdGFyKGRwcml2LCBkZXYpICYgU2NjQnVzeSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIGJ1c3kuIFRyeSBsYXRlclxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnJfb3V0OworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogYXZhaWxhYmxlLiBHb29kXG4iLCBkZXYtPm5hbWUpOworCisJc2NjX3dyaXRlbChFdmVudHNNYXNrLCBkcHJpdiwgZGV2LCBJTVIpOworCisJLyogUG9zdGVkIHdyaXRlIGlzIGZsdXNoZWQgaW4gdGhlIHdhaXRfYWNrIGxvb3AgKi8KKwlzY2Nfd3JpdGVsKFR4U2NjUmVzIHwgUnhTY2NSZXMsIGRwcml2LCBkZXYsIENNRFIpOworCisJaWYgKChyZXQgPSBkc2NjNF93YWl0X2Fja19jZWMoZHByaXYsIGRldiwgIkNlYyIpKSA8IDApCisJCWdvdG8gZXJyX2Rpc2FibGVfc2NjX2V2ZW50czsKKworCS8qCisJICogSSB3b3VsZCBleHBlY3QgWFBSIG5lYXIgQ0UgY29tcGxldGlvbiAoYmVmb3JlID8gYWZ0ZXIgPykuCisJICogQXQgd29yc3QsIHRoaXMgY29kZSB3b24ndCBzZWUgYSBsYXRlIFhQUiBhbmQgcGVvcGxlCisJICogd2lsbCBoYXZlIHRvIHJlLWlzc3VlIGFuIGlmY29uZmlnICh0aGlzIGlzIGhhcm1sZXNzKS4KKwkgKiBXQVJOSU5HLCBhIHJlYWxseSBtaXNzaW5nIFhQUiB1c3VhbGx5IG1lYW5zIGEgaGFyZHdhcmUKKwkgKiByZXNldCBpcyBuZWVkZWQuIFN1Z2dlc3Rpb25zIGFueW9uZSA/CisJICovCisJaWYgKChyZXQgPSBkc2NjNF94cHJfYWNrKGRwcml2KSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIHRpbWVvdXRcbiIsIERSVl9OQU1FLCAiWFBSIik7CisJCWdvdG8gZXJyX2Rpc2FibGVfc2NjX2V2ZW50czsKKwl9CisJCisJaWYgKGRlYnVnID4gMikKKwkJZHNjYzRfdHhfcHJpbnQoZGV2LCBkcHJpdiwgIk9wZW4iKTsKKworZG9uZToKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgICAgIGluaXRfdGltZXIoJmRwcml2LT50aW1lcik7CisgICAgICAgIGRwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEwKkhaOworICAgICAgICBkcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKyAgICAgICAgZHByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJmRzY2M0X3RpbWVyOworICAgICAgICBhZGRfdGltZXIoJmRwcml2LT50aW1lcik7CisJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlX3NjY19ldmVudHM6CisJc2NjX3dyaXRlbCgweGZmZmZmZmZmLCBkcHJpdiwgZGV2LCBJTVIpOworCXNjY19wYXRjaGwoUG93ZXJVcCB8IFZpcywgMCwgZHByaXYsIGRldiwgQ0NSMCk7CitlcnJfb3V0OgorCWhkbGNfY2xvc2UoZGV2KTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgRFNDQzRfUE9MTElORworc3RhdGljIGludCBkc2NjNF90eF9wb2xsKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogRklYTUU6IGl0J3MgZ29ubmEgYmUgZWFzeSAoVE0pLCBmb3Igc3VyZSAqLworfQorI2VuZGlmIC8qIERTQ0M0X1BPTExJTkcgKi8KKworc3RhdGljIGludCBkc2NjNF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2ID0gZHByaXYtPnBjaV9wcml2OworCXN0cnVjdCBUeEZEICp0eF9mZDsKKwlpbnQgbmV4dDsKKworCW5leHQgPSBkcHJpdi0+dHhfY3VycmVudCVUWF9SSU5HX1NJWkU7CisJZHByaXYtPnR4X3NrYnVmZltuZXh0XSA9IHNrYjsKKwl0eF9mZCA9IGRwcml2LT50eF9mZCArIG5leHQ7CisJdHhfZmQtPnN0YXRlID0gRnJhbWVFbmQgfCBUT19TVEFURV9UWChza2ItPmxlbik7CisJdHhfZmQtPmRhdGEgPSBwY2lfbWFwX3NpbmdsZShwcHJpdi0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCXR4X2ZkLT5jb21wbGV0ZSA9IDB4MDAwMDAwMDA7CisJdHhfZmQtPmppZmZpZXMgPSBqaWZmaWVzOworCW1iKCk7CisKKyNpZmRlZiBEU0NDNF9QT0xMSU5HCisJc3Bpbl9sb2NrKCZkcHJpdi0+bG9jayk7CisJd2hpbGUgKGRzY2M0X3R4X3BvbGwoZHByaXYsIGRldikpOworCXNwaW5fdW5sb2NrKCZkcHJpdi0+bG9jayk7CisjZW5kaWYKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKGRlYnVnID4gMikKKwkJZHNjYzRfdHhfcHJpbnQoZGV2LCBkcHJpdiwgIlhtaXQiKTsKKwkvKiBUbyBiZSBjbGVhbmVkKHVuc2lnbmVkIGludCkvb3B0aW1pemVkLiBMYXRlciwgb2sgPyAqLworCWlmICghKCgrK2Rwcml2LT50eF9jdXJyZW50IC0gZHByaXYtPnR4X2RpcnR5KSVUWF9SSU5HX1NJWkUpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoZHNjYzRfdHhfcXVpZXNjZW50KGRwcml2LCBkZXYpKQorCQlkc2NjNF9kb190eChkcHJpdiwgZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzY2M0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZkcHJpdi0+dGltZXIpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNjY19wYXRjaGwoUG93ZXJVcCB8IFZpcywgMCwgZHByaXYsIGRldiwgQ0NSMCk7CisJc2NjX3BhdGNobCgweDAwMDUwMDAwLCAwLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwlzY2Nfd3JpdGVsKDB4ZmZmZmZmZmYsIGRwcml2LCBkZXYsIElNUik7CisKKwlkcHJpdi0+ZmxhZ3MgfD0gRmFrZVJlc2V0OworCisJaGRsY19jbG9zZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzY2M0X2NoZWNrX2Nsb2NrX2FiaWxpdHkoaW50IHBvcnQpCit7CisJaW50IHJldCA9IDA7CisKKyNpZmRlZiBDT05GSUdfRFNDQzRfUENJU1lOQworCWlmIChwb3J0ID49IDIpCisJCXJldCA9IC0xOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERTMSBwLjEzNzogIlRoZXJlIGFyZSBhIHRvdGFsIG9mIDEzIGRpZmZlcmVudCBjbG9ja2luZyBtb2Rlcy4uLiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eCisgKiBEZXNpZ24gY2hvaWNlczoKKyAqIC0gYnkgZGVmYXVsdCwgYXNzdW1lIGEgY2xvY2sgaXMgcHJvdmlkZWQgb24gcGluIFJ4Q2xrL1R4Q2xrIChjbG9jayBtb2RlIDBhKS4KKyAqICAgQ2xvY2sgbW9kZSAzYiBfc2hvdWxkXyB3b3JrIGJ1dCB0aGUgdGVzdGluZyBzZWVtcyB0byBtYWtlIHRoaXMgcG9pbnQKKyAqICAgZHViaW91cyAoRElZIHRlc3RpbmcgcmVxdWlyZXMgc2V0dGluZyBDQ1IwIGF0IDB4MDAwMDAwMzMpLgorICogICBUaGlzIGlzIHN1cHBvc2VkIHRvIHByb3ZpZGUgbGVhc3Qgc3VycHJpc2UgIkRURSBsaWtlIiBiZWhhdmlvci4KKyAqIC0gaWYgbGluZSByYXRlIGlzIHNwZWNpZmllZCwgY2xvY2tzIGFyZSBhc3N1bWVkIHRvIGJlIGxvY2FsbHkgZ2VuZXJhdGVkLgorICogICBBIHF1YXJ0eiBtdXN0IGJlIGF2YWlsYWJsZSAob24gcGluIFhUQUwxKS4gTW9kZXMgNmIvN2IgYXJlIHVzZWQuIENob29zaW5nCisgKiAgIGJldHdlZW4gdGhlc2UgaXQgYXV0b21hZ2ljYWxseSBkb25lIGFjY29yZGluZyBvbiB0aGUgcmVxdWlyZWQgZnJlcXVlbmN5CisgKiAgIHNjYWxpbmcuIE9mIGNvdXJzZSBzb21lIHJvdW5kaW5nIG1heSB0YWtlIHBsYWNlLgorICogLSBubyBoaWdoIHNwZWVkIG1vZGUgKDQwTWIvcykuIE1heSBiZSB0cml2aWFsIHRvIGRvIGJ1dCBJIGRvbid0IGhhdmUgYW4KKyAqICAgYXBwcm9wcmlhdGUgZXh0ZXJuYWwgY2xvY2tpbmcgZGV2aWNlIGZvciB0ZXN0aW5nLgorICogLSBubyB0aW1lLXNsb3QvY2xvY2sgbW9kZSA1OiBzaGFtZWxlc3MgbGF6eW5lc3MuCisgKgorICogVGhlIGNsb2NrIHNpZ25hbHMgd2lyaW5nIGNhbiBiZSAoaXMgPykgbWFudWZhY3R1cmVyIGRlcGVuZGFudC4gR29vZCBsdWNrLgorICoKKyAqIEJJRyBGQVQgV0FSTklORzogaWYgdGhlIGRldmljZSBpc24ndCBwcm92aWRlZCBlbm91Z2ggY2xvY2tpbmcgc2lnbmFsLCBpdAorICogd29uJ3QgcGFzcyB0aGUgaW5pdCBzZXF1ZW5jZS4gRm9yIGV4YW1wbGUsIHN0cmFpZ2h0IGJhY2stdG8tYmFjayBEVEUgd2l0aG91dAorICogZXh0ZXJuYWwgY2xvY2sgd2lsbCBmYWlsIHdoZW4gZHNjYzRfb3BlbigpICg8LSAnaWZjb25maWcgaGRsY3ggeHh4JykgaXMKKyAqIGNhbGxlZC4KKyAqCisgKiBUeXBvcyBsdXJrIGluIGRhdGFzaGVldCAobWlzc2luZyBkaXZpZXIgaW4gY2xvY2sgbW9kZSA3YSBmaWd1cmUgNTEgcC4xNTMKKyAqIERTMCBmb3IgZXhhbXBsZSkKKyAqCisgKiBDbG9jayBtb2RlIHJlbGF0ZWQgYml0cyBvZiBDQ1IwOgorICogICAgICstLS0tLS0tLS0tLS0gVE9FOiBvdXRwdXQgVHhDbGsgKDBiLzJiLzNhLzNiLzZiLzdhLzdiIG9ubHkpCisgKiAgICAgfCArLS0tLS0tLS0tLSBTU0VMOiBzdWItbW9kZSBzZWxlY3QgMCAtPiBhLCAxIC0+IGIKKyAqICAgICB8IHwgKy0tLS0tLS0tIEhpZ2ggU3BlZWQ6IHNheSAwCisgKiAgICAgfCB8IHwgKy0rLSstLSBDbG9jayBNb2RlOiAwLi43CisgKiAgICAgfCB8IHwgfCB8IHwKKyAqIC0rLSstKy0rLSstKy0rLSsKKyAqIHh8eHw1fDR8M3wyfDF8MHwgbG93ZXIgYml0cworICoKKyAqIERpdmlzaW9uIGZhY3RvciBvZiBCUlI6IGsgPSAoTisxKXgyXk0gKHRvdGFsIGRpdmlkZXIgPSAxNnhrIGluIG1vZGUgNmIpCisgKiAgICAgICAgICAgICstKy0rLSstLS0tLS0tLS0tLS0tLS0tLS0gTSAoMC4uMTUpCisgKiAgICAgICAgICAgIHwgfCB8IHwgICAgICstKy0rLSstKy0rLS0gTiAoMC4uNjMpCisgKiAgICAwIDAgMCAwIHwgfCB8IHwgMCAwIHwgfCB8IHwgfCB8CisgKiAuLi4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgZnxlfGR8Y3xifGF8OXw4fDd8Nnw1fDR8M3wyfDF8MHwgbG93ZXIgYml0cworICoKKyAqLworc3RhdGljIGludCBkc2NjNF9zZXRfY2xvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpicHMsIHUzMiAqc3RhdGUpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gLTE7CisJdTMyIGJycjsKKworCSpzdGF0ZSAmPSB+Q2NyMENsb2NrTWFzazsKKwlpZiAoKmJwcykgeyAvKiBDbG9jayBnZW5lcmF0ZWQgLSByZXF1aXJlZCBmb3IgRENFICovCisJCXUzMiBuID0gMCwgbSA9IDAsIGRpdmlkZXI7CisJCWludCB4dGFsOworCisJCXh0YWwgPSBkcHJpdi0+cGNpX3ByaXYtPnh0YWxfaHo7CisJCWlmICgheHRhbCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKGRzY2M0X2NoZWNrX2Nsb2NrX2FiaWxpdHkoZHByaXYtPmRldl9pZCkgPCAwKQorCQkJZ290byBkb25lOworCQlkaXZpZGVyID0geHRhbCAvICpicHM7CisJCWlmIChkaXZpZGVyID4gQlJSX0RJVklERVJfTUFYKSB7CisJCQlkaXZpZGVyID4+PSA0OworCQkJKnN0YXRlIHw9IDB4MDAwMDAwMzY7IC8qIENsb2NrIG1vZGUgNmIgKEJSRy8xNikgKi8KKwkJfSBlbHNlCisJCQkqc3RhdGUgfD0gMHgwMDAwMDAzNzsgLyogQ2xvY2sgbW9kZSA3YiAoQlJHKSAqLworCQlpZiAoZGl2aWRlciA+PiAyMikgeworCQkJbiA9IDYzOworCQkJbSA9IDE1OworCQl9IGVsc2UgaWYgKGRpdmlkZXIpIHsKKwkJCS8qIEV4dHJhY3Rpb24gb2YgdGhlIDYgaGlnaGVzdCB3ZWlnaHRlZCBiaXRzICovCisJCQltID0gMDsKKwkJCXdoaWxlICgweGZmZmZmZmMwICYgZGl2aWRlcikgeworCQkJCW0rKzsKKwkJCQlkaXZpZGVyID4+PSAxOworCQkJfQorCQkJbiA9IGRpdmlkZXI7CisJCX0KKwkJYnJyID0gKG0gPDwgOCkgfCBuOworCQlkaXZpZGVyID0gbiA8PCBtOworCQlpZiAoISgqc3RhdGUgJiAweDAwMDAwMDAxKSkgLyogP2IgbW9kZSBtYXNrID0+IGNsb2NrIG1vZGUgNmIgKi8KKwkJCWRpdmlkZXIgPDw9IDQ7CisJCSpicHMgPSB4dGFsIC8gZGl2aWRlcjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFeHRlcm5hbCBjbG9jayAtIERURQorCQkgKiAic3RhdGUiIGFscmVhZHkgcmVmbGVjdHMgQ2xvY2sgbW9kZSAwYSAoQ0NSMCA9IDB4enp6enp6MDApLgorCQkgKiBOb3RoaW5nIG1vcmUgdG8gYmUgZG9uZQorCQkgKi8KKwkJYnJyID0gMDsKKwl9CisJc2NjX3dyaXRlbChicnIsIGRwcml2LCBkZXYsIEJSUik7CisJcmV0ID0gMDsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoZHByaXYtPnNldHRpbmdzKTsKKwlpbnQgcmV0ID0gMDsKKworICAgICAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZkcHJpdi0+c2V0dGluZ3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZHByaXYtPmZsYWdzICYgRmFrZVJlc2V0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGxlYXNlIHJlc2V0IHRoZSBkZXZpY2UiCisJCQkgICAgICAgIiBiZWZvcmUgdGhpcyBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmRwcml2LT5zZXR0aW5ncywgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gZHNjYzRfc2V0X2lmYWNlKGRwcml2LCBkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfbWF0Y2goc3RydWN0IHRoaW5naWUgKnAsIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHBbaV0uZGVmaW5lICE9IC0xOyBpKyspIHsKKwkJaWYgKHZhbHVlID09IHBbaV0uZGVmaW5lKQorCQkJYnJlYWs7CisJfQorCWlmIChwW2ldLmRlZmluZSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfY2xvY2tfc2V0dGluZyhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgKnNldHRpbmdzID0gJmRwcml2LT5zZXR0aW5nczsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisJdTMyIGJwcywgc3RhdGU7CisKKwlicHMgPSBzZXR0aW5ncy0+Y2xvY2tfcmF0ZTsKKwlzdGF0ZSA9IHNjY19yZWFkbChkcHJpdiwgQ0NSMCk7CisJaWYgKGRzY2M0X3NldF9jbG9jayhkZXYsICZicHMsICZzdGF0ZSkgPCAwKQorCQlnb3RvIGRvbmU7CisJaWYgKGJwcykgeyAvKiBEQ0UgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBnZW5lcmF0ZWQgUnhDbGsgKERDRSlcbiIsIGRldi0+bmFtZSk7CisJCWlmIChzZXR0aW5ncy0+Y2xvY2tfcmF0ZSAhPSBicHMpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY2xvY2sgYWRqdXN0ZWQgKCUwOGQgLT4gJTA4ZClcbiIsCisJCQkJZGV2LT5uYW1lLCBzZXR0aW5ncy0+Y2xvY2tfcmF0ZSwgYnBzKTsKKwkJCXNldHRpbmdzLT5jbG9ja19yYXRlID0gYnBzOworCQl9CisJfSBlbHNlIHsgLyogRFRFICovCisJCXN0YXRlIHw9IFBvd2VyVXAgfCBWaXM7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXh0ZXJuYWwgUnhDbGsgKERURSlcbiIsIGRldi0+bmFtZSk7CisJfQorCXNjY193cml0ZWwoc3RhdGUsIGRwcml2LCBkZXYsIENDUjApOworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfZW5jb2Rpbmdfc2V0dGluZyhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGhpbmdpZSBlbmNvZGluZ1tdID0geworCQl7IEVOQ09ESU5HX05SWiwJCTB4MDAwMDAwMDAgfSwKKwkJeyBFTkNPRElOR19OUlpJLAkweDAwMjAwMDAwIH0sCisJCXsgRU5DT0RJTkdfRk1fTUFSSywJMHgwMDQwMDAwMCB9LAorCQl7IEVOQ09ESU5HX0ZNX1NQQUNFLAkweDAwNTAwMDAwIH0sCisJCXsgRU5DT0RJTkdfTUFOQ0hFU1RFUiwJMHgwMDYwMDAwMCB9LAorCQl7IC0xLAkJCTB9CisJfTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWkgPSBkc2NjNF9tYXRjaChlbmNvZGluZywgZHByaXYtPmVuY29kaW5nKTsKKwlpZiAoaSA+PSAwKQorCQlzY2NfcGF0Y2hsKEVuY29kaW5nTWFzaywgZW5jb2RpbmdbaV0uYml0cywgZHByaXYsIGRldiwgQ0NSMCk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X2xvb3BiYWNrX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgKnNldHRpbmdzID0gJmRwcml2LT5zZXR0aW5nczsKKwl1MzIgc3RhdGU7CisKKwlzdGF0ZSA9IHNjY19yZWFkbChkcHJpdiwgQ0NSMSk7CisJaWYgKHNldHRpbmdzLT5sb29wYmFjaykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxvb3BiYWNrXG4iLCBkZXYtPm5hbWUpOworCQlzdGF0ZSB8PSAweDAwMDAwMTAwOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbm9ybWFsXG4iLCBkZXYtPm5hbWUpOworCQlzdGF0ZSAmPSB+MHgwMDAwMDEwMDsKKwl9CisJc2NjX3dyaXRlbChzdGF0ZSwgZHByaXYsIGRldiwgQ0NSMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfY3JjX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGhpbmdpZSBjcmNbXSA9IHsKKwkJeyBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRULAkweDAwMDAwMDEwIH0sCisJCXsgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCwJMHgwMDAwMDAwMCB9LAorCQl7IFBBUklUWV9DUkMzMl9QUjBfQ0NJVFQsCTB4MDAwMDAwMTEgfSwKKwkJeyBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRULAkweDAwMDAwMDAxIH0KKwl9OworCWludCBpLCByZXQgPSAwOworCisJaSA9IGRzY2M0X21hdGNoKGNyYywgZHByaXYtPnBhcml0eSk7CisJaWYgKGkgPj0gMCkKKwkJc2NjX3BhdGNobChDcmNNYXNrLCBjcmNbaV0uYml0cywgZHByaXYsIGRldiwgQ0NSMSk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X3NldF9pZmFjZShzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB7CisJCWludCAoKmFjdGlvbikoc3RydWN0IGRzY2M0X2Rldl9wcml2ICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworCX0gKnAsIGRvX3NldHRpbmdbXSA9IHsKKwkJeyBkc2NjNF9lbmNvZGluZ19zZXR0aW5nIH0sCisJCXsgZHNjYzRfY2xvY2tfc2V0dGluZyB9LAorCQl7IGRzY2M0X2xvb3BiYWNrX3NldHRpbmcgfSwKKwkJeyBkc2NjNF9jcmNfc2V0dGluZyB9LAorCQl7IE5VTEwgfQorCX07CisJaW50IHJldCA9IDA7CisKKwlmb3IgKHAgPSBkb19zZXR0aW5nOyBwLT5hY3Rpb247IHArKykgeworCQlpZiAoKHJldCA9IHAtPmFjdGlvbihkcHJpdiwgZGV2KSkgPCAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkc2NjNF9pcnEoaW50IGlycSwgdm9pZCAqdG9rZW4sIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290ID0gdG9rZW47CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdTMyIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGhhbmRsZWQgPSAxOworCisJcHJpdiA9IHJvb3QtPnBjaV9wcml2OworCWRldiA9IGRzY2M0X3RvX2Rldihyb290KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpb2FkZHIgPSByb290LT5iYXNlX2FkZHI7CisKKwlzdGF0ZSA9IHJlYWRsKGlvYWRkciArIEdTVEFSKTsKKwlpZiAoIXN0YXRlKSB7CisJCWhhbmRsZWQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGRlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBHU1RBUiA9IDB4JTA4eFxuIiwgRFJWX05BTUUsIHN0YXRlKTsKKwl3cml0ZWwoc3RhdGUsIGlvYWRkciArIEdTVEFSKTsKKworCWlmIChzdGF0ZSAmIEFyZikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsdXJlIChBcmYpLiBIYXJhc3MgdGhlIG1haW50ZW5lclxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0ZSAmPSB+QXJBY2s7CisJaWYgKHN0YXRlICYgQ2ZnKSB7CisJCWlmIChkZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENmZ0lWXG4iLCBEUlZfTkFNRSk7CisJCWlmIChwcml2LT5pcWNmZ1twcml2LT5jZmdfY3VyKyslSVJRX1JJTkdfU0laRV0gJiBBcmYpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBmYWlsZWRcbiIsIGRldi0+bmFtZSwgIkNGRyIpOworCQlpZiAoIShzdGF0ZSAmPSB+Q2ZnKSkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoc3RhdGUgJiBSeEV2dCkgeworCQlpID0gZGV2X3Blcl9jYXJkIC0gMTsKKwkJZG8geworCQkJZHNjYzRfcnhfaXJxKHByaXYsIHJvb3QgKyBpKTsKKwkJfSB3aGlsZSAoLS1pID49IDApOworCQlzdGF0ZSAmPSB+UnhFdnQ7CisJfQorCWlmIChzdGF0ZSAmIFR4RXZ0KSB7CisJCWkgPSBkZXZfcGVyX2NhcmQgLSAxOworCQlkbyB7CisJCQlkc2NjNF90eF9pcnEocHJpdiwgcm9vdCArIGkpOworCQl9IHdoaWxlICgtLWkgPj0gMCk7CisJCXN0YXRlICY9IH5UeEV2dDsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBkc2NjNF90eF9pcnEoc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdiwKKwkJCQlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc2NjNF90b19kZXYoZHByaXYpOworCXUzMiBzdGF0ZTsKKwlpbnQgY3VyLCBsb29wID0gMDsKKwordHJ5OgorCWN1ciA9IGRwcml2LT5pcXR4X2N1cnJlbnQlSVJRX1JJTkdfU0laRTsKKwlzdGF0ZSA9IGRwcml2LT5pcXR4W2N1cl07CisJaWYgKCFzdGF0ZSkgeworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBJU1IgPSAweCUwOHhcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBzdGF0ZSk7CisJCWlmICgoZGVidWcgPiAxKSAmJiAobG9vcCA+IDEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBpcnEgbG9vcD0lZFxuIiwgZGV2LT5uYW1lLCBsb29wKTsKKwkJaWYgKGxvb3AgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJaWYgKChkcHJpdi0+dHhfY3VycmVudCAtIGRwcml2LT50eF9kaXJ0eSklVFhfUklOR19TSVpFKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIGRzY2M0X3R4X3F1aWVzY2VudChkcHJpdiwgZGV2KSAmJgorCQkgICAgIWRzY2M0X3R4X2RvbmUoZHByaXYpKQorCQkJCWRzY2M0X2RvX3R4KGRwcml2LCBkZXYpOworCQlyZXR1cm47CisJfQorCWxvb3ArKzsKKwlkcHJpdi0+aXF0eFtjdXJdID0gMDsKKwlkcHJpdi0+aXF0eF9jdXJyZW50Kys7CisKKwlpZiAoc3RhdGVfY2hlY2soc3RhdGUsIGRwcml2LCBkZXYsICJUeCIpIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKHN0YXRlICYgU2NjRXZ0KSB7CisJCWlmIChzdGF0ZSAmIEFsbHMpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisKKwkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJZHNjYzRfdHhfcHJpbnQoZGV2LCBkcHJpdiwgIkFsbHMiKTsKKwkJCS8qCisJCQkgKiBEYXRhQ29tcGxldGUgY2FuJ3QgYmUgdHJ1c3RlZCBmb3IgVHggY29tcGxldGlvbi4KKwkJCSAqIENmIGVycmF0YSBEUzUgcC44CisJCQkgKi8KKwkJCWN1ciA9IGRwcml2LT50eF9kaXJ0eSVUWF9SSU5HX1NJWkU7CisJCQl0eF9mZCA9IGRwcml2LT50eF9mZCArIGN1cjsKKwkJCXNrYiA9IGRwcml2LT50eF9za2J1ZmZbY3VyXTsKKwkJCWlmIChza2IpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHBwcml2LT5wZGV2LCB0eF9mZC0+ZGF0YSwKKwkJCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJaWYgKHR4X2ZkLT5zdGF0ZSAmIEZyYW1lRW5kKSB7CisJCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQl9CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQlkcHJpdi0+dHhfc2tidWZmW2N1cl0gPSBOVUxMOworCQkJCSsrZHByaXYtPnR4X2RpcnR5OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIFR4OiBOVUxMIHNrYiAlZFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgY3VyKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB0aGUgZHJpdmVyIGVuZHMgc2VuZGluZyBjcmFwIG9uIHRoZSB3aXJlLCBpdAorCQkJICogd2lsbCBiZSB3YXkgZWFzaWVyIHRvIGRpYWdub3NlIHRoYW4gdGhlIChub3Qgc28pCisJCQkgKiByYW5kb20gZnJlZXplIGluZHVjZWQgYnkgbnVsbCBzaXplZCB0eCBmcmFtZXMuCisJCQkgKi8KKwkJCXR4X2ZkLT5kYXRhID0gdHhfZmQtPm5leHQ7CisJCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKDIqRFVNTVlfU0tCX1NJWkUpOworCQkJdHhfZmQtPmNvbXBsZXRlID0gMHgwMDAwMDAwMDsKKwkJCXR4X2ZkLT5qaWZmaWVzID0gMDsKKworCQkJaWYgKCEoc3RhdGUgJj0gfkFsbHMpKQorCQkJCWdvdG8gdHJ5OworCQl9CisJCS8qCisJCSAqIFRyYW5zbWl0IERhdGEgVW5kZXJydW4KKwkJICovCisJCWlmIChzdGF0ZSAmIFhkdSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogWERVLiBBc2sgbWFpbnRhaW5lclxuIiwgRFJWX05BTUUpOworCQkJZHByaXYtPmZsYWdzID0gTmVlZElEVDsKKwkJCS8qIFR4IHJlc2V0ICovCisJCQl3cml0ZWwoTVRGaSB8IFJkdCwKKwkJCSAgICAgICBkcHJpdi0+YmFzZV9hZGRyICsgMHgwYypkcHJpdi0+ZGV2X2lkICsgQ0gwQ0ZHKTsKKwkJCXdyaXRlbChBY3Rpb24sIGRwcml2LT5iYXNlX2FkZHIgKyBHQ01EUik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHN0YXRlICYgQ3RzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ1RTIHRyYW5zaXRpb25cbiIsIGRldi0+bmFtZSk7CisJCQlpZiAoIShzdGF0ZSAmPSB+Q3RzKSkgLyogREVCVUcgKi8KKwkJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBYbXIpIHsKKwkJCS8qIEZyYW1lIG5lZWRzIHRvIGJlIHNlbnQgYWdhaW4gLSBGSVhNRSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogWG1yLiBBc2sgbWFpbnRhaW5lclxuIiwgRFJWX05BTUUpOworCQkJaWYgKCEoc3RhdGUgJj0gflhtcikpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgWHByKSB7CisJCQl2b2lkIF9faW9tZW0gKnNjY19hZGRyOworCQkJdW5zaWduZWQgbG9uZyByaW5nOworCQkJaW50IGk7CisKKwkJCS8qCisJCQkgKiAtIHRoZSBidXN5IGNvbmRpdGlvbiBoYXBwZW5zIChzb21ldGltZXMpOworCQkJICogLSBpdCBkb2Vzbid0IHNlZW0gdG8gbWFrZSB0aGUgaGFuZGxlciB1bnJlbGlhYmxlLgorCQkJICovCisJCQlmb3IgKGkgPSAxOyBpOyBpIDw8PSAxKSB7CisJCQkJaWYgKCEoc2NjX3JlYWRsX3N0YXIoZHByaXYsIGRldikgJiBTY2NCdXN5KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgYnVzeSBpbiBpcnFcbiIsIGRldi0+bmFtZSk7CisKKwkJCXNjY19hZGRyID0gZHByaXYtPmJhc2VfYWRkciArIDB4MGMqZHByaXYtPmRldl9pZDsKKwkJCS8qIEtlZXAgdGhpcyBvcmRlcjogSURUIGJlZm9yZSBJRFIgKi8KKwkJCWlmIChkcHJpdi0+ZmxhZ3MgJiBOZWVkSURUKSB7CisJCQkJaWYgKGRlYnVnID4gMikKKwkJCQkJZHNjYzRfdHhfcHJpbnQoZGV2LCBkcHJpdiwgIlhwciIpOworCQkJCXJpbmcgPSBkcHJpdi0+dHhfZmRfZG1hICsKKwkJCQkgICAgICAgKGRwcml2LT50eF9kaXJ0eSVUWF9SSU5HX1NJWkUpKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IFR4RkQpOworCQkJCXdyaXRlbChyaW5nLCBzY2NfYWRkciArIENIMEJUREEpOworCQkJCWRzY2M0X2RvX3R4KGRwcml2LCBkZXYpOworCQkJCXdyaXRlbChNVEZpIHwgSWR0LCBzY2NfYWRkciArIENIMENGRyk7CisJCQkJaWYgKGRzY2M0X2RvX2FjdGlvbihkZXYsICJJRFQiKSA8IDApCisJCQkJCWdvdG8gZXJyX3hwcjsKKwkJCQlkcHJpdi0+ZmxhZ3MgJj0gfk5lZWRJRFQ7CisJCQl9CisJCQlpZiAoZHByaXYtPmZsYWdzICYgTmVlZElEUikgeworCQkJCXJpbmcgPSBkcHJpdi0+cnhfZmRfZG1hICsKKwkJCQkgICAgICAgKGRwcml2LT5yeF9jdXJyZW50JVJYX1JJTkdfU0laRSkqCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgUnhGRCk7CisJCQkJd3JpdGVsKHJpbmcsIHNjY19hZGRyICsgQ0gwQlJEQSk7CisJCQkJZHNjYzRfcnhfdXBkYXRlKGRwcml2LCBkZXYpOworCQkJCXdyaXRlbChNVEZpIHwgSWRyLCBzY2NfYWRkciArIENIMENGRyk7CisJCQkJaWYgKGRzY2M0X2RvX2FjdGlvbihkZXYsICJJRFIiKSA8IDApCisJCQkJCWdvdG8gZXJyX3hwcjsKKwkJCQlkcHJpdi0+ZmxhZ3MgJj0gfk5lZWRJRFI7CisJCQkJc21wX3dtYigpOworCQkJCS8qIEFjdGl2YXRlIHJlY2VpdmVyIGFuZCBtaXNjICovCisJCQkJc2NjX3dyaXRlbCgweDA4MDUwMDA4LCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkJCX0KKwkJZXJyX3hwcjoKKwkJCWlmICghKHN0YXRlICY9IH5YcHIpKQorCQkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIENkKSB7CisJCQlpZiAoZGVidWcgPiAwKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDRCB0cmFuc2l0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkNkKSkgLyogREVCVUcgKi8KKwkJCQlnb3RvIHRyeTsKKwkJfQorCX0gZWxzZSB7IC8qICEgU2NjRXZ0ICovCisJCWlmIChzdGF0ZSAmIEhpKSB7CisjaWZkZWYgRFNDQzRfUE9MTElORworCQkJd2hpbGUgKCFkc2NjNF90eF9wb2xsKGRwcml2LCBkZXYpKTsKKyNlbmRpZgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4IEhpXG4iLCBkZXYtPm5hbWUpOworCQkJc3RhdGUgJj0gfkhpOworCQl9CisJCWlmIChzdGF0ZSAmIEVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4IEVSUlxuIiwgZGV2LT5uYW1lKTsKKwkJCWhkbGNfc3RhdHMoZGV2KS0+dHhfZXJyb3JzKys7CisJCQlzdGF0ZSAmPSB+RXJyOworCQl9CisJfQorCWdvdG8gdHJ5OworfQorCitzdGF0aWMgdm9pZCBkc2NjNF9yeF9pcnEoc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc2NjNF90b19kZXYoZHByaXYpOworCXUzMiBzdGF0ZTsKKwlpbnQgY3VyOworCit0cnk6CisJY3VyID0gZHByaXYtPmlxcnhfY3VycmVudCVJUlFfUklOR19TSVpFOworCXN0YXRlID0gZHByaXYtPmlxcnhbY3VyXTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm47CisJZHByaXYtPmlxcnhbY3VyXSA9IDA7CisJZHByaXYtPmlxcnhfY3VycmVudCsrOworCisJaWYgKHN0YXRlX2NoZWNrKHN0YXRlLCBkcHJpdiwgZGV2LCAiUngiKSA8IDApCisJCXJldHVybjsKKworCWlmICghKHN0YXRlICYgU2NjRXZ0KSl7CisJCXN0cnVjdCBSeEZEICpyeF9mZDsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSeCBJU1IgPSAweCUwOHhcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBzdGF0ZSk7CisJCXN0YXRlICY9IDB4MDBmZmZmZmY7CisJCWlmIChzdGF0ZSAmIEVycikgeyAvKiBIb2xkIG9yIHJlc2V0ICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJ4IEVSUlxuIiwgZGV2LT5uYW1lKTsKKwkJCWN1ciA9IGRwcml2LT5yeF9jdXJyZW50JVJYX1JJTkdfU0laRTsKKwkJCXJ4X2ZkID0gZHByaXYtPnJ4X2ZkICsgY3VyOworCQkJLyoKKwkJCSAqIFByZXN1bWUgd2UncmUgbm90IGZhY2luZyBhIERNQUMgcmVjZWl2ZXIgcmVzZXQuCisJCQkgKiBBcyBXZSB1c2UgdGhlIHJ4IHNpemUtZmlsdGVyaW5nIGZlYXR1cmUgb2YgdGhlCisJCQkgKiBEU0NDNCwgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBmcmFtZSBpcyB3YWl0aW5nIGluCisJCQkgKiB0aGUgcnggZmlmby4gSSBiZXQgYSBSZWNlaXZlIERhdGEgT3ZlcmZsb3cgd2lsbAorCQkJICogaGFwcGVuIG1vc3Qgb2YgdGltZSBidXQgbGV0J3MgdHJ5IGFuZCBhdm9pZCBpdC4KKwkJCSAqIEJ0dyAoYXMgZm9yIFJETykgaWYgb25lIGV4cGVyaWVuY2VzIEVSUiB3aGVyZWFzCisJCQkgKiB0aGUgc3lzdGVtIGxvb2tzIHJhdGhlciBpZGxlLCB0aGVyZSBtYXkgYmUgYQorCQkJICogcHJvYmxlbSB3aXRoIGxhdGVuY3kuIEluIHRoaXMgY2FzZSwgaW5jcmVhc2luZworCQkJICogUlhfUklOR19TSVpFIG1heSBoZWxwLgorCQkJICovCisJCQkvL3doaWxlIChkcHJpdi0+cnhfbmVlZHNfcmVmaWxsKSB7CisJCQkJd2hpbGUgKCEocnhfZmQtPnN0YXRlMSAmIEhvbGQpKSB7CisJCQkJCXJ4X2ZkKys7CisJCQkJCWN1cisrOworCQkJCQlpZiAoIShjdXIgPSBjdXIlUlhfUklOR19TSVpFKSkKKwkJCQkJCXJ4X2ZkID0gZHByaXYtPnJ4X2ZkOworCQkJCX0KKwkJCQkvL2Rwcml2LT5yeF9uZWVkc19yZWZpbGwtLTsKKwkJCQl0cnlfZ2V0X3J4X3NrYihkcHJpdiwgZGV2KTsKKwkJCQlpZiAoIXJ4X2ZkLT5kYXRhKQorCQkJCQlnb3RvIHRyeTsKKwkJCQlyeF9mZC0+c3RhdGUxICY9IH5Ib2xkOworCQkJCXJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCQkJCXJ4X2ZkLT5lbmQgPSAweGJhYmVmYWNlOworCQkJLy99CisJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBGaSkgeworCQkJZHNjYzRfcnhfc2tiKGRwcml2LCBkZXYpOworCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgSGkgKSB7IC8qIEhJIGJpdCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ4IEhpXG4iLCBkZXYtPm5hbWUpOworCQkJc3RhdGUgJj0gfkhpOworCQkJZ290byB0cnk7CisJCX0KKwl9IGVsc2UgeyAvKiBTY2NFdnQgKi8KKwkJaWYgKGRlYnVnID4gMSkgeworCQkJLy9GSVhNRTogdmVyaWZpZXIgbGEgcHJlc2VuY2UgZGUgdG91cyBsZXMgZXZlbmVtZW50cworCQlzdGF0aWMgc3RydWN0IHsKKwkJCXUzMiBtYXNrOworCQkJY29uc3QgY2hhciAqaXJxX25hbWU7CisJCX0gZXZ0c1tdID0geworCQkJeyAweDAwMDA4MDAwLCAiVElOIn0sCisJCQl7IDB4MDAwMDAwMjAsICJSU0MifSwKKwkJCXsgMHgwMDAwMDAxMCwgIlBDRSJ9LAorCQkJeyAweDAwMDAwMDA4LCAiUExMQSJ9LAorCQkJeyAwLCBOVUxMfQorCQl9LCAqZXZ0OworCisJCWZvciAoZXZ0ID0gZXZ0czsgZXZ0LT5pcnFfbmFtZTsgZXZ0KyspIHsKKwkJCWlmIChzdGF0ZSAmIGV2dC0+bWFzaykgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBldnQtPmlycV9uYW1lKTsKKwkJCQlpZiAoIShzdGF0ZSAmPSB+ZXZ0LT5tYXNrKSkKKwkJCQkJZ290byB0cnk7CisJCQl9CisJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKHN0YXRlICY9IH4weDAwMDBjMDNjKSkKKwkJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBDdHMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDVFMgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICghKHN0YXRlICY9IH5DdHMpKSAvKiBERUJVRyAqLworCQkJCWdvdG8gdHJ5OworCQl9CisJCS8qCisJCSAqIFJlY2VpdmUgRGF0YSBPdmVyZmxvdyAoRklYTUU6IGZzY2tlZCkKKwkJICovCisJCWlmIChzdGF0ZSAmIFJkbykgeworCQkJc3RydWN0IFJ4RkQgKnJ4X2ZkOworCQkJdm9pZCBfX2lvbWVtICpzY2NfYWRkcjsKKwkJCWludCBjdXI7CisKKwkJCS8vaWYgKGRlYnVnKQorCQkJLy8JZHNjYzRfcnhfZHVtcChkcHJpdik7CisJCQlzY2NfYWRkciA9IGRwcml2LT5iYXNlX2FkZHIgKyAweDBjKmRwcml2LT5kZXZfaWQ7CisKKwkJCXNjY19wYXRjaGwoUnhBY3RpdmF0ZSwgMCwgZHByaXYsIGRldiwgQ0NSMik7CisJCQkvKgorCQkJICogVGhpcyBoYXMgbm8gZWZmZWN0LiBXaHkgPworCQkJICogT1JlZCB3aXRoIFR4U2NjUmVzLCBvbmUgc2VlcyB0aGUgQ0ZHIGFjayAoZm9yCisJCQkgKiB0aGUgVFggcGFydCBvbmx5KS4KKwkJCSAqLworCQkJc2NjX3dyaXRlbChSeFNjY1JlcywgZHByaXYsIGRldiwgQ01EUik7CisJCQlkcHJpdi0+ZmxhZ3MgfD0gUmRvU2V0OworCisJCQkvKgorCQkJICogTGV0J3MgdHJ5IGFuZCBzYXZlIHNvbWV0aGluZyBpbiB0aGUgcmVjZWl2ZWQgZGF0YS4KKwkJCSAqIHJ4X2N1cnJlbnQgbXVzdCBiZSBpbmNyZW1lbnRlZCBhdCBsZWFzdCBvbmNlIHRvCisJCQkgKiBhdm9pZCBIT0xEIGluIHRoZSBCUkRBLXRvLWJlLXBvaW50ZWQgZGVzYy4KKwkJCSAqLworCQkJZG8geworCQkJCWN1ciA9IGRwcml2LT5yeF9jdXJyZW50KyslUlhfUklOR19TSVpFOworCQkJCXJ4X2ZkID0gZHByaXYtPnJ4X2ZkICsgY3VyOworCQkJCWlmICghKHJ4X2ZkLT5zdGF0ZTIgJiBEYXRhQ29tcGxldGUpKQorCQkJCQlicmVhazsKKwkJCQlpZiAocnhfZmQtPnN0YXRlMiAmIEZyYW1lQWJvcnRlZCkgeworCQkJCQloZGxjX3N0YXRzKGRldiktPnJ4X292ZXJfZXJyb3JzKys7CisJCQkJCXJ4X2ZkLT5zdGF0ZTEgfD0gSG9sZDsKKwkJCQkJcnhfZmQtPnN0YXRlMiA9IDB4MDAwMDAwMDA7CisJCQkJCXJ4X2ZkLT5lbmQgPSAweGJhYmVmYWNlOworCQkJCX0gZWxzZQorCQkJCQlkc2NjNF9yeF9za2IoZHByaXYsIGRldik7CisJCQl9IHdoaWxlICgxKTsKKworCQkJaWYgKGRlYnVnID4gMCkgeworCQkJCWlmIChkcHJpdi0+ZmxhZ3MgJiBSZG9TZXQpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSAgICAgICAiJXM6IG5vIFJETyBpbiBSeCBkYXRhXG4iLCBEUlZfTkFNRSk7CisJCQl9CisjaWZkZWYgRFNDQzRfUkRPX0VYUEVSSU1FTlRBTF9SRUNPVkVSWQorCQkJLyoKKwkJCSAqIEZJWE1FOiBtdXN0IHRoZSByZXNldCBiZSB0aGlzIHZpb2xlbnQgPworCQkJICovCisjd2FybmluZyAiRklYTUU6IENIMEJSREEiCisJCQl3cml0ZWwoZHByaXYtPnJ4X2ZkX2RtYSArCisJCQkgICAgICAgKGRwcml2LT5yeF9jdXJyZW50JVJYX1JJTkdfU0laRSkqCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgc2NjX2FkZHIgKyBDSDBCUkRBKTsKKwkJCXdyaXRlbChNVEZpfFJkcnxJZHIsIHNjY19hZGRyICsgQ0gwQ0ZHKTsKKwkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiUkRSIikgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUkRPIHJlY292ZXJ5IGZhaWxlZCglcylcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgIlJEUiIpOworCQkJCWdvdG8gcmRvX2VuZDsKKwkJCX0KKwkJCXdyaXRlbChNVEZpfElkciwgc2NjX2FkZHIgKyBDSDBDRkcpOworCQkJaWYgKGRzY2M0X2RvX2FjdGlvbihkZXYsICJJRFIiKSA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSRE8gcmVjb3ZlcnkgZmFpbGVkKCVzKVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCAiSURSIik7CisJCQkJZ290byByZG9fZW5kOworCQkJfQorCQlyZG9fZW5kOgorI2VuZGlmCisJCQlzY2NfcGF0Y2hsKDAsIFJ4QWN0aXZhdGUsIGRwcml2LCBkZXYsIENDUjIpOworCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgQ2QpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDRCB0cmFuc2l0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkNkKSkgLyogREVCVUcgKi8KKwkJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBGbGV4KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZsZXguIFR0dHR0Li4uXG4iLCBEUlZfTkFNRSk7CisJCQlpZiAoIShzdGF0ZSAmPSB+RmxleCkpCisJCQkJZ290byB0cnk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBJIGhhZCBleHBlY3RlZCB0aGUgZm9sbG93aW5nIHRvIHdvcmsgZm9yIHRoZSBmaXJzdCBkZXNjcmlwdG9yCisgKiAodHhfZmQtPnN0YXRlID0gMHhjMDAwMDAwMCkKKyAqIC0gSG9sZD0xIChkb24ndCB0cnkgYW5kIGJyYW5jaCB0byB0aGUgbmV4dCBkZXNjcmlwdG8pOworICogLSBObz0wIChJIHdhbnQgYW4gZW1wdHkgZGF0YSBzZWN0aW9uLCBpLmUuIHNpemU9MCk7CisgKiAtIEZlPTEgKHJlcXVpcmVkIGJ5IE5vPTAgb3Igd2UgZ290IGFuIEVyciBpcnEgYW5kIG11c3QgcmVzZXQpLgorICogSXQgZmFpbGVkIGFuZCBsb2NrZWQgc29saWQuIFRodXMgdGhlIGludHJvZHVjdGlvbiBvZiBhIGR1bW15IHNrYi4KKyAqIFByb2JsZW0gaXMgYWNrbm93bGVkZ2VkIGluIGVycmF0YSBzaGVldCBEUzUuIEpveSA6by8KKyAqLworc3RydWN0IHNrX2J1ZmYgKmRzY2M0X2luaXRfZHVtbXlfc2tiKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoRFVNTVlfU0tCX1NJWkUpOworCWlmIChza2IpIHsKKwkJaW50IGxhc3QgPSBkcHJpdi0+dHhfZGlydHklVFhfUklOR19TSVpFOworCQlzdHJ1Y3QgVHhGRCAqdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBsYXN0OworCisJCXNrYi0+bGVuID0gRFVNTVlfU0tCX1NJWkU7CisJCW1lbWNweShza2ItPmRhdGEsIHZlcnNpb24sIHN0cmxlbih2ZXJzaW9uKSVEVU1NWV9TS0JfU0laRSk7CisJCXR4X2ZkLT5zdGF0ZSA9IEZyYW1lRW5kIHwgVE9fU1RBVEVfVFgoRFVNTVlfU0tCX1NJWkUpOworCQl0eF9mZC0+ZGF0YSA9IHBjaV9tYXBfc2luZ2xlKGRwcml2LT5wY2lfcHJpdi0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgICAgIERVTU1ZX1NLQl9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZHByaXYtPnR4X3NrYnVmZltsYXN0XSA9IHNrYjsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBkc2NjNF9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZHByaXYtPnBjaV9wcml2LT5wZGV2OworCXN0cnVjdCBUeEZEICp0eF9mZDsKKwlzdHJ1Y3QgUnhGRCAqcnhfZmQ7CisJdm9pZCAqcmluZzsKKwlpbnQgaTsKKworCXJpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmZHByaXYtPnJ4X2ZkX2RtYSk7CisJaWYgKCFyaW5nKQorCQlnb3RvIGVycl9vdXQ7CisJZHByaXYtPnJ4X2ZkID0gcnhfZmQgPSAoc3RydWN0IFJ4RkQgKikgcmluZzsKKworCXJpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmZHByaXYtPnR4X2ZkX2RtYSk7CisJaWYgKCFyaW5nKQorCQlnb3RvIGVycl9mcmVlX2RtYV9yeDsKKwlkcHJpdi0+dHhfZmQgPSB0eF9mZCA9IChzdHJ1Y3QgVHhGRCAqKSByaW5nOworCisJbWVtc2V0KGRwcml2LT50eF9za2J1ZmYsIDAsIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSpUWF9SSU5HX1NJWkUpOworCWRwcml2LT50eF9kaXJ0eSA9IDB4ZmZmZmZmZmY7CisJaSA9IGRwcml2LT50eF9jdXJyZW50ID0gMDsKKwlkbyB7CisJCXR4X2ZkLT5zdGF0ZSA9IEZyYW1lRW5kIHwgVE9fU1RBVEVfVFgoMipEVU1NWV9TS0JfU0laRSk7CisJCXR4X2ZkLT5jb21wbGV0ZSA9IDB4MDAwMDAwMDA7CisJICAgICAgICAvKiBGSVhNRTogTlVMTCBzaG91bGQgYmUgb2sgLSB0byBiZSB0cmllZCAqLworCSAgICAgICAgdHhfZmQtPmRhdGEgPSBkcHJpdi0+dHhfZmRfZG1hOworCQkodHhfZmQrKyktPm5leHQgPSAodTMyKShkcHJpdi0+dHhfZmRfZG1hICsKKwkJCQkJKCsraSVUWF9SSU5HX1NJWkUpKnNpemVvZigqdHhfZmQpKTsKKwl9IHdoaWxlIChpIDwgVFhfUklOR19TSVpFKTsKKworCWlmIChkc2NjNF9pbml0X2R1bW15X3NrYihkcHJpdikgPCAwKQorCQlnb3RvIGVycl9mcmVlX2RtYV90eDsKKworCW1lbXNldChkcHJpdi0+cnhfc2tidWZmLCAwLCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikqUlhfUklOR19TSVpFKTsKKwlpID0gZHByaXYtPnJ4X2RpcnR5ID0gZHByaXYtPnJ4X2N1cnJlbnQgPSAwOworCWRvIHsKKwkJLyogc2l6ZSBzZXQgYnkgdGhlIGhvc3QuIE11bHRpcGxlIG9mIDQgYnl0ZXMgcGxlYXNlICovCisJICAgICAgICByeF9mZC0+c3RhdGUxID0gSGlEZXNjOworCSAgICAgICAgcnhfZmQtPnN0YXRlMiA9IDB4MDAwMDAwMDA7CisJICAgICAgICByeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKKwkgICAgICAgIHJ4X2ZkLT5zdGF0ZTEgfD0gVE9fU1RBVEVfUlgoSERMQ19NQVhfTVJVKTsKKwkJLy8gRklYTUU6IHJldHVybiB2YWx1ZSB2ZXJpZmllZSBtYWlzIHRyYWl0ZW1lbnQgc3VzcGVjdAorCQlpZiAodHJ5X2dldF9yeF9za2IoZHByaXYsIGRldikgPj0gMCkKKwkJCWRwcml2LT5yeF9kaXJ0eSsrOworCQkocnhfZmQrKyktPm5leHQgPSAodTMyKShkcHJpdi0+cnhfZmRfZG1hICsKKwkJCQkJKCsraSVSWF9SSU5HX1NJWkUpKnNpemVvZigqcnhfZmQpKTsKKwl9IHdoaWxlIChpIDwgUlhfUklOR19TSVpFKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9kbWFfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCByaW5nLCBkcHJpdi0+dHhfZmRfZG1hKTsKK2Vycl9mcmVlX2RtYV9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIHJ4X2ZkLCBkcHJpdi0+cnhfZmRfZG1hKTsKK2Vycl9vdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkc2NjNF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXY7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpOworCisJcHByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJcm9vdCA9IHBwcml2LT5yb290OworCisJaW9hZGRyID0gcm9vdC0+YmFzZV9hZGRyOworCisJZHNjYzRfcGNpX3Jlc2V0KHBkZXYsIGlvYWRkcik7CisKKwlmcmVlX2lycShwZGV2LT5pcnEsIHJvb3QpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgcHByaXYtPmlxY2ZnLAorCQkJICAgIHBwcml2LT5pcWNmZ19kbWEpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gcm9vdCArIGk7CisKKwkJZHNjYzRfcmVsZWFzZV9yaW5nKGRwcml2KTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLAorCQkJCSAgICBkcHJpdi0+aXFyeCwgZHByaXYtPmlxcnhfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBJUlFfUklOR19TSVpFKnNpemVvZih1MzIpLAorCQkJCSAgICBkcHJpdi0+aXF0eCwgZHByaXYtPmlxdHhfZG1hKTsKKwl9CisKKwlkc2NjNF9mcmVlMShwZGV2KTsKKworCWlvdW5tYXAoaW9hZGRyKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAxKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfaGRsY19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisKKwlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX05SWkkgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fTUFSSyAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9TUEFDRSAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19NQU5DSEVTVEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJpdHkgIT0gUEFSSVRZX05PTkUgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjBfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQpCisJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGRwcml2LT5lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICBkcHJpdi0+cGFyaXR5ID0gcGFyaXR5OworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgZHNjYzRfc2V0dXAoY2hhciAqc3RyKQoreworCWludCAqYXJnc1tdID0geyAmZGVidWcsICZxdWFydHosIE5VTEwgfSwgKipwID0gYXJnczsKKworCXdoaWxlICgqcCAmJiAoZ2V0X29wdGlvbigmc3RyLCAqcCkgPT0gMikpCisJCXArKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZHNjYzQuc2V0dXA9IiwgZHNjYzRfc2V0dXApOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkc2NjNF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1NJRU1FTlMsIFBDSV9ERVZJQ0VfSURfU0lFTUVOU19EU0NDNCwKKwkgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZHNjYzRfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkc2NjNF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gZHNjYzRfcGNpX3RibCwKKwkucHJvYmUJCT0gZHNjYzRfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkc2NjNF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzY2M0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHNjYzRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzY2M0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkc2NjNF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkc2NjNF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkc2NjNF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc1Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwpAQCAtMCwwICsxLDI3MTIgQEAKKy8qCisgKiAgICAgIEZhclN5bmMgV0FOIGRyaXZlciBmb3IgTGludXggKDIuNi54IGtlcm5lbCB2ZXJzaW9uKQorICoKKyAqICAgICAgQWN0dWFsbHkgc3luYyBkcml2ZXIgZm9yIFguMjEsIFYuMzUgYW5kIFYuMjQgb24gRmFyU3luYyBULXNlcmllcyBjYXJkcworICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuCisgKiAgICAgIHd3dy5mYXJzaXRlLmNvLnVrCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgQXV0aG9yOiAgICAgIFIuSi5EdW5sb3AgICAgPGJvYi5kdW5sb3BAZmFyc2l0ZS5jby51az4KKyAqICAgICAgTWFpbnRhaW5lcjogIEtldmluIEN1cnRpcyAgPGtldmluLmN1cnRpc0BmYXJzaXRlLmNvLnVrPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJmYXJzeW5jLmgiCisKKy8qCisgKiAgICAgIE1vZHVsZSBpbmZvCisgKi8KK01PRFVMRV9BVVRIT1IoIlIuSi5EdW5sb3AgPGJvYi5kdW5sb3BAZmFyc2l0ZS5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRmFyU3luYyBULVNlcmllcyBXQU4gZHJpdmVyLiBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogICAgICBEcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgZ2xvYmFsIHBhcmFtZXRlcnMKKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogICAgICBOdW1iZXIgb2YgcG9ydHMgKHBlciBjYXJkKSBhbmQgY2FyZHMgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgRlNUX01BWF9QT1JUUyAgICAgICAgICAgNAorI2RlZmluZSBGU1RfTUFYX0NBUkRTICAgICAgICAgICAzMgorCisvKiAgICAgIERlZmF1bHQgcGFyYW1ldGVycyBmb3IgdGhlIGxpbmsKKyAqLworI2RlZmluZSBGU1RfVFhfUVVFVUVfTEVOICAgICAgICAxMDAJLyogQXQgOE1icHMgYSBsb25nZXIgcXVldWUgbGVuZ3RoIGlzCisJCQkJCSAqIHVzZWZ1bCwgdGhlIHN5bmNwcHAgbW9kdWxlIGZvcmNlcworCQkJCQkgKiB0aGlzIGRvd24gYXNzdW1pbmcgYSBzbG93ZXIgbGluZSBJCisJCQkJCSAqIGd1ZXNzLgorCQkJCQkgKi8KKyNkZWZpbmUgRlNUX1RYUV9ERVBUSCAgICAgICAgICAgMTYJLyogVGhpcyBvbmUgaXMgZm9yIHRoZSBidWZmZXJpbmcKKwkJCQkJICogb2YgZnJhbWVzIG9uIHRoZSB3YXkgZG93biB0byB0aGUgY2FyZAorCQkJCQkgKiBzbyB0aGF0IHdlIGNhbiBrZWVwIHRoZSBjYXJkIGJ1c3kKKwkJCQkJICogYW5kIG1heGltaXNlIHRocm91Z2hwdXQKKwkJCQkJICovCisjZGVmaW5lIEZTVF9ISUdIX1dBVEVSX01BUksgICAgIDEyCS8qIFBvaW50IGF0IHdoaWNoIHdlIGZsb3cgY29udHJvbAorCQkJCQkgKiBuZXR3b3JrIGxheWVyICovCisjZGVmaW5lIEZTVF9MT1dfV0FURVJfTUFSSyAgICAgIDgJLyogUG9pbnQgYXQgd2hpY2ggd2UgcmVtb3ZlIGZsb3cKKwkJCQkJICogY29udHJvbCBmcm9tIG5ldHdvcmsgbGF5ZXIgKi8KKyNkZWZpbmUgRlNUX01BWF9NVFUgICAgICAgICAgICAgODAwMAkvKiBIdWdlIGJ1dCBwb3NzaWJsZSAqLworI2RlZmluZSBGU1RfREVGX01UVSAgICAgICAgICAgICAxNTAwCS8qIENvbW1vbiBzYW5lIHZhbHVlICovCisKKyNkZWZpbmUgRlNUX1RYX1RJTUVPVVQgICAgICAgICAgKDIqSFopCisKKyNpZmRlZiBBUlBIUkRfUkFXSERMQworI2RlZmluZSBBUlBIUkRfTVlUWVBFICAgQVJQSFJEX1JBV0hETEMJLyogUmF3IGZyYW1lcyAqLworI2Vsc2UKKyNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFSUEhSRF9IRExDCS8qIENpc2NvLUhETEMgKGtlZXBhbGl2ZXMgZXRjKSAqLworI2VuZGlmCisKKy8qCisgKiBNb2R1bGVzIHBhcmFtZXRlcnMgYW5kIGFzc29jaWF0ZWQgdmFyYWlibGVzCisgKi8KK2ludCBmc3RfdHhxX2xvdyA9IEZTVF9MT1dfV0FURVJfTUFSSzsKK2ludCBmc3RfdHhxX2hpZ2ggPSBGU1RfSElHSF9XQVRFUl9NQVJLOworaW50IGZzdF9tYXhfcmVhZHMgPSA3OworaW50IGZzdF9leGNsdWRlZF9jYXJkcyA9IDA7CitpbnQgZnN0X2V4Y2x1ZGVkX2xpc3RbRlNUX01BWF9DQVJEU107CisKK21vZHVsZV9wYXJhbShmc3RfdHhxX2xvdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmc3RfdHhxX2hpZ2gsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnN0X21heF9yZWFkcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmc3RfZXhjbHVkZWRfY2FyZHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnN0X2V4Y2x1ZGVkX2xpc3QsIGludCwgTlVMTCwgMCk7CisKKy8qICAgICAgQ2FyZCBzaGFyZWQgbWVtb3J5IGxheW91dAorICogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNwcmFnbWEgcGFjaygxKQorCisvKiAgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBpbiBwYXJ0IGZyb20gdGhlIEZhclNpdGUgRmFyU3luYyBTbWMuaAorICogICAgICBmaWxlLiBVbmZvcnR1bmF0ZWx5IHZhcmlvdXMgbmFtZSBjbGFzaGVzIGFuZCB0aGUgbm9uLXBvcnRhYmlsaXR5IG9mIHRoZQorICogICAgICBiaXQgZmllbGQgZGVjbGFyYXRpb25zIGluIHRoYXQgZmlsZSBoYXZlIG1lYW50IHRoYXQgSSBoYXZlIGNob3NlbiB0bworICogICAgICByZWNyZWF0ZSB0aGUgaW5mb3JtYXRpb24gaGVyZS4KKyAqCisgKiAgICAgIFRoZSBTTUMgKFNoYXJlZCBNZW1vcnkgQ29uZmlndXJhdGlvbikgaGFzIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBpcworICogICAgICBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgY2hhbmdlLiBUaGlzIG51bWJlciBjYW4KKyAqICAgICAgYmUgdXNlZCB0byBjaGVjayB0aGF0IHdlIGhhdmUgbm90IGdvdCBvdXQgb2Ygc3RlcCB3aXRoIHRoZSBmaXJtd2FyZQorICogICAgICBjb250YWluZWQgaW4gdGhlIC5DREUgZmlsZXMuCisgKi8KKyNkZWZpbmUgU01DX1ZFUlNJT04gMjQKKworI2RlZmluZSBGU1RfTUVNU0laRSAweDEwMDAwMAkvKiBTaXplIG9mIGNhcmQgbWVtb3J5ICgxTWIpICovCisKKyNkZWZpbmUgU01DX0JBU0UgMHgwMDAwMjAwMEwJLyogQmFzZSBvZmZzZXQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgd2luZG93IG1haW4KKwkJCQkgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLworI2RlZmluZSBCRk1fQkFTRSAweDAwMDEwMDAwTAkvKiBCYXNlIG9mZnNldCBvZiB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgRE1BCisJCQkJICogYnVmZmVycyAqLworCisjZGVmaW5lIExFTl9UWF9CVUZGRVIgODE5MgkvKiBTaXplIG9mIHBhY2tldCBidWZmZXJzICovCisjZGVmaW5lIExFTl9SWF9CVUZGRVIgODE5MgorCisjZGVmaW5lIExFTl9TTUFMTF9UWF9CVUZGRVIgMjU2CS8qIFNpemUgb2Ygb2Jzb2xldGUgYnVmZnMgdXNlZCBmb3IgRE9TIGRpYWdzICovCisjZGVmaW5lIExFTl9TTUFMTF9SWF9CVUZGRVIgMjU2CisKKyNkZWZpbmUgTlVNX1RYX0JVRkZFUiAyCQkvKiBNdXN0IGJlIHBvd2VyIG9mIDIuIEZpeGVkIGJ5IGZpcm13YXJlICovCisjZGVmaW5lIE5VTV9SWF9CVUZGRVIgOAorCisvKiBJbnRlcnJ1cHQgcmV0cnkgdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgSU5UX1JFVFJZX1RJTUUgMgorCisvKiAgICAgIFRoZSBBbTE4NkNIL0NDIHByb2Nlc3NvcnMgc3VwcG9ydCBhIFNtYXJ0RE1BIG1vZGUgdXNpbmcgY2lyY3VsYXIgcG9vbHMKKyAqICAgICAgb2YgYnVmZmVyIGRlc2NyaXB0b3JzLiBUaGUgc3RydWN0dXJlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhhdCB1c2VkCisgKiAgICAgIGluIHRoZSBMQU5DRSBFdGhlcm5ldCBjb250cm9sbGVycy4gRGV0YWlscyBhdmFpbGFibGUgYXMgUERGIGZyb20gdGhlCisgKiAgICAgIEFNRCB3ZWIgc2l0ZTogaHR0cDovL3d3dy5hbWQuY29tL3Byb2R1Y3RzL2VwZC9wcm9jZXNzb3JzL1wKKyAqICAgICAgICAgICAgICAgICAgICAyLjE2Yml0Y29udC8zLmFtMTg2Y3hmYS9hMjE5MTQvMjE5MTQucGRmCisgKi8KK3N0cnVjdCB0eGRlc2MgewkJCS8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwl2b2xhdGlsZSB1MTYgbGFkcjsJLyogTG93IG9yZGVyIGFkZHJlc3Mgb2YgcGFja2V0LiBUaGlzIGlzIGEKKwkJCQkgKiBsaW5lYXIgYWRkcmVzcyBpbiB0aGUgQW0xODYgbWVtb3J5IHNwYWNlCisJCQkJICovCisJdm9sYXRpbGUgdTggaGFkcjsJLyogSGlnaCBvcmRlciBhZGRyZXNzLiBMb3cgNCBiaXRzIG9ubHksIGhpZ2ggNAorCQkJCSAqIGJpdHMgbXVzdCBiZSB6ZXJvCisJCQkJICovCisJdm9sYXRpbGUgdTggYml0czsJLyogU3RhdHVzIGFuZCBjb25maWcgKi8KKwl2b2xhdGlsZSB1MTYgYmNudDsJLyogMnMgY29tcGxlbWVudCBvZiBwYWNrZXQgc2l6ZSBpbiBsb3cgMTUgYml0cy4KKwkJCQkgKiBUcmFuc21pdCB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlIGluCisJCQkJICogdG9wIGJpdC4KKwkJCQkgKi8KKwl1MTYgdW51c2VkOwkJLyogTm90IHVzZWQgaW4gVHggKi8KK307CisKK3N0cnVjdCByeGRlc2MgewkJCS8qIFJlY2VpdmUgZGVzY3JpcHRvciAqLworCXZvbGF0aWxlIHUxNiBsYWRyOwkvKiBMb3cgb3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSB1OCBoYWRyOwkvKiBIaWdoIG9yZGVyIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB1OCBiaXRzOwkvKiBTdGF0dXMgYW5kIGNvbmZpZyAqLworCXZvbGF0aWxlIHUxNiBiY250OwkvKiAycyBjb21wbGVtZW50IG9mIGJ1ZmZlciBzaXplIGluIGxvdyAxNSBiaXRzLgorCQkJCSAqIFJlY2VpdmUgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJCQkJICovCisJdm9sYXRpbGUgdTE2IG1jbnQ7CS8qIE1lc3NhZ2UgYnl0ZSBjb3VudCAoMTUgYml0cykgKi8KK307CisKKy8qIENvbnZlcnQgYSBsZW5ndGggaW50byB0aGUgMTUgYml0IDIncyBjb21wbGVtZW50ICovCisvKiAjZGVmaW5lIGNudl9iY250KGxlbikgICAoKCB+KGxlbikgKyAxICkgJiAweDdGRkYgKSAqLworLyogU2luY2Ugd2UgbmVlZCB0byBzZXQgdGhlIGhpZ2ggYml0IHRvIGVuYWJsZSB0aGUgY29tcGxldGlvbiBpbnRlcnJ1cHQgdGhpcworICogY2FuIGJlIG1hZGUgYSBsb3Qgc2ltcGxlcgorICovCisjZGVmaW5lIGNudl9iY250KGxlbikgICAoLShsZW4pKQorCisvKiBTdGF0dXMgYW5kIGNvbmZpZyBiaXRzIGZvciB0aGUgYWJvdmUgKi8KKyNkZWZpbmUgRE1BX09XTiAgICAgICAgIDB4ODAJLyogU21hcnRETUEgb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBUWF9TVFAgICAgICAgICAgMHgwMgkvKiBUeDogc3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFRYX0VOUCAgICAgICAgICAweDAxCS8qIFR4OiBlbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIFJYX0VSUiAgICAgICAgICAweDQwCS8qIFJ4OiBlcnJvciAoT1Igb2YgbmV4dCA0IGJpdHMpICovCisjZGVmaW5lIFJYX0ZSQU0gICAgICAgICAweDIwCS8qIFJ4OiBmcmFtaW5nIGVycm9yICovCisjZGVmaW5lIFJYX09GTE8gICAgICAgICAweDEwCS8qIFJ4OiBvdmVyZmxvdyBlcnJvciAqLworI2RlZmluZSBSWF9DUkMgICAgICAgICAgMHgwOAkvKiBSeDogQ1JDIGVycm9yICovCisjZGVmaW5lIFJYX0hCVUYgICAgICAgICAweDA0CS8qIFJ4OiBidWZmZXIgZXJyb3IgKi8KKyNkZWZpbmUgUlhfU1RQICAgICAgICAgIDB4MDIJLyogUng6IHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBSWF9FTlAgICAgICAgICAgMHgwMQkvKiBSeDogZW5kIG9mIHBhY2tldCAqLworCisvKiBJbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYXJlIGNhdXNlZCBieSB2YXJpb3VzIGV2ZW50cyB3aGljaCBhcmUgcHJlc2VudGVkCisgKiBpbiBhIGNpcmN1bGFyIGJ1ZmZlciBhcyBzZXZlcmFsIGV2ZW50cyBtYXkgYmUgcHJvY2Vzc2VkIG9uIG9uZSBwaHlzaWNhbCBpbnQKKyAqLworI2RlZmluZSBNQVhfQ0lSQlVGRiAgICAgMzIKKworc3RydWN0IGNpcmJ1ZmYgeworCXU4IHJkaW5kZXg7CQkvKiByZWFkLCB0aGVuIGluY3JlbWVudCBhbmQgd3JhcCAqLworCXU4IHdyaW5kZXg7CQkvKiB3cml0ZSwgdGhlbiBpbmNyZW1lbnQgYW5kIHdyYXAgKi8KKwl1OCBldm50YnVmZltNQVhfQ0lSQlVGRl07Cit9OworCisvKiBJbnRlcnJ1cHQgZXZlbnQgY29kZXMuCisgKiBXaGVyZSBhcHByb3ByaWF0ZSB0aGUgdHdvIGxvdyBvcmRlciBiaXRzIGluZGljYXRlIHRoZSBwb3J0IG51bWJlcgorICovCisjZGVmaW5lIENUTEFfQ0hHICAgICAgICAweDE4CS8qIENvbnRyb2wgc2lnbmFsIGNoYW5nZWQgKi8KKyNkZWZpbmUgQ1RMQl9DSEcgICAgICAgIDB4MTkKKyNkZWZpbmUgQ1RMQ19DSEcgICAgICAgIDB4MUEKKyNkZWZpbmUgQ1RMRF9DSEcgICAgICAgIDB4MUIKKworI2RlZmluZSBJTklUX0NQTFQgICAgICAgMHgyMAkvKiBJbml0aWFsaXNhdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBJTklUX0ZBSUwgICAgICAgMHgyMQkvKiBJbml0aWFsaXNhdGlvbiBmYWlsZWQgKi8KKworI2RlZmluZSBBQlRBX1NFTlQgICAgICAgMHgyNAkvKiBBYm9ydCBzZW50ICovCisjZGVmaW5lIEFCVEJfU0VOVCAgICAgICAweDI1CisjZGVmaW5lIEFCVENfU0VOVCAgICAgICAweDI2CisjZGVmaW5lIEFCVERfU0VOVCAgICAgICAweDI3CisKKyNkZWZpbmUgVFhBX1VOREYgICAgICAgIDB4MjgJLyogVHJhbnNtaXNzaW9uIHVuZGVyZmxvdyAqLworI2RlZmluZSBUWEJfVU5ERiAgICAgICAgMHgyOQorI2RlZmluZSBUWENfVU5ERiAgICAgICAgMHgyQQorI2RlZmluZSBUWERfVU5ERiAgICAgICAgMHgyQgorCisjZGVmaW5lIEY1Nl9JTlQgICAgICAgICAweDJDCisjZGVmaW5lIE0zMl9JTlQgICAgICAgICAweDJECisKKyNkZWZpbmUgVEUxX0FMTUEgICAgICAgIDB4MzAKKworLyogUG9ydCBwaHlzaWNhbCBjb25maWd1cmF0aW9uLiBTZWUgZmFyc3luYy5oIGZvciBmaWVsZCB2YWx1ZXMgKi8KK3N0cnVjdCBwb3J0X2NmZyB7CisJdTE2IGxpbmVJbnRlcmZhY2U7CS8qIFBoeXNpY2FsIGludGVyZmFjZSB0eXBlICovCisJdTggeDI1b3A7CQkvKiBVbnVzZWQgYXQgcHJlc2VudCAqLworCXU4IGludGVybmFsQ2xvY2s7CS8qIDEgPT4gaW50ZXJuYWwgY2xvY2ssIDAgPT4gZXh0ZXJuYWwgKi8KKwl1OCB0cmFuc3BhcmVudE1vZGU7CS8qIDEgPT4gb24sIDAgPT4gb2ZmICovCisJdTggaW52ZXJ0Q2xvY2s7CQkvKiAwID0+IG5vcm1hbCwgMSA9PiBpbnZlcnRlZCAqLworCXU4IHBhZEJ5dGVzWzZdOwkJLyogUGFkZGluZyAqLworCXUzMiBsaW5lU3BlZWQ7CQkvKiBTcGVlZCBpbiBicHMgKi8KK307CisKKy8qIFRFMSBwb3J0IHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBzdV9jb25maWcgeworCXUzMiBkYXRhUmF0ZTsKKwl1OCBjbG9ja2luZzsKKwl1OCBmcmFtaW5nOworCXU4IHN0cnVjdHVyZTsKKwl1OCBpbnRlcmZhY2U7CisJdTggY29kaW5nOworCXU4IGxpbmVCdWlsZE91dDsKKwl1OCBlcXVhbGl6ZXI7CisJdTggdHJhbnNwYXJlbnRNb2RlOworCXU4IGxvb3BNb2RlOworCXU4IHJhbmdlOworCXU4IHR4QnVmZmVyTW9kZTsKKwl1OCByeEJ1ZmZlck1vZGU7CisJdTggc3RhcnRpbmdTbG90OworCXU4IGxvc1RocmVzaG9sZDsKKwl1OCBlbmFibGVJZGxlQ29kZTsKKwl1OCBpZGxlQ29kZTsKKwl1OCBzcGFyZVs0NF07Cit9OworCisvKiBURTEgU3RhdHVzICovCitzdHJ1Y3Qgc3Vfc3RhdHVzIHsKKwl1MzIgcmVjZWl2ZUJ1ZmZlckRlbGF5OworCXUzMiBmcmFtaW5nRXJyb3JDb3VudDsKKwl1MzIgY29kZVZpb2xhdGlvbkNvdW50OworCXUzMiBjcmNFcnJvckNvdW50OworCXUzMiBsaW5lQXR0ZW51YXRpb247CisJdTggcG9ydFN0YXJ0ZWQ7CisJdTggbG9zc09mU2lnbmFsOworCXU4IHJlY2VpdmVSZW1vdGVBbGFybTsKKwl1OCBhbGFybUluZGljYXRpb25TaWduYWw7CisJdTggc3BhcmVbNDBdOworfTsKKworLyogRmluYWxseSBzbGluZyBhbGwgdGhlIGFib3ZlIHRvZ2V0aGVyIGludG8gdGhlIHNoYXJlZCBtZW1vcnkgc3RydWN0dXJlLgorICogU29ycnkgaXQncyBhIGhvZGdlIHBvZGdlIG9mIGFycmF5cywgc3RydWN0dXJlcyBhbmQgdW51c2VkIGJpdHMsIGl0J3MgYmVlbgorICogZXZvbHZpbmcgdW5kZXIgTlQgZm9yIHNvbWUgdGltZSBzbyBJIGd1ZXNzIHdlJ3JlIHN0dWNrIHdpdGggaXQuCisgKiBUaGUgc3RydWN0dXJlIHN0YXJ0cyBhdCBvZmZzZXQgU01DX0JBU0UuCisgKiBTZWUgZmFyc3luYy5oIGZvciBzb21lIGZpZWxkIHZhbHVlcy4KKyAqLworc3RydWN0IGZzdF9zaGFyZWQgeworCS8qIERNQSBkZXNjcmlwdG9yIHJpbmdzICovCisJc3RydWN0IHJ4ZGVzYyByeERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVSXTsKKwlzdHJ1Y3QgdHhkZXNjIHR4RGVzY3JSaW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJdOworCisJLyogT2Jzb2xldGUgc21hbGwgYnVmZmVycyAqLworCXU4IHNtYWxsUnhCdWZmZXJbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZFUl1bTEVOX1NNQUxMX1JYX0JVRkZFUl07CisJdTggc21hbGxUeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXVtMRU5fU01BTExfVFhfQlVGRkVSXTsKKworCXU4IHRhc2tTdGF0dXM7CQkvKiAweDAwID0+IGluaXRpYWxpc2luZywgMHgwMSA9PiBydW5uaW5nLAorCQkJCSAqIDB4RkYgPT4gaGFsdGVkCisJCQkJICovCisKKwl1OCBpbnRlcnJ1cHRIYW5kc2hha2U7CS8qIFNldCB0byAweDAxIGJ5IGFkYXB0ZXIgdG8gc2lnbmFsIGludGVycnVwdCwKKwkJCQkgKiBzZXQgdG8gMHhFRSBieSBob3N0IHRvIGFja25vd2xlZGdlIGludGVycnVwdAorCQkJCSAqLworCisJdTE2IHNtY1ZlcnNpb247CQkvKiBNdXN0IG1hdGNoIFNNQ19WRVJTSU9OICovCisKKwl1MzIgc21jRmlybXdhcmVWZXJzaW9uOwkvKiAweElJVlZSUkJCIHdoZXJlIElJID0gcHJvZHVjdCBJRCwgVlYgPSBtYWpvcgorCQkJCSAqIHZlcnNpb24sIFJSID0gcmV2aXNpb24gYW5kIEJCID0gYnVpbGQKKwkJCQkgKi8KKworCXUxNiB0eGFfZG9uZTsJCS8qIE9ic29sZXRlIGNvbXBsZXRpb24gZmxhZ3MgKi8KKwl1MTYgcnhhX2RvbmU7CisJdTE2IHR4Yl9kb25lOworCXUxNiByeGJfZG9uZTsKKwl1MTYgdHhjX2RvbmU7CisJdTE2IHJ4Y19kb25lOworCXUxNiB0eGRfZG9uZTsKKwl1MTYgcnhkX2RvbmU7CisKKwl1MTYgbWFpbGJveFs0XTsJCS8qIERpYWdub3N0aWNzIG1haWxib3guIE5vdCB1c2VkICovCisKKwlzdHJ1Y3QgY2lyYnVmZiBpbnRlcnJ1cHRFdmVudDsJLyogaW50ZXJydXB0IGNhdXNlcyAqLworCisJdTMyIHYyNElwU3RzW0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCisJdTMyIHYyNE9wU3RzW0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLworCisJc3RydWN0IHBvcnRfY2ZnIHBvcnRDb25maWdbRlNUX01BWF9QT1JUU107CisKKwl1MTYgY2xvY2tTdGF0dXNbRlNUX01BWF9QT1JUU107CS8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKworCXUxNiBjYWJsZVN0YXR1czsJLyogbHNiOiAwPT4gcHJlc2VudCwgMT0+IGFic2VudCAqLworCisJdTE2IHR4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsJLyogdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisJdTE2IHJ4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcgaW5kZXggKi8KKworCXUxNiBwb3J0TWFpbGJveFtGU1RfTUFYX1BPUlRTXVsyXTsJLyogY29tbWFuZCwgbW9kaWZpZXIgKi8KKwl1MTYgY2FyZE1haWxib3hbNF07CS8qIE5vdCB1c2VkICovCisKKwkvKiBOdW1iZXIgb2YgdGltZXMgdGhlIGNhcmQgdGhpbmtzIHRoZSBob3N0IGhhcworCSAqIG1pc3NlZCBhbiBpbnRlcnJ1cHQgYnkgbm90IGFja25vd2xlZGdpbmcKKwkgKiB3aXRoaW4gMm1TIChJIGd1ZXNzIE5UIGhhcyBwcm9ibGVtcykKKwkgKi8KKwl1MzIgaW50ZXJydXB0UmV0cnlDb3VudDsKKworCS8qIERyaXZlciBwcml2YXRlIGRhdGEgdXNlZCBhcyBhbiBJRC4gV2UnbGwgbm90CisJICogdXNlIHRoaXMgYXMgSSdkIHJhdGhlciBrZWVwIHN1Y2ggdGhpbmdzCisJICogaW4gbWFpbiBtZW1vcnkgcmF0aGVyIHRoYW4gb24gdGhlIFBDSSBidXMKKwkgKi8KKwl1MzIgcG9ydEhhbmRsZVtGU1RfTUFYX1BPUlRTXTsKKworCS8qIENvdW50IG9mIFR4IHVuZGVyZmxvd3MgZm9yIHN0YXRzICovCisJdTMyIHRyYW5zbWl0QnVmZmVyVW5kZXJmbG93W0ZTVF9NQVhfUE9SVFNdOworCisJLyogRGVib3VuY2VkIFYuMjQgY29udHJvbCBpbnB1dCBzdGF0dXMgKi8KKwl1MzIgdjI0RGVib3VuY2VkU3RzW0ZTVF9NQVhfUE9SVFNdOworCisJLyogQWRhcHRlciBkZWJvdW5jZSB0aW1lcnMuIERvbid0IHRvdWNoICovCisJdTMyIGN0c1RpbWVyW0ZTVF9NQVhfUE9SVFNdOworCXUzMiBjdHNUaW1lclJ1bltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgZGNkVGltZXJbRlNUX01BWF9QT1JUU107CisJdTMyIGRjZFRpbWVyUnVuW0ZTVF9NQVhfUE9SVFNdOworCisJdTMyIG51bWJlck9mUG9ydHM7CS8qIE51bWJlciBvZiBwb3J0cyBkZXRlY3RlZCBhdCBzdGFydHVwICovCisKKwl1MTYgX3Jlc2VydmVkWzY0XTsKKworCXUxNiBjYXJkTW9kZTsJCS8qIEJpdC1tYXNrIHRvIGVuYWJsZSBmZWF0dXJlczoKKwkJCQkgKiBCaXQgMDogMSBlbmFibGVzIExFRCBpZGVudGlmeSBtb2RlCisJCQkJICovCisKKwl1MTYgcG9ydFNjaGVkdWxlT2Zmc2V0OworCisJc3RydWN0IHN1X2NvbmZpZyBzdUNvbmZpZzsJLyogVEUxIEJpdHMgKi8KKwlzdHJ1Y3Qgc3Vfc3RhdHVzIHN1U3RhdHVzOworCisJdTMyIGVuZE9mU21jU2lnbmF0dXJlOwkvKiBlbmRPZlNtY1NpZ25hdHVyZSBNVVNUIGJlIHRoZSBsYXN0IG1lbWJlciBvZgorCQkJCSAqIHRoZSBzdHJ1Y3R1cmUgYW5kIG1hcmtzIHRoZSBlbmQgb2Ygc2hhcmVkCisJCQkJICogbWVtb3J5LiBBZGFwdGVyIGNvZGUgaW5pdGlhbGl6ZXMgaXQgYXMKKwkJCQkgKiBFTkRfU0lHLgorCQkJCSAqLworfTsKKworLyogZW5kT2ZTbWNTaWduYXR1cmUgdmFsdWUgKi8KKyNkZWZpbmUgRU5EX1NJRyAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAorCisvKiBNYWlsYm94IHZhbHVlcy4gKHBvcnRNYWlsYm94KSAqLworI2RlZmluZSBOT1AgICAgICAgICAgICAgMAkvKiBObyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgQUNLICAgICAgICAgICAgIDEJLyogUG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRyaXZlciAqLworI2RlZmluZSBOQUsgICAgICAgICAgICAgMgkvKiBOZWdhdGl2ZSBhY2tub3dsZWRnZW1lbnQgdG8gUEMgZHJpdmVyICovCisjZGVmaW5lIFNUQVJUUE9SVCAgICAgICAzCS8qIFN0YXJ0IGFuIEhETEMgcG9ydCAqLworI2RlZmluZSBTVE9QUE9SVCAgICAgICAgNAkvKiBTdG9wIGFuIEhETEMgcG9ydCAqLworI2RlZmluZSBBQk9SVFRYICAgICAgICAgNQkvKiBBYm9ydCB0aGUgdHJhbnNtaXR0ZXIgZm9yIGEgcG9ydCAqLworI2RlZmluZSBTRVRWMjRPICAgICAgICAgNgkvKiBTZXQgVjI0IG91dHB1dHMgKi8KKworLyogUExYIENoaXAgUmVnaXN0ZXIgT2Zmc2V0cyAqLworI2RlZmluZSBDTlRSTF85MDUyICAgICAgMHg1MAkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENOVFJMXzkwNTQgICAgICAweDZjCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBJTlRDU1JfOTA1MiAgICAgMHg0YwkvKiBJbnRlcnJ1cHQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5UQ1NSXzkwNTQgICAgIDB4NjgJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisKKy8qIDkwNTQgRE1BIFJlZ2lzdGVycyAqLworLyoKKyAqIE5vdGUgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nIERNQSBDaGFubmVsIDAgZm9yIGNvcHlpbmcgcnggZGF0YQorICogYW5kIENoYW5uZWwgMSBmb3IgY29weWluZyB0eCBkYXRhCisgKi8KKyNkZWZpbmUgRE1BTU9ERTAgICAgICAgIDB4ODAKKyNkZWZpbmUgRE1BUEFEUjAgICAgICAgIDB4ODQKKyNkZWZpbmUgRE1BTEFEUjAgICAgICAgIDB4ODgKKyNkZWZpbmUgRE1BU0laMCAgICAgICAgIDB4OGMKKyNkZWZpbmUgRE1BRFBSMCAgICAgICAgIDB4OTAKKyNkZWZpbmUgRE1BTU9ERTEgICAgICAgIDB4OTQKKyNkZWZpbmUgRE1BUEFEUjEgICAgICAgIDB4OTgKKyNkZWZpbmUgRE1BTEFEUjEgICAgICAgIDB4OWMKKyNkZWZpbmUgRE1BU0laMSAgICAgICAgIDB4YTAKKyNkZWZpbmUgRE1BRFBSMSAgICAgICAgIDB4YTQKKyNkZWZpbmUgRE1BQ1NSMCAgICAgICAgIDB4YTgKKyNkZWZpbmUgRE1BQ1NSMSAgICAgICAgIDB4YTkKKyNkZWZpbmUgRE1BQVJCICAgICAgICAgIDB4YWMKKyNkZWZpbmUgRE1BVEhSICAgICAgICAgIDB4YjAKKyNkZWZpbmUgRE1BREFDMCAgICAgICAgIDB4YjQKKyNkZWZpbmUgRE1BREFDMSAgICAgICAgIDB4YjgKKyNkZWZpbmUgRE1BTUFSQlIgICAgICAgIDB4YWMKKworI2RlZmluZSBGU1RfTUlOX0RNQV9MRU4gNjQKKyNkZWZpbmUgRlNUX1JYX0RNQV9JTlQgIDB4MDEKKyNkZWZpbmUgRlNUX1RYX0RNQV9JTlQgIDB4MDIKKyNkZWZpbmUgRlNUX0NBUkRfSU5UICAgIDB4MDQKKworLyogTGFyZ2VyIGJ1ZmZlcnMgYXJlIHBvc2l0aW9uZWQgaW4gbWVtb3J5IGF0IG9mZnNldCBCRk1fQkFTRSAqLworc3RydWN0IGJ1Zl93aW5kb3cgeworCXU4IHR4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJdW0xFTl9UWF9CVUZGRVJdOworCXU4IHJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9SWF9CVUZGRVJdOworfTsKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGJ1ZmZlciBvYmplY3Qgd2l0aGluIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyAqLworI2RlZmluZSBCVUZfT0ZGU0VUKFgpICAgKEJGTV9CQVNFICsgb2Zmc2V0b2Yoc3RydWN0IGJ1Zl93aW5kb3csIFgpKQorCisjcHJhZ21hIHBhY2soKQorCisvKiAgICAgIERldmljZSBkcml2ZXIgcHJpdmF0ZSBpbmZvcm1hdGlvbgorICogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyogICAgICBQZXIgcG9ydCAobGluZSBvciBjaGFubmVsKSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgZnN0X3BvcnRfaW5mbyB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IC8qIERldmljZSBzdHJ1Y3QgLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CS8qIENhcmQgd2UncmUgYXNzb2NpYXRlZCB3aXRoICovCisJaW50IGluZGV4OwkJLyogUG9ydCBpbmRleCBvbiB0aGUgY2FyZCAqLworCWludCBod2lmOwkJLyogTGluZSBoYXJkd2FyZSAobGluZUludGVyZmFjZSBjb3B5KSAqLworCWludCBydW47CQkvKiBQb3J0IGlzIHJ1bm5pbmcgKi8KKwlpbnQgbW9kZTsJCS8qIE5vcm1hbCBvciBGYXJTeW5jIHJhdyAqLworCWludCByeHBvczsJCS8qIE5leHQgUnggYnVmZmVyIHRvIHVzZSAqLworCWludCB0eHBvczsJCS8qIE5leHQgVHggYnVmZmVyIHRvIHVzZSAqLworCWludCB0eGlwb3M7CQkvKiBOZXh0IFR4IGJ1ZmZlciB0byBjaGVjayBmb3IgZnJlZSAqLworCWludCBzdGFydDsJCS8qIEluZGljYXRpb24gb2Ygc3RhcnQvc3RvcCB0byBuZXR3b3JrICovCisJLyoKKwkgKiBBIHNpeHRlZW4gZW50cnkgdHJhbnNtaXQgcXVldWUKKwkgKi8KKwlpbnQgdHhxczsJCS8qIGluZGV4IHRvIGdldCBuZXh0IGJ1ZmZlciB0byB0eCAqLworCWludCB0eHFlOwkJLyogaW5kZXggdG8gcXVldWUgbmV4dCBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhxW0ZTVF9UWFFfREVQVEhdOwkvKiBUaGUgcXVldWUgKi8KKwlpbnQgcnhxZGVwdGg7Cit9OworCisvKiAgICAgIFBlciBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBmc3RfY2FyZF9pbmZvIHsKKwljaGFyIF9faW9tZW0gKm1lbTsJLyogQ2FyZCBtZW1vcnkgbWFwcGVkIHRvIGtlcm5lbCBzcGFjZSAqLworCWNoYXIgX19pb21lbSAqY3RsbWVtOwkvKiBDb250cm9sIG1lbW9yeSBmb3IgUENJIGNhcmRzICovCisJdW5zaWduZWQgaW50IHBoeXNfbWVtOwkvKiBQaHlzaWNhbCBtZW1vcnkgd2luZG93IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgcGh5c19jdGxtZW07CS8qIFBoeXNpY2FsIGNvbnRyb2wgbWVtb3J5IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBsaW5lIG51bWJlciAqLworCXVuc2lnbmVkIGludCBucG9ydHM7CS8qIE51bWJlciBvZiBzZXJpYWwgcG9ydHMgKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsJLyogVHlwZSBpbmRleCBvZiBjYXJkICovCisJdW5zaWduZWQgaW50IHN0YXRlOwkvKiBTdGF0ZSBvZiBjYXJkICovCisJc3BpbmxvY2tfdCBjYXJkX2xvY2s7CS8qIExvY2sgZm9yIFNNUCBhY2Nlc3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBwY2lfY29uZjsJLyogUENJIGNhcmQgY29uZmlnIGluIEkvTyBzcGFjZSAqLworCS8qIFBlciBwb3J0IGluZm8gKi8KKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyBwb3J0c1tGU1RfTUFYX1BPUlRTXTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlOwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGNpIGRldmljZSAqLworCWludCBjYXJkX25vOwkJLyogSW5zdCBvZiB0aGUgY2FyZCBvbiB0aGUgc3lzdGVtICovCisJaW50IGZhbWlseTsJCS8qIFR4UCBvciBUeFUgKi8KKwlpbnQgZG1hcnhfaW5fcHJvZ3Jlc3M7CisJaW50IGRtYXR4X2luX3Byb2dyZXNzOworCXVuc2lnbmVkIGxvbmcgaW50X2NvdW50OworCXVuc2lnbmVkIGxvbmcgaW50X3RpbWVfYXZlOworCXZvaWQgKnJ4X2RtYV9oYW5kbGVfaG9zdDsKKwlkbWFfYWRkcl90IHJ4X2RtYV9oYW5kbGVfY2FyZDsKKwl2b2lkICp0eF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2FkZHJfdCB0eF9kbWFfaGFuZGxlX2NhcmQ7CisJc3RydWN0IHNrX2J1ZmYgKmRtYV9za2Jfcng7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKmRtYV9wb3J0X3J4OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpkbWFfcG9ydF90eDsKKwlpbnQgZG1hX2xlbl9yeDsKKwlpbnQgZG1hX2xlbl90eDsKKwlpbnQgZG1hX3R4cG9zOworCWludCBkbWFfcnhwb3M7Cit9OworCisvKiBDb252ZXJ0IGFuIEhETEMgZGV2aWNlIHBvaW50ZXIgaW50byBhIHBvcnQgaW5mbyBwb2ludGVyIGFuZCBzaW1pbGFyICovCisjZGVmaW5lIGRldl90b19wb3J0KEQpICAoZGV2X3RvX2hkbGMoRCktPnByaXYpCisjZGVmaW5lIHBvcnRfdG9fZGV2KFApICAoKFApLT5kZXYpCisKKworLyoKKyAqICAgICAgU2hhcmVkIG1lbW9yeSB3aW5kb3cgYWNjZXNzIG1hY3JvcworICoKKyAqICAgICAgV2UgaGF2ZSBhIG5pY2UgbWVtb3J5IGJhc2VkIHN0cnVjdHVyZSBhYm92ZSwgd2hpY2ggY291bGQgYmUgZGlyZWN0bHkKKyAqICAgICAgbWFwcGVkIG9uIGkzODYgYnV0IG1pZ2h0IG5vdCB3b3JrIG9uIG90aGVyIGFyY2hpdGVjdHVyZXMgdW5sZXNzIHdlIHVzZQorICogICAgICB0aGUgcmVhZGIsdyxsIGFuZCB3cml0ZWIsdyxsIG1hY3Jvcy4gVW5mb3J0dW5hdGVseSB0aGVzZSBtYWNyb3MgdGFrZQorICogICAgICBwaHlzaWNhbCBvZmZzZXRzIHNvIHdlIGhhdmUgdG8gY29udmVydC4gVGhlIG9ubHkgc2F2aW5nIGdyYWNlIGlzIHRoYXQKKyAqICAgICAgdGhpcyBzaG91bGQgYWxsIGNvbGxhcHNlIGJhY2sgdG8gYSBzaW1wbGUgaW5kaXJlY3Rpb24gZXZlbnR1YWxseS4KKyAqLworI2RlZmluZSBXSU5fT0ZGU0VUKFgpICAgKChsb25nKSYoKChzdHJ1Y3QgZnN0X3NoYXJlZCAqKVNNQ19CQVNFKS0+WCkpCisKKyNkZWZpbmUgRlNUX1JEQihDLEUpICAgIHJlYWRiICgoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisjZGVmaW5lIEZTVF9SRFcoQyxFKSAgICByZWFkdyAoKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorI2RlZmluZSBGU1RfUkRMKEMsRSkgICAgcmVhZGwgKChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKworI2RlZmluZSBGU1RfV1JCKEMsRSxCKSAgd3JpdGViICgoQiksIChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKyNkZWZpbmUgRlNUX1dSVyhDLEUsVykgIHdyaXRldyAoKFcpLCAoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisjZGVmaW5lIEZTVF9XUkwoQyxFLEwpICB3cml0ZWwgKChMKSwgKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorCisvKgorICogICAgICBEZWJ1ZyBzdXBwb3J0CisgKi8KKyNpZiBGU1RfREVCVUcKKworc3RhdGljIGludCBmc3RfZGVidWdfbWFzayA9IHsgRlNUX0RFQlVHIH07CisKKy8qIE1vc3QgY29tbW9uIGRlYnVnIGFjdGl2aXR5IGlzIHRvIHByaW50IHNvbWV0aGluZyBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQKKyAqIGlzIHNldCBpbiB0aGUgZGVidWcgbWFzay4gTm90ZTogdGhpcyB1c2VzIGEgbm9uLUFOU0kgZXh0ZW5zaW9uIGluIEdDQyB0bworICogc3VwcG9ydCB2YXJpYWJsZSBudW1iZXJzIG9mIG1hY3JvIHBhcmFtZXRlcnMuIFRoZSBpbnZlcnRlZCBpZiBwcmV2ZW50cyB1cworICogZWF0aW5nIHNvbWVvbmUgZWxzZSdzIGVsc2UgY2xhdXNlLgorICovCisjZGVmaW5lIGRiZyhGLGZtdCxBLi4uKSBpZiAoICEgKCBmc3RfZGVidWdfbWFzayAmIChGKSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrICggS0VSTl9ERUJVRyBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisKKyNlbHNlCisjZGVmaW5lIGRiZyhYLi4uKQkJLyogTk9QICovCisjZW5kaWYKKworLyogICAgICBQcmludGluZyBzaG9ydCBjdXRzCisgKi8KKyNkZWZpbmUgcHJpbnRrX2VycihmbXQsQS4uLikgICAgcHJpbnRrICggS0VSTl9FUlIgICAgIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKKyNkZWZpbmUgcHJpbnRrX3dhcm4oZm10LEEuLi4pICAgcHJpbnRrICggS0VSTl9XQVJOSU5HIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKKyNkZWZpbmUgcHJpbnRrX2luZm8oZm10LEEuLi4pICAgcHJpbnRrICggS0VSTl9JTkZPICAgIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKKworLyoKKyAqICAgICAgUENJIElEIGxvb2t1cCB0YWJsZQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZnN0X3BjaV9kZXZfaWRbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlAsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlB9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0UCwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1Q0UH0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDFVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDFVfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlV9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0VSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1Q0VX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUxLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTFDLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKwl7MCx9CQkJLyogRW5kICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZnN0X3BjaV9kZXZfaWQpOworCisvKgorICogICAgICBEZXZpY2UgRHJpdmVyIFdvcmsgUXVldWVzCisgKgorICogICAgICBTbyB0aGF0IHdlIGRvbid0IHNwZW5kIHRvbyBtdWNoIHRpbWUgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIAorICogICAgICBJbnRlcnJ1cHQgU2VydmljZSByb3V0aW5lLCB3ZSB3aWxsIGRlY2xhcmUgYSB3b3JrIHF1ZXVlIHBlciBDYXJkIAorICogICAgICBhbmQgbWFrZSB0aGUgSVNSIHNjaGVkdWxlIGEgdGFzayBpbiB0aGUgcXVldWUgZm9yIGxhdGVyIGV4ZWN1dGlvbi4KKyAqICAgICAgSW4gdGhlIDIuNCBLZXJuZWwgd2UgdXNlZCB0byB1c2UgdGhlIGltbWVkaWF0ZSBxdWV1ZSBmb3IgQkgncworICogICAgICBOb3cgdGhhdCB0aGV5IGFyZSBnb25lLCB0YXNrbGV0cyBzZWVtIHRvIGJlIG11Y2ggYmV0dGVyIHRoYW4gd29yayAKKyAqICAgICAgcXVldWVzLgorICovCisKK3N0YXRpYyB2b2lkIGRvX2JvdHRvbV9oYWxmX3R4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRvX2JvdHRvbV9oYWxmX3J4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKTsKK3N0YXRpYyB2b2lkIGZzdF9wcm9jZXNzX3R4X3dvcmtfcSh1bnNpZ25lZCBsb25nIHdvcmtfcSk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vzc19pbnRfd29ya19xKHVuc2lnbmVkIGxvbmcgd29ya19xKTsKKworREVDTEFSRV9UQVNLTEVUKGZzdF90eF90YXNrLCBmc3RfcHJvY2Vzc190eF93b3JrX3EsIDApOworREVDTEFSRV9UQVNLTEVUKGZzdF9pbnRfdGFzaywgZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSwgMCk7CisKK3N0cnVjdCBmc3RfY2FyZF9pbmZvICpmc3RfY2FyZF9hcnJheVtGU1RfTUFYX0NBUkRTXTsKK3NwaW5sb2NrX3QgZnN0X3dvcmtfcV9sb2NrOwordTY0IGZzdF93b3JrX3R4cTsKK3U2NCBmc3Rfd29ya19pbnRxOworCitzdGF0aWMgdm9pZAorZnN0X3Ffd29ya19pdGVtKHU2NCAqIHF1ZXVlLCBpbnQgY2FyZF9pbmRleCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCBtYXNrOworCisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogTWFraW5nIGFuIGVudHJ5IGluIHRoZSBxdWV1ZSBpcyBzaW1wbHkgYSBtYXR0ZXIgb2Ygc2V0dGluZworCSAqIGEgYml0IGZvciB0aGUgY2FyZCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgd29yayB0byBkbyBpbiB0aGUKKwkgKiBib3R0b20gaGFsZiBmb3IgdGhlIGNhcmQuICBOb3RlIHRoZSBsaW1pdGF0aW9uIG9mIDY0IGNhcmRzLgorCSAqIFRoYXQgb3VnaHQgdG8gYmUgZW5vdWdoCisJICovCisJbWFzayA9IDEgPDwgY2FyZF9pbmRleDsKKwkqcXVldWUgfD0gbWFzazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2ZzdF9wcm9jZXNzX3R4X3dvcmtfcSh1bnNpZ25lZCBsb25nIC8qdm9pZCAqKi93b3JrX3EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgd29ya190eHE7CisJaW50IGk7CisKKwkvKgorCSAqIEdyYWIgdGhlIHF1ZXVlIGV4Y2x1c2l2ZWx5CisJICovCisJZGJnKERCR19UWCwgImZzdF9wcm9jZXNzX3R4X3dvcmtfcVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3MpOworCXdvcmtfdHhxID0gZnN0X3dvcmtfdHhxOworCWZzdF93b3JrX3R4cSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENhbGwgdGhlIGJvdHRvbSBoYWxmIGZvciBlYWNoIGNhcmQgd2l0aCB3b3JrIHdhaXRpbmcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRlNUX01BWF9DQVJEUzsgaSsrKSB7CisJCWlmICh3b3JrX3R4cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAhPSBOVUxMKSB7CisJCQkJZGJnKERCR19UWCwgIkNhbGxpbmcgdHggYmggZm9yIGNhcmQgJWRcbiIsIGkpOworCQkJCWRvX2JvdHRvbV9oYWxmX3R4KGZzdF9jYXJkX2FycmF5W2ldKTsKKwkJCX0KKwkJfQorCQl3b3JrX3R4cSA9IHdvcmtfdHhxID4+IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAorZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSh1bnNpZ25lZCBsb25nIC8qdm9pZCAqKi93b3JrX3EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgd29ya19pbnRxOworCWludCBpOworCisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCWRiZyhEQkdfSU5UUiwgImZzdF9wcm9jZXNzX2ludF93b3JrX3FcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKwl3b3JrX2ludHEgPSBmc3Rfd29ya19pbnRxOworCWZzdF93b3JrX2ludHEgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBDYWxsIHRoZSBib3R0b20gaGFsZiBmb3IgZWFjaCBjYXJkIHdpdGggd29yayB3YWl0aW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykgeworCQlpZiAod29ya19pbnRxICYgMHgwMSkgeworCQkJaWYgKGZzdF9jYXJkX2FycmF5W2ldICE9IE5VTEwpIHsKKwkJCQlkYmcoREJHX0lOVFIsCisJCQkJICAgICJDYWxsaW5nIHJ4ICYgdHggYmggZm9yIGNhcmQgJWRcbiIsIGkpOworCQkJCWRvX2JvdHRvbV9oYWxmX3J4KGZzdF9jYXJkX2FycmF5W2ldKTsKKwkJCQlkb19ib3R0b21faGFsZl90eChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQl9CisJCX0KKwkJd29ya19pbnRxID0gd29ya19pbnRxID4+IDE7CisJfQorfQorCisvKiAgICAgIENhcmQgY29udHJvbCBmdW5jdGlvbnMKKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PQorICovCisvKiAgICAgIFBsYWNlIHRoZSBwcm9jZXNzb3IgaW4gcmVzZXQgc3RhdGUKKyAqCisgKiBVc2VkIHRvIGJlIGEgc2ltcGxlIHdyaXRlIHRvIGNhcmQgY29udHJvbCBzcGFjZSBidXQgYSBnbGl0Y2ggaW4gdGhlIGxhdGVzdAorICogQU1EIEFtMTg2Q0ggcHJvY2Vzc29yIG1lYW5zIHRoYXQgd2Ugbm93IGhhdmUgdG8gZG8gaXQgYnkgYXNzZXJ0aW5nIGFuZCBkZS0KKyAqIGFzc2VydGluZyB0aGUgUExYIGNoaXAgUENJIEFkYXB0ZXIgU29mdHdhcmUgUmVzZXQuIEJpdCAzMCBpbiBDTlRSTCByZWdpc3RlcgorICogYXQgb2Zmc2V0IDkwNTJfQ05UUkwuICBOb3RlIHRoZSB1cGRhdGVzIGZvciB0aGUgVFhVLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9jcHVyZXNldChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGludGVycnVwdF9saW5lX3JlZ2lzdGVyOworCXVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAxOworCXVuc2lnbmVkIGludCByZWd2YWw7CisKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaW50ZXJydXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4gcmVhZGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KKwkJLyoKKwkJICogQXNzZXJ0IFBMWCBzb2Z0d2FyZSByZXNldCBhbmQgQW0xODYgaGFyZHdhcmUgcmVzZXQKKwkJICogYW5kIHRoZW4gZGVhc3NlcnQgdGhlIFBMWCBzb2Z0d2FyZSByZXNldCBidXQgMTg2IHN0aWxsIGluIHJlc2V0CisJCSAqLworCQlvdXR3KDB4NDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwkJLyoKKwkJICogV2UgYXJlIGRlbGF5aW5nIGhlcmUgdG8gYWxsb3cgdGhlIDkwNTQgdG8gcmVzZXQgaXRzZWxmCisJCSAqLworCQlqID0gamlmZmllcyArIDE7CisJCXdoaWxlIChqaWZmaWVzIDwgaikKKwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4MjQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCS8qCisJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93IHRoZSA5MDU0IHRvIHJlbG9hZCBpdHMgZWVwcm9tCisJCSAqLworCQlqID0gamlmZmllcyArIDE7CisJCXdoaWxlIChqaWZmaWVzIDwgaikKKwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisKKwkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCBpbnRlcnJ1cHRfbGluZV9yZWdpc3RlcikpIHsKKwkJCWRiZyhEQkdfQVNTLAorCQkJICAgICJFcnJvciBpbiB3cml0aW5nIGludGVycnVwdCBsaW5lIHJlZ2lzdGVyXG4iKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJcmVndmFsID0gaW5sKGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1Mik7CisKKwkJb3V0bChyZWd2YWwgfCAweDQwMDAwMDAwLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOworCQlvdXRsKHJlZ3ZhbCAmIH4weDQwMDAwMDAwLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOworCX0KK30KKworLyogICAgICBSZWxlYXNlIHRoZSBwcm9jZXNzb3IgZnJvbSByZXNldAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9jcHVyZWxlYXNlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJICogRm9yY2UgcG9zdGVkIHdyaXRlcyB0byBjb21wbGV0ZQorCQkgKi8KKwkJKHZvaWQpIHJlYWRiKGNhcmQtPm1lbSk7CisKKwkJLyoKKwkJICogUmVsZWFzZSBMUkVTRVQgRE8gPSAxCisJCSAqIFRoZW4gcmVsZWFzZSBMb2NhbCBIb2xkLCBETyA9IDEKKwkJICovCisJCW91dHcoMHgwNDBlLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwkJb3V0dygweDA0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCX0gZWxzZSB7CisJCSh2b2lkKSByZWFkYihjYXJkLT5jdGxtZW0pOworCX0KK30KKworLyogICAgICBDbGVhciB0aGUgY2FyZHMgaW50ZXJydXB0IGZsYWcKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfY2xlYXJfaW50cihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCSh2b2lkKSByZWFkYihjYXJkLT5jdGxtZW0pOworCX0gZWxzZSB7CisJCS8qIFBva2UgdGhlIGFwcHJvcHJpYXRlIFBMWCBjaGlwIHJlZ2lzdGVyIChzYW1lIGFzIGVuYWJsaW5nIGludGVycnVwdHMpCisJCSAqLworCQlvdXR3KDB4MDU0MywgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIEVuYWJsZSBjYXJkIGludGVycnVwdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfZW5hYmxlX2ludHIoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlvdXRsKDB4MGYwYzA5MDAsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTQpOworCX0gZWxzZSB7CisJCW91dHcoMHgwNTQzLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDUyKTsKKwl9Cit9CisKKy8qICAgICAgRGlzYWJsZSBjYXJkIGludGVycnVwdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfZGlzYWJsZV9pbnRyKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDU0KTsKKwl9IGVsc2UgeworCQlvdXR3KDB4MDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIFByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gcGFzcyBhIHJlY2VpdmVkIGZyYW1lIHVwIHRoZSBzdGFjaworICovCitzdGF0aWMgdm9pZAorZnN0X3Byb2Nlc3Nfcnhfc3RhdHVzKGludCByeF9zdGF0dXMsIGNoYXIgKm5hbWUpCit7CisJc3dpdGNoIChyeF9zdGF0dXMpIHsKKwljYXNlIE5FVF9SWF9TVUNDRVNTOgorCQl7CisJCQkvKgorCQkJICogTm90aGluZyB0byBkbyBoZXJlCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9MT1c6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmUgTG93IENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTkVUX1JYX0NOX01PRDoKKwkJeworCQkJZGJnKERCR19BU1MsICIlczogUmVjZWl2ZSBNb2RlcmF0ZSBDb25nZXN0aW9uXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9ISUdIOgorCQl7CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlIEhpZ2ggQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfRFJPUDoKKwkJeworCQkJZGJnKERCR19BU1MsICIlczogUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWRcbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qICAgICAgSW5pdGlsYWlzZSBETUEgZm9yIFBMWCA5MDU0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2luaXRfZG1hKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCS8qCisJICogVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGZvciB0aGUgUExYIDkwNTQKKwkgKi8KKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJICAgICAgICBwY2lfc2V0X21hc3RlcihjYXJkLT5kZXZpY2UpOworCQlvdXRsKDB4MDAwMjA0NDEsIGNhcmQtPnBjaV9jb25mICsgRE1BTU9ERTApOworCQlvdXRsKDB4MDAwMjA0NDEsIGNhcmQtPnBjaV9jb25mICsgRE1BTU9ERTEpOworCQlvdXRsKDB4MCwgY2FyZC0+cGNpX2NvbmYgKyBETUFUSFIpOworCX0KK30KKworLyogICAgICBUeCBkbWEgY29tcGxldGUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfdHhfZG1hX2NvbXBsZXRlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJICAgIGludCBsZW4sIGludCB0eHBvcykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJLyoKKwkgKiBFdmVyeXRoaW5nIGlzIG5vdyBzZXQsIGp1c3QgdGVsbCB0aGUgY2FyZCB0byBnbworCSAqLworCWRiZyhEQkdfVFgsICJmc3RfdHhfZG1hX2NvbXBsZXRlXG4iKTsKKwlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BvcnQtPmluZGV4XVt0eHBvc10uYml0cywKKwkJRE1BX09XTiB8IFRYX1NUUCB8IFRYX0VOUCk7CisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisvKgorICogTWFyayBpdCBmb3Igb3VyIG93biByYXcgc29ja2V0cyBpbnRlcmZhY2UKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZhcnN5bmNfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCXJldHVybiBodG9ucyhFVEhfUF9DVVNUKTsKK30KKworLyogICAgICBSeCBkbWEgY29tcGxldGUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfcnhfZG1hX2NvbXBsZXRlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJICAgIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IsIGludCByeHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgcGk7CisJaW50IHJ4X3N0YXR1czsKKworCWRiZyhEQkdfVFgsICJmc3RfcnhfZG1hX2NvbXBsZXRlXG4iKTsKKwlwaSA9IHBvcnQtPmluZGV4OworCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgY2FyZC0+cnhfZG1hX2hhbmRsZV9ob3N0LCBsZW4pOworCisJLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCisJLyogVXBkYXRlIHN0YXRzICovCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gbGVuOworCisJLyogUHVzaCB1cHN0cmVhbSAqLworCWRiZyhEQkdfUlgsICJQdXNoaW5nIHRoZSBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOworCWlmIChwb3J0LT5tb2RlID09IEZTVF9SQVcpCisJCXNrYi0+cHJvdG9jb2wgPSBmYXJzeW5jX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCWVsc2UKKwkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJcnhfc3RhdHVzID0gbmV0aWZfcngoc2tiKTsKKwlmc3RfcHJvY2Vzc19yeF9zdGF0dXMocnhfc3RhdHVzLCBwb3J0X3RvX2Rldihwb3J0KS0+bmFtZSk7CisJaWYgKHJ4X3N0YXR1cyA9PSBORVRfUlhfRFJPUCkKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCisvKgorICogICAgICBSZWNlaXZlIGEgZnJhbWUgdGhyb3VnaCB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X3J4X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgdW5zaWduZWQgY2hhciAqc2tiLAorCSAgIHVuc2lnbmVkIGNoYXIgKm1lbSwgaW50IGxlbikKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB3aWxsIHNldHVwIHRoZSBETUEgYW5kIHN0YXJ0IGl0CisJICovCisKKwlkYmcoREJHX1JYLCAiSW4gZnN0X3J4X2RtYSAlcCAlcCAlZFxuIiwgc2tiLCBtZW0sIGxlbik7CisJaWYgKGNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzKSB7CisJCWRiZyhEQkdfQVNTLCAiSW4gZnN0X3J4X2RtYSB3aGlsZSBkbWEgaW4gcHJvZ3Jlc3NcbiIpOworCX0KKworCW91dGwoKHVuc2lnbmVkIGxvbmcpIHNrYiwgY2FyZC0+cGNpX2NvbmYgKyBETUFQQURSMCk7CS8qIENvcHkgdG8gaGVyZSAqLworCW91dGwoKHVuc2lnbmVkIGxvbmcpIG1lbSwgY2FyZC0+cGNpX2NvbmYgKyBETUFMQURSMCk7CS8qIGZyb20gaGVyZSAqLworCW91dGwobGVuLCBjYXJkLT5wY2lfY29uZiArIERNQVNJWjApOwkvKiBmb3IgdGhpcyBsZW5ndGggKi8KKwlvdXRsKDB4MDAwMDAwMDBjLCBjYXJkLT5wY2lfY29uZiArIERNQURQUjApOwkvKiBJbiB0aGlzIGRpcmVjdGlvbiAqLworCisJLyoKKwkgKiBXZSB1c2UgdGhlIGRtYXJ4X2luX3Byb2dyZXNzIGZsYWcgdG8gZmxhZyB0aGUgY2hhbm5lbCBhcyBidXN5CisJICovCisJY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MgPSAxOworCW91dGIoMHgwMywgY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IwKTsJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCit9CisKKy8qCisgKiAgICAgIFNlbmQgYSBmcmFtZSB0aHJvdWdoIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfdHhfZG1hKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCB1bnNpZ25lZCBjaGFyICpza2IsCisJICAgdW5zaWduZWQgY2hhciAqbWVtLCBpbnQgbGVuKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIHdpbGwgc2V0dXAgdGhlIERNQSBhbmQgc3RhcnQgaXQuCisJICovCisKKwlkYmcoREJHX1RYLCAiSW4gZnN0X3R4X2RtYSAlcCAlcCAlZFxuIiwgc2tiLCBtZW0sIGxlbik7CisJaWYgKGNhcmQtPmRtYXR4X2luX3Byb2dyZXNzKSB7CisJCWRiZyhEQkdfQVNTLCAiSW4gZnN0X3R4X2RtYSB3aGlsZSBkbWEgaW4gcHJvZ3Jlc3NcbiIpOworCX0KKworCW91dGwoKHVuc2lnbmVkIGxvbmcpIHNrYiwgY2FyZC0+cGNpX2NvbmYgKyBETUFQQURSMSk7CS8qIENvcHkgZnJvbSBoZXJlICovCisJb3V0bCgodW5zaWduZWQgbG9uZykgbWVtLCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIxKTsJLyogdG8gaGVyZSAqLworCW91dGwobGVuLCBjYXJkLT5wY2lfY29uZiArIERNQVNJWjEpOwkvKiBmb3IgdGhpcyBsZW5ndGggKi8KKwlvdXRsKDB4MDAwMDAwMDA0LCBjYXJkLT5wY2lfY29uZiArIERNQURQUjEpOwkvKiBJbiB0aGlzIGRpcmVjdGlvbiAqLworCisJLyoKKwkgKiBXZSB1c2UgdGhlIGRtYXR4X2luX3Byb2dyZXNzIHRvIGZsYWcgdGhlIGNoYW5uZWwgYXMgYnVzeQorCSAqLworCWNhcmQtPmRtYXR4X2luX3Byb2dyZXNzID0gMTsKKwlvdXRiKDB4MDMsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMSk7CS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciAqLworfQorCisvKiAgICAgIElzc3VlIGEgTWFpbGJveCBjb21tYW5kIGZvciBhIHBvcnQuCisgKiAgICAgIE5vdGUgd2UgaXNzdWUgdGhlbSBvbiBhIGZpcmUgYW5kIGZvcmdldCBiYXNpcywgbm90IGV4cGVjdGluZyB0byBzZWUgYW4KKyAqICAgICAgZXJyb3IgYW5kIG5vdCB3YWl0aW5nIGZvciBjb21wbGV0aW9uLgorICovCitzdGF0aWMgdm9pZAorZnN0X2lzc3VlX2NtZChzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwgdW5zaWduZWQgc2hvcnQgY21kKQoreworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXVuc2lnbmVkIHNob3J0IG1idmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNhZmV0eTsKKworCWNhcmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwltYnZhbCA9IEZTVF9SRFcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdKTsKKworCXNhZmV0eSA9IDA7CisJLyogV2FpdCBmb3IgYW55IHByZXZpb3VzIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAobWJ2YWwgPiBOQUspIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoKytzYWZldHkgPiAyMDAwKSB7CisJCQlwcmludGtfZXJyKCJNYWlsYm94IHNhZmV0eSB0aW1lb3V0XG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWJ2YWwgPSBGU1RfUkRXKGNhcmQsIHBvcnRNYWlsYm94W3BvcnQtPmluZGV4XVswXSk7CisJfQorCWlmIChzYWZldHkgPiAwKSB7CisJCWRiZyhEQkdfQ01ELCAiTWFpbGJveCBjbGVhciBhZnRlciAlZCBqaWZmaWVzXG4iLCBzYWZldHkpOworCX0KKwlpZiAobWJ2YWwgPT0gTkFLKSB7CisJCWRiZyhEQkdfQ01ELCAiaXNzdWVfY21kOiBwcmV2aW91cyBjb21tYW5kIHdhcyBOQUsnZFxuIik7CisJfQorCisJRlNUX1dSVyhjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0sIGNtZCk7CisKKwlpZiAoY21kID09IEFCT1JUVFggfHwgY21kID09IFNUQVJUUE9SVCkgeworCQlwb3J0LT50eHBvcyA9IDA7CisJCXBvcnQtPnR4aXBvcyA9IDA7CisJCXBvcnQtPnN0YXJ0ID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKK30KKworLyogICAgICBQb3J0IG91dHB1dCBzaWduYWxzIGNvbnRyb2wKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3Rfb3BfcmFpc2Uoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsIHVuc2lnbmVkIGludCBvdXRwdXRzKQoreworCW91dHB1dHMgfD0gRlNUX1JETChwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOworCUZTVF9XUkwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRwdXRzKTsKKworCWlmIChwb3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X29wX2xvd2VyKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQgb3V0cHV0cykKK3sKKwlvdXRwdXRzID0gfm91dHB1dHMgJiBGU1RfUkRMKHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSk7CisJRlNUX1dSTChwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0sIG91dHB1dHMpOworCisJaWYgKHBvcnQtPnJ1bikKKwkJZnN0X2lzc3VlX2NtZChwb3J0LCBTRVRWMjRPKTsKK30KKworLyoKKyAqICAgICAgU2V0dXAgcG9ydCBSeCBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkCitmc3RfcnhfY29uZmlnKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCWludCBpOworCWludCBwaTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCWNhcmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JVRkZFUjsgaSsrKSB7CisJCW9mZnNldCA9IEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW2ldWzBdKTsKKworCQlGU1RfV1JXKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5sYWRyLCAodTE2KSBvZmZzZXQpOworCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5oYWRyLCAodTgpIChvZmZzZXQgPj4gMTYpKTsKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0uYmNudCwgY252X2JjbnQoTEVOX1JYX0JVRkZFUikpOworCQlGU1RfV1JXKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5tY250LCBMRU5fUlhfQlVGRkVSKTsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0uYml0cywgRE1BX09XTik7CisJfQorCXBvcnQtPnJ4cG9zID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICAgICAgU2V0dXAgcG9ydCBUeCBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkCitmc3RfdHhfY29uZmlnKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCWludCBpOworCWludCBwaTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCWNhcmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0JVRkZFUjsgaSsrKSB7CisJCW9mZnNldCA9IEJVRl9PRkZTRVQodHhCdWZmZXJbcGldW2ldWzBdKTsKKworCQlGU1RfV1JXKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5sYWRyLCAodTE2KSBvZmZzZXQpOworCQlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5oYWRyLCAodTgpIChvZmZzZXQgPj4gMTYpKTsKKwkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1baV0uYmNudCwgMCk7CisJCUZTVF9XUkIoY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJpdHMsIDApOworCX0KKwlwb3J0LT50eHBvcyA9IDA7CisJcG9ydC0+dHhpcG9zID0gMDsKKwlwb3J0LT5zdGFydCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qICAgICAgVEUxIEFsYXJtIGNoYW5nZSBpbnRlcnJ1cHQgZXZlbnQKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9pbnRyX3RlMV9hbGFybShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJdTggbG9zOworCXU4IHJyYTsKKwl1OCBhaXM7CisKKwlsb3MgPSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmxvc3NPZlNpZ25hbCk7CisJcnJhID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNlaXZlUmVtb3RlQWxhcm0pOworCWFpcyA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMuYWxhcm1JbmRpY2F0aW9uU2lnbmFsKTsKKworCWlmIChsb3MpIHsKKwkJLyoKKwkJICogTG9zdCB0aGUgbGluaworCQkgKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJOZXQgY2FycmllciBvZmZcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGluayBhdmFpbGFibGUKKwkJICovCisJCWlmICghbmV0aWZfY2Fycmllcl9vayhwb3J0X3RvX2Rldihwb3J0KSkpIHsKKwkJCWRiZyhEQkdfSU5UUiwgIk5ldCBjYXJyaWVyIG9uXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJfQorCisJaWYgKGxvcykKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IExPUyBBbGFybVxuIik7CisJZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgTE9TIEFsYXJtXG4iKTsKKwlpZiAocnJhKQorCQlkYmcoREJHX0lOVFIsICJBc3NlcnQgUlJBIEFsYXJtXG4iKTsKKwllbHNlCisJCWRiZyhEQkdfSU5UUiwgIkRlLWFzc2VydCBSUkEgQWxhcm1cbiIpOworCisJaWYgKGFpcykKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IEFJUyBBbGFybVxuIik7CisJZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgQUlTIEFsYXJtXG4iKTsKK30KKworLyogICAgICBDb250cm9sIHNpZ25hbCBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfaW50cl9jdGxjaGcoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCWludCBzaWduYWxzOworCisJc2lnbmFscyA9IEZTVF9SREwoY2FyZCwgdjI0RGVib3VuY2VkU3RzW3BvcnQtPmluZGV4XSk7CisKKwlpZiAoc2lnbmFscyAmICgoKHBvcnQtPmh3aWYgPT0gWDIxKSB8fCAocG9ydC0+aHdpZiA9PSBYMjFEKSkKKwkJICAgICAgID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19EQ0QpKSB7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhwb3J0X3RvX2Rldihwb3J0KSkpIHsKKwkJCWRiZyhEQkdfSU5UUiwgIkRDRCBhY3RpdmVcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vbihwb3J0X3RvX2Rldihwb3J0KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayhwb3J0X3RvX2Rldihwb3J0KSkpIHsKKwkJCWRiZyhEQkdfSU5UUiwgIkRDRCBsb3N0XG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0KK30KKworLyogICAgICBMb2cgUnggRXJyb3JzCisgKi8KK3N0YXRpYyB2b2lkCitmc3RfbG9nX3J4X2Vycm9yKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJIHVuc2lnbmVkIGNoYXIgZG1hYml0cywgaW50IHJ4cCwgdW5zaWduZWQgc2hvcnQgbGVuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwkvKiAKKwkgKiBJbmNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvdW50ZXIKKwkgKi8KKwlzdGF0cy0+cnhfZXJyb3JzKys7CisJaWYgKGRtYWJpdHMgJiBSWF9PRkxPKSB7CisJCXN0YXRzLT5yeF9maWZvX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGZpZm8gZXJyb3Igb24gY2FyZCAlZCBwb3J0ICVkIGJ1ZmZlciAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4LCByeHApOworCX0KKwlpZiAoZG1hYml0cyAmIFJYX0NSQykgeworCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGNyYyBlcnJvciBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJfQorCWlmIChkbWFiaXRzICYgUlhfRlJBTSkgeworCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggZnJhbWUgZXJyb3Igb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCX0KKwlpZiAoZG1hYml0cyA9PSAoUlhfU1RQIHwgUlhfRU5QKSkgeworCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGxlbmd0aCBlcnJvciAoJWQpIG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGxlbiwgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCX0KK30KKworLyogICAgICBSeCBFcnJvciBSZWNvdmVyeQorICovCitzdGF0aWMgdm9pZAorZnN0X3JlY292ZXJfcnhfZXJyb3Ioc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgZG1hYml0cywgaW50IHJ4cCwgdW5zaWduZWQgc2hvcnQgbGVuKQoreworCWludCBpOworCWludCBwaTsKKworCXBpID0gcG9ydC0+aW5kZXg7CisJLyogCisJICogRGlzY2FyZCBidWZmZXIgZGVzY3JpcHRvcnMgdW50aWwgd2Ugc2VlIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBuZXh0IGZyYW1lLiAgTm90ZSB0aGF0IGZvciBsb25nIGZyYW1lcyB0aGlzIGNvdWxkIGJlIGluCisJICogYSBzdWJzZXF1ZW50IGludGVycnVwdC4gCisJICovCisJaSA9IDA7CisJd2hpbGUgKChkbWFiaXRzICYgKERNQV9PV04gfCBSWF9TVFApKSA9PSAwKSB7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisJCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhfQlVGRkVSOworCQlpZiAoKytpID4gTlVNX1JYX0JVRkZFUikgeworCQkJZGJnKERCR19BU1MsICJpbnRyX3J4OiBEaXNjYXJkaW5nIG1vcmUgYnVmcyIKKwkJCSAgICAiIHRoYW4gd2UgaGF2ZVxuIik7CisJCQlicmVhazsKKwkJfQorCQlkbWFiaXRzID0gRlNUX1JEQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzKTsKKwkJZGJnKERCR19BU1MsICJETUEgQml0cyBvZiBuZXh0IGJ1ZmZlciB3YXMgJXhcbiIsIGRtYWJpdHMpOworCX0KKwlkYmcoREJHX0FTUywgIlRoZXJlIHdlcmUgJWQgc3Vic2VxdWVudCBidWZmZXJzIGluIGVycm9yXG4iLCBpKTsKKworCS8qIERpc2NhcmQgdGhlIHRlcm1pbmFsIGJ1ZmZlciAqLworCWlmICghKGRtYWJpdHMgJiBETUFfT1dOKSkgeworCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwl9CisJcG9ydC0+cnhwb3MgPSByeHA7CisJcmV0dXJuOworCit9CisKKy8qICAgICAgUnggY29tcGxldGUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfaW50cl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJdW5zaWduZWQgY2hhciBkbWFiaXRzOworCWludCBwaTsKKwlpbnQgcnhwOworCWludCByeF9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCS8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgdG8gcHJvY2VzcyAqLworCXBpID0gcG9ydC0+aW5kZXg7CisJcnhwID0gcG9ydC0+cnhwb3M7CisJZG1hYml0cyA9IEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyk7CisJaWYgKGRtYWJpdHMgJiBETUFfT1dOKSB7CisJCWRiZyhEQkdfUlggfCBEQkdfSU5UUiwgImludHJfcng6IE5vIGJ1ZmZlciBwb3J0ICVkIHBvcyAlZFxuIiwKKwkJICAgIHBpLCByeHApOworCQlyZXR1cm47CisJfQorCWlmIChjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykgeworCQlyZXR1cm47CisJfQorCisJLyogR2V0IGJ1ZmZlciBsZW5ndGggKi8KKwlsZW4gPSBGU1RfUkRXKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLm1jbnQpOworCS8qIERpc2NhcmQgdGhlIENSQyAqLworCWxlbiAtPSAyOworCWlmIChsZW4gPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBvbiB0aGUgVEUxIGludGVyZmFjZSBzb21ldGltZXMKKwkJICogc28gdGhyb3cgdGhlIGZyYW1lIGF3YXkgYW5kIGxvZyB0aGUgZXZlbnQuCisJCSAqLworCQlwcmludGtfZXJyKCJGcmFtZSByZWNlaXZlZCB3aXRoIDAgbGVuZ3RoLiBDYXJkICVkIFBvcnQgJWRcbiIsCisJCQkgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBidWZmZXIgbGVuZ3RoIGFuZCBmb3Igb3RoZXIgZXJyb3JzLiBXZSBpbnNpc3Qgb24gb25lIHBhY2tldAorCSAqIGluIG9uZSBidWZmZXIuIFRoaXMgc2ltcGxpZmllcyB0aGluZ3MgZ3JlYXRseSBhbmQgc2luY2Ugd2UndmUKKwkgKiBhbGxvY2F0ZWQgOEsgaXQgc2hvdWxkbid0IGJlIGEgcmVhbCB3b3JsZCBsaW1pdGF0aW9uCisJICovCisJZGJnKERCR19SWCwgImludHJfcng6ICVkLCVkOiBmbGFncyAleCBsZW4gJWRcbiIsIHBpLCByeHAsIGRtYWJpdHMsIGxlbik7CisJaWYgKGRtYWJpdHMgIT0gKFJYX1NUUCB8IFJYX0VOUCkgfHwgbGVuID4gTEVOX1JYX0JVRkZFUiAtIDIpIHsKKwkJZnN0X2xvZ19yeF9lcnJvcihjYXJkLCBwb3J0LCBkbWFiaXRzLCByeHAsIGxlbik7CisJCWZzdF9yZWNvdmVyX3J4X2Vycm9yKGNhcmQsIHBvcnQsIGRtYWJpdHMsIHJ4cCwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsbG9jYXRlIFNLQiAqLworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSA9PSBOVUxMKSB7CisJCWRiZyhEQkdfUlgsICJpbnRyX3J4OiBjYW4ndCBhbGxvY2F0ZSBidWZmZXJcbiIpOworCisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwkJLyogUmV0dXJuIGRlc2NyaXB0b3IgdG8gY2FyZCAqLworCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCisJCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhfQlVGRkVSOworCQlwb3J0LT5yeHBvcyA9IHJ4cDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2Uga25vdyB0aGUgbGVuZ3RoIHdlIG5lZWQgdG8gcmVjZWl2ZSwgbGVuLgorCSAqIEl0J3Mgbm90IHdvcnRoIHVzaW5nIHRoZSBETUEgZm9yIHJlYWRzIG9mIGxlc3MgdGhhbgorCSAqIEZTVF9NSU5fRE1BX0xFTgorCSAqLworCisJaWYgKChsZW4gPCBGU1RfTUlOX0RNQV9MRU4pIHx8IChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFApKSB7CisJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsIGxlbiksCisJCQkgICAgICBjYXJkLT5tZW0gKyBCVUZfT0ZGU0VUKHJ4QnVmZmVyW3BpXVtyeHBdWzBdKSwKKwkJCSAgICAgIGxlbik7CisKKwkJLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQkvKiBVcGRhdGUgc3RhdHMgKi8KKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKKworCQkvKiBQdXNoIHVwc3RyZWFtICovCisJCWRiZyhEQkdfUlgsICJQdXNoaW5nIGZyYW1lIHVwIHRoZSBzdGFja1xuIik7CisJCWlmIChwb3J0LT5tb2RlID09IEZTVF9SQVcpCisJCQlza2ItPnByb3RvY29sID0gZmFyc3luY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJZWxzZQorCQkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCXJ4X3N0YXR1cyA9IG5ldGlmX3J4KHNrYik7CisJCWZzdF9wcm9jZXNzX3J4X3N0YXR1cyhyeF9zdGF0dXMsIHBvcnRfdG9fZGV2KHBvcnQpLT5uYW1lKTsKKwkJaWYgKHJ4X3N0YXR1cyA9PSBORVRfUlhfRFJPUCkgeworCQkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJfQorCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0gZWxzZSB7CisJCWNhcmQtPmRtYV9za2JfcnggPSBza2I7CisJCWNhcmQtPmRtYV9wb3J0X3J4ID0gcG9ydDsKKwkJY2FyZC0+ZG1hX2xlbl9yeCA9IGxlbjsKKwkJY2FyZC0+ZG1hX3J4cG9zID0gcnhwOworCQlmc3RfcnhfZG1hKGNhcmQsIChjaGFyICopIGNhcmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCwKKwkJCSAgIChjaGFyICopIEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW3J4cF1bMF0pLCBsZW4pOworCX0KKwlpZiAocnhwICE9IHBvcnQtPnJ4cG9zKSB7CisJCWRiZyhEQkdfQVNTLCAiQWJvdXQgdG8gaW5jcmVtZW50IHJ4cG9zIGJ5IG1vcmUgdGhhbiAxXG4iKTsKKwkJZGJnKERCR19BU1MsICJyeHAgPSAlZCByeHBvcyA9ICVkXG4iLCByeHAsIHBvcnQtPnJ4cG9zKTsKKwl9CisJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJcG9ydC0+cnhwb3MgPSByeHA7Cit9CisKKy8qCisgKiAgICAgIFRoZSBib3R0b20gaGFsZnMgdG8gdGhlIElTUgorICoKKyAqLworCitzdGF0aWMgdm9pZAorZG9fYm90dG9tX2hhbGZfdHgoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJaW50IHBpOworCWludCB0eHFfbGVuZ3RoOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKworCS8qCisJICogIEZpbmQgYSBmcmVlIGJ1ZmZlciBmb3IgdGhlIHRyYW5zbWl0CisJICogIFN0ZXAgdGhyb3VnaCBlYWNoIHBvcnQgb24gdGhpcyBjYXJkCisJICovCisKKwlkYmcoREJHX1RYLCAiZG9fYm90dG9tX2hhbGZfdHhcbiIpOworCWZvciAocGkgPSAwLCBwb3J0ID0gY2FyZC0+cG9ydHM7IHBpIDwgY2FyZC0+bnBvcnRzOyBwaSsrLCBwb3J0KyspIHsKKwkJaWYgKCFwb3J0LT5ydW4pCisJCQljb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworICAgICAgICAgICAgICAgIHN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCQl3aGlsZSAoIQorCQkgICAgICAgKEZTVF9SREIoY2FyZCwgdHhEZXNjclJpbmdbcGldW3BvcnQtPnR4cG9zXS5iaXRzKSAmCisJCQlETUFfT1dOKQorICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGNhcmQtPmRtYXR4X2luX3Byb2dyZXNzKSkgeworCQkJLyoKKwkJCSAqIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHR4ZG9uZSBldmVudCBwZXItc2UKKwkJCSAqIFdlIHNlZW0gdG8gaGF2ZSB0byBkZWR1Y2UgaXQsIGJ5IGNoZWNraW5nIHRoZSBETUFfT1dOCisJCQkgKiBiaXQgb24gdGhlIG5leHQgYnVmZmVyIHdlIHRoaW5rIHdlIGNhbiB1c2UKKwkJCSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJaWYgKCh0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXMpIDwgMCkgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBvbmUgaGFzIHdyYXBwZWQgYW5kIHRoZQorCQkJCSAqIG1hdGhzIGdpdmVzIHVzIGEgbmVnYXRpdmUgbnVtYmVyCisJCQkJICovCisJCQkJdHhxX2xlbmd0aCA9IHR4cV9sZW5ndGggKyBGU1RfVFhRX0RFUFRIOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQlpZiAodHhxX2xlbmd0aCA+IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoZXJlIGlzIHNvbWV0aGluZyB0byBzZW5kCisJCQkJICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCXNrYiA9IHBvcnQtPnR4cVtwb3J0LT50eHFzXTsKKwkJCQlwb3J0LT50eHFzKys7CisJCQkJaWYgKHBvcnQtPnR4cXMgPT0gRlNUX1RYUV9ERVBUSCkgeworCQkJCQlwb3J0LT50eHFzID0gMDsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQkJLyoKKwkJCQkgKiBjb3B5IHRoZSBkYXRhIGFuZCBzZXQgdGhlIHJlcXVpcmVkIGluZGljYXRvcnMgb24gdGhlCisJCQkJICogY2FyZC4KKwkJCQkgKi8KKwkJCQlGU1RfV1JXKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtwb3J0LT50eHBvc10uYmNudCwKKwkJCQkJY252X2JjbnQoc2tiLT5sZW4pKTsKKwkJCQlpZiAoKHNrYi0+bGVuIDwgRlNUX01JTl9ETUFfTEVOKQorCQkJCSAgICB8fCAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhQKSkgeworCQkJCQkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgd2l0aCBub3JtYWwgaW8gKi8KKwkJCQkJbWVtY3B5X3RvaW8oY2FyZC0+bWVtICsKKwkJCQkJCSAgICBCVUZfT0ZGU0VUKHR4QnVmZmVyW3BpXQorCQkJCQkJCSAgICAgICBbcG9ydC0+CisJCQkJCQkJCXR4cG9zXVswXSksCisJCQkJCQkgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQkJCUZTVF9XUkIoY2FyZCwKKwkJCQkJCXR4RGVzY3JSaW5nW3BpXVtwb3J0LT50eHBvc10uCisJCQkJCQliaXRzLAorCQkJCQkJRE1BX09XTiB8IFRYX1NUUCB8IFRYX0VOUCk7CisJCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogT3IgZG8gaXQgdGhyb3VnaCBkbWEgKi8KKwkJCQkJbWVtY3B5KGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCwKKwkJCQkJICAgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQljYXJkLT5kbWFfcG9ydF90eCA9IHBvcnQ7CisJCQkJCWNhcmQtPmRtYV9sZW5fdHggPSBza2ItPmxlbjsKKwkJCQkJY2FyZC0+ZG1hX3R4cG9zID0gcG9ydC0+dHhwb3M7CisJCQkJCWZzdF90eF9kbWEoY2FyZCwKKwkJCQkJCSAgIChjaGFyICopIGNhcmQtPgorCQkJCQkJICAgdHhfZG1hX2hhbmRsZV9jYXJkLAorCQkJCQkJICAgKGNoYXIgKikKKwkJCQkJCSAgIEJVRl9PRkZTRVQodHhCdWZmZXJbcGldCisJCQkJCQkJICAgICAgW3BvcnQtPnR4cG9zXVswXSksCisJCQkJCQkgICBza2ItPmxlbik7CisJCQkJfQorCQkJCWlmICgrK3BvcnQtPnR4cG9zID49IE5VTV9UWF9CVUZGRVIpCisJCQkJCXBvcnQtPnR4cG9zID0gMDsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGhhdmUgZmxvdyBjb250cm9sIG9uLCBjYW4gd2Ugbm93IHJlbGVhc2UgaXQ/CisJCQkJICovCisJCQkJaWYgKHBvcnQtPnN0YXJ0KSB7CisJCQkJCWlmICh0eHFfbGVuZ3RoIDwgZnN0X3R4cV9sb3cpIHsKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUocG9ydF90b19kZXYKKwkJCQkJCQkJIChwb3J0KSk7CisJCQkJCQlwb3J0LT5zdGFydCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5vdGhpbmcgdG8gc2VuZCBzbyBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AKKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RvX2JvdHRvbV9oYWxmX3J4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWludCBwaTsKKwlpbnQgcnhfY291bnQgPSAwOworCisJLyogQ2hlY2sgZm9yIHJ4IGNvbXBsZXRpb25zIG9uIGFsbCBwb3J0cyBvbiB0aGlzIGNhcmQgKi8KKwlkYmcoREJHX1JYLCAiZG9fYm90dG9tX2hhbGZfcnhcbiIpOworCWZvciAocGkgPSAwLCBwb3J0ID0gY2FyZC0+cG9ydHM7IHBpIDwgY2FyZC0+bnBvcnRzOyBwaSsrLCBwb3J0KyspIHsKKwkJaWYgKCFwb3J0LT5ydW4pCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoIShGU1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtwb3J0LT5yeHBvc10uYml0cykKKwkJCSAmIERNQV9PV04pICYmICEoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MpKSB7CisJCQlpZiAocnhfY291bnQgPiBmc3RfbWF4X3JlYWRzKSB7CisJCQkJLyoKKwkJCQkgKiBEb24ndCBzcGVuZCBmb3JldmVyIGluIHJlY2VpdmUgcHJvY2Vzc2luZworCQkJCSAqIFNjaGVkdWxlIGFub3RoZXIgZXZlbnQKKwkJCQkgKi8KKwkJCQlmc3RfcV93b3JrX2l0ZW0oJmZzdF93b3JrX2ludHEsIGNhcmQtPmNhcmRfbm8pOworCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmZzdF9pbnRfdGFzayk7CisJCQkJYnJlYWs7CS8qIExlYXZlIHRoZSBsb29wICovCisJCQl9CisJCQlmc3RfaW50cl9yeChjYXJkLCBwb3J0KTsKKwkJCXJ4X2NvdW50Kys7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgICAgIFRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKiAgICAgIERldl9pZCBpcyBvdXIgZnN0X2NhcmRfaW5mbyBwb2ludGVyCisgKi8KK2lycXJldHVybl90Citmc3RfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWludCByZGlkeDsJCS8qIEV2ZW50IGJ1ZmZlciBpbmRpY2VzICovCisJaW50IHdyaWR4OworCWludCBldmVudDsJCS8qIEFjdHVhbCBldmVudCBmb3IgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkIGludCBkbWFfaW50Y3NyID0gMDsKKwl1bnNpZ25lZCBpbnQgZG9fY2FyZF9pbnRlcnJ1cHQ7CisJdW5zaWduZWQgaW50IGludF9yZXRyeV9jb3VudDsKKworCWlmICgoY2FyZCA9IGRldl9pZCkgPT0gTlVMTCkgeworCQlkYmcoREJHX0lOVFIsICJpbnRyOiBzcHVyaW91cyAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbnRlcnJ1cHQgd2FzIGZvciB0aGlzIGNhcmQKKwkgKiByZXR1cm4gaWYgbm90CisJICogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgaXMgaW1wb3J0YW50CisJICovCisJZGJnKERCR19JTlRSLCAiaW50cjogJWQgJXBcbiIsIGlycSwgY2FyZCk7CisJaWYgKGNhcmQtPnN0YXRlICE9IEZTVF9SVU5OSU5HKSB7CisJCXByaW50a19lcnIKKwkJICAgICgiSW50ZXJydXB0IHJlY2VpdmVkIGZvciBjYXJkICVkIGluIGEgbm9uIHJ1bm5pbmcgc3RhdGUgKCVkKVxuIiwKKwkJICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CisKKwkJLyogCisJCSAqIEl0IGlzIHBvc3NpYmxlIHRvIHJlYWxseSBiZSBydW5uaW5nLCBpLmUuIHdlIGhhdmUgcmUtbG9hZGVkCisJCSAqIGEgcnVubmluZyBjYXJkCisJCSAqIENsZWFyIGFuZCByZXByaW1lIHRoZSBpbnRlcnJ1cHQgc291cmNlIAorCQkgKi8KKwkJZnN0X2NsZWFyX2ludHIoY2FyZCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBDbGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAqLworCWZzdF9jbGVhcl9pbnRyKGNhcmQpOworCisJLyoKKwkgKiBJcyB0aGUgaW50ZXJydXB0IGZvciB0aGlzIGNhcmQgKGhhbmRzaGFrZSA9PSAxKQorCSAqLworCWRvX2NhcmRfaW50ZXJydXB0ID0gMDsKKwlpZiAoRlNUX1JEQihjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UpID09IDEpIHsKKwkJZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX0NBUkRfSU5UOworCQkvKiBTZXQgdGhlIHNvZnR3YXJlIGFja25vd2xlZGdlICovCisJCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVFKTsKKwl9CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkgKiBJcyBpdCBhIERNQSBJbnRlcnJ1cHQKKwkJICovCisJCWRtYV9pbnRjc3IgPSBpbmwoY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJCWlmIChkbWFfaW50Y3NyICYgMHgwMDIwMDAwMCkgeworCQkJLyoKKwkJCSAqIERNQSBDaGFubmVsIDAgKFJ4IHRyYW5zZmVyIGNvbXBsZXRlKQorCQkJICovCisJCQlkYmcoREJHX1JYLCAiRE1BIFJ4IHhmZXIgY29tcGxldGVcbiIpOworCQkJb3V0YigweDgsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CisJCQlmc3RfcnhfZG1hX2NvbXBsZXRlKGNhcmQsIGNhcmQtPmRtYV9wb3J0X3J4LAorCQkJCQkgICAgY2FyZC0+ZG1hX2xlbl9yeCwgY2FyZC0+ZG1hX3NrYl9yeCwKKwkJCQkJICAgIGNhcmQtPmRtYV9yeHBvcyk7CisJCQljYXJkLT5kbWFyeF9pbl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfUlhfRE1BX0lOVDsKKwkJfQorCQlpZiAoZG1hX2ludGNzciAmIDB4MDA0MDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEgQ2hhbm5lbCAxIChUeCB0cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19UWCwgIkRNQSBUeCB4ZmVyIGNvbXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjEpOworCQkJZnN0X3R4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF90eCwKKwkJCQkJICAgIGNhcmQtPmRtYV9sZW5fdHgsIGNhcmQtPmRtYV90eHBvcyk7CisJCQljYXJkLT5kbWF0eF9pbl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfVFhfRE1BX0lOVDsKKwkJfQorCX0KKworCS8qCisJICogSGF2ZSB3ZSBiZWVuIG1pc3NpbmcgSW50ZXJydXB0cworCSAqLworCWludF9yZXRyeV9jb3VudCA9IEZTVF9SREwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCk7CisJaWYgKGludF9yZXRyeV9jb3VudCkgeworCQlkYmcoREJHX0FTUywgIkNhcmQgJWQgaW50X3JldHJ5X2NvdW50IGlzICAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIGludF9yZXRyeV9jb3VudCk7CisJCUZTVF9XUkwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCwgMCk7CisJfQorCisJaWYgKCFkb19jYXJkX2ludGVycnVwdCkgeworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogU2NlaGR1bGUgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBJU1IgKi8KKwlmc3RfcV93b3JrX2l0ZW0oJmZzdF93b3JrX2ludHEsIGNhcmQtPmNhcmRfbm8pOworCXRhc2tsZXRfc2NoZWR1bGUoJmZzdF9pbnRfdGFzayk7CisKKwkvKiBEcmFpbiB0aGUgZXZlbnQgcXVldWUgKi8KKwlyZGlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCkgJiAweDFmOworCXdyaWR4ID0gRlNUX1JEQihjYXJkLCBpbnRlcnJ1cHRFdmVudC53cmluZGV4KSAmIDB4MWY7CisJd2hpbGUgKHJkaWR4ICE9IHdyaWR4KSB7CisJCWV2ZW50ID0gRlNUX1JEQihjYXJkLCBpbnRlcnJ1cHRFdmVudC5ldm50YnVmZltyZGlkeF0pOworCQlwb3J0ID0gJmNhcmQtPnBvcnRzW2V2ZW50ICYgMHgwM107CisKKwkJZGJnKERCR19JTlRSLCAiUHJvY2Vzc2luZyBJbnRlcnJ1cHQgZXZlbnQ6ICV4XG4iLCBldmVudCk7CisKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFRFMV9BTE1BOgorCQkJZGJnKERCR19JTlRSLCAiVEUxIEFsYXJtIGludHJcbiIpOworCQkJaWYgKHBvcnQtPnJ1bikKKwkJCQlmc3RfaW50cl90ZTFfYWxhcm0oY2FyZCwgcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIENUTEFfQ0hHOgorCQljYXNlIENUTEJfQ0hHOgorCQljYXNlIENUTENfQ0hHOgorCQljYXNlIENUTERfQ0hHOgorCQkJaWYgKHBvcnQtPnJ1bikKKwkJCQlmc3RfaW50cl9jdGxjaGcoY2FyZCwgcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIEFCVEFfU0VOVDoKKwkJY2FzZSBBQlRCX1NFTlQ6CisJCWNhc2UgQUJUQ19TRU5UOgorCQljYXNlIEFCVERfU0VOVDoKKwkJCWRiZyhEQkdfVFgsICJBYm9ydCBjb21wbGV0ZSBwb3J0ICVkXG4iLCBwb3J0LT5pbmRleCk7CisJCQlicmVhazsKKworCQljYXNlIFRYQV9VTkRGOgorCQljYXNlIFRYQl9VTkRGOgorCQljYXNlIFRYQ19VTkRGOgorCQljYXNlIFRYRF9VTkRGOgorCQkJLyogRGlmZmljdWx0IHRvIHNlZSBob3cgd2UnZCBnZXQgdGhpcyBnaXZlbiB0aGF0IHdlCisJCQkgKiBhbHdheXMgbG9hZCB1cCB0aGUgZW50aXJlIHBhY2tldCBmb3IgRE1BLgorCQkJICovCisJCQlkYmcoREJHX1RYLCAiVHggdW5kZXJmbG93IHBvcnQgJWRcbiIsIHBvcnQtPmluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkbGNfc3RhdHMocG9ydF90b19kZXYocG9ydCkpLT50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkbGNfc3RhdHMocG9ydF90b19kZXYocG9ydCkpLT50eF9maWZvX2Vycm9ycysrOworCQkJZGJnKERCR19BU1MsICJUeCB1bmRlcmZsb3cgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5JVF9DUExUOgorCQkJZGJnKERCR19JTklULCAiQ2FyZCBpbml0IE9LIGludHJcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTklUX0ZBSUw6CisJCQlkYmcoREJHX0lOSVQsICJDYXJkIGluaXQgRkFJTEVEIGludHJcbiIpOworCQkJY2FyZC0+c3RhdGUgPSBGU1RfSUZBSUxFRDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGtfZXJyKCJpbnRyOiB1bmtub3duIGNhcmQgZXZlbnQgJWQuIGlnbm9yZWRcbiIsCisJCQkJICAgZXZlbnQpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBCdW1wIGFuZCB3cmFwIHRoZSBpbmRleCAqLworCQlpZiAoKytyZGlkeCA+PSBNQVhfQ0lSQlVGRikKKwkJCXJkaWR4ID0gMDsKKwl9CisJRlNUX1dSQihjYXJkLCBpbnRlcnJ1cHRFdmVudC5yZGluZGV4LCByZGlkeCk7CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogICAgICBDaGVjayB0aGF0IHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaXMgb25lIHRoYXQgd2UgY2FuIGhhbmRsZQorICogICAgICBhbmQgdGhhdCBzb21lIGJhc2ljIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QKKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX3N0YXJ0ZWRfb2soc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaW50IGk7CisKKwkvKiBDaGVjayBzdHJ1Y3R1cmUgdmVyc2lvbiBhbmQgZW5kIG1hcmtlciAqLworCWlmIChGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pICE9IFNNQ19WRVJTSU9OKSB7CisJCXByaW50a19lcnIoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhwZWN0ZWQgJWRcbiIsCisJCQkgICBGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pLCBTTUNfVkVSU0lPTik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJaWYgKEZTVF9SREwoY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUpICE9IEVORF9TSUcpIHsKKwkJcHJpbnRrX2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJLyogRmlybXdhcmUgc3RhdHVzIGZsYWcsIDB4MDAgPSBpbml0aWFsaXNpbmcsIDB4MDEgPSBPSywgMHhGRiA9IGZhaWwgKi8KKwlpZiAoKGkgPSBGU1RfUkRCKGNhcmQsIHRhc2tTdGF0dXMpKSA9PSAweDAxKSB7CisJCWNhcmQtPnN0YXRlID0gRlNUX1JVTk5JTkc7CisJfSBlbHNlIGlmIChpID09IDB4RkYpIHsKKwkJcHJpbnRrX2VycigiRmlybXdhcmUgaW5pdGlhbGlzYXRpb24gZmFpbGVkLiBDYXJkIGhhbHRlZFxuIik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaSAhPSAweDAwKSB7CisJCXByaW50a19lcnIoIlVua25vd24gZmlybXdhcmUgc3RhdHVzIDB4JXhcbiIsIGkpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5hbGx5IGNoZWNrIHRoZSBudW1iZXIgb2YgcG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5zdCB0aGUKKwkgKiBudW1iZXIgd2UgYXNzdW1lZCBhdCBjYXJkIGRldGVjdGlvbi4gU2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoCisJICogZXhpc3RpbmcgZmlybXdhcmUgZXRjIHNvIHdlIGp1c3QgcmVwb3J0IGl0IGZvciB0aGUgbW9tZW50LgorCSAqLworCWlmIChGU1RfUkRMKGNhcmQsIG51bWJlck9mUG9ydHMpICE9IGNhcmQtPm5wb3J0cykgeworCQlwcmludGtfd2FybigiUG9ydCBjb3VudCBtaXNtYXRjaCBvbiBjYXJkICVkLiIKKwkJCSAgICAiIEZpcm13YXJlIHRoaW5rcyAlZCB3ZSBzYXkgJWRcbiIsIGNhcmQtPmNhcmRfbm8sCisJCQkgICAgRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSwgY2FyZC0+bnBvcnRzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3NldF9jb25mX2Zyb21faW5mbyhzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgIHN0cnVjdCBmc3Rpb2NfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgbXlfZnJhbWluZzsKKworCS8qIFNldCB0aGluZ3MgYWNjb3JkaW5nIHRvIHRoZSB1c2VyIHNldCB2YWxpZCBmbGFncyAKKwkgKiBTZXZlcmFsIG9mIHRoZSBvbGQgb3B0aW9ucyBoYXZlIGJlZW4gaW52YWxpZGF0ZWQvcmVwbGFjZWQgYnkgdGhlIAorCSAqIGdlbmVyaWMgaGRsYyBwYWNrYWdlLgorCSAqLworCWVyciA9IDA7CisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1BST1RPKSB7CisJCWlmIChpbmZvLT5wcm90byA9PSBGU1RfUkFXKQorCQkJcG9ydC0+bW9kZSA9IEZTVF9SQVc7CisJCWVsc2UKKwkJCXBvcnQtPm1vZGUgPSBGU1RfR0VOX0hETEM7CisJfQorCisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX0NBQkxFKQorCQllcnIgPSAtRUlOVkFMOworCisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1NQRUVEKQorCQllcnIgPSAtRUlOVkFMOworCisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1BIQVNFKQorCQlGU1RfV1JCKGNhcmQsIHBvcnRDb25maWdbcG9ydC0+aW5kZXhdLmludmVydENsb2NrLAorCQkJaW5mby0+aW52ZXJ0Q2xvY2spOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9NT0RFKQorCQlGU1RfV1JXKGNhcmQsIGNhcmRNb2RlLCBpbmZvLT5jYXJkTW9kZSk7CisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1RFMSkgeworCQlGU1RfV1JMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlLCBpbmZvLT5saW5lU3BlZWQpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nLCBpbmZvLT5jbG9ja1NvdXJjZSk7CisJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9PSBFMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9PSBUMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX1QxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9PSBKMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0oxOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmZyYW1pbmcsIG15X2ZyYW1pbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0cnVjdHVyZSwgaW5mby0+c3RydWN0dXJlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5pbnRlcmZhY2UsIGluZm8tPmludGVyZmFjZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuY29kaW5nLCBpbmZvLT5jb2RpbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxpbmVCdWlsZE91dCwgaW5mby0+bGluZUJ1aWxkT3V0KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6ZXIsIGluZm8tPmVxdWFsaXplcik7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHJhbnNwYXJlbnRNb2RlLCBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxvb3BNb2RlLCBpbmZvLT5sb29wTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucmFuZ2UsIGluZm8tPnJhbmdlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy50eEJ1ZmZlck1vZGUsIGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJNb2RlLCBpbmZvLT5yeEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xvdCwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5sb3NUaHJlc2hvbGQsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCWlmIChpbmZvLT5pZGxlQ29kZSkKKwkJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUsIDEpOworCQllbHNlCisJCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAwKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5pZGxlQ29kZSwgaW5mby0+aWRsZUNvZGUpOworI2lmIEZTVF9ERUJVRworCQlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfVEUxKSB7CisJCQlwcmludGsoIlNldHRpbmcgVEUxIGRhdGFcbiIpOworCQkJcHJpbnRrKCJMaW5lIFNwZWVkID0gJWRcbiIsIGluZm8tPmxpbmVTcGVlZCk7CisJCQlwcmludGsoIlN0YXJ0IHNsb3QgPSAlZFxuIiwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJCXByaW50aygiQ2xvY2sgc291cmNlID0gJWRcbiIsIGluZm8tPmNsb2NrU291cmNlKTsKKwkJCXByaW50aygiRnJhbWluZyA9ICVkXG4iLCBteV9mcmFtaW5nKTsKKwkJCXByaW50aygiU3RydWN0dXJlID0gJWRcbiIsIGluZm8tPnN0cnVjdHVyZSk7CisJCQlwcmludGsoImludGVyZmFjZSA9ICVkXG4iLCBpbmZvLT5pbnRlcmZhY2UpOworCQkJcHJpbnRrKCJDb2RpbmcgPSAlZFxuIiwgaW5mby0+Y29kaW5nKTsKKwkJCXByaW50aygiTGluZSBidWlsZCBvdXQgPSAlZFxuIiwgaW5mby0+bGluZUJ1aWxkT3V0KTsKKwkJCXByaW50aygiRXF1YWxpc2VyID0gJWRcbiIsIGluZm8tPmVxdWFsaXplcik7CisJCQlwcmludGsoIlRyYW5zcGFyZW50IG1vZGUgPSAlZFxuIiwKKwkJCSAgICAgICBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQkJcHJpbnRrKCJMb29wIG1vZGUgPSAlZFxuIiwgaW5mby0+bG9vcE1vZGUpOworCQkJcHJpbnRrKCJSYW5nZSA9ICVkXG4iLCBpbmZvLT5yYW5nZSk7CisJCQlwcmludGsoIlR4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCQlwcmludGsoIlJ4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnJ4QnVmZmVyTW9kZSk7CisJCQlwcmludGsoIkxPUyBUaHJlc2hvbGQgPSAlZFxuIiwgaW5mby0+bG9zVGhyZXNob2xkKTsKKwkJCXByaW50aygiSWRsZSBDb2RlID0gJWRcbiIsIGluZm8tPmlkbGVDb2RlKTsKKwkJfQorI2VuZGlmCisJfQorI2lmIEZTVF9ERUJVRworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9ERUJVRykgeworCQlmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVnOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK2dhdGhlcl9jb25mX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgc3RydWN0IGZzdGlvY19pbmZvICppbmZvKQoreworCWludCBpOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZiAoc3RydWN0IGZzdGlvY19pbmZvKSk7CisKKwlpID0gcG9ydC0+aW5kZXg7CisJaW5mby0+a2VybmVsVmVyc2lvbiA9IExJTlVYX1ZFUlNJT05fQ09ERTsKKwlpbmZvLT5ucG9ydHMgPSBjYXJkLT5ucG9ydHM7CisJaW5mby0+dHlwZSA9IGNhcmQtPnR5cGU7CisJaW5mby0+c3RhdGUgPSBjYXJkLT5zdGF0ZTsKKwlpbmZvLT5wcm90byA9IEZTVF9HRU5fSERMQzsKKwlpbmZvLT5pbmRleCA9IGk7CisjaWYgRlNUX0RFQlVHCisJaW5mby0+ZGVidWcgPSBmc3RfZGVidWdfbWFzazsKKyNlbmRpZgorCisJLyogT25seSBtYXJrIGluZm9ybWF0aW9uIGFzIHZhbGlkIGlmIGNhcmQgaXMgcnVubmluZy4KKwkgKiBDb3B5IHRoZSBkYXRhIGFueXdheSBpbiBjYXNlIGl0IGlzIHVzZWZ1bCBmb3IgZGlhZ25vc3RpY3MKKwkgKi8KKwlpbmZvLT52YWxpZCA9ICgoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpID8gRlNUVkFMX0FMTCA6IEZTVFZBTF9DQVJEKQorI2lmIEZTVF9ERUJVRworCSAgICB8IEZTVFZBTF9ERUJVRworI2VuZGlmCisJICAgIDsKKworCWluZm8tPmxpbmVJbnRlcmZhY2UgPSBGU1RfUkRXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSk7CisJaW5mby0+aW50ZXJuYWxDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrKTsKKwlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkKTsKKwlpbmZvLT5pbnZlcnRDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnZlcnRDbG9jayk7CisJaW5mby0+djI0SXBTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNElwU3RzW2ldKTsKKwlpbmZvLT52MjRPcFN0cyA9IEZTVF9SREwoY2FyZCwgdjI0T3BTdHNbaV0pOworCWluZm8tPmNsb2NrU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjbG9ja1N0YXR1c1tpXSk7CisJaW5mby0+Y2FibGVTdGF0dXMgPSBGU1RfUkRXKGNhcmQsIGNhYmxlU3RhdHVzKTsKKwlpbmZvLT5jYXJkTW9kZSA9IEZTVF9SRFcoY2FyZCwgY2FyZE1vZGUpOworCWluZm8tPnNtY0Zpcm13YXJlVmVyc2lvbiA9IEZTVF9SREwoY2FyZCwgc21jRmlybXdhcmVWZXJzaW9uKTsKKworCS8qCisJICogVGhlIFQyVSBjYW4gcmVwb3J0IGNhYmxlIHByZXNlbmNlIGZvciBib3RoIEEgb3IgQgorCSAqIGluIGJpdHMgMCBhbmQgMSBvZiBjYWJsZVN0YXR1cy4gIFNlZSB3aGljaCBwb3J0IHdlIGFyZSBhbmQgCisJICogZG8gdGhlIG1hcHBpbmcuCisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlpZiAocG9ydC0+aW5kZXggPT0gMCkgeworCQkJLyoKKwkJCSAqIFBvcnQgQQorCQkJICovCisJCQlpbmZvLT5jYWJsZVN0YXR1cyA9IGluZm8tPmNhYmxlU3RhdHVzICYgMTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQb3J0IEIKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5jYWJsZVN0YXR1cyA+PiAxOworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5jYWJsZVN0YXR1cyAmIDE7CisJCX0KKwl9CisJLyoKKwkgKiBTb21lIGFkZGl0aW9uYWwgYml0cyBpZiB3ZSBhcmUgVEUxCisJICovCisJaWYgKGNhcmQtPnR5cGUgPT0gRlNUX1RZUEVfVEUxKSB7CisJCWluZm8tPmxpbmVTcGVlZCA9IEZTVF9SREwoY2FyZCwgc3VDb25maWcuZGF0YVJhdGUpOworCQlpbmZvLT5jbG9ja1NvdXJjZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY2xvY2tpbmcpOworCQlpbmZvLT5mcmFtaW5nID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nKTsKKwkJaW5mby0+c3RydWN0dXJlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUpOworCQlpbmZvLT5pbnRlcmZhY2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmludGVyZmFjZSk7CisJCWluZm8tPmNvZGluZyA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY29kaW5nKTsKKwkJaW5mby0+bGluZUJ1aWxkT3V0ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQpOworCQlpbmZvLT5lcXVhbGl6ZXIgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVxdWFsaXplcik7CisJCWluZm8tPmxvb3BNb2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSk7CisJCWluZm8tPnJhbmdlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yYW5nZSk7CisJCWluZm8tPnR4QnVmZmVyTW9kZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlKTsKKwkJaW5mby0+cnhCdWZmZXJNb2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yeEJ1ZmZlck1vZGUpOworCQlpbmZvLT5zdGFydGluZ1Nsb3QgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xvdCk7CisJCWluZm8tPmxvc1RocmVzaG9sZCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkKTsKKwkJaWYgKEZTVF9SREIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUpKQorCQkJaW5mby0+aWRsZUNvZGUgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmlkbGVDb2RlKTsKKwkJZWxzZQorCQkJaW5mby0+aWRsZUNvZGUgPSAwOworCQlpbmZvLT5yZWNlaXZlQnVmZmVyRGVsYXkgPQorCQkgICAgRlNUX1JETChjYXJkLCBzdVN0YXR1cy5yZWNlaXZlQnVmZmVyRGVsYXkpOworCQlpbmZvLT5mcmFtaW5nRXJyb3JDb3VudCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmZyYW1pbmdFcnJvckNvdW50KTsKKwkJaW5mby0+Y29kZVZpb2xhdGlvbkNvdW50ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VTdGF0dXMuY29kZVZpb2xhdGlvbkNvdW50KTsKKwkJaW5mby0+Y3JjRXJyb3JDb3VudCA9IEZTVF9SREwoY2FyZCwgc3VTdGF0dXMuY3JjRXJyb3JDb3VudCk7CisJCWluZm8tPmxpbmVBdHRlbnVhdGlvbiA9IEZTVF9SREwoY2FyZCwgc3VTdGF0dXMubGluZUF0dGVudWF0aW9uKTsKKwkJaW5mby0+bG9zc09mU2lnbmFsID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCQlpbmZvLT5yZWNlaXZlUmVtb3RlQWxhcm0gPQorCQkgICAgRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNlaXZlUmVtb3RlQWxhcm0pOworCQlpbmZvLT5hbGFybUluZGljYXRpb25TaWduYWwgPQorCQkgICAgRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5hbGFybUluZGljYXRpb25TaWduYWwpOworCX0KK30KKworc3RhdGljIGludAorZnN0X3NldF9pZmFjZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJICAgICAgc3RydWN0IGlmcmVxICppZnIpCit7CisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc3luYzsKKwlpbnQgaTsKKworCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplICE9IHNpemVvZiAoc3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyCisJICAgICgmc3luYywgaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgc2l6ZW9mIChzeW5jKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHN5bmMubG9vcGJhY2spCisJCXJldHVybiAtRUlOVkFMOworCisJaSA9IHBvcnQtPmluZGV4OworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9JRkFDRV9WMzU6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBWMzUpOworCQlwb3J0LT5od2lmID0gVjM1OworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfVjI0OgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVjI0KTsKKwkJcG9ydC0+aHdpZiA9IFYyNDsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1gyMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMSk7CisJCXBvcnQtPmh3aWYgPSBYMjE7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9YMjFEOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgWDIxRCk7CisJCXBvcnQtPmh3aWYgPSBYMjFEOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfVDE6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBUMSk7CisJCXBvcnQtPmh3aWYgPSBUMTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX0UxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgRTEpOworCQlwb3J0LT5od2lmID0gRTE7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHN5bmMuY2xvY2tfdHlwZSkgeworCWNhc2UgQ0xPQ0tfRVhUOgorCQlGU1RfV1JCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jaywgRVhUQ0xLKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0lOVDoKKwkJRlNUX1dSQihjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIElOVENMSyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCUZTVF9XUkwoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lU3BlZWQsIHN5bmMuY2xvY2tfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9nZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHN5bmM7CisJaW50IGk7CisKKwkvKiBGaXJzdCBjaGVjayB3aGF0IGxpbmUgdHlwZSBpcyBzZXQsIHdlJ2xsIGRlZmF1bHQgdG8gcmVwb3J0aW5nIFguMjEKKwkgKiBpZiBub3RoaW5nIGlzIHNldCBhcyBJRl9JRkFDRV9TWU5DX1NFUklBTCBpbXBsaWVzIGl0IGNhbid0IGJlCisJICogY2hhbmdlZAorCSAqLworCXN3aXRjaCAocG9ydC0+aHdpZikgeworCWNhc2UgRTE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9FMTsKKwkJYnJlYWs7CisJY2FzZSBUMToKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1QxOworCQlicmVhazsKKwljYXNlIFYzNToKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1YzNTsKKwkJYnJlYWs7CisJY2FzZSBWMjQ6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMjQ7CisJCWJyZWFrOworCWNhc2UgWDIxRDoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1gyMUQ7CisJCWJyZWFrOworCWNhc2UgWDIxOgorCWRlZmF1bHQ6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjE7CisJCWJyZWFrOworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9PSAwKSB7CisJCXJldHVybiAwOwkvKiBvbmx5IHR5cGUgcmVxdWVzdGVkICovCisJfQorCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZW9mIChzeW5jKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpID0gcG9ydC0+aW5kZXg7CisJc3luYy5jbG9ja19yYXRlID0gRlNUX1JETChjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCk7CisJLyogTHVja3kgY2FyZCBhbmQgbGludXggdXNlIHNhbWUgZW5jb2RpbmcgaGVyZSAqLworCXN5bmMuY2xvY2tfdHlwZSA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrKSA9PQorCSAgICBJTlRDTEsgPyBDTE9DS19JTlQgOiBDTE9DS19FWFQ7CisJc3luYy5sb29wYmFjayA9IDA7CisKKwlpZiAoY29weV90b191c2VyKGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmMsICZzeW5jLCBzaXplb2YgKHN5bmMpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZW9mIChzeW5jKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZnN0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCXN0cnVjdCBmc3Rpb2Nfd3JpdGUgd3J0aGRyOworCXN0cnVjdCBmc3Rpb2NfaW5mbyBpbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoREJHX0lPQ1RMLCAiaW9jdGw6ICV4LCAlcFxuIiwgY21kLCBpZnItPmlmcl9kYXRhKTsKKworCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZTVENQVVJFU0VUOgorCQlmc3RfY3B1cmVzZXQoY2FyZCk7CisJCWNhcmQtPnN0YXRlID0gRlNUX1JFU0VUOworCQlyZXR1cm4gMDsKKworCWNhc2UgRlNUQ1BVUkVMRUFTRToKKwkJZnN0X2NwdXJlbGVhc2UoY2FyZCk7CisJCWNhcmQtPnN0YXRlID0gRlNUX1NUQVJUSU5HOworCQlyZXR1cm4gMDsKKworCWNhc2UgRlNUV1JJVEU6CQkvKiBDb2RlIHdyaXRlIChkb3dubG9hZCkgKi8KKworCQkvKiBGaXJzdCBjb3B5IGluIHRoZSBoZWFkZXIgd2l0aCB0aGUgbGVuZ3RoIGFuZCBvZmZzZXQgb2YgZGF0YQorCQkgKiB0byB3cml0ZQorCQkgKi8KKwkJaWYgKGlmci0+aWZyX2RhdGEgPT0gTlVMTCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3cnRoZHIsIGlmci0+aWZyX2RhdGEsCisJCQkJICAgc2l6ZW9mIChzdHJ1Y3QgZnN0aW9jX3dyaXRlKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogU2FuaXR5IGNoZWNrIHRoZSBwYXJhbWV0ZXJzLiBXZSBkb24ndCBzdXBwb3J0IHBhcnRpYWwgd3JpdGVzCisJCSAqIHdoZW4gZ29pbmcgb3ZlciB0aGUgdG9wCisJCSAqLworCQlpZiAod3J0aGRyLnNpemUgPiBGU1RfTUVNU0laRSB8fCB3cnRoZHIub2Zmc2V0ID4gRlNUX01FTVNJWkUKKwkJICAgIHx8IHdydGhkci5zaXplICsgd3J0aGRyLm9mZnNldCA+IEZTVF9NRU1TSVpFKSB7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJLyogTm93IGNvcHkgdGhlIGRhdGEgdG8gdGhlIGNhcmQuCisJCSAqIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisJCSAqIEknbGwgZml4IGl0IHdoZW4gSSBoYXZlIHNvbWV0aGluZyB0byB0ZXN0IG9uLgorCQkgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1lbSArIHdydGhkci5vZmZzZXQsCisJCQkJICAgaWZyLT5pZnJfZGF0YSArIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSksCisJCQkJICAgd3J0aGRyLnNpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIFdyaXRlcyB0byB0aGUgbWVtb3J5IG9mIGEgY2FyZCBpbiB0aGUgcmVzZXQgc3RhdGUgY29uc3RpdHV0ZQorCQkgKiBhIGRvd25sb2FkCisJCSAqLworCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1JFU0VUKSB7CisJCQljYXJkLT5zdGF0ZSA9IEZTVF9ET1dOTE9BRDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgRlNUR0VUQ09ORjoKKworCQkvKiBJZiBjYXJkIGhhcyBqdXN0IGJlZW4gc3RhcnRlZCBjaGVjayB0aGUgc2hhcmVkIG1lbW9yeSBjb25maWcKKwkJICogdmVyc2lvbiBhbmQgbWFya2VyCisJCSAqLworCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1NUQVJUSU5HKSB7CisJCQljaGVja19zdGFydGVkX29rKGNhcmQpOworCisJCQkvKiBJZiBldmVyeXRoaW5nIGNoZWNrZWQgb3V0IGVuYWJsZSBjYXJkIGludGVycnVwdHMgKi8KKwkJCWlmIChjYXJkLT5zdGF0ZSA9PSBGU1RfUlVOTklORykgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCQlmc3RfZW5hYmxlX2ludHIoY2FyZCk7CisJCQkJRlNUX1dSQihjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UsIDB4RUUpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisKKwkJaWYgKGlmci0+aWZyX2RhdGEgPT0gTlVMTCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlnYXRoZXJfY29uZl9pbmZvKGNhcmQsIHBvcnQsICZpbmZvKTsKKworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZpbmZvLCBzaXplb2YgKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVFNFVENPTkY6CisKKwkJLyoKKwkJICogTW9zdCBvZiB0aGUgc2V0dGluZ3MgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBnZW5lcmljIGlvY3RscworCQkgKiB0aGlzIGp1c3QgY292ZXJzIGRlYnVnIGFuZCBib2FyZCBpZGVudCBub3cKKwkJICovCisKKwkJaWYgKGNhcmQtPnN0YXRlICE9IEZTVF9SVU5OSU5HKSB7CisJCQlwcmludGtfZXJyCisJCQkgICAgKCJBdHRlbXB0IHRvIGNvbmZpZ3VyZSBjYXJkICVkIGluIG5vbi1ydW5uaW5nIHN0YXRlICglZClcbiIsCisJCQkgICAgIGNhcmQtPmNhcmRfbm8sIGNhcmQtPnN0YXRlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIChpbmZvKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIHNldF9jb25mX2Zyb21faW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CisKKwljYXNlIFNJT0NXQU5ERVY6CisJCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCQljYXNlIElGX0dFVF9JRkFDRToKKwkJCXJldHVybiBmc3RfZ2V0X2lmYWNlKGNhcmQsIHBvcnQsIGlmcik7CisKKwkJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJY2FzZSBJRl9JRkFDRV9WMzU6CisJCWNhc2UgSUZfSUZBQ0VfVjI0OgorCQljYXNlIElGX0lGQUNFX1gyMToKKwkJY2FzZSBJRl9JRkFDRV9YMjFEOgorCQljYXNlIElGX0lGQUNFX1QxOgorCQljYXNlIElGX0lGQUNFX0UxOgorCQkJcmV0dXJuIGZzdF9zZXRfaWZhY2UoY2FyZCwgcG9ydCwgaWZyKTsKKworCQljYXNlIElGX1BST1RPX1JBVzoKKwkJCXBvcnQtPm1vZGUgPSBGU1RfUkFXOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBJRl9HRVRfUFJPVE86CisJCQlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCQkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1JBVzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJCWRlZmF1bHQ6CisJCQlwb3J0LT5tb2RlID0gRlNUX0dFTl9IRExDOworCQkJZGJnKERCR19JT0NUTCwgIlBhc3NpbmcgdGhpcyB0eXBlIHRvIGhkbGMgJXhcbiIsCisJCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSk7CisJCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwkJfQorCisJZGVmYXVsdDoKKwkJLyogTm90IG9uZSBvZiBvdXJzLiBQYXNzIHRocm91Z2ggdG8gSERMQyBwYWNrYWdlICovCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2ZzdF9vcGVucG9ydChzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgc2lnbmFsczsKKwlpbnQgdHhxX2xlbmd0aDsKKworCS8qIE9ubHkgaW5pdCB0aGluZ3MgaWYgY2FyZCBpcyBhY3R1YWxseSBydW5uaW5nLiBUaGlzIGFsbG93cyBvcGVuIHRvCisJICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4KKwkgKi8KKwlpZiAocG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpIHsKKwkJaWYgKHBvcnQtPnJ1bikgeworCQkJZGJnKERCR19PUEVOLCAib3BlbjogZm91bmQgcG9ydCBhbHJlYWR5IHJ1bm5pbmdcbiIpOworCisJCQlmc3RfaXNzdWVfY21kKHBvcnQsIFNUT1BQT1JUKTsKKwkJCXBvcnQtPnJ1biA9IDA7CisJCX0KKworCQlmc3RfcnhfY29uZmlnKHBvcnQpOworCQlmc3RfdHhfY29uZmlnKHBvcnQpOworCQlmc3Rfb3BfcmFpc2UocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKworCQlmc3RfaXNzdWVfY21kKHBvcnQsIFNUQVJUUE9SVCk7CisJCXBvcnQtPnJ1biA9IDE7CisKKwkJc2lnbmFscyA9IEZTVF9SREwocG9ydC0+Y2FyZCwgdjI0RGVib3VuY2VkU3RzW3BvcnQtPmluZGV4XSk7CisJCWlmIChzaWduYWxzICYgKCgocG9ydC0+aHdpZiA9PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkJICAgICAgID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19EQ0QpKQorCQkJbmV0aWZfY2Fycmllcl9vbihwb3J0X3RvX2Rldihwb3J0KSk7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKworCQl0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXM7CisJCXBvcnQtPnR4cWUgPSAwOworCQlwb3J0LT50eHFzID0gMDsKKwl9CisKK30KKworc3RhdGljIHZvaWQKK2ZzdF9jbG9zZXBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaWYgKHBvcnQtPmNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCXBvcnQtPnJ1biA9IDA7CisJCQlmc3Rfb3BfbG93ZXIocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKworCQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCX0gZWxzZSB7CisJCQlkYmcoREJHX09QRU4sICJjbG9zZTogcG9ydCBub3QgcnVubmluZ1xuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKworCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorICAgICAgICAgIHJldHVybiAtRUJVU1k7CisKKwlpZiAocG9ydC0+bW9kZSAhPSBGU1RfUkFXKSB7CisJCWVyciA9IGhkbGNfb3BlbihkZXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlmc3Rfb3BlbnBvcnQocG9ydCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citmc3RfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwl1bnNpZ25lZCBjaGFyIHR4X2RtYV9kb25lOworCXVuc2lnbmVkIGNoYXIgcnhfZG1hX2RvbmU7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKworCXR4X2RtYV9kb25lID0gaW5iKGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMSk7CisJcnhfZG1hX2RvbmUgPSBpbmIoY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IwKTsKKwlkYmcoREJHX09QRU4sCisJICAgICJQb3J0IENsb3NlOiB0eF9kbWFfaW5fcHJvZ3Jlc3MgPSAlZCAoJXgpIHJ4X2RtYV9pbl9wcm9ncmVzcyA9ICVkICgleClcbiIsCisJICAgIGNhcmQtPmRtYXR4X2luX3Byb2dyZXNzLCB0eF9kbWFfZG9uZSwgY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MsCisJICAgIHJ4X2RtYV9kb25lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlmc3RfY2xvc2Vwb3J0KGRldl90b19wb3J0KGRldikpOworCWlmIChwb3J0LT5tb2RlICE9IEZTVF9SQVcpIHsKKwkJaGRsY19jbG9zZShkZXYpOworCX0KKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZnN0X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCS8qCisJICogU2V0dGluZyBjdXJyZW50bHkgZml4ZWQgaW4gRmFyU3luYyBjYXJkIHNvIHdlIGNoZWNrIGFuZCBmb3JnZXQKKwkgKi8KKwlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaIHx8IHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ZzdF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCWRiZyhEQkdfQVNTLCAiVHggdGltZW91dCBjYXJkICVkIHBvcnQgJWRcbiIsCisJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwlmc3RfaXNzdWVfY21kKHBvcnQsIEFCT1JUVFgpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXBvcnQtPnN0YXJ0ID0gMDsKK30KKworc3RhdGljIGludAorZnN0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdHhxX2xlbmd0aDsKKworCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCWRiZyhEQkdfVFgsICJmc3Rfc3RhcnRfeG1pdDogbGVuZ3RoID0gJWRcbiIsIHNrYi0+bGVuKTsKKworCS8qIERyb3AgcGFja2V0IHdpdGggZXJyb3IgaWYgd2UgZG9uJ3QgaGF2ZSBjYXJyaWVyICovCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywKKwkJICAgICJUcmllZCB0byB0cmFuc21pdCBidXQgbm8gY2FycmllciBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCXJldHVybiAwOworCX0KKworCS8qIERyb3AgaXQgaWYgaXQncyB0b28gYmlnISBNVFUgZmFpbHVyZSA/ICovCisJaWYgKHNrYi0+bGVuID4gTEVOX1RYX0JVRkZFUikgeworCQlkYmcoREJHX0FTUywgIlBhY2tldCB0b28gbGFyZ2UgJWQgdnMgJWRcbiIsIHNrYi0+bGVuLAorCQkgICAgTEVOX1RYX0JVRkZFUik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGFyZSBhbHdheXMgZ29pbmcgdG8gcXVldWUgdGhlIHBhY2tldAorCSAqIHNvIHRoYXQgdGhlIGJvdHRvbSBoYWxmIGlzIHRoZSBvbmx5IHBsYWNlIHdlIHR4IGZyb20KKwkgKiBDaGVjayB0aGVyZSBpcyByb29tIGluIHRoZSBwb3J0IHR4cQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAoKHR4cV9sZW5ndGggPSBwb3J0LT50eHFlIC0gcG9ydC0+dHhxcykgPCAwKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG5leHQgZnJlZSBoYXMgd3JhcHBlZCBidXQgdGhlCisJCSAqIGxhc3QgdXNlZCBoYXNuJ3QKKwkJICovCisJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNUX1RYUV9ERVBUSDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHR4cV9sZW5ndGggPiBmc3RfdHhxX2hpZ2gpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBnb3QgZW5vdWdoIGJ1ZmZlcnMgaW4gdGhlIHBpcGVsaW5lLiAgQXNrIHRoZSBuZXR3b3JrCisJCSAqIGxheWVyIHRvIHN0b3Agc2VuZGluZyBmcmFtZXMgZG93bgorCQkgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlwb3J0LT5zdGFydCA9IDE7CS8qIEknbSB1c2luZyB0aGlzIHRvIHNpZ25hbCBzdG9wIHNlbnQgdXAgKi8KKwl9CisKKwlpZiAodHhxX2xlbmd0aCA9PSBGU1RfVFhRX0RFUFRIIC0gMSkgeworCQkvKgorCQkgKiBUaGlzIHNob3VsZG4ndCBoYXZlIGhhcHBlbmVkIGJ1dCBzdWNoIGlzIGxpZmUKKwkJICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlR4IHF1ZXVlIG92ZXJmbG93IGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBxdWV1ZSB0aGUgYnVmZmVyCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXBvcnQtPnR4cVtwb3J0LT50eHFlXSA9IHNrYjsKKwlwb3J0LT50eHFlKys7CisJaWYgKHBvcnQtPnR4cWUgPT0gRlNUX1RYUV9ERVBUSCkKKwkJcG9ydC0+dHhxZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisKKwkvKiBTY2VoZHVsZSB0aGUgYm90dG9tIGhhbGYgd2hpY2ggbm93IGRvZXMgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCWZzdF9xX3dvcmtfaXRlbSgmZnN0X3dvcmtfdHhxLCBjYXJkLT5jYXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfdHhfdGFzayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgQ2FyZCBzZXR1cCBoYXZpbmcgY2hlY2tlZCBoYXJkd2FyZSByZXNvdXJjZXMuCisgKiAgICAgIFNob3VsZCBiZSBwcmV0dHkgYml6YXJyZSBpZiB3ZSBnZXQgYW4gZXJyb3IgaGVyZSAoa2VybmVsIG1lbW9yeQorICogICAgICBleGhhdXN0aW9uIGlzIG9uZSBwb3NzaWJpbGl0eSkuIElmIHdlIGRvIHNlZSBhIHByb2JsZW0gd2UgcmVwb3J0IGl0CisgKiAgICAgIHZpYSBhIHByaW50ayBhbmQgbGVhdmUgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlIGFuZCBhbGwgdGhhdCBmb2xsb3cKKyAqICAgICAgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBjaGFyICp0eXBlX3N0cmluZ3NbXSBfX2RldmluaXRkYXRhID0geworCSJubyBoYXJkd2FyZSIsCQkvKiBTaG91bGQgbmV2ZXIgYmUgc2VlbiAqLworCSJGYXJTeW5jIFQyUCIsCisJIkZhclN5bmMgVDRQIiwKKwkiRmFyU3luYyBUMVUiLAorCSJGYXJTeW5jIFQyVSIsCisJIkZhclN5bmMgVDRVIiwKKwkiRmFyU3luYyBURTEiCit9OworCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2ZzdF9pbml0X2NhcmQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaW50IGk7CisJaW50IGVycjsKKworCS8qIFdlJ3JlIHdvcmtpbmcgb24gYSBudW1iZXIgb2YgcG9ydHMgYmFzZWQgb24gdGhlIGNhcmQgSUQuIElmIHRoZQorCSAqIGZpcm13YXJlIGRldGVjdHMgc29tZXRoaW5nIGRpZmZlcmVudCBsYXRlciAoc2hvdWxkIG5ldmVyIGhhcHBlbikKKwkgKiB3ZSdsbCBoYXZlIHRvIHJldmlzZSBpdCBpbiBzb21lIHdheSB0aGVuLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5ucG9ydHM7IGkrKykgeworICAgICAgICAgICAgICAgIGVyciA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGNhcmQtPnBvcnRzW2ldLmRldik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKwkJCWludCBqOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkNhbm5vdCByZWdpc3RlciBIRExDIGRldmljZSBmb3IgcG9ydCAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGVycm5vICVkKVxuIiwgaSwgLWVyciApOworCQkJZm9yIChqID0gaTsgaiA8IGNhcmQtPm5wb3J0czsgaisrKSB7CisJCQkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbal0uZGV2KTsKKwkJCQljYXJkLT5wb3J0c1tqXS5kZXYgPSBOVUxMOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bnBvcnRzID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlwcmludGtfaW5mbygiJXMtJXM6ICVzIElSUSVkLCAlZCBwb3J0c1xuIiwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzWzBdKS0+bmFtZSwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2NhcmQtPm5wb3J0cyAtIDFdKS0+bmFtZSwKKwkgICAgICAgdHlwZV9zdHJpbmdzW2NhcmQtPnR5cGVdLCBjYXJkLT5pcnEsIGNhcmQtPm5wb3J0cyk7Cit9CisKKy8qCisgKiAgICAgIEluaXRpYWxpc2UgY2FyZCB3aGVuIGRldGVjdGVkLgorICogICAgICBSZXR1cm5zIDAgdG8gaW5kaWNhdGUgc3VjY2Vzcywgb3IgZXJybm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZnN0X2FkZF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBmaXJzdHRpbWVfZG9uZSA9IDA7CisJc3RhdGljIGludCBub19vZl9jYXJkc19hZGRlZCA9IDA7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlpZiAoIWZpcnN0dGltZV9kb25lKSB7CisJCXByaW50a19pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgIiBGU1RfVVNFUl9WRVJTSU9OCisJCSAgICAgICAiIChjKSAyMDAxLTIwMDQgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuXG4iKTsKKwkJZmlyc3R0aW1lX2RvbmUgPSAxOworCQlkYmcoREJHX0FTUywgIlRoZSB2YWx1ZSBvZiBkZWJ1ZyBtYXNrIGlzICV4XG4iLCBmc3RfZGVidWdfbWFzayk7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgZ29pbmcgdG8gYmUgY2xldmVyIGFuZCBhbGxvdyBjZXJ0YWluIGNhcmRzIG5vdCB0byBiZQorCSAqIGNvbmZpZ3VyZWQuICBBbiBleGNsdWRlIGxpc3QgY2FuIGJlIHByb3ZpZGVkIGluIC9ldGMvbW9kdWxlcy5jb25mCisJICovCisJaWYgKGZzdF9leGNsdWRlZF9jYXJkcyAhPSAwKSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBjYXJkcyB0byBleGNsdWRlCisJCSAqCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZnN0X2V4Y2x1ZGVkX2NhcmRzOyBpKyspIHsKKwkJCWlmICgocGRldi0+ZGV2Zm4pID4+IDMgPT0gZnN0X2V4Y2x1ZGVkX2xpc3RbaV0pIHsKKwkJCQlwcmludGtfaW5mbygiRmFyU3luYyBQQ0kgZGV2aWNlICVkIG5vdCBhc3NpZ25lZFxuIiwKKwkJCQkgICAgICAgKHBkZXYtPmRldmZuKSA+PiAzKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJfQorCisJLyogQWxsb2NhdGUgZHJpdmVyIHByaXZhdGUgZGF0YSAqLworCWNhcmQgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGZzdF9jYXJkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50a19lcnIoIkZhclN5bmMgY2FyZCBmb3VuZCBidXQgaW5zdWZmaWNpZW50IG1lbW9yeSBmb3IiCisJCQkgICAiIGRyaXZlciBzdG9yYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChjYXJkLCAwLCBzaXplb2YgKHN0cnVjdCBmc3RfY2FyZF9pbmZvKSk7CisKKwkvKiBUcnkgdG8gZW5hYmxlIHRoZSBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSAhPSAwKSB7CisJCXByaW50a19lcnIoIkZhaWxlZCB0byBlbmFibGUgY2FyZC4gRXJyICVkXG4iLCAtZXJyKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJGYXJTeW5jIikpICE9MCkgeworCSAgICAgICAgcHJpbnRrX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lvbnMuIEVyciAlZFxuIiwgLWVycik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJa2ZyZWUoY2FyZCk7CisJICAgICAgICByZXR1cm4gZXJyOworCX0KKworCS8qIEdldCB2aXJ0dWFsIGFkZHJlc3NlcyBvZiBtZW1vcnkgcmVnaW9ucyAqLworCWNhcmQtPnBjaV9jb25mID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWNhcmQtPnBoeXNfbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCWNhcmQtPnBoeXNfY3RsbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCWlmICgoY2FyZC0+bWVtID0gaW9yZW1hcChjYXJkLT5waHlzX21lbSwgRlNUX01FTVNJWkUpKSA9PSBOVUxMKSB7CisJCXByaW50a19lcnIoIlBoeXNpY2FsIG1lbW9yeSByZW1hcCBmYWlsZWRcbiIpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChjYXJkLT5jdGxtZW0gPSBpb3JlbWFwKGNhcmQtPnBoeXNfY3RsbWVtLCAweDEwKSkgPT0gTlVMTCkgeworCQlwcmludGtfZXJyKCJDb250cm9sIG1lbW9yeSByZW1hcCBmYWlsZWRcbiIpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGJnKERCR19QQ0ksICJrZXJuZWwgbWVtICVwLCBjdGxtZW0gJXBcbiIsIGNhcmQtPm1lbSwgY2FyZC0+Y3RsbWVtKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGZzdF9pbnRyLCBTQV9TSElSUSwgRlNUX0RFVl9OQU1FLCBjYXJkKSkgeworCQlwcmludGtfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICVkXG4iLCBjYXJkLT5pcnEpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwkJaW91bm1hcChjYXJkLT5tZW0pOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogUmVjb3JkIGluZm8gd2UgbmVlZCAqLworCWNhcmQtPmlycSA9IHBkZXYtPmlycTsKKwljYXJkLT50eXBlID0gZW50LT5kcml2ZXJfZGF0YTsKKwljYXJkLT5mYW1pbHkgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQKSB8fAorCQkJKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDRQKSkKKwkgICAgPyBGU1RfRkFNSUxZX1RYUCA6IEZTVF9GQU1JTFlfVFhVOworCWlmICgoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMVUpIHx8CisJICAgIChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1RFMSkpCisJCWNhcmQtPm5wb3J0cyA9IDE7CisJZWxzZQorCQljYXJkLT5ucG9ydHMgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQKSB8fAorCQkJCShlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyVSkpID8gMiA6IDQ7CisKKwljYXJkLT5zdGF0ZSA9IEZTVF9VTklOSVQ7CisgICAgICAgIHNwaW5fbG9ja19pbml0ICggJmNhcmQtPmNhcmRfbG9jayApOworCisgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGNhcmQtPm5wb3J0cyA7IGkrKyApIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzW2ldKTsKKwkJaGRsY19kZXZpY2UgKmhkbGM7CisJCWlmICghZGV2KSB7CisJCQl3aGlsZSAoaS0tKQorCQkJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2ldLmRldik7CisJCQlwcmludGtfZXJyICgiRmFyU3luYzogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvdW5tYXAoY2FyZC0+bWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGNhcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJY2FyZC0+cG9ydHNbaV0uZGV2ICAgID0gZGV2OworICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmNhcmQgICA9IGNhcmQ7CisgICAgICAgICAgICAgICAgY2FyZC0+cG9ydHNbaV0uaW5kZXggID0gaTsKKyAgICAgICAgICAgICAgICBjYXJkLT5wb3J0c1tpXS5ydW4gICAgPSAwOworCisJCWhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisgICAgICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgbmV0IGRldmljZSBpbmZvICovCisJCS8qIFNpbmNlIHRoaXMgaXMgYSBQQ0kgc2V0dXAgdGhpcyBpcyBwdXJlbHkKKwkJICogaW5mb3JtYXRpb25hbC4gR2l2ZSB0aGVtIHRoZSBidWZmZXIgYWRkcmVzc2VzCisJCSAqIGFuZCBiYXNpYyBjYXJkIEkvTy4KKwkJICovCisgICAgICAgICAgICAgICAgZGV2LT5tZW1fc3RhcnQgICA9IGNhcmQtPnBoeXNfbWVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltpXVswXVswXSk7CisgICAgICAgICAgICAgICAgZGV2LT5tZW1fZW5kICAgICA9IGNhcmQtPnBoeXNfbWVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltpXVtOVU1fVFhfQlVGRkVSXVswXSk7CisgICAgICAgICAgICAgICAgZGV2LT5iYXNlX2FkZHIgICA9IGNhcmQtPnBjaV9jb25mOworICAgICAgICAgICAgICAgIGRldi0+aXJxICAgICAgICAgPSBjYXJkLT5pcnE7CisKKyAgICAgICAgICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiAgICAgICAgICA9IEZTVF9UWF9RVUVVRV9MRU47CisgICAgICAgICAgICAgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgICAgPSBmc3Rfb3BlbjsKKyAgICAgICAgICAgICAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICAgICA9IGZzdF9jbG9zZTsKKyAgICAgICAgICAgICAgICBkZXYtPmRvX2lvY3RsICAgICAgICAgICAgICA9IGZzdF9pb2N0bDsKKyAgICAgICAgICAgICAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICAgICA9IEZTVF9UWF9USU1FT1VUOworICAgICAgICAgICAgICAgIGRldi0+dHhfdGltZW91dCAgICAgICAgICAgID0gZnN0X3R4X3RpbWVvdXQ7CisgICAgICAgICAgICAgICAgaGRsYy0+YXR0YWNoID0gZnN0X2F0dGFjaDsKKyAgICAgICAgICAgICAgICBoZGxjLT54bWl0ICAgPSBmc3Rfc3RhcnRfeG1pdDsKKwl9CisKKwljYXJkLT5kZXZpY2UgPSBwZGV2OworCisJZGJnKERCR19QQ0ksICJ0eXBlICVkIG5wb3J0cyAlZCBpcnEgJWRcbiIsIGNhcmQtPnR5cGUsCisJICAgIGNhcmQtPm5wb3J0cywgY2FyZC0+aXJxKTsKKwlkYmcoREJHX1BDSSwgImNvbmYgJTA0eCBtZW0gJTA4eCBjdGxtZW0gJTA4eFxuIiwKKwkgICAgY2FyZC0+cGNpX2NvbmYsIGNhcmQtPnBoeXNfbWVtLCBjYXJkLT5waHlzX2N0bG1lbSk7CisKKwkvKiBSZXNldCB0aGUgY2FyZCdzIHByb2Nlc3NvciAqLworCWZzdF9jcHVyZXNldChjYXJkKTsKKwljYXJkLT5zdGF0ZSA9IEZTVF9SRVNFVDsKKworCS8qIEluaXRpYWxpc2UgRE1BIChpZiByZXF1aXJlZCkgKi8KKwlmc3RfaW5pdF9kbWEoY2FyZCk7CisKKwkvKiBSZWNvcmQgZHJpdmVyIGRhdGEgZm9yIGxhdGVyIHVzZSAqLworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCS8qIFJlbWFpbmRlciBvZiBjYXJkIHNldHVwICovCisJZnN0X2NhcmRfYXJyYXlbbm9fb2ZfY2FyZHNfYWRkZWRdID0gY2FyZDsKKwljYXJkLT5jYXJkX25vID0gbm9fb2ZfY2FyZHNfYWRkZWQrKzsJLyogUmVjb3JkIGluc3RhbmNlIGFuZCBidW1wIGl0ICovCisJZnN0X2luaXRfY2FyZChjYXJkKTsKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgZG1hIGJ1ZmZlciBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmVzCisJCSAqLworCQljYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QgPQorCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkJICZjYXJkLT5yeF9kbWFfaGFuZGxlX2NhcmQpOworCQlpZiAoY2FyZC0+cnhfZG1hX2hhbmRsZV9ob3N0ID09IE5VTEwpIHsKKwkJCXByaW50a19lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSByeCBkbWEgYnVmZmVyXG4iKTsKKwkJCWZzdF9kaXNhYmxlX2ludHIoY2FyZCk7CisJCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQkJaW91bm1hcChjYXJkLT5jdGxtZW0pOworCQkJaW91bm1hcChjYXJkLT5tZW0pOworCQkJa2ZyZWUoY2FyZCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QgPQorCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkJICZjYXJkLT50eF9kbWFfaGFuZGxlX2NhcmQpOworCQlpZiAoY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0ID09IE5VTEwpIHsKKwkJCXByaW50a19lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSB0eCBkbWEgYnVmZmVyXG4iKTsKKwkJCWZzdF9kaXNhYmxlX2ludHIoY2FyZCk7CisJCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQkJaW91bm1hcChjYXJkLT5jdGxtZW0pOworCQkJaW91bm1hcChjYXJkLT5tZW0pOworCQkJa2ZyZWUoY2FyZCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXR1cm4gMDsJCS8qIFN1Y2Nlc3MgKi8KK30KKworLyoKKyAqICAgICAgQ2xlYW51cCBhbmQgY2xvc2UgZG93biBhIGNhcmQKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0Citmc3RfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlpbnQgaTsKKworCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tpXSk7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwl9CisKKwlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOworCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisKKwlpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisJaW91bm1hcChjYXJkLT5tZW0pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkgKiBGcmVlIGRtYSBidWZmZXJzCisJCSAqLworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJICAgIGNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCwKKwkJCQkgICAgY2FyZC0+cnhfZG1hX2hhbmRsZV9jYXJkKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCSAgICBjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QsCisJCQkJICAgIGNhcmQtPnR4X2RtYV9oYW5kbGVfY2FyZCk7CisJfQorCWZzdF9jYXJkX2FycmF5W2NhcmQtPmNhcmRfbm9dID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGZzdF9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lCQk9IEZTVF9OQU1FLAorICAgICAgICAuaWRfdGFibGUJPSBmc3RfcGNpX2Rldl9pZCwKKyAgICAgICAgLnByb2JlCQk9IGZzdF9hZGRfb25lLAorICAgICAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoZnN0X3JlbW92ZV9vbmUpLAorICAgICAgICAuc3VzcGVuZAk9IE5VTEwsCisgICAgICAgIC5yZXN1bWUJPSBOVUxMLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2ZzdF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlNUX01BWF9DQVJEUzsgaSsrKQorCQlmc3RfY2FyZF9hcnJheVtpXSA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJmZzdF93b3JrX3FfbG9jayk7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZnN0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZnN0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrX2luZm8oIkZhclN5bmMgV0FOIGRyaXZlciB1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZnN0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGZzdF9pbml0KTsKK21vZHVsZV9leGl0KGZzdF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODcxZGFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuaApAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqICAgICAgRmFyU3luYyBYMjEgZHJpdmVyIGZvciBMaW51eAorICoKKyAqICAgICAgQWN0dWFsbHkgc3luYyBkcml2ZXIgZm9yIFguMjEsIFYuMzUgYW5kIFYuMjQgb24gRmFyU3luYyBULXNlcmllcyBjYXJkcworICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxIEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICB3d3cuZmFyc2l0ZS5jby51aworICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIEF1dGhvcjogUi5KLkR1bmxvcCAgICAgIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+CisgKgorICogICAgICBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIGZpbGUgb25seSBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBpbmZvcm1hdGlvbgorICogICAgICB0aGF0IGlzIHZpc2libGUgdG8gYXBwbGljYXRpb25zIG91dHNpZGUgdGhlIGRyaXZlci4gU2hhcmVkIG1lbW9yeQorICogICAgICBsYXlvdXQgZXRjIGlzIGludGVybmFsIHRvIHRoZSBkcml2ZXIgYW5kIGRlc2NyaWJlZCB3aXRoaW4gZmFyc3luYy5jLgorICogICAgICBPdmVybGFwIGV4aXN0cyBpbiB0aGF0IHRoZSB2YWx1ZXMgdXNlZCBmb3Igc29tZSBmaWVsZHMgd2l0aGluIHRoZQorICogICAgICBpb2N0bCBpbnRlcmZhY2UgZXh0ZW5kIGludG8gdGhlIGNhcmRzIGZpcm13YXJlIGludGVyZmFjZSBzbyB2YWx1ZXMgaW4KKyAqICAgICAgdGhpcyBmaWxlIG1heSBub3QgYmUgY2hhbmdlZCBhcmJpdHJhcmlseS4KKyAqLworCisvKiAgICAgIFdoYXQncyBpbiBhIG5hbWUKKyAqCisgKiAgICAgIFRoZSBwcm9qZWN0IG5hbWUgZm9yIHRoaXMgZHJpdmVyIGlzIE9zY2FyLiBUaGUgZHJpdmVyIGlzIGludGVuZGVkIHRvIGJlCisgKiAgICAgIHVzZWQgd2l0aCB0aGUgRmFyU2l0ZSBULVNlcmllcyBjYXJkcyAoVDJQICYgVDRQKSBydW5uaW5nIGluIHRoZSBoaWdoCisgKiAgICAgIHNwZWVkIGZyYW1lIHNoaWZ0ZXIgbW9kZS4gVGhpcyBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgWC4yMSBtb2RlCisgKiAgICAgIHdoaWNoIGlzIGEgY29tcGxldGUgbWlzbm9tZXIgYXMgdGhlIGNhcmQgY29udGludWVzIHRvIHN1cHBvcnQgVi4yNCBhbmQKKyAqICAgICAgVi4zNSBhcyB3ZWxsIGFzIFguMjEuCisgKgorICogICAgICBBIHNob3J0IGNvbW1vbiBwcmVmaXggaXMgdXNlZnVsIGZvciByb3V0aW5lcyB3aXRoaW4gdGhlIGRyaXZlciB0byBhdm9pZAorICogICAgICBjb25mbGljdCB3aXRoIG90aGVyIHNpbWlsYXIgZHJpdmVycyBhbmQgSSBjaG9zZW4gdG8gdXNlICJmc3RfIiBmb3IgdGhpcworICogICAgICBwdXJwb3NlIChGYXJTaXRlIFQtc2VyaWVzKS4KKyAqCisgKiAgICAgIEZpbmFsbHkgdGhlIGRldmljZSBkcml2ZXIgbmVlZHMgYSBzaG9ydCBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBTaW5jZQorICogICAgICAiaGRsYyIgaXMgYWxyZWFkeSBpbiB1c2UgSSd2ZSBjaG9zZW4gdGhlIGV2ZW4gbGVzcyBpbmZvcm1hdGl2ZSAic3luYyIKKyAqICAgICAgZm9yIHRoZSBwcmVzZW50LgorICovCisjZGVmaW5lIEZTVF9OQU1FICAgICAgICAgICAgICAgICJmc3QiICAgICAgICAgICAvKiBJbiBkZWJ1Zy9pbmZvIGV0YyAqLworI2RlZmluZSBGU1RfTkRFVl9OQU1FICAgICAgICAgICAic3luYyIgICAgICAgICAgLyogRm9yIG5ldCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlNUX0RFVl9OQU1FICAgICAgICAgICAgImZhcnN5bmMiICAgICAgIC8qIEZvciBtaXNjIGludGVyZmFjZXMgKi8KKworCisvKiAgICAgIFVzZXIgdmVyc2lvbiBudW1iZXIKKyAqCisgKiAgICAgIFRoaXMgdmVyc2lvbiBudW1iZXIgaXMgaW5jcmVtZW50ZWQgd2l0aCBlYWNoIG9mZmljaWFsIHJlbGVhc2Ugb2YgdGhlCisgKiAgICAgIHBhY2thZ2UgYW5kIGlzIGEgc2ltcGxpZmllZCBudW1iZXIgZm9yIG5vcm1hbCB1c2VyIHJlZmVyZW5jZS4KKyAqICAgICAgSW5kaXZpZHVhbCBmaWxlcyBhcmUgdHJhY2tlZCBieSB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBhbmQgbWF5CisgKiAgICAgIGhhdmUgaW5kaXZpZHVhbCB2ZXJzaW9ucyAob3IgSURzKSB0aGF0IG1vdmUgbXVjaCBmYXN0ZXIgdGhhbiB0aGUKKyAqICAgICAgdGhlIHJlbGVhc2UgdmVyc2lvbiBhcyBpbmRpdmlkdWFsIHVwZGF0ZXMgYXJlIHRyYWNrZWQuCisgKi8KKyNkZWZpbmUgRlNUX1VTRVJfVkVSU0lPTiAgICAgICAgIjEuMDQiCisKKworLyogICAgICBJb2N0bCBjYWxsIGNvbW1hbmQgdmFsdWVzCisgKgorICogICAgICBUaGUgZmlyc3QgdGhyZWUgcHJpdmF0ZSBpb2N0bHMgYXJlIHVzZWQgYnkgdGhlIHN5bmMtUFBQIG1vZHVsZSwKKyAqICAgICAgYWxsb3dpbmcgYSBsaXR0bGUgcm9vbSBmb3IgZXhwYW5zaW9uIHdlIHN0YXJ0IG91ciBudW1iZXJpbmcgYXQgMTAuCisgKi8KKyNkZWZpbmUgRlNUV1JJVEUgICAgICAgIChTSU9DREVWUFJJVkFURSsxMCkKKyNkZWZpbmUgRlNUQ1BVUkVTRVQgICAgIChTSU9DREVWUFJJVkFURSsxMSkKKyNkZWZpbmUgRlNUQ1BVUkVMRUFTRSAgIChTSU9DREVWUFJJVkFURSsxMikKKyNkZWZpbmUgRlNUR0VUQ09ORiAgICAgIChTSU9DREVWUFJJVkFURSsxMykKKyNkZWZpbmUgRlNUU0VUQ09ORiAgICAgIChTSU9DREVWUFJJVkFURSsxNCkKKworCisvKiAgICAgIEZTVFdSSVRFCisgKgorICogICAgICBVc2VkIHRvIHdyaXRlIGEgYmxvY2sgb2YgZGF0YSAoZmlybXdhcmUgZXRjKSBiZWZvcmUgdGhlIGNhcmQgaXMgcnVubmluZworICovCitzdHJ1Y3QgZnN0aW9jX3dyaXRlIHsKKyAgICAgICAgdW5zaWduZWQgaW50ICBzaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgIG9mZnNldDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworCisvKiAgICAgIEZTVENQVVJFU0VUIGFuZCBGU1RDUFVSRUxFQVNFCisgKgorICogICAgICBUaGVzZSB0YWtlIG5vIGFkZGl0aW9uYWwgZGF0YS4KKyAqICAgICAgRlNUQ1BVUkVTRVQgZm9yY2VzIHRoZSBjYXJkcyBDUFUgaW50byBhIHJlc2V0IHN0YXRlIGFuZCBob2xkcyBpdCB0aGVyZS4KKyAqICAgICAgRlNUQ1BVUkVMRUFTRSByZWxlYXNlcyB0aGUgQ1BVIGZyb20gdGhpcyByZXNldCBzdGF0ZSBhbGxvd2luZyBpdCB0byBydW4sCisgKiAgICAgIHRoZSByZXNldCB2ZWN0b3Igc2hvdWxkIGJlIHNldHVwIGJlZm9yZSB0aGlzIGlvY3RsIGlzIHJ1bi4KKyAqLworCisvKiAgICAgIEZTVEdFVENPTkYgYW5kIEZTVFNFVENPTkYKKyAqCisgKiAgICAgIEdldCBhbmQgc2V0IGEgY2FyZC9wb3J0cyBjb25maWd1cmF0aW9uLgorICogICAgICBJbiBvcmRlciB0byBhbGxvdyBzZWxlY3RpdmUgc2V0dGluZyBvZiBpdGVtcyBhbmQgZm9yIHRoZSBrZXJuZWwgdG8KKyAqICAgICAgaW5kaWNhdGUgYSBwYXJ0aWFsIHN0YXR1cyByZXNwb25zZSB0aGUgZmlyc3QgZmllbGQgInZhbGlkIiBpcyBhIGJpdG1hc2sKKyAqICAgICAgaW5kaWNhdGluZyB3aGljaCBvdGhlciBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZSBhcmUgdmFsaWQuCisgKiAgICAgIE1hbnkgb2YgdGhlIGZpZWxkIG5hbWVzIGluIHRoaXMgc3RydWN0dXJlIG1hdGNoIHRob3NlIHVzZWQgaW4gdGhlCisgKiAgICAgIGZpcm13YXJlIHNoYXJlZCBtZW1vcnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgYW5kIGNvbWUgb3JpZ2luYWxseSBmcm9tCisgKiAgICAgIHRoZSBOVCBoZWFkZXIgZmlsZSBTbWMuaAorICoKKyAqICAgICAgV2hlbiB1c2VkIHdpdGggRlNUR0VUQ09ORiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKiAgICAgIFRoaXMgaXMgdG8gYWxsb3cgZm9yIHBvc3NpYmxlIGZ1dHVyZSBleHBhbnNpb24gd2hlbiBzb21lIG9mIHRoZSBmaWVsZHMKKyAqICAgICAgbWlnaHQgYmUgdXNlZCB0byBpbmRpY2F0ZSBhIGRpZmZlcmVudCAoZXhwYW5kZWQpIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGZzdGlvY19pbmZvIHsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgdmFsaWQ7ICAgICAgICAgICAvKiBCaXRzIG9mIHN0cnVjdHVyZSB0aGF0IGFyZSB2YWxpZCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBucG9ydHM7ICAgICAgICAgIC8qIE51bWJlciBvZiBzZXJpYWwgcG9ydHMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgdHlwZTsgICAgICAgICAgICAvKiBUeXBlIGluZGV4IG9mIGNhcmQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgc3RhdGU7ICAgICAgICAgICAvKiBTdGF0ZSBvZiBjYXJkICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGluZGV4OyAgICAgICAgICAgLyogSW5kZXggb2YgcG9ydCBpb2N0bCB3YXMgaXNzdWVkIG9uICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHNtY0Zpcm13YXJlVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAga2VybmVsVmVyc2lvbjsgICAvKiBXaGF0IEtlcm5lbCB2ZXJzaW9uIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbGluZUludGVyZmFjZTsgICAvKiBQaHlzaWNhbCBpbnRlcmZhY2UgdHlwZSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBwcm90bzsgICAgICAgICAgIC8qIExpbmUgcHJvdG9jb2wgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaW50ZXJuYWxDbG9jazsgICAvKiAxID0+IGludGVybmFsIGNsb2NrLCAwID0+IGV4dGVybmFsICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGxpbmVTcGVlZDsgICAgICAgLyogU3BlZWQgaW4gYnBzICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHYyNElwU3RzOyAgICAgICAgLyogVi4yNCBjb250cm9sIGlucHV0IHN0YXR1cyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICB2MjRPcFN0czsgICAgICAgIC8qIFYuMjQgY29udHJvbCBvdXRwdXQgc3RhdHVzICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGNsb2NrU3RhdHVzOyAgICAgLyogbHNiOiAwPT4gcHJlc2VudCwgMT0+IGFic2VudCAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBjYWJsZVN0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FyZE1vZGU7ICAgICAgICAvKiBsc2I6IExFRCBpZCBtb2RlICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlYnVnOyAgICAgICAgICAgLyogRGVidWcgZmxhZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHJhbnNwYXJlbnRNb2RlOyAvKiBOb3QgdXNlZCBhbHdheXMgMCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpbnZlcnRDbG9jazsgICAgIC8qIEludmVydCBjbG9jayBmZWF0dXJlIGZvciBzeW5jaW5nICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIHN0YXJ0aW5nU2xvdDsgICAgLyogVGltZSBzbG90IHRvIHVzZSBmb3Igc3RhcnQgb2YgdHggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY2xvY2tTb3VyY2U7ICAgICAvKiBFeHRlcm5hbCBvciBpbnRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBmcmFtaW5nOyAgICAgICAgIC8qIEUxLCBUMSBvciBKMSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdHJ1Y3R1cmU7ICAgICAgIC8qIHVuZnJhbWVkLCBkb3VibGUsIGNyYzQsIGY0LCBmMTIsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZjI0IGY3MiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpbnRlcmZhY2U7ICAgICAgIC8qIHJqNDhjIG9yIGJuYyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBjb2Rpbmc7ICAgICAgICAgIC8qIGhkYjMgYjh6cyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBsaW5lQnVpbGRPdXQ7ICAgIC8qIDAsIC03LjUsIC0xNSwgLTIyICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGVxdWFsaXplcjsgICAgICAgLyogc2hvcnQgb3IgbG9uIGhhdWwgc2V0dGluZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbG9vcE1vZGU7ICAgICAgICAvKiB2YXJpb3VzIGxvb3BiYWNrcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICByYW5nZTsgICAgICAgICAgIC8qIGNhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHhCdWZmZXJNb2RlOyAgICAvKiB0eCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICByeEJ1ZmZlck1vZGU7ICAgIC8qIHJ4IGVsYXN0aWMgYnVmZmVyIGRlcHRoICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGxvc1RocmVzaG9sZDsgICAgLyogQXR0ZW51YXRpb24gb24gTE9TIHNpZ25hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpZGxlQ29kZTsgICAgICAgIC8qIFZhbHVlIHRvIHNlbmQgYXMgaWRsZSB0aW1lc2xvdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICByZWNlaXZlQnVmZmVyRGVsYXk7IC8qIGRlbGF5IHRocm8gcnggYnVmZmVyIHRpbWVzbG90cyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBmcmFtaW5nRXJyb3JDb3VudDsgLyogZnJhbWluZyBlcnJvcnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY29kZVZpb2xhdGlvbkNvdW50OyAvKiBjb2RlIHZpb2xhdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY3JjRXJyb3JDb3VudDsgICAvKiBDUkMgZXJyb3JzICovCisgICAgICAgIGludCAgICAgICAgICAgIGxpbmVBdHRlbnVhdGlvbjsgLyogaW4gZEIqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb3NzT2ZTaWduYWw7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlY2VpdmVSZW1vdGVBbGFybTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYWxhcm1JbmRpY2F0aW9uU2lnbmFsOworfTsKKworLyogInZhbGlkIiBiaXRtYXNrICovCisjZGVmaW5lIEZTVFZBTF9OT05FICAgICAweDAwMDAwMDAwICAgICAgLyogTm90aGluZyB2YWxpZCAoZmlybXdhcmUgbm90IHJ1bm5pbmcpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNsaWdodCBtaXNub21lci4gSW4gZmFjdCBucG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHlwZSwgc3RhdGUgYW5kIGluZGV4IHdpbGwgYmUgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmFzZWQgb24gaGFyZHdhcmUgZGV0ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZTVFZBTF9PTU9ERU0gICAweDAwMDAwMDFGICAgICAgLyogRmlyc3QgNSBiaXRzIGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3V0cHV0IHN0YXR1cyBiaXRzIGRlZmluZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdjI0T3BTdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlNUVkFMX1NQRUVEICAgIDB4MDAwMDAwMjAgICAgICAvKiBpbnRlcm5hbENsb2NrLCBsaW5lU3BlZWQsIGNsb2NrU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZTVFZBTF9DQUJMRSAgICAweDAwMDAwMDQwICAgICAgLyogbGluZUludGVyZmFjZSwgY2FibGVTdGF0dXMgKi8KKyNkZWZpbmUgRlNUVkFMX0lNT0RFTSAgIDB4MDAwMDAwODAgICAgICAvKiB2MjRJcFN0cyAqLworI2RlZmluZSBGU1RWQUxfQ0FSRCAgICAgMHgwMDAwMDEwMCAgICAgIC8qIG5wb3J0cywgdHlwZSwgc3RhdGUsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNtY0Zpcm13YXJlVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGU1RWQUxfUFJPVE8gICAgMHgwMDAwMDIwMCAgICAgIC8qIHByb3RvICovCisjZGVmaW5lIEZTVFZBTF9NT0RFICAgICAweDAwMDAwNDAwICAgICAgLyogY2FyZE1vZGUgKi8KKyNkZWZpbmUgRlNUVkFMX1BIQVNFICAgIDB4MDAwMDA4MDAgICAgICAvKiBDbG9jayBwaGFzZSAqLworI2RlZmluZSBGU1RWQUxfVEUxICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIFQxRTEgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBGU1RWQUxfREVCVUcgICAgMHg4MDAwMDAwMCAgICAgIC8qIGRlYnVnICovCisjZGVmaW5lIEZTVFZBTF9BTEwgICAgICAweDAwMDAxRkZGICAgICAgLyogTm90ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICovCisKKy8qICJ0eXBlIiAqLworI2RlZmluZSBGU1RfVFlQRV9OT05FICAgMCAgICAgICAgICAgICAgIC8qIFByb2JhYmx5IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDJQICAgIDEgICAgICAgICAgICAgICAvKiBUMlAgWDIxIDIgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1Q0UCAgICAyICAgICAgICAgICAgICAgLyogVDRQIFgyMSA0IHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9UMVUgICAgMyAgICAgICAgICAgICAgIC8qIFQxVSBYMjEgMSBwb3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDJVICAgIDQgICAgICAgICAgICAgICAvKiBUMlUgWDIxIDIgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1Q0VSAgICA1ICAgICAgICAgICAgICAgLyogVDRVIFgyMSA0IHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9URTEgICAgNiAgICAgICAgICAgICAgIC8qIFQxRTEgWDIxIDEgcG9ydCBjYXJkICovCisKKy8qICJmYW1pbHkiICovCisjZGVmaW5lIEZTVF9GQU1JTFlfVFhQICAwICAgICAgICAgICAgICAgLyogVDJQIG9yIFQ0UCAqLworI2RlZmluZSBGU1RfRkFNSUxZX1RYVSAgMSAgICAgICAgICAgICAgIC8qIFQxVSBvciBUMlUgb3IgVDRVICovCisKKy8qICJzdGF0ZSIgKi8KKyNkZWZpbmUgRlNUX1VOSU5JVCAgICAgIDAgICAgICAgICAgICAgICAvKiBSYXcgdW5pbml0aWFsaXNlZCBzdGF0ZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzeXN0ZW0gc3RhcnR1cCAqLworI2RlZmluZSBGU1RfUkVTRVQgICAgICAgMSAgICAgICAgICAgICAgIC8qIFByb2Nlc3NvciBoZWxkIGluIHJlc2V0IHN0YXRlICovCisjZGVmaW5lIEZTVF9ET1dOTE9BRCAgICAyICAgICAgICAgICAgICAgLyogQ2FyZCBiZWluZyBkb3dubG9hZGVkICovCisjZGVmaW5lIEZTVF9TVEFSVElORyAgICAzICAgICAgICAgICAgICAgLyogUmVsZWFzZWQgZm9sbG93aW5nIGRvd25sb2FkICovCisjZGVmaW5lIEZTVF9SVU5OSU5HICAgICA0ICAgICAgICAgICAgICAgLyogUHJvY2Vzc29yIHJ1bm5pbmcgKi8KKyNkZWZpbmUgRlNUX0JBRFZFUlNJT04gIDUgICAgICAgICAgICAgICAvKiBCYWQgc2hhcmVkIG1lbW9yeSB2ZXJzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIEZTVF9IQUxURUQgICAgICA2ICAgICAgICAgICAgICAgLyogUHJvY2Vzc29yIGZsYWdnZWQgYSBoYWx0ICovCisjZGVmaW5lIEZTVF9JRkFJTEVEICAgICA3ICAgICAgICAgICAgICAgLyogRmlybXdhcmUgaXNzdWVkIGluaXRpYWxpc2F0aW9uIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogImxpbmVJbnRlcmZhY2UiICovCisjZGVmaW5lIFYyNCAgICAgICAgICAgICAxCisjZGVmaW5lIFgyMSAgICAgICAgICAgICAyCisjZGVmaW5lIFYzNSAgICAgICAgICAgICAzCisjZGVmaW5lIFgyMUQgICAgICAgICAgICA0CisjZGVmaW5lIFQxICAgICAgICAgICAgICA1CisjZGVmaW5lIEUxICAgICAgICAgICAgICA2CisjZGVmaW5lIEoxICAgICAgICAgICAgICA3CisKKy8qICJwcm90byIgKi8KKyNkZWZpbmUgRlNUX0hETEMgICAgICAgIDEgICAgICAgICAgICAgICAvKiBDaXNjbyBjb21wYXRpYmxlIEhETEMgKi8KKyNkZWZpbmUgRlNUX1BQUCAgICAgICAgIDIgICAgICAgICAgICAgICAvKiBTeW5jIFBQUCAqLworI2RlZmluZSBGU1RfTU9OSVRPUiAgICAgMyAgICAgICAgICAgICAgIC8qIE1vbml0b3Igb25seSAocmF3IHBhY2tldCByZWNlcHRpb24pICovCisjZGVmaW5lIEZTVF9SQVcgICAgICAgICA0ICAgICAgICAgICAgICAgLyogVHdvIHdheSByYXcgcGFja2V0cyAqLworI2RlZmluZSBGU1RfR0VOX0hETEMgICAgNSAgICAgICAgICAgICAgIC8qIFVzaW5nICJHZW5lcmljIEhETEMiIG1vZHVsZSAqLworCisvKiAiaW50ZXJuYWxDbG9jayIgKi8KKyNkZWZpbmUgSU5UQ0xLICAgICAgICAgIDEKKyNkZWZpbmUgRVhUQ0xLICAgICAgICAgIDAKKworLyogInYyNElwU3RzIiBiaXRtYXNrICovCisjZGVmaW5lIElQU1RTX0NUUyAgICAgICAweDAwMDAwMDAxICAgICAgLyogQ2xlYXIgVG8gU2VuZCAoSW5kaWNhdGUgZm9yIFguMjEpICovCisjZGVmaW5lIElQU1RTX0lORElDQVRFICBJUFNUU19DVFMKKyNkZWZpbmUgSVBTVFNfRFNSICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBEYXRhIFNldCBSZWFkeSAoVDJQIFBvcnQgQSkgKi8KKyNkZWZpbmUgSVBTVFNfRENEICAgICAgIDB4MDAwMDAwMDQgICAgICAvKiBEYXRhIENhcnJpZXIgRGV0ZWN0ICovCisjZGVmaW5lIElQU1RTX1JJICAgICAgICAweDAwMDAwMDA4ICAgICAgLyogUmluZyBJbmRpY2F0b3IgKFQyUCBQb3J0IEEpICovCisjZGVmaW5lIElQU1RTX1RNSSAgICAgICAweDAwMDAwMDEwICAgICAgLyogVGVzdCBNb2RlIEluZGljYXRvciAoTm90IFN1cHBvcnRlZCkqLworCisvKiAidjI0T3BTdHMiIGJpdG1hc2sgKi8KKyNkZWZpbmUgT1BTVFNfUlRTICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBSZXF1ZXN0IFRvIFNlbmQgKENvbnRyb2wgZm9yIFguMjEpICovCisjZGVmaW5lIE9QU1RTX0NPTlRST0wgICBPUFNUU19SVFMKKyNkZWZpbmUgT1BTVFNfRFRSICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisjZGVmaW5lIE9QU1RTX0RTUlMgICAgICAweDAwMDAwMDA0ICAgICAgLyogRGF0YSBTaWduYWxsaW5nIFJhdGUgU2VsZWN0IChOb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdXBwb3J0ZWQpICovCisjZGVmaW5lIE9QU1RTX1NTICAgICAgICAweDAwMDAwMDA4ICAgICAgLyogU2VsZWN0IFN0YW5kYnkgKE5vdCBTdXBwb3J0ZWQpICovCisjZGVmaW5lIE9QU1RTX0xMICAgICAgICAweDAwMDAwMDEwICAgICAgLyogTWFpbnRlbmFuY2UgVGVzdCAoTm90IFN1cHBvcnRlZCkgKi8KKworLyogImNhcmRNb2RlIiBiaXRtYXNrICovCisjZGVmaW5lIENBUkRfTU9ERV9JREVOVElGWSAgICAgIDB4MDAwMQorCisvKiAKKyAqIENvbnN0YW50cyBmb3IgVDEvRTEgY29uZmlndXJhdGlvbgorICovCisKKy8qCisgKiBDbG9jayBzb3VyY2UKKyAqLworI2RlZmluZSBDTE9DS0lOR19TTEFWRSAgICAgICAwCisjZGVmaW5lIENMT0NLSU5HX01BU1RFUiAgICAgIDEKKworLyoKKyAqIEZyYW1pbmcKKyAqLworI2RlZmluZSBGUkFNSU5HX0UxICAgICAgICAgICAwCisjZGVmaW5lIEZSQU1JTkdfSjEgICAgICAgICAgIDEKKyNkZWZpbmUgRlJBTUlOR19UMSAgICAgICAgICAgMgorCisvKgorICogU3RydWN0dXJlCisgKi8KKyNkZWZpbmUgU1RSVUNUVVJFX1VORlJBTUVEICAgMAorI2RlZmluZSBTVFJVQ1RVUkVfRTFfRE9VQkxFICAxCisjZGVmaW5lIFNUUlVDVFVSRV9FMV9DUkM0ICAgIDIKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0NSQzRNICAgMworI2RlZmluZSBTVFJVQ1RVUkVfVDFfNCAgICAgICA0CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8xMiAgICAgIDUKKyNkZWZpbmUgU1RSVUNUVVJFX1QxXzI0ICAgICAgNgorI2RlZmluZSBTVFJVQ1RVUkVfVDFfNzIgICAgICA3CisKKy8qCisgKiBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBJTlRFUkZBQ0VfUko0OEMgICAgICAwCisjZGVmaW5lIElOVEVSRkFDRV9CTkMgICAgICAgIDEKKworLyoKKyAqIENvZGluZworICovCisKKyNkZWZpbmUgQ09ESU5HX0hEQjMgICAgICAgICAgMAorI2RlZmluZSBDT0RJTkdfTlJaICAgICAgICAgICAxCisjZGVmaW5lIENPRElOR19DTUkgICAgICAgICAgIDIKKyNkZWZpbmUgQ09ESU5HX0NNSV9IREIzICAgICAgMworI2RlZmluZSBDT0RJTkdfQ01JX0I4WlMgICAgICA0CisjZGVmaW5lIENPRElOR19BTUkgICAgICAgICAgIDUKKyNkZWZpbmUgQ09ESU5HX0FNSV9aQ1MgICAgICAgNgorI2RlZmluZSBDT0RJTkdfQjhaUyAgICAgICAgICA3CisKKy8qCisgKiBMaW5lIEJ1aWxkIE91dAorICovCisjZGVmaW5lIExCT18wZEIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEJPXzdkQjUgICAgICAgICAgICAgMQorI2RlZmluZSBMQk9fMTVkQiAgICAgICAgICAgICAyCisjZGVmaW5lIExCT18yMmRCNSAgICAgICAgICAgIDMKKworLyoKKyAqIFJhbmdlIGZvciBsb25nIGhhdWwgdDEgPiA2NTVmdAorICovCisjZGVmaW5lIFJBTkdFXzBfMTMzX0ZUICAgICAgIDAKKyNkZWZpbmUgUkFOR0VfMF80MF9NICAgICAgICAgUkFOR0VfMF8xMzNfRlQKKyNkZWZpbmUgUkFOR0VfMTMzXzI2Nl9GVCAgICAgMQorI2RlZmluZSBSQU5HRV80MF84MV9NICAgICAgICBSQU5HRV8xMzNfMjY2X0ZUCisjZGVmaW5lIFJBTkdFXzI2Nl8zOTlfRlQgICAgIDIKKyNkZWZpbmUgUkFOR0VfODFfMTIyX00gICAgICAgUkFOR0VfMjY2XzM5OV9GVAorI2RlZmluZSBSQU5HRV8zOTlfNTMzX0ZUICAgICAzCisjZGVmaW5lIFJBTkdFXzEyMl8xNjJfTSAgICAgICBSQU5HRV8zOTlfNTMzX0ZUCisjZGVmaW5lIFJBTkdFXzUzM182NTVfRlQgICAgIDQKKyNkZWZpbmUgUkFOR0VfMTYyXzIwMF9NICAgICAgUkFOR0VfNTMzXzY1NV9GVAorLyoKKyAqIFJlY2VpdmUgRXF1YWxpc2VyCisgKi8KKyNkZWZpbmUgRVFVQUxJWkVSX1NIT1JUICAgICAgMAorI2RlZmluZSBFUVVBTElaRVJfTE9ORyAgICAgICAxCisKKy8qCisgKiBMb29wIG1vZGVzCisgKi8KKyNkZWZpbmUgTE9PUF9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBMT09QX0xPQ0FMICAgICAgICAgICAxCisjZGVmaW5lIExPT1BfUEFZTE9BRF9FWENfVFMwIDIKKyNkZWZpbmUgTE9PUF9QQVlMT0FEX0lOQ19UUzAgMworI2RlZmluZSBMT09QX1JFTU9URSAgICAgICAgICA0CisKKy8qCisgKiBCdWZmZXIgbW9kZXMKKyAqLworI2RlZmluZSBCVUZGRVJfMl9GUkFNRSAgICAgICAwCisjZGVmaW5lIEJVRkZFUl8xX0ZSQU1FICAgICAgIDEKKyNkZWZpbmUgQlVGRkVSXzk2X0JJVCAgICAgICAgMgorI2RlZmluZSBCVUZGRVJfTk9ORSAgICAgICAgICAzCisKKy8qICAgICAgRGVidWcgc3VwcG9ydAorICoKKyAqICAgICAgVGhlc2Ugc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBmb3IgZGV2ZWxvcG1lbnQga2VybmVscywgcHJvZHVjdGlvbiBjb2RlCisgKiAgICAgIHNob3VsZCBkZWZpbmUgRlNUX0RFQlVHPTAgaW4gb3JkZXIgdG8gZXhjbHVkZSB0aGUgY29kZS4KKyAqICAgICAgU2V0dGluZyBGU1RfREVCVUc9MSB3aWxsIGluY2x1ZGUgYWxsIHRoZSBkZWJ1ZyBjb2RlIGJ1dCBpbiBhIGRpc2FibGVkCisgKiAgICAgIHN0YXRlLCB1c2UgdGhlIEZTVFNFVENPTkYgaW9jdGwgdG8gZW5hYmxlIHNwZWNpZmljIGRlYnVnIGFjdGlvbnMsIG9yCisgKiAgICAgIEZTVF9ERUJVRyBjYW4gYmUgc2V0IHRvIHByaW1lIHRoZSBkZWJ1ZyBzZWxlY3Rpb24uCisgKi8KKyNkZWZpbmUgRlNUX0RFQlVHICAgICAgIDB4MDAwMAorI2lmIEZTVF9ERUJVRworCitleHRlcm4gaW50IGZzdF9kZWJ1Z19tYXNrOyAgICAgICAgICAgICAgLyogQml0IG1hc2sgb2YgYWN0aW9ucyB0byBkZWJ1ZywgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxpc3RlZCBiZWxvdy4gTm90ZTogQml0IDAgaXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHRyaWdnZXIgdGhlIGluY2x1c2lvbiBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29kZSwgd2l0aG91dCBlbmFibGluZyBhbnkgYWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX0lOSVQgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiBDYXJkIGRldGVjdGlvbiBhbmQgaW5pdGlhbGlzYXRpb24gKi8KKyNkZWZpbmUgREJHX09QRU4gICAgICAgIDB4MDAwNCAgICAgICAgICAvKiBPcGVuIGFuZCBjbG9zZSBzZXF1ZW5jZXMgKi8KKyNkZWZpbmUgREJHX1BDSSAgICAgICAgIDB4MDAwOCAgICAgICAgICAvKiBQQ0kgY29uZmlnIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgREJHX0lPQ1RMICAgICAgIDB4MDAxMCAgICAgICAgICAvKiBJb2N0bHMgYW5kIG90aGVyIGNvbmZpZyAqLworI2RlZmluZSBEQkdfSU5UUiAgICAgICAgMHgwMDIwICAgICAgICAgIC8qIEludGVycnVwdCByb3V0aW5lcyAoYmUgY2FyZWZ1bCkgKi8KKyNkZWZpbmUgREJHX1RYICAgICAgICAgIDB4MDA0MCAgICAgICAgICAvKiBQYWNrZXQgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIERCR19SWCAgICAgICAgICAweDAwODAgICAgICAgICAgLyogUGFja2V0IHJlY2VwdGlvbiAqLworI2RlZmluZSBEQkdfQ01EICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIFBvcnQgY29tbWFuZCBpc3N1aW5nICovCisKKyNkZWZpbmUgREJHX0FTUyAgICAgICAgIDB4RkZGRiAgICAgICAgICAvKiBBc3NlcnQgbGlrZSBzdGF0ZW1lbnRzLiBDb2RlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCwgaWYgeW91IHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uZSBvZiB0aGVzZSB0aGVuIEkndmUgYmVlbiBhbiBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgLyogRlNUX0RFQlVHICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcwLmggYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Mzk2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oCkBAIC0wLDAgKzEsMjQxIEBACisjaWZuZGVmIF9fSEQ2NDU3MF9ICisjZGVmaW5lIF9fSEQ2NDU3MF9ICisKKy8qIFNDQSBIRDY0NTcwIHJlZ2lzdGVyIGRlZmluaXRpb25zIC0gYWxsIGFkZHJlc3NlcyBmb3IgbW9kZSAwICg4MDg2IE1QVSkKKyAgIGFuZCAxICg2NDE4MCBNUFUpLiBGb3IgbW9kZXMgMiBhbmQgMywgWE9SIHRoZSBhZGRyZXNzIHdpdGggMHgwMS4KKworICAgU291cmNlOiBIRDY0NTcwIFNDQSBVc2VyJ3MgTWFudWFsCisqLworCisKKworLyogU0NBIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIExQUiAgICAweDAwCQkvKiBMb3cgUG93ZXIgKi8KKworLyogV2FpdCBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQUJSMCAgMHgwMgkJLyogUGh5c2ljYWwgQWRkcmVzcyBCb3VuZGFyeSAwICovCisjZGVmaW5lIFBBQlIxICAweDAzCQkvKiBQaHlzaWNhbCBBZGRyZXNzIEJvdW5kYXJ5IDEgKi8KKyNkZWZpbmUgV0NSTCAgIDB4MDQJCS8qIFdhaXQgQ29udHJvbCBMICovCisjZGVmaW5lIFdDUk0gICAweDA1CQkvKiBXYWl0IENvbnRyb2wgTSAqLworI2RlZmluZSBXQ1JIICAgMHgwNgkJLyogV2FpdCBDb250cm9sIEggKi8KKworI2RlZmluZSBQQ1IgICAgMHgwOAkJLyogRE1BIFByaW9yaXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgRE1FUiAgIDB4MDkJCS8qIERNQSBNYXN0ZXIgRW5hYmxlICovCisKKworLyogSW50ZXJydXB0IHJlZ2lzdGVycyAqLworI2RlZmluZSBJU1IwICAgMHgxMAkJLyogSW50ZXJydXB0IFN0YXR1cyAwICAqLworI2RlZmluZSBJU1IxICAgMHgxMQkJLyogSW50ZXJydXB0IFN0YXR1cyAxICAqLworI2RlZmluZSBJU1IyICAgMHgxMgkJLyogSW50ZXJydXB0IFN0YXR1cyAyICAqLworCisjZGVmaW5lIElFUjAgICAweDE0CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDAgICovCisjZGVmaW5lIElFUjEgICAweDE1CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDEgICovCisjZGVmaW5lIElFUjIgICAweDE2CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDIgICovCisKKyNkZWZpbmUgSVRDUiAgIDB4MTgJCS8qIEludGVycnVwdCBDb250cm9sICovCisjZGVmaW5lIElWUiAgICAweDFBCQkvKiBJbnRlcnJ1cHQgVmVjdG9yICovCisjZGVmaW5lIElNVlIgICAweDFDCQkvKiBJbnRlcnJ1cHQgTW9kaWZpZWQgVmVjdG9yICovCisKKworCisvKiBNU0NJIGNoYW5uZWwgKHBvcnQpIDAgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4MjAKKyAgIE1TQ0kgY2hhbm5lbCAocG9ydCkgMSByZWdpc3RlcnMgLSBvZmZzZXQgMHg0MCAqLworCisjZGVmaW5lIE1TQ0kwX09GRlNFVCAweDIwCisjZGVmaW5lIE1TQ0kxX09GRlNFVCAweDQwCisKKyNkZWZpbmUgVFJCTCAgIDB4MDAJCS8qIFRYL1JYIGJ1ZmZlciBMICovIAorI2RlZmluZSBUUkJIICAgMHgwMQkJLyogVFgvUlggYnVmZmVyIEggKi8gCisjZGVmaW5lIFNUMCAgICAweDAyCQkvKiBTdGF0dXMgMCAqLworI2RlZmluZSBTVDEgICAgMHgwMwkJLyogU3RhdHVzIDEgKi8KKyNkZWZpbmUgU1QyICAgIDB4MDQJCS8qIFN0YXR1cyAyICovCisjZGVmaW5lIFNUMyAgICAweDA1CQkvKiBTdGF0dXMgMyAqLworI2RlZmluZSBGU1QgICAgMHgwNgkJLyogRnJhbWUgU3RhdHVzICAqLworI2RlZmluZSBJRTAgICAgMHgwOAkJLyogSW50ZXJydXB0IEVuYWJsZSAwICovCisjZGVmaW5lIElFMSAgICAweDA5CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDEgKi8KKyNkZWZpbmUgSUUyICAgIDB4MEEJCS8qIEludGVycnVwdCBFbmFibGUgMiAqLworI2RlZmluZSBGSUUgICAgMHgwQgkJLyogRnJhbWUgSW50ZXJydXB0IEVuYWJsZSAgKi8KKyNkZWZpbmUgQ01EICAgIDB4MEMJCS8qIENvbW1hbmQgKi8KKyNkZWZpbmUgTUQwICAgIDB4MEUJCS8qIE1vZGUgMCAqLworI2RlZmluZSBNRDEgICAgMHgwRgkJLyogTW9kZSAxICovCisjZGVmaW5lIE1EMiAgICAweDEwCQkvKiBNb2RlIDIgKi8KKyNkZWZpbmUgQ1RMICAgIDB4MTEJCS8qIENvbnRyb2wgKi8KKyNkZWZpbmUgU0EwICAgIDB4MTIJCS8qIFN5bmMvQWRkcmVzcyAwICovCisjZGVmaW5lIFNBMSAgICAweDEzCQkvKiBTeW5jL0FkZHJlc3MgMSAqLworI2RlZmluZSBJREwgICAgMHgxNAkJLyogSWRsZSBQYXR0ZXJuICovCisjZGVmaW5lIFRNQyAgICAweDE1CQkvKiBUaW1lIENvbnN0YW50ICovCisjZGVmaW5lIFJYUyAgICAweDE2CQkvKiBSWCBDbG9jayBTb3VyY2UgKi8KKyNkZWZpbmUgVFhTICAgIDB4MTcJCS8qIFRYIENsb2NrIFNvdXJjZSAqLworI2RlZmluZSBUUkMwICAgMHgxOAkJLyogVFggUmVhZHkgQ29udHJvbCAwICovIAorI2RlZmluZSBUUkMxICAgMHgxOQkJLyogVFggUmVhZHkgQ29udHJvbCAxICovIAorI2RlZmluZSBSUkMgICAgMHgxQQkJLyogUlggUmVhZHkgQ29udHJvbCAqLyAKKyNkZWZpbmUgQ1NUMCAgIDB4MUMJCS8qIEN1cnJlbnQgU3RhdHVzIDAgKi8KKyNkZWZpbmUgQ1NUMSAgIDB4MUQJCS8qIEN1cnJlbnQgU3RhdHVzIDEgKi8KKworCisvKiBUaW1lciBjaGFubmVsIDAgKHBvcnQgMCBSWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NjAKKyAgIFRpbWVyIGNoYW5uZWwgMSAocG9ydCAwIFRYKSByZWdpc3RlcnMgLSBvZmZzZXQgMHg2OAorICAgVGltZXIgY2hhbm5lbCAyIChwb3J0IDEgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDcwCisgICBUaW1lciBjaGFubmVsIDMgKHBvcnQgMSBUWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NzgKKyovCisKKyNkZWZpbmUgVElNRVIwUlhfT0ZGU0VUIDB4NjAKKyNkZWZpbmUgVElNRVIwVFhfT0ZGU0VUIDB4NjgKKyNkZWZpbmUgVElNRVIxUlhfT0ZGU0VUIDB4NzAKKyNkZWZpbmUgVElNRVIxVFhfT0ZGU0VUIDB4NzgKKworI2RlZmluZSBUQ05UTCAgMHgwMAkJLyogVXAtY291bnRlciBMICovCisjZGVmaW5lIFRDTlRIICAweDAxCQkvKiBVcC1jb3VudGVyIEggKi8KKyNkZWZpbmUgVENPTlJMIDB4MDIJCS8qIENvbnN0YW50IEwgKi8KKyNkZWZpbmUgVENPTlJIIDB4MDMJCS8qIENvbnN0YW50IEggKi8KKyNkZWZpbmUgVENTUiAgIDB4MDQJCS8qIENvbnRyb2wvU3RhdHVzICovCisjZGVmaW5lIFRFUFIgICAweDA1CQkvKiBFeHBhbmQgUHJlc2NhbGUgKi8KKworCisKKy8qIERNQSBjaGFubmVsIDAgKHBvcnQgMCBSWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4ODAKKyAgIERNQSBjaGFubmVsIDEgKHBvcnQgMCBUWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4QTAKKyAgIERNQSBjaGFubmVsIDIgKHBvcnQgMSBSWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4QzAKKyAgIERNQSBjaGFubmVsIDMgKHBvcnQgMSBUWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4RTAKKyovCisKKyNkZWZpbmUgRE1BQzBSWF9PRkZTRVQgMHg4MAorI2RlZmluZSBETUFDMFRYX09GRlNFVCAweEEwCisjZGVmaW5lIERNQUMxUlhfT0ZGU0VUIDB4QzAKKyNkZWZpbmUgRE1BQzFUWF9PRkZTRVQgMHhFMAorCisjZGVmaW5lIEJBUkwgICAweDAwCQkvKiBCdWZmZXIgQWRkcmVzcyBMIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBCQVJIICAgMHgwMQkJLyogQnVmZmVyIEFkZHJlc3MgSCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgQkFSQiAgIDB4MDIJCS8qIEJ1ZmZlciBBZGRyZXNzIEIgKGNoYWluZWQgYmxvY2spICovCisKKyNkZWZpbmUgREFSTCAgIDB4MDAJCS8qIFJYIERlc3RpbmF0aW9uIEFkZHIgTCAoc2luZ2xlIGJsb2NrKSAqLworI2RlZmluZSBEQVJIICAgMHgwMQkJLyogUlggRGVzdGluYXRpb24gQWRkciBIIChzaW5nbGUgYmxvY2spICovCisjZGVmaW5lIERBUkIgICAweDAyCQkvKiBSWCBEZXN0aW5hdGlvbiBBZGRyIEIgKHNpbmdsZSBibG9jaykgKi8KKworI2RlZmluZSBTQVJMICAgMHgwNAkJLyogVFggU291cmNlIEFkZHJlc3MgTCAoc2luZ2xlIGJsb2NrKSAqLworI2RlZmluZSBTQVJIICAgMHgwNQkJLyogVFggU291cmNlIEFkZHJlc3MgSCAoc2luZ2xlIGJsb2NrKSAqLworI2RlZmluZSBTQVJCICAgMHgwNgkJLyogVFggU291cmNlIEFkZHJlc3MgQiAoc2luZ2xlIGJsb2NrKSAqLworCisjZGVmaW5lIENQQiAgICAweDA2CQkvKiBDaGFpbiBQb2ludGVyIEJhc2UgKGNoYWluZWQgYmxvY2spICovCisKKyNkZWZpbmUgQ0RBTCAgIDB4MDgJCS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIEwgKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIENEQUggICAweDA5CQkvKiBDdXJyZW50IERlc2NyaXB0b3IgQWRkciBIIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBFREFMICAgMHgwQQkJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIEwgKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIEVEQUggICAweDBCCQkvKiBFcnJvciBEZXNjcmlwdG9yIEFkZHIgSCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgQkZMTCAgIDB4MEMJCS8qIFJYIFJlY2VpdmUgQnVmZmVyIExlbmd0aCBMIChjaGFpbmVkIGJsb2NrKSovCisjZGVmaW5lIEJGTEggICAweDBECQkvKiBSWCBSZWNlaXZlIEJ1ZmZlciBMZW5ndGggSCAoY2hhaW5lZCBibG9jaykqLworI2RlZmluZSBCQ1JMICAgMHgwRQkJLyogQnl0ZSBDb3VudCBMICovCisjZGVmaW5lIEJDUkggICAweDBGCQkvKiBCeXRlIENvdW50IEggKi8KKyNkZWZpbmUgRFNSICAgIDB4MTAJCS8qIERNQSBTdGF0dXMgKi8KKyNkZWZpbmUgRFNSX1JYKG5vZGUpIChEU1IgKyAobm9kZSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpKQorI2RlZmluZSBEU1JfVFgobm9kZSkgKERTUiArIChub2RlID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkpCisjZGVmaW5lIERNUiAgICAweDExCQkvKiBETUEgTW9kZSAqLworI2RlZmluZSBETVJfUlgobm9kZSkgKERNUiArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIERNUl9UWChub2RlKSAoRE1SICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKyNkZWZpbmUgRkNUICAgIDB4MTMJCS8qIEZyYW1lIEVuZCBJbnRlcnJ1cHQgQ291bnRlciAqLworI2RlZmluZSBGQ1RfUlgobm9kZSkgKEZDVCArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIEZDVF9UWChub2RlKSAoRkNUICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKyNkZWZpbmUgRElSICAgIDB4MTQJCS8qIERNQSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIERJUl9SWChub2RlKSAoRElSICsgKG5vZGUgPyBETUFDMVJYX09GRlNFVCA6IERNQUMwUlhfT0ZGU0VUKSkKKyNkZWZpbmUgRElSX1RYKG5vZGUpIChESVIgKyAobm9kZSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpKQorI2RlZmluZSBEQ1IgICAgMHgxNQkJLyogRE1BIENvbW1hbmQgICovCisjZGVmaW5lIERDUl9SWChub2RlKSAoRENSICsgKG5vZGUgPyBETUFDMVJYX09GRlNFVCA6IERNQUMwUlhfT0ZGU0VUKSkKKyNkZWZpbmUgRENSX1RYKG5vZGUpIChEQ1IgKyAobm9kZSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpKQorCisKKworCisvKiBEZXNjcmlwdG9yIFN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGNwOwkJCS8qIENoYWluIFBvaW50ZXIgKi8KKwl1MzIgYnA7CQkJLyogQnVmZmVyIFBvaW50ZXIgKDI0IGJpdHMpICovCisJdTE2IGxlbjsJCS8qIERhdGEgTGVuZ3RoICovCisJdTggc3RhdDsJCS8qIFN0YXR1cyAqLworCXU4IHVudXNlZDsJCS8qIHBhZHMgdG8gMi1ieXRlIGJvdW5kYXJ5ICovCit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBrdF9kZXNjOworCisKKy8qIFBhY2tldCBEZXNjcmlwdG9yIFN0YXR1cyBiaXRzICovCisKKyNkZWZpbmUgU1RfVFhfRU9NICAgICAweDgwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTVF9UWF9FT1QgICAgIDB4MDEJLyogRW5kIG9mIHRyYW5zbWl0aW9uICovCisKKyNkZWZpbmUgU1RfUlhfRU9NICAgICAweDgwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTVF9SWF9TSE9SVCAgIDB4NDAJLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgU1RfUlhfQUJPUlQgICAweDIwCS8qIEFib3J0ICovCisjZGVmaW5lIFNUX1JYX1JFU0JJVCAgMHgxMAkvKiBSZXNpZHVhbCBiaXQgKi8KKyNkZWZpbmUgU1RfUlhfT1ZFUlJVTiAweDA4CS8qIE92ZXJydW4gKi8KKyNkZWZpbmUgU1RfUlhfQ1JDICAgICAweDA0CS8qIENSQyAqLworCisjZGVmaW5lIFNUX0VSUk9SX01BU0sgMHg3QworCisjZGVmaW5lIERJUl9FT1RFICAgICAgMHg4MCAgICAgIC8qIFRyYW5zZmVyIGNvbXBsZXRlZCAqLworI2RlZmluZSBESVJfRU9NRSAgICAgIDB4NDAgICAgICAvKiBGcmFtZSBUcmFuc2ZlciBDb21wbGV0ZWQgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIERJUl9CT0ZFICAgICAgMHgyMCAgICAgIC8qIEJ1ZmZlciBPdmVyZmxvdy9VbmRlcmZsb3cgKGNoYWluZWQtYmxvY2spKi8KKyNkZWZpbmUgRElSX0NPRkUgICAgICAweDEwICAgICAgLyogQ291bnRlciBPdmVyZmxvdyAoY2hhaW5lZC1ibG9jaykgKi8KKworCisjZGVmaW5lIERTUl9FT1QgICAgICAgMHg4MCAgICAgIC8qIFRyYW5zZmVyIGNvbXBsZXRlZCAqLworI2RlZmluZSBEU1JfRU9NICAgICAgIDB4NDAgICAgICAvKiBGcmFtZSBUcmFuc2ZlciBDb21wbGV0ZWQgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIERTUl9CT0YgICAgICAgMHgyMCAgICAgIC8qIEJ1ZmZlciBPdmVyZmxvdy9VbmRlcmZsb3cgKGNoYWluZWQtYmxvY2spKi8KKyNkZWZpbmUgRFNSX0NPRiAgICAgICAweDEwICAgICAgLyogQ291bnRlciBPdmVyZmxvdyAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgRFNSX0RFICAgICAgICAweDAyCS8qIERNQSBFbmFibGUgKi8KKyNkZWZpbmUgRFNSX0RXRSAgICAgICAweDAxICAgICAgLyogRE1BIFdyaXRlIERpc2FibGUgKi8KKworLyogRE1BIE1hc3RlciBFbmFibGUgUmVnaXN0ZXIgKERNRVIpIGJpdHMgKi8KKyNkZWZpbmUgRE1FUl9ETUUgICAgICAweDgwCS8qIERNQSBNYXN0ZXIgRW5hYmxlICovCisKKworI2RlZmluZSBDTURfUkVTRVQgICAgIDB4MjEJLyogUmVzZXQgQ2hhbm5lbCAqLworI2RlZmluZSBDTURfVFhfRU5BQkxFIDB4MDIJLyogU3RhcnQgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgQ01EX1JYX0VOQUJMRSAweDEyCS8qIFN0YXJ0IHJlY2VpdmVyICovCisKKyNkZWZpbmUgTUQwX0hETEMgICAgICAweDgwCS8qIEJpdC1zeW5jIEhETEMgbW9kZSAqLworI2RlZmluZSBNRDBfQ1JDX0VOQSAgIDB4MDQJLyogRW5hYmxlIENSQyBjb2RlIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIE1EMF9DUkNfQ0NJVFQgMHgwMgkvKiBDQ0lUVCBDUkMgaW5zdGVhZCBvZiBDUkMtMTYgKi8KKyNkZWZpbmUgTUQwX0NSQ19QUjEgICAweDAxCS8qIEluaXRpYWwgYWxsLW9uZXMgaW5zdGVhZCBvZiBhbGwtemVyb3MgKi8KKworI2RlZmluZSBNRDBfQ1JDX05PTkUgIDB4MDAKKyNkZWZpbmUgTUQwX0NSQ18xNl8wICAweDA0CisjZGVmaW5lIE1EMF9DUkNfMTYgICAgMHgwNQorI2RlZmluZSBNRDBfQ1JDX0lUVV8wIDB4MDYKKyNkZWZpbmUgTUQwX0NSQ19JVFUgICAweDA3CisKKyNkZWZpbmUgTUQyX05SWgkgICAgICAweDAwCisjZGVmaW5lIE1EMl9OUlpJICAgICAgMHgyMAorI2RlZmluZSBNRDJfTUFOQ0hFU1RFUiAweDgwCisjZGVmaW5lIE1EMl9GTV9NQVJLICAgMHhBMAorI2RlZmluZSBNRDJfRk1fU1BBQ0UgIDB4QzAKKyNkZWZpbmUgTUQyX0xPT1BCQUNLICAweDAzICAgICAgLyogTG9jYWwgZGF0YSBMb29wYmFjayAqLworCisjZGVmaW5lIENUTF9OT1JUUyAgICAgMHgwMQorI2RlZmluZSBDVExfSURMRSAgICAgIDB4MTAJLyogVHJhbnNtaXQgYW4gaWRsZSBwYXR0ZXJuICovCisjZGVmaW5lIENUTF9VRFJOQyAgICAgMHgyMAkvKiBJZGxlIGFmdGVyIENSQyBvciBGQ1MrZmxhZyB0cmFuc21pdGlvbiAqLworCisjZGVmaW5lIFNUMF9UWFJEWSAgICAgMHgwMgkvKiBUWCByZWFkeSAqLworI2RlZmluZSBTVDBfUlhSRFkgICAgIDB4MDEJLyogUlggcmVhZHkgKi8KKworI2RlZmluZSBTVDFfVURSTiAgICAgIDB4ODAJLyogTVNDSSBUWCB1bmRlcnJ1biAqLworI2RlZmluZSBTVDFfQ0RDRCAgICAgIDB4MDQJLyogRENEIGxldmVsIGNoYW5nZWQgKi8KKworI2RlZmluZSBTVDNfQ1RTICAgICAgIDB4MDgJLyogbW9kZW0gaW5wdXQgLSAvQ1RTICovCisjZGVmaW5lIFNUM19EQ0QgICAgICAgMHgwNAkvKiBtb2RlbSBpbnB1dCAtIC9EQ0QgKi8KKworI2RlZmluZSBJRTBfVFhJTlQgICAgIDB4ODAJLyogVFggSU5UIE1TQ0kgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJRTBfUlhJTlRBICAgIDB4NDAJLyogUlggSU5UIEEgTVNDSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFMV9VRFJOICAgICAgMHg4MAkvKiBUWCB1bmRlcnJ1biBNU0NJIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUUxX0NEQ0QgICAgICAweDA0CS8qIERDRCBsZXZlbCBjaGFuZ2VkICovCisKKyNkZWZpbmUgRENSX0FCT1JUICAgICAweDAxCS8qIFNvZnR3YXJlIGFib3J0IGNvbW1hbmQgKi8KKyNkZWZpbmUgRENSX0NMRUFSX0VPRiAweDAyCS8qIENsZWFyIEVPRiBpbnRlcnJ1cHQgKi8KKworLyogVFggYW5kIFJYIENsb2NrIFNvdXJjZSAtIFJYUyBhbmQgVFhTICovCisjZGVmaW5lIENMS19CUkdfTUFTSyAgMHgwRgorI2RlZmluZSBDTEtfTElORV9SWCAgIDB4MDAJLyogVFgvUlggY2xvY2sgbGluZSBpbnB1dCAqLworI2RlZmluZSBDTEtfTElORV9UWCAgIDB4MDAJLyogVFgvUlggbGluZSBpbnB1dCAqLworI2RlZmluZSBDTEtfQlJHX1JYICAgIDB4NDAJLyogaW50ZXJuYWwgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworI2RlZmluZSBDTEtfQlJHX1RYICAgIDB4NDAJLyogaW50ZXJuYWwgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworI2RlZmluZSBDTEtfUlhDTEtfVFggIDB4NjAJLyogVFggY2xvY2sgZnJvbSBSWCBjbG9jayAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcyLmggYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTY3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3Mi5oCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogaGQ2NDU3Mi5oCURlc2NyaXB0aW9uIG9mIHRoZSBIaXRhY2hpIEhENjQ1NzIgKFNDQS1JSSksIHZhbGlkIGZvciAKKyAqIAkJQ1BVIG1vZGVzIDAgJiAyLgorICoKKyAqIEF1dGhvcjoJSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPgorICoKKyAqIENvcHlyaWdodDogICAoYykgMjAwMC0yMDAxIEN5Y2xhZGVzIENvcnAuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAkTG9nOiBoZDY0NTcyLmgsdiAkCisgKiBSZXZpc2lvbiAzLjEgIDIwMDEvMDYvMTUgMTI6NDE6MTAgIHJlZ2luYQorICogdXBwaW5nIG1ham9yIHZlcnNpb24gbnVtYmVyCisgKgorICogUmV2aXNpb24gMS4xLjEuMSAgMjAwMS8wNi8xMyAyMDoyNDo0OSAgZGFuaWVsYQorICogUEMzMDAgaW5pdGlhbCBDVlMgdmVyc2lvbiAoMy40LjAtcHJlMSkKKyAqCisgKiBSZXZpc2lvbiAxLjAgMjAwMC8wMS8yNSBpdmFuCisgKiBJbml0aWFsIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19IRDY0NTcyX0gKKyNkZWZpbmUgX19IRDY0NTcyX0gKKworLyogSWxsZWdhbCBBY2Nlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSUxBUgkweDAwCisKKy8qIFdhaXQgQ29udHJvbGxlciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEFCUjBMCTB4MjAJLyogUGh5c2ljYWwgQWRkciBCb3VuZGFyeSBSZWdpc3RlciAwIEwgKi8KKyNkZWZpbmUgUEFCUjBICTB4MjEJLyogUGh5c2ljYWwgQWRkciBCb3VuZGFyeSBSZWdpc3RlciAwIEggKi8KKyNkZWZpbmUgUEFCUjFMCTB4MjIJLyogUGh5c2ljYWwgQWRkciBCb3VuZGFyeSBSZWdpc3RlciAxIEwgKi8KKyNkZWZpbmUgUEFCUjFICTB4MjMJLyogUGh5c2ljYWwgQWRkciBCb3VuZGFyeSBSZWdpc3RlciAxIEggKi8KKyNkZWZpbmUgV0NSTAkweDI0CS8qIFdhaXQgQ29udHJvbCBSZWdpc3RlciBMICovCisjZGVmaW5lIFdDUk0JMHgyNQkvKiBXYWl0IENvbnRyb2wgUmVnaXN0ZXIgTSAqLworI2RlZmluZSBXQ1JICTB4MjYJLyogV2FpdCBDb250cm9sIFJlZ2lzdGVyIEggKi8KKworLyogSW50ZXJydXB0IFJlZ2lzdGVycyAqLworI2RlZmluZSBJVlIJMHg2MAkvKiBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIElNVlIJMHg2NAkvKiBJbnRlcnJ1cHQgTW9kaWZpZWQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIElUQ1IJMHg2OAkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBJU1IwCTB4NmMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAwICovCisjZGVmaW5lIElTUjEJMHg3MAkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgSUVSMAkweDc0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBJRVIxCTB4NzgJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAxICovCisKKy8qIFJlZ2lzdGVyIEFjY2VzcyBNYWNyb3MgKGNoYW4gaXMgMCBvciAxIGluIF9hbnlfIGNhc2UpICovCisjZGVmaW5lCU1fUkVHKHJlZywgY2hhbikJKHJlZyArIDB4ODAqY2hhbikJCS8qIE1TQ0kgKi8KKyNkZWZpbmUJRFJYX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDQwKmNoYW4pCQkvKiBETUEgUnggKi8KKyNkZWZpbmUJRFRYX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDIwKigyKmNoYW4gKyAxKSkJLyogRE1BIFR4ICovCisjZGVmaW5lCVRSWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHgyMCpjaGFuKQkJLyogVGltZXIgUnggKi8KKyNkZWZpbmUJVFRYX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDEwKigyKmNoYW4gKyAxKSkJLyogVGltZXIgVHggKi8KKyNkZWZpbmUJU1RfUkVHKHJlZywgY2hhbikJKHJlZyArIDB4ODAqY2hhbikJCS8qIFN0YXR1cyBDbnQgKi8KKyNkZWZpbmUgSVIwX0RSWCh2YWwsIGNoYW4pCSgodmFsKTw8KDgqKGNoYW4pKSkJCS8qIEludCBETUEgUnggKi8KKyNkZWZpbmUgSVIwX0RUWCh2YWwsIGNoYW4pCSgodmFsKTw8KDQqKDIqY2hhbiArIDEpKSkJLyogSW50IERNQSBUeCAqLworI2RlZmluZSBJUjBfTSh2YWwsIGNoYW4pCSgodmFsKTw8KDgqKGNoYW4pKSkJCS8qIEludCBNU0NJICovCisKKy8qIE1TQ0kgQ2hhbm5lbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVNDSTBfT0ZGU0VUIDB4MDAKKyNkZWZpbmUgTVNDSTFfT0ZGU0VUIDB4ODAKKworI2RlZmluZSBNRDAJMHgxMzgJLyogTW9kZSByZWcgMCAqLworI2RlZmluZSBNRDEJMHgxMzkJLyogTW9kZSByZWcgMSAqLworI2RlZmluZSBNRDIJMHgxM2EJLyogTW9kZSByZWcgMiAqLworI2RlZmluZSBNRDMJMHgxM2IJLyogTW9kZSByZWcgMyAqLworI2RlZmluZSBDVEwJMHgxMzAJLyogQ29udHJvbCByZWcgKi8KKyNkZWZpbmUgUlhTCTB4MTNjCS8qIFJYIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBUWFMJMHgxM2QJLyogVFggY2xvY2sgc291cmNlICovCisjZGVmaW5lIEVYUwkweDEzZQkvKiBFeHRlcm5hbCBjbG9jayBpbnB1dCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgVE1DVAkweDE0NAkvKiBUaW1lIGNvbnN0YW50IChUeCkgKi8KKyNkZWZpbmUgVE1DUgkweDE0NQkvKiBUaW1lIGNvbnN0YW50IChSeCkgKi8KKyNkZWZpbmUgQ01ECTB4MTI4CS8qIENvbW1hbmQgcmVnICovCisjZGVmaW5lIFNUMAkweDExOAkvKiBTdGF0dXMgcmVnIDAgKi8KKyNkZWZpbmUgU1QxCTB4MTE5CS8qIFN0YXR1cyByZWcgMSAqLworI2RlZmluZSBTVDIJMHgxMWEJLyogU3RhdHVzIHJlZyAyICovCisjZGVmaW5lIFNUMwkweDExYgkvKiBTdGF0dXMgcmVnIDMgKi8KKyNkZWZpbmUgU1Q0CTB4MTFjCS8qIFN0YXR1cyByZWcgNCAqLworI2RlZmluZSBGU1QJMHgxMWQJLyogZnJhbWUgU3RhdHVzIHJlZyAgKi8KKyNkZWZpbmUgSUUwCTB4MTIwCS8qIEludGVycnVwdCBlbmFibGUgcmVnIDAgKi8KKyNkZWZpbmUgSUUxCTB4MTIxCS8qIEludGVycnVwdCBlbmFibGUgcmVnIDEgKi8KKyNkZWZpbmUgSUUyCTB4MTIyCS8qIEludGVycnVwdCBlbmFibGUgcmVnIDIgKi8KKyNkZWZpbmUgSUU0CTB4MTI0CS8qIEludGVycnVwdCBlbmFibGUgcmVnIDQgKi8KKyNkZWZpbmUgRklFCTB4MTI1CS8qIEZyYW1lIEludGVycnVwdCBlbmFibGUgcmVnICAqLworI2RlZmluZSBTQTAJMHgxNDAJLyogU3luIEFkZHJlc3MgcmVnIDAgKi8KKyNkZWZpbmUgU0ExCTB4MTQxCS8qIFN5biBBZGRyZXNzIHJlZyAxICovCisjZGVmaW5lIElETAkweDE0MgkvKiBJZGxlIHJlZ2lzdGVyICovCisjZGVmaW5lIFRSQkwJMHgxMDAJLyogVFgvUlggYnVmZmVyIHJlZyBMICovIAorI2RlZmluZSBUUkJLCTB4MTAxCS8qIFRYL1JYIGJ1ZmZlciByZWcgSyAqLyAKKyNkZWZpbmUgVFJCSgkweDEwMgkvKiBUWC9SWCBidWZmZXIgcmVnIEogKi8gCisjZGVmaW5lIFRSQkgJMHgxMDMJLyogVFgvUlggYnVmZmVyIHJlZyBIICovIAorI2RlZmluZSBUUkMwCTB4MTQ4CS8qIFRYIFJlYWR5IGNvbnRyb2wgcmVnIDAgKi8gCisjZGVmaW5lIFRSQzEJMHgxNDkJLyogVFggUmVhZHkgY29udHJvbCByZWcgMSAqLyAKKyNkZWZpbmUgUlJDCTB4MTRhCS8qIFJYIFJlYWR5IGNvbnRyb2wgcmVnICovIAorI2RlZmluZSBDU1QwCTB4MTA4CS8qIEN1cnJlbnQgU3RhdHVzIFJlZ2lzdGVyIDAgKi8gCisjZGVmaW5lIENTVDEJMHgxMDkJLyogQ3VycmVudCBTdGF0dXMgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgQ1NUMgkweDEwYQkvKiBDdXJyZW50IFN0YXR1cyBSZWdpc3RlciAyICovIAorI2RlZmluZSBDU1QzCTB4MTBiCS8qIEN1cnJlbnQgU3RhdHVzIFJlZ2lzdGVyIDMgKi8gCisjZGVmaW5lIEdQTwkweDEzMQkvKiBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0IFBpbiBDdGwgUmVnICovCisjZGVmaW5lIFRGUwkweDE0YgkvKiBUeCBTdGFydCBUaHJlc2hvbGQgQ3RsIFJlZyAqLworI2RlZmluZSBURk4JMHgxNDMJLyogSW50ZXItdHJhbnNtaXQtZnJhbWUgVGltZSBGaWxsIEN0bCBSZWcgKi8KKyNkZWZpbmUgVEJOCTB4MTEwCS8qIFR4IEJ1ZmZlciBOdW1iZXIgUmVnICovCisjZGVmaW5lIFJCTgkweDExMQkvKiBSeCBCdWZmZXIgTnVtYmVyIFJlZyAqLworI2RlZmluZSBUTlIwCTB4MTUwCS8qIFR4IERNQSBSZXF1ZXN0IEN0bCBSZWcgMCAqLworI2RlZmluZSBUTlIxCTB4MTUxCS8qIFR4IERNQSBSZXF1ZXN0IEN0bCBSZWcgMSAqLworI2RlZmluZSBUQ1IJMHgxNTIJLyogVHggRE1BIENyaXRpY2FsIFJlcXVlc3QgUmVnICovCisjZGVmaW5lIFJOUgkweDE1NAkvKiBSeCBETUEgUmVxdWVzdCBDdGwgUmVnICovCisjZGVmaW5lIFJDUgkweDE1NgkvKiBSeCBETUEgQ3JpdGljYWwgUmVxdWVzdCBSZWcgKi8KKworLyogVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTUVSMFJYX09GRlNFVCAweDAwCisjZGVmaW5lIFRJTUVSMFRYX09GRlNFVCAweDEwCisjZGVmaW5lIFRJTUVSMVJYX09GRlNFVCAweDIwCisjZGVmaW5lIFRJTUVSMVRYX09GRlNFVCAweDMwCisKKyNkZWZpbmUgVENOVEwJMHgyMDAJLyogVGltZXIgVXBjb3VudGVyIEwgKi8KKyNkZWZpbmUgVENOVEgJMHgyMDEJLyogVGltZXIgVXBjb3VudGVyIEggKi8KKyNkZWZpbmUgVENPTlJMCTB4MjA0CS8qIFRpbWVyIENvbnN0YW50IFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgVENPTlJICTB4MjA1CS8qIFRpbWVyIENvbnN0YW50IFJlZ2lzdGVyIEggKi8KKyNkZWZpbmUgVENTUgkweDIwNgkvKiBUaW1lciBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBURVBSCTB4MjA3CS8qIFRpbWVyIEV4cGFuZCBQcmVzY2FsZSBSZWdpc3RlciAqLworCisvKiBETUEgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDUgkJMHg0MAkJLyogRE1BIHByaW9yaXR5IGNvbnRyb2wgcmVnICovCisjZGVmaW5lIERSUgkJMHg0NAkJLyogRE1BIHJlc2V0IHJlZyAqLworI2RlZmluZSBETUVSCQkweDA3CQkvKiBETUEgTWFzdGVyIEVuYWJsZSByZWcgKi8KKyNkZWZpbmUgQlRDUgkJMHgwOAkJLyogQnVyc3QgVHggQ3RsIFJlZyAqLworI2RlZmluZSBCT0xSCQkweDBjCQkvKiBCYWNrLW9mZiBMZW5ndGggUmVnICovCisjZGVmaW5lIERTUl9SWChjaGFuKQkoMHg0OCArIDIqY2hhbikJLyogRE1BIFN0YXR1cyBSZWcgKFJ4KSAqLworI2RlZmluZSBEU1JfVFgoY2hhbikJKDB4NDkgKyAyKmNoYW4pCS8qIERNQSBTdGF0dXMgUmVnIChUeCkgKi8KKyNkZWZpbmUgRElSX1JYKGNoYW4pCSgweDRjICsgMipjaGFuKQkvKiBETUEgSW50ZXJydXB0IEVuYWJsZSBSZWcgKFJ4KSAqLworI2RlZmluZSBESVJfVFgoY2hhbikJKDB4NGQgKyAyKmNoYW4pCS8qIERNQSBJbnRlcnJ1cHQgRW5hYmxlIFJlZyAoVHgpICovCisjZGVmaW5lIEZDVF9SWChjaGFuKQkoMHg1MCArIDIqY2hhbikJLyogRnJhbWUgRW5kIEludGVycnVwdCBDb3VudGVyIChSeCkgKi8KKyNkZWZpbmUgRkNUX1RYKGNoYW4pCSgweDUxICsgMipjaGFuKQkvKiBGcmFtZSBFbmQgSW50ZXJydXB0IENvdW50ZXIgKFR4KSAqLworI2RlZmluZSBETVJfUlgoY2hhbikJKDB4NTQgKyAyKmNoYW4pCS8qIERNQSBNb2RlIFJlZyAoUngpICovCisjZGVmaW5lIERNUl9UWChjaGFuKQkoMHg1NSArIDIqY2hhbikJLyogRE1BIE1vZGUgUmVnIChUeCkgKi8KKyNkZWZpbmUgRENSX1JYKGNoYW4pCSgweDU4ICsgMipjaGFuKQkvKiBETUEgQ29tbWFuZCBSZWcgKFJ4KSAqLworI2RlZmluZSBEQ1JfVFgoY2hhbikJKDB4NTkgKyAyKmNoYW4pCS8qIERNQSBDb21tYW5kIFJlZyAoVHgpICovCisKKy8qIERNQSBDaGFubmVsIFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDMFJYX09GRlNFVCAweDAwCisjZGVmaW5lIERNQUMwVFhfT0ZGU0VUIDB4MjAKKyNkZWZpbmUgRE1BQzFSWF9PRkZTRVQgMHg0MAorI2RlZmluZSBETUFDMVRYX09GRlNFVCAweDYwCisKKyNkZWZpbmUgREFSTAkweDgwCS8qIERlc3QgQWRkciBSZWdpc3RlciBMIChzaW5nbGUtYmxvY2ssIFJYIG9ubHkpICovCisjZGVmaW5lIERBUkgJMHg4MQkvKiBEZXN0IEFkZHIgUmVnaXN0ZXIgSCAoc2luZ2xlLWJsb2NrLCBSWCBvbmx5KSAqLworI2RlZmluZSBEQVJCCTB4ODIJLyogRGVzdCBBZGRyIFJlZ2lzdGVyIEIgKHNpbmdsZS1ibG9jaywgUlggb25seSkgKi8KKyNkZWZpbmUgREFSQkgJMHg4MwkvKiBEZXN0IEFkZHIgUmVnaXN0ZXIgQkggKHNpbmdsZS1ibG9jaywgUlggb25seSkgKi8KKyNkZWZpbmUgU0FSTAkweDgwCS8qIFNvdXJjZSBBZGRyIFJlZ2lzdGVyIEwgKHNpbmdsZS1ibG9jaywgVFggb25seSkgKi8KKyNkZWZpbmUgU0FSSAkweDgxCS8qIFNvdXJjZSBBZGRyIFJlZ2lzdGVyIEggKHNpbmdsZS1ibG9jaywgVFggb25seSkgKi8KKyNkZWZpbmUgU0FSQgkweDgyCS8qIFNvdXJjZSBBZGRyIFJlZ2lzdGVyIEIgKHNpbmdsZS1ibG9jaywgVFggb25seSkgKi8KKyNkZWZpbmUgREFSQkgJMHg4MwkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBCSCAoc2luZ2xlLWJsb2NrLCBUWCBvbmx5KSAqLworI2RlZmluZSBCQVJMCTB4ODAJLyogQnVmZmVyIEFkZHIgUmVnaXN0ZXIgTCAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgQkFSSAkweDgxCS8qIEJ1ZmZlciBBZGRyIFJlZ2lzdGVyIEggKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIEJBUkIJMHg4MgkvKiBCdWZmZXIgQWRkciBSZWdpc3RlciBCIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBCQVJCSAkweDgzCS8qIEJ1ZmZlciBBZGRyIFJlZ2lzdGVyIEJIIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBDREFMCTB4ODQJLyogQ3VycmVudCBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgTCAqLworI2RlZmluZSBDREFICTB4ODUJLyogQ3VycmVudCBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgSCAqLworI2RlZmluZSBDREFCCTB4ODYJLyogQ3VycmVudCBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBDREFCSAkweDg3CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEJIICovCisjZGVmaW5lIEVEQUwJMHg4OAkvKiBFcnJvciBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgTCAqLworI2RlZmluZSBFREFICTB4ODkJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEggKi8KKyNkZWZpbmUgRURBQgkweDhhCS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBCICovCisjZGVmaW5lIEVEQUJICTB4OGIJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEJIICovCisjZGVmaW5lIEJGTEwJMHg5MAkvKiBSWCBCdWZmZXIgTGVuZ3RoIEwgKG9ubHkgUlgpICovCisjZGVmaW5lIEJGTEgJMHg5MQkvKiBSWCBCdWZmZXIgTGVuZ3RoIEggKG9ubHkgUlgpICovCisjZGVmaW5lIEJDUkwJMHg4YwkvKiBCeXRlIENvdW50IFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgQkNSSAkweDhkCS8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgSCAqLworCisvKiBCbG9jayBEZXNjcmlwdG9yIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJbmV4dDsJCS8qIHBvaW50ZXIgdG8gbmV4dCBibG9jayBkZXNjcmlwdG9yICovCisJdW5zaWduZWQgbG9uZwlwdGJ1ZjsJCS8qIGJ1ZmZlciBwb2ludGVyICovCisJdW5zaWduZWQgc2hvcnQJbGVuOwkJLyogZGF0YSBsZW5ndGggKi8KKwl1bnNpZ25lZCBjaGFyCXN0YXR1czsJCS8qIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIJZmlsbGVyWzVdOwkvKiBhbGlnbm1lbnQgZmlsbGVyICgxNiBieXRlcykgKi8gCit9IHBjc2NhX2JkX3Q7CisKKy8qIEJsb2NrIERlc2NyaXB0b3IgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGNwOwkJCS8qIHBvaW50ZXIgdG8gbmV4dCBibG9jayBkZXNjcmlwdG9yICovCisJdTMyIGJwOwkJCS8qIGJ1ZmZlciBwb2ludGVyICovCisJdTE2IGxlbjsJCS8qIGRhdGEgbGVuZ3RoICovCisJdTggc3RhdDsJCS8qIHN0YXR1cyAqLworCXU4IHVudXNlZDsJCS8qIHBhZHMgdG8gNC1ieXRlIGJvdW5kYXJ5ICovCit9cGt0X2Rlc2M7CisKKworLyoKKwlEZXNjcmlwdG9yIFN0YXR1cyBkZWZpbml0aW9uczoKKworCUJpdAlUcmFuc21pc3Npb24JUmVjZXB0aW9uCisKKwk3CUVPTQkJRU9NCisJNgktCQlTaG9ydCBGcmFtZQorCTUJLQkJQWJvcnQKKwk0CS0JCVJlc2lkdWFsIGJpdAorCTMJVW5kZXJydW4JT3ZlcnJ1bgkKKwkyCS0JCUNSQworCTEJT3duZXJzaGlwCU93bmVyc2hpcAorCTAJRU9UCQktCisqLworI2RlZmluZSBEU1RfRU9UCQkweDAxCS8qIEVuZCBvZiB0cmFuc21pdCBjb21tYW5kICovCisjZGVmaW5lIERTVF9PU0IJCTB4MDIJLyogT3duZXJzaGlwIGJpdCAqLworI2RlZmluZSBEU1RfQ1JDCQkweDA0CS8qIENSQyBFcnJvciAqLworI2RlZmluZSBEU1RfT1ZSCQkweDA4CS8qIE92ZXJydW4gKi8KKyNkZWZpbmUgRFNUX1VEUgkJMHgwOAkvKiBVbmRlcnJ1biAqLworI2RlZmluZSBEU1RfUkJJVAkweDEwCS8qIFJlc2lkdWFsIGJpdCAqLworI2RlZmluZSBEU1RfQUJUCQkweDIwCS8qIEFib3J0ICovCisjZGVmaW5lIERTVF9TSFJUCTB4NDAJLyogU2hvcnQgRnJhbWUgICovCisjZGVmaW5lIERTVF9FT00JCTB4ODAJLyogRW5kIG9mIE1lc3NhZ2UgICovCisKKy8qIFBhY2tldCBEZXNjcmlwdG9yIFN0YXR1cyBiaXRzICovCisKKyNkZWZpbmUgU1RfVFhfRU9NICAgICAweDgwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTVF9UWF9VTkRSUlVOIDB4MDgKKyNkZWZpbmUgU1RfVFhfT1dOUlNIUCAweDAyCisjZGVmaW5lIFNUX1RYX0VPVCAgICAgMHgwMQkvKiBFbmQgb2YgdHJhbnNtaXRpb24gKi8KKworI2RlZmluZSBTVF9SWF9FT00gICAgIDB4ODAJLyogRW5kIG9mIGZyYW1lICovCisjZGVmaW5lIFNUX1JYX1NIT1JUICAgMHg0MAkvKiBTaG9ydCBmcmFtZSAqLworI2RlZmluZSBTVF9SWF9BQk9SVCAgIDB4MjAJLyogQWJvcnQgKi8KKyNkZWZpbmUgU1RfUlhfUkVTQklUICAweDEwCS8qIFJlc2lkdWFsIGJpdCAqLworI2RlZmluZSBTVF9SWF9PVkVSUlVOIDB4MDgJLyogT3ZlcnJ1biAqLworI2RlZmluZSBTVF9SWF9DUkMgICAgIDB4MDQJLyogQ1JDICovCisjZGVmaW5lIFNUX1JYX09XTlJTSFAgMHgwMgorCisjZGVmaW5lIFNUX0VSUk9SX01BU0sgMHg3QworCisvKiBTdGF0dXMgQ291bnRlciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ01DUgkweDE1OAkvKiBDb3VudGVyIE1hc3RlciBDdGwgUmVnICovCisjZGVmaW5lIFRFQ05UTAkweDE2MAkvKiBUeCBFT00gQ291bnRlciBMICovCisjZGVmaW5lIFRFQ05UTQkweDE2MQkvKiBUeCBFT00gQ291bnRlciBNICovCisjZGVmaW5lIFRFQ05USAkweDE2MgkvKiBUeCBFT00gQ291bnRlciBIICovCisjZGVmaW5lIFRFQ0NSCTB4MTYzCS8qIFR4IEVPTSBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgVVJDTlRMCTB4MTY0CS8qIFVuZGVycnVuIENvdW50ZXIgTCAqLworI2RlZmluZSBVUkNOVEgJMHgxNjUJLyogVW5kZXJydW4gQ291bnRlciBIICovCisjZGVmaW5lIFVSQ0NSCTB4MTY3CS8qIFVuZGVycnVuIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBSRUNOVEwJMHgxNjgJLyogUnggRU9NIENvdW50ZXIgTCAqLworI2RlZmluZSBSRUNOVE0JMHgxNjkJLyogUnggRU9NIENvdW50ZXIgTSAqLworI2RlZmluZSBSRUNOVEgJMHgxNmEJLyogUnggRU9NIENvdW50ZXIgSCAqLworI2RlZmluZSBSRUNDUgkweDE2YgkvKiBSeCBFT00gQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIE9SQ05UTAkweDE2YwkvKiBPdmVycnVuIENvdW50ZXIgTCAqLworI2RlZmluZSBPUkNOVEgJMHgxNmQJLyogT3ZlcnJ1biBDb3VudGVyIEggKi8KKyNkZWZpbmUgT1JDQ1IJMHgxNmYJLyogT3ZlcnJ1biBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgQ0VDTlRMCTB4MTcwCS8qIENSQyBDb3VudGVyIEwgKi8KKyNkZWZpbmUgQ0VDTlRICTB4MTcxCS8qIENSQyBDb3VudGVyIEggKi8KKyNkZWZpbmUgQ0VDQ1IJMHgxNzMJLyogQ1JDIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBBQkNOVEwJMHgxNzQJLyogQWJvcnQgZnJhbWUgQ291bnRlciBMICovCisjZGVmaW5lIEFCQ05USAkweDE3NQkvKiBBYm9ydCBmcmFtZSBDb3VudGVyIEggKi8KKyNkZWZpbmUgQUJDQ1IJMHgxNzcJLyogQWJvcnQgZnJhbWUgQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIFNIQ05UTAkweDE3OAkvKiBTaG9ydCBmcmFtZSBDb3VudGVyIEwgKi8KKyNkZWZpbmUgU0hDTlRICTB4MTc5CS8qIFNob3J0IGZyYW1lIENvdW50ZXIgSCAqLworI2RlZmluZSBTSENDUgkweDE3YgkvKiBTaG9ydCBmcmFtZSBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgUlNDTlRMCTB4MTdjCS8qIFJlc2lkdWFsIGJpdCBDb3VudGVyIEwgKi8KKyNkZWZpbmUgUlNDTlRICTB4MTdkCS8qIFJlc2lkdWFsIGJpdCBDb3VudGVyIEggKi8KKyNkZWZpbmUgUlNDQ1IJMHgxN2YJLyogUmVzaWR1YWwgYml0IENvdW50ZXIgQ3RsIFJlZyAqLworCisvKiBSZWdpc3RlciBQcm9ncmFtbWluZyBDb25zdGFudHMgKi8KKworI2RlZmluZSBJUjBfRE1JQwkweDAwMDAwMDAxCisjZGVmaW5lIElSMF9ETUlCCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVIwX0RNSUEJMHgwMDAwMDAwNAorI2RlZmluZSBJUjBfRUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIElSMF9ETUFSRVEJMHgwMDAxMDAwMAorI2RlZmluZSBJUjBfVFhJTlQJMHgwMDAyMDAwMAorI2RlZmluZSBJUjBfUlhJTlRCCTB4MDAwNDAwMDAKKyNkZWZpbmUgSVIwX1JYSU5UQQkweDAwMDgwMDAwCisjZGVmaW5lIElSMF9UWFJEWQkweDAwMTAwMDAwCisjZGVmaW5lIElSMF9SWFJEWQkweDAwMjAwMDAwCisKKyNkZWZpbmUgTUQwX0NSQzE2XzAJMHgwMAorI2RlZmluZSBNRDBfQ1JDMTZfMQkweDAxCisjZGVmaW5lIE1EMF9DUkMzMgkweDAyCisjZGVmaW5lIE1EMF9DUkNfQ0NJVFQJMHgwMworI2RlZmluZSBNRDBfQ1JDQzAJMHgwNAorI2RlZmluZSBNRDBfQ1JDQzEJMHgwOAorI2RlZmluZSBNRDBfQVVUT19FTkEJMHgxMAorI2RlZmluZSBNRDBfQVNZTkMJMHgwMAorI2RlZmluZSBNRDBfQllfTVNZTkMJMHgyMAorI2RlZmluZSBNRDBfQllfQklTWU5DCTB4NDAKKyNkZWZpbmUgTUQwX0JZX0VYVAkweDYwCisjZGVmaW5lIE1EMF9CSVRfU1lOQwkweDgwCisjZGVmaW5lIE1EMF9UUkFOU1AJMHhjMAorCisjZGVmaW5lIE1EMF9IRExDICAgICAgICAweDgwCS8qIEJpdC1zeW5jIEhETEMgbW9kZSAqLworCisjZGVmaW5lIE1EMF9DUkNfTk9ORQkweDAwCisjZGVmaW5lIE1EMF9DUkNfMTZfMAkweDA0CisjZGVmaW5lIE1EMF9DUkNfMTYJMHgwNQorI2RlZmluZSBNRDBfQ1JDX0lUVTMyCTB4MDYKKyNkZWZpbmUgTUQwX0NSQ19JVFUJMHgwNworCisjZGVmaW5lIE1EMV9OT0FERFIJMHgwMAorI2RlZmluZSBNRDFfU0FERFIxCTB4NDAKKyNkZWZpbmUgTUQxX1NBRERSMgkweDgwCisjZGVmaW5lIE1EMV9EQUREUgkweGMwCisKKyNkZWZpbmUgTUQyX05SWklfSUVFRQkweDQwCisjZGVmaW5lIE1EMl9NQU5DSEVTVEVSCTB4ODAKKyNkZWZpbmUgTUQyX0ZNX01BUksJMHhBMAorI2RlZmluZSBNRDJfRk1fU1BBQ0UJMHhDMAorI2RlZmluZSBNRDJfTE9PUEJBQ0sJMHgwMwkvKiBMb2NhbCBkYXRhIExvb3BiYWNrICovCisKKyNkZWZpbmUgTUQyX0ZfRFVQTEVYCTB4MDAKKyNkZWZpbmUgTUQyX0FVVE9fRUNITwkweDAxCisjZGVmaW5lIE1EMl9MT09QX0hJX1oJMHgwMgorI2RlZmluZSBNRDJfTE9PUF9NSVIJMHgwMworI2RlZmluZSBNRDJfQURQTExfWDgJMHgwMAorI2RlZmluZSBNRDJfQURQTExfWDE2CTB4MDgKKyNkZWZpbmUgTUQyX0FEUExMX1gzMgkweDEwCisjZGVmaW5lIE1EMl9OUloJCTB4MDAKKyNkZWZpbmUgTUQyX05SWkkJMHgyMAorI2RlZmluZSBNRDJfTlJaX0lFRUUJMHg0MAorI2RlZmluZSBNRDJfTUFOQ0gJMHgwMAorI2RlZmluZSBNRDJfRk0xCQkweDIwCisjZGVmaW5lIE1EMl9GTTAJCTB4NDAKKyNkZWZpbmUgTUQyX0ZNCQkweDgwCisKKyNkZWZpbmUgQ1RMX1JUUwkJMHgwMQorI2RlZmluZSBDVExfRFRSCQkweDAyCisjZGVmaW5lIENUTF9TWU4JCTB4MDQKKyNkZWZpbmUgQ1RMX0lETEMJMHgxMAorI2RlZmluZSBDVExfVURSTkMJMHgyMAorI2RlZmluZSBDVExfVVJTS1AJMHg0MAorI2RlZmluZSBDVExfVVJDVAkweDgwCisKKyNkZWZpbmUgQ1RMX05PUlRTCTB4MDEKKyNkZWZpbmUgQ1RMX05PRFRSCTB4MDIKKyNkZWZpbmUgQ1RMX0lETEUJMHgxMAorCisjZGVmaW5lCVJYU19CUjAJCTB4MDEKKyNkZWZpbmUJUlhTX0JSMQkJMHgwMgorI2RlZmluZQlSWFNfQlIyCQkweDA0CisjZGVmaW5lCVJYU19CUjMJCTB4MDgKKyNkZWZpbmUJUlhTX0VDTEsJMHgwMAorI2RlZmluZQlSWFNfRUNMS19OUwkweDIwCisjZGVmaW5lCVJYU19JQlJHCTB4NDAKKyNkZWZpbmUJUlhTX1BMTDEJMHg1MAorI2RlZmluZQlSWFNfUExMMgkweDYwCisjZGVmaW5lCVJYU19QTEwzCTB4NzAKKyNkZWZpbmUJUlhTX0RSVFhDCTB4ODAKKworI2RlZmluZQlUWFNfQlIwCQkweDAxCisjZGVmaW5lCVRYU19CUjEJCTB4MDIKKyNkZWZpbmUJVFhTX0JSMgkJMHgwNAorI2RlZmluZQlUWFNfQlIzCQkweDA4CisjZGVmaW5lCVRYU19FQ0xLCTB4MDAKKyNkZWZpbmUJVFhTX0lCUkcJMHg0MAorI2RlZmluZQlUWFNfUkNMSwkweDYwCisjZGVmaW5lCVRYU19EVFJYQwkweDgwCisKKyNkZWZpbmUJRVhTX1JFUzAJMHgwMQorI2RlZmluZQlFWFNfUkVTMQkweDAyCisjZGVmaW5lCUVYU19SRVMyCTB4MDQKKyNkZWZpbmUJRVhTX1RFUzAJMHgxMAorI2RlZmluZQlFWFNfVEVTMQkweDIwCisjZGVmaW5lCUVYU19URVMyCTB4NDAKKworI2RlZmluZSBDTEtfQlJHX01BU0sJMHgwRgorI2RlZmluZSBDTEtfUElOX09VVAkweDgwCisjZGVmaW5lIENMS19MSU5FICAgIAkweDAwCS8qIGNsb2NrIGxpbmUgaW5wdXQgKi8KKyNkZWZpbmUgQ0xLX0JSRyAgICAgCTB4NDAJLyogaW50ZXJuYWwgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworI2RlZmluZSBDTEtfVFhfUlhDTEsJMHg2MAkvKiBUWCBjbG9jayBmcm9tIFJYIGNsb2NrICovCisKKyNkZWZpbmUgQ01EX1JYX1JTVAkweDExCisjZGVmaW5lIENNRF9SWF9FTkEJMHgxMgorI2RlZmluZSBDTURfUlhfRElTCTB4MTMKKyNkZWZpbmUgQ01EX1JYX0NSQ19JTklUCTB4MTQKKyNkZWZpbmUgQ01EX1JYX01TR19SRUoJMHgxNQorI2RlZmluZSBDTURfUlhfTVBfU1JDSAkweDE2CisjZGVmaW5lIENNRF9SWF9DUkNfRVhDCTB4MTcKKyNkZWZpbmUgQ01EX1JYX0NSQ19GUkMJMHgxOAorI2RlZmluZSBDTURfVFhfUlNUCTB4MDEKKyNkZWZpbmUgQ01EX1RYX0VOQQkweDAyCisjZGVmaW5lIENNRF9UWF9ESVNBCTB4MDMKKyNkZWZpbmUgQ01EX1RYX0NSQ19JTklUCTB4MDQKKyNkZWZpbmUgQ01EX1RYX0NSQ19FWEMJMHgwNQorI2RlZmluZSBDTURfVFhfRU9NCTB4MDYKKyNkZWZpbmUgQ01EX1RYX0FCT1JUCTB4MDcKKyNkZWZpbmUgQ01EX1RYX01QX09OCTB4MDgKKyNkZWZpbmUgQ01EX1RYX0JVRl9DTFIJMHgwOQorI2RlZmluZSBDTURfVFhfRElTQgkweDBiCisjZGVmaW5lIENNRF9DSF9SU1QJMHgyMQorI2RlZmluZSBDTURfU1JDSF9NT0RFCTB4MzEKKyNkZWZpbmUgQ01EX05PUAkJMHgwMAorCisjZGVmaW5lIENNRF9SRVNFVAkweDIxCisjZGVmaW5lIENNRF9UWF9FTkFCTEUJMHgwMgorI2RlZmluZSBDTURfUlhfRU5BQkxFCTB4MTIKKworI2RlZmluZSBTVDBfUlhSRFkJMHgwMQorI2RlZmluZSBTVDBfVFhSRFkJMHgwMgorI2RlZmluZSBTVDBfUlhJTlRCCTB4MjAKKyNkZWZpbmUgU1QwX1JYSU5UQQkweDQwCisjZGVmaW5lIFNUMF9UWElOVAkweDgwCisKKyNkZWZpbmUgU1QxX0lETEUJMHgwMQorI2RlZmluZSBTVDFfQUJPUlQJMHgwMgorI2RlZmluZSBTVDFfQ0RDRAkweDA0CisjZGVmaW5lIFNUMV9DQ1RTCTB4MDgKKyNkZWZpbmUgU1QxX1NZTl9GTEFHCTB4MTAKKyNkZWZpbmUgU1QxX0NMTUQJMHgyMAorI2RlZmluZSBTVDFfVFhJRExFCTB4NDAKKyNkZWZpbmUgU1QxX1VEUk4JMHg4MAorCisjZGVmaW5lIFNUMl9DUkNFCTB4MDQKKyNkZWZpbmUgU1QyX09OUk4JMHgwOAorI2RlZmluZSBTVDJfUkJJVAkweDEwCisjZGVmaW5lIFNUMl9BQk9SVAkweDIwCisjZGVmaW5lIFNUMl9TSE9SVAkweDQwCisjZGVmaW5lIFNUMl9FT00JCTB4ODAKKworI2RlZmluZSBTVDNfUlhfRU5BCTB4MDEKKyNkZWZpbmUgU1QzX1RYX0VOQQkweDAyCisjZGVmaW5lIFNUM19EQ0QJCTB4MDQKKyNkZWZpbmUgU1QzX0NUUwkJMHgwOAorI2RlZmluZSBTVDNfU1JDSF9NT0RFCTB4MTAKKyNkZWZpbmUgU1QzX1NMT09QCTB4MjAKKyNkZWZpbmUgU1QzX0dQSQkJMHg4MAorCisjZGVmaW5lIFNUNF9SRE5SCTB4MDEKKyNkZWZpbmUgU1Q0X1JEQ1IJMHgwMgorI2RlZmluZSBTVDRfVEROUgkweDA0CisjZGVmaW5lIFNUNF9URENSCTB4MDgKKyNkZWZpbmUgU1Q0X09DTE0JMHgyMAorI2RlZmluZSBTVDRfQ0ZUCQkweDQwCisjZGVmaW5lIFNUNF9DR1BJCTB4ODAKKworI2RlZmluZSBGU1RfQ1JDRUYJMHgwNAorI2RlZmluZSBGU1RfT1ZSTkYJMHgwOAorI2RlZmluZSBGU1RfUkJJRgkweDEwCisjZGVmaW5lIEZTVF9BQlRGCTB4MjAKKyNkZWZpbmUgRlNUX1NIUlRGCTB4NDAKKyNkZWZpbmUgRlNUX0VPTUYJMHg4MAorCisjZGVmaW5lIElFMF9SWFJEWQkweDAxCisjZGVmaW5lIElFMF9UWFJEWQkweDAyCisjZGVmaW5lIElFMF9SWElOVEIJMHgyMAorI2RlZmluZSBJRTBfUlhJTlRBCTB4NDAKKyNkZWZpbmUgSUUwX1RYSU5UCTB4ODAKKyNkZWZpbmUgSUUwX1VEUk4JMHgwMDAwODAwMCAvKiBUWCB1bmRlcnJ1biBNU0NJIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUUwX0NEQ0QJMHgwMDAwMDQwMCAvKiBDRCBsZXZlbCBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworCisjZGVmaW5lIElFMV9JRExECTB4MDEKKyNkZWZpbmUgSUUxX0FCVEQJMHgwMgorI2RlZmluZSBJRTFfQ0RDRAkweDA0CisjZGVmaW5lIElFMV9DQ1RTCTB4MDgKKyNkZWZpbmUgSUUxX1NZTkNECTB4MTAKKyNkZWZpbmUgSUUxX0NMTUQJMHgyMAorI2RlZmluZSBJRTFfSURMCQkweDQwCisjZGVmaW5lIElFMV9VRFJOCTB4ODAKKworI2RlZmluZSBJRTJfQ1JDRQkweDA0CisjZGVmaW5lIElFMl9PVlJOCTB4MDgKKyNkZWZpbmUgSUUyX1JCSVQJMHgxMAorI2RlZmluZSBJRTJfQUJUCQkweDIwCisjZGVmaW5lIElFMl9TSFJUCTB4NDAKKyNkZWZpbmUgSUUyX0VPTQkJMHg4MAorCisjZGVmaW5lIElFNF9SRE5SCTB4MDEKKyNkZWZpbmUgSUU0X1JEQ1IJMHgwMgorI2RlZmluZSBJRTRfVEROUgkweDA0CisjZGVmaW5lIElFNF9URENSCTB4MDgKKyNkZWZpbmUgSUU0X09DTE0JMHgyMAorI2RlZmluZSBJRTRfQ0ZUCQkweDQwCisjZGVmaW5lIElFNF9DR1BJCTB4ODAKKworI2RlZmluZSBGSUVfQ1JDRUYJMHgwNAorI2RlZmluZSBGSUVfT1ZSTkYJMHgwOAorI2RlZmluZSBGSUVfUkJJRgkweDEwCisjZGVmaW5lIEZJRV9BQlRGCTB4MjAKKyNkZWZpbmUgRklFX1NIUlRGCTB4NDAKKyNkZWZpbmUgRklFX0VPTUYJMHg4MAorCisjZGVmaW5lIERTUl9EV0UJCTB4MDEKKyNkZWZpbmUgRFNSX0RFCQkweDAyCisjZGVmaW5lIERTUl9SRUYJCTB4MDQKKyNkZWZpbmUgRFNSX1VEUkYJMHgwNAorI2RlZmluZSBEU1JfQ09BCQkweDA4CisjZGVmaW5lIERTUl9DT0YJCTB4MTAKKyNkZWZpbmUgRFNSX0JPRgkJMHgyMAorI2RlZmluZSBEU1JfRU9NCQkweDQwCisjZGVmaW5lIERTUl9FT1QJCTB4ODAKKworI2RlZmluZSBESVJfUkVGCQkweDA0CisjZGVmaW5lIERJUl9VRFJGCTB4MDQKKyNkZWZpbmUgRElSX0NPQQkJMHgwOAorI2RlZmluZSBESVJfQ09GCQkweDEwCisjZGVmaW5lIERJUl9CT0YJCTB4MjAKKyNkZWZpbmUgRElSX0VPTQkJMHg0MAorI2RlZmluZSBESVJfRU9UCQkweDgwCisKKyNkZWZpbmUgRElSX1JFRkUJMHgwNAorI2RlZmluZSBESVJfVURSRkUJMHgwNAorI2RlZmluZSBESVJfQ09BRQkweDA4CisjZGVmaW5lIERJUl9DT0ZFCTB4MTAKKyNkZWZpbmUgRElSX0JPRkUJMHgyMAorI2RlZmluZSBESVJfRU9NRQkweDQwCisjZGVmaW5lIERJUl9FT1RFCTB4ODAKKworI2RlZmluZSBETVJfQ05URQkweDAyCisjZGVmaW5lIERNUl9ORgkJMHgwNAorI2RlZmluZSBETVJfU0VPTUUJMHgwOAorI2RlZmluZSBETVJfVE1PRAkweDEwCisKKyNkZWZpbmUgRE1FUl9ETUUgICAgICAgIDB4ODAJLyogRE1BIE1hc3RlciBFbmFibGUgKi8KKworI2RlZmluZSBEQ1JfU1dfQUJUCTB4MDEKKyNkZWZpbmUgRENSX0ZDVF9DTFIJMHgwMgorCisjZGVmaW5lIERDUl9BQk9SVAkweDAxCisjZGVmaW5lIERDUl9DTEVBUl9FT0YJMHgwMgorCisjZGVmaW5lIFBDUl9DT1RFCTB4ODAKKyNkZWZpbmUgUENSX1BSMAkJMHgwMQorI2RlZmluZSBQQ1JfUFIxCQkweDAyCisjZGVmaW5lIFBDUl9QUjIJCTB4MDQKKyNkZWZpbmUgUENSX0NDQwkJMHgwOAorI2RlZmluZSBQQ1JfQlJDCQkweDEwCisjZGVmaW5lIFBDUl9PU0IJCTB4NDAKKyNkZWZpbmUgUENSX0JVUlNUCTB4ODAKKworI2VuZGlmIC8qIChfX0hENjQ1NzJfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTd4LmMgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzQzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3eC5jCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogSGl0YWNoaSBTQ0EgSEQ2NDU3MCBhbmQgSEQ2NDU3MiBjb21tb24gZHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgorICogICAgSGl0YWNoaSBIRDY0NTcwIFNDQSBVc2VyJ3MgTWFudWFsCisgKiAgICBIaXRhY2hpIEhENjQ1NzIgU0NBLUlJIFVzZXIncyBNYW51YWwKKyAqCisgKiBXZSB1c2UgdGhlIGZvbGxvd2luZyBTQ0EgbWVtb3J5IG1hcDoKKyAqCisgKiBQYWNrZXQgYnVmZmVyIGRlc2NyaXB0b3IgcmluZ3MgLSBzdGFydGluZyBmcm9tIHdpbmJhc2Ugb3Igd2luMGJhc2U6CisgKiByeF9yaW5nX2J1ZmZlcnMgKiBzaXplb2YocGt0X2Rlc2MpID0gbG9naWNhbCBjaGFubmVsICMwIFJYIHJpbmcKKyAqIHR4X3JpbmdfYnVmZmVycyAqIHNpemVvZihwa3RfZGVzYykgPSBsb2dpY2FsIGNoYW5uZWwgIzAgVFggcmluZworICogcnhfcmluZ19idWZmZXJzICogc2l6ZW9mKHBrdF9kZXNjKSA9IGxvZ2ljYWwgY2hhbm5lbCAjMSBSWCByaW5nIChpZiB1c2VkKQorICogdHhfcmluZ19idWZmZXJzICogc2l6ZW9mKHBrdF9kZXNjKSA9IGxvZ2ljYWwgY2hhbm5lbCAjMSBUWCByaW5nIChpZiB1c2VkKQorICoKKyAqIFBhY2tldCBkYXRhIGJ1ZmZlcnMgLSBzdGFydGluZyBmcm9tIHdpbmJhc2UgKyBidWZmX29mZnNldDoKKyAqIHJ4X3JpbmdfYnVmZmVycyAqIEhETENfTUFYX01SVSAgICAgPSBsb2dpY2FsIGNoYW5uZWwgIzAgUlggYnVmZmVycworICogdHhfcmluZ19idWZmZXJzICogSERMQ19NQVhfTVJVICAgICA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBUWCBidWZmZXJzCisgKiByeF9yaW5nX2J1ZmZlcnMgKiBIRExDX01BWF9NUlUgICAgID0gbG9naWNhbCBjaGFubmVsICMwIFJYIGJ1ZmZlcnMgKGlmIHVzZWQpCisgKiB0eF9yaW5nX2J1ZmZlcnMgKiBIRExDX01BWF9NUlUgICAgID0gbG9naWNhbCBjaGFubmVsICMwIFRYIGJ1ZmZlcnMgKGlmIHVzZWQpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjaWYgKCFkZWZpbmVkIChfX0hENjQ1NzBfSCkgJiYgIWRlZmluZWQgKF9fSEQ2NDU3Ml9IKSkgfHwgXAorICAgIChkZWZpbmVkIChfX0hENjQ1NzBfSCkgJiYgZGVmaW5lZCAoX19IRDY0NTcyX0gpKQorI2Vycm9yIEVpdGhlciBoZDY0NTcwLmggb3IgaGQ2NDU3Mi5oIG11c3QgYmUgaW5jbHVkZWQKKyNlbmRpZgorCisjZGVmaW5lIGdldF9tc2NpKHBvcnQpCSAgKHBoeV9ub2RlKHBvcnQpID8gICBNU0NJMV9PRkZTRVQgOiAgIE1TQ0kwX09GRlNFVCkKKyNkZWZpbmUgZ2V0X2RtYWNfcngocG9ydCkgKHBoeV9ub2RlKHBvcnQpID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkKKyNkZWZpbmUgZ2V0X2RtYWNfdHgocG9ydCkgKHBoeV9ub2RlKHBvcnQpID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkKKworI2RlZmluZSBTQ0FfSU5UUl9NU0NJKG5vZGUpICAgIChub2RlID8gMHgxMCA6IDB4MDEpCisjZGVmaW5lIFNDQV9JTlRSX0RNQUNfUlgobm9kZSkgKG5vZGUgPyAweDIwIDogMHgwMikKKyNkZWZpbmUgU0NBX0lOVFJfRE1BQ19UWChub2RlKSAobm9kZSA/IDB4NDAgOiAweDA0KQorCisjaWZkZWYgX19IRDY0NTcwX0ggLyogSEQ2NDU3MCAqLworI2RlZmluZSBzY2Ffb3V0YSh2YWx1ZSwgcmVnLCBjYXJkKQlzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKQorI2RlZmluZSBzY2FfaW5hKHJlZywgY2FyZCkJCXNjYV9pbncocmVnLCBjYXJkKQorI2RlZmluZSB3cml0ZWEodmFsdWUsIHB0cikJCXdyaXRldyh2YWx1ZSwgcHRyKQorCisjZWxzZSAvKiBIRDY0NTcyICovCisjZGVmaW5lIHNjYV9vdXRhKHZhbHVlLCByZWcsIGNhcmQpCXNjYV9vdXRsKHZhbHVlLCByZWcsIGNhcmQpCisjZGVmaW5lIHNjYV9pbmEocmVnLCBjYXJkKQkJc2NhX2lubChyZWcsIGNhcmQpCisjZGVmaW5lIHdyaXRlYSh2YWx1ZSwgcHRyKQkJd3JpdGVsKHZhbHVlLCBwdHIpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydF90b19kZXYocG9ydF90ICpwb3J0KQoreworCXJldHVybiBwb3J0LT5kZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNjYV9pbnRyX3N0YXR1cyhjYXJkX3QgKmNhcmQpCit7CisJdTggcmVzdWx0ID0gMDsKKworI2lmZGVmIF9fSEQ2NDU3MF9IIC8qIEhENjQ1NzAgKi8KKwl1OCBpc3IwID0gc2NhX2luKElTUjAsIGNhcmQpOworCXU4IGlzcjEgPSBzY2FfaW4oSVNSMSwgY2FyZCk7CisKKwlpZiAoaXNyMSAmIDB4MDMpIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1JYKDApOworCWlmIChpc3IxICYgMHgwQykgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfVFgoMCk7CisJaWYgKGlzcjEgJiAweDMwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19SWCgxKTsKKwlpZiAoaXNyMSAmIDB4QzApIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDEpOworCWlmIChpc3IwICYgMHgwRikgcmVzdWx0IHw9IFNDQV9JTlRSX01TQ0koMCk7CisJaWYgKGlzcjAgJiAweEYwKSByZXN1bHQgfD0gU0NBX0lOVFJfTVNDSSgxKTsKKworI2Vsc2UgLyogSEQ2NDU3MiAqLworCXUzMiBpc3IwID0gc2NhX2lubChJU1IwLCBjYXJkKTsKKworCWlmIChpc3IwICYgMHgwMDAwMDAwRikgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfUlgoMCk7CisJaWYgKGlzcjAgJiAweDAwMDAwMEYwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19UWCgwKTsKKwlpZiAoaXNyMCAmIDB4MDAwMDBGMDApIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1JYKDEpOworCWlmIChpc3IwICYgMHgwMDAwRjAwMCkgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfVFgoMSk7CisJaWYgKGlzcjAgJiAweDAwM0UwMDAwKSByZXN1bHQgfD0gU0NBX0lOVFJfTVNDSSgwKTsKKwlpZiAoaXNyMCAmIDB4M0UwMDAwMDApIHJlc3VsdCB8PSBTQ0FfSU5UUl9NU0NJKDEpOworCisjZW5kaWYgLyogSEQ2NDU3MCB2cyBIRDY0NTcyICovCisKKwlpZiAoIShyZXN1bHQgJiBTQ0FfSU5UUl9ETUFDX1RYKDApKSkKKwkJaWYgKHNjYV9pbihEU1JfVFgoMCksIGNhcmQpICYgRFNSX0VPTSkKKwkJCXJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDApOworCWlmICghKHJlc3VsdCAmIFNDQV9JTlRSX0RNQUNfVFgoMSkpKQorCQlpZiAoc2NhX2luKERTUl9UWCgxKSwgY2FyZCkgJiBEU1JfRU9NKQorCQkJcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfVFgoMSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHBvcnRfdCogZGV2X3RvX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X3RvX2hkbGMoZGV2KS0+cHJpdjsKK30KKworc3RhdGljIGlubGluZSB1MTYgbmV4dF9kZXNjKHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwlyZXR1cm4gKGRlc2MgKyAxKSAlICh0cmFuc21pdCA/IHBvcnRfdG9fY2FyZChwb3J0KS0+dHhfcmluZ19idWZmZXJzCisJCQkgICAgIDogcG9ydF90b19jYXJkKHBvcnQpLT5yeF9yaW5nX2J1ZmZlcnMpOworfQorCisKKworc3RhdGljIGlubGluZSB1MTYgZGVzY19hYnNfbnVtYmVyKHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwl1MTYgcnhfYnVmZnMgPSBwb3J0X3RvX2NhcmQocG9ydCktPnJ4X3JpbmdfYnVmZmVyczsKKwl1MTYgdHhfYnVmZnMgPSBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVyczsKKworCWRlc2MgJT0gKHRyYW5zbWl0ID8gdHhfYnVmZnMgOiByeF9idWZmcyk7IC8vIGNhbGxlZCB3aXRoICJYICsgMSIgZXRjLgorCXJldHVybiBsb2dfbm9kZShwb3J0KSAqIChyeF9idWZmcyArIHR4X2J1ZmZzKSArCisJCXRyYW5zbWl0ICogcnhfYnVmZnMgKyBkZXNjOworfQorCisKKworc3RhdGljIGlubGluZSB1MTYgZGVzY19vZmZzZXQocG9ydF90ICpwb3J0LCB1MTYgZGVzYywgaW50IHRyYW5zbWl0KQoreworCS8qIERlc2NyaXB0b3Igb2Zmc2V0IGFsd2F5cyBmaXRzIGluIDE2IGJ5dGVzICovCisJcmV0dXJuIGRlc2NfYWJzX251bWJlcihwb3J0LCBkZXNjLCB0cmFuc21pdCkgKiBzaXplb2YocGt0X2Rlc2MpOworfQorCisKKworc3RhdGljIGlubGluZSBwa3RfZGVzYyBfX2lvbWVtICpkZXNjX2FkZHJlc3MocG9ydF90ICpwb3J0LCB1MTYgZGVzYywgaW50IHRyYW5zbWl0KQoreworI2lmZGVmIFBBR0UwX0FMV0FZU19NQVBQRUQKKwlyZXR1cm4gKHBrdF9kZXNjIF9faW9tZW0gKikod2luMGJhc2UocG9ydF90b19jYXJkKHBvcnQpKQorCQkJICAgKyBkZXNjX29mZnNldChwb3J0LCBkZXNjLCB0cmFuc21pdCkpOworI2Vsc2UKKwlyZXR1cm4gKHBrdF9kZXNjIF9faW9tZW0gKikod2luYmFzZShwb3J0X3RvX2NhcmQocG9ydCkpCisJCQkgICArIGRlc2Nfb2Zmc2V0KHBvcnQsIGRlc2MsIHRyYW5zbWl0KSk7CisjZW5kaWYKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1ZmZlcl9vZmZzZXQocG9ydF90ICpwb3J0LCB1MTYgZGVzYywgaW50IHRyYW5zbWl0KQoreworCXJldHVybiBwb3J0X3RvX2NhcmQocG9ydCktPmJ1ZmZfb2Zmc2V0ICsKKwkJZGVzY19hYnNfbnVtYmVyKHBvcnQsIGRlc2MsIHRyYW5zbWl0KSAqICh1MzIpSERMQ19NQVhfTVJVOworfQorCisKKworc3RhdGljIHZvaWQgc2NhX2luaXRfc3luY19wb3J0KHBvcnRfdCAqcG9ydCkKK3sKKwljYXJkX3QgKmNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJaW50IHRyYW5zbWl0LCBpOworCisJcG9ydC0+cnhpbiA9IDA7CisJcG9ydC0+dHhpbiA9IDA7CisJcG9ydC0+dHhsYXN0ID0gMDsKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCW9wZW53aW4oY2FyZCwgMCk7CisjZW5kaWYKKworCWZvciAodHJhbnNtaXQgPSAwOyB0cmFuc21pdCA8IDI7IHRyYW5zbWl0KyspIHsKKwkJdTE2IGRtYWMgPSB0cmFuc21pdCA/IGdldF9kbWFjX3R4KHBvcnQpIDogZ2V0X2RtYWNfcngocG9ydCk7CisJCXUxNiBidWZmcyA9IHRyYW5zbWl0ID8gY2FyZC0+dHhfcmluZ19idWZmZXJzCisJCQk6IGNhcmQtPnJ4X3JpbmdfYnVmZmVyczsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnVmZnM7IGkrKykgeworCQkJcGt0X2Rlc2MgX19pb21lbSAqZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBpLCB0cmFuc21pdCk7CisJCQl1MTYgY2hhaW5fb2ZmID0gZGVzY19vZmZzZXQocG9ydCwgaSArIDEsIHRyYW5zbWl0KTsKKwkJCXUzMiBidWZmX29mZiA9IGJ1ZmZlcl9vZmZzZXQocG9ydCwgaSwgdHJhbnNtaXQpOworCisJCQl3cml0ZWEoY2hhaW5fb2ZmLCAmZGVzYy0+Y3ApOworCQkJd3JpdGVsKGJ1ZmZfb2ZmLCAmZGVzYy0+YnApOworCQkJd3JpdGV3KDAsICZkZXNjLT5sZW4pOworCQkJd3JpdGViKDAsICZkZXNjLT5zdGF0KTsKKwkJfQorCisJCS8qIERNQSBkaXNhYmxlIC0gdG8gaGFsdCBzdGF0ZSAqLworCQlzY2Ffb3V0KDAsIHRyYW5zbWl0ID8gRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSA6CisJCQlEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJLyogc29mdHdhcmUgQUJPUlQgLSB0byBpbml0aWFsIHN0YXRlICovCisJCXNjYV9vdXQoRENSX0FCT1JULCB0cmFuc21pdCA/IERDUl9UWChwaHlfbm9kZShwb3J0KSkgOgorCQkJRENSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKyNpZmRlZiBfX0hENjQ1NzBfSAorCQlzY2Ffb3V0KDAsIGRtYWMgKyBDUEIsIGNhcmQpOyAvKiBwb2ludGVyIGJhc2UgKi8KKyNlbmRpZgorCQkvKiBjdXJyZW50IGRlc2MgYWRkciAqLworCQlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCAwLCB0cmFuc21pdCksIGRtYWMgKyBDREFMLCBjYXJkKTsKKwkJaWYgKCF0cmFuc21pdCkKKwkJCXNjYV9vdXRhKGRlc2Nfb2Zmc2V0KHBvcnQsIGJ1ZmZzIC0gMSwgdHJhbnNtaXQpLAorCQkJCSBkbWFjICsgRURBTCwgY2FyZCk7CisJCWVsc2UKKwkJCXNjYV9vdXRhKGRlc2Nfb2Zmc2V0KHBvcnQsIDAsIHRyYW5zbWl0KSwgZG1hYyArIEVEQUwsCisJCQkJIGNhcmQpOworCisJCS8qIGNsZWFyIGZyYW1lIGVuZCBpbnRlcnJ1cHQgY291bnRlciAqLworCQlzY2Ffb3V0KERDUl9DTEVBUl9FT0YsIHRyYW5zbWl0ID8gRENSX1RYKHBoeV9ub2RlKHBvcnQpKSA6CisJCQlEQ1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKworCQlpZiAoIXRyYW5zbWl0KSB7IC8qIFJlY2VpdmUgKi8KKwkJCS8qIHNldCBidWZmZXIgbGVuZ3RoICovCisJCQlzY2Ffb3V0dyhIRExDX01BWF9NUlUsIGRtYWMgKyBCRkxMLCBjYXJkKTsKKwkJCS8qIENoYWluIG1vZGUsIE11bHRpLWZyYW1lICovCisJCQlzY2Ffb3V0KDB4MTQsIERNUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCQkJc2NhX291dChESVJfRU9NRSB8IERJUl9CT0ZFLCBESVJfUlgocGh5X25vZGUocG9ydCkpLAorCQkJCWNhcmQpOworCQkJLyogRE1BIGVuYWJsZSAqLworCQkJc2NhX291dChEU1JfREUsIERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCQl9IGVsc2UgewkvKiBUcmFuc21pdCAqLworCQkJLyogQ2hhaW4gbW9kZSwgTXVsdGktZnJhbWUgKi8KKwkJCXNjYV9vdXQoMHgxNCwgRE1SX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisJCQkvKiBlbmFibGUgdW5kZXJmbG93IGludGVycnVwdHMgKi8KKwkJCXNjYV9vdXQoRElSX0JPRkUsIERJUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCQl9CisJfQorCisJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMywgY2FyZCkgJiBTVDNfRENEKSwKKwkJCSBwb3J0X3RvX2Rldihwb3J0KSk7Cit9CisKKworCisjaWZkZWYgTkVFRF9TQ0FfTVNDSV9JTlRSCisvKiBNU0NJIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NhX21zY2lfaW50cihwb3J0X3QgKnBvcnQpCit7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdCA9IHNjYV9pbihtc2NpICsgU1QxLCBjYXJkKTsgLyogcmVhZCBNU0NJIFNUMSBzdGF0dXMgKi8KKworCS8qIFJlc2V0IE1TQ0kgVFggdW5kZXJydW4gYW5kIENEQ0Qgc3RhdHVzIGJpdCAqLworCXNjYV9vdXQoc3RhdCAmIChTVDFfVURSTiB8IFNUMV9DRENEKSwgbXNjaSArIFNUMSwgY2FyZCk7CisKKwlpZiAoc3RhdCAmIFNUMV9VRFJOKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMocG9ydF90b19kZXYocG9ydCkpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7IC8qIFRYIFVuZGVycnVuIGVycm9yIGRldGVjdGVkICovCisJCXN0YXRzLT50eF9maWZvX2Vycm9ycysrOworCX0KKworCWlmIChzdGF0ICYgU1QxX0NEQ0QpCisJCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4obXNjaSArIFNUMywgY2FyZCkgJiBTVDNfRENEKSwKKwkJCQkgcG9ydF90b19kZXYocG9ydCkpOworfQorI2VuZGlmCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2NhX3J4KGNhcmRfdCAqY2FyZCwgcG9ydF90ICpwb3J0LCBwa3RfZGVzYyBfX2lvbWVtICpkZXNjLCB1MTYgcnhpbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IGxlbjsKKwl1MzIgYnVmZjsKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwl1MzIgbWF4bGVuOworCXU4IHBhZ2U7CisjZW5kaWYKKworCWxlbiA9IHJlYWR3KCZkZXNjLT5sZW4pOworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikgeworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJYnVmZiA9IGJ1ZmZlcl9vZmZzZXQocG9ydCwgcnhpbiwgMCk7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJcGFnZSA9IGJ1ZmYgLyB3aW5zaXplKGNhcmQpOworCWJ1ZmYgPSBidWZmICUgd2luc2l6ZShjYXJkKTsKKwltYXhsZW4gPSB3aW5zaXplKGNhcmQpIC0gYnVmZjsKKworCW9wZW53aW4oY2FyZCwgcGFnZSk7CisKKwlpZiAobGVuID4gbWF4bGVuKSB7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB3aW5iYXNlKGNhcmQpICsgYnVmZiwgbWF4bGVuKTsKKwkJb3BlbndpbihjYXJkLCBwYWdlICsgMSk7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgbWF4bGVuLCB3aW5iYXNlKGNhcmQpLCBsZW4gLSBtYXhsZW4pOworCX0gZWxzZQorI2VuZGlmCisJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHdpbmJhc2UoY2FyZCkgKyBidWZmLCBsZW4pOworCisjaWYgIWRlZmluZWQoUEFHRTBfQUxXQVlTX01BUFBFRCkgJiYgIWRlZmluZWQoQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQpCisJLyogc2VsZWN0IHBrdF9kZXNjIHRhYmxlIHBhZ2UgYmFjayAqLworCW9wZW53aW4oY2FyZCwgMCk7CisjZW5kaWYKKwlza2JfcHV0KHNrYiwgbGVuKTsKKyNpZmRlZiBERUJVR19QS1QKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgUlgoJWkpOiIsIGRldi0+bmFtZSwgc2tiLT5sZW4pOworCWRlYnVnX2ZyYW1lKHNrYik7CisjZW5kaWYKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworCisvKiBSZWNlaXZlIERNQSBpbnRlcnJ1cHQgc2VydmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNjYV9yeF9pbnRyKHBvcnRfdCAqcG9ydCkKK3sKKwl1MTYgZG1hYyA9IGdldF9kbWFjX3J4KHBvcnQpOworCWNhcmRfdCAqY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1OCBzdGF0ID0gc2NhX2luKERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOyAvKiByZWFkIERNQSBTdGF0dXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKTsKKworCS8qIFJlc2V0IERTUiBzdGF0dXMgYml0cyAqLworCXNjYV9vdXQoKHN0YXQgJiAoRFNSX0VPVCB8IERTUl9FT00gfCBEU1JfQk9GIHwgRFNSX0NPRikpIHwgRFNSX0RXRSwKKwkJRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKwlpZiAoc3RhdCAmIERTUl9CT0YpCisJCXN0YXRzLT5yeF9vdmVyX2Vycm9ycysrOyAvKiBEcm9wcGVkIG9uZSBvciBtb3JlIGZyYW1lcyAqLworCisJd2hpbGUgKDEpIHsKKwkJdTMyIGRlc2Nfb2ZmID0gZGVzY19vZmZzZXQocG9ydCwgcG9ydC0+cnhpbiwgMCk7CisJCXBrdF9kZXNjIF9faW9tZW0gKmRlc2M7CisJCXUzMiBjZGEgPSBzY2FfaW5hKGRtYWMgKyBDREFMLCBjYXJkKTsKKworCQlpZiAoKGNkYSA+PSBkZXNjX29mZikgJiYgKGNkYSA8IGRlc2Nfb2ZmICsgc2l6ZW9mKHBrdF9kZXNjKSkpCisJCQlicmVhazsJLyogTm8gZnJhbWUgcmVjZWl2ZWQgKi8KKworCQlkZXNjID0gZGVzY19hZGRyZXNzKHBvcnQsIHBvcnQtPnJ4aW4sIDApOworCQlzdGF0ID0gcmVhZGIoJmRlc2MtPnN0YXQpOworCQlpZiAoIShzdGF0ICYgU1RfUlhfRU9NKSkKKwkJCXBvcnQtPnJ4cGFydCA9IDE7IC8qIHBhcnRpYWwgZnJhbWUgcmVjZWl2ZWQgKi8KKwkJZWxzZSBpZiAoKHN0YXQgJiBTVF9FUlJPUl9NQVNLKSB8fCBwb3J0LT5yeHBhcnQpIHsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgU1RfUlhfT1ZFUlJVTikgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKys7CisJCQllbHNlIGlmICgoc3RhdCAmIChTVF9SWF9TSE9SVCB8IFNUX1JYX0FCT1JUIHwKKwkJCQkJICBTVF9SWF9SRVNCSVQpKSB8fCBwb3J0LT5yeHBhcnQpCisJCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJZWxzZSBpZiAoc3RhdCAmIFNUX1JYX0NSQykgc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgU1RfUlhfRU9NKQorCQkJCXBvcnQtPnJ4cGFydCA9IDA7IC8qIHJlY2VpdmVkIGxhc3QgZnJhZ21lbnQgKi8KKwkJfSBlbHNlCisJCQlzY2FfcngoY2FyZCwgcG9ydCwgZGVzYywgcG9ydC0+cnhpbik7CisKKwkJLyogU2V0IG5ldyBlcnJvciBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJc2NhX291dGEoZGVzY19vZmYsIGRtYWMgKyBFREFMLCBjYXJkKTsKKwkJcG9ydC0+cnhpbiA9IG5leHRfZGVzYyhwb3J0LCBwb3J0LT5yeGluLCAwKTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgUlggRE1BIGlzIGVuYWJsZWQgKi8KKwlzY2Ffb3V0KERTUl9ERSwgRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7Cit9CisKKworCisvKiBUcmFuc21pdCBETUEgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2FfdHhfaW50cihwb3J0X3QgKnBvcnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1MTYgZG1hYyA9IGdldF9kbWFjX3R4KHBvcnQpOworCWNhcmRfdCogY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1OCBzdGF0OworCisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKworCXN0YXQgPSBzY2FfaW4oRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7IC8qIHJlYWQgRE1BIFN0YXR1cyAqLworCisJLyogUmVzZXQgRFNSIHN0YXR1cyBiaXRzICovCisJc2NhX291dCgoc3RhdCAmIChEU1JfRU9UIHwgRFNSX0VPTSB8IERTUl9CT0YgfCBEU1JfQ09GKSkgfCBEU1JfRFdFLAorCQlEU1JfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKworCXdoaWxlICgxKSB7CisJCXBrdF9kZXNjIF9faW9tZW0gKmRlc2M7CisKKwkJdTMyIGRlc2Nfb2ZmID0gZGVzY19vZmZzZXQocG9ydCwgcG9ydC0+dHhsYXN0LCAxKTsKKwkJdTMyIGNkYSA9IHNjYV9pbmEoZG1hYyArIENEQUwsIGNhcmQpOworCQlpZiAoKGNkYSA+PSBkZXNjX29mZikgJiYgKGNkYSA8IGRlc2Nfb2ZmICsgc2l6ZW9mKHBrdF9kZXNjKSkpCisJCQlicmVhazsJLyogVHJhbnNtaXR0ZXIgaXMvd2lsbF9iZSBzZW5kaW5nIHRoaXMgZnJhbWUgKi8KKworCQlkZXNjID0gZGVzY19hZGRyZXNzKHBvcnQsIHBvcnQtPnR4bGFzdCwgMSk7CisJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCXN0YXRzLT50eF9ieXRlcyArPSByZWFkdygmZGVzYy0+bGVuKTsKKwkJd3JpdGViKDAsICZkZXNjLT5zdGF0KTsJLyogRnJlZSBkZXNjcmlwdG9yICovCisJCXBvcnQtPnR4bGFzdCA9IG5leHRfZGVzYyhwb3J0LCBwb3J0LT50eGxhc3QsIDEpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Cit9CisKKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NhX2ludHIoaW50IGlycSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljYXJkX3QgKmNhcmQgPSBkZXZfaWQ7CisJaW50IGk7CisJdTggc3RhdDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwl1OCBwYWdlID0gc2NhX2dldF9wYWdlKGNhcmQpOworI2VuZGlmCisKKwl3aGlsZSgoc3RhdCA9IHNjYV9pbnRyX3N0YXR1cyhjYXJkKSkgIT0gMCkgeworCQloYW5kbGVkID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJcG9ydF90ICpwb3J0ID0gZ2V0X3BvcnQoY2FyZCwgaSk7CisJCQlpZiAocG9ydCkgeworCQkJCWlmIChzdGF0ICYgU0NBX0lOVFJfTVNDSShpKSkKKwkJCQkJc2NhX21zY2lfaW50cihwb3J0KTsKKworCQkJCWlmIChzdGF0ICYgU0NBX0lOVFJfRE1BQ19SWChpKSkKKwkJCQkJc2NhX3J4X2ludHIocG9ydCk7CisKKwkJCQlpZiAoc3RhdCAmIFNDQV9JTlRSX0RNQUNfVFgoaSkpCisJCQkJCXNjYV90eF9pbnRyKHBvcnQpOworCQkJfQorCQl9CisJfQorCisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJb3BlbndpbihjYXJkLCBwYWdlKTsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgcGFnZSAqLworI2VuZGlmCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworCitzdGF0aWMgdm9pZCBzY2Ffc2V0X3BvcnQocG9ydF90ICpwb3J0KQoreworCWNhcmRfdCogY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1MTYgbXNjaSA9IGdldF9tc2NpKHBvcnQpOworCXU4IG1kMiA9IHNjYV9pbihtc2NpICsgTUQyLCBjYXJkKTsKKwl1bnNpZ25lZCBpbnQgdG1jLCBiciA9IDEwLCBicnYgPSAxMDI0OworCisKKwlpZiAocG9ydC0+c2V0dGluZ3MuY2xvY2tfcmF0ZSA+IDApIHsKKwkJLyogVHJ5IGxvd2VyIGJyIGZvciBiZXR0ZXIgYWNjdXJhY3kqLworCQlkbyB7CisJCQlici0tOworCQkJYnJ2ID4+PSAxOyAvKiBicnYgPSAyXjkgPSA1MTIgbWF4IGluIHNwZWNzICovCisKKwkJCS8qIEJhdWQgUmF0ZSA9IENMT0NLX0JBU0UgLyBUTUMgLyAyXkJSICovCisJCQl0bWMgPSBDTE9DS19CQVNFIC8gYnJ2IC8gcG9ydC0+c2V0dGluZ3MuY2xvY2tfcmF0ZTsKKwkJfXdoaWxlIChiciA+IDEgJiYgdG1jIDw9IDEyOCk7CisKKwkJaWYgKHRtYyA8IDEpIHsKKwkJCXRtYyA9IDE7CisJCQliciA9IDA7CS8qIEZvciBiYXVkPUNMT0NLX0JBU0Ugd2UgdXNlIHRtYz0xIGJyPTAgKi8KKwkJCWJydiA9IDE7CisJCX0gZWxzZSBpZiAodG1jID4gMjU1KQorCQkJdG1jID0gMjU2OyAvKiB0bWM9MCBtZWFucyAyNTYgLSBsb3cgYmF1ZCByYXRlcyAqLworCisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGUgPSBDTE9DS19CQVNFIC8gYnJ2IC8gdG1jOworCX0gZWxzZSB7CisJCWJyID0gOTsgLyogTWluaW11bSBjbG9jayByYXRlICovCisJCXRtYyA9IDI1NjsJLyogOGJpdCA9IDAgKi8KKwkJcG9ydC0+c2V0dGluZ3MuY2xvY2tfcmF0ZSA9IENMT0NLX0JBU0UgLyAoMjU2ICogNTEyKTsKKwl9CisKKwlwb3J0LT5yeHMgPSAocG9ydC0+cnhzICYgfkNMS19CUkdfTUFTSykgfCBicjsKKwlwb3J0LT50eHMgPSAocG9ydC0+dHhzICYgfkNMS19CUkdfTUFTSykgfCBicjsKKwlwb3J0LT50bWMgPSB0bWM7CisKKwkvKiBiYXVkIGRpdmlzb3IgLSB0aW1lIGNvbnN0YW50Ki8KKyNpZmRlZiBfX0hENjQ1NzBfSAorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DLCBjYXJkKTsKKyNlbHNlCisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNSLCBjYXJkKTsKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQ1QsIGNhcmQpOworI2VuZGlmCisKKwkvKiBTZXQgQlJHIGJpdHMgKi8KKwlzY2Ffb3V0KHBvcnQtPnJ4cywgbXNjaSArIFJYUywgY2FyZCk7CisJc2NhX291dChwb3J0LT50eHMsIG1zY2kgKyBUWFMsIGNhcmQpOworCisJaWYgKHBvcnQtPnNldHRpbmdzLmxvb3BiYWNrKQorCQltZDIgfD0gTUQyX0xPT1BCQUNLOworCWVsc2UKKwkJbWQyICY9IH5NRDJfTE9PUEJBQ0s7CisKKwlzY2Ffb3V0KG1kMiwgbXNjaSArIE1EMiwgY2FyZCk7CisKK30KKworCisKK3N0YXRpYyB2b2lkIHNjYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCBtZDAsIG1kMjsKKworCXN3aXRjaChwb3J0LT5lbmNvZGluZykgeworCWNhc2UgRU5DT0RJTkdfTlJaOgltZDIgPSBNRDJfTlJaOwkJYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOgltZDIgPSBNRDJfTlJaSTsJCWJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzoJbWQyID0gTUQyX0ZNX01BUks7CWJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6CW1kMiA9IE1EMl9GTV9TUEFDRTsJYnJlYWs7CisJZGVmYXVsdDoJCW1kMiA9IE1EMl9NQU5DSEVTVEVSOworCX0KKworCWlmIChwb3J0LT5zZXR0aW5ncy5sb29wYmFjaykKKwkJbWQyIHw9IE1EMl9MT09QQkFDSzsKKworCXN3aXRjaChwb3J0LT5wYXJpdHkpIHsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjA6CSAgICAgbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDXzE2XzA7ICBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjE6CSAgICAgbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDXzE2OyAgICBicmVhazsKKyNpZmRlZiBfX0hENjQ1NzBfSAorCWNhc2UgUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVDogbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDX0lUVV8wOyBicmVhazsKKyNlbHNlCisJY2FzZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUOiBtZDAgPSBNRDBfSERMQyB8IE1EMF9DUkNfSVRVMzI7IGJyZWFrOworI2VuZGlmCisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUOiBtZDAgPSBNRDBfSERMQyB8IE1EMF9DUkNfSVRVOyAgIGJyZWFrOworCWRlZmF1bHQ6CQkgICAgIG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ19OT05FOworCX0KKworCXNjYV9vdXQoQ01EX1JFU0VULCBtc2NpICsgQ01ELCBjYXJkKTsKKwlzY2Ffb3V0KG1kMCwgbXNjaSArIE1EMCwgY2FyZCk7CisJc2NhX291dCgweDAwLCBtc2NpICsgTUQxLCBjYXJkKTsgLyogbm8gYWRkcmVzcyBmaWVsZCBjaGVjayAqLworCXNjYV9vdXQobWQyLCBtc2NpICsgTUQyLCBjYXJkKTsKKwlzY2Ffb3V0KDB4N0UsIG1zY2kgKyBJREwsIGNhcmQpOyAvKiBmbGFnIGNoYXJhY3RlciAweDdFICovCisjaWZkZWYgX19IRDY0NTcwX0gKKwlzY2Ffb3V0KENUTF9JRExFLCBtc2NpICsgQ1RMLCBjYXJkKTsKKyNlbHNlCisJLyogU2tpcCB0aGUgcmVzdCBvZiB1bmRlcnJ1biBmcmFtZSAqLworCXNjYV9vdXQoQ1RMX0lETEUgfCBDVExfVVJDVCB8IENUTF9VUlNLUCwgbXNjaSArIENUTCwgY2FyZCk7CisjZW5kaWYKKworI2lmZGVmIF9fSEQ2NDU3MF9ICisJLyogQWxsb3cgYXQgbGVhc3QgOCBieXRlcyBiZWZvcmUgcmVxdWVzdGluZyBSWCBETUEgb3BlcmF0aW9uICovCisJLyogVFggd2l0aCBoaWdoZXIgcHJpb3JpdHkgYW5kIHBvc3NpYmx5IHdpdGggc2hvcnRlciB0cmFuc2ZlcnMgKi8KKwlzY2Ffb3V0KDB4MDcsIG1zY2kgKyBSUkMsIGNhcmQpOyAvKiArMT1SWFJEWS9ETUEgYWN0aXZhdGlvbiBjb25kaXRpb24qLworCXNjYV9vdXQoMHgxMCwgbXNjaSArIFRSQzAsIGNhcmQpOyAvKiA9IFRYUkRZL0RNQSBhY3RpdmF0aW9uIGNvbmRpdGlvbiovCisJc2NhX291dCgweDE0LCBtc2NpICsgVFJDMSwgY2FyZCk7IC8qICsxPVRYUkRZL0RNQSBkZWFjdGl2IGNvbmRpdGlvbiAqLworI2Vsc2UKKwlzY2Ffb3V0KDB4MEYsIG1zY2kgKyBSTlIsIGNhcmQpOyAvKiArMT1SWCBETUEgYWN0aXZhdGlvbiBjb25kaXRpb24gKi8KKwlzY2Ffb3V0KDB4M0MsIG1zY2kgKyBURlMsIGNhcmQpOyAvKiArMSA9IFRYIHN0YXJ0ICovCisJc2NhX291dCgweDM4LCBtc2NpICsgVENSLCBjYXJkKTsgLyogPUNyaXRpY2FsIFRYIERNQSBhY3RpdiBjb25kaXRpb24gKi8KKwlzY2Ffb3V0KDB4MzgsIG1zY2kgKyBUTlIwLCBjYXJkKTsgLyogPVRYIERNQSBhY3RpdmF0aW9uIGNvbmRpdGlvbiAqLworCXNjYV9vdXQoMHgzRiwgbXNjaSArIFROUjEsIGNhcmQpOyAvKiArMT1UWCBETUEgZGVhY3RpdmF0aW9uIGNvbmRpdGlvbiovCisjZW5kaWYKKworLyogV2UncmUgdXNpbmcgdGhlIGZvbGxvd2luZyBpbnRlcnJ1cHRzOgorICAgLSBUWElOVCAoRE1BQyBjb21wbGV0ZWQgYWxsIHRyYW5zbWlzaW9ucywgdW5kZXJydW4gb3IgRENEIGNoYW5nZSkKKyAgIC0gYWxsIERNQSBpbnRlcnJ1cHRzCisqLworCisJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihtc2NpICsgU1QzLCBjYXJkKSAmIFNUM19EQ0QpLCBkZXYpOworCisjaWZkZWYgX19IRDY0NTcwX0gKKwkvKiBNU0NJIFRYIElOVCBhbmQgUlggSU5UIEEgSVJRIGVuYWJsZSAqLworCXNjYV9vdXQoSUUwX1RYSU5UIHwgSUUwX1JYSU5UQSwgbXNjaSArIElFMCwgY2FyZCk7CisJc2NhX291dChJRTFfVURSTiB8IElFMV9DRENELCBtc2NpICsgSUUxLCBjYXJkKTsKKwlzY2Ffb3V0KHNjYV9pbihJRVIwLCBjYXJkKSB8IChwaHlfbm9kZShwb3J0KSA/IDB4QzAgOiAweDBDKSwKKwkJSUVSMCwgY2FyZCk7IC8qIFRYSU5UIGFuZCBSWElOVCAqLworCS8qIGVuYWJsZSBETUEgSVJRICovCisJc2NhX291dChzY2FfaW4oSUVSMSwgY2FyZCkgfCAocGh5X25vZGUocG9ydCkgPyAweEYwIDogMHgwRiksCisJCUlFUjEsIGNhcmQpOworI2Vsc2UKKwkvKiBNU0NJIFRYSU5UIGFuZCBSWElOVEEgaW50ZXJydXB0IGVuYWJsZSAqLworCXNjYV9vdXRsKElFMF9UWElOVCB8IElFMF9SWElOVEEgfCBJRTBfVURSTiB8IElFMF9DRENELCBtc2NpICsgSUUwLAorCQkgY2FyZCk7CisJLyogRE1BICYgTVNDSSBJUlEgZW5hYmxlICovCisJc2NhX291dGwoc2NhX2lubChJRVIwLCBjYXJkKSB8CisJCSAocGh5X25vZGUocG9ydCkgPyAweDBBMDA2NjAwIDogMHgwMDBBMDA2NiksIElFUjAsIGNhcmQpOworI2VuZGlmCisKKyNpZmRlZiBfX0hENjQ1NzBfSAorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DLCBjYXJkKTsgLyogUmVzdG9yZSByZWdpc3RlcnMgKi8KKyNlbHNlCisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNSLCBjYXJkKTsKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQ1QsIGNhcmQpOworI2VuZGlmCisJc2NhX291dChwb3J0LT5yeHMsIG1zY2kgKyBSWFMsIGNhcmQpOworCXNjYV9vdXQocG9ydC0+dHhzLCBtc2NpICsgVFhTLCBjYXJkKTsKKwlzY2Ffb3V0KENNRF9UWF9FTkFCTEUsIG1zY2kgKyBDTUQsIGNhcmQpOworCXNjYV9vdXQoQ01EX1JYX0VOQUJMRSwgbXNjaSArIENNRCwgY2FyZCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworfQorCisKKworc3RhdGljIHZvaWQgc2NhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisKKwkvKiByZXNldCBjaGFubmVsICovCisJc2NhX291dChDTURfUkVTRVQsIGdldF9tc2NpKHBvcnQpICsgQ01ELCBwb3J0X3RvX2NhcmQocG9ydCkpOworI2lmZGVmIF9fSEQ2NDU3MF9ICisJLyogZGlzYWJsZSBNU0NJIGludGVycnVwdHMgKi8KKwlzY2Ffb3V0KHNjYV9pbihJRVIwLCBjYXJkKSAmIChwaHlfbm9kZShwb3J0KSA/IDB4MEYgOiAweEYwKSwKKwkJSUVSMCwgY2FyZCk7CisJLyogZGlzYWJsZSBETUEgaW50ZXJydXB0cyAqLworCXNjYV9vdXQoc2NhX2luKElFUjEsIGNhcmQpICYgKHBoeV9ub2RlKHBvcnQpID8gMHgwRiA6IDB4RjApLAorCQlJRVIxLCBjYXJkKTsKKyNlbHNlCisJLyogZGlzYWJsZSBETUEgJiBNU0NJIElSUSAqLworCXNjYV9vdXRsKHNjYV9pbmwoSUVSMCwgY2FyZCkgJgorCQkgKHBoeV9ub2RlKHBvcnQpID8gMHgwMEZGMDBGRiA6IDB4RkYwMEZGMDApLCBJRVIwLCBjYXJkKTsKKyNlbmRpZgorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKK30KKworCisKK3N0YXRpYyBpbnQgc2NhX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCWlmIChlbmNvZGluZyAhPSBFTkNPRElOR19OUlogJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaSSAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9NQVJLICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX0ZNX1NQQUNFICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX01BTkNIRVNURVIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcml0eSAhPSBQQVJJVFlfTk9ORSAmJgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMCAmJgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMSAmJgorI2lmZGVmIF9fSEQ2NDU3MF9ICisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUICYmCisjZWxzZQorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCAmJgorI2VuZGlmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl90b19wb3J0KGRldiktPmVuY29kaW5nID0gZW5jb2Rpbmc7CisJZGV2X3RvX3BvcnQoZGV2KS0+cGFyaXR5ID0gcGFyaXR5OworCXJldHVybiAwOworfQorCisKKworI2lmZGVmIERFQlVHX1JJTkdTCitzdGF0aWMgdm9pZCBzY2FfZHVtcF9yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZF90ICpjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCXUxNiBjbnQ7CisjaWYgIWRlZmluZWQoUEFHRTBfQUxXQVlTX01BUFBFRCkgJiYgIWRlZmluZWQoQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQpCisJdTggcGFnZTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUEFHRTBfQUxXQVlTX01BUFBFRCkgJiYgIWRlZmluZWQoQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQpCisJcGFnZSA9IHNjYV9nZXRfcGFnZShjYXJkKTsKKwlvcGVud2luKGNhcmQsIDApOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9ERUJVRyAiUlggcmluZzogQ0RBPSV1IEVEQT0ldSBEU1I9JTAyWCBpbj0ldSAlc2FjdGl2ZSIsCisJICAgICAgIHNjYV9pbmEoZ2V0X2RtYWNfcngocG9ydCkgKyBDREFMLCBjYXJkKSwKKwkgICAgICAgc2NhX2luYShnZXRfZG1hY19yeChwb3J0KSArIEVEQUwsIGNhcmQpLAorCSAgICAgICBzY2FfaW4oRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCksIHBvcnQtPnJ4aW4sCisJICAgICAgIHNjYV9pbihEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKSAmIERTUl9ERT8iIjoiaW4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHBvcnRfdG9fY2FyZChwb3J0KS0+cnhfcmluZ19idWZmZXJzOyBjbnQrKykKKwkJcHJpbnRrKCIgJTAyWCIsIHJlYWRiKCYoZGVzY19hZGRyZXNzKHBvcnQsIGNudCwgMCktPnN0YXQpKSk7CisKKwlwcmludGsoIlxuIiBLRVJOX0RFQlVHICJUWCByaW5nOiBDREE9JXUgRURBPSV1IERTUj0lMDJYIGluPSV1ICIKKwkgICAgICAgImxhc3Q9JXUgJXNhY3RpdmUiLAorCSAgICAgICBzY2FfaW5hKGdldF9kbWFjX3R4KHBvcnQpICsgQ0RBTCwgY2FyZCksCisJICAgICAgIHNjYV9pbmEoZ2V0X2RtYWNfdHgocG9ydCkgKyBFREFMLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKERTUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpLCBwb3J0LT50eGluLCBwb3J0LT50eGxhc3QsCisJICAgICAgIHNjYV9pbihEU1JfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKSAmIERTUl9ERSA/ICIiIDogImluIik7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IHBvcnRfdG9fY2FyZChwb3J0KS0+dHhfcmluZ19idWZmZXJzOyBjbnQrKykKKwkJcHJpbnRrKCIgJTAyWCIsIHJlYWRiKCYoZGVzY19hZGRyZXNzKHBvcnQsIGNudCwgMSktPnN0YXQpKSk7CisJcHJpbnRrKCJcbiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIk1TQ0k6IE1EOiAlMDJ4ICUwMnggJTAyeCwgIgorCSAgICAgICAiU1Q6ICUwMnggJTAyeCAlMDJ4ICUwMngiCisjaWZkZWYgX19IRDY0NTcyX0gKKwkgICAgICAgIiAlMDJ4IgorI2VuZGlmCisJICAgICAgICIsIEZTVDogJTAyeCBDU1Q6ICUwMnggJTAyeFxuIiwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgTUQwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgTUQxLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgTUQyLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1QwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1QxLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1QyLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1QzLCBjYXJkKSwKKyNpZmRlZiBfX0hENjQ1NzJfSAorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBTVDQsIGNhcmQpLAorI2VuZGlmCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIEZTVCwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIENTVDAsIGNhcmQpLAorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBDU1QxLCBjYXJkKSk7CisKKyNpZmRlZiBfX0hENjQ1NzJfSAorCXByaW50ayhLRVJOX0RFQlVHICJJTEFSOiAlMDJ4IElTUjogJTA4eCAlMDh4XG4iLCBzY2FfaW4oSUxBUiwgY2FyZCksCisJICAgICAgIHNjYV9pbmwoSVNSMCwgY2FyZCksIHNjYV9pbmwoSVNSMSwgY2FyZCkpOworI2Vsc2UKKwlwcmludGsoS0VSTl9ERUJVRyAiSVNSOiAlMDJ4ICUwMnggJTAyeFxuIiwgc2NhX2luKElTUjAsIGNhcmQpLAorCSAgICAgICBzY2FfaW4oSVNSMSwgY2FyZCksIHNjYV9pbihJU1IyLCBjYXJkKSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCW9wZW53aW4oY2FyZCwgcGFnZSk7IC8qIFJlc3RvcmUgb3JpZ2luYWwgcGFnZSAqLworI2VuZGlmCit9CisjZW5kaWYgLyogREVCVUdfUklOR1MgKi8KKworCisKK3N0YXRpYyBpbnQgc2NhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmRfdCAqY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwlwa3RfZGVzYyBfX2lvbWVtICpkZXNjOworCXUzMiBidWZmLCBsZW47CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTggcGFnZTsKKwl1MzIgbWF4bGVuOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKworCWRlc2MgPSBkZXNjX2FkZHJlc3MocG9ydCwgcG9ydC0+dHhpbiArIDEsIDEpOworCWlmIChyZWFkYigmZGVzYy0+c3RhdCkpIHsgLyogYWxsb3cgMSBwYWNrZXQgZ2FwICovCisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gLSBwcmV2aW91cyB4bWl0IHNob3VsZCBzdG9wIHF1ZXVlICovCisjaWZkZWYgREVCVUdfUEtUCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgYnVmZmVyIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCQlyZXR1cm4gMTsJLyogcmVxdWVzdCBwYWNrZXQgdG8gYmUgcXVldWVkICovCisJfQorCisjaWZkZWYgREVCVUdfUEtUCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFRYKCVpKToiLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwlkZWJ1Z19mcmFtZShza2IpOworI2VuZGlmCisKKwlkZXNjID0gZGVzY19hZGRyZXNzKHBvcnQsIHBvcnQtPnR4aW4sIDEpOworCWJ1ZmYgPSBidWZmZXJfb2Zmc2V0KHBvcnQsIHBvcnQtPnR4aW4sIDEpOworCWxlbiA9IHNrYi0+bGVuOworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCXBhZ2UgPSBidWZmIC8gd2luc2l6ZShjYXJkKTsKKwlidWZmID0gYnVmZiAlIHdpbnNpemUoY2FyZCk7CisJbWF4bGVuID0gd2luc2l6ZShjYXJkKSAtIGJ1ZmY7CisKKwlvcGVud2luKGNhcmQsIHBhZ2UpOworCWlmIChsZW4gPiBtYXhsZW4pIHsKKwkJbWVtY3B5X3RvaW8od2luYmFzZShjYXJkKSArIGJ1ZmYsIHNrYi0+ZGF0YSwgbWF4bGVuKTsKKwkJb3BlbndpbihjYXJkLCBwYWdlICsgMSk7CisJCW1lbWNweV90b2lvKHdpbmJhc2UoY2FyZCksIHNrYi0+ZGF0YSArIG1heGxlbiwgbGVuIC0gbWF4bGVuKTsKKwl9CisJZWxzZQorI2VuZGlmCisJCW1lbWNweV90b2lvKHdpbmJhc2UoY2FyZCkgKyBidWZmLCBza2ItPmRhdGEsIGxlbik7CisKKyNpZiAhZGVmaW5lZChQQUdFMF9BTFdBWVNfTUFQUEVEKSAmJiAhZGVmaW5lZChBTExfUEFHRVNfQUxXQVlTX01BUFBFRCkKKwlvcGVud2luKGNhcmQsIDApOwkvKiBzZWxlY3QgcGt0X2Rlc2MgdGFibGUgcGFnZSBiYWNrICovCisjZW5kaWYKKwl3cml0ZXcobGVuLCAmZGVzYy0+bGVuKTsKKwl3cml0ZWIoU1RfVFhfRU9NLCAmZGVzYy0+c3RhdCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlwb3J0LT50eGluID0gbmV4dF9kZXNjKHBvcnQsIHBvcnQtPnR4aW4sIDEpOworCXNjYV9vdXRhKGRlc2Nfb2Zmc2V0KHBvcnQsIHBvcnQtPnR4aW4sIDEpLAorCQkgZ2V0X2RtYWNfdHgocG9ydCkgKyBFREFMLCBjYXJkKTsKKworCXNjYV9vdXQoRFNSX0RFLCBEU1JfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsgLyogRW5hYmxlIFRYIERNQSAqLworCisJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT50eGluICsgMSwgMSk7CisJaWYgKHJlYWRiKCZkZXNjLT5zdGF0KSkgLyogYWxsb3cgMSBwYWNrZXQgZ2FwICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworCisjaWZkZWYgTkVFRF9ERVRFQ1RfUkFNCitzdGF0aWMgdTMyIF9fZGV2aW5pdCBzY2FfZGV0ZWN0X3JhbShjYXJkX3QgKmNhcmQsIHU4IF9faW9tZW0gKnJhbWJhc2UsIHUzMiByYW1zaXplKQoreworCS8qIFJvdW5kIFJBTSBzaXplIHRvIDMyIGJpdHMsIGZpbGwgZnJvbSBlbmQgdG8gc3RhcnQgKi8KKwl1MzIgaSA9IHJhbXNpemUgJj0gfjM7CisKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwl1MzIgc2l6ZSA9IHdpbnNpemUoY2FyZCk7CisKKwlvcGVud2luKGNhcmQsIChpIC0gNCkgLyBzaXplKTsgLyogc2VsZWN0IGxhc3Qgd2luZG93ICovCisjZW5kaWYKKwlkbyB7CisJCWkgLT0gNDsKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwkJaWYgKChpICsgNCkgJSBzaXplID09IDApCisJCQlvcGVud2luKGNhcmQsIGkgLyBzaXplKTsKKwkJd3JpdGVsKGkgXiAweDEyMzQ1Njc4LCByYW1iYXNlICsgaSAlIHNpemUpOworI2Vsc2UKKwkJd3JpdGVsKGkgXiAweDEyMzQ1Njc4LCByYW1iYXNlICsgaSk7CisjZW5kaWYKKwl9d2hpbGUgKGkgPiAwKTsKKworCWZvciAoaSA9IDA7IGkgPCByYW1zaXplIDsgaSArPSA0KSB7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJCWlmIChpICUgc2l6ZSA9PSAwKQorCQkJb3BlbndpbihjYXJkLCBpIC8gc2l6ZSk7CisKKwkJaWYgKHJlYWRsKHJhbWJhc2UgKyBpICUgc2l6ZSkgIT0gKGkgXiAweDEyMzQ1Njc4KSkKKwkJCWJyZWFrOworI2Vsc2UKKwkJaWYgKHJlYWRsKHJhbWJhc2UgKyBpKSAhPSAoaSBeIDB4MTIzNDU2NzgpKQorCQkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZiAvKiBORUVEX0RFVEVDVF9SQU0gKi8KKworCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzY2FfaW5pdChjYXJkX3QgKmNhcmQsIGludCB3YWl0X3N0YXRlcykKK3sKKwlzY2Ffb3V0KHdhaXRfc3RhdGVzLCBXQ1JMLCBjYXJkKTsgLyogV2FpdCBDb250cm9sICovCisJc2NhX291dCh3YWl0X3N0YXRlcywgV0NSTSwgY2FyZCk7CisJc2NhX291dCh3YWl0X3N0YXRlcywgV0NSSCwgY2FyZCk7CisKKwlzY2Ffb3V0KDAsIERNRVIsIGNhcmQpOwkvKiBETUEgTWFzdGVyIGRpc2FibGUgKi8KKwlzY2Ffb3V0KDB4MDMsIFBDUiwgY2FyZCk7IC8qIERNQSBwcmlvcml0eSAqLworCXNjYV9vdXQoMCwgRFNSX1JYKDApLCBjYXJkKTsgLyogRE1BIGRpc2FibGUgLSB0byBoYWx0IHN0YXRlICovCisJc2NhX291dCgwLCBEU1JfVFgoMCksIGNhcmQpOworCXNjYV9vdXQoMCwgRFNSX1JYKDEpLCBjYXJkKTsKKwlzY2Ffb3V0KDAsIERTUl9UWCgxKSwgY2FyZCk7CisJc2NhX291dChETUVSX0RNRSwgRE1FUiwgY2FyZCk7IC8qIERNQSBNYXN0ZXIgZW5hYmxlICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWI2ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogQ2lzY28gSERMQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xhcGIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyN1bmRlZiBERUJVR19IQVJEX0hFQURFUgorCisjZGVmaW5lIENJU0NPX01VTFRJQ0FTVAkJMHg4RgkvKiBDaXNjbyBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBDSVNDT19VTklDQVNUCQkweDBGCS8qIENpc2NvIHVuaWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBDSVNDT19LRUVQQUxJVkUJCTB4ODAzNQkvKiBDaXNjbyBrZWVwYWxpdmUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgQ0lTQ09fU1lTX0lORk8JCTB4MjAwMAkvKiBDaXNjbyBpbnRlcmZhY2Uvc3lzdGVtIGluZm8gKi8KKyNkZWZpbmUgQ0lTQ09fQUREUl9SRVEJCTAJLyogQ2lzY28gYWRkcmVzcyByZXF1ZXN0ICovCisjZGVmaW5lIENJU0NPX0FERFJfUkVQTFkJMQkvKiBDaXNjbyBhZGRyZXNzIHJlcGx5ICovCisjZGVmaW5lIENJU0NPX0tFRVBBTElWRV9SRVEJMgkvKiBDaXNjbyBrZWVwYWxpdmUgcmVxdWVzdCAqLworCisKK3N0YXRpYyBpbnQgY2lzY29faGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgdTE2IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwloZGxjX2hlYWRlciAqZGF0YTsKKyNpZmRlZiBERUJVR19IQVJEX0hFQURFUgorCXByaW50ayhLRVJOX0RFQlVHICIlczogY2lzY29faGFyZF9oZWFkZXIgY2FsbGVkXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlza2JfcHVzaChza2IsIHNpemVvZihoZGxjX2hlYWRlcikpOworCWRhdGEgPSAoaGRsY19oZWFkZXIqKXNrYi0+ZGF0YTsKKwlpZiAodHlwZSA9PSBDSVNDT19LRUVQQUxJVkUpCisJCWRhdGEtPmFkZHJlc3MgPSBDSVNDT19NVUxUSUNBU1Q7CisJZWxzZQorCQlkYXRhLT5hZGRyZXNzID0gQ0lTQ09fVU5JQ0FTVDsKKwlkYXRhLT5jb250cm9sID0gMDsKKwlkYXRhLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCisJcmV0dXJuIHNpemVvZihoZGxjX2hlYWRlcik7Cit9CisKKworCitzdGF0aWMgdm9pZCBjaXNjb19rZWVwYWxpdmVfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdHlwZSwKKwkJCQkgdTMyIHBhcjEsIHUzMiBwYXIyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJY2lzY29fcGFja2V0ICpkYXRhOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2YoaGRsY19oZWFkZXIpICsgc2l6ZW9mKGNpc2NvX3BhY2tldCkpOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogTWVtb3J5IHNxdWVlemUgb24gY2lzY29fa2VlcGFsaXZlX3NlbmQoKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLCA0KTsKKwljaXNjb19oYXJkX2hlYWRlcihza2IsIGRldiwgQ0lTQ09fS0VFUEFMSVZFLCBOVUxMLCBOVUxMLCAwKTsKKwlkYXRhID0gKGNpc2NvX3BhY2tldCopc2tiLT50YWlsOworCisJZGF0YS0+dHlwZSA9IGh0b25sKHR5cGUpOworCWRhdGEtPnBhcjEgPSBodG9ubChwYXIxKTsKKwlkYXRhLT5wYXIyID0gaHRvbmwocGFyMik7CisJZGF0YS0+cmVsID0gMHhGRkZGOworCS8qIHdlIHdpbGwgbmVlZCBkb19kaXYgaGVyZSBpZiAxMDAwICUgSFogIT0gMCAqLworCWRhdGEtPnRpbWUgPSBodG9ubCgoamlmZmllcyAtIElOSVRJQUxfSklGRklFUykgKiAoMTAwMCAvIEhaKSk7CisKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKGNpc2NvX3BhY2tldCkpOworCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQorCisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNpc2NvX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2hlYWRlciAqZGF0YSA9IChoZGxjX2hlYWRlciopc2tiLT5kYXRhOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKGhkbGNfaGVhZGVyKSkKKwkJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSERMQyk7CisKKwlpZiAoZGF0YS0+YWRkcmVzcyAhPSBDSVNDT19NVUxUSUNBU1QgJiYKKwkgICAgZGF0YS0+YWRkcmVzcyAhPSBDSVNDT19VTklDQVNUKQorCQlyZXR1cm4gX19jb25zdGFudF9odG9ucyhFVEhfUF9IRExDKTsKKworCXN3aXRjaChkYXRhLT5wcm90b2NvbCkgeworCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQWCk6CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCQlza2JfcHVsbChza2IsIHNpemVvZihoZGxjX2hlYWRlcikpOworCQlyZXR1cm4gZGF0YS0+cHJvdG9jb2w7CisJZGVmYXVsdDoKKwkJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSERMQyk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgY2lzY29fcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWhkbGNfaGVhZGVyICpkYXRhID0gKGhkbGNfaGVhZGVyKilza2ItPmRhdGE7CisJY2lzY29fcGFja2V0ICpjaXNjb19kYXRhOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwl1MzIgYWRkciwgbWFzazsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZihoZGxjX2hlYWRlcikpCisJCWdvdG8gcnhfZXJyb3I7CisKKwlpZiAoZGF0YS0+YWRkcmVzcyAhPSBDSVNDT19NVUxUSUNBU1QgJiYKKwkgICAgZGF0YS0+YWRkcmVzcyAhPSBDSVNDT19VTklDQVNUKQorCQlnb3RvIHJ4X2Vycm9yOworCisJc3dpdGNoKG50b2hzKGRhdGEtPnByb3RvY29sKSkgeworCWNhc2UgQ0lTQ09fU1lTX0lORk86CisJCS8qIFBhY2tldCBpcyBub3QgbmVlZGVkLCBkcm9wIGl0LiAqLworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKKwljYXNlIENJU0NPX0tFRVBBTElWRToKKwkJaWYgKHNrYi0+bGVuICE9IHNpemVvZihoZGxjX2hlYWRlcikgKyBDSVNDT19QQUNLRVRfTEVOICYmCisJCSAgICBza2ItPmxlbiAhPSBzaXplb2YoaGRsY19oZWFkZXIpICsgQ0lTQ09fQklHX1BBQ0tFVF9MRU4pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIGxlbmd0aCBvZiBDaXNjbyAiCisJCQkgICAgICAgImNvbnRyb2wgcGFja2V0ICglZCBieXRlcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQlnb3RvIHJ4X2Vycm9yOworCQl9CisKKwkJY2lzY29fZGF0YSA9IChjaXNjb19wYWNrZXQqKShza2ItPmRhdGEgKyBzaXplb2YoaGRsY19oZWFkZXIpKTsKKworCQlzd2l0Y2gobnRvaGwgKGNpc2NvX2RhdGEtPnR5cGUpKSB7CisJCWNhc2UgQ0lTQ09fQUREUl9SRVE6IC8qIFN0b2xlbiBmcm9tIHN5bmNwcHAuYyA6LSkgKi8KKwkJCWluX2RldiA9IGRldi0+aXBfcHRyOworCQkJYWRkciA9IDA7CisJCQltYXNrID0gfjA7IC8qIGlzIHRoZSBtYXNrIGNvcnJlY3Q/ICovCisKKwkJCWlmIChpbl9kZXYgIT0gTlVMTCkgeworCQkJCXN0cnVjdCBpbl9pZmFkZHIgKippZmFwID0gJmluX2Rldi0+aWZhX2xpc3Q7CisKKwkJCQl3aGlsZSAoKmlmYXAgIT0gTlVMTCkgeworCQkJCQlpZiAoc3RyY21wKGRldi0+bmFtZSwKKwkJCQkJCSAgICgqaWZhcCktPmlmYV9sYWJlbCkgPT0gMCkgeworCQkJCQkJYWRkciA9ICgqaWZhcCktPmlmYV9sb2NhbDsKKwkJCQkJCW1hc2sgPSAoKmlmYXApLT5pZmFfbWFzazsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmYXAgPSAmKCppZmFwKS0+aWZhX25leHQ7CisJCQkJfQorCisJCQkJY2lzY29fa2VlcGFsaXZlX3NlbmQoZGV2LCBDSVNDT19BRERSX1JFUExZLAorCQkJCQkJICAgICBhZGRyLCBtYXNrKTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKKwkJY2FzZSBDSVNDT19BRERSX1JFUExZOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuZXhwZWN0ZWQgQ2lzY28gSVAgYWRkcmVzcyAiCisJCQkgICAgICAgInJlcGx5XG4iLCBkZXYtPm5hbWUpOworCQkJZ290byByeF9lcnJvcjsKKworCQljYXNlIENJU0NPX0tFRVBBTElWRV9SRVE6CisJCQloZGxjLT5zdGF0ZS5jaXNjby5yeHNlcSA9IG50b2hsKGNpc2NvX2RhdGEtPnBhcjEpOworCQkJaWYgKGhkbGMtPnN0YXRlLmNpc2NvLnJlcXVlc3Rfc2VudCAmJgorCQkJICAgIG50b2hsKGNpc2NvX2RhdGEtPnBhcjIpPT1oZGxjLT5zdGF0ZS5jaXNjby50eHNlcSkgeworCQkJCWhkbGMtPnN0YXRlLmNpc2NvLmxhc3RfcG9sbCA9IGppZmZpZXM7CisJCQkJaWYgKCFoZGxjLT5zdGF0ZS5jaXNjby51cCkgeworCQkJCQl1MzIgc2VjLCBtaW4sIGhycywgZGF5czsKKwkJCQkJc2VjID0gbnRvaGwoY2lzY29fZGF0YS0+dGltZSkgLyAxMDAwOworCQkJCQltaW4gPSBzZWMgLyA2MDsgc2VjIC09IG1pbiAqIDYwOworCQkJCQlocnMgPSBtaW4gLyA2MDsgbWluIC09IGhycyAqIDYwOworCQkJCQlkYXlzID0gaHJzIC8gMjQ7IGhycyAtPSBkYXlzICogMjQ7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIHVwIChwZWVyICIKKwkJCQkJICAgICAgICJ1cHRpbWUgJXVkJXVoJXVtJXVzKVxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgZGF5cywgaHJzLAorCQkJCQkgICAgICAgbWluLCBzZWMpOworCQkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkJCWhkbGMtPnN0YXRlLmNpc2NvLnVwID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisJCX0gLyogc3dpdGNoKGtlZXBhbGl2ZSB0eXBlKSAqLworCX0gLyogc3dpdGNoKHByb3RvY29sKSAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIHByb3RvY29sICV4XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGRhdGEtPnByb3RvY29sKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKKworIHJ4X2Vycm9yOgorCWhkbGMtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBNYXJrIGVycm9yICovCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKworCitzdGF0aWMgdm9pZCBjaXNjb190aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopYXJnOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworCWlmIChoZGxjLT5zdGF0ZS5jaXNjby51cCAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGhkbGMtPnN0YXRlLmNpc2NvLmxhc3RfcG9sbCArCisJCSAgICAgICBoZGxjLT5zdGF0ZS5jaXNjby5zZXR0aW5ncy50aW1lb3V0ICogSFopKSB7CisJCWhkbGMtPnN0YXRlLmNpc2NvLnVwID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwl9CisKKwljaXNjb19rZWVwYWxpdmVfc2VuZChkZXYsIENJU0NPX0tFRVBBTElWRV9SRVEsCisJCQkgICAgICsraGRsYy0+c3RhdGUuY2lzY28udHhzZXEsCisJCQkgICAgIGhkbGMtPnN0YXRlLmNpc2NvLnJ4c2VxKTsKKwloZGxjLT5zdGF0ZS5jaXNjby5yZXF1ZXN0X3NlbnQgPSAxOworCWhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MuaW50ZXJ2YWwgKiBIWjsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5mdW5jdGlvbiA9IGNpc2NvX3RpbWVyOworCWhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyLmRhdGEgPSBhcmc7CisJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7Cit9CisKKworCitzdGF0aWMgdm9pZCBjaXNjb19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDA7CisJaGRsYy0+c3RhdGUuY2lzY28ucmVxdWVzdF9zZW50ID0gMDsKKwloZGxjLT5zdGF0ZS5jaXNjby50eHNlcSA9IGhkbGMtPnN0YXRlLmNpc2NvLnJ4c2VxID0gMDsKKworCWluaXRfdGltZXIoJmhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyKTsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOyAvKkZpcnN0IHBvbGwgYWZ0ZXIgMXMqLworCWhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyLmZ1bmN0aW9uID0gY2lzY29fdGltZXI7CisJaGRsYy0+c3RhdGUuY2lzY28udGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlhZGRfdGltZXIoJmhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGNpc2NvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyKTsKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCWhkbGMtPnN0YXRlLmNpc2NvLnVwID0gMDsKKwloZGxjLT5zdGF0ZS5jaXNjby5yZXF1ZXN0X3NlbnQgPSAwOworfQorCisKKworaW50IGhkbGNfY2lzY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJY2lzY29fcHJvdG8gX191c2VyICpjaXNjb19zID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuY2lzY287CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoY2lzY29fcHJvdG8pOworCWNpc2NvX3Byb3RvIG5ld19zZXR0aW5nczsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fQ0lTQ087CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGNpc2NvX3MsICZoZGxjLT5zdGF0ZS5jaXNjby5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0NJU0NPOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2V0dGluZ3MsIGNpc2NvX3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5pbnRlcnZhbCA8IDEgfHwKKwkJICAgIG5ld19zZXR0aW5ncy50aW1lb3V0IDwgMikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJlc3VsdD1oZGxjLT5hdHRhY2goZGV2LCBFTkNPRElOR19OUlosUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCk7CisKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJaGRsY19wcm90b19kZXRhY2goaGRsYyk7CisJCW1lbWNweSgmaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MsICZuZXdfc2V0dGluZ3MsIHNpemUpOworCQltZW1zZXQoJmhkbGMtPnByb3RvLCAwLCBzaXplb2YoaGRsYy0+cHJvdG8pKTsKKworCQloZGxjLT5wcm90by5zdGFydCA9IGNpc2NvX3N0YXJ0OworCQloZGxjLT5wcm90by5zdG9wID0gY2lzY29fc3RvcDsKKwkJaGRsYy0+cHJvdG8ubmV0aWZfcnggPSBjaXNjb19yeDsKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IGNpc2NvX3R5cGVfdHJhbnM7CisJCWhkbGMtPnByb3RvLmlkID0gSUZfUFJPVE9fQ0lTQ087CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRsYy0+eG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IGNpc2NvX2hhcmRfaGVhZGVyOworCQlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlID0gTlVMTDsKKwkJZGV2LT50eXBlID0gQVJQSFJEX0NJU0NPOworCQlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ1MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwpAQCAtMCwwICsxLDEyMzcgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqIEZyYW1lIFJlbGF5IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisKKyAgICAgICAgICAgIFRoZW9yeSBvZiBQVkMgc3RhdGUKKworIERDRSBtb2RlOgorCisgKGV4aXN0LG5ldykgLT4gMCwwIHdoZW4gIlBWQyBjcmVhdGUiIG9yIGlmICJsaW5rIHVucmVsaWFibGUiCisgICAgICAgICAwLHggLT4gMSwxIGlmICJsaW5rIHJlbGlhYmxlIiB3aGVuIHNlbmRpbmcgRlVMTCBTVEFUVVMKKyAgICAgICAgIDEsMSAtPiAxLDAgaWYgcmVjZWl2ZWQgRlVMTCBTVEFUVVMgQUNLCisKKyAoYWN0aXZlKSAgICAtPiAwIHdoZW4gImlmY29uZmlnIFBWQyBkb3duIiBvciAibGluayB1bnJlbGlhYmxlIiBvciAiUFZDIGNyZWF0ZSIKKyAgICAgICAgICAgICAtPiAxIHdoZW4gIlBWQyB1cCIgYW5kIChleGlzdCxuZXcpID0gMSwwCisKKyBEVEUgbW9kZToKKyAoZXhpc3QsbmV3LGFjdGl2ZSkgPSBGVUxMIFNUQVRVUyBpZiAibGluayByZWxpYWJsZSIKKwkJICAgID0gMCwgMCwgMCBpZiAibGluayB1bnJlbGlhYmxlIgorIE5vIExNSToKKyBhY3RpdmUgPSBvcGVuIGFuZCAibGluayByZWxpYWJsZSIKKyBleGlzdCA9IG5ldyA9IG5vdCB1c2VkCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyN1bmRlZiBERUJVR19QS1QKKyN1bmRlZiBERUJVR19FQ04KKyN1bmRlZiBERUJVR19MSU5LCisKKyNkZWZpbmUgTUFYTEVOX0xNSVNUQVQgIDIwCS8qIG1heCBzaXplIG9mIHN0YXR1cyBlbnF1aXJ5IGZyYW1lICovCisKKyNkZWZpbmUgUFZDX1NUQVRFX05FVwkgMHgwMQorI2RlZmluZSBQVkNfU1RBVEVfQUNUSVZFIDB4MDIKKyNkZWZpbmUgUFZDX1NUQVRFX0ZFQ04JIDB4MDggLyogRkVDTiBjb25kaXRpb24gKi8KKyNkZWZpbmUgUFZDX1NUQVRFX0JFQ04JIDB4MTAgLyogQkVDTiBjb25kaXRpb24gKi8KKworCisjZGVmaW5lIEZSX1VJCQkgMHgwMworI2RlZmluZSBGUl9QQUQJCSAweDAwCisKKyNkZWZpbmUgTkxQSURfSVAJIDB4Q0MKKyNkZWZpbmUgTkxQSURfSVBWNgkgMHg4RQorI2RlZmluZSBOTFBJRF9TTkFQCSAweDgwCisjZGVmaW5lIE5MUElEX1BBRAkgMHgwMAorI2RlZmluZSBOTFBJRF9ROTMzCSAweDA4CisKKworI2RlZmluZSBMTUlfRExDSSAgICAgICAgICAgICAgICAgICAwIC8qIExNSSBETENJICovCisjZGVmaW5lIExNSV9QUk9UTyAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTE1JX0NBTExSRUYgICAgICAgICAgICAgMHgwMCAvKiBDYWxsIFJlZmVyZW5jZSAqLworI2RlZmluZSBMTUlfQU5TSV9MT0NLU0hJRlQgICAgICAweDk1IC8qIEFOU0kgbG9ja3NoaWZ0ICovCisjZGVmaW5lIExNSV9SRVBUWVBFICAgICAgICAgICAgICAgIDEgLyogcmVwb3J0IHR5cGUgKi8KKyNkZWZpbmUgTE1JX0NDSVRUX1JFUFRZUEUgICAgICAgMHg1MQorI2RlZmluZSBMTUlfQUxJVkUgICAgICAgICAgICAgICAgICAzIC8qIGtlZXAgYWxpdmUgKi8KKyNkZWZpbmUgTE1JX0NDSVRUX0FMSVZFICAgICAgICAgMHg1MworI2RlZmluZSBMTUlfUFZDU1RBVCAgICAgICAgICAgICAgICA3IC8qIHB2YyBzdGF0dXMgKi8KKyNkZWZpbmUgTE1JX0NDSVRUX1BWQ1NUQVQgICAgICAgMHg1NworI2RlZmluZSBMTUlfRlVMTFJFUCAgICAgICAgICAgICAgICAwIC8qIGZ1bGwgcmVwb3J0ICAqLworI2RlZmluZSBMTUlfSU5URUdSSVRZICAgICAgICAgICAgICAxIC8qIGxpbmsgaW50ZWdyaXR5IHJlcG9ydCAqLworI2RlZmluZSBMTUlfU0lOR0xFICAgICAgICAgICAgICAgICAyIC8qIHNpbmdsZSBwdmMgcmVwb3J0ICovCisjZGVmaW5lIExNSV9TVEFUVVNfRU5RVUlSWSAgICAgIDB4NzUKKyNkZWZpbmUgTE1JX1NUQVRVUyAgICAgICAgICAgICAgMHg3RCAvKiByZXBseSAqLworCisjZGVmaW5lIExNSV9SRVBUX0xFTiAgICAgICAgICAgICAgIDEgLyogcmVwb3J0IHR5cGUgZWxlbWVudCBsZW5ndGggKi8KKyNkZWZpbmUgTE1JX0lOVEVHX0xFTiAgICAgICAgICAgICAgMiAvKiBsaW5rIGludGVncml0eSBlbGVtZW50IGxlbmd0aCAqLworCisjZGVmaW5lIExNSV9MRU5HVEggICAgICAgICAgICAgICAgMTMgLyogc3RhbmRhcmQgTE1JIGZyYW1lIGxlbmd0aCAqLworI2RlZmluZSBMTUlfQU5TSV9MRU5HVEggICAgICAgICAgIDE0CisKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkIGVhMToJMTsKKwl1bnNpZ25lZCBjcjoJMTsKKwl1bnNpZ25lZCBkbGNpaDoJNjsKKyAgCisJdW5zaWduZWQgZWEyOgkxOworCXVuc2lnbmVkIGRlOgkxOworCXVuc2lnbmVkIGJlY246CTE7CisJdW5zaWduZWQgZmVjbjoJMTsKKwl1bnNpZ25lZCBkbGNpbDoJNDsKKyNlbHNlCisJdW5zaWduZWQgZGxjaWg6CTY7CisJdW5zaWduZWQgY3I6CTE7CisJdW5zaWduZWQgZWExOgkxOworCisJdW5zaWduZWQgZGxjaWw6CTQ7CisJdW5zaWduZWQgZmVjbjoJMTsKKwl1bnNpZ25lZCBiZWNuOgkxOworCXVuc2lnbmVkIGRlOgkxOworCXVuc2lnbmVkIGVhMjoJMTsKKyNlbmRpZgorfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmcl9oZHI7CisKKworc3RhdGljIGlubGluZSB1MTYgcTkyMl90b19kbGNpKHU4ICpoZHIpCit7CisJcmV0dXJuICgoaGRyWzBdICYgMHhGQykgPDwgMikgfCAoKGhkclsxXSAmIDB4RjApID4+IDQpOworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGRsY2lfdG9fcTkyMih1OCAqaGRyLCB1MTYgZGxjaSkKK3sKKwloZHJbMF0gPSAoZGxjaSA+PiAyKSAmIDB4RkM7CisJaGRyWzFdID0gKChkbGNpIDw8IDQpICYgMHhGMCkgfCAweDAxOworfQorCisKKworc3RhdGljIGlubGluZSBwdmNfZGV2aWNlKiBmaW5kX3B2YyhoZGxjX2RldmljZSAqaGRsYywgdTE2IGRsY2kpCit7CisJcHZjX2RldmljZSAqcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJd2hpbGUgKHB2YykgeworCQlpZiAocHZjLT5kbGNpID09IGRsY2kpCisJCQlyZXR1cm4gcHZjOworCQlpZiAocHZjLT5kbGNpID4gZGxjaSkKKwkJCXJldHVybiBOVUxMOyAvKiB0aGUgbGlzdGVkIGlzIHNvcnRlZCAqLworCQlwdmMgPSBwdmMtPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGlubGluZSBwdmNfZGV2aWNlKiBhZGRfcHZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkbGNpKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwdmNfZGV2aWNlICpwdmMsICoqcHZjX3AgPSAmaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJd2hpbGUgKCpwdmNfcCkgeworCQlpZiAoKCpwdmNfcCktPmRsY2kgPT0gZGxjaSkKKwkJCXJldHVybiAqcHZjX3A7CisJCWlmICgoKnB2Y19wKS0+ZGxjaSA+IGRsY2kpCisJCQlicmVhazsJLyogdGhlIGxpc3QgaXMgc29ydGVkICovCisJCXB2Y19wID0gJigqcHZjX3ApLT5uZXh0OworCX0KKworCXB2YyA9IGttYWxsb2Moc2l6ZW9mKHB2Y19kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXB2YykKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQocHZjLCAwLCBzaXplb2YocHZjX2RldmljZSkpOworCXB2Yy0+ZGxjaSA9IGRsY2k7CisJcHZjLT5tYXN0ZXIgPSBkZXY7CisJcHZjLT5uZXh0ID0gKnB2Y19wOwkvKiBQdXQgaXQgaW4gdGhlIGNoYWluICovCisJKnB2Y19wID0gcHZjOworCXJldHVybiBwdmM7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHZjX2lzX3VzZWQocHZjX2RldmljZSAqcHZjKQoreworCXJldHVybiBwdmMtPm1haW4gIT0gTlVMTCB8fCBwdmMtPmV0aGVyICE9IE5VTEw7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHB2Y19jYXJyaWVyKGludCBvbiwgcHZjX2RldmljZSAqcHZjKQoreworCWlmIChvbikgeworCQlpZiAocHZjLT5tYWluKQorCQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHB2Yy0+bWFpbikpCisJCQkJbmV0aWZfY2Fycmllcl9vbihwdmMtPm1haW4pOworCQlpZiAocHZjLT5ldGhlcikKKwkJCWlmICghbmV0aWZfY2Fycmllcl9vayhwdmMtPmV0aGVyKSkKKwkJCQluZXRpZl9jYXJyaWVyX29uKHB2Yy0+ZXRoZXIpOworCX0gZWxzZSB7CisJCWlmIChwdmMtPm1haW4pCisJCQlpZiAobmV0aWZfY2Fycmllcl9vayhwdmMtPm1haW4pKQorCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHB2Yy0+bWFpbik7CisJCWlmIChwdmMtPmV0aGVyKQorCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHZjLT5ldGhlcikpCisJCQkJbmV0aWZfY2Fycmllcl9vZmYocHZjLT5ldGhlcik7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxldGVfdW51c2VkX3B2Y3MoaGRsY19kZXZpY2UgKmhkbGMpCit7CisJcHZjX2RldmljZSAqKnB2Y19wID0gJmhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlICgqcHZjX3ApIHsKKwkJaWYgKCFwdmNfaXNfdXNlZCgqcHZjX3ApKSB7CisJCQlwdmNfZGV2aWNlICpwdmMgPSAqcHZjX3A7CisJCQkqcHZjX3AgPSBwdmMtPm5leHQ7CisJCQlrZnJlZShwdmMpOworCQkJY29udGludWU7CisJCX0KKwkJcHZjX3AgPSAmKCpwdmNfcCktPm5leHQ7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UqKiBnZXRfZGV2X3AocHZjX2RldmljZSAqcHZjLCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAmcHZjLT5ldGhlcjsKKwllbHNlCisJCXJldHVybiAmcHZjLT5tYWluOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IHN0YXR1c190b19kbGNpKHU4ICpzdGF0dXMsIGludCAqYWN0aXZlLCBpbnQgKm5ldykKK3sKKwkqbmV3ID0gKHN0YXR1c1syXSAmIDB4MDgpID8gMSA6IDA7CisJKmFjdGl2ZSA9IChzdGF0dXNbMl0gJiAweDAyKSA/IDEgOiAwOworCisJcmV0dXJuICgoc3RhdHVzWzBdICYgMHgzRikgPDwgNCkgfCAoKHN0YXR1c1sxXSAmIDB4NzgpID4+IDMpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbGNpX3RvX3N0YXR1cyh1MTYgZGxjaSwgdTggKnN0YXR1cywgaW50IGFjdGl2ZSwgaW50IG5ldykKK3sKKwlzdGF0dXNbMF0gPSAoZGxjaSA+PiA0KSAmIDB4M0Y7CisJc3RhdHVzWzFdID0gKChkbGNpIDw8IDMpICYgMHg3OCkgfCAweDgwOworCXN0YXR1c1syXSA9IDB4ODA7CisKKwlpZiAobmV3KQorCQlzdGF0dXNbMl0gfD0gMHgwODsKKwllbHNlIGlmIChhY3RpdmUpCisJCXN0YXR1c1syXSB8PSAweDAyOworfQorCisKKworc3RhdGljIGludCBmcl9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYl9wLCB1MTYgZGxjaSkKK3sKKwl1MTYgaGVhZF9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JfcDsKKworCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgeworCWNhc2UgX19jb25zdGFudF9udG9ocyhFVEhfUF9JUCk6CisJCWhlYWRfbGVuID0gNDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0lQOworCQlicmVhazsKKworCWNhc2UgX19jb25zdGFudF9udG9ocyhFVEhfUF9JUFY2KToKKwkJaGVhZF9sZW4gPSA0OworCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKKwkJc2tiLT5kYXRhWzNdID0gTkxQSURfSVBWNjsKKwkJYnJlYWs7CisKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoTE1JX1BST1RPKToKKwkJaGVhZF9sZW4gPSA0OworCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKKwkJc2tiLT5kYXRhWzNdID0gTE1JX1BST1RPOworCQlicmVhazsKKworCWNhc2UgX19jb25zdGFudF9udG9ocyhFVEhfUF84MDJfMyk6CisJCWhlYWRfbGVuID0gMTA7CisJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGhlYWRfbGVuKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwKKwkJCQkJCQkJICAgIGhlYWRfbGVuKTsKKwkJCWlmICghc2tiMikKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSAqc2tiX3AgPSBza2IyOworCQl9CisJCXNrYl9wdXNoKHNrYiwgaGVhZF9sZW4pOworCQlza2ItPmRhdGFbM10gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs0XSA9IE5MUElEX1NOQVA7CisJCXNrYi0+ZGF0YVs1XSA9IEZSX1BBRDsKKwkJc2tiLT5kYXRhWzZdID0gMHg4MDsKKwkJc2tiLT5kYXRhWzddID0gMHhDMjsKKwkJc2tiLT5kYXRhWzhdID0gMHgwMDsKKwkJc2tiLT5kYXRhWzldID0gMHgwNzsgLyogYnJpZGdlZCBFdGhlcm5ldCBmcmFtZSB3L291dCBGQ1MgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZWFkX2xlbiA9IDEwOworCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKKwkJc2tiLT5kYXRhWzNdID0gRlJfUEFEOworCQlza2ItPmRhdGFbNF0gPSBOTFBJRF9TTkFQOworCQlza2ItPmRhdGFbNV0gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs2XSA9IEZSX1BBRDsKKwkJc2tiLT5kYXRhWzddID0gRlJfUEFEOworCQkqKHUxNiopKHNrYi0+ZGF0YSArIDgpID0gc2tiLT5wcm90b2NvbDsKKwl9CisKKwlkbGNpX3RvX3E5MjIoc2tiLT5kYXRhLCBkbGNpKTsKKwlza2ItPmRhdGFbMl0gPSBGUl9VSTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisKKwlpZiAoKHB2Yy0+bWFzdGVyLT5mbGFncyAmIElGRl9VUCkgPT0gMCkKKwkJcmV0dXJuIC1FSU87ICAvKiBNYXN0ZXIgbXVzdCBiZSBVUCBpbiBvcmRlciB0byBhY3RpdmF0ZSBQVkMgKi8KKworCWlmIChwdmMtPm9wZW5fY291bnQrKyA9PSAwKSB7CisJCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMocHZjLT5tYXN0ZXIpOworCQlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9OT05FKQorCQkJcHZjLT5zdGF0ZS5hY3RpdmUgPSBoZGxjLT5jYXJyaWVyOworCisJCXB2Y19jYXJyaWVyKHB2Yy0+c3RhdGUuYWN0aXZlLCBwdmMpOworCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDE7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBwdmNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisKKwlpZiAoLS1wdmMtPm9wZW5fY291bnQgPT0gMCkgeworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKHB2Yy0+bWFzdGVyKTsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfTk9ORSkKKwkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gMDsKKworCQlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlKSB7CisJCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDE7CisJCQlwdmMtPnN0YXRlLmFjdGl2ZSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgcHZjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXB2Y19kZXZpY2UgKnB2YyA9IGRldl90b19wdmMoZGV2KTsKKwlmcl9wcm90b19wdmNfaW5mbyBpbmZvOworCisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPT0gSUZfR0VUX1BST1RPKSB7CisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX0ZSX0VUSF9QVkM7CisJCWVsc2UKKwkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19GUl9QVkM7CisKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplb2YoaW5mbykpIHsKKwkJCS8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplb2YoaW5mbyk7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKworCQlpbmZvLmRsY2kgPSBwdmMtPmRsY2k7CisJCW1lbWNweShpbmZvLm1hc3RlciwgcHZjLT5tYXN0ZXItPm5hbWUsIElGTkFNU0laKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5mcl9wdmNfaW5mbywKKwkJCQkgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHZjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCisKKworc3RhdGljIGludCBwdmNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXB2Y19kZXZpY2UgKnB2YyA9IGRldl90b19wdmMoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBwdmNfZ2V0X3N0YXRzKGRldik7CisKKwlpZiAocHZjLT5zdGF0ZS5hY3RpdmUpIHsKKwkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpIHsKKwkJCWludCBwYWQgPSBFVEhfWkxFTiAtIHNrYi0+bGVuOworCQkJaWYgKHBhZCA+IDApIHsgLyogUGFkIHRoZSBmcmFtZSB3aXRoIHplcm9zICovCisJCQkJaW50IGxlbiA9IHNrYi0+bGVuOworCQkJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHBhZCkKKwkJCQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBwYWQsCisJCQkJCQkJICAgICBHRlBfQVRPTUlDKSkgeworCQkJCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJc2tiX3B1dChza2IsIHBhZCk7CisJCQkJbWVtc2V0KHNrYi0+ZGF0YSArIGxlbiwgMCwgcGFkKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKKwkJfQorCQlpZiAoIWZyX2hhcmRfaGVhZGVyKCZza2IsIHB2Yy0+ZGxjaSkpIHsKKwkJCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlpZiAocHZjLT5zdGF0ZS5mZWNuKSAvKiBUWCBDb25nZXN0aW9uIGNvdW50ZXIgKi8KKwkJCQlzdGF0cy0+dHhfY29tcHJlc3NlZCsrOworCQkJc2tiLT5kZXYgPSBwdmMtPm1hc3RlcjsKKwkJCWRldl9xdWV1ZV94bWl0KHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN0YXRzLT50eF9kcm9wcGVkKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBwdmNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBIRExDX01BWF9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgZnJfbG9nX2RsY2lfYWN0aXZlKHB2Y19kZXZpY2UgKnB2YykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogRExDSSAlZCBbJXMlcyVzXSVzICVzXG4iLAorCSAgICAgICBwdmMtPm1hc3Rlci0+bmFtZSwKKwkgICAgICAgcHZjLT5kbGNpLAorCSAgICAgICBwdmMtPm1haW4gPyBwdmMtPm1haW4tPm5hbWUgOiAiIiwKKwkgICAgICAgcHZjLT5tYWluICYmIHB2Yy0+ZXRoZXIgPyAiICIgOiAiIiwKKwkgICAgICAgcHZjLT5ldGhlciA/IHB2Yy0+ZXRoZXItPm5hbWUgOiAiIiwKKwkgICAgICAgcHZjLT5zdGF0ZS5uZXcgPyAiIG5ldyIgOiAiIiwKKwkgICAgICAgIXB2Yy0+c3RhdGUuZXhpc3QgPyAiZGVsZXRlZCIgOgorCSAgICAgICBwdmMtPnN0YXRlLmFjdGl2ZSA/ICJhY3RpdmUiIDogImluYWN0aXZlIik7Cit9CisKKworCitzdGF0aWMgaW5saW5lIHU4IGZyX2xtaV9uZXh0c2VxKHU4IHgpCit7CisJeCsrOworCXJldHVybiB4ID8geCA6IDE7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9sbWlfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnVsbHJlcCkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlwdmNfZGV2aWNlICpwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisJaW50IGxlbiA9IChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpID8gTE1JX0FOU0lfTEVOR1RICisJCTogTE1JX0xFTkdUSDsKKwlpbnQgc3RhdF9sZW4gPSAzOworCXU4ICpkYXRhOworCWludCBpID0gMDsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgJiYgZnVsbHJlcCkgeworCQlsZW4gKz0gaGRsYy0+c3RhdGUuZnIuZGNlX3B2Y19jb3VudCAqICgyICsgc3RhdF9sZW4pOworCQlpZiAobGVuID4gSERMQ19NQVhfTVJVKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG1hbnkgUFZDcyB3aGlsZSBzZW5kaW5nICIKKwkJCSAgICAgICAiTE1JIGZ1bGwgcmVwb3J0XG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSBvbiBmcl9sbWlfc2VuZCgpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoc2tiLT5kYXRhLCAwLCBsZW4pOworCXNrYl9yZXNlcnZlKHNrYiwgNCk7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoTE1JX1BST1RPKTsKKwlmcl9oYXJkX2hlYWRlcigmc2tiLCBMTUlfRExDSSk7CisJZGF0YSA9IHNrYi0+dGFpbDsKKwlkYXRhW2krK10gPSBMTUlfQ0FMTFJFRjsKKwlkYXRhW2krK10gPSBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UKKwkJPyBMTUlfU1RBVFVTIDogTE1JX1NUQVRVU19FTlFVSVJZOworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpCisJCWRhdGFbaSsrXSA9IExNSV9BTlNJX0xPQ0tTSElGVDsKKwlkYXRhW2krK10gPSAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkJPyBMTUlfQ0NJVFRfUkVQVFlQRSA6IExNSV9SRVBUWVBFOworCWRhdGFbaSsrXSA9IExNSV9SRVBUX0xFTjsKKwlkYXRhW2krK10gPSBmdWxscmVwID8gTE1JX0ZVTExSRVAgOiBMTUlfSU5URUdSSVRZOworCisJZGF0YVtpKytdID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQ0NJVFQpCisJCT8gTE1JX0NDSVRUX0FMSVZFIDogTE1JX0FMSVZFOworCWRhdGFbaSsrXSA9IExNSV9JTlRFR19MRU47CisJZGF0YVtpKytdID0gaGRsYy0+c3RhdGUuZnIudHhzZXEgPWZyX2xtaV9uZXh0c2VxKGhkbGMtPnN0YXRlLmZyLnR4c2VxKTsKKwlkYXRhW2krK10gPSBoZGxjLT5zdGF0ZS5mci5yeHNlcTsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgJiYgZnVsbHJlcCkgeworCQl3aGlsZSAocHZjKSB7CisJCQlkYXRhW2krK10gPSAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkJCQk/IExNSV9DQ0lUVF9QVkNTVEFUIDogTE1JX1BWQ1NUQVQ7CisJCQlkYXRhW2krK10gPSBzdGF0X2xlbjsKKworCQkJLyogTE1JIHN0YXJ0L3Jlc3RhcnQgKi8KKwkJCWlmIChoZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSAmJiAhcHZjLT5zdGF0ZS5leGlzdCkgeworCQkJCXB2Yy0+c3RhdGUuZXhpc3QgPSBwdmMtPnN0YXRlLm5ldyA9IDE7CisJCQkJZnJfbG9nX2RsY2lfYWN0aXZlKHB2Yyk7CisJCQl9CisKKwkJCS8qIGlmY29uZmlnIFBWQyB1cCAqLworCQkJaWYgKHB2Yy0+b3Blbl9jb3VudCAmJiAhcHZjLT5zdGF0ZS5hY3RpdmUgJiYKKwkJCSAgICBwdmMtPnN0YXRlLmV4aXN0ICYmICFwdmMtPnN0YXRlLm5ldykgeworCQkJCXB2Y19jYXJyaWVyKDEsIHB2Yyk7CisJCQkJcHZjLT5zdGF0ZS5hY3RpdmUgPSAxOworCQkJCWZyX2xvZ19kbGNpX2FjdGl2ZShwdmMpOworCQkJfQorCisJCQlkbGNpX3RvX3N0YXR1cyhwdmMtPmRsY2ksIGRhdGEgKyBpLAorCQkJCSAgICAgICBwdmMtPnN0YXRlLmFjdGl2ZSwgcHZjLT5zdGF0ZS5uZXcpOworCQkJaSArPSBzdGF0X2xlbjsKKwkJCXB2YyA9IHB2Yy0+bmV4dDsKKwkJfQorCX0KKworCXNrYl9wdXQoc2tiLCBpKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3NldF9saW5rX3N0YXRlKGludCByZWxpYWJsZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcHZjX2RldmljZSAqcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJaGRsYy0+c3RhdGUuZnIucmVsaWFibGUgPSByZWxpYWJsZTsKKwlpZiAocmVsaWFibGUpIHsKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisKKwkJaGRsYy0+c3RhdGUuZnIubjM5MWNudCA9IDA7IC8qIFJlcXVlc3QgZnVsbCBzdGF0dXMgKi8KKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCisJCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX05PTkUpIHsKKwkJCXdoaWxlIChwdmMpIHsJLyogQWN0aXZhdGUgYWxsIFBWQ3MgKi8KKwkJCQlwdmNfY2FycmllcigxLCBwdmMpOworCQkJCXB2Yy0+c3RhdGUuZXhpc3QgPSBwdmMtPnN0YXRlLmFjdGl2ZSA9IDE7CisJCQkJcHZjLT5zdGF0ZS5uZXcgPSAwOworCQkJCXB2YyA9IHB2Yy0+bmV4dDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCXdoaWxlIChwdmMpIHsJCS8qIERlYWN0aXZhdGUgYWxsIFBWQ3MgKi8KKwkJCXB2Y19jYXJyaWVyKDAsIHB2Yyk7CisJCQlwdmMtPnN0YXRlLmV4aXN0ID0gcHZjLT5zdGF0ZS5hY3RpdmUgPSAwOworCQkJcHZjLT5zdGF0ZS5uZXcgPSAwOworCQkJcHZjID0gcHZjLT5uZXh0OworCQl9CisJfQorfQorCisKKworc3RhdGljIHZvaWQgZnJfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaW50IGksIGNudCA9IDAsIHJlbGlhYmxlOworCXUzMiBsaXN0OworCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkKKwkJcmVsaWFibGUgPSBoZGxjLT5zdGF0ZS5mci5yZXF1ZXN0ICYmCisJCQl0aW1lX2JlZm9yZShqaWZmaWVzLCBoZGxjLT5zdGF0ZS5mci5sYXN0X3BvbGwgKworCQkJCSAgICBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy50MzkyICogSFopOworCWVsc2UgeworCQloZGxjLT5zdGF0ZS5mci5sYXN0X2Vycm9ycyA8PD0gMTsgLyogU2hpZnQgdGhlIGxpc3QgKi8KKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnJlcXVlc3QpIHsKKwkJCWlmIChoZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gTE1JIHN0YXR1cyByZXBseSAiCisJCQkJICAgICAgICJyZWNlaXZlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWhkbGMtPnN0YXRlLmZyLmxhc3RfZXJyb3JzIHw9IDE7CisJCX0KKworCQlsaXN0ID0gaGRsYy0+c3RhdGUuZnIubGFzdF9lcnJvcnM7CisJCWZvciAoaSA9IDA7IGkgPCBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5uMzkzOyBpKyssIGxpc3QgPj49IDEpCisJCQljbnQgKz0gKGxpc3QgJiAxKTsJLyogZXJyb3JzIGNvdW50ICovCisKKwkJcmVsaWFibGUgPSAoY250IDwgaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubjM5Mik7CisJfQorCisJaWYgKGhkbGMtPnN0YXRlLmZyLnJlbGlhYmxlICE9IHJlbGlhYmxlKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rICVzcmVsaWFibGVcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIHJlbGlhYmxlID8gIiIgOiAidW4iKTsKKwkJZnJfc2V0X2xpbmtfc3RhdGUocmVsaWFibGUsIGRldik7CisJfQorCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkKKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MudDM5MiAqIEhaOworCWVsc2UgeworCQlpZiAoaGRsYy0+c3RhdGUuZnIubjM5MWNudCkKKwkJCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQtLTsKKworCQlmcl9sbWlfc2VuZChkZXYsIGhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPT0gMCk7CisKKwkJaGRsYy0+c3RhdGUuZnIubGFzdF9wb2xsID0gamlmZmllczsKKwkJaGRsYy0+c3RhdGUuZnIucmVxdWVzdCA9IDE7CisJCWhkbGMtPnN0YXRlLmZyLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCWhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLnQzOTEgKiBIWjsKKwl9CisKKwloZGxjLT5zdGF0ZS5mci50aW1lci5mdW5jdGlvbiA9IGZyX3RpbWVyOworCWhkbGMtPnN0YXRlLmZyLnRpbWVyLmRhdGEgPSBhcmc7CisJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5mci50aW1lcik7Cit9CisKKworCitzdGF0aWMgaW50IGZyX2xtaV9yZWN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCBzdGF0X2xlbjsKKwlwdmNfZGV2aWNlICpwdmM7CisJaW50IHJlcHR5cGUgPSAtMSwgZXJyb3IsIG5vX3JhbTsKKwl1OCByeHNlcSwgdHhzZXE7CisJaW50IGk7CisKKwlpZiAoc2tiLT5sZW4gPCAoKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQU5TSSkKKwkJCT8gTE1JX0FOU0lfTEVOR1RIIDogTE1JX0xFTkdUSCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNob3J0IExNSSBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNrYi0+ZGF0YVs1XSAhPSAoIWhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSA/CisJCQkgICAgIExNSV9TVEFUVVMgOiBMTUlfU1RBVFVTX0VOUVVJUlkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMTUkgbXNndHlwZT0leCwgTm90IExNSSBzdGF0dXMgJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVsyXSwKKwkJICAgICAgIGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSA/ICJlbnF1aXJ5IiA6ICJyZXBseSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQU5TSSkgPyA3IDogNjsKKworCWlmIChza2ItPmRhdGFbaV0gIT0KKwkgICAgKChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0NDSVRUKQorCSAgICAgPyBMTUlfQ0NJVFRfUkVQVFlQRSA6IExNSV9SRVBUWVBFKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTm90IGEgcmVwb3J0IHR5cGU9JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCXJldHVybiAxOworCX0KKwlpKys7CisKKwlpKys7CQkJCS8qIFNraXAgbGVuZ3RoIGZpZWxkICovCisKKwlyZXB0eXBlID0gc2tiLT5kYXRhW2krK107CisKKwlpZiAoc2tiLT5kYXRhW2ldIT0KKwkgICAgKChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0NDSVRUKQorCSAgICAgPyBMTUlfQ0NJVFRfQUxJVkUgOiBMTUlfQUxJVkUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBzdGF0dXMgZWxlbWVudD0leFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc2tiLT5kYXRhW2ldKTsKKwkJcmV0dXJuIDE7CisJfQorCWkrKzsKKworCWkrKzsJCQkvKiBTa2lwIGxlbmd0aCBmaWVsZCAqLworCisJaGRsYy0+c3RhdGUuZnIucnhzZXEgPSBza2ItPmRhdGFbaSsrXTsgLyogVFggc2VxdWVuY2UgZnJvbSBwZWVyICovCisJcnhzZXEgPSBza2ItPmRhdGFbaSsrXTsJLyogU2hvdWxkIGNvbmZpcm0gb3VyIHNlcXVlbmNlICovCisKKwl0eHNlcSA9IGhkbGMtPnN0YXRlLmZyLnR4c2VxOworCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkgeworCQlpZiAocmVwdHlwZSAhPSBMTUlfRlVMTFJFUCAmJiByZXB0eXBlICE9IExNSV9JTlRFR1JJVFkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCByZXBvcnQgdHlwZT0leFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJlcHR5cGUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaGRsYy0+c3RhdGUuZnIubGFzdF9wb2xsID0gamlmZmllczsKKwl9CisKKwllcnJvciA9IDA7CisJaWYgKCFoZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSkKKwkJZXJyb3IgPSAxOworCisJaWYgKHJ4c2VxID09IDAgfHwgcnhzZXEgIT0gdHhzZXEpIHsKKwkJaGRsYy0+c3RhdGUuZnIubjM5MWNudCA9IDA7IC8qIEFzayBmb3IgZnVsbCByZXBvcnQgbmV4dCB0aW1lICovCisJCWVycm9yID0gMTsKKwl9CisKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlKSB7CisJCWlmIChoZGxjLT5zdGF0ZS5mci5mdWxscmVwX3NlbnQgJiYgIWVycm9yKSB7CisvKiBTdG9wIHNlbmRpbmcgZnVsbCByZXBvcnQgLSB0aGUgbGFzdCBvbmUgaGFzIGJlZW4gY29uZmlybWVkIGJ5IERURSAqLworCQkJaGRsYy0+c3RhdGUuZnIuZnVsbHJlcF9zZW50ID0gMDsKKwkJCXB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKwkJCXdoaWxlIChwdmMpIHsKKwkJCQlpZiAocHZjLT5zdGF0ZS5uZXcpIHsKKwkJCQkJcHZjLT5zdGF0ZS5uZXcgPSAwOworCisvKiBUZWxsIERURSB0aGF0IG5ldyBQVkMgaXMgbm93IGFjdGl2ZSAqLworCQkJCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDE7CisJCQkJfQorCQkJCXB2YyA9IHB2Yy0+bmV4dDsKKwkJCX0KKwkJfQorCisJCWlmIChoZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCkgeworCQkJcmVwdHlwZSA9IExNSV9GVUxMUkVQOworCQkJaGRsYy0+c3RhdGUuZnIuZnVsbHJlcF9zZW50ID0gMTsKKwkJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMDsKKwkJfQorCisJCWZyX2xtaV9zZW5kKGRldiwgcmVwdHlwZSA9PSBMTUlfRlVMTFJFUCA/IDEgOiAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRFRFICovCisKKwloZGxjLT5zdGF0ZS5mci5yZXF1ZXN0ID0gMDsgLyogZ290IHJlc3BvbnNlLCBubyByZXF1ZXN0IHBlbmRpbmcgKi8KKworCWlmIChlcnJvcikKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVwdHlwZSAhPSBMTUlfRlVMTFJFUCkKKwkJcmV0dXJuIDA7CisKKwlzdGF0X2xlbiA9IDM7CisJcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJd2hpbGUgKHB2YykgeworCQlwdmMtPnN0YXRlLmRlbGV0ZWQgPSAxOworCQlwdmMgPSBwdmMtPm5leHQ7CisJfQorCisJbm9fcmFtID0gMDsKKwl3aGlsZSAoc2tiLT5sZW4gPj0gaSArIDIgKyBzdGF0X2xlbikgeworCQl1MTYgZGxjaTsKKwkJdW5zaWduZWQgaW50IGFjdGl2ZSwgbmV3OworCisJCWlmIChza2ItPmRhdGFbaV0gIT0gKChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0NDSVRUKQorCQkJCSAgICAgPyBMTUlfQ0NJVFRfUFZDU1RBVCA6IExNSV9QVkNTVEFUKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgUFZDU1RBVCBJRDogJXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaSsrOworCisJCWlmIChza2ItPmRhdGFbaV0gIT0gc3RhdF9sZW4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIFBWQ1NUQVQgbGVuZ3RoOiAleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpKys7CisKKwkJZGxjaSA9IHN0YXR1c190b19kbGNpKHNrYi0+ZGF0YSArIGksICZhY3RpdmUsICZuZXcpOworCisJCXB2YyA9IGFkZF9wdmMoZGV2LCBkbGNpKTsKKworCQlpZiAoIXB2YyAmJiAhbm9fcmFtKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBNZW1vcnkgc3F1ZWV6ZSBvbiBmcl9sbWlfcmVjdigpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlub19yYW0gPSAxOworCQl9CisKKwkJaWYgKHB2YykgeworCQkJcHZjLT5zdGF0ZS5leGlzdCA9IDE7CisJCQlwdmMtPnN0YXRlLmRlbGV0ZWQgPSAwOworCQkJaWYgKGFjdGl2ZSAhPSBwdmMtPnN0YXRlLmFjdGl2ZSB8fAorCQkJICAgIG5ldyAhPSBwdmMtPnN0YXRlLm5ldyB8fAorCQkJICAgICFwdmMtPnN0YXRlLmV4aXN0KSB7CisJCQkJcHZjLT5zdGF0ZS5uZXcgPSBuZXc7CisJCQkJcHZjLT5zdGF0ZS5hY3RpdmUgPSBhY3RpdmU7CisJCQkJcHZjX2NhcnJpZXIoYWN0aXZlLCBwdmMpOworCQkJCWZyX2xvZ19kbGNpX2FjdGl2ZShwdmMpOworCQkJfQorCQl9CisKKwkJaSArPSBzdGF0X2xlbjsKKwl9CisKKwlwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisKKwl3aGlsZSAocHZjKSB7CisJCWlmIChwdmMtPnN0YXRlLmRlbGV0ZWQgJiYgcHZjLT5zdGF0ZS5leGlzdCkgeworCQkJcHZjX2NhcnJpZXIoMCwgcHZjKTsKKwkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gcHZjLT5zdGF0ZS5uZXcgPSAwOworCQkJcHZjLT5zdGF0ZS5leGlzdCA9IDA7CisJCQlmcl9sb2dfZGxjaV9hY3RpdmUocHZjKTsKKwkJfQorCQlwdmMgPSBwdmMtPm5leHQ7CisJfQorCisJLyogTmV4dCBmdWxsIHJlcG9ydCBhZnRlciBOMzkxIHBvbGxzICovCisJaGRsYy0+c3RhdGUuZnIubjM5MWNudCA9IGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLm4zOTE7CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgZnJfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHNrYi0+ZGV2OworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMobmRldik7CisJZnJfaGRyICpmaCA9IChmcl9oZHIqKXNrYi0+ZGF0YTsKKwl1OCAqZGF0YSA9IHNrYi0+ZGF0YTsKKwl1MTYgZGxjaTsKKwlwdmNfZGV2aWNlICpwdmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwlpZiAoc2tiLT5sZW4gPD0gNCB8fCBmaC0+ZWExIHx8IGRhdGFbMl0gIT0gRlJfVUkpCisJCWdvdG8gcnhfZXJyb3I7CisKKwlkbGNpID0gcTkyMl90b19kbGNpKHNrYi0+ZGF0YSk7CisKKwlpZiAoZGxjaSA9PSBMTUlfRExDSSkgeworCQlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9OT05FKQorCQkJZ290byByeF9lcnJvcjsgLyogTE1JIHBhY2tldCB3aXRoIG5vIExNST8gKi8KKworCQlpZiAoZGF0YVszXSA9PSBMTUlfUFJPVE8pIHsKKwkJCWlmIChmcl9sbWlfcmVjdihuZGV2LCBza2IpKQorCQkJCWdvdG8gcnhfZXJyb3I7CisJCQllbHNlIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBub24tTE1JIGZyYW1lIHdpdGggTE1JIERMQ0lcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJZ290byByeF9lcnJvcjsKKwl9CisKKwlwdmMgPSBmaW5kX3B2YyhoZGxjLCBkbGNpKTsKKwlpZiAoIXB2YykgeworI2lmZGVmIERFQlVHX1BLVAorCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gUFZDIGZvciByZWNlaXZlZCBmcmFtZSdzIERMQ0kgJWRcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lLCBkbGNpKTsKKyNlbmRpZgorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisJaWYgKHB2Yy0+c3RhdGUuZmVjbiAhPSBmaC0+ZmVjbikgeworI2lmZGVmIERFQlVHX0VDTgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERMQ0kgJWQgRkVDTiBPJXNcbiIsIG5kZXYtPm5hbWUsCisJCSAgICAgICBkbGNpLCBmaC0+ZmVjbiA/ICJOIiA6ICJGRiIpOworI2VuZGlmCisJCXB2Yy0+c3RhdGUuZmVjbiBePSAxOworCX0KKworCWlmIChwdmMtPnN0YXRlLmJlY24gIT0gZmgtPmJlY24pIHsKKyNpZmRlZiBERUJVR19FQ04KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBETENJICVkIEJFQ04gTyVzXG4iLCBuZGV2LT5uYW1lLAorCQkgICAgICAgZGxjaSwgZmgtPmJlY24gPyAiTiIgOiAiRkYiKTsKKyNlbmRpZgorCQlwdmMtPnN0YXRlLmJlY24gXj0gMTsKKwl9CisKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJaGRsYy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisJaWYgKGRhdGFbM10gPT0gTkxQSURfSVApIHsKKwkJc2tiX3B1bGwoc2tiLCA0KTsgLyogUmVtb3ZlIDQtYnl0ZSBoZWFkZXIgKGhkciwgVUksIE5MUElEKSAqLworCQlkZXYgPSBwdmMtPm1haW47CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisKKwl9IGVsc2UgaWYgKGRhdGFbM10gPT0gTkxQSURfSVBWNikgeworCQlza2JfcHVsbChza2IsIDQpOyAvKiBSZW1vdmUgNC1ieXRlIGhlYWRlciAoaGRyLCBVSSwgTkxQSUQpICovCisJCWRldiA9IHB2Yy0+bWFpbjsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOworCisJfSBlbHNlIGlmIChza2ItPmxlbiA+IDEwICYmIGRhdGFbM10gPT0gRlJfUEFEICYmCisJCSAgIGRhdGFbNF0gPT0gTkxQSURfU05BUCAmJiBkYXRhWzVdID09IEZSX1BBRCkgeworCQl1MTYgb3VpID0gbnRvaHMoKih1MTYqKShkYXRhICsgNikpOworCQl1MTYgcGlkID0gbnRvaHMoKih1MTYqKShkYXRhICsgOCkpOworCQlza2JfcHVsbChza2IsIDEwKTsKKworCQlzd2l0Y2ggKCgoKHUzMilvdWkpIDw8IDE2KSB8IHBpZCkgeworCQljYXNlIEVUSF9QX0FSUDogLyogcm91dGVkIGZyYW1lIHdpdGggU05BUCAqLworCQljYXNlIEVUSF9QX0lQWDoKKwkJY2FzZSBFVEhfUF9JUDoJLyogYSBsb25nIHZhcmlhbnQgKi8KKwkJY2FzZSBFVEhfUF9JUFY2OgorCQkJZGV2ID0gcHZjLT5tYWluOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKHBpZCk7CisJCQlicmVhazsKKworCQljYXNlIDB4ODBDMjAwMDc6IC8qIGJyaWRnZWQgRXRoZXJuZXQgZnJhbWUgKi8KKwkJCWlmICgoZGV2ID0gcHZjLT5ldGhlcikgIT0gTlVMTCkKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCwgT1VJPSV4ICIKKwkJCSAgICAgICAiUElEPSV4XG4iLCBuZGV2LT5uYW1lLCBvdWksIHBpZCk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9SWF9EUk9QOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIHByb3RvY29sLCBOTFBJRD0leCAiCisJCSAgICAgICAibGVuZ3RoID0gJWlcbiIsIG5kZXYtPm5hbWUsIGRhdGFbM10sIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChkZXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gcHZjX2dldF9zdGF0cyhkZXYpOworCQlzdGF0cy0+cnhfcGFja2V0cysrOyAvKiBQVkMgdHJhZmZpYyAqLworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWlmIChwdmMtPnN0YXRlLmJlY24pCisJCQlzdGF0cy0+cnhfY29tcHJlc3NlZCsrOworCQlza2ItPmRldiA9IGRldjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCX0gZWxzZSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CisKKyByeF9lcnJvcjoKKwloZGxjLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogTWFyayBlcnJvciAqLworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworc3RhdGljIHZvaWQgZnJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJmcl9zdGFydFxuIik7CisjZW5kaWYKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pICE9IExNSV9OT05FKSB7CisJCWhkbGMtPnN0YXRlLmZyLnJlbGlhYmxlID0gMDsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQloZGxjLT5zdGF0ZS5mci5yZXF1ZXN0ID0gMDsKKwkJaGRsYy0+c3RhdGUuZnIuZnVsbHJlcF9zZW50ID0gMDsKKwkJaGRsYy0+c3RhdGUuZnIubGFzdF9lcnJvcnMgPSAweEZGRkZGRkZGOworCQloZGxjLT5zdGF0ZS5mci5uMzkxY250ID0gMDsKKwkJaGRsYy0+c3RhdGUuZnIudHhzZXEgPSBoZGxjLT5zdGF0ZS5mci5yeHNlcSA9IDA7CisKKwkJaW5pdF90aW1lcigmaGRsYy0+c3RhdGUuZnIudGltZXIpOworCQkvKiBGaXJzdCBwb2xsIGFmdGVyIDEgcyAqLworCQloZGxjLT5zdGF0ZS5mci50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQloZGxjLT5zdGF0ZS5mci50aW1lci5mdW5jdGlvbiA9IGZyX3RpbWVyOworCQloZGxjLT5zdGF0ZS5mci50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQlhZGRfdGltZXIoJmhkbGMtPnN0YXRlLmZyLnRpbWVyKTsKKwl9IGVsc2UKKwkJZnJfc2V0X2xpbmtfc3RhdGUoMSwgZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJmcl9zdG9wXG4iKTsKKyNlbmRpZgorCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgIT0gTE1JX05PTkUpCisJCWRlbF90aW1lcl9zeW5jKCZoZGxjLT5zdGF0ZS5mci50aW1lcik7CisJZnJfc2V0X2xpbmtfc3RhdGUoMCwgZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIGZyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXB2Y19kZXZpY2UgKnB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlIChwdmMpIHsJCS8qIFNodXRkb3duIGFsbCBQVkNzIGZvciB0aGlzIEZSQUQgKi8KKwkJaWYgKHB2Yy0+bWFpbikKKwkJCWRldl9jbG9zZShwdmMtPm1haW4pOworCQlpZiAocHZjLT5ldGhlcikKKwkJCWRldl9jbG9zZShwdmMtPmV0aGVyKTsKKwkJcHZjID0gcHZjLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgZGxjaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+dHlwZSA9IEFSUEhSRF9ETENJOworCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQ7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAxMDsKKwlkZXYtPmFkZHJfbGVuID0gMjsKK30KKworc3RhdGljIGludCBmcl9hZGRfcHZjKHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIsIHVuc2lnbmVkIGludCBkbGNpLCBpbnQgdHlwZSkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG1hc3Rlcik7CisJcHZjX2RldmljZSAqcHZjID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXN1bHQsIHVzZWQ7CisJY2hhciAqIHByZWZpeCA9ICJwdmMlZCI7CisKKwlpZiAodHlwZSA9PSBBUlBIUkRfRVRIRVIpCisJCXByZWZpeCA9ICJwdmNldGglZCI7CisKKwlpZiAoKHB2YyA9IGFkZF9wdmMobWFzdGVyLCBkbGNpKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfYWRkX3B2YygpXG4iLAorCQkgICAgICAgbWFzdGVyLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWlmICgqZ2V0X2Rldl9wKHB2YywgdHlwZSkpCisJCXJldHVybiAtRUVYSVNUOworCisJdXNlZCA9IHB2Y19pc191c2VkKHB2Yyk7CisKKwlpZiAodHlwZSA9PSBBUlBIUkRfRVRIRVIpCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpLAorCQkJCSAgICJwdmNldGglZCIsIGV0aGVyX3NldHVwKTsKKwllbHNlCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpLAorCQkJCSAgICJwdmMlZCIsIGRsY2lfc2V0dXApOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGZyX3B2YygpXG4iLAorCQkgICAgICAgbWFzdGVyLT5uYW1lKTsKKwkJZGVsZXRlX3VudXNlZF9wdmNzKGhkbGMpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKSB7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAiXHgwMFx4MDEiLCAyKTsKKyAgICAgICAgICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIgKyAyLCBFVEhfQUxFTiAtIDIpOworCX0gZWxzZSB7CisJCSoodTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoZGxjaSk7CisJCWRsY2lfdG9fcTkyMihkZXYtPmJyb2FkY2FzdCwgZGxjaSk7CisJfQorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcHZjX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBwdmNfZ2V0X3N0YXRzOworCWRldi0+b3BlbiA9IHB2Y19vcGVuOworCWRldi0+c3RvcCA9IHB2Y19jbG9zZTsKKwlkZXYtPmRvX2lvY3RsID0gcHZjX2lvY3RsOworCWRldi0+Y2hhbmdlX210dSA9IHB2Y19jaGFuZ2VfbXR1OworCWRldi0+bXR1ID0gSERMQ19NQVhfTVRVOworCWRldi0+dHhfcXVldWVfbGVuID0gMDsKKwlkZXYtPnByaXYgPSBwdmM7CisKKwlyZXN1bHQgPSBkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJZGVsZXRlX3VudXNlZF9wdmNzKGhkbGMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSAhPSAwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWRlbGV0ZV91bnVzZWRfcHZjcyhoZGxjKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisJKmdldF9kZXZfcChwdmMsIHR5cGUpID0gZGV2OworCWlmICghdXNlZCkgeworCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDE7CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9wdmNfY291bnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGZyX2RlbF9wdmMoaGRsY19kZXZpY2UgKmhkbGMsIHVuc2lnbmVkIGludCBkbGNpLCBpbnQgdHlwZSkKK3sKKwlwdmNfZGV2aWNlICpwdmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmICgocHZjID0gZmluZF9wdmMoaGRsYywgZGxjaSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKChkZXYgPSAqZ2V0X2Rldl9wKHB2YywgdHlwZSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCXJldHVybiAtRUJVU1k7CQkvKiBQVkMgaW4gdXNlICovCisKKwl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOyAvKiB0aGUgZGVzdHJ1Y3RvciB3aWxsIGZyZWVfbmV0ZGV2KGRldikgKi8KKwkqZ2V0X2Rldl9wKHB2YywgdHlwZSkgPSBOVUxMOworCisJaWYgKCFwdmNfaXNfdXNlZChwdmMpKSB7CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9wdmNfY291bnQtLTsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCX0KKwlkZWxldGVfdW51c2VkX3B2Y3MoaGRsYyk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9kZXN0cm95KGhkbGNfZGV2aWNlICpoZGxjKQoreworCXB2Y19kZXZpY2UgKnB2YzsKKworCXB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKwloZGxjLT5zdGF0ZS5mci5maXJzdF9wdmMgPSBOVUxMOyAvKiBBbGwgUFZDcyBkZXN0cm95ZWQgKi8KKwloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50ID0gMDsKKwloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDE7CisKKwl3aGlsZSAocHZjKSB7CisJCXB2Y19kZXZpY2UgKm5leHQgPSBwdmMtPm5leHQ7CisJCS8qIGRlc3RydWN0b3JzIHdpbGwgZnJlZV9uZXRkZXYoKSBtYWluIGFuZCBldGhlciAqLworCQlpZiAocHZjLT5tYWluKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UocHZjLT5tYWluKTsKKworCQlpZiAocHZjLT5ldGhlcikKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHB2Yy0+ZXRoZXIpOworCisJCWtmcmVlKHB2Yyk7CisJCXB2YyA9IG5leHQ7CisJfQorfQorCisKKworaW50IGhkbGNfZnJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJZnJfcHJvdG8gX191c2VyICpmcl9zID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuZnI7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoZnJfcHJvdG8pOworCWZyX3Byb3RvIG5ld19zZXR0aW5nczsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJZnJfcHJvdG9fcHZjIHB2YzsKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19GUjsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoZnJfcywgJmhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfUFJPVE9fRlI6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZihkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXR0aW5ncywgZnJfcywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X3NldHRpbmdzLmxtaSA9PSBMTUlfREVGQVVMVCkKKwkJCW5ld19zZXR0aW5ncy5sbWkgPSBMTUlfQU5TSTsKKworCQlpZiAoKG5ld19zZXR0aW5ncy5sbWkgIT0gTE1JX05PTkUgJiYKKwkJICAgICBuZXdfc2V0dGluZ3MubG1pICE9IExNSV9BTlNJICYmCisJCSAgICAgbmV3X3NldHRpbmdzLmxtaSAhPSBMTUlfQ0NJVFQpIHx8CisJCSAgICBuZXdfc2V0dGluZ3MudDM5MSA8IDEgfHwKKwkJICAgIG5ld19zZXR0aW5ncy50MzkyIDwgMiB8fAorCQkgICAgbmV3X3NldHRpbmdzLm4zOTEgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MubjM5MiA8IDEgfHwKKwkJICAgIG5ld19zZXR0aW5ncy5uMzkzIDwgbmV3X3NldHRpbmdzLm4zOTIgfHwKKwkJICAgIG5ld19zZXR0aW5ncy5uMzkzID4gMzIgfHwKKwkJICAgIChuZXdfc2V0dGluZ3MuZGNlICE9IDAgJiYKKwkJICAgICBuZXdfc2V0dGluZ3MuZGNlICE9IDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmVzdWx0PWhkbGMtPmF0dGFjaChkZXYsIEVOQ09ESU5HX05SWixQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJaWYgKGhkbGMtPnByb3RvLmlkICE9IElGX1BST1RPX0ZSKSB7CisJCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJCWhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YyA9IE5VTEw7CisJCQloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50ID0gMDsKKwkJfQorCQltZW1jcHkoJmhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8uY2xvc2UgPSBmcl9jbG9zZTsKKwkJaGRsYy0+cHJvdG8uc3RhcnQgPSBmcl9zdGFydDsKKwkJaGRsYy0+cHJvdG8uc3RvcCA9IGZyX3N0b3A7CisJCWhkbGMtPnByb3RvLmRldGFjaCA9IGZyX2Rlc3Ryb3k7CisJCWhkbGMtPnByb3RvLm5ldGlmX3J4ID0gZnJfcng7CisJCWhkbGMtPnByb3RvLmlkID0gSUZfUFJPVE9fRlI7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRsYy0+eG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9GUkFEOworCQlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0ZSX0FERF9QVkM6CisJY2FzZSBJRl9QUk9UT19GUl9ERUxfUFZDOgorCWNhc2UgSUZfUFJPVE9fRlJfQUREX0VUSF9QVkM6CisJY2FzZSBJRl9QUk9UT19GUl9ERUxfRVRIX1BWQzoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcHZjLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5mcl9wdmMsCisJCQkJICAgc2l6ZW9mKGZyX3Byb3RvX3B2YykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHB2Yy5kbGNpIDw9IDAgfHwgcHZjLmRsY2kgPj0gMTAyNCkKKwkJCXJldHVybiAtRUlOVkFMOwkvKiBPbmx5IDEwIGJpdHMsIERMQ0kgMCByZXNlcnZlZCAqLworCisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX1BST1RPX0ZSX0FERF9FVEhfUFZDIHx8CisJCSAgICBpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX1BST1RPX0ZSX0RFTF9FVEhfUFZDKQorCQkJcmVzdWx0ID0gQVJQSFJEX0VUSEVSOyAvKiBicmlkZ2VkIEV0aGVybmV0IGRldmljZSAqLworCQllbHNlCisJCQlyZXN1bHQgPSBBUlBIUkRfRExDSTsKKworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9BRERfUFZDIHx8CisJCSAgICBpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX1BST1RPX0ZSX0FERF9FVEhfUFZDKQorCQkJcmV0dXJuIGZyX2FkZF9wdmMoZGV2LCBwdmMuZGxjaSwgcmVzdWx0KTsKKwkJZWxzZQorCQkJcmV0dXJuIGZyX2RlbF9wdmMoaGRsYywgcHZjLmRsY2ksIHJlc3VsdCk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19nZW5lcmljLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMDY0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2dlbmVyaWMuYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgKgkqIHJhdyBJUC1pbi1IRExDCisgKgkqIENpc2NvIEhETEMKKyAqCSogRnJhbWUgUmVsYXkgd2l0aCBBTlNJIG9yIENDSVRUIExNSSAoYm90aCB1c2VyIGFuZCBuZXR3b3JrIHNpZGUpCisgKgkqIFBQUAorICoJKiBYLjI1CisgKgorICogVXNlIHNldGhkbGMgdXRpbGl0eSB0byBzZXQgbGluZSBwYXJhbWV0ZXJzLCBwcm90b2NvbCBhbmQgUFZDcworICoKKyAqIEhvdyBkb2VzIGl0IHdvcms6CisgKiAtIHByb3RvLm9wZW4oKSwgY2xvc2UoKSwgc3RhcnQoKSwgc3RvcCgpIGNhbGxzIGFyZSBzZXJpYWxpemVkLgorICogICBUaGUgb3JkZXIgaXM6IG9wZW4sIFsgc3RhcnQsIHN0b3AgLi4uIF0gY2xvc2UgLi4uCisgKiAtIHByb3RvLnN0YXJ0KCkgYW5kIHN0b3AoKSBhcmUgY2FsbGVkIHdpdGggc3Bpbl9sb2NrX2lycSBoZWxkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIkhETEMgc3VwcG9ydCBtb2R1bGUgcmV2aXNpb24gMS4xNyI7CisKKyN1bmRlZiBERUJVR19MSU5LCisKKworc3RhdGljIGludCBoZGxjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gSERMQ19NQVhfTVRVKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoZGxjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBoZGxjX3N0YXRzKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IGhkbGNfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnApCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWlmIChoZGxjLT5wcm90by5uZXRpZl9yeCkKKwkJcmV0dXJuIGhkbGMtPnByb3RvLm5ldGlmX3J4KHNrYik7CisKKwloZGxjLT5zdGF0cy5yeF9kcm9wcGVkKys7IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworc3RhdGljIHZvaWQgX19oZGxjX3NldF9jYXJyaWVyX29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWlmIChoZGxjLT5wcm90by5zdGFydCkKKwkJcmV0dXJuIGhkbGMtPnByb3RvLnN0YXJ0KGRldik7CisjaWZkZWYgREVCVUdfTElOSworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCXByaW50ayhLRVJOX0VSUiAiaGRsY19zZXRfY2Fycmllcl9vbigpOiBhbHJlYWR5IG9uXG4iKTsKKyNlbmRpZgorCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIF9faGRsY19zZXRfY2Fycmllcl9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaWYgKGhkbGMtPnByb3RvLnN0b3ApCisJCXJldHVybiBoZGxjLT5wcm90by5zdG9wKGRldik7CisKKyNpZmRlZiBERUJVR19MSU5LCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCXByaW50ayhLRVJOX0VSUiAiaGRsY19zZXRfY2Fycmllcl9vZmYoKTogYWxyZWFkeSBvZmZcbiIpOworI2VuZGlmCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKK30KKworCisKK3ZvaWQgaGRsY19zZXRfY2FycmllcihpbnQgb24sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJb24gPSBvbiA/IDEgOiAwOworCisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJoZGxjX3NldF9jYXJyaWVyICVpXG4iLCBvbik7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoZGxjLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaGRsYy0+Y2FycmllciA9PSBvbikKKwkJZ290byBjYXJyaWVyX2V4aXQ7IC8qIG5vIGNoYW5nZSBpbiBEQ0QgbGluZSBsZXZlbCAqLworCisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYXJyaWVyICVzXG4iLCBkZXYtPm5hbWUsIG9uID8gIk9OIiA6ICJvZmYiKTsKKyNlbmRpZgorCWhkbGMtPmNhcnJpZXIgPSBvbjsKKworCWlmICghaGRsYy0+b3BlbikKKwkJZ290byBjYXJyaWVyX2V4aXQ7CisKKwlpZiAoaGRsYy0+Y2FycmllcikKKwkJX19oZGxjX3NldF9jYXJyaWVyX29uKGRldik7CisJZWxzZQorCQlfX2hkbGNfc2V0X2NhcnJpZXJfb2ZmKGRldik7CisKK2NhcnJpZXJfZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZGxjLT5zdGF0ZV9sb2NrLCBmbGFncyk7Cit9CisKKworCisvKiBNdXN0IGJlIGNhbGxlZCBieSBoYXJkd2FyZSBkcml2ZXIgd2hlbiBIRExDIGRldmljZSBpcyBiZWluZyBvcGVuZWQgKi8KK2ludCBoZGxjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJoZGxjX29wZW4oKSBjYXJyaWVyICVpIG9wZW4gJWlcbiIsCisJICAgICAgIGhkbGMtPmNhcnJpZXIsIGhkbGMtPm9wZW4pOworI2VuZGlmCisKKwlpZiAoaGRsYy0+cHJvdG8uaWQgPT0gLTEpCisJCXJldHVybiAtRU5PU1lTOwkvKiBubyBwcm90b2NvbCBhdHRhY2hlZCAqLworCisJaWYgKGhkbGMtPnByb3RvLm9wZW4pIHsKKwkJaW50IHJlc3VsdCA9IGhkbGMtPnByb3RvLm9wZW4oZGV2KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaGRsYy0+c3RhdGVfbG9jayk7CisKKwlpZiAoaGRsYy0+Y2FycmllcikKKwkJX19oZGxjX3NldF9jYXJyaWVyX29uKGRldik7CisKKwloZGxjLT5vcGVuID0gMTsKKworCXNwaW5fdW5sb2NrX2lycSgmaGRsYy0+c3RhdGVfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBNdXN0IGJlIGNhbGxlZCBieSBoYXJkd2FyZSBkcml2ZXIgd2hlbiBIRExDIGRldmljZSBpcyBiZWluZyBjbG9zZWQgKi8KK3ZvaWQgaGRsY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKyNpZmRlZiBERUJVR19MSU5LCisJcHJpbnRrKEtFUk5fREVCVUcgImhkbGNfY2xvc2UoKSBjYXJyaWVyICVpIG9wZW4gJWlcbiIsCisJICAgICAgIGhkbGMtPmNhcnJpZXIsIGhkbGMtPm9wZW4pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxKCZoZGxjLT5zdGF0ZV9sb2NrKTsKKworCWhkbGMtPm9wZW4gPSAwOworCWlmIChoZGxjLT5jYXJyaWVyKQorCQlfX2hkbGNfc2V0X2NhcnJpZXJfb2ZmKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOworCisJaWYgKGhkbGMtPnByb3RvLmNsb3NlKQorCQloZGxjLT5wcm90by5jbG9zZShkZXYpOworfQorCisKKworI2lmbmRlZiBDT05GSUdfSERMQ19SQVcKKyNkZWZpbmUgaGRsY19yYXdfaW9jdGwoZGV2LCBpZnIpCS1FTk9TWVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19IRExDX1JBV19FVEgKKyNkZWZpbmUgaGRsY19yYXdfZXRoX2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19QUFAKKyNkZWZpbmUgaGRsY19wcHBfaW9jdGwoZGV2LCBpZnIpCS1FTk9TWVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19IRExDX0NJU0NPCisjZGVmaW5lIGhkbGNfY2lzY29faW9jdGwoZGV2LCBpZnIpCS1FTk9TWVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19IRExDX0ZSCisjZGVmaW5lIGhkbGNfZnJfaW9jdGwoZGV2LCBpZnIpCQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19YMjUKKyNkZWZpbmUgaGRsY194MjVfaW9jdGwoZGV2LCBpZnIpCS1FTk9TWVMKKyNlbmRpZgorCisKK2ludCBoZGxjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcHJvdG87CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX1BST1RPX0hETEM6CisJY2FzZSBJRl9QUk9UT19IRExDX0VUSDoKKwljYXNlIElGX1BST1RPX1BQUDoKKwljYXNlIElGX1BST1RPX0NJU0NPOgorCWNhc2UgSUZfUFJPVE9fRlI6CisJY2FzZSBJRl9QUk9UT19YMjU6CisJCXByb3RvID0gaWZyLT5pZnJfc2V0dGluZ3MudHlwZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcm90byA9IGhkbGMtPnByb3RvLmlkOworCX0KKworCXN3aXRjaChwcm90bykgeworCWNhc2UgSUZfUFJPVE9fSERMQzoJcmV0dXJuIGhkbGNfcmF3X2lvY3RsKGRldiwgaWZyKTsKKwljYXNlIElGX1BST1RPX0hETENfRVRIOglyZXR1cm4gaGRsY19yYXdfZXRoX2lvY3RsKGRldiwgaWZyKTsKKwljYXNlIElGX1BST1RPX1BQUDoJcmV0dXJuIGhkbGNfcHBwX2lvY3RsKGRldiwgaWZyKTsKKwljYXNlIElGX1BST1RPX0NJU0NPOglyZXR1cm4gaGRsY19jaXNjb19pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19GUjoJcmV0dXJuIGhkbGNfZnJfaW9jdGwoZGV2LCBpZnIpOworCWNhc2UgSUZfUFJPVE9fWDI1OglyZXR1cm4gaGRsY194MjVfaW9jdGwoZGV2LCBpZnIpOworCWRlZmF1bHQ6CQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhkbGNfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlkZXYtPmdldF9zdGF0cyA9IGhkbGNfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IGhkbGNfY2hhbmdlX210dTsKKwlkZXYtPm10dSA9IEhETENfTUFYX01UVTsKKworCWRldi0+dHlwZSA9IEFSUEhSRF9SQVdIRExDOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTY7CisKKwlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQOworCisJaGRsYy0+cHJvdG8uaWQgPSAtMTsKKwloZGxjLT5wcm90by5kZXRhY2ggPSBOVUxMOworCWhkbGMtPmNhcnJpZXIgPSAxOworCWhkbGMtPm9wZW4gPSAwOworCXNwaW5fbG9ja19pbml0KCZoZGxjLT5zdGF0ZV9sb2NrKTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2hkbGNkZXYodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoaGRsY19kZXZpY2UpLCAiaGRsYyVkIiwgaGRsY19zZXR1cCk7CisJaWYgKGRldikKKwkJZGV2X3RvX2hkbGMoZGV2KS0+cHJpdiA9IHByaXY7CisJcmV0dXJuIGRldjsKK30KKworaW50IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdCA9IGRldl9hbGxvY19uYW1lKGRldiwgImhkbGMlZCIpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJlc3VsdCAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7IC8qIG5vIGNhcnJpZXIgdW50aWwgRENEIGdvZXMgdXAgKi8KKworCXJldHVybiAwOworfQorCisKKwordm9pZCB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcnRubF9sb2NrKCk7CisJaGRsY19wcm90b19kZXRhY2goZGV2X3RvX2hkbGMoZGV2KSk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwlydG5sX3VubG9jaygpOworfQorCisKKworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSERMQyBzdXBwb3J0IG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCitFWFBPUlRfU1lNQk9MKGhkbGNfb3Blbik7CitFWFBPUlRfU1lNQk9MKGhkbGNfY2xvc2UpOworRVhQT1JUX1NZTUJPTChoZGxjX3NldF9jYXJyaWVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY19pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGFsbG9jX2hkbGNkZXYpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9oZGxjX2RldmljZSk7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaGRsY19kZXZpY2UpOworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGhkbGNfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hETEMpLAorCS5mdW5jID0gaGRsY19yY3YsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGhkbGNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisgICAgICAgIGRldl9hZGRfcGFjaygmaGRsY19wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGRsY19tb2R1bGVfZXhpdCh2b2lkKQoreworCWRldl9yZW1vdmVfcGFjaygmaGRsY19wYWNrZXRfdHlwZSk7Cit9CisKKworbW9kdWxlX2luaXQoaGRsY19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChoZGxjX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfcHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkNjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBQb2ludC10by1wb2ludCBwcm90b2NvbCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xhcGIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKworc3RhdGljIGludCBwcHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwl2b2lkICpvbGRfaW9jdGw7CisJaW50IHJlc3VsdDsKKworCWRldi0+cHJpdiA9ICZoZGxjLT5zdGF0ZS5wcHAuc3luY3BwcF9wdHI7CisJaGRsYy0+c3RhdGUucHBwLnN5bmNwcHBfcHRyID0gJmhkbGMtPnN0YXRlLnBwcC5wcHBkZXY7CisJaGRsYy0+c3RhdGUucHBwLnBwcGRldi5kZXYgPSBkZXY7CisKKwlvbGRfaW9jdGwgPSBkZXYtPmRvX2lvY3RsOworCWhkbGMtPnN0YXRlLnBwcC5vbGRfY2hhbmdlX210dSA9IGRldi0+Y2hhbmdlX210dTsKKwlzcHBwX2F0dGFjaCgmaGRsYy0+c3RhdGUucHBwLnBwcGRldik7CisJLyogc3BwcF9hdHRhY2ggbnVrZXMgdGhlbS4gV2UgZG9uJ3QgbmVlZCBzeW5jcHBwJ3MgaW9jdGwgKi8KKwlkZXYtPmRvX2lvY3RsID0gb2xkX2lvY3RsOworCWhkbGMtPnN0YXRlLnBwcC5wcHBkZXYuc3BwcC5wcF9mbGFncyAmPSB+UFBfQ0lTQ087CisJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwlyZXN1bHQgPSBzcHBwX29wZW4oZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXNwcHBfZGV0YWNoKGRldik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBwcHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlzcHBwX2Nsb3NlKGRldik7CisJc3BwcF9kZXRhY2goZGV2KTsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBoZGxjLT5zdGF0ZS5wcHAub2xkX2NoYW5nZV9tdHU7CisJZGV2LT5tdHUgPSBIRExDX01BWF9NVFU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAxNjsKK30KKworCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcHBfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19jb25zdGFudF9odG9ucyhFVEhfUF9XQU5fUFBQKTsKK30KKworCisKK2ludCBoZGxjX3BwcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fUFBQOworCQlyZXR1cm4gMDsgLyogcmV0dXJuIHByb3RvY29sIG9ubHksIG5vIHNldHRhYmxlIHBhcmFtZXRlcnMgKi8KKworCWNhc2UgSUZfUFJPVE9fUFBQOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJLyogbm8gc2V0dGFibGUgcGFyYW1ldGVycyAqLworCisJCXJlc3VsdD1oZGxjLT5hdHRhY2goZGV2LCBFTkNPRElOR19OUlosUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1zZXQoJmhkbGMtPnByb3RvLCAwLCBzaXplb2YoaGRsYy0+cHJvdG8pKTsKKworCQloZGxjLT5wcm90by5vcGVuID0gcHBwX29wZW47CisJCWhkbGMtPnByb3RvLmNsb3NlID0gcHBwX2Nsb3NlOworCQloZGxjLT5wcm90by50eXBlX3RyYW5zID0gcHBwX3R5cGVfdHJhbnM7CisJCWhkbGMtPnByb3RvLmlkID0gSUZfUFJPVE9fUFBQOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhkbGMtPnhtaXQ7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworCQlkZXYtPnR5cGUgPSBBUlBIUkRfUFBQOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWZiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBIRExDIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmF3X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOworfQorCisKKworaW50IGhkbGNfcmF3X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXJhd19oZGxjX3Byb3RvIF9fdXNlciAqcmF3X3MgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5yYXdfaGRsYzsKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihyYXdfaGRsY19wcm90byk7CisJcmF3X2hkbGNfcHJvdG8gbmV3X3NldHRpbmdzOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19IRExDOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihyYXdfcywgJmhkbGMtPnN0YXRlLnJhd19oZGxjLnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfUFJPVE9fSERMQzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2V0dGluZ3MsIHJhd19zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfc2V0dGluZ3MuZW5jb2RpbmcgPT0gRU5DT0RJTkdfREVGQVVMVCkKKwkJCW5ld19zZXR0aW5ncy5lbmNvZGluZyA9IEVOQ09ESU5HX05SWjsKKworCQlpZiAobmV3X3NldHRpbmdzLnBhcml0eSA9PSBQQVJJVFlfREVGQVVMVCkKKwkJCW5ld19zZXR0aW5ncy5wYXJpdHkgPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUOworCisJCXJlc3VsdCA9IGhkbGMtPmF0dGFjaChkZXYsIG5ld19zZXR0aW5ncy5lbmNvZGluZywKKwkJCQkgICAgICBuZXdfc2V0dGluZ3MucGFyaXR5KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJaGRsY19wcm90b19kZXRhY2goaGRsYyk7CisJCW1lbWNweSgmaGRsYy0+c3RhdGUucmF3X2hkbGMuc2V0dGluZ3MsICZuZXdfc2V0dGluZ3MsIHNpemUpOworCQltZW1zZXQoJmhkbGMtPnByb3RvLCAwLCBzaXplb2YoaGRsYy0+cHJvdG8pKTsKKworCQloZGxjLT5wcm90by50eXBlX3RyYW5zID0gcmF3X3R5cGVfdHJhbnM7CisJCWhkbGMtPnByb3RvLmlkID0gSUZfUFJPVE9fSERMQzsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGxjLT54bWl0OworCQlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJZGV2LT50eXBlID0gQVJQSFJEX1JBV0hETEM7CisJCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQgfCBJRkZfTk9BUlA7CisJCWRldi0+YWRkcl9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhd19ldGguYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhd19ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI4NWNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3X2V0aC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBIRExDIEV0aGVybmV0IGVtdWxhdGlvbiBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKworc3RhdGljIGludCBldGhfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcGFkID0gRVRIX1pMRU4gLSBza2ItPmxlbjsKKwlpZiAocGFkID4gMCkgewkJLyogUGFkIHRoZSBmcmFtZSB3aXRoIHplcm9zICovCisJCWludCBsZW4gPSBza2ItPmxlbjsKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgcGFkKQorCQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBwYWQsIEdGUF9BVE9NSUMpKSB7CisJCQkJaGRsY19zdGF0cyhkZXYpLT50eF9kcm9wcGVkKys7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCXJldHVybiAwOworCQkJfQorCQlza2JfcHV0KHNrYiwgcGFkKTsKKwkJbWVtc2V0KHNrYi0+ZGF0YSArIGxlbiwgMCwgcGFkKTsKKwl9CisJcmV0dXJuIGRldl90b19oZGxjKGRldiktPnhtaXQoc2tiLCBkZXYpOworfQorCisKK2ludCBoZGxjX3Jhd19ldGhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJcmF3X2hkbGNfcHJvdG8gX191c2VyICpyYXdfcyA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnJhd19oZGxjOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHJhd19oZGxjX3Byb3RvKTsKKwlyYXdfaGRsY19wcm90byBuZXdfc2V0dGluZ3M7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisJdm9pZCAqb2xkX2NoX210dTsKKwlpbnQgb2xkX3FsZW47CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX0hETENfRVRIOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihyYXdfcywgJmhkbGMtPnN0YXRlLnJhd19oZGxjLnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfUFJPVE9fSERMQ19FVEg6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NldHRpbmdzLCByYXdfcywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X3NldHRpbmdzLmVuY29kaW5nID09IEVOQ09ESU5HX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MuZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5wYXJpdHkgPT0gUEFSSVRZX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MucGFyaXR5ID0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDsKKworCQlyZXN1bHQgPSBoZGxjLT5hdHRhY2goZGV2LCBuZXdfc2V0dGluZ3MuZW5jb2RpbmcsCisJCQkJICAgICAgbmV3X3NldHRpbmdzLnBhcml0eSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1jcHkoJmhkbGMtPnN0YXRlLnJhd19oZGxjLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IGV0aF90eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0hETENfRVRIOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGV0aF90eDsKKwkJb2xkX2NoX210dSA9IGRldi0+Y2hhbmdlX210dTsKKwkJb2xkX3FsZW4gPSBkZXYtPnR4X3F1ZXVlX2xlbjsKKwkJZXRoZXJfc2V0dXAoZGV2KTsKKwkJZGV2LT5jaGFuZ2VfbXR1ID0gb2xkX2NoX210dTsKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSBvbGRfcWxlbjsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICJceDAwXHgwMSIsIDIpOworICAgICAgICAgICAgICAgIGdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkciArIDIsIEVUSF9BTEVOIC0gMik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY194MjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U1ZWVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqIFguMjUgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjaW5jbHVkZSA8bmV0L3gyNWRldmljZS5oPgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxiYWNrcyBjYWxsZWQgYnkgTEFQQiBsYXllciAqLworCitzdGF0aWMgdm9pZCB4MjVfY29ubmVjdF9kaXNjb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFzb24sIGludCBjb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKDEpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlwdHIgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IGNvZGU7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworCitzdGF0aWMgdm9pZCB4MjVfY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFzb24pCit7CisJeDI1X2Nvbm5lY3RfZGlzY29ubmVjdChkZXYsIHJlYXNvbiwgMSk7Cit9CisKKworCitzdGF0aWMgdm9pZCB4MjVfZGlzY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFzb24pCit7CisJeDI1X2Nvbm5lY3RfZGlzY29ubmVjdChkZXYsIHJlYXNvbiwgMik7Cit9CisKKworCitzdGF0aWMgaW50IHgyNV9kYXRhX2luZGljYXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlza2JfcHVzaChza2IsIDEpOworCisJaWYgKHNrYl9jb3coc2tiLCAxKSkKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCisJcHRyICA9IHNrYi0+ZGF0YTsKKwkqcHRyID0gMDsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIGRldik7CisJcmV0dXJuIG5ldGlmX3J4KHNrYik7Cit9CisKKworCitzdGF0aWMgdm9pZCB4MjVfZGF0YV90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjLT54bWl0KHNrYiwgZGV2KTsgLyogSWdub3JlIHJldHVybiB2YWx1ZSA6LSggKi8KK30KKworCisKK3N0YXRpYyBpbnQgeDI1X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisKKwkvKiBYLjI1IHRvIExBUEIgKi8KKwlzd2l0Y2ggKHNrYi0+ZGF0YVswXSkgeworCWNhc2UgMDoJCS8qIERhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwkJc2tiX3B1bGwoc2tiLCAxKTsKKwkJaWYgKChyZXN1bHQgPSBsYXBiX2RhdGFfcmVxdWVzdChkZXYsIHNrYikpICE9IExBUEJfT0spCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCisJY2FzZSAxOgorCQlpZiAoKHJlc3VsdCA9IGxhcGJfY29ubmVjdF9yZXF1ZXN0KGRldikpIT0gTEFQQl9PSykgeworCQkJaWYgKHJlc3VsdCA9PSBMQVBCX0NPTk5FQ1RFRCkKKwkJCQkvKiBTZW5kIGNvbm5lY3QgY29uZmlybS4gbXNnIHRvIGxldmVsIDMgKi8KKwkJCQl4MjVfY29ubmVjdGVkKGRldiwgMCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTEFQQiBjb25uZWN0IHJlcXVlc3QgIgorCQkJCSAgICAgICAiZmFpbGVkLCBlcnJvciBjb2RlID0gJWlcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcmVzdWx0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjoKKwkJaWYgKChyZXN1bHQgPSBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdChkZXYpKSAhPSBMQVBCX09LKSB7CisJCQlpZiAocmVzdWx0ID09IExBUEJfTk9UQ09OTkVDVEVEKQorCQkJCS8qIFNlbmQgZGlzY29ubmVjdCBjb25maXJtLiBtc2cgdG8gbGV2ZWwgMyAqLworCQkJCXgyNV9kaXNjb25uZWN0ZWQoZGV2LCAwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMQVBCIGRpc2Nvbm5lY3QgcmVxdWVzdCAiCisJCQkJICAgICAgICJmYWlsZWQsIGVycm9yIGNvZGUgPSAlaVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCByZXN1bHQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIHRvIGJlIGRlZmluZWQgKi8KKwkJYnJlYWs7CisJfQorCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB4MjVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYXBiX3JlZ2lzdGVyX3N0cnVjdCBjYjsKKwlpbnQgcmVzdWx0OworCisJY2IuY29ubmVjdF9jb25maXJtYXRpb24gPSB4MjVfY29ubmVjdGVkOworCWNiLmNvbm5lY3RfaW5kaWNhdGlvbiA9IHgyNV9jb25uZWN0ZWQ7CisJY2IuZGlzY29ubmVjdF9jb25maXJtYXRpb24gPSB4MjVfZGlzY29ubmVjdGVkOworCWNiLmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IHgyNV9kaXNjb25uZWN0ZWQ7CisJY2IuZGF0YV9pbmRpY2F0aW9uID0geDI1X2RhdGFfaW5kaWNhdGlvbjsKKwljYi5kYXRhX3RyYW5zbWl0ID0geDI1X2RhdGFfdHJhbnNtaXQ7CisKKwlyZXN1bHQgPSBsYXBiX3JlZ2lzdGVyKGRldiwgJmNiKTsKKwlpZiAocmVzdWx0ICE9IExBUEJfT0spCisJCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCB4MjVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsYXBiX3VucmVnaXN0ZXIoZGV2KTsKK30KKworCisKK3N0YXRpYyBpbnQgeDI1X3J4KHN0cnVjdCBza19idWZmICpza2IpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhza2ItPmRldik7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWhkbGMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChsYXBiX2RhdGFfcmVjZWl2ZWQoc2tiLT5kZXYsIHNrYikgPT0gTEFQQl9PSykKKwkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCisJaGRsYy0+c3RhdHMucnhfZXJyb3JzKys7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKworCitpbnQgaGRsY194MjVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1gyNTsKKwkJcmV0dXJuIDA7IC8qIHJldHVybiBwcm90b2NvbCBvbmx5LCBubyBzZXR0YWJsZSBwYXJhbWV0ZXJzICovCisKKwljYXNlIElGX1BST1RPX1gyNToKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXJlc3VsdD1oZGxjLT5hdHRhY2goZGV2LCBFTkNPRElOR19OUlosUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1zZXQoJmhkbGMtPnByb3RvLCAwLCBzaXplb2YoaGRsYy0+cHJvdG8pKTsKKworCQloZGxjLT5wcm90by5vcGVuID0geDI1X29wZW47CisJCWhkbGMtPnByb3RvLmNsb3NlID0geDI1X2Nsb3NlOworCQloZGxjLT5wcm90by5uZXRpZl9yeCA9IHgyNV9yeDsKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IE5VTEw7CisJCWhkbGMtPnByb3RvLmlkID0gSUZfUFJPVE9fWDI1OworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHgyNV94bWl0OworCQlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJZGV2LT50eXBlID0gQVJQSFJEX1gyNTsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jIGIvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjFkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKglDb210cm9sIFNWMTEgY2FyZCBkcml2ZXIKKyAqCisgKglUaGlzIGlzIGEgc2xpZ2h0bHkgb2RkIFo4NTIzMCBzeW5jaHJvbm91cyBkcml2ZXIuIEFsbCB5b3UgbmVlZCB0bworICoJa25vdyBiYXNpY2FsbHkgaXMKKyAqCisgKglJdHMgYSBnZW51aW5lIFo4NTIzMAorICoKKyAqCUl0IHN1cHBvcnRzIERNQSB1c2luZyB0d28gRE1BIGNoYW5uZWxzIGluIFNZTkMgbW9kZS4gVGhlIGRyaXZlciBkb2Vzbid0CisgKgl1c2UgdGhlc2UgZmFjaWxpdGllcworICoJCisgKglUaGUgY29udHJvbCBwb3J0IGlzIGF0IGlvKzEsIHRoZSBkYXRhIGF0IGlvKzMgYW5kIHR1cm5pbmcgb2ZmIHRoZSBETUEKKyAqCWlzIGRvbmUgYnkgd3JpdGluZyAwIHRvIGlvKzQKKyAqCisgKglUaGUgaGFyZHdhcmUgZG9lcyB0aGUgYnVzIGhhbmRsaW5nIHRvIGF2b2lkIHRoZSBuZWVkIGZvciBkZWxheXMgYmV0d2VlbgorICoJdG91Y2hpbmcgY29udHJvbCByZWdpc3RlcnMuCisgKgorICoJUG9ydCBCIGlzbnQgd2lyZWQgKHdoeSAtIGJlYXRzIG1lKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorI2luY2x1ZGUgIno4NTIzMC5oIgorCitzdGF0aWMgaW50IGRtYTsKKworc3RydWN0IHN2MTFfZGV2aWNlCit7CisJdm9pZCAqaWZfcHRyOwkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCXN0cnVjdCB6ODUzMF9kZXYgc3luYzsKKwlzdHJ1Y3QgcHBwX2RldmljZSBuZXRkZXY7Cit9OworCisvKgorICoJTmV0d29yayBkcml2ZXIgc3VwcG9ydCByb3V0aW5lcworICovCisKKy8qCisgKglGcmFtZSByZWNlaXZlLiBTaW1wbGUgZm9yIG91ciBjYXJkIGFzIHdlIGRvIHN5bmMgcHBwIGFuZCB0aGVyZQorICoJaXMgbm8gZnVubnkgZ2FyYmFnZSBpbnZvbHZlZAorICovCisgCitzdGF0aWMgdm9pZCBob3N0ZXNzX2lucHV0KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIERyb3AgdGhlIENSQyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSBhbmQgbmVnb3RpYXRlIGl0IDspICovCisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbi0yKTsKKwlza2ItPnByb3RvY29sPV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2ItPmRldj1jLT5uZXRkZXZpY2U7CisJLyoKKwkgKglTZW5kIGl0IHRvIHRoZSBQUFAgbGF5ZXIuIFdlIGRvbid0IGhhdmUgdGltZSB0byBwcm9jZXNzCisJICoJaXQgcmlnaHQgbm93LgorCSAqLworCW5ldGlmX3J4KHNrYik7CisJYy0+bmV0ZGV2aWNlLT5sYXN0X3J4ID0gamlmZmllczsKK30KKyAKKy8qCisgKglXZSd2ZSBiZWVuIHBsYWNlZCBpbiB0aGUgVVAgc3RhdGUKKyAqLyAKKyAKK3N0YXRpYyBpbnQgaG9zdGVzc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCWludCBlcnIgPSAtMTsKKwkKKwkvKgorCSAqCUxpbmsgbGF5ZXIgdXAKKwkgKi8KKwlzd2l0Y2goZG1hKQorCXsKKwkJY2FzZSAwOgorCQkJZXJyPXo4NTMwX3N5bmNfb3BlbihkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZXJyPXo4NTMwX3N5bmNfZG1hX29wZW4oZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWVycj16ODUzMF9zeW5jX3R4ZG1hX29wZW4oZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJfQorCQorCWlmKGVycikKKwkJcmV0dXJuIGVycjsKKwkvKgorCSAqCUJlZ2luIFBQUAorCSAqLworCWVycj1zcHBwX29wZW4oZCk7CisJaWYoZXJyKQorCXsKKwkJc3dpdGNoKGRtYSkKKwkJeworCQkJY2FzZSAwOgorCQkJCXo4NTMwX3N5bmNfY2xvc2UoZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXo4NTMwX3N5bmNfZG1hX2Nsb3NlKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl6ODUzMF9zeW5jX3R4ZG1hX2Nsb3NlKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCQlicmVhazsKKwkJfQkJCQkKKwkJcmV0dXJuIGVycjsKKwl9CisJc3YxMS0+c3luYy5jaGFuQS5yeF9mdW5jdGlvbj1ob3N0ZXNzX2lucHV0OworCQorCS8qCisJICoJR28gZ28gZ28KKwkgKi8KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvc3Rlc3NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHN2MTFfZGV2aWNlICpzdjExPWQtPnByaXY7CisJLyoKKwkgKglEaXNjYXJkIG5ldyBmcmFtZXMKKwkgKi8KKwlzdjExLT5zeW5jLmNoYW5BLnJ4X2Z1bmN0aW9uPXo4NTMwX251bGxfcng7CisJLyoKKwkgKglQUFAgb2ZmCisJICovCisJc3BwcF9jbG9zZShkKTsKKwkvKgorCSAqCUxpbmsgbGF5ZXIgZG93bgorCSAqLworCW5ldGlmX3N0b3BfcXVldWUoZCk7CisJCQorCXN3aXRjaChkbWEpCisJeworCQljYXNlIDA6CisJCQl6ODUzMF9zeW5jX2Nsb3NlKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl6ODUzMF9zeW5jX2RtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJejg1MzBfc3luY190eGRtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9zdGVzc19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZCwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJLyogc3RydWN0IHN2MTFfZGV2aWNlICpzdjExPWQtPnByaXY7CisJICAgejg1MzBfaW9jdGwoZCwmc3YxMS0+c3luYy5jaGFuQSxpZnIsY21kKSAqLworCXJldHVybiBzcHBwX2RvX2lvY3RsKGQsIGlmcixjbWQpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmhvc3Rlc3NfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCWlmKHN2MTEpCisJCXJldHVybiB6ODUzMF9nZXRfc3RhdHMoJnN2MTEtPnN5bmMuY2hhbkEpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKglQYXNzZWQgUFBQIGZyYW1lcywgZmlyZSB0aGVtIGRvd253aW5kLgorICovCisgCitzdGF0aWMgaW50IGhvc3Rlc3NfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTE9ZC0+cHJpdjsKKwlyZXR1cm4gejg1MzBfcXVldWVfeG1pdCgmc3YxMS0+c3luYy5jaGFuQSwgc2tiKTsKK30KKworc3RhdGljIGludCBob3N0ZXNzX25laWdoX3NldHVwKHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisJaWYgKG4tPm51ZF9zdGF0ZSA9PSBOVURfTk9ORSkgeworCQluLT5vcHMgPSAmYXJwX2Jyb2tlbl9vcHM7CisJCW4tPm91dHB1dCA9IG4tPm9wcy0+b3V0cHV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob3N0ZXNzX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisJaWYgKHAtPnRibC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcC0+bmVpZ2hfc2V0dXAgPSBob3N0ZXNzX25laWdoX3NldHVwOworCQlwLT51Y2FzdF9wcm9iZXMgPSAwOworCQlwLT5tY2FzdF9wcm9iZXMgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3YxMV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkKKwlkZXYtPm9wZW4gPSBob3N0ZXNzX29wZW47CisJZGV2LT5zdG9wID0gaG9zdGVzc19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhvc3Rlc3NfcXVldWVfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IGhvc3Rlc3NfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSBob3N0ZXNzX2lvY3RsOworCWRldi0+bmVpZ2hfc2V0dXAgPSBob3N0ZXNzX25laWdoX3NldHVwX2RldjsKK30KKworLyoKKyAqCURlc2NyaXB0aW9uIGJsb2NrIGZvciBhIENvbXRyb2wgSG9zdGVzcyBTVjExIGNhcmQKKyAqLworIAorc3RhdGljIHN0cnVjdCBzdjExX2RldmljZSAqc3YxMV9pbml0KGludCBpb2Jhc2UsIGludCBpcnEpCit7CisJc3RydWN0IHo4NTMwX2RldiAqZGV2OworCXN0cnVjdCBzdjExX2RldmljZSAqc3Y7CisJCisJLyoKKwkgKglHZXQgdGhlIG5lZWRlZCBJL08gc3BhY2UKKwkgKi8KKwkgCisJaWYoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgOCwgIkNvbXRyb2wgU1YxMSIpKQorCXsJCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhvc3Rlc3M6IEkvTyAweCVYIGFscmVhZHkgaW4gdXNlLlxuIiwgaW9iYXNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCXN2PShzdHJ1Y3Qgc3YxMV9kZXZpY2UgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3YxMV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZighc3YpCisJCWdvdG8gZmFpbDM7CisJCQkKKwltZW1zZXQoc3YsIDAsIHNpemVvZigqc3YpKTsKKwlzdi0+aWZfcHRyPSZzdi0+bmV0ZGV2OworCQorCXN2LT5uZXRkZXYuZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJoZGxjJWQiLCBzdjExX3NldHVwKTsKKwlpZighc3YtPm5ldGRldi5kZXYpCisJCWdvdG8gZmFpbDI7CisKKwlTRVRfTU9EVUxFX09XTkVSKHN2LT5uZXRkZXYuZGV2KTsKKworCWRldj0mc3YtPnN5bmM7CisJCisJLyoKKwkgKglTdHVmZiBpbiB0aGUgSS9PIGFkZHJlc3NpbmcKKwkgKi8KKwkgCisJZGV2LT5hY3RpdmUgPSAwOworCQorCWRldi0+Y2hhbkEuY3RybGlvPWlvYmFzZSsxOworCWRldi0+Y2hhbkEuZGF0YWlvPWlvYmFzZSszOworCWRldi0+Y2hhbkIuY3RybGlvPS0xOworCWRldi0+Y2hhbkIuZGF0YWlvPS0xOworCWRldi0+Y2hhbkEuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkIuaXJxcz0mejg1MzBfbm9wOworCQorCW91dGIoMCwgaW9iYXNlKzQpOwkJLyogRE1BIG9mZiAqLworCQorCS8qIFdlIHdhbnQgYSBmYXN0IElSUSBmb3IgdGhpcyBkZXZpY2UuIEFjdHVhbGx5IHdlJ2QgbGlrZSBhbiBldmVuIGZhc3RlcgorCSAgIElSUSA7KSAtIFRoaXMgaXMgb25lIGRyaXZlciBSdExpbnV4IGlzIG1hZGUgZm9yICovCisJICAgCisJaWYocmVxdWVzdF9pcnEoaXJxLCAmejg1MzBfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJIb3N0ZXNzIFNWMTEiLCBkZXYpPDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJob3N0ZXNzOiBJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpcnEpOworCQlnb3RvIGZhaWwxOworCX0KKwkKKwlkZXYtPmlycT1pcnE7CisJZGV2LT5jaGFuQS5wcml2YXRlPXN2OworCWRldi0+Y2hhbkEubmV0ZGV2aWNlPXN2LT5uZXRkZXYuZGV2OworCWRldi0+Y2hhbkEuZGV2PWRldjsKKwlkZXYtPmNoYW5CLmRldj1kZXY7CisJCisJaWYoZG1hKQorCXsKKwkJLyoKKwkJICoJWW91IGNhbiBoYXZlIERNQSBvZmYgb3IgMSBhbmQgMyB0aGF0cyB0aGUgbG90CisJCSAqCW9uIHRoZSBDb210cm9sLgorCQkgKi8KKwkJZGV2LT5jaGFuQS50eGRtYT0zOworCQlkZXYtPmNoYW5BLnJ4ZG1hPTE7CisJCW91dGIoMHgwM3wweDA4LCBpb2Jhc2UrNCk7CQkvKiBETUEgb24gKi8KKwkJaWYocmVxdWVzdF9kbWEoZGV2LT5jaGFuQS50eGRtYSwgIkhvc3Rlc3MgU1YvMTEgKFRYKSIpIT0wKQorCQkJZ290byBmYWlsOworCQkJCisJCWlmKGRtYT09MSkKKwkJeworCQkJaWYocmVxdWVzdF9kbWEoZGV2LT5jaGFuQS5yeGRtYSwgIkhvc3Rlc3MgU1YvMTEgKFJYKSIpIT0wKQorCQkJCWdvdG8gZG1hZmFpbDsKKwkJfQorCX0KKworCS8qIEtpbGwgb3VyIHByaXZhdGUgSVJRIGxpbmUgdGhlIGhvc3Rlc3MgY2FuIGVuZCB1cCBjaGF0dGVyaW5nCisJICAgdW50aWwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc2V0ICovCisJZGlzYWJsZV9pcnEoaXJxKTsKKwkJCisJLyoKKwkgKglCZWdpbiBub3JtYWwgaW5pdGlhbGlzZQorCSAqLworCSAKKwlpZih6ODUzMF9pbml0KGRldikhPTApCisJeworCQlwcmludGsoS0VSTl9FUlIgIlo4NTMwIHNlcmllcyBkZXZpY2Ugbm90IGZvdW5kLlxuIik7CisJCWVuYWJsZV9pcnEoaXJxKTsKKwkJZ290byBkbWFmYWlsMjsKKwl9CisJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5CLCB6ODUzMF9kZWFkX3BvcnQpOworCWlmKGRldi0+dHlwZT09Wjg1QzMwKQorCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkEsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbSk7CisJZWxzZQorCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkEsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbV84NTIzMCk7CisJCisJZW5hYmxlX2lycShpcnEpOworCQorCisJLyoKKwkgKglOb3cgd2UgY2FuIHRha2UgdGhlIElSUQorCSAqLworCWlmKGRldl9hbGxvY19uYW1lKGRldi0+Y2hhbkEubmV0ZGV2aWNlLCJoZGxjJWQiKT49MCkKKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkPWRldi0+Y2hhbkEubmV0ZGV2aWNlOworCisJCS8qIAorCQkgKglJbml0aWFsaXNlIHRoZSBQUFAgY29tcG9uZW50cworCQkgKi8KKwkJc3BwcF9hdHRhY2goJnN2LT5uZXRkZXYpOworCQkKKwkJLyoKKwkJICoJTG9jYWwgZmllbGRzCisJCSAqLwkKKwkJCisJCWQtPmJhc2VfYWRkciA9IGlvYmFzZTsKKwkJZC0+aXJxID0gaXJxOworCQlkLT5wcml2ID0gc3Y7CisJCQorCQlpZihyZWdpc3Rlcl9uZXRkZXYoZCkpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2UuXG4iLAorCQkJCWQtPm5hbWUpOworCQkJc3BwcF9kZXRhY2goZCk7CisJCQlnb3RvIGRtYWZhaWwyOworCQl9CisKKwkJejg1MzBfZGVzY3JpYmUoZGV2LCAiSS9PIiwgaW9iYXNlKTsKKwkJZGV2LT5hY3RpdmU9MTsKKwkJcmV0dXJuIHN2OwkKKwl9CitkbWFmYWlsMjoKKwlpZihkbWE9PTEpCisJCWZyZWVfZG1hKGRldi0+Y2hhbkEucnhkbWEpOworZG1hZmFpbDoKKwlpZihkbWEpCisJCWZyZWVfZG1hKGRldi0+Y2hhbkEudHhkbWEpOworZmFpbDoKKwlmcmVlX2lycShpcnEsIGRldik7CitmYWlsMToKKwlmcmVlX25ldGRldihzdi0+bmV0ZGV2LmRldik7CitmYWlsMjoKKwlrZnJlZShzdik7CitmYWlsMzoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsOCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHN2MTFfc2h1dGRvd24oc3RydWN0IHN2MTFfZGV2aWNlICpkZXYpCit7CisJc3BwcF9kZXRhY2goZGV2LT5uZXRkZXYuZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYtPm5ldGRldi5kZXYpOworCXo4NTMwX3NodXRkb3duKCZkZXYtPnN5bmMpOworCWZyZWVfaXJxKGRldi0+c3luYy5pcnEsIGRldik7CisJaWYoZG1hKQorCXsKKwkJaWYoZG1hPT0xKQorCQkJZnJlZV9kbWEoZGV2LT5zeW5jLmNoYW5BLnJ4ZG1hKTsKKwkJZnJlZV9kbWEoZGV2LT5zeW5jLmNoYW5BLnR4ZG1hKTsKKwl9CisJcmVsZWFzZV9yZWdpb24oZGV2LT5zeW5jLmNoYW5BLmN0cmxpby0xLCA4KTsKKwlmcmVlX25ldGRldihkZXYtPm5ldGRldi5kZXYpOworCWtmcmVlKGRldik7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIGludCBpbz0weDIwMDsKK3N0YXRpYyBpbnQgaXJxPTk7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJUaGUgSS9PIGJhc2Ugb2YgdGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIGNhcmQiKTsKK21vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIlNldCB0aGlzIHRvIDEgdG8gdXNlIERNQTEvRE1BMyBmb3IgVFgvUlgiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlRoZSBpbnRlcnJ1cHQgbGluZSBzZXR0aW5nIGZvciB0aGUgQ29tdHJvbCBIb3N0ZXNzIFNWMTEgY2FyZCIpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGFyIGRyaXZlciBmb3IgdGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIik7CisKK3N0YXRpYyBzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTFfdW5pdDsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiU1YtMTEgWjg1MjMwIFN5bmNocm9ub3VzIERyaXZlciB2IDAuMDMuXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICIoYykgQ29weXJpZ2h0IDIwMDEsIFJlZCBIYXQgSW5jLlxuIik7CQorCWlmKChzdjExX3VuaXQ9c3YxMV9pbml0KGlvLGlycSkpPT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWlmKHN2MTFfdW5pdCkKKwkJc3YxMV9zaHV0ZG93bihzdjExX3VuaXQpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xhcGJldGhlci5jIGIvZHJpdmVycy9uZXQvd2FuL2xhcGJldGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmUzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbGFwYmV0aGVyLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKgkiTEFQQiB2aWEgZXRoZXJuZXQiIGRyaXZlciByZWxlYXNlIDAwMQorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyLyBORVQzLjAzOAorICoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGlzIGEgInBzZXVkbyIgbmV0d29yayBkcml2ZXIgdG8gYWxsb3cgTEFQQiBvdmVyIEV0aGVybmV0LgorICoKKyAqCVRoaXMgZHJpdmVyIGNhbiB1c2UgYW55IGV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MsIGFuZCBjYW4gYmUgCisgKglsaW1pdGVkIHRvIGFjY2VwdCBmcmFtZXMgZnJvbSBvbmUgZGVkaWNhdGVkIGV0aGVybmV0IGNhcmQgb25seS4KKyAqCisgKglIaXN0b3J5CisgKglMQVBCRVRIIDAwMQlKb25hdGhhbiBOYXlsb3IJCUNsb25lZCBmcm9tIGJwcWV0aGVyLmMKKyAqCTIwMDAtMTAtMjkJSGVubmVyIEVpc2VuCWxhcGJfZGF0YV9pbmRpY2F0aW9uKCkgcmV0dXJuIHN0YXR1cy4KKyAqCTIwMDAtMTEtMTQJSGVubmVyIEVpc2VuCWRldl9ob2xkL3B1dCwgTkVUREVWX0dPSU5HX0RPV04gc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xhcGIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQveDI1ZGV2aWNlLmg+CisKK3N0YXRpYyBjaGFyIGJjYXN0X2FkZHJbNl0gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKworLyogSWYgdGhpcyBudW1iZXIgaXMgbWFkZSBsYXJnZXIsIGNoZWNrIHRoYXQgdGhlIHRlbXBvcmFyeSBzdHJpbmcgYnVmZmVyCisgKiBpbiBsYXBiZXRoX25ld19kZXZpY2UgaXMgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHRoZSBwcm9iZSBkZXZpY2UgbmFtZS4qLworI2RlZmluZSBNQVhMQVBCREVWIDEwMAorCitzdHJ1Y3QgbGFwYmV0aGRldiB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlCSpldGhkZXY7CS8qIGxpbmsgdG8gZXRoZXJuZXQgZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UJKmF4ZGV2OwkJLyogbGFwYmV0aCBkZXZpY2UgKGxhcGIjKSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkJLyogc29tZSBzdGF0aXN0aWNzICovCit9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsYXBiZXRoX2RldmljZXMgPSBMSVNUX0hFQURfSU5JVChsYXBiZXRoX2RldmljZXMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCUdldCB0aGUgTEFQQiBkZXZpY2UgZm9yIHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoX2dldF94MjVfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsYXBiZXRoLCAmbGFwYmV0aF9kZXZpY2VzLCBub2RlKSB7CisJCWlmIChsYXBiZXRoLT5ldGhkZXYgPT0gZGV2KSAKKwkJCXJldHVybiBsYXBiZXRoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGRldl9pc19ldGhkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUiAmJiBzdHJuY21wKGRldi0+bmFtZSwgImR1bW15IiwgNSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoJUmVjZWl2ZSBhIExBUEIgZnJhbWUgdmlhIGFuIGV0aGVybmV0IGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBsYXBiZXRoX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlKQoreworCWludCBsZW4sIGVycjsKKwlzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aDsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDIpKQorCQlnb3RvIGRyb3A7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGFwYmV0aCA9IGxhcGJldGhfZ2V0X3gyNV9kZXYoZGV2KTsKKwlpZiAoIWxhcGJldGgpCisJCWdvdG8gZHJvcF91bmxvY2s7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGxhcGJldGgtPmF4ZGV2KSkKKwkJZ290byBkcm9wX3VubG9jazsKKworCWxhcGJldGgtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCWxlbiA9IHNrYi0+ZGF0YVswXSArIHNrYi0+ZGF0YVsxXSAqIDI1NjsKKwlsYXBiZXRoLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlza2JfcHVsbChza2IsIDIpOwkvKiBSZW1vdmUgdGhlIGxlbmd0aCBieXRlcyAqLworCXNrYl90cmltKHNrYiwgbGVuKTsJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KKworCWlmICgoZXJyID0gbGFwYl9kYXRhX3JlY2VpdmVkKGxhcGJldGgtPmF4ZGV2LCBza2IpKSAhPSBMQVBCX09LKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiZXRoZXI6IGxhcGJfZGF0YV9yZWNlaXZlZCBlcnIgLSAlZFxuIiwgZXJyKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Citkcm9wX3VubG9jazoKKwlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIG91dDsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFwYmV0aF9kYXRhX2luZGljYXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlza2JfcHVzaChza2IsIDEpOworCisJaWYgKHNrYl9jb3coc2tiLCAxKSkKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCisJcHRyICA9IHNrYi0+ZGF0YTsKKwkqcHRyID0gMHgwMDsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXJldHVybiBuZXRpZl9yeChza2IpOworfQorCisvKgorICoJU2VuZCBhIExBUEIgZnJhbWUgdmlhIGFuIGV0aGVybmV0IGludGVyZmFjZQorICovCitzdGF0aWMgaW50IGxhcGJldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSAtRU5PREVWOworCisJLyoKKwkgKiBKdXN0IHRvIGJlICpyZWFsbHkqIHN1cmUgbm90IHRvIHNlbmQgYW55dGhpbmcgaWYgdGhlIGludGVyZmFjZQorCSAqIGlzIGRvd24sIHRoZSBldGhlcm5ldCBkZXZpY2UgbWF5IGhhdmUgZ29uZS4KKwkgKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlnb3RvIGRyb3A7CisJfQorCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwljYXNlIDB4MDA6CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJaWYgKChlcnIgPSBsYXBiX2Nvbm5lY3RfcmVxdWVzdChkZXYpKSAhPSBMQVBCX09LKQorCQkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2Nvbm5lY3RfcmVxdWVzdCAiCisJCQkgICAgICAgImVycm9yOiAlZFxuIiwgZXJyKTsKKwkJZ290byBkcm9wX29rOworCWNhc2UgMHgwMjoKKwkJaWYgKChlcnIgPSBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdChkZXYpKSAhPSBMQVBCX09LKQorCQkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdCAiCisJCQkgICAgICAgImVycjogJWRcbiIsIGVycik7CisJCS8qIEZhbGwgdGhydSAqLworCWRlZmF1bHQ6CisJCWdvdG8gZHJvcF9vazsKKwl9CisKKwlza2JfcHVsbChza2IsIDEpOworCisJaWYgKChlcnIgPSBsYXBiX2RhdGFfcmVxdWVzdChkZXYsIHNrYikpICE9IExBUEJfT0spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2RhdGFfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGRyb3A7CisJfQorCWVyciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKK2Ryb3Bfb2s6CisJZXJyID0gMDsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxhcGJldGhfZGF0YV90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aCA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBzaXplID0gc2tiLT5sZW47CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfWDI1KTsKKworCXB0ciA9IHNrYl9wdXNoKHNrYiwgMik7CisKKwkqcHRyKysgPSBzaXplICUgMjU2OworCSpwdHIrKyA9IHNpemUgLyAyNTY7CisKKwlsYXBiZXRoLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbGFwYmV0aC0+c3RhdHMudHhfYnl0ZXMgKz0gc2l6ZTsKKworCXNrYi0+ZGV2ID0gZGV2ID0gbGFwYmV0aC0+ZXRoZGV2OworCisJZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfREVDLCBiY2FzdF9hZGRyLCBOVUxMLCAwKTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGxhcGJldGhfY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFzb24pCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKDEpOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IDB4MDE7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwluZXRpZl9yeChza2IpOworfQorCitzdGF0aWMgdm9pZCBsYXBiZXRoX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYigxKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwdHIgID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSAweDAyOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqCVN0YXRpc3RpY3MKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYXBiZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxhcGJldGgtPnN0YXRzOworfQorCisvKgorICoJU2V0IEFYLjI1IGNhbGxzaWduCisgKi8KK3N0YXRpYyBpbnQgbGFwYmV0aF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgbGFwYmV0aF9jYWxsYmFja3MgPSB7CisJLmNvbm5lY3RfY29uZmlybWF0aW9uICAgID0gbGFwYmV0aF9jb25uZWN0ZWQsCisJLmNvbm5lY3RfaW5kaWNhdGlvbiAgICAgID0gbGFwYmV0aF9jb25uZWN0ZWQsCisJLmRpc2Nvbm5lY3RfY29uZmlybWF0aW9uID0gbGFwYmV0aF9kaXNjb25uZWN0ZWQsCisJLmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiAgID0gbGFwYmV0aF9kaXNjb25uZWN0ZWQsCisJLmRhdGFfaW5kaWNhdGlvbiAgICAgICAgID0gbGFwYmV0aF9kYXRhX2luZGljYXRpb24sCisJLmRhdGFfdHJhbnNtaXQgICAgICAgICAgID0gbGFwYmV0aF9kYXRhX3RyYW5zbWl0LAorCit9OworCisvKgorICogb3Blbi9jbG9zZSBhIGRldmljZQorICovCitzdGF0aWMgaW50IGxhcGJldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGxhcGJfcmVnaXN0ZXIoZGV2LCAmbGFwYmV0aF9jYWxsYmFja3MpKSAhPSBMQVBCX09LKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9yZWdpc3RlciBlcnJvciAtICVkXG4iLCBlcnIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGJldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKChlcnIgPSBsYXBiX3VucmVnaXN0ZXIoZGV2KSkgIT0gTEFQQl9PSykKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX3VucmVnaXN0ZXIgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbGFwYmV0aF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbGFwYmV0aF94bWl0OworCWRldi0+b3BlbgkgICAgID0gbGFwYmV0aF9vcGVuOworCWRldi0+c3RvcAkgICAgID0gbGFwYmV0aF9jbG9zZTsKKwlkZXYtPmRlc3RydWN0b3IJICAgICA9IGZyZWVfbmV0ZGV2OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gbGFwYmV0aF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IGxhcGJldGhfZ2V0X3N0YXRzOworCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX1gyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDM7CisJZGV2LT5tdHUgICAgICAgICAgICAgPSAxMDAwOworCWRldi0+YWRkcl9sZW4gICAgICAgID0gMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7Cit9CisKKy8qCisgKglTZXR1cCBhIG5ldyBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgbGFwYmV0aF9uZXdfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisJaW50IHJjID0gLUVOT01FTTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqbGFwYmV0aCksICJsYXBiJWQiLCAKKwkJCSAgIGxhcGJldGhfc2V0dXApOworCWlmICghbmRldikKKwkJZ290byBvdXQ7CisKKwlsYXBiZXRoID0gbmV0ZGV2X3ByaXYobmRldik7CisJbGFwYmV0aC0+YXhkZXYgPSBuZGV2OworCisJZGV2X2hvbGQoZGV2KTsKKwlsYXBiZXRoLT5ldGhkZXYgPSBkZXY7CisKKwlyYyA9IGRldl9hbGxvY19uYW1lKG5kZXYsIG5kZXYtPm5hbWUpOworCWlmIChyYyA8IDApIAorCQlnb3RvIGZhaWw7CisKKwlyYyA9IC1FSU87CisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShuZGV2KSkKKwkJZ290byBmYWlsOworCisJbGlzdF9hZGRfcmN1KCZsYXBiZXRoLT5ub2RlLCAmbGFwYmV0aF9kZXZpY2VzKTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworZmFpbDoKKwlkZXZfcHV0KGRldik7CisJZnJlZV9uZXRkZXYobmRldik7CisJa2ZyZWUobGFwYmV0aCk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKglGcmVlIGEgbGFwYiBuZXR3b3JrIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgbGFwYmV0aF9mcmVlX2RldmljZShzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aCkKK3sKKwlkZXZfcHV0KGxhcGJldGgtPmV0aGRldik7CisJbGlzdF9kZWxfcmN1KCZsYXBiZXRoLT5ub2RlKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZShsYXBiZXRoLT5heGRldik7Cit9CisKKy8qCisgKglIYW5kbGUgZGV2aWNlIHN0YXR1cyBjaGFuZ2VzLgorICoKKyAqIENhbGxlZCBmcm9tIG5vdGlmaWVyIHdpdGggUlROTCBoZWxkLgorICovCitzdGF0aWMgaW50IGxhcGJldGhfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKworCWlmICghZGV2X2lzX2V0aGRldihkZXYpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfVVA6CisJCS8qIE5ldyBldGhlcm5ldCBkZXZpY2UgLT4gbmV3IExBUEIgaW50ZXJmYWNlCSAqLworCQlpZiAobGFwYmV0aF9nZXRfeDI1X2RldihkZXYpID09IE5VTEwpCisJCQlsYXBiZXRoX25ld19kZXZpY2UoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoJCisJCS8qIGV0aGVybmV0IGRldmljZSBjbG9zZWQgLT4gY2xvc2UgTEFQQiBpbnRlcmZhY2UgKi8KKwkJbGFwYmV0aCA9IGxhcGJldGhfZ2V0X3gyNV9kZXYoZGV2KTsKKwkJaWYgKGxhcGJldGgpIAorCQkJZGV2X2Nsb3NlKGxhcGJldGgtPmF4ZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJLyogZXRoZXJuZXQgZGV2aWNlIGRpc2FwcGVhcnMgLT4gcmVtb3ZlIExBUEIgaW50ZXJmYWNlICovCisJCWxhcGJldGggPSBsYXBiZXRoX2dldF94MjVfZGV2KGRldik7CisJCWlmIChsYXBiZXRoKQorCQkJbGFwYmV0aF9mcmVlX2RldmljZShsYXBiZXRoKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBsYXBiZXRoX3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9ERUMpLAorCS5mdW5jID0gbGFwYmV0aF9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGxhcGJldGhfZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gbGFwYmV0aF9kZXZpY2VfZXZlbnQsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJMQVBCIEV0aGVybmV0IGRyaXZlciB2ZXJzaW9uIDAuMDJcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IGxhcGJldGhfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlkZXZfYWRkX3BhY2soJmxhcGJldGhfcGFja2V0X3R5cGUpOworCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZsYXBiZXRoX2Rldl9ub3RpZmllcik7CisKKwlwcmludGsoYmFubmVyKTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQobGFwYmV0aF9pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsYXBiZXRoX2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwlkZXZfcmVtb3ZlX3BhY2soJmxhcGJldGhfcGFja2V0X3R5cGUpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZsYXBiZXRoX2Rldl9ub3RpZmllcik7CisKKwlydG5sX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmxhcGJldGhfZGV2aWNlcykgeworCQlsYXBiZXRoID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGxhcGJldGhkZXYsIG5vZGUpOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGxhcGJldGgtPmF4ZGV2KTsKKwl9CisJcnRubF91bmxvY2soKTsKK30KK21vZHVsZV9leGl0KGxhcGJldGhfY2xlYW51cF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBOYXlsb3IgPGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgdW5vZmZpY2lhbCBMQVBCIG92ZXIgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJkY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGFuIE1lZGlhIDIxMTQwIGJhc2VkIFdBTiBjYXJkcworIyBTcGVjaWZpY2FsbHkgdGhlIDEwMDAsMTIwMCw1MjAwLDUyNDUKKyMKKworb2JqLSQoQ09ORklHX0xBTk1FRElBKSArPSBsbWMubworCitsbWMtb2JqcyA6PSBsbWNfZGVidWcubyBsbWNfbWVkaWEubyBsbWNfbWFpbi5vIGxtY19wcm90by5vCisKKyMgTGlrZSBhYm92ZSBleGNlcHQgZXZlcnkgcGFja2V0IGdldHMgZWNob2VkIHRvIEtFUk5fREVCVUcKKyMgaW4gaGV4CisjCisjIERCREVGID0gXAorIyAtRERFQlVHIFwKKyMgLURMTUNfUEFDS0VUX0xPRworCitFWFRSQV9DRkxBR1MgKz0gLUkuICQoREJHREVGKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWMuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyZTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfTE1DX0hfCisjZGVmaW5lIF9MTUNfSF8KKworI2luY2x1ZGUgImxtY192YXIuaCIKKworLyoKKyAqIHByb3RvdHlwZXMgZm9yIGV2ZXJ5b25lCisgKi8KK2ludCBsbWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOwordW5zaWduZWQgbG1jX21paV9yZWFkcmVnKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVuc2lnbmVkCisgICAgICAJCQkgIGRldmFkZHIsIHVuc2lnbmVkIHJlZ25vKTsKK3ZvaWQgbG1jX21paV93cml0ZXJlZyhsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1bnNpZ25lZCBkZXZhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCBkYXRhKTsKK3ZvaWQgbG1jX2xlZF9vbihsbWNfc29mdGNfdCAqIGNvbnN0LCB1X2ludDMyX3QpOwordm9pZCBsbWNfbGVkX29mZihsbWNfc29mdGNfdCAqIGNvbnN0LCB1X2ludDMyX3QpOwordW5zaWduZWQgbG1jX21paV9yZWFkcmVnKGxtY19zb2Z0Y190ICogY29uc3QsIHVuc2lnbmVkLCB1bnNpZ25lZCk7Cit2b2lkIGxtY19taWlfd3JpdGVyZWcobG1jX3NvZnRjX3QgKiBjb25zdCwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7Cit2b2lkIGxtY19ncGlvX21raW5wdXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGJpdHMpOwordm9pZCBsbWNfZ3Bpb19ta291dHB1dChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1X2ludDMyX3QgYml0cyk7CisKK2ludCBsbWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworCitleHRlcm4gbG1jX21lZGlhX3QgbG1jX2RzM19tZWRpYTsKK2V4dGVybiBsbWNfbWVkaWFfdCBsbWNfc3NpX21lZGlhOworZXh0ZXJuIGxtY19tZWRpYV90IGxtY190MV9tZWRpYTsKK2V4dGVybiBsbWNfbWVkaWFfdCBsbWNfaHNzaV9tZWRpYTsKKworI2lmZGVmIF9EQkdfRVZFTlRMT0cKK3N0YXRpYyB2b2lkIGxtY0V2ZW50TG9nKCB1X2ludDMyX3QgRXZlbnROdW0sIHVfaW50MzJfdCBhcmcyLCB1X2ludDMyX3QgYXJnMyApOworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNjZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuYwpAQCAtMCwwICsxLDg1IEBACisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAibG1jX2RlYnVnLmgiCisKKy8qCisgKiBQcmludHMgb3V0IGxlbiwgbWF4IHRvIDgwIG9jdGV0cyB1c2luZyBwcmludGssIDIwIHBlciBsaW5lCisgKi8KK3ZvaWQgbG1jQ29uc29sZUxvZyhjaGFyICp0eXBlLCB1bnNpZ25lZCBjaGFyICp1Y0RhdGEsIGludCBpTGVuKQoreworI2lmZGVmIERFQlVHCisjaWZkZWYgTE1DX1BBQ0tFVF9MT0cKKyAgaW50IGlOZXdMaW5lID0gMTsKKyAgY2hhciBzdHJbODBdLCAqcHN0cjsKKyAgCisgIHNwcmludGYoc3RyLCBLRVJOX0RFQlVHICJsbWM6ICVzOiAiLCB0eXBlKTsKKyAgcHN0ciA9IHN0citzdHJsZW4oc3RyKTsKKyAgCisgIGlmKGlMZW4gPiAyNDApeworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImxtYzogUHJpbnRpbmcgMjQwIGNoYXJzLi4uIG91dCBvZjogJWRcbiIsIGlMZW4pOworICAgIGlMZW4gPSAyNDA7CisgIH0KKyAgZWxzZXsKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJsbWM6IFByaW50aW5nICVkIGNoYXJzXG4iLCBpTGVuKTsKKyAgfQorCisgIHdoaWxlKGlMZW4gPiAwKSAKKyAgICB7CisgICAgICBzcHJpbnRmKHBzdHIsICIlMDJ4ICIsICp1Y0RhdGEpOworICAgICAgcHN0cis9MzsKKyAgICAgIHVjRGF0YSsrOworICAgICAgaWYoICEoaU5ld0xpbmUgJSAyMCkpCisJeworCSAgc3ByaW50Zihwc3RyLCAiXG4iKTsKKwkgIHByaW50ayhzdHIpOworCSAgc3ByaW50ZihzdHIsIEtFUk5fREVCVUcgImxtYzogJXM6ICIsIHR5cGUpOworCSAgcHN0cj1zdHIrc3RybGVuKHN0cik7CisJfQorICAgICAgaU5ld0xpbmUrKzsKKyAgICAgIGlMZW4tLTsKKyAgICB9CisgIHNwcmludGYocHN0ciwgIlxuIik7CisgIHByaW50ayhzdHIpOworI2VuZGlmCisjZW5kaWYKK30KKworI2lmZGVmIERFQlVHCit1X2ludDMyX3QgbG1jRXZlbnRMb2dJbmRleCA9IDA7Cit1X2ludDMyX3QgbG1jRXZlbnRMb2dCdWZbTE1DX0VWRU5UTE9HU0laRSAqIExNQ19FVkVOVExPR0FSR1NdOworI2VuZGlmCisKK3ZvaWQgbG1jRXZlbnRMb2cgKHVfaW50MzJfdCBFdmVudE51bSwgdV9pbnQzMl90IGFyZzIsIHVfaW50MzJfdCBhcmczKQoreworI2lmZGVmIERFQlVHCisgIGxtY0V2ZW50TG9nQnVmW2xtY0V2ZW50TG9nSW5kZXgrK10gPSBFdmVudE51bTsKKyAgbG1jRXZlbnRMb2dCdWZbbG1jRXZlbnRMb2dJbmRleCsrXSA9IGFyZzI7CisgIGxtY0V2ZW50TG9nQnVmW2xtY0V2ZW50TG9nSW5kZXgrK10gPSBhcmczOworICBsbWNFdmVudExvZ0J1ZltsbWNFdmVudExvZ0luZGV4KytdID0gamlmZmllczsKKworICBsbWNFdmVudExvZ0luZGV4ICY9IChMTUNfRVZFTlRMT0dTSVpFICogTE1DX0VWRU5UTE9HQVJHUykgLSAxOworI2VuZGlmCit9CisKK3ZvaWQgbG1jX3RyYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKm1zZyl7CisjaWZkZWYgTE1DX1RSQUNFCisgICAgdW5zaWduZWQgbG9uZyBqID0gamlmZmllcyArIDM7IC8qIFdhaXQgZm9yIDUwIG1zICovCisKKyAgICBpZihpbl9pbnRlcnJ1cHQoKSl7CisgICAgICAgIHByaW50aygiJXM6ICogJXNcbiIsIGRldi0+bmFtZSwgbXNnKTsKKy8vICAgICAgICB3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCBqKzEwKSkKKy8vICAgICAgICAgICAgOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgbXNnKTsKKyAgICAgICAgd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaikpCisgICAgICAgICAgICBzY2hlZHVsZSgpOworICAgIH0KKyNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgaWZfbG1jX2xpbnV4LmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjM1NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9MTUNfREVCVUdfSF8KKyNkZWZpbmUgX0xNQ19ERUJVR19IXworCisjaWZkZWYgREVCVUcKKyNpZmRlZiBMTUNfUEFDS0VUX0xPRworI2RlZmluZSBMTUNfQ09OU09MRV9MT0coeCx5LHopIGxtY0NvbnNvbGVMb2coKHgpLCAoeSksICh6KSkKKyNlbHNlCisjZGVmaW5lIExNQ19DT05TT0xFX0xPRyh4LHkseikKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgTE1DX0NPTlNPTEVfTE9HKHgseSx6KQorI2VuZGlmCisKKworCisvKiBEZWJ1ZyAtLS0gRXZlbnQgbG9nIGRlZmluaXRpb25zIC0tLSAqLworLyogRVZFTlRMT0dTSVpFKkVWRU5UTE9HQVJHUyBuZWVkcyB0byBiZSBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgTE1DX0VWRU5UTE9HU0laRSAxMDI0CS8qIG51bWJlciBvZiBldmVudHMgaW4gZXZlbnRsb2cgKi8KKyNkZWZpbmUgTE1DX0VWRU5UTE9HQVJHUyA0CQkvKiBudW1iZXIgb2YgYXJncyBmb3IgZWFjaCBldmVudCAqLworCisvKiBldmVudCBpbmRpY2F0b3JzICovCisjZGVmaW5lIExNQ19FVkVOVF9YTVQgICAgICAgICAgIDEKKyNkZWZpbmUgTE1DX0VWRU5UX1hNVEVORCAgICAgICAgMgorI2RlZmluZSBMTUNfRVZFTlRfWE1USU5UICAgICAgICAzCisjZGVmaW5lIExNQ19FVkVOVF9SQ1ZJTlQgICAgICAgIDQKKyNkZWZpbmUgTE1DX0VWRU5UX1JDVkVORCAgICAgICAgNQorI2RlZmluZSBMTUNfRVZFTlRfSU5UICAgICAgICAgICA2CisjZGVmaW5lIExNQ19FVkVOVF9YTVRJTlRUTU8gICAgIDcKKyNkZWZpbmUgTE1DX0VWRU5UX1hNVFBSQ1RNTyAgICAgOAorI2RlZmluZSBMTUNfRVZFTlRfSU5URU5EICAgICAgICA5CisjZGVmaW5lIExNQ19FVkVOVF9SRVNFVDEgICAgICAgMTAKKyNkZWZpbmUgTE1DX0VWRU5UX1JFU0VUMiAgICAgICAxMQorI2RlZmluZSBMTUNfRVZFTlRfRk9SQ0VEUkVTRVQgIDEyCisjZGVmaW5lIExNQ19FVkVOVF9XQVRDSERPRyAgICAgMTMKKyNkZWZpbmUgTE1DX0VWRU5UX0JBRFBLVFNVUkdFICAxNAorI2RlZmluZSBMTUNfRVZFTlRfVEJVU1kwICAgICAgIDE1CisjZGVmaW5lIExNQ19FVkVOVF9UQlVTWTEgICAgICAgMTYKKworCisjaWZkZWYgREVCVUcKK2V4dGVybiB1X2ludDMyX3QgbG1jRXZlbnRMb2dJbmRleDsKK2V4dGVybiB1X2ludDMyX3QgbG1jRXZlbnRMb2dCdWZbTE1DX0VWRU5UTE9HU0laRSAqIExNQ19FVkVOVExPR0FSR1NdOworI2RlZmluZSBMTUNfRVZFTlRfTE9HKHgsIHksIHopIGxtY0V2ZW50TG9nKCh4KSwgKHkpLCAoeikpCisjZWxzZQorI2RlZmluZSBMTUNfRVZFTlRfTE9HKHgseSx6KQorI2VuZGlmIC8qIGVuZCBpZmRlZiBfREJHX0VWRU5UTE9HICovCisKK3ZvaWQgbG1jQ29uc29sZUxvZyhjaGFyICp0eXBlLCB1bnNpZ25lZCBjaGFyICp1Y0RhdGEsIGludCBpTGVuKTsKK3ZvaWQgbG1jRXZlbnRMb2cgKHVfaW50MzJfdCBFdmVudE51bSwgdV9pbnQzMl90IGFyZzIsIHVfaW50MzJfdCBhcmczKTsKK3ZvaWQgbG1jX3RyYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKm1zZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfaW9jdGwuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkZDg2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2lvY3RsLmgKQEAgLTAsMCArMSwyNTcgQEAKKyNpZm5kZWYgX0xNQ19JT0NUTF9IXworI2RlZmluZSBfTE1DX0lPQ1RMX0hfCisvKgkkSWQ6IGxtY19pb2N0bC5oLHYgMS4xNSAyMDAwLzA0LzA2IDEyOjE2OjQzIGFzaiBFeHAgJAkqLworCisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgKi8KKworI2RlZmluZSBMTUNJT0NHSU5GTyAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSszIC8qIGdldCBjdXJyZW50IHN0YXRlICovCisjZGVmaW5lIExNQ0lPQ1NJTkZPICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzQgLyogc2V0IHN0YXRlIHRvIHVzZXIgdmFsdWVzICovCisjZGVmaW5lIExNQ0lPQ0dFVExNQ1NUQVRTICAgICAgIFNJT0NERVZQUklWQVRFKzUKKyNkZWZpbmUgTE1DSU9DQ0xFQVJMTUNTVEFUUyAgICAgU0lPQ0RFVlBSSVZBVEUrNgorI2RlZmluZSBMTUNJT0NEVU1QRVZFTlRMT0cgICAgICBTSU9DREVWUFJJVkFURSs3CisjZGVmaW5lIExNQ0lPQ0dFVFhJTkZPICAgICAgICAgIFNJT0NERVZQUklWQVRFKzgKKyNkZWZpbmUgTE1DSU9DU0VUQ0lSQ1VJVCAgICAgICAgU0lPQ0RFVlBSSVZBVEUrOQorI2RlZmluZSBMTUNJT0NVTlVTRURBVE0gICAgICAgICBTSU9DREVWUFJJVkFURSsxMAorI2RlZmluZSBMTUNJT0NSRVNFVCAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSsxMQorI2RlZmluZSBMTUNJT0NUMUNPTlRST0wgICAgICAgICBTSU9DREVWUFJJVkFURSsxMgorI2RlZmluZSBMTUNJT0NJRlRZUEUgICAgICAgICAgICBTSU9DREVWUFJJVkFURSsxMworI2RlZmluZSBMTUNJT0NYSUxJTlggICAgICAgICAgICBTSU9DREVWUFJJVkFURSsxNAorCisjZGVmaW5lIExNQ19DQVJEVFlQRV9VTktOT1dOICAgICAgICAgICAgLTEKKyNkZWZpbmUgTE1DX0NBUkRUWVBFX0hTU0kgICAgICAgICAgICAgICAxICAgICAgIC8qIHByb2JlZCBjYXJkIGlzIGEgSFNTSSBjYXJkICovCisjZGVmaW5lIExNQ19DQVJEVFlQRV9EUzMgICAgICAgICAgICAgICAgMiAgICAgICAvKiBwcm9iZWQgY2FyZCBpcyBhIERTMyBjYXJkICovCisjZGVmaW5lIExNQ19DQVJEVFlQRV9TU0kgICAgICAgICAgICAgICAgMyAgICAgICAvKiBwcm9iZWQgY2FyZCBpcyBhIFNTSSBjYXJkICovCisjZGVmaW5lIExNQ19DQVJEVFlQRV9UMSAgICAgICAgICAgICAgICAgNCAgICAgICAvKiBwcm9iZWQgY2FyZCBpcyBhIFQxIGNhcmQgKi8KKworI2RlZmluZSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzUyMDAJMAkvKiBIU1NJICovCisjZGVmaW5lIExNQ19DVExfQ0FSRFRZUEVfTE1DNTI0NQkxCS8qIERTMyAqLworI2RlZmluZSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzEwMDAJMgkvKiBTU0ksIFYuMzUgKi8KKyNkZWZpbmUgTE1DX0NUTF9DQVJEVFlQRV9MTUMxMjAwICAgICAgICAzICAgICAgIC8qIERTMSAqLworCisjZGVmaW5lIExNQ19DVExfT0ZGCQkJMAkvKiBnZW5lcmljIE9GRiB2YWx1ZSAqLworI2RlZmluZSBMTUNfQ1RMX09OCQkJMQkvKiBnZW5lcmljIE9OIHZhbHVlICovCisKKyNkZWZpbmUgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUCTAJLyogY2xvY2sgb2ZmIGxpbmUgKi8KKyNkZWZpbmUgTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UCTEJLyogaW50ZXJuYWwgY2xvY2sgKi8KKworI2RlZmluZSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTYJCTE2CisjZGVmaW5lIExNQ19DVExfQ1JDX0xFTkdUSF8zMgkJMzIKKyNkZWZpbmUgTE1DX0NUTF9DUkNfQllURVNJWkVfMiAgICAgICAgICAyCisjZGVmaW5lIExNQ19DVExfQ1JDX0JZVEVTSVpFXzQgICAgICAgICAgNAorCisKKyNkZWZpbmUgTE1DX0NUTF9DQUJMRV9MRU5HVEhfTFRfMTAwRlQJMAkvKiBEUzMgY2FibGUgPCAxMDAgZmVldCAqLworI2RlZmluZSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9HVF8xMDBGVAkxCS8qIERTMyBjYWJsZSA+PSAxMDAgZmVldCAqLworCisjZGVmaW5lIExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxIDAKKyNkZWZpbmUgTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEgMQorCisvKgorICogSUZUWVBFIGRlZmluZXMKKyAqLworI2RlZmluZSBMTUNfUFBQICAgICAgICAgMSAgICAgICAgICAgICAgIC8qIHVzZSBzcHBwIGludGVyZmFjZSAqLworI2RlZmluZSBMTUNfTkVUICAgICAgICAgMiAgICAgICAgICAgICAgIC8qIHVzZSBkaXJlY3QgbmV0IGludGVyZmFjZSAqLworI2RlZmluZSBMTUNfUkFXICAgICAgICAgMyAgICAgICAgICAgICAgIC8qIHVzZSBkaXJlY3QgbmV0IGludGVyZmFjZSAqLworCisvKgorICogVGhlc2UgYXJlIG5vdCBpbiB0aGUgbGVhc3QgSU9DVEwgcmVsYXRlZCwgYnV0IEkgd2FudCB0aGVtIGNvbW1vbi4KKyAqLworLyoKKyAqIGFzc2lnbm1lbnRzIGZvciB0aGUgR1BJTyByZWdpc3RlciBvbiB0aGUgREVDIGNoaXAgKGNvbW1vbikKKyAqLworI2RlZmluZSBMTUNfR0VQX0lOSVQJCTB4MDEgLyogMDogKi8KKyNkZWZpbmUgTE1DX0dFUF9SRVNFVAkJMHgwMiAvKiAxOiAqLworI2RlZmluZSBMTUNfR0VQX01PREUJCTB4MTAgLyogNDogKi8KKyNkZWZpbmUgTE1DX0dFUF9EUAkJMHgyMCAvKiA1OiAqLworI2RlZmluZSBMTUNfR0VQX0RBVEEJCTB4NDAgLyogNjogc2VyaWFsIG91dCAqLworI2RlZmluZSBMTUNfR0VQX0NMSwkgICAgICAgIDB4ODAgLyogNzogc2VyaWFsIGNsb2NrICovCisKKy8qCisgKiBIU1NJIEdQSU8gYXNzaWdubWVudHMKKyAqLworI2RlZmluZSBMTUNfR0VQX0hTU0lfU1QJCTB4MDQgLyogMjogcmVjZWl2ZSB0aW1pbmcgc2Vuc2UgKGRlcHJlY2F0ZWQpICovCisjZGVmaW5lIExNQ19HRVBfSFNTSV9DTE9DSwkweDA4IC8qIDM6IGNsb2NrIHNvdXJjZSAqLworCisvKgorICogVDEgR1BJTyBhc3NpZ25tZW50cworICovCisjZGVmaW5lIExNQ19HRVBfU1NJX0dFTkVSQVRPUgkweDA0IC8qIDI6IGVuYWJsZSBwcm9nIGZyZXEgZ2VuIHNlcmlhbCBpL2YgKi8KKyNkZWZpbmUgTE1DX0dFUF9TU0lfVFhDTE9DSwkweDA4IC8qIDM6IHByb3ZpZGUgY2xvY2sgb24gVFhDTE9DSyBvdXRwdXQgKi8KKworLyoKKyAqIENvbW1vbiBNSUkxNiBiaXRzCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0xFRDAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTE1DX01JSTE2X0xFRDEgICAgICAgICAweDAxMDAKKyNkZWZpbmUgTE1DX01JSTE2X0xFRDIgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTE1DX01JSTE2X0xFRDMgICAgICAgICAweDA0MDAgIC8qIEVycm9yLCBhbmQgdGhlIHJlZCBvbmUgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0xFRF9BTEwgICAgICAweDA3ODAgIC8qIExFRCBiaXQgbWFzayAqLworI2RlZmluZSBMTUNfTUlJMTZfRklGT19SRVNFVCAgIDB4MDgwMAorCisvKgorICogZGVmaW5pdGlvbnMgZm9yIEhTU0kKKyAqLworI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9UQSAgICAgIDB4MDAwMQorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9DQSAgICAgIDB4MDAwMgorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9MQSAgICAgIDB4MDAwNAorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9MQiAgICAgIDB4MDAwOAorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9MQyAgICAgIDB4MDAxMAorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9UTSAgICAgIDB4MDAyMAorI2RlZmluZSBMTUNfTUlJMTZfSFNTSV9DUkMgICAgIDB4MDA0MAorCisvKgorICogYXNzaWdubWVudHMgZm9yIHRoZSBNSUkgcmVnaXN0ZXIgMTYgKERTMykKKyAqLworI2RlZmluZSBMTUNfTUlJMTZfRFMzX1pFUk8JMHgwMDAxCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfVFJMQksJMHgwMDAyCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfTE5MQksJMHgwMDA0CisjZGVmaW5lIExNQ19NSUkxNl9EUzNfUkFJUwkweDAwMDgKKyNkZWZpbmUgTE1DX01JSTE2X0RTM19UQUlTCTB4MDAxMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX0JJU1QJMHgwMDIwCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfRExPUwkweDAwNDAKKyNkZWZpbmUgTE1DX01JSTE2X0RTM19DUkMJMHgxMDAwCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfU0NSQU0JMHgyMDAwCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfU0NSQU1fTEFSUyAweDQwMDAKKworLyogTm90ZTogMiBwYWlycyBvZiBMRURzIHdoZXJlIHN3YXBwZWQgYnkgbWlzdGFrZQorICogaW4gWGlsaW54IGNvZGUgZm9yIERTMyAmIERTMSBhZGFwdGVycyAqLworI2RlZmluZSBMTUNfRFMzX0xFRDAgICAgMHgwMTAwICAgICAgICAgIC8qIGJpdCAwOCAgeWVsbG93ICovCisjZGVmaW5lIExNQ19EUzNfTEVEMSAgICAweDAwODAgICAgICAgICAgLyogYml0IDA3ICBibHVlICAgKi8KKyNkZWZpbmUgTE1DX0RTM19MRUQyICAgIDB4MDQwMCAgICAgICAgICAvKiBiaXQgMTAgIGdyZWVuICAqLworI2RlZmluZSBMTUNfRFMzX0xFRDMgICAgMHgwMjAwICAgICAgICAgIC8qIGJpdCAwOSAgcmVkICAgICovCisKKy8qCisgKiBmcmFtZXIgcmVnaXN0ZXIgMCBhbmQgNyAoNyBpcyBsYXRjaGVkIGFuZCByZXNldCBvbiByZWFkKQorICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9ETE9TICAgICAgICAgICAgMHg4MCAgICAvKiBkaWdpdGFsIGxvc3Mgb2Ygc2VydmljZSAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzBfT09GUyAgICAgICAgICAgIDB4NDAgICAgLyogb3V0IG9mIGZyYW1lIHN5bmMgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcwX0FJUyAgICAgICAgICAgICAweDIwICAgIC8qIGFsYXJtIGluZGljYXRpb24gc2lnbmFsICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9DSVMgICAgICAgICAgICAgMHgxMCAgICAvKiBjaGFubmVsIGlkbGUgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcwX0xPQyAgICAgICAgICAgICAweDA4ICAgIC8qIGxvc3Mgb2YgY2xvY2sgKi8KKworLyoKKyAqIEZyYW1lciByZWdpc3RlciA5IGNvbnRhaW5zIHRoZSBibHVlIGFsYXJtIHNpZ25hbAorICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHOV9SQkxVRSAgICAgICAgICAweDAyICAgICAvKiBCbHVlIGFsYXJtIGZhaWx1cmUgKi8KKworLyoKKyAqIEZyYW1lciByZWdpc3RlciAweDEwIGNvbnRhaW5zIHhiaXQgZXJyb3IKKyAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzEwX1hCSVQgICAgICAgICAgMHgwMSAgICAgLyogWCBiaXQgZXJyb3IgYWxhcm0gZmFpbHVyZSAqLworCisvKgorICogQW5kIFNTSSwgTE1DMTAwMAorICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfRFRSCTB4MDAwMQkvKiBEVFIgb3V0cHV0IFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfRFNSCTB4MDAwMgkvKiBEU1IgaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9SVFMJMHgwMDA0CS8qIFJUUyBvdXRwdXQgUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9DVFMJMHgwMDA4CS8qIENUUyBpbnB1dCBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0RDRAkweDAwMTAJLyogRENEIGlucHV0IFJPICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfUkkJCTB4MDAyMAkvKiBSSSBpbnB1dCBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0NSQyAgICAgICAgICAgICAgICAweDEwMDAgIC8qIENSQyBzZWxlY3QgLSBSVyAqLworCisvKgorICogYml0cyAweDAwODAgdGhyb3VnaCAweDA4MDAgYXJlIGdlbmVyaWMsIGFuZCBkZXNjcmliZWQKKyAqIGFib3ZlIHdpdGggTE1DX01JSTE2X0xFRFswMTIzXSBfTEVEX0FMTCwgYW5kIF9GSUZPX1JFU0VUCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9MTAkJMHgxMDAwCS8qIExMIG91dHB1dCBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX1JMCQkweDIwMDAJLyogUkwgb3V0cHV0IFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfVE0JCTB4NDAwMAkvKiBUTSBpbnB1dCBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0xPT1AJMHg4MDAwCS8qIGxvb3BiYWNrIGVuYWJsZSBSVyAqLworCisvKgorICogU29tZSBvZiB0aGUgTUlJMTYgYml0cyBhcmUgbWlycm9yZWQgaW4gdGhlIE1JSTE3IHJlZ2lzdGVyIGFzIHdlbGwsCisgKiBidXQgbGV0J3Mga2VlcCB0aGluZyBzZXBhcmF0ZSBmb3Igbm93LCBhbmQgZ2V0IG9ubHkgdGhlIGNhYmxlIGZyb20KKyAqIHRoZSBNSUkxNy4KKyAqLworI2RlZmluZSBMTUNfTUlJMTdfU1NJX0NBQkxFX01BU0sJMHgwMDM4CS8qIG1hc2sgdG8gZXh0cmFjdCB0aGUgY2FibGUgdHlwZSAqLworI2RlZmluZSBMTUNfTUlJMTdfU1NJX0NBQkxFX1NISUZUIDMJLyogc2hpZnQgdG8gZXh0cmFjdCB0aGUgY2FibGUgdHlwZSAqLworCisvKgorICogQW5kIFQxLCBMTUMxMjAwCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1QxX1VOVVNFRDEgICAgMHgwMDAzCisjZGVmaW5lIExNQ19NSUkxNl9UMV9YT0UgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExNQ19NSUkxNl9UMV9SU1QgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBUMSBjaGlwIHJlc2V0IC0gUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1QxX1ogICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIG91dHB1dCBpbXBlZGFuY2UgVDE9MSwgRTE9MCBvdXRwdXQgLSBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfVDFfSU5UUiAgICAgICAgICAgICAgIDB4MDAyMCAgLyogaW50ZXJydXB0IGZyb20gODM3MCAtIFJPICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9PTkVTRUMgICAgICAgICAgICAgMHgwMDQwICAvKiBvbmUgc2Vjb25kIHNxdWFyZSB3YXZlIC0gcm8gKi8KKworI2RlZmluZSBMTUNfTUlJMTZfVDFfTEVEMCAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBMTUNfTUlJMTZfVDFfTEVEMSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBMTUNfTUlJMTZfVDFfTEVEMiAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBMTUNfTUlJMTZfVDFfTEVEMyAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBMTUNfTUlJMTZfVDFfRklGT19SRVNFVCAweDA4MDAKKworI2RlZmluZSBMTUNfTUlJMTZfVDFfQ1JDICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQ1JDIHNlbGVjdCAtIFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9VTlVTRUQyICAgIDB4ZTAwMAorCisKKy8qIDgzNzAgZnJhbWVyIHJlZ2lzdGVycyAgKi8KKworI2RlZmluZSBUMUZSQU1FUl9BTEFSTTFfU1RBVFVTICAweDQ3CisjZGVmaW5lIFQxRlJBTUVSX0FMQVJNMl9TVEFUVVMgIDB4NDgKKyNkZWZpbmUgVDFGUkFNRVJfRkVSUl9MU0IgICAgICAgICAgICAgICAweDUwCisjZGVmaW5lIFQxRlJBTUVSX0ZFUlJfTVNCICAgICAgICAgICAgICAgMHg1MSAgICAvKiBmcmFtaW5nIGJpdCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIFQxRlJBTUVSX0xDVl9MU0IgICAgICAgICAgICAgICAgMHg1NAorI2RlZmluZSBUMUZSQU1FUl9MQ1ZfTVNCICAgICAgICAgICAgICAgIDB4NTUgICAgLyogbGluZSBjb2RlIHZpb2xhdGlvbiBjb3VudGVyICovCisjZGVmaW5lIFQxRlJBTUVSX0FFUlIgICAgICAgICAgICAgICAgICAgMHg1QQorCisvKiBtYXNrIGZvciB0aGUgYWJvdmUgQUVSUiByZWdpc3RlciAqLworI2RlZmluZSBUMUZSQU1FUl9MT0ZfTUFTSyAgICAgICAgICAgICAgICgweDBmMCkgLyogcmVjZWl2ZSBsb3NzIG9mIGZyYW1lICovCisjZGVmaW5lIFQxRlJBTUVSX0NPRkFfTUFTSyAgICAgICAgICAgICAgKDB4MGMwKSAvKiBjaGFuZ2Ugb2YgZnJhbWUgYWxpZ25tZW50ICovCisjZGVmaW5lIFQxRlJBTUVSX1NFRl9NQVNLICAgICAgICAgICAgICAgKDB4MDMpICAvKiBzZXZlcmVseSBlcnJvcmVkIGZyYW1lICAqLworCisvKiA4MzcwIGZyYW1lciByZWdpc3RlciBBTE0xICgweDQ3KSB2YWx1ZXMKKyAqIHVzZWQgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisgKi8KKworI2RlZmluZSBUMUZfU0lHRlJaICAgICAgMHgwMSAgICAvKiBzaWduYWxpbmcgZnJlZXplICovCisjZGVmaW5lIFQxRl9STE9GICAgICAgICAweDAyICAgIC8qIHJlY2VpdmUgbG9zcyBvZiBmcmFtZSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgVDFGX1JMT1MgICAgICAgIDB4MDQgICAgLyogcmVjZWl2ZSBsb3NzIG9mIHNpZ25hbCAqLworI2RlZmluZSBUMUZfUkFMT1MgICAgICAgMHgwOCAgICAvKiByZWNlaXZlIGFuYWxvZyBsb3NzIG9mIHNpZ25hbCBvciBSQ0tJIGxvc3Mgb2YgY2xvY2sgKi8KKyNkZWZpbmUgVDFGX1JBSVMgICAgICAgIDB4MTAgICAgLyogcmVjZWl2ZSBhbGFybSBpbmRpY2F0aW9uIHNpZ25hbCAqLworI2RlZmluZSBUMUZfVU5VU0VEICAgICAgMHgyMAorI2RlZmluZSBUMUZfUllFTCAgICAgICAgMHg0MCAgICAvKiByZWNlaXZlIHllbGxvdyBhbGFybSAqLworI2RlZmluZSBUMUZfUk1ZRUwgICAgICAgMHg4MCAgICAvKiByZWNlaXZlIG11bHRpZnJhbWUgeWVsbG93IGFsYXJtICovCisKKyNkZWZpbmUgTE1DX1QxRl9XUklURSAgICAgICAwCisjZGVmaW5lIExNQ19UMUZfUkVBRCAgICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCBsbWNfc3QxZl9jb250cm9sIHsKKyAgaW50IGNvbW1hbmQ7CisgIGludCBhZGRyZXNzOworICBpbnQgdmFsdWU7CisgIGNoYXIgX191c2VyICpkYXRhOworfSBsbWNfdDFmX2NvbnRyb2w7CisKK2VudW0gbG1jX3hpbGlueF9jIHsKKyAgICBsbWNfeGlsaW54X3Jlc2V0ID0gMSwKKyAgICBsbWNfeGlsaW54X2xvYWRfcHJvbSA9IDIsCisgICAgbG1jX3hpbGlueF9sb2FkID0gMworfTsKKworc3RydWN0IGxtY194aWxpbnhfY29udHJvbCB7CisgICAgZW51bSBsbWNfeGlsaW54X2MgY29tbWFuZDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgX191c2VyICpkYXRhOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBUMSBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMTUNfTUlJX0xlZE1hc2sgICAgICAgICAgICAgICAgIDB4MDc4MAorI2RlZmluZSBMTUNfTUlJX0xlZEJpdFBvcyAgICAgICAgICAgICAgIDcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNTQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYwpAQCAtMCwwICsxLDIyMDEgQEAKKyAvKgorICAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIExBTiBNZWRpYSBDb3Jwb3JhdGlvbiAoTE1DKQorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICB3d3cubGFubWVkaWEuY29tCisgICoKKyAgKiBUaGlzIGNvZGUgaXMgd3JpdHRlbiBieToKKyAgKiBBbmRyZXcgU3RhbmxleS1Kb25lcyAoYXNqQGNiYW4uY29tKQorICAqIFJvYiBCcmF1biAoYmJyYXVuQHZpeC5jb20pLAorICAqIE1pY2hhZWwgR3JhZmYgKGV4cGxvcmVyQHZpeC5jb20pIGFuZAorICAqIE1hdHQgVGhvbWFzIChtYXR0QDNhbS1zb2Z0d2FyZS5jb20pLgorICAqCisgICogV2l0aCBIZWxwIEJ5OgorICAqIERhdmlkIEJvZ2dzCisgICogUm9uIENyYW5lCisgICogQWxhbiBDb3gKKyAgKgorICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgKgorICAqIERyaXZlciBmb3IgdGhlIExhbk1lZGlhIExNQzUyMDAsIExNQzUyNDUsIExNQzEwMDAsIExNQzEyMDAgY2FyZHMuCisgICoKKyAgKiBUbyBjb250cm9sIGxpbmsgc3BlY2lmaWMgb3B0aW9ucyBsbWNjdGwgaXMgcmVxdWlyZWQuCisgICogSXQgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLmxhbm1lZGlhLmNvbS4KKyAgKgorICAqIExpbnV4IGRyaXZlciBub3RlczoKKyAgKiBMaW51eCB1c2VzIHRoZSBkZXZpY2Ugc3RydWN0IGxtY19wcml2YXRlIHRvIHBhc3MgcHJpdmF0ZSBpbmZvcm1hdGlvbgorICAqIGFycm91bmQuCisgICoKKyAgKiBUaGUgaW5pdGlhbGl6YXRpb24gcG9ydGlvbiBvZiB0aGlzIGRyaXZlciAodGhlIGxtY19yZXNldCgpIGFuZCB0aGUKKyAgKiBsbWNfZGVjX3Jlc2V0KCkgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIHRoZSBsZWQgY29udHJvbHMgYW5kIHRoZQorICAqIGxtY19pbml0Y3NycygpIGZ1bmN0aW9ucy4KKyAgKgorICAqIFRoZSB3YXRjaGRvZyBmdW5jdGlvbiBydW5zIGV2ZXJ5IHNlY29uZCBhbmQgY2hlY2tzIHRvIHNlZSBpZgorICAqIHdlIHN0aWxsIGhhdmUgbGluaywgYW5kIHRoYXQgdGhlIHRpbWluZyBzb3VyY2UgaXMgd2hhdCB3ZSBleHBlY3RlZAorICAqIGl0IHRvIGJlLiAgSWYgbGluayBpcyBsb3N0LCB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBkb3duLCBhbmQKKyAgKiB3ZSBubyBsb25nZXIgY2FuIHRyYW5zbWl0LgorICAqCisgICovCisKKy8qICRJZDogbG1jX21haW4uYyx2IDEuMzYgMjAwMC8wNC8xMSAwNToyNToyNSBhc2ogRXhwICQgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+ICAgICAgICAgICAgIC8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisvLyNpbmNsdWRlIDxhc20vc3BpbmxvY2suaD4KKworI2RlZmluZSBEUklWRVJfTUFKT1JfVkVSU0lPTiAgICAgMQorI2RlZmluZSBEUklWRVJfTUlOT1JfVkVSU0lPTiAgICAzNAorI2RlZmluZSBEUklWRVJfU1VCX1ZFUlNJT04gICAgICAgMAorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICAoKERSSVZFUl9NQUpPUl9WRVJTSU9OIDw8IDgpICsgRFJJVkVSX01JTk9SX1ZFUlNJT04pCisKKyNpbmNsdWRlICJsbWMuaCIKKyNpbmNsdWRlICJsbWNfdmFyLmgiCisjaW5jbHVkZSAibG1jX2lvY3RsLmgiCisjaW5jbHVkZSAibG1jX2RlYnVnLmgiCisjaW5jbHVkZSAibG1jX3Byb3RvLmgiCisKK3N0YXRpYyBpbnQgbG1jX2ZpcnN0X2xvYWQgPSAwOworCitzdGF0aWMgaW50IExNQ19QS1RfQlVGX1NaID0gMTU0MjsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxtY19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwKKwkgIFBDSV9WRU5ET1JfSURfTE1DLCBQQ0lfQU5ZX0lEIH0sCisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwKKwkgIFBDSV9BTllfSUQsIFBDSV9WRU5ET1JfSURfTE1DIH0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBsbWNfcGNpX3RibCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIGludCBsbWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbG1jX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxtY19yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxtY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbG1jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGxtY19pbml0Y3NycyhsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3NycHRyX3QgY3NyX2Jhc2UsIHNpemVfdCBjc3Jfc2l6ZSk7CitzdGF0aWMgdm9pZCBsbWNfc29mdHJlc2V0KGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3J1bm5pbmdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxtY19pZmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGxtY19yZXNldChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKTsKK3N0YXRpYyB2b2lkIGxtY19kZWNfcmVzZXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYyk7CitzdGF0aWMgdm9pZCBsbWNfZHJpdmVyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBsaW51eCByZXNlcnZlcyAxNiBkZXZpY2Ugc3BlY2lmaWMgSU9DVExzLiAgV2UgY2FsbCB0aGVtCisgKiBMTUNJT0MqIHRvIGNvbnRyb2wgdmFyaW91cyBiaXRzIG9mIG91ciB3b3JsZC4KKyAqLworaW50IGxtY19pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgbG1jX2N0bF90IGN0bDsKKyAgICBpbnQgcmV0OworICAgIHVfaW50MTZfdCByZWdWYWw7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHN0cnVjdCBzcHBwICpzcDsKKworICAgIHJldCA9IC1FT1BOT1RTVVBQOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2lvY3RsIGluIik7CisKKyAgICAvKgorICAgICAqIE1vc3QgZnVuY3Rpb25zIG1lc3Mgd2l0aCB0aGUgc3RydWN0dXJlCisgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHdlIGRvIHRoZSBwb2xsaW5nCisgICAgICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV0dXJuIGN1cnJlbnQgZHJpdmVyIHN0YXRlLiAgU2luY2Ugd2Uga2VlcCB0aGlzIHVwCisgICAgICAgICAqIFRvIGRhdGUgaW50ZXJuYWxseSwganVzdCBjb3B5IHRoaXMgb3V0IHRvIHRoZSB1c2VyLgorICAgICAgICAgKi8KKyAgICBjYXNlIExNQ0lPQ0dJTkZPOiAvKmZvbGQwMSovCisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnNjLT5pY3RsLCBzaXplb2YgKGxtY19jdGxfdCkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTUNJT0NTSU5GTzogLypmb2xkMDEqLworICAgICAgICBzcCA9ICYoKHN0cnVjdCBwcHBfZGV2aWNlICopIGRldiktPnNwcHA7CisgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihkZXYtPmZsYWdzICYgSUZGX1VQKXsKKyAgICAgICAgICAgIHJldCA9IC1FQlVTWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZjdGwsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAobG1jX2N0bF90KSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfc3RhdHVzIChzYywgJmN0bCk7CisKKyAgICAgICAgaWYoY3RsLmNyY19sZW5ndGggIT0gc2MtPmljdGwuY3JjX2xlbmd0aCkgeworICAgICAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NyY19sZW5ndGgoc2MsIGN0bC5jcmNfbGVuZ3RoKTsKKwkgICAgaWYgKHNjLT5pY3RsLmNyY19sZW5ndGggPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzE2KQorCQlzYy0+VHhEZXNjcmlwdENvbnRyb2xJbml0IHw9ICBMTUNfVERFU19BRERfQ1JDX0RJU0FCTEU7CisJICAgIGVsc2UKKwkJc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdCAmPSB+TE1DX1RERVNfQUREX0NSQ19ESVNBQkxFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0bC5rZWVwYWxpdmVfb25vZmYgPT0gTE1DX0NUTF9PRkYpCisgICAgICAgICAgICBzcC0+cHBfZmxhZ3MgJj0gflBQX0tFRVBBTElWRTsJLyogVHVybiBvZmYgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3AtPnBwX2ZsYWdzIHw9IFBQX0tFRVBBTElWRTsJLyogVHVybiBvbiAqLworCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTUNJT0NJRlRZUEU6IC8qZm9sZDAxKi8KKyAgICAgICAgeworICAgICAgICAgICAgdV9pbnQxNl90CW9sZF90eXBlID0gc2MtPmlmX3R5cGU7CisgICAgICAgICAgICB1X2ludDE2X3QJbmV3X3R5cGU7CisKKwkgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld190eXBlLCBpZnItPmlmcl9kYXRhLCBzaXplb2YodV9pbnQxNl90KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgICAgIAorCSAgICBpZiAobmV3X3R5cGUgPT0gb2xkX3R5cGUpCisJICAgIHsKKwkJcmV0ID0gMCA7CisJCWJyZWFrOwkJCQkvKiBubyBjaGFuZ2UgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG1jX3Byb3RvX2Nsb3NlKHNjKTsKKyAgICAgICAgICAgIGxtY19wcm90b19kZXRhY2goc2MpOworCisgICAgICAgICAgICBzYy0+aWZfdHlwZSA9IG5ld190eXBlOworLy8gICAgICAgICAgICBsbWNfcHJvdG9faW5pdChzYyk7CisgICAgICAgICAgICBsbWNfcHJvdG9fYXR0YWNoKHNjKTsKKyAgICAgICAgICAgIGxtY19wcm90b19vcGVuKHNjKTsKKworCSAgICByZXQgPSAwIDsKKwkgICAgYnJlYWsgOworCX0KKworICAgIGNhc2UgTE1DSU9DR0VUWElORk86IC8qZm9sZDAxKi8KKyAgICAgICAgc2MtPmxtY194aW5mby5NYWdpYzAgPSAweEJFRUZDQUZFOworCisgICAgICAgIHNjLT5sbWNfeGluZm8uUGNpQ2FyZFR5cGUgPSBzYy0+bG1jX2NhcmR0eXBlOworICAgICAgICBzYy0+bG1jX3hpbmZvLlBjaVNsb3ROdW1iZXIgPSAwOworICAgICAgICBzYy0+bG1jX3hpbmZvLkRyaXZlck1ham9yVmVyc2lvbiA9IERSSVZFUl9NQUpPUl9WRVJTSU9OOworICAgICAgICBzYy0+bG1jX3hpbmZvLkRyaXZlck1pbm9yVmVyc2lvbiA9IERSSVZFUl9NSU5PUl9WRVJTSU9OOworICAgICAgICBzYy0+bG1jX3hpbmZvLkRyaXZlclN1YlZlcnNpb24gPSBEUklWRVJfU1VCX1ZFUlNJT047CisgICAgICAgIHNjLT5sbWNfeGluZm8uWGlsaW54UmV2aXNpb25OdW1iZXIgPQorICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMykgJiAweGY7CisgICAgICAgIHNjLT5sbWNfeGluZm8uTWF4RnJhbWVTaXplID0gTE1DX1BLVF9CVUZfU1o7CisgICAgICAgIHNjLT5sbWNfeGluZm8ubGlua19zdGF0dXMgPSBzYy0+bG1jX21lZGlhLT5nZXRfbGlua19zdGF0dXMgKHNjKTsKKyAgICAgICAgc2MtPmxtY194aW5mby5taWlfcmVnMTYgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgICAgICAgc2MtPmxtY194aW5mby5NYWdpYzEgPSAweERFQURCRUVGOworCisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnNjLT5sbWNfeGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3hpbmZvKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgcmV0ID0gMDsKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DR0VUTE1DU1RBVFM6IC8qZm9sZDAxKi8KKyAgICAgICAgaWYgKHNjLT5sbWNfY2FyZHR5cGUgPT0gTE1DX0NBUkRUWVBFX1QxKXsKKyAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfRkVSUl9MU0IpOworICAgICAgICAgICAgc2MtPnN0YXRzLmZyYW1pbmdCaXRFcnJvckNvdW50ICs9CisgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpICYgMHhmZjsKKyAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfRkVSUl9NU0IpOworICAgICAgICAgICAgc2MtPnN0YXRzLmZyYW1pbmdCaXRFcnJvckNvdW50ICs9CisgICAgICAgICAgICAgICAgKGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmYpIDw8IDg7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0xDVl9MU0IpOworICAgICAgICAgICAgc2MtPnN0YXRzLmxpbmVDb2RlVmlvbGF0aW9uQ291bnQgKz0KKyAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCkgJiAweGZmOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9MQ1ZfTVNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5saW5lQ29kZVZpb2xhdGlvbkNvdW50ICs9CisgICAgICAgICAgICAgICAgKGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmYpIDw8IDg7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0FFUlIpOworICAgICAgICAgICAgcmVnVmFsID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpICYgMHhmZjsKKworICAgICAgICAgICAgc2MtPnN0YXRzLmxvc3NPZkZyYW1lQ291bnQgKz0KKyAgICAgICAgICAgICAgICAocmVnVmFsICYgVDFGUkFNRVJfTE9GX01BU0spID4+IDQ7CisgICAgICAgICAgICBzYy0+c3RhdHMuY2hhbmdlT2ZGcmFtZUFsaWdubWVudENvdW50ICs9CisgICAgICAgICAgICAgICAgKHJlZ1ZhbCAmIFQxRlJBTUVSX0NPRkFfTUFTSykgPj4gMjsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5zZXZlcmVseUVycm9yZWRGcmFtZUNvdW50ICs9CisgICAgICAgICAgICAgICAgcmVnVmFsICYgVDFGUkFNRVJfU0VGX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZzYy0+c3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTUNJT0NDTEVBUkxNQ1NUQVRTOiAvKmZvbGQwMSovCisgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSl7CisgICAgICAgICAgICByZXQgPSAtRVBFUk07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCAoJnNjLT5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpKTsKKyAgICAgICAgc2MtPnN0YXRzLmNoZWNrID0gU1RBVENIRUNLOworICAgICAgICBzYy0+c3RhdHMudmVyc2lvbl9zaXplID0gKERSSVZFUl9WRVJTSU9OIDw8IDE2KSArCisgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBsbWNfc3RhdGlzdGljcyk7CisgICAgICAgIHNjLT5zdGF0cy5sbWNfY2FyZHR5cGUgPSBzYy0+bG1jX2NhcmR0eXBlOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DU0VUQ0lSQ1VJVDogLypmb2xkMDEqLworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihkZXYtPmZsYWdzICYgSUZGX1VQKXsKKyAgICAgICAgICAgIHJldCA9IC1FQlVTWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZjdGwsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAobG1jX2N0bF90KSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NpcmN1aXRfdHlwZShzYywgY3RsLmNpcmN1aXRfdHlwZSk7CisgICAgICAgIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9IGN0bC5jaXJjdWl0X3R5cGU7CisgICAgICAgIHJldCA9IDA7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExNQ0lPQ1JFU0VUOiAvKmZvbGQwMSovCisgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSl7CisgICAgICAgICAgICByZXQgPSAtRVBFUk07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IGRyaXZlciBhbmQgYnJpbmcgYmFjayB0byBjdXJyZW50IHN0YXRlICovCisgICAgICAgIHByaW50ayAoIiBSRUcxNiBiZWZvcmUgcmVzZXQgKyUwNHhcbiIsIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KSk7CisgICAgICAgIGxtY19ydW5uaW5nX3Jlc2V0IChkZXYpOworICAgICAgICBwcmludGsgKCIgUkVHMTYgYWZ0ZXIgcmVzZXQgKyUwNHhcbiIsIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KSk7CisKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfRk9SQ0VEUkVTRVQsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNikpOworCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgREVCVUcKKyAgICBjYXNlIExNQ0lPQ0RVTVBFVkVOVExPRzoKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmbG1jRXZlbnRMb2dJbmRleCwgc2l6ZW9mICh1MzIpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEgKyBzaXplb2YgKHUzMiksIGxtY0V2ZW50TG9nQnVmLCBzaXplb2YgKGxtY0V2ZW50TG9nQnVmKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBlbmQgaWZkZWYgX0RCR19FVkVOVExPRyAqLworICAgIGNhc2UgTE1DSU9DVDFDT05UUk9MOiAvKmZvbGQwMSovCisgICAgICAgIGlmIChzYy0+bG1jX2NhcmR0eXBlICE9IExNQ19DQVJEVFlQRV9UMSl7CisgICAgICAgICAgICByZXQgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DSU9DWElMSU5YOiAvKmZvbGQwMSovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBsbWNfeGlsaW54X2NvbnRyb2wgeGM7IC8qZm9sZDAyKi8KKworICAgICAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKXsKKyAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTdG9wIHRoZSB4d2l0dGVyIHdobGllIHdlIHJlc3RhcnQgdGhlIGhhcmR3YXJlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZ4YywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIChzdHJ1Y3QgbG1jX3hpbGlueF9jb250cm9sKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICBzd2l0Y2goeGMuY29tbWFuZCl7CisgICAgICAgICAgICBjYXNlIGxtY194aWxpbnhfcmVzZXQ6IC8qZm9sZDAyKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHUxNiBtaWk7CisgICAgICAgICAgICAgICAgICAgIG1paSA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBNYWtlIGFsbCBvZiB0aGVtIDAgYW5kIG1ha2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIG1ha2UgdGhlIHJlc2V0IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtvdXRwdXQoc2MsIExNQ19HRVBfUkVTRVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFJFU0VUIGxvdyB0byBmb3JjZSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbHNvIGZvcmNlcworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdHJhbnNtaXR0ZXIgY2xvY2sgdG8gYmUgaW50ZXJuYWwsIGJ1dCB3ZSBleHBlY3QgdG8gcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICogdGhhdCBsYXRlciBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+TE1DX0dFUF9SRVNFVDsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogaG9sZCBmb3IgbW9yZSB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDUwKTsKKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9SRVNFVDsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogc3RvcCBkcml2aW5nIFhpbGlueC1yZWxhdGVkIHNpZ25hbHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBmcmFtbWVyIGhhcmR3YXJlICovCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIDEpOworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfc3RhdHVzIChzYywgTlVMTCk7CisvLyAgICAgICAgICAgICAgICAgICAgbG1jX3NvZnRyZXNldChzYyk7CisKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA1OyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgIHJldCA9IDB4MDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBsbWNfeGlsaW54X2xvYWRfcHJvbTogLypmb2xkMDIqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2IG1paTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQgPSA1MDAwMDA7CisgICAgICAgICAgICAgICAgICAgIG1paSA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBNYWtlIGFsbCBvZiB0aGVtIDAgYW5kIG1ha2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIG1ha2UgdGhlIHJlc2V0IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtvdXRwdXQoc2MsICBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogUkVTRVQgbG93IHRvIGZvcmNlIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsc28gZm9yY2VzCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSB0cmFuc21pdHRlciBjbG9jayB0byBiZSBpbnRlcm5hbCwgYnV0IHdlIGV4cGVjdCB0byByZXNldAorICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IGxhdGVyIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9SRVNFVCB8IExNQ19HRVBfRFApOworICAgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBob2xkIGZvciBtb3JlIHRoYW4gMTAgbWljcm9zZWNvbmRzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoNTApOworCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVDsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGJ1c3kgd2FpdCBmb3IgdGhlIGNoaXAgdG8gcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoTE1DX0NTUl9SRUFEKHNjLCBjc3JfZ3ApICYgTE1DX0dFUF9JTklUKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZW91dC0tID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICA7CisKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIGRyaXZpbmcgWGlsaW54LXJlbGF0ZWQgc2lnbmFscworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtpbnB1dChzYywgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMHgwOworICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBsbWNfeGlsaW54X2xvYWQ6IC8qZm9sZDAyKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGludCBwb3M7CisgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gNTAwMDAwOworCisgICAgICAgICAgICAgICAgICAgIGlmKHhjLmRhdGEgPT0gMHgwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGttYWxsb2MoeGMubGVuLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSA9PSAweDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjb3B5XG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKGRhdGEsIHhjLmRhdGEsIHhjLmxlbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCWtmcmVlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAJcmV0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogU3RhcnRpbmcgbG9hZCBvZiBkYXRhIExlbjogJWQgYXQgMHglcCA9PSAweCVwXG4iLCBkZXYtPm5hbWUsIHhjLmxlbiwgeGMuZGF0YSwgZGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtpbnB1dChzYywgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogQ2xlYXIgdGhlIFhpbGlueCBhbmQgc3RhcnQgcHJncmFtbWluZyBmcm9tIHRoZSBERUMKKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2V0IG91cHV0IGFzOgorICAgICAgICAgICAgICAgICAgICAgKiBSZXNldDogMCAoYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgKiBEUDogICAgMCAoYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgKiBNb2RlOiAgMQorICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX0RQOworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gJj0gfkxNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSAgTE1DX0dFUF9NT0RFOworICAgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtvdXRwdXQoc2MsIExNQ19HRVBfTU9ERSB8IExNQ19HRVBfRFAgfCBMTUNfR0VQX1JFU0VUKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBXYWl0IGF0IGxlYXN0IDEwIHVzIDIwIHRvIGJlIHNhZmUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHVkZWxheSg1MCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogQ2xlYXIgcmVzZXQgYW5kIGFjdGl2YXRlIHByb2dyYW1taW5nIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAqIFJlc2V0OiBJbnB1dAorICAgICAgICAgICAgICAgICAgICAgKiBEUDogICAgSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICogQ2xvY2s6IE91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKiBEYXRhOiAgT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAqIE1vZGU6ICBPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIExNQ19HRVBfRFAgfCBMTUNfR0VQX1JFU0VUKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTZXQgTE9BRCwgREFUQSwgQ2xvY2sgdG8gMQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfREFUQTsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfQ0xLOworICAgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta291dHB1dChzYywgTE1DX0dFUF9EQVRBIHwgTE1DX0dFUF9DTEsgfCBMTUNfR0VQX01PREUgKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBidXN5IHdhaXQgZm9yIHRoZSBjaGlwIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSggKExNQ19DU1JfUkVBRChzYywgY3NyX2dwKSAmIExNQ19HRVBfSU5JVCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVvdXQtLSA+IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogV2FpdGVkICVkIGZvciB0aGUgWGlsaW54IHRvIGNsZWFyIGl0J3MgbWVtb3J5XG4iLCBkZXYtPm5hbWUsIDUwMDAwMC10aW1lb3V0KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IocG9zID0gMDsgcG9zIDwgeGMubGVuOyBwb3MrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YVtwb3NdKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gJj0gfkxNQ19HRVBfREFUQTsgLyogRGF0YSBpcyAwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfREFUQTsgLyogRGF0YSBpcyAxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIEJhZCBkYXRhIGluIHhpbGlueCBwcm9ncmFtbWluZyBkYXRhIGF0ICVkLCBnb3QgJWQgd2FudGVkIDAgb3IgMVxuIiwgZGV2LT5uYW1lLCBwb3MsIGRhdGFbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfREFUQTsgLyogQXNzdW1lIGl0J3MgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX0NMSzsgLyogQ2xvY2sgdG8gemVybyAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfQ0xLOyAvKiBQdXQgdGhlIGNsYWNrIGJhY2sgdG8gb25lICovCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9NT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKChMTUNfQ1NSX1JFQUQoc2MsIGNzcl9ncCkgJiBMTUNfR0VQX0lOSVQpID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcHJvZ3JhbW1pbmcgRkFJTEVELiBOZWVkcyB0byBiZSByZXByb2dyYW1tZWQuIChjb3JydXB0ZWQgZGF0YSlcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigoTE1DX0NTUl9SRUFEKHNjLCBjc3JfZ3ApICYgTE1DX0dFUF9EUCkgPT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVwcm9ncmFtbWluZyBGQUlMRUQuIE5lZWRzIHRvIGJlIHJlcHJvZ3JhbW1lZC4gKGRvbmUpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIHJlcHJvZ3JhbW1pbmcgWGlsaW54LCAlZCBiaXRzLCBnb29kIGx1Y2shXG4iLCBkZXYtPm5hbWUsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0ZJRk9fUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRklGT19SRVNFVDsKKyAgICAgICAgICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyhzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworCisgICAgICAgICAgICAgICAgICAgIGtmcmVlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qZm9sZDAyKi8KKyAgICAgICAgICAgICAgICByZXQgPSAtRUJBREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIHNjLT5sbWNfdHhmdWxsID0gMDsKKworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8qZm9sZDAxKi8KKyAgICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBnaXZlIHRoZSBwcm90b2NvbCBhIHNob3QuICovCisgICAgICAgIHJldCA9IGxtY19wcm90b19pb2N0bCAoc2MsIGlmciwgY21kKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7IC8qZm9sZDAxKi8KKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaW9jdGwgb3V0Iik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qIHRoZSB3YXRjaGRvZyBwcm9jZXNzIHRoYXQgY3J1aXNlcyBhcm91bmQgKi8KK3N0YXRpYyB2b2lkIGxtY193YXRjaGRvZyAodW5zaWduZWQgbG9uZyBkYXRhKSAvKmZvbGQwMCovCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworICAgIGxtY19zb2Z0Y190ICpzYzsKKyAgICBpbnQgbGlua19zdGF0dXM7CisgICAgdV9pbnQzMl90IHRpY2tzOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzYyA9IGRldi0+cHJpdjsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfd2F0Y2hkb2cgaW4iKTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIGlmKHNjLT5jaGVjayAhPSAweEJFQUZDQUZFKXsKKyAgICAgICAgcHJpbnRrKCJMTUM6IENvcnJ1cHQgbmV0X2RldmljZSBzdHVjdCwgYnJlYWtpbmcgb3V0XG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyogTWFrZSBzdXJlIHRoZSB0eCBqYWJiZXIgYW5kIHJ4IHdhdGNoZG9nIGFyZSBvZmYsCisgICAgICogYW5kIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzZXMgYXJlIHJ1bm5pbmcuCisgICAgICovCisKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzE1LCAweDAwMDAwMDExKTsKKyAgICBzYy0+bG1jX2NtZG1vZGUgfD0gVFVMSVBfQ01EX1RYUlVOIHwgVFVMSVBfQ01EX1JYUlVOOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIGlmIChzYy0+bG1jX29rID09IDApCisgICAgICAgIGdvdG8ga2lja190aW1lcjsKKworICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1dBVENIRE9HLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpKTsKKworICAgIC8qIC0tLSBiZWdpbiB0aW1lIG91dCBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIGNoZWNrIGZvciBhIHRyYW5zbWl0IGludGVycnVwdCB0aW1lb3V0CisgICAgICogSGFzIHRoZSBwYWNrZXQgeG10IHZzIHhtdCBzZXJ2aWNlZCB0aHJlc2hvbGQgYmVlbiBleGNlZWRlZCAqLworICAgIGlmIChzYy0+bG1jX3RhaW50X3R4ID09IHNjLT5sYXN0bG1jX3RhaW50X3R4ICYmCisgICAgICAgIHNjLT5zdGF0cy50eF9wYWNrZXRzID4gc2MtPmxhc3R0eF9wYWNrZXRzICYmCisgICAgICAgIHNjLT50eF9UaW1lb3V0SW5kID09IDApCisgICAgeworCisgICAgICAgIC8qIHdhaXQgZm9yIHRoZSB3YXRjaGRvZyB0byBjb21lIGFyb3VuZCBhZ2FpbiAqLworICAgICAgICBzYy0+dHhfVGltZW91dEluZCA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKHNjLT5sbWNfdGFpbnRfdHggPT0gc2MtPmxhc3RsbWNfdGFpbnRfdHggJiYKKyAgICAgICAgICAgICBzYy0+c3RhdHMudHhfcGFja2V0cyA+IHNjLT5sYXN0dHhfcGFja2V0cyAmJgorICAgICAgICAgICAgIHNjLT50eF9UaW1lb3V0SW5kKQorICAgIHsKKworICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9YTVRJTlRUTU8sIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKworICAgICAgICBzYy0+dHhfVGltZW91dERpc3BsYXkgPSAxOworICAgICAgICBzYy0+c3RhdHMudHhfVGltZW91dENudCsrOworCisgICAgICAgIC8qIERFQyBjaGlwIGlzIHN0dWNrLCBoaXQgaXQgd2l0aCBhIFJFU0VUISEhISAqLworICAgICAgICBsbWNfcnVubmluZ19yZXNldCAoZGV2KTsKKworCisgICAgICAgIC8qIGxvb2sgYXQgcmVjZWl2ZSAmIHRyYW5zbWl0IHByb2Nlc3Mgc3RhdGUgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHJ1bm5pbmcgKi8KKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQxLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgMCk7CisKKyAgICAgICAgLyogbG9vayBhdDogRFNSIC0gMDIgIGZvciBSZWcgMTYKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBDVFMgLSAwOAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIERDRCAtIDEwCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgUkkgIC0gMjAKKyAgICAgICAgICogZm9yIFJlZyAxNworICAgICAgICAgKi8KKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQyLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNiksIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KSk7CisKKyAgICAgICAgLyogcmVzZXQgdGhlIHRyYW5zbWl0IHRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgKi8KKyAgICAgICAgc2MtPnR4X1RpbWVvdXRJbmQgPSAwOworICAgICAgICBzYy0+bGFzdGxtY190YWludF90eCA9IHNjLT5sbWNfdGFpbnRfdHg7CisgICAgICAgIHNjLT5sYXN0dHhfcGFja2V0cyA9IHNjLT5zdGF0cy50eF9wYWNrZXRzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzYy0+dHhfVGltZW91dEluZCA9IDA7CisgICAgICAgIHNjLT5sYXN0bG1jX3RhaW50X3R4ID0gc2MtPmxtY190YWludF90eDsKKyAgICAgICAgc2MtPmxhc3R0eF9wYWNrZXRzID0gc2MtPnN0YXRzLnR4X3BhY2tldHM7CisgICAgfQorCisgICAgLyogLS0tIGVuZCB0aW1lIG91dCBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyAgICBsaW5rX3N0YXR1cyA9IHNjLT5sbWNfbWVkaWEtPmdldF9saW5rX3N0YXR1cyAoc2MpOworCisgICAgLyoKKyAgICAgKiBoYXJkd2FyZSBsZXZlbCBsaW5rIGxvc3QsIGJ1dCB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBhcyB1cC4KKyAgICAgKiBNYXJrIGl0IGFzIGRvd24uCisgICAgICovCisgICAgaWYgKChsaW5rX3N0YXR1cyA9PSAwKSAmJiAoc2MtPmxhc3RfbGlua19zdGF0dXMgIT0gMCkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhhcmR3YXJlL3BoeXNpY2FsIGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxhc3RfbGlua19zdGF0dXMgPSAwOworICAgICAgICAvKiBsbWNfcmVzZXQgKHNjKTsgV2h5IHJlc2V0Pz8/IFRoZSBsaW5rIGNhbiBnbyBkb3duIG9rICovCisKKyAgICAgICAgLyogSW5mb3JtIHRoZSB3b3JsZCB0aGF0IGxpbmsgaGFzIGJlZW4gbG9zdCAqLworICAgICAgICBkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhcmR3YXJlIGxpbmsgaXMgdXAsIGJ1dCB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBhcyBkb3duLgorICAgICAqIEJyaW5nIGl0IGJhY2sgdXAgYWdhaW4uCisgICAgICovCisgICAgIGlmIChsaW5rX3N0YXR1cyAhPSAwICYmIHNjLT5sYXN0X2xpbmtfc3RhdHVzID09IDApIHsKKyAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBoYXJkd2FyZS9waHlzaWNhbCBsaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgc2MtPmxhc3RfbGlua19zdGF0dXMgPSAxOworICAgICAgICAgLyogbG1jX3Jlc2V0IChzYyk7IEFnYWluIHdoeSByZXNldD8/PyAqLworCisgICAgICAgICAvKiBJbmZvcm0gdGhlIHdvcmxkIHRoYXQgbGluayBwcm90b2NvbCBpcyBiYWNrIHVwLiAqLworICAgICAgICAgZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKworICAgICAgICAgLyogTm93IHdlIGhhdmUgdG8gdGVsbCB0aGUgc3luY3BwcCB0aGF0IHdlIGhhZCBhbiBvdXRhZ2UKKyAgICAgICAgICAqIGFuZCB0aGF0IGl0IHNob3VsZCBkZWFsLiAgQ2FsbGluZyBzcHBwX3Jlb3BlbiBoZXJlCisgICAgICAgICAgKiBzaG91bGQgZG8gdGhlIHRyaWNrLCBidXQgd2UgbWF5IGhhdmUgdG8gY2FsbCBzcHBwX2Nsb3NlCisgICAgICAgICAgKiB3aGVuIHRoZSBsaW5rIGdvZXMgZG93biwgYW5kIGNhbGwgc3BwcF9vcGVuIGhlcmUuCisgICAgICAgICAgKiBTdWJqZWN0IHRvIG1vcmUgdGVzdGluZy4KKyAgICAgICAgICAqIC0tYmJyYXVuCisgICAgICAgICAgKi8KKworICAgICAgICAgbG1jX3Byb3RvX3Jlb3BlbihzYyk7CisKKyAgICAgfQorCisgICAgLyogQ2FsbCBtZWRpYSBzcGVjaWZpYyB3YXRjaGRvZyBmdW5jdGlvbnMgKi8KKyAgICBzYy0+bG1jX21lZGlhLT53YXRjaGRvZyhzYyk7CisKKyAgICAvKgorICAgICAqIFBva2UgdGhlIHRyYW5zbWl0dGVyIHRvIG1ha2Ugc3VyZSBpdAorICAgICAqIG5ldmVyIHN0b3BzLCBldmVuIGlmIHdlIHJ1biBvdXQgb2YgbWVtCisgICAgICovCisgICAgTE1DX0NTUl9XUklURShzYywgY3NyX3J4cG9sbCwgMCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBjb2RlIHRoYXQgZmFpbGVkCisgICAgICogYW5kIHRyeSBhbmQgZml4IGl0IGFzIGFwcHJvcHJpYXRlCisgICAgICovCisgICAgaWYoc2MtPmZhaWxlZF9yaW5nID09IDEpeworICAgICAgICAvKgorICAgICAgICAgKiBGYWlsZWQgdG8gc2V0dXAgdGhlIHJlY3YveG1pdCByaW4KKyAgICAgICAgICogVHJ5IGFnYWluCisgICAgICAgICAqLworICAgICAgICBzYy0+ZmFpbGVkX3JpbmcgPSAwOworICAgICAgICBsbWNfc29mdHJlc2V0KHNjKTsKKyAgICB9CisgICAgaWYoc2MtPmZhaWxlZF9yZWN2X2FsbG9jID09IDEpeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBmYWlsZWQgdG8gYWxsb2MgbWVtIGluIHRoZQorICAgICAgICAgKiBpbnRlcnJ1cHQgaGFuZGxlciwgZ28gdGhyb3VnaCB0aGUgcmluZ3MKKyAgICAgICAgICogYW5kIHJlYnVpbGQgdGhlbQorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmZhaWxlZF9yZWN2X2FsbG9jID0gMDsKKyAgICAgICAgbG1jX3NvZnRyZXNldChzYyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIHJlbWVtYmVyIHRoZSB0aW1lciB2YWx1ZQorICAgICAqLwora2lja190aW1lcjoKKworICAgIHRpY2tzID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX2dwX3RpbWVyKTsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwX3RpbWVyLCAweGZmZmZmZmZmVUwpOworICAgIHNjLT5pY3RsLnRpY2tzID0gMHgwMDAwZmZmZiAtICh0aWNrcyAmIDB4MDAwMGZmZmYpOworCisgICAgLyoKKyAgICAgKiByZXN0YXJ0IHRoaXMgdGltZXIuCisgICAgICovCisgICAgc2MtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaKTsKKyAgICBhZGRfdGltZXIgKCZzYy0+dGltZXIpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3dhdGNoZG9nIG91dCIpOworCit9CisKK3N0YXRpYyB2b2lkIGxtY19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqIGNvbnN0IGRldikgLypmb2xkMDAqLworeworICAgIGxtY190cmFjZShkZXYsICJsbWNfc2V0dXAgaW4iKTsKKworICAgIGRldi0+dHlwZSA9IEFSUEhSRF9IRExDOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gbG1jX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5vcGVuID0gbG1jX29wZW47CisgICAgZGV2LT5zdG9wID0gbG1jX2Nsb3NlOworICAgIGRldi0+Z2V0X3N0YXRzID0gbG1jX2dldF9zdGF0czsKKyAgICBkZXYtPmRvX2lvY3RsID0gbG1jX2lvY3RsOworICAgIGRldi0+dHhfdGltZW91dCA9IGxtY19kcml2ZXJfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gKEhaKTsgLyogMSBzZWNvbmQgKi8KKyAgICAKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3NldHVwIG91dCIpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxtY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgdTE2IHN1YmRldmljZTsKKyAgICB1X2ludDE2X3QgQWRhcE1vZGVsTnVtOworICAgIGludCBlcnIgPSAtRU5PTUVNOworICAgIHN0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisjaWZuZGVmIEdDT00KKyAgICAvKiBXZSBuYW1lIGJ5IHR5cGUgbm90IGJ5IHZlbmRvciAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyIGxtY25hbWVbXSA9ICJoZGxjJWQiOworI2Vsc2UKKyAgICAvKiAKKyAgICAgKiBHQ09NIHVzZXMgTE1DIHZlbmRvciBuYW1lIHNvIHRoYXQgY2xpZW50cyBjYW4ga25vdyB3aGljaCBjYXJkCisgICAgICogdG8gYXR0YWNoIHRvLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyIGxtY25hbWVbXSA9ICJsbWMlZCI7CisjZW5kaWYKKworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBvdXIgb3duIGRldmljZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGxtY19zb2Z0Y190KSwgbG1jbmFtZSwgbG1jX3NldHVwKTsKKyAgICBpZiAoIWRldikgeworICAgICAgICBwcmludGsgKEtFUk5fRVJSICJsbWM6YWxsb2NfbmV0ZGV2IGZvciBkZXZpY2UgZmFpbGVkXG4iKTsKKwlnb3RvIG91dDE7CisgICAgfQorIAorICAgIGxtY190cmFjZShkZXYsICJsbWNfaW5pdF9vbmUgaW4iKTsKKworICAgIGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworICAgIGlmIChlcnIpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJsbWM6IHBjaSBlbmFibGUgZmFpbGVkOiVkXG4iLCBlcnIpOworCSAgICBnb3RvIG91dDI7CisgICAgfQorICAgIAorICAgIGlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJsbWMiKSkgeworCSAgICBwcmludGsoS0VSTl9FUlIgImxtYzogcGNpX3JlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIik7CisJICAgIGVyciA9IC1FSU87CisJICAgIGdvdG8gb3V0MzsKKyAgICB9CisKKyAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworICAgIGlmKGxtY19maXJzdF9sb2FkID09IDApeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJMYW4gTWVkaWEgQ29ycG9yYXRpb24gV0FOIERyaXZlciBWZXJzaW9uICVkLiVkLiVkXG4iLAorCSAgICAgICBEUklWRVJfTUFKT1JfVkVSU0lPTiwgRFJJVkVSX01JTk9SX1ZFUlNJT04sRFJJVkVSX1NVQl9WRVJTSU9OKTsKKyAgICAgICAgbG1jX2ZpcnN0X2xvYWQgPSAxOworICAgIH0KKyAgICAKKyAgICBzYyA9IGRldi0+cHJpdjsKKyAgICBzYy0+bG1jX2RldmljZSA9IGRldjsKKyAgICBzYy0+bmFtZSA9IGRldi0+bmFtZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIHNwcHAgbGF5ZXIgKi8KKyAgICAvKiBBbiBpb2N0bCBjYW4gY2F1c2UgYSBzdWJzZXF1ZW50IGRldGFjaCBmb3IgcmF3IGZyYW1lIGludGVyZmFjZSAqLworICAgIHNjLT5pZl90eXBlID0gTE1DX1BQUDsKKyAgICBzYy0+Y2hlY2sgPSAweEJFQUZDQUZFOworICAgIGRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworICAgIGRldi0+aXJxID0gcGRldi0+aXJxOworCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyAgICAvKgorICAgICAqIFRoaXMgd2lsbCBnZXQgdGhlIHByb3RvY29sIGxheWVyIHJlYWR5IGFuZCBkbyBhbnkgMSB0aW1lIGluaXQncworICAgICAqIE11c3QgaGF2ZSBhIHZhbGlkIHNjIGFuZCBkZXYgc3RydWN0dXJlCisgICAgICovCisgICAgbG1jX3Byb3RvX2luaXQoc2MpOworCisgICAgbG1jX3Byb3RvX2F0dGFjaChzYyk7CisKKyAgICAvKgorICAgICAqIFdoeSB3ZXJlIHdlIGNoYW5naW5nIHRoaXM/Pz8KKyAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisgICAgICovCisKKyAgICAvKiBJbml0IHRoZSBzcGluIGxvY2sgc28gY2FuIGNhbGwgaXQgbGF0dGVyICovCisKKyAgICBzcGluX2xvY2tfaW5pdCgmc2MtPmxtY19sb2NrKTsKKyAgICBwY2lfc2V0X21hc3RlcihwZGV2KTsKKworICAgIHByaW50ayAoIiVzOiBkZXRlY3RlZCBhdCAlbHgsIGlycSAlZFxuIiwgZGV2LT5uYW1lLAorCSAgICBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldiAoZGV2KSAhPSAwKSB7CisgICAgICAgIHByaW50ayAoS0VSTl9FUlIgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKKwlnb3RvIG91dDQ7CisgICAgfQorCisgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9VTktOT1dOOworICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworCisgICAgLyoKKyAgICAgKgorICAgICAqIENoZWNrIGVpdGhlciB0aGUgc3VidmVuZG9yIG9yIHRoZSBzdWJkZXZpY2UsIHNvbWUgc3lzdGVtcyByZXZlcnNlCisgICAgICogdGhlIHNldHRpbmcgaW4gdGhlIGJvaXMsIHNlZW1zIHRvIGJlIHZlcnNpb24gYW5kIGFyY2ggZGVwZW5kZW50PworICAgICAqIEZpeCB0aGUgZXJyb3IsIGV4Y2hhbmdlIHRoZSB0d28gdmFsdWVzIAorICAgICAqLworICAgIGlmICgoc3ViZGV2aWNlID0gcGRldi0+c3Vic3lzdGVtX2RldmljZSkgPT0gUENJX1ZFTkRPUl9JRF9MTUMpCisJICAgIHN1YmRldmljZSA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CisKKyAgICBzd2l0Y2ggKHN1YmRldmljZSkgeworICAgIGNhc2UgUENJX0RFVklDRV9JRF9MTUNfSFNTSToKKyAgICAgICAgcHJpbnRrICgiJXM6IExNQyBIU1NJXG4iLCBkZXYtPm5hbWUpOworICAgICAgICBzYy0+bG1jX2NhcmR0eXBlID0gTE1DX0NBUkRUWVBFX0hTU0k7CisgICAgICAgIHNjLT5sbWNfbWVkaWEgPSAmbG1jX2hzc2lfbWVkaWE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUENJX0RFVklDRV9JRF9MTUNfRFMzOgorICAgICAgICBwcmludGsgKCIlczogTE1DIERTM1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9EUzM7CisgICAgICAgIHNjLT5sbWNfbWVkaWEgPSAmbG1jX2RzM19tZWRpYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0xNQ19TU0k6CisgICAgICAgIHByaW50ayAoIiVzOiBMTUMgU1NJXG4iLCBkZXYtPm5hbWUpOworICAgICAgICBzYy0+bG1jX2NhcmR0eXBlID0gTE1DX0NBUkRUWVBFX1NTSTsKKyAgICAgICAgc2MtPmxtY19tZWRpYSA9ICZsbWNfc3NpX21lZGlhOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBDSV9ERVZJQ0VfSURfTE1DX1QxOgorICAgICAgICBwcmludGsgKCIlczogTE1DIFQxXG4iLCBkZXYtPm5hbWUpOworICAgICAgICBzYy0+bG1jX2NhcmR0eXBlID0gTE1DX0NBUkRUWVBFX1QxOworICAgICAgICBzYy0+bG1jX21lZGlhID0gJmxtY190MV9tZWRpYTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBMTUMgVU5LT1dOIENBUkQhXG4iLCBkZXYtPm5hbWUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsbWNfaW5pdGNzcnMgKHNjLCBkZXYtPmJhc2VfYWRkciwgOCk7CisKKyAgICBsbWNfZ3Bpb19ta2lucHV0IChzYywgMHhmZik7CisgICAgc2MtPmxtY19ncGlvID0gMDsJCS8qIGRyaXZlIG5vIHNpZ25hbHMgeWV0ICovCisKKyAgICBzYy0+bG1jX21lZGlhLT5kZWZhdWx0cyAoc2MpOworCisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfVVApOworCisgICAgLyogdmVyaWZ5IHRoYXQgdGhlIFBDSSBTdWIgU3lzdGVtIElEIG1hdGNoZXMgdGhlIEFkYXB0ZXIgTW9kZWwgbnVtYmVyCisgICAgICogZnJvbSB0aGUgTUlJIHJlZ2lzdGVyCisgICAgICovCisgICAgQWRhcE1vZGVsTnVtID0gKGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDMpICYgMHgzZjApID4+IDQ7CisKKyAgICBpZiAoKEFkYXBNb2RlbE51bSA9PSBMTUNfQURBUF9UMQorICAgICAgICAgJiYgc3ViZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTE1DX1QxKSB8fAkvKiBkZXRlY3QgTE1DMTIwMCAqLworICAgICAgICAoQWRhcE1vZGVsTnVtID09IExNQ19BREFQX1NTSQorICAgICAgICAgJiYgc3ViZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTE1DX1NTSSkgfHwJLyogZGV0ZWN0IExNQzEwMDAgKi8KKyAgICAgICAgKEFkYXBNb2RlbE51bSA9PSBMTUNfQURBUF9EUzMKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19EUzMpIHx8CS8qIGRldGVjdCBMTUM1MjQ1ICovCisgICAgICAgIChBZGFwTW9kZWxOdW0gPT0gTE1DX0FEQVBfSFNTSQorICAgICAgICAgJiYgc3ViZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTE1DX0hTU0kpKQorICAgIHsJCQkJLyogZGV0ZWN0IExNQzUyMDAgKi8KKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRrICgiJXM6IE1vZGVsIG51bWJlciAoJWQpIG1pc2NvbXBhcmUgZm9yIFBDSSBTdWJzeXN0ZW0gSUQgPSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBBZGFwTW9kZWxOdW0sIHN1YmRldmljZSk7CisvLyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiByZXNldCBjbG9jaworICAgICAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3BfdGltZXIsIDB4RkZGRkZGRkZVTCk7CisKKyAgICBzYy0+Ym9hcmRfaWR4ID0gY2FyZHNfZm91bmQrKzsKKyAgICBzYy0+c3RhdHMuY2hlY2sgPSBTVEFUQ0hFQ0s7CisgICAgc2MtPnN0YXRzLnZlcnNpb25fc2l6ZSA9IChEUklWRVJfVkVSU0lPTiA8PCAxNikgKworICAgICAgICBzaXplb2YgKHN0cnVjdCBsbWNfc3RhdGlzdGljcyk7CisgICAgc2MtPnN0YXRzLmxtY19jYXJkdHlwZSA9IHNjLT5sbWNfY2FyZHR5cGU7CisKKyAgICBzYy0+bG1jX29rID0gMDsKKyAgICBzYy0+bGFzdF9saW5rX3N0YXR1cyA9IDA7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2luaXRfb25lIG91dCIpOworICAgIHJldHVybiAwOworCisgb3V0NDoKKyAgICBsbWNfcHJvdG9fZGV0YWNoKHNjKTsKKyBvdXQzOgorICAgIGlmIChwZGV2KSB7CisJICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKyAgICB9Cisgb3V0MjoKKyAgICBmcmVlX25ldGRldihkZXYpOworIG91dDE6CisgICAgcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHBjaSB3aGVuIHJlbW92aW5nIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGxtY19yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworICAgIAorICAgIGlmIChkZXYpIHsKKwkgICAgbG1jX3NvZnRjX3QgKnNjID0gZGV2LT5wcml2OworCSAgICAKKwkgICAgcHJpbnRrKCIlczogcmVtb3ZpbmcuLi5cbiIsIGRldi0+bmFtZSk7CisJICAgIGxtY19wcm90b19kZXRhY2goc2MpOworCSAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCSAgICBmcmVlX25ldGRldihkZXYpOworCSAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCSAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKyAgICB9Cit9CisKKy8qIEFmdGVyIHRoaXMgaXMgY2FsbGVkLCBwYWNrZXRzIGNhbiBiZSBzZW50LgorICogRG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgYWRkcmVzc2VzCisgKi8KK3N0YXRpYyBpbnQgbG1jX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfc29mdGNfdCAqc2MgPSBkZXYtPnByaXY7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX29wZW4gaW4iKTsKKworICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMCk7CisKKyAgICBsbWNfZGVjX3Jlc2V0IChzYyk7CisgICAgbG1jX3Jlc2V0IChzYyk7CisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDEsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDIsCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNiksCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisKKyAgICBpZiAoc2MtPmxtY19vayl7CisgICAgICAgIGxtY190cmFjZShkZXYsICJsbWNfb3BlbiBsbWNfb2sgb3V0Iik7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgbG1jX3NvZnRyZXNldCAoc2MpOworCisgICAgLyogU2luY2Ugd2UgaGF2ZSB0byB1c2UgUENJIGJ1cywgdGhpcyBzaG91bGQgd29yayBvbiB4ODYsYWxwaGEscHBjICovCisgICAgaWYgKHJlcXVlc3RfaXJxIChkZXYtPmlycSwgJmxtY19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpeworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKyAgICAgICAgbG1jX3RyYWNlKGRldiwgImxtY19vcGVuIGlycSBmYWlsZWQgb3V0Iik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBzYy0+Z290X2lycSA9IDE7CisKKyAgICAvKiBBc3NlcnQgVGVybWluYWwgQWN0aXZlICovCisgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfTEVEX0FMTDsKKyAgICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19VUCk7CisKKyAgICAvKgorICAgICAqIHJlc2V0IHRvIGxhc3Qgc3RhdGUuCisgICAgICovCisgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsIE5VTEwpOworCisgICAgLyogc2V0dXAgZGVmYXVsdCBiaXRzIHRvIGJlIHVzZWQgaW4gdHVsaXBfZGVzY190IHRyYW5zbWl0IGRlc2NyaXB0b3IKKyAgICAgKiAtYmF6ICovCisgICAgc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdCA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExNQ19UREVTX0lOVEVSUlVQVF9PTl9DT01QTEVUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX0ZJUlNUX1NFR01FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTE1DX1RERVNfTEFTVF9TRUdNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX1NFQ09ORF9BRERSX0NIQUlORUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTE1DX1RERVNfRElTQUJMRV9QQURESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBpZiAoc2MtPmljdGwuY3JjX2xlbmd0aCA9PSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTYpIHsKKyAgICAgICAgLyogZGlzYWJsZSAzMiBiaXQgQ1JDIGdlbmVyYXRlZCBieSBBU0lDICovCisgICAgICAgIHNjLT5UeERlc2NyaXB0Q29udHJvbEluaXQgfD0gTE1DX1RERVNfQUREX0NSQ19ESVNBQkxFOworICAgIH0KKyAgICBzYy0+bG1jX21lZGlhLT5zZXRfY3JjX2xlbmd0aChzYywgc2MtPmljdGwuY3JjX2xlbmd0aCk7CisgICAgLyogQWNrbm9sZWRnZSB0aGUgVGVybWluYWwgQWN0aXZlIGFuZCBsaWdodCBMRURzICovCisKKyAgICAvKiBkZXYtPmZsYWdzIHw9IElGRl9VUDsgKi8KKworICAgIGxtY19wcm90b19vcGVuKHNjKTsKKworICAgIGRldi0+ZG9faW9jdGwgPSBsbWNfaW9jdGw7CisKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgCisgICAgc2MtPnN0YXRzLnR4X3RidXN5MCsrIDsKKworICAgIC8qCisgICAgICogc2VsZWN0IHdoYXQgaW50ZXJydXB0cyB3ZSB3YW50IHRvIGdldAorICAgICAqLworICAgIHNjLT5sbWNfaW50cm1hc2sgPSAwOworICAgIC8qIFNob3VsZCBiZSB1c2luZyB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFzayBkZWZpbmVkIGluIHRoZSAuaCBmaWxlLiAqLworICAgIHNjLT5sbWNfaW50cm1hc2sgfD0gKFRVTElQX1NUU19OT1JNQUxJTlRSCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfUlhJTlRSCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfVFhJTlRSCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfQUJOUk1MSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1NZU0VSUk9SCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfVFhTVE9QUEVECisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfVFhVTkRFUkZMT1cKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX1NUU19SWFNUT1BQRUQKKwkJICAgICAgICAgfCBUVUxJUF9TVFNfUlhOT0JVRgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIHNjLT5sbWNfaW50cm1hc2spOworCisgICAgc2MtPmxtY19jbWRtb2RlIHw9IFRVTElQX0NNRF9UWFJVTjsKKyAgICBzYy0+bG1jX2NtZG1vZGUgfD0gVFVMSVBfQ01EX1JYUlVOOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIHNjLT5sbWNfb2sgPSAxOyAvKiBSdW4gd2F0Y2hkb2cgKi8KKworICAgIC8qCisgICAgICogU2V0IHRoZSBpZiB1cCBub3cgLSBwZmIKKyAgICAgKi8KKworICAgIHNjLT5sYXN0X2xpbmtfc3RhdHVzID0gMTsKKworICAgIC8qCisgICAgICogU2V0dXAgYSB0aW1lciBmb3IgdGhlIHdhdGNoZG9nIG9uIHByb2JlLCBhbmQgc3RhcnQgaXQgcnVubmluZy4KKyAgICAgKiBTaW5jZSBsbWNfb2sgPT0gMCwgaXQgd2lsbCBiZSBhIE5PUCBmb3Igbm93LgorICAgICAqLworICAgIGluaXRfdGltZXIgKCZzYy0+dGltZXIpOworICAgIHNjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIHNjLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKyAgICBzYy0+dGltZXIuZnVuY3Rpb24gPSAmbG1jX3dhdGNoZG9nOworICAgIGFkZF90aW1lciAoJnNjLT50aW1lcik7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX29wZW4gb3V0Iik7CisKKyAgICByZXR1cm4gKDApOworfQorCisvKiBUb3RhbCByZXNldCB0byBjb21wZW5zYXRlIGZvciB0aGUgQWRUcmFuIERTVSBkb2luZyBiYWQgdGhpbmdzCisgKiAgdW5kZXIgaGVhdnkgbG9hZAorICovCisKK3N0YXRpYyB2b2lkIGxtY19ydW5uaW5nX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisKKyAgICBsbWNfc29mdGNfdCAqc2MgPSAobG1jX3NvZnRjX3QgKikgZGV2LT5wcml2OworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19ydW5uaWdfcmVzZXQgaW4iKTsKKworICAgIC8qIHN0b3AgaW50ZXJydXB0cyAqLworICAgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgbWFzayAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfaW50ciwgMHgwMDAwMDAwMCk7CisKKyAgICBsbWNfZGVjX3Jlc2V0IChzYyk7CisgICAgbG1jX3Jlc2V0IChzYyk7CisgICAgbG1jX3NvZnRyZXNldCAoc2MpOworICAgIC8qIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0xFRF9BTEw7ICovCisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgMSk7CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsIE5VTEwpOworCisgICAgLy9kZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworICAgIAorICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworICAgIHNjLT5sbWNfdHhmdWxsID0gMDsKKyAgICBzYy0+c3RhdHMudHhfdGJ1c3kwKysgOworCisgICAgc2MtPmxtY19pbnRybWFzayA9IFRVTElQX0RFRkFVTFRfSU5UUl9NQVNLOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfaW50ciwgc2MtPmxtY19pbnRybWFzayk7CisKKyAgICBzYy0+bG1jX2NtZG1vZGUgfD0gKFRVTElQX0NNRF9UWFJVTiB8IFRVTElQX0NNRF9SWFJVTik7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9jb21tYW5kLCBzYy0+bG1jX2NtZG1vZGUpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19ydW5uaW5fcmVzZXRfb3V0Iik7Cit9CisKKworLyogVGhpcyBpcyB3aGF0IGlzIGNhbGxlZCB3aGVuIHlvdSBpZmNvbmZpZyBkb3duIGEgZGV2aWNlLgorICogVGhpcyBkaXNhYmxlcyB0aGUgdGltZXIgZm9yIHRoZSB3YXRjaGRvZyBhbmQga2VlcGFsaXZlcywKKyAqIGFuZCBkaXNhYmxlcyB0aGUgaXJxIGZvciBkZXYuCisgKi8KK3N0YXRpYyBpbnQgbG1jX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgLyogbm90IGNhbGxpbmcgcmVsZWFzZV9yZWdpb24oKSBhcyB3ZSBzaG91bGQgKi8KKyAgICBsbWNfc29mdGNfdCAqc2M7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2Nsb3NlIGluIik7CisgICAgCisgICAgc2MgPSBkZXYtPnByaXY7CisgICAgc2MtPmxtY19vayA9IDA7CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgMCk7CisgICAgZGVsX3RpbWVyICgmc2MtPnRpbWVyKTsKKyAgICBsbWNfcHJvdG9fY2xvc2Uoc2MpOworICAgIGxtY19pZmRvd24gKGRldik7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2Nsb3NlIG91dCIpOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBFbmRzIHRoZSB0cmFuc2ZlciBvZiBwYWNrZXRzICovCisvKiBXaGVuIHRoZSBpbnRlcmZhY2UgZ29lcyBkb3duLCB0aGlzIGlzIGNhbGxlZCAqLworc3RhdGljIGludCBsbWNfaWZkb3duIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjID0gZGV2LT5wcml2OworICAgIHUzMiBjc3I2OworICAgIGludCBpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pZmRvd24gaW4iKTsKKyAgICAKKyAgICAvKiBEb24ndCBsZXQgYW55dGhpbmcgZWxzZSBnbyBvbiByaWdodCBub3cgKi8KKyAgICAvLyAgICBkZXYtPnN0YXJ0ID0gMDsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgc2MtPnN0YXRzLnR4X3RidXN5MSsrIDsKKworICAgIC8qIHN0b3AgaW50ZXJydXB0cyAqLworICAgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgbWFzayAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfaW50ciwgMHgwMDAwMDAwMCk7CisKKyAgICAvKiBTdG9wIFR4IGFuZCBSeCBvbiB0aGUgY2hpcCAqLworICAgIGNzcjYgPSBMTUNfQ1NSX1JFQUQgKHNjLCBjc3JfY29tbWFuZCk7CisgICAgY3NyNiAmPSB+TE1DX0RFQ19TVDsJCS8qIFR1cm4gb2ZmIHRoZSBUcmFuc21pc3Npb24gYml0ICovCisgICAgY3NyNiAmPSB+TE1DX0RFQ19TUjsJCS8qIFR1cm4gb2ZmIHRoZSBSZWNlaXZlIGJpdCAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgY3NyNik7CisKKyAgICBkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKworICAgIHNjLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9CisgICAgICAgIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9taXNzZWRfZnJhbWVzKSAmIDB4ZmZmZjsKKworICAgIC8qIHJlbGVhc2UgdGhlIGludGVycnVwdCAqLworICAgIGlmKHNjLT5nb3RfaXJxID09IDEpeworICAgICAgICBmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisgICAgICAgIHNjLT5nb3RfaXJxID0gMDsKKyAgICB9CisKKyAgICAvKiBmcmVlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlICovCisgICAgZm9yIChpID0gMDsgaSA8IExNQ19SWERFU0NTOyBpKyspCisgICAgeworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2MtPmxtY19yeHFbaV07CisgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gTlVMTDsKKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzID0gMDsKKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0ubGVuZ3RoID0gMDsKKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IDB4REVBREJFRUY7CisgICAgICAgIGlmIChza2IgIT0gTlVMTCkKKyAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgc2MtPmxtY19yeHFbaV0gPSBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBMTUNfVFhERVNDUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHNjLT5sbWNfdHhxW2ldICE9IE5VTEwpCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNjLT5sbWNfdHhxW2ldKTsKKyAgICAgICAgc2MtPmxtY190eHFbaV0gPSBOVUxMOworICAgIH0KKworICAgIGxtY19sZWRfb2ZmIChzYywgTE1DX01JSTE2X0xFRF9BTEwpOworCisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIHNjLT5zdGF0cy50eF90YnVzeTArKyA7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2lmZG93biBvdXQiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBJbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZS4gIFRoaXMgd2lsbCB0YWtlIGFuIGluY29taW5nIHBhY2tldCwgb3IgY2xlYW4KKyAqIHVwIGFmdGVyIGEgdHJhc21pdC4KKyAqLworc3RhdGljIGlycXJldHVybl90IGxtY19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIC8qZm9sZDAwKi8KK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgdTMyIGNzcjsKKyAgICBpbnQgaTsKKyAgICBzMzIgc3RhdDsKKyAgICB1bnNpZ25lZCBpbnQgYmFkdHg7CisgICAgdTMyIGZpcnN0Y3NyOworICAgIGludCBtYXhfd29yayA9IExNQ19SWERFU0NTOworICAgIGludCBoYW5kbGVkID0gMDsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaW50ZXJydXB0IGluIik7CisKKyAgICBzYyA9IGRldi0+cHJpdjsKKyAgICAKKyAgICBzcGluX2xvY2soJnNjLT5sbWNfbG9jayk7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIGNzciB0byBmaW5kIHdoYXQgaW50ZXJydXB0cyB3ZSBoYXZlIChpZiBhbnkpCisgICAgICovCisgICAgY3NyID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyk7CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGlzIGlzIG91ciBpbnRlcnJ1cHQKKyAgICAgKi8KKyAgICBpZiAoICEgKGNzciAmIHNjLT5sbWNfaW50cm1hc2spKSB7CisgICAgICAgIGdvdG8gbG1jX2ludF9mYWlsX291dDsKKyAgICB9CisKKyAgICBmaXJzdGNzciA9IGNzcjsKKworICAgIC8qIGFsd2F5cyBnbyB0aHJvdWdoIHRoaXMgbG9vcCBhdCBsZWFzdCBvbmNlICovCisgICAgd2hpbGUgKGNzciAmIHNjLT5sbWNfaW50cm1hc2spIHsKKwloYW5kbGVkID0gMTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbGVhciBpbnRlcnJ1cHQgYml0cywgd2UgaGFuZGxlIGFsbCBjYXNlIGJlbG93CisgICAgICAgICAqLworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3N0YXR1cywgY3NyKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPbmUgb2YKKyAgICAgICAgICogIC0gVHJhbnNtaXQgcHJvY2VzcyB0aW1lZCBvdXQgQ1NSNTwxPgorICAgICAgICAgKiAgLSBUcmFuc21pdCBqYWJiZXIgdGltZW91dCAgICBDU1I1PDM+CisgICAgICAgICAqICAtIFRyYW5zbWl0IHVuZGVyZmxvdyAgICAgICAgIENTUjU8NT4KKyAgICAgICAgICogIC0gVHJhbnNtaXQgUmVjZWl2ZXIgYnVmZmVyIHVuYXZhaWxhYmxlIENTUjU8Nz4KKyAgICAgICAgICogIC0gUmVjZWl2ZSBwcm9jZXNzIHN0b3BwZWQgICAgQ1NSNTw4PgorICAgICAgICAgKiAgLSBSZWNlaXZlIHdhdGNoZG9nIHRpbWVvdXQgICBDU1I1PDk+CisgICAgICAgICAqICAtIEVhcmx5IHRyYW5zbWl0IGludGVycnVwdCAgIENTUjU8MTA+CisgICAgICAgICAqCisgICAgICAgICAqIElzIHRoaXMgcmVhbGx5IHJpZ2h0PyBTaG91bGQgd2UgZG8gYSBydW5uaW5nIHJlc2V0IGZvciBqYWJiZXI/CisgICAgICAgICAqIChiZWluZyBhIFdBTiBjYXJkIGFuZCBhbGwpCisgICAgICAgICAqLworICAgICAgICBpZiAoY3NyICYgVFVMSVBfU1RTX0FCTlJNTElOVFIpeworICAgICAgICAgICAgbG1jX3J1bm5pbmdfcmVzZXQgKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNzciAmIFRVTElQX1NUU19SWElOVFIpeworICAgICAgICAgICAgbG1jX3RyYWNlKGRldiwgInJ4IGludGVycnVwdCIpOworICAgICAgICAgICAgbG1jX3J4IChkZXYpOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNzciAmIChUVUxJUF9TVFNfVFhJTlRSIHwgVFVMSVBfU1RTX1RYTk9CVUYgfCBUVUxJUF9TVFNfVFhTVE9QUEVEKSkgeworCisJICAgIGludAkJbl9jb21wbCA9IDAgOworICAgICAgICAgICAgLyogcmVzZXQgdGhlIHRyYW5zbWl0IHRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgLWJheiAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnR4X05vQ29tcGxldGVDbnQgPSAwOworCisgICAgICAgICAgICBiYWR0eCA9IHNjLT5sbWNfdGFpbnRfdHg7CisgICAgICAgICAgICBpID0gYmFkdHggJSBMTUNfVFhERVNDUzsKKworICAgICAgICAgICAgd2hpbGUgKChiYWR0eCA8IHNjLT5sbWNfbmV4dF90eCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0ID0gc2MtPmxtY190eHJpbmdbaV0uc3RhdHVzOworCisgICAgICAgICAgICAgICAgTE1DX0VWRU5UX0xPRyAoTE1DX0VWRU5UX1hNVElOVCwgc3RhdCwKKwkJCQkJCSBzYy0+bG1jX3R4cmluZ1tpXS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSWYgYml0IDMxIGlzIDEgdGhlIHR1bGlwIG93bnMgaXQgYnJlYWsgb3V0IG9mIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQluX2NvbXBsKysgOwkJLyogaS5lLiwgaGF2ZSBhbiBlbXB0eSBzbG90IGluIHJpbmcgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIHdlIGhhdmUgbm8gc2tidWZmIG9yIGhhdmUgY2xlYXJlZCBpdAorICAgICAgICAgICAgICAgICAqIEFscmVhZHkgY29udGludWUgdG8gdGhlIG5leHQgYnVmZmVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNjLT5sbWNfdHhxW2ldID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDaGVjayB0aGUgdG90YWwgZXJyb3Igc3VtbWFyeSB0byBsb29rIGZvciBhbnkgZXJyb3JzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDgwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCAmIDB4NDEwNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCAmIDB4MEMwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgMHgwMDAyKQorICAgICAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X2J5dGVzICs9IHNjLT5sbWNfdHhyaW5nW2ldLmxlbmd0aCAmIDB4N2ZmOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihzYy0+bG1jX3R4cVtpXSk7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2MtPmxtY190eHFbaV0pOworICAgICAgICAgICAgICAgIHNjLT5sbWNfdHhxW2ldID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGJhZHR4Kys7CisgICAgICAgICAgICAgICAgaSA9IGJhZHR4ICUgTE1DX1RYREVTQ1M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYy0+bG1jX25leHRfdHggLSBiYWR0eCA+IExNQ19UWERFU0NTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayAoIiVzOiBvdXQgb2Ygc3luYyBwb2ludGVyXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJhZHR4ICs9IExNQ19UWERFU0NTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfVEJVU1kwLCBuX2NvbXBsLCAwKTsKKyAgICAgICAgICAgIHNjLT5sbWNfdHhmdWxsID0gMDsKKyAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy50eF90YnVzeTArKyA7CisKKworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBzYy0+c3RhdHMuZGlydHlUeCA9IGJhZHR4OworICAgICAgICAgICAgc2MtPnN0YXRzLmxtY19uZXh0X3R4ID0gc2MtPmxtY19uZXh0X3R4OworICAgICAgICAgICAgc2MtPnN0YXRzLmxtY190eGZ1bGwgPSBzYy0+bG1jX3R4ZnVsbDsKKyNlbmRpZgorICAgICAgICAgICAgc2MtPmxtY190YWludF90eCA9IGJhZHR4OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2h5IHdhcyB0aGVyZSBhIGJyZWFrIGhlcmU/Pz8KKyAgICAgICAgICAgICAqLworICAgICAgICB9CQkJLyogZW5kIGhhbmRsZSB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKworICAgICAgICBpZiAoY3NyICYgVFVMSVBfU1RTX1NZU0VSUk9SKSB7CisgICAgICAgICAgICB1MzIgZXJyb3I7CisgICAgICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHN5c3RlbSBidXMgZXJyb3IgY3NyOiAlIzguOHhcbiIsIGRldi0+bmFtZSwgY3NyKTsKKyAgICAgICAgICAgIGVycm9yID0gY3NyPj4yMyAmIDB4NzsKKyAgICAgICAgICAgIHN3aXRjaChlcnJvcil7CisgICAgICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQYXJpdHkgRmF1bHQgKGJhZClcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDAxOgorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNYXN0ZXIgQWJvcnQgKG5hdWdodHkpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAxMDoKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGFyZ2V0IEFib3J0IChub3Qgc28gbmF1Z2h0eSlcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaGlzIGJ1cyBlcnJvciBjb2RlIHdhcyBzdXBwb3NlZCB0byBiZSByZXNlcnZlZCFcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsbWNfZGVjX3Jlc2V0IChzYyk7CisgICAgICAgICAgICBsbWNfcmVzZXQgKHNjKTsKKyAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMSwgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIDApOworICAgICAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KSk7CisKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICBpZihtYXhfd29yay0tIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCBjdXJyZW50IGNzciBzdGF0dXMgdG8gbWFrZSBzdXJlCisgICAgICAgICAqIHdlJ3ZlIGNsZWFyZWQgYWxsIGludGVycnVwdHMKKyAgICAgICAgICovCisgICAgICAgIGNzciA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpOworICAgIH0JCQkJLyogZW5kIGludGVycnVwdCBsb29wICovCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfSU5ULCBmaXJzdGNzciwgY3NyKTsKKworbG1jX2ludF9mYWlsX291dDoKKworICAgIHNwaW5fdW5sb2NrKCZzYy0+bG1jX2xvY2spOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pbnRlcnJ1cHQgb3V0Iik7CisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgbG1jX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgdTMyIGZsYWc7CisgICAgaW50IGVudHJ5OworICAgIGludCByZXQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3N0YXJ0X3htaXQgaW4iKTsKKworICAgIHNjID0gZGV2LT5wcml2OworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgLyogbm9ybWFsIHBhdGgsIHRidXN5IGtub3duIHRvIGJlIHplcm8gKi8KKworICAgIGVudHJ5ID0gc2MtPmxtY19uZXh0X3R4ICUgTE1DX1RYREVTQ1M7CisKKyAgICBzYy0+bG1jX3R4cVtlbnRyeV0gPSBza2I7CisgICAgc2MtPmxtY190eHJpbmdbZW50cnldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAoc2tiLT5kYXRhKTsKKworICAgIExNQ19DT05TT0xFX0xPRygieG1pdCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisjaWZuZGVmIEdDT00KKyAgICAvKiBJZiB0aGUgcXVldWUgaXMgbGVzcyB0aGFuIGhhbGYgZnVsbCwgZG9uJ3QgaW50ZXJydXB0ICovCisgICAgaWYgKHNjLT5sbWNfbmV4dF90eCAtIHNjLT5sbWNfdGFpbnRfdHggPCBMTUNfVFhERVNDUyAvIDIpCisgICAgeworICAgICAgICAvKiBEbyBub3QgaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gb2YgdGhpcyBwYWNrZXQgKi8KKyAgICAgICAgZmxhZyA9IDB4NjAwMDAwMDA7CisgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2MtPmxtY19uZXh0X3R4IC0gc2MtPmxtY190YWludF90eCA9PSBMTUNfVFhERVNDUyAvIDIpCisgICAgeworICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBvZiB0aGlzIHBhY2tldCAqLworICAgICAgICBmbGFnID0gMHhlMDAwMDAwMDsKKyAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIH0KKyAgICBlbHNlIGlmIChzYy0+bG1jX25leHRfdHggLSBzYy0+bG1jX3RhaW50X3R4IDwgTE1DX1RYREVTQ1MgLSAxKQorICAgIHsKKyAgICAgICAgLyogRG8gbm90IGludGVycnVwdCBvbiBjb21wbGV0aW9uIG9mIHRoaXMgcGFja2V0ICovCisgICAgICAgIGZsYWcgPSAweDYwMDAwMDAwOworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRoaXMgZ2VuZXJhdGVzIGFuIGludGVycnVwdCBvbiBjb21wbGV0aW9uIG9mIHRoaXMgcGFja2V0ICovCisgICAgICAgIGZsYWcgPSAweGUwMDAwMDAwOworICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDE7CisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICB9CisjZWxzZQorICAgIGZsYWcgPSBMTUNfVERFU19JTlRFUlJVUFRfT05fQ09NUExFVElPTjsKKworICAgIGlmIChzYy0+bG1jX25leHRfdHggLSBzYy0+bG1jX3RhaW50X3R4ID49IExNQ19UWERFU0NTIC0gMSkKKyAgICB7CQkJCS8qIHJpbmcgZnVsbCwgZ28gYnVzeSAqLworICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDE7CisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgc2MtPnN0YXRzLnR4X3RidXN5MSsrIDsKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfVEJVU1kxLCBlbnRyeSwgMCk7CisgICAgfQorI2VuZGlmCisKKworICAgIGlmIChlbnRyeSA9PSBMTUNfVFhERVNDUyAtIDEpCS8qIGxhc3QgZGVzY3JpcHRvciBpbiByaW5nICovCisJZmxhZyB8PSBMTUNfVERFU19FTkRfT0ZfUklORzsJLyogZmxhZyBhcyBzdWNoIGZvciBUdWxpcCAqLworCisgICAgLyogZG9uJ3QgcGFkIHNtYWxsIHBhY2tldHMgZWl0aGVyICovCisgICAgZmxhZyA9IHNjLT5sbWNfdHhyaW5nW2VudHJ5XS5sZW5ndGggPSAoc2tiLT5sZW4pIHwgZmxhZyB8CisJCQkJCQlzYy0+VHhEZXNjcmlwdENvbnRyb2xJbml0OworCisgICAgLyogc2V0IHRoZSB0cmFuc21pdCB0aW1lb3V0IGZsYWcgdG8gYmUgY2hlY2tlZCBpbgorICAgICAqIHRoZSB3YXRjaGRvZyB0aW1lciBoYW5kbGVyLiAtYmF6CisgICAgICovCisKKyAgICBzYy0+c3RhdHMudHhfTm9Db21wbGV0ZUNudCsrOworICAgIHNjLT5sbWNfbmV4dF90eCsrOworCisgICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gdGhlIGNoaXAgKi8KKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9YTVQsIGZsYWcsIGVudHJ5KTsKKyAgICBzYy0+bG1jX3R4cmluZ1tlbnRyeV0uc3RhdHVzID0gMHg4MDAwMDAwMDsKKworICAgIC8qIHNlbmQgbm93ISAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfdHhwb2xsLCAwKTsKKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3N0YXJ0X3htaXRfb3V0Iik7CisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGxtY19yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIGxtY19zb2Z0Y190ICpzYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgcnhfd29ya19saW1pdCA9IExNQ19SWERFU0NTOworICAgIHVuc2lnbmVkIGludCBuZXh0X3J4OworICAgIGludCByeEludExvb3BDbnQ7CQkvKiBkZWJ1ZyAtYmF6ICovCisgICAgaW50IGxvY2FsTGVuZ3RoRXJyQ250ID0gMDsKKyAgICBsb25nIHN0YXQ7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5zYjsKKyAgICB1MTYgbGVuOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19yeCBpbiIpOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOworCisgICAgcnhJbnRMb29wQ250ID0gMDsJCS8qIGRlYnVnIC1iYXogKi8KKworICAgIGkgPSBzYy0+bG1jX25leHRfcnggJSBMTUNfUlhERVNDUzsKKyAgICBuZXh0X3J4ID0gc2MtPmxtY19uZXh0X3J4OworCisgICAgd2hpbGUgKCgoc3RhdCA9IHNjLT5sbWNfcnhyaW5nW2ldLnN0YXR1cykgJiBMTUNfUkRFU19PV05fQklUKSAhPSBERVNDX09XTkVEX0JZX0RDMjFYNCkKKyAgICB7CisgICAgICAgIHJ4SW50TG9vcENudCsrOwkJLyogZGVidWcgLWJheiAqLworICAgICAgICBsZW4gPSAoKHN0YXQgJiBMTUNfUkRFU19GUkFNRV9MRU5HVEgpID4+IFJERVNfRlJBTUVfTEVOR1RIX0JJVF9OVU1CRVIpOworICAgICAgICBpZiAoKHN0YXQgJiAweDAzMDApICE9IDB4MDMwMCkgeyAgLyogQ2hlY2sgZmlyc3Qgc2VnbWVudCBhbmQgbGFzdCBzZWdtZW50ICovCisgICAgICAgICAgICBpZiAoKHN0YXQgJiAweDAwMDBmZmZmKSAhPSAweDdmZmYpIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVyc2l6ZWQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICBzYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzdGF0ICYgMHgwMDAwMDAwOCl7IC8qIENhdGNoIGEgZHJpYmJsaW5nIGJpdCBlcnJvciAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2Vycm9ycysrOworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYoc3RhdCAmIDB4MDAwMDAwMDQpeyAvKiBDYXRjaCBhIENSQyBlcnJvciBieSB0aGUgWGlsaW54ICovCisgICAgICAgICAgICBzYy0+c3RhdHMucnhfZXJyb3JzKys7CisgICAgICAgICAgICBzYy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKGxlbiA+IExNQ19QS1RfQlVGX1NaKXsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisgICAgICAgICAgICBsb2NhbExlbmd0aEVyckNudCsrOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPCBzYy0+bG1jX2NyY1NpemUgKyAyKSB7CisgICAgICAgICAgICBzYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X1NtYWxsUGt0Q250Kys7CisgICAgICAgICAgICBsb2NhbExlbmd0aEVyckNudCsrOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN0YXQgJiAweDAwMDA0MDAwKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlciBkZXNjcmlwdG9yIGVycm9yLCByZWNlaXZlciBvdXQgb2Ygc3luYz9cbiIsIGRldi0+bmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBsZW4gLT0gc2MtPmxtY19jcmNTaXplOworCisgICAgICAgIHNrYiA9IHNjLT5sbWNfcnhxW2ldOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5IGF0IHNvbWUgcG9pbnQKKyAgICAgICAgICoganVzdCBhbGxvY2F0ZSBhbiBza2IgYnVmZiBhbmQgY29udGludWUuCisgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgaWYoc2tiID09IDB4MCl7CisgICAgICAgICAgICBuc2IgPSBkZXZfYWxsb2Nfc2tiIChMTUNfUEtUX0JVRl9TWiArIDIpOworICAgICAgICAgICAgaWYgKG5zYikgeworICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gbnNiOworICAgICAgICAgICAgICAgIG5zYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAobnNiLT50YWlsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDE7CisgICAgICAgICAgICBnb3RvIHNraXBfcGFja2V0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgICAgICBzYy0+c3RhdHMucnhfcGFja2V0cysrOworICAgICAgICBzYy0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisgICAgICAgIExNQ19DT05TT0xFX0xPRygicmVjdiIsIHNrYi0+ZGF0YSwgbGVuKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJJ20gbm90IHN1cmUgb2YgdGhlIHNhbml0eSBvZiB0aGlzCisgICAgICAgICAqIFBhY2tldHMgY291bGQgYmUgYXJyaXZpbmcgYXQgYSBjb25zdGFudAorICAgICAgICAgKiA0NC4yMTBtYml0cy9zZWMgYW5kIHdlJ3JlIGdvaW5nIHRvIGNvcHkKKyAgICAgICAgICogdGhlbSBpbnRvIGEgbmV3IGJ1ZmZlcj8/CisgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgaWYobGVuID4gKExNQ19NVFUgLSAoTE1DX01UVT4+MikpKXsgLyogbGVuID4gTE1DX01UVSAqIDAuNzUgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiBpdCdzIGEgbGFyZ2UgcGFja2V0IGRvbid0IGNvcHkgaXQganVzdCBoYW5kIGl0IHVwCisgICAgICAgICAgICAgKi8KKyAgICAgICAgZ2l2ZV9pdF9hbnl3YXlzOgorCisgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IE5VTEw7CisgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gMHgwOworCisgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7CisgICAgICAgICAgICBza2ItPnByb3RvY29sID0gbG1jX3Byb3RvX3R5cGUoc2MsIHNrYik7CisgICAgICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisgICAgICAgICAgICBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisvLyAgICAgICAgICAgIHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICBsbWNfcHJvdG9fbmV0aWYoc2MsIHNrYik7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIHNrYiB3aWxsIGJlIGRlc3Ryb3llZCBieSB0aGUgdXBwZXIgbGF5ZXJzLCBtYWtlIGEgbmV3IG9uZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuc2IgPSBkZXZfYWxsb2Nfc2tiIChMTUNfUEtUX0JVRl9TWiArIDIpOworICAgICAgICAgICAgaWYgKG5zYikgeworICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gbnNiOworICAgICAgICAgICAgICAgIG5zYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAobnNiLT50YWlsKTsKKyAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlcnJlZCB0byAyMTE0MCBiZWxvdyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXZSd2ZSBydW4gb3V0IG9mIG1lbW9yeSwgc3RvcCB0cnlpbmcgdG8gYWxsb2NhdGUKKyAgICAgICAgICAgICAgICAgKiBtZW1vcnkgYW5kIGV4aXQgdGhlIGludGVycnVwdCBoYW5kbGVyCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUaGUgY2hpcCBtYXkgcnVuIG91dCBvZiByZWNlaXZlcnMgYW5kIHN0b3AKKyAgICAgICAgICAgICAgICAgKiBpbiB3aGljaCBjYXJlIHdlJ2xsIHRyeSB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICogYWdhaW4uICAob25jZSBhIHNlY29uZCkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzYy0+c3RhdHMucnhfQnVmZkFsbG9jRXJyKys7CisgICAgICAgICAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkNWSU5ULCBzdGF0LCBsZW4pOworICAgICAgICAgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDE7CisgICAgICAgICAgICAgICAgZ290byBza2lwX291dF9vZl9tZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuc2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisgICAgICAgICAgICBpZighbnNiKSB7CisgICAgICAgICAgICAgICAgZ290byBnaXZlX2l0X2FueXdheXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoc2tiX3B1dChuc2IsIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbnNiLT5wcm90b2NvbCA9IGxtY19wcm90b190eXBlKHNjLCBza2IpOworICAgICAgICAgICAgbnNiLT5tYWMucmF3ID0gbnNiLT5kYXRhOworLy8gICAgICAgICAgICBuc2ItPm5oLnJhdyA9IG5zYi0+ZGF0YTsKKyAgICAgICAgICAgIG5zYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgbG1jX3Byb3RvX25ldGlmKHNjLCBuc2IpOworICAgICAgICB9CisKKyAgICBza2lwX3BhY2tldDoKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkNWSU5ULCBzdGF0LCBsZW4pOworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMgPSBERVNDX09XTkVEX0JZX0RDMjFYNDsKKworICAgICAgICBzYy0+bG1jX25leHRfcngrKzsKKyAgICAgICAgaSA9IHNjLT5sbWNfbmV4dF9yeCAlIExNQ19SWERFU0NTOworICAgICAgICByeF93b3JrX2xpbWl0LS07CisgICAgICAgIGlmIChyeF93b3JrX2xpbWl0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGRldGVjdCBjb25kaXRpb24gZm9yIExNQzEwMDAgd2hlcmUgRFNVIGNhYmxlIGF0dGFjaGVzIGFuZCBmaWxscworICAgICAqIGRlc2NyaXB0b3JzIHdpdGggYm9ndXMgcGFja2V0cworICAgICAqCisgICAgaWYgKGxvY2FsTGVuZ3RoRXJyQ250ID4gTE1DX1JYREVTQ1MgLSAzKSB7CisgICAgICAgIHNjLT5zdGF0cy5yeF9CYWRQa3RTdXJnZUNudCsrOworICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9CQURQS1RTVVJHRSwKKyAgICAgICAgICAgICAgICAgICAgICBsb2NhbExlbmd0aEVyckNudCwKKyAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMucnhfQmFkUGt0U3VyZ2VDbnQpOworICAgIH0gKi8KKworICAgIC8qIHNhdmUgbWF4IGNvdW50IG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMgc2VydmljZWQgKi8KKyAgICBpZiAocnhJbnRMb29wQ250ID4gc2MtPnN0YXRzLnJ4SW50TG9vcENudCkgeworICAgICAgICBzYy0+c3RhdHMucnhJbnRMb29wQ250ID0gcnhJbnRMb29wQ250OwkvKiBkZWJ1ZyAtYmF6ICovCisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBpZiAocnhJbnRMb29wQ250ID09IDApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1JYREVTQ1M7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMgJiBMTUNfUkRFU19PV05fQklUKQorICAgICAgICAgICAgICAgICE9IERFU0NfT1dORURfQllfREMyMVg0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ4SW50TG9vcENudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JDVkVORCwgcnhJbnRMb29wQ250LCAwKTsKKyAgICB9CisjZW5kaWYKKworCisgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMyk7CisKK3NraXBfb3V0X29mX21lbToKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnggb3V0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsbWNfZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2dldF9zdGF0cyBpbiIpOworCisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBzYy0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBMTUNfQ1NSX1JFQUQgKHNjLCBjc3JfbWlzc2VkX2ZyYW1lcykgJiAweGZmZmY7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfZ2V0X3N0YXRzIG91dCIpOworCisgICAgcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmc2MtPnN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbG1jX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibG1jIiwKKwkuaWRfdGFibGUJPSBsbWNfcGNpX3RibCwKKwkucHJvYmUJCT0gbG1jX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobG1jX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9sbWModm9pZCkKK3sKKyAgICByZXR1cm4gcGNpX21vZHVsZV9pbml0KCZsbWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbG1jKHZvaWQpCit7CisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9sbWMpOworbW9kdWxlX2V4aXQoZXhpdF9sbWMpOworCit1bnNpZ25lZCBsbWNfbWlpX3JlYWRyZWcgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVuc2lnbmVkIGRldmFkZHIsIHVuc2lnbmVkIHJlZ25vKSAvKmZvbGQwMCovCit7CisgICAgaW50IGk7CisgICAgaW50IGNvbW1hbmQgPSAoMHhmNiA8PCAxMCkgfCAoZGV2YWRkciA8PCA1KSB8IHJlZ25vOworICAgIGludCByZXR2YWwgPSAwOworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX21paV9yZWFkcmVnIGluIik7CisKKyAgICBMTUNfTUlJX1NZTkMgKHNjKTsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZzogZG9uZSBzeW5jIik7CisKKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgICBpbnQgZGF0YXZhbCA9IChjb21tYW5kICYgKDEgPDwgaSkpID8gMHgyMDAwMCA6IDA7CisKKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCBkYXRhdmFsKTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCBkYXRhdmFsIHwgMHgxMDAwMCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgfQorCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX21paV9yZWFkcmVnOiBkb25lMSIpOworCisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIDB4NDAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICByZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChMTUNfQ1NSX1JFQUQgKHNjLCBjc3JfOSkgJiAweDgwMDAwKSA/IDEgOiAwKTsKKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCAweDQwMDAwIHwgMHgxMDAwMCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgfQorCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX21paV9yZWFkcmVnIG91dCIpOworCisgICAgcmV0dXJuIChyZXR2YWwgPj4gMSkgJiAweGZmZmY7Cit9CisKK3ZvaWQgbG1jX21paV93cml0ZXJlZyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdW5zaWduZWQgZGV2YWRkciwgdW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIGRhdGEpIC8qZm9sZDAwKi8KK3sKKyAgICBpbnQgaSA9IDMyOworICAgIGludCBjb21tYW5kID0gKDB4NTAwMiA8PCAxNikgfCAoZGV2YWRkciA8PCAyMykgfCAocmVnbm8gPDwgMTgpIHwgZGF0YTsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfd3JpdGVyZWcgaW4iKTsKKworICAgIExNQ19NSUlfU1lOQyAoc2MpOworCisgICAgaSA9IDMxOworICAgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgICBpbnQgZGF0YXY7CisKKyAgICAgICAgaWYgKGNvbW1hbmQgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgIGRhdGF2ID0gMHgyMDAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YXYgPSAweDAwMDAwOworCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgZGF0YXYpOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIChkYXRhdiB8IDB4MTAwMDApKTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgaS0tOworICAgIH0KKworICAgIGkgPSAyOworICAgIHdoaWxlIChpID4gMCkKKyAgICB7CisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgMHg0MDAwMCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgMHg1MDAwMCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIGktLTsKKyAgICB9CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbWlpX3dyaXRlcmVnIG91dCIpOworfQorCitzdGF0aWMgdm9pZCBsbWNfc29mdHJlc2V0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKSAvKmZvbGQwMCovCit7CisgICAgaW50IGk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfc29mdHJlc2V0IGluIik7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIHJpbmdzIGFuZCBidWZmZXJzLiAqLworICAgIHNjLT5sbWNfdHhmdWxsID0gMDsKKyAgICBzYy0+bG1jX25leHRfcnggPSAwOworICAgIHNjLT5sbWNfbmV4dF90eCA9IDA7CisgICAgc2MtPmxtY190YWludF9yeCA9IDA7CisgICAgc2MtPmxtY190YWludF90eCA9IDA7CisKKyAgICAvKgorICAgICAqIFNldHVwIGVhY2ggb25lIG9mIHRoZSByZWNlaXZlciBidWZmZXJzCisgICAgICogYWxsb2NhdGUgYW4gc2tidWZmIGZvciBlYWNoIG9uZSwgc2V0dXAgdGhlIGRlc2NyaXB0b3IgdGFibGUKKyAgICAgKiBhbmQgcG9pbnQgZWFjaCBidWZmZXIgYXQgdGhlIG5leHQgb25lCisgICAgICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1JYREVTQ1M7IGkrKykKKyAgICB7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgICAgICAgaWYgKHNjLT5sbWNfcnhxW2ldID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNrYiA9IGRldl9hbGxvY19za2IgKExNQ19QS1RfQlVGX1NaICsgMik7CisgICAgICAgICAgICBpZihza2IgPT0gTlVMTCl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWNlaXZlciByaW5nLCB3aWxsIHRyeSBhZ2FpblxuIiwgc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIHNjLT5mYWlsZWRfcmluZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gc2tiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2tiID0gc2MtPmxtY19yeHFbaV07CisgICAgICAgIH0KKworICAgICAgICBza2ItPmRldiA9IHNjLT5sbWNfZGV2aWNlOworCisgICAgICAgIC8qIG93bmVkIGJ5IDIxMTQwICovCisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisKKyAgICAgICAgLyogdXNlZCB0byBiZSBQS1RfQlVGX1NaIG5vdyB1c2VzIHNrYiBzaW5jZSB3ZSBsb3NlIHNvbWUgdG8gaGVhZCByb29tICovCisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmxlbmd0aCA9IHNrYi0+ZW5kIC0gc2tiLT5kYXRhOworCisgICAgICAgIC8qIHVzZSB0byBiZSB0YWlsIHdoaWNoIGlzIGR1bWIgc2luY2UgeW91J3JlIHRoaW5raW5nIHdoeSB3cml0ZQorICAgICAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBwYWNraixldCBidXQgc2luY2UgdGhlcmUncyBub3RoaW5nIHRoZXJlIHRhaWwgPT0gZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzIChza2ItPmRhdGEpOworCisgICAgICAgIC8qIFRoaXMgaXMgZmFpciBzaW5jZSB0aGUgc3RydWN0dXJlIGlzIHN0YXRpYyBhbmQgd2UgaGF2ZSB0aGUgbmV4dCBhZGRyZXNzICovCisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cyAoJnNjLT5sbWNfcnhyaW5nW2kgKyAxXSk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgZW5kIG9mIHJpbmcKKyAgICAgKi8KKyAgICBzYy0+bG1jX3J4cmluZ1tpIC0gMV0ubGVuZ3RoIHw9IDB4MDIwMDAwMDA7IC8qIFNldCBlbmQgb2YgYnVmZmVycyBmbGFnICovCisgICAgc2MtPmxtY19yeHJpbmdbaSAtIDFdLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cyAoJnNjLT5sbWNfcnhyaW5nWzBdKTsgLyogUG9pbnQgYmFjayB0byB0aGUgc3RhcnQgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3J4bGlzdCwgdmlydF90b19idXMgKHNjLT5sbWNfcnhyaW5nKSk7IC8qIHdyaXRlIGJhc2UgYWRkcmVzcyAqLworCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0cmFuc21pdCByaW5ncyBhbmQgYnVmZmVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMTUNfVFhERVNDUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHNjLT5sbWNfdHhxW2ldICE9IE5VTEwpewkJLyogaGF2ZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2MtPmxtY190eHFbaV0pOwkvKiBmcmVlIGl0ICovCisgICAgICAgICAgICBzYy0+c3RhdHMudHhfZHJvcHBlZCsrOyAgICAgIC8qIFdlIGp1c3QgZHJvcHBlZCBhIHBhY2tldCAqLworICAgICAgICB9CisgICAgICAgIHNjLT5sbWNfdHhxW2ldID0gTlVMTDsKKyAgICAgICAgc2MtPmxtY190eHJpbmdbaV0uc3RhdHVzID0gMHgwMDAwMDAwMDsKKyAgICAgICAgc2MtPmxtY190eHJpbmdbaV0uYnVmZmVyMiA9IHZpcnRfdG9fYnVzICgmc2MtPmxtY190eHJpbmdbaSArIDFdKTsKKyAgICB9CisgICAgc2MtPmxtY190eHJpbmdbaSAtIDFdLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cyAoJnNjLT5sbWNfdHhyaW5nWzBdKTsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3R4bGlzdCwgdmlydF90b19idXMgKHNjLT5sbWNfdHhyaW5nKSk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfc29mdHJlc2V0IG91dCIpOworfQorCit2b2lkIGxtY19ncGlvX21raW5wdXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGJpdHMpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta2lucHV0IGluIik7CisgICAgc2MtPmxtY19ncGlvX2lvICY9IH5iaXRzOworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgVFVMSVBfR1BfUElOU0VUIHwgKHNjLT5sbWNfZ3Bpb19pbykpOworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19ncGlvX21raW5wdXQgb3V0Iik7Cit9CisKK3ZvaWQgbG1jX2dwaW9fbWtvdXRwdXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGJpdHMpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta291dHB1dCBpbiIpOworICAgIHNjLT5sbWNfZ3Bpb19pbyB8PSBiaXRzOworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgVFVMSVBfR1BfUElOU0VUIHwgKHNjLT5sbWNfZ3Bpb19pbykpOworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19ncGlvX21rb3V0cHV0IG91dCIpOworfQorCit2b2lkIGxtY19sZWRfb24obG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGxlZCkgLypmb2xkMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19sZWRfb24gaW4iKTsKKyAgICBpZigofnNjLT5sbWNfbWlpcmVnMTYpICYgbGVkKXsgLyogQWxyZWFkeSBvbiEgKi8KKyAgICAgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vbiBhb24gb3V0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+bGVkOworICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29uIG91dCIpOworfQorCit2b2lkIGxtY19sZWRfb2ZmKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBsZWQpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29mZiBpbiIpOworICAgIGlmKHNjLT5sbWNfbWlpcmVnMTYgJiBsZWQpeyAvKiBBbHJlYWR5IHNldCBkb24ndCBkbyBhbnl0aGluZyAqLworICAgICAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29mZiBhb2ZmIG91dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gbGVkOworICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29mZiBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX3Jlc2V0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcmVzZXQgaW4iKTsKKyAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9GSUZPX1JFU0VUOworICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKworICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9GSUZPX1JFU0VUOworICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKworICAgIC8qCisgICAgICogbWFrZSBzb21lIG9mIHRoZSBHUElPIHBpbnMgYmUgb3V0cHV0cworICAgICAqLworICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCBMTUNfR0VQX1JFU0VUKTsKKworICAgIC8qCisgICAgICogUkVTRVQgbG93IHRvIGZvcmNlIHN0YXRlIHJlc2V0LiAgVGhpcyBhbHNvIGZvcmNlcworICAgICAqIHRoZSB0cmFuc21pdHRlciBjbG9jayB0byBiZSBpbnRlcm5hbCwgYnV0IHdlIGV4cGVjdCB0byByZXNldAorICAgICAqIHRoYXQgbGF0ZXIgYW55d2F5LgorICAgICAqLworICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfUkVTRVQpOworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAgIC8qCisgICAgICogaG9sZCBmb3IgbW9yZSB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAgICAqLworICAgIHVkZWxheSg1MCk7CisKKyAgICAvKgorICAgICAqIHN0b3AgZHJpdmluZyBYaWxpbngtcmVsYXRlZCBzaWduYWxzCisgICAgICovCisgICAgbG1jX2dwaW9fbWtpbnB1dChzYywgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAvKgorICAgICAqIENhbGwgbWVkaWEgc3BlY2lmaWMgaW5pdCByb3V0aW5lCisgICAgICovCisgICAgc2MtPmxtY19tZWRpYS0+aW5pdChzYyk7CisKKyAgICBzYy0+c3RhdHMucmVzZXRDb3VudCsrOworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19yZXNldCBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX2RlY19yZXNldChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKSAvKmZvbGQwMCovCit7CisgICAgdV9pbnQzMl90IHZhbDsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZGVjX3Jlc2V0IGluIik7CisKKyAgICAvKgorICAgICAqIGRpc2FibGUgYWxsIGludGVycnVwdHMKKyAgICAgKi8KKyAgICBzYy0+bG1jX2ludHJtYXNrID0gMDsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfaW50ciwgc2MtPmxtY19pbnRybWFzayk7CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBjaGlwIHdpdGggYSBzb2Z0d2FyZSByZXNldCBjb21tYW5kLgorICAgICAqIFdhaXQgMTAgbWljcm9zZWNvbmRzIChhY3R1YWxseSA1MCBQQ0kgY3ljbGVzIGJ1dCBhdAorICAgICAqIDMzTUh6IHRoYXQgY29tZXMgdG8gdHdvIG1pY3Jvc2Vjb25kcyBidXQgd2FpdCBhCisgICAgICogYml0IGxvbmdlciBhbnl3YXlzKQorICAgICAqLworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9idXNtb2RlLCBUVUxJUF9CVVNNT0RFX1NXUkVTRVQpOworICAgIHVkZWxheSgyNSk7CisjaWZkZWYgX19zcGFyY19fCisgICAgc2MtPmxtY19idXNtb2RlID0gTE1DX0NTUl9SRUFEKHNjLCBjc3JfYnVzbW9kZSk7CisgICAgc2MtPmxtY19idXNtb2RlID0gMHgwMDEwMDAwMDsKKyAgICBzYy0+bG1jX2J1c21vZGUgJj0gflRVTElQX0JVU01PREVfU1dSRVNFVDsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfYnVzbW9kZSwgc2MtPmxtY19idXNtb2RlKTsKKyNlbmRpZgorICAgIHNjLT5sbWNfY21kbW9kZSA9IExNQ19DU1JfUkVBRChzYywgY3NyX2NvbW1hbmQpOworCisgICAgLyoKKyAgICAgKiBXZSB3YW50OgorICAgICAqICAgbm8gZXRoZXJuZXQgYWRkcmVzcyBpbiBmcmFtZXMgd2Ugd3JpdGUKKyAgICAgKiAgIGRpc2FibGUgcGFkZGluZyAodHhkZXNjLCBwYWRkaW5nIGRpc2FibGUpCisgICAgICogICBpZ25vcmUgcnVudCBmcmFtZXMgKHJkZXMwIGJpdCAxNSkKKyAgICAgKiAgIG5vIHJlY2VpdmVyIHdhdGNoZG9nIG9yIHRyYW5zbWl0dGVyIGphYmJlciB0aW1lcgorICAgICAqICAgICAgIChjc3IxNSBiaXQgMCwxNCA9PSAxKQorICAgICAqICAgaWYgdXNpbmcgMTYtYml0IENSQywgdHVybiBvZmYgQ1JDICh0cmFucyBkZXNjLCBjcmMgZGlzYWJsZSkKKyAgICAgKi8KKworICAgIHNjLT5sbWNfY21kbW9kZSB8PSAoIFRVTElQX0NNRF9QUk9NSVNDVU9VUworICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX0ZVTExEVVBMRVgKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9QQVNTQkFEUEtUCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfTk9IRUFSVEJFQVQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9QT1JUU0VMRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfUkVDRUlWRUFMTAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX01VU1RCRU9ORQorICAgICAgICAgICAgICAgICAgICAgICApOworICAgIHNjLT5sbWNfY21kbW9kZSAmPSB+KCBUVUxJUF9DTURfT1BFUk1PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfVEhSRVNIT0xEQ1RMCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1NUT1JFRldECisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1RYVEhSU0hMRENUTAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9jb21tYW5kLCBzYy0+bG1jX2NtZG1vZGUpOworCisgICAgLyoKKyAgICAgKiBkaXNhYmxlIHJlY2VpdmVyIHdhdGNoZG9nIGFuZCB0cmFuc21pdCBqYWJiZXIKKyAgICAgKi8KKyAgICB2YWwgPSBMTUNfQ1NSX1JFQUQoc2MsIGNzcl9zaWFfZ2VuZXJhbCk7CisgICAgdmFsIHw9IChUVUxJUF9XQVRDSERPR19UWERJU0FCTEUgfCBUVUxJUF9XQVRDSERPR19SWERJU0FCTEUpOworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9zaWFfZ2VuZXJhbCwgdmFsKTsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19kZWNfcmVzZXQgb3V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGxtY19pbml0Y3NycyhsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3NycHRyX3QgY3NyX2Jhc2UsIC8qZm9sZDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY3NyX3NpemUpCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2luaXRjc3JzIGluIik7CisgICAgc2MtPmxtY19jc3JzLmNzcl9idXNtb2RlCSAgICAgICAgPSBjc3JfYmFzZSArICAwICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl90eHBvbGwJCT0gY3NyX2Jhc2UgKyAgMSAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3Jfcnhwb2xsCQk9IGNzcl9iYXNlICsgIDIgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX3J4bGlzdAkJPSBjc3JfYmFzZSArICAzICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl90eGxpc3QJCT0gY3NyX2Jhc2UgKyAgNCAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3Jfc3RhdHVzCQk9IGNzcl9iYXNlICsgIDUgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX2NvbW1hbmQJICAgICAgICA9IGNzcl9iYXNlICsgIDYgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX2ludHIJCT0gY3NyX2Jhc2UgKyAgNyAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfbWlzc2VkX2ZyYW1lcwk9IGNzcl9iYXNlICsgIDggKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzkJCSAgICAgICAgPSBjc3JfYmFzZSArICA5ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xMAkJICAgICAgICA9IGNzcl9iYXNlICsgMTAgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzExCQkgICAgICAgID0gY3NyX2Jhc2UgKyAxMSAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTIJCSAgICAgICAgPSBjc3JfYmFzZSArIDEyICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xMwkJICAgICAgICA9IGNzcl9iYXNlICsgMTMgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzE0CQkgICAgICAgID0gY3NyX2Jhc2UgKyAxNCAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTUJCSAgICAgICAgPSBjc3JfYmFzZSArIDE1ICogY3NyX3NpemU7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2luaXRjc3JzIG91dCIpOworfQorCitzdGF0aWMgdm9pZCBsbWNfZHJpdmVyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeyAvKmZvbGQwMCovCisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUzMiBjc3I2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2RyaXZlcl90aW1lb3V0IGluIik7CisKKyAgICBzYyA9IGRldi0+cHJpdjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIHByaW50aygiJXM6IFhtaXR0ZXIgYnVzeXxcbiIsIGRldi0+bmFtZSk7CisKKyAgICBzYy0+c3RhdHMudHhfdGJ1c3lfY2FsbHMrKyA7CisgICAgaWYgKGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0IDwgVFhfVElNRU9VVCkgeworICAgICAgICBnb3RvIGJ1Z19vdXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGlwIHNlZW1zIHRvIGhhdmUgbG9ja2VkIHVwCisgICAgICogUmVzZXQgaXQKKyAgICAgKiBUaGlzIHdoaXBzIG91dCBhbGwgb3VyIGRlY3JpcHRvcgorICAgICAqIHRhYmxlIGFuZCBzdGFydHMgZnJvbSBzY2FydGNoCisgICAgICovCisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9YTVRQUkNUTU8sCisgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9Qcm9jVGltZW91dCk7CisKKyAgICBsbWNfcnVubmluZ19yZXNldCAoZGV2KTsKKworICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMSwgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIDApOworICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMiwKKyAgICAgICAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KSwKKyAgICAgICAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KSk7CisKKyAgICAvKiByZXN0YXJ0IHRoZSB0eCBwcm9jZXNzZXMgKi8KKyAgICBjc3I2ID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX2NvbW1hbmQpOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgY3NyNiB8IDB4MDAwMik7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9jb21tYW5kLCBjc3I2IHwgMHgyMDAyKTsKKworICAgIC8qIGltbWVkaWF0ZSB0cmFuc21pdCAqLworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfdHhwb2xsLCAwKTsKKworICAgIHNjLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBzYy0+c3RhdHMudHhfUHJvY1RpbWVvdXQrKzsJLyogLWJheiAqLworCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKK2J1Z19vdXQ6CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfZHJpdmVyX3RpbW91dCBvdXQiKTsKKworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tZWRpYS5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWVkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVjZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWVkaWEuYwpAQCAtMCwwICsxLDEyNDYgQEAKKy8qICRJZDogbG1jX21lZGlhLmMsdiAxLjEzIDIwMDAvMDQvMTEgMDU6MjU6MjYgYXNqIEV4cCAkICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJsbWMuaCIKKyNpbmNsdWRlICJsbWNfdmFyLmgiCisjaW5jbHVkZSAibG1jX2lvY3RsLmgiCisjaW5jbHVkZSAibG1jX2RlYnVnLmgiCisKKyNkZWZpbmUgQ09ORklHX0xNQ19JR05PUkVfSEFSRFdBUkVfSEFORFNIQUtFIDEKKworIC8qCisgICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgTEFOIE1lZGlhIENvcnBvcmF0aW9uIChMTUMpCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIHd3dy5sYW5tZWRpYS5jb20KKyAgKgorICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGJ5OgorICAqIEFuZHJldyBTdGFubGV5LUpvbmVzIChhc2pAY2Jhbi5jb20pCisgICogUm9iIEJyYXVuIChiYnJhdW5Adml4LmNvbSksCisgICogTWljaGFlbCBHcmFmZiAoZXhwbG9yZXJAdml4LmNvbSkgYW5kCisgICogTWF0dCBUaG9tYXMgKG1hdHRAM2FtLXNvZnR3YXJlLmNvbSkuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICovCisKKy8qCisgKiBGb3IgbGFjayBvZiBhIGJldHRlciBwbGFjZSwgcHV0IHRoZSBTU0kgY2FibGUgc3R1ZmYgaGVyZS4KKyAqLworY2hhciAqbG1jX3QxX2NhYmxlc1tdID0geworICAiVi4xMC9SUzQyMyIsICJFSUE1MzBBIiwgInJlc2VydmVkIiwgIlguMjEiLCAiVi4zNSIsCisgICJFSUE0NDkvRUlBNTMwL1YuMzYiLCAiVi4yOC9FSUEyMzIiLCAibm9uZSIsIE5VTEwKK307CisKKy8qCisgKiBwcm90b2NvbCBpbmRlcGVuZGVudCBtZXRob2QuCisgKi8KK3N0YXRpYyB2b2lkIGxtY19zZXRfcHJvdG9jb2wgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKKworLyoKKyAqIG1lZGlhIGluZGVwZW5kZW50IG1ldGhvZHMgdG8gY2hlY2sgb24gbWVkaWEgc3RhdHVzLCBsaW5rLCBsaWdodCBMRURzLAorICogZXRjLgorICovCitzdGF0aWMgdm9pZCBsbWNfZHMzX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX2RzM19kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19kczNfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIHZvaWQgbG1jX2RzM19zZXRfMTAwZnQgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgaW50IGxtY19kczNfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19kczNfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3NldF9zY3JhbSAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19kczNfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfaHNzaV9pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX2hzc2lfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIHZvaWQgbG1jX2hzc2lfc2V0X2Nsb2NrIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIGludCBsbWNfaHNzaV9nZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX2hzc2lfc2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX2hzc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfaHNzaV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CisKK3N0YXRpYyB2b2lkIGxtY19zc2lfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3NzaV9zZXRfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3NldF9jbG9jayAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X3NwZWVkIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CitzdGF0aWMgaW50IGxtY19zc2lfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX3NzaV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfdDFfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfZGVmYXVsdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIGludCBsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY190MV9zZXRfY2lyY3VpdF90eXBlIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX3QxX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX3QxX3NldF9jbG9jayAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY190MV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CisKK3N0YXRpYyB2b2lkIGxtY19kdW1teV9zZXRfMSAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19kdW1teV9zZXQyXzEgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2F2OTExMF9iaXQgKGxtY19zb2Z0Y190ICosIGludCk7CitzdGF0aWMgdm9pZCB3cml0ZV9hdjkxMTAgKGxtY19zb2Z0Y190ICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsCisJCQkgIHVfaW50MzJfdCwgdV9pbnQzMl90KTsKKworbG1jX21lZGlhX3QgbG1jX2RzM19tZWRpYSA9IHsKKyAgbG1jX2RzM19pbml0LAkJCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfZHMzX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19kczNfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHMzX3NldF8xMDBmdCwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2RzM19zZXRfc2NyYW0sCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19kczNfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kczNfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX2RzM193YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX2hzc2lfbWVkaWEgPSB7CisgIGxtY19oc3NpX2luaXQsCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2hzc2lfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX2hzc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfaHNzaV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX2hzc2lfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2hzc2lfc2V0X2xpbmtfc3RhdHVzLAkvKiBzZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2hzc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX2hzc2lfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19zc2lfbWVkaWEgPSB7IGxtY19zc2lfaW5pdCwJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19zc2lfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX3NzaV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY19zc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfc3NpX3NldF9zcGVlZCwJCS8qIHNldCBsaW5lIHNwZWVkICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2xpbmtfc3RhdHVzLAkvKiBzZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX3NzaV9zZXRfY3JjX2xlbmd0aCwJLyogc2V0IENSQyBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IFQxIG9yIEUxIGNpcmN1aXQgdHlwZSAqLworICBsbWNfc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfdDFfbWVkaWEgPSB7CisgIGxtY190MV9pbml0LAkJCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfdDFfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX3QxX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX3QxX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX2R1bW15X3NldDJfMSwJCS8qIHNldCBsaW5lIHNwZWVkICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY190MV9zZXRfY3JjX2xlbmd0aCwJLyogc2V0IENSQyBsZW5ndGggKi8KKyAgbG1jX3QxX3NldF9jaXJjdWl0X3R5cGUsCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3QxX3dhdGNoZG9nCit9OworCitzdGF0aWMgdm9pZAorbG1jX2R1bW15X3NldF8xIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2xtY19kdW1teV9zZXQyXzEgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGEpCit7Cit9CisKKy8qCisgKiAgSFNTSSBtZXRob2RzCisgKi8KKworc3RhdGljIHZvaWQKK2xtY19oc3NpX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5pY3RsLmNhcmR0eXBlID0gTE1DX0NUTF9DQVJEVFlQRV9MTUM1MjAwOworCisgIGxtY19ncGlvX21rb3V0cHV0IChzYywgTE1DX0dFUF9IU1NJX0NMT0NLKTsKK30KKworc3RhdGljIHZvaWQKK2xtY19oc3NpX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKworICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19ET1dOKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbAorICogYWx3YXlzIHJlc2V0IHRoZSBjYXJkIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2xtY19oc3NpX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGN0bCkKK3sKKyAgaWYgKGN0bCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBzYy0+aWN0bC5jbG9ja19zb3VyY2UpOworICAgICAgbG1jX3NldF9wcm90b2NvbCAoc2MsIE5VTEwpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qCisgICAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2xvY2sgc291cmNlCisgICAqLworICBpZiAoY3RsLT5jbG9ja19zb3VyY2UgJiYgIXNjLT5pY3RsLmNsb2NrX3NvdXJjZSkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UKTsKKyAgICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UOworICAgIH0KKyAgZWxzZSBpZiAoIWN0bC0+Y2xvY2tfc291cmNlICYmIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSkKKyAgICB7CisgICAgICBzYy0+bG1jX3RpbWluZyA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpOworICAgIH0KKworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKworLyoKKyAqIDEgPT0gaW50ZXJuYWwsIDAgPT0gZXh0ZXJuYWwKKyAqLworc3RhdGljIHZvaWQKK2xtY19oc3NpX3NldF9jbG9jayAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGllKQoreworICBpbnQgb2xkOworICBvbGQgPSBzYy0+aWN0bC5jbG9ja19zb3VyY2U7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpCisgICAgeworICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfSFNTSV9DTE9DSzsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQ7CisgICAgICBpZihvbGQgIT0gaWUpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgZXh0ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9IU1NJX0NMT0NLKTsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgICBpZihvbGQgIT0gaWUpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgaW50ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorfQorCisvKgorICogcmV0dXJuIGhhcmR3YXJlIGxpbmsgc3RhdHVzLgorICogMCA9PSBsaW5rIGlzIGRvd24sIDEgPT0gbGluayBpcyB1cC4KKyAqLworc3RhdGljIGludAorbG1jX2hzc2lfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICAgIC8qCisgICAgICogV2UncmUgdXNpbmcgdGhlIHNhbWUgY29kZSBhcyBTU0kgc2luY2UKKyAgICAgKiB0aGV5J3JlIHByYWN0aWNhbGx5IHRoZSBzYW1lCisgICAgICovCisgICAgcmV0dXJuIGxtY19zc2lfZ2V0X2xpbmtfc3RhdHVzKHNjKTsKK30KKworc3RhdGljIHZvaWQKK2xtY19oc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0xJTktfVVApCisgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfSFNTSV9UQTsKKyAgZWxzZQorICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9IU1NJX1RBOworCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiAwID09IDE2Yml0LCAxID09IDMyYml0CisgKi8KK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyKQorICAgIHsKKyAgICAgIC8qIDMyIGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfSFNTSV9DUkM7CisgICAgICBzYy0+aWN0bC5jcmNfbGVuZ3RoID0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIDE2IGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X0hTU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8xNjsKKyAgICB9CisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKK30KKworc3RhdGljIHZvaWQKK2xtY19oc3NpX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICAvKiBIU1NJIGlzIGJsYW5rICovCit9CisKKy8qCisgKiAgRFMzIG1ldGhvZHMKKyAqLworCisvKgorICogU2V0IGNhYmxlIGxlbmd0aAorICovCitzdGF0aWMgdm9pZAorbG1jX2RzM19zZXRfMTAwZnQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBpZSkKK3sKKyAgaWYgKGllID09IExNQ19DVExfQ0FCTEVfTEVOR1RIX0dUXzEwMEZUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9EUzNfWkVSTzsKKyAgICAgIHNjLT5pY3RsLmNhYmxlX2xlbmd0aCA9IExNQ19DVExfQ0FCTEVfTEVOR1RIX0dUXzEwMEZUOworICAgIH0KKyAgZWxzZSBpZiAoaWUgPT0gTE1DX0NUTF9DQUJMRV9MRU5HVEhfTFRfMTAwRlQpCisgICAgeworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfRFMzX1pFUk87CisgICAgICBzYy0+aWN0bC5jYWJsZV9sZW5ndGggPSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9MVF8xMDBGVDsKKyAgICB9CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHMzX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKworICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19ET1dOKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2NhYmxlX2xlbmd0aCAoc2MsIExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X3NjcmFtYmxlciAoc2MsIExNQ19DVExfT0ZGKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2NyY19sZW5ndGggKHNjLCBMTUNfQ1RMX0NSQ19MRU5HVEhfMTYpOworfQorCisvKgorICogR2l2ZW4gYSB1c2VyIHByb3ZpZGVkIHN0YXRlLCBzZXQgb3Vyc2VsdmVzIHVwIHRvIG1hdGNoIGl0LiAgVGhpcyB3aWxsCisgKiBhbHdheXMgcmVzZXQgdGhlIGNhcmQgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZAorbG1jX2RzM19zZXRfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBjdGwpCit7CisgIGlmIChjdGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2FibGVfbGVuZ3RoIChzYywgc2MtPmljdGwuY2FibGVfbGVuZ3RoKTsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9zY3JhbWJsZXIgKHNjLCBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYpOworICAgICAgbG1jX3NldF9wcm90b2NvbCAoc2MsIE5VTEwpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qCisgICAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2FibGUgbGVuZ3RoIHNldHRpbmcKKyAgICovCisgIGlmIChjdGwtPmNhYmxlX2xlbmd0aCAmJiAhc2MtPmljdGwuY2FibGVfbGVuZ3RoKQorICAgIGxtY19kczNfc2V0XzEwMGZ0IChzYywgTE1DX0NUTF9DQUJMRV9MRU5HVEhfR1RfMTAwRlQpOworICBlbHNlIGlmICghY3RsLT5jYWJsZV9sZW5ndGggJiYgc2MtPmljdGwuY2FibGVfbGVuZ3RoKQorICAgIGxtY19kczNfc2V0XzEwMGZ0IChzYywgTE1DX0NUTF9DQUJMRV9MRU5HVEhfTFRfMTAwRlQpOworCisgIC8qCisgICAqIENoZWNrIGZvciBjaGFuZ2UgaW4gc2NyYW1ibGVyIHNldHRpbmcgKHJlcXVpcmVzIHJlc2V0KQorICAgKi8KKyAgaWYgKGN0bC0+c2NyYW1ibGVyX29ub2ZmICYmICFzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYpCisgICAgbG1jX2RzM19zZXRfc2NyYW0gKHNjLCBMTUNfQ1RMX09OKTsKKyAgZWxzZSBpZiAoIWN0bC0+c2NyYW1ibGVyX29ub2ZmICYmIHNjLT5pY3RsLnNjcmFtYmxlcl9vbm9mZikKKyAgICBsbWNfZHMzX3NldF9zY3JhbSAoc2MsIExNQ19DVExfT0ZGKTsKKworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKworc3RhdGljIHZvaWQKK2xtY19kczNfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgaW50IGk7CisKKyAgc2MtPmljdGwuY2FyZHR5cGUgPSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzUyNDU7CisKKyAgLyogd3JpdGVzIHplcm9zIGV2ZXJ5d2hlcmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDIxOyBpKyspCisgICAgeworICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBpKTsKKyAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMCk7CisgICAgfQorCisgIC8qIHNldCBzb21lIGVzc2VudGlhbCBiaXRzICovCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgMSk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMHgyNSk7CS8qIHNlciwgeHR4ICovCisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCA1KTsKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE4LCAweDgwKTsJLyogZW1vZGUgKi8KKworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDE0KTsKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE4LCAweDMwKTsJLyogcmNnZW4sIHRjZ2VuICovCisKKyAgLyogY2xlYXIgY291bnRlcnMgYW5kIGxhdGNoZWQgYml0cyAqLworICBmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykKKyAgICB7CisgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIGkpOworICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworICAgIH0KK30KKworLyoKKyAqIDEgPT0gRFMzIHBheWxvYWQgc2NyYW1ibGVkLCAwID09IG5vdCBzY3JhbWJsZWQKKyAqLworc3RhdGljIHZvaWQKK2xtY19kczNfc2V0X3NjcmFtIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGlmIChpZSA9PSBMTUNfQ1RMX09OKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0RTM19TQ1JBTTsKKyAgICAgIHNjLT5pY3RsLnNjcmFtYmxlcl9vbm9mZiA9IExNQ19DVExfT047CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X0RTM19TQ1JBTTsKKyAgICAgIHNjLT5pY3RsLnNjcmFtYmxlcl9vbm9mZiA9IExNQ19DVExfT0ZGOworICAgIH0KKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKK30KKworLyoKKyAqIHJldHVybiBoYXJkd2FyZSBsaW5rIHN0YXR1cy4KKyAqIDAgPT0gbGluayBpcyBkb3duLCAxID09IGxpbmsgaXMgdXAuCisgKi8KK3N0YXRpYyBpbnQKK2xtY19kczNfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICAgIHVfaW50MTZfdCBsaW5rX3N0YXR1cywgbGlua19zdGF0dXNfMTE7CisgICAgaW50IHJldCA9IDE7CisKKyAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDcpOworICAgIGxpbmtfc3RhdHVzID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworCisgICAgLyogTE1DNTI0NSAoRFMzKSAmIExNQzEyMDAgKERTMSkgTEVEIGRlZmluaXRpb25zCisgICAgICogbGVkMCB5ZWxsb3cgPSBmYXItZW5kIGFkYXB0ZXIgaXMgaW4gUmVkIGFsYXJtIGNvbmRpdGlvbgorICAgICAqIGxlZDEgYmx1ZSAgID0gcmVjZWl2ZWQgYW4gQWxhcm0gSW5kaWNhdGlvbiBzaWduYWwKKyAgICAgKiAgICAgICAgICAgICAgICh1cHN0cmVhbSBmYWlsdXJlKQorICAgICAqIGxlZDIgR3JlZW4gID0gcG93ZXIgdG8gYWRhcHRlciwgR2F0ZSBBcnJheSBsb2FkZWQgJiBkcml2ZXIKKyAgICAgKiAgICAgICAgICAgICAgIGF0dGFjaGVkCisgICAgICogbGVkMyByZWQgICAgPSBMb3NzIG9mIFNpZ25hbCAoTE9TKSBvciBvdXQgb2YgZnJhbWUgKE9PRikKKyAgICAgKiAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgZGV0ZWN0ZWQgb24gVDMgcmVjZWl2ZSBzaWduYWwKKyAgICAgKi8KKworICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMik7CisKKyAgICBpZiAoKGxpbmtfc3RhdHVzICYgTE1DX0ZSQU1FUl9SRUcwX0RMT1MpIHx8CisgICAgICAgIChsaW5rX3N0YXR1cyAmIExNQ19GUkFNRVJfUkVHMF9PT0ZTKSl7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbM10gIT0gMSl7CisgICAgICAgICAgICB1MTYgcjE7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDAxKTsgLyogVHVybiBvbiBYYml0IGVycm9yIGFzIG91ciBjaXNjbyBkb2VzICovCisgICAgICAgICAgICByMSA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKyAgICAgICAgICAgIHIxICY9IDB4ZmU7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxOCwgcjEpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlZCBBbGFybSAtIExvc3Mgb2YgU2lnbmFsIG9yIExvc3Mgb2YgRnJhbWluZ1xuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMyk7CS8qIHR1cm4gb24gcmVkIExFRCAqLworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOwkvKiB0dXJuIG9uIHJlZCBMRUQgKi8KKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSA9PSAxKXsKKyAgICAgICAgICAgIHUxNiByMTsKKyAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgMDEpOyAvKiBUdXJuIG9mZiBYYml0IGVycm9yICovCisgICAgICAgICAgICByMSA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKyAgICAgICAgICAgIHIxIHw9IDB4MDE7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxOCwgcjEpOworICAgICAgICB9CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbM10gPSAwOworICAgIH0KKworICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE3LCAweDEwKTsKKyAgICBsaW5rX3N0YXR1c18xMSA9IGxtY19taWlfcmVhZHJlZyhzYywgMCwgMTgpOworICAgIGlmKChsaW5rX3N0YXR1cyAmIExNQ19GUkFNRVJfUkVHMF9BSVMpIHx8CisgICAgICAgKGxpbmtfc3RhdHVzXzExICYgTE1DX0ZSQU1FUl9SRUcxMF9YQklUKSkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzBdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFJUyBBbGFybSBvciBYQml0IEVycm9yXG4iLCBzYy0+bmFtZSk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVtb3RlIGVuZCBoYXMgbG9zcyBvZiBzaWduYWwgb3IgZnJhbWluZ1xuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMCk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMF0gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMCk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMF0gPSAwOworICAgIH0KKworICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgOSk7CisgICAgbGlua19zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisgICAgCisgICAgaWYobGlua19zdGF0dXMgJiBMTUNfRlJBTUVSX1JFRzlfUkJMVUUpeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJsdWUgQWxhcm0gLSBSZWNlaXZpbmcgYWxsIDEnc1xuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMV0gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMV0gPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiAwID09IDE2Yml0LCAxID09IDMyYml0CisgKi8KK3N0YXRpYyB2b2lkCitsbWNfZHMzX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgc3RhdGUpCit7CisgIGlmIChzdGF0ZSA9PSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIpCisgICAgeworICAgICAgLyogMzIgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9EUzNfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9EUzNfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8xNjsKKyAgICB9CisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKK30KKworc3RhdGljIHZvaWQKK2xtY19kczNfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgICAgCit9CisKKworLyoKKyAqICBTU0kgbWV0aG9kcworICovCisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHVfaW50MTZfdCBtaWkxNzsKKyAgaW50IGNhYmxlOworCisgIHNjLT5pY3RsLmNhcmR0eXBlID0gTE1DX0NUTF9DQVJEVFlQRV9MTUMxMDAwOworCisgIG1paTE3ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTcpOworCisgIGNhYmxlID0gKG1paTE3ICYgTE1DX01JSTE3X1NTSV9DQUJMRV9NQVNLKSA+PiBMTUNfTUlJMTdfU1NJX0NBQkxFX1NISUZUOworICBzYy0+aWN0bC5jYWJsZV90eXBlID0gY2FibGU7CisKKyAgbG1jX2dwaW9fbWtvdXRwdXQgKHNjLCBMTUNfR0VQX1NTSV9UWENMT0NLKTsKK30KKworc3RhdGljIHZvaWQKK2xtY19zc2lfZGVmYXVsdCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgc2MtPmxtY19taWlyZWcxNiA9IExNQ19NSUkxNl9MRURfQUxMOworCisgIC8qCisgICAqIG1ha2UgVFhDTE9DSyBhbHdheXMgYmUgYW4gb3V0cHV0CisgICAqLworICBsbWNfZ3Bpb19ta291dHB1dCAoc2MsIExNQ19HRVBfU1NJX1RYQ0xPQ0spOworCisgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIExNQ19MSU5LX0RPV04pOworICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X3NwZWVkIChzYywgTlVMTCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbAorICogYWx3YXlzIHJlc2V0IHRoZSBjYXJkIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2xtY19zc2lfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSk7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfc3BlZWQgKHNjLCAmc2MtPmljdGwpOworICAgICAgbG1jX3NldF9wcm90b2NvbCAoc2MsIE5VTEwpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qCisgICAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2xvY2sgc291cmNlCisgICAqLworICBpZiAoY3RsLT5jbG9ja19zb3VyY2UgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UCisgICAgICAmJiBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQpOworICAgICAgc2MtPmxtY190aW1pbmcgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgfQorICBlbHNlIGlmIChjdGwtPmNsb2NrX3NvdXJjZSA9PSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQKKwkgICAmJiBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpOworICAgICAgc2MtPmxtY190aW1pbmcgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQ7CisgICAgfQorCisgIGlmIChjdGwtPmNsb2NrX3JhdGUgIT0gc2MtPmljdGwuY2xvY2tfcmF0ZSkKKyAgICBzYy0+bG1jX21lZGlhLT5zZXRfc3BlZWQgKHNjLCBjdGwpOworCisgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBjdGwpOworfQorCisvKgorICogMSA9PSBpbnRlcm5hbCwgMCA9PSBleHRlcm5hbAorICovCitzdGF0aWMgdm9pZAorbG1jX3NzaV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBpZSkKK3sKKyAgaW50IG9sZDsKKyAgb2xkID0gaWU7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpCisgICAgeworICAgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9TU0lfVFhDTE9DSyk7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgICAgaWYoaWUgIT0gb2xkKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGV4dGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX1NTSV9UWENMT0NLOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVDsKKyAgICAgIGlmKGllICE9IG9sZCkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBpbnRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9zcGVlZCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBsbWNfY3RsX3QgKmljdGwgPSAmc2MtPmljdGw7CisgIGxtY19hdjkxMTBfdCAqYXY7CisKKyAgLyogb3JpZ2luYWwgc2V0dGluZ3MgZm9yIGNsb2NrIHJhdGUgb2Y6CisgICAqICAxMDAgS2h6ICg4LDI1LDAsMCwyKSB3ZXJlIGluY29ycmVjdAorICAgKiAgdGhleSBzaG91bGQgaGF2ZSBiZWVuIDgwLDEyNSwxLDMsMworICAgKiAgVGhlcmUgYXJlIDE3IHBhcmFtIGNvbWJpbmF0aW9ucyB0byBwcm9kdWNlIHRoaXMgZnJlcS4KKyAgICogIEZvciAxLjUgTWh6IHVzZSAxMjAsMTAwLDEsMSwyICgyMjYgcGFyYW0uIGNvbWJpbmF0aW9ucykKKyAgICovCisgIGlmIChjdGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBhdiA9ICZpY3RsLT5jYXJkc3BlYy5zc2k7CisgICAgICBpY3RsLT5jbG9ja19yYXRlID0gMTUwMDAwMDsKKyAgICAgIGF2LT5mID0gaWN0bC0+Y2xvY2tfcmF0ZTsKKyAgICAgIGF2LT5uID0gMTIwOworICAgICAgYXYtPm0gPSAxMDA7CisgICAgICBhdi0+diA9IDE7CisgICAgICBhdi0+eCA9IDE7CisgICAgICBhdi0+ciA9IDI7CisKKyAgICAgIHdyaXRlX2F2OTExMCAoc2MsIGF2LT5uLCBhdi0+bSwgYXYtPnYsIGF2LT54LCBhdi0+cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGF2ID0gJmN0bC0+Y2FyZHNwZWMuc3NpOworCisgIGlmIChhdi0+ZiA9PSAwKQorICAgIHJldHVybjsKKworICBpY3RsLT5jbG9ja19yYXRlID0gYXYtPmY7CS8qIHJlYWxseSwgdGhpcyBpcyB0aGUgcmF0ZSB3ZSBhcmUgKi8KKyAgaWN0bC0+Y2FyZHNwZWMuc3NpID0gKmF2OworCisgIHdyaXRlX2F2OTExMCAoc2MsIGF2LT5uLCBhdi0+bSwgYXYtPnYsIGF2LT54LCBhdi0+cik7Cit9CisKKy8qCisgKiByZXR1cm4gaGFyZHdhcmUgbGluayBzdGF0dXMuCisgKiAwID09IGxpbmsgaXMgZG93biwgMSA9PSBsaW5rIGlzIHVwLgorICovCitzdGF0aWMgaW50CitsbWNfc3NpX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgdV9pbnQxNl90IGxpbmtfc3RhdHVzOworICB1X2ludDMyX3QgdGlja3M7CisgIGludCByZXQgPSAxOworICBpbnQgaHdfaGRzayA9IDE7CisgIAorICAvKgorICAgKiBtaXNzaW5nIENUUz8gIEhtbS4gIElmIHdlIHJlcXVpcmUgQ1RTIG9uLCB3ZSBtYXkgbmV2ZXIgZ2V0IHRoZQorICAgKiBsaW5rIHRvIGNvbWUgdXAsIHNvIG9taXQgaXQgaW4gdGhpcyB0ZXN0LgorICAgKgorICAgKiBBbHNvLCBpdCBzZWVtcyB0aGF0IHdpdGggYSBsb29wYmFjayBjYWJsZSwgRENEIGlzbid0IGFzc2VydGVkLAorICAgKiBzbyBqdXN0IGNoZWNrIGZvciB0aGluZ3MgbGlrZSB0aGlzOgorICAgKiAgICAgIERTUiBfbXVzdF8gYmUgYXNzZXJ0ZWQuCisgICAqICAgICAgT25lIG9mIERDRCBvciBDVFMgbXVzdCBiZSBhc3NlcnRlZC4KKyAgICovCisKKyAgLyogTE1DIDEwMDAgKFNTSSkgTEVEIGRlZmluaXRpb25zCisgICAqIGxlZDAgR3JlZW4gPSBwb3dlciB0byBhZGFwdGVyLCBHYXRlIEFycmF5IGxvYWRlZCAmCisgICAqICAgICAgICAgICAgICBkcml2ZXIgYXR0YWNoZWQKKyAgICogbGVkMSBHcmVlbiA9IERTUiBhbmQgRFRSIGFuZCBSVFMgYW5kIENUUyBhcmUgc2V0CisgICAqIGxlZDIgR3JlZW4gPSBDYWJsZSBkZXRlY3RlZAorICAgKiBsZWQzIHJlZCAgID0gTm8gdGltaW5nIGlzIGF2YWlsYWJsZSBmcm9tIHRoZQorICAgKiAgICAgICAgICAgICAgY2FibGUgb3IgdGhlIG9uLWJvYXJkIGZyZXF1ZW5jeQorICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yLgorICAgKi8KKworICBsaW5rX3N0YXR1cyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KTsKKworICAvKiBJcyB0aGUgdHJhbnNtaXQgY2xvY2sgc3RpbGwgYXZhaWxhYmxlICovCisgIHRpY2tzID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX2dwX3RpbWVyKTsKKyAgdGlja3MgPSAweDAwMDBmZmZmIC0gKHRpY2tzICYgMHgwMDAwZmZmZik7CisKKyAgbG1jX2xlZF9vbiAoc2MsIExNQ19NSUkxNl9MRUQwKTsKKworICAvKiA9PT09PT0gdHJhbnNtaXQgY2xvY2sgZGV0ZXJtaW5hdGlvbiA9PT09PSAqLworICBpZiAoc2MtPmxtY190aW1pbmcgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UKSB7CisgICAgICBsbWNfbGVkX29mZihzYywgTE1DX01JSTE2X0xFRDMpOworICB9CisgIGVsc2UgaWYgKHRpY2tzID09IDAgKSB7CQkJCS8qIG5vIGNsb2NrIGZvdW5kID8gKi8KKyAgICAgIHJldCA9IDA7CisgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzNdICE9IDEpeworICAgICAgICAgIHNjLT5zdGF0cy50eF9sb3NzT2ZDbG9ja0NudCsrOworICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb3N0IENsb2NrLCBMaW5rIERvd25cbiIsIHNjLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIHNjLT5sYXN0X2xlZF9lcnJbM10gPSAxOworICAgICAgbG1jX2xlZF9vbiAoc2MsIExNQ19NSUkxNl9MRUQzKTsJLyogdHVybiBPTiByZWQgTEVEICovCisgIH0KKyAgZWxzZSB7CisgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzNdID09IDEpCisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENsb2NrIFJldHVybmVkXG4iLCBzYy0+bmFtZSk7CisgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMDsKKyAgICAgIGxtY19sZWRfb2ZmIChzYywgTE1DX01JSTE2X0xFRDMpOwkJLyogdHVybiBPRkYgcmVkIExFRCAqLworICB9CisKKyAgaWYgKChsaW5rX3N0YXR1cyAmIExNQ19NSUkxNl9TU0lfRFNSKSA9PSAwKSB7IC8qIEFsc28gSFNTSSBDQSAqLworICAgICAgcmV0ID0gMDsKKyAgICAgIGh3X2hkc2sgPSAwOworICB9CisKKyNpZmRlZiBDT05GSUdfTE1DX0lHTk9SRV9IQVJEV0FSRV9IQU5EU0hBS0UKKyAgaWYgKChsaW5rX3N0YXR1cyAmIChMTUNfTUlJMTZfU1NJX0NUUyB8IExNQ19NSUkxNl9TU0lfRENEKSkgPT0gMCl7CisgICAgICByZXQgPSAwOworICAgICAgaHdfaGRzayA9IDA7CisgIH0KKyNlbmRpZgorCisgIGlmKGh3X2hkc2sgPT0gMCl7CisgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDEpCisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERTUiBub3QgYXNzZXJ0ZWRcbiIsIHNjLT5uYW1lKTsKKyAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMV0gPSAxOworICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19NSUkxNl9MRUQxKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMV0gIT0gMCkKKyAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRFNSIG5vdyBhc3NlcnRlZFxuIiwgc2MtPm5hbWUpOworICAgICAgc2MtPmxhc3RfbGVkX2VyclsxXSA9IDA7CisgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfTUlJMTZfTEVEMSk7CisgIH0KKworICBpZihyZXQgPT0gMSkgeworICAgICAgbG1jX2xlZF9vbihzYywgTE1DX01JSTE2X0xFRDIpOyAvKiBPdmVyIGFsbCBnb29kIHN0YXR1cz8gKi8KKyAgfQorICAKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2xtY19zc2lfc2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgc3RhdGUpCit7CisgIGlmIChzdGF0ZSA9PSBMTUNfTElOS19VUCkKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IChMTUNfTUlJMTZfU1NJX0RUUiB8IExNQ19NSUkxNl9TU0lfUlRTKTsKKyAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogYXNzZXJ0aW5nIERUUiBhbmQgUlRTXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfihMTUNfTUlJMTZfU1NJX0RUUiB8IExNQ19NSUkxNl9TU0lfUlRTKTsKKyAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogZGVhc3NlcnRpbmcgRFRSIGFuZCBSVFNcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKK30KKworLyoKKyAqIDAgPT0gMTZiaXQsIDEgPT0gMzJiaXQKKyAqLworc3RhdGljIHZvaWQKK2xtY19zc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBzdGF0ZSkKK3sKKyAgaWYgKHN0YXRlID09IExNQ19DVExfQ1JDX0xFTkdUSF8zMikKKyAgICB7CisgICAgICAvKiAzMiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X1NTSV9DUkM7CisgICAgICBzYy0+aWN0bC5jcmNfbGVuZ3RoID0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyOworICAgICAgc2MtPmxtY19jcmNTaXplID0gTE1DX0NUTF9DUkNfQllURVNJWkVfNDsKKworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIDE2IGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X1NTSV9DUkM7CisgICAgICBzYy0+aWN0bC5jcmNfbGVuZ3RoID0gTE1DX0NUTF9DUkNfTEVOR1RIXzE2OworICAgICAgc2MtPmxtY19jcmNTaXplID0gTE1DX0NUTF9DUkNfQllURVNJWkVfMjsKKyAgICB9CisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSBiaXRzIHRvIHByb2dyYW0gdGhlIHNzaSBmcmVxdWVuY3kgZ2VuZXJhdG9yCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfYXY5MTEwX2JpdCAobG1jX3NvZnRjX3QgKiBzYywgaW50IGMpCit7CisgIC8qCisgICAqIHNldCB0aGUgZGF0YSBiaXQgYXMgd2UgbmVlZCBpdC4KKyAgICovCisgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfQ0xLKTsKKyAgaWYgKGMgJiAweDAxKQorICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7CisgIGVsc2UKKyAgICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX0RBVEEpOworICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgIC8qCisgICAqIHNldCB0aGUgY2xvY2sgdG8gaGlnaAorICAgKi8KKyAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfQ0xLOworICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgIC8qCisgICAqIHNldCB0aGUgY2xvY2sgdG8gbG93IGFnYWluLgorICAgKi8KKyAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9DTEspOworICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfYXY5MTEwIChsbWNfc29mdGNfdCAqIHNjLCB1X2ludDMyX3QgbiwgdV9pbnQzMl90IG0sIHVfaW50MzJfdCB2LAorCSAgICAgIHVfaW50MzJfdCB4LCB1X2ludDMyX3QgcikKK3sKKyAgaW50IGk7CisKKyNpZiAwCisgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogc3BlZWQgJXUsICVkICVkICVkICVkICVkXG4iLAorCSAgTE1DX1BSSU5URl9BUkdTLCBzYy0+aWN0bC5jbG9ja19yYXRlLCBuLCBtLCB2LCB4LCByKTsKKyNlbmRpZgorCisgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX1NTSV9HRU5FUkFUT1I7CisgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfREFUQSB8IExNQ19HRVBfQ0xLKTsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAvKgorICAgKiBTZXQgdGhlIFRYQ0xPQ0ssIEdFTkVSQVRPUiwgU0VSSUFMLCBhbmQgU0VSSUFMQ0xLCisgICAqIGFzIG91dHB1dHMuCisgICAqLworICBsbWNfZ3Bpb19ta291dHB1dCAoc2MsIChMTUNfR0VQX0RBVEEgfCBMTUNfR0VQX0NMSworCQkJICB8IExNQ19HRVBfU1NJX0dFTkVSQVRPUikpOworCisgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfU1NJX0dFTkVSQVRPUik7CisgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgLyoKKyAgICogYSBzaGlmdGluZyB3ZSB3aWxsIGdvLi4uCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCBuID4+IGkpOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCBtID4+IGkpOworICBmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCB2ID4+IGkpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCB4ID4+IGkpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCByID4+IGkpOworICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHdyaXRlX2F2OTExMF9iaXQgKHNjLCAweDE3ID4+IGkpOworCisgIC8qCisgICAqIHN0b3AgZHJpdmluZyBzZXJpYWwtcmVsYXRlZCBzaWduYWxzCisgICAqLworICBsbWNfZ3Bpb19ta2lucHV0IChzYywKKwkJICAgIChMTUNfR0VQX0RBVEEgfCBMTUNfR0VQX0NMSworCQkgICAgIHwgTE1DX0dFUF9TU0lfR0VORVJBVE9SKSk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICB1X2ludDE2X3QgbWlpMTc7CisgIHN0cnVjdCBzc2ljc3IyCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBkdHI6MSwgZHNyOjEsIHJ0czoxLCBjYWJsZTozLCBjcmM6MSwgbGVkMDoxLCBsZWQxOjEsCisgICAgICBsZWQyOjEsIGxlZDM6MSwgZmlmbzoxLCBsbDoxLCBybDoxLCB0bToxLCBsb29wOjE7CisgIH07CisgIHN0cnVjdCBzc2ljc3IyICpzc2ljc3I7CisgIG1paTE3ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTcpOworICBzc2ljc3IgPSAoc3RydWN0IHNzaWNzcjIgKikgJm1paTE3OworICBpZiAoc3NpY3NyLT5jYWJsZSA9PSA3KQorICAgIHsKKyAgICAgIGxtY19sZWRfb2ZmIChzYywgTE1DX01JSTE2X0xFRDIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxtY19sZWRfb24gKHNjLCBMTUNfTUlJMTZfTEVEMik7CisgICAgfQorCit9CisKKy8qCisgKiAgVDEgbWV0aG9kcworICovCisKKy8qCisgKiBUaGUgZnJhbWVyIHJlZ3MgYXJlIG11bHRpcGxleGVkIHRocm91Z2ggTUlJIHJlZ3MgMTcgJiAxOAorICogIHdyaXRlIHRoZSByZWdpc3RlciBhZGRyZXNzIHRvIE1JSSByZWcgMTcgYW5kIHRoZSAqICBkYXRhIHRvIE1JSSByZWcgMTguICovCitzdGF0aWMgdm9pZAorbG1jX3QxX3dyaXRlIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgYSwgaW50IGQpCit7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgYSk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgZCk7Cit9CisKKy8qIFNhdmUgYSB3YXJuaW5nCitzdGF0aWMgaW50CitsbWNfdDFfcmVhZCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGEpCit7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgYSk7CisgIHJldHVybiBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7Cit9CisqLworCisKK3N0YXRpYyB2b2lkCitsbWNfdDFfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgdV9pbnQxNl90IG1paTE2OworICBpbnQgaTsKKworICBzYy0+aWN0bC5jYXJkdHlwZSA9IExNQ19DVExfQ0FSRFRZUEVfTE1DMTIwMDsKKyAgbWlpMTYgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgLyogcmVzZXQgODM3MCAqLworICBtaWkxNiAmPSB+TE1DX01JSTE2X1QxX1JTVDsKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBtaWkxNiB8IExNQ19NSUkxNl9UMV9SU1QpOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIG1paTE2KTsKKworICAvKiBzZXQgVDEgb3IgRTEgbGluZS4gIFVzZXMgc2MtPmxtY21paTE2IHJlZyBpbiBmdW5jdGlvbiBzbyB1cGRhdGUgaXQgKi8KKyAgc2MtPmxtY19taWlyZWcxNiA9IG1paTE2OworICBsbWNfdDFfc2V0X2NpcmN1aXRfdHlwZShzYywgTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEpOworICBtaWkxNiA9IHNjLT5sbWNfbWlpcmVnMTY7CisKKyAgbG1jX3QxX3dyaXRlIChzYywgMHgwMSwgMHgxQik7CS8qIENSMCAgICAgLSBwcmltYXJ5IGNvbnRyb2wgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgwMiwgMHg0Mik7CS8qIEpBVF9DUiAgLSBqaXR0ZXIgYXR0ZW4gY29uZmlnICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgxNCwgMHgwMCk7CS8qIExPT1AgICAgLSBsb29wYmFjayBjb25maWcgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgxNSwgMHgwMCk7CS8qIERMM19UUyAgLSBleHRlcm5hbCBkYXRhIGxpbmsgdGltZXNsb3QgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgxOCwgMHhGRik7CS8qIFBJTyAgICAgLSBwcm9ncmFtbWFibGUgSS9PICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgxOSwgMHgzMCk7CS8qIFBPRSAgICAgLSBwcm9ncmFtbWFibGUgT0UgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgxQSwgMHgwRik7CS8qIENNVVggICAgLSBjbG9jayBpbnB1dCBtdXggICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgyMCwgMHg0MSk7CS8qIExJVV9DUiAgLSBSWCBMSVUgY29uZmlnICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHgyMiwgMHg3Nik7CS8qIFJMSVVfQ1IgLSBSWCBMSVUgY29uZmlnICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg0MCwgMHgwMyk7CS8qIFJDUjAgICAgLSBSWCBjb25maWcgICAgICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg0NSwgMHgwMCk7CS8qIFJBTE0gICAgLSBSWCBhbGFybSBjb25maWcgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg0NiwgMHgwNSk7CS8qIExBVENIICAgLSBSWCBhbGFybS9lcnIvY250ciBsYXRjaCAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg2OCwgMHg0MCk7CS8qIFRMSVVfQ1IgLSBUWCBMSVUgY29uZmlnICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3MCwgMHgwRCk7CS8qIFRDUjAgICAgLSBUWCBmcmFtZXIgY29uZmlnICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3MSwgMHgwNSk7CS8qIFRDUjEgICAgLSBUWCBjb25maWcgICAgICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3MiwgMHgwQik7CS8qIFRGUk0gICAgLSBUWCBmcmFtZSBmb3JtYXQgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3MywgMHgwMCk7CS8qIFRFUlJPUiAgLSBUWCBlcnJvciBpbnNlcnQgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3NCwgMHgwMCk7CS8qIFRNQU4gICAgLSBUWCBtYW51YWwgU2EvRkVCRSBjb25maWcgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3NSwgMHgwMCk7CS8qIFRBTE0gICAgLSBUWCBhbGFybSBzaWduYWwgY29uZmlnICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3NiwgMHgwMCk7CS8qIFRQQVRUICAgLSBUWCB0ZXN0IHBhdHRlcm4gY29uZmlnICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg3NywgMHgwMCk7CS8qIFRMQiAgICAgLSBUWCBpbmJhbmQgbG9vcGJhY2sgY29uZmlnICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg5MCwgMHgwNSk7CS8qIENMQURfQ1IgLSBjbG9jayByYXRlIGFkYXB0ZXIgY29uZmlnICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHg5MSwgMHgwNSk7CS8qIENTRUwgICAgLSBjbGFkIGZyZXEgc2VsICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHhBNiwgMHgwMCk7CS8qIERMMV9DVEwgLSBETDEgY29udHJvbCAgICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHhCMSwgMHgwMCk7CS8qIERMMl9DVEwgLSBETDIgY29udHJvbCAgICAgICAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHhEMCwgMHg0Nyk7CS8qIFNCSV9DUiAgLSBzeXMgYnVzIGlmYWNlIGNvbmZpZyAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHhEMSwgMHg3MCk7CS8qIFJTQl9DUiAgLSBSWCBzeXMgYnVzIGNvbmZpZyAgICAgICAgICAgKi8KKyAgbG1jX3QxX3dyaXRlIChzYywgMHhENCwgMHgzMCk7CS8qIFRTQl9DUiAgLSBUWCBzeXMgYnVzIGNvbmZpZyAgICAgICAgICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgeworICAgICAgbG1jX3QxX3dyaXRlIChzYywgMHgwRTAgKyBpLCAweDAwKTsJLyogU0JDbiAtIHN5cyBidXMgcGVyLWNoYW5uZWwgY3RsICAgICovCisgICAgICBsbWNfdDFfd3JpdGUgKHNjLCAweDEwMCArIGksIDB4MDApOwkvKiBUUENuIC0gVFggcGVyLWNoYW5uZWwgY3RsICAgICAgICAgKi8KKyAgICAgIGxtY190MV93cml0ZSAoc2MsIDB4MTgwICsgaSwgMHgwMCk7CS8qIFJQQ24gLSBSWCBwZXItY2hhbm5lbCBjdGwgICAgICAgICAqLworICAgIH0KKyAgZm9yIChpID0gMTsgaSA8IDI1OyBpKyspCisgICAgeworICAgICAgbG1jX3QxX3dyaXRlIChzYywgMHgwRTAgKyBpLCAweDBEKTsJLyogU0JDbiAtIHN5cyBidXMgcGVyLWNoYW5uZWwgY3RsICAgICovCisgICAgfQorCisgIG1paTE2IHw9IExNQ19NSUkxNl9UMV9YT0U7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgbWlpMTYpOworICBzYy0+bG1jX21paXJlZzE2ID0gbWlpMTY7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfdDFfZGVmYXVsdCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgc2MtPmxtY19taWlyZWcxNiA9IExNQ19NSUkxNl9MRURfQUxMOworICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19ET1dOKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2NpcmN1aXRfdHlwZSAoc2MsIExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2NyY19sZW5ndGggKHNjLCBMTUNfQ1RMX0NSQ19MRU5HVEhfMTYpOworICAvKiBSaWdodCBub3cgd2UgY2FuIG9ubHkgY2xvY2sgZnJvbSBvdXQgaW50ZXJuYWwgc291cmNlICovCisgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVDsKK30KKy8qICogR2l2ZW4gYSB1c2VyIHByb3ZpZGVkIHN0YXRlLCBzZXQgb3Vyc2VsdmVzIHVwIHRvIG1hdGNoIGl0LiAgVGhpcyB3aWxsICogYWx3YXlzIHJlc2V0IHRoZSBjYXJkIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2xtY190MV9zZXRfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBjdGwpCit7CisgIGlmIChjdGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2lyY3VpdF90eXBlIChzYywgc2MtPmljdGwuY2lyY3VpdF90eXBlKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgLyoKKyAgICogY2hlY2sgZm9yIGNoYW5nZSBpbiBjaXJjdWl0IHR5cGUgICAgICAgICAqLworICBpZiAoY3RsLT5jaXJjdWl0X3R5cGUgPT0gTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEKKyAgICAgICYmIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9PQorICAgICAgTE1DX0NUTF9DSVJDVUlUX1RZUEVfRTEpIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUgKHNjLAorCQkJCQkJCQlMTUNfQ1RMX0NJUkNVSVRfVFlQRV9FMSk7CisgIGVsc2UgaWYgKGN0bC0+Y2lyY3VpdF90eXBlID09IExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxCisJICAgJiYgc2MtPmljdGwuY2lyY3VpdF90eXBlID09IExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxKQorICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUgKHNjLCBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSk7CisgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBjdGwpOworfQorLyoKKyAqIHJldHVybiBoYXJkd2FyZSBsaW5rIHN0YXR1cy4KKyAqIDAgPT0gbGluayBpcyBkb3duLCAxID09IGxpbmsgaXMgdXAuCisgKi8gc3RhdGljIGludAorbG1jX3QxX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgICB1X2ludDE2X3QgbGlua19zdGF0dXM7CisgICAgaW50IHJldCA9IDE7CisKKyAgLyogTE1DNTI0NSAoRFMzKSAmIExNQzEyMDAgKERTMSkgTEVEIGRlZmluaXRpb25zCisgICAqIGxlZDAgeWVsbG93ID0gZmFyLWVuZCBhZGFwdGVyIGlzIGluIFJlZCBhbGFybSBjb25kaXRpb24KKyAgICogbGVkMSBibHVlICAgPSByZWNlaXZlZCBhbiBBbGFybSBJbmRpY2F0aW9uIHNpZ25hbAorICAgKiAgICAgICAgICAgICAgICh1cHN0cmVhbSBmYWlsdXJlKQorICAgKiBsZWQyIEdyZWVuICA9IHBvd2VyIHRvIGFkYXB0ZXIsIEdhdGUgQXJyYXkgbG9hZGVkICYgZHJpdmVyCisgICAqICAgICAgICAgICAgICAgYXR0YWNoZWQKKyAgICogbGVkMyByZWQgICAgPSBMb3NzIG9mIFNpZ25hbCAoTE9TKSBvciBvdXQgb2YgZnJhbWUgKE9PRikKKyAgICogICAgICAgICAgICAgICBjb25kaXRpb25zIGRldGVjdGVkIG9uIFQzIHJlY2VpdmUgc2lnbmFsCisgICAqLworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY190MV9nZXRfbGlua19zdGF0dXMgaW4iKTsKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDIpOworCisgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9BTEFSTTFfU1RBVFVTKTsKKyAgICBsaW5rX3N0YXR1cyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKworCisgICAgaWYgKGxpbmtfc3RhdHVzICYgVDFGX1JBSVMpIHsJCQkvKiB0dXJuIG9uIGJsdWUgTEVEICovCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMV0gIT0gMSl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBBSVMvQmx1ZSBBbGFybS4gRmFyIGVuZCBpbiBSRUQgYWxhcm1cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMV0gIT0gMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRW5kIEFJUy9CbHVlIEFsYXJtXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG1jX2xlZF9vZmYgKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFllbGxvdyBBbGFybSBpcyBuYXN0eSBldmlsIHN0dWZmLCBsb29rcyBhdCBkYXRhIHBhdHRlcm5zCisgICAgICogaW5zaWRlIHRoZSBjaGFubmVsIGFuZCBjb25mdXNlcyBpdCB3aXRoIEhETEMgZnJhbWluZworICAgICAqIGlnbm9yZSBhbGwgeWVsbG93IGFsYXJtcy4KKyAgICAgKgorICAgICAqIERvIGxpc3RlbiB0byBNdWx0aUZyYW1lIFllbGxvdyBhbGFybSB3aGljaCB3aGlsZSBpbXBsZW1lbnRlZAorICAgICAqIGRpZmZlcmVudCB3YXlzIGlzbid0IGluIHRoZSBjaGFubmVsIGFuZCBoZW5jZSBzb21ld2hhdAorICAgICAqIG1vcmUgcmVsaWFibGUKKyAgICAgKi8KKworICAgIGlmIChsaW5rX3N0YXR1cyAmIFQxRl9STVlFTCkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzBdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgWWVsbG93IEFJUyBBbGFybVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMCk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMF0gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclswXSAhPSAwKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFbmQgb2YgWWVsbG93IEFJUyBBbGFybVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExvc3Mgb2Ygc2lnbmFsIGFuZCBsb3Mgb2YgZnJhbWUKKyAgICAgKiBVc2UgdGhlIGdyZWVuIGJpdCB0byBpZGVudGlmeSB3aGljaCBvbmUgbGl0IHRoZSBsZWQKKyAgICAgKi8KKyAgICBpZihsaW5rX3N0YXR1cyAmIFQxRl9STE9GKXsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb2NhbCBSZWQgQWxhcm06IExvc3Mgb2YgRnJhbWluZ1xuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMyk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbM10gPSAxOworCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzNdICE9IDApeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVuZCBSZWQgQWxhcm0gKExPRilcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiggISAobGlua19zdGF0dXMgJiBUMUZfUkxPUykpCisgICAgICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclszXSA9IDA7CisgICAgfQorICAgIAorICAgIGlmKGxpbmtfc3RhdHVzICYgVDFGX1JMT1MpeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzJdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExvY2FsIFJlZCBBbGFybTogTG9zcyBvZiBTaWduYWxcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzJdID0gMTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsyXSAhPSAwKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFbmQgUmVkIEFsYXJtIChMT1MpXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgKGxpbmtfc3RhdHVzICYgVDFGX1JMT0YpKQorICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMyk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMl0gPSAwOworICAgIH0KKworICAgIHNjLT5sbWNfeGluZm8udDFfYWxhcm0xX3N0YXR1cyA9IGxpbmtfc3RhdHVzOworCisgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9BTEFSTTJfU1RBVFVTKTsKKyAgICBzYy0+bG1jX3hpbmZvLnQxX2FsYXJtMl9zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisKKyAgICAKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzIG91dCIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIDEgPT0gVDEgQ2lyY3VpdCBUeXBlICwgMCA9PSBFMSBDaXJjdWl0IFR5cGUKKyAqLworc3RhdGljIHZvaWQKK2xtY190MV9zZXRfY2lyY3VpdF90eXBlIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSkgeworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfVDFfWjsKKyAgICAgIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9IExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxOworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluIFQxIE1vZGVcbiIsIHNjLT5uYW1lKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9UMV9aOworICAgICAgc2MtPmljdGwuY2lyY3VpdF90eXBlID0gTE1DX0NUTF9DSVJDVUlUX1RZUEVfRTE7CisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogSW4gRTEgTW9kZVxuIiwgc2MtPm5hbWUpOworICB9CisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKyAgCit9CisKKy8qCisgKiAwID09IDE2Yml0LCAxID09IDMyYml0ICovCitzdGF0aWMgdm9pZAorbG1jX3QxX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgc3RhdGUpCit7CisgIGlmIChzdGF0ZSA9PSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIpCisgICAgeworICAgICAgLyogMzIgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9UMV9DUkM7CisgICAgICBzYy0+aWN0bC5jcmNfbGVuZ3RoID0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyOworICAgICAgc2MtPmxtY19jcmNTaXplID0gTE1DX0NUTF9DUkNfQllURVNJWkVfNDsKKworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIDE2IGJpdCAqLyBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfVDFfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8xNjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzI7CisKKyAgICB9CisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKK30KKworLyoKKyAqIDEgPT0gaW50ZXJuYWwsIDAgPT0gZXh0ZXJuYWwKKyAqLworc3RhdGljIHZvaWQKK2xtY190MV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBpZSkKK3sKKyAgaW50IG9sZDsKKyAgb2xkID0gaWU7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpCisgICAgeworICAgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9TU0lfVFhDTE9DSyk7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgICAgaWYob2xkICE9IGllKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGV4dGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX1NTSV9UWENMT0NLOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVDsKKyAgICAgIGlmKG9sZCAhPSBpZSkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBpbnRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfdDFfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc2V0X3Byb3RvY29sIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBjdGwpCit7CisgIGlmIChjdGwgPT0gMCkKKyAgICB7CisgICAgICBzYy0+aWN0bC5rZWVwYWxpdmVfb25vZmYgPSBMTUNfQ1RMX09OOworCisgICAgICByZXR1cm47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWVkaWEuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYzAwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfTE1DX01FRElBX0hfCisjZGVmaW5lIF9MTUNfTUVESUFfSF8KKworbG1jX21lZGlhX3QgbG1jX2RzM19tZWRpYSA9IHsKKyAgbG1jX2RzM19pbml0LAkJCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfZHMzX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19kczNfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHMzX3NldF8xMDBmdCwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2RzM19zZXRfc2NyYW0sCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19kczNfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kczNfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX2RzM193YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX2hzc2lfbWVkaWEgPSB7CisgIGxtY19oc3NpX2luaXQsCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2hzc2lfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX2hzc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfaHNzaV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX2hzc2lfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2hzc2lfc2V0X2xpbmtfc3RhdHVzLAkvKiBzZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2hzc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX2hzc2lfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19zc2lfbWVkaWEgPSB7IGxtY19zc2lfaW5pdCwJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19zc2lfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX3NzaV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY19zc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfc3NpX3NldF9zcGVlZCwJCS8qIHNldCBsaW5lIHNwZWVkICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2xpbmtfc3RhdHVzLAkvKiBzZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX3NzaV9zZXRfY3JjX2xlbmd0aCwJLyogc2V0IENSQyBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IFQxIG9yIEUxIGNpcmN1aXQgdHlwZSAqLworICBsbWNfc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfdDFfbWVkaWEgPSB7CisgIGxtY190MV9pbml0LAkJCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfdDFfZGVmYXVsdCwJCS8qIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgbG1jX3QxX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX3QxX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX2R1bW15X3NldDJfMSwJCS8qIHNldCBsaW5lIHNwZWVkICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBjYWJsZSBsZW5ndGggKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzLAkvKiBnZXQgbGluayBzdGF0dXMgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY190MV9zZXRfY3JjX2xlbmd0aCwJLyogc2V0IENSQyBsZW5ndGggKi8KKyAgbG1jX3QxX3NldF9jaXJjdWl0X3R5cGUsCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3QxX3dhdGNoZG9nCit9OworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90LmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMWRmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3QuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9MTUNfUFJPVE9fSF8KKyNkZWZpbmUgX0xNQ19QUk9UT19IXworCit2b2lkIGxtY19wcm90b19pbml0KGxtY19zb2Z0Y190ICogY29uc3QpCit2b2lkIGxtY19wcm90b19hdHRhY2gobG1jX3NvZnRjX3QgKnNjIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fZGV0YWNoKGxtY19zb2Z0YyAqc2MgY29uc3QpCit2b2lkIGxtY19wcm90b19yZW9wZW4obG1jX3NvZnRjX3QgKnNjIGNvbnN0KQoraW50IGxtY19wcm90b19pb2N0bChsbWNfc29mdGNfdCAqc2MgY29uc3QsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQordm9pZCBsbWNfcHJvdG9fb3BlbihsbWNfc29mdGNfdCAqc2MgY29uc3QpCit2b2lkIGxtY19wcm90b19jbG9zZShsbWNfc29mdGNfdCAqc2MgY29uc3QpCit1bnNpZ25lZCBzaG9ydCBsbWNfcHJvdG9fdHlwZShsbWNfc29mdGNfdCAqc2MgY29uc3QsIHN0cnVjdCBza2J1ZmYgKnNrYikKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdG8uYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4NzZjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmMKQEAgLTAsMCArMSwyNDkgQEAKKyAvKgorICAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIExBTiBNZWRpYSBDb3Jwb3JhdGlvbiAoTE1DKQorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICB3d3cubGFubWVkaWEuY29tCisgICoKKyAgKiBUaGlzIGNvZGUgaXMgd3JpdHRlbiBieToKKyAgKiBBbmRyZXcgU3RhbmxleS1Kb25lcyAoYXNqQGNiYW4uY29tKQorICAqIFJvYiBCcmF1biAoYmJyYXVuQHZpeC5jb20pLAorICAqIE1pY2hhZWwgR3JhZmYgKGV4cGxvcmVyQHZpeC5jb20pIGFuZAorICAqIE1hdHQgVGhvbWFzIChtYXR0QDNhbS1zb2Z0d2FyZS5jb20pLgorICAqCisgICogV2l0aCBIZWxwIEJ5OgorICAqIERhdmlkIEJvZ2dzCisgICogUm9uIENyYW5lCisgICogQWxsYW4gQ294CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICoKKyAgKiBEcml2ZXIgZm9yIHRoZSBMYW5NZWRpYSBMTUM1MjAwLCBMTUM1MjQ1LCBMTUMxMDAwLCBMTUMxMjAwIGNhcmRzLgorICAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+ICAgICAgICAgICAgIC8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSAibG1jLmgiCisjaW5jbHVkZSAibG1jX3Zhci5oIgorI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorI2luY2x1ZGUgImxtY19pb2N0bC5oIgorI2luY2x1ZGUgImxtY19wcm90by5oIgorCisvKgorICogVGhlIGNvbXBpbGUtdGltZSB2YXJpYWJsZSBTUFBQU1RVUCBjYXVzZXMgdGhlIG1vZHVsZSB0byBiZQorICogY29tcGlsZWQgd2l0aG91dCByZWZlcmVuY2luZyBhbnkgb2YgdGhlIHN5bmMgcHBwIHJvdXRpbmVzLgorICovCisjaWZkZWYgU1BQUFNUVUIKKyNkZWZpbmUgU1BQUF9kZXRhY2goZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX29wZW4oZCkJMAorI2RlZmluZSBTUFBQX3Jlb3BlbihkKQkodm9pZCkwCisjZGVmaW5lIFNQUFBfY2xvc2UoZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX2F0dGFjaChkKQkodm9pZCkwCisjZGVmaW5lIFNQUFBfZG9faW9jdGwoZCxpLGMpCS1FT1BOT1RTVVBQCisjZWxzZQorI2RlZmluZSBTUFBQX2F0dGFjaCh4KQlzcHBwX2F0dGFjaCgoeCktPnBkKQorI2RlZmluZSBTUFBQX2RldGFjaCh4KQlzcHBwX2RldGFjaCgoeCktPnBkLT5kZXYpCisjZGVmaW5lIFNQUFBfb3Blbih4KQlzcHBwX29wZW4oKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX3Jlb3Blbih4KQlzcHBwX3Jlb3BlbigoeCktPnBkLT5kZXYpCisjZGVmaW5lIFNQUFBfY2xvc2UoeCkJc3BwcF9jbG9zZSgoeCktPnBkLT5kZXYpCisjZGVmaW5lIFNQUFBfZG9faW9jdGwoeCwgeSwgeikJc3BwcF9kb19pb2N0bCgoeCktPnBkLT5kZXYsICh5KSwgKHopKQorI2VuZGlmCisKKy8vIGluaXQKK3ZvaWQgbG1jX3Byb3RvX2luaXQobG1jX3NvZnRjX3QgKnNjKSAvKkZPTEQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2luaXQgaW4iKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgc2MtPnBkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBwcF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjLT5wZCkgeworCQlwcmludGsoImxtY19wcm90b19pbml0KCk6IGttYWxsb2MgZmFpbHVyZSFcbiIpOworCQlyZXR1cm47CisJfQorICAgICAgICBzYy0+cGQtPmRldiA9IHNjLT5sbWNfZGV2aWNlOworICAgICAgICBzYy0+aWZfcHRyID0gc2MtPnBkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9faW5pdCBvdXQiKTsKK30KKworLy8gYXR0YWNoCit2b2lkIGxtY19wcm90b19hdHRhY2gobG1jX3NvZnRjX3QgKnNjKSAvKkZPTEQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2F0dGFjaCBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2MtPmxtY19kZXZpY2U7CisgICAgICAgICAgICBTUFBQX2F0dGFjaChzYyk7CisgICAgICAgICAgICBkZXYtPmRvX2lvY3RsID0gbG1jX2lvY3RsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX05FVDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNjLT5sbWNfZGV2aWNlOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZXkgc2V0IGEgZmV3IGJhc2ljcyBiZWNhdXNlIHRoZXkgZG9uJ3QgdXNlIHN5bmNfcHBwCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOworICAgICAgICAgICAgZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisgICAgICAgICAgICBkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7CisgICAgICAgICAgICBkZXYtPmFkZHJfbGVuID0gMDsKKyAgICAgICAgfQorICAgIGNhc2UgTE1DX1JBVzogLyogU2V0dXAgdGhlIHRhc2sgcXVldWUsIG1heWJlIHdlIHNob3VsZCBub3RpZnkgc29tZW9uZT8gKi8KKyAgICAgICAgeworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19hdHRhY2ggb3V0Iik7Cit9CisKKy8vIGRldGFjaAordm9pZCBsbWNfcHJvdG9fZGV0YWNoKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICBTUFBQX2RldGFjaChzYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX1JBVzogLyogVGVsbCBzb21lb25lIHdlJ3JlIGRldGFjaGluZz8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKKy8vIHJlb3Blbgordm9pZCBsbWNfcHJvdG9fcmVvcGVuKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19yZW9wZW4gaW4iKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgU1BQUF9yZW9wZW4oc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6IC8qIFJlc2V0IHRoZSBpbnRlcmZhY2UgYWZ0ZXIgYmVpbmcgZG93biwgcHJlcmFwZSB0byByZWNlaXZlIHBhY2tldHMgYWdhaW4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19yZW9wZW4gb3V0Iik7Cit9CisKKworLy8gaW9jdGwKK2ludCBsbWNfcHJvdG9faW9jdGwobG1jX3NvZnRjX3QgKnNjLCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19pb2N0bCBvdXQiKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgcmV0dXJuIFNQUFBfZG9faW9jdGwgKHNjLCBpZnIsIGNtZCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19pb2N0bCBvdXQiKTsKK30KKworLy8gb3Blbgordm9pZCBsbWNfcHJvdG9fb3BlbihsbWNfc29mdGNfdCAqc2MpIC8qRk9MRDAwKi8KK3sKKyAgICBpbnQgcmV0OworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX29wZW4gaW4iKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgcmV0ID0gU1BQUF9vcGVuKHNjKTsKKyAgICAgICAgaWYocmV0IDwgMCkKKyAgICAgICAgICAgIHByaW50aygiJXM6IHN5bmNQUFAgb3BlbiBmYWlsZWQ6ICVkXG4iLCBzYy0+bmFtZSwgcmV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBXZSdyZSBhYm91dCB0byBzdGFydCBnZXR0aW5nIHBhY2tldHMhICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fb3BlbiBvdXQiKTsKK30KKworLy8gY2xvc2UKKwordm9pZCBsbWNfcHJvdG9fY2xvc2UobG1jX3NvZnRjX3QgKnNjKSAvKkZPTEQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2Nsb3NlIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIFNQUFBfY2xvc2Uoc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6IC8qIEludGVyZmFjZSBnb2luZyBkb3duICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fY2xvc2Ugb3V0Iik7Cit9CisKK3Vuc2lnbmVkIHNob3J0IGxtY19wcm90b190eXBlKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b190eXBlIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHJldHVybiBodG9ucyhFVEhfUF9XQU5fUFBQKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfTkVUOgorICAgICAgICByZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6IC8qIFBhY2tldCB0eXBlIGZvciBza2J1ZmYga2luZCBvZiB1c2VsZXNzICovCisgICAgICAgIHJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBwcm90b2NvbCBzZXQgZm9yIHRoaXMgaW50ZXJmYWNlLCBhc3N1bWluZyA4MDIuMiAod2hpY2ggaXMgd3JvbmchISlcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b190eWUgb3V0Iik7CisKK30KKwordm9pZCBsbWNfcHJvdG9fbmV0aWYobG1jX3NvZnRjX3QgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAvKkZPTEQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX25ldGlmIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgY2FzZSBMTUNfTkVUOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICAgICAgbmV0aWZfcngoc2tiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX25ldGlmIG91dCIpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90by5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBhNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdG8uaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MTUNfUFJPVE9fSF8KKyNkZWZpbmUgX0xNQ19QUk9UT19IXworCit2b2lkIGxtY19wcm90b19pbml0KGxtY19zb2Z0Y190ICpzYyk7Cit2b2lkIGxtY19wcm90b19hdHRhY2gobG1jX3NvZnRjX3QgKnNjKTsKK3ZvaWQgbG1jX3Byb3RvX2RldGFjaChsbWNfc29mdGNfdCAqc2MpOwordm9pZCBsbWNfcHJvdG9fcmVvcGVuKGxtY19zb2Z0Y190ICpzYyk7CitpbnQgbG1jX3Byb3RvX2lvY3RsKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwordm9pZCBsbWNfcHJvdG9fb3BlbihsbWNfc29mdGNfdCAqc2MpOwordm9pZCBsbWNfcHJvdG9fY2xvc2UobG1jX3NvZnRjX3QgKnNjKTsKK3Vuc2lnbmVkIHNob3J0IGxtY19wcm90b190eXBlKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIGxtY19wcm90b19uZXRpZihsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGxtY19za2JfcmF3cGFja2V0cyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgdW51c2VkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Zhci5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwMDNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Zhci5oCkBAIC0wLDAgKzEsNTcwIEBACisjaWZuZGVmIF9MTUNfVkFSX0hfCisjZGVmaW5lIF9MTUNfVkFSX0hfCisKKy8qICRJZDogbG1jX3Zhci5oLHYgMS4xNyAyMDAwLzA0LzA2IDEyOjE2OjQ3IGFzaiBFeHAgJCAqLworCisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpZm5kZWYgX19LRVJORUxfXwordHlwZWRlZiBzaWduZWQgY2hhciBzODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CisKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7CisKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisKKyNkZWZpbmUgQklUU19QRVJfTE9ORyAzMiAKKworI2VuZGlmCisKKy8qCisgKiBiYXNpYyBkZWZpbml0aW9ucyB1c2VkIGluIGxtYyBpbmNsdWRlIGZpbGVzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbG1jX19fc29mdGMgbG1jX3NvZnRjX3Q7Cit0eXBlZGVmIHN0cnVjdCBsbWNfX19tZWRpYSBsbWNfbWVkaWFfdDsKK3R5cGVkZWYgc3RydWN0IGxtY19fX2N0bCBsbWNfY3RsX3Q7CisKKyNkZWZpbmUgbG1jX2NzcnB0cl90ICAgIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgdV9pbnQxNl90CXUxNgorI2RlZmluZSB1X2ludDhfdAl1OAorI2RlZmluZSB0dWxpcF91aW50MzJfdAl1MzIKKworI2RlZmluZSBMTUNfUkVHX1JBTkdFIDB4ODAKKworI2RlZmluZSBMTUNfUFJJTlRGX0ZNVCAgIiVzIgorI2RlZmluZSBMTUNfUFJJTlRGX0FSR1MJKHNjLT5sbWNfZGV2aWNlLT5uYW1lKQorCisjZGVmaW5lIFRYX1RJTUVPVVQgKDIqSFopCisKKyNkZWZpbmUgTE1DX1RYREVTQ1MgICAgICAgICAgICAzMgorI2RlZmluZSBMTUNfUlhERVNDUyAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTE1DX0xJTktfVVAgICAgICAgICAgICAxCisjZGVmaW5lIExNQ19MSU5LX0RPV04gICAgICAgICAgMAorCisvKiBUaGVzZSBtYWNyb3MgZm9yIGdlbmVyaWMgcmVhZCBhbmQgd3JpdGUgdG8gYW5kIGZyb20gdGhlIGRlYyBjaGlwICovCisjZGVmaW5lIExNQ19DU1JfUkVBRChzYywgY3NyKSBcCisJaW5sKChzYyktPmxtY19jc3JzLmNzcikKKyNkZWZpbmUgTE1DX0NTUl9XUklURShzYywgcmVnLCB2YWwpIFwKKwlvdXRsKCh2YWwpLCAoc2MpLT5sbWNfY3Nycy5yZWcpCisKKy8vI2lmZGVmIF9MSU5VWF9ERUxBWV9ICisvLwkjZGVmaW5lIFNMT1dfRE9XTl9JTyB1ZGVsYXkoMik7CisvLwkjdW5kZWYgX19TTE9XX0RPV05fSU8KKy8vCSNkZWZpbmUgX19TTE9XX0RPV05fSU8gdWRlbGF5KDIpOworLy8jZW5kaWYKKworI2RlZmluZSBERUxBWShuKSBTTE9XX0RPV05fSU8KKworI2RlZmluZSBsbWNfZGVsYXkoKSBpbmwoc2MtPmxtY19jc3JzLmNzcl85KQorCisvKiBUaGlzIG1hY3JvIHN5bmMncyB1cCB3aXRoIHRoZSBtaWkgc28gdGhhdCByZWFkcyBhbmQgd3JpdGVzIGNhbiB0YWtlIHBsYWNlICovCisjZGVmaW5lIExNQ19NSUlfU1lOQyhzYykgZG8ge2ludCBuPTMyOyB3aGlsZSggbiA+PSAwICkgeyBcCisgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURSgoc2MpLCBjc3JfOSwgMHgyMDAwMCk7IFwKKwkJbG1jX2RlbGF5KCk7IFwKKwkJTE1DX0NTUl9XUklURSgoc2MpLCBjc3JfOSwgMHgzMDAwMCk7IFwKKyAgICAgICAgICAgICAgICBsbWNfZGVsYXkoKTsgXAorCQluLS07IH19IHdoaWxlKDApCisKK3N0cnVjdCBsbWNfcmVnZmlsZV90IHsKKyAgICBsbWNfY3NycHRyX3QgY3NyX2J1c21vZGU7ICAgICAgICAgICAgICAgICAgLyogQ1NSMCAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfdHhwb2xsOyAgICAgICAgICAgICAgICAgICAvKiBDU1IxICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9yeHBvbGw7ICAgICAgICAgICAgICAgICAgIC8qIENTUjIgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX3J4bGlzdDsgICAgICAgICAgICAgICAgICAgLyogQ1NSMyAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfdHhsaXN0OyAgICAgICAgICAgICAgICAgICAvKiBDU1I0ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9zdGF0dXM7ICAgICAgICAgICAgICAgICAgIC8qIENTUjUgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX2NvbW1hbmQ7ICAgICAgICAgICAgICAgICAgLyogQ1NSNiAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfaW50cjsgICAgICAgICAgICAgICAgICAgICAvKiBDU1I3ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9taXNzZWRfZnJhbWVzOyAgICAgICAgICAgIC8qIENTUjggKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSOSAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxMCAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxMSAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxMiAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxMyAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxNCAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDU1IxNSAqLworfTsKKworI2RlZmluZSBjc3JfZW5ldHJvbSAgICAgICAgICAgICBjc3JfOSAgIC8qIDIxMDQwICovCisjZGVmaW5lIGNzcl9yZXNlcnZlZCAgICAgICAgICAgIGNzcl8xMCAgLyogMjEwNDAgKi8KKyNkZWZpbmUgY3NyX2Z1bGxfZHVwbGV4ICAgICAgICAgY3NyXzExICAvKiAyMTA0MCAqLworI2RlZmluZSBjc3JfYm9vdHJvbSAgICAgICAgICAgICBjc3JfMTAgIC8qIDIxMDQxLzIxMTQwQS8/PyAqLworI2RlZmluZSBjc3JfZ3AgICAgICAgICAgICAgICAgICBjc3JfMTIgIC8qIDIxMTQwKiAqLworI2RlZmluZSBjc3Jfd2F0Y2hkb2cgICAgICAgICAgICBjc3JfMTUgIC8qIDIxMTQwKiAqLworI2RlZmluZSBjc3JfZ3BfdGltZXIgICAgICAgICAgICBjc3JfMTEgIC8qIDIxMDQxLzIxMTQwKiAqLworI2RlZmluZSBjc3Jfc3JvbV9taWkgICAgICAgICAgICBjc3JfOSAgIC8qIDIxMDQxLzIxMTQwKiAqLworI2RlZmluZSBjc3Jfc2lhX3N0YXR1cyAgICAgICAgICBjc3JfMTIgIC8qIDIxMDR4ICovCisjZGVmaW5lIGNzcl9zaWFfY29ubmVjdGl2aXR5ICAgIGNzcl8xMyAgLyogMjEwNHggKi8KKyNkZWZpbmUgY3NyX3NpYV90eF9yeCAgICAgICAgICAgY3NyXzE0ICAvKiAyMTA0eCAqLworI2RlZmluZSBjc3Jfc2lhX2dlbmVyYWwgICAgICAgICBjc3JfMTUgIC8qIDIxMDR4ICovCisKKy8qIHR1bGlwIGxlbmd0aC9jb250cm9sIHRyYW5zbWl0IGRlc2NyaXB0b3IgZGVmaW5pdGlvbnMKKyAqICB1c2VkIHRvIGRlZmluZSBiaXRzIGluIHRoZSBzZWNvbmQgdHVsaXBfZGVzY190IGZpZWxkIChsZW5ndGgpCisgKiAgZm9yIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIC1iYXogKi8KKworI2RlZmluZSBMTUNfVERFU19GSVJTVF9CVUZGRVJfU0laRSAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDdGRikpCisjZGVmaW5lIExNQ19UREVTX1NFQ09ORF9CVUZGRVJfU0laRSAgICAgICgodV9pbnQzMl90KSgweDAwM0ZGODAwKSkKKyNkZWZpbmUgTE1DX1RERVNfSEFTSF9GSUxURVJJTkcgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDA0MDAwMDApKQorI2RlZmluZSBMTUNfVERFU19ESVNBQkxFX1BBRERJTkcgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDgwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX1NFQ09ORF9BRERSX0NIQUlORUQgICAgICgodV9pbnQzMl90KSgweDAxMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfRU5EX09GX1JJTkcgICAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDIwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19BRERfQ1JDX0RJU0FCTEUgICAgICAgICAoKHVfaW50MzJfdCkoMHgwNDAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX1NFVFVQX1BBQ0tFVCAgICAgICAgICAgICgodV9pbnQzMl90KSgweDA4MDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfSU5WRVJTRV9GSUxURVJJTkcgICAgICAgKCh1X2ludDMyX3QpKDB4MTAwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19GSVJTVF9TRUdNRU5UICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgyMDAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0xBU1RfU0VHTUVOVCAgICAgICAgICAgICgodV9pbnQzMl90KSgweDQwMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfSU5URVJSVVBUX09OX0NPTVBMRVRJT04gKCh1X2ludDMyX3QpKDB4ODAwMDAwMDApKQorCisjZGVmaW5lIFRERVNfU0VDT05EX0JVRkZFUl9TSVpFX0JJVF9OVU1CRVIgIDExCisjZGVmaW5lIFRERVNfQ09MTElTSU9OX0NPVU5UX0JJVF9OVU1CRVIgICAgIDMKKworLyogQ29uc3RhbnRzIGZvciB0aGUgUkNWIGRlc2NyaXB0b3IgUkRFUyAqLworCisjZGVmaW5lIExNQ19SREVTX09WRVJGTE9XICAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDAxKSkKKyNkZWZpbmUgTE1DX1JERVNfQ1JDX0VSUk9SICAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwMDIpKQorI2RlZmluZSBMTUNfUkRFU19EUklCQkxJTkdfQklUICAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwMDQpKQorI2RlZmluZSBMTUNfUkRFU19SRVBPUlRfT05fTUlJX0VSUiAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDAwOCkpCisjZGVmaW5lIExNQ19SREVTX1JDVl9XQVRDSERPR19USU1FT1VUICgodV9pbnQzMl90KSgweDAwMDAwMDEwKSkKKyNkZWZpbmUgTE1DX1JERVNfRlJBTUVfVFlQRSAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwMjApKQorI2RlZmluZSBMTUNfUkRFU19DT0xMSVNJT05fU0VFTiAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDA0MCkpCisjZGVmaW5lIExNQ19SREVTX0ZSQU1FX1RPT19MT05HICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDgwKSkKKyNkZWZpbmUgTE1DX1JERVNfTEFTVF9ERVNDUklQVE9SICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAxMDApKQorI2RlZmluZSBMTUNfUkRFU19GSVJTVF9ERVNDUklQVE9SICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDIwMCkpCisjZGVmaW5lIExNQ19SREVTX01VTFRJQ0FTVF9GUkFNRSAgICAgICgodV9pbnQzMl90KSgweDAwMDAwNDAwKSkKKyNkZWZpbmUgTE1DX1JERVNfUlVOVF9GUkFNRSAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDA4MDApKQorI2RlZmluZSBMTUNfUkRFU19EQVRBX1RZUEUgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMzAwMCkpCisjZGVmaW5lIExNQ19SREVTX0xFTkdUSF9FUlJPUiAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDA0MDAwKSkKKyNkZWZpbmUgTE1DX1JERVNfRVJST1JfU1VNTUFSWSAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDgwMDApKQorI2RlZmluZSBMTUNfUkRFU19GUkFNRV9MRU5HVEggICAgICAgICAoKHVfaW50MzJfdCkoMHgzRkZGMDAwMCkpCisjZGVmaW5lIExNQ19SREVTX09XTl9CSVQgICAgICAgICAgICAgICgodV9pbnQzMl90KSgweDgwMDAwMDAwKSkKKworI2RlZmluZSBSREVTX0ZSQU1FX0xFTkdUSF9CSVRfTlVNQkVSICAgICAgIDE2CisKKyNkZWZpbmUgTE1DX1JERVNfRVJST1JfTUFTSyAoICh1X2ludDMyX3QpKCBcCisJICBMTUNfUkRFU19PVkVSRkxPVyBcCisJfCBMTUNfUkRFU19EUklCQkxJTkdfQklUIFwKKwl8IExNQ19SREVTX1JFUE9SVF9PTl9NSUlfRVJSIFwKKyAgICAgICAgfCBMTUNfUkRFU19DT0xMSVNJT05fU0VFTiApICkKKworCisvKgorICogSW9jdGwgaW5mbworICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDMyX3QJbjsKKwl1X2ludDMyX3QJbTsKKwl1X2ludDMyX3QJdjsKKwl1X2ludDMyX3QJeDsKKwl1X2ludDMyX3QJcjsKKwl1X2ludDMyX3QJZjsKKwl1X2ludDMyX3QJZXhhY3Q7Cit9IGxtY19hdjkxMTBfdDsKKworLyoKKyAqIENvbW1vbiBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHRoZSBpb2N0bCBjb2RlLgorICovCitzdHJ1Y3QgbG1jX19fY3RsIHsKKwl1X2ludDMyX3QJY2FyZHR5cGU7CisJdV9pbnQzMl90CWNsb2NrX3NvdXJjZTsJCS8qIEhTU0ksIFQxICovCisJdV9pbnQzMl90CWNsb2NrX3JhdGU7CQkvKiBUMSAqLworCXVfaW50MzJfdAljcmNfbGVuZ3RoOworCXVfaW50MzJfdAljYWJsZV9sZW5ndGg7CQkvKiBEUzMgKi8KKwl1X2ludDMyX3QJc2NyYW1ibGVyX29ub2ZmOwkvKiBEUzMgKi8KKwl1X2ludDMyX3QJY2FibGVfdHlwZTsJCS8qIFQxICovCisJdV9pbnQzMl90CWtlZXBhbGl2ZV9vbm9mZjsJLyogcHJvdG9jb2wgKi8KKwl1X2ludDMyX3QJdGlja3M7CQkJLyogdGlja3Mvc2VjICovCisJdW5pb24geworCQlsbWNfYXY5MTEwX3QJc3NpOworCX0gY2FyZHNwZWM7CisJdV9pbnQzMl90ICAgICAgIGNpcmN1aXRfdHlwZTsgICAvKiBUMSBvciBFMSAqLworfTsKKworCisvKgorICogQ2FyZWZ1bGwsIGxvb2sgYXQgdGhlIGRhdGEgc2hlZXQsIHRoZXJlJ3MgbW9yZSB0byB0aGlzCisgKiBzdHJ1Y3R1cmUgdGhhbiBtZWV0cyB0aGUgZXllLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlOgorICoKKyAqIHN0cnVjdCB0dWxpcF9kZXNjX3QgeworICogICAgICAgICB1OCAgb3duOjE7CisgKiAgICAgICAgIHUzMiBzdGF0dXM6MzE7CisgKiAgICAgICAgIHUzMiBjb250cm9sOjEwOworICogICAgICAgICB1MzIgYnVmZmVyMTsKKyAqICAgICAgICAgdTMyIGJ1ZmZlcjI7CisgKiB9OworICogWW91IGNvdWxkIGFsc28gZXhwYW5kIHN0YXR1cyBjb250cm9sIHRvIHByb3ZpZGUgbW9yZSBiaXQgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgdHVsaXBfZGVzY190IHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7Cit9OworCisvKgorICogbWVkaWEgaW5kZXBlbmRlbnQgbWV0aG9kcyB0byBjaGVjayBvbiBtZWRpYSBzdGF0dXMsIGxpbmssIGxpZ2h0IExFRHMsCisgKiBldGMuCisgKi8KK3N0cnVjdCBsbWNfX19tZWRpYSB7CisJdm9pZAkoKiBpbml0KShsbWNfc29mdGNfdCAqIGNvbnN0KTsKKwl2b2lkCSgqIGRlZmF1bHRzKShsbWNfc29mdGNfdCAqIGNvbnN0KTsKKwl2b2lkCSgqIHNldF9zdGF0dXMpKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKKwl2b2lkCSgqIHNldF9jbG9ja19zb3VyY2UpKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CisJdm9pZAkoKiBzZXRfc3BlZWQpKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKKwl2b2lkCSgqIHNldF9jYWJsZV9sZW5ndGgpKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CisJdm9pZAkoKiBzZXRfc2NyYW1ibGVyKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCWludAkoKiBnZXRfbGlua19zdGF0dXMpKGxtY19zb2Z0Y190ICogY29uc3QpOworCXZvaWQJKCogc2V0X2xpbmtfc3RhdHVzKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCXZvaWQJKCogc2V0X2NyY19sZW5ndGgpKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CisgICAgICAgIHZvaWQgICAgKCogc2V0X2NpcmN1aXRfdHlwZSkobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKKyAgICAgICAgdm9pZAkoKiB3YXRjaGRvZykobG1jX3NvZnRjX3QgKiBjb25zdCk7Cit9OworCisKKyNkZWZpbmUgU1RBVENIRUNLICAgICAweEJFRUZDQUZFCisKKy8qICBJbmNsdWRlZCBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgZmlyc3QKKyAqICAgLSBzdGFuZGFyZCBuZXRfZGV2aWNlX3N0YXRzCisgKiAgIC0gc29tZSBvdGhlciBjb3VudGVycyB1c2VkIGZvciBkZWJ1ZyBhbmQgZHJpdmVyIHBlcmZvcm1hbmNlCisgKiAgZXZhbHVhdGlvbiAtYmF6CisgKi8KK3N0cnVjdCBsbWNfc3RhdGlzdGljcworeworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9wYWNrZXRzOyAgICAgICAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X3BhY2tldHM7ICAgICAgICAgICAgIC8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQgICAgKi8KKwl1bnNpZ25lZCBsb25nICAgICByeF9ieXRlczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfYnl0ZXM7CisgICAgICAgIAorICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9lcnJvcnM7ICAgICAgICAgICAgICAvKiBiYWQgcGFja2V0cyByZWNlaXZlZCAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2Vycm9yczsgICAgICAgICAgICAgIC8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcyAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfZHJvcHBlZDsgICAgICAgICAgICAgLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycyAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9kcm9wcGVkOyAgICAgICAgICAgICAvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXggICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIG11bHRpY2FzdDsgICAgICAgICAgICAgIC8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgY29sbGlzaW9uczsKKworICAgICAgICAvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2xlbmd0aF9lcnJvcnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X292ZXJfZXJyb3JzOyAgICAgICAgIC8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdyAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfY3JjX2Vycm9yczsgICAgICAgICAgLyogcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvciAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9mcmFtZV9lcnJvcnM7ICAgICAgICAvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2ZpZm9fZXJyb3JzOyAgICAgICAgIC8qIHJlY3YnciBmaWZvIG92ZXJydW4gICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfbWlzc2VkX2Vycm9yczsgICAgICAgLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldCAgICAgICAqLworCisgICAgICAgIC8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9hYm9ydGVkX2Vycm9yczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfY2Fycmllcl9lcnJvcnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2ZpZm9fZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9oZWFydGJlYXRfZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF93aW5kb3dfZXJyb3JzOworCisgICAgICAgIC8qIGZvciBjc2xpcCBldGMgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyByeF9jb21wcmVzc2VkOworICAgICAgICB1bnNpZ25lZCBsb25nIHR4X2NvbXByZXNzZWQ7CisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgKiBDdXN0b20gc3RhdHMgJiBjb3VudGVycyBmb2xsb3cgLWJheiAqLworICAgICAgICB1X2ludDMyX3QgICAgICAgdmVyc2lvbl9zaXplOworICAgICAgICB1X2ludDMyX3QgICAgICAgbG1jX2NhcmR0eXBlOworCisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9Qcm9jVGltZW91dDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X0ludFRpbWVvdXQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9Ob0NvbXBsZXRlQ250OworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfTWF4WG10c0I0SW50OworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfVGltZW91dENudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X091dE9mU3luY1B0cjsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X3RidXN5MDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X3RidXN5MTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X3RidXN5X2NhbGxzOworICAgICAgICB1X2ludDMyX3QgICAgICAgcmVzZXRDb3VudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxtY190eGZ1bGw7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0YnVzeTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGRpcnR5VHg7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsbWNfbmV4dF90eDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIG90aGVyVHlwZUNudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxhc3RUeXBlOworICAgICAgICB1X2ludDMyX3QgICAgICAgbGFzdFR5cGVPSzsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4TG9vcENudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHVzZWRYbXREZXNjcmlwQ250OworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhJbmRleENudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJ4SW50TG9vcENudDsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgcnhfU21hbGxQa3RDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICByeF9CYWRQa3RTdXJnZUNudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJ4X0J1ZmZBbGxvY0VycjsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X2xvc3NPZkNsb2NrQ250OworCisgICAgICAgIC8qIFQxIGVycm9yIGNvdW50ZXJzICovCisgICAgICAgIHVfaW50MzJfdCAgICAgICBmcmFtaW5nQml0RXJyb3JDb3VudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxpbmVDb2RlVmlvbGF0aW9uQ291bnQ7CisKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxvc3NPZkZyYW1lQ291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBjaGFuZ2VPZkZyYW1lQWxpZ25tZW50Q291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBzZXZlcmVseUVycm9yZWRGcmFtZUNvdW50OworCisgICAgICAgIHVfaW50MzJfdCAgICAgICBjaGVjazsKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgbG1jX3hpbmZvIHsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIE1hZ2ljMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQkVFRkNBRkUgKi8KKworICAgICAgICB1X2ludDMyX3QgICAgICAgUGNpQ2FyZFR5cGU7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBQY2lTbG90TnVtYmVyOyAgICAgICAgICAvKiBQQ0kgc2xvdCBudW1iZXIgICAgICAgKi8KKworICAgICAgICB1X2ludDE2X3QgICAgICAgRHJpdmVyTWFqb3JWZXJzaW9uOworICAgICAgICB1X2ludDE2X3QgICAgICAgRHJpdmVyTWlub3JWZXJzaW9uOworICAgICAgICB1X2ludDE2X3QgICAgICAgRHJpdmVyU3ViVmVyc2lvbjsKKworICAgICAgICB1X2ludDE2X3QgICAgICAgWGlsaW54UmV2aXNpb25OdW1iZXI7CisgICAgICAgIHVfaW50MTZfdCAgICAgICBNYXhGcmFtZVNpemU7CisKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIHQxX2FsYXJtMV9zdGF0dXM7CisgICAgICAgIHVfaW50MTZfdCAgICAgICB0MV9hbGFybTJfc3RhdHVzOworCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGxpbmtfc3RhdHVzOworICAgICAgICB1X2ludDMyX3QgICAgICAgbWlpX3JlZzE2OworCisgICAgICAgIHVfaW50MzJfdCAgICAgICBNYWdpYzE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFQURCRUVGICovCit9IExNQ19YSU5GTzsKKworCisvKgorICogZm9yd2FyZCBkZWNsCisgKi8KK3N0cnVjdCBsbWNfX19zb2Z0YyB7CisgICAgICAgIHZvaWQgKmlmX3B0cjsgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCWNoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7CisJdTgJCQlib2FyZF9pZHg7CisJc3RydWN0IGxtY19zdGF0aXN0aWNzICAgc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgKmxtY19kZXZpY2U7CisKKwlpbnQgICAgICAgICAgICAgICAgICAgICBoYW5nLCByeGRlc2MsIGJhZF9wYWNrZXQsIHNvbWVfY291bnRlcjsKKwl1X2ludDMyX3QgICAgICAgICAgICAgICB0eGdvOworCXN0cnVjdCBsbWNfcmVnZmlsZV90CWxtY19jc3JzOworCXZvbGF0aWxlIHVfaW50MzJfdAlsbWNfdHh0aWNrOworCXZvbGF0aWxlIHVfaW50MzJfdAlsbWNfcnh0aWNrOworCXVfaW50MzJfdAkJbG1jX2ZsYWdzOworCXVfaW50MzJfdAkJbG1jX2ludHJtYXNrOwkvKiBvdXIgY29weSBvZiBjc3JfaW50ciAqLworCXVfaW50MzJfdAkJbG1jX2NtZG1vZGU7CS8qIG91ciBjb3B5IG9mIGNzcl9jbWRtb2RlICovCisJdV9pbnQzMl90CQlsbWNfYnVzbW9kZTsJLyogb3VyIGNvcHkgb2YgY3NyX2J1c21vZGUgKi8KKwl1X2ludDMyX3QJCWxtY19ncGlvX2lvOwkvKiBzdGF0ZSBvZiBpbi9vdXQgc2V0dGluZ3MgKi8KKwl1X2ludDMyX3QJCWxtY19ncGlvOwkvKiBzdGF0ZSBvZiBvdXRwdXRzICovCisJc3RydWN0IHNrX2J1ZmYqCQlsbWNfdHhxW0xNQ19UWERFU0NTXTsKKwlzdHJ1Y3Qgc2tfYnVmZioJCWxtY19yeHFbTE1DX1JYREVTQ1NdOworCXZvbGF0aWxlCisJc3RydWN0IHR1bGlwX2Rlc2NfdAlsbWNfcnhyaW5nW0xNQ19SWERFU0NTXTsKKwl2b2xhdGlsZQorCXN0cnVjdCB0dWxpcF9kZXNjX3QJbG1jX3R4cmluZ1tMTUNfVFhERVNDU107CisJdW5zaWduZWQgaW50CQlsbWNfbmV4dF9yeCwgbG1jX25leHRfdHg7CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBpbnQJCWxtY190YWludF90eCwgbG1jX3RhaW50X3J4OworCWludAkJCWxtY190eF9zdGFydCwgbG1jX3R4ZnVsbDsKKwlpbnQJCQlsbWNfdHhidXN5OworCXVfaW50MTZfdAkJbG1jX21paXJlZzE2OworCWludAkJCWxtY19vazsKKwlpbnQJCQlsYXN0X2xpbmtfc3RhdHVzOworCWludAkJCWxtY19jYXJkdHlwZTsKKwl1X2ludDMyX3QgICAgICAgICAgICAgICBsYXN0X2ZyYW1lZXJyOworCWxtY19tZWRpYV90CSAgICAgICAqbG1jX21lZGlhOworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCWxtY19jdGxfdAkJaWN0bDsKKwl1X2ludDMyX3QJCVR4RGVzY3JpcHRDb250cm9sSW5pdDsgIAorCisJaW50ICAgICAgICAgICAgICAgICAgICAgdHhfVGltZW91dEluZDsgLyogYWRkaXRpb25hbCBkcml2ZXIgc3RhdGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9UaW1lb3V0RGlzcGxheTsKKwl1bnNpZ25lZCBpbnQJCWxhc3RsbWNfdGFpbnRfdHg7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbGFzdHR4X3BhY2tldHM7CisJdV9pbnQzMl90CQl0eF9jbG9ja1N0YXRlOworCXVfaW50MzJfdAkJbG1jX2NyY1NpemU7CisJTE1DX1hJTkZPCQlsbWNfeGluZm87IAorCWNoYXIgICAgICAgICAgICAgICAgICAgIGxtY195ZWwsIGxtY19ibHVlLCBsbWNfcmVkOyAvKiBmb3IgVDEgYW5kIERTMyAqLworICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBsbWNfdGltaW5nOyAvKiBmb3IgSFNTSSBhbmQgU1NJICovCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdvdF9pcnE7CisKKyAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbGFzdF9sZWRfZXJyWzRdOworCisgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgIGxhc3RfaW50OworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICBudW1faW50OworCisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG1jX2xvY2s7CisgICAgICAgIHVfaW50MTZfdCAgICAgICAgICAgICAgIGlmX3R5cGU7ICAgICAgIC8qIFBQUCBvciBORVQgKi8KKyAgICAgICAgc3RydWN0IHBwcF9kZXZpY2UgICAgICAgKnBkOworCisgICAgICAgIC8qIEZhaWx1cmUgY2FzZXMgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZF9yaW5nOworICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkX3JlY3ZfYWxsb2M7CisKKyAgICAgICAgLyogU3RydWN0dXJlIGNoZWNrICovCisgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgIGNoZWNrOworfTsKKworI2RlZmluZSBMTUNfUENJX1RJTUUgMQorI2RlZmluZSBMTUNfRVhUX1RJTUUgMAorCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgICAgICAgIDE1NDIgIC8qIHdhcyAxNTM2ICovCisKKy8qIENTUjUgc2V0dGluZ3MgKi8KKyNkZWZpbmUgVElNRVJfSU5UICAgICAweDAwMDAwODAwCisjZGVmaW5lIFRQX0xJTktfRkFJTCAgMHgwMDAwMTAwMAorI2RlZmluZSBUUF9MSU5LX1BBU1MgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTk9STUFMX0lOVCAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFCTk9STUFMX0lOVCAgMHgwMDAwODAwMAorI2RlZmluZSBSWF9KQUJCRVJfSU5UIDB4MDAwMDAyMDAKKyNkZWZpbmUgUlhfRElFRCAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFJYX05PQlVGRiAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBSWF9JTlQgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFhfRklGT19VTkRFUiAweDAwMDAwMDIwCisjZGVmaW5lIFRYX0pBQkJFUiAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBUWF9OT0JVRkYgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVFhfRElFRCAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRYX0lOVCAgICAgICAgMHgwMDAwMDAwMQorCisvKiBDU1I2IHNldHRpbmdzICovCisjZGVmaW5lIE9QRVJBVElPTl9NT0RFICAweDAwMDAwMjAwIC8qIEZ1bGwgRHVwbGV4ICAgICAgKi8KKyNkZWZpbmUgUFJPTUlTQ19NT0RFICAgIDB4MDAwMDAwNDAgLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBSRUNJRVZFX0FMTCAgICAgMHg0MDAwMDAwMCAvKiBSZWNpZXZlIEFsbCAgICAgICovCisjZGVmaW5lIFBBU1NfQkFEX0ZSQU1FUyAweDAwMDAwMDA4IC8qIFBhc3MgQmFkIEZyYW1lcyAgKi8KKworLyogRGVjIGNvbnRyb2wgcmVnaXN0ZXJzICBDU1I2IGFzIHdlbGwgKi8KKyNkZWZpbmUgTE1DX0RFQ19TVCAweDAwMDAyMDAwCisjZGVmaW5lIExNQ19ERUNfU1IgMHgwMDAwMDAwMgorCisvKiBDU1IxNSBzZXR0aW5ncyAqLworI2RlZmluZSBSRUNWX1dBVENIRE9HX0RJU0FCTEUgMHgwMDAwMDAxMAorI2RlZmluZSBKQUJCRVJfRElTQUJMRSAgICAgICAgMHgwMDAwMDAwMQorCisvKiBNb3JlIHNldHRpbmdzICovCisvKgorICogYVNSNiAtLSBDb21tYW5kIChPcGVyYXRpb24gTW9kZSkgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBUVUxJUF9DTURfUkVDRUlWRUFMTCAgICAweDQwMDAwMDAwTCAvKiAoUlcpICBSZWNlaXZlbCBhbGwgZnJhbWVzPyAqLworI2RlZmluZSBUVUxJUF9DTURfTVVTVEJFT05FICAgICAweDAyMDAwMDAwTCAvKiAoUlcpICBNdXN0IEJlIE9uZSAoMjExNDApICovCisjZGVmaW5lIFRVTElQX0NNRF9UWFRIUlNITERDVEwgIDB4MDA0MDAwMDBMIC8qIChSVykgIFRyYW5zbWl0IFRocmVzaG9sZCBNb2RlICgyMTE0MCkgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1NUT1JFRldEICAgICAgMHgwMDIwMDAwMEwgLyogKFJXKSAgU3RvcmUgYW5kIEZvd2FyZCAoMjExNDApICovCisjZGVmaW5lIFRVTElQX0NNRF9OT0hFQVJUQkVBVCAgIDB4MDAwODAwMDBMIC8qIChSVykgIE5vIEhlYXJ0YmVhdCAoMjExNDApICovCisjZGVmaW5lIFRVTElQX0NNRF9QT1JUU0VMRUNUICAgIDB4MDAwNDAwMDBMIC8qIChSVykgIFBvc3QgU2VsZWN0ICgxMDBNYikgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfRlVMTERVUExFWCAgICAweDAwMDAwMjAwTCAvKiAoUlcpICBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFRVTElQX0NNRF9PUEVSTU9ERSAgICAgIDB4MDAwMDBDMDBMIC8qIChSVykgIE9wZXJhdGluZyBNb2RlICovCisjZGVmaW5lIFRVTElQX0NNRF9QUk9NSVNDVU9VUyAgIDB4MDAwMDAwNDFMIC8qIChSVykgIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1BBU1NCQURQS1QgICAgMHgwMDAwMDAwOEwgLyogKFJXKSAgUGFzcyBCYWQgRnJhbWVzICovCisjZGVmaW5lIFRVTElQX0NNRF9USFJFU0hPTERDVEwgIDB4MDAwMEMwMDBMIC8qIChSVykgIFRocmVzaG9sZCBDb250cm9sICovCisKKyNkZWZpbmUgVFVMSVBfR1BfUElOU0VUICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgVFVMSVBfQlVTTU9ERV9TV1JFU0VUICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgVFVMSVBfV0FUQ0hET0dfVFhESVNBQkxFIDB4MDAwMDAwMDFMCisjZGVmaW5lIFRVTElQX1dBVENIRE9HX1JYRElTQUJMRSAweDAwMDAwMDEwTAorCisjZGVmaW5lIFRVTElQX1NUU19OT1JNQUxJTlRSICAgIDB4MDAwMTAwMDBMIC8qIChSVykgIE5vcm1hbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX0FCTlJNTElOVFIgICAgMHgwMDAwODAwMEwgLyogKFJXKSAgQWJub3JtYWwgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19FUkkgICAgICAgICAgIDB4MDAwMDQwMDBMIC8qIChSVykgIEVhcmx5IFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19TWVNFUlJPUiAgICAgIDB4MDAwMDIwMDBMIC8qIChSVykgIFN5c3RlbSBFcnJvciAqLworI2RlZmluZSBUVUxJUF9TVFNfR1RFICAgICAgICAgICAweDAwMDAwODAwTCAvKiAoUlcpICBHZW5lcmFsIFB1cG9zZSBUaW1lciBFeHAgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX0VUSSAgICAgICAgICAgMHgwMDAwMDQwMEwgLyogKFJXKSAgRWFybHkgVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19SWFdUICAgICAgICAgIDB4MDAwMDAyMDBMIC8qIChSVykgIFJlY2VpdmVyIFdhdGNoZG9nIFRpbWVvdXQgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX1JYU1RPUFBFRCAgICAgMHgwMDAwMDEwMEwgLyogKFJXKSAgUmVjZWl2ZXIgUHJvY2VzcyBTdG9wcGVkICovCisjZGVmaW5lIFRVTElQX1NUU19SWE5PQlVGICAgICAgIDB4MDAwMDAwODBMIC8qIChSVykgIFJlY2VpdmUgQnVmIFVuYXZhaWwgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX1JYSU5UUiAgICAgICAgMHgwMDAwMDA0MEwgLyogKFJXKSAgUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX1RYVU5ERVJGTE9XICAgMHgwMDAwMDAyMEwgLyogKFJXKSAgVHJhbnNtaXQgVW5kZXJmbG93ICovCisjZGVmaW5lIFRVTElQX1NUU19UWEpBQkVSICAgICAgIDB4MDAwMDAwMDhMIC8qIChSVykgIEphYmJlciB0aW1lb3V0ICovCisjZGVmaW5lIFRVTElQX1NUU19UWE5PQlVGICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIFRVTElQX1NUU19UWFNUT1BQRUQgICAgIDB4MDAwMDAwMDJMIC8qIChSVykgIFRyYW5zbWl0IFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBUVUxJUF9TVFNfVFhJTlRSICAgICAgICAweDAwMDAwMDAxTCAvKiAoUlcpICBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBUVUxJUF9TVFNfUlhTX1NUT1BQRUQgICAweDAwMDAwMDAwTCAvKiAgICAgICAgMDAwIC0gU3RvcHBlZCAqLworCisjZGVmaW5lIFRVTElQX1NUU19SWFNUT1BQRUQgICAgIDB4MDAwMDAxMDBMICAgICAgICAgICAgIC8qIChSVykgIFJlY2VpdmUgUHJvY2VzcyBTdG9wcGVkICovCisjZGVmaW5lIFRVTElQX1NUU19SWE5PQlVGICAgICAgIDB4MDAwMDAwODBMCisKKyNkZWZpbmUgVFVMSVBfQ01EX1RYUlVOICAgICAgICAgMHgwMDAwMjAwMEwgLyogKFJXKSAgU3RhcnQvU3RvcCBUcmFuc21pdHRlciAqLworI2RlZmluZSBUVUxJUF9DTURfUlhSVU4gICAgICAgICAweDAwMDAwMDAyTCAvKiAoUlcpICBTdGFydC9TdG9wIFJlY2VpdmUgRmlsdGVyaW5nICovCisjZGVmaW5lIFRVTElQX0RTVFNfVHhERUZFUlJFRCAgIDB4MDAwMDAwMDEgICAgICAvKiBJbml0aWFsbHkgRGVmZXJyZWQgKi8KKyNkZWZpbmUgVFVMSVBfRFNUU19PV05FUiAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8qIE93bmVyICgxID0gMjEwNDApICovCisjZGVmaW5lIFRVTElQX0RTVFNfUnhNSUlFUlIgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTE1DX0RTVFNfRVJSU1VNICAgICAgICAgKFRVTElQX0RTVFNfUnhNSUlFUlIpCisKKyNkZWZpbmUgVFVMSVBfREVGQVVMVF9JTlRSX01BU0sgIChUVUxJUF9TVFNfTk9STUFMSU5UUiBcCisgIHwgVFVMSVBfU1RTX1JYSU5UUiAgICAgICBcCisgIHwgVFVMSVBfU1RTX1RYSU5UUiAgICAgXAorICB8IFRVTElQX1NUU19BQk5STUxJTlRSIFwKKyAgfCBUVUxJUF9TVFNfU1lTRVJST1IgICBcCisgIHwgVFVMSVBfU1RTX1RYU1RPUFBFRCAgXAorICB8IFRVTElQX1NUU19UWFVOREVSRkxPV1wKKyAgfCBUVUxJUF9TVFNfUlhTVE9QUEVEICkKKworI2RlZmluZSBERVNDX09XTkVEX0JZX1NZU1RFTSAgICgodV9pbnQzMl90KSgweDAwMDAwMDAwKSkKKyNkZWZpbmUgREVTQ19PV05FRF9CWV9EQzIxWDQgICAoKHVfaW50MzJfdCkoMHg4MDAwMDAwMCkpCisKKyNpZm5kZWYgVFVMSVBfQ01EX1JFQ0VJVkVBTEwKKyNkZWZpbmUgVFVMSVBfQ01EX1JFQ0VJVkVBTEwgMHg0MDAwMDAwMEwKKyNlbmRpZgorCisvKiBBZGFwdGVyIG1vZHVsZSBudW1iZXIgKi8KKyNkZWZpbmUgTE1DX0FEQVBfSFNTSSAgICAgICAgICAgMgorI2RlZmluZSBMTUNfQURBUF9EUzMgICAgICAgICAgICAzCisjZGVmaW5lIExNQ19BREFQX1NTSSAgICAgICAgICAgIDQKKyNkZWZpbmUgTE1DX0FEQVBfVDEgICAgICAgICAgICAgNQorCisjZGVmaW5lIEhETENfSERSX0xFTiAgNAorI2RlZmluZSBIRExDX0FERFJfTEVOIDEKKyNkZWZpbmUgSERMQ19TTEFSUCAgICAweDgwMzUKKyNkZWZpbmUgTE1DX01UVSAxNTAwCisjZGVmaW5lIFNMQVJQX0xJTkVDSEVDSyAyCisKKyNkZWZpbmUgTE1DX0NSQ19MRU5fMTYgMiAgLyogMTYtYml0IENSQyAqLworI2RlZmluZSBMTUNfQ1JDX0xFTl8zMiA0CisKKyNpZmRlZiBMTUNfSERMQworLyogZGVmaW5pdGlvbiBvZiBhbiBoZGxjIGhlYWRlci4gKi8KK3N0cnVjdCBoZGxjX2hkcgoreworCXU4ICBhZGRyZXNzOworCXU4ICBjb250cm9sOworCXUxNiB0eXBlOworfTsKKworLyogZGVmaW5pdGlvbiBvZiBhIHNsYXJwIGhlYWRlci4gKi8KK3N0cnVjdCBzbGFycAoreworCWxvbmcgY29kZTsKKwl1bmlvbiBzbAorCXsKKwkJc3RydWN0CisJCXsKKwkJCXVsb25nIGFkZHJlc3M7CisJCQl1bG9uZyBtYXNrOworCQkJdXNob3J0IHVudXNlZDsKKwkJfSBhZGQ7CisJCXN0cnVjdAorCQl7CisJCQl1bG9uZyBteXNlcXVlbmNlOworCQkJdWxvbmcgeW91cnNlcXVlbmNlOworCQkJdXNob3J0IHJlbGlhYmlsaXR5OworCQkJdWxvbmcgdGltZTsKKwkJfSBjaGs7CisJfSB0OworfTsKKyNlbmRpZiAvKiBMTUNfSERMQyAqLworCisKKyNlbmRpZiAvKiBfTE1DX1ZBUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL24yLmMgYi9kcml2ZXJzL25ldC93YW4vbjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDMyNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiBTREwgSW5jLiBSSVNDb20vTjIgc3luY2hyb25vdXMgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBGb3IgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly9ocS5wbS53YXcucGwvaGRsYy8KKyAqCisgKiBOb3RlOiBpbnRlZ3JhdGVkIENTVS9EU1UvRERTIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorICogICAgU0RMIEluYy4gUFBQL0hETEMvQ0lTQ08gZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJoZDY0NTcwLmgiCisKKworc3RhdGljIGNvbnN0IGNoYXIqIHZlcnNpb24gPSAiU0RMIFJJU0NvbS9OMiBkcml2ZXIgdmVyc2lvbjogMS4xNSI7CitzdGF0aWMgY29uc3QgY2hhciogZGV2bmFtZSA9ICJSSVNDb20vTjIiOworCisjdW5kZWYgREVCVUdfUEtUCisjZGVmaW5lIERFQlVHX1JJTkdTCisKKyNkZWZpbmUgVVNFX1dJTkRPV1NJWkUgMTYzODQKKyNkZWZpbmUgVVNFX0JVUzE2QklUUyAxCisjZGVmaW5lIENMT0NLX0JBU0UgOTgzMDQwMAkvKiA5LjgzMDQgTUh6ICovCisjZGVmaW5lIE1BWF9QQUdFUyAgICAgIDE2CS8qIDE2IFJBTSBwYWdlcyBhdCBtYXggKi8KKyNkZWZpbmUgTUFYX1JBTV9TSVpFIDB4ODAwMDAJLyogNTEyIEtCICovCisjaWYgTUFYX1JBTV9TSVpFID4gTUFYX1BBR0VTICogVVNFX1dJTkRPV1NJWkUKKyN1bmRlZiBNQVhfUkFNX1NJWkUKKyNkZWZpbmUgTUFYX1JBTV9TSVpFIChNQVhfUEFHRVMgKiBVU0VfV0lORE9XU0laRSkKKyNlbmRpZgorI2RlZmluZSBOMl9JT1BPUlRTIDB4MTAKKyNkZWZpbmUgTkVFRF9ERVRFQ1RfUkFNCisjZGVmaW5lIE5FRURfU0NBX01TQ0lfSU5UUgorI2RlZmluZSBNQVhfVFhfQlVGRkVSUyAxMAorCitzdGF0aWMgY2hhciAqaHcgPSBOVUxMOwkvKiBwb2ludGVyIHRvIGh3PXh4eCBjb21tYW5kIGxpbmUgc3RyaW5nICovCisKKy8qIFJJU0NvbS9OMiBCb2FyZCBSZWdpc3RlcnMgKi8KKworLyogUEMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBOMl9QQ1IgMAorI2RlZmluZSBQQ1JfUlVOU0NBIDEgICAgIC8qIFJ1biA2NDU3MCAqLworI2RlZmluZSBQQ1JfVlBNICAgIDIgICAgIC8qIEVuYWJsZSBWUE0gLSBuZWVkZWQgaWYgdXNpbmcgUkFNIGFib3ZlIDEgTUIgKi8KKyNkZWZpbmUgUENSX0VOV0lOICA0ICAgICAvKiBPcGVuIHdpbmRvdyAqLworI2RlZmluZSBQQ1JfQlVTMTYgIDggICAgIC8qIDE2LWJpdCBidXMgKi8KKworCisvKiBNZW1vcnkgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIE4yX0JBUiAyCisKKworLyogUGFnZSBTY2FuIFJlZ2lzdGVyICAqLworI2RlZmluZSBOMl9QU1IgNAorI2RlZmluZSBXSU4xNksgICAgICAgMHgwMAorI2RlZmluZSBXSU4zMksgICAgICAgMHgyMAorI2RlZmluZSBXSU42NEsgICAgICAgMHg0MAorI2RlZmluZSBQU1JfV0lOQklUUyAgMHg2MAorI2RlZmluZSBQU1JfRE1BRU4gICAgMHg4MAorI2RlZmluZSBQU1JfUEFHRUJJVFMgMHgwRgorCisKKy8qIE1vZGVtIENvbnRyb2wgUmVnICovCisjZGVmaW5lIE4yX01DUiA2CisjZGVmaW5lIENMT0NLX09VVF9QT1JUMSAweDgwCisjZGVmaW5lIENMT0NLX09VVF9QT1JUMCAweDQwCisjZGVmaW5lIFRYNDIyX1BPUlQxICAgICAweDIwCisjZGVmaW5lIFRYNDIyX1BPUlQwICAgICAweDEwCisjZGVmaW5lIERTUl9QT1JUMSAgICAgICAweDA4CisjZGVmaW5lIERTUl9QT1JUMCAgICAgICAweDA0CisjZGVmaW5lIERUUl9QT1JUMSAgICAgICAweDAyCisjZGVmaW5lIERUUl9QT1JUMCAgICAgICAweDAxCisKKwordHlwZWRlZiBzdHJ1Y3QgcG9ydF9zIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYXJkX3MgKmNhcmQ7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBUWCBsb2NrICovCisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJaW50IHZhbGlkOwkJLyogcG9ydCBlbmFibGVkICovCisJaW50IHJ4cGFydDsJCS8qIHBhcnRpYWwgZnJhbWUgcmVjZWl2ZWQsIG5leHQgZnJhbWUgaW52YWxpZCovCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXUxNiByeGluOwkJLyogcnggcmluZyBidWZmZXIgJ2luJyBwb2ludGVyICovCisJdTE2IHR4aW47CQkvKiB0eCByaW5nIGJ1ZmZlciAnaW4nIGFuZCAnbGFzdCcgcG9pbnRlcnMgKi8KKwl1MTYgdHhsYXN0OworCXU4IHJ4cywgdHhzLCB0bWM7CS8qIFNDQSByZWdpc3RlcnMgKi8KKwl1OCBwaHlfbm9kZTsJCS8qIHBoeXNpY2FsIHBvcnQgIyAtIDAgb3IgMSAqLworCXU4IGxvZ19ub2RlOwkJLyogbG9naWNhbCBwb3J0ICMgKi8KK31wb3J0X3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCBjYXJkX3MgeworCXU4IF9faW9tZW0gKndpbmJhc2U7CQkvKiBJU0Egd2luZG93IGJhc2UgYWRkcmVzcyAqLworCXUzMiBwaHlfd2luYmFzZTsJLyogSVNBIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCXUzMiByYW1fc2l6ZTsJCS8qIG51bWJlciBvZiBieXRlcyAqLworCXUxNiBpbzsJCQkvKiBJTyBCYXNlIGFkZHJlc3MgKi8KKwl1MTYgYnVmZl9vZmZzZXQ7CS8qIG9mZnNldCBvZiBmaXJzdCBidWZmZXIgb2YgZmlyc3QgY2hhbm5lbCAqLworCXUxNiByeF9yaW5nX2J1ZmZlcnM7CS8qIG51bWJlciBvZiBidWZmZXJzIGluIGEgcmluZyAqLworCXUxNiB0eF9yaW5nX2J1ZmZlcnM7CisJdTggaXJxOwkJCS8qIElSUSAoMy0xNSkgKi8KKworCXBvcnRfdCBwb3J0c1syXTsKKwlzdHJ1Y3QgY2FyZF9zICpuZXh0X2NhcmQ7Cit9Y2FyZF90OworCisKK3N0YXRpYyBjYXJkX3QgKmZpcnN0X2NhcmQ7CitzdGF0aWMgY2FyZF90ICoqbmV3X2NhcmQgPSAmZmlyc3RfY2FyZDsKKworCisjZGVmaW5lIHNjYV9yZWcocmVnLCBjYXJkKSAoMHg4MDAwIHwgKGNhcmQpLT5pbyB8IFwKKwkJCSAgICAoKHJlZykgJiAweDBGKSB8ICgoKHJlZykgJiAweEYwKSA8PCA2KSkKKyNkZWZpbmUgc2NhX2luKHJlZywgY2FyZCkJCWluYihzY2FfcmVnKHJlZywgY2FyZCkpCisjZGVmaW5lIHNjYV9vdXQodmFsdWUsIHJlZywgY2FyZCkJb3V0Yih2YWx1ZSwgc2NhX3JlZyhyZWcsIGNhcmQpKQorI2RlZmluZSBzY2FfaW53KHJlZywgY2FyZCkJCWludyhzY2FfcmVnKHJlZywgY2FyZCkpCisjZGVmaW5lIHNjYV9vdXR3KHZhbHVlLCByZWcsIGNhcmQpCW91dHcodmFsdWUsIHNjYV9yZWcocmVnLCBjYXJkKSkKKworI2RlZmluZSBwb3J0X3RvX2NhcmQocG9ydCkJCSgocG9ydCktPmNhcmQpCisjZGVmaW5lIGxvZ19ub2RlKHBvcnQpCQkJKChwb3J0KS0+bG9nX25vZGUpCisjZGVmaW5lIHBoeV9ub2RlKHBvcnQpCQkJKChwb3J0KS0+cGh5X25vZGUpCisjZGVmaW5lIHdpbnNpemUoY2FyZCkJCQkoVVNFX1dJTkRPV1NJWkUpCisjZGVmaW5lIHdpbmJhc2UoY2FyZCkgICAgICAJICAgICAJKChjYXJkKS0+d2luYmFzZSkKKyNkZWZpbmUgZ2V0X3BvcnQoY2FyZCwgcG9ydCkJCSgoY2FyZCktPnBvcnRzW3BvcnRdLnZhbGlkID8gXAorCQkJCQkgJihjYXJkKS0+cG9ydHNbcG9ydF0gOiBOVUxMKQorCisKKworc3RhdGljIF9faW5saW5lX18gdTggc2NhX2dldF9wYWdlKGNhcmRfdCAqY2FyZCkKK3sKKwlyZXR1cm4gaW5iKGNhcmQtPmlvICsgTjJfUFNSKSAmIFBTUl9QQUdFQklUUzsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG9wZW53aW4oY2FyZF90ICpjYXJkLCB1OCBwYWdlKQoreworCXU4IHBzciA9IGluYihjYXJkLT5pbyArIE4yX1BTUik7CisJb3V0YigocHNyICYgflBTUl9QQUdFQklUUykgfCBwYWdlLCBjYXJkLT5pbyArIE4yX1BTUik7Cit9CisKKworCisjaW5jbHVkZSAiaGQ2NDU3eC5jIgorCisKKworc3RhdGljIHZvaWQgbjJfc2V0X2lmYWNlKHBvcnRfdCAqcG9ydCkKK3sKKwljYXJkX3QgKmNhcmQgPSBwb3J0LT5jYXJkOworCWludCBpbyA9IGNhcmQtPmlvOworCXU4IG1jciA9IGluYihpbyArIE4yX01DUik7CisJdTggbXNjaSA9IGdldF9tc2NpKHBvcnQpOworCXU4IHJ4cyA9IHBvcnQtPnJ4cyAmIENMS19CUkdfTUFTSzsKKwl1OCB0eHMgPSBwb3J0LT50eHMgJiBDTEtfQlJHX01BU0s7CisKKwlzd2l0Y2gocG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSkgeworCWNhc2UgQ0xPQ0tfSU5UOgorCQltY3IgfD0gcG9ydC0+cGh5X25vZGUgPyBDTE9DS19PVVRfUE9SVDEgOiBDTE9DS19PVVRfUE9SVDA7CisJCXJ4cyB8PSBDTEtfQlJHX1JYOyAvKiBCUkcgb3V0cHV0ICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UWElOVDoKKwkJbWNyIHw9IHBvcnQtPnBoeV9ub2RlID8gQ0xPQ0tfT1VUX1BPUlQxIDogQ0xPQ0tfT1VUX1BPUlQwOworCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0JSR19UWDsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6CisJCW1jciB8PSBwb3J0LT5waHlfbm9kZSA/IENMT0NLX09VVF9QT1JUMSA6IENMT0NLX09VVF9QT1JUMDsKKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19SWENMS19UWDsgLyogUlggY2xvY2sgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogQ2xvY2sgRVhUZXJuYWwgKi8KKwkJbWNyICY9IHBvcnQtPnBoeV9ub2RlID8gfkNMT0NLX09VVF9QT1JUMSA6IH5DTE9DS19PVVRfUE9SVDA7CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfTElORV9UWDsgLyogVFhDIGlucHV0ICovCisJfQorCisJb3V0YihtY3IsIGlvICsgTjJfTUNSKTsKKwlwb3J0LT5yeHMgPSByeHM7CisJcG9ydC0+dHhzID0gdHhzOworCXNjYV9vdXQocnhzLCBtc2NpICsgUlhTLCBjYXJkKTsKKwlzY2Ffb3V0KHR4cywgbXNjaSArIFRYUywgY2FyZCk7CisJc2NhX3NldF9wb3J0KHBvcnQpOworfQorCisKKworc3RhdGljIGludCBuMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgaW8gPSBwb3J0LT5jYXJkLT5pbzsKKwl1OCBtY3IgPSBpbmIoaW8gKyBOMl9NQ1IpIHwgKHBvcnQtPnBoeV9ub2RlID8gVFg0MjJfUE9SVDE6VFg0MjJfUE9SVDApOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBoZGxjX29wZW4oZGV2KTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJbWNyICY9IHBvcnQtPnBoeV9ub2RlID8gfkRUUl9QT1JUMSA6IH5EVFJfUE9SVDA7IC8qIHNldCBEVFIgT04gKi8KKwlvdXRiKG1jciwgaW8gKyBOMl9NQ1IpOworCisJb3V0YihpbmIoaW8gKyBOMl9QQ1IpIHwgUENSX0VOV0lOLCBpbyArIE4yX1BDUik7IC8qIG9wZW4gd2luZG93ICovCisJb3V0YihpbmIoaW8gKyBOMl9QU1IpIHwgUFNSX0RNQUVOLCBpbyArIE4yX1BTUik7IC8qIGVuYWJsZSBkbWEgKi8KKwlzY2Ffb3BlbihkZXYpOworCW4yX3NldF9pZmFjZShwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgbjJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWludCBpbyA9IHBvcnQtPmNhcmQtPmlvOworCXU4IG1jciA9IGluYihpbytOMl9NQ1IpIHwgKHBvcnQtPnBoeV9ub2RlID8gVFg0MjJfUE9SVDEgOiBUWDQyMl9QT1JUMCk7CisKKwlzY2FfY2xvc2UoZGV2KTsKKwltY3IgfD0gcG9ydC0+cGh5X25vZGUgPyBEVFJfUE9SVDEgOiBEVFJfUE9SVDA7IC8qIHNldCBEVFIgT0ZGICovCisJb3V0YihtY3IsIGlvICsgTjJfTUNSKTsKKwloZGxjX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IG4yX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKyNpZmRlZiBERUJVR19SSU5HUworCWlmIChjbWQgPT0gU0lPQ0RFVlBSSVZBVEUpIHsKKwkJc2NhX2R1bXBfcmluZ3MoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9TWU5DX1NFUklBTDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIobGluZSwgJnBvcnQtPnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX0VYVCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWEZST01SWCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19JTlQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhJTlQpCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBzdWNoIGNsb2NrIHNldHRpbmcgKi8KKworCQlpZiAobmV3X2xpbmUubG9vcGJhY2sgIT0gMCAmJiBuZXdfbGluZS5sb29wYmFjayAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZwb3J0LT5zZXR0aW5ncywgJm5ld19saW5lLCBzaXplKTsgLyogVXBkYXRlIHNldHRpbmdzICovCisJCW4yX3NldF9pZmFjZShwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZCBuMl9kZXN0cm95X2NhcmQoY2FyZF90ICpjYXJkKQoreworCWludCBjbnQ7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKQorCQlpZiAoY2FyZC0+cG9ydHNbY250XS5jYXJkKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2NudF0pOworCQkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpOworCQl9CisKKwlpZiAoY2FyZC0+aXJxKQorCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCisJaWYgKGNhcmQtPndpbmJhc2UpIHsKKwkJaW91bm1hcChjYXJkLT53aW5iYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPnBoeV93aW5iYXNlLCBVU0VfV0lORE9XU0laRSk7CisJfQorCisJaWYgKGNhcmQtPmlvKQorCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pbywgTjJfSU9QT1JUUyk7CisJaWYgKGNhcmQtPnBvcnRzWzBdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMF0uZGV2KTsKKwlpZiAoY2FyZC0+cG9ydHNbMV0uZGV2KQorCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1sxXS5kZXYpOworCWtmcmVlKGNhcmQpOworfQorCisKKworc3RhdGljIGludCBfX2luaXQgbjJfcnVuKHVuc2lnbmVkIGxvbmcgaW8sIHVuc2lnbmVkIGxvbmcgaXJxLAorCQkJIHVuc2lnbmVkIGxvbmcgd2luYmFzZSwgbG9uZyB2YWxpZDAsIGxvbmcgdmFsaWQxKQoreworCWNhcmRfdCAqY2FyZDsKKwl1OCBjbnQsIHBjcjsKKwlpbnQgaTsKKworCWlmIChpbyA8IDB4MjAwIHx8IGlvID4gMHgzRkYgfHwgKGlvICUgTjJfSU9QT1JUUykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIEkvTyBwb3J0IHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGlycSA8IDMgfHwgaXJxID4gMTUgfHwgaXJxID09IDYpIC8qIEZJWE1FICovIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBJUlEgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAod2luYmFzZSA8IDB4QTAwMDAgfHwgd2luYmFzZSA+IDB4RkZGRkYgfHwgKHdpbmJhc2UgJiAweEZGRikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIFJBTSB2YWx1ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCW1lbXNldChjYXJkLCAwLCBzaXplb2YoY2FyZF90KSk7CisKKwljYXJkLT5wb3J0c1swXS5kZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1swXSk7CisJY2FyZC0+cG9ydHNbMV0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMV0pOworCWlmICghY2FyZC0+cG9ydHNbMF0uZGV2IHx8ICFjYXJkLT5wb3J0c1sxXS5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgTjJfSU9QT1JUUywgZGV2bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogSS9PIHBvcnQgcmVnaW9uIGluIHVzZVxuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2FyZC0+aW8gPSBpbzsKKworCWlmIChyZXF1ZXN0X2lycShpcnEsICZzY2FfaW50ciwgMCwgZGV2bmFtZSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogY291bGQgbm90IGFsbG9jYXRlIElSUVxuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCWNhcmQtPmlycSA9IGlycTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHdpbmJhc2UsIFVTRV9XSU5ET1dTSVpFLCBkZXZuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiBjb3VsZCBub3QgcmVxdWVzdCBSQU0gd2luZG93XG4iKTsKKwkJbjJfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4oLUVCVVNZKTsKKwl9CisJY2FyZC0+cGh5X3dpbmJhc2UgPSB3aW5iYXNlOworCWNhcmQtPndpbmJhc2UgPSBpb3JlbWFwKHdpbmJhc2UsIFVTRV9XSU5ET1dTSVpFKTsKKworCW91dGIoMCwgaW8gKyBOMl9QQ1IpOworCW91dGIod2luYmFzZSA+PiAxMiwgaW8gKyBOMl9CQVIpOworCisJc3dpdGNoIChVU0VfV0lORE9XU0laRSkgeworCWNhc2UgMTYzODQ6CisJCW91dGIoV0lOMTZLLCBpbyArIE4yX1BTUik7CisJCWJyZWFrOworCisJY2FzZSAzMjc2ODoKKwkJb3V0YihXSU4zMkssIGlvICsgTjJfUFNSKTsKKwkJYnJlYWs7CisKKwljYXNlIDY1NTM2OgorCQlvdXRiKFdJTjY0SywgaW8gKyBOMl9QU1IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgd2luZG93IHNpemVcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjciA9IFBDUl9FTldJTiB8IFBDUl9WUE0gfCAoVVNFX0JVUzE2QklUUyA/IFBDUl9CVVMxNiA6IDApOworCW91dGIocGNyLCBpbyArIE4yX1BDUik7CisKKwljYXJkLT5yYW1fc2l6ZSA9IHNjYV9kZXRlY3RfcmFtKGNhcmQsIGNhcmQtPndpbmJhc2UsIE1BWF9SQU1fU0laRSk7CisKKwkvKiBudW1iZXIgb2YgVFggKyBSWCBidWZmZXJzIGZvciBvbmUgcG9ydCAqLworCWkgPSBjYXJkLT5yYW1fc2l6ZSAvICgodmFsaWQwICsgdmFsaWQxKSAqIChzaXplb2YocGt0X2Rlc2MpICsKKwkJCQkJCSAgIEhETENfTUFYX01SVSkpOworCisJY2FyZC0+dHhfcmluZ19idWZmZXJzID0gbWluKGkgLyAyLCBNQVhfVFhfQlVGRkVSUyk7CisJY2FyZC0+cnhfcmluZ19idWZmZXJzID0gaSAtIGNhcmQtPnR4X3JpbmdfYnVmZmVyczsKKworCWNhcmQtPmJ1ZmZfb2Zmc2V0ID0gKHZhbGlkMCArIHZhbGlkMSkgKiBzaXplb2YocGt0X2Rlc2MpICoKKwkJKGNhcmQtPnR4X3JpbmdfYnVmZmVycyArIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJuMjogUklTQ29tL04yICV1IEtCIFJBTSwgSVJRJXUsICIKKwkgICAgICAgInVzaW5nICV1IFRYICsgJXUgUlggcGFja2V0cyByaW5nc1xuIiwgY2FyZC0+cmFtX3NpemUgLyAxMDI0LAorCSAgICAgICBjYXJkLT5pcnEsIGNhcmQtPnR4X3JpbmdfYnVmZmVycywgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKworCWlmIChjYXJkLT50eF9yaW5nX2J1ZmZlcnMgPCAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IFJBTSB0ZXN0IGZhaWxlZFxuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNyIHw9IFBDUl9SVU5TQ0E7CQkvKiBydW4gU0NBICovCisJb3V0YihwY3IsIGlvICsgTjJfUENSKTsKKwlvdXRiKDAsIGlvICsgTjJfTUNSKTsKKworCXNjYV9pbml0KGNhcmQsIDApOworCWZvciAoY250ID0gMDsgY250IDwgMjsgY250KyspIHsKKwkJcG9ydF90ICpwb3J0ID0gJmNhcmQtPnBvcnRzW2NudF07CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJCWlmICgoY250ID09IDAgJiYgIXZhbGlkMCkgfHwgKGNudCA9PSAxICYmICF2YWxpZDEpKQorCQkJY29udGludWU7CisKKwkJcG9ydC0+cGh5X25vZGUgPSBjbnQ7CisJCXBvcnQtPnZhbGlkID0gMTsKKworCQlpZiAoKGNudCA9PSAxKSAmJiB2YWxpZDApCisJCQlwb3J0LT5sb2dfbm9kZSA9IDE7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPm1lbV9zdGFydCA9IHdpbmJhc2U7CisJCWRldi0+bWVtX2VuZCA9IHdpbmJhc2UgKyBVU0VfV0lORE9XU0laRSAtIDE7CisJCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJCWRldi0+ZG9faW9jdGwgPSBuMl9pb2N0bDsKKwkJZGV2LT5vcGVuID0gbjJfb3BlbjsKKwkJZGV2LT5zdG9wID0gbjJfY2xvc2U7CisJCWhkbGMtPmF0dGFjaCA9IHNjYV9hdHRhY2g7CisJCWhkbGMtPnhtaXQgPSBzY2FfeG1pdDsKKwkJcG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsKKwkJcG9ydC0+Y2FyZCA9IGNhcmQ7CisKKwkJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm4yOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyAiCisJCQkgICAgICAgImRldmljZVxuIik7CisJCQlwb3J0LT5jYXJkID0gTlVMTDsKKwkJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlzY2FfaW5pdF9zeW5jX3BvcnQocG9ydCk7IC8qIFNldCB1cCBTQ0EgbWVtb3J5ICovCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJJU0NvbS9OMiBub2RlICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBwb3J0LT5waHlfbm9kZSk7CisJfQorCisJKm5ld19jYXJkID0gY2FyZDsKKwluZXdfY2FyZCA9ICZjYXJkLT5uZXh0X2NhcmQ7CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IG4yX2luaXQodm9pZCkKK3sKKwlpZiAoaHc9PU5VTEwpIHsKKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrKEtFUk5fSU5GTyAibjI6IG5vIGNhcmQgaW5pdGlhbGl6ZWRcbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5PU1lTOwkvKiBubyBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgYWJvcnQgKi8KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgaW8sIGlycSwgcmFtOworCQlsb25nIHZhbGlkWzJdID0geyAwLCAwIH07IC8qIERlZmF1bHQgPSBib3RoIHBvcnRzIGRpc2FibGVkICovCisKKwkJaW8gPSBzaW1wbGVfc3RydG91bChodywgJmh3LCAwKTsKKworCQlpZiAoKmh3KysgIT0gJywnKQorCQkJYnJlYWs7CisJCWlycSA9IHNpbXBsZV9zdHJ0b3VsKGh3LCAmaHcsIDApOworCisJCWlmICgqaHcrKyAhPSAnLCcpCisJCQlicmVhazsKKwkJcmFtID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodysrICE9ICcsJykKKwkJCWJyZWFrOworCQl3aGlsZSgxKSB7CisJCQlpZiAoKmh3ID09ICcwJyAmJiAhdmFsaWRbMF0pCisJCQkJdmFsaWRbMF0gPSAxOyAvKiBQb3J0IDAgZW5hYmxlZCAqLworCQkJZWxzZSBpZiAoKmh3ID09ICcxJyAmJiAhdmFsaWRbMV0pCisJCQkJdmFsaWRbMV0gPSAxOyAvKiBQb3J0IDEgZW5hYmxlZCAqLworCQkJZWxzZQorCQkJCWJyZWFrOworCQkJaHcrKzsKKwkJfQorCisJCWlmICghdmFsaWRbMF0gJiYgIXZhbGlkWzFdKQorCQkJYnJlYWs7CS8qIGF0IGxlYXN0IG9uZSBwb3J0IG11c3QgYmUgdXNlZCAqLworCisJCWlmICgqaHcgPT0gJzonIHx8ICpodyA9PSAnXHgwJykKKwkJCW4yX3J1bihpbywgaXJxLCByYW0sIHZhbGlkWzBdLCB2YWxpZFsxXSk7CisKKwkJaWYgKCpodyA9PSAnXHgwJykKKwkJCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7CisJfXdoaWxlKCpodysrID09ICc6Jyk7CisKKwlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIGhhcmR3YXJlIHBhcmFtZXRlcnNcbiIpOworCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IG4yX2NsZWFudXAodm9pZCkKK3sKKwljYXJkX3QgKmNhcmQgPSBmaXJzdF9jYXJkOworCisJd2hpbGUgKGNhcmQpIHsKKwkJY2FyZF90ICpwdHIgPSBjYXJkOworCQljYXJkID0gY2FyZC0+bmV4dF9jYXJkOworCQluMl9kZXN0cm95X2NhcmQocHRyKTsKKwl9Cit9CisKKworbW9kdWxlX2luaXQobjJfaW5pdCk7Cittb2R1bGVfZXhpdChuMl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUklTQ29tL04yIHNlcmlhbCBwb3J0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworbW9kdWxlX3BhcmFtKGh3LCBjaGFycCwgMDQ0NCk7CS8qIGh3PWlvLGlycSxyYW0scG9ydHM6aW8saXJxLC4uLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwLWZhbGMtbGguaCBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC1mYWxjLWxoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC1mYWxjLWxoLmgKQEAgLTAsMCArMSwxMjM4IEBACisvKgorICogZmFsYy5oCURlc2NyaXB0aW9uIG9mIHRoZSBTaWVtZW5zIEZBTEMgVDEvRTEgZnJhbWVyLgorICoKKyAqIEF1dGhvcjoJSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPgorICoKKyAqIENvcHlyaWdodDoJKGMpIDIwMDAtMjAwMSBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJExvZzogZmFsYy1saC5oLHYgJAorICogUmV2aXNpb24gMy4xICAyMDAxLzA2LzE1IDEyOjQxOjEwICByZWdpbmEKKyAqIHVwcGluZyBtYWpvciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDIwMDEvMDYvMTMgMjA6MjQ6NDcgIGRhbmllbGEKKyAqIFBDMzAwIGluaXRpYWwgQ1ZTIHZlcnNpb24gKDMuNC4wLXByZTEpCisgKgorICogUmV2aXNpb24gMS4xIDIwMDAvMDUvMTUgaXZhbgorICogSW5jbHVkZWQgREpBIGJpdHMgZm9yIHRoZSBMSU0yIHJlZ2lzdGVyLgorICoKKyAqIFJldmlzaW9uIDEuMCAyMDAwLzAyLzIyIGl2YW4KKyAqIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfRkFMQ19MSF9ICisjZGVmaW5lIF9GQUxDX0xIX0gKKworI2RlZmluZSBOVU1fT0ZfVDFfQ0hBTk5FTFMJMjQKKyNkZWZpbmUgTlVNX09GX0UxX0NIQU5ORUxTCTMyCisKKy8qPj4+Pj4+Pj4+Pj4+Pj4+Pj4gIEZBTEMgUmVnaXN0ZXIgQml0cyAoVHJhbnNtaXQgTW9kZSkgIDw8PDw8PDw8PDw8PDw8PDw8PDwgKi8KKworLyogQ01EUiAoQ29tbWFuZCBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ01EUl9STUMJMHg4MAorI2RlZmluZSBDTURSX1JSRVMJMHg0MAorI2RlZmluZSBDTURSX1hSRVAJMHgyMAorI2RlZmluZSBDTURSX1hSRVMJMHgxMAorI2RlZmluZSBDTURSX1hIRgkweDA4CisjZGVmaW5lIENNRFJfWFRGCTB4MDQKKyNkZWZpbmUgQ01EUl9YTUUJMHgwMgorI2RlZmluZSBDTURSX1NSRVMJMHgwMQorCisvKiBNT0RFIChNb2RlIFJlZ2lzdGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBNT0RFX01EUzIJMHg4MAorI2RlZmluZSBNT0RFX01EUzEJMHg0MAorI2RlZmluZSBNT0RFX01EUzAJMHgyMAorI2RlZmluZSBNT0RFX0JSQUMJMHgxMAorI2RlZmluZSBNT0RFX0hSQUMJMHgwOAorCisvKiBJUEMgKEludGVycnVwdCBQb3J0IENvbmZpZ3VyYXRpb24pCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIElQQ19WSVMJCTB4ODAKKyNkZWZpbmUgSVBDX1NDSQkJMHgwNAorI2RlZmluZSBJUENfSUMxCQkweDAyCisjZGVmaW5lIElQQ19JQzAJCTB4MDEKKworLyogQ0NSMSAoQ29tbW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ0NSMV9TRkxHICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NSMV9YVFMxNlJBICAgIDB4NDAKKyNkZWZpbmUgQ0NSMV9CUk0gICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NSMV9DQVNTWU0gICAgIDB4MjAKKyNkZWZpbmUgQ0NSMV9FRExYICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NSMV9FSVRTICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NSMV9JVEYgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0NSMV9SRlQxICAgICAgIDB4MDIKKyNkZWZpbmUgQ0NSMV9SRlQwICAgICAgIDB4MDEKKworLyogQ0NSMyAoQ29tbW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMykKKyAgIC0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDQ1IzX1BSRTEgICAgICAgMHg4MAorI2RlZmluZSBDQ1IzX1BSRTAgICAgICAgMHg0MAorI2RlZmluZSBDQ1IzX0VQVCAgICAgICAgMHgyMAorI2RlZmluZSBDQ1IzX1JBREQgICAgICAgMHgxMAorI2RlZmluZSBDQ1IzX1JDUkMgICAgICAgMHgwNAorI2RlZmluZSBDQ1IzX1hDUkMgICAgICAgMHgwMgorCisKKy8qIFJUUjEtNCAoUmVjZWl2ZSBUaW1lc2xvdCBSZWdpc3RlciAxLTQpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlRSMV9UUzAgICAgICAgIDB4ODAKKyNkZWZpbmUgUlRSMV9UUzEgICAgICAgIDB4NDAKKyNkZWZpbmUgUlRSMV9UUzIgICAgICAgIDB4MjAKKyNkZWZpbmUgUlRSMV9UUzMgICAgICAgIDB4MTAKKyNkZWZpbmUgUlRSMV9UUzQgICAgICAgIDB4MDgKKyNkZWZpbmUgUlRSMV9UUzUgICAgICAgIDB4MDQKKyNkZWZpbmUgUlRSMV9UUzYgICAgICAgIDB4MDIKKyNkZWZpbmUgUlRSMV9UUzcgICAgICAgIDB4MDEKKworI2RlZmluZSBSVFIyX1RTOCAgICAgICAgMHg4MAorI2RlZmluZSBSVFIyX1RTOSAgICAgICAgMHg0MAorI2RlZmluZSBSVFIyX1RTMTAgICAgICAgMHgyMAorI2RlZmluZSBSVFIyX1RTMTEgICAgICAgMHgxMAorI2RlZmluZSBSVFIyX1RTMTIgICAgICAgMHgwOAorI2RlZmluZSBSVFIyX1RTMTMgICAgICAgMHgwNAorI2RlZmluZSBSVFIyX1RTMTQgICAgICAgMHgwMgorI2RlZmluZSBSVFIyX1RTMTUgICAgICAgMHgwMQorCisjZGVmaW5lIFJUUjNfVFMxNiAgICAgICAweDgwCisjZGVmaW5lIFJUUjNfVFMxNyAgICAgICAweDQwCisjZGVmaW5lIFJUUjNfVFMxOCAgICAgICAweDIwCisjZGVmaW5lIFJUUjNfVFMxOSAgICAgICAweDEwCisjZGVmaW5lIFJUUjNfVFMyMCAgICAgICAweDA4CisjZGVmaW5lIFJUUjNfVFMyMSAgICAgICAweDA0CisjZGVmaW5lIFJUUjNfVFMyMiAgICAgICAweDAyCisjZGVmaW5lIFJUUjNfVFMyMyAgICAgICAweDAxCisKKyNkZWZpbmUgUlRSNF9UUzI0ICAgICAgIDB4ODAKKyNkZWZpbmUgUlRSNF9UUzI1ICAgICAgIDB4NDAKKyNkZWZpbmUgUlRSNF9UUzI2ICAgICAgIDB4MjAKKyNkZWZpbmUgUlRSNF9UUzI3ICAgICAgIDB4MTAKKyNkZWZpbmUgUlRSNF9UUzI4ICAgICAgIDB4MDgKKyNkZWZpbmUgUlRSNF9UUzI5ICAgICAgIDB4MDQKKyNkZWZpbmUgUlRSNF9UUzMwICAgICAgIDB4MDIKKyNkZWZpbmUgUlRSNF9UUzMxICAgICAgIDB4MDEKKworCisvKiBUVFIxLTQgKFRyYW5zbWl0IFRpbWVzbG90IFJlZ2lzdGVyIDEtNCkKKyAgIC0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBUVFIxX1RTMCAgICAgICAgMHg4MAorI2RlZmluZSBUVFIxX1RTMSAgICAgICAgMHg0MAorI2RlZmluZSBUVFIxX1RTMiAgICAgICAgMHgyMAorI2RlZmluZSBUVFIxX1RTMyAgICAgICAgMHgxMAorI2RlZmluZSBUVFIxX1RTNCAgICAgICAgMHgwOAorI2RlZmluZSBUVFIxX1RTNSAgICAgICAgMHgwNAorI2RlZmluZSBUVFIxX1RTNiAgICAgICAgMHgwMgorI2RlZmluZSBUVFIxX1RTNyAgICAgICAgMHgwMQorCisjZGVmaW5lIFRUUjJfVFM4ICAgICAgICAweDgwCisjZGVmaW5lIFRUUjJfVFM5ICAgICAgICAweDQwCisjZGVmaW5lIFRUUjJfVFMxMCAgICAgICAweDIwCisjZGVmaW5lIFRUUjJfVFMxMSAgICAgICAweDEwCisjZGVmaW5lIFRUUjJfVFMxMiAgICAgICAweDA4CisjZGVmaW5lIFRUUjJfVFMxMyAgICAgICAweDA0CisjZGVmaW5lIFRUUjJfVFMxNCAgICAgICAweDAyCisjZGVmaW5lIFRUUjJfVFMxNSAgICAgICAweDAxCisKKyNkZWZpbmUgVFRSM19UUzE2ICAgICAgIDB4ODAKKyNkZWZpbmUgVFRSM19UUzE3ICAgICAgIDB4NDAKKyNkZWZpbmUgVFRSM19UUzE4ICAgICAgIDB4MjAKKyNkZWZpbmUgVFRSM19UUzE5ICAgICAgIDB4MTAKKyNkZWZpbmUgVFRSM19UUzIwICAgICAgIDB4MDgKKyNkZWZpbmUgVFRSM19UUzIxICAgICAgIDB4MDQKKyNkZWZpbmUgVFRSM19UUzIyICAgICAgIDB4MDIKKyNkZWZpbmUgVFRSM19UUzIzICAgICAgIDB4MDEKKworI2RlZmluZSBUVFI0X1RTMjQgICAgICAgMHg4MAorI2RlZmluZSBUVFI0X1RTMjUgICAgICAgMHg0MAorI2RlZmluZSBUVFI0X1RTMjYgICAgICAgMHgyMAorI2RlZmluZSBUVFI0X1RTMjcgICAgICAgMHgxMAorI2RlZmluZSBUVFI0X1RTMjggICAgICAgMHgwOAorI2RlZmluZSBUVFI0X1RTMjkgICAgICAgMHgwNAorI2RlZmluZSBUVFI0X1RTMzAgICAgICAgMHgwMgorI2RlZmluZSBUVFI0X1RTMzEgICAgICAgMHgwMQorCisKKworLyogSU1SMC00IChJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAwLTQpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTVIwX1JNRSAgICAgICAgMHg4MAorI2RlZmluZSBJTVIwX1JGUyAgICAgICAgMHg0MAorI2RlZmluZSBJTVIwX1Q4TVMgICAgICAgMHgyMAorI2RlZmluZSBJTVIwX0lTRiAgICAgICAgMHgyMAorI2RlZmluZSBJTVIwX1JNQiAgICAgICAgMHgxMAorI2RlZmluZSBJTVIwX0NBU0MgICAgICAgMHgwOAorI2RlZmluZSBJTVIwX1JTQyAgICAgICAgMHgwOAorI2RlZmluZSBJTVIwX0NSQzYgICAgICAgMHgwNAorI2RlZmluZSBJTVIwX0NSQzQgICAgICAgMHgwNAorI2RlZmluZSBJTVIwX1BERU4JMHgwMgorI2RlZmluZSBJTVIwX1JQRiAgICAgICAgMHgwMQorCisjZGVmaW5lIElNUjFfQ0FTRSAgICAgICAweDgwCisjZGVmaW5lIElNUjFfUkRPICAgICAgICAweDQwCisjZGVmaW5lIElNUjFfQUxMUyAgICAgICAweDIwCisjZGVmaW5lIElNUjFfWERVICAgICAgICAweDEwCisjZGVmaW5lIElNUjFfWE1CICAgICAgICAweDA4CisjZGVmaW5lIElNUjFfWExTQyAgICAgICAweDAyCisjZGVmaW5lIElNUjFfWFBSICAgICAgICAweDAxCisjZGVmaW5lIElNUjFfTExCU0MJMHg4MAorCisjZGVmaW5lIElNUjJfRkFSICAgICAgICAweDgwCisjZGVmaW5lIElNUjJfTEZBICAgICAgICAweDQwCisjZGVmaW5lIElNUjJfTUZBUiAgICAgICAweDIwCisjZGVmaW5lIElNUjJfVDQwME1TICAgICAweDEwCisjZGVmaW5lIElNUjJfTE1GQSAgICAgICAweDEwCisjZGVmaW5lIElNUjJfQUlTICAgICAgICAweDA4CisjZGVmaW5lIElNUjJfTE9TICAgICAgICAweDA0CisjZGVmaW5lIElNUjJfUkFSICAgICAgICAweDAyCisjZGVmaW5lIElNUjJfUkEgICAgICAgICAweDAxCisKKyNkZWZpbmUgSU1SM19FUyAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1SM19TRUMgICAgICAgIDB4NDAKKyNkZWZpbmUgSU1SM19MTUZBMTYgICAgIDB4MjAKKyNkZWZpbmUgSU1SM19BSVMxNiAgICAgIDB4MTAKKyNkZWZpbmUgSU1SM19SQTE2ICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SM19BUEkgICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SM19YU0xQICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SM19YU0xOICAgICAgIDB4MTAKKyNkZWZpbmUgSU1SM19MTEJTQyAgICAgIDB4MDgKKyNkZWZpbmUgSU1SM19YUlMgICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SM19TTE4gICAgICAgIDB4MDIKKyNkZWZpbmUgSU1SM19TTFAgICAgICAgIDB4MDEKKworI2RlZmluZSBJTVI0X0xGQSAgICAgICAgMHg4MAorI2RlZmluZSBJTVI0X0ZFUiAgICAgICAgMHg0MAorI2RlZmluZSBJTVI0X0NFUiAgICAgICAgMHgyMAorI2RlZmluZSBJTVI0X0FJUyAgICAgICAgMHgxMAorI2RlZmluZSBJTVI0X0xPUyAgICAgICAgMHgwOAorI2RlZmluZSBJTVI0X0NWRSAgICAgICAgMHgwNAorI2RlZmluZSBJTVI0X1NMSVAgICAgICAgMHgwMgorI2RlZmluZSBJTVI0X0VCRSAgICAgICAgMHgwMQorCisvKiBGTVIwLTUgZm9yIEUxIGFuZCBUMSAgKEZyYW1lciBNb2RlIFJlZ2lzdGVyICkgKi8KKworI2RlZmluZSBGTVIwX1hDMSAgICAgICAgMHg4MAorI2RlZmluZSBGTVIwX1hDMCAgICAgICAgMHg0MAorI2RlZmluZSBGTVIwX1JDMSAgICAgICAgMHgyMAorI2RlZmluZSBGTVIwX1JDMCAgICAgICAgMHgxMAorI2RlZmluZSBGTVIwX0VYVEQgICAgICAgMHgwOAorI2RlZmluZSBGTVIwX0FMTSAgICAgICAgMHgwNAorI2RlZmluZSBFMV9GTVIwX0ZSUyAgICAgMHgwMgorI2RlZmluZSBUMV9GTVIwX0ZSUyAgICAgMHgwOAorI2RlZmluZSBGTVIwX1NSQUYgICAgICAgMHgwNAorI2RlZmluZSBGTVIwX0VYTFMgICAgICAgMHgwMgorI2RlZmluZSBGTVIwX1NJTSAgICAgICAgMHgwMQorCisjZGVmaW5lIEZNUjFfTUZDUyAgICAgICAweDgwCisjZGVmaW5lIEZNUjFfQUZSICAgICAgICAweDQwCisjZGVmaW5lIEZNUjFfRU5TQSAgICAgICAweDIwCisjZGVmaW5lIEZNUjFfQ1RNICAgICAgICAweDgwCisjZGVmaW5lIEZNUjFfU0lHTSAgICAgICAweDQwCisjZGVmaW5lIEZNUjFfRURMICAgICAgICAweDIwCisjZGVmaW5lIEZNUjFfUE1PRCAgICAgICAweDEwCisjZGVmaW5lIEZNUjFfWEZTICAgICAgICAweDA4CisjZGVmaW5lIEZNUjFfQ1JDICAgICAgICAweDA4CisjZGVmaW5lIEZNUjFfRUNNICAgICAgICAweDA0CisjZGVmaW5lIEZNUjFfSU1PRCAgICAgICAweDAyCisjZGVmaW5lIEZNUjFfWEFJUyAgICAgICAweDAxCisKKyNkZWZpbmUgRk1SMl9SRlMxICAgICAgIDB4ODAKKyNkZWZpbmUgRk1SMl9SRlMwICAgICAgIDB4NDAKKyNkZWZpbmUgRk1SMl9NQ1NQCTB4NDAKKyNkZWZpbmUgRk1SMl9SVE0gICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SMl9TU1AgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SMl9EQUlTICAgICAgIDB4MTAKKyNkZWZpbmUgRk1SMl9TQUlTICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SMl9QTEIgICAgICAgIDB4MDQKKyNkZWZpbmUgRk1SMl9BWFJBICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SMl9BTE1GICAgICAgIDB4MDEKKyNkZWZpbmUgRk1SMl9FWFpFICAgICAgIDB4MDEKKworI2RlZmluZSBMT09QX1JUTQkweDQwCisjZGVmaW5lIExPT1BfU0ZNCTB4NDAKKyNkZWZpbmUgTE9PUF9FQ0xCCTB4MjAKKyNkZWZpbmUgTE9PUF9DTEEJMHgxZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRk1SM19YTEQJMHgyMAorI2RlZmluZSBGTVIzX1hMVQkweDEwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBGTVI0X0FJUzMgICAgICAgMHg4MAorI2RlZmluZSBGTVI0X1RNICAgICAgICAgMHg0MAorI2RlZmluZSBGTVI0X1hSQSAgICAgICAgMHgyMAorI2RlZmluZSBGTVI0X1NTQzEgICAgICAgMHgxMAorI2RlZmluZSBGTVI0X1NTQzAgICAgICAgMHgwOAorI2RlZmluZSBGTVI0X0FVVE8gICAgICAgMHgwNAorI2RlZmluZSBGTVI0X0ZNMSAgICAgICAgMHgwMgorI2RlZmluZSBGTVI0X0ZNMCAgICAgICAgMHgwMQorCisjZGVmaW5lIEZNUjVfU1JTICAgICAgICAweDgwCisjZGVmaW5lIEZNUjVfRUlCUiAgICAgICAweDQwCisjZGVmaW5lIEZNUjVfWExEICAgICAgICAweDIwCisjZGVmaW5lIEZNUjVfWExVICAgICAgICAweDEwCisKKworLyogTE9PUCAoQ2hhbm5lbCBMb29wIEJhY2spCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMT09QX1NGTSAgICAgICAgMHg0MAorI2RlZmluZSBMT09QX0VDTEIgICAgICAgMHgyMAorI2RlZmluZSBMT09QX0NMQTQgICAgICAgMHgxMAorI2RlZmluZSBMT09QX0NMQTMgICAgICAgMHgwOAorI2RlZmluZSBMT09QX0NMQTIgICAgICAgMHgwNAorI2RlZmluZSBMT09QX0NMQTEgICAgICAgMHgwMgorI2RlZmluZSBMT09QX0NMQTAgICAgICAgMHgwMQorCisKKworLyogWFNXIChUcmFuc21pdCBTZXJ2aWNlIFdvcmQgUHVsc2VmcmFtZSkKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYU1dfWFNJUyAgICAgICAgMHg4MAorI2RlZmluZSBYU1dfWFRNICAgICAgICAgMHg0MAorI2RlZmluZSBYU1dfWFJBICAgICAgICAgMHgyMAorI2RlZmluZSBYU1dfWFkwICAgICAgICAgMHgxMAorI2RlZmluZSBYU1dfWFkxICAgICAgICAgMHgwOAorI2RlZmluZSBYU1dfWFkyICAgICAgICAgMHgwNAorI2RlZmluZSBYU1dfWFkzICAgICAgICAgMHgwMgorI2RlZmluZSBYU1dfWFk0ICAgICAgICAgMHgwMQorCisKKy8qIFhTUCAoVHJhbnNtaXQgU3BhcmUgQml0cykKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYU1BfWEFQICAgICAgICAgMHg4MAorI2RlZmluZSBYU1BfQ0FTRU4gICAgICAgMHg0MAorI2RlZmluZSBYU1BfVFQwICAgICAgICAgMHgyMAorI2RlZmluZSBYU1BfRUJQICAgICAgICAgMHgxMAorI2RlZmluZSBYU1BfQVhTICAgICAgICAgMHgwOAorI2RlZmluZSBYU1BfWFNJRiAgICAgICAgMHgwNAorI2RlZmluZSBYU1BfWFMxMyAgICAgICAgMHgwMgorI2RlZmluZSBYU1BfWFMxNSAgICAgICAgMHgwMQorCisKKy8qIFhDMC8xIChUcmFuc21pdCBDb250cm9sIDAvMSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYQzBfU0E4RSAgICAgICAgMHg4MAorI2RlZmluZSBYQzBfU0E3RSAgICAgICAgMHg0MAorI2RlZmluZSBYQzBfU0E2RSAgICAgICAgMHgyMAorI2RlZmluZSBYQzBfU0E1RSAgICAgICAgMHgxMAorI2RlZmluZSBYQzBfU0E0RSAgICAgICAgMHgwOAorI2RlZmluZSBYQzBfQlJNICAgICAgICAgMHg4MAorI2RlZmluZSBYQzBfTUZCUyAgICAgICAgMHg0MAorI2RlZmluZSBYQzBfU0ZSWiAgICAgICAgMHgxMAorI2RlZmluZSBYQzBfWENPMiAgICAgICAgMHgwNAorI2RlZmluZSBYQzBfWENPMSAgICAgICAgMHgwMgorI2RlZmluZSBYQzBfWENPMCAgICAgICAgMHgwMQorCisjZGVmaW5lIFhDMV9YVE81ICAgICAgICAweDIwCisjZGVmaW5lIFhDMV9YVE80ICAgICAgICAweDEwCisjZGVmaW5lIFhDMV9YVE8zICAgICAgICAweDA4CisjZGVmaW5lIFhDMV9YVE8yICAgICAgICAweDA0CisjZGVmaW5lIFhDMV9YVE8xICAgICAgICAweDAyCisjZGVmaW5lIFhDMV9YVE8wICAgICAgICAweDAxCisKKworLyogUkMwLzEgKFJlY2VpdmUgQ29udHJvbCAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUkMwX1NJQ1MgICAgICAgIDB4NDAKKyNkZWZpbmUgUkMwX0NSQ0kgICAgICAgIDB4MjAKKyNkZWZpbmUgUkMwX1hDUkNJICAgICAgIDB4MTAKKyNkZWZpbmUgUkMwX1JESVMgICAgICAgIDB4MDgKKyNkZWZpbmUgUkMwX1JDTzIgICAgICAgIDB4MDQKKyNkZWZpbmUgUkMwX1JDTzEgICAgICAgIDB4MDIKKyNkZWZpbmUgUkMwX1JDTzAgICAgICAgIDB4MDEKKworI2RlZmluZSBSQzFfU1dEICAgICAgICAgMHg4MAorI2RlZmluZSBSQzFfQVNZNCAgICAgICAgMHg0MAorI2RlZmluZSBSQzFfUlJBTSAgICAgICAgMHg0MAorI2RlZmluZSBSQzFfUlRPNSAgICAgICAgMHgyMAorI2RlZmluZSBSQzFfUlRPNCAgICAgICAgMHgxMAorI2RlZmluZSBSQzFfUlRPMyAgICAgICAgMHgwOAorI2RlZmluZSBSQzFfUlRPMiAgICAgICAgMHgwNAorI2RlZmluZSBSQzFfUlRPMSAgICAgICAgMHgwMgorI2RlZmluZSBSQzFfUlRPMCAgICAgICAgMHgwMQorCisKKworLyogWFBNMC0yIChUcmFuc21pdCBQdWxzZSBNYXNrIDAtMikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYUE0wX1hQMTIgICAgICAgMHg4MAorI2RlZmluZSBYUE0wX1hQMTEgICAgICAgMHg0MAorI2RlZmluZSBYUE0wX1hQMTAgICAgICAgMHgyMAorI2RlZmluZSBYUE0wX1hQMDQgICAgICAgMHgxMAorI2RlZmluZSBYUE0wX1hQMDMgICAgICAgMHgwOAorI2RlZmluZSBYUE0wX1hQMDIgICAgICAgMHgwNAorI2RlZmluZSBYUE0wX1hQMDEgICAgICAgMHgwMgorI2RlZmluZSBYUE0wX1hQMDAgICAgICAgMHgwMQorCisjZGVmaW5lIFhQTTFfWFAzMCAgICAgICAweDgwCisjZGVmaW5lIFhQTTFfWFAyNCAgICAgICAweDQwCisjZGVmaW5lIFhQTTFfWFAyMyAgICAgICAweDIwCisjZGVmaW5lIFhQTTFfWFAyMiAgICAgICAweDEwCisjZGVmaW5lIFhQTTFfWFAyMSAgICAgICAweDA4CisjZGVmaW5lIFhQTTFfWFAyMCAgICAgICAweDA0CisjZGVmaW5lIFhQTTFfWFAxNCAgICAgICAweDAyCisjZGVmaW5lIFhQTTFfWFAxMyAgICAgICAweDAxCisKKyNkZWZpbmUgWFBNMl9YTEhQICAgICAgIDB4ODAKKyNkZWZpbmUgWFBNMl9YTFQgICAgICAgIDB4NDAKKyNkZWZpbmUgWFBNMl9EQVhMVCAgICAgIDB4MjAKKyNkZWZpbmUgWFBNMl9YUDM0ICAgICAgIDB4MDgKKyNkZWZpbmUgWFBNMl9YUDMzICAgICAgIDB4MDQKKyNkZWZpbmUgWFBNMl9YUDMyICAgICAgIDB4MDIKKyNkZWZpbmUgWFBNMl9YUDMxICAgICAgIDB4MDEKKworCisvKiBUU1dNIChUcmFuc3BhcmVudCBTZXJ2aWNlIFdvcmQgTWFzaykKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVFNXTV9UU0lTICAgICAgIDB4ODAKKyNkZWZpbmUgVFNXTV9UU0lGICAgICAgIDB4NDAKKyNkZWZpbmUgVFNXTV9UUkEgICAgICAgIDB4MjAKKyNkZWZpbmUgVFNXTV9UU0E0ICAgICAgIDB4MTAKKyNkZWZpbmUgVFNXTV9UU0E1ICAgICAgIDB4MDgKKyNkZWZpbmUgVFNXTV9UU0E2ICAgICAgIDB4MDQKKyNkZWZpbmUgVFNXTV9UU0E3ICAgICAgIDB4MDIKKyNkZWZpbmUgVFNXTV9UU0E4ICAgICAgIDB4MDEKKworLyogSURMRSA8SWRsZSBDaGFubmVsIENvZGUgUmVnaXN0ZXI+CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSURMRV9JREw3ICAgICAgIDB4ODAKKyNkZWZpbmUgSURMRV9JREw2ICAgICAgIDB4NDAKKyNkZWZpbmUgSURMRV9JREw1ICAgICAgIDB4MjAKKyNkZWZpbmUgSURMRV9JREw0ICAgICAgIDB4MTAKKyNkZWZpbmUgSURMRV9JREwzICAgICAgIDB4MDgKKyNkZWZpbmUgSURMRV9JREwyICAgICAgIDB4MDQKKyNkZWZpbmUgSURMRV9JREwxICAgICAgIDB4MDIKKyNkZWZpbmUgSURMRV9JREwwICAgICAgIDB4MDEKKworCisvKiBYU0E0LTggPFRyYW5zbWl0IFNBNC04IFJlZ2lzdGVyKFJlYWQvV3JpdGUpID4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS1FMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFhTQTRfWFM0NyAgICAgICAweDgwCisjZGVmaW5lIFhTQTRfWFM0NiAgICAgICAweDQwCisjZGVmaW5lIFhTQTRfWFM0NSAgICAgICAweDIwCisjZGVmaW5lIFhTQTRfWFM0NCAgICAgICAweDEwCisjZGVmaW5lIFhTQTRfWFM0MyAgICAgICAweDA4CisjZGVmaW5lIFhTQTRfWFM0MiAgICAgICAweDA0CisjZGVmaW5lIFhTQTRfWFM0MSAgICAgICAweDAyCisjZGVmaW5lIFhTQTRfWFM0MCAgICAgICAweDAxCisKKyNkZWZpbmUgWFNBNV9YUzU3ICAgICAgIDB4ODAKKyNkZWZpbmUgWFNBNV9YUzU2ICAgICAgIDB4NDAKKyNkZWZpbmUgWFNBNV9YUzU1ICAgICAgIDB4MjAKKyNkZWZpbmUgWFNBNV9YUzU0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFNBNV9YUzUzICAgICAgIDB4MDgKKyNkZWZpbmUgWFNBNV9YUzUyICAgICAgIDB4MDQKKyNkZWZpbmUgWFNBNV9YUzUxICAgICAgIDB4MDIKKyNkZWZpbmUgWFNBNV9YUzUwICAgICAgIDB4MDEKKworI2RlZmluZSBYU0E2X1hTNjcgICAgICAgMHg4MAorI2RlZmluZSBYU0E2X1hTNjYgICAgICAgMHg0MAorI2RlZmluZSBYU0E2X1hTNjUgICAgICAgMHgyMAorI2RlZmluZSBYU0E2X1hTNjQgICAgICAgMHgxMAorI2RlZmluZSBYU0E2X1hTNjMgICAgICAgMHgwOAorI2RlZmluZSBYU0E2X1hTNjIgICAgICAgMHgwNAorI2RlZmluZSBYU0E2X1hTNjEgICAgICAgMHgwMgorI2RlZmluZSBYU0E2X1hTNjAgICAgICAgMHgwMQorCisjZGVmaW5lIFhTQTdfWFM3NyAgICAgICAweDgwCisjZGVmaW5lIFhTQTdfWFM3NiAgICAgICAweDQwCisjZGVmaW5lIFhTQTdfWFM3NSAgICAgICAweDIwCisjZGVmaW5lIFhTQTdfWFM3NCAgICAgICAweDEwCisjZGVmaW5lIFhTQTdfWFM3MyAgICAgICAweDA4CisjZGVmaW5lIFhTQTdfWFM3MiAgICAgICAweDA0CisjZGVmaW5lIFhTQTdfWFM3MSAgICAgICAweDAyCisjZGVmaW5lIFhTQTdfWFM3MCAgICAgICAweDAxCisKKyNkZWZpbmUgWFNBOF9YUzg3ICAgICAgIDB4ODAKKyNkZWZpbmUgWFNBOF9YUzg2ICAgICAgIDB4NDAKKyNkZWZpbmUgWFNBOF9YUzg1ICAgICAgIDB4MjAKKyNkZWZpbmUgWFNBOF9YUzg0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFNBOF9YUzgzICAgICAgIDB4MDgKKyNkZWZpbmUgWFNBOF9YUzgyICAgICAgIDB4MDQKKyNkZWZpbmUgWFNBOF9YUzgxICAgICAgIDB4MDIKKyNkZWZpbmUgWFNBOF9YUzgwICAgICAgIDB4MDEKKworCisvKiBYREwxLTMgKFRyYW5zbWl0IERMLUJpdCBSZWdpc3RlcjEtMyAocmVhZC93cml0ZSkpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYREwxX1hETDE3ICAgICAgMHg4MAorI2RlZmluZSBYREwxX1hETDE2ICAgICAgMHg0MAorI2RlZmluZSBYREwxX1hETDE1ICAgICAgMHgyMAorI2RlZmluZSBYREwxX1hETDE0ICAgICAgMHgxMAorI2RlZmluZSBYREwxX1hETDEzICAgICAgMHgwOAorI2RlZmluZSBYREwxX1hETDEyICAgICAgMHgwNAorI2RlZmluZSBYREwxX1hETDExICAgICAgMHgwMgorI2RlZmluZSBYREwxX1hETDEwICAgICAgMHgwMQorCisjZGVmaW5lIFhETDJfWERMMjcgICAgICAweDgwCisjZGVmaW5lIFhETDJfWERMMjYgICAgICAweDQwCisjZGVmaW5lIFhETDJfWERMMjUgICAgICAweDIwCisjZGVmaW5lIFhETDJfWERMMjQgICAgICAweDEwCisjZGVmaW5lIFhETDJfWERMMjMgICAgICAweDA4CisjZGVmaW5lIFhETDJfWERMMjIgICAgICAweDA0CisjZGVmaW5lIFhETDJfWERMMjEgICAgICAweDAyCisjZGVmaW5lIFhETDJfWERMMjAgICAgICAweDAxCisKKyNkZWZpbmUgWERMM19YREwzNyAgICAgIDB4ODAKKyNkZWZpbmUgWERMM19YREwzNiAgICAgIDB4NDAKKyNkZWZpbmUgWERMM19YREwzNSAgICAgIDB4MjAKKyNkZWZpbmUgWERMM19YREwzNCAgICAgIDB4MTAKKyNkZWZpbmUgWERMM19YREwzMyAgICAgIDB4MDgKKyNkZWZpbmUgWERMM19YREwzMiAgICAgIDB4MDQKKyNkZWZpbmUgWERMM19YREwzMSAgICAgIDB4MDIKKyNkZWZpbmUgWERMM19YREwzMCAgICAgIDB4MDEKKworCisvKiBJQ0IxLTQgKElkbGUgQ2hhbm5lbCBSZWdpc3RlciAxLTQpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEUxX0lDQjFfSUMwCTB4ODAKKyNkZWZpbmUgRTFfSUNCMV9JQzEJMHg0MAorI2RlZmluZSBFMV9JQ0IxX0lDMgkweDIwCisjZGVmaW5lIEUxX0lDQjFfSUMzCTB4MTAKKyNkZWZpbmUgRTFfSUNCMV9JQzQJMHgwOAorI2RlZmluZSBFMV9JQ0IxX0lDNQkweDA0CisjZGVmaW5lIEUxX0lDQjFfSUM2CTB4MDIKKyNkZWZpbmUgRTFfSUNCMV9JQzcJMHgwMQorCisjZGVmaW5lIEUxX0lDQjJfSUM4CTB4ODAKKyNkZWZpbmUgRTFfSUNCMl9JQzkJMHg0MAorI2RlZmluZSBFMV9JQ0IyX0lDMTAJMHgyMAorI2RlZmluZSBFMV9JQ0IyX0lDMTEJMHgxMAorI2RlZmluZSBFMV9JQ0IyX0lDMTIJMHgwOAorI2RlZmluZSBFMV9JQ0IyX0lDMTMJMHgwNAorI2RlZmluZSBFMV9JQ0IyX0lDMTQJMHgwMgorI2RlZmluZSBFMV9JQ0IyX0lDMTUJMHgwMQorCisjZGVmaW5lIEUxX0lDQjNfSUMxNgkweDgwCisjZGVmaW5lIEUxX0lDQjNfSUMxNwkweDQwCisjZGVmaW5lIEUxX0lDQjNfSUMxOAkweDIwCisjZGVmaW5lIEUxX0lDQjNfSUMxOQkweDEwCisjZGVmaW5lIEUxX0lDQjNfSUMyMAkweDA4CisjZGVmaW5lIEUxX0lDQjNfSUMyMQkweDA0CisjZGVmaW5lIEUxX0lDQjNfSUMyMgkweDAyCisjZGVmaW5lIEUxX0lDQjNfSUMyMwkweDAxCisKKyNkZWZpbmUgRTFfSUNCNF9JQzI0CTB4ODAKKyNkZWZpbmUgRTFfSUNCNF9JQzI1CTB4NDAKKyNkZWZpbmUgRTFfSUNCNF9JQzI2CTB4MjAKKyNkZWZpbmUgRTFfSUNCNF9JQzI3CTB4MTAKKyNkZWZpbmUgRTFfSUNCNF9JQzI4CTB4MDgKKyNkZWZpbmUgRTFfSUNCNF9JQzI5CTB4MDQKKyNkZWZpbmUgRTFfSUNCNF9JQzMwCTB4MDIKKyNkZWZpbmUgRTFfSUNCNF9JQzMxCTB4MDEKKworLyogSUNCMS00IChJZGxlIENoYW5uZWwgUmVnaXN0ZXIgMS00KQorICAgLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBUMV9JQ0IxX0lDMQkweDgwCisjZGVmaW5lIFQxX0lDQjFfSUMyCTB4NDAKKyNkZWZpbmUgVDFfSUNCMV9JQzMJMHgyMAorI2RlZmluZSBUMV9JQ0IxX0lDNAkweDEwCisjZGVmaW5lIFQxX0lDQjFfSUM1CTB4MDgKKyNkZWZpbmUgVDFfSUNCMV9JQzYJMHgwNAorI2RlZmluZSBUMV9JQ0IxX0lDNwkweDAyCisjZGVmaW5lIFQxX0lDQjFfSUM4CTB4MDEKKworI2RlZmluZSBUMV9JQ0IyX0lDOQkweDgwCisjZGVmaW5lIFQxX0lDQjJfSUMxMAkweDQwCisjZGVmaW5lIFQxX0lDQjJfSUMxMQkweDIwCisjZGVmaW5lIFQxX0lDQjJfSUMxMgkweDEwCisjZGVmaW5lIFQxX0lDQjJfSUMxMwkweDA4CisjZGVmaW5lIFQxX0lDQjJfSUMxNAkweDA0CisjZGVmaW5lIFQxX0lDQjJfSUMxNQkweDAyCisjZGVmaW5lIFQxX0lDQjJfSUMxNgkweDAxCisKKyNkZWZpbmUgVDFfSUNCM19JQzE3CTB4ODAKKyNkZWZpbmUgVDFfSUNCM19JQzE4CTB4NDAKKyNkZWZpbmUgVDFfSUNCM19JQzE5CTB4MjAKKyNkZWZpbmUgVDFfSUNCM19JQzIwCTB4MTAKKyNkZWZpbmUgVDFfSUNCM19JQzIxCTB4MDgKKyNkZWZpbmUgVDFfSUNCM19JQzIyCTB4MDQKKyNkZWZpbmUgVDFfSUNCM19JQzIzCTB4MDIKKyNkZWZpbmUgVDFfSUNCM19JQzI0CTB4MDEKKworLyogRk1SMyAoRnJhbWVyIE1vZGUgUmVnaXN0ZXIgMykKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tRTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGTVIzX0NNSSAgICAgICAgMHgwOAorI2RlZmluZSBGTVIzX1NZTlNBICAgICAgMHgwNAorI2RlZmluZSBGTVIzX0NGUlogICAgICAgMHgwMgorI2RlZmluZSBGTVIzX0VYVElXICAgICAgMHgwMQorCisKKworLyogQ0NCMS0zIChDbGVhciBDaGFubmVsIFJlZ2lzdGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENDQjFfQ0gxICAgICAgICAweDgwCisjZGVmaW5lIENDQjFfQ0gyICAgICAgICAweDQwCisjZGVmaW5lIENDQjFfQ0gzICAgICAgICAweDIwCisjZGVmaW5lIENDQjFfQ0g0ICAgICAgICAweDEwCisjZGVmaW5lIENDQjFfQ0g1ICAgICAgICAweDA4CisjZGVmaW5lIENDQjFfQ0g2ICAgICAgICAweDA0CisjZGVmaW5lIENDQjFfQ0g3ICAgICAgICAweDAyCisjZGVmaW5lIENDQjFfQ0g4ICAgICAgICAweDAxCisKKyNkZWZpbmUgQ0NCMl9DSDkgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NCMl9DSDEwICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NCMl9DSDExICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NCMl9DSDEyICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NCMl9DSDEzICAgICAgIDB4MDgKKyNkZWZpbmUgQ0NCMl9DSDE0ICAgICAgIDB4MDQKKyNkZWZpbmUgQ0NCMl9DSDE1ICAgICAgIDB4MDIKKyNkZWZpbmUgQ0NCMl9DSDE2ICAgICAgIDB4MDEKKworI2RlZmluZSBDQ0IzX0NIMTcgICAgICAgMHg4MAorI2RlZmluZSBDQ0IzX0NIMTggICAgICAgMHg0MAorI2RlZmluZSBDQ0IzX0NIMTkgICAgICAgMHgyMAorI2RlZmluZSBDQ0IzX0NIMjAgICAgICAgMHgxMAorI2RlZmluZSBDQ0IzX0NIMjEgICAgICAgMHgwOAorI2RlZmluZSBDQ0IzX0NIMjIgICAgICAgMHgwNAorI2RlZmluZSBDQ0IzX0NIMjMgICAgICAgMHgwMgorI2RlZmluZSBDQ0IzX0NIMjQgICAgICAgMHgwMQorCisKKy8qIExJTTAvMSAoTGluZSBJbnRlcmZhY2UgTW9kZSAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElNMF9YRkIgICAgICAgIDB4ODAKKyNkZWZpbmUgTElNMF9YRE9TICAgICAgIDB4NDAKKyNkZWZpbmUgTElNMF9TQ0wxICAgICAgIDB4MjAKKyNkZWZpbmUgTElNMF9TQ0wwICAgICAgIDB4MTAKKyNkZWZpbmUgTElNMF9FUU9OICAgICAgIDB4MDgKKyNkZWZpbmUgTElNMF9FTE9TICAgICAgIDB4MDQKKyNkZWZpbmUgTElNMF9MTCAgICAgICAgIDB4MDIKKyNkZWZpbmUgTElNMF9NQVMgICAgICAgIDB4MDEKKworI2RlZmluZSBMSU0xX0VGU0MgICAgICAgMHg4MAorI2RlZmluZSBMSU0xX1JJTDIgICAgICAgMHg0MAorI2RlZmluZSBMSU0xX1JJTDEgICAgICAgMHgyMAorI2RlZmluZSBMSU0xX1JJTDAgICAgICAgMHgxMAorI2RlZmluZSBMSU0xX0RDT0MgICAgICAgMHgwOAorI2RlZmluZSBMSU0xX0pBVFQgICAgICAgMHgwNAorI2RlZmluZSBMSU0xX1JMICAgICAgICAgMHgwMgorI2RlZmluZSBMSU0xX0RSUyAgICAgICAgMHgwMQorCisKKy8qIFBDRFIgKFB1bHNlIENvdW50IERldGVjdGlvbiBSZWdpc3RlcihSZWFkL1dyaXRlKSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQQ0RSX1BDRDcJMHg4MAorI2RlZmluZSBQQ0RSX1BDRDYJMHg0MAorI2RlZmluZSBQQ0RSX1BDRDUJMHgyMAorI2RlZmluZSBQQ0RSX1BDRDQJMHgxMAorI2RlZmluZSBQQ0RSX1BDRDMJMHgwOAorI2RlZmluZSBQQ0RSX1BDRDIJMHgwNAorI2RlZmluZSBQQ0RSX1BDRDEJMHgwMgorI2RlZmluZSBQQ0RSX1BDRDAJMHgwMQorCisjZGVmaW5lIFBDUlJfUENSNwkweDgwCisjZGVmaW5lIFBDUlJfUENSNgkweDQwCisjZGVmaW5lIFBDUlJfUENSNQkweDIwCisjZGVmaW5lIFBDUlJfUENSNAkweDEwCisjZGVmaW5lIFBDUlJfUENSMwkweDA4CisjZGVmaW5lIFBDUlJfUENSMgkweDA0CisjZGVmaW5lIFBDUlJfUENSMQkweDAyCisjZGVmaW5lIFBDUlJfUENSMAkweDAxCisKKworLyogTElNMiAoTGluZSBJbnRlcmZhY2UgTW9kZSAyKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElNMl9ESkEyCTB4MjAKKyNkZWZpbmUgTElNMl9ESkExCTB4MTAKKyNkZWZpbmUgTElNMl9MT1MyCTB4MDIKKyNkZWZpbmUgTElNMl9MT1MxCTB4MDEKKworLyogTENSMSAoTG9vcCBDb2RlIFJlZ2lzdGVyIDEpICovCisKKyNkZWZpbmUgTENSMV9FUFJNCTB4ODAKKyNkZWZpbmUJTENSMV9YUFJCUwkweDQwCisKKy8qIFNJQzEgKFN5c3RlbSBJbnRlcmZhY2UgQ29udHJvbCAxKSAqLworI2RlZmluZSBTSUMxX1NSU0MJMHg4MAorI2RlZmluZSBTSUMxX1JCUzEJMHgyMAorI2RlZmluZSBTSUMxX1JCUzAJMHgxMAorI2RlZmluZSBTSUMxX1NYU0MJMHgwOAorI2RlZmluZSBTSUMxX1hCUzEJMHgwMgorI2RlZmluZSBTSUMxX1hCUzAJMHgwMQorCisvKiBERUMgKERpc2FibGUgRXJyb3IgQ291bnRlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBERUNfRENFQzMgICAgICAgMHgyMAorI2RlZmluZSBERUNfREJFQyAgICAgICAgMHgxMAorI2RlZmluZSBERUNfRENFQzEgICAgICAgMHgwOAorI2RlZmluZSBERUNfRENFQyAgICAgICAgMHgwOAorI2RlZmluZSBERUNfREVCQyAgICAgICAgMHgwNAorI2RlZmluZSBERUNfRENWQyAgICAgICAgMHgwMgorI2RlZmluZSBERUNfREZFQyAgICAgICAgMHgwMQorCisKKy8qIEZBTEMgUmVnaXN0ZXIgQml0cyAoUmVjZWl2ZSBNb2RlKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIEZSUzAvMSAoRnJhbWVyIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyIDAvMSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZSUzBfTE9TICAgICAgICAweDgwCisjZGVmaW5lIEZSUzBfQUlTICAgICAgICAweDQwCisjZGVmaW5lIEZSUzBfTEZBICAgICAgICAweDIwCisjZGVmaW5lIEZSUzBfUlJBICAgICAgICAweDEwCisjZGVmaW5lIEZSUzBfQVBJICAgICAgICAweDA4CisjZGVmaW5lIEZSUzBfTk1GICAgICAgICAweDA0CisjZGVmaW5lIEZSUzBfTE1GQSAgICAgICAweDAyCisjZGVmaW5lIEZSUzBfRlNSRiAgICAgICAweDAxCisKKyNkZWZpbmUgRlJTMV9UUzE2UkEgICAgIDB4NDAKKyNkZWZpbmUgRlJTMV9UUzE2TE9TICAgIDB4MjAKKyNkZWZpbmUgRlJTMV9UUzE2QUlTICAgIDB4MTAKKyNkZWZpbmUgRlJTMV9UUzE2TEZBICAgIDB4MDgKKyNkZWZpbmUgRlJTMV9FWFpEICAgICAgIDB4ODAKKyNkZWZpbmUgRlJTMV9MTEJERCAgICAgIDB4MTAKKyNkZWZpbmUgRlJTMV9MTEJBRCAgICAgIDB4MDgKKyNkZWZpbmUgRlJTMV9YTFMgICAgICAgIDB4MDIKKyNkZWZpbmUgRlJTMV9YTE8gICAgICAgIDB4MDEKKyNkZWZpbmUgRlJTMV9QREVOCTB4NDAKKworLyogRlJTMi8zIChGcmFtZXIgUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgMi8zKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZSUzJfRVNDMiAgICAgICAweDgwCisjZGVmaW5lIEZSUzJfRVNDMSAgICAgICAweDQwCisjZGVmaW5lIEZSUzJfRVNDMCAgICAgICAweDIwCisKKyNkZWZpbmUgRlJTM19GRUg1ICAgICAgIDB4MjAKKyNkZWZpbmUgRlJTM19GRUg0ICAgICAgIDB4MTAKKyNkZWZpbmUgRlJTM19GRUgzICAgICAgIDB4MDgKKyNkZWZpbmUgRlJTM19GRUgyICAgICAgIDB4MDQKKyNkZWZpbmUgRlJTM19GRUgxICAgICAgIDB4MDIKKyNkZWZpbmUgRlJTM19GRUgwICAgICAgIDB4MDEKKworCisvKiBSU1cgKFJlY2VpdmUgU2VydmljZSBXb3JkIFB1bHNlZnJhbWUpCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSU1dfUlNJICAgICAgICAgMHg4MAorI2RlZmluZSBSU1dfUlJBICAgICAgICAgMHgyMAorI2RlZmluZSBSU1dfUllPICAgICAgICAgMHgxMAorI2RlZmluZSBSU1dfUlkxICAgICAgICAgMHgwOAorI2RlZmluZSBSU1dfUlkyICAgICAgICAgMHgwNAorI2RlZmluZSBSU1dfUlkzICAgICAgICAgMHgwMgorI2RlZmluZSBSU1dfUlk0ICAgICAgICAgMHgwMQorCisKKy8qIFJTUCAoUmVjZWl2ZSBTcGFyZSBCaXRzIC8gQWRkaXRpb25hbCBTdGF0dXMpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSU1BfU0kxICAgICAgICAgMHg4MAorI2RlZmluZSBSU1BfU0kyICAgICAgICAgMHg0MAorI2RlZmluZSBSU1BfTExCREQJMHgxMAorI2RlZmluZSBSU1BfTExCQUQJMHgwOAorI2RlZmluZSBSU1BfUlNJRiAgICAgICAgMHgwNAorI2RlZmluZSBSU1BfUlMxMyAgICAgICAgMHgwMgorI2RlZmluZSBSU1BfUlMxNSAgICAgICAgMHgwMQorCisKKy8qIEZFQ0wgKEZyYW1pbmcgRXJyb3IgQ291bnRlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZFQ0xfRkU3ICAgICAgICAweDgwCisjZGVmaW5lIEZFQ0xfRkU2ICAgICAgICAweDQwCisjZGVmaW5lIEZFQ0xfRkU1ICAgICAgICAweDIwCisjZGVmaW5lIEZFQ0xfRkU0ICAgICAgICAweDEwCisjZGVmaW5lIEZFQ0xfRkUzICAgICAgICAweDA4CisjZGVmaW5lIEZFQ0xfRkUyICAgICAgICAweDA0CisjZGVmaW5lIEZFQ0xfRkUxICAgICAgICAweDAyCisjZGVmaW5lIEZFQ0xfRkUwICAgICAgICAweDAxCisKKyNkZWZpbmUgRkVDSF9GRTE1ICAgICAgIDB4ODAKKyNkZWZpbmUgRkVDSF9GRTE0ICAgICAgIDB4NDAKKyNkZWZpbmUgRkVDSF9GRTEzICAgICAgIDB4MjAKKyNkZWZpbmUgRkVDSF9GRTEyICAgICAgIDB4MTAKKyNkZWZpbmUgRkVDSF9GRTExICAgICAgIDB4MDgKKyNkZWZpbmUgRkVDSF9GRTEwICAgICAgIDB4MDQKKyNkZWZpbmUgRkVDSF9GRTkgICAgICAgIDB4MDIKKyNkZWZpbmUgRkVDSF9GRTggICAgICAgIDB4MDEKKworCisvKiBDVkNsIChDb2RlIFZpb2xhdGlvbiBDb3VudGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENWQ0xfQ1Y3ICAgICAgICAweDgwCisjZGVmaW5lIENWQ0xfQ1Y2ICAgICAgICAweDQwCisjZGVmaW5lIENWQ0xfQ1Y1ICAgICAgICAweDIwCisjZGVmaW5lIENWQ0xfQ1Y0ICAgICAgICAweDEwCisjZGVmaW5lIENWQ0xfQ1YzICAgICAgICAweDA4CisjZGVmaW5lIENWQ0xfQ1YyICAgICAgICAweDA0CisjZGVmaW5lIENWQ0xfQ1YxICAgICAgICAweDAyCisjZGVmaW5lIENWQ0xfQ1YwICAgICAgICAweDAxCisKKyNkZWZpbmUgQ1ZDSF9DVjE1ICAgICAgIDB4ODAKKyNkZWZpbmUgQ1ZDSF9DVjE0ICAgICAgIDB4NDAKKyNkZWZpbmUgQ1ZDSF9DVjEzICAgICAgIDB4MjAKKyNkZWZpbmUgQ1ZDSF9DVjEyICAgICAgIDB4MTAKKyNkZWZpbmUgQ1ZDSF9DVjExICAgICAgIDB4MDgKKyNkZWZpbmUgQ1ZDSF9DVjEwICAgICAgIDB4MDQKKyNkZWZpbmUgQ1ZDSF9DVjkgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1ZDSF9DVjggICAgICAgIDB4MDEKKworCisvKiBDRUMxLTNMIChDUkMgRXJyb3IgQ291bnRlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENFQzFMX0NSNyAgICAgICAweDgwCisjZGVmaW5lIENFQzFMX0NSNiAgICAgICAweDQwCisjZGVmaW5lIENFQzFMX0NSNSAgICAgICAweDIwCisjZGVmaW5lIENFQzFMX0NSNCAgICAgICAweDEwCisjZGVmaW5lIENFQzFMX0NSMyAgICAgICAweDA4CisjZGVmaW5lIENFQzFMX0NSMiAgICAgICAweDA0CisjZGVmaW5lIENFQzFMX0NSMSAgICAgICAweDAyCisjZGVmaW5lIENFQzFMX0NSMCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDMUhfQ1IxNSAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDMUhfQ1IxNCAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDMUhfQ1IxMyAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDMUhfQ1IxMiAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDMUhfQ1IxMSAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDMUhfQ1IxMCAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDMUhfQ1I5ICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDMUhfQ1I4ICAgICAgIDB4MDEKKworI2RlZmluZSBDRUMyTF9DUjcgICAgICAgMHg4MAorI2RlZmluZSBDRUMyTF9DUjYgICAgICAgMHg0MAorI2RlZmluZSBDRUMyTF9DUjUgICAgICAgMHgyMAorI2RlZmluZSBDRUMyTF9DUjQgICAgICAgMHgxMAorI2RlZmluZSBDRUMyTF9DUjMgICAgICAgMHgwOAorI2RlZmluZSBDRUMyTF9DUjIgICAgICAgMHgwNAorI2RlZmluZSBDRUMyTF9DUjEgICAgICAgMHgwMgorI2RlZmluZSBDRUMyTF9DUjAgICAgICAgMHgwMQorCisjZGVmaW5lIENFQzJIX0NSMTUgICAgICAweDgwCisjZGVmaW5lIENFQzJIX0NSMTQgICAgICAweDQwCisjZGVmaW5lIENFQzJIX0NSMTMgICAgICAweDIwCisjZGVmaW5lIENFQzJIX0NSMTIgICAgICAweDEwCisjZGVmaW5lIENFQzJIX0NSMTEgICAgICAweDA4CisjZGVmaW5lIENFQzJIX0NSMTAgICAgICAweDA0CisjZGVmaW5lIENFQzJIX0NSOSAgICAgICAweDAyCisjZGVmaW5lIENFQzJIX0NSOCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDM0xfQ1I3ICAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDM0xfQ1I2ICAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDM0xfQ1I1ICAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDM0xfQ1I0ICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDM0xfQ1IzICAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDM0xfQ1IyICAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDM0xfQ1IxICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDM0xfQ1IwICAgICAgIDB4MDEKKworI2RlZmluZSBDRUMzSF9DUjE1ICAgICAgMHg4MAorI2RlZmluZSBDRUMzSF9DUjE0ICAgICAgMHg0MAorI2RlZmluZSBDRUMzSF9DUjEzICAgICAgMHgyMAorI2RlZmluZSBDRUMzSF9DUjEyICAgICAgMHgxMAorI2RlZmluZSBDRUMzSF9DUjExICAgICAgMHgwOAorI2RlZmluZSBDRUMzSF9DUjEwICAgICAgMHgwNAorI2RlZmluZSBDRUMzSF9DUjkgICAgICAgMHgwMgorI2RlZmluZSBDRUMzSF9DUjggICAgICAgMHgwMQorCisKKy8qIENFQ0wgKENSQyBFcnJvciBDb3VudGVyKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDRUNMX0NSNyAgICAgICAgMHg4MAorI2RlZmluZSBDRUNMX0NSNiAgICAgICAgMHg0MAorI2RlZmluZSBDRUNMX0NSNSAgICAgICAgMHgyMAorI2RlZmluZSBDRUNMX0NSNCAgICAgICAgMHgxMAorI2RlZmluZSBDRUNMX0NSMyAgICAgICAgMHgwOAorI2RlZmluZSBDRUNMX0NSMiAgICAgICAgMHgwNAorI2RlZmluZSBDRUNMX0NSMSAgICAgICAgMHgwMgorI2RlZmluZSBDRUNMX0NSMCAgICAgICAgMHgwMQorCisjZGVmaW5lIENFQ0hfQ1IxNSAgICAgICAweDgwCisjZGVmaW5lIENFQ0hfQ1IxNCAgICAgICAweDQwCisjZGVmaW5lIENFQ0hfQ1IxMyAgICAgICAweDIwCisjZGVmaW5lIENFQ0hfQ1IxMiAgICAgICAweDEwCisjZGVmaW5lIENFQ0hfQ1IxMSAgICAgICAweDA4CisjZGVmaW5lIENFQ0hfQ1IxMCAgICAgICAweDA0CisjZGVmaW5lIENFQ0hfQ1I5ICAgICAgICAweDAyCisjZGVmaW5lIENFQ0hfQ1I4ICAgICAgICAweDAxCisKKy8qIEVCQ0wgKEUgQml0IEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEVCQ0xfRUI3ICAgICAgICAweDgwCisjZGVmaW5lIEVCQ0xfRUI2ICAgICAgICAweDQwCisjZGVmaW5lIEVCQ0xfRUI1ICAgICAgICAweDIwCisjZGVmaW5lIEVCQ0xfRUI0ICAgICAgICAweDEwCisjZGVmaW5lIEVCQ0xfRUIzICAgICAgICAweDA4CisjZGVmaW5lIEVCQ0xfRUIyICAgICAgICAweDA0CisjZGVmaW5lIEVCQ0xfRUIxICAgICAgICAweDAyCisjZGVmaW5lIEVCQ0xfRUIwICAgICAgICAweDAxCisKKyNkZWZpbmUgRUJDSF9FQjE1ICAgICAgIDB4ODAKKyNkZWZpbmUgRUJDSF9FQjE0ICAgICAgIDB4NDAKKyNkZWZpbmUgRUJDSF9FQjEzICAgICAgIDB4MjAKKyNkZWZpbmUgRUJDSF9FQjEyICAgICAgIDB4MTAKKyNkZWZpbmUgRUJDSF9FQjExICAgICAgIDB4MDgKKyNkZWZpbmUgRUJDSF9FQjEwICAgICAgIDB4MDQKKyNkZWZpbmUgRUJDSF9FQjkgICAgICAgIDB4MDIKKyNkZWZpbmUgRUJDSF9FQjggICAgICAgIDB4MDEKKworCisvKiBSU0E0LTggKFJlY2VpdmUgU2E0LTgtQml0IFJlZ2lzdGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNBNF9SUzQ3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBNF9SUzQ2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBNF9SUzQ1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBNF9SUzQ0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBNF9SUzQzICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBNF9SUzQyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBNF9SUzQxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBNF9SUzQwICAgICAgIDB4MDEKKworI2RlZmluZSBSU0E1X1JTNTcgICAgICAgMHg4MAorI2RlZmluZSBSU0E1X1JTNTYgICAgICAgMHg0MAorI2RlZmluZSBSU0E1X1JTNTUgICAgICAgMHgyMAorI2RlZmluZSBSU0E1X1JTNTQgICAgICAgMHgxMAorI2RlZmluZSBSU0E1X1JTNTMgICAgICAgMHgwOAorI2RlZmluZSBSU0E1X1JTNTIgICAgICAgMHgwNAorI2RlZmluZSBSU0E1X1JTNTEgICAgICAgMHgwMgorI2RlZmluZSBSU0E1X1JTNTAgICAgICAgMHgwMQorCisjZGVmaW5lIFJTQTZfUlM2NyAgICAgICAweDgwCisjZGVmaW5lIFJTQTZfUlM2NiAgICAgICAweDQwCisjZGVmaW5lIFJTQTZfUlM2NSAgICAgICAweDIwCisjZGVmaW5lIFJTQTZfUlM2NCAgICAgICAweDEwCisjZGVmaW5lIFJTQTZfUlM2MyAgICAgICAweDA4CisjZGVmaW5lIFJTQTZfUlM2MiAgICAgICAweDA0CisjZGVmaW5lIFJTQTZfUlM2MSAgICAgICAweDAyCisjZGVmaW5lIFJTQTZfUlM2MCAgICAgICAweDAxCisKKyNkZWZpbmUgUlNBN19SUzc3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBN19SUzc2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBN19SUzc1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBN19SUzc0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBN19SUzczICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBN19SUzcyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBN19SUzcxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBN19SUzcwICAgICAgIDB4MDEKKworI2RlZmluZSBSU0E4X1JTODcgICAgICAgMHg4MAorI2RlZmluZSBSU0E4X1JTODYgICAgICAgMHg0MAorI2RlZmluZSBSU0E4X1JTODUgICAgICAgMHgyMAorI2RlZmluZSBSU0E4X1JTODQgICAgICAgMHgxMAorI2RlZmluZSBSU0E4X1JTODMgICAgICAgMHgwOAorI2RlZmluZSBSU0E4X1JTODIgICAgICAgMHgwNAorI2RlZmluZSBSU0E4X1JTODEgICAgICAgMHgwMgorI2RlZmluZSBSU0E4X1JTODAgICAgICAgMHgwMQorCisvKiBSU0E2UyAoUmVjZWl2ZSBTYTYgQml0IFN0YXR1cyBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNBNlNfU1ggICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBNlNfU0YgICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBNlNfU0UgICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBNlNfU0MgICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBNlNfU0EgICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBNlNfUzggICAgICAgIDB4MDEKKworCisvKiBSREwxLTMgUmVjZWl2ZSBETC1CaXQgUmVnaXN0ZXIxLTMpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJETDFfUkRMMTcgICAgICAweDgwCisjZGVmaW5lIFJETDFfUkRMMTYgICAgICAweDQwCisjZGVmaW5lIFJETDFfUkRMMTUgICAgICAweDIwCisjZGVmaW5lIFJETDFfUkRMMTQgICAgICAweDEwCisjZGVmaW5lIFJETDFfUkRMMTMgICAgICAweDA4CisjZGVmaW5lIFJETDFfUkRMMTIgICAgICAweDA0CisjZGVmaW5lIFJETDFfUkRMMTEgICAgICAweDAyCisjZGVmaW5lIFJETDFfUkRMMTAgICAgICAweDAxCisKKyNkZWZpbmUgUkRMMl9SREwyNyAgICAgIDB4ODAKKyNkZWZpbmUgUkRMMl9SREwyNiAgICAgIDB4NDAKKyNkZWZpbmUgUkRMMl9SREwyNSAgICAgIDB4MjAKKyNkZWZpbmUgUkRMMl9SREwyNCAgICAgIDB4MTAKKyNkZWZpbmUgUkRMMl9SREwyMyAgICAgIDB4MDgKKyNkZWZpbmUgUkRMMl9SREwyMiAgICAgIDB4MDQKKyNkZWZpbmUgUkRMMl9SREwyMSAgICAgIDB4MDIKKyNkZWZpbmUgUkRMMl9SREwyMCAgICAgIDB4MDEKKworI2RlZmluZSBSREwzX1JETDM3ICAgICAgMHg4MAorI2RlZmluZSBSREwzX1JETDM2ICAgICAgMHg0MAorI2RlZmluZSBSREwzX1JETDM1ICAgICAgMHgyMAorI2RlZmluZSBSREwzX1JETDM0ICAgICAgMHgxMAorI2RlZmluZSBSREwzX1JETDMzICAgICAgMHgwOAorI2RlZmluZSBSREwzX1JETDMyICAgICAgMHgwNAorI2RlZmluZSBSREwzX1JETDMxICAgICAgMHgwMgorI2RlZmluZSBSREwzX1JETDMwICAgICAgMHgwMQorCisKKy8qIFNJUyAoU2lnbmFsaW5nIFN0YXR1cyBSZWdpc3RlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNJU19YRE9WICAgICAgICAweDgwCisjZGVmaW5lIFNJU19YRlcgICAgICAgICAweDQwCisjZGVmaW5lIFNJU19YUkVQICAgICAgICAweDIwCisjZGVmaW5lIFNJU19STEkgICAgICAgICAweDA4CisjZGVmaW5lIFNJU19DRUMgICAgICAgICAweDA0CisjZGVmaW5lIFNJU19CT00gICAgICAgICAweDAxCisKKworLyogUlNJUyAoUmVjZWl2ZSBTaWduYWxpbmcgU3RhdHVzIFJlZ2lzdGVyKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJTSVNfVkZSICAgICAgICAweDgwCisjZGVmaW5lIFJTSVNfUkRPICAgICAgICAweDQwCisjZGVmaW5lIFJTSVNfQ1JDMTYgICAgICAweDIwCisjZGVmaW5lIFJTSVNfUkFCICAgICAgICAweDEwCisjZGVmaW5lIFJTSVNfSEExICAgICAgICAweDA4CisjZGVmaW5lIFJTSVNfSEEwICAgICAgICAweDA0CisjZGVmaW5lIFJTSVNfSEZSICAgICAgICAweDAyCisjZGVmaW5lIFJTSVNfTEEgICAgICAgICAweDAxCisKKworLyogUkJDTC9IIChSZWNlaXZlIEJ5dGUgQ291bnQgTG93L0hpZ2gpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJCQ0xfUkJDNyAgICAgICAweDgwCisjZGVmaW5lIFJCQ0xfUkJDNiAgICAgICAweDQwCisjZGVmaW5lIFJCQ0xfUkJDNSAgICAgICAweDIwCisjZGVmaW5lIFJCQ0xfUkJDNCAgICAgICAweDEwCisjZGVmaW5lIFJCQ0xfUkJDMyAgICAgICAweDA4CisjZGVmaW5lIFJCQ0xfUkJDMiAgICAgICAweDA0CisjZGVmaW5lIFJCQ0xfUkJDMSAgICAgICAweDAyCisjZGVmaW5lIFJCQ0xfUkJDMCAgICAgICAweDAxCisKKyNkZWZpbmUgUkJDSF9PViAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkJDSF9SQkMxMSAgICAgIDB4MDgKKyNkZWZpbmUgUkJDSF9SQkMxMCAgICAgIDB4MDQKKyNkZWZpbmUgUkJDSF9SQkM5ICAgICAgIDB4MDIKKyNkZWZpbmUgUkJDSF9SQkM4ICAgICAgIDB4MDEKKworCisvKiBJU1IxLTMgIChJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEtMykKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgIEZJU1IwX1JNRQkweDgwCisjZGVmaW5lICBGSVNSMF9SRlMJMHg0MAorI2RlZmluZSAgRklTUjBfVDhNUwkweDIwCisjZGVmaW5lICBGSVNSMF9JU0YJMHgyMAorI2RlZmluZSAgRklTUjBfUk1CCTB4MTAKKyNkZWZpbmUgIEZJU1IwX0NBU0MJMHgwOAorI2RlZmluZSAgRklTUjBfUlNDCTB4MDgKKyNkZWZpbmUgIEZJU1IwX0NSQzYJMHgwNAorI2RlZmluZSAgRklTUjBfQ1JDNAkweDA0CisjZGVmaW5lICBGSVNSMF9QREVOCTB4MDIKKyNkZWZpbmUgIEZJU1IwX1JQRgkweDAxCisKKyNkZWZpbmUgIEZJU1IxX0NBU0UJMHg4MAorI2RlZmluZSAgRklTUjFfTExCU0MJMHg4MAorI2RlZmluZSAgRklTUjFfUkRPCTB4NDAKKyNkZWZpbmUgIEZJU1IxX0FMTFMJMHgyMAorI2RlZmluZSAgRklTUjFfWERVCTB4MTAKKyNkZWZpbmUgIEZJU1IxX1hNQgkweDA4CisjZGVmaW5lICBGSVNSMV9YTFNDCTB4MDIKKyNkZWZpbmUgIEZJU1IxX1hQUgkweDAxCisKKyNkZWZpbmUgIEZJU1IyX0ZBUgkweDgwCisjZGVmaW5lICBGSVNSMl9MRkEJMHg0MAorI2RlZmluZSAgRklTUjJfTUZBUgkweDIwCisjZGVmaW5lICBGSVNSMl9UNDAwTVMJMHgxMAorI2RlZmluZSAgRklTUjJfTE1GQQkweDEwCisjZGVmaW5lICBGSVNSMl9BSVMJMHgwOAorI2RlZmluZSAgRklTUjJfTE9TCTB4MDQKKyNkZWZpbmUgIEZJU1IyX1JBUgkweDAyCisjZGVmaW5lICBGSVNSMl9SQQkweDAxCisKKyNkZWZpbmUgIEZJU1IzX0VTCTB4ODAKKyNkZWZpbmUgIEZJU1IzX1NFQwkweDQwCisjZGVmaW5lICBGSVNSM19MTUZBMTYJMHgyMAorI2RlZmluZSAgRklTUjNfQUlTMTYJMHgxMAorI2RlZmluZSAgRklTUjNfUkExNgkweDA4CisjZGVmaW5lICBGSVNSM19BUEkJMHgwNAorI2RlZmluZSAgRklTUjNfWFNMUAkweDIwCisjZGVmaW5lICBGSVNSM19YU0xOCTB4MTAKKyNkZWZpbmUgIEZJU1IzX0xMQlNDCTB4MDgKKyNkZWZpbmUgIEZJU1IzX1hSUwkweDA0CisjZGVmaW5lICBGSVNSM19TTE4JMHgwMgorI2RlZmluZSAgRklTUjNfU0xQCTB4MDEKKworCisvKiBHSVMgIChHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgIEdJU19JU1IzCTB4MDgKKyNkZWZpbmUgIEdJU19JU1IyCTB4MDQKKyNkZWZpbmUgIEdJU19JU1IxCTB4MDIKKyNkZWZpbmUgIEdJU19JU1IwCTB4MDEKKworCisvKiBWU1RSICAoVmVyc2lvbiBTdGF0dXMgUmVnaXN0ZXIpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBWU1RSX1ZOMwkweDA4CisjZGVmaW5lICBWU1RSX1ZOMgkweDA0CisjZGVmaW5lICBWU1RSX1ZOMQkweDAyCisjZGVmaW5lICBWU1RSX1ZOMAkweDAxCisKKworLyo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gIExvY2FsIENvbnRyb2wgU3RydWN0dXJlcyAgPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCAqLworCisvKiBXcml0ZS1vbmx5IFJlZ2lzdGVycyAoRTEvVDEgY29udHJvbCBtb2RlIHdyaXRlIHJlZ2lzdGVycykgKi8KKyNkZWZpbmUgWEZJRk9ICTB4MDAJCS8qIFR4IEZJRk8gSGlnaCBCeXRlICovCisjZGVmaW5lIFhGSUZPTAkweDAxCQkvKiBUeCBGSUZPIExvdyBCeXRlICovCisjZGVmaW5lIENNRFIJMHgwMgkJLyogQ29tbWFuZCBSZWcgKi8KKyNkZWZpbmUgREVDCTB4NjAJCS8qIERpc2FibGUgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBURVNUMgkweDYyCQkvKiBNYW51Zi4gVGVzdCBSZWcgMiAqLworI2RlZmluZSBYUyhuYnIpCSgweDcwICsgKG5icikpCS8qIFR4IENBUyBSZWcgKDAgdG8gMTUpICovCisKKy8qIFJlYWQtd3JpdGUgUmVnaXN0ZXJzIChFMS9UMSBzdGF0dXMgbW9kZSByZWFkIHJlZ2lzdGVycykgKi8KKyNkZWZpbmUgTU9ERQkweDAzCS8qIE1vZGUgUmVnICovCisjZGVmaW5lIFJBSDEJMHgwNAkvKiBSZWNlaXZlIEFkZHJlc3MgSGlnaCAxICovCisjZGVmaW5lIFJBSDIJMHgwNQkvKiBSZWNlaXZlIEFkZHJlc3MgSGlnaCAyICovCisjZGVmaW5lIFJBTDEJMHgwNgkvKiBSZWNlaXZlIEFkZHJlc3MgTG93IDEgKi8KKyNkZWZpbmUgUkFMMgkweDA3CS8qIFJlY2VpdmUgQWRkcmVzcyBMb3cgMiAqLworI2RlZmluZSBJUEMJMHgwOAkvKiBJbnRlcnJ1cHQgUG9ydCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIENDUjEJMHgwOQkvKiBDb21tb24gQ29uZmlndXJhdGlvbiBSZWcgMSAqLworI2RlZmluZSBDQ1IzCTB4MEEJLyogQ29tbW9uIENvbmZpZ3VyYXRpb24gUmVnIDMgKi8KKyNkZWZpbmUgUFJFCTB4MEIJLyogUHJlYW1ibGUgUmVnICovCisjZGVmaW5lIFJUUjEJMHgwQwkvKiBSZWNlaXZlIFRpbWVzbG90IFJlZyAxICovCisjZGVmaW5lIFJUUjIJMHgwRAkvKiBSZWNlaXZlIFRpbWVzbG90IFJlZyAyICovCisjZGVmaW5lIFJUUjMJMHgwRQkvKiBSZWNlaXZlIFRpbWVzbG90IFJlZyAzICovCisjZGVmaW5lIFJUUjQJMHgwRgkvKiBSZWNlaXZlIFRpbWVzbG90IFJlZyA0ICovCisjZGVmaW5lIFRUUjEJMHgxMAkvKiBUcmFuc21pdCBUaW1lc2xvdCBSZWcgMSAqLworI2RlZmluZSBUVFIyCTB4MTEJLyogVHJhbnNtaXQgVGltZXNsb3QgUmVnIDIgKi8KKyNkZWZpbmUgVFRSMwkweDEyCS8qIFRyYW5zbWl0IFRpbWVzbG90IFJlZyAzICovCisjZGVmaW5lIFRUUjQJMHgxMwkvKiBUcmFuc21pdCBUaW1lc2xvdCBSZWcgNCAqLworI2RlZmluZSBJTVIwCTB4MTQJLyogSW50ZXJydXB0IE1hc2sgUmVnIDAgKi8KKyNkZWZpbmUgSU1SMQkweDE1CS8qIEludGVycnVwdCBNYXNrIFJlZyAxICovCisjZGVmaW5lIElNUjIJMHgxNgkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgMiAqLworI2RlZmluZSBJTVIzCTB4MTcJLyogSW50ZXJydXB0IE1hc2sgUmVnIDMgKi8KKyNkZWZpbmUgSU1SNAkweDE4CS8qIEludGVycnVwdCBNYXNrIFJlZyA0ICovCisjZGVmaW5lIElNUjUJMHgxOQkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgNSAqLworI2RlZmluZSBGTVIwCTB4MUEJLyogRnJhbWVyIE1vZGUgUmVpZ3N0ZXIgMCAqLworI2RlZmluZSBGTVIxCTB4MUIJLyogRnJhbWVyIE1vZGUgUmVpZ3N0ZXIgMSAqLworI2RlZmluZSBGTVIyCTB4MUMJLyogRnJhbWVyIE1vZGUgUmVpZ3N0ZXIgMiAqLworI2RlZmluZSBMT09QCTB4MUQJLyogQ2hhbm5lbCBMb29wIEJhY2sgKi8KKyNkZWZpbmUgWFNXCTB4MUUJLyogVHJhbnNtaXQgU2VydmljZSBXb3JkICovCisjZGVmaW5lIEZNUjQJMHgxRQkvKiBGcmFtZXIgTW9kZSBSZWcgNCAqLworI2RlZmluZSBYU1AJMHgxRgkvKiBUcmFuc21pdCBTcGFyZSBCaXRzICovCisjZGVmaW5lIEZNUjUJMHgxRgkvKiBGcmFtZXIgTW9kZSBSZWcgNSAqLworI2RlZmluZSBYQzAJMHgyMAkvKiBUcmFuc21pdCBDb250cm9sIDAgKi8KKyNkZWZpbmUgWEMxCTB4MjEJLyogVHJhbnNtaXQgQ29udHJvbCAxICovCisjZGVmaW5lIFJDMAkweDIyCS8qIFJlY2VpdmUgQ29udHJvbCAwICovCisjZGVmaW5lIFJDMQkweDIzCS8qIFJlY2VpdmUgQ29udHJvbCAxICovCisjZGVmaW5lIFhQTTAJMHgyNAkvKiBUcmFuc21pdCBQdWxzZSBNYXNrIDAgKi8KKyNkZWZpbmUgWFBNMQkweDI1CS8qIFRyYW5zbWl0IFB1bHNlIE1hc2sgMSAqLworI2RlZmluZSBYUE0yCTB4MjYJLyogVHJhbnNtaXQgUHVsc2UgTWFzayAyICovCisjZGVmaW5lIFRTV00JMHgyNwkvKiBUcmFuc3BhcmVudCBTZXJ2aWNlIFdvcmQgTWFzayAqLworI2RlZmluZSBURVNUMQkweDI4CS8qIE1hbnVmLiBUZXN0IFJlZyAxICovCisjZGVmaW5lIElETEUJMHgyOQkvKiBJZGxlIENoYW5uZWwgQ29kZSAqLworI2RlZmluZSBYU0E0ICAgIDB4MkEJLyogVHJhbnNtaXQgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgWERMMQkweDJBCS8qIFRyYW5zbWl0IERMLUJpdCBSZWcgMiAqLworI2RlZmluZSBYU0E1ICAgIDB4MkIJLyogVHJhbnNtaXQgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgWERMMgkweDJCCS8qIFRyYW5zbWl0IERMLUJpdCBSZWcgMiAqLworI2RlZmluZSBYU0E2ICAgIDB4MkMJLyogVHJhbnNtaXQgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgWERMMwkweDJDCS8qIFRyYW5zbWl0IERMLUJpdCBSZWcgMiAqLworI2RlZmluZSBYU0E3ICAgIDB4MkQJLyogVHJhbnNtaXQgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgQ0NCMQkweDJECS8qIENsZWFyIENoYW5uZWwgUmVnIDEgKi8KKyNkZWZpbmUgWFNBOCAgICAweDJFCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIENDQjIJMHgyRQkvKiBDbGVhciBDaGFubmVsIFJlZyAyICovCisjZGVmaW5lIEZNUjMJMHgyRgkvKiBGcmFtZXIgTW9kZSBSZWcuIDMgKi8KKyNkZWZpbmUgQ0NCMwkweDJGCS8qIENsZWFyIENoYW5uZWwgUmVnIDMgKi8KKyNkZWZpbmUgSUNCMQkweDMwCS8qIElkbGUgQ2hhbm5lbCBSZWcgMSAqLworI2RlZmluZSBJQ0IyCTB4MzEJLyogSWRsZSBDaGFubmVsIFJlZyAyICovCisjZGVmaW5lIElDQjMJMHgzMgkvKiBJZGxlIENoYW5uZWwgUmVnIDMgKi8KKyNkZWZpbmUgSUNCNAkweDMzCS8qIElkbGUgQ2hhbm5lbCBSZWcgNCAqLworI2RlZmluZSBMSU0wCTB4MzQJLyogTGluZSBJbnRlcmZhY2UgTW9kZSAwICovCisjZGVmaW5lIExJTTEJMHgzNQkvKiBMaW5lIEludGVyZmFjZSBNb2RlIDEgKi8KKyNkZWZpbmUgUENEUgkweDM2CS8qIFB1bHNlIENvdW50IERldGVjdGlvbiAqLworI2RlZmluZSBQQ1JSCTB4MzcJLyogUHVsc2UgQ291bnQgUmVjb3ZlcnkgKi8KKyNkZWZpbmUgTElNMgkweDM4CS8qIExpbmUgSW50ZXJmYWNlIE1vZGUgUmVnIDIgKi8KKyNkZWZpbmUgTENSMQkweDM5CS8qIExvb3AgQ29kZSBSZWcgMSAqLworI2RlZmluZSBMQ1IyCTB4M0EJLyogTG9vcCBDb2RlIFJlZyAyICovCisjZGVmaW5lIExDUjMJMHgzQgkvKiBMb29wIENvZGUgUmVnIDMgKi8KKyNkZWZpbmUgU0lDMQkweDNDCS8qIFN5c3RlbSBJbnRlcmZhY2UgQ29udHJvbCAxICovCisKKy8qIFJlYWQtb25seSBSZWdpc3RlcnMgKEUxL1QxIGNvbnRyb2wgbW9kZSByZWFkIHJlZ2lzdGVycykgKi8KKyNkZWZpbmUgUkZJRk9ICTB4MDAJCS8qIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBSRklGT0wJMHgwMQkJLyogUmVjZWl2ZSBGSUZPICovCisjZGVmaW5lIEZSUzAJMHg0QwkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDAgKi8KKyNkZWZpbmUgRlJTMQkweDRECQkvKiBGcmFtZXIgUmVjZWl2ZSBTdGF0dXMgMSAqLworI2RlZmluZSBSU1cJMHg0RQkJLyogUmVjZWl2ZSBTZXJ2aWNlIFdvcmQgKi8KKyNkZWZpbmUgRlJTMgkweDRFCQkvKiBGcmFtZXIgUmVjZWl2ZSBTdGF0dXMgMiAqLworI2RlZmluZSBSU1AJMHg0RgkJLyogUmVjZWl2ZSBTcGFyZSBCaXRzICovCisjZGVmaW5lIEZSUzMJMHg0RgkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDMgKi8KKyNkZWZpbmUgRkVDTAkweDUwCQkvKiBGcmFtaW5nIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgRkVDSAkweDUxCQkvKiBGcmFtaW5nIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgQ1ZDTAkweDUyCQkvKiBDb2RlIFZpb2xhdGlvbiBDb3VudGVyICovCisjZGVmaW5lIENWQ0gJMHg1MwkJLyogQ29kZSBWaW9sYXRpb24gQ291bnRlciAqLworI2RlZmluZSBDRUNMCTB4NTQJCS8qIENSQyBFcnJvciBDb3VudGVyIDEgKi8KKyNkZWZpbmUgQ0VDSAkweDU1CQkvKiBDUkMgRXJyb3IgQ291bnRlciAxICovCisjZGVmaW5lIEVCQ0wJMHg1NgkJLyogRS1CaXQgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBFQkNICTB4NTcJCS8qIEUtQml0IEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgQkVDTAkweDU4CQkvKiBCaXQgRXJyb3IgQ291bnRlciBMb3cgKi8KKyNkZWZpbmUgQkVDSAkweDU5CQkvKiBCaXQgRXJyb3IgQ291bnRlciBMb3cgKi8KKyNkZWZpbmUgQ0VDMwkweDVBCQkvKiBDUkMgRXJyb3IgQ291bnRlciAzICgxNi1iaXQpICovCisjZGVmaW5lIFJTQTQJMHg1QwkJLyogUmVjZWl2ZSBTQTQgQml0IFJlZyAqLworI2RlZmluZSBSREwxCTB4NUMJCS8qIFJlY2VpdmUgREwtQml0IFJlZyAxICovCisjZGVmaW5lIFJTQTUJMHg1RAkJLyogUmVjZWl2ZSBTQTUgQml0IFJlZyAqLworI2RlZmluZSBSREwyCTB4NUQJCS8qIFJlY2VpdmUgREwtQml0IFJlZyAyICovCisjZGVmaW5lIFJTQTYJMHg1RQkJLyogUmVjZWl2ZSBTQTYgQml0IFJlZyAqLworI2RlZmluZSBSREwzCTB4NUUJCS8qIFJlY2VpdmUgREwtQml0IFJlZyAzICovCisjZGVmaW5lIFJTQTcJMHg1RgkJLyogUmVjZWl2ZSBTQTcgQml0IFJlZyAqLworI2RlZmluZSBSU0E4CTB4NjAJCS8qIFJlY2VpdmUgU0E4IEJpdCBSZWcgKi8KKyNkZWZpbmUgUlNBNlMJMHg2MQkJLyogUmVjZWl2ZSBTQTYgQml0IFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgVFNSMAkweDYyCQkvKiBNYW51Zi4gVGVzdCBSZWcgMCAqLworI2RlZmluZSBUU1IxCTB4NjMJCS8qIE1hbnVmLiBUZXN0IFJlZyAxICovCisjZGVmaW5lIFNJUwkweDY0CQkvKiBTaWduYWxpbmcgU3RhdHVzIFJlZyAqLworI2RlZmluZSBSU0lTCTB4NjUJCS8qIFJlY2VpdmUgU2lnbmFsaW5nIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUkJDTAkweDY2CQkvKiBSZWNlaXZlIEJ5dGUgQ29udHJvbCAqLworI2RlZmluZSBSQkNICTB4NjcJCS8qIFJlY2VpdmUgQnl0ZSBDb250cm9sICovCisjZGVmaW5lIEZJU1IwCTB4NjgJCS8qIEludGVycnVwdCBTdGF0dXMgUmVnIDAgKi8KKyNkZWZpbmUgRklTUjEJMHg2OQkJLyogSW50ZXJydXB0IFN0YXR1cyBSZWcgMSAqLworI2RlZmluZSBGSVNSMgkweDZBCQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAyICovCisjZGVmaW5lIEZJU1IzCTB4NkIJCS8qIEludGVycnVwdCBTdGF0dXMgUmVnIDMgKi8KKyNkZWZpbmUgR0lTCTB4NkUJCS8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIFZTVFIJMHg2RgkJLyogVmVyc2lvbiBTdGF0dXMgKi8KKyNkZWZpbmUgUlMobmJyKQkoMHg3MCArIChuYnIpKQkvKiBSeCBDQVMgUmVnICgwIHRvIDE1KSAqLworCisjZW5kaWYJLyogX0ZBTENfTEhfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGMzMDAuaCBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDAxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDAuaApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIHBjMzAwLmgJQ3ljbGFkZXMtUEMzMDAodG0pIEtlcm5lbCBBUEkgRGVmaW5pdGlvbnMuCisgKgorICogQXV0aG9yOglJdmFuIFBhc3NvcyA8aXZhbkBjeWNsYWRlcy5jb20+CisgKgorICogQ29weXJpZ2h0OgkoYykgMTk5OS0yMDAyIEN5Y2xhZGVzIENvcnAuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAkTG9nOiBwYzMwMC5oLHYgJAorICogUmV2aXNpb24gMy4xMiAgMjAwMi8wMy8wNyAxNDoxNzowOSAgaGVucmlxdWUKKyAqIExpY2Vuc2UgZGF0YSBmaXhlZAorICoKKyAqIFJldmlzaW9uIDMuMTEgIDIwMDIvMDEvMjggMjE6MDk6MzkgIGRhbmllbGEKKyAqIEluY2x1ZGVkICc7JyBhZnRlciBwYzMwMGh3LmJ1cy4KKyAqCisgKiBSZXZpc2lvbiAzLjEwICAyMDAyLzAxLzE3IDE3OjU4OjUyICBpdmFuCisgKiBTdXBwb3J0IGZvciBQQzMwMC1URS9NIChQTUMpLgorICoKKyAqIFJldmlzaW9uIDMuOSAgMjAwMS8wOS8yOCAxMzozMDo1MyAgZGFuaWVsYQorICogUmVuYW1lZCBkbWFfc3RhcnQgcm91dGluZSB0byByeF9kbWFfc3RhcnQuCisgKgorICogUmV2aXNpb24gMy44ICAyMDAxLzA5LzI0IDEzOjAzOjQ1ICBkYW5pZWxhCisgKiBGaXhlZCBCT0YgaW50ZXJydXB0IHRyZWF0bWVudC4gQ3JlYXRlZCBkbWFfc3RhcnQgcm91dGluZS4KKyAqCisgKiBSZXZpc2lvbiAzLjcgIDIwMDEvMDgvMTAgMTc6MTk6NTggIGRhbmllbGEKKyAqIEZpeGVkIElPQ1RMcyBkZWZpbmVzLgorICoKKyAqIFJldmlzaW9uIDMuNiAgMjAwMS8wNy8xOCAxOToyNDo0MiAgZGFuaWVsYQorICogSW5jbHVkZWQga2VybmVsIHZlcnNpb24uCisgKgorICogUmV2aXNpb24gMy41ICAyMDAxLzA3LzA1IDE4OjM4OjA4ICBkYW5pZWxhCisgKiBETUEgdHJhbnNtaXNzaW9uIGJ1ZyBmaXguCisgKgorICogUmV2aXNpb24gMy40ICAyMDAxLzA2LzI2IDE3OjEwOjQwICBkYW5pZWxhCisgKiBOZXcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIChsaW5lIGNvZGUsIENSQyBjYWxjdWxhdGlvbiBhbmQgY2xvY2spLgorICoKKyAqIFJldmlzaW9uIDMuMyAgMjAwMS8wNi8yMiAxMzoxMzowMiAgcmVnaW5hCisgKiBNTFBQUCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFJldmlzaW9uIDMuMiAgMjAwMS8wNi8xOCAxNzo1NjowOSAgZGFuaWVsYQorICogSW5jcmVhc2VkIERFRl9NVFUgYW5kIFRYX1FVRVVFX0xFTi4KKyAqCisgKiBSZXZpc2lvbiAzLjEgIDIwMDEvMDYvMTUgMTI6NDE6MTAgIHJlZ2luYQorICogdXBwaW5nIG1ham9yIHZlcnNpb24gbnVtYmVyCisgKgorICogUmV2aXNpb24gMS4xLjEuMSAgMjAwMS8wNi8xMyAyMDoyNTowNiAgZGFuaWVsYQorICogUEMzMDAgaW5pdGlhbCBDVlMgdmVyc2lvbiAoMy40LjAtcHJlMSkKKyAqCisgKiBSZXZpc2lvbiAyLjMgMjAwMS8wMy8wNSBkYW5pZWxhCisgKiBDcmVhdGVkIHN0cnVjdCBwYzMwMGNvbmYsIHRvIHByb3ZpZGUgdGhlIGhhcmR3YXJlIGluZm9ybWF0aW9uIHRvIHBjMzAwdXRpbC4KKyAqIEluY2x1c2lvbiBvZiAnYWxsb2NfcmFtc2l6ZScgZmllbGQgb24gc3RydWN0dXJlICdwYzMwMGh3Jy4KKyAqIAorICogUmV2aXNpb24gMi4yIDIwMDAvMTIvMjIgZGFuaWVsYQorICogU3RydWN0dXJlcyBhbmQgZGVmaW5lcyB0byBzdXBwb3J0IHBjMzAwdXRpbDogc3RhdGlzdGljcywgc3RhdHVzLCAKKyAqIGxvb3BiYWNrIHRlc3RzLCB0cmFjZS4KKyAqIAorICogUmV2aXNpb24gMi4xIDIwMDAvMDkvMjggaXZhbgorICogSW5jbHVzaW9uIG9mICdpb3BoeXMnIGFuZCAnaW9zaXplJyBmaWVsZHMgb24gc3RydWN0dXJlICdwYzMwMGh3JywgdG8gCisgKiBhbGxvdyByZWxlYXNlIG9mIEkvTyByZWdpb24gYXQgbW9kdWxlIHVubG9hZC4KKyAqIENoYW5nZWQgbG9jYXRpb24gb2YgaW5jbHVkZSBmaWxlcy4KKyAqCisgKiBSZXZpc2lvbiAyLjAgMjAwMC8wMy8yNyBpdmFuCisgKiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUEMzMDAvVEUgY2FyZHMuCisgKgorICogUmV2aXNpb24gMS4xIDIwMDAvMDEvMzEgaXZhbgorICogUmVwbGFjZWQgJ3BjMzAwW2RydnxzY2FdLmgnIGZvcm1lciBQQzMwMCBkcml2ZXIgaW5jbHVkZSBmaWxlcy4KKyAqCisgKiBSZXZpc2lvbiAxLjAgMTk5OS8xMi8xNiBpdmFuCisgKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLgorICogSW5jbHVzaW9uIG9mICduY2hhbicgZmllbGQgb24gc3RydWN0dXJlICdwYzMwMGh3JywgdG8gYWxsb3cgdmFyaWFibGUgCisgKiBudW1iZXIgb2YgcG9ydHMgcGVyIGNhcmQuCisgKiBJbmNsdXNpb24gb2YgJ2lmX3B0cicgZmllbGQgb24gc3RydWN0dXJlICdwYzMwMGRldicuCisgKgorICogUmV2aXNpb24gMC42IDE5OTkvMTEvMTcgaXZhbgorICogQ2hhbmdlZCBYLjI1LXNwZWNpZmljIGZ1bmN0aW9uIG5hbWVzIHRvIGNvbXBseSB3aXRoIGFkb3B0ZWQgY29udmVudGlvbi4KKyAqCisgKiBSZXZpc2lvbiAwLjUgMTk5OS8xMS8xNiBEYW5pZWxhIFNxdWFzc29uaQorICogWC4yNSBzdXBwb3J0LgorICoKKyAqIFJldmlzaW9uIDAuNCAxOTk5LzExLzE1IGl2YW4KKyAqIEluY2x1c2lvbiBvZiAnY2xvY2snIGZpZWxkIG9uIHN0cnVjdHVyZSAncGMzMDBodycuCisgKgorICogUmV2aXNpb24gMC4zIDE5OTkvMTEvMTAgaXZhbgorICogSU9DVEwgbmFtZSBjaGFuZ2luZy4KKyAqIEluY2x1c2lvbiBvZiBkcml2ZXIgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqCisgKiBSZXZpc2lvbiAwLjIgMTk5OS8xMS8wMyBpdmFuCisgKiBJbmNsdXNpb24gb2YgJ3R4X3NrYicgYW5kIHVuaW9uICdpZnUnIG9uIHN0cnVjdHVyZSAncGMzMDBkZXYnLgorICoKKyAqIFJldmlzaW9uIDAuMSAxOTk5LzAxLzE1IGl2YW4KKyAqIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZglfUEMzMDBfSAorI2RlZmluZQlfUEMzMDBfSAorCisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorI2luY2x1ZGUgImhkNjQ1NzIuaCIKKyNpbmNsdWRlICJwYzMwMC1mYWxjLWxoLmgiCisKKyNpZm5kZWYgQ1lfVFlQRVMKKyNkZWZpbmUgQ1lfVFlQRVMKK3R5cGVkZWYJX191NjQJdWNkb3VibGU7CS8qIDY0IGJpdHMsIHVuc2lnbmVkICovCit0eXBlZGVmCV9fdTMyCXVjbG9uZzsJCS8qIDMyIGJpdHMsIHVuc2lnbmVkICovCit0eXBlZGVmCV9fdTE2CXVjc2hvcnQ7CS8qIDE2IGJpdHMsIHVuc2lnbmVkICovCit0eXBlZGVmCV9fdTgJdWNjaGFyOwkJLyogOCBiaXRzLCB1bnNpZ25lZCAqLworI2VuZGlmIC8qIENZX1RZUEVTICovCisKKyNkZWZpbmUgUEMzMDBfUFJPVE9fTUxQUFAgMQkJCisKKyNkZWZpbmUgUEMzMDBfS0VSTkVMCSIyLjQueCIJLyogS2VybmVsIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworCisjZGVmaW5lCVBDMzAwX0RFVk5BTUUJImhkbGMiCS8qIERldi4gbmFtZSBiYXNlIChmb3IgaGRsYzAsIGhkbGMxLCBldGMuKSAqLworI2RlZmluZSBQQzMwMF9NQVhJTkRFWAkxMDAJLyogTWF4IGRldi4gbmFtZSBpbmRleCAodGhlICcwJyBpbiBoZGxjMCkgKi8KKworI2RlZmluZQlQQzMwMF9NQVhDQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgY2FyZHMgcGVyIHN5c3RlbSAqLworI2RlZmluZQlQQzMwMF9NQVhDSEFOCTIJLyogTnVtYmVyIG9mIGNoYW5uZWxzIHBlciBjYXJkICovCisKKyNkZWZpbmUJUEMzMDBfUExYX1dJTgkweDgwICAgIC8qIFBMWCBjb250cm9sIHdpbmRvdyBzaXplICgxMjhiKSAqLworI2RlZmluZQlQQzMwMF9SQU1TSVpFCTB4NDAwMDAgLyogUkFNIHdpbmRvdyBzaXplICgyNTZLYikgKi8KKyNkZWZpbmUJUEMzMDBfU0NBU0laRQkweDQwMCAgIC8qIFNDQSB3aW5kb3cgc2l6ZSAoMUtiKSAqLworI2RlZmluZQlQQzMwMF9GQUxDU0laRQkweDQwMAkvKiBGQUxDIHdpbmRvdyBzaXplICgxS2IpICovCisKKyNkZWZpbmUgUEMzMDBfT1NDX0NMT0NLCTI0NTc2MDAwCisjZGVmaW5lIFBDMzAwX1BDSV9DTE9DSwkzMzAwMDAwMAorCisjZGVmaW5lIEJEX0RFRl9MRU4JMHgwODAwCS8qIERNQSBidWZmZXIgbGVuZ3RoICgyS0IpICovCisjZGVmaW5lIERNQV9UWF9NRU1TWgkweDgwMDAJLyogVG90YWwgRE1BIFR4IG1lbW9yeSBzaXplICgzMktCL2NoKSAqLworI2RlZmluZSBETUFfUlhfTUVNU1oJMHgxMDAwMAkvKiBUb3RhbCBETUEgUnggbWVtb3J5IHNpemUgKDY0S0IvY2gpICovCisKKyNkZWZpbmUgTl9ETUFfVFhfQlVGCShETUFfVFhfTUVNU1ogLyBCRF9ERUZfTEVOKQkvKiBETUEgVHggYnVmZmVycyAqLworI2RlZmluZSBOX0RNQV9SWF9CVUYJKERNQV9SWF9NRU1TWiAvIEJEX0RFRl9MRU4pCS8qIERNQSBSeCBidWZmZXJzICovCisKKy8qIERNQSBCdWZmZXIgT2Zmc2V0cyAqLworI2RlZmluZSBETUFfVFhfQkFTRQkoKE5fRE1BX1RYX0JVRiArIE5fRE1BX1JYX0JVRikgKglcCisJCQkgUEMzMDBfTUFYQ0hBTiAqIHNpemVvZihwY3NjYV9iZF90KSkKKyNkZWZpbmUgRE1BX1JYX0JBU0UJKERNQV9UWF9CQVNFICsgUEMzMDBfTUFYQ0hBTipETUFfVFhfTUVNU1opCisKKy8qIERNQSBEZXNjcmlwdG9yIE9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX1RYX0JEX0JBU0UJMHgwMDAwCisjZGVmaW5lIERNQV9SWF9CRF9CQVNFCShETUFfVFhfQkRfQkFTRSArICgoUEMzMDBfTUFYQ0hBTipETUFfVFhfTUVNU1ogLyBcCisJCQkJQkRfREVGX0xFTikgKiBzaXplb2YocGNzY2FfYmRfdCkpKQorCisvKiBETUEgRGVzY3JpcHRvciBNYWNyb3MgKi8KKyNkZWZpbmUgVFhfQkRfQUREUihjaGFuLCBuKQkoRE1BX1RYX0JEX0JBU0UgKyBcCisJCQkJICgoTl9ETUFfVFhfQlVGKmNoYW4pICsgbikgKiBzaXplb2YocGNzY2FfYmRfdCkpCisjZGVmaW5lIFJYX0JEX0FERFIoY2hhbiwgbikJKERNQV9SWF9CRF9CQVNFICsgXAorCQkJCSAoKE5fRE1BX1JYX0JVRipjaGFuKSArIG4pICogc2l6ZW9mKHBjc2NhX2JkX3QpKQorCisvKiBNYWNybyB0byBhY2Nlc3MgdGhlIEZBTEMgcmVnaXN0ZXJzIChURSBvbmx5KSAqLworI2RlZmluZSBGX1JFRyhyZWcsIGNoYW4pCSgweDIwMCooY2hhbikgKyAoKHJlZyk8PDIpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucy9tYWNyb3MgICAgICAqCisgKiAocmVxdWlyZWQgdG8gc3VwcG9ydCBBbHBoYSBzeXN0ZW1zKSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgY3BjX3dyaXRlYihwb3J0LHZhbCkJe3dyaXRlYigodWNjaGFyKSh2YWwpLChwb3J0KSk7IG1iKCk7fQorI2RlZmluZSBjcGNfd3JpdGV3KHBvcnQsdmFsKQl7d3JpdGV3KCh1c2hvcnQpKHZhbCksKHBvcnQpKTsgbWIoKTt9CisjZGVmaW5lIGNwY193cml0ZWwocG9ydCx2YWwpCXt3cml0ZWwoKHVjbG9uZykodmFsKSwocG9ydCkpOyBtYigpO30KKworI2RlZmluZSBjcGNfcmVhZGIocG9ydCkJCXJlYWRiKHBvcnQpCisjZGVmaW5lIGNwY19yZWFkdyhwb3J0KQkJcmVhZHcocG9ydCkKKyNkZWZpbmUgY3BjX3JlYWRsKHBvcnQpCQlyZWFkbChwb3J0KQorCisjZWxzZSAvKiBfX0tFUk5FTF9fICovCisjZGVmaW5lIGNwY193cml0ZWIocG9ydCx2YWwpCSgqKHZvbGF0aWxlIHVjY2hhciAqKShwb3J0KSA9ICh1Y2NoYXIpKHZhbCkpCisjZGVmaW5lIGNwY193cml0ZXcocG9ydCx2YWwpCSgqKHZvbGF0aWxlIHVjc2hvcnQgKikocG9ydCkgPSAodWNzaG9ydCkodmFsKSkKKyNkZWZpbmUgY3BjX3dyaXRlbChwb3J0LHZhbCkJKCoodm9sYXRpbGUgdWNsb25nICopKHBvcnQpID0gKHVjbG9uZykodmFsKSkKKworI2RlZmluZSBjcGNfcmVhZGIocG9ydCkJCSgqKHZvbGF0aWxlIHVjY2hhciAqKShwb3J0KSkKKyNkZWZpbmUgY3BjX3JlYWR3KHBvcnQpCQkoKih2b2xhdGlsZSB1Y3Nob3J0ICopKHBvcnQpKQorI2RlZmluZSBjcGNfcmVhZGwocG9ydCkJCSgqKHZvbGF0aWxlIHVjbG9uZyAqKShwb3J0KSkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworLyoqKioqKiBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgICAgIFJVTlRJTUVfOTA1MCAtIFBMWCBQQ0k5MDUwLTEgbG9jYWwgY29uZmlndXJhdGlvbiBhbmQgc2hhcmVkIHJ1bnRpbWUKKyAqICAgICAgcmVnaXN0ZXJzLiBUaGlzIHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIDkwNTAgcmVnaXN0ZXJzCisgKiAgICAgIChtZW1vcnkgbWFwcGVkKS4KKyAqLworc3RydWN0IFJVTlRJTUVfOTA1MCB7CisJdWNsb25nCWxvY19hZGRyX3JhbmdlWzRdOwkvKiAwMC0wQ2ggOiBMb2NhbCBBZGRyZXNzIFJhbmdlcyAqLworCXVjbG9uZwlsb2Nfcm9tX3JhbmdlOwkJLyogMTBoIDogTG9jYWwgUk9NIFJhbmdlICovCisJdWNsb25nCWxvY19hZGRyX2Jhc2VbNF07CS8qIDE0LTIwaCA6IExvY2FsIEFkZHJlc3MgQmFzZSBBZGRycyAqLworCXVjbG9uZwlsb2Nfcm9tX2Jhc2U7CQkvKiAyNGggOiBMb2NhbCBST00gQmFzZSAqLworCXVjbG9uZwlsb2NfYnVzX2Rlc2NyWzRdOwkvKiAyOC0zNGggOiBMb2NhbCBCdXMgRGVzY3JpcHRvcnMgKi8KKwl1Y2xvbmcJcm9tX2J1c19kZXNjcjsJCS8qIDM4aCA6IFJPTSBCdXMgRGVzY3JpcHRvciAqLworCXVjbG9uZwljc19iYXNlWzRdOwkJLyogM0MtNDhoIDogQ2hpcCBTZWxlY3QgQmFzZSBBZGRycyAqLworCXVjbG9uZwlpbnRyX2N0cmxfc3RhdDsJCS8qIDRDaCA6IEludGVycnVwdCBDb250cm9sL1N0YXR1cyAqLworCXVjbG9uZwlpbml0X2N0cmw7CQkvKiA1MGggOiBFRVBST00gY3RybCwgSW5pdCBDdHJsLCBldGMgKi8KK307CisKKyNkZWZpbmUgUExYXzkwNTBfTElOVDFfRU5BQkxFCTB4MDEKKyNkZWZpbmUgUExYXzkwNTBfTElOVDFfUE9MCTB4MDIKKyNkZWZpbmUgUExYXzkwNTBfTElOVDFfU1RBVFVTCTB4MDQKKyNkZWZpbmUgUExYXzkwNTBfTElOVDJfRU5BQkxFCTB4MDgKKyNkZWZpbmUgUExYXzkwNTBfTElOVDJfUE9MCTB4MTAKKyNkZWZpbmUgUExYXzkwNTBfTElOVDJfU1RBVFVTCTB4MjAKKyNkZWZpbmUgUExYXzkwNTBfSU5UUl9FTkFCTEUJMHg0MAorI2RlZmluZSBQTFhfOTA1MF9TV19JTlRSCTB4ODAKKworLyogTWFza3MgdG8gYWNjZXNzIHRoZSBpbml0X2N0cmwgUExYIHJlZ2lzdGVyICovCisjZGVmaW5lCVBDMzAwX0NMS1NFTF9NQVNLCQkoMHgwMDAwMDAwNFVMKQorI2RlZmluZQlQQzMwMF9DSE1FRElBX01BU0soY2hhbikJKDB4MDAwMDAwMjBVTDw8KGNoYW4qMykpCisjZGVmaW5lCVBDMzAwX0NUWVBFX01BU0sJCSgweDAwMDAwODAwVUwpCisKKy8qIENQTEQgUmVnaXN0ZXJzIChiYXNlIGFkZHIgPSBmYWxjYmFzZSwgVEUgb25seSkgKi8KKy8qIENQTEQgdi4gMCAqLworI2RlZmluZSBDUExEX1JFRzEJMHgxNDAJLyogQ2hpcCByZXNldHMsIERDRC9DVFMgc3RhdHVzICovCisjZGVmaW5lIENQTERfUkVHMgkweDE0NAkvKiBDbG9jayBlbmFibGUgLCBMRUQgY29udHJvbCAqLworLyogQ1BMRCB2LiAyIG9yIGhpZ2hlciAqLworI2RlZmluZSBDUExEX1YyX1JFRzEJMHgxMDAJLyogQ2hpcCByZXNldHMsIERDRC9DVFMgc3RhdHVzICovCisjZGVmaW5lIENQTERfVjJfUkVHMgkweDEwNAkvKiBDbG9jayBlbmFibGUgLCBMRUQgY29udHJvbCAqLworI2RlZmluZSBDUExEX0lEX1JFRwkweDEwOAkvKiBDUExEIHZlcnNpb24gKi8KKworLyogQ1BMRCBSZWdpc3RlciBiaXQgZGVzY3JpcHRpb246IGZvciB0aGUgRkFMQyBiaXRzLCB0aGV5IHNob3VsZCBhbHdheXMgYmUgCisgICBzZXQgYmFzZWQgb24gdGhlIGNoYW5uZWwgKHVzZSAoYml0PDwoMipjaCkpIHRvIGFjY2VzcyB0aGUgY29ycmVjdCBiaXQgZm9yIAorICAgdGhhdCBjaGFubmVsKSAqLworI2RlZmluZSBDUExEX1JFRzFfRkFMQ19SRVNFVAkweDAxCisjZGVmaW5lIENQTERfUkVHMV9TQ0FfUkVTRVQJMHgwMgorI2RlZmluZSBDUExEX1JFRzFfR0xPQkFMX0NMSwkweDA4CisjZGVmaW5lIENQTERfUkVHMV9GQUxDX0RDRAkweDEwCisjZGVmaW5lIENQTERfUkVHMV9GQUxDX0NUUwkweDIwCisKKyNkZWZpbmUgQ1BMRF9SRUcyX0ZBTENfVFhfQ0xLCTB4MDEKKyNkZWZpbmUgQ1BMRF9SRUcyX0ZBTENfUlhfQ0xLCTB4MDIKKyNkZWZpbmUgQ1BMRF9SRUcyX0ZBTENfTEVEMQkweDEwCisjZGVmaW5lIENQTERfUkVHMl9GQUxDX0xFRDIJMHgyMAorCisvKiBTdHJ1Y3R1cmUgd2l0aCBGQUxDLXJlbGF0ZWQgZmllbGRzIChURSBvbmx5KSAqLworI2RlZmluZSBQQzMwMF9GQUxDX01BWExPT1AJMHgwMDAwZmZmZgkvKiBmb3IgZmFsY19pc3N1ZV9jbWQoKSAqLworCit0eXBlZGVmIHN0cnVjdCBmYWxjIHsKKwl1Y2NoYXIgc3luYzsJCS8qIElmIHRydWUgRkFMQyBpcyBzeW5jaHJvbml6ZWQgKi8KKwl1Y2NoYXIgYWN0aXZlOwkJLyogaWYgVFJVRSB0aGVuIGFscmVhZHkgYWN0aXZlICovCisJdWNjaGFyIGxvb3BfYWN0aXZlOwkvKiBpZiBUUlVFIGEgbGluZSBsb29wYmFjayBVUCB3YXMgcmVjZWl2ZWQgKi8KKwl1Y2NoYXIgbG9vcF9nZW47CS8qIGlmIFRSVUUgYSBsaW5lIGxvb3BiYWNrIFVQIHdhcyBpc3N1ZWQgKi8KKworCXVjY2hhciBudW1fY2hhbm5lbHM7CisJdWNjaGFyIG9mZnNldDsJCS8qIDEgZm9yIFQxLCAwIGZvciBFMSAqLworCXVjY2hhciBmdWxsX2JhbmR3aWR0aDsKKworCXVjY2hhciB4bWJfY2F1c2U7CisJdWNjaGFyIG11bHRpZnJhbWVfbW9kZTsKKworCS8qIFN0YXRpc3RpY3MgKi8KKwl1Y3Nob3J0IHBkZW47CS8qIFB1bHNlIERlbnNpdHkgdmlvbGF0aW9uIGNvdW50ICovCisJdWNzaG9ydCBsb3M7CS8qIExvc3Mgb2YgU2lnbmFsIGNvdW50ICovCisJdWNzaG9ydCBsb3NyOwkvKiBMb3NzIG9mIFNpZ25hbCByZWNvdmVyeSBjb3VudCAqLworCXVjc2hvcnQgbGZhOwkvKiBMb3NzIG9mIGZyYW1lIGFsaWdubWVudCBjb3VudCAqLworCXVjc2hvcnQgZmFyZWM7CS8qIEZyYW1lIEFsaWdubWVudCBSZWNvdmVyeSBjb3VudCAqLworCXVjc2hvcnQgbG1mYTsJLyogTG9zcyBvZiBtdWx0aWZyYW1lIGFsaWdubWVudCBjb3VudCAqLworCXVjc2hvcnQgYWlzOwkvKiBSZW1vdGUgQWxhcm0gaW5kaWNhdGlvbiBTaWduYWwgY291bnQgKi8KKwl1Y3Nob3J0IHNlYzsJLyogT25lLXNlY29uZCB0aW1lciAqLworCXVjc2hvcnQgZXM7CS8qIEVycm9yZWQgc2Vjb25kICovCisJdWNzaG9ydCByYWk7CS8qIHJlbW90ZSBhbGFybSByZWNlaXZlZCAqLworCXVjc2hvcnQgYmVjOworCXVjc2hvcnQgZmVjOworCXVjc2hvcnQgY3ZjOworCXVjc2hvcnQgY2VjOworCXVjc2hvcnQgZWJjOworCisJLyogU3RhdHVzICovCisJdWNjaGFyIHJlZF9hbGFybTsKKwl1Y2NoYXIgYmx1ZV9hbGFybTsKKwl1Y2NoYXIgbG9zc19mYTsKKwl1Y2NoYXIgeWVsbG93X2FsYXJtOworCXVjY2hhciBsb3NzX21mYTsKKwl1Y2NoYXIgcHJiczsKK30gZmFsY190OworCit0eXBlZGVmIHN0cnVjdCBmYWxjX3N0YXR1cyB7CisJdWNjaGFyIHN5bmM7ICAvKiBJZiB0cnVlIEZBTEMgaXMgc3luY2hyb25pemVkICovCisJdWNjaGFyIHJlZF9hbGFybTsKKwl1Y2NoYXIgYmx1ZV9hbGFybTsKKwl1Y2NoYXIgbG9zc19mYTsKKwl1Y2NoYXIgeWVsbG93X2FsYXJtOworCXVjY2hhciBsb3NzX21mYTsKKwl1Y2NoYXIgcHJiczsKK30gZmFsY19zdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcnN2X3gyMV9zdGF0dXMgeworCXVjY2hhciBkY2Q7CisJdWNjaGFyIGRzcjsKKwl1Y2NoYXIgY3RzOworCXVjY2hhciBydHM7CisJdWNjaGFyIGR0cjsKK30gcnN2X3gyMV9zdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBzdGF0cyB7CisJaW50IGh3X3R5cGU7CisJdWNsb25nIGxpbmVfb247CisJdWNsb25nIGxpbmVfb2ZmOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGdlbl9zdGF0czsKKwlmYWxjX3QgdGVfc3RhdHM7Cit9IHBjMzAwc3RhdHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBzdGF0dXMgeworCWludCBod190eXBlOworCXJzdl94MjFfc3RhdHVzX3QgZ2VuX3N0YXR1czsKKwlmYWxjX3N0YXR1c190IHRlX3N0YXR1czsKK30gcGMzMDBzdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBsb29wYmFjayB7CisJY2hhciBsb29wX3R5cGU7CisJY2hhciBsb29wX29uOworfSBwYzMwMGxvb3BiYWNrX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwcGF0dGVybnRzdCB7CisJY2hhciBwYXRybnRzdF9vbjsgICAgICAgLyogMCAtIG9mZjsgMSAtIG9uOyAyIC0gcmVhZCBudW1fZXJyb3JzICovCisJdWNzaG9ydCBudW1fZXJyb3JzOworfSBwYzMwMHBhdHRlcm50c3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBkZXYgeworCXZvaWQgKmlmX3B0cjsJCS8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyICovCisJc3RydWN0IHBjMzAwY2ggKmNoYW47CisJdWNjaGFyIHRyYWNlX29uOworCXVjbG9uZyBsaW5lX29uOwkJLyogRENEKFguMjEsIFJTVikgLyBzeW5jKFRFKSBjaGFuZ2UgY291bnRlcnMgKi8KKwl1Y2xvbmcgbGluZV9vZmY7CisjaWZkZWYgX19LRVJORUxfXworCWNoYXIgbmFtZVsxNl07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCXZvaWQgKnByaXZhdGU7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwl1bmlvbiB7CS8qIFRoaXMgdW5pb24gaGFzIGFsbCB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgc3RydWN0dXJlcyAqLworCQlzdHJ1Y3QgcHBwX2RldmljZSBwcHBkZXY7CisJfWlmdTsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwl2b2lkICpjcGNfdHR5OwkvKiBpbmZvcm1hdGlvbiB0byBQQzMwMCBUVFkgZHJpdmVyICovCisjZW5kaWYKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCit9cGMzMDBkZXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBodyB7CisJaW50IHR5cGU7CQkvKiBSU1YsIFgyMSwgZXRjLiAqLworCWludCBidXM7CQkvKiBCdXMgKFBDSSwgUE1DLCBldGMuKSAqLworCWludCBuY2hhbjsJCS8qIG51bWJlciBvZiBjaGFubmVscyAqLworCWludCBpcnE7CQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCBsZXZlbCAqLworCXVjbG9uZyBjbG9jazsJCS8qIEJvYXJkIGNsb2NrICovCisJdWNjaGFyIGNwbGRfaWQ7CQkvKiBDUExEIElEIChURSBvbmx5KSAqLworCXVjc2hvcnQgY3BsZF9yZWcxOwkvKiBDUExEIHJlZyAxIChURSBvbmx5KSAqLworCXVjc2hvcnQgY3BsZF9yZWcyOwkvKiBDUExEIHJlZyAyIChURSBvbmx5KSAqLworCXVjc2hvcnQgZ3Bpb2NfcmVnOwkvKiBQTFggR1BJT0MgcmVnICovCisJdWNzaG9ydCBpbnRjdGxfcmVnOwkvKiBQTFggSW50IEN0cmwvU3RhdHVzIHJlZyAqLworCXVjbG9uZyBpb3BoeXM7CQkvKiBQTFggcmVnaXN0ZXJzIEkvTyBiYXNlICovCisJdWNsb25nIGlvc2l6ZTsJCS8qIFBMWCByZWdpc3RlcnMgSS9PIHNpemUgKi8KKwl1Y2xvbmcgcGx4cGh5czsJCS8qIFBMWCByZWdpc3RlcnMgTU1JTyBiYXNlIChwaHlzaWNhbCkgKi8KKwl2b2lkIF9faW9tZW0gKiBwbHhiYXNlOwkvKiBQTFggcmVnaXN0ZXJzIE1NSU8gYmFzZSAodmlydHVhbCkgKi8KKwl1Y2xvbmcgcGx4c2l6ZTsJCS8qIFBMWCByZWdpc3RlcnMgTU1JTyBzaXplICovCisJdWNsb25nIHNjYXBoeXM7CQkvKiBTQ0EgcmVnaXN0ZXJzIE1NSU8gYmFzZSAocGh5c2ljYWwpICovCisJdm9pZCBfX2lvbWVtICogc2NhYmFzZTsJLyogU0NBIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHZpcnR1YWwpICovCisJdWNsb25nIHNjYXNpemU7CQkvKiBTQ0EgcmVnaXN0ZXJzIE1NSU8gc2l6ZSAqLworCXVjbG9uZyByYW1waHlzOwkJLyogT24tYm9hcmQgUkFNIE1NSU8gYmFzZSAocGh5c2ljYWwpICovCisJdm9pZCBfX2lvbWVtICogcmFtYmFzZTsJLyogT24tYm9hcmQgUkFNIE1NSU8gYmFzZSAodmlydHVhbCkgKi8KKwl1Y2xvbmcgYWxsb2NfcmFtc2l6ZTsJLyogUkFNIE1NSU8gc2l6ZSBhbGxvY2F0ZWQgYnkgdGhlIFBDSSBicmlkZ2UgKi8KKwl1Y2xvbmcgcmFtc2l6ZTsJCS8qIE9uLWJvYXJkIFJBTSBNTUlPIHNpemUgKi8KKwl1Y2xvbmcgZmFsY3BoeXM7CS8qIEZBTEMgcmVnaXN0ZXJzIE1NSU8gYmFzZSAocGh5c2ljYWwpICovCisJdm9pZCBfX2lvbWVtICogZmFsY2Jhc2U7LyogRkFMQyByZWdpc3RlcnMgTU1JTyBiYXNlICh2aXJ0dWFsKSAqLworCXVjbG9uZyBmYWxjc2l6ZTsJLyogRkFMQyByZWdpc3RlcnMgTU1JTyBzaXplICovCit9IHBjMzAwaHdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBjaGNvbmYgeworCXN5bmNfc2VyaWFsX3NldHRpbmdzCXBoeXNfc2V0dGluZ3M7CS8qIENsb2NrIHR5cGUvcmF0ZSAoaW4gYnBzKSwgCisJCQkJCQkgICBsb29wYmFjayBtb2RlICovCisJcmF3X2hkbGNfcHJvdG8JCXByb3RvX3NldHRpbmdzOwkvKiBFbmNvZGluZywgcGFyaXR5IChDUkMpICovCisJdWNsb25nIG1lZGlhOwkJLyogSFcgbWVkaWEgKFJTMjMyLCBWLjM1LCBldGMuKSAqLworCXVjbG9uZyBwcm90bzsJCS8qIFByb3RvY29sIChQUFAsIFguMjUsIGV0Yy4pICovCisJdWNjaGFyIG1vbml0b3I7CQkvKiBNb25pdG9yIG1vZGUgKDAgPSBvZmYsICEwID0gb24pICovCisKKwkvKiBURS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJdWNjaGFyIGxjb2RlOwkJLyogTGluZSBDb2RlIChBTUksIEI4WlMsIGV0Yy4pICovCisJdWNjaGFyIGZyX21vZGU7CQkvKiBGcmFtZSBNb2RlIChFU0YsIEQ0LCBldGMuKSAqLworCXVjY2hhciBsYm87CQkvKiBMaW5lIEJ1aWxkIE91dCAqLworCXVjY2hhciByeF9zZW5zOwkJLyogUnggU2Vuc2l0aXZpdHkgKGxvbmctIG9yIHNob3J0LWhhdWwpICovCisJdWNsb25nIHRzbG90X2JpdG1hcDsJLyogYml0W2ldPTEgID0+ICB0aW1lc2xvdCBfaV8gaXMgYWN0aXZlICovCit9IHBjMzAwY2hjb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwY2ggeworCXN0cnVjdCBwYzMwMCAqY2FyZDsKKwlpbnQgY2hhbm5lbDsKKwlwYzMwMGRldl90IGQ7CisJcGMzMDBjaGNvbmZfdCBjb25mOworCXVjY2hhciB0eF9maXJzdF9iZDsJLyogRmlyc3QgVFggRE1BIGJsb2NrIGRlc2NyLiB3LyBkYXRhICovCisJdWNjaGFyIHR4X25leHRfYmQ7CS8qIE5leHQgZnJlZSBUWCBETUEgYmxvY2sgZGVzY3JpcHRvciAqLworCXVjY2hhciByeF9maXJzdF9iZDsJLyogRmlyc3QgZnJlZSBSWCBETUEgYmxvY2sgZGVzY3JpcHRvciAqLworCXVjY2hhciByeF9sYXN0X2JkOwkvKiBMYXN0IGZyZWUgUlggRE1BIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwl1Y2NoYXIgbmZyZWVfdHhfYmQ7CS8qIE51bWJlciBvZiBmcmVlIFRYIERNQSBibG9jayBkZXNjcmlwdG9ycyAqLworCWZhbGNfdCBmYWxjOwkJLyogRkFMQyBzdHJ1Y3R1cmUgKFRFIG9ubHkpICovCit9IHBjMzAwY2hfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDAgeworCXBjMzAwaHdfdCBodzsJCQkvKiBoYXJkd2FyZSBjb25maWcuICovCisJcGMzMDBjaF90IGNoYW5bUEMzMDBfTUFYQ0hBTl07CisjaWZkZWYgX19LRVJORUxfXworCXNwaW5sb2NrX3QgY2FyZF9sb2NrOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KK30gcGMzMDBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBjb25mIHsKKwlwYzMwMGh3X3QgaHc7CisJcGMzMDBjaGNvbmZfdCBjb25mOworfSBwYzMwMGNvbmZfdDsKKworLyogREVWIGlvY3RsKCkgY29tbWFuZHMgKi8KKyNkZWZpbmUJTl9TUFBQX0lPQ1RMUwkyCisKK2VudW0gcGMzMDBfaW9jdGxfY21kcyB7CisJU0lPQ0NQQ1JFU0VSVkVEID0gKFNJT0NERVZQUklWQVRFICsgTl9TUFBQX0lPQ1RMUyksCisJU0lPQ0dQQzMwMENPTkYsCisJU0lPQ1NQQzMwMENPTkYsCisJU0lPQ0dQQzMwMFNUQVRVUywKKwlTSU9DR1BDMzAwRkFMQ1NUQVRVUywKKwlTSU9DR1BDMzAwVVRJTFNUQVRTLAorCVNJT0NHUEMzMDBVVElMU1RBVFVTLAorCVNJT0NTUEMzMDBUUkFDRSwKKwlTSU9DU1BDMzAwTE9PUEJBQ0ssCisJU0lPQ1NQQzMwMFBBVFRFUk5URVNULAorfTsKKworLyogTG9vcGJhY2sgdHlwZXMgLSBQQzMwMC9URSBib2FyZHMgKi8KK2VudW0gcGMzMDBfbG9vcGJhY2tfY21kcyB7CisJUEMzMDBMT0NMT09QID0gMSwKKwlQQzMwMFJFTUxPT1AsCisJUEMzMDBQQVlMT0FETE9PUCwKKwlQQzMwMEdFTkxPT1BVUCwKKwlQQzMwMEdFTkxPT1BET1dOLAorfTsKKworLyogQ29udHJvbCBDb25zdGFudCBEZWZpbml0aW9ucyAqLworI2RlZmluZQlQQzMwMF9SU1YJMHgwMQorI2RlZmluZQlQQzMwMF9YMjEJMHgwMgorI2RlZmluZQlQQzMwMF9URQkweDAzCisKKyNkZWZpbmUJUEMzMDBfUENJCTB4MDAKKyNkZWZpbmUJUEMzMDBfUE1DCTB4MDEKKworI2RlZmluZSBQQzMwMF9MQ19BTUkJMHgwMQorI2RlZmluZSBQQzMwMF9MQ19COFpTCTB4MDIKKyNkZWZpbmUgUEMzMDBfTENfTlJaCTB4MDMKKyNkZWZpbmUgUEMzMDBfTENfSERCMwkweDA0CisKKy8qIEZyYW1pbmcgKFQxKSAqLworI2RlZmluZSBQQzMwMF9GUl9FU0YJCTB4MDEKKyNkZWZpbmUgUEMzMDBfRlJfRDQJCTB4MDIKKyNkZWZpbmUgUEMzMDBfRlJfRVNGX0pBUEFOCTB4MDMKKworLyogRnJhbWluZyAoRTEpICovCisjZGVmaW5lIFBDMzAwX0ZSX01GX0NSQzQJMHgwNAorI2RlZmluZSBQQzMwMF9GUl9NRl9OT05fQ1JDNAkweDA1CisjZGVmaW5lIFBDMzAwX0ZSX1VORlJBTUVECTB4MDYKKworI2RlZmluZSBQQzMwMF9MQk9fMF9EQgkJMHgwMAorI2RlZmluZSBQQzMwMF9MQk9fN181X0RCCTB4MDEKKyNkZWZpbmUgUEMzMDBfTEJPXzE1X0RCCQkweDAyCisjZGVmaW5lIFBDMzAwX0xCT18yMl81X0RCCTB4MDMKKworI2RlZmluZSBQQzMwMF9SWF9TRU5TX1NICTB4MDEKKyNkZWZpbmUgUEMzMDBfUlhfU0VOU19MSAkweDAyCisKKyNkZWZpbmUgUEMzMDBfVFhfVElNRU9VVAkoMipIWikKKyNkZWZpbmUgUEMzMDBfVFhfUVVFVUVfTEVOCTEwMAorI2RlZmluZQlQQzMwMF9ERUZfTVRVCQkxNjAwCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCitpbnQgZG1hX2J1Zl93cml0ZShwYzMwMF90ICosIGludCwgdWNjaGFyICosIGludCk7CitpbnQgZG1hX2J1Zl9yZWFkKHBjMzAwX3QgKiwgaW50LCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3ZvaWQgdHhfZG1hX3N0YXJ0KHBjMzAwX3QgKiwgaW50KTsKK3ZvaWQgcnhfZG1hX3N0YXJ0KHBjMzAwX3QgKiwgaW50KTsKK3ZvaWQgdHhfZG1hX3N0b3AocGMzMDBfdCAqLCBpbnQpOwordm9pZCByeF9kbWFfc3RvcChwYzMwMF90ICosIGludCk7CitpbnQgY3BjX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGNwY19uZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGNwY19zY2Ffc3RhdHVzKHBjMzAwX3QgKiwgaW50KTsKK2ludCBjcGNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOworaW50IGNwY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKK2ludCBjaF9jb25maWcocGMzMDBkZXZfdCAqKTsKK2ludCByeF9jb25maWcocGMzMDBkZXZfdCAqKTsKK2ludCB0eF9jb25maWcocGMzMDBkZXZfdCAqKTsKK3ZvaWQgY3BjX29wZW5jaChwYzMwMGRldl90ICopOwordm9pZCBjcGNfY2xvc2VjaChwYzMwMGRldl90ICopOworaW50IGNwY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGNwY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBjcGNfc2V0X21lZGlhKGhkbGNfZGV2aWNlICosIGludCk7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX1BDMzAwX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2JlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKQEAgLTAsMCArMSwzNjkyIEBACisjZGVmaW5lCVVTRV9QQ0lfQ0xPQ0sKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAKKyJSZXZpc2lvbjogMy40LjUgRGF0ZTogMjAwMi8wMy8wNyAiOworCisvKgorICogcGMzMDAuYwlDeWNsYWRlcy1QQzMwMCh0bSkgRHJpdmVyLgorICoKKyAqIEF1dGhvcjoJSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPgorICogTWFpbnRhaW5lcjoJUEMzMDAgTWFpbnRhaW5lciA8cGMzMDBAY3ljbGFkZXMuY29tPgorICoKKyAqIENvcHlyaWdodDoJKGMpIDE5OTktMjAwMyBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgkKKyAqCVVzaW5nIHRhYnN0b3AgPSA0LgorICogCisgKiAkTG9nOiBwYzMwMF9kcnYuYyx2ICQKKyAqIFJldmlzaW9uIDMuMjMgIDIwMDIvMDMvMjAgMTM6NTg6NDAgIGhlbnJpcXVlCisgKiBGaXhlZCBvcnRvZ3JhcGhpYyBtaXN0YWtlcworICoKKyAqIFJldmlzaW9uIDMuMjIgIDIwMDIvMDMvMTMgMTY6NTY6NTYgIGhlbnJpcXVlCisgKiBUYWtlIG91dCB0aGUgZGVidWcgbWVzc2FnZXMKKyAqCisgKiBSZXZpc2lvbiAzLjIxICAyMDAyLzAzLzA3IDE0OjE3OjA5ICBoZW5yaXF1ZQorICogTGljZW5zZSBkYXRhIGZpeGVkCisgKgorICogUmV2aXNpb24gMy4yMCAgMjAwMi8wMS8xNyAxNzo1ODo1MiAgaXZhbgorICogU3VwcG9ydCBmb3IgUEMzMDAtVEUvTSAoUE1DKS4KKyAqCisgKiBSZXZpc2lvbiAzLjE5ICAyMDAyLzAxLzAzIDE3OjA4OjQ3ICBkYW5pZWxhCisgKiBFbmFibGVzIERNQSByZWNlcHRpb24gd2hlbiB0aGUgU0NBLUlJIGRpc2FibGVzIGl0IGltcHJvcGVybHkuCisgKgorICogUmV2aXNpb24gMy4xOCAgMjAwMS8xMi8wMyAxODo0Nzo1MCAgZGFuaWVsYQorICogRXN0aGV0aWMgY2hhbmdlcy4KKyAqCisgKiBSZXZpc2lvbiAzLjE3ICAyMDAxLzEwLzE5IDE2OjUwOjEzICBoZW5yaXF1ZQorICogUGF0Y2ggdG8ga2VybmVsIDIuNC4xMiBhbmQgbmV3IGdlbmVyaWMgaGRsYy4KKyAqCisgKiBSZXZpc2lvbiAzLjE2ICAyMDAxLzEwLzE2IDE1OjEyOjMxICByZWdpbmEKKyAqIGNsZWFyIHN0YXRpc3RpY3MKKyAqCisgKiBSZXZpc2lvbiAzLjExIHRvIDMuMTUgIDIwMDEvMTAvMTEgMjA6MjY6MDQgIGRhbmllbGEKKyAqIE1vcmUgRE1BIGZpeGVzIGZvciBub2lzeSBsaW5lcy4KKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBiYWQgZnJhbWVzIGluIGRtYV9nZXRfcnhfZnJhbWVfc2l6ZSwgc28gdGhhdCB0aGUgUnggYnVmZmVyCisgKiBkZXNjcmlwdG9ycyBjYW4gYmUgY2xlYW5lZCBieSBkbWFfYnVmX3JlYWQgKGNhbGxlZCBpbiBjcGNfbmV0X3J4KS4KKyAqIFJlbmFtZWQgZG1hX3N0YXJ0IHJvdXRpbmUgdG8gcnhfZG1hX3N0YXJ0LiBJbXByb3ZlZCBSeCBzdGF0aXN0aWNzLgorICogRml4ZWQgQk9GIGludGVycnVwdCB0cmVhdG1lbnQuIENyZWF0ZWQgZG1hX3N0YXJ0IHJvdXRpbmUuCisgKiBDaGFuZ2VkIG1pbiBhbmQgbWF4IHRvIGNwY19taW4gYW5kIGNwY19tYXguCisgKgorICogUmV2aXNpb24gMy4xMCAgMjAwMS8wOC8wNiAxMjowMTo1MSAgcmVnaW5hCisgKiBGaXhlZCBwcm9ibGVtIGluIERTUl9ERSBiaXQuCisgKgorICogUmV2aXNpb24gMy45ICAyMDAxLzA3LzE4IDE5OjI3OjI2ICBkYW5pZWxhCisgKiBBZGRlZCBzb21lIGhpc3RvcnkgY29tbWVudHMuCisgKgorICogUmV2aXNpb24gMy44ICAyMDAxLzA3LzEyIDEzOjExOjE5ICByZWdpbmEKKyAqIGJ1ZyBmaXggLSBEQ0QtT0ZGIGluIHBjMzAwIHR0eSBkcml2ZXIKKyAqCisgKiBSZXZpc2lvbiAzLjMgdG8gMy43ICAyMDAxLzA3LzA2IDE1OjAwOjIwICBkYW5pZWxhCisgKiBSZW1vdmluZyBrZXJuZWwgMi40LjMgYW5kIHByZXZpb3VzIHN1cHBvcnQuCisgKiBETUEgdHJhbnNtaXNzaW9uIGJ1ZyBmaXguCisgKiBNVFUgY2hlY2sgaW4gY3BjX25ldF9yeCBmaXhlZC4KKyAqIEJvb3QgbWVzc2FnZXMgcmV2aWV3ZWQuCisgKiBOZXcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIChsaW5lIGNvZGUsIENSQyBjYWxjdWxhdGlvbiBhbmQgY2xvY2spLgorICoKKyAqIFJldmlzaW9uIDMuMiAyMDAxLzA2LzIyIDEzOjEzOjAyICByZWdpbmEKKyAqIE1MUFBQIGltcGxlbWVudGF0aW9uLiBDaGFuZ2VkIHRoZSBoZWFkZXIgb2YgbWVzc2FnZSB0cmFjZSB0byBpbmNsdWRlCisgKiB0aGUgZGV2aWNlIG5hbWUuIE5ldyBmb3JtYXQgOiAiaGRsY1hbUi9UXTogIi4KKyAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBjaGFuZ2VkLgorICoKKyAqIFJldmlzaW9uIDMuMSAyMDAxLzA2LzE1IHJlZ2luYQorICogaW4gY3BjX3F1ZXVlX3htaXQsIG5ldGlmX3N0b3BfcXVldWUgaXMgY2FsbGVkIGlmIGRvbid0IGhhdmUgZnJlZSBkZXNjcmlwdG9yCisgKiB1cHBpbmcgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAqCisgKiBSZXZpc2lvbiAxLjEuMS4xICAyMDAxLzA2LzEzIDIwOjI1OjA0ICBkYW5pZWxhCisgKiBQQzMwMCBpbml0aWFsIENWUyB2ZXJzaW9uICgzLjQuMC1wcmUxKQorICoKKyAqIFJldmlzaW9uIDMuMC4xLjIgMjAwMS8wNi8wOCBkYW5pZWxhCisgKiBEaWQgc29tZSBjaGFuZ2VzIGluIHRoZSBETUEgcHJvZ3JhbW1pbmcgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhlIAorICogb2NjdXJyZW5jZSBvZiBhIFNDQS1JSSBidWcgd2hlbiBDREEgaXMgYWNjZXNzZWQgZHVyaW5nIGEgRE1BIHRyYW5zZmVyLgorICoKKyAqIFJldmlzaW9uIDMuMC4xLjEgMjAwMS8wNS8wMiBkYW5pZWxhCisgKiBBZGRlZCBrZXJuZWwgMi40LjMgc3VwcG9ydC4KKyAqIAorICogUmV2aXNpb24gMy4wLjEuMCAyMDAxLzAzLzEzIGRhbmllbGEsIGhlbnJpcXVlCisgKiBBZGRlZCBGcmFtZSBSZWxheSBTdXBwb3J0LgorICogRHJpdmVyIG5vdyB1c2VzIEhETEMgZ2VuZXJpYyBkcml2ZXIgdG8gcHJvdmlkZSBwcm90b2NvbCBzdXBwb3J0LgorICogCisgKiBSZXZpc2lvbiAzLjAuMC44IDIwMDEvMDMvMDIgZGFuaWVsYQorICogRml4ZWQgcmFtIHNpemUgZGV0ZWN0aW9uLiAKKyAqIENoYW5nZWQgU0lPQ0dQQzMwMENPTkYgaW9jdGwsIHRvIGdpdmUgaHcgaW5mb3JtYXRpb24gdG8gcGMzMDB1dGlsLgorICogCisgKiBSZXZpc2lvbiAzLjAuMC43IDIwMDEvMDIvMjMgZGFuaWVsYQorICogbmV0aWZfc3RvcF9xdWV1ZSBjYWxsZWQgYmVmb3JlIHRoZSBTQ0EtSUkgdHJhbnNtaXRpb24gY29tbWFuZHMgaW4gCisgKiBjcGNfcXVldWVfeG1pdCwgYW5kIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCAKKyAqIHRyYW5zbWl0aW9uIGludGVycnVwdHMuCisgKiBGaXhlZCBmYWxjX2NoZWNrX3N0YXR1cyBmb3IgVW5mcmFtZWQgRTEuCisgKiAKKyAqIFJldmlzaW9uIDMuMC4wLjYgMjAwMC8xMi8xMyBkYW5pZWxhCisgKiBJbXBsZW1lbnRlZCBwYzMwMHV0aWwgc3VwcG9ydDogdHJhY2UsIHN0YXRpc3RpY3MsIHN0YXR1cyBhbmQgbG9vcGJhY2sKKyAqIHRlc3RzIGZvciB0aGUgUEMzMDAgVEUgYm9hcmRzLgorICogCisgKiBSZXZpc2lvbiAzLjAuMC41IDIwMDAvMTIvMTIgaXZhbgorICogQWRkZWQgc3VwcG9ydCBmb3IgVW5mcmFtZWQgRTEuCisgKiBJbXBsZW1lbnRlZCBtb25pdG9yIG1vZGUuCisgKiBGaXhlZCBEQ0Qgc2Vuc2l0aXZpdHkgb24gdGhlIHNlY29uZCBjaGFubmVsLgorICogRHJpdmVyIG5vdyBjb21wbGllcyB3aXRoIG5ldyBQQ0kga2VybmVsIGFyY2hpdGVjdHVyZS4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMC40IDIwMDAvMDkvMjggaXZhbgorICogSW1wbGVtZW50ZWQgRENEIHNlbnNpdGl2aXR5LgorICogTW92ZWQgaGFyZHdhcmUtc3BlY2lmaWMgb3BlbiB0byB0aGUgZW5kIG9mIGNwY19vcGVuLCB0byBhdm9pZCByYWNlCisgKiBjb25kaXRpb25zIHdpdGggZWFybHkgcmVjZXB0aW9uIGludGVycnVwdHMuCisgKiBJbmNsdWRlZCBjb2RlIGZvciBbcmVxdWVzdHxyZWxlYXNlXV9tZW1fcmVnaW9uKCkuCisgKiBDaGFuZ2VkIGxvY2F0aW9uIG9mIHBjMzAwLmggLgorICogTWlub3IgY29kZSByZXZpc2lvbiAoY29udHJpYi4gb2YgSmVmZiBHYXJ6aWspLgorICoKKyAqIFJldmlzaW9uIDMuMC4wLjMgMjAwMC8wNy8wMyBpdmFuCisgKiBQcmV2aW91cyBidWdmaXggZm9yIHRoZSBmcmFtaW5nIGVycm9ycyB3aXRoIGV4dGVybmFsIGNsb2NrIG1hZGUgWDIxCisgKiBib2FyZHMgc3RvcCB3b3JraW5nLiBUaGlzIHZlcnNpb24gZml4ZXMgaXQuCisgKgorICogUmV2aXNpb24gMy4wLjAuMiAyMDAwLzA2LzIzIGl2YW4KKyAqIFJldmlzaXRlZCBjcGNfcXVldWVfeG1pdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBvbiBUeCBETUEgYnVmZmVyCisgKiBoYW5kbGluZyB3aGVuIFR4IHRpbWVvdXRzIG9jY3VyLgorICogUmV2aXNpdGVkIFJ4IHN0YXRpc3RpY3MuCisgKiBGaXhlZCBhIGJ1ZyBpbiB0aGUgU0NBLUlJIHByb2dyYW1taW5nIHRoYXQgd291bGQgY2F1c2UgZnJhbWluZyBlcnJvcnMKKyAqIHdoZW4gZXh0ZXJuYWwgY2xvY2sgd2FzIGNvbmZpZ3VyZWQuCisgKgorICogUmV2aXNpb24gMy4wLjAuMSAyMDAwLzA1LzI2IGl2YW4KKyAqIEFkZGVkIGxvZ2ljIGluIHRoZSBTQ0EgaW50ZXJydXB0IGhhbmRsZXIgc28gdGhhdCBubyBib2FyZCBjYW4gbW9ub3BvbGl6ZQorICogdGhlIGRyaXZlci4KKyAqIFJlcXVlc3QgUExYIEkvTyByZWdpb24sIGFsdGhvdWdoIGRyaXZlciBkb2Vzbid0IHVzZSBpdCwgdG8gYXZvaWQKKyAqIHByb2JsZW1zIHdpdGggb3RoZXIgZHJpdmVycyBhY2Nlc3NpbmcgaXQuCisgKgorICogUmV2aXNpb24gMy4wLjAuMCAyMDAwLzA1LzE1IGl2YW4KKyAqIERpZCBzb21lIGNoYW5nZXMgaW4gdGhlIERNQSBwcm9ncmFtbWluZyBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCB0aGUKKyAqIG9jY3VycmVuY2Ugb2YgYSBTQ0EtSUkgYnVnIGluIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAqIEltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIFBMWDkwNTAgYnVnIHRoYXQgd291bGQgY2F1c2UgYSBzeXN0ZW0gbG9ja3VwCisgKiBpbiBjZXJ0YWluIHN5c3RlbXMsIGRlcGVuZGluZyBvbiB0aGUgTU1JTyBhZGRyZXNzZXMgYWxsb2NhdGVkIHRvIHRoZQorICogYm9hcmQuCisgKiBGaXhlZCB0aGUgRkFMQyBjaGlwIHByb2dyYW1taW5nIHRvIGF2b2lkIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtcyBpbiB0aGUKKyAqIHNlY29uZCBjaGFubmVsIChURSBvbmx5KS4KKyAqIEltcGxlbWVudGVkIGEgY2xlYW5lciBhbmQgZmFzdGVyIFR4IERNQSBkZXNjcmlwdG9yIGNsZWFudXAgcHJvY2VkdXJlIGluCisgKiBjcGNfcXVldWVfeG1pdCgpLgorICogQ2hhbmdlZCB0aGUgYnVpbHQtaW4gZHJpdmVyIGltcGxlbWVudGF0aW9uIHNvIHRoYXQgdGhlIGRyaXZlciBjYW4gdXNlIHRoZQorICogZ2VuZXJhbCAnaGRsY04nIG5hbWluZyBjb252ZW50aW9uIGluc3RlYWQgb2YgcHJvcHJpZXRhcnkgZGV2aWNlIG5hbWVzLgorICogRHJpdmVyIGxvYWQgbWVzc2FnZXMgYXJlIG5vdyBkZXZpY2UtY2VudHJpYywgaW5zdGVhZCBvZiBib2FyZC1jZW50cmljLgorICogRHluYW1pYyBhbGxvY2F0aW9uIG9mIG5ldF9kZXZpY2Ugc3RydWN0dXJlcy4KKyAqIENvZGUgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZSBuZXcgbW9kdWxlIGludGVyZmFjZSAobW9kdWxlX1tpbml0fGV4aXRdKS4KKyAqIE1ha2UgdXNlIG9mIHRoZSBQQ0kgaGVscGVyIGZ1bmN0aW9ucyB0byBhY2Nlc3MgUENJIHJlc291cmNlcy4KKyAqCisgKiBSZXZpc2lvbiAyLjAuMC4wIDIwMDAvMDQvMTUgaXZhbgorICogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFBDMzAwL1RFIGJvYXJkcyAoVDEvRlQxL0UxL0ZFMSkuCisgKgorICogUmV2aXNpb24gMS4xLjAuMCAyMDAwLzAyLzI4IGl2YW4KKyAqIE1ham9yIGNoYW5nZXMgaW4gdGhlIGRyaXZlciBhcmNoaXRlY3R1cmUuCisgKiBTb2Z0bmV0IGNvbXBsaWFuY3kgaW1wbGVtZW50ZWQuCisgKiBEcml2ZXIgbm93IHJlcG9ydHMgcGh5c2ljYWwgaW5zdGVhZCBvZiB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMuCisgKiBBZGRlZCBjcGNfY2hhbmdlX210dSBmdW5jdGlvbi4KKyAqCisgKiBSZXZpc2lvbiAxLjAuMC4wIDE5OTkvMTIvMTYgaXZhbgorICogRmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4KKyAqIFN1cHBvcnQgZm9yIDEtIGFuZCAyLWNoYW5uZWwgYm9hcmRzICh3aGljaCB1c2UgZGlzdGluY3QgUENJIERldmljZSBJRCdzKS4KKyAqIFN1cHBvcnQgZm9yIG1vbm9seXRoaWMgaW5zdGFsbGF0aW9uIChpLmUuLCBkcnYgYnVpbHQgaW50byB0aGUga2VybmVsKS4KKyAqIFguMjUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIGxhcGJfW2Rpc11jb25uZWN0X3JlcXVlc3QgcmV0dXJucyBhbiBlcnJvci4KKyAqIFNDQSBwcm9ncmFtbWluZyBub3cgY292ZXJzIFguMjEgYXMgd2VsbC4KKyAqCisgKiBSZXZpc2lvbiAwLjMuMS4wIDE5OTkvMTEvMTggaXZhbgorICogTWFkZSBYLjI1IHN1cHBvcnQgY29uZmlndXJhdGlvbi1kZXBlbmRlbnQgKGFzIGl0IGRlcGVuZHMgb24gZXh0ZXJuYWwgCisgKiBtb2R1bGVzIHRvIHdvcmspLgorICogQ2hhbmdlZCBYLjI1LXNwZWNpZmljIGZ1bmN0aW9uIG5hbWVzIHRvIGNvbXBseSB3aXRoIGFkb3B0ZWQgY29udmVudGlvbi4KKyAqIEZpeGVkIHR5cG9zIGluIFguMjUgZnVuY3Rpb25zIHRoYXQgd291bGQgY2F1c2UgY29tcGlsZSBlcnJvcnMgKERhbmllbGEpLgorICogRml4ZWQgYnVnIGluIGNoX2NvbmZpZyB0aGF0IHdvdWxkIGRpc2FibGUgaW50ZXJydXB0cyBvbiBhIHByZXZpb3VzbHkgCisgKiBlbmFibGVkIGNoYW5uZWwgaWYgdGhlIG90aGVyIGNoYW5uZWwgb24gdGhlIHNhbWUgYm9hcmQgd2FzIGVuYWJsZWQgbGF0ZXIuCisgKgorICogUmV2aXNpb24gMC4zLjAuMCAxOTk5LzExLzE2IGRhbmllbGEKKyAqIFguMjUgc3VwcG9ydC4KKyAqCisgKiBSZXZpc2lvbiAwLjIuMy4wIDE5OTkvMTEvMTUgaXZhbgorICogRnVuY3Rpb24gY3BjX2NoX3N0YXR1cyBub3cgcHJvdmlkZXMgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFguMjEgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAqIENoYW5nZWQgVE5SMSBzZXR0aW5nIGluIG9yZGVyIHRvIHByZXZlbnQgVHggRklGTyBvdmVyYWNjZXNzZXMgYnkgdGhlIFNDQS4KKyAqIE5vdyB1c2luZyBQQ0kgY2xvY2sgaW5zdGVhZCBvZiBpbnRlcm5hbCBvc2NpbGxhdG9yIGNsb2NrIGZvciB0aGUgU0NBLgorICoKKyAqIFJldmlzaW9uIDAuMi4yLjAgMTk5OS8xMS8xMCBpdmFuCisgKiBDaGFuZ2VkIHRoZSAqX2RtYV9idWZfY2hlY2sgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSB3b3VsZCBwcmludCBvbmx5IAorICogdGhlIHVzZWZ1bCBpbmZvIGluc3RlYWQgb2YgdGhlIHdob2xlIGJ1ZmZlciBkZXNjcmlwdG9yIGJhbmsuCisgKiBGaXhlZCBidWcgaW4gY3BjX3F1ZXVlX3htaXQgdGhhdCB3b3VsZCBldmVudHVhbGx5IGNyYXNoIHRoZSBzeXN0ZW0gCisgKiBpbiBjYXNlIG9mIGEgcGFja2V0IGRyb3AuCisgKiBJbXBsZW1lbnRlZCBUWCB1bmRlcnJ1biBoYW5kbGluZy4KKyAqIEltcHJvdmVkIFNDQSBmaW5lIHR1bmluZyB0byBib29zdCB1cCBpdHMgcGVyZm9ybWFuY2UuCisgKgorICogUmV2aXNpb24gMC4yLjEuMCAxOTk5LzExLzAzIGl2YW4KKyAqIEFkZGVkIGZ1bmN0aW9ucyAqZG1hX2J1Zl9wdF9pbml0IHRvIGFsbG93IGluZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIAorICogb2YgdGhlIG5leHQtZGVzY3IuIGFuZCBETUEgYnVmZmVyIHBvaW50ZXJzIG9uIHRoZSBETUEgZGVzY3JpcHRvcnMuCisgKiBLZXJuZWwgYnVmZmVyIHJlbGVhc2UgYW5kIHRidXN5IGNsZWFyaW5nIGlzIG5vdyBkb25lIGluIHRoZSBpbnRlcnJ1cHQgCisgKiBoYW5kbGVyLgorICogRml4ZWQgYnVnIGluIGNwY19vcGVuIHRoYXQgd291bGQgY2F1c2UgYW4gaW50ZXJmYWNlIHJlb3BlbiB0byBmYWlsLgorICogQWRkZWQgYSBwcm90b2NvbC1zcGVjaWZpYyBjb2RlIHNlY3Rpb24gaW4gY3BjX25ldF9yeC4KKyAqIFJlbW92ZWQgcHJpbnRrIGxldmVsIGRlZnMgKHRoZXkgbWlnaHQgYmUgYWRkZWQgYmFjayBhZnRlciB0aGUgYmV0YSBwaGFzZSkuCisgKgorICogUmV2aXNpb24gMC4yLjAuMCAxOTk5LzEwLzI4IGl2YW4KKyAqIFJldmlzaXRlZCB0aGUgY29kZSBzbyB0aGF0IG5ldyBwcm90b2NvbHMgY2FuIGJlIGVhc2lseSBhZGRlZCAvIHN1cHBvcnRlZC4gCisgKgorICogUmV2aXNpb24gMC4xLjAuMSAxOTk5LzEwLzIwIGl2YW4KKyAqIE1vc3RseSAiZXN0aGV0aWMiIGNoYW5nZXMuCisgKgorICogUmV2aXNpb24gMC4xLjAuMCAxOTk5LzEwLzExIGl2YW4KKyAqIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJwYzMwMC5oIgorCisjZGVmaW5lCUNQQ19MT0NLKGNhcmQsZmxhZ3MpCQlcCisJCWRvIHsJCQkJCQlcCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsJXAorCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIENQQ19VTkxPQ0soY2FyZCxmbGFncykJCQlcCisJCWRvIHsJCQkJCQkJXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsJXAorCQl9IHdoaWxlICgwKQorCisjdW5kZWYJUEMzMDBfREVCVUdfUENJCisjdW5kZWYJUEMzMDBfREVCVUdfSU5UUgorI3VuZGVmCVBDMzAwX0RFQlVHX1RYCisjdW5kZWYJUEMzMDBfREVCVUdfUlgKKyN1bmRlZglQQzMwMF9ERUJVR19PVEhFUgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3BjX3BjaV9kZXZfaWRbXSBfX2RldmluaXRkYXRhID0geworCS8qIFBDMzAwL1JTViBvciBQQzMwMC9YMjEsIDIgY2hhbiAqLworCXsweDEyMGUsIDB4MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMwMH0sCisJLyogUEMzMDAvUlNWIG9yIFBDMzAwL1gyMSwgMSBjaGFuICovCisJezB4MTIwZSwgMHgzMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzAxfSwKKwkvKiBQQzMwMC9URSwgMiBjaGFuICovCisJezB4MTIwZSwgMHgzMTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzEwfSwKKwkvKiBQQzMwMC9URSwgMSBjaGFuICovCisJezB4MTIwZSwgMHgzMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzExfSwKKwkvKiBQQzMwMC9URS1NLCAyIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMjB9LAorCS8qIFBDMzAwL1RFLU0sIDEgY2hhbiAqLworCXsweDEyMGUsIDB4MzIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMyMX0sCisJLyogRW5kIG9mIHRhYmxlICovCisJezAsfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3BjX3BjaV9kZXZfaWQpOworCisjaWZuZGVmIGNwY19taW4KKyNkZWZpbmUJY3BjX21pbihhLGIpCSgoKGEpPChiKSk/KGEpOihiKSkKKyNlbmRpZgorI2lmbmRlZiBjcGNfbWF4CisjZGVmaW5lCWNwY19tYXgoYSxiKQkoKChhKT4oYikpPyhhKTooYikpCisjZW5kaWYKKworLyogcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9wdF9pbml0KHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfaW5pdChwYzMwMF90ICosIGludCk7CitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX3B0X2luaXQocGMzMDBfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9pbml0KHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfY2hlY2socGMzMDBfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9jaGVjayhwYzMwMF90ICosIGludCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgY3BjX2ludHIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjcGNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBjbG9ja19yYXRlX2NhbGModWNsb25nLCB1Y2xvbmcsIGludCAqKTsKK3N0YXRpYyB1Y2xvbmcgZGV0ZWN0X3JhbShwYzMwMF90ICopOworc3RhdGljIHZvaWQgcGx4X2luaXQocGMzMDBfdCAqKTsKK3N0YXRpYyB2b2lkIGNwY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBjaGFyKTsKK3N0YXRpYyBpbnQgY3BjX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCit2b2lkIGNwY190dHlfaW5pdChwYzMwMGRldl90ICogZGV2KTsKK3ZvaWQgY3BjX3R0eV91bnJlZ2lzdGVyX3NlcnZpY2UocGMzMDBkZXZfdCAqIHBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV9yZWNlaXZlKHBjMzAwZGV2X3QgKiBwYzMwMGRldik7Cit2b2lkIGNwY190dHlfdHJpZ2dlcl9wb2xsKHBjMzAwZGV2X3QgKiBwYzMwMGRldik7Cit2b2lkIGNwY190dHlfcmVzZXRfdmFyKHZvaWQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgRE1BIFJvdXRpbmVzICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfcHRfaW5pdChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCWludCBpOworCWludCBjaF9mYWN0b3IgPSBjaCAqIE5fRE1BX1RYX0JVRjsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZQorCQkJICAgICAgICAgICAgICAgKyBETUFfVFhfQkRfQkFTRSArIGNoX2ZhY3RvciAqIHNpemVvZihwY3NjYV9iZF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9ETUFfVFhfQlVGOyBpKyssIHB0ZGVzY3IrKykgeworCQljcGNfd3JpdGVsKCZwdGRlc2NyLT5uZXh0LCAodWNsb25nKSAoRE1BX1RYX0JEX0JBU0UgKworCQkJKGNoX2ZhY3RvciArICgoaSArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpKSkgKiBzaXplb2YocGNzY2FfYmRfdCkpKTsKKwkJY3BjX3dyaXRlbCgmcHRkZXNjci0+cHRidWYsIAorCQkJCQkJKHVjbG9uZykgKERNQV9UWF9CQVNFICsgKGNoX2ZhY3RvciArIGkpICogQkRfREVGX0xFTikpOworCX0KK30KKworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9pbml0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJaW50IGk7CisJaW50IGNoX2ZhY3RvciA9IGNoICogTl9ETUFfVFhfQlVGOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlCisJCQkgICAgICAgKyBETUFfVFhfQkRfQkFTRSArIGNoX2ZhY3RvciAqIHNpemVvZihwY3NjYV9iZF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9ETUFfVFhfQlVGOyBpKyssIHB0ZGVzY3IrKykgeworCQltZW1zZXRfaW8ocHRkZXNjciwgMCwgc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKwkJY3BjX3dyaXRldygmcHRkZXNjci0+bGVuLCAwKTsKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCBEU1RfT1NCKTsKKwl9CisJdHhfZG1hX2J1Zl9wdF9pbml0KGNhcmQsIGNoKTsKK30KKworc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9wdF9pbml0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJaW50IGk7CisJaW50IGNoX2ZhY3RvciA9IGNoICogTl9ETUFfUlhfQlVGOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlCisJCQkJICAgICAgICsgRE1BX1JYX0JEX0JBU0UgKyBjaF9mYWN0b3IgKiBzaXplb2YocGNzY2FfYmRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5fRE1BX1JYX0JVRjsgaSsrLCBwdGRlc2NyKyspIHsKKwkJY3BjX3dyaXRlbCgmcHRkZXNjci0+bmV4dCwgKHVjbG9uZykgKERNQV9SWF9CRF9CQVNFICsKKwkgICAgIAkoY2hfZmFjdG9yICsgKChpICsgMSkgJiAoTl9ETUFfUlhfQlVGIC0gMSkpKSAqIHNpemVvZihwY3NjYV9iZF90KSkpOworCQljcGNfd3JpdGVsKCZwdGRlc2NyLT5wdGJ1ZiwKKwkJCSAgICh1Y2xvbmcpIChETUFfUlhfQkFTRSArIChjaF9mYWN0b3IgKyBpKSAqIEJEX0RFRl9MRU4pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfaW5pdChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCWludCBpOworCWludCBjaF9mYWN0b3IgPSBjaCAqIE5fRE1BX1JYX0JVRjsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZQorCQkJCSAgICAgICArIERNQV9SWF9CRF9CQVNFICsgY2hfZmFjdG9yICogc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOX0RNQV9SWF9CVUY7IGkrKywgcHRkZXNjcisrKSB7CisJCW1lbXNldF9pbyhwdGRlc2NyLCAwLCBzaXplb2YocGNzY2FfYmRfdCkpOworCQljcGNfd3JpdGV3KCZwdGRlc2NyLT5sZW4sIDApOworCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOworCX0KKwlyeF9kbWFfYnVmX3B0X2luaXQoY2FyZCwgY2gpOworfQorCitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX2NoZWNrKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCWludCBpOworCXVjc2hvcnQgZmlyc3RfYmQgPSBjYXJkLT5jaGFuW2NoXS50eF9maXJzdF9iZDsKKwl1Y3Nob3J0IG5leHRfYmQgPSBjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkOworCisJcHJpbnRrKCIjQ0glZDogZl9iZCA9ICVkKDB4JTA4engpLCBuX2JkID0gJWQoMHglMDh6eClcbiIsIGNoLAorCSAgICAgICBmaXJzdF9iZCwgVFhfQkRfQUREUihjaCwgZmlyc3RfYmQpLAorCSAgICAgICBuZXh0X2JkLCBUWF9CRF9BRERSKGNoLCBuZXh0X2JkKSk7CisJZm9yIChpID0gZmlyc3RfYmQsCisJICAgICBwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBUWF9CRF9BRERSKGNoLCBmaXJzdF9iZCkpOworCSAgICAgaSAhPSAoKG5leHRfYmQgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKSk7CisJICAgICBpID0gKGkgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKSwgCisJCSBwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBUWF9CRF9BRERSKGNoLCBpKSkpIHsKKwkJcHJpbnRrKCJcbiBDSCVkIFRYJWQ6IG5leHQ9MHgleCwgcHRidWY9MHgleCwgU1Q9MHgleCwgbGVuPSVkIiwKKwkJICAgICAgIGNoLCBpLCBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpLAorCQkgICAgICAgY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZiksCisJCSAgICAgICBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cyksIGNwY19yZWFkdygmcHRkZXNjci0+bGVuKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworI2lmZGVmCVBDMzAwX0RFQlVHX09USEVSCisvKiBTaG93IGFsbCBUWCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB2b2lkIHR4MV9kbWFfYnVmX2NoZWNrKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCWludCBpOworCXVjc2hvcnQgZmlyc3RfYmQgPSBjYXJkLT5jaGFuW2NoXS50eF9maXJzdF9iZDsKKwl1Y3Nob3J0IG5leHRfYmQgPSBjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkOworCXVjbG9uZyBzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKworCXByaW50ayAoIlxubmZyZWVfdHhfYmQgPSAlZCBcbiIsIGNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkKTsKKwlwcmludGsoIiNDSCVkOiBmX2JkID0gJWQoMHglMDh4KSwgbl9iZCA9ICVkKDB4JTA4eClcbiIsIGNoLAorCSAgICAgICBmaXJzdF9iZCwgVFhfQkRfQUREUihjaCwgZmlyc3RfYmQpLAorCSAgICAgICBuZXh0X2JkLCBUWF9CRF9BRERSKGNoLCBuZXh0X2JkKSk7CisJcHJpbnRrKCJUWF9DREE9MHglMDh4LCBUWF9FREE9MHglMDh4XG4iLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERUWF9SRUcoQ0RBTCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEVFhfUkVHKEVEQUwsIGNoKSkpOworCWZvciAoaSA9IDA7IGkgPCBOX0RNQV9UWF9CVUY7IGkrKykgeworCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBUWF9CRF9BRERSKGNoLCBpKSk7CisJCXByaW50aygiXG4gQ0glZCBUWCVkOiBuZXh0PTB4JXgsIHB0YnVmPTB4JXgsIFNUPTB4JXgsIGxlbj0lZCIsCisJCSAgICAgICBjaCwgaSwgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSwKKwkJICAgICAgIGNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpLAorCQkgICAgICAgY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpLCBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKwkJCSAKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfY2hlY2socGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJaW50IGk7CisJdWNzaG9ydCBmaXJzdF9iZCA9IGNhcmQtPmNoYW5bY2hdLnJ4X2ZpcnN0X2JkOworCXVjc2hvcnQgbGFzdF9iZCA9IGNhcmQtPmNoYW5bY2hdLnJ4X2xhc3RfYmQ7CisJaW50IGNoX2ZhY3RvcjsKKworCWNoX2ZhY3RvciA9IGNoICogTl9ETUFfUlhfQlVGOworCXByaW50aygiI0NIJWQ6IGZfYmQgPSAlZCwgbF9iZCA9ICVkXG4iLCBjaCwgZmlyc3RfYmQsIGxhc3RfYmQpOworCWZvciAoaSA9IDAsIHB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArCisJCQkJCSAgICAgIERNQV9SWF9CRF9CQVNFICsgY2hfZmFjdG9yICogc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKwkgICAgIGkgPCBOX0RNQV9SWF9CVUY7IGkrKywgcHRkZXNjcisrKSB7CisJCWlmIChjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykgJiBEU1RfT1NCKQorCQkJcHJpbnRrICgiXG4gQ0glZCBSWCVkOiBuZXh0PTB4JXgsIHB0YnVmPTB4JXgsIFNUPTB4JXgsIGxlbj0lZCIsCisJCQkJIGNoLCBpLCBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpLAorCQkJCSBjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSwKKwkJCQkgY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpLAorCQkJCSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK2ludCBkbWFfZ2V0X3J4X2ZyYW1lX3NpemUocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJdWNzaG9ydCBmaXJzdF9iZCA9IGNhcmQtPmNoYW5bY2hdLnJ4X2ZpcnN0X2JkOworCWludCByY3ZkID0gMDsKKwl2b2xhdGlsZSB1Y2NoYXIgc3RhdHVzOworCisJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgUlhfQkRfQUREUihjaCwgZmlyc3RfYmQpKTsKKwl3aGlsZSAoKHN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSkgJiBEU1RfT1NCKSB7CisJCXJjdmQgKz0gY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pOworCQlmaXJzdF9iZCA9IChmaXJzdF9iZCArIDEpICYgKE5fRE1BX1JYX0JVRiAtIDEpOworCQlpZiAoKHN0YXR1cyAmIERTVF9FT00pIHx8IChmaXJzdF9iZCA9PSBjYXJkLT5jaGFuW2NoXS5yeF9sYXN0X2JkKSkgeworCQkJLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgZ29vZCBmcmFtZSBvciBpbmNvbXBsZXRlIGJhZCBmcmFtZSAKKwkJCSogKGRtYV9idWZfcmVhZCB3aWxsIGNsZWFuIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhpcyBjYXNlKS4gKi8KKwkJCXJldHVybiAocmN2ZCk7CisJCX0KKwkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7CisJfQorCXJldHVybiAoLTEpOworfQorCisvKgorICogZG1hX2J1Zl93cml0ZTogd3JpdGVzIGEgZnJhbWUgdG8gdGhlIFR4IERNQSBidWZmZXJzCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHdyaXRlcyBvbmUgZnJhbWUgYXQgYSB0aW1lLgorICovCitpbnQgZG1hX2J1Zl93cml0ZShwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1Y2NoYXIgKiBwdGRhdGEsIGludCBsZW4pCit7CisJaW50IGksIG5jaGFyOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwlpbnQgdG9zZW5kID0gbGVuOworCXVjY2hhciBuYnVmID0gKChsZW4gLSAxKSAvIEJEX0RFRl9MRU4pICsgMTsKKworCWlmIChuYnVmID49IGNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYnVmOyBpKyspIHsKKwkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsKKwkJCQkJICBUWF9CRF9BRERSKGNoLCBjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkKSk7CisJCW5jaGFyID0gY3BjX21pbihCRF9ERUZfTEVOLCB0b3NlbmQpOworCQlpZiAoY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpICYgRFNUX09TQikgeworCQkJbWVtY3B5X3RvaW8oKGNhcmQtPmh3LnJhbWJhc2UgKyBjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSksCisJCQkJICAgICZwdGRhdGFbbGVuIC0gdG9zZW5kXSwgbmNoYXIpOworCQkJY3BjX3dyaXRldygmcHRkZXNjci0+bGVuLCBuY2hhcik7CisJCQljYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZC0tOworCQkJaWYgKChpICsgMSkgPT0gbmJ1ZikgeworCQkJCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBCRCB0byBiZSB1c2VkICovCisJCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCBEU1RfRU9NKTsKKwkJCX0gZWxzZSB7CisJCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXRvc2VuZCAtPSBuY2hhcjsKKwkJY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCA9CisJCQkoY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpOworCX0KKwkvKiBJZiBpdCBnZXRzIHRvIGhlcmUsIGl0IG1lYW5zIHdlIGhhdmUgc2VudCB0aGUgd2hvbGUgZnJhbWUgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRtYV9idWZfcmVhZDogcmVhZHMgYSBmcmFtZSBmcm9tIHRoZSBSeCBETUEgYnVmZmVycworICogTk9URTogdGhpcyBmdW5jdGlvbiByZWFkcyBvbmUgZnJhbWUgYXQgYSB0aW1lLgorICovCitpbnQgZG1hX2J1Zl9yZWFkKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5jaGFyOworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJaW50IHJjdmQgPSAwOworCXZvbGF0aWxlIHVjY2hhciBzdGF0dXM7CisKKwlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKworCQkJCSAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfZmlyc3RfYmQpKTsKKwl3aGlsZSAoKHN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSkgJiBEU1RfT1NCKSB7CisJCW5jaGFyID0gY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pOworCQlpZiAoKHN0YXR1cyAmIChEU1RfT1ZSIHwgRFNUX0NSQyB8IERTVF9SQklUIHwgRFNUX1NIUlQgfCBEU1RfQUJUKSkKKwkJICAgIHx8IChuY2hhciA+IEJEX0RFRl9MRU4pKSB7CisKKwkJCWlmIChuY2hhciA+IEJEX0RFRl9MRU4pCisJCQkJc3RhdHVzIHw9IERTVF9SQklUOworCQkJcmN2ZCA9IC1zdGF0dXM7CisJCQkvKiBEaXNjYXJkIHJlbWFpbmluZyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBiYWQgZnJhbWUgKi8KKwkJCXdoaWxlIChjaGFuLT5yeF9maXJzdF9iZCAhPSBjaGFuLT5yeF9sYXN0X2JkKSB7CisJCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsKKwkJCQljaGFuLT5yeF9maXJzdF9iZCA9IChjaGFuLT5yeF9maXJzdF9iZCsxKSAmIChOX0RNQV9SWF9CVUYtMSk7CisJCQkJaWYgKHN0YXR1cyAmIERTVF9FT00pCisJCQkJCWJyZWFrOworCQkJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArCisJCQkJCQkJICBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsKKwkJCQlzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAobmNoYXIgIT0gMCkgeworCQkJaWYgKHNrYikgeworCQkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsIG5jaGFyKSwKKwkJCQkgKGNhcmQtPmh3LnJhbWJhc2UrY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZikpLG5jaGFyKTsKKwkJCX0KKwkJCXJjdmQgKz0gbmNoYXI7CisJCX0KKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+bGVuLCAwKTsKKwkJY2hhbi0+cnhfZmlyc3RfYmQgPSAoY2hhbi0+cnhfZmlyc3RfYmQgKyAxKSAmIChOX0RNQV9SWF9CVUYgLSAxKTsKKworCQlpZiAoc3RhdHVzICYgRFNUX0VPTSkKKwkJCWJyZWFrOworCisJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOworCX0KKworCWlmIChyY3ZkICE9IDApIHsKKwkJLyogVXBkYXRlIHBvaW50ZXIgKi8KKwkJY2hhbi0+cnhfbGFzdF9iZCA9IChjaGFuLT5yeF9maXJzdF9iZCAtIDEpICYgKE5fRE1BX1JYX0JVRiAtIDEpOworCQkvKiBVcGRhdGUgRURBICovCisJCWNwY193cml0ZWwoY2FyZC0+aHcuc2NhYmFzZSArIERSWF9SRUcoRURBTCwgY2gpLAorCQkJICAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfbGFzdF9iZCkpOworCX0KKwlyZXR1cm4gKHJjdmQpOworfQorCit2b2lkIHR4X2RtYV9zdG9wKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwl1Y2NoYXIgZHJyX2VuYV9iaXQgPSAxIDw8ICg1ICsgMiAqIGNoKTsKKwl1Y2NoYXIgZHJyX3JzdF9iaXQgPSAxIDw8ICgxICsgMiAqIGNoKTsKKworCS8qIERpc2FibGUgRE1BICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFJSLCBkcnJfZW5hX2JpdCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFJSLCBkcnJfcnN0X2JpdCAmIH5kcnJfZW5hX2JpdCk7Cit9CisKK3ZvaWQgcnhfZG1hX3N0b3AocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXVjY2hhciBkcnJfZW5hX2JpdCA9IDEgPDwgKDQgKyAyICogY2gpOworCXVjY2hhciBkcnJfcnN0X2JpdCA9IDEgPDwgKDIgKiBjaCk7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIERSUiwgZHJyX2VuYV9iaXQpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERSUiwgZHJyX3JzdF9iaXQgJiB+ZHJyX2VuYV9iaXQpOworfQorCit2b2lkIHJ4X2RtYV9zdGFydChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCQorCS8qIFN0YXJ0IERNQSAqLworCWNwY193cml0ZWwoc2NhYmFzZSArIERSWF9SRUcoQ0RBTCwgY2gpLAorCQkgICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9maXJzdF9iZCkpOworCWlmIChjcGNfcmVhZGwoc2NhYmFzZSArIERSWF9SRUcoQ0RBTCxjaCkpICE9CisJCQkJICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9maXJzdF9iZCkpIHsKKwkJY3BjX3dyaXRlbChzY2FiYXNlICsgRFJYX1JFRyhDREFMLCBjaCksCisJCQkJICAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfZmlyc3RfYmQpKTsKKwl9CisJY3BjX3dyaXRlbChzY2FiYXNlICsgRFJYX1JFRyhFREFMLCBjaCksCisJCSAgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2xhc3RfYmQpKTsKKwljcGNfd3JpdGV3KHNjYWJhc2UgKyBEUlhfUkVHKEJGTEwsIGNoKSwgQkRfREVGX0xFTik7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1JYKGNoKSwgRFNSX0RFKTsKKwlpZiAoIShjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpICYgRFNSX0RFKSkgeworCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9SWChjaCksIERTUl9ERSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICBGQUxDIFJvdXRpbmVzICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGZhbGNfaXNzdWVfY21kKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVjY2hhciBjbWQpCit7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVuc2lnbmVkIGxvbmcgaSA9IDA7CisKKwl3aGlsZSAoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoU0lTLCBjaCkpICYgU0lTX0NFQykgeworCQlpZiAoaSsrID49IFBDMzAwX0ZBTENfTUFYTE9PUCkgeworCQkJcHJpbnRrKCIlczogRkFMQyBjb21tYW5kIGxvY2tlZChjbWQ9MHgleCkuXG4iLAorCQkJICAgICAgIGNhcmQtPmNoYW5bY2hdLmQubmFtZSwgY21kKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDTURSLCBjaCksIGNtZCk7Cit9CisKK3ZvaWQgZmFsY19pbnRyX2VuYWJsZShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwkvKiBJbnRlcnJ1cHQgcGlucyBhcmUgb3Blbi1kcmFpbiAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCkpICYgfklQQ19JQzApOworCS8qIENvbnRlcnMgdXBkYXRlZCBlYWNoIHNlY29uZCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0VDTSk7CisJLyogRW5hYmxlIFNFQyBhbmQgRVMgaW50ZXJydXB0cyAgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCkpICYgfihJTVIzX1NFQyB8IElNUjNfRVMpKTsKKwlpZiAoY29uZi0+ZnJfbW9kZSA9PSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SNCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SNCwgY2gpKSAmIH4oSU1SNF9MT1MpKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SNCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SNCwgY2gpKSAmCisJCQkgICB+KElNUjRfTEZBIHwgSU1SNF9BSVMgfCBJTVI0X0xPUyB8IElNUjRfU0xJUCkpOworCX0KKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSkgJiB+SU1SM19MTEJTQyk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCkpIHwgSVBDX1NDSSk7CisJCWlmIChjb25mLT5mcl9tb2RlID09IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSkgJiB+KElNUjJfTE9TKSk7CisJCX0gZWxzZSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSkgJgorCQkJCSAgIH4oSU1SMl9GQVIgfCBJTVIyX0xGQSB8IElNUjJfQUlTIHwgSU1SMl9MT1MpKTsKKwkJCWlmIChwZmFsYy0+bXVsdGlmcmFtZV9tb2RlKSB7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpKSAmIAorCQkJCQkgICB+KElNUjJfVDQwME1TIHwgSU1SMl9NRkFSKSk7CisJCQl9IGVsc2UgeworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSkgfCAKKwkJCQkJICAgSU1SMl9UNDAwTVMgfCBJTVIyX01GQVIpOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIGZhbGNfb3Blbl90aW1lc2xvdChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBpbnQgdGltZXNsb3QpCit7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciB0c2hmID0gY2FyZC0+Y2hhbltjaF0uZmFsYy5vZmZzZXQ7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKElDQjEgKyAodGltZXNsb3QgLSB0c2hmKSAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChJQ0IxICsgKHRpbWVzbG90IC0gdHNoZikgLyA4KSwgY2gpKSAmIAorCQkgICAJfigweDgwID4+ICgodGltZXNsb3QgLSB0c2hmKSAmIDB4MDcpKSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChUVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoVFRSMSArIHRpbWVzbG90IC8gOCksIGNoKSkgfCAKKyAgIAkJCSgweDgwID4+ICh0aW1lc2xvdCAmIDB4MDcpKSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChSVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoUlRSMSArIHRpbWVzbG90IC8gOCksIGNoKSkgfCAKKwkJCSgweDgwID4+ICh0aW1lc2xvdCAmIDB4MDcpKSk7Cit9CisKK3ZvaWQgZmFsY19jbG9zZV90aW1lc2xvdChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBpbnQgdGltZXNsb3QpCit7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciB0c2hmID0gY2FyZC0+Y2hhbltjaF0uZmFsYy5vZmZzZXQ7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKElDQjEgKyAodGltZXNsb3QgLSB0c2hmKSAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChJQ0IxICsgKHRpbWVzbG90IC0gdHNoZikgLyA4KSwgY2gpKSB8IAorCQkgICAoMHg4MCA+PiAoKHRpbWVzbG90IC0gdHNoZikgJiAweDA3KSkpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoVFRSMSArIHRpbWVzbG90IC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKFRUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCkpICYgCisJCSAgIH4oMHg4MCA+PiAodGltZXNsb3QgJiAweDA3KSkpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoUlRSMSArIHRpbWVzbG90IC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKFJUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCkpICYgCisJCSAgIH4oMHg4MCA+PiAodGltZXNsb3QgJiAweDA3KSkpOworfQorCit2b2lkIGZhbGNfY2xvc2VfYWxsX3RpbWVzbG90cyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IxLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIxLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIxLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IyLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIyLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIyLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IzLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIzLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIzLCBjaCksIDApOworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9FMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCNCwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjQsIGNoKSwgMCk7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFI0LCBjaCksIDApOworCX0KK30KKwordm9pZCBmYWxjX29wZW5fYWxsX3RpbWVzbG90cyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IxLCBjaCksIDApOworCWlmIChjb25mLT5mcl9tb2RlID09IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIxLCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMSwgY2gpLCAweGZmKTsKKwl9IGVsc2UgeworCQkvKiBUaW1lc2xvdCAwIGlzIG5ldmVyIGVuYWJsZWQgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjEsIGNoKSwgMHg3Zik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIxLCBjaCksIDB4N2YpOworCX0KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMiwgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMiwgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMiwgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMywgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMywgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMywgY2gpLCAweGZmKTsKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfRTEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjQsIGNoKSwgMCk7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFI0LCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSNCwgY2gpLCAweGZmKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCNCwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjQsIGNoKSwgMHg4MCk7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFI0LCBjaCksIDB4ODApOworCX0KK30KKwordm9pZCBmYWxjX2luaXRfdGltZXNsb3QocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJaW50IHRzbG90OworCisJZm9yICh0c2xvdCA9IDA7IHRzbG90IDwgcGZhbGMtPm51bV9jaGFubmVsczsgdHNsb3QrKykgeworCQlpZiAoY29uZi0+dHNsb3RfYml0bWFwICYgKDEgPDwgdHNsb3QpKSB7CisJCQkvLyBDaGFubmVsIGVuYWJsZWQKKwkJCWZhbGNfb3Blbl90aW1lc2xvdChjYXJkLCBjaCwgdHNsb3QgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCS8vIENoYW5uZWwgZGlzYWJsZWQKKwkJCWZhbGNfY2xvc2VfdGltZXNsb3QoY2FyZCwgY2gsIHRzbG90ICsgMSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgZmFsY19lbmFibGVfY29tbShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisKKwlpZiAocGZhbGMtPmZ1bGxfYmFuZHdpZHRoKSB7CisJCWZhbGNfb3Blbl9hbGxfdGltZXNsb3RzKGNhcmQsIGNoKTsKKwl9IGVsc2UgeworCQlmYWxjX2luaXRfdGltZXNsb3QoY2FyZCwgY2gpOworCX0KKwkvLyBDVFMvRENEIE9OCisJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSAmCisJCSAgIH4oKENQTERfUkVHMV9GQUxDX0RDRCB8IENQTERfUkVHMV9GQUxDX0NUUykgPDwgKDIgKiBjaCkpKTsKK30KKwordm9pZCBmYWxjX2Rpc2FibGVfY29tbShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisKKwlpZiAocGZhbGMtPmxvb3BfYWN0aXZlICE9IDIpIHsKKwkJZmFsY19jbG9zZV9hbGxfdGltZXNsb3RzKGNhcmQsIGNoKTsKKwl9CisJLy8gQ1RTL0RDRCBPRkYKKwljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpIHwKKwkJICAgKChDUExEX1JFRzFfRkFMQ19EQ0QgfCBDUExEX1JFRzFfRkFMQ19DVFMpIDw8ICgyICogY2gpKSk7Cit9CisKK3ZvaWQgZmFsY19pbml0X3QxKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgZGphID0gKGNoID8gKExJTTJfREpBMiB8IExJTTJfREpBMSkgOiAwKTsKKworCS8qIFN3aXRjaCB0byBUMSBtb2RlIChQQ00gMjQpICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwgRk1SMV9QTU9EKTsKKworCS8qIFdhaXQgMjAgdXMgZm9yIHNldHVwICovCisJdWRlbGF5KDIwKTsKKworCS8qIFRyYW5zbWl0IEJ1ZmZlciBTaXplICgxIGZyYW1lKSAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhTSUMxLCBjaCksIFNJQzFfWEJTMCk7CisKKwkvKiBDbG9jayBtb2RlICovCisJaWYgKGNvbmYtPnBoeXNfc2V0dGluZ3MuY2xvY2tfdHlwZSA9PSBDTE9DS19JTlQpIHsgLyogTWFzdGVyIG1vZGUgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgfCBMSU0wX01BUyk7CisJfSBlbHNlIHsgLyogU2xhdmUgbW9kZSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH5MSU0wX01BUyk7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMT09QLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMT09QLCBjaCkpICYgfkxPT1BfUlRNKTsKKwl9CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCksIElQQ19TQ0kpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgJgorCQkgICB+KEZNUjBfWEMwIHwgRk1SMF9YQzEgfCBGTVIwX1JDMCB8IEZNUjBfUkMxKSk7CisKKwlzd2l0Y2ggKGNvbmYtPmxjb2RlKSB7CisJCWNhc2UgUEMzMDBfTENfQU1JOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwKKwkJCQkgICBGTVIwX1hDMSB8IEZNUjBfUkMxKTsKKwkJCS8qIENsZWFyIENoYW5uZWwgcmVnaXN0ZXIgdG8gT04gZm9yIGFsbCBjaGFubmVscyAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENDQjEsIGNoKSwgMHhmZik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ0NCMiwgY2gpLCAweGZmKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDQ0IzLCBjaCksIDB4ZmYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9MQ19COFpTOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwKKwkJCQkgICBGTVIwX1hDMCB8IEZNUjBfWEMxIHwgRk1SMF9SQzAgfCBGTVIwX1JDMSk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0xDX05SWjoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8IDB4MDApOworCQkJYnJlYWs7CisJfQorCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSB8IExJTTBfRUxPUyk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH4oTElNMF9TQ0wxIHwgTElNMF9TQ0wwKSk7CisJLyogU2V0IGludGVyZmFjZSBtb2RlIHRvIDIgTUJQUyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0lNT0QpOworCisJc3dpdGNoIChjb25mLT5mcl9tb2RlKSB7CisJCWNhc2UgUEMzMDBfRlJfRVNGOgorCQkJcGZhbGMtPm11bHRpZnJhbWVfbW9kZSA9IDA7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSkgfCBGTVI0X0ZNMSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCAKKwkJCQkgICBGTVIxX0NSQyB8IEZNUjFfRURMKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYREwxLCBjaCksIDApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhETDIsIGNoKSwgMCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWERMMywgY2gpLCAwKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSAmIH5GTVIwX1NSQUYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLGNoKSkgfCBGTVIyX01DU1AgfCBGTVIyX1NTUCk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0ZSX0Q0OgorCQkJcGZhbGMtPm11bHRpZnJhbWVfbW9kZSA9IDE7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSkgJgorCQkJCSAgIH4oRk1SNF9GTTEgfCBGTVI0X0ZNMCkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwgRk1SMF9TUkFGKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIH5GTVIyX1NTUCk7CisJCQlicmVhazsKKwl9CisKKwkvKiBFbmFibGUgQXV0b21hdGljIFJlc3luY2hyb25pemF0aW9uICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpKSB8IEZNUjRfQVVUTyk7CisKKwkvKiBUcmFuc21pdCBBdXRvbWF0aWMgUmVtb3RlIEFsYXJtICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfQVhSQSk7CisKKwkvKiBDaGFubmVsIHRyYW5zbGF0aW9uIG1vZGUgMSA6IG9uZSB0byBvbmUgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9DVE0pOworCisJLyogTm8gc2lnbmFsaW5nICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSAmIH5GTVIxX1NJR00pOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgJgorCQkgICB+KEZNUjVfRUlCUiB8IEZNUjVfU1JTKSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENDUjEsIGNoKSwgMCk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCkpIHwgTElNMV9SSUwwIHwgTElNMV9SSUwxKTsKKworCXN3aXRjaCAoY29uZi0+bGJvKSB7CisJCQkvKiBQcm92aWRlcyBwcm9wZXIgTGluZSBCdWlsZCBPdXQgKi8KKwkJY2FzZSBQQzMwMF9MQk9fMF9EQjoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0yLCBjaCksIChMSU0yX0xPUzEgfCBkamEpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0wLCBjaCksIDB4NWEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTEsIGNoKSwgMHg4Zik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMiwgY2gpLCAweDIwKTsKKwkJCWJyZWFrOworCQljYXNlIFBDMzAwX0xCT183XzVfREI6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMiwgY2gpLCAoMHg0MCB8IExJTTJfTE9TMSB8IGRqYSkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTAsIGNoKSwgMHgxMSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMSwgY2gpLCAweDAyKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0yLCBjaCksIDB4MjApOworCQkJYnJlYWs7CisJCWNhc2UgUEMzMDBfTEJPXzE1X0RCOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTIsIGNoKSwgKDB4ODAgfCBMSU0yX0xPUzEgfCBkamEpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0wLCBjaCksIDB4OGUpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTEsIGNoKSwgMHgwMSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMiwgY2gpLCAweDIwKTsKKwkJCWJyZWFrOworCQljYXNlIFBDMzAwX0xCT18yMl81X0RCOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTIsIGNoKSwgKDB4YzAgfCBMSU0yX0xPUzEgfCBkamEpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0wLCBjaCksIDB4MDkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTEsIGNoKSwgMHgwMSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMiwgY2gpLCAweDIwKTsKKwkJCWJyZWFrOworCX0KKworCS8qIFRyYW5zbWl0IENsb2NrLVNsb3QgT2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhDMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYQzAsIGNoKSkgfCAweDAxKTsKKwkvKiBUcmFuc21pdCBUaW1lLXNsb3QgT2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhDMSwgY2gpLCAweDNlKTsKKwkvKiBSZWNlaXZlICBDbG9jay1TbG90IG9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQzAsIGNoKSwgMHgwNSk7CisJLyogUmVjZWl2ZSAgVGltZS1zbG90IG9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQzEsIGNoKSwgMHgwMCk7CisKKwkvKiBMT1MgRGV0ZWN0aW9uIGFmdGVyIDE3NiBjb25zZWN1dGl2ZSAwcyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhQQ0RSLCBjaCksIDB4MGEpOworCS8qIExPUyBSZWNvdmVyeSBhZnRlciAyMiBvbmVzIGluIHRoZSB0aW1lIHdpbmRvdyBvZiBQQ0QgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUENSUiwgY2gpLCAweDE1KTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJRExFLCBjaCksIDB4N2YpOworCisJaWYgKGNvbmYtPmZyX21vZGUgPT0gUEMzMDBfRlJfRVNGX0pBUEFOKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQzEsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFJDMSwgY2gpKSB8IDB4ODApOworCX0KKworCWZhbGNfY2xvc2VfYWxsX3RpbWVzbG90cyhjYXJkLCBjaCk7Cit9CisKK3ZvaWQgZmFsY19pbml0X2UxKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgZGphID0gKGNoID8gKExJTTJfREpBMiB8IExJTTJfREpBMSkgOiAwKTsKKworCS8qIFN3aXRjaCB0byBFMSBtb2RlIChQQ00gMzApICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSAmIH5GTVIxX1BNT0QpOworCisJLyogQ2xvY2sgbW9kZSAqLworCWlmIChjb25mLT5waHlzX3NldHRpbmdzLmNsb2NrX3R5cGUgPT0gQ0xPQ0tfSU5UKSB7IC8qIE1hc3RlciBtb2RlICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpIHwgTElNMF9NQVMpOworCX0gZWxzZSB7IC8qIFNsYXZlIG1vZGUgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+TElNMF9NQVMpOworCX0KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTE9PUCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMT09QLCBjaCkpICYgfkxPT1BfU0ZNKTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSwgSVBDX1NDSSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSAmCisJCSAgIH4oRk1SMF9YQzAgfCBGTVIwX1hDMSB8IEZNUjBfUkMwIHwgRk1SMF9SQzEpKTsKKworCXN3aXRjaCAoY29uZi0+bGNvZGUpIHsKKwkJY2FzZSBQQzMwMF9MQ19BTUk6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfAorCQkJCSAgIEZNUjBfWEMxIHwgRk1SMF9SQzEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9MQ19IREIzOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwKKwkJCQkgICBGTVIwX1hDMCB8IEZNUjBfWEMxIHwgRk1SMF9SQzAgfCBGTVIwX1JDMSk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0xDX05SWjoKKwkJCWJyZWFrOworCX0KKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+KExJTTBfU0NMMSB8IExJTTBfU0NMMCkpOworCS8qIFNldCBpbnRlcmZhY2UgbW9kZSB0byAyIE1CUFMgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9JTU9EKTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0wLCBjaCksIDB4MTgpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0xLCBjaCksIDB4MDMpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0yLCBjaCksIDB4MDApOworCisJc3dpdGNoIChjb25mLT5mcl9tb2RlKSB7CisJCWNhc2UgUEMzMDBfRlJfTUZfQ1JDNDoKKwkJCXBmYWxjLT5tdWx0aWZyYW1lX21vZGUgPSAxOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9YRlMpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9SRlMxKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIH5GTVIyX1JGUzApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCkpICYgfkZNUjNfRVhUSVcpOworCisJCQkvKiBNdWx0aUZyYW1lIFJlc3luY2hyb25pemF0aW9uICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX01GQ1MpOworCisJCQkvKiBBdXRvbWF0aWMgTG9zcyBvZiBNdWx0aWZyYW1lID4gOTE0IENSQyBlcnJvcnMgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfQUxNRik7CisKKwkJCS8qIFMxIGFuZCBTSTEvU0kyIHNwYXJlIEJpdHMgc2V0IHRvIDEgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgJiB+WFNQX0FYUyk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpIHwgWFNQX0VCUCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpIHwgWFNQX1hTMTMgfCBYU1BfWFMxNSk7CisKKwkJCS8qIEF1dG9tYXRpYyBGb3JjZSBSZXN5bmNocm9uaXphdGlvbiAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9BRlIpOworCisJCQkvKiBUcmFuc21pdCBBdXRvbWF0aWMgUmVtb3RlIEFsYXJtICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX0FYUkEpOworCisJCQkvKiBUcmFuc21pdCBTcGFyZSBCaXRzIGZvciBOYXRpb25hbCBVc2UgKFksIFNuLCBTYSkgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgfAorCQkJCSAgIFhTV19YWTAgfCBYU1dfWFkxIHwgWFNXX1hZMiB8IFhTV19YWTMgfCBYU1dfWFk0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfRlJfTUZfTk9OX0NSQzQ6CisJCWNhc2UgUEMzMDBfRlJfRDQ6CisJCQlwZmFsYy0+bXVsdGlmcmFtZV9tb2RlID0gMDsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSAmIH5GTVIxX1hGUyk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiAKKwkJCQkgICB+KEZNUjJfUkZTMSB8IEZNUjJfUkZTMCkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSB8IFhTV19YU0lTKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgfCBYU1BfWFNJRik7CisKKwkJCS8qIEF1dG9tYXRpYyBGb3JjZSBSZXN5bmNocm9uaXphdGlvbiAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9BRlIpOworCisJCQkvKiBUcmFuc21pdCBBdXRvbWF0aWMgUmVtb3RlIEFsYXJtICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX0FYUkEpOworCisJCQkvKiBUcmFuc21pdCBTcGFyZSBCaXRzIGZvciBOYXRpb25hbCBVc2UgKFksIFNuLCBTYSkgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgfAorCQkJCSAgIFhTV19YWTAgfCBYU1dfWFkxIHwgWFNXX1hZMiB8IFhTV19YWTMgfCBYU1dfWFk0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfRlJfVU5GUkFNRUQ6CisJCQlwZmFsYy0+bXVsdGlmcmFtZV9tb2RlID0gMDsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSAmIH5GTVIxX1hGUyk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiAKKwkJCQkgICB+KEZNUjJfUkZTMSB8IEZNUjJfUkZTMCkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSB8IFhTUF9UVDApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSAmIAorCQkJCSAgIH4oWFNXX1hUTXxYU1dfWFkwfFhTV19YWTF8WFNXX1hZMnxYU1dfWFkzfFhTV19YWTQpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUU1dNLCBjaCksIDB4ZmYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwKKwkJCQkgICAoRk1SMl9SVE0gfCBGTVIyX0RBSVMpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIH5GTVIyX0FYUkEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpICYgfkZNUjFfQUZSKTsKKwkJCXBmYWxjLT5zeW5jID0gMTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCQkJICAgKENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwkJCWJyZWFrOworCX0KKworCS8qIE5vIHNpZ25hbGluZyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpICYgflhTUF9DQVNFTik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENDUjEsIGNoKSwgMCk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCkpIHwgTElNMV9SSUwwIHwgTElNMV9SSUwxKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMiwgY2gpLCAoTElNMl9MT1MxIHwgZGphKSk7CisKKwkvKiBUcmFuc21pdCBDbG9jay1TbG90IE9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYQzAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWEMwLCBjaCkpIHwgMHgwMSk7CisJLyogVHJhbnNtaXQgVGltZS1zbG90IE9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYQzEsIGNoKSwgMHgzZSk7CisJLyogUmVjZWl2ZSAgQ2xvY2stU2xvdCBvZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkMwLCBjaCksIDB4MDUpOworCS8qIFJlY2VpdmUgIFRpbWUtc2xvdCBvZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkMxLCBjaCksIDB4MDApOworCisJLyogTE9TIERldGVjdGlvbiBhZnRlciAxNzYgY29uc2VjdXRpdmUgMHMgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUENEUiwgY2gpLCAweDBhKTsKKwkvKiBMT1MgUmVjb3ZlcnkgYWZ0ZXIgMjIgb25lcyBpbiB0aGUgdGltZSB3aW5kb3cgb2YgUENEICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFBDUlIsIGNoKSwgMHgxNSk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSURMRSwgY2gpLCAweDdmKTsKKworCWZhbGNfY2xvc2VfYWxsX3RpbWVzbG90cyhjYXJkLCBjaCk7Cit9CisKK3ZvaWQgZmFsY19pbml0X2hkbGMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisKKwkvKiBFbmFibGUgdHJhbnNwYXJlbnQgZGF0YSB0cmFuc2ZlciAqLworCWlmIChjb25mLT5mcl9tb2RlID09IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhNT0RFLCBjaCksIDApOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhNT0RFLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhNT0RFLCBjaCkpIHwKKwkJCSAgIChNT0RFX0hSQUMgfCBNT0RFX01EUzIpKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJBSDIsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQUgxLCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkFMMiwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJBTDEsIGNoKSwgMHhmZik7CisJfQorCisJLyogVHgvUnggcmVzZXQgICovCisJZmFsY19pc3N1ZV9jbWQoY2FyZCwgY2gsIENNRFJfUlJFUyB8IENNRFJfWFJFUyB8IENNRFJfU1JFUyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlmYWxjX2ludHJfZW5hYmxlKGNhcmQsIGNoKTsKK30KKwordm9pZCB0ZV9jb25maWcocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciBkdW1teTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbWVtc2V0KHBmYWxjLCAwLCBzaXplb2YoZmFsY190KSk7CisJc3dpdGNoIChjb25mLT5tZWRpYSkgeworCQljYXNlIElGX0lGQUNFX1QxOgorCQkJcGZhbGMtPm51bV9jaGFubmVscyA9IE5VTV9PRl9UMV9DSEFOTkVMUzsKKwkJCXBmYWxjLT5vZmZzZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSUZfSUZBQ0VfRTE6CisJCQlwZmFsYy0+bnVtX2NoYW5uZWxzID0gTlVNX09GX0UxX0NIQU5ORUxTOworCQkJcGZhbGMtPm9mZnNldCA9IDA7CisJCQlicmVhazsKKwl9CisJaWYgKGNvbmYtPnRzbG90X2JpdG1hcCA9PSAweGZmZmZmZmZmVUwpCisJCXBmYWxjLT5mdWxsX2JhbmR3aWR0aCA9IDE7CisJZWxzZQorCQlwZmFsYy0+ZnVsbF9iYW5kd2lkdGggPSAwOworCisJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCS8qIFJlc2V0IHRoZSBGQUxDIGNoaXAgKi8KKwljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpIHwKKwkJICAgKENQTERfUkVHMV9GQUxDX1JFU0VUIDw8ICgyICogY2gpKSk7CisJdWRlbGF5KDEwMDAwKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpICYKKwkJICAgfihDUExEX1JFRzFfRkFMQ19SRVNFVCA8PCAoMiAqIGNoKSkpOworCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWZhbGNfaW5pdF90MShjYXJkLCBjaCk7CisJfSBlbHNlIHsKKwkJZmFsY19pbml0X2UxKGNhcmQsIGNoKTsKKwl9CisJZmFsY19pbml0X2hkbGMoY2FyZCwgY2gpOworCWlmIChjb25mLT5yeF9zZW5zID09IFBDMzAwX1JYX1NFTlNfU0gpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+TElNMF9FUU9OKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSB8IExJTTBfRVFPTik7CisJfQorCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkgICAoKENQTERfUkVHMl9GQUxDX1RYX0NMSyB8IENQTERfUkVHMl9GQUxDX1JYX0NMSykgPDwgKDIgKiBjaCkpKTsKKworCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCisJZHVtbXkgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMCwgY2gpKSArCisJCWNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IxLCBjaCkpICsKKwkJY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjIsIGNoKSkgKworCQljcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMywgY2gpKTsKKwlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKK30KKwordm9pZCBmYWxjX2NoZWNrX3N0YXR1cyhwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1bnNpZ25lZCBjaGFyIGZyczApCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCS8qIFZlcmlmeSBMT1MgKi8KKwlpZiAoZnJzMCAmIEZSUzBfTE9TKSB7CisJCWlmICghcGZhbGMtPnJlZF9hbGFybSkgeworCQkJcGZhbGMtPnJlZF9hbGFybSA9IDE7CisJCQlwZmFsYy0+bG9zKys7CisJCQlpZiAoIXBmYWxjLT5ibHVlX2FsYXJtKSB7CisJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgaW50ZXJmZXJlIAorCQkJCQkgKiB3aXRoIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLCAKKwkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkKKwkJCQkJCSAgIHwgSU1SMF9QREVOKTsKKwkJCQl9CisJCQkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChwZmFsYy0+cmVkX2FsYXJtKSB7CisJCQlwZmFsYy0+cmVkX2FsYXJtID0gMDsKKwkJCXBmYWxjLT5sb3NyKys7CisJCX0KKwl9CisKKwlpZiAoY29uZi0+ZnJfbW9kZSAhPSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQkvKiBWZXJpZnkgQUlTIGFsYXJtICovCisJCWlmIChmcnMwICYgRlJTMF9BSVMpIHsKKwkJCWlmICghcGZhbGMtPmJsdWVfYWxhcm0pIHsKKwkJCQlwZmFsYy0+Ymx1ZV9hbGFybSA9IDE7CisJCQkJcGZhbGMtPmFpcysrOworCQkJCS8vIEVWRU5UX0FJUworCQkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgaW50ZXJmZXJlIHdpdGggICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKSB8IElNUjBfUERFTik7CisJCQkJfQorCQkJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCQkvLyBFVkVOVF9BSVMKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBmYWxjLT5ibHVlX2FsYXJtID0gMDsKKwkJfQorCisJCS8qIFZlcmlmeSBMRkEgKi8KKwkJaWYgKGZyczAgJiBGUlMwX0xGQSkgeworCQkJaWYgKCFwZmFsYy0+bG9zc19mYSkgeworCQkJCXBmYWxjLT5sb3NzX2ZhID0gMTsKKwkJCQlwZmFsYy0+bGZhKys7CisJCQkJaWYgKCFwZmFsYy0+Ymx1ZV9hbGFybSAmJiAhcGZhbGMtPnJlZF9hbGFybSkgeworCQkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIAorCQkJCQkJICogaW50ZXJmZXJlIHdpdGggb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkKKwkJCQkJCQkgICB8IElNUjBfUERFTik7CisJCQkJCX0KKwkJCQkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBmYWxjLT5sb3NzX2ZhKSB7CisJCQkJcGZhbGMtPmxvc3NfZmEgPSAwOworCQkJCXBmYWxjLT5mYXJlYysrOworCQkJfQorCQl9CisKKwkJLyogVmVyaWZ5IExNRkEgKi8KKwkJaWYgKHBmYWxjLT5tdWx0aWZyYW1lX21vZGUgJiYgKGZyczAgJiBGUlMwX0xNRkEpKSB7CisJCQkvKiBENCBvciBDUkM0IGZyYW1lIG1vZGUgKi8KKwkJCWlmICghcGZhbGMtPmxvc3NfbWZhKSB7CisJCQkJcGZhbGMtPmxvc3NfbWZhID0gMTsKKwkJCQlwZmFsYy0+bG1mYSsrOworCQkJCWlmICghcGZhbGMtPmJsdWVfYWxhcm0gJiYgIXBmYWxjLT5yZWRfYWxhcm0gJiYKKwkJCQkgICAgIXBmYWxjLT5sb3NzX2ZhKSB7CisJCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgCisJCQkJCQkgKiBpbnRlcmZlcmUgd2l0aCBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKQorCQkJCQkJCSAgIHwgSU1SMF9QREVOKTsKKwkJCQkJfQorCQkJCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwZmFsYy0+bG9zc19tZmEgPSAwOworCQl9CisKKwkJLyogVmVyaWZ5IFJlbW90ZSBBbGFybSAqLworCQlpZiAoZnJzMCAmIEZSUzBfUlJBKSB7CisJCQlpZiAoIXBmYWxjLT55ZWxsb3dfYWxhcm0pIHsKKwkJCQlwZmFsYy0+eWVsbG93X2FsYXJtID0gMTsKKwkJCQlwZmFsYy0+cmFpKys7CisJCQkJaWYgKHBmYWxjLT5zeW5jKSB7CisJCQkJCS8vIEVWRU5UX1JBSQorCQkJCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCQkJCS8vIEVWRU5UX1JBSQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBmYWxjLT55ZWxsb3dfYWxhcm0gPSAwOworCQl9CisJfSAvKiBpZiAhUEMzMDBfVU5GUkFNRUQgKi8KKworCWlmIChwZmFsYy0+cmVkX2FsYXJtIHx8IHBmYWxjLT5sb3NzX2ZhIHx8CisJICAgIHBmYWxjLT5sb3NzX21mYSB8fCBwZmFsYy0+Ymx1ZV9hbGFybSkgeworCQlpZiAocGZhbGMtPnN5bmMpIHsKKwkJCXBmYWxjLT5zeW5jID0gMDsKKwkJCWNoYW4tPmQubGluZV9vZmYrKzsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkJICAgfihDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXBmYWxjLT5zeW5jKSB7CisJCQlwZmFsYy0+c3luYyA9IDE7CisJCQljaGFuLT5kLmxpbmVfb24rKzsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCQkJICAgKENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwkJfQorCX0KKworCWlmIChwZmFsYy0+c3luYyAmJiAhcGZhbGMtPnllbGxvd19hbGFybSkgeworCQlpZiAoIXBmYWxjLT5hY3RpdmUpIHsKKwkJCS8vIEVWRU5UX0ZBTENfTk9STUFMCisJCQlpZiAocGZhbGMtPmxvb3BfYWN0aXZlKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKSAmIH5JTVIwX1BERU4pOworCQkJfQorCQkJZmFsY19lbmFibGVfY29tbShjYXJkLCBjaCk7CisJCQkvLyBFVkVOVF9GQUxDX05PUk1BTAorCQkJcGZhbGMtPmFjdGl2ZSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGZhbGMtPmFjdGl2ZSkgeworCQkJcGZhbGMtPmFjdGl2ZSA9IDA7CisJCX0KKwl9Cit9CisKK3ZvaWQgZmFsY191cGRhdGVfc3RhdHMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjc2hvcnQgY291bnRlcjsKKworCWNvdW50ZXIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGRUNMLCBjaCkpOworCWNvdW50ZXIgfD0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRkVDSCwgY2gpKSA8PCA4OworCXBmYWxjLT5mZWMgKz0gY291bnRlcjsKKworCWNvdW50ZXIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhDVkNMLCBjaCkpOworCWNvdW50ZXIgfD0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQ1ZDSCwgY2gpKSA8PCA4OworCXBmYWxjLT5jdmMgKz0gY291bnRlcjsKKworCWNvdW50ZXIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhDRUNMLCBjaCkpOworCWNvdW50ZXIgfD0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQ0VDSCwgY2gpKSA8PCA4OworCXBmYWxjLT5jZWMgKz0gY291bnRlcjsKKworCWNvdW50ZXIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhFQkNMLCBjaCkpOworCWNvdW50ZXIgfD0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRUJDSCwgY2gpKSA8PCA4OworCXBmYWxjLT5lYmMgKz0gY291bnRlcjsKKworCWlmIChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpICYgTENSMV9FUFJNKSB7CisJCW1kZWxheSgxMCk7CisJCWNvdW50ZXIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhCRUNMLCBjaCkpOworCQljb3VudGVyIHw9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEJFQ0gsIGNoKSkgPDwgODsKKwkJcGZhbGMtPmJlYyArPSBjb3VudGVyOworCisJCWlmICgoKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSAmJgorCQkgICAgIChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMxLCBjaCkpICYgRlJTMV9MTEJBRCkgJiYKKwkJICAgICAoIShjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMxLCBjaCkpICYgRlJTMV9QREVOKSkpCisJCSAgICB8fAorCQkgICAgKChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9FMSkgJiYKKwkJICAgICAoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoUlNQLCBjaCkpICYgUlNQX0xMQkFEKSkpIHsKKwkJCXBmYWxjLT5wcmJzID0gMjsKKwkJfSBlbHNlIHsKKwkJCXBmYWxjLT5wcmJzID0gMTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX3JlbW90ZV9sb29wCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglJbiB0aGUgcmVtb3RlIGxvb3BiYWNrIG1vZGUgdGhlIGNsb2NrIGFuZCBkYXRhIHJlY292ZXJlZAorICoJCWZyb20gdGhlIGxpbmUgaW5wdXRzIFJMMS8yIG9yIFJESVAvUkRJTiBhcmUgcm91dGVkIGJhY2sKKyAqCQl0byB0aGUgbGluZSBvdXRwdXRzIFhMMS8yIG9yIFhET1AvWERPTiB2aWEgdGhlIGFuYWxvZworICoJCXRyYW5zbWl0dGVyLiBBcyBpbiBub3JtYWwgbW9kZSB0aGV5IGFyZSBwcm9jZXNzc2VkIGJ5CisgKgkJdGhlIHN5bmNocm9uaXplciBhbmQgdGhlbiBzZW50IHRvIHRoZSBzeXN0ZW0gaW50ZXJmYWNlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19yZW1vdGVfbG9vcChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBpbnQgbG9vcF9vbikKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGxvb3Bfb24pIHsKKwkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSBpbnRlcmZlcmUgd2l0aCAKKwkJCSAqIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpIHwgSU1SMF9QREVOKTsKKwkJfQorCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSkgfCBMSU0xX1JMKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpKSAmIH5MSU0xX1JMKTsKKwkJcGZhbGMtPnN5bmMgPSAwOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkgICB+KENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwkJcGZhbGMtPmFjdGl2ZSA9IDA7CisJCWZhbGNfaXNzdWVfY21kKGNhcmQsIGNoLCBDTURSX1hSRVMpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAwOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX2xvY2FsX2xvb3AKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246IFRoZSBsb2NhbCBsb29wYmFjayBtb2RlIGRpc2Nvbm5lY3RzIHRoZSByZWNlaXZlIGxpbmVzIAorICoJCVJMMS9STDIgcmVzcC4gUkRJUC9SRElOIGZyb20gdGhlIHJlY2VpdmVyLiBJbnN0ZWFkIG9mIHRoZQorICoJCXNpZ25hbHMgY29taW5nIGZyb20gdGhlIGxpbmUgdGhlIGRhdGEgcHJvdmlkZWQgYnkgc3lzdGVtCisgKgkJaW50ZXJmYWNlIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgYW5hbG9nIHJlY2VpdmVyIGJhY2sgdG8KKyAqCQl0aGUgc3lzdGVtIGludGVyZmFjZS4gVGhlIHVuaXBvbGFyIGJpdCBzdHJlYW0gd2lsbCBiZQorICoJCXVuZGlzdHVyYmVkIHRyYW5zbWl0dGVkIG9uIHRoZSBsaW5lLiBSZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIKKyAqCQljb2RpbmcgbXVzdCBiZSBpZGVudGljYWwuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX2xvY2FsX2xvb3AocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgaW50IGxvb3Bfb24pCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAobG9vcF9vbikgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSB8IExJTTBfTEwpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAxOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfkxJTTBfTEwpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAwOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX3BheWxvYWRfbG9vcAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIGFsbG93cyB0byBlbmFibGUvZGlzYWJsZSBwYXlsb2FkIGxvb3BiYWNrLgorICoJCVdoZW4gdGhlIHBheWxvYWQgbG9vcCBpcyBhY3RpdmF0ZWQsIHRoZSByZWNlaXZlZCAxOTIgYml0cworICoJCW9mIHBheWxvYWQgZGF0YSB3aWxsIGJlIGxvb3BlZCBiYWNrIHRvIHRoZSB0cmFuc21pdAorICoJCWRpcmVjdGlvbi4gVGhlIGZyYW1pbmcgYml0cywgQ1JDNiBhbmQgREwgYml0cyBhcmUgbm90IAorICoJCWxvb3BlZC4gVGhleSBhcmUgb3JpZ2luYXRlZCBieSB0aGUgRkFMQy1MSCB0cmFuc21pdHRlci4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfcGF5bG9hZF9sb29wKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIGludCBsb29wX29uKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAobG9vcF9vbikgeworCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIGludGVyZmVyZSB3aXRoIAorCQkJICogb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkgfCBJTVIwX1BERU4pOworCQl9CisJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfUExCKTsKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSkgfCBGTVI0X1RNKTsKKwkJfSBlbHNlIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSB8IFhTUF9UVDApOworCQl9CisJCWZhbGNfb3Blbl9hbGxfdGltZXNsb3RzKGNhcmQsIGNoKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMjsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIH5GTVIyX1BMQik7CisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCkpICYgfkZNUjRfVE0pOworCQl9IGVsc2UgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpICYgflhTUF9UVDApOworCQl9CisJCXBmYWxjLT5zeW5jID0gMDsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJICAgfihDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJCXBmYWxjLT5hY3RpdmUgPSAwOworCQlmYWxjX2lzc3VlX2NtZChjYXJkLCBjaCwgQ01EUl9YUkVTKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMDsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHVybl9vZmZfeGx1CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglUdXJucyBYTFUgYml0IG9mZiBpbiB0aGUgcHJvcGVyIHJlZ2lzdGVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCB0dXJuX29mZl94bHUocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgJiB+Rk1SNV9YTFUpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCkpICYgfkZNUjNfWExVKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHVybl9vZmZfeGxkCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOiBUdXJucyBYTEQgYml0IG9mZiBpbiB0aGUgcHJvcGVyIHJlZ2lzdGVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCB0dXJuX29mZl94bGQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgJiB+Rk1SNV9YTEQpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCkpICYgfkZNUjNfWExEKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19nZW5lcmF0ZV9sb29wX3VwX2NvZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CVRoaXMgcm91dGluZSB3cml0ZXMgdGhlIHByb3BlciBGQUxDIGNoaXAgcmVnaXN0ZXIgaW4gb3JkZXIKKyAqCQl0byBnZW5lcmF0ZSBhIExPT1AgYWN0aXZhdGlvbiBjb2RlIG92ZXIgYSBUMS9FMSBsaW5lLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19nZW5lcmF0ZV9sb29wX3VwX2NvZGUocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpIHwgRk1SNV9YTFUpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCkpIHwgRk1SM19YTFUpOworCX0KKwkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSBpbnRlcmZlcmUgd2l0aCAKKwkJICogb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpIHwgSU1SMF9QREVOKTsKKwl9CisJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwlwZmFsYy0+bG9vcF9nZW4gPSAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfZ2VuZXJhdGVfbG9vcF9kb3duX2NvZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CVRoaXMgcm91dGluZSB3cml0ZXMgdGhlIHByb3BlciBGQUxDIGNoaXAgcmVnaXN0ZXIgaW4gb3JkZXIKKyAqCQl0byBnZW5lcmF0ZSBhIExPT1AgZGVhY3RpdmF0aW9uIGNvZGUgb3ZlciBhIFQxL0UxIGxpbmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX2dlbmVyYXRlX2xvb3BfZG93bl9jb2RlKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSB8IEZNUjVfWExEKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpKSB8IEZNUjNfWExEKTsKKwl9CisJcGZhbGMtPnN5bmMgPSAwOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkgICB+KENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwlwZmFsYy0+YWN0aXZlID0gMDsKKy8vPyAgICBmYWxjX2lzc3VlX2NtZChjYXJkLCBjaCwgQ01EUl9YUkVTKTsKKwlwZmFsYy0+bG9vcF9nZW4gPSAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfcGF0dGVybl90ZXN0CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgcGF0dGVybiBjb2RlIGFuZCBjaGVja3MKKyAqCQlpdCBvbiB0aGUgcmVjZXB0aW9uIHNpZGUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX3BhdHRlcm5fdGVzdChwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1bnNpZ25lZCBpbnQgYWN0aXZhdGUpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChhY3RpdmF0ZSkgeworCQlwZmFsYy0+cHJicyA9IDE7CisJCXBmYWxjLT5iZWMgPSAwOworCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCS8qIERpc2FibGUgbG9jYWwgbG9vcCBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBkZXRlY3QgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpKSB8IElNUjNfTExCU0MpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBsb2NhbCBsb29wIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGRldGVjdCAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCkpIHwgSU1SMV9MTEJTQyk7CisJCX0KKwkJLyogQWN0aXZhdGVzIGdlbmVyYXRpb24gYW5kIG1vbml0b3Jpbmcgb2YgUFJCUyAKKwkJICogKFBzZXVkbyBSYW5kb20gQml0IFNlcXVlbmNlKSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSB8IExDUjFfRVBSTSB8IExDUjFfWFBSQlMpOworCX0gZWxzZSB7CisJCXBmYWxjLT5wcmJzID0gMDsKKwkJLyogRGVhY3RpdmF0ZXMgZ2VuZXJhdGlvbiBhbmQgbW9uaXRvcmluZyBvZiBQUkJTIAorCQkgKiAoUHNldWRvIFJhbmRvbSBCaXQgU2VxdWVuY2UpICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UrRl9SRUcoTENSMSxjaCkpICYgfihMQ1IxX0VQUk0gfCBMQ1IxX1hQUkJTKSk7CisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJLyogRW5hYmxlIGxvY2FsIGxvb3AgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZGV0ZWN0ICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSkgJiB+SU1SM19MTEJTQyk7CisJCX0gZWxzZSB7CisJCQkvKiBFbmFibGUgbG9jYWwgbG9vcCBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBkZXRlY3QgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpKSAmIH5JTVIxX0xMQlNDKTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX3BhdHRlcm5fdGVzdF9lcnJvcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGJpdCBlcnJvciBjb3VudGVyIHZhbHVlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordWNzaG9ydCBmYWxjX3BhdHRlcm5fdGVzdF9lcnJvcihwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisKKwlyZXR1cm4gKHBmYWxjLT5iZWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICBOZXQgSW50ZXJmYWNlIFJvdXRpbmVzICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitjcGNfdHJhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYl9tYWluLCBjaGFyIHJ4X3R4KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMTAgKyBza2JfbWFpbi0+bGVuKSkgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCXNrYl9wdXQoc2tiLCAxMCArIHNrYl9tYWluLT5sZW4pOworCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0NVU1QpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJc2tiLT5sZW4gPSAxMCArIHNrYl9tYWluLT5sZW47CisKKwltZW1jcHkoc2tiLT5kYXRhLCBkZXYtPm5hbWUsIDUpOworCXNrYi0+ZGF0YVs1XSA9ICdbJzsKKwlza2ItPmRhdGFbNl0gPSByeF90eDsKKwlza2ItPmRhdGFbN10gPSAnXSc7CisJc2tiLT5kYXRhWzhdID0gJzonOworCXNrYi0+ZGF0YVs5XSA9ICcgJzsKKwltZW1jcHkoJnNrYi0+ZGF0YVsxMF0sIHNrYl9tYWluLT5kYXRhLCBza2JfbWFpbi0+bGVuKTsKKworCW5ldGlmX3J4KHNrYik7Cit9CisKK3ZvaWQgY3BjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVjY2hhciBpbGFyOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwlpZiAoKGlsYXIgPSBjcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIElMQVIpKSAhPSAwKSB7CisJCXByaW50aygiJXM6IElMQVI9MHgleFxuIiwgZGV2LT5uYW1lLCBpbGFyKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgSUxBUiwgaWxhcik7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIERNRVIsIDB4ODApOworCX0KKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkgICB+KENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitpbnQgY3BjX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIFBDMzAwX0RFQlVHX1RYCisJaW50IGk7CisjZW5kaWYKKworCWlmIChjaGFuLT5jb25mLm1vbml0b3IpIHsKKwkJLyogSW4gbW9uaXRvciBtb2RlIG5vIFR4IGlzIGRvbmU6IGlnbm9yZSBwYWNrZXQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJLyogRENEIG11c3QgYmUgT0ZGOiBkcm9wIHBhY2tldCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhTVDMsIGNoKSkgJiBTVDNfRENEKSB7CisJCXByaW50aygiJXM6IERDRCBpcyBPRkYuIEdvaW5nIGFkbWluaXN0cmF0aXZlIGRvd24uXG4iLCBkZXYtPm5hbWUpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9UWF9CVUZfQ0xSKTsKKwkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmIAorCQkJCSAgIAkJCX4oQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCQl9CisJCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdyaXRlIGJ1ZmZlciB0byBETUEgYnVmZmVycyAqLworCWlmIChkbWFfYnVmX3dyaXRlKGNhcmQsIGNoLCAodWNjaGFyICopIHNrYi0+ZGF0YSwgc2tiLT5sZW4pICE9IDApIHsKKy8vCQlwcmludGsoIiVzOiB3cml0ZSBlcnJvci4gRHJvcHBpbmcgVFggcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIFBDMzAwX0RFQlVHX1RYCisJcHJpbnRrKCIlcyBUOiIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspCisJCXByaW50aygiICUwMngiLCAqKHNrYi0+ZGF0YSArIGkpKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCWlmIChkLT50cmFjZV9vbikgeworCQljcGNfdHJhY2UoZGV2LCBza2IsICdUJyk7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogU3RhcnQgdHJhbnNtaXNzaW9uICovCisJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCS8qIHZlcmlmeSBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBmcmVlIGRlc2NyaXB0b3IgKi8KKwlpZiAoY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQgPD0gMSkgeworCQkvKiBkb24ndCBoYXZlIHNvIHN0b3AgdGhlIHF1ZXVlICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJY3BjX3dyaXRlbChjYXJkLT5ody5zY2FiYXNlICsgRFRYX1JFRyhFREFMLCBjaCksCisJCSAgIFRYX0JEX0FERFIoY2gsIGNoYW4tPnR4X25leHRfYmQpKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1RYX0VOQSk7CisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgRFNSX1RYKGNoKSwgRFNSX0RFKTsKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCQkgICAoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCX0KKwlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjcGNfbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisjaWZkZWYgUEMzMDBfREVCVUdfUlgKKwlpbnQgaTsKKyNlbmRpZgorCWludCByeGI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgxKSB7CisJCWlmICgocnhiID0gZG1hX2dldF9yeF9mcmFtZV9zaXplKGNhcmQsIGNoKSkgPT0gLTEpCisJCQlyZXR1cm47CisKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJCS8qIERDRCBtdXN0IGJlIE9GRjogZHJvcCBwYWNrZXQgKi8KKwkJICAgIHByaW50aygiJXMgOiBEQ0QgaXMgT0ZGIC0gZHJvcCAlZCByeCBieXRlc1xuIiwgZGV2LT5uYW1lLCByeGIpOyAKKwkJCXNrYiA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlpZiAocnhiID4gKGRldi0+bXR1ICsgNDApKSB7IC8qIGFkZCBoZWFkZXJzICovCisJCQkJcHJpbnRrKCIlcyA6IE1UVSBleGNlZWRlZCAlZFxuIiwgZGV2LT5uYW1lLCByeGIpOyAKKwkJCQlza2IgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4Yik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplISFcbiIsIGRldi0+bmFtZSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQl9CisJCX0KKworCQlpZiAoKChyeGIgPSBkbWFfYnVmX3JlYWQoY2FyZCwgY2gsIHNrYikpIDw9IDApIHx8IChza2IgPT0gTlVMTCkpIHsKKyNpZmRlZiBQQzMwMF9ERUJVR19SWAorCQkJcHJpbnRrKCIlczogcnhiID0gJXhcbiIsIGRldi0+bmFtZSwgcnhiKTsKKyNlbmRpZgorCQkJaWYgKChza2IgPT0gTlVMTCkgJiYgKHJ4YiA+IDApKSB7CisJCQkJLyogcnhiID4gZGV2LT5tdHUgKi8KKwkJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHJ4YiA8IDApIHsJLyogSW52YWxpZCBmcmFtZSAqLworCQkJCXJ4YiA9IC1yeGI7CisJCQkJaWYgKHJ4YiAmIERTVF9PVlIpIHsKKwkJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMrKzsKKwkJCQl9CisJCQkJaWYgKHJ4YiAmIERTVF9DUkMpIHsKKwkJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQkJCX0KKwkJCQlpZiAocnhiICYgKERTVF9SQklUIHwgRFNUX1NIUlQgfCBEU1RfQUJUKSkgeworCQkJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHJ4YjsKKworI2lmZGVmIFBDMzAwX0RFQlVHX1JYCisJCXByaW50aygiJXMgUjoiLCBkZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykKKwkJCXByaW50aygiICUwMngiLCAqKHNrYi0+ZGF0YSArIGkpKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCWlmIChkLT50cmFjZV9vbikgeworCQkJY3BjX3RyYWNlKGRldiwgc2tiLCAnUicpOworCQl9CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yeChza2IpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICBQQzMwMCBJbnRlcnJ1cHQgUm91dGluZXMgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2NhX3R4X2ludHIocGMzMDBkZXZfdCAqZGV2KQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKilkZXYtPmNoYW47IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKWNoYW4tPmNhcmQ7IAorCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7IAorCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqIHB0ZGVzY3I7IAorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2LT5kZXYpOworCisgICAgLyogQ2xlYW4gdXAgZGVzY3JpcHRvcnMgZnJvbSBwcmV2aW91cyB0cmFuc21pc3Npb24gKi8KKwlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKworCQkJCQkJVFhfQkRfQUREUihjaCxjaGFuLT50eF9maXJzdF9iZCkpOworCXdoaWxlICgoY3BjX3JlYWRsKGNhcmQtPmh3LnNjYWJhc2UgKyBEVFhfUkVHKENEQUwsY2gpKSAhPSAKKwkJCQkJCQlUWF9CRF9BRERSKGNoLGNoYW4tPnR4X2ZpcnN0X2JkKSkgJiYgCisJCQkoY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpICYgRFNUX09TQikpIHsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IGNwY19yZWFkdygmcHRkZXNjci0+bGVuKTsKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCBEU1RfT1NCKTsKKwkJY3BjX3dyaXRldygmcHRkZXNjci0+bGVuLCAwKTsKKwkJY2hhbi0+bmZyZWVfdHhfYmQrKzsKKwkJY2hhbi0+dHhfZmlyc3RfYmQgPSAoY2hhbi0+dHhfZmlyc3RfYmQgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKTsKKwkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgVFhfQkRfQUREUihjaCxjaGFuLT50eF9maXJzdF9iZCkpOworICAgIH0KKworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCWlmIChjaGFuLT5jb25mLnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQljcGNfdHR5X3RyaWdnZXJfcG9sbChkZXYpOworCX0gZWxzZSB7CisjZW5kaWYKKwkvKiBUZWxsIHRoZSB1cHBlciBsYXllciB3ZSBhcmUgcmVhZHkgdG8gdHJhbnNtaXQgbW9yZSBwYWNrZXRzICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5kZXYpOworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzY2FfaW50cihwYzMwMF90ICogY2FyZCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXZvbGF0aWxlIHVjbG9uZyBzdGF0dXM7CisJaW50IGNoOworCWludCBpbnRyX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGRzcl9yeDsKKworCXdoaWxlICgoc3RhdHVzID0gY3BjX3JlYWRsKHNjYWJhc2UgKyBJU1IwKSkgIT0gMCkgeworCQlmb3IgKGNoID0gMDsgY2ggPCBjYXJkLT5ody5uY2hhbjsgY2grKykgeworCQkJcGMzMDBjaF90ICpjaGFuID0gJmNhcmQtPmNoYW5bY2hdOworCQkJcGMzMDBkZXZfdCAqZCA9ICZjaGFuLT5kOworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGQtPmRldjsKKwkJCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworCQkJc3Bpbl9sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCisJICAgIC8qKioqIFJlY2VwdGlvbiAqKioqLworCQkJaWYgKHN0YXR1cyAmIElSMF9EUlgoKElSMF9ETUlBIHwgSVIwX0RNSUIpLCBjaCkpIHsKKwkJCQl1Y2NoYXIgZHJ4X3N0YXQgPSBjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpOworCisJCQkJLyogQ2xlYXIgUlggaW50ZXJydXB0cyAqLworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9SWChjaCksIGRyeF9zdGF0IHwgRFNSX0RXRSk7CisKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCQkJcHJpbnRrICgic2NhX2ludHI6IFJYIGludHIgY2hhblslZF0gKHN0PTB4JTA4bHgsIGRzcj0weCUwMngpXG4iLAorCQkJCQkgY2gsIHN0YXR1cywgZHJ4X3N0YXQpOworI2VuZGlmCisJCQkJaWYgKHN0YXR1cyAmIElSMF9EUlgoSVIwX0RNSUEsIGNoKSkgeworCQkJCQlpZiAoZHJ4X3N0YXQgJiBEU1JfQk9GKSB7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQkJCQlpZiAoY2hhbi0+Y29uZi5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCQkJCS8qIHZlcmlmeSBpZiBkcml2ZXIgaXMgVFRZICovCisJCQkJCQkJaWYgKChjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpICYgRFNSX0RFKSkgeworCQkJCQkJCQlyeF9kbWFfc3RvcChjYXJkLCBjaCk7CisJCQkJCQkJfQorCQkJCQkJCWNwY190dHlfcmVjZWl2ZShkKTsKKwkJCQkJCQlyeF9kbWFfc3RhcnQoY2FyZCwgY2gpOworCQkJCQkJfSBlbHNlIAorI2VuZGlmCisJCQkJCQl7CisJCQkJCQkJaWYgKChjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpICYgRFNSX0RFKSkgeworCQkJCQkJCQlyeF9kbWFfc3RvcChjYXJkLCBjaCk7CisJCQkJCQkJfQorCQkJCQkJCWNwY19uZXRfcngoZGV2KTsKKwkJCQkJCQkvKiBEaXNjYXJkIGludmFsaWQgZnJhbWVzICovCisJCQkJCQkJaGRsYy0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCQkJaGRsYy0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQkJCQljaGFuLT5yeF9maXJzdF9iZCA9IDA7CisJCQkJCQkJY2hhbi0+cnhfbGFzdF9iZCA9IE5fRE1BX1JYX0JVRiAtIDE7CisJCQkJCQkJcnhfZG1hX3N0YXJ0KGNhcmQsIGNoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoc3RhdHVzICYgSVIwX0RSWChJUjBfRE1JQiwgY2gpKSB7CisJCQkJCWlmIChkcnhfc3RhdCAmIERTUl9FT00pIHsKKwkJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArCisJCQkJCQkJCSAgIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkJCQkJICAgY3BjX3JlYWRiIChjYXJkLT5ody5mYWxjYmFzZSArCisJCQkJCQkJCSAgICAJY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCQkJCQkJCSAgIChDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJCQkJCQl9CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQkJCQlpZiAoY2hhbi0+Y29uZi5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCQkJCS8qIHZlcmlmeSBpZiBkcml2ZXIgaXMgVFRZICovCisJCQkJCQkJY3BjX3R0eV9yZWNlaXZlKGQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljcGNfbmV0X3J4KGRldik7CisJCQkJCQl9CisjZWxzZQorCQkJCQkJY3BjX25ldF9yeChkZXYpOworI2VuZGlmCisJCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKworCQkJCQkJCQkgICBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJCQkJCSAgIGNwY19yZWFkYiAoY2FyZC0+aHcuZmFsY2Jhc2UgKworCQkJCQkJCQkgICAgCQljYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCQkJCQkJICAgfiAoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICghKGRzcl9yeCA9IGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSkgJiBEU1JfREUpKSB7CisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQlwcmludGsoIiVzOiBSWCBpbnRyIGNoYW5bJWRdIChzdD0weCUwOGx4LCBkc3I9MHglMDJ4LCBkc3IyPTB4JTAyeClcbiIsCisJCQlkZXYtPm5hbWUsIGNoLCBzdGF0dXMsIGRyeF9zdGF0LCBkc3JfcngpOworI2VuZGlmCisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9SWChjaCksIChkc3JfcnggfCBEU1JfREUpICYgMHhmZSk7CisJCQkJfQorCQkJfQorCisJICAgIC8qKioqIFRyYW5zbWlzc2lvbiAqKioqLworCQkJaWYgKHN0YXR1cyAmIElSMF9EVFgoKElSMF9FRlQgfCBJUjBfRE1JQSB8IElSMF9ETUlCKSwgY2gpKSB7CisJCQkJdWNjaGFyIGR0eF9zdGF0ID0gY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfVFgoY2gpKTsKKworCQkJCS8qIENsZWFyIFRYIGludGVycnVwdHMgKi8KKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfVFgoY2gpLCBkdHhfc3RhdCB8IERTUl9EV0UpOworCisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQkJCXByaW50ayAoInNjYV9pbnRyOiBUWCBpbnRyIGNoYW5bJWRdIChzdD0weCUwOGx4LCBkc3I9MHglMDJ4KVxuIiwKKwkJCQkJIGNoLCBzdGF0dXMsIGR0eF9zdGF0KTsKKyNlbmRpZgorCQkJCWlmIChzdGF0dXMgJiBJUjBfRFRYKElSMF9FRlQsIGNoKSkgeworCQkJCQlpZiAoZHR4X3N0YXQgJiBEU1JfVURSRikgeworCQkJCQkJaWYgKGNwY19yZWFkYiAoc2NhYmFzZSArIE1fUkVHKFRCTiwgY2gpKSAhPSAwKSB7CisJCQkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ01ELGNoKSwgQ01EX1RYX0JVRl9DTFIpOworCQkJCQkJfQorCQkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCQkJCQkgICBjcGNfcmVhZGIgKGNhcmQtPmh3LmZhbGNiYXNlICsgCisJCQkJCQkJCQkJICAgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkJCQkJCSAgIH4gKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwkJCQkJCX0KKwkJCQkJCWhkbGMtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQkJaGRsYy0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCXNjYV90eF9pbnRyKGQpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChzdGF0dXMgJiBJUjBfRFRYKElSMF9ETUlBLCBjaCkpIHsKKwkJCQkJaWYgKGR0eF9zdGF0ICYgRFNSX0JPRikgeworCQkJCQl9CisJCQkJfQorCQkJCWlmIChzdGF0dXMgJiBJUjBfRFRYKElSMF9ETUlCLCBjaCkpIHsKKwkJCQkJaWYgKGR0eF9zdGF0ICYgRFNSX0VPTSkgeworCQkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCQkJCQkgICBjcGNfcmVhZGIgKGNhcmQtPmh3LmZhbGNiYXNlICsKKwkJCQkJCQkJICAgIAkJCWNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJCQkJCQkgICB+IChDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJCQkJCQl9CisJCQkJCQlzY2FfdHhfaW50cihkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCSAgICAvKioqKiBNU0NJICoqKiovCisJCQlpZiAoc3RhdHVzICYgSVIwX00oSVIwX1JYSU5UQSwgY2gpKSB7CisJCQkJdWNjaGFyIHN0MSA9IGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QxLCBjaCkpOworCisJCQkJLyogQ2xlYXIgTVNDSSBpbnRlcnJ1cHRzICovCisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoU1QxLCBjaCksIHN0MSk7CisKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCQkJcHJpbnRrKCJzY2FfaW50cjogTVNDSSBpbnRyIGNoYW5bJWRdIChzdD0weCUwOGx4LCBzdDE9MHglMDJ4KVxuIiwKKwkJCQkJIGNoLCBzdGF0dXMsIHN0MSk7CisjZW5kaWYKKwkJCQlpZiAoc3QxICYgU1QxX0NEQ0QpIHsJLyogRENEIGNoYW5nZWQgKi8KKwkJCQkJaWYgKGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QzLCBjaCkpICYgU1QzX0RDRCkgeworCQkJCQkJcHJpbnRrICgiJXM6IERDRCBpcyBPRkYuIEdvaW5nIGFkbWluaXN0cmF0aXZlIGRvd24uXG4iLAorCQkJCQkJCSBkZXYtPm5hbWUpOworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJCQkJaWYgKGNoYW4tPmNvbmYucHJvdG8gIT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJCQkJfQorI2Vsc2UKKwkJCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKyNlbmRpZgorCQkJCQkJY2FyZC0+Y2hhbltjaF0uZC5saW5lX29mZisrOworCQkJCQl9IGVsc2UgewkvKiBEQ0QgPSAxICovCisJCQkJCQlwcmludGsgKCIlczogRENEIGlzIE9OLiBHb2luZyBhZG1pbmlzdHJhdGl2ZSB1cC5cbiIsCisJCQkJCQkJIGRldi0+bmFtZSk7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQkJCQlpZiAoY2hhbi0+Y29uZi5wcm90byAhPSBQQzMwMF9QUk9UT19NTFBQUCkKKwkJCQkJCQkvKiB2ZXJpZnkgaWYgZHJpdmVyIGlzIG5vdCBUVFkgKi8KKyNlbmRpZgorCQkJCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCQkJCWNhcmQtPmNoYW5bY2hdLmQubGluZV9vbisrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7CisJCX0KKwkJaWYgKCsraW50cl9jb3VudCA9PSAxMCkKKwkJCS8qIFRvbyBtdWNoIHdvcmsgYXQgdGhpcyBib2FyZC4gRm9yY2UgZXhpdCAqLworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYWxjX3QxX2xvb3BfZGV0ZWN0aW9uKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVjY2hhciBmcnMxKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKCgoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSAmIExDUjFfWFBSQlMpID09IDApICYmCisJICAgICFwZmFsYy0+bG9vcF9nZW4pIHsKKwkJaWYgKGZyczEgJiBGUlMxX0xMQkREKSB7CisJCQkvLyBBIExpbmUgTG9vcCBCYWNrIERlYWN0aXZhdGlvbiBzaWduYWwgZGV0ZWN0ZWQKKwkJCWlmIChwZmFsYy0+bG9vcF9hY3RpdmUpIHsKKwkJCQlmYWxjX3JlbW90ZV9sb29wKGNhcmQsIGNoLCAwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoZnJzMSAmIEZSUzFfTExCQUQpICYmCisJCQkgICAgKChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpICYgTENSMV9FUFJNKSA9PSAwKSkgeworCQkJCS8vIEEgTGluZSBMb29wIEJhY2sgQWN0aXZhdGlvbiBzaWduYWwgZGV0ZWN0ZWQgIAorCQkJCWlmICghcGZhbGMtPmxvb3BfYWN0aXZlKSB7CisJCQkJCWZhbGNfcmVtb3RlX2xvb3AoY2FyZCwgY2gsIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmFsY19lMV9sb29wX2RldGVjdGlvbihwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1Y2NoYXIgcnNwKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKCgoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSAmIExDUjFfWFBSQlMpID09IDApICYmCisJICAgICFwZmFsYy0+bG9vcF9nZW4pIHsKKwkJaWYgKHJzcCAmIFJTUF9MTEJERCkgeworCQkJLy8gQSBMaW5lIExvb3AgQmFjayBEZWFjdGl2YXRpb24gc2lnbmFsIGRldGVjdGVkCisJCQlpZiAocGZhbGMtPmxvb3BfYWN0aXZlKSB7CisJCQkJZmFsY19yZW1vdGVfbG9vcChjYXJkLCBjaCwgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHJzcCAmIFJTUF9MTEJBRCkgJiYKKwkJCSAgICAoKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgJiBMQ1IxX0VQUk0pID09IDApKSB7CisJCQkJLy8gQSBMaW5lIExvb3AgQmFjayBBY3RpdmF0aW9uIHNpZ25hbCBkZXRlY3RlZCAgCisJCQkJaWYgKCFwZmFsYy0+bG9vcF9hY3RpdmUpIHsKKwkJCQkJZmFsY19yZW1vdGVfbG9vcChjYXJkLCBjaCwgMSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmYWxjX3QxX2ludHIocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgaXNyMCwgaXNyMywgZ2lzOworCXVjY2hhciBkdW1teTsKKworCXdoaWxlICgoZ2lzID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoR0lTLCBjaCkpKSAhPSAwKSB7CisJCWlmIChnaXMgJiBHSVNfSVNSMCkgeworCQkJaXNyMCA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IwLCBjaCkpOworCQkJaWYgKGlzcjAgJiBGSVNSMF9QREVOKSB7CisJCQkJLyogUmVhZCB0aGUgYml0IHRvIGNsZWFyIHRoZSBzaXR1YXRpb24gKi8KKwkJCQlpZiAoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMSwgY2gpKSAmCisJCQkJICAgIEZSUzFfUERFTikgeworCQkJCQlwZmFsYy0+cGRlbisrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChnaXMgJiBHSVNfSVNSMSkgeworCQkJZHVtbXkgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMSwgY2gpKTsKKwkJfQorCisJCWlmIChnaXMgJiBHSVNfSVNSMikgeworCQkJZHVtbXkgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMiwgY2gpKTsKKwkJfQorCisJCWlmIChnaXMgJiBHSVNfSVNSMykgeworCQkJaXNyMyA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IzLCBjaCkpOworCQkJaWYgKGlzcjMgJiBGSVNSM19TRUMpIHsKKwkJCQlwZmFsYy0+c2VjKys7CisJCQkJZmFsY191cGRhdGVfc3RhdHMoY2FyZCwgY2gpOworCQkJCWZhbGNfY2hlY2tfc3RhdHVzKGNhcmQsIGNoLAorCQkJCQkJICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMwLCBjaCkpKTsKKwkJCX0KKwkJCWlmIChpc3IzICYgRklTUjNfRVMpIHsKKwkJCQlwZmFsYy0+ZXMrKzsKKwkJCX0KKwkJCWlmIChpc3IzICYgRklTUjNfTExCU0MpIHsKKwkJCQlmYWxjX3QxX2xvb3BfZGV0ZWN0aW9uKGNhcmQsIGNoLAorCQkJCQkJICAgICAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzEsIGNoKSkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmYWxjX2UxX2ludHIocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgaXNyMSwgaXNyMiwgaXNyMywgZ2lzLCByc3A7CisJdWNjaGFyIGR1bW15OworCisJd2hpbGUgKChnaXMgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhHSVMsIGNoKSkpICE9IDApIHsKKwkJcnNwID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoUlNQLCBjaCkpOworCisJCWlmIChnaXMgJiBHSVNfSVNSMCkgeworCQkJZHVtbXkgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMCwgY2gpKTsKKwkJfQorCQlpZiAoZ2lzICYgR0lTX0lTUjEpIHsKKwkJCWlzcjEgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMSwgY2gpKTsKKwkJCWlmIChpc3IxICYgRklTUjFfWE1CKSB7CisJCQkJaWYgKChwZmFsYy0+eG1iX2NhdXNlICYgMikKKwkJCQkgICAgJiYgcGZhbGMtPm11bHRpZnJhbWVfbW9kZSkgeworCQkJCQlpZiAoY3BjX3JlYWRiIChmYWxjYmFzZSArIEZfUkVHKEZSUzAsIGNoKSkgJiAKKwkJCQkJCQkJCShGUlMwX0xPUyB8IEZSUzBfQUlTIHwgRlJTMF9MRkEpKSB7CisJCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpCisJCQkJCQkJICAgJiB+WFNQX0FYUyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpCisJCQkJCQkJICAgfCBYU1BfQVhTKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlwZmFsYy0+eG1iX2NhdXNlID0gMDsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCkpIHwgSU1SMV9YTUIpOworCQkJfQorCQkJaWYgKGlzcjEgJiBGSVNSMV9MTEJTQykgeworCQkJCWZhbGNfZTFfbG9vcF9kZXRlY3Rpb24oY2FyZCwgY2gsIHJzcCk7CisJCQl9CisJCX0KKwkJaWYgKGdpcyAmIEdJU19JU1IyKSB7CisJCQlpc3IyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjIsIGNoKSk7CisJCQlpZiAoaXNyMiAmIEZJU1IyX1Q0MDBNUykgeworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpIHwgWFNXX1hSQSk7CisJCQl9CisJCQlpZiAoaXNyMiAmIEZJU1IyX01GQVIpIHsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSAmIH5YU1dfWFJBKTsKKwkJCX0KKwkJCWlmIChpc3IyICYgKEZJU1IyX0ZBUiB8IEZJU1IyX0xGQSB8IEZJU1IyX0FJUyB8IEZJU1IyX0xPUykpIHsKKwkJCQlwZmFsYy0+eG1iX2NhdXNlIHw9IDI7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpKSAmIH5JTVIxX1hNQik7CisJCQl9CisJCX0KKwkJaWYgKGdpcyAmIEdJU19JU1IzKSB7CisJCQlpc3IzID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjMsIGNoKSk7CisJCQlpZiAoaXNyMyAmIEZJU1IzX1NFQykgeworCQkJCXBmYWxjLT5zZWMrKzsKKwkJCQlmYWxjX3VwZGF0ZV9zdGF0cyhjYXJkLCBjaCk7CisJCQkJZmFsY19jaGVja19zdGF0dXMoY2FyZCwgY2gsCisJCQkJCQkgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzAsIGNoKSkpOworCQkJfQorCQkJaWYgKGlzcjMgJiBGSVNSM19FUykgeworCQkJCXBmYWxjLT5lcysrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmYWxjX2ludHIocGMzMDBfdCAqIGNhcmQpCit7CisJaW50IGNoOworCisJZm9yIChjaCA9IDA7IGNoIDwgY2FyZC0+aHcubmNoYW47IGNoKyspIHsKKwkJcGMzMDBjaF90ICpjaGFuID0gJmNhcmQtPmNoYW5bY2hdOworCQlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJZmFsY190MV9pbnRyKGNhcmQsIGNoKTsKKwkJfSBlbHNlIHsKKwkJCWZhbGNfZTFfaW50cihjYXJkLCBjaCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjcGNfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXBjMzAwX3QgKmNhcmQ7CisJdm9sYXRpbGUgdWNjaGFyIHBseF9zdGF0dXM7CisKKwlpZiAoKGNhcmQgPSAocGMzMDBfdCAqKSBkZXZfaWQpID09IDApIHsKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCXByaW50aygiY3BjX2ludHI6IHNwdXJpb3VzIGludHIgJWRcbiIsIGlycSk7CisjZW5kaWYKKwkJcmV0dXJuIElSUV9OT05FOwkJLyogc3B1cmlvdXMgaW50ciAqLworCX0KKworCWlmIChjYXJkLT5ody5yYW1iYXNlID09IDApIHsKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCXByaW50aygiY3BjX2ludHI6IHNwdXJpb3VzIGludHIyICVkXG4iLCBpcnEpOworI2VuZGlmCisJCXJldHVybiBJUlFfTk9ORTsJCS8qIHNwdXJpb3VzIGludHIgKi8KKwl9CisKKwlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKwkJY2FzZSBQQzMwMF9SU1Y6CisJCWNhc2UgUEMzMDBfWDIxOgorCQkJc2NhX2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX1RFOgorCQkJd2hpbGUgKCAocGx4X3N0YXR1cyA9IChjcGNfcmVhZGIoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmludGN0bF9yZWcpICYKKwkJCQkgKFBMWF85MDUwX0xJTlQxX1NUQVRVUyB8IFBMWF85MDUwX0xJTlQyX1NUQVRVUykpKSAhPSAwKSB7CisJCQkJaWYgKHBseF9zdGF0dXMgJiBQTFhfOTA1MF9MSU5UMV9TVEFUVVMpIHsJLyogU0NBIEludGVycnVwdCAqLworCQkJCQlzY2FfaW50cihjYXJkKTsKKwkJCQl9CisJCQkJaWYgKHBseF9zdGF0dXMgJiBQTFhfOTA1MF9MSU5UMl9TVEFUVVMpIHsJLyogRkFMQyBJbnRlcnJ1cHQgKi8KKwkJCQkJZmFsY19pbnRyKGNhcmQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgY3BjX3NjYV9zdGF0dXMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl1Y2NoYXIgaWxhcjsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0eF9kbWFfYnVmX2NoZWNrKGNhcmQsIGNoKTsKKwlyeF9kbWFfYnVmX2NoZWNrKGNhcmQsIGNoKTsKKwlpbGFyID0gY3BjX3JlYWRiKHNjYWJhc2UgKyBJTEFSKTsKKwlwcmludGsgKCJJTEFSPTB4JTAyeCwgV0NSTD0weCUwMngsIFBDUj0weCUwMngsIEJUQ1I9MHglMDJ4LCBCT0xSPTB4JTAyeFxuIiwKKwkJIGlsYXIsIGNwY19yZWFkYihzY2FiYXNlICsgV0NSTCksIGNwY19yZWFkYihzY2FiYXNlICsgUENSKSwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgQlRDUiksIGNwY19yZWFkYihzY2FiYXNlICsgQk9MUikpOworCXByaW50aygiVFhfQ0RBPTB4JTA4eCwgVFhfRURBPTB4JTA4eFxuIiwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEVFhfUkVHKENEQUwsIGNoKSksCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFRYX1JFRyhFREFMLCBjaCkpKTsKKwlwcmludGsoIlJYX0NEQT0weCUwOHgsIFJYX0VEQT0weCUwOHgsIEJGTD0weCUwNHhcbiIsCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFJYX1JFRyhDREFMLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERSWF9SRUcoRURBTCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWR3KHNjYWJhc2UgKyBEUlhfUkVHKEJGTEwsIGNoKSkpOworCXByaW50aygiRE1FUj0weCUwMngsIERTUl9UWD0weCUwMngsIERTUl9SWD0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRE1FUiksIGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1RYKGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSkpOworCXByaW50aygiRE1SX1RYPTB4JTAyeCwgRE1SX1JYPTB4JTAyeCwgRElSX1RYPTB4JTAyeCwgRElSX1JYPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBETVJfVFgoY2gpKSwgY3BjX3JlYWRiKHNjYWJhc2UgKyBETVJfUlgoY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBESVJfVFgoY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBESVJfUlgoY2gpKSk7CisJcHJpbnRrKCJEQ1JfVFg9MHglMDJ4LCBEQ1JfUlg9MHglMDJ4LCBGQ1RfVFg9MHglMDJ4LCBGQ1RfUlg9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERDUl9UWChjaCkpLCBjcGNfcmVhZGIoc2NhYmFzZSArIERDUl9SWChjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIEZDVF9UWChjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIEZDVF9SWChjaCkpKTsKKwlwcmludGsoIk1EMD0weCUwMngsIE1EMT0weCUwMngsIE1EMj0weCUwMngsIE1EMz0weCUwMngsIElETD0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoTUQwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKE1EMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoTUQzLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKElETCwgY2gpKSk7CisJcHJpbnRrKCJDTUQ9MHglMDJ4LCBTQTA9MHglMDJ4LCBTQTE9MHglMDJ4LCBURk49MHglMDJ4LCBDVEw9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTQTAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU0ExLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRGTiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSkpOworCXByaW50aygiU1QwPTB4JTAyeCwgU1QxPTB4JTAyeCwgU1QyPTB4JTAyeCwgU1QzPTB4JTAyeCwgU1Q0PTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1Q0LCBjaCkpKTsKKwlwcmludGsgKCJDU1QwPTB4JTAyeCwgQ1NUMT0weCUwMngsIENTVDI9MHglMDJ4LCBDU1QzPTB4JTAyeCwgRlNUPTB4JTAyeFxuIiwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1NUMCwgY2gpKSwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1NUMSwgY2gpKSwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1NUMiwgY2gpKSwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1NUMywgY2gpKSwKKwkJIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoRlNULCBjaCkpKTsKKwlwcmludGsoIlRSQzA9MHglMDJ4LCBUUkMxPTB4JTAyeCwgUlJDPTB4JTAyeCwgVEJOPTB4JTAyeCwgUkJOPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUUkMwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRSQzEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUlJDLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRCTiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSQk4sIGNoKSkpOworCXByaW50aygiVEZTPTB4JTAyeCwgVE5SMD0weCUwMngsIFROUjE9MHglMDJ4LCBSTlI9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRGUywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUTlIwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFROUjEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUk5SLCBjaCkpKTsKKwlwcmludGsoIlRDUj0weCUwMngsIFJDUj0weCUwMngsIFROUjE9MHglMDJ4LCBSTlI9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRDUiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSQ1IsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVE5SMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSTlIsIGNoKSkpOworCXByaW50aygiVFhTPTB4JTAyeCwgUlhTPTB4JTAyeCwgRVhTPTB4JTAyeCwgVE1DVD0weCUwMngsIFRNQ1I9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSWFMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRNQ1QsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVE1DUiwgY2gpKSk7CisJcHJpbnRrKCJJRTA9MHglMDJ4LCBJRTE9MHglMDJ4LCBJRTI9MHglMDJ4LCBJRTQ9MHglMDJ4LCBGSUU9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKElFMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhJRTEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoSUUyLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKElFNCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhGSUUsIGNoKSkpOworCXByaW50aygiSUVSMD0weCUwOHhcbiIsIGNwY19yZWFkbChzY2FiYXNlICsgSUVSMCkpOworCisJaWYgKGlsYXIgIT0gMCkgeworCQlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJCWNwY193cml0ZWIoc2NhYmFzZSArIElMQVIsIGlsYXIpOworCQljcGNfd3JpdGViKHNjYWJhc2UgKyBETUVSLCAweDgwKTsKKwkJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7CisJfQorfQorCit2b2lkIGNwY19mYWxjX3N0YXR1cyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9ICZjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwlwcmludGsoIkNIJWQ6ICAgJXMgJXMgICVkIGNoYW5uZWxzXG4iLAorCSAgICAgICBjaCwgKHBmYWxjLT5zeW5jID8gIlNZTkMiIDogIiIpLCAocGZhbGMtPmFjdGl2ZSA/ICJBQ1RJVkUiIDogIiIpLAorCSAgICAgICBwZmFsYy0+bnVtX2NoYW5uZWxzKTsKKworCXByaW50aygiICAgICAgICBwZGVuPSVkLCAgbG9zPSVkLCAgbG9zcj0lZCwgIGxmYT0lZCwgIGZhcmVjPSVkXG4iLAorCSAgICAgICBwZmFsYy0+cGRlbiwgcGZhbGMtPmxvcywgcGZhbGMtPmxvc3IsIHBmYWxjLT5sZmEsIHBmYWxjLT5mYXJlYyk7CisJcHJpbnRrKCIgICAgICAgIGxtZmE9JWQsICBhaXM9JWQsICBzZWM9JWQsICBlcz0lZCwgIHJhaT0lZFxuIiwKKwkgICAgICAgcGZhbGMtPmxtZmEsIHBmYWxjLT5haXMsIHBmYWxjLT5zZWMsIHBmYWxjLT5lcywgcGZhbGMtPnJhaSk7CisJcHJpbnRrKCIgICAgICAgIGJlYz0lZCwgIGZlYz0lZCwgIGN2Yz0lZCwgIGNlYz0lZCwgIGViYz0lZFxuIiwKKwkgICAgICAgcGZhbGMtPmJlYywgcGZhbGMtPmZlYywgcGZhbGMtPmN2YywgcGZhbGMtPmNlYywgcGZhbGMtPmViYyk7CisKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCIgICAgICAgIFNUQVRVUzogJXMgICVzICAlcyAgJXMgICVzICAlc1xuIiwKKwkgICAgICAgKHBmYWxjLT5yZWRfYWxhcm0gPyAiUkVEIiA6ICIiKSwKKwkgICAgICAgKHBmYWxjLT5ibHVlX2FsYXJtID8gIkJMVSIgOiAiIiksCisJICAgICAgIChwZmFsYy0+eWVsbG93X2FsYXJtID8gIllFTCIgOiAiIiksCisJICAgICAgIChwZmFsYy0+bG9zc19mYSA/ICJMRkEiIDogIiIpLAorCSAgICAgICAocGZhbGMtPmxvc3NfbWZhID8gIkxNRiIgOiAiIiksIChwZmFsYy0+cHJicyA/ICJQUkIiIDogIiIpKTsKKwlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKK30KKworaW50IGNwY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDEyOCkgfHwgKG5ld19tdHUgPiBQQzMwMF9ERUZfTVRVKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitpbnQgY3BjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlwYzMwMGNvbmZfdCBjb25mX2F1eDsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisJdm9pZCBfX3VzZXIgKmFyZyA9IGlmci0+aWZyX2RhdGE7CisJc3RydWN0IGlmX3NldHRpbmdzICpzZXR0aW5ncyA9ICZpZnItPmlmcl9zZXR0aW5nczsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DR1BDMzAwQ09ORjoKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCWlmIChjb25mLT5wcm90byAhPSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCWNvbmYtPnByb3RvID0gaGRsYy0+cHJvdG8uaWQ7CisJCQl9CisjZWxzZQorCQkJY29uZi0+cHJvdG8gPSBoZGxjLT5wcm90by5pZDsKKyNlbmRpZgorCQkJbWVtY3B5KCZjb25mX2F1eC5jb25mLCBjb25mLCBzaXplb2YocGMzMDBjaGNvbmZfdCkpOworCQkJbWVtY3B5KCZjb25mX2F1eC5odywgJmNhcmQtPmh3LCBzaXplb2YocGMzMDBod190KSk7CisJCQlpZiAoIWFyZyB8fCAKKwkJCQljb3B5X3RvX3VzZXIoYXJnLCAmY29uZl9hdXgsIHNpemVvZihwYzMwMGNvbmZfdCkpKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQljYXNlIFNJT0NTUEMzMDBDT05GOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZyB8fCAKKwkJCQljb3B5X2Zyb21fdXNlcigmY29uZl9hdXguY29uZiwgYXJnLCBzaXplb2YocGMzMDBjaGNvbmZfdCkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGNhcmQtPmh3LmNwbGRfaWQgPCAweDAyICYmCisJCQkgICAgY29uZl9hdXguY29uZi5mcl9tb2RlID09IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCQkJLyogQ1BMRF9JRCA8IDB4MDIgZG9lc24ndCBzdXBwb3J0IFVuZnJhbWVkIEUxICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQlpZiAoY29uZl9hdXguY29uZi5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCWlmIChjb25mLT5wcm90byAhPSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCQltZW1jcHkoY29uZiwgJmNvbmZfYXV4LmNvbmYsIHNpemVvZihwYzMwMGNoY29uZl90KSk7CisJCQkJCWNwY190dHlfaW5pdChkKTsJLyogaW5pdCBUVFkgZHJpdmVyICovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29uZl9hdXguY29uZi5wcm90byA9PSAweGZmZmYpIHsKKwkJCQkJaWYgKGNvbmYtPnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKXsgCisJCQkJCQkvKiBpZmRvd24gaW50ZXJmYWNlICovCisJCQkJCQljcGNfY2xvc2UoZGV2KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW1lbWNweShjb25mLCAmY29uZl9hdXguY29uZiwgc2l6ZW9mKHBjMzAwY2hjb25mX3QpKTsKKwkJCQkJaGRsYy0+cHJvdG8uaWQgPSBjb25mLT5wcm90bzsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJbWVtY3B5KGNvbmYsICZjb25mX2F1eC5jb25mLCBzaXplb2YocGMzMDBjaGNvbmZfdCkpOworCQkJaGRsYy0+cHJvdG8uaWQgPSBjb25mLT5wcm90bzsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCWNhc2UgU0lPQ0dQQzMwMFNUQVRVUzoKKwkJCWNwY19zY2Ffc3RhdHVzKGNhcmQsIGNoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFNJT0NHUEMzMDBGQUxDU1RBVFVTOgorCQkJY3BjX2ZhbGNfc3RhdHVzKGNhcmQsIGNoKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ0dQQzMwMFVUSUxTVEFUUzoKKwkJCXsKKwkJCQlpZiAoIWFyZykgewkvKiBjbGVhciBzdGF0aXN0aWNzICovCisJCQkJCW1lbXNldCgmaGRsYy0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQkJbWVtc2V0KCZjaGFuLT5mYWxjLCAwLCBzaXplb2YoZmFsY190KSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwYzMwMHN0YXRzX3QgcGMzMDBzdGF0czsKKworCQkJCQltZW1zZXQoJnBjMzAwc3RhdHMsIDAsIHNpemVvZihwYzMwMHN0YXRzX3QpKTsKKwkJCQkJcGMzMDBzdGF0cy5od190eXBlID0gY2FyZC0+aHcudHlwZTsKKwkJCQkJcGMzMDBzdGF0cy5saW5lX29uID0gY2FyZC0+Y2hhbltjaF0uZC5saW5lX29uOworCQkJCQlwYzMwMHN0YXRzLmxpbmVfb2ZmID0gY2FyZC0+Y2hhbltjaF0uZC5saW5lX29mZjsKKwkJCQkJbWVtY3B5KCZwYzMwMHN0YXRzLmdlbl9zdGF0cywgJmhkbGMtPnN0YXRzLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKQorCQkJCQkJbWVtY3B5KCZwYzMwMHN0YXRzLnRlX3N0YXRzLCZjaGFuLT5mYWxjLHNpemVvZihmYWxjX3QpKTsKKwkJCQkgICAgCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcGMzMDBzdGF0cywgc2l6ZW9mKHBjMzAwc3RhdHNfdCkpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCisJCWNhc2UgU0lPQ0dQQzMwMFVUSUxTVEFUVVM6CisJCQl7CisJCQkJc3RydWN0IHBjMzAwc3RhdHVzIHBjMzAwc3RhdHVzOworCisJCQkJcGMzMDBzdGF0dXMuaHdfdHlwZSA9IGNhcmQtPmh3LnR5cGU7CisJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLnN5bmMgPSBjaGFuLT5mYWxjLnN5bmM7CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5yZWRfYWxhcm0gPSBjaGFuLT5mYWxjLnJlZF9hbGFybTsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLmJsdWVfYWxhcm0gPSBjaGFuLT5mYWxjLmJsdWVfYWxhcm07CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5sb3NzX2ZhID0gY2hhbi0+ZmFsYy5sb3NzX2ZhOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMueWVsbG93X2FsYXJtID1jaGFuLT5mYWxjLnllbGxvd19hbGFybTsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLmxvc3NfbWZhID0gY2hhbi0+ZmFsYy5sb3NzX21mYTsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLnByYnMgPSBjaGFuLT5mYWxjLnByYnM7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGMzMDBzdGF0dXMuZ2VuX3N0YXR1cy5kY2QgPQorCQkJCQkJIShjcGNfcmVhZGIgKHNjYWJhc2UgKyBNX1JFRyhTVDMsIGNoKSkgJiBTVDNfRENEKTsKKwkJCQkJcGMzMDBzdGF0dXMuZ2VuX3N0YXR1cy5jdHMgPQorCQkJCQkJIShjcGNfcmVhZGIgKHNjYWJhc2UgKyBNX1JFRyhTVDMsIGNoKSkgJiBTVDNfQ1RTKTsKKwkJCQkJcGMzMDBzdGF0dXMuZ2VuX3N0YXR1cy5ydHMgPQorCQkJCQkJIShjcGNfcmVhZGIgKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSkgJiBDVExfUlRTKTsKKwkJCQkJcGMzMDBzdGF0dXMuZ2VuX3N0YXR1cy5kdHIgPQorCQkJCQkJIShjcGNfcmVhZGIgKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSkgJiBDVExfRFRSKTsKKwkJCQkJLyogVGhlcmUgaXMgbm8gRFNSIGluIEhENjQ1NzIgKi8KKwkJCQl9CisJCQkJaWYgKCFhcmcKKwkJCQkgICAgfHwgY29weV90b191c2VyKGFyZywgJnBjMzAwc3RhdHVzLCBzaXplb2YocGMzMDBzdGF0dXNfdCkpKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJY2FzZSBTSU9DU1BDMzAwVFJBQ0U6CisJCQkvKiBTZXRzL3Jlc2V0cyBhIHRyYWNlX2ZsYWcgZm9yIHRoZSByZXNwZWN0aXZlIGRldmljZSAqLworCQkJaWYgKCFhcmcgfHwgY29weV9mcm9tX3VzZXIoJmQtPnRyYWNlX29uLCBhcmcsc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NTUEMzMDBMT09QQkFDSzoKKwkJCXsKKwkJCQlzdHJ1Y3QgcGMzMDBsb29wYmFjayBwYzMwMGxvb3A7CisKKwkJCQkvKiBURSBib2FyZHMgb25seSAqLworCQkJCWlmIChjYXJkLT5ody50eXBlICE9IFBDMzAwX1RFKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCWlmICghYXJnIHx8IAorCQkJCQljb3B5X2Zyb21fdXNlcigmcGMzMDBsb29wLCBhcmcsIHNpemVvZihwYzMwMGxvb3BiYWNrX3QpKSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXN3aXRjaCAocGMzMDBsb29wLmxvb3BfdHlwZSkgeworCQkJCQljYXNlIFBDMzAwTE9DTE9PUDoJLyogVHVybiB0aGUgbG9jYWwgbG9vcCBvbi9vZmYgKi8KKwkJCQkJCWZhbGNfbG9jYWxfbG9vcChjYXJkLCBjaCwgcGMzMDBsb29wLmxvb3Bfb24pOworCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJY2FzZSBQQzMwMFJFTUxPT1A6CS8qIFR1cm4gdGhlIHJlbW90ZSBsb29wIG9uL29mZiAqLworCQkJCQkJZmFsY19yZW1vdGVfbG9vcChjYXJkLCBjaCwgcGMzMDBsb29wLmxvb3Bfb24pOworCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJY2FzZSBQQzMwMFBBWUxPQURMT09QOgkvKiBUdXJuIHRoZSBwYXlsb2FkIGxvb3Agb24vb2ZmICovCisJCQkJCQlmYWxjX3BheWxvYWRfbG9vcChjYXJkLCBjaCwgcGMzMDBsb29wLmxvb3Bfb24pOworCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJY2FzZSBQQzMwMEdFTkxPT1BVUDoJLyogR2VuZXJhdGUgbG9vcCBVUCAqLworCQkJCQkJaWYgKHBjMzAwbG9vcC5sb29wX29uKSB7CisJCQkJCQkJZmFsY19nZW5lcmF0ZV9sb29wX3VwX2NvZGUgKGNhcmQsIGNoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdHVybl9vZmZfeGx1KGNhcmQsIGNoKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiAwOworCisJCQkJCWNhc2UgUEMzMDBHRU5MT09QRE9XTjoJLyogR2VuZXJhdGUgbG9vcCBET1dOICovCisJCQkJCQlpZiAocGMzMDBsb29wLmxvb3Bfb24pIHsKKwkJCQkJCQlmYWxjX2dlbmVyYXRlX2xvb3BfZG93bl9jb2RlIChjYXJkLCBjaCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXR1cm5fb2ZmX3hsZChjYXJkLCBjaCk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gMDsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCisJCWNhc2UgU0lPQ1NQQzMwMFBBVFRFUk5URVNUOgorCQkJLyogVHVybiB0aGUgcGF0dGVybiB0ZXN0IG9uL29mZiBhbmQgc2hvdyB0aGUgZXJyb3JzIGNvdW50ZXIgKi8KKwkJCXsKKwkJCQlzdHJ1Y3QgcGMzMDBwYXR0ZXJudHN0IHBjMzAwcGF0cm50c3Q7CisKKwkJCQkvKiBURSBib2FyZHMgb25seSAqLworCQkJCWlmIChjYXJkLT5ody50eXBlICE9IFBDMzAwX1RFKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCWlmIChjYXJkLT5ody5jcGxkX2lkIDwgMHgwMikgeworCQkJCQkvKiBDUExEX0lEIDwgMHgwMiBkb2Vzbid0IHN1cHBvcnQgcGF0dGVybiB0ZXN0ICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCWlmICghYXJnIHx8IAorCQkJCQljb3B5X2Zyb21fdXNlcigmcGMzMDBwYXRybnRzdCxhcmcsc2l6ZW9mKHBjMzAwcGF0dGVybnRzdF90KSkpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAocGMzMDBwYXRybnRzdC5wYXRybnRzdF9vbiA9PSAyKSB7CisJCQkJCWlmIChjaGFuLT5mYWxjLnByYnMgPT0gMCkgeworCQkJCQkJZmFsY19wYXR0ZXJuX3Rlc3QoY2FyZCwgY2gsIDEpOworCQkJCQl9CisJCQkJCXBjMzAwcGF0cm50c3QubnVtX2Vycm9ycyA9CisJCQkJCQlmYWxjX3BhdHRlcm5fdGVzdF9lcnJvcihjYXJkLCBjaCk7CisJCQkJCWlmICghYXJnCisJCQkJCSAgICB8fCBjb3B5X3RvX3VzZXIoYXJnLCAmcGMzMDBwYXRybnRzdCwKKwkJCQkJCQkgICAgc2l6ZW9mIChwYzMwMHBhdHRlcm50c3RfdCkpKQorCQkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0gZWxzZSB7CisJCQkJCWZhbGNfcGF0dGVybl90ZXN0KGNhcmQsIGNoLCBwYzMwMHBhdHJudHN0LnBhdHJudHN0X29uKTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJY2FzZSBTSU9DV0FOREVWOgorCQkJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJCQkJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCQkJeworCQkJCQljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJCQkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBjb25mLT5tZWRpYTsKKwkJCQkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQkJCQkvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQkJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsKKwkJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCQkJfQorCQorCQkJCQlpZiAoY29weV90b191c2VyKHNldHRpbmdzLT5pZnNfaWZzdS5zeW5jLAorCQkJCQkJCSAmY29uZi0+cGh5c19zZXR0aW5ncywgc2l6ZSkpIHsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWNhc2UgSUZfSUZBQ0VfVjM1OgorCQkJCWNhc2UgSUZfSUZBQ0VfVjI0OgorCQkJCWNhc2UgSUZfSUZBQ0VfWDIxOgorCQkJCXsKKwkJCQkJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCisJCQkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkJfQorCQkJCQkvKiBpbmNvcnJlY3QgZGF0YSBsZW4/ICovCisJCQkJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplICE9IHNpemUpIHsKKwkJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCQkJfQorCisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZi0+cGh5c19zZXR0aW5ncywgCisJCQkJCQkJICAgc2V0dGluZ3MtPmlmc19pZnN1LnN5bmMsIHNpemUpKSB7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCisJCQkJCWlmIChjb25mLT5waHlzX3NldHRpbmdzLmxvb3BiYWNrKSB7CisJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSwKKwkJCQkJCQljcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpKSB8IAorCQkJCQkJCU1EMl9MT09QX01JUik7CisJCQkJCX0KKwkJCQkJY29uZi0+bWVkaWEgPSBpZnItPmlmcl9zZXR0aW5ncy50eXBlOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQljYXNlIElGX0lGQUNFX1QxOgorCQkJCWNhc2UgSUZfSUZBQ0VfRTE6CisJCQkJeworCQkJCQljb25zdCBzaXplX3QgdGVfc2l6ZSA9IHNpemVvZih0ZTFfc2V0dGluZ3MpOworCQkJCQljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisKKwkJCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQl9CisKKwkJCQkJLyogaW5jb3JyZWN0IGRhdGEgbGVuPyAqLworCQkJCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSAhPSB0ZV9zaXplKSB7CisJCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQkJCX0KKworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmYtPnBoeXNfc2V0dGluZ3MsIAorCQkJCQkJCSAgIHNldHRpbmdzLT5pZnNfaWZzdS50ZTEsIHNpemUpKSB7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfS8qIElnbm9yaW5nIEhETEMgc2xvdF9tYXAgZm9yIGEgd2hpbGUgKi8KKwkJCQkJCisJCQkJCWlmIChjb25mLT5waHlzX3NldHRpbmdzLmxvb3BiYWNrKSB7CisJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSwKKwkJCQkJCQljcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpKSB8IAorCQkJCQkJCU1EMl9MT09QX01JUik7CisJCQkJCX0KKwkJCQkJY29uZi0+bWVkaWEgPSBpZnItPmlmcl9zZXR0aW5ncy50eXBlOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjcGNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGhkbGNfc3RhdHMoZGV2KTsKK30KKworc3RhdGljIGludCBjbG9ja19yYXRlX2NhbGModWNsb25nIHJhdGUsIHVjbG9uZyBjbG9jaywgaW50ICpicl9pbykKK3sKKwlpbnQgYnIsIHRjOworCWludCBicl9wd3IsIGVycm9yOworCisJaWYgKHJhdGUgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCWZvciAoYnIgPSAwLCBicl9wd3IgPSAxOyBiciA8PSA5OyBicisrLCBicl9wd3IgPDw9IDEpIHsKKwkJaWYgKCh0YyA9IGNsb2NrIC8gYnJfcHdyIC8gcmF0ZSkgPD0gMHhmZikgeworCQkJKmJyX2lvID0gYnI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0YyA8PSAweGZmKSB7CisJCWVycm9yID0gKChyYXRlIC0gKGNsb2NrIC8gYnJfcHdyIC8gcmF0ZSkpIC8gcmF0ZSkgKiAxMDAwOworCQkvKiBFcnJvcnMgYmlnZ2VyIHRoYW4gKy8tIDElIHdvbid0IGJlIHRvbGVyYXRlZCAqLworCQlpZiAoZXJyb3IgPCAtMTAgfHwgZXJyb3IgPiAxMCkKKwkJCXJldHVybiAoLTEpOworCQllbHNlCisJCQlyZXR1cm4gKHRjKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKC0xKTsKKwl9Cit9CisKK2ludCBjaF9jb25maWcocGMzMDBkZXZfdCAqIGQpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBseGJhc2UgPSBjYXJkLT5ody5wbHhiYXNlOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisJdWNsb25nIGNsa3JhdGUgPSBjaGFuLT5jb25mLnBoeXNfc2V0dGluZ3MuY2xvY2tfcmF0ZTsKKwl1Y2xvbmcgY2xrdHlwZSA9IGNoYW4tPmNvbmYucGh5c19zZXR0aW5ncy5jbG9ja190eXBlOworCXVjc2hvcnQgZW5jb2RpbmcgPSBjaGFuLT5jb25mLnByb3RvX3NldHRpbmdzLmVuY29kaW5nOworCXVjc2hvcnQgcGFyaXR5ID0gY2hhbi0+Y29uZi5wcm90b19zZXR0aW5ncy5wYXJpdHk7ICAgCisJaW50IHRtYywgYnI7CisJdWNjaGFyIG1kMCwgbWQyOworICAgIAorCS8qIFJlc2V0IHRoZSBjaGFubmVsICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9DSF9SU1QpOworCisJLyogQ29uZmlndXJlIHRoZSBTQ0EgcmVnaXN0ZXJzICovCisJc3dpdGNoIChwYXJpdHkpIHsKKwkJY2FzZSBQQVJJVFlfTk9ORToKKwkJCW1kMCA9IE1EMF9CSVRfU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFBBUklUWV9DUkMxNl9QUjA6CisJCQltZDAgPSBNRDBfQ1JDMTZfMHxNRDBfQ1JDQzB8TUQwX0JJVF9TWU5DOworCQkJYnJlYWs7CisJCWNhc2UgUEFSSVRZX0NSQzE2X1BSMToKKwkJCW1kMCA9IE1EMF9DUkMxNl8xfE1EMF9DUkNDMHxNRDBfQklUX1NZTkM7CisJCQlicmVhazsKKwkJY2FzZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUOgorCQkJbWQwID0gTUQwX0NSQzMyfE1EMF9DUkNDMHxNRDBfQklUX1NZTkM7CisJCQlicmVhazsKKwkJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUOgorCQlkZWZhdWx0OgorCQkJbWQwID0gTUQwX0NSQ19DQ0lUVHxNRDBfQ1JDQzB8TUQwX0JJVF9TWU5DOworCQkJYnJlYWs7CisJfQorCXN3aXRjaCAoZW5jb2RpbmcpIHsKKwkJY2FzZSBFTkNPRElOR19OUlpJOgorCQkJbWQyID0gTUQyX0ZfRFVQTEVYfE1EMl9BRFBMTF9YOHxNRDJfTlJaSTsKKwkJCWJyZWFrOworCQljYXNlIEVOQ09ESU5HX0ZNX01BUks6CS8qIEZNMSAqLworCQkJbWQyID0gTUQyX0ZfRFVQTEVYfE1EMl9BRFBMTF9YOHxNRDJfRk18TUQyX0ZNMTsKKwkJCWJyZWFrOworCQljYXNlIEVOQ09ESU5HX0ZNX1NQQUNFOgkvKiBGTTAgKi8KKwkJCW1kMiA9IE1EMl9GX0RVUExFWHxNRDJfQURQTExfWDh8TUQyX0ZNfE1EMl9GTTA7CisJCQlicmVhazsKKwkJY2FzZSBFTkNPRElOR19NQU5DSEVTVEVSOiAvKiBJdCdzIG5vdCB3b3JraW5nLi4uICovCisJCQltZDIgPSBNRDJfRl9EVVBMRVh8TUQyX0FEUExMX1g4fE1EMl9GTXxNRDJfTUFOQ0g7CisJCQlicmVhazsKKwkJY2FzZSBFTkNPRElOR19OUlo6CisJCWRlZmF1bHQ6CisJCQltZDIgPSBNRDJfRl9EVVBMRVh8TUQyX0FEUExMX1g4fE1EMl9OUlo7CisJCQlicmVhazsKKwl9CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoTUQwLCBjaCksIG1kMCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoTUQxLCBjaCksIDApOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpLCBtZDIpOworIAljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhJREwsIGNoKSwgMHg3ZSk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCksIENUTF9VUlNLUCB8IENUTF9JRExDKTsKKworCS8qIENvbmZpZ3VyZSBIVyBtZWRpYSAqLworCXN3aXRjaCAoY2FyZC0+aHcudHlwZSkgeworCQljYXNlIFBDMzAwX1JTVjoKKwkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9WMzUpIHsKKwkJCQljcGNfd3JpdGVsKChwbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSwKKwkJCQkJICAgY3BjX3JlYWRsKHBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpIHwgUEMzMDBfQ0hNRURJQV9NQVNLKGNoKSk7CisJCQl9IGVsc2UgeworCQkJCWNwY193cml0ZWwoKHBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpLAorCQkJCQkgICBjcGNfcmVhZGwocGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZykgJiB+UEMzMDBfQ0hNRURJQV9NQVNLKGNoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX1gyMToKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfVEU6CisJCQl0ZV9jb25maWcoY2FyZCwgY2gpOworCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisJCWNhc2UgUEMzMDBfUlNWOgorCQljYXNlIFBDMzAwX1gyMToKKwkJCWlmIChjbGt0eXBlID09IENMT0NLX0lOVCB8fCBjbGt0eXBlID09IENMT0NLX1RYSU5UKSB7CisJCQkJLyogQ2FsY3VsYXRlIHRoZSBjbGtyYXRlIHBhcmFtZXRlcnMgKi8KKwkJCQl0bWMgPSBjbG9ja19yYXRlX2NhbGMoY2xrcmF0ZSwgY2FyZC0+aHcuY2xvY2ssICZicik7CisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DVCwgY2gpLCB0bWMpOworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpLAorCQkJCQkgICAoVFhTX0RUUlhDIHwgVFhTX0lCUkcgfCBicikpOworCQkJCWlmIChjbGt0eXBlID09IENMT0NLX0lOVCkgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNSLCBjaCksIHRtYyk7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJYUywgY2gpLCAKKwkJCQkJCSAgIChSWFNfSUJSRyB8IGJyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DUiwgY2gpLCAxKTsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUlhTLCBjaCksIDApOworCQkJCX0KKwkgICAgCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfWDIxKSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEdQTywgY2gpLCAxKTsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCksIEVYU19URVMxIHwgRVhTX1JFUzEpOworCQkJCX0gZWxzZSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpLCBFWFNfVEVTMSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNULCBjaCksIDEpOworCQkJCWlmIChjbGt0eXBlID09IENMT0NLX0VYVCkgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSwgCisJCQkJCQkgICBUWFNfRFRSWEMpOworCQkJCX0gZWxzZSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpLCAKKwkJCQkJCSAgIFRYU19EVFJYQ3xUWFNfUkNMSyk7CisJCQkJfQorCSAgICAJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNSLCBjaCksIDEpOworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJYUywgY2gpLCAwKTsKKwkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9YMjEpIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoR1BPLCBjaCksIDApOworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSwgRVhTX1RFUzEgfCBFWFNfUkVTMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCksIEVYU19URVMxKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX1RFOgorCQkJLyogU0NBIGFsd2F5cyByZWNlaXZlcyBjbG9jayBmcm9tIHRoZSBGQUxDIGNoaXAgKi8KKwkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1QsIGNoKSwgMSk7CisJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSwgMCk7CisJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNSLCBjaCksIDEpOworCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUlhTLCBjaCksIDApOworCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCksIDApOworCQkJYnJlYWs7CisJfQorCisJLyogRW5hYmxlIEludGVycnVwdHMgKi8KKwljcGNfd3JpdGVsKHNjYWJhc2UgKyBJRVIwLAorCQkgICBjcGNfcmVhZGwoc2NhYmFzZSArIElFUjApIHwKKwkJICAgSVIwX00oSVIwX1JYSU5UQSwgY2gpIHwKKwkJICAgSVIwX0RSWChJUjBfRUZUIHwgSVIwX0RNSUEgfCBJUjBfRE1JQiwgY2gpIHwKKwkJICAgSVIwX0RUWChJUjBfRUZUIHwgSVIwX0RNSUEgfCBJUjBfRE1JQiwgY2gpKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhJRTAsIGNoKSwKKwkJICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBNX1JFRyhJRTAsIGNoKSkgfCBJRTBfUlhJTlRBKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhJRTEsIGNoKSwKKwkJICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBNX1JFRyhJRTEsIGNoKSkgfCBJRTFfQ0RDRCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ4X2NvbmZpZyhwYzMwMGRldl90ICogZCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1JYKGNoKSwgMCk7CisKKwkvKiBHZW5lcmFsIFJYIHNldHRpbmdzICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUlJDLCBjaCksIDApOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJOUiwgY2gpLCAxNik7CisKKwkvKiBFbmFibGUgcmVjZXB0aW9uICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9SWF9DUkNfSU5JVCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9SWF9FTkEpOworCisJLyogSW5pdGlhbGl6ZSBETUEgc3R1ZmYgKi8KKwljaGFuLT5yeF9maXJzdF9iZCA9IDA7CisJY2hhbi0+cnhfbGFzdF9iZCA9IE5fRE1BX1JYX0JVRiAtIDE7CisJcnhfZG1hX2J1Zl9pbml0KGNhcmQsIGNoKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEQ1JfUlgoY2gpLCBEQ1JfRkNUX0NMUik7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRE1SX1JYKGNoKSwgKERNUl9UTU9EIHwgRE1SX05GKSk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRElSX1JYKGNoKSwgKERJUl9FT00gfCBESVJfQk9GKSk7CisKKwkvKiBTdGFydCBETUEgKi8KKwlyeF9kbWFfc3RhcnQoY2FyZCwgY2gpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0eF9jb25maWcocGMzMDBkZXZfdCAqIGQpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKworCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9UWChjaCksIDApOworCisJLyogR2VuZXJhbCBUWCBzZXR0aW5ncyAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRSQzAsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVEZTLCBjaCksIDMyKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTlIwLCBjaCksIDIwKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTlIxLCBjaCksIDQ4KTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUQ1IsIGNoKSwgOCk7CisKKwkvKiBFbmFibGUgdHJhbnNtaXNzaW9uICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9UWF9DUkNfSU5JVCk7CisKKwkvKiBJbml0aWFsaXplIERNQSBzdHVmZiAqLworCWNoYW4tPnR4X2ZpcnN0X2JkID0gMDsKKwljaGFuLT50eF9uZXh0X2JkID0gMDsKKwl0eF9kbWFfYnVmX2luaXQoY2FyZCwgY2gpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERDUl9UWChjaCksIERDUl9GQ1RfQ0xSKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBETVJfVFgoY2gpLCAoRE1SX1RNT0QgfCBETVJfTkYpKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBESVJfVFgoY2gpLCAoRElSX0VPTSB8IERJUl9CT0YgfCBESVJfVURSRikpOworCWNwY193cml0ZWwoc2NhYmFzZSArIERUWF9SRUcoQ0RBTCwgY2gpLCBUWF9CRF9BRERSKGNoLCBjaGFuLT50eF9maXJzdF9iZCkpOworCWNwY193cml0ZWwoc2NhYmFzZSArIERUWF9SRUcoRURBTCwgY2gpLCBUWF9CRF9BRERSKGNoLCBjaGFuLT50eF9uZXh0X2JkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcGNfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKilkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKWNoYW4tPmNhcmQ7CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopJmNoYW4tPmNvbmY7CisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaICYmIGVuY29kaW5nICE9IEVOQ09ESU5HX05SWkkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiAmJiBlbmNvZGluZyAhPSBFTkNPRElOR19OUlpJICYmCisJCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9NQVJLICYmIGVuY29kaW5nICE9IEVOQ09ESU5HX0ZNX1NQQUNFKSB7CisJCQkvKiBEcml2ZXIgZG9lc24ndCBzdXBwb3J0IEVOQ09ESU5HX01BTkNIRVNURVIgeWV0ICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChwYXJpdHkgIT0gUEFSSVRZX05PTkUgJiYgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjAgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjEgJiYgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29uZi0+cHJvdG9fc2V0dGluZ3MuZW5jb2RpbmcgPSBlbmNvZGluZzsKKwljb25mLT5wcm90b19zZXR0aW5ncy5wYXJpdHkgPSBwYXJpdHk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3BjX29wZW5jaChwYzMwMGRldl90ICogZCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCisJY2hfY29uZmlnKGQpOworCisJcnhfY29uZmlnKGQpOworCisJdHhfY29uZmlnKGQpOworCisJLyogQXNzZXJ0IFJUUyBhbmQgRFRSICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCksCisJCSAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCkpICYgfihDVExfUlRTIHwgQ1RMX0RUUikpOworfQorCit2b2lkIGNwY19jbG9zZWNoKHBjMzAwZGV2X3QgKiBkKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfQ0hfUlNUKTsKKwlyeF9kbWFfc3RvcChjYXJkLCBjaCk7CisJdHhfZG1hX3N0b3AoY2FyZCwgY2gpOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJbWVtc2V0KHBmYWxjLCAwLCBzaXplb2YoZmFsY190KSk7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCSAgIH4oKENQTERfUkVHMl9GQUxDX1RYX0NMSyB8IENQTERfUkVHMl9GQUxDX1JYX0NMSyB8CisJCQkgICAgICBDUExEX1JFRzJfRkFMQ19MRUQyKSA8PCAoMiAqIGNoKSkpOworCQkvKiBSZXNldCB0aGUgRkFMQyBjaGlwICovCisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpIHwKKwkJCSAgIChDUExEX1JFRzFfRkFMQ19SRVNFVCA8PCAoMiAqIGNoKSkpOworCQl1ZGVsYXkoMTAwMDApOworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSAmCisJCQkgICB+KENQTERfUkVHMV9GQUxDX1JFU0VUIDw8ICgyICogY2gpKSk7CisJfQorfQorCitpbnQgY3BjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCByZXN1bHQ7CisKKyNpZmRlZglQQzMwMF9ERUJVR19PVEhFUgorCXByaW50aygicGMzMDA6IGNwY19vcGVuIik7CisjZW5kaWYKKworCWlmIChoZGxjLT5wcm90by5pZCA9PSBJRl9QUk9UT19QUFApIHsKKwkJZC0+aWZfcHRyID0gJmhkbGMtPnN0YXRlLnBwcC5wcHBkZXY7CisJfQorCisJcmVzdWx0ID0gaGRsY19vcGVuKGRldik7CisJaWYgKGhkbGMtPnByb3RvLmlkID09IElGX1BST1RPX1BQUCkgeworCQlkZXYtPnByaXYgPSBkOworCX0KKwlpZiAocmVzdWx0KSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJc3ByaW50ZihpZnIuaWZyX25hbWUsICIlcyIsIGRldi0+bmFtZSk7CisJY3BjX29wZW5jaChkKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitpbnQgY3BjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZglQQzMwMF9ERUJVR19PVEhFUgorCXByaW50aygicGMzMDA6IGNwY19jbG9zZSIpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJY3BjX2Nsb3NlY2goZCk7CisJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7CisKKwloZGxjX2Nsb3NlKGRldik7CisJaWYgKGhkbGMtPnByb3RvLmlkID09IElGX1BST1RPX1BQUCkgeworCQlkLT5pZl9wdHIgPSBOVUxMOworCX0KKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwlpZiAoY2hhbi0+Y29uZi5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQljcGNfdHR5X3VucmVnaXN0ZXJfc2VydmljZShkKTsKKwkJY2hhbi0+Y29uZi5wcm90byA9IDB4ZmZmZjsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWNsb25nIGRldGVjdF9yYW0ocGMzMDBfdCAqIGNhcmQpCit7CisJdWNsb25nIGk7CisJdWNjaGFyIGRhdGE7CisJdm9pZCBfX2lvbWVtICpyYW1iYXNlID0gY2FyZC0+aHcucmFtYmFzZTsKKworCWNhcmQtPmh3LnJhbXNpemUgPSBQQzMwMF9SQU1TSVpFOworCS8qIExldCdzIGZpbmQgb3V0IGhvdyBtdWNoIFJBTSBpcyBwcmVzZW50IG9uIHRoaXMgYm9hcmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+aHcucmFtc2l6ZTsgaSsrKSB7CisJCWRhdGEgPSAodWNjaGFyKSAoaSAmIDB4ZmYpOworCQljcGNfd3JpdGViKHJhbWJhc2UgKyBpLCBkYXRhKTsKKwkJaWYgKGNwY19yZWFkYihyYW1iYXNlICsgaSkgIT0gZGF0YSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChpKTsKK30KKworc3RhdGljIHZvaWQgcGx4X2luaXQocGMzMDBfdCAqIGNhcmQpCit7CisJc3RydWN0IFJVTlRJTUVfOTA1MCBfX2lvbWVtICpwbHhfY3RsID0gY2FyZC0+aHcucGx4YmFzZTsKKworCS8qIFJlc2V0IFBMWCAqLworCWNwY193cml0ZWwoJnBseF9jdGwtPmluaXRfY3RybCwKKwkJICAgY3BjX3JlYWRsKCZwbHhfY3RsLT5pbml0X2N0cmwpIHwgMHg0MDAwMDAwMCk7CisJdWRlbGF5KDEwMDAwTCk7CisJY3BjX3dyaXRlbCgmcGx4X2N0bC0+aW5pdF9jdHJsLAorCQkgICBjcGNfcmVhZGwoJnBseF9jdGwtPmluaXRfY3RybCkgJiB+MHg0MDAwMDAwMCk7CisKKwkvKiBSZWxvYWQgQ29uZmlnLiBSZWdpc3RlcnMgZnJvbSBFRVBST00gKi8KKwljcGNfd3JpdGVsKCZwbHhfY3RsLT5pbml0X2N0cmwsCisJCSAgIGNwY19yZWFkbCgmcGx4X2N0bC0+aW5pdF9jdHJsKSB8IDB4MjAwMDAwMDApOworCXVkZWxheSgxMDAwMEwpOworCWNwY193cml0ZWwoJnBseF9jdGwtPmluaXRfY3RybCwKKwkJICAgY3BjX3JlYWRsKCZwbHhfY3RsLT5pbml0X2N0cmwpICYgfjB4MjAwMDAwMDApOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3ZlcnNpb24odm9pZCkKK3sKKwljaGFyICpyY3N2ZXJzLCAqcmNzZGF0ZSwgKnRtcDsKKworCXJjc3ZlcnMgPSBzdHJjaHIocmNzaWQsICcgJyk7CisJcmNzdmVycysrOworCXRtcCA9IHN0cmNocihyY3N2ZXJzLCAnICcpOworCSp0bXArKyA9ICdcMCc7CisJcmNzZGF0ZSA9IHN0cmNocih0bXAsICcgJyk7CisJcmNzZGF0ZSsrOworCXRtcCA9IHN0cnJjaHIocmNzZGF0ZSwgJyAnKTsKKwkqdG1wID0gJ1wwJzsKKwlwcmludGsoS0VSTl9JTkZPICJDeWNsYWRlcy1QQzMwMCBkcml2ZXIgJXMgJXMgKGJ1aWx0ICVzICVzKVxuIiwgCisJCXJjc3ZlcnMsIHJjc2RhdGUsIF9fREFURV9fLCBfX1RJTUVfXyk7Cit9CQkJCS8qIHNob3dfdmVyc2lvbiAqLworCitzdGF0aWMgdm9pZCBjcGNfaW5pdF9jYXJkKHBjMzAwX3QgKiBjYXJkKQoreworCWludCBpLCBkZXZjb3VudCA9IDA7CisJc3RhdGljIGludCBib2FyZF9uYnIgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBicmlkZ2UgKi8KKwlwbHhfaW5pdChjYXJkKTsKKwljcGNfd3JpdGV3KGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5pbnRjdGxfcmVnLAorCQkgICBjcGNfcmVhZHcoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmludGN0bF9yZWcpIHwgMHgwMDQwKTsKKworI2lmZGVmIFVTRV9QQ0lfQ0xPQ0sKKwkvKiBTZXQgYm9hcmQgY2xvY2sgdG8gUENJIGNsb2NrICovCisJY3BjX3dyaXRlbChjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnLAorCQkgICBjcGNfcmVhZGwoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZykgfCAweDAwMDAwMDA0VUwpOworCWNhcmQtPmh3LmNsb2NrID0gUEMzMDBfUENJX0NMT0NLOworI2Vsc2UKKwkvKiBTZXQgYm9hcmQgY2xvY2sgdG8gaW50ZXJuYWwgb3NjaWxsYXRvciBjbG9jayAqLworCWNwY193cml0ZWwoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZywKKwkJICAgY3BjX3JlYWRsKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpICYgfjB4MDAwMDAwMDRVTCk7CisJY2FyZC0+aHcuY2xvY2sgPSBQQzMwMF9PU0NfQ0xPQ0s7CisjZW5kaWYKKworCS8qIERldGVjdCBhY3R1YWwgb24tYm9hcmQgUkFNIHNpemUgKi8KKwljYXJkLT5ody5yYW1zaXplID0gZGV0ZWN0X3JhbShjYXJkKTsKKworCS8qIFNldCBHbG9iYWwgU0NBLUlJIHJlZ2lzdGVycyAqLworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIFBDUiwgUENSX1BSMik7CisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgQlRDUiwgMHgxMCk7CisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgV0NSTCwgMCk7CisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgRE1FUiwgMHg4MCk7CisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQl1Y2NoYXIgcmVnMTsKKworCQkvKiBDaGVjayBDUExEIHZlcnNpb24gKi8KKwkJcmVnMSA9IGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIENQTERfUkVHMSk7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBDUExEX1JFRzEsIChyZWcxICsgMHg1YSkpOworCQlpZiAoY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgQ1BMRF9SRUcxKSA9PSByZWcxKSB7CisJCQkvKiBOZXcgQ1BMRCAqLworCQkJY2FyZC0+aHcuY3BsZF9pZCA9IGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIENQTERfSURfUkVHKTsKKwkJCWNhcmQtPmh3LmNwbGRfcmVnMSA9IENQTERfVjJfUkVHMTsKKwkJCWNhcmQtPmh3LmNwbGRfcmVnMiA9IENQTERfVjJfUkVHMjsKKwkJfSBlbHNlIHsKKwkJCS8qIG9sZCBDUExEICovCisJCQljYXJkLT5ody5jcGxkX2lkID0gMDsKKwkJCWNhcmQtPmh3LmNwbGRfcmVnMSA9IENQTERfUkVHMTsKKwkJCWNhcmQtPmh3LmNwbGRfcmVnMiA9IENQTERfUkVHMjsKKwkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBDUExEX1JFRzEsIHJlZzEpOworCQl9CisKKwkJLyogRW5hYmxlIHRoZSBib2FyZCdzIGdsb2JhbCBjbG9jayAqLworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSB8CisJCQkgICBDUExEX1JFRzFfR0xPQkFMX0NMSyk7CisKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+aHcubmNoYW47IGkrKykgeworCQlwYzMwMGNoX3QgKmNoYW4gPSAmY2FyZC0+Y2hhbltpXTsKKwkJcGMzMDBkZXZfdCAqZCA9ICZjaGFuLT5kOworCQloZGxjX2RldmljZSAqaGRsYzsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQljaGFuLT5jYXJkID0gY2FyZDsKKwkJY2hhbi0+Y2hhbm5lbCA9IGk7CisJCWNoYW4tPmNvbmYucGh5c19zZXR0aW5ncy5jbG9ja19yYXRlID0gMDsKKwkJY2hhbi0+Y29uZi5waHlzX3NldHRpbmdzLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7CisJCWNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MuZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisJCWNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MucGFyaXR5ID0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDsKKwkJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisJCQljYXNlIFBDMzAwX1RFOgorCQkJCWNoYW4tPmNvbmYubWVkaWEgPSBJRl9JRkFDRV9UMTsKKwkJCQljaGFuLT5jb25mLmxjb2RlID0gUEMzMDBfTENfQjhaUzsKKwkJCQljaGFuLT5jb25mLmZyX21vZGUgPSBQQzMwMF9GUl9FU0Y7CisJCQkJY2hhbi0+Y29uZi5sYm8gPSBQQzMwMF9MQk9fMF9EQjsKKwkJCQljaGFuLT5jb25mLnJ4X3NlbnMgPSBQQzMwMF9SWF9TRU5TX1NIOworCQkJCWNoYW4tPmNvbmYudHNsb3RfYml0bWFwID0gMHhmZmZmZmZmZlVMOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDMzAwX1gyMToKKwkJCQljaGFuLT5jb25mLm1lZGlhID0gSUZfSUZBQ0VfWDIxOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDMzAwX1JTVjoKKwkJCWRlZmF1bHQ6CisJCQkJY2hhbi0+Y29uZi5tZWRpYSA9IElGX0lGQUNFX1YzNTsKKwkJCQlicmVhazsKKwkJfQorCQljaGFuLT5jb25mLnByb3RvID0gSUZfUFJPVE9fUFBQOworCQljaGFuLT50eF9maXJzdF9iZCA9IDA7CisJCWNoYW4tPnR4X25leHRfYmQgPSAwOworCQljaGFuLT5yeF9maXJzdF9iZCA9IDA7CisJCWNoYW4tPnJ4X2xhc3RfYmQgPSBOX0RNQV9SWF9CVUYgLSAxOworCQljaGFuLT5uZnJlZV90eF9iZCA9IE5fRE1BX1RYX0JVRjsKKworCQlkLT5jaGFuID0gY2hhbjsKKwkJZC0+dHhfc2tiID0gTlVMTDsKKwkJZC0+dHJhY2Vfb24gPSAwOworCQlkLT5saW5lX29uID0gMDsKKwkJZC0+bGluZV9vZmYgPSAwOworCisJCWRldiA9IGFsbG9jX2hkbGNkZXYoTlVMTCk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCQloZGxjLT54bWl0ID0gY3BjX3F1ZXVlX3htaXQ7CisJCWhkbGMtPmF0dGFjaCA9IGNwY19hdHRhY2g7CisJCWQtPmRldiA9IGRldjsKKwkJZGV2LT5tZW1fc3RhcnQgPSBjYXJkLT5ody5yYW1waHlzOworCQlkZXYtPm1lbV9lbmQgPSBjYXJkLT5ody5yYW1waHlzICsgY2FyZC0+aHcucmFtc2l6ZSAtIDE7CisJCWRldi0+aXJxID0gY2FyZC0+aHcuaXJxOworCQlkZXYtPmluaXQgPSBOVUxMOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFBDMzAwX1RYX1FVRVVFX0xFTjsKKwkJZGV2LT5tdHUgPSBQQzMwMF9ERUZfTVRVOworCisJCWRldi0+b3BlbiA9IGNwY19vcGVuOworCQlkZXYtPnN0b3AgPSBjcGNfY2xvc2U7CisJCWRldi0+dHhfdGltZW91dCA9IGNwY190eF90aW1lb3V0OworCQlkZXYtPndhdGNoZG9nX3RpbWVvID0gUEMzMDBfVFhfVElNRU9VVDsKKwkJZGV2LT5nZXRfc3RhdHMgPSBjcGNfZ2V0X3N0YXRzOworCQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IE5VTEw7CisJCWRldi0+c2V0X21hY19hZGRyZXNzID0gTlVMTDsKKwkJZGV2LT5jaGFuZ2VfbXR1ID0gY3BjX2NoYW5nZV9tdHU7CisJCWRldi0+ZG9faW9jdGwgPSBjcGNfaW9jdGw7CisKKwkJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikgPT0gMCkgeworCQkJZGV2LT5wcml2ID0gZDsJLyogV2UgbmVlZCAncHJpdicsIGhkbGMgZG9lc24ndCAqLworCQkJcHJpbnRrKCIlczogQ3ljbGFkZXMtUEMzMDAvIiwgZGV2LT5uYW1lKTsKKwkJCXN3aXRjaCAoY2FyZC0+aHcudHlwZSkgeworCQkJCWNhc2UgUEMzMDBfVEU6CisJCQkJCWlmIChjYXJkLT5ody5idXMgPT0gUEMzMDBfUE1DKSB7CisJCQkJCQlwcmludGsoIlRFLU0iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50aygiVEUgICIpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBQQzMwMF9YMjE6CisJCQkJCXByaW50aygiWDIxICIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUEMzMDBfUlNWOgorCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50aygiUlNWICIpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ayAoIiAjJWQsICVkS0Igb2YgUkFNIGF0IDB4JTA4eCwgSVJRJWQsIGNoYW5uZWwgJWQuXG4iLAorCQkJCSBib2FyZF9uYnIsIGNhcmQtPmh3LnJhbXNpemUgLyAxMDI0LAorCQkJCSBjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5pcnEsIGkgKyAxKTsKKwkJCWRldmNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKCJEZXYlZCBvbiBjYXJkKDB4JTA4eCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBpL2YgbmFtZS5cbiIsCisJCQkJIGkgKyAxLCBjYXJkLT5ody5yYW1waHlzKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+Y2FyZF9sb2NrKTsKKworCWJvYXJkX25icisrOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorY3BjX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CisJdWNjaGFyIGNwY19yZXZfaWQ7CisJaW50IGVyciA9IDAsIGVlcHJvbV9vdXRkYXRlZCA9IDA7CisJdWNzaG9ydCBkZXZpY2VfaWQ7CisJcGMzMDBfdCAqY2FyZDsKKworCWlmIChmaXJzdF90aW1lKSB7CisJCWZpcnN0X3RpbWUgPSAwOworCQlzaG93X3ZlcnNpb24oKTsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJY3BjX3R0eV9yZXNldF92YXIoKTsKKyNlbmRpZgorCX0KKworCWNhcmQgPSAocGMzMDBfdCAqKSBrbWFsbG9jKHNpemVvZihwYzMwMF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwOGx4LCAiCisJCSAgICAgICAiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBjYXJkIHN0cnVjdHVyZS5cbiIsCisJCSAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMykpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihwYzMwMF90KSk7CisKKwkvKiByZWFkIFBDSSBjb25maWd1cmF0aW9uIGFyZWEgKi8KKwlkZXZpY2VfaWQgPSBlbnQtPmRldmljZTsKKwljYXJkLT5ody5pcnEgPSBwZGV2LT5pcnE7CisJY2FyZC0+aHcuaW9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWNhcmQtPmh3Lmlvc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisJY2FyZC0+aHcuc2NhcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwljYXJkLT5ody5zY2FzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKTsKKwljYXJkLT5ody5yYW1waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCWNhcmQtPmh3LmFsbG9jX3JhbXNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpOworCWNhcmQtPmh3LmZhbGNwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOworCWNhcmQtPmh3LmZhbGNzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCA0KTsKKwljYXJkLT5ody5wbHhwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpOworCWNhcmQtPmh3LnBseHNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNwY19yZXZfaWQpOworCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8xOgorCQkJY2FyZC0+aHcubmNoYW4gPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8yOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8yOgorCQlkZWZhdWx0OgorCQkJY2FyZC0+aHcubmNoYW4gPSBQQzMwMF9NQVhDSEFOOworCQkJYnJlYWs7CisJfQorI2lmZGVmIFBDMzAwX0RFQlVHX1BDSQorCXByaW50aygiY3BjIChidXM9MHgwJXgscGNpX2lkPTB4JXgsIiwgcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKwlwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsIGNwY19yZXZfaWQsIGNhcmQtPmh3LmlycSk7CisJcHJpbnRrKCJjcGM6Zm91bmQgIHJhbWFkZHI9MHglMDhseCBwbHhhZGRyPTB4JTA4bHggIgorCSAgICAgICAiY3RsYWRkcj0weCUwOGx4IGZhbGNhZGRyPTB4JTA4bHhcbiIsCisJICAgICAgIGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LnBseHBoeXMsIGNhcmQtPmh3LnNjYXBoeXMsCisJICAgICAgIGNhcmQtPmh3LmZhbGNwaHlzKTsKKyNlbmRpZgorCS8qIEFsdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIEkvTyByZWdpb24sIHdlIHNob3VsZAorCSAqIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKKwkgKiB3aXRoIG90aGVyIGRyaXZlcnMgYWNjZXNzaW5nIGl0LiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oY2FyZC0+aHcuaW9waHlzLCBjYXJkLT5ody5pb3NpemUsICJQTFggUmVnaXN0ZXJzIikpIHsKKwkJLyogSW4gY2FzZSB3ZSBjYW4ndCBhbGxvY2F0ZSBpdCwgd2FybiB1c2VyICovCisJCXByaW50aygiV0FSTklORzogY291bGRuJ3QgYWxsb2NhdGUgSS9PIHJlZ2lvbiBmb3IgUEMzMDAgYm9hcmQgIgorCQkgICAgICAgImF0IDB4JTA4eCFcbiIsIGNhcmQtPmh3LnJhbXBoeXMpOworCX0KKworCWlmIChjYXJkLT5ody5wbHhwaHlzKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCBjYXJkLT5ody5wbHhwaHlzKTsKKwl9IGVsc2UgeworCQllZXByb21fb3V0ZGF0ZWQgPSAxOworCQljYXJkLT5ody5wbHhwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQljYXJkLT5ody5wbHhzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5ody5wbHhwaHlzLCBjYXJkLT5ody5wbHhzaXplLAorCQkJCSJQTFggUmVnaXN0ZXJzIikpIHsKKwkJcHJpbnRrKCJQQzMwMCBmb3VuZCBhdCBSQU0gMHglMDh4LCAiCisJCSAgICAgICAiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBQTFggbWVtIHJlZ2lvbi5cbiIsCisJCSAgICAgICBjYXJkLT5ody5yYW1waHlzKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZV9pbzsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuYWxsb2NfcmFtc2l6ZSwKKwkJCQkiT24tYm9hcmQgUkFNIikpIHsKKwkJcHJpbnRrKCJQQzMwMCBmb3VuZCBhdCBSQU0gMHglMDh4LCAiCisJCSAgICAgICAiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBSQU0gbWVtIHJlZ2lvbi5cbiIsCisJCSAgICAgICBjYXJkLT5ody5yYW1waHlzKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZV9wbHg7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPmh3LnNjYXBoeXMsIGNhcmQtPmh3LnNjYXNpemUsCisJCQkJIlNDQS1JSSBSZWdpc3RlcnMiKSkgeworCQlwcmludGsoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwOHgsICIKKwkJICAgICAgICJidXQgY291bGQgbm90IGFsbG9jYXRlIFNDQSBtZW0gcmVnaW9uLlxuIiwKKwkJICAgICAgIGNhcmQtPmh3LnJhbXBoeXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZWxlYXNlX3JhbTsKKwl9CisKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSAhPSAwKQorCQlnb3RvIGVycl9yZWxlYXNlX3NjYTsKKworCWNhcmQtPmh3LnBseGJhc2UgPSBpb3JlbWFwKGNhcmQtPmh3LnBseHBoeXMsIGNhcmQtPmh3LnBseHNpemUpOworCWNhcmQtPmh3LnJhbWJhc2UgPSBpb3JlbWFwKGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmFsbG9jX3JhbXNpemUpOworCWNhcmQtPmh3LnNjYWJhc2UgPSBpb3JlbWFwKGNhcmQtPmh3LnNjYXBoeXMsIGNhcmQtPmh3LnNjYXNpemUpOworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMjoKKwkJCXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5ody5mYWxjcGh5cywgY2FyZC0+aHcuZmFsY3NpemUsCisJCQkJCSAgICJGQUxDIFJlZ2lzdGVycyIpOworCQkJY2FyZC0+aHcuZmFsY2Jhc2UgPSBpb3JlbWFwKGNhcmQtPmh3LmZhbGNwaHlzLCBjYXJkLT5ody5mYWxjc2l6ZSk7CisJCQlicmVhazsKKworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzI6CisJCWRlZmF1bHQ6CisJCQljYXJkLT5ody5mYWxjYmFzZSA9IE5VTEw7CisJCQlicmVhazsKKwl9CisKKyNpZmRlZiBQQzMwMF9ERUJVR19QQ0kKKwlwcmludGsoImNwYzogcmVsb2NhdGUgcmFtYWRkcj0weCUwOGx4IHBseGFkZHI9MHglMDhseCAiCisJICAgICAgICJjdGxhZGRyPTB4JTA4bHggZmFsY2FkZHI9MHglMDhseFxuIiwKKwkgICAgICAgY2FyZC0+aHcucmFtYmFzZSwgY2FyZC0+aHcucGx4YmFzZSwgY2FyZC0+aHcuc2NhYmFzZSwKKwkgICAgICAgY2FyZC0+aHcuZmFsY2Jhc2UpOworI2VuZGlmCisKKwkvKiBTZXQgUENJIGRydiBwb2ludGVyIHRvIHRoZSBjYXJkIHN0cnVjdHVyZSAqLworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCS8qIFNldCBib2FyZCB0eXBlICovCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8yOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8yOgorCQkJY2FyZC0+aHcudHlwZSA9IFBDMzAwX1RFOworCisJCQlpZiAoKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMSkgfHwKKwkJCSAgICAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8yKSkgeworCQkJCWNhcmQtPmh3LmJ1cyA9IFBDMzAwX1BNQzsKKwkJCQkvKiBTZXQgUExYIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwkJCQljYXJkLT5ody5ncGlvY19yZWcgPSAweDU0OworCQkJCWNhcmQtPmh3LmludGN0bF9yZWcgPSAweDRjOworCQkJfSBlbHNlIHsKKwkJCQljYXJkLT5ody5idXMgPSBQQzMwMF9QQ0k7CisJCQkJLyogU2V0IFBMWCByZWdpc3RlciBvZmZzZXRzICovCisJCQkJY2FyZC0+aHcuZ3Bpb2NfcmVnID0gMHg1MDsKKwkJCQljYXJkLT5ody5pbnRjdGxfcmVnID0gMHg0YzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMjoKKwkJZGVmYXVsdDoKKwkJCWNhcmQtPmh3LmJ1cyA9IFBDMzAwX1BDSTsKKwkJCS8qIFNldCBQTFggcmVnaXN0ZXIgb2Zmc2V0cyAqLworCQkJY2FyZC0+aHcuZ3Bpb2NfcmVnID0gMHg1MDsKKwkJCWNhcmQtPmh3LmludGN0bF9yZWcgPSAweDRjOworCisJCQlpZiAoKGNwY19yZWFkbChjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSAmIFBDMzAwX0NUWVBFX01BU0spKSB7CisJCQkJY2FyZC0+aHcudHlwZSA9IFBDMzAwX1gyMTsKKwkJCX0gZWxzZSB7CisJCQkJY2FyZC0+aHcudHlwZSA9IFBDMzAwX1JTVjsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlmIChyZXF1ZXN0X2lycShjYXJkLT5ody5pcnEsIGNwY19pbnRyLCBTQV9TSElSUSwgIkN5Y2xhZGVzLVBDMzAwIiwgY2FyZCkpIHsKKwkJcHJpbnRrICgiUEMzMDAgZm91bmQgYXQgUkFNIDB4JTA4eCwgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZC5cbiIsCisJCQkgY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuaXJxKTsKKwkJZ290byBlcnJfaW9fdW5tYXA7CisJfQorCisJY3BjX2luaXRfY2FyZChjYXJkKTsKKworCWlmIChlZXByb21fb3V0ZGF0ZWQpCisJCXByaW50aygiV0FSTklORzogUEMzMDAgd2l0aCBvdXRkYXRlZCBFRVBST00uXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX2lvX3VubWFwOgorCWlvdW5tYXAoY2FyZC0+aHcucGx4YmFzZSk7CisJaW91bm1hcChjYXJkLT5ody5zY2FiYXNlKTsKKwlpb3VubWFwKGNhcmQtPmh3LnJhbWJhc2UpOworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCWlvdW5tYXAoY2FyZC0+aHcuZmFsY2Jhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcuZmFsY3BoeXMsIGNhcmQtPmh3LmZhbGNzaXplKTsKKwl9CitlcnJfcmVsZWFzZV9zY2E6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnNjYXBoeXMsIGNhcmQtPmh3LnNjYXNpemUpOworZXJyX3JlbGVhc2VfcmFtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5hbGxvY19yYW1zaXplKTsKK2Vycl9yZWxlYXNlX3BseDoKKwlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcucGx4cGh5cywgY2FyZC0+aHcucGx4c2l6ZSk7CitlcnJfcmVsZWFzZV9pbzoKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5ody5pb3BoeXMsIGNhcmQtPmh3Lmlvc2l6ZSk7CisJa2ZyZWUoY2FyZCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjcGNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwYzMwMF90ICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGNhcmQtPmh3LnJhbWJhc2UgIT0gMCkgeworCQlpbnQgaTsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBicmlkZ2UgKi8KKwkJY3BjX3dyaXRldyhjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuaW50Y3RsX3JlZywKKwkJCSAgIGNwY19yZWFkdyhjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuaW50Y3RsX3JlZykgJiB+KDB4MDA0MCkpOworCisJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5ody5uY2hhbjsgaSsrKSB7CisJCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGNhcmQtPmNoYW5baV0uZC5kZXYpOworCQl9CisJCWlvdW5tYXAoY2FyZC0+aHcucGx4YmFzZSk7CisJCWlvdW5tYXAoY2FyZC0+aHcuc2NhYmFzZSk7CisJCWlvdW5tYXAoY2FyZC0+aHcucmFtYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5wbHhwaHlzLCBjYXJkLT5ody5wbHhzaXplKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmFsbG9jX3JhbXNpemUpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcuc2NhcGh5cywgY2FyZC0+aHcuc2Nhc2l6ZSk7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmh3LmlvcGh5cywgY2FyZC0+aHcuaW9zaXplKTsKKwkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCWlvdW5tYXAoY2FyZC0+aHcuZmFsY2Jhc2UpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LmZhbGNwaHlzLCBjYXJkLT5ody5mYWxjc2l6ZSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGNhcmQtPmh3Lm5jaGFuOyBpKyspCisJCQlpZiAoY2FyZC0+Y2hhbltpXS5kLmRldikKKwkJCQlmcmVlX25ldGRldihjYXJkLT5jaGFuW2ldLmQuZGV2KTsKKwkJaWYgKGNhcmQtPmh3LmlycSkKKwkJCWZyZWVfaXJxKGNhcmQtPmh3LmlycSwgY2FyZCk7CisJCWtmcmVlKGNhcmQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNwY19kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gInBjMzAwIiwKKwkuaWRfdGFibGUgICAgICAgPSBjcGNfcGNpX2Rldl9pZCwKKwkucHJvYmUgICAgICAgICAgPSBjcGNfaW5pdF9vbmUsCisJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoY3BjX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3BjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjcGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNwY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3BjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNwY19pbml0KTsKK21vZHVsZV9leGl0KGNwY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbGFkZXMtUEMzMDAgY2FyZHMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCAgIkF1dGhvcjogSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPlxyXG4iCisgICAgICAgICAgICAgICAgIk1haW50YWluZXI6IFBDMzAwIE1haW50YWluZXIgPHBjMzAwQGN5Y2xhZGVzLmNvbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmODRhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwpAQCAtMCwwICsxLDEwOTUgQEAKKy8qCisgKiBwYzMwMF90dHkuYwlDeWNsYWRlcy1QQzMwMCh0bSkgVFRZIERyaXZlci4KKyAqCisgKiBBdXRob3I6CVJlZ2luYSBLb2RhdG8gPHJlZ2luYWtAY3ljbGFkZXMuY29tPgorICoKKyAqIENvcHlyaWdodDoJKGMpIDE5OTktMjAwMiBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgIAorICogICRMb2c6IHBjMzAwX3R0eS5jLHYgJAorICogIFJldmlzaW9uIDMuNyAgMjAwMi8wMy8wNyAxNDoxNzowOSAgaGVucmlxdWUKKyAqICBMaWNlbnNlIGRhdGEgZml4ZWQKKyAqCisgKiAgUmV2aXNpb24gMy42ICAyMDAxLzEyLzEwIDEyOjI5OjQyICByZWdpbmEKKyAqICBGaXggdGhlIE1MUFBQIGJ1ZworICoKKyAqICBSZXZpc2lvbiAzLjUgIDIwMDEvMTAvMzEgMTE6MjA6MDUgIHJlZ2luYQorICogIGF1dG9tYXRpYyBwcHBkIHN0YXJ0cworICoKKyAqICBSZXZpc2lvbiAzLjQgIDIwMDEvMDgvMDYgMTI6MDE6NTEgIHJlZ2luYQorICogIHByb2JsZW0gaW4gRFNSX0RFIGJpdAorICoKKyAqICBSZXZpc2lvbiAzLjMgIDIwMDEvMDcvMjYgMjI6NTg6NDEgIHJlZ2luYQorICogIHVwZGF0ZSBFREEgdmFsdWUKKyAqCisgKiAgUmV2aXNpb24gMy4yICAyMDAxLzA3LzEyIDEzOjExOjIwICByZWdpbmEKKyAqICBidWcgZml4IC0gRENELU9GRiBpbiBwYzMwMCB0dHkgZHJpdmVyCisgKgorICoJRE1BIHRyYW5zbWlzc2lvbiBidWcgZml4CisgKiAgCisgKiAgUmV2aXNpb24gMy4xICAyMDAxLzA2LzIyIDEzOjEzOjAyICByZWdpbmEKKyAqICBNTFBQUCBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKy8qIFRUWSBpbmNsdWRlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAicGMzMDAuaCIKKworLyogZGVmaW5lcyBhbmQgbWFjcm9zICovCisvKiBUVFkgR2xvYmFsIGRlZmluaXRpb25zICovCisjZGVmaW5lCUNQQ19UVFlfTlBPUlRTCTgJLyogbWF4aW11bSBudW1iZXIgb2YgdGhlIHN5bmMgdHR5IGNvbm5lY3Rpb25zICovCisjZGVmaW5lCUNQQ19UVFlfTUFKT1IJQ1lDTEFERVNfTUFKT1IJCisjZGVmaW5lIENQQ19UVFlfTUlOT1JfU1RBUlQJMjQwCS8qIG1pbm9yIG9mIHRoZSBmaXJzdCBQQzMwMCBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBDUENfVFRZX01BWF9NVFUJMjAwMAkKKworLyogdHR5IGludGVyZmFjZSBzdGF0ZSAqLworI2RlZmluZQlDUENfVFRZX1NUX0lETEUJMAorI2RlZmluZSBDUENfVFRZX1NUX0lOSVQJMQkvKiBjb25maWd1cmVkIHdpdGggTUxQUFAgYW5kIHVwICovCisjZGVmaW5lIENQQ19UVFlfU1RfT1BFTgkyCS8qIG9wZW5lZCBieSBhcHBsaWNhdGlvbiAqLworCisjZGVmaW5lCUNQQ19UVFlfTE9DSyhjYXJkLGZsYWdzKVwKKwlkbyB7XAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENQQ19UVFlfVU5MT0NLKGNhcmQsZmxhZ3MpCVwKKwlkbyB7XAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsJXAorCX0gd2hpbGUgKDApCisKKy8vI2RlZmluZQlDUENfVFRZX0RCRyhmb3JtYXQsYS4uLikJcHJpbnRrKGZvcm1hdCwjI2EpCisjZGVmaW5lCUNQQ19UVFlfREJHKGZvcm1hdCxhLi4uKQorCisvKiBkYXRhIHN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IF9zdF9jcGNfcnhfYnVmIHsKKwlzdHJ1Y3QgX3N0X2NwY19yeF9idWYJKm5leHQ7CisJaW50CQlzaXplOworCXVuc2lnbmVkIGNoYXIJZGF0YVsxXTsKK30gc3RfY3BjX3J4X2J1ZjsKKworc3RydWN0IHN0X2NwY19yeF9saXN0IHsKKwlzdF9jcGNfcnhfYnVmCSpmaXJzdDsKKwlzdF9jcGNfcnhfYnVmCSpsYXN0OworfTsKKwordHlwZWRlZglzdHJ1Y3QgX3N0X2NwY190dHlfYXJlYSB7CisJaW50CQlzdGF0ZTsJCS8qIHN0YXRlIG9mIHRoZSBUVFkgaW50ZXJmYWNlICovCisJaW50CQludW1fb3BlbjsJCisJdW5zaWduZWQgaW50IAl0dHlfbWlub3I7CS8qIG1pbm9yIHRoaXMgaW50ZXJmYWNlICovCisJdm9sYXRpbGUgc3RydWN0IHN0X2NwY19yeF9saXN0IGJ1Zl9yeDsJLyogcHRyLiB0byByZWNlcHRpb24gYnVmZmVyICovCisJdW5zaWduZWQgY2hhcioJYnVmX3R4OwkJLyogcHRyLiB0byB0cmFuc21pc3Npb24gYnVmZmVyICovCisJcGMzMDBkZXZfdCoJcGMzMDBkZXY7CS8qIHB0ci4gdG8gaW5mbyBzdHJ1Y3QgaW4gUEMzMDAgZHJpdmVyICovCisJdW5zaWduZWQgY2hhcgluYW1lWzIwXTsJLyogaW50ZXJmLiBuYW1lICsgIi10dHkiICovCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsJCQorCXN0cnVjdCB3b3JrX3N0cnVjdCB0dHlfdHhfd29yazsgLyogdHggd29yayAtIHR4IGludGVycnVwdCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB0dHlfcnhfd29yazsgLyogcnggd29yayAtIHJ4IGludGVycnVwdCAqLworCX0gc3RfY3BjX3R0eV9hcmVhOworCisvKiBUVFkgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgc2VyaWFsX2RydjsKKworLyogbG9jYWwgdmFyaWFibGVzICovCitzdF9jcGNfdHR5X2FyZWEJY3BjX3R0eV9hcmVhW0NQQ19UVFlfTlBPUlRTXTsKKworaW50IGNwY190dHlfY250PTA7CS8qIG51bWJlciBvZiBpbnRyZmFjZXMgY29uZmlndXJlZCB3aXRoIE1MUFBQICovCitpbnQgY3BjX3R0eV91bnJlZ19mbGFnID0gMDsKKworLyogVFRZIGZ1bmN0aW9ucyBwcm90b3R5cGUgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmbGlwKTsKK3N0YXRpYyB2b2lkIGNwY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZsaXApOworc3RhdGljIGludCBjcGNfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgY3BjX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBjcGNfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGNwY190dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgY3BjX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3J4X3dvcmsodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3R4X3dvcmsodm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGNwY190dHlfc2VuZF90b19jYXJkKHBjMzAwZGV2X3QgKmRldix2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgY3BjX3R0eV90cmFjZShwYzMwMGRldl90ICpkZXYsIGNoYXIqIGJ1ZiwgaW50IGxlbiwgY2hhciByeHR4KTsKK3N0YXRpYyB2b2lkIGNwY190dHlfc2lnbmFsX29mZihwYzMwMGRldl90ICpwYzMwMGRldiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3NpZ25hbF9vbihwYzMwMGRldl90ICpwYzMwMGRldiwgdW5zaWduZWQgY2hhcik7CisKK2ludCBwYzMwMF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorCQkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworaW50IHBjMzAwX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworCisvKiBmdW5jdGlvbnMgY2FsbGVkIGJ5IFBDMzAwIGRyaXZlciAqLwordm9pZCBjcGNfdHR5X2luaXQocGMzMDBkZXZfdCAqZGV2KTsKK3ZvaWQgY3BjX3R0eV91bnJlZ2lzdGVyX3NlcnZpY2UocGMzMDBkZXZfdCAqcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3JlY2VpdmUocGMzMDBkZXZfdCAqcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3RyaWdnZXJfcG9sbChwYzMwMGRldl90ICpwYzMwMGRldik7Cit2b2lkIGNwY190dHlfcmVzZXRfdmFyKHZvaWQpOworCisvKgorICogUEMzMDAgVFRZIGNsZWFyICJzaWduYWwiCisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfc2lnbmFsX29mZihwYzMwMGRldl90ICpwYzMwMGRldiwgdW5zaWduZWQgY2hhciBzaWduYWwpCit7CisJcGMzMDBjaF90ICpwYzMwMGNoYW4gPSAocGMzMDBjaF90ICopcGMzMDBkZXYtPmNoYW47IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBwYzMwMGNoYW4tPmNhcmQ7IAorCWludCBjaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsgCisJdW5zaWduZWQgbG9uZyBmbGFnczsgCisKKwlDUENfVFRZX0RCRygiJXMtdHR5OiBDbGVhciBzaWduYWwgJXhcbiIsCisJCXBjMzAwZGV2LT5kZXYtPm5hbWUsIHNpZ25hbCk7CisJQ1BDX1RUWV9MT0NLKGNhcmQsIGZsYWdzKTsgCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ1RMLGNoKSwgCisJCWNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlK01fUkVHKENUTCxjaCkpJiBzaWduYWwpOworCUNQQ19UVFlfVU5MT0NLKGNhcmQsZmxhZ3MpOyAKK30KKworLyoKKyAqIFBDMzAwIFRUWSBzZXQgInNpZ25hbCIgdG8gT04KKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV9zaWduYWxfb24ocGMzMDBkZXZfdCAqcGMzMDBkZXYsIHVuc2lnbmVkIGNoYXIgc2lnbmFsKQoreworCXBjMzAwY2hfdCAqcGMzMDBjaGFuID0gKHBjMzAwY2hfdCAqKXBjMzAwZGV2LT5jaGFuOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgcGMzMDBjaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IAorCisJQ1BDX1RUWV9EQkcoIiVzLXR0eTogU2V0IHNpZ25hbCAleFxuIiwKKwkJcGMzMDBkZXYtPmRldi0+bmFtZSwgc2lnbmFsKTsKKwlDUENfVFRZX0xPQ0soY2FyZCwgZmxhZ3MpOyAKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDVEwsY2gpLCAKKwkJY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UrTV9SRUcoQ1RMLGNoKSkmIH5zaWduYWwpOworCUNQQ19UVFlfVU5MT0NLKGNhcmQsZmxhZ3MpOyAKK30KKworLyoKKyAqIFBDMzAwIFRUWSBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgUEMzMDAgZHJpdmVyIGR1cmluZyBib2FyZCBjb25maWd1cmF0aW9uIAorICogKGlvY3RsPVNJT0NTUDMwMENPTkYpLiBBdCB0aGlzIHBvaW50IHRoZSBhZGFwdGVyIGlzIGNvbXBsZXRlbHkKKyAqIGluaXRpYWxpemVkLgorICogbyB2ZXJpZnkga2VybmVsIHZlcnNpb24gKG9ubHkgMi40LngpCisgKiBvIHJlZ2lzdGVyIFRUWSBkcml2ZXIKKyAqIG8gaW5pdCBjcGNfdHR5X2FyZWEgc3RydWN0CisgKi8KK3ZvaWQgY3BjX3R0eV9pbml0KHBjMzAwZGV2X3QgKnBjMzAwZGV2KQoreworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwlpbnQgYXV4OworCXN0X2NwY190dHlfYXJlYSAqIGNwY190dHk7CisKKwkvKiBoZGxjWCAtIFg9aW50ZXJmYWNlIG51bWJlciAqLworCXBvcnQgPSBwYzMwMGRldi0+ZGV2LT5uYW1lWzRdIC0gJzAnOworCWlmIChwb3J0ID49IENQQ19UVFlfTlBPUlRTKSB7CisJCXByaW50aygiJXMtdHR5OiBpbnZhbGlkIGludGVyZmFjZSBzZWxlY3RlZCAoMC0laSk6ICVsaSIsCisJCQlwYzMwMGRldi0+ZGV2LT5uYW1lLAorCQkJQ1BDX1RUWV9OUE9SVFMtMSxwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjcGNfdHR5X2NudCA9PSAwKSB7IC8qIGZpcnN0IFRUWSBjb25uZWN0aW9uIC0+IHJlZ2lzdGVyIGRyaXZlciAqLworCQlDUENfVFRZX0RCRygiJXMtdHR5OiBkcml2ZXIgaW5pdCwgbWFqb3I6JWksIG1pbm9yIHJhbmdlOiVpPSVpXG4iLAorCQkJcGMzMDBkZXYtPmRldi0+bmFtZSwKKwkJCUNQQ19UVFlfTUFKT1IsIENQQ19UVFlfTUlOT1JfU1RBUlQsCisJCQlDUENfVFRZX01JTk9SX1NUQVJUK0NQQ19UVFlfTlBPUlRTKTsKKwkJLyogaW5pdGlhbGl6ZSB0dHkgZHJpdmVyIHN0cnVjdCAqLworCQltZW1zZXQoJnNlcmlhbF9kcnYsMCxzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKKwkJc2VyaWFsX2Rydi5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7CisJCXNlcmlhbF9kcnYub3duZXIgPSBUSElTX01PRFVMRTsKKwkJc2VyaWFsX2Rydi5kcml2ZXJfbmFtZSA9ICJwYzMwMF90dHkiOworCQlzZXJpYWxfZHJ2Lm5hbWUgPSAidHR5Q1AiOworCQlzZXJpYWxfZHJ2Lm1ham9yID0gQ1BDX1RUWV9NQUpPUjsKKwkJc2VyaWFsX2Rydi5taW5vcl9zdGFydCA9IENQQ19UVFlfTUlOT1JfU1RBUlQ7CisJCXNlcmlhbF9kcnYubnVtID0gQ1BDX1RUWV9OUE9SVFM7CisJCXNlcmlhbF9kcnYudHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJCXNlcmlhbF9kcnYuc3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKworCQlzZXJpYWxfZHJ2LmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwkJc2VyaWFsX2Rydi5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwfENTOHxDUkVBRHxIVVBDTHxDTE9DQUw7CisJCXNlcmlhbF9kcnYuZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCisJCS8qIGludGVyZmFjZSByb3V0aW5lcyBmcm9tIHRoZSB1cHBlciB0dHkgbGF5ZXIgdG8gdGhlIHR0eSBkcml2ZXIgKi8KKwkJc2VyaWFsX2Rydi5vcGVuID0gY3BjX3R0eV9vcGVuOworCQlzZXJpYWxfZHJ2LmNsb3NlID0gY3BjX3R0eV9jbG9zZTsKKwkJc2VyaWFsX2Rydi53cml0ZSA9IGNwY190dHlfd3JpdGU7IAorCQlzZXJpYWxfZHJ2LndyaXRlX3Jvb20gPSBjcGNfdHR5X3dyaXRlX3Jvb207IAorCQlzZXJpYWxfZHJ2LmNoYXJzX2luX2J1ZmZlciA9IGNwY190dHlfY2hhcnNfaW5fYnVmZmVyOyAKKwkJc2VyaWFsX2Rydi50aW9jbXNldCA9IHBjMzAwX3Rpb2Ntc2V0OworCQlzZXJpYWxfZHJ2LnRpb2NtZ2V0ID0gcGMzMDBfdGlvY21nZXQ7CisJCXNlcmlhbF9kcnYuZmx1c2hfYnVmZmVyID0gY3BjX3R0eV9mbHVzaF9idWZmZXI7IAorCQlzZXJpYWxfZHJ2Lmhhbmd1cCA9IGNwY190dHlfaGFuZ3VwOworCisJCS8qIHJlZ2lzdGVyIHRoZSBUVFkgZHJpdmVyICovCisJCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJ2KSkgeyAKKwkJCXByaW50aygiJXMtdHR5OiBGYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlciEgIiwKKwkJCQlwYzMwMGRldi0+ZGV2LT5uYW1lKTsKKwkJICAgCXJldHVybjsKKwkJfSAKKworCQltZW1zZXQoKHZvaWQgKiljcGNfdHR5X2FyZWEsIDAsCisJCQkJCQkJCXNpemVvZihzdF9jcGNfdHR5X2FyZWEpICogQ1BDX1RUWV9OUE9SVFMpOworCX0KKworCWNwY190dHkgPSAmY3BjX3R0eV9hcmVhW3BvcnRdOworCQorCWlmIChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX0lETEUpIHsKKwkJQ1BDX1RUWV9EQkcoIiVzLXR0eTogVFRZIHBvcnQgJWksIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCQlwYzMwMGRldi0+ZGV2LT5uYW1lLCBwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWNwY190dHlfY250Kys7CisJY3BjX3R0eS0+c3RhdGUgPSBDUENfVFRZX1NUX0lOSVQ7IAorCWNwY190dHktPm51bV9vcGVuPSAwOworCWNwY190dHktPnR0eV9taW5vciA9IHBvcnQgKyBDUENfVFRZX01JTk9SX1NUQVJUOworCWNwY190dHktPnBjMzAwZGV2ID0gcGMzMDBkZXY7IAorCisJSU5JVF9XT1JLKCZjcGNfdHR5LT50dHlfdHhfd29yaywgY3BjX3R0eV90eF93b3JrLCAodm9pZCAqKWNwY190dHkpOworCUlOSVRfV09SSygmY3BjX3R0eS0+dHR5X3J4X3dvcmssIGNwY190dHlfcnhfd29yaywgKHZvaWQgKilwb3J0KTsKKwkKKwljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBjcGNfdHR5LT5idWZfcngubGFzdCA9IE5VTEw7CisKKwlwYzMwMGRldi0+Y3BjX3R0eSA9ICh2b2lkICopY3BjX3R0eTsgCisJCisJYXV4ID0gc3RybGVuKHBjMzAwZGV2LT5kZXYtPm5hbWUpOworCW1lbWNweShjcGNfdHR5LT5uYW1lLCBwYzMwMGRldi0+ZGV2LT5uYW1lLCBhdXgpOworCW1lbWNweSgmY3BjX3R0eS0+bmFtZVthdXhdLCAiLXR0eSIsIDUpOworCQorCWNwY19vcGVuKHBjMzAwZGV2LT5kZXYpOworCWNwY190dHlfc2lnbmFsX29mZihwYzMwMGRldiwgQ1RMX0RUUik7CisKKwlDUENfVFRZX0RCRygiJXM6IEluaXRpYWxpemluZyBUVFkgU3luYyBEcml2ZXIsIHR0eSBtYWpvciMlZCBtaW5vciMlaVxuIiwKKwkJCWNwY190dHktPm5hbWUsQ1BDX1RUWV9NQUpPUixjcGNfdHR5LT50dHlfbWlub3IpOyAKKwlyZXR1cm47IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBPUEVOIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHRvIG9wZW4gdGhlIGludGVyZmFjZSAKKyAqIG8gdmVyaWZ5IG1pbm9yCisgKiBvIGFsbG9jYXRlIGJ1ZmZlciB0byBSeCBhbmQgVHgKKyAqLworc3RhdGljIGludCBjcGNfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZsaXApCit7CisJaW50IHBvcnQgOworCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eTsKKworCWlmICghdHR5KSB7IAorCQlyZXR1cm4gLUVOT0RFVjsKKwl9IAorCisJcG9ydCA9IHR0eS0+aW5kZXg7CisKKwlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+PSBDUENfVFRZX05QT1JUUykpeyAKKwkJQ1BDX1RUWV9EQkcoInBjMzAwX3R0eTogb3BlbiBpbnZhbGlkIHBvcnQgJWRcbiIsIHBvcnQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IAorCisJY3BjX3R0eSA9ICZjcGNfdHR5X2FyZWFbcG9ydF07CisJCisJaWYgKGNwY190dHktPnN0YXRlID09IENQQ19UVFlfU1RfSURMRSl7CisJCUNQQ19UVFlfREJHKCIlczogb3BlbiAtIGludmFsaWQgaW50ZXJmYWNlLCBwb3J0PSVkXG4iLAorCQkJCQljcGNfdHR5LT5uYW1lLCB0dHktPmluZGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNwY190dHktPm51bV9vcGVuID09IDApIHsgLyogZmlyc3Qgb3BlbiBvZiB0aGlzIHR0eSAqLworCQlpZiAoIWNwY190dHlfYXJlYVtwb3J0XS5idWZfdHgpeworCQkJY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl90eCA9IGttYWxsb2MoQ1BDX1RUWV9NQVhfTVRVLEdGUF9LRVJORUwpOworCQkJaWYgKGNwY190dHlfYXJlYVtwb3J0XS5idWZfdHggPT0gMCl7CisJCQkJQ1BDX1RUWV9EQkcoIiVzOiBlcnJvciBpbiBtZW1vcnkgYWxsb2NhdGlvblxuIixjcGNfdHR5LT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfSAKKworCQlpZiAoY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdCkgeworCQkJdW5zaWduZWQgY2hhciAqIGF1eDsKKwkJCXdoaWxlIChjcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0KSB7CisJCQkJYXV4ID0gKHVuc2lnbmVkIGNoYXIgKiljcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0OworCQkJCWNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3QgPSBjcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0LT5uZXh0OworCQkJCWtmcmVlKGF1eCk7CisJCQl9CisJCQljcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0ID0gTlVMTDsKKwkJCWNwY190dHlfYXJlYVtwb3J0XS5idWZfcngubGFzdCA9IE5VTEw7CisJCX0KKworCQljcGNfdHR5X2FyZWFbcG9ydF0uc3RhdGUgPSBDUENfVFRZX1NUX09QRU47CisJCWNwY190dHlfYXJlYVtwb3J0XS50dHkgPSB0dHk7CisJCXR0eS0+ZHJpdmVyX2RhdGEgPSAmY3BjX3R0eV9hcmVhW3BvcnRdOworCisJCWNwY190dHlfc2lnbmFsX29uKGNwY190dHktPnBjMzAwZGV2LCBDVExfRFRSKTsKKwl9IAorCisJY3BjX3R0eS0+bnVtX29wZW4rKzsKKworCUNQQ19UVFlfREJHKCIlczogb3BlbmluZyBUVFkgZHJpdmVyXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkKKwkvKiBhdmlzYXIgZHJpdmVyIFBDMzAwICovIAorCXJldHVybiAwOyAKK30KKworLyoKKyAqIFBDMzAwIFRUWSBDTE9TRSByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB0byBjbG9zZSB0aGUgaW50ZXJmYWNlIAorICogbyBjYWxsIGNsb3NlIGNoYW5uZWwgaW4gUEMzMDAgZHJpdmVyIChjcGNfY2xvc2VjaCkKKyAqIG8gZnJlZSBSeCBhbmQgVHggYnVmZmVycworICovCisKK3N0YXRpYyB2b2lkIGNwY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZsaXApCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlczsKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeworCQlDUENfVFRZX0RCRygiaGRseC10dHk6IG5vIFRUWSBpbiBjbG9zZSBcbiIpOworCQlyZXR1cm47CisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSl8fCAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeworCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm47CisJfQorICAgCQorCWlmICghY3BjX3R0eS0+bnVtX29wZW4pIHsKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgY2xvc2VkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKC0tY3BjX3R0eS0+bnVtX29wZW4gPiAwKSB7CisJCUNQQ19UVFlfREJHKCIlczogVFRZIGNsb3NlZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWNwY190dHlfc2lnbmFsX29mZihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX0RUUik7CisKKwlDUENfVFRZX0xPQ0soY3BjX3R0eS0+cGMzMDBkZXYtPmNoYW4tPmNhcmQsIGZsYWdzKTsgIC8qIGxvY2sgaXJxICovIAorCWNwY190dHktPnR0eSA9IE5VTEw7CisJY3BjX3R0eS0+c3RhdGUgPSBDUENfVFRZX1NUX0lOSVQ7CisJQ1BDX1RUWV9VTkxPQ0soY3BjX3R0eS0+cGMzMDBkZXYtPmNoYW4tPmNhcmQsIGZsYWdzKTsgLyogdW5sb2NrIGlycSAqLyAKKwkKKwlpZiAoY3BjX3R0eS0+YnVmX3J4LmZpcnN0KSB7CisJCXVuc2lnbmVkIGNoYXIgKiBhdXg7CisJCXdoaWxlIChjcGNfdHR5LT5idWZfcnguZmlyc3QpIHsKKwkJCWF1eCA9ICh1bnNpZ25lZCBjaGFyICopY3BjX3R0eS0+YnVmX3J4LmZpcnN0OworCQkJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gY3BjX3R0eS0+YnVmX3J4LmZpcnN0LT5uZXh0OworCQkJa2ZyZWUoYXV4KTsKKwkJfQorCQljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBOVUxMOworCQljcGNfdHR5LT5idWZfcngubGFzdCA9IE5VTEw7CisJfQorCQorCWlmIChjcGNfdHR5LT5idWZfdHgpIHsKKwkJa2ZyZWUoY3BjX3R0eS0+YnVmX3R4KTsKKwkJY3BjX3R0eS0+YnVmX3R4ID0gTlVMTDsKKwl9CisKKwlDUENfVFRZX0RCRygiJXM6IFRUWSBjbG9zZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCisJaWYgKCFzZXJpYWxfZHJ2LnJlZmNvdW50ICYmIGNwY190dHlfdW5yZWdfZmxhZykgeworCQljcGNfdHR5X3VucmVnX2ZsYWcgPSAwOworCQlDUENfVFRZX0RCRygiJXM6IHVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXJcbiIsIGNwY190dHktPm5hbWUpOworCQlpZiAoKHJlcz10dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcnYpKSkgeyAKKwkJCUNQQ19UVFlfREJHKCIlczogRVJST1IgLT51bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyIGVycm9yPSVkXG4iLAorCQkJCQkJCWNwY190dHktPm5hbWUscmVzKTsKKwkJfQorCX0KKwlyZXR1cm47IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBXUklURSByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB0byB3cml0ZSBhIHNlcmllcyBvZiBjaGFyYWN0ZXJzCisgKiB0byB0aGUgdHR5IGRldmljZS4gVGhlIGNoYXJhY3RlcnMgbWF5IGNvbWUgZnJvbSB1c2VyIG9yIGtlcm5lbCBzcGFjZS4KKyAqIG8gdmVyaWZ5IHRoZSBEQ0Qgc2lnbmFsCisgKiBvIHNlbmQgY2hhcmFjdGVycyB0byBib2FyZCBhbmQgc3RhcnQgdGhlIHRyYW5zbWlzc2lvbgorICovCitzdGF0aWMgaW50IGNwY190dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKwlwYzMwMGNoX3QgKnBjMzAwY2hhbjsgCisJcGMzMDBfdCAqY2FyZDsgCisJaW50IGNoOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7IAorCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7IAorCQlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgaW4gd3JpdGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IAorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpIHx8ICAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOyAKKwl9CisKKwlpZiAoY291bnQgPiBDUENfVFRZX01BWF9NVFUpIHsgCisJCUNQQ19UVFlfREJHKCIlczogY291bnQgaXMgaW52YWxpZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7ICAgICAgICAvKiBmcmFtZSB0b28gYmlnICovIAorCX0KKworCUNQQ19UVFlfREJHKCIlczogY3BjX3R0eV93cml0ZSBkYXRhIGxlbj0laVxuIixjcGNfdHR5LT5uYW1lLGNvdW50KTsKKwkKKwlwYzMwMGNoYW4gPSAocGMzMDBjaF90ICopKChwYzMwMGRldl90KiljcGNfdHR5LT5wYzMwMGRldiktPmNoYW47IAorCXN0YXRzID0gaGRsY19zdGF0cygoKHBjMzAwZGV2X3QqKWNwY190dHktPnBjMzAwZGV2KS0+ZGV2KTsKKwljYXJkID0gKHBjMzAwX3QgKikgcGMzMDBjaGFuLT5jYXJkOworCWNoID0gcGMzMDBjaGFuLT5jaGFubmVsOyAKKworCS8qIHZlcmlmeSBEQ0Qgc2lnbmFsKi8gCisJaWYgKGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoU1QzLGNoKSkgJiBTVDNfRENEKSB7IAorCQkvKiBEQ0QgaXMgT0ZGICovIAorCQlDUENfVFRZX0RCRygiJXMgOiBEQ0QgaXMgT0ZGXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJQ1BDX1RUWV9MT0NLKGNhcmQsIGZsYWdzKTsgCisJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfVFhfQlVGX0NMUik7IAorCQkKKwkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsgCisJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLCAKKwkJCQljcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYgCisJCQkJfihDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICpjaCkpKTsgCisJCX0KKworCQlDUENfVFRZX1VOTE9DSyhjYXJkLCBmbGFncyk7IAorCisJCXJldHVybiAtRUlOVkFMOyAKKwl9CisKKwlpZiAoY3BjX3R0eV9zZW5kX3RvX2NhcmQoY3BjX3R0eS0+cGMzMDBkZXYsICh2b2lkKilidWYsIGNvdW50KSkgeyAKKwkgICAvKiBmYWlsZWQgdG8gc2VuZCAqLworCSAgIENQQ19UVFlfREJHKCIlczogdHJhc21pdGlvbiBlcnJvclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJICAgcmV0dXJuIDA7CisJfQorCXJldHVybiBjb3VudDsgCit9IAorCisvKgorICogUEMzMDAgVFRZIFdyaXRlIFJvb20gcm91dGluZQorICogCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVycyBvZiBjaGFyYWN0ZXJlcyB0aGUgdHR5IGRyaXZlciB3aWxsIGFjY2VwdAorICogZm9yIHF1ZXVpbmcgdG8gYmUgd3JpdHRlbi4gCisgKiBvIHJldHVybiBNVFUKKyAqLworc3RhdGljIGludCBjcGNfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7IAorCQlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgdG8gd3JpdGUgcm9vbVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KSB8fCAgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsgCisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOyAKKwl9CisgICAJCisJQ1BDX1RUWV9EQkcoIiVzOiB3cml0ZSByb29tXG4iLGNwY190dHktPm5hbWUpOworCQorCXJldHVybiBDUENfVFRZX01BWF9NVFU7Cit9IAorCisvKgorICogUEMzMDAgVFRZIGNoYXJzIGluIGJ1ZmZlciByb3V0aW5lCisgKiAKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBjaGFycyBudW1iZXIgaW4gdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIgCisgKiBvIHJldHVybnMgMAorICovCitzdGF0aWMgaW50IGNwY190dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeworCQlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgdG8gY2hhcnMgaW4gYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7IAorCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KSB8fCAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7IAorCX0KKyAgIAorCXJldHVybigwKTsgCit9IAorCitpbnQgcGMzMDBfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKworCUNQQ19UVFlfREJHKCIlczogc2V0OiV4IGNsZWFyOiV4XG4iLCBfX0ZVTkNUSU9OX18sIHNldCwgY2xlYXIpOworCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CisJICAgCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byBjaGFycyBpbiBidWZmZXJcbiIpOwkKKwkJcmV0dXJuIC1FTk9ERVY7IAorCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJY3BjX3R0eV9zaWduYWxfb24oY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9SVFMpOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWNwY190dHlfc2lnbmFsX29uKGNwY190dHktPnBjMzAwZGV2LCBDVExfRFRSKTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJY3BjX3R0eV9zaWduYWxfb2ZmKGNwY190dHktPnBjMzAwZGV2LCBDVExfUlRTKTsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWNwY190dHlfc2lnbmFsX29mZihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX0RUUik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBjMzAwX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdF9jcGNfdHR5X2FyZWEgICpjcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOworCXBjMzAwZGV2X3QgKnBjMzAwZGV2ID0gY3BjX3R0eS0+cGMzMDBkZXY7CisJcGMzMDBjaF90ICpwYzMwMGNoYW4gPSAocGMzMDBjaF90ICopcGMzMDBkZXYtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIHBjMzAwY2hhbi0+Y2FyZDsKKwlpbnQgY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJQ1BDX1RUWV9EQkcoIiVzLXR0eTogdGlvY21nZXRcbiIsCisJCSgoc3RydWN0IG5ldF9kZXZpY2UqKShwYzMwMGRldi0+aGRsYykpLT5uYW1lKTsKKworCUNQQ19UVFlfTE9DSyhjYXJkLCBmbGFncyk7CisJc3RhdHVzID0gY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UrTV9SRUcoQ1RMLGNoKSk7CisJQ1BDX1RUWV9VTkxPQ0soY2FyZCxmbGFncyk7CisKKwlyZXN1bHQgPSAoKHN0YXR1cyAmIENUTF9EVFIpID8gVElPQ01fRFRSIDogMCkgfAorCQkgKChzdGF0dXMgJiBDVExfUlRTKSA/IFRJT0NNX1JUUyA6IDApOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFBDMzAwIFRUWSBGbHVzaCBCdWZmZXIgcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSByZXNldHMgdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIgCisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IAorCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisJCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CisJICAgCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byBmbHVzaCBidWZmZXJcbiIpOwkKKwkJcmV0dXJuOyAKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSkgfHwgIChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm47IAorCX0KKworCUNQQ19UVFlfREJHKCIlczogY2FsbCB3YWtlX3VwX2ludGVycnVwdGlibGVcbiIsY3BjX3R0eS0+bmFtZSk7CisKKwl0dHlfd2FrZXVwKHR0eSk7CQorCXJldHVybjsgCit9IAorCisvKgorICogUEMzMDAgVFRZIEhhbmd1cCByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB0byBoYW5ndXAgdGhlIGludGVyZmFjZSAKKyAqIG8gY2xlYXIgRFRSIHNpZ25hbAorICovCisKK3N0YXRpYyB2b2lkIGNwY190dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IAorCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisJaW50IHJlczsKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeworCQlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgdG8gaGFuZ3VwXG4iKTsJCisJCXJldHVybiA7IAorCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KSB8fCAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeworCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm4gOworCX0KKwlpZiAoIXNlcmlhbF9kcnYucmVmY291bnQgJiYgY3BjX3R0eV91bnJlZ19mbGFnKSB7CisJCWNwY190dHlfdW5yZWdfZmxhZyA9IDA7CisJCUNQQ19UVFlfREJHKCIlczogdW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCWlmICgocmVzPXR0eV91bnJlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RydikpKSB7IAorCQkJQ1BDX1RUWV9EQkcoIiVzOiBFUlJPUiAtPnVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXIgZXJyb3I9JWRcbiIsCisJCQkJCQkJY3BjX3R0eS0+bmFtZSxyZXMpOworCQl9CisJfQorCWNwY190dHlfc2lnbmFsX29mZihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX0RUUik7Cit9CisKKy8qCisgKiBQQzMwMCBUVFkgUlggd29yayByb3V0aW5lCisgKiBUaGlzIHJvdXRpbmUgdHJlYXRzIFJYIHdvcmsKKyAqIG8gdmVyaWZ5IHJlYWQgYnVmZmVyCisgKiBvIGNhbGwgdGhlIGxpbmUgZGlzYy4gcmVhZAorICogbyBmcmVlIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X3J4X3dvcmsodm9pZCAqIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0OworCWludCBpLCBqOworCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eTsgCisJdm9sYXRpbGUgc3RfY3BjX3J4X2J1ZiAqIGJ1ZjsKKwljaGFyIGZsYWdzPTAsZmxnX3J4PTE7IAorCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKGNwY190dHlfY250ID09IDApIHJldHVybjsKKworCQorCWZvciAoaT0wOyAoaSA8IDQpICYmIGZsZ19yeCA7IGkrKykgeworCQlmbGdfcnggPSAwOworCQlwb3J0ID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKwkJZm9yIChqPTA7IGogPCBDUENfVFRZX05QT1JUUzsgaisrKSB7CisJCQljcGNfdHR5ID0gJmNwY190dHlfYXJlYVtwb3J0XTsKKwkJCisJCQlpZiAoKGJ1Zj1jcGNfdHR5LT5idWZfcnguZmlyc3QpICE9IDApIHsKKwkJCQlpZihjcGNfdHR5LT50dHkpIHsKKwkJCQkJbGQgPSB0dHlfbGRpc2NfcmVmKGNwY190dHktPnR0eSk7CisJCQkJCWlmKGxkKSB7CisJCQkJCQlpZiAobGQtPnJlY2VpdmVfYnVmKSB7CisJCQkJCQkJQ1BDX1RUWV9EQkcoIiVzOiBjYWxsIGxpbmUgZGlzYy4gcmVjZWl2ZV9idWZcbiIsY3BjX3R0eS0+bmFtZSk7CisJCQkJCQkJbGQtPnJlY2VpdmVfYnVmKGNwY190dHktPnR0eSwgKGNoYXIgKikoYnVmLT5kYXRhKSwgJmZsYWdzLCBidWYtPnNpemUpOworCQkJCQkJfQorCQkJCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJCQkJfQorCQkJCX0JCisJCQkJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gY3BjX3R0eS0+YnVmX3J4LmZpcnN0LT5uZXh0OworCQkJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopYnVmKTsKKwkJCQlidWYgPSBjcGNfdHR5LT5idWZfcnguZmlyc3Q7CisJCQkJZmxnX3J4ID0gMTsKKwkJCX0KKwkJCWlmICgrK3BvcnQgPT0gQ1BDX1RUWV9OUE9SVFMpIHBvcnQgPSAwOworCQl9CisJfQorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBSWCB3b3JrIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgdHJlYXRzIFJYIGludGVycnVwdC4gCisgKiBvIHJlYWQgYWxsIGZyYW1lcyBpbiBjYXJkCisgKiBvIHZlcmlmeSB0aGUgZnJhbWUgc2l6ZQorICogbyByZWFkIHRoZSBmcmFtZSBpbiByeCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hfdCAqcGMzMDBjaGFuKQoreworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqIHB0ZGVzY3I7IAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgc3RhdHVzOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKilwYzMwMGNoYW4tPmNhcmQ7IAorCWludCBjaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsgCisKKwkvKiBkbWEgYnVmIHJlYWQgKi8gCisJcHRkZXNjciA9IChwY3NjYV9iZF90IF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJCVJYX0JEX0FERFIoY2gsIHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQpKTsgCisJd2hpbGUgKHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgIT0gcGMzMDBjaGFuLT5yeF9sYXN0X2JkKSB7IAorCQlzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cyk7IAorCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOyAKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+bGVuLCAwKTsgCisJCXBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgPSAocGMzMDBjaGFuLT5yeF9maXJzdF9iZCArIDEpICYgCisJCQkJCShOX0RNQV9SWF9CVUYgLSAxKTsgCisJCWlmIChzdGF0dXMgJiBEU1RfRU9NKSB7IAorCQkJYnJlYWs7IC8qIGVuZCBvZiBtZXNzYWdlICovCisJCX0KKwkJcHRkZXNjciA9IChwY3NjYV9iZF90IF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOyAKKwl9Cit9CisKK3ZvaWQgY3BjX3R0eV9yZWNlaXZlKHBjMzAwZGV2X3QgKnBjMzAwZGV2KQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisJcGMzMDBjaF90ICpwYzMwMGNoYW4gPSAocGMzMDBjaF90ICopcGMzMDBkZXYtPmNoYW47IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKXBjMzAwY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gcGMzMDBjaGFuLT5jaGFubmVsOyAKKwl2b2xhdGlsZSBwY3NjYV9iZF90ICBfX2lvbWVtICogcHRkZXNjcjsgCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhwYzMwMGRldi0+ZGV2KTsKKwlpbnQgcnhfbGVuLCByeF9hdXg7IAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgc3RhdHVzOyAKKwl1bnNpZ25lZCBzaG9ydCBmaXJzdF9iZCA9IHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQ7CisJc3RfY3BjX3J4X2J1ZgkqbmV3PU5VTEw7CisJdW5zaWduZWQgY2hhciBkc3Jfcng7CisKKwlpZiAocGMzMDBkZXYtPmNwY190dHkgPT0gTlVMTCkgeyAKKwkJcmV0dXJuOyAKKwl9CisKKwlkc3JfcnggPSBjcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIERTUl9SWChjaCkpOworCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKilwYzMwMGRldi0+Y3BjX3R0eTsgCisKKwl3aGlsZSAoMSkgeyAKKwkJcnhfbGVuID0gMDsKKwkJcHRkZXNjciA9IChwY3NjYV9iZF90ICBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyBSWF9CRF9BRERSKGNoLCBmaXJzdF9iZCkpOworCQl3aGlsZSAoKHN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSkgJiBEU1RfT1NCKSB7CisJCQlyeF9sZW4gKz0gY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pOworCQkJZmlyc3RfYmQgPSAoZmlyc3RfYmQgKyAxKSAmIChOX0RNQV9SWF9CVUYgLSAxKTsKKwkJCWlmIChzdGF0dXMgJiBEU1RfRU9NKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdGRlc2NyPShwY3NjYV9iZF90IF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZStjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsKKwkJfQorCQkJCisJCWlmICghcnhfbGVuKSB7IAorCQkJaWYgKGRzcl9yeCAmIERTUl9CT0YpIHsKKwkJCQkvKiB1cGRhdGUgRURBICovIAorCQkJCWNwY193cml0ZWwoY2FyZC0+aHcuc2NhYmFzZSArIERSWF9SRUcoRURBTCwgY2gpLCAKKwkJCQkJCVJYX0JEX0FERFIoY2gsIHBjMzAwY2hhbi0+cnhfbGFzdF9iZCkpOyAKKwkJCX0KKwkJCWlmIChuZXcpIHsKKwkJCQlrZnJlZShuZXcpOworCQkJCW5ldyA9IE5VTEw7CisJCQl9CisJCQlyZXR1cm47IAorCQl9CisJCQorCQlpZiAocnhfbGVuID4gQ1BDX1RUWV9NQVhfTVRVKSB7IAorCQkJLyogRnJlZSBSWCBkZXNjcmlwdG9ycyAqLyAKKwkJCUNQQ19UVFlfREJHKCIlczogZnJhbWUgc2l6ZSBpcyBpbnZhbGlkLlxuIixjcGNfdHR5LT5uYW1lKTsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsgCisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7IAorCQkJY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hhbik7CisJCQljb250aW51ZTsKKwkJfSAKKwkJCisJCW5ldyA9IChzdF9jcGNfcnhfYnVmICopIGttYWxsb2MocnhfbGVuICsgc2l6ZW9mKHN0X2NwY19yeF9idWYpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ldyA9PSAwKSB7CisJCQljcGNfdHR5X3J4X2Rpc2NfZnJhbWUocGMzMDBjaGFuKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQkvKiBkbWEgYnVmIHJlYWQgKi8gCisJCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCQlSWF9CRF9BRERSKGNoLCBwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkKSk7IAorCisJCXJ4X2xlbiA9IDA7CS8qIGNvdW50ZXIgZnJhbWUgc2l6ZSAqLworCQkKKwkJd2hpbGUgKChzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykpICYgRFNUX09TQikgeworCQkJcnhfYXV4ID0gY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pOworCQkJaWYgKChzdGF0dXMgJiAoRFNUX09WUiB8IERTVF9DUkMgfCBEU1RfUkJJVCB8ICBEU1RfU0hSVCB8IERTVF9BQlQpKQorCQkJCXx8IChyeF9hdXggPiBCRF9ERUZfTEVOKSkgeworCQkJCUNQQ19UVFlfREJHKCIlczogcmVjZXB0aW9uIGVycm9yXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJCQlzdGF0cy0+cnhfZXJyb3JzKys7IAorCQkJCWlmIChzdGF0dXMgJiBEU1RfT1ZSKSB7IAorCQkJCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMrKzsgCisJCQkJfQorCQkJCWlmIChzdGF0dXMgJiBEU1RfQ1JDKSB7IAorCQkJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOyAKKwkJCQl9CisJCQkJaWYgKChzdGF0dXMgJiAoRFNUX1JCSVQgfCBEU1RfU0hSVCB8IERTVF9BQlQpKSB8fAorCQkJCQkocnhfYXV4ID4gQkRfREVGX0xFTikpCXsgCisJCQkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsgCisJCQkJfSAKKwkJCQkvKiBkaXNjYXJkIHJlbWFpbmlnIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIGJhZCBmcmFtZSAqLyAKKwkJCQlDUENfVFRZX0RCRygiJXM6IHJlY2VwdGlvbiBlcnJvciAtIGRpc2NhcmQgZGVzY3JpcHRvcnMiLAorCQkJCQkJY3BjX3R0eS0+bmFtZSk7CisJCQkJY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hhbik7CisJCQkJcnhfbGVuID0gMDsKKwkJCQlrZnJlZShuZXcpOworCQkJCW5ldyA9IE5VTEw7CisJCQkJYnJlYWs7IC8qIHJlYWQgbmV4dCBmcmFtZSAtIHdoaWxlKDEpICovCisJCQl9CisKKwkJCWlmIChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pIHsKKwkJCQkvKiBGcmVlIFJYIGRlc2NyaXB0b3JzICovIAorCQkJCWNwY190dHlfcnhfZGlzY19mcmFtZShwYzMwMGNoYW4pOworCQkJCXN0YXRzLT5yeF9kcm9wcGVkKys7IAorCQkJCXJ4X2xlbiA9IDA7IAorCQkJCWtmcmVlKG5ldyk7CisJCQkJbmV3ID0gTlVMTDsKKwkJCQlicmVhazsgLyogcmVhZCBuZXh0IGZyYW1lIC0gd2hpbGUoMSkgKi8KKwkJCX0KKworCQkJLyogcmVhZCB0aGUgc2VnbWVudCBvZiB0aGUgZnJhbWUgKi8KKwkJCWlmIChyeF9hdXggIT0gMCkgeworCQkJCW1lbWNweV9mcm9taW8oKG5ldy0+ZGF0YSArIHJ4X2xlbiksIAorCQkJCQkodm9pZCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCQkJIGNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpKSwgcnhfYXV4KTsKKwkJCQlyeF9sZW4gKz0gcnhfYXV4OyAKKwkJCX0KKwkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywwKTsgCisJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5sZW4sIDApOyAKKwkJCXBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgPSAocGMzMDBjaGFuLT5yeF9maXJzdF9iZCArIDEpICYgCisJCQkJCShOX0RNQV9SWF9CVUYgLTEpOyAKKwkJCWlmIChzdGF0dXMgJiBEU1RfRU9NKWJyZWFrOworCQkJCisJCQlwdGRlc2NyID0gKHBjc2NhX2JkX3QgX19pb21lbSAqKSAoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJCQljcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsgCisJCX0KKwkJLyogdXBkYXRlIHBvaW50ZXIgKi8gCisJCXBjMzAwY2hhbi0+cnhfbGFzdF9iZCA9IChwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkIC0gMSkgJiAKKwkJCQkJKE5fRE1BX1JYX0JVRiAtIDEpIDsgCisJCWlmICghKGRzcl9yeCAmIERTUl9CT0YpKSB7CisJCQkvKiB1cGRhdGUgRURBICovIAorCQkJY3BjX3dyaXRlbChjYXJkLT5ody5zY2FiYXNlICsgRFJYX1JFRyhFREFMLCBjaCksIAorCQkJCQlSWF9CRF9BRERSKGNoLCBwYzMwMGNoYW4tPnJ4X2xhc3RfYmQpKTsgCisJCX0KKwkJaWYgKHJ4X2xlbiAhPSAwKSB7IAorCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHJ4X2xlbjsgCisJCQorCQkJaWYgKHBjMzAwZGV2LT50cmFjZV9vbikgeyAKKwkJCQljcGNfdHR5X3RyYWNlKHBjMzAwZGV2LCBuZXctPmRhdGEscnhfbGVuLCAnUicpOyAKKwkJCX0gCisJCQluZXctPnNpemUgPSByeF9sZW47CisJCQluZXctPm5leHQgPSBOVUxMOworCQkJaWYgKGNwY190dHktPmJ1Zl9yeC5maXJzdCA9PSAwKSB7CisJCQkJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gbmV3OworCQkJCWNwY190dHktPmJ1Zl9yeC5sYXN0ID0gbmV3OworCQkJfSBlbHNlIHsKKwkJCQljcGNfdHR5LT5idWZfcngubGFzdC0+bmV4dCA9IG5ldzsKKwkJCQljcGNfdHR5LT5idWZfcngubGFzdCA9IG5ldzsKKwkJCX0KKwkJCXNjaGVkdWxlX3dvcmsoJihjcGNfdHR5LT50dHlfcnhfd29yaykpOworCQkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJfQorCX0gCit9IAorCisvKgorICogUEMzMDAgVFRZIFRYIHdvcmsgcm91dGluZQorICogCisgKiBUaGlzIHJvdXRpbmUgdHJlYXRzIFRYIGludGVycnVwdC4gCisgKiBvIGlmIG5lZWQgY2FsbCBsaW5lIGRpc2NpcGxpbmUgd2FrZXVwCisgKiBvIGNhbGwgd2FrZV91cF9pbnRlcnJ1cHRpYmxlCisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfdHhfd29yayh2b2lkICpkYXRhKQoreworCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgZGF0YTsgCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsgCisKKwlDUENfVFRZX0RCRygiJXM6IGNwY190dHlfdHhfd29yayBpbml0XG4iLGNwY190dHktPm5hbWUpOworCQorCWlmICgodHR5ID0gY3BjX3R0eS0+dHR5KSA9PSAwKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IHRoZSBpbnRlcmZhY2UgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOyAKKwl9CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKgorICogUEMzMDAgVFRZIHNlbmQgdG8gY2FyZCByb3V0aW5lCisgKiAKKyAqIFRoaXMgcm91dGluZSBzZW5kIGRhdGEgdG8gY2FyZC4gCisgKiBvIGNsZWFyIGRlc2NyaXB0b3JzCisgKiBvIHdyaXRlIGRhdGEgdG8gRE1BIGJ1ZmZlcnMKKyAqIG8gc3RhcnQgdGhlIHRyYW5zbWlzc2lvbgorICovCitzdGF0aWMgaW50IGNwY190dHlfc2VuZF90b19jYXJkKHBjMzAwZGV2X3QgKmRldix2b2lkKiBidWYsIGludCBsZW4pCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKWRldi0+Y2hhbjsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsgCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYtPmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsgCisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOyAKKwlpbnQgaSwgbmNoYXI7CisJaW50IHRvc2VuZCA9IGxlbjsKKwlpbnQgbmJ1ZiA9ICgobGVuIC0gMSkvQkRfREVGX0xFTikgKyAxOworCXVuc2lnbmVkIGNoYXIgKnBkYXRhPWJ1ZjsKKworCUNQQ19UVFlfREJHKCIlczpjcGNfdHR5X3NlbmRfdG9fY2FycyBsZW49JWkiLCAKKwkJCShzdF9jcGNfdHR5X2FyZWEgKilkZXYtPmNwY190dHktPm5hbWUsbGVuKTsJCisKKwlpZiAobmJ1ZiA+PSBjYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZCkgeworCQlyZXR1cm4gMTsKKwl9CisJCisJLyogd3JpdGUgYnVmZmVyIHRvIERNQSBidWZmZXJzICovIAorCUNQQ19UVFlfREJHKCIlczogY2FsbCBkbWFfYnVmX3dyaXRlXG4iLAorCQkJKHN0X2NwY190dHlfYXJlYSAqKWRldi0+Y3BjX3R0eS0+bmFtZSk7CQorCWZvciAoaSA9IDAgOyBpIDwgbmJ1ZiA7IGkrKykgeworCQlwdGRlc2NyID0gKHBjc2NhX2JkX3QgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgCisJCQlUWF9CRF9BRERSKGNoLCBjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkKSk7CisJCW5jaGFyID0gKEJEX0RFRl9MRU4gPiB0b3NlbmQpID8gdG9zZW5kIDogQkRfREVGX0xFTjsKKwkJaWYgKGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSAmIERTVF9PU0IpIHsKKwkJCW1lbWNweV90b2lvKCh2b2lkIF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJCWNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpKSwgCisJCQkJJnBkYXRhW2xlbiAtIHRvc2VuZF0sIAorCQkJCW5jaGFyKTsKKwkJCWNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkLS07CisJCQlpZiAoKGkgKyAxKSA9PSBuYnVmKSB7CisJCQkJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IEJEIHRvIGJlIHVzZWQgKi8KKwkJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIERTVF9FT00pOworCQkJfSBlbHNlIHsKKwkJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOworCQkJfQorCQkJY3BjX3dyaXRldygmcHRkZXNjci0+bGVuLCBuY2hhcik7CisJCX0gZWxzZSB7CisJCQlDUENfVFRZX0RCRygiJXM6IGVycm9yIGluIGRtYV9idWZfd3JpdGVcbiIsCisJCQkJCShzdF9jcGNfdHR5X2FyZWEgKilkZXYtPmNwY190dHktPm5hbWUpOwkKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQlyZXR1cm4gMTsgCisJCX0KKwkJdG9zZW5kIC09IG5jaGFyOworCQljYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkID0gCisJCQkoY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpOworCX0KKworCWlmIChkZXYtPnRyYWNlX29uKSB7IAorCQljcGNfdHR5X3RyYWNlKGRldiwgYnVmLCBsZW4sJ1QnKTsgCisJfQorCisJLyogc3RhcnQgdHJhbnNtaXNzaW9uICovIAorCUNQQ19UVFlfREJHKCIlczogc3RhcnQgdHJhbnNtaXNzaW9uXG4iLAorCQkoc3RfY3BjX3R0eV9hcmVhICopZGV2LT5jcGNfdHR5LT5uYW1lKTsJCisJCisJQ1BDX1RUWV9MT0NLKGNhcmQsIGZsYWdzKTsgCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgRFRYX1JFRyhFREFMLCBjaCksIAorCQkJVFhfQkRfQUREUihjaCwgY2hhbi0+dHhfbmV4dF9iZCkpOyAKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1RYX0VOQSk7IAorCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIERTUl9UWChjaCksIERTUl9ERSk7IAorCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsgCisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsIAorCQkJY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCQkoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOyAKKwl9CisJQ1BDX1RUWV9VTkxPQ0soY2FyZCwgZmxhZ3MpOyAKKwlyZXR1cm4gMDsgCit9IAorCisvKgorICoJUEMzMDAgVFRZIHRyYWNlIHJvdXRpbmUKKyAqCisgKiAgVGhpcyByb3V0aW5lIHNlbmQgdHJhY2Ugb2YgY29ubmVjdGlvbiB0byBhcHBsaWNhdGlvbi4gCisgKiAgbyBjbGVhciBkZXNjcmlwdG9ycworICogIG8gd3JpdGUgZGF0YSB0byBETUEgYnVmZmVycworICogIG8gc3RhcnQgdGhlIHRyYW5zbWlzc2lvbgorICovCisKK3N0YXRpYyB2b2lkIGNwY190dHlfdHJhY2UocGMzMDBkZXZfdCAqZGV2LCBjaGFyKiBidWYsIGludCBsZW4sIGNoYXIgcnh0eCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOyAKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxMCArIGxlbikpID09IE5VTEwpIHsgCisJCS8qIG91dCBvZiBtZW1vcnkgKi8gCisJCUNQQ19UVFlfREJHKCIlczogdHR5X3RyYWNlIC0gb3V0IG9mIG1lbW9yeVxuIiwgZGV2LT5kZXYtPm5hbWUpOworCQlyZXR1cm47IAorCX0KKworCXNrYl9wdXQgKHNrYiwgMTAgKyBsZW4pOyAKKwlza2ItPmRldiA9IGRldi0+ZGV2OyAKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7IAorCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsgCisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOyAKKwlza2ItPmxlbiA9IDEwICsgbGVuOyAKKworCW1lbWNweShza2ItPmRhdGEsZGV2LT5kZXYtPm5hbWUsNSk7CisJc2tiLT5kYXRhWzVdID0gJ1snOyAKKwlza2ItPmRhdGFbNl0gPSByeHR4OyAKKwlza2ItPmRhdGFbN10gPSAnXSc7IAorCXNrYi0+ZGF0YVs4XSA9ICc6JzsgCisJc2tiLT5kYXRhWzldID0gJyAnOyAKKwltZW1jcHkoJnNrYi0+ZGF0YVsxMF0sIGJ1ZiwgbGVuKTsgCisJbmV0aWZfcngoc2tiKTsgCit9IAkKKworLyoKKyAqCVBDMzAwIFRUWSB1bnJlZ2lzdGVyIHNlcnZpY2Ugcm91dGluZQorICoKKyAqCVRoaXMgcm91dGluZSB1bnJlZ2lzdGVyIG9uZSBpbnRlcmZhY2UuIAorICovCit2b2lkIGNwY190dHlfdW5yZWdpc3Rlcl9zZXJ2aWNlKHBjMzAwZGV2X3QgKnBjMzAwZGV2KQoreworCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eTsgCisJdWxvbmcgZmxhZ3M7CisJaW50IHJlczsKKworCWlmICgoY3BjX3R0eT0gKHN0X2NwY190dHlfYXJlYSAqKSBwYzMwMGRldi0+Y3BjX3R0eSkgPT0gMCkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBpbnRlcmZhY2UgaXMgbm90IFRUWVxuIiwgcGMzMDBkZXYtPmRldi0+bmFtZSk7CisJCXJldHVybjsgCisJfQorCUNQQ19UVFlfREJHKCIlczogY3BjX3R0eV91bnJlZ2lzdGVyX3NlcnZpY2UiLCBjcGNfdHR5LT5uYW1lKTsKKworCWlmIChjcGNfdHR5LT5wYzMwMGRldiAhPSBwYzMwMGRldikgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBpbnZhbGlkIHR0eSBwdHI9JXNcbiIsIAorCQlwYzMwMGRldi0+ZGV2LT5uYW1lLCBjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOyAKKwl9CisKKwlpZiAoLS1jcGNfdHR5X2NudCA9PSAwKSB7IAorCQlpZiAoc2VyaWFsX2Rydi5yZWZjb3VudCkgeworCQkJQ1BDX1RUWV9EQkcoIiVzOiB1bnJlZ2lzdGVyIGlzIG5vdCBwb3NzaWJsZSwgcmVmY291bnQ9JWQiLAorCQkJCQkJCWNwY190dHktPm5hbWUsIHNlcmlhbF9kcnYucmVmY291bnQpOworCQkJY3BjX3R0eV9jbnQrKzsKKwkJCWNwY190dHlfdW5yZWdfZmxhZyA9IDE7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7IAorCQkJQ1BDX1RUWV9EQkcoIiVzOiB1bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJCWlmICgocmVzPXR0eV91bnJlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RydikpKSB7IAorCQkJCUNQQ19UVFlfREJHKCIlczogRVJST1IgLT51bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyIGVycm9yPSVkXG4iLAorCQkJCQkJCQljcGNfdHR5LT5uYW1lLHJlcyk7CisJCQl9CisJCX0KKwl9CisJQ1BDX1RUWV9MT0NLKHBjMzAwZGV2LT5jaGFuLT5jYXJkLGZsYWdzKTsKKwljcGNfdHR5LT50dHkgPSBOVUxMOyAKKwlDUENfVFRZX1VOTE9DSyhwYzMwMGRldi0+Y2hhbi0+Y2FyZCwgZmxhZ3MpOworCWNwY190dHktPnR0eV9taW5vciA9IDA7IAorCWNwY190dHktPnN0YXRlID0gQ1BDX1RUWV9TVF9JRExFOyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgdHJpZ2dlciBwb2xsIHJvdXRpbmUKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgcGMzMDBkcml2ZXIgdG8gdHJlYXRzIFR4IGludGVycnVwdC4gCisgKi8KK3ZvaWQgY3BjX3R0eV90cmlnZ2VyX3BvbGwocGMzMDBkZXZfdCAqcGMzMDBkZXYpCit7CisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKXBjMzAwZGV2LT5jcGNfdHR5OyAKKwlpZiAoIWNwY190dHkpIHsKKwkJcmV0dXJuOworCX0KKwlzY2hlZHVsZV93b3JrKCYoY3BjX3R0eS0+dHR5X3R4X3dvcmspKTsgCit9IAorCisvKgorICogUEMzMDAgVFRZIHJlc2V0IHZhciByb3V0aW5lCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHBjMzAwZHJpdmVyIHRvIGluaXQgdGhlIFRUWSBhcmVhLiAKKyAqLworCit2b2lkIGNwY190dHlfcmVzZXRfdmFyKHZvaWQpCit7CisJaW50IGkgOyAKKworCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IHJlc2V0IHZhcmlhYmxlc1xuIik7CisJLyogcmVzZXQgIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAtIHNlcmlhbF9kcnYgKi8gCisJbWVtc2V0KCZzZXJpYWxfZHJ2LCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKKwlmb3IgKGk9MDsgaSA8IENQQ19UVFlfTlBPUlRTOyBpKyspeworCQltZW1zZXQoJmNwY190dHlfYXJlYVtpXSwwLCBzaXplb2Yoc3RfY3BjX3R0eV9hcmVhKSk7IAorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGVhMDdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogR29yYW1vIFBDSTIwMFNZTiBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEZvciBpbmZvcm1hdGlvbiBzZWUgaHR0cDovL2hxLnBtLndhdy5wbC9oZGxjLworICoKKyAqIFNvdXJjZXMgb2YgaW5mb3JtYXRpb246CisgKiAgICBIaXRhY2hpIEhENjQ1NzIgU0NBLUlJIFVzZXIncyBNYW51YWwKKyAqICAgIFBMWCBUZWNobm9sb2d5IEluYy4gUENJOTA1MiBEYXRhIEJvb2sKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJoZDY0NTcyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIkdvcmFtbyBQQ0kyMDBTWU4gZHJpdmVyIHZlcnNpb246IDEuMTYiOworc3RhdGljIGNvbnN0IGNoYXIqIGRldm5hbWUgPSAiUENJMjAwU1lOIjsKKworI3VuZGVmIERFQlVHX1BLVAorI2RlZmluZSBERUJVR19SSU5HUworCisjZGVmaW5lIFBDSTIwMFNZTl9QTFhfU0laRQkweDgwCS8qIFBMWCBjb250cm9sIHdpbmRvdyBzaXplICgxMjhiKSAqLworI2RlZmluZSBQQ0kyMDBTWU5fU0NBX1NJWkUJMHg0MDAJLyogU0NBIHdpbmRvdyBzaXplICgxS2IpICovCisjZGVmaW5lIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisjZGVmaW5lIE5FRURfREVURUNUX1JBTQorI2RlZmluZSBORUVEX1NDQV9NU0NJX0lOVFIKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUlMJCTEwCisKK3N0YXRpYyBpbnQgcGNpX2Nsb2NrX2ZyZXEgPSAzMzAwMDAwMDsKKyNkZWZpbmUgQ0xPQ0tfQkFTRSBwY2lfY2xvY2tfZnJlcQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfR09SQU1PCTB4MTBCNQkvKiB1c2VzIFBMWDo5MDUwIElEIC0gdGhpcyBjYXJkCSovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENJMjAwU1lOCTB4OTA1MAkvKiBkb2Vzbid0IGhhdmUgaXRzIG93biBJRAkqLworCisKKy8qCisgKiAgICAgIFBMWCBQQ0k5MDUyIGxvY2FsIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBydW50aW1lIHJlZ2lzdGVycy4KKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIDkwNTIgcmVnaXN0ZXJzIChtZW1vcnkgbWFwcGVkKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBsb2NfYWRkcl9yYW5nZVs0XTsJLyogMDAtMENoIDogTG9jYWwgQWRkcmVzcyBSYW5nZXMgKi8KKwl1MzIgbG9jX3JvbV9yYW5nZTsJLyogMTBoIDogTG9jYWwgUk9NIFJhbmdlICovCisJdTMyIGxvY19hZGRyX2Jhc2VbNF07CS8qIDE0LTIwaCA6IExvY2FsIEFkZHJlc3MgQmFzZSBBZGRycyAqLworCXUzMiBsb2Nfcm9tX2Jhc2U7CS8qIDI0aCA6IExvY2FsIFJPTSBCYXNlICovCisJdTMyIGxvY19idXNfZGVzY3JbNF07CS8qIDI4LTM0aCA6IExvY2FsIEJ1cyBEZXNjcmlwdG9ycyAqLworCXUzMiByb21fYnVzX2Rlc2NyOwkvKiAzOGggOiBST00gQnVzIERlc2NyaXB0b3IgKi8KKwl1MzIgY3NfYmFzZVs0XTsJCS8qIDNDLTQ4aCA6IENoaXAgU2VsZWN0IEJhc2UgQWRkcnMgKi8KKwl1MzIgaW50cl9jdHJsX3N0YXQ7CS8qIDRDaCA6IEludGVycnVwdCBDb250cm9sL1N0YXR1cyAqLworCXUzMiBpbml0X2N0cmw7CQkvKiA1MGggOiBFRVBST00gY3RybCwgSW5pdCBDdHJsLCBldGMgKi8KK31wbHg5MDUyOworCisKKwordHlwZWRlZiBzdHJ1Y3QgcG9ydF9zIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYXJkX3MgKmNhcmQ7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBUWCBsb2NrICovCisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJaW50IHJ4cGFydDsJCS8qIHBhcnRpYWwgZnJhbWUgcmVjZWl2ZWQsIG5leHQgZnJhbWUgaW52YWxpZCovCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXUxNiByeGluOwkJLyogcnggcmluZyBidWZmZXIgJ2luJyBwb2ludGVyICovCisJdTE2IHR4aW47CQkvKiB0eCByaW5nIGJ1ZmZlciAnaW4nIGFuZCAnbGFzdCcgcG9pbnRlcnMgKi8KKwl1MTYgdHhsYXN0OworCXU4IHJ4cywgdHhzLCB0bWM7CS8qIFNDQSByZWdpc3RlcnMgKi8KKwl1OCBwaHlfbm9kZTsJCS8qIHBoeXNpY2FsIHBvcnQgIyAtIDAgb3IgMSAqLworfXBvcnRfdDsKKworCisKK3R5cGVkZWYgc3RydWN0IGNhcmRfcyB7CisJdTggX19pb21lbSAqcmFtYmFzZTsJLyogYnVmZmVyIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLworCXU4IF9faW9tZW0gKnNjYWJhc2U7CS8qIFNDQSBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwlwbHg5MDUyIF9faW9tZW0gKnBseGJhc2U7LyogUExYIHJlZ2lzdGVycyBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KKwl1MTYgdHhfcmluZ19idWZmZXJzOworCXUxNiBidWZmX29mZnNldDsJLyogb2Zmc2V0IG9mIGZpcnN0IGJ1ZmZlciBvZiBmaXJzdCBjaGFubmVsICovCisJdTggaXJxOwkJCS8qIGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisKKwlwb3J0X3QgcG9ydHNbMl07Cit9Y2FyZF90OworCisKKyNkZWZpbmUgc2NhX2luKHJlZywgY2FyZCkJICAgICByZWFkYihjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXQodmFsdWUsIHJlZywgY2FyZCkgICAgd3JpdGViKHZhbHVlLCBjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9pbncocmVnLCBjYXJkKQkgICAgIHJlYWR3KGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX291dHcodmFsdWUsIHJlZywgY2FyZCkgICB3cml0ZXcodmFsdWUsIGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX2lubChyZWcsIGNhcmQpCSAgICAgcmVhZGwoY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2Ffb3V0bCh2YWx1ZSwgcmVnLCBjYXJkKSAgIHdyaXRlbCh2YWx1ZSwgY2FyZC0+c2NhYmFzZSArIChyZWcpKQorCisjZGVmaW5lIHBvcnRfdG9fY2FyZChwb3J0KQkgICAgIChwb3J0LT5jYXJkKQorI2RlZmluZSBsb2dfbm9kZShwb3J0KQkJICAgICAocG9ydC0+cGh5X25vZGUpCisjZGVmaW5lIHBoeV9ub2RlKHBvcnQpCQkgICAgIChwb3J0LT5waHlfbm9kZSkKKyNkZWZpbmUgd2luYmFzZShjYXJkKQkJICAgICAoY2FyZC0+cmFtYmFzZSkKKyNkZWZpbmUgZ2V0X3BvcnQoY2FyZCwgcG9ydCkJICAgICAoJmNhcmQtPnBvcnRzW3BvcnRdKQorI2RlZmluZSBzY2FfZmx1c2goY2FyZCkJCSAgICAgKHNjYV9pbihJRVIwLCBjYXJkKSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXdfbWVtY3B5X3RvaW8oY2hhciBfX2lvbWVtICpkZXN0LCBjaGFyICpzcmMsIGludCBsZW5ndGgpCit7CisJaW50IGxlbjsKKwlkbyB7CisJCWxlbiA9IGxlbmd0aCA+IDI1NiA/IDI1NiA6IGxlbmd0aDsKKwkJbWVtY3B5X3RvaW8oZGVzdCwgc3JjLCBsZW4pOworCQlkZXN0ICs9IGxlbjsKKwkJc3JjICs9IGxlbjsKKwkJbGVuZ3RoIC09IGxlbjsKKwkJcmVhZGIoZGVzdCk7CisJfSB3aGlsZSAobGVuKTsKK30KKworI3VuZGVmIG1lbWNweV90b2lvCisjZGVmaW5lIG1lbWNweV90b2lvIG5ld19tZW1jcHlfdG9pbworCisjaW5jbHVkZSAiaGQ2NDU3eC5jIgorCisKK3N0YXRpYyB2b2lkIHBjaTIwMF9zZXRfaWZhY2UocG9ydF90ICpwb3J0KQoreworCWNhcmRfdCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc2NhX291dChFWFNfVEVTMSwgKHBoeV9ub2RlKHBvcnQpID8gTVNDSTFfT0ZGU0VUIDogTVNDSTBfT0ZGU0VUKSArIEVYUywKKwkJcG9ydF90b19jYXJkKHBvcnQpKTsKKwlzd2l0Y2gocG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSkgeworCWNhc2UgQ0xPQ0tfSU5UOgorCQlyeHMgfD0gQ0xLX0JSRzsgLyogQlJHIG91dHB1dCAqLworCQl0eHMgfD0gQ0xLX1BJTl9PVVQgfCBDTEtfVFhfUlhDTEs7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UWElOVDoKKwkJcnhzIHw9IENMS19MSU5FOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX0JSRzsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6CisJCXJ4cyB8PSBDTEtfTElORTsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUElOX09VVCB8IENMS19UWF9SWENMSzsgLyogUlggY2xvY2sgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogRVhUZXJuYWwgY2xvY2sgKi8KKwkJcnhzIHw9IENMS19MSU5FOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX0xJTkU7IC8qIFRYQyBpbnB1dCAqLworCQlicmVhazsKKwl9CisKKwlwb3J0LT5yeHMgPSByeHM7CisJcG9ydC0+dHhzID0gdHhzOworCXNjYV9vdXQocnhzLCBtc2NpICsgUlhTLCBjYXJkKTsKKwlzY2Ffb3V0KHR4cywgbXNjaSArIFRYUywgY2FyZCk7CisJc2NhX3NldF9wb3J0KHBvcnQpOworfQorCisKKworc3RhdGljIGludCBwY2kyMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlpbnQgcmVzdWx0ID0gaGRsY19vcGVuKGRldik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXNjYV9vcGVuKGRldik7CisJcGNpMjAwX3NldF9pZmFjZShwb3J0KTsKKwlzY2FfZmx1c2gocG9ydF90b19jYXJkKHBvcnQpKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcGNpMjAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2NhX2Nsb3NlKGRldik7CisJc2NhX2ZsdXNoKHBvcnRfdG9fY2FyZChkZXZfdG9fcG9ydChkZXYpKSk7CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBwY2kyMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIG5ld19saW5lOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIF9fdXNlciAqbGluZSA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmM7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworI2lmZGVmIERFQlVHX1JJTkdTCisJaWYgKGNtZCA9PSBTSU9DREVWUFJJVkFURSkgeworCQlzY2FfZHVtcF9yaW5ncyhkZXYpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRToKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1YzNTsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIobGluZSwgJnBvcnQtPnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfSUZBQ0VfVjM1OgorCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gc3VjaCBjbG9jayBzZXR0aW5nICovCisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcG9ydC0+c2V0dGluZ3MsICZuZXdfbGluZSwgc2l6ZSk7IC8qIFVwZGF0ZSBzZXR0aW5ncyAqLworCQlwY2kyMDBfc2V0X2lmYWNlKHBvcnQpOworCQlzY2FfZmx1c2gocG9ydF90b19jYXJkKHBvcnQpKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZCBwY2kyMDBfcGNpX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisJY2FyZF90ICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAoY2FyZC0+cG9ydHNbaV0uY2FyZCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tpXSk7CisJCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJCX0KKworCWlmIChjYXJkLT5pcnEpCisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisKKwlpZiAoY2FyZC0+cmFtYmFzZSkKKwkJaW91bm1hcChjYXJkLT5yYW1iYXNlKTsKKwlpZiAoY2FyZC0+c2NhYmFzZSkKKwkJaW91bm1hcChjYXJkLT5zY2FiYXNlKTsKKwlpZiAoY2FyZC0+cGx4YmFzZSkKKwkJaW91bm1hcChjYXJkLT5wbHhiYXNlKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpZiAoY2FyZC0+cG9ydHNbMF0uZGV2KQorCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1swXS5kZXYpOworCWlmIChjYXJkLT5wb3J0c1sxXS5kZXYpCisJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzWzFdLmRldik7CisJa2ZyZWUoY2FyZCk7Cit9CisKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2kyMDBfcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwljYXJkX3QgKmNhcmQ7CisJdTggcmV2X2lkOworCXUzMiBfX2lvbWVtICpwOworCWludCBpOworCXUzMiByYW1zaXplOworCXUzMiByYW1waHlzOwkJLyogYnVmZmVyIG1lbW9yeSBiYXNlICovCisJdTMyIHNjYXBoeXM7CQkvKiBTQ0EgbWVtb3J5IGJhc2UgKi8KKwl1MzIgcGx4cGh5czsJCS8qIFBMWCByZWdpc3RlcnMgbWVtb3J5IGJhc2UgKi8KKworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwlpID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiUENJMjAwU1lOIik7CisJaWYgKGkpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gaTsKKwl9CisKKwljYXJkID0ga21hbGxvYyhzaXplb2YoY2FyZF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKGNhcmRfdCkpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwljYXJkLT5wb3J0c1swXS5kZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1swXSk7CisJY2FyZC0+cG9ydHNbMV0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMV0pOworCWlmICghY2FyZC0+cG9ydHNbMF0uZGV2IHx8ICFjYXJkLT5wb3J0c1sxXS5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldl9pZCk7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgIT0gUENJMjAwU1lOX1BMWF9TSVpFIHx8CisJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikgIT0gUENJMjAwU1lOX1NDQV9TSVpFIHx8CisJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykgPCAxNjM4NCkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogaW52YWxpZCBjYXJkIEVFUFJPTSBwYXJhbWV0ZXJzXG4iKTsKKwkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwbHhwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMCkgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWNhcmQtPnBseGJhc2UgPSBpb3JlbWFwKHBseHBoeXMsIFBDSTIwMFNZTl9QTFhfU0laRSk7CisKKwlzY2FwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMikgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWNhcmQtPnNjYWJhc2UgPSBpb3JlbWFwKHNjYXBoeXMsIFBDSTIwMFNZTl9TQ0FfU0laRSk7CisKKwlyYW1waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMykgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWNhcmQtPnJhbWJhc2UgPSBpb3JlbWFwKHJhbXBoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwzKSk7CisKKwlpZiAoY2FyZC0+cGx4YmFzZSA9PSBOVUxMIHx8CisJICAgIGNhcmQtPnNjYWJhc2UgPT0gTlVMTCB8fAorCSAgICBjYXJkLT5yYW1iYXNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJfQorCisJLyogUmVzZXQgUExYICovCisJcCA9ICZjYXJkLT5wbHhiYXNlLT5pbml0X2N0cmw7CisJd3JpdGVsKHJlYWRsKHApIHwgMHg0MDAwMDAwMCwgcCk7CisJcmVhZGwocCk7CQkvKiBGbHVzaCB0aGUgd3JpdGUgLSBkbyBub3QgdXNlIHNjYV9mbHVzaCAqLworCXVkZWxheSgxKTsKKworCXdyaXRlbChyZWFkbChwKSAmIH4weDQwMDAwMDAwLCBwKTsKKwlyZWFkbChwKTsJCS8qIEZsdXNoIHRoZSB3cml0ZSAtIGRvIG5vdCB1c2Ugc2NhX2ZsdXNoICovCisJdWRlbGF5KDEpOworCisJcmFtc2l6ZSA9IHNjYV9kZXRlY3RfcmFtKGNhcmQsIGNhcmQtPnJhbWJhc2UsCisJCQkJIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOworCisJLyogbnVtYmVyIG9mIFRYICsgUlggYnVmZmVycyBmb3Igb25lIHBvcnQgLSB0aGlzIGlzIGR1YWwgcG9ydCBjYXJkICovCisJaSA9IHJhbXNpemUgLyAoMiAqIChzaXplb2YocGt0X2Rlc2MpICsgSERMQ19NQVhfTVJVKSk7CisJY2FyZC0+dHhfcmluZ19idWZmZXJzID0gbWluKGkgLyAyLCBNQVhfVFhfQlVGRkVSUyk7CisJY2FyZC0+cnhfcmluZ19idWZmZXJzID0gaSAtIGNhcmQtPnR4X3JpbmdfYnVmZmVyczsKKworCWNhcmQtPmJ1ZmZfb2Zmc2V0ID0gMiAqIHNpemVvZihwa3RfZGVzYykgKiAoY2FyZC0+dHhfcmluZ19idWZmZXJzICsKKwkJCQkJCSAgICBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAicGNpMjAwc3luOiAldSBLQiBSQU0gYXQgMHgleCwgSVJRJXUsIHVzaW5nICV1IFRYICsiCisJICAgICAgICIgJXUgUlggcGFja2V0cyByaW5nc1xuIiwgcmFtc2l6ZSAvIDEwMjQsIHJhbXBoeXMsCisJICAgICAgIHBkZXYtPmlycSwgY2FyZC0+dHhfcmluZ19idWZmZXJzLCBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJaWYgKGNhcmQtPnR4X3JpbmdfYnVmZmVycyA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IFJBTSB0ZXN0IGZhaWxlZFxuIik7CisJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBicmlkZ2UgKi8KKwlwID0gJmNhcmQtPnBseGJhc2UtPmludHJfY3RybF9zdGF0OworCXdyaXRldyhyZWFkdyhwKSB8IDB4MDA0MCwgcCk7CisKKwkvKiBBbGxvY2F0ZSBJUlEgKi8KKwlpZihyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNjYV9pbnRyLCBTQV9TSElSUSwgZGV2bmFtZSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNpMjAwc3luOiBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkgICAgICAgcGRldi0+aXJxKTsKKwkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljYXJkLT5pcnEgPSBwZGV2LT5pcnE7CisKKwlzY2FfaW5pdChjYXJkLCAwKTsKKworCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbaV07CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCQlwb3J0LT5waHlfbm9kZSA9IGk7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+aXJxID0gY2FyZC0+aXJxOworCQlkZXYtPm1lbV9zdGFydCA9IHJhbXBoeXM7CisJCWRldi0+bWVtX2VuZCA9IHJhbXBoeXMgKyByYW1zaXplIC0gMTsKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSA1MDsKKwkJZGV2LT5kb19pb2N0bCA9IHBjaTIwMF9pb2N0bDsKKwkJZGV2LT5vcGVuID0gcGNpMjAwX29wZW47CisJCWRldi0+c3RvcCA9IHBjaTIwMF9jbG9zZTsKKwkJaGRsYy0+YXR0YWNoID0gc2NhX2F0dGFjaDsKKwkJaGRsYy0+eG1pdCA9IHNjYV94bWl0OworCQlwb3J0LT5zZXR0aW5ncy5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOworCQlwb3J0LT5jYXJkID0gY2FyZDsKKwkJaWYocmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IHVuYWJsZSB0byByZWdpc3RlciBoZGxjICIKKwkJCSAgICAgICAiZGV2aWNlXG4iKTsKKwkJCXBvcnQtPmNhcmQgPSBOVUxMOworCQkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCXNjYV9pbml0X3N5bmNfcG9ydChwb3J0KTsJLyogU2V0IHVwIFNDQSBtZW1vcnkgKi8KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENJMjAwU1lOIG5vZGUgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBvcnQtPnBoeV9ub2RlKTsKKwl9CisKKwlzY2FfZmx1c2goY2FyZCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpMjAwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9HT1JBTU8sIFBDSV9ERVZJQ0VfSURfUENJMjAwU1lOLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpMjAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIlBDSTIwMFNZTiIsCisJLmlkX3RhYmxlCT0gcGNpMjAwX3BjaV90YmwsCisJLnByb2JlCQk9IHBjaTIwMF9wY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBwY2kyMDBfcGNpX3JlbW92ZV9vbmUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHBjaTIwMF9pbml0X21vZHVsZSh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKyNlbmRpZgorCWlmIChwY2lfY2xvY2tfZnJlcSA8IDEwMDAwMDAgfHwgcGNpX2Nsb2NrX2ZyZXEgPiA4MDAwMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogSW52YWxpZCBQQ0kgY2xvY2sgZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnBjaTIwMF9wY2lfZHJpdmVyKTsKK30KKworCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2kyMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaTIwMF9wY2lfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR29yYW1vIFBDSTIwMFNZTiBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2kyMDBfcGNpX3RibCk7Cittb2R1bGVfcGFyYW0ocGNpX2Nsb2NrX2ZyZXEsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjaV9jbG9ja19mcmVxLCAiU3lzdGVtIFBDSSBjbG9jayBmcmVxdWVuY3kgaW4gSHoiKTsKK21vZHVsZV9pbml0KHBjaTIwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwY2kyMDBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyYzc5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKQEAgLTAsMCArMSwxNzM1IEBACisvKiBzYm5pLmM6ICBHcmFuY2ggU0JOSTEyIGxlYXNlZCBsaW5lIGFkYXB0ZXJzIGRyaXZlciBmb3IgbGludXgKKyAqCisgKglXcml0dGVuIDIwMDEgYnkgRGVuaXMgSS5UaW1vZmVldiAodGltb2ZlZXZAZ3JhbmNoLnJ1KQorICoKKyAqCVByZXZpb3VzIHZlcnNpb25zIHdlcmUgd3JpdHRlbiBieSBZYXJvc2xhdiBQb2x5YWtvdiwKKyAqCUFsZXhleSBadmVyZXYgYW5kIE1heCBLaG9uLgorICoKKyAqCURyaXZlciBzdXBwb3J0cyBTQk5JMTItMDIsLTA0LC0wNSwtMTAsLTExIGNhcmRzLCBzaW5nbGUgYW5kCisgKglkb3VibGUtY2hhbm5lbCwgUENJIGFuZCBJU0EgbW9kaWZpY2F0aW9ucy4KKyAqCU1vcmUgaW5mbyBhbmQgdXNlZnVsIHV0aWxpdGllcyB0byB3b3JrIHdpdGggU0JOSTEyIGNhcmRzIHlvdSBjYW4gZmluZAorICoJYXQgaHR0cDovL3d3dy5ncmFuY2guY29tIChFbmdsaXNoKSBvciBodHRwOi8vd3d3LmdyYW5jaC5ydSAoUnVzc2lhbikKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICoKKyAqICA1LjAuMQlKdW4gMjIgMjAwMQorICoJICAtIEZpeGVkIGJ1ZyBpbiBwcm9iZQorICogIDUuMC4wCUp1biAwNiAyMDAxCisgKgkgIC0gRHJpdmVyIHdhcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYnkgRGVuaXMgSS5UaW1vZmVldiwKKyAqCSAgLSBub3cgUENJL0R1YWwsIElTQS9EdWFsICh3aXRoIHNpbmdsZSBpbnRlcnJ1cHQgbGluZSkgbW9kZWxzIGFyZQorICoJICAtIHN1cHBvcnRlZAorICogIDMuMy4wCVRodSBGZWIgMjQgMjE6MzA6MjggTk9WVCAyMDAwIAorICogICAgICAgIC0gUENJIGNhcmRzIHN1cHBvcnQKKyAqICAzLjIuMAlNb24gRGVjIDEzIDIyOjI2OjUzIE5PVlQgMTk5OQorICogCSAgLSBDb21wbGV0ZWx5IHJlYnVpbHQgYWxsIHRoZSBwYWNrZXQgc3RvcmFnZSBzeXN0ZW0KKyAqIAkgIC0gICAgdG8gd29yayBpbiBFdGhlcm5ldC1saWtlIHN0eWxlLgorICogIDMuMS4xCWp1c3QgZml4ZWQgc29tZSBidWdzICg1IGF1ZyAxOTk5KQorICogIDMuMS4wCWFkZGVkIGJhbGFuY2luZyBmZWF0dXJlCSgyNiBhcHIgMTk5OSkKKyAqICAzLjAuMQlqdXN0IGZpeGVkIHNvbWUgYnVncyAoMTQgYXByIDE5OTkpLgorICogIDMuMC4wCUluaXRpYWwgUmV2aXNpb24sIFlhcm9zbGF2IFBvbHlha292ICgyNCBGZWIgMTk5OSkKKyAqICAgICAgICAtIGFkZGVkIHByZS1jYWxjdWxhdGlvbiBmb3IgQ1JDLCBmaXhlZCBidWcgd2l0aCAibGVuLTIiIGZyYW1lcywgCisgKiAgICAgICAgLSByZW1vdmVkIG91dGJvdW5kIGZyYWdtZW50YXRpb24gKE1UVT0xMDAwKSwgd3JpdHRlbiBDUkMtY2FsY3VsYXRpb24gCisgKiAgICAgICAgLSBvbiBhc20sIGFkZGVkIHdvcmsgd2l0aCBoYXJkX2hlYWRlcnMgYW5kIG5vdyB3ZSBoYXZlIG91ciBvd24gY2FjaGUgCisgKiAgICAgICAgLSBmb3IgdGhlbSwgb3B0aW9uYWxseSBzdXBwb3J0ZWQgd29yZC1pbnRlcmNoYW5nZSBvbiBzb21lIGNoaXBzZXRzLAorICogCisgKglLbm93biBwcm9ibGVtOiB0aGlzIGRyaXZlciB3YXNuJ3QgdGVzdGVkIG9uIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic2JuaS5oIgorCisvKiBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCisKK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOworCisJc3BpbmxvY2tfdAlsb2NrOworCXN0cnVjdCBza19idWZmICAqcnhfYnVmX3A7CQkvKiByZWNlaXZlIGJ1ZmZlciBwdHIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAgKnR4X2J1Zl9wOwkJLyogdHJhbnNtaXQgYnVmZmVyIHB0ciAqLworCQorCXVuc2lnbmVkIGludAlmcmFtZWxlbjsJCS8qIGN1cnJlbnQgZnJhbWUgbGVuZ3RoICovCisJdW5zaWduZWQgaW50CW1heGZyYW1lOwkJLyogbWF4aW11bSB2YWxpZCBmcmFtZSBsZW5ndGggKi8KKwl1bnNpZ25lZCBpbnQJc3RhdGU7CisJdW5zaWduZWQgaW50CWlucHBvcywgb3V0cG9zOwkJLyogcG9zaXRpb25zIGluIHJ4L3R4IGJ1ZmZlcnMgKi8KKworCS8qIHRyYW5zbWl0dGluZyBmcmFtZSBudW1iZXIgLSBmcm9tIGZyYW1lcyBxdHkgdG8gMSAqLworCXVuc2lnbmVkIGludAl0eF9mcmFtZW5vOworCisJLyogZXhwZWN0ZWQgbnVtYmVyIG9mIG5leHQgcmVjZWl2aW5nIGZyYW1lICovCisJdW5zaWduZWQgaW50CXdhaXRfZnJhbWVubzsKKworCS8qIGNvdW50IG9mIGZhaWxlZCBhdHRlbXB0cyB0byBmcmFtZSBzZW5kIC0gMzIgYXR0ZW1wdHMgZG8gYmVmb3JlCisJICAgZXJyb3IgLSB3aGlsZSByZWNlaXZlciB0dW5lcyBvbiBvcHBvc2l0ZSBzaWRlIG9mIHdpcmUgKi8KKwl1bnNpZ25lZCBpbnQJdHJhbnNfZXJyb3JzOworCisJLyogaWRsZSB0aW1lOyBzZW5kIHBvbmcgd2hlbiBsaW1pdCBleGNlZWRlZCAqLworCXVuc2lnbmVkIGludAl0aW1lcl90aWNrczsKKworCS8qIGZpZWxkcyB1c2VkIGZvciByZWNlaXZlIGxldmVsIGF1dG9zZWxlY3Rpb24gKi8KKwlpbnQJZGVsdGFfcnhsOworCXVuc2lnbmVkIGludAljdXJfcnhsX2luZGV4LCB0aW1lb3V0X3J4bDsKKwl1bnNpZ25lZCBsb25nCWN1cl9yeGxfcmN2ZCwgcHJldl9yeGxfcmN2ZDsKKworCXN0cnVjdCBzYm5pX2NzcjEJY3NyMTsJCS8qIGN1cnJlbnQgdmFsdWUgb2YgQ1NSMSAqLworCXN0cnVjdCBzYm5pX2luX3N0YXRzCWluX3N0YXRzOyAJLyogaW50ZXJuYWwgc3RhdGlzdGljcyAqLyAKKworCXN0cnVjdCBuZXRfZGV2aWNlCQkqc2Vjb25kOwkvKiBmb3IgSVNBL2R1YWwgY2FyZHMgKi8KKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCXN0cnVjdCBuZXRfZGV2aWNlCQkqbWFzdGVyOworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbGluazsKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50ICBzYm5pX2NhcmRfcHJvYmUoIHVuc2lnbmVkIGxvbmcgKTsKK3N0YXRpYyBpbnQgIHNibmlfcGNpX3Byb2JlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKiApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICAqc2JuaV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyBpbnQgIHNibmlfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICBzYm5pX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50ICk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICpzYm5pX2dldF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2JuaV9pbnRlcnJ1cHQoIGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqICk7CitzdGF0aWMgdm9pZCAgaGFuZGxlX2NoYW5uZWwoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgICByZWN2X2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgc2VuZF9mcmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgIHVwbG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCB1MzIgKTsKK3N0YXRpYyB2b2lkICBkb3dubG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgKiApOworc3RhdGljIHZvaWQgIHNibmlfd2F0Y2hkb2coIHVuc2lnbmVkIGxvbmcgKTsKK3N0YXRpYyB2b2lkICBpbnRlcnByZXRfYWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCApOworc3RhdGljIGludCAgIGFwcGVuZF9mcmFtZV90b19wa3QoIHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkLCB1MzIgKTsKK3N0YXRpYyB2b2lkICBpbmRpY2F0ZV9wa3QoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkICBjYXJkX3N0YXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgcHJlcGFyZV90b19zZW5kKCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgZHJvcF94bWl0X3F1ZXVlKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgc2VuZF9mcmFtZV9oZWFkZXIoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiAqICk7CitzdGF0aWMgaW50ICAgc2tpcF90YWlsKCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdTMyICk7CitzdGF0aWMgaW50ICAgY2hlY2tfZmhkciggdTMyLCB1MzIgKiwgdTMyICosIHUzMiAqLCB1MzIgKiwgdTMyICogKTsKK3N0YXRpYyB2b2lkICBjaGFuZ2VfbGV2ZWwoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkICB0aW1lb3V0X2NoYW5nZV9sZXZlbCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHUzMiAgIGNhbGNfY3JjMzIoIHUzMiwgdTggKiwgdTMyICk7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKiAgZ2V0X3J4X2J1Ziggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9pbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKK3N0YXRpYyBpbnQgIGVuc2xhdmUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIGVtYW5jaXBhdGUoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgQVNNX0NSQyAxCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgIHZlcnNpb25bXSA9CisJIkdyYW5jaCBTQk5JMTIgZHJpdmVyIHZlciA1LjAuMSAgSnVuIDIyIDIwMDEgIERlbmlzIEkuVGltb2ZlZXYuXG4iOworCitzdGF0aWMgaW50ICBza2lwX3BjaV9wcm9iZQlfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgIHNjYW5kb25lCV9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCAgbnVtCQlfX2luaXRkYXRhID0gMDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgIHJ4bF90YWJbXTsKK3N0YXRpYyB1MzIgIGNyYzMydGFiW107CisKKy8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIGRldmljZXMsIGZvciByZW1vdmluZyB0aGUgZHJpdmVyIG1vZHVsZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAgKnNibmlfY2FyZHNbIFNCTklfTUFYX05VTV9DQVJEUyBdOworCisvKiBMaXN0cyBvZiBkZXZpY2UncyBwYXJhbWV0ZXJzICovCitzdGF0aWMgdTMyCWlvWyAgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGEgPQorCXsgWzAgLi4uIFNCTklfTUFYX05VTV9DQVJEUy0xXSA9IC0xIH07CitzdGF0aWMgdTMyCWlycVsgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyCWJhdWRbIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyCXJ4bFsgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGEgPQorCXsgWzAgLi4uIFNCTklfTUFYX05VTV9DQVJEUy0xXSA9IC0xIH07CitzdGF0aWMgdTMyCW1hY1sgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CisKKyNpZm5kZWYgTU9EVUxFCit0eXBlZGVmIHUzMiAgaWFycltdOworc3RhdGljIGlhcnIgX19pbml0ZGF0YSAqZGVzdFs1XSA9IHsgJmlvLCAmaXJxLCAmYmF1ZCwgJnJ4bCwgJm1hYyB9OworI2VuZGlmCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQgb24gSVNBIGJ1cyAqLworc3RhdGljIHVuc2lnbmVkIGludCAgbmV0Y2FyZF9wb3J0bGlzdFsgXSBfX2luaXRkYXRhID0geyAKKwkweDIxMCwgMHgyMTQsIDB4MjIwLCAweDIyNCwgMHgyMzAsIDB4MjM0LCAweDI0MCwgMHgyNDQsIDB4MjUwLCAweDI1NCwKKwkweDI2MCwgMHgyNjQsIDB4MjcwLCAweDI3NCwgMHgyODAsIDB4Mjg0LCAweDI5MCwgMHgyOTQsIDB4MmEwLCAweDJhNCwKKwkweDJiMCwgMHgyYjQsIDB4MmMwLCAweDJjNCwgMHgyZDAsIDB4MmQ0LCAweDJlMCwgMHgyZTQsIDB4MmYwLCAweDJmNCwKKwkwIH07CisKKworLyoKKyAqIExvb2sgZm9yIFNCTkkgY2FyZCB3aGljaCBhZGRyIHN0b3JlZCBpbiBkZXYtPmJhc2VfYWRkciwgaWYgbm9uemVyby4KKyAqIE90aGVyd2lzZSwgbG9vayB0aHJvdWdoIFBDSSBidXMuIElmIG5vbmUgUENJLWNhcmQgd2FzIGZvdW5kLCBzY2FuIElTQS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK3NibmlfaXNhX3Byb2JlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJaWYoIGRldi0+YmFzZV9hZGRyID4gMHgxZmYKKwkgICAgJiYgIHJlcXVlc3RfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQsIGRldi0+bmFtZSApCisJICAgICYmICBzYm5pX3Byb2JlMSggZGV2LCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEgKSApCisKKwkJcmV0dXJuICAwOworCWVsc2UgeworCQlwcmludGsoIEtFUk5fRVJSICJzYm5pOiBiYXNlIGFkZHJlc3MgMHglbHggaXMgYnVzeSwgb3IgYWRhcHRlciAiCisJCQkiaXMgbWFsZnVuY3Rpb25hbCFcbiIsIGRldi0+YmFzZV9hZGRyICk7CisJCXJldHVybiAgLUVOT0RFVjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYm5pX2RldnNldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXRoZXJfc2V0dXAoIGRldiApOworCWRldi0+b3BlbgkJPSAmc2JuaV9vcGVuOworCWRldi0+c3RvcAkJPSAmc2JuaV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZzYm5pX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gJnNibmlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0CT0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmRvX2lvY3RsCQk9ICZzYm5pX2lvY3RsOworCisJU0VUX01PRFVMRV9PV05FUiggZGV2ICk7Cit9CisKK2ludCBfX2luaXQgc2JuaV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyB1bnNpZ25lZCAgdmVyc2lvbl9wcmludGVkIF9faW5pdGRhdGEgPSAwOworCWludCBlcnI7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCAic2JuaSIsIHNibmlfZGV2c2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAic2JuaSVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IHNibmlfaW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYoIHZlcnNpb25fcHJpbnRlZCsrID09IDAgKQorCQlwcmludGsoIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNibmlfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCAgaTsKKwlpZiggZGV2LT5iYXNlX2FkZHIgKQorCQlyZXR1cm4gIHNibmlfaXNhX3Byb2JlKCBkZXYgKTsKKwkvKiBvdGhlcndpc2Ugd2UgaGF2ZSB0byBwZXJmb3JtIHNlYXJjaCBvdXIgYWRhcHRlciAqLworCisJaWYoIGlvWyBudW0gXSAhPSAtMSApCisJCWRldi0+YmFzZV9hZGRyCT0gaW9bIG51bSBdLAorCQlkZXYtPmlycQk9IGlycVsgbnVtIF07CisJZWxzZSBpZiggc2NhbmRvbmUgIHx8ICBpb1sgMCBdICE9IC0xICkKKwkJcmV0dXJuICAtRU5PREVWOworCisJLyogaWYgaW9bIG51bSBdIGNvbnRhaW5zIG5vbi16ZXJvIGFkZHJlc3MsIHRoZW4gdGhhdCBpcyBvbiBJU0EgYnVzICovCisJaWYoIGRldi0+YmFzZV9hZGRyICkKKwkJcmV0dXJuICBzYm5pX2lzYV9wcm9iZSggZGV2ICk7CisKKwkvKiAuLi5vdGhlcndpc2UgLSBzY2FuIFBDSSBmaXJzdCAqLworCWlmKCAhc2tpcF9wY2lfcHJvYmUgICYmICAhc2JuaV9wY2lfcHJvYmUoIGRldiApICkKKwkJcmV0dXJuICAwOworCisJaWYoIGlvWyBudW0gXSA9PSAtMSApIHsKKwkJLyogQXV0by1zY2FuIHdpbGwgYmUgc3RvcHBlZCB3aGVuIGZpcnN0IElTQSBjYXJkIHdlcmUgZm91bmQgKi8KKwkJc2NhbmRvbmUgPSAxOworCQlpZiggbnVtID4gMCApCisJCQlyZXR1cm4gIC1FTk9ERVY7CisJfQorCisJZm9yKCBpID0gMDsgIG5ldGNhcmRfcG9ydGxpc3RbIGkgXTsgICsraSApIHsKKwkJaW50ICBpb2FkZHIgPSBuZXRjYXJkX3BvcnRsaXN0WyBpIF07CisJCWlmKCByZXF1ZXN0X3JlZ2lvbiggaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCwgZGV2LT5uYW1lICkKKwkJICAgICYmICBzYm5pX3Byb2JlMSggZGV2LCBpb2FkZHIsIDAgKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAgLUVOT0RFVjsKK30KKworCitpbnQgX19pbml0CitzYm5pX3BjaV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBwY2lfZGV2ICAqcGRldiA9IE5VTEw7CisKKwl3aGlsZSggKHBkZXYgPSBwY2lfZ2V0X2NsYXNzKCBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUiA8PCA4LCBwZGV2ICkpCisJICAgICAgICE9IE5VTEwgKSB7CisJCWludCAgcGNpX2lycV9saW5lOworCQl1bnNpZ25lZCBsb25nICBwY2lfaW9hZGRyOworCQl1MTYgIHN1YnN5czsKKworCQlpZiggcGRldi0+dmVuZG9yICE9IFNCTklfUENJX1ZFTkRPUgorCQkgICAgJiYgIHBkZXYtPmRldmljZSAhPSBTQk5JX1BDSV9ERVZJQ0UgKQorCQkJCWNvbnRpbnVlOworCisJCXBjaV9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoIHBkZXYsIDAgKTsKKwkJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCisJCS8qIEF2b2lkIGFscmVhZHkgZm91bmQgY2FyZHMgZnJvbSBwcmV2aW91cyBjYWxscyAqLworCQlpZiggIXJlcXVlc3RfcmVnaW9uKCBwY2lfaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCwgZGV2LT5uYW1lICkgKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCggcGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5cyApOworCisJCQlpZiAoc3Vic3lzICE9IDIpCisJCQkJY29udGludWU7CisKKwkJCS8qIER1YWwgYWRhcHRlciBpcyBwcmVzZW50ICovCisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaV9pb2FkZHIgKz0gNCwgU0JOSV9JT19FWFRFTlQsCisJCQkJCQkJZGV2LT5uYW1lICkgKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYoIHBjaV9pcnFfbGluZSA8PSAwICB8fCAgcGNpX2lycV9saW5lID49IE5SX0lSUVMgKQorCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIiAgV0FSTklORzogVGhlIFBDSSBCSU9TIGFzc2lnbmVkICIKKwkJCQkidGhpcyBQQ0kgY2FyZCB0byBJUlEgJWQsIHdoaWNoIGlzIHVubGlrZWx5ICIKKwkJCQkidG8gd29yayEuXG4iCisJCQkJS0VSTl9XQVJOSU5HICIgWW91IHNob3VsZCB1c2UgdGhlIFBDSSBCSU9TICIKKwkJCQkic2V0dXAgdG8gYXNzaWduIGEgdmFsaWQgSVJRIGxpbmUuXG4iLAorCQkJCXBjaV9pcnFfbGluZSApOworCisJCS8qIGF2b2lkaW5nIHJlLWVuYWJsZSBkdWFsIGFkYXB0ZXJzICovCisJCWlmKCAocGNpX2lvYWRkciAmIDcpID09IDAgICYmICBwY2lfZW5hYmxlX2RldmljZSggcGRldiApICkgeworCQkJcmVsZWFzZV9yZWdpb24oIHBjaV9pb2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCQlwY2lfZGV2X3B1dCggcGRldiApOworCQkJcmV0dXJuICAtRUlPOworCQl9CisJCWlmKCBzYm5pX3Byb2JlMSggZGV2LCBwY2lfaW9hZGRyLCBwY2lfaXJxX2xpbmUgKSApIHsKKwkJCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJCQkvKiBub3QgdGhlIGJlc3QgdGhpbmcgdG8gZG8sIGJ1dCB0aGlzIGlzIGFsbCBtZXNzZWQgdXAgCisJCQkgICBmb3IgaG90cGx1ZyBzeXN0ZW1zIGFueXdheS4uLiAqLworCQkJcGNpX2Rldl9wdXQoIHBkZXYgKTsKKwkJCXJldHVybiAgMDsKKwkJfQorCX0KKwlyZXR1cm4gIC1FTk9ERVY7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0CitzYm5pX3Byb2JlMSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCBsb25nICBpb2FkZHIsICBpbnQgIGlycSApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sOworCisJaWYoIHNibmlfY2FyZF9wcm9iZSggaW9hZGRyICkgKSB7CisJCXJlbGVhc2VfcmVnaW9uKCBpb2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCXJldHVybiBOVUxMOworCX0KKworCW91dGIoIDAsIGlvYWRkciArIENTUjAgKTsKKworCWlmKCBpcnEgPCAyICkgeworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrOworCisJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCW91dGIoIEVOX0lOVCB8IFRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCQlvdXRiKCBQUl9SRVMsIGlvYWRkciArIENTUjEgKTsKKwkJbWRlbGF5KDUwKTsKKwkJaXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCW91dGIoIDAsIGlvYWRkciArIENTUjAgKTsKKworCQlpZiggIWlycSApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgIiVzOiBjYW4ndCBkZXRlY3QgZGV2aWNlIGlycSFcbiIsCisJCQkJZGV2LT5uYW1lICk7CisJCQlyZWxlYXNlX3JlZ2lvbiggaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgaWYoIGlycSA9PSAyICkKKwkJaXJxID0gOTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogQWxsb2NhdGUgZGV2LT5wcml2IGFuZCBmaWxsIGluIHNibmktc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlubCA9IGRldi0+cHJpdjsKKwlpZiggIW5sICkgeworCQlwcmludGsoIEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkhXG4iLCBkZXYtPm5hbWUgKTsKKwkJcmVsZWFzZV9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2LT5wcml2ID0gbmw7CisJbWVtc2V0KCBubCwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpICk7CisJc3Bpbl9sb2NrX2luaXQoICZubC0+bG9jayApOworCisJLyogc3RvcmUgTUFDIGFkZHJlc3MgKGdlbmVyYXRlIGlmIHRoYXQgaXNuJ3Qga25vd24pICovCisJKih1MTYgKilkZXYtPmRldl9hZGRyID0gaHRvbnMoIDB4MDBmZiApOworCSoodTMyICopKGRldi0+ZGV2X2FkZHIgKyAyKSA9IGh0b25sKCAweDAxMDAwMDAwIHwKKwkJKCAobWFjW251bV0gID8gIG1hY1tudW1dICA6ICAodTMyKSgobG9uZylkZXYtPnByaXYpKSAmIDB4MDBmZmZmZmYpICk7CisKKwkvKiBzdG9yZSBsaW5rIHNldHRpbmdzIChzcGVlZCwgcmVjZWl2ZSBsZXZlbCApICovCisJbmwtPm1heGZyYW1lICA9IERFRkFVTFRfRlJBTUVfTEVOOworCW5sLT5jc3IxLnJhdGUgPSBiYXVkWyBudW0gXTsKKworCWlmKCAobmwtPmN1cl9yeGxfaW5kZXggPSByeGxbIG51bSBdKSA9PSAtMSApCisJCS8qIGF1dG90dW5lIHJ4bCAqLworCQlubC0+Y3VyX3J4bF9pbmRleCA9IERFRl9SWEwsCisJCW5sLT5kZWx0YV9yeGwgPSBERUZfUlhMX0RFTFRBOworCWVsc2UKKwkJbmwtPmRlbHRhX3J4bCA9IDA7CisJbmwtPmNzcjEucnhsICA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4IF07CisJaWYoIGluYiggaW9hZGRyICsgQ1NSMCApICYgMHgwMSApCisJCW5sLT5zdGF0ZSB8PSBGTF9TTE9XX01PREU7CisKKwlwcmludGsoIEtFUk5fTk9USUNFICIlczogaW9hZGRyICUjbHgsIGlycSAlZCwgIgorCQkiTUFDOiAwMDpmZjowMTolMDJ4OiUwMng6JTAyeFxuIiwgCisJCWRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCQkoKHU4ICopIGRldi0+ZGV2X2FkZHIpIFszXSwKKwkJKCh1OCAqKSBkZXYtPmRldl9hZGRyKSBbNF0sCisJCSgodTggKikgZGV2LT5kZXZfYWRkcikgWzVdICk7CisKKwlwcmludGsoIEtFUk5fTk9USUNFICIlczogc3BlZWQgJWQsIHJlY2VpdmUgbGV2ZWwgIiwgZGV2LT5uYW1lLAorCQkoIChubC0+c3RhdGUgJiBGTF9TTE9XX01PREUpICA/ICA1MDAwMDAgOiAyMDAwMDAwKQorCQkvICgxIDw8IG5sLT5jc3IxLnJhdGUpICk7CisKKwlpZiggbmwtPmRlbHRhX3J4bCA9PSAwICkKKwkJcHJpbnRrKCAiMHgleCAoZml4ZWQpXG4iLCBubC0+Y3VyX3J4bF9pbmRleCApOyAKKwllbHNlCisJCXByaW50ayggIihhdXRvKVxuIik7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlubC0+bWFzdGVyID0gZGV2OworCW5sLT5saW5rICAgPSBOVUxMOworI2VuZGlmCisgICAKKwlzYm5pX2NhcmRzWyBudW0rKyBdID0gZGV2OworCXJldHVybiAgZGV2OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisKK3N0YXRpYyBpbnQKK3Nibmlfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgICpza2IsICBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICpwOworCisJbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisKKwkvKiBMb29raW5nIGZvciBpZGxlIGRldmljZSBpbiB0aGUgbGlzdCAqLworCWZvciggcCA9IGRldjsgIHA7ICkgeworCQlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBwLT5wcml2OworCQlzcGluX2xvY2soICZubC0+bG9jayApOworCQlpZiggbmwtPnR4X2J1Zl9wICB8fCAgKG5sLT5zdGF0ZSAmIEZMX0xJTkVfRE9XTikgKSB7CisJCQlwID0gbmwtPmxpbms7CisJCQlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJCX0gZWxzZSB7CisJCQkvKiBJZGxlIGRldiBpcyBmb3VuZCAqLworCQkJcHJlcGFyZV90b19zZW5kKCBza2IsIHAgKTsKKwkJCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKwkJCXJldHVybiAgMDsKKwkJfQorCX0KKworCXJldHVybiAgMTsKK30KKworI2Vsc2UJLyogQ09ORklHX1NCTklfTVVMVElMSU5FICovCisKK3N0YXRpYyBpbnQKK3Nibmlfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgICpza2IsICBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCXNwaW5fbG9jayggJm5sLT5sb2NrICk7CisKKwlwcmVwYXJlX3RvX3NlbmQoIHNrYiwgZGV2ICk7CisKKwlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJcmV0dXJuICAwOworfQorCisjZW5kaWYJLyogQ09ORklHX1NCTklfTVVMVElMSU5FICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGludGVycnVwdCBoYW5kbGVyICovCisKKy8qCisgKiAJU0JOSTEyRC0xMCwgLTExL0lTQSBib2FyZHMgd2l0aGluICJjb21tb24gaW50ZXJydXB0IiBtb2RlIGNvdWxkIG5vdAorICogYmUgbG9va2VkIGFzIHR3byBpbmRlcGVuZGVudCBzaW5nbGUtY2hhbm5lbCBkZXZpY2VzLiBFdmVyeSBjaGFubmVsIHNlZW1zCisgKiBhcyBFdGhlcm5ldCBpbnRlcmZhY2UgYnV0IGludGVycnVwdCBoYW5kbGVyIG11c3QgYmUgY29tbW9uLiBSZWFsbHksIGZpcnN0CisgKiBjaGFubmVsICgibWFzdGVyIikgZHJpdmVyIG9ubHkgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyLiBJbiBpdHMgc3RydWN0IG5ldF9sb2NhbAorICogaXQgaGFzIGdvdCBwb2ludGVyIHRvICJzbGF2ZSIgY2hhbm5lbCdzIHN0cnVjdCBuZXRfbG9jYWwgYW5kIGhhbmRsZXMgdGhhdCdzCisgKiBpbnRlcnJ1cHRzIHRvby4KKyAqCWRldiBvZiBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgSVNBIFNCTkkgYm9hcmRzIGlzIGxpbmtlZCB0byBsaXN0LgorICogV2hpbGUgbmV4dCBib2FyZCBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQsIGl0IHNjYW5zIHRoaXMgbGlzdC4gSWYgb25lCisgKiBoYXMgZm91bmQgZGV2IHdpdGggc2FtZSBpcnEgYW5kIGlvYWRkciBkaWZmZXJlbnQgYnkgNCB0aGVuIGl0IGFzc3VtZXMKKyAqIHRoaXMgYm9hcmQgdG8gYmUgIm1hc3RlciIuCisgKi8gCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorc2JuaV9pbnRlcnJ1cHQoIGludCAgaXJxLCAgdm9pZCAgKmRldl9pZCwgIHN0cnVjdCBwdF9yZWdzICAqcmVncyApCit7CisJc3RydWN0IG5ldF9kZXZpY2UJICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWludAlyZXBlYXQ7CisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCWlmKCBubC0+c2Vjb25kICkKKwkJc3Bpbl9sb2NrKCAmKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5zZWNvbmQtPnByaXYpLT5sb2NrICk7CisKKwlkbyB7CisJCXJlcGVhdCA9IDA7CisJCWlmKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApICYgKFJDX1JEWSB8IFRSX1JEWSkgKQorCQkJaGFuZGxlX2NoYW5uZWwoIGRldiApLAorCQkJcmVwZWF0ID0gMTsKKwkJaWYoIG5sLT5zZWNvbmQgICYmIAkvKiBzZWNvbmQgY2hhbm5lbCBwcmVzZW50ICovCisJCSAgICAoaW5iKCBubC0+c2Vjb25kLT5iYXNlX2FkZHIrQ1NSMCApICYgKFJDX1JEWSB8IFRSX1JEWSkpICkKKwkJCWhhbmRsZV9jaGFubmVsKCBubC0+c2Vjb25kICksCisJCQlyZXBlYXQgPSAxOworCX0gd2hpbGUoIHJlcGVhdCApOworCisJaWYoIG5sLT5zZWNvbmQgKQorCQlzcGluX3VubG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKW5sLT5zZWNvbmQtPnByaXYpLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX2NoYW5uZWwoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsCSpubCAgICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nCQlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWludCAgcmVxX2FuczsKKwl1bnNpZ25lZCBjaGFyICBjc3IwOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJLyogTG9jayB0aGUgbWFzdGVyIGRldmljZSBiZWNhdXNlIHdlIGdvaW5nIHRvIGNoYW5nZSBpdHMgbG9jYWwgZGF0YSAqLworCWlmKCBubC0+c3RhdGUgJiBGTF9TTEFWRSApCisJCXNwaW5fbG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+bG9jayApOworI2VuZGlmCisKKwlvdXRiKCAoaW5iKCBpb2FkZHIgKyBDU1IwICkgJiB+RU5fSU5UKSB8IFRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCisJbmwtPnRpbWVyX3RpY2tzID0gQ0hBTkdFX0xFVkVMX1NUQVJUX1RJQ0tTOworCWZvcig7OykgeworCQljc3IwID0gaW5iKCBpb2FkZHIgKyBDU1IwICk7CisJCWlmKCAoIGNzcjAgJiAoUkNfUkRZIHwgVFJfUkRZKSApID09IDAgKQorCQkJYnJlYWs7CisKKwkJcmVxX2FucyA9ICEobmwtPnN0YXRlICYgRkxfUFJFVl9PSyk7CisKKwkJaWYoIGNzcjAgJiBSQ19SRFkgKQorCQkJcmVxX2FucyA9IHJlY3ZfZnJhbWUoIGRldiApOworCisJCS8qCisJCSAqIFRSX1JEWSBhbHdheXMgZXF1YWxzIDEgaGVyZSBiZWNhdXNlIHdlIGhhdmUgb3duZWQgdGhlIG1hcmtlciwKKwkJICogYW5kIHdlIHNldCBUUl9SRVEgd2hlbiBkaXNhYmxlZCBpbnRlcnJ1cHRzCisJCSAqLworCQljc3IwID0gaW5iKCBpb2FkZHIgKyBDU1IwICk7CisJCWlmKCAhKGNzcjAgJiBUUl9SRFkpICB8fCAgKGNzcjAgJiBSQ19SRFkpICkKKwkJCXByaW50ayggS0VSTl9FUlIgIiVzOiBpbnRlcm5hbCBlcnJvciFcbiIsIGRldi0+bmFtZSApOworCisJCS8qIGlmIHN0YXRlICYgRkxfTkVFRF9SRVNFTkQgIT0gMCB0aGVuIHR4X2ZyYW1lbm8gIT0gMCAqLworCQlpZiggcmVxX2FucyAgfHwgIG5sLT50eF9mcmFtZW5vICE9IDAgKQorCQkJc2VuZF9mcmFtZSggZGV2ICk7CisJCWVsc2UKKwkJCS8qIHNlbmQgbWFya2VyIHdpdGhvdXQgYW55IGRhdGEgKi8KKwkJCW91dGIoIGluYiggaW9hZGRyICsgQ1NSMCApICYgflRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCX0KKworCW91dGIoIGluYiggaW9hZGRyICsgQ1NSMCApIHwgRU5fSU5ULCBpb2FkZHIgKyBDU1IwICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlpZiggbmwtPnN0YXRlICYgRkxfU0xBVkUgKQorCQlzcGluX3VubG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+bG9jayApOworI2VuZGlmCit9CisKKworLyoKKyAqIFJvdXRpbmUgcmV0dXJucyAxIGlmIGl0IG5lZWQgdG8gYWNrbm93ZWxlZGdlIHJlY2VpdmVkIGZyYW1lLgorICogRW1wdHkgZnJhbWUgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgd29uJ3QgYmUgYWNrbm93ZWxlZGdlZC4KKyAqLworCitzdGF0aWMgaW50CityZWN2X2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyAgaW9hZGRyCT0gZGV2LT5iYXNlX2FkZHI7CisKKwl1MzIgIGNyYyA9IENSQzMyX0lOSVRJQUw7CisKKwl1bnNpZ25lZCAgZnJhbWVsZW4sIGZyYW1lbm8sIGFjazsKKwl1bnNpZ25lZCAgaXNfZmlyc3QsIGZyYW1lX29rOworCisJaWYoIGNoZWNrX2ZoZHIoIGlvYWRkciwgJmZyYW1lbGVuLCAmZnJhbWVubywgJmFjaywgJmlzX2ZpcnN0LCAmY3JjICkgKSB7CisJCWZyYW1lX29rID0gZnJhbWVsZW4gPiA0CisJCQk/ICB1cGxvYWRfZGF0YSggZGV2LCBmcmFtZWxlbiwgZnJhbWVubywgaXNfZmlyc3QsIGNyYyApCisJCQk6ICBza2lwX3RhaWwoIGlvYWRkciwgZnJhbWVsZW4sIGNyYyApOworCQlpZiggZnJhbWVfb2sgKQorCQkJaW50ZXJwcmV0X2FjayggZGV2LCBhY2sgKTsKKwl9IGVsc2UKKwkJZnJhbWVfb2sgPSAwOworCisJb3V0YiggaW5iKCBpb2FkZHIgKyBDU1IwICkgXiBDVF9aRVIsIGlvYWRkciArIENTUjAgKTsKKwlpZiggZnJhbWVfb2sgKSB7CisJCW5sLT5zdGF0ZSB8PSBGTF9QUkVWX09LOworCQlpZiggZnJhbWVsZW4gPiA0ICkKKwkJCW5sLT5pbl9zdGF0cy5hbGxfcnhfbnVtYmVyKys7CisJfSBlbHNlCisJCW5sLT5zdGF0ZSAmPSB+RkxfUFJFVl9PSywKKwkJY2hhbmdlX2xldmVsKCBkZXYgKSwKKwkJbmwtPmluX3N0YXRzLmFsbF9yeF9udW1iZXIrKywKKwkJbmwtPmluX3N0YXRzLmJhZF9yeF9udW1iZXIrKzsKKworCXJldHVybiAgIWZyYW1lX29rICB8fCAgZnJhbWVsZW4gPiA0OworfQorCisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJdTMyICBjcmMgPSBDUkMzMl9JTklUSUFMOworCisJaWYoIG5sLT5zdGF0ZSAmIEZMX05FRURfUkVTRU5EICkgeworCisJCS8qIGlmIGZyYW1lIHdhcyBzZW5kZWQgYnV0IG5vdCBBQ0snZWQgLSByZXNlbmQgaXQgKi8KKwkJaWYoIG5sLT50cmFuc19lcnJvcnMgKSB7CisJCQktLW5sLT50cmFuc19lcnJvcnM7CisJCQlpZiggbmwtPmZyYW1lbGVuICE9IDAgKQorCQkJCW5sLT5pbl9zdGF0cy5yZXNlbmRfdHhfbnVtYmVyKys7CisJCX0gZWxzZSB7CisJCQkvKiBjYW5ub3QgeG1pdCB3aXRoIG1hbnkgYXR0ZW1wdHMgKi8KKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJCWlmKCAobmwtPnN0YXRlICYgRkxfU0xBVkUpICB8fCAgbmwtPmxpbmsgKQorI2VuZGlmCisJCQlubC0+c3RhdGUgfD0gRkxfTElORV9ET1dOOworCQkJZHJvcF94bWl0X3F1ZXVlKCBkZXYgKTsKKwkJCWdvdG8gIGRvX3NlbmQ7CisJCX0KKwl9IGVsc2UKKwkJbmwtPnRyYW5zX2Vycm9ycyA9IFRSX0VSUk9SX0NPVU5UOworCisJc2VuZF9mcmFtZV9oZWFkZXIoIGRldiwgJmNyYyApOworCW5sLT5zdGF0ZSB8PSBGTF9ORUVEX1JFU0VORDsKKwkvKgorCSAqIEZMX05FRURfUkVTRU5EIHdpbGwgYmUgY2xlYXJlZCBhZnRlciBBQ0ssIGJ1dCBpZiBlbXB0eQorCSAqIGZyYW1lIHNlbmRlZCB0aGVuIGluIHByZXBhcmVfdG9fc2VuZCBuZXh0IGZyYW1lCisJICovCisKKworCWlmKCBubC0+ZnJhbWVsZW4gKSB7CisJCWRvd25sb2FkX2RhdGEoIGRldiwgJmNyYyApOworCQlubC0+aW5fc3RhdHMuYWxsX3R4X251bWJlcisrOworCQlubC0+c3RhdGUgfD0gRkxfV0FJVF9BQ0s7CisJfQorCisJb3V0c2IoIGRldi0+YmFzZV9hZGRyICsgREFULCAodTggKikmY3JjLCBzaXplb2YgY3JjICk7CisKK2RvX3NlbmQ6CisJb3V0YiggaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKSAmIH5UUl9SRVEsIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCisJaWYoIG5sLT50eF9mcmFtZW5vICkKKwkJLyogbmV4dCBmcmFtZSBleGlzdHMgLSB3ZSByZXF1ZXN0IGNhcmQgdG8gc2VuZCBpdCAqLworCQlvdXRiKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApIHwgVFJfUkVRLAorCQkgICAgICBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKK30KKworCisvKgorICogV3JpdGUgdGhlIGZyYW1lIGRhdGEgaW50byBhZGFwdGVyJ3MgYnVmZmVyIG1lbW9yeSwgYW5kIGNhbGN1bGF0ZSBDUkMuCisgKiBEbyBwYWRkaW5nIGlmIG5lY2Vzc2FyeS4KKyAqLworCitzdGF0aWMgdm9pZAorZG93bmxvYWRfZGF0YSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1MzIgICpjcmNfcCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICAgICpza2IJID0gbmwtPnR4X2J1Zl9wOworCisJdW5zaWduZWQgIGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4gLSBubC0+b3V0cG9zLCBubC0+ZnJhbWVsZW4pOworCisJb3V0c2IoIGRldi0+YmFzZV9hZGRyICsgREFULCBza2ItPmRhdGEgKyBubC0+b3V0cG9zLCBsZW4gKTsKKwkqY3JjX3AgPSBjYWxjX2NyYzMyKCAqY3JjX3AsIHNrYi0+ZGF0YSArIG5sLT5vdXRwb3MsIGxlbiApOworCisJLyogaWYgcGFja2V0IHRvbyBzaG9ydCB3ZSBzaG91bGQgd3JpdGUgc29tZSBtb3JlIGJ5dGVzIHRvIHBhZCAqLworCWZvciggbGVuID0gbmwtPmZyYW1lbGVuIC0gbGVuOyAgbGVuLS07ICkKKwkJb3V0YiggMCwgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKSwKKwkJKmNyY19wID0gQ1JDMzIoIDAsICpjcmNfcCApOworfQorCisKK3N0YXRpYyBpbnQKK3VwbG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHVuc2lnbmVkICBmcmFtZWxlbiwgIHVuc2lnbmVkICBmcmFtZW5vLAorCSAgICAgdW5zaWduZWQgIGlzX2ZpcnN0LCAgdTMyICBjcmMgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWludCAgZnJhbWVfb2s7CisKKwlpZiggaXNfZmlyc3QgKQorCQlubC0+d2FpdF9mcmFtZW5vID0gZnJhbWVubywKKwkJbmwtPmlucHBvcyA9IDA7CisKKwlpZiggbmwtPndhaXRfZnJhbWVubyA9PSBmcmFtZW5vICkgeworCisJCWlmKCBubC0+aW5wcG9zICsgZnJhbWVsZW4gIDw9ICBFVEhFUl9NQVhfTEVOICkKKwkJCWZyYW1lX29rID0gYXBwZW5kX2ZyYW1lX3RvX3BrdCggZGV2LCBmcmFtZWxlbiwgY3JjICk7CisKKwkJLyoKKwkJICogaWYgQ1JDIGlzIHJpZ2h0IGJ1dCBmcmFtZWxlbiBpbmNvcnJlY3QgdGhlbiB0cmFuc21pdHRlcgorCQkgKiBlcnJvciB3YXMgb2NjdXJyZWQuLi4gZHJvcCBlbnRpcmUgcGFja2V0CisJCSAqLworCQllbHNlIGlmKCAoZnJhbWVfb2sgPSBza2lwX3RhaWwoIGRldi0+YmFzZV9hZGRyLCBmcmFtZWxlbiwgY3JjICkpCisJCQkgIT0gMCApCisJCQlubC0+d2FpdF9mcmFtZW5vID0gMCwKKwkJCW5sLT5pbnBwb3MgPSAwLAorI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCQkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpCisJCQkJLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KQorCQkJCS0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworI2Vsc2UKKwkJCW5sLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJCW5sLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisjZW5kaWYKKwkJCS8qIG5vdyBza2lwIGFsbCBmcmFtZXMgdW50aWwgaXNfZmlyc3QgIT0gMCAqLworCX0gZWxzZQorCQlmcmFtZV9vayA9IHNraXBfdGFpbCggZGV2LT5iYXNlX2FkZHIsIGZyYW1lbGVuLCBjcmMgKTsKKworCWlmKCBpc19maXJzdCAgJiYgICFmcmFtZV9vayApCisJCS8qCisJCSAqIEZyYW1lIGhhcyBiZWVuIGJyb2tlbiwgYnV0IHdlIGhhZCBhbHJlYWR5IHN0b3JlZAorCQkgKiBpc19maXJzdC4uLiBEcm9wIGVudGlyZSBwYWNrZXQuCisJCSAqLworCQlubC0+d2FpdF9mcmFtZW5vID0gMCwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjZWxzZQorCQlubC0+c3RhdHMucnhfZXJyb3JzKyssCisJCW5sLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjZW5kaWYKKworCXJldHVybiAgZnJhbWVfb2s7Cit9CisKKworc3RhdGljIF9faW5saW5lIHZvaWQKK3NlbmRfY29tcGxldGUoIHN0cnVjdCBuZXRfbG9jYWwgICpubCApCit7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy50eF9wYWNrZXRzKys7CisJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy50eF9ieXRlcworCQkrPSBubC0+dHhfYnVmX3AtPmxlbjsKKyNlbHNlCisJbmwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlubC0+c3RhdHMudHhfYnl0ZXMgKz0gbmwtPnR4X2J1Zl9wLT5sZW47CisjZW5kaWYKKwlkZXZfa2ZyZWVfc2tiX2lycSggbmwtPnR4X2J1Zl9wICk7CisKKwlubC0+dHhfYnVmX3AgPSBOVUxMOworCisJbmwtPm91dHBvcyA9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisJbmwtPmZyYW1lbGVuICAgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitpbnRlcnByZXRfYWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHVuc2lnbmVkICBhY2sgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBhY2sgPT0gRlJBTUVfU0VOVF9PSyApIHsKKwkJbmwtPnN0YXRlICY9IH5GTF9ORUVEX1JFU0VORDsKKworCQlpZiggbmwtPnN0YXRlICYgRkxfV0FJVF9BQ0sgKSB7CisJCQlubC0+b3V0cG9zICs9IG5sLT5mcmFtZWxlbjsKKworCQkJaWYoIC0tbmwtPnR4X2ZyYW1lbm8gKQorCQkJCW5sLT5mcmFtZWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgIG5sLT5tYXhmcmFtZSwKKwkJCQkJCSAgIG5sLT50eF9idWZfcC0+bGVuIC0gbmwtPm91dHBvcyk7CisJCQllbHNlCisJCQkJc2VuZF9jb21wbGV0ZSggbmwgKSwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJCQluZXRpZl93YWtlX3F1ZXVlKCBubC0+bWFzdGVyICk7CisjZWxzZQorCQkJCW5ldGlmX3dha2VfcXVldWUoIGRldiApOworI2VuZGlmCisJCX0KKwl9CisKKwlubC0+c3RhdGUgJj0gfkZMX1dBSVRfQUNLOworfQorCisKKy8qCisgKiBHbHVlIHJlY2VpdmVkIGZyYW1lIHdpdGggcHJldmlvdXMgZnJhZ21lbnRzIG9mIHBhY2tldC4KKyAqIEluZGljYXRlIHBhY2tldCB3aGVuIGxhc3QgZnJhbWUgd291bGQgYmUgYWNjZXB0ZWQuCisgKi8KKworc3RhdGljIGludAorYXBwZW5kX2ZyYW1lX3RvX3BrdCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCAgZnJhbWVsZW4sICB1MzIgIGNyYyApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJdTggICpwOworCisJaWYoIG5sLT5pbnBwb3MgKyBmcmFtZWxlbiAgPiAgRVRIRVJfTUFYX0xFTiApCisJCXJldHVybiAgMDsKKworCWlmKCAhbmwtPnJ4X2J1Zl9wICAmJiAgIShubC0+cnhfYnVmX3AgPSBnZXRfcnhfYnVmKCBkZXYgKSkgKQorCQlyZXR1cm4gIDA7CisKKwlwID0gbmwtPnJ4X2J1Zl9wLT5kYXRhICsgbmwtPmlucHBvczsKKwlpbnNiKCBkZXYtPmJhc2VfYWRkciArIERBVCwgcCwgZnJhbWVsZW4gKTsKKwlpZiggY2FsY19jcmMzMiggY3JjLCBwLCBmcmFtZWxlbiApICE9IENSQzMyX1JFTUFJTkRFUiApCisJCXJldHVybiAgMDsKKworCW5sLT5pbnBwb3MgKz0gZnJhbWVsZW4gLSA0OworCWlmKCAtLW5sLT53YWl0X2ZyYW1lbm8gPT0gMCApCQkvKiBsYXN0IGZyYW1lIHJlY2VpdmVkICovCisJCWluZGljYXRlX3BrdCggZGV2ICk7CisKKwlyZXR1cm4gIDE7Cit9CisKKworLyoKKyAqIFByZXBhcmUgdG8gc3RhcnQgb3V0cHV0IG9uIGFkYXB0ZXIuCisgKiBUcmFuc21pdHRlciB3aWxsIGJlIGFjdHVhbGx5IGFjdGl2YXRlZCB3aGVuIG1hcmtlciBpcyBhY2NlcHRlZC4KKyAqLworCitzdGF0aWMgdm9pZAorcHJlcGFyZV90b19zZW5kKCBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYiwgIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwl1bnNpZ25lZCBpbnQgIGxlbjsKKworCS8qIG5sLT50eF9idWZfcCA9PSBOVUxMIGhlcmUhICovCisJaWYoIG5sLT50eF9idWZfcCApCisJCXByaW50ayggS0VSTl9FUlIgIiVzOiBtZW1vcnkgbGVhayFcbiIsIGRldi0+bmFtZSApOworCisJbmwtPm91dHBvcyA9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisKKwlsZW4gPSBza2ItPmxlbjsKKwlpZiggbGVuIDwgU0JOSV9NSU5fTEVOICkKKwkJbGVuID0gU0JOSV9NSU5fTEVOOworCisJbmwtPnR4X2J1Zl9wCT0gc2tiOworCW5sLT50eF9mcmFtZW5vCT0gKGxlbiArIG5sLT5tYXhmcmFtZSAtIDEpIC8gbmwtPm1heGZyYW1lOworCW5sLT5mcmFtZWxlbgk9IGxlbiA8IG5sLT5tYXhmcmFtZSAgPyAgbGVuICA6ICBubC0+bWF4ZnJhbWU7CisKKwlvdXRiKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApIHwgVFJfUkVRLCAgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJbmwtPm1hc3Rlci0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworI2Vsc2UKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitkcm9wX3htaXRfcXVldWUoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpZiggbmwtPnR4X2J1Zl9wICkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoIG5sLT50eF9idWZfcCApLAorCQlubC0+dHhfYnVmX3AgPSBOVUxMLAorI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdikKKwkJCS0+c3RhdHMudHhfZXJyb3JzKyssCisJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KQorCQkJLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworI2Vsc2UKKwkJbmwtPnN0YXRzLnR4X2Vycm9ycysrLAorCQlubC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyNlbmRpZgorCisJbmwtPnR4X2ZyYW1lbm8JPSAwOworCW5sLT5mcmFtZWxlbgk9IDA7CisJbmwtPm91dHBvcwk9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJbmV0aWZfc3RhcnRfcXVldWUoIG5sLT5tYXN0ZXIgKTsKKwlubC0+bWFzdGVyLT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZWxzZQorCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYW1lX2hlYWRlciggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1MzIgICpjcmNfcCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCXUzMiAgY3JjID0gKmNyY19wOworCXUzMiAgbGVuX2ZpZWxkID0gbmwtPmZyYW1lbGVuICsgNjsJLyogQ1JDICsgZnJhbWVubyArIHJlc2VydmVkICovCisJdTggICB2YWx1ZTsKKworCWlmKCBubC0+c3RhdGUgJiBGTF9ORUVEX1JFU0VORCApCisJCWxlbl9maWVsZCB8PSBGUkFNRV9SRVRSWTsJLyogbm9uLWZpcnN0IGF0dGVtcHQuLi4gKi8KKworCWlmKCBubC0+b3V0cG9zID09IDAgKQorCQlsZW5fZmllbGQgfD0gRlJBTUVfRklSU1Q7CisKKwlsZW5fZmllbGQgfD0gKG5sLT5zdGF0ZSAmIEZMX1BSRVZfT0spID8gRlJBTUVfU0VOVF9PSyA6IEZSQU1FX1NFTlRfQkFEOworCW91dGIoIFNCTklfU0lHLCBkZXYtPmJhc2VfYWRkciArIERBVCApOworCisJdmFsdWUgPSAodTgpIGxlbl9maWVsZDsKKwlvdXRiKCB2YWx1ZSwgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCXZhbHVlID0gKHU4KSAobGVuX2ZpZWxkID4+IDgpOworCW91dGIoIHZhbHVlLCBkZXYtPmJhc2VfYWRkciArIERBVCApOworCWNyYyA9IENSQzMyKCB2YWx1ZSwgY3JjICk7CisKKwlvdXRiKCBubC0+dHhfZnJhbWVubywgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKwljcmMgPSBDUkMzMiggbmwtPnR4X2ZyYW1lbm8sIGNyYyApOworCW91dGIoIDAsIGRldi0+YmFzZV9hZGRyICsgREFUICk7CisJY3JjID0gQ1JDMzIoIDAsIGNyYyApOworCSpjcmNfcCA9IGNyYzsKK30KKworCisvKgorICogaWYgZnJhbWUgdGFpbCBub3QgbmVlZGVkIChpbmNvcnJlY3QgbnVtYmVyIG9yIHJlY2VpdmVkIHR3aWNlKSwKKyAqIGl0IHdvbid0IHN0b3JlLCBidXQgQ1JDIHdpbGwgYmUgY2FsY3VsYXRlZAorICovCisKK3N0YXRpYyBpbnQKK3NraXBfdGFpbCggdW5zaWduZWQgaW50ICBpb2FkZHIsICB1bnNpZ25lZCBpbnQgIHRhaWxfbGVuLCAgdTMyIGNyYyApCit7CisJd2hpbGUoIHRhaWxfbGVuLS0gKQorCQljcmMgPSBDUkMzMiggaW5iKCBpb2FkZHIgKyBEQVQgKSwgY3JjICk7CisKKwlyZXR1cm4gIGNyYyA9PSBDUkMzMl9SRU1BSU5ERVI7Cit9CisKKworLyoKKyAqIFByZWxpbWluYXJ5IGNoZWNrcyBpZiBmcmFtZSBoZWFkZXIgaXMgY29ycmVjdCwgY2FsY3VsYXRlcyBpdHMgQ1JDCisgKiBhbmQgc3BsaXQgaXQgdG8gc2ltcGxlIGZpZWxkcworICovCisKK3N0YXRpYyBpbnQKK2NoZWNrX2ZoZHIoIHUzMiAgaW9hZGRyLCAgdTMyICAqZnJhbWVsZW4sICB1MzIgICpmcmFtZW5vLCAgdTMyICAqYWNrLAorCSAgICB1MzIgICppc19maXJzdCwgIHUzMiAgKmNyY19wICkKK3sKKwl1MzIgIGNyYyA9ICpjcmNfcDsKKwl1OCAgIHZhbHVlOworCisJaWYoIGluYiggaW9hZGRyICsgREFUICkgIT0gU0JOSV9TSUcgKQorCQlyZXR1cm4gIDA7CisKKwl2YWx1ZSA9IGluYiggaW9hZGRyICsgREFUICk7CisJKmZyYW1lbGVuID0gKHUzMil2YWx1ZTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCXZhbHVlID0gaW5iKCBpb2FkZHIgKyBEQVQgKTsKKwkqZnJhbWVsZW4gfD0gKCh1MzIpdmFsdWUpIDw8IDg7CisJY3JjID0gQ1JDMzIoIHZhbHVlLCBjcmMgKTsKKworCSphY2sgPSAqZnJhbWVsZW4gJiBGUkFNRV9BQ0tfTUFTSzsKKwkqaXNfZmlyc3QgPSAoKmZyYW1lbGVuICYgRlJBTUVfRklSU1QpICE9IDA7CisKKwlpZiggKCpmcmFtZWxlbiAmPSBGUkFNRV9MRU5fTUFTSykgPCA2CisJICAgIHx8ICAqZnJhbWVsZW4gPiBTQk5JX01BWF9GUkFNRSAtIDMgKQorCQlyZXR1cm4gIDA7CisKKwl2YWx1ZSA9IGluYiggaW9hZGRyICsgREFUICk7CisJKmZyYW1lbm8gPSAodTMyKXZhbHVlOworCWNyYyA9IENSQzMyKCB2YWx1ZSwgY3JjICk7CisKKwljcmMgPSBDUkMzMiggaW5iKCBpb2FkZHIgKyBEQVQgKSwgY3JjICk7CS8qIHJlc2VydmVkIGJ5dGUgKi8KKwkqZnJhbWVsZW4gLT0gMjsKKworCSpjcmNfcCA9IGNyYzsKKwlyZXR1cm4gIDE7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2dldF9yeF9idWYoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwkvKiArMiBpcyB0byBjb21wZW5zYXRlIGZvciB0aGUgYWxpZ25tZW50IGZpeHVwIGJlbG93ICovCisJc3RydWN0IHNrX2J1ZmYgICpza2IgPSBkZXZfYWxsb2Nfc2tiKCBFVEhFUl9NQVhfTEVOICsgMiApOworCWlmKCAhc2tiICkKKwkJcmV0dXJuICBOVUxMOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJc2tiLT5kZXYgPSAoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2KS0+bWFzdGVyOworI2Vsc2UKKwlza2ItPmRldiA9IGRldjsKKyNlbmRpZgorCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJCS8qIEFsaWduIElQIG9uIGxvbmd3b3JkIGJvdW5kYXJpZXMgKi8KKwlyZXR1cm4gIHNrYjsKK30KKworCitzdGF0aWMgdm9pZAoraW5kaWNhdGVfcGt0KCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAqc2tiID0gbmwtPnJ4X2J1Zl9wOworCisJc2tiX3B1dCggc2tiLCBubC0+aW5wcG9zICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgbmwtPm1hc3RlciApOworCW5ldGlmX3J4KCBza2IgKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSsrKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9wYWNrZXRzOworCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMucnhfYnl0ZXMgKz0gbmwtPmlucHBvczsKKyNlbHNlCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCW5ldGlmX3J4KCBza2IgKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSsrbmwtPnN0YXRzLnJ4X3BhY2tldHM7CisJbmwtPnN0YXRzLnJ4X2J5dGVzICs9IG5sLT5pbnBwb3M7CisjZW5kaWYKKwlubC0+cnhfYnVmX3AgPSBOVUxMOwkvKiBwcm90b2NvbCBkcml2ZXIgd2lsbCBjbGVhciB0aGlzIHNrX2J1ZmYgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUm91dGluZSBjaGVja3MgcGVyaW9kaWNhbGx5IHdpcmUgYWN0aXZpdHkgYW5kIHJlZ2VuZXJhdGVzIG1hcmtlciBpZgorICogY29ubmVjdCB3YXMgaW5hY3RpdmUgZm9yIGEgbG9uZyB0aW1lLgorICovCisKK3N0YXRpYyB2b2lkCitzYm5pX3dhdGNoZG9nKCB1bnNpZ25lZCBsb25nICBhcmcgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgKncgICA9ICZubC0+d2F0Y2hkb2c7IAorCXVuc2lnbmVkIGxvbmcJICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkgICBjc3IwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoICZubC0+bG9jaywgZmxhZ3MgKTsKKworCWNzcjAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCWlmKCBjc3IwICYgUkNfQ0hLICkgeworCisJCWlmKCBubC0+dGltZXJfdGlja3MgKSB7CisJCQlpZiggY3NyMCAmIChSQ19SRFkgfCBCVV9FTVApICkKKwkJCQkvKiByZWNlaXZpbmcgbm90IGFjdGl2ZSAqLworCQkJCW5sLT50aW1lcl90aWNrcy0tOworCQl9IGVsc2UgeworCQkJbmwtPmluX3N0YXRzLnRpbWVvdXRfbnVtYmVyKys7CisJCQlpZiggbmwtPmRlbHRhX3J4bCApCisJCQkJdGltZW91dF9jaGFuZ2VfbGV2ZWwoIGRldiApOworCisJCQlvdXRiKCAqKHVfY2hhciAqKSZubC0+Y3NyMSB8IFBSX1JFUywKKwkJCSAgICAgIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCQkJY3NyMCA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CisJCX0KKwl9IGVsc2UKKwkJbmwtPnN0YXRlICY9IH5GTF9MSU5FX0RPV047CisKKwlvdXRiKCBjc3IwIHwgUkNfQ0hLLCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsgCisKKwlpbml0X3RpbWVyKCB3ICk7CisJdy0+ZXhwaXJlcwk9IGppZmZpZXMgKyBTQk5JX1RJTUVPVVQ7CisJdy0+ZGF0YQkJPSBhcmc7CisJdy0+ZnVuY3Rpb24JPSBzYm5pX3dhdGNoZG9nOworCWFkZF90aW1lciggdyApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJm5sLT5sb2NrLCBmbGFncyApOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICByeGxfdGFiW10gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwOCwKKwkweDBhLCAweDBjLCAweDBmLCAweDE2LCAweDE4LCAweDFhLCAweDFjLCAweDFmCit9OworCisjZGVmaW5lIFNJWkVfT0ZfVElNRU9VVF9SWExfVEFCIDQKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICB0aW1lb3V0X3J4bF90YWJbXSA9IHsKKwkweDAzLCAweDA1LCAweDA4LCAweDBiCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorY2FyZF9zdGFydCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCW5sLT50aW1lcl90aWNrcyA9IENIQU5HRV9MRVZFTF9TVEFSVF9USUNLUzsKKwlubC0+c3RhdGUgJj0gfihGTF9XQUlUX0FDSyB8IEZMX05FRURfUkVTRU5EKTsKKwlubC0+c3RhdGUgfD0gRkxfUFJFVl9PSzsKKworCW5sLT5pbnBwb3MgPSBubC0+b3V0cG9zID0gMDsKKwlubC0+d2FpdF9mcmFtZW5vID0gMDsKKwlubC0+dHhfZnJhbWVubwkgPSAwOworCW5sLT5mcmFtZWxlbgkgPSAwOworCisJb3V0YiggKih1X2NoYXIgKikmbmwtPmNzcjEgfCBQUl9SRVMsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCW91dGIoIEVOX0lOVCwgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFJlY2VpdmUgbGV2ZWwgYXV0by1zZWxlY3Rpb24gKi8KKworc3RhdGljIHZvaWQKK2NoYW5nZV9sZXZlbCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBubC0+ZGVsdGFfcnhsID09IDAgKQkvKiBkbyBub3QgYXV0by1uZWdvdGlhdGUgUnhMICovCisJCXJldHVybjsKKworCWlmKCBubC0+Y3VyX3J4bF9pbmRleCA9PSAwICkKKwkJbmwtPmRlbHRhX3J4bCA9IDE7CisJZWxzZSBpZiggbmwtPmN1cl9yeGxfaW5kZXggPT0gMTUgKQorCQlubC0+ZGVsdGFfcnhsID0gLTE7CisJZWxzZSBpZiggbmwtPmN1cl9yeGxfcmN2ZCA8IG5sLT5wcmV2X3J4bF9yY3ZkICkKKwkJbmwtPmRlbHRhX3J4bCA9IC1ubC0+ZGVsdGFfcnhsOworCisJbmwtPmNzcjEucnhsID0gcnhsX3RhYlsgbmwtPmN1cl9yeGxfaW5kZXggKz0gbmwtPmRlbHRhX3J4bCBdOworCWluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CS8qIG5lZWRzIGZvciBQQ0kgY2FyZHMgKi8KKwlvdXRiKCAqKHU4ICopJm5sLT5jc3IxLCBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKworCW5sLT5wcmV2X3J4bF9yY3ZkID0gbmwtPmN1cl9yeGxfcmN2ZDsKKwlubC0+Y3VyX3J4bF9yY3ZkICA9IDA7Cit9CisKKworc3RhdGljIHZvaWQKK3RpbWVvdXRfY2hhbmdlX2xldmVsKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJbmwtPmN1cl9yeGxfaW5kZXggPSB0aW1lb3V0X3J4bF90YWJbIG5sLT50aW1lb3V0X3J4bCBdOworCWlmKCArK25sLT50aW1lb3V0X3J4bCA+PSA0ICkKKwkJbmwtPnRpbWVvdXRfcnhsID0gMDsKKworCW5sLT5jc3IxLnJ4bCA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4IF07CisJaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKKwlvdXRiKCAqKHVuc2lnbmVkIGNoYXIgKikmbmwtPmNzcjEsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCisJbmwtPnByZXZfcnhsX3JjdmQgPSBubC0+Y3VyX3J4bF9yY3ZkOworCW5sLT5jdXJfcnhsX3JjdmQgID0gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCU9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIAorICovCisKK3N0YXRpYyBpbnQKK3Nibmlfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwJKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCB0aW1lcl9saXN0CSp3ICA9ICZubC0+d2F0Y2hkb2c7CisKKwkvKgorCSAqIEZvciBkb3VibGUgSVNBIGFkYXB0ZXJzIHdpdGhpbiAiY29tbW9uIGlycSIgbW9kZSwgd2UgaGF2ZSB0bworCSAqIGRldGVybWluZSB3aGV0aGVyIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsCisJICogYW5kIHNldCB0aGUgaXJxIGhhbmRsZXIgb25seSBpbiBmaXJzdCBjYXNlLgorCSAqLworCWlmKCBkZXYtPmJhc2VfYWRkciA8IDB4NDAwICkgewkJLyogSVNBIG9ubHkgKi8KKwkJc3RydWN0IG5ldF9kZXZpY2UgICoqcCA9IHNibmlfY2FyZHM7CisJCWZvciggOyAgKnAgICYmICBwIDwgc2JuaV9jYXJkcyArIFNCTklfTUFYX05VTV9DQVJEUzsgICsrcCApCisJCQlpZiggKCpwKS0+aXJxID09IGRldi0+aXJxCisJCQkgICAgJiYgICgoKnApLT5iYXNlX2FkZHIgPT0gZGV2LT5iYXNlX2FkZHIgKyA0CisJCQkJIHx8ICAoKnApLT5iYXNlX2FkZHIgPT0gZGV2LT5iYXNlX2FkZHIgLSA0KQorCQkJICAgICYmICAoKnApLT5mbGFncyAmIElGRl9VUCApIHsKKworCQkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSAoKCpwKS0+cHJpdikpCisJCQkJCS0+c2Vjb25kID0gZGV2OworCQkJCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiB1c2luZyBzaGFyZWQgaXJxICIKKwkJCQkJIndpdGggJXNcbiIsIGRldi0+bmFtZSwgKCpwKS0+bmFtZSApOworCQkJCW5sLT5zdGF0ZSB8PSBGTF9TRUNPTkRBUlk7CisJCQkJZ290byAgaGFuZGxlcl9hdHRhY2hlZDsKKwkJCX0KKwl9CisKKwlpZiggcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNibmlfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpICkgeworCQlwcmludGsoIEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlycSApOworCQlyZXR1cm4gIC1FQUdBSU47CisJfQorCitoYW5kbGVyX2F0dGFjaGVkOgorCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwltZW1zZXQoICZubC0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgKTsKKwltZW1zZXQoICZubC0+aW5fc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3Qgc2JuaV9pbl9zdGF0cykgKTsKKworCWNhcmRfc3RhcnQoIGRldiApOworCisJbmV0aWZfc3RhcnRfcXVldWUoIGRldiApOworCisJLyogc2V0IHRpbWVyIHdhdGNoZG9nICovCisJaW5pdF90aW1lciggdyApOworCXctPmV4cGlyZXMJPSBqaWZmaWVzICsgU0JOSV9USU1FT1VUOworCXctPmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwl3LT5mdW5jdGlvbgk9IHNibmlfd2F0Y2hkb2c7CisJYWRkX3RpbWVyKCB3ICk7CisgICAKKwlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorc2JuaV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBubC0+c2Vjb25kICAmJiAgbmwtPnNlY29uZC0+ZmxhZ3MgJiBJRkZfVVAgKSB7CisJCXByaW50ayggS0VSTl9OT1RJQ0UgIlNlY29uZGFyeSBjaGFubmVsICglcykgaXMgYWN0aXZlIVxuIiwKKwkJCW5sLT5zZWNvbmQtPm5hbWUgKTsKKwkJcmV0dXJuICAtRUJVU1k7CisJfQorCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJaWYoIG5sLT5zdGF0ZSAmIEZMX1NMQVZFICkKKwkJZW1hbmNpcGF0ZSggZGV2ICk7CisJZWxzZQorCQl3aGlsZSggbmwtPmxpbmsgKQkvKiBpdCdzIG1hc3RlciBkZXZpY2UhICovCisJCQllbWFuY2lwYXRlKCBubC0+bGluayApOworI2VuZGlmCisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCisJbmwtPnNlY29uZCA9IE5VTEw7CisJZHJvcF94bWl0X3F1ZXVlKCBkZXYgKTsJCisJbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisgICAKKwlkZWxfdGltZXIoICZubC0+d2F0Y2hkb2cgKTsKKworCW91dGIoIDAsIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCisJaWYoICEobmwtPnN0YXRlICYgRkxfU0VDT05EQVJZKSApCisJCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CisJbmwtPnN0YXRlICY9IEZMX1NFQ09OREFSWTsKKworCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorCVZhbGlkIGNvbWJpbmF0aW9ucyBpbiBDU1IwIChmb3IgcHJvYmluZyk6CisKKwlWQUxJRF9ERUNPREVSCTAwMDAsMDAxMSwxMDExLDEwMTAKKworCQkJCSAgICAJOyAwICAgOyAtCisJCQkJVFJfUkVRCTsgMSAgIDsgKworCQkJVFJfUkRZCSAgICAJOyAyICAgOyAtCisJCQlUUl9SRFkJVFJfUkVRCTsgMyAgIDsgKworCQlCVV9FTVAJCSAgICAJOyA0ICAgOyArCisJCUJVX0VNUAkgICAgIAlUUl9SRVEJOyA1ICAgOyArCisJCUJVX0VNUAlUUl9SRFkJICAgIAk7IDYgICA7IC0KKwkJQlVfRU1QCVRSX1JEWQlUUl9SRVEJOyA3ICAgOyArCisJUkNfUkRZIAkJICAgICAJCTsgOCAgIDsgKworCVJDX1JEWQkJCVRSX1JFUQk7IDkgICA7ICsKKwlSQ19SRFkJCVRSX1JEWQkJOyAxMCAgOyAtCisJUkNfUkRZCQlUUl9SRFkJVFJfUkVRCTsgMTEgIDsgLQorCVJDX1JEWQlCVV9FTVAJCQk7IDEyICA7IC0KKwlSQ19SRFkJQlVfRU1QCQlUUl9SRVEJOyAxMyAgOyAtCisJUkNfUkRZCUJVX0VNUAlUUl9SRFkJCTsgMTQgIDsgLQorCVJDX1JEWQlCVV9FTVAJVFJfUkRZCVRSX1JFUQk7IDE1ICA7IC0KKyovCisKKyNkZWZpbmUgVkFMSURfREVDT0RFUiAoMiArIDggKyAweDEwICsgMHgyMCArIDB4ODAgKyAweDEwMCArIDB4MjAwKQorCisKK3N0YXRpYyBpbnQKK3NibmlfY2FyZF9wcm9iZSggdW5zaWduZWQgbG9uZyAgaW9hZGRyICkKK3sKKwl1bnNpZ25lZCBjaGFyICBjc3IwOworCisJY3NyMCA9IGluYiggaW9hZGRyICsgQ1NSMCApOworCWlmKCBjc3IwICE9IDB4ZmYgICYmICBjc3IwICE9IDB4MDAgKSB7CisJCWNzcjAgJj0gfkVOX0lOVDsKKwkJaWYoIGNzcjAgJiBCVV9FTVAgKQorCQkJY3NyMCB8PSBFTl9JTlQ7CisgICAgICAKKwkJaWYoIFZBTElEX0RFQ09ERVIgJiAoMSA8PCAoY3NyMCA+PiA0KSkgKQorCQkJcmV0dXJuICAwOworCX0KKyAgIAorCXJldHVybiAgLUVOT0RFVjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorc2JuaV9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICBzdHJ1Y3QgaWZyZXEgICppZnIsICBpbnQgIGNtZCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OyAKKwlzdHJ1Y3Qgc2JuaV9mbGFncyAgZmxhZ3M7CisJaW50ICBlcnJvciA9IDA7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnNsYXZlX2RldjsKKwljaGFyICBzbGF2ZV9uYW1lWyA4IF07CisjZW5kaWYKKyAgCisJc3dpdGNoKCBjbWQgKSB7CisJY2FzZSAgU0lPQ0RFVkdFVElOU1RBVFMgOgorCQlpZiAoY29weV90b191c2VyKCBpZnItPmlmcl9kYXRhLCAmbmwtPmluX3N0YXRzLAorCQkJCQlzaXplb2Yoc3RydWN0IHNibmlfaW5fc3RhdHMpICkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVlJFU0lOU1RBVFMgOgorCQlpZiggY3VycmVudC0+ZXVpZCAhPSAwICkJLyogcm9vdCBvbmx5ICovCisJCQlyZXR1cm4gIC1FUEVSTTsKKwkJbWVtc2V0KCAmbmwtPmluX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHNibmlfaW5fc3RhdHMpICk7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVkdIV1NUQVRFIDoKKwkJZmxhZ3MubWFjX2FkZHIJPSAqKHUzMiAqKShkZXYtPmRldl9hZGRyICsgMyk7CisJCWZsYWdzLnJhdGUJPSBubC0+Y3NyMS5yYXRlOworCQlmbGFncy5zbG93X21vZGUJPSAobmwtPnN0YXRlICYgRkxfU0xPV19NT0RFKSAhPSAwOworCQlmbGFncy5yeGwJPSBubC0+Y3VyX3J4bF9pbmRleDsKKwkJZmxhZ3MuZml4ZWRfcnhsCT0gbmwtPmRlbHRhX3J4bCA9PSAwOworCisJCWlmIChjb3B5X3RvX3VzZXIoIGlmci0+aWZyX2RhdGEsICZmbGFncywgc2l6ZW9mIGZsYWdzICkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVlNIV1NUQVRFIDoKKwkJaWYoIGN1cnJlbnQtPmV1aWQgIT0gMCApCS8qIHJvb3Qgb25seSAqLworCQkJcmV0dXJuICAtRVBFUk07CisKKwkJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwkJZmxhZ3MgPSAqKHN0cnVjdCBzYm5pX2ZsYWdzKikgJmlmci0+aWZyX2lmcnU7CisJCWlmKCBmbGFncy5maXhlZF9yeGwgKQorCQkJbmwtPmRlbHRhX3J4bCA9IDAsCisJCQlubC0+Y3VyX3J4bF9pbmRleCA9IGZsYWdzLnJ4bDsKKwkJZWxzZQorCQkJbmwtPmRlbHRhX3J4bCA9IERFRl9SWExfREVMVEEsCisJCQlubC0+Y3VyX3J4bF9pbmRleCA9IERFRl9SWEw7CisKKwkJbmwtPmNzcjEucnhsID0gcnhsX3RhYlsgbmwtPmN1cl9yeGxfaW5kZXggXTsKKwkJbmwtPmNzcjEucmF0ZSA9IGZsYWdzLnJhdGU7CisJCW91dGIoICoodTggKikmbmwtPmNzcjEgfCBQUl9SRVMsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCQlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisKKwljYXNlICBTSU9DREVWRU5TTEFWRSA6CisJCWlmKCBjdXJyZW50LT5ldWlkICE9IDAgKQkvKiByb290IG9ubHkgKi8KKwkJCXJldHVybiAgLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlciggc2xhdmVfbmFtZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIHNsYXZlX25hbWUgKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoIHNsYXZlX25hbWUgKTsKKwkJaWYoICFzbGF2ZV9kZXYgIHx8ICAhKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfVVApICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBlbnNsYXZlIG5vbi1hY3RpdmUgIgorCQkJCSJkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSwgc2xhdmVfbmFtZSApOworCQkJcmV0dXJuICAtRVBFUk07CisJCX0KKworCQlyZXR1cm4gIGVuc2xhdmUoIGRldiwgc2xhdmVfZGV2ICk7CisKKwljYXNlICBTSU9DREVWRU1BTlNJUEFURSA6CisJCWlmKCBjdXJyZW50LT5ldWlkICE9IDAgKQkvKiByb290IG9ubHkgKi8KKwkJCXJldHVybiAgLUVQRVJNOworCisJCXJldHVybiAgZW1hbmNpcGF0ZSggZGV2ICk7CisKKyNlbmRpZgkvKiBDT05GSUdfU0JOSV9NVUxUSUxJTkUgKi8KKworCWRlZmF1bHQgOgorCQlyZXR1cm4gIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAgZXJyb3I7Cit9CisKKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCitzdGF0aWMgaW50CitlbnNsYXZlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHN0cnVjdCBuZXRfZGV2aWNlICAqc2xhdmVfZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBuZXRfbG9jYWwgICpzbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBzbGF2ZV9kZXYtPnByaXY7CisKKwlpZiggbmwtPnN0YXRlICYgRkxfU0xBVkUgKQkvKiBUaGlzIGlzbid0IG1hc3RlciBvciBmcmVlIGRldmljZSAqLworCQlyZXR1cm4gIC1FQlVTWTsKKworCWlmKCBzbmwtPnN0YXRlICYgRkxfU0xBVkUgKQkvKiBUaGF0IHdhcyBhbHJlYWR5IGVuc2xhdmVkICovCisJCXJldHVybiAgLUVCVVNZOworCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwlzcGluX2xvY2soICZzbmwtPmxvY2sgKTsKKworCS8qIGFwcGVuZCB0byBsaXN0ICovCisJc25sLT5saW5rID0gbmwtPmxpbms7CisJbmwtPmxpbmsgID0gc2xhdmVfZGV2OworCXNubC0+bWFzdGVyID0gZGV2OworCXNubC0+c3RhdGUgfD0gRkxfU0xBVkU7CisKKwkvKiBTdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgTXVsdGlMaW5lIG9wZXJhdGlvbiB3aWxsIGJlIHN0b3JlZAorCSAgIGluIG1hc3RlcidzIGNvdW50ZXJzICovCisJbWVtc2V0KCAmc25sLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSApOworCW5ldGlmX3N0b3BfcXVldWUoIHNsYXZlX2RldiApOworCW5ldGlmX3dha2VfcXVldWUoIGRldiApOwkvKiBOb3cgd2UgYXJlIGFibGUgdG8gdHJhbnNtaXQgKi8KKworCXNwaW5fdW5sb2NrKCAmc25sLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiBzbGF2ZSBkZXZpY2UgKCVzKSBhdHRhY2hlZC5cbiIsCisJCWRldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lICk7CisJcmV0dXJuICAwOworfQorCisKK3N0YXRpYyBpbnQKK2VtYW5jaXBhdGUoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAgKnNubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnAgICA9IHNubC0+bWFzdGVyOworCXN0cnVjdCBuZXRfbG9jYWwgICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgcC0+cHJpdjsKKworCWlmKCAhKHNubC0+c3RhdGUgJiBGTF9TTEFWRSkgKQorCQlyZXR1cm4gIC1FSU5WQUw7CisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCXNwaW5fbG9jayggJnNubC0+bG9jayApOworCWRyb3BfeG1pdF9xdWV1ZSggZGV2ICk7CisKKwkvKiBleGNsdWRlIGZyb20gbGlzdCAqLworCWZvcig7OykgewkvKiBtdXN0IGJlIGluIGxpc3QgKi8KKwkJc3RydWN0IG5ldF9sb2NhbCAgKnQgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBwLT5wcml2OworCQlpZiggdC0+bGluayA9PSBkZXYgKSB7CisJCQl0LT5saW5rID0gc25sLT5saW5rOworCQkJYnJlYWs7CisJCX0KKwkJcCA9IHQtPmxpbms7CisJfQorCisJc25sLT5saW5rID0gTlVMTDsKKwlzbmwtPm1hc3RlciA9IGRldjsKKwlzbmwtPnN0YXRlICY9IH5GTF9TTEFWRTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKworCXNwaW5fdW5sb2NrKCAmc25sLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCisJZGV2X3B1dCggZGV2ICk7CisJcmV0dXJuICAwOworfQorCisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorc2JuaV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlyZXR1cm4gICYoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2KS0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXJldHVybjsJCS8qIHNibmkgYWx3YXlzIG9wZXJhdGUgaW4gcHJvbWlzY3VvcyBtb2RlICovCit9CisKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXVkLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJ4bCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtYWMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oc2tpcF9wY2lfcHJvYmUsIGJvb2wsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworaW50Citpbml0X21vZHVsZSggdm9pZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7CisJaW50IGVycjsKKworCXdoaWxlKCBudW0gPCBTQk5JX01BWF9OVU1fQ0FSRFMgKSB7CisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksIAorCQkJCSAgICJzYm5pJWQiLCBzYm5pX2RldnNldHVwKTsKKwkJaWYoICFkZXYpCisJCQlicmVhazsKKworCQlzcHJpbnRmKCBkZXYtPm5hbWUsICJzYm5pJWQiLCBudW0gKTsKKworCQllcnIgPSBzYm5pX2luaXQoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYoIHJlZ2lzdGVyX25ldGRldiggZGV2ICkgKSB7CisJCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCQlmcmVlX25ldGRldiggZGV2ICk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAgKnNibmlfY2FyZHMgID8gIDAgIDogIC1FTk9ERVY7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKCB2b2lkICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKmRldjsKKwlpbnQgIG51bTsKKworCWZvciggbnVtID0gMDsgIG51bSA8IFNCTklfTUFYX05VTV9DQVJEUzsgICsrbnVtICkKKwkJaWYoIChkZXYgPSBzYm5pX2NhcmRzWyBudW0gXSkgIT0gTlVMTCApIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKKwkJCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJCWZyZWVfbmV0ZGV2KCBkZXYgKTsKKwkJfQorfQorCisjZWxzZQkvKiBNT0RVTEUgKi8KKworc3RhdGljIGludCBfX2luaXQKK3Nibmlfc2V0dXAoIGNoYXIgICpwICkKK3sKKwlpbnQgIG4sIHBhcm07CisKKwlpZiggKnArKyAhPSAnKCcgKQorCQlnb3RvICBiYWRfcGFyYW07CisKKwlmb3IoIG4gPSAwLCBwYXJtID0gMDsgICpwICAmJiAgbiA8IDg7ICkgeworCQkoKmRlc3RbIHBhcm0gXSlbIG4gXSA9IHNpbXBsZV9zdHJ0b2woIHAsICZwLCAwICk7CisJCWlmKCAhKnAgIHx8ICAqcCA9PSAnKScgKQorCQkJcmV0dXJuIDE7CisJCWlmKCAqcCA9PSAnOycgKQorCQkJKytwLCArK24sIHBhcm0gPSAwOworCQllbHNlIGlmKCAqcCsrICE9ICcsJyApCisJCQlicmVhazsKKwkJZWxzZQorCQkJaWYoICsrcGFybSA+PSA1ICkKKwkJCQlicmVhazsKKwl9CitiYWRfcGFyYW06CisJcHJpbnRrKCBLRVJOX0VSUiAiRXJyb3IgaW4gc2JuaSBrZXJuZWwgcGFyYW1ldGVyIVxuIiApOworCXJldHVybiAwOworfQorCitfX3NldHVwKCAic2JuaT0iLCBzYm5pX3NldHVwICk7CisKKyNlbmRpZgkvKiBNT0RVTEUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEFTTV9DUkMKKworc3RhdGljIHUzMgorY2FsY19jcmMzMiggdTMyICBjcmMsICB1OCAgKnAsICB1MzIgIGxlbiApCit7CisJcmVnaXN0ZXIgdTMyICBfY3JjOworCV9jcmMgPSBjcmM7CisJCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkieG9ybAklJWVieCwgJSVlYnhcbiIKKwkJIm1vdmwJJTIsICUlZXNpXG4iIAorCQkibW92bAklMywgJSVlY3hcbiIgCisJCSJtb3ZsCSRjcmMzMnRhYiwgJSVlZGlcbiIKKwkJInNocmwJJDIsICUlZWN4XG4iCisJCSJqegkxZlxuIgorCisJCSIuYWxpZ24gNFxuIgorCSIwOlxuIgorCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJtb3ZsCSglJWVzaSksICUlZWR4XG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgklJWRsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVkeFxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJJSVkbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlZHhcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCSUlZGwsICUlYmxcbiIKKwkJIm1vdmIJJSVkaCwgJSVkbFxuIiAKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCSUlZGwsICUlYmxcbiIKKwkJImFkZGwJJDQsICUlZXNpXG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkiZGVjbAklJWVjeFxuIgorCQkiam56CTBiXG4iCisKKwkiMTpcbiIKKwkJIm1vdmwJJTMsICUlZWN4XG4iCisJCSJhbmRsCSQzLCAlJWVjeFxuIgorCQkianoJMmZcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgkoJSVlc2kpLCAlJWJsXG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkiZGVjbAklJWVjeFxuIgorCQkianoJMmZcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgkxKCUlZXNpKSwgJSVibFxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJImRlY2wJJSVlY3hcbiIKKwkJImp6CTJmXG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJMiglJWVzaSksICUlYmxcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCSIyOlxuIgorCQk6ICI9YSIgKF9jcmMpCisJCTogIjAiIChfY3JjKSwgImciIChwKSwgImciIChsZW4pCisJCTogImJ4IiwgImN4IiwgImR4IiwgInNpIiwgImRpIgorCSk7CisKKwlyZXR1cm4gIF9jcmM7Cit9CisKKyNlbHNlCS8qIEFTTV9DUkMgKi8KKworc3RhdGljIHUzMgorY2FsY19jcmMzMiggdTMyICBjcmMsICB1OCAgKnAsICB1MzIgIGxlbiApCit7CisJd2hpbGUoIGxlbi0tICkKKwkJY3JjID0gQ1JDMzIoICpwKyssIGNyYyApOworCisJcmV0dXJuICBjcmM7Cit9CisKKyNlbmRpZgkvKiBBU01fQ1JDICovCisKKworc3RhdGljIHUzMiAgY3JjMzJ0YWJbXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpID0geworCTB4RDIwMkVGOEQsICAweEE1MDVERjFCLCAgMHgzQzBDOEVBMSwgIDB4NEIwQkJFMzcsCisJMHhENTZGMkI5NCwgIDB4QTI2ODFCMDIsICAweDNCNjE0QUI4LCAgMHg0QzY2N0EyRSwKKwkweERDRDk2N0JGLCAgMHhBQkRFNTcyOSwgIDB4MzJENzA2OTMsICAweDQ1RDAzNjA1LAorCTB4REJCNEEzQTYsICAweEFDQjM5MzMwLCAgMHgzNUJBQzI4QSwgIDB4NDJCREYyMUMsCisJMHhDRkI1RkZFOSwgIDB4QjhCMkNGN0YsICAweDIxQkI5RUM1LCAgMHg1NkJDQUU1MywKKwkweEM4RDgzQkYwLCAgMHhCRkRGMEI2NiwgIDB4MjZENjVBREMsICAweDUxRDE2QTRBLAorCTB4QzE2RTc3REIsICAweEI2Njk0NzRELCAgMHgyRjYwMTZGNywgIDB4NTg2NzI2NjEsCisJMHhDNjAzQjNDMiwgIDB4QjEwNDgzNTQsICAweDI4MEREMkVFLCAgMHg1RjBBRTI3OCwKKwkweEU5NkNDRjQ1LCAgMHg5RTZCRkZEMywgIDB4MDc2MkFFNjksICAweDcwNjU5RUZGLAorCTB4RUUwMTBCNUMsICAweDk5MDYzQkNBLCAgMHgwMDBGNkE3MCwgIDB4NzcwODVBRTYsCisJMHhFN0I3NDc3NywgIDB4OTBCMDc3RTEsICAweDA5QjkyNjVCLCAgMHg3RUJFMTZDRCwKKwkweEUwREE4MzZFLCAgMHg5N0REQjNGOCwgIDB4MEVENEUyNDIsICAweDc5RDNEMkQ0LAorCTB4RjREQkRGMjEsICAweDgzRENFRkI3LCAgMHgxQUQ1QkUwRCwgIDB4NkREMjhFOUIsCisJMHhGM0I2MUIzOCwgIDB4ODRCMTJCQUUsICAweDFEQjg3QTE0LCAgMHg2QUJGNEE4MiwKKwkweEZBMDA1NzEzLCAgMHg4RDA3Njc4NSwgIDB4MTQwRTM2M0YsICAweDYzMDkwNkE5LAorCTB4RkQ2RDkzMEEsICAweDhBNkFBMzlDLCAgMHgxMzYzRjIyNiwgIDB4NjQ2NEMyQjAsCisJMHhBNERFQUUxRCwgIDB4RDNEOTlFOEIsICAweDRBRDBDRjMxLCAgMHgzREQ3RkZBNywKKwkweEEzQjM2QTA0LCAgMHhENEI0NUE5MiwgIDB4NERCRDBCMjgsICAweDNBQkEzQkJFLAorCTB4QUEwNTI2MkYsICAweEREMDIxNkI5LCAgMHg0NDBCNDcwMywgIDB4MzMwQzc3OTUsCisJMHhBRDY4RTIzNiwgIDB4REE2RkQyQTAsICAweDQzNjY4MzFBLCAgMHgzNDYxQjM4QywKKwkweEI5NjlCRTc5LCAgMHhDRTZFOEVFRiwgIDB4NTc2N0RGNTUsICAweDIwNjBFRkMzLAorCTB4QkUwNDdBNjAsICAweEM5MDM0QUY2LCAgMHg1MDBBMUI0QywgIDB4MjcwRDJCREEsCisJMHhCN0IyMzY0QiwgIDB4QzBCNTA2REQsICAweDU5QkM1NzY3LCAgMHgyRUJCNjdGMSwKKwkweEIwREZGMjUyLCAgMHhDN0Q4QzJDNCwgIDB4NUVEMTkzN0UsICAweDI5RDZBM0U4LAorCTB4OUZCMDhFRDUsICAweEU4QjdCRTQzLCAgMHg3MUJFRUZGOSwgIDB4MDZCOURGNkYsCisJMHg5OERENEFDQywgIDB4RUZEQTdBNUEsICAweDc2RDMyQkUwLCAgMHgwMUQ0MUI3NiwKKwkweDkxNkIwNkU3LCAgMHhFNjZDMzY3MSwgIDB4N0Y2NTY3Q0IsICAweDA4NjI1NzVELAorCTB4OTYwNkMyRkUsICAweEUxMDFGMjY4LCAgMHg3ODA4QTNEMiwgIDB4MEYwRjkzNDQsCisJMHg4MjA3OUVCMSwgIDB4RjUwMEFFMjcsICAweDZDMDlGRjlELCAgMHgxQjBFQ0YwQiwKKwkweDg1NkE1QUE4LCAgMHhGMjZENkEzRSwgIDB4NkI2NDNCODQsICAweDFDNjMwQjEyLAorCTB4OENEQzE2ODMsICAweEZCREIyNjE1LCAgMHg2MkQyNzdBRiwgIDB4MTVENTQ3MzksCisJMHg4QkIxRDI5QSwgIDB4RkNCNkUyMEMsICAweDY1QkZCM0I2LCAgMHgxMkI4ODMyMCwKKwkweDNGQkE2Q0FELCAgMHg0OEJENUMzQiwgIDB4RDFCNDBEODEsICAweEE2QjMzRDE3LAorCTB4MzhEN0E4QjQsICAweDRGRDA5ODIyLCAgMHhENkQ5Qzk5OCwgIDB4QTFERUY5MEUsCisJMHgzMTYxRTQ5RiwgIDB4NDY2NkQ0MDksICAweERGNkY4NUIzLCAgMHhBODY4QjUyNSwKKwkweDM2MEMyMDg2LCAgMHg0MTBCMTAxMCwgIDB4RDgwMjQxQUEsICAweEFGMDU3MTNDLAorCTB4MjIwRDdDQzksICAweDU1MEE0QzVGLCAgMHhDQzAzMURFNSwgIDB4QkIwNDJENzMsCisJMHgyNTYwQjhEMCwgIDB4NTI2Nzg4NDYsICAweENCNkVEOUZDLCAgMHhCQzY5RTk2QSwKKwkweDJDRDZGNEZCLCAgMHg1QkQxQzQ2RCwgIDB4QzJEODk1RDcsICAweEI1REZBNTQxLAorCTB4MkJCQjMwRTIsICAweDVDQkMwMDc0LCAgMHhDNUI1NTFDRSwgIDB4QjJCMjYxNTgsCisJMHgwNEQ0NEM2NSwgIDB4NzNEMzdDRjMsICAweEVBREEyRDQ5LCAgMHg5REREMURERiwKKwkweDAzQjk4ODdDLCAgMHg3NEJFQjhFQSwgIDB4RURCN0U5NTAsICAweDlBQjBEOUM2LAorCTB4MEEwRkM0NTcsICAweDdEMDhGNEMxLCAgMHhFNDAxQTU3QiwgIDB4OTMwNjk1RUQsCisJMHgwRDYyMDA0RSwgIDB4N0E2NTMwRDgsICAweEUzNkM2MTYyLCAgMHg5NDZCNTFGNCwKKwkweDE5NjM1QzAxLCAgMHg2RTY0NkM5NywgIDB4Rjc2RDNEMkQsICAweDgwNkEwREJCLAorCTB4MUUwRTk4MTgsICAweDY5MDlBODhFLCAgMHhGMDAwRjkzNCwgIDB4ODcwN0M5QTIsCisJMHgxN0I4RDQzMywgIDB4NjBCRkU0QTUsICAweEY5QjZCNTFGLCAgMHg4RUIxODU4OSwKKwkweDEwRDUxMDJBLCAgMHg2N0QyMjBCQywgIDB4RkVEQjcxMDYsICAweDg5REM0MTkwLAorCTB4NDk2NjJEM0QsICAweDNFNjExREFCLCAgMHhBNzY4NEMxMSwgIDB4RDA2RjdDODcsCisJMHg0RTBCRTkyNCwgIDB4MzkwQ0Q5QjIsICAweEEwMDU4ODA4LCAgMHhENzAyQjg5RSwKKwkweDQ3QkRBNTBGLCAgMHgzMEJBOTU5OSwgIDB4QTlCM0M0MjMsICAweERFQjRGNEI1LAorCTB4NDBEMDYxMTYsICAweDM3RDc1MTgwLCAgMHhBRURFMDAzQSwgIDB4RDlEOTMwQUMsCisJMHg1NEQxM0Q1OSwgIDB4MjNENjBEQ0YsICAweEJBREY1Qzc1LCAgMHhDREQ4NkNFMywKKwkweDUzQkNGOTQwLCAgMHgyNEJCQzlENiwgIDB4QkRCMjk4NkMsICAweENBQjVBOEZBLAorCTB4NUEwQUI1NkIsICAweDJEMEQ4NUZELCAgMHhCNDA0RDQ0NywgIDB4QzMwM0U0RDEsCisJMHg1RDY3NzE3MiwgIDB4MkE2MDQxRTQsICAweEIzNjkxMDVFLCAgMHhDNDZFMjBDOCwKKwkweDcyMDgwREY1LCAgMHgwNTBGM0Q2MywgIDB4OUMwNjZDRDksICAweEVCMDE1QzRGLAorCTB4NzU2NUM5RUMsICAweDAyNjJGOTdBLCAgMHg5QjZCQThDMCwgIDB4RUM2Qzk4NTYsCisJMHg3Q0QzODVDNywgIDB4MEJENEI1NTEsICAweDkyRERFNEVCLCAgMHhFNURBRDQ3RCwKKwkweDdCQkU0MURFLCAgMHgwQ0I5NzE0OCwgIDB4OTVCMDIwRjIsICAweEUyQjcxMDY0LAorCTB4NkZCRjFEOTEsICAweDE4QjgyRDA3LCAgMHg4MUIxN0NCRCwgIDB4RjZCNjRDMkIsCisJMHg2OEQyRDk4OCwgIDB4MUZENUU5MUUsICAweDg2RENCOEE0LCAgMHhGMURCODgzMiwKKwkweDYxNjQ5NUEzLCAgMHgxNjYzQTUzNSwgIDB4OEY2QUY0OEYsICAweEY4NkRDNDE5LAorCTB4NjYwOTUxQkEsICAweDExMEU2MTJDLCAgMHg4ODA3MzA5NiwgIDB4RkYwMDAwMDAKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmggYi9kcml2ZXJzL25ldC93YW4vc2JuaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzE1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5oCkBAIC0wLDAgKzEsMTQxIEBACisvKiBzYm5pLmg6ICBkZWZpbml0aW9ucyBmb3IgYSBHcmFuY2ggU0JOSTEyIGRyaXZlciwgdmVyc2lvbiA1LjAuMAorICogV3JpdHRlbiAyMDAxIERlbmlzIEkuVGltb2ZlZXYgKHRpbW9mZWV2QGdyYW5jaC5ydSkKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdQTAorICovCisKKyNpZm5kZWYgU0JOSV9ICisjZGVmaW5lIFNCTklfSAorCisjaWZkZWYgU0JOSV9ERUJVRworI2RlZmluZSBEUCggQSApIEEKKyNlbHNlCisjZGVmaW5lIERQKCBBICkKKyNlbmRpZgorCisKKy8qIFdlIGRvbid0IGhhdmUgb2ZmaWNpYWwgdmVuZG9yIGlkIHlldC4uLiAqLworI2RlZmluZSBTQk5JX1BDSV9WRU5ET1IgCTB4NTUgCisjZGVmaW5lIFNCTklfUENJX0RFVklDRSAJMHg5ZgorCisjZGVmaW5lIElTQV9NT0RFIDB4MDAKKyNkZWZpbmUgUENJX01PREUgMHgwMQorCisjZGVmaW5lCVNCTklfSU9fRVhURU5UCTQKKworZW51bSBzYm5pX3JlZyB7CisJQ1NSMCA9IDAsCisJQ1NSMSA9IDEsCisJREFUICA9IDIKK307CisKKy8qIENTUjAgbWFwcGluZyAqLworZW51bSB7CisJQlVfRU1QID0gMHgwMiwKKwlSQ19DSEsgPSAweDA0LAorCUNUX1pFUiA9IDB4MDgsCisJVFJfUkVRID0gMHgxMCwKKwlUUl9SRFkgPSAweDIwLAorCUVOX0lOVCA9IDB4NDAsCisJUkNfUkRZID0gMHg4MAorfTsKKworCisvKiBDU1IxIG1hcHBpbmcgKi8KKyNkZWZpbmUgUFJfUkVTIDB4ODAKKworc3RydWN0IHNibmlfY3NyMSB7CisJdW5zaWduZWQgcnhsCTogNTsKKwl1bnNpZ25lZCByYXRlCTogMjsKKwl1bnNpZ25lZCAJOiAxOworfTsKKworLyogZmllbGRzIGluIGZyYW1lIGhlYWRlciAqLworI2RlZmluZSBGUkFNRV9BQ0tfTUFTSyAgKHVuc2lnbmVkIHNob3J0KTB4NzAwMAorI2RlZmluZSBGUkFNRV9MRU5fTUFTSyAgKHVuc2lnbmVkIHNob3J0KTB4MDNGRgorI2RlZmluZSBGUkFNRV9GSVJTVCAgICAgKHVuc2lnbmVkIHNob3J0KTB4ODAwMAorI2RlZmluZSBGUkFNRV9SRVRSWSAgICAgKHVuc2lnbmVkIHNob3J0KTB4MDgwMAorCisjZGVmaW5lIEZSQU1FX1NFTlRfQkFEICAodW5zaWduZWQgc2hvcnQpMHg0MDAwCisjZGVmaW5lIEZSQU1FX1NFTlRfT0sgICAodW5zaWduZWQgc2hvcnQpMHgzMDAwCisKKworLyogc3RhdGUgZmxhZ3MgKi8KK2VudW0geworCUZMX1dBSVRfQUNLICAgID0gMHgwMSwKKwlGTF9ORUVEX1JFU0VORCA9IDB4MDIsCisJRkxfUFJFVl9PSyAgICAgPSAweDA0LAorCUZMX1NMT1dfTU9ERSAgID0gMHgwOCwKKwlGTF9TRUNPTkRBUlkgICA9IDB4MTAsCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJRkxfU0xBVkUgICAgICAgPSAweDIwLAorI2VuZGlmCisJRkxfTElORV9ET1dOICAgPSAweDQwCit9OworCisKK2VudW0geworCURFRkFVTFRfSU9CQVNFQUREUiA9IDB4MjEwLAorCURFRkFVTFRfSU5URVJSVVBUTlVNQkVSID0gNSwKKwlERUZBVUxUX1JBVEUgPSAwLAorCURFRkFVTFRfRlJBTUVfTEVOID0gMTAxMgorfTsKKworI2RlZmluZSBERUZfUlhMX0RFTFRBCS0xCisjZGVmaW5lIERFRl9SWEwJCTB4ZgorCisjZGVmaW5lIFNCTklfU0lHIDB4NWEKKworI2RlZmluZQlTQk5JX01JTl9MRU4JNjAJLyogU2hvcnRlc3QgRXRoZXJuZXQgZnJhbWUgd2l0aG91dCBGQ1MgKi8KKyNkZWZpbmUgU0JOSV9NQVhfRlJBTUUJMTAyMworI2RlZmluZSBFVEhFUl9NQVhfTEVOCTE1MTgKKworI2RlZmluZSBTQk5JX1RJTUVPVVQJKEhaLzEwKQorCisjZGVmaW5lIFRSX0VSUk9SX0NPVU5UCTMyCisjZGVmaW5lIENIQU5HRV9MRVZFTF9TVEFSVF9USUNLUyA0CisKKyNkZWZpbmUgU0JOSV9NQVhfTlVNX0NBUkRTCTE2CisKKy8qIGludGVybmFsIFNCTkktc3BlY2lmaWMgc3RhdGlzdGljcyAqLworc3RydWN0IHNibmlfaW5fc3RhdHMgeworCXUzMglhbGxfcnhfbnVtYmVyOworCXUzMgliYWRfcnhfbnVtYmVyOworCXUzMgl0aW1lb3V0X251bWJlcjsKKwl1MzIJYWxsX3R4X251bWJlcjsKKwl1MzIJcmVzZW5kX3R4X251bWJlcjsKK307CisKKy8qIFNCTkkgaW9jdGwgcGFyYW1zICovCisjZGVmaW5lIFNJT0NERVZHRVRJTlNUQVRTIAlTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUkVTSU5TVEFUUyAJU0lPQ0RFVlBSSVZBVEUrMQorI2RlZmluZSBTSU9DREVWR0hXU1RBVEUgICAJU0lPQ0RFVlBSSVZBVEUrMgorI2RlZmluZSBTSU9DREVWU0hXU1RBVEUgICAJU0lPQ0RFVlBSSVZBVEUrMworI2RlZmluZSBTSU9DREVWRU5TTEFWRSAgCVNJT0NERVZQUklWQVRFKzQKKyNkZWZpbmUgU0lPQ0RFVkVNQU5TSVBBVEUgIAlTSU9DREVWUFJJVkFURSs1CisKKworLyogZGF0YSBwYWNrZXQgZm9yIFNJT0NERVZHSFdTVEFURS9TSU9DREVWU0hXU1RBVEUgaW9jdGwgcmVxdWVzdHMgKi8KK3N0cnVjdCBzYm5pX2ZsYWdzIHsKKwl1MzIJcnhsCQk6IDQ7CisJdTMyCXJhdGUJCTogMjsKKwl1MzIJZml4ZWRfcnhsCTogMTsKKwl1MzIJc2xvd19tb2RlCTogMTsKKwl1MzIJbWFjX2FkZHIJOiAyNDsKK307CisKKy8qCisgKiBDUkMtMzIgc3R1ZmYKKyAqLworI2RlZmluZSBDUkMzMihjLGNyYykgKGNyYzMydGFiWygoc2l6ZV90KShjcmMpIF4gKGMpKSAmIDB4ZmZdIF4gKCgoY3JjKSA+PiA4KSAmIDB4MDBGRkZGRkYpKQorICAgICAgLyogQ1JDIGdlbmVyYXRvciAweEVEQjg4MzIwICovCisgICAgICAvKiBDUkMgcmVtYWluZGVyIDB4MjE0NERGMUMgKi8KKyAgICAgIC8qIENSQyBpbml0aWFsIHZhbHVlIDB4MDAwMDAwMDAgKi8KKyNkZWZpbmUgQ1JDMzJfUkVNQUlOREVSIDB4MjE0NERGMUMKKyNkZWZpbmUgQ1JDMzJfSU5JVElBTCAweDAwMDAwMDAwCisKKyNpZm5kZWYgX19pbml0ZGF0YQorI2RlZmluZSBfX2luaXRkYXRhCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzlhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCkBAIC0wLDAgKzEsMTY3NiBAQAorLyoKKyAqIFNETEEJCUFuIGltcGxlbWVudGF0aW9uIG9mIGEgZHJpdmVyIGZvciB0aGUgU2FuZ29tYSBTNTAyL1M1MDggc2VyaWVzCisgKgkJbXVsdGktcHJvdG9jb2wgUEMgaW50ZXJmYWNlIGNhcmQuICBJbml0aWFsIG9mZmVyaW5nIGlzIHdpdGggCisgKgkJdGhlIERMQ0kgZHJpdmVyLCBwcm92aWRpbmcgRnJhbWUgUmVsYXkgc3VwcG9ydCBmb3IgbGludXguCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIEZyYW1lIHJlbGF5IGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpc2RsYS5jICAgMC4zMAkxMiBTZXAgMTk5NgorICoKKyAqIENyZWRpdHM6CVNhbmdvbWEgVGVjaG5vbG9naWVzLCBmb3IgdGhlIHVzZSBvZiAyIGNhcmRzIGZvciBhbiBleHRlbmRlZAorICoJCQlwZXJpb2Qgb2YgdGltZS4KKyAqCQlEYXZpZCBNYW5kZWxzdGFtIDxkbUBzYW5nb21hLmNvbT4gZm9yIGdldHRpbmcgbWUgc3RhcnRlZCBvbiAKKyAqCQkJdGhpcyBwcm9qZWN0LCBhbmQgaW5jZW50aXZlIHRvIGNvbXBsZXRlIGl0LgorICoJCUdlbmUgS296ZW4gPDc0NjA0LjE1MkBjb21wdXNlcnZlLmNvbT4gZm9yIHByb3ZpZGluZyBtZSB3aXRoCisgKgkJCWltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZHMuCisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCQkwLjE1CU1pa2UgTWNMYWdhbglJbXByb3ZlZCBlcnJvciBoYW5kbGluZywgcGFja2V0IGRyb3BwaW5nCisgKgkJMC4yMAlNaWtlIE1jTGFnYW4JTmV3IHRyYW5zbWl0L3JlY2VpdmUgZmxhZ3MgZm9yIGNvbmZpZworICoJCQkJCUlmIGluIEZSIG1vZGUsIGRvbid0IGFjY2VwdCBwYWNrZXRzIGZyb20KKyAqCQkJCQlub24gRExDSSBkZXZpY2VzLgorICoJCTAuMjUJTWlrZSBNY0xhZ2FuCUZpeGVkIHByb2JsZW0gd2l0aCByZWplY3RpbmcgcGFja2V0cworICoJCQkJCWZyb20gbm9uIERMQ0kgZGV2aWNlcy4KKyAqCQkwLjMwCU1pa2UgTWNMYWdhbglGaXhlZCBrZXJuZWwgcGFuaWMgd2hlbiB1c2VkIHdpdGggbW9kaWZpZWQKKyAqCQkJCQlpZmNvbmZpZworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19ETENJX01BWCAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2ZyYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZGxhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIlNETEEgZHJpdmVyIHYwLjMwLCAxMiBTZXAgMTk5NiwgbWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZyI7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfcG9ydFtdIF9faW5pdGRhdGEgPSB7IDB4MjUwLCAweDI3MCwgMHgyODAsIDB4MzAwLCAweDM1MCwgMHgzNjAsIDB4MzgwLCAweDM5MH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfbWVtW10gIF9faW5pdGRhdGEgPSB7CisJCQkJICAgIDB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsIDB4QUUwMDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMDAwMCwgMHhCMjAwMCwgMHhCNDAwMCwgMHhCNjAwMCwgMHhCODAwMCwgMHhCQTAwMCwgMHhCQzAwMCwgMHhCRTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsIDB4Q0UwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEQwMDAwLCAweEQyMDAwLCAweEQ0MDAwLCAweEQ2MDAwLCAweEQ4MDAwLCAweERBMDAwLCAweERDMDAwLCAweERFMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMDAwMCwgMHhFMjAwMCwgMHhFNDAwMCwgMHhFNjAwMCwgMHhFODAwMCwgMHhFQTAwMCwgMHhFQzAwMCwgMHhFRTAwMH07IAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNkbGFfbG9jayk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0aGVzZSBhcmUgdGhlIGNvcmUgcm91dGluZXMgdGhhdCBhY2Nlc3MgdGhlIGNhcmQgaXRzZWxmIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0RMQV9XSU5ET1coZGV2LGFkZHIpIG91dGIoKCgoYWRkcikgPj4gMTMpICYgMHgxRiksIChkZXYpLT5iYXNlX2FkZHIgKyBTRExBX1JFR19aODBfV0lORE9XKQorCitzdGF0aWMgdm9pZCBfX3NkbGFfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkciwgdm9pZCAqYnVmLCBzaG9ydCBsZW4pCit7CisJY2hhciAgICAgICAgICAqdGVtcDsKKwljb25zdCB2b2lkICAgICpiYXNlOworCWludCAgICAgICAgICAgb2Zmc2V0LCBieXRlczsKKworCXRlbXAgPSBidWY7CisJd2hpbGUobGVuKQorCXsJCisJCW9mZnNldCA9IGFkZHIgJiBTRExBX0FERFJfTUFTSzsKKwkJYnl0ZXMgPSBvZmZzZXQgKyBsZW4gPiBTRExBX1dJTkRPV19TSVpFID8gU0RMQV9XSU5ET1dfU0laRSAtIG9mZnNldCA6IGxlbjsKKwkJYmFzZSA9IChjb25zdCB2b2lkICopIChkZXYtPm1lbV9zdGFydCArIG9mZnNldCk7CisKKwkJU0RMQV9XSU5ET1coZGV2LCBhZGRyKTsKKwkJbWVtY3B5KHRlbXAsIGJhc2UsIGJ5dGVzKTsKKworCQlhZGRyICs9IGJ5dGVzOworCQl0ZW1wICs9IGJ5dGVzOworCQlsZW4gIC09IGJ5dGVzOworCX0gIAorfQorCitzdGF0aWMgdm9pZCBzZGxhX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCV9fc2RsYV9yZWFkKGRldiwgYWRkciwgYnVmLCBsZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX3NkbGFfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIAorCQkJIGNvbnN0IHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCWNvbnN0IGNoYXIgICAgKnRlbXA7CisJdm9pZCAJICAgICAgKmJhc2U7CisJaW50ICAgICAgICAgICBvZmZzZXQsIGJ5dGVzOworCisJdGVtcCA9IGJ1ZjsKKwl3aGlsZShsZW4pCisJeworCQlvZmZzZXQgPSBhZGRyICYgU0RMQV9BRERSX01BU0s7CisJCWJ5dGVzID0gb2Zmc2V0ICsgbGVuID4gU0RMQV9XSU5ET1dfU0laRSA/IFNETEFfV0lORE9XX1NJWkUgLSBvZmZzZXQgOiBsZW47CisJCWJhc2UgPSAodm9pZCAqKSAoZGV2LT5tZW1fc3RhcnQgKyBvZmZzZXQpOworCisJCVNETEFfV0lORE9XKGRldiwgYWRkcik7CisJCW1lbWNweShiYXNlLCB0ZW1wLCBieXRlcyk7CisKKwkJYWRkciArPSBieXRlczsKKwkJdGVtcCArPSBieXRlczsKKwkJbGVuICAtPSBieXRlczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIAorCQkgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaG9ydCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwlfX3NkbGFfd3JpdGUoZGV2LCBhZGRyLCBidWYsIGxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2RsYV9jbGVhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAgICAgICAgICAqYmFzZTsKKwlpbnQgICAgICAgICAgIGxlbiwgYWRkciwgYnl0ZXM7CisKKwlsZW4gPSA2NTUzNjsJCisJYWRkciA9IDA7CisJYnl0ZXMgPSBTRExBX1dJTkRPV19TSVpFOworCWJhc2UgPSAodm9pZCAqKSBkZXYtPm1lbV9zdGFydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwl3aGlsZShsZW4pCisJeworCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQltZW1zZXQoYmFzZSwgMCwgYnl0ZXMpOworCisJCWFkZHIgKz0gYnl0ZXM7CisJCWxlbiAgLT0gYnl0ZXM7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyBjaGFyIHNkbGFfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgICAgICAgICAgYnl0ZSwgKnRlbXA7CisKKwl0ZW1wID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKGFkZHIgJiBTRExBX0FERFJfTUFTSykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCVNETEFfV0lORE9XKGRldiwgYWRkcik7CisJYnl0ZSA9ICp0ZW1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuKGJ5dGUpOworfQorCit2b2lkIHNkbGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3dpdGNoKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJCW91dGIoU0RMQV9TNTAyQV9IQUxULCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IFNETEFfSEFMVDsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwMkU6CisJCQlvdXRiKFNETEFfSEFMVCwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19aODBfQ09OVFJPTCk7CisJCQlvdXRiKFNETEFfUzUwMkVfRU5BQkxFLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwMkVfRU5BQkxFOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA3OgorCQkJZmxwLT5zdGF0ZSAmPSB+U0RMQV9DUFVFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwODoKKwkJCWZscC0+c3RhdGUgJj0gflNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgc2RsYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3dpdGNoKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJCW91dGIoU0RMQV9TNTAyQV9OTUksIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlvdXRiKFNETEFfUzUwMkFfU1RBUlQsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTAyQV9TVEFSVDsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwMkU6CisJCQlvdXRiKFNETEFfUzUwMkVfQ1BVRU4sIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfWjgwX0NPTlRST0wpOworCQkJb3V0YigweDAwLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDc6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdGhpcyBpcyB1c2VkIGZvciB0aGUgUzUwMkEvRSBjYXJkcyB0byBkZXRlcm1pbmUKKyAqIHRoZSBzcGVlZCBvZiB0aGUgb25ib2FyZCBDUFUuICBDYWxpYnJhdGlvbiBpcworICogbmVjZXNzYXJ5IGZvciB0aGUgRnJhbWUgUmVsYXkgY29kZSB1cGxvYWRlZCAKKyAqIGxhdGVyLiAgSW5jb3JyZWN0IHJlc3VsdHMgY2F1c2UgdGltaW5nIHByb2JsZW1zCisgKiB3aXRoIGxpbmsgY2hlY2tzICYgc3RhdHVzIG1lc3NhZ2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHNkbGFfejgwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHo4MF9hZGRyLCBpbnQgamlmZnMsIGNoYXIgcmVzcDEsIGNoYXIgcmVzcDIpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZG9uZSwgbm93OworCWNoYXIgICAgICAgICAgcmVzcCwgKnRlbXA7CisKKwlzdGFydCA9IG5vdyA9IGppZmZpZXM7CisJZG9uZSA9IGppZmZpZXMgKyBqaWZmczsKKworCXRlbXAgPSAodm9pZCAqKWRldi0+bWVtX3N0YXJ0OworCXRlbXAgKz0gejgwX2FkZHIgJiBTRExBX0FERFJfTUFTSzsKKwkKKwlyZXNwID0gfnJlc3AxOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkb25lKSAmJiAocmVzcCAhPSByZXNwMSkgJiYgKCFyZXNwMiB8fCAocmVzcCAhPSByZXNwMikpKQorCXsKKwkJaWYgKGppZmZpZXMgIT0gbm93KQorCQl7CisJCQlTRExBX1dJTkRPVyhkZXYsIHo4MF9hZGRyKTsKKwkJCW5vdyA9IGppZmZpZXM7CisJCQlyZXNwID0gKnRlbXA7CisJCX0KKwl9CisJcmV0dXJuKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRvbmUpID8gamlmZmllcyAtIHN0YXJ0IDogLTEpOworfQorCisvKiBjb25zdGFudHMgZm9yIFo4MCBDUFUgc3BlZWQgKi8KKyNkZWZpbmUgWjgwX1JFQURZIAkJJzEnCS8qIFo4MCBpcyByZWFkeSB0byBiZWdpbiAqLworI2RlZmluZSBMT0FERVJfUkVBRFkgCQknMicJLyogZHJpdmVyIGlzIHJlYWR5IHRvIGJlZ2luICovCisjZGVmaW5lIFo4MF9TQ0NfT0sgCQknMycJLyogU0NDIGlzIG9uIGJvYXJkICovCisjZGVmaW5lIFo4MF9TQ0NfQkFECSAJJzQnCS8qIFNDQyB3YXMgbm90IGZvdW5kICovCisKK3N0YXRpYyBpbnQgc2RsYV9jcHVzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlpbnQgIGppZmZzOworCWNoYXIgZGF0YTsKKworCXNkbGFfc3RhcnQoZGV2KTsKKwlpZiAoc2RsYV96ODBfcG9sbChkZXYsIDAsIDMqSFosIFo4MF9SRUFEWSwgMCkgPCAwKQorCQlyZXR1cm4oLUVJTyk7CisKKwlkYXRhID0gTE9BREVSX1JFQURZOworCXNkbGFfd3JpdGUoZGV2LCAwLCAmZGF0YSwgMSk7CisKKwlpZiAoKGppZmZzID0gc2RsYV96ODBfcG9sbChkZXYsIDAsIDgqSFosIFo4MF9TQ0NfT0ssIFo4MF9TQ0NfQkFEKSkgPCAwKQorCQlyZXR1cm4oLUVJTyk7CisKKwlzZGxhX3N0b3AoZGV2KTsKKwlzZGxhX3JlYWQoZGV2LCAwLCAmZGF0YSwgMSk7CisKKwlpZiAoZGF0YSA9PSBaODBfU0NDX0JBRCkKKwl7CisJCXByaW50aygiJXM6IFNDQyBiYWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlpZiAoZGF0YSAhPSBaODBfU0NDX09LKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlpZiAoamlmZnMgPCAxNjUpCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzE2TTsKKwllbHNlIGlmIChqaWZmcyA8IDIyMCkKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfMTBNOworCWVsc2UgaWYgKGppZmZzIDwgMjU4KQorCQlpZnItPmlmcl9tdHUgPSBTRExBX0NQVV84TTsKKwllbHNlIGlmIChqaWZmcyA8IDM1NykKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfN007CisJZWxzZSBpZiAoamlmZnMgPCA0NjcpCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzVNOworCWVsc2UKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfM007CisgCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBGcmFtZSBSZWxheSBjb2RlIAorICogIHN0YXJ0cyBoZXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBfZGxjaV9zdGF0IAoreworCXNob3J0IGRsY2kJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCWNoYXIgIGZsYWdzCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CisKK3N0cnVjdCBfZnJhZF9zdGF0IAoreworCWNoYXIgICAgZmxhZ3M7CisJc3RydWN0IF9kbGNpX3N0YXQgZGxjaXNbU0RMQV9NQVhfRExDSV07Cit9OworCitzdGF0aWMgdm9pZCBzZGxhX2Vycm9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kLCBpbnQgZGxjaSwgaW50IHJldCwgaW50IGxlbiwgdm9pZCAqZGF0YSkgCit7CisJc3RydWN0IF9kbGNpX3N0YXQgKnBzdGF0dXM7CisJc2hvcnQgICAgICAgICAgICAgKnBkbGNpOworCWludCAgICAgICAgICAgICAgIGk7CisJY2hhciAgICAgICAgICAgICAgKnN0YXRlLCBsaW5lWzMwXTsKKworCXN3aXRjaCAocmV0KQorCXsKKwkJY2FzZSBTRExBX1JFVF9NT0RFTToKKwkJCXN0YXRlID0gZGF0YTsKKwkJCWlmICgqc3RhdGUgJiBTRExBX01PREVNX0RDRF9MT1cpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIERDRCB1bmV4cGVjdGVkbHkgbG93IVxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICgqc3RhdGUgJiBTRExBX01PREVNX0NUU19MT1cpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIENUUyB1bmV4cGVjdGVkbHkgbG93IVxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIEkgc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyBhYm91dCB0aGlzISAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9DSEFOTkVMX09GRjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFubmVsIGJlY2FtZSBpbm9wZXJhdGl2ZSFcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBzYW1lIGhlcmUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQ0hBTk5FTF9PTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFubmVsIGJlY2FtZSBvcGVyYXRpdmUhXG4iLCBkZXYtPm5hbWUpOworCQkJLyogc2FtZSBoZXJlICovCisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0RMQ0lfU1RBVFVTOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXR1cyBjaGFuZ2UgcmVwb3J0ZWQgYnkgQWNjZXNzIE5vZGUuXG4iLCBkZXYtPm5hbWUpOworCQkJbGVuIC89IHNpemVvZihzdHJ1Y3QgX2RsY2lfc3RhdCk7CisJCQlmb3IocHN0YXR1cyA9IGRhdGEsIGk9MDtpIDwgbGVuO2krKyxwc3RhdHVzKyspCisJCQl7CisJCQkJaWYgKHBzdGF0dXMtPmZsYWdzICYgU0RMQV9ETENJX05FVykKKwkJCQkJc3RhdGUgPSAibmV3IjsKKwkJCQllbHNlIGlmIChwc3RhdHVzLT5mbGFncyAmIFNETEFfRExDSV9ERUxFVEVEKQorCQkJCQlzdGF0ZSA9ICJkZWxldGVkIjsKKwkJCQllbHNlIGlmIChwc3RhdHVzLT5mbGFncyAmIFNETEFfRExDSV9BQ1RJVkUpCisJCQkJCXN0YXRlID0gImFjdGl2ZSI7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc3ByaW50ZihsaW5lLCAidW5rbm93biBzdGF0dXM6ICUwMlgiLCBwc3RhdHVzLT5mbGFncyk7CisJCQkJCXN0YXRlID0gbGluZTsKKwkJCQl9CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgJWk6ICVzLlxuIiwgZGV2LT5uYW1lLCBwc3RhdHVzLT5kbGNpLCBzdGF0ZSk7CisJCQkJLyogc2FtZSBoZXJlICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0RMQ0lfVU5LTk9XTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCB1bmtub3duIERMQ0lzOiIsIGRldi0+bmFtZSk7CisJCQlsZW4gLz0gc2l6ZW9mKHNob3J0KTsKKwkJCWZvcihwZGxjaSA9IGRhdGEsaT0wO2kgPCBsZW47aSsrLHBkbGNpKyspCisJCQkJcHJpbnRrKCIgJWkiLCAqcGRsY2kpOworCQkJcHJpbnRrKCJcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29tbWFuZCB0aW1lZCBvdXQhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9CVUZfT1ZFUlNJWkU6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmMvQ0lSIG92ZXJmbG93LCBhY2NlcHRhYmxlIHNpemUgaXMgJWlcbiIsIGRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQlVGX1RPT19CSUc6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQnVmZmVyIHNpemUgb3ZlciBzcGVjaWZpZWQgbWF4IG9mICVpXG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0NIQU5ORUxfSU5BQ1RJVkU6CisJCWNhc2UgU0RMQV9SRVRfRExDSV9JTkFDVElWRToKKwkJY2FzZSBTRExBX1JFVF9DSVJfT1ZFUkZMT1c6CisJCWNhc2UgU0RMQV9SRVRfTk9fQlVGUzoKKwkJCWlmIChjbWQgPT0gU0RMQV9JTkZPUk1BVElPTl9XUklURSkKKwkJCQlicmVhazsKKworCQlkZWZhdWx0OiAKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ21kIDB4JTIuMlggZ2VuZXJhdGVkIHJldHVybiBjb2RlIDB4JTIuMlhcbiIsIGRldi0+bmFtZSwgY21kLCByZXQpOworCQkJLyogRnVydGhlciBwcm9jZXNzaW5nIGNvdWxkIGJlIGRvbmUgaGVyZSAqLworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNkbGFfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQsIHNob3J0IGRsY2ksIHNob3J0IGZsYWdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluYnVmLCBzaG9ydCBpbmxlbiwgdm9pZCAqb3V0YnVmLCBzaG9ydCAqb3V0bGVuKQoreworCXN0YXRpYyBzdHJ1Y3QgX2ZyYWRfc3RhdCBzdGF0dXM7CisJc3RydWN0IGZyYWRfbG9jYWwgICAgICAgICpmbHA7CisJc3RydWN0IHNkbGFfY21kICAgICAgICAgICpjbWRfYnVmOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICBwZmxhZ3M7CisJdW5zaWduZWQgbG9uZwkJIGppZmZzOworCWludCAgICAgICAgICAgICAgICAgICAgICByZXQsIHdhaXRpbmcsIGxlbjsKKwlsb25nICAgICAgICAgICAgICAgICAgICAgd2luZG93OworCisJZmxwID0gZGV2LT5wcml2OworCXdpbmRvdyA9IGZscC0+dHlwZSA9PSBTRExBX1M1MDggPyBTRExBXzUwOF9DTURfQlVGIDogU0RMQV81MDJfQ01EX0JVRjsKKwljbWRfYnVmID0gKHN0cnVjdCBzZGxhX2NtZCAqKShkZXYtPm1lbV9zdGFydCArICh3aW5kb3cgJiBTRExBX0FERFJfTUFTSykpOworCXJldCA9IDA7CisJbGVuID0gMDsKKwlqaWZmcyA9IGppZmZpZXMgKyBIWjsgIC8qIDEgc2Vjb25kIGlzIHBsZW50eSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgcGZsYWdzKTsKKwlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJY21kX2J1Zi0+Y21kID0gY21kOworCWNtZF9idWYtPmRsY2kgPSBkbGNpOworCWNtZF9idWYtPmZsYWdzID0gZmxhZ3M7CisKKwlpZiAoaW5idWYpCisJCW1lbWNweShjbWRfYnVmLT5kYXRhLCBpbmJ1ZiwgaW5sZW4pOworCisJY21kX2J1Zi0+bGVuZ3RoID0gaW5sZW47CisKKwljbWRfYnVmLT5vcHBfZmxhZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCisJd2FpdGluZyA9IDE7CisJbGVuID0gMDsKKwl3aGlsZSAod2FpdGluZyAmJiB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBqaWZmcykpCisJeworCQlpZiAod2FpdGluZysrICUgMykgCisJCXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJCQlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJCQl3YWl0aW5nID0gKCh2b2xhdGlsZSBpbnQpKGNtZF9idWYtPm9wcF9mbGFnKSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJCX0KKwl9CisJCisJaWYgKCF3YWl0aW5nKQorCXsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCQlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJCXJldCA9IGNtZF9idWYtPnJldHZhbDsKKwkJbGVuID0gY21kX2J1Zi0+bGVuZ3RoOworCQlpZiAob3V0YnVmICYmIG91dGxlbikKKwkJeworCQkJKm91dGxlbiA9ICpvdXRsZW4gPj0gbGVuID8gbGVuIDogKm91dGxlbjsKKworCQkJaWYgKCpvdXRsZW4pCisJCQkJbWVtY3B5KG91dGJ1ZiwgY21kX2J1Zi0+ZGF0YSwgKm91dGxlbik7CisJCX0KKworCQkvKiBUaGlzIGlzIGEgbG9jYWwgY29weSB0aGF0J3MgdXNlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKHJldCkKKwkJCW1lbWNweSgmc3RhdHVzLCBjbWRfYnVmLT5kYXRhLCBsZW4gPiBzaXplb2Yoc3RhdHVzKSA/IHNpemVvZihzdGF0dXMpIDogbGVuKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJfQorCWVsc2UKKwkJcmV0ID0gU0RMQV9SRVRfVElNRU9VVDsKKworCWlmIChyZXQgIT0gU0RMQV9SRVRfT0spCisJICAgCXNkbGFfZXJyb3JzKGRldiwgY21kLCBkbGNpLCByZXQsIGxlbiwgJnN0YXR1cyk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIERMQ0kgZHJpdmVyIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzZGxhX3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgc2RsYV9hY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgaTsKKworCWZscCA9IHNsYXZlLT5wcml2OworCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPm1hc3RlcltpXSA9PSBtYXN0ZXIpCisJCQlicmVhazsKKworCWlmIChpID09IENPTkZJR19ETENJX01BWCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJZmxwLT5kbGNpW2ldID0gYWJzKGZscC0+ZGxjaVtpXSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkgJiYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpKQorCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9BQ1RJVkFURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKworCXJldHVybigwKTsKK30KKworaW50IHNkbGFfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+bWFzdGVyW2ldID09IG1hc3RlcikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlmbHAtPmRsY2lbaV0gPSAtYWJzKGZscC0+ZGxjaVtpXSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkgJiYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpKQorCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9ERUFDVElWQVRFX0RMQ0ksIDAsIDAsICZmbHAtPmRsY2lbaV0sIHNpemVvZihzaG9ydCksIE5VTEwsIE5VTEwpOworCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9hc3NvYyhzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJaWYgKG1hc3Rlci0+dHlwZSAhPSBBUlBIUkRfRExDSSkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwl7CisJCWlmICghZmxwLT5tYXN0ZXJbaV0pCisJCQlicmVhazsKKwkJaWYgKGFicyhmbHAtPmRsY2lbaV0pID09ICooc2hvcnQgKikobWFzdGVyLT5kZXZfYWRkcikpCisJCQlyZXR1cm4oLUVBRERSSU5VU0UpOworCX0gCisKKwlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXJldHVybigtRU1MSU5LKTsgIC8qICMjIyMgQWxhbjogQ29tbWVudHMgb24gdGhpcyA/PyAqLworCisKKwlmbHAtPm1hc3RlcltpXSA9IG1hc3RlcjsKKwlmbHAtPmRsY2lbaV0gPSAtKihzaG9ydCAqKShtYXN0ZXItPmRldl9hZGRyKTsKKwltYXN0ZXItPm10dSA9IHNsYXZlLT5tdHU7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkpIHsKKwkJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX0NQRSkKKwkJCXNkbGFfcmVjb25maWcoc2xhdmUpOworCQllbHNlCisJCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9BRERfRExDSSwgMCwgMCwgbWFzdGVyLT5kZXZfYWRkciwgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9kZWFzc29jKHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSwgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWludCAgICAgICAgICAgICAgIGk7CisKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKworCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQlpZiAoZmxwLT5tYXN0ZXJbaV0gPT0gbWFzdGVyKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXJldHVybigtRU5PREVWKTsKKworCWZscC0+bWFzdGVyW2ldID0gTlVMTDsKKwlmbHAtPmRsY2lbaV0gPSAwOworCisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkpIHsKKwkJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX0NQRSkKKwkJCXNkbGFfcmVjb25maWcoc2xhdmUpOworCQllbHNlCisJCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9ERUxFVEVfRExDSSwgMCwgMCwgbWFzdGVyLT5kZXZfYWRkciwgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9kbGNpX2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlLCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyLCBpbnQgZ2V0KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCXNob3J0ICAgICAgICAgICAgIGxlbiwgcmV0OworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+bWFzdGVyW2ldID09IG1hc3RlcikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlkbHAgPSBtYXN0ZXItPnByaXY7CisKKwlyZXQgPSBTRExBX1JFVF9PSzsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGRsY2lfY29uZik7CisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpKSB7CisJCWlmIChnZXQpCisJCQlyZXQgPSBzZGxhX2NtZChzbGF2ZSwgU0RMQV9SRUFEX0RMQ0lfQ09ORklHVVJBVElPTiwgYWJzKGZscC0+ZGxjaVtpXSksIDAsICAKKwkJCSAgICAgICAgICAgIE5VTEwsIDAsICZkbHAtPmNvbmZpZywgJmxlbik7CisJCWVsc2UKKwkJCXJldCA9IHNkbGFfY21kKHNsYXZlLCBTRExBX1NFVF9ETENJX0NPTkZJR1VSQVRJT04sIGFicyhmbHAtPmRsY2lbaV0pLCAwLCAgCisJCQkgICAgICAgICAgICAmZGxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSAtIDQgKiBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4ocmV0ID09IFNETEFfUkVUX09LID8gMCA6IC1FSU8pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBub3cgZm9yIHRoZSBMaW51eCBkcml2ZXIgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOT1RFOiB0aGUgRExDSSBkcml2ZXIgZGVhbHMgd2l0aCBmcmVlaW5nIHRoZSBTS0IhISAqLworc3RhdGljIGludCBzZGxhX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICByZXQsIGFkZHIsIGFjY2VwdCwgaTsKKwlzaG9ydCAgICAgICAgICAgICBzaXplOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCXN0cnVjdCBidWZfZW50cnkgICpwYnVmOworCisJZmxwID0gZGV2LT5wcml2OworCXJldCA9IDA7CisJYWNjZXB0ID0gMTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogc3R1cGlkIEdhdGVEIGluc2lzdHMgb24gc2V0dGluZyB1cCB0aGUgbXVsdGljYXN0IHJvdXRlciB0aHJ1IHVzCisJICogYW5kIHdlJ3JlIGlsbCBlcXVpcHBlZCB0byBoYW5kbGUgYSBub24gRnJhbWUgUmVsYXkgcGFja2V0IGF0IHRoaXMKKwkgKiB0aW1lIQorCSAqLworCisJYWNjZXB0ID0gMTsKKwlzd2l0Y2ggKGRldi0+dHlwZSkKKwl7CisJCWNhc2UgQVJQSFJEX0ZSQUQ6CisJCQlpZiAoc2tiLT5kZXYtPnR5cGUgIT0gQVJQSFJEX0RMQ0kpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vbiBETENJIGRldmljZSwgdHlwZSAlaSwgdHJpZWQgdG8gc2VuZCBvbiBGUkFEIG1vZHVsZS5cbiIsIGRldi0+bmFtZSwgc2tiLT5kZXYtPnR5cGUpOworCQkJCWFjY2VwdCA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGZpcm13YXJlIHR5cGUgMHglNC40WFxuIiwgZGV2LT5uYW1lLCBkZXYtPnR5cGUpOworCQkJYWNjZXB0ID0gMDsKKwkJCWJyZWFrOworCX0KKwlpZiAoYWNjZXB0KQorCXsKKwkJLyogdGhpcyBpcyBmcmFtZSBzcGVjaWZpYywgYnV0IHRpbGwgdGhlcmUncyBhIFBQUCBtb2R1bGUsIGl0J3MgdGhlIGRlZmF1bHQgKi8KKwkJc3dpdGNoIChmbHAtPnR5cGUpCisJCXsKKwkJCWNhc2UgU0RMQV9TNTAyQToKKwkJCWNhc2UgU0RMQV9TNTAyRToKKwkJCQlyZXQgPSBzZGxhX2NtZChkZXYsIFNETEFfSU5GT1JNQVRJT05fV1JJVEUsICooc2hvcnQgKikoc2tiLT5kZXYtPmRldl9hZGRyKSwgMCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgTlVMTCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExBX1M1MDg6CisJCQkJc2l6ZSA9IHNpemVvZihhZGRyKTsKKwkJCQlyZXQgPSBzZGxhX2NtZChkZXYsIFNETEFfSU5GT1JNQVRJT05fV1JJVEUsICooc2hvcnQgKikoc2tiLT5kZXYtPmRldl9hZGRyKSwgMCwgTlVMTCwgc2tiLT5sZW4sICZhZGRyLCAmc2l6ZSk7CisJCQkJaWYgKHJldCA9PSBTRExBX1JFVF9PSykKKwkJCQl7CisKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCQkJCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQkJCQlwYnVmID0gKHZvaWQgKikoKChpbnQpIGRldi0+bWVtX3N0YXJ0KSArIChhZGRyICYgU0RMQV9BRERSX01BU0spKTsKKwkJCQkJX19zZGxhX3dyaXRlKGRldiwgcGJ1Zi0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQkJCQlwYnVmLT5vcHBfZmxhZyA9IDE7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHJldCkKKwkJeworCQkJY2FzZSBTRExBX1JFVF9PSzoKKwkJCQlmbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlyZXQgPSBETENJX1JFVF9PSzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTRExBX1JFVF9DSVJfT1ZFUkZMT1c6CisJCQljYXNlIFNETEFfUkVUX0JVRl9PVkVSU0laRToKKwkJCWNhc2UgU0RMQV9SRVRfTk9fQlVGUzoKKwkJCQlmbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQlyZXQgPSBETENJX1JFVF9EUk9QOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWZscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJcmV0ID0gRExDSV9SRVRfRVJSOworCQkJCWJyZWFrOworCQl9CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwl7CisJCWlmKGZscC0+bWFzdGVyW2ldIT1OVUxMKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShmbHAtPm1hc3RlcltpXSk7CisJfQkJCisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSAgKm1hc3RlcjsKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IHNrX2J1ZmYJICpza2I7CisKKwlzdHJ1Y3Qgc2RsYV9jbWQJKmNtZDsKKwlzdHJ1Y3QgYnVmX2luZm8JKnBidWZpOworCXN0cnVjdCBidWZfZW50cnkgICpwYnVmOworCisJdW5zaWduZWQgbG9uZwkgIGZsYWdzOworCWludCAgICAgICAgICAgICAgIGk9MCwgcmVjZWl2ZWQsIHN1Y2Nlc3MsIGFkZHIsIGJ1Zl9iYXNlLCBidWZfdG9wOworCXNob3J0ICAgICAgICAgICAgIGRsY2ksIGxlbiwgbGVuMiwgc3BsaXQ7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3VjY2VzcyA9IDE7CisJcmVjZWl2ZWQgPSBhZGRyID0gYnVmX3RvcCA9IGJ1Zl9iYXNlID0gMDsKKwlsZW4gPSBkbGNpID0gMDsKKwlza2IgPSBOVUxMOworCW1hc3RlciA9IE5VTEw7CisJY21kID0gTlVMTDsKKwlwYnVmaSA9IE5VTEw7CisJcGJ1ZiA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJY21kID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKFNETEFfNTAyX1JDVl9CVUYgJiBTRExBX0FERFJfTUFTSykpOworCQkJU0RMQV9XSU5ET1coZGV2LCBTRExBXzUwMl9SQ1ZfQlVGKTsKKwkJCXN1Y2Nlc3MgPSBjbWQtPm9wcF9mbGFnOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCWJyZWFrOworCisJCQlkbGNpID0gY21kLT5kbGNpOworCQkJbGVuID0gY21kLT5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwODoKKwkJCXBidWZpID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKFNETEFfNTA4X1JYQlVGX0lORk8gJiBTRExBX0FERFJfTUFTSykpOworCQkJU0RMQV9XSU5ET1coZGV2LCBTRExBXzUwOF9SWEJVRl9JTkZPKTsKKwkJCXBidWYgPSAodm9pZCAqKSAoZGV2LT5tZW1fc3RhcnQgKyAoKHBidWZpLT5yc2VfYmFzZSArIGZscC0+YnVmZmVyICogc2l6ZW9mKHN0cnVjdCBidWZfZW50cnkpKSAmIFNETEFfQUREUl9NQVNLKSk7CisJCQlzdWNjZXNzID0gcGJ1Zi0+b3BwX2ZsYWc7CisJCQlpZiAoIXN1Y2Nlc3MpCisJCQkJYnJlYWs7CisKKwkJCWJ1Zl90b3AgPSBwYnVmaS0+YnVmX3RvcDsKKwkJCWJ1Zl9iYXNlID0gcGJ1ZmktPmJ1Zl9iYXNlOworCQkJZGxjaSA9IHBidWYtPmRsY2k7CisJCQlsZW4gPSBwYnVmLT5sZW5ndGg7CisJCQlhZGRyID0gcGJ1Zi0+YnVmX2FkZHI7CisJCQlicmVhazsKKwl9CisKKwkvKiBjb21tb24gY29kZSwgZmluZCB0aGUgRExDSSBhbmQgZ2V0IHRoZSBTS0IgKi8KKwlpZiAoc3VjY2VzcykKKwl7CisJCWZvciAoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPT0gZGxjaSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFJlY2VpdmVkIHBhY2tldCBmcm9tIGludmFsaWQgRExDSSAlaSwgaWdub3JpbmcuIiwgZGV2LT5uYW1lLCBkbGNpKTsKKwkJCWZscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzdWNjZXNzID0gMDsKKwkJfQorCX0KKworCWlmIChzdWNjZXNzKQorCXsKKwkJbWFzdGVyID0gZmxwLT5tYXN0ZXJbaV07CisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmhkcikpOworCQlpZiAoc2tiID09IE5VTEwpIAorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCWZscC0+c3RhdHMucnhfZHJvcHBlZCsrOyAKKwkJCXN1Y2Nlc3MgPSAwOworCQl9CisJCWVsc2UKKwkJCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCBmcmhkcikpOworCX0KKworCS8qIHBpY2sgdXAgdGhlIGRhdGEgKi8KKwlzd2l0Y2ggKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJaWYgKHN1Y2Nlc3MpCisJCQkJX19zZGxhX3JlYWQoZGV2LCBTRExBXzUwMl9SQ1ZfQlVGICsgU0RMQV81MDJfREFUQV9PRlMsIHNrYl9wdXQoc2tiLGxlbiksIGxlbik7CisKKwkJCVNETEFfV0lORE9XKGRldiwgU0RMQV81MDJfUkNWX0JVRik7CisJCQljbWQtPm9wcF9mbGFnID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA4OgorCQkJaWYgKHN1Y2Nlc3MpCisJCQl7CisJCQkJLyogaXMgdGhpcyBidWZmZXIgc3BsaXQgb2ZmIHRoZSBlbmQgb2YgdGhlIGludGVybmFsIHJpbmcgYnVmZmVyICovCisJCQkJc3BsaXQgPSBhZGRyICsgbGVuID4gYnVmX3RvcCArIDEgPyBsZW4gLSAoYnVmX3RvcCAtIGFkZHIgKyAxKSA6IDA7CisJCQkJbGVuMiA9IGxlbiAtIHNwbGl0OworCisJCQkJX19zZGxhX3JlYWQoZGV2LCBhZGRyLCBza2JfcHV0KHNrYiwgbGVuMiksIGxlbjIpOworCQkJCWlmIChzcGxpdCkKKwkJCQkJX19zZGxhX3JlYWQoZGV2LCBidWZfYmFzZSwgc2tiX3B1dChza2IsIHNwbGl0KSwgc3BsaXQpOworCQkJfQorCisJCQkvKiBpbmNyZW1lbnQgdGhlIGJ1ZmZlciB3ZSdyZSBsb29raW5nIGF0ICovCisJCQlTRExBX1dJTkRPVyhkZXYsIFNETEFfNTA4X1JYQlVGX0lORk8pOworCQkJZmxwLT5idWZmZXIgPSAoZmxwLT5idWZmZXIgKyAxKSAlIHBidWZpLT5yc2VfbnVtOworCQkJcGJ1Zi0+b3BwX2ZsYWcgPSAwOworCQkJYnJlYWs7CisJfQorCisJaWYgKHN1Y2Nlc3MpCisJeworCQlmbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGxwID0gbWFzdGVyLT5wcml2OworCQkoKmRscC0+cmVjZWl2ZSkoc2tiLCBtYXN0ZXIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2RsYV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICpkZXY7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwljaGFyICAgICAgICAgICAgICBieXRlOworCisJZGV2ID0gZGV2X2lkOworCisJaWYgKGRldiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RsYV9pc3IoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIWZscC0+aW5pdGlhbGl6ZWQpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmluaXRpYWxpemVkIGRldmljZS5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWJ5dGUgPSBzZGxhX2J5dGUoZGV2LCBmbHAtPnR5cGUgPT0gU0RMQV9TNTA4ID8gU0RMQV81MDhfSVJRX0lOVEVSRkFDRSA6IFNETEFfNTAyX0lSUV9JTlRFUkZBQ0UpOworCXN3aXRjaCAoYnl0ZSkKKwl7CisJCWNhc2UgU0RMQV9JTlRSX1JYOgorCQkJc2RsYV9yZWNlaXZlKGRldik7CisJCQlicmVhazsKKworCQkvKiB0aGUgY29tbWFuZCB3aWxsIGdldCBhbiBlcnJvciByZXR1cm4sIHdoaWNoIGlzIHByb2Nlc3NlZCBhYm92ZSAqLworCQljYXNlIFNETEFfSU5UUl9NT0RFTToKKwkJY2FzZSBTRExBX0lOVFJfU1RBVFVTOgorCQkJc2RsYV9jbWQoZGV2LCBTRExBX1JFQURfRExDX1NUQVRVUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfSU5UUl9UWDoKKwkJY2FzZSBTRExBX0lOVFJfQ09NUExFVEU6CisJCWNhc2UgU0RMQV9JTlRSX1RJTUVSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXJxIGZsYWcgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBieXRlKTsKKwkJCWJyZWFrOworCX0KKworCS8qIHRoZSBTNTAyRSByZXF1aXJlcyBhIG1hbnVhbCBhY2tub3dsZWRnZW1lbnQgb2YgdGhlIGludGVycnVwdCAqLyAKKwlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwMkUpCisJeworCQlmbHAtPnN0YXRlICY9IH5TRExBX1M1MDJFX0lOVEFDSzsKKwkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwMkVfSU5UQUNLOworCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJfQorCisJLyogdGhpcyBjbGVhcnMgdGhlIGJ5dGUsIGluZm9ybWluZyB0aGUgWjgwIHdlJ3JlIGRvbmUgKi8KKwlieXRlID0gMDsKKwlzZGxhX3dyaXRlKGRldiwgZmxwLT50eXBlID09IFNETEFfUzUwOCA/IFNETEFfNTA4X0lSUV9JTlRFUkZBQ0UgOiBTRExBXzUwMl9JUlFfSU5URVJGQUNFLCAmYnl0ZSwgc2l6ZW9mKGJ5dGUpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfcG9sbCh1bnNpZ25lZCBsb25nIGRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkgICpkZXY7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZpY2U7CisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKHNkbGFfYnl0ZShkZXYsIFNETEFfNTAyX1JDVl9CVUYpKQorCQlzZGxhX3JlY2VpdmUoZGV2KTsKKworCWZscC0+dGltZXIuZXhwaXJlcyA9IDE7CisJYWRkX3RpbWVyKCZmbHAtPnRpbWVyKTsKK30KKworc3RhdGljIGludCBzZGxhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgaW50cl9pbmZvICBpbnRyOworCWludCAgICAgICAgICAgICAgIGxlbiwgaTsKKwlzaG9ydCAgICAgICAgICAgICBkbGNpc1tDT05GSUdfRExDSV9NQVhdOworCisJZmxwID0gZGV2LT5wcml2OworCisJbGVuID0gMDsKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+ZGxjaVtpXSkKKwkJCWRsY2lzW2xlbisrXSA9IGFicyhmbHAtPmRsY2lbaV0pOworCWxlbiAqPSAyOworCisJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpCisJeworCQlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPiAwKSAKKwkJCQlzZGxhX2NtZChkZXYsIFNETEFfREVBQ1RJVkFURV9ETENJLCAwLCAwLCBkbGNpcywgbGVuLCBOVUxMLCBOVUxMKTsKKwkJc2RsYV9jbWQoZGV2LCBTRExBX0RFTEVURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCBzaXplb2YoZmxwLT5kbGNpW2ldKSwgTlVMTCwgTlVMTCk7CisJfQorCisJbWVtc2V0KCZpbnRyLCAwLCBzaXplb2YoaW50cikpOworCS8qIGxldCdzIHN0YXJ0IHVwIHRoZSByZWNlcHRpb24gKi8KKwlzd2l0Y2goZmxwLT50eXBlKQorCXsKKwkJY2FzZSBTRExBX1M1MDJBOgorCQkJZGVsX3RpbWVyKCZmbHAtPnRpbWVyKTsgCisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwMkU6CisJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0lSUV9UUklHR0VSLCAwLCAwLCAmaW50ciwgc2l6ZW9mKGNoYXIpICsgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJCQlmbHAtPnN0YXRlICY9IH5TRExBX1M1MDJFX0lOVEFDSzsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA3OgorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0lSUV9UUklHR0VSLCAwLCAwLCAmaW50ciwgc2l6ZW9mKHN0cnVjdCBpbnRyX2luZm8pLCBOVUxMLCBOVUxMKTsKKwkJCWZscC0+c3RhdGUgJj0gflNETEFfUzUwOF9JTlRFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCX0KKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXR1cm4oMCk7Cit9CisKK3N0cnVjdCBjb25mX2RhdGEgeworCXN0cnVjdCBmcmFkX2NvbmYgY29uZmlnOworCXNob3J0ICAgICAgICAgICAgZGxjaVtDT05GSUdfRExDSV9NQVhdOworfTsKKworc3RhdGljIGludCBzZGxhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IGNvbmZfZGF0YSAgZGF0YTsKKwlzdHJ1Y3QgaW50cl9pbmZvICBpbnRyOworCWludCAgICAgICAgICAgICAgIGxlbiwgaTsKKwljaGFyICAgICAgICAgICAgICBieXRlOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKCFmbHAtPmluaXRpYWxpemVkKQorCQlyZXR1cm4oLUVQRVJNKTsKKworCWlmICghZmxwLT5jb25maWd1cmVkKQorCQlyZXR1cm4oLUVQRVJNKTsKKworCS8qIHRpbWUgdG8gc2VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiAqLworCWxlbiA9IDA7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCQlkYXRhLmRsY2lbbGVuKytdID0gYWJzKGZscC0+ZGxjaVtpXSk7CisJbGVuICo9IDI7CisKKwltZW1jcHkoJmRhdGEuY29uZmlnLCAmZmxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJbGVuICs9IHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKTsKKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0RMQ0lfQ09ORklHVVJBVElPTiwgMCwgMCwgJmRhdGEsIGxlbiwgTlVMTCwgTlVMTCk7CisKKwlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwOCkKKwkJZmxwLT5idWZmZXIgPSAwOworCisJc2RsYV9jbWQoZGV2LCBTRExBX0VOQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKwkvKiBsZXQncyBzdGFydCB1cCB0aGUgcmVjZXB0aW9uICovCisJbWVtc2V0KCZpbnRyLCAwLCBzaXplb2YoaW50cikpOworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCQlmbHAtPnRpbWVyLmV4cGlyZXMgPSAxOworCQkJYWRkX3RpbWVyKCZmbHAtPnRpbWVyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCWZscC0+c3RhdGUgfD0gU0RMQV9TNTAyRV9FTkFCTEU7CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwMkVfSU5UQUNLOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJYnl0ZSA9IDA7CisJCQlzZGxhX3dyaXRlKGRldiwgU0RMQV81MDJfSVJRX0lOVEVSRkFDRSwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisJCQlpbnRyLmZsYWdzID0gU0RMQV9JTlRSX1JYIHwgU0RMQV9JTlRSX1NUQVRVUyB8IFNETEFfSU5UUl9NT0RFTTsKKwkJCXNkbGFfY21kKGRldiwgU0RMQV9TRVRfSVJRX1RSSUdHRVIsIDAsIDAsICZpbnRyLCBzaXplb2YoY2hhcikgKyBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA3OgorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwOF9JTlRFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJ5dGUgPSAwOworCQkJc2RsYV93cml0ZShkZXYsIFNETEFfNTA4X0lSUV9JTlRFUkZBQ0UsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCQkJaW50ci5mbGFncyA9IFNETEFfSU5UUl9SWCB8IFNETEFfSU5UUl9TVEFUVVMgfCBTRExBX0lOVFJfTU9ERU07CisJCQlpbnRyLmlycSA9IGRldi0+aXJxOworCQkJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9JUlFfVFJJR0dFUiwgMCwgMCwgJmludHIsIHNpemVvZihzdHJ1Y3QgaW50cl9pbmZvKSwgTlVMTCwgTlVMTCk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoZmxwLT5jb25maWcuc3RhdGlvbiA9PSBGUkFEX1NUQVRJT05fQ1BFKQorCXsKKwkJYnl0ZSA9IFNETEFfSUNTX1NUQVRVU19FTlE7CisJCXNkbGFfY21kKGRldiwgU0RMQV9JU1NVRV9JTl9DSEFOTkVMX1NJR05BTCwgMCwgMCwgJmJ5dGUsIHNpemVvZihieXRlKSwgTlVMTCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCXNkbGFfY21kKGRldiwgU0RMQV9BRERfRExDSSwgMCwgMCwgZGF0YS5kbGNpLCBsZW4gLSBzaXplb2Yoc3RydWN0IGZyYWRfY29uZiksIE5VTEwsIE5VTEwpOworCQlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPiAwKQorCQkJCXNkbGFfY21kKGRldiwgU0RMQV9BQ1RJVkFURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCAyKnNpemVvZihmbHAtPmRsY2lbaV0pLCBOVUxMLCBOVUxMKTsKKwl9CisKKwkvKiBjb25maWd1cmUgYW55IHNwZWNpZmljIERMQ0kgc2V0dGluZ3MgKi8KKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+ZGxjaVtpXSkKKwkJeworCQkJZGxwID0gZmxwLT5tYXN0ZXJbaV0tPnByaXY7CisJCQlpZiAoZGxwLT5jb25maWd1cmVkKQorCQkJCXNkbGFfY21kKGRldiwgU0RMQV9TRVRfRExDSV9DT05GSUdVUkFUSU9OLCBhYnMoZmxwLT5kbGNpW2ldKSwgMCwgJmRscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZiksIE5VTEwsIE5VTEwpOworCQl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBzZGxhX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZnJhZF9jb25mIF9fdXNlciAqY29uZiwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBjb25mX2RhdGEgIGRhdGE7CisJaW50ICAgICAgICAgICAgICAgaTsKKwlzaG9ydCAgICAgICAgICAgICBzaXplOworCisJaWYgKGRldi0+dHlwZSA9PSAweEZGRkYpCisJCXJldHVybigtRVVOQVRDSCk7CisKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIWdldCkKKwl7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4oLUVCVVNZKTsKKworCQlpZihjb3B5X2Zyb21fdXNlcigmZGF0YS5jb25maWcsIGNvbmYsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZGF0YS5jb25maWcuc3RhdGlvbiAmIH5GUkFEX1NUQVRJT05fTk9ERSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoZGF0YS5jb25maWcuZmxhZ3MgJiB+RlJBRF9WQUxJRF9GTEFHUykKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoKGRhdGEuY29uZmlnLmtiYXVkIDwgMCkgfHwgCisJCQkgKChkYXRhLmNvbmZpZy5rYmF1ZCA+IDEyOCkgJiYgKGZscC0+dHlwZSAhPSBTRExBX1M1MDgpKSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoZGF0YS5jb25maWcuY2xvY2tpbmcgJiB+KEZSQURfQ0xPQ0tfSU5UIHwgU0RMQV9TNTA4X1BPUlRfUlMyMzIpKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcubXR1IDwgMCkgfHwgKGRhdGEuY29uZmlnLm10dSA+IFNETEFfTUFYX01UVSkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5UMzkxIDwgNSkgfHwgKGRhdGEuY29uZmlnLlQzOTEgPiAzMCkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5UMzkyIDwgNSkgfHwgKGRhdGEuY29uZmlnLlQzOTIgPiAzMCkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5OMzkxIDwgMSkgfHwgKGRhdGEuY29uZmlnLk4zOTEgPiAyNTUpKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuTjM5MiA8IDEpIHx8IChkYXRhLmNvbmZpZy5OMzkyID4gMTApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuTjM5MyA8IDEpIHx8IChkYXRhLmNvbmZpZy5OMzkzID4gMTApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCW1lbWNweSgmZmxwLT5jb25maWcsICZkYXRhLmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJZmxwLT5jb25maWcuZmxhZ3MgfD0gU0RMQV9ESVJFQ1RfUkVDVjsKKworCQlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwOCkKKwkJCWZscC0+Y29uZmlnLmZsYWdzIHw9IFNETEFfVFg3MF9SWDMwOworCisJCWlmIChkZXYtPm10dSAhPSBmbHAtPmNvbmZpZy5tdHUpCisJCXsKKwkJCS8qIHRoaXMgaXMgcmVxdWlyZWQgdG8gY2hhbmdlIHRoZSBNVFUgKi8KKwkJCWRldi0+bXR1ID0gZmxwLT5jb25maWcubXR1OworCQkJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCQkJaWYgKGZscC0+bWFzdGVyW2ldKQorCQkJCQlmbHAtPm1hc3RlcltpXS0+bXR1ID0gZmxwLT5jb25maWcubXR1OworCQl9CisKKwkJZmxwLT5jb25maWcubXR1ICs9IHNpemVvZihzdHJ1Y3QgZnJoZHIpOworCisJCS8qIG9mZiB0byB0aGUgcmFjZXMhICovCisJCWlmICghZmxwLT5jb25maWd1cmVkKQorCQkJc2RsYV9zdGFydChkZXYpOworCisJCWZscC0+Y29uZmlndXJlZCA9IDE7CisJfQorCWVsc2UKKwl7CisJCS8qIG5vIHNlbnNlIHJlYWRpbmcgaWYgdGhlIENQVSBpc24ndCBzdGFydGVkICovCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXsKKwkJCXNpemUgPSBzaXplb2YoZGF0YSk7CisJCQlpZiAoc2RsYV9jbWQoZGV2LCBTRExBX1JFQURfRExDSV9DT05GSUdVUkFUSU9OLCAwLCAwLCBOVUxMLCAwLCAmZGF0YSwgJnNpemUpICE9IFNETEFfUkVUX09LKQorCQkJCXJldHVybigtRUlPKTsKKwkJfQorCQllbHNlCisJCQlpZiAoZmxwLT5jb25maWd1cmVkKQorCQkJCW1lbWNweSgmZGF0YS5jb25maWcsICZmbHAtPmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJCWVsc2UKKwkJCQltZW1zZXQoJmRhdGEuY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpOworCisJCW1lbWNweSgmZmxwLT5jb25maWcsICZkYXRhLmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJZGF0YS5jb25maWcuZmxhZ3MgJj0gRlJBRF9WQUxJRF9GTEFHUzsKKwkJZGF0YS5jb25maWcubXR1IC09IGRhdGEuY29uZmlnLm10dSA+IHNpemVvZihzdHJ1Y3QgZnJoZHIpID8gc2l6ZW9mKHN0cnVjdCBmcmhkcikgOiBkYXRhLmNvbmZpZy5tdHU7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoY29uZiwgJmRhdGEuY29uZmlnLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpPy1FRkFVTFQ6MDsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV94ZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzZGxhX21lbSBfX3VzZXIgKmluZm8sIGludCByZWFkKQoreworCXN0cnVjdCBzZGxhX21lbSBtZW07CisJY2hhcgkqdGVtcDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCZtZW0sIGluZm8sIHNpemVvZihtZW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCWlmIChyZWFkKQorCXsJCisJCXRlbXAgPSBrbWFsbG9jKG1lbS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXRlbXApCisJCQlyZXR1cm4oLUVOT01FTSk7CisJCW1lbXNldCh0ZW1wLCAwLCBtZW0ubGVuKTsKKwkJc2RsYV9yZWFkKGRldiwgbWVtLmFkZHIsIHRlbXAsIG1lbS5sZW4pOworCQlpZihjb3B5X3RvX3VzZXIobWVtLmRhdGEsIHRlbXAsIG1lbS5sZW4pKQorCQl7CisJCQlrZnJlZSh0ZW1wKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtmcmVlKHRlbXApOworCX0KKwllbHNlCisJeworCQl0ZW1wID0ga21hbGxvYyhtZW0ubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQlpZihjb3B5X2Zyb21fdXNlcih0ZW1wLCBtZW0uZGF0YSwgbWVtLmxlbikpCisJCXsKKwkJCWtmcmVlKHRlbXApOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJc2RsYV93cml0ZShkZXYsIG1lbS5hZGRyLCB0ZW1wLCBtZW0ubGVuKTsKKwkJa2ZyZWUodGVtcCk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBzZGxhX3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgY29uZl9kYXRhICBkYXRhOworCWludCAgICAgICAgICAgICAgIGksIGxlbjsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWxlbiA9IDA7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCQlkYXRhLmRsY2lbbGVuKytdID0gZmxwLT5kbGNpW2ldOworCWxlbiAqPSAyOworCisJbWVtY3B5KCZkYXRhLCAmZmxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJbGVuICs9IHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKTsKKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0RMQ0lfQ09ORklHVVJBVElPTiwgMCwgMCwgJmRhdGEsIGxlbiwgTlVMTCwgTlVMTCk7CisJc2RsYV9jbWQoZGV2LCBTRExBX0VOQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCQorCWZscCA9IGRldi0+cHJpdjsKKworCWlmICghZmxwLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIEZSQURfR0VUX0NPTkY6CisJCWNhc2UgRlJBRF9TRVRfQ09ORjoKKwkJCXJldHVybihzZGxhX2NvbmZpZyhkZXYsIGlmci0+aWZyX2RhdGEsIGNtZCA9PSBGUkFEX0dFVF9DT05GKSk7CisKKwkJY2FzZSBTRExBX0lERU5USUZZOgorCQkJaWZyLT5pZnJfZmxhZ3MgPSBmbHAtPnR5cGU7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfQ1BVU1BFRUQ6CisJCQlyZXR1cm4oc2RsYV9jcHVzcGVlZChkZXYsIGlmcikpOyAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTk9URTogIFRoaXMgaXMgcmF0aGVyIGEgdXNlbGVzcyBhY3Rpb24gcmlnaHQgbm93LCBhcyB0aGUKKyAgICAgICBjdXJyZW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHByb3RvY29scyBvdGhlciB0aGFuCisgICAgICAgRlIuICBIb3dldmVyLCBTYW5nb21hIGhhcyBtb2R1bGVzIGZvciBhIG51bWJlciBvZgorICAgICAgIG90aGVyIHByb3RvY29scyBpbiB0aGUgd29ya3MuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQljYXNlIFNETEFfUFJPVE9DT0w6CisJCQlpZiAoZmxwLT5jb25maWd1cmVkKQorCQkJCXJldHVybigtRUFMUkVBRFkpOworCisJCQlzd2l0Y2ggKGlmci0+aWZyX2ZsYWdzKQorCQkJeworCQkJCWNhc2UgQVJQSFJEX0ZSQUQ6CisJCQkJCWRldi0+dHlwZSA9IGlmci0+aWZyX2ZsYWdzOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4oLUVOT1BST1RPT1BUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9DTEVBUk1FTToKKwkJCXNkbGFfY2xlYXIoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9XUklURU1FTToKKwkJY2FzZSBTRExBX1JFQURNRU06CisJCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuKHNkbGFfeGZlcihkZXYsIGlmci0+aWZyX2RhdGEsIGNtZCA9PSBTRExBX1JFQURNRU0pKTsKKworCQljYXNlIFNETEFfU1RBUlQ6CisJCQlzZGxhX3N0YXJ0KGRldik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfU1RPUDoKKwkJCXNkbGFfc3RvcChkZXYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRU9QTk9UU1VQUCk7CisJfQorCXJldHVybigwKTsKK30KKworaW50IHNkbGFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuKC1FQlVTWSk7CisKKwkvKiBmb3Igbm93LCB5b3UgY2FuJ3QgY2hhbmdlIHRoZSBNVFUhICovCisJcmV0dXJuKC1FT1BOT1RTVVBQKTsKK30KKworaW50IHNkbGFfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWludCAgICAgICAgICAgICAgIGk7CisJY2hhciAgICAgICAgICAgICAgYnl0ZTsKKwl1bnNpZ25lZCBiYXNlOworCWludCBlcnIgPSAtRUlOVkFMOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKGZscC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybigtRUlOVkFMKTsKKworCWZvcihpPTA7aSA8IHNpemVvZih2YWxpZF9wb3J0KSAvIHNpemVvZiAoaW50KSA7IGkrKykKKwkJaWYgKHZhbGlkX3BvcnRbaV0gPT0gbWFwLT5iYXNlX2FkZHIpCisJCQlicmVhazsgICAKKworCWlmIChpID09IHNpemVvZih2YWxpZF9wb3J0KSAvIHNpemVvZihpbnQpKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKG1hcC0+YmFzZV9hZGRyLCBTRExBX0lPX0VYVEVOVFMsIGRldi0+bmFtZSkpeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTRExBOiBpby1wb3J0IDB4JTA0bHggaW4gdXNlIFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCWJhc2UgPSBtYXAtPmJhc2VfYWRkcjsKKworCS8qIHRlc3QgZm9yIGNhcmQgdHlwZXMsIFM1MDJBLCBTNTAyRSwgUzUwNywgUzUwOCAgICAgICAgICAgICAgICAgKi8KKwkvKiB0aGVzZSB0ZXN0cyBzaHV0IGRvd24gdGhlIGNhcmQgY29tcGxldGVseSwgc28gY2xlYXIgdGhlIHN0YXRlICovCisJZmxwLT50eXBlID0gU0RMQV9VTktOT1dOOworCWZscC0+c3RhdGUgPSAwOworICAgCisJZm9yKGk9MTtpPFNETEFfSU9fRVhURU5UUztpKyspCisJCWlmIChpbmIoYmFzZSArIGkpICE9IDB4RkYpCisJCQlicmVhazsKKworCWlmIChpID09IFNETEFfSU9fRVhURU5UUykgeyAgIAorCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX1o4MF9DT05UUk9MKTsKKwkJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpICYgMHgwRikgPT0gMHgwOCkgeworCQkJb3V0YihTRExBX1M1MDJFX0lOVEFDSywgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpICYgMHgwRikgPT0gMHgwQykgeworCQkJCW91dGIoU0RMQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQkJZmxwLT50eXBlID0gU0RMQV9TNTAyRTsKKwkJCQlnb3RvIGdvdF90eXBlOworCQkJfQorCQl9CisJfQorCisJZm9yKGJ5dGU9aW5iKGJhc2UpLGk9MDtpPFNETEFfSU9fRVhURU5UUztpKyspCisJCWlmIChpbmIoYmFzZSArIGkpICE9IGJ5dGUpCisJCQlicmVhazsKKworCWlmIChpID09IFNETEFfSU9fRVhURU5UUykgeworCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQlpZiAoKGluYihiYXNlICsgU0RMQV9TNTAyX1NUUykgJiAweDdFKSA9PSAweDMwKSB7CisJCQlvdXRiKFNETEFfUzUwN19FTkFCTEUsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSAmIDB4N0UpID09IDB4MzIpIHsKKwkJCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJCWZscC0+dHlwZSA9IFNETEFfUzUwNzsKKwkJCQlnb3RvIGdvdF90eXBlOworCQkJfQorCQl9CisJfQorCisJb3V0YihTRExBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwlpZiAoKGluYihiYXNlICsgU0RMQV9TNTA4X1NUUykgJiAweDNGKSA9PSAweDAwKSB7CisJCW91dGIoU0RMQV9TNTA4X0lOVEVOLCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDhfU1RTKSAmIDB4M0YpID09IDB4MTApIHsKKwkJCW91dGIoU0RMQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnR5cGUgPSBTRExBX1M1MDg7CisJCQlnb3RvIGdvdF90eXBlOworCQl9CisJfQorCisJb3V0YihTRExBX1M1MDJBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwlpZiAoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSA9PSAweDQwKSB7CisJCW91dGIoU0RMQV9TNTAyQV9TVEFSVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQlpZiAoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSA9PSAweDQwKSB7CisJCQlvdXRiKFNETEFfUzUwMkFfSU5URU4sIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWlmIChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpID09IDB4NDQpIHsKKwkJCQlvdXRiKFNETEFfUzUwMkFfU1RBUlQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCQlmbHAtPnR5cGUgPSBTRExBX1M1MDJBOworCQkJCWdvdG8gZ290X3R5cGU7CisJCQl9CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbmtub3duIGNhcmQgdHlwZVxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSAtRU5PREVWOworCWdvdG8gZmFpbDsKKworZ290X3R5cGU6CisJc3dpdGNoKGJhc2UpIHsKKwkJY2FzZSAweDI3MDoKKwkJY2FzZSAweDI4MDoKKwkJY2FzZSAweDM4MDogCisJCWNhc2UgMHgzOTA6CisJCQlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwOCAmJiBmbHAtPnR5cGUgIT0gU0RMQV9TNTA3KQorCQkJCWdvdG8gZmFpbDsKKwl9CisKKwlzd2l0Y2ggKG1hcC0+aXJxKSB7CisJCWNhc2UgMjoKKwkJCWlmIChmbHAtPnR5cGUgIT0gU0RMQV9TNTAyRSkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKworCQljYXNlIDEwOgorCQljYXNlIDExOgorCQljYXNlIDEyOgorCQljYXNlIDE1OgorCQljYXNlIDQ6CisJCQlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwOCAmJiBmbHAtPnR5cGUgIT0gU0RMQV9TNTA3KQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCWNhc2UgNToKKwkJY2FzZSA3OgorCQkJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDJBKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gLUVBR0FJTjsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZGxhX2lzciwgMCwgZGV2LT5uYW1lLCBkZXYpKSAKKwkJZ290byBmYWlsOworCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDcpIHsKKwkJc3dpdGNoKGRldi0+aXJxKSB7CisJCQljYXNlIDM6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlEzOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWZscC0+c3RhdGUgPSBTRExBX1M1MDdfSVJRNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTU7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlE3OworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTEwOworCQkJCWJyZWFrOworCQkJY2FzZSAxMToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTExOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTEyOworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTE1OworCQkJCWJyZWFrOworCQl9CisJfQorCisJZm9yKGk9MDtpIDwgc2l6ZW9mKHZhbGlkX21lbSkgLyBzaXplb2YgKGludCkgOyBpKyspCisJCWlmICh2YWxpZF9tZW1baV0gPT0gbWFwLT5tZW1fc3RhcnQpCisJCQlicmVhazsgICAKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGkgPT0gc2l6ZW9mKHZhbGlkX21lbSkgLyBzaXplb2YoaW50KSkKKwkJZ290byBmYWlsMjsKKworCWlmIChmbHAtPnR5cGUgPT0gU0RMQV9TNTAyQSAmJiAobWFwLT5tZW1fc3RhcnQgJiAweEYwMDApID4+IDEyID09IDB4MEUpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwNyAmJiBtYXAtPm1lbV9zdGFydCA+PiAxNiA9PSAweDBCKQorCQlnb3RvIGZhaWwyOworCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDcgJiYgbWFwLT5tZW1fc3RhcnQgPj4gMTYgPT0gMHgwRCkKKwkJZ290byBmYWlsMjsKKworCWJ5dGUgPSBmbHAtPnR5cGUgIT0gU0RMQV9TNTA4ID8gU0RMQV84S19XSU5ET1cgOiAwOworCWJ5dGUgfD0gKG1hcC0+bWVtX3N0YXJ0ICYgMHhGMDAwKSA+PiAoMTIgKyAoZmxwLT50eXBlID09IFNETEFfUzUwOCA/IDEgOiAwKSk7CisJc3dpdGNoKGZscC0+dHlwZSkgeworCQljYXNlIFNETEFfUzUwMkE6CisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEQ6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19EOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwNzoKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEI6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19COworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwODoKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEQ6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19EOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCS8qIHNldCB0aGUgbWVtb3J5IGJpdHMsIGFuZCBlbmFibGUgYWNjZXNzICovCisJb3V0YihieXRlLCBiYXNlICsgU0RMQV9SRUdfUENfV0lORE9XKTsKKworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkU6CisJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTAyRV9FTkFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDc6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfTUVNRU47CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlID0gU0RMQV9NRU1FTjsKKwkJCWJyZWFrOworCX0KKwlvdXRiKGZscC0+c3RhdGUsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKworCWRldi0+aXJxID0gbWFwLT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBiYXNlOworCWRldi0+bWVtX3N0YXJ0ID0gbWFwLT5tZW1fc3RhcnQ7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAweDIwMDA7CisJZmxwLT5pbml0aWFsaXplZCA9IDE7CisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWZyZWVfaXJxKG1hcC0+aXJxLCBkZXYpOworZmFpbDoKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCBTRExBX0lPX0VYVEVOVFMpOworCXJldHVybiBlcnI7Cit9CisgCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNkbGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWZscCA9IGRldi0+cHJpdjsKKworCXJldHVybigmZmxwLT5zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3NkbGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwID0gZGV2LT5wcml2OworCisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPmZsYWdzCQk9IDA7CisJZGV2LT50eXBlCQk9IDB4RkZGRjsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CisJZGV2LT5hZGRyX2xlbgkJPSAwOworCWRldi0+bXR1CQk9IFNETEFfTUFYX01UVTsKKworCWRldi0+b3BlbgkJPSBzZGxhX29wZW47CisJZGV2LT5zdG9wCQk9IHNkbGFfY2xvc2U7CisJZGV2LT5kb19pb2N0bAkJPSBzZGxhX2lvY3RsOworCWRldi0+c2V0X2NvbmZpZwkJPSBzZGxhX3NldF9jb25maWc7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2RsYV9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNkbGFfdHJhbnNtaXQ7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IHNkbGFfY2hhbmdlX210dTsKKworCWZscC0+YWN0aXZhdGUJCT0gc2RsYV9hY3RpdmF0ZTsKKwlmbHAtPmRlYWN0aXZhdGUJCT0gc2RsYV9kZWFjdGl2YXRlOworCWZscC0+YXNzb2MJCT0gc2RsYV9hc3NvYzsKKwlmbHAtPmRlYXNzb2MJCT0gc2RsYV9kZWFzc29jOworCWZscC0+ZGxjaV9jb25mCQk9IHNkbGFfZGxjaV9jb25mOworCisJaW5pdF90aW1lcigmZmxwLT50aW1lcik7CisJZmxwLT50aW1lci5leHBpcmVzCT0gMTsKKwlmbHAtPnRpbWVyLmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlmbHAtPnRpbWVyLmZ1bmN0aW9uCT0gc2RsYV9wb2xsOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNkbGE7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2RsYSh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoIiVzLlxuIiwgdmVyc2lvbik7CisKKwlzZGxhID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgZnJhZF9sb2NhbCksICJzZGxhMCIsIHNldHVwX3NkbGEpOworCWlmICghc2RsYSkgCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KHNkbGEpOworCWlmIChlcnIpIAorCQlmcmVlX25ldGRldihzZGxhKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NkbGEodm9pZCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwID0gc2RsYS0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHNkbGEpOworCWlmIChmbHAtPmluaXRpYWxpemVkKSB7CisJCWZyZWVfaXJxKHNkbGEtPmlycSwgc2RsYSk7CisJCXJlbGVhc2VfcmVnaW9uKHNkbGEtPmJhc2VfYWRkciwgU0RMQV9JT19FWFRFTlRTKTsKKwl9CisJZGVsX3RpbWVyX3N5bmMoJmZscC0+dGltZXIpOworCWZyZWVfbmV0ZGV2KHNkbGEpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfc2RsYSk7Cittb2R1bGVfZXhpdChleGl0X3NkbGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfY2hkbGMuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2NoZGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiZTAwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2NoZGxjLmMKQEAgLTAsMCArMSw0NDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV9jaGRsYy5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBDaXNjbyBIRExDIG1vZHVsZS4KKyoKKyogQXV0aG9yczogCU5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrICAKKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRmViIDI4LCAyMDAxICBOZW5hZCBDb3JiaWMJVXBkYXRlZCBpZl90eF90aW1lb3V0KCkgcm91dGluZSBmb3IgCisqIAkJCQkyLjQuWCBrZXJuZWxzLgorKiBKYW4gMjUsIDIwMDEgIE5lbmFkIENvcmJpYwlBZGRlZCBhIFRUWSBTeW5jIHNlcmlhbCBkcml2ZXIgb3ZlciB0aGUKKyogCQkJCUhETEMgc3RyZWFtaW5nIHByb3RvY29sCisqIAkJCQlBZGRlZCBhIFRUWSBBc3luYyBzZXJpYWwgZHJpdmVyIG92ZXIgdGhlCisqIAkJCQlBc3luYyBwcm90b2NvbC4KKyogRGVjIDE1LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgVXBkYXRlZCBmb3IgMi40LlggS2VybmVsIHN1cHBvcnQKKyogTm92IDEzLCAyMDAwICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZyBvcHRpb24uCisqIAkJCQlUY3BkdW1wIGRvZXNuJ3Qgc3VwcG9ydCBDSERMQyBpbnRlZmFjZQorKiAJCQkJdHlwZXMsIHRvIGZpeCB0aGlzICJ0cnVlIHR5cGUiIG9wdGlvbiB3aWxsIHNldAorKiAJCQkJdGhlIGludGVyZmFjZSB0eXBlIHRvIFJBVyBJUCBtb2RlLgorKiBOb3YgMDcsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVueSBhbGwgYW5kIHNwZWNpZnkgYWxsb3dlZCByZXF1ZXN0cy4KKyogSnVuIDIwLCAyMDAwICBOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIEFQSSBJUCBFUlJPUiBidWcuIENhdXNlZCBieSB0aGUgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdCB1cGRhdGUuCisqIE1heSAwOSwgMjAwMAlOZW5hZCBDb3JiaWMJT3B0aW9uIHRvIGJyaW5nIGRvd24gYW4gaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwb24gZGlzY29ubmVjdC4KKyogTWFyIDIzLCAyMDAwICBOZW5hZCBDb3JiaWMJSW1wcm92ZWQgdGFzayBxdWV1ZSwgYmggaGFuZGxpbmcuCisqIE1hciAxNiwgMjAwMAlOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIFNMQVJQIER5bmFtaWMgSVAgYWRkcmVzc2luZy4KKyogTWFyIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJQnVnIEZpeDogY29ycnVwdGVkIG1ib3ggcmVjb3ZlcnkuCisqIEZlYiAxMCwgMjAwMCAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIEFTWU5DIHN1cHBvcnQuCisqIEZlYiAwOSwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEZpeGVkIHR3byBzaHV0ZG93biBidWdzIGluIHVwZGF0ZSgpIGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9zdGF0cygpIGZ1bmN0aW9ucy4KKyogSmFuIDI0LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgYSBzdGFydHVwIHdhbnBpcGUgc3RhdGUgcmFjaW5nLCAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBiZXR3ZWVuIGlmX29wZW4gYW5kIGlzci4gCisqIEphbiAxMCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEFkZGVkIG5ldyBzb2NrZXQgQVBJIHN1cHBvcnQuCisqIERldiAxNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIEZpeGVkIHVwIGhlYWRlciBmaWxlcyBmb3IgMi4wLlgga2VybmVscworKiBOb3YgMjAsIDE5OTkgIE5lbmFkIENvcmJpYyAJRml4ZWQgemVybyBsZW5ndGggQVBJIGJ1Zy4KKyogU2VwIDMwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgZHluYW1pYyBJUCBhbmQgcm91dGUgc2V0dXAuCisqIFNlcCAyMywgMTk5OSAgTmVuYWQgQ29yYmljICAgIEFkZGVkIFNNUCBzdXBwb3J0LCBmaXhlZCB0cmFjaW5nIAorKiBTZXAgMTMsIDE5OTkgIE5lbmFkIENvcmJpYwlTcGxpdCB1cCBQb3J0IDAgYW5kIDEgaW50byBzZXBhcmF0ZSBkZXZpY2VzLgorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUzUxNCBhZGFwdGVyLgorKiBPY3QgMzAsIDE5OTgJSmFzcHJlZXQgU2luZ2gJQWRkZWQgU3VwcG9ydCBmb3IgQ0hETEMgQVBJIChIRExDIFNUUkVBTUlORykuCisqIE9jdCAyOCwgMTk5OAlKYXNwcmVldCBTaW5naAlBZGRlZCBTdXBwb3J0IGZvciBEdWFsIFBvcnQgQ0hETEMuCisqIEF1ZyAwNywgMTk5OAlEYXZpZCBGb25nCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4JCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2NoZGxjLmg+CQkvKiBDSERMQyBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhX2FzeS5oPiAgICAgICAgICAgCS8qIENIRExDIChhc3luYykgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPiAgICAvKiBTb2NrZXQgRHJpdmVyIGNvbW1vbiBhcmVhICovCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgkJCisKKy8qIFRUWSBJbmNsdWRlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkJMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFCQkweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcJCTB4MTAKKworI2RlZmluZSBNQVhfSVBfRVJST1JTCTEwCisKKyNkZWZpbmUgVFRZX0NIRExDX01BWF9NVFUJMjAwMAorI2RlZmluZQlDSERMQ19ERkxUX0RBVEFfTEVOCTE1MDAJCS8qIGRlZmF1bHQgTVRVICovCisjZGVmaW5lIENIRExDX0hEUl9MRU4JCTEKKworI2RlZmluZSBDSERMQ19BUEkgMHgwMQorCisjZGVmaW5lIFBPUlQoeCkgICAoeCA9PSAwID8gIlBSSU1BUlkiIDogIlNFQ09OREFSWSIgKQorI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorCisvLyNkZWZpbmUgUFJJTlRfREVCVUcKKyNpZmRlZiBQUklOVF9ERUJVRworI2RlZmluZSBkYmdfcHJpbnRrKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIGRiZ19wcmludGsoZm9ybWF0LCBhLi4uKQorI2VuZGlmICAKKworLyoqKioqKkRhdGEgU3RydWN0dXJlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW4gdGhlIHByaXZhdGUgZGF0YSBhcmVhIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIGNhcmQgc3RydWN0dXJlIHVzZWQgdG8gb2NjdXB5IHRoZSBwcml2YXRlIGFyZWEgYnV0IG5vdyB0aGUgZm9sbG93aW5nIAorICogc3RydWN0dXJlIHdpbGwgaW5jb3Jwb3JhdGUgdGhlIGNhcmQgc3RydWN0dXJlIGFsb25nIHdpdGggQ0hETEMgc3BlY2lmaWMgZGF0YQorICovCisKK3R5cGVkZWYgc3RydWN0IGNoZGxjX3ByaXZhdGVfYXJlYQoreworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOworCXNkbGFfdAkJKmNhcmQ7CisJaW50IAkJVHJhY2luZ0VuYWJsZWQ7CQkvKiBGb3IgZW5hYmxpbmcgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCWN1cnJfdHJhY2VfYWRkcjsJLyogVXNlZCBmb3IgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCXN0YXJ0X3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJZW5kX3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIAllbmRfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgc2hvcnQgCW51bWJlcl90cmFjZV9lbGVtZW50czsKKwl1bnNpZ25lZCAgCWF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisJdW5zaWduZWQgbG9uZyAJcm91dGVyX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgY2hhciAJcm91dGVfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3JlbW92ZWQ7CisJdW5zaWduZWQgbG9uZyAJdGlja19jb3VudGVyOwkJLyogRm9yIDVzIHRpbWVvdXQgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl91cF90aW1lOworICAgICAgICB1MzIgICAgICAgICAgICAgSVBfYWRkcmVzczsJCS8qIElQIGFkZHJlc3NpbmcgKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX25ldG1hc2s7CisJdTMyCQlpcF9sb2NhbDsKKwl1MzIJCWlwX3JlbW90ZTsKKwl1MzIgCQlpcF9sb2NhbF90bXA7CisJdTMyCQlpcF9yZW1vdGVfdG1wOworCXU4CQlpcF9lcnJvcjsKKwl1OAkJY29uZmlnX2NoZGxjOworCXU4IAkJY29uZmlnX2NoZGxjX3RpbWVvdXQ7CisJdW5zaWduZWQgY2hhciAgbWM7CQkJLyogTXVsaXRjYXN0IHN1cHBvcnQgb24vb2ZmICovCisJdW5zaWduZWQgc2hvcnQgdWRwX3BrdF9sZ3RoOwkJLyogdWRwIHBhY2tldCBwcm9jZXNzaW5nICovCisJY2hhciB1ZHBfcGt0X3NyYzsKKwljaGFyIHVkcF9wa3RfZGF0YVtNQVhfTEdUSF9VRFBfTUdOVF9QS1RdOworCXVuc2lnbmVkIHNob3J0IHRpbWVyX2ludF9lbmFibGVkOworCWNoYXIgdXBkYXRlX2NvbW1zX3N0YXRzOwkJLyogdXBkYXRpbmcgY29tbXMgc3RhdHMgKi8KKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIGNoZGxjX2JoICovCisJdW5zaWduZWQgbG9uZyAgdHFfd29ya2luZzsKKwl2b2xhdGlsZSBpbnQgIGJoX3dyaXRlOworCXZvbGF0aWxlIGludCAgYmhfcmVhZDsKKwlhdG9taWNfdCAgYmhfYnVmZl91c2VkOworCQorCXVuc2lnbmVkIGNoYXIgaW50ZXJmYWNlX2Rvd247CisKKwkvKiBQb2xsaW5nIHdvcmsgcXVldWUgZW50cnkuIEVhY2ggaW50ZXJmYWNlCisgICAgICAgICAqIGhhcyBpdHMgb3duIHdvcmsgcXVldWUgZW50cnksIHdoaWNoIGlzIHVzZWQKKyAgICAgICAgICogdG8gZGVmZXIgZXZlbnRzIGZyb20gdGhlIGludGVycnVwdCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF9kZWxheV90aW1lcjsKKworCXU4IGdhdGV3YXk7CisJdTggdHJ1ZV9pZl9lbmNvZGluZzsKKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCisvKiB2YXJpYWJsZSBmb3IgdHJhY2tpbmcgaG93IG1hbnkgaW50ZXJmYWNlcyB0byBvcGVuIGZvciBXQU5QSVBFIG9uIHRoZQorICAgdHdvIHBvcnRzICovCisKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkKiBkYWRkciwgdm9pZCogc2FkZHIsCisJCSAgICAgdW5zaWduZWQgbGVuKTsKKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkciAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworICAKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworLyogQ0hETEMgRmlybXdhcmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBjaGRsY19jb25maWd1cmUgCShzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEpOworc3RhdGljIGludCBjaGRsY19jb21tX2VuYWJsZSAJKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAJKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKTsKK3N0YXRpYyBpbnQgY2hkbGNfc2V0X2ludHJfbW9kZSAJKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSk7CitzdGF0aWMgaW50IGNoZGxjX3NlbmQgKHNkbGFfdCogY2FyZCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9vcF9zdGF0cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKTsKKworCitzdGF0aWMgaW50IGNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93biAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIE1pc2NlbGxhbmVvdXMgQ0hETEMgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IHNldF9jaGRsY19jb25maWcgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBpbml0X2NoZGxjX3R4X3J4X2J1ZmYoIHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCB1cGRhdGVfY29tbXNfc3RhdHMoc2RsYV90KiBjYXJkLAorICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgY29uZmlndXJlX2lwIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1bmNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfcm91dGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHBvcnRfc2V0X3N0YXRlIChzZGxhX3QgKmNhcmQsIGludCk7CitzdGF0aWMgaW50IGNvbmZpZ19jaGRsYyAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9jaGRsY19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cik7CisKKworLyogTWlzY2VsbGFuZW91cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZXRfYXN5X2NvbmZpZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgYXN5X2NvbW1fZW5hYmxlIChzZGxhX3QqIGNhcmQpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIHdwY19pc3IgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgdGltZXJfaW50cihzZGxhX3QgKik7CisKKy8qIEJvdHRvbSBoYWxmIGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBjaGRsY193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGRsY193b3JrX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc191ZHBfbWdtdF9wa3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCAgCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgczUwOF9sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CitzdGF0aWMgdm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworCisKK3N0YXRpYyBpbnQgIEludHJfdGVzdF9jb3VudGVyOworCisvKiBUVFkgR2xvYmFsIERlZmluaXRpb25zICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorI2RlZmluZSBXQU5fVFRZX01BSk9SIDIyNgorI2RlZmluZSBXQU5fVFRZX01JTk9SIDAKKworI2RlZmluZSBXQU5fQ0FSRChwb3J0KSAodHR5X2NhcmRfbWFwW3BvcnRdKQorI2RlZmluZSBNSU5fUE9SVCAwCisjZGVmaW5lIE1BWF9QT1JUIE5SX1BPUlRTLTEgCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAyCisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfaW5pdChzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfcmVjZWl2ZShzZGxhX3QgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3BvbGwoc2RsYV90ICpjYXJkKTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyIHNlcmlhbF9kcml2ZXI7CitzdGF0aWMgaW50IHR0eV9pbml0X2NudD0wOworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9zdGF0ZSByc190YWJsZVtOUl9QT1JUU107CisKK3N0YXRpYyBjaGFyIHR0eV9kcml2ZXJfbW9kZT1XQU5PUFRfVFRZX1NZTkM7CisKK3N0YXRpYyBjaGFyICpvcHRfZGVjb2RlW10gPSB7Ik5PTkUiLCJDUlRTQ1RTIiwiWE9OWE9GRi1SWCIsCisJICAJICAgICAgICAgICAgICJDUlRTQ1RTIFhPTlhPRkYtUlgiLCJYT05YT0ZGLVRYIiwKKwkJICAgICAgICAgICAgICJDUlRTQ1RTIFhPTlhPRkYtVFgiLCJDUlRTQ1RTIFhPTlhPRkYifTsKK3N0YXRpYyBjaGFyICpwX2RlY29kZVtdID0geyJOT05FIiwiT0REIiwiRVZFTiJ9OworCitzdGF0aWMgdm9pZCogdHR5X2NhcmRfbWFwW05SX1BPUlRTXSA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKworCisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdwY19pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5zaWduZWQgY2hhciBwb3J0X251bTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgbWF4X3Blcm1pdHRlZF9iYXVkID0gMDsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFnczsKKworCXVuaW9uCisJCXsKKwkJY2hhciBzdHJbODBdOworCQl9IHU7CisJdm9sYXRpbGUgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYjE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19DSERMQykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbmQgb3V0IHdoaWNoIFBvcnQgdG8gdXNlICovCisJaWYgKChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSkgfHwgKGNvbmYtPmNvbW1fcG9ydCA9PSBXQU5PUFRfU0VDKSl7CisJCWlmIChjYXJkLT5uZXh0KXsKKworCQkJaWYgKGNvbmYtPmNvbW1fcG9ydCAhPSBjYXJkLT5uZXh0LT51LmMuY29tbV9wb3J0KXsKKwkJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SIC0gJXMgcG9ydCB1c2VkIVxuIiwKKyAgICAgICAgCQkgICAgICAgIAljYXJkLT53YW5kZXYubmFtZSwgUE9SVChjb25mLT5jb21tX3BvcnQpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfWVsc2V7CisJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiAtIEludmFsaWQgUG9ydCBTZWxlY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyAqLworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKworCQlpZiAoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfUFJJKXsJCisJCQljYXJkLT5tYm94ICA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2U7CisJCX1lbHNleworCQkJY2FyZC0+bWJveCAgPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJU0VDX0JBU0VfQUREUl9NQl9TVFJVQ1QgLSBQUklfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfQkKKwl9ZWxzZXsgCisJCS8qIGZvciBhIFM1MTQgYWRhcHRlciwgc2V0IGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIG1haWxib3ggaW4gdGhlICovCisJCS8qIGFsbG9jYXRlZCB2aXJ0dWFsIG1lbW9yeSBhcmVhICovCisJCWlmIChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpeworCQkJY2FyZC0+bWJveCA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyBQUklfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfWVsc2V7CisJCQljYXJkLT5tYm94ID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIFNFQ19CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9CQorCX0KKworCW1iID0gbWIxID0gY2FyZC0+bWJveDsKKworCWlmICghY2FyZC0+Y29uZmlndXJlZCl7CisKKwkJLyogVGhlIGJvYXJkIHdpbGwgcGxhY2UgYW4gJ0knIGluIHRoZSByZXR1cm4gY29kZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzCisJICAgCXJlYWR5IHRvIGFjY2VwdCBjb21tYW5kcy4gIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGNvbXBsZXRlZCBpbiBsZXNzCisgICAgICAgICAgIAl0aGFuIDEgc2Vjb25kLiAqLworCisJCXRpbWVvdXQgPSBqaWZmaWVzOworCQl3aGlsZSAobWItPnJldHVybl9jb2RlICE9ICdJJykJLyogV2FpdCAxcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZSAqLworCQkJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAxKkhaKSBicmVhazsKKworCQlpZiAobWItPnJldHVybl9jb2RlICE9ICdJJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogSW5pdGlhbGl6YXRpb24gbm90IGNvbXBsZXRlZCBieSBhZGFwdGVyXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSByZXByZXNlbnRhdGl2ZS5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBSZWFkIGZpcm13YXJlIHZlcnNpb24uICBOb3RlIHRoYXQgd2hlbiBhZGFwdGVyIGluaXRpYWxpemVzLCBpdAorCSAqIGNsZWFycyB0aGUgbWFpbGJveCwgc28gaXQgbWF5IGFwcGVhciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHdhcworCSAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSB3aGVuIGluIGZhY3QgaXQgd2FzIG1lcmVseSBlcmFzZWQuIFRvIHdvcmsKKwkgKiBhcm91bmQgdGhpcywgd2UgZXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCB0d2ljZS4KKwkgKi8KKworCWlmIChjaGRsY19yZWFkX3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIENpc2NvIEhETEMgZmlybXdhcmUgdiVzXG4iLAorCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7IAorCisJY2FyZC0+aXNyCQkJPSAmd3BjX2lzcjsKKwljYXJkLT5wb2xsCQkJPSBOVUxMOworCWNhcmQtPmV4ZWMJCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSAmdXBkYXRlOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSBOVUxMOworCWNhcmQtPndhbmRldi51ZHBfcG9ydCAgIAk9IGNvbmYtPnVkcF9wb3J0OworCWNhcmQtPmRpc2FibGVfY29tbQkJPSAmZGlzYWJsZV9jb21tOworCWNhcmQtPndhbmRldi5uZXdfaWZfY250ID0gMDsKKworCS8qIHJlc2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlICd1cGRhdGUoKScgcHJvYyBoYXMgYmVlbiBjYWxsZWQgKi8KKwljYXJkLT51LmMudXBkYXRlX2NhbGxfY291bnQgPSAwOworCQorCWNhcmQtPndhbmRldi50dGwgPSBjb25mLT50dGw7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9IGNvbmYtPmludGVyZmFjZTsgCisKKwlpZiAoKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1NFQyAmJiBjb25mLT5pbnRlcmZhY2UgPT0gV0FOT1BUX1YzNSkmJgorCSAgICBjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiAtIFYzNSBJbnRlcmZhY2Ugbm90IHN1cHBvcnRlZCBvbiBTNTA4ICVzIHBvcnQgXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgUE9SVChjYXJkLT51LmMuY29tbV9wb3J0KSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IGNvbmYtPmNsb2NraW5nOworCisJcG9ydF9udW0gPSBjYXJkLT51LmMuY29tbV9wb3J0OworCisJLyogaW4gQVBJIG1vZGUsIHdlIGNhbiBjb25maWd1cmUgZm9yICJyZWNlaXZlIG9ubHkiIGJ1ZmZlcmluZyAqLworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCWNhcmQtPnUuYy5yZWNlaXZlX29ubHkgPSBjb25mLT5yZWNlaXZlX29ubHk7CisJCWlmKGNvbmYtPnJlY2VpdmVfb25seSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogQ29uZmlndXJlZCBmb3IgJ3JlY2VpdmUgb25seScgbW9kZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwl9CisKKwkvKiBTZXR1cCBQb3J0IEJwcyAqLworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKSB7CisJCWlmKChwb3J0X251bSA9PSBXQU5PUFRfUFJJKSB8fCBjYXJkLT51LmMucmVjZWl2ZV9vbmx5KSB7CisJCQkvKiBGb3IgUHJpbWFyeSBQb3J0IDAgKi8KKyAgICAgICAgICAgICAgIAkJbWF4X3Blcm1pdHRlZF9iYXVkID0KKwkJCQkoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8KKwkJCQlQUklfTUFYX0JBVURfUkFURV9TNTE0IDogCisJCQkJUFJJX01BWF9CQVVEX1JBVEVfUzUwODsKKworCQl9ZWxzZSBpZihwb3J0X251bSA9PSBXQU5PUFRfU0VDKSB7CisJCQkvKiBGb3IgU2Vjb25kYXJ5IFBvcnQgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3Blcm1pdHRlZF9iYXVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01BWF9CQVVEX1JBVEVfUzUxNCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgIAorCQkJaWYoY29uZi0+YnBzID4gbWF4X3Blcm1pdHRlZF9iYXVkKSB7CisJCQkJY29uZi0+YnBzID0gbWF4X3Blcm1pdHRlZF9iYXVkOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCYXVkIHRvbyBoaWdoIVxuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCByYXRlIHNldCB0byAlbHUgYnBzXG4iLCAKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsIG1heF9wZXJtaXR0ZWRfYmF1ZCk7CisJCQl9CisJCQljYXJkLT53YW5kZXYuYnBzID0gY29uZi0+YnBzOworCX1lbHNleworICAgICAgICAJY2FyZC0+d2FuZGV2LmJwcyA9IDA7CisgIAl9CisKKwkvKiBTZXR1cCB0aGUgUG9ydCBNVFUgKi8KKwlpZigocG9ydF9udW0gPT0gV0FOT1BUX1BSSSkgfHwgY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgeworCisJCS8qIEZvciBQcmltYXJ5IFBvcnQgMCAqLworCQljYXJkLT53YW5kZXYubXR1ID0KKwkJCShjb25mLT5tdHUgPj0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkcpID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBQUklfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIDoKKwkJCUNIRExDX0RGTFRfREFUQV9MRU47CisJfSBlbHNlIGlmKHBvcnRfbnVtID09IFdBTk9QVF9TRUMpIHsgCisJCS8qIEZvciBTZWNvbmRhcnkgUG9ydCAxICovCisJCWNhcmQtPndhbmRldi5tdHUgPQorCQkJKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9DSERMQ19EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFNFQ19NQVhfTk9fREFUQV9CWVRFU19JTl9GUkFNRSkgOgorCQkJQ0hETENfREZMVF9EQVRBX0xFTjsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBzdGF0dXMgYXJlYSAqLworCS8qIFJlYWQgdGhlIENIRExDIENvbmZpZ3VyYXRpb24gYW5kIG9idGFpbjogCisJICoJUHRyIHRvIHNoYXJlZCBtZW1vcnkgaW5mb3Igc3RydWN0CisgICAgICAgICAqIFVzZSB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBjYXJkLT51LmMuZmxhZ3MgIQorIAkgKi8KKwltYjEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iMS0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIxKSA/IG1iMS0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworICAgICAgICAgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIAllbmFibGVfaXJxKGNhcmQtPmh3LmlycSk7CisKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYjEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAJY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCX0KKworCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCQorCS8qIFRoaXMgaXMgZm9yIHRoZSBwb3J0cyBsaW5rIHN0YXRlICovCisJY2FyZC0+d2FuZGV2LnN0YXRlID0gV0FOX0RVQUxQT1JUOworCWNhcmQtPnUuYy5zdGF0ZSA9IFdBTl9ESVNDT05ORUNURUQ7CisKKworCWlmICghY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayl7CQorCQlpbnQgZXJyOworCisJCS8qIFBlcmZvcm0gaW50ZXJydXB0IHRlc3RpbmcgKi8KKwkJZXJyID0gaW50cl90ZXN0KGNhcmQpOworCisJCWlmKGVyciB8fCAoSW50cl90ZXN0X2NvdW50ZXIgPCBNQVhfSU5UUl9URVNUX0NPVU5URVIpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCB0ZXN0IGZhaWxlZCAoJWkpXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCB0ZXN0IHBhc3NlZCAoJWkpXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCWNhcmQtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCWlmICgoY2FyZC0+dHR5X29wdD1jb25mLT50dHkpID09IFdBTk9QVF9ZRVMpeworCQlpbnQgZXJyOworCQljYXJkLT50dHlfbWlub3IgPSBjb25mLT50dHlfbWlub3I7CisKKwkJLyogT24gQVNZTkMgY29ubmVjdGlvbnMgaW50ZXJuYWwgY2xvY2tpbmcgCisJCSAqIGlzIG1hbmRhdG9yeSAqLworCQlpZiAoKGNhcmQtPnUuYy5hc3luY19tb2RlID0gY29uZi0+dHR5X21vZGUpKXsKKwkJCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IDE7CisJCX0KKwkJZXJyPXdhbnBpcGVfdHR5X2luaXQoY2FyZCk7CisJCWlmIChlcnIpeworCQkJcmV0dXJuIGVycjsKKwkJfQorCX1lbHNleworCQorCisJCWlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fVElNRVIpKXsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogIgorCQkJCSJGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsJCisgICAgICAgIAl9CisJCisJCS8qIE1hc2sgdGhlIFRpbWVyIGludGVycnVwdCAqLworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9IAorCQkJfkFQUF9JTlRfT05fVElNRVI7CisJfQorCisJLyogSWYgd2UgYXJlIHVzaW5nIENIRExDIGluIGJhY2t1cCBtb2RlLCB0aGlzIGZsYWcgd2lsbAorCSAqIGluZGljYXRlIG5vdCB0byBsb29rIGZvciBJUCBhZGRyZXNzZXMgaW4gY29uZmlnX2NoZGxjKCkqLworCWNhcmQtPnUuYy5iYWNrdXAgPSBjb25mLT5iYWNrdXA7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MKKyAqIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCB3aGVuIHVwZGF0aW5nIHRoZSBQUk9DIGZpbGUgc3lzdGVtIGFuZCByZXR1cm5zCisgKiB2YXJpb3VzIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MuIFRoZXNlIHN0YXRpc3RpY3MgYXJlIGFjY3VtdWxhdGVkIGZyb20gMyAKKyAqIGRpZmZlcmVudCBsb2NhdGlvbnM6CisgKiAJMSkgVGhlICdpZl9zdGF0cycgcmVjb3JkZWQgZm9yIHRoZSBkZXZpY2UuCisgKiAJMikgQ29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogICAgICAzKSBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogVGhlIGJvYXJkIGxldmVsIHN0YXRpc3RpY3MgYXJlIHJlYWQgZHVyaW5nIGEgdGltZXIgaW50ZXJydXB0LiBOb3RlIHRoYXQgd2UgCisgKiByZWFkIHRoZSBlcnJvciBhbmQgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyBkdXJpbmcgY29uc2VjaXRpdmUgdGltZXIgdGlja3Mgc28KKyAqIGFzIHRvIG1pbmltaXplIHRoZSB0aW1lIHRoYXQgd2UgYXJlIGluc2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgdm9sYXRpbGUgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG1vcmUgc2FuaXR5IGNoZWNrcyAqLworICAgICAgICBpZighY2FyZC0+dS5jLmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisJaWYodGVzdF9iaXQoUEVSSV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisKKwlpZigoZGV2PWNhcmQtPndhbmRldi5kZXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKXsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQkJCisJLyogd2Ugd2lsbCBuZWVkIDIgdGltZXIgaW50ZXJydXB0cyB0byBjb21wbGV0ZSB0aGUgKi8KKwkvKiByZWFkaW5nIG9mIHRoZSBzdGF0aXN0aWNzICovCisJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAyOworICAgICAgIAlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisgIAorCS8qIHdhaXQgYSBtYXhpbXVtIG9mIDEgc2Vjb25kIGZvciB0aGUgc3RhdGlzdGljcyB0byBiZSB1cGRhdGVkICovIAorICAgICAgICB0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAgZm9yKDs7KSB7CisJCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDA7CisgCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOyAKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29uZmlndXJpbmcgSW50ZXJmYWNlOiAlc1xuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPm5hbWUpOworIAorCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkJCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJY2hkbGNfcHJpdl9hcmVhID0ga21hbGxvYyhzaXplb2YoY2hkbGNfcHJpdmF0ZV9hcmVhX3QpLCBHRlBfS0VSTkVMKTsKKwkKKwlpZihjaGRsY19wcml2X2FyZWEgPT0gTlVMTCkgCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNoZGxjX3ByaXZfYXJlYSwgMCwgc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSk7CisKKwljaGRsY19wcml2X2FyZWEtPmNhcmQgPSBjYXJkOyAKKwljaGRsY19wcml2X2FyZWEtPmNvbW1vbi5zayA9IE5VTEw7CisJY2hkbGNfcHJpdl9hcmVhLT5jb21tb24uZnVuYyA9IE5VTEw7CQorCisJLyogaW5pdGlhbGl6ZSBkYXRhICovCisJc3RyY3B5KGNhcmQtPnUuYy5pZl9uYW1lLCBjb25mLT5uYW1lKTsKKworCWlmKGNhcmQtPndhbmRldi5uZXdfaWZfY250ID4gMCkgeworICAgICAgICAgICAgICAgIGtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWNhcmQtPndhbmRldi5uZXdfaWZfY250Kys7CisKKwljaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkID0gMDsKKwljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDA7CisKKwljYXJkLT51LmMuYXN5bmNfbW9kZSA9IGNvbmYtPmFzeW5jX21vZGU7CisJCisJLyogc2V0dXAgZm9yIGFzeW5jaHJvbm91cyBtb2RlICovCisJaWYoY29uZi0+YXN5bmNfbW9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29uZmlndXJpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RlXG4iLAorCQkJd2FuZGV2LT5uYW1lKTsKKworCQlpZihjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6QXN5bmNocm9ub3VzIG1vZGUgb24gc2Vjb25kYXJ5IHBvcnQgb25seVxuIiwKKwkJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJICAgICAgIAlpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBSdW5uaW5nIGluIFdBTklQRSBBc3luYyBNb2RlXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQl3YW5kZXYtPm5hbWUpOworCQkJY2FyZC0+dS5jLnVzZWRieSA9IFdBTlBJUEU7CisJCX1lbHNleworCQkJY2FyZC0+dS5jLnVzZWRieSA9IEFQSTsKKwkJfQorCisJCWlmKCFjYXJkLT53YW5kZXYuY2xvY2tpbmcpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEFzeW5jaC4gY2xvY2tpbmcgbXVzdCBiZSAnSW50ZXJuYWwnXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQlrZnJlZShjaGRsY19wcml2X2FyZWEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZigoY2FyZC0+d2FuZGV2LmJwcyA8IE1JTl9BU1lfQkFVRF9SQVRFKSB8fAorCQkJKGNhcmQtPndhbmRldi5icHMgPiBNQVhfQVNZX0JBVURfUkFURSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBiYXVkIHJhdGUgaXMgaW52YWxpZC5cbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIk11c3QgYmUgYmV0d2VlbiAldSBhbmQgJXUgYnBzLlxuIiwKKwkJCQlNSU5fQVNZX0JBVURfUkFURSwgTUFYX0FTWV9CQVVEX1JBVEUpOworCQkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2FyZC0+dS5jLmFwaV9vcHRpb25zID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+YXN5X2RhdGFfdHJhbnMgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLmFwaV9vcHRpb25zIHw9IEFTWV9SWF9EQVRBX1RSQU5TUEFSRU5UOworICAgICAgICAgICAgICAgIH0KKwkJCisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gMDsKKwkJaWYgKGNvbmYtPnJ0c19oc19mb3JfcmVjZWl2ZSA9PSBXQU5PUFRfWUVTKSB7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfUlRTX0hTX0ZPUl9SWDsKKwkgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+eG9uX3hvZmZfaHNfZm9yX3JlY2VpdmUgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX1hPTl9YT0ZGX0hTX0ZPUl9SWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPnhvbl94b2ZmX2hzX2Zvcl90cmFuc21pdCA9PSBXQU5PUFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfWE9OX1hPRkZfSFNfRk9SX1RYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+ZGNkX2hzX2Zvcl90cmFuc21pdCA9PSBXQU5PUFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfRENEX0hTX0ZPUl9UWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPmN0c19oc19mb3JfdHJhbnNtaXQgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX0NUU19IU19GT1JfVFg7CisgICAgICAgICAgICAgICAgfQorCisJCWNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyID0gY29uZi0+dHhfYml0c19wZXJfY2hhcjsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhfYml0c19wZXJfY2hhciA9IGNvbmYtPnJ4X2JpdHNfcGVyX2NoYXI7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnN0b3BfYml0cyA9IGNvbmYtPnN0b3BfYml0czsKKwkJY2FyZC0+dS5jLnBhcml0eSA9IGNvbmYtPnBhcml0eTsKKwkJY2FyZC0+dS5jLmJyZWFrX3RpbWVyID0gY29uZi0+YnJlYWtfdGltZXI7CisJCWNhcmQtPnUuYy5pbnRlcl9jaGFyX3RpbWVyID0gY29uZi0+aW50ZXJfY2hhcl90aW1lcjsKKwkJY2FyZC0+dS5jLnJ4X2NvbXBsZXRlX2xlbmd0aCA9IGNvbmYtPnJ4X2NvbXBsZXRlX2xlbmd0aDsKKwkJY2FyZC0+dS5jLnhvbl9jaGFyID0gY29uZi0+eG9uX2NoYXI7CisKKwl9IGVsc2UgewkvKiBzZXR1cCBmb3Igc3luY2hyb25vdXMgbW9kZSAqLworCisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gMDsKKwkJaWYgKGNvbmYtPmlnbm9yZV9kY2QgPT0gV0FOT1BUX1lFUyl7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBJR05PUkVfRENEX0ZPUl9MSU5LX1NUQVQ7CisJCX0KKwkJaWYgKGNvbmYtPmlnbm9yZV9jdHMgPT0gV0FOT1BUX1lFUyl7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBJR05PUkVfQ1RTX0ZPUl9MSU5LX1NUQVQ7CisJCX0KKworCQlpZiAoY29uZi0+aWdub3JlX2tlZXBhbGl2ZSA9PSBXQU5PUFRfWUVTKSB7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PQorCQkJCUlHTk9SRV9LUEFMVl9GT1JfTElOS19TVEFUOworCQkJY2FyZC0+dS5jLmtwYWx2X3R4ICA9IE1JTl9UeF9LUEFMVl9USU1FUjsgCisJCQljYXJkLT51LmMua3BhbHZfcnggID0gTUlOX1J4X0tQQUxWX1RJTUVSOyAKKwkJCWNhcmQtPnUuYy5rcGFsdl9lcnIgPSBNSU5fS1BBTFZfRVJSX1RPTDsgCisKKwkJfSBlbHNlIHsgICAvKiBEbyBub3QgaWdub3JlIGtlZXBhbGl2ZXMgKi8KKwkJCWNhcmQtPnUuYy5rcGFsdl90eCA9CisJCQkJKChjb25mLT5rZWVwYWxpdmVfdHhfdG1yIC0gTUlOX1R4X0tQQUxWX1RJTUVSKQorCQkJCT49IDApID8KKwkgICAJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmtlZXBhbGl2ZV90eF90bXIsTUFYX1R4X0tQQUxWX1RJTUVSKSA6CisJCQkJREVGQVVMVF9UeF9LUEFMVl9USU1FUjsKKworCQkJY2FyZC0+dS5jLmtwYWx2X3J4ID0KKwkJICAgCQkoKGNvbmYtPmtlZXBhbGl2ZV9yeF90bXIgLSBNSU5fUnhfS1BBTFZfVElNRVIpCisJCQkJPj0gMCkgPworCSAgIAkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+a2VlcGFsaXZlX3J4X3RtcixNQVhfUnhfS1BBTFZfVElNRVIpIDoKKwkJCQlERUZBVUxUX1J4X0tQQUxWX1RJTUVSOworCisJCQljYXJkLT51LmMua3BhbHZfZXJyID0KKwkJICAgCQkoKGNvbmYtPmtlZXBhbGl2ZV9lcnJfbWFyZ2luLU1JTl9LUEFMVl9FUlJfVE9MKQorCQkJCT49IDApID8KKwkgICAJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmtlZXBhbGl2ZV9lcnJfbWFyZ2luLAorCQkJCU1BWF9LUEFMVl9FUlJfVE9MKSA6IAorCSAgIAkJCURFRkFVTFRfS1BBTFZfRVJSX1RPTDsKKwkJfQorCisJCS8qIFNldHVwIHNsYXJwIHRpbWVyIHRvIGNvbnRyb2wgZGVsYXkgYmV0d2VlbiBzbGFycHMgKi8KKwkJY2FyZC0+dS5jLnNsYXJwX3RpbWVyID0gCisJCQkoKGNvbmYtPnNsYXJwX3RpbWVyIC0gTUlOX1NMQVJQX1JFUV9USU1FUikgPj0gMCkgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5zbGFycF90aW1lciwgTUFYX1NMQVJQX1JFUV9USU1FUikgOgorCQkJREVGQVVMVF9TTEFSUF9SRVFfVElNRVI7CisKKwkJaWYgKGNvbmYtPmhkbGNfc3RyZWFtaW5nID09IFdBTk9QVF9ZRVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBIRExDIFNUUkVBTUlORyBNb2RlXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IEhETENfU1RSRUFNSU5HX01PREU7CisJCX0KKworCQlpZiAoKGNoZGxjX3ByaXZfYXJlYS0+dHJ1ZV9pZl9lbmNvZGluZyA9IGNvbmYtPnRydWVfaWZfZW5jb2RpbmcpID09IFdBTk9QVF9ZRVMpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IEVuYWJsaW5nLCB0cnVlIGludGVyZmFjZSB0eXBlIGVuY29kaW5nLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCQkKKyAgICAgICAgCS8qIFNldHVwIHdhbnBpcGUgYXMgYSByb3V0ZXIgKFdBTlBJUEUpIG9yIGFzIGFuIEFQSSAqLworCQlpZiggc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKSB7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIFdBTlBJUEUgbW9kZSFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWNhcmQtPnUuYy51c2VkYnkgPSBXQU5QSVBFOworCisJCQkvKiBPcHRpb24gdG8gYnJpbmcgZG93biB0aGUgaW50ZXJmYWNlIHdoZW4gCisgICAgICAgIAkJICogdGhlIGxpbmsgZ29lcyBkb3duICovCisJCQlpZiAoY29uZi0+aWZfZG93bil7CisJCQkJc2V0X2JpdChEWU5fT1BUX09OLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSAiJXM6IER5bmFtaWMgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZW5hYmxlZFxuIiwKKwkJCQkgICBjYXJkLT5kZXZuYW1lKTsKKwkJCX0gCisKKwkJfSBlbHNlIGlmKCBzdHJjbXAoY29uZi0+dXNlZGJ5LCAiQVBJIikgPT0gMCkgeworCQkJY2FyZC0+dS5jLnVzZWRieSA9IEFQSTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIEFQSSBtb2RlICFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCS8qIFRlbGxzIHVzIHRoYXQgaWYgdGhpcyBpbnRlcmZhY2UgaXMgYQorICAgICAgICAgKiBnYXRld2F5IG9yIG5vdCAqLworCWlmICgoY2hkbGNfcHJpdl9hcmVhLT5nYXRld2F5ID0gY29uZi0+Z2F0ZXdheSkgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgc2V0IGFzIGEgZ2F0ZXdheS5cbiIsCisJCQljYXJkLT5kZXZuYW1lLGNhcmQtPnUuYy5pZl9uYW1lKTsKKwl9CisKKwkvKiBHZXQgTXVsdGljYXN0IEluZm9ybWF0aW9uICovCisJY2hkbGNfcHJpdl9hcmVhLT5tYyA9IGNvbmYtPm1jOworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLGNhcmQtPnUuYy5pZl9uYW1lKTsKKworCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoZGxjX3ByaXZfYXJlYTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgd29yayByb3V0aW5lICovCisJSU5JVF9XT1JLKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfd29yaywgKHZvaWQqKSh2b2lkKiljaGRsY19wb2xsLCBkZXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcG9sbGluZyBkZWxheSB0aW1lciAqLworCWluaXRfdGltZXIoJmNoZGxjX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmZ1bmN0aW9uID0gY2hkbGNfcG9sbF9kZWxheTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9ICZpZl9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT5mbGFncwkJfD0gSUZGX1BPSU5UT1BPSU5UOworCWRldi0+ZmxhZ3MJCXw9IElGRl9OT0FSUDsKKworCS8qIEVuYWJsZSBNdWxpdGNhc3RpbmcgaWYgdXNlciBzZWxlY3RlZCAqLworCWlmIChjaGRsY19wcml2X2FyZWEtPm1jID09IFdBTk9QVF9ZRVMpeworCQlkZXYtPmZsYWdzIAl8PSBJRkZfTVVMVElDQVNUOworCX0KKwkKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT50cnVlX2lmX2VuY29kaW5nKXsKKwkJZGV2LT50eXBlCT0gQVJQSFJEX0hETEM7IC8qIFRoaXMgYnJlYWtzIHRoZSB0Y3BkdW1wICovCisJfWVsc2V7CisJCWRldi0+dHlwZQk9IEFSUEhSRF9QUFA7CisJfQorCQorCWRldi0+bXR1CQk9IGNhcmQtPndhbmRldi5tdHU7CisJLyogZm9yIEFQSSB1c2FnZSwgYWRkIHRoZSBBUEkgaGVhZGVyIHNpemUgdG8gdGhlIHJlcXVlc3RlZCBNVFUgc2l6ZSAqLworCWlmKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKSB7CisJCWRldi0+bXR1ICs9IHNpemVvZihhcGlfdHhfaGRyX3QpOworCX0KKyAKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IENIRExDX0hEUl9MRU47CisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9IHdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisJLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggCisJICogSWYgdG9vIGxvdyBwYWNrZXRzIHdpbGwgbm90IGJlIHJldHJhbnNtaXR0ZWQgCisgICAgICAgICAqIGJ5IHN0YWNrLgorCSAqLworICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyID0gMDsKKworCS8qIE9ubHkgb25lIG9wZW4gcGVyIGludGVyZmFjZSBpcyBhbGxvd2VkICovCisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogSW5pdGlhbGl6ZSB0aGUgd29yayBxdWV1ZSBlbnRyeSAqLworCWNoZGxjX3ByaXZfYXJlYS0+dHFfd29ya2luZz0wOworCisJSU5JVF9XT1JLKCZjaGRsY19wcml2X2FyZWEtPmNvbW1vbi53YW5waXBlX3dvcmssCisJCQkodm9pZCAqKSh2b2lkICopY2hkbGNfd29yaywgZGV2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEJIIGNpcmN1bGFyIGJ1ZmZlciAqLworCS8qIEFkZCAxIHRvIE1BWF9CSF9CVUZGIHNvIHdlIGRvbid0IGhhdmUgdGVzdCB3aXRoIChNQVhfQkhfQlVGRi0xKSAqLworCWNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZCA9IGttYWxsb2MoKHNpemVvZihiaF9kYXRhX3QpKihNQVhfQkhfQlVGRisxKSksR0ZQX0FUT01JQyk7CisJbWVtc2V0KGNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZCwwLChzaXplb2YoYmhfZGF0YV90KSooTUFYX0JIX0JVRkYrMSkpKTsKKwlhdG9taWNfc2V0KCZjaGRsY19wcml2X2FyZWEtPmJoX2J1ZmZfdXNlZCwgMCk7CisgCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZSA9IHR2LnR2X3NlYzsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwkvKiBUVFkgaXMgY29uZmlndXJlZCBkdXJpbmcgd2FucGlwZV9zZXRfdGVybWlvcworCSAqIGNhbGwsIG5vdCBoZXJlICovCisJaWYgKGNhcmQtPnR0eV9vcHQpCisJCXJldHVybiBlcnI7CisJCisJc2V0X2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYyk7CisJY2hkbGNfcHJpdl9hcmVhLT5jb25maWdfY2hkbGNfdGltZW91dD1qaWZmaWVzOworCisJLyogU3RhcnQgdGhlIENIRExDIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgMXNlYyBkZWxheS4KKwkgKiBUaGlzIHdpbGwgZ2l2ZSB0aGUgaW50ZXJmYWNlIGluaXRpbGl6YXRpb24gdGltZQorCSAqIHRvIGZpbmlzaCBpdHMgY29uZmlndXJhdGlvbiAqLworCW1vZF90aW1lcigmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgSFopOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xvc2UgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2xvc2UsIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKworCWlmIChjaGRsY19wcml2X2FyZWEtPmJoX2hlYWQpeworCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkKKwkJZm9yIChpPTA7IGk8KE1BWF9CSF9CVUZGKzEpOyBpKyspeworCQkJc2tiID0gKChiaF9kYXRhX3QgKikmY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkW2ldKS0+c2tiOworCQkJaWYgKHNrYiAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkPU5VTEw7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXdhbnBpcGVfY2xvc2UoY2FyZCk7CisJZGVsX3RpbWVyKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCkKK3sKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwlpZiAoY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCl7CisJCWNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93biAoY2FyZCk7CisJfWVsc2V7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOwkKKwl9CisKKwlpZiAoIXR0eV9pbml0X2NudCkKKwkJcmV0dXJuOworCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CisJCWlmICghKC0tdHR5X2luaXRfY250KSl7CisJCQlpbnQgZTE7CisJCQlzZXJpYWxfZHJpdmVyLnJlZmNvdW50PTA7CisJCQkKKwkJCWlmICgoZTEgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcml2ZXIpKSkKKwkJCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkJCSAgICAgICBlMSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5yZWdpc3RlcmluZyBUVFkgRHJpdmVyLCBNYWpvciAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxXQU5fVFRZX01BSk9SKTsKKwkJfQorCQljYXJkLT50dHk9TlVMTDsKKwkJdHR5X2NhcmRfbWFwW2NhcmQtPnR0eV9taW5vcl09TlVMTDsKKwkJc3RhdGUgPSAmcnNfdGFibGVbY2FyZC0+dHR5X21pbm9yXTsKKwkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisJfQorCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBUaGUgdHJpY2sgaGVyZSBpcyB0byBwdXQgcGFja2V0IHR5cGUgKEV0aGVydHlwZSkgaW50byAncHJvdG9jb2wnIGZpZWxkIG9mCisgKiB0aGUgc29ja2V0IGJ1ZmZlciwgc28gdGhhdCB3ZSBkb24ndCBmb3JnZXQgaXQuICBJZiBwYWNrZXQgdHlwZSBpcyBub3QKKyAqIHN1cHBvcnRlZCwgc2V0IHNrYi0+cHJvdG9jb2wgdG8gMCBhbmQgZGlzY2FyZCBwYWNrZXQgbGF0ZXIuCisgKgorICogUmV0dXJuOgltZWRpYSBoZWFkZXIgbGVuZ3RoLgorICovCitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQqIGRhZGRyLCB2b2lkKiBzYWRkciwKKwkJICAgICB1bnNpZ25lZCBsZW4pCit7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCisJcmV0dXJuIENIRExDX0hEUl9MRU47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdHJhbnNtaXQgdGltZW91dCBldmVudCBmcm9tIG5ldGlmIHdhdGNoZG9nCisgKi8KK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwkKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrK2NhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIGNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZS1idWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogUmV0dXJuOgkxCXBoeXNpY2FsIGFkZHJlc3MgcmVzb2x2ZWQuCisgKgkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZAorICovCitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgdGJ1c3kgZmxhZyAobWFya3Mgc3RhcnQgb2YgdGhlIHRyYW5zbWlzc2lvbikgdG8gYmxvY2sgYSB0aW1lci1iYXNlZAorICogICB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGV4ZWN1dGUgYWRhcHRlciBzZW5kIGNvbW1hbmQuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIDIuIFNldHRpbmcgdGJ1c3kgZmxhZyB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZQorICogICAgcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqLworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJSU5URVJSVVBUX0lORk9STUFUSU9OX1NUUlVDVCAqY2hkbGNfaW50ID0gJmZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3Q7CisJaW50IHVkcF90eXBlID0gMDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgZXJyPTA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaWYgKHNrYiA9PSBOVUxMKXsKKwkJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxheWVyIHRoaW5rcyB3ZSd2ZSBtaXNzZWQgYW4KKwkJICogdHgtZG9uZSBpbnRlcnJ1cHQuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJmYWNlICVzIGdvdCBraWNrZWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworICAgCWlmIChudG9ocyhza2ItPnByb3RvY29sKSAhPSBodG9ucyhQVkNfUFJPVCkpeworCisJCS8qIGNoZWNrIHRoZSB1ZHAgcGFja2V0IHR5cGUgKi8KKwkJCisJCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKHNrYiwgY2FyZCk7CisKKwkJaWYgKHVkcF90eXBlID09IFVEUF9DUElQRV9UWVBFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0b3JlX3VkcF9tZ210X3BrdChVRFBfUEtUX0ZSTV9TVEFDSywgY2FyZCwgc2tiLCBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGxjX3ByaXZfYXJlYSkpeworCSAgICAgICAgICAgICAgICAJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PQorCQkJCQlBUFBfSU5UX09OX1RJTUVSOworCQkJfQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBvciAqLworCQkvKiBtdWx0aWNhc3QgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGlmKGNoa19iY2FzdF9tY2FzdF9hZGRyKGNhcmQsIGRldiwgc2tiKSl7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgICAgICB9CisKKwkvKiBMb2NrIHRoZSA1MDggQ2FyZDogU01QIGlzIHN1cHBvcnRlZCAqLworICAgICAgCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJczUwOF9sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfSAKKworICAgIAlpZih0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBpbiBpZl9zZW5kOiAlbHhcbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lLGNhcmQtPndhbmRldi5jcml0aWNhbCk7CisgICAgICAgICAgICAgICAgKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZ290byBpZl9zZW5kX2V4aXRfY3JpdDsKKwl9CisKKwlpZihjYXJkLT51LmMuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisgICAgICAgCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKwl9ZWxzZSBpZighc2tiLT5wcm90b2NvbCl7CisgICAgICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9lcnJvcnM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQorCX1lbHNlIHsKKwkJdm9pZCogZGF0YSA9IHNrYi0+ZGF0YTsKKwkJdW5zaWduZWQgbGVuID0gc2tiLT5sZW47CisJCXVuc2lnbmVkIGNoYXIgYXR0cjsKKworCQkvKiBJZiBpdCdzIGFuIEFQSSBwYWNrZXQgcHVsbCBvZmYgdGhlIEFQSQorCQkgKiBoZWFkZXIuIEFsc28gY2hlY2sgdGhhdCB0aGUgcGFja2V0IHNpemUKKwkJICogaXMgbGFyZ2VyIHRoYW4gdGhlIEFQSSBoZWFkZXIKKwkgICAgICAgICAqLworCQlpZiAoY2FyZC0+dS5jLnVzZWRieSA9PSBBUEkpeworCQkJYXBpX3R4X2hkcl90KiBhcGlfdHhfaGRyOworCisJCQkvKiBkaXNjYXJkIHRoZSBmcmFtZSBpZiB3ZSBhcmUgY29uZmlndXJlZCBmb3IgKi8KKwkJCS8qICdyZWNlaXZlIG9ubHknIG1vZGUgb3IgaWYgdGhlcmUgaXMgbm8gZGF0YSAqLworCQkJaWYgKGNhcmQtPnUuYy5yZWNlaXZlX29ubHkgfHwKKwkJCQkobGVuIDw9IHNpemVvZihhcGlfdHhfaGRyX3QpKSkgeworCQkJCQorCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQlnb3RvIGlmX3NlbmRfZXhpdF9jcml0OworCQkJfQorCQkJCQorCQkJYXBpX3R4X2hkciA9IChhcGlfdHhfaGRyX3QgKilkYXRhOworCQkJYXR0ciA9IGFwaV90eF9oZHItPmF0dHI7CisJCQlkYXRhICs9IHNpemVvZihhcGlfdHhfaGRyX3QpOworCQkJbGVuIC09IHNpemVvZihhcGlfdHhfaGRyX3QpOworCQl9CisKKwkJaWYoY2hkbGNfc2VuZChjYXJkLCBkYXRhLCBsZW4pKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCX1lbHNleworCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPndhbmRldi5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCQkKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQkKKwkJIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQkKKwl9CisKK2lmX3NlbmRfZXhpdF9jcml0OgorCQorCWlmICghKGVycj1uZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGlja19jb3VudGVyID0gamlmZmllczsKKwkJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RYX0ZSQU1FOworCX0KKworCWNsZWFyX2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfdW5sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBjb250YWlucyBhIGJyb2FkY2FzdCBvcgorICogbXVsdGljYXN0IHNvdXJjZSBJUCBhZGRyZXNzLgorICovCisKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIHNyY19pcF9hZGRyOworICAgICAgICB1MzIgYnJvYWRjYXN0X2lwX2FkZHIgPSAwOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgc291cmNlIGFkZHJlc3MgZnJvbSB0aGUgb3V0Z29pbmcgcGFja2V0ICovCisgICAgICAgIHNyY19pcF9hZGRyID0gKih1MzIgKikoc2tiLT5kYXRhICsgMTIpOworCisJLyogcmVhZCB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8KKyAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIGlmKGluX2RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhPSBpbl9kZXYtPmlmYV9saXN0OworICAgICAgICAgICAgICAgIGlmKGlmYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2lwX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgQnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSAmJiAoc3JjX2lwX2FkZHIgPT0gYnJvYWRjYXN0X2lwX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyb2FkY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gCisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgTXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKG50b2hsKHNyY19pcF9hZGRyKSA+PSAweEUwMDAwMDAxKSAmJgorCQkobnRvaGwoc3JjX2lwX2FkZHIpIDw9IDB4RkZGRkZGRkUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE11bHRpY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlcGx5IHRvIFVEUCBNYW5hZ2VtZW50IHN5c3RlbS4KKyAqIFJldHVybiBsZW5ndGggb2YgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKQoreworCisJdW5zaWduZWQgc2hvcnQgbGVuLCB1ZHBfbGVuZ3RoLCB0ZW1wLCBpcF9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBpcF90ZW1wOworCWludCBldmVuX2JvdW5kID0gMDsKKyAgCWNoZGxjX3VkcF9wa3RfdCAqY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKWRhdGE7CisJIAorCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBzaXplb2YodHJhY2VfaW5mb190KSsgCisJICAgICAgbWJveF9sZW47CisKKwkvKiBmaWxsIGluIFVEUCByZXBseSAqLworCWNfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgIAorCS8qIGZpbGwgaW4gVURQIGxlbmd0aCAqLworCXVkcF9sZW5ndGggPSBzaXplb2YodWRwX3BrdF90KSsgCisJCSAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJCSAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrCisJCSAgICAgbWJveF9sZW47IAorCisgCS8qIHB1dCBpdCBvbiBhbiBldmVuIGJvdW5kYXJ5ICovCisJaWYgKCB1ZHBfbGVuZ3RoICYgMHgwMDAxICkgeworCQl1ZHBfbGVuZ3RoICs9IDE7CisJCWxlbiArPSAxOworCQlldmVuX2JvdW5kID0gMTsKKwl9ICAKKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfbGVuZ3RoID0gdGVtcDsKKwkJIAorCS8qIHN3YXAgVURQIHBvcnRzICovCisJdGVtcCA9IGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQ7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydCA9IAorCQkJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydDsgCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9IHRlbXA7CisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopKGNfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKSkgPSB0ZW1wOwkKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworCisJCSAKKwkvKiBjYWxjdWxhdGUgVURQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IDA7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sdWRwX2xlbmd0aCtVRFBfT0ZGU0VUKTsKKworCS8qIGZpbGwgaW4gSVAgbGVuZ3RoICovCisJaXBfbGVuZ3RoID0gbGVuOworCXRlbXAgPSAoaXBfbGVuZ3RoPDw4KXwoaXBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzcyA9IGNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCWNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCS8qIGZpbGwgaW4gSVAgY2hlY2tzdW0gKi8KKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oZGF0YSxzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47CisKK30gLyogcmVwbHlfdWRwICovCisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsgCisJdW5zaWduZWQgbG9uZyBzdW09MDsKKwlpbnQgaTsKKworCWZvciggaSA9IDA7IGkgPGxlbjsgaSs9MiApIHsKKwkJbWVtY3B5KCZ0ZW1wLCZkYXRhW2ldLDIpOworCQlzdW0gKz0gKHVuc2lnbmVkIGxvbmcpdGVtcDsKKwl9CisKKwl3aGlsZSAoc3VtID4+IDE2ICkgeworCQlzdW0gPSAoc3VtICYgMHhmZmZmVUwpICsgKHN1bSA+PiAxNik7CisJfQorCisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydClzdW07CisJdGVtcCA9IH50ZW1wOworCisJaWYoIHRlbXAgPT0gMCApIAorCQl0ZW1wID0gMHhmZmZmOworCisJcmV0dXJuIHRlbXA7CQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc2RsYV90ICpteV9jYXJkOworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWE7CisKKwlpZiAoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbXlfY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlyZXR1cm4gJm15X2NhcmQtPndhbmRldi5zdGF0czsgCit9CisKKworLyoqKioqKiBDaXNjbyBIRExDIEZpcm13YXJlIEludGVyZmFjZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGZpcm13YXJlIGNvZGUgdmVyc2lvbi4KKyAqCVB1dCBjb2RlIHZlcnNpb24gYXMgQVNDSUkgc3RyaW5nIGluIHN0ci4gCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cikKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBsZW47CisJY2hhciBlcnI7CisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT0RFX1ZFUlNJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCX0KKwllbHNlIGlmIChzdHIpIHsgIC8qIGlzIG5vdCBudWxsICovCisJCWxlbiA9IG1iLT5idWZmZXJfbGVuZ3RoOworCQltZW1jcHkoc3RyLCBtYi0+ZGF0YSwgbGVuKTsKKwkJc3RyW2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gKGVycik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBDb25maWd1cmUgQ0hETEMgZmlybXdhcmUuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWFpbGJveCA9IGNhcmQtPm1ib3g7CisJaW50IGRhdGFfbGVuZ3RoID0gc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKTsKKwkKKwltYWlsYm94LT5idWZmZXJfbGVuZ3RoID0gZGF0YV9sZW5ndGg7ICAKKwltZW1jcHkobWFpbGJveC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW5ndGgpOworCW1haWxib3gtPmNvbW1hbmQgPSBTRVRfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWFpbGJveCkgPyBtYWlsYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgIT0gQ09NTUFORF9PSykgY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWFpbGJveCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGludGVycnVwdCBtb2RlIC0tIEhETEMgVmVyc2lvbi4KKyAqLworCitzdGF0aWMgaW50IGNoZGxjX3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCUNIRExDX0lOVF9UUklHR0VSU19TVFJVQ1QqIGludF9kYXRhID0KKwkJIChDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUICopbWItPmRhdGE7CisJaW50IGVycjsKKworCWludF9kYXRhLT5DSERMQ19pbnRlcnJ1cHRfdHJpZ2dlcnMgCT0gbW9kZTsKKwlpbnRfZGF0YS0+SVJRCQkJCT0gY2FyZC0+aHcuaXJxOworCWludF9kYXRhLT5pbnRlcnJ1cHRfdGltZXIgICAgICAgICAgICAgICA9IDE7CisgICAKKwltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKTsKKwltYi0+Y29tbWFuZCA9IFNFVF9DSERMQ19JTlRFUlJVUFRfVFJJR0dFUlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWIpOworCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duCisgKgorICogU2h1dGRvd24oKSBkaXNhYmxlcyB0aGUgY29tbXVuaWNhdGlvbnMuIFdlIG11c3QKKyAqIGhhdmUgYSBzcGFyYXRlIGZ1bmN0aW9ucywgYmVjYXVzZSB3ZSBtdXN0IG5vdAorICogY2FsbCBjaGRsY19lcnJvcigpIGhhbmRlciBzaW5jZSB0aGUgcHJpdmF0ZQorICogYXJlYSBoYXMgYWxyZWFkeSBiZWVuIHJlcGxhY2VkICovCisKK3N0YXRpYyBpbnQgY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duIChzZGxhX3QgKmNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKiBpbnRfZGF0YSA9CisJCSAoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCAqKW1iLT5kYXRhOworCWludCBlcnI7CisKKwkvKiBEaXNhYmxlIEludGVycnV0cHMgKi8KKwlpbnRfZGF0YS0+Q0hETENfaW50ZXJydXB0X3RyaWdnZXJzIAk9IDA7CisJaW50X2RhdGEtPklSUQkJCQk9IGNhcmQtPmh3LmlycTsKKwlpbnRfZGF0YS0+aW50ZXJydXB0X3RpbWVyICAgICAgICAgICAgICAgPSAxOworICAgCisJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCk7CisJbWItPmNvbW1hbmQgPSBTRVRfQ0hETENfSU5URVJSVVBUX1RSSUdHRVJTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCS8qIERpc2FibGUgQ29tbXVuaWNhdGlvbnMgKi8KKworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSkgeworCQltYi0+Y29tbWFuZCA9IERJU0FCTEVfQVNZX0NPTU1VTklDQVRJT05TOworCX1lbHNleworCQltYi0+Y29tbWFuZCA9IERJU0FCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJfQorCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCisJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlpbnQgZXJyOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBFTkFCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkID0gMTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgY29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DT01NU19FUlJPUl9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19PUEVSQVRJT05BTF9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNvbW11bmljYXRpb25zIGVycm9yIGFuZCBnZW5lcmFsIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jb21tc19zdGF0cyhzZGxhX3QqIGNhcmQsCisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKyAgCUNPTU1TX0VSUk9SX1NUQVRTX1NUUlVDVCogZXJyX3N0YXRzOworICAgICAgICBDSERMQ19PUEVSQVRJT05BTF9TVEFUU19TVFJVQ1QgKm9wX3N0YXRzOworCisJLyogb24gdGhlIGZpcnN0IHRpbWVyIGludGVycnVwdCwgcmVhZCB0aGUgY29tbXMgZXJyb3Igc3RhdGlzdGljcyAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDIpIHsKKwkJaWYoY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyhjYXJkKSkKKwkJCXJldHVybiAxOworCQllcnJfc3RhdHMgPSAoQ09NTVNfRVJST1JfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+Unhfb3ZlcnJ1bl9lcnJfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5DUkNfZXJyX2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9hYm9ydF9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9kaXNfcHJpX2JmcnNfZnVsbF9jb3VudDsgCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0KKwkJCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZmlmb19lcnJvcnM7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJCQkJZXJyX3N0YXRzLT5zZWNfVHhfYWJvcnRfY291bnQ7CisJfQorCisgICAgICAgIC8qIG9uIHRoZSBzZWNvbmQgdGltZXIgaW50ZXJydXB0LCByZWFkIHRoZSBvcGVyYXRpb25hbCBzdGF0aXN0aWNzICovCisJZWxzZSB7CisgICAgICAgIAlpZihjaGRsY19yZWFkX29wX3N0YXRzKGNhcmQpKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMTsKKwkJb3Bfc3RhdHMgPSAoQ0hETENfT1BFUkFUSU9OQUxfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkJCShvcF9zdGF0cy0+UnhfRGF0YV9kaXNjYXJkX3Nob3J0X2NvdW50ICsKKwkJCW9wX3N0YXRzLT5SeF9EYXRhX2Rpc2NhcmRfbG9uZ19jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBwYWNrZXQuCisgKglSZXR1cm46CTAgLSBvLmsuCisgKgkJMSAtIG5vIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pCit7CisJQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICp0eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1ZjsKKworCWlmICh0eGJ1Zi0+b3BwX2ZsYWcpCisJCXJldHVybiAxOworCQorCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHR4YnVmLT5wdHJfZGF0YV9iZnIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+ZnJhbWVfbGVuZ3RoID0gbGVuOworCXR4YnVmLT5vcHBfZmxhZyA9IDE7CQkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8KKwkKKwkvKiBVcGRhdGUgdHJhbnNtaXQgYnVmZmVyIGNvbnRyb2wgZmllbGRzICovCisJY2FyZC0+dS5jLnR4YnVmID0gKyt0eGJ1ZjsKKwkKKwlpZiAoKHZvaWQqKXR4YnVmID4gY2FyZC0+dS5jLnR4YnVmX2xhc3QpCisJCWNhcmQtPnUuYy50eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1Zl9iYXNlOworCQorCXJldHVybiAwOworfQorCisvKioqKioqIEZpcm13YXJlIEVycm9yIEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaXJtd2FyZSBlcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpCit7CisJdW5zaWduZWQgY21kID0gbWItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGVycikgeworCisJY2FzZSBDTURfVElNRU9VVDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpOworCQlicmVhazsKKworCWNhc2UgUzUxNF9CT1RIX1BPUlRTX1NBTUVfQ0xLX01PREU6CisJCWlmKGNtZCA9PSBTRVRfQ0hETENfQ09ORklHVVJBVElPTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICIlczogQ29uZmlndXJlIGJvdGggcG9ydHMgZm9yIHRoZSBzYW1lIGNsb2NrIHNvdXJjZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCwgZXJyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKiBCb3R0b20gSGFsZiBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTk9URTogVGhlcmUgaXMgbm8gQVBJLCBCSCBzdXBwb3J0IGZvciBLZXJuZWxzIGxvd2VyIHRoYW4gMi4yLlguCisgKiAgICAgICBETyBOT1QgSU5TRVJUIEFOWSBDT0RFIEhFUkUsIE5PVElDRSBUSEUgCisgKiAgICAgICBQUkVQUk9DRVNTT1IgU1RBVEVNRU5UIEFCT1ZFLCBVTkxFU1MgWU9VIEtOT1cgV0hBVCBZT1UgQVJFCisgKiAgICAgICBET0lORyAqLworCitzdGF0aWMgdm9pZCBjaGRsY193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSA9PSAwKXsKKwkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSl7CisKKwkJc2tiICA9ICgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2I7CisKKwkJaWYgKHNrYiAhPSBOVUxMKXsKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5zayA9PSBOVUxMIHx8IGNoYW4tPmNvbW1vbi5mdW5jID09IE5VTEwpeworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQljaGRsY193b3JrX2NsZWFudXAoZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvciBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyeSAqLworCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5yZWNlaXZlX2Jsb2NrLDEpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCWNoZGxjX3dvcmtfY2xlYW51cChkZXYpOworCQkJfQorCQl9ZWxzZXsKKwkJCWNoZGxjX3dvcmtfY2xlYW51cChkZXYpOworCQl9CisJfQkKKwljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNoZGxjX3dvcmtfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCisJKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYiA9IE5VTEw7CisKKwlpZiAoY2hhbi0+YmhfcmVhZCA9PSBNQVhfQkhfQlVGRil7CisJCWNoYW4tPmJoX3JlYWQ9MDsKKwl9ZWxzZXsKKwkJKytjaGFuLT5iaF9yZWFkOwkKKwl9CisKKwlhdG9taWNfZGVjKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogQ2hlY2sgZm9yIGZ1bGwgKi8KKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IChNQVhfQkhfQlVGRisxKSl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAxOyAKKwl9CisKKwkoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3dyaXRlXSktPnNrYiA9IHNrYjsKKworCWlmIChjaGFuLT5iaF93cml0ZSA9PSBNQVhfQkhfQlVGRil7CisJCWNoYW4tPmJoX3dyaXRlPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+Ymhfd3JpdGU7CisJfQorCisJYXRvbWljX2luYygmY2hhbi0+YmhfYnVmZl91c2VkKTsKKworCXJldHVybiAwOworfQorCisvKiBFTkQgT0YgQVBJIEJIIFN1cHBvcnQgKi8KKworCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHdwY19pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKwlpbnQgaTsKKwlzZGxhX3QgKm15X2NhcmQ7CisKKworCS8qIENoZWNrIGZvciB3aGljaCBwb3J0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJICogU2luY2UgU2Vjb25kYXJ5IFBvcnQgaXMgcGlnZ3liYWNraW5nIG9uIHRoZSBQcmltYXJ5CisgICAgICAgICAqIHRoZSBjaGVjayBtdXN0IGJlIGRvbmUgaGVyZS4gCisJICovCisKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlpZiAoIWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkvKiBDaGVjayBmb3IgYSBzZWNvbmQgcG9ydCAocGlnZ3liYWNraW5nKSAqLworCQlpZiAoKG15X2NhcmQgPSBjYXJkLT5uZXh0KSl7CisJCQlmbGFncyA9IG15X2NhcmQtPnUuYy5mbGFnczsKKwkJCWlmIChmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKXsKKwkJCQljYXJkID0gbXlfY2FyZDsKKwkJCQljYXJkLT5pc3IoY2FyZCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJY2FyZC0+aW5faXNyID0gMTsKKwlkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQorCS8qIElmIHdlIGdldCBhbiBpbnRlcnJ1cHQgd2l0aCBubyBuZXR3b3JrIGRldmljZSwgc3RvcCB0aGUgaW50ZXJydXB0cworCSAqIGFuZCBpc3N1ZSBhbiBlcnJvciAqLworCWlmICghY2FyZC0+dHR5X29wdCAmJiAhZGV2ICYmIAorCSAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlICE9IAorCSAgICAJQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQpeworCisJCWdvdG8gaXNyX2RvbmU7CisJfQorCQorCS8qIGlmIGNyaXRpY2FsIGR1ZSB0byBwZXJpcGhlcmFsIG9wZXJhdGlvbnMKKwkgKiBpZS4gdXBkYXRlKCkgb3IgZ2V0c3RhdHMoKSB0aGVuIHJlc2V0IHRoZSBpbnRlcnJ1cHQgYW5kCisJICogd2FpdCBmb3IgdGhlIGJvYXJkIHRvIHJldHJpZ2dlci4KKwkgKi8KKwlpZih0ZXN0X2JpdChQRVJJX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJU1IgQ1JJVCBUTyBQRVJJXG4iKTsKKwkJZ290byBpc3JfZG9uZTsKKwl9CisKKwkvKiBPbiBhIDUwOCBDYXJkLCBpZiBjcml0aWNhbCBkdWUgdG8gaWZfc2VuZCAKKyAgICAgICAgICogTWFqb3IgRXJyb3IgISEhICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpIHsKKwkJaWYodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1I6ICVseFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJY2FyZC0+aW5faXNyID0gMDsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3dpdGNoKGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpIHsKKworCWNhc2UgUlhfQVBQX0lOVF9QRU5EOgkvKiAweDAxOiByZWNlaXZlIGludGVycnVwdCAqLworCQlyeF9pbnRyKGNhcmQpOworCQlicmVhazsKKworCWNhc2UgVFhfQVBQX0lOVF9QRU5EOgkvKiAweDAyOiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorCQkJIH5BUFBfSU5UX09OX1RYX0ZSQU1FOworCisJCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJCXdhbnBpcGVfdHR5X3RyaWdnZXJfcG9sbChjYXJkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRldiAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJaWYgKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKXsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCXdha2V1cF9za19iaChkZXYpOworCQkJfWVsc2V7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBDT01NQU5EX0NPTVBMRVRFX0FQUF9JTlRfUEVORDovKiAweDA0OiBjbWQgY3BsdCAqLworCQkrKyBJbnRyX3Rlc3RfY291bnRlcjsKKwkJYnJlYWs7CisKKwljYXNlIENIRExDX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgkvKiAweDIwICovCisJCXByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKGNhcmQpOworCQlicmVhazsKKworCWNhc2UgR0xPQkFMX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgorCQlwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oY2FyZCk7CisJCWJyZWFrOworCisJY2FzZSBUSU1FUl9BUFBfSU5UX1BFTkQ6CisJCXRpbWVyX2ludHIoY2FyZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNwdXJpb3VzIGludGVycnVwdCAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsCisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ29kZSBuYW1lOiAiKTsKKwkJZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVjIiwKKwkJCQlmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGVuYW1lW2ldKTsgCisJCXByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKwkgCWZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsIAorCQkJCWZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZXZlcnNpb25baV0pOyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisJCWJyZWFrOworCX0KKworaXNyX2RvbmU6CisKKwljYXJkLT5pbl9pc3IgPSAwOworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUgPSAwOworCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUNIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqcnhidWYgPSBjYXJkLT51LmMucnhtYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBhZGRyID0gcnhidWYtPnB0cl9kYXRhX2JmcjsKKwl2b2lkICpidWY7CisJaW50IGksdWRwX3R5cGU7CisKKwlpZiAocnhidWYtPm9wcF9mbGFnICE9IDB4MDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogY29ycnVwdGVkIFJ4IGJ1ZmZlciBAIDB4JVgsIGZsYWcgPSAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsICh1bnNpZ25lZClyeGJ1ZiwgcnhidWYtPm9wcF9mbGFnKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJDb2RlIG5hbWU6ICIpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZW5hbWVbaV0pOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGV2ZXJzaW9uW2ldKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisKKwkJLyogQnVnIEZpeDogTWFyIDYgMjAwMAorICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBhIGNvcnJ1cHRlZCBtYWlsYm94LCBpdCBtZWFzbiB0aGF0IGRyaXZlciAKKyAgICAgICAgICAgICAgICAgKiBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaXJtd2FyZS4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZG9uJ3QgdHVybiBvZmYgYWxsIGludGVycnVwdHMgZm9yIHRoaXMgY2FyZAorICAgICAgICAgICAgICAgICAqIHRoZSBtYWNoaW5lIHdpbGwgY3Jhc2guIAorICAgICAgICAgICAgICAgICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgcm91dGVyIGZhaWx1cmUgLi4uISEhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgIVxuIik7CisJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsJCisJCXJldHVybjsKKwl9CisKKwlsZW4gID0gcnhidWYtPmZyYW1lX2xlbmd0aDsKKworCWlmIChjYXJkLT50dHlfb3B0KXsKKworCQlpZiAocnhidWYtPmVycm9yX2ZsYWcpewkKKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCisJCWlmIChsZW4gPD0gQ1JDX0xFTkdUSCl7CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwkJCisJCWlmICghY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQkJbGVuIC09IENSQ19MRU5HVEg7CisJCX0KKworCQl3YW5waXBlX3R0eV9yZWNlaXZlKGNhcmQsYWRkcixsZW4pOworCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCWlmICghZGV2KXsKKwkJZ290byByeF9leGl0OworCX0KKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIHJ4X2V4aXQ7CisKKwljaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwkKKwkvKiBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9leGl0OworCX0KKworCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUuYy5yeF90b3AgLSBhZGRyICsgMTsKKwkJYnVmID0gc2tiX3B1dChza2IsIHRtcCk7CisJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgdG1wKTsKKwkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQlsZW4gLT0gdG1wOworCX0KKwkJCisJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCBsZW4pOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzICsrOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKwlpZih1ZHBfdHlwZSA9PSBVRFBfQ1BJUEVfVFlQRSkgeworCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fTkVUV09SSywKKyAgIAkJCQkgICAgICBjYXJkLCBza2IsIGRldiwgY2hkbGNfcHJpdl9hcmVhKSkgeworICAgICAJCSAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC4KKwkJCQkJCWludGVycnVwdF9wZXJtaXNzaW9uIHw9IAorCQkJCQkJCUFQUF9JTlRfT05fVElNRVI7IAorCQl9CisJfSBlbHNlIGlmKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKSB7CisKKwkJYXBpX3J4X2hkcl90KiBhcGlfcnhfaGRyOworICAgICAgIAkJc2tiX3B1c2goc2tiLCBzaXplb2YoYXBpX3J4X2hkcl90KSk7CisgICAgICAgICAgICAgICAgYXBpX3J4X2hkciA9IChhcGlfcnhfaGRyX3QqKSZza2ItPmRhdGFbMHgwMF07CisJCWFwaV9yeF9oZHItPmVycm9yX2ZsYWcgPSByeGJ1Zi0+ZXJyb3JfZmxhZzsKKyAgICAgCQlhcGlfcnhfaGRyLT50aW1lX3N0YW1wID0gcnhidWYtPnRpbWVfc3RhbXA7CisKKyAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoUFZDX1BST1QpOworICAgICAJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCXNrYi0+ZGV2ICAgICAgPSBkZXY7CisgICAgICAgICAgICAgICAJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfREFUQTsKKworCQliaF9lbnF1ZXVlKGRldiwgc2tiKTsKKworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwmY2hkbGNfcHJpdl9hcmVhLT50cV93b3JraW5nKSkKKwkJCXdhbnBpcGVfcXVldWVfd29yaygmY2hkbGNfcHJpdl9hcmVhLT5jb21tb24ud2FucGlwZV93b3JrKTsKKwl9ZWxzZXsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBjaGVjayB0byBzZWUgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgcGFja2V0IHNvIHRoYXQgd2UgY2FuIGluY3JlbWVudCB0aGUgbXVsdGljYXN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKysgY2hkbGNfcHJpdl9hcmVhLT5pZl9zdGF0cy5tdWx0aWNhc3Q7CisJCSovCisgICAgICAgICAgICAgICAJLyogUGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkKKyAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworICAgICAgICAgICAgICAgIG5ldGlmX3J4KHNrYik7CisgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9CisKK3J4X2V4aXQ6CisJLyogUmVsZWFzZSBidWZmZXIgZWxlbWVudCBhbmQgY2FsY3VsYXRlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUgKi8KKwlyeGJ1Zi0+b3BwX2ZsYWcgPSAweDAwOworCWNhcmQtPnUuYy5yeG1iID0gKysgcnhidWY7CisJaWYoKHZvaWQqKXJ4YnVmID4gY2FyZC0+dS5jLnJ4YnVmX2xhc3QpeworCQljYXJkLT51LmMucnhtYiA9IGNhcmQtPnUuYy5yeGJ1Zl9iYXNlOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIFRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOgorICogICAgMSkgUHJvY2Vzc2luZyB1ZHAgY2FsbHMgZnJvbSAnY3BpcGVtb24nLgorICogICAgMikgUmVhZGluZyBib2FyZC1sZXZlbCBzdGF0aXN0aWNzIGZvciB1cGRhdGluZyB0aGUgcHJvYyBmaWxlIHN5c3RlbS4KKyAqLwordm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IE5VTEw7CisgICAgICAgIFNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKworICAgICAgICBpZiAoKGRldiA9IGNhcmQtPndhbmRldi5kZXYpPT1OVUxMKXsKKwkJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgICAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkFQUF9JTlRfT05fVElNRVI7CisJCXJldHVybjsKKwl9CisJCisgICAgICAgIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRykgeworCQlpZiAoIWNvbmZpZ19jaGRsYyhjYXJkKSl7CisJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQl9CisJfQorCisJLyogcHJvY2VzcyBhIHVkcCBjYWxsIGlmIHBlbmRpbmcgKi8KKyAgICAgICAJaWYoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VRFApIHsKKyAgICAgICAgICAgICAgIAlwcm9jZXNzX3VkcF9tZ210X3BrdChjYXJkLCBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZGxjX3ByaXZfYXJlYSk7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VRFA7CisgICAgICAgIH0KKworCS8qIHJlYWQgdGhlIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MgaWYgcmVxdWlyZWQgKi8KKwlpZihjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkgeworCQl1cGRhdGVfY29tbXNfc3RhdHMoY2FyZCwgY2hkbGNfcHJpdl9hcmVhKTsKKyAgICAgICAgICAgICAgICBpZighKC0tIGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKSkgeworCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSAKKwkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwkJfQorICAgICAgICB9CisKKwkvKiBvbmx5IGRpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCBpZiB0aGVyZSBhcmUgbm8gdWRwIG9yIHN0YXRpc3RpYyAqLworCS8qIHVwZGF0ZXMgcGVuZGluZyAqLworICAgICAgICBpZighY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworICAgICAgICAgICAgICAgIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKyAgICAgICAgICAgICAgICAgICAgICAgIH5BUFBfSU5UX09OX1RJTUVSOworICAgICAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCisJLSBzZXRfY2hkbGNfY29uZmlnKCkgdXNlZCB0byBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBib2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzZXRfY2hkbGNfY29uZmlnKHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCBjZmc7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKSk7CisKKwlpZihjYXJkLT53YW5kZXYuY2xvY2tpbmcpeworCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKwl9CisJCQorCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCWNmZy5tb2RlbV9zdGF0dXNfdGltZXIJCT0gMTAwOworCisJY2ZnLkNIRExDX3Byb3RvY29sX29wdGlvbnMJPSBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9uczsKKworCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJY2ZnLkNIRExDX0FQSV9vcHRpb25zCT0gRElTQ0FSRF9SWF9FUlJPUl9GUkFNRVM7CisJfQorCQorCWNmZy5wZXJjZW50X2RhdGFfYnVmZmVyX2Zvcl9UeCAgPSAoY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgPyAwIDogNTA7CisJY2ZnLkNIRExDX3N0YXRpc3RpY3Nfb3B0aW9ucwk9IChDSERMQ19UWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCB8CisJCUNIRExDX1JYX0RBVEFfQllURV9DT1VOVF9TVEFUKTsKKwkKKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWNhcmQtPndhbmRldi5tdHUgPSBUVFlfQ0hETENfTUFYX01UVTsKKwl9CisJY2ZnLm1heF9DSERMQ19kYXRhX2ZpZWxkX2xlbmd0aAk9IGNhcmQtPndhbmRldi5tdHU7CisJY2ZnLnRyYW5zbWl0X2tlZXBhbGl2ZV90aW1lcgk9IGNhcmQtPnUuYy5rcGFsdl90eDsKKwljZmcucmVjZWl2ZV9rZWVwYWxpdmVfdGltZXIJPSBjYXJkLT51LmMua3BhbHZfcng7CisJY2ZnLmtlZXBhbGl2ZV9lcnJvcl90b2xlcmFuY2UJPSBjYXJkLT51LmMua3BhbHZfZXJyOworCWNmZy5TTEFSUF9yZXF1ZXN0X3RpbWVyCQk9IGNhcmQtPnUuYy5zbGFycF90aW1lcjsKKworCWlmIChjZmcuU0xBUlBfcmVxdWVzdF90aW1lcikgeworCQljZmcuSVBfYWRkcmVzcwkJPSAwOworCQljZmcuSVBfbmV0bWFzawkJPSAwOworCQkKKwl9ZWxzZSBpZiAoY2FyZC0+d2FuZGV2LmRldil7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCQkKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKworCQlpZihpbl9kZXYgIT0gTlVMTCkgeworCQkJc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKworCQkJaWYgKGlmYSAhPSBOVUxMICkgeworCQkJCWNmZy5JUF9hZGRyZXNzCT0gbnRvaGwoaWZhLT5pZmFfbG9jYWwpOworCQkJCWNmZy5JUF9uZXRtYXNrCT0gbnRvaGwoaWZhLT5pZmFfbWFzayk7IAorCQkJCWNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyA9IG50b2hsKGlmYS0+aWZhX2xvY2FsKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPklQX25ldG1hc2sgPSBudG9obChpZmEtPmlmYV9tYXNrKTsgCisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogV2UgbXVzdCByZS10aGluayB0aGlzIG1lc3NhZ2UgaW4gbmV4dCByZWxlYXNlCisJCWlmKChjZmcuSVBfYWRkcmVzcyAmIDB4MDAwMDAwRkYpID4gMikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG4iKTsKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICBXQVJOSU5HOiVzIGNvbmZpZ3VyZWQgd2l0aCBhblxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgaW52YWxpZCBsb2NhbCBJUCBhZGRyZXNzLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIgIFNsYXJwIHByYWdtYXRpY3Mgd2lsbCBmYWlsLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIgIElQIGFkZHJlc3Mgc2hvdWxkIGJlIG9mIHRoZVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIGZvcm1hdCBBLkIuQy4xIG9yIEEuQi5DLjIuXG4iKTsKKwkJfQorCQkqLwkJCisJfQorCQorCXJldHVybiBjaGRsY19jb25maWd1cmUoY2FyZCwgJmNmZyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc2V0X2FzeV9jb25maWcoKSB1c2VkIHRvIHNldCBhc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBib2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzZXRfYXN5X2NvbmZpZyhzZGxhX3QqIGNhcmQpCit7CisKKyAgICAgICAgQVNZX0NPTkZJR1VSQVRJT05fU1RSVUNUIGNmZzsKKyAJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1haWxib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKEFTWV9DT05GSUdVUkFUSU9OX1NUUlVDVCkpOworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKQorCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCWNmZy5hc3lfQVBJX29wdGlvbnMgCQk9IGNhcmQtPnUuYy5hcGlfb3B0aW9uczsKKwljZmcuYXN5X3Byb3RvY29sX29wdGlvbnMJPSBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9uczsKKwljZmcuVHhfYml0c19wZXJfY2hhcgkJPSBjYXJkLT51LmMudHhfYml0c19wZXJfY2hhcjsKKwljZmcuUnhfYml0c19wZXJfY2hhcgkJPSBjYXJkLT51LmMucnhfYml0c19wZXJfY2hhcjsKKwljZmcuc3RvcF9iaXRzCQkJPSBjYXJkLT51LmMuc3RvcF9iaXRzOworCWNmZy5wYXJpdHkJCQk9IGNhcmQtPnUuYy5wYXJpdHk7CisJY2ZnLmJyZWFrX3RpbWVyCQkJPSBjYXJkLT51LmMuYnJlYWtfdGltZXI7CisJY2ZnLmFzeV9SeF9pbnRlcl9jaGFyX3RpbWVyCT0gY2FyZC0+dS5jLmludGVyX2NoYXJfdGltZXI7IAorCWNmZy5hc3lfUnhfY29tcGxldGVfbGVuZ3RoCT0gY2FyZC0+dS5jLnJ4X2NvbXBsZXRlX2xlbmd0aDsgCisJY2ZnLlhPTl9jaGFyCQkJPSBjYXJkLT51LmMueG9uX2NoYXI7CisJY2ZnLlhPRkZfY2hhcgkJCT0gY2FyZC0+dS5jLnhvZmZfY2hhcjsKKwljZmcuYXN5X3N0YXRpc3RpY3Nfb3B0aW9ucwk9IChDSERMQ19UWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCB8CisJCUNIRExDX1JYX0RBVEFfQllURV9DT1VOVF9TVEFUKTsKKworCW1haWxib3gtPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQVNZX0NPTkZJR1VSQVRJT05fU1RSVUNUKTsKKwltZW1jcHkobWFpbGJveC0+ZGF0YSwgJmNmZywgbWFpbGJveC0+YnVmZmVyX2xlbmd0aCk7CisJbWFpbGJveC0+Y29tbWFuZCA9IFNFVF9BU1lfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWFpbGJveCkgPyBtYWlsYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykgCisJCWNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1haWxib3gpOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9ucy4KKyAqLworCitzdGF0aWMgaW50IGFzeV9jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKQoreworCisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gRU5BQkxFX0FTWV9DT01NVU5JQ0FUSU9OUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LICYmIGNhcmQtPndhbmRldi5kZXYpCisJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCQorCWlmICghZXJyKQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkID0gMTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBnbG9iYWwgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYm94LT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYm94LT5jb21tYW5kID0gUkVBRF9HTE9CQUxfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENNRF9USU1FT1VUICl7CisJCisJCXN3aXRjaChtYm94LT5yZXR1cm5fY29kZSkgeworICAgICAgICAgCisJICAgICAgCWNhc2UgRVhDRVBfTU9ERU1fU1RBVFVTX0NIQU5HRToKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIHN0YXR1cyBjaGFuZ2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisKKwkJCXN3aXRjaChtYm94LT5kYXRhWzBdICYgKERDRF9ISUdIIHwgQ1RTX0hJR0gpKSB7CisJCQkJY2FzZSAoRENEX0hJR0gpOgorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGhpZ2gsIENUUyBsb3dcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKENUU19ISUdIKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvdywgQ1RTIGhpZ2hcbiIsY2FyZC0+ZGV2bmFtZSk7IAorCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoKERDRF9ISUdIIHwgQ1RTX0hJR0gpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGhpZ2gsIENUUyBoaWdoXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBsb3csIENUUyBsb3dcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRVhDRVBfVFJDX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmUgdHJhY2UgZGlzYWJsZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIEVYQ0VQX0lSUV9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElSUSB0aW1lb3V0IG9jY3VycmVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOyAKKwkJCWJyZWFrOworCisJCWNhc2UgMHgxNzoKKwkJCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJCQlpZiAoY2FyZC0+dHR5ICYmIGNhcmQtPnR0eV9vcGVuKXsgCisJCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJCQkiJXM6IE1vZGVtIEhhbmd1cCBFeGNlcHRpb246IEhhbmdpbmcgVXAhXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJCXR0eV9oYW5ndXAoY2FyZC0+dHR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIElmIFRUWSBpcyBub3QgdXNlZCBqdXN0IGRyb3AgdGhyb3VnaHQgKi8KKwkJCQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogR2xvYmFsIGV4Y2VwdGlvbiAleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYm94LT5yZXR1cm5fY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBjaGRsYyBleGNlcHRpb24gY29uZGl0aW9uCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jaGRsY19leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENNRF9USU1FT1VUKSB7CisJCisJCXN3aXRjaCAoZXJyKSB7CisKKwkJY2FzZSBFWENFUF9MSU5LX0FDVElWRToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQkJdHJpZ2dlcl9jaGRsY19wb2xsKGNhcmQtPndhbmRldi5kZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MSU5LX0lOQUNUSVZFX01PREVNOgorCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl1bmNvbmZpZ3VyZV9pcChjYXJkKTsKKwkJCXRyaWdnZXJfY2hkbGNfcG9sbChjYXJkLT53YW5kZXYuZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfTElOS19JTkFDVElWRV9LUEFMVjoKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEtlZXBhbGl2ZSB0aW1lciBleHBpcmVkLlxuIiwKKwkJCQkgCQljYXJkLT5kZXZuYW1lKTsKKwkJCXVuY29uZmlndXJlX2lwKGNhcmQpOworCQkJdHJpZ2dlcl9jaGRsY19wb2xsKGNhcmQtPndhbmRldi5kZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9JUF9BRERSRVNTX0RJU0NPVkVSRUQ6CisJCQlpZiAoY29uZmlndXJlX2lwKGNhcmQpKSAKKwkJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKworCQljYXNlIEVYQ0VQX0xPT1BCQUNLX0NPTkRJVElPTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMb29wYmFjayBDb25kaXRpb24gRGV0ZWN0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIE5PX0NIRExDX0VYQ0VQX0NPTkRfVE9fUkVQT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIGV4Y2VwdGlvbnMgcmVwb3J0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uZmlndXJlIElQIGZyb20gU0xBUlAgbmVnb3RpYXRpb24KKyAqIFRoaXMgYWRkcyBkeW5hbWljIHJvdXRlcyB3aGVuIFNMQVJQIGhhcyBwcm92aWRlZCB2YWxpZCBhZGRyZXNzZXMKKyAqLworCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworICAgICAgICBjaGFyIGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkKKwkKKyAgICAgICAgLyogc2V0IHRvIGRpc2NvdmVyICovCisgICAgICAgIGlmKGNhcmQtPnUuYy5zbGFycF90aW1lciAhPSAweDAwKSB7CisJCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJCUNIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICpjZmc7CisKKyAgICAgCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOworCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCisJCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQljZmcgPSAoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MgPSBjZmctPklQX2FkZHJlc3M7CisgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhLT5JUF9uZXRtYXNrID0gY2ZnLT5JUF9uZXRtYXNrOworCisJCS8qIFNldCBmbGFnIHRvIGFkZCByb3V0ZSAqLworCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IEFERF9ST1VURTsKKworCQkvKiBUaGUgaWRlYSBoZXJlIGlzIHRvIGFkZCB0aGUgcm91dGUgaW4gdGhlIHBvbGwgcm91dGluZS4KKwkgICAJVGhpcyB3YXksIHdlIGFyZW4ndCBpbiBpbnRlcnJ1cHQgY29udGV4dCB3aGVuIGFkZGluZyByb3V0ZXMgKi8KKwkJdHJpZ2dlcl9jaGRsY19wb2xsKGRldik7CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW4tQ29uZmlndXJlIElQIG5lZ290aWF0ZWQgYnkgU0xBUlAKKyAqIFRoaXMgcmVtb3ZlcyBkeW5hbWljIHJvdXRlcyB3aGVuIHRoZSBsaW5rIGJlY29tZXMgaW5hY3RpdmUuCisgKi8KKworc3RhdGljIGludCB1bmNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwljaGRsY19wcml2X2FyZWE9IGRldi0+cHJpdjsKKwkKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPT0gUk9VVEVfQURERUQpIHsKKworCQkvKiBOb3RlOiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIAorICAgICAgICAgICAgICAgICAqIHBvcnQgc3RhdGUgaGFzIGJlZW4gRElTQ09OTkVDVEVELiAgVGhpcyBzdGF0ZQorICAgICAgICAgICAgICAgICAqIGNoYW5nZSB3aWxsIHRyaWdnZXIgYSBwb2xsX2Rpc2Nvbm5lY3RlZCAKKyAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbiwgdGhhdCB3aWxsIGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbi4gCisJCSAqLworCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IFJFTU9WRV9ST1VURTsKKworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lIHRvIGFkZC9yZW1vdmUgcm91dGVzIAorICogQ2FsbGVkIGxpa2UgYSBwb2xsaW5nIHJvdXRpbmUgd2hlbiBSb3V0ZXMgYXJlIGZsYWdnZWQgdG8gYmUgYWRkZWQvcmVtb3ZlZC4KKyAqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlIChzZGxhX3QgKmNhcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworICAgICAgICB1bnNpZ25lZCBjaGFyIHBvcnRfbnVtOworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gTlVMTDsKKwl1MzIgbG9jYWxfSVBfYWRkciA9IDA7CisJdTMyIHJlbW90ZV9JUF9hZGRyID0gMDsKKwl1MzIgSVBfbmV0bWFzaywgSVBfYWRkcjsKKyAgICAgICAgaW50IGVyciA9IDA7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCW1tX3NlZ21lbnRfdCBmczsKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICppZl9kYXRhMSwgKmlmX2RhdGEyOworCQorICAgICAgICBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisgICAgICAgIHBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIEJ1ZyBGaXggTWFyIDE2IDIwMDAKKwkgKiBBTkQgdGhlIElQIGFkZHJlc3MgdG8gdGhlIE1hc2sgYmVmb3JlIGNoZWNraW5nCisgICAgICAgICAqIHRoZSBsYXN0IHR3byBiaXRzLiAqLworCisJaWYoKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IEFERF9ST1VURSkgJiYKKwkJKChjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MgJiB+Y2hkbGNfcHJpdl9hcmVhLT5JUF9uZXRtYXNrKSA+IDIpKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgZmFpbHVyZS5cbiIsY2FyZC0+ZGV2bmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZihjYXJkLT51LmMuc2xhcnBfdGltZXIpIHsKKwkJCXUzMiBhZGRyX25ldCA9IGh0b25sKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCYWQgSVAgYWRkcmVzcyAldS4ldS4ldS4ldSByZWNlaXZlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLAorCQkJICAgICAgIE5JUFFVQUQoYWRkcl9uZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmcm9tIHJlbW90ZSBzdGF0aW9uLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKworICAgICAgICAgICAgICAgIH1lbHNleyAKKwkJCXUzMiBhZGRyX25ldCA9IGh0b25sKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBCYWQgSVAgYWRkcmVzcyAldS4ldS4ldS4ldSBpc3N1ZWRcbiIsCisJCQkgICAgICAgY2FyZC0+ZGV2bmFtZSwKKwkJCSAgICAgICBOSVBRVUFEKGFkZHJfbmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogdG8gcmVtb3RlIHN0YXRpb24uIExvY2FsXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElQIGFkZHJlc3MgbXVzdCBiZSBBLkIuQy4xXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG9yIEEuQi5DLjIuXG4iLGNhcmQtPmRldm5hbWUpOworCQl9CisKKwkJLyogcmVtb3ZlIHRoZSByb3V0ZSBkdWUgdG8gdGhlIElQIGFkZHJlc3MgZXJyb3IgY29uZGl0aW9uICovCisJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID0gUkVNT1ZFX1JPVVRFOworCQllcnIgPSAxOworICAgCX0KKworCS8qIElmIHdlIGFyZSByZW1vdmluZyBhIHJvdXRlIHdpdGggYmFkIElQIGFkZHJlc3NpbmcsIHRoZW4gdXNlIHRoZSAqLworCS8qIGxvY2FsbHkgY29uZmlndXJlZCBJUCBhZGRyZXNzZXMgKi8KKyAgICAgICAgaWYoKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IFJFTU9WRV9ST1VURSkgJiYgZXJyKSB7CisKKyAJICAgICAgICAvKiBkbyBub3QgcmVtb3ZlIGEgYmFkIHJvdXRlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkICovCisgICAgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnJvdXRlX3JlbW92ZWQpIHsKKwkgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKyAgICAgICAgICAgICAgICBpZihpbl9kZXYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfSVBfYWRkciA9IGlmYS0+aWZhX2xvY2FsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9uZXRtYXNrICA9IGlmYS0+aWZhX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCX1lbHNleyAKKyAgICAgICAJCS8qIEFjY29yZGluZyB0byBDaXNjbyBIRExDLCBpZiB0aGUgcG9pbnQtdG8tcG9pbnQgYWRkcmVzcyBpcworCQkgICBBLkIuQy4xLCB0aGVuIHdlIGFyZSB0aGUgb3Bwb3NpdGUgKEEuQi5DLjIpLCBhbmQgdmljZS12ZXJzYS4KKwkJKi8KKwkJSVBfbmV0bWFzayA9IG50b2hsKGNoZGxjX3ByaXZfYXJlYS0+SVBfbmV0bWFzayk7CisJICAgICAgICByZW1vdGVfSVBfYWRkciA9IG50b2hsKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisJCisKKwkJLyogSWYgTmV0bWFzayBpcyAyNTUuMjU1LjI1NS4yNTUgdGhlIGxvY2FsIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgKiBjYWxjdWxhdGlvbiB3aWxsIGZhaWwuIERlZmF1bHQgaXQgYmFjayB0byAyNTUuMjU1LjI1NS4wICovCisJCWlmIChJUF9uZXRtYXNrID09IDB4ZmZmZmZmZmYpCisJCQlJUF9uZXRtYXNrICY9IDB4MDBmZmZmZmY7CisKKwkJLyogQnVnIEZpeCBNYXIgMTYgMjAwMAorCQkgKiBBTkQgdGhlIFJlbW90ZSBJUCBhZGRyZXNzIHdpdGggSVAgbmV0bWFzaywgaW5zdGVhZAorICAgICAgICAgICAgICAgICAqIG9mIHN0YXRpYyBuZXRtYXNrIG9mIDI1NS4yNTUuMjU1LjAgKi8KKyAgICAgICAgCWxvY2FsX0lQX2FkZHIgPSAocmVtb3RlX0lQX2FkZHIgJiBJUF9uZXRtYXNrKSArCisgICAgICAgICAgICAgICAgCSh+cmVtb3RlX0lQX2FkZHIgJiBudG9obCgweDAwMDMpKTsKKworCSAgICAgICAgaWYoIWNhcmQtPnUuYy5zbGFycF90aW1lcikgeworCQkJSVBfYWRkciA9IGxvY2FsX0lQX2FkZHI7CisJCQlsb2NhbF9JUF9hZGRyID0gcmVtb3RlX0lQX2FkZHI7CisJCQlyZW1vdGVfSVBfYWRkciA9IElQX2FkZHI7CisgICAgICAgCQl9CisJfQorCisgICAgICAgIGZzID0gZ2V0X2ZzKCk7ICAgICAgICAgICAgICAgICAgLyogU2F2ZSBmaWxlIHN5c3RlbSAgKi8KKyAgICAgICAgc2V0X2ZzKGdldF9kcygpKTsgICAgICAgICAgICAgICAvKiBHZXQgdXNlciBzcGFjZSBibG9jayAqLworCisgICAgICAgIC8qIFNldHVwIGEgc3RydWN0dXJlIGZvciBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzICovCisgICAgICAgIG1lbXNldCgmaWZfaW5mbywgMCwgc2l6ZW9mKGlmX2luZm8pKTsKKyAgICAgICAgc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKwlzd2l0Y2ggKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzKSB7CisKKwljYXNlIEFERF9ST1VURToKKworCQlpZighY2FyZC0+dS5jLnNsYXJwX3RpbWVyKSB7CisJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSByZW1vdGVfSVBfYWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkRTVEFERFIsICZpZl9pbmZvKTsKKwkJfSBlbHNlIHsgCisJCQlpZl9kYXRhMSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfYWRkcjsKKwkJCWlmX2RhdGExLT5zaW5fYWRkci5zX2FkZHIgPSBsb2NhbF9JUF9hZGRyOworCQkJaWZfZGF0YTEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJaWYoIShlcnIgPSBkZXZpbmV0X2lvY3RsKFNJT0NTSUZBRERSLCAmaWZfaW5mbykpKXsKKwkJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCQlpZl9kYXRhMi0+c2luX2FkZHIuc19hZGRyID0gcmVtb3RlX0lQX2FkZHI7CisJCQkJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkRTVEFERFIsICZpZl9pbmZvKTsKKwkJCX0KKwkJfQorCisgICAgICAgICAgICAgICBpZihlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGQgcm91dGUgJXUuJXUuJXUuJXUgZmFpbGVkICglZClcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQocmVtb3RlX0lQX2FkZHIpLCBlcnIpOworCQl9IGVsc2UgeworCQkJKChjaGRsY19wcml2YXRlX2FyZWFfdCAqKWRldi0+cHJpdiktPnJvdXRlX3N0YXR1cyA9IFJPVVRFX0FEREVEOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgYWRkZWQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgIExvY2FsIElQIGFkZHIgOiAldS4ldS4ldS4ldVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGxvY2FsX0lQX2FkZHIpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICBSZW1vdGUgSVAgYWRkcjogJXUuJXUuJXUuJXVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChyZW1vdGVfSVBfYWRkcikpOworCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkID0gMDsKKwkJfQorCQlicmVhazsKKworCisJY2FzZSBSRU1PVkVfUk9VVEU6CisJCisJCS8qIENoYW5nZSB0aGUgbG9jYWwgaXAgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIHRvIDAuCisJCSAqIFRoaXMgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcm91dGUuCisJCSAqLworCQlpZighY2FyZC0+dS5jLnNsYXJwX3RpbWVyKSB7CisJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCQkJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJZXJyID0gZGV2aW5ldF9pb2N0bChTSU9DU0lGRFNUQUREUiwgJmlmX2luZm8pOworCQl9IGVsc2UgeworCQkJaWZfZGF0YTEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2FkZHI7CisJCQlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkJCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkFERFIsJmlmX2luZm8pOworCQkKKwkJfQorCQlpZihlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IFJlbW92ZSByb3V0ZSAldS4ldS4ldS4ldSBmYWlsZWQsIChlcnIgJWQpXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKHJlbW90ZV9JUF9hZGRyKSwKKwkJCQkJZXJyKTsKKwkJfSBlbHNlIHsKKwkJCSgoY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKilkZXYtPnByaXYpLT5yb3V0ZV9zdGF0dXMgPQorCQkJCU5PX1JPVVRFOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgcmVtb3ZlZDogJXUuJXUuJXUuJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChsb2NhbF9JUF9hZGRyKSk7IAorCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkID0gMTsKKwkJfQorCQlicmVhazsKKwl9CisKKyAgICAgICAgc2V0X2ZzKGZzKTsgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGZpbGUgc3lzdGVtICovCisKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdG9yZSBhIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgaW50IHN0b3JlX3VkcF9tZ210X3BrdChjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKwlpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCisJaWYoIWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoICYmCisJICAoc2tiLT5sZW4gPD0gTUFYX0xHVEhfVURQX01HTlRfUEtUKSkgeworICAgICAgICAJY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggPSBza2ItPmxlbjsKKwkJY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgIAkJbWVtY3B5KGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VRFA7CisJCXVkcF9wa3Rfc3RvcmVkID0gMTsKKwl9CisKKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisJCQorCXJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgbWFuYWdlbWVudCBwYWNrZXQuCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzLCBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2xlbmd0aCwgcmVhbF9sZW47CisJdW5zaWduZWQgbG9uZyBkYXRhX3B0cjsKKwl1bnNpZ25lZCBkYXRhX2xlbmd0aDsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIgPSBjYXJkLT5tYm94OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWNoZGxjX3VkcF9wa3RfdCAqY2hkbGNfdWRwX3BrdDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyOworCWNoYXIgdXRfY2hhcjsKKworCWNoZGxjX3VkcF9wa3QgPSAoY2hkbGNfdWRwX3BrdF90ICopIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhOworCisJaWYoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKXsKKworCQkvKiBPbmx5IHRoZXNlIGNvbW1hbmRzIGFyZSBzdXBwb3J0IGZvciByZW1vdGUgZGVidWdnaW5nLgorCQkgKiBBbGwgb3RoZXJzIGFyZSBub3QgKi8KKwkJc3dpdGNoKGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisKKwkJCWNhc2UgUkVBRF9HTE9CQUxfU1RBVElTVElDUzoKKwkJCWNhc2UgUkVBRF9NT0RFTV9TVEFUVVM6ICAKKwkJCWNhc2UgUkVBRF9DSERMQ19MSU5LX1NUQVRVUzoKKwkJCWNhc2UgQ1BJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIFJFQURfQ09NTVNfRVJST1JfU1RBVFM6CisJCQljYXNlIFJFQURfQ0hETENfT1BFUkFUSU9OQUxfU1RBVFM6CisKKwkJCS8qIFRoZXNlIHR3byBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgZm9yCisJCQkgKiBlYWNoIHJlcXVlc3QgKi8KKwkJCWNhc2UgUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOgorCQkJY2FzZSBSRUFEX0NIRExDX0NPREVfVkVSU0lPTjoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQl9IAorCX0KKwkKKyAgCWlmKCF1ZHBfbWdtdF9yZXFfdmFsaWQpIHsKKworCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGggPSAwOworCisgICAgCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMHhDRDsKKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsJCisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBXYXJuaW5nLCBJbGxlZ2FsIFVEUCBjb21tYW5kIGF0dGVtcHRlZCBmcm9tIG5ldHdvcms6ICV4XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCk7CisJCX0KKworICAgCX0gZWxzZSB7CisJICAgCXVuc2lnbmVkIGxvbmcgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyID0gMDsKKwkJVFJBQ0VfU1RBVFVTX0VMX0NGR19TVFJVQ1QgdHJhY2VfY2ZnX3N0cnVjdDsKKwkJVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUIHRyYWNlX2VsZW1lbnRfc3RydWN0OworCisJCXN3aXRjaChjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCWNhc2UgQ1BJUEVfRU5BQkxFX1RSQUNJTkc6CisJCSAgICAgaWYgKCFjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QpOworCQkJbWItPmNvbW1hbmQgPSBTRVRfVFJBQ0VfQ09ORklHVVJBVElPTjsKKworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9BQ1RJVkU7CisJCQkvKiBUcmFjZSBkZWxheSBtb2RlIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQgc2xvd3MKKwkJCSAgIGRvd24gdHJhbnNmZXIgYW5kIHJlc3VsdHMgaW4gYSBzdGFuZG9mZiBzaXR1YXRpb24KKwkJCSAgIHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgZGF0YSAqLworCisJCQkvKiBDb25maWd1cmUgdGhlIFRyYWNlIGJhc2VkIG9uIHVzZXIgaW5wdXRzICovCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+dHJhY2VfY29uZmlnIHw9IAorCQkJCQljaGRsY191ZHBfcGt0LT5kYXRhWzBdOworCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkgICB0cmFjZV9kZWFjdGl2YXRpb25fdGltZXIgPSA0MDAwOworCisKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gZXJyOworCQkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCQlicmVhazsKKwkgICAgCQl9IAorCisJCQkvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdHJhY2UgZWxlbWVudCBsaXN0ICovCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfVFJBQ0VfQ09ORklHVVJBVElPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCQkJaWYgKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCQkJCWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAJCisKKwkgICAJCXRyYWNlX3N0YXR1c19jZmdfYWRkciA9KChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKikKKwkJCQltYi0+ZGF0YSkgLT4gcHRyX3RyYWNlX3N0YXRfZWxfY2ZnX3N0cnVjdDsKKworCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyLAorCQkJCSAmdHJhY2VfY2ZnX3N0cnVjdCwgc2l6ZW9mKHRyYWNlX2NmZ19zdHJ1Y3QpKTsKKwkJICAgIAorCQkJY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyID0gdHJhY2VfY2ZnX3N0cnVjdC4KKwkJCQliYXNlX2FkZHJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm51bWJlcl90cmFjZV9zdGF0dXNfZWxlbWVudHM7CisKKwkJCWNoZGxjX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJKChUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QgKikKKwkJCQkJIGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciArIAorCQkJCQkgKGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzIC0gMSkpOworCisJCQljaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF9hZGRyX3RyYWNlX2J1ZmZlciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0LmVuZF9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkgICAgCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QubmV4dF90cmFjZV9lbGVtZW50X3RvX3VzZTsKKworCSAgICAJCWNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSA9IDIwMDAgLSAKKwkJCQkJCQkJICBzaXplb2YoaXBfcGt0X3QpIC0KKwkJCQkJCQkJICBzaXplb2YodWRwX3BrdF90KSAtCisJCQkJCQkJICAgICAgCSAgc2l6ZW9mKHdwX21nbXRfdCkgLQorCQkJCQkJCQkgIHNpemVvZihjYmxvY2tfdCkgLQorCQkJCQkJCSAgICAgICAgICBzaXplb2YodHJhY2VfaW5mb190KTsJCisJICAgICAgIAkgICAgIH0KKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkgICAgICAgCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJICAgICAgIAkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfRElTQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmIChjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisgICAgCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJCXRyYWNlX2NvbmZpZyA9IFRSQUNFX0lOQUNUSVZFOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkgICAgIH0JCQorCisJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCSAgICAgYnJlYWs7CisJICAgCisKKwkJY2FzZSBDUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMTsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCWJyZWFrOworCQkgICAgIH0KKworICAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMDsKKwkJICAgICBidWZmZXJfbGVuZ3RoID0gMDsJLyogb2Zmc2V0IG9mIHBhY2tldCBhbHJlYWR5IG9jY3VwaWVkICovCisKKwkJICAgICBmb3IgKGZyYW1lcz0wOyBmcmFtZXMgPCBjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50czsgZnJhbWVzKyspeworCisJCQl0cmFjZV9wa3RfdCAqdHJhY2VfcGt0ID0gKHRyYWNlX3BrdF90ICopCisJCQkJJmNoZGxjX3VkcF9wa3QtPmRhdGFbYnVmZmVyX2xlbmd0aF07CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyLAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKikmdHJhY2VfZWxlbWVudF9zdHJ1Y3QsCisJCQkgICAJICBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKSk7CisKKyAgICAgCQkJaWYgKHRyYWNlX2VsZW1lbnRfc3RydWN0Lm9wcF9mbGFnID09IDB4MDApIHsKKwkJCSAJYnJlYWs7CisJCQl9CisKKwkJCS8qIGdldCBwb2ludGVyIHRvIHJlYWwgZGF0YSAqLworCQkJZGF0YV9wdHIgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC5wdHJfZGF0YV9iZnI7CisKKwkJCS8qIFNlZSBpZiB0aGVyZSBpcyBhY3R1YWwgZGF0YSBvbiB0aGUgdHJhY2UgYnVmZmVyICovCisJCQlpZiAoZGF0YV9wdHIpeworCQkJCWRhdGFfbGVuZ3RoID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCQkJfWVsc2V7CisJCQkJZGF0YV9sZW5ndGggPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJCQl9CisJCisgICAJCQlpZiggKGNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSAtIGJ1ZmZlcl9sZW5ndGgpCisJCQkJPCAoIHNpemVvZih0cmFjZV9wa3RfdCkgKyBkYXRhX2xlbmd0aCkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgb24gYm9hcmQgJiBleGl0ICovCisJCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQl0cmFjZV9wa3QtPnN0YXR1cyA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3R5cGU7CisKKwkJCXRyYWNlX3BrdC0+dGltZV9zdGFtcCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfdGltZV9zdGFtcDsKKworCQkJdHJhY2VfcGt0LT5yZWFsX2xlbmd0aCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCisJCQkvKiBzZWUgaWYgd2UgY2FuIGZpdCB0aGUgZnJhbWUgaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCXJlYWxfbGVuID0gdHJhY2VfcGt0LT5yZWFsX2xlbmd0aDsKKworCQkJaWYgKGRhdGFfcHRyID09IDApIHsKKwkJCSAgICAgCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDA7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIHRtcCA9IDA7CisKKwkJCQkvKiBnZXQgdGhlIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIKKwkJCQkgICAgbXVzdCBjaGVjayBmb3IgZW5kIG9mIGJ1ZmZlciAqLworCQkJICAgICAgICB0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAxOworCisJCQkJaWYgKChkYXRhX3B0ciArIHJlYWxfbGVuKSA+CisJCQkJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgKyAxKXsKKworCQkJCSAgICAJdG1wID0gY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgLSBkYXRhX3B0ciArIDE7CisJCQkJICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAgICAgIAkgIHRyYWNlX3BrdC0+ZGF0YSx0bXApOworCQkJCSAgICAJZGF0YV9wdHIgPSBjaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJCQkJfQorCQorCQkgICAgICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAmdHJhY2VfcGt0LT5kYXRhW3RtcF0sIHJlYWxfbGVuIC0gdG1wKTsKKwkJCX0JCisKKwkJCS8qIHplcm8gdGhlIG9wcCBmbGFnIHRvIHNob3cgd2UgZ290IHRoZSBmcmFtZSAqLworCQkJdXRfY2hhciA9IDB4MDA7CisJCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgJnV0X2NoYXIsIDEpOworCisgICAgICAgCQkJLyogbm93IG1vdmUgb250byB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgIAkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyICs9IHNpemVvZihUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QpOworCisgICAgICAgCQkJLyogY2hlY2sgaWYgd2Ugd2VudCBvdmVyIHRoZSBsYXN0IGFkZHJlc3MgKi8KKwkJCWlmICggY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIgPiBjaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyICkgeworCQkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyOworICAgICAgIAkJCX0KKworICAgICAgICAgICAgCQlpZih0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPT0gMHgwMSkgeworCQkJCWJ1ZmZlcl9sZW5ndGggKz0gcmVhbF9sZW4gLSAxOworCQkJfQorCSAKKwkgICAgICAgCSAgICAJLyogZm9yIHRoZSBoZWFkZXIgKi8KKwkgICAgICAgICAgICAJYnVmZmVyX2xlbmd0aCArPSBzaXplb2YodHJhY2VfcGt0X3QpOworCisJCSAgICAgfSAgLyogRm9yIExvb3AgKi8KKworCQkgICAgIGlmIChmcmFtZXMgPT0gY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMpeworCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKwkgICAgICAgICAgICAgfQorIAkJICAgICBjaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLm51bV9mcmFtZXMgPSBmcmFtZXM7CisJCSAKKyAgICAJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsgCisJCSAKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOyAKKwkJICAgICAKKwkJICAgICBicmVhazsKKworCisJCWNhc2UgQ1BJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzBdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQV9pbnB1dDsKKworCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzFdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQl9pbnB1dDsKKwkJCQkKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IDI7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWUgPSB0di50dl9zZWMgLSAKKwkJCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZTsKKwkJCSoodW5zaWduZWQgbG9uZyAqKSZjaGRsY191ZHBfcGt0LT5kYXRhID0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWU7CQorCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCQlicmVhazsKKworICAgCQljYXNlIEZUMV9NT05JVE9SX1NUQVRVU19DVFJMOgorCQkJLyogRW5hYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgICAgCWlmICgoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9TVEFUVVMpIHx8ICAKKwkJCQkoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9PUF9TVEFUUykpIHsKKwkJCQorCQkJICAgICAJaWYoIHJDb3VudCsrICE9IDAgKSB7CisJCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJCSAgICAJICAgICAJfQorCSAgICAgIAkJfQorCisJICAgICAgCQkvKiBEaXNhYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgIAkJaWYoIGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gPT0gMCkgeworCisJICAgICAgCSAgIAkgICAgIAlpZiggLS1yQ291bnQgIT0gMCkgeworCQkgIAkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJICAgCSAgICAJICAgICAJfSAKKwkgICAgICAJCX0gCQorCQkJZ290byBkZmx0XzE7CisKKwkJZGVmYXVsdDoKK2RmbHRfMToKKwkJCS8qIGl0J3MgYSBib2FyZCBjb21tYW5kICovCisJCQltYi0+Y29tbWFuZCA9IGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aDsKKwkJCWlmIChtYi0+YnVmZmVyX2xlbmd0aCkgeworCQkJCW1lbWNweSgmbWItPmRhdGEsICh1bnNpZ25lZCBjaGFyICopIGNoZGxjX3VkcF9wa3QtPgorCQkJCQkJCWRhdGEsIG1iLT5idWZmZXJfbGVuZ3RoKTsKKwkgICAgICAJCX0gCisJCQkvKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIGJvYXJkICovCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCSAgICAgICAgIAltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmNibG9jaywgbWIsIHNpemVvZihjYmxvY2tfdCkpOyAKKwkJCQorCQkJaWYgKG1iLT5idWZmZXJfbGVuZ3RoKSB7CisJICAgICAgICAgCQltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmRhdGEsICZtYi0+ZGF0YSwgCisJCQkJCQkJCW1iLT5idWZmZXJfbGVuZ3RoKTsgCisJICAgICAgCQl9CisKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisgICAgIAl9IC8qIGVuZCBvZiBlbHNlICovCisKKyAgICAgCS8qIEZpbGwgVURQIFRUTCAqLworCWNoZGxjX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOyAKKworICAgICAJbGVuID0gcmVwbHlfdWRwKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBtYi0+YnVmZmVyX2xlbmd0aCk7CisJCisKKyAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSyl7CisKKwkJLyogTXVzdCBjaGVjayBpZiB3ZSBpbnRlcnJ1cHRlZCBpZl9zZW5kKCkgcm91dGluZS4gVGhlCisJCSAqIHR4IGJ1ZmZlcnMgbWlnaHQgYmUgdXNlZC4gSWYgc28gZHJvcCB0aGUgcGFja2V0ICovCisJICAgCWlmICghdGVzdF9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQorCQkJaWYoIWNoZGxjX3NlbmQoY2FyZCwgY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbikpIHsKKwkJCQkrKyBjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKwkJCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQkJfQorCQl9CisJfSBlbHNlIHsJCisJCisJCS8qIFBhc3MgaXQgdXAgdGhlIHN0YWNrCisgICAgCQkgICBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCWlmICgobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCisgCSAgICAJCWJ1ZiA9IHNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKyAgCSAgICAJCW1lbWNweShidWYsIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBsZW4pOworCisgICAgICAgICAgICAJCS8qIERlY2Fwc3VsYXRlIHBrdCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkgICAgCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgICAgIAkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCSAgICAJCW5ld19za2ItPm1hYy5yYXcgID0gbmV3X3NrYi0+ZGF0YTsKKwkKKwkJCW5ldGlmX3J4KG5ld19za2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkgICAgCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworICAJCX0KKyAgICAJfQorIAorCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gMDsKKyAJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBSZWNlaXZlIGFuZCBUcmFuc21pdCBCdWZmZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGluaXRfY2hkbGNfdHhfcnhfYnVmZiggc2RsYV90KiBjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKnR4X2NvbmZpZzsKKwlDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqcnhfY29uZmlnOworCWNoYXIgZXJyOworCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQlpZiAoY2FyZC0+d2FuZGV2LmRldil7CisJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCXR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworICAgICAgICAJcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfQ0hETENfUnhfc3RhdF9lbF9jZmdfc3RydWN0KSk7CisKKyAgICAgICAJCS8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgIAljYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyk7CisgICAgICAgIAljYXJkLT51LmMudHhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopICAKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSArCisJCSh0eF9jb25maWctPm51bWJlcl9UeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgKworCQkocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAJCS8qIFNldCB1cCBuZXh0IHBvaW50ZXIgdG8gYmUgdXNlZCAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgdHhfY29uZmlnLT5uZXh0X1R4X3N0YXR1c19lbGVtZW50X3RvX3VzZSk7CisgICAgICAgIAljYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworCX0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHhfY29uZmlnID0gKENIRExDX1RYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgLyogU2V0dXAgSGVhZCBhbmQgVGFpbHMgZm9yIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkodHhfY29uZmlnLT5iYXNlX2FkZHJfVHhfc3RhdHVzX2VsZW1lbnRzICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnR4YnVmX2Jhc2UKKwkJKyAodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0gCisJCShDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKiljYXJkLT51LmMucnhidWZfYmFzZQorCQkrIChyeF9jb25maWctPm51bWJlcl9SeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWYgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkocnhfY29uZmlnLT5uZXh0X1J4X3N0YXR1c19lbGVtZW50X3RvX3VzZSAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0dXAgQWN0dWFsIEJ1ZmZlciBTdGFydCBhbmQgZW5kIGFkZHJlc3NlcyAqLworICAgICAgICBjYXJkLT51LmMucnhfYmFzZSA9IHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X2J1ZmZlcjsKKyAgICAgICAgY2FyZC0+dS5jLnJ4X3RvcCAgPSByeF9jb25maWctPmVuZF9hZGRyX1J4X2J1ZmZlcjsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQZXJmb3JtIEludGVycnVwdCBUZXN0IGJ5IHJ1bm5pbmcgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUgorICogX1RFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworCUludHJfdGVzdF9jb3VudGVyID0gMDsKKwkKKwllcnIgPSBjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fQ09NTUFORF9DT01QTEVURSk7CisKKwlpZiAoZXJyID09IENNRF9PSykgeyAKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUjsgaSArKykgewkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoICA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDTURfT0spIAorCQkJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCQl9CisJfQorCWVsc2UgeworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gQ1BJUEVBQiA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCkKK3sKKwkgY2hkbGNfdWRwX3BrdF90ICpjaGRsY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworI2lmZGVmIF9XQU5fVURQX0RFQlVHCisJCXByaW50ayhLRVJOX0lORk8gIlNJRyAlcyA9ICVzXG5cCisJCQkJICBVUFAgJXggPSAleFxuXAorCQkJCSAgUFJUICV4ID0gJXhcblwKKwkJCQkgIFJFUSAlaSA9ICVpXG5cCisJCQkJICAzNiB0aCA9ICV4IDM3dGggPSAleFxuIiwKKwkJCQkgIGNoZGxjX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorCQkJCSAgVURQTUdNVF9TSUdOQVRVUkUsCisJCQkJICBjaGRsY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCwKKwkJCQkgIG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCksCisJCQkJICBjaGRsY191ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wsCisJCQkJICBVRFBNR01UX1VEUF9QUk9UT0NPTCwKKwkJCQkgIGNoZGxjX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSwKKwkJCQkgIFVEUE1HTVRfUkVRVUVTVCwKKwkJCQkgIHNrYi0+ZGF0YVszNl0sIHNrYi0+ZGF0YVszN10pOworI2VuZGlmCQorCQkKKwlpZiAoIXN0cm5jbXAoY2hkbGNfdWRwX3BrdC0+d3BfbWdtdC5zaWduYXR1cmUsVURQTUdNVF9TSUdOQVRVUkUsOCkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPT0gbnRvaHMoY2FyZC0+d2FuZGV2LnVkcF9wb3J0KSkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+aXBfcGt0LnByb3RvY29sID09IFVEUE1HTVRfVURQX1BST1RPQ09MKSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT53cF9tZ210LnJlcXVlc3RfcmVwbHkgPT0gVURQTUdNVF9SRVFVRVNUKSkgeworCisJCXJldHVybiBVRFBfQ1BJUEVfVFlQRTsKKworCX1lbHNleyAKKwkJcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBQT1JUIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQgc3RhdGUpCit7CisgICAgICAgIGlmIChjYXJkLT51LmMuc3RhdGUgIT0gc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdBTl9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY29ubmVjdGVkIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBjb25uZWN0aW5nLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIGRpc2Nvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FyZC0+d2FuZGV2LnN0YXRlID0gY2FyZC0+dS5jLnN0YXRlID0gc3RhdGU7CisJCWlmIChjYXJkLT53YW5kZXYuZGV2KXsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisJCX0KKyAgICAgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX2NoZGxjCisgKgorICoJQ29uZmlndXJlIHRoZSBjaGRsYyBwcm90b2NvbCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgkJCisgKgorICogICAJVGhlIGlmX29wZW4oKSBmdW5jdGlvbiBiaW5kcyB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBwb2xsIHJvdXRpbmUuCisgKiAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJ1biBldmVyeSB0aW1lIHRoZSBjaGRsYyBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gV2UgY2Fubm90IHJ1biB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGlmX29wZW4gCisgKiAgICAgIGJlY2F1c2UgaWZfb3BlbiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcmVtb3RlIElQIGFkZHJlc3MuCisgKiAgICAgIAorICoJSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBub3QgZW5hYmxlZCwgcHJvY2VlZCB0byBjb25maWd1cmUKKyAqICAgICAgdGhlIGNhcmQgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiAgICAgIElmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgZW5hYmxlZCwgaXQgbWVhbnMgdGhhdCB0aGUgaW50ZXJmYWNlCisgKiAgICAgIHdhcyBzaHV0ZG93biBieSBldGhlciB0aGUgdXNlciBvciBkcml2ZXIuIEluIHRoaXMgY2FzZSwgd2UgCisgKiAgICAgIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgbm90IGNoYW5nZWQuICBJZgorICogICAgICB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgZmlybXdhcmUKKyAqICAgICAgYW5kIHVwZGF0ZSB0aGUgY2hhbmdlZCBJUCBhZGRyZXNzZXMuICBPdGhlcndpc2UsIGp1c3QgZXhpdC4KKyAqCisgKi8KKworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpeworCisJCS8qIEp1biAyMC4gMjAwMDogTkMKKwkJICogSVAgYWRkcmVzc2VzIGFyZSBub3QgdXNlZCBpbiB0aGUgQVBJIG1vZGUgKi8KKwkJCisJCWlmICgoY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXAgIT0gY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbCB8fAorCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+aXBfcmVtb3RlX3RtcCAhPSBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZSkgJiYgCisJCSAgICAgY2FyZC0+dS5jLnVzZWRieSA9PSBXQU5QSVBFKSB7CisJCQkKKwkJCS8qIFRoZSBJUCBhZGRlcnNzZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIHRoZSBjb21tdW5pY2F0aW9ucyBhbmQgcmVjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjYXJkLiBSZWFzb246IHRoZSBmaXJtd2FyZSBtdXN0IGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2NhbCBhbmQgcmVtb3RlIElQIGFkZHJlc3Nlcy4gKi8KKwkJCWRpc2FibGVfY29tbShjYXJkKTsKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IElQIGFkZHJlc3NlcyBjaGFuZ2VkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUmVzdGFydGluZyBjb21tdW5pY2F0aW9ucyAuLi5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZXsgCisJCQkvKiBJUCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgbGluayBpcyB1cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZXJlZm9yZSwgZXhpdCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwljaGRsY19wcml2X2FyZWEtPmlwX2xvY2FsID0gY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXA7CisJY2hkbGNfcHJpdl9hcmVhLT5pcF9yZW1vdGUgPSBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXA7CisKKworCS8qIFNldHVwIHRoZSBCb2FyZCBmb3IgYXN5bmNocm9ub3VzIG1vZGUgKi8KKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQkKKwkJaWYgKHNldF9hc3lfY29uZmlnKGNhcmQpKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCBDSERMQyBBc3luYyBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfWVsc2V7CisJCS8qIFNldHVwIHRoZSBCb2FyZCBmb3IgQ0hETEMgKi8KKwkJaWYgKHNldF9jaGRsY19jb25maWcoY2FyZCkpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogRmFpbGVkIENIRExDIGNvbmZpZ3VyYXRpb24hXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgYW5kIG1hc2sgKi8KKyAgICAgICAgaWYgKGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9SWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0dMT0JBTF9FWENFUF9DT05EIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fVFhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9DSERMQ19FWENFUF9DT05EIHwgQVBQX0lOVF9PTl9USU1FUikpeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZXQgaW50ZXJydXB0IHRyaWdnZXJzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CQorICAgICAgICB9CisJCisKKwkvKiBNYXNrIHRoZSBUcmFuc21pdCBhbmQgVGltZXIgaW50ZXJydXB0ICovCisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJfihBUFBfSU5UX09OX1RYX0ZSQU1FIHwgQVBQX0lOVF9PTl9USU1FUik7CisKKwkvKiBJbiBUVFkgbW9kZSwgcmVjZWl2ZSBpbnRlcnJ1cHQgd2lsbCBiZSBlbmFibGVkIGR1cmluZworCSAqIHdhbnBpcGVfdHR5X29wZW4oKSBvcGVyYXRpb24gKi8KKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gfkFQUF9JTlRfT05fUlhfRlJBTUU7CisJfQorCisJLyogRW5hYmxlIGNvbW11bmljYXRpb25zICovCisgCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChhc3lfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgYXN5bmMgY29tbW51bmljYXRpb24hXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIDA7CisJCX0KKyAgICAgICAgfWVsc2V7IAorCQlpZiAoY2hkbGNfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgY2hkbGMgY29tbXVuaWNhdGlvbnMhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWluaXRfY2hkbGNfdHhfcnhfYnVmZihjYXJkKTsKKwlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisJcmV0dXJuIDA7IAorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjaGRsY19wb2xsCisgKgkKKyAqIFJhdGlvbmFsZToKKyAqIAlXZSBjYW5ub3QgbWFuaXB1bGF0ZSB0aGUgcm91dGluZyB0YWJsZXMsIG9yCisgKiAgICAgIGlwIGFkZHJlc3NlcyB3aXRoaW5nIHRoZSBpbnRlcnJ1cHQuIFRoZXJlZm9yZQorICogICAgICB3ZSBtdXN0IHBlcmZvcm0gc3VjaCBhY3RvbnMgb3V0c2lkZSBhbiBpbnRlcnJ1cHQgCisgKiAgICAgIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogRGVzY3JpcHRpb246CQorICoJQ0hETEMgcG9sbGluZyByb3V0aW5lLCByZXNwb25zaWJsZSBmb3IgCisgKiAgICAgCXNodXR0aW5nIGRvd24gaW50ZXJmYWNlcyB1cG9uIGRpc2Nvbm5lY3QKKyAqICAgICAJYW5kIGFkZGluZy9yZW1vdmluZyByb3V0ZXMuIAorICogICAgICAKKyAqIFVzYWdlOiAgICAgICAgCisgKiAJVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBmb3IgZWFjaCBDSERMQyAgCisgKiAJaW50ZXJmYWNlIHRocm91Z2ggYSB0cV9zY2hlZHVsZSBib3R0b20gaGFsZi4KKyAqICAgICAgCisgKiAgICAgIHRyaWdnZXJfY2hkbGNfcG9sbCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8ga2ljaworICogICAgICB0aGUgY2hsZGNfcG9sbCByb3V0aW5lLiAgCisgKi8KKworc3RhdGljIHZvaWQgY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisJc2RsYV90ICpjYXJkOworCXU4IGNoZWNrX2dhdGV3YXk9MDsJCisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCogZmxhZ3M7CisKKwkKKwlpZiAoIWRldiB8fCAoY2hkbGNfcHJpdl9hcmVhPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwkvKiAoUmUpQ29uZmlndXJhaXRvbiBpcyBpbiBwcm9ncmVzcywgc3RvcCB3aGF0IHlvdSBhcmUgCisJICogZG9pbmcgYW5kIGdldCBvdXQgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBpZl9vcGVuKCkgZnVuY3Rpb24gaGFzIHRyaWdnZXJlZCB0aGUgcG9sbGluZyByb3V0aW5lCisJICogdG8gZGV0ZXJtaW5lIHRoZSBjb25maWd1cmVkIElQIGFkZHJlc3Nlcy4gIE9uY2UgdGhlCisJICogYWRkcmVzc2VzIGFyZSBmb3VuZCwgdHJpZ2dlciB0aGUgY2hkbGMgY29uZmlndXJhdGlvbiAqLworCWlmICh0ZXN0X2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYykpeworCisJCWNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICA9IGdldF9pcF9hZGRyZXNzKGRldixXQU5fTE9DQUxfSVApOworCQljaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsKKwkKKwkgICAgICAgLyogSnVuIDIwLiAyMDAwIEJ1ZyBGaXgKKwkgCSogT25seSBwZXJmb3JtIHRoaXMgY2hlY2sgaW4gV0FOUElQRSBtb2RlLCBzaW5jZQorCSAJKiBJUCBhZGRyZXNzZXMgYXJlIG5vdCB1c2VkIGluIHRoZSBBUEkgbW9kZS4gKi8KKwkKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wID09IGNoZGxjX3ByaXZfYXJlYS0+aXBfcmVtb3RlX3RtcCAmJiAKKwkJICAgIGNhcmQtPnUuYy5zbGFycF90aW1lciA9PSAweDAwICYmIAorCQkgICAgIWNhcmQtPnUuYy5iYWNrdXAgJiYgCisJCSAgICBjYXJkLT51LmMudXNlZGJ5ID09IFdBTlBJUEUpeworCisJCQlpZiAoKytjaGRsY19wcml2X2FyZWEtPmlwX2Vycm9yID4gTUFYX0lQX0VSUk9SUyl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogLS0tIFdBUk5JTkcgLS0tXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFRoZSBsb2NhbCBJUCBhZGRyZXNzIGlzIHRoZSBzYW1lIGFzIHRoZVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBQb2ludC10by1Qb2ludCBJUCBhZGRyZXNzLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAtLS0gV0FSTklORyAtLS1cblxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfWVsc2V7CisJCQkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrSFo7CisJCQkJYWRkX3RpbWVyKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWNsZWFyX2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYyk7CisJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCQorCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9USU1FUjsKKwkJcmV0dXJuOworCX0KKwkvKiBEeW5hbWljIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgYXMgd2VsbCBhcyBkeW5hbWljCisJICogcm91dGluZy4gICovCisJCisJc3dpdGNoIChjYXJkLT51LmMuc3RhdGUpeworCisJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCisJCS8qIElmIHRoZSBkeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGlzIG9uLCBhbmQgaW50ZXJmYWNlIAorCQkgKiBpcyB1cCwgdGhlbiBicmluZyBkb3duIHRoZSBuZXRvd3JrIGludGVyZmFjZSAqLworCQkKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmIAorCQkgICAgIXRlc3RfYml0KERFVl9ET1dOLCAgJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCQkKKwkJICAgIGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQKXsJCisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MmfklGRl9VUCkpOworCQkJc2V0X2JpdChERVZfRE9XTiwmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCisJCX1lbHNleworCQkJLyogV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbG9jYWwgSVAgYWRkcmVzcyBpcworICAgICAgICAgICAgICAgCSAgCSAqIHplcm8uIElmIGl0IGlzLCB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdC4KKyAgICAgICAgICAgICAgICAgCSAqLworCisJCQlpZiAoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYgCisJCSAgICAJICAgIGdldF9pcF9hZGRyZXNzKGNhcmQtPndhbmRldi5kZXYsV0FOX0xPQ0FMX0lQKSAmJiAKKwkJICAgIAkgICAgY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgIT0gTk9fUk9VVEUgJiYKKwkJCSAgICBjYXJkLT51LmMuc2xhcnBfdGltZXIpeworCisJCQkJcHJvY2Vzc19yb3V0ZShjYXJkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKworCQkvKiBJbiBTTVAgbWFjaGluZSB0aGlzIGNvZGUgY2FuIGV4ZWN1dGUgYmVmb3JlIHRoZSBpbnRlcmZhY2UKKwkJICogY29tZXMgdXAuICBJbiB0aGlzIGNhc2UsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90CisJCSAqIHRyeSB0byBicmluZyB1cCB0aGUgaW50ZXJmYWNlIGJlZm9yZSBkZXZfb3BlbigpIGlzIGZpbmlzaGVkICovCisKKworCQkvKiBERVZfRE9XTiB3aWxsIGJlIHNldCBvbmx5IHdoZW4gd2UgYnJpbmcgZG93biB0aGUgaW50ZXJmYWNlCisJCSAqIGZvciB0aGUgdmVyeSBmaXJzdCB0aW1lLiBUaGlzIHdheSB3ZSBrbm93IHRoYXQgaXQgd2FzIHVzCisJCSAqIHRoYXQgYnJvdWdodCB0aGUgaW50ZXJmYWNlIGRvd24gKi8KKwkJCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgdGVzdF9iaXQoREVWX0RPV04sICAmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICEoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVApKXsKKwkJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyB1cC5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3N8SUZGX1VQKSk7CisJCQljbGVhcl9iaXQoREVWX0RPV04sJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IEFERF9ST1VURSAmJiAKKwkJICAgIGNhcmQtPnUuYy5zbGFycF90aW1lcil7IAorCisJCQlwcm9jZXNzX3JvdXRlKGNhcmQpOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+Z2F0ZXdheSAmJiBjaGVja19nYXRld2F5KQorCQkJYWRkX2dhdGV3YXkoY2FyZCxkZXYpOworCisJCWJyZWFrOworCX0JCisKKwljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9jaGRsY19wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgY2hkbGNfcG9sbCgpIHdvcmsgZW50cnkgaW50byB0aGUga2V2ZW50ZCB3b3JrIHF1ZXVlCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgVGhpcyB3aWxsIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKK3N0YXRpYyB2b2lkIHRyaWdnZXJfY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisJc2RsYV90ICpjYXJkOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKwkKKwlpZiAoKGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdik9PU5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcmV0dXJuOworCX0KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcmV0dXJuOyAKKwl9CisJc2NoZWR1bGVfd29yaygmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX3dvcmspOworfQorCisKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X3B0cjsKKwl0cmlnZ2VyX2NoZGxjX3BvbGwoZGV2KTsKK30KKworCit2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKKyAgICAgICAgaWYgKGNhcmQtPm5leHQpeworICAgICAgICAJc3Bpbl9sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJfQorfQorCit2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKyAgICAgICAgaWYgKGNhcmQtPm5leHQpeworICAgICAgICAJc3Bpbl91bmxvY2soJmNhcmQtPm5leHQtPndhbmRldi5sb2NrKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKKy8vKioqKioqKioqKiogVFRZIFNFQ1RJT04gKioqKioqKioqKioqKioqKgorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3R4X2lycShzZGxhX3QgKmNhcmQpCit7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJSU5URVJSVVBUX0lORk9STUFUSU9OX1NUUlVDVCAqY2hkbGNfaW50ID0gJmZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3Q7CisJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RYX0ZSQU1FOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3BvbGwoc2RsYV90ICpjYXJkKQoreworCXNjaGVkdWxlX3dvcmsoJmNhcmQtPnR0eV93b3JrKTsKK30KKworc3RhdGljIHZvaWQgdHR5X3BvbGxfd29yayAodm9pZCogZGF0YSkKK3sKKwlzZGxhX3QgKmNhcmQgPSAoc2RsYV90KilkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlpZiAoKHR0eT1jYXJkLT50dHkpPT1OVUxMKQorCQlyZXR1cm47CisJCisJdHR5X3dha2V1cCh0dHkpOworI2lmIGRlZmluZWQoU0VSSUFMX0hBVkVfUE9MTF9XQUlUKQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5wb2xsX3dhaXQpOworI2VuZGlmCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXNkbGFfdCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwkKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSl7CisJCXJldHVybjsKKwl9CisJCisJY2FyZCA9IChzZGxhX3QqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ2xvc2luZyBUVFkgRHJpdmVyIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCisJLyogU2FuaXR5IENoZWNrICovCisJaWYgKCFjYXJkLT50dHlfb3BlbikKKwkJcmV0dXJuOworCQorCXdhbnBpcGVfY2xvc2UoY2FyZCk7CisJaWYgKC0tY2FyZC0+dHR5X29wZW4gPT0gMCl7CisKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9TlVMTDsKKwkJY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duKGNhcmQpOworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCWlmIChjYXJkLT50dHlfYnVmKXsKKwkJCWtmcmVlKGNhcmQtPnR0eV9idWYpOworCQkJY2FyZC0+dHR5X2J1Zj1OVUxMOwkJCQorCQl9CisKKwkJaWYgKGNhcmQtPnR0eV9yeCl7CisJCQlrZnJlZShjYXJkLT50dHlfcngpOworCQkJY2FyZC0+dHR5X3J4PU5VTEw7CisJCX0KKwl9CisJcmV0dXJuOworfQorc3RhdGljIGludCB3YW5waXBlX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlzZGxhX3QgKmNhcmQ7CisJCisJaWYgKCF0dHkpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJaWYgKCF0dHktPmRyaXZlcl9kYXRhKXsKKwkJaW50IHBvcnQ7CisJCXBvcnQgPSB0dHktPmluZGV4OworCQlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+PSBOUl9QT1JUUykpIAorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQorCQl0dHktPmRyaXZlcl9kYXRhID0gV0FOX0NBUkQocG9ydCk7CisJCWlmICghdHR5LT5kcml2ZXJfZGF0YSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCWNhcmQgPSAoc2RsYV90Kil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFjYXJkKXsKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9TlVMTDsKKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5pbmcgVFRZIERyaXZlciFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWlmIChjYXJkLT50dHlfb3BlbiA9PSAwKXsKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9dHR5OworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCWlmICghY2FyZC0+dHR5X2J1Zil7CisJCQljYXJkLT50dHlfYnVmID0ga21hbGxvYyhUVFlfQ0hETENfTUFYX01UVSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWNhcmQtPnR0eV9idWYpeworCQkJCWNhcmQtPnR0eV9idWY9TlVMTDsKKwkJCQljYXJkLT50dHk9TlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsJCisJCQl9CisJCX0KKworCQlpZiAoIWNhcmQtPnR0eV9yeCl7CisJCQljYXJkLT50dHlfcnggPSBrbWFsbG9jKFRUWV9DSERMQ19NQVhfTVRVLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghY2FyZC0+dHR5X3J4KXsKKwkJCQkvKiBGcmVlIHRoZSBidWZmZXIgYWJvdmUgKi8KKwkJCQlrZnJlZShjYXJkLT50dHlfYnVmKTsKKwkJCQljYXJkLT50dHlfYnVmPU5VTEw7CisJCQkJY2FyZC0+dHR5PU5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CQorCQkJfQorCQl9CisJfQorCisJKytjYXJkLT50dHlfb3BlbjsKKwl3YW5waXBlX29wZW4oY2FyZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisJc2RsYV90ICpjYXJkPU5VTEw7CisKKwlpZiAoIXR0eSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICJOTyBUVFkgaW4gV3JpdGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkID0gKHNkbGFfdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkKKwlpZiAoIWNhcmQpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiTm8gQ2FyZCBpbiBUVFkgV3JpdGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CQorCisJaWYgKGNvdW50ID4gY2FyZC0+d2FuZGV2Lm10dSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICJGcmFtZSB0b28gYmlnIGluIFdyaXRlICVpIE1heDogJWlcbiIsCisJCQkJY291bnQsY2FyZC0+d2FuZGV2Lm10dSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiQ2FyZCBub3QgY29ubmVjdGVkIGluIFRUWSBXcml0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIExvY2sgdGhlIDUwOCBDYXJkOiBTTVAgaXMgc3VwcG9ydGVkICovCisgICAgICAJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9IAorCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgaW4gVFRZIFdyaXRlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkKKwkJLyogTG9jayB0aGUgNTA4IENhcmQ6IFNNUCBpcyBzdXBwb3J0ZWQgKi8KKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQkKKwkJcmV0dXJuIC1FSU5WQUw7IAorCX0KKwkKKyAJaWYgKGNoZGxjX3NlbmQoY2FyZCwodm9pZCopYnVmLGNvdW50KSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHNlbmQsIHJldHJ5IGxhdGVyOiBrZXJuZWwhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljbGVhcl9iaXQoU0VORF9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKworCQl3YW5waXBlX3R0eV90cmlnZ2VyX3R4X2lycShjYXJkKTsKKwkJCisJCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogUGFja2V0IHNlbnQgT0s6ICVpXG4iLGNhcmQtPmRldm5hbWUsY291bnQpOworCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQorCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9yZWNlaXZlKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBvZmZzZXQ9MDsKKwl1bnNpZ25lZCBvbGVuPWxlbjsKKwljaGFyIGZwPTA7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwlpZiAoIWNhcmQtPnR0eV9vcGVuKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgbm90IG9wZW4gZHVyaW5nIHJlY2VpdmVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCh0dHk9Y2FyZC0+dHR5KSA9PSBOVUxMKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIiVzOiBObyBUVFkgb24gcmVjZWl2ZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIERyaXZlciBEYXRhLCBvciBGbGlwIG9uIHJlY2VpdmVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisKKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlpZiAoKHR0eS0+ZmxpcC5jb3VudCtsZW4pID49IFRUWV9GTElQQlVGX1NJWkUpeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBSZWNlaXZlZCBwYWNrZXQgc2l6ZSB0b28gYmlnOiAlaSBieXRlcywgTWF4OiAlaSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsbGVuLFRUWV9GTElQQlVGX1NJWkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJCisJCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCQlvZmZzZXQgPSBjYXJkLT51LmMucnhfdG9wIC0gYWRkciArIDE7CisJCQkKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIG9mZnNldCk7CisJCQkKKwkJCWFkZHIgPSBjYXJkLT51LmMucnhfYmFzZTsKKwkJCWxlbiAtPSBvZmZzZXQ7CisJCQkKKwkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrPW9mZnNldDsKKwkJCXR0eS0+ZmxpcC5jb3VudCs9b2Zmc2V0OworCQkJZm9yIChpPTA7aTxvZmZzZXQ7aSsrKXsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkJfQorCQl9CisJCQorCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBsZW4pOworCQkJCisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrPWxlbjsKKwkJY2FyZC0+dHR5LT5mbGlwLmNvdW50Kz1sZW47CisJCWZvciAoaT0wO2k8bGVuO2krKyl7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCX0KKworCQl0dHktPmxvd19sYXRlbmN5PTE7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfWVsc2V7CisJCWlmICghY2FyZC0+dHR5X3J4KXsJCisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUmVjZWl2ZSBzeW5jIGJ1ZmZlciBub3QgYXZhaWxhYmxlIVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkKKwkJaWYgKGxlbiA+IFRUWV9DSERMQ19NQVhfTVRVKXsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBSZWNlaXZlZCBwYWNrZXQgc2l6ZSB0b28gYmlnOiAlaSBieXRlcywgTWF4OiAlaSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsbGVuLFRUWV9GTElQQlVGX1NJWkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJCisJCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCQlvZmZzZXQgPSBjYXJkLT51LmMucnhfdG9wIC0gYWRkciArIDE7CisJCQkKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGNhcmQtPnR0eV9yeCwgb2Zmc2V0KTsKKwkJCQorCQkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQkJbGVuIC09IG9mZnNldDsKKwkJfQorCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBjYXJkLT50dHlfcngrb2Zmc2V0LCBsZW4pOworCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkJaWYgKGxkKSB7CisJCQlpZiAobGQtPnJlY2VpdmVfYnVmKQorCQkJCWxkLT5yZWNlaXZlX2J1Zih0dHksY2FyZC0+dHR5X3J4LCZmcCxvbGVuKTsKKwkJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJCX1lbHNleworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBOTyBUVFkgU3luYyBsaW5lIGRpc2NpcGxpbmUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgRGF0YSAlaVxuIixjYXJkLT5kZXZuYW1lLG9sZW4pOworCXJldHVybjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBjb25maWdfdHR5IChzZGxhX3QgKmNhcmQpCit7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisKKwkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIGFzeW5jaHJvbm91cyBtb2RlICovCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJCisJCWlmIChzZXRfYXN5X2NvbmZpZyhjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgQ0hETEMgQXN5bmMgY29uZmlndXJhdGlvbiFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX1lbHNleworCQkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIENIRExDICovCisJCWlmIChzZXRfY2hkbGNfY29uZmlnKGNhcmQpKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCBDSERMQyBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogU2V0IGludGVycnVwdCBtb2RlIGFuZCBtYXNrICovCisgICAgICAgIGlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fUlhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9HTE9CQUxfRVhDRVBfQ09ORCB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX1RYX0ZSQU1FIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fQ0hETENfRVhDRVBfQ09ORCB8IEFQUF9JTlRfT05fVElNRVIpKXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOwkKKyAgICAgICAgfQorCQorCisJLyogTWFzayB0aGUgVHJhbnNtaXQgYW5kIFRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gCisJCX4oQVBQX0lOVF9PTl9UWF9GUkFNRSB8IEFQUF9JTlRfT05fVElNRVIpOworCisJCisJLyogRW5hYmxlIGNvbW11bmljYXRpb25zICovCisgCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChhc3lfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgYXN5bmMgY29tbW51bmljYXRpb24hXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICAgICAgfWVsc2V7IAorCQlpZiAoY2hkbGNfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgY2hkbGMgY29tbXVuaWNhdGlvbnMhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWluaXRfY2hkbGNfdHhfcnhfYnVmZihjYXJkKTsKKwlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisJcmV0dXJuIDA7IAorfQorCisKK3N0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHNkbGFfdCAqY2FyZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50CWJhdWQsIHJldD0wOworCXVuc2lnbmVkIGNmbGFnOyAKKwlpbnQJZGJpdHMsc2JpdHMscGFyaXR5LGhhbmRzaGFraW5nOworCisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBUaGVyZSBpcyBhbHdheXMgb25lIHN0b3AgYml0ICovCisJc2JpdHM9V0FOT1BUX09ORTsKKwkKKwkvKiBQYXJpdHkgaXMgZGVmYXVsdGVkIHRvIE5PTkUgKi8KKwlwYXJpdHkgPSBXQU5PUFRfTk9ORTsKKworCWhhbmRzaGFraW5nPTA7CisJCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkgICAgICBjYXNlIENTNTogZGJpdHMgPSA1OyBicmVhazsKKwkgICAgICBjYXNlIENTNjogZGJpdHMgPSA2OyBicmVhazsKKwkgICAgICBjYXNlIENTNzogZGJpdHMgPSA3OyBicmVhazsKKwkgICAgICBjYXNlIENTODogZGJpdHMgPSA4OyBicmVhazsKKwkgICAgICAvKiBOZXZlciBoYXBwZW5zLCBidXQgR0NDIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBpdCBvdXQgKi8KKwkgICAgICBkZWZhdWx0OiAgZGJpdHMgPSA4OyBicmVhazsKKwl9CisJCisJLyogT25lIG1vcmUgc3RvcCBiaXQgc2hvdWxkIGJlIHN1cHBvcnRlZCwgdGh1cyBpbmNyZW1lbnQKKwkgKiB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyBNYXg9MiAqLworCWlmIChjZmxhZyAmIENTVE9QQikgeworCQlzYml0cyA9IFdBTk9QVF9UV087CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlwYXJpdHkgPSBXQU5PUFRfRVZFTjsKKwl9CisJaWYgKGNmbGFnICYgUEFST0REKXsKKwkJcGFyaXR5ID0gV0FOT1BUX09ERDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKKworCWlmICghYmF1ZCkKKwkJYmF1ZCA9IDk2MDA7CS8qIEIwIHRyYW5zaXRpb24gaGFuZGxlZCBpbiByc19zZXRfdGVybWlvcyAqLworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQloYW5kc2hha2luZ3w9QVNZX1JUU19IU19GT1JfUlg7CisJfQorCQorCWlmIChJX0lHTlBBUih0dHkpKQorCQlwYXJpdHkgPSBXQU5PUFRfTk9ORTsKKworCWlmIChJX0lYT0ZGKHR0eSkpeworCQloYW5kc2hha2luZ3w9QVNZX1hPTl9YT0ZGX0hTX0ZPUl9SWDsKKwkJaGFuZHNoYWtpbmd8PUFTWV9YT05fWE9GRl9IU19GT1JfVFg7CisJfQorCisJaWYgKElfSVhPTih0dHkpKXsKKwkJaGFuZHNoYWtpbmd8PUFTWV9YT05fWE9GRl9IU19GT1JfUlg7CisJCWhhbmRzaGFraW5nfD1BU1lfWE9OX1hPRkZfSFNfRk9SX1RYOworCX0KKworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChjYXJkLT53YW5kZXYuYnBzICE9IGJhdWQpCisJCQlyZXQ9MTsKKwkJY2FyZC0+d2FuZGV2LmJwcyA9IGJhdWQ7CisJfQorCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJaWYgKGNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zICE9IGhhbmRzaGFraW5nKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gaGFuZHNoYWtpbmc7CisKKwkJaWYgKGNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyICE9IGRiaXRzKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyID0gZGJpdHM7CisKKwkJaWYgKGNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyICE9IGRiaXRzKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyID0gZGJpdHM7CisJCQorCQlpZiAoY2FyZC0+dS5jLnN0b3BfYml0cyAhPSBzYml0cykKKwkJCXJldD0xOworCQljYXJkLT51LmMuc3RvcF9iaXRzID0gc2JpdHM7CisKKwkJaWYgKGNhcmQtPnUuYy5wYXJpdHkgIT0gcGFyaXR5KQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5wYXJpdHkgPSBwYXJpdHk7CQorCisJCWNhcmQtPnUuYy5icmVha190aW1lciA9IDUwOworCQljYXJkLT51LmMuaW50ZXJfY2hhcl90aW1lciA9IDEwOworCQljYXJkLT51LmMucnhfY29tcGxldGVfbGVuZ3RoID0gMTAwOworCQljYXJkLT51LmMueG9uX2NoYXIgPSAweEZFOworCX1lbHNleworCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IEhETENfU1RSRUFNSU5HX01PREU7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKKwkKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzZGxhX3QgKmNhcmQ7CisJaW50IGVycj0xOworCisJaWYgKCF0dHkpeworCQlyZXR1cm47CisJfQorCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCQkJCisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlpZiAoY2hhbmdlX3NwZWVkKGNhcmQsIHR0eSwgb2xkX3Rlcm1pb3MpIHx8ICFjYXJkLT51LmMuY29tbV9lbmFibGVkKXsKKwkJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJCQorCQlpZiAoY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCl7CisJCQlsb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwkJCWNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93bihjYXJkKTsKKwkJCXVubG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCX0KKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCWVyciA9IGNvbmZpZ190dHkoY2FyZCk7CisJCXVubG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVFRZIEFzeW5jIENvbmZpZ3VyYXRpb246XG4iCisJCQkJICIgICBCYXVkICAgICAgICA9JWlcbiIKKwkJCQkgIiAgIEhhbmRzaGFraW5nID0lc1xuIgorCQkJCSAiICAgVHggRGJpdHMgICAgPSVpXG4iCisJCQkJICIgICBSeCBEYml0cyAgICA9JWlcbiIKKwkJCQkgIiAgIFBhcml0eSAgICAgID0lc1xuIgorCQkJCSAiICAgU3RvcCBCaXRzICAgPSVpXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLAorCQkJCSBjYXJkLT53YW5kZXYuYnBzLAorCQkJCSBvcHRfZGVjb2RlW2NhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zXSwKKwkJCQkgY2FyZC0+dS5jLnR4X2JpdHNfcGVyX2NoYXIsCisJCQkJIGNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyLAorCQkJCSBwX2RlY29kZVtjYXJkLT51LmMucGFyaXR5XSAsCisJCQkJIGNhcmQtPnUuYy5zdG9wX2JpdHMpOworCQl9ZWxzZXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgU3luYyBDb25maWd1cmF0aW9uOlxuIgorCQkJCSAiICAgQmF1ZCAgICAgICAgPSVpXG4iCisJCQkJICIgICBQcm90b2NvbCAgICA9SERMQ19TVFJFQU1JTkdcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsY2FyZC0+d2FuZGV2LmJwcyk7CisJCX0KKwkJaWYgKCFlcnIpeworCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCxXQU5fQ09OTkVDVEVEKTsKKwkJfWVsc2V7CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLFdBTl9ESVNDT05ORUNURUQpOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzZGxhX3QgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCWlmICghdHR5KXsKKwkJcmV0dXJuOworCX0KKwkKKwljYXJkID0gKHNkbGFfdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkKKwkJcmV0dXJuOworCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCXM1MDhfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkKKwkJd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoY2FyZCk7CisKKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNoZGxjX3NlbmQoY2FyZCwodm9pZCopJmNoLDEpKXsKKwkJd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoY2FyZCk7CisJCWRiZ19wcmludGsoIiVzOiBGYWlsZWQgdG8gVFggY2hhciFcbiIsY2FyZC0+ZGV2bmFtZSk7CisJfQorCQorCWRiZ19wcmludGsoIiVzOiBDaGFyIFRYIE9LXG4iLGNhcmQtPmRldm5hbWUpOworCQorCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQorCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5KQorCQlyZXR1cm47CisJCisjaWYgZGVmaW5lZChTRVJJQUxfSEFWRV9QT0xMX1dBSVQpCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl0dHlfd2FrZXVwKHR0eSk7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlciB0bworICogdGhlIGRldmljZQorICovCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3YW5waXBlX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2RsYV90ICpjYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVFRZIFdyaXRlIFJvb21cbiIpOworCQorCWlmICghdHR5KXsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpCisJCXJldHVybiAwOworCQorCXJldHVybiBTRUNfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUU7Cit9CisKKworc3RhdGljIGludCBzZXRfbW9kZW1fc3RhdHVzKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1iLT5idWZmZXJfbGVuZ3RoPTE7CisJbWItPmNvbW1hbmQ9U0VUX01PREVNX1NUQVRVUzsKKwltYi0+ZGF0YVswXT1kYXRhOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIAorCQljaGRsY19lcnJvciAoY2FyZCwgZXJyLCBtYik7CisJCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2RsYV90ICpjYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVFRZIEhhbmd1cCFcbiIpOworCQorCWlmICghdHR5KXsKKwkJcmV0dXJuOworCX0KKworCWNhcmQgPSAoc2RsYV90ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKworCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCXNldF9tb2RlbV9zdGF0dXMoY2FyZCwwKTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXJldHVybjsKK30KKworaW50IHdhbnBpcGVfdHR5X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAorCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKKyAqLworaW50IHdhbnBpcGVfdHR5X2luaXQoc2RsYV90ICpjYXJkKQoreworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKiBzdGF0ZTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLworCisJaWYgKGNhcmQtPnR0eV9taW5vciA8IDAgfHwgY2FyZC0+dHR5X21pbm9yID4gTlJfUE9SVFMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBNaW5vciBUVFkgbnVtYmVyICgwLTQpOiAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGNhcmQtPnR0eV9taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChXQU5fQ0FSRChjYXJkLT50dHlfbWlub3IpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRUWSBNaW5vciAlaSwgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT50dHlfbWlub3IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0dHlfaW5pdF9jbnQ9PTApeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRUWSAlcyBEcml2ZXIgSW5pdDogTWFqb3IgJWksIE1pbm9yIFJhbmdlICVpLSVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsCisJCQkJY2FyZC0+dS5jLmFzeW5jX21vZGUgPyAiQVNZTkMiIDogIlNZTkMiLAorCQkJCVdBTl9UVFlfTUFKT1IsTUlOX1BPUlQsTUFYX1BPUlQpOworCQkKKwkJdHR5X2RyaXZlcl9tb2RlID0gY2FyZC0+dS5jLmFzeW5jX21vZGU7CisJCQorCQltZW1zZXQoJnNlcmlhbF9kcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCQlzZXJpYWxfZHJpdmVyLm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwkJc2VyaWFsX2RyaXZlci5vd25lciA9IFRISVNfTU9EVUxFOworCQlzZXJpYWxfZHJpdmVyLmRyaXZlcl9uYW1lID0gIndhbnBpcGVfdHR5IjsgCisJCXNlcmlhbF9kcml2ZXIubmFtZSA9ICJ0dHlXIjsKKwkJc2VyaWFsX2RyaXZlci5tYWpvciA9IFdBTl9UVFlfTUFKT1I7CisJCXNlcmlhbF9kcml2ZXIubWlub3Jfc3RhcnQgPSBXQU5fVFRZX01JTk9SOworCQlzZXJpYWxfZHJpdmVyLm51bSA9IE5SX1BPUlRTOyAKKwkJc2VyaWFsX2RyaXZlci50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwkJc2VyaWFsX2RyaXZlci5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCQkKKwkJc2VyaWFsX2RyaXZlci5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJCXNlcmlhbF9kcml2ZXIuaW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCQlzZXJpYWxfZHJpdmVyLmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwkJCisJCXNlcmlhbF9kcml2ZXIucmVmY291bnQgPSAxOwkvKiAhQCFAXiNeJiEhICovCisKKwkJc2VyaWFsX2RyaXZlci5vcGVuID0gd2FucGlwZV90dHlfb3BlbjsKKwkJc2VyaWFsX2RyaXZlci5jbG9zZSA9IHdhbnBpcGVfdHR5X2Nsb3NlOworCQlzZXJpYWxfZHJpdmVyLndyaXRlID0gd2FucGlwZV90dHlfd3JpdGU7CisJCQorCQlzZXJpYWxfZHJpdmVyLnB1dF9jaGFyID0gd2FucGlwZV90dHlfcHV0X2NoYXI7CisJCXNlcmlhbF9kcml2ZXIuZmx1c2hfY2hhcnMgPSB3YW5waXBlX3R0eV9mbHVzaF9jaGFyczsKKwkJc2VyaWFsX2RyaXZlci53cml0ZV9yb29tID0gd2FucGlwZV90dHlfd3JpdGVfcm9vbTsKKwkJc2VyaWFsX2RyaXZlci5jaGFyc19pbl9idWZmZXIgPSB3YW5waXBlX3R0eV9jaGFyc19pbl9idWZmZXI7CisJCXNlcmlhbF9kcml2ZXIuZmx1c2hfYnVmZmVyID0gd2FucGlwZV90dHlfZmx1c2hfYnVmZmVyOworCQkvL3NlcmlhbF9kcml2ZXIuaW9jdGwgPSB3YW5waXBlX3R0eV9pb2N0bDsKKwkJc2VyaWFsX2RyaXZlci50aHJvdHRsZSA9IHdhbnBpcGVfdHR5X3Rocm90dGxlOworCQlzZXJpYWxfZHJpdmVyLnVudGhyb3R0bGUgPSB3YW5waXBlX3R0eV91bnRocm90dGxlOworCQlzZXJpYWxfZHJpdmVyLnNlbmRfeGNoYXIgPSB3YW5waXBlX3R0eV9zZW5kX3hjaGFyOworCQlzZXJpYWxfZHJpdmVyLnNldF90ZXJtaW9zID0gd2FucGlwZV90dHlfc2V0X3Rlcm1pb3M7CisJCXNlcmlhbF9kcml2ZXIuc3RvcCA9IHdhbnBpcGVfdHR5X3N0b3A7CisJCXNlcmlhbF9kcml2ZXIuc3RhcnQgPSB3YW5waXBlX3R0eV9zdGFydDsKKwkJc2VyaWFsX2RyaXZlci5oYW5ndXAgPSB3YW5waXBlX3R0eV9oYW5ndXA7CisJCXNlcmlhbF9kcml2ZXIuYnJlYWtfY3RsID0gd2FucGlwZV90dHlfYnJlYWs7CisJCXNlcmlhbF9kcml2ZXIud2FpdF91bnRpbF9zZW50ID0gd2FucGlwZV90dHlfd2FpdF91bnRpbF9zZW50OworCQlzZXJpYWxfZHJpdmVyLnJlYWRfcHJvYyA9IHdhbnBpcGVfdHR5X3JlYWRfcHJvYzsKKwkJCisJCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJpdmVyKSl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCX0KKworCisJLyogVGhlIHN1YnNlcXVlbnQgcG9ydHMgbXVzdCBjb21wbHkgdG8gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiAqLworCWlmICh0dHlfZHJpdmVyX21vZGUgIT0gY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3I6IFRUWSBEcml2ZXIgb3BlcmF0aW9uIG1vZGUgbWlzbWF0Y2ghXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIFRUWSBkcml2ZXIgaXMgY29uZmlndXJlZCBmb3IgJXMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHR0eV9kcml2ZXJfbW9kZSA/ICJBU1lOQyIgOiAiU1lOQyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJdHR5X2luaXRfY250Kys7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBUVFkgJXMgRHJpdmVyIE1pbm9yICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwKKwkJCXR0eV9kcml2ZXJfbW9kZSA/ICJBU1lOQyIgOiAiU1lOQyIsCisJCQljYXJkLT50dHlfbWlub3IpOworCQorCXR0eV9jYXJkX21hcFtjYXJkLT50dHlfbWlub3JdID0gY2FyZDsKKwlzdGF0ZSA9ICZyc190YWJsZVtjYXJkLT50dHlfbWlub3JdOworCQorCXN0YXRlLT5tYWdpYyA9IFNTVEFURV9NQUdJQzsKKwlzdGF0ZS0+bGluZSA9IDA7CisJc3RhdGUtPnR5cGUgPSBQT1JUX1VOS05PV047CisJc3RhdGUtPmN1c3RvbV9kaXZpc29yID0gMDsKKwlzdGF0ZS0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCXN0YXRlLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKwlzdGF0ZS0+aWNvdW50LmN0cyA9IHN0YXRlLT5pY291bnQuZHNyID0gCisJCXN0YXRlLT5pY291bnQucm5nID0gc3RhdGUtPmljb3VudC5kY2QgPSAwOworCXN0YXRlLT5pY291bnQucnggPSBzdGF0ZS0+aWNvdW50LnR4ID0gMDsKKwlzdGF0ZS0+aWNvdW50LmZyYW1lID0gc3RhdGUtPmljb3VudC5wYXJpdHkgPSAwOworCXN0YXRlLT5pY291bnQub3ZlcnJ1biA9IHN0YXRlLT5pY291bnQuYnJrID0gMDsKKwlzdGF0ZS0+aXJxID0gY2FyZC0+d2FuZGV2LmlycTsgCisKKwlJTklUX1dPUksoJmNhcmQtPnR0eV93b3JrLCB0dHlfcG9sbF93b3JrLCAodm9pZCopY2FyZCk7CisJcmV0dXJuIDA7Cit9CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnIuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmY2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMKQEAgLTAsMCArMSw1MDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV9mci5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBGcmFtZSByZWxheSBtb2R1bGUuCisqCisqIEF1dGhvcihzKToJTmVuYWQgQ29yYmljICA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIE5vdiAyMywgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gQWRkZWQgc3VwcG9ydCBmb3IgMi40Llgga2VybmVscworKiBOb3YgMTUsIDIwMDAgIERhdmlkIFJva2F2YXJnICAKKyogICAgICAgICAgICAgICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBmcmFtZSByZWxheSBicmlkZ2luZyBzdXBwb3J0LgorKiAJCQkJICBPcmlnaW5hbCBjb2RlIGZyb20gTWFyayBXZWxscyBhbmQgS3Jpc3RpYW4gSG9mZm1hbm4gaGFzCisqIAkJCQkgIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBmcmFtZSByZWxheSBkcml2ZXIuCisqIE5vdiAxMywgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gQWRkZWQgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZyBvcHRpb24uCisqIAkJCQkgIFRjcGR1bXAgZG9lc24ndCBzdXBwb3J0IEZyYW1lIFJlbGF5IGludGVmYWNlCisqIAkJCQkgIHR5cGVzLCB0byBmaXggdGhpcyB0cnVlIHR5cGUgb3B0aW9uIHdpbGwgc2V0CisqIAkJCQkgIHRoZSBpbnRlcmZhY2UgdHlwZSB0byBSQVcgSVAgbW9kZS4KKyogTm92IDA3LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW55IGFsbCBhbmQgc3BlY2lmeSBhbGxvd2VkIHJlcXVlc3RzLgorKiBOb3YgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIFdhbnBpcGUgaW50ZXJmYWNlcyBjb25mb3JtIHRvIHJhdyBwYWNrZXQgaW50ZXJmYWNlcy4gIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIHRoZSBpZl9oZWFkZXIgaW50byB0aGUgaWZfc2VuZCgpIHJvdXRpbmUuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlmX2hlYWRlcigpIHdhcyBicmVha2luZyB0aGUgbGlicGNhcCAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LiBpLmUuIHN1cHBvcnQgZm9yIHRjcGR1bXAsIGV0aGVyZWFsIC4uLgorKiBPY3QgMTIuIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEFkZGVkIGVycm9yIG1lc3NhZ2UgaW4gZnJfY29uZmlndXJlCisqIEp1bCAzMSwgMjAwMCAgTmVuYWQgQ29yYmljCW8gRml4ZWQgdGhlIFJvdXRlciBVUCBUaW1lLgorKiBBcHIgMjgsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIHRoZSBvcHRpb24gdG8gc2h1dGRvd24gYW4gaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY2hhbm5lbCBnZXRzIGRpc2Nvbm5lY3RlZC4KKyogQXByIDI4LCAyMDAwICBOZW5hZCBDb3JiaWMgCW8gQWRkZWQgTS5HcmFudHMgcGF0Y2g6IGRpc2FsbG93IGR1cGxpY2F0ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBzZXR1cHMuIAorKiBBcHIgMjUsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIE0uR3JhbnRzIHBhdGNoOiBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkbGNpcy9pbnRlcmZhY2VzLgorKiBNYXIgMjMsIDIwMDAgIE5lbmFkIENvcmJpYyAJbyBJbXByb3ZlZCB0YXNrIHF1ZXVlLCBiaCBoYW5kbGluZy4KKyogTWFyIDE2LCAyMDAwCU5lbmFkIENvcmJpYwlvIEFkZGVkIEludmVyc2UgQVJQIHN1cHBvcnQKKyogTWFyIDEzLCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBuZXcgc29ja2V0IEFQSSBzdXBwb3J0LgorKiBNYXIgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEJ1ZyBGaXg6IGNvcnJ1cHRlZCBtYm94IHJlY292ZXJ5LgorKiBGZWIgMjQsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEZpeGVkIHVwIEZUMSBVRFAgZGVidWdnaW5nIHByb2JsZW0uCisqIERldiAxNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gRml4ZWQgdXAgaGVhZGVyIGZpbGVzIGZvciAyLjAuWCBrZXJuZWxzCisqCisqIE5vdiAwOCwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gQ29tYmluZWQgYWxsIGRlYnVnIFVEUCBjYWxscyBpbnRvIG9uZSBmdW5jdGlvbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIFJlbW92ZWQgdGhlIEFSUCBzdXBwb3J0LiBUaGlzIGhhcyB0byBiZSBkb25lCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG5leHQgdmVyc2lvbi4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBPbmx5IGEgTm9kZSBjYW4gaW1wbGVtZW50IE5PIHNpZ25hbGxpbmcuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBETENJIGR1cmluZyBpZl9vcGVuKCkgaWYgTk8gCisqCQkJCSAgc2lnbmFsbGluZy4KKyoJCQkJbyBUb29rIG91dCBJUFggc3VwcG9ydCwgaW1wbGVtZW50IGluIG5leHQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uCisqIFNlcCAyOSwgMTk5OSAgTmVuYWQgQ29yYmljCW8gQWRkZWQgU01QIHN1cHBvcnQgYW5kIGNoYW5nZWQgdGhlIHVwZGF0ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIHVzZSB0aW1lciBpbnRlcnJ1cHQuCisqCQkJCW8gRml4ZWQgdGhlIENJUiBidWc6ICBTZXQgdGhlIHZhbHVlIG9mIEJDCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQ0lSIHdoZW4gdGhlIENJUiBpcyBlbmFibGVkLgorKiAgCQkJCW8gVXBkYXRlZCBjb21tZW50cywgc3RhdGlzdGljcyBhbmQgdHJhY2luZy4KKyogSnVuIDAyLCAxOTk5CUdpZGVvbiBIYWNrCW8gVXBkYXRlZCBmb3IgUzUxNCBzdXBwb3J0LgorKiBTZXAgMTgsIDE5OTgJSmFzcHJlZXQgU2luZ2gJbyBVcGRhdGVkIGZvciAyLjIuWCBrZXJuZWxzLgorKiBKdWwgMzEsIDE5OTgJSmFzcHJlZXQgU2luZ2gJbyBSZW1vdmVkIHdwZl9wb2xsIHJvdXRpbmUuICBUaGUgY2hhbm5lbC9ETENJIAorKgkJCQkgIHN0YXR1cyBpcyByZWNlaXZlZCB0aHJvdWdoIGFuIGV2ZW50IGludGVycnVwdC4KKyogSnVsIDA4LCAxOTk4CURhdmlkIEZvbmcJbyBBZGRlZCBpbnZlcnNlIEFSUCBzdXBwb3J0LgorKiBNYXIgMjYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBSZXR1cm5pbmcgcmV0dXJuIGNvZGVzIGZvciBmYWlsZWQgVURQIGNtZHMuCisqIEphbiAyOCwgMTk5NwlKYXNwcmVldCBTaW5naCAgbyBJbXByb3ZlZCBoYW5kbGluZyBvZiBpbmFjdGl2ZSBETENJcy4KKyogRGVjIDMwLCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gUmVwbGFjZWQgZGV2X3RpbnQoKSB3aXRoIG1hcmtfYmgoTkVUX0JIKQorKiBEZWMgMTYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBJbXBsZW1lbnRlZCBNdWx0aXBsZSBJUFggc3VwcG9ydC4KKyogTm92IDI2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gSW1wcm92ZWQgbG9hZCBzaGFyaW5nIHdpdGggbXVsdGlwbGUgYm9hcmRzCisqCQkJCW8gQWRkZWQgQ2xpKCkgdG8gcHJvdGVjdCBlbmFibGluZyBvZiBpbnRlcnJ1cHRzCisqCQkJCSAgd2hpbGUgcG9sbGluZyBpcyBjYWxsZWQuCisqIE5vdiAyNCwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIGNvdW50ZXJzIHRvIGF2b2lkIGVuYWJsaW5nIG9mIGludGVycnVwdHMKKyoJCQkJICB3aGVuIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGFub3RoZXIKKyoJCQkJICBpbnRlcmZhY2Ugb3Igcm91dGluZSAoZWcuIHdwZl9wb2xsKS4KKyogTm92IDA2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gQWRkZWQgSU5UUl9URVNUX01PREUgdG8gYXZvaWQgcG9sbGluZwkKKyoJCQkJICByb3V0aW5lIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgaW50ZXJydXB0CisqCQkJCSAgdGVzdGluZy4KKyogT2N0IDIwLCAxOTk3ICBKYXNwcmVldCBTaW5naCAgbyBBZGRlZCBob29rcyBpbiBmb3IgUm91dGVyIFVQIHRpbWUuCisqIE9jdCAxNiwgMTk5NyAgSmFzcHJlZXQgU2luZ2ggIG8gVGhlIGNyaXRpY2FsIGZsYWcgaXMgdXNlZCB0byBtYWludGFpbiBmbG93CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBieSBhdm9pZGluZyBSQUNFIGNvbmRpdGlvbnMuICBUaGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGkoKSBhbmQgcmVzdG9yZV9mbGFncygpIGFyZSB0YWtlbiBvdXQuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZyX2NoYW5uZWwgc3RydWN0dXJlIGlzIGFwcGVuZGVkIGZvciAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgU3RhdGlzdGljcy4KKyogT2N0IDE1LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gdXBkYXRlZCBpZl9zZW5kKCkgYW5kIHJlY2VpdmUgZm9yIElQWAorKiBBdWcgMjksIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBSZW1vdmVkIG1vc3Qgb2YgdGhlIGNsaSgpIGFuZCBzdGkoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBBYnN0cmFjdGVkIHRoZSBVRFAgbWFuYWdlbWVudCBzdHVmZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBOb3cgdXNlIHRidXN5IGFuZCBjcml0aWNhbCBtb3JlIGludGVsbGlnZW50bHkKKyogSnVsIDIxLCAxOTk3ICBKYXNwcmVldCBTaW5naAkgbyBDYW4gY29uZmlndXJlIFQzOTEsIFQzOTIsIE4zOTEsIE4zOTIgJiBOMzkzCisqCQkJCSAgIHRocm91Z2ggcm91dGVyLmNvbmYuCisqCQkJCSBvIFByb3RlY3RlZCBjYWxscyB0byBzZGxhX3BlZWsoKSBieSBhZERpbmcgCisqCQkJCSAgIHNhdmVfZmxhZ3MoKSwgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKS4KKyoJCQkJIG8gQWRkZWQgZXJyb3IgbWVzc2FnZSBmb3IgSW5hY3RpdmUgRExDSXMgaW4KKyoJCQkJICAgZnJfZXZlbnQoKSBhbmQgdXBkYXRlX2NoYW5fc3RhdGUoKS4KKyoJCQkJIG8gRml4ZWQgZnJlZWluZyB1cCBvZiBidWZmZXJzIHVzaW5nIGtmcmVlKCkgCisqCQkJICAgICAgICAgICB3aGVuIHBhY2tldHMgYXJlIHJlY2VpdmVkLgorKiBKdWwgMDcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJIG8gQWRkZWQgY29uZmlndXJhYmxlIFRUTCBmb3IgVURQIHBhY2tldHMgCisqCQkJCSBvIEFkZGVkIGFiaWxpdHkgdG8gZGlzY2FyZCBtdWx0aWNhc3QgYW5kIAorKgkJCQkgICBicm9hZGNhc3Qgc291cmNlIGFkZHJlc3NlZCBwYWNrZXRzCisqIEp1biAyNywgMTk5NwlKYXNwcmVldCBTaW5naAkgbyBBZGRlZCBGVDEgbW9uaXRvciBjYXBhYmlsaXRpZXMgCisqCQkJCSAgIE5ldyBjYXNlICgweDQ0KSBzdGF0ZW1lbnQgaW4gaWZfc2VuZCByb3V0aW5lIAorKgkJCQkgICBBZGRlZCBhIGdsb2JhbCB2YXJpYWJsZSByQ291bnQgdG8ga2VlcCB0cmFjaworKgkJCSAJICAgb2YgRlQxIHN0YXR1cyBlbmFibGVkIG9uIHRoZSBib2FyZC4KKyogTWF5IDI5LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEZpeGVkIG1ham9yIEZsb3cgQ29udHJvbCBQcm9ibGVtCisqCQkJCSAgIFdpdGggbXVsdGlwbGUgYm9hcmRzIGEgcHJvYmxlbSB3YXMgc2VlbiB3aGVyZQorKgkJCQkgICB0aGUgc2Vjb25kIGJvYXJkIGFsd2F5cyBzdG9wcGVkIHRyYW5zbWl0dGluZworKgkJCQkgICBwYWNrZXQgYWZ0ZXIgcnVubmluZyBmb3IgYSB3aGlsZS4gVGhlIGNvZGUKKyoJCQkJICAgZ290IGludG8gYSBzdGFnZSB3aGVyZSB0aGUgaW50ZXJydXB0cyB3ZXJlCisqCQkJCSAgIGRpc2FibGVkIGFuZCBkZXYtPnRidXN5IHdhcyBzZXQgdG8gMS4KKyogICAgICAgICAgICAgICAgICAJCSAgIFRoaXMgY2F1c2VkIHRoZSBJZl9zZW5kKCkgcm91dGluZSB0byBnZXQgaW50bworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaWYgY2xhdXNlIGZvciBpdCgwLGRldi0+dGJ1c3kpIAorKgkJCQkgICBmb3JldmVyLgorKgkJCQkgICBUaGUgY29kZSBnb3QgaW50byB0aGlzIHN0YWdlIGR1ZSB0byBhbiAKKyoJCQkJICAgaW50ZXJydXB0IG9jY3VycmluZyB3aXRoaW4gdGhlIGlmIGNsYXVzZSBmb3IgCisqCQkJCSAgIHNldF9iaXQoMCxkZXYtPnRidXN5KS4gIFNpbmNlIGFuIGludGVycnVwdCAKKyoJCQkJICAgZGlzYWJsZXMgZnVyaHRlciB0cmFuc21pdCBpbnRlcnJ1cHQgYW5kIAorKiAJCQkJICAgbWFrZXMgZGV2LT50YnVzeSA9IDAsIHRoaXMgZWZmZWN0IHdhcyB1bmRvbmUgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMSBpbiB0aGUgaWYgY2xhdXNlLgorKgkJCQkgICBUaGUgRml4IGNoZWNrcyB0byBzZWUgaWYgVHJhbnNtaXQgaW50ZXJydXB0cworKgkJCQkgICBhcmUgZGlzYWJsZWQgdGhlbiBkbyBub3QgbWFrZSBkZXYtPnRidXN5ID0gMQorKiAJICAgCQkJICAgSW50cm9kdWNlZCBhIGdsb2JhbCB2YXJpYWJsZTogaW50X29jY3VyIGFuZAorKgkJCQkgICBhZGRlZCB0eF9pbnRfZW5hYmxlZCBpbiB0aGUgd2FuX2RldmljZSAKKyoJCQkJICAgc3RydWN0dXJlLgkKKyogTWF5IDIxLCAxOTk3ICBKYXNwcmVldCBTaW5naCAgIG8gRml4ZWQgVURQIE1hbmFnZW1lbnQgZm9yIG11bHRpcGxlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcy4KKyoKKyogQXByIDI1LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gYWRkZWQgVURQIE1hbmFnZW1lbnQgc3R1ZmYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gZml4ZWQgYnVnIGluIGlmX3NlbmQoKSBhbmQgdHhfaW50cigpIHRvCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwIGFuZCB3YWtldXAgYWxsIGRldmljZXMKKyogTWFyIDExLCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgVmVyc2lvbiAzLjEuMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmaXhlZCAoKzEpIGJ1ZyBpbiBmcjUwOF9yeF9pbnRyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gY2hhbmdlZCBpZl9zZW5kKCkgdG8gcmV0dXJuIDAgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuZGV2LmNyaXRpY2FsKCkgaXMgdHJ1ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmcmVlIHNvY2tldCBidWZmZXIgaW4gaWZfc2VuZCgpIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAwIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBhZGRlZCB0eF9pbnRyKCkgcm91dGluZQorKiBKYW4gMzAsIDE5OTcJR2VuZSBLb3ppbglWZXJzaW9uIDMuMS4wCisqCQkJCSBvIGltcGxlbWVudGVkIGV4ZWMoKSBlbnRyeSBwb2ludAorKgkJCQkgbyBmaXhlZCBhIGJ1ZyBjYXVzaW5nIGRyaXZlciBjb25maWd1cmVkIGFzCisqCQkJCSAgIGEgRlIgc3dpdGNoIHRvIGJlIHN0dWNrIGluIFdBTl8KKyoJCQkJICAgbW9kZQorKiBKYW4gMDIsIDE5OTcJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciBpbmIoKSwgb3V0YigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgkgCS8qIGZvciBkb19nZXR0aW1lb2ZkYXkgKi8JCisjaW5jbHVkZSA8bGludXgvaW4uaD4JCS8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPgkvKiBXYW5waXBlIFNvY2tldCAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGUuaD4JCisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2ZyLmg+CQkvKiBmcmFtZSByZWxheSBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+ICAgICAgICAgIAkvKiBEeW5hbWljIFJvdXRlIENyZWF0aW9uICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGV0aF90eXBlX3RyYW5zKCkgdXNlZCBmb3IgYnJpZGdpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisKKyNkZWZpbmUJRlJfSEVBREVSX0xFTgk4CQkvKiBtYXggZW5jYXBzdWxhdGlvbiBoZWFkZXIgc2l6ZSAqLworI2RlZmluZQlGUl9DSEFOTkVMX01UVQkxNTAwCQkvKiB1bmZyYWdtZW50ZWQgbG9naWNhbCBjaGFubmVsIE1UVSAqLworCisvKiBRLjkyMiBmcmFtZSB0eXBlcyAqLworI2RlZmluZQlROTIyX1VJCQkweDAzCQkvKiBVbm51bWJlcmVkIEluZm8gZnJhbWUgKi8KKyNkZWZpbmUJUTkyMl9YSUQJMHhBRgkJCisKKy8qIERMQ0kgY29uZmlndXJlZCBvciBub3QgKi8KKyNkZWZpbmUgRExDSV9OT1RfQ09ORklHVVJFRAkweDAwCisjZGVmaW5lIERMQ0lfQ09ORklHX1BFTkRJTkcJMHgwMQorI2RlZmluZSBETENJX0NPTkZJR1VSRUQJCTB4MDIKKworLyogQ0lSIGVuYWJsZWQgb3Igbm90ICovCisjZGVmaW5lIENJUl9FTkFCTEVECTB4MDAKKyNkZWZpbmUgQ0lSX0RJU0FCTEVECTB4MDEKKworI2RlZmluZSBGUkFNRV9SRUxBWV9BUEkgMQorI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorCisvKiBGb3IgaGFuZGxlX0lQWFdBTigpICovCisjZGVmaW5lIENWSGV4VG9Bc2NpaShiKSAoKCh1bnNpZ25lZCBjaGFyKShiKSA+ICh1bnNpZ25lZCBjaGFyKTkpID8gKCh1bnNpZ25lZCBjaGFyKSdBJyArICgodW5zaWduZWQgY2hhcikoYikgLSAodW5zaWduZWQgY2hhcikxMCkpIDogKCh1bnNpZ25lZCBjaGFyKScwJyArICh1bnNpZ25lZCBjaGFyKShiKSkpCisgCisvKioqKioqIERhdGEgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyBhbiBleHRlbnRpb24gb2YgdGhlICdzdHJ1Y3QgZGV2aWNlJyB3ZSBjcmVhdGUgZm9yIGVhY2ggbmV0d29yaworICogaW50ZXJmYWNlIHRvIGtlZXAgdGhlIHJlc3Qgb2YgY2hhbm5lbC1zcGVjaWZpYyBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBmcl9jaGFubmVsCit7CisJd2FucGlwZV9jb21tb25fdCBjb21tb247CisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwl1bnNpZ25lZCBkbGNpX2NvbmZpZ3VyZWQgIDsJLyogY2hlY2sgd2hldGhlciBjb25maWd1cmVkIG9yIG5vdCAqLworCXVuc2lnbmVkIGNpcl9zdGF0dXM7CQkvKiBjaGVjayB3aGV0aGVyIENJUiBlbmFibGVkIG9yIG5vdCAqLworCXVuc2lnbmVkIGRsY2k7CQkJLyogbG9naWNhbCBjaGFubmVsIG51bWJlciAqLworCXVuc2lnbmVkIGNpcjsJCQkvKiBjb21taXR0ZWQgaW5mb3JtYXRpb24gcmF0ZSAqLworCXVuc2lnbmVkIGJjOwkJCS8qIGNvbW1pdHRlZCBidXJzdCBzaXplICovCisJdW5zaWduZWQgYmU7CQkJLyogZXhjZXNzIGJ1cnN0IHNpemUgKi8KKwl1bnNpZ25lZCBtYzsJCQkvKiBtdWx0aWNhc3Qgc3VwcG9ydCBvbiBvciBvZmYgKi8KKwl1bnNpZ25lZCB0eF9pbnRfc3RhdHVzOwkJLyogVHJhbnNtaXQgSW50ZXJydXB0IFN0YXR1cyAqLwkKKwl1bnNpZ25lZCBzaG9ydCBwa3RfbGVuZ3RoOwkvKiBQYWNrZXQgTGVuZ3RoICovCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfc3RhcnRfdGltZTsvKiBSb3V0ZXIgc3RhcnQgdGltZSBpbiBzZWNvbmRzICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CS8qIGNvdW50ZXIgZm9yIHRyYW5zbWl0IHRpbWUgb3V0ICovCisJY2hhciBkZXZfcGVuZGluZ19kZXZ0aW50OwkvKiBpbnRlcmZhY2UgcGVuZGluZyBkZXZfdGludCgpICovCisJdm9pZCAqZGxjaV9pbnRfaW50ZXJmYWNlOwkvKiBwb2ludGVyIHRvIHRoZSBETENJIEludGVyZmFjZSAqLyAKKwl1bnNpZ25lZCBsb25nIElCX2FkZHI7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIEludGVyZmFjZSBCeXRlICovCisJdW5zaWduZWQgbG9uZyBzdGF0ZV90aWNrOwkvKiB0aW1lIG9mIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWDsJLyogRW5hYmxlL0Rpc2FibGUgdGhlIHVzZSBvZiBJUFggKi8KKwl1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyOwkvKiBJbnRlcm5hbCBOZXR3b3JrIE51bWJlciBmb3IgSVBYKi8KKwlzZGxhX3QgKmNhcmQ7CQkJLyogLT4gb3duZXIgKi8KKwl1bnNpZ25lZCByb3V0ZV9mbGFnOwkJLyogQWRkL1JlbSBkZXN0IGFkZHIgaW4gcm91dGUgdGFibGVzICovCisJdW5zaWduZWQgaW5hcnA7CQkJLyogSW52ZXJzZSBBcnAgUmVxdWVzdCBzdGF0dXMgKi8gCisJbG9uZyBpbmFycF9yZWFkeTsJCS8qIFJlYWR5IHRvIHNlbmQgcmVxdWVzdHMgKi8KKwlpbnQgaW5hcnBfaW50ZXJ2YWw7CQkvKiBUaW1lIGJldHdlZW4gSW5BcnAgUmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBsb25nIGluYXJwX3RpY2s7CS8qIEluQXJwIGppZmZpZXMgdGljayBjb3VudGVyICovCisJbG9uZyBpbnRlcmZhY2VfZG93bjsJCS8qIEJyaW5nIGludGVyZmFjZSBkb3duIG9uIGRpc2Nvbm5lY3QgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBpZnN0YXRzOwkvKiBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworCWlmX3NlbmRfc3RhdF90IGRydnN0YXRzX2lmX3NlbmQ7CisgICAgICAgIHJ4X2ludHJfc3RhdF90IGRydnN0YXRzX3J4X2ludHI7CisgICAgICAgIHBpcGVfbWdtdF9zdGF0X3QgZHJ2c3RhdHNfZ2VuOworCXVuc2lnbmVkIGxvbmcgcm91dGVyX3VwX3RpbWU7CisKKwl1bnNpZ25lZCBzaG9ydCB0cmFuc21pdF9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKmRlbGF5X3NrYjsKKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIGNoZGxjX2JoICovCisJdW5zaWduZWQgbG9uZyAgdHFfd29ya2luZzsKKwl2b2xhdGlsZSBpbnQgIGJoX3dyaXRlOworCXZvbGF0aWxlIGludCAgYmhfcmVhZDsKKwlhdG9taWNfdCAgYmhfYnVmZl91c2VkOworCisJLyogUG9sbGluZyB0YXNrIHF1ZXVlLiBFYWNoIGludGVyZmFjZQorICAgICAgICAgKiBoYXMgaXRzIG93biB0YXNrIHF1ZXVlLCB3aGljaCBpcyB1c2VkCisgICAgICAgICAqIHRvIGRlZmVyIGV2ZW50cyBmcm9tIHRoZSBpbnRlcnJ1cHQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZnJfcG9sbF93b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IGZyX2FycF90aW1lcjsKKworCXUzMiBpcF9sb2NhbDsKKwl1MzIgaXBfcmVtb3RlOworCWxvbmcgY29uZmlnX2RsY2k7CisJbG9uZyB1bmNvbmZpZ19kbGNpOworCisJLyogV2hldGhlciB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgc2V0dXAgYXMgYSBnYXRld2F5LgorCSAqIFVzZWQgYnkgZHluYW1pYyByb3V0ZSBzZXR1cCBjb2RlICovCisJdTggIGdhdGV3YXk7CisKKwkvKiBUcnVlIGludGVyZmFjZSB0eXBlICovCisJdTggdHJ1ZV9pZl9lbmNvZGluZzsKKwl1OCBmcl9oZWFkZXJbRlJfSEVBREVSX0xFTl07CisJY2hhciBmcl9oZWFkZXJfbGVuOworCit9IGZyX2NoYW5uZWxfdDsKKworLyogUm91dGUgRmxhZyBvcHRpb25zICovCisjZGVmaW5lIE5PX1JPVVRFCTB4MDAKKyNkZWZpbmUgQUREX1JPVVRFIAkweDAxCisjZGVmaW5lIFJPVVRFX0FEREVECTB4MDIKKyNkZWZpbmUgUkVNT1ZFX1JPVVRFIAkweDAzCisjZGVmaW5lIEFSUF9SRVEJCTB4MDQKKworLyogaW5hcnAgb3B0aW9ucyAqLworI2RlZmluZSBJTkFSUF9OT05FCQkweDAwCisjZGVmaW5lIElOQVJQX1JFUVVFU1QJCTB4MDEKKyNkZWZpbmUgSU5BUlBfQ09ORklHVVJFRAkweDAyCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUgCTB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX0FSUAkweDA0CisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEVfU1RBVEUgCTB4MDgKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRwkweDEwCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRwkweDIwCisKKwordHlwZWRlZiBzdHJ1Y3QgZGxjaV9zdGF0dXMKK3sKKwl1bnNpZ25lZCBzaG9ydCBkbGNpCVBBQ0tFRDsKKwl1bnNpZ25lZCBjaGFyIHN0YXRlCVBBQ0tFRDsKK30gZGxjaV9zdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGxjaV9JQl9tYXBwaW5nCit7CisJdW5zaWduZWQgc2hvcnQgZGxjaQkJUEFDS0VEOworCXVuc2lnbmVkIGxvbmcgIGFkZHJfdmFsdWUJUEFDS0VEOworfSBkbGNpX0lCX21hcHBpbmdfdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgRExDSSBsaXN0IFR4IGludGVycnVwdCBtb2RlLiAgSXQgaXMgdXNlZCB0bworICAgZW5hYmxlIGludGVycnVwdCBiaXQgYW5kIHNldCB0aGUgcGFja2V0IGxlbmd0aCBmb3IgdHJhbnNtaXNzaW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGZyX2RsY2lfaW50ZXJmYWNlIAoreworCXVuc2lnbmVkIGNoYXIgZ2VuX2ludGVycnVwdAlQQUNLRUQ7CisJdW5zaWduZWQgc2hvcnQgcGFja2V0X2xlbmd0aAlQQUNLRUQ7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZAkJUEFDS0VEOworfSBmcl9kbGNpX2ludGVyZmFjZV90OyAKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworCisvKiB2YXJpYWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBudW1iZXIgb2YgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZHVyaW5nIAorICogaW50ZXJydXB0IHRlc3Qgcm91dGluZSAKKyAqLworc3RhdGljIGludCBJbnRyX3Rlc3RfY291bnRlcjsKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIHdhbmlmX2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKKworLyogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgd3BmX2V4ZWMoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIGZyX2lzcihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgcnhfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgdHhfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgdGltZXJfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgc3B1cl9pbnRyKHNkbGFfdCAqY2FyZCk7CisKKy8qIEZyYW1lIHJlbGF5IGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZnJfcmVhZF92ZXJzaW9uKHNkbGFfdCAqY2FyZCwgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgZnJfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgZnJfY29uZl90ICpjb25mKTsKK3N0YXRpYyBpbnQgZnJfZGxjaV9jb25maWd1cmUoc2RsYV90ICpjYXJkLCBmcl9kbGNfY29uZl90ICpjb25mLCB1bnNpZ25lZCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfaW5pdF9kbGNpIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgaW50IGZyX3NldF9pbnRyX21vZGUgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbXR1LCB1bnNpZ25lZCBzaG9ydCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgZnJfY29tbV9lbmFibGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGZyX2NvbW1fZGlzYWJsZShzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBmcl9nZXRfZXJyX3N0YXRzKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IGZyX2dldF9zdGF0cyhzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBmcl9hZGRfZGxjaShzZGxhX3QgKmNhcmQsIGludCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfYWN0aXZhdGVfZGxjaShzZGxhX3QgKmNhcmQsIGludCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfZGVsZXRlX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpOworc3RhdGljIGludCBmcl9pc3N1ZV9pc2Yoc2RsYV90ICpjYXJkLCBpbnQgaXNmKTsKK3N0YXRpYyBpbnQgZnJfc2VuZChzZGxhX3QgKmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBjaGFyIGF0dHIsIGludCBsZW4sCisJdm9pZCAqYnVmKTsKK3N0YXRpYyBpbnQgZnJfc2VuZF9kYXRhX2hlYWRlcihzZGxhX3QgKmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBjaGFyIGF0dHIsIGludCBsZW4sCisJdm9pZCAqYnVmLHVuc2lnbmVkIGNoYXIgaGRyX2xlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IGZyX3NlbmRfaGRyKHNkbGFfdCAqY2FyZCwgaW50IGRsY2ksIHVuc2lnbmVkIGludCBvZmZzZXQpOworCitzdGF0aWMgaW50IGNoZWNrX2RsY2lfY29uZmlnIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3J4X3R4X2J1ZmZlcnMgKHNkbGFfdCAqY2FyZCk7CisKKworLyogRmlybXdhcmUgYXN5bmNocm9ub3VzIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaW50IGZyX2V2ZW50KHNkbGFfdCAqY2FyZCwgaW50IGV2ZW50LCBmcl9tYm94X3QgKm1ib3gpOworc3RhdGljIGludCBmcl9tb2RlbV9mYWlsdXJlKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90ICptYm94KTsKK3N0YXRpYyBpbnQgZnJfZGxjaV9jaGFuZ2Uoc2RsYV90ICpjYXJkLCBmcl9tYm94X3QgKm1ib3gpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCB1cGRhdGVfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0ZSk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZpbmRfY2hhbm5lbChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGRsY2kpOworc3RhdGljIGludCBpc190eF9yZWFkeShzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY190b191aW50KHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IGxlbik7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICk7CisKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQgKTsKK3N0YXRpYyB2b2lkIGluaXRfY2hhbl9zdGF0aXN0aWNzKCBmcl9jaGFubmVsX3QqIGNoYW4gKTsKK3N0YXRpYyB2b2lkIGluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIHNkbGFfdCogY2FyZCApOworc3RhdGljIHZvaWQgcmVhZF9ETENJX0lCX21hcHBpbmcoIHNkbGFfdCogY2FyZCwgZnJfY2hhbm5lbF90KiBjaGFuICk7CitzdGF0aWMgaW50IHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoZWNrX3R4X3N0YXR1cyhzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBGcmFtZSBSZWxheSBTb2NrZXQgQVBJICovCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX2JoIChmcl9jaGFubmVsX3QgKik7CitzdGF0aWMgdm9pZCBmcl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZnJfYmhfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYmhfZW5xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9mcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vc3RhdGljIHZvaWQgYWRkX2dhdGV3YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdW5jb25maWdfZnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bmNvbmZpZ19mciAoc2RsYV90ICopOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2NvbmZpZ19mciAoc2RsYV90ICopOworc3RhdGljIHZvaWQgY29uZmlnX2ZyIChzZGxhX3QgKik7CisKKworLyogSW52ZXJzZSBBUlAgYW5kIER5bmFtaWMgcm91dGluZyBmdW5jdGlvbnMgKi8KK2ludCBwcm9jZXNzX0FSUChhcnBoZHJfMTQ5MF90ICpBcnBQYWNrZXQsIHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgaXNfYXJwKHZvaWQgKmJ1Zik7CitpbnQgc2VuZF9pbmFycF9yZXF1ZXN0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYXJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJfYXJwICh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qIFVkcCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBkbGNpKTsKKworLyogSVBYIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsCisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlciwgdW5zaWduZWQgY2hhciBpbmNvbWluZyk7CisKK3N0YXRpYyBpbnQgaGFuZGxlX0lQWFdBTih1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCBjaGFyICpkZXZuYW1lLAorCXVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWCwgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcik7CisKKy8qIExvY2sgRnVuY3Rpb25zOiBTTVAgc3VwcG9ydGVkICovCit2b2lkIAlzNTA4X3M1MTRfdW5sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3ZvaWQgCXM1MDhfczUxNF9sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworc3RhdGljIGludCBzZXR1cF9mcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqKiBza2IsCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBjaGFyIG9wX21vZGUpOworCisKKy8qKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZyYW1lIHJlbGF5IHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdwZl9pbml0KHNkbGFfdCAqY2FyZCwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKworCWludCBlcnI7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3M7CisKKwl1bmlvbgorCXsKKwkJY2hhciBzdHJbODBdOworCQlmcl9jb25mX3QgY2ZnOworCX0gdTsKKworCWZyX2J1Zl9pbmZvX3QqIGJ1Zl9pbmZvOworCWludCBpOworCisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19GUikgeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwl9CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKwkKKwkJY2FzZSBTRklEX0ZSNTA4OgorCQkJY2FyZC0+bWJveCAgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyAKKwkJCQkJRlI1MDhfTUJPWF9PRkZTKTsKKwkJCWNhcmQtPmZsYWdzID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJCUZSNTA4X0ZMQUdfT0ZGUyk7CisJCQlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQkJCWNhcmQtPm1ib3ggKz0gRlJfTUJfVkVDVE9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5mbGFncyArPSBGUl9NQl9WRUNUT1I7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5pc3IgPSAmZnJfaXNyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBSZWFkIGZpcm13YXJlIHZlcnNpb24uICBOb3RlIHRoYXQgd2hlbiBhZGFwdGVyIGluaXRpYWxpemVzLCBpdAorCSAqIGNsZWFycyB0aGUgbWFpbGJveCwgc28gaXQgbWF5IGFwcGVhciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHdhcworCSAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSB3aGVuIGluIGZhY3QgaXQgd2FzIG1lcmVseSBlcmFzZWQuIFRvIHdvcmsKKwkgKiBhcm91bmQgdGhpcywgd2UgZXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCB0d2ljZS4KKwkgKi8KKworCWlmIChmcl9yZWFkX3ZlcnNpb24oY2FyZCwgTlVMTCkgfHwgZnJfcmVhZF92ZXJzaW9uKGNhcmQsIHUuc3RyKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBmcmFtZSByZWxheSBmaXJtd2FyZSB2JXNcbiIsCisJCWNhcmQtPmRldm5hbWUsIHUuc3RyKTsKKworCS8qIEFkanVzdCBjb25maWd1cmF0aW9uICovCisJY29uZi0+bXR1ICs9IEZSX0hFQURFUl9MRU47CisJY29uZi0+bXR1ID0gKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9GUl9EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIEZSX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUl9DSEFOTkVMX01UVSArIEZSX0hFQURFUl9MRU47CisgICAgIAorCWNvbmYtPmJwcyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+YnBzLCAyMDQ4MDAwKTsKKworCS8qIEluaXRpYWx6ZSB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgc2VudCB0byB0aGUgYm9hcmQgdG8gemVybyAqLworCW1lbXNldCgmdS5jZmcsIDAsIHNpemVvZih1LmNmZykpOworCisJbWVtc2V0KGNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXAsIDAsIHNpemVvZihjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwKSk7CisgCQorCS8qIENvbmZpZ3VyZSBhZGFwdGVyIGZpcm13YXJlICovCisKKwl1LmNmZy5tdHUJPSBjb25mLT5tdHU7CisJdS5jZmcua2Jwcwk9IGNvbmYtPmJwcyAvIDEwMDA7CisKKyAgICAJdS5jZmcuY2lyX2Z3ZCA9IHUuY2ZnLmNpcl9id2QgPSAxNjsKKyAgICAgICAgdS5jZmcuYmNfZndkICA9IHUuY2ZnLmJjX2J3ZCA9IDE2OworCQorCXUuY2ZnLm9wdGlvbnMJPSAweDAwMDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdsb2JhbCBDSVIgZW5hYmxlZCBieSBEZWZhdWx0XG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkKKwlzd2l0Y2ggKGNvbmYtPnUuZnIuc2lnbmFsbGluZykgeworCisJCWNhc2UgV0FOT1BUX0ZSX0FOU0k6CisJCQl1LmNmZy5vcHRpb25zID0gMHgwMDAwOyAKKwkJCWJyZWFrOwkJCisJCisJCWNhc2UgV0FOT1BUX0ZSX1E5MzM6CQorCQkJdS5jZmcub3B0aW9ucyB8PSAweDAyMDA7IAorCQkJYnJlYWs7CisJCisJCWNhc2UgV0FOT1BUX0ZSX0xNSToJCisJCQl1LmNmZy5vcHRpb25zIHw9IDB4MDQwMDsgCisJCQlicmVhazsKKworCQljYXNlIFdBTk9QVF9OTzoKKwkJCXUuY2ZnLm9wdGlvbnMgfD0gMHgwODAwOyAKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElsbGVnYWwgU2lnbmFsbGluZyBvcHRpb25cbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJY2FyZC0+d2FuZGV2LnNpZ25hbGxpbmcgPSBjb25mLT51LmZyLnNpZ25hbGxpbmc7CisKKwlpZiAoY29uZi0+c3RhdGlvbiA9PSBXQU5PUFRfQ1BFKSB7CisKKworCQlpZiAoY29uZi0+dS5mci5zaWduYWxsaW5nID09IFdBTk9QVF9OTyl7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogRVJST1IgLSBGb3IgTk8gc2lnbmFsbGluZywgc3RhdGlvbiBtdXN0IGJlIHNldCB0byBOb2RlISIsCisJCQkJIAkgY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXUuY2ZnLnN0YXRpb24gPSAwOworCQl1LmNmZy5vcHRpb25zIHw9IDB4ODAwMDsJLyogYXV0byBjb25maWcgRExDSSAqLworCQljYXJkLT51LmYuZGxjaV9udW0gID0gMDsKKwkKKwl9IGVsc2UgeworCisJCXUuY2ZnLnN0YXRpb24gPSAxOwkvKiBzd2l0Y2ggZW11bGF0aW9uIG1vZGUgKi8KKworCQkvKiBGb3Igc3dpdGNoIGVtdWxhdGlvbiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGxpc3Qgb2YgZGxjaShzKQorCQkgKiB0aGF0IHdpbGwgYmUgc2VudCB0byBiZSBnbG9iYWwgU0VUX0RMQ0lfQ09ORklHVVJBVElPTiAKKwkJICogY29tbWFuZCBpbiBmcl9jb25maWd1cmUoKSByb3V0aW5lLiAKKwkJICovCisKKwkJY2FyZC0+dS5mLmRsY2lfbnVtICA9IG1pbl90KHVuc2lnbmVkIGludCwgbWF4X3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLmRsY2lfbnVtLCAxKSwgMTAwKTsKKwkKKwkJZm9yICggaSA9IDA7IGkgPCBjYXJkLT51LmYuZGxjaV9udW07IGkrKykgeworCisJCQljYXJkLT51LmYubm9kZV9kbGNpW2ldID0gKHVuc2lnbmVkIHNob3J0KSAKKwkJCQljb25mLT51LmZyLmRsY2lbaV0gPyBjb25mLT51LmZyLmRsY2lbaV0gOiAxNjsKKwkKKwkJfQorCX0KKworCWlmIChjb25mLT5jbG9ja2luZyA9PSBXQU5PUFRfSU5URVJOQUwpCisJCXUuY2ZnLnBvcnQgfD0gMHgwMDAxOworCisJaWYgKGNvbmYtPmludGVyZmFjZSA9PSBXQU5PUFRfUlMyMzIpCisJCXUuY2ZnLnBvcnQgfD0gMHgwMDAyOworCisJaWYgKGNvbmYtPnUuZnIudDM5MSkKKwkJdS5jZmcudDM5MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci50MzkxLCAzMCk7CisJZWxzZQorCQl1LmNmZy50MzkxID0gNTsKKworCWlmIChjb25mLT51LmZyLnQzOTIpCisJCXUuY2ZnLnQzOTIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIudDM5MiwgMzApOworCWVsc2UKKwkJdS5jZmcudDM5MiA9IDE1OworCisJaWYgKGNvbmYtPnUuZnIubjM5MSkKKwkJdS5jZmcubjM5MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci5uMzkxLCAyNTUpOworCWVsc2UKKwkJdS5jZmcubjM5MSA9IDI7CisKKwlpZiAoY29uZi0+dS5mci5uMzkyKQorCQl1LmNmZy5uMzkyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLm4zOTIsIDEwKTsKKwllbHNlCisJCXUuY2ZnLm4zOTIgPSAzOwkKKworCWlmIChjb25mLT51LmZyLm4zOTMpCisJCXUuY2ZnLm4zOTMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIubjM5MywgMTApOworCWVsc2UKKwkJdS5jZmcubjM5MyA9IDQ7CisKKwlpZiAoZnJfY29uZmlndXJlKGNhcmQsICZ1LmNmZykpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCisgICAgICAgICAgICAgICAgYnVmX2luZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBGUl9NQl9WRUNUT1IgKworCQkJRlI1MDhfUlhCQ19PRkZTKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnJ4bWIgPSAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfbmV4dCArIGNhcmQtPmh3LmRwbWJhc2UpOworCisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArIGNhcmQtPmh3LmRwbWJhc2UpOyAKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2xhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9ZWxzZXsJCisJCWJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlI1MDhfUlhCQ19PRkZTKTsKKworCQljYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgLQorCQkJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisJCQorCQljYXJkLT51LmYucnhtYl9iYXNlID0KKwkJCSh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfbGFzdCA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArCisJCQkoYnVmX2luZm8tPnJzZV9udW0gLSAxKSAqIHNpemVvZihmcl9yeF9idWZfY3RsX3QpIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCX0KKworCWNhcmQtPnUuZi5yeF9iYXNlID0gYnVmX2luZm8tPmJ1Zl9iYXNlOworCWNhcmQtPnUuZi5yeF90b3AgID0gYnVmX2luZm8tPmJ1Zl90b3A7CisKKwljYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nID0gMDsKKworCWNhcmQtPndhbmRldi5tdHUJPSBjb25mLT5tdHU7CisJY2FyZC0+d2FuZGV2LmJwcwk9IGNvbmYtPmJwczsKKwljYXJkLT53YW5kZXYuaW50ZXJmYWNlCT0gY29uZi0+aW50ZXJmYWNlOworCWNhcmQtPndhbmRldi5jbG9ja2luZwk9IGNvbmYtPmNsb2NraW5nOworCWNhcmQtPndhbmRldi5zdGF0aW9uCT0gY29uZi0+c3RhdGlvbjsKKwljYXJkLT5wb2xsCQk9IE5VTEw7IAorCWNhcmQtPmV4ZWMJCT0gJndwZl9leGVjOworCWNhcmQtPndhbmRldi51cGRhdGUJPSAmdXBkYXRlOworCWNhcmQtPndhbmRldi5uZXdfaWYJPSAmbmV3X2lmOworCWNhcmQtPndhbmRldi5kZWxfaWYJPSAmZGVsX2lmOworCWNhcmQtPndhbmRldi5zdGF0ZQk9IFdBTl9ESVNDT05ORUNURUQ7CisJY2FyZC0+d2FuZGV2LnR0bAk9IGNvbmYtPnR0bDsKKyAgICAgICAgY2FyZC0+d2FuZGV2LnVkcF9wb3J0IAk9IGNvbmYtPnVkcF9wb3J0OyAgICAgICAKKwljYXJkLT5kaXNhYmxlX2NvbW0JPSAmZGlzYWJsZV9jb21tOwkKKwljYXJkLT51LmYuYXJwX2RldiAJPSBOVUxMOworCisJLyogSW50aWFsaXplIGdsb2JhbCBzdGF0aXN0aWNzIGZvciBhIGNhcmQgKi8KKwlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBjYXJkICk7CisKKyAgICAgICAgY2FyZC0+VHJhY2luZ0VuYWJsZWQgICAgICAgICAgPSAwOworCisJLyogSW50ZXJydXB0IFRlc3QgKi8KKwlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisJY2FyZC0+aW50cl9tb2RlID0gSU5UUl9URVNUX01PREU7CisJZXJyID0gaW50cl90ZXN0KCBjYXJkICk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRW5kIG9mIEludGVycnVwdCBUZXN0IHJjPTB4JXggIGNvdW50PSVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxlcnIsSW50cl90ZXN0X2NvdW50ZXIpOyAKKwkKKwlpZiAoZXJyIHx8IChJbnRyX3Rlc3RfY291bnRlciA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJydXB0IFRlc3QgRmFpbGVkLCBDb3VudGVyOiAlaVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCXByaW50ayhLRVJOX0VSUiAiUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIik7CisJCWVyciA9IC1FSU87CisJCXJldHVybiBlcnI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCBUZXN0IFBhc3NlZCwgQ291bnRlcjogJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisKKworCS8qIEFwciAyOCAyMDAwLiBOZW5hZCBDb3JiaWMKKwkgKiBFbmFibGUgY29tbW51bmljYXRpb25zIGhlcmUsIG5vdCBpbiBpZl9vcGVuIG9yIG5ld19pZiwgc2luY2UKKyAgICAgICAgICogaW50ZXJmYWNlcyBjb21lIGRvd24gd2hlbiB0aGUgbGluayBpcyBkaXNjb25uZWN0ZWQuIAorICAgICAgICAgKi8KKwkgCisJLyogSWYgeW91IGVuYWJsZSBjb21tcyBhbmQgdGhlbiBzZXQgaW50cywgeW91IGdldCBhIFR4IGludCBhcyB5b3UKKwkgKiBwZXJmb3JtIHRoZSBTRVRfSU5UX1RSSUdHRVJTIGNvbW1hbmQuIFNvLCB3ZSBvbmx5IHNldCBpbnQKKwkgKiB0cmlnZ2VycyBhbmQgdGhlbiBhZGp1c3QgdGhlIGludGVycnVwdCBtYXNrICh0byBkaXNhYmxlIFR4IGludHMpCisJICogYmVmb3JlIGVuYWJsaW5nIGNvbW1zLiAKKwkgKi8JCisgICAgICAgIGlmIChmcl9zZXRfaW50cl9tb2RlKGNhcmQsIChGUl9JTlRSX1JYUkRZIHwgRlJfSU5UUl9UWFJEWSB8CisJCUZSX0lOVFJfRExDIHwgRlJfSU5UUl9USU1FUiB8IEZSX0lOVFJfVFhfTVVMVF9ETENJcykgLAorCQljYXJkLT53YW5kZXYubXR1LCAwKSkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmbGFncy0+aW1hc2sgJj0gfihGUl9JTlRSX1RYUkRZIHwgRlJfSU5UUl9USU1FUik7CisgCisJaWYgKGZyX2NvbW1fZW5hYmxlKGNhcmQpKSB7CisJCXJldHVybiAtRUlPOworCX0JCisJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RFRCk7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCQorCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBkZXZpY2Ugc3RhdHVzICYgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldikKK3sKKwl2b2xhdGlsZSBzZGxhX3QqIGNhcmQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKworCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAxOworCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCWZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOworICAgICAgIAl0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAJZm9yKDs7KSB7CisJCWlmKGNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPT0gMCkKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gKDEgKiBIWikpeworICAgIAkJCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworIAkJCXJldHVybiAtRUFHQUlOOworCQl9CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlmcl9jaGFubmVsX3QqIGNoYW47CisJaW50IGRsY2kgPSAwOworCWludCBlcnIgPSAwOworCisJCisJaWYgKChjb25mLT5uYW1lWzBdID09ICdcMCcpIHx8IChzdHJsZW4oY29uZi0+bmFtZSkgPiBXQU5fSUZOQU1FX1NaKSkgeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoYW4gPSBrbWFsbG9jKHNpemVvZihmcl9jaGFubmVsX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGFuID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNoYW4sIDAsIHNpemVvZihmcl9jaGFubmVsX3QpKTsKKwlzdHJjcHkoY2hhbi0+bmFtZSwgY29uZi0+bmFtZSk7CisJY2hhbi0+Y2FyZCA9IGNhcmQ7CisKKwkvKiB2ZXJpZnkgbWVkaWEgYWRkcmVzcyAqLworCWlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSkgeworCisJCWRsY2kgPSBkZWNfdG9fdWludChjb25mLT5hZGRyLCAwKTsKKworCQlpZiAoZGxjaSAmJiAoZGxjaSA8PSBISUdIRVNUX1ZBTElEX0RMQ0kpKSB7CisJCQorCQkJY2hhbi0+ZGxjaSA9IGRsY2k7CisJCQorCQl9IGVsc2UgeworCQkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogSW52YWxpZCBETENJICV1IG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBkbGNpLCBjaGFuLT5uYW1lKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBJbnZhbGlkIG1lZGlhIGFkZHJlc3Mgb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYgKChjaGFuLT50cnVlX2lmX2VuY29kaW5nID0gY29uZi0+dHJ1ZV9pZl9lbmNvZGluZykgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IEVuYWJsaW5nLCB0cnVlIGludGVyZmFjZSB0eXBlIGVuY29kaW5nLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCX0KKwkKKworCisgICAgLyogU2V0dXAgd2FucGlwZSBhcyBhIHJvdXRlciAoV0FOUElQRSkgZXZlbiBpZiBpdCBpcworCSAqIGEgYnJpZGdlZCBETENJLCBvciBhcyBhbiBBUEkgCisJICovCisgICAgICAgIGlmIChzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpICA9PSAwICB8fCAKKwkgICAgc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRSIpICAgPT0gMCAgfHwKKwkgICAgc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRV9OIikgPT0gMCl7CisJCQorCQlpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApeworCQkJY2hhbi0+Y29tbW9uLnVzZWRieSA9IFdBTlBJUEU7CisJCQkKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSBtb2RlLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCisJCX1lbHNlIGlmKHN0cmNtcChjb25mLT51c2VkYnksICJCUklER0UiKSA9PSAwKXsKKwkJCQorCQkJY2hhbi0+Y29tbW9uLnVzZWRieSA9IEJSSURHRTsKKwkJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSAoQlJJREdFKSBtb2RlLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZSBpZiggc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRV9OIikgPT0gMCApeworCQkJCisJCQljaGFuLT5jb21tb24udXNlZGJ5ID0gQlJJREdFX05PREU7CisJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSAoQlJJREdFX05PREUpIG1vZGUuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKworCQlpZiAoIWVycil7CisJCQkvKiBEeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIG9wdGlvbi4KKwkJCSAqIE9uIGRpc2Nvbm5lY3QsIGlmIHRoZSBvcHRpb25zIGlzIHNlbGVjdGVkLAorCQkJICogdGhlIGludGVyZmFjZSB3aWxsIGJlIGJyb3VnaHQgZG93biAqLworCQkJaWYgKGNvbmYtPmlmX2Rvd24gPT0gV0FOT1BUX1lFUyl7IAorCQkJCXNldF9iaXQoRFlOX09QVF9PTiwmY2hhbi0+aW50ZXJmYWNlX2Rvd24pOworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJICAgICIlczogRHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBlbmFibGVkLlxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKworICAgICAgICB9IGVsc2UgaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIkFQSSIpID09IDApeworCisgICAgICAgICAgICAgICAgY2hhbi0+Y29tbW9uLnVzZWRieSA9IEFQSTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBBUEkgbW9kZS5cbiIsCisJCQl3YW5kZXYtPm5hbWUpOworICAgICAgICB9CisKKwlpZiAoZXJyKSB7CisJCQorCQlrZnJlZShjaGFuKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwbGFjZSBjaXIsYmUsYmMgYW5kIG90aGVyIGNoYW5uZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB0aGUKKwkgKiBjaGFuIHN0cnVjdHVyZSAKKyAgICAgICAgICovCisJaWYgKGNvbmYtPmNpcikgeworCisJCWNoYW4tPmNpciA9IG1heF90KHVuc2lnbmVkIGludCwgMSwKKwkJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmNpciwgNTEyKSk7CisJCWNoYW4tPmNpcl9zdGF0dXMgPSBDSVJfRU5BQkxFRDsgCisKKwkJCisJCS8qIElmIENJUiBpcyBlbmFibGVkLCBmb3JjZSBCQyB0byBlcXVhbCBDSVIKKyAgICAgICAgICAgICAgICAgKiB0aGlzIHNvbHZlcyBudW1iZXIgb2YgcG90ZW50aWFsIHByb2JsZW1zIGlmIENJUiBpcyAKKyAgICAgICAgICAgICAgICAgKiBzZXQgYW5kIEJDIGlzIG5vdCAKKwkJICovCisJCWNoYW4tPmJjID0gY2hhbi0+Y2lyOworCisJCWlmIChjb25mLT5iZSl7CisJCQljaGFuLT5iZSA9IG1heF90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgICAgMCwgbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5iZSwgNTExKSk7CisJCX1lbHNlewkKKwkJCWNvbmYtPmJlID0gMDsKKwkJfQorCisJCXByaW50ayAoS0VSTl9JTkZPICIlczogQ0lSIGVuYWJsZWQgZm9yIERMQ0kgJWkgXG4iLAorCQkJCXdhbmRldi0+bmFtZSxjaGFuLT5kbGNpKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAgICAgQ0lSID0gJWkgOyBCQyA9ICVpIDsgQkUgPSAlaVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsY2hhbi0+Y2lyLGNoYW4tPmJjLGNoYW4tPmJlKTsKKworCisJfWVsc2V7CisJCWNoYW4tPmNpcl9zdGF0dXMgPSBDSVJfRElTQUJMRUQ7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogQ0lSIGRpc2FibGVkIGZvciBETENJICVpXG4iLAorCQkJCXdhbmRldi0+bmFtZSxjaGFuLT5kbGNpKTsKKwl9CisKKwljaGFuLT5tYyA9IGNvbmYtPm1jOworCisJaWYgKGNvbmYtPmluYXJwID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52ZXJzZSBBUlAgU3VwcG9ydCBFbmFibGVkXG4iLGNhcmQtPmRldm5hbWUpOworCQljaGFuLT5pbmFycCA9IGNvbmYtPmluYXJwID8gSU5BUlBfUkVRVUVTVCA6IElOQVJQX05PTkU7CisJCWNoYW4tPmluYXJwX2ludGVydmFsID0gY29uZi0+aW5hcnBfaW50ZXJ2YWwgPyBjb25mLT5pbmFycF9pbnRlcnZhbCA6IDEwOworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52ZXJzZSBBUlAgU3VwcG9ydCBEaXNhYmxlZFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJY2hhbi0+aW5hcnAgPSBJTkFSUF9OT05FOworCQljaGFuLT5pbmFycF9pbnRlcnZhbCA9IDEwOworCX0KKworCisJY2hhbi0+ZGxjaV9jb25maWd1cmVkID0gRExDSV9OT1RfQ09ORklHVVJFRDsJCisKKworCS8qRklYTUU6IElQWCBkaXNhYmxlZCBpbiB0aGlzIFdBTlBJUEUgdmVyc2lvbiAqLworCWlmIChjb25mLT5lbmFibGVfSVBYID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IgLSBUaGlzIHZlcnNpb24gb2YgV0FOUElQRSBkb2Vzbid0IHN1cHBvcnQgSVBYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlrZnJlZShjaGFuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfWVsc2V7CisJCWNoYW4tPmVuYWJsZV9JUFggPSBXQU5PUFRfTk87CisJfQkKKworCWlmIChjb25mLT5uZXR3b3JrX251bWJlcil7CisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJfWVsc2V7CisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gMHhERUFEQkVFRjsKKwl9CisKKwljaGFuLT5yb3V0ZV9mbGFnID0gTk9fUk9VVEU7CisJCisJaW5pdF9jaGFuX3N0YXRpc3RpY3MoY2hhbik7CisKKwljaGFuLT50cmFuc21pdF9sZW5ndGggPSAwOworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLGNoYW4tPm5hbWUpOworCQorCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoYW47CisKKwkvKiBJbml0aWFsaXplIEZSIFBvbGxpbmcgVGFzayBRdWV1ZQorICAgICAgICAgKiBXZSBuZWVkIGEgcG9sbCByb3V0aW5lIGZvciBlYWNoIG5ldHdvcmsKKyAgICAgICAgICogaW50ZXJmYWNlLiAKKyAgICAgICAgICovCisJSU5JVF9XT1JLKCZjaGFuLT5mcl9wb2xsX3dvcmssICh2b2lkICopZnJfcG9sbCwgZGV2KTsKKworCWluaXRfdGltZXIoJmNoYW4tPmZyX2FycF90aW1lcik7CisJY2hhbi0+ZnJfYXJwX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpZGV2OworCWNoYW4tPmZyX2FycF90aW1lci5mdW5jdGlvbiA9IGZyX2FycDsKKworCXdhbmRldi0+bmV3X2lmX2NudCsrOworCisJLyogVGVsbHMgdXMgdGhhdCBpZiB0aGlzIGludGVyZmFjZSBpcyBhCisgICAgICAgICAqIGdhdGV3YXkgb3Igbm90ICovCisJaWYgKChjaGFuLT5nYXRld2F5ID0gY29uZi0+Z2F0ZXdheSkgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgc2V0IGFzIGEgZ2F0ZXdheS5cbiIsCisJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJfQorCisJLyogTS4gR3JhbnQgUGF0Y2ggQXByIDI4IDIwMDAgCisgICAgICAgICAqIERpc2FsbG93IGR1cGxpY2F0ZSBkbGNpIGNvbmZpZ3VyYXRpb25zLiAqLworCWlmIChjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwW2NoYW4tPmRsY2ldICE9IE5VTEwpIHsKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogQ29uZmlndXJlIHRoaXMgZGxjaSBhdCBhIGxhdGVyIGRhdGUsIHdoZW4KKyAgICAgICAgICogdGhlIGludGVyZmFjZSBjb21lcyB1cC4gaS5lLiB3aGVuIGlmX29wZW4oKSAKKyAgICAgICAgICogZXhlY3V0ZXMgKi8KKwlzZXRfYml0KDAsJmNoYW4tPmNvbmZpZ19kbGNpKTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqLworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCS8qIFRoaXMgaW50ZXJmYWNlIGlzIGRlYWQsIG1ha2Ugc3VyZSB0aGUgCisJICogQVJQIHRpbWVyIGlzIHN0b3BwZWQgKi8KKwlkZWxfdGltZXIoJmNoYW4tPmZyX2FycF90aW1lcik7CisJCisJLyogSWYgd2UgYXJlIGEgTk9ERSwgd2UgbXVzdCB1bmNvbmZpZ3VyZSB0aGlzIERMQ0kKKwkgKiBUcmlnZ2VyIGFuIHVuY29uZmlndXJlIGNvbW1hbmQgdGhhdCB3aWxsCisJICogYmUgZXhlY3V0ZWQgaW4gdGltZXIgaW50ZXJydXB0LiBXZSBtdXN0IHdhaXQKKwkgKiBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUuICovCisJdHJpZ2dlcl91bmNvbmZpZ19mcihkZXYpOworCisJbG9ja19hZGFwdGVyX2lycSgmd2FuZGV2LT5sb2NrLCAmc21wX2ZsYWdzKTsKKwl3YW5kZXYtPm5ld19pZl9jbnQtLTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZGlzYWJsZV9jb21tCisgKgorICogRGVzY3JpcHRpb246CisgKglEaXNhYmxlIGNvbW11bmljYXRpb25zLgorICogCVRoaXMgY29kZSBydW5zIGluIHNodXRkb3duIChzZGxhbWFpbi5jKQorICogICAgICB1bmRlciBjcml0aWNhbCBmbGFnLiBUaGVyZWZvcmUgaXQgaXMgbm90CisgKiAgICAgIG5lY2Vzc2FyeSB0byBzZXQgYSBjcml0aWNhbCBmbGFnIGhlcmUgCisgKgorICogVXNhZ2U6CisgKiAJQ29tbW51bmljYXRpb25zIGFyZSBkaXNhYmxlZCBvbmx5IG9uIGEgY2FyZAorICogICAgICBzaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogRGlzYWJsaW5nIENvbW11bmljYXRpb25zIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCWZyX2NvbW1fZGlzYWJsZShjYXJkKTsKK30KKworLyoqKioqKiBXQU5QSVBFLXNwZWNpZmljIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXhlY3V0ZSBhZGFwdGVyIGludGVyZmFjZSBjb21tYW5kLgorICovCitzdGF0aWMgaW50IHdwZl9leGVjIChzdHJ1Y3Qgc2RsYSogY2FyZCwgdm9pZCogdV9jbWQsIHZvaWQqIHVfZGF0YSkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVyciwgbGVuOworCWZyX2NtZF90IGNtZDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmY21kLCB1X2NtZCwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwkvKiBleGVjdXRlIGNvbW1hbmQgKi8KKwlkbworCXsKKwkJbWVtY3B5KCZtYm94LT5jbWQsICZjbWQsIHNpemVvZihjbWQpKTsKKwkJCisJCWlmIChjbWQubGVuZ3RoKXsKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmRhdGEsIHVfZGF0YSwgY21kLmxlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJCisJCWlmIChzZGxhX2V4ZWMobWJveCkpCisJCQllcnIgPSBtYm94LT5jbWQucmVzdWx0OworCisJCWVsc2UgcmV0dXJuIC1FSU87CisJCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkvKiByZXR1cm4gcmVzdWx0ICovCisJaWYgKGNvcHlfdG9fdXNlcih1X2NtZCwgKHZvaWQqKSZtYm94LT5jbWQsIHNpemVvZihmcl9jbWRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisKKwlpZiAobGVuICYmIHVfZGF0YSAmJiAhY29weV90b191c2VyKHVfZGF0YSwgKHZvaWQqKSZtYm94LT5kYXRhLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSB8fCBjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisKKwkJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJCWlmIChjaGFuLT50cnVlX2lmX2VuY29kaW5nKXsKKwkJCWRldi0+dHlwZSAJCT0gQVJQSFJEX0RMQ0k7ICAvKiBUaGlzIGJyZWFrcyB0Y3BkdW1wICovCisJCX1lbHNleworCQkJZGV2LT50eXBlCQk9IEFSUEhSRF9QUFA7IAkvKiBBUlAgaC93IHR5cGUgKi8KKwkJfQorCQkKKwkJZGV2LT5mbGFncwkJfD0gSUZGX1BPSU5UT1BPSU5UOworCQlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwkJLyogRW5hYmxlIE11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCWlmIChjaGFuLT5tYyA9PSBXQU5PUFRfWUVTKXsKKwkJCWRldi0+ZmxhZ3MgCXw9IElGRl9NVUxUSUNBU1Q7CisJCX0KKworCQlkZXYtPm10dQkJPSB3YW5kZXYtPm10dSAtIEZSX0hFQURFUl9MRU47CisJCS8qIEZvciBhbiBBUEksIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBzdGFjayB3aWxsIHBhc3MKKwkJICAgdG8gdGhlIGRyaXZlciBpcyAoZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbikuIFNvLCBhZGp1c3QgdGhlCisJCSAgIG10dSBzbyB0aGF0IGEgZnJhbWUgb2YgbWF4aW11bSBzaXplIGNhbiBiZSB0cmFuc21pdHRlZCBieSB0aGUgQVBJLiAKKwkJKi8KKwkJaWYoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpIHsKKwkJCWRldi0+bXR1ICs9IChzaXplb2YoYXBpX3R4X2hkcl90KSAtIEZSX0hFQURFUl9MRU4pOworCQl9CisJCQorCQlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IEZSX0hFQURFUl9MRU47LyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCQlkZXYtPmFkZHJfbGVuCQk9IDI7IAkJLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKwkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmRsY2kpOworCisJCS8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisgICAgICAgIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKworCX1lbHNleworCisJCS8qIFNldHVwIHRoZSBpbnRlcmZhY2UgZm9yIEJyaWRnaW5nICovCisJCWludCBod19hZGRyPTA7CisJCWV0aGVyX3NldHVwKGRldik7CisJCQorCQkvKiBVc2UgYSByYW5kb20gbnVtYmVyIHRvIGdlbmVyYXRlIHRoZSBNQUMgYWRkcmVzcyAqLworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgIlx4RkVceEZDXHgwMFx4MDBceDAwXHgwMCIsIDYpOworCQlnZXRfcmFuZG9tX2J5dGVzKCZod19hZGRyLCBzaXplb2YoaHdfYWRkcikpOworCQkqKGludCAqKShkZXYtPmRldl9hZGRyICsgMikgKz0gaHdfYWRkcjsKKwl9CisJCQorCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVycyAoanVzdCBmb3IgcmVmZXJlbmNlKSAqLworCWRldi0+aXJxCT0gd2FuZGV2LT5pcnE7CisJZGV2LT5kbWEJPSB3YW5kZXYtPmRtYTsKKwlkZXYtPmJhc2VfYWRkcgk9IHdhbmRldi0+aW9wb3J0OworCWRldi0+bWVtX3N0YXJ0CT0gd2FuZGV2LT5tYWRkcjsKKwlkZXYtPm1lbV9lbmQJPSB3YW5kZXYtPm1hZGRyICsgd2FuZGV2LT5tc2l6ZSAtIDE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3BlbiBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gaWYgdGhpcyBpcyB0aGUgZmlyc3Qgb3BlbiwgdGhlbiBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgdGFzayBxdWV1ZSAqLworCWNoYW4tPnRxX3dvcmtpbmc9MDsKKworCUlOSVRfV09SSygmY2hhbi0+Y29tbW9uLndhbnBpcGVfd29yaywgKHZvaWQgKilmcl9iaCwgZGV2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEJIIGNpcmN1bGFyIGJ1ZmZlciAqLworCWNoYW4tPmJoX2hlYWQgPSBrbWFsbG9jKChzaXplb2YoYmhfZGF0YV90KSpNQVhfQkhfQlVGRiksR0ZQX0FUT01JQyk7CisJbWVtc2V0KGNoYW4tPmJoX2hlYWQsMCwoc2l6ZW9mKGJoX2RhdGFfdCkqTUFYX0JIX0JVRkYpKTsKKwlhdG9taWNfc2V0KCZjaGFuLT5iaF9idWZmX3VzZWQsIDApOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXdhbnBpcGVfb3BlbihjYXJkKTsKKwlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCWNoYW4tPnJvdXRlcl9zdGFydF90aW1lID0gdHYudHZfc2VjOworCQorCWlmICh0ZXN0X2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSkpeworCQl0cmlnZ2VyX2NvbmZpZ19mciAoY2FyZCk7CisJfWVsc2UgaWYgKGNoYW4tPmluYXJwID09IElOQVJQX1JFUVVFU1QpeworCQl0cmlnZ2VyX2ZyX2FycChkZXYpOworCX0KKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW4sIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmIChjaGFuLT5pbmFycCA9PSBJTkFSUF9DT05GSUdVUkVEKSB7CisJCWNoYW4tPmluYXJwID0gSU5BUlBfUkVRVUVTVDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2FucGlwZV9jbG9zZShjYXJkKTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBSZXR1cm46CTEJcGh5c2ljYWwgYWRkcmVzcyByZXNvbHZlZC4KKyAqCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKi8KK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlYnVpbGRfaGVhZGVyKCkgY2FsbGVkIGZvciBpbnRlcmZhY2UgJXMhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCS8qIElmIG91ciBkZXZpY2Ugc3RheXMgYnVzeSBmb3IgYXQgbGVhc3QgNSBzZWNvbmRzIHRoZW4gd2Ugd2lsbAorCSAqIGtpY2sgc3RhcnQgdGhlIGRldmljZSBieSBtYWtpbmcgZGV2LT50YnVzeSA9IDAuICBXZSBleHBlY3QKKwkgKiB0aGF0IG91ciBkZXZpY2UgbmV2ZXIgc3RheXMgYnVzeSBtb3JlIHRoYW4gNSBzZWNvbmRzLiBTbyB0aGlzICAgICAgICAgICAgICAgICAKKwkgKiBpcyBvbmx5IHVzZWQgYXMgYSBsYXN0IHJlc29ydC4KKwkgKi8KKworCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF90YnVzeSsrOworCSsrY2hhbi0+aWZzdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfdGJ1c3lfdGltZW91dCsrOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gc2V0IHRidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pIHRvIGJsb2NrIGEgdGltZXItYmFzZWQKKyAqICAgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKyAqIG8gc2V0IGNyaXRpY2FsIGZsYWcgd2hlbiBhY2Nlc3NpbmcgYm9hcmQuCisgKiBvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIG8gY2hlY2sgY2hhbm5lbCBzdGF0dXMuIElmIGl0J3MgZG93biB0aGVuIGluaXRpYXRlIGEgY2FsbC4KKyAqIG8gcGFzcyBhIHBhY2tldCB0byBjb3JyZXNwb25kaW5nIFdBTiBkZXZpY2UuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIAorICogMi4gVXNpbmcgbmV0aWZfc3RhcnRfcXVldWUoKSBhbmQgbmV0aWZfc3RvcF9xdWV1ZSgpCisgKiAgICB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZSBwcm90b2NvbCBzdGFjayAKKyAqICAgIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworICAgIAlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisgICAgCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisgICAgICAgIGludCBlcnI7CisgICAgCXVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQ7CisgICAgCWZyNTA4X2ZsYWdzX3QqIGFkcHRyX2ZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJaW50IHVkcF90eXBlOworCWxvbmcgZGVsYXlfdHhfcXVldWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFncz0wOworCXVuc2lnbmVkIGNoYXIgYXR0ciA9IDA7CisKKwljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZW50cnkrKzsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKyAgICAgICAgaWYgKHNrYiA9PSBOVUxMKSB7ICAgICAgICAgICAgIAorCQkvKiBpZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGF5ZXIgdGhpbmtzIHdlJ3ZlIG1pc3NlZCBhbgorCQkgKiB0eC1kb25lIGludGVycnVwdC4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXMgZ290IGtpY2tlZCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3NrYl9udWxsICsrOworCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgYSBwZXJpcGhlcmFsIHRhc2sgaXMgcnVubmluZyBqdXN0IGRyb3AgcGFja2V0cyAqLworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsICZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBpbiBpZl9zZW5kKCk6IFBlcmlwaGVyYWwgcnVubmluZyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBtdXN0IHNldCB0aGUgJ3RidXN5JyBmbGFnIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBhY2tldCBxdWV1ZWQgZm9yCisJICAgdHJhbnNtaXNzaW9uIGluIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4gSG93ZXZlciwgd2UgbXVzdAorCSAgIGVuc3VyZSB0aGF0IHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgZG9lcyBub3QgcmVzZXQgdGhlICd0YnVzeScgZmxhZworCSAgIGp1c3QgYmVmb3JlIHdlIHNldCBpdCwgYXMgdGhpcyB3aWxsIHJlc3VsdCBpbiBhICJ0cmFuc21pdCB0aW1lb3V0Ii4KKwkqLworCXNldF9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisgICAgICAgIGlmKGNoYW4tPnRyYW5zbWl0X2xlbmd0aCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWNoYW4tPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisgCQljbGVhcl9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybiAxOworCX0KKyAgICAgICAJY2xlYXJfYml0KFNFTkRfVFhJUlFfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworIAorCS8qIE1vdmUgdGhlIGlmX2hlYWRlcigpIGNvZGUgdG8gaGVyZS4gQnkgaW5zZXJ0aW5nIGZyYW1lCisJICogcmVsYXkgaGVhZGVyIGluIGlmX2hlYWRlcigpIHdlIHdvdWxkIGJyZWFrIHRoZQorCSAqIHRjcGR1bXAgYW5kIG90aGVyIHBhY2tldCBzbmlmZmVycyAqLworCWNoYW4tPmZyX2hlYWRlcl9sZW4gPSBzZXR1cF9mcl9oZWFkZXIoJnNrYixkZXYsY2hhbi0+Y29tbW9uLnVzZWRieSk7CisJaWYgKGNoYW4tPmZyX2hlYWRlcl9sZW4gPCAwICl7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJCisJCXJldHVybiAwOworCX0KKworCXNlbmRwYWNrZXQgPSBza2ItPmRhdGE7CisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZShza2IsIGNhcmQpOworCisgICAgICAgIGlmKHVkcF90eXBlICE9IFVEUF9JTlZBTElEX1RZUEUpIHsKKwkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KHVkcF90eXBlLCBVRFBfUEtUX0ZSTV9TVEFDSywgY2FyZCwgc2tiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+ZGxjaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkcHRyX2ZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkcF90eXBlID09IFVEUF9GUElQRV9UWVBFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJaWZfc2VuZF9QSVBFX3JlcXVlc3QgKys7CisJCQl9CisgICAgICAgICAgICAgICAgfQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvL0ZJWE1FOiBjYW4gd2UgZG8gYmV0dGVyIHRoYW4gc2VuZHBhY2tldFsyXT8KKyAgCWlmICgoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKSAmJiAoc2VuZHBhY2tldFsyXSA9PSAweDQ1KSkgeworCQkKKyAgICAgICAgICAgICAgIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIGlzIGEgYnJvYWRjYXN0IG9yICovCisgICAgICAgICAgICAgICAgLyogbXVsdGljYXN0IElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBpZihjaGtfYmNhc3RfbWNhc3RfYWRkcihjYXJkLCBkZXYsIHNrYikpeworICAgICAgICAgICAgCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICAgICAgICAgCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkKKwkvKiBMb2NrIHRoZSBTNTE0L1M1MDggY2FyZDogU01QIFN1cHBvcnRlZCAqLworICAgIAlzNTA4X3M1MTRfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9jcml0aWNhbF9ub25fSVNSICsrOworCQljaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQgKys7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIENyaXRpY2FsIGluIElGX1NFTkQ6IGlmX3NlbmQoKSBhbHJlYWR5IHJ1bm5pbmchXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZ290byBpZl9zZW5kX3N0YXJ0X2FuZF9leGl0OworCX0KKwkKKwkvKiBBUEkgcGFja2V0IGNoZWNrOiBtaW5pbXVtIHBhY2tldCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIAorCSAqIDE2IGJ5dGUgQVBJIGhlYWRlciAqLworCWlmKChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgJiYgKHNrYi0+bGVuIDw9IHNpemVvZihhcGlfdHhfaGRyX3QpKSkgeworCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkgICAgCisJCQorCQlnb3RvIGlmX3NlbmRfc3RhcnRfYW5kX2V4aXQ7CisKKyAJfWVsc2V7CisJCS8qIER1cmluZyBBUEkgdHJhbnNtaXNzaW9uLCBnZXQgcmlkIG9mIHRoZSBBUEkgaGVhZGVyICovCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgeworCQkJYXBpX3R4X2hkcl90KiBhcGlfdHhfaGRyOworCQkJYXBpX3R4X2hkciA9IChhcGlfdHhfaGRyX3QqKSZza2ItPmRhdGFbMHgwMF07CisJCQlhdHRyID0gYXBpX3R4X2hkci0+YXR0cjsKKwkJCXNrYl9wdWxsKHNrYixzaXplb2YoYXBpX3R4X2hkcl90KSk7CisJCX0KKwl9CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpIHsKKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3dhbl9kaXNjb25uZWN0ZWQgKys7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkKKwl9IGVsc2UgaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKSB7CisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9kbGNpX2Rpc2Nvbm5lY3RlZCArKzsKKworCQkvKiBVcGRhdGUgdGhlIERMQ0kgc3RhdGUgaW4gdGltZXIgaW50ZXJydXB0ICovCisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFX1NUQVRFOwkKKwkJYWRwdHJfZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVElNRVI7CisKKyAgICAgICAgCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCisJfSBlbHNlIGlmICghaXNfdHhfcmVhZHkoY2FyZCwgY2hhbikpIHsKKwkJLyogTm8gdHggYnVmZmVycyBhdmFpbGFibGUsIHN0b3JlIGZvciBkZWxheWVkIHRyYW5zbWl0ICovCisJCWlmICghc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoZGV2LCBza2IpKXsKKwkJCXNldF9iaXQoMSwmZGVsYXlfdHhfcXVldWVkKTsKKwkJfQorCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfbm9fYmZycysrOworCQkKKwl9IGVsc2UgaWYgKCFza2ItPnByb3RvY29sKSB7CisJCS8qIE5vIHByb3RvY29scyBkcm9wIHBhY2tldCAqLworCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfcHJvdG9jb2xfZXJyb3IgKys7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Vycm9yczsKKwkKKwl9IGVsc2UgaWYgKHRlc3RfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJLyogV2UgYXJlIHRyeWluZyB0byBzZW5kIGFuIEFSUCBQYWNrZXQsIGJsb2NrIElQIGRhdGEgdW50aWwKKwkJICogQVJQIGlzIHNlbnQgKi8KKwkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkKKwl9IGVsc2UgeworCQkvL0ZJWE1FOiBJUFggaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiBGcmFtZSBSZWxheSA/CisJCWlmKChjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpICYmCisJCSAJc2VuZHBhY2tldFsxXSA9PSAweDAwICYmCisJCSAgICAJc2VuZHBhY2tldFsyXSA9PSAweDgwICYmCisJCSAgICAJc2VuZHBhY2tldFs2XSA9PSAweDgxICYmCisJCSAgICAJc2VuZHBhY2tldFs3XSA9PSAweDM3KSB7CisJCQkKKwkJCWlmKCBjaGFuLT5lbmFibGVfSVBYICkgeworCQkJCXN3aXRjaF9uZXRfbnVtYmVycyhzZW5kcGFja2V0LCAKKwkJCQkJCWNoYW4tPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9GSVhNRTogVGFrZSB0aGlzIG91dCB3aGVuIElQWCBpcyBmaXhlZCAKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogV0FSTklORzogVW5zdXBwb3J0ZWQgSVBYIGRhdGEgaW4gc2VuZCwgcGFja2V0IGRyb3BwZWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJCisJCX1lbHNleworICAgICAgICAJCWVyciA9IGZyX3NlbmRfZGF0YV9oZWFkZXIoY2FyZCwgY2hhbi0+ZGxjaSwgYXR0ciwgc2tiLT5sZW4sIHNrYi0+ZGF0YSwgY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJCQlpZiAoZXJyKSB7CisJCQkJc3dpdGNoKGVycikgeworCQkJCWNhc2UgRlJSRVNfQ0lSX09WRVJGTE9XOgorCQkJCWNhc2UgRlJSRVNfQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgICAgIAkJCWlmICghc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoZGV2LCBza2IpKXsKKwkJCQkJCXNldF9iaXQoMSwmZGVsYXlfdHhfcXVldWVkKTsKKwkJCQkJfQorICAgICAgICAgICAJCQkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJCWlmX3NlbmRfYWRwdHJfYmZyc19mdWxsICsrOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBGUlJFU19UT09fTE9ORzoKKwkJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBFcnJvcjogRnJhbWUgdG9vIGxvbmcsIHRyYW5zbWlzc2lvbiBmYWlsZWQgJWlcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkIGludClza2ItPmxlbik7CisJCQkJCX0KKwkJCQkJLyogRHJvcCBkb3duIHRvIGRlZmF1bHQgKi8KKwkJCQlkZWZhdWx0OgorCQkJCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLgorCQkJCQkJaWZfc2VuZF9kbGNpX2Rpc2Nvbm5lY3RlZCArKzsKKyAgICAgICAgCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLgorCQkJCQlpZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHIrKzsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzOworCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQl9CisJCX0KKwl9CisKK2lmX3NlbmRfc3RhcnRfYW5kX2V4aXQ6CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCS8qIElmIHdlIHF1ZXVlZCB0aGUgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHdlIG11c3Qgbm90CisJICogZGVhbGxvY2F0ZSBpdC4gVGhlIHBhY2tldCBpcyB1bmxpbmtlZCBmcm9tIHRoZSBJUCBzdGFjaworCSAqIG5vdCBjb3BpZWQuIFRoZXJlZm9yZSwgd2UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBwYWNrZXQgKi8KKwlpZiAoIXRlc3RfYml0KDEsJmRlbGF5X3R4X3F1ZXVlZCkpIHsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQlhZHB0cl9mbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9UWFJEWTsKKwkJY2FyZC0+dS5mLnR4X2ludGVycnVwdHNfcGVuZGluZyArKzsKKwl9CisKKyAgICAgICAgY2xlYXJfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCisJczUwOF9zNTE0X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldHVwIHNvIHRoYXQgYSBmcmFtZSBjYW4gYmUgdHJhbnNtaXR0ZWQgb24gdGhlIG9jY3VycmVuY2Ugb2YgYSB0cmFuc21pdAorICogaW50ZXJydXB0LgorICovCitzdGF0aWMgaW50IHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworICAgICAgICBzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworICAgICAgICBmcl9kbGNpX2ludGVyZmFjZV90KiBkbGNpX2ludGVyZmFjZTsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwkvKiBDaGVjayB0aGF0IHRoZSBkbGNpIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQsCisgICAgICAgICAqIGJlZm9yZSB1c2luZyB0eCBpbnRlcnJ1cHQgKi8KKwlpZiAoIWNoYW4tPmRsY2lfaW50X2ludGVyZmFjZSl7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBFUlJPUiBvbiBETENJICVpOiBOb3QgY29uZmlndXJlZCBwcm9wZXJseSAhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCQkKKwlkbGNpX2ludGVyZmFjZSA9IGNoYW4tPmRsY2lfaW50X2ludGVyZmFjZTsKKworICAgICAgICBpZihjaGFuLT50cmFuc21pdF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQmlnIG1lc3MgaW4gc2V0dXBfZm9yX2RlbC4uLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisJaWYobGVuID4gRlJfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIHsKKwkJLy9GSVhNRTogaW5jcmVtZW50IHNvbWUgc3RhdGlzdGljICovCisJCXJldHVybiAxOworCX0KKworCXNrYl91bmxpbmsoc2tiKTsKKwkKKyAgICAgICAgY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gbGVuOworCWNoYW4tPmRlbGF5X3NrYiA9IHNrYjsKKyAgICAgICAgCisgICAgICAgIGRsY2lfaW50ZXJmYWNlLT5nZW5faW50ZXJydXB0IHw9IEZSX0lOVFJfVFhSRFk7CisgICAgICAgIGRsY2lfaW50ZXJmYWNlLT5wYWNrZXRfbGVuZ3RoID0gbGVuOworCisJLyogVHVybiBvbiBUWCBpbnRlcnJ1cHQgYXQgdGhlIGVuZCBvZiBpZl9zZW5kICovCisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBjb250YWlucyBhIGJyb2FkY2FzdCBvcgorICogbXVsdGljYXN0IHNvdXJjZSBJUCBhZGRyZXNzLgorICogUmV0dXJuIDAgaWYgbm90IGJyb2FkY2FzdC9tdWx0aWNhc3QgYWRkcmVzcywgb3RoZXJ3aXNlIHJldHVybiAxLgorICovCisKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICB1MzIgc3JjX2lwX2FkZHI7CisgICAgICAgIHUzMiBicm9hZGNhc3RfaXBfYWRkciA9IDA7CisgICAgICAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworIAorICAgICAgICAvKiByZWFkIHRoZSBJUCBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBvdXRnb2luZyBwYWNrZXQgKi8KKyAgICAgICAgc3JjX2lwX2FkZHIgPSAqKHUzMiAqKShza2ItPmRhdGEgKyAxNCk7CisKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8KKyAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIGlmKGluX2RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhPSBpbl9kZXYtPmlmYV9saXN0OworICAgICAgICAgICAgICAgIGlmKGlmYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2lwX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBCcm9hZGNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpICYmIChzcmNfaXBfYWRkciA9PSBicm9hZGNhc3RfaXBfYWRkcikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJyb2FkY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBJUCBTb3VyY2UgQWRkcmVzcyBpcyBhIE11bHRpY2FzdCBhZGRyZXNzICovCisgICAgICAgIGlmKChjaGFuLT5tYyA9PSBXQU5PUFRfTk8pICYmIChudG9obChzcmNfaXBfYWRkcikgPj0gMHhFMDAwMDAwMSkgJiYKKyAgICAgICAgICAgICAgICAobnRvaGwoc3JjX2lwX2FkZHIpIDw9IDB4RkZGRkZGRkUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNdWx0aWNhc3QgU291cmNlIEFkZHJlc3Mgc2lsZW50bHkgZGlzY2FyZGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApIAoreworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisKKyAgCisJZnJfdWRwX3BrdF90ICpmcl91ZHBfcGt0ID0gKGZyX3VkcF9wa3RfdCAqKWRhdGE7IAorCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSAvL3NpemVvZihmcl9lbmNhcF9oZHJfdCkrCisJICAgICAgc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBtYm94X2xlbjsKKyAKKworCS8qIGZpbGwgaW4gVURQIHJlcGx5ICovCisJZnJfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgCisJLyogZmlsbCBpbiBVRFAgbGVuZ3RoICovCisJdWRwX2xlbmd0aCA9IHNpemVvZih1ZHBfcGt0X3QpKyAKKwkJICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkJICAgICBzaXplb2YoY2Jsb2NrX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworCisJLyogcHV0IGl0IG9uIGFuIGV2ZW4gYm91bmRhcnkgKi8KKwlpZiAoIHVkcF9sZW5ndGggJiAweDAwMDEgKSB7CisJCXVkcF9sZW5ndGggKz0gMTsKKwkJbGVuICs9IDE7CisJCWV2ZW5fYm91bmQgPSAxOworCX0KKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2xlbmd0aCA9IHRlbXA7CisJIAorCS8qIHN3YXAgVURQIHBvcnRzICovCisJdGVtcCA9IGZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0ID0gCisJCQlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydDsgCisJZnJfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisKKworCS8qIGFkZCBVRFAgcHNldWRvIGhlYWRlciAqLworCXRlbXAgPSAweDExMDA7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKGZyX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKGZyX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworCQkgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gMDsKKworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVC8qK3NpemVvZihmcl9lbmNhcF9oZHJfdCkqL10sCisJCQkgICAgICB1ZHBfbGVuZ3RoK1VEUF9PRkZTRVQpOworCisJLyogZmlsbCBpbiBJUCBsZW5ndGggKi8KKwlpcF9sZW5ndGggPSB1ZHBfbGVuZ3RoICsgc2l6ZW9mKGlwX3BrdF90KTsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJZnJfdWRwX3BrdC0+aXBfcGt0LnRvdGFsX2xlbmd0aCA9IHRlbXA7CisgIAorCS8qIHN3YXAgSVAgYWRkcmVzc2VzICovCisJaXBfdGVtcCA9IGZyX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwlmcl91ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSAKKwkJCQlmcl91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3M7CisJZnJfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCQkgCisJLyogZmlsbCBpbiBJUCBjaGVja3N1bSAqLworCWZyX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCWZyX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAKKwkJY2FsY19jaGVja3N1bSgmZGF0YVsvKnNpemVvZihmcl9lbmNhcF9oZHJfdCkqLzBdLAorCQkgICAgICAJICAgICAgc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworfSAvKiByZXBseV91ZHAgKi8KKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOyAKKwl1bnNpZ25lZCBsb25nIHN1bT0wOworCWludCBpOworCisJZm9yKCBpID0gMDsgaSA8bGVuOyBpKz0yICkgeworCQltZW1jcHkoJnRlbXAsJmRhdGFbaV0sMik7CisJCXN1bSArPSAodW5zaWduZWQgbG9uZyl0ZW1wOworCX0KKworCXdoaWxlIChzdW0gPj4gMTYgKSB7CisJCXN1bSA9IChzdW0gJiAweGZmZmZVTCkgKyAoc3VtID4+IDE2KTsKKwl9CisKKwl0ZW1wID0gKHVuc2lnbmVkIHNob3J0KXN1bTsKKwl0ZW1wID0gfnRlbXA7CisKKwlpZiggdGVtcCA9PSAwICkgCisJCXRlbXAgPSAweGZmZmY7CisKKwlyZXR1cm4gdGVtcDsJCit9CisKKy8qCisgICBJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICAgaWYgaW5jb21pbmcgaXMgMSAtIGlmIHRoZSBuZXQgbnVtYmVyIGlzIDAgbWFrZSBpdCBvdXJzIAorCisqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbMTRdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFsxNV0gPDwgMTYpICsgKHNlbmRwYWNrZXRbMTZdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbMTddKTsKKworCWlmICghaW5jb21pbmcpIHsKKwkJLyogSWYgdGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgbnVtYmVyIGlzIG91cnMsIG1ha2UgaXQgMCAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IG5ldHdvcmtfbnVtYmVyKSB7CisJCQlzZW5kcGFja2V0WzE0XSA9IHNlbmRwYWNrZXRbMTVdID0gc2VuZHBhY2tldFsxNl0gPSAKKwkJCQkJIHNlbmRwYWNrZXRbMTddID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBpbmNvbWluZyBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDApIHsKKwkJCXNlbmRwYWNrZXRbMTRdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTVdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsxNl0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMTddID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KKworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzI2XSA8PCAyNCkgKyAKKwkJCSAgKHNlbmRwYWNrZXRbMjddIDw8IDE2KSArIChzZW5kcGFja2V0WzI4XSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzI5XSk7CisKKwlpZiggIWluY29taW5nICkgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMjZdID0gc2VuZHBhY2tldFsyN10gPSBzZW5kcGFja2V0WzI4XSA9IAorCQkJCQkgc2VuZHBhY2tldFsyOV0gPSAweDAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDAgKSB7CisJCQlzZW5kcGFja2V0WzI2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzI3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbMjhdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzI5XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9Cit9IC8qIHN3aXRjaF9uZXRfbnVtYmVycyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwkKKwlpZihjaGFuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZjaGFuLT5pZnN0YXRzOworfQorCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9pc3I6CVM1MDggZnJhbWUgcmVsYXkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZyYW1lIHJlbGF5IG1haW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGUuIFRoaXMKKyAqICAgICAgZnVuY3Rpb24gY2hlY2sgdGhlIGludGVycnVwdCB0eXBlIGFuZCB0YWtlcworICogICAgICB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmcl9pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJaW50IGksZXJyOworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisKKwkvKiBUaGlzIGZsYWcgcHJldmVudHMgbmVzdGluZyBvZiBpbnRlcnJ1cHRzLiAgU2VlIHNkbGFfaXNyKCkgcm91dGluZQorICAgICAgICAgKiBpbiBzZGxhbWFpbi5jLiAgKi8KKwljYXJkLT5pbl9pc3IgPSAxOworCQorCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKworCS8qIEFsbCBwZXJpcGhlcmFsIChjb25maWd1cmFpdG9uLCByZS1jb25maWd1cmF0aW9uKSBldmVudHMKKwkgKiB0YWtlIHByZXNpZGVuY2Ugb3ZlciB0aGUgSVNSLiAgVGh1cywgcmV0cmlnZ2VyICovCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfYWxyZWFkeV9jcml0aWNhbDsKKwkJZ290byBmcl9pc3JfZXhpdDsKKwl9CisJCisgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KSB7CisJCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIHdoaWxlIGluIElTUjogSWYgU2VuZCBSdW5uaW5nIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2FscmVhZHlfY3JpdGljYWw7CisJCQlnb3RvIGZyX2lzcl9leGl0OworCQl9CisJfQorCisJc3dpdGNoIChmbGFncy0+aWZsYWcpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgRlJfSU5UUl9SWFJEWTogIC8qIHJlY2VpdmUgaW50ZXJydXB0ICovCisJICAgIAkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9yeDsKKyAgICAgICAgICAJCXJ4X2ludHIoY2FyZCk7CisgICAgICAgICAgICAJCWJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfVFhSRFk6ICAvKiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkgICAgCQkrKyBjYXJkLT5zdGF0aXN0aWNzLmlzcl90eDsgCisJCQl0eF9pbnRyKGNhcmQpOyAKKyAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfUkVBRFk6ICAJCisJICAgIAkJSW50cl90ZXN0X2NvdW50ZXIrKzsKKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfaW50cl90ZXN0OworCSAgICAJCWJyZWFrOwkKKworICAgICAgICAgICAgICAgIGNhc2UgRlJfSU5UUl9ETEM6IC8qIEV2ZW50IGludGVycnVwdCBvY2N1cnJlZCAqLworCQkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX1NUQVRVUzsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJaWYgKGVycikKKwkJCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfVElNRVI6ICAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKwkJCXRpbWVyX2ludHIoY2FyZCk7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkgICAgCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3NwdXJpb3VzOworICAgICAgICAgICAgCQlzcHVyX2ludHIoY2FyZCk7CisJICAgIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCBUeXBlIDB4JTAyWCFcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIGZsYWdzLT5pZmxhZyk7CisJICAgIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElEIEJ5dGVzID0gIixjYXJkLT5kZXZuYW1lKTsKKyAJICAgIAkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIweCUwMlggIiwgKihwdHIgKyAweDI4ICsgaSkpOworCSAgIAkgCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorICAgICAgICAgICAgCisJCQlicmVhazsKKyAgICAJfQorCitmcl9pc3JfZXhpdDoKKwkKKwljYXJkLT5pbl9pc3IgPSAwOworCWZsYWdzLT5pZmxhZyA9IDA7CisJcmV0dXJuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogcnhfaW50cglSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqIERlc2NyaXB0aW9uCisgKiAJVXBvbiByZWNlaXZlaW5nIGFuIGludGVycnVwdDogCisgKgkxLiBDaGVjayB0aGF0IHRoZSBmaXJtd2FyZSBpcyBpbiBzeW5jIHdpdGggCisgKiAgICAgCSAgIHRoZSBkcml2ZXIuIAorICogICAgICAyLiBGaW5kIGFuIGFwcHJvcHJpYXRlIG5ldHdvcmsgaW50ZXJmYWNlCisgKiAgICAgICAgIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBkbGNpIG51bWJlci4KKyAqCTMuIENoZWNrIHRoYXQgdGhlIG5ldG93cmsgaW50ZXJmYWNlIGV4aXN0cworICogICAgICAgICBhbmQgdGhhdCBpdCdzIHNldHVwIHByb3Blcmx5LgorICoJNC4gQ29weSB0aGUgZGF0YSBpbnRvIGFuIHNrYiBidWZmZXIuCisgKgk1LiBDaGVjayB0aGUgcGFja2V0IHR5cGUgYW5kIHRha2UKKyAqICAgICAgICAgYXBwcm9wcmlhdGUgYWN0b246IFVQRCwgQVBJLCBBUlAgb3IgRGF0YS4KKyAqLworCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJZnJfcnhfYnVmX2N0bF90KiBmcmJ1ZiA9IGNhcmQtPnJ4bWI7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwlmcl9jaGFubmVsX3QqIGNoYW47CisJY2hhciAqcHRyID0gJmZsYWdzLT5pZmxhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisJdm9pZCogYnVmOworCXVuc2lnbmVkIGRsY2ksIGxlbiwgb2ZmcywgbGVuX2luY2xfaGRyOworCWludCBpLCB1ZHBfdHlwZTsJCisKKworCS8qIENoZWNrIHRoYXQgZmlybXdhcmUgYnVmZmVycyBhcmUgaW4gc3luYyAqLworCWlmIChmcmJ1Zi0+ZmxhZyAhPSAweDAxKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogY29ycnVwdGVkIFJ4IGJ1ZmZlciBAIDB4JVgsIGZsYWcgPSAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsICh1bnNpZ25lZClmcmJ1ZiwgZnJidWYtPmZsYWcpOworICAgICAgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiMHglMDJYICIsICoocHRyICsgMHgyOCArIGkpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKwkKKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfY29ycnVwdF9yeF9iZnI7CisKKwkJLyogQnVnIEZpeDogTWFyIDYgMjAwMAorICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBhIGNvcnJ1cHRlZCBtYWlsYm94LCBpdCBtZWFucyB0aGF0IGRyaXZlciAKKyAgICAgICAgICAgICAgICAgKiBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaXJtd2FyZS4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZG9uJ3QgdHVybiBvZmYgYWxsIGludGVycnVwdHMgZm9yIHRoaXMgY2FyZAorICAgICAgICAgICAgICAgICAqIHRoZSBtYWNoaW5lIHdpbGwgY3Jhc2guIAorICAgICAgICAgICAgICAgICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgcm91dGVyIGZhaWx1cmUgLi4uISEhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgIVxuIik7CisJCWZyX3NldF9pbnRyX21vZGUoY2FyZCwgMCwgMCwgMCk7CQorCQlyZXR1cm47CisJfQorCisJbGVuICA9IGZyYnVmLT5sZW5ndGg7CisJZGxjaSA9IGZyYnVmLT5kbGNpOworCW9mZnMgPSBmcmJ1Zi0+b2Zmc2V0OworCisJLyogRmluZCB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoaXMgcGFja2V0ICovCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGRsY2kpOworICAgCisKKwkvKiBDaGVjayB0aGF0IHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBhY3RpdmUgYW5kCisgICAgICAgICAqIHByb3Blcmx5IHNldHVwICovCisJaWYgKGRldiA9PSBOVUxMKSB7CisgICAJCWlmKCBuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgZGF0YSBvbiB1bmNvbmZpZ3VyZWQgRExDSSAlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lLCBkbGNpKTsKKwkJfQorCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9vbl9vcnBoYW5lZF9ETENJOyAKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9kb25lOworCX0KKworCWlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCl7CisJCWlmKCBuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgZGF0YSBvbiB1bmNvbmZpZ3VyZWQgRExDSSAlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lLCBkbGNpKTsKKwkJfQorCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9vbl9vcnBoYW5lZF9ETENJOyAKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9kb25lOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsgCisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAoc2tiID09IE5VTEwpKXsKKworCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkKKwkJaWYoc2tiID09IE5VTEwpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX25vX3NvY2tldCArKzsKKwkJfSAKKworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSl7CisJCQljaGFuLT5kcnZzdGF0c19yeF9pbnRyLgorCQkJCXJ4X2ludHJfZGV2X25vdF9zdGFydGVkICsrOworCQkJaWYgKHNrYil7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCX0KKwkJfQorCQlnb3RvIHJ4X2RvbmU7CisJfQorCisJLyogQ29weSBkYXRhIGZyb20gdGhlIGJvYXJkIGludG8gdGhlIHNvY2tldCBidWZmZXIgKi8KKwlpZiAoKG9mZnMgKyBsZW4pID4gY2FyZC0+dS5mLnJ4X3RvcCArIDEpIHsKKwkJdW5zaWduZWQgdG1wID0gY2FyZC0+dS5mLnJ4X3RvcCAtIG9mZnMgKyAxOworCisJCWJ1ZiA9IHNrYl9wdXQoc2tiLCB0bXApOworCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBvZmZzLCBidWYsIHRtcCk7CisJCW9mZnMgPSBjYXJkLT51LmYucnhfYmFzZTsKKwkJbGVuIC09IHRtcDsKKwl9CisKKwlidWYgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwlzZGxhX3BlZWsoJmNhcmQtPmh3LCBvZmZzLCBidWYsIGxlbik7CisKKworCS8qIFdlIGdvdCB0aGUgcGFja2V0IGZyb20gdGhlIGJhcmQuIAorICAgICAgICAgKiBDaGVjayB0aGUgcGFja2V0IHR5cGUgYW5kIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uICovCisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKwlpZih1ZHBfdHlwZSAhPSBVRFBfSU5WQUxJRF9UWVBFKSB7CisKKwkJLyogVURQIERlYnVnIHBhY2tldCByZWNlaXZlZCwgc3RvcmUgdGhlCisJCSAqIHBhY2tldCBhbmQgaGFuZGxlIGl0IGluIHRpbWVyIGludGVycnVwdCAqLworCisJCXNrYl9wdWxsKHNrYiwgMSk7IAorCQlpZiAod2Fucm91dGVyX3R5cGVfdHJhbnMoc2tiLCBkZXYpKXsgCisJCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QodWRwX3R5cGUsVURQX1BLVF9GUk1fTkVUV09SSyxjYXJkLHNrYixkbGNpKSl7CisKKwkJCQlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKworCQkJCWlmICh1ZHBfdHlwZSA9PSBVRFBfRlBJUEVfVFlQRSl7CisJCQkJCSsrY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX1BJUEVfcmVxdWVzdDsKKwkJCQl9CisJCQl9CisJCX0KKworCX1lbHNlIGlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgeworCisJCS8qIFdlIGFyZSBpbiBBUEkgbW9kZS4gCisgICAgICAgICAgICAgICAgICogQWRkIGFuIEFQSSBoZWFkZXIgdG8gdGhlIFJBVyBwYWNrZXQKKyAgICAgICAgICAgICAgICAgKiBhbmQgcXVldWUgaXQgaW50byBhIGNpcmN1bGFyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgKiBUaGVuIGtpY2sgdGhlIGZyX2JoKCkgYm90dG9tIGhhbGYgaGFuZGxlciAqLworCisJCWFwaV9yeF9oZHJfdCogYXBpX3J4X2hkcjsKKwkJY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2sgKys7CisJCWNoYW4tPmlmc3RhdHMucnhfcGFja2V0cyArKzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgKys7CisKKwkJY2hhbi0+aWZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKGFwaV9yeF9oZHJfdCkpOworCQlhcGlfcnhfaGRyID0gKGFwaV9yeF9oZHJfdCopJnNrYi0+ZGF0YVsweDAwXTsKKwkJYXBpX3J4X2hkci0+YXR0ciA9IGZyYnVmLT5hdHRyOworCQlhcGlfcnhfaGRyLT50aW1lX3N0YW1wID0gZnJidWYtPnRtc3RhbXA7CisKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5kZXYgICAgICA9IGRldjsKKwkJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfREFUQTsKKworCQliaF9lbnF1ZXVlKGRldiwgc2tiKTsKKworCQl0cmlnZ2VyX2ZyX2JoKGNoYW4pOworCisJfWVsc2UgaWYgKGhhbmRsZV9JUFhXQU4oc2tiLT5kYXRhLGNoYW4tPm5hbWUsY2hhbi0+ZW5hYmxlX0lQWCwgY2hhbi0+bmV0d29ya19udW1iZXIpKXsKKworCQkvL0ZJWE1FOiBGcmFtZSBSZWxheSBJUFggaXMgbm90IHN1cHBvcnRlZCwgWWV0ICEKKwkJLy9pZiAoY2hhbi0+ZW5hYmxlX0lQWCkgeworCQkvLwlmcl9zZW5kKGNhcmQsIGRsY2ksIDAsIHNrYi0+bGVuLHNrYi0+ZGF0YSk7CisJCS8vfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJfSBlbHNlIGlmIChpc19hcnAoc2tiLT5kYXRhKSkgeworCisJCS8qIEFSUCBzdXBwb3J0IGVuYWJsZWQgTWFyIDE2IDIwMDAgCisJCSAqIFByb2Nlc3MgaW5jb21pbmcgQVJQIHJlcGx5L3JlcXVlc3QsIHNldHVwCisJCSAqIGR5bmFtaWMgcm91dGVzLiAqLyAKKworCQlpZiAocHJvY2Vzc19BUlAoKGFycGhkcl8xNDkwX3QgKilza2ItPmRhdGEsIGNhcmQsIGRldikpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAgCisJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJICAgIiVzOiBFcnJvciBwcm9jZXNzaW5nIEFSUCBQYWNrZXQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCX0gZWxzZSBpZiAoc2tiLT5kYXRhWzBdICE9IDB4MDMpIHsKKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vbiBJRVRGIHBhY2tldCBkaXNjYXJkZWQuXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJfSBlbHNlIHsKKworCQlsZW5faW5jbF9oZHIgPSBza2ItPmxlbjsKKwkJLyogRGVjYXBzdWxhdGUgcGFja2V0IGFuZCBwYXNzIGl0IHVwIHRoZQorCQkgICBwcm90b2NvbCBzdGFjayAqLworCQlza2ItPmRldiA9IGRldjsKKwkJCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEJSSURHRSB8fCBjaGFuLT5jb21tb24udXNlZGJ5ID09IEJSSURHRV9OT0RFKXsKKwkJCisJCQkvKiBNYWtlIHN1cmUgaXQncyBhbiBFdGhlcm5ldCBmcmFtZSwgb3RoZXJ3aXNlIGRyb3AgaXQgKi8KKwkJCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgIlx4MDNceDAwXHg4MFx4MDBceDgwXHhDMlx4MDBceDA3IiwgOCkpIHsKKwkJCQlza2JfcHVsbChza2IsIDgpOworCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQl9ZWxzZXsKKwkJCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZXJyb3JzOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Vycm9yczsKKwkJCQlnb3RvIHJ4X2RvbmU7CisJCQl9CisJCX1lbHNleworCQkKKwkJCS8qIHJlbW92ZSBoYXJkd2FyZSBoZWFkZXIgKi8KKwkJCWJ1ZiA9IHNrYl9wdWxsKHNrYiwgMSk7IAorCQkJCisJCQlpZiAoIXdhbnJvdXRlcl90eXBlX3RyYW5zKHNrYiwgZGV2KSkgeworCQkJCQorCQkJCS8qIGNhbid0IGRlY2Fwc3VsYXRlIHBhY2tldCAqLworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkJCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZXJyb3JzOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Vycm9yczsKKwkJCQlnb3RvIHJ4X2RvbmU7CQorCQkJfQorCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQl9IAorCQkKKworCQkvKiBTZW5kIGEgcGFja2V0IHVwIHRoZSBJUCBzdGFjayAqLworCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJCSsrY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CisJCSsrY2hhbi0+aWZzdGF0cy5yeF9wYWNrZXRzOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzOworCisJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gbGVuX2luY2xfaGRyOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfYnl0ZXMgKz0gbGVuX2luY2xfaGRyOworCX0KKworcnhfZG9uZToKKworICAgICAgIAkvKiBSZWxlYXNlIGJ1ZmZlciBlbGVtZW50IGFuZCBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZSAqLyAKKyAgICAgICAJZnJidWYtPmZsYWcgPSAwOworCWNhcmQtPnJ4bWIgPSArK2ZyYnVmOworCWlmICgodm9pZCopZnJidWYgPiBjYXJkLT51LmYucnhtYl9sYXN0KQorCQljYXJkLT5yeG1iID0gY2FyZC0+dS5mLnJ4bWJfYmFzZTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHhfaW50cjoJVHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogUmF0aW9uYWxlOgorICogICAgICBJZiB0aGUgYm9hcmQgaXMgYnVzeSB0cmFuc21pdHRpbmcsIGlmX3NlbmQoKSB3aWxsCisgKiAgICAgIGJ1ZmZlcnMgYSBzaW5nbGUgcGFja2V0IGFuZCB0dXJuIG9uCisgKiAgICAgIHRoZSB0eCBpbnRlcnJ1cHQuIFR4IGludGVycnVwdCB3aWxsIGJlIGNhbGxlZAorICogICAgICBieSB0aGUgYm9hcmQsIG9uY2UgdGhlIGZpcm13YXJlIGNhbiBzZW5kIG1vcmUKKyAqICAgICAgZGF0YS4gVGh1cywgbm8gcG9sbGluZyBpcyByZXF1aXJlZC4JIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVHggaW50ZXJydXB0IGlzIGNhbGxlZCBmb3IgZWFjaCAKKyAqICAgICAgY29uZmlndXJlZCBkbGNpIGNoYW5uZWwuIFRodXM6IAorICogCTEuIE9idGFpbiB0aGUgbmV0b3dyayBpbnRlcmZhY2UgYmFzZWQgb24gdGhlCisgKiAgICAgICAgIGRsY2kgbnVtYmVyLgorICogICAgICAyLiBDaGVjayB0aGF0IG5ldHdvcmsgaW50ZXJmYWNlIGlzIHVwIGFuZAorICogICAgICAgICBwcm9wZXJseSBzZXR1cC4KKyAqIAkzLiBDaGVjayBmb3IgYSBidWZmZXJlZCBwYWNrZXQuCisgKiAgICAgIDQuIFRyYW5zbWl0IHRoZSBwYWNrZXQuCisgKgk1LiBJZiB3ZSBhcmUgaW4gV0FOUElQRSBtb2RlLCBtYXJrIHRoZSAKKyAqICAgICAgICAgTkVUX0JIIGhhbmRsZXIuIAorICogICAgICA2LiBJZiB3ZSBhcmUgaW4gQVBJIG1vZGUsIGtpY2sKKyAqICAgICAgICAgdGhlIEFGX1dBTlBJUEUgc29ja2V0IGZvciBtb3JlIGRhdGEuIAorICoJICAgCisgKi8KK3N0YXRpYyB2b2lkIHR4X2ludHIoc2RsYV90ICpjYXJkKQoreworICAgICAgICBmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworICAgICAgICBmcl90eF9idWZfY3RsX3QqIGJjdGw7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIGZyX2NoYW5uZWxfdCogY2hhbjsKKworICAgICAgICBpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAgYmN0bCA9ICh2b2lkKikoZmxhZ3MtPnRzZV9vZmZzICsgY2FyZC0+aHcuZHBtYmFzZSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGJjdGwgPSAodm9pZCopKGZsYWdzLT50c2Vfb2ZmcyAtIEZSX01CX1ZFQ1RPUiArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9CisKKyAgICAgICAgLyogRmluZCB0aGUgc3RydWN0dXJlIGFuZCBtYWtlIGl0IHVuYnVzeSAqLworICAgICAgICBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgZmxhZ3MtPmRsY2kpOworCWlmIChkZXYgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0lORk8gIk5PIERFViBJTiBUWCBJbnRlcnJ1cHRcbiIpOwkKKwkJZ290byBlbmRfb2ZfdHhfaW50cjsKKwl9CisKKyAgICAgICAgaWYgKChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTk8gQ0hBTiBJTiBUWCBJbnRlcnJ1cHRcbiIpOwkKKwkJZ290byBlbmRfb2ZfdHhfaW50cjsKKwl9CisKKyAgICAgICAgaWYoIWNoYW4tPnRyYW5zbWl0X2xlbmd0aCB8fCAhY2hhbi0+ZGVsYXlfc2tiKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHR4IGludCBlcnJvciAtIHRyYW5zbWl0IGxlbmd0aCB6ZXJvXG4iLAorCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZF9vZl90eF9pbnRyOworICAgICAgICB9CisKKwkvKiBJZiB0aGUgJ2lmX3NlbmQoKScgcHJvY2VkdXJlIGlzIGN1cnJlbnRseSBjaGVja2luZyB0aGUgJ3RidXN5JworCSAgIHN0YXR1cywgdGhlbiB3ZSBjYW5ub3QgdHJhbnNtaXQuIEluc3RlYWQsIHdlIGNvbmZpZ3VyZSB0aGUgbWljcm9jb2RlCisJICAgc28gYXMgdG8gcmUtaXNzdWUgdGhpcyB0cmFuc21pdCBpbnRlcnJ1cHQgYXQgYSBsYXRlciBzdGFnZS4gCisJKi8KKwlpZiAodGVzdF9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKworCQlmcl9kbGNpX2ludGVyZmFjZV90KiBkbGNpX2ludGVyZmFjZSA9IGNoYW4tPmRsY2lfaW50X2ludGVyZmFjZTsKKwkJYmN0bC0+ZmxhZyA9IDB4QTA7CisJCWRsY2lfaW50ZXJmYWNlLT5nZW5faW50ZXJydXB0IHw9IEZSX0lOVFJfVFhSRFk7CisJCXJldHVybjsKKworIAl9ZWxzZXsKKyAgICAgICAgCWJjdGwtPmRsY2kgPSBmbGFncy0+ZGxjaTsKKwkgICAgICAgIGJjdGwtPmxlbmd0aCA9IGNoYW4tPnRyYW5zbWl0X2xlbmd0aCtjaGFuLT5mcl9oZWFkZXJfbGVuOworICAgICAgICAJc2RsYV9wb2tlKCZjYXJkLT5odywgCisJCSAgICAgICAgICBmcl9zZW5kX2hkcihjYXJkLGJjdGwtPmRsY2ksYmN0bC0+b2Zmc2V0KSwgCisJCQkgIGNoYW4tPmRlbGF5X3NrYi0+ZGF0YSwKKyAJICAgICAgICAgICAgICAJICBjaGFuLT5kZWxheV9za2ItPmxlbik7CisJICAgICAgICBiY3RsLT5mbGFnID0gMHhDMDsKKworCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKwkJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBjaGFuLT50cmFuc21pdF9sZW5ndGg7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9ieXRlcyArPSBjaGFuLT50cmFuc21pdF9sZW5ndGg7CisKKwkJLyogV2UgbXVzdCBmcmVlIGFuIHNrIGJ1ZmZlciwgd2hpY2ggd2UgdXNlZAorCQkgKiBmb3IgZGVsYXllZCB0cmFuc21pc3Npb247IE90aGVyd2lzZSwgdGhlIHNvY2sKKwkJICogd2lsbCBydW4gb3V0IG9mIG1lbW9yeSAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGNoYW4tPmRlbGF5X3NrYik7CisKKwkJY2hhbi0+ZGVsYXlfc2tiID0gTlVMTDsJCQkJCisgICAgICAgIAljaGFuLT50cmFuc21pdF9sZW5ndGggPSAwOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJLyogSWYgdXNpbmcgQVBJLCB0aGFuIHdha2V1cCBzb2NrZXQgQkggaGFuZGxlciAqLworCQkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCXdha2V1cF9za19iaChkZXYpOworCQkJfWVsc2V7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJfQorCitlbmRfb2ZfdHhfaW50cjoKKworIAkvKiBpZiBhbnkgb3RoZXIgaW50ZXJmYWNlcyBoYXZlIHRyYW5zbWl0IGludGVycnVwdHMgcGVuZGluZywgCisJICogZG8gbm90IGRpc2FibGUgdGhlIGdsb2JhbCB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwlpZighKC0tIGNhcmQtPnUuZi50eF9pbnRlcnJ1cHRzX3BlbmRpbmcpKQorICAgICAgIAkgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+RlJfSU5UUl9UWFJEWTsKKworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0aW1lcl9pbnRyOglUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBSYXRpb25hbGU6CisgKglBbGwgY29tbWFucyBtdXN0IGJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgdGltZXIKKyAqICAgICAgaW50ZXJydXB0IHNpbmNlIG5vIHR3byBjb21tYW5kcyBzaG91bGQgZXhlY3V0ZQorICogICAgICBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIHRpbWVyIGludGVycnVwdCBpcyB1c2VkIHRvOgorICogICAgCTEuIFByb2Nlc3NpbmcgdWRwIGNhbGxzIGZyb20gJ2ZwaXBlbW9uJy4KKyAqICAgIAkyLiBQcm9jZXNzaW5nIHVwZGF0ZSBjYWxscyBmcm9tIC9wcm9jIGZpbGUgc3lzdGVtCisgKiAgIAkzLiBSZWFkaW5nIGJvYXJkLWxldmVsIHN0YXRpc3RpY3MgZm9yIAorICogICAgICAgICB1cGRhdGluZyB0aGUgcHJvYyBmaWxlIHN5c3RlbS4KKyAqICAgIAk0LiBTZW5kaW5nIGludmVyc2UgQVJQIHJlcXVlc3QgcGFja2V0cy4KKyAqCTUuIENvbmZpZ3VyZSBhIGRsY2kvY2hhbm5lbC4KKyAqCTYuIFVuY29uZmlndXJlIGEgZGxjaS9jaGFubmVsLiAoTm9kZSBvbmx5KQorICovCisKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBVRFAgRGVidWdpbmc6IGZwaXBlbW9uIGNhbGwgKi8KKyAgICAgICAgaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VRFApIHsKKwkJaWYoY2FyZC0+dS5mLnVkcF90eXBlID09IFVEUF9GUElQRV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIAlpZihwcm9jZXNzX3VkcF9tZ210X3BrdChjYXJkKSkgeworCQkgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9CisJCQkJCX5UTVJfSU5UX0VOQUJMRURfVURQOworCQkJfQorCQl9CisgICAgICAgIH0KKworCS8qIC9wcm9jIHVwZGF0ZSBjYWxsIDogdHJpZ2dlcmVkIGZyb20gdXBkYXRlKCkgKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkgeworCQlmcl9nZXRfZXJyX3N0YXRzKGNhcmQpOworCQlmcl9nZXRfc3RhdHMoY2FyZCk7CisJCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJfQorCisJLyogVXBkYXRlIHRoZSBjaGFubmVsIHN0YXRlIGNhbGwuICBUaGlzIGlzIGNhbGwgaXMKKyAgICAgICAgICogdHJpZ2dlcmVkIGJ5IGlmX3NlbmQoKSBmdW5jdGlvbiAqLworCWlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVVBEQVRFX1NUQVRFKXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKXsKKwkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CQorCQkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCQkJCXVwZGF0ZV9jaGFuX3N0YXRlKGRldik7CisJCQkJfQorCQkJfQorCQl9CisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VQREFURV9TVEFURTsKKwl9CisKKwkvKiBjb25maWd1cmUgYSBkbGNpL2NoYW5uZWwgKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRyl7CisJCWNvbmZpZ19mcihjYXJkKTsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQ09ORklHOworCX0KKworCS8qIHVuY29uZmlndXJlIGEgZGxjaS9jaGFubmVsICovCisJaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRyl7CisJCXVuY29uZmlnX2ZyKGNhcmQpOworCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwl9CisKKwkKKwkvKiBUcmFuc21pdCBBUlAgcGFja2V0cyAqLworCWlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQVJQKXsKKwkJaW50IGk9MDsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQlpZiAoY2FyZC0+dS5mLmFycF9kZXYgPT0gTlVMTCkKKwkJCWNhcmQtPnUuZi5hcnBfZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCQlkZXYgPSBjYXJkLT51LmYuYXJwX2RldjsKKworCQlmb3IgKDs7KXsgCisKKwkJCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQkJLyogSWYgdGhlIGludGVyZmFjZSBpcyBicm91Z2h0IGRvd24gY2FuY2VsIHNlbmRpbmcgSW4tQVJQcyAqLworCQkJaWYgKCEoZGV2LT5mbGFncyZJRkZfVVApKXsKKwkJCQljbGVhcl9iaXQoMCwmY2hhbi0+aW5hcnBfcmVhZHkpOwkKKwkJCX0KKworCQkJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmluYXJwX3JlYWR5KSl7CisKKwkJCQlpZiAoY2hlY2tfdHhfc3RhdHVzKGNhcmQsZGV2KSl7CisJCQkJCXNldF9iaXQoQVJQX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICghc2VuZF9pbmFycF9yZXF1ZXN0KGNhcmQsZGV2KSl7CisJCQkJCXRyaWdnZXJfZnJfYXJwKGRldik7CisJCQkJCWNoYW4tPmluYXJwX3RpY2sgPSBqaWZmaWVzOworCQkJCX0KKworCQkJCWNsZWFyX2JpdCgwLCZjaGFuLT5pbmFycF9yZWFkeSk7CisJCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKworCQkJaWYgKCsraSA9PSBjYXJkLT53YW5kZXYubmV3X2lmX2NudCl7CisJCQkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQVJQOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNhcmQtPnUuZi5hcnBfZGV2ID0gZGV2OworCX0KKworICAgICAgICBpZighY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkKQorICAgICAgICAgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+RlJfSU5UUl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHNwdXJfaW50cjoJU3B1cmlvdXMgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogIAlXZSBkb24ndCBrbm93IHRoaXMgaW50ZXJydXB0LgorICogICAgICBQcmludCBhIHdhcm5pbmcuCisgKi8KKworc3RhdGljIHZvaWQgc3B1cl9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0IVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorfQorCisKKy8vRklYTUU6IEZpeCB0aGUgSVBYIGluIG5leHQgdmVyc2lvbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBSZXR1cm4gMCBmb3Igbm9uLUlQWFdBTiBwYWNrZXQKKyAqICAgICAgICAgMSBmb3IgSVBYV0FOIHBhY2tldCBvciBJUFggaXMgbm90IGVuYWJsZWQhCisgKiAgRklYTUU6IFVzZSBhIElQWCBzdHJ1Y3R1cmUgaGVyZSBub3Qgb2Zmc2V0cworICovCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgCisJCQkgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfSVBYLCAKKwkJCSB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyKQoreworCWludCBpOworCisJaWYoIHNlbmRwYWNrZXRbMV0gPT0gMHgwMCAmJiBzZW5kcGFja2V0WzJdID09IDB4ODAgJiYKKwkgICAgc2VuZHBhY2tldFs2XSA9PSAweDgxICYmIHNlbmRwYWNrZXRbN10gPT0gMHgzNykgeyAKKworCQkvKiBJdCdzIGFuIElQWCBwYWNrZXQgKi8KKwkJaWYgKCFlbmFibGVfSVBYKXsKKwkJCS8qIFJldHVybiAxIHNvIHdlIGRvbid0IHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQkJLy9GSVhNRTogVGFrZSB0aGlzIG91dCB3aGVuIElQWCBpcyBmaXhlZAorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAorCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCSIlczogV0FSTklORzogVW5zdXBwb3J0ZWQgSVBYIHBhY2tldCByZWNlaXZlZCBhbmQgZHJvcHBlZFxuIiwKKwkJCQkJZGV2bmFtZSk7CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEl0J3Mgbm90IElQWCBzbyByZXR1cm4gYW5kIHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiggc2VuZHBhY2tldFsyNF0gPT0gMHg5MCAmJiBzZW5kcGFja2V0WzI1XSA9PSAweDA0KXsKKwkJLyogSXQncyBJUFhXQU4gKi8KKworCQlpZiggc2VuZHBhY2tldFsxMF0gPT0gMHgwMiAmJiBzZW5kcGFja2V0WzQyXSA9PSAweDAwKXsKKworCQkJLyogSXQncyBhIHRpbWVyIHJlcXVlc3QgcGFja2V0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgSVBYV0FOIFRpbWVyIFJlcXVlc3QgcGFja2V0XG4iLAorCQkJCQlkZXZuYW1lKTsKKworCQkJLyogR28gdGhyb3VnaCB0aGUgcm91dGluZyBvcHRpb25zIGFuZCBhbnN3ZXIgbm8gdG8gZXZlcnkKKwkJCSAqIG9wdGlvbiBleGNlcHQgVW5udW1iZXJlZCBSSVAvU0FQCisJCQkgKi8KKwkJCWZvcihpID0gNDk7IHNlbmRwYWNrZXRbaV0gPT0gMHgwMDsgaSArPSA1KXsKKwkJCQkvKiAweDAyIGlzIHRoZSBvcHRpb24gZm9yIFVubnVtYmVyZWQgUklQL1NBUCAqLworCQkJCWlmKCBzZW5kcGFja2V0W2kgKyA0XSAhPSAweDAyKXsKKwkJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJLyogU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbiAqLworCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApeworCQkJCWkgKz0gODsKKwkJCX0KKworCQkJLyogV2UgYWxzbyB3YW50IHRvIHR1cm4gb2ZmIGFsbCBoZWFkZXIgY29tcHJlc3Npb24gb3B0LgorCQkJICovCisJCQlmb3IoOyBzZW5kcGFja2V0W2ldID09IDB4ODAgOyl7CisJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCWkgKz0gKHNlbmRwYWNrZXRbaSArIDJdIDw8IDgpICsgKHNlbmRwYWNrZXRbaSArIDNdKSArIDQ7CisJCQl9CisKKwkJCS8qIFNldCB0aGUgcGFja2V0IHR5cGUgdG8gdGltZXIgcmVzcG9uc2UgKi8KKwkJCXNlbmRwYWNrZXRbNDJdID0gMHgwMTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIFRpbWVyIFJlc3BvbnNlXG4iLAorCQkJCQlkZXZuYW1lKTsKKworCQl9IGVsc2UgaWYoIHNlbmRwYWNrZXRbNDJdID09IDB4MDIgKXsKKworCQkJLyogVGhpcyBpcyBhbiBpbmZvcm1hdGlvbiByZXF1ZXN0IHBhY2tldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFJlY2VpdmVkIElQWFdBTiBJbmZvcm1hdGlvbiBSZXF1ZXN0IHBhY2tldFxuIiwKKwkJCQkJCWRldm5hbWUpOworCisJCQkvKiBTZXQgdGhlIHBhY2tldCB0eXBlIHRvIGluZm9ybWF0aW9uIHJlc3BvbnNlICovCisJCQlzZW5kcGFja2V0WzQyXSA9IDB4MDM7CisKKwkJCS8qIFNldCB0aGUgcm91dGVyIG5hbWUgKi8KKwkJCXNlbmRwYWNrZXRbNTldID0gJ0YnOworCQkJc2VuZHBhY2tldFs2MF0gPSAnUCc7CisJCQlzZW5kcGFja2V0WzYxXSA9ICdJJzsKKwkJCXNlbmRwYWNrZXRbNjJdID0gJ1AnOworCQkJc2VuZHBhY2tldFs2M10gPSAnRSc7CisJCQlzZW5kcGFja2V0WzY0XSA9ICctJzsKKwkJCXNlbmRwYWNrZXRbNjVdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyID4+IDI4KTsKKwkJCXNlbmRwYWNrZXRbNjZdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MEYwMDAwMDApPj4gMjQpOworCQkJc2VuZHBhY2tldFs2N10gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEYwMDAwMCk+PiAyMCk7CisJCQlzZW5kcGFja2V0WzY4XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMEYwMDAwKT4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbNjldID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEYwMDApPj4gMTIpOworCQkJc2VuZHBhY2tldFs3MF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMEYwMCk+PiA4KTsKKwkJCXNlbmRwYWNrZXRbNzFdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRjApPj4gNCk7CisJCQlzZW5kcGFja2V0WzcyXSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwMEYpOworCQkJZm9yKGkgPSA3MzsgaSA8IDEwNzsgaSs9IDEpCisJCQl7CisJCQkJc2VuZHBhY2tldFtpXSA9IDA7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBJbmZvcm1hdGlvbiBSZXNwb25zZSBwYWNrZXRcbiIsCisJCQkJCWRldm5hbWUpOworCQl9IGVsc2UgeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBJUFhXQU4gcGFja2V0IVxuIixkZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogU2V0IHRoZSBXTm9kZUlEIHRvIG91ciBuZXR3b3JrIGFkZHJlc3MgKi8KKwkJc2VuZHBhY2tldFs0M10gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQlzZW5kcGFja2V0WzQ0XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXNlbmRwYWNrZXRbNDVdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEZGMDApID4+IDgpOworCQlzZW5kcGFja2V0WzQ2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiAxOworCX0KKworCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIGFuIElQWC1kYXRhIHBhY2tldCBzbyBpdCdsbCBnZXQgcGFzc2VkIHVwIHRoZSAKKwkgKiBzdGFjay4KKwkgKiBzd2l0Y2ggdGhlIG5ldHdvcmsgbnVtYmVycyAKKwkgKi8KKwlzd2l0Y2hfbmV0X251bWJlcnMoc2VuZHBhY2tldCwgbmV0d29ya19udW1iZXIgLDEpOworCXJldHVybiAwOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBwcm9jZXNzX3JvdXRlCisgKiAKKyAqIFJhdGlvbmFsZToKKyAqCUlmIHRoZSBpbnRlcmZhY2UgZ29lcyBkb3duLCBvciB3ZSByZWNlaXZlIGFuIEFSUCByZXF1ZXN0LAorICogICAgICB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXAgYWRkcmVzc2VzLgorICogCVRoaXMgY2Fubm90IGJlIGRvbmUgd2l0aGluIHRoZSBpbnRlcnJ1cHQuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXMgYSBwb2xsaW5nIHJvdXRpbmUgdG8gZHluYW1pY2FsbHkgCisgKglhZGQvZGVsZXRlIHJvdXRlcyBuZWdvdGlhdGVkIGJ5IGludmVyc2UgQVJQLiAgSXQgaXMgaW4gdGhpcyAKKyAqICAgIAkidGFzayIgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHJvdXRlcyB0byBiZSBhZGRlZCB3aGlsZSBpbiAKKyAqICAgICAgaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogVXNhZ2U6CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBmcl9wb2xsKCkgcG9sbGluZyBmdW50aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfcm91dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCXN0cnVjdCBpZnJlcSBpZl9pbmZvOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaWZfZGF0YTsKKwltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKKwl1MzIgaXBfdG1wOworCWludCBlcnI7CisKKworCXN3aXRjaChjaGFuLT5yb3V0ZV9mbGFnKXsKKworCWNhc2UgQUREX1JPVVRFOgorCQkJCQorCQkvKiBTZXQgcmVtb3RlIGFkZHJlc3NlcyAqLworCQltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisJCXNldF9mcyhnZXRfZHMoKSk7ICAgICAvKiBnZXQgdXNlciBzcGFjZSBibG9jayAqLyAKKwkJCisJCWlmX2RhdGEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCWlmX2RhdGEtPnNpbl9hZGRyLnNfYWRkciA9IGNoYW4tPmlwX3JlbW90ZTsKKwkJaWZfZGF0YS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJCXNldF9mcyhmcyk7ICAgICAgICAgICAvKiByZXN0b3JlIG9sZCBibG9jayAqLworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBSb3V0ZSBBZGQgZmFpbGVkLiAgRXJyb3I6ICVkXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkZHJlc3M6ICV1LiV1LiV1LiV1XG4iLAorCQkJCWNoYW4tPm5hbWUsIE5JUFFVQUQoY2hhbi0+aXBfcmVtb3RlKSk7CisKKwkJfWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJvdXRlIEFkZGVkIFN1Y2Nlc3NmdWxseTogJXUuJXUuJXUuJXVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKGNoYW4tPmlwX3JlbW90ZSkpOworCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJPVVRFX0FEREVEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSRU1PVkVfUk9VVEU6CisKKwkJLyogU2V0IHJlbW90ZSBhZGRyZXNzZXMgKi8KKwkJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCQlzdHJjcHkoaWZfaW5mby5pZnJfbmFtZSwgZGV2LT5uYW1lKTsKKworCQlpcF90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsJCisKKwkJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCQkKKwkJaWZfZGF0YSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJaWZfZGF0YS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkJaWZfZGF0YS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJCXNldF9mcyhmcyk7ICAgIAorCQkKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IERlbGV0aW5nIG9mIHJvdXRlIGZhaWxlZC4gIEVycm9yOiAlZFxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGRyZXNzOiAldS4ldS4ldS4ldVxuIiwKKwkJCQlkZXYtPm5hbWUsTklQUVVBRChjaGFuLT5pcF9yZW1vdGUpICk7CisKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0ZSBSZW1vdmVkIFN1Y2Vzc2Z1bHk6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQoaXBfdG1wKSk7CisJCQljaGFuLT5yb3V0ZV9mbGFnID0gTk9fUk9VVEU7CisJCX0KKwkJYnJlYWs7CisKKwl9IC8qIENhc2UgU3RhdGVtZW50ICovCisKK30KKworCisKKy8qKioqKiogRnJhbWUgUmVsYXkgRmlybXdhcmUtU3BlY2lmaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgZmlybXdhcmUgY29kZSB2ZXJzaW9uLgorICogbyBmaWxsIHN0cmluZyBzdHIgd2l0aCBmaXJtd2FyZSB2ZXJzaW9uIGluZm8uIAorICovCitzdGF0aWMgaW50IGZyX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPREVfVkVSU0lPTjsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlpZiAoIWVyciAmJiBzdHIpIHsKKwkJaW50IGxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisJCW1lbWNweShzdHIsIG1ib3gtPmRhdGEsIGxlbik7CisJICAgICAgICBzdHJbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGdsb2JhbCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgaW50IGZyX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBmcl9jb25mX3QgKmNvbmYpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBkbGNpX251bSA9IGNhcmQtPnUuZi5kbGNpX251bTsKKwlpbnQgZXJyLCBpOworCisJZG8KKwl7CisJCW1lbWNweShtYm94LT5kYXRhLCBjb25mLCBzaXplb2YoZnJfY29uZl90KSk7CisKKwkJaWYgKGRsY2lfbnVtKSBmb3IgKGkgPSAwOyBpIDwgZGxjaV9udW07ICsraSkKKwkJCSgoZnJfY29uZl90KiltYm94LT5kYXRhKS0+ZGxjaVtpXSA9IAorCQkJCQljYXJkLT51LmYubm9kZV9kbGNpW2ldOyAKKwkJCisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9CisJCQlzaXplb2YoZnJfY29uZl90KSArIGRsY2lfbnVtICogc2l6ZW9mKHNob3J0KTsKKworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkvKk5DIE9jdCAxMiAyMDAwICovCisJaWYgKGVyciAhPSBDTURfT0speworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGcmFtZSBSZWxheSBDb25maWd1cmF0aW9uIEZhaWxlZDogcmM9MHgleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGVycik7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IERMQ0kgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludCBmcl9kbGNpX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBmcl9kbGNfY29uZl90ICpjb25mLCB1bnNpZ25lZCBkbGNpKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbWNweShtYm94LT5kYXRhLCBjb25mLCBzaXplb2YoZnJfZGxjX2NvbmZfdCkpOworCQltYm94LT5jbWQuZGxjaSA9ICh1bnNpZ25lZCBzaG9ydCkgZGxjaTsgCisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IHNpemVvZihmcl9kbGNfY29uZl90KTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tKTsKKwkKKwlyZXR1cm4gZXJyOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgaW50ZXJydXB0IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgZnJfc2V0X2ludHJfbW9kZSAoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBtdHUsCisJdW5zaWduZWQgc2hvcnQgdGltZW91dCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWZyNTA4X2ludHJfY3RsX3QqIGljdGwgPSAodm9pZCopbWJveC0+ZGF0YTsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KGljdGwsIDAsIHNpemVvZihmcjUwOF9pbnRyX2N0bF90KSk7CisJCWljdGwtPm1vZGUgICA9IG1vZGU7CisJCWljdGwtPnR4X2xlbiA9IG10dTsKKwkJaWN0bC0+aXJxICAgID0gY2FyZC0+aHcuaXJxOworCisJCS8qIGluZGljYXRlIHRpbWVvdXQgb24gdGltZXIgKi8KKwkJaWYgKG1vZGUgJiAweDIwKSBpY3RsLT50aW1lb3V0ID0gdGltZW91dDsgCisKKwkJbWJveC0+Y21kLmxlbmd0aCA9IHNpemVvZihmcjUwOF9pbnRyX2N0bF90KTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9TRVRfSU5UUl9NT0RFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqLworc3RhdGljIGludCBmcl9jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQ09NTV9FTkFCTEU7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9jb21tX2Rpc2FibGUgCisgKgorICogV2FybmluZzogVGhpcyBmdW5jdGluIGlzIGNhbGxlZCBieSB0aGUgc2h1dGRvd24oKSBwcm9jZWR1cmUuIEl0IGlzIHZvaWQKKyAqICAgICAgICAgIHNpbmNlIGRldi0+cHJpdiBhcmUgaGFzIGFscmVhZHkgYmVlbiBkZWFsbG9jYXRlZCBhbmQgbm8KKyAqICAgICAgICAgIGVycm9yIGNoZWNraW5nIGlzIHBvc3NpYmxlIHVzaW5nIGZyX2V2ZW50KCkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZyX2NvbW1fZGlzYWJsZSAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8geworCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX01PREVNX1NUQVRVUzsKKwltYm94LT5jbWQubGVuZ3RoID0gMTsKKwltYm94LT5kYXRhWzBdID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0pOworCQorCXJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwkKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9DT01NX0RJU0FCTEU7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0pOworCisJcmV0dXJuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgY29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4gCisgKi8KK3N0YXRpYyBpbnQgZnJfZ2V0X2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0VSUk9SX1NUQVRTOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJbWJveC0+Y21kLmRsY2kgPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiAoIWVycikgeworCQlmcl9jb21tX3N0YXRfdCogc3RhdHMgPSAodm9pZCopbWJveC0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgID0gc3RhdHMtPnJ4X292ZXJydW5zOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfY3JjX2Vycm9ycyAgICAgPSBzdGF0cy0+cnhfYmFkX2NyYzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgID0gc3RhdHMtPnJ4X2Fib3J0czsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgID0gc3RhdHMtPnJ4X3Rvb19sb25nOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhfYWJvcnRzOworCQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IHN0YXRpc3RpY3MuIAorICovCitzdGF0aWMgaW50IGZyX2dldF9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX1NUQVRJU1RJQ1M7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQltYm94LT5jbWQuZGxjaSA9IDA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX2xpbmtfc3RhdF90KiBzdGF0cyA9ICh2b2lkKiltYm94LT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gc3RhdHMtPnJ4X2JhZF9mb3JtYXQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkID0KKwkJCXN0YXRzLT5yeF9kcm9wcGVkICsgc3RhdHMtPnJ4X2Ryb3BwZWQyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWRkIERMQ0kocykgKEFjY2VzcyBOb2RlIG9ubHkhKS4KKyAqIFRoaXMgcm91dGluZSB3aWxsIHBlcmZvcm0gdGhlIEFERF9ETENJcyBjb21tYW5kIGZvciB0aGUgc3BlY2lmaWVkIERMQ0kuCisgKi8KK3N0YXRpYyBpbnQgZnJfYWRkX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJdW5zaWduZWQgc2hvcnQqIGRsY2lfbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKHNob3J0KTsKKwkJZGxjaV9saXN0WzBdID0gZGxjaTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9BRERfRExDSTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBY3RpdmF0ZSBETENJKHMpIChBY2Nlc3MgTm9kZSBvbmx5ISkuIAorICogVGhpcyByb3V0aW5lIHdpbGwgcGVyZm9ybSB0aGUgQUNUSVZBVEVfRExDSXMgY29tbWFuZCB3aXRoIGEgRExDSSBudW1iZXIuIAorICovCitzdGF0aWMgaW50IGZyX2FjdGl2YXRlX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJdW5zaWduZWQgc2hvcnQqIGRsY2lfbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKHNob3J0KTsKKwkJZGxjaV9saXN0WzBdID0gZGxjaTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9BQ1RJVkFURV9ETENJOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlbGV0ZSBETENJKHMpIChBY2Nlc3MgTm9kZSBvbmx5ISkuIAorICogVGhpcyByb3V0aW5lIHdpbGwgcGVyZm9ybSB0aGUgREVMRVRFX0RMQ0lzIGNvbW1hbmQgd2l0aCBhIERMQ0kgbnVtYmVyLiAKKyAqLworc3RhdGljIGludCBmcl9kZWxldGVfZGxjaSAoc2RsYV90KiBjYXJkLCBpbnQgZGxjaSkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQl1bnNpZ25lZCBzaG9ydCogZGxjaV9saXN0ID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBzaXplb2Yoc2hvcnQpOworCQlkbGNpX2xpc3RbMF0gPSBkbGNpOworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX0RFTEVURV9ETENJOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJc3N1ZSBpbi1jaGFubmVsIHNpZ25hbGxpbmcgZnJhbWUuIAorICovCitzdGF0aWMgaW50IGZyX2lzc3VlX2lzZiAoc2RsYV90KiBjYXJkLCBpbnQgaXNmKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmRhdGFbMF0gPSBpc2Y7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gMTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9JU1NVRV9JU19GUkFNRTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBmcl9zZW5kX2hkciAoc2RsYV90KmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCxkbGNpKTsJCisJZnJfY2hhbm5lbF90ICpjaGFuOworCisJaWYgKCFkZXYgfHwgIShjaGFuPWRldi0+cHJpdikpCisJCXJldHVybiBvZmZzZXQ7CisJCisJaWYgKGNoYW4tPmZyX2hlYWRlcl9sZW4peworCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBvZmZzZXQsIGNoYW4tPmZyX2hlYWRlciwgY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJfQorCQorCXJldHVybiBvZmZzZXQrY2hhbi0+ZnJfaGVhZGVyX2xlbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgZnJhbWUgb24gYSBzZWxlY3RlZCBETENJLiAgCisgKi8KK3N0YXRpYyBpbnQgZnJfc2VuZF9kYXRhX2hlYWRlciAoc2RsYV90KiBjYXJkLCBpbnQgZGxjaSwgdW5zaWduZWQgY2hhciBhdHRyLCBpbnQgbGVuLAorCXZvaWQgKmJ1ZiwgdW5zaWduZWQgY2hhciBoZHJfbGVuKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3ggKyAweDgwMDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmRsY2kgICAgPSBkbGNpOworCQltYm94LT5jbWQuYXR0ciAgICA9IGF0dHI7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gbGVuK2hkcl9sZW47CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfV1JJVEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX3R4X2J1Zl9jdGxfdCogZnJidWY7CisgCisgICAgICAgICAgICAgICAJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpCisJCQlmcmJ1ZiA9ICh2b2lkKikoKih1bnNpZ25lZCBsb25nKiltYm94LT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgIAljYXJkLT5ody5kcG1iYXNlKTsKKwkJZWxzZQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisKKwkJc2RsYV9wb2tlKCZjYXJkLT5odywgZnJfc2VuZF9oZHIoY2FyZCxkbGNpLGZyYnVmLT5vZmZzZXQpLCBidWYsIGxlbik7CisJCWZyYnVmLT5mbGFnID0gMHgwMTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZyX3NlbmQgKHNkbGFfdCogY2FyZCwgaW50IGRsY2ksIHVuc2lnbmVkIGNoYXIgYXR0ciwgaW50IGxlbiwKKwl2b2lkICpidWYpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveCArIDB4ODAwOworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltYm94LT5jbWQuZGxjaSAgICA9IGRsY2k7CisJCW1ib3gtPmNtZC5hdHRyICAgID0gYXR0cjsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBsZW47CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfV1JJVEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX3R4X2J1Zl9jdGxfdCogZnJidWY7CisgCisgICAgICAgICAgICAgICAJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpCisJCQlmcmJ1ZiA9ICh2b2lkKikoKih1bnNpZ25lZCBsb25nKiltYm94LT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgIAljYXJkLT5ody5kcG1iYXNlKTsKKwkJZWxzZQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisKKwkJc2RsYV9wb2tlKCZjYXJkLT5odywgZnJidWYtPm9mZnNldCwgYnVmLCBsZW4pOworCQlmcmJ1Zi0+ZmxhZyA9IDB4MDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisvKioqKioqIEZpcm13YXJlIEFzeW5jaHJvbm91cyBFdmVudCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNYWluIGFzeW5jcm9ub3VzIGV2ZW50L2Vycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGZyX2V2ZW50IChzZGxhX3QgKmNhcmQsIGludCBldmVudCwgZnJfbWJveF90KiBtYm94KQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJY2hhciAqcHRyID0gJmZsYWdzLT5pZmxhZzsKKwlpbnQgaTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKworCQljYXNlIEZSUkVTX01PREVNX0ZBSUxVUkU6CisJCQlyZXR1cm4gZnJfbW9kZW1fZmFpbHVyZShjYXJkLCBtYm94KTsKKworCQljYXNlIEZSUkVTX0NIQU5ORUxfRE9XTjogeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQkJLyogUmVtb3ZlIGFsbCByb3V0ZXMgZnJvbSBhc3NvY2lhdGVkIERMQ0kncyAqLworCQkJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJCQkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJCQkJaWYgKGNoYW4tPnJvdXRlX2ZsYWcgPT0gUk9VVEVfQURERUQpIHsKKwkJCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJFTU9WRV9ST1VURTsKKwkJCQl9CisKKwkJCQlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfQ09ORklHVVJFRCkgeworCQkJCQljaGFuLT5pbmFycCA9IElOQVJQX1JFUVVFU1Q7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIGxpbmsgYmVjb21lcyBkaXNjb25uZWN0ZWQgdGhlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsIGNoYW5uZWxzIHdpbGwgYmUgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fRElTQ09OTkVDVEVEKTsKKwkJCX0KKwkJCQkKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJY2FzZSBGUlJFU19DSEFOTkVMX1VQOiB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCQkvKiBGSVhNRTogT25seSBzdGFydHVwIGRldmljZXMgdGhhdCBhcmUgb24gdGhlIGxpc3QgKi8KKwkJCQorCQkJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJCQkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJCQkKKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0NPTk5FQ1RFRCk7CisJCQl9CisKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJY2FzZSBGUlJFU19ETENJX0NIQU5HRToKKwkJCXJldHVybiBmcl9kbGNpX2NoYW5nZShjYXJkLCBtYm94KTsKKworCQljYXNlIEZSUkVTX0RMQ0lfTUlTTUFUQ0g6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRExDSSBsaXN0IG1pc21hdGNoIVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gMTsKKworCQljYXNlIENNRF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tbWFuZCAweCUwMlggdGltZWQgb3V0IVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYm94LT5jbWQuY29tbWFuZCk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSUQgQnl0ZXMgPSAiLGNhcmQtPmRldm5hbWUpOworIAkgICAgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MTggKyBpKSk7CisJICAgCSAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisgICAgICAgICAgICAKKwkJCWJyZWFrOworCisJCWNhc2UgRlJSRVNfRExDSV9JTkFDVElWRToKKwkJCWJyZWFrOworIAorCQljYXNlIEZSUkVTX0NJUl9PVkVSRkxPVzoKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRlJSRVNfQlVGRkVSX09WRVJGTE9XOgorCQkJYnJlYWs7IAorCQkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIgorCQkJCSwgY2FyZC0+ZGV2bmFtZSwgbWJveC0+Y21kLmNvbW1hbmQsIGV2ZW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgbW9kZW0gZXJyb3IuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGZyX21vZGVtX2ZhaWx1cmUgKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90KiBtYm94KQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHlzaWNhbCBsaW5rIGRvd24hIChtb2RlbSBlcnJvciAweCUwMlgpXG4iLAorCQljYXJkLT5kZXZuYW1lLCBtYm94LT5kYXRhWzBdKTsKKworCXN3aXRjaCAobWJveC0+Y21kLmNvbW1hbmQpeworCQljYXNlIEZSX1dSSVRFOgorCQorCQljYXNlIEZSX1JFQUQ6CisJCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIERMQ0kgc3RhdHVzIGNoYW5nZS4KKyAqCisgKiBSZXR1cm4gemVybyBpZiBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBjYW5jZWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgZnJfZGxjaV9jaGFuZ2UgKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90KiBtYm94KQoreworCWRsY2lfc3RhdHVzX3QqIHN0YXR1cyA9ICh2b2lkKiltYm94LT5kYXRhOworCWludCBjbnQgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKGRsY2lfc3RhdHVzX3QpOworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2MjsKKwkKKworCWZvciAoOyBjbnQ7IC0tY250LCArK3N0YXR1cykgeworCisJCXVuc2lnbmVkIHNob3J0IGRsY2k9IHN0YXR1cy0+ZGxjaTsKKwkJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBkbGNpKTsKKwkJCisJCWlmIChkZXYgPT0gTlVMTCl7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogQ1BFIGNvbnRhaW5zIHVuY29uZmlndXJlZCBETENJPSAlZFxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgZGxjaSk7IAkKKworICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmNvbmZpZ3VyZWQgRExDSSAlZCByZXBvcnRlZCBieSBuZXR3b3JrXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FyZC0+ZGV2bmFtZSwgZGxjaSk7CisgCisJCX1lbHNleworCQkJaWYgKHN0YXR1cy0+c3RhdGUgPT0gRlJfTElOS19JTk9QRVIpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogRExDSSAldSBpcyBpbmFjdGl2ZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRsY2kpOworCisJCQkJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl9CisJCisJCQlpZiAoc3RhdHVzLT5zdGF0ZSAmIEZSX0RMQ0lfREVMRVRFRCkgeworCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IERMQ0kgJXUgaGFzIGJlZW4gZGVsZXRlZCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRsY2kpOworCisJCQkJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nKGRldikpeworCisJCQkJCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQkJCQlpZiAoY2hhbi0+cm91dGVfZmxhZyA9PSBST1VURV9BRERFRCkgeworCQkJCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJFTU9WRV9ST1VURTsKKwkJCQkJCS8qIFRoZSBzdGF0ZSBjaGFuZ2Ugd2lsbCB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnIgcG9sbGluZyByb3V0aW5lICovCisJCQkJCX0KKworCQkJCQlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfQ09ORklHVVJFRCkgeworCQkJCQkJY2hhbi0+aW5hcnAgPSBJTkFSUF9SRVFVRVNUOworCQkJCQl9CisKKwkJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoc3RhdHVzLT5zdGF0ZSAmIEZSX0RMQ0lfQUNUSVZFKSB7CisKKwkJCQljaGFuID0gZGV2LT5wcml2OworCQkJCisJCQkJLyogVGhpcyBmbGFnIGlzIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHNwZWNpZmljIAorCQkJCSAgIERMQ0kocykgd2hlbiB0aGV5IGJlY29tZSBhY3RpdmUuCisJCQkgCSovIAorCQkJCWNoYW4tPmRsY2lfY29uZmlndXJlZCA9IERMQ0lfQ09ORklHX1BFTkRJTkc7CisJCisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKwkJCisJCQl9CisJCX0KKwl9CisJCisJZm9yIChkZXYyID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2MjsKKwkgICAgIGRldjIgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYyLT5wcml2KSl7CisJCQorCQljaGFuID0gZGV2Mi0+cHJpdjsKKwkKKwkJaWYgKGNoYW4tPmRsY2lfY29uZmlndXJlZCA9PSBETENJX0NPTkZJR19QRU5ESU5HKSB7CisJCQlpZiAoZnJfaW5pdF9kbGNpKGNhcmQsIGNoYW4pKXsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZnJfaW5pdF9kbGNpIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlmcl9kbGNfY29uZl90IGNmZzsKKwkKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOworCisJaWYgKCBjaGFuLT5jaXJfc3RhdHVzID09IENJUl9ESVNBQkxFRCkgeworCisJCWNmZy5jaXJfZndkID0gY2ZnLmNpcl9id2QgID0gMTY7CisJCWNmZy5iY19md2QgPSBjZmcuYmNfYndkID0gMTY7CisJCWNmZy5jb25mX2ZsYWdzID0gMHgwMDAxOwkKKworCX1lbHNlIGlmIChjaGFuLT5jaXJfc3RhdHVzID09IENJUl9FTkFCTEVEKSB7CisJCisJCWNmZy5jaXJfZndkID0gY2ZnLmNpcl9id2QgPSBjaGFuLT5jaXI7CisJCWNmZy5iY19md2QgID0gY2ZnLmJjX2J3ZCAgPSBjaGFuLT5iYzsKKwkJY2ZnLmJlX2Z3ZCAgPSBjZmcuYmVfYndkICA9IGNoYW4tPmJlOworCQljZmcuY29uZl9mbGFncyA9IDB4MDAwMDsKKwl9CisJCisJaWYgKGZyX2RsY2lfY29uZmlndXJlKCBjYXJkLCAmY2ZnICwgY2hhbi0+ZGxjaSkpeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBETENJIENvbmZpZ3VyZSBmYWlsZWQgZm9yICVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQlyZXR1cm4gMTsJCisJfQorCQorCWNoYW4tPmRsY2lfY29uZmlndXJlZCA9IERMQ0lfQ09ORklHVVJFRDsKKworCS8qIFJlYWQgdGhlIGludGVyZmFjZSBieXRlIG1hcHBpbmcgaW50byB0aGUgY2hhbm5lbCAKKwkgKiBzdHJ1Y3R1cmUuCisJICovCisJcmVhZF9ETENJX0lCX21hcHBpbmcoIGNhcmQsIGNoYW4gKTsKKworCXJldHVybiAwOworfQorLyoqKioqKiogTWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNoYW5uZWwgc3RhdGUuIAorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9MSVNUX0FDVElWRV9ETENJOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJaWYgKCFlcnIpIHsKKwkJCisJCXVuc2lnbmVkIHNob3J0KiBsaXN0ID0gKHZvaWQqKW1ib3gtPmRhdGE7CisJCWludCBjbnQgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKHNob3J0KTsKKwkJCisJCWVycj0xOworCQkKKwkJZm9yICg7IGNudDsgLS1jbnQsICsrbGlzdCkgeworCisJCQlpZiAoKmxpc3QgPT0gY2hhbi0+ZGxjaSkgeworIAkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCisKKwkJCQkvKiBNYXkgMjMgMjAwMC4gTkMKKwkJCQkgKiBXaGVuIGEgZGxjaSBpcyBhZGRlZCBvciByZXN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBkbGNpX2ludF9pbnRlcmZhY2UgcG9pbnRlciBtdXN0CisJCQkJICogYmUgcmVpbml0aWFsaXplZC4gICovCisJCQkJaWYgKCFjaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UpeworCQkJCQllcnI9ZnJfaW5pdF9kbGNpIChjYXJkLGNoYW4pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGNoYW5uZWwgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGludCBzdGF0ZSkKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gc3RhdGUpIHsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisKKwkJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogSW50ZXJmYWNlICVzOiBETENJICVkIGNvbm5lY3RlZFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBjaGFuLT5kbGNpKTsKKworCQkJCS8qIElmIHRoZSBpbnRlcmZhY2Ugd2FzIHByZXZpb3Vsc3kgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnJpbmcgaXQgdXAsIHNpbmNlIHRoZSBjaGFubmVsIGlzIGFjdGl2ZSAqLworCisJCQkJdHJpZ2dlcl9mcl9wb2xsIChkZXYpOworCQkJCXRyaWdnZXJfZnJfYXJwICAoZGV2KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSAgICAgICIlczogSW50ZXJmYWNlICVzOiBETENJICVkIGNvbm5lY3RpbmdcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+ZGxjaSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkgICAgIiVzOiBJbnRlcmZhY2UgJXM6IERMQ0kgJWQgZGlzY29ubmVjdGVkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBjaGFuLT5kbGNpKTsKKwkJCQorCQkJCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgdXAsIGJyaW5nIGl0IGRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIHRoZSBjaGFubmVsIGlzIG5vdyBkaXNjb25uZWN0ZWQgKi8KKwkJCQl0cmlnZ2VyX2ZyX3BvbGwgKGRldik7CisJCQkJYnJlYWs7CisJCX0KKworCQljaGFuLT5jb21tb24uc3RhdGUgPSBzdGF0ZTsKKwl9CisKKwljaGFuLT5zdGF0ZV90aWNrID0gamlmZmllczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaW5kIG5ldHdvcmsgZGV2aWNlIGJ5IGl0cyBjaGFubmVsIG51bWJlci4KKyAqCisgKiBXZSBuZWVkIHRoaXMgY3JpdGljYWwgZmxhZyBiZWNhdXNlIHdlIGNoYW5nZQorICogdGhlIGRsY2lfdG9fZGV2X21hcCBvdXRzaWRlIHRoZSBpbnRlcnJ1cHQuCisgKgorICogTk9URTogZGVsX2lmKCkgZnVuY3Rpb25zIHVwZGF0ZXMgdGhpcyBhcnJheSwgaXQgdXNlcworICogICAgICAgdGhlIHNwaW4gbG9ja3MgdG8gYXZvaWQgY29ycnVwdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlKiBmaW5kX2NoYW5uZWwoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBkbGNpKQoreworCWlmKGRsY2kgPiBISUdIRVNUX1ZBTElEX0RMQ0kpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuKGNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXBbZGxjaV0pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZyYW1lIGNhbiBiZSBzZW50LiBJZiBubyB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSwKKyAqIGVuYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzLgorICoKKyAqIFJldHVybjoJMSAtIFR4IGJ1ZmZlcihzKSBhdmFpbGFibGUKKyAqCQkwIC0gbm8gYnVmZmVycyBhdmFpbGFibGUKKyAqLworc3RhdGljIGludCBpc190eF9yZWFkeSAoc2RsYV90KiBjYXJkLCBmcl9jaGFubmVsX3QqIGNoYW4pCit7CisJdW5zaWduZWQgY2hhciBzYjsKKworICAgICAgICBpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkKKwkJcmV0dXJuIDE7CisKKwlzYiA9IGluYihjYXJkLT5ody5wb3J0KTsKKwlpZiAoc2IgJiAweDAyKSAKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb252ZXJ0IGRlY2ltYWwgc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiBJZiBsZW4gIT0gMCB0aGVuIG9ubHkgJ2xlbicgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGFyZSBjb252ZXJ0ZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWw7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKScwJyk7CisKKwlyZXR1cm4gdmFsOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBkbGNpKQoreworICAgICAgICBpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgZGxjaSk7CisJZnJfY2hhbm5lbF90ICpjaGFuOworCQorCWlmICghZGV2IHx8ICEoY2hhbj1kZXYtPnByaXYpKQorCQlyZXR1cm4gMTsKKwkKKyAgICAgICAgaWYoIWNhcmQtPnUuZi51ZHBfcGt0X2xndGggJiYgKHNrYi0+bGVuIDw9IE1BWF9MR1RIX1VEUF9NR05UX1BLVCkpeworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSBza2ItPmxlbiArIGNoYW4tPmZyX2hlYWRlcl9sZW47CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF90eXBlID0gdWRwX3R5cGU7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF9kbGNpID0gZGxjaTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY2FyZC0+dS5mLnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VRFA7CisgICAgICAgICAgICAgICAgdWRwX3BrdF9zdG9yZWQgPSAxOworCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBVRFAgcGFja2V0IG5vdCBzdG9yZWQgZm9yIERMQ0kgJWRcbiIsIAorCQkJCQkJCWRsY2kpOworCX0KKworICAgICAgICBpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9ZWxzZXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwkJCisgICAgICAgIHJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgVURQIGNhbGwgb2YgdHlwZSBGUElQRThORAorICovCitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCogY2FyZCkKK3sKKworCWludCBjX3JldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciBmcmFtZXM7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBzaG9ydCBidWZmZXJfbGVuZ3RoOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuOworICAgICAgICBmcl91ZHBfcGt0X3QgKmZyX3VkcF9wa3Q7CisJdW5zaWduZWQgc2hvcnQgbnVtX3RyY19lbHM7CisJZnJfdHJjX2VsX3QqIHB0cl90cmNfZWw7CisJZnJfdHJjX2VsX3QgdHJjX2VsOworCWZwaXBlbW9uX3RyY190KiBmcGlwZW1vbl90cmM7CisKKwljaGFyIHVkcF9wa3Rfc3JjID0gY2FyZC0+dS5mLnVkcF9wa3Rfc3JjOyAKKwlpbnQgZGxjaSA9IGNhcmQtPnUuZi51ZHBfZGxjaTsKKworCS8qIEZpbmQgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoaXMgcGFja2V0ICovCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGRsY2kpOworCWlmICghZGV2KXsKKwkJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisJCXJldHVybiAxOworCX0KKyAgICAgICAgaWYgKChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIElmIHRoZSBVRFAgcGFja2V0IGlzIGZyb20gdGhlIG5ldHdvcmssIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIAorCSAgIHRyYW5zbWl0IGEgcmVzcG9uc2UuIEJlZm9yZSBkb2luZyBzbywgd2UgbXVzdCBjaGVjayB0byBzZWUgdGhhdAorCSAgIHdlIGFyZSBub3QgY3VycmVudGx5IHRyYW5zbWl0dGluZyBhIGZyYW1lIChpbiAnaWZfc2VuZCgpJykgYW5kCisJICAgdGhhdCB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSAnZGVsYXllZCB0cmFuc21pdCcgc3RhdGUuCisJKi8KKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisJCWlmIChjaGVja190eF9zdGF0dXMoY2FyZCxkZXYpKXsKKwkJCWNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIGZyX3VkcF9wa3QgPSAoZnJfdWRwX3BrdF90ICopY2FyZC0+dS5mLnVkcF9wa3RfZGF0YTsKKworCWlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKwkKKwkJc3dpdGNoKGZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisKKwkJCWNhc2UgRlJfUkVBRF9NT0RFTV9TVEFUVVM6CisJCQljYXNlIEZSX1JFQURfU1RBVFVTOgorCQkJY2FzZSBGUElQRV9ST1VURVJfVVBfVElNRToKKwkJCWNhc2UgRlJfUkVBRF9FUlJPUl9TVEFUUzoKKwkJCWNhc2UgRlBJUEVfRFJJVkVSX1NUQVRfR0VOOgorCQkJY2FzZSBGUl9SRUFEX1NUQVRJU1RJQ1M6CisJCQljYXNlIEZSX1JFQURfQUREX0RMQ19TVEFUUzoKKwkJCWNhc2UgRlJfUkVBRF9DT05GSUc6CisJCQljYXNlIEZSX1JFQURfQ09ERV9WRVJTSU9OOgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisJCS8qIHNldCBsZW5ndGggdG8gMCAqLworCQlmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMDsKKwkJLyogc2V0IHJldHVybiBjb2RlICovCisJCWZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAweENEOyAKKwkJCisJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2RpcmVjdGlvbl9lcnIgKys7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpOworCQl9CisJCQorCX0gZWxzZSB7ICAgCisgICAgICAgICAgIAorCQlzd2l0Y2goZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQljYXNlIEZQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkJaWYoIWNhcmQtPlRyYWNpbmdFbmFibGVkKSB7CisJCQkJZG8geworICAgICAgICAgICAgICAgICAgICAgICAJCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9UUkFDRV9DT05GSUc7CisgICAgICAgICAgICAgICAgICAgICAgIAkJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworICAgICAgICAgICAgICAgICAgICAgCQkJbWJveC0+Y21kLmRsY2kgPSAweDAwOworICAgICAgICAgICAgICAgICAgIAkJCW1ib3gtPmRhdGFbMF0gPSBmcl91ZHBfcGt0LT5kYXRhWzBdIHwgCisJCQkJCQlSRVNFVF9UUkM7CisgICAgICAgICAgICAgICAgICAgIAkJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IAorCQkJCQkgICAgIAkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAJCX0gd2hpbGUgKGVyciAmJiBjX3JldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLAorCQkJCQkgbWJveCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZXJyKSB7CisJCQkJCWNhcmQtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCQkJLyogc2V0IHRoZSByZXR1cm4gY29kZSAqLworCQkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0KKyAgCQkJCQkJbWJveC0+Y21kLnJlc3VsdDsKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIE5PX1RSQ19FTEVNRU5UU19PRkYsCisJCQkJCQkmbnVtX3RyY19lbHMsIDIpOworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIEJBU0VfVFJDX0VMRU1FTlRTX09GRiwKKwkJCQkJCSZjYXJkLT51LmYudHJjX2VsX2Jhc2UsIDQpOworCQkJCWNhcmQtPnUuZi5jdXJyX3RyY19lbCA9IGNhcmQtPnUuZi50cmNfZWxfYmFzZTsKKyAgICAgICAgICAgICAJCQljYXJkLT51LmYudHJjX2VsX2xhc3QgPSBjYXJkLT51LmYuY3Vycl90cmNfZWwgKworCQkJCQkJCSgobnVtX3RyY19lbHMgLSAxKSAqIAorCQkJCQkJCXNpemVvZihmcl90cmNfZWxfdCkpOworICAgCisJCQkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHRyYWNlIGRhdGEgYXJlYSBpbiAqLworCQkJCS8qIHRoZSBVRFAgcGFja2V0ICovCisJCQkJY2FyZC0+dS5mLnRyY19iZnJfc3BhY2U9KE1BWF9MR1RIX1VEUF9NR05UX1BLVCAtCisJCQkJCS8vc2l6ZW9mKGZyX2VuY2FwX2hkcl90KSAtCisJCQkJCXNpemVvZihpcF9wa3RfdCkgLQorCQkJCQlzaXplb2YodWRwX3BrdF90KSAtCisJCQkJCXNpemVvZih3cF9tZ210X3QpIC0KKwkJCQkJc2l6ZW9mKGNibG9ja190KSk7CisKKwkJCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCQorCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBzZXQgcmV0dXJuIGNvZGUgdG8gbGluZSB0cmFjZSBhbHJlYWR5IAorCQkJCSAgIGVuYWJsZWQgKi8KKwkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJCQlicmVhazsKKworCisgICAgICAgICAgICAgICAgY2FzZSBGUElQRV9ESVNBQkxFX1RSQUNJTkc6CisJCQlpZihjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJCisJCQkJZG8geworCQkJCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9UUkFDRV9DT05GSUc7CisJCQkJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQkJCQltYm94LT5jbWQuZGxjaSA9IDB4MDA7CisJCQkJCW1ib3gtPmRhdGFbMF0gPSB+QUNUSVZBVEVfVFJDOworCQkJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJCQltYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQkJfSB3aGlsZSAoZXJyICYmIGNfcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgICAgICAJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZQSVBFX0dFVF9UUkFDRV9JTkZPOgorCisJCSAgICAgICAgLyogTGluZSB0cmFjZSBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIHRoZSA1MDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ib3gtPmNtZC5sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJcHRyX3RyY19lbCA9ICh2b2lkICopY2FyZC0+dS5mLmN1cnJfdHJjX2VsOworCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoID0gMDsKKwkJCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoZnJhbWVzID0gMDsgZnJhbWVzIDwgTUFYX0ZSTVNfVFJBQ0VEOyBmcmFtZXMgKyspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGxhX3BlZWsoJmNhcmQtPmh3LCAodW5zaWduZWQgbG9uZylwdHJfdHJjX2VsLAorCQkJCQkgICh2b2lkICopJnRyY19lbC5mbGFnLAorCQkJCQkgIHNpemVvZihmcl90cmNfZWxfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cmNfZWwuZmxhZyA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoY2FyZC0+dS5mLnRyY19iZnJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgc2l6ZW9mKGZwaXBlbW9uX3RyY19oZHJfdCkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+ZGF0YVsweDAwXSB8PSBNT1JFX1RSQ19EQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCQlmcGlwZW1vbl90cmMgPSAKKwkJCQkJKGZwaXBlbW9uX3RyY190ICopJmZyX3VkcF9wa3QtPmRhdGFbYnVmZmVyX2xlbmd0aF07IAorCQkJCWZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5zdGF0dXMgPQorCQkJCQl0cmNfZWwuYXR0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLnRtc3RhbXAgPQorCQkJCQl0cmNfZWwudG1zdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmxlbmd0aCA9IAorCQkJCQl0cmNfZWwubGVuZ3RoOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0cmNfZWwub2Zmc2V0IHx8ICF0cmNfZWwubGVuZ3RoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmRhdGFfcGFzc2VkID0gMHgwMDsKKworIAkJCQl9ZWxzZSBpZigodHJjX2VsLmxlbmd0aCArIHNpemVvZihmcGlwZW1vbl90cmNfaGRyX3QpICsgMSkgPgorCQkJCQkoY2FyZC0+dS5mLnRyY19iZnJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKSl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGlwZW1vbl90cmMtPmZwaXBlbW9uX3RyY19oZHIuZGF0YV9wYXNzZWQgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gfD0gTU9SRV9UUkNfREFUQTsKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5kYXRhX3Bhc3NlZCA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9wZWVrKCZjYXJkLT5odywgdHJjX2VsLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSAgZnBpcGVtb25fdHJjLT5kYXRhLAorCQkJCQkJICB0cmNfZWwubGVuZ3RoKTsKKwkJCQl9CQkJCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJjX2VsLmZsYWcgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGxhX3Bva2UoJmNhcmQtPmh3LCAodW5zaWduZWQgbG9uZylwdHJfdHJjX2VsLAorCQkJCQkgICZ0cmNfZWwuZmxhZywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJcHRyX3RyY19lbCArKzsKKwkJCQlpZigodm9pZCAqKXB0cl90cmNfZWwgPiBjYXJkLT51LmYudHJjX2VsX2xhc3QpCisJCQkJCXB0cl90cmNfZWwgPSAodm9pZCopY2FyZC0+dS5mLnRyY19lbF9iYXNlOworCisJCQkJYnVmZmVyX2xlbmd0aCArPSBzaXplb2YoZnBpcGVtb25fdHJjX2hkcl90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmRhdGFfcGFzc2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlidWZmZXJfbGVuZ3RoICs9IHRyY19lbC5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KKworCQkJCWlmKGZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gJiBNT1JFX1RSQ19EQVRBKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKwkJCWlmKGZyYW1lcyA9PSBNQVhfRlJNU19UUkFDRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlmcl91ZHBfcGt0LT5kYXRhWzB4MDBdIHw9IE1PUkVfVFJDX0RBVEE7CisJCQl9CisgICAgICAgICAgICAgCisJCQljYXJkLT51LmYuY3Vycl90cmNfZWwgPSAodm9pZCAqKXB0cl90cmNfZWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwYXNzZWQgKi8KKwkJCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gfD0KKwkJCQkoKGZyYW1lcyA8PCAxKSAmIChNQVhfRlJNU19UUkFDRUQgPDwgMSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGRhdGEgbGVuZ3RoIGFuZCByZXR1cm4gY29kZSAqLworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRlBJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhGMDIwLAorCQkJCSZmcl91ZHBfcGt0LT5kYXRhWzB4MDBdICwgMik7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gbWJveC0+Y21kLmxlbmd0aCA9IDI7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRlBJUEVfRkxVU0hfRFJJVkVSX1NUQVRTOgorCQkJaW5pdF9jaGFuX3N0YXRpc3RpY3MoY2hhbik7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKGNhcmQpOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRlBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCWNoYW4tPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCQljaGFuLT5yb3V0ZXJfc3RhcnRfdGltZTsKKyAgICAJICAgICAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSZmcl91ZHBfcGt0LT5kYXRhID0KKyAgICAJCQkJY2hhbi0+cm91dGVyX3VwX3RpbWU7CQorCQkJbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSA0OworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0lGU0VORDoKKwkJCW1lbWNweShmcl91ZHBfcGt0LT5kYXRhLAorCQkJCSZjaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZW50cnksCisJCQkJc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9c2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsJCisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQorCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0lOVFI6CisKKwkJCW1lbWNweShmcl91ZHBfcGt0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmZyX3VkcF9wa3QtPmRhdGFbc2l6ZW9mKGdsb2JhbF9zdGF0c190KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5kcnZzdGF0c19yeF9pbnRyLnJ4X2ludHJfbm9fc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKworCQkJbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSAKKwkJCQkJc2l6ZW9mKGdsb2JhbF9zdGF0c190KSArCisJCQkJCXNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRlBJUEVfRFJJVkVSX1NUQVRfR0VOOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGZyX3VkcF9wa3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZmcl91ZHBfcGt0LT5kYXRhW3NpemVvZihwaXBlX21nbXRfc3RhdF90KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtYm94LT5jbWQubGVuZ3RoID0gZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihnbG9iYWxfc3RhdHNfdCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKwkJY2FzZSBGUl9GVDFfU1RBVFVTX0NUUkw6CisJCQlpZihmcl91ZHBfcGt0LT5kYXRhWzBdID09IDEpIHsKKwkJCQlpZihyQ291bnQrKyAhPSAwICl7CisJCQkJCWZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfSAKKwkJCX0KKyAgICAgICAgICAgCisJCQkvKiBEaXNhYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJfdWRwX3BrdC0+ZGF0YVswXSA9PSAwKSB7CisJCQkJaWYoIC0tckNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0gCisJCQl9ICAKKwkJCWdvdG8gdWRwX21nbXRfZGZsdDsKKworCQkJCisJCWRlZmF1bHQ6Cit1ZHBfbWdtdF9kZmx0OgorIAkJCWRvIHsKKwkJCQltZW1jcHkoJm1ib3gtPmNtZCwKKwkJCQkJJmZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kLAorCQkJCQlzaXplb2YoZnJfY21kX3QpKTsKKwkJCQlpZihtYm94LT5jbWQubGVuZ3RoKSB7CisJCQkJCW1lbWNweSgmbWJveC0+ZGF0YSwKKwkJCQkJCShjaGFyICopZnJfdWRwX3BrdC0+ZGF0YSwKKwkJCQkJCW1ib3gtPmNtZC5sZW5ndGgpOworCQkJCX0KKyAJCQkJCisJCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IAorCQkJCQlDTURfVElNRU9VVDsKKwkJCX0gd2hpbGUgKGVyciAmJiBjX3JldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkJCWlmKCFlcnIpCisJCQkJY2hhbi0+ZHJ2c3RhdHNfZ2VuLgorCQkJCQlVRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0sgKys7CisJCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmRydnN0YXRzX2dlbi4KKwkJCQkJVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQgKys7CisKKyAgICAgICAJICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIG91ciBidWZmZXIgKi8KKwkJCW1lbWNweSgmZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsCisJCQkJJm1ib3gtPmNtZCwgc2l6ZW9mKGZyX2NtZF90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KCZmcl91ZHBfcGt0LT5kYXRhLAorCQkJCQkmbWJveC0+ZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisJCQl9CisJCX0gCisgICAgICAgIH0KKyAgIAorICAgICAgICAvKiBGaWxsIFVEUCBUVEwgKi8KKyAgICAgICAgZnJfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7CisgICAgICAgIGxlbiA9IHJlcGx5X3VkcChjYXJkLT51LmYudWRwX3BrdF9kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKworICAgICAgICBpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJY2hhbi0+ZnJfaGVhZGVyX2xlbj0yOworCQljaGFuLT5mcl9oZWFkZXJbMF09UTkyMl9VSTsKKwkJY2hhbi0+ZnJfaGVhZGVyWzFdPU5MUElEX0lQOworCQkJCisJCWVyciA9IGZyX3NlbmRfZGF0YV9oZWFkZXIoY2FyZCwgZGxjaSwgMCwgbGVuLCAKKwkJCWNhcmQtPnUuZi51ZHBfcGt0X2RhdGEsY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJCWlmIChlcnIpeyAKKwkJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfcGFzc2VkICsrOworCQl9ZWxzZXsKKwkJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfZmFpbGVkICsrOworCQl9CisJCQorCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJaWYoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCQkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCBsZW4pOworCQkJbWVtY3B5KGJ1ZiwgY2FyZC0+dS5mLnVkcF9wa3RfZGF0YSwgbGVuKTsKKyAgICAgICAgCisJCQljaGFuLT5kcnZzdGF0c19nZW4uCisJCQkJVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2sgKys7CisJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkJCW5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCQkJbmV0aWZfcngobmV3X3NrYik7CisgICAgICAgICAgICAJCisJCX0gZWxzZSB7CisJCQljaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9ub19zb2NrZXQgKys7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBVRFAgbWdtdCBjbW5kLCBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgCX0KKyAgICAgICAgfQorCisJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgSW52ZXJzZSBBUlAgUmVxdWVzdAorICovCisKK2ludCBzZW5kX2luYXJwX3JlcXVlc3Qoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI9MDsKKworCWFycGhkcl8xNDkwX3QgKkFycFBhY2tldDsKKwlhcnBoZHJfZnJfdCAqYXJwaGRyOworCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKworCWlmKGluX2RldiAhPSBOVUxMICkgewkKKworCQlBcnBQYWNrZXQgPSBrbWFsbG9jKHNpemVvZihhcnBoZHJfMTQ5MF90KSArIHNpemVvZihhcnBoZHJfZnJfdCksIEdGUF9BVE9NSUMpOworCQkvKiBTTkFQIEhlYWRlciBpbmRpY2F0aW5nIEFSUCAqLworCQlBcnBQYWNrZXQtPmNvbnRyb2wJPSAweDAzOworCQlBcnBQYWNrZXQtPnBhZAkJPSAweDAwOworCQlBcnBQYWNrZXQtPk5MUElECT0gMHg4MDsKKwkJQXJwUGFja2V0LT5PVUlbMF0JPSAwOworCQlBcnBQYWNrZXQtPk9VSVsxXQk9IDA7CisJCUFycFBhY2tldC0+T1VJWzJdCT0gMDsKKwkJQXJwUGFja2V0LT5QSUQJCT0gMHgwNjA4OworCisJCWFycGhkciA9IChhcnBoZHJfZnJfdCAqKShBcnBQYWNrZXQgKyAxKTsgLy8gR28gdG8gQVJQIFBhY2tldAorCisJCS8qIEluQVJQIHJlcXVlc3QgKi8JCQorCQlhcnBoZHItPmFyX2hyZCA9IDB4MEYwMDsJLyogRnJhbWUgUmVsYXkgSFcgdHlwZSAqLworCQlhcnBoZHItPmFyX3BybyA9IDB4MDAwODsJLyogSVAgUHJvdG9jb2wJICAgICAgICovCisJCWFycGhkci0+YXJfaGxuID0gMjsJCS8qIEhXIGFkZHIgbGVuZ3RoICAgICAgKi8KKwkJYXJwaGRyLT5hcl9wbG4gPSA0OwkJLyogSVAgYWRkciBsZW5ndGggICAgICAqLworCQlhcnBoZHItPmFyX29wID0gaHRvbnMoMHgwOCk7CS8qIEluQVJQIFJlcXVlc3QgICAgICAgKi8KKwkJYXJwaGRyLT5hcl9zaGEgPSAwOyAJCS8qIHNyYyBIVyBETENJIC0gRG9lc24ndCBtYXR0ZXIgKi8KKwkJaWYoaW5fZGV2LT5pZmFfbGlzdCAhPSBOVUxMKQorCQkJYXJwaGRyLT5hcl9zaXAgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7ICAvKiBMb2NhbCBBZGRyZXNzICAgICAgICovZWxzZQorCQkJYXJwaGRyLT5hcl9zaXAgPSAwOworCQlhcnBoZHItPmFyX3RoYSA9IDA7IAkJLyogZHN0IEhXIERMQ0kgLSBEb2Vzbid0IG1hdHRlciAqLworCQlhcnBoZHItPmFyX3RpcCA9IDA7CQkvKiBSZW1vdGUgQWRkcmVzcyAtLSB3aGF0IHdlIHdhbnQgKi8KKworCQllcnIgPSBmcl9zZW5kKGNhcmQsIGNoYW4tPmRsY2ksIDAsIHNpemVvZihhcnBoZHJfMTQ5MF90KSArIHNpemVvZihhcnBoZHJfZnJfdCksCisJCSAgIAkJCSh2b2lkICopQXJwUGFja2V0KTsKKworCQlpZiAoIWVycil7CisJCQlwcmludGsoS0VSTl9JTkZPICJcbiVzOiBTZW5kaW5nIEluQVJQIHJlcXVlc3Qgb24gRExDSSAlZC5cbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQkJY2xlYXJfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQl9CisKKwkJa2ZyZWUoQXJwUGFja2V0KTsKKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElOQVJQIEVSUk9SOiAlcyBkb2Vzbid0IGhhdmUgYSBsb2NhbCBJUCBhZGRyZXNzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgcGFja2V0IGZvciBBUlAgVHlwZQorICovCisKK2ludCBpc19hcnAodm9pZCAqYnVmKQoreworCWFycGhkcl8xNDkwX3QgKmFycGhkciA9IChhcnBoZHJfMTQ5MF90ICopYnVmOworCQorCWlmIChhcnBoZHItPnBhZCAgID09IDB4MDAgICYmCisJICAgIGFycGhkci0+TkxQSUQgPT0gMHg4MCAgJiYKKwkgICAgYXJwaGRyLT5QSUQgICA9PSAweDA2MDgpIAorCQlyZXR1cm4gMTsKKwllbHNlIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBBUlAgUGFja2V0IFR5cGUKKyAqLworCitpbnQgcHJvY2Vzc19BUlAoYXJwaGRyXzE0OTBfdCAqQXJwUGFja2V0LCBzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisKKworCWFycGhkcl9mcl90ICphcnBoZHIgPSAoYXJwaGRyX2ZyX3QgKikoQXJwUGFja2V0ICsgMSk7IC8qIFNraXAgaGVhZGVyICovCisJZnJfcnhfYnVmX2N0bF90KiBmcmJ1ZiA9IGNhcmQtPnJ4bWI7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsJCQorCQorCS8qIEJlZm9yZSB3ZSB0cmFuc21pdCBBUlAgcGFja2V0LCB3ZSBtdXN0IGNoZWNrIAorCSAqIHRvIHNlZSB0aGF0IHdlIGFyZSBub3QgY3VycmVudGx5IHRyYW5zbWl0dGluZyBhIAorCSAqIGZyYW1lIChpbiAnaWZfc2VuZCgpJykgYW5kIHRoYXQgd2UgYXJlIG5vdCAKKwkgKiBhbHJlYWR5IGluIGEgJ2RlbGF5ZWQgdHJhbnNtaXQnIHN0YXRlLiAqLworCWlmIChjaGVja190eF9zdGF0dXMoY2FyZCxkZXYpKXsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEaXNhYmxpbmcgY29tbWluaWNhdGlvbiB0byBwcm9jZXNzIEFSUFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJc2V0X2JpdChBUlBfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKwkvKiBDaGVjayB0aGF0IElQIGFkZHJlc3NlcyBleGlzdCBmb3Igb3VyIG5ldHdvcmsgYWRkcmVzcyAqLworCWlmIChpbl9kZXYgPT0gTlVMTCB8fCBpbl9kZXYtPmlmYV9saXN0ID09IE5VTEwpIAorCQlyZXR1cm4gLTE7CisKKwlzd2l0Y2ggKG50b2hzKGFycGhkci0+YXJfb3ApKSB7CisKKwljYXNlIDB4MDg6ICAvLyBJbnZlcnNlIEFSUCByZXF1ZXN0ICAtLSBTZW5kIFJlcGx5LCBhZGQgcm91dGUuCisJCQkKKwkJLyogQ2hlY2sgZm9yIHZhbGlkIEFkZHJlc3MgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY3ZkIFB0UCBhZGRyIC1JbkFycCBSZXE6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoYXJwaGRyLT5hcl9zaXApKTsKKworCisJCS8qIENoZWNrIHRoYXQgdGhlIG5ldHdvcmsgYWRkcmVzcyBpcyB0aGUgc2FtZSBhcyBvdXJzLCBvbmx5CisgICAgICAgICAgICAgICAgICogaWYgdGhlIG5ldG93cmsgbWFzayBpcyBub3QgMjU1LjI1NS4yNTUuMjU1LiBPdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGNoZWNrIHdvdWxkIG5vdCBtYWtlIHNlbnNlICovCisKKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICE9IDB4RkZGRkZGRkYgJiYgCisJCSAgICAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgJiBhcnBoZHItPmFyX3NpcCkgIT0gCisJCSAgICAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgJiBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBJbnZhbGlkIFB0UCBhZGRyZXNzLiAldS4ldS4ldS4ldSAgSW5BUlAgaWdub3JlZC5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQoYXJwaGRyLT5hcl9zaXApKTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG1hc2sgJXUuJXUuJXUuJXVcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2spKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9jYWwgJXUuJXUuJXUuJXVcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsTklQUVVBRChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwgPT0gYXJwaGRyLT5hcl9zaXApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IExvY2FsIGFkZHIgPSBQdFAgYWRkci4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkKKwkJYXJwaGRyLT5hcl9vcCA9IGh0b25zKDB4MDkpOwkvKiBJbkFSUCBSZXBseSAqLworCisJCS8qIFNldCBhZGRyZXNzZXMgKi8KKwkJYXJwaGRyLT5hcl90aXAgPSBhcnBoZHItPmFyX3NpcDsKKwkJYXJwaGRyLT5hcl9zaXAgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisKKwkJY2hhbi0+aXBfbG9jYWwgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCWNoYW4tPmlwX3JlbW90ZSA9IGFycGhkci0+YXJfc2lwOworCisJCWZyX3NlbmQoY2FyZCwgZnJidWYtPmRsY2ksIDAsIGZyYnVmLT5sZW5ndGgsICh2b2lkICopQXJwUGFja2V0KTsKKworCQlpZiAodGVzdF9iaXQoQVJQX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQVJQIFByb2Nlc3NlZCBFbmFibGluZyBDb21tdW5pY2F0aW9uIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkKKwkJY2hhbi0+aXBfbG9jYWwgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCWNoYW4tPmlwX3JlbW90ZSA9IGFycGhkci0+YXJfc2lwOworCisJCS8qIEFkZCBSb3V0ZSBGbGFnICovCisJCS8qIFRoZSByb3V0ZSB3aWxsIGJlIGFkZGVkIGluIHRoZSBwb2xsaW5nIHJvdXRpbmUgc28KKwkJICAgdGhhdCBpdCBpcyBub3QgaW50ZXJydXB0IGNvbnRleHQuICovCisKKwkJY2hhbi0+cm91dGVfZmxhZyA9IEFERF9ST1VURTsKKwkJdHJpZ2dlcl9mcl9wb2xsIChkZXYpOworCisJCWJyZWFrOworCisJY2FzZSAweDA5OiAgLy8gSW52ZXJzZSBBUlAgcmVwbHkKKworCQkvKiBDaGVjayBmb3IgdmFsaWQgQWRkcmVzcyAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjdmQgUHRQIGFkZHIgJXUuJXUuJXUuJXUgLUluQXJwIFJlcGx5XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGFycGhkci0+YXJfc2lwKSk7CisKKworCQkvKiBDb21wYXJlIG5ldHdvcmsgYWRkcmVzc2VzLCBvbmx5IGlmIG5ldHdvcmsgbWFzaworICAgICAgICAgICAgICAgICAqIGlzIG5vdCAyNTUuMjU1LjI1NS4yNTUgIEl0IHdvdWxkIG5vdCBtYWtlIHNlbnNlCisgICAgICAgICAgICAgICAgICogdG8gcGVyZm9ybSB0aGlzIHRlc3QgaWYgdGhlIG1hc2sgd2FzIGFsbCAxJ3MgKi8KKworCQlpZiAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgIT0gMHhmZmZmZmZmZiAmJgorCQkgICAgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgYXJwaGRyLT5hcl9zaXApICE9IAorCQkJKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsKSkgeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBQdFAgYWRkcmVzcy4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVjZWl2ZWQgSVAgYWRkcmVzcyBpcyBub3QKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBhcyBvdXIgb3duIGxvY2FsIGFkZHJlc3MgKi8KKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbCA9PSBhcnBoZHItPmFyX3NpcCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvY2FsIGFkZHIgPSBQdFAgYWRkci4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQkJCQorCisJCWNoYW4tPmlwX2xvY2FsICA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbDsKKwkJY2hhbi0+aXBfcmVtb3RlID0gYXJwaGRyLT5hcl9zaXA7CisKKwkJLyogQWRkIFJvdXRlIEZsYWcgKi8KKwkJLyogVGhlIHJvdXRlIHdpbGwgYmUgYWRkZWQgaW4gdGhlIHBvbGxpbmcgcm91dGluZSBzbworCQkgICB0aGF0IGl0IGlzIG5vdCBpbnRlcnJ1cHQgY29udGV4dC4gKi8KKworCQljaGFuLT5yb3V0ZV9mbGFnID0gQUREX1JPVVRFOworCQljaGFuLT5pbmFycCA9IElOQVJQX0NPTkZJR1VSRUQ7CisJCXRyaWdnZXJfZnJfcG9sbChkZXYpOworCQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7IC8vIEFSUCdzIGFuZCBSQVJQJ3MgLS0gU2hvdWxkbid0IGhhcHBlbi4KKwl9CisKKwlyZXR1cm4gMDsJCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfZnJfYXJwCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGFuIGZyX2FycCgpIHRhc2sgaW50byBhIGFycAorICogICAgICB0aW1lciBoYW5kbGVyIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgCisgKiAgICAgIFRoaXMgd2lsbCBraWNrIHRoZSBmcl9hcnAoKSByb3V0aW5lIAorICogICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIGludGVydmFsLiAKKyAqCisgKiBVc2FnZToKKyAqIAlUaGlzIHRpbWVyIGlzIHVzZWQgdG8gc2VuZCBBUlAgcmVxdWVzdHMgYXQKKyAqICAgICAgY2VydGFpbiB0aW1lIGludGVydmFscy4gCisgKiAJQ2FsbGVkIGJ5IGFuIGludGVycnVwdCB0byByZXF1ZXN0IGFuIGFjdGlvbgorICogICAgICBhdCBhIGxhdGVyIGRhdGUuCisgKi8JCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYXJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCisJbW9kX3RpbWVyKCZjaGFuLT5mcl9hcnBfdGltZXIsIGppZmZpZXMgKyBjaGFuLT5pbmFycF9pbnRlcnZhbCAqIEhaKTsKKwlyZXR1cm47Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQVJQIFJlcXVlc3QgQWN0aW9uCisgKgorICoJVGhpcyBmdW5jaXRvbiBpcyBjYWxsZWQgYnkgdGltZXIgaW50ZXJydXB0IHRvIHNlbmQgYW4gYXJwIHJlcXVlc3QKKyAqICAgICAgdG8gdGhlIHJlbW90ZSBlbmQuCisgKi8KKworc3RhdGljIHZvaWQgZnJfYXJwICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCXZvbGF0aWxlIHNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCS8qIFNlbmQgQVJQIHBhY2tldHMgZm9yIGFsbCBkZXZzJyB1bnRpbAorICAgICAgICAgKiBBUlAgc3RhdGUgY2hhbmdlcyB0byBDT05GSUdVUkVEICovCisKKwlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfUkVRVUVTVCAmJgorCSAgICBjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCAmJiAKKwkgICAgY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9DT05ORUNURUQpeworCQlzZXRfYml0KDAsJmNoYW4tPmluYXJwX3JlYWR5KTsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9BUlA7CisJCWZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOwkKKwl9CisgCisJcmV0dXJuOworfQorCQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSB0aGUgSW50ZXJydXB0IFRlc3QgYnkgcnVubmluZyB0aGUgUkVBRF9DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUl8KKyAqIFRFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCApCit7CisJZnJfbWJveF90KiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycixpOworCisgICAgICAgIGVyciA9IGZyX3NldF9pbnRyX21vZGUoY2FyZCwgRlJfSU5UUl9SRUFEWSwgY2FyZC0+d2FuZGV2Lm10dSwgMCApOworCQorCWlmIChlcnIgPT0gQ01EX09LKSB7CisKKwkJZm9yICggaSA9IDA7IGkgPCBNQVhfSU5UUl9URVNUX0NPVU5URVI7IGkrKyApIHsKKyAJCQkvKiBSdW4gY29tbWFuZCBSRUFEX0NPREVfVkVSU0lPTiAqLworCQkJbWItPmNtZC5sZW5ndGggID0gMDsKKwkJCW1iLT5jbWQuY29tbWFuZCA9IEZSX1JFQURfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENNRF9PSykgCisJCQkJZnJfZXZlbnQoY2FyZCwgZXJyLCBtYik7CisJCX0KKwkKKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyOwkKKwl9CisKKwllcnIgPSBmcl9zZXRfaW50cl9tb2RlKCBjYXJkLCAwLCBjYXJkLT53YW5kZXYubXR1LCAwICk7CisKKwlpZiggZXJyICE9IENNRF9PSyApIAorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgd2hhdCB0eXBlIG9mIFVEUCBjYWxsIGl0IGlzLiBGUElQRThORCA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzZGxhX3QqIGNhcmQgKQoreworCWZyX3VkcF9wa3RfdCAqZnJfdWRwX3BrdCA9IChmcl91ZHBfcGt0X3QgKilza2ItPmRhdGE7CisKKwkvKiBRdWljayBIQUNLICovCisJCisJCisgICAgICAgIGlmKChmcl91ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wgPT0gVURQTUdNVF9VRFBfUFJPVE9DT0wpICYmCisJCShmcl91ZHBfcGt0LT5pcF9wa3QudmVyX2luZXRfaGRyX2xlbmd0aCA9PSAweDQ1KSAmJgorCQkoZnJfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPT0gCisJCW50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJCShmcl91ZHBfcGt0LT53cF9tZ210LnJlcXVlc3RfcmVwbHkgPT0gCisJCVVEUE1HTVRfUkVRVUVTVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJuY21wKGZyX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRFBNR01UX0ZQSVBFX1NJR05BVFVSRSwgOCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVURQX0ZQSVBFX1RZUEU7CisJCQl9CisJfQorICAgICAgICByZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZXMgdGhlIFN0YXRpc3RpY3MgdmFsdWVzIGluIHRoZSBmcl9jaGFubmVsIHN0cnVjdHVyZS4KKyAqLwordm9pZCBpbml0X2NoYW5fc3RhdGlzdGljcyggZnJfY2hhbm5lbF90KiBjaGFuKQoreworICAgICAgICBtZW1zZXQoJmNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9lbnRyeSwgMCwKKwkJc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisgICAgICAgIG1lbXNldCgmY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX25vX3NvY2tldCwgMCwKKyAgICAgICAgICAgICAgICBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKyAgICAgICAgbWVtc2V0KCZjaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwgMCwKKyAgICAgICAgICAgICAgICBzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOworfQorCQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemVzIHRoZSBTdGF0aXN0aWNzIHZhbHVlcyBpbiB0aGUgU2RsYV90IHN0cnVjdHVyZS4KKyAqLwordm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QqIGNhcmQgKQoreworCS8qIEludGlhbGl6ZSBnbG9iYWwgc3RhdGlzdGljcyBmb3IgYSBjYXJkICovCisgICAgICAgIG1lbXNldCgmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksIDAsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworfQorCitzdGF0aWMgdm9pZCByZWFkX0RMQ0lfSUJfbWFwcGluZyggc2RsYV90KiBjYXJkLCBmcl9jaGFubmVsX3QqIGNoYW4gKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsJCisJZGxjaV9JQl9tYXBwaW5nX3QqIHJlc3VsdDsgCisJaW50IGVyciwgY291bnRlciwgZm91bmQ7CQorCisJZG8geworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1JFQURfRExDSV9JQl9NQVBQSU5HOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsJCisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmKCBtYm94LT5jbWQucmVzdWx0ICE9IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBETENJIElCIE1hcHBpbmcgZmFpbGVkXG4iLCAKKwkJCWNoYW4tPm5hbWUpOworCX0KKworCWNvdW50ZXIgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKGRsY2lfSUJfbWFwcGluZ190KTsKKwlyZXN1bHQgPSAodm9pZCAqKW1ib3gtPmRhdGE7CisJCisJZm91bmQgPSAwOworCWZvciAoOyBjb3VudGVyOyAtLWNvdW50ZXIsICsrcmVzdWx0KSB7CisJCWlmICggcmVzdWx0LT5kbGNpID09IGNoYW4tPmRsY2kgKSB7CisJCQljaGFuLT5JQl9hZGRyID0gcmVzdWx0LT5hZGRyX3ZhbHVlOworCQkJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpeworCSAgICAgICAgICAgICAJCWNoYW4tPmRsY2lfaW50X2ludGVyZmFjZSA9CisJCQkJCSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCQkJCWNoYW4tPklCX2FkZHIpOworICAgICAgIAkJCX1lbHNleyAKKwkJCQljaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UgPSAKKwkJCQkJKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJCShjaGFuLT5JQl9hZGRyICYgMHgwMDAwMUZGRikpOworCisJCQl9CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsJCisJCX0gCisJfQorCWlmICghZm91bmQpCisJCXByaW50ayggS0VSTl9JTkZPICIlczogRExDSSAlZCBub3QgZm91bmQgYnkgSUIgTUFQUElORyBjbWRcbiIsIAorCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKK30KKworCisKK3ZvaWQgczUwOF9zNTE0X2xvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJaWYgKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworCX1lbHNleworCQlzcGluX2xvY2soJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKKwordm9pZCBzNTA4X3M1MTRfdW5sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCWlmIChjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgIFJFQ0VJVkUgSU5URVJSVVBUOiBCT1RUT00gSEFMRiBIQU5ETEVSUyAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBiaF9lbnF1ZXVlCisgKgorICogRGVzY3JpcHRpb246CisgKglJbnNlcnQgYSByZWNlaXZlZCBwYWNrZXQgaW50byBhIGNpcmN1bGFyCisgKiAgICAgIHJ4IHF1ZXVlLiAgVGhpcyBwYWNrZXQgd2lsbCBiZSBwaWNrZWQgdXAgCisgKiAgICAgIGJ5IGZyX2JoKCkgYW5kIHNlbnQgdXAgdGhlIHN0YWNrIHRvIHRoZQorICogICAgICB1c2VyLgorICogICAgICAgCQorICogVXNhZ2U6IAorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcnggaW50ZXJydXB0LAorICogICAgICBpbiBBUEkgbW9kZS4KKyAqCisgKi8KKworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogQ2hlY2sgZm9yIGZ1bGwgKi8KKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IE1BWF9CSF9CVUZGKXsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDE7IAorCX0KKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+Ymhfd3JpdGVdKS0+c2tiID0gc2tiOworCisJaWYgKGNoYW4tPmJoX3dyaXRlID09IChNQVhfQkhfQlVGRi0xKSl7CisJCWNoYW4tPmJoX3dyaXRlPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+Ymhfd3JpdGU7CisJfQorCisJYXRvbWljX2luYygmY2hhbi0+YmhfYnVmZl91c2VkKTsKKworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfZnJfYmgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAlLaWNrIHRoZSBmcl9iaCgpIGhhbmRsZXIKKyAqCisgKiBVc2FnZToKKyAqCXJ4IGludGVycnVwdCBjYWxscyB0aGlzIGZ1bmN0aW9uIGR1cmluZworICogICAgICB0aGUgQVBJIG1vZGUuIAorICovCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYmggKGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwmY2hhbi0+dHFfd29ya2luZykpeworCQl3YW5waXBlX3F1ZXVlX3dvcmsoJmNoYW4tPmNvbW1vbi53YW5waXBlX3dvcmspOworCX0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9iaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRnJhbWUgcmVsYXkgcmVjZWl2ZSBCSCBoYW5kbGVyLiAKKyAqCURlcXVldWUgZGF0YSBmcm9tIHRoZSBCSCBjaXJjdWxhciAKKyAqCWJ1ZmZlciBhbmQgcGFzcyBpdCB1cCB0aGUgQVBJIHNvY2suCisgKiAgICAgICAJCisgKiBSYXRpb25hbGU6IAorICoJVGhpcyBmdWN0aW9uIGlzIHVzZWQgdG8gb2ZmbG9hZCB0aGUgCisgKglyeF9pbnRlcnJ1cHQgZHVyaW5nIEFQSSBvcGVyYXRpb24gbW9kZS4gIAorICoJVGhlIGZyX2JoKCkgZnVuY3Rpb24gZXhlY3V0ZXMgZm9yIGVhY2ggCisgKglkbGNpL2ludGVyZmFjZS4gIAorICogCisgKiAgICAgIE9uY2UgcmVjZWl2ZSBpbnRlcnJ1cHQgY29waWVzIGRhdGEgZnJvbSB0aGUKKyAqICAgICAgY2FyZCBpbnRvIGFuIHNrYiBidWZmZXIsIHRoZSBza2IgYnVmZmVyCisgKiAgCWlzIGFwcGVuZGVkIHRvIGEgY2lyY3VsYXIgQkggYnVmZmVyLgorICogIAlUaGVuIHRoZSBpbnRlcnJ1cHQga2lja3MgZnJfYmgoKSB0byBmaW5pc2ggdGhlCisgKiAgICAgIGpvYiBhdCBhIGxhdGVyIHRpbWUgKG5vdCB3aXRoaW4gdGhlIGludGVycnVwdCkuCisgKiAgICAgICAKKyAqIFVzYWdlOgorICogCUludGVycnVwdHMgdXNlIHRoaXMgdG8gZGVmZXIgYSB0YXNrIHRvIAorICogICAgICBhIHBvbGxpbmcgcm91dGluZS4KKyAqCisgKi8JCisKK3N0YXRpYyB2b2lkIGZyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gMCl7CisJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkpeworCisJCWlmIChjaGFuLT5jb21tb24uc2sgPT0gTlVMTCB8fCBjaGFuLT5jb21tb24uZnVuYyA9PSBOVUxMKXsKKwkJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCQlyZXR1cm47CisJCX0KKworCQlza2IgID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYjsKKworCQlpZiAoc2tiICE9IE5VTEwpeworCisJCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWZyX2JoX2NsZWFudXAoZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbm90aGVyIHRyeSAqLworCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5yZWNlaXZlX2Jsb2NrLDEpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCWZyX2JoX2NsZWFudXAoZGV2KTsKKwkJCX0KKwkJfWVsc2V7CisJCQlmcl9iaF9jbGVhbnVwKGRldik7CisJCX0KKwl9CQorCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZnJfYmhfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2IgPSBOVUxMOworCisJaWYgKGNoYW4tPmJoX3JlYWQgPT0gKE1BWF9CSF9CVUZGLTEpKXsKKwkJY2hhbi0+YmhfcmVhZD0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3JlYWQ7CQorCX0KKworCWF0b21pY19kZWMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICBQT0xMIEJIIEhBTkRMRVJTIEFORCBLSUNLIFJPVVRJTkVTIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9mcl9wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgZnJfcG9sbCgpIHRhc2sgaW50byBhIHRxX3NjaGVkdWxlciBiaCBoYW5kbGVyCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgVGhpcyB3aWxsIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzY2hlZHVsZV93b3JrKCZjaGFuLT5mcl9wb2xsX3dvcmspOworCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZnJfcG9sbAorICoJCisgKiBSYXRpb25hbGU6CisgKiAJV2UgY2Fubm90IG1hbmlwdWxhdGUgdGhlIHJvdXRpbmcgdGFibGVzLCBvcgorICogICAgICBpcCBhZGRyZXNzZXMgd2l0aGluZyB0aGUgaW50ZXJydXB0LiBUaGVyZWZvcmUKKyAqICAgICAgd2UgbXVzdCBwZXJmb3JtIHN1Y2ggYWN0b25zIG91dHNpZGUgYW4gaW50ZXJydXB0IAorICogICAgICBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIERlc2NyaXB0aW9uOgkKKyAqCUZyYW1lIHJlbGF5IHBvbGxpbmcgcm91dGluZSwgcmVzcG9uc2libGUgZm9yIAorICogICAgIAlzaHV0dGluZyBkb3duIGludGVyZmFjZXMgdXBvbiBkaXNjb25uZWN0CisgKiAgICAgCWFuZCBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzLiAKKyAqICAgICAgCisgKiBVc2FnZTogICAgICAgIAorICogCVRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggZnJhbWUgcmVsYXkKKyAqIAlkbGNpL2ludGVyZmFjZSB0aHJvdWdoIGEgdHFfc2NoZWR1bGUgYm90dG9tIGhhbGYuCisgKiAgICAgIAorICogICAgICB0cmlnZ2VyX2ZyX3BvbGwoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwgcm91dGluZS4gIAorICovCisKK3N0YXRpYyB2b2lkIGZyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWZyX2NoYW5uZWxfdCogY2hhbjsKKwlzZGxhX3QgKmNhcmQ7CisJdTggY2hlY2tfZ2F0ZXdheT0wOworCisJaWYgKCFkZXYgfHwgKGNoYW4gPSBkZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBjaGFuLT5jYXJkOworCQorCS8qIChSZSlDb25maWd1cmFpdG9uIGlzIGluIHByb2dyZXNzLCBzdG9wIHdoYXQgeW91IGFyZSAKKwkgKiBkb2luZyBhbmQgZ2V0IG91dCAqLworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChjaGFuLT5jb21tb24uc3RhdGUpeworCisJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICF0ZXN0X2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgZGV2LT5mbGFncyZJRkZfVVApeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGlzIERvd24uXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQljaGFuZ2VfZGV2X2ZsYWdzKGRldixkZXYtPmZsYWdzJn5JRkZfVVApOworCQkJc2V0X2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKTsKKwkJCWNoYW4tPnJvdXRlX2ZsYWcgPSBOT19ST1VURTsKKwkJCQorCQl9ZWxzZXsKKwkJCWlmIChjaGFuLT5pbmFycCAhPSBJTkFSUF9OT05FKQorCQkJCXByb2Nlc3Nfcm91dGUoZGV2KTsJCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdBTl9DT05ORUNURUQ6CisKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJmNoYW4tPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgdGVzdF9iaXQoREVWX0RPV04sICZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICEoZGV2LT5mbGFncyZJRkZfVVApKXsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyBpcyBVcC5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoZGV2LGRldi0+ZmxhZ3N8SUZGX1VQKTsKKwkJCWNsZWFyX2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGFuLT5pbmFycCAhPSBJTkFSUF9OT05FKXsKKwkJCXByb2Nlc3Nfcm91dGUoZGV2KTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGFuLT5nYXRld2F5ICYmIGNoZWNrX2dhdGV3YXkpCisJCQlhZGRfZ2F0ZXdheShjYXJkLGRldik7CisKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm47CQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjaGVja190eF9zdGF0dXMKKyAqCisgKiBSYXRpb25hbGU6CisgKglXZSBjYW5ub3QgdHJhbnNtaXQgZnJvbSBhbiBpbnRlcnJ1cHQgd2hpbGUKKyAqICAgICAgdGhlIGlmX3NlbmQgaXMgdHJhbnNtaXR0aW5nIGRhdGEuICBUaGVyZWZvcmUsCisgKiAgICAgIHdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgdHggYnVmZmVycyBhcmUKKyAqICAgICAgYmVnaW4gdXNlZCwgYmVmb3JlIHdlIHRyYW5zbWl0IGZyb20gYW4KKyAqICAgICAgaW50ZXJydXB0LgkKKyAqIAorICogRGVzY3JpcHRpb246CQorICoJQ2hlY2tzIHdoZXRoZXIgaXQncyBzYWZlIHRvIHVzZSB0aGUgdHJhbnNtaXQgCisgKiAgICAgIGJ1ZmZlcnMuIAorICoKKyAqIFVzYWdlOgorICogCUFSUCBhbmQgVURQIGhhbmRsaW5nIHJvdXRpbmVzIHVzZSB0aGlzIGZ1bmN0aW9uCisgKiAgICAgIGJlY2F1c2UsIHRoZXkgbmVlZCB0byB0cmFuc21pdCBkYXRhIGR1cmluZworICogICAgICBhbiBpbnRlcnJ1cHQuCisgKi8KKworc3RhdGljIGludCBjaGVja190eF9zdGF0dXMoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKwkJaWYgKHRlc3RfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpIHx8CisJCQl0ZXN0X2JpdChTRU5EX1RYSVJRX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpIHx8IChjYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nKSkKKyAgICAgCQlyZXR1cm4gMTsgCisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIG1vdmVfZGV2X3RvX25leHQKKyAqICAKKyAqIERlc2NyaXB0aW9uOgorICoJTW92ZSB0aGUgZGV2IHBvaW50ZXIgdG8gdGhlIG5leHQgbG9jYXRpb24gaW4gdGhlCisgKiAgICAgIGxpbmsgbGlzdC4gIENoZWNrIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSAKKyAqICAgICAgbGlzdCwgaWYgc28gc3RhcnQgZnJvbSB0aGUgYmVnaW5pbmcuCisgKgorICogVXNhZ2U6CisgKiAJVGltZXIgaW50ZXJydXB0IHVzZXMgdGhpcyBmdW5jdGlvbiB0byBlZmZpY2llbnRseQorICogICAgICBzdGVwIHRocm91Z2ggdGhlIGRldmljZXMgdGhhdCBuZWVkIHRvIHNlbmQgQVJQIGRhdGEuCisgKgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgIT0gMSl7CisJCWlmICghKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkKKwkJCXJldHVybiBjYXJkLT53YW5kZXYuZGV2OworCQllbHNlCisJCQlyZXR1cm4gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KTsKKwl9CisJcmV0dXJuIGRldjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9jb25maWdfZnIKKyAqCisgKiBSYXRpb25hbGU6CisgKglBbGwgY29tbWFuZHMgbXVzdCBiZSBwZXJmb3JtZWQgaW5zaWRlIG9mIGEgIAorICogICAgICBpbnRlcnJ1cHQuICAgCisgKgorICogRGVzY3JpcHRpb246CisgKglLaWNrIHRoZSBjb25maWdfZnIoKSByb3V0aW5lIHRocm91Z2h0IHRoZQorICogICAgICB0aW1lciBpbnRlcnJ1cHQuCisgKi8KKworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2NvbmZpZ19mciAoc2RsYV90ICpjYXJkKQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfZnIKKyAqCisgKiBSYXRpb25hbGU6CisgKiAJQWxsIGNvbW1hbmRzIG11c3QgYmUgcGVyZm9ybWVkIGluc2lkZSBvZiBhICAKKyAqICAgICAgaW50ZXJydXB0LiAgCisgJgorICogRGVzY3JpcHRpb246CQorICogCUNvbmZpZ3VyZSBhIERMQ0kuIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQKKyAqICAgICAgYnkgYSB0aW1lcl9pbnRlcnJ1cHQuICBUaGUgaWZfb3BlbigpIGZ1bmN0aW9uCisgKiAgICAgIHRyaWdnZXJzIGl0LgorICoKKyAqIFVzYWdlOgorICoJbmV3X2lmKCkgY29sbGVjdHMgYWxsIGRhdGEgbmVjZXNzYXJ5IHRvCisgKiAgICAgIGNvbmZpZ3VyZSB0aGUgRExDSS4gSXQgc2V0cyB0aGUgY2hhbi0+ZGxjaV9yZWFkeSAKKyAqICAgICAgYml0LiAgV2hlbiB0aGUgaWZfb3BlbigpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkCisgKiAgICAgIGl0IGNoZWNrcyB0aGlzIGJpdCwgYW5kIGlmIGl0cyBzZXQgaXQgdHJpZ2dlcnMKKyAqICAgICAgdGhlIHRpbWVyIGludGVycnVwdCB0byBleGVjdXRlIHRoZSBjb25maWdfZnIoKQorICogICAgICBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBjb25maWdfZnIgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQorCQlpZiAoKGNoYW49ZGV2LT5wcml2KSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCQorCQlpZiAoIXRlc3RfYml0KDAsJmNoYW4tPmNvbmZpZ19kbGNpKSkKKwkJCWNvbnRpbnVlOworCisJCWNsZWFyX2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSk7CisKKwkJLyogSWYgc2lnbmFsbGluZyBpcyBzZXQgdG8gTk8sIHRoZW4gc2V0dXAgCisgICAgICAgIAkgKiBETENJIGFkZHJlc3NlcyByaWdodCBhd2F5LiAgRG9uJ3QgaGF2ZSB0byB3YWl0IGZvcgorCQkgKiBsaW5rIHRvIGNvbm5lY3QuIAorCQkgKi8KKwkJaWYgKGNhcmQtPndhbmRldi5zaWduYWxsaW5nID09IFdBTk9QVF9OTyl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2lnbmFsbGluZyBzZXQgdG8gTk86IE1hcHBpbmcgRExDSSdzXG4iLAorCQkJCQljYXJkLT53YW5kZXYubmFtZSk7CisJCQlpZiAoZnJfaW5pdF9kbGNpKGNhcmQsY2hhbikpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogRmFpbGVkIHRvIGNvbmZpZ3VyZSBETENJICVpICFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWlmIChjYXJkLT53YW5kZXYuc3RhdGlvbiA9PSBXQU5PUFRfQ1BFKSB7CisJCisJCQl1cGRhdGVfY2hhbl9zdGF0ZShkZXYpOwkKKwkJCQorCQkJLyogQ1BFOiBpc3N1ZSBmdWxsIHN0YXR1cyBlbnF1aXJ5ICovCisJCQlmcl9pc3N1ZV9pc2YoY2FyZCwgRlJfSVNGX0ZTRSk7CisKKwkJfSBlbHNlIHsJCisJCQkvKiBGUiBzd2l0Y2g6IGFjdGl2YXRlIERMQ0kocykgKi8KKwkKKwkJCS8qIEZvciBTd2l0Y2ggZW11bGF0aW9uIHdlIGhhdmUgdG8gQUREIGFuZCBBQ1RJVkFURQorCQkJICogdGhlIERMQ0kocykgdGhhdCB3ZXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgU0VUX0RMQ0lfCisJCQkgKiBDT05GSUdVUkFUSU9OIGNvbW1hbmQuIEFkZCBhbmQgQWN0aXZhdGUgd2lsbCBmYWlsIGlmCisJCQkgKiBETENJIHNwZWNpZmllZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCisJCQkgKgorCQkJICogQWxzbyBJZl9vcGVuIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGludGVyZmFjZS4gQnV0CisJCQkgKiBpdCBkb2VzIG5vdCBnZXQgaW4gaGVyZSBmb3IgYWxsIHRoZSBpbnRlcmZhY2UuIFNvCisJCSAJICogd2UgaGF2ZSB0byBwYXNzIHRoZSBlbnRpcmUgbGlzdCBvZiBETENJKHMpIHRvIGFkZCAKKwkJCSAqIGFjdGl2YXRlIHJvdXRpbmVzLiAgCisJCQkgKi8gCisJCQkKKwkJCWlmICghY2hlY2tfZGxjaV9jb25maWcgKGNhcmQsIGNoYW4pKXsKKwkJCQlmcl9hZGRfZGxjaShjYXJkLCBjaGFuLT5kbGNpKTsKKwkJCQlmcl9hY3RpdmF0ZV9kbGNpKGNhcmQsIGNoYW4tPmRsY2kpOworCQkJfQorCQl9CisKKwkJY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcFtjaGFuLT5kbGNpXSA9IGRldjsKKwl9CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNvbmZpZ19mcgorICoKKyAqIFJhdGlvbmFsZToKKyAqCUFsbCBjb21tYW5kcyBtdXN0IGJlIGV4ZWN1dGVkIGR1cmluZyBhbiBpbnRlcnJ1cHQuCisgKiAKKyAqIERlc2NyaXB0aW9uOgkKKyAqCVRyaWdnZXIgdW5jb2ZpZ19mcigpIGZ1bmN0aW9uIHRocm91Z2ggCisgKiAgICAgIHRoZSB0aW1lciBpbnRlcnJ1cHQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdW5jb25maWdfZnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwl1MzIgdGltZW91dDsKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCWludCByZXNldF9jcml0aWNhbD0wOworCQorCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBFUklfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJlc2V0X2NyaXRpY2FsPTE7CisJfQorCQkKKwkvKiBydW4gdW5jb25maWdfZGxjaSgpIGZ1bmN0aW9uIAorICAgICAgICAgKiB0aHJvdWdodCB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJc2V0X2JpdCgwLCh2b2lkKikmY2hhbi0+dW5jb25maWdfZGxjaSk7CisJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKworCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IGppZmZpZXM7CisgICAgIAlmb3IoOzspIHsKKworCQlpZighKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRykpCisJCQlicmVhazsKKworICAgICAgICAgICAgIAlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZGVsZXRlIERMQ0kgJWlcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5kbGNpKTsKKyAJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXNldF9jcml0aWNhbCl7CisJCXNldF9iaXQoUEVSSV9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHVuY29uZmlnX2ZyCisgKgorICogUmF0aW9uYWxlOgorICoJQWxsIGNvbW1hbmRzIG11c3QgYmUgZXhlY3V0ZWQgZHVyaW5nIGFuIGludGVycnVwdC4KKyAqIAorICogRGVzY3JpcHRpb246CQorICoJUmVtb3ZlIHRoZSBkbGNpIGZyb20gZmlybXdhcmUuCisgKglUaGlzIGZ1bmNpdG9uIGlzIHVzZWQgaW4gTk9ERSBzaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCB1bmNvbmZpZ19mciAoc2RsYV90ICpjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZnJfY2hhbm5lbF90ICpjaGFuOworCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkKKwkJaWYgKChjaGFuPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKCF0ZXN0X2JpdCgwLCZjaGFuLT51bmNvbmZpZ19kbGNpKSkKKwkJCWNvbnRpbnVlOworCisJCWNsZWFyX2JpdCgwLCZjaGFuLT51bmNvbmZpZ19kbGNpKTsKKworCQlpZiAoY2FyZC0+d2FuZGV2LnN0YXRpb24gPT0gV0FOT1BUX05PREUpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuY29uZmlndXJpbmcgRExDSSAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5kbGNpKTsKKwkJCWZyX2RlbGV0ZV9kbGNpKGNhcmQsY2hhbi0+ZGxjaSk7CisJCX0KKwkJY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcFtjaGFuLT5kbGNpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHNldHVwX2ZyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYl9vcmlnLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgY2hhciBvcF9tb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqc2tiX29yaWc7CisJZnJfY2hhbm5lbF90ICpjaGFuPWRldi0+cHJpdjsKKworCWlmIChvcF9tb2RlID09IFdBTlBJUEUpeworCisJCWNoYW4tPmZyX2hlYWRlclswXT1ROTIyX1VJOworCQkKKwkJc3dpdGNoIChodG9ucyhza2ItPnByb3RvY29sKSl7CisJCQkKKwkJY2FzZSBFVEhfUF9JUDoKKwkJCWNoYW4tPmZyX2hlYWRlclsxXT1OTFBJRF9JUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCQorCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaW4gYnJpZGdpbmcgbW9kZSwgd2UgbXVzdCBhcHBseQorCSAqIGFuIEV0aGVybmV0IGhlYWRlciAqLworCWlmIChvcF9tb2RlID09IEJSSURHRSB8fCBvcF9tb2RlID09IEJSSURHRV9OT0RFKXsKKworCisJCS8qIEVuY2Fwc3VsYXRlIHRoZSBwYWNrZXQgYXMgYSBicmlkZ2VkIEV0aGVybmV0IGZyYW1lLiAqLworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmNhcHN1bGF0aW5nIHNrYiBmb3IgZnJhbWUgcmVsYXlcbiIsIAorCQkJZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkKKwkJY2hhbi0+ZnJfaGVhZGVyWzBdID0gMHgwMzsKKwkJY2hhbi0+ZnJfaGVhZGVyWzFdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzJdID0gMHg4MDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzNdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzRdID0gMHg4MDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzVdID0gMHhDMjsKKwkJY2hhbi0+ZnJfaGVhZGVyWzZdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzddID0gMHgwNzsKKworCQkvKiBZdWNrLiAqLworCQlza2ItPnByb3RvY29sID0gRVRIX1BfODAyXzM7CisJCXJldHVybiA4OworCisJfQorCQkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX2RsY2lfY29uZmlnIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI9MDsKKwlmcl9jb25mX3QgKmNvbmY9TlVMTDsKKwl1bnNpZ25lZCBzaG9ydCBkbGNpX251bSA9IGNoYW4tPmRsY2k7CisJaW50IGRsY2lfb2Zmc2V0PTA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJCisJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPTkZJRzsKKwltYm94LT5jbWQubGVuZ3RoID0gMDsKKwltYm94LT5jbWQuZGxjaSA9IGRsY2lfbnVtOyAJCisKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciA9PSBDTURfT0speworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldj0qKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKQorCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RFRCk7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiRExDSSAlaSBOb3QgY29uZmlndXJlZCwgY29uZmlndXJpbmdcbiIsZGxjaV9udW0pOworCQorCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQ09NTV9ESVNBQkxFOworCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENNRF9PSyl7CisJCWZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCk7CisJCXJldHVybiAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGVkIENvbW11bmljYXRpb25zIFxuIik7CisJCisJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPTkZJRzsKKwltYm94LT5jbWQubGVuZ3RoID0gMDsKKwltYm94LT5jbWQuZGxjaSA9IDA7IAkKKworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyICE9IENNRF9PSyl7CisJCWZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCk7CisJCXJldHVybiAyOworCX0KKwkKKwljb25mID0gKGZyX2NvbmZfdCAqKW1ib3gtPmRhdGE7CisKKwlkbGNpX29mZnNldD0wOworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQlmcl9jaGFubmVsX3QgKmNoYW5fdG1wID0gZGV2LT5wcml2OworCQljb25mLT5kbGNpW2RsY2lfb2Zmc2V0XSA9IGNoYW5fdG1wLT5kbGNpOwkJCisJCWRsY2lfb2Zmc2V0Kys7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gIkdvdCBGciBjb25maWd1cmF0aW9uIEJ1ZmZlciBMZW5ndGggaXMgJXggRGxjaSAlaSBEbGNpIE9mZiAlaVxuIiwKKwkJbWJveC0+Y21kLmxlbmd0aCwKKwkJbWJveC0+Y21kLmxlbmd0aCA+IDB4MjAgPyBjb25mLT5kbGNpWzBdIDogLTEsIAorCQlkbGNpX29mZnNldCApOworCQorCW1ib3gtPmNtZC5sZW5ndGggPSAweDIwICsgZGxjaV9vZmZzZXQqMjsKKworCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwltYm94LT5jbWQuZGxjaSA9IDA7IAorCisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0speworCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQlyZXR1cm4gMjsKKwl9CisKKwlpbml0aWFsaXplX3J4X3R4X2J1ZmZlcnMgKGNhcmQpOworCisJCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29uZmlndXJhaXRvbiBTdWNjZWRlZCBmb3IgbmV3IERMQ0kgJWlcbiIsZGxjaV9udW0pOworCisJaWYgKGZyX2NvbW1fZW5hYmxlIChjYXJkKSl7CisJCXJldHVybiAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIENvbW11bmljYXRpb25zIFxuIik7CisKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJZnJfY2hhbm5lbF90ICpjaGFuX3RtcCA9IGRldi0+cHJpdjsKKwkJZnJfaW5pdF9kbGNpKGNhcmQsY2hhbl90bXApOworCQlmcl9hZGRfZGxjaShjYXJkLCBjaGFuX3RtcC0+ZGxjaSk7CisJCWZyX2FjdGl2YXRlX2RsY2koY2FyZCwgY2hhbl90bXAtPmRsY2kpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVORCBPRiBDT05GSUdVUkFJVE9OICVpXG4iLGRsY2lfbnVtKTsKKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9yeF90eF9idWZmZXJzIChzZGxhX3QgKmNhcmQpCit7CisJZnJfYnVmX2luZm9fdCogYnVmX2luZm87CisJCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCisgICAgICAgICAgICAgICAgYnVmX2luZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBGUl9NQl9WRUNUT1IgKworCQkJRlI1MDhfUlhCQ19PRkZTKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnJ4bWIgPSAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfbmV4dCArIGNhcmQtPmh3LmRwbWJhc2UpOworCisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArIGNhcmQtPmh3LmRwbWJhc2UpOyAKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2xhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9ZWxzZXsJCisJCWJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlI1MDhfUlhCQ19PRkZTKTsKKworCQljYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgLQorCQkJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisJCQorCQljYXJkLT51LmYucnhtYl9iYXNlID0KKwkJCSh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfbGFzdCA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArCisJCQkoYnVmX2luZm8tPnJzZV9udW0gLSAxKSAqIHNpemVvZihmcl9yeF9idWZfY3RsX3QpIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCX0KKworCWNhcmQtPnUuZi5yeF9iYXNlID0gYnVmX2luZm8tPmJ1Zl9iYXNlOworCWNhcmQtPnUuZi5yeF90b3AgID0gYnVmX2luZm8tPmJ1Zl90b3A7CisKKwljYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nID0gMDsKKworCXJldHVybjsKK30KKworCQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9mdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTMxMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZGxhX2NoZGxjLmMJV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gTGluayBEcml2ZXIuIENpc2NvIEhETEMgbW9kdWxlLgorKgorKiBBdXRob3JzOiAJTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgorKgkJR2lkZW9uIEhhY2sgIAorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTE5OTkgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBTZXAgMzAsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBGaXhlZCBkeW5hbWljIElQIGFuZCByb3V0ZSBzZXR1cC4KKyogU2VwIDIzLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgU01QIHN1cHBvcnQsIGZpeGVkIHRyYWNpbmcgCisqIFNlcCAxMywgMTk5OSAgTmVuYWQgQ29yYmljCVNwbGl0IHVwIFBvcnQgMCBhbmQgMSBpbnRvIHNlcGFyYXRlIGRldmljZXMuCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqIE9jdCAzMCwgMTk5OAlKYXNwcmVldCBTaW5naAlBZGRlZCBTdXBwb3J0IGZvciBDSERMQyBBUEkgKEhETEMgU1RSRUFNSU5HKS4KKyogT2N0IDI4LCAxOTk4CUphc3ByZWV0IFNpbmdoCUFkZGVkIFN1cHBvcnQgZm9yIER1YWwgUG9ydCBDSERMQy4KKyogQXVnIDA3LCAxOTk4CURhdmlkIEZvbmcJSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkJLyogc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CQorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc2RsYV9jaGRsYy5oPgkJLyogQ0hETEMgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiByZWFzb25zIGZvciBlbmFibGluZyB0aGUgdGltZXIgaW50ZXJydXB0IG9uIHRoZSBhZGFwdGVyICovCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VRFAgICAJMHgwMDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUJMHgwMDAyCisgCisjZGVmaW5lCUNIRExDX0RGTFRfREFUQV9MRU4JMTUwMAkJLyogZGVmYXVsdCBNVFUgKi8KKyNkZWZpbmUgQ0hETENfSERSX0xFTgkJMQorCisjZGVmaW5lIElGRl9QT0lOVFRPUE9JTlQgMHgxMAorCisjZGVmaW5lIFdBTlBJUEUgMHgwMAorI2RlZmluZSBBUEkJMHgwMQorI2RlZmluZSBDSERMQ19BUEkgMHgwMQorCisjZGVmaW5lIFBPUlQoeCkgICAoeCA9PSAwID8gIlBSSU1BUlkiIDogIlNFQ09OREFSWSIgKQorCisgCisvKioqKioqRGF0YSBTdHJ1Y3R1cmVzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlZCBpbiB0aGUgcHJpdmF0ZSBkYXRhIGFyZWEgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBUaGUgY2FyZCBzdHJ1Y3R1cmUgdXNlZCB0byBvY2N1cHkgdGhlIHByaXZhdGUgYXJlYSBidXQgbm93IHRoZSBmb2xsb3dpbmcgCisgKiBzdHJ1Y3R1cmUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgY2FyZCBzdHJ1Y3R1cmUgYWxvbmcgd2l0aCBDSERMQyBzcGVjaWZpYyBkYXRhCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2hkbGNfcHJpdmF0ZV9hcmVhCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlOworCXNkbGFfdAkJKmNhcmQ7CisJaW50IAkJVHJhY2luZ0VuYWJsZWQ7CQkvKiBGb3IgZW5hYmxpbmcgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCWN1cnJfdHJhY2VfYWRkcjsJLyogVXNlZCBmb3IgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCXN0YXJ0X3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJZW5kX3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIAllbmRfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgc2hvcnQgCW51bWJlcl90cmFjZV9lbGVtZW50czsKKwl1bnNpZ25lZCAgCWF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisJdW5zaWduZWQgbG9uZyAJcm91dGVyX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgY2hhciAJcm91dGVfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3JlbW92ZWQ7CisJdW5zaWduZWQgbG9uZyAJdGlja19jb3VudGVyOwkJLyogRm9yIDVzIHRpbWVvdXQgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl91cF90aW1lOworICAgICAgICB1MzIgICAgICAgICAgICAgSVBfYWRkcmVzczsJCS8qIElQIGFkZHJlc3NpbmcgKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX25ldG1hc2s7CisJdW5zaWduZWQgY2hhciAgbWM7CQkJLyogTXVsaXRjYXN0IHN1cHBvcnQgb24vb2ZmICovCisJdW5zaWduZWQgc2hvcnQgdWRwX3BrdF9sZ3RoOwkJLyogdWRwIHBhY2tldCBwcm9jZXNzaW5nICovCisJY2hhciB1ZHBfcGt0X3NyYzsKKwljaGFyIHVkcF9wa3RfZGF0YVtNQVhfTEdUSF9VRFBfTUdOVF9QS1RdOworCXVuc2lnbmVkIHNob3J0IHRpbWVyX2ludF9lbmFibGVkOworCWNoYXIgdXBkYXRlX2NvbW1zX3N0YXRzOwkJLyogdXBkYXRpbmcgY29tbXMgc3RhdHMgKi8KKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXQU4gbGluayBkcml2ZXIgZW50cnkgcG9pbnRzLiBUaGVzZSBhcmUgY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgd3BmdDFfZXhlYyAoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworc3RhdGljIGludCBjaGRsY19yZWFkX3ZlcnNpb24gKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKTsKK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKTsKKworLyoqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBwcm90b2NvbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1haW4gV0FOUElQRSBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBmaXJtd2FyZSBpcyBydW5uaW5nLgorICogIG8gcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICh0byBtYWtlIHN1cmUgaXQncyBhbGl2ZSkKKyAqICBvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgYWRhcHRlciBkYXRhIHNwYWNlLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUuCisgKi8KK2ludCB3cGZ0MV9pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5zaWduZWQgY2hhciBwb3J0X251bTsKKwlpbnQgZXJyOworCisJdW5pb24KKwkJeworCQljaGFyIHN0cls4MF07CisJCX0gdTsKKwl2b2xhdGlsZSBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iMTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX0NIRExDKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gSUQgJXUhXG4iLAorCQkJCSAgY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVXNlIHByaW1hcnkgcG9ydCAqLworCWNhcmQtPnUuYy5jb21tX3BvcnQgPSAwOworCQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZTsKKwl9ZWxzZXsgCisJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJfQorCisJbWIgPSBtYjEgPSBjYXJkLT5tYm94OworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBUaGUgYm9hcmQgd2lsbCBwbGFjZSBhbiAnSScgaW4gdGhlIHJldHVybiBjb2RlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMKKwkgICAJcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzLiAgV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGxldGVkIGluIGxlc3MKKyAgICAgICAgICAgCXRoYW4gMSBzZWNvbmQuICovCisKKwkJdGltZW91dCA9IGppZmZpZXM7CisJCXdoaWxlIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKQkvKiBXYWl0IDFzIGZvciBib2FyZCB0byBpbml0aWFsaXplICovCisJCQlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+IDEqSFopIGJyZWFrOworCisJCWlmIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJbml0aWFsaXphdGlvbiBub3QgY29tcGxldGVkIGJ5IGFkYXB0ZXJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIHJlcHJlc2VudGF0aXZlLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCisJaWYgKGNoZGxjX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgRlQxIENvbmZpZ3VyYXRpb24gZmlybXdhcmUgdiVzXG4iLAorCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7IAorCisJY2FyZC0+aXNyCQkJPSBOVUxMOworCWNhcmQtPnBvbGwJCQk9IE5VTEw7CisJY2FyZC0+ZXhlYwkJCT0gJndwZnQxX2V4ZWM7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSBOVUxMOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSBOVUxMOworCWNhcmQtPndhbmRldi5zdGF0ZQkJPSBXQU5fRFVBTFBPUlQ7CisJY2FyZC0+d2FuZGV2LnVkcF9wb3J0ICAgCT0gY29uZi0+dWRwX3BvcnQ7CisKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCA9IDA7CisKKwkvKiBUaGlzIGlzIGZvciB0aGUgcG9ydHMgbGluayBzdGF0ZSAqLworCWNhcmQtPnUuYy5zdGF0ZSA9IFdBTl9ESVNDT05ORUNURUQ7CisJCisJLyogcmVzZXQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgJ3VwZGF0ZSgpJyBwcm9jIGhhcyBiZWVuIGNhbGxlZCAqLworCWNhcmQtPnUuYy51cGRhdGVfY2FsbF9jb3VudCA9IDA7CisJCisJY2FyZC0+d2FuZGV2LnR0bCA9IDB4N0Y7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9IDA7IAorCisJY2FyZC0+d2FuZGV2LmNsb2NraW5nID0gMDsKKworCXBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIFNldHVwIFBvcnQgQnBzICovCisKKyAgICAgICAJY2FyZC0+d2FuZGV2LmJwcyA9IDA7CisKKwljYXJkLT53YW5kZXYubXR1ID0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkc7CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBzdGF0dXMgYXJlYSAqLworCS8qIFJlYWQgdGhlIENIRExDIENvbmZpZ3VyYXRpb24gYW5kIG9idGFpbjogCisJICoJUHRyIHRvIHNoYXJlZCBtZW1vcnkgaW5mb3Igc3RydWN0CisgICAgICAgICAqIFVzZSB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBjYXJkLT51LmMuZmxhZ3MgIQorIAkgKi8KKwltYjEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iMS0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIxKSA/IG1iMS0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iMSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKyAgICAgICAgICAgICAgIAljYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgIAkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0KSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5mbGFncyA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0ICUgU0RMQV9XSU5ET1dTSVpFKSk7CisJfQorCisJY2FyZC0+d2FuZGV2LnN0YXRlID0gV0FOX0ZUMV9SRUFEWTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRlQxIENvbmZpZyBSZWFkeSAhXG4iLGNhcmQtPmRldm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3BmdDFfZXhlYyhzZGxhX3QgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBsZW47CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5jb21tYW5kLCB1X2NtZCwgc2l6ZW9mKGZ0MV9leGVjX2NtZF90KSkpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsZW4gPSBtYm94LT5idWZmZXJfbGVuZ3RoOworCisJaWYgKGxlbikgeworCQlpZiggY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5kYXRhLCB1X2RhdGEsIGxlbikpeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwkvKiBleGVjdXRlIGNvbW1hbmQgKi8KKwlpZiAoIXNkbGFfZXhlYyhtYm94KSl7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJldHVybiByZXN1bHQgKi8KKwlpZiggY29weV90b191c2VyKHVfY21kLCAodm9pZCopJm1ib3gtPmNvbW1hbmQsIHNpemVvZihmdDFfZXhlY19jbWRfdCkpKXsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGVuID0gbWJveC0+YnVmZmVyX2xlbmd0aDsKKworCWlmIChsZW4gJiYgdV9kYXRhICYmIGNvcHlfdG9fdXNlcih1X2RhdGEsICh2b2lkKikmbWJveC0+ZGF0YSwgbGVuKSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCWNoYXIgZXJyOworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwl9CisJZWxzZSBpZiAoc3RyKSB7ICAvKiBpcyBub3QgbnVsbCAqLworCQlsZW4gPSBtYi0+YnVmZmVyX2xlbmd0aDsKKwkJbWVtY3B5KHN0ciwgbWItPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpcm13YXJlIGVycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGNoZGxjX2Vycm9yIChzZGxhX3QgKmNhcmQsIGludCBlcnIsIENIRExDX01BSUxCT1hfU1RSVUNUICptYikKK3sKKwl1bnNpZ25lZCBjbWQgPSBtYi0+Y29tbWFuZDsKKworCXN3aXRjaCAoZXJyKSB7CisKKwljYXNlIENNRF9USU1FT1VUOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb21tYW5kIDB4JTAyWCB0aW1lZCBvdXQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kKTsKKwkJYnJlYWs7CisKKwljYXNlIFM1MTRfQk9USF9QT1JUU19TQU1FX0NMS19NT0RFOgorCQlpZihjbWQgPT0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT04pIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAiJXM6IENvbmZpZ3VyZSBib3RoIHBvcnRzIGZvciB0aGUgc2FtZSBjbG9jayBzb3VyY2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQsIGVycik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfcHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MWNiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jCkBAIC0wLDAgKzEsMzQyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFfcHBwLmMJV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gTGluayBEcml2ZXIuIFBQUCBtb2R1bGUuCisqCisqIEF1dGhvcjogCU5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRmViIDI4LCAyMDAxICBOZW5hZCBDb3JiaWMJbyBVcGRhdGVkIGlmX3R4X3RpbWVvdXQoKSByb3V0aW5lIGZvciAKKyogCQkJCSAgMi40Llgga2VybmVscy4KKyogTm92IDI5LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCB0aGUgMi40Lngga2VybmVsIHN1cHBvcnQ6CisqIAkJCQkgIGdldF9pcF9hZGRyZXNzKCkgZnVuY3Rpb24gaGFzIG1vdmVkCisqIAkJCQkgIGludG8gdGhlIHBwcF9wb2xsKCkgcm91dGluZS4gSXQgY2Fubm90CisqIAkJCQkgIGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdC4KKyogTm92IDA3LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW55IGFsbCBhbmQgc3BlY2lmeSBhbGxvd2VkIHJlcXVlc3RzLgorKiBNYXkgMDIsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIHRoZSBkeW5hbWljIGludGVyZmFjZSBzaHV0ZG93bgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi4gV2hlbiB0aGUgbGluayBnb2VzIGRvd24sIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgaW50ZXJmYWNlIElGRl9VUCBmbGFnIGlzIHJlc2V0LgorKiBNYXIgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEJ1ZyBGaXg6IGNvcnJ1cHRlZCBtYm94IHJlY292ZXJ5LgorKiBGZWIgMjUsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEZpeGVkIHRoZSBGVDEgVURQIGRlYnVnZ2VyIHByb2JsZW0uCisqIEZlYiAwOSwgMjAwMCAgTmVuYWQgQ29yaWJjICAgIG8gU2h1dGRvd24gYnVnIGZpeC4gdXBkYXRlKCkgd2FzIGNhbGxlZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTlVMTCBkZXYgcG9pbnRlcjogbm8gY2hlY2suCisqIEphbiAyNCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gRGlzYWJsZWQgdXNlIG9mIENNRCBjb21wbGV0ZSBpbnRlci4KKyogRGV2IDE1LCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB1cCBoZWFkZXIgZmlsZXMgZm9yIDIuMC5YIGtlcm5lbHMKKyogT2N0IDI1LCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBTdXBwb3J0IGZvciAyLjAuWCBrZXJuZWxzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZWQgZHluYW1pYyByb3V0ZSBwcm9jZXNzaW5nIGludG8gCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2xsaW5nIHJvdXRpbmUuCisqIE9jdCAwNywgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gU3VwcG9ydCBmb3IgUzUxNCBQQ0kgY2FyZC4gIAorKiAgICAgICAgICAgICAgIEdpZGVvbiBIYWNrICAgICBvIFVQRCBhbmQgVXBkYXRlcyBleGVjdXRlZCB1c2luZyB0aW1lciBpbnRlcnJ1cHQKKyogU2VwIDEwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB1cCB0aGUgL3Byb2Mgc3RhdGlzdGljcworKiBKdWwgMjAsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBvIFJlbW92ZSB0aGUgcG9sbGluZyByb3V0aW5lcyBhbmQgdXNlIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgaW5zdGVhZC4KKyogU2VwIDE3LCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gVXBkYXRlcyBmb3IgMi4yLlggS2VybmVscy4KKyogQXVnIDEzLCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gSW1wcm92ZWQgTGluZSBUcmFjaW5nLgorKiBKdW4gMjIsIDE5OTgJRGF2aWQgRm9uZwlvIEFkZGVkIHJlbW90ZSBJUCBhZGRyZXNzIGFzc2lnbm1lbnQKKyogTWFyIDE1LCAxOTk4CUFsYW4gQ294CW8gMi4xLjh4IGJhc2ljIHBvcnQuCisqIEFwciAxNiwgMTk5OAlKYXNwcmVldCBTaW5naAlvIHVzaW5nIGh0b25zKCkgZm9yIHRoZSBJUFggcHJvdG9jb2wuCisqIERlYyAwOSwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIFBBUCBhbmQgQ0hBUC4KKyoJCQkJbyBJbXBsZW1lbnRlZCBuZXcgcm91dGluZXMgbGlrZSAKKyoJCQkJICBwcHBfc2V0X2luYm5kX2F1dGgoKSwgcHBwX3NldF9vdXRibmRfYXV0aCgpLAorKgkJCQkgIHRva2VuaXplKCkgYW5kIHN0cnN0cmlwKCkuCisqIE5vdiAyNywgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIHByb3RlY3Rpb24gYWdhaW5zdCBlbmFibGluZyBvZiBpcnFzIAorKgkJCQkgIHdoaWxlIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkLgorKiBOb3YgMjQsIDE5OTcgIEphc3ByZWV0IFNpbmdoICBvIEZpeGVkIGFub3RoZXIgUkFDRSBjb25kaXRpb24gY2F1c2VkIGJ5CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsaW5nIGFuZCBlbmFibGluZyBvZiBpcnFzLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIEFkZGVkIG5ldyBjb3VudGVycyBmb3Igc3RhdHMgb24gZGlzYWJsZS9lbmFibGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFzLgorKiBOb3YgMTAsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBJbml0aWFsaXplZCAnc2tiLT5tYWMucmF3JyB0byAnc2tiLT5kYXRhJworKgkJCQkgIGJlZm9yZSBldmVyeSBuZXRpZl9yeCgpLgorKgkJCQlvIEZyZWUgdXAgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaW4gZGVsX2lmKCkuCisqIE5vdiAwNywgMTk5NwlKYXNwcmVldCBTaW5naAlvIENoYW5nZWQgdGhlIGRlbGF5IHRvIHplcm8gZm9yIExpbmUgdHJhY2luZworKgkJCQkgIGNvbW1hbmQuCisqIE9jdCAyMCwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBob29rcyBpbiBmb3IgUm91dGVyIFVQIHRpbWUuCisqIE9jdCAxNiwgMTk5NwlKYXNwcmVldCBTaW5naCAgbyBUaGUgY3JpdGljYWwgZmxhZyBpcyB1c2VkIHRvIG1haW50YWluIGZsb3cKKyoJCQkJICBjb250cm9sIGJ5IGF2b2lkaW5nIFJBQ0UgY29uZGl0aW9ucy4gIFRoZSAKKyoJCQkJICBjbGkoKSBhbmQgcmVzdG9yZV9mbGFncygpIGFyZSB0YWtlbiBvdXQuCisqCQkJCSAgQSBuZXcgc3RydWN0dXJlLCAicHBwX3ByaXZhdGVfYXJlYSIsIGlzIGFkZGVkIAorKgkJCQkgIHRvIHByb3ZpZGUgRHJpdmVyIFN0YXRpc3RpY3MuICAgCisqIEp1bCAyMSwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBQcm90ZWN0ZWQgY2FsbHMgdG8gc2RsYV9wZWVrKCkgYnkgYWRkaW5nIAorKgkJCQkgIHNhdmVfZmxhZ3MoKSwgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKS4KKyogSnVsIDA3LCAxOTk3CUphc3ByZWV0IFNpbmdoICBvIEFkZGVkIGNvbmZpZ3VyYWJsZSBUVEwgZm9yIFVEUCBwYWNrZXRzCisqCQkJCW8gQWRkZWQgYWJpbGl0eSB0byBkaXNjYXJkIG11bGl0Y2FzdCBhbmQKKyoJCQkJICBicm9hY2FzdCBzb3VyY2UgYWRkcmVzc2VkIHBhY2tldHMuCisqIEp1biAyNywgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBGVDEgbW9uaXRvciBjYXBhYmlsaXRpZXMKKyoJCQkJICBOZXcgY2FzZSAoMHgyNSkgc3RhdGVtZW50IGluIGlmX3NlbmQgcm91dGluZS4KKyoJCQkJICBBZGRlZCBhIGdsb2JhbCB2YXJpYWJsZSByQ291bnQgdG8ga2VlcCB0cmFjaworKgkJCQkgIG9mIEZUMSBzdGF0dXMgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCisqIE1heSAyMiwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIGNoYW5nZSBpbiB0aGUgUFBQX1NFVF9DT05GSUcgY29tbWFuZCBmb3IKKyoJCQkJNTA4IGNhcmQgdG8gcmVmbGVjdCBjaGFuZ2VzIGluIHRoZSBuZXcgCisqCQkJCXBwcDUwOC5zZm0gZm9yIHN1cHBvcnRpbmc6Y29udGlub3VzIHRyYW5zbWlzc2lvbgorKgkJCQlvZiBDb25maWd1cmUtUmVxdWVzdCBwYWNrZXRzIHdpdGhvdXQgcmVjZWl2aW5nIGEKKyoJCQkJcmVwbHkgCQkJCQorKgkJCQlPUi1lZCAweDMwMCB0byBjb25mX2ZsYWdzIAorKgkJCSAgICAgICAgbyBDaGFuZ2VkIGNvbm5lY3RfdG1vdXQgZnJvbSA5MDAgdG8gMAorKiBNYXkgMjEsIDE5OTcJSmFzcHJlZXQgU2luZ2ggIG8gRml4ZWQgVURQIE1hbmFnZW1lbnQgZm9yIG11bHRpcGxlIGJvYXJkcworKiBBcHIgMjUsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBhZGRlZCBVRFAgTWFuYWdlbWVudCBzdHVmZgorKiBNYXIgMTEsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICBWZXJzaW9uIDMuMS4xCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZpeGVkICgrMSkgYnVnIGluIHJ4X2ludHIoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBjaGFuZ2VkIGlmX3NlbmQoKSB0byByZXR1cm4gMCBpZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW5kZXYuY3JpdGljYWwoKSBpcyB0cnVlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZyZWUgc29ja2V0IGJ1ZmZlciBpbiBpZl9zZW5kKCkgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIDAgCisqIEphbiAxNSwgMTk5NwlHZW5lIEtvemluCVZlcnNpb24gMy4xLjAKKyoJCQkJIG8gaW1wbGVtZW50ZWQgZXhlYygpIGVudHJ5IHBvaW50CisqIEphbiAwNiwgMTk5NwlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogaHRvbnMoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYV9wcHAuaD4JCS8qIFBQUCBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhc2ZtLmg+CQkvKiBTNTE0IFR5cGUgRGVmaW5pdGlvbiAqLworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJUFBQX0RGTFRfTVRVCTE1MDAJCS8qIGRlZmF1bHQgTVRVICovCisjZGVmaW5lCVBQUF9NQVhfTVRVCTQwMDAJCS8qIG1heGltdW0gTVRVICovCisjZGVmaW5lIFBQUF9IRFJfTEVOCTEKKworI2RlZmluZSBNQVhfSVBfRVJST1JTIDEwMCAKKworI2RlZmluZQlDT05ORUNUX1RJTUVPVVQJKDkwKkhaKQkJLyogbGluayBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUJSE9MRF9ET1dOX1RJTUUJKDUqSFopCQkvKiBsaW5rIGhvbGQgZG93biB0aW1lIDogQ2hhbmdlZCBmcm9tIDMwIHRvIDUgKi8KKworLyogRm9yIGhhbmRsZV9JUFhXQU4oKSAqLworI2RlZmluZSBDVkhleFRvQXNjaWkoYikgKCgodW5zaWduZWQgY2hhcikoYikgPiAodW5zaWduZWQgY2hhcik5KSA/ICgodW5zaWduZWQgY2hhciknQScgKyAoKHVuc2lnbmVkIGNoYXIpKGIpIC0gKHVuc2lnbmVkIGNoYXIpMTApKSA6ICgodW5zaWduZWQgY2hhciknMCcgKyAodW5zaWduZWQgY2hhcikoYikpKQorCisvKiBNYWNybyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIGRlYnVnZ2luZyBjb21tZW50cyAqLworLy8jZGVmaW5lIE5FWF9ERUJVRworI2lmZGVmIE5FWF9ERUJVRworI2RlZmluZSBORVhfUFJJTlRLKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIE5FWF9QUklOVEsoZm9ybWF0LCBhLi4uKQorI2VuZGlmIC8qIE5FWF9ERUJVRyAqLyAKKworI2RlZmluZSBEQ0QoYSkgICAoIGEgJiAweDA4ID8gIkhJR0giIDogIkxPVyIgKQorI2RlZmluZSBDVFMoYSkgICAoIGEgJiAweDIwID8gIkhJR0giIDogIkxPVyIgKQorI2RlZmluZSBMQ1AoYSkgICAoIGEgPT0gMHgwOSA/ICJPUEVOIiA6ICJDTE9TRUQiICkKKyNkZWZpbmUgSVAoYSkgICAgKCBhID09IDB4MDkgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiICkKKworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFICAJMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UCTB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUAkJMHgwNAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ09ORklHCQkweDIwCisKKy8qIFNldCBDb25maWd1cmF0b24gQ29tbWFuZCBEZWZpbml0aW9ucyAqLworI2RlZmluZSBQRVJDRU5UX1RYX0JVRkYJCQk2MAorI2RlZmluZSBUSU1FX0JFVFdFRU5fQ09ORl9SRVEgIAkJMzAKKyNkZWZpbmUgVElNRV9CRVRXRUVOX1BBUF9DSEFQX1JFUQkzMAorI2RlZmluZSBXQUlUX1BBUF9DSEFQX1dJVEhPVVRfUkVQTFkgICAgIDMwMAorI2RlZmluZSBXQUlUX0FGVEVSX0RDRF9DVFNfTE9XICAgICAgICAgIDUKKyNkZWZpbmUgVElNRV9EQ0RfQ1RTX0xPV19BRlRFUl9MTktfRE9XTiAxMAorI2RlZmluZSBXQUlUX0RDRF9ISUdIX0FGVEVSX0VOQUJMRV9DT01NIDkwMAorI2RlZmluZSBNQVhfQ09ORl9SRVFfV0lUSE9VVF9SRVBMWSAgICAgIDEwCisjZGVmaW5lIE1BWF9URVJNX1JFUV9XSVRIT1VUX1JFUExZICAgICAgMgorI2RlZmluZSBOVU1fQ09ORl9OQUtfV0lUSE9VVF9SRVBMWSAgICAgIDUKKyNkZWZpbmUgTlVNX0FVVEhfUkVRX1dJVEhPVVRfUkVQTFkgICAgICAxMAorCisjZGVmaW5lIEVORF9PRkZTRVQgMHgxRjAKKworCisvKioqKioqRGF0YSBTdHJ1Y3R1cmVzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlZCBpbiB0aGUgcHJpdmF0ZSBkYXRhIGFyZWEgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBUaGUgY2FyZCBzdHJ1Y3R1cmUgdXNlZCB0byBvY2N1cHkgdGhlIHByaXZhdGUgYXJlYSBidXQgbm93IHRoZSBmb2xsb3dpbmcgCisgKiBzdHJ1Y3R1cmUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgY2FyZCBzdHJ1Y3R1cmUgYWxvbmcgd2l0aCBQUFAgc3BlY2lmaWMgZGF0YQorICovCisgIAordHlwZWRlZiBzdHJ1Y3QgcHBwX3ByaXZhdGVfYXJlYQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZTsKKwlzZGxhX3QqIGNhcmQ7CQorCXVuc2lnbmVkIGxvbmcgcm91dGVyX3N0YXJ0X3RpbWU7CS8qcm91dGVyIHN0YXJ0IHRpbWUgaW4gc2VjICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CQkvKnVzZWQgZm9yIDUgc2Vjb25kIGNvdW50ZXIqLworCXVuc2lnbmVkIG1jOwkJCQkvKm11bHRpY2FzdCBzdXBwb3J0IG9uIG9yIG9mZiovCisJdW5zaWduZWQgY2hhciBlbmFibGVfSVBYOworCXVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXA7CisJdW5zaWduZWQgY2hhciBjaGFwOworCXVuc2lnbmVkIGNoYXIgc3lzbmFtZVszMV07CQkvKiBzeXN0ZW0gbmFtZSBmb3IgaW4tYm5kIGF1dGgqLworCXVuc2lnbmVkIGNoYXIgdXNlcmlkWzUxMV07CQkvKiBsaXN0IG9mIHVzZXIgaWRzICovCisJdW5zaWduZWQgY2hhciBwYXNzd2RbNTExXTsJCS8qIGxpc3Qgb2YgcGFzc3dvcmRzICovCisJdW5zaWduZWQgcHJvdG9jb2w7CQkJLyogU0tCIFByb3RvY29sICovCisJdTMyIGlwX2xvY2FsOwkJCQkvKiBMb2NhbCBJUCBBZGRyZXNzICovCisJdTMyIGlwX3JlbW90ZTsJCQkJLyogcmVtb3RlIElQIEFkZHJlc3MgKi8KKworCXUzMiBpcF9sb2NhbF90bXA7CisJdTMyIGlwX3JlbW90ZV90bXA7CisJCisJdW5zaWduZWQgY2hhciB0aW1lcl9pbnRfZW5hYmxlZDsJLyogV2hvIGVuYWJsZWQgdGhlIHRpbWVyIGludGVyKi8KKwl1bnNpZ25lZCBjaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJLyogVXNlZCBieSB1cGRhdGUgZnVuY3Rpb24gKi8KKwl1bnNpZ25lZCBsb25nIGN1cnJfdHJhY2VfYWRkcjsJCS8qIFRyYWNlIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgbG9uZyBzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZW5kX3RyYWNlX2FkZHI7CisKKwl1bnNpZ25lZCBjaGFyIGludGVyZmFjZV9kb3duOwkJLyogQnJpbmQgZG93biBpbnRlcmZhY2Ugd2hlbiBjaGFubmVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29lcyBkb3duICovCisJdW5zaWduZWQgbG9uZyBjb25maWdfd2FpdF90aW1lb3V0OwkvKiBBZnRlciBpZl9vcGVuKCkgaWYgaW4gZHluYW1pYyBpZiBtb2RlLAorCQkJCQkJICAgd2FpdCBhIGZldyBzZWNvbmRzIGJlZm9yZSBjb25maWd1cmluZyAqLworCQorCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsKKwljaGFyICB1ZHBfcGt0X3NyYzsKKyAgICAgIAljaGFyICB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKworCS8qIFBQUCBzcGVjaWZpYyBzdGF0aXN0aWNzICovCisKKwlpZl9zZW5kX3N0YXRfdCBpZl9zZW5kX3N0YXQ7CisJcnhfaW50cl9zdGF0X3QgcnhfaW50cl9zdGF0OworCXBpcGVfbWdtdF9zdGF0X3QgcGlwZV9tZ210X3N0YXQ7CisKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl91cF90aW1lOyAKKworCS8qIFBvbGxpbmcgd29yayBxdWV1ZSBlbnRyeS4gRWFjaCBpbnRlcmZhY2UKKyAgICAgICAgICogaGFzIGl0cyBvd24gd29yayBxdWV1ZSBlbnRyeSwgd2hpY2ggaXMgdXNlZAorICAgICAgICAgKiB0byBkZWZlciBldmVudHMgZnJvbSB0aGUgaW50ZXJydXB0ICovCisJc3RydWN0IHdvcmtfc3RydWN0IHBvbGxfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX2RlbGF5X3RpbWVyOworCisJdTggZ2F0ZXdheTsKKwl1OCBjb25maWdfcHBwOworCXU4IGlwX2Vycm9yOworCQorfXBwcF9wcml2YXRlX2FyZWFfdDsKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgd2FuaWZfY29uZl90ICpjb25mKTsKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBXQU5QSVBFLXNwZWNpZmljIGVudHJ5IHBvaW50cyAqLworc3RhdGljIGludCB3cHBfZXhlYyAoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIAorCQkgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKKworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogUFBQIGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcHBwX3JlYWRfdmVyc2lvbihzZGxhX3QgKmNhcmQsIGNoYXIgKnN0cik7CitzdGF0aWMgaW50IHBwcF9zZXRfb3V0Ym5kX2F1dGgoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpOworc3RhdGljIGludCBwcHBfc2V0X2luYm5kX2F1dGgoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpOworc3RhdGljIGludCBwcHBfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHBwcF9zZXRfaW50cl9tb2RlKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgY2hhciBtb2RlKTsKK3N0YXRpYyBpbnQgcHBwX2NvbW1fZW5hYmxlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHBwcF9jb21tX2Rpc2FibGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgcHBwX2NvbW1fZGlzYWJsZV9zaHV0ZG93bihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcHBfZ2V0X2Vycl9zdGF0cyhzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcHBfc2VuZChzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgcHJvdG8pOworc3RhdGljIGludCBwcHBfZXJyb3Ioc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBwcHBfbWJveF90ICptYik7CisKK3N0YXRpYyB2b2lkIHdwcF9pc3Ioc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGV2ZW50X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKTsKKworLyogQmFja2dyb3VuZCBwb2xsaW5nIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCByZXRyaWdnZXJfY29tbShzZGxhX3QgKmNhcmQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCByZWFkX2luZm8oIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCByZWFkX2Nvbm5lY3Rpb25faW5mbyAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9yb3V0ZSggc2RsYV90ICpjYXJkICk7CitzdGF0aWMgaW50IGNvbmZpZzUwOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgc2hvd19kaXNjX2NhdXNlKHNkbGFfdCAqIGNhcmQsIHVuc2lnbmVkIGNhdXNlKTsKK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhKTsKK3N0YXRpYyB2b2lkIGluaXRfcHBwX3R4X3J4X2J1ZmYoIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgaW5pdF9wcHBfcHJpdl9zdHJ1Y3QoIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSk7CitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgdG9rZW5pemUoY2hhciAqc3RyLCBjaGFyICoqdG9rZW5zKTsKK3N0YXRpYyBjaGFyKiBzdHJzdHJpcChjaGFyICpzdHIsIGNoYXIgKnMpOworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbnQgY29uZmlnX3BwcCAoc2RsYV90ICopOworc3RhdGljIHZvaWQgcHBwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3BwcF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHBwX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cik7CisKKworc3RhdGljIGludCBSZWFkX2Nvbm5lY3Rpb25faW5mbzsKK3N0YXRpYyBpbnQgSW50cl90ZXN0X2NvdW50ZXI7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYXZhaWxhYmxlX2J1ZmZlcl9zcGFjZTsKKworCisvKiBJUFggZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBzd2l0Y2hfbmV0X251bWJlcnModW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlciwgCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBpbmNvbWluZyk7CitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfUFgsIAorCQkJIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIHNob3J0IHByb3RvKTsKKworLyogTG9jayBGdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgczUwOF91bmxvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHBfcHJpdmF0ZV9hcmVhX3QqIHBwcF9wcml2X2FyZWEgKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgZGV0ZWN0X2FuZF9maXhfdHhfYnVnIChzZGxhX3QgKmNhcmQpOworCisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQUFAgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFdBTlBJUEUgbW9kdWxlIGR1cmluZyBzZXR1cC4gIEF0IHRoaXMKKyAqIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCBhbmQgZmlybXdhcmUgaXMgcnVubmluZy4KKyAqICBvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLgorICovCitpbnQgd3BwX2luaXQoc2RsYV90ICpjYXJkLCB3YW5kZXZfY29uZl90ICpjb25mKQoreworCXBwcF9mbGFnc190ICpmbGFnczsKKwl1bmlvbgorCXsKKwkJY2hhciBzdHJbODBdOworCX0gdTsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfUFBQKSB7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJLyogSW5pdGlhbGl6ZSBtaXNjZWxsYW5lb3VzIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgb24gdGhlIGFkYXB0ZXIgKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKworCQljYXNlIFNETEFfUzUwODoKKwkJCWNhcmQtPm1ib3ggPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9NQl9PRkZTKTsKKwkJCWNhcmQtPmZsYWdzPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9GTEdfT0ZGUyk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU0RMQV9TNTE0OgorCQkJY2FyZC0+bWJveCA9KHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgUFBQNTE0X01CX09GRlMpOworCQkJY2FyZC0+ZmxhZ3M9KHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgUFBQNTE0X0ZMR19PRkZTKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKwlmbGFncyA9IGNhcmQtPmZsYWdzOworCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisJaWYgKHBwcF9yZWFkX3ZlcnNpb24oY2FyZCwgTlVMTCkgfHwgcHBwX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBydW5uaW5nIFBQUCBmaXJtd2FyZSB2JXNcbiIsY2FyZC0+ZGV2bmFtZSwgdS5zdHIpOyAKKwkvKiBBZGp1c3QgY29uZmlndXJhdGlvbiBhbmQgc2V0IGRlZmF1bHRzICovCisJY2FyZC0+d2FuZGV2Lm10dSA9IChjb25mLT5tdHUpID8KKwkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFBQUF9NQVhfTVRVKSA6IFBQUF9ERkxUX01UVTsKKworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9ICZ3cHBfaXNyOworCWNhcmQtPnBvbGwJCT0gTlVMTDsgCisJY2FyZC0+ZXhlYwkJPSAmd3BwX2V4ZWM7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQk9ICZ1cGRhdGU7CisJY2FyZC0+d2FuZGV2Lm5ld19pZgk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgk9ICZkZWxfaWY7CisgICAgICAgIGNhcmQtPndhbmRldi51ZHBfcG9ydCAgID0gY29uZi0+dWRwX3BvcnQ7CisJY2FyZC0+d2FuZGV2LnR0bAk9IGNvbmYtPnR0bDsKKwljYXJkLT53YW5kZXYuc3RhdGUgICAgICA9IFdBTl9ESVNDT05ORUNURUQ7CisJY2FyZC0+ZGlzYWJsZV9jb21tCT0gJmRpc2FibGVfY29tbTsKKwljYXJkLT5pcnFfZGlzX2lmX3NlbmRfY291bnQgPSAwOworICAgICAgICBjYXJkLT5pcnFfZGlzX3BvbGxfY291bnQgPSAwOworCWNhcmQtPnUucC5hdXRoZW50aWNhdG9yID0gY29uZi0+dS5wcHAuYXV0aGVudGljYXRvcjsKKwljYXJkLT51LnAuaXBfbW9kZSAJPSBjb25mLT51LnBwcC5pcF9tb2RlID8KKwkJCQkgY29uZi0+dS5wcHAuaXBfbW9kZSA6IFdBTk9QVF9QUFBfU1RBVElDOworICAgICAgICBjYXJkLT5UcmFjaW5nRW5hYmxlZCAgICA9IDA7CisJUmVhZF9jb25uZWN0aW9uX2luZm8gICAgPSAxOworCisJLyogaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGlzdGljcyAqLworCWluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIGNhcmQgKTsKKworCisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCQlpbnQgZXJyOworCisJCUludHJfdGVzdF9jb3VudGVyID0gMDsKKwkJZXJyID0gaW50cl90ZXN0KGNhcmQpOworCisJCWlmKGVyciB8fCAoSW50cl90ZXN0X2NvdW50ZXIgPCBNQVhfSU5UUl9URVNUX0NPVU5URVIpKSB7CisJCQlwcmludGsoIiVzOiBJbnRlcnJ1cHQgVGVzdCBGYWlsZWQsIENvdW50ZXI6ICVpXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCQlwcmludGsoICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJydXB0IFRlc3QgUGFzc2VkLCBDb3VudGVyOiAlaVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCWNhcmQtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCXBwcF9zZXRfaW50cl9tb2RlKGNhcmQsIFBQUF9JTlRSX1RJTUVSKTsgCisKKwkvKiBUdXJuIG9mZiB0aGUgdHJhbnNtaXQgYW5kIHRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbWFzayAmPSB+UFBQX0lOVFJfVElNRVI7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBkZXZpY2Ugc3RhdHVzICYgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisgCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIHZvbGF0aWxlIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJLyogU2h1dGRvd24gYnVnIGZpeC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgICAgICAgICogY2FsbGVkIHdpdGggTlVMTCBkZXYgcG9pbnRlciBkdXJpbmcKKyAgICAgICAgICogc2h1dGRvd24gCisJICovCisJaWYgKChkZXY9Y2FyZC0+d2FuZGV2LmRldikgPT0gTlVMTCl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgocHBwX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJcHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID0gMjsKKwlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsJCisJCisJLyogd2FpdCBhIG1heGltdW0gb2YgMSBzZWNvbmQgZm9yIHRoZSBzdGF0aXN0aWNzIHRvIGJlIHVwZGF0ZWQgKi8gCisgICAgICAgIHRpbWVvdXQgPSBqaWZmaWVzOworICAgICAgICBmb3IoOzspIHsKKwkJaWYocHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApeworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQlwcHBfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworIAkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9CisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7IAorIAkJCXJldHVybiAtRUFHQUlOOworCQl9CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgd2FuaWZfY29uZl90ICpjb25mKQoreworCXNkbGFfdCAqY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWE7CisKKwlpZiAod2FuZGV2LT5uZGV2KQorCQlyZXR1cm4gLUVFWElTVDsKKwkKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb25maWd1cmluZyBJbnRlcmZhY2U6ICVzXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY29uZi0+bmFtZSk7CisKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJcHBwX3ByaXZfYXJlYSA9IGttYWxsb2Moc2l6ZW9mKHBwcF9wcml2YXRlX2FyZWFfdCksIEdGUF9LRVJORUwpOworCQorCWlmKCBwcHBfcHJpdl9hcmVhID09IE5VTEwgKQorCQlyZXR1cm4JLUVOT01FTTsKKwkKKwltZW1zZXQocHBwX3ByaXZfYXJlYSwgMCwgc2l6ZW9mKHBwcF9wcml2YXRlX2FyZWFfdCkpOworCQorCXBwcF9wcml2X2FyZWEtPmNhcmQgPSBjYXJkOyAKKwkKKwkvKiBpbml0aWFsaXplIGRhdGEgKi8KKwlzdHJjcHkoY2FyZC0+dS5wLmlmX25hbWUsIGNvbmYtPm5hbWUpOworCisJLyogaW5pdGlhbGl6ZSBkYXRhIGluIHBwcF9wcml2YXRlX2FyZWEgc3RydWN0dXJlICovCisJCisJaW5pdF9wcHBfcHJpdl9zdHJ1Y3QoIHBwcF9wcml2X2FyZWEgKTsKKworCXBwcF9wcml2X2FyZWEtPm1jID0gY29uZi0+bWM7CisJcHBwX3ByaXZfYXJlYS0+cGFwID0gY29uZi0+cGFwOworCXBwcF9wcml2X2FyZWEtPmNoYXAgPSBjb25mLT5jaGFwOworCisJLyogT3B0aW9uIHRvIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZSB3aGVuIAorICAgICAgICAgKiB0aGUgbGluayBnb2VzIGRvd24gKi8KKwlpZiAoY29uZi0+aWZfZG93bil7CisJCXNldF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQlwcmludGsoIiVzOiBEeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGVuYWJsZWRcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwl9IAorCisJLyogSWYgbm8gdXNlciBpZHMgYXJlIHNwZWNpZmllZCAqLworCWlmKCFzdHJsZW4oY29uZi0+dXNlcmlkKSAmJiAocHBwX3ByaXZfYXJlYS0+cGFwfHxwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBubyBwYXNzd29yZHMgYXJlIHNwZWNpZmllZCAqLworCWlmKCFzdHJsZW4oY29uZi0+cGFzc3dkKSAmJiAocHBwX3ByaXZfYXJlYS0+cGFwfHxwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihzdHJsZW4oY29uZi0+c3lzbmFtZSkgPiAzMSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBubyBzeXN0ZW0gbmFtZSBpcyBzcGVjaWZpZWQgKi8KKwlpZighc3RybGVuKGNvbmYtPnN5c25hbWUpICYmIChjYXJkLT51LnAuYXV0aGVudGljYXRvcikpeworCQlrZnJlZShwcHBfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY29weSB0aGUgZGF0YSBpbnRvIHRoZSBwcHAgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+dXNlcmlkLCBjb25mLT51c2VyaWQsIHN0cmxlbihjb25mLT51c2VyaWQpKTsKKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+cGFzc3dkLCBjb25mLT5wYXNzd2QsIHN0cmxlbihjb25mLT5wYXNzd2QpKTsKKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+c3lzbmFtZSwgY29uZi0+c3lzbmFtZSwgc3RybGVuKGNvbmYtPnN5c25hbWUpKTsKKworCQorCXBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFggPSBjb25mLT5lbmFibGVfSVBYOworCWlmIChjb25mLT5uZXR3b3JrX251bWJlcil7CisJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJfWVsc2V7CisJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyID0gMHhERUFEQkVFRjsKKwl9CisKKwkvKiBUZWxscyB1cyB0aGF0IGlmIHRoaXMgaW50ZXJmYWNlIGlzIGEKKyAgICAgICAgICogZ2F0ZXdheSBvciBub3QgKi8KKwlpZiAoKHBwcF9wcml2X2FyZWEtPmdhdGV3YXkgPSBjb25mLT5nYXRld2F5KSA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyBpcyBzZXQgYXMgYSBnYXRld2F5LlxuIiwKKwkJCWNhcmQtPmRldm5hbWUsY2FyZC0+dS5wLmlmX25hbWUpOworCX0KKworCS8qIHByZXBhcmUgbmV0d29yayBkZXZpY2UgZGF0YSBzcGFjZSBmb3IgcmVnaXN0cmF0aW9uICovCisgCXN0cmNweShkZXYtPm5hbWUsY2FyZC0+dS5wLmlmX25hbWUpOworCQorCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IHBwcF9wcml2X2FyZWE7CisJZGV2LT5tdHUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGRldi0+bXR1LCBjYXJkLT53YW5kZXYubXR1KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgd29yayByb3V0aW5lICovCisJSU5JVF9XT1JLKCZwcHBfcHJpdl9hcmVhLT5wb2xsX3dvcmssICh2b2lkKikodm9pZCopcHBwX3BvbGwsIGRldik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsaW5nIGRlbGF5IHRpbWVyICovCisJaW5pdF90aW1lcigmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZnVuY3Rpb24gPSBwcHBfcG9sbF9kZWxheTsKKwkKKwkKKwkvKiBTaW5jZSB3ZSBzdGFydCB3aXRoIGR1bW15IElQIGFkZHJlc3NlcyB3ZSBjYW4gc2F5CisJICogdGhhdCByb3V0ZSBleGlzdHMgKi8KKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqLworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb21tIChzZGxhX3QgKmNhcmQpCit7CisJcHBwX2NvbW1fZGlzYWJsZV9zaHV0ZG93bihjYXJkKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKiogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgYWRhcHRlciBpbnRlcmZhY2UgY29tbWFuZC4KKyAqLworCisvL0ZJWE1FOiBXaHkgZG8gd2UgbmVlZCB0aGlzID8/Pz8KK3N0YXRpYyBpbnQgd3BwX2V4ZWMoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpCit7CisJcHBwX21ib3hfdCAqbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGxlbjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmNtZCwgdV9jbWQsIHNpemVvZihwcHBfY21kX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJaWYgKGxlbikgeworCisJCWlmKCBjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmRhdGEsIHVfZGF0YSwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJfQorCisJLyogZXhlY3V0ZSBjb21tYW5kICovCisJaWYgKCFzZGxhX2V4ZWMobWJveCkpCisJCXJldHVybiAtRUlPOworCisJLyogcmV0dXJuIHJlc3VsdCAqLworCWlmKCBjb3B5X3RvX3VzZXIodV9jbWQsICh2b2lkKikmbWJveC0+Y21kLCBzaXplb2YocHBwX2NtZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisKKwlpZiAobGVuICYmIHVfZGF0YSAmJiBjb3B5X3RvX3VzZXIodV9kYXRhLCAodm9pZCopJm1ib3gtPmRhdGEsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKiogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgTGludXggbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggaW50ZXJmYWNlLCBkdXJpbmcgTGludXggbmV0d29yaworICogaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbi4gIFJldHVybmluZyBhbnl0aGluZyBidXQgemVybyB3aWxsIGZhaWwgaW50ZXJmYWNlCisgKiByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSAmaWZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJmlmX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSAmaWZfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSAmaWZfcmVidWlsZF9oZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT50eXBlCQk9IEFSUEhSRF9QUFA7CS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwkvKiBFbmFibGUgTXVsaXRjYXN0aW5nIGlmIHNwZWNpZmllZCBieSB1c2VyKi8KKwlpZiAocHBwX3ByaXZfYXJlYS0+bWMgPT0gV0FOT1BUX1lFUyl7CisJCWRldi0+ZmxhZ3MJfD0gSUZGX01VTFRJQ0FTVDsKKwl9CisKKwlkZXYtPm10dQkJPSB3YW5kZXYtPm10dTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IFBQUF9IRFJfTEVOOwkvKiBtZWRpYSBoZWFkZXIgbGVuZ3RoICovCisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKGp1c3QgZm9yIHJlZmVyZW5jZSkgKi8KKwlkZXYtPmlycQkJPSB3YW5kZXYtPmlycTsKKwlkZXYtPmRtYQkJPSB3YW5kZXYtPmRtYTsKKwlkZXYtPmJhc2VfYWRkcgkJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAkJPSB3YW5kZXYtPm1hZGRyOworCWRldi0+bWVtX2VuZAkJPSB3YW5kZXYtPm1hZGRyICsgd2FuZGV2LT5tc2l6ZSAtIDE7CisKKyAgICAgICAgLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggKi8KKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3BlbiBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gZW5hYmxlIGNvbW11bmljYXRpb25zIGFuZCBpbnRlcnJ1cHRzLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKgorICogUmV0dXJuIDAgaWYgTy5rLiBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IHBwcF9wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJLy91bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCWRvX2dldHRpbWVvZmRheSggJnR2ICk7CisJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWUgPSB0di50dl9zZWM7CisKKwkvKiBXZSBjYW5ub3QgY29uZmlndXJlIHRoZSBjYXJkIGhlcmUgYmVjYXVzZSB3ZSBkb24ndAorCSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzLgorICAgICAgICAgKiBPbmNlIHRoZSBpbnRlcmZhY2UgaW5pdGlsaXphdGlvbiBpcyBjb21wbGV0ZSwgd2Ugd2lsbCBiZQorICAgICAgICAgKiBhYmxlIHRvIGFjY2VzcyB0aGUgSVAgYWRkcmVzc2VzLiAgVGhlcmVmb3JlLAorICAgICAgICAgKiBjb25maWd1cmUgdGhlIHBwcCBsaW5rIGluIHRoZSBwb2xsIHJvdXRpbmUgKi8KKwlzZXRfYml0KDAsJnBwcF9wcml2X2FyZWEtPmNvbmZpZ19wcHApOworCXBwcF9wcml2X2FyZWEtPmNvbmZpZ193YWl0X3RpbWVvdXQ9amlmZmllczsKKworCS8qIFN0YXJ0IHRoZSBQUFAgY29uZmlndXJhdGlvbiBhZnRlciAxc2VjIGRlbGF5LgorCSAqIFRoaXMgd2lsbCBnaXZlIHRoZSBpbnRlcmZhY2UgaW5pdGlsaXphdGlvbiB0aW1lCisJICogdG8gZmluaXNoIGl0cyBjb25maWd1cmF0aW9uICovCisJbW9kX3RpbWVyKCZwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgSFopOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW4sIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCisJZGVsX3RpbWVyICgmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQnVpbGQgbWVkaWEgaGVhZGVyLgorICoKKyAqIFRoZSB0cmljayBoZXJlIGlzIHRvIHB1dCBwYWNrZXQgdHlwZSAoRXRoZXJ0eXBlKSBpbnRvICdwcm90b2NvbCcgZmllbGQgb2YKKyAqIHRoZSBzb2NrZXQgYnVmZmVyLCBzbyB0aGF0IHdlIGRvbid0IGZvcmdldCBpdC4gIElmIHBhY2tldCB0eXBlIGlzIG5vdAorICogc3VwcG9ydGVkLCBzZXQgc2tiLT5wcm90b2NvbCB0byAwIGFuZCBkaXNjYXJkIHBhY2tldCBsYXRlci4KKyAqCisgKiBSZXR1cm46CW1lZGlhIGhlYWRlciBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgaWZfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUDoKKwkJY2FzZSBFVEhfUF9JUFg6CisJCQlza2ItPnByb3RvY29sID0gaHRvbnModHlwZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc2tiLT5wcm90b2NvbCA9IDA7CisJfQorCisJcmV0dXJuIFBQUF9IRFJfTEVOOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBSZXR1cm46CTEJcGh5c2ljYWwgYWRkcmVzcyByZXNvbHZlZC4KKyAqCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKi8KK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlYnVpbGRfaGVhZGVyKCkgY2FsbGVkIGZvciBpbnRlcmZhY2UgJXMhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAlwcHBfcHJpdmF0ZV9hcmVhX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwkKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrKyBjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90YnVzeTsKKwkrK2NhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIGNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3RidXN5X3RpbWVvdXQ7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgdGJ1c3kgZmxhZyAobWFya3Mgc3RhcnQgb2YgdGhlIHRyYW5zbWlzc2lvbikgdG8gYmxvY2sgYSB0aW1lci1iYXNlZAorICogICB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGV4ZWN1dGUgYWRhcHRlciBzZW5kIGNvbW1hbmQuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIDIuIFNldHRpbmcgdGJ1c3kgZmxhZyB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZQorICogICAgcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqLworc3RhdGljIGludCBpZl9zZW5kIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCXVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJaW50IHVkcF90eXBlOworCWludCBlcnI9MDsKKwkKKwkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2VudHJ5OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChza2IgPT0gTlVMTCkgeworCisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsYXllciB0aGlua3Mgd2UndmUgbWlzc2VkIGFuCisJCSAqIHR4LWRvbmUgaW50ZXJydXB0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlcyBnb3Qga2lja2VkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJCQorCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3NrYl9udWxsOworCQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCXNlbmRwYWNrZXQgPSBza2ItPmRhdGE7CisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKworCWlmICh1ZHBfdHlwZSA9PSBVRFBfUFRQSVBFX1RZUEUpeworCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fU1RBQ0ssIGNhcmQsIHNrYiwgZGV2LAorICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIHBwcF9wcml2X2FyZWEpKXsKKwkgICAgICAgICAgICAgICAJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQl9CisJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfUElQRV9yZXF1ZXN0OworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzIAorCSAqIElmIGZvdW5kLCBkcm9wIChkZWFsbG9jYXRlKSBhIHBhY2tldCBhbmQgcmV0dXJuLgorCSAqLworCWlmKGNoa19iY2FzdF9tY2FzdF9hZGRyKGNhcmQsIGRldiwgc2tiKSl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCisgCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJczUwOF9sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCisgICAgCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIGluIGlmX3NlbmQ6ICVseFxuIiwKKwkJCQljYXJkLT53YW5kZXYubmFtZSxjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9jcml0aWNhbF9ub25fSVNSOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlnb3RvIGlmX3NlbmRfZXhpdF9jcml0OworCX0KKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkgeworCisJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsKKyAgICAgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQorICAgICAJfSBlbHNlIGlmICghc2tiLT5wcm90b2NvbCkgeworCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3Byb3RvY29sX2Vycm9yOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZXJyb3JzOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKwl9IGVsc2UgeworCisJCS8qSWYgaXQncyBJUFggY2hhbmdlIHRoZSBuZXR3b3JrIG51bWJlcnMgdG8gMCBpZiB0aGV5J3JlIG91cnMuKi8KKwkJaWYoIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBYKSApIHsKKwkJCWlmKHBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFgpIHsKKwkJCQlzd2l0Y2hfbmV0X251bWJlcnMoIHNrYi0+ZGF0YSwgCisJCQkJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCWdvdG8gaWZfc2VuZF9leGl0X2NyaXQ7CisJCQl9CisJCX0KKworCQlpZiAocHBwX3NlbmQoY2FyZCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgc2tiLT5wcm90b2NvbCkpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYWRwdHJfYmZyc19mdWxsOworCQkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90eF9pbnRfZW5hYmxlZDsKKwkJfSBlbHNlIHsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX3Bhc3NlZF90b19hZHB0cjsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisJCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKyAgICAJfQorCQoraWZfc2VuZF9leGl0X2NyaXQ6CisJCisJaWYgKCEoZXJyPW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpeworICAgICAgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQlwcHBfcHJpdl9hcmVhLT50aWNrX2NvdW50ZXIgPSBqaWZmaWVzOworCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVFhSRFk7CS8qIHVubWFzayBUeCBpbnRlcnJ1cHRzICovCisJfQorCQorCWNsZWFyX2JpdChTRU5EX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpewkKKwkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0b3JlIGEgVURQIG1hbmFnZW1lbnQgcGFja2V0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICovCisKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGNoYXIgdWRwX3BrdF9zcmMsIHNkbGFfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBwX3ByaXZhdGVfYXJlYV90KiBwcHBfcHJpdl9hcmVhICkKK3sKKwlpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCisJaWYoIXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCAmJiAoc2tiLT5sZW48PU1BWF9MR1RIX1VEUF9NR05UX1BLVCkpeworICAgICAgICAJcHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gc2tiLT5sZW47CisJCXBwcF9wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgCQltZW1jcHkocHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VEUDsKKwkJcHBwX3ByaXZfYXJlYS0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCQl1ZHBfcGt0X3N0b3JlZCA9IDE7CisJfWVsc2V7CisJCWlmIChza2ItPmxlbiA+IE1BWF9MR1RIX1VEUF9NR05UX1BLVCl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUElQRU1PTiBVRFAgcmVxdWVzdCB0b28gbG9uZyA6ICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHNrYi0+bGVuKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUElQRU1PTiBVUEQgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmdcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJcHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gMDsKKwl9CisKKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisKKwlyZXR1cm4odWRwX3BrdF9zdG9yZWQpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbGVuZ3RoIG9mIHJlcGx5LgorICovCitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICkgCit7CisJdW5zaWduZWQgc2hvcnQgbGVuLCB1ZHBfbGVuZ3RoLCB0ZW1wLCBpcF9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBpcF90ZW1wOworCWludCBldmVuX2JvdW5kID0gMDsKKwlwcHBfdWRwX3BrdF90ICpwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCAqKWRhdGE7CisgCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSBzaXplb2YoaXBfcGt0X3QpKyAKKwkgICAgICBzaXplb2YodWRwX3BrdF90KSsKKwkgICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkgICAgICBzaXplb2YoY2Jsb2NrX3QpKworCSAgICAgIG1ib3hfbGVuOworCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKyAgCXBfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsgCisKKwkvKiBmaWxsIGluIFVEUCBsZW5ndGggKi8KKwl1ZHBfbGVuZ3RoID0gc2l6ZW9mKHVkcF9wa3RfdCkrIAorCQkgICAgIHNpemVvZih3cF9tZ210X3QpKworCQkgICAgIHNpemVvZihjYmxvY2tfdCkrCisJCSAgICAgbWJveF9sZW47IAorICAKKyAKKwkvKiBwdXQgaXQgb24gYW4gZXZlbiBib3VuZGFyeSAqLworCWlmICggdWRwX2xlbmd0aCAmIDB4MDAwMSApIHsKKwkJdWRwX2xlbmd0aCArPSAxOworCQlsZW4gKz0gMTsKKwkJZXZlbl9ib3VuZD0xOworCX0gCisJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJcF91ZHBfcGt0LT51ZHBfcGt0LnVkcF9sZW5ndGggPSB0ZW1wOwkJCisKKyAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBwX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQgPSAKKwkJCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopKHBfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKSkgPSB0ZW1wOworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCSooKHVuc2lnbmVkIHNob3J0ICopKHBfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKzIpKSA9IHRlbXA7CisgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAKKwkJY2FsY19jaGVja3N1bSgmZGF0YVtVRFBfT0ZGU0VUXSx1ZHBfbGVuZ3RoK1VEUF9PRkZTRVQpOworCisJLyogZmlsbCBpbiBJUCBsZW5ndGggKi8KKwlpcF9sZW5ndGggPSB1ZHBfbGVuZ3RoICsgc2l6ZW9mKGlwX3BrdF90KTsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisgIAlwX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworIAorCS8qIHN3YXAgSVAgYWRkcmVzc2VzICovCisJaXBfdGVtcCA9IHBfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzOworCXBfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzID0gcF91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3M7CisJcF91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3MgPSBpcF90ZW1wOworCisJLyogZmlsbCBpbiBJUCBjaGVja3N1bSAqLworCXBfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IDA7CisJcF91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gY2FsY19jaGVja3N1bShkYXRhLHNpemVvZihpcF9wa3RfdCkpOworCisJcmV0dXJuIGxlbjsKKworfSAvKiByZXBseV91ZHAgKi8KKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOyAKKwl1bnNpZ25lZCBsb25nIHN1bT0wOworCWludCBpOworCisJZm9yKCBpID0gMDsgaSA8bGVuOyBpKz0yICkgeworCQltZW1jcHkoJnRlbXAsJmRhdGFbaV0sMik7CisJCXN1bSArPSAodW5zaWduZWQgbG9uZyl0ZW1wOworCX0KKworCXdoaWxlIChzdW0gPj4gMTYgKSB7CisJCXN1bSA9IChzdW0gJiAweGZmZmZVTCkgKyAoc3VtID4+IDE2KTsKKwl9CisKKwl0ZW1wID0gKHVuc2lnbmVkIHNob3J0KXN1bTsKKwl0ZW1wID0gfnRlbXA7CisKKwlpZiggdGVtcCA9PSAwICkgCisJCXRlbXAgPSAweGZmZmY7CisKKwlyZXR1cm4gdGVtcDsJCit9CisKKy8qCisgICBJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICAgaWYgaW5jb21pbmcgaXMgMSAtIGlmIHRoZSBuZXQgbnVtYmVyIGlzIDAgbWFrZSBpdCBvdXJzIAorCisqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbNl0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzddIDw8IDE2KSArIChzZW5kcGFja2V0WzhdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbOV0pOworCisJaWYgKCFpbmNvbWluZykgeworCQkvL0lmIHRoZSBkZXN0aW5hdGlvbiBuZXR3b3JrIG51bWJlciBpcyBvdXJzLCBtYWtlIGl0IDAKKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSBuZXR3b3JrX251bWJlcikgeworCQkJc2VuZHBhY2tldFs2XSA9IHNlbmRwYWNrZXRbN10gPSBzZW5kcGFja2V0WzhdID0gCisJCQkJCSBzZW5kcGFja2V0WzldID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8vSWYgdGhlIGluY29taW5nIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCkgeworCQkJc2VuZHBhY2tldFs2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzddID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFs4XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMEZGMDApID4+IDgpOworCQkJc2VuZHBhY2tldFs5XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9CisKKworCXBuZXR3b3JrX251bWJlciA9ICh1bnNpZ25lZCBsb25nKSgoc2VuZHBhY2tldFsxOF0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzE5XSA8PCAxNikgKyAoc2VuZHBhY2tldFsyMF0gPDwgOCkgKyAKKwkJCSAgc2VuZHBhY2tldFsyMV0pOworCisJaWYoICFpbmNvbWluZyApIHsKKwkJLy9JZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gc2VuZHBhY2tldFsxOV0gPSBzZW5kcGFja2V0WzIwXSA9IAorCQkJCQkgc2VuZHBhY2tldFsyMV0gPSAweDAwOworCQl9CisJfSBlbHNlIHsKKwkJLy9JZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCApIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTldID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsyMF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMjFdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KK30gLyogc3dpdGNoX25ldF9udW1iZXJzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZDsKKwkKKwlpZiggcHBwX3ByaXZfYXJlYSA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisKKwljYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKwlyZXR1cm4gJmNhcmQtPndhbmRldi5zdGF0czsKK30KKworLyoqKioqKiBQUFAgRmlybXdhcmUgSW50ZXJmYWNlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IHBwcF9yZWFkX3ZlcnNpb24oc2RsYV90ICpjYXJkLCBjaGFyICpzdHIpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfUkVBRF9DT0RFX1ZFUlNJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKyAKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCisJZWxzZSBpZiAoc3RyKSB7CisKKwkJaW50IGxlbiA9IG1iLT5jbWQubGVuZ3RoOworCisJCW1lbWNweShzdHIsIG1iLT5kYXRhLCBsZW4pOworCQlzdHJbbGVuXSA9ICdcMCc7CisKKwl9CisKKwlyZXR1cm4gZXJyOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBPdXQtQm91bmQgQXV0aGVudGljYXRpb24uCisqLworc3RhdGljIGludCBwcHBfc2V0X291dGJuZF9hdXRoIChzZGxhX3QgKmNhcmQsIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1lbXNldCgmbWItPmRhdGEsIDAsIChzdHJsZW4ocHBwX3ByaXZfYXJlYS0+dXNlcmlkKSArIAorCQkJCQlzdHJsZW4ocHBwX3ByaXZfYXJlYS0+cGFzc3dkKSArIDIgKSApOworCW1lbWNweShtYi0+ZGF0YSwgcHBwX3ByaXZfYXJlYS0+dXNlcmlkLCBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+dXNlcmlkKSk7CisJbWVtY3B5KChtYi0+ZGF0YSArIHN0cmxlbihwcHBfcHJpdl9hcmVhLT51c2VyaWQpICsgMSksIAorCQlwcHBfcHJpdl9hcmVhLT5wYXNzd2QsIHN0cmxlbihwcHBfcHJpdl9hcmVhLT5wYXNzd2QpKTsJCisJCisJbWItPmNtZC5sZW5ndGggID0gc3RybGVuKHBwcF9wcml2X2FyZWEtPnVzZXJpZCkgKyAKKwkJCQkJc3RybGVuKHBwcF9wcml2X2FyZWEtPnBhc3N3ZCkgKyAyIDsKKwkKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfU0VUX09VVEJPVU5EX0FVVEg7CisKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKQorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IEluLUJvdW5kIEF1dGhlbnRpY2F0aW9uLgorKi8KK3N0YXRpYyBpbnQgcHBwX3NldF9pbmJuZF9hdXRoIChzZGxhX3QgKmNhcmQsIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVyciwgaTsKKwljaGFyKiB1c2VyX3Rva2Vuc1szMl07CisJY2hhciogcGFzc190b2tlbnNbMzJdOworCWludCB1c2VyaWRzLCBwYXNzd2RzOworCWludCBhZGRfcHRyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWVtc2V0KCZtYi0+ZGF0YSwgMCwgMTAwOCk7CisJbWVtY3B5KG1iLT5kYXRhLCBwcHBfcHJpdl9hcmVhLT5zeXNuYW1lLCAKKwkJCQkJCXN0cmxlbihwcHBfcHJpdl9hcmVhLT5zeXNuYW1lKSk7CisJCisJLyogUGFyc2UgdGhlIHVzZXJpZCBzdHJpbmcgYW5kIHRoZSBwYXNzd29yZCBzdHJpbmcgYW5kIGJ1aWxkIGEgc3RyaW5nCisJICAgdG8gY29weSBpdCB0byB0aGUgZGF0YSBhcmVhIG9mIHRoZSBjb21tYW5kIHN0cnVjdHVyZS4gICBUaGUgc3RyaW5nCisJICAgd2lsbCBsb29rIGxpa2UgIlNZU19OQU1FPE5VTEw+VVNFUjE8TlVMTD5QQVNTMTxOVUxMPlVTRVIyPE5VTEw+UEFTUzIKKwkgICAuLi4uPE5VTEw+ICIgCisJICovCisJdXNlcmlkcyA9IHRva2VuaXplKCBwcHBfcHJpdl9hcmVhLT51c2VyaWQsIHVzZXJfdG9rZW5zKTsKKwlwYXNzd2RzID0gdG9rZW5pemUoIHBwcF9wcml2X2FyZWEtPnBhc3N3ZCwgcGFzc190b2tlbnMpOworCQorCWlmICh1c2VyaWRzICE9IHBhc3N3ZHMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTnVtYmVyIG9mIHBhc3N3b3JkcyBkb2VzIG5vdCBlcXVhbCB0aGUgbnVtYmVyIG9mIHVzZXIgaWRzXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CQorCX0KKworCWFkZF9wdHIgPSBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+c3lzbmFtZSkgKyAxOworCWZvciAoaT0wOyBpPHVzZXJpZHM7IGkrKyl7CisJCW1lbWNweSgobWItPmRhdGEgKyBhZGRfcHRyKSwgdXNlcl90b2tlbnNbaV0sIAorCQkJCQkJCXN0cmxlbih1c2VyX3Rva2Vuc1tpXSkpOworCQltZW1jcHkoKG1iLT5kYXRhICsgYWRkX3B0ciArIHN0cmxlbih1c2VyX3Rva2Vuc1tpXSkgKyAxKSwgCisJCQkJCXBhc3NfdG9rZW5zW2ldLCBzdHJsZW4ocGFzc190b2tlbnNbaV0pKTsKKwkJYWRkX3B0ciA9IGFkZF9wdHIgKyBzdHJsZW4odXNlcl90b2tlbnNbaV0pICsgMSArIAorCQkJCQkJc3RybGVuKHBhc3NfdG9rZW5zW2ldKSArIDE7CisJfQorCisJbWItPmNtZC5sZW5ndGggID0gYWRkX3B0ciArIDE7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9JTkJPVU5EX0FVVEg7CisKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKQorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVG9rZW5pemUgc3RyaW5nLgorICogICAgICBQYXJzZSBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAqICAgICAgICAgICAgICA8YXJnMT4sPGFyZzI+LC4uLgorICogICAgICBhbmQgZmlsbCBhcnJheSBvZiB0b2tlbnMgd2l0aCBwb2ludGVycyB0byBzdHJpbmcgZWxlbWVudHMuCisgKgorICovCitzdGF0aWMgaW50IHRva2VuaXplIChjaGFyICpzdHIsIGNoYXIgKip0b2tlbnMpCit7CisgICAgICAgIGludCBjbnQgPSAwOworCisgICAgICAgIHRva2Vuc1swXSA9IHN0cnNlcCgmc3RyLCAiLyIpOworICAgICAgICB3aGlsZSAodG9rZW5zW2NudF0gJiYgKGNudCA8IDMyIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlbnNbY250XSA9IHN0cnN0cmlwKHRva2Vuc1tjbnRdLCAiIFx0Iik7CisgICAgICAgICAgICAgICAgdG9rZW5zWysrY250XSA9IHN0cnNlcCgmc3RyLCAiLyIpOworICAgICAgICB9CisJcmV0dXJuIGNudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb2ZmIHRoZSBzdHJpbmcgc3RyLgorICovCitzdGF0aWMgY2hhciogc3Ryc3RyaXAgKGNoYXIgKnN0ciwgY2hhciogcykKK3sKKyAgICAgICAgY2hhciAqZW9zID0gc3RyICsgc3RybGVuKHN0cik7ICAgICAgICAgIC8qIC0+IGVuZCBvZiBzdHJpbmcgKi8KKworICAgICAgICB3aGlsZSAoKnN0ciAmJiBzdHJjaHIocywgKnN0cikpCisgICAgICAgICAgICAgICAgKytzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcyAqLworICAgICAgICA7CisgICAgICAgIHdoaWxlICgoZW9zID4gc3RyKSAmJiBzdHJjaHIocywgKihlb3MgLSAxKSkpCisgICAgICAgICAgICAgICAgLS1lb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KKyAgICAgICAgOworICAgICAgICAqZW9zID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIHN0cjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uZmlndXJlIFBQUCBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludCBwcHBfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgdm9pZCAqZGF0YSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGRhdGFfbGVuID0gc2l6ZW9mKHBwcDUwOF9jb25mX3QpOyAKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWVtY3B5KG1iLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7CisJbWItPmNtZC5sZW5ndGggID0gZGF0YV9sZW47CisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9DT05GSUc7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBpbnRlcnJ1cHQgbW9kZS4KKyAqLworc3RhdGljIGludCBwcHBfc2V0X2ludHJfbW9kZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgbW9kZSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisgICAgICAgIHBwcF9pbnRyX2luZm9fdCAqcHBwX2ludHJfZGF0YSA9IChwcHBfaW50cl9pbmZvX3QgKikgJm1iLT5kYXRhWzBdOworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwlwcHBfaW50cl9kYXRhLT5pX2VuYWJsZSA9IG1vZGU7CisKKwlwcHBfaW50cl9kYXRhLT5pcnEgPSBjYXJkLT5ody5pcnE7CisJbWItPmNtZC5sZW5ndGggPSAyOworCisgICAgICAgLyogSWYgdGltZXIgaGFzIGJlZW4gZW5hYmxlZCwgc2V0IHRoZSB0aW1lciBkZWxheSB0byAxc2VjICovCisgICAgICAgaWYgKG1vZGUgJiAweDgwKXsKKyAgICAgICAJCXBwcF9pbnRyX2RhdGEtPnRpbWVyX2xlbiA9IDI1MDsgLy81Oy8vMTAwOyAvLzI1MDsKKyAgICAgICAgICAgICAgICBtYi0+Y21kLmxlbmd0aCA9IDQ7CisgICAgICAgIH0KKwkKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfU0VUX0lOVFJfRkxBR1M7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisgCQkKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCitzdGF0aWMgaW50IHBwcF9jb21tX2VuYWJsZShzZGxhX3QgKmNhcmQpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfQ09NTV9FTkFCTEU7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQkKKwkJY2FyZC0+dS5wLmNvbW1fZW5hYmxlZCA9IDE7CQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNhYmxlIGNvbW11bmljYXRpb25zLgorICovCitzdGF0aWMgaW50IHBwcF9jb21tX2Rpc2FibGUoc2RsYV90ICpjYXJkKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX0NPTU1fRElTQUJMRTsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENNRF9PSykgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwllbHNlCisJCWNhcmQtPnUucC5jb21tX2VuYWJsZWQgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcHBfY29tbV9kaXNhYmxlX3NodXRkb3duKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJcHBwX2ludHJfaW5mb190ICpwcHBfaW50cl9kYXRhOworCWludCBlcnI7CisKKwlpZiAoIW1iKXsKKwkJcmV0dXJuIDE7CisJfQorCQorCXBwcF9pbnRyX2RhdGEgPSAocHBwX2ludHJfaW5mb190ICopICZtYi0+ZGF0YVswXTsKKwkKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJcHBwX2ludHJfZGF0YS0+aV9lbmFibGUgPSAwOworCisJcHBwX2ludHJfZGF0YS0+aXJxID0gY2FyZC0+aHcuaXJxOworCW1iLT5jbWQubGVuZ3RoID0gMjsKKworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9TRVRfSU5UUl9GTEFHUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCS8qIERpc2FibGUgY29tbXVuaWNhdGlub25zICovCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX0NPTU1fRElTQUJMRTsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWNhcmQtPnUucC5jb21tX2VuYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBjb21tdW5pY2F0aW9ucyBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHBwcF9nZXRfZXJyX3N0YXRzKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9SRUFEX0VSUk9SX1NUQVRTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgPT0gQ01EX09LKSB7CisJCQorCQlwcHBfZXJyX3N0YXRzX3QqIHN0YXRzID0gKHZvaWQqKW1iLT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfb3Zlcl9lcnJvcnMgICAgPSBzdGF0cy0+cnhfb3ZlcnJ1bjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgID0gc3RhdHMtPnJ4X2JhZF9jcmM7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICA9IHN0YXRzLT5yeF9hYm9ydDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgID0gc3RhdHMtPnJ4X2xvc3Q7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IHN0YXRzLT50eF9hYm9ydDsKKwkKKwl9IGVsc2UgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgcGFja2V0LgorICoJUmV0dXJuOgkwIC0gby5rLgorICoJCTEgLSBubyB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZQorICovCitzdGF0aWMgaW50IHBwcF9zZW5kIChzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgcHJvdG8pCit7CisJcHBwX2J1Zl9jdGxfdCAqdHhidWYgPSBjYXJkLT51LnAudHhidWY7CisKKwlpZiAodHhidWYtPmZsYWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCisJc2RsYV9wb2tlKCZjYXJkLT5odywgdHhidWYtPmJ1Zi5wdHIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+bGVuZ3RoID0gbGVuOwkJLyogZnJhbWUgbGVuZ3RoICovCisJCisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX0lQWCkpCisJCXR4YnVmLT5wcm90byA9IDB4MDE7CS8qIHByb3RvY29sIElEICovCisJZWxzZQorCQl0eGJ1Zi0+cHJvdG8gPSAweDAwOwkvKiBwcm90b2NvbCBJRCAqLworCQorCXR4YnVmLT5mbGFnID0gMTsJCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCisJLyogVXBkYXRlIHRyYW5zbWl0IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWNhcmQtPnUucC50eGJ1ZiA9ICsrdHhidWY7CisKKwlpZiAoKHZvaWQqKXR4YnVmID4gY2FyZC0+dS5wLnR4YnVmX2xhc3QpCisJCWNhcmQtPnUucC50eGJ1ZiA9IGNhcmQtPnUucC50eGJ1Zl9iYXNlOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKiogRmlybXdhcmUgRXJyb3IgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpcm13YXJlIGVycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IHBwcF9lcnJvcihzZGxhX3QgKmNhcmQsIGludCBlcnIsIHBwcF9tYm94X3QgKm1iKQoreworCXVuc2lnbmVkIGNtZCA9IG1iLT5jbWQuY29tbWFuZDsKKworCXN3aXRjaCAoZXJyKSB7CisKKwkJY2FzZSBDTURfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY21kKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIgorCQkJCSwgY2FyZC0+ZGV2bmFtZSwgY21kLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQUFAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgd3BwX2lzciAoc2RsYV90ICpjYXJkKQoreworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJaW50IGk7CisKKwljYXJkLT5pbl9pc3IgPSAxOworCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKwlpZiAoIWRldiAmJiBmbGFncy0+aWZsYWcgIT0gUFBQX0lOVFJfQ01EKXsKKwkJY2FyZC0+aW5faXNyID0gMDsKKwkJZmxhZ3MtPmlmbGFnID0gMDsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJY2FyZC0+aW5faXNyID0gMDsKKwkJZmxhZ3MtPmlmbGFnID0gMDsKKwkJcmV0dXJuOworCX0KKwkKKwkKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9hbHJlYWR5X2NyaXRpY2FsOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1IhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWNhcmQtPmluX2lzciA9IDA7CisJCQlmbGFncy0+aWZsYWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3dpdGNoIChmbGFncy0+aWZsYWcpIHsKKworCQljYXNlIFBQUF9JTlRSX1JYUkRZOgkvKiByZWNlaXZlIGludGVycnVwdCAgMHgwMSAgKGJpdCAwKSovCisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3J4OworCQkJcnhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfVFhSRFk6CS8qIHRyYW5zbWl0IGludGVycnVwdCAgMHgwMiAoYml0IDEpKi8KKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfdHg7CisJCQlmbGFncy0+aW1hc2sgJj0gflBQUF9JTlRSX1RYUkRZOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUFBfSU5UUl9DTUQ6ICAgICAgLyogaW50ZXJmYWNlIGNvbW1hbmQgY29tcGxldGVkICovCisJCQkrK0ludHJfdGVzdF9jb3VudGVyOworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9pbnRyX3Rlc3Q7CisJCQlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX01PREVNOiAgICAvKiBtb2RlbSBzdGF0dXMgY2hhbmdlIChEQ0QsIENUUykgMHgwNCAoYml0IDIpKi8KKwkJY2FzZSBQUFBfSU5UUl9ESVNDOiAgCS8qIERhdGEgbGluayBkaXNjb25uZWN0ZWQgMHgxMCAgKGJpdCA0KSovCQorCQljYXNlIFBQUF9JTlRSX09QRU46ICAgCS8qIERhdGEgbGluayBvcGVuIDB4MjAgIChiaXQgNSkqLworCQljYXNlIFBQUF9JTlRSX0RST1BfRFRSOgkvKiBEVFIgZHJvcCB0aW1lb3V0IGV4cGlyZWQgIDB4NDAgYml0IDYgKi8KKwkJCWV2ZW50X2ludHIoY2FyZCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBQUFBfSU5UUl9USU1FUjoKKwkJCXRpbWVyX2ludHIoY2FyZCk7CisJCQlicmVhazsJIAorCisJCWRlZmF1bHQ6CS8qIHVuZXhwZWN0ZWQgaW50ZXJydXB0ICovCisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3NwdXJpb3VzOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNwdXJpb3VzIGludGVycnVwdCAweCUwMlghXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBmbGFncy0+aWZsYWcpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElEIEJ5dGVzID0gIixjYXJkLT5kZXZuYW1lKTsKKwkgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MjggKyBpKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwkKKwl9CisJCisJY2FyZC0+aW5faXNyID0gMDsKKwlmbGFncy0+aWZsYWcgPSAwOworCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCByeF9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfYnVmX2N0bF90ICpyeGJ1ZiA9IGNhcmQtPnJ4bWI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbGVuOworCXZvaWQgKmJ1ZjsKKwlpbnQgaTsKKyAgICAgICAgcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisgICAgICAgIGNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJaW50IHVkcF90eXBlOworCQorCisJaWYgKHJ4YnVmLT5mbGFnICE9IDB4MDEpIHsKKworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBjb3JydXB0ZWQgUnggYnVmZmVyIEAgMHglWCwgZmxhZyA9IDB4JTAyWCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkKXJ4YnVmLCByeGJ1Zi0+ZmxhZyk7CisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisJIAkKKwkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MjggKyBpKSk7CisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorCQkKKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfY29ycnVwdF9yeF9iZnI7CisKKworCQkvKiBCdWcgRml4OiBNYXIgNiAyMDAwCisgICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGEgY29ycnVwdGVkIG1haWxib3gsIGl0IG1lYW5zIHRoYXQgZHJpdmVyIAorICAgICAgICAgICAgICAgICAqIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpcm13YXJlLiBUaGVyZSBpcyBubyByZWNvdmVyeS4KKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkb24ndCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyBmb3IgdGhpcyBjYXJkCisgICAgICAgICAgICAgICAgICogdGhlIG1hY2hpbmUgd2lsbCBjcmFzaC4gCisgICAgICAgICAgICAgICAgICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCByb3V0ZXIgZmFpbHVyZSAuLi4hISFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llcyAhXG4iKTsKKwkJcHBwX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJcmV0dXJuOworCX0KKyAgICAgIAorCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyhkZXYpICYmIGRldi0+cHJpdil7CisJCisJCWxlbiAgPSByeGJ1Zi0+bGVuZ3RoOworCQlwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJCS8qIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJCWlmIChza2IgIT0gTlVMTCkgeworCQkKKwkJCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCQkJdW5zaWduZWQgYWRkciA9IHJ4YnVmLT5idWYucHRyOworCisJCQlpZiAoKGFkZHIgKyBsZW4pID4gY2FyZC0+dS5wLnJ4X3RvcCArIDEpIHsKKwkJCQorCQkJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUucC5yeF90b3AgLSBhZGRyICsgMTsKKwkJCQlidWYgPSBza2JfcHV0KHNrYiwgdG1wKTsKKwkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBidWYsIHRtcCk7CisJCQkJYWRkciA9IGNhcmQtPnUucC5yeF9iYXNlOworCQkJCWxlbiAtPSB0bXA7CisJCQl9CisJCQlidWYgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgbGVuKTsKKworCQkJLyogRGVjYXBzdWxhdGUgcGFja2V0ICovCisgICAgICAgIAkJc3dpdGNoIChyeGJ1Zi0+cHJvdG8pIHsKKwkKKwkJCQljYXNlIDB4MDA6CisJCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweDAxOgorCQkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBYKTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKCBza2IsIGNhcmQgKTsKKworCQkJaWYgKHVkcF90eXBlID09IFVEUF9QVFBJUEVfVFlQRSl7CisKKwkJCQkvKiBIYW5kbGUgYSBVRFAgUmVxdWVzdCBpbiBUaW1lciBJbnRlcnJ1cHQgKi8KKwkJCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fTkVUV09SSywgY2FyZCwgc2tiLCBkZXYsCisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJcHBwX3ByaXZfYXJlYSkpeworCSAgICAgICAgICAgICAgIAkJCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsKKwkJCQl9CisJCQkJKytwcHBfcHJpdl9hcmVhLT5yeF9pbnRyX3N0YXQucnhfaW50cl9QSVBFX3JlcXVlc3Q7CisKKworCQkJfSBlbHNlIGlmIChoYW5kbGVfSVBYV0FOKHNrYi0+ZGF0YSxjYXJkLT5kZXZuYW1lLCAKKwkJCQkJCSBwcHBfcHJpdl9hcmVhLT5lbmFibGVfSVBYLCAKKwkJCQkJCSBwcHBfcHJpdl9hcmVhLT5uZXR3b3JrX251bWJlciwgCisJCQkJCQkgc2tiLT5wcm90b2NvbCkpIHsKKwkJCQorCQkJCS8qIEhhbmRsZSBhbiBJUFhXQU4gcGFja2V0ICovCisJCQkJaWYoIHBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFgpIHsKKwkJCQkJCisJCQkJCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgc2VuZGluZyAqLworCQkJCQlpZiAoIXRlc3RfYml0KFNFTkRfQ1JJVCwgJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkJCQkgCXBwcF9zZW5kKGNhcmQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGh0b25zKEVUSF9QX0lQWCkpOworCQkJCQl9CisJCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkJCQl9IGVsc2UgeworCQkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogUGFzcyBkYXRhIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCSAgICAJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCisJCQkgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHM7CisJCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkgICAgCQkrK3BwcF9wcml2X2FyZWEtPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CQorCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKworCQl9IGVsc2UgeworCQorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LnJ4X2ludHJfbm9fc29ja2V0OworCQl9CisKKwl9IGVsc2UgeworCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9kZXZfbm90X3N0YXJ0ZWQ7CisJfQorCisJLyogUmVsZWFzZSBidWZmZXIgZWxlbWVudCBhbmQgY2FsY3VsYXRlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUgKi8KKwlyeGJ1Zi0+ZmxhZyA9IDB4MDA7CisJY2FyZC0+cnhtYiA9ICsrcnhidWY7CisJaWYgKCh2b2lkKilyeGJ1ZiA+IGNhcmQtPnUucC5yeGJ1Zl9sYXN0KQorCQljYXJkLT5yeG1iID0gY2FyZC0+dS5wLnJ4YnVmX2Jhc2U7Cit9CisKKwordm9pZCBldmVudF9pbnRyIChzZGxhX3QgKmNhcmQpCit7CisKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGNhcmQtPndhbmRldi5kZXY7CisgICAgICAgIHBwcF9wcml2YXRlX2FyZWFfdCogcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCXN3aXRjaCAoZmxhZ3MtPmlmbGFnKXsKKworCQljYXNlIFBQUF9JTlRSX01PREVNOiAgICAvKiBtb2RlbSBzdGF0dXMgY2hhbmdlIChEQ0QsIENUUykgMHgwNCAgKGJpdCAyKSovCisKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayAoS0VSTl9JTkZPICIlczogTW9kZW0gc3RhdHVzOiBEQ0Q9JXMgQ1RTPSVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBEQ0QoZmxhZ3MtPm1zdGF0dXMpLCBDVFMoZmxhZ3MtPm1zdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfRElTQzogIAkvKiBEYXRhIGxpbmsgZGlzY29ubmVjdGVkIDB4MTAgIChiaXQgNCkqLwkKKworCQkJTkVYX1BSSU5USyAoS0VSTl9JTkZPICJEYXRhIGxpbmsgZGlzY29ubmVjdGVkIGludHIgQ2F1c2UgJVhcbiIsCisJCQkJCSAgICAgICBmbGFncy0+ZGlzY19jYXVzZSk7CisKKwkJCWlmIChmbGFncy0+ZGlzY19jYXVzZSAmCisJCQkJKFBQUF9MT0NBTF9URVJNSU5BVElPTiB8IFBQUF9EQ0RfQ1RTX0RST1AgfAorCQkJCVBQUF9SRU1PVEVfVEVSTUlOQVRJT04pKSB7CisKKwkJCQlpZiAoY2FyZC0+dS5wLmlwX21vZGUgPT0gV0FOT1BUX1BQUF9QRUVSKSB7IAorCQkJCQlzZXRfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQl9CisJCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCQlzaG93X2Rpc2NfY2F1c2UoY2FyZCwgZmxhZ3MtPmRpc2NfY2F1c2UpOworCQkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9QUFBfRVZFTlQ7CisJCQkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQkJCXRyaWdnZXJfcHBwX3BvbGwoZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfT1BFTjogICAJLyogRGF0YSBsaW5rIG9wZW4gMHgyMCAgKGJpdCA1KSovCisKKwkJCU5FWF9QUklOVEsgKEtFUk5fSU5GTyAiJXM6IFBQUCBMaW5rIE9wZW4sIExDUD0lcyBJUD0lc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxMQ1AoZmxhZ3MtPmxjcF9zdGF0ZSksCisJCQkJCUlQKGZsYWdzLT5pcF9zdGF0ZSkpOworCisJCQlpZiAoZmxhZ3MtPmxjcF9zdGF0ZSA9PSAweDA5ICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzLT5pcF9zdGF0ZSA9PSAweDA5IHx8IGZsYWdzLT5pcHhfc3RhdGUgPT0gMHgwOSkpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgdGltZXIgYW5kIHNldCB0aGUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gV0FOX0NPTk5ORUNURUQgKi8KKworCisJCQkJLyogQlVHIEZJWDogV2hlbiB0aGUgcHJvdG9jb2wgcmVzdGFydHMsIGR1cmluZyBoZWF2eSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHJhZmZpYywgYm9hcmQgdHggYnVmZmVycyBhbmQgZHJpdmVyIHR4IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuIGdvIG91dCBvZiBzeW5jLiAgVGhpcyBjaGVja3MgdGhlIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgaWYgdGhlIHR4IGJ1ZmZlcnMgYXJlIG91dCBvZiBzeW5jLCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb3RvY29scyBhcmUgcmVzdGFydGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSSBkb24ndCBrbm93IHdoeSB0aGUgYm9hcmQgdHggYnVmZmVyIGlzIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBzeW5jLiBJdCBjb3VsZCBiZSB0aGF0IGEgcGFja2V0cyBpcyB0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGlsZSB0aGUgbGluayBpcyBkb3duLCBidXQgdGhhdCBpcyBub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvc3NpYmxlLiBUaGUgb3RoZXIgcG9zc2libGlsaXR5IGlzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcm13YXJlIGRvZXNuJ3QgcmVpbml0aWFsaXplIHByb3Blcmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQSBiZXR0ZXIgZml4IHNob3VsZCBiZSBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorCQkJCWlmIChkZXRlY3RfYW5kX2ZpeF90eF9idWcoY2FyZCkpeworCisJCQkJCXBwcF9jb21tX2Rpc2FibGUoY2FyZCk7CisKKwkJCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCQkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gCisJCQkJCQlUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQkJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisJCQkJCWJyZWFrOwkKKwkJCQl9CisKKwkJCQljYXJkLT5zdGF0ZV90aWNrID0gamlmZmllczsKKwkJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKworCQkJCU5FWF9QUklOVEsoS0VSTl9JTkZPICJDT046IEwgVHg6ICVseCAgQiBUeDogJWx4IHx8IEwgUnggJWx4IEIgUnggJWx4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyljYXJkLT51LnAudHhidWYsICpjYXJkLT51LnAudHhidWZfbmV4dCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpY2FyZC0+cnhtYiwgKmNhcmQtPnUucC5yeGJ1Zl9uZXh0KTsKKworCQkJCS8qIFRlbGwgdGltZXIgaW50ZXJydXB0IHRoYXQgUFBQIGV2ZW50IG9jY3VycmVkICovCisJCQkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVDsKKwkJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisKKwkJCQkvKiBJZiB3ZSBhcmUgaW4gUEVFUiBtb2RlLCB3ZSBtdXN0IGZpcnN0IG9idGFpbiB0aGUKKwkJCQkgKiBJUCBpbmZvcm1hdGlvbiBhbmQgdGhlbiBnbyBpbnRvIHRoZSBwb2xsIHJvdXRpbmUgKi8KKwkJCQlpZiAoY2FyZC0+dS5wLmlwX21vZGUgIT0gV0FOT1BUX1BQUF9QRUVSKXsJCisJCQkJCXRyaWdnZXJfcHBwX3BvbGwoZGV2KTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICAgICAgICAgCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfRFJPUF9EVFI6CQkvKiBEVFIgZHJvcCB0aW1lb3V0IGV4cGlyZWQgIDB4NDAgYml0IDYgKi8KKworCQkJTkVYX1BSSU5USyhLRVJOX0lORk8gIkRUUiBEcm9wIFRpbWVvdXQgSW50ZXJycnVwdCBcbiIpOyAKKworCQkJaWYgKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgeyAKKwkJCQlzZXRfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCX0KKwkJCisJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKworCQkJc2hvd19kaXNjX2NhdXNlKGNhcmQsIGZsYWdzLT5kaXNjX2NhdXNlKTsKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9QUFBfRVZFTlQ7CisJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIEludmFsaWQgUFBQIEV2ZW50XG4iLGNhcmQtPmRldm5hbWUpOworCX0KK30KKworCisKKy8qIFRJTUVSIElOVEVSUlVQVCAqLworCit2b2lkIHRpbWVyX2ludHIgKHNkbGFfdCAqY2FyZCkKK3sKKworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKyAgICAgICAgcHBwX3ByaXZhdGVfYXJlYV90KiBwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQ09ORklHKXsKKwkJaWYgKCFjb25maWdfcHBwKGNhcmQpKXsKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IAorCQkJCQl+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsJCisJCX0KKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCWlmIChwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpeworCQlwcHBfZ2V0X2Vycl9zdGF0cyhjYXJkKTsKKyAgICAgICAgICAgICAgICBpZighKC0tcHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKSl7CisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSAKKwkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwkJfQorCX0KKworCS8qIFBQSVBFTU9OIFVEUCByZXF1ZXN0ICovCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQKXsKKwkJcHJvY2Vzc191ZHBfbWdtdF9wa3QoY2FyZCxkZXYsIHBwcF9wcml2X2FyZWEpOworCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VEUDsKKwl9CisKKwkvKiBQUFAgRXZlbnQgKi8KKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UKXsKKworCQlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9ESVNDT05ORUNURUQpeworCQkJcmV0cmlnZ2VyX2NvbW0oY2FyZCk7CisJCX0KKworCQkvKiBJZiB0aGUgc3RhdGUgaXMgQ09OTkVDVElORywgaXQgbWVhbnMgdGhhdCBjb21tdW5pY2F0aW5zIHdlcmUKKwkgCSAqIGVuYWJsZWQuIFdoZW4gdGhlIHJlbW90ZSBzaWRlIGVuYWJsZXMgaXRzIGNvbW1pbmljYXRpb24gd2UKKwkgCSAqIHNob3VsZCBnZXQgYW4gaW50ZXJydXB0IFBQUF9JTlRSX09QRU4sIHRodXMgdHVybiBvZmYgcG9sbGluZyAKKwkJICovCisKKwkJZWxzZSBpZiAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9DT05ORUNUSU5HKXsKKwkJCS8qIFR1cm4gb2ZmIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQl9CisKKwkJLyogSWYgc3RhdGUgaXMgY29ubmVjdGVkIGFuZCB3ZSBhcmUgaW4gUEVFUiBtb2RlIAorCSAJICogcG9sbCBmb3IgYW4gSVAgYWRkcmVzcyB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIGJ5IHJlbW90ZSBlbmQuCisJIAkgKi8KKwkJZWxzZSBpZiAoKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEICYmIAorCQkgIAkgIGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYgCisJCSAgCSAgdGVzdF9iaXQoMCwmUmVhZF9jb25uZWN0aW9uX2luZm8pKXsKKworCQkJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7CisJCQlpZiAocmVhZF9jb25uZWN0aW9uX2luZm8gKGNhcmQpKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHJlYWQgUEVFUiBJUCBBZGRyZXNzZXNcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfWVsc2V7CisJCQkJY2xlYXJfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQlzZXRfYml0KDEsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQl9CisJCX1lbHNleworCQkJLy9GSVhNRSBQdXQgdGhlIGNvbW1lbnQgYmFjayBpbnQKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQl9CisKKwl9LyogRW5kIG9mIFBQUF9FVkVOVCAqLworCisKKwkvKiBPbmx5IGRpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCBpZiB0aGVyZSBhcmUgbm8gdWRwLCBzdGF0aXN0aWMgKi8KKwkvKiB1cGRhdGVzIG9yIGV2ZW50cyBwZW5kaW5nICovCisgICAgICAgIGlmKCFwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+UFBQX0lOVFJfVElNRVI7CisgICAgICAgIH0KK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfSVBYLCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBzaG9ydCBwcm90bykKK3sKKwlpbnQgaTsKKworCWlmKCBwcm90byA9PSBodG9ucyhFVEhfUF9JUFgpICkgeworCQkvL0l0J3MgYW4gSVBYIHBhY2tldAorCQlpZighZW5hYmxlX0lQWCkgeworCQkJLy9SZXR1cm4gMSBzbyB3ZSBkb24ndCBwYXNzIGl0IHVwIHRoZSBzdGFjay4KKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLy9JdCdzIG5vdCBJUFggc28gcGFzcyBpdCB1cCB0aGUgc3RhY2suCisJCXJldHVybiAwOworCX0KKworCWlmKCBzZW5kcGFja2V0WzE2XSA9PSAweDkwICYmCisJICAgIHNlbmRwYWNrZXRbMTddID09IDB4MDQpCisJeworCQkvL0l0J3MgSVBYV0FOCisKKwkJaWYoIHNlbmRwYWNrZXRbMl0gPT0gMHgwMiAmJgorCQkgICAgc2VuZHBhY2tldFszNF0gPT0gMHgwMCkKKwkJeworCQkJLy9JdCdzIGEgdGltZXIgcmVxdWVzdCBwYWNrZXQKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gVGltZXIgUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8vR28gdGhyb3VnaCB0aGUgcm91dGluZyBvcHRpb25zIGFuZCBhbnN3ZXIgbm8gdG8gZXZlcnkKKwkJCS8vb3B0aW9uIGV4Y2VwdCBVbm51bWJlcmVkIFJJUC9TQVAKKwkJCWZvcihpID0gNDE7IHNlbmRwYWNrZXRbaV0gPT0gMHgwMDsgaSArPSA1KQorCQkJeworCQkJCS8vMHgwMiBpcyB0aGUgb3B0aW9uIGZvciBVbm51bWJlcmVkIFJJUC9TQVAKKwkJCQlpZiggc2VuZHBhY2tldFtpICsgNF0gIT0gMHgwMikKKwkJCQl7CisJCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8vU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbgorCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApCisJCQl7CisJCQkJaSArPSA4OworCQkJfQorCisJCQkvL1dlIGFsc28gd2FudCB0byB0dXJuIG9mZiBhbGwgaGVhZGVyIGNvbXByZXNzaW9uIG9wdC4KKwkJCWZvcig7IHNlbmRwYWNrZXRbaV0gPT0gMHg4MCA7KQorCQkJeworCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQlpICs9IChzZW5kcGFja2V0W2kgKyAyXSA8PCA4KSArIChzZW5kcGFja2V0W2kgKyAzXSkgKyA0OworCQkJfQorCisJCQkvL1NldCB0aGUgcGFja2V0IHR5cGUgdG8gdGltZXIgcmVzcG9uc2UKKwkJCXNlbmRwYWNrZXRbMzRdID0gMHgwMTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIFRpbWVyIFJlc3BvbnNlXG4iLGRldm5hbWUpOworCQl9CisJCWVsc2UgaWYoIHNlbmRwYWNrZXRbMzRdID09IDB4MDIgKQorCQl7CisJCQkvL1RoaXMgaXMgYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBwYWNrZXQKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gSW5mb3JtYXRpb24gUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8vU2V0IHRoZSBwYWNrZXQgdHlwZSB0byBpbmZvcm1hdGlvbiByZXNwb25zZQorCQkJc2VuZHBhY2tldFszNF0gPSAweDAzOworCisJCQkvL1NldCB0aGUgcm91dGVyIG5hbWUKKwkJCXNlbmRwYWNrZXRbNTFdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1Ml0gPSAnVCc7CisJCQlzZW5kcGFja2V0WzUzXSA9ICdQJzsKKwkJCXNlbmRwYWNrZXRbNTRdID0gJ0knOworCQkJc2VuZHBhY2tldFs1NV0gPSAnUCc7CisJCQlzZW5kcGFja2V0WzU2XSA9ICdFJzsKKwkJCXNlbmRwYWNrZXRbNTddID0gJy0nOworCQkJc2VuZHBhY2tldFs1OF0gPSBDVkhleFRvQXNjaWkobmV0d29ya19udW1iZXIgPj4gMjgpOworCQkJc2VuZHBhY2tldFs1OV0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwRjAwMDAwMCk+PiAyNCk7CisJCQlzZW5kcGFja2V0WzYwXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwRjAwMDAwKT4+IDIwKTsKKwkJCXNlbmRwYWNrZXRbNjFdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwRjAwMDApPj4gMTYpOworCQkJc2VuZHBhY2tldFs2Ml0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwRjAwMCk+PiAxMik7CisJCQlzZW5kcGFja2V0WzYzXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDAwRjAwKT4+IDgpOworCQkJc2VuZHBhY2tldFs2NF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDBGMCk+PiA0KTsKKwkJCXNlbmRwYWNrZXRbNjVdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDAwRik7CisJCQlmb3IoaSA9IDY2OyBpIDwgOTk7IGkrPSAxKQorCQkJeworCQkJCXNlbmRwYWNrZXRbaV0gPSAwOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2VuZGluZyBJUFhXQU4gSW5mb3JtYXRpb24gUmVzcG9uc2UgcGFja2V0XG4iLGRldm5hbWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gSVBYV0FOIHBhY2tldCFcbiIsZGV2bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8vU2V0IHRoZSBXTm9kZUlEIHRvIG91ciBuZXR3b3JrIGFkZHJlc3MKKwkJc2VuZHBhY2tldFszNV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQlzZW5kcGFja2V0WzM2XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXNlbmRwYWNrZXRbMzddID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEZGMDApID4+IDgpOworCQlzZW5kcGFja2V0WzM4XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8vSWYgd2UgZ2V0IGhlcmUgaXQncyBhbiBJUFgtZGF0YSBwYWNrZXQsIHNvIGl0J2xsIGdldCBwYXNzZWQgdXAgdGhlIHN0YWNrLgorCisJCS8vc3dpdGNoIHRoZSBuZXR3b3JrIG51bWJlcnMKKwkJc3dpdGNoX25ldF9udW1iZXJzKHNlbmRwYWNrZXQsIG5ldHdvcmtfbnVtYmVyLCAxKTsJCisJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKiBCYWNrZ3JvdW5kIFBvbGxpbmcgUm91dGluZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsbCBwb2xsaW5nIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCBieSB0aGUgVElNRVIgaW50ZXJydXB0IGluIHRoZSB3cHBfaXNyIAorICogcm91dGluZS4gIAorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9uaXRvciBhY3RpdmUgbGluayBwaGFzZS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19yb3V0ZSAoc2RsYV90ICpjYXJkKQoreworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkKKwlpZiAoKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYKKwkgICAgKGZsYWdzLT5pcF9zdGF0ZSA9PSAweDA5KSl7IAorCisJCS8qIFdlIGdldCBpcF9sb2NhbCBmcm9tIHRoZSBmaXJtd2FyZSBpbiBQRUVSIG1vZGUuCisJICAgICAgICAgKiBUaGVyZWZvcmUsIGlmIGlwX2xvY2FsIGlzIDAsIHdlIGZhaWxlZCB0byBvYnRhaW4KKyAgICAgICAgIAkgKiB0aGUgcmVtb3RlIElQIGFkZHJlc3MuICovCisJCWlmIChwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCA9PSAwKSAKKwkJCXJldHVybjsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUENQIFN0YXRlIE9wZW5lZC5cbiIsIGNhcmQtPmRldm5hbWUpOworCQlpZiAocmVhZF9pbmZvKCBjYXJkICkpIHsKKyAgIAkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBBbiBlcnJvciBvY2N1cnJlZCBpbiBJUCBhc3NpZ25tZW50LlxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKwkJCWlmIChpbl9kZXYgIT0gTlVMTCApIHsKKwkJCQlzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSBpbl9kZXYtPmlmYV9saXN0OworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzc2lnbmVkIExjbC4gQWRkcjogJXUuJXUuJXUuJXVcbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGlmYS0+aWZhX2xvY2FsKSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzc2lnbmVkIFJtdC4gQWRkcjogJXUuJXUuJXUuJXVcbiIsIAorCQkJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChpZmEtPmlmYV9hZGRyZXNzKSk7CisJCQl9ZWxzZXsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogRXJyb3I6IEZhaWxlZCB0byBhZGQgYSByb3V0ZSBmb3IgUFBQIGludGVyZmFjZSAlc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOwkKKwkJCX0KKwkJfQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb25pdG9yIHBoeXNpY2FsIGxpbmsgZGlzY29ubmVjdGVkIHBoYXNlLgorICogIG8gaWYgaW50ZXJmYWNlIGlzIHVwIGFuZCB0aGUgaG9sZC1kb3duIHRpbWVvdXQgaGFzIGV4cGlyZWQsIHRoZW4gcmV0cnkKKyAqICAgIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHJldHJpZ2dlcl9jb21tKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCWlmIChkZXYgJiYgKChqaWZmaWVzIC0gY2FyZC0+c3RhdGVfdGljaykgPiBIT0xEX0RPV05fVElNRSkpIHsKKworCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisKKwkJaWYocHBwX2NvbW1fZW5hYmxlKGNhcmQpID09IENNRF9PSyl7CisJCQlpbml0X3BwcF90eF9yeF9idWZmKCBjYXJkICk7CisJCX0JICAgICAgICAgCisJfQorfQorCisvKioqKioqIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25maWd1cmUgUzUwOCBhZGFwdGVyLgorICovCitzdGF0aWMgaW50IGNvbmZpZzUwOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzZGxhX3QgKmNhcmQpCit7CisJcHBwNTA4X2NvbmZfdCBjZmc7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJLyogUHJlcGFyZSBQUFAgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHBwcDUwOF9jb25mX3QpKTsKKworCWlmIChjYXJkLT53YW5kZXYuY2xvY2tpbmcpCisJCWNmZy5saW5lX3NwZWVkID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWlmIChjYXJkLT53YW5kZXYuaW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikKKwkJY2ZnLmNvbmZfZmxhZ3MgfD0gSU5URVJGQUNFX0xFVkVMX1JTMjMyOworCisKKyAgICAgICAgY2ZnLmNvbmZfZmxhZ3MgCXw9IERPTlRfVEVSTUlOQVRFX0xOS19NQVhfQ09ORklHOyAvKnNlbmQgQ29uZmlndXJlLVJlcXVlc3QgcGFja2V0cyBmb3JldmVyKi8KKwljZmcudHhidWZfcGVyY2VudAk9IFBFUkNFTlRfVFhfQlVGRjsJLyogJSBvZiBUeCBidWZzICovCisJY2ZnLm10dV9sb2NhbAkJPSBjYXJkLT53YW5kZXYubXR1OworCWNmZy5tdHVfcmVtb3RlCQk9IGNhcmQtPndhbmRldi5tdHU7ICAgICAgICAgICAgICAgICAgLyogICAgRGVmYXVsdCAgICovCisJY2ZnLnJlc3RhcnRfdG1yCQk9IFRJTUVfQkVUV0VFTl9DT05GX1JFUTsgIAkgICAgIC8qICAgIDMwID0gM3NlYyAqLworCWNmZy5hdXRoX3JzcnRfdG1yCT0gVElNRV9CRVRXRUVOX1BBUF9DSEFQX1JFUTsgICAgICAgICAvKiAgICAzMCA9IDNzZWMgKi8KKwljZmcuYXV0aF93YWl0X3Rtcgk9IFdBSVRfUEFQX0NIQVBfV0lUSE9VVF9SRVBMWTsgICAgICAgLyogICAzMDAgPSAzMHMgICovCisJY2ZnLm1kbV9mYWlsX3Rtcgk9IFdBSVRfQUZURVJfRENEX0NUU19MT1c7ICAgICAgICAgICAgLyogICAgIDUgPSAwLjVzICovCisJY2ZnLmR0cl9kcm9wX3Rtcgk9IFRJTUVfRENEX0NUU19MT1dfQUZURVJfTE5LX0RPV047ICAgLyogICAgMTAgPSAxcyAgICovCisJY2ZnLmNvbm5lY3RfdG1vdXQJPSBXQUlUX0RDRF9ISUdIX0FGVEVSX0VOQUJMRV9DT01NOyAgIC8qICAgOTAwID0gOTBzICAqLworCWNmZy5jb25mX3JldHJ5CQk9IE1BWF9DT05GX1JFUV9XSVRIT1VUX1JFUExZOyAgICAgICAgLyogICAgMTAgPSAxcyAgICovCisJY2ZnLnRlcm1fcmV0cnkJCT0gTUFYX1RFUk1fUkVRX1dJVEhPVVRfUkVQTFk7CSAgICAgLyogICAgIDIgdGltZXMgICovCisJY2ZnLmZhaWxfcmV0cnkJCT0gTlVNX0NPTkZfTkFLX1dJVEhPVVRfUkVQTFk7ICAgICAgICAvKiAgICAgNSB0aW1lcyAgKi8KKwljZmcuYXV0aF9yZXRyeQkJPSBOVU1fQVVUSF9SRVFfV0lUSE9VVF9SRVBMWTsgICAgICAgIC8qICAgICAxMCB0aW1lcyAqLyAgIAorCisKKwlpZiggIWNhcmQtPnUucC5hdXRoZW50aWNhdG9yICkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRGV2aWNlIGlzIG5vdCBjb25maWd1cmVkIGFzIGFuIGF1dGhlbnRpY2F0b3JcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljZmcuYXV0aF9vcHRpb25zID0gTk9fQVVUSEVOVElDQVRJT047CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXZpY2UgaXMgY29uZmlndXJlZCBhcyBhbiBhdXRoZW50aWNhdG9yXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2ZnLmF1dGhfb3B0aW9ucyA9IElOQk9VTkRfQVVUSDsKKwl9CisKKwlpZiggcHBwX3ByaXZfYXJlYS0+cGFwID09IFdBTk9QVF9ZRVMpeworCQljZmcuYXV0aF9vcHRpb25zIHw9UEFQX0FVVEg7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXAgZW5hYmxlZFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorCWlmKCBwcHBfcHJpdl9hcmVhLT5jaGFwID09IFdBTk9QVF9ZRVMpeworCQljZmcuYXV0aF9vcHRpb25zIHw9IENIQVBfQVVUSDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENoYXAgZW5hYmxlZFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+ZW5hYmxlX0lQWCA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIElQWCBQcm90b2NvbFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJY2ZnLmlweF9vcHRpb25zCQk9IEVOQUJMRV9JUFggfCBST1VUSU5HX1BST1RfREVGQVVMVDsKKwl9ZWxzZXsKKwkJY2ZnLmlweF9vcHRpb25zIAk9IERJU0FCTEVfSVBYOworCX0KKworCXN3aXRjaCAoY2FyZC0+dS5wLmlwX21vZGUpIHsKKwkKKwkJY2FzZSBXQU5PUFRfUFBQX1NUQVRJQzoKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBQUCBJUCBNb2RlOiBTVEFUSUNcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQljZmcuaXBfb3B0aW9ucwkJPSBMX0FORF9SX0lQX05PX0FTU0lHIHwgCisJCQkJCQkJICAgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQljZmcuaXBfcmVtb3RlCQk9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzOworCQkJLyogRGVidWdnaW5nIGNvZGUgdXNlZCB0byBjaGVjayB0aGF0IElQIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluZWQgZnJvbSB0aGUga2VybmVsIGFyZSBjb3JyZWN0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FWF9QUklOVEsoS0VSTl9JTkZPICJMb2NhbCAldS4ldS4ldS4ldSBSZW1vdGUgJXUuJXUuJXUuJXUgTmFtZSAlc1xuIiwKKwkJCQkJTklQUVVBRChpcF9sb2NhbCksTklQUVVBRChpcF9yZW1vdGUpLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5PUFRfUFBQX0hPU1Q6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQUFAgSVAgTW9kZTogSE9TVFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCWNmZy5pcF9vcHRpb25zCQk9IExfSVBfTE9DQUxfQVNTSUcgfAorCQkJCQkJICBSX0lQX0xPQ0FMX0FTU0lHIHwgCisJCQkJCQkgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQljZmcuaXBfcmVtb3RlCQk9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzOworCQkJLyogRGVidWdnaW5nIGNvZGUgdXNlZCB0byBjaGVjayB0aGF0IElQIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluZWQgZnJvbSB0aGUga2VybmVsIGFyZSBjb3JyZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBORVhfUFJJTlRLIChLRVJOX0lORk8gIkxvY2FsICV1LiV1LiV1LiV1IFJlbW90ZSAldS4ldS4ldS4ldSBOYW1lICVzXG4iLAorCQkJCQlOSVBRVUFEKGlwX2xvY2FsKSxOSVBRVUFEKGlwX3JlbW90ZSksIGRldi0+bmFtZSk7CisJCQkKKwkJCWJyZWFrOworCQorCQljYXNlIFdBTk9QVF9QUFBfUEVFUjoKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBQUCBJUCBNb2RlOiBQRUVSXG4iLGNhcmQtPmRldm5hbWUpOworCQkJY2ZnLmlwX29wdGlvbnMJCT0gTF9JUF9SRU1PVEVfQVNTSUcgfCAKKwkJCQkJCSAgUl9JUF9SRU1PVEVfQVNTSUcgfCAKKwkJCQkJCQkgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSAweDAwOworCQkJY2ZnLmlwX3JlbW90ZQkJPSAweDAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogVW5zdXBwb3J0ZWQgUFBQIE1vZGUgU2VsZWN0ZWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgICAgICBQUFAgSVAgTW9kZXM6IFNUQVRJQywgUEVFUiBvciBIT1NUXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsJCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gcHBwX2NvbmZpZ3VyZShjYXJkLCAmY2ZnKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTaG93IGRpc2Nvbm5lY3Rpb24gY2F1c2UuCisgKi8KK3N0YXRpYyB2b2lkIHNob3dfZGlzY19jYXVzZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNhdXNlKQoreworCWlmIChjYXVzZSAmIDB4MDgwMikgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdGVybWluYXRlZCBieSBwZWVyXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwMDQpIAorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHRlcm1pbmF0ZWQgYnkgdXNlclxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDA4KSAKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogYXV0aGVudGljYXRpb24gZmFpbGVkXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkKKwllbHNlIGlmIChjYXVzZSAmIDB4MDAxMCkgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogYXV0aGVudGljYXRpb24gcHJvdG9jb2wgbmVnb3RpYXRpb24gZmFpbGVkXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwMjApIAorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkiJXM6IHBlZXIncyByZXF1ZXN0IGZvciBhdXRoZW50aWNhdGlvbiByZWplY3RlZFxuIiwKKwkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDA0MCkgCisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNUlUgb3B0aW9uIHJlamVjdGVkIGJ5IHBlZXJcbiIsIAorCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDgwKSAKKwkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBlZXIncyBNUlUgd2FzIHRvbyBzbWFsbFxuIiwgCisJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAxMDApIAorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgdG8gbmVnb3RpYXRlIHBlZXIncyBMQ1Agb3B0aW9uc1xuIiwKKwkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDIwMCkgCisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHRvIG5lZ290aWF0ZSBwZWVyJ3MgSVBDUCBvcHRpb25zXG4iCisJCSwgY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDQwMCkgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogZmFpbGVkIHRvIG5lZ290aWF0ZSBwZWVyJ3MgSVBYQ1Agb3B0aW9uc1xuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBjYWxsIG9mIHR5cGUgUFRQSVBFQUIuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgYnVmMls1XTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGZyYW1lcywgbGVuOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuZ3RoLCBidWZmZXJfbGVuZ3RoLCByZWFsX2xlbjsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcHRyOworCWludCB1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCXBwcF9tYm94X3QgKm1ib3ggPSBjYXJkLT5tYm94OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBlcnI7CisJcHBwX3VkcF9wa3RfdCAqcHBwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCopJnBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YTsKKworCW1lbWNweSgmYnVmMiwgJmNhcmQtPndhbmRldi51ZHBfcG9ydCwgMiApOworCisKKwlpZihwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJc3dpdGNoKHBwcF91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCQljYXNlIFBQSVBFX0dFVF9JQkFfREFUQToKKwkJCWNhc2UgUFBQX1JFQURfQ09ORklHOgorCQkJY2FzZSBQUFBfR0VUX0NPTk5FQ1RJT05fSU5GTzoKKwkJCWNhc2UgUFBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIFBQUF9SRUFEX1NUQVRJU1RJQ1M6CisJCQljYXNlIFBQUF9SRUFEX0VSUk9SX1NUQVRTOgorCQkJY2FzZSBQUFBfUkVBRF9QQUNLRVRfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0xDUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfSVBDUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfSVBYQ1BfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX1BBUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfQ0hBUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfQ09ERV9WRVJTSU9OOgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAKKwkJCWRlZmF1bHQ6CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJfSAKKwl9CisJCisgIAlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisJICAgIAorCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKyAgICAJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMHgwMDsKKworICAgIAkJLyogc2V0IHJldHVybiBjb2RlICovCisgICAgCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDB4Q0Q7IAorCQkrK3BwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfZGlyZWN0aW9uX2VycjsKKwkKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUscHBwX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKTsKKwkJfQorICAgCX0gZWxzZSB7CisJCS8qIEluaXRpYWxpemUgdGhlIHRyYWNlIGVsZW1lbnQgKi8KKwkJdHJhY2VfZWxlbWVudF90IHRyYWNlX2VsZW1lbnQ7CQkgICAgCisKKwkJc3dpdGNoIChwcHBfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpeworCisJCS8qIFBQSVBFX0VOQUJMRV9UUkFDSU5HICovCisgICAgCQljYXNlIFBQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkJaWYgKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworICAgIAkJCQorCQkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworICAgIAkJCQltYm94LT5jbWQuY29tbWFuZCA9IFBQUF9EQVRBTElORV9NT05JVE9SOworICAgIAkJCQltYm94LT5jbWQubGVuZ3RoID0gMHgwMTsKKyAgICAJCQkJbWJveC0+ZGF0YVswXSA9IHBwcF91ZHBfcGt0LT5kYXRhWzBdOworCSAgICAJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCSAgIAorCQkJCWlmIChlcnIgIT0gQ01EX09LKSB7IAorCSAgICAgICAgCQkJCisJCQkJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1ib3gpOworCSAgICAgICAgCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCSAgICAgICAgCQkKKwkJCQkJLyogc2V0IHRoZSByZXR1cm4gY29kZSAqLworCisJCSAgICAgICAgCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IG1ib3gtPmNtZC5yZXN1bHQ7CisJICAgICAgICAJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkgICAgICAgIAkJCWJyZWFrOworCSAgICAJCQl9IAorCisJCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhDMDAwLCAmYnVmMiwgMik7CisJCSAgICAKKwkJCQlwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIgPSAwOworCQkgICAgCQltZW1jcHkoJnBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgJmJ1ZjIsIDIpOworCQkgICAgCQlwcHBfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyID0gCisJCQkJCQlwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHI7CisJCQkJcHBwX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIgPSAKKwkJCQkJcHBwX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciArIEVORF9PRkZTRVQ7CisJCSAgICAJCisJCQkJLyogTUFYX1NFTkRfQlVGRkVSX1NJWkUgLSAyOCAoSVAgaGVhZGVyKSAKKwkJCQkgICAtIDMyIChwcGlwZW1vbiBDQkxPQ0spICovCisJCSAgICAJCWF2YWlsYWJsZV9idWZmZXJfc3BhY2UgPSBNQVhfTEdUSF9VRFBfTUdOVF9QS1QgLSAKKwkJCQkJCQkgc2l6ZW9mKGlwX3BrdF90KS0KKwkJCQkJCQkgc2l6ZW9mKHVkcF9wa3RfdCktCisJCQkJCQkJIHNpemVvZih3cF9tZ210X3QpLQorCQkJCQkJCSBzaXplb2YoY2Jsb2NrX3QpOworCSAgICAgICAJICAJfQorCSAgICAgICAJICAJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCSAgICAgICAJICAJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJICAgICAgIAkgIAljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJICAgICAgIAkgIAlicmVhazsKKwkgICAKKwkJLyogUFBJUEVfRElTQUJMRV9UUkFDSU5HICovCisJCWNhc2UgUFBJUEVfRElTQUJMRV9UUkFDSU5HOgorCSAgICAgIAkJCisJCQlpZihjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkgICAJCisJCQkJLyogT1BFUkFURV9EQVRBTElORV9NT05JVE9SICovCisJCSAgICAJCW1ib3gtPmNtZC5jb21tYW5kID0gMHgzMzsKKwkJICAgIAkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCSAgICAJCW1ib3gtPmRhdGFbMF0gPSAweDAwOworCQkgICAgCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCSAgICAgICAJICAKKwkJCX0gCisJCQorCQkJLypzZXQgcmV0dXJuIGNvZGUqLworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQlicmVhazsKKwkgICAKKwkJLyogUFBJUEVfR0VUX1RSQUNFX0lORk8gKi8KKwkJY2FzZSBQUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkJaWYoIWNhcmQtPlRyYWNpbmdFbmFibGVkKSB7CisJCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJICAgIAkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMTsKKwkgICAgCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQl9CQkgICAgCisKKwkJCWJ1ZmZlcl9sZW5ndGggPSAwOworCQkJCisJCQkvKiBmcmFtZXMgPCA2Miwgd2hlcmUgNjIgaXMgdGhlIG51bWJlciBvZiB0cmFjZQorCQkJICAgaW5mb3JtYXRpb24gZWxlbWVudHMuICBUaGVyZSBpcyBpbiB0b3RhbCA0OTYKKwkJCSAgIGJ5dGVzIG9mIHNwYWNlIGFuZCBlYWNoIHRyYWNlIGluZm9ybWF0aW9uCisJCQkgICBlbGVtZW50IGlzIDggYnl0ZXMuIAorCQkJICovCisJCQlmb3IgKCBmcmFtZXM9MDsgZnJhbWVzPDYyOyBmcmFtZXMrKykgeworCQorCQkJCXRyYWNlX3BrdF90ICp0cmFjZV9wa3QgPSAodHJhY2VfcGt0X3QgKikKKwkJCQkJJnBwcF91ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOworCQorCQkJCS8qIFJlYWQgdGhlIHdob2xlIHRyYWNlIHBhY2tldCAqLworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIHBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgCisJCQkJCSAgJnRyYWNlX2VsZW1lbnQsIHNpemVvZih0cmFjZV9lbGVtZW50X3QpKTsKKwkKKwkJCQkvKiBubyBkYXRhIG9uIGJvYXJkIHNvIGV4aXQgKi8KKwkJCQlpZiggdHJhY2VfZWxlbWVudC5vcHBfZmxhZyA9PSAweDAwICkgCisJCQkJCWJyZWFrOworCSAgICAgIAorCQkJCWRhdGFfcHRyID0gdHJhY2VfZWxlbWVudC50cmFjZV9kYXRhX3B0cjsKKworCQkJCS8qIFNlZSBpZiB0aGVyZSBpcyBhY3R1YWwgZGF0YSBvbiB0aGUgdHJhY2UgYnVmZmVyICovCisJCQkJaWYgKGRhdGFfcHRyKXsKKwkJCQkJZGF0YV9sZW5ndGggPSB0cmFjZV9lbGVtZW50LnRyYWNlX2xlbmd0aDsKKwkJCQl9ZWxzZXsKKwkJCQkJZGF0YV9sZW5ndGggPSAwOworCQkJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAweDAyOworCQkJCX0KKworCQkJCS8vRklYTUU6IERvIHdlIG5lZWQgdGhpcyBjaGVjaworCQkJCWlmICgoYXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSAtIGJ1ZmZlcl9sZW5ndGgpIAorCQkJCSAgICAgPCAoc2l6ZW9mKHRyYWNlX2VsZW1lbnRfdCkrMSkpeworCQkJCQkKKwkJCQkJLyppbmRpY2F0ZSB3ZSBoYXZlIG1vcmUgZnJhbWVzIAorCQkJCQkgKiBvbiBib2FyZCBhbmQgZXhpdCAKKwkJCQkJICovCisJCQkJCXBwcF91ZHBfcGt0LT5kYXRhWzBdIHw9IDB4MDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQl0cmFjZV9wa3QtPnN0YXR1cyA9IHRyYWNlX2VsZW1lbnQudHJhY2VfdHlwZTsKKwkJCQl0cmFjZV9wa3QtPnRpbWVfc3RhbXAgPSB0cmFjZV9lbGVtZW50LnRyYWNlX3RpbWVfc3RhbXA7CisJCQkJdHJhY2VfcGt0LT5yZWFsX2xlbmd0aCA9IHRyYWNlX2VsZW1lbnQudHJhY2VfbGVuZ3RoOworCisJCQkJcmVhbF9sZW4gPSB0cmFjZV9lbGVtZW50LnRyYWNlX2xlbmd0aDsJCisJCQkJCisJCQkJaWYoZGF0YV9wdHIgPT0gMCl7CisJCQkJCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDA7CisJCQkJfWVsc2V7CisJCQkJCS8qIHdlIGNhbiB0YWtlIGl0IG5leHQgdGltZSAqLworCQkJCQlpZiAoKGF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKTwKKwkJCQkJCShyZWFsX2xlbiArIHNpemVvZih0cmFjZV9wa3RfdCkpKXsKKwkJCQkJCisJCQkJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAweDAyOworCQkJCQkJYnJlYWs7CisJCQkJCX0gCisJCQkJCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDE7CisJCQkJCisJCQkJCS8qIGdldCB0aGUgZGF0YSAqLworCQkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwgCisJCQkJCQkgICZ0cmFjZV9wa3QtPmRhdGEsCisJCQkJCQkgIHJlYWxfbGVuKTsKKwkJCQl9CQorCQkJCS8qIHplcm8gdGhlIG9wcCBmbGFnIHRvIAorCQkJCSAgIHNob3cgd2UgZ290IHRoZSBmcmFtZSAqLworCQkJCWJ1ZjJbMF0gPSAweDAwOworCQkJCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwKKwkJCQkJICAmYnVmMiwgMSk7CisKKwkJCQkvKiBub3cgbW92ZSBvbnRvIHRoZSBuZXh0IAorCQkJCSAgIGZyYW1lICovCisJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyICs9IDg7CisKKwkJCQkvKiBjaGVjayBpZiB3ZSBwYXNzZWQgdGhlIGxhc3QgYWRkcmVzcyAqLworCQkJCWlmICggcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID49IAorCQkJCQlwcHBfcHJpdl9hcmVhLT5lbmRfdHJhY2VfYWRkcil7CisKKwkJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gCisJCQkJCQlwcHBfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyOworCQkJCX0KKyAKKwkJCQkvKiB1cGRhdGUgYnVmZmVyIGxlbmd0aCBhbmQgbWFrZSBzdXJlIGl0cyBldmVuICovIAorCisJCQkJaWYgKCB0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPT0gMHgwMSApIHsKKwkJCQkJYnVmZmVyX2xlbmd0aCArPSByZWFsX2xlbiAtIDE7CisJCQkJfQorIAorCQkJCS8qIGZvciB0aGUgaGVhZGVyICovCisJCQkJYnVmZmVyX2xlbmd0aCArPSA4OworCisJCQkJaWYoIGJ1ZmZlcl9sZW5ndGggJiAweDAwMDEgKQorCQkJCQlidWZmZXJfbGVuZ3RoICs9IDE7CisJCQl9CisKKwkJCS8qIG9rIG5vdyBzZXQgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGFzc2VkCisJCQkgICBpbiB0aGUgaGlnaCA1IGJpdHMgKi8KKwkJCXBwcF91ZHBfcGt0LT5kYXRhWzBdIHw9IChmcmFtZXMgPDwgMik7CisJIAorCQkJLyogc2V0IHRoZSBkYXRhIGxlbmd0aCAqLworCQkJbWJveC0+Y21kLmxlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisJIAorCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJICAgICAgCSAgCWJyZWFrOworCisgICAJCS8qIFBQSVBFX0dFVF9JQkFfREFUQSAqLworCQljYXNlIFBQSVBFX0dFVF9JQkFfREFUQToKKwkgICAgICAgIAorCQkJbWJveC0+Y21kLmxlbmd0aCA9IDB4MDk7CisJCQorCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhGMDAzLCAmcHBwX3VkcF9wa3QtPmRhdGEsIAorCQkJCQltYm94LT5jbWQubGVuZ3RoKTsKKwkgICAgICAgIAorCQkJLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMHgwOTsKKworCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDB4MDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQkvKiBQUElQRV9GVDFfUkVBRF9TVEFUVVMgKi8KKwkJY2FzZSBQUElQRV9GVDFfUkVBRF9TVEFUVVM6CisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCAweEYwMjAsICZwcHBfdWRwX3BrdC0+ZGF0YVswXSwgMik7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSAyOworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCQorCQljYXNlIFBQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUzogICAKKwkJCWluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdl9hcmVhICk7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBjYXJkICk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCQorCQljYXNlIFBQSVBFX1JPVVRFUl9VUF9USU1FOgorCisJCQlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCQkJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWUgPSB0di50dl9zZWMgLSAKKwkJCQkJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWU7CisJCQkqKHVuc2lnbmVkIGxvbmcgKikmcHBwX3VkcF9wa3QtPmRhdGEgPSBwcHBfcHJpdl9hcmVhLT5yb3V0ZXJfdXBfdGltZTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSA0OworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisKKwkJCQkvKiBQUElQRV9EUklWRVJfU1RBVElTVElDUyAqLyAgIAorCQljYXNlIFBQSVBFX0RSSVZFUl9TVEFUX0lGU0VORDoKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGEsICZwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQsIAorCQkJCXNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworCisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoaWZfc2VuZF9zdGF0X3QpOwkKKwkJCWJyZWFrOworCisJCWNhc2UgUFBJUEVfRFJJVkVSX1NUQVRfSU5UUjoKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGEsICZjYXJkLT5zdGF0aXN0aWNzLCAKKwkJCQlzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKKworCQkJbWVtY3B5KCZwcHBfdWRwX3BrdC0+ZGF0YStzaXplb2YoZ2xvYmFsX3N0YXRzX3QpLAorCQkJCSZwcHBfcHJpdl9hcmVhLT5yeF9pbnRyX3N0YXQsCisJCQkJc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKwkJCQkJCSAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBJUEVfRFJJVkVSX1NUQVRfR0VOOgorCQkJbWVtY3B5KCAmcHBwX3VkcF9wa3QtPmRhdGEsCisJCQkJJnBwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LAorCQkJCXNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7CisKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGErc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpLCAKKwkJCSAgICAgICAmY2FyZC0+c3RhdGlzdGljcywgc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7CisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKwkJCQkJCSAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKwkJCWJyZWFrOworCisKKwkJLyogRlQxIE1PTklUT1IgU1RBVFVTICovCisgICAJCWNhc2UgRlQxX01PTklUT1JfU1RBVFVTX0NUUkw6CisJCisJCQkvKiBFbmFibGUgRlQxIE1PTklUT1IgU1RBVFVTICovCisJICAgICAgICAJaWYoIHBwcF91ZHBfcGt0LT5kYXRhWzBdID09IDEpIHsKKwkJCQorCQkJCWlmKCByQ291bnQrKyAhPSAwICkgeworCQkgICAgICAgIAkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCSAgICAgICAgICAJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJICAJCQlicmVhazsKKwkJICAgIAkJfQkKKwkgICAgICAJCX0KKworCSAgICAgIAkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAJCWlmKCBwcHBfdWRwX3BrdC0+ZGF0YVswXSA9PSAwKSB7CisKKwkgICAgICAJICAgCQlpZiggLS1yQ291bnQgIT0gMCkgeworCQkgIAkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJICAJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJICAJCQlicmVhazsKKwkgICAJICAgIAkJfSAKKwkgICAgICAJCX0gCQorCQkJZ290byB1ZHBfZGZsdF9jbWQ7CisJCQkKKwkJLyogV0FSTklORzogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkLgorCQkgKiBUaGUgRlQxIFN0YXR1cyBDdHJsIGRvZXNuJ3QgaGF2ZSBhIGJyZWFrCisgICAgICAgICAgICAgICAgICogc3RhdG1lbnQuICBUaHVzLCBubyBjb2RlIG11c3QgYmUgaW5zZXJ0ZWQKKyAgICAgICAgICAgICAgICAgKiBIRVJFOiBiZXR3ZWVuIGRlZmF1bHQgYW5kIGFib3ZlIGNhc2Ugc3RhdGVtZW50ICovCisKKwkJZGVmYXVsdDoKK3VkcF9kZmx0X2NtZDoKKwkgICAgICAgIAorCQkJLyogaXQncyBhIGJvYXJkIGNvbW1hbmQgKi8KKwkJCW1ib3gtPmNtZC5jb21tYW5kID0gcHBwX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IHBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoOworIAorCQkJaWYobWJveC0+Y21kLmxlbmd0aCkgeworCQkJCW1lbWNweSgmbWJveC0+ZGF0YSwodW5zaWduZWQgY2hhciAqKXBwcF91ZHBfcGt0LT5kYXRhLAorCQkJCSAgICAgICBtYm94LT5jbWQubGVuZ3RoKTsKKwkgICAgICAJCX0gCisJICAgICAgICAgIAorCQkJLyogcnVuIHRoZSBjb21tYW5kIG9uIHRoZSBib2FyZCAqLworCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkKKwkJCWlmIChlcnIgIT0gQ01EX09LKSB7CisJCQorCQkgICAgCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYm94KTsKKwkJICAgIAkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC4KKwkJCQkJIFVEUF9QSVBFX21nbXRfYWRwdHJfY21uZF90aW1lb3V0OworCQkJCWJyZWFrOworCQkJfQorCSAgICAgICAgICAKKwkJICAJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0s7CisJCQorCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCQkJbWVtY3B5KCZwcHBfdWRwX3BrdC0+Y2Jsb2NrLG1ib3gsIHNpemVvZihjYmxvY2tfdCkpOworCSAgICAgICAgICAKKwkJCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKwkJCQltZW1jcHkoJnBwcF91ZHBfcGt0LT5kYXRhLCZtYm94LT5kYXRhLG1ib3gtPmNtZC5sZW5ndGgpOworCQkJfSAKKworCQl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgCX0gLyogZW5kIG9mIGVsc2UgKi8KKworICAgICAJLyogRmlsbCBVRFAgVFRMICovCisgICAgIAlwcHBfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7IAorICAgICAJbGVuID0gcmVwbHlfdWRwKHBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisKKyAgICAgCWlmIChwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgYWxyZWFkeSBzZW5kaW5nICovCisJCWlmICghdGVzdF9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fYWRwdHI7CisJCQlwcHBfc2VuZChjYXJkLHBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSxsZW4scHBwX3ByaXZfYXJlYS0+cHJvdG9jb2wpOworCQl9CisKKwl9IGVsc2UgewkKKwkKKwkJLyogUGFzcyBpdCB1cCB0aGUgc3RhY2sKKyAgICAJCSAgIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJaWYgKChuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSAhPSBOVUxMKSB7CisJICAgIAkKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworICAJICAgIAkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCBsZW4pOworICAJICAgIAkJbWVtY3B5KGJ1ZixwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbik7CisKKwkgICAgCQkrK3BwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfcGFzc2VkX3RvX3N0YWNrOworCQkJCisgICAgICAgICAgICAJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgCisJCQkgICBzdGFjayAqLworCSAgICAJCW5ld19za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworICAgICAgICAgICAgCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJICAgIAkJbmV3X3NrYi0+bWFjLnJhdyAgPSBuZXdfc2tiLT5kYXRhOworCQkJbmV0aWZfcngobmV3X3NrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkKKwkJfSBlbHNlIHsKKwkgICAgCQorCQkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X25vX3NvY2tldDsKKwkJCXByaW50ayhLRVJOX0lORk8gIm5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIpOworICAJCX0KKyAgICAJfQkKKworCXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisJCisJcmV0dXJuOyAKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbCB0aGUgcHBwX3ByaXZhdGVfYXJlYSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgKQoreworCisJbWVtc2V0KCZwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQsIDAsIHNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworCW1lbXNldCgmcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LCAwLCBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKwltZW1zZXQoJnBwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LCAwLCBzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOwkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIEdsb2JhbCBTdGF0aXN0aWNzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIHNkbGFfdCAqY2FyZCApCit7CisJbWVtc2V0KCZjYXJkLT5zdGF0aXN0aWNzLCAwLCBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFJlY2VpdmUgYW5kIFRyYW5zbWl0IEJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcHBwX3R4X3J4X2J1ZmYoIHNkbGFfdCAqY2FyZCApCit7CisJcHBwNTA4X2J1Zl9pbmZvX3QqIGluZm87CisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpIHsKKwkJCisJCWluZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBQUFA1MTRfQlVGX09GRlMpOworCisgICAgICAgCQljYXJkLT51LnAudHhidWZfYmFzZSA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCQlpbmZvLT50eGJfcHRyKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUucC50eGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC50eGJ1Zl9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLT50eGJfbnVtIC0gMSk7CisKKyAgICAgICAgICAgICAgICBjYXJkLT51LnAucnhidWZfYmFzZSA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yeGJfcHRyKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUucC5yeGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC5yeGJ1Zl9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLT5yeGJfbnVtIC0gMSk7CisKKwl9IGVsc2UgeworCQkKKwkJaW5mbyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9CVUZfT0ZGUyk7CisKKwkJY2FyZC0+dS5wLnR4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKGluZm8tPnR4Yl9wdHIgLSBQUFA1MDhfTUJfVkVDVCkpOworCisJCWNhcmQtPnUucC50eGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC50eGJ1Zl9iYXNlICsKKwkJCShpbmZvLT50eGJfbnVtIC0gMSk7CisKKwkJY2FyZC0+dS5wLnJ4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKGluZm8tPnJ4Yl9wdHIgLSBQUFA1MDhfTUJfVkVDVCkpOworCisJCWNhcmQtPnUucC5yeGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC5yeGJ1Zl9iYXNlICsKKwkJCShpbmZvLT5yeGJfbnVtIC0gMSk7CisJfQorCisJY2FyZC0+dS5wLnR4YnVmX25leHQgPSAodW5zaWduZWQgbG9uZyopJmluZm8tPnR4Yl9ueHQ7IAorCWNhcmQtPnUucC5yeGJ1Zl9uZXh0ID0gKHVuc2lnbmVkIGxvbmcqKSZpbmZvLT5yeGIxX3B0cjsKKworCWNhcmQtPnUucC5yeF9iYXNlID0gaW5mby0+cnhiX2Jhc2U7CisgICAgICAgIGNhcmQtPnUucC5yeF90b3AgID0gaW5mby0+cnhiX2VuZDsKKyAgICAgIAorCWNhcmQtPnUucC50eGJ1ZiA9IGNhcmQtPnUucC50eGJ1Zl9iYXNlOworCWNhcmQtPnJ4bWIgPSBjYXJkLT51LnAucnhidWZfYmFzZTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIENvbm5lY3Rpb24gSW5mb3JtYXRpb24gKGllIGZvciBSZW1vdGUgSVAgYWRkcmVzcyBhc3NnaW5tZW50KS4KKyAqIENhbGxlZCB3aGVuIHBwcCBpbnRlcmZhY2UgY29ubmVjdGVkLgorICovCitzdGF0aWMgaW50IHJlYWRfaW5mbyggc2RsYV90ICpjYXJkICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCXN0cnVjdCBpZnJlcSBpZl9pbmZvOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaWZfZGF0YTEsICppZl9kYXRhMjsKKwltbV9zZWdtZW50X3QgZnM7CisKKwkvKiBTZXQgTG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzZXMgKi8KKwltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCisJLyogQ2hhbmdlIHRoZSBsb2NhbCBhbmQgcmVtb3RlIGlwIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4KKwkgKiBUaGlzIHdpbGwgYWxzbyBhZGQgaW4gdGhlIGRlc3RpbmF0aW9uIHJvdXRlLgorCSAqLwkKKwlpZl9kYXRhMSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfYWRkcjsKKwlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWw7CisJaWZfZGF0YTEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZBRERSLCAmaWZfaW5mbyApOworCWlmX2RhdGEyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9kc3RhZGRyOworCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGU7CisJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJc2V0X2ZzKGZzKTsgICAgICAgICAgIC8qIHJlc3RvcmUgb2xkIGJsb2NrICovCisJCisJaWYgKGVycikgeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEFkZGluZyBvZiByb3V0ZSBmYWlsZWQ6ICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6CUxvY2FsIDogJXUuJXUuJXUuJXVcbiIsCisJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwpKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOglSZW1vdGU6ICV1LiV1LiV1LiV1XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSkpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZW1vdmUgRHluYW1pYyBSb3V0ZS4KKyAqIENhbGxlZCB3aGVuIHBwcCBpbnRlcmZhY2UgZGlzY29ubmVjdGVkLgorICovCisKK3N0YXRpYyB2b2lkIHJlbW92ZV9yb3V0ZSggc2RsYV90ICpjYXJkICkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWxvbmcgaXBfYWRkcjsKKwlpbnQgZXJyOworCisgICAgICAgIG1tX3NlZ21lbnRfdCBmczsKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlmX2RhdGExOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKyAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsJCisKKwlpcF9hZGRyID0gaWZhLT5pZmFfbG9jYWw7CisKKwkvKiBTZXQgTG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzZXMgKi8KKwltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKwlmcyA9IGdldF9mcygpOworICAgICAgIAlzZXRfZnMoZ2V0X2RzKCkpOyAgICAgLyogZ2V0IHVzZXIgc3BhY2UgYmxvY2sgKi8gCisKKwkvKiBDaGFuZ2UgdGhlIGxvY2FsIGlwIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB0byAwLgorCSAqIFRoaXMgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcm91dGUuCisJICovCQorCWlmX2RhdGExID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9hZGRyOworCWlmX2RhdGExLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGQUREUiwgJmlmX2luZm8gKTsKKworICAgICAgICBzZXRfZnMoZnMpOyAgICAgICAgICAgLyogcmVzdG9yZSBvbGQgYmxvY2sgKi8KKworCQorCWlmIChlcnIpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBEZWxldGluZyBkeW5hbWljIHJvdXRlIGZhaWxlZCAlZCFcbiIsCisJCQkgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJcmV0dXJuOworCX1lbHNleworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFBQUCBEZWxldGluZyBkeW5hbWljIHJvdXRlICV1LiV1LiV1LiV1IHN1Y2Nlc3NmdWx5XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChpcF9hZGRyKSk7CisJfQorCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSB0aGUgSW50ZXJydXB0IFRlc3QgYnkgcnVubmluZyB0aGUgUkVBRF9DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUgorICogX1RFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCAqY2FyZCApCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworCWVyciA9IHBwcF9zZXRfaW50cl9tb2RlKCBjYXJkLCAweDA4ICk7CisJCisJaWYgKGVyciA9PSBDTURfT0spIHsgCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSOyBpICsrKSB7CQorCQkJLyogUnVuIGNvbW1hbmQgUkVBRF9DT0RFX1ZFUlNJT04gKi8KKwkJCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCQkJbWItPmNtZC5sZW5ndGggID0gMDsKKwkJCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9SRUFEX0NPREVfVkVSU0lPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDTURfT0spIAorCQkJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkJfQorCX0KKwllbHNlIHJldHVybiBlcnI7CisKKwllcnIgPSBwcHBfc2V0X2ludHJfbW9kZSggY2FyZCwgMCApOworCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gRFJWU1RBVFMgb3IgUFRQSVBFQUIgPworICovCitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2RsYV90ICpjYXJkICkKK3sKKwl1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0OworCXVuc2lnbmVkIGNoYXIgYnVmMls1XTsgCisJcHBwX3VkcF9wa3RfdCAqcHBwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsgCisJCisJc2VuZHBhY2tldCA9IHNrYi0+ZGF0YTsKKwltZW1jcHkoJmJ1ZjIsICZjYXJkLT53YW5kZXYudWRwX3BvcnQsIDIpOworCQorCWlmKCAJcHBwX3VkcF9wa3QtPmlwX3BrdC52ZXJfaW5ldF9oZHJfbGVuZ3RoICA9PSAweDQ1ICYmICAgICAgICAvKiBJUCBwYWNrZXQgKi8gCisJCXNlbmRwYWNrZXRbOV0gID09IDB4MTEgJiYgICAgICAgIC8qIFVEUCBwYWNrZXQgKi8KKwkJc2VuZHBhY2tldFsyMl0gPT0gYnVmMlsxXSAmJiAgICAgLyogVURQIFBvcnQgKi8KKwkJc2VuZHBhY2tldFsyM10gPT0gYnVmMlswXSAmJgorCQlzZW5kcGFja2V0WzM2XSA9PSAweDAxICkgeworCQorCQlpZiAoICAgIHNlbmRwYWNrZXRbMjhdID09IDB4NTAgJiYgICAgLyogUFRQSVBFQUI6IFNpZ25hdHVyZSAqLyAKKwkJCXNlbmRwYWNrZXRbMjldID09IDB4NTQgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzBdID09IDB4NTAgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzFdID09IDB4NDkgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzJdID09IDB4NTAgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzNdID09IDB4NDUgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzRdID09IDB4NDEgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzVdID09IDB4NDIgKXsgCisKKwkJCXJldHVybiBVRFBfUFRQSVBFX1RZUEU7CisJCisJCX0gZWxzZSBpZihzZW5kcGFja2V0WzI4XSA9PSAweDQ0ICYmICAvKiBEUlZTVEFUUzogU2lnbmF0dXJlICovCisJCQlzZW5kcGFja2V0WzI5XSA9PSAweDUyICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMwXSA9PSAweDU2ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMxXSA9PSAweDUzICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMyXSA9PSAweDU0ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMzXSA9PSAweDQxICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzM0XSA9PSAweDU0ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzM1XSA9PSAweDUzICl7CisJCisJCQlyZXR1cm4gVURQX0RSVlNUQVRTX1RZUEU7CisKKwkJfSBlbHNlCisJCQlyZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKKworCX0gZWxzZQorCQlyZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRvIHNlZSBpZiB0aGUgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIGNvbnRhaW5zIGEgYnJvYWRjYXN0IG9yCisgKiBtdWx0aWNhc3Qgc291cmNlIElQIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgc3JjX2lwX2FkZHI7CisgICAgICAgIHUzMiBicm9hZGNhc3RfaXBfYWRkciA9IDA7CisgICAgICAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworICAgICAgICAvKiByZWFkIHRoZSBJUCBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBvdXRnb2luZyBwYWNrZXQgKi8KKyAgICAgICAgc3JjX2lwX2FkZHIgPSAqKHUzMiAqKShza2ItPmRhdGEgKyAxMik7CisKKwkvKiByZWFkIHRoZSBJUCBicm9hZGNhc3QgYWRkcmVzcyBmb3IgdGhlIGRldmljZSAqLworICAgICAgICBpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKyAgICAgICAgaWYoaW5fZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5faWZhZGRyICppZmE9IGluX2Rldi0+aWZhX2xpc3Q7CisgICAgICAgICAgICAgICAgaWYoaWZhICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RfaXBfYWRkciA9IGlmYS0+aWZhX2Jyb2FkY2FzdDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorIAorICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBCcm9hZGNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpICYmIChzcmNfaXBfYWRkciA9PSBicm9hZGNhc3RfaXBfYWRkcikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQnJvYWRjYXN0IFNvdXJjZSBBZGRyZXNzIHNpbGVudGx5IGRpc2NhcmRlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSAKKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBNdWx0aWNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigobnRvaGwoc3JjX2lwX2FkZHIpID49IDB4RTAwMDAwMDEpICYmCisJCShudG9obChzcmNfaXBfYWRkcikgPD0gMHhGRkZGRkZGRSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogTXVsdGljYXN0IFNvdXJjZSBBZGRyZXNzIHNpbGVudGx5IGRpc2NhcmRlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKwordm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKworc3RhdGljIGludCByZWFkX2Nvbm5lY3Rpb25faW5mbyAoc2RsYV90ICpjYXJkKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJcHBwNTA4X2Nvbm5lY3RfaW5mb190ICpwcHA1MDhfY29ubmVjdF9pbmZvOworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmxlbmd0aCAgPSAwOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9HRVRfQ09OTkVDVElPTl9JTkZPOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0spIHsgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlID0gMDsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwgPSAwOworCX0KKwllbHNlIHsKKwkJcHBwNTA4X2Nvbm5lY3RfaW5mbyA9IChwcHA1MDhfY29ubmVjdF9pbmZvX3QgKiltYi0+ZGF0YTsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlID0gcHBwNTA4X2Nvbm5lY3RfaW5mby0+aXBfcmVtb3RlOworCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCA9IHBwcDUwOF9jb25uZWN0X2luZm8tPmlwX2xvY2FsOworCisJCU5FWF9QUklOVEsoS0VSTl9JTkZPICJSRUFEIENPTk5FQ1RJT04gR09UIElQIEFERFJFU1MgJXgsICV4XG4iLAorCQkJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSwKKwkJCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfcHBwCisgKgorICoJQ29uZmlndXJlIHRoZSBwcHAgcHJvdG9jb2wgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4JCQorICoKKyAqICAgCVRoZSBpZl9vcGVuIGZ1bmN0aW9uIGJpbmRzIHRoaXMgZnVuY3Rpb24gdG8gdGhlIHBvbGwgcm91dGluZS4KKyAqICAgICAgVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcnVuIGV2ZXJ5IHRpbWUgdGhlIHBwcCBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gIAorICogICAgICAKKyAqCUlmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgbm90IGVuYWJsZWQsIHByb2NlZWQgdG8gY29uZmlndXJlCisgKiAgICAgIHRoZSBjYXJkIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMuCisgKgorICogICAgICBJZiB0aGUgY29tbXVuaWNhdGlvbnMgYXJlIGVuYWJsZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGludGVyZmFjZQorICogICAgICB3YXMgc2h1dGRvd24gYnkgZXRoZXIgdGhlIHVzZXIgb3IgZHJpdmVyLiBJbiB0aGlzIGNhc2UsIHdlIAorICogICAgICBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIElQIGFkZHJlc3NlcyBoYXZlIG5vdCBjaGFuZ2VkLiAgSWYKKyAqICAgICAgdGhlIElQIGFkZHJlc3NlcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29uZmlndXJlIHRoZSBmaXJtd2FyZQorICogICAgICBhbmQgdXBkYXRlIHRoZSBjaGFuZ2VkIElQIGFkZHJlc3Nlcy4gIE90aGVyd2lzZSwganVzdCBleGl0LgorICovCitzdGF0aWMgaW50IGNvbmZpZ19wcHAgKHNkbGFfdCAqY2FyZCkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChjYXJkLT51LnAuY29tbV9lbmFibGVkKXsKKworCQlpZiAocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICE9IHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsIHx8CisJCSAgICBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wICE9IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSl7CisJCQkKKwkJCS8qIFRoZSBJUCBhZGRlcnNzZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIHRoZSBjb21tdW5pY2F0aW9ucyBhbmQgcmVjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjYXJkLiBSZWFzb246IHRoZSBmaXJtd2FyZSBtdXN0IGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2NhbCBhbmQgcmVtb3RlIElQIGFkZHJlc3Nlcy4gKi8KKwkJCWRpc2FibGVfY29tbShjYXJkKTsKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IElQIGFkZHJlc3NlcyBjaGFuZ2VkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzdGFydGluZyBjb21tdW5pY2F0aW9ucyAuLi5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZXsgCisJCQkvKiBJUCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgbGluayBpcyB1cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZXJlZm9yZSwgZXhpdCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBSZWNvcmQgdGhlIG5ldyBJUCBhZGRyZXNlcyAqLworCXBwcF9wcml2X2FyZWEtPmlwX2xvY2FsID0gcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wOworCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSA9IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXA7CisKKwlpZiAoY29uZmlnNTA4KGRldiwgY2FyZCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBQUFAgZGV2aWNlXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcHBfc2V0X2ludHJfbW9kZShjYXJkLCBQUFBfSU5UUl9SWFJEWXwKKwkJCSAgICAJCVBQUF9JTlRSX1RYUkRZfAorCQkJCSAgICAJUFBQX0lOVFJfTU9ERU18CisJCQkJICAgIAlQUFBfSU5UUl9ESVNDIHwKKwkJCQkgICAgCVBQUF9JTlRSX09QRU4gfAorCQkJCSAgICAJUFBQX0lOVFJfRFJPUF9EVFIgfAorCQkJCQlQUFBfSU5UUl9USU1FUikpIHsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBib2FyZCBpbnRlcnJ1cHRzICFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICAvKiBUdXJuIG9mZiB0aGUgdHJhbnNtaXQgYW5kIHRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbWFzayAmPSB+KFBQUF9JTlRSX1RYUkRZIHwgUFBQX0lOVFJfVElNRVIpIDsKKworCisJLyogSWYgeW91IGFyZSBub3QgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIGFueSBvbmUgb2YgdGhlIHByb3RvY29sIGlzIAorCSAqIGVuYWJsZWQgdGhlbiB3ZSBjYWxsIHRoZSBzZXRfb3V0X2JvdW5kX2F1dGhlbnRpY2F0aW9uLgorCSAqLworCWlmICggIWNhcmQtPnUucC5hdXRoZW50aWNhdG9yICAmJiAocHBwX3ByaXZfYXJlYS0+cGFwIHx8IHBwcF9wcml2X2FyZWEtPmNoYXApKSB7CisJCWlmICggcHBwX3NldF9vdXRibmRfYXV0aChjYXJkLCBwcHBfcHJpdl9hcmVhKSApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE91dGJvdW5kIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IAorCQorCS8qIElmIHlvdSBhcmUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIGFueSBvbmUgb2YgdGhlIHByb3RvY29sIGlzIGVuYWJsZWQKKwkgKiB0aGVuIHdlIGNhbGwgdGhlIHNldF9pbl9ib3VuZF9hdXRoZW50aWNhdGlvbi4KKwkgKi8KKwlpZiAoY2FyZC0+dS5wLmF1dGhlbnRpY2F0b3IgJiYgKHBwcF9wcml2X2FyZWEtPnBhcCB8fCBwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWlmIChwcHBfc2V0X2luYm5kX2F1dGgoY2FyZCwgcHBwX3ByaXZfYXJlYSkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluYm91bmQgYXV0aGVudGljYXRpb24gZmFpbGVkICFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CQorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBmYWlsIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBoZXJlIGl0J3MgT0ssCisJICogc2luY2UgdGhlIERUUiB0aW1lciB3aWxsIGNhdXNlIGEgZGlzY29ubmVjdGVkLCB3aGljaAorCSAqIHdpbGwgcmV0cmlnZ2VyIGNvbW11bmljYXRpb24gaW4gdGltZXJfaW50cigpICovCisJaWYgKHBwcF9jb21tX2VuYWJsZShjYXJkKSA9PSBDTURfT0spIHsKKwkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCQlpbml0X3BwcF90eF9yeF9idWZmKGNhcmQpOworCX0KKworCXJldHVybiAwOyAKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHBwcF9wb2xsCisgKgkKKyAqIFJhdGlvbmFsZToKKyAqIAlXZSBjYW5ub3QgbWFuaXB1bGF0ZSB0aGUgcm91dGluZyB0YWJsZXMsIG9yCisgKiAgICAgIGlwIGFkZHJlc3NlcyB3aXRoaW5nIHRoZSBpbnRlcnJ1cHQuIFRoZXJlZm9yZQorICogICAgICB3ZSBtdXN0IHBlcmZvcm0gc3VjaCBhY3RvbnMgb3V0c2lkZSBhbiBpbnRlcnJ1cHQgCisgKiAgICAgIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogRGVzY3JpcHRpb246CQorICoJUFBQIHBvbGxpbmcgcm91dGluZSwgcmVzcG9uc2libGUgZm9yIAorICogICAgIAlzaHV0dGluZyBkb3duIGludGVyZmFjZXMgdXBvbiBkaXNjb25uZWN0CisgKiAgICAgCWFuZCBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzLiAKKyAqICAgICAgCisgKiBVc2FnZTogICAgICAgIAorICogCVRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggcHBwICAKKyAqIAlpbnRlcmZhY2UgdGhyb3VnaCBhIHRxX3NjaGVkdWxlIGJvdHRvbSBoYWxmLgorICogICAgICAKKyAqICAgICAgdHJpZ2dlcl9wcHBfcG9sbCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8ga2ljaworICogICAgICB0aGUgcHBwX3BvbGwgcm91dGluZS4gIAorICovCitzdGF0aWMgdm9pZCBwcHBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsgCQorCXNkbGFfdCAqY2FyZDsKKwl1OCBjaGVja19nYXRld2F5PTA7CisJcHBwX2ZsYWdzX3QgKmZsYWdzOworCisJaWYgKCFkZXYgfHwgKHBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBTaHV0ZG93biBpcyBpbiBwcm9ncmVzcywgc3RvcCB3aGF0IHlvdSBhcmUgCisJICogZG9pbmcgYW5kIGdldCBvdXQgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmX29wZW4oKSBmdW5jdGlvbiBoYXMgdHJpZ2dlcmVkIHRoZSBwb2xsaW5nIHJvdXRpbmUKKwkgKiB0byBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyZWQgSVAgYWRkcmVzc2VzLiAgT25jZSB0aGUKKwkgKiBhZGRyZXNzZXMgYXJlIGZvdW5kLCB0cmlnZ2VyIHRoZSBjaGRsYyBjb25maWd1cmF0aW9uICovCisJaWYgKHRlc3RfYml0KDAsJnBwcF9wcml2X2FyZWEtPmNvbmZpZ19wcHApKXsKKworCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXAgID0gZ2V0X2lwX2FkZHJlc3MoZGV2LFdBTl9MT0NBTF9JUCk7CisJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsKKworCQlpZiAocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wID09IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgJiYgCisJICAgICAgICAgICAgY2FyZC0+dS5wLmlwX21vZGUgPT0gV0FOT1BUX1BQUF9IT1NUKXsKKwkJCQorCQkJaWYgKCsrcHBwX3ByaXZfYXJlYS0+aXBfZXJyb3IgPiBNQVhfSVBfRVJST1JTKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJcbiVzOiAtLS0gV0FSTklORyAtLS1cbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIGxvY2FsIElQIGFkZHJlc3MgaXMgdGhlIHNhbWUgYXMgdGhlXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBvaW50LXRvLVBvaW50IElQIGFkZHJlc3MuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IC0tLSBXQVJOSU5HIC0tLVxuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9ZWxzZXsKKwkJCQljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJCXBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrSFo7CisJCQkJYWRkX3RpbWVyKCZwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CQorCQlwcHBfcHJpdl9hcmVhLT5pcF9lcnJvcj0wOwkKKwkJCisJCWNsZWFyX2JpdCgwLCZwcHBfcHJpdl9hcmVhLT5jb25maWdfcHBwKTsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIER5bmFtaWMgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCBhcyB3ZWxsIGFzIGR5bmFtaWMKKwkgKiByb3V0aW5nLiAgKi8KKwkKKwlzd2l0Y2ggKGNhcmQtPndhbmRldi5zdGF0ZSkgeworCQorCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKworCQkvKiBJZiB0aGUgZHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBpcyBvbiwgYW5kIGludGVyZmFjZSAKKwkJICogaXMgdXAsIHRoZW4gYnJpbmcgZG93biB0aGUgbmV0b3dyayBpbnRlcmZhY2UgKi8KKworCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisJCSAgICAhdGVzdF9iaXQoREVWX0RPV04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKQkmJgkKKwkJICAgIGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQKXsJCisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwKKwkJCQkJKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzJn5JRkZfVVApKTsKKwkJCXNldF9iaXQoREVWX0RPV04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJfWVsc2V7CisJCQkvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBsb2NhbCBJUCBhZGRyZXNzIGlzCisgICAgICAgICAgICAgICAJICAgCSAqIHplcm8uIElmIGl0IGlzLCB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdC4KKyAgICAgICAgICAgICAgICAgCSAqIEZvciBzb21lIHJlYXNvbiB0aGUga2VybmVsIGNyYXNoZXMgYmFkbHkgaWYgCisgICAgICAgICAgICAgICAgIAkgKiB3ZSB0cnkgdG8gcmVtb3ZlIHRoZSByb3V0ZSB0d2ljZSAqLworCisJCQlpZiAoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYgCisJCSAgICAJICAgIGdldF9pcF9hZGRyZXNzKGNhcmQtPndhbmRldi5kZXYsV0FOX0xPQ0FMX0lQKSAmJgorCQkgICAgCSAgICBjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpeworCisJCQkJcmVtb3ZlX3JvdXRlKGNhcmQpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkKKwkJLyogSW4gU01QIG1hY2hpbmUgdGhpcyBjb2RlIGNhbiBleGVjdXRlIGJlZm9yZSB0aGUgaW50ZXJmYWNlCisJCSAqIGNvbWVzIHVwLiAgSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdAorCQkgKiB0cnkgdG8gYnJpbmcgdXAgdGhlIGludGVyZmFjZSBiZWZvcmUgZGV2X29wZW4oKSBpcyBmaW5pc2hlZCAqLworCisKKwkJLyogREVWX0RPV04gd2lsbCBiZSBzZXQgb25seSB3aGVuIHdlIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZQorCQkgKiBmb3IgdGhlIHZlcnkgZmlyc3QgdGltZS4gVGhpcyB3YXkgd2Uga25vdyB0aGF0IGl0IHdhcyB1cworCQkgKiB0aGF0IGJyb3VnaHQgdGhlIGludGVyZmFjZSBkb3duICovCisJCQorCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisJICAgICAgICAgICAgdGVzdF9iaXQoREVWX0RPV04sICAmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisgCQkgICAgIShjYXJkLT53YW5kZXYuZGV2LT5mbGFncyAmIElGRl9VUCkpeworCQkJCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIHVwLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGNhcmQtPndhbmRldi5kZXYtPm5hbWUpOworCQkJCisJCQljaGFuZ2VfZGV2X2ZsYWdzKGNhcmQtPndhbmRldi5kZXYsKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzfElGRl9VUCkpOworCQkJY2xlYXJfYml0KERFVl9ET1dOLCZwcHBfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGVja19nYXRld2F5PTE7CisJCX0KKworCQlpZiAoKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYgCisJCSAgICB0ZXN0X2JpdCgxLCZSZWFkX2Nvbm5lY3Rpb25faW5mbykpIHsgCisJCQkKKwkJCXByb2Nlc3Nfcm91dGUoY2FyZCk7CisJCQljbGVhcl9iaXQoMSwmUmVhZF9jb25uZWN0aW9uX2luZm8pOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKHBwcF9wcml2X2FyZWEtPmdhdGV3YXkgJiYgY2hlY2tfZ2F0ZXdheSkKKwkJCWFkZF9nYXRld2F5KGNhcmQsZGV2KTsKKworCQlicmVhazsKKwl9CisJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0cmlnZ2VyX3BwcF9wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgcHBwX3BvbGwoKSB0YXNrIGludG8gYSB0cV9zY2hlZHVsZXIgYmggaGFuZGxlcgorICogICAgICBmb3IgYSBzcGVjaWZpYyBpbnRlcmZhY2UuICBUaGlzIHdpbGwga2ljaworICogICAgICB0aGUgcHBwX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9wcHBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsKKwlpZiAoKHBwcF9wcml2X2FyZWE9ZGV2LT5wcml2KSAhPSBOVUxMKXsgCQorCQkKKwkJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKworCQlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCXJldHVybjsKKwkJfQorCisJCXNjaGVkdWxlX3dvcmsoJnBwcF9wcml2X2FyZWEtPnBvbGxfd29yayk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcHBwX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X3B0cjsKKwl0cmlnZ2VyX3BwcF9wb2xsKGRldik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBkZXRlY3RfYW5kX2ZpeF90eF9idWcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU9uIGNvbm5lY3QsIGlmIHRoZSBib2FyZCB0eCBidWZmZXIgcHRyIGlzIG5vdCB0aGUgc2FtZQorICogICAgICBhcyB0aGUgZHJpdmVyIHR4IGJ1ZmZlciBwdHIsIHdlIGZvdW5kIGEgZmlybXdhcmUgYnVnLgorICogICAgICBSZXBvcnQgdGhlIGJ1ZyB0byB0aGUgYWJvdmUgbGF5ZXIuICBUbyBmaXggdGhlCisgKiAgICAgIGVycm9yIHJlc3RhcnQgY29tbXVuaWNhdGlvbnMgYWdhaW4uCisgKgorICogVXNhZ2U6CisgKgorICovCQorCitzdGF0aWMgaW50IGRldGVjdF9hbmRfZml4X3R4X2J1ZyAoc2RsYV90ICpjYXJkKQoreworCWlmICgoKHVuc2lnbmVkIGxvbmcpY2FyZC0+dS5wLnR4YnVmX2Jhc2UmMHhGRkYpICE9ICgoKmNhcmQtPnUucC50eGJ1Zl9uZXh0KSYweEZGRikpeworCQlORVhfUFJJTlRLKEtFUk5fSU5GTyAiTWFqb3IgRXJyb3IsIEZpeCB0aGUgYnVnXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV94MjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkzZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMKQEAgLTAsMCArMSw1NDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV94MjUuYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gIFguMjUgbW9kdWxlLgorKgorKiBBdXRob3I6CU5lbmFkIENvcmJpYwk8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogQXByIDAzLCAyMDAxICBOZW5hZCBDb3JiaWMJIG8gRml4ZWQgdGhlIHJ4X3NrYj1OVUxMIGJ1ZyBpbiB4MjUgaW4gcnhfaW50cigpLgorKiBEZWMgMjYsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBBZGRlZCBhIG5ldyBwb2xsaW5nIHJvdXRpbmUsIHRoYXQgdXNlcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGtlcm5lbCB0aW1lciAobW9yZSBlZmZpY2llbnQpLgorKiBEZWMgMjUsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBVcGRhdGVkIGZvciAyLjQuWCBrZXJuZWwKKyogSnVsIDI2LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gSW5jcmVhc2VkIHRoZSBsb2NhbCBwYWNrZXQgYnVmZmVyaW5nCisqIAkJCQkgICBmb3IgQVBJIHRvIDQwOTYraGVhZGVyX3NpemUuIAorKiBKdWwgMTcsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBGaXhlZCB0aGUgeDI1IHN0YXJ0dXAgYnVnLiBFbmFibGUgCisqIAkJCQkgICBjb21tdW5pY2F0aW9ucyBvbmx5IGFmdGVyIGFsbCBpbnRlcmZhY2VzCisqIAkJCQkgICBjb21lIHVwLiAgSElHSCBTVkMvUFZDIGlzIHVzZWQgdG8gY2FsY3VsYXRlCisqIAkJCQkgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgcHJvdG9jb2wgb25seSBhZnRlciBhbGwgaW50ZXJmYWNlcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KKyogSnVsIDEwLCAyMDAwCU5lbmFkIENvcmJpYwkgbyBGaXhlZCB0aGUgTV9CSVQgYnVnLiAKKyogQXByIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gUGFzcyBNb2RlbSBtZXNzYWdlcyB0byB0aGUgQVBJLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIGlkbGUgdGltZW91dCBpbiBYMjUgQVBJLgorKiBBcHIgMTQsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBGaXhlZDogTGFyZ2UgTENOIG51bWJlciBzdXBwb3J0LgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIExDTiBudW1iZXIgaXMgNDA5NS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgWDI1IGNoYW5uZWxzIGlzIDI1NS4KKyogQXByIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQWRkZWQgU01QIFN1cHBvcnQuCisqIE1hciAyOSwgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEFkZGVkIHN1cHBvcnQgZm9yIFM1MTQgUENJIENhcmQKKyogTWFyIDIzLCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gSW1wcm92ZWQgdGFzayBxdWV1ZSwgQkggaGFuZGxpbmcuCisqIE1hciAxNCwgMjAwMCAgTmVuYWQgQ29yYmljICAJIG8gVXBkYXRlZCBQcm90b2NvbCBWaW9sYXRpb24gaGFuZGxpbmcKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZXMuICBCdWcgRml4LgorKiBNYXIgMTAsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBCdWcgRml4OiBjb3JydXB0ZWQgbWJveCByZWNvdmVyeS4KKyogTWFyIDA5LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgdGhlIGF1dG8gSERMQyBidWcuCisqIE1hciAwOCwgMjAwMAlOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgTEFQQiBIRExDIHN0YXJ0dXAgcHJvYmxlbXMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgYnJpbmcgdGhlIGxpbmsgdXAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0eC9yeCwgYW5kIGJyaW5nIHRoZSAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayBkb3duIG9uIGNsb3NlKCkuCisqIE1hciAwNiwgMjAwMAlOZW5hZCBDb3JiaWMJIG8gQWRkZWQgYW4gb3B0aW9uIGZvciBsb2dnaW5nIGNhbGwgc2V0dXAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLiAKKyogRmViIDI5LCAyMDAwICBOZW5hZCBDb3JiaWMgCSBvIEFkZGVkIHN1cHBvcnQgZm9yIExBUEIgSERMQyBBUEkKKyogRmViIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgdGhlIG1vZGVtIGZhaWx1cmUgaGFuZGxpbmcuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIE1vZGVtIE9PQiBtZXNzYWdlIHdpbGwgYmUgcGFzc2VkIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdXNlci4KKyogRmViIDIxLCAyMDAwICBOZW5hZCBDb3JiaWMgCSBvIEFkZGVkIFhwaXBlbW9uIERlYnVnIFN1cHBvcnQKKyogRGVjIDMwLCAxOTk5IAlOZW5hZCBDb3JiaWMJIG8gU29ja2V0IGJhc2VkIFgyNUFQSSAKKyogU2VwIDE3LCAxOTk4CUphc3ByZWV0IFNpbmdoCSBvIFVwZGF0ZXMgZm9yIDIuMi5YICBrZXJuZWwKKyogTWFyIDE1LCAxOTk4CUFsYW4gQ294CSBvIDIuMS54IHBvcnRpbmcKKyogRGVjIDE5LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEFkZGVkIG11bHRpLWNoYW5uZWwgSVBYIHN1cHBvcnQKKyogTm92IDI3LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEFkZGVkIHByb3RlY3Rpb24gYWdhaW5zdCBlbmFibGluZyBvZiBpcnFzCisqCQkJCSAgIHdoZW4gdGhleSBhcmUgZGlzYWJsZWQuCisqIE5vdiAxNywgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIEFkZGVkIElQWCBzdXBwb3J0CisqCQkJCSBvIENoYW5nZWQgaWZfc2VuZCgpIHRvIG5vdyBidWZmZXIgcGFja2V0cyB3aGVuCisqCQkJCSAgIHRoZSBib2FyZCBpcyBidXN5CisqCQkJCSBvIFJlbW92ZWQgcXVldWVpbmcgb2YgcGFja2V0cyB2aWEgdGhlIHBvbGxpbmcKKyoJCQkJICAgcm91dGluZworKgkJCQkgbyBDaGFuZ2VkIGlmX3NlbmQoKSBjcml0aWNhbCBmbGFncyB0byBwcm9wZXJseQorKgkJCQkgICBoYW5kbGUgcmFjZSBjb25kaXRpb25zCisqIE5vdiAwNiwgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIFNWQyB0aW1lb3V0cworKgkJCQkgbyBDaGFuZ2VkIFBWQyBlbmNhcHN1bGF0aW9uIHRvIEVUSF9QX0lQCisqIEp1bCAyMSwgMTk5NyAgSmFzcHJlZXQgU2luZ2gJIG8gRml4ZWQgZnJlZWluZyB1cCBvZiBidWZmZXJzIHVzaW5nIGtmcmVlKCkKKyoJCQkJICAgd2hlbiBwYWNrZXRzIGFyZSByZWNlaXZlZC4KKyogTWFyIDExLCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgVmVyc2lvbiAzLjEuMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBhZGRlZCBzdXBwb3J0IGZvciBWMzUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gY2hhbmdlZCBpZl9zZW5kKCkgdG8gcmV0dXJuIDAgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuZGV2LmNyaXRpY2FsKCkgaXMgdHJ1ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmcmVlIHNvY2tldCBidWZmZXIgaW4gaWZfc2VuZCgpIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGFkZGVkIHN1cHBvcnQgZm9yIHNpbmdsZSAnQCcgYWRkcmVzcyB0bworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQgYWxsIGluY29taW5nIGNhbGxzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZpeGVkIGJ1ZyBpbiBzZXRfY2hhbl9zdGF0ZSgpIHRvIGRpc2Nvbm5lY3QKKyogSmFuIDE1LCAxOTk3CUdlbmUgS296aW4JVmVyc2lvbiAzLjEuMAorKgkJCQkgbyBpbXBsZW1lbnRlZCBleGVjKCkgZW50cnkgcG9pbnQKKyogSmFuIDA3LCAxOTk3CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSW5jbHVkZXMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRXhwZXJpbWVudGFsIGRlbGF5ICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZGxhX3gyNS5oPgkvKiBYLjI1IGZpcm13YXJlIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJRGVmaW5lcyAmIE1hY3JvcyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNkZWZpbmUJQ01EX09LCQkwCQkvKiBub3JtYWwgZmlybXdhcmUgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUJQ01EX1RJTUVPVVQJMHhGRgkJLyogZmlybXdhcmUgY29tbWFuZCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisKKyNkZWZpbmUJWDI1X0NIQU5fTVRVCTQwOTYJCS8qIHVuZnJhZ21lbnRlZCBsb2dpY2FsIGNoYW5uZWwgTVRVICovCisjZGVmaW5lCVgyNV9IUkRIRFJfU1oJNwkJLyogbWF4IGVuY2Fwc3VsYXRpb24gaGVhZGVyIHNpemUgKi8KKyNkZWZpbmUJWDI1X0NPTkNUX1RNT1VUCSg5MCpIWikJCS8qIGxpbmsgY29ubmVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lCVgyNV9SRUNPTl9UTU9VVAkoMTAqSFopCQkvKiBsaW5rIGNvbm5lY3Rpb24gdGltZW91dCAqLworI2RlZmluZQlDT05ORUNUX1RJTUVPVVQJKDkwKkhaKQkJLyogbGluayBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUJSE9MRF9ET1dOX1RJTUUJKDMwKkhaKQkJLyogbGluayBob2xkIGRvd24gdGltZSAqLworI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorI2RlZmluZSBNX0JJVAkJMHgwMQkKKworLy8jZGVmaW5lIFBSSU5UX0RFQlVHIDEKKyNpZmRlZiBQUklOVF9ERUJVRworI2RlZmluZSBEQkdfUFJJTlRLKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIERCR19QUklOVEsoZm9ybWF0LCBhLi4uKQorI2VuZGlmICAKKworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkUgICAgICAweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT04gIDB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PRkYgMHgwNAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUE9MTF9ESVNDT05ORUNUICAweDA4CisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQwkgMHgxMAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFCQkgMHgyMAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVURQX1BLVAkJIDB4NDAKKworI2RlZmluZSBNQVhfWDI1X0FERFJfU0laRQkxNgorI2RlZmluZSBNQVhfWDI1X0RBVEFfU0laRSAJMTI5CisjZGVmaW5lIE1BWF9YMjVfRkFDTF9TSVpFCTExMAorCisjZGVmaW5lIFRSWV9DTURfQUdBSU4JMgorI2RlZmluZSBERUxBWV9SRVNVTFQgICAgMQorI2RlZmluZSBSRVRVUk5fUkVTVUxUICAgMAorCisjZGVmaW5lIERDRCh4KSAoeCAmIDB4MDMgPyAiSElHSCIgOiAiTE9XIikKKyNkZWZpbmUgQ1RTKHgpICh4ICYgMHgwNSA/ICJISUdIIiA6ICJMT1ciKQorCisKKy8qIERyaXZlciB3aWxsIG5vdCB3cml0ZSBsb2cgbWVzc2FnZXMgYWJvdXQgCisgKiBtb2RlbSBzdGF0dXMgaWYgZGVmaW5lZC4qLworI2RlZmluZSBNT0RFTV9OT1RfTE9HIDEKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogCUZvciBJUFhXQU4gCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1ZIZXhUb0FzY2lpKGIpICgoKHVuc2lnbmVkIGNoYXIpKGIpID4gKHVuc2lnbmVkIGNoYXIpOSkgPyAoKHVuc2lnbmVkIGNoYXIpJ0EnICsgKCh1bnNpZ25lZCBjaGFyKShiKSAtICh1bnNpZ25lZCBjaGFyKTEwKSkgOiAoKHVuc2lnbmVkIGNoYXIpJzAnICsgKHVuc2lnbmVkIGNoYXIpKGIpKSkKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICBNRU1PUlkgREVCVUdHSU5HIEZVTkNUSU9OCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBLTUVNX1NBRkVUWVpPTkUgOAorCitzdGF0aWMgdm9pZCAqIGRiZ19rbWFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpbywgaW50IGxpbmUpIHsKKwlpbnQgaSA9IDA7CisJdm9pZCAqIHYgPSBrbWFsbG9jKHNpemUrc2l6ZW9mKHVuc2lnbmVkIGludCkrMipLTUVNX1NBRkVUWVpPTkUqOCxwcmlvKTsKKwljaGFyICogYzEgPSB2OwkKKwljMSArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwkqKCh1bnNpZ25lZCBpbnQgKil2KSA9IHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJYzFbMF0gPSAnRCc7IGMxWzFdID0gJ0UnOyBjMVsyXSA9ICdBJzsgYzFbM10gPSAnRCc7CisJCWMxWzRdID0gJ0InOyBjMVs1XSA9ICdFJzsgYzFbNl0gPSAnRSc7IGMxWzddID0gJ0YnOworCQljMSArPSA4OworCX0KKwljMSArPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQljMVswXSA9ICdNJzsgYzFbMV0gPSAnVSc7IGMxWzJdID0gJ04nOyBjMVszXSA9ICdHJzsKKwkJYzFbNF0gPSAnVyc7IGMxWzVdID0gJ0EnOyBjMVs2XSA9ICdMJzsgYzFbN10gPSAnTCc7CisJCWMxICs9IDg7CisJfQorCXYgPSAoKGNoYXIgKil2KSArIHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjg7CisJcHJpbnRrKEtFUk5fSU5GTyAibGluZSAlZCAga21hbGxvYyglZCwlZCkgPSAlcFxuIixsaW5lLHNpemUscHJpbyx2KTsKKwlyZXR1cm4gdjsKK30KK3N0YXRpYyB2b2lkIGRiZ19rZnJlZSh2b2lkICogdiwgaW50IGxpbmUpIHsKKwl1bnNpZ25lZCBpbnQgKiBzcCA9ICh1bnNpZ25lZCBpbnQgKikoKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCkpOworCXVuc2lnbmVkIGludCBzaXplID0gKnNwOworCWNoYXIgKiBjMSA9ICgoY2hhciAqKXYpIC0gS01FTV9TQUZFVFlaT05FKjg7CisJaW50IGkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQlpZiAoICAgYzFbMF0gIT0gJ0QnIHx8IGMxWzFdICE9ICdFJyB8fCBjMVsyXSAhPSAnQScgfHwgYzFbM10gIT0gJ0QnCisJCSAgICB8fCBjMVs0XSAhPSAnQicgfHwgYzFbNV0gIT0gJ0UnIHx8IGMxWzZdICE9ICdFJyB8fCBjMVs3XSAhPSAnRicpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKHVuZGVycnVuKSFcbiIsdik7CisJCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCisJCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKKwkJfQorCQljMSArPSA4OworCX0KKwljMSArPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQlpZiAoICAgYzFbMF0gIT0gJ00nIHx8IGMxWzFdICE9ICdVJyB8fCBjMVsyXSAhPSAnTicgfHwgYzFbM10gIT0gJ0cnCisJCSAgICB8fCBjMVs0XSAhPSAnVycgfHwgYzFbNV0gIT0gJ0EnIHx8IGMxWzZdICE9ICdMJyB8fCBjMVs3XSAhPSAnTCcKKwkJICAgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJrbWFsbG9jZWQgYmxvY2sgYXQgJXAgaGFzIGJlZW4gY29ycnVwdGVkIChvdmVycnVuKTpcbiIsdik7CisJCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCisJCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKKwkJfQorCQljMSArPSA4OworCX0KKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrZnJlZSglcClcbiIsbGluZSx2KTsKKwl2ID0gKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCk7CisJa2ZyZWUodik7Cit9CisKKyNkZWZpbmUga21hbGxvYyh4LHkpIGRiZ19rbWFsbG9jKHgseSxfX0xJTkVfXykKKyNkZWZpbmUga2ZyZWUoeCkgZGJnX2tmcmVlKHgsX19MSU5FX18pCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlEYXRhIFN0cnVjdHVyZXMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOiAJeDI1X2NoYW5uZWwKKyAqCisgKiBQdXJwb3NlOglUbyBob2xkIHByaXZhdGUgaW5mb3JtYXRvbiBmb3IgZWFjaCAgCisgKiAgICAgICAgICAgICAgbG9naWNhbCBjaGFubmVsLgorICoJCQorICogUmF0aW9uYWxlOiAgCVBlci1jaGFubmVsIGRlYnVnZ2luZyBpcyBwb3NzaWJsZSBpZiBlYWNoIAorICogICAgICAgICAgICAgIGNoYW5uZWwgaGFzIGl0cyBvd24gcHJpdmF0ZSBhcmVhLgorICoJCisgKiBBc3N1bXB0aW9uczoKKyAqCisgKiBEZXNjcmlwdGlvbjoJVGhpcyBpcyBhbiBleHRlbnRpb24gb2YgdGhlIHN0cnVjdCBuZXRfZGV2aWNlCisgKiAgICAgICAgICAgICAgd2UgY3JlYXRlIGZvciBlYWNoIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGtlZXAgCisgKiAgICAgICAgICAgICAgdGhlIHJlc3Qgb2YgWC4yNSBjaGFubmVsLXNwZWNpZmljIGRhdGEuIAorICoKKyAqIENvbnN0cnVjdDoJVHlwZWRlZgorICovCit0eXBlZGVmIHN0cnVjdCB4MjVfY2hhbm5lbAoreworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOwkvKiBjb21tb24gYXJlYSBmb3IgeDI1YXBpIGFuZCBzb2NrZXQgKi8KKwljaGFyIG5hbWVbV0FOX0lGTkFNRV9TWisxXTsJLyogaW50ZXJmYWNlIG5hbWUsIEFTQ0lJWiAqLworCWNoYXIgYWRkcltXQU5fQUREUkVTU19TWisxXTsJLyogbWVkaWEgYWRkcmVzcywgQVNDSUlaICovCisJdW5zaWduZWQgdHhfcGt0X3NpemU7CisJdW5zaWduZWQgc2hvcnQgcHJvdG9jb2w7CS8qIGV0aGVydHlwZSwgMCAtIG11bHRpcGxleGVkICovCisJY2hhciBkcm9wX3NlcXVlbmNlOwkJLyogbWFyayBzZXF1ZW5jZSBmb3IgZHJvcHBpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXRlX3RpY2s7CS8qIHRpbWUgb2YgdGhlIGxhc3Qgc3RhdGUgY2hhbmdlICovCisJdW5zaWduZWQgaWRsZV90aW1lb3V0OwkJLyogc2VjLCBiZWZvcmUgZGlzY29ubmVjdGluZyAqLworCXVuc2lnbmVkIGxvbmcgaV90aW1lb3V0X3NvZmFyOyAgLyogIyBvZiBzZWMncyB3ZSd2ZSBiZWVuIGlkbGUgKi8KKwl1bnNpZ25lZCBob2xkX3RpbWVvdXQ7CQkvKiBzZWMsIGJlZm9yZSByZS1jb25uZWN0aW5nICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CS8qIGNvdW50ZXIgZm9yIHRyYW5zbWl0IHRpbWUgb3V0ICovCisJY2hhciBkZXZ0aW50OwkJCS8qIFdlYXRoZXIgd2Ugc2hvdWxkIGRldl90aW50KCkgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tiOwkJLyogcmVjZWl2ZSBzb2NrZXQgYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYjsJCS8qIHRyYW5zbWl0IHNvY2tldCBidWZmZXIgKi8KKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIHgyNWFwaV9iaCAqLworCXVuc2lnbmVkIGxvbmcgIHRxX3dvcmtpbmc7CisJdm9sYXRpbGUgaW50ICBiaF93cml0ZTsKKwl2b2xhdGlsZSBpbnQgIGJoX3JlYWQ7CisJYXRvbWljX3QgIGJoX2J1ZmZfdXNlZDsKKworCXNkbGFfdCogY2FyZDsJCQkvKiAtPiBvd25lciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiAtPiBib3VuZCBkZXZjZSAqLworCisJaW50IGNoX2lkeDsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFg7CisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBpZnN0YXRzOwkvKiBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIHNob3J0IHRyYW5zbWl0X2xlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9vZmZzZXQ7CisJY2hhciB0cmFuc21pdF9idWZmZXJbWDI1X0NIQU5fTVRVK3NpemVvZih4MjVhcGlfaGRyX3QpXTsKKworCWlmX3NlbmRfc3RhdF90ICAgaWZfc2VuZF9zdGF0OworICAgICAgICByeF9pbnRyX3N0YXRfdCAgIHJ4X2ludHJfc3RhdDsKKyAgICAgICAgcGlwZV9tZ210X3N0YXRfdCBwaXBlX21nbXRfc3RhdDsgICAgCisKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl9zdGFydF90aW1lOyAvKiBSb3V0ZXIgc3RhcnQgdGltZSBpbiBzZWNvbmRzICovCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfdXBfdGltZTsKKwkKK30geDI1X2NoYW5uZWxfdDsKKworLyogRklYTUUgVGFrZSB0aGlzIG91dCAqLworCisjaWZkZWYgTkVYX09MRF9DQUxMX0lORk8KK3R5cGVkZWYgc3RydWN0IHgyNV9jYWxsX2luZm8KK3sKKwljaGFyIGRlc3RbMTddOwkJCVBBQ0tFRDsvKiBBU0NJSVogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWNoYXIgc3JjWzE3XTsJCQlQQUNLRUQ7LyogQVNDSUlaIHNvdXJjZSBhZGRyZXNzICovCisJY2hhciBudXNlcjsJCQlQQUNLRUQ7LyogbnVtYmVyIG9mIHVzZXIgZGF0YSBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIgdXNlclsxMjddOwlQQUNLRUQ7LyogdXNlciBkYXRhICovCisJY2hhciBuZmFjaWw7CQkJUEFDS0VEOy8qIG51bWJlciBvZiBmYWNpbGl0aWVzICovCisJc3RydWN0CisJeworCQl1bnNpZ25lZCBjaGFyIGNvZGU7ICAgICBQQUNLRUQ7CisJCXVuc2lnbmVkIGNoYXIgcGFybTsgICAgIFBBQ0tFRDsKKwl9IGZhY2lsWzY0XTsJCQkgICAgICAgIC8qIGZhY2lsaXRpZXMgKi8KK30geDI1X2NhbGxfaW5mb190OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHgyNV9jYWxsX2luZm8KK3sKKwljaGFyIGRlc3RbTUFYX1gyNV9BRERSX1NJWkVdCQlQQUNLRUQ7LyogQVNDSUlaIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwljaGFyIHNyY1tNQVhfWDI1X0FERFJfU0laRV0JCVBBQ0tFRDsvKiBBU0NJSVogc291cmNlIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyIG51c2VyCQkJUEFDS0VEOworCXVuc2lnbmVkIGNoYXIgdXNlcltNQVhfWDI1X0RBVEFfU0laRV0JUEFDS0VEOy8qIHVzZXIgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgbmZhY2lsCQkJUEFDS0VEOworCXVuc2lnbmVkIGNoYXIgZmFjaWxbTUFYX1gyNV9GQUNMX1NJWkVdCVBBQ0tFRDsKKwl1bnNpZ25lZCBzaG9ydCBsY24gICAgICAgICAgICAgCQlQQUNLRUQ7Cit9IHgyNV9jYWxsX2luZm9fdDsKKyNlbmRpZgorCisKKyAgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKglQcml2YXRlIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIAorICogY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZik7CitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbV9zaHV0ZG93bihzZGxhX3QgKmNhcmQpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgCisgKi8KK3N0YXRpYyBpbnQgd3B4X2V4ZWMgKHN0cnVjdCBzZGxhKiBjYXJkLCB2b2lkKiB1X2NtZCwgdm9pZCogdV9kYXRhKTsKK3N0YXRpYyB2b2lkIHgyNWFwaV9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeDI1YXBpX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqIAlOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQqIGRhZGRyLCB2b2lkKiBzYWRkciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmKiBza2IpOworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqIAlJbnRlcnJ1cHQgaGFuZGxlcnMgCisgKi8KK3N0YXRpYyB2b2lkIHdweF9pc3IJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHR4X2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHN0YXR1c19pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCBldmVudF9pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCBzcHVyX2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIgIChzZGxhX3QgKik7CisKK3N0YXRpYyBpbnQgdHhfaW50cl9zZW5kKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm1vdmVfZGV2X3RvX25leHQoc2RsYV90ICpjYXJkLAorCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqCUJhY2tncm91bmQgcG9sbGluZyByb3V0aW5lcyAKKyAqLworc3RhdGljIHZvaWQgd3B4X3BvbGwgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBwb2xsX2Rpc2Nvbm5lY3RlZCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHBvbGxfY29ubmVjdGluZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHBvbGxfYWN0aXZlIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgdHJpZ2dlcl94MjVfcG9sbChzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgeDI1X3RpbWVyX3JvdXRpbmUodW5zaWduZWQgbG9uZyBkYXRhKTsKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKglYLjI1IGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyBpbnQgeDI1X2dldF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cik7CitzdGF0aWMgaW50IHgyNV9jb25maWd1cmUgKHNkbGFfdCogY2FyZCwgVFgyNUNvbmZpZyogY29uZik7CitzdGF0aWMgaW50IGhkbGNfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIFRYMjVDb25maWcqIGNvbmYpOworc3RhdGljIGludCBzZXRfaGRsY19sZXZlbCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgeDI1X2dldF9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9nZXRfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgeDI1X2Nsb3NlX2hkbGMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9vcGVuX2hkbGMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9zZXR1cF9oZGxjIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfc2V0X2R0ciAoc2RsYV90KiBjYXJkLCBpbnQgZHRyKTsKK3N0YXRpYyBpbnQgeDI1X2dldF9jaGFuX2NvbmYgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbik7CitzdGF0aWMgaW50IHgyNV9wbGFjZV9jYWxsIChzZGxhX3QqIGNhcmQsIHgyNV9jaGFubmVsX3QqIGNoYW4pOworc3RhdGljIGludCB4MjVfYWNjZXB0X2NhbGwgKHNkbGFfdCogY2FyZCwgaW50IGxjbiwgaW50IHFkbSk7CitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBjYXVzZSwgaW50IGRpYWduKTsKK3N0YXRpYyBpbnQgeDI1X3NlbmQgKHNkbGFfdCogY2FyZCwgaW50IGxjbiwgaW50IHFkbSwgaW50IGxlbiwgdm9pZCogYnVmKTsKK3N0YXRpYyBpbnQgeDI1X2ZldGNoX2V2ZW50cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgeDI1X2Vycm9yIChzZGxhX3QqIGNhcmQsIGludCBlcnIsIGludCBjbWQsIGludCBsY24pOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICoJWC4yNSBhc3luY2hyb25vdXMgZXZlbnQgaGFuZGxlcnMgCisgKi8KK3N0YXRpYyBpbnQgaW5jb21pbmdfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCBjYWxsX2FjY2VwdGVkIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYik7CitzdGF0aWMgaW50IGNhbGxfY2xlYXJlZCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCB0aW1lb3V0X2V2ZW50IChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYik7CitzdGF0aWMgaW50IHJlc3RhcnRfZXZlbnQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICoJTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyBpbnQgY29ubmVjdCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgZGlzY29ubmVjdCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwKKwkJCQkJIHVuc2lnbmVkIGxjbik7CitzdGF0aWMgaW50IGNoYW5fY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgY2hhbl9kaXNjKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgc2V0X2NoYW5fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgaW50IHN0YXRlKTsKK3N0YXRpYyBpbnQgY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZmYsIHVuc2lnbmVkIGRhdGFfbGVuLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgdHhfaW50cik7CitzdGF0aWMgdW5zaWduZWQgY2hhciBicHNfdG9fc3BlZWRfY29kZSAodW5zaWduZWQgbG9uZyBicHMpOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNfdG9fdWludCAodW5zaWduZWQgY2hhciogc3RyLCBpbnQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGV4X3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqLCBpbnQpOworc3RhdGljIHZvaWQgcGFyc2VfY2FsbF9pbmZvICh1bnNpZ25lZCBjaGFyKiwgeDI1X2NhbGxfaW5mb190Kik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZpbmRfY2hhbm5lbChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxjbik7CitzdGF0aWMgdm9pZCBiaW5kX2xjbl90b19kZXYoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsY24pOworc3RhdGljIHZvaWQgc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAgICAgIFgyNSBBUEkgRnVuY3Rpb25zIAorICovCitzdGF0aWMgaW50IHdhbnBpcGVfcHVsbF9kYXRhX2luX3NrYihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHJfZXhlYyhzZGxhX3QgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IGV4ZWN1dGVfZGVsYXllZF9jbWQoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIG1ib3hfY21kX3QgKnVzcl9jbWQsIGNoYXIgYmFkX2NtZCk7CitzdGF0aWMgaW50IGFwaV9pbmNvbWluZ19jYWxsIChzZGxhX3QqLCBUWDI1TWJveCAqLCBpbnQpOworc3RhdGljIGludCBhbGxvY19hbmRfaW5pdF9za2JfYnVmIChzZGxhX3QgKixzdHJ1Y3Qgc2tfYnVmZiAqKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgVFgyNU1ib3gqIG1ib3gpOworc3RhdGljIGludCBjbGVhcl9jb25maXJtX2V2ZW50IChzZGxhX3QgKiwgVFgyNU1ib3gqKTsKK3N0YXRpYyB2b2lkIHNlbmRfb29iX21zZyAoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBUWDI1TWJveCAqbWJveCk7CitzdGF0aWMgaW50IHRpbWVyX2ludHJfY21kX2V4ZWMoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGFwaV9vb2JfZXZlbnQgKHNkbGFfdCAqY2FyZCxUWDI1TWJveCAqbWJveCk7CitzdGF0aWMgaW50IGNoZWNrX2JhZF9jb21tYW5kKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoYW5uZWxfZGlzY29ubmVjdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGRsY19saW5rX2Rvd24gKHNkbGFfdCopOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICBYUElQRU1PTiBGdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKik7CitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKiwgc2RsYV90Kik7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpOyAKK3N0YXRpYyB2b2lkIGluaXRfeDI1X2NoYW5uZWxfc3RydWN0KCB4MjVfY2hhbm5lbF90ICopOworc3RhdGljIHZvaWQgaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggc2RsYV90ICopOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxjbik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJSVBYIGZ1bmN0aW9ucyAKKyAqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqLCBjaGFyICosIHVuc2lnbmVkIGNoYXIgLCAKKwkJCSB1bnNpZ25lZCBsb25nICwgdW5zaWduZWQgc2hvcnQgKTsKKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKworc3RhdGljIHZvaWQgUzUwOF9TNTE0X2xvY2soc2RsYV90ICosIHVuc2lnbmVkIGxvbmcgKik7CitzdGF0aWMgdm9pZCBTNTA4X1M1MTRfdW5sb2NrKHNkbGFfdCAqLCB1bnNpZ25lZCBsb25nICopOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAJR2xvYmFsIFZhcmlhYmxlcyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKglQdWJsaWMgRnVuY3Rpb25zIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3cHhfaW5pdDoJWC4yNSBQcm90b2NvbCBJbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFB1cnBvc2U6CVRvIGluaXRpYWxpemUgdGhlIHByb3RvY29sL2Zpcm13YXJlLgorICogCisgKiBSYXRpb25hbGU6CVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHNldHVwKCkgZnVuY3Rpb24sIGluCisgKiAgICAgICAgICAgICAgc2RsYW1haW4uYywgdG8gZHluYW1pY2FsbHkgc2V0dXAgdGhlIHgyNSBwcm90b2NvbC4KKyAqCQlUaGlzIGlzIHRoZSBmaXJzdCBwcm90b2NvbCBzcGVjaWZpYyBmdW5jdGlvbiwgd2hpY2gKKyAqICAgICAgICAgICAgICBleGVjdXRlcyBvbmNlIG9uIHN0YXJ0dXAuCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglUaGlzIHByb2NlZHVyZSBpbml0aWFsaXplcyB0aGUgeDI1IGZpcm13YXJlIGFuZAorICogICAgCQlzZXRzIHVwIHRoZSBtYWlsYm94LCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXIKKyAqICAgICAgICAgICAgICBwb2ludGVycy4gSXQgYWxzbyBpbml0aWFsaXplcyBhbGwgZGVidWdnaW5nIHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICBhbmQgc2V0cyB1cCB0aGUgWDI1IGVudmlyb25tZW50LgorICoKKyAqCQlTZXRzIHVwIGhhcmR3YXJlIG9wdGlvbnMgZGVmaW5lZCBieSB1c2VyIGluIFt3YW5waXBlI10gCisgKgkJc2VjdGlvbiBvZiB3YW5waXBlIy5jb25mIGNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKgorICogCQlBdCB0aGlzIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCAKKyAqICAgICAgCWFuZCBYLjI1IGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgCQlvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgCQlvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgCQlvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBDYWxsZWQgYnk6CXNldHVwKCkgZnVuY3Rpb24gaW4gc2RsYW1haW4uYworICoKKyAqIEFzc3VtcHRpb25zOglOb25lCisgKgorICogV2FybmluZ3M6CU5vbmUKKyAqCisgKiBSZXR1cm46IAkwCW8uay4KKyAqCSAJPCAwCWZhaWx1cmUuCisgKi8KKworaW50IHdweF9pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5pb257CisJCWNoYXIgc3RyWzgwXTsKKwkJVFgyNUNvbmZpZyBjZmc7CisJfSB1OworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19YMjUpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCkKKwkJOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyAqLworCWNhcmQtPm1ib3ggID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X01CT1hfT0ZGUyk7CisJY2FyZC0+cnhtYiAgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfUlhNQk9YX09GRlMpOworCWNhcmQtPmZsYWdzID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X1NUQVRVU19PRkZTKTsKKworCS8qIEluaXRpYWxpemUgZm9yIFM1MTQgQ2FyZCAqLworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCWNhcmQtPm1ib3ggKz0gWDI1X01CX1ZFQ1RPUjsKKwkJY2FyZC0+ZmxhZ3MgKz0gWDI1X01CX1ZFQ1RPUjsKKwkJY2FyZC0+cnhtYiArPSBYMjVfTUJfVkVDVE9SOworCX0KKworCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisJaWYgKHgyNV9nZXRfdmVyc2lvbihjYXJkLCBOVUxMKSB8fCB4MjVfZ2V0X3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKworCisJLyogWDI1IGZpcm13YXJlIGNhbiBydW4gZXRoZXIgaW4gWDI1IG9yIExBUEIgSERMQyBtb2RlLgorICAgICAgICAgKiBDaGVjayB0aGUgdXNlciBkZWZpbmVkIG9wdGlvbiBhbmQgY29uZmlndXJlIGFjY29yZGluZ2x5ICovCisJaWYgKGNvbmYtPnUueDI1LkxBUEJfaGRsY19vbmx5ID09IFdBTk9QVF9ZRVMpeworCQlpZiAoc2V0X2hkbGNfbGV2ZWwoY2FyZCkgIT0gQ01EX09LKXsKKwkJCXJldHVybiAtRUlPOwkKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBMQVBfQiBIRExDIGZpcm13YXJlIHYlc1xuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7CisJCX0KKwkJY2FyZC0+dS54LkxBUEJfaGRsYyA9IDE7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBydW5uaW5nIFguMjUgZmlybXdhcmUgdiVzXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHUuc3RyKTsKKwkJY2FyZC0+dS54LkxBUEJfaGRsYyA9IDA7CisJfQorCisJLyogQ29uZmlndXJlIGFkYXB0ZXIuIEhlcmUgd2Ugc2V0IHJlc29uYWJsZSBkZWZhdWx0cywgdGhlbiBwYXJzZQorCSAqIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwkgKiBNb3N0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdmVyaWZpZWQgYW5kIGNvcnJlY3RlZCAoaWYKKwkgKiBuZWNlc3NhcnkpIHNpbmNlIHdlIGNhbid0IHJlbHkgb24gdGhlIGFkYXB0ZXIgdG8gZG8gc28uCisJICovCisJbWVtc2V0KCZ1LmNmZywgMCwgc2l6ZW9mKHUuY2ZnKSk7CisJdS5jZmcudDEJCT0gMzsKKwl1LmNmZy5uMgkJPSAxMDsKKwl1LmNmZy5hdXRvSGRsYwkJPSAxOwkJLyogYXV0b21hdGljIEhETEMgY29ubmVjdGlvbiAqLworCXUuY2ZnLmhkbGNXaW5kb3cJPSA3OworCXUuY2ZnLnBrdFdpbmRvdwkJPSAyOworCXUuY2ZnLnN0YXRpb24JCT0gMTsJCS8qIERURSAqLworCXUuY2ZnLm9wdGlvbnMJCT0gMHgwMDkwOwkvKiBkaXNhYmxlIEQtYml0IHByYWdtYXRpY3MgKi8KKwl1LmNmZy5jY2l0dENvbXBhdAk9IDE5ODg7CisJdS5jZmcudDEwdDIwCQk9IDMwOworCXUuY2ZnLnQxMXQyMQkJPSAzMDsKKwl1LmNmZy50MTJ0MjIJCT0gMzA7CisJdS5jZmcudDEzdDIzCQk9IDMwOworCXUuY2ZnLnQxNnQyNgkJPSAzMDsKKwl1LmNmZy50MjgJCT0gMzA7CisJdS5jZmcucjEwcjIwCQk9IDU7CisJdS5jZmcucjEycjIyCQk9IDU7CisJdS5jZmcucjEzcjIzCQk9IDU7CisJdS5jZmcucmVzcG9uc2VPcHQJPSAxOwkJLyogUlIncyBhZnRlciBldmVyeSBwYWNrZXQgKi8KKworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJdS5jZmcuaGRsY01UVSA9IDEwMjc7CisJfQorCisJaWYgKGNvbmYtPnUueDI1LngyNV9jb25mX29wdCl7CisJCXUuY2ZnLm9wdGlvbnMgPSBjb25mLT51LngyNS54MjVfY29uZl9vcHQ7CisJfQorCisJaWYgKGNvbmYtPmNsb2NraW5nICE9IFdBTk9QVF9FWFRFUk5BTCkKKwkJdS5jZmcuYmF1ZFJhdGUgPSBicHNfdG9fc3BlZWRfY29kZShjb25mLT5icHMpOworCisJaWYgKGNvbmYtPnN0YXRpb24gIT0gV0FOT1BUX0RURSl7CisJCXUuY2ZnLnN0YXRpb24gPSAwOwkJLyogRENFIG1vZGUgKi8KKwl9CisKKyAgICAgICAgaWYgKGNvbmYtPmludGVyZmFjZSAhPSBXQU5PUFRfUlMyMzIgKXsKKwkgICAgICAgIHUuY2ZnLmhkbGNPcHRpb25zIHw9IDB4ODA7ICAgICAgLyogVjM1IG1vZGUgKi8KKwl9IAorCisJLyogYWRqdXN0IE1UVSAqLworCWlmICghY29uZi0+bXR1IHx8IChjb25mLT5tdHUgPj0gMTAyNCkpCisJCWNhcmQtPndhbmRldi5tdHUgPSAxMDI0OworCWVsc2UgaWYgKGNvbmYtPm10dSA+PSA1MTIpCisJCWNhcmQtPndhbmRldi5tdHUgPSA1MTI7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDI1NikKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDI1NjsKKwllbHNlIGlmIChjb25mLT5tdHUgPj0gMTI4KQorCQljYXJkLT53YW5kZXYubXR1ID0gMTI4OworCWVsc2UgCisJCWNhcmQtPndhbmRldi5tdHUgPSA2NDsKKworCXUuY2ZnLmRlZlBrdFNpemUgPSB1LmNmZy5wa3RNVFUgPSBjYXJkLT53YW5kZXYubXR1OworCisJaWYgKGNvbmYtPnUueDI1LmhpX3B2Yyl7CisJCWNhcmQtPnUueC5oaV9wdmMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmhpX3B2YywgTUFYX0xDTl9OVU0pOworCQljYXJkLT51LngubG9fcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5sb19wdmMsIGNhcmQtPnUueC5oaV9wdmMpOworCX0KKworCWlmIChjb25mLT51LngyNS5oaV9zdmMpeworCQljYXJkLT51LnguaGlfc3ZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9zdmMsIE1BWF9MQ05fTlVNKTsKKwkJY2FyZC0+dS54LmxvX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubG9fc3ZjLCBjYXJkLT51LnguaGlfc3ZjKTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gY29uZmlndXJlICovCisJY2FyZC0+dS54Lm51bV9vZl9jaCA9IDA7CisJaWYgKGNhcmQtPnUueC5oaV9zdmMgIT0gMCl7CisJCWNhcmQtPnUueC5udW1fb2ZfY2ggPSAoY2FyZC0+dS54LmhpX3N2YyAtIGNhcmQtPnUueC5sb19zdmMpICsgMTsKKwl9CisJaWYgKGNhcmQtPnUueC5oaV9wdmMgIT0gMCl7CisJCWNhcmQtPnUueC5udW1fb2ZfY2ggKz0gKGNhcmQtPnUueC5oaV9wdmMgLSBjYXJkLT51LngubG9fcHZjKSArIDE7CisJfQorCisJaWYgKGNhcmQtPnUueC5udW1fb2ZfY2ggPT0gMCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgTWluaW11bSBudW1iZXIgb2YgUFZDL1NWQyBjaGFubmVscyBpcyAxICFcbiIKKwkJCQkgIiVzOiBQbGVhc2Ugc2V0IHRoZSBMb3dlc3QvSGlnaGVzdCBQVkMvU1ZDIHZhbHVlcyAhXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVDSFJORzsKKwl9CisJCisJdS5jZmcubG9QVkMgPSBjYXJkLT51LngubG9fcHZjOworCXUuY2ZnLmhpUFZDID0gY2FyZC0+dS54LmhpX3B2YzsKKwl1LmNmZy5sb1R3b1dheVNWQyA9IGNhcmQtPnUueC5sb19zdmM7CisJdS5jZmcuaGlUd29XYXlTVkMgPSBjYXJkLT51LnguaGlfc3ZjOworCisJaWYgKGNvbmYtPnUueDI1LmhkbGNfd2luZG93KQorCQl1LmNmZy5oZGxjV2luZG93ID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oZGxjX3dpbmRvdywgNyk7CisJaWYgKGNvbmYtPnUueDI1LnBrdF93aW5kb3cpCisJCXUuY2ZnLnBrdFdpbmRvdyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucGt0X3dpbmRvdywgNyk7CisKKwlpZiAoY29uZi0+dS54MjUudDEpCisJCXUuY2ZnLnQxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MSwgMzApOworCWlmIChjb25mLT51LngyNS50MikKKwkJdS5jZmcudDIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQyLCAyOSk7CisJaWYgKGNvbmYtPnUueDI1LnQ0KQorCQl1LmNmZy50NCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDQsIDI0MCk7CisJaWYgKGNvbmYtPnUueDI1Lm4yKQorCQl1LmNmZy5uMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubjIsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MTBfdDIwKQorCQl1LmNmZy50MTB0MjAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxMF90MjAsMjU1KTsKKwlpZiAoY29uZi0+dS54MjUudDExX3QyMSkKKwkJdS5jZmcudDExdDIxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTFfdDIxLDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQxMl90MjIpCisJCXUuY2ZnLnQxMnQyMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEyX3QyMiwyNTUpOworCWlmIChjb25mLT51LngyNS50MTNfdDIzKQkKKwkJdS5jZmcudDEzdDIzID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTNfdDIzLDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQxNl90MjYpCisJCXUuY2ZnLnQxNnQyNiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDE2X3QyNiwgMjU1KTsKKwlpZiAoY29uZi0+dS54MjUudDI4KQorCQl1LmNmZy50MjggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQyOCwgMjU1KTsKKworCWlmIChjb25mLT51LngyNS5yMTBfcjIwKQorCQl1LmNmZy5yMTByMjAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnIxMF9yMjAsMjUwKTsKKwlpZiAoY29uZi0+dS54MjUucjEyX3IyMikKKwkJdS5jZmcucjEycjIyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5yMTJfcjIyLDI1MCk7CisJaWYgKGNvbmYtPnUueDI1LnIxM19yMjMpCisJCXUuY2ZnLnIxM3IyMyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucjEzX3IyMywyNTApOworCisKKwlpZiAoY29uZi0+dS54MjUuY2NpdHRfY29tcGF0KQorCQl1LmNmZy5jY2l0dENvbXBhdCA9IGNvbmYtPnUueDI1LmNjaXR0X2NvbXBhdDsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJaWYgKGhkbGNfY29uZmlndXJlKGNhcmQsICZ1LmNmZykgIT0gQ01EX09LKQorCQkJcmV0dXJuIC1FSU87CisJfWVsc2V7CisJCWlmICh4MjVfY29uZmlndXJlKGNhcmQsICZ1LmNmZykgIT0gQ01EX09LKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCh4MjVfY2xvc2VfaGRsYyhjYXJkKSAhPSBDTURfT0spIHx8CQkvKiBjbG9zZSBIRExDIGxpbmsgKi8KKwkgICAgKHgyNV9zZXRfZHRyKGNhcmQsIDApICE9IENNRF9PSykpCQkvKiBkcm9wIERUUiAqLworCQlyZXR1cm4gLUVJTzsKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9ICZ3cHhfaXNyOworCWNhcmQtPnBvbGwJCT0gTlVMTDsgLy8md3B4X3BvbGw7CisJY2FyZC0+ZGlzYWJsZV9jb21tCT0gJmRpc2FibGVfY29tbTsKKwljYXJkLT5leGVjCQk9ICZ3cHhfZXhlYzsKKwljYXJkLT53YW5kZXYudXBkYXRlCT0gJnVwZGF0ZTsKKwljYXJkLT53YW5kZXYubmV3X2lmCT0gJm5ld19pZjsKKwljYXJkLT53YW5kZXYuZGVsX2lmCT0gJmRlbF9pZjsKKworCS8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gY2Fubm90IGV4aXQgd2l0aCBhbiBlcnJvcgorCSAqICAgICAgICAgIGFmdGVyIHRoZSBjaGFuZ2Ugb2Ygc3RhdGUgKi8KKwljYXJkLT53YW5kZXYuc3RhdGUJPSBXQU5fRElTQ09OTkVDVEVEOworCQorCWNhcmQtPndhbmRldi5lbmFibGVfdHhfaW50ID0gMDsKKwljYXJkLT5pcnFfZGlzX2lmX3NlbmRfY291bnQgPSAwOworICAgICAgICBjYXJkLT5pcnFfZGlzX3BvbGxfY291bnQgPSAwOworCWNhcmQtPnUueC50eF9kZXYgPSBOVUxMOworCWNhcmQtPnUueC5ub19kZXYgPSAwOworCisKKwkvKiBDb25maWd1cmUgZm9yIFM1MTQgUENJIENhcmQgKi8KKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpIHsKKwkJY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1cyA9IAorCQkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKKwkJCQkoY2FyZC0+aHcuZHBtYmFzZSArIFgyNV9NQl9WRUNUT1IrIFgyNV9NSVNDX0hETENfQklUUyk7CisJfWVsc2V7CisJCWNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgPSAKKwkJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfTUlTQ19IRExDX0JJVFMpOyAKKwl9CisKKwljYXJkLT51LngucG9sbF9kZXZpY2U9TlVMTDsKKwljYXJkLT53YW5kZXYudWRwX3BvcnQgPSBjb25mLT51ZHBfcG9ydDsKKworCS8qIEVuYWJsZSBvciBkaXNhYmxlIGNhbGwgc2V0dXAgbG9nZ2luZyAqLworCWlmIChjb25mLT51LngyNS5sb2dnaW5nID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgQ2FsbCBMb2dnaW5nLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQljYXJkLT51LngubG9nZ2luZyA9IDE7CisJfWVsc2V7CQorCQljYXJkLT51LngubG9nZ2luZyA9IDA7CisJfQorCisJLyogRW5hYmxlIG9yIGRpc2FibGUgbW9kZW0gc3RhdHVzIHJlcG9ydGluZyAqLworCWlmIChjb25mLT51LngyNS5vb2Jfb25fbW9kZW0gPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBPT0Igb24gTW9kZW0gY2hhbmdlLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQljYXJkLT51Lngub29iX29uX21vZGVtID0gMTsKKwl9ZWxzZXsKKwkJY2FyZC0+dS54Lm9vYl9vbl9tb2RlbSA9IDA7CisJfQorCQorCWluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoY2FyZCk7CQorCisJSU5JVF9XT1JLKCZjYXJkLT51LngueDI1X3BvbGxfd29yaywgKHZvaWQgKil3cHhfcG9sbCwgY2FyZCk7CisKKwlpbml0X3RpbWVyKCZjYXJkLT51LngueDI1X3RpbWVyKTsKKwljYXJkLT51LngueDI1X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljYXJkOworCWNhcmQtPnUueC54MjVfdGltZXIuZnVuY3Rpb24gPSB4MjVfdGltZXJfcm91dGluZTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCVdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJdXBkYXRlKCksICBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MuCisgKgorICogUHVycG9zZToJVG8gcHJvdmlkZSBkZWJ1Z2dpbmcgYW5kIHN0YXRpdGljYWwKKyAqICAgICAgICAgICAgICBpbmZvcm1hdGlvbiB0byB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uCisgKiAgICAgICAgICAgICAgL3Byb2MvbmV0L3dhbnJvdXRlci93YW5waXBlIworICogICAgICAgICAgICAgIAkKKyAqIFJhdGlvbmFsZToJVGhlIC9wcm9jIGZpbGUgc3lzdGVtIGlzIHVzZWQgdG8gY29sbGVjdAorICogICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXJuZWwgYW5kIGRyaXZlcnMuCisgKiAgICAgICAgICAgICAgVXNpbmcgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIHRoZSB1c2VyCisgKiAgICAgICAgICAgICAgY2FuIHNlZSBleGFjdGx5IHdoYXQgdGhlIHNhbmdvbWEgZHJpdmVycyBhcmUKKyAqICAgICAgICAgICAgICBkb2luZy4gQW5kIGluIHdoYXQgc3RhdGUgdGhleSBhcmUgaW4uIAorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjogQ29sbGVjdCBhbGwgZHJpdmVyIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgYW5kIHBhc3MgaXQgdG8gdGhlIHRvcCBsYXl3ZXIuIAorICoJCQorICoJCVNpbmNlIHdlIGhhdmUgdG8gZXhlY3V0ZSBhIGRlYnVnZ2luZyBjb21tYW5kLCAKKyAqICAgICAgICAgICAgICB0byBvYnRhaW4gZmlybXdhcmUgc3RhdGl0aWNzLCB3ZSB0cmlnZ2VyIGEgCisgKiAgICAgICAgICAgICAgVVBEQVRFIGZ1bmN0aW9uIHdpdGhpbiB0aGUgdGltZXIgaW50ZXJydHVwLgorICogICAgICAgICAgICAgIFdlIHdhaXQgdW50aWwgdGhlIHRpbWVyIHVwZGF0ZSBpcyBjb21wbGV0ZS4KKyAqICAgICAgICAgICAgICBPbmNlIGNvbXBsZXRlIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmV0dXJuCisgKiAgICAgICAgICAgICAgY29kZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwuCisgKiAgICAgICAgICAgICAgCisgKiBDYWxsZWQgYnk6CWRldmljZV9zdGF0KCkgaW4gd2FubWFpbi5jCisgKgorICogQXNzdW1wdGlvbnM6CQorICoKKyAqIFdhcm5pbmdzOglUaGlzIGZ1bmN0aW9uIHdpbGwgZGVncmFkZSB0aGUgcGVyZm9ybWFuY2UKKyAqICAgICAgICAgICAgICBvZiB0aGUgcm91dGVyLCBzaW5jZSBpdCB1c2VzIHRoZSBtYWlsYm94LiAKKyAqCisgKiBSZXR1cm46IAkwIAlPSworICogCQk8MAlGYWlsZWQgKG9yIGJ1c3kpLgorICovCisKK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpCit7CisJdm9sYXRpbGUgc2RsYV90KiBjYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKCF3YW5kZXYtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKwl0aW1lb3V0ID0gamlmZmllczsJCisKKwlmb3IgKDs7KXsKKwkJaWYgKCEoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkpewkKKwkJCWJyZWFrOworCQl9CisJCWlmICgoamlmZmllcy10aW1lb3V0KSA+IDEqSFopeworCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOgluZXdfaWYKKyAqCisgKiBQdXJwb3NlOglUbyBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSByZXNvdXJjZXMgZm9yIGEgCisgKiAgICAgICAgICAgICAgbmV3IGxvZ2ljYWwgY2hhbm5lbC4gIAorICogCisgKiBSYXRpb25hbGU6CUEgbmV3IGNoYW5uZWwgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IHZpYQorICogICAgICAgICAgICAgIGlvY3RsIGNhbGwuCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglBbGxvY2F0ZSBhIHByaXZhdGUgY2hhbm5lbCBzdHJ1Y3R1cmUsIHgyNV9jaGFubmVsX3QuCisgKgkJUGFyc2UgdGhlIHVzZXIgaW50ZXJmYWNlIG9wdGlvbnMgZnJvbSB3YW5waXBlIy5jb25mIAorICoJCWNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKgkJQmluZCB0aGUgcHJpdmF0ZSBhcmUgaW50byB0aGUgbmV0d29yayBkZXZpY2UgcHJpdmF0ZQorICogICAgICAgICAgICAgIGFyZWEgcG9pbnRlciAoZGV2LT5wcml2KS4KKyAqCQlQcmVwYXJlIHRoZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBDYWxsZWQgYnk6CVJPVVRFUl9JRk5FVyBJb2N0bCBjYWxsLCBmcm9tIHdhbnJvdXRlcl9pb2N0bCgpIAorICogICAgICAgICAgICAgICh3YW5tYWluLmMpCisgKgorICogQXNzdW1wdGlvbnM6IE5vbmUKKyAqCisgKiBXYXJuaW5nczoJTm9uZQorICoKKyAqIFJldHVybjogCTAgCU9rCisgKgkJPDAgCUZhaWxlZCAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKQorICovCitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJeDI1X2NoYW5uZWxfdCogY2hhbjsKKwlpbnQgZXJyID0gMDsKKworCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBpbnRlcmZhY2UgbmFtZSFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQrKyA+IDAgJiYgY2FyZC0+dS54LkxBUEJfaGRsYykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3I6IFJ1bm5pbmcgTEFQQiBIRExDIE1vZGUgIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBNYXhpbXVtIG51bWJlciBvZiBuZXR3b3JrIGludGVyZmFjZXMgbXVzdCBiZSBvbmUgIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KKwljaGFuID0ga21hbGxvYyhzaXplb2YoeDI1X2NoYW5uZWxfdCksIEdGUF9BVE9NSUMpOworCWlmIChjaGFuID09IE5VTEwpeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJbWVtc2V0KGNoYW4sIDAsIHNpemVvZih4MjVfY2hhbm5lbF90KSk7CisKKwkvKiBCdWcgRml4OiBTZWcgRXJyIG9uIFBWQyBzdGFydHVwCisJICogSXQgbXVzdCBiZSBoZXJlIHNpbmNlIGJpbmRfbGNuX3RvX2RldiBleHBlY3RzIAorCSAqIGl0IGJlbGxvdyAqLworCWRldi0+cHJpdiA9IGNoYW47CisJCisJc3RyY3B5KGNoYW4tPm5hbWUsIGNvbmYtPm5hbWUpOworCWNoYW4tPmNhcmQgPSBjYXJkOworCWNoYW4tPmRldiA9IGRldjsKKwljaGFuLT5jb21tb24uc2sgPSBOVUxMOworCWNoYW4tPmNvbW1vbi5mdW5jID0gTlVMTDsKKwljaGFuLT5jb21tb24ucndfYmluZCA9IDA7CisJY2hhbi0+dHhfc2tiID0gY2hhbi0+cnhfc2tiID0gTlVMTDsKKworCS8qIHZlcmlmeSBtZWRpYSBhZGRyZXNzICovCisJaWYgKGNvbmYtPmFkZHJbMF0gPT0gJ0AnKXsJCS8qIFNWQyAqLworCQljaGFuLT5jb21tb24uc3ZjID0gMTsKKwkJc3RybmNweShjaGFuLT5hZGRyLCAmY29uZi0+YWRkclsxXSwgV0FOX0FERFJFU1NfU1opOworCisJCS8qIFNldCBjaGFubmVsIHRpbWVvdXRzIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQpICovCisJCWNoYW4tPmlkbGVfdGltZW91dCA9IChjb25mLT5pZGxlX3RpbWVvdXQpID8gCisJCQkJCWNvbmYtPmlkbGVfdGltZW91dCA6IDkwOworCQljaGFuLT5ob2xkX3RpbWVvdXQgPSAoY29uZi0+aG9sZF90aW1lb3V0KSA/IAorCQkJCQljb25mLT5ob2xkX3RpbWVvdXQgOiAxMDsKKworCX1lbHNlIGlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSl7CS8qIFBWQyAqLworCQlpbnQgbGNuID0gZGVjX3RvX3VpbnQoY29uZi0+YWRkciwgMCk7CisKKwkJaWYgKChsY24gPj0gY2FyZC0+dS54LmxvX3B2YykgJiYgKGxjbiA8PSBjYXJkLT51LnguaGlfcHZjKSl7CisJCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbGNuKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IFBWQyAldSBpcyBvdXQgb2YgcmFuZ2Ugb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGxjbiwgY2hhbi0+bmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBpbnZhbGlkIG1lZGlhIGFkZHJlc3Mgb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBXQU5QSVBFIG1vZGUgJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworICAgICAgICAgICAgICAgIGNoYW4tPmNvbW1vbi51c2VkYnkgPSBXQU5QSVBFOworCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKworICAgICAgICB9ZWxzZSBpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiQVBJIikgPT0gMCl7CisJCWNoYW4tPmNvbW1vbi51c2VkYnkgPSBBUEk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gQVBJIG1vZGUgJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKFgyNV9QUk9UKTsKKwl9CisKKworCWlmIChlcnIpeworCQlrZnJlZShjaGFuKTsKKwkJZGV2LT5wcml2ID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJY2hhbi0+ZW5hYmxlX0lQWCA9IGNvbmYtPmVuYWJsZV9JUFg7CisJCisJaWYgKGNoYW4tPmVuYWJsZV9JUFgpCisJCWNoYW4tPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBYKTsKKwkKKwlpZiAoY29uZi0+bmV0d29ya19udW1iZXIpCisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJZWxzZQorCQljaGFuLT5uZXR3b3JrX251bWJlciA9IDB4REVBREJFRUY7CisKKwkvKiBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIGRhdGEgc3BhY2UgZm9yIHJlZ2lzdHJhdGlvbiAqLworCXN0cmNweShkZXYtPm5hbWUsY2hhbi0+bmFtZSk7CisKKwlkZXYtPmluaXQgPSAmaWZfaW5pdDsKKworCWluaXRfeDI1X2NoYW5uZWxfc3RydWN0KGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJZGVsX2lmKCksICBSZW1vdmUgYSBsb2dpY2FsIGNoYW5uZWwuCSAKKyAqCisgKiBQdXJwb3NlOglUbyBkeW5hbWljYWxseSByZW1vdmUgYSBsb2dpY2FsIGNoYW5uZWwuCisgKiAKKyAqIFJhdGlvbmFsZToJRWFjaCBsb2dpY2FsIGNoYW5uZWwgc2hvdWxkIGJlIGR5bmFtaWNhbGx5CisgKiAgICAgICAgICAgICAgcmVtb3ZhYmxlLiBUaGlzIGZ1bmN0aW4gaXMgY2FsbGVkIGJ5IGFuIAorICogICAgICAgICAgICAgIElPQ1RMX0lGREVMIGlvY3RsIGNhbGwgb3Igc2h1dGRvd24oKS4gCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOiBEbyBub3RoaW5nLgorICoKKyAqIENhbGxlZCBieToJSU9DVExfSUZERUwgOiB3YW5yb3V0ZXJfaW9jdGwoKSBmcm9tIHdhbm1haW4uYworICogICAgICAgICAgICAgIHNodXRkb3duKCkgZnJvbSBzZGxhbWFpbi5jCisgKgorICogQXNzdW1wdGlvbnM6IAorICoKKyAqIFdhcm5pbmdzOgorICoKKyAqIFJldHVybjogCTAgT2suIFZvaWQgZnVuY3Rpb24uCisgKi8KKworLy9GSVhNRSBEZWwgSUYgU2hvdWxkIGJlIHRha2VuIG91dCBub3cuCisKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CXdweF9leGVjCisgKgorICogRGVzY3JpcHRpb246CUV4ZWN1dGUgYWRhcHRlciBpbnRlcmZhY2UgY29tbWFuZC4KKyAqIAkJVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IGRpc3NhYmxlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHdweF9leGVjIChzdHJ1Y3Qgc2RsYSogY2FyZCwgdm9pZCogdV9jbWQsIHZvaWQqIHVfZGF0YSkKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglkaXNhYmxlX2NvbW0JCisgKgorICogRGVzY3JpcHRpb246CURpc2FibGUgY29tbXVuaWNhdGlvbnMgZHVyaW5nIHNodXRkb3duLgorICogICAgICAgICAgICAgIERvbnQgY2hlY2sgcmV0dXJuIGNvZGUgYmVjYXVzZSB0aGVyZSBpcyAKKyAqICAgICAgICAgICAgICBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdC4gIAorICoKKyAqIFdhcm5pbmc6CURldiBhbmQgcHJpdmF0ZSBhcmVhcyBhcmUgZ29uZSBhdCB0aGlzIHBvaW50LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbShzZGxhX3QqIGNhcmQpCit7CisJZGlzYWJsZV9jb21tX3NodXRkb3duKGNhcmQpOworCWRlbF90aW1lcigmY2FyZC0+dS54LngyNV90aW1lcik7CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKglOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglpZl9pbml0KCksICAgTmV0b3dyayBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24gCSAKKyAqCisgKiBQdXJwb3NlOglUbyBpbml0aWFsaXplIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIAorICogUmF0aW9uYWxlOglEdXJpbmcgbmV0d29yayBpbnRlcmZhY2Ugc3RhcnR1cCwgdGhlIGlmX2luaXQKKyAqICAgICAgICAgICAgICBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZQorICogICAgICAgICAgICAgIG5ldG93cmsgZGV2aWNlIHN0cnVjdHVyZS4gIFRodXMgYSBkcml2ZXIKKyAqICAgICAgICAgICAgICBjYW4gY3VzdG9temUgYSBuZXR3b3JrIGRldmljZS4gCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglJbml0aWFsaXplIHRoZSBuZXRvd3JrIGRldmljZSBjYWxsIGJhY2sKKyAqICAgICAgICAgICAgICByb3V0aW5lcy4gIFRoaXMgaXMgd2hlcmUgd2UgdGVsbCB0aGUga2VybmVsCisgKiAgICAgICAgICAgICAgd2hpY2ggZnVuY3Rpb24gdG8gdXNlIHdoZW4gaXQgd2FudHMgdG8gc2VuZAorICogICAgICAgICAgICAgIHZpYSBvdXIgaW50ZXJmYWNlLiAKKyAqCQlGdXJ0aGVybW9yZSwgd2UgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGZsYWdzLCAKKyAqICAgICAgICAgICAgICBNVFUgYW5kIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvYXJkLgorICoKKyAqIENhbGxlZCBieToJS2VybmVsICgvdXNyL3NyYy9saW51eC9uZXQvY29yZS9kZXYuYykKKyAqIAkJKGRldi0+aW5pdCgpKQorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sgOiBWb2lkIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9ICZpZl9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisKKwkvKiBJbml0aWFsaXplIG1lZGlhLXNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1BQUDsJCS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlkZXYtPm10dQk9IFgyNV9DSEFOX01UVStzaXplb2YoeDI1YXBpX2hkcl90KTsKKwl9ZWxzZXsKKwkJZGV2LT5tdHUJPSBjYXJkLT53YW5kZXYubXR1OyAJCisJfQorCQorCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gWDI1X0hSREhEUl9TWjsgLyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCWRldi0+YWRkcl9sZW4JCT0gMjsJCS8qIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJCisJaWYgKCFjaGFuLT5jb21tb24uc3ZjKXsKKwkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmNvbW1vbi5sY24pOworCX0KKwkKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKGp1c3QgZm9yIHJlZmVyZW5jZSkgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9ICh1bnNpZ25lZCBsb25nKXdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisgICAgICAgIC8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisgICAgICAgIGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIEZJWE1FIFdoeSBhcmUgd2UgZG9pbmcgdGhpcyAqLworCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglpZl9vcGVuKCksICAgT3Blbi9CcmluZyB1cCB0aGUgTmV0b3dyayBJbnRlcmZhY2UgCisgKgorICogUHVycG9zZToJVG8gYnJpbmcgdXAgYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAorICogUmF0aW9uYWxlOgkKKyAqICAgICAgICAgICAgICAgIAorICogRGVzY3JpcHRpb246CU9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiAJCW8gcHJldmVudCBtb2R1bGUgZnJvbSB1bmxvYWRpbmcgYnkgaW5jcmVtZW50aW5nIHVzZSBjb3VudAorICogCQlvIGlmIGxpbmsgaXMgZGlzY29ubmVjdGVkIHRoZW4gaW5pdGlhdGUgY29ubmVjdGlvbgorICoKKyAqIENhbGxlZCBieToJS2VybmVsICgvdXNyL3NyYy9saW51eC9uZXQvY29yZS9kZXYuYykKKyAqIAkJKGRldi0+b3BlbigpKQorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sKKyAqIAkJPDAgCUZhaWx1cmU6IEludGVyZmFjZSB3aWxsIG5vdCBjb21lIHVwLgorICovCisKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwkKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2hhbi0+dHFfd29ya2luZyA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSB3b3JrcXVldWUgKi8KKwlJTklUX1dPUksoJmNoYW4tPmNvbW1vbi53YW5waXBlX3dvcmssICh2b2lkICopeDI1YXBpX2JoLCBkZXYpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgQkggY2lyY3VsYXIgYnVmZmVyICovCisJLyogQWRkIDEgdG8gTUFYX0JIX0JVRkYgc28gd2UgZG9uJ3QgaGF2ZSB0ZXN0IHdpdGggKE1BWF9CSF9CVUZGLTEpICovCisJY2hhbi0+YmhfaGVhZCA9IGttYWxsb2MoKHNpemVvZihiaF9kYXRhX3QpKihNQVhfQkhfQlVGRisxKSksR0ZQX0FUT01JQyk7CisKKwlpZiAoY2hhbi0+YmhfaGVhZCA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SLCBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICEgQkhfQlVGRkVSUyAhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNoYW4tPmJoX2hlYWQsMCwoc2l6ZW9mKGJoX2RhdGFfdCkqKE1BWF9CSF9CVUZGKzEpKSk7CisJYXRvbWljX3NldCgmY2hhbi0+YmhfYnVmZl91c2VkLCAwKTsKKworCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGludGVyZmFjZXMgKi8KKwkrK2NhcmQtPnUueC5ub19kZXY7CisJCisJd2FucGlwZV9vcGVuKGNhcmQpOworCisJLyogTEFQQiBwcm90b2NvbCBvbmx5IHVzZXMgb25lIGludGVyZmFjZSwgdGh1cworCSAqIHN0YXJ0IHRoZSBwcm90b2NvbCBhZnRlciBpdCBjb21lcyB1cC4gKi8KKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCWlmIChjYXJkLT5vcGVuX2NudCA9PSAxKXsKKwkJCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCQkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCQl4MjVfc2V0X2ludHJfbW9kZShjYXJkLCBJTlRSX09OX1RJTUVSKTsgCisJCQlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RJTUVSOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwkJfQorCX1lbHNleworCQkvKiBYMjUgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJmYWNlcyB0aHVzLCBzdGFydCB0aGUgCisJCSAqIHByb3RvY29sIG9uY2UgYWxsIGludGVyZmFjZXMgYXJlIHVwICovCisKKwkJLy9GSVhNRTogVGhlcmUgaXMgYSBidWcgaGVyZS4gSWYgaW50ZXJmYWNlIGlzCisJCS8vYnJvdWdodCBkb3duIGFuZCB1cCwgaXQgd2lsbCB0cnkgdG8gZW5hYmxlIGNvbW0uCisJCWlmIChjYXJkLT5vcGVuX2NudCA9PSBjYXJkLT51LngubnVtX29mX2NoKXsKKworCQkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCQljb25uZWN0KGNhcmQpOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKworCQkJbW9kX3RpbWVyKCZjYXJkLT51LngueDI1X3RpbWVyLCBqaWZmaWVzICsgSFopOworCQl9CisJfQorCS8qIERldmljZSBpcyBub3QgdXAgdW50aWwgdGhlIHdlIGFyZSBpbiBjb25uZWN0ZWQgc3RhdGUgKi8KKwlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCWNoYW4tPnJvdXRlcl9zdGFydF90aW1lID0gdHYudHZfc2VjOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CWlmX2Nsb3NlKCksICAgQ2xvc2UvQnJpbmcgZG93biB0aGUgTmV0b3dyayBJbnRlcmZhY2UgCisgKgorICogUHVycG9zZToJVG8gYnJpbmcgZG93biBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogCisgKiBSYXRpb25hbGU6CQorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjoJQ2xvc2UgbmV0d29yayBpbnRlcmZhY2UuCisgKiAJCW8gZGVjcmVtZW50IHVzZSBtb2R1bGUgdXNlIGNvdW50CisgKgorICogQ2FsbGVkIGJ5OglLZXJuZWwgKC91c3Ivc3JjL2xpbnV4L25ldC9jb3JlL2Rldi5jKQorICogCQkoZGV2LT5jbG9zZSgpKQorICoJCWlmY29uZmlnIDxuYW1lPiBkb3duOiB3aWxsIHRyaWdnZXIgdGhlIGtlcm5lbAorICogICAgICAgICAgICAgIHdoaWNoIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sKKyAqIAkJPDAgCUZhaWx1cmU6IEludGVyZmFjZSB3aWxsIG5vdCBleGl0IHByb3Blcmx5LgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNURUQpIHx8IAorCSAgICAoY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNUSU5HKSl7CisJCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQljaGFuX2Rpc2MoZGV2KTsKKwkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwl9CisKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCisJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJaWYgKGNoYW4tPmJoX2hlYWQpeworCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkKKwkJZm9yIChpPTA7IGk8KE1BWF9CSF9CVUZGKzEpOyBpKyspeworCQkJc2tiID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtpXSktPnNrYjsKKwkJCWlmIChza2IgIT0gTlVMTCl7CisgICAgICAgICAgICAgICAgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfQorCQl9CisJCWtmcmVlKGNoYW4tPmJoX2hlYWQpOworCQljaGFuLT5iaF9oZWFkPU5VTEw7CisJfQorCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlLCBkaXNjb25uZWN0IHBoeXNpY2FsIGxpbmsgKi8KKwlpZiAoIWNhcmQtPm9wZW5fY250KXsKKwkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCWRpc2Nvbm5lY3QoY2FyZCk7CisJCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIDApOworCQlTNTA4X1M1MTRfdW5sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCX0KKwkKKwkvKiBEZWNyZW1lbnQgdGhlIG51bWJlciBvZiBpbnRlcmZhY2VzICovCisJLS1jYXJkLT51Lngubm9fZGV2OworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlCdWlsZCBtZWRpYSBoZWFkZXIuCisgKiAJbyBlbmNhcHN1bGF0ZSBwYWNrZXQgYWNjb3JkaW5nIHRvIGVuY2Fwc3VsYXRpb24gdHlwZS4KKyAqCisgKiAJVGhlIHRyaWNrIGhlcmUgaXMgdG8gcHV0IHBhY2tldCB0eXBlIChFdGhlcnR5cGUpIGludG8gJ3Byb3RvY29sJyAKKyAqICAgICAgZmllbGQgb2YgdGhlIHNvY2tldCBidWZmZXIsIHNvIHRoYXQgd2UgZG9uJ3QgZm9yZ2V0IGl0LiAgCisgKiAgICAgIElmIGVuY2Fwc3VsYXRpb24gZmFpbHMsIHNldCBza2ItPnByb3RvY29sIHRvIDAgYW5kIGRpc2NhcmQgCisgKiAgICAgIHBhY2tldCBsYXRlci4KKyAqCisgKiAJUmV0dXJuOgkJbWVkaWEgaGVhZGVyIGxlbmd0aC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWZfaGVhZGVyKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCogZGFkZHIsIHZvaWQqIHNhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxlbikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCWludCBoZHJfbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCWlmICghY2hhbi0+cHJvdG9jb2wpeworCQloZHJfbGVuID0gd2Fucm91dGVyX2VuY2Fwc3VsYXRlKHNrYiwgZGV2LCB0eXBlKTsKKwkJaWYgKGhkcl9sZW4gPCAwKXsKKwkJCWhkcl9sZW4gPSAwOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKDApOworCQl9CisJfQorCXJldHVybiBoZHJfbGVuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiAJUmV0dXJuOgkJMQlwaHlzaWNhbCBhZGRyZXNzIHJlc29sdmVkLgorICoJCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkciAoc3RydWN0IHNrX2J1ZmYqIHNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7IAorCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWJ1aWxkX2hlYWRlcigpIGNhbGxlZCBmb3IgaW50ZXJmYWNlICVzIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3RidXN5X3RpbWVvdXQ7CisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAlvIHNldCB0YnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKS4KKyAqIAlvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIAlvIGNoZWNrIGNoYW5uZWwgc3RhdHVzLiBJZiBpdCdzIGRvd24gdGhlbiBpbml0aWF0ZSBhIGNhbGwuCisgKiAJbyBwYXNzIGEgcGFja2V0IHRvIGNvcnJlc3BvbmRpbmcgV0FOIGRldmljZS4KKyAqIAlvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIAlSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICAJYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAJMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICAJcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwlpbnQgdWRwX3R5cGU7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfZW50cnk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBObyBuZWVkIHRvIGNoZWNrIGZyYW1lIGxlbmd0aCwgc2luY2Ugc29ja2V0IGNvZGUKKyAgICAgICAgICogd2lsbCBwZXJmb3JtIHRoZSBjaGVjayBmb3IgdXMgKi8KKworCWNoYW4tPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisJCisJLyogQ3JpdGljYWwgcmVnaW9uIHN0YXJ0cyBoZXJlICovCisJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICJIaXQgY3JpdGljYWwgaW4gaWZfc2VuZCgpISAlbHhcbiIsY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJZ290byBpZl9zZW5kX2NyaXRfZXhpdDsKKwl9CisJCisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoc2tiLCBjYXJkKTsKKworICAgICAgICBpZih1ZHBfdHlwZSAhPSBVRFBfSU5WQUxJRF9UWVBFKSB7CisKKyAgICAgICAgICAgICAgICBpZihzdG9yZV91ZHBfbWdtdF9wa3QodWRwX3R5cGUsIFVEUF9QS1RfRlJNX1NUQUNLLCBjYXJkLCBkZXYsIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmNvbW1vbi5sY24pKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ZHBfdHlwZSA9PSBVRFBfWFBJUEVfVFlQRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX1BJUEVfcmVxdWVzdCsrOworCQkJfQorICAgICAgICAgICAgICAgCX0KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJY2xlYXJfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkvL0ZJWE1FOiBUaGlzIGNoZWNrIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnkgbW9yZQorCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQkJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoPTA7CisJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJCX1lbHNleworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJKytjYXJkLT51LngudHhfaW50ZXJydXB0c19wZW5kaW5nOworCQkgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9UWF9GUkFNRTsKKwkJCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKXsKKwkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsJCisJCQorCX1lbHNlIGlmICggY2hhbi0+cHJvdG9jb2wgJiYgKGNoYW4tPnByb3RvY29sICE9IHNrYi0+cHJvdG9jb2wpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiB1bnN1cHBvcnRlZCBFdGhlcnR5cGUgMHglMDRYIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQljaGFuLT5uYW1lLCBodG9ucyhza2ItPnByb3RvY29sKSwgZGV2LT5uYW1lKTsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIlBST1RPICVYbiIsIGh0b25zKGNoYW4tPnByb3RvY29sKSk7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9lcnJvcnM7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3Byb3RvY29sX2Vycm9yOworCQkKKwl9ZWxzZSBzd2l0Y2ggKGNoYW4tPmNvbW1vbi5zdGF0ZSl7CisKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJLyogVHJ5IHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLiBJZiBzdWNjZWRlZCwgdGhlbiBzdGFydAorCQkJICogdHJhbnNtaXNzaW9uLCBlbHNlIGRyb3AgYSBwYWNrZXQuCisJCQkgKi8KKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQlicmVhazsKKwkJCX1lbHNleworCQkJCWlmIChjaGFuX2Nvbm5lY3QoZGV2KSAhPSAwKXsKKwkJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCWlmKCBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQWCkpIHsKKwkJCQlpZihjaGFuLT5lbmFibGVfSVBYKSB7CisJCQkJCXN3aXRjaF9uZXRfbnVtYmVycyggc2tiLT5kYXRhLCAKKwkJCQkJCWNoYW4tPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9wcm90b2NvbF9lcnJvcjsKKwkJCQkJZ290byBpZl9zZW5kX2NyaXRfZXhpdDsKKwkJCQl9CisJCQl9CisJCQkvKiBXZSBuZXZlciBkcm9wIGhlcmUsIGlmIGNhbm5vdCBzZW5kIHRoYW4sIGNvcHkKKwkgICAgICAgICAgICAgICAgICogYSBwYWNrZXQgaW50byBhIHRyYW5zbWl0IGJ1ZmZlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJY2hhbl9zZW5kKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgMCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CQorCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCWJyZWFrOworCX0KKworCitpZl9zZW5kX2NyaXRfZXhpdDoKKwkKKyAgICAgICAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJY2xlYXJfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXR1cCBzbyB0aGF0IGEgZnJhbWUgY2FuIGJlIHRyYW5zbWl0dGVkIG9uIHRoZSBvY2N1cnJlbmNlIG9mIGEgdHJhbnNtaXQKKyAqIGludGVycnVwdC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdm9pZCogYnVmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsZW4pCit7CisgICAgICAgIHgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisgICAgICAgIHNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2FkcHRyX2JmcnNfZnVsbDsKKworICAgICAgICBpZihjaGFuLT50cmFuc21pdF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIHRyYW5zbWl0IGxlbmd0aCBzZXQgaW4gZGVsYXllZCB0cmFuc21pdCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlpZiAobGVuID4gWDI1X0NIQU5fTVRVK3NpemVvZih4MjVhcGlfaGRyX3QpKSB7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsJCisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExlbmd0aCBpcyB0b28gYmlnIGZvciBkZWxheWVkIHRyYW5zbWl0XG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfWVsc2V7CisJCWlmIChsZW4gPiBYMjVfTUFYX0RBVEEpIHsKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOwkKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGVuZ3RoIGlzIHRvbyBiaWcgZm9yIGRlbGF5ZWQgdHJhbnNtaXRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKyAgICAgICAgY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gbGVuOworCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5kcml2ZXJfYnVzeSwxKTsKKyAgICAgICAgbWVtY3B5KGNoYW4tPnRyYW5zbWl0X2J1ZmZlciwgYnVmLCBsZW4pOworCisJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90eF9pbnRfZW5hYmxlZDsKKworCS8qIEVuYWJsZSBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKwkrK2NhcmQtPnUueC50eF9pbnRlcnJ1cHRzX3BlbmRpbmc7CisgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9UWF9GUkFNRTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogbmV0X2RldmljZV9zdGF0cworICoKKyAqIAlHZXQgZXRoZXJuZXQtc3R5bGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKiAJUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZihjaGFuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZjaGFuLT5pZnN0YXRzOworfQorCisKKy8qCisgKglJbnRlcnJ1cHQgSGFuZGxlcnMgCisgKi8KKworLyoKKyAqIFguMjUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZCB3cHhfaXNyIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwljYXJkLT5pbl9pc3IgPSAxOworCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWNhcmQtPmluX2lzcj0wOworCQlzdGF0dXMtPmlmbGFncyA9IDA7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHRlc3RfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKworIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdweF9pc3I6IHdhbmRldi5jcml0aWNhbCBzZXQgdG8gMHglMDJseCwgaW50IHR5cGUgPSAweCUwMnhcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmNyaXRpY2FsLCBzdGF0dXMtPmlmbGFncyk7CisJCWNhcmQtPmluX2lzciA9IDA7CisJCXN0YXR1cy0+aWZsYWdzID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIEZvciBhbGwgaW50ZXJydXB0cyBzZXQgdGhlIGNyaXRpY2FsIGZsYWcgdG8gQ1JJVElDQUxfUlhfSU5UUi4KKyAgICAgICAgICogSWYgdGhlIGlmX3NlbmQgcm91dGluZSBpcyBjYWxsZWQgd2l0aCB0aGlzIGZsYWcgc2V0IGl0IHdpbGwgc2V0CisgICAgICAgICAqIHRoZSBlbmFibGUgdHJhbnNtaXQgZmxhZyB0byAxLiAoZm9yIGEgZGVsYXllZCBpbnRlcnJ1cHQpCisgICAgICAgICAqLworCXN3aXRjaCAoc3RhdHVzLT5pZmxhZ3MpeworCisJCWNhc2UgUlhfSU5UUl9QRU5ESU5HOgkJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJCXJ4X2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFRYX0lOVFJfUEVORElORzoJCS8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCQkJdHhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERU1fSU5UUl9QRU5ESU5HOgkvKiBtb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCisJCQlzdGF0dXNfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWDI1X0FTWV9UUkFOU19JTlRSX1BFTkRJTkc6CS8qIG5ldHdvcmsgZXZlbnQgaW50ZXJydXB0ICovCisJCQlldmVudF9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSU1FUl9JTlRSX1BFTkRJTkc6CisJCQl0aW1lcl9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJCS8qIHVud2FudGVkIGludGVycnVwdCAqLworCQkJc3B1cl9pbnRyKGNhcmQpOworCX0KKworCWNhcmQtPmluX2lzciA9IDA7CisJc3RhdHVzLT5pZmxhZ3MgPSAwOwkvKiBjbGVhciBpbnRlcnJ1cHQgY29uZGl0aW9uICovCit9CisKKy8qCisgKiAJUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIAlUaGlzIHJvdXRpbmUgaGFuZGxlcyBmcmFnbWVudGVkIElQIHBhY2tldHMgdXNpbmcgTS1iaXQgYWNjb3JkaW5nIHRvIHRoZQorICogCVJGQzEzNTYuCisgKiAJbyBtYXAgbGlnaWNhbCBjaGFubmVsIG51bWJlciB0byBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAlvIGFsbG9jYXRlIHNvY2tldCBidWZmZXIgb3IgYXBwZW5kIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgZXhpc3Rpbmcgb25lLgorICogCW8gaWYgTS1iaXQgaXMgcmVzZXQgKGkuZS4gaXQncyB0aGUgbGFzdCBwYWNrZXQgaW4gYSBzZXF1ZW5jZSkgdGhlbiAKKyAqICAgCWRlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBzb2NrZXQgYnVmZmVyIHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gV2hlbiBhbGxvY2F0aW5nIGEgc29ja2V0IGJ1ZmZlciwgaWYgTS1iaXQgaXMgc2V0IHRoZW4gbW9yZSBkYXRhIGlzCisgKiAgICAJY29taW5nIGFuZCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG1heGltdW0gSVAgcGFja2V0IHNpemUKKyAqICAgIAlleHBlY3RlZCBvbiB0aGlzIGNoYW5uZWwuCisgKiAJMi4gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgYW5kIFguMjUgcGFja2V0IGhhcyB0byBiZSBkcm9wcGVkIChlLmcuIG5vCisgKiAgICAJc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlKSB0aGUgd2hvbGUgcGFja2V0IHNlcXVlbmNlIG11c3QgYmUgZGlzY2FyZGVkLgorICovCisKK3N0YXRpYyB2b2lkIHJ4X2ludHIgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogcnhtYiA9IGNhcmQtPnJ4bWI7CisJdW5zaWduZWQgbGNuID0gcnhtYi0+Y21kLmxjbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsbGNuKTsKKwl4MjVfY2hhbm5lbF90KiBjaGFuOworCXN0cnVjdCBza19idWZmKiBza2I9TlVMTDsKKworCWlmIChkZXYgPT0gTlVMTCl7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmluZyBvbiBvcnBoYW5lZCBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbGNuKTsKKwkJcmV0dXJuOworCX0KKworCWNoYW4gPSBkZXYtPnByaXY7CisJY2hhbi0+aV90aW1lb3V0X3NvZmFyID0gamlmZmllczsKKworCisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBib2FyZCwgaW50byBhbgorICAgICAgICAgKiBza2IgYnVmZmVyIAorCSAqLworCWlmICh3YW5waXBlX3B1bGxfZGF0YV9pbl9za2IoY2FyZCxkZXYsJnNrYikpeworCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJKytjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9ub19zb2NrZXQ7CisJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwkJLyogdGltZXN0YW1wICovCisKKworCS8qIC0tLS0tLS0tLS0tLSBBUEkgLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCisJCWlmIChiaF9lbnF1ZXVlKGRldiwgc2tiKSl7CisJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybjsKKwkJfQkJCisKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CisJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQorCisJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZykpeworCQkJd2FucGlwZV9xdWV1ZV93b3JrKCZjaGFuLT5jb21tb24ud2FucGlwZV93b3JrKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisKKwkvKiAtLS0tLS0tLS0tLS0tIFdBTlBJUEUgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCisJLyogc2V0IHJ4X3NrYiB0byBOVUxMIHNvIHdlIHdvbid0IGFjY2VzcyBpdCBsYXRlciB3aGVuIGtlcm5lbCBhbHJlYWR5IG93bnMgaXQgKi8KKwljaGFuLT5yeF9za2I9TlVMTDsKKwkKKwkvKiBEZWNhcHN1bGF0ZSBwYWNrZXQsIGlmIG5lY2Vzc2FyeSAqLworCWlmICghc2tiLT5wcm90b2NvbCAmJiAhd2Fucm91dGVyX3R5cGVfdHJhbnMoc2tiLCBkZXYpKXsKKwkJLyogY2FuJ3QgZGVjYXBzdWxhdGUgcGFja2V0ICovCisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Vycm9yczsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisKKwl9ZWxzZXsKKwkJaWYoIGhhbmRsZV9JUFhXQU4oc2tiLT5kYXRhLCBjaGFuLT5uYW1lLCAKKwkJCQkgIGNoYW4tPmVuYWJsZV9JUFgsIGNoYW4tPm5ldHdvcmtfbnVtYmVyLCAKKwkJCQkgIHNrYi0+cHJvdG9jb2wpKXsKKworCQkJaWYoIGNoYW4tPmVuYWJsZV9JUFggKXsKKwkJCQlpZihjaGFuX3NlbmQoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLDApKXsKKwkJCQkJY2hhbi0+dHhfc2tiID0gc2tiOworCQkJCX1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJLyogaW5jcmVtZW50IElQWCBwYWNrZXQgZHJvcHBlZCBzdGF0aXN0aWMgKi8KKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJfQorCQl9ZWxzZXsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkrK2NoYW4tPmlmc3RhdHMucnhfcGFja2V0czsKKwkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX3Bhc3NlZF90b19zdGFjazsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0KKwl9CisJCisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgd2FucGlwZV9wdWxsX2RhdGFfaW5fc2tiKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKipza2IpCit7CisJdm9pZCAqYnVmcHRyOworCVRYMjVNYm94KiByeG1iID0gY2FyZC0+cnhtYjsKKwl1bnNpZ25lZCBsZW4gPSByeG1iLT5jbWQubGVuZ3RoOwkvKiBwYWNrZXQgbGVuZ3RoICovCisJdW5zaWduZWQgcWRtID0gcnhtYi0+Y21kLnFkbTsJCS8qIFEsRCBhbmQgTSBiaXRzICovCisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9ICpza2I7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJaWYgKGNoYW4tPmRyb3Bfc2VxdWVuY2UpeworCQkJaWYgKCEocWRtICYgMHgwMSkpeyAKKwkJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMDsKKwkJCX0KKwkJCXJldHVybiAxOworCQl9CisJCW5ld19za2IgPSBjaGFuLT5yeF9za2I7CisJfWVsc2V7CisJCS8qIEFkZCBvbiB0aGUgQVBJIGhlYWRlciB0byB0aGUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgKiBkYXRhIAorCQkgKi8KKwkJbGVuICs9IHNpemVvZih4MjVhcGlfaGRyX3QpOworCX0KKworCWlmIChuZXdfc2tiID09IE5VTEwpeworCQlpbnQgYnVmc2l6ZTsKKworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJCWJ1ZnNpemUgPSAocWRtICYgMHgwMSkgPyBkZXYtPm10dSA6IGxlbjsKKwkJfWVsc2V7CisJCQlidWZzaXplID0gbGVuOworCQl9CisKKwkJLyogQWxsb2NhdGUgbmV3IHNvY2tldCBidWZmZXIgKi8KKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IoYnVmc2l6ZSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJaWYgKG5ld19za2IgPT0gTlVMTCl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOwkvKiBzZXQgZmxhZyAqLworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChza2JfdGFpbHJvb20obmV3X3NrYikgPCBsZW4peworCQkvKiBObyByb29tIGZvciB0aGUgcGFja2V0LiBDYWxsIG9mZiB0aGUgd2hvbGUgdGhpbmchICovCisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkobmV3X3NrYik7CisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpeworCQkJY2hhbi0+cnhfc2tiID0gTlVMTDsKKwkJCWlmIChxZG0gJiAweDAxKXsgCisJCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDE7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlICIKKwkJCSJvbiBpbnRlcmZhY2UgJXMhXG4iLCBjYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuIDE7CisJfQorCisJYnVmcHRyID0gc2tiX3B1dChuZXdfc2tiLGxlbik7CisKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCS8qIEZpbGwgaW4gdGhlIHgyNWFwaSBoZWFkZXIgCisJCSAqLworCQl4MjVhcGlfdCAqIGFwaV9kYXRhID0gKHgyNWFwaV90KilidWZwdHI7CisJCWFwaV9kYXRhLT5oZHIucWRtID0gcnhtYi0+Y21kLnFkbTsKKwkJYXBpX2RhdGEtPmhkci5jYXVzZSA9IHJ4bWItPmNtZC5jYXVzZTsKKwkJYXBpX2RhdGEtPmhkci5kaWFnbiA9IHJ4bWItPmNtZC5kaWFnbjsKKwkJYXBpX2RhdGEtPmhkci5sZW5ndGggPSByeG1iLT5jbWQubGVuZ3RoOworCQltZW1jcHkoYXBpX2RhdGEtPmRhdGEsIHJ4bWItPmRhdGEsIHJ4bWItPmNtZC5sZW5ndGgpOworCX1lbHNleworCQltZW1jcHkoYnVmcHRyLCByeG1iLT5kYXRhLCBsZW4pOworCX0KKworCW5ld19za2ItPmRldiA9IGRldjsKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCW5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKFgyNV9QUk9UKTsKKwkJbmV3X3NrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0RBVEE7CisJfWVsc2V7CisJCW5ld19za2ItPnByb3RvY29sID0gY2hhbi0+cHJvdG9jb2w7CisJCWNoYW4tPnJ4X3NrYiA9IG5ld19za2I7CisJfQorCisJLyogSWYgcWRtIGJpdCBpcyBzZXQsIG1vcmUgZGF0YSBpcyBjb21pbmcgCisgICAgICAgICAqIHRodXMsIGV4aXQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSBiZWZvcmUKKyAgICAgICAgICogc2VuZGluZyB0aGUgcGFja2V0IHVwLiAoVXNlZCBieSByb3V0ZXIgb25seSkgCisJICovCisJaWYgKChxZG0gJiAweDAxKSAmJiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKSkgCisJCXJldHVybiAxOwkKKworCSpza2IgPSBuZXdfc2tiOyAKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHhfaW50cgorICogIAorICogCVRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLgorICoJRm9yIGVhY2ggZGV2LCBjaGVjayB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyB0byBzZW5kLgorICoJSWYgZGF0YSBhdmFpbGFibGUsIHRyYW5zbWl0LiAJCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0eF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwl1bnNpZ25lZCBjaGFyIG1vcmVfdG9fdHg9MDsKKwl4MjVfY2hhbm5lbF90ICpjaGFuPU5VTEw7CisJaW50IGk9MDsJCisKKwlpZiAoY2FyZC0+dS54LnR4X2RldiA9PSBOVUxMKXsKKwkJY2FyZC0+dS54LnR4X2RldiA9IGNhcmQtPndhbmRldi5kZXY7CisJfQorCisJZGV2ID0gY2FyZC0+dS54LnR4X2RldjsKKworCWZvciAoOzspeworCisJCWNoYW4gPSBkZXYtPnByaXY7CisJCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkJLyogRGV2aWNlIHdhcyBzZXQgdG8gdHJhbnNtaXQsIGNoZWNrIGlmIHRoZSBUWAorICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyBhcmUgYXZhaWxhYmxlIAorCQkJICovCQkKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCQkJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gMDsKKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJCQkJY2hhbi0+dHhfb2Zmc2V0PTA7CisJCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSl7CisJCQkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCQkJd2FrZXVwX3NrX2JoKGRldik7CisJCQkJCX1lbHNleworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCQl9CisJCQkJfQorCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJCWJyZWFrOworCQkJfQkJCQkKKworCQkJaWYgKChzdGF0dXMtPmNmbGFnc1tjaGFuLT5jaF9pZHhdICYgMHg0MCB8fCBjYXJkLT51LnguTEFQQl9oZGxjKSAmJiAKKwkJCSAgICAgKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkgKXsKKwkJCQkvKiBUeCBidWZmZXIgYXZhaWxhYmxlLCB3ZSBjYW4gc2VuZCAqLworCQkJCQorCQkJCWlmICh0eF9pbnRyX3NlbmQoY2FyZCwgZGV2KSl7CisJCQkJCW1vcmVfdG9fdHg9MTsKKwkJCQl9CisKKwkJCQkvKiBJZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBwcmVzZW50LCBtb3ZlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXZpY2UgcG9pbnRlciB0byB0aGUgbmV4dCBpbnRlcmZhY2UsIHNvIG9uIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV4dCBUWCBpbnRlcnJ1cHQgd2Ugd2lsbCB0cnkgc2VuZGluZyBmcm9tIGl0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCQkJYnJlYWs7CisJCQl9ZWxzZXsKKwkJCQkvKiBUeCBidWZmZXJzIG5vdCBhdmFpbGFibGUsIGJ1dCBkZXZpY2Ugc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBUWCBpbnRlcnJ1cHQuICBTZXQgbW9yZV90b190eCBhbmQgdHJ5ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gdHJhbnNtaXQgZm9yIG90aGVyIGRldmljZXMuCisJCQkJICovCisJCQkJbW9yZV90b190eD0xOworCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJfQorCisJCX1lbHNleworCQkJLyogVGhpcyBkZXZpY2Ugd2FzIG5vdCBzZXQgdG8gdHJhbnNtaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBnbyB0byBuZXh0IAorCQkJICovCisJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJfQkKKworCQlpZiAoKytpID09IGNhcmQtPnUueC5ub19kZXYpeworCQkJaWYgKCFtb3JlX3RvX3R4KXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IE5vdGhpbmcgdG8gU2VuZCBpbiBUWCBJTlRSXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwl9IC8vRW5kIG9mIEZPUgorCisJY2FyZC0+dS54LnR4X2RldiA9IGRldjsKKwkKKwlpZiAoIW1vcmVfdG9fdHgpeworCQkvKiBpZiBhbnkgb3RoZXIgaW50ZXJmYWNlcyBoYXZlIHRyYW5zbWl0IGludGVycnVwdHMgcGVuZGluZywgKi8KKwkJLyogZG8gbm90IGRpc2FibGUgdGhlIGdsb2JhbCB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJaWYgKCEoLS1jYXJkLT51LngudHhfaW50ZXJydXB0c19wZW5kaW5nKSl7CisJCQlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RYX0ZSQU1FOworCQl9CisJfQorCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIG1vdmVfZGV2X3RvX25leHQKKyAqICAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RydWN0IG5ldF9kZXZpY2UgKm1vdmVfZGV2X3RvX25leHQoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChjYXJkLT51Lngubm9fZGV2ICE9IDEpeworCQlpZiAoISooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpCisJCQlyZXR1cm4gY2FyZC0+d2FuZGV2LmRldjsKKwkJZWxzZQorCQkJcmV0dXJuICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgdHhfaW50cl9zZW5kCisgKiAgCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHR4X2ludHJfc2VuZChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsgCisKKwlpZiAoY2hhbl9zZW5kIChkZXYsY2hhbi0+dHJhbnNtaXRfYnVmZmVyLGNoYW4tPnRyYW5zbWl0X2xlbmd0aCwxKSl7CisJCSAKKyAgICAgICAgICAgICAgICAvKiBQYWNrZXQgd2FzIHNwbGl0IHVwIGR1ZSB0byBpdHMgc2l6ZSwgZG8gbm90IGRpc2FibGUKKyAgICAgICAgICAgICAgICAgKiB0eF9pbnRyIAorICAgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gMTsKKwl9CisKKwljaGFuLT50cmFuc21pdF9sZW5ndGg9MDsKKwlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJY2hhbi0+dHhfb2Zmc2V0PTA7CisKKwkvKiBJZiB3ZSBhcmUgaW4gQVBJIG1vZGUsIHdha2V1cCB0aGUgCisgICAgICAgICAqIHNvY2sgQkggaGFuZGxlciwgbm90IHRoZSBORVRfQkggKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKXsKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQl3YWtldXBfc2tfYmgoZGV2KTsKKwkJfWVsc2V7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRpbWVyX2ludHIKKyAqICAKKyAqIAlUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCUNoZWNrIHdobyBjYWxsZWQgdGhlIHRpbWVyIGludGVycnVwdCBhbmQgcGVyZm9ybQorICogICAgICBhY3Rpb24gYWNjb3JkaW5nbHkuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyIChzZGxhX3QgKmNhcmQpCit7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDKXsKKworCQlpZiAodGltZXJfaW50cl9jbWRfZXhlYyhjYXJkKSA9PSAwKXsKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisJCX0KKworCX1lbHNlICBpZihjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQX1BLVCkgeworCisJCWlmICgoKmNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgJiAweDQwKSAmJiAKKwkJICAgIGNhcmQtPnUueC51ZHBfdHlwZSA9PSBVRFBfWFBJUEVfVFlQRSl7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKHByb2Nlc3NfdWRwX21nbXRfcGt0KGNhcmQpKSB7CisJCSAgICAgICAgICAgICAgICBjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gCisJCQkJCX5UTVJfSU5UX0VOQUJMRURfVURQX1BLVDsKKwkJCX0KKwkJfQorCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0FDVElWRSkgeworCisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT51LngucG9sbF9kZXZpY2U7CisJCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBOVUxMOworCisJCWlmICghZGV2KXsKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1BPTExfQUNUSVZFOworCQkJcmV0dXJuOworCQl9CisJCWNoYW4gPSBkZXYtPnByaXY7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogQ2xvc2luZyBkb3duIElkbGUgbGluayAlcyBvbiBMQ04gJWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsY2hhbi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsgCisJCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisJCWNoYW5fZGlzYyhkZXYpOwkKKyAgICAgICAgIAljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0FDVElWRTsKKwkJY2FyZC0+dS54LnBvbGxfZGV2aWNlPU5VTEw7CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PTikgeworCisJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fQ09OTkVDVEVEKTsKKwkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LGNhcmQtPm1ib3gpOwkKKwkJfQorCisJCS8qIDB4OEYgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIElOVFJfT05fUlhfRlJBTUV8CQorCQkJCQlJTlRSX09OX1RYX0ZSQU1FfAorCQkJCQlJTlRSX09OX01PREVNX1NUQVRVU19DSEFOR0V8CisJCQkJCS8vSU5UUl9PTl9DT01NQU5EX0NPTVBMRVRFfAorCQkJCQlYMjVfQVNZX1RSQU5TX0lOVFJfUEVORElORyB8CisJCQkJCUlOVFJfT05fVElNRVIgfAorCQkJCQlESVJFQ1RfUlhfSU5UUl9VU0FHRQorCQkJCSk7IAorCisJCXN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVFhfRlJBTUU7CS8qIG1hc2sgVHggaW50ZXJydXB0cyAqLworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT047CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PRkYpIHsKKworCQkvL3ByaW50ayhLRVJOX0lORk8gIlBvbGwgY29ubmVjdCwgVHVybmluZyBPRkZcbiIpOworCQlkaXNjb25uZWN0KGNhcmQpOworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGOworCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0RJU0NPTk5FQ1QpIHsKKworCQkvL3ByaW50ayhLRVJOX0lORk8gIlBPbGwgZGlzY29ubmVjdCwgdHJ5aW5nIHRvIGNvbm5lY3RcbiIpOworCQljb25uZWN0KGNhcmQpOworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0RJU0NPTk5FQ1Q7CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSl7CisKKwkJaWYgKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCl7CisJCQl4MjVfZ2V0X2Vycl9zdGF0cyhjYXJkKTsKKwkJCXgyNV9nZXRfc3RhdHMoY2FyZCk7CisJCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJCX0KKwl9CisKKwlpZighY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkKXsKKwkJLy9wcmludGsoS0VSTl9JTkZPICJUdXJuaW5nIFRpbWVyIE9mZiBcbiIpOworICAgICAgICAgICAgICAgIHN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVElNRVI7CQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBzdGF0dXNfaW50ciAoc2RsYV90KiBjYXJkKQoreworCisJLyogQWRkZWQgdG8gYXZvaWQgTW9kZW0gc3RhdHVzIG1lc3NhZ2UgZmxvb2RpbmcgKi8KKwlzdGF0aWMgVFgyNU1vZGVtU3RhdHVzIGxhc3Rfc3RhdDsKKworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlUWDI1TW9kZW1TdGF0dXMgKm1vZGVtX3N0YXR1czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJaW50IGVycjsKKworCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1JFQURfTU9ERU1fU1RBVFVTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKXsgCisJCXgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9SRUFEX01PREVNX1NUQVRVUywgMCk7CisJfWVsc2V7CisJCisJCW1vZGVtX3N0YXR1cyA9IChUWDI1TW9kZW1TdGF0dXMqKW1ib3gtPmRhdGE7CQorCQorICAgICAgICAgICAJLyogQ2hlY2sgaWYgdGhlIGxhc3Qgc3RhdHVzIHdhcyB0aGUgc2FtZQorICAgICAgICAgICAJICogaWYgaXQgd2FzLCBkbyBOT1QgcHJpbnQgbWVzc2FnZSBhZ2FpbiAqLworCQorCQlpZiAobGFzdF9zdGF0LnN0YXR1cyAhPSBtb2RlbV9zdGF0dXMtPnN0YXR1cyl7CisKKwkgICAgIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIFN0YXR1cyBDaGFuZ2U6IERDRD0lcywgQ1RTPSVzXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsRENEKG1vZGVtX3N0YXR1cy0+c3RhdHVzKSxDVFMobW9kZW1fc3RhdHVzLT5zdGF0dXMpKTsKKworCQkJbGFzdF9zdGF0LnN0YXR1cyA9IG1vZGVtX3N0YXR1cy0+c3RhdHVzOworCQkKKwkJCWlmIChjYXJkLT51Lngub29iX29uX21vZGVtKXsKKworCQkJCW1ib3gtPmNtZC5wa3RUeXBlID0gbWJveC0+Y21kLmNvbW1hbmQ7CisJCQkJbWJveC0+Y21kLnJlc3VsdCA9IDB4MDg7CisKKwkJCQkvKiBTZW5kIGEgT09CIHRvIGFsbCBjb25uZWN0ZWQgc29ja2V0cyAqLworCQkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UqKilkZXYtPnByaXYpKSB7CisJCQkJCWNoYW49ZGV2LT5wcml2OworCQkJCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkJCQkJc2VuZF9vb2JfbXNnKGNhcmQsZGV2LG1ib3gpOwkJCQkKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFRoZSBtb2RlbSBPT0IgbWVzc2FnZSB3aWxsIHByb2JhYmx5IGtpbGwgdGhlCisJCQkJICogdGhlIGxpbmsuIElmIHdlIGRvbid0IGNsZWFyIHRoZSBmbGFnIGhlcmUsCisJCQkJICogYSBkZWFkbG9jayBjb3VsZCBvY2N1ciAqLyAKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpKXsKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfU1RBVFVTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKXsgCisJCXgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9IRExDX0xJTktfU1RBVFVTLCAwKTsKKwl9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU5ldHdvcmsgZXZlbnQgaW50ZXJydXB0IGhhbmRsZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZXZlbnRfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXgyNV9mZXRjaF9ldmVudHMoY2FyZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlTcHVyaW91cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIAlvIHByaW50IGEgd2FybmluZworICogCW8JIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNwdXJfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQhXG4iLCBjYXJkLT5kZXZuYW1lKTsKK30KKworCisvKgorICoJQmFja2dyb3VuZCBQb2xsaW5nIFJvdXRpbmVzICAKKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJTWFpbiBwb2xsaW5nIHJvdXRpbmUuCisgKiAJVGhpcyByb3V0aW5lIGlzIHJlcGVhdGVkbHkgY2FsbGVkIGJ5IHRoZSBXQU5QSVBFICd0aHJlYWQnIHRvIGFsbG93IGZvcgorICogCXRpbWUtZGVwZW5kZW50IGhvdXNla2VlcGluZyB3b3JrLgorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBvbiBpbnRlcnJ1cHQgY29udGV4dCB3aXRoIGFsbCBpbnRlcnJ1cHRzCisgKiAgICAJZW5hYmxlZC4gQmV3YXJlIQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHdweF9wb2xsIChzZGxhX3QgKmNhcmQpCit7CisJaWYgKCFjYXJkLT53YW5kZXYuZGV2KXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKworCWlmIChjYXJkLT5vcGVuX2NudCAhPSBjYXJkLT51LngubnVtX29mX2NoKXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKwkKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKworCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlnb3RvIHdweF9wb2xsX2V4aXQ7CisJfQorCisJc3dpdGNoKGNhcmQtPndhbmRldi5zdGF0ZSl7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXBvbGxfYWN0aXZlKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXBvbGxfY29ubmVjdGluZyhjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCXBvbGxfZGlzY29ubmVjdGVkKGNhcmQpOworCQkJYnJlYWs7CisJfQorCit3cHhfcG9sbF9leGl0OgorCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3gyNV9wb2xsKHNkbGFfdCAqY2FyZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZjYXJkLT51LngueDI1X3BvbGxfd29yayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgcGh5c2ljYWwgbGluayBlc3RhYmxpc2htZW50IHBoYXNlLgorICogCW8gaWYgY29ubmVjdGlvbiB0aW1lZCBvdXQsIGRpc2Nvbm5lY3QgdGhlIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwb2xsX2Nvbm5lY3RpbmcgKHNkbGFfdCogY2FyZCkKK3sKKwl2b2xhdGlsZSBUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWlmIChzdGF0dXMtPmdmbGFncyAmIFgyNV9IRExDX0FCTSl7CisKKwkJdGltZXJfaW50cl9leGVjIChjYXJkLCBUTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09OKTsKKworCX1lbHNlIGlmICgoamlmZmllcyAtIGNhcmQtPnN0YXRlX3RpY2spID4gQ09OTkVDVF9USU1FT1VUKXsKKworCQl0aW1lcl9pbnRyX2V4ZWMgKGNhcmQsIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGKTsKKworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUhhbmRsZSBwaHlzaWNhbCBsaW5rIGRpc2Nvbm5lY3RlZCBwaGFzZS4KKyAqIAlvIGlmIGhvbGQtZG93biB0aW1lb3V0IGhhcyBleHBpcmVkIGFuZCB0aGVyZSBhcmUgb3BlbiBpbnRlcmZhY2VzLCAKKyAqCWNvbm5lY3QgbGluay4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBvbGxfZGlzY29ubmVjdGVkIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgCisJeDI1X2NoYW5uZWxfdCAqY2hhbjsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWlmICghY2FyZC0+dS54LkxBUEJfaGRsYyAmJiBjYXJkLT5vcGVuX2NudCAmJiAKKwkgICAgKChqaWZmaWVzIC0gY2FyZC0+c3RhdGVfdGljaykgPiBIT0xEX0RPV05fVElNRSkpeworCQl0aW1lcl9pbnRyX2V4ZWMoY2FyZCwgVE1SX0lOVF9FTkFCTEVEX1BPTExfRElTQ09OTkVDVCk7CisJfQorCisKKwlpZiAoKGRldj1jYXJkLT53YW5kZXYuZGV2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKGNoYW49ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkgJiYgCisJICAgIGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkgJiYgCisJICAgIGNhcmQtPnUueC5MQVBCX2hkbGMpeworCisJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQykpIAorCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQzsKKworCQlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9USU1FUikpCisJCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJfQkKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSGFuZGxlIGFjdGl2ZSBsaW5rIHBoYXNlLgorICogCW8gZmV0Y2ggWC4yNSBhc3luY2hyb25vdXMgZXZlbnRzLgorICogCW8ga2ljayBvZmYgdHJhbnNtaXNzaW9uIG9uIGFsbCBpbnRlcmZhY2VzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcG9sbF9hY3RpdmUgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCQkvKiBJZiBTVkMgaGFzIGJlZW4gaWRsZSBsb25nIGVub3VnaCwgY2xvc2UgdmlydHVhbCBjaXJjdWl0ICovCisJCWlmICggY2hhbi0+Y29tbW9uLnN2YyAmJiAKKwkJICAgICBjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCAmJgorCQkgICAgIGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSApeworCQkKKwkJCWlmKCAoamlmZmllcyAtIGNoYW4tPmlfdGltZW91dF9zb2ZhcikgLyBIWiA+IGNoYW4tPmlkbGVfdGltZW91dCApeworCQkJCS8qIENsb3NlIHN2YyAqLworCQkJCWNhcmQtPnUueC5wb2xsX2RldmljZT1kZXY7CisJCQkJdGltZXJfaW50cl9leGVjCShjYXJkLCBUTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkUpOworCQkJfQorCQl9CisKKyNpZmRlZiBQUklOVF9ERUJVRworCQljaGFuLT5pZnN0YXRzLnR4X2NvbXByZXNzZWQgPSBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpOworCQljaGFuLT5pZnN0YXRzLnR4X2Vycm9ycyA9IGNoYW4tPmNvbW1vbi5zdGF0ZTsKKwkJY2hhbi0+aWZzdGF0cy5yeF9maWZvX2Vycm9ycyA9IGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KTsKKwkJKytjaGFuLT5pZnN0YXRzLnR4X2J5dGVzOworCisJCWNoYW4tPmlmc3RhdHMucnhfZmlmb19lcnJvcnM9YXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5kaXNjb25uZWN0KTsKKwkJY2hhbi0+aWZzdGF0cy5tdWx0aWNhc3Q9YXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJCWNoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9ycz0qY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1czsKKyNlbmRpZgkKKworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkgJiYgCisJCSAgICBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpICYmIAorCSAgICAgICAgICAgICFjYXJkLT51LnguTEFQQl9oZGxjKXsKKworCQkJaWYgKCEoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDKSkgCisJCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQzsKKworCQkJaWYgKCEoc3RhdHVzLT5pbWFzayAmIElOVFJfT05fVElNRVIpKQorCQkJCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKwkJfQkKKworCQlpZiAoKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKSAmJiAKKwkJICAgICBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QpKXsKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSA9PSBXQU5fRElTQ09OTkVDVEVEKXsKKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZGlzY29ubmVjdCwwKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLFgyNV9DTEVBUl9DQUxMKTsKKwkJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQykpIAorCQkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisKKwkJCWlmICghKHN0YXR1cy0+aW1hc2sgJiBJTlRSX09OX1RJTUVSKSkKKwkJCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHJfZXhlYyhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgVFlQRSkKK3sKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgfD0gVFlQRTsKKwlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9USU1FUikpCisJCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogU0RMQSBGaXJtd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgCisgKgorICogIEFsbW9zdCBhbGwgWC4yNSBjb21tYW5kcyBjYW4gdW5leHBldGVkbHkgZmFpbCBkdWUgdG8gc28gY2FsbGVkICdYLjI1CisgKiAgYXN5bmNocm9ub3VzIGV2ZW50cycgc3VjaCBhcyByZXN0YXJ0LCBpbnRlcnJ1cHQsIGluY29taW5nIGNhbGwgcmVxdWVzdCwKKyAqICBjYWxsIGNsZWFyIHJlcXVlc3QsIGV0Yy4gIFRoZXkgY2FuJ3QgYmUgaWdub3JlZCBhbmQgaGF2ZSB0byBiZSBkZWx0IHdpdGgKKyAqICBpbW1lZGlhdGVseS4gIFRvIHRhY2tsZSB3aXRoIHRoaXMgcHJvYmxlbSB3ZSBleGVjdXRlIGVhY2ggaW50ZXJmYWNlIAorICogIGNvbW1hbmQgaW4gYSBsb29wIHVudGlsIGdvb2QgcmV0dXJuIGNvZGUgaXMgcmVjZWl2ZWQgb3IgbWF4aW11bSBudW1iZXIgCisgKiAgb2YgcmV0cmllcyBpcyByZWFjaGVkLiAgRWFjaCBpbnRlcmZhY2UgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvIHJldHVybiAKKyAqICBjb2RlLCBhbiBhc3luY2hyb25vdXMgZXZlbnQvZXJyb3IgaGFuZGxlciB4MjVfZXJyb3IoKSBpcyBjYWxsZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVJlYWQgWC4yNSBmaXJtd2FyZSB2ZXJzaW9uLgorICoJCVB1dCBjb2RlIHZlcnNpb24gYXMgQVNDSUkgc3RyaW5nIGluIHN0ci4gCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX0NPREVfVkVSU0lPTjsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmCisJCSB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfUkVBRF9DT0RFX1ZFUlNJT04sIDApKTsKKworCWlmICghZXJyICYmIHN0cikKKwl7CisJCWludCBsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJCW1lbWNweShzdHIsIG1ib3gtPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUNvbmZpZ3VyZSBhZGFwdGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIFRYMjVDb25maWcqIGNvbmYpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG97CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltZW1jcHkobWJveC0+ZGF0YSwgKHZvaWQqKWNvbmYsIHNpemVvZihUWDI1Q29uZmlnKSk7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKFRYMjVDb25maWcpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9TRVRfQ09ORklHVVJBVElPTjsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9TRVRfQ09ORklHVVJBVElPTiwgMCkpOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDb25maWd1cmUgYWRhcHRlciBmb3IgSERMQyBvbmx5LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBUWDI1Q29uZmlnKiBjb25mKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRveworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsICh2b2lkKiljb25mLCBzaXplb2YoVFgyNUNvbmZpZykpOworCQltYm94LT5jbWQubGVuZ3RoICA9IHNpemVvZihUWDI1Q29uZmlnKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19TRVRfQ09ORklHOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1NFVF9DT05GSUdVUkFUSU9OLCAwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNldF9oZGxjX2xldmVsIChzZGxhX3QqIGNhcmQpCit7CisKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkb3sKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gU0VUX1BST1RPQ09MX0xFVkVMOworCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJbWJveC0+ZGF0YVswXSA9IEhETENfTEVWRUw7IC8vfCBET19IRExDX0xFVkVMX0VSUk9SX0NIRUNLSU5HOyAJCisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBTRVRfUFJPVE9DT0xfTEVWRUwsIDApKTsKKworCXJldHVybiBlcnI7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgY29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX1JFQURfQ09NTV9FUlI7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19SRUFEX0NPTU1fRVJSLCAwKSk7CisJCisJaWYgKCFlcnIpCisJeworCQlUSGRsY0NvbW1FcnIqIHN0YXRzID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgID0gc3RhdHMtPnJ4T3ZlcnJ1bjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgID0gc3RhdHMtPnJ4QmFkQ3JjOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfbWlzc2VkX2Vycm9ycyAgPSBzdGF0cy0+cnhBYm9ydGVkOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhBYm9ydGVkOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJR2V0IHByb3RvY29sIHN0YXRpc3RpY3MuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1JFQURfU1RBVElTVElDUzsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9SRUFEX1NUQVRJU1RJQ1MsIDApKSA7CisJCisJaWYgKCFlcnIpCisJeworCQlUWDI1U3RhdHMqIHN0YXRzID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgPSBzdGF0cy0+cnhEYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0cyA9IHN0YXRzLT50eERhdGE7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDbG9zZSBIRExDIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9jbG9zZV9oZGxjIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfQ0xPU0U7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX0NMT1NFLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJT3BlbiBIRExDIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9vcGVuX2hkbGMgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0hETENfTElOS19PUEVOOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0hETENfTElOS19PUEVOLCAwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0dXAgSERMQyBsaW5rLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHgyNV9zZXR1cF9oZGxjIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfU0VUVVA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX1NFVFVQLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IChyYWlzZS9kcm9wKSBEVFIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9zZXRfZHRyIChzZGxhX3QqIGNhcmQsIGludCBkdHIpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5kYXRhWzBdID0gMDsKKwkJbWJveC0+ZGF0YVsyXSA9IDA7CisJCW1ib3gtPmRhdGFbMV0gPSBkdHIgPyAweDAyIDogMHgwMTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSAzOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9TRVRfR0xPQkFMX1ZBUlM7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfU0VUX0dMT0JBTF9WQVJTLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNldCBpbnRlcnJ1cHQgbW9kZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgaW50IG1vZGUpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5kYXRhWzBdID0gbW9kZTsKKwkJaWYgKGNhcmQtPmh3LmZ3aWQgPT0gU0ZJRF9YMjVfNTA4KXsKKwkJCW1ib3gtPmRhdGFbMV0gPSBjYXJkLT5ody5pcnE7CisJCQltYm94LT5kYXRhWzJdID0gMjsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAzOworCQl9ZWxzZSB7CisJCSAJbWJveC0+Y21kLmxlbmd0aCAgPSAxOworCQl9CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1NFVF9JTlRFUlJVUFRfTU9ERTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9TRVRfSU5URVJSVVBUX01PREUsIDApKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJUmVhZCBYLjI1IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2dldF9jaGFuX2NvbmYgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBsY24gPSBjaGFuLT5jb21tb24ubGNuOworCWludCBlcnI7CisKKwlkb3sKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX0NIQU5ORUxfQ09ORklHOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1JFQURfQ0hBTk5FTF9DT05GSUcsIGxjbikpOworCisJaWYgKCFlcnIpCisJeworCQlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCQkvKiBjYWxjdWxhdGUgYW4gb2Zmc2V0IGludG8gdGhlIGFycmF5IG9mIHN0YXR1cyBieXRlcyAqLworCQlpZiAoY2FyZC0+dS54LmhpX3N2YyA8PSBYMjVfTUFYX0NIQU4peyAKKworCQkJY2hhbi0+Y2hfaWR4ID0gbGNuIC0gMTsKKworCQl9ZWxzZXsKKwkJCWludCBvZmZzZXQ7CisKKwkJCS8qIEZJWDogQXByIDE0IDIwMDAgOiBOZW5hZCBDb3JiaWMKKwkJCSAqIFRoZSBkYXRhIGZpZWxkIHdhcyBiZWluZyBjb21wYXJlZCB0byAweDFGIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAnJiYnIGluc3RlYWQgb2YgJyYnLiAKKwkJCSAqIFRoaXMgY2F1c2VkIFgyNUFQSSB0byBmYWlsIGZvciBMQ05zIGdyZWF0ZXIgdGhhbiAyNTUuCisJCQkgKi8KKwkJCXN3aXRjaCAobWJveC0+ZGF0YVswXSAmIDB4MUYpCisJCQl7CisJCQkJY2FzZSAweDAxOiAKKwkJCQkJb2Zmc2V0ID0gc3RhdHVzLT5wdmNfbWFwOyBicmVhazsKKwkJCQljYXNlIDB4MDM6IAorCQkJCQlvZmZzZXQgPSBzdGF0dXMtPmljY19tYXA7IGJyZWFrOworCQkJCWNhc2UgMHgwNzogCisJCQkJCW9mZnNldCA9IHN0YXR1cy0+dHdjX21hcDsgYnJlYWs7CisJCQkJY2FzZSAweDBCOiAKKwkJCQkJb2Zmc2V0ID0gc3RhdHVzLT5vZ2NfbWFwOyBicmVhazsKKwkJCQlkZWZhdWx0OiAKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCX0KKwkJCWNoYW4tPmNoX2lkeCA9IGxjbiAtIDEgLSBvZmZzZXQ7CisJCX0KKworCQkvKiBnZXQgYWN0dWFsIHRyYW5zbWl0IHBhY2tldCBzaXplIG9uIHRoaXMgY2hhbm5lbCAqLworCQlzd2l0Y2gobWJveC0+ZGF0YVsxXSAmIDB4MzgpCisJCXsKKwkJCWNhc2UgMHgwMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxNjsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDg6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gMzI7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDEwOiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDY0OyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxODogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxMjg7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDIwOiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDI1NjsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4Mjg6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gNTEyOyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxMDI0OyAKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoY2FyZC0+dS54LmxvZ2dpbmcpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBwYWNrZXQgc2l6ZSBvbiBMQ04gJWQgaXMgJWQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGxjbiwgY2hhbi0+dHhfcGt0X3NpemUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJUGxhY2UgWC4yNSBjYWxsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X3BsYWNlX2NhbGwgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisJY2hhciBzdHJbNjRdOworCisKKwlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKXsKKwkJc3ByaW50ZihzdHIsICItZCVzIC11Q0MiLCBjaGFuLT5hZGRyKTsKKwkKKwl9ZWxzZSBpZiAoY2hhbi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBYKSl7CisJCXNwcmludGYoc3RyLCAiLWQlcyAtdTgwMDAwMDAwODEzNyIsIGNoYW4tPmFkZHIpOworCQorCX0KKwkKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCXN0cmNweShtYm94LT5kYXRhLCBzdHIpOworCQltYm94LT5jbWQubGVuZ3RoICA9IHN0cmxlbihzdHIpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9QTEFDRV9DQUxMOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1BMQUNFX0NBTEwsIDApKTsKKworCWlmICghZXJyKXsKKwkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBjaGFuLT5kZXYsIG1ib3gtPmNtZC5sY24pOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJQWNjZXB0IFguMjUgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9hY2NlcHRfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgbGNuLCBpbnQgcWRtKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmxjbiAgICAgPSBsY247CisJCW1ib3gtPmNtZC5xZG0gICAgID0gcWRtOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9BQ0NFUFRfQ0FMTDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9BQ0NFUFRfQ0FMTCwgbGNuKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUNsZWFyIFguMjUgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBjYXVzZSwgaW50IGRpYWduKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmxjbiAgICAgPSBsY247CisJCW1ib3gtPmNtZC5jYXVzZSAgID0gY2F1c2U7CisJCW1ib3gtPmNtZC5kaWFnbiAgID0gZGlhZ247CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0NMRUFSX0NBTEw7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfQ0xFQVJfQ0FMTCwgbGNuKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNlbmQgWC4yNSBkYXRhIHBhY2tldC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9zZW5kIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBxZG0sIGludCBsZW4sIHZvaWQqIGJ1ZikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJCQorCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKQorCQljbWQgPSBYMjVfSERMQ19XUklURTsKKwllbHNlCisJCWNtZCA9IFgyNV9XUklURTsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsIGJ1ZiwgbGVuKTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBsZW47CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCisJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJCW1ib3gtPmNtZC5wZiA9IHFkbTsKKwkJfWVsc2V7CQkJCisJCQltYm94LT5jbWQucWRtID0gcWRtOworCQl9CisKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBjbWQ7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBjbWQgLCBsY24pKTsKKworCisJLyogSWYgYnVmZmVycyBhcmUgYnVzeSB0aGUgcmV0dXJuIGNvZGUgZm9yIExBUEIgSERMQyBpcworICAgICAgICAgKiAxLiBUaGUgYWJvdmUgZnVuY3Rpb25zIGFyZSBsb29raW5nIGZvciByZXR1cm4gY29kZQorICAgICAgICAgKiBvZiBYMjVSRVNfTk9UX1JFQURZIGlmIGJ1c3kuICovCisKKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyAmJiBlcnIgPT0gMSl7CisJCWVyciA9IFgyNVJFU19OT1RfUkVBRFk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUZldGNoIFguMjUgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2ZldGNoX2V2ZW50cyAoc2RsYV90KiBjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzdGF0dXMtPmdmbGFncyAmIDB4MjApCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSVNfREFUQV9BVkFJTEFCTEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKyAJCWlmIChlcnIpIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9JU19EQVRBX0FWQUlMQUJMRSwgMCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlYLjI1IGFzeW5jaHJvbm91cyBldmVudC9lcnJvciBoYW5kbGVyLgorICoJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGludGVyZmFjZSBjb21tYW5kIHJldHVybnMgCisgKgkJbm9uLXplcm8gcmV0dXJuIGNvZGUgdG8gaGFuZGxlIFguMjUgYXN5bmNocm9ub3VzIGV2ZW50cyBhbmQgCisgKgkJY29tbW9uIGVycm9ycy4gUmV0dXJuIG5vbi16ZXJvIHRvIHJlcGVhdCBjb21tYW5kIG9yIHplcm8gdG8gCisgKgkJY2FuY2VsIGl0LgorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgcmVjdXJzaXZlbHksIGFzIGhhbmRsaW5nIHNvbWUgb2YgdGhlCisgKiAgICAJYXN5bmNocm9ub3VzIGV2ZW50cyAoZS5nLiBjYWxsIHJlcXVlc3QpIHJlcXVpcmVzIGV4ZWN1dGlvbiBvZiB0aGUKKyAqICAgIAlpbnRlcmZhY2UgY29tbWFuZChzKSB0aGF0LCBpbiB0dXJuLCBtYXkgYWxzbyByZXR1cm4gYXN5bmNocm9ub3VzCisgKiAgICAJZXZlbnRzLiAgVG8gYXZvaWQgcmUtZW50cmFuY3kgcHJvYmxlbXMgd2UgY29weSBtYWlsYm94IHRvIGR5bmFtaWNhbGx5CisgKiAgICAJYWxsb2NhdGVkIG1lbW9yeSBiZWZvcmUgcHJvY2Vzc2luZyBldmVudHMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfZXJyb3IgKHNkbGFfdCogY2FyZCwgaW50IGVyciwgaW50IGNtZCwgaW50IGxjbikKK3sKKwlpbnQgcmV0cnkgPSAxOworCXVuc2lnbmVkIGRsZW4gPSAoKFRYMjVNYm94KiljYXJkLT5tYm94KS0+Y21kLmxlbmd0aDsKKwlUWDI1TWJveCogbWI7CisKKwltYiA9IGttYWxsb2Moc2l6ZW9mKFRYMjVNYm94KSArIGRsZW4sIEdGUF9BVE9NSUMpOworCWlmIChtYiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogeDI1X2Vycm9yKCkgb3V0IG9mIG1lbW9yeSFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweShtYiwgY2FyZC0+bWJveCwgc2l6ZW9mKFRYMjVNYm94KSArIGRsZW4pOworCXN3aXRjaCAoZXJyKXsKKworCWNhc2UgWDI1UkVTX0FTWU5DX1BBQ0tFVDoJLyogWC4yNSBhc3luY2hyb25vdXMgcGFja2V0IHdhcyByZWNlaXZlZCAqLworCisJCW1iLT5kYXRhW2RsZW5dID0gJ1wwJzsKKworCQlzd2l0Y2ggKG1iLT5jbWQucGt0VHlwZSAmIDB4N0YpeworCisJCWNhc2UgQVNFX0NBTExfUlFTVDoJCS8qIGluY29taW5nIGNhbGwgKi8KKwkJCXJldHJ5ID0gaW5jb21pbmdfY2FsbChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfQ0FMTF9BQ0NFUFRFRDoJCS8qIGNvbm5lY3RlZCAqLworCQkJcmV0cnkgPSBjYWxsX2FjY2VwdGVkKGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsKKworCQljYXNlIEFTRV9DTEVBUl9SUVNUOgkJLyogY2FsbCBjbGVhciByZXF1ZXN0ICovCisJCQlyZXRyeSA9IGNhbGxfY2xlYXJlZChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfUkVTRVRfUlFTVDoJCS8qIHJlc2V0IHJlcXVlc3QgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IHJlc2V0IHJlcXVlc3Qgb24gTENOICVkISAiCisJCQkJIkNhdXNlOjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWItPmNtZC5sY24sIG1iLT5jbWQuY2F1c2UsCisJCQkJbWItPmNtZC5kaWFnbik7CisJCQlhcGlfb29iX2V2ZW50IChjYXJkLG1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVNFX1JFU1RBUlRfUlFTVDoJCS8qIHJlc3RhcnQgcmVxdWVzdCAqLworCQkJcmV0cnkgPSByZXN0YXJ0X2V2ZW50KGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsKKworCQljYXNlIEFTRV9DTEVBUl9DT05GUk06CisJCQlpZiAoY2xlYXJfY29uZmlybV9ldmVudCAoY2FyZCxtYikpCisJCQkJYnJlYWs7CisKKwkJCS8qIEkgdXNlIHRoZSBnb3RvIHN0YXRlbWVudCBoZXJlIHNvIGlmIAorCSAgICAgICAgICAgICAgICAgKiBzb21lYm9keSBpbnNlcnRzIGNvZGUgYmV0d2VlbiB0aGUKKyAgICAgICAgCSAgICAgICAgICogY2FzZSBhbmQgZGVmYXVsdCwgd2Ugd2lsbCBub3QgaGF2ZQorICAgICAgICAgICAgICAgIAkgKiBnaG9zdCBwcm9ibGVtcyAqLworCisJCQlnb3RvIGRmbHRfMTsKKworCQlkZWZhdWx0OgorZGZsdF8xOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgZXZlbnQgMHglMDJYIG9uIExDTiAlZCEgIgorCQkJCSJDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQucGt0VHlwZSwKKwkJCQltYi0+Y21kLmxjbiwgbWItPmNtZC5jYXVzZSwgbWItPmNtZC5kaWFnbik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFgyNVJFU19QUk9UT19WSU9MQVRJT046CS8qIFguMjUgcHJvdG9jb2wgdmlvbGF0aW9uIGluZGljYXRpb24gKi8KKworCQkvKiBCdWcgRml4OiBNYXIgMTQgMjAwMAorICAgICAgICAgICAgICAgICAqIFRoZSBQcm90b2NvbCB2aW9sYXRpb24gZXJyb3IgY29uZGl0aW9ucyB3ZXJlICAKKyAgICAgICAgICAgICAgICAgKiBub3QgaGFuZGxlZCBwcmV2aW91c2x5ICovCisKKwkJc3dpdGNoIChtYi0+Y21kLnBrdFR5cGUgJiAweDdGKXsKKworCQljYXNlIFBWRV9DTEVBUl9SUVNUOgkvKiBDbGVhciByZXF1ZXN0ICovCQkKKwkJCXJldHJ5ID0gY2FsbF9jbGVhcmVkKGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsJCisKKwkJY2FzZSBQVkVfUkVTRVRfUlFTVDoJLyogUmVzZXQgcmVxdWVzdCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgcmVzZXQgcmVxdWVzdCBvbiBMQ04gJWQhICIKKwkJCQkiQ2F1c2U6MHglMDJYIERpYWduOjB4JTAyWFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLmxjbiwgbWItPmNtZC5jYXVzZSwKKwkJCQltYi0+Y21kLmRpYWduKTsKKwkJCWFwaV9vb2JfZXZlbnQgKGNhcmQsbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVkVfUkVTVEFSVF9SUVNUOgkvKiBSZXN0YXJ0IHJlcXVlc3QgKi8KKwkJCXJldHJ5ID0gcmVzdGFydF9ldmVudChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdCA6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBYLjI1IHByb3RvY29sIHZpb2xhdGlvbiBvbiBMQ04gJWQhICIKKwkJCQkiUGFja2V0OjB4JTAyWCBDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQubGNuLAorCQkJCW1iLT5jbWQucGt0VHlwZSAmIDB4N0YsIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCQkJYXBpX29vYl9ldmVudChjYXJkLG1iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHg0MjoJLyogWC4yNSB0aW1lb3V0ICovCisJCXJldHJ5ID0gdGltZW91dF9ldmVudChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQlicmVhazsKKworCWNhc2UgMHg0MzoJLyogWC4yNSByZXRyeSBsaW1pdCBleGNlZWRlZCAqLworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGV4Y2VlZGVkIFguMjUgcmV0cnkgbGltaXQgb24gTENOICVkISAiCisJCQkiUGFja2V0OjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsIGNhcmQtPmRldm5hbWUsCisJCQltYi0+Y21kLmxjbiwgbWItPmNtZC5wa3RUeXBlLCBtYi0+Y21kLmRpYWduKQorCQk7CisJCWJyZWFrOworCisJY2FzZSAweDA4OgkvKiBtb2RlbSBmYWlsdXJlICovCisjaWZuZGVmIE1PREVNX05PVF9MT0cKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG1vZGVtIGZhaWx1cmUhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKyNlbmRpZiAvKiBNT0RFTV9OT1RfTE9HICovCisJCWFwaV9vb2JfZXZlbnQoY2FyZCxtYik7CisJCWJyZWFrOworCisJY2FzZSAweDA5OgkvKiBOMiByZXRyeSBsaW1pdCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogZXhjZWVkZWQgSERMQyByZXRyeSBsaW1pdCFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJYXBpX29vYl9ldmVudChjYXJkLG1iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDY6CS8qIHVubnVtYmVyZWQgZnJhbWUgd2FzIHJlY2VpdmVkIHdoaWxlIGluIEFCTSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgVW5udW1iZXJlZCBmcmFtZSAweCUwMlghXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbWItPmRhdGFbMF0pOworCQlhcGlfb29iX2V2ZW50KGNhcmQsbWIpOworCQlicmVhazsKKworCWNhc2UgQ01EX1RJTUVPVVQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpCisJCTsKKwkJcmV0cnkgPSAwOwkvKiBhYm9ydCBjb21tYW5kICovCisJCWJyZWFrOworCisJY2FzZSBYMjVSRVNfTk9UX1JFQURZOgorCQlyZXRyeSA9IDE7CisJCWJyZWFrOworCisJY2FzZSAweDAxOgorCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYykKKwkJCWJyZWFrOworCisJCWlmIChtYi0+Y21kLmNvbW1hbmQgPT0gMHgxNikKKwkJCWJyZWFrOworCQkvKiBJIHVzZSB0aGUgZ290byBzdGF0ZW1lbnQgaGVyZSBzbyBpZiAKKyAgICAgICAgICAgICAgICAgKiBzb21lYm9keSBpbnNlcnRzIGNvZGUgYmV0d2VlbiB0aGUKKyAgICAgICAgICAgICAgICAgKiBjYXNlIGFuZCBkZWZhdWx0LCB3ZSB3aWxsIG5vdCBoYXZlCisgICAgICAgICAgICAgICAgICogZ2hvc3QgcHJvYmxlbXMgKi8KKwkJZ290byBkZmx0XzI7CisKKwlkZWZhdWx0OgorZGZsdF8yOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYISBMY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQsIGVyciwgbWItPmNtZC5sY24pCisJCTsKKwkJcmV0cnkgPSAwOwkvKiBhYm9ydCBjb21tYW5kICovCisJfQorCWtmcmVlKG1iKTsKKwlyZXR1cm4gcmV0cnk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKglYLjI1IEFzeW5jaHJvbm91cyBFdmVudCBIYW5kbGVycworICogCVRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSB4MjVfZXJyb3IoKSBhbmQgc2hvdWxkIHJldHVybiAwLCBpZgorICogCXRoZSBjb21tYW5kIHJlc3VsdGluZyBpbiB0aGUgYXN5bmNocm9ub3VzIGV2ZW50IG11c3QgYmUgYWJvcnRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICpIYW5kbGUgWC4yNSBpbmNvbWluZyBjYWxsIHJlcXVlc3QuCisgKglSRkMgMTM1NiBlc3RhYmxpc2hlcyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICoJMS4gVGhlIGZpcnN0IG9jdGV0IGluIHRoZSBDYWxsIFVzZXIgRGF0YSAoQ1VEKSBmaWVsZCBvZiB0aGUgY2FsbAorICogICAgIAkgICByZXF1ZXN0IHBhY2tldCBjb250YWlucyBOTFBJRCBpZGVudGlmeWluZyBwcm90b2NvbCBlbmNhcHN1bGF0aW9uCisgKiAJMi4gQ2FsbHMgTVVTVCBOT1QgYmUgYWNjZXB0ZWQgdW5sZXNzIHJvdXRlciBzdXBwb3J0cyByZXF1ZXN0ZWQKKyAqICAgCSAgIHByb3RvY29sIGVuY2Fwc3VsYXRpb24uCisgKgkzLiBBIGRpYWdub3N0aWMgY29kZSAyNDkgZGVmaW5lZCBieSBJU08vSUVDIDgyMDggbWF5IGJlIHVzZWQgCisgKgkgICB3aGVuIGNsZWFyaW5nIGEgY2FsbCBiZWNhdXNlIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gaXMgbm90IAorICoJICAgc3VwcG9ydGVkLgorICoJNC4gSWYgYW4gaW5jb21pbmcgY2FsbCBpcyByZWNlaXZlZCB3aGlsZSBhIGNhbGwgcmVxdWVzdCBpcyAKKyAqCSAgIHBlbmRpbmcgKGkuZS4gY2FsbCBjb2xsaXNpb24gaGFzIG9jY3VycmVkKSwgdGhlIGluY29taW5nIGNhbGwgCisgKgkgICBzaGFsbCBiZSByZWplY3RlZCBhbmQgY2FsbCByZXF1ZXN0IHNoYWxsIGJlIHJldHJpZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBpbmNvbWluZ19jYWxsIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlpbnQgbmV3X2xjbiA9IG1iLT5jbWQubGNuOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBnZXRfZGV2X2J5X2xjbih3YW5kZXYsIG5ld19sY24pOworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBOVUxMOworCWludCBhY2NlcHQgPSAwOwkJLyogc2V0IHRvICcxJyBpZiBvLmsuIHRvIGFjY2VwdCBjYWxsICovCisJdW5zaWduZWQgaW50IHVzZXJfZGF0YTsKKwl4MjVfY2FsbF9pbmZvX3QqIGluZm87CisJCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNhbGwgY29sbGlzaW9uICovCisJaWYgKGRldiAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBYLjI1IGluY29taW5nIGNhbGwgY29sbGlzaW9uIG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTWFrZSBzdXJlIEQgYml0IGlzIG5vdCBzZXQgaW4gY2FsbCByZXF1ZXN0ICovCisvL0ZJWE1FOiBUSElTIElTIE5PVCBUVVJFICEhISEgVEFLRSBJVCBPVVQKKy8vCWlmIChtYi0+Y21kLnFkbSAmIDB4MDIpCisvLwl7CisvLwkJcHJpbnRrKEtFUk5fSU5GTworLy8JCQkiJXM6IFguMjUgaW5jb21pbmcgY2FsbCBvbiBMQ04gJWQgd2l0aCBELWJpdCBzZXQhXG4iLAorLy8JCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKy8vCisvLwkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisvLwkJcmV0dXJuIDE7CisvLwl9CisKKwkvKiBQYXJzZSBjYWxsIHJlcXVlc3QgZGF0YSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZih4MjVfY2FsbF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBhcnNlIFguMjUgaW5jb21pbmcgY2FsbCAiCisJCQkib24gTENOICVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbik7CisJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQlyZXR1cm4gMTsKKwl9CisgCisJcGFyc2VfY2FsbF9pbmZvKG1iLT5kYXRhLCBpbmZvKTsKKworCWlmIChjYXJkLT51LngubG9nZ2luZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogWC4yNSBpbmNvbWluZyBjYWxsIG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKworCS8qIENvbnZlciB0aGUgZmlyc3QgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgaW50byBhbgorICAgICAgICAgKiBpbnRlcmdlci4gVXNlZCB0byBjaGVjayB0aGUgaW5jb21pbmcgcHJvdG9jb2wgCisgICAgICAgICAqLworCXVzZXJfZGF0YSA9IGhleF90b191aW50KGluZm8tPnVzZXIsMik7CisKKwkvKiBGaW5kIGF2YWlsYWJsZSBjaGFubmVsICovCisJZm9yIChkZXYgPSB3YW5kZXYtPmRldjsgZGV2OyBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCWNoYW4gPSBkZXYtPnByaXY7CisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorCQkJY29udGludWU7CisKKwkJaWYgKCFjaGFuLT5jb21tb24uc3ZjIHx8IChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0RJU0NPTk5FQ1RFRCkpCisJCQljb250aW51ZTsKKworCQlpZiAodXNlcl9kYXRhID09IE5MUElEX0lQICYmIGNoYW4tPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSl7CisJCQlwcmludGsoS0VSTl9JTkZPICJJUCBwYWNrZXQgYnV0IGNvbmZpZ3VyZWQgZm9yIElQWCA6ICV4LCAleFxuIiwKKwkJCQkgICAgICAgaHRvbnMoY2hhbi0+cHJvdG9jb2wpLCBpbmZvLT51c2VyWzBdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCisJCWlmICh1c2VyX2RhdGEgPT0gTkxQSURfU05BUCAmJiBjaGFuLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFgpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIklQWCBwYWNrZXQgYnV0IGNvbmZpZ3VyZWQgZm9yIElQOiAleFxuIiwKKwkJCQkgICAgICAgaHRvbnMoY2hhbi0+cHJvdG9jb2wpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoaW5mby0+c3JjLCBjaGFuLT5hZGRyKSA9PSAwKQorCQkJYnJlYWs7CisKKwkgICAgICAgIC8qIElmIGp1c3QgYW4gJ0AnIGlzIHNwZWNpZmllZCwgYWNjZXB0IGFsbCBpbmNvbWluZyBjYWxscyAqLworCSAgICAgICAgaWYgKHN0cmNtcChjaGFuLT5hZGRyLCAiIikgPT0gMCkKKwkgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJaWYgKGRldiA9PSBOVUxMKXsKKworCQkvKiBJZiB0aGUgY2FsbCBpcyBub3QgZm9yIGFueSBXQU5QSVBFIGludGVyZmFjZXMKKyAgICAgICAgICAgICAgICAgKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gQVBJIGxpc3RlbmluZyBxdWV1ZQorICAgICAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIGRhdGEuIElmIHRoZXJlIGlzIHNlbmQgdGhlIHBhY2tldAorICAgICAgICAgICAgICAgICAqIHVwIHRoZSBzdGFjay4KKyAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKGNhcmQtPnNrICE9IE5VTEwgJiYgY2FyZC0+ZnVuYyAhPSBOVUxMKXsKKwkJCWlmIChhcGlfaW5jb21pbmdfY2FsbChjYXJkLG1iLG5ld19sY24pKXsKKwkJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJCX0KKwkJCWFjY2VwdCA9IDA7CisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIGNoYW5uZWxzIGF2YWlsYWJsZSFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkKKwkJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQl9CisKKwl9ZWxzZSBpZiAoaW5mby0+bnVzZXIgPT0gMCl7CisKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBubyB1c2VyIGRhdGEgaW4gaW5jb21pbmcgY2FsbCBvbiBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbikKKwkJOworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKworCX1lbHNlIHN3aXRjaCAoaW5mby0+dXNlclswXSl7CisKKwkJY2FzZSAwOgkJLyogbXVsdGlwbGV4ZWQgKi8KKwkJCWNoYW4tPnByb3RvY29sID0gaHRvbnMoMCk7CisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBOTFBJRF9JUDoJLyogSVAgZGF0YWdyYW1zICovCisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBOTFBJRF9TTkFQOiAvKiBJUFggZGF0YWdyYW1zICovCisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IHVuc3VwcG9ydGVkIE5MUElEIDB4JTAyWCBpbiBpbmNvbWluZyBjYWxsICIKKwkJCQkib24gTENOICVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgaW5mby0+dXNlclswXSwgbmV3X2xjbik7CisJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAyNDkpOworCX0KKwkKKwlpZiAoYWNjZXB0ICYmICh4MjVfYWNjZXB0X2NhbGwoY2FyZCwgbmV3X2xjbiwgMCkgPT0gQ01EX09LKSl7CisKKwkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBjaGFuLT5kZXYsIG5ld19sY24pOworCQkKKwkJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pID09IENNRF9PSykKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJCWVsc2UgCisJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwl9CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgYWNjZXB0ZWQgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNhbGxfYWNjZXB0ZWQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKQoreworCXVuc2lnbmVkIG5ld19sY24gPSBtYi0+Y21kLmxjbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIG5ld19sY24pOworCXgyNV9jaGFubmVsX3QqIGNoYW47CisKKwlpZiAoZGV2ID09IE5VTEwpeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGNsZWFyaW5nIG9ycGhhbmVkIGNvbm5lY3Rpb24gb24gTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG5ld19sY24pOworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGNhcmQtPnUueC5sb2dnaW5nKQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2FsbCBhY2NlcHRlZCBvbiBEZXYgJXMgYW5kIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG5ld19sY24pOworCisJLyogR2V0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgbm90aWZ5IHJvdXRlciAqLworCWNoYW4gPSBkZXYtPnByaXY7CisJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwl7CisJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsbWIpOworCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbmV3X2xjbik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgY2xlYXJlZCBjYWxsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY2FsbF9jbGVhcmVkIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwl1bnNpZ25lZCBuZXdfbGNuID0gbWItPmNtZC5sY247CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBuZXdfbGNuKTsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCXVuc2lnbmVkIGNoYXIgb2xkX3N0YXRlOworCisJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2xlYXIgcmVxdWVzdCBvbiBMQ04gJWQhIENhdXNlOjB4JTAyWCAiCisJCSJEaWFnbjoweCUwMlhcbiIsCisJCWNhcmQtPmRldm5hbWUsIG5ld19sY24sIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCX0KKworCWlmIChkZXYgPT0gTlVMTCl7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBjbGVhciByZXF1ZXN0IDogTm8gZGV2aWNlIGZvciBjbGVhclxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2hhbj1kZXYtPnByaXY7CisKKwlvbGRfc3RhdGUgPSBjaGFuLT5jb21tb24uc3RhdGU7CisKKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKworCQlzd2l0Y2ggKG9sZF9zdGF0ZSl7CisJCQorCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsbWIpOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYik7CQkJCQorCQkJYnJlYWs7CisJCX0KKwl9CisJCisJcmV0dXJuICgoY21kID09IFgyNV9XUklURSkgJiYgKGxjbiA9PSBuZXdfbGNuKSkgPyAwIDogMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUhhbmRsZSBYLjI1IHJlc3RhcnQgZXZlbnQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCByZXN0YXJ0X2V2ZW50IChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJdW5zaWduZWQgY2hhciBvbGRfc3RhdGU7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSIlczogWC4yNSByZXN0YXJ0IHJlcXVlc3QhIENhdXNlOjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsCisJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCisJLyogZG93biBhbGwgbG9naWNhbCBjaGFubmVscyAqLworCWZvciAoZGV2ID0gd2FuZGV2LT5kZXY7IGRldjsgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQljaGFuPWRldi0+cHJpdjsKKwkJb2xkX3N0YXRlID0gY2hhbi0+Y29tbW9uLnN0YXRlOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCXN3aXRjaCAob2xkX3N0YXRlKXsKKwkJCisJCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LG1iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCQlzZW5kX29vYl9tc2coY2FyZCxkZXYsbWIpOwkJCQkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKGNtZCA9PSBYMjVfV1JJVEUpID8gMCA6IDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0aW1lb3V0IGV2ZW50LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgdGltZW91dF9ldmVudCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpCit7CisJdW5zaWduZWQgbmV3X2xjbiA9IG1iLT5jbWQubGNuOworCisJaWYgKG1iLT5jbWQucGt0VHlwZSA9PSAweDA1KQkvKiBjYWxsIHJlcXVlc3QgdGltZSBvdXQgKi8KKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCxuZXdfbGNuKTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBjYWxsIHRpbWVkIHRpbWVvdXQgb24gTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG5ld19sY24pOworCisJCWlmIChkZXYpeworCQkJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsY2FyZC0+bWJveCk7CisJCQl9CisJCX0KKwl9ZWxzZXsgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IHBhY2tldCAweCUwMlggdGltZW91dCBvbiBMQ04gJWQhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLnBrdFR5cGUsIG5ld19sY24pOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogCisgKglNaXNjZWxsYW5lb3VzIAorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlFc3RhYmxpc2ggcGh5c2ljYWwgY29ubmVjdGlvbi4KKyAqIAlvIG9wZW4gSERMQyBhbmQgcmFpc2UgRFRSCisgKgorICogCVJldHVybjoJCTAJY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorICoJCQkxCWNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MKKyAqCQkJPDAJZXJyb3IKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY29ubmVjdCAoc2RsYV90KiBjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJaWYgKHgyNV9vcGVuX2hkbGMoY2FyZCkgfHwgeDI1X3NldHVwX2hkbGMoY2FyZCkpCisJCXJldHVybiAtRUlPOworCisJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCisJeDI1X3NldF9pbnRyX21vZGUoY2FyZCwgSU5UUl9PTl9USU1FUik7IAorCXN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVElNRVI7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIAlUZWFyIGRvd24gcGh5c2ljYWwgY29ubmVjdGlvbi4KKyAqIAlvIGNsb3NlIEhETEMgbGluaworICogCW8gZHJvcCBEVFIKKyAqCisgKiAJUmV0dXJuOgkJMAorICoJCQk8MAllcnJvcgorICovCisKK3N0YXRpYyBpbnQgZGlzY29ubmVjdCAoc2RsYV90KiBjYXJkKQoreworCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIElOVFJfT05fVElNRVIpOwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHQgZXhjZXB0IHRpbWVyICovCisJeDI1X2Nsb3NlX2hkbGMoY2FyZCk7CQkJLyogY2xvc2UgSERMQyBsaW5rICovCisJeDI1X3NldF9kdHIoY2FyZCwgMCk7CQkJLyogZHJvcCBEVFIgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbmQgbmV0d29yayBkZXZpY2UgYnkgaXRzIGNoYW5uZWwgbnVtYmVyLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwKKwkJCQkJIHVuc2lnbmVkIGxjbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCisJZm9yIChkZXYgPSB3YW5kZXYtPmRldjsgZGV2OyBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKQorCQlpZiAoKCh4MjVfY2hhbm5lbF90KilkZXYtPnByaXYpLT5jb21tb24ubGNuID09IGxjbikgCisJCQlicmVhazsKKwlyZXR1cm4gZGV2OworfQorCisvKgorICogCUluaXRpYXRlIGNvbm5lY3Rpb24gb24gdGhlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqIAlvIGZvciBQVkMgd2UganVzdCBnZXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiAJbyBmb3IgU1ZDcyBwbGFjZSBhbiBYLjI1IGNhbGwKKyAqCisgKiAJUmV0dXJuOgkJMAljb25uZWN0ZWQKKyAqCQkJPjAJY29ubmVjdGlvbiBpbiBwcm9ncmVzcworICoJCQk8MAlmYWlsdXJlCisgKi8KKworc3RhdGljIGludCBjaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnN2YyAmJiBjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpeworCQlpZiAoIWNoYW4tPmFkZHJbMF0peworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIERlc3RpbmF0aW9uIEFkZHJlc3NcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcGxhY2luZyBYLjI1IGNhbGwgdG8gJXMgLi4uXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY2hhbi0+YWRkcik7CisKKwkJaWYgKHgyNV9wbGFjZV9jYWxsKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RJTkcpOworCQlyZXR1cm4gMTsKKwl9ZWxzZXsKKwkJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogCURpc2Nvbm5lY3QgbG9naWNhbCBjaGFubmVsLgorICogCW8gaWYgU1ZDIHRoZW4gY2xlYXIgWC4yNSBjYWxsCisgKi8KKworc3RhdGljIGludCBjaGFuX2Rpc2Moc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeyAKKwkJeDI1X2NsZWFyX2NhbGwoY2hhbi0+Y2FyZCwgY2hhbi0+Y29tbW9uLmxjbiwgMCwgMCk7CisKKwkJLyogRm9yIEFQSSB3ZSBkaXNjb25uZWN0IG9uIGNsZWFyCisgICAgICAgICAgICAgICAgICogY29uZmlybWF0aW9uLiAKKyAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorCQkJcmV0dXJuIDA7CisJfQorCisJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlTZXQgbG9naWNhbCBjaGFubmVsIHN0YXRlLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGludCBzdGF0ZSkKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gc3RhdGUpCisJeworCQlzd2l0Y2ggKHN0YXRlKQorCQl7CisJCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBjb25uZWN0ZWQsIGxjbiAlaSAhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmNvbW1vbi5sY24pOworCQkJCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisKKwkJCQkvKiBMQVBCIGlzIFBWQyBCYXNlZCAqLworCQkJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKQorCQkJCQljaGFuLT5jb21tb24uc3ZjPTA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBjb25uZWN0aW5nLCBsY24gJWkgLi4uXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+Y29tbW9uLmxjbik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBkaXNjb25uZWN0ZWQsIGxjbiAlaSAhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QsMCk7CisJCQkJCisJCQkJaWYgKGNoYW4tPmNvbW1vbi5zdmMpIHsKKwkJCQkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IDA7CisJCQkJCWNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFsoY2hhbi0+Y29tbW9uLmxjbiVYMjVfTUFYX0NIQU4pXT1OVUxMOworCQkgICAgICAgICAgICAgICAgCWNoYW4tPmNvbW1vbi5sY24gPSAwOworCQkJCX0KKworCQkJCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkJCQljaGFuLT50cmFuc21pdF9sZW5ndGg9MDsKKwkJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRyaXZlcl9idXN5LDApOworCQkJCQljaGFuLT50eF9vZmZzZXQ9MDsKKwkJCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSl7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCX0KKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0RJU0NPTk5FQ1RJTkc6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCSJcbiVzOiBpbnRlcmZhY2UgJXMgZGlzY29ubmVjdGluZywgbGNuICVpIC4uLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QsMCk7CisJCQkJYnJlYWs7CisJCX0KKwkJY2hhbi0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisJfQorCWNoYW4tPnN0YXRlX3RpY2sgPSBqaWZmaWVzOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKgorICogCVNlbmQgcGFja2V0IG9uIGEgbG9naWNhbCBjaGFubmVsLgorICoJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHR4X3NrYiBmaWVsZCBvZiB0aGUgY2hhbm5lbCBkYXRhIAorICoJCXNwYWNlIHBvaW50cyB0byB0aGUgdHJhbnNtaXQgc29ja2V0IGJ1ZmZlci4gIFdoZW4gdHJhbnNtaXNzaW9uIAorICoJCWlzIGNvbXBsZXRlLCByZWxlYXNlIHNvY2tldCBidWZmZXIgYW5kIHJlc2V0ICd0YnVzeScgZmxhZy4KKyAqCisgKiAJUmV0dXJuOgkJMAktIHRyYW5zbWlzc2lvbiBjb21wbGV0ZQorICoJCQkxCS0gYnVzeQorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBJZiBwYWNrZXQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBNVFUgZm9yIHRoaXMgY2hhbm5lbCwgd2UnbGwgZnJhZ21lbnQKKyAqICAgIAl0aGUgcGFja2V0IGludG8gJ2NvbXBsZXRlIHNlcXVlbmNlJyB1c2luZyBNLWJpdC4KKyAqIAkyLiBXaGVuIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZSwgYW4gZXZlbnQgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBpc3N1ZWQKKyAqICAgIAl0byB0aGUgcm91dGVyLgorICovCisKK3N0YXRpYyBpbnQgY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHZvaWQqIGJ1ZmYsIHVuc2lnbmVkIGRhdGFfbGVuLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgdHhfaW50cikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisJdW5zaWduZWQgbGVuPTAsIHFkbT0wLCByZXM9MCwgb3JpZ19sZW4gPSAwOworCXZvaWQgKmRhdGE7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgY2hhbm5lbCBpcyByZWFkeSAqLworCWlmICgoIShzdGF0dXMtPmNmbGFnc1tjaGFuLT5jaF9pZHhdICYgMHg0MCkgJiYgIWNhcmQtPnUueC5MQVBCX2hkbGMpICB8fCAKKyAgICAgICAgICAgICAhKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkpeyAKKyAgICAgICAgICAgIAorCQlpZiAoIXR4X2ludHIpeworCQkJc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQgKGRldiwgYnVmZiwgZGF0YV9sZW4pOworCQkJcmV0dXJuIDA7CisJCX1lbHNleworCQkJLyogQnkgcmV0dXJuaW5nIDAgdG8gdHhfaW50ciB0aGUgcGFja2V0IHdpbGwgYmUgZHJvcHBlZCAqLworCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SLCBUeCBpbnRyIGNvdWxkIG5vdCBzZW5kLCBkcm9wcGluZyAlczpcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX25vdF9wYXNzZWRfdG9fYWRwdHI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCS8qIFJlbW92ZSB0aGUgQVBJIEhlYWRlciAqLworCQl4MjVhcGlfaGRyX3QgKmFwaV9kYXRhID0gKHgyNWFwaV9oZHJfdCAqKWJ1ZmY7CisKKwkJLyogU2V0IHRoZSBxZG0gYml0cyBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyIAorICAgICAgICAgICAgICAgICAqIFVzZXIgaGFzIHRoZSBvcHRpb24gdG8gc2V0IHRoZSBxZG0gYml0cworICAgICAgICAgICAgICAgICAqLworCQlxZG0gPSBhcGlfZGF0YS0+cWRtOworCisJCW9yaWdfbGVuID0gbGVuID0gZGF0YV9sZW4gLSBzaXplb2YoeDI1YXBpX2hkcl90KTsKKwkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilidWZmICsgc2l6ZW9mKHgyNWFwaV9oZHJfdCk7CisJfWVsc2V7CisJCWRhdGEgPSBidWZmOworCQlvcmlnX2xlbiA9IGxlbiA9IGRhdGFfbGVuOworCX0JCisKKwlpZiAodHhfaW50cil7CisJCS8qIFdlIGFyZSBpbiB0eF9pbnRyLCBtaW51cyB0aGUgdHhfb2Zmc2V0IGZyb20gCisgICAgICAgICAgICAgICAgICogdGhlIHRvdGFsIGxlbmd0aC4gVGhlIHR4X29mZnNldCBwYXJ0IG9mIHRoZQorCQkgKiBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gQWxzbywgbW92ZSB0aGUgCisJCSAqIGRhdGEgcG9pbnRlciB0byBwcm9wZXIgb2Zmc2V0IGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAqLworCQlsZW4gLT0gY2hhbi0+dHhfb2Zmc2V0OworCQlkYXRhID0gKHVuc2lnbmVkIGNoYXIqKWRhdGEgKyBjaGFuLT50eF9vZmZzZXQ7CisJfQorCQkKKwkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gTVRVCisgICAgICAgICAqIElmIFlFUzogQ3V0IHRoZSBsZW4gdG8gTVRVIGFuZCBzZXQgdGhlIE0gYml0IAorICAgICAgICAgKi8KKwlpZiAobGVuID4gY2hhbi0+dHhfcGt0X3NpemUgJiYgIWNhcmQtPnUueC5MQVBCX2hkbGMpeworCQlsZW4gPSBjaGFuLT50eF9wa3Rfc2l6ZTsKKwkJcWRtIHw9IE1fQklUOwkJCisJfSAKKworCisJLyogUGFzcyBvbmx5IGZpcnN0IHRocmVlIGJpdHMgb2YgdGhlIHFkbSBieXRlIHRvIHRoZSBzZW5kCisgICAgICAgICAqIHJvdXRpbmUuIEluIGNhc2UgdXNlciBzZXRzIGFueSBvdGhlciBiaXQgd2hpY2ggbWlnaHQKKyAgICAgICAgICogY2F1c2UgZXJyb3JzLiAKKyAgICAgICAgICovCisKKwlzd2l0Y2goeDI1X3NlbmQoY2FyZCwgY2hhbi0+Y29tbW9uLmxjbiwgKHFkbSYweDA3KSwgbGVuLCBkYXRhKSl7CisJCWNhc2UgMHgwMDoJLyogc3VjY2VzcyAqLworCQkJY2hhbi0+aV90aW1lb3V0X3NvZmFyID0gamlmZmllczsKKworCQkJZGV2LT50cmFuc19zdGFydD1qaWZmaWVzOworCQkJCisJCQlpZiAoKHFkbSAmIE1fQklUKSAmJiAhY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQkJaWYgKCF0eF9pbnRyKXsKKwkJCQkJLyogVGhlIE0gYml0IHdhcyBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXQgaGFzIGJlZW4gc2VudC4gQ29weSB0aGUgcGFja2V0IGludG8gYSBidWZmZXIKKwkJCQkgICAgICAgICAqIGFuZCBzZXQgdGhlIG9mZnNldCB0byBsZW4sIHNvIG9uIG5leHQgdHhfaW50ZXIgCisJCQkJCSAqIHRoZSBwYWNrZXQgd2lsbCBiZSBzZW50IHVzaW5nIHRoZSBiZWxvdyBvZmZzZXQuCisJCQkJCSAqLworCQkJCQljaGFuLT50eF9vZmZzZXQgKz0gbGVuOworCisJCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9wYWNrZXRzOworCQkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkJCisJCQkJCWlmIChjaGFuLT50eF9vZmZzZXQgPCBvcmlnX2xlbil7CisJCQkJCQlzZXR1cF9mb3JfZGVsYXllZF90cmFuc21pdCAoZGV2LCBidWZmLCBkYXRhX2xlbik7CisJCQkJCX0KKwkJCQkJcmVzPTA7CisJCQkJfWVsc2V7CisJCQkJCS8qIFdlIGFyZSBhbHJlYWR5IGluIHR4X2ludGVyLCB0aHVzIGRhdGEgaXMgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIHRoZSBidWZmZXIuIFVwZGF0ZSB0aGUgb2Zmc2V0IGFuZCB3YWl0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5leHQgdHhfaW50ci4gV2UgYWRkIG9uIHRvIHRoZSBvZmZzZXQsIHNpbmNlIGRhdGEgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgWCBudW1iZXIgb2YgdGltZXMgbGFyZ2VyIHRoYW4gbWF4IGRhdGEgc2l6ZS4KKwkJCQkJICovCisJCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9wYWNrZXRzOworCQkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkJCisJCQkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX3Bhc3NlZF90b19hZHB0cjsKKwkJCQkJY2hhbi0+dHhfb2Zmc2V0ICs9IGxlbjsKKworCQkJCQkvKiBUaGUgdXNlciBjYW4gc2V0IHRoZSBxZG0gYml0IGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlIGVudGlyZSBwYWNrZXQgd2FzIHNlbnQgYW5kIHFkbSBpcyBzdGlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNldCwgdGhhbiBpdCdzIHRoZSB1c2VyIHdobyBoYXMgc2V0IHRoZSBNIGJpdC4gSW4gdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlIGluZGljYXRlIHRoYXQgdGhlIHBhY2tldCB3YXMgc2VuZCBieSByZXR1cm5pbmcgCisJCQkJCSAqIDAgYW5kIHdhaXQgZm9yIGEgbmV3IHBhY2tldC4gT3RoZXJ3aXNlLCB3YWl0IGZvciBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHggaW50ZXJydXB0IHRvIHNlbmQgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAqLworCisJCQkJCWlmIChjaGFuLT50eF9vZmZzZXQgPCBvcmlnX2xlbil7CisJCQkJCQlyZXM9MTsKKwkJCQkJfWVsc2V7CQorCQkJCQkJcmVzPTA7CisJCQkJCX0KKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHI7CisJCQkJcmVzPTA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MzM6CS8qIFR4IGJ1c3kgKi8KKwkJCWlmICh0eF9pbnRyKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHhfaW50cjogQmlnIEVycm9yIGRyb3BwaW5nIHBhY2tldCAlc1xuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX25vdF9wYXNzZWRfdG9fYWRwdHI7CisJCQkJcmVzPTA7CisJCQl9ZWxzZXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBTZW5kOiBCaWcgRXJyb3Igc2hvdWxkIGhhdmUgdHg6IHN0b3JyaW5nICVzXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCQkJCXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0IChkZXYsIGJ1ZmYsIGRhdGFfbGVuKTsJCisJCQkJcmVzPTE7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiBmYWlsdXJlICovCisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCQkJaWYgKHR4X2ludHIpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeF9pbnRyOiBGYWlsdXJlIHRvIHNlbmQsIGRyb3BwaW5nICVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9ub3RfcGFzc2VkX3RvX2FkcHRyOworCQkJCXJlcz0wOworCQkJfWVsc2V7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBTZW5kOiBGYWlsdXJlIHRvIHNlbmQgISEhLCBzdG9yaW5nICVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CQkJCisJCQkJc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQgKGRldiwgYnVmZiwgZGF0YV9sZW4pOworCQkJCXJlcz0xOworCQkJfQorCQkJYnJlYWs7CQorCX0KKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiAJUGFyc2UgWC4yNSBjYWxsIHJlcXVlc3QgZGF0YSBhbmQgZmlsbCB4MjVfY2FsbF9pbmZvX3Qgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX2NhbGxfaW5mbyAodW5zaWduZWQgY2hhciogc3RyLCB4MjVfY2FsbF9pbmZvX3QqIGluZm8pCit7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZih4MjVfY2FsbF9pbmZvX3QpKTsKKwlmb3IgKDsgKnN0cjsgKytzdHIpCisJeworCQlpbnQgaTsKKwkJdW5zaWduZWQgY2hhciBjaDsKKworCQlpZiAoKnN0ciA9PSAnLScpIHN3aXRjaCAoc3RyWzFdKSB7CisKKwkJCS8qIFRha2UgbWludXMgMiBvZmYgdGhlIG1heGltdW0gc2l6ZSBzbyB0aGF0IAorICAgICAgICAgICAgICAgICAgICAgICAgICogbGFzdCBieXRlIGlzIDAuIFRoaXMgd2F5IHdlIGNhbiB1c2Ugc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYW5pcHVsYXRvbiBmdW5jdGlvbnMgb24gY2FsbCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCQljYXNlICdkJzoJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9BRERSX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPmRlc3RbaV0gPSBjaDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3MnOgkvKiBzb3VyY2UgYWRkcmVzcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9BRERSX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPnNyY1tpXSA9IGNoOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAndSc6CS8qIHVzZXIgZGF0YSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9EQVRBX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPnVzZXJbaV0gPSBjaDsgCisJCQkJfQorCQkJCWluZm8tPm51c2VyID0gaTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnZic6CS8qIGZhY2lsaXRpZXMgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9YMjVfRkFDTF9TSVpFLTIpOyArK2kpeworCQkJCQljaCA9IHN0clsyK2ldOworCQkJCQlpZiAoaXNzcGFjZShjaCkpIGJyZWFrOworCQkJCQlpbmZvLT5mYWNpbFtpXSA9IGNoOworCQkJCX0KKwkJCQlpbmZvLT5uZmFjaWwgPSBpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogCUNvbnZlcnQgbGluZSBzcGVlZCBpbiBicHMgdG8gYSBudW1iZXIgdXNlZCBieSBTNTAyIGNvZGUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnBzX3RvX3NwZWVkX2NvZGUgKHVuc2lnbmVkIGxvbmcgYnBzKQoreworCXVuc2lnbmVkIGNoYXIJbnVtYmVyOworCisJaWYgKGJwcyA8PSAxMjAwKSAgICAgICAgbnVtYmVyID0gMHgwMTsKKwllbHNlIGlmIChicHMgPD0gMjQwMCkgICBudW1iZXIgPSAweDAyOworCWVsc2UgaWYgKGJwcyA8PSA0ODAwKSAgIG51bWJlciA9IDB4MDM7CisJZWxzZSBpZiAoYnBzIDw9IDk2MDApICAgbnVtYmVyID0gMHgwNDsKKwllbHNlIGlmIChicHMgPD0gMTkyMDApICBudW1iZXIgPSAweDA1OworCWVsc2UgaWYgKGJwcyA8PSAzODQwMCkgIG51bWJlciA9IDB4MDY7CisJZWxzZSBpZiAoYnBzIDw9IDQ1MDAwKSAgbnVtYmVyID0gMHgwNzsKKwllbHNlIGlmIChicHMgPD0gNTYwMDApICBudW1iZXIgPSAweDA4OworCWVsc2UgaWYgKGJwcyA8PSA2NDAwMCkgIG51bWJlciA9IDB4MDk7CisJZWxzZSBpZiAoYnBzIDw9IDc0MDAwKSAgbnVtYmVyID0gMHgwQTsKKwllbHNlIGlmIChicHMgPD0gMTEyMDAwKSBudW1iZXIgPSAweDBCOworCWVsc2UgaWYgKGJwcyA8PSAxMjgwMDApIG51bWJlciA9IDB4MEM7CisJZWxzZSBudW1iZXIgPSAweDBEOworCisJcmV0dXJuIG51bWJlcjsKK30KKworLyoKKyAqIAlDb252ZXJ0IGRlY2ltYWwgc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiAJSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29udmVydGVkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWw7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKScwJyk7CisJCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIAlDb252ZXJ0IGhleCBzdHJpbmcgdG8gdW5zaWduZWQgaW50ZWdlci4KKyAqIAlJZiBsZW4gIT0gMCB0aGVuIG9ubHkgJ2xlbicgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGFyZSBjb25mZXJ0ZWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBoZXhfdG9fdWludCAodW5zaWduZWQgY2hhciogc3RyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHZhbCwgY2g7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW47ICsrc3RyLCAtLWxlbikKKwl7CisJCWNoID0gKnN0cjsKKwkJaWYgKGlzX2RpZ2l0KGNoKSkKKwkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoY2ggLSAodW5zaWduZWQpJzAnKTsKKwkJZWxzZSBpZiAoaXNfaGV4X2RpZ2l0KGNoKSkKKwkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoKGNoICYgMHhERikgLSAodW5zaWduZWQpJ0EnICsgMTApOworCQllbHNlIGJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyBpbnQgaGFuZGxlX0lQWFdBTih1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCBjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFgsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIHNob3J0IHByb3RvKQoreworCWludCBpOworCisJaWYoIHByb3RvID09IEVUSF9QX0lQWCkgeworCQkvKiBJdCdzIGFuIElQWCBwYWNrZXQgKi8KKwkJaWYoIWVuYWJsZV9JUFgpIHsKKwkJCS8qIFJldHVybiAxIHNvIHdlIGRvbid0IHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJdCdzIG5vdCBJUFggc28gcGFzcyBpdCB1cCB0aGUgc3RhY2suKi8gCisJCXJldHVybiAwOworCX0KKworCWlmKCBzZW5kcGFja2V0WzE2XSA9PSAweDkwICYmCisJICAgIHNlbmRwYWNrZXRbMTddID09IDB4MDQpCisJeworCQkvKiBJdCdzIElQWFdBTiAgKi8KKworCQlpZiggc2VuZHBhY2tldFsyXSA9PSAweDAyICYmCisJCSAgICBzZW5kcGFja2V0WzM0XSA9PSAweDAwKQorCQl7CisJCQkvKiBJdCdzIGEgdGltZXIgcmVxdWVzdCBwYWNrZXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gVGltZXIgUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8qIEdvIHRocm91Z2ggdGhlIHJvdXRpbmcgb3B0aW9ucyBhbmQgYW5zd2VyIG5vIHRvIGV2ZXJ5CisJCQkgKiBvcHRpb24gZXhjZXB0IFVubnVtYmVyZWQgUklQL1NBUAorCQkJICovCisJCQlmb3IoaSA9IDQxOyBzZW5kcGFja2V0W2ldID09IDB4MDA7IGkgKz0gNSkKKwkJCXsKKwkJCQkvKiAweDAyIGlzIHRoZSBvcHRpb24gZm9yIFVubnVtYmVyZWQgUklQL1NBUCAqLworCQkJCWlmKCBzZW5kcGFja2V0W2kgKyA0XSAhPSAweDAyKQorCQkJCXsKKwkJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJLyogU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbiAqLworCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApCisJCQl7CisJCQkJaSArPSA4OworCQkJfQorCisJCQkvKiBXZSBhbHNvIHdhbnQgdG8gdHVybiBvZmYgYWxsIGhlYWRlciBjb21wcmVzc2lvbiBvcHQuIAkJCSAqLyAKKwkJCWZvcig7IHNlbmRwYWNrZXRbaV0gPT0gMHg4MCA7KQorCQkJeworCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQlpICs9IChzZW5kcGFja2V0W2kgKyAyXSA8PCA4KSArIChzZW5kcGFja2V0W2kgKyAzXSkgKyA0OworCQkJfQorCisJCQkvKiBTZXQgdGhlIHBhY2tldCB0eXBlIHRvIHRpbWVyIHJlc3BvbnNlICovCisJCQlzZW5kcGFja2V0WzM0XSA9IDB4MDE7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBUaW1lciBSZXNwb25zZVxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlIGlmKCBzZW5kcGFja2V0WzM0XSA9PSAweDAyICkKKwkJeworCQkJLyogVGhpcyBpcyBhbiBpbmZvcm1hdGlvbiByZXF1ZXN0IHBhY2tldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIElQWFdBTiBJbmZvcm1hdGlvbiBSZXF1ZXN0IHBhY2tldFxuIixkZXZuYW1lKTsKKworCQkJLyogU2V0IHRoZSBwYWNrZXQgdHlwZSB0byBpbmZvcm1hdGlvbiByZXNwb25zZSAqLworCQkJc2VuZHBhY2tldFszNF0gPSAweDAzOworCisJCQkvKiBTZXQgdGhlIHJvdXRlciBuYW1lICovCisJCQlzZW5kcGFja2V0WzUxXSA9ICdYJzsKKwkJCXNlbmRwYWNrZXRbNTJdID0gJ1QnOworCQkJc2VuZHBhY2tldFs1M10gPSAnUCc7CisJCQlzZW5kcGFja2V0WzU0XSA9ICdJJzsKKwkJCXNlbmRwYWNrZXRbNTVdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1Nl0gPSAnRSc7CisJCQlzZW5kcGFja2V0WzU3XSA9ICctJzsKKwkJCXNlbmRwYWNrZXRbNThdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyID4+IDI4KTsKKwkJCXNlbmRwYWNrZXRbNTldID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MEYwMDAwMDApPj4gMjQpOworCQkJc2VuZHBhY2tldFs2MF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEYwMDAwMCk+PiAyMCk7CisJCQlzZW5kcGFja2V0WzYxXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMEYwMDAwKT4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbNjJdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEYwMDApPj4gMTIpOworCQkJc2VuZHBhY2tldFs2M10gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMEYwMCk+PiA4KTsKKwkJCXNlbmRwYWNrZXRbNjRdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRjApPj4gNCk7CisJCQlzZW5kcGFja2V0WzY1XSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwMEYpOworCQkJZm9yKGkgPSA2NjsgaSA8IDk5OyBpKz0gMSkKKwkJCXsKKwkJCQlzZW5kcGFja2V0W2ldID0gMDsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIEluZm9ybWF0aW9uIFJlc3BvbnNlIHBhY2tldFxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmtub3duIElQWFdBTiBwYWNrZXQhXG4iLGRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBTZXQgdGhlIFdOb2RlSUQgdG8gb3VyIG5ldHdvcmsgYWRkcmVzcyAqLworCQlzZW5kcGFja2V0WzM1XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCXNlbmRwYWNrZXRbMzZdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJc2VuZHBhY2tldFszN10gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwRkYwMCkgPj4gOCk7CisJCXNlbmRwYWNrZXRbMzhdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDBGRik7CisKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLypJZiB3ZSBnZXQgaGVyZSBpdCdzIGFuIElQWC1kYXRhIHBhY2tldCwgc28gaXQnbGwgZ2V0IHBhc3NlZCB1cCB0aGUgc3RhY2suCisJCSAqLworCQkvKiBzd2l0Y2ggdGhlIG5ldHdvcmsgbnVtYmVycyAqLworCQlzd2l0Y2hfbmV0X251bWJlcnMoc2VuZHBhY2tldCwgbmV0d29ya19udW1iZXIsIDEpOwkKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIAlJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICogIAlpZiBpbmNvbWluZyBpcyAxIC0gaWYgdGhlIG5ldCBudW1iZXIgaXMgMCBtYWtlIGl0IG91cnMgCisgKi8KKworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbNl0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzddIDw8IDE2KSArIChzZW5kcGFja2V0WzhdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbOV0pOworCQorCisJaWYgKCFpbmNvbWluZykgeworCQkvKklmIHRoZSBkZXN0aW5hdGlvbiBuZXR3b3JrIG51bWJlciBpcyBvdXJzLCBtYWtlIGl0IDAgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSBuZXR3b3JrX251bWJlcikgeworCQkJc2VuZHBhY2tldFs2XSA9IHNlbmRwYWNrZXRbN10gPSBzZW5kcGFja2V0WzhdID0gCisJCQkJCSBzZW5kcGFja2V0WzldID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBpbmNvbWluZyBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDApIHsKKwkJCXNlbmRwYWNrZXRbNl0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQkJc2VuZHBhY2tldFs3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbOF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbOV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMDAwRkYpOworCQl9CisJfQorCisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbMThdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFsxOV0gPDwgMTYpICsgKHNlbmRwYWNrZXRbMjBdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbMjFdKTsKKwkKKwkKKwlpZiggIWluY29taW5nICkgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gc2VuZHBhY2tldFsxOV0gPSBzZW5kcGFja2V0WzIwXSA9IAorCQkJCSBzZW5kcGFja2V0WzIxXSA9IDB4MDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCApIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTldID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsyMF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMjFdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KK30gLyogc3dpdGNoX25ldF9udW1iZXJzICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKiogWDI1QVBJIFNQRUNJRklDIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgZmluZF9jaGFubmVsCisgKgorICoJTWFuYWdlcyB0aGUgbGNuIHRvIGRldmljZSBtYXAuIEl0IGluY3JlYXNlcyBwZXJmb3JtYW5jZQorICogICAgICBiZWNhdXNlIGl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxpbmsgIAorICogICAgICBsaXN0IGZvciBhIGRldmljZSB3aGljaCBpcyBib3VuZGVkIHRvIGEgc3BlY2lmaWMgbGNuLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqZmluZF9jaGFubmVsKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbGNuKQoreworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKworCQlyZXR1cm4gY2FyZC0+d2FuZGV2LmRldjsKKworCX1lbHNleworCQkvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIGluY29taW5nIGxjbgorICAgICAgICAgICAgICAgICAqIGlzIGEgUFZDIG9yIGFuIFNWQyBjaGFubmVsLiBCdXQgd2UgZG8ga25vdyB0aGF0CisgICAgICAgICAgICAgICAgICogdGhlIGxjbiBjYW5ub3QgYmUgZm9yIGJvdGggdGhlIFBWQyBhbmQgdGhlIFNWQworICAgICAgICAgICAgICAgICAqIGNoYW5uZWwuCisKKwkJICogSWYgdGhlIGxjbiBudW1iZXIgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAyNTUsIAorICAgICAgICAgICAgICAgICAqIHRha2UgdGhlIG1vZHVsbyAyNTUgb2YgdGhhdCBudW1iZXIuIFdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICAqIDI1NSBsb2NhdGlvbnMsIHRodXMgaGlnaGVyIG51bWJlcnMgbXVzdCBiZSBtYXBwZWQKKyAgICAgICAgICAgICAgICAgKiB0byBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI0NS4gCisKKwkJICogV2UgbXVzdCBzZXBhcmF0ZSBwdmMncyBhbmQgc3ZjJ3Mgc2luY2UgdHdvIGRvbid0CisgICAgICAgICAgICAgICAgICogaGF2ZSB0byBiZSBjb250aWd1b3VzLiAgTWVhbmluZyBwdmMncyBjYW4gc3RhcnQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIDEgdG8gMTAgYW5kIHN2YydzIGNhbiBzdGFydCBmcm9tIDI1NiB0byAyNjYuCisgICAgICAgICAgICAgICAgICogQnV0IDI1NiUyNTUgaXMgMSwgaS5lLiBDT05GTElDVC4KKwkJICovCisKKworCQkvKiBIaWdoZXN0IExDTiBudW1iZXIgbXVzdCBiZSBsZXNzIG9yIGVxdWFsIHRvIDQwOTYgKi8KKwkJaWYgKChsY24gPD0gTUFYX0xDTl9OVU0pICYmIChsY24gPiAwKSl7CisKKwkJCWlmIChsY24gPCBYMjVfTUFYX0NIQU4peworCQkJCWlmIChjYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFtsY25dOworCisJCQkJaWYgKGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtsY25dKQorCQkJCQlyZXR1cm4gY2FyZC0+dS54LnB2Y190b19kZXZfbWFwW2xjbl07CisJCQkKKwkJCX1lbHNleworCQkJCWludCBuZXdfbGNuID0gbGNuJVgyNV9NQVhfQ0hBTjsKKwkJCQlpZiAoY2FyZC0+dS54LnN2Y190b19kZXZfbWFwW25ld19sY25dKQorCQkJCQlyZXR1cm4gY2FyZC0+dS54LnN2Y190b19kZXZfbWFwW25ld19sY25dOworCisJCQkJaWYgKGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtuZXdfbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtuZXdfbGNuXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3ZvaWQgYmluZF9sY25fdG9fZGV2KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbGNuKQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkvKiBNb2R1bG8gdGhlIGxjbiBudW1iZXIgYnkgWDI1X01BWF9DSEFOICgyNTUpCisJICogYmVjYXVzZSB0aGUgbGNuIG51bWJlciBjYW4gYmUgZ3JlYXRlciB0aGFuIDI1NSAKKyAgICAgICAgICoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHN2YyBhbmQgcHZjIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZQorICAgICAgICAgKiB0byBiZSBjb250aWdvdXMuIAorCSAqLworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeworCQljYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbKGxjbiAlIFgyNV9NQVhfQ0hBTildID0gZGV2OworCX1lbHNleworCQljYXJkLT51LngucHZjX3RvX2Rldl9tYXBbKGxjbiAlIFgyNV9NQVhfQ0hBTildID0gZGV2OworCX0KKwljaGFuLT5jb21tb24ubGNuID0gbGNuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHgyNWFwaV9iaCAKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHgyNWFwaV9iaChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQkggQnVmZmVyIEVtcHR5IGluIEJIXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpKXsKKworCQkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJCSAqIGRyaXZlciBmcm9tIHRoZSBzb2NrZXQsIHdlIG11c3QgZ2V0IG91dC4gCisJCSAqIFRoaXMgbmV2ZXIgaGFwcGVuZHMgYnV0IGlzIGEgc2FuaXR5IGNoZWNrLiAqLworCQlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLyogSWYgTEFQQiBIRExDLCBkbyBub3QgZHJvcCBwYWNrZXRzIGlmIHNvY2tldCBpcworICAgICAgICAgICAgICAgICAqIG5vdCBjb25uZWN0ZWQuICBMZXQgdGhlIGJ1ZmZlciBmaWxsIHVwIGFuZAorICAgICAgICAgICAgICAgICAqIHR1cm4gb2ZmIHJ4IGludGVycnVwdCAqLworCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsJCQkKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlza2IgID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYjsKKworCQlpZiAoc2tiID09IE5VTEwpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIIFNrYiBlbXB0eSBmb3IgcmVhZCAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5iaF9yZWFkKTsKKwkJfWVsc2V7CisJCQkKKwkJCWlmIChjaGFuLT5jb21tb24uc2sgPT0gTlVMTCB8fCBjaGFuLT5jb21tb24uZnVuYyA9PSBOVUxMKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQkg6IFNvY2tldCBkaXNjb25uZWN0ZWQsIGRyb3BwaW5nXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQl4MjVhcGlfYmhfY2xlYW51cChkZXYpOworCQkJCSsrY2hhbi0+aWZzdGF0cy5yeF9kcm9wcGVkOworCQkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJY29udGludWU7CisJCQl9CisKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvciBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyeSAKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQkg6ICEhISBQYWNrZXQgZmFpbGVkIHRvIHNlbmQgISEhISEgXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLnJlY2VpdmVfYmxvY2ssMSk7CisJCQkJcmV0dXJuOworCQkJfWVsc2V7CisJCQkJeDI1YXBpX2JoX2NsZWFudXAoZGV2KTsKKwkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CisJCQl9CisJCX0KKwl9CQorCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB4MjVhcGlfYmhfY2xlYW51cCAKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1YXBpX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2IgPSBOVUxMOworCisJaWYgKGNoYW4tPmJoX3JlYWQgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF9yZWFkPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+YmhfcmVhZDsJCisJfQorCisJLyogSWYgdGhlIFJlY2VpdmUgaW50ZXJydXB0IHdhcyBvZmYsIGl0IG1lYW5zCisgICAgICAgICAqIHRoYXQgd2UgZmlsbGVkIHVwIG91ciBjaXJjdWxhciBidWZmZXIuIENoZWNrICAgIAorICAgICAgICAgKiB0aGF0IHdlIGhhdmUgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gSWYgc28gCisgICAgICAgICAqIHR1cm4gdGhlIFJYIGludGVycnVwdCBiYWNrIG9uLiAKKwkgKi8KKwlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9SWF9GUkFNRSkpeworCQlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPCAoTUFYX0JIX0JVRkYrMSkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIOiBUdXJuaW5nIG9uIHRoZSBpbnRlcnJ1cHRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJc3RhdHVzLT5pbWFzayB8PSBJTlRSX09OX1JYX0ZSQU1FOworCQl9CisJfQkKKworCWF0b21pY19kZWMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJoX2VucXVldWUgCisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gKE1BWF9CSF9CVUZGKzEpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJvdHRvbSBoYWxmIGJ1ZmZlciBGVUxMXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMTsgCisJfQorCisJKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF93cml0ZV0pLT5za2IgPSBza2I7CisKKwlpZiAoY2hhbi0+Ymhfd3JpdGUgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF93cml0ZT0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3dyaXRlOworCX0KKworCWF0b21pY19pbmMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gKE1BWF9CSF9CVUZGKzEpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJ1ZmZlciBpcyBub3cgZnVsbCwgVHVybmluZyBvZmYgUlggSW50clxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJc3RhdHVzLT5pbWFzayAmPSB+SU5UUl9PTl9SWF9GUkFNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdGltZXJfaW50cl9jbWRfZXhlYworICogIAorICoJQ2FsbGVkIGJ5IHRpbWVyIGludGVycnVwdCB0byBleGVjdXRlIGEgY29tbWFuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHRpbWVyX2ludHJfY21kX2V4ZWMgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGNoYXIgbW9yZV90b19leGVjPTA7CisJdm9sYXRpbGUgeDI1X2NoYW5uZWxfdCAqY2hhbj1OVUxMOworCWludCBpPTAsYmFkX2NtZD0wLGVycj0wOwkKKworCWlmIChjYXJkLT51LnguY21kX2RldiA9PSBOVUxMKXsKKwkJY2FyZC0+dS54LmNtZF9kZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCX0KKworCWRldiA9IGNhcmQtPnUueC5jbWRfZGV2OworCisJZm9yICg7Oyl7CisKKwkJY2hhbiA9IGRldi0+cHJpdjsKKwkJCisJCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpKXsgCisKKwkJCWJhZF9jbWQgPSBjaGVja19iYWRfY29tbWFuZChjYXJkLGRldik7CisKKwkJCWlmICgoIWNoYW4tPmNvbW1vbi5tYm94IHx8IGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uZGlzY29ubmVjdCkpICYmIAorCQkJICAgICAhYmFkX2NtZCl7CisKKwkJCQkvKiBTb2NrZXQgaGFzIGRpZWQgb3IgZXhpdGVkLCBXZSBtdXN0IGJyaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFubmVsIGRvd24gYmVmb3JlIGFueWJvZHkgZWxzZSB0cmllcyB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIGl0ICovCisJCQkJZXJyID0gY2hhbm5lbF9kaXNjb25uZWN0KGNhcmQsZGV2KTsKKwkJCX1lbHNleworCQkJICAgICAgICBlcnIgPSBleGVjdXRlX2RlbGF5ZWRfY21kKGNhcmQsIGRldiwKKwkJCQkJCQkgKG1ib3hfY21kX3QqKWNoYW4tPmNvbW1vbi5tYm94LAorCQkJCQkJCSAgYmFkX2NtZCk7CisJCQl9CisKKwkJCXN3aXRjaCAoZXJyKXsKKworCQkJY2FzZSBSRVRVUk5fUkVTVUxUOgorCisJCQkJLyogUmV0dXJuIHRoZSByZXN1bHQgdG8gdGhlIHNvY2tldCB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlbGF5LiBOT19XQUlUIENvbW1hbmQgKi8JCisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSkKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKworCQkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LGNhcmQtPm1ib3gpOworCisJCQkJbW9yZV90b19leGVjPTA7CisJCQkJYnJlYWs7CisJCQljYXNlIERFTEFZX1JFU1VMVDoKKwkJCisJCQkJLyogV2FpdCBmb3IgdGhlIHJlbW90ZSB0byByZXNwb25kLCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VuZGluZyB0aGUgcmVzdWx0IHVwIHRvIHRoZSBzb2NrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFdBSVQgY29tbWFuZCAqLworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMCk7CisJCQkJCisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJbW9yZV90b19leGVjPTA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCisJCQkJLyogSWYgY29tbWFuZCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvbWUgcmVhc29uIChpLmUgcmV0dXJuIGNvZGUgMHgzMyBidXN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdGhlIG1vcmVfdG9fZXhlYyBiaXQgd2hpY2ggd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoaXMgY29tbWFuZCBtdXN0IGJlIGV4ZWN0dWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFnYWluIGR1cmluZyBuZXh0IHRpbWVyIGludGVycnVwdCAKKwkJCQkgKi8KKwkJCQltb3JlX3RvX2V4ZWM9MTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpID09IDApCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJhZF9jbWQ9MDsKKworCQkJLyogSWYgZmxhZ3MgaXMgc2V0LCB0aGVyZSBhcmUgbm8gaGRsYyBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICogdGh1cywgd2FpdCBmb3IgdGhlIG5leHQgcGFzcyBhbmQgdHJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc2FtZSBjb21tYW5kIGFnYWluLiBPdGhlcndpc2UsIHN0YXJ0IHNlYXJjaGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gbmV4dCBkZXZpY2Ugb24gdGhlIG5leHQgcGFzcy4gCisJCQkgKi8KKwkJCWlmICghbW9yZV90b19leGVjKXsKKwkJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9ZWxzZXsKKwkJCS8qIFRoaXMgZGV2aWNlIGhhcyBub3RoaW5nIHRvIGV4ZWN1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBnbyB0byBuZXh0LiAKKwkJCSAqLworCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSkKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKwkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQl9CQorCisJCWlmICgrK2kgPT0gY2FyZC0+dS54Lm5vX2Rldil7CisJCQlpZiAoIW1vcmVfdG9fZXhlYyl7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBOb3RoaW5nIHRvIGV4ZWN1dGUgaW4gVGltZXJcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpeworCQkJCQlhdG9taWNfc2V0KCZjYXJkLT51LnguY29tbWFuZF9idXN5LDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwl9IC8vRW5kIG9mIEZPUgorCisJY2FyZC0+dS54LmNtZF9kZXYgPSBkZXY7CisJCisJaWYgKG1vcmVfdG9fZXhlYyl7CisJCS8qIElmIG1vcmUgY29tbWFuZHMgYXJlIHBlbmRpbmcsIGRvIG5vdCB0dXJuIG9mZiB0aW1lciAKKyAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIDE7CisJfWVsc2V7CisJCS8qIE5vIG1vcmUgY29tbWFuZHMsIHR1cm4gb2ZmIHRpbWVyIGludGVycnVwdCAqLworCQlyZXR1cm4gMDsKKwl9CQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZXhlY3V0ZV9kZWxheWVkX2NtZCAKKyAqCisgKglFeGVjdXRlIGFuIEFQSSBjb21tYW5kIHdoaWNoIHdhcyBwYXNzZWQgZG93biBmcm9tIHRoZQorICogICAgICBzb2NrLiAgU29jayBpcyB2ZXJ5IGxpbWl0ZWQgaW4gd2hpY2ggY29tbWFuZHMgaXQgY2FuCisgKiAgICAgIGV4ZWN1dGUuICBXYWl0IGFuZCBObyBXYWl0IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuICAKKyAqICAgICAgUGxhY2UgQ2FsbCwgQ2xlYXIgQ2FsbCBhbmQgUmVzZXQgd2FpdCBjb21tYW5kcywgd2hlcmUKKyAqICAgICAgQWNjZXB0IENhbGwgaXMgYSBub193YWl0IGNvbW1hbmQuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGV4ZWN1dGVfZGVsYXllZF9jbWQoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIG1ib3hfY21kX3QgKnVzcl9jbWQsIGNoYXIgYmFkX2NtZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCWludCBkZWxheT1SRVRVUk5fUkVTVUxUOworCisJaWYgKCEoKmNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgJiAweDQwKSAmJiAhYmFkX2NtZCl7CisJCXJldHVybiBUUllfQ01EX0FHQUlOOworCX0KKworCS8qIFRoaXMgd2F5IGEgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIGV4ZWN1dGVkIGZvcgorICAgICAgICAgKiBhIHNwZWNpZmljIGxjbiwgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIGJvdW5kIHRvLiAqLworCXVzcl9jbWQtPmNtZC5sY24gPSBjaGFuLT5jb21tb24ubGNuOworCQorCisJLyogSWYgY2hhbm5lbCBpcyBwdmMsIGluc3RlYWQgb2YgcGxhY2UgY2FsbAorICAgICAgICAgKiBydW4geDI1X2NoYW5uZWwgY29uZmlndXJhdGlvbi4gSWYgcnVubmluZyBMQVBCIEhETEMKKyAgICAgICAgICogZW5hYmxlIGNvbW11bmljYXRpb25zLiAKKyAgICAgICAgICovCisJaWYgKCghY2hhbi0+Y29tbW9uLnN2YykgJiYgKHVzcl9jbWQtPmNtZC5jb21tYW5kID09IFgyNV9QTEFDRV9DQUxMKSl7CisKKwkJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpeworCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIkxBUEI6IENvbm5lY3RpbmdcbiIpOworCQkJY29ubmVjdChjYXJkKTsKKwkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fQ09OTkVDVElORyk7CisJCQlyZXR1cm4gREVMQVlfUkVTVUxUOworCQl9ZWxzZXsKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogUFZDIGlzIENPTk5FQ1RJTkdcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQlpZiAoeDI1X2dldF9jaGFuX2NvbmYoY2FyZCwgY2hhbikgPT0gQ01EX09LKXsKKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCQkJfWVsc2V7IAorCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl9CisJCQlyZXR1cm4gUkVUVVJOX1JFU1VMVDsKKwkJfQorCX0KKworCS8qIENvcHkgdGhlIHNvY2tldCBtYm94IGNvbW1hbmQgb250byB0aGUgYm9hcmQgKi8KKworCW1lbWNweSgmbWJveC0+Y21kLCAmdXNyX2NtZC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOworCWlmICh1c3JfY21kLT5jbWQubGVuZ3RoKXsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsIHVzcl9jbWQtPmRhdGEsIHVzcl9jbWQtPmNtZC5sZW5ndGgpOworCX0KKworCS8qIENoZWNrIGlmIGNvbW1hbmQgaXMgYmFkLiBXZSBuZWVkIHRvIGNvcHkgdGhlIGNtZCBpbnRvCisgICAgICAgICAqIHRoZSBidWZmZXIgcmVnYXJkbGVzcyBzaW5jZSB3ZSByZXR1cm4gdGhlLCBtYm94IHRvCisgICAgICAgICAqIHRoZSB1c2VyICovCisJaWYgKGJhZF9jbWQpeworCQltYm94LT5jbWQucmVzdWx0PTB4MDE7CisJCXJldHVybiBSRVRVUk5fUkVTVUxUOworCX0KKworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LICYmIGVyciAhPSBYMjVSRVNfTk9UX1JFQURZKQorCQl4MjVfZXJyb3IoY2FyZCwgZXJyLCB1c3JfY21kLT5jbWQuY29tbWFuZCwgdXNyX2NtZC0+Y21kLmxjbik7CisKKwlpZiAobWJveC0+Y21kLnJlc3VsdCA9PSBYMjVSRVNfTk9UX1JFQURZKXsKKwkJcmV0dXJuIFRSWV9DTURfQUdBSU47CisJfQorCisJc3dpdGNoIChtYm94LT5jbWQuY29tbWFuZCl7CisKKwljYXNlIFgyNV9QTEFDRV9DQUxMOgorCQkKKwkJc3dpdGNoIChtYm94LT5jbWQucmVzdWx0KXsKKworCQljYXNlIENNRF9PSzoKKworCQkJLyogQ2hlY2sgaWYgUGxhY2UgY2FsbCBpcyBhIHdhaXQgY29tbWFuZCBvciBhIAorICAgICAgICAgICAgICAgCSAgCSAqIG5vIHdhaXQgY29tbWFuZCAqLworCQkJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkgJiAweDgwKQorIAkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCQkJZWxzZQorCQkJCWRlbGF5PURFTEFZX1JFU1VMVDsKKwkJCisKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICJcbiVzOiBQTEFDRSBDQUxMIEJpbmRpbmcgZGV2ICVzIHRvIGxjbiAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUsIG1ib3gtPmNtZC5sY24pOworCQkKKwkJCWJpbmRfbGNuX3RvX2RldiAoY2FyZCwgZGV2LCBtYm94LT5jbWQubGNuKTsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RJTkcpOworCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgorCQkJZGVsYXk9UkVUVVJOX1JFU1VMVDsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWDI1X0FDQ0VQVF9DQUxMOiAKKwkJCisJCXN3aXRjaCAobWJveC0+Y21kLnJlc3VsdCl7CisKKwkJY2FzZSBDTURfT0s6CisKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICJcbiVzOiBBQ0NFUFQgQmluZGluZyBkZXYgJXMgdG8gbGNuICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lLG1ib3gtPmNtZC5sY24pOworCisJCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbWJveC0+Y21kLmxjbik7CisKKwkJCWlmICh4MjVfZ2V0X2NoYW5fY29uZihjYXJkLCBjaGFuKSA9PSBDTURfT0speworCisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKwkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCisJCQl9ZWxzZXsgCisJCQkJaWYgKHgyNV9jbGVhcl9jYWxsKGNhcmQsIHVzcl9jbWQtPmNtZC5sY24sIDAsIDApID09IENNRF9PSyl7CisJCQkJCS8qIGlmIGNsZWFyIGlzIHN1Y2Nlc3NmdWwsIHdhaXQgZm9yIGNsZWFyIGNvbmZpcm0gCisJCQkJCSAqLyAKKwkJCQkJZGVsYXk9REVMQVlfUkVTVUxUOworCQkJCX1lbHNleworCQkJCQkvKiBEbyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBoZXJlLiBJZiB3ZSBmYWlsIAorCQkJCQkgKiB0aGUgYWNjZXB0IHRoZSByZXR1cm4gY29kZSBpcyBzZW5kIHVwIAorCQkJCQkgKnRoZSBzdGFjaywgd2hpY2ggd2lsbCBldGhlciByZXRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgIAkgKiBvciBjbGVhciB0aGUgY2FsbCAKKwkJCQkJICovCisJCQkJCURCR19QUklOVEsoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBBQ0NFUFQ6IFNUQVRFIE1BWSBCRSBDVVJSVVBURUQgMiAhISEhIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBYMjVSRVNfQVNZTkNfUEFDS0VUOgorCQkJZGVsYXk9VFJZX0NNRF9BR0FJTjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IAorCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBBQ0NFUFQgRkFJTEVEXG4iLGNhcmQtPmRldm5hbWUpOworCQkJaWYgKHgyNV9jbGVhcl9jYWxsKGNhcmQsIHVzcl9jbWQtPmNtZC5sY24sIDAsIDApID09IENNRF9PSyl7CisJCQkJZGVsYXk9REVMQVlfUkVTVUxUOworCQkJfWVsc2V7CisJCQkJLyogRG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgaGVyZS4gSWYgd2UgZmFpbCB0aGUgYWNjZXB0LiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIGNvZGUgaXMgc2VuZCB1cCB0aGUgc3RhY2ssIHdoaWNoIHdpbGwgZXRoZXIgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgY2xlYXIgdGhlIGNhbGwgKi8KKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBBQ0NFUFQ6IFNUQVRFIE1BWSBCRSBDT1JSVVBURUQgMSAhISEhIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWRlbGF5PVJFVFVSTl9SRVNVTFQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFgyNV9DTEVBUl9DQUxMOgorCisJCXN3aXRjaCAobWJveC0+Y21kLnJlc3VsdCl7CisKKwkJY2FzZSBDTURfT0s6CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIkNBTEwgQ0xFQVIgT0s6IERldiAlcyBNYm94IExjbiAlaSAgQ2hhbiBMY24gJWlcbiIsCisJCQkJCWRldi0+bmFtZSxtYm94LT5jbWQubGNuLGNoYW4tPmNvbW1vbi5sY24pOworCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVElORyk7CisJCQlkZWxheSA9IERFTEFZX1JFU1VMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgWDI1UkVTX0NIQU5ORUxfSU5fVVNFOgorCQljYXNlIFgyNVJFU19BU1lOQ19QQUNLRVQ6CisJCQlkZWxheSA9IFRSWV9DTURfQUdBSU47CisJCQlicmVhazsKKwkJCQorCQljYXNlIFgyNVJFU19MSU5LX05PVF9JTl9BQk06CisJCWNhc2UgWDI1UkVTX0lOVkFMX0xDTjoKKwkJY2FzZSBYMjVSRVNfSU5WQUxfU1RBVEU6CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCQkJZGVsYXkgPSBSRVRVUk5fUkVTVUxUOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJLyogSWYgY29tbWFuZCBkaWQgbm90IGV4ZWN1dGUgYmVjYXVzZSBvZiB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBmYXVsdCwgZG8gbm90IGNoYW5nZSB0aGUgc3RhdGUuIFRoaXMgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbmFsIHRoZSBzb2NrZXQgdGhhdCBjbGVhciBjb21tYW5kIGZhaWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZXIgY2FuIHJldHJ5IG9yIGNsb3NlIHRoZSBzb2NrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXaGVuIHNvY2tldCBnZXRzIGtpbGxlZCwgaXQgd2lsbCBzZXQgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbi0+ZGlzY29ubmVjdCB3aGljaCB3aWxsIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICogZHJpdmVyIHRvIGNsZWFyIHRoZSBjYWxsICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2xlYXIgQ29tbWFuZCBGYWlsZWQsIFJjICV4XG4iLAorCQkJCWNhcmQtPmRldm5hbWUsbWJveC0+Y21kLmNvbW1hbmQpOyAKKwkJCWRlbGF5ID0gUkVUVVJOX1JFU1VMVDsKKwkJfQorCQlicmVhazsKKwl9CQorCisJcmV0dXJuIGRlbGF5OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYXBpX2luY29taW5nX2NhbGwgCisgKgorICoJUGFzcyBhbiBpbmNvbWluZyBjYWxsIHJlcXVlc3QgdXAgdGhlIGxpc3RlbmluZworICogICAgICBzb2NrLiAgSWYgdGhlIEFQSSBzb2NrIGlzIG5vdCBsaXN0ZW5pbmcgcmVqZWN0IHRoZQorICogICAgICBjYWxsLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhcGlfaW5jb21pbmdfY2FsbCAoc2RsYV90KiBjYXJkLCBUWDI1TWJveCAqbWJveCwgaW50IGxjbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW4gPSBzaXplb2YoVFgyNUNtZCkrbWJveC0+Y21kLmxlbmd0aDsKKworCWlmIChhbGxvY19hbmRfaW5pdF9za2JfYnVmKGNhcmQsICZza2IsIGxlbikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQVBJIGluY29taW5nIGNhbGwsIG5vIG1lbW9yeVxuIixjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbiksJm1ib3gtPmNtZCxsZW4pOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhYMjVfUFJPVCk7CisJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfQVNZTkM7CisKKwlpZiAoY2FyZC0+ZnVuYyhza2IsY2FyZC0+c2spIDwgMCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUpPUiBFUlJPUjogRmFpbGVkIHRvIHNlbmQgdXAgcGxhY2UgY2FsbCBcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdAorICoKKyAqCVdhaXQgY29tbWFuZHMgbGlrZSBQTEVBQ0UgQ0FMTCBvciBDTEVBUiBDQUxMIG11c3Qgd2FpdAorICogICAgICB1bnRpbCB0aGUgcmVzdWx0IGFycml2ZXMuIFRoaXMgZnVuY3Rpb24gcGFzc2VzCisgKiAgICAgIHRoZSByZXN1bHQgdG8gYSB3YWl0aW5nIHNvY2suIAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgVFgyNU1ib3gqIG1ib3gpCit7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwltYm94X2NtZF90ICp1c3JfY21kID0gKG1ib3hfY21kX3QgKiljaGFuLT5jb21tb24ubWJveDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW49c2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCisJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisKKwkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJICogZHJpdmVyIGZyb20gdGhlIHNvY2tldCwgd2UgbXVzdCBnZXQgb3V0LiAKKwkgKiBUaGlzIG5ldmVyIGhhcHBlbmRzIGJ1dCBpcyBhIHNhbml0eSBjaGVjay4gKi8KKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJaWYgKCF1c3JfY21kIHx8ICFjaGFuLT5jb21tb24uc2sgfHwgIWNoYW4tPmNvbW1vbi5mdW5jKXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIkRlbGF5IHJlc3VsdDogU29jayBub3QgYm91bmRlZCBzazogJXUsIGZ1bmM6ICV1LCBtYm94OiAldVxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpY2hhbi0+Y29tbW9uLnNrLAorCQkJKHVuc2lnbmVkIGludCljaGFuLT5jb21tb24uZnVuYywKKwkJCSh1bnNpZ25lZCBpbnQpdXNyX2NtZCk7IAorCQlyZXR1cm47CisJfQorCisJbWVtY3B5KCZ1c3JfY21kLT5jbWQsICZtYm94LT5jbWQsIHNpemVvZihUWDI1Q21kKSk7IAorCWlmIChtYm94LT5jbWQubGVuZ3RoID4gMCl7CisJCW1lbWNweSh1c3JfY21kLT5kYXRhLCBtYm94LT5kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKwl9CisKKwlpZiAoYWxsb2NfYW5kX2luaXRfc2tiX2J1ZihjYXJkLCZza2IsbGVuKSl7CisJCXByaW50ayhLRVJOX0lORk8gIkRlbGF5IHJlc3VsdDogTm8gc29jayBidWZmZXJzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCZtYm94LT5jbWQuY29tbWFuZCxsZW4pOworCQorCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gV0FOX1BBQ0tFVF9DTUQ7CisJCQkKKwljaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjbGVhcl9jb25maXJtX2V2ZW50CisgKgorICogCVBhc3MgdGhlIGNsZWFyIGNvbmZpcm1hdGlvbiBldmVudCB1cCB0aGUgc29jay4gVGhlCisgKiAgICAgIEFQSSB3aWxsIGRpc2Nvbm5lY3Qgb25seSBhZnRlciB0aGUgY2xlYXIgY29uZmlybWF0aW9uCisgKiAgICAgIGhhcyBiZWVuIHJlY2VpdmVkLiAKKyAqCisgKiAgICAgIERlcGVuZGluZyBvbiB0aGUgc3RhdGUsIGNsZWFyIGNvbmZpcm1hdGlvbiBjb3VsZCAKKyAqICAgICAgYmUgYW4gT09CIGV2ZW50LCBvciBhIHJlc3VsdCBvZiBhbiBBUEkgY29tbWFuZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjbGVhcl9jb25maXJtX2V2ZW50IChzZGxhX3QgKmNhcmQsIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJdW5zaWduZWQgY2hhciBvbGRfc3RhdGU7CQorCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsbWItPmNtZC5sY24pOworCWlmICghZGV2KXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiAqKiogR09UIENMRUFSIEJVVCBOTyBERVYgJWlcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxtYi0+Y21kLmxjbik7CisJCXJldHVybiAwOworCX0KKworCWNoYW49ZGV2LT5wcml2OworCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogR09UIENMRUFSIENPTkZJUk0gJXM6ICBNYm94IGxjbiAlaSAgQ2hhbiBsY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG1iLT5jbWQubGNuLCBjaGFuLT5jb21tb24ubGNuKTsKKworCS8qIElmIG5vdCBBUEkgZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQuIAorCSAqIElmIEFQSSwgc2VuZCB0aGUgcmVzdWx0IHRvIGEgd2FpdGluZworICAgICAgICAgKiBzb2NrZXQuCisJICovCisJCisJb2xkX3N0YXRlID0gY2hhbi0+Y29tbW9uLnN0YXRlOworCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlzd2l0Y2ggKG9sZF9zdGF0ZSkgeworCisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RJTkc6CisJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQlzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChjYXJkLGRldixtYik7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkJc2VuZF9vb2JfbXNnKGNhcmQsZGV2LG1iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogc2VuZF9vb2JfbXNnCisgKgorICogICAgQ29uc3RydWN0IGFuIE5FTSBNZXNzYWdlIGFuZCBwYXNzIGl0IHVwIHRoZSBjb25uZWN0ZWQKKyAqICAgIHNvY2suIElmIHRoZSBzb2NrIGlzIG5vdCBib3VuZGVkIGRpc2NhcmQgdGhlIE5FTS4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNlbmRfb29iX21zZyhzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFRYMjVNYm94ICptYm94KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJbWJveF9jbWRfdCAqdXNyX2NtZCA9IChtYm94X2NtZF90ICopY2hhbi0+Y29tbW9uLm1ib3g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuPXNpemVvZih4MjVhcGlfaGRyX3QpK21ib3gtPmNtZC5sZW5ndGg7CisJeDI1YXBpX3QgKmFwaV9oZHI7CisKKwkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJICogZHJpdmVyIGZyb20gdGhlIHNvY2tldCwgd2UgbXVzdCBnZXQgb3V0LiAKKwkgKiBUaGlzIG5ldmVyIGhhcHBlbmRzIGJ1dCBpcyBhIHNhbml0eSBjaGVjay4gKi8KKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJaWYgKCF1c3JfY21kIHx8ICFjaGFuLT5jb21tb24uc2sgfHwgIWNoYW4tPmNvbW1vbi5mdW5jKXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIk9PQiBNU0c6IFNvY2sgbm90IGJvdW5kZWRcbiIpOyAKKwkJcmV0dXJuOworCX0KKworCW1lbWNweSgmdXNyX2NtZC0+Y21kLCAmbWJveC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOyAKKwlpZiAobWJveC0+Y21kLmxlbmd0aCA+IDApeworCQltZW1jcHkodXNyX2NtZC0+ZGF0YSwgbWJveC0+ZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisJfQorCisJaWYgKGFsbG9jX2FuZF9pbml0X3NrYl9idWYoY2FyZCwmc2tiLGxlbikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogT09CIE1TRzogTm8gc29jayBidWZmZXJzXG4iLGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm47CisJfQorCisJYXBpX2hkciA9ICh4MjVhcGlfdCopc2tiX3B1dChza2IsbGVuKTsgCisJYXBpX2hkci0+aGRyLnBrdFR5cGUgPSBtYm94LT5jbWQucGt0VHlwZSAmIDB4N0Y7CisJYXBpX2hkci0+aGRyLnFkbSAgICAgPSBtYm94LT5jbWQucWRtOworCWFwaV9oZHItPmhkci5jYXVzZSAgID0gbWJveC0+Y21kLmNhdXNlOworCWFwaV9oZHItPmhkci5kaWFnbiAgID0gbWJveC0+Y21kLmRpYWduOworCWFwaV9oZHItPmhkci5sZW5ndGggID0gbWJveC0+Y21kLmxlbmd0aDsKKwlhcGlfaGRyLT5oZHIucmVzdWx0ICA9IG1ib3gtPmNtZC5yZXN1bHQ7CisJYXBpX2hkci0+aGRyLmxjbiAgICAgPSBtYm94LT5jbWQubGNuOworCisJaWYgKG1ib3gtPmNtZC5sZW5ndGggPiAwKXsKKwkJbWVtY3B5KGFwaV9oZHItPmRhdGEsbWJveC0+ZGF0YSxtYm94LT5jbWQubGVuZ3RoKTsKKwl9CisJCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0VSUjsKKwkJCQorCWlmIChjaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zaykgPCAwKXsKKwkJaWYgKGJoX2VucXVldWUoZGV2LHNrYikpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyb3BwaW5nIE9PQiBNU0dcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwl9CisKKwlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IE9PQiBNU0cgT0ssICVzLCBsY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG1ib3gtPmNtZC5sY24pOworfQkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBhbGxvY19hbmRfaW5pdF9za2JfYnVmIAorICoKKyAqCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHNrYiBidWZmZXIuIAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhbGxvY19hbmRfaW5pdF9za2JfYnVmIChzZGxhX3QgKmNhcmQsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgbGVuKQoreworCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gKnNrYjsKKworCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIFgyNV9IUkRIRFJfU1opOworCWlmIChuZXdfc2tiID09IE5VTEwpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc2tiX3RhaWxyb29tKG5ld19za2IpIDwgbGVuKXsKKwkJLyogTm8gcm9vbSBmb3IgdGhlIHBhY2tldC4gQ2FsbCBvZmYgdGhlIHdob2xlIHRoaW5nISAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KG5ld19za2IpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGlzdGVuOiB1bmV4cGVjdGVkbHkgbG9uZyBwYWNrZXQgc2VxdWVuY2VcbiIKKwkJCSxjYXJkLT5kZXZuYW1lKTsKKwkJKnNrYiA9IE5VTEw7CisJCXJldHVybiAxOworCX0KKworCSpza2IgPSBuZXdfc2tiOworCXJldHVybiAwOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgYXBpX29vYl9ldmVudCAKKyAqCisgKglTZW5kIGFuIE9PQiBldmVudCB1cCB0byB0aGUgc29jayAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGFwaV9vb2JfZXZlbnQgKHNkbGFfdCAqY2FyZCxUWDI1TWJveCAqbWJveCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIG1ib3gtPmNtZC5sY24pOworCXgyNV9jaGFubmVsX3QgKmNoYW47CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJY2hhbj1kZXYtPnByaXY7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpCisJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYm94KTsKKwkKK30KKworCisKKworc3RhdGljIGludCBjaGFubmVsX2Rpc2Nvbm5lY3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaW50IGVycjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCisJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBUSU1FUjogJXMsIERldmljZSBkb3duIGRpc2Nvbm5lY3RpbmdcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeworCQllcnIgPSB4MjVfY2xlYXJfY2FsbChjYXJkLGNoYW4tPmNvbW1vbi5sY24sMCwwKTsKKwl9ZWxzZXsKKwkJLyogSWYgY2hhbm5lbCBpcyBQVkMgb3IgTEFQQiBIRExDLCB0aGVyZSBpcyBubyBjYWxsCisgICAgICAgICAgICAgICAgICogdG8gYmUgY2xlYXJlZCwgdGh1cyBkcm9wIGRvd24gdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgKiBhcmVhIAorCSAgICAgICAgICovCisJCWVyciA9IDE7CisJfQorCisJc3dpdGNoIChlcnIpeworCQorCQljYXNlIFgyNVJFU19DSEFOTkVMX0lOX1VTRToJCisJCWNhc2UgWDI1UkVTX05PVF9SRUFEWToKKwkJCWVyciA9IFRSWV9DTURfQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBDTURfT0s6CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiQ0FMTCBDTEVBUiBPSzogRGV2ICVzIENoYW4gTGNuICVpXG4iLAorCQkJCQkJZGV2LT5uYW1lLGNoYW4tPmNvbW1vbi5sY24pOworCisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RJTkcpOworCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQllcnIgPSBERUxBWV9SRVNVTFQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIElmIExBUEIgSERMQyBwcm90b2NvbCwgYnJpbmcgdGhlIHdob2xlIGxpbmsgZG93bgorICAgICAgICAgICAgICAgICAgICAgICAgICogb25jZSB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcyAKKwkJCSAqLworCisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiTEFQQjogRGlzY29ubmVjdGluZyBMaW5rXG4iKTsKKwkJCQloZGxjX2xpbmtfZG93biAoY2FyZCk7CisJCQl9CisJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uY29tbWFuZCwwKTsKKwkJCWVyciA9IFJFVFVSTl9SRVNVTFQ7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBoZGxjX2xpbmtfZG93biAoc2RsYV90ICpjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSA1OworCWludCBlcnI9MDsKKworCWRvIHsKKwkJbWVtc2V0KG1ib3gsMCxzaXplb2YoVFgyNU1ib3gpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX0RJU0M7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQltYm94LT5kYXRhWzBdPTA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9IRExDX0xJTktfRElTQywgMCkpOworCisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhkbGMgTGluayBEb3duIEZhaWxlZCAleFxuIixjYXJkLT5kZXZuYW1lLGVycik7CisKKwlkaXNjb25uZWN0IChjYXJkKTsKKwkKK30KKworc3RhdGljIGludCBjaGVja19iYWRfY29tbWFuZChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlpbnQgYmFkX2NtZCA9IDA7CisKKwlzd2l0Y2ggKGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkmMHg3Ril7CisKKwkJY2FzZSBYMjVfUExBQ0VfQ0FMTDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0RJU0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfQ0xFQVJfQ0FMTDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0RJU0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfQUNDRVBUX0NBTEw6CisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNUSU5HKQorCQkJCWJhZF9jbWQ9MTsKKwkJCWJyZWFrOworCQljYXNlIFgyNV9SRVNFVDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJhZF9jbWQ9MTsKKwkJCWJyZWFrOworCX0KKworCWlmIChiYWRfY21kKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgU3RhdGUsIEJBRCBDb21tYW5kICV4LCBkZXYgJXMsIGxjbiAlaSwgc3QgJWlcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSxhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpLGRldi0+bmFtZSwgCisJCQljaGFuLT5jb21tb24ubGNuLCBjaGFuLT5jb21tb24uc3RhdGUpOworCX0KKworCXJldHVybiBiYWRfY21kOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBYUElQRU1PTiBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBjYWxsIG9mIHR5cGUgWFBJUEUKKyAqLworCitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCkKK3sKKwlpbnQgICAgICAgICAgICBjX3JldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwl1bnNpZ25lZCBpbnQgICBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJVFgyNU1ib3ggICAgICAgKm1ib3ggPSBjYXJkLT5tYm94OworCWludCAgICAgICAgICAgIGVycjsKKwlpbnQgICAgICAgICAgICB1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgICAgIHgyNV9jaGFubmVsX3QgICpjaGFuOworCXVuc2lnbmVkIHNob3J0IGxjbjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwkKKworCXgyNV91ZHBfcGt0X3QgKngyNV91ZHBfcGt0OworCXgyNV91ZHBfcGt0ID0gKHgyNV91ZHBfcGt0X3QgKiljYXJkLT51LngudWRwX3BrdF9kYXRhOworCisJZGV2ID0gY2FyZC0+dS54LnVkcF9kZXY7CisJY2hhbiA9IGRldi0+cHJpdjsKKwlsY24gPSBjaGFuLT5jb21tb24ubGNuOworCisJc3dpdGNoKHgyNV91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworICAgICAgICAgICAgCisJCS8qIFhQSVBFX0VOQUJMRV9UUkFDRSAqLworCQljYXNlIFhQSVBFX0VOQUJMRV9UUkFDSU5HOgorCisJCS8qIFhQSVBFX0dFVF9UUkFDRV9JTkZPICovCisJCWNhc2UgWFBJUEVfR0VUX1RSQUNFX0lORk86CisgCisJCS8qIFNFVCBGVDEgTU9ERSAqLworCQljYXNlIFhQSVBFX1NFVF9GVDFfTU9ERToKKyAgICAgICAgICAgCisJCQlpZihjYXJkLT51LngudWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworICAgICAgICAgICAgICAgICAgICAJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9kaXJlY3Rpb25fZXJyOworCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJLyogWFBJUEVfRlQxX1JFQURfU1RBVFVTICovCisJCWNhc2UgWFBJUEVfRlQxX1JFQURfU1RBVFVTOgorCisJCS8qIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCQljYXNlIFhQSVBFX0ZUMV9TVEFUVVNfQ1RSTDoKKwkJCWlmKGNhcmQtPmh3LmZ3aWQgIT0gIFNGSURfWDI1XzUwOCkgeworCQkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl90eXBlX2VycjsKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisgICAgICAgCX0KKworCWlmKCF1ZHBfbWdtdF9yZXFfdmFsaWQpIHsKKyAgICAgICAgICAgCS8qIHNldCBsZW5ndGggdG8gMCAqLworCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IDA7CisJCS8qIHNldCByZXR1cm4gY29kZSAqLworCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IChjYXJkLT5ody5md2lkICE9IFNGSURfWDI1XzUwOCkgPyAweDFGIDogMHhDRDsKKwkJCisJfSBlbHNlIHsgICAKKyAgICAgICAgCisJCXN3aXRjaCAoeDI1X3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisgICAgCisJCisJCWNhc2UgWFBJUEVfRkxVU0hfRFJJVkVSX1NUQVRTOgorCQkJaW5pdF94MjVfY2hhbm5lbF9zdHJ1Y3QoY2hhbik7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKGNhcmQpOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQlicmVhazsKKworCisJCWNhc2UgWFBJUEVfRFJJVkVSX1NUQVRfSUZTRU5EOgorCQkJbWVtY3B5KHgyNV91ZHBfcGt0LT5kYXRhLCAmY2hhbi0+aWZfc2VuZF9zdGF0LCBzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoaWZfc2VuZF9zdGF0X3QpOworCQkJeDI1X3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSAgbWJveC0+Y21kLmxlbmd0aDsJCisJCQlicmVhazsKKwkKKwkJY2FzZSBYUElQRV9EUklWRVJfU1RBVF9JTlRSOgorCQkJbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YVswXSwgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YVtzaXplb2YoZ2xvYmFsX3N0YXRzX3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4tPnJ4X2ludHJfc3RhdCwgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisJCQkKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpICsKKwkJCQkJc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCXgyNV91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gIG1ib3gtPmNtZC5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIFhQSVBFX0RSSVZFUl9TVEFUX0dFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh4MjVfdWRwX3BrdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfa21hbGxvY19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmeDI1X3VkcF9wa3QtPmRhdGFbc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZC0+c3RhdGlzdGljcywgc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHgyNV91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgyNV91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ib3gtPmNtZC5sZW5ndGggPSB4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgWFBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCWNoYW4tPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gY2hhbi0+cm91dGVyX3N0YXJ0X3RpbWU7CisgICAgCSAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKikmeDI1X3VkcF9wa3QtPmRhdGEgPSBjaGFuLT5yb3V0ZXJfdXBfdGltZTsJCisJCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSA0OworCQkJeDI1X3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCisJCWRlZmF1bHQgOgorCisJCQlkbyB7CisJCQkJbWVtY3B5KCZtYm94LT5jbWQsICZ4MjVfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsIHNpemVvZihUWDI1Q21kKSk7CisJCQkJaWYobWJveC0+Y21kLmxlbmd0aCl7IAorCQkJCQltZW1jcHkoJm1ib3gtPmRhdGEsIAorCQkJCQkgICAgICAgKGNoYXIgKil4MjVfdWRwX3BrdC0+ZGF0YSwgCisJCQkJCSAgICAgICBtYm94LT5jbWQubGVuZ3RoKTsKKwkJCQl9CQorCQkKKwkJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQl9IHdoaWxlIChlcnIgJiYgY19yZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIG1ib3gtPmNtZC5jb21tYW5kLCAwKSk7CisKKworCQkJaWYgKCBlcnIgPT0gQ01EX09LIHx8IAorCQkJICAgIChlcnIgPT0gMSAmJiAKKwkJCSAgICAgKG1ib3gtPmNtZC5jb21tYW5kID09IDB4MDYgfHwgCisJCQkgICAgICBtYm94LT5jbWQuY29tbWFuZCA9PSAweDE2KSAgKSApeworCisJCQkJKytjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0s7CisJCQl9IGVsc2UgeworCQkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQ7CisJCQl9CisKKwkJCSAgLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCQkJbWVtY3B5KCZ4MjVfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsICZtYm94LT5jbWQsIHNpemVvZihUWDI1Q21kKSk7CisKKyAgICAgIAkgICAgICAgICAJaWYobWJveC0+Y21kLmxlbmd0aCkgeworICAgICAgICAJICAgICAgICAgICAgICAgbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YSwgJm1ib3gtPmRhdGEsIG1ib3gtPmNtZC5sZW5ndGgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJfSAvL3N3aXRjaAorCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLyogRmlsbCBVRFAgVFRMICovCisKKwl4MjVfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7CisgICAgICAgIGxlbiA9IHJlcGx5X3VkcChjYXJkLT51LngudWRwX3BrdF9kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKworCisgICAgICAgIGlmKGNhcmQtPnUueC51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisJCQorCQllcnIgPSB4MjVfc2VuZChjYXJkLCBsY24sIDAsIGxlbiwgY2FyZC0+dS54LnVkcF9wa3RfZGF0YSk7CisJCWlmICghZXJyKSAKKwkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9zZW5kX3Bhc3NlZDsKKwkJZWxzZQorCQkJKytjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfZmFpbGVkOworCQorCX0gZWxzZSB7CisKKwkJLyogQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCQlpZigobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCQkJdm9pZCAqYnVmOworCisJCQkvKiBjb3B5IGRhdGEgaW50byBuZXdfc2tiICovCisJCQlidWYgPSBza2JfcHV0KG5ld19za2IsIGxlbik7CisJCQltZW1jcHkoYnVmLCBjYXJkLT51LngudWRwX3BrdF9kYXRhLCBsZW4pOworICAgICAgICAKKwkJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgCisJCQkgICBzdGFjayAqLworCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQorCQkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorICAgICAgICAgICAgICAgICAgICAgICAgCW5ld19za2ItPnByb3RvY29sID0gaHRvbnMoWDI1X1BST1QpOworCQkJZWxzZSAKKwkJCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCisJCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2s7CisgICAgICAgICAgICAJCisJCX0gZWxzZSB7CisJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfbm9fc29ja2V0OworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogVURQIG1nbXQgY21uZCwgbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgIH0KKworCWNhcmQtPnUueC51ZHBfcGt0X2xndGggPSAwOworCisJcmV0dXJuIDE7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB3aGF0IHR5cGUgb2YgVURQIGNhbGwgaXQgaXMuIERSVlNUQVRTIG9yIFhQSVBFOE5EID8KKyAqLworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCApCit7CisJeDI1X3VkcF9wa3RfdCAqeDI1X3VkcF9wa3QgPSAoeDI1X3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworICAgICAgICBpZigoeDI1X3VkcF9wa3QtPmlwX3BrdC5wcm90b2NvbCA9PSBVRFBNR01UX1VEUF9QUk9UT0NPTCkgJiYKKwkJKHgyNV91ZHBfcGt0LT5pcF9wa3QudmVyX2luZXRfaGRyX2xlbmd0aCA9PSAweDQ1KSAmJgorCQkoeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID09IG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJCSh4MjVfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID09IFVEUE1HTVRfUkVRVUVTVCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN0cm5jbXAoeDI1X3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRFBNR01UX1hQSVBFX1NJR05BVFVSRSwgOCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVURQX1hQSVBFX1RZUEU7CisJCQl9ZWxzZXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVURQIFBhY2tldCwgRmFpbGVkIFNpZ25hdHVyZSAhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwl9CisKKyAgICAgICAgcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApIAoreworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisKKyAgCisJeDI1X3VkcF9wa3RfdCAqeDI1X3VkcF9wa3QgPSAoeDI1X3VkcF9wa3RfdCAqKWRhdGE7IAorCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSBzaXplb2YoaXBfcGt0X3QpKyAKKwkgICAgICBzaXplb2YodWRwX3BrdF90KSsKKwkgICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkgICAgICBzaXplb2YoY2Jsb2NrX3QpKworCSAgICAgIG1ib3hfbGVuOworIAorCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKwl4MjVfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgCisJLyogZmlsbCBpbiBVRFAgbGVuZ3RoICovCisJdWRwX2xlbmd0aCA9IHNpemVvZih1ZHBfcGt0X3QpKyAKKwkJICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkJICAgICBzaXplb2YoY2Jsb2NrX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworCisJLyogcHV0IGl0IG9uIGFuIGV2ZW4gYm91bmRhcnkgKi8KKwlpZiAoIHVkcF9sZW5ndGggJiAweDAwMDEgKSB7CisJCXVkcF9sZW5ndGggKz0gMTsKKwkJbGVuICs9IDE7CisJCWV2ZW5fYm91bmQgPSAxOworCX0KKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9sZW5ndGggPSB0ZW1wOworCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSB4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQ7CisJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0ID0gCisJCQl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9IHRlbXA7CisKKworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKQorCQkoeDI1X3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKHgyNV91ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKwkJIAorCS8qIGNhbGN1bGF0ZSBVRFAgY2hlY2tzdW0gKi8KKwl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCisJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sIHVkcF9sZW5ndGgrVURQX09GRlNFVCk7CisKKwkvKiBmaWxsIGluIElQIGxlbmd0aCAqLworCWlwX2xlbmd0aCA9IGxlbjsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJeDI1X3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSB4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSAKKwkJCQl4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3MgPSBpcF90ZW1wOworCisJCSAKKwkvKiBmaWxsIGluIElQIGNoZWNrc3VtICovCisJeDI1X3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gY2FsY19jaGVja3N1bShkYXRhLCBzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47Cit9IC8qIHJlcGx5X3VkcCAqLworCit1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7IAorCXVuc2lnbmVkIGxvbmcgc3VtPTA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwOyBpIDxsZW47IGkrPTIgKSB7CisJCW1lbWNweSgmdGVtcCwmZGF0YVtpXSwyKTsKKwkJc3VtICs9ICh1bnNpZ25lZCBsb25nKXRlbXA7CisJfQorCisJd2hpbGUgKHN1bSA+PiAxNiApIHsKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZlVMKSArIChzdW0gPj4gMTYpOworCX0KKworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpc3VtOworCXRlbXAgPSB+dGVtcDsKKworCWlmKCB0ZW1wID09IDAgKSAKKwkJdGVtcCA9IDB4ZmZmZjsKKworCXJldHVybiB0ZW1wOwkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgaW50IGxjbikKK3sKKyAgICAgICAgaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKworICAgICAgICBpZighY2FyZC0+dS54LnVkcF9wa3RfbGd0aCAmJiAoc2tiLT5sZW4gPD0gTUFYX0xHVEhfVURQX01HTlRfUEtUKSl7CisgICAgICAgICAgICAgICAgY2FyZC0+dS54LnVkcF9wa3RfbGd0aCA9IHNrYi0+bGVuOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfdHlwZSA9IHVkcF90eXBlOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfbGNuID0gbGNuOworCQljYXJkLT51LngudWRwX2RldiA9IGRldjsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY2FyZC0+dS54LnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VRFBfUEtUOworICAgICAgICAgICAgICAgIHVkcF9wa3Rfc3RvcmVkID0gMTsKKworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IFVEUCBwYWNrZXQgbm90IHN0b3JlZCBmb3IgTENOICVkXG4iLCAKKwkJCQkJCQljYXJkLT5kZXZuYW1lLGxjbik7CisJfQorCisgICAgICAgIGlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX1NUQUNLKXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCisgICAgICAgIHJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsIHRoZSBwcHBfcHJpdmF0ZV9hcmVhIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF94MjVfY2hhbm5lbF9zdHJ1Y3QoIHgyNV9jaGFubmVsX3QgKmNoYW4gKQoreworCW1lbXNldCgmY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfZW50cnksMCxzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKwltZW1zZXQoJmNoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX25vX3NvY2tldCwwLHNpemVvZihyeF9pbnRyX3N0YXRfdCkpOworCW1lbXNldCgmY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwwLHNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBHbG9iYWwgU3RhdGlzdGljcworICovCitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QgKmNhcmQgKQoreworCW1lbXNldCgmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksMCxzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU01QIFN1cHBvcnQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgUzUwOF9TNTE0X2xvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KK3N0YXRpYyB2b2lkIFM1MDhfUzUxNF91bmxvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogeDI1X3RpbWVyX3JvdXRpbmUKKyAqCisgKiAJQSBtb3JlIGVmZmljaWVudCBwb2xsaW5nIHJvdXRpbmUuICBFYWNoIGhhbGYgYSBzZWNvbmQKKyAqIAlxdWV1ZSBhIHBvbGxpbmcgdGFzay4gV2Ugd2FudCB0byBkbyB0aGUgcG9sbGluZyBpbiBhIAorICogCXRhc2sgbm90IHRpbWVyLCBiZWNhdXNlIHRpbWVyIHJ1bnMgaW4gaW50ZXJydXB0IHRpbWUuCisgKgorICogCUZJWE1FIFBvbGxpbmcgc2hvdWxkIGJlIHJldGhpbmtlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB4MjVfdGltZXJfcm91dGluZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc2RsYV90ICpjYXJkID0gKHNkbGFfdCopZGF0YTsKKworCWlmICghY2FyZC0+d2FuZGV2LmRldil7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdG9wcGluZyB0aGUgWDI1IFBvbGwgVGltZXI6IE5vIERldi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FyZC0+b3Blbl9jbnQgIT0gY2FyZC0+dS54Lm51bV9vZl9jaCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdG9wcGluZyB0aGUgWDI1IFBvbGwgVGltZXI6IEludGVyZmFjZSBkb3duLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RvcHBpbmcgdGhlIFgyNSBQb2xsIFRpbWVyOiBTaHV0dGluZyBkb3duLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJdHJpZ2dlcl94MjVfcG9sbChjYXJkKTsKKwl9CisJCisJY2FyZC0+dS54LngyNV90aW1lci5leHBpcmVzPWppZmZpZXMrKEhaPj4xKTsKKwlhZGRfdGltZXIoJmNhcmQtPnUueC54MjVfdGltZXIpOworCXJldHVybjsKK30KKwordm9pZCBkaXNhYmxlX2NvbW1fc2h1dGRvd24oc2RsYV90ICpjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJLyogVHVybiBvZiBpbnRlcnJ1dHBzICovCisJbWJveC0+ZGF0YVswXSA9IDA7CisJaWYgKGNhcmQtPmh3LmZ3aWQgPT0gU0ZJRF9YMjVfNTA4KXsKKwkJbWJveC0+ZGF0YVsxXSA9IGNhcmQtPmh3LmlycTsKKwkJbWJveC0+ZGF0YVsyXSA9IDI7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAzOworCX1lbHNlIHsKKwkgCW1ib3gtPmNtZC5sZW5ndGggID0gMTsKKwl9CisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0lOVEVSUlVQVF9NT0RFOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJJTlRFUlJVUFQgT0ZGIEZBSUVEICV4XG4iLGVycik7CisKKwkvKiBCcmluZyBkb3duIEhETEMgKi8KKwltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfQ0xPU0U7CisJbWJveC0+Y21kLmxlbmd0aCAgPSAwOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJMSU5LIENMT1NFRCBGQUlMRUQgJXhcbiIsZXJyKTsKKworCisJLyogQnJpbmQgZG93biBEVFIgKi8KKwltYm94LT5kYXRhWzBdID0gMDsKKwltYm94LT5kYXRhWzJdID0gMDsKKwltYm94LT5kYXRhWzFdID0gMHgwMTsKKwltYm94LT5jbWQubGVuZ3RoICA9IDM7CisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0dMT0JBTF9WQVJTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJEVFIgRE9XTiBGQUlMRUQgJXhcbiIsZXJyKTsKKworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFkcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiYzZkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhZHJ2LmMKQEAgLTAsMCArMSwyMzE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYWRydi5jCVNETEEgU3VwcG9ydCBNb2R1bGUuICBNYWluIG1vZHVsZS4KKyoKKyoJCVRoaXMgbW9kdWxlIGlzIGEgbGlicmFyeSBvZiBjb21tb24gaGFyZHdhcmUtc3BlY2lmaWMgZnVuY3Rpb25zCisqCQl1c2VkIGJ5IGFsbCBTYW5nb21hIGRyaXZlcnMuCisqCisqIEF1dGhvcjoJR2lkZW9uIEhhY2sJCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIE1hciAyMCwgMjAwMSAgTmVuYWQgQ29yYmljCUFkZGVkIHRoZSBhdXRvX3BjaV9jZmcgZmlsZWQsIHRvIHN1cHBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBDSVNMT1QgIzAuIAorKiBBcHIgMDQsIDIwMDAgIE5lbmFkIENvcmJpYwlGaXhlZCB0aGUgYXV0byBtZW1vcnkgZGV0ZWN0aW9uIGNvZGUuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtZW1vcnkgdGVzdCBhdCBhZGRyZXNzIDB4QzgwMDAuCisqIE1hciAwOSwgMjAwMCAgTmVuYWQgQ29yYmljIAlBZGRlZCBHaWRlb24ncyBCdWcgRml4OiBjbGVhciBwY2kKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGZsYWdzIG9uIGluaXRpYWwgbG9hZC4KKyogSnVuIDAyLCAxOTk5ICBHaWRlb24gSGFjayAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFM1MTQgYWRhcHRlci4KKyoJCQkJVXBkYXRlcyBmb3IgTGludXggMi4yLlgga2VybmVscy4JCisqIFNlcCAxNywgMTk5OAlKYXNwcmVldCBTaW5naAlVcGRhdGVzIGZvciBsaW51eCAyLjIuWCBrZXJuZWxzCisqIERlYyAyMCwgMTk5NglHZW5lIEtvemluCVZlcnNpb24gMy4wLjAuIENvbXBsZXRlIG92ZXJoYXVsLgorKiBKdWwgMTIsIDE5OTYJR2VuZSBLb3ppbglDaGFuZ2VzIGZvciBMaW51eCAyLjAgY29tcGF0aWJpbGl0eS4KKyogSnVuIDEyLCAxOTk2CUdlbmUgS296aW4gCUFkZGVkIHN1cHBvcnQgZm9yIFM1MDMgY2FyZC4KKyogQXByIDMwLCAxOTk2CUdlbmUgS296aW4JU0RMQSBoYXJkd2FyZSBpbnRlcnJ1cHQgaXMgYWNrbm93bGVkZ2VkIGJlZm9yZQorKgkJCQljYWxsaW5nIHByb3RvY29sc3BlY2lmaWMgSVNSLgorKgkJCQlSZWdpc3RlciBJL08gcG9ydHMgd2l0aCBMaW51eCBrZXJuZWwuCisqCQkJCU1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzLgorKiBEZWMgMjAsIDE5OTUJR2VuZSBLb3ppbglGaXhlZCBhIGJ1ZyBpbiBpbnRlcnJ1cHQgcm91dGluZS4KKyogT2N0IDE0LCAxOTk1CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTm90ZXM6CisgKiAtLS0tLS0KKyAqIDEuIFRoaXMgY29kZSBpcyBtZW50IHRvIGJlIHN5c3RlbS1pbmRlcGVuZGVudCAoYXMgbXVjaCBhcyBwb3NzaWJsZSkuICBUbworICogICAgYWNoaXZlIHRoaXMsIHZhcmlvdXMgbWFjcm9zIGFyZSB1c2VkIHRvIGhpZGUgc3lzdGVtLXNwZWNpZmljIGludGVyZmFjZXMuCisgKiAgICBUbyBjb21waWxlIHRoaXMgY29kZSwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIG11c3QgYmUgZGVmaW5lZDoKKyAqCisgKglQbGF0Zm9ybQlEZWZpbmUKKyAqCS0tLS0tLS0tCS0tLS0tLQorICoJTGludXgJCV9MSU5VWF8KKyAqCVNDTyBVbml4CV9TQ09fVU5JWF8KKyAqCisgKiAyLiBTdXBwb3J0ZWQgYWRhcHRlciB0eXBlczoKKyAqCisgKglTNTAyQQorICoJRVM1MDJBIChTNTAyRSkKKyAqCVM1MDMKKyAqCVM1MDcKKyAqCVM1MDggKFM1MDkpCisgKgorICogMy4gUzUwMkEgTm90ZXM6CisgKgorICoJVGhlcmUgaXMgbm8gc2VwYXJhdGUgRFBNIHdpbmRvdyBlbmFibGUvZGlzYWJsZSBjb250cm9sIGluIFM1MDJBLiAgSXQKKyAqCW9wZW5zIGltbWVkaWF0ZWx5IGFmdGVyIGEgd2luZG93IG51bWJlciBpdCB3cml0dGVuIHRvIHRoZSBITUNSCisgKglyZWdpc3Rlci4gIFRvIGNsb3NlIHRoZSB3aW5kb3csIEhNQ1IgaGFzIHRvIGJlIHdyaXR0ZW4gYSB2YWx1ZQorICoJPz8/PzExMTFiIChlLmcuIDB4MEYgb3IgMHhGRikuCisgKgorICoJUzUwMkEgRFBNIHdpbmRvdyBjYW5ub3QgYmUgbG9jYXRlZCBhdCBvZmZzZXQgRTAwMCAoZS5nLiAweEFFMDAwKS4KKyAqCisgKglUaGVyZSBzaG91bGQgYmUgYSBkZWxheSBvZiA/Pz8gYmVmb3JlIHJlYWRpbmcgYmFjayBTNTAyQSBzdGF0dXMKKyAqCXJlZ2lzdGVyLgorICoKKyAqIDQuIFM1MDJFIE5vdGVzOgorICoKKyAqCVM1MDJFIGhhcyBhIGgvdyBidWc6IGFsdGhvdWdoIGRlZmF1bHQgSVJRIGxpbmUgc3RhdGUgaXMgSElHSCwgZW5hYmxpbmcKKyAqCWludGVycnVwdHMgYnkgc2V0dGluZyBiaXQgMSBvZiB0aGUgY29udHJvbCByZWdpc3RlciAoQkFTRSkgdG8gJzEnCisgKgljYXVzZXMgaXQgdG8gZ28gTE9XISBUaGVyZWZvcmUsIGRpc2FibGluZyBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhhdAorICoJYml0IHRvICcwJyBjYXVzZXMgbG93LXRvLWhpZ2ggdHJhbnNpdGlvbiBvbiBJUlEgbGluZSAoZ2hvc3R5CisgKglpbnRlcnJ1cHQpLiBUaGUgc2FtZSBvY2N1cnMgd2hlbiBkaXNhYmxpbmcgQ1BVIGJ5IHJlc2V0dGluZyBiaXQgMCBvZgorICoJQ1BVIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UrMykgLSBzZWUgdGhlIG5leHQgbm90ZS4KKyAqCisgKglTNTAyRSBDUFUgYW5kIERQTSBjb250cm9sIGlzIGxpbWl0ZWQ6CisgKgorICoJbyBDUFUgY2Fubm90IGJlIHN0b3BwZWQgaW5kZXBlbmRlbnRseS4gUmVzZXR0aW5nIGJpdCAwIG9mIHRoZSBDUFVpCisgKgkgIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UrMykgc2h1dHMgdGhlIGJvYXJkIGRvd24gZW50aXJlbHksIGluY2x1ZGluZworICoJICBEUE07CisgKgorICoJbyBEUE0gYWNjZXNzIGNhbm5vdCBiZSBjb250cm9sbGVkIGR5bmFtaWNhbGx5LiBPbmVzIENQVSBpcyBzdGFydGVkLAorICoJICBiaXQgMSBvZiB0aGUgY29udHJvbCByZWdpc3RlciAoQkFTRSkgaXMgdXNlZCB0byBlbmFibGUvZGlzYWJsZSBJUlEsCisgKgkgIHNvIHRoYXQgYWNjZXNzIHRvIHNoYXJlZCBtZW1vcnkgY2Fubm90IGJlIGRpc2FibGVkIHdoaWxlIENQVSBpcworICoJICBydW5uaW5nLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJX0xJTlVYXworCisjaWYJZGVmaW5lZChfTElOVVhfKQkvKioqKioqIExpbnV4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogc3VwcG9ydCBmb3IgbG9hZGFibGUgbW9kdWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4JLyogZm9yIGppZmZpZXMsIEhaLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2RsYWRydi5oPgkvKiBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhc2ZtLmg+CS8qIFNETEEgZmlybXdhcmUgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgkvKiBTRExBIFBDSSBoYXJkd2FyZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogUENJIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciBpbmIoKSwgb3V0YigpLCBldGMuICovCisKKyNkZWZpbmUgX0lOQihwb3J0KQkJKGluYihwb3J0KSkKKyNkZWZpbmUgX09VVEIocG9ydCwgYnl0ZSkJKG91dGIoKGJ5dGUpLChwb3J0KSkpCisjZGVmaW5lCVNZU1RFTV9USUNLCQlqaWZmaWVzCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKworI2VsaWYJZGVmaW5lZChfU0NPX1VOSVhfKQkvKioqKioqIFNDTyBVbml4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZgkhZGVmaW5lZChJTktFUk5FTCkKKyNlcnJvcglUaGlzIGNvZGUgTVVTVCBiZSBjb21waWxlZCBpbiBrZXJuZWwgbW9kZSEKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zZGxhZHJ2Lmg+CS8qIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPHN5cy9zZGxhc2ZtLmg+CS8qIFNETEEgZmlybXdhcmUgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8c3lzL2lubGluZS5oPgkJLyogZm9yIGluYigpLCBvdXRiKCksIGV0Yy4gKi8KKyNkZWZpbmUgX0lOQihwb3J0KQkJKGluYihwb3J0KSkKKyNkZWZpbmUgX09VVEIocG9ydCwgYnl0ZSkJKG91dGIoKHBvcnQpLChieXRlKSkpCisjZGVmaW5lCVNZU1RFTV9USUNLCQlsYm9sdAorCisjZWxzZQorI2Vycm9yCVVua25vd24gc3lzdGVtIHR5cGUhCisjZW5kaWYKKworI2RlZmluZQlNT0RfVkVSU0lPTgkzCisjZGVmaW5lCU1PRF9SRUxFQVNFCTAKKworI2RlZmluZQlTRExBX0lPREVMQVkJMTAwCS8qIEkvTyBSZC9XciBkZWxheSwgMTAgd29ya3MgZm9yIDQ4NkRYMi02NiAqLworI2RlZmluZQlFWEVDX0RFTEFZCTIwCS8qIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LCBta3MgKi8KKyNkZWZpbmUJRVhFQ19USU1FT1VUCShIWioyKQkvKiBjb21tYW5kIHRpbWVvdXQsIGluIHRpY2tzICovCisKKy8qIEkvTyBwb3J0IGFkZHJlc3MgcmFuZ2UgKi8KKyNkZWZpbmUgUzUwMkFfSU9SQU5HRQkzCisjZGVmaW5lIFM1MDJFX0lPUkFOR0UJNAorI2RlZmluZSBTNTAzX0lPUkFOR0UJMworI2RlZmluZSBTNTA3X0lPUkFOR0UJNAorI2RlZmluZSBTNTA4X0lPUkFOR0UJNAorCisvKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgUzUwMl9NQVhNRU0JMHgxMDAwMEwKKyNkZWZpbmUgUzUwM19NQVhNRU0JMHgxMDAwMEwKKyNkZWZpbmUgUzUwN19NQVhNRU0JMHg0MDAwMEwKKyNkZWZpbmUgUzUwOF9NQVhNRU0JMHg0MDAwMEwKKworLyogTWluaW11bSBhbW91bnQgb2YgbWVtb3J5ICovCisjZGVmaW5lIFM1MDJfTUlOTUVNCTB4ODAwMEwKKyNkZWZpbmUgUzUwM19NSU5NRU0JMHg4MDAwTAorI2RlZmluZSBTNTA3X01JTk1FTQkweDIwMDAwTAorI2RlZmluZSBTNTA4X01JTk1FTQkweDIwMDAwTAorI2RlZmluZSBOT19QT1JUICAgICAgICAgLTEKKworCisKKworCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFyZHdhcmUtc3BlY2lmaWMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IHNkbGFfZGV0ZWN0CShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX2F1dG9kcG0JKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IHNkbGFfc2V0ZHBtCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX2xvYWQJKHNkbGFod190KiBodywgc2ZtX3QqIHNmbSwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgc2RsYV9pbml0CShzZGxhaHdfdCogaHcpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2RsYV9tZW10ZXN0IChzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX2Jvb3RjZmcJKHNkbGFod190KiBodywgc2ZtX2luZm9fdCogc2ZtaW5mbyk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBtYWtlX2NvbmZpZ19ieXRlIChzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX3N0YXJ0CShzZGxhaHdfdCogaHcsIHVuc2lnbmVkIGFkZHIpOworCitzdGF0aWMgaW50IGluaXRfczUwMmEJKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IGluaXRfczUwMmUJKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IGluaXRfczUwMwkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgaW5pdF9zNTA3CShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBpbml0X3M1MDgJKHNkbGFod190KiBodyk7CisgICAgICAgICAgICAKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDJhCShpbnQgcG9ydCk7CitzdGF0aWMgaW50IGRldGVjdF9zNTAyZQkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUwMwkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUwNwkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUwOAkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUxNCAgKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IGZpbmRfczUxNF9hZGFwdGVyKHNkbGFod190KiBodywgY2hhciBmaW5kX2ZpcnN0X1M1MTRfY2FyZCk7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBwZWVrX2J5XzQgKHVuc2lnbmVkIGxvbmcgc3JjLCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgdm9pZCBwb2tlX2J5XzQgKHVuc2lnbmVkIGxvbmcgZGVzdCwgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBjYWxpYnJhdGVfZGVsYXkgKGludCBta3MpOworc3RhdGljIGludCBnZXRfb3B0aW9uX2luZGV4ICh1bnNpZ25lZCogb3B0bGlzdCwgdW5zaWduZWQgb3B0dmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGVja19tZW1yZWdpb24gKHZvaWQqIHB0ciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZAl0ZXN0X21lbXJlZ2lvbiAodm9pZCogcHRyLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtICh1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IGluaXRfcGNpX3Nsb3Qoc2RsYWh3X3QgKik7CisKK3N0YXRpYyBpbnQgcGNpX3Byb2JlKHNkbGFod190ICpodyk7CisKKy8qKioqKiogR2xvYmFsIERhdGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTm90ZTogQWxsIGRhdGEgbXVzdCBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkISEhCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNkbGFkcnZfcGNpX3RibFtdID0geworCXsgVjNfVkVORE9SX0lELCBWM19ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2RsYWRydl9wY2lfdGJsKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBjaGFyIG1vZG5hbWVbXQk9ICJzZGxhZHJ2IjsKK3N0YXRpYyBjaGFyIGZ1bGxuYW1lW10JPSAiU0RMQSBTdXBwb3J0IE1vZHVsZSI7CitzdGF0aWMgY2hhciBjb3B5cmlnaHRbXQk9ICIoYykgMTk5NS0xOTk5IFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4iOworc3RhdGljIHVuc2lnbmVkCWV4ZWNfaWRsZTsKKworLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICogVGhlc2UgYXJlIGFycmF5cyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCBieSB2ZXJpZmljYXRpb24gcm91dGluZXMuCisgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIGFycmF5IGlzIGl0cyBzaXplIChpLmUuIG51bWJlciBvZiBvcHRpb25zKS4KKyAqLworc3RhdGljIHVuc2lnbmVkCXM1MDJfcG9ydF9vcHRpb25zW10gPQorCXsgNCwgMHgyNTAsIDB4MzAwLCAweDM1MCwgMHgzNjAgfQorOworc3RhdGljIHVuc2lnbmVkCXM1MDNfcG9ydF9vcHRpb25zW10gPQorCXsgOCwgMHgyNTAsIDB4MjU0LCAweDMwMCwgMHgzMDQsIDB4MzUwLCAweDM1NCwgMHgzNjAsIDB4MzY0IH0KKzsKK3N0YXRpYyB1bnNpZ25lZAlzNTA4X3BvcnRfb3B0aW9uc1tdID0KKwl7IDgsIDB4MjUwLCAweDI3MCwgMHgyODAsIDB4MzAwLCAweDM1MCwgMHgzNjAsIDB4MzgwLCAweDM5MCB9Cis7CisKK3N0YXRpYyB1bnNpZ25lZCBzNTAyYV9pcnFfb3B0aW9uc1tdID0geyAwIH07CitzdGF0aWMgdW5zaWduZWQgczUwMmVfaXJxX29wdGlvbnNbXSA9IHsgNCwgMiwgMywgNSwgNyB9Oworc3RhdGljIHVuc2lnbmVkIHM1MDNfaXJxX29wdGlvbnNbXSAgPSB7IDUsIDIsIDMsIDQsIDUsIDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTA4X2lycV9vcHRpb25zW10gID0geyA4LCAzLCA0LCA1LCA3LCAxMCwgMTEsIDEyLCAxNSB9OworCitzdGF0aWMgdW5zaWduZWQgczUwMmFfZHBtYmFzZV9vcHRpb25zW10gPQoreworCTI4LAorCTB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsCisJMHhDMDAwMCwgMHhDMjAwMCwgMHhDNDAwMCwgMHhDNjAwMCwgMHhDODAwMCwgMHhDQTAwMCwgMHhDQzAwMCwKKwkweEQwMDAwLCAweEQyMDAwLCAweEQ0MDAwLCAweEQ2MDAwLCAweEQ4MDAwLCAweERBMDAwLCAweERDMDAwLAorCTB4RTAwMDAsIDB4RTIwMDAsIDB4RTQwMDAsIDB4RTYwMDAsIDB4RTgwMDAsIDB4RUEwMDAsIDB4RUMwMDAsCit9Oworc3RhdGljIHVuc2lnbmVkIHM1MDdfZHBtYmFzZV9vcHRpb25zW10gPQoreworCTMyLAorCTB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsIDB4QUUwMDAsCisJMHhCMDAwMCwgMHhCMjAwMCwgMHhCNDAwMCwgMHhCNjAwMCwgMHhCODAwMCwgMHhCQTAwMCwgMHhCQzAwMCwgMHhCRTAwMCwKKwkweEMwMDAwLCAweEMyMDAwLCAweEM0MDAwLCAweEM2MDAwLCAweEM4MDAwLCAweENBMDAwLCAweENDMDAwLCAweENFMDAwLAorCTB4RTAwMDAsIDB4RTIwMDAsIDB4RTQwMDAsIDB4RTYwMDAsIDB4RTgwMDAsIDB4RUEwMDAsIDB4RUMwMDAsIDB4RUUwMDAsCit9Oworc3RhdGljIHVuc2lnbmVkIHM1MDhfZHBtYmFzZV9vcHRpb25zW10gPQkvKiBpbmNsLiBTNTAyRSBhbmQgUzUwMyAqLworeworCTMyLAorCTB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsIDB4QUUwMDAsCisJMHhDMDAwMCwgMHhDMjAwMCwgMHhDNDAwMCwgMHhDNjAwMCwgMHhDODAwMCwgMHhDQTAwMCwgMHhDQzAwMCwgMHhDRTAwMCwKKwkweEQwMDAwLCAweEQyMDAwLCAweEQ0MDAwLCAweEQ2MDAwLCAweEQ4MDAwLCAweERBMDAwLCAweERDMDAwLCAweERFMDAwLAorCTB4RTAwMDAsIDB4RTIwMDAsIDB4RTQwMDAsIDB4RTYwMDAsIDB4RTgwMDAsIDB4RUEwMDAsIDB4RUMwMDAsIDB4RUUwMDAsCit9OworCisvKgorc3RhdGljIHVuc2lnbmVkCXM1MDJfZHBtc2l6ZV9vcHRpb25zW10gPSB7IDIsIDB4MjAwMCwgMHgxMDAwMCB9Oworc3RhdGljIHVuc2lnbmVkCXM1MDdfZHBtc2l6ZV9vcHRpb25zW10gPSB7IDIsIDB4MjAwMCwgMHg0MDAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwOF9kcG1zaXplX29wdGlvbnNbXSA9IHsgMSwgMHgyMDAwIH07CisqLworCitzdGF0aWMgdW5zaWduZWQJczUwMmFfcGNsa19vcHRpb25zW10gPSB7IDIsIDM2MDAsIDcyMDAgfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTAyZV9wY2xrX29wdGlvbnNbXSA9IHsgNSwgMzYwMCwgNTAwMCwgNzIwMCwgODAwMCwgMTAwMDAgfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTAzX3BjbGtfb3B0aW9uc1tdICA9IHsgMywgNzIwMCwgODAwMCwgMTAwMDAgfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTA3X3BjbGtfb3B0aW9uc1tdICA9IHsgMSwgMTIyODggfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTA4X3BjbGtfb3B0aW9uc1tdICA9IHsgMSwgMTYwMDAgfTsKKworLyogSG9zdCBtZW1vcnkgY29udHJvbCByZWdpc3RlciBtYXNrcyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwMmFfaG1jcltdID0KK3sKKwkweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFBLCAweDFDLAkvKiBBMDAwMCAtIEFDMDAwICovCisJMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyQSwgMHgyQywJLyogQzAwMDAgLSBDQzAwMCAqLworCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsCS8qIEQwMDAwIC0gREMwMDAgKi8KKwkweDMwLCAweDMyLCAweDM0LCAweDM2LCAweDM4LCAweDNBLCAweDNDLAkvKiBFMDAwMCAtIEVDMDAwICovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwMmVfaG1jcltdID0KK3sKKwkweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFBLCAweDFDLCAweDFFLAkvKiBBMDAwMCAtIEFFMDAwICovCisJMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyQSwgMHgyQywgMHgyRSwJLyogQzAwMDAgLSBDRTAwMCAqLworCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCS8qIEQwMDAwIC0gREUwMDAgKi8KKwkweDMwLCAweDMyLCAweDM0LCAweDM2LCAweDM4LCAweDNBLCAweDNDLCAweDNFLAkvKiBFMDAwMCAtIEVFMDAwICovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwN19obWNyW10gPQoreworCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCS8qIEEwMDAwIC0gQUUwMDAgKi8KKwkweDQwLCAweDQyLCAweDQ0LCAweDQ2LCAweDQ4LCAweDRBLCAweDRDLCAweDRFLAkvKiBCMDAwMCAtIEJFMDAwICovCisJMHg4MCwgMHg4MiwgMHg4NCwgMHg4NiwgMHg4OCwgMHg4QSwgMHg4QywgMHg4RSwJLyogQzAwMDAgLSBDRTAwMCAqLworCTB4QzAsIDB4QzIsIDB4QzQsIDB4QzYsIDB4QzgsIDB4Q0EsIDB4Q0MsIDB4Q0UsCS8qIEUwMDAwIC0gRUUwMDAgKi8KK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBzNTA4X2htY3JbXSA9Cit7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywJLyogQTAwMDAgLSBBRTAwMCAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCS8qIEMwMDAwIC0gQ0UwMDAgKi8KKwkweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAkvKiBEMDAwMCAtIERFMDAwICovCisJMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwJLyogRTAwMDAgLSBFRTAwMCAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwN19pcnFtYXNrW10gPQoreworCTB4MDAsIDB4MjAsIDB4NDAsIDB4NjAsIDB4ODAsIDB4QTAsIDB4QzAsIDB4RTAKK307CisKK3N0YXRpYyBpbnQgcGNpX3Nsb3RfYXJbTUFYX1M1MTRfQ0FSRFNdOworCisvKioqKioqKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb2R1bGUgJ2luc2VydCcgZW50cnkgcG9pbnQuCisgKiBvIHByaW50IGFubm91bmNlbWVudAorICogbyBpbml0aWFsaXplIHN0YXRpYyBkYXRhCisgKiBvIGNhbGlicmF0ZSBTRExBIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LgorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZGxhZHJ2X2luaXQodm9pZCkKK3sKKwlpbnQgaT0wOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCQlmdWxsbmFtZSwgTU9EX1ZFUlNJT04sIE1PRF9SRUxFQVNFLCBjb3B5cmlnaHQpOworCWV4ZWNfaWRsZSA9IGNhbGlicmF0ZV9kZWxheShFWEVDX0RFTEFZKTsKKyNpZmRlZiBXQU5ERUJVRwkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4ZWNfaWRsZSA9ICVkXG4iLCBtb2RuYW1lLCBleGVjX2lkbGUpOworI2VuZGlmCQorCisJLyogSW5pdGlhbGl6ZSB0aGUgUENJIENhcmQgYXJyYXksIHdoaWNoCisgICAgICAgICAqIHdpbGwgc3RvcmUgZmxhZ3MsIHVzZWQgdG8gbWFyayAKKyAgICAgICAgICogY2FyZCBpbml0aWFsaXphdGlvbiBzdGF0ZSAqLworCWZvciAoaT0wOyBpPE1BWF9TNTE0X0NBUkRTOyBpKyspCisJCXBjaV9zbG90X2FyW2ldID0gMHhGRjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gcmVsZWFzZSBhbGwgcmVtYWluaW5nIHN5c3RlbSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNkbGFkcnZfY2xlYW51cCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChzZGxhZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoc2RsYWRydl9jbGVhbnVwKTsKKworLyoqKioqKiogS2VybmVsIEFQSXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHVwIGFkYXB0ZXIuCisgKiBvIGRldGVjdCBhZGFwdGVyIHR5cGUKKyAqIG8gdmVyaWZ5IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICogbyBjaGVjayBmb3IgaGFyZHdhcmUgY29uZmxpY3RzCisgKiBvIHNldCB1cCBhZGFwdGVyIHNoYXJlZCBtZW1vcnkKKyAqIG8gdGVzdCBhZGFwdGVyIG1lbW9yeQorICogbyBsb2FkIGZpcm13YXJlCisgKiBSZXR1cm46CTAJb2suCisgKgkJPCAwCWVycm9yCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX3NldHVwKTsKKworaW50IHNkbGFfc2V0dXAgKHNkbGFod190KiBodywgdm9pZCogc2ZtLCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQqIGlycV9vcHQJPSBOVUxMOwkvKiBJUlEgb3B0aW9ucyAqLworCXVuc2lnbmVkKiBkcG1iYXNlX29wdAk9IE5VTEw7CS8qIERQTSB3aW5kb3cgYmFzZSBvcHRpb25zICovCisJdW5zaWduZWQqIHBjbGtfb3B0CT0gTlVMTDsJLyogQ1BVIGNsb2NrIHJhdGUgb3B0aW9ucyAqLworCWludCBlcnI9MDsKKworCWlmIChzZGxhX2RldGVjdChodykpIHsKKyAgICAgICAgICAgICAgICBpZihody0+dHlwZSAhPSBTRExBX1M1MTQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogbm8gU0RMQSBjYXJkIGZvdW5kIGF0IHBvcnQgMHglWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsIGh3LT5wb3J0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoaHctPnR5cGUgIT0gU0RMQV9TNTE0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvdW5kIFMlMDR1IGNhcmQgYXQgcG9ydCAweCVYLlxuIiwKKyAgICAgICAgICAgICAgICBtb2RuYW1lLCBody0+dHlwZSwgaHctPnBvcnQpOworCisgICAgICAgICAgICAgICAgaHctPmRwbXNpemUgPSBTRExBX1dJTkRPV1NJWkU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChody0+dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTAyQToKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDJBX0lPUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICBpcnFfb3B0ICAgICAgICAgPSBzNTAyYV9pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDJhX2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDJhX3BjbGtfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRExBX1M1MDJFOgorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmlvX3JhbmdlICAgID0gUzUwMkVfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDJlX2lycV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgZHBtYmFzZV9vcHQgICAgID0gczUwOF9kcG1iYXNlX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2xrX29wdCAgICAgICAgPSBzNTAyZV9wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTAzOgorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmlvX3JhbmdlICAgID0gUzUwM19JT1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgaXJxX29wdCAgICAgICAgID0gczUwM19pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDhfZHBtYmFzZV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgcGNsa19vcHQgICAgICAgID0gczUwM19wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTA3OgorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmlvX3JhbmdlICAgID0gUzUwN19JT1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgaXJxX29wdCAgICAgICAgID0gczUwOF9pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDdfZHBtYmFzZV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgcGNsa19vcHQgICAgICAgID0gczUwN19wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTA4OgorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmlvX3JhbmdlICAgID0gUzUwOF9JT1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgaXJxX29wdCAgICAgICAgID0gczUwOF9pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDhfZHBtYmFzZV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgcGNsa19vcHQgICAgICAgID0gczUwOF9wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgSVJRIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmICghZ2V0X29wdGlvbl9pbmRleChpcnFfb3B0LCBody0+aXJxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElSUSAlZCBpcyBpbnZhbGlkIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIAltb2RuYW1lLCBody0+aXJxKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9IAorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IENQVSBjbG9jayByYXRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmIChody0+cGNsayA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaHctPnBjbGsgPSBwY2xrX29wdFsxXTsgIC8qIHVzZSBkZWZhdWx0ICovCisgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFnZXRfb3B0aW9uX2luZGV4KHBjbGtfb3B0LCBody0+cGNsaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBDUFUgY2xvY2sgJXUgaXMgaW52YWxpZCFcbiIsCisJCQkJbW9kbmFtZSwgaHctPnBjbGspOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogYXNzdW1pbmcgQ1BVIGNsb2NrIHJhdGUgb2YgJXUga0h6LlxuIiwKKwkJCW1vZG5hbWUsIGh3LT5wY2xrKTsKKworICAgICAgICAgICAgICAgIC8qIFNldHVwIGFkYXB0ZXIgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgYW5kIHRlc3QgbWVtb3J5ICovCisgICAgICAgICAgICAgICAgaWYgKGh3LT5kcG1iYXNlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNkbGFfYXV0b2RwbShodyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IGNhbid0IGZpbmQgYXZhaWxhYmxlIG1lbW9yeSByZWdpb24hXG4iLAorCQkJCQltb2RuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWdldF9vcHRpb25faW5kZXgoZHBtYmFzZV9vcHQsCisJCQl2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogbWVtb3J5IGFkZHJlc3MgMHglbFggaXMgaW52YWxpZCFcbiIsCisJCQkJbW9kbmFtZSwgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2RsYV9zZXRkcG0oaHcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IDhLIG1lbW9yeSByZWdpb24gYXQgMHglbFggaXMgbm90IGF2YWlsYWJsZSFcbiIsCisJCQkJbW9kbmFtZSwgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJCSIlczogZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgaXMgc2V0IGF0IDB4JWxYLlxuIiwKKwkJCQltb2RuYW1lLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKworCisJCS8qIElmIHdlIGZpbmQgbWVtb3J5IGluIDB4RSoqKiogTWVtb3J5IHJlZ2lvbiwgCisgICAgICAgICAgICAgICAgICogd2FybiB0aGUgdXNlciB0byBkaXNhYmxlIHRoZSBTSEFET1cgUkFNLiAgCisgICAgICAgICAgICAgICAgICogU2luY2UgbWVtb3J5IGNvcnJ1cHRpb24gY2FuIG9jY3VyIGlmIFNIQURPVyBpcworICAgICAgICAgICAgICAgICAqIGVuYWJsZWQuIFRoaXMgY2FuIGNhdXNlcyByYW5kb20gY3Jhc2hlcyAhICovCisJCWlmICh2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpID49IDB4RTAwMDApeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG4lczogISEhISEhISEgIFdBUk5JTkcgISEhISEhISFcbiIsbW9kbmFtZSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogV0FOUElQRSBpcyB1c2luZyAweCVsWCBtZW1vcnkgcmVnaW9uICEhIVxuIiwKKwkJCQkJCW1vZG5hbWUsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICAgUGxlYXNlIGRpc2FibGUgdGhlIFNIQURPVyBSQU0sIG90aGVyd2lzZVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgICAgICAgICB5b3VyIHN5c3RlbSBtaWdodCBjcmFzaCByYW5kb21seSBmcm9tIHRpbWUgdG8gdGltZSAhXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAhISEhISEhISAgV0FSTklORyAhISEhISEhIVxuXG4iLG1vZG5hbWUpOworCQl9CisgICAgICAgIH0KKworCWVsc2UgeworCQlody0+bWVtb3J5ID0gdGVzdF9tZW1yZWdpb24oKHZvaWQqKWh3LT5kcG1iYXNlLCAKKwkJCU1BWF9TSVpFT0ZfUzUxNF9NRU1PUlkpOworCQlpZihody0+bWVtb3J5IDwgKDI1NiAqIDEwMjQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBlcnJvciBpbiB0ZXN0aW5nIFM1MTQgbWVtb3J5ICgweCVsWClcbiIsCisJCQkJbW9kbmFtZSwgaHctPm1lbW9yeSk7CisJCQlzZGxhX2Rvd24oaHcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisgICAgCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvdW5kICVsdUsgYnl0ZXMgb2Ygb24tYm9hcmQgbWVtb3J5XG4iLAorCQltb2RuYW1lLCBody0+bWVtb3J5IC8gMTAyNCk7CisKKwkvKiBMb2FkIGZpcm13YXJlLiBJZiBsb2FkZXIgZmFpbHMgdGhlbiBzaHV0IGRvd24gYWRhcHRlciAqLworCWVyciA9IHNkbGFfbG9hZChodywgc2ZtLCBsZW4pOworCWlmIChlcnIpIHNkbGFfZG93bihodyk7CQkvKiBzaHV0ZG93biBhZGFwdGVyICovCisKKwlyZXR1cm4gZXJyOworfSAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTaHV0IGRvd24gU0RMQTogZGlzYWJsZSBzaGFyZWQgbWVtb3J5IGFjY2VzcyBhbmQgaW50ZXJydXB0cywgc3RvcCBDUFUsIGV0Yy4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfZG93bik7CisKK2ludCBzZGxhX2Rvd24gKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IGk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgQ1BVX25vOworICAgICAgICB1MzIgaW50X2NvbmZpZywgaW50X3N0YXR1czsKKworICAgICAgICBpZighcG9ydCAmJiAoaHctPnR5cGUgIT0gU0RMQV9TNTE0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCV9PVVRCKHBvcnQsIDB4MDgpOwkJLyogaGFsdCBDUFUgKi8KKwkJX09VVEIocG9ydCwgMHgwOCk7CisJCV9PVVRCKHBvcnQsIDB4MDgpOworCQlody0+cmVnc1swXSA9IDB4MDg7CisJCV9PVVRCKHBvcnQgKyAxLCAweEZGKTsJCS8qIGNsb3NlIG1lbW9yeSB3aW5kb3cgKi8KKwkJaHctPnJlZ3NbMV0gPSAweEZGOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAyRToKKwkJX09VVEIocG9ydCArIDMsIDApOwkJLyogc3RvcCBDUFUgKi8KKwkJX09VVEIocG9ydCwgMCk7CQkJLyogcmVzZXQgYm9hcmQgKi8KKwkJZm9yIChpID0gMDsgaSA8IFM1MDJFX0lPUkFOR0U7ICsraSkKKwkJCWh3LT5yZWdzW2ldID0gMAorCQk7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJY2FzZSBTRExBX1M1MDc6CisJY2FzZSBTRExBX1M1MDg6CisJCV9PVVRCKHBvcnQsIDApOwkJCS8qIHJlc2V0IGJvYXJkIGxvZ2ljICovCisJCWh3LT5yZWdzWzBdID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUxNDoKKwkJLyogaGFsdCB0aGUgYWRhcHRlciAqLworICAgICAgICAgICAgICAgICooY2hhciAqKWh3LT52ZWN0b3IgPSBTNTE0X0NQVV9IQUxUOworICAgICAgICAJQ1BVX25vID0gaHctPlM1MTRfY3B1X25vWzBdOworCisJCS8qIGRpc2FibGUgdGhlIFBDSSBJUlEgYW5kIGRpc2FibGUgbWVtb3J5IGFjY2VzcyAqLworICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX0lOVF9DT05GSUcsICZpbnRfY29uZmlnKTsKKwkgICAgICAgIGludF9jb25maWcgJj0gKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/IH5QQ0lfRElTQUJMRV9JUlFfQ1BVX0EgOgl+UENJX0RJU0FCTEVfSVJRX0NQVV9COworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCBpbnRfY29uZmlnKTsKKwkJcmVhZF9TNTE0X2ludF9zdGF0KGh3LCAmaW50X3N0YXR1cyk7CisJCVM1MTRfaW50YWNrKGh3LCBpbnRfc3RhdHVzKTsKKwkJaWYoQ1BVX25vID09IFM1MTRfQ1BVX0EpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGh3LT5wY2lfZGV2LCBQQ0lfTUFQMF9EV09SRCwKKwkJCQlQQ0lfQ1BVX0FfTUVNX0RJU0FCTEUpOworCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGh3LT5wY2lfZGV2LCBQQ0lfTUFQMV9EV09SRCwKKwkJCQlQQ0lfQ1BVX0JfTUVNX0RJU0FCTEUpOworCisJCS8qIGZyZWUgdXAgdGhlIGFsbG9jYXRlZCB2aXJ0dWFsIG1lbW9yeSAqLworIAkJaW91bm1hcCgodm9pZCAqKWh3LT5kcG1iYXNlKTsKKyAgICAgICAgCWlvdW5tYXAoKHZvaWQgKilody0+dmVjdG9yKTsKKyAJCWJyZWFrOworCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWFwIHNoYXJlZCBtZW1vcnkgd2luZG93IGludG8gU0RMQSBhZGRyZXNzIHNwYWNlLgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9tYXBtZW0pOworCitpbnQgc2RsYV9tYXBtZW0gKHNkbGFod190KiBodywgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlyZWdpc3RlciBpbnQgdG1wOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwljYXNlIFNETEFfUzUwMkU6CisJCWlmIChhZGRyIDwgUzUwMl9NQVhNRU0pCXsgLyogdmVyaWZ5IHBhcmFtZXRlciAqLworCQkJdG1wID0gYWRkciA+PiAxMzsJLyogY29udmVydCB0byByZWdpc3RlciBtYXNrICovCisJCQlfT1VUQihwb3J0ICsgMiwgdG1wKTsKKwkJCWh3LT5yZWdzWzJdID0gdG1wOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJCWlmIChhZGRyIDwgUzUwM19NQVhNRU0pCXsgLyogdmVyaWZ5IHBhcmFtZXRlciAqLworCQkJdG1wID0gKGh3LT5yZWdzWzBdICYgMHg4RikgfCAoKGFkZHIgPj4gOSkgJiAweDcwKTsKKwkJCV9PVVRCKHBvcnQsIHRtcCk7CisJCQlody0+cmVnc1swXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA3OgorCQlpZiAoYWRkciA8IFM1MDdfTUFYTUVNKSB7CisJCQlpZiAoIShfSU5CKHBvcnQpICYgMHgwMikpCisJCQkJcmV0dXJuIC1FSU87CisJCQl0bXAgPSBhZGRyID4+IDEzOwkvKiBjb252ZXJ0IHRvIHJlZ2lzdGVyIG1hc2sgKi8KKwkJCV9PVVRCKHBvcnQgKyAyLCB0bXApOworCQkJaHctPnJlZ3NbMl0gPSB0bXA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwODoKKwkJaWYgKGFkZHIgPCBTNTA4X01BWE1FTSkgeworCQkJdG1wID0gYWRkciA+PiAxMzsJLyogY29udmVydCB0byByZWdpc3RlciBtYXNrICovCisJCQlfT1VUQihwb3J0ICsgMiwgdG1wKTsKKwkJCWh3LT5yZWdzWzJdID0gdG1wOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisJCXJldHVybiAwOworCisgCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlody0+dmVjdG9yID0gYWRkciAmIDB4RkZGRkUwMDBMOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfaW50ZW4pOworCitpbnQgc2RsYV9pbnRlbiAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyRToKKwkJLyogTm90ZSB0aGFyIGludGVycnVwdCBjb250cm9sIG9wZXJhdGlvbnMgb24gUzUwMkUgYXJlIGFsbG93ZWQKKwkJICogb25seSBpZiBDUFUgaXMgZW5hYmxlZCAoYml0IDAgb2Ygc3RhdHVzIHJlZ2lzdGVyIGlzIHNldCkuCisJCSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MDEpIHsKKwkJCV9PVVRCKHBvcnQsIDB4MDIpOwkvKiBiaXQxID0gMSwgYml0MiA9IDAgKi8KKwkJCV9PVVRCKHBvcnQsIDB4MDYpOwkvKiBiaXQxID0gMSwgYml0MiA9IDEgKi8KKwkJCWh3LT5yZWdzWzBdID0gMHgwNjsKKwkJfQorCQllbHNlIHJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDQ7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJLyogdXBkYXRlIG1pcnJvciAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCQlpZiAoIShfSU5CKHBvcnQpICYgMHgwMikpCQkvKiB2ZXJpZnkgKi8KKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA4OgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MTA7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJLyogdXBkYXRlIG1pcnJvciAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCQlpZiAoIShfSU5CKHBvcnQgKyAxKSAmIDB4MTApKQkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkE6CisJY2FzZSBTRExBX1M1MDc6CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgU0RMQV9TNTE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbi4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfaW50ZGUpOworCitpbnQgc2RsYV9pbnRkZSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyRToKKwkJLyogTm90ZXM6CisJCSAqICAxKSBpbnRlcnJ1cHQgY29udHJvbCBvcGVyYXRpb25zIGFyZSBhbGxvd2VkIG9ubHkgaWYgQ1BVIGlzCisJCSAqICAgICBlbmFibGVkIChiaXQgMCBvZiBzdGF0dXMgcmVnaXN0ZXIgaXMgc2V0KS4KKwkJICogIDIpIGRpc2FibGluZyBpbnRlcnJ1cHRzIHVzaW5nIGJpdCAxIG9mIGNvbnRyb2wgcmVnaXN0ZXIKKwkJICogICAgIGNhdXNlcyBJUlEgbGluZSBnbyBoaWdoLCB0aGVyZWZvcmUgd2UgYXJlIGdvaW5nIHRvIHVzZQorCQkgKiAgICAgMHgwNCBpbnN0ZWFkOiBsb3dlciBpdCB0byBpbmhpYml0IGludGVycnVwdHMgdG8gUEMuCisJCSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MDEpIHsKKwkJCV9PVVRCKHBvcnQsIGh3LT5yZWdzWzBdICYgfjB4MDQpOworCQkJaHctPnJlZ3NbMF0gJj0gfjB4MDQ7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMzoKKwkJdG1wID0gaHctPnJlZ3NbMF0gJiB+MHgwNDsKKwkJX09VVEIocG9ydCwgdG1wKTsKKwkJaHctPnJlZ3NbMF0gPSB0bXA7CQkJLyogdXBkYXRlIG1pcnJvciAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MDIpCQkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwODoKKwkJdG1wID0gaHctPnJlZ3NbMF0gJiB+MHgxMDsKKwkJX09VVEIocG9ydCwgdG1wKTsKKwkJaHctPnJlZ3NbMF0gPSB0bXA7CQkJLyogdXBkYXRlIG1pcnJvciAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MTApCQkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkE6CisJY2FzZSBTRExBX1M1MDc6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFja25vd2xlZGdlIFNETEEgaGFyZHdhcmUgaW50ZXJydXB0LgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9pbnRhY2spOworCitpbnQgc2RsYV9pbnRhY2sgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkU6CisJCS8qIFRvIGFja25vbGVkZ2UgaGFyZHdhcmUgaW50ZXJydXB0IHdlIGhhdmUgdG8gdG9nZ2xlIGJpdCAzIG9mCisJCSAqIGNvbnRyb2wgcmVnaXN0ZXI6IFxfLworCQkgKiBOb3RlIHRoYXQgaW50ZXJydXB0IGNvbnRyb2wgb3BlcmF0aW9ucyBvbiBTNTAyRSBhcmUgYWxsb3dlZAorCQkgKiBvbmx5IGlmIENQVSBpcyBlbmFibGVkIChiaXQgMSBvZiBzdGF0dXMgcmVnaXN0ZXIgaXMgc2V0KS4KKwkJICovCisJCWlmIChfSU5CKHBvcnQpICYgMHgwMSkgeworCQkJdG1wID0gaHctPnJlZ3NbMF0gJiB+MHgwNDsKKwkJCV9PVVRCKHBvcnQsIHRtcCk7CisJCQl0bXAgfD0gMHgwNDsKKwkJCV9PVVRCKHBvcnQsIHRtcCk7CisJCQlody0+cmVnc1swXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQlpZiAoX0lOQihwb3J0KSAmIDB4MDQpIHsKKwkJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MDg7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJdG1wIHw9IDB4MDg7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJaHctPnJlZ3NbMF0gPSB0bXA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkE6CisJY2FzZSBTRExBX1M1MDc6CisJY2FzZSBTRExBX1M1MDg6CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBY2tub3dsZWRnZSBTNTE0IGhhcmR3YXJlIGludGVycnVwdC4KKyAqLworCitFWFBPUlRfU1lNQk9MKFM1MTRfaW50YWNrKTsKKwordm9pZCBTNTE0X2ludGFjayAoc2RsYWh3X3QqIGh3LCB1MzIgaW50X3N0YXR1cykKK3sKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX0lOVF9TVEFUVVMsIGludF9zdGF0dXMpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCB0aGUgUzUxNCBoYXJkd2FyZSBpbnRlcnJ1cHQgc3RhdHVzLgorICovCisKK0VYUE9SVF9TWU1CT0wocmVhZF9TNTE0X2ludF9zdGF0KTsKKwordm9pZCByZWFkX1M1MTRfaW50X3N0YXQgKHNkbGFod190KiBodywgdTMyKiBpbnRfc3RhdHVzKQoreworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX0lOVF9TVEFUVVMsIGludF9zdGF0dXMpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIGFkYXB0ZXIncyBDUFUuCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2ludHIpOworCitpbnQgc2RsYV9pbnRyIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4NDApKSB7CisJCQlfT1VUQihwb3J0LCAweDEwKTsJCS8qIGlzc3VlIE5NSSB0byBDUFUgKi8KKwkJCWh3LT5yZWdzWzBdID0gMHgxMDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA3OgorCQlpZiAoKF9JTkIocG9ydCkgJiAweDA2KSA9PSAweDA2KSB7CisJCQlfT1VUQihwb3J0ICsgMywgMCk7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwODoKKwkJaWYgKF9JTkIocG9ydCArIDEpICYgMHgwMikgeworCQkJX09VVEIocG9ydCwgMHgwOCk7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJY2FzZSBTRExBX1M1MDM6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgQWRhcHRlciBDb21tYW5kLgorICogbyBTZXQgZXhlYyBmbGFnLgorICogbyBCdXN5LXdhaXQgdW50aWwgZmxhZyBpcyByZXNldC4KKyAqIG8gUmV0dXJuIG51bWJlciBvZiBsb29wcyBtYWRlLCBvciAwIGlmIGNvbW1hbmQgdGltZWQgb3V0LgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9leGVjKTsKKworaW50IHNkbGFfZXhlYyAodm9pZCogb3BmbGFnKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqIGZsYWcgPSBvcGZsYWc7CisJdW5zaWduZWQgbG9uZyB0c3RvcDsKKwlpbnQgbmxvb3BzOworCisJaWYocmVhZGIoZmxhZykgIT0gMHgwMCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiV0FOUElQRTogb3BwIGZsYWcgc2V0IG9uIGVudHJ5IHRvIHNkbGFfZXhlY1xuIik7CisJCXJldHVybiAwOworCX0KKwkKKwl3cml0ZWIoMHgwMSwgZmxhZyk7CisKKwl0c3RvcCA9IFNZU1RFTV9USUNLICsgRVhFQ19USU1FT1VUOworCisJZm9yIChubG9vcHMgPSAxOyAocmVhZGIoZmxhZykgPT0gMHgwMSk7ICsrIG5sb29wcykgeworCQl1bnNpZ25lZCBkZWxheSA9IGV4ZWNfaWRsZTsKKwkJd2hpbGUgKC0tIGRlbGF5KTsJCQkvKiBkZWxheSAqLworCQlpZiAoU1lTVEVNX1RJQ0sgPiB0c3RvcCkgcmV0dXJuIDA7CS8qIHRpbWUgaXMgdXAhICovCisJfQorCXJldHVybiBubG9vcHM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhYnNvbHV0ZSBhZGFwdGVyIG1lbW9yeS4KKyAqIFRyYW5zZmVyIGRhdGEgZnJvbSBhZGFwdGVyJ3MgbWVtb3J5IHRvIGRhdGEgYnVmZmVyLgorICoKKyAqIE5vdGU6CisgKiBDYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGNyb3NzaW5nIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGJvdW5kYXJ5LgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgYXRvbWljLCBzbyBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdCBpZgorICogaW50ZXJydXB0IHJvdXRpbmVzIGFyZSBhY2Nlc3NpbmcgYWRhcHRlciBzaGFyZWQgbWVtb3J5LgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9wZWVrKTsKKworaW50IHNkbGFfcGVlayAoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCisJaWYgKGFkZHIgKyBsZW4gPiBody0+bWVtb3J5KQkvKiB2ZXJpZnkgYXJndW1lbnRzICovCisJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmKGh3LT50eXBlID09IFNETEFfUzUxNCkgewkvKiBjb3B5IGRhdGEgZm9yIHRoZSBTNTE0IGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICBwZWVrX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgYWRkciwgYnVmLCBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKworICAgICAgICBlbHNlIHsJCQkJLyogY29weSBkYXRhIGZvciB0aGUgUzUwOCBhZGFwdGVyICovCisJICAgICAgICB1bnNpZ25lZCBsb25nIG9sZHZlYyA9IGh3LT52ZWN0b3I7CisgICAgICAgIAl1bnNpZ25lZCB3aW5zaXplID0gaHctPmRwbXNpemU7CisJICAgICAgICB1bnNpZ25lZCBjdXJwb3MsIGN1cmxlbjsgICAvKiBjdXJyZW50IG9mZnNldCBhbmQgYmxvY2sgc2l6ZSAqLworICAgICAgICAJdW5zaWduZWQgbG9uZyBjdXJ2ZWM7ICAgICAgLyogY3VycmVudCBEUE0gd2luZG93IHZlY3RvciAqLworCSAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobGVuICYmICFlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnBvcyA9IGFkZHIgJSB3aW5zaXplOyAgLyogY3VycmVudCB3aW5kb3cgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZWMgPSBhZGRyIC0gY3VycG9zOyAgIC8qIGN1cnJlbnQgd2luZG93IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VybGVuID0gKGxlbiA+ICh3aW5zaXplIC0gY3VycG9zKSkgPworCQkJCSh3aW5zaXplIC0gY3VycG9zKSA6IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbG9jYXRlIHdpbmRvdyBhbmQgY29weSBibG9jayBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzZGxhX21hcG1lbShodywgY3VydmVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlZWtfYnlfNCAoKHVuc2lnbmVkIGxvbmcpaHctPmRwbWJhc2UgKyBjdXJwb3MsIGJ1ZiwKKwkJCQljdXJsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkciAgICAgICArPSBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICA9IChjaGFyKilidWYgKyBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgIC09IGN1cmxlbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIERQTSB3aW5kb3cgcG9zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBzZGxhX21hcG1lbShodywgb2xkdmVjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGRhdGEgZnJvbSBhZGFwdGVyJ3MgbWVtb3J5IHRvIGEgZGF0YSBidWZmZXIgaW4gNC1ieXRlIGNodW5rcy4KKyAqIE5vdGUgdGhhdCB3ZSBlbnN1cmUgdGhhdCB0aGUgU0RMQSBtZW1vcnkgYWRkcmVzcyBpcyBvbiBhIDQtYnl0ZSBib3VuZGFyeQorICogYmVmb3JlIHdlIGJlZ2luIG1vdmluZyB0aGUgZGF0YSBpbiA0LWJ5dGUgY2h1bmtzLgorKi8KKworc3RhdGljIHZvaWQgcGVla19ieV80ICh1bnNpZ25lZCBsb25nIHNyYywgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pCit7CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGRhdGEgdW50aWwgd2UgZ2V0IHRvIGEgNC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHdoaWxlIChsZW4gJiYgKHNyYyAmIDB4MDMpKSB7CisgICAgICAgICAgICAgICAgKihjaGFyICopYnVmICsrID0gcmVhZGIoc3JjICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IGRhdGEgaW4gNC1ieXRlIGNodW5rcyAqLworICAgICAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKilidWYgPSByZWFkbChzcmMpOworICAgICAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICB9CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGFueSByZW1haW5pbmcgZGF0YSAqLworICAgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICAgICAgKihjaGFyICopYnVmICsrID0gcmVhZGIoc3JjICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIEFic29sdXRlIEFkYXB0ZXIgTWVtb3J5LgorICogVHJhbnNmZXIgZGF0YSBmcm9tIGRhdGEgYnVmZmVyIHRvIGFkYXB0ZXIncyBtZW1vcnkuCisgKgorICogTm90ZToKKyAqIENhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gY3Jvc3NpbmcgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgYm91bmRhcnkuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdG9taWMsIHNvIGNhbGxlciBtdXN0IGRpc2FibGUgaW50ZXJydXB0IGlmCisgKiBpbnRlcnJ1cHQgcm91dGluZXMgYXJlIGFjY2Vzc2luZyBhZGFwdGVyIHNoYXJlZCBtZW1vcnkuCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX3Bva2UpOworIAoraW50IHNkbGFfcG9rZSAoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCisJaWYgKGFkZHIgKyBsZW4gPiBody0+bWVtb3J5KQkvKiB2ZXJpZnkgYXJndW1lbnRzICovCisJCXJldHVybiAtRUlOVkFMOworICAgCisgICAgICAgIGlmKGh3LT50eXBlID09IFNETEFfUzUxNCkgewkvKiBjb3B5IGRhdGEgZm9yIHRoZSBTNTE0IGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICBwb2tlX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgYWRkciwgYnVmLCBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKwkKKwllbHNlIHsJCQkJLyogY29weSBkYXRhIGZvciB0aGUgUzUwOCBhZGFwdGVyICovCisgICAgCQl1bnNpZ25lZCBsb25nIG9sZHZlYyA9IGh3LT52ZWN0b3I7CisJICAgICAgICB1bnNpZ25lZCB3aW5zaXplID0gaHctPmRwbXNpemU7CisgICAgICAgIAl1bnNpZ25lZCBjdXJwb3MsIGN1cmxlbjsgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGFuZCBibG9jayBzaXplICovCisgICAgICAgIAl1bnNpZ25lZCBsb25nIGN1cnZlYzsgICAgICAgIC8qIGN1cnJlbnQgRFBNIHdpbmRvdyB2ZWN0b3IgKi8KKyAgICAgICAgCWludCBlcnIgPSAwOworCisJCXdoaWxlIChsZW4gJiYgIWVycikgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycG9zID0gYWRkciAlIHdpbnNpemU7ICAgIC8qIGN1cnJlbnQgd2luZG93IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVjID0gYWRkciAtIGN1cnBvczsgICAgIC8qIGN1cnJlbnQgd2luZG93IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VybGVuID0gKGxlbiA+ICh3aW5zaXplIC0gY3VycG9zKSkgPworCQkJCSh3aW5zaXplIC0gY3VycG9zKSA6IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbG9jYXRlIHdpbmRvdyBhbmQgY29weSBibG9jayBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBzZGxhX21hcG1lbShodywgY3VydmVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBva2VfYnlfNCAoKHVuc2lnbmVkIGxvbmcpaHctPmRwbWJhc2UgKyBjdXJwb3MsIGJ1ZiwKKwkJCQljdXJsZW4pOworCSAgICAgICAgICAgICAgICBhZGRyICAgICAgICs9IGN1cmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiAgICAgICAgID0gKGNoYXIqKWJ1ZiArIGN1cmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAgICAgICAgLT0gY3VybGVuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgRFBNIHdpbmRvdyBwb3NpdGlvbiAqLworICAgICAgICAgICAgICAgIHNkbGFfbWFwbWVtKGh3LCBvbGR2ZWMpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIGZyb20gYSBkYXRhIGJ1ZmZlciB0byBhZGFwdGVyJ3MgbWVtb3J5IGluIDQtYnl0ZSBjaHVua3MuCisgKiBOb3RlIHRoYXQgd2UgZW5zdXJlIHRoYXQgdGhlIFNETEEgbWVtb3J5IGFkZHJlc3MgaXMgb24gYSA0LWJ5dGUgYm91bmRhcnkKKyAqIGJlZm9yZSB3ZSBiZWdpbiBtb3ZpbmcgdGhlIGRhdGEgaW4gNC1ieXRlIGNodW5rcy4KKyovCisKK3N0YXRpYyB2b2lkIHBva2VfYnlfNCAodW5zaWduZWQgbG9uZyBkZXN0LCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKworICAgICAgICAvKiBieXRlIGNvcHkgZGF0YSB1bnRpbCB3ZSBnZXQgdG8gYSA0LWJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgd2hpbGUgKGxlbiAmJiAoZGVzdCAmIDB4MDMpKSB7CisgICAgICAgICAgICAgICAgd3JpdGViICgqKGNoYXIgKilidWYgKyssIGRlc3QgKyspOworICAgICAgICAgICAgICAgIGxlbiAtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvcHkgZGF0YSBpbiA0LWJ5dGUgY2h1bmtzICovCisgICAgICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICAgICAgICAgIHdyaXRlbCAoKih1bnNpZ25lZCBsb25nICopYnVmLCBkZXN0KTsKKyAgICAgICAgICAgICAgICBkZXN0ICs9IDQ7CisgICAgICAgICAgICAgICAgYnVmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBieXRlIGNvcHkgYW55IHJlbWFpbmluZyBkYXRhICovCisgICAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgICAgICAgICB3cml0ZWIgKCooY2hhciAqKWJ1ZiArKyAsIGRlc3QgKyspOworICAgICAgICAgICAgICAgIGxlbiAtLTsKKyAgICAgICAgfQorfQorCisKKyNpZmRlZglET05UX0NPTVBJUExFX1RISVMKKyNlbmRpZgkvKiBET05UX0NPTVBJUExFX1RISVMgKi8KKworLyoqKioqKiBIYXJkd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IGFkYXB0ZXIgdHlwZS4KKyAqIG8gaWYgYWRhcHRlciB0eXBlIGlzIHNwZWNpZmllZCB0aGVuIGNhbGwgZGV0ZWN0aW9uIHJvdXRpbmUgZm9yIHRoYXQgYWRhcHRlcgorICogICB0eXBlLiAgT3RoZXJ3aXNlIGNhbGwgZGV0ZWN0aW9uIHJvdXRpbmVzIGZvciBldmVyeSBhZGFwdGVyIHR5cGVzIHVudGlsCisgKiAgIGFkYXB0ZXIgaXMgZGV0ZWN0ZWQuCisgKgorICogTm90ZXM6CisgKiAxKSBEZXRlY3Rpb24gdGVzdHMgYXJlIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93biBzdGF0ZQorICogICAgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgc2RsYV9kZXRlY3QgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIXBvcnQgJiYgKGh3LT50eXBlICE9IFNETEFfUzUxNCkpCisJCXJldHVybiAtRUZBVUxUOworCisgICAgCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCWlmICghZGV0ZWN0X3M1MDJhKHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAyRToKKwkJaWYgKCFkZXRlY3RfczUwMmUocG9ydCkpIGVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJCWlmICghZGV0ZWN0X3M1MDMocG9ydCkpIGVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDc6CisJCWlmICghZGV0ZWN0X3M1MDcocG9ydCkpIGVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCWlmICghZGV0ZWN0X3M1MDgocG9ydCkpIGVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisgICAgICAgICAgICAgICAgaWYgKCFkZXRlY3RfczUxNChodykpIGVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKGRldGVjdF9zNTAyYShwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTAyQTsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDJlKHBvcnQpKQorCQkJaHctPnR5cGUgPSBTRExBX1M1MDJFOworCQllbHNlIGlmIChkZXRlY3RfczUwMyhwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTAzOworCQllbHNlIGlmIChkZXRlY3RfczUwNyhwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTA3OworCQllbHNlIGlmIChkZXRlY3RfczUwOChwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTA4OworCQllbHNlIGVyciA9IC1FTk9ERVY7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQXV0b3NlbGVjdCBtZW1vcnkgcmVnaW9uLiAKKyAqIG8gdHJ5IGFsbCBhdmFpbGFibGUgRE1QIGFkZHJlc3Mgb3B0aW9ucyBmcm9tIHRoZSB0b3AgZG93biB1bnRpbCBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHNkbGFfYXV0b2RwbSAoc2RsYWh3X3QqIGh3KQoreworCWludCBpLCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkKiBvcHQ7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlvcHQgPSBzNTAyYV9kcG1iYXNlX29wdGlvbnM7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJFOgorCWNhc2UgU0RMQV9TNTAzOgorCWNhc2UgU0RMQV9TNTA4OgorCQlvcHQgPSBzNTA4X2RwbWJhc2Vfb3B0aW9uczsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJb3B0ID0gczUwN19kcG1iYXNlX29wdGlvbnM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU3RhcnQgdGVzdGluZyBmcm9tIDh0aCBwb3NpdGlvbiwgYWRkcmVzcworICAgICAgICAgKiAweEM4MDAwIGZyb20gdGhlIDUwOCBhZGRyZXNzIHRhYmxlLiAKKyAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byB0ZXN0IEEqKioqIGFkZHJlc3Nlcywgc2luY2UKKyAgICAgICAgICogdGhleSBhcmUgdXN1YWxseSB1c2VkIGZvciBWaWRlbyAqLworCWZvciAoaSA9IDg7IGkgPD0gb3B0WzBdICYmIGVycjsgaSsrKSB7CisJCWh3LT5kcG1iYXNlID0gcGh5c190b192aXJ0KG9wdFtpXSk7CisJCWVyciA9IHNkbGFfc2V0ZHBtKGh3KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgdXAgYWRhcHRlciBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdy4gCisgKiBvIHNodXQgZG93biBhZGFwdGVyCisgKiBvIG1ha2Ugc3VyZSB0aGF0IG5vIHBoeXNpY2FsIG1lbW9yeSBleGlzdHMgaW4gdGhpcyByZWdpb24sIGkuZSBlbnRpcmUKKyAqICAgcmVnaW9uIHJlYWRzIDB4RkYgYW5kIGlzIG5vdCB3cml0YWJsZSB3aGVuIGFkYXB0ZXIgaXMgc2h1dCBkb3duLgorICogbyBpbml0aWFsaXplIGFkYXB0ZXIgaGFyZHdhcmUKKyAqIG8gbWFrZSBzdXJlIHRoYXQgcmVnaW9uIGlzIHVzYWJsZSB3aXRoIFNETEEgY2FyZCwgaS5lLiB3ZSBjYW4gd3JpdGUgdG8gaXQKKyAqICAgd2hlbiBhZGFwdGVyIGlzIGNvbmZpZ3VyZWQuCisgKi8KK3N0YXRpYyBpbnQgc2RsYV9zZXRkcG0gKHNkbGFod190KiBodykKK3sKKwlpbnQgZXJyOworCisJLyogU2h1dCBkb3duIGNhcmQgYW5kIHZlcmlmeSBtZW1vcnkgcmVnaW9uICovCisJc2RsYV9kb3duKGh3KTsKKwlpZiAoY2hlY2tfbWVtcmVnaW9uKGh3LT5kcG1iYXNlLCBody0+ZHBtc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyIGFuZCB0ZXN0IG9uLWJvYXJkIG1lbW9yeSBzZWdtZW50IGJ5IHNlZ21lbnQuCisJICogSWYgbWVtb3J5IHNpemUgYXBwZWFycyB0byBiZSBsZXNzIHRoYW4gc2hhcmVkIG1lbW9yeSB3aW5kb3cgc2l6ZSwKKwkgKiBhc3N1bWUgdGhhdCBtZW1vcnkgcmVnaW9uIGlzIHVudXNhYmxlLgorCSAqLworCWVyciA9IHNkbGFfaW5pdChodyk7CisJaWYgKGVycikgcmV0dXJuIGVycjsKKworCWlmIChzZGxhX21lbXRlc3QoaHcpIDwgaHctPmRwbXNpemUpIHsJLyogbGVzcyB0aGFuIHdpbmRvdyBzaXplICovCisJCXNkbGFfZG93bihodyk7CisJCXJldHVybiAtRUlPOworCX0KKwlzZGxhX21hcG1lbShodywgMEwpOwkvKiBzZXQgd2luZG93IHZlY3RvciBhdCBib3R0b20gKi8KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2FkIGFkYXB0ZXIgZnJvbSB0aGUgbWVtb3J5IGltYWdlIG9mIHRoZSBTRExBIGZpcm13YXJlIG1vZHVsZS4gCisgKiBvIHZlcmlmeSBmaXJtd2FyZSBpbnRlZ3JpdHkgYW5kIGNvbXBhdGliaWxpdHkKKyAqIG8gc3RhcnQgYWRhcHRlciB1cAorICovCitzdGF0aWMgaW50IHNkbGFfbG9hZCAoc2RsYWh3X3QqIGh3LCBzZm1fdCogc2ZtLCB1bnNpZ25lZCBsZW4pCit7CisKKwlpbnQgaTsKKworCS8qIFZlcmlmeSBmaXJtd2FyZSBzaWduYXR1cmUgKi8KKwlpZiAoc3RyY21wKHNmbS0+c2lnbmF0dXJlLCBTRk1fU0lHTkFUVVJFKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm90IFNETEEgZmlybXdhcmUhXG4iLAorCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFZlcmlmeSBmaXJtd2FyZSBtb2R1bGUgZm9ybWF0IHZlcnNpb24gKi8KKwlpZiAoc2ZtLT52ZXJzaW9uICE9IFNGTV9WRVJTSU9OKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogZmlybXdhcmUgZm9ybWF0ICV1IHJlamVjdGVkISBFeHBlY3RpbmcgJXUuXG4iLAorCQkJbW9kbmFtZSwgc2ZtLT52ZXJzaW9uLCBTRk1fVkVSU0lPTik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFZlcmlmeSBmaXJtd2FyZSBtb2R1bGUgbGVuZ3RoIGFuZCBjaGVja3N1bSAqLworCWlmICgobGVuIC0gb2Zmc2V0b2Yoc2ZtX3QsIGltYWdlKSAhPSBzZm0tPmluZm8uY29kZXNpemUpIHx8CisJCShjaGVja3N1bSgodm9pZCopJnNmbS0+aW5mbywKKwkJc2l6ZW9mKHNmbV9pbmZvX3QpICsgc2ZtLT5pbmZvLmNvZGVzaXplKSAhPSBzZm0tPmNoZWNrc3VtKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgY29ycnVwdGVkIVxuIiwgbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFubm91bmNlICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxvYWRpbmcgJXMgKElEPSV1KS4uLlxuIiwgbW9kbmFtZSwKKwkJKHNmbS0+ZGVzY3JbMF0gIT0gJ1wwJykgPyBzZm0tPmRlc2NyIDogInVua25vd24gZmlybXdhcmUiLAorCQlzZm0tPmluZm8uY29kZWlkKTsKKworCWlmKGh3LT50eXBlID09IFNETEFfUzUxNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxvYWRpbmcgUzUxNCBhZGFwdGVyLCBDUFUgJWNcbiIsCisJCQltb2RuYW1lLCBody0+UzUxNF9jcHVfbm9bMF0pOworCisJLyogU2NhbiB0aHJvdWdoIHRoZSBsaXN0IG9mIGNvbXBhdGlibGUgYWRhcHRlcnMgYW5kIG1ha2Ugc3VyZSBvdXIKKwkgKiBhZGFwdGVyIHR5cGUgaXMgbGlzdGVkLgorCSAqLworCWZvciAoaSA9IDA7CisJICAgICAoaSA8IFNGTV9NQVhfU0RMQSkgJiYgKHNmbS0+aW5mby5hZGFwdGVyW2ldICE9IGh3LT50eXBlKTsKKwkgICAgICsraSk7CisJCisJaWYgKGkgPT0gU0ZNX01BWF9TRExBKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJtd2FyZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFMldSFcbiIsCisJCQltb2RuYW1lLCBody0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBvbi1ib2FyZCBtZW1vcnkgKi8KKwlpZiAoaHctPm1lbW9yeSA8IHNmbS0+aW5mby5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogZmlybXdhcmUgbmVlZHMgJWx1IGJ5dGVzIG9mIG9uLWJvYXJkIG1lbW9yeSFcbiIsCisJCQltb2RuYW1lLCBzZm0tPmluZm8ubWVtc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1vdmUgY29kZSBvbnRvIGFkYXB0ZXIgKi8KKwlpZiAoc2RsYV9wb2tlKGh3LCBzZm0tPmluZm8uY29kZW9mZnMsIHNmbS0+aW1hZ2UsIHNmbS0+aW5mby5jb2Rlc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCB0byBsb2FkIGNvZGUgc2VnbWVudCFcbiIsCisJCQltb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUHJlcGFyZSBib290LXRpbWUgY29uZmlndXJhdGlvbiBkYXRhIGFuZCBraWNrLW9mZiBDUFUgKi8KKwlzZGxhX2Jvb3RjZmcoaHcsICZzZm0tPmluZm8pOworCWlmIChzZGxhX3N0YXJ0KGh3LCBzZm0tPmluZm8uc3RhcnRvZmZzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRGFtbi4uLiBBZGFwdGVyIHdvbid0IHN0YXJ0IVxuIiwKKwkJCW1vZG5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBwb3NpdGlvbiBEUE0gd2luZG93IG92ZXIgdGhlIG1haWxib3ggYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIGlmIChzZGxhX21hcG1lbShodywgc2ZtLT5pbmZvLndpbm9mZnMpIHx8IHNkbGFfaW50ZW4oaHcpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhZGFwdGVyIGhhcmR3YXJlIGZhaWx1cmUhXG4iLAorCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlody0+ZndpZCA9IHNmbS0+aW5mby5jb2RlaWQ7CQkvKiBzZXQgZmlybXdhcmUgSUQgKi8KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFNETEEgaGFyZHdhcmU6IHNldHVwIG1lbW9yeSB3aW5kb3csIElSUSwgZXRjLgorICovCitzdGF0aWMgaW50IHNkbGFfaW5pdCAoc2RsYWh3X3QqIGh3KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNETEFfTUFYSU9SQU5HRTsgKytpKQorCQlody0+cmVnc1tpXSA9IDA7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOiByZXR1cm4gaW5pdF9zNTAyYShodyk7CisJY2FzZSBTRExBX1M1MDJFOiByZXR1cm4gaW5pdF9zNTAyZShodyk7CisJY2FzZSBTRExBX1M1MDM6ICByZXR1cm4gaW5pdF9zNTAzKGh3KTsKKwljYXNlIFNETEFfUzUwNzogIHJldHVybiBpbml0X3M1MDcoaHcpOworCWNhc2UgU0RMQV9TNTA4OiAgcmV0dXJuIGluaXRfczUwOChodyk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgYWRhcHRlciBvbi1ib2FyZCBtZW1vcnkuCisgKiBvIHNsaWRlIERQTSB3aW5kb3cgZnJvbSB0aGUgYm90dG9tIHVwIGFuZCB0ZXN0IGFkYXB0ZXIgbWVtb3J5IHNlZ21lbnQgYnkKKyAqICAgc2VnbWVudC4KKyAqIFJldHVybiBhZGFwdGVyIG1lbW9yeSBzaXplLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZGxhX21lbXRlc3QgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBsb25nIG1lbXNpemU7CisJdW5zaWduZWQgd2luc2l6ZTsKKworCWZvciAobWVtc2l6ZSA9IDAsIHdpbnNpemUgPSBody0+ZHBtc2l6ZTsKKwkgICAgICFzZGxhX21hcG1lbShodywgbWVtc2l6ZSkgJiYKKwkJKHRlc3RfbWVtcmVnaW9uKGh3LT5kcG1iYXNlLCB3aW5zaXplKSA9PSB3aW5zaXplKQorCSAgICAgOworCSAgICAgbWVtc2l6ZSArPSB3aW5zaXplKQorCTsKKwlody0+bWVtb3J5ID0gbWVtc2l6ZTsKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcmVwYXJlIGJvb3QtdGltZSBmaXJtd2FyZSBjb25maWd1cmF0aW9uIGRhdGEuCisgKiBvIHBvc2l0aW9uIERQTSB3aW5kb3cKKyAqIG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGRhdGEgYXJlYQorICovCitzdGF0aWMgaW50IHNkbGFfYm9vdGNmZyAoc2RsYWh3X3QqIGh3LCBzZm1faW5mb190KiBzZm1pbmZvKQoreworCXVuc2lnbmVkIGNoYXIqIGRhdGE7CisKKwlpZiAoIXNmbWluZm8tPmRhdGFzaXplKSByZXR1cm4gMDsJLyogbm90aGluZyB0byBkbyAqLworCisJaWYgKHNkbGFfbWFwbWVtKGh3LCBzZm1pbmZvLT5kYXRhb2ZmcykgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZihody0+dHlwZSA9PSBTRExBX1M1MTQpCisgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkKikoaHctPmRwbWJhc2UgKyBzZm1pbmZvLT5kYXRhb2Zmcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQqKSgodTggKilody0+ZHBtYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoc2ZtaW5mby0+ZGF0YW9mZnMgLSBody0+dmVjdG9yKSk7CisKKwltZW1zZXRfaW8gKGRhdGEsIDAsIHNmbWluZm8tPmRhdGFzaXplKTsKKworCXdyaXRlYiAobWFrZV9jb25maWdfYnl0ZShodyksICZkYXRhWzB4MDBdKTsKKworCXN3aXRjaCAoc2ZtaW5mby0+Y29kZWlkKSB7CisJY2FzZSBTRklEX1gyNV81MDI6CisJY2FzZSBTRklEX1gyNV81MDg6CisgICAgICAgICAgICAgICAgd3JpdGViICgzLCAmZGF0YVsweDAxXSk7ICAgICAgICAvKiBUMSB0aW1lciAqLworICAgICAgICAgICAgICAgIHdyaXRlYiAoMTAsICZkYXRhWzB4MDNdKTsgICAgICAgLyogTjIgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDcsICZkYXRhWzB4MDZdKTsgICAgICAgIC8qIEhETEMgd2luZG93IHNpemUgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDEsICZkYXRhWzB4MEJdKTsgICAgICAgIC8qIERURSAqLworICAgICAgICAgICAgICAgIHdyaXRlYiAoMiwgJmRhdGFbMHgwQ10pOyAgICAgICAgLyogWC4yNSBwYWNrZXQgd2luZG93IHNpemUgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXcgKDEyOCwgJmRhdGFbMHgwRF0pOwkvKiBkZWZhdWx0IFguMjUgZGF0YSBzaXplICovCisgICAgICAgICAgICAgICAgd3JpdGV3ICgxMjgsICZkYXRhWzB4MEZdKTsJLyogbWF4aW11bSBYLjI1IGRhdGEgc2l6ZSAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJlcGFyZSBjb25maWd1cmF0aW9uIGJ5dGUgaWRlbnRpZnlpbmcgYWRhcHRlciB0eXBlIGFuZCBDUFUgY2xvY2sgcmF0ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFrZV9jb25maWdfYnl0ZSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIGNoYXIgYnl0ZSA9IDA7CisKKwlzd2l0Y2ggKGh3LT5wY2xrKSB7CisJCWNhc2UgNTAwMDogIGJ5dGUgPSAweDAxOyBicmVhazsKKwkJY2FzZSA3MjAwOiAgYnl0ZSA9IDB4MDI7IGJyZWFrOworCQljYXNlIDgwMDA6ICBieXRlID0gMHgwMzsgYnJlYWs7CisJCWNhc2UgMTAwMDA6IGJ5dGUgPSAweDA0OyBicmVhazsKKwkJY2FzZSAxNjAwMDogYnl0ZSA9IDB4MDU7IGJyZWFrOworCX0KKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwkJY2FzZSBTRExBX1M1MDJFOiBieXRlIHw9IDB4ODA7IGJyZWFrOworCQljYXNlIFNETEFfUzUwMzogIGJ5dGUgfD0gMHg0MDsgYnJlYWs7CisJfQorCXJldHVybiBieXRlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IGFkYXB0ZXIncyBDUFUuCisgKiBvIGNhbGN1bGF0ZSBhIHBvaW50ZXIgdG8gYWRhcHRlcidzIGNvbGQgYm9vdCBlbnRyeSBwb2ludAorICogbyBwb3NpdGlvbiBEUE0gd2luZG93CisgKiBvIHBsYWNlIGJvb3QgaW5zdHJ1Y3Rpb24gKGpwIGFkZHIpIGF0IGNvbGQgYm9vdCBlbnRyeSBwb2ludAorICogbyBzdGFydCBDUFUKKyAqLworc3RhdGljIGludCBzZGxhX3N0YXJ0IChzZGxhaHdfdCogaHcsIHVuc2lnbmVkIGFkZHIpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCXVuc2lnbmVkIGNoYXIgKmJvb3RwOworCWludCBlcnIsIHRtcCwgaTsKKworCWlmICghcG9ydCAmJiAoaHctPnR5cGUgIT0gU0RMQV9TNTE0KSkgcmV0dXJuIC1FRkFVTFQ7CisKKyAJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJYm9vdHAgPSBody0+ZHBtYmFzZTsKKwkJYm9vdHAgKz0gMHg2NjsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJY2FzZSBTRExBX1M1MDM6CisJY2FzZSBTRExBX1M1MDc6CisJY2FzZSBTRExBX1M1MDg6CisJY2FzZSBTRExBX1M1MTQ6CisJCWJvb3RwID0gaHctPmRwbWJhc2U7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gc2RsYV9tYXBtZW0oaHcsIDApOworCWlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgICAgIAl3cml0ZWIgKDB4QzMsIGJvb3RwKTsgICAvKiBaODA6ICdqcCcgb3Bjb2RlICovCisJYm9vdHAgKys7CisJd3JpdGV3IChhZGRyLCBib290cCk7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlfT1VUQihwb3J0LCAweDEwKTsJCS8qIGlzc3VlIE5NSSB0byBDUFUgKi8KKwkJaHctPnJlZ3NbMF0gPSAweDEwOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAyRToKKwkJX09VVEIocG9ydCArIDMsIDB4MDEpOwkJLyogc3RhcnQgQ1BVICovCisJCWh3LT5yZWdzWzNdID0gMHgwMTsKKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsKKwkJaWYgKF9JTkIocG9ydCkgJiAweDAxKSB7CS8qIHZlcmlmeSAqLworCQkJLyoKKwkJCSAqIEVuYWJsaW5nIENQVSBjaGFuZ2VzIGZ1bmN0aW9uYWxpdHkgb2YgdGhlCisJCQkgKiBjb250cm9sIHJlZ2lzdGVyLCBzbyB3ZSBoYXZlIHRvIHJlc2V0IGl0cworCQkJICogbWlycm9yLgorCQkJICovCisJCQlfT1VUQihwb3J0LCAwKTsJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQkJaHctPnJlZ3NbMF0gPSAwOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJCXRtcCA9IGh3LT5yZWdzWzBdIHwgMHgwOTsJLyogc2V0IGJpdHMgMCBhbmQgMyAqLworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsKKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDEpKQkvKiB2ZXJpZnkgKi8KKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA3OgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDI7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJLyogdXBkYXRlIG1pcnJvciAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOworCQlpZiAoIShfSU5CKHBvcnQpICYgMHgwNCkpCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCXRtcCA9IGh3LT5yZWdzWzBdIHwgMHgwMjsKKwkJX09VVEIocG9ydCwgdG1wKTsKKwkJaHctPnJlZ3NbMF0gPSB0bXA7CS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsKKwkJaWYgKCEoX0lOQihwb3J0ICsgMSkgJiAweDAyKSkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUxNDoKKwkJd3JpdGViIChTNTE0X0NQVV9TVEFSVCwgaHctPnZlY3Rvcik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUzUwMkEgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBpbml0X3M1MDJhIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTAyYShwb3J0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlody0+cmVnc1swXSA9IDB4MDg7CisJaHctPnJlZ3NbMV0gPSAweEZGOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDJhX2RwbWJhc2Vfb3B0aW9ucywgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSBzNTAyYV9obWNyW2kgLSAxXTsKKwlzd2l0Y2ggKGh3LT5kcG1zaXplKSB7CisJY2FzZSAweDIwMDA6CisJCXRtcCB8PSAweDAxOworCQlicmVhazsKKworCWNhc2UgMHgxMDAwMEw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgKHRoaXMgYWxzbyBlbmFibGVzIG1lbW9yeSBhY2Nlc3MpICovCisJX09VVEIocG9ydCArIDEsIHRtcCk7CisJaHctPnJlZ3NbMV0gPSB0bXA7CisJaHctPnJlZ3NbMF0gPSAweDA4OworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUzUwMkUgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBpbml0X3M1MDJlIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTAyZShwb3J0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisJaSA9IGdldF9vcHRpb25faW5kZXgoczUwOF9kcG1iYXNlX29wdGlvbnMsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworCWlmIChpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG1wID0gczUwMmVfaG1jcltpIC0gMV07CisJc3dpdGNoIChody0+ZHBtc2l6ZSkgeworCWNhc2UgMHgyMDAwOgorCQl0bXAgfD0gMHgwMTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTAwMDBMOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNldHVwIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93ICovCisJX09VVEIocG9ydCArIDEsIHRtcCk7CisJaHctPnJlZ3NbMV0gPSB0bXA7CisKKwkvKiBFbmFibGUgbWVtb3J5IGFjY2VzcyAqLworCV9PVVRCKHBvcnQsIDB4MDIpOworCWh3LT5yZWdzWzBdID0gMHgwMjsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCXJldHVybiAoX0lOQihwb3J0KSAmIDB4MDIpID8gMCA6IC1FSU87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBTNTAzIGFkYXB0ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBpbml0X3M1MDMgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCWlmICghZGV0ZWN0X3M1MDMocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHM1MDJlX2htY3JbaSAtIDFdOworCXN3aXRjaCAoaHctPmRwbXNpemUpIHsKKwljYXNlIDB4MjAwMDoKKwkJdG1wIHw9IDB4MDE7CisJCWJyZWFrOworCisJY2FzZSAweDEwMDAwTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXR1cCBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyAqLworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCisJLyogRW5hYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKwlfT1VUQihwb3J0LCAweDAyKTsKKwlody0+cmVnc1swXSA9IDB4MDI7CS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDcgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBpbml0X3M1MDcgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCWlmICghZGV0ZWN0X3M1MDcocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDdfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHM1MDdfaG1jcltpIC0gMV07CisJc3dpdGNoIChody0+ZHBtc2l6ZSkgeworCWNhc2UgMHgyMDAwOgorCQl0bXAgfD0gMHgwMTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTAwMDBMOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuYWJsZSBhZGFwdGVyJ3MgbG9naWMgKi8KKwlfT1VUQihwb3J0LCAweDAxKTsKKwlody0+cmVnc1swXSA9IDB4MDE7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoIShfSU5CKHBvcnQpICYgMHgyMCkpCisJCXJldHVybiAtRUlPOworCisJLyogU2V0dXAgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgKi8KKwlfT1VUQihwb3J0ICsgMSwgdG1wKTsKKwlody0+cmVnc1sxXSA9IHRtcDsKKworCS8qIEVuYWJsZSBtZW1vcnkgYWNjZXNzICovCisJdG1wID0gaHctPnJlZ3NbMF0gfCAweDA0OworCWlmIChody0+aXJxKSB7CisJCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfaXJxX29wdGlvbnMsIGh3LT5pcnEpOworCQlpZiAoaSkgdG1wIHw9IHM1MDdfaXJxbWFza1tpIC0gMV07CisJfQorCV9PVVRCKHBvcnQsIHRtcCk7CisJaHctPnJlZ3NbMF0gPSB0bXA7CQkvKiB1cGRhdGUgbWlycm9yICovCisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlyZXR1cm4gKF9JTkIocG9ydCkgJiAweDA4KSA/IDAgOiAtRUlPOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUzUwOCBhZGFwdGVyLgorICovCitzdGF0aWMgaW50IGluaXRfczUwOCAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJaWYgKCFkZXRlY3RfczUwOChwb3J0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisJaSA9IGdldF9vcHRpb25faW5kZXgoczUwOF9kcG1iYXNlX29wdGlvbnMsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworCWlmIChpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU2V0dXAgbWVtb3J5IGNvbmZpZ3VyYXRpb24gKi8KKwl0bXAgPSBzNTA4X2htY3JbaSAtIDFdOworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCisJLyogRW5hYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKwlfT1VUQihwb3J0LCAweDA0KTsKKwlody0+cmVnc1swXSA9IDB4MDQ7CQkvKiB1cGRhdGUgbWlycm9yICovCisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlyZXR1cm4gKF9JTkIocG9ydCArIDEpICYgMHgwNCkgPyAwIDogLUVJTzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlY3QgUzUwMkEgYWRhcHRlci4KKyAqCUZvbGxvd2luZyB0ZXN0cyBhcmUgdXNlZCB0byBkZXRlY3QgUzUwMkEgYWRhcHRlcjoKKyAqCTEuIEFsbCByZWdpc3RlcnMgb3RoZXIgdGhhbiBzdGF0dXMgKEJBU0UpIHNob3VsZCByZWFkIDB4RkYKKyAqCTIuIEFmdGVyIHdyaXRpbmcgMDAwMDEwMDBiIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQKKyAqCSAgIHJlYWQgMDEwMDAwMDBiLgorICoJMy4gQWZ0ZXIgd3JpdGluZyAwIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQgc3RpbGwKKyAqCSAgIHJlYWQgIDAxMDAwMDAwYi4KKyAqCTQuIEFmdGVyIHdyaXRpbmcgMDAwMDAxMDBiIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQKKyAqCSAgIHJlYWQgMDEwMDAxMDBiLgorICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4KKyAqLworc3RhdGljIGludCBkZXRlY3RfczUwMmEgKGludCBwb3J0KQoreworCWludCBpLCBqOworCisJaWYgKCFnZXRfb3B0aW9uX2luZGV4KHM1MDJfcG9ydF9vcHRpb25zLCBwb3J0KSkKKwkJcmV0dXJuIDA7CisJCisJZm9yIChqID0gMTsgaiA8IFNETEFfTUFYSU9SQU5HRTsgKytqKSB7CisJCWlmIChfSU5CKHBvcnQgKyBqKSAhPSAweEZGKQorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJfQorCisJX09VVEIocG9ydCwgMHgwOCk7CQkJLyogaGFsdCBDUFUgKi8KKwlfT1VUQihwb3J0LCAweDA4KTsKKwlfT1VUQihwb3J0LCAweDA4KTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4NDApCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDApOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHg0MCkKKwkJcmV0dXJuIDA7CisJX09VVEIocG9ydCwgMHgwNCk7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoX0lOQihwb3J0KSAhPSAweDQ0KQorCQlyZXR1cm4gMDsKKworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwlfT1VUQihwb3J0LCAweDA4KTsKKwlfT1VUQihwb3J0LCAweDA4KTsKKwlfT1VUQihwb3J0LCAweDA4KTsKKwlfT1VUQihwb3J0ICsgMSwgMHhGRik7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IFM1MDJFIGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gdmVyaWZ5IGFkYXB0ZXIgcHJlc2VuY2U6CisgKgkxLiBBbGwgcmVnaXN0ZXJzIG90aGVyIHRoYW4gc3RhdHVzIChCQVNFKSBzaG91bGQgcmVhZCAweEZGLgorICoJMi4gQWZ0ZXIgd3JpdGluZyAwIHRvIENQVSBjb250cm9sIHJlZ2lzdGVyIChCQVNFKzMpLCBzdGF0dXMgcmVnaXN0ZXIKKyAqCSAgIChCQVNFKSBzaG91bGQgcmVhZCAxMTExMTAwMGIuCisgKgkzLiBBZnRlciB3cml0aW5nIDAwMDAwMTAwYiB0byBwb3J0IEJBU0UgKHNldCBiaXQgMiksIHN0YXR1cyByZWdpc3RlcgorICoJICAgKEJBU0UpIHNob3VsZCByZWFkIDExMTExMTAwYi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDJlIChpbnQgcG9ydCkKK3sKKwlpbnQgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTAyX3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCWZvciAoaiA9IDE7IGogPCBTRExBX01BWElPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gMHhGRikKKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCX0KKworCV9PVVRCKHBvcnQgKyAzLCAwKTsJCQkvKiBDUFUgY29udHJvbCByZWcuICovCisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoX0lOQihwb3J0KSAhPSAweEY4KQkJCS8qIHJlYWQgc3RhdHVzICovCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDQpOwkJCS8qIHNldCBiaXQgMiAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGQykJCQkvKiB2ZXJpZnkgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCBhZGFwdGVyICovCisJX09VVEIocG9ydCwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IHM1MDMgYWRhcHRlci4KKyAqCUZvbGxvd2luZyB0ZXN0cyBhcmUgdXNlZCB0byB2ZXJpZnkgYWRhcHRlciBwcmVzZW5jZToKKyAqCTEuIEFsbCByZWdpc3RlcnMgb3RoZXIgdGhhbiBzdGF0dXMgKEJBU0UpIHNob3VsZCByZWFkIDB4RkYuCisgKgkyLiBBZnRlciB3cml0aW5nIDAgdG8gY29udHJvbCByZWdpc3RlciAoQkFTRSksIHN0YXR1cyByZWdpc3RlciAoQkFTRSkKKyAqCSAgIHNob3VsZCByZWFkIDExMTEwMDAwYi4KKyAqCTMuIEFmdGVyIHdyaXRpbmcgMDAwMDAxMDBiIChzZXQgYml0IDIpIHRvIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpLAorICoJICAgc3RhdHVzIHJlZ2lzdGVyIHNob3VsZCByZWFkIDExMTEwMDEwYi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDMgKGludCBwb3J0KQoreworCWludCBpLCBqOworCisJaWYgKCFnZXRfb3B0aW9uX2luZGV4KHM1MDNfcG9ydF9vcHRpb25zLCBwb3J0KSkKKwkJcmV0dXJuIDA7CisJZm9yIChqID0gMTsgaiA8IFNETEFfTUFYSU9SQU5HRTsgKytqKSB7CisJCWlmIChfSU5CKHBvcnQgKyBqKSAhPSAweEZGKQorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJfQorCisJX09VVEIocG9ydCwgMCk7CQkJCS8qIHJlc2V0IGNvbnRyb2wgcmVnLiovCisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoX0lOQihwb3J0KSAhPSAweEYwKQkJCS8qIHJlYWQgc3RhdHVzICovCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDQpOwkJCS8qIHNldCBiaXQgMiAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGMikJCQkvKiB2ZXJpZnkgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCBhZGFwdGVyICovCisJX09VVEIocG9ydCwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IHM1MDcgYWRhcHRlci4KKyAqCUZvbGxvd2luZyB0ZXN0cyBhcmUgdXNlZCB0byBkZXRlY3QgczUwNyBhZGFwdGVyOgorICoJMS4gQWxsIHBvcnRzIHNob3VsZCByZWFkIHRoZSBzYW1lIHZhbHVlLgorICoJMi4gQWZ0ZXIgd3JpdGluZyAweDAwIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZAorICoJICAgPzAxMTAwMD9iLgorICoJMy4gQWZ0ZXIgd3JpdGluZyAweDAxIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZAorICoJICAgPzAxMTAwMT9iLgorICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4KKyAqLworc3RhdGljIGludCBkZXRlY3RfczUwNyAoaW50IHBvcnQpCit7CisJaW50IHRtcCwgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTA4X3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCXRtcCA9IF9JTkIocG9ydCk7CisJZm9yIChqID0gMTsgaiA8IFM1MDdfSU9SQU5HRTsgKytqKSB7CisJCWlmIChfSU5CKHBvcnQgKyBqKSAhPSB0bXApCisJCQlyZXR1cm4gMDsKKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwl9CisKKwlfT1VUQihwb3J0LCAweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0KSAmIDB4N0UpICE9IDB4MzApCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDEpOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKChfSU5CKHBvcnQpICYgMHg3RSkgIT0gMHgzMikKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCBhZGFwdGVyICovCisJX09VVEIocG9ydCwgMHgwMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IHM1MDggYWRhcHRlci4KKyAqCUZvbGxvd2luZyB0ZXN0cyBhcmUgdXNlZCB0byBkZXRlY3QgczUwOCBhZGFwdGVyOgorICoJMS4gQWZ0ZXIgd3JpdGluZyAweDAwIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZAorICoJICAgPz8wMDAwMDBiLgorICoJMi4gQWZ0ZXIgd3JpdGluZyAweDEwIHRvIGNvbnRyb2wgcmVnaXN0ZXIsIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZAorICoJICAgPz8wMTAwMDBiCisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IGRldGVjdF9zNTA4IChpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTA4X3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDApOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKChfSU5CKHBvcnQgKyAxKSAmIDB4M0YpICE9IDB4MDApCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MTApOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKChfSU5CKHBvcnQgKyAxKSAmIDB4M0YpICE9IDB4MTApCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDB4MDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTE0IFBDSSBhZGFwdGVyLgorICogICAgICBSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICogICAgICBOb3RlOiAgIFRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqICAgICAgICAgICAgICBzdGF0ZSBhZnRlciB0aGUgdGVzdC4KKyAqLworc3RhdGljIGludCBkZXRlY3RfczUxNCAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIGNoYXIgQ1BVX25vLCBzbG90X25vLCBhdXRvX3Nsb3RfY2ZnOworCWludCBudW1iZXJfUzUxNF9jYXJkcyA9IDA7CisJdTMyIFM1MTRfbWVtX2Jhc2VfYWRkciA9IDA7CisJdTMyIHV0X3UzMjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKworCisjaWZuZGVmIENPTkZJR19QQ0kKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbnV4IG5vdCBjb21waWxlZCBmb3IgUENJIHVzYWdlIVxuIiwgbW9kbmFtZSk7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisKKwkvKgorCVRoZSAnc2V0dXAoKScgcHJvY2VkdXJlIGluICdzZGxhbWFpbi5jJyBwYXNzZXMgdGhlIENQVSBudW1iZXIgYW5kIHRoZQorCXNsb3QgbnVtYmVyIGRlZmluZWQgaW4gJ3JvdXRlci5jb25mJyB2aWEgdGhlICdwb3J0JyBkZWZpbml0aW9uLgorCSovCisJQ1BVX25vID0gaHctPlM1MTRfY3B1X25vWzBdOworCXNsb3Rfbm8gPSBody0+UzUxNF9zbG90X25vOworCWF1dG9fc2xvdF9jZmcgPSBody0+YXV0b19wY2lfY2ZnOworCisJaWYgKGF1dG9fc2xvdF9jZmcpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc3JjaC4uLiBTNTE0IGNhcmQsIENQVSAlYywgU2xvdD1BdXRvXG4iLAorCQltb2RuYW1lLCBDUFVfbm8pOworCisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcmNoLi4uIFM1MTQgY2FyZCwgQ1BVICVjLCBTbG90ICMlZFxuIiwKKwkJbW9kbmFtZSwgQ1BVX25vLCBzbG90X25vKTsKKwl9CisJCisJLyogY2hlY2sgdG8gc2VlIHRoYXQgQ1BVIEEgb3IgQiBoYXMgYmVlbiBzZWxlY3RlZCBpbiAncm91dGVyLmNvbmYnICovCisJc3dpdGNoKENQVV9ubykgeworCQljYXNlIFM1MTRfQ1BVX0E6CisJCWNhc2UgUzUxNF9DUFVfQjoKKwkJCWJyZWFrOworCQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFM1MTQgQ1BVIGRlZmluaXRpb24gaW52YWxpZC5cbiIsIAorCQkJCW1vZG5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTXVzdCBiZSAnQScgb3IgJ0InXG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCW51bWJlcl9TNTE0X2NhcmRzID0gZmluZF9zNTE0X2FkYXB0ZXIoaHcsIDApOworCWlmKCFudW1iZXJfUzUxNF9jYXJkcykKKwkJcmV0dXJuIDA7CisKKwkvKiB3ZSBhcmUgdXNpbmcgYSBzaW5nbGUgUzUxNCBhZGFwdGVyIHdpdGggYSBzbG90IG9mIDAgc28gcmUtcmVhZCB0aGUgKi8JCisJLyogbG9jYXRpb24gb2YgdGhpcyBhZGFwdGVyICovCisJaWYoKG51bWJlcl9TNTE0X2NhcmRzID09IDEpICYmIGF1dG9fc2xvdF9jZmcpIHsJCisgICAgICAgIAludW1iZXJfUzUxNF9jYXJkcyA9IGZpbmRfczUxNF9hZGFwdGVyKGh3LCAxKTsKKwkJaWYoIW51bWJlcl9TNTE0X2NhcmRzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IgZmluZGluZyBQQ0kgY2FyZFxuIiwKKwkJCQltb2RuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcGNpX2RldiA9IGh3LT5wY2lfZGV2OworCS8qIHJlYWQgdGhlIHBoeXNpY2FsIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKwlTNTE0X21lbV9iYXNlX2FkZHIgPSAoQ1BVX25vID09IFM1MTRfQ1BVX0EpID8gCisJCShwY2lfZGV2LT5yZXNvdXJjZVsxXS5zdGFydCkgOgorCQkocGNpX2Rldi0+cmVzb3VyY2VbMl0uc3RhcnQpOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBTNTE0IFBDSSBtZW1vcnkgYXQgMHglWFxuIiwKKwkJbW9kbmFtZSwgUzUxNF9tZW1fYmFzZV9hZGRyKTsKKwlpZighUzUxNF9tZW1fYmFzZV9hZGRyKSB7CisJCWlmKENQVV9ubyA9PSBTNTE0X0NQVV9CKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENQVSAjQiBub3QgcHJlc2VudCBvbiB0aGUgY2FyZFxuIiwgCQkJCW1vZG5hbWUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gUENJIG1lbW9yeSBhbGxvY2F0ZWQgdG8gY2FyZFxuIiwJCQkJbW9kbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGVuYWJsZSB0aGUgUENJIG1lbW9yeSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAKKwkJKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/IFBDSV9NQVAwX0RXT1JEIDogUENJX01BUDFfRFdPUkQsCisJCSZ1dF91MzIpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwKKwkJKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/IFBDSV9NQVAwX0RXT1JEIDogUENJX01BUDFfRFdPUkQsCisJCSh1dF91MzIgfCBQQ0lfTUVNT1JZX0VOQUJMRSkpOworCisJLyogY2hlY2sgdGhlIElSUSBhbGxvY2F0ZWQgYW5kIGVuYWJsZSBJUlEgdXNhZ2UgKi8KKwlpZighKGh3LT5pcnEgPSBwY2lfZGV2LT5pcnEpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgbm90IGFsbG9jYXRlZCB0byBTNTE0IGFkYXB0ZXJcbiIsCisJCQltb2RuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKwkvKiBCVUcgRklYIDogTWFyIDYgMjAwMAorIAkgKiBPbiBhIGluaXRpYWwgbG9hZGluZyBvZiB0aGUgY2FyZCwgd2UgbXVzdCBjaGVjaworICAgICAgICAgKiBhbmQgY2xlYXIgUENJIGludGVycnVwdCBiaXRzLCBkdWUgdG8gYSByZXNldAorICAgICAgICAgKiBwcm9ibGVtIG9uIHNvbWUgb3RoZXIgYm9hcmRzLiAgaS5lLiBBbiBpbnRlcnJ1cHQKKyAgICAgICAgICogbWlnaHQgYmUgcGVuZGluZywgZXZlbiBhZnRlciBzeXN0ZW0gYm9vdHVwLCAKKyAgICAgICAgICogaW4gd2hpY2ggY2FzZSwgd2hlbiBzdGFydGluZyB3YW5yb3V0ZXIgdGhlIG1hY2hpbmUKKyAgICAgICAgICogd291bGQgY3Jhc2guIAorCSAqLworCWlmIChpbml0X3BjaV9zbG90KGh3KSkKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCAmdXRfdTMyKTsKKyAgICAgICAgdXRfdTMyIHw9IChDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPworICAgICAgICAgICAgICAgIFBDSV9FTkFCTEVfSVJRX0NQVV9BIDogUENJX0VOQUJMRV9JUlFfQ1BVX0I7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgUENJX0lOVF9DT05GSUcsIHV0X3UzMik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSVJRICVkIGFsbG9jYXRlZCB0byB0aGUgUzUxNCBjYXJkXG4iLAorCQltb2RuYW1lLCBody0+aXJxKTsKKworCS8qIG1hcCB0aGUgcGh5c2ljYWwgUENJIG1lbW9yeSB0byB2aXJ0dWFsIG1lbW9yeSAqLworCSh2b2lkICopaHctPmRwbWJhc2UgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKVM1MTRfbWVtX2Jhc2VfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpTUFYX1NJWkVPRl9TNTE0X01FTU9SWSk7CisgICAgCS8qIG1hcCB0aGUgcGh5c2ljYWwgY29udHJvbCByZWdpc3RlciBtZW1vcnkgdG8gdmlydHVhbCBtZW1vcnkgKi8KKwlody0+dmVjdG9yID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcCgKKwkJKHVuc2lnbmVkIGxvbmcpKFM1MTRfbWVtX2Jhc2VfYWRkciArIFM1MTRfQ1RSTF9SRUdfQllURSksCisJCSh1bnNpZ25lZCBsb25nKTE2KTsKKyAgICAgCisgICAgICAgIGlmKCFody0+ZHBtYmFzZSB8fCAhaHctPnZlY3RvcikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENJIHZpcnR1YWwgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJLyogaGFsdCB0aGUgYWRhcHRlciAqLworCXdyaXRlYiAoUzUxNF9DUFVfSEFMVCwgaHctPnZlY3Rvcik7CQorCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmluZCB0aGUgUzUxNCBQQ0kgYWRhcHRlciBpbiB0aGUgUENJIGJ1cy4KKyAqICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgUzUxNCBhZGFwdGVycyBmb3VuZCAoMCBpZiBubyBhZGFwdGVyIGZvdW5kKS4KKyAqLworc3RhdGljIGludCBmaW5kX3M1MTRfYWRhcHRlcihzZGxhaHdfdCogaHcsIGNoYXIgZmluZF9maXJzdF9TNTE0X2NhcmQpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2xvdF9ubzsKKyAgICAgICAgaW50IG51bWJlcl9TNTE0X2NhcmRzID0gMDsKKwljaGFyIFM1MTRfZm91bmRfaW5fc2xvdCA9IDA7CisgICAgICAgIHUxNiBQQ0lfc3Vic3lzX3ZlbmRvcjsKKworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisgCisgICAgICAgc2xvdF9ubyA9IGh3LT5TNTE0X3Nsb3Rfbm87CisgIAorCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShWM19WRU5ET1JfSUQsIFYzX0RFVklDRV9JRCwgcGNpX2RldikpCisgICAgICAgIAkhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNfVkVORE9SX1dPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAmUENJX3N1YnN5c192ZW5kb3IpOworICAgICAgICAgICAgICAgIAorCQlpZihQQ0lfc3Vic3lzX3ZlbmRvciAhPSBTQU5HT01BX1NVQlNZU19WRU5ET1IpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAJCisJCWh3LT5wY2lfZGV2ID0gcGNpX2RldjsKKwkJCisJCWlmKGZpbmRfZmlyc3RfUzUxNF9jYXJkKQorCQkJcmV0dXJuKDEpOworCQkKKyAgICAgICAgICAgICAgICBudW1iZXJfUzUxNF9jYXJkcyArKzsKKyAgICAgICAgICAgICAgICAKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBTNTE0IGNhcmQgZm91bmQsIHNsb3QgIyVkIChkZXZmbiAweCVYKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsICgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyksCisJCQlwY2lfZGV2LT5kZXZmbik7CisJCQorCQlpZiAoaHctPmF1dG9fcGNpX2NmZyl7CisJCQlody0+UzUxNF9zbG90X25vID0gKChwY2lfZGV2LT5kZXZmbiA+PiAzKSAmIFBDSV9ERVZfU0xPVF9NQVNLKTsKKwkJCXNsb3Rfbm8gPSBody0+UzUxNF9zbG90X25vOworCQkJCisJCX1lbHNlIGlmICgoKHBjaV9kZXYtPmRldmZuID4+IDMpICYgUENJX0RFVl9TTE9UX01BU0spID09IHNsb3Rfbm8peworICAgICAgICAgICAgICAgICAgICAgICAgUzUxNF9mb3VuZF9pbl9zbG90ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJLyogaWYgbm8gUzUxNCBhZGFwdGVyIGhhcyBiZWVuIGZvdW5kLCB0aGVuIGV4aXQgKi8KKyAgICAgICAgaWYgKCFudW1iZXJfUzUxNF9jYXJkcykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBFcnJvciwgbm8gUzUxNCBhZGFwdGVycyBmb3VuZFxuIiwgbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgbW9yZSB0aGFuIG9uZSBTNTE0IGNhcmQgaGFzIGJlZW4gZm91bmQsIHRoZW4gdGhlIHVzZXIgbXVzdCBoYXZlICovICAgICAgICAvKiBkZWZpbmVkIGEgc2xvdCBudW1iZXIgc28gdGhhdCB0aGUgY29ycmVjdCBhZGFwdGVyIGlzIHVzZWQgKi8KKyAgICAgICAgZWxzZSBpZiAoKG51bWJlcl9TNTE0X2NhcmRzID4gMSkgJiYgaHctPmF1dG9fcGNpX2NmZykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBFcnJvciwgUENJIFNsb3QgYXV0b2RldGVjdCBGYWlsZWQhIFxuIgorCQkJCSAiJXM6ICAgICAgICBNb3JlIHRoYW4gb25lIFM1MTQgYWRhcHRlciBmb3VuZC5cbiIKKwkJCQkgIiVzOiAgICAgICAgRGlzYWJsZSB0aGUgQXV0b2RldGVjdCBmZWF0dXJlIGFuZCBzdXBwbHlcbiIKKwkJCQkgIiVzOiAgICAgICAgdGhlIFBDSVNMT1QgbnVtYmVycyBmb3IgZWFjaCBjYXJkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsbW9kbmFtZSxtb2RuYW1lLG1vZG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBzbG90IG51bWJlciBhbmQgdGhlIFM1MTQgYWRhcHRlciBoYXMgKi8KKyAgICAgICAgLyogbm90IGJlZW4gZm91bmQgaW4gdGhhdCBzbG90LCB0aGVuIGV4aXQgKi8KKyAgICAgICAgZWxzZSBpZiAoIWh3LT5hdXRvX3BjaV9jZmcgJiYgIVM1MTRfZm91bmRfaW5fc2xvdCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJCSIlczogRXJyb3IsIFM1MTQgY2FyZCBub3QgZm91bmQgaW4gc3BlY2lmaWVkIHNsb3QgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSwgc2xvdF9ubyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCXJldHVybiAobnVtYmVyX1M1MTRfY2FyZHMpOworfQorCisKKworLyoqKioqKiogTWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2FsaWJyYXRlIFNETEEgbWVtb3J5IGFjY2VzcyBkZWxheS4KKyAqIENvdW50IG51bWJlciBvZiBpZGxlIGxvb3BzIG1hZGUgd2l0aGluIDEgc2Vjb25kIGFuZCB0aGVuIGNhbGN1bGF0ZSB0aGUKKyAqIG51bWJlciBvZiBsb29wcyB0aGF0IHNob3VsZCBiZSBtYWRlIHRvIGFjaGl2ZSBkZXNpcmVkIGRlbGF5LgorICovCitzdGF0aWMgaW50IGNhbGlicmF0ZV9kZWxheSAoaW50IG1rcykKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXk7CisJdW5zaWduZWQgbG9uZyBzdG9wOworCisJZm9yIChkZWxheSA9IDAsIHN0b3AgPSBTWVNURU1fVElDSyArIEhaOyBTWVNURU1fVElDSyA8IHN0b3A7ICsrZGVsYXkpOworCXJldHVybiAoZGVsYXkvKDEwMDAwMDBML21rcykgKyAxKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgb3B0aW9uJ3MgaW5kZXggaW50byB0aGUgb3B0aW9ucyBsaXN0LgorICoJUmV0dXJuIG9wdGlvbidzIGluZGV4ICgxIC4uIE4pIG9yIHplcm8gaWYgb3B0aW9uIGlzIGludmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleCAodW5zaWduZWQqIG9wdGxpc3QsIHVuc2lnbmVkIG9wdHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gb3B0bGlzdFswXTsgKytpKQorCQlpZiAoIG9wdGxpc3RbaV0gPT0gb3B0dmFsKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgbWVtb3J5IHJlZ2lvbiB0byBzZWUgaWYgaXQncyBhdmFpbGFibGUuIAorICogUmV0dXJuOgkwCW9rLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hlY2tfbWVtcmVnaW9uICh2b2lkKiBwdHIsIHVuc2lnbmVkIGxlbikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gcHRyOworCisgICAgICAgIGZvciAoOyBsZW4gJiYgKHJlYWRiIChwKSA9PSAweEZGKTsgLS1sZW4sICsrcCkgeworICAgICAgICAgICAgICAgIHdyaXRlYiAoMCwgcCk7ICAgICAgICAgIC8qIGF0dGVtcHQgdG8gd3JpdGUgMCAqLworICAgICAgICAgICAgICAgIGlmIChyZWFkYihwKSAhPSAweEZGKSB7IC8qIHN0aWxsIGhhcyB0byByZWFkIDB4RkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlYiAoMHhGRiwgcCk7LyogcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIG5vdCBnb29kICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKwlyZXR1cm4gbGVuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgbWVtb3J5IHJlZ2lvbi4KKyAqIFJldHVybjoJc2l6ZSBvZiB0aGUgcmVnaW9uIHRoYXQgcGFzc2VkIHRoZSB0ZXN0LgorICogTm90ZToJUmVnaW9uIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyICEKKyAqLworc3RhdGljIHVuc2lnbmVkIHRlc3RfbWVtcmVnaW9uICh2b2lkKiBwdHIsIHVuc2lnbmVkIGxlbikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCogd19wdHI7CisJdW5zaWduZWQgbGVuX3cgPSBsZW4gPj4gMTsJLyogcmVnaW9uIGxlbiBpbiB3b3JkcyAqLworCXVuc2lnbmVkIGk7CisKKyAgICAgICAgZm9yIChpID0gMCwgd19wdHIgPSBwdHI7IGkgPCBsZW5fdzsgKytpLCArK3dfcHRyKQorICAgICAgICAgICAgICAgIHdyaXRldyAoMHhBQTU1LCB3X3B0cik7CisgICAgICAgIAorCWZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKyAgICAgICAgICAgICAgICBpZiAocmVhZHcgKHdfcHRyKSAhPSAweEFBNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbl93ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwLCB3X3B0ciA9IHB0cjsgaSA8IGxlbl93OyArK2ksICsrd19wdHIpCisgICAgICAgICAgICAgICAgd3JpdGV3ICgweDU1QUEsIHdfcHRyKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKyAgICAgICAgICAgICAgICBpZiAocmVhZHcod19wdHIpICE9IDB4NTVBQSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuX3cgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpID0gMCwgd19wdHIgPSBwdHI7IGkgPCBsZW5fdzsgKytpLCArK3dfcHRyKQorCQl3cml0ZXcgKDAsIHdfcHRyKTsKKworICAgICAgICByZXR1cm4gbGVuX3cgPDwgMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDYWxjdWxhdGUgMTYtYml0IENSQyB1c2luZyBDQ0lUVCBwb2x5bm9taWFsLgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gKHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IGNyYyA9IDA7CisJdW5zaWduZWQgbWFzaywgZmxhZzsKKworCWZvciAoOyBsZW47IC0tbGVuLCArK2J1ZikgeworCQlmb3IgKG1hc2sgPSAweDgwOyBtYXNrOyBtYXNrID4+PSAxKSB7CisJCQlmbGFnID0gKGNyYyAmIDB4ODAwMCk7CisJCQljcmMgPDw9IDE7CisJCQljcmMgfD0gKCgqYnVmICYgbWFzaykgPyAxIDogMCk7CisJCQlpZiAoZmxhZykgY3JjIF49IDB4MTAyMTsKKwkJfQorCX0KKwlyZXR1cm4gY3JjOworfQorCitzdGF0aWMgaW50IGluaXRfcGNpX3Nsb3Qoc2RsYWh3X3QgKmh3KQoreworCisJdTMyIGludF9zdGF0dXM7CisJaW50IHZvbGF0aWxlIGZvdW5kPTA7CisJaW50IGk9MDsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSB2ZXJ5IGZpcnN0IGxvYWQgZm9yIGEgc3BlY2lmaWMKKyAgICAgICAgICogcGNpIGNhcmQuIElmIGl0IGlzLCBjbGVhciB0aGUgaW50ZXJycHV0IGJpdHMsIGFuZAorICAgICAgICAgKiBzZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoaXMgY2FyZCB3YXMgaW5pdGlhbGl6ZWQuCisJICovCisJCisJZm9yIChpPTA7IChpPE1BWF9TNTE0X0NBUkRTKSAmJiAhZm91bmQ7IGkrKyl7CisJCWlmIChwY2lfc2xvdF9hcltpXSA9PSBody0+UzUxNF9zbG90X25vKXsKKwkJCWZvdW5kPTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAocGNpX3Nsb3RfYXJbaV0gPT0gMHhGRil7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZm91bmQpeworCQlyZWFkX1M1MTRfaW50X3N0YXQoaHcsJmludF9zdGF0dXMpOworCQlTNTE0X2ludGFjayhodyxpbnRfc3RhdHVzKTsKKwkJaWYgKGkgPT0gTUFYX1M1MTRfQ0FSRFMpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIEVycm9yICEhIVxuIixtb2RuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBOdW1iZXIgb2YgU2FuZ29tYSBQQ0kgY2FyZHMgZXhjZWVkZWQgbWF4aW11bSBsaW1pdC5cbiIsCisJCQkJCW1vZG5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXNcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGNpX3Nsb3RfYXJbaV0gPSBody0+UzUxNF9zbG90X25vOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfcHJvYmUoc2RsYWh3X3QgKmh3KQoreworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2xvdF9ubzsKKyAgICAgICAgaW50IG51bWJlcl9TNTE0X2NhcmRzID0gMDsKKyAgICAgICAgdTE2IFBDSV9zdWJzeXNfdmVuZG9yOworCXUxNiBQQ0lfY2FyZF90eXBlOworCisgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKKyAKKyAgICAgICBzbG90X25vID0gMDsKKyAgCisJd2hpbGUgKChwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFYzX1ZFTkRPUl9JRCwgVjNfREVWSUNFX0lELCBwY2lfZGV2KSkKKyAgICAgICAgCSE9IE5VTEwpIHsKKwkJCisgICAgICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU19WRU5ET1JfV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZQQ0lfc3Vic3lzX3ZlbmRvcik7CisJCQorICAgICAgICAgICAgICAgIGlmKFBDSV9zdWJzeXNfdmVuZG9yICE9IFNBTkdPTUFfU1VCU1lTX1ZFTkRPUikKKyAgICAgICAgICAgICAgICAJY29udGludWU7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX0NBUkRfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZQQ0lfY2FyZF90eXBlKTsKKwkKKwkJYnVzID0gcGNpX2Rldi0+YnVzOworCQkKKwkJLyogQSBkdWFsIGNwdSBjYXJkIGNhbiBzdXBwb3J0IHVwIHRvIDQgcGh5c2ljYWwgY29ubmVjdGlvbnMsCisJCSAqIHdoZXJlIGEgc2luZ2xlIGNwdSBjYXJkIGNhbiBzdXBwb3J0IHVwIHRvIDIgcGh5c2ljYWwKKwkJICogY29ubmVjdGlvbnMuICBUaGUgRlQxIGNhcmQgY2FuIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSAKKwkJICogY29ubmVjdGlvbiwgaG93ZXZlciB3ZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIFNpbmdsZQorCQkgKiBDUFUgY2FyZCBhbmQgYW4gRlQxIGNhcmQuICovCisJCWlmIChQQ0lfY2FyZF90eXBlID09IFM1MTRfRFVBTF9DUFUpeworICAgICAgICAgICAgICAgIAludW1iZXJfUzUxNF9jYXJkcyArPSA0OworCQkJIHByaW50ayhLRVJOX0lORk8KKwkJCQkid2FucGlwZTogUzUxNC1QQ0kgY2FyZCBmb3VuZCwgY3B1KHMpIDIsIGJ1cyAjJWQsIHNsb3QgIyVkLCBpcnEgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgCWJ1cy0+bnVtYmVyLCgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyksCisJCQkJcGNpX2Rldi0+aXJxKTsKKwkJfWVsc2V7CisJCQludW1iZXJfUzUxNF9jYXJkcyArPSAyOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJ3YW5waXBlOiBTNTE0LVBDSSBjYXJkIGZvdW5kLCBjcHUocykgMSwgYnVzICMlZCwgc2xvdCAjJWQsIGlycSAjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAJYnVzLT5udW1iZXIsKChwY2lfZGV2LT5kZXZmbiA+PiAzKSAmIFBDSV9ERVZfU0xPVF9NQVNLKSwKKwkJCQlwY2lfZGV2LT5pcnEpOworCQl9CisgICAgICAgIH0KKworCXJldHVybiBudW1iZXJfUzUxNF9jYXJkczsKKworfQorCisKKworRVhQT1JUX1NZTUJPTCh3YW5waXBlX2h3X3Byb2JlKTsKKwordW5zaWduZWQgd2FucGlwZV9od19wcm9iZSh2b2lkKQoreworCXNkbGFod190IGh3OworCXVuc2lnbmVkKiBvcHQgPSBzNTA4X3BvcnRfb3B0aW9uczsgCisJdW5zaWduZWQgY2FyZG5vPTA7CisJaW50IGk7CisJCisJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7CisJCisJZm9yIChpID0gMTsgaSA8PSBvcHRbMF07IGkrKykgeworCQlpZiAoZGV0ZWN0X3M1MDgob3B0W2ldKSl7CisJCQkvKiBTNTA4IGNhcmQgY2FuIHN1cHBvcnQgdXAgdG8gdHdvIHBoeXNpY2FsIGxpbmtzICovCisJCQljYXJkbm8rPTI7CisJCQlwcmludGsoS0VSTl9JTkZPICJ3YW5waXBlOiBTNTA4LUlTQSBjYXJkIGZvdW5kLCBwb3J0IDB4JXhcbiIsb3B0W2ldKTsKKwkJfQorCX0KKworICAgICAgI2lmZGVmIENPTkZJR19QQ0kKKwlody5TNTE0X3Nsb3Rfbm8gPSAwOworCWNhcmRubyArPSBwY2lfcHJvYmUoJmh3KTsKKyAgICAgICNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogV2FybmluZywgS2VybmVsIG5vdCBjb21waWxlZCBmb3IgUENJIHN1cHBvcnQhXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJ3YW5waXBlOiBQQ0kgSGFyZHdhcmUgUHJvYmUgRmFpbGVkIVxuIik7CisgICAgICAjZW5kaWYKKworCXJldHVybiBjYXJkbm87Cit9CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFtYWluLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGUxNTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFtYWluLmMKQEAgLTAsMCArMSwxMzQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZGxhbWFpbi5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiAgTWFpbiBtb2R1bGUuCisqCisqIEF1dGhvcjoJTmVuYWQgQ29yYmljCTxuY29yYmljQHNhbmdvbWEuY29tPgorKgkJR2lkZW9uIEhhY2sJCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIERlYyAyMiwgMjAwMCAgTmVuYWQgQ29yYmljCVVwZGF0ZWQgZm9yIDIuNC5YIGtlcm5lbHMuCisqIAkJCQlSZW1vdmVkIHRoZSBwb2xsaW5nIHJvdXRpbmUuCisqIE5vdiAxMywgMjAwMCAgTmVuYWQgQ29yYmljCUFkZGVkIGh3IHByb2Jpbmcgb24gbW9kdWxlIGxvYWQgYW5kIGR5bmFtaWMKKyogCQkJCWRldmljZSBhbGxvY2F0aW9uLiAKKyogTm92IDcsICAyMDAwICBOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIE11bHRpLVBvcnQgUFBQIGZvciBrZXJuZWxzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMi4xNiBhbmQgYWJvdmUuCisqIEF1ZyAyLCAgMjAwMCAgTmVuYWQgQ29yYmljCUJsb2NrIHRoZSBNdWx0aS1Qb3J0IFBQUCBmcm9tIHJ1bm5pbmcgb24KKyogIAkJCSAgICAgICAga2VybmVscyAyLjIuMTYgb3IgZ3JlYXRlci4gIFRoZSBTeW5jUFBQIAorKiAgCQkJICAgICAgICBoYXMgY2hhbmdlZC4KKyogSnVsIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMJVXBkYXRlZCB0aGUgUGlnZ2liYWNrIHN1cHBvcnQgZm9yIE11bHRQUFBQLgorKiBKdWwgMTMsIDIwMDAJTmVuYWQgQ29yYmljCUFkZGVkIE11bHRpLVBQUCBzdXBwb3J0LgorKiBGZWIgMDIsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBGaXhlZCB1cCBwaWdneWJhY2sgcHJvYmluZyBhbmQgc2VsZWN0aW9uLgorKiBTZXAgMjMsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBBZGRlZCBzdXBwb3J0IGZvciBTTVAKKyogU2VwIDEzLCAxOTk5ICBOZW5hZCBDb3JiaWMJRWFjaCBwb3J0IGlzIHRyZWF0ZWQgYXMgYSBzZXBhcmF0ZSBkZXZpY2UuCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqCQkJCVVwZGF0ZXMgZm9yIExpbnV4IDIuMi5YIGtlcm5lbHMuCisqIFNlcCAxNywgMTk5OAlKYXNwcmVldCBTaW5naAlVcGRhdGVkIGZvciAyLjEuMTIxKyBrZXJuZWwKKyogTm92IDI4LCAxOTk3CUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgRFJWX1JFTEVBU0UgdG8gMQorKiBOb3YgMTAsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBzdGkoKSB0byByZXN0b3JlX2ZsYWdzKCk7CisqIE5vdiAwNiwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBEUlZfVkVSU0lPTiB0byA0IGFuZCBEUlZfUkVMRUFTRSB0byAwCisqIE9jdCAyMCwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJTW9kaWZpZWQgc2RsYV9pc3Igcm91dGluZSBzbyB0aGF0IGNhcmQtPmluX2lzcgorKgkJCQlhc3NpZ25tZW50cyBhcmUgdGFrZW4gb3V0IGFuZCBwbGFjZWQgaW4gdGhlCisqCQkJCXNkbGFfcHBwLmMsIHNkbGFfZnIuYyBhbmQgc2RsYV94MjUuYyBpc3IKKyoJCQkJcm91dGluZXMuIFRvb2sgb3V0ICd3YW5kZXYtPnR4X2ludF9lbmFibGVkJyBhbmQKKyoJCQkJcmVwbGFjZWQgaXQgd2l0aCAnd2FuZGV2LT5lbmFibGVfdHhfaW50Jy4gCisqIE1heSAyOSwgMTk5NwlKYXNwcmVldCBTaW5naAlGbG93IENvbnRyb2wgUHJvYmxlbQorKgkJCQlhZGRlZCAid2FuZGV2LT50eF9pbnRfZW5hYmxlZD0xIiBsaW5lIGluIHRoZQorKgkJCQlpbml0IG1vZHVsZS4gVGhpcyBsaW5lIGluaXRpYWxpemVzIHRoZSBmbGFnIGZvciAKKyoJCQkJcHJldmVudGluZyBJbnRlcnJ1cHQgZGlzYWJsZWQgd2l0aCBkZXZpY2Ugc2V0IHRvCisqCQkJCWJ1c3kKKyogSmFuIDE1LCAxOTk3CUdlbmUgS296aW4JVmVyc2lvbiAzLjEuMAorKgkJCQkgbyBhZGRlZCBVRFAgbWFuYWdlbWVudCBzdHVmZgorKiBKYW4gMDIsIDE5OTcJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBPUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogc3VwcG9ydCBmb3IgbG9hZGFibGUgbW9kdWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbigpLCByZWxlYXNlX3JlZ2lvbigpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogcGh5c190b192aXJ0KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zZGxhcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZV9jb21tb24uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGtlcm5lbCA8LT4gdXNlciBjb3B5ICovCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyAKKyNkZWZpbmUgS01FTV9TQUZFVFlaT05FIDgKKworCisjaWZuZGVmIENPTkZJR19XQU5QSVBFX0ZSCisgICNkZWZpbmUgd3BmX2luaXQoYSxiKSAoLUVQUk9UT05PU1VQUE9SVCkgCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfV0FOUElQRV9DSERMQworICNkZWZpbmUgd3BjX2luaXQoYSxiKSAoLUVQUk9UT05PU1VQUE9SVCkgCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfV0FOUElQRV9YMjUKKyAjZGVmaW5lIHdweF9pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisgCisjaWZuZGVmIENPTkZJR19XQU5QSVBFX1BQUAorICNkZWZpbmUgd3BwX2luaXQoYSxiKSAoLUVQUk9UT05PU1VQUE9SVCkgCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfV0FOUElQRV9NVUxUUFBQIAorICNkZWZpbmUgd3NwcHBfaW5pdChhLGIpICgtRVBST1RPTk9TVVBQT1JUKSAKKyNlbmRpZgorIAorIAorLyoqKioqKioqKioqRk9SIERFQlVHR0lORyBQVVJQT1NFUyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQgKiBkYmdfa21hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHByaW8sIGludCBsaW5lKSB7CisJaW50IGkgPSAwOworCXZvaWQgKiB2ID0ga21hbGxvYyhzaXplK3NpemVvZih1bnNpZ25lZCBpbnQpKzIqS01FTV9TQUZFVFlaT05FKjgscHJpbyk7CisJY2hhciAqIGMxID0gdjsJCisJYzEgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJKigodW5zaWduZWQgaW50ICopdikgPSBzaXplOworCisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWMxWzBdID0gJ0QnOyBjMVsxXSA9ICdFJzsgYzFbMl0gPSAnQSc7IGMxWzNdID0gJ0QnOworCQljMVs0XSA9ICdCJzsgYzFbNV0gPSAnRSc7IGMxWzZdID0gJ0UnOyBjMVs3XSA9ICdGJzsKKwkJYzEgKz0gODsKKwl9CisJYzEgKz0gc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJYzFbMF0gPSAnTSc7IGMxWzFdID0gJ1UnOyBjMVsyXSA9ICdOJzsgYzFbM10gPSAnRyc7CisJCWMxWzRdID0gJ1cnOyBjMVs1XSA9ICdBJzsgYzFbNl0gPSAnTCc7IGMxWzddID0gJ0wnOworCQljMSArPSA4OworCX0KKwl2ID0gKChjaGFyICopdikgKyBzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4OworCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGttYWxsb2MoJWQsJWQpID0gJXBcbiIsbGluZSxzaXplLHByaW8sdik7CisJcmV0dXJuIHY7Cit9CitzdGF0aWMgdm9pZCBkYmdfa2ZyZWUodm9pZCAqIHYsIGludCBsaW5lKSB7CisJdW5zaWduZWQgaW50ICogc3AgPSAodW5zaWduZWQgaW50ICopKCgoY2hhciAqKXYpIC0gKHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjgpKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9ICpzcDsKKwljaGFyICogYzEgPSAoKGNoYXIgKil2KSAtIEtNRU1fU0FGRVRZWk9ORSo4OworCWludCBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJaWYgKCAgIGMxWzBdICE9ICdEJyB8fCBjMVsxXSAhPSAnRScgfHwgYzFbMl0gIT0gJ0EnIHx8IGMxWzNdICE9ICdEJworCQkgICAgfHwgYzFbNF0gIT0gJ0InIHx8IGMxWzVdICE9ICdFJyB8fCBjMVs2XSAhPSAnRScgfHwgYzFbN10gIT0gJ0YnKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJrbWFsbG9jZWQgYmxvY2sgYXQgJXAgaGFzIGJlZW4gY29ycnVwdGVkICh1bmRlcnJ1bikhXG4iLHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICU0eDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwgaSo4LAorCQkJICAgICAgICAgICAgICAgIGMxWzBdLGMxWzFdLGMxWzJdLGMxWzNdLGMxWzRdLGMxWzVdLGMxWzZdLGMxWzddICk7CisJCX0KKwkJYzEgKz0gODsKKwl9CisJYzEgKz0gc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJaWYgKCAgIGMxWzBdICE9ICdNJyB8fCBjMVsxXSAhPSAnVScgfHwgYzFbMl0gIT0gJ04nIHx8IGMxWzNdICE9ICdHJworCQkgICAgfHwgYzFbNF0gIT0gJ1cnIHx8IGMxWzVdICE9ICdBJyB8fCBjMVs2XSAhPSAnTCcgfHwgYzFbN10gIT0gJ0wnCisJCSAgICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAia21hbGxvY2VkIGJsb2NrIGF0ICVwIGhhcyBiZWVuIGNvcnJ1cHRlZCAob3ZlcnJ1bik6XG4iLHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICU0eDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwgaSo4LAorCQkJICAgICAgICAgICAgICAgIGMxWzBdLGMxWzFdLGMxWzJdLGMxWzNdLGMxWzRdLGMxWzVdLGMxWzZdLGMxWzddICk7CisJCX0KKwkJYzEgKz0gODsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAibGluZSAlZCAga2ZyZWUoJXApXG4iLGxpbmUsdik7CisJdiA9ICgoY2hhciAqKXYpIC0gKHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjgpOworCWtmcmVlKHYpOworfQorCisjZGVmaW5lIGttYWxsb2MoeCx5KSBkYmdfa21hbGxvYyh4LHksX19MSU5FX18pCisjZGVmaW5lIGtmcmVlKHgpIGRiZ19rZnJlZSh4LF9fTElORV9fKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglfREVCVUdfCisjZGVmaW5lCVNUQVRJQworI2Vsc2UKKyNkZWZpbmUJU1RBVElDCQlzdGF0aWMKKyNlbmRpZgorCisjZGVmaW5lCURSVl9WRVJTSU9OCTUJCS8qIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lCURSVl9SRUxFQVNFCTAJCS8qIHJlbGVhc2UgKG1pbm9yIHZlcnNpb24pIG51bWJlciAqLworI2RlZmluZQlNQVhfQ0FSRFMJMTYJCS8qIG1heCBudW1iZXIgb2YgYWRhcHRlcnMgKi8KKworI2lmbmRlZglDT05GSUdfV0FOUElQRV9DQVJEUwkJLyogY29uZmlndXJhYmxlIG9wdGlvbiAqLworI2RlZmluZQlDT05GSUdfV0FOUElQRV9DQVJEUyAxCisjZW5kaWYKKworI2RlZmluZQlDTURfT0sJCTAJCS8qIG5vcm1hbCBmaXJtd2FyZSByZXR1cm4gY29kZSAqLworI2RlZmluZQlDTURfVElNRU9VVAkweEZGCQkvKiBmaXJtd2FyZSBjb21tYW5kIHRpbWVkIG91dCAqLworI2RlZmluZQlNQVhfQ01EX1JFVFJZCTEwCQkvKiBtYXggbnVtYmVyIG9mIGZpcm13YXJlIHJldHJpZXMgKi8KKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworIAorLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworc3RhdGljIGludCBzZXR1cChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB3YW5kZXZfY29uZl90KiBjb25mKTsKK3N0YXRpYyBpbnQgc2h1dGRvd24oc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldik7CitzdGF0aWMgaW50IGlvY3RsKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisvKiBJT0NUTCBoYW5kbGVycyAqLworc3RhdGljIGludCBpb2N0bF9kdW1wCShzZGxhX3QqIGNhcmQsIHNkbGFfZHVtcF90KiB1X2R1bXApOworc3RhdGljIGludCBpb2N0bF9leGVjCShzZGxhX3QqIGNhcmQsIHNkbGFfZXhlY190KiB1X2V4ZWMsIGludCk7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitTVEFUSUMgaXJxcmV0dXJuX3Qgc2RsYV9pc3IJKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgcmVsZWFzZV9odyAgKHNkbGFfdCAqY2FyZCk7CisKK3N0YXRpYyBpbnQgY2hlY2tfczUwOF9jb25mbGljdHMgKHNkbGFfdCogY2FyZCx3YW5kZXZfY29uZl90KiBjb25mLCBpbnQqKTsKK3N0YXRpYyBpbnQgY2hlY2tfczUxNF9jb25mbGljdHMgKHNkbGFfdCogY2FyZCx3YW5kZXZfY29uZl90KiBjb25mLCBpbnQqKTsKKworCisvKioqKioqIEdsb2JhbCBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGU6IEFsbCBkYXRhIG11c3QgYmUgZXhwbGljaXRseSBpbml0aWFsaXplZCEhIQorICovCisKKy8qIHByaXZhdGUgZGF0YSAqLworc3RhdGljIGNoYXIgZHJ2bmFtZVtdCT0gIndhbnBpcGUiOworc3RhdGljIGNoYXIgZnVsbG5hbWVbXQk9ICJXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIERyaXZlciI7CitzdGF0aWMgY2hhciBjb3B5cmlnaHRbXQk9ICIoYykgMTk5NS0yMDAwIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4iOworc3RhdGljIGludCBuY2FyZHM7IAorc3RhdGljIHNkbGFfdCogY2FyZF9hcnJheTsJCS8qIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCisvKiBXYW5waXBlJ3Mgb3duIHdvcmtxdWV1ZSwgdXNlZCBmb3IgYWxsIEFQSSdzLgorICogQWxsIHByb3RvY29sIHNwZWNpZmljIHRhc2tzIHdpbGwgYmUgaW5zZXJ0ZWQKKyAqIGludG8gdGhlICJ3YW5waXBlX3dxIiB3b3JrcXVldWUuIAorCisgKiBUaGUga2VybmVsIHdvcmtxdWV1ZSBtZWNoYW5pc20gd2lsbCBleGVjdXRlCisgKiBhbGwgcGVuZGluZyB0YXNrcyBpbiB0aGUgIndhbnBpcGVfd3EiIHdvcmtxdWV1ZS4KKyAqLworCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd2FucGlwZV93cTsKK0RFQ0xBUkVfV09SSyh3YW5waXBlX3dvcmssIE5VTEwsIE5VTEwpOworCitzdGF0aWMgaW50IHdhbnBpcGVfYmhfY3JpdGljYWw7CisKKy8qKioqKioqIEtlcm5lbCBMb2FkYWJsZSBNb2R1bGUgRW50cnkgUG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1vZHVsZSAnaW5zZXJ0JyBlbnRyeSBwb2ludC4KKyAqIG8gcHJpbnQgYW5ub3VuY2VtZW50CisgKiBvIGFsbG9jYXRlIGFkYXB0ZXIgZGF0YSBzcGFjZQorICogbyBpbml0aWFsaXplIHN0YXRpYyBkYXRhCisgKiBvIHJlZ2lzdGVyIGFsbCBjYXJkcyB3aXRoIFdBTiByb3V0ZXIKKyAqIG8gY2FsaWJyYXRlIFNETEEgc2hhcmVkIG1lbW9yeSBhY2Nlc3MgZGVsYXkuCisgKgorICogUmV0dXJuOgkwCU9rCisgKgkJPCAwCWVycm9yLgorICogQ29udGV4dDoJcHJvY2VzcworICovCisgCitzdGF0aWMgaW50IF9faW5pdCB3YW5waXBlX2luaXQodm9pZCkKK3sKKwlpbnQgY250LCBlcnIgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCQlmdWxsbmFtZSwgRFJWX1ZFUlNJT04sIERSVl9SRUxFQVNFLCBjb3B5cmlnaHQpOworCisJd2FucGlwZV93cSA9IGNyZWF0ZV93b3JrcXVldWUoIndhbnBpcGVfd3EiKTsKKwlpZiAoIXdhbnBpcGVfd3EpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUHJvYmUgZm9yIHdhbnBpcGUgY2FyZHMgYW5kIHJldHVybiB0aGUgbnVtYmVyIGZvdW5kICovCisJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogUHJvYmluZyBmb3IgV0FOUElQRSBoYXJkd2FyZS5cbiIpOworCW5jYXJkcyA9IHdhbnBpcGVfaHdfcHJvYmUoKTsKKwlpZiAobmNhcmRzKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogQWxsb2NhdGluZyBtYXhpbXVtICVpIGRldmljZXM6IHdhbnBpcGUlaSAtIHdhbnBpcGUlaS5cbiIsbmNhcmRzLDEsbmNhcmRzKTsKKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogTm8gUzUxNC9TNTA4IGNhcmRzIGZvdW5kLCB1bmxvYWRpbmcgbW9kdWxlcyFcbiIpOworCQlkZXN0cm95X3dvcmtxdWV1ZSh3YW5waXBlX3dxKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCS8qIFZlcmlmeSBudW1iZXIgb2YgY2FyZHMgYW5kIGFsbG9jYXRlIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWNhcmRfYXJyYXkgPSBrbWFsbG9jKHNpemVvZihzZGxhX3QpICogbmNhcmRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZF9hcnJheSA9PSBOVUxMKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHdhbnBpcGVfd3EpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY2FyZF9hcnJheSwgMCwgc2l6ZW9mKHNkbGFfdCkgKiBuY2FyZHMpOworCisJLyogUmVnaXN0ZXIgYWRhcHRlcnMgd2l0aCBXQU4gcm91dGVyICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBuY2FyZHM7ICsrIGNudCkgeworCQlzZGxhX3QqIGNhcmQgPSAmY2FyZF9hcnJheVtjbnRdOworCQlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCQljYXJkLT5uZXh0ID0gTlVMTDsKKwkJc3ByaW50ZihjYXJkLT5kZXZuYW1lLCAiJXMlZCIsIGRydm5hbWUsIGNudCArIDEpOworCQl3YW5kZXYtPm1hZ2ljICAgID0gUk9VVEVSX01BR0lDOworCQl3YW5kZXYtPm5hbWUgICAgID0gY2FyZC0+ZGV2bmFtZTsKKwkJd2FuZGV2LT5wcml2YXRlICA9IGNhcmQ7CisJCXdhbmRldi0+ZW5hYmxlX3R4X2ludCA9IDA7CisJCXdhbmRldi0+c2V0dXAgICAgPSAmc2V0dXA7CisJCXdhbmRldi0+c2h1dGRvd24gPSAmc2h1dGRvd247CisJCXdhbmRldi0+aW9jdGwgICAgPSAmaW9jdGw7CisJCWVyciA9IHJlZ2lzdGVyX3dhbl9kZXZpY2Uod2FuZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogJXMgcmVnaXN0cmF0aW9uIGZhaWxlZCB3aXRoIGVycm9yICVkIVxuIiwKKwkJCQlkcnZuYW1lLCBjYXJkLT5kZXZuYW1lLCBlcnIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGNudCl7CisJCW5jYXJkcyA9IGNudDsJLyogYWRqdXN0IGFjdHVhbCBudW1iZXIgb2YgY2FyZHMgKi8KKwl9ZWxzZSB7CisJCWtmcmVlKGNhcmRfYXJyYXkpOworCQlkZXN0cm95X3dvcmtxdWV1ZSh3YW5waXBlX3dxKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSU4gSW5pdCBNb2R1bGU6IE5PIENhcmRzIHJlZ2lzdGVyZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9kdWxlICdyZW1vdmUnIGVudHJ5IHBvaW50LgorICogbyB1bnJlZ2lzdGVyIGFsbCBhZGFwdGVycyBmcm9tIHRoZSBXQU4gcm91dGVyCisgKiBvIHJlbGVhc2UgYWxsIHJlbWFpbmluZyBzeXN0ZW0gcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB3YW5waXBlX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghbmNhcmRzKQorCQlyZXR1cm47CisJCQorCWZvciAoaSA9IDA7IGkgPCBuY2FyZHM7ICsraSkgeworCQlzZGxhX3QqIGNhcmQgPSAmY2FyZF9hcnJheVtpXTsKKwkJdW5yZWdpc3Rlcl93YW5fZGV2aWNlKGNhcmQtPmRldm5hbWUpOworCX0KKwlkZXN0cm95X3dvcmtxdWV1ZSh3YW5waXBlX3dxKTsKKwlrZnJlZShjYXJkX2FycmF5KTsKKworCXByaW50ayhLRVJOX0lORk8gIlxud2FucGlwZTogV0FOUElQRSBNb2R1bGVzIFVubG9hZGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KHdhbnBpcGVfaW5pdCk7Cittb2R1bGVfZXhpdCh3YW5waXBlX2NsZWFudXApOworCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXR1cC9jb25maWd1cmUgV0FOIGxpbmsgZHJpdmVyLgorICogbyBjaGVjayBhZGFwdGVyIHN0YXRlCisgKiBvIG1ha2Ugc3VyZSBmaXJtd2FyZSBpcyBwcmVzZW50IGluIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIEkvTyBwb3J0IGFuZCBJUlEgYXJlIHNwZWNpZmllZAorICogbyBtYWtlIHN1cmUgSS9PIHJlZ2lvbiBpcyBhdmFpbGFibGUKKyAqIG8gYWxsb2NhdGUgaW50ZXJydXB0IHZlY3RvcgorICogbyBzZXR1cCBTRExBIGhhcmR3YXJlCisgKiBvIGNhbGwgYXBwcm9wcmlhdGUgcm91dGluZSB0byBwZXJmb3JtIHByb3RvY29sLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiBvIG1hcmsgSS9PIHJlZ2lvbiBhcyB1c2VkCisgKiBvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGl2ZSBjYXJkLCB0aGVuIHNjaGVkdWxlIGJhY2tncm91bmQgdGFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcm91dGVyIGhhbmRsZXMgUk9VVEVSX1NFVFVQIElPQ1RMLiBUaGUKKyAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGlzIGluIGtlcm5lbCBtZW1vcnkgKGluY2x1ZGluZyBleHRlbmRlZCBkYXRhLCBpZgorICogYW55KS4KKyAqLworIAorc3RhdGljIGludCBzZXR1cChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB3YW5kZXZfY29uZl90KiBjb25mKQoreworCXNkbGFfdCogY2FyZDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaXJxPTA7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSB8fCAoY29uZiA9PSBOVUxMKSl7CisJCXByaW50ayhLRVJOX0lORk8gCisJCSAgICAgICIlczogRmFpbGVkIFNkbGFtYWluIFNldHVwIHdhbmRldiAldSwgY2FyZCAldSwgY29uZiAldSAhXG4iLAorCQkgICAgICB3YW5kZXYtPm5hbWUsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpd2FuZGV2LCh1bnNpZ25lZCBpbnQpd2FuZGV2LT5wcml2YXRlLAorCQkgICAgICAodW5zaWduZWQgaW50KWNvbmYpOyAKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIFdBTiBTZXR1cFxuIiwgd2FuZGV2LT5uYW1lKTsKKworCWNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJaWYgKHdhbmRldi0+c3RhdGUgIT0gV0FOX1VOQ09ORklHVVJFRCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgc2RsYW1haW4gc2V0dXAsIGJ1c3khXG4iLAorCQkJd2FuZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsJCS8qIGFscmVhZHkgY29uZmlndXJlZCAqLworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlxuUHJvY2Vzc2luZyBXQU4gZGV2aWNlICVzLi4uXG4iLCB3YW5kZXYtPm5hbWUpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgZm9yIGVhY2ggd2FuZGV2IAorCSAqIFVzZWQgZm9yIGNvdW50aW5nIG51bWJlciBvZiB0aW1lcyBuZXdfaWYgYW5kIAorICAgICAgICAgKiBkZWxfaWYgZ2V0IGNhbGxlZC4KKwkgKi8KKwl3YW5kZXYtPmRlbF9pZl9jbnQgPSAwOworCXdhbmRldi0+bmV3X2lmX2NudCA9IDA7CisJd2FuZGV2LT5jb25maWdfaWQgID0gY29uZi0+Y29uZmlnX2lkOworCisJaWYgKCFjb25mLT5kYXRhX3NpemUgfHwgKGNvbmYtPmRhdGEgPT0gTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBmaXJtd2FyZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiBkYXRhIVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZvciByZXNvdXJjZSBjb25mbGljdHMgYW5kIHNldHVwIHRoZQorCSAqIGNhcmQgZm9yIHBpZ2dpYmFja2luZyBpZiBuZWNlc3NhcnkgKi8KKwlpZighY29uZi0+UzUxNF9DUFVfbm9bMF0pIHsKKwkJaWYgKChlcnI9Y2hlY2tfczUwOF9jb25mbGljdHMoY2FyZCxjb25mLCZpcnEpKSAhPSAwKXsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9ZWxzZSB7CisJCWlmICgoZXJyPWNoZWNrX3M1MTRfY29uZmxpY3RzKGNhcmQsY29uZiwmaXJxKSkgIT0gMCl7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogSWYgdGhlIGN1cnJlbnQgY2FyZCBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQKKyAgICAgICAgICogb3IgaXQncyBhIHBpZ2d5YmFjayBjYXJkLCBkbyBub3QgdHJ5IHRvIGFsbG9jYXRlCisgICAgICAgICAqIHJlc291cmNlcy4KKwkgKi8KKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2sgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpeworCisJCS8qIENvbmZpZ3VyZSBoYXJkd2FyZSwgbG9hZCBmaXJtd2FyZSwgZXRjLiAqLworCQltZW1zZXQoJmNhcmQtPmh3LCAwLCBzaXplb2Yoc2RsYWh3X3QpKTsKKworCQkvKiBmb3IgYW4gUzUxNCBhZGFwdGVyLCBwYXNzIHRoZSBDUFUgbnVtYmVyIGFuZCB0aGUgc2xvdCBudW1iZXIgcmVhZCAqLworCQkvKiBmcm9tICdyb3V0ZXIuY29uZicgdG8gdGhlICdzZGxhX3NldHVwKCknIGZ1bmN0aW9uIHZpYSB0aGUgJ3BvcnQnICovCisJCS8qIHBhcmFtZXRlciAqLworCQlpZiAoY29uZi0+UzUxNF9DUFVfbm9bMF0peworCisJCQljYXJkLT5ody5TNTE0X2NwdV9ub1swXSA9IGNvbmYtPlM1MTRfQ1BVX25vWzBdOworCQkJY2FyZC0+aHcuUzUxNF9zbG90X25vID0gY29uZi0+UENJX3Nsb3Rfbm87CisJCQljYXJkLT5ody5hdXRvX3BjaV9jZmcgPSBjb25mLT5hdXRvX3BjaV9jZmc7CisKKwkJCWlmIChjYXJkLT5ody5hdXRvX3BjaV9jZmcgPT0gV0FOT1BUX1lFUyl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgQ1BVIHRvICVjIGFuZCBTbG90IHRvIEF1dG9cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF0pOworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgQ1BVIHRvICVjIGFuZCBTbG90IHRvICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPmh3LlM1MTRfY3B1X25vWzBdLCBjYXJkLT5ody5TNTE0X3Nsb3Rfbm8pOworCQkJfQorCisJCX1lbHNleworCQkJLyogNTA4IENhcmQgaW8gcG9ydCBhbmQgaXJxIGluaXRpYWxpemF0aW9uICovCisJCQljYXJkLT5ody5wb3J0ID0gY29uZi0+aW9wb3J0OworCQkJY2FyZC0+aHcuaXJxID0gKGNvbmYtPmlycSA9PSA5KSA/IDIgOiBjb25mLT5pcnE7CisJCX0KKworCisJCS8qIENvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY2FyZCBpbiBrZXJuZWwgc3BhY2UgKi8KKwkJaWYoY29uZi0+bWFkZHIpeworCQkJY2FyZC0+aHcuZHBtYmFzZSA9IHBoeXNfdG9fdmlydChjb25mLT5tYWRkcik7CisJCX1lbHNlewkKKwkJCWNhcmQtPmh3LmRwbWJhc2UgPSAodm9pZCAqKWNvbmYtPm1hZGRyOworCQl9CisJCQkKKwkJY2FyZC0+aHcuZHBtc2l6ZSA9IFNETEFfV0lORE9XU0laRTsKKwkJCisJCS8qIHNldCB0aGUgYWRhcHRlciB0eXBlIGlmIHVzaW5nIGFuIFM1MTQgYWRhcHRlciAqLworCQljYXJkLT5ody50eXBlID0gKGNvbmYtPlM1MTRfQ1BVX25vWzBdKSA/IFNETEFfUzUxNCA6IGNvbmYtPmh3X29wdFswXTsgCisJCWNhcmQtPmh3LnBjbGsgPSBjb25mLT5od19vcHRbMV07CisKKwkJZXJyID0gc2RsYV9zZXR1cCgmY2FyZC0+aHcsIGNvbmYtPmRhdGEsIGNvbmYtPmRhdGFfc2l6ZSk7CisJCWlmIChlcnIpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhcmR3YXJlIHNldHVwIEZhaWxlZCAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJICAgICAgICBpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkKKwkJCWlycSA9IChjb25mLT5pcnEgPT0gMikgPyA5IDogY29uZi0+aXJxOyAvKiBJUlEyIC0+IElSUTkgKi8KKwkJZWxzZQorCQkJaXJxID0gY2FyZC0+aHcuaXJxOworCisJCS8qIHJlcXVlc3QgYW4gaW50ZXJydXB0IHZlY3RvciAtIG5vdGUgdGhhdCBpbnRlcnJ1cHRzIG1heSBiZSBzaGFyZWQgKi8KKwkJLyogd2hlbiB1c2luZyB0aGUgUzUxNCBQQ0kgYWRhcHRlciAqLworCQkKKyAgICAgICAJCWlmKHJlcXVlc3RfaXJxKGlycSwgc2RsYV9pc3IsIAorCQkgICAgICAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8gU0FfU0hJUlEgOiAwLCAKKwkJICAgICAgIHdhbmRldi0+bmFtZSwgY2FyZCkpeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2FuJ3QgcmVzZXJ2ZSBJUlEgJWQhXG4iLCB3YW5kZXYtPm5hbWUsIGlycSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDYXJkIENvbmZpZ3VyZWQgJWx1IG9yIFBpZ2d5YmFja2luZyAlaSFcbiIsCisJCQl3YW5kZXYtPm5hbWUsY2FyZC0+Y29uZmlndXJlZCxjYXJkLT53YW5kZXYucGlnZ3liYWNrKTsKKwl9IAorCisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCisJCS8qIEluaXRpYWxpemUgdGhlIFNwaW4gbG9jayAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW5pdGlhbGl6aW5nIGZvciBTTVBcbiIsd2FuZGV2LT5uYW1lKTsKKworCQkvKiBQaWdneWJhY2sgc3BpbiBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsCisJCSAqIGluIGNoZWNrX3M1MTQvczUwOF9jb25mbGljdHMoKSAqLworCQlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2speworCQkJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPndhbmRldi5sb2NrKTsKKwkJfQorCQkKKwkJLyogSW50aWFsaXplIFdBTiBkZXZpY2UgZGF0YSBzcGFjZSAqLworCQl3YW5kZXYtPmlycSAgICAgICA9IGlycTsKKwkJd2FuZGV2LT5kbWEgICAgICAgPSAwOworCQlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7IAorCQkJd2FuZGV2LT5pb3BvcnQgPSBjYXJkLT5ody5wb3J0OworCQl9ZWxzZXsKKwkJCXdhbmRldi0+UzUxNF9jcHVfbm9bMF0gPSBjYXJkLT5ody5TNTE0X2NwdV9ub1swXTsKKwkJCXdhbmRldi0+UzUxNF9zbG90X25vID0gY2FyZC0+aHcuUzUxNF9zbG90X25vOworCQl9CisJCXdhbmRldi0+bWFkZHIgICAgID0gKHVuc2lnbmVkIGxvbmcpY2FyZC0+aHcuZHBtYmFzZTsKKwkJd2FuZGV2LT5tc2l6ZSAgICAgPSBjYXJkLT5ody5kcG1zaXplOworCQl3YW5kZXYtPmh3X29wdFswXSA9IGNhcmQtPmh3LnR5cGU7CisJCXdhbmRldi0+aHdfb3B0WzFdID0gY2FyZC0+aHcucGNsazsKKwkJd2FuZGV2LT5od19vcHRbMl0gPSBjYXJkLT5ody5tZW1vcnk7CisJCXdhbmRldi0+aHdfb3B0WzNdID0gY2FyZC0+aHcuZndpZDsKKwl9CisKKwkvKiBQcm90b2NvbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworCXN3aXRjaCAoY2FyZC0+aHcuZndpZCkgeworCisJY2FzZSBTRklEX1gyNV81MDI6CisJY2FzZSBTRklEX1gyNV81MDg6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGFydGluZyBYLjI1IFByb3RvY29sIEluaXQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQllcnIgPSB3cHhfaW5pdChjYXJkLCBjb25mKTsKKwkJYnJlYWs7CisJY2FzZSBTRklEX0ZSNTAyOgorCWNhc2UgU0ZJRF9GUjUwODoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIEZyYW1lIFJlbGF5IFByb3RvY29sIEluaXQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQllcnIgPSB3cGZfaW5pdChjYXJkLCBjb25mKTsKKwkJYnJlYWs7CisJY2FzZSBTRklEX1BQUDUwMjoKKwljYXNlIFNGSURfUFBQNTA4OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgUFBQIFByb3RvY29sIEluaXQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQllcnIgPSB3cHBfaW5pdChjYXJkLCBjb25mKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU0ZJRF9DSERMQzUwODoKKwljYXNlIFNGSURfQ0hETEM1MTQ6CisJCWlmIChjb25mLT5mdDEpewkJCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgRlQxIENTVS9EU1UgQ29uZmlnIERyaXZlci5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQllcnIgPSB3cGZ0MV9pbml0KGNhcmQsIGNvbmYpOworCQkJYnJlYWs7CisJCQkKKwkJfWVsc2UgaWYgKGNvbmYtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfTVBQUCl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgTXVsdGktUG9ydCBQUFAgUHJvdG9jb2wgSW5pdC5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJZXJyID0gd3NwcHBfaW5pdChjYXJkLGNvbmYpOworCQkJYnJlYWs7CisKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgQ0hETEMgUHJvdG9jb2wgSW5pdC5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJZXJyID0gd3BjX2luaXQoY2FyZCwgY29uZik7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFcnJvciwgRmlybXdhcmUgaXMgbm90IHN1cHBvcnRlZCAlWCAlWCFcbiIsCisJCQl3YW5kZXYtPm5hbWUsY2FyZC0+aHcuZndpZCxTRklEX0NIRExDNTA4KTsKKwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwl9CisKKwlpZiAoZXJyICE9IDApeworCQlpZiAoZXJyID09IC1FUFJPVE9OT1NVUFBPUlQpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IEVycm9yLCBQcm90b2NvbCBzZWxlY3RlZCBoYXMgbm90IGJlZW4gY29tcGlsZWQhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiAgICAgICAgUmUtY29uZmlndXJlIHRoZSBrZXJuZWwgYW5kIHJlLWJ1aWxkIHRoZSBtb2R1bGVzIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJCisJCXJlbGVhc2VfaHcoY2FyZCk7CisJCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOworCQlyZXR1cm4gZXJyOworCX0KKworCisgIAkvKiBSZXNlcnZlIEkvTyByZWdpb24gYW5kIHNjaGVkdWxlIGJhY2tncm91bmQgdGFzayAqLworICAgICAgICBpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCAmJiAhY2FyZC0+d2FuZGV2LnBpZ2d5YmFjaykKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjYXJkLT5ody5wb3J0LCBjYXJkLT5ody5pb19yYW5nZSwgCisJCQkJd2FuZGV2LT5uYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG9ydCAweCUwNHggYnVzeVxuIiwgY2FyZC0+aHcucG9ydCk7CisJCQlyZWxlYXNlX2h3KGNhcmQpOworCQkJd2FuZGV2LT5zdGF0ZSA9IFdBTl9VTkNPTkZJR1VSRUQ7CisJCQlyZXR1cm4gLUVCVVNZOworCSAgfQorCisJLyogT25seSB1c2UgdGhlIHBvbGxpbmcgcm91dGluZSBmb3IgdGhlIFgyNSBwcm90b2NvbCAqLworCQorCWNhcmQtPndhbmRldi5jcml0aWNhbD0wOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqIGNvbmZpZ3VyZV9zNTA4X2NhcmQKKyAqIAorICogRm9yIGEgUzUwOCBhZGFwdGVyLCBjaGVjayBmb3IgYSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIGVycm9yIGluIHRoYXQKKyAqIHdlIGFyZSBsb2FkaW5nIGFuIGFkYXB0ZXIgaW4gdGhlIHNhbWUgSU8gcG9ydCBhcyBhIHByZXZpb3VzbHkgbG9hZGVkIFM1MDgKKyAqIGNhcmQuCisgKi8gCisKK3N0YXRpYyBpbnQgY2hlY2tfczUwOF9jb25mbGljdHMgKHNkbGFfdCogY2FyZCx3YW5kZXZfY29uZl90KiBjb25mLCBpbnQgKmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgaTsKKwkKKwlpZiAoY29uZi0+aW9wb3J0IDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkiJXM6IGNhbid0IGNvbmZpZ3VyZSB3aXRob3V0IEkvTyBwb3J0IGFkZHJlc3MhXG4iLAorCQljYXJkLT53YW5kZXYubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb25mLT5pcnEgPD0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgY29uZmlndXJlIHdpdGhvdXQgSVJRIVxuIiwKKwkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGVzdF9iaXQoMCwmY2FyZC0+Y29uZmlndXJlZCkpCisJCXJldHVybiAwOworCisKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBsb2FkZWQgY2FyZCB3aXRoIHRoZSBzYW1lIElPIHBvcnQgYW5kIElSUSAKKwkgKiBJZiBmb3VuZCwgY29weSBpdHMgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBhbmQgdXNlIGl0cworCSAqIHJlc291cmNlcyAoaS5lLiBwaWdneWJhY2tpbmcpCisJICovCisJCisJZm9yIChpID0gMDsgaSA8IG5jYXJkczsgaSsrKSB7CisJCXNkbGFfdCAqbnh0X2NhcmQgPSAmY2FyZF9hcnJheVtpXTsKKworCQkvKiBTa2lwIHRoZSBjdXJyZW50IGNhcmQgcHRyICovCisJCWlmIChueHRfY2FyZCA9PSBjYXJkKQkKKwkJCWNvbnRpbnVlOworCisKKwkJLyogRmluZCBhIGNhcmQgdGhhdCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCB0aGUKKwkJICogc2FtZSBJTyBQb3J0ICovCisJCWlmICgobnh0X2NhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTA4KSAmJgorCQkgICAgKG54dF9jYXJkLT5ody5wb3J0ID09IGNvbmYtPmlvcG9ydCkgJiYgCisJCSAgICAobnh0X2NhcmQtPm5leHQgPT0gTlVMTCkpeworCQkJCisJCQkvKiBXZSBmb3VuZCBhIGNhcmQgdGhlIGNhcmQgdGhhdCBoYXMgc2FtZSBjb25maWd1cmF0aW9uCisJCQkgKiBhcyB1cy4gVGhpcyBtZWFucywgdGhhdCB3ZSBtdXN0IHNldHVwIHRoaXMgY2FyZCBpbiAKKwkJCSAqIHBpZ2dpYmFja2luZyBtb2RlLiBIb3dldmVyLCBvbmx5IENIRExDIGFuZCBNUFBQIHByb3RvY29sCisJCQkgKiBzdXBwb3J0IHRoaXMgc2V0dXAgKi8KKwkJCisJCQlpZiAoKGNvbmYtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfQ0hETEMgfHwgCisJCQkgICAgIGNvbmYtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfTVBQUCkgJiYKKwkJCSAgICAobnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBueHRfY2FyZC0+d2FuZGV2LmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfTVBQUCkpeyAKKwkJCQkKKwkJCQkqaXJxID0gbnh0X2NhcmQtPmh3LmlycTsKKwkJCQltZW1jcHkoJmNhcmQtPmh3LCAmbnh0X2NhcmQtPmh3LCBzaXplb2Yoc2RsYWh3X3QpKTsKKwkJCQorCQkJCS8qIFRoZSBtYXN0ZXIgY291bGQgYWxyZWFkeSBiZSBydW5uaW5nLCB3ZSBtdXN0CisJCQkJICogc2V0IHRoaXMgYXMgYSBjcml0aWNhbCBhcmVhICovCisJCQkJbG9ja19hZGFwdGVyX2lycSgmbnh0X2NhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKworCQkJCW54dF9jYXJkLT5uZXh0ID0gY2FyZDsKKwkJCQljYXJkLT5uZXh0ID0gbnh0X2NhcmQ7CisKKwkJCQljYXJkLT53YW5kZXYucGlnZ3liYWNrID0gV0FOT1BUX1lFUzsKKworCQkJCS8qIFdlIG11c3QgaW5pdGlhbGlzZSB0aGUgcGlnZ2liYWNrIHNwaW4gbG9jayBoZXJlCisJCQkJICogc2luY2UgaXNyIHdpbGwgdHJ5IHRvIGxvY2sgY2FyZC0+bmV4dCBpZiBpdAorCQkJCSAqIGV4aXN0cyAqLworCQkJCXNwaW5fbG9ja19pbml0KCZjYXJkLT53YW5kZXYubG9jayk7CisJCQkJCisJCQkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZueHRfY2FyZC0+d2FuZGV2LmxvY2ssICZzbXBfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfWVsc2V7CisJCQkJLyogVHJ5aW5nIHRvIHJ1biBwaWdnaWJhY2tpbmcgd2l0aCBhIHdyb25nIHByb3RvY29sICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SOiBSZXNvdXJjZSBidXN5LCBpb3BvcnQ6IDB4JXhcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBUaGlzIHByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydFxuIgorCQkJCQkJICIlczogICAgICAgIG11bHRpLXBvcnQgb3BlcmF0aW9uIVxuIiwKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLG54dF9jYXJkLT5ody5wb3J0LAorCQkJCQkJIGNhcmQtPmRldm5hbWUsY2FyZC0+ZGV2bmFtZSk7CisJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQl9CisJCX0KKwl9CisJCisKKwkvKiBNYWtlIHN1cmUgSS9PIHBvcnQgcmVnaW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHdlIGFyZSB0aGUKKwkgKiBtYXN0ZXIgZGV2aWNlLiAgSWYgd2UgYXJlIHJ1bm5pbmcgaW4gcGlnZ3liYWNraW5nIG1vZGUsIAorCSAqIHdlIHdpbGwgdXNlIHRoZSByZXNvdXJjZXMgb2YgdGhlIG1hc3RlciBjYXJkLiAqLworCWlmICghY2FyZC0+d2FuZGV2LnBpZ2d5YmFjaykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJyID0KKwkJCXJlcXVlc3RfcmVnaW9uKGNvbmYtPmlvcG9ydCwgU0RMQV9NQVhJT1JBTkdFLCAic2RsYW1haW4iKTsKKwkJcmVsZWFzZV9yZWdpb24oY29uZi0+aW9wb3J0LCBTRExBX01BWElPUkFOR0UpOworCisJCWlmICghcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEkvTyByZWdpb24gMHglWCAtIDB4JVggaXMgaW4gdXNlIVxuIiwKKwkJCQljYXJkLT53YW5kZXYubmFtZSwgY29uZi0+aW9wb3J0LAorCQkJCWNvbmYtPmlvcG9ydCArIFNETEFfTUFYSU9SQU5HRSAtIDEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKiBjb25maWd1cmVfczUxNF9jYXJkCisgKiAKKyAqIEZvciBhIFM1MTQgYWRhcHRlciwgY2hlY2sgZm9yIGEgcG9zc2libGUgY29uZmlndXJhdGlvbiBlcnJvciBpbiB0aGF0CisgKiB3ZSBhcmUgbG9hZGluZyBhbiBhZGFwdGVyIGluIHRoZSBzYW1lIHNsb3QgYXMgYSBwcmV2aW91c2x5IGxvYWRlZCBTNTE0CisgKiBjYXJkLgorICovIAorCisKK3N0YXRpYyBpbnQgY2hlY2tfczUxNF9jb25mbGljdHMoc2RsYV90KiBjYXJkLHdhbmRldl9jb25mX3QqIGNvbmYsIGludCAqaXJxKQoreworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCWludCBpOworCQorCWlmICh0ZXN0X2JpdCgwLCZjYXJkLT5jb25maWd1cmVkKSkKKwkJcmV0dXJuIDA7CisKKwkKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBsb2FkZWQgY2FyZCB3aXRoIHRoZSBzYW1lIElPIHBvcnQgYW5kIElSUSAKKwkgKiBJZiBmb3VuZCwgY29weSBpdHMgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBhbmQgdXNlIGl0cworCSAqIHJlc291cmNlcyAoaS5lLiBwaWdneWJhY2tpbmcpCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbmNhcmRzOyBpICsrKSB7CisJCisJCXNkbGFfdCogbnh0X2NhcmQgPSAmY2FyZF9hcnJheVtpXTsKKwkJaWYobnh0X2NhcmQgPT0gY2FyZCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYoKG54dF9jYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgJiYKKwkJICAgKG54dF9jYXJkLT5ody5TNTE0X3Nsb3Rfbm8gPT0gY29uZi0+UENJX3Nsb3Rfbm8pICYmCisJCSAgIChueHRfY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF0gPT0gY29uZi0+UzUxNF9DUFVfbm9bMF0pJiYKKwkJICAgKG54dF9jYXJkLT5uZXh0ID09IE5VTEwpKXsKKworCisJCQlpZiAoKGNvbmYtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfQ0hETEMgfHwgCisJCQkgICAgIGNvbmYtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfTVBQUCkgJiYKKwkJCSAgICAobnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBueHRfY2FyZC0+d2FuZGV2LmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfTVBQUCkpeyAKKwkJCQkKKwkJCQkqaXJxID0gbnh0X2NhcmQtPmh3LmlycTsKKwkJCQltZW1jcHkoJmNhcmQtPmh3LCAmbnh0X2NhcmQtPmh3LCBzaXplb2Yoc2RsYWh3X3QpKTsKKwkKKwkJCQkvKiBUaGUgbWFzdGVyIGNvdWxkIGFscmVhZHkgYmUgcnVubmluZywgd2UgbXVzdAorCQkJCSAqIHNldCB0aGlzIGFzIGEgY3JpdGljYWwgYXJlYSAqLworCQkJCWxvY2tfYWRhcHRlcl9pcnEoJm54dF9jYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwkJCQlueHRfY2FyZC0+bmV4dCA9IGNhcmQ7CisJCQkJY2FyZC0+bmV4dCA9IG54dF9jYXJkOworCisJCQkJY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayA9IFdBTk9QVF9ZRVM7CisKKwkJCQkvKiBXZSBtdXN0IGluaXRpYWxpc2UgdGhlIHBpZ2dpYmFjayBzcGluIGxvY2sgaGVyZQorCQkJCSAqIHNpbmNlIGlzciB3aWxsIHRyeSB0byBsb2NrIGNhcmQtPm5leHQgaWYgaXQKKwkJCQkgKiBleGlzdHMgKi8KKwkJCQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+d2FuZGV2LmxvY2spOworCisJCQkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZueHRfY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisKKwkJCX1lbHNleworCQkJCS8qIFRyeWluZyB0byBydW4gcGlnZ2liYWNraW5nIHdpdGggYSB3cm9uZyBwcm90b2NvbCAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogUmVzb3VyY2UgYnVzeTogQ1BVICVjIFBDSVNMT1QgJWlcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBUaGlzIHByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydFxuIgorCQkJCQkJICIlczogICAgICAgIG11bHRpLXBvcnQgb3BlcmF0aW9uIVxuIiwKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLAorCQkJCQkJIGNvbmYtPlM1MTRfQ1BVX25vWzBdLGNvbmYtPlBDSV9zbG90X25vLAorCQkJCQkJIGNhcmQtPmRldm5hbWUsY2FyZC0+ZGV2bmFtZSk7CisJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2h1dCBkb3duIFdBTiBsaW5rIGRyaXZlci4gCisgKiBvIHNodXQgZG93biBhZGFwdGVyIGhhcmR3YXJlCisgKiBvIHJlbGVhc2Ugc3lzdGVtIHJlc291cmNlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gZGV2aWNlIGlzIGJlaW5nIHVucmVnaXN0ZXJlZCBvcgorICogd2hlbiBpdCBoYW5kbGVzIFJPVVRFUl9ET1dOIElPQ1RMLgorICovCitzdGF0aWMgaW50IHNodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpCit7CisJc2RsYV90ICpjYXJkOworCWludCBlcnI9MDsKKwkKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkJCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCl7CisJCXJldHVybiAwOworCX0KKworCWNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisKKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWlmIChjYXJkLT50dHlfb3Blbil7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogU2h1dGRvd24gRmFpbGVkOiBUVFkgaXMgc3RpbGwgb3BlblxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwkKKwl3YW5kZXYtPnN0YXRlID0gV0FOX1VOQ09ORklHVVJFRDsKKworCXNldF9iaXQoUEVSSV9DUklULCh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCk7CisJCisJLyogSW4gY2FzZSBvZiBwaWdnaWJhY2tpbmcsIG1ha2Ugc3VyZSB0aGF0IAorICAgICAgICAgKiB3ZSBuZXZlciB0cnkgdG8gc2h1dGRvd24gYm90aCBkZXZpY2VzIGF0IHRoZSBzYW1lCisgICAgICAgICAqIHRpbWUsIGJlY2F1c2UgdGhleSBkZXBlbmQgb24gb25lIGFub3RoZXIgKi8KKwkKKwlpZiAoY2FyZC0+ZGlzYWJsZV9jb21tKXsKKwkJY2FyZC0+ZGlzYWJsZV9jb21tKGNhcmQpOworCX0KKworCS8qIFJlbGVhc2UgUmVzb3VyY2VzICovCisJcmVsZWFzZV9odyhjYXJkKTsKKworICAgICAgICAvKiBvbmx5IGZyZWUgdGhlIGFsbG9jYXRlZCBJL08gcmFuZ2UgaWYgbm90IGFuIFM1MTQgYWRhcHRlciAqLworCWlmICh3YW5kZXYtPmh3X29wdFswXSAhPSBTRExBX1M1MTQgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpeworICAgICAgICAgICAgICAJcmVsZWFzZV9yZWdpb24oY2FyZC0+aHcucG9ydCwgY2FyZC0+aHcuaW9fcmFuZ2UpOworCX0KKworCWlmICghY2FyZC0+Y29uZmlndXJlZCl7CisJCW1lbXNldCgmY2FyZC0+aHcsIDAsIHNpemVvZihzZGxhaHdfdCkpOworCSAgICAgIAlpZiAoY2FyZC0+bmV4dCl7CisJCQltZW1zZXQoJmNhcmQtPm5leHQtPmh3LCAwLCBzaXplb2Yoc2RsYWh3X3QpKTsKKwkJfQorCX0KKwkKKworCWNsZWFyX2JpdChQRVJJX0NSSVQsKHZvaWQqKSZ3YW5kZXYtPmNyaXRpY2FsKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2h3IChzZGxhX3QgKmNhcmQpCit7CisJc2RsYV90ICpueHRfY2FyZDsKKworCQorCS8qIENoZWNrIGlmIG5leHQgZGV2aWNlIGV4aXN0cyAqLworCWlmIChjYXJkLT5uZXh0KXsKKwkJbnh0X2NhcmQgPSBjYXJkLT5uZXh0OworCQkvKiBJZiBuZXh0IGRldmljZSBpcyBkb3duIHRoZW4gcmVsZWFzZSByZXNvdXJjZXMgKi8KKwkJaWYgKG54dF9jYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCl7CisJCQlpZiAoY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayl7CisJCQkJLyogSWYgdGhpcyBkZXZpY2UgaXMgcGlnZ3liYWNrIHRoZW4gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluZm9ybWF0aW9uIG9mIHRoZSBtYXN0ZXIgZGV2aWNlIAorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQaWdneWJhY2sgc2h1dHRpbmcgZG93blxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCQlzZGxhX2Rvd24oJmNhcmQtPm5leHQtPmh3KTsKKyAgICAgICAJCQkJZnJlZV9pcnEoY2FyZC0+d2FuZGV2LmlycSwgY2FyZC0+bmV4dCk7CisJCQkJY2FyZC0+Y29uZmlndXJlZCA9IDA7CisJCQkJY2FyZC0+bmV4dC0+Y29uZmlndXJlZCA9IDA7CisJCQkJY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayA9IDA7CisJCQl9ZWxzZXsKKwkJCQkvKiBNYXN0ZXIgZGV2aWNlIHNodXR0aW5nIGRvd24gKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWFzdGVyIHNodXR0aW5nIGRvd25cbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJc2RsYV9kb3duKCZjYXJkLT5odyk7CisJCQkJZnJlZV9pcnEoY2FyZC0+d2FuZGV2LmlycSwgY2FyZCk7CisJCQkJY2FyZC0+Y29uZmlndXJlZCA9IDA7CisJCQkJY2FyZC0+bmV4dC0+Y29uZmlndXJlZCA9IDA7CisJCQl9CisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERldmljZSBzdGlsbCBydW5uaW5nICVpXG4iLAorCQkJCW54dF9jYXJkLT5kZXZuYW1lLG54dF9jYXJkLT53YW5kZXYuc3RhdGUpOworCisJCQljYXJkLT5jb25maWd1cmVkID0gMTsKKwkJfQorCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogTWFzdGVyIHNodXR0aW5nIGRvd25cbiIsY2FyZC0+ZGV2bmFtZSk7CisJCXNkbGFfZG93bigmY2FyZC0+aHcpOworICAgICAgIAkJZnJlZV9pcnEoY2FyZC0+d2FuZGV2LmlycSwgY2FyZCk7CisJCWNhcmQtPmNvbmZpZ3VyZWQgPSAwOworCX0KKwlyZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEcml2ZXIgSS9PIGNvbnRyb2wuIAorICogbyB2ZXJpZnkgYXJndW1lbnRzCisgKiBvIHBlcmZvcm0gcmVxdWVzdGVkIGFjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcm91dGVyIGhhbmRsZXMgb25lIG9mIHRoZSByZXNlcnZlZCB1c2VyCisgKiBJT0NUTHMuICBOb3RlIHRoYXQgJ2FyZycgc3RpbCBwb2ludHMgdG8gdXNlciBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW50IGlvY3RsKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc2RsYV90KiBjYXJkOworCWludCBlcnI7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlkaXNhYmxlX2lycShjYXJkLT5ody5pcnEpOworCX0KKworCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCkpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXQU5QSVBFX0RVTVA6CisJCWVyciA9IGlvY3RsX2R1bXAod2FuZGV2LT5wcml2YXRlLCAodm9pZCopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdBTlBJUEVfRVhFQzoKKwkJZXJyID0gaW9jdGxfZXhlYyh3YW5kZXYtPnByaXZhdGUsICh2b2lkKilhcmcsIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorIAorCXJldHVybiBlcnI7Cit9CisKKy8qKioqKiogRHJpdmVyIElPQ1RMIEhhbmRsZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIER1bXAgYWRhcHRlciBtZW1vcnkgdG8gdXNlciBidWZmZXIuCisgKiBvIHZlcmlmeSByZXF1ZXN0IHN0cnVjdHVyZQorICogbyBjb3B5IHJlcXVlc3Qgc3RydWN0dXJlIHRvIGtlcm5lbCBkYXRhIHNwYWNlCisgKiBvIHZlcmlmeSBsZW5ndGgvb2Zmc2V0CisgKiBvIHZlcmlmeSB1c2VyIGJ1ZmZlcgorICogbyBjb3B5IGFkYXB0ZXIgbWVtb3J5IGltYWdlIHRvIHVzZXIgYnVmZmVyCisgKgorICogTm90ZTogd2hlbiBkdW1waW5nIG1lbW9yeSwgdGhpcyByb3V0aW5lIHN3aXRjaGVzIGN1cmVudCBkdWFsLXBvcnQgbWVtb3J5CisgKgkgdmVjdG9yLCBzbyBjYXJlIG11c3QgYmUgdGFrZW4gdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgaW9jdGxfZHVtcCAoc2RsYV90KiBjYXJkLCBzZGxhX2R1bXBfdCogdV9kdW1wKQoreworCXNkbGFfZHVtcF90IGR1bXA7CisJdW5zaWduZWQgd2luc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9sZHZlYzsJLyogRFBNIHdpbmRvdyB2ZWN0b3IgKi8KKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmZHVtcCwgKHZvaWQqKXVfZHVtcCwgc2l6ZW9mKHNkbGFfZHVtcF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCQkKKwlpZiAoKGR1bXAubWFnaWMgIT0gV0FOUElQRV9NQUdJQykgfHwKKwkgICAgKGR1bXAub2Zmc2V0ICsgZHVtcC5sZW5ndGggPiBjYXJkLT5ody5tZW1vcnkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwl3aW5zaXplID0gY2FyZC0+aHcuZHBtc2l6ZTsKKworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KSB7CisKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssICZzbXBfZmxhZ3MpOworCQkKKyAgICAgICAgICAgICAgICBvbGR2ZWMgPSBjYXJkLT5ody52ZWN0b3I7CisgICAgICAgICAgICAgICAgd2hpbGUgKGR1bXAubGVuZ3RoKSB7CisJCQkvKiBjdXJyZW50IG9mZnNldCAqLwkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvcyA9IGR1bXAub2Zmc2V0ICUgd2luc2l6ZTsKKwkJCS8qIGN1cnJlbnQgdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZlYyA9IGR1bXAub2Zmc2V0IC0gcG9zOworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuID0gKGR1bXAubGVuZ3RoID4gKHdpbnNpemUgLSBwb3MpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAJKHdpbnNpemUgLSBwb3MpIDogZHVtcC5sZW5ndGg7CisJCQkvKiByZWxvY2F0ZSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZGxhX21hcG1lbSgmY2FyZC0+aHcsIHZlYykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRUlPOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyKCh2b2lkICopZHVtcC5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OCAqKWNhcmQtPmh3LmRwbWJhc2UgKyBwb3MsIGxlbikpeyAKKwkJCQkKKwkJCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcC5sZW5ndGggICAgIC09IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAub2Zmc2V0ICAgICArPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wLnB0ciAgICAgICAgID0gKGNoYXIqKWR1bXAucHRyICsgbGVuOworICAgICAgICAgICAgICAgIH0KKwkJCisgICAgICAgICAgICAgICAgc2RsYV9tYXBtZW0oJmNhcmQtPmh3LCBvbGR2ZWMpOy8qIHJlc3RvcmUgRFBNIHdpbmRvdyBwb3NpdGlvbiAqLworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKyAgICAgICAgCisJfWVsc2UgeworCisgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoKHZvaWQgKilkdW1wLnB0ciwKKwkJCSAgICAgICAodTggKiljYXJkLT5ody5kcG1iYXNlICsgZHVtcC5vZmZzZXQsIGR1bXAubGVuZ3RoKSl7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXhlY3V0ZSBhZGFwdGVyIGZpcm13YXJlIGNvbW1hbmQuCisgKiBvIHZlcmlmeSByZXF1ZXN0IHN0cnVjdHVyZQorICogbyBjb3B5IHJlcXVlc3Qgc3RydWN0dXJlIHRvIGtlcm5lbCBkYXRhIHNwYWNlCisgKiBvIGNhbGwgcHJvdG9jb2wtc3BlY2lmaWMgJ2V4ZWMnIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQgaW9jdGxfZXhlYyAoc2RsYV90KiBjYXJkLCBzZGxhX2V4ZWNfdCogdV9leGVjLCBpbnQgY21kKQoreworCXNkbGFfZXhlY190IGV4ZWM7CisJaW50IGVycj0wOworCisJaWYgKGNhcmQtPmV4ZWMgPT0gTlVMTCAmJiBjbWQgPT0gV0FOUElQRV9FWEVDKXsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYoY29weV9mcm9tX3VzZXIoKHZvaWQqKSZleGVjLCAodm9pZCopdV9leGVjLCBzaXplb2Yoc2RsYV9leGVjX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKGV4ZWMubWFnaWMgIT0gV0FOUElQRV9NQUdJQykgfHwgKGV4ZWMuY21kID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgV0FOUElQRV9FWEVDOgkKKwkJCWVyciA9IGNhcmQtPmV4ZWMoY2FyZCwgZXhlYy5jbWQsIGV4ZWMuZGF0YSk7CisJCQlicmVhazsKKwl9CQorCXJldHVybiBlcnI7Cit9CisKKy8qKioqKioqIE1pc2NlbGxhbmVvdXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNETEEgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4KKyAqIG8gYWNrbm93bGVkZ2UgU0RMQSBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKiBvIGNhbGwgcHJvdG9jb2wtc3BlY2lmaWMgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgaWYgYW55LgorICovCitTVEFUSUMgaXJxcmV0dXJuX3Qgc2RsYV9pc3IgKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjZGVmaW5lCWNhcmQJKChzZGxhX3QqKWRldl9pZCkKKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CS8qIGhhbmRsZSBpbnRlcnJydXB0IG9uIFM1MTQgKi8KKyAgICAgICAgICAgICAgICB1MzIgaW50X3N0YXR1czsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIENQVV9ubyA9IGNhcmQtPmh3LlM1MTRfY3B1X25vWzBdOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2FyZF9mb3VuZF9mb3JfSVJROworCQl1OCBJUlFfY291bnQgPSAwOworCisJCWZvcig7OykgeworCisJCQlyZWFkX1M1MTRfaW50X3N0YXQoJmNhcmQtPmh3LCAmaW50X3N0YXR1cyk7CisKKwkJCS8qIGNoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgaXMgZm9yIHRoaXMgZGV2aWNlICovCisgCQkJaWYoISgodW5zaWduZWQgY2hhcilpbnRfc3RhdHVzICYKKwkJCQkoSVJRX0NQVV9BIHwgSVJRX0NQVV9CKSkpCisgICAgICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworCisJCQkvKiBpZiB0aGUgSVJRIGlzIGZvciBib3RoIENQVXMgb24gdGhlIHNhbWUgYWRhcHRlciwgKi8KKwkJCS8qIHRoZW4gYWx0ZXIgdGhlIGludGVycnVwdCBzdGF0dXMgc28gYXMgdG8gaGFuZGxlICovCisJCQkvKiBvbmUgQ1BVIGF0IGEgdGltZSAqLworCQkJaWYoKCh1bnNpZ25lZCBjaGFyKWludF9zdGF0dXMgJiAoSVJRX0NQVV9BIHwgSVJRX0NQVV9CKSkKKwkJCQk9PSAoSVJRX0NQVV9BIHwgSVJRX0NQVV9CKSkgeworCQkJCWludF9zdGF0dXMgJj0gKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/CisJCQkJCX5JUlFfQ1BVX0IgOiB+SVJRX0NQVV9BOworCQkJfQorIAorCQkJY2FyZF9mb3VuZF9mb3JfSVJRID0gMDsKKworCSAgICAgICAgICAgICAJLyogY2hlY2sgdG8gc2VlIHRoYXQgdGhlIENQVSBudW1iZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCQkvKiBjb3JyZXNwb25kcyB0byB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWFkICovCisgICAgICAgICAgICAgICAgCXN3aXRjaCAoQ1BVX25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSBTNTE0X0NQVV9BOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYoKHVuc2lnbmVkIGNoYXIpaW50X3N0YXR1cyAmCisJCQkJCQlJUlFfQ1BVX0EpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZF9mb3VuZF9mb3JfSVJRID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFM1MTRfQ1BVX0I6CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpZigodW5zaWduZWQgY2hhcilpbnRfc3RhdHVzICYKKwkJCQkJCUlSUV9DUFVfQikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkX2ZvdW5kX2Zvcl9JUlEgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAJfQorCisJCQkvKiBleGl0IGlmIHRoZSBpbnRlcnJ1cHQgaXMgZm9yIGFub3RoZXIgQ1BVIG9uIHRoZSAqLworCQkJLyogc2FtZSBJUlEgKi8KKwkJCWlmKCFjYXJkX2ZvdW5kX2Zvcl9JUlEpCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisgICAgICAgCSAJCWlmICghY2FyZCB8fCAKKwkJCSAgIChjYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCAmJiAhY2FyZC0+Y29uZmlndXJlZCkpeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCQkiUmVjZWl2ZWQgSVJRICVkIGZvciBDUFUgIyVjXG4iLAorCQkJCQkJaXJxLCBDUFVfbm8pOworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCQkiSVJRIGZvciB1bmNvbmZpZ3VyZWQgYWRhcHRlclxuIik7CisJCQkJCVM1MTRfaW50YWNrKCZjYXJkLT5odywgaW50X3N0YXR1cyk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAJCQl9CisKKwkgICAgICAgIAlpZiAoY2FyZC0+aW5faXNyKSB7CisgICAgICAgIAkgICAgICAgCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogaW50ZXJydXB0IHJlLWVudHJhbmN5IG9uIElSUSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmlycSk7CisJCQkJUzUxNF9pbnRhY2soJmNhcmQtPmh3LCBpbnRfc3RhdHVzKTsKKyAJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgIAkJCX0KKworCQkJc3Bpbl9sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisJCQlpZiAoY2FyZC0+bmV4dCl7CisJCQkJc3Bpbl9sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJCQl9CisJCQkJCisJICAgICAgICAgICAgICAgCVM1MTRfaW50YWNrKCZjYXJkLT5odywgaW50X3N0YXR1cyk7CisgICAgICAgCQkJaWYgKGNhcmQtPmlzcikKKwkJCQljYXJkLT5pc3IoY2FyZCk7CisKKwkJCWlmIChjYXJkLT5uZXh0KXsKKwkJCQlzcGluX3VubG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmNhcmQtPndhbmRldi5sb2NrKTsKKworCQkJLyogaGFuZGxlIGEgbWF4aW11bSBvZiB0d28gaW50ZXJydXB0cyAob25lIGZvciBlYWNoICovCisJCQkvKiBDUFUgb24gdGhlIGFkYXB0ZXIpIGJlZm9yZSByZXR1cm5pbmcgKi8gIAorCQkJaWYoKCsrIElSUV9jb3VudCkgPT0gMikKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisKKwllbHNlIHsJCQkvKiBoYW5kbGUgaW50ZXJydXB0IG9uIFM1MDggYWRhcHRlciAqLworCisJCWlmICghY2FyZCB8fCAoKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKSAmJiAhY2FyZC0+Y29uZmlndXJlZCkpCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkJaWYgKGNhcmQtPmluX2lzcikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogaW50ZXJydXB0IHJlLWVudHJhbmN5IG9uIElSUSAlZCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmlycSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlzcGluX2xvY2soJmNhcmQtPndhbmRldi5sb2NrKTsKKwkJaWYgKGNhcmQtPm5leHQpeworCQkJc3Bpbl9sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJCX0KKwkKKwkJc2RsYV9pbnRhY2soJmNhcmQtPmh3KTsKKwkJaWYgKGNhcmQtPmlzcikKKwkJCWNhcmQtPmlzcihjYXJkKTsKKwkJCisJCWlmIChjYXJkLT5uZXh0KXsKKwkJCXNwaW5fdW5sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNhcmQtPndhbmRldi5sb2NrKTsKKworCX0KKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworI3VuZGVmCWNhcmQKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBwcm90b2NvbC1zcGVjaWZpYyBtb2R1bGVzIHdoZW4gbmV0d29yaworICogaW50ZXJmYWNlIGlzIGJlaW5nIG9wZW4uICBUaGUgb25seSByZWFzb24gd2UgbmVlZCB0aGlzLCBpcyBiZWNhdXNlIHdlCisgKiBoYXZlIHRvIGNhbGwgTU9EX0lOQ19VU0VfQ09VTlQsIGJ1dCBjYW5ub3QgaW5jbHVkZSAnbW9kdWxlLmgnIHdoZXJlIGl0J3MKKyAqIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgaW50byB0aGUgc2FtZSBrZXJuZWwgbW9kdWxlLgorICovCit2b2lkIHdhbnBpcGVfb3BlbiAoc2RsYV90KiBjYXJkKQoreworCSsrY2FyZC0+b3Blbl9jbnQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgbW9kdWxlcyB3aGVuIG5ldHdvcmsKKyAqIGludGVyZmFjZSBpcyBiZWluZyBjbG9zZWQuICBUaGUgb25seSByZWFzb24gd2UgbmVlZCB0aGlzLCBpcyBiZWNhdXNlIHdlCisgKiBoYXZlIHRvIGNhbGwgTU9EX0RFQ19VU0VfQ09VTlQsIGJ1dCBjYW5ub3QgaW5jbHVkZSAnbW9kdWxlLmgnIHdoZXJlIGl0J3MKKyAqIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgaW50byB0aGUgc2FtZSBrZXJuZWwgbW9kdWxlLgorICovCit2b2lkIHdhbnBpcGVfY2xvc2UgKHNkbGFfdCogY2FyZCkKK3sKKwktLWNhcmQtPm9wZW5fY250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBXQU4gZGV2aWNlIHN0YXRlLgorICovCit2b2lkIHdhbnBpcGVfc2V0X3N0YXRlIChzZGxhX3QqIGNhcmQsIGludCBzdGF0ZSkKK3sKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IHN0YXRlKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBsaW5rIGNvbm5lY3RlZCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBsaW5rIGNvbm5lY3RpbmcuLi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IGxpbmsgZGlzY29ubmVjdGVkIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWNhcmQtPndhbmRldi5zdGF0ZSA9IHN0YXRlOworCX0KKwljYXJkLT5zdGF0ZV90aWNrID0gamlmZmllczsKK30KKworc2RsYV90ICogd2FucGlwZV9maW5kX2NhcmQgKGNoYXIgKm5hbWUpCit7CisJaW50IGNudDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IG5jYXJkczsgKysgY250KSB7CisJCXNkbGFfdCogY2FyZCA9ICZjYXJkX2FycmF5W2NudF07CisJCWlmICghc3RyY21wKGNhcmQtPmRldm5hbWUsbmFtZSkpCisJCQlyZXR1cm4gY2FyZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3NkbGFfdCAqIHdhbnBpcGVfZmluZF9jYXJkX251bSAoaW50IG51bSkKK3sKKwlpZiAobnVtIDwgMSB8fCBudW0gPiBuY2FyZHMpCisJCXJldHVybiBOVUxMOwkKKwludW0tLTsKKwlyZXR1cm4gJmNhcmRfYXJyYXlbbnVtXTsKK30KKworLyoKKyAqIEB3b3JrX3BvaW50ZXI6CXdvcmtfc3RydWN0IHRvIGJlIGRvbmU7CisgKiAJCQlzaG91bGQgYWxyZWFkeSBoYXZlIFBSRVBBUkVfV09SSygpIG9yCisgKiAJCQkgIElOSVRfV09SSygpIGRvbmUgb24gaXQgYnkgY2FsbGVyOworICovCit2b2lkIHdhbnBpcGVfcXVldWVfd29yayAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3BvaW50ZXIpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMSwgKHZvaWQqKSZ3YW5waXBlX2JoX2NyaXRpY2FsKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1JJVElDQUwgSU4gUVVFVUlORyBXT1JLXG4iKTsKKworCXF1ZXVlX3dvcmsod2FucGlwZV93cSwgd29ya19wb2ludGVyKTsKKwljbGVhcl9iaXQoMSwodm9pZCopJndhbnBpcGVfYmhfY3JpdGljYWwpOworfQorCit2b2lkIHdha2V1cF9za19iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uX2NyaXRpY2FsKSkKKwkJcmV0dXJuOworCQorCWlmIChjaGFuLT5zayAmJiBjaGFuLT50eF90aW1lcil7CisJCWNoYW4tPnR4X3RpbWVyLT5leHBpcmVzPWppZmZpZXMrMTsKKwkJYWRkX3RpbWVyKGNoYW4tPnR4X3RpbWVyKTsKKwl9Cit9CisKK2ludCBjaGFuZ2VfZGV2X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBpZnJlcSBpZl9pbmZvOworCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisJaWZfaW5mby5pZnJfZmxhZ3MgPSBmbGFnczsJCisKKwlzZXRfZnMoZ2V0X2RzKCkpOyAgICAgLyogZ2V0IHVzZXIgc3BhY2UgYmxvY2sgKi8gCisJZXJyID0gZGV2aW5ldF9pb2N0bChTSU9DU0lGRkxBR1MsICZpZl9pbmZvKTsKKwlzZXRfZnMoZnMpOworCisJcmV0dXJuIGVycjsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfaXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb3B0aW9uKQoreworCQorCXN0cnVjdCBpbl9pZmFkZHIgKmlmYWRkcjsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpKSA9PSBOVUxMKXsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpZmFkZHIgPSBpbl9kZXYtPmlmYV9saXN0KT09IE5VTEwgKXsKKwkJcmV0dXJuIDA7CisJfQorCQorCXN3aXRjaCAob3B0aW9uKXsKKworCWNhc2UgV0FOX0xPQ0FMX0lQOgorCQlyZXR1cm4gaWZhZGRyLT5pZmFfbG9jYWw7CisJCWJyZWFrOworCQorCWNhc2UgV0FOX1BPSU5UT1BPSU5UX0lQOgorCQlyZXR1cm4gaWZhZGRyLT5pZmFfYWRkcmVzczsKKwkJYnJlYWs7CQorCisJY2FzZSBXQU5fTkVUTUFTS19JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX21hc2s7CisJCWJyZWFrOworCisJY2FzZSBXQU5fQlJPQURDQVNUX0lQOgorCQlyZXR1cm4gaWZhZGRyLT5pZmFfYnJvYWRjYXN0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30JCisKK3ZvaWQgYWRkX2dhdGV3YXkoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW1tX3NlZ21lbnRfdCBvbGRmczsKKwlzdHJ1Y3QgcnRlbnRyeSByb3V0ZTsKKwlpbnQgcmVzOworCisJbWVtc2V0KChjaGFyKikmcm91dGUsMCxzaXplb2Yoc3RydWN0IHJ0ZW50cnkpKTsKKworCSgoc3RydWN0IHNvY2thZGRyX2luICopCisJCSYocm91dGUucnRfZHN0KSktPnNpbl9hZGRyLnNfYWRkciA9IDA7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKKwkJJihyb3V0ZS5ydF9kc3QpKS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQorCQkmKHJvdXRlLnJ0X2dlbm1hc2spKS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAKKwkJJihyb3V0ZS5ydF9nZW5tYXNrKSkgLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworCisJcm91dGUucnRfZmxhZ3MgPSAwOyAgCisJcm91dGUucnRfZGV2ID0gZGV2LT5uYW1lOworCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCXJlcyA9IGlwX3J0X2lvY3RsKFNJT0NBRERSVCwmcm91dGUpOworCXNldF9mcyhvbGRmcyk7CisKKwlpZiAocmVzID09IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogR2F0ZXdheSBhZGRlZCBmb3IgJXNcbiIsCisJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJfQorCisJcmV0dXJuOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jIGIvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MGRkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICoJU2VhbGV2ZWwgU3lzdGVtcyA0MDIxIGRyaXZlci4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OSwgMjAwMSBBbGFuIENveAorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSAiejg1MjMwLmgiCisKKworc3RydWN0IHNsdmxfZGV2aWNlCit7CisJdm9pZCAqaWZfcHRyOwkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCXN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuOworCXN0cnVjdCBwcHBfZGV2aWNlIHBwcGRldjsKKwlpbnQgY2hhbm5lbDsKK307CisKKworc3RydWN0IHNsdmxfYm9hcmQKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKmRldlsyXTsKKwlzdHJ1Y3Qgejg1MzBfZGV2IGJvYXJkOworCWludCBpb2Jhc2U7Cit9OworCisvKgorICoJTmV0d29yayBkcml2ZXIgc3VwcG9ydCByb3V0aW5lcworICovCisKKy8qCisgKglGcmFtZSByZWNlaXZlLiBTaW1wbGUgZm9yIG91ciBjYXJkIGFzIHdlIGRvIHN5bmMgcHBwIGFuZCB0aGVyZQorICoJaXMgbm8gZnVubnkgZ2FyYmFnZSBpbnZvbHZlZAorICovCisgCitzdGF0aWMgdm9pZCBzZWFsZXZlbF9pbnB1dChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBEcm9wIHRoZSBDUkMgLSBpdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgYW5kIG5lZ290aWF0ZSBpdCA7KSAqLworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4tMik7CisJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9XQU5fUFBQKTsKKwlza2ItPm1hYy5yYXc9c2tiLT5kYXRhOworCXNrYi0+ZGV2PWMtPm5ldGRldmljZTsKKwkvKgorCSAqCVNlbmQgaXQgdG8gdGhlIFBQUCBsYXllci4gV2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIHByb2Nlc3MKKwkgKglpdCByaWdodCBub3cuCisJICovCisJbmV0aWZfcngoc2tiKTsKKwljLT5uZXRkZXZpY2UtPmxhc3RfcnggPSBqaWZmaWVzOworfQorIAorLyoKKyAqCVdlJ3ZlIGJlZW4gcGxhY2VkIGluIHRoZSBVUCBzdGF0ZQorICovIAorIAorc3RhdGljIGludCBzZWFsZXZlbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCWludCBlcnIgPSAtMTsKKwlpbnQgdW5pdCA9IHNsdmwtPmNoYW5uZWw7CisJCisJLyoKKwkgKglMaW5rIGxheWVyIHVwLiAKKwkgKi8KKworCXN3aXRjaCh1bml0KQorCXsKKwkJY2FzZSAwOgorCQkJZXJyPXo4NTMwX3N5bmNfZG1hX29wZW4oZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZXJyPXo4NTMwX3N5bmNfb3BlbihkLCBzbHZsLT5jaGFuKTsKKwkJCWJyZWFrOworCX0KKwkKKwlpZihlcnIpCisJCXJldHVybiBlcnI7CisJLyoKKwkgKglCZWdpbiBQUFAKKwkgKi8KKwllcnI9c3BwcF9vcGVuKGQpOworCWlmKGVycikKKwl7CisJCXN3aXRjaCh1bml0KQorCQl7CisJCQljYXNlIDA6CisJCQkJejg1MzBfc3luY19kbWFfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJejg1MzBfc3luY19jbG9zZShkLCBzbHZsLT5jaGFuKTsKKwkJCQlicmVhazsKKwkJfQkJCQkKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJc2x2bC0+Y2hhbi0+cnhfZnVuY3Rpb249c2VhbGV2ZWxfaW5wdXQ7CisJCisJLyoKKwkgKglHbyBnbyBnbworCSAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlYWxldmVsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCWludCB1bml0ID0gc2x2bC0+Y2hhbm5lbDsKKwkKKwkvKgorCSAqCURpc2NhcmQgbmV3IGZyYW1lcworCSAqLworCQorCXNsdmwtPmNoYW4tPnJ4X2Z1bmN0aW9uPXo4NTMwX251bGxfcng7CisJCQorCS8qCisJICoJUFBQIG9mZgorCSAqLworCXNwcHBfY2xvc2UoZCk7CisJLyoKKwkgKglMaW5rIGxheWVyIGRvd24KKwkgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZCk7CisJCQorCXN3aXRjaCh1bml0KQorCXsKKwkJY2FzZSAwOgorCQkJejg1MzBfc3luY19kbWFfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJejg1MzBfc3luY19jbG9zZShkLCBzbHZsLT5jaGFuKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWFsZXZlbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZCwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJLyogc3RydWN0IHNsdmxfZGV2aWNlICpzbHZsPWQtPnByaXY7CisJICAgejg1MzBfaW9jdGwoZCwmc2x2bC0+c3luYy5jaGFuQSxpZnIsY21kKSAqLworCXJldHVybiBzcHBwX2RvX2lvY3RsKGQsIGlmcixjbWQpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNlYWxldmVsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmw9ZC0+cHJpdjsKKwlpZihzbHZsKQorCQlyZXR1cm4gejg1MzBfZ2V0X3N0YXRzKHNsdmwtPmNoYW4pOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKglQYXNzZWQgUFBQIGZyYW1lcywgZmlyZSB0aGVtIGRvd253aW5kLgorICovCisgCitzdGF0aWMgaW50IHNlYWxldmVsX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpzbHZsPWQtPnByaXY7CisJcmV0dXJuIHo4NTMwX3F1ZXVlX3htaXQoc2x2bC0+Y2hhbiwgc2tiKTsKK30KKworc3RhdGljIGludCBzZWFsZXZlbF9uZWlnaF9zZXR1cChzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCWlmIChuLT5udWRfc3RhdGUgPT0gTlVEX05PTkUpIHsKKwkJbi0+b3BzID0gJmFycF9icm9rZW5fb3BzOworCQluLT5vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfbmVpZ2hfc2V0dXBfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZWlnaF9wYXJtcyAqcCkKK3sKKwlpZiAocC0+dGJsLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlwLT5uZWlnaF9zZXR1cCA9IHNlYWxldmVsX25laWdoX3NldHVwOworCQlwLT51Y2FzdF9wcm9iZXMgPSAwOworCQlwLT5tY2FzdF9wcm9iZXMgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWFsZXZlbF9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnN2ID0gZGV2LT5wcml2OworCXNwcHBfYXR0YWNoKCZzdi0+cHBwZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VhbGV2ZWxfZGV0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3BwcF9kZXRhY2goZGV2KTsKK30KKwkJCitzdGF0aWMgdm9pZCBzbHZsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCWQtPm9wZW4gPSBzZWFsZXZlbF9vcGVuOworCWQtPnN0b3AgPSBzZWFsZXZlbF9jbG9zZTsKKwlkLT5pbml0ID0gc2VhbGV2ZWxfYXR0YWNoOworCWQtPnVuaW5pdCA9IHNlYWxldmVsX2RldGFjaDsKKwlkLT5oYXJkX3N0YXJ0X3htaXQgPSBzZWFsZXZlbF9xdWV1ZV94bWl0OworCWQtPmdldF9zdGF0cyA9IHNlYWxldmVsX2dldF9zdGF0czsKKwlkLT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCWQtPmRvX2lvY3RsID0gc2VhbGV2ZWxfaW9jdGw7CisJZC0+bmVpZ2hfc2V0dXAgPSBzZWFsZXZlbF9uZWlnaF9zZXR1cF9kZXY7CisJZC0+c2V0X21hY19hZGRyZXNzID0gTlVMTDsKKworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbHZsX2RldmljZSAqc2x2bF9hbGxvYyhpbnQgaW9iYXNlLCBpbnQgaXJxKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkOworCXN0cnVjdCBzbHZsX2RldmljZSAqc3Y7CisKKwlkID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgc2x2bF9kZXZpY2UpLCAiaGRsYyVkIiwKKwkJCSBzbHZsX3NldHVwKTsKKworCWlmICghZCkgCisJCXJldHVybiBOVUxMOworCisJc3YgPSBkLT5wcml2OworCXN2LT5pZl9wdHIgPSAmc3YtPnBwcGRldjsKKwlzdi0+cHBwZGV2LmRldiA9IGQ7CisJZC0+YmFzZV9hZGRyID0gaW9iYXNlOworCWQtPmlycSA9IGlycTsKKwkJCisJcmV0dXJuIHN2OworfQorCisKKy8qCisgKglBbGxvY2F0ZSBhbmQgc2V0dXAgU2VhbGV2ZWwgYm9hcmQuCisgKi8KKyAKK3N0YXRpYyBfX2luaXQgc3RydWN0IHNsdmxfYm9hcmQgKnNsdmxfaW5pdChpbnQgaW9iYXNlLCBpbnQgaXJxLCAKKwkJCQkJICAgaW50IHR4ZG1hLCBpbnQgcnhkbWEsIGludCBzbG93KQoreworCXN0cnVjdCB6ODUzMF9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2x2bF9ib2FyZCAqYjsKKwkKKwkvKgorCSAqCUdldCB0aGUgbmVlZGVkIEkvTyBzcGFjZQorCSAqLworCisJaWYoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgOCwgIlNlYWxldmVsIDQwMjEiKSkgCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VhbGV2ZWw6IEkvTyAweCVYIGFscmVhZHkgaW4gdXNlLlxuIiwgaW9iYXNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2x2bF9ib2FyZCksIEdGUF9LRVJORUwpOworCWlmKCFiKQorCQlnb3RvIGZhaWwzOworCisJbWVtc2V0KGIsIDAsIHNpemVvZigqYikpOworCWlmICghKGItPmRldlswXT0gc2x2bF9hbGxvYyhpb2Jhc2UsIGlycSkpKQorCQlnb3RvIGZhaWwyOworCisJYi0+ZGV2WzBdLT5jaGFuID0gJmItPmJvYXJkLmNoYW5BOwkKKwliLT5kZXZbMF0tPmNoYW5uZWwgPSAwOworCQorCWlmICghKGItPmRldlsxXSA9IHNsdmxfYWxsb2MoaW9iYXNlLCBpcnEpKSkKKwkJZ290byBmYWlsMV8wOworCisJYi0+ZGV2WzFdLT5jaGFuID0gJmItPmJvYXJkLmNoYW5COworCWItPmRldlsxXS0+Y2hhbm5lbCA9IDE7CisKKwlkZXYgPSAmYi0+Ym9hcmQ7CisJCisJLyoKKwkgKglTdHVmZiBpbiB0aGUgSS9PIGFkZHJlc3NpbmcKKwkgKi8KKwkgCisJZGV2LT5hY3RpdmUgPSAwOworCisJYi0+aW9iYXNlID0gaW9iYXNlOworCQorCS8qCisJICoJU2VsZWN0IDg1MzAgZGVsYXlzIGZvciB0aGUgb2xkIGJvYXJkCisJICovCisJIAorCWlmKHNsb3cpCisJCWlvYmFzZSB8PSBaODUzMF9QT1JUX1NMRUVQOworCQkKKwlkZXYtPmNoYW5BLmN0cmxpbz1pb2Jhc2UrMTsKKwlkZXYtPmNoYW5BLmRhdGFpbz1pb2Jhc2U7CisJZGV2LT5jaGFuQi5jdHJsaW89aW9iYXNlKzM7CisJZGV2LT5jaGFuQi5kYXRhaW89aW9iYXNlKzI7CisJCisJZGV2LT5jaGFuQS5pcnFzPSZ6ODUzMF9ub3A7CisJZGV2LT5jaGFuQi5pcnFzPSZ6ODUzMF9ub3A7CisJCisJLyoKKwkgKglBc3NlcnQgRFRSIGVuYWJsZSBETUEKKwkgKi8KKwkgCisJb3V0YigzfCgxPDw3KSwgYi0+aW9iYXNlKzQpOwkKKwkKKworCS8qIFdlIHdhbnQgYSBmYXN0IElSUSBmb3IgdGhpcyBkZXZpY2UuIEFjdHVhbGx5IHdlJ2QgbGlrZSBhbiBldmVuIGZhc3RlcgorCSAgIElSUSA7KSAtIFRoaXMgaXMgb25lIGRyaXZlciBSdExpbnV4IGlzIG1hZGUgZm9yICovCisgICAKKwlpZihyZXF1ZXN0X2lycShpcnEsICZ6ODUzMF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgIlNlYUxldmVsIiwgZGV2KTwwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VhbGV2ZWw6IElSUSAlZCBhbHJlYWR5IGluIHVzZS5cbiIsIGlycSk7CisJCWdvdG8gZmFpbDFfMTsKKwl9CisJCisJZGV2LT5pcnE9aXJxOworCWRldi0+Y2hhbkEucHJpdmF0ZT0mYi0+ZGV2WzBdOworCWRldi0+Y2hhbkIucHJpdmF0ZT0mYi0+ZGV2WzFdOworCWRldi0+Y2hhbkEubmV0ZGV2aWNlPWItPmRldlswXS0+cHBwZGV2LmRldjsKKwlkZXYtPmNoYW5CLm5ldGRldmljZT1iLT5kZXZbMV0tPnBwcGRldi5kZXY7CisJZGV2LT5jaGFuQS5kZXY9ZGV2OworCWRldi0+Y2hhbkIuZGV2PWRldjsKKworCWRldi0+Y2hhbkEudHhkbWE9MzsKKwlkZXYtPmNoYW5BLnJ4ZG1hPTE7CisJaWYocmVxdWVzdF9kbWEoZGV2LT5jaGFuQS50eGRtYSwgIlNlYUxldmVsIChUWCkiKSE9MCkKKwkJZ290byBmYWlsOworCQkKKwlpZihyZXF1ZXN0X2RtYShkZXYtPmNoYW5BLnJ4ZG1hLCAiU2VhTGV2ZWwgKFJYKSIpIT0wKQorCQlnb3RvIGRtYWZhaWw7CisJCisJZGlzYWJsZV9pcnEoaXJxKTsKKwkJCisJLyoKKwkgKglCZWdpbiBub3JtYWwgaW5pdGlhbGlzZQorCSAqLworCSAKKwlpZih6ODUzMF9pbml0KGRldikhPTApCisJeworCQlwcmludGsoS0VSTl9FUlIgIlo4NTMwIHNlcmllcyBkZXZpY2Ugbm90IGZvdW5kLlxuIik7CisJCWVuYWJsZV9pcnEoaXJxKTsKKwkJZ290byBkbWFmYWlsMjsKKwl9CisJaWYoZGV2LT50eXBlPT1aODVDMzApCisJeworCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkEsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbSk7CisJCXo4NTMwX2NoYW5uZWxfbG9hZCgmZGV2LT5jaGFuQiwgejg1MzBfaGRsY19raWxvc3RyZWFtKTsKKwl9CisJZWxzZQorCXsKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzApOworCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkIsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbV84NTIzMCk7CisJfQorCisJLyoKKwkgKglOb3cgd2UgY2FuIHRha2UgdGhlIElSUQorCSAqLworCQorCWVuYWJsZV9pcnEoaXJxKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoYi0+ZGV2WzBdLT5wcHBkZXYuZGV2KSkgCisJCWdvdG8gZG1hZmFpbDI7CisJCQorCWlmIChyZWdpc3Rlcl9uZXRkZXYoYi0+ZGV2WzFdLT5wcHBkZXYuZGV2KSkgCisJCWdvdG8gZmFpbF91bml0OworCisJejg1MzBfZGVzY3JpYmUoZGV2LCAiSS9PIiwgaW9iYXNlKTsKKwlkZXYtPmFjdGl2ZT0xOworCXJldHVybiBiOworCitmYWlsX3VuaXQ6CisJdW5yZWdpc3Rlcl9uZXRkZXYoYi0+ZGV2WzBdLT5wcHBkZXYuZGV2KTsKKwkKK2RtYWZhaWwyOgorCWZyZWVfZG1hKGRldi0+Y2hhbkEucnhkbWEpOworZG1hZmFpbDoKKwlmcmVlX2RtYShkZXYtPmNoYW5BLnR4ZG1hKTsKK2ZhaWw6CisJZnJlZV9pcnEoaXJxLCBkZXYpOworZmFpbDFfMToKKwlmcmVlX25ldGRldihiLT5kZXZbMV0tPnBwcGRldi5kZXYpOworZmFpbDFfMDoKKwlmcmVlX25ldGRldihiLT5kZXZbMF0tPnBwcGRldi5kZXYpOworZmFpbDI6CisJa2ZyZWUoYik7CitmYWlsMzoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsOCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbHZsX3NodXRkb3duKHN0cnVjdCBzbHZsX2JvYXJkICpiKQoreworCWludCB1OworCisJejg1MzBfc2h1dGRvd24oJmItPmJvYXJkKTsKKwkKKwlmb3IodT0wOyB1PDI7IHUrKykKKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkID0gYi0+ZGV2W3VdLT5wcHBkZXYuZGV2OworCQl1bnJlZ2lzdGVyX25ldGRldihkKTsKKwkJZnJlZV9uZXRkZXYoZCk7CisJfQorCQorCWZyZWVfaXJxKGItPmJvYXJkLmlycSwgJmItPmJvYXJkKTsKKwlmcmVlX2RtYShiLT5ib2FyZC5jaGFuQS5yeGRtYSk7CisJZnJlZV9kbWEoYi0+Ym9hcmQuY2hhbkEudHhkbWEpOworCS8qIERNQSBvZmYgb24gdGhlIGNhcmQsIGRyb3AgRFRSICovCisJb3V0YigwLCBiLT5pb2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKGItPmlvYmFzZSwgOCk7CisJa2ZyZWUoYik7Cit9CisKKworc3RhdGljIGludCBpbz0weDIzODsKK3N0YXRpYyBpbnQgdHhkbWE9MTsKK3N0YXRpYyBpbnQgcnhkbWE9MzsKK3N0YXRpYyBpbnQgaXJxPTU7CitzdGF0aWMgaW50IHNsb3c9MDsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlRoZSBJL08gYmFzZSBvZiB0aGUgU2VhbGV2ZWwgY2FyZCIpOworbW9kdWxlX3BhcmFtKHR4ZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0eGRtYSwgIlRyYW5zbWl0IERNQSBjaGFubmVsIik7Cittb2R1bGVfcGFyYW0ocnhkbWEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4ZG1hLCAiUmVjZWl2ZSBETUEgY2hhbm5lbCIpOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiVGhlIGludGVycnVwdCBsaW5lIHNldHRpbmcgZm9yIHRoZSBTZWFMZXZlbCBjYXJkIik7Cittb2R1bGVfcGFyYW0oc2xvdywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNsb3csICJTZXQgdGhpcyBmb3IgYW4gb2xkZXIgU2VhbGV2ZWwgY2FyZCBzdWNoIGFzIHRoZSA0MDEyIik7CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1vZHVsYXIgZHJpdmVyIGZvciB0aGUgU2VhTGV2ZWwgNDAyMSIpOworCitzdGF0aWMgc3RydWN0IHNsdmxfYm9hcmQgKnNsdmxfdW5pdDsKKworc3RhdGljIGludCBfX2luaXQgc2x2bF9pbml0X21vZHVsZSh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50ayhLRVJOX0lORk8gIlNlYUxldmVsIFo4NTIzMCBTeW5jaHJvbm91cyBEcml2ZXIgdiAwLjAyLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiKGMpIENvcHlyaWdodCAxOTk4LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkLlxuIik7CisjZW5kaWYKKwlzbHZsX3VuaXQgPSBzbHZsX2luaXQoaW8sIGlycSwgdHhkbWEsIHJ4ZG1hLCBzbG93KTsKKworCXJldHVybiBzbHZsX3VuaXQgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNsdmxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpZihzbHZsX3VuaXQpCisJCXNsdmxfc2h1dGRvd24oc2x2bF91bml0KTsKK30KKworbW9kdWxlX2luaXQoc2x2bF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzbHZsX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjY1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCkBAIC0wLDAgKzEsMTQ4OCBAQAorLyoKKyAqCU5FVDM6CUEgKGZhaXJseSBtaW5pbWFsKSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbm91cyBQUFAgZm9yIExpbnV4CisgKgkJYXMgd2VsbCBhcyBhIENJU0NPIEhETEMgaW1wbGVtZW50YXRpb24uIFNlZSB0aGUgY29weXJpZ2h0IAorICoJCW1lc3NhZ2UgYmVsb3cgZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgbGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOb3RlIGhvd2V2ZXIuIFRoaXMgY29kZSBpcyBhbHNvIHVzZWQgaW4gYSBkaWZmZXJlbnQgZm9ybSBieSBGcmVlQlNELgorICoJVGhlcmVmb3JlIHdoZW4gbWFraW5nIGFueSBub24gT1Mgc3BlY2lmaWMgY2hhbmdlIHBsZWFzZSBjb25zaWRlcgorICoJY29udHJpYnV0aW5nIGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGF1dGhvciB1bmRlciB0aGUgdGVybXMKKyAqCWJlbG93IGluIGFkZGl0aW9uLgorICoJCS0tIEFsYW4KKyAqCisgKglQb3J0IGZvciBMaW51eC0yLjEgYnkgSmFuICJZZW55YSIgS2FzcHJ6YWsgPGthc0BmaS5tdW5pLmN6PgorICovCisKKy8qCisgKiBTeW5jaHJvbm91cyBQUFAvQ2lzY28gbGluayBsZXZlbCBzdWJyb3V0aW5lcy4KKyAqIEtlZXBhbGl2ZSBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiBib3RoIENpc2NvIGFuZCBQUFAgbW9kZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0IENyb255eCBMdGQuCisgKiBBdXRob3I6IFNlcmdlIFZha3VsZW5rbywgPHZha0B6ZWJ1Yi5tc2suc3U+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRoIE5PIFdBUlJBTlRJRVMsIG5vdCBldmVuIHRoZSBpbXBsaWVkCisgKiB3YXJyYW50aWVzIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQXV0aG9ycyBncmFudCBhbnkgb3RoZXIgcGVyc29ucyBvciBvcmdhbmlzYXRpb25zIHBlcm1pc3Npb24gdG8gdXNlCisgKiBvciBtb2RpZnkgdGhpcyBzb2Z0d2FyZSBhcyBsb25nIGFzIHRoaXMgbWVzc2FnZSBpcyBrZXB0IHdpdGggdGhlIHNvZnR3YXJlLAorICogYWxsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMuCisgKgorICogVmVyc2lvbiAxLjksIFdlZCBPY3QgIDQgMTg6NTg6MTUgTVNLIDE5OTUKKyAqCisgKiAkSWQ6IHN5bmNwcHAuYyx2IDEuMTggMjAwMC8wNC8xMSAwNToyNTozMSBhc2ogRXhwICQKKyAqLworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgTUFYQUxJVkVDTlQgICAgIDYgICAgICAgICAgICAgICAvKiBtYXguIGFsaXZlIHBhY2tldHMgKi8KKworI2RlZmluZSBQUFBfQUxMU1RBVElPTlMgMHhmZiAgICAgICAgICAgIC8qIEFsbC1TdGF0aW9ucyBicm9hZGNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBQUFBfVUkgICAgICAgICAgMHgwMyAgICAgICAgICAgIC8qIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFBQX0lQICAgICAgICAgIDB4MDAyMSAgICAgICAgICAvKiBJbnRlcm5ldCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVNPICAgICAgICAgMHgwMDIzICAgICAgICAgIC8qIElTTyBPU0kgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1hOUyAgICAgICAgIDB4MDAyNSAgICAgICAgICAvKiBYZXJveCBOUyBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBYICAgICAgICAgMHgwMDJiICAgICAgICAgIC8qIE5vdmVsbCBJUFggUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xDUCAgICAgICAgIDB4YzAyMSAgICAgICAgICAvKiBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQQ1AgICAgICAgIDB4ODAyMSAgICAgICAgICAvKiBJbnRlcm5ldCBQcm90b2NvbCBDb250cm9sIFByb3RvY29sICovCisKKyNkZWZpbmUgTENQX0NPTkZfUkVRICAgIDEgICAgICAgICAgICAgICAvKiBQUFAgTENQIGNvbmZpZ3VyZSByZXF1ZXN0ICovCisjZGVmaW5lIExDUF9DT05GX0FDSyAgICAyICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgYWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgTENQX0NPTkZfTkFLICAgIDMgICAgICAgICAgICAgICAvKiBQUFAgTENQIGNvbmZpZ3VyZSBuZWdhdGl2ZSBhY2sgKi8KKyNkZWZpbmUgTENQX0NPTkZfUkVKICAgIDQgICAgICAgICAgICAgICAvKiBQUFAgTENQIGNvbmZpZ3VyZSByZWplY3QgKi8KKyNkZWZpbmUgTENQX1RFUk1fUkVRICAgIDUgICAgICAgICAgICAgICAvKiBQUFAgTENQIHRlcm1pbmF0ZSByZXF1ZXN0ICovCisjZGVmaW5lIExDUF9URVJNX0FDSyAgICA2ICAgICAgICAgICAgICAgLyogUFBQIExDUCB0ZXJtaW5hdGUgYWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgTENQX0NPREVfUkVKICAgIDcgICAgICAgICAgICAgICAvKiBQUFAgTENQIGNvZGUgcmVqZWN0ICovCisjZGVmaW5lIExDUF9QUk9UT19SRUogICA4ICAgICAgICAgICAgICAgLyogUFBQIExDUCBwcm90b2NvbCByZWplY3QgKi8KKyNkZWZpbmUgTENQX0VDSE9fUkVRICAgIDkgICAgICAgICAgICAgICAvKiBQUFAgTENQIGVjaG8gcmVxdWVzdCAqLworI2RlZmluZSBMQ1BfRUNIT19SRVBMWSAgMTAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgZWNobyByZXBseSAqLworI2RlZmluZSBMQ1BfRElTQ19SRVEgICAgMTEgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgZGlzY2FyZCByZXF1ZXN0ICovCisKKyNkZWZpbmUgTENQX09QVF9NUlUgICAgICAgICAgICAgMSAgICAgICAvKiBtYXhpbXVtIHJlY2VpdmUgdW5pdCAqLworI2RlZmluZSBMQ1BfT1BUX0FTWU5DX01BUCAgICAgICAyICAgICAgIC8qIGFzeW5jIGNvbnRyb2wgY2hhcmFjdGVyIG1hcCAqLworI2RlZmluZSBMQ1BfT1BUX0FVVEhfUFJPVE8gICAgICAzICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sICovCisjZGVmaW5lIExDUF9PUFRfUVVBTF9QUk9UTyAgICAgIDQgICAgICAgLyogcXVhbGl0eSBwcm90b2NvbCAqLworI2RlZmluZSBMQ1BfT1BUX01BR0lDICAgICAgICAgICA1ICAgICAgIC8qIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBMQ1BfT1BUX1JFU0VSVkVEICAgICAgICA2ICAgICAgIC8qIHJlc2VydmVkICovCisjZGVmaW5lIExDUF9PUFRfUFJPVE9fQ09NUCAgICAgIDcgICAgICAgLyogcHJvdG9jb2wgZmllbGQgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgTENQX09QVF9BRERSX0NPTVAgICAgICAgOCAgICAgICAvKiBhZGRyZXNzL2NvbnRyb2wgZmllbGQgY29tcHJlc3Npb24gKi8KKworI2RlZmluZSBJUENQX0NPTkZfUkVRICAgTENQX0NPTkZfUkVRICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSByZXF1ZXN0ICovCisjZGVmaW5lIElQQ1BfQ09ORl9BQ0sgICBMQ1BfQ09ORl9BQ0sgICAgLyogUFBQIElQQ1AgY29uZmlndXJlIGFja25vd2xlZGdlICovCisjZGVmaW5lIElQQ1BfQ09ORl9OQUsgICBMQ1BfQ09ORl9OQUsgICAgLyogUFBQIElQQ1AgY29uZmlndXJlIG5lZ2F0aXZlIGFjayAqLworI2RlZmluZSBJUENQX0NPTkZfUkVKICAgTENQX0NPTkZfUkVKICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSByZWplY3QgKi8KKyNkZWZpbmUgSVBDUF9URVJNX1JFUSAgIExDUF9URVJNX1JFUSAgICAvKiBQUFAgSVBDUCB0ZXJtaW5hdGUgcmVxdWVzdCAqLworI2RlZmluZSBJUENQX1RFUk1fQUNLICAgTENQX1RFUk1fQUNLICAgIC8qIFBQUCBJUENQIHRlcm1pbmF0ZSBhY2tub3dsZWRnZSAqLworI2RlZmluZSBJUENQX0NPREVfUkVKICAgTENQX0NPREVfUkVKICAgIC8qIFBQUCBJUENQIGNvZGUgcmVqZWN0ICovCisKKyNkZWZpbmUgQ0lTQ09fTVVMVElDQVNUICAgICAgICAgMHg4ZiAgICAvKiBDaXNjbyBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBDSVNDT19VTklDQVNUICAgICAgICAgICAweDBmICAgIC8qIENpc2NvIHVuaWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBDSVNDT19LRUVQQUxJVkUgICAgICAgICAweDgwMzUgIC8qIENpc2NvIGtlZXBhbGl2ZSBwcm90b2NvbCAqLworI2RlZmluZSBDSVNDT19BRERSX1JFUSAgICAgICAgICAwICAgICAgIC8qIENpc2NvIGFkZHJlc3MgcmVxdWVzdCAqLworI2RlZmluZSBDSVNDT19BRERSX1JFUExZICAgICAgICAxICAgICAgIC8qIENpc2NvIGFkZHJlc3MgcmVwbHkgKi8KKyNkZWZpbmUgQ0lTQ09fS0VFUEFMSVZFX1JFUSAgICAgMiAgICAgICAvKiBDaXNjbyBrZWVwYWxpdmUgcmVxdWVzdCAqLworCitzdHJ1Y3QgcHBwX2hlYWRlciB7CisJdTggYWRkcmVzczsKKwl1OCBjb250cm9sOworCXUxNiBwcm90b2NvbDsKK307CisjZGVmaW5lIFBQUF9IRUFERVJfTEVOICAgICAgICAgIHNpemVvZiAoc3RydWN0IHBwcF9oZWFkZXIpCisKK3N0cnVjdCBsY3BfaGVhZGVyIHsKKwl1OCB0eXBlOworCXU4IGlkZW50OworCXUxNiBsZW47Cit9OworI2RlZmluZSBMQ1BfSEVBREVSX0xFTiAgICAgICAgICBzaXplb2YgKHN0cnVjdCBsY3BfaGVhZGVyKQorCitzdHJ1Y3QgY2lzY29fcGFja2V0IHsKKwl1MzIgdHlwZTsKKwl1MzIgcGFyMTsKKwl1MzIgcGFyMjsKKwl1MTYgcmVsOworCXUxNiB0aW1lMDsKKwl1MTYgdGltZTE7Cit9OworI2RlZmluZSBDSVNDT19QQUNLRVRfTEVOIDE4CisjZGVmaW5lIENJU0NPX0JJR19QQUNLRVRfTEVOIDIwCisKK3N0YXRpYyBzdHJ1Y3Qgc3BwcCAqc3BwcHE7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3BwcF9rZWVwYWxpdmVfdGltZXI7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNwcHBxX2xvY2spOworCisvKiBnbG9iYWwgeG1pdCBxdWV1ZSBmb3Igc2VuZGluZyBwYWNrZXRzIHdoaWxlIHNwaW5sb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOworCitzdGF0aWMgdm9pZCBzcHBwX2tlZXBhbGl2ZSAodW5zaWduZWQgbG9uZyBkdW1teSk7CitzdGF0aWMgdm9pZCBzcHBwX2NwX3NlbmQgKHN0cnVjdCBzcHBwICpzcCwgdTE2IHByb3RvLCB1OCB0eXBlLAorCXU4IGlkZW50LCB1MTYgbGVuLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHNwcHBfY2lzY29fc2VuZCAoc3RydWN0IHNwcHAgKnNwLCBpbnQgdHlwZSwgbG9uZyBwYXIxLCBsb25nIHBhcjIpOworc3RhdGljIHZvaWQgc3BwcF9sY3BfaW5wdXQgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc3BwcF9jaXNjb19pbnB1dCAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3Qgc2tfYnVmZiAqbSk7CitzdGF0aWMgdm9pZCBzcHBwX2lwY3BfaW5wdXQgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc3BwcF9sY3Bfb3BlbiAoc3RydWN0IHNwcHAgKnNwKTsKK3N0YXRpYyB2b2lkIHNwcHBfaXBjcF9vcGVuIChzdHJ1Y3Qgc3BwcCAqc3ApOworc3RhdGljIGludCBzcHBwX2xjcF9jb25mX3BhcnNlX29wdGlvbnMgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IGxjcF9oZWFkZXIgKmgsCisJaW50IGxlbiwgdTMyICptYWdpYyk7CitzdGF0aWMgdm9pZCBzcHBwX2NwX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBjaGFyICpzcHBwX2xjcF90eXBlX25hbWUgKHU4IHR5cGUpOworc3RhdGljIGNoYXIgKnNwcHBfaXBjcF90eXBlX25hbWUgKHU4IHR5cGUpOworc3RhdGljIHZvaWQgc3BwcF9wcmludF9ieXRlcyAodTggKnAsIHUxNiBsZW4pOworCitzdGF0aWMgaW50IGRlYnVnOworCisvKiBGbHVzaCBnbG9iYWwgb3V0Z29pbmcgcGFja2V0IHF1ZXVlIHRvIGRldl9xdWV1ZV94bWl0KCkuCisgKgorICogZGV2X3F1ZXVlX3htaXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZAorICogd2hpY2ggbWVhbnMgaXQgY2FuJ3QgYmUgY2FsbGVkIHdpdGggc3BpbmxvY2tzIGhlbGQuCisgKiBJZiBhIHBhY2tldCBuZWVkcyB0byBiZSBzZW50IHdoaWxlIGEgc3BpbmxvY2sgaXMgaGVsZCwKKyAqIHRoZW4gcHV0IHRoZSBwYWNrZXQgaW50byB0eF9xdWV1ZSwgYW5kIGNhbGwgc3BwcF9mbHVzaF94bWl0KCkKKyAqIGFmdGVyIHNwaW5sb2NrIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZCBzcHBwX2ZsdXNoX3htaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnR4X3F1ZXVlKSkgIT0gTlVMTCkKKwkJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworLyoKKyAqCUludGVyZmFjZSBkb3duIHN0dWIKKyAqLwkKKworc3RhdGljIHZvaWQgaWZfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKworCXNwLT5wcF9saW5rX3N0YXRlPVNQUFBfTElOS19ET1dOOworfQorCisvKgorICogVGltZW91dCByb3V0aW5lIGFjdGl2YXRpb25zLgorICovCisKK3N0YXRpYyB2b2lkIHNwcHBfc2V0X3RpbWVvdXQoc3RydWN0IHNwcHAgKnAsaW50IHMpIAoreworCWlmICghIChwLT5wcF9mbGFncyAmIFBQX1RJTU8pKSAKKwl7CisJCWluaXRfdGltZXIoJnAtPnBwX3RpbWVyKTsKKwkJcC0+cHBfdGltZXIuZnVuY3Rpb249c3BwcF9jcF90aW1lb3V0OworCQlwLT5wcF90aW1lci5leHBpcmVzPWppZmZpZXMrcypIWjsKKwkJcC0+cHBfdGltZXIuZGF0YT0odW5zaWduZWQgbG9uZylwOworCQlwLT5wcF9mbGFncyB8PSBQUF9USU1POworCQlhZGRfdGltZXIoJnAtPnBwX3RpbWVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfY2xlYXJfdGltZW91dChzdHJ1Y3Qgc3BwcCAqcCkKK3sKKwlpZiAocC0+cHBfZmxhZ3MgJiBQUF9USU1PKSAKKwl7CisJCWRlbF90aW1lcigmcC0+cHBfdGltZXIpOworCQlwLT5wcF9mbGFncyAmPSB+UFBfVElNTzsgCisJfQorfQorCisvKioKKyAqCXNwcHBfaW5wdXQgLQlyZWNlaXZlIGFuZCBwcm9jZXNzIGEgV0FOIFBQUCBmcmFtZQorICoJQHNrYjoJVGhlIGJ1ZmZlciB0byBwcm9jZXNzCisgKglAZGV2OglUaGUgZGV2aWNlIGl0IGFycml2ZWQgb24KKyAqCisgKglUaGlzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2FyZHMgdGhhdCBkbyBub3QgaGF2ZQorICoJdGltaW5nIGNvbnN0cmFpbnRzIGJ1dCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgbmV0d29yayBsYXllcgorICoJYWZ0ZXIgaW50ZXJydXB0IHNlcnZpY2luZyB0byBwcm9jZXNzIGZyYW1lcyBxdWV1ZWQgdmlhIG5ldGlmX3J4KCkuCisgKgorICoJV2UgcHJvY2VzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY2FyZC4gSWYgdGhlIGZyYW1lIGlzIGRlc3RpbmVkIGZvcgorICoJdGhlIHByb3RvY29sIHN0YWNrcyB0aGVuIGl0IHJlcXVldWVzIHRoZSBmcmFtZSBmb3IgdGhlIHVwcGVyIGxldmVsCisgKglwcm90b2NvbC4gSWYgaXQgaXMgYSBjb250cm9sIGZyb20gaXQgaXMgcHJvY2Vzc2VkIGFuZCBkaXNjYXJkZWQKKyAqCWhlcmUuCisgKi8KKyAKK3ZvaWQgc3BwcF9pbnB1dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcHBwX2hlYWRlciAqaDsKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrYi0+ZGV2PWRldjsKKwlza2ItPm1hYy5yYXc9c2tiLT5kYXRhOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykKKwl7CisJCS8qIENvdW50IHJlY2VpdmVkIGJ5dGVzLCBhZGQgRkNTIGFuZCBvbmUgZmxhZyAqLworCQlzcC0+aWJ5dGVzKz0gc2tiLT5sZW4gKyAzOworCQlzcC0+aXBrdHMrKzsKKwl9CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBQUFBfSEVBREVSX0xFTikpIHsKKwkJLyogVG9vIHNtYWxsIHBhY2tldCwgZHJvcCBpdC4gKi8KKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogaW5wdXQgcGFja2V0IGlzIHRvbyBzbWFsbCwgJWQgYnl0ZXNcbiIsCisJCQkJZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IFBQUCBoZWFkZXIuICovCisJaCA9IChzdHJ1Y3QgcHBwX2hlYWRlciAqKXNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2Isc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkKKwlzd2l0Y2ggKGgtPmFkZHJlc3MpIHsKKwlkZWZhdWx0OiAgICAgICAgLyogSW52YWxpZCBQUFAgcGFja2V0LiAqLworCQlnb3RvIGludmFsaWQ7CisJY2FzZSBQUFBfQUxMU1RBVElPTlM6CisJCWlmIChoLT5jb250cm9sICE9IFBQUF9VSSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBQUFAgcGFja2V0IGluIENpc2NvIG1vZGUgPDB4JXggMHgleCAweCV4PlxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQloLT5hZGRyZXNzLCBoLT5jb250cm9sLCBudG9ocyAoaC0+cHJvdG9jb2wpKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlzd2l0Y2ggKG50b2hzIChoLT5wcm90b2NvbCkpIHsKKwkJZGVmYXVsdDoKKwkJCWlmIChzcC0+bGNwLnN0YXRlID09IExDUF9TVEFURV9PUEVORUQpCisJCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX1BST1RPX1JFSiwKKwkJCQkJKytzcC0+cHBfc2VxLCBza2ItPmxlbiArIDIsCisJCQkJCSZoLT5wcm90b2NvbCk7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGlucHV0IHByb3RvY29sIDwweCV4IDB4JXggMHgleD5cbiIsCisJCQkJCWRldi0+bmFtZSwKKwkJCQkJaC0+YWRkcmVzcywgaC0+Y29udHJvbCwgbnRvaHMgKGgtPnByb3RvY29sKSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgUFBQX0xDUDoKKwkJCXNwcHBfbGNwX2lucHV0IChzcCwgc2tiKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBQUFBfSVBDUDoKKwkJCWlmIChzcC0+bGNwLnN0YXRlID09IExDUF9TVEFURV9PUEVORUQpCisJCQkJc3BwcF9pcGNwX2lucHV0IChzcCwgc2tiKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVBDUCB3aGVuIHN0aWxsIHdhaXRpbmcgTENQIGZpbmlzaC5cbiIpOworCQkJZ290byBkcm9wOworCQljYXNlIFBQUF9JUDoKKwkJCWlmIChzcC0+aXBjcC5zdGF0ZSA9PSBJUENQX1NUQVRFX09QRU5FRCkgeworCQkJCWlmKHNwLT5wcF9mbGFncyZQUF9ERUJVRykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIllvdyBhbiBJUCBmcmFtZS5cbiIpOworCQkJCXNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfSVApOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBJUFgKKwkJY2FzZSBQUFBfSVBYOgorCQkJLyogSVBYIElQWENQIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwkJCWlmIChzcC0+bGNwLnN0YXRlID09IExDUF9TVEFURV9PUEVORUQpIHsKKwkJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQWCk7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJY2FzZSBDSVNDT19NVUxUSUNBU1Q6CisJY2FzZSBDSVNDT19VTklDQVNUOgorCQkvKiBEb24ndCBjaGVjayB0aGUgY29udHJvbCBmaWVsZCBoZXJlIChSRkMgMTU0NykuICovCisJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykpIHsKKwkJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IENpc2NvIHBhY2tldCBpbiBQUFAgbW9kZSA8MHgleCAweCV4IDB4JXg+XG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCWgtPmFkZHJlc3MsIGgtPmNvbnRyb2wsIG50b2hzIChoLT5wcm90b2NvbCkpOworCQkJZ290byBkcm9wOworCQl9CisJCXN3aXRjaCAobnRvaHMgKGgtPnByb3RvY29sKSkgeworCQlkZWZhdWx0OgorCQkJZ290byBpbnZhbGlkOworCQljYXNlIENJU0NPX0tFRVBBTElWRToKKwkJCXNwcHBfY2lzY29faW5wdXQgKHNwLCBza2IpOworCQkJZ290byBkcm9wOworI2lmZGVmIENPTkZJR19JTkVUCisJCWNhc2UgRVRIX1BfSVA6CisJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJZ290byBkb25lOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0lQWAorCQljYXNlIEVUSF9QX0lQWDoKKwkJCXNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfSVBYKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJZ290byBkb25lOworI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCWdvdG8gZHJvcDsKKworaW52YWxpZDoKKwlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBpbnB1dCBwYWNrZXQgPDB4JXggMHgleCAweCV4PlxuIiwKKwkJCWRldi0+bmFtZSwgaC0+YWRkcmVzcywgaC0+Y29udHJvbCwgbnRvaHMgKGgtPnByb3RvY29sKSk7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCXNwcHBfZmx1c2hfeG1pdCgpOworCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTChzcHBwX2lucHV0KTsKKworLyoKKyAqCUhhbmRsZSB0cmFuc21pdCBwYWNrZXRzLgorICovCisgCitzdGF0aWMgaW50IHNwcHBfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgdHlwZSwKKwkJdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKwlzdHJ1Y3QgcHBwX2hlYWRlciAqaDsKKwlza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKSk7CisJaD0oc3RydWN0IHBwcF9oZWFkZXIgKilza2ItPmRhdGE7CisJaWYoc3AtPnBwX2ZsYWdzJlBQX0NJU0NPKQorCXsKKwkJaC0+YWRkcmVzcyA9IENJU0NPX1VOSUNBU1Q7CisJCWgtPmNvbnRyb2wgPSAwOworCX0KKwllbHNlCisJeworCQloLT5hZGRyZXNzID0gUFBQX0FMTFNUQVRJT05TOworCQloLT5jb250cm9sID0gUFBQX1VJOworCX0KKwlpZihzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykKKwl7CisJCWgtPnByb3RvY29sID0gaHRvbnModHlwZSk7CisJfQorCWVsc2Ugc3dpdGNoKHR5cGUpCisJeworCQljYXNlIEVUSF9QX0lQOgorCQkJaC0+cHJvdG9jb2wgPSBodG9ucyhQUFBfSVApOworCQkJYnJlYWs7CisJCWNhc2UgRVRIX1BfSVBYOgorCQkJaC0+cHJvdG9jb2wgPSBodG9ucyhQUFBfSVBYKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKTsKK30KKworc3RhdGljIGludCBzcHBwX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZW5kIGtlZXBhbGl2ZSBwYWNrZXRzLCBldmVyeSAxMCBzZWNvbmRzLgorICovCisKK3N0YXRpYyB2b2lkIHNwcHBfa2VlcGFsaXZlICh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXN0cnVjdCBzcHBwICpzcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKworCWZvciAoc3A9c3BwcHE7IHNwOyBzcD1zcC0+cHBfbmV4dCkgCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPnBwX2lmOworCisJCS8qIEtlZXBhbGl2ZSBtb2RlIGRpc2FibGVkIG9yIGNoYW5uZWwgZG93bj8gKi8KKwkJaWYgKCEgKHNwLT5wcF9mbGFncyAmIFBQX0tFRVBBTElWRSkgfHwKKwkJICAgICEgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZzcC0+bG9jayk7CisKKwkJLyogTm8ga2VlcGFsaXZlIGluIFBQUCBtb2RlIGlmIExDUCBub3Qgb3BlbmVkIHlldC4gKi8KKwkJaWYgKCEgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSAmJgorCQkgICAgc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQlzcGluX3VubG9jaygmc3AtPmxvY2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3AtPnBwX2FsaXZlY250ID09IE1BWEFMSVZFQ05UKSB7CisJCQkvKiBObyBrZWVwYWxpdmUgcGFja2V0cyBnb3QuICBTdG9wIHRoZSBpbnRlcmZhY2UuICovCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHByb3RvY29sIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCQlpZl9kb3duIChkZXYpOworCQkJaWYgKCEgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkgeworCQkJCS8qIFNodXQgZG93biB0aGUgUFBQIGxpbmsuICovCisJCQkJc3AtPmxjcC5tYWdpYyA9IGppZmZpZXM7CisJCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJCQkvKiBJbml0aWF0ZSBuZWdvdGlhdGlvbi4gKi8KKwkJCQlzcHBwX2xjcF9vcGVuIChzcCk7CisJCQl9CisJCX0KKwkJaWYgKHNwLT5wcF9hbGl2ZWNudCA8PSBNQVhBTElWRUNOVCkKKwkJCSsrc3AtPnBwX2FsaXZlY250OworCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pCisJCQlzcHBwX2Npc2NvX3NlbmQgKHNwLCBDSVNDT19LRUVQQUxJVkVfUkVRLCArK3NwLT5wcF9zZXEsCisJCQkJc3AtPnBwX3JzZXEpOworCQllbHNlIGlmIChzcC0+bGNwLnN0YXRlID09IExDUF9TVEFURV9PUEVORUQpIHsKKwkJCWxvbmcgbm1hZ2ljID0gaHRvbmwgKHNwLT5sY3AubWFnaWMpOworCQkJc3AtPmxjcC5lY2hvaWQgPSArK3NwLT5wcF9zZXE7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfRUNIT19SRVEsCisJCQkJc3AtPmxjcC5lY2hvaWQsIDQsICZubWFnaWMpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnNwLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworCXNwcHBfZmx1c2hfeG1pdCgpOworCXNwcHBfa2VlcGFsaXZlX3RpbWVyLmV4cGlyZXM9amlmZmllcysxMCpIWjsKKwlhZGRfdGltZXIoJnNwcHBfa2VlcGFsaXZlX3RpbWVyKTsKK30KKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyBQUFAgTGluayBDb250cm9sIFByb3RvY29sIHBhY2tldHMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxjcF9oZWFkZXIgKmg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdTggKnAsIG9wdFs2XTsKKwl1MzIgcm1hZ2ljOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBsY3BfaGVhZGVyKSkpIHsKKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGxjcCBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQlkZXYtPm5hbWUsIGxlbik7CisJCXJldHVybjsKKwl9CisJaCA9IChzdHJ1Y3QgbGNwX2hlYWRlciAqKXNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2Isc2l6ZW9mKHN0cnVjdCBsY3BfaGVhZGVyICopKTsKKwkKKwlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpIAorCXsKKwkJY2hhciBzdGF0ZSA9ICc/JzsKKwkJc3dpdGNoIChzcC0+bGNwLnN0YXRlKSB7CisJCWNhc2UgTENQX1NUQVRFX0NMT1NFRDogICBzdGF0ZSA9ICdDJzsgYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX0FDS19SQ1ZEOiBzdGF0ZSA9ICdSJzsgYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOiBzdGF0ZSA9ICdTJzsgYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX09QRU5FRDogICBzdGF0ZSA9ICdPJzsgYnJlYWs7CisJCX0KKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBsY3AgaW5wdXQoJWMpOiAlZCBieXRlcyA8JXMgaWQ9JXhoIGxlbj0leGgiLAorCQkJZGV2LT5uYW1lLCBzdGF0ZSwgbGVuLAorCQkJc3BwcF9sY3BfdHlwZV9uYW1lIChoLT50eXBlKSwgaC0+aWRlbnQsIG50b2hzIChoLT5sZW4pKTsKKwkJaWYgKGxlbiA+IDQpCisJCQlzcHBwX3ByaW50X2J5dGVzICgodTgqKSAoaCsxKSwgbGVuLTQpOworCQlwcmludGsgKCI+XG4iKTsKKwl9CisJaWYgKGxlbiA+IG50b2hzIChoLT5sZW4pKQorCQlsZW4gPSBudG9ocyAoaC0+bGVuKTsKKwlzd2l0Y2ggKGgtPnR5cGUpIHsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIHBhY2tldCB0eXBlIC0tIHNlbmQgQ29kZS1SZWplY3QgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ERV9SRUosICsrc3AtPnBwX3NlcSwKKwkJCXNrYi0+bGVuLCBoKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfQ09ORl9SRVE6CisJCWlmIChsZW4gPCA0KSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHIiVzOiBpbnZhbGlkIGxjcCBjb25maWd1cmUgcmVxdWVzdCBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQkJZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxlbj40ICYmICFzcHBwX2xjcF9jb25mX3BhcnNlX29wdGlvbnMgKHNwLCBoLCBsZW4sICZybWFnaWMpKQorCQkJZ290byBiYWRyZXE7CisJCWlmIChybWFnaWMgPT0gc3AtPmxjcC5tYWdpYykgeworCQkJLyogTG9jYWwgYW5kIHJlbW90ZSBtYWdpY3MgZXF1YWwgLS0gbG9vcGJhY2s/ICovCisJCQlpZiAoc3AtPnBwX2xvb3BjbnQgPj0gTUFYQUxJVkVDTlQqNSkgeworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbG9vcGJhY2tcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCWlmX2Rvd24gKGRldik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBjb25mIHJlcTogbWFnaWMgZ2xpdGNoXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJKytzcC0+cHBfbG9vcGNudDsKKworCQkJLyogTVVTVCBzZW5kIENvbmYtTmFjayBwYWNrZXQuICovCisJCQlybWFnaWMgPSB+c3AtPmxjcC5tYWdpYzsKKwkJCW9wdFswXSA9IExDUF9PUFRfTUFHSUM7CisJCQlvcHRbMV0gPSBzaXplb2YgKG9wdCk7CisJCQlvcHRbMl0gPSBybWFnaWMgPj4gMjQ7CisJCQlvcHRbM10gPSBybWFnaWMgPj4gMTY7CisJCQlvcHRbNF0gPSBybWFnaWMgPj4gODsKKwkJCW9wdFs1XSA9IHJtYWdpYzsKKwkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9DT05GX05BSywKKwkJCQloLT5pZGVudCwgc2l6ZW9mIChvcHQpLCAmb3B0KTsKK2JhZHJlcToKKwkJCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCQkJY2FzZSBMQ1BfU1RBVEVfT1BFTkVEOgorCQkJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCQkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQkJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLworCQkJY2FzZSBMQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCQkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvKiBTZW5kIENvbmZpZ3VyZS1BY2sgcGFja2V0LiAqLworCQlzcC0+cHBfbG9vcGNudCA9IDA7CisJCWlmIChzcC0+bGNwLnN0YXRlICE9IExDUF9TVEFURV9PUEVORUQpIHsKKwkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9DT05GX0FDSywKKwkJCQkJaC0+aWRlbnQsIGxlbi00LCBoKzEpOworCQl9CisJCS8qIENoYW5nZSB0aGUgc3RhdGUuICovCisJCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCQljYXNlIExDUF9TVEFURV9DTE9TRUQ6CisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0FDS19TRU5UOworCQkJYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX0FDS19SQ1ZEOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9PUEVORUQ7CisJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX09QRU5FRDoKKwkJCS8qIFJlbW90ZSBtYWdpYyBjaGFuZ2VkIC0tIGNsb3NlIHNlc3Npb24uICovCisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQkvKiBJbml0aWF0ZSByZW5lZ290aWF0aW9uLiAqLworCQkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQkJLyogU2VuZCBBQ0sgYWZ0ZXIgb3VyIFJFUSBpbiBhdHRlbXB0IHRvIGJyZWFrIGxvb3AgKi8KKwkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9DT05GX0FDSywKKwkJCQkJaC0+aWRlbnQsIGxlbi00LCBoKzEpOworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9BQ0tfU0VOVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfQUNLOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmxjcC5jb25maWQpCisJCQlicmVhazsKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCWlmICgoc3AtPnBwX2xpbmtfc3RhdGUgIT0gU1BQUF9MSU5LX1VQKSAmJgorCQkgICAgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCQkvKiBDb21pbmcgb3V0IG9mIGxvb3BiYWNrIG1vZGUuICovCisJCQlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfVVA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IHByb3RvY29sIHVwXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCQljYXNlIExDUF9TVEFURV9DTE9TRUQ6CisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0FDS19SQ1ZEOworCQkJc3BwcF9zZXRfdGltZW91dCAoc3AsIDUpOworCQkJYnJlYWs7CisJCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9PUEVORUQ7CisJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMQ1BfQ09ORl9OQUs6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+bGNwLmNvbmZpZCkKKwkJCWJyZWFrOworCQlwID0gKHU4KikgKGgrMSk7CisJCWlmIChsZW4+PTEwICYmIHBbMF0gPT0gTENQX09QVF9NQUdJQyAmJiBwWzFdID49IDQpIHsKKwkJCXJtYWdpYyA9ICh1MzIpcFsyXSA8PCAyNCB8CisJCQkJKHUzMilwWzNdIDw8IDE2IHwgcFs0XSA8PCA4IHwgcFs1XTsKKwkJCWlmIChybWFnaWMgPT0gfnNwLT5sY3AubWFnaWMpIHsKKwkJCQlpbnQgbmV3bWFnaWM7CisJCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBjb25mIG5hazogbWFnaWMgZ2xpdGNoXG4iLAorCQkJCQkJZGV2LT5uYW1lKTsKKwkJCQlnZXRfcmFuZG9tX2J5dGVzKCZuZXdtYWdpYywgc2l6ZW9mKG5ld21hZ2ljKSk7CisJCQkJc3AtPmxjcC5tYWdpYyArPSBuZXdtYWdpYzsKKwkJCX0gZWxzZQorCQkJCXNwLT5sY3AubWFnaWMgPSBybWFnaWM7CisJCQl9CisJCWlmIChzcC0+bGNwLnN0YXRlICE9IExDUF9TVEFURV9BQ0tfU0VOVCkgeworCQkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQl9CisJCS8qIFRoZSBsaW5rIHdpbGwgYmUgcmVuZWdvdGlhdGVkIGFmdGVyIHRpbWVvdXQsCisJCSAqIHRvIGF2b2lkIGVuZGxlc3MgcmVxLW5hY2sgbG9vcC4gKi8KKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCAyKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfQ09ORl9SRUo6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+bGNwLmNvbmZpZCkKKwkJCWJyZWFrOworCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfQUNLX1NFTlQpIHsKKwkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUF9URVJNX1JFUToKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCS8qIFNlbmQgVGVybWluYXRlLUFjayBwYWNrZXQuICovCisJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9URVJNX0FDSywgaC0+aWRlbnQsIDAsIE5VTEwpOworCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkvKiBJbml0aWF0ZSByZW5lZ290aWF0aW9uLiAqLworCQlzcHBwX2xjcF9vcGVuIChzcCk7CisJCWJyZWFrOworCWNhc2UgTENQX1RFUk1fQUNLOgorCWNhc2UgTENQX0NPREVfUkVKOgorCWNhc2UgTENQX1BST1RPX1JFSjoKKwkJLyogSWdub3JlIGZvciBub3cuICovCisJCWJyZWFrOworCWNhc2UgTENQX0RJU0NfUkVROgorCQkvKiBEaXNjYXJkIHRoZSBwYWNrZXQuICovCisJCWJyZWFrOworCWNhc2UgTENQX0VDSE9fUkVROgorCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfT1BFTkVEKQorCQkJYnJlYWs7CisJCWlmIChsZW4gPCA4KSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGxjcCBlY2hvIHJlcXVlc3QgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJCWRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChudG9obCAoKihsb25nKikoaCsxKSkgPT0gc3AtPmxjcC5tYWdpYykgeworCQkJLyogTGluZSBsb29wYmFjayBtb2RlIGRldGVjdGVkLiAqLworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBsb29wYmFja1xuIiwgZGV2LT5uYW1lKTsKKwkJCWlmX2Rvd24gKGRldik7CisKKwkJCS8qIFNodXQgZG93biB0aGUgUFBQIGxpbmsuICovCisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJCS8qIEluaXRpYXRlIG5lZ290aWF0aW9uLiAqLworCQkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQkJYnJlYWs7CisJCX0KKwkJKihsb25nKikoaCsxKSA9IGh0b25sIChzcC0+bGNwLm1hZ2ljKTsKKwkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0VDSE9fUkVQTFksIGgtPmlkZW50LCBsZW4tNCwgaCsxKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfRUNIT19SRVBMWToKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5sY3AuZWNob2lkKQorCQkJYnJlYWs7CisJCWlmIChsZW4gPCA4KSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGxjcCBlY2hvIHJlcGx5IHBhY2tldCBsZW5ndGg6ICVkIGJ5dGVzXG4iLAorCQkJCQlkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobnRvaGwgKCoobG9uZyopKGgrMSkpICE9IHNwLT5sY3AubWFnaWMpCisJCXNwLT5wcF9hbGl2ZWNudCA9IDA7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyBDaXNjbyBrZWVwYWxpdmUgcHJvdG9jb2wgcGFja2V0cy4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX2Npc2NvX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNpc2NvX3BhY2tldCAqaDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPnBwX2lmOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBjaXNjb19wYWNrZXQpKQorCSAgICB8fCAoc2tiLT5sZW4gIT0gQ0lTQ09fUEFDS0VUX0xFTgorCQkmJiBza2ItPmxlbiAhPSBDSVNDT19CSUdfUEFDS0VUX0xFTikpIHsKKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGNpc2NvIHBhY2tldCBsZW5ndGg6ICVkIGJ5dGVzXG4iLAorCQkJCWRldi0+bmFtZSwgIHNrYi0+bGVuKTsKKwkJcmV0dXJuOworCX0KKwloID0gKHN0cnVjdCBjaXNjb19wYWNrZXQgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGNpc2NvX3BhY2tldCopKTsKKwlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2lzY28gaW5wdXQ6ICVkIGJ5dGVzIDwleGggJXhoICV4aCAleGggJXhoLSV4aD5cbiIsCisJCQlkZXYtPm5hbWUsICBza2ItPmxlbiwKKwkJCW50b2hsIChoLT50eXBlKSwgaC0+cGFyMSwgaC0+cGFyMiwgaC0+cmVsLAorCQkJaC0+dGltZTAsIGgtPnRpbWUxKTsKKwlzd2l0Y2ggKG50b2hsIChoLT50eXBlKSkgeworCWRlZmF1bHQ6CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBjaXNjbyBwYWNrZXQgdHlwZTogMHgleFxuIiwKKwkJCQlkZXYtPm5hbWUsICBudG9obCAoaC0+dHlwZSkpOworCQlicmVhazsKKwljYXNlIENJU0NPX0FERFJfUkVQTFk6CisJCS8qIFJlcGx5IG9uIGFkZHJlc3MgcmVxdWVzdCwgaWdub3JlICovCisJCWJyZWFrOworCWNhc2UgQ0lTQ09fS0VFUEFMSVZFX1JFUToKKwkJc3AtPnBwX2FsaXZlY250ID0gMDsKKwkJc3AtPnBwX3JzZXEgPSBudG9obCAoaC0+cGFyMSk7CisJCWlmIChzcC0+cHBfc2VxID09IHNwLT5wcF9yc2VxKSB7CisJCQkvKiBMb2NhbCBhbmQgcmVtb3RlIHNlcXVlbmNlIG51bWJlcnMgYXJlIGVxdWFsLgorCQkJICogUHJvYmFibHksIHRoZSBsaW5lIGlzIGluIGxvb3BiYWNrIG1vZGUuICovCisJCQlpbnQgbmV3c2VxOworCQkJaWYgKHNwLT5wcF9sb29wY250ID49IE1BWEFMSVZFQ05UKSB7CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBsb29wYmFja1xuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlzcC0+cHBfbG9vcGNudCA9IDA7CisJCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJCQkJaWZfZG93biAoZGV2KTsKKwkJCQl9CisJCQl9CisJCQkrK3NwLT5wcF9sb29wY250OworCisJCQkvKiBHZW5lcmF0ZSBuZXcgbG9jYWwgc2VxdWVuY2UgbnVtYmVyICovCisJCQlnZXRfcmFuZG9tX2J5dGVzKCZuZXdzZXEsIHNpemVvZihuZXdzZXEpKTsKKwkJCXNwLT5wcF9zZXEgXj0gbmV3c2VxOworCQkJYnJlYWs7CisJCX0KKwkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQlpZiAoc3AtPnBwX2xpbmtfc3RhdGU9PVNQUFBfTElOS19ET1dOICYmCisJCSAgICAoZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJCXNwLT5wcF9saW5rX3N0YXRlPVNQUFBfTElOS19VUDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogcHJvdG9jb2wgdXBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDSVNDT19BRERSX1JFUToKKwkJLyogU3RvbGVuIGZyb20gbmV0L2lwdjQvZGV2aW5ldC5jIC0tIFNJT0NHSUZBRERSIGlvY3RsICovCisJCXsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CisJCXUzMiBhZGRyID0gMCwgbWFzayA9IH4wOyAvKiBGSVhNRTogaXMgdGhlIG1hc2sgY29ycmVjdD8gKi8KKyNpZmRlZiBDT05GSUdfSU5FVAorCQlyY3VfcmVhZF9sb2NrKCk7CisJCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpICE9IE5VTEwpCisJCXsKKwkJCWZvciAoaWZhPWluX2Rldi0+aWZhX2xpc3Q7IGlmYSAhPSBOVUxMOworCQkJCWlmYT1pZmEtPmlmYV9uZXh0KSB7CisJCQkJaWYgKHN0cmNtcChkZXYtPm5hbWUsIGlmYS0+aWZhX2xhYmVsKSA9PSAwKSAKKwkJCQl7CisJCQkJCWFkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKwkJCQkJbWFzayA9IGlmYS0+aWZhX21hc2s7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKyNlbmRpZgkJCisJCS8qIEkgaG9wZSBib3RoIGFkZHIgYW5kIG1hc2sgYXJlIGluIHRoZSBuZXQgb3JkZXIgKi8KKwkJc3BwcF9jaXNjb19zZW5kIChzcCwgQ0lTQ09fQUREUl9SRVBMWSwgYWRkciwgbWFzayk7CisJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qCisgKiBTZW5kIFBQUCBMQ1AgcGFja2V0LgorICovCisKK3N0YXRpYyB2b2lkIHNwcHBfY3Bfc2VuZCAoc3RydWN0IHNwcHAgKnNwLCB1MTYgcHJvdG8sIHU4IHR5cGUsCisJdTggaWRlbnQsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc3RydWN0IGxjcF9oZWFkZXIgKmxoOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKworCXNrYj1hbGxvY19za2IoZGV2LT5oYXJkX2hlYWRlcl9sZW4rUFBQX0hFQURFUl9MRU4rTENQX0hFQURFUl9MRU4rbGVuLAorCQlHRlBfQVRPTUlDKTsKKwlpZiAoc2tiPT1OVUxMKQorCQlyZXR1cm47CisKKwlza2JfcmVzZXJ2ZShza2IsZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQorCWggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKSk7CisJaC0+YWRkcmVzcyA9IFBQUF9BTExTVEFUSU9OUzsgICAgICAgIC8qIGJyb2FkY2FzdCBhZGRyZXNzICovCisJaC0+Y29udHJvbCA9IFBQUF9VSTsgICAgICAgICAgICAgICAgIC8qIFVubnVtYmVyZWQgSW5mbyAqLworCWgtPnByb3RvY29sID0gaHRvbnMgKHByb3RvKTsgICAgICAgICAvKiBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKi8KKworCWxoID0gKHN0cnVjdCBsY3BfaGVhZGVyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpOworCWxoLT50eXBlID0gdHlwZTsKKwlsaC0+aWRlbnQgPSBpZGVudDsKKwlsaC0+bGVuID0gaHRvbnMgKExDUF9IRUFERVJfTEVOICsgbGVuKTsKKworCWlmIChsZW4pCisJCW1lbWNweShza2JfcHV0KHNrYixsZW4pLGRhdGEsIGxlbik7CisKKwlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiAlcyBvdXRwdXQgPCVzIGlkPSV4aCBsZW49JXhoIiwKKwkJCWRldi0+bmFtZSwgCisJCQlwcm90bz09UFBQX0xDUCA/ICJsY3AiIDogImlwY3AiLAorCQkJcHJvdG89PVBQUF9MQ1AgPyBzcHBwX2xjcF90eXBlX25hbWUgKGxoLT50eXBlKSA6CisJCQlzcHBwX2lwY3BfdHlwZV9uYW1lIChsaC0+dHlwZSksIGxoLT5pZGVudCwKKwkJCW50b2hzIChsaC0+bGVuKSk7CisJCWlmIChsZW4pCisJCQlzcHBwX3ByaW50X2J5dGVzICgodTgqKSAobGgrMSksIGxlbik7CisJCXByaW50ayAoIj5cbiIpOworCX0KKwlzcC0+b2J5dGVzICs9IHNrYi0+bGVuOworCS8qIENvbnRyb2wgaXMgaGlnaCBwcmlvcml0eSBzbyBpdCBkb2Vzbid0IGdldCBxdWV1ZWQgYmVoaW5kIGRhdGEgKi8KKwlza2ItPnByaW9yaXR5PVRDX1BSSU9fQ09OVFJPTDsKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcXVldWVfdGFpbCgmdHhfcXVldWUsIHNrYik7Cit9CisKKy8qCisgKiBTZW5kIENpc2NvIGtlZXBhbGl2ZSBwYWNrZXQuCisgKi8KKworc3RhdGljIHZvaWQgc3BwcF9jaXNjb19zZW5kIChzdHJ1Y3Qgc3BwcCAqc3AsIGludCB0eXBlLCBsb25nIHBhcjEsIGxvbmcgcGFyMikKK3sKKwlzdHJ1Y3QgcHBwX2hlYWRlciAqaDsKKwlzdHJ1Y3QgY2lzY29fcGFja2V0ICpjaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+cHBfaWY7CisJdTMyIHQgPSBqaWZmaWVzICogMTAwMC9IWjsKKworCXNrYj1hbGxvY19za2IoZGV2LT5oYXJkX2hlYWRlcl9sZW4rUFBQX0hFQURFUl9MRU4rQ0lTQ09fUEFDS0VUX0xFTiwKKwkJR0ZQX0FUT01JQyk7CisKKwlpZihza2I9PU5VTEwpCisJCXJldHVybjsKKwkJCisJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJaCA9IChzdHJ1Y3QgcHBwX2hlYWRlciAqKXNrYl9wdXQgKHNrYiwgc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKSk7CisJaC0+YWRkcmVzcyA9IENJU0NPX01VTFRJQ0FTVDsKKwloLT5jb250cm9sID0gMDsKKwloLT5wcm90b2NvbCA9IGh0b25zIChDSVNDT19LRUVQQUxJVkUpOworCisJY2ggPSAoc3RydWN0IGNpc2NvX3BhY2tldCopc2tiX3B1dChza2IsIENJU0NPX1BBQ0tFVF9MRU4pOworCWNoLT50eXBlID0gaHRvbmwgKHR5cGUpOworCWNoLT5wYXIxID0gaHRvbmwgKHBhcjEpOworCWNoLT5wYXIyID0gaHRvbmwgKHBhcjIpOworCWNoLT5yZWwgPSAtMTsKKwljaC0+dGltZTAgPSBodG9ucyAoKHUxNikgKHQgPj4gMTYpKTsKKwljaC0+dGltZTEgPSBodG9ucyAoKHUxNikgdCk7CisKKwlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2lzY28gb3V0cHV0OiA8JXhoICV4aCAleGggJXhoICV4aC0leGg+XG4iLAorCQkJZGV2LT5uYW1lLCAgbnRvaGwgKGNoLT50eXBlKSwgY2gtPnBhcjEsCisJCQljaC0+cGFyMiwgY2gtPnJlbCwgY2gtPnRpbWUwLCBjaC0+dGltZTEpOworCXNwLT5vYnl0ZXMgKz0gc2tiLT5sZW47CisJc2tiLT5wcmlvcml0eT1UQ19QUklPX0NPTlRST0w7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3F1ZXVlX3RhaWwoJnR4X3F1ZXVlLCBza2IpOworfQorCisvKioKKyAqCXNwcHBfY2xvc2UgLSBjbG9zZSBkb3duIGEgc3luY2hyb25vdXMgUFBQIG9yIENpc2NvIEhETEMgbGluaworICoJQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRvIGRyb3AgdGhlIGxpbmsgb2YKKyAqCisgKglUaGlzIGRyb3BzIHRoZSBsb2dpY2FsIGludGVyZmFjZSB0byB0aGUgY2hhbm5lbC4gSXQgaXMgbm90CisgKglkb25lIHBvbGl0ZWx5IGFzIHdlIGFzc3VtZSB3ZSB3aWxsIGFsc28gYmUgZHJvcHBpbmcgRFRSLiBBbnkKKyAqCXRpbWVvdXRzIGFyZSBraWxsZWQuCisgKi8KKworaW50IHNwcHBfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwICopc3BwcF9vZihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlzcC0+cHBfbGlua19zdGF0ZSA9IFNQUFBfTElOS19ET1dOOworCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfY2xvc2UpOworCisvKioKKyAqCXNwcHBfb3BlbiAtIG9wZW4gYSBzeW5jaHJvbm91cyBQUFAgb3IgQ2lzY28gSERMQyBsaW5rCisgKglAZGV2OglOZXR3b3JrIGRldmljZSB0byBhY3RpdmF0ZQorICoJCisgKglDbG9zZSBkb3duIGFueSBleGlzdGluZyBzeW5jaHJvbm91cyBzZXNzaW9uIGFuZCBjb21tZW5jZQorICoJZnJvbSBzY3JhdGNoLiBJbiB0aGUgUFBQIGNhc2UgdGhpcyBtZWFucyBuZWdvdGlhdGluZyBMQ1AvSVBDUAorICoJYW5kIGZyaWVuZHMsIHdoaWxlIGZvciBDaXNjbyBIRExDIHdlIHNpbXBseSBuZWVkIHRvIHN0YXJ0IHNlbmRpbmcKKyAqCWtlZXBhbGl2ZXMKKyAqLworCitpbnQgc3BwcF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3BwcF9jbG9zZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJaWYgKCEoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pKSB7CisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwl9CisJc3AtPnBwX2xpbmtfc3RhdGUgPSBTUFBQX0xJTktfRE9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCXNwcHBfZmx1c2hfeG1pdCgpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9vcGVuKTsKKworLyoqCisgKglzcHBwX3Jlb3BlbiAtIG5vdGlmeSBvZiBwaHlzaWNhbCBsaW5rIGxvc3MKKyAqCUBkZXY6IERldmljZSB0aGF0IGxvc3QgdGhlIGxpbmsKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGluZm9ybXMgdGhlIHN5bmNocm9ub3VzIHByb3RvY29sIGNvZGUgdGhhdAorICoJdGhlIHVuZGVybHlpbmcgbGluayBkaWVkIChmb3IgZXhhbXBsZSBhIGNhcnJpZXIgZHJvcCBvbiBYLjIxKQorICoKKyAqCVdlIGluY3JlbWVudCB0aGUgbWFnaWMgbnVtYmVycyB0byBlbnN1cmUgdGhhdCBpZiB0aGUgb3RoZXIgZW5kCisgKglmYWlsZWQgdG8gbm90aWNlIHdlIHdpbGwgY29ycmVjdGx5IHN0YXJ0IGEgbmV3IHNlc3Npb24uIEl0IGhhcHBlbnMKKyAqCWRvIHRvIHRoZSBuYXR1cmUgb2YgdGVsY28gY2lyY3VpdHMgaXMgdGhhdCB5b3UgY2FuIGxvc2UgY2FycmllciBvbgorICoJb25lIGVuZG9ubHkuCisgKgorICoJSGF2aW5nIGRvbmUgdGhpcyB3ZSBnbyBiYWNrIHRvIG5lZ290aWF0aW5nLiBUaGlzIGZ1bmN0aW9uIG1heQorICoJYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KKyAKK2ludCBzcHBwX3Jlb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwcHBfY2xvc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCWlmICghKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkKKwl7CisJCXNwLT5sY3AubWFnaWMgPSBqaWZmaWVzOworCQkrK3NwLT5wcF9zZXE7CisJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkvKiBHaXZlIGl0IGEgbW9tZW50IGZvciB0aGUgbGluZSB0byBzZXR0bGUgdGhlbiBnbyAqLworCQlzcHBwX3NldF90aW1lb3V0IChzcCwgMSk7CisJfSAKKwlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfRE9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9yZW9wZW4pOworCisvKioKKyAqCXNwcHBfY2hhbmdlX210dSAtIENoYW5nZSB0aGUgbGluayBNVFUKKyAqCUBkZXY6CURldmljZSB0byBjaGFuZ2UgTVRVIG9uCisgKglAbmV3X210dTogTmV3IE1UVQorICoKKyAqCUNoYW5nZSB0aGUgTVRVIG9uIHRoZSBsaW5rLiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoCisgKgl0aGUgbGluayBkb3duLiBJdCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBsaW5rIGlzIHVwIG9yCisgKgl0aGUgbXR1IGlzIG91dCBvZiByYW5nZS4KKyAqLworIAoraW50IHNwcHBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZihuZXdfbXR1PDEyOHx8bmV3X210dT5QUFBfTVRVfHwoZGV2LT5mbGFncyZJRkZfVVApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dT1uZXdfbXR1OworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfY2hhbmdlX210dSk7CisKKy8qKgorICoJc3BwcF9kb19pb2N0bCAtIElvY3RsIGhhbmRsZXIgZm9yIHBwcC9oZGxjCisgKglAZGV2OiBEZXZpY2Ugc3ViamVjdCB0byBpb2N0bAorICoJQGlmcjogSW50ZXJmYWNlIHJlcXVlc3QgYmxvY2sgZnJvbSB0aGUgdXNlcgorICoJQGNtZDogQ29tbWFuZCB0aGF0IGlzIGJlaW5nIGlzc3VlZAorICoJCisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGlvY3RscyB0aGF0IG1heSBiZSBpc3N1ZWQgYnkgdGhlIHVzZXIKKyAqCXRvIGNvbnRyb2wgdGhlIHNldHRpbmdzIG9mIGEgUFBQL0hETEMgbGluay4gSXQgZG9lcyBib3RoIGJ1c3kKKyAqCWFuZCBzZWN1cml0eSBjaGVja3MuIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgd3JhcHBlZCBieQorICoJY2FsbGVycyB3aG8gd2lzaCB0byBhZGQgYWRkaXRpb25hbCBpb2N0bCBjYWxscyBvZiB0aGVpciBvd24uCisgKi8KKyAKK2ludCBzcHBwX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKworCWlmKGRldi0+ZmxhZ3MmSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOworCQkKKwlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwkKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBTUFBQSU9DQ0lTQ086CisJCQlzcC0+cHBfZmxhZ3N8PVBQX0NJU0NPOworCQkJZGV2LT50eXBlID0gQVJQSFJEX0hETEM7CisJCQlicmVhazsKKwkJY2FzZSBTUFBQSU9DUFBQOgorCQkJc3AtPnBwX2ZsYWdzJj1+UFBfQ0lTQ087CisJCQlkZXYtPnR5cGUgPSBBUlBIUkRfUFBQOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ0RFQlVHOgorCQkJc3AtPnBwX2ZsYWdzJj1+UFBfREVCVUc7CisJCQlpZihpZnItPmlmcl9mbGFncykKKwkJCQlzcC0+cHBfZmxhZ3N8PVBQX0RFQlVHOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ0dGTEFHUzoKKwkJCWlmKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmc3AtPnBwX2ZsYWdzLCBzaXplb2Yoc3AtPnBwX2ZsYWdzKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBTUFBQSU9DU0ZMQUdTOgorCQkJaWYoY29weV9mcm9tX3VzZXIoJnNwLT5wcF9mbGFncywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHNwLT5wcF9mbGFncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9kb19pb2N0bCk7CisKKy8qKgorICoJc3BwcF9hdHRhY2ggLSBhdHRhY2ggc3luY2hyb25vdXMgUFBQL0hETEMgdG8gYSBkZXZpY2UKKyAqCUBwZDoJUFBQIGRldmljZSB0byBpbml0aWFsaXNlCisgKgorICoJVGhpcyBpbml0aWFsaXNlcyB0aGUgUFBQL0hETEMgc3VwcG9ydCBvbiBhbiBpbnRlcmZhY2UuIEF0IHRoZQorICoJdGltZSBvZiBjYWxsaW5nIHRoZSBkZXYgZWxlbWVudCBtdXN0IHBvaW50IHRvIHRoZSBuZXR3b3JrIGRldmljZQorICoJdGhhdCB0aGlzIGludGVyZmFjZSBpcyBhdHRhY2hlZCB0by4gVGhlIGludGVyZmFjZSBzaG91bGQgbm90IHlldAorICoJYmUgcmVnaXN0ZXJlZC4gCisgKi8KKyAKK3ZvaWQgc3BwcF9hdHRhY2goc3RydWN0IHBwcF9kZXZpY2UgKnBkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwZC0+ZGV2OworCXN0cnVjdCBzcHBwICpzcCA9ICZwZC0+c3BwcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTWFrZSBzdXJlIGVtYmVkZGluZyBpcyBzYWZlIGZvciBzcHBwX29mICovCisJQlVHX09OKHNwcHBfb2YoZGV2KSAhPSBzcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworCS8qIEluaXRpYWxpemUga2VlcGFsaXZlIGhhbmRsZXIuICovCisJaWYgKCEgc3BwcHEpCisJeworCQlpbml0X3RpbWVyKCZzcHBwX2tlZXBhbGl2ZV90aW1lcik7CisJCXNwcHBfa2VlcGFsaXZlX3RpbWVyLmV4cGlyZXM9amlmZmllcysxMCpIWjsKKwkJc3BwcF9rZWVwYWxpdmVfdGltZXIuZnVuY3Rpb249c3BwcF9rZWVwYWxpdmU7CisJCWFkZF90aW1lcigmc3BwcF9rZWVwYWxpdmVfdGltZXIpOworCX0KKwkvKiBJbnNlcnQgbmV3IGVudHJ5IGludG8gdGhlIGtlZXBhbGl2ZSBsaXN0LiAqLworCXNwLT5wcF9uZXh0ID0gc3BwcHE7CisJc3BwcHEgPSBzcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcHBwcV9sb2NrLCBmbGFncyk7CisKKwlzcC0+cHBfbG9vcGNudCA9IDA7CisJc3AtPnBwX2FsaXZlY250ID0gMDsKKwlzcC0+cHBfc2VxID0gMDsKKwlzcC0+cHBfcnNlcSA9IDA7CisJc3AtPnBwX2ZsYWdzID0gUFBfS0VFUEFMSVZFfFBQX0NJU0NPfGRlYnVnOy8qUFBfREVCVUc7Ki8KKwlzcC0+bGNwLm1hZ2ljID0gMDsKKwlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCXNwLT5wcF9pZiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc3AtPmxvY2spOworCQorCS8qIAorCSAqCURldmljZSBzcGVjaWZpYyBzZXR1cC4gQWxsIGJ1dCBpbnRlcnJ1cHQgaGFuZGxlciBhbmQKKwkgKgloYXJkX3N0YXJ0X3htaXQuCisJICovCisJIAorCWRldi0+aGFyZF9oZWFkZXIgPSBzcHBwX2hhcmRfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBzcHBwX3JlYnVpbGRfaGVhZGVyOworCWRldi0+dHhfcXVldWVfbGVuID0gMTA7CisJZGV2LT50eXBlID0gQVJQSFJEX0hETEM7CisJZGV2LT5hZGRyX2xlbiA9IDA7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHBwcF9oZWFkZXIpOworCWRldi0+bXR1ID0gUFBQX01UVTsKKwkvKgorCSAqCVRoZXNlIDQgYXJlIGNhbGxlcnMgYnV0IE1VU1QgYWxzbyBjYWxsIHNwcHBfIGZ1bmN0aW9ucworCSAqLworCWRldi0+ZG9faW9jdGwgPSBzcHBwX2RvX2lvY3RsOworI2lmIDAKKwlkZXYtPmdldF9zdGF0cyA9IE5VTEw7CQkvKiBMZXQgdGhlIGRyaXZlciBvdmVycmlkZSB0aGVzZSAqLworCWRldi0+b3BlbiA9IHNwcHBfb3BlbjsKKwlkZXYtPnN0b3AgPSBzcHBwX2Nsb3NlOworI2VuZGlmCQorCWRldi0+Y2hhbmdlX210dSA9IHNwcHBfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlID0gTlVMTDsKKwlkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBOVUxMOworCWRldi0+ZmxhZ3MgPSBJRkZfTVVMVElDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfTk9BUlA7Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9hdHRhY2gpOworCisvKioKKyAqCXNwcHBfZGV0YWNoIC0gcmVsZWFzZSBQUFAgcmVzb3VyY2VzIGZyb20gYSBkZXZpY2UKKyAqCUBkZXY6CU5ldHdvcmsgZGV2aWNlIHRvIHJlbGVhc2UKKyAqCisgKglTdG9wIGFuZCBmcmVlIHVwIGFueSBQUFAvSERMQyByZXNvdXJjZXMgdXNlZCBieSB0aGlzCisgKglpbnRlcmZhY2UuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgaXMKKyAqCWZyZWVkLgorICovCisgCit2b2lkIHNwcHBfZGV0YWNoIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcHBwICoqcSwgKnAsICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKwkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGtlZXBhbGl2ZSBsaXN0LiAqLworCWZvciAocSA9ICZzcHBwcTsgKHAgPSAqcSk7IHEgPSAmcC0+cHBfbmV4dCkKKwkJaWYgKHAgPT0gc3ApIHsKKwkJCSpxID0gcC0+cHBfbmV4dDsKKwkJCWJyZWFrOworCQl9CisKKwkvKiBTdG9wIGtlZXBhbGl2ZSBoYW5kbGVyLiAqLworCWlmICghIHNwcHBxKQorCQlkZWxfdGltZXIoJnNwcHBfa2VlcGFsaXZlX3RpbWVyKTsKKwlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcHBwcV9sb2NrLCBmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9kZXRhY2gpOworCisvKgorICogQW5hbHl6ZSB0aGUgTENQIENvbmZpZ3VyZS1SZXF1ZXN0IG9wdGlvbnMgbGlzdAorICogZm9yIHRoZSBwcmVzZW5jZSBvZiB1bmtub3duIG9wdGlvbnMuCisgKiBJZiB0aGUgcmVxdWVzdCBjb250YWlucyB1bmtub3duIG9wdGlvbnMsIGJ1aWxkIGFuZAorICogc2VuZCBDb25maWd1cmUtcmVqZWN0IHBhY2tldCwgY29udGFpbmluZyBvbmx5IHVua25vd24gb3B0aW9ucy4KKyAqLworc3RhdGljIGludAorc3BwcF9sY3BfY29uZl9wYXJzZV9vcHRpb25zIChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBsY3BfaGVhZGVyICpoLAorCWludCBsZW4sIHUzMiAqbWFnaWMpCit7CisJdTggKmJ1ZiwgKnIsICpwOworCWludCBybGVuOworCisJbGVuIC09IDQ7CisJYnVmID0gciA9IGttYWxsb2MgKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCEgYnVmKQorCQlyZXR1cm4gKDApOworCisJcCA9ICh2b2lkKikgKGgrMSk7CisJZm9yIChybGVuPTA7IGxlbj4xICYmIHBbMV07IGxlbi09cFsxXSwgcCs9cFsxXSkgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgTENQX09QVF9NQUdJQzoKKwkJCS8qIE1hZ2ljIG51bWJlciAtLSBleHRyYWN0LiAqLworCQkJaWYgKGxlbiA+PSA2ICYmIHBbMV0gPT0gNikgeworCQkJCSptYWdpYyA9ICh1MzIpcFsyXSA8PCAyNCB8CisJCQkJCSh1MzIpcFszXSA8PCAxNiB8IHBbNF0gPDwgOCB8IHBbNV07CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBMQ1BfT1BUX0FTWU5DX01BUDoKKwkJCS8qIEFzeW5jIGNvbnRyb2wgY2hhcmFjdGVyIG1hcCAtLSBjaGVjayB0byBiZSB6ZXJvLiAqLworCQkJaWYgKGxlbiA+PSA2ICYmIHBbMV0gPT0gNiAmJiAhIHBbMl0gJiYgISBwWzNdICYmCisJCQkgICAgISBwWzRdICYmICEgcFs1XSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlIExDUF9PUFRfTVJVOgorCQkJLyogTWF4aW11bSByZWNlaXZlIHVuaXQgLS0gYWx3YXlzIE9LLiAqLworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQkvKiBPdGhlcnMgbm90IHN1cHBvcnRlZC4gKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIEFkZCB0aGUgb3B0aW9uIHRvIHJlamVjdGVkIGxpc3QuICovCisJCW1lbWNweShyLCBwLCBwWzFdKTsKKwkJciArPSBwWzFdOworCQlybGVuICs9IHBbMV07CisJfQorCWlmIChybGVuKQorCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9SRUosIGgtPmlkZW50LCBybGVuLCBidWYpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIChybGVuID09IDApOworfQorCitzdGF0aWMgdm9pZCBzcHBwX2lwY3BfaW5wdXQgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGNwX2hlYWRlciAqaDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPnBwX2lmOworCWludCBsZW4gPSBza2ItPmxlbjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpKSB7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBpcGNwIHBhY2tldCBsZW5ndGg6ICVkIGJ5dGVzXG4iLAorCQkJCWRldi0+bmFtZSwgIGxlbik7CisJCXJldHVybjsKKwl9CisJaCA9IChzdHJ1Y3QgbGNwX2hlYWRlciAqKXNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2Isc2l6ZW9mKHN0cnVjdCBsY3BfaGVhZGVyKSk7CisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaXBjcCBpbnB1dDogJWQgYnl0ZXMgPCVzIGlkPSV4aCBsZW49JXhoIiwKKwkJCWRldi0+bmFtZSwgIGxlbiwKKwkJCXNwcHBfaXBjcF90eXBlX25hbWUgKGgtPnR5cGUpLCBoLT5pZGVudCwgbnRvaHMgKGgtPmxlbikpOworCQlpZiAobGVuID4gNCkKKwkJCXNwcHBfcHJpbnRfYnl0ZXMgKCh1OCopIChoKzEpLCBsZW4tNCk7CisJCXByaW50ayAoIj5cbiIpOworCX0KKwlpZiAobGVuID4gbnRvaHMgKGgtPmxlbikpCisJCWxlbiA9IG50b2hzIChoLT5sZW4pOworCXN3aXRjaCAoaC0+dHlwZSkgeworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gcGFja2V0IHR5cGUgLS0gc2VuZCBDb2RlLVJlamVjdCBwYWNrZXQuICovCisJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX0NPREVfUkVKLCArK3NwLT5wcF9zZXEsIGxlbiwgaCk7CisJCWJyZWFrOworCWNhc2UgSVBDUF9DT05GX1JFUToKKwkJaWYgKGxlbiA8IDQpIHsKKwkJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXBjcCBjb25maWd1cmUgcmVxdWVzdCBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQkJZGV2LT5uYW1lLCBsZW4pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChsZW4gPiA0KSB7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfSVBDUCwgTENQX0NPTkZfUkVKLCBoLT5pZGVudCwKKwkJCQlsZW4tNCwgaCsxKTsKKworCQkJc3dpdGNoIChzcC0+aXBjcC5zdGF0ZSkgeworCQkJY2FzZSBJUENQX1NUQVRFX09QRU5FRDoKKwkJCQkvKiBJbml0aWF0ZSByZW5lZ290aWF0aW9uLiAqLworCQkJCXNwcHBfaXBjcF9vcGVuIChzcCk7CisJCQkJLyogZmFsbCB0aHJvdWdoLi4uICovCisJCQljYXNlIElQQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCQkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kIENvbmZpZ3VyZS1BY2sgcGFja2V0LiAqLworCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0lQQ1AsIElQQ1BfQ09ORl9BQ0ssIGgtPmlkZW50LAorCQkJCTAsIE5VTEwpOworCQkJLyogQ2hhbmdlIHRoZSBzdGF0ZS4gKi8KKwkJCWlmIChzcC0+aXBjcC5zdGF0ZSA9PSBJUENQX1NUQVRFX0FDS19SQ1ZEKQorCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9PUEVORUQ7CisJCQllbHNlCisJCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0FDS19TRU5UOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBDUF9DT05GX0FDSzoKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5pcGNwLmNvbmZpZCkKKwkJCWJyZWFrOworCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJc3dpdGNoIChzcC0+aXBjcC5zdGF0ZSkgeworCQljYXNlIElQQ1BfU1RBVEVfQ0xPU0VEOgorCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0FDS19SQ1ZEOworCQkJc3BwcF9zZXRfdGltZW91dCAoc3AsIDUpOworCQkJYnJlYWs7CisJCWNhc2UgSVBDUF9TVEFURV9BQ0tfU0VOVDoKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9PUEVORUQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQ1BfQ09ORl9OQUs6CisJY2FzZSBJUENQX0NPTkZfUkVKOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmlwY3AuY29uZmlkKQorCQkJYnJlYWs7CisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJaWYgKHNwLT5pcGNwLnN0YXRlICE9IElQQ1BfU1RBVEVfQUNLX1NFTlQpCisJCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQlicmVhazsKKwljYXNlIElQQ1BfVEVSTV9SRVE6CisJCS8qIFNlbmQgVGVybWluYXRlLUFjayBwYWNrZXQuICovCisJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX1RFUk1fQUNLLCBoLT5pZGVudCwgMCwgTlVMTCk7CisJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBJUENQX1RFUk1fQUNLOgorCQkvKiBJZ25vcmUgZm9yIG5vdy4gKi8KKwljYXNlIElQQ1BfQ09ERV9SRUo6CisJCS8qIElnbm9yZSBmb3Igbm93LiAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX29wZW4gKHN0cnVjdCBzcHBwICpzcCkKK3sKKwljaGFyIG9wdFs2XTsKKworCWlmICghIHNwLT5sY3AubWFnaWMpCisJCXNwLT5sY3AubWFnaWMgPSBqaWZmaWVzOworCW9wdFswXSA9IExDUF9PUFRfTUFHSUM7CisJb3B0WzFdID0gc2l6ZW9mIChvcHQpOworCW9wdFsyXSA9IHNwLT5sY3AubWFnaWMgPj4gMjQ7CisJb3B0WzNdID0gc3AtPmxjcC5tYWdpYyA+PiAxNjsKKwlvcHRbNF0gPSBzcC0+bGNwLm1hZ2ljID4+IDg7CisJb3B0WzVdID0gc3AtPmxjcC5tYWdpYzsKKwlzcC0+bGNwLmNvbmZpZCA9ICsrc3AtPnBwX3NlcTsKKwlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9SRVEsIHNwLT5sY3AuY29uZmlkLAorCQlzaXplb2YgKG9wdCksICZvcHQpOworCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCAyKTsKK30KKworc3RhdGljIHZvaWQgc3BwcF9pcGNwX29wZW4gKHN0cnVjdCBzcHBwICpzcCkKK3sKKwlzcC0+aXBjcC5jb25maWQgPSArK3NwLT5wcF9zZXE7CisJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0lQQ1AsIElQQ1BfQ09ORl9SRVEsIHNwLT5pcGNwLmNvbmZpZCwgMCwgTlVMTCk7CisJc3BwcF9zZXRfdGltZW91dCAoc3AsIDIpOworfQorCisvKgorICogUHJvY2VzcyBQUFAgY29udHJvbCBwcm90b2NvbCB0aW1lb3V0cy4KKyAqLworIAorc3RhdGljIHZvaWQgc3BwcF9jcF90aW1lb3V0ICh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAqKSBhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCisJc3AtPnBwX2ZsYWdzICY9IH5QUF9USU1POworCWlmICghIChzcC0+cHBfaWYtPmZsYWdzICYgSUZGX1VQKSB8fCAoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChzcC0+bGNwLnN0YXRlKSB7CisJY2FzZSBMQ1BfU1RBVEVfQ0xPU0VEOgorCQkvKiBObyBBQ0sgZm9yIENvbmZpZ3VyZS1SZXF1ZXN0LCByZXRyeS4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlicmVhazsKKwljYXNlIExDUF9TVEFURV9BQ0tfUkNWRDoKKwkJLyogQUNLIGdvdCwgYnV0IG5vIENvbmZpZ3VyZS1SZXF1ZXN0IGZvciBwZWVyLCByZXRyeS4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCS8qIEFDSyBzZW50IGJ1dCBubyBBQ0sgZm9yIENvbmZpZ3VyZS1SZXF1ZXN0LCByZXRyeS4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlicmVhazsKKwljYXNlIExDUF9TVEFURV9PUEVORUQ6CisJCS8qIExDUCBpcyBhbHJlYWR5IE9LLCB0cnkgSVBDUC4gKi8KKwkJc3dpdGNoIChzcC0+aXBjcC5zdGF0ZSkgeworCQljYXNlIElQQ1BfU1RBVEVfQ0xPU0VEOgorCQkJLyogTm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJYnJlYWs7CisJCWNhc2UgSVBDUF9TVEFURV9BQ0tfUkNWRDoKKwkJCS8qIEFDSyBnb3QsIGJ1dCBubyBDb25maWd1cmUtUmVxdWVzdCBmb3IgcGVlciwgcmV0cnkuICovCisJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCQkvKiBBQ0sgc2VudCBidXQgbm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJYnJlYWs7CisJCWNhc2UgSVBDUF9TVEFURV9PUEVORUQ6CisJCQkvKiBJUENQIGlzIE9LLiAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJc3BwcF9mbHVzaF94bWl0KCk7Cit9CisKK3N0YXRpYyBjaGFyICpzcHBwX2xjcF90eXBlX25hbWUgKHU4IHR5cGUpCit7CisJc3RhdGljIGNoYXIgYnVmIFs4XTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIExDUF9DT05GX1JFUTogICByZXR1cm4gKCJjb25mLXJlcSIpOworCWNhc2UgTENQX0NPTkZfQUNLOiAgIHJldHVybiAoImNvbmYtYWNrIik7CisJY2FzZSBMQ1BfQ09ORl9OQUs6ICAgcmV0dXJuICgiY29uZi1uYWNrIik7CisJY2FzZSBMQ1BfQ09ORl9SRUo6ICAgcmV0dXJuICgiY29uZi1yZWoiKTsKKwljYXNlIExDUF9URVJNX1JFUTogICByZXR1cm4gKCJ0ZXJtLXJlcSIpOworCWNhc2UgTENQX1RFUk1fQUNLOiAgIHJldHVybiAoInRlcm0tYWNrIik7CisJY2FzZSBMQ1BfQ09ERV9SRUo6ICAgcmV0dXJuICgiY29kZS1yZWoiKTsKKwljYXNlIExDUF9QUk9UT19SRUo6ICByZXR1cm4gKCJwcm90by1yZWoiKTsKKwljYXNlIExDUF9FQ0hPX1JFUTogICByZXR1cm4gKCJlY2hvLXJlcSIpOworCWNhc2UgTENQX0VDSE9fUkVQTFk6IHJldHVybiAoImVjaG8tcmVwbHkiKTsKKwljYXNlIExDUF9ESVNDX1JFUTogICByZXR1cm4gKCJkaXNjYXJkLXJlcSIpOworCX0KKwlzcHJpbnRmIChidWYsICIleGgiLCB0eXBlKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK3N0YXRpYyBjaGFyICpzcHBwX2lwY3BfdHlwZV9uYW1lICh1OCB0eXBlKQoreworCXN0YXRpYyBjaGFyIGJ1ZiBbOF07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUENQX0NPTkZfUkVROiAgIHJldHVybiAoImNvbmYtcmVxIik7CisJY2FzZSBJUENQX0NPTkZfQUNLOiAgIHJldHVybiAoImNvbmYtYWNrIik7CisJY2FzZSBJUENQX0NPTkZfTkFLOiAgIHJldHVybiAoImNvbmYtbmFjayIpOworCWNhc2UgSVBDUF9DT05GX1JFSjogICByZXR1cm4gKCJjb25mLXJlaiIpOworCWNhc2UgSVBDUF9URVJNX1JFUTogICByZXR1cm4gKCJ0ZXJtLXJlcSIpOworCWNhc2UgSVBDUF9URVJNX0FDSzogICByZXR1cm4gKCJ0ZXJtLWFjayIpOworCWNhc2UgSVBDUF9DT0RFX1JFSjogICByZXR1cm4gKCJjb2RlLXJlaiIpOworCX0KKwlzcHJpbnRmIChidWYsICIleGgiLCB0eXBlKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfcHJpbnRfYnl0ZXMgKHVfY2hhciAqcCwgdTE2IGxlbikKK3sKKwlwcmludGsgKCIgJXgiLCAqcCsrKTsKKwl3aGlsZSAoLS1sZW4gPiAwKQorCQlwcmludGsgKCItJXgiLCAqcCsrKTsKK30KKworLyoqCisgKglzcHBwX3JjdiAtCXJlY2VpdmUgYW5kIHByb2Nlc3MgYSBXQU4gUFBQIGZyYW1lCisgKglAc2tiOglUaGUgYnVmZmVyIHRvIHByb2Nlc3MKKyAqCUBkZXY6CVRoZSBkZXZpY2UgaXQgYXJyaXZlZCBvbgorICoJQHA6IFVudXNlZAorICoKKyAqCVByb3RvY29sIGdsdWUuIFRoaXMgZHJpdmVzIHRoZSBkZWZlcnJlZCBwcm9jZXNzaW5nIG1vZGUgdGhlIHBvb3JlcgorICoJY2FyZHMgdXNlLiBUaGlzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2FyZHMgdGhhdCBkbyBub3QgaGF2ZQorICoJdGltaW5nIGNvbnN0cmFpbnRzIGJ1dCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgbmV0d29yayBsYXllcgorICoJYWZ0ZXIgaW50ZXJydXB0IHNlcnZpY2luZyB0byBwcm9jZXNzIGZyYW1lcyBxdWV1ZWQgdmlhIG5ldGlmX3J4LgorICovCisKK3N0YXRpYyBpbnQgc3BwcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwKQoreworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKwlzcHBwX2lucHV0KGRldixza2IpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGFja2V0X3R5cGUgc3BwcF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCksCisJLmZ1bmMJPSBzcHBwX3JjdiwKK307CisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSAKKwlLRVJOX0lORk8gIkNyb255eCBMdGQsIFN5bmNocm9ub3VzIFBQUCBhbmQgQ0lTQ08gSERMQyAoYykgMTk5NFxuIgorCUtFUk5fSU5GTyAiTGludXggcG9ydCAoYykgMTk5OCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkICYgIgorCQkgICJKYW4gXCJZZW55YVwiIEthc3ByemFrLlxuIjsKKworc3RhdGljIGludCBfX2luaXQgc3luY19wcHBfaW5pdCh2b2lkKQoreworCWlmKGRlYnVnKQorCQlkZWJ1Zz1QUF9ERUJVRzsKKwlwcmludGsoYmFubmVyKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ0eF9xdWV1ZSk7CisJZGV2X2FkZF9wYWNrKCZzcHBwX3BhY2tldF90eXBlKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3luY19wcHBfY2xlYW51cCh2b2lkKQoreworCWRldl9yZW1vdmVfcGFjaygmc3BwcF9wYWNrZXRfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KHN5bmNfcHBwX2luaXQpOworbW9kdWxlX2V4aXQoc3luY19wcHBfY2xlYW51cCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW5waXBlX211bHRwcHAuYyBiL2RyaXZlcnMvbmV0L3dhbi93YW5waXBlX211bHRwcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE2OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnBpcGVfbXVsdHBwcC5jCkBAIC0wLDAgKzEsMjM1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHdhbnBpcGVfbXVsdHBwcC5jIE11bHRpLVBvcnQgUFBQIGRyaXZlciBtb2R1bGUuCisqCisqIEF1dGhvcnM6IAlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIERlYyAxNSAyMDAwICAgVXBkYXRlZCBmb3IgMi40Llgga2VybmVsCisqIE5vdiAxNSAyMDAwICAgRml4ZWQgdGhlIFN5bmNQUFAgc3VwcG9ydCBmb3Iga2VybmVscyAyLjIuMTYgYW5kIGhpZ2hlci4KKyogICAJCVRoZSBwcHBzdHJ1Y3QgaGFzIGNoYW5nZWQuCisqIEp1bCAxMyAyMDAwCVVzaW5nIHRoZSBrZXJuZWwgU3luY3BwcCBtb2R1bGUgb24gdG9wIG9mIFJBVyBXYW5waXBlIENIRExDCisqICAJCW1vZHVsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4JCS8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgkKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogaHRvbnMoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NkbGFfY2hkbGMuaD4JCS8qIENIRExDIGZpcm13YXJlIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFfYXN5Lmg+ICAgICAgICAgICAJLyogQ0hETEMgKGFzeW5jKSBBUEkgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmg+ICAgIC8qIFNvY2tldCBEcml2ZXIgY29tbW9uIGFyZWEgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlLmg+CQkKKworCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYJX0RFQlVHXworI2RlZmluZQlTVEFUSUMKKyNlbHNlCisjZGVmaW5lCVNUQVRJQwkJc3RhdGljCisjZW5kaWYKKworLyogcmVhc29ucyBmb3IgZW5hYmxpbmcgdGhlIHRpbWVyIGludGVycnVwdCBvbiB0aGUgYWRhcHRlciAqLworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVURQICAgCTB4MDEKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VQREFURQkweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcgIDB4MDQKKyAKKyNkZWZpbmUJQ0hETENfREZMVF9EQVRBX0xFTgkxNTAwCQkvKiBkZWZhdWx0IE1UVSAqLworI2RlZmluZSBDSERMQ19IRFJfTEVOCQkxCisKKyNkZWZpbmUgSUZGX1BPSU5UVE9QT0lOVCAweDEwCisKKyNkZWZpbmUgQ0hETENfQVBJIDB4MDEKKworI2RlZmluZSBQT1JUKHgpICAgKHggPT0gMCA/ICJQUklNQVJZIiA6ICJTRUNPTkRBUlkiICkKKyNkZWZpbmUgTUFYX0JIX0JVRkYJMTAKKworI2RlZmluZSBDUkNfTEVOR1RIIAkyIAorI2RlZmluZSBQUFBfSEVBREVSX0xFTiAJNAorIAorLyoqKioqKkRhdGEgU3RydWN0dXJlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW4gdGhlIHByaXZhdGUgZGF0YSBhcmVhIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIGNhcmQgc3RydWN0dXJlIHVzZWQgdG8gb2NjdXB5IHRoZSBwcml2YXRlIGFyZWEgYnV0IG5vdyB0aGUgZm9sbG93aW5nIAorICogc3RydWN0dXJlIHdpbGwgaW5jb3Jwb3JhdGUgdGhlIGNhcmQgc3RydWN0dXJlIGFsb25nIHdpdGggQ0hETEMgc3BlY2lmaWMgZGF0YQorICovCisKK3R5cGVkZWYgc3RydWN0IGNoZGxjX3ByaXZhdGVfYXJlYQoreworCXZvaWQgKmlmX3B0cjsJCQkJLyogR2VuZXJhbCBQb2ludGVyIHVzZWQgYnkgU1BQUCAqLworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOworCXNkbGFfdAkJKmNhcmQ7CisJaW50IAkJVHJhY2luZ0VuYWJsZWQ7CQkvKiBGb3IgZW5hYmxpbmcgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCWN1cnJfdHJhY2VfYWRkcjsJLyogVXNlZCBmb3IgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCXN0YXJ0X3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJZW5kX3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIAllbmRfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgc2hvcnQgCW51bWJlcl90cmFjZV9lbGVtZW50czsKKwl1bnNpZ25lZCAgCWF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisJdW5zaWduZWQgbG9uZyAJcm91dGVyX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgY2hhciAJcm91dGVfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3JlbW92ZWQ7CisJdW5zaWduZWQgbG9uZyAJdGlja19jb3VudGVyOwkJLyogRm9yIDVzIHRpbWVvdXQgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl91cF90aW1lOworICAgICAgICB1MzIgICAgICAgICAgICAgSVBfYWRkcmVzczsJCS8qIElQIGFkZHJlc3NpbmcgKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX25ldG1hc2s7CisJdW5zaWduZWQgY2hhciAgbWM7CQkJLyogTXVsaXRjYXN0IHN1cHBvcnQgb24vb2ZmICovCisJdW5zaWduZWQgc2hvcnQgdWRwX3BrdF9sZ3RoOwkJLyogdWRwIHBhY2tldCBwcm9jZXNzaW5nICovCisJY2hhciB1ZHBfcGt0X3NyYzsKKwljaGFyIHVkcF9wa3RfZGF0YVtNQVhfTEdUSF9VRFBfTUdOVF9QS1RdOworCXVuc2lnbmVkIHNob3J0IHRpbWVyX2ludF9lbmFibGVkOworCWNoYXIgdXBkYXRlX2NvbW1zX3N0YXRzOwkJLyogdXBkYXRpbmcgY29tbXMgc3RhdHMgKi8KKworCS8vRklYTUU6IGFkZCBkcml2ZXIgc3RhdHMgYXMgcGVyIGZyYW1lIHJlbGF5IQorCit9IGNoZGxjX3ByaXZhdGVfYXJlYV90OworCisvKiBSb3V0ZSBTdGF0dXMgb3B0aW9ucyAqLworI2RlZmluZSBOT19ST1VURQkweDAwCisjZGVmaW5lIEFERF9ST1VURQkweDAxCisjZGVmaW5lIFJPVVRFX0FEREVECTB4MDIKKyNkZWZpbmUgUkVNT1ZFX1JPVVRFCTB4MDMKKworCisvKiB2YXJpYWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBlbmFibGluZy9kaXNhYmxpbmcgRlQxIG1vbml0b3Igc3RhdHVzICovCitzdGF0aWMgaW50IHJDb3VudCA9IDA7CisKKy8qIHZhcmlhYmxlIGZvciB0cmFja2luZyBob3cgbWFueSBpbnRlcmZhY2VzIHRvIG9wZW4gZm9yIFdBTlBJUEUgb24gdGhlCisgICB0d28gcG9ydHMgKi8KKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXQU4gbGluayBkcml2ZXIgZW50cnkgcG9pbnRzLiBUaGVzZSBhcmUgY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpOworc3RhdGljIGludCBuZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICB3YW5pZl9jb25mX3QqIGNvbmYpOworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKKy8qIE5ldHdvcmsgZGV2aWNlIGludGVyZmFjZSAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIENIRExDIEZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29uZmlndXJlIAkoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhKTsKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgCShzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjaGRsY19jb21tX2Rpc2FibGUgCShzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjaGRsY19yZWFkX3ZlcnNpb24gCShzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cik7CitzdGF0aWMgaW50IGNoZGxjX3NldF9pbnRyX21vZGUgCShzZGxhX3QqIGNhcmQsIHVuc2lnbmVkIG1vZGUpOworc3RhdGljIGludCBjaGRsY19zZW5kIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNvbmZpZ19jaGRsYyAoc2RsYV90ICpjYXJkKTsKKworCisvKiBNaXNjZWxsYW5lb3VzIENIRExDIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZXRfY2hkbGNfY29uZmlnIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgaW5pdF9jaGRsY190eF9yeF9idWZmKHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoZGxjX2Vycm9yIChzZGxhX3QgKmNhcmQsIGludCBlcnIsIENIRExDX01BSUxCT1hfU1RSVUNUICptYik7CitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCB1cGRhdGVfY29tbXNfc3RhdHMoc2RsYV90KiBjYXJkLAorICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyB2b2lkIHBvcnRfc2V0X3N0YXRlIChzZGxhX3QgKmNhcmQsIGludCk7CisKKy8qIEludGVycnVwdCBoYW5kbGVycyAqLworc3RhdGljIHZvaWQgd3NwcHBfaXNyIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICopOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApOworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKnNrYiAsIHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHN0b3JlX3VkcF9tZ210X3BrdChjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgIAorCQkJCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgczUwOF91bmxvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIHNlbmRfcHBwX3Rlcm1fcmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCitzdGF0aWMgaW50ICBJbnRyX3Rlc3RfY291bnRlcjsKKy8qKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENpc2NvIEhETEMgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFdBTlBJUEUgbW9kdWxlIGR1cmluZyBzZXR1cC4gIEF0IHRoaXMKKyAqIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCBhbmQgZmlybXdhcmUgaXMgcnVubmluZy4KKyAqICBvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLgorICovCitpbnQgd3NwcHBfaW5pdCAoc2RsYV90KiBjYXJkLCB3YW5kZXZfY29uZl90KiBjb25mKQoreworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW07CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIG1heF9wZXJtaXR0ZWRfYmF1ZCA9IDA7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisKKwl1bmlvbgorCQl7CisJCWNoYXIgc3RyWzgwXTsKKwkJfSB1OworCXZvbGF0aWxlIENIRExDX01BSUxCT1hfU1RSVUNUKiBtYjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIxOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfTVBQUCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbmQgb3V0IHdoaWNoIFBvcnQgdG8gdXNlICovCisJaWYgKChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSkgfHwgKGNvbmYtPmNvbW1fcG9ydCA9PSBXQU5PUFRfU0VDKSl7CisJCWlmIChjYXJkLT5uZXh0KXsKKworCQkJaWYgKGNvbmYtPmNvbW1fcG9ydCAhPSBjYXJkLT5uZXh0LT51LmMuY29tbV9wb3J0KXsKKwkJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRVJST1IgLSAlcyBwb3J0IHVzZWQhXG4iLAorICAgICAgICAJCSAgICAgICAgCWNhcmQtPndhbmRldi5uYW1lLCBQT1JUKGNvbmYtPmNvbW1fcG9ydCkpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9ZWxzZXsKKwkJCWNhcmQtPnUuYy5jb21tX3BvcnQgPSBjb25mLT5jb21tX3BvcnQ7CisJCX0KKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRVJST1IgLSBJbnZhbGlkIFBvcnQgU2VsZWN0ZWQhXG4iLAorICAgICAgICAgICAgICAgIAkJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisKKwkJaWYgKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSl7CQorCQkJY2FyZC0+bWJveCAgPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlOworCQl9ZWxzZXsKKwkJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIAorCQkJCVNFQ19CQVNFX0FERFJfTUJfU1RSVUNUIC0gUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX0JCisJfWVsc2V7IAorCQkvKiBmb3IgYSBTNTE0IGFkYXB0ZXIsIHNldCBhIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBtYWlsYm94IGluIHRoZSAqLworCQkvKiBhbGxvY2F0ZWQgdmlydHVhbCBtZW1vcnkgYXJlYSAqLworCQlpZiAoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfUFJJKXsKKwkJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX1lbHNleworCQkJY2FyZC0+bWJveCA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyBTRUNfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfQkKKwl9CisKKwltYiA9IG1iMSA9IGNhcmQtPm1ib3g7CisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCisJCS8qIFRoZSBib2FyZCB3aWxsIHBsYWNlIGFuICdJJyBpbiB0aGUgcmV0dXJuIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcworCSAgIAlyZWFkeSB0byBhY2NlcHQgY29tbWFuZHMuICBXZSBleHBlY3QgdGhpcyB0byBiZSBjb21wbGV0ZWQgaW4gbGVzcworICAgICAgICAgICAJdGhhbiAxIHNlY29uZC4gKi8KKworCQl0aW1lb3V0ID0gamlmZmllczsKKwkJd2hpbGUgKG1iLT5yZXR1cm5fY29kZSAhPSAnSScpCS8qIFdhaXQgMXMgZm9yIGJvYXJkIHRvIGluaXRpYWxpemUgKi8KKwkJCWlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gMSpIWikgYnJlYWs7CisKKwkJaWYgKG1iLT5yZXR1cm5fY29kZSAhPSAnSScpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZWQgYnkgYWRhcHRlclxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgcmVwcmVzZW50YXRpdmUuXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisKKwlpZiAoY2hkbGNfcmVhZF92ZXJzaW9uKGNhcmQsIHUuc3RyKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBSYXcgQ0hETEMgZmlybXdhcmUgdiVzXG4iIAorCQkJICIlczogZm9yIE11bHRpLVBvcnQgUFBQIHByb3RvY29sLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUsdS5zdHIsY2FyZC0+ZGV2bmFtZSk7IAorCisJY2FyZC0+aXNyCQkJPSAmd3NwcHBfaXNyOworCWNhcmQtPnBvbGwJCQk9IE5VTEw7CisJY2FyZC0+ZXhlYwkJCT0gTlVMTDsKKwljYXJkLT53YW5kZXYudXBkYXRlCQk9ICZ1cGRhdGU7CisgCWNhcmQtPndhbmRldi5uZXdfaWYJCT0gJm5ld19pZjsKKwljYXJkLT53YW5kZXYuZGVsX2lmCQk9ICZkZWxfaWY7CisJY2FyZC0+d2FuZGV2LnVkcF9wb3J0ICAgCT0gY29uZi0+dWRwX3BvcnQ7CisKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCA9IDA7CisKKwkvKiByZXNldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSAndXBkYXRlKCknIHByb2MgaGFzIGJlZW4gY2FsbGVkICovCisJY2FyZC0+dS5jLnVwZGF0ZV9jYWxsX2NvdW50ID0gMDsKKwkKKwljYXJkLT53YW5kZXYudHRsID0gY29uZi0+dHRsOworCWNhcmQtPndhbmRldi5pbnRlcmZhY2UgPSBjb25mLT5pbnRlcmZhY2U7IAorCisJaWYgKChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9TRUMgJiYgY29uZi0+aW50ZXJmYWNlID09IFdBTk9QVF9WMzUpJiYKKwkgICAgY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IgLSBWMzUgSW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQgb24gUzUwOCAlcyBwb3J0IFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIFBPUlQoY2FyZC0+dS5jLmNvbW1fcG9ydCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKworCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IGNvbmYtPmNsb2NraW5nOworCisJcG9ydF9udW0gPSBjYXJkLT51LmMuY29tbV9wb3J0OworCisJLyogU2V0dXAgUG9ydCBCcHMgKi8KKworCWlmKGNhcmQtPndhbmRldi5jbG9ja2luZykgeworCQlpZigocG9ydF9udW0gPT0gV0FOT1BUX1BSSSkgfHwgY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgeworCQkJLyogRm9yIFByaW1hcnkgUG9ydCAwICovCisgICAgICAgICAgICAgICAJCW1heF9wZXJtaXR0ZWRfYmF1ZCA9CisJCQkJKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/CisJCQkJUFJJX01BWF9CQVVEX1JBVEVfUzUxNCA6IAorCQkJCVBSSV9NQVhfQkFVRF9SQVRFX1M1MDg7CisJCX0KKwkJZWxzZSBpZihwb3J0X251bSA9PSBXQU5PUFRfU0VDKSB7CisJCQkvKiBGb3IgU2Vjb25kYXJ5IFBvcnQgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3Blcm1pdHRlZF9iYXVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01BWF9CQVVEX1JBVEVfUzUxNCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgIAorCQkJaWYoY29uZi0+YnBzID4gbWF4X3Blcm1pdHRlZF9iYXVkKSB7CisJCQkJY29uZi0+YnBzID0gbWF4X3Blcm1pdHRlZF9iYXVkOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCYXVkIHRvbyBoaWdoIVxuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCByYXRlIHNldCB0byAlbHUgYnBzXG4iLCAKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsIG1heF9wZXJtaXR0ZWRfYmF1ZCk7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJY2FyZC0+d2FuZGV2LmJwcyA9IGNvbmYtPmJwczsKKwl9ZWxzZXsKKyAgICAgICAgCWNhcmQtPndhbmRldi5icHMgPSAwOworICAJfQorCisJLyogU2V0dXAgdGhlIFBvcnQgTVRVICovCisJaWYoKHBvcnRfbnVtID09IFdBTk9QVF9QUkkpIHx8IGNhcmQtPnUuYy5yZWNlaXZlX29ubHkpIHsKKworCQkvKiBGb3IgUHJpbWFyeSBQb3J0IDAgKi8KKwkJY2FyZC0+d2FuZGV2Lm10dSA9CisJCQkoY29uZi0+bXR1ID49IE1JTl9MR1RIX0NIRExDX0RBVEFfQ0ZHKSA/CisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPm10dSwgUFJJX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisJCQlDSERMQ19ERkxUX0RBVEFfTEVOOworCX0gZWxzZSBpZihwb3J0X251bSA9PSBXQU5PUFRfU0VDKSB7IAorCQkvKiBGb3IgU2Vjb25kYXJ5IFBvcnQgMSAqLworCQljYXJkLT53YW5kZXYubXR1ID0KKwkJCShjb25mLT5tdHUgPj0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkcpID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBTRUNfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIDoKKwkJCUNIRExDX0RGTFRfREFUQV9MRU47CisJfQorCisJLyogQWRkIG9uIGEgUFBQIEhlYWRlciAqLworCWNhcmQtPndhbmRldi5tdHUgKz0gUFBQX0hFQURFUl9MRU47CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBzdGF0dXMgYXJlYSAqLworCS8qIFJlYWQgdGhlIENIRExDIENvbmZpZ3VyYXRpb24gYW5kIG9idGFpbjogCisJICoJUHRyIHRvIHNoYXJlZCBtZW1vcnkgaW5mb3Igc3RydWN0CisgICAgICAgICAqIFVzZSB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBjYXJkLT51LmMuZmxhZ3MgIQorIAkgKi8KKwltYjEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iMS0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIxKSA/IG1iMS0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljbGVhcl9iaXQoMSwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCisgICAgICAgICAgICAgICAgaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisgICAgICAgICAgICAgICAgCWVuYWJsZV9pcnEoY2FyZC0+aHcuaXJxKTsKKworCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iMSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKyAgICAgICAgICAgICAgIAljYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgIAkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0KSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5mbGFncyA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0ICUgU0RMQV9XSU5ET1dTSVpFKSk7CisJfQorCQorCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCQorCS8qIFRoaXMgaXMgZm9yIHRoZSBwb3J0cyBsaW5rIHN0YXRlICovCisJY2FyZC0+d2FuZGV2LnN0YXRlID0gV0FOX0RVQUxQT1JUOworCWNhcmQtPnUuYy5zdGF0ZSA9IFdBTl9ESVNDT05ORUNURUQ7CisKKworCWlmICghY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayl7CisJCWVyciA9IGludHJfdGVzdChjYXJkKTsKKworCQlpZihlcnIgfHwgKEludHJfdGVzdF9jb3VudGVyIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSKSkgeyAKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVycnVwdCB0ZXN0IGZhaWxlZCAoJWkpXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQbGVhc2UgY2hvb3NlIGFub3RoZXIgaW50ZXJydXB0XG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAgLUVJTzsKKwkJfQorCQkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgdGVzdCBwYXNzZWQgKCVpKVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCX0KKworCisJaWYgKGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9USU1FUikpeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZXQgaW50ZXJydXB0IHRyaWdnZXJzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FSU87CQorICAgICAgICB9CisJCisJLyogTWFzayB0aGUgVGltZXIgaW50ZXJydXB0ICovCisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJfkFQUF9JTlRfT05fVElNRVI7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBkZXZpY2Ugc3RhdHVzICYgc3RhdGlzdGljcworICogVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHdoZW4gdXBkYXRpbmcgdGhlIFBST0MgZmlsZSBzeXN0ZW0gYW5kIHJldHVybnMKKyAqIHZhcmlvdXMgY29tbXVuaWNhdGlvbnMgc3RhdGlzdGljcy4gVGhlc2Ugc3RhdGlzdGljcyBhcmUgYWNjdW11bGF0ZWQgZnJvbSAzIAorICogZGlmZmVyZW50IGxvY2F0aW9uczoKKyAqIAkxKSBUaGUgJ2lmX3N0YXRzJyByZWNvcmRlZCBmb3IgdGhlIGRldmljZS4KKyAqIAkyKSBDb21tdW5pY2F0aW9uIGVycm9yIHN0YXRpc3RpY3Mgb24gdGhlIGFkYXB0ZXIuCisgKiAgICAgIDMpIENIRExDIG9wZXJhdGlvbmFsIHN0YXRpc3RpY3Mgb24gdGhlIGFkYXB0ZXIuCisgKiBUaGUgYm9hcmQgbGV2ZWwgc3RhdGlzdGljcyBhcmUgcmVhZCBkdXJpbmcgYSB0aW1lciBpbnRlcnJ1cHQuIE5vdGUgdGhhdCB3ZSAKKyAqIHJlYWQgdGhlIGVycm9yIGFuZCBvcGVyYXRpb25hbCBzdGF0aXN0aWNzIGR1cmluZyBjb25zZWNpdGl2ZSB0aW1lciB0aWNrcyBzbworICogYXMgdG8gbWluaW1pemUgdGhlIHRpbWUgdGhhdCB3ZSBhcmUgaW5zaWRlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpCit7CisJc2RsYV90KiBjYXJkID0gd2FuZGV2LT5wcml2YXRlOworIAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgICAgICB2b2xhdGlsZSBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworICAgICAgICBTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYoKHdhbmRldiA9PSBOVUxMKSB8fCAod2FuZGV2LT5wcml2YXRlID09IE5VTEwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlpZih3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogbW9yZSBzYW5pdHkgY2hlY2tzICovCisgICAgICAgIGlmKCFjYXJkLT51LmMuZmxhZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKwlpZigoZGV2PWNhcmQtPndhbmRldi5kZXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisKKyAgICAgICAJaWYoY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMpeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCQkKKwkvKiB3ZSB3aWxsIG5lZWQgMiB0aW1lciBpbnRlcnJ1cHRzIHRvIGNvbXBsZXRlIHRoZSAqLworCS8qIHJlYWRpbmcgb2YgdGhlIHN0YXRpc3RpY3MgKi8KKwljaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDI7CisgICAgICAgCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9USU1FUjsKKwljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkID0gVE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKyAgCisJLyogd2FpdCBhIG1heGltdW0gb2YgMSBzZWNvbmQgZm9yIHRoZSBzdGF0aXN0aWNzIHRvIGJlIHVwZGF0ZWQgKi8gCisgICAgICAgIHRpbWVvdXQgPSBqaWZmaWVzOworICAgICAgICBmb3IoOzspIHsKKwkJaWYoY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPT0gMCkKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gKDEgKiBIWikpeworICAgIAkJCWNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID0gMDsKKyAJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9CisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7IAorIAkJCXJldHVybiAtRUFHQUlOOworCQl9CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ3JlYXRlIG5ldyBsb2dpY2FsIGNoYW5uZWwuCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSByb3V0ZXIgd2hlbiBST1VURVJfSUZORVcgSU9DVEwgaXMgYmVpbmcKKyAqIGhhbmRsZWQuCisgKiBvIHBhcnNlIG1lZGlhLSBhbmQgaGFyZHdhcmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogbyBtYWtlIHN1cmUgdGhhdCBhIG5ldyBjaGFubmVsIGNhbiBiZSBjcmVhdGVkCisgKiBvIGFsbG9jYXRlIHJlc291cmNlcywgaWYgbmVjZXNzYXJ5CisgKiBvIHByZXBhcmUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIGZvciByZWdpc3RhcmF0aW9uLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUgKGNoYW5uZWwgd2lsbCBub3QgYmUgY3JlYXRlZCkKKyAqLworc3RhdGljIGludCBuZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIHBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKQoreworCisJc3RydWN0IHBwcF9kZXZpY2UgKnBwcGRldiA9IChzdHJ1Y3QgcHBwX2RldmljZSAqKXBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNwcHAgKnNwOworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCQorCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkJCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJY2hkbGNfcHJpdl9hcmVhID0ga21hbGxvYyhzaXplb2YoY2hkbGNfcHJpdmF0ZV9hcmVhX3QpLCBHRlBfS0VSTkVMKTsKKwkKKwlpZihjaGRsY19wcml2X2FyZWEgPT0gTlVMTCkgCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNoZGxjX3ByaXZfYXJlYSwgMCwgc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSk7CisKKwljaGRsY19wcml2X2FyZWEtPmNhcmQgPSBjYXJkOyAKKworCS8qIGluaXRpYWxpemUgZGF0YSAqLworCXN0cmNweShjYXJkLT51LmMuaWZfbmFtZSwgY29uZi0+bmFtZSk7CisKKwlpZihjYXJkLT53YW5kZXYubmV3X2lmX2NudCA+IDApIHsKKyAgICAgICAgICAgICAgICBrZnJlZShjaGRsY19wcml2X2FyZWEpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCsrOworCisJY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisKKwkvL1dlIGRvbid0IG5lZWQgdGhpcyBhbnkgbW9yZQorCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID0gTk9fUk9VVEU7CisJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBGaXJtd2FyZSBydW5uaW5nIGluIEhETEMgU1RSRUFNSU5HIE1vZGVcbiIsCisJCXdhbmRldi0+bmFtZSk7CisJCisJLyogU2V0dXAgd2FucGlwZSBhcyBhIHJvdXRlciAoV0FOUElQRSkgb3IgYXMgYW4gQVBJICovCisJaWYoIHN0cmNtcChjb25mLT51c2VkYnksICJXQU5QSVBFIikgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRHJpdmVyIHJ1bm5pbmcgaW4gV0FOUElQRSBtb2RlIVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCWNhcmQtPnUuYy51c2VkYnkgPSBXQU5QSVBFOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IEFQSSBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFN5bmNQUFAhXG4iLAorCQkJd2FuZGV2LT5uYW1lKTsKKwkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IE11bHRpY2FzdCBJbmZvcm1hdGlvbiAqLworCWNoZGxjX3ByaXZfYXJlYS0+bWMgPSBjb25mLT5tYzsKKworCisJY2hkbGNfcHJpdl9hcmVhLT5pZl9wdHIgPSBwcHBkZXY7CisKKwkvKiBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIGRhdGEgc3BhY2UgZm9yIHJlZ2lzdHJhdGlvbiAqLworCisJc3RyY3B5KGRldi0+bmFtZSxjYXJkLT51LmMuaWZfbmFtZSk7CisKKwkvKiBBdHRhY2ggUFBQIHByb3RvY29sIGxheWVyIHRvIHBwcGRldgorCSAqIFRoZSBzcHBwX2F0dGFjaCgpIHdpbGwgaW5pdGlsaXplIHRoZSBkZXYgc3RydWN0dXJlCisgICAgICAgICAqIGFuZCBzZXR1cCBwcHAgbGF5ZXIgcHJvdG9jb2xzLgorICAgICAgICAgKiBBbGwgd2UgaGF2ZSB0byBkbyBpcyB0byBiaW5kIGluOgorICAgICAgICAgKiAgICAgICAgaWZfb3BlbigpLCBpZl9jbG9zZSgpLCBpZl9zZW5kKCkgYW5kIGdldF9zdGF0cygpIGZ1bmN0aW9ucy4KKyAgICAgICAgICovCisJc3BwcF9hdHRhY2gocHBwZGV2KTsKKwlkZXYgPSBwcHBkZXYtPmRldjsKKwlzcCA9ICZwcHBkZXYtPnNwcHA7CisJCisJLyogRW5hYmxlIFBQUCBEZWJ1Z2dpbmcgKi8KKwkvLyBGSVhNRSBGaXggdGhpcyB1cCBzb21laG93CisJLy9zcC0+cHBfZmxhZ3MgfD0gUFBfREVCVUc7IAkKKwlzcC0+cHBfZmxhZ3MgJj0gflBQX0NJU0NPOworCisJZGV2LT5pbml0ID0gJmlmX2luaXQ7CisJZGV2LT5wcml2ID0gY2hkbGNfcHJpdl9hcmVhOworCQorCXJldHVybiAwOworfQorCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlbGV0ZSBsb2dpY2FsIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBzbXBfbG9jazsKKwkKKwkvKiBEZXRhY2ggdGhlIFBQUCBsYXllciAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXRhY2hpbmcgU3luY1BQUCBNb2R1bGUgZnJvbSAlc1xuIiwKKwkJCXdhbmRldi0+bmFtZSxkZXYtPm5hbWUpOworCisJbG9ja19hZGFwdGVyX2lycSgmd2FuZGV2LT5sb2NrLCZzbXBfbG9jayk7CisKKwlzcHBwX2RldGFjaChkZXYpOworCWNoZGxjX3ByaXZfYXJlYS0+aWZfcHRyPU5VTEw7CisJCisJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCAwKTsKKwlpZiAoY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCkKKwkJY2hkbGNfY29tbV9kaXNhYmxlKGNhcmQpOworCXVubG9ja19hZGFwdGVyX2lycSgmd2FuZGV2LT5sb2NrLCZzbXBfbG9jayk7CisJCisJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqIE5ldHdvcmsgRGV2aWNlIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIExpbnV4IG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoIGludGVyZmFjZSwgZHVyaW5nIExpbnV4IG5ldHdvcmsKKyAqIGludGVyZmFjZSByZWdpc3RyYXRpb24uICBSZXR1cm5pbmcgYW55dGhpbmcgYnV0IHplcm8gd2lsbCBmYWlsIGludGVyZmFjZQorICogcmVnaXN0cmF0aW9uLgorICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwkKKwkvKiBOT1RFOiBNb3N0IG9mIHRoZSBkZXYgaW5pdGlhbGl6YXRpb24gd2FzCisgICAgICAgICAqICAgICAgIGRvbmUgaW4gc3BwcF9hdHRhY2goKSwgY2FsbGVkIGJ5IG5ld19pZigpIAorICAgICAgICAgKiAgICAgICBmdW5jdGlvbi4gQWxsIHdlIGhhdmUgdG8gZG8gaGVyZSBpcworICAgICAgICAgKiAgICAgICB0byBsaW5rIGZvdXIgbWFqb3Igcm91dGluZXMgYmVsb3cuIAorICAgICAgICAgKi8KKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KKwlkZXYtPm9wZW4JCT0gJmlmX29wZW47CisJZGV2LT5zdG9wCQk9ICZpZl9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisKKworCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVycyAqLworCWRldi0+aXJxCT0gd2FuZGV2LT5pcnE7CisJZGV2LT5kbWEJPSB3YW5kZXYtPmRtYTsKKwlkZXYtPmJhc2VfYWRkcgk9IHdhbmRldi0+aW9wb3J0OworCWRldi0+bWVtX3N0YXJ0CT0gd2FuZGV2LT5tYWRkcjsKKwlkZXYtPm1lbV9lbmQJPSB3YW5kZXYtPm1hZGRyICsgd2FuZGV2LT5tc2l6ZSAtIDE7CisKKwkvKiBTZXQgdHJhbnNtaXQgYnVmZmVyIHF1ZXVlIGxlbmd0aCAKKyAgICAgICAgICogSWYgd2Ugb3ZlciBmaWxsIHRoaXMgcXVldWUgdGhlIHBhY2tldHMgd2lsbAorICAgICAgICAgKiBiZSBkcm9wZWQgYnkgdGhlIGtlcm5lbC4KKyAgICAgICAgICogc3BwcF9hdHRhY2goKSBzZXRzIHRoaXMgdG8gMTAsIGJ1dAorICAgICAgICAgKiAxMDAgd2lsbCBnaXZlIHVzIG1vcmUgcm9vbSBhdCBsb3cgc3BlZWRzLgorCSAqLworICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKyAgIAorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIHRyYW5zbWl0IHRpbWVvdXQgZXZlbnQgZnJvbSBuZXRpZiB3YXRjaGRvZworICovCitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJCisJLyogSWYgb3VyIGRldmljZSBzdGF5cyBidXN5IGZvciBhdCBsZWFzdCA1IHNlY29uZHMgdGhlbiB3ZSB3aWxsCisJICoga2ljayBzdGFydCB0aGUgZGV2aWNlIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMC4gIFdlIGV4cGVjdAorCSAqIHRoYXQgb3VyIGRldmljZSBuZXZlciBzdGF5cyBidXN5IG1vcmUgdGhhbiA1IHNlY29uZHMuIFNvIHRoaXMgICAgICAgICAgICAgICAgIAorCSAqIGlzIG9ubHkgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LgorCSAqLworCisJKytjYXJkLT53YW5kZXYuc3RhdHMuY29sbGlzaW9uczsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZWQgb3V0IG9uICVzXG4iLCBjYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcHJldmVudCBtb2R1bGUgZnJvbSB1bmxvYWRpbmcgYnkgaW5jcmVtZW50aW5nIHVzZSBjb3VudAorICoKKyAqIFJldHVybiAwIGlmIE8uay4gb3IgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCXN0cnVjdCB0aW1ldmFsIHR2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisJLyogT25seSBvbmUgb3BlbiBwZXIgaW50ZXJmYWNlIGlzIGFsbG93ZWQgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogU3RhcnQgUFBQIExheWVyICovCisJaWYgKHNwcHBfb3BlbihkZXYpKXsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZSA9IHR2LnR2X3NlYzsKKyAKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXdhbnBpcGVfb3BlbihjYXJkKTsKKworCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xvc2UgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2xvc2UsIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKworCS8qIFN0b3AgdGhlIFBQUCBMYXllciAqLworCXNwcHBfY2xvc2UoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gc2V0IHRidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pIHRvIGJsb2NrIGEgdGltZXItYmFzZWQKKyAqICAgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKyAqIG8gY2hlY2sgbGluayBzdGF0ZS4gSWYgbGluayBpcyBub3QgdXAsIHRoZW4gZHJvcCB0aGUgcGFja2V0LgorICogbyBleGVjdXRlIGFkYXB0ZXIgc2VuZCBjb21tYW5kLgorICogbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiBOb3RlczoKKyAqIDEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAyLiBTZXR0aW5nIHRidXN5IGZsYWcgd2lsbCBpbmhpYml0IGZ1cnRoZXIgdHJhbnNtaXQgcmVxdWVzdHMgZnJvbSB0aGUKKyAqICAgIHByb3RvY29sIHN0YWNrIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUlOVEVSUlVQVF9JTkZPUk1BVElPTl9TVFJVQ1QgKmNoZGxjX2ludCA9ICZmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0OworCWludCB1ZHBfdHlwZSA9IDA7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGVycj0wOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCisJaWYgKHNrYiA9PSBOVUxMKXsKKwkJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxheWVyIHRoaW5rcyB3ZSd2ZSBtaXNzZWQgYW4KKwkJICogdHgtZG9uZSBpbnRlcnJ1cHQuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgTlVMTCBza2IgYnVmZmVyISBpbnRlcmZhY2UgJXMgZ290IGtpY2tlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisgICAJaWYgKG50b2hzKHNrYi0+cHJvdG9jb2wpICE9IGh0b25zKFBWQ19QUk9UKSl7CisJCS8qIGNoZWNrIHRoZSB1ZHAgcGFja2V0IHR5cGUgKi8KKwkJCisJCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKHNrYiwgY2FyZCk7CisJCWlmICh1ZHBfdHlwZSA9PSBVRFBfQ1BJUEVfVFlQRSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fU1RBQ0ssIGNhcmQsIHNrYiwgZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEpKXsKKwkJCQljaGRsY19pbnQtPmludGVycnVwdF9wZXJtaXNzaW9uIHw9CisJCQkJCUFQUF9JTlRfT05fVElNRVI7CisJCQl9CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKyAgICAgICAgfQorCisJLyogTG9jayB0aGUgNTA4IENhcmQ6IFNNUCBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIAlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0gCisKKyAgICAJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgaW4gaWZfc2VuZDogJWx4XG4iLAorCQkJCQljYXJkLT53YW5kZXYubmFtZSxjYXJkLT53YW5kZXYuY3JpdGljYWwpOworICAgICAgICAgICAgICAgICsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWdvdG8gaWZfc2VuZF9jcml0X2V4aXQ7CisJfQorCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKXsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZ290byBpZl9zZW5kX2NyaXRfZXhpdDsKKwl9CisJCisJaWYgKGNoZGxjX3NlbmQoY2FyZCwgc2tiLT5kYXRhLCBza2ItPmxlbikpeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwl9ZWxzZXsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKyAgICAgICAJCWNhcmQtPndhbmRldi5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfQkKKworaWZfc2VuZF9jcml0X2V4aXQ6CisJaWYgKCEoZXJyPW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpeworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGlja19jb3VudGVyID0gamlmZmllczsKKwkJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RYX0ZSQU1FOworCX0KKworCWNsZWFyX2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfdW5sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlcGx5IHRvIFVEUCBNYW5hZ2VtZW50IHN5c3RlbS4KKyAqIFJldHVybiBsZW5ndGggb2YgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKQoreworCisJdW5zaWduZWQgc2hvcnQgbGVuLCB1ZHBfbGVuZ3RoLCB0ZW1wLCBpcF9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBpcF90ZW1wOworCWludCBldmVuX2JvdW5kID0gMDsKKyAgCWNoZGxjX3VkcF9wa3RfdCAqY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKWRhdGE7CisJIAorCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBzaXplb2YodHJhY2VfaW5mb190KSsgCisJICAgICAgbWJveF9sZW47CisKKwkvKiBmaWxsIGluIFVEUCByZXBseSAqLworCWNfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgIAorCS8qIGZpbGwgaW4gVURQIGxlbmd0aCAqLworCXVkcF9sZW5ndGggPSBzaXplb2YodWRwX3BrdF90KSsgCisJCSAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJCSAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrCisJCSAgICAgbWJveF9sZW47IAorCisgCS8qIHB1dCBpdCBvbiBhbiBldmVuIGJvdW5kYXJ5ICovCisJaWYgKCB1ZHBfbGVuZ3RoICYgMHgwMDAxICkgeworCQl1ZHBfbGVuZ3RoICs9IDE7CisJCWxlbiArPSAxOworCQlldmVuX2JvdW5kID0gMTsKKwl9ICAKKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfbGVuZ3RoID0gdGVtcDsKKwkJIAorCS8qIHN3YXAgVURQIHBvcnRzICovCisJdGVtcCA9IGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQ7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydCA9IAorCQkJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydDsgCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9IHRlbXA7CisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopKGNfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKSkgPSB0ZW1wOwkKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworCisJCSAKKwkvKiBjYWxjdWxhdGUgVURQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IDA7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sdWRwX2xlbmd0aCtVRFBfT0ZGU0VUKTsKKworCS8qIGZpbGwgaW4gSVAgbGVuZ3RoICovCisJaXBfbGVuZ3RoID0gbGVuOworCXRlbXAgPSAoaXBfbGVuZ3RoPDw4KXwoaXBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzcyA9IGNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCWNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCS8qIGZpbGwgaW4gSVAgY2hlY2tzdW0gKi8KKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oZGF0YSxzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47CisKK30gLyogcmVwbHlfdWRwICovCisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsgCisJdW5zaWduZWQgbG9uZyBzdW09MDsKKwlpbnQgaTsKKworCWZvciggaSA9IDA7IGkgPGxlbjsgaSs9MiApIHsKKwkJbWVtY3B5KCZ0ZW1wLCZkYXRhW2ldLDIpOworCQlzdW0gKz0gKHVuc2lnbmVkIGxvbmcpdGVtcDsKKwl9CisKKwl3aGlsZSAoc3VtID4+IDE2ICkgeworCQlzdW0gPSAoc3VtICYgMHhmZmZmVUwpICsgKHN1bSA+PiAxNik7CisJfQorCisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydClzdW07CisJdGVtcCA9IH50ZW1wOworCisJaWYoIHRlbXAgPT0gMCApIAorCQl0ZW1wID0gMHhmZmZmOworCisJcmV0dXJuIHRlbXA7CQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc2RsYV90ICpteV9jYXJkOworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWE7CisKKwkvKiBTaHV0ZG93biBidWcgZml4LiBJbiBkZWxfaWYoKSB3ZSBraWxsCisgICAgICAgICAqIGRldi0+cHJpdiBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uLCBnZXRzCisgICAgICAgICAqIGNhbGxlZCBhZnRlciBkZWxfaWYoKSwgdGh1cyBjaGVjaworICAgICAgICAgKiBpZiBwb2ludGVyIGhhcyBiZWVuIGRlbGV0ZWQgKi8KKwlpZiAoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbXlfY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlyZXR1cm4gJm15X2NhcmQtPndhbmRldi5zdGF0czsgCit9CisKKworLyoqKioqKiBDaXNjbyBIRExDIEZpcm13YXJlIEludGVyZmFjZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGZpcm13YXJlIGNvZGUgdmVyc2lvbi4KKyAqCVB1dCBjb2RlIHZlcnNpb24gYXMgQVNDSUkgc3RyaW5nIGluIHN0ci4gCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cikKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBsZW47CisJY2hhciBlcnI7CisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT0RFX1ZFUlNJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCX0KKwllbHNlIGlmIChzdHIpIHsgIC8qIGlzIG5vdCBudWxsICovCisJCWxlbiA9IG1iLT5idWZmZXJfbGVuZ3RoOworCQltZW1jcHkoc3RyLCBtYi0+ZGF0YSwgbGVuKTsKKwkJc3RyW2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gKGVycik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBDb25maWd1cmUgQ0hETEMgZmlybXdhcmUuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWFpbGJveCA9IGNhcmQtPm1ib3g7CisJaW50IGRhdGFfbGVuZ3RoID0gc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKTsKKwkKKwltYWlsYm94LT5idWZmZXJfbGVuZ3RoID0gZGF0YV9sZW5ndGg7ICAKKwltZW1jcHkobWFpbGJveC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW5ndGgpOworCW1haWxib3gtPmNvbW1hbmQgPSBTRVRfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWFpbGJveCkgPyBtYWlsYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgIT0gQ09NTUFORF9PSykgY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWFpbGJveCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGludGVycnVwdCBtb2RlIC0tIEhETEMgVmVyc2lvbi4KKyAqLworCitzdGF0aWMgaW50IGNoZGxjX3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCUNIRExDX0lOVF9UUklHR0VSU19TVFJVQ1QqIGludF9kYXRhID0KKwkJIChDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUICopbWItPmRhdGE7CisJaW50IGVycjsKKworCWludF9kYXRhLT5DSERMQ19pbnRlcnJ1cHRfdHJpZ2dlcnMgCT0gbW9kZTsKKwlpbnRfZGF0YS0+SVJRCQkJCT0gY2FyZC0+aHcuaXJxOworCWludF9kYXRhLT5pbnRlcnJ1cHRfdGltZXIgICAgICAgICAgICAgICA9IDE7CisgICAKKwltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKTsKKwltYi0+Y29tbWFuZCA9IFNFVF9DSERMQ19JTlRFUlJVUFRfVFJJR0dFUlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWIpOworCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmFibGUgY29tbXVuaWNhdGlvbnMuCisgKi8KKworc3RhdGljIGludCBjaGRsY19jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKQoreworCWludCBlcnI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IEVOQUJMRV9DSERMQ19DT01NVU5JQ0FUSU9OUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LKQorCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwllbHNlCisJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgRHJvcCB0aGUgTW9kZW0gbGluZXMgKERDRCBhbmQgUlRTKS4KKyAqLworc3RhdGljIGludCBjaGRsY19jb21tX2Rpc2FibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlpbnQgZXJyOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBESVNBQkxFX0NIRExDX0NPTU1VTklDQVRJT05TOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spCisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBjb21tdW5pY2F0aW9uIGVycm9yIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworICAgICAgICBpbnQgZXJyOworICAgICAgICBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisgICAgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKyAgICAgICAgbWItPmNvbW1hbmQgPSBSRUFEX0NPTU1TX0VSUk9SX1NUQVRTOworICAgICAgICBlcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisgICAgICAgIGlmIChlcnIgIT0gQ09NTUFORF9PSykKKyAgICAgICAgICAgICAgICBjaGRsY19lcnJvcihjYXJkLGVycixtYik7CisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIENIRExDIG9wZXJhdGlvbmFsIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9vcF9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworICAgICAgICBpbnQgZXJyOworICAgICAgICBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisgICAgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKyAgICAgICAgbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX09QRVJBVElPTkFMX1NUQVRTOworICAgICAgICBlcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisgICAgICAgIGlmIChlcnIgIT0gQ09NTUFORF9PSykKKyAgICAgICAgICAgICAgICBjaGRsY19lcnJvcihjYXJkLGVycixtYik7CisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgY29tbXVuaWNhdGlvbnMgZXJyb3IgYW5kIGdlbmVyYWwgcGFja2V0IHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2NvbW1zX3N0YXRzKHNkbGFfdCogY2FyZCwKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKQoreworICAgICAgICBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworICAJQ09NTVNfRVJST1JfU1RBVFNfU1RSVUNUKiBlcnJfc3RhdHM7CisgICAgICAgIENIRExDX09QRVJBVElPTkFMX1NUQVRTX1NUUlVDVCAqb3Bfc3RhdHM7CisKKwkvKiBvbiB0aGUgZmlyc3QgdGltZXIgaW50ZXJydXB0LCByZWFkIHRoZSBjb21tcyBlcnJvciBzdGF0aXN0aWNzICovCisJaWYoY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPT0gMikgeworCQlpZihjaGRsY19yZWFkX2NvbW1fZXJyX3N0YXRzKGNhcmQpKQorCQkJcmV0dXJuIDE7CisJCWVycl9zdGF0cyA9IChDT01NU19FUlJPUl9TVEFUU19TVFJVQ1QgKiltYi0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9vdmVycnVuX2Vycl9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAKKwkJCQllcnJfc3RhdHMtPkNSQ19lcnJfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAKKwkJCQllcnJfc3RhdHMtPlJ4X2Fib3J0X2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZmlmb19lcnJvcnMgPSAKKwkJCQllcnJfc3RhdHMtPlJ4X2Rpc19wcmlfYmZyc19mdWxsX2NvdW50OyAKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPQorCQkJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9maWZvX2Vycm9yczsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0KKwkJCQllcnJfc3RhdHMtPnNlY19UeF9hYm9ydF9jb3VudDsKKwl9CisKKyAgICAgICAgLyogb24gdGhlIHNlY29uZCB0aW1lciBpbnRlcnJ1cHQsIHJlYWQgdGhlIG9wZXJhdGlvbmFsIHN0YXRpc3RpY3MgKi8KKwllbHNlIHsKKyAgICAgICAgCWlmKGNoZGxjX3JlYWRfb3Bfc3RhdHMoY2FyZCkpCisgICAgICAgICAgICAgICAgCXJldHVybiAxOworCQlvcF9zdGF0cyA9IChDSERMQ19PUEVSQVRJT05BTF9TVEFUU19TVFJVQ1QgKiltYi0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCQkJKG9wX3N0YXRzLT5SeF9EYXRhX2Rpc2NhcmRfc2hvcnRfY291bnQgKworCQkJb3Bfc3RhdHMtPlJ4X0RhdGFfZGlzY2FyZF9sb25nX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHBhY2tldC4KKyAqCVJldHVybjoJMCAtIG8uay4KKyAqCQkxIC0gbm8gdHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUKKyAqLworc3RhdGljIGludCBjaGRsY19zZW5kIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxlbikKK3sKKwlDSERMQ19EQVRBX1RYX1NUQVRVU19FTF9TVFJVQ1QgKnR4YnVmID0gY2FyZC0+dS5jLnR4YnVmOworCisJaWYgKHR4YnVmLT5vcHBfZmxhZykKKwkJcmV0dXJuIDE7CisJCisJc2RsYV9wb2tlKCZjYXJkLT5odywgdHhidWYtPnB0cl9kYXRhX2JmciwgZGF0YSwgbGVuKTsKKworCXR4YnVmLT5mcmFtZV9sZW5ndGggPSBsZW47CisJdHhidWYtPm9wcF9mbGFnID0gMTsJCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCQorCS8qIFVwZGF0ZSB0cmFuc21pdCBidWZmZXIgY29udHJvbCBmaWVsZHMgKi8KKwljYXJkLT51LmMudHhidWYgPSArK3R4YnVmOworCisJaWYgKCh2b2lkKil0eGJ1ZiA+IGNhcmQtPnUuYy50eGJ1Zl9sYXN0KQorCQljYXJkLT51LmMudHhidWYgPSBjYXJkLT51LmMudHhidWZfYmFzZTsKKworCXJldHVybiAwOworfQorCisvKioqKioqIEZpcm13YXJlIEVycm9yIEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaXJtd2FyZSBlcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpCit7CisJdW5zaWduZWQgY21kID0gbWItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGVycikgeworCisJY2FzZSBDTURfVElNRU9VVDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tbWFuZCAweCUwMlggdGltZWQgb3V0IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCk7CisJCWJyZWFrOworCisJY2FzZSBTNTE0X0JPVEhfUE9SVFNfU0FNRV9DTEtfTU9ERToKKwkJaWYoY21kID09IFNFVF9DSERMQ19DT05GSUdVUkFUSU9OKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgIiVzOiBDb25maWd1cmUgYm90aCBwb3J0cyBmb3IgdGhlIHNhbWUgY2xvY2sgc291cmNlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb21tYW5kIDB4JTAyWCByZXR1cm5lZCAweCUwMlghXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK1NUQVRJQyB2b2lkIHdzcHBwX2lzciAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCogZmxhZ3MgPSBOVUxMOworCWludCBpOworCXNkbGFfdCAqbXlfY2FyZDsKKworCisJLyogQ2hlY2sgZm9yIHdoaWNoIHBvcnQgdGhlIGludGVycnVwdCBoYXMgYmVlbiBnZW5lcmF0ZWQKKwkgKiBTaW5jZSBTZWNvbmRhcnkgUG9ydCBpcyBwaWdneWJhY2tpbmcgb24gdGhlIFByaW1hcnkKKyAgICAgICAgICogdGhlIGNoZWNrIG11c3QgYmUgZG9uZSBoZXJlLiAKKwkgKi8KKworCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWlmICghZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSl7CisJCS8qIENoZWNrIGZvciBhIHNlY29uZCBwb3J0IChwaWdneWJhY2tpbmcpICovCisJCWlmKChteV9jYXJkID0gY2FyZC0+bmV4dCkpeworCQkJZmxhZ3MgPSBteV9jYXJkLT51LmMuZmxhZ3M7CisJCQlpZiAoZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSl7CisJCQkJY2FyZCA9IG15X2NhcmQ7CisJCQkJY2FyZC0+aXNyKGNhcmQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJY2FyZC0+aW5faXNyID0gMTsKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkJCisJLyogSWYgd2UgZ2V0IGFuIGludGVycnVwdCB3aXRoIG5vIG5ldHdvcmsgZGV2aWNlLCBzdG9wIHRoZSBpbnRlcnJ1cHRzCisJICogYW5kIGlzc3VlIGFuIGVycm9yICovCisJaWYgKCghZGV2IHx8ICFkZXYtPnByaXYpICYmIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUgIT0gCisJICAgIAlDT01NQU5EX0NPTVBMRVRFX0FQUF9JTlRfUEVORCl7CisJCWdvdG8gaXNyX2RvbmU7CisJfQorCisJCisJLyogaWYgY3JpdGljYWwgZHVlIHRvIHBlcmlwaGVyYWwgb3BlcmF0aW9ucworCSAqIGllLiB1cGRhdGUoKSBvciBnZXRzdGF0cygpIHRoZW4gcmVzZXQgdGhlIGludGVycnVwdCBhbmQKKwkgKiB3YWl0IGZvciB0aGUgYm9hcmQgdG8gcmV0cmlnZ2VyLgorCSAqLworCWlmKHRlc3RfYml0KFBFUklfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuCisJCQkJCWludGVycnVwdF90eXBlID0gMDsKKwkJZ290byBpc3JfZG9uZTsKKwl9CisKKworCS8qIE9uIGEgNTA4IENhcmQsIGlmIGNyaXRpY2FsIGR1ZSB0byBpZl9zZW5kIAorICAgICAgICAgKiBNYWpvciBFcnJvciAhISEKKwkgKi8KKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkgeworCQlpZih0ZXN0X2JpdCgwLCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1I6ICVseFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJZ290byBpc3JfZG9uZTsKKwkJfQorCX0KKworCXN3aXRjaChmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKSB7CisKKwkJY2FzZSBSWF9BUFBfSU5UX1BFTkQ6CS8qIDB4MDE6IHJlY2VpdmUgaW50ZXJydXB0ICovCisJCQlyeF9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9BUFBfSU5UX1BFTkQ6CS8qIDB4MDI6IHRyYW5zbWl0IGludGVycnVwdCAqLworCQkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorCQkJCSB+QVBQX0lOVF9PTl9UWF9GUkFNRTsKKworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFX0FQUF9JTlRfUEVORDovKiAweDA0OiBjbWQgY3BsdCAqLworCQkJKysgSW50cl90ZXN0X2NvdW50ZXI7CisJCQlicmVhazsKKworCQljYXNlIENIRExDX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgkvKiAweDIwICovCisJCQlwcm9jZXNzX2NoZGxjX2V4Y2VwdGlvbihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgR0xPQkFMX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgorCQkJcHJvY2Vzc19nbG9iYWxfZXhjZXB0aW9uKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSU1FUl9BUFBfSU5UX1BFTkQ6CisJCQl0aW1lcl9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgMHglMDJYIVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwKKwkJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNvZGUgbmFtZTogIik7CisJCQlmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVjIiwKKwkJCQkJZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RlbmFtZVtpXSk7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG5Db2RlIHZlcnNpb246ICIpOworCQkJZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsIAorCQkJCQlmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGV2ZXJzaW9uW2ldKTsgCisJCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwkKKwkJCWJyZWFrOworCX0KKworaXNyX2RvbmU6CisJY2FyZC0+aW5faXNyID0gMDsKKwlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUNIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqcnhidWYgPSBjYXJkLT51LmMucnhtYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBhZGRyID0gcnhidWYtPnB0cl9kYXRhX2JmcjsKKwl2b2lkICpidWY7CisJaW50IGksdWRwX3R5cGU7CisJCisJaWYgKHJ4YnVmLT5vcHBfZmxhZyAhPSAweDAxKSB7CisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IGNvcnJ1cHRlZCBSeCBidWZmZXIgQCAweCVYLCBmbGFnID0gMHglMDJYIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCAodW5zaWduZWQpcnhidWYsIHJ4YnVmLT5vcHBfZmxhZyk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ29kZSBuYW1lOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGVuYW1lW2ldKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJcbkNvZGUgdmVyc2lvbjogIik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RldmVyc2lvbltpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCisJCS8qIEJ1ZyBGaXg6IE1hciA2IDIwMDAKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBnZXQgYSBjb3JydXB0ZWQgbWFpbGJveCwgaXQgbWVhc24gdGhhdCBkcml2ZXIgCisgICAgICAgICAgICAgICAgICogaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlybXdhcmUuIFRoZXJlIGlzIG5vIHJlY292ZXJ5LgorICAgICAgICAgICAgICAgICAqIElmIHdlIGRvbid0IHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGZvciB0aGlzIGNhcmQKKyAgICAgICAgICAgICAgICAgKiB0aGUgbWFjaGluZSB3aWxsIGNyYXNoLiAKKyAgICAgICAgICAgICAgICAgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIHJvdXRlciBmYWlsdXJlIC4uLiEhIVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgVGVjaG5vbG9naWVzICFcbiIpOworCQljaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsMCk7CQorCQlyZXR1cm47CisJfQorCisJZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCWlmICghZGV2KXsgCisJCWdvdG8gcnhfZXhpdDsKKwl9CisJCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpeworCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJaWYgKHJ4YnVmLT5lcnJvcl9mbGFnKXsJCisJCWdvdG8gcnhfZXhpdDsKKwl9CisJLyogVGFrZSBvZmYgdHdvIENSQyBieXRlcyAqLworCisJaWYgKHJ4YnVmLT5mcmFtZV9sZW5ndGggPCA3IHx8IHJ4YnVmLT5mcmFtZV9sZW5ndGggPiAxNTA2ICl7CisJCWdvdG8gcnhfZXhpdDsKKwl9CQorCisJbGVuID0gcnhidWYtPmZyYW1lX2xlbmd0aCAtIENSQ19MRU5HVEg7CisKKwkvKiBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJLyogQ29weSBkYXRhIHRvIHRoZSBzb2NrZXQgYnVmZmVyICovCisJaWYoKGFkZHIgKyBsZW4pID4gY2FyZC0+dS5jLnJ4X3RvcCArIDEpIHsKKwkJdW5zaWduZWQgdG1wID0gY2FyZC0+dS5jLnJ4X3RvcCAtIGFkZHIgKyAxOworCQlidWYgPSBza2JfcHV0KHNrYiwgdG1wKTsKKwkJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCB0bXApOworCQlhZGRyID0gY2FyZC0+dS5jLnJ4X2Jhc2U7CisJCWxlbiAtPSB0bXA7CisJfQorCQkKKwlidWYgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBidWYsIGxlbik7CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfcGFja2V0cyArKzsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoIHNrYiwgY2FyZCApOworCisJaWYodWRwX3R5cGUgPT0gVURQX0NQSVBFX1RZUEUpIHsKKwkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX05FVFdPUkssCisgICAJCQkJICAgICAgY2FyZCwgc2tiLCBkZXYsIGNoZGxjX3ByaXZfYXJlYSkpIHsKKyAgICAgCQkgICAgICAgIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuCisJCQkJCQlpbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSAKKwkJCQkJCQlBUFBfSU5UX09OX1RJTUVSOyAKKwkJfQorCX1lbHNleworICAgICAgICAgICAgICAgCS8qIFBhc3MgaXQgdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBuZXRpZl9yeChza2IpOworICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCityeF9leGl0OgorCS8qIFJlbGVhc2UgYnVmZmVyIGVsZW1lbnQgYW5kIGNhbGN1bGF0ZSBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb25lICovCisJcnhidWYtPm9wcF9mbGFnID0gMHgwMDsKKwljYXJkLT51LmMucnhtYiA9ICsrIHJ4YnVmOworCWlmKCh2b2lkKilyeGJ1ZiA+IGNhcmQtPnUuYy5yeGJ1Zl9sYXN0KXsKKwkJY2FyZC0+dS5jLnJ4bWIgPSBjYXJkLT51LmMucnhidWZfYmFzZTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGltZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKiBUaGUgdGltZXIgaW50ZXJydXB0IGlzIHVzZWQgZm9yIHR3byBwdXJwb3NlczoKKyAqICAgIDEpIFByb2Nlc3NpbmcgdWRwIGNhbGxzIGZyb20gJ2NwaXBlbW9uJy4KKyAqICAgIDIpIFJlYWRpbmcgYm9hcmQtbGV2ZWwgc3RhdGlzdGljcyBmb3IgdXBkYXRpbmcgdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKi8KK3ZvaWQgdGltZXJfaW50cihzZGxhX3QgKmNhcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgPSBOVUxMOworICAgICAgICBTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUKiBmbGFncyA9IE5VTEw7CisKKyAgICAgICAgZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgCisgICAgICAgIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRykgeworCQlpZiAoIWNvbmZpZ19jaGRsYyhjYXJkKSl7CisJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQl9CisJfQorCQorCS8qIHByb2Nlc3MgYSB1ZHAgY2FsbCBpZiBwZW5kaW5nICovCisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQKSB7CisgICAgICAgICAgICAgICAJcHJvY2Vzc191ZHBfbWdtdF9wa3QoY2FyZCwgZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEpOworCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVURQOworICAgICAgICB9CisJCisKKwkvKiByZWFkIHRoZSBjb21tdW5pY2F0aW9ucyBzdGF0aXN0aWNzIGlmIHJlcXVpcmVkICovCisJaWYoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpIHsKKwkJdXBkYXRlX2NvbW1zX3N0YXRzKGNhcmQsIGNoZGxjX3ByaXZfYXJlYSk7CisgICAgICAgICAgICAgICAgaWYoISgtLSBjaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cykpIHsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gCisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJCX0KKyAgICAgICAgfQorCisJLyogb25seSBkaXNhYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgaWYgdGhlcmUgYXJlIG5vIHVkcCBvciBzdGF0aXN0aWMgKi8KKwkvKiB1cGRhdGVzIHBlbmRpbmcgKi8KKyAgICAgICAgaWYoIWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKyAgICAgICAgICAgICAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9CisgICAgICAgICAgICAgICAgICAgICAgICB+QVBQX0lOVF9PTl9USU1FUjsKKyAgICAgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucworCS0gc2V0X2NoZGxjX2NvbmZpZygpIHVzZWQgdG8gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgYm9hcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc2V0X2NoZGxjX2NvbmZpZyhzZGxhX3QqIGNhcmQpCit7CisKKwlDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCBjZmc7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKSk7CisKKwlpZihjYXJkLT53YW5kZXYuY2xvY2tpbmcpCisJCWNmZy5iYXVkX3JhdGUgPSBjYXJkLT53YW5kZXYuYnBzOworCisJY2ZnLmxpbmVfY29uZmlnX29wdGlvbnMgPSAoY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9PSBXQU5PUFRfUlMyMzIpID8KKwkJSU5URVJGQUNFX0xFVkVMX1JTMjMyIDogSU5URVJGQUNFX0xFVkVMX1YzNTsKKworCWNmZy5tb2RlbV9jb25maWdfb3B0aW9ucwk9IDA7CisJLy9BUEkgT1BUSU9OUworCWNmZy5DSERMQ19BUElfb3B0aW9ucwkJPSBESVNDQVJEX1JYX0VSUk9SX0ZSQU1FUzsKKwljZmcubW9kZW1fc3RhdHVzX3RpbWVyCQk9IDEwMDsKKwljZmcuQ0hETENfcHJvdG9jb2xfb3B0aW9ucwk9IEhETENfU1RSRUFNSU5HX01PREU7CisJY2ZnLnBlcmNlbnRfZGF0YV9idWZmZXJfZm9yX1R4ICA9IDUwOworCWNmZy5DSERMQ19zdGF0aXN0aWNzX29wdGlvbnMJPSAoQ0hETENfVFhfREFUQV9CWVRFX0NPVU5UX1NUQVQgfAorCQlDSERMQ19SWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCk7CisJY2ZnLm1heF9DSERMQ19kYXRhX2ZpZWxkX2xlbmd0aAk9IGNhcmQtPndhbmRldi5tdHU7CisKKwljZmcudHJhbnNtaXRfa2VlcGFsaXZlX3RpbWVyCT0gMDsKKwljZmcucmVjZWl2ZV9rZWVwYWxpdmVfdGltZXIJPSAwOworCWNmZy5rZWVwYWxpdmVfZXJyb3JfdG9sZXJhbmNlCT0gMDsKKwljZmcuU0xBUlBfcmVxdWVzdF90aW1lcgkJPSAwOworCisJY2ZnLklQX2FkZHJlc3MJCT0gMDsKKwljZmcuSVBfbmV0bWFzawkJPSAwOworCQorCXJldHVybiBjaGRsY19jb25maWd1cmUoY2FyZCwgJmNmZyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBnbG9iYWwgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYm94LT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYm94LT5jb21tYW5kID0gUkVBRF9HTE9CQUxfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENNRF9USU1FT1VUICl7CisJCisJCXN3aXRjaChtYm94LT5yZXR1cm5fY29kZSkgeworICAgICAgICAgCisJICAgICAgCWNhc2UgRVhDRVBfTU9ERU1fU1RBVFVTX0NIQU5HRToKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIHN0YXR1cyBjaGFuZ2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisKKwkJCXN3aXRjaChtYm94LT5kYXRhWzBdICYgKERDRF9ISUdIIHwgQ1RTX0hJR0gpKSB7CisJCQkJY2FzZSAoRENEX0hJR0gpOgorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGhpZ2gsIENUUyBsb3dcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKENUU19ISUdIKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvdywgQ1RTIGhpZ2hcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKChEQ0RfSElHSCB8IENUU19ISUdIKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBoaWdoLCBDVFMgaGlnaFxuIixjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQlkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgbG93LCBDVFMgbG93XG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJfQorCisJCQlpZiAoIShtYm94LT5kYXRhWzBdICYgRENEX0hJR0gpIHx8ICEobWJveC0+ZGF0YVswXSAmIERDRF9ISUdIKSl7CisJCQkJLy9wcmludGsoS0VSTl9JTkZPICJTZW5kaW5nIFRFUk0gUmVxdWVzdCBNYW51YWxseSAhXG4iKTsKKwkJCQlzZW5kX3BwcF90ZXJtX3JlcXVlc3QoY2FyZC0+d2FuZGV2LmRldik7CisJCQl9CQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVYQ0VQX1RSQ19ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5lIHRyYWNlIGRpc2FibGVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJY2FzZSBFWENFUF9JUlFfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgdGltZW91dCBvY2N1cnJlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsgCisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogR2xvYmFsIGV4Y2VwdGlvbiAleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYm94LT5yZXR1cm5fY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBjaGRsYyBleGNlcHRpb24gY29uZGl0aW9uCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jaGRsY19leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENNRF9USU1FT1VUKSB7CisJCisJCXN3aXRjaCAoZXJyKSB7CisKKwkJY2FzZSBFWENFUF9MSU5LX0FDVElWRToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MSU5LX0lOQUNUSVZFX01PREVNOgorCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQlicmVhazsKKworCQljYXNlIEVYQ0VQX0xPT1BCQUNLX0NPTkRJVElPTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMb29wYmFjayBDb25kaXRpb24gRGV0ZWN0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIE5PX0NIRExDX0VYQ0VQX0NPTkRfVE9fUkVQT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIGV4Y2VwdGlvbnMgcmVwb3J0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFeGNlcHRpb24gQ29uZGl0aW9uICV4IVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdG9yZSBhIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgaW50IHN0b3JlX3VkcF9tZ210X3BrdChjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSApCit7CisJaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKworCWlmKCFjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCAmJgorCSAgKHNrYi0+bGVuIDw9IE1BWF9MR1RIX1VEUF9NR05UX1BLVCkpIHsKKyAgICAgICAgCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gc2tiLT5sZW47CisJCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPSB1ZHBfcGt0X3NyYzsKKyAgICAgICAJCW1lbWNweShjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgPSBUTVJfSU5UX0VOQUJMRURfVURQOworCQl1ZHBfcGt0X3N0b3JlZCA9IDE7CisJfQorCisJaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fU1RBQ0spCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJZWxzZQorICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCisJcmV0dXJuKHVkcF9wa3Rfc3RvcmVkKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBtYW5hZ2VtZW50IHBhY2tldC4KKyAqLworCitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhICkgCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBmcmFtZXMsIGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwl1bnNpZ25lZCBzaG9ydCBidWZmZXJfbGVuZ3RoLCByZWFsX2xlbjsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcHRyOworCXVuc2lnbmVkIGRhdGFfbGVuZ3RoOworCWludCB1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCUNIRExDX01BSUxCT1hfU1RSVUNUICptYiA9IGNhcmQtPm1ib3g7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJY2hkbGNfdWRwX3BrdF90ICpjaGRsY191ZHBfcGt0OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBlcnI7CisJY2hhciB1dF9jaGFyOworCisJY2hkbGNfdWRwX3BrdCA9IChjaGRsY191ZHBfcGt0X3QgKikgY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGE7CisKKwlpZihjaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKworCQlzd2l0Y2goY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKwkJCWNhc2UgUkVBRF9HTE9CQUxfU1RBVElTVElDUzoKKwkJCWNhc2UgUkVBRF9NT0RFTV9TVEFUVVM6ICAKKwkJCWNhc2UgUkVBRF9DSERMQ19MSU5LX1NUQVRVUzoKKwkJCWNhc2UgQ1BJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIFJFQURfQ09NTVNfRVJST1JfU1RBVFM6CisJCQljYXNlIFJFQURfQ0hETENfT1BFUkFUSU9OQUxfU1RBVFM6CisKKwkJCS8qIFRoZXNlIHR3byBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgZm9yCisJCQkgKiBlYWNoIHJlcXVlc3QgKi8KKwkJCWNhc2UgUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOgorCQkJY2FzZSBSRUFEX0NIRExDX0NPREVfVkVSU0lPTjoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQl9IAorCX0KKwkKKyAgCWlmKCF1ZHBfbWdtdF9yZXFfdmFsaWQpIHsKKworCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGggPSAwOworCisgICAgCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMHhDRDsKKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsJCisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBXYXJuaW5nLCBJbGxlZ2FsIFVEUCBjb21tYW5kIGF0dGVtcHRlZCBmcm9tIG5ldHdvcms6ICV4XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCk7CisJCX0KKworICAgCX0gZWxzZSB7CisJICAgCXVuc2lnbmVkIGxvbmcgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyID0gMDsKKwkJVFJBQ0VfU1RBVFVTX0VMX0NGR19TVFJVQ1QgdHJhY2VfY2ZnX3N0cnVjdDsKKwkJVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUIHRyYWNlX2VsZW1lbnRfc3RydWN0OworCisJCXN3aXRjaChjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCWNhc2UgQ1BJUEVfRU5BQkxFX1RSQUNJTkc6CisJCSAgICAgaWYgKCFjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QpOworCQkJbWItPmNvbW1hbmQgPSBTRVRfVFJBQ0VfQ09ORklHVVJBVElPTjsKKworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9BQ1RJVkU7CisJCQkvKiBUcmFjZSBkZWxheSBtb2RlIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQgc2xvd3MKKwkJCSAgIGRvd24gdHJhbnNmZXIgYW5kIHJlc3VsdHMgaW4gYSBzdGFuZG9mZiBzaXR1YXRpb24KKwkJCSAgIHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgZGF0YSAqLworCisJCQkvKiBDb25maWd1cmUgdGhlIFRyYWNlIGJhc2VkIG9uIHVzZXIgaW5wdXRzICovCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+dHJhY2VfY29uZmlnIHw9IAorCQkJCQljaGRsY191ZHBfcGt0LT5kYXRhWzBdOworCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkgICB0cmFjZV9kZWFjdGl2YXRpb25fdGltZXIgPSA0MDAwOworCisKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gZXJyOworCQkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCQlicmVhazsKKwkgICAgCQl9IAorCisJCQkvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdHJhY2UgZWxlbWVudCBsaXN0ICovCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfVFJBQ0VfQ09ORklHVVJBVElPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCQkJaWYgKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCQkJCWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAJCisKKwkgICAJCXRyYWNlX3N0YXR1c19jZmdfYWRkciA9KChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKikKKwkJCQltYi0+ZGF0YSkgLT4gcHRyX3RyYWNlX3N0YXRfZWxfY2ZnX3N0cnVjdDsKKworCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyLAorCQkJCSAmdHJhY2VfY2ZnX3N0cnVjdCwgc2l6ZW9mKHRyYWNlX2NmZ19zdHJ1Y3QpKTsKKwkJICAgIAorCQkJY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyID0gdHJhY2VfY2ZnX3N0cnVjdC4KKwkJCQliYXNlX2FkZHJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm51bWJlcl90cmFjZV9zdGF0dXNfZWxlbWVudHM7CisKKwkJCWNoZGxjX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJKChUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QgKikKKwkJCQkJIGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciArIAorCQkJCQkgKGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzIC0gMSkpOworCisJCQljaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF9hZGRyX3RyYWNlX2J1ZmZlciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0LmVuZF9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkgICAgCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QubmV4dF90cmFjZV9lbGVtZW50X3RvX3VzZTsKKworCSAgICAJCWNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSA9IDIwMDAgLSAKKwkJCQkJCQkJICBzaXplb2YoaXBfcGt0X3QpIC0KKwkJCQkJCQkJICBzaXplb2YodWRwX3BrdF90KSAtCisJCQkJCQkJICAgICAgCSAgc2l6ZW9mKHdwX21nbXRfdCkgLQorCQkJCQkJCQkgIHNpemVvZihjYmxvY2tfdCkgLQorCQkJCQkJCSAgICAgICAgICBzaXplb2YodHJhY2VfaW5mb190KTsJCisJICAgICAgIAkgICAgIH0KKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkgICAgICAgCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJICAgICAgIAkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfRElTQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmIChjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisgICAgCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJCXRyYWNlX2NvbmZpZyA9IFRSQUNFX0lOQUNUSVZFOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkgICAgIH0JCQorCisJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCSAgICAgYnJlYWs7CisJICAgCisKKwkJY2FzZSBDUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMTsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCWJyZWFrOworCQkgICAgIH0KKworICAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMDsKKwkJICAgICBidWZmZXJfbGVuZ3RoID0gMDsJLyogb2Zmc2V0IG9mIHBhY2tldCBhbHJlYWR5IG9jY3VwaWVkICovCisKKwkJICAgICBmb3IgKGZyYW1lcz0wOyBmcmFtZXMgPCBjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50czsgZnJhbWVzKyspeworCisJCQl0cmFjZV9wa3RfdCAqdHJhY2VfcGt0ID0gKHRyYWNlX3BrdF90ICopCisJCQkJJmNoZGxjX3VkcF9wa3QtPmRhdGFbYnVmZmVyX2xlbmd0aF07CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyLAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKikmdHJhY2VfZWxlbWVudF9zdHJ1Y3QsCisJCQkgICAJICBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKSk7CisKKyAgICAgCQkJaWYgKHRyYWNlX2VsZW1lbnRfc3RydWN0Lm9wcF9mbGFnID09IDB4MDApIHsKKwkJCSAJYnJlYWs7CisJCQl9CisKKwkJCS8qIGdldCBwb2ludGVyIHRvIHJlYWwgZGF0YSAqLworCQkJZGF0YV9wdHIgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC5wdHJfZGF0YV9iZnI7CisKKwkJCS8qIFNlZSBpZiB0aGVyZSBpcyBhY3R1YWwgZGF0YSBvbiB0aGUgdHJhY2UgYnVmZmVyICovCisJCQlpZiAoZGF0YV9wdHIpeworCQkJCWRhdGFfbGVuZ3RoID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCQkJfWVsc2V7CisJCQkJZGF0YV9sZW5ndGggPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJCQl9CisJCisgICAJCQlpZiggKGNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSAtIGJ1ZmZlcl9sZW5ndGgpCisJCQkJPCAoIHNpemVvZih0cmFjZV9wa3RfdCkgKyBkYXRhX2xlbmd0aCkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgb24gYm9hcmQgJiBleGl0ICovCisJCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQl0cmFjZV9wa3QtPnN0YXR1cyA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3R5cGU7CisKKwkJCXRyYWNlX3BrdC0+dGltZV9zdGFtcCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfdGltZV9zdGFtcDsKKworCQkJdHJhY2VfcGt0LT5yZWFsX2xlbmd0aCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCisJCQkvKiBzZWUgaWYgd2UgY2FuIGZpdCB0aGUgZnJhbWUgaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCXJlYWxfbGVuID0gdHJhY2VfcGt0LT5yZWFsX2xlbmd0aDsKKworCQkJaWYgKGRhdGFfcHRyID09IDApIHsKKwkJCSAgICAgCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDA7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIHRtcCA9IDA7CisKKwkJCQkvKiBnZXQgdGhlIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIKKwkJCQkgICAgbXVzdCBjaGVjayBmb3IgZW5kIG9mIGJ1ZmZlciAqLworCQkJICAgICAgICB0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAxOworCisJCQkJaWYgKChkYXRhX3B0ciArIHJlYWxfbGVuKSA+CisJCQkJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgKyAxKXsKKworCQkJCSAgICAJdG1wID0gY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgLSBkYXRhX3B0ciArIDE7CisJCQkJICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAgICAgIAkgIHRyYWNlX3BrdC0+ZGF0YSx0bXApOworCQkJCSAgICAJZGF0YV9wdHIgPSBjaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJCQkJfQorCQorCQkgICAgICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAmdHJhY2VfcGt0LT5kYXRhW3RtcF0sIHJlYWxfbGVuIC0gdG1wKTsKKwkJCX0JCisKKwkJCS8qIHplcm8gdGhlIG9wcCBmbGFnIHRvIHNob3cgd2UgZ290IHRoZSBmcmFtZSAqLworCQkJdXRfY2hhciA9IDB4MDA7CisJCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgJnV0X2NoYXIsIDEpOworCisgICAgICAgCQkJLyogbm93IG1vdmUgb250byB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgIAkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyICs9IHNpemVvZihUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QpOworCisgICAgICAgCQkJLyogY2hlY2sgaWYgd2Ugd2VudCBvdmVyIHRoZSBsYXN0IGFkZHJlc3MgKi8KKwkJCWlmICggY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIgPiBjaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyICkgeworCQkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyOworICAgICAgIAkJCX0KKworICAgICAgICAgICAgCQlpZih0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPT0gMHgwMSkgeworCQkJCWJ1ZmZlcl9sZW5ndGggKz0gcmVhbF9sZW4gLSAxOworCQkJfQorCSAKKwkgICAgICAgCSAgICAJLyogZm9yIHRoZSBoZWFkZXIgKi8KKwkgICAgICAgICAgICAJYnVmZmVyX2xlbmd0aCArPSBzaXplb2YodHJhY2VfcGt0X3QpOworCisJCSAgICAgfSAgLyogRm9yIExvb3AgKi8KKworCQkgICAgIGlmIChmcmFtZXMgPT0gY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMpeworCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKwkgICAgICAgICAgICAgfQorIAkJICAgICBjaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLm51bV9mcmFtZXMgPSBmcmFtZXM7CisJCSAKKyAgICAJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsgCisJCSAKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOyAKKwkJICAgICAKKwkJICAgICBicmVhazsKKworCisJCWNhc2UgQ1BJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzBdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQV9pbnB1dDsKKworCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzFdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQl9pbnB1dDsKKwkJCQkgCisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAyOworCQkJYnJlYWs7CisJCQorCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWUgPSB0di50dl9zZWMgLSAKKwkJCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZTsKKwkJCSoodW5zaWduZWQgbG9uZyAqKSZjaGRsY191ZHBfcGt0LT5kYXRhID0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWU7CQorCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCQlicmVhazsKKworICAgCQljYXNlIEZUMV9NT05JVE9SX1NUQVRVU19DVFJMOgorCQkJLyogRW5hYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgICAgCWlmICgoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9TVEFUVVMpIHx8ICAKKwkJCQkoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9PUF9TVEFUUykpIHsKKwkJCQorCQkJICAgICAJaWYoIHJDb3VudCsrICE9IDAgKSB7CisJCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJCSAgICAJICAgICAJfQorCSAgICAgIAkJfQorCisJICAgICAgCQkvKiBEaXNhYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgIAkJaWYoIGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gPT0gMCkgeworCisJICAgICAgCSAgIAkgICAgIAlpZiggLS1yQ291bnQgIT0gMCkgeworCQkgIAkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJICAgCSAgICAJICAgICAJfSAKKwkgICAgICAJCX0gCQorCQorCQlkZWZhdWx0OgorCQkJLyogaXQncyBhIGJvYXJkIGNvbW1hbmQgKi8KKwkJCW1iLT5jb21tYW5kID0gY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQ7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IGNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoOworCQkJaWYgKG1iLT5idWZmZXJfbGVuZ3RoKSB7CisJCQkJbWVtY3B5KCZtYi0+ZGF0YSwgKHVuc2lnbmVkIGNoYXIgKikgY2hkbGNfdWRwX3BrdC0+CisJCQkJCQkJZGF0YSwgbWItPmJ1ZmZlcl9sZW5ndGgpOworCSAgICAgIAkJfSAKKwkJCS8qIHJ1biB0aGUgY29tbWFuZCBvbiB0aGUgYm9hcmQgKi8KKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBjb3B5IHRoZSByZXN1bHQgYmFjayB0byBvdXIgYnVmZmVyICovCisJICAgICAgICAgCW1lbWNweSgmY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLCBtYiwgc2l6ZW9mKGNibG9ja190KSk7IAorCQkJCisJCQlpZiAobWItPmJ1ZmZlcl9sZW5ndGgpIHsKKwkgICAgICAgICAJCW1lbWNweSgmY2hkbGNfdWRwX3BrdC0+ZGF0YSwgJm1iLT5kYXRhLCAKKwkJCQkJCQkJbWItPmJ1ZmZlcl9sZW5ndGgpOyAKKwkgICAgICAJCX0KKworCQl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgCX0gLyogZW5kIG9mIGVsc2UgKi8KKworICAgICAJLyogRmlsbCBVRFAgVFRMICovCisJY2hkbGNfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7IAorCisgICAgIAlsZW4gPSByZXBseV91ZHAoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIG1iLT5idWZmZXJfbGVuZ3RoKTsKKwkKKyAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCQlpZighY2hkbGNfc2VuZChjYXJkLCBjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbGVuKSkgeworCQkJKysgY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisJCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQl9CisJfSBlbHNlIHsJCisJCisJCS8qIFBhc3MgaXQgdXAgdGhlIHN0YWNrCisgICAgCQkgICBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCWlmICgobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCisgCSAgICAJCWJ1ZiA9IHNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKyAgCSAgICAJCW1lbWNweShidWYsIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBsZW4pOworCisgICAgICAgICAgICAJCS8qIERlY2Fwc3VsYXRlIHBrdCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkgICAgCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgICAgIAkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCSAgICAJCW5ld19za2ItPm1hYy5yYXcgID0gbmV3X3NrYi0+ZGF0YTsKKwkKKwkJCW5ldGlmX3J4KG5ld19za2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkgICAgCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworICAJCX0KKyAgICAJfQorIAorCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gMDsKKyAJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBSZWNlaXZlIGFuZCBUcmFuc21pdCBCdWZmZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGluaXRfY2hkbGNfdHhfcnhfYnVmZihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqdHhfY29uZmlnOworCUNIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICpyeF9jb25maWc7CisJY2hhciBlcnI7CisJCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJcmV0dXJuOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCXR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworICAgICAgICAJcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfQ0hETENfUnhfc3RhdF9lbF9jZmdfc3RydWN0KSk7CisKKyAgICAgICAJCS8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgIAljYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyk7CisgICAgICAgIAljYXJkLT51LmMudHhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopICAKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSArCisJCSh0eF9jb25maWctPm51bWJlcl9UeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgKworCQkocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAJCS8qIFNldCB1cCBuZXh0IHBvaW50ZXIgdG8gYmUgdXNlZCAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgdHhfY29uZmlnLT5uZXh0X1R4X3N0YXR1c19lbGVtZW50X3RvX3VzZSk7CisgICAgICAgIAljYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworCX0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHhfY29uZmlnID0gKENIRExDX1RYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgLyogU2V0dXAgSGVhZCBhbmQgVGFpbHMgZm9yIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkodHhfY29uZmlnLT5iYXNlX2FkZHJfVHhfc3RhdHVzX2VsZW1lbnRzICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnR4YnVmX2Jhc2UKKwkJKyAodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0gCisJCShDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKiljYXJkLT51LmMucnhidWZfYmFzZQorCQkrIChyeF9jb25maWctPm51bWJlcl9SeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWYgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkocnhfY29uZmlnLT5uZXh0X1J4X3N0YXR1c19lbGVtZW50X3RvX3VzZSAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0dXAgQWN0dWFsIEJ1ZmZlciBTdGFydCBhbmQgZW5kIGFkZHJlc3NlcyAqLworICAgICAgICBjYXJkLT51LmMucnhfYmFzZSA9IHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X2J1ZmZlcjsKKyAgICAgICAgY2FyZC0+dS5jLnJ4X3RvcCAgPSByeF9jb25maWctPmVuZF9hZGRyX1J4X2J1ZmZlcjsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQZXJmb3JtIEludGVycnVwdCBUZXN0IGJ5IHJ1bm5pbmcgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUgorICogX1RFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworCUludHJfdGVzdF9jb3VudGVyID0gMDsKKworCS8qIFRoZSBjcml0aWNhbCBmbGFnIGlzIHVuc2V0IGJlY2F1c2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIChpZl9vcGVuKSAKKwkgKiB3ZSB3YW50IHRoZSBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgc28gdGhhdCB3aGVuIHRoZSB3cGNfaXNyIGlzCisJICogY2FsbGVkIGl0IGRvZXMgbm90IGV4aXQgZHVlIHRvIGNyaXRpY2FsIGZsYWcgc2V0LgorCSAqLyAKKworCWVyciA9IGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9DT01NQU5EX0NPTVBMRVRFKTsKKworCWlmIChlcnIgPT0gQ01EX09LKSB7IAorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSOyBpICsrKSB7CQorCQkJbWItPmJ1ZmZlcl9sZW5ndGggID0gMDsKKwkJCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT0RFX1ZFUlNJT047CisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCX0KKwl9CisJZWxzZSB7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCAwKTsKKworCWlmIChlcnIgIT0gQ01EX09LKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgd2hhdCB0eXBlIG9mIFVEUCBjYWxsIGl0IGlzLiBDUElQRUFCID8KKyAqLworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2RsYV90KiBjYXJkKQoreworCSBjaGRsY191ZHBfcGt0X3QgKmNoZGxjX3VkcF9wa3QgPSAoY2hkbGNfdWRwX3BrdF90ICopc2tiLT5kYXRhOworCisJaWYgKCFzdHJuY21wKGNoZGxjX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLFVEUE1HTVRfU0lHTkFUVVJFLDgpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID09IG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPmlwX3BrdC5wcm90b2NvbCA9PSBVRFBNR01UX1VEUF9QUk9UT0NPTCkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID09IFVEUE1HTVRfUkVRVUVTVCkpIHsKKwkJcmV0dXJuIFVEUF9DUElQRV9UWVBFOworCX0KKwllbHNlIHJldHVybiBVRFBfSU5WQUxJRF9UWVBFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBQT1JUIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworICAgICAgICBpZiAoY2FyZC0+dS5jLnN0YXRlICE9IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8gIiVzOiBIRExDIGxpbmsgY29ubmVjdGVkIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdBTl9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8gIiVzOiBIRExDIGxpbmsgY29ubmVjdGluZy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogSERMQyBsaW5rIGRpc2Nvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FyZC0+d2FuZGV2LnN0YXRlID0gY2FyZC0+dS5jLnN0YXRlID0gc3RhdGU7CisJCWNoZGxjX3ByaXZfYXJlYS0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisgICAgICAgIH0KK30KKwordm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7CisgICAgICAgIGlmIChjYXJkLT5uZXh0KXsKKwkJLyogSXQgaXMgb2sgdG8gdXNlIHNwaW5fbG9jayBoZXJlLCBzaW5jZSB3ZQorCQkgKiBhbHJlYWR5IHR1cm5lZCBvZmYgaW50ZXJydXB0cyAqLworICAgICAgICAJc3Bpbl9sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJfQorfQorCit2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKwlpZiAoY2FyZC0+bmV4dCl7CisJCXNwaW5fdW5sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfY2hkbGMKKyAqCisgKglDb25maWd1cmUgdGhlIGNoZGxjIHByb3RvY29sIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMuCQkKKyAqCisgKiAgIAlUaGUgaWZfb3BlbigpIGZ1bmN0aW9uIGJpbmRzIHRoaXMgZnVuY3Rpb24gdG8gdGhlIHBvbGwgcm91dGluZS4KKyAqICAgICAgVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcnVuIGV2ZXJ5IHRpbWUgdGhlIGNoZGxjIGludGVyZmFjZQorICogICAgICBpcyBicm91Z2h0IHVwLiBXZSBjYW5ub3QgcnVuIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgaWZfb3BlbiAKKyAqICAgICAgYmVjYXVzZSBpZl9vcGVuIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSByZW1vdGUgSVAgYWRkcmVzcy4KKyAqICAgICAgCisgKglJZiB0aGUgY29tbXVuaWNhdGlvbnMgYXJlIG5vdCBlbmFibGVkLCBwcm9jZWVkIHRvIGNvbmZpZ3VyZQorICogICAgICB0aGUgY2FyZCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgorICoKKyAqICAgICAgSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBlbmFibGVkLCBpdCBtZWFucyB0aGF0IHRoZSBpbnRlcmZhY2UKKyAqICAgICAgd2FzIHNodXRkb3duIGJ5IGV0aGVyIHRoZSB1c2VyIG9yIGRyaXZlci4gSW4gdGhpcyBjYXNlLCB3ZSAKKyAqICAgICAgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBJUCBhZGRyZXNzZXMgaGF2ZSBub3QgY2hhbmdlZC4gIElmCisgKiAgICAgIHRoZSBJUCBhZGRyZXNzZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29uZmlndXJlIHRoZSBmaXJtd2FyZQorICogICAgICBhbmQgdXBkYXRlIHRoZSBjaGFuZ2VkIElQIGFkZHJlc3Nlcy4gIE90aGVyd2lzZSwganVzdCBleGl0LgorICoKKyAqLworCitzdGF0aWMgaW50IGNvbmZpZ19jaGRsYyAoc2RsYV90ICpjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpeworCQljaGRsY19jb21tX2Rpc2FibGUoY2FyZCk7CisJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCX0KKworCWlmIChzZXRfY2hkbGNfY29uZmlnKGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDSERMQyBDb25maWd1cmF0aW9uIEZhaWxlZCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpbml0X2NoZGxjX3R4X3J4X2J1ZmYoY2FyZCwgZGV2KTsKKworCS8qIFNldCBpbnRlcnJ1cHQgbW9kZSBhbmQgbWFzayAqLworICAgICAgICBpZiAoY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCBBUFBfSU5UX09OX1JYX0ZSQU1FIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fR0xPQkFMX0VYQ0VQX0NPTkQgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9UWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0NIRExDX0VYQ0VQX0NPTkQgfCBBUFBfSU5UX09OX1RJTUVSKSl7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHNldCBpbnRlcnJ1cHQgdHJpZ2dlcnMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMDsJCisgICAgICAgIH0KKwkKKworCS8qIE1hc2sgdGhlIFRyYW5zbWl0IGFuZCBUaW1lciBpbnRlcnJ1cHQgKi8KKwlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9IAorCQl+KEFQUF9JTlRfT05fVFhfRlJBTUUgfCBBUFBfSU5UX09OX1RJTUVSKTsKKworCisJaWYgKGNoZGxjX2NvbW1fZW5hYmxlKGNhcmQpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgY2hkbGMgY29tbXVuaWNhdGlvbnMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsKKwkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQljaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpemUgUngvVHggYnVmZmVyIGNvbnRyb2wgZmllbGRzICovCisJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCXJldHVybiAwOyAKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX3BwcF90ZXJtX3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlpZiAoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKDgpKSAhPSBOVUxMKSB7CisJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworCQlidWYgPSBza2JfcHV0KG5ld19za2IsIDgpOworCQlzcHJpbnRmKGJ1ZiwiJWMlYyVjJWMlYyVjJWMlYyIsIDB4RkYsMHgwMywweEMwLDB4MjEsMHgwNSwweDk4LDB4MDAsMHgwNyk7CisKKwkJLyogRGVjYXBzdWxhdGUgcGt0IGFuZCBwYXNzIGl0IHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOworCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCW5ld19za2ItPm1hYy5yYXcgID0gbmV3X3NrYi0+ZGF0YTsKKworCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9Cit9CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMgYi9kcml2ZXJzL25ldC93YW4vd2FueGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdiNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKQEAgLTAsMCArMSw4MzkgQEAKKy8qCisgKiB3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKiBob3N0IHBhcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFN0YXR1czoKKyAqICAgLSBPbmx5IERURSAoZXh0ZXJuYWwgY2xvY2spIHN1cHBvcnQgd2l0aCBOUlogYW5kIE5SWkkgZW5jb2RpbmdzCisgKiAgIC0gd2FuWEwxMDAgd2lsbCByZXF1aXJlIG1pbm9yIGRyaXZlciBtb2RpZmljYXRpb25zLCBubyBhY2Nlc3MgdG8gaHcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKworI2luY2x1ZGUgIndhbnhsLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIndhblhMIHNlcmlhbCBjYXJkIGRyaXZlciB2ZXJzaW9uOiAwLjQ4IjsKKworI2RlZmluZSBQTFhfQ1RMX1JFU0VUICAgMHg0MDAwMDAwMCAvKiBhZGFwdGVyIHJlc2V0ICovCisKKyN1bmRlZiBERUJVR19QS1QKKyN1bmRlZiBERUJVR19QQ0kKKworLyogTUFJTEJPWCAjMSAtIFBVVFMgQ09NTUFORFMgKi8KKyNkZWZpbmUgTUJYMV9DTURfQUJPUlRKIDB4ODUwMDAwMDAgLyogQWJvcnQgYW5kIEp1bXAgKi8KKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTUJYMV9DTURfQlNXQVAgIDB4OEMwMDAwMDEgLyogbGl0dGxlLWVuZGlhbiBCeXRlIFN3YXAgTW9kZSAqLworI2Vsc2UKKyNkZWZpbmUgTUJYMV9DTURfQlNXQVAgIDB4OEMwMDAwMDAgLyogYmlnLWVuZGlhbiBCeXRlIFN3YXAgTW9kZSAqLworI2VuZGlmCisKKy8qIE1BSUxCT1ggIzIgLSBEUkFNIFNJWkUgKi8KKyNkZWZpbmUgTUJYMl9NRU1TWl9NQVNLIDB4RkZGRjAwMDAgLyogUFVUUyBNZW1vcnkgU2l6ZSBSZWdpc3RlciBtYXNrICovCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNhcmRfdCAqY2FyZDsKKwlzcGlubG9ja190IGxvY2s7CS8qIGZvciB3YW54bF94bWl0ICovCisgICAgICAgIGludCBub2RlOwkJLyogcGh5c2ljYWwgcG9ydCAjMCAtIDMgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tfdHlwZTsKKwlpbnQgdHhfaW4sIHR4X291dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tic1tUWF9CVUZGRVJTXTsKK31wb3J0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRlc2NfdCByeF9kZXNjc1tSWF9RVUVVRV9MRU5HVEhdOworCXBvcnRfc3RhdHVzX3QgcG9ydF9zdGF0dXNbNF07Cit9Y2FyZF9zdGF0dXNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBjYXJkX3QgeworCWludCBuX3BvcnRzOwkJLyogMSwgMiBvciA0IHBvcnRzICovCisJdTggaXJxOworCisJdTggX19pb21lbSAqcGx4OwkvKiBQTFggUENJOTA2MCB2aXJ0dWFsIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBmb3IgcGNpX25hbWUocGRldikgKi8KKwlpbnQgcnhfaW47CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnNbUlhfUVVFVUVfTEVOR1RIXTsKKwljYXJkX3N0YXR1c190ICpzdGF0dXM7CS8qIHNoYXJlZCBiZXR3ZWVuIGhvc3QgYW5kIGNhcmQgKi8KKwlkbWFfYWRkcl90IHN0YXR1c19hZGRyZXNzOworCXBvcnRfdCBwb3J0c1swXTsJLyogMSAtIDQgcG9ydF90IHN0cnVjdHVyZXMgZm9sbG93ICovCit9Y2FyZF90OworCisKKworc3RhdGljIGlubGluZSBwb3J0X3QqIGRldl90b19wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHJldHVybiAocG9ydF90ICopZGV2X3RvX2hkbGMoZGV2KS0+cHJpdjsKK30KKworCitzdGF0aWMgaW5saW5lIHBvcnRfc3RhdHVzX3QqIGdldF9zdGF0dXMocG9ydF90ICpwb3J0KQoreworCXJldHVybiAmcG9ydC0+Y2FyZC0+c3RhdHVzLT5wb3J0X3N0YXR1c1twb3J0LT5ub2RlXTsKK30KKworCisjaWZkZWYgREVCVUdfUENJCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGNpX21hcF9zaW5nbGVfZGVidWcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKnB0ciwKKwkJCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJZG1hX2FkZHJfdCBhZGRyID0gcGNpX21hcF9zaW5nbGUocGRldiwgcHRyLCBzaXplLCBkaXJlY3Rpb24pOworCWlmIChhZGRyICsgc2l6ZSA+IDB4MTAwMDAwMDAwTEwpCisJCXByaW50ayhLRVJOX0NSSVQgIndhblhMICVzOiBwY2lfbWFwX3NpbmdsZSgpIHJldHVybmVkIG1lbW9yeSIKKwkJICAgICAgICIgYXQgMHglTFghXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcik7CisJcmV0dXJuIGFkZHI7Cit9CisKKyN1bmRlZiBwY2lfbWFwX3NpbmdsZQorI2RlZmluZSBwY2lfbWFwX3NpbmdsZSBwY2lfbWFwX3NpbmdsZV9kZWJ1ZworI2VuZGlmCisKKworLyogQ2FibGUgYW5kL29yIHBlcnNvbmFsaXR5IG1vZHVsZSBjaGFuZ2UgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YW54bF9jYWJsZV9pbnRyKHBvcnRfdCAqcG9ydCkKK3sKKwl1MzIgdmFsdWUgPSBnZXRfc3RhdHVzKHBvcnQpLT5jYWJsZTsKKwlpbnQgdmFsaWQgPSAxOworCWNvbnN0IGNoYXIgKmNhYmxlLCAqcG0sICpkdGUgPSAiIiwgKmRzciA9ICIiLCAqZGNkID0gIiI7CisKKwlzd2l0Y2godmFsdWUgJiAweDcpIHsKKwljYXNlIFNUQVRVU19DQUJMRV9WMzU6IGNhYmxlID0gIlYuMzUiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9YMjE6IGNhYmxlID0gIlguMjEiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9WMjQ6IGNhYmxlID0gIlYuMjQiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9FSUE1MzA6IGNhYmxlID0gIkVJQTUzMCI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX05PTkU6IGNhYmxlID0gIm5vIjsgYnJlYWs7CisJZGVmYXVsdDogY2FibGUgPSAiaW52YWxpZCI7CisJfQorCisJc3dpdGNoKCh2YWx1ZSA+PiBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpICYgMHg3KSB7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjM1OiBwbSA9ICJWLjM1IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfWDIxOiBwbSA9ICJYLjIxIjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjI0OiBwbSA9ICJWLjI0IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfRUlBNTMwOiBwbSA9ICJFSUE1MzAiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9OT05FOiBwbSA9ICJubyBwZXJzb25hbGl0eSI7IHZhbGlkID0gMDsgYnJlYWs7CisJZGVmYXVsdDogcG0gPSAiaW52YWxpZCBwZXJzb25hbGl0eSI7IHZhbGlkID0gMDsKKwl9CisKKwlpZiAodmFsaWQpIHsKKwkJaWYgKCh2YWx1ZSAmIDcpID09ICgodmFsdWUgPj4gU1RBVFVTX0NBQkxFX1BNX1NISUZUKSAmIDcpKSB7CisJCQlkc3IgPSAodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRFNSKSA/ICIsIERTUiBPTiIgOgorCQkJCSIsIERTUiBvZmYiOworCQkJZGNkID0gKHZhbHVlICYgU1RBVFVTX0NBQkxFX0RDRCkgPyAiLCBjYXJyaWVyIE9OIiA6CisJCQkJIiwgY2FycmllciBvZmYiOworCQl9CisJCWR0ZSA9ICh2YWx1ZSAmIFNUQVRVU19DQUJMRV9EQ0UpID8gIiBEQ0UiIDogIiBEVEUiOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMlcyBtb2R1bGUsICVzIGNhYmxlJXMlc1xuIiwKKwkgICAgICAgcG9ydC0+ZGV2LT5uYW1lLCBwbSwgZHRlLCBjYWJsZSwgZHNyLCBkY2QpOworCisJaGRsY19zZXRfY2Fycmllcih2YWx1ZSAmIFNUQVRVU19DQUJMRV9EQ0QsIHBvcnQtPmRldik7Cit9CisKKworCisvKiBUcmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgc2VydmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHdhbnhsX3R4X2ludHIocG9ydF90ICpwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgZGVzY190ICpkZXNjID0gJmdldF9zdGF0dXMocG9ydCktPnR4X2Rlc2NzW3BvcnQtPnR4X2luXTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBvcnQtPnR4X3NrYnNbcG9ydC0+dHhfaW5dOworCisJCXN3aXRjaCAoZGVzYy0+c3RhdCkgeworCQljYXNlIFBBQ0tFVF9GVUxMOgorCQljYXNlIFBBQ0tFVF9FTVBUWToKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybjsKKworCQljYXNlIFBBQ0tFVF9VTkRFUlJVTjoKKwkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCXN0YXRzLT50eF9maWZvX2Vycm9ycysrOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCX0KKyAgICAgICAgICAgICAgICBkZXNjLT5zdGF0ID0gUEFDS0VUX0VNUFRZOyAvKiBGcmVlIGRlc2NyaXB0b3IgKi8KKwkJcGNpX3VubWFwX3NpbmdsZShwb3J0LT5jYXJkLT5wZGV2LCBkZXNjLT5hZGRyZXNzLCBza2ItPmxlbiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgICAgICAgICAgICAgICAgcG9ydC0+dHhfaW4gPSAocG9ydC0+dHhfaW4gKyAxKSAlIFRYX0JVRkZFUlM7CisgICAgICAgIH0KK30KKworCisKKy8qIFJlY2VpdmUgY29tcGxldGUgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YW54bF9yeF9pbnRyKGNhcmRfdCAqY2FyZCkKK3sKKwlkZXNjX3QgKmRlc2M7CisJd2hpbGUgKGRlc2MgPSAmY2FyZC0+c3RhdHVzLT5yeF9kZXNjc1tjYXJkLT5yeF9pbl0sCisJICAgICAgIGRlc2MtPnN0YXQgIT0gUEFDS0VUX0VNUFRZKSB7CisJCWlmICgoZGVzYy0+c3RhdCAmIFBBQ0tFVF9QT1JUX01BU0spID4gY2FyZC0+bl9wb3J0cykKKwkJCXByaW50ayhLRVJOX0NSSVQgIndhblhMICVzOiByZWNlaXZlZCBwYWNrZXQgZm9yIgorCQkJICAgICAgICIgbm9uZXhpc3RlbnQgcG9ydFxuIiwgcGNpX25hbWUoY2FyZC0+cGRldikpOworCQllbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBjYXJkLT5yeF9za2JzW2NhcmQtPnJ4X2luXTsKKwkJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tkZXNjLT5zdGF0ICYKKwkJCQkJCSAgICBQQUNLRVRfUE9SVF9NQVNLXTsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT5kZXY7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwkJCWlmICghc2tiKQorCQkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCQllbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2MtPmFkZHJlc3MsCisJCQkJCQkgQlVGRkVSX0xFTkdUSCwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiLCBkZXNjLT5sZW5ndGgpOworCisjaWZkZWYgREVCVUdfUEtUCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFJYKCVpKToiLCBkZXYtPm5hbWUsCisJCQkJICAgICAgIHNrYi0+bGVuKTsKKwkJCQlkZWJ1Z19mcmFtZShza2IpOworI2VuZGlmCisJCQkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCXNrYiA9IE5VTEw7CisJCQl9CisKKwkJCWlmICghc2tiKSB7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihCVUZGRVJfTEVOR1RIKTsKKwkJCQlkZXNjLT5hZGRyZXNzID0gc2tiID8KKwkJCQkJcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkJICAgICAgIEJVRkZFUl9MRU5HVEgsCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKSA6IDA7CisJCQkJY2FyZC0+cnhfc2tic1tjYXJkLT5yeF9pbl0gPSBza2I7CisJCQl9CisJCX0KKwkJZGVzYy0+c3RhdCA9IFBBQ0tFVF9FTVBUWTsgLyogRnJlZSBkZXNjcmlwdG9yICovCisJCWNhcmQtPnJ4X2luID0gKGNhcmQtPnJ4X2luICsgMSkgJSBSWF9RVUVVRV9MRU5HVEg7CisJfQorfQorCisKKworc3RhdGljIGlycXJldHVybl90IHdhbnhsX2ludHIoaW50IGlycSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgY2FyZF90ICpjYXJkID0gZGV2X2lkOworICAgICAgICBpbnQgaTsKKyAgICAgICAgdTMyIHN0YXQ7CisgICAgICAgIGludCBoYW5kbGVkID0gMDsKKworCisgICAgICAgIHdoaWxlKChzdGF0ID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX0RPT1JCRUxMX0ZST01fQ0FSRCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gMTsKKwkJd3JpdGVsKHN0YXQsIGNhcmQtPnBseCArIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNhcmQtPm5fcG9ydHM7IGkrKykgeworCQkJaWYgKHN0YXQgJiAoMSA8PCAoRE9PUkJFTExfRlJPTV9DQVJEX1RYXzAgKyBpKSkpCisJCQkJd2FueGxfdHhfaW50cigmY2FyZC0+cG9ydHNbaV0pOworCQkJaWYgKHN0YXQgJiAoMSA8PCAoRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzAgKyBpKSkpCisJCQkJd2FueGxfY2FibGVfaW50cigmY2FyZC0+cG9ydHNbaV0pOworCQl9CisJCWlmIChzdGF0ICYgKDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1JYKSkKKwkJCXdhbnhsX3J4X2ludHIoY2FyZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisKK3N0YXRpYyBpbnQgd2FueGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWRlc2NfdCAqZGVzYzsKKworICAgICAgICBzcGluX2xvY2soJnBvcnQtPmxvY2spOworCisJZGVzYyA9ICZnZXRfc3RhdHVzKHBvcnQpLT50eF9kZXNjc1twb3J0LT50eF9vdXRdOworICAgICAgICBpZiAoZGVzYy0+c3RhdCAhPSBQQUNLRVRfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gcHJldmlvdXMgeG1pdCBzaG91bGQgc3RvcCBxdWV1ZSAqLworI2lmZGVmIERFQlVHX1BLVAorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgYnVmZmVyIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCQlyZXR1cm4gMTsgICAgICAgLyogcmVxdWVzdCBwYWNrZXQgdG8gYmUgcXVldWVkICovCisJfQorCisjaWZkZWYgREVCVUdfUEtUCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFRYKCVpKToiLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwlkZWJ1Z19mcmFtZShza2IpOworI2VuZGlmCisKKwlwb3J0LT50eF9za2JzW3BvcnQtPnR4X291dF0gPSBza2I7CisJZGVzYy0+YWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHBvcnQtPmNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRlc2MtPmxlbmd0aCA9IHNrYi0+bGVuOworCWRlc2MtPnN0YXQgPSBQQUNLRVRfRlVMTDsKKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9UWF8wICsgcG9ydC0+bm9kZSksCisJICAgICAgIHBvcnQtPmNhcmQtPnBseCArIFBMWF9ET09SQkVMTF9UT19DQVJEKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXBvcnQtPnR4X291dCA9IChwb3J0LT50eF9vdXQgKyAxKSAlIFRYX0JVRkZFUlM7CisKKwlpZiAoZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbcG9ydC0+dHhfb3V0XS5zdGF0ICE9IFBBQ0tFVF9FTVBUWSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisjaWZkZWYgREVCVUdfUEtUCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgYnVmZmVyIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJCXVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19OUlpJKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJpdHkgIT0gUEFSSVRZX05PTkUgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjBfQ0NJVFQgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQpCisJCXJldHVybiAtRUlOVkFMOworCisJZ2V0X3N0YXR1cyhwb3J0KS0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKwlnZXRfc3RhdHVzKHBvcnQpLT5wYXJpdHkgPSBwYXJpdHk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBsaW5lOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9TWU5DX1NFUklBTDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWxpbmUuY2xvY2tfdHlwZSA9IGdldF9zdGF0dXMocG9ydCktPmNsb2NraW5nOworCQlsaW5lLmNsb2NrX3JhdGUgPSAwOworCQlsaW5lLmxvb3BiYWNrID0gMDsKKworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmMsICZsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmUsIGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmMsCisJCQkJICAgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobGluZS5jbG9ja190eXBlICE9IENMT0NLX0VYVCAmJgorCQkgICAgbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYRlJPTVJYKQorCQkJcmV0dXJuIC1FSU5WQUw7IC8qIE5vIHN1Y2ggY2xvY2sgc2V0dGluZyAqLworCisJCWlmIChsaW5lLmxvb3BiYWNrICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlnZXRfc3RhdHVzKHBvcnQpLT5jbG9ja2luZyA9IGxpbmUuY2xvY2tfdHlwZTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKyAgICAgICAgfQorfQorCisKKworc3RhdGljIGludCB3YW54bF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1OCBfX2lvbWVtICpkYnIgPSBwb3J0LT5jYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfVE9fQ0FSRDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwlpZiAoZ2V0X3N0YXR1cyhwb3J0KS0+b3BlbikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwb3J0IGFscmVhZHkgb3BlblxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgoaSA9IGhkbGNfb3BlbihkZXYpKSAhPSAwKQorCQlyZXR1cm4gaTsKKworCXBvcnQtPnR4X2luID0gcG9ydC0+dHhfb3V0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfQlVGRkVSUzsgaSsrKQorCQlnZXRfc3RhdHVzKHBvcnQpLT50eF9kZXNjc1tpXS5zdGF0ID0gUEFDS0VUX0VNUFRZOworCS8qIHNpZ25hbCB0aGUgY2FyZCAqLworCXdyaXRlbCgxIDw8IChET09SQkVMTF9UT19DQVJEX09QRU5fMCArIHBvcnQtPm5vZGUpLCBkYnIpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwlkbworCQlpZiAoZ2V0X3N0YXR1cyhwb3J0KS0+b3BlbikgeworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJd2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIG9wZW4gcG9ydFxuIiwgZGV2LT5uYW1lKTsKKwkvKiBhc2sgdGhlIGNhcmQgdG8gY2xvc2UgdGhlIHBvcnQsIHNob3VsZCBpdCBiZSBzdGlsbCBhbGl2ZSAqLworCXdyaXRlbCgxIDw8IChET09SQkVMTF9UT19DQVJEX0NMT1NFXzAgKyBwb3J0LT5ub2RlKSwgZGJyKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworCisKK3N0YXRpYyBpbnQgd2FueGxfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgaTsKKworCWhkbGNfY2xvc2UoZGV2KTsKKwkvKiBzaWduYWwgdGhlIGNhcmQgKi8KKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wICsgcG9ydC0+bm9kZSksCisJICAgICAgIHBvcnQtPmNhcmQtPnBseCArIFBMWF9ET09SQkVMTF9UT19DQVJEKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJZG8KKwkJaWYgKCFnZXRfc3RhdHVzKHBvcnQpLT5vcGVuKQorCQkJYnJlYWs7CisJd2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCisJaWYgKGdldF9zdGF0dXMocG9ydCktPm9wZW4pCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBjbG9zZSBwb3J0XG4iLCBkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IFRYX0JVRkZFUlM7IGkrKykgeworCQlkZXNjX3QgKmRlc2MgPSAmZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbaV07CisKKwkJaWYgKGRlc2MtPnN0YXQgIT0gUEFDS0VUX0VNUFRZKSB7CisJCQlkZXNjLT5zdGF0ID0gUEFDS0VUX0VNUFRZOworCQkJcGNpX3VubWFwX3NpbmdsZShwb3J0LT5jYXJkLT5wZGV2LCBkZXNjLT5hZGRyZXNzLAorCQkJCQkgcG9ydC0+dHhfc2tic1tpXS0+bGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHBvcnQtPnR4X3NrYnNbaV0pOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3YW54bF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IGdldF9zdGF0dXMocG9ydCktPnJ4X292ZXJydW5zOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBnZXRfc3RhdHVzKHBvcnQpLT5yeF9mcmFtZV9lcnJvcnM7CisJc3RhdHMtPnJ4X2Vycm9ycyA9IHN0YXRzLT5yeF9vdmVyX2Vycm9ycyArIHN0YXRzLT5yeF9mcmFtZV9lcnJvcnM7CisgICAgICAgIHJldHVybiBzdGF0czsKK30KKworCisKK3N0YXRpYyBpbnQgd2FueGxfcHV0c19jb21tYW5kKGNhcmRfdCAqY2FyZCwgdTMyIGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgNSAqIEhaOworCisJd3JpdGVsKGNtZCwgY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMSk7CisJZG8geworCQlpZiAocmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMSkgPT0gMCkKKwkJCXJldHVybiAwOworCisJCXNjaGVkdWxlKCk7CisJfXdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCXJldHVybiAtMTsKK30KKworCisKK3N0YXRpYyB2b2lkIHdhbnhsX3Jlc2V0KGNhcmRfdCAqY2FyZCkKK3sKKwl1MzIgb2xkX3ZhbHVlID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpICYgflBMWF9DVExfUkVTRVQ7CisKKwl3cml0ZWwoMHg4MCwgY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMCk7CisJd3JpdGVsKG9sZF92YWx1ZSB8IFBMWF9DVExfUkVTRVQsIGNhcmQtPnBseCArIFBMWF9DT05UUk9MKTsKKwlyZWFkbChjYXJkLT5wbHggKyBQTFhfQ09OVFJPTCk7IC8qIHdhaXQgZm9yIHBvc3RlZCB3cml0ZSAqLworCXVkZWxheSgxKTsKKwl3cml0ZWwob2xkX3ZhbHVlLCBjYXJkLT5wbHggKyBQTFhfQ09OVFJPTCk7CisJcmVhZGwoY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpOyAvKiB3YWl0IGZvciBwb3N0ZWQgd3JpdGUgKi8KK30KKworCisKK3N0YXRpYyB2b2lkIHdhbnhsX3BjaV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWNhcmRfdCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5uX3BvcnRzOyBpKyspIHsKKwkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShjYXJkLT5wb3J0c1tpXS5kZXYpOworCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1tpXS5kZXYpOworCX0KKworCS8qIHVucmVnaXN0ZXIgYW5kIGZyZWUgYWxsIGhvc3QgcmVzb3VyY2VzICovCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCXdhbnhsX3Jlc2V0KGNhcmQpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0xFTkdUSDsgaSsrKQorCQlpZiAoY2FyZC0+cnhfc2tic1tpXSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LAorCQkJCQkgY2FyZC0+c3RhdHVzLT5yeF9kZXNjc1tpXS5hZGRyZXNzLAorCQkJCQkgQlVGRkVSX0xFTkdUSCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoY2FyZC0+cnhfc2tic1tpXSk7CisJCX0KKworCWlmIChjYXJkLT5wbHgpCisJCWlvdW5tYXAoY2FyZC0+cGx4KTsKKworCWlmIChjYXJkLT5zdGF0dXMpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKGNhcmRfc3RhdHVzX3QpLAorCQkJCSAgICBjYXJkLT5zdGF0dXMsIGNhcmQtPnN0YXR1c19hZGRyZXNzKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShjYXJkKTsKK30KKworCisjaW5jbHVkZSAid2FueGxmdy5pbmMiCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdhbnhsX3BjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwljYXJkX3QgKmNhcmQ7CisJdTMyIHJhbXNpemUsIHN0YXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUzMiBwbHhfcGh5OwkJLyogUExYIFBDSSBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgbWVtX3BoeTsJCS8qIG1lbW9yeSBQQ0kgYmFzZSBhZGRyICovCisJdTggX19pb21lbSAqbWVtOwkvKiBtZW1vcnkgdmlydHVhbCBiYXNlIGFkZHIgKi8KKwlpbnQgaSwgcG9ydHMsIGFsbG9jX3NpemU7CisKKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsKKwkJcHJpbnRlZF92ZXJzaW9uKys7CisJCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKwl9CisjZW5kaWYKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwkvKiBRVUlDQyBjYW4gb25seSBhY2Nlc3MgZmlyc3QgMjU2IE1CIG9mIGhvc3QgUkFNIGRpcmVjdGx5LAorCSAgIGJ1dCBQTFg5MDYwIERNQSBkb2VzIDMyLWJpdHMgZm9yIGFjdHVhbCBwYWNrZXQgZGF0YSB0cmFuc2ZlcnMgKi8KKworCS8qIEZJWE1FIHdoZW4gUENJL0RNQSBzdWJzeXN0ZW1zIGFyZSBmaXhlZC4KKwkgICBXZSBzZXQgYm90aCBkbWFfbWFzayBhbmQgY29uc2lzdGVudF9kbWFfbWFzayB0byAyOCBiaXRzCisJICAgYW5kIHByYXkgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSB3aWxsIHVzZSB0aGlzIGluZm8uIEl0IHNob3VsZAorCSAgIHdvcmsgb24gbW9zdCBwbGF0Zm9ybXMgKi8KKwlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4MEZGRkZGRkYpIHx8CisJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgMHgwRkZGRkZGRikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTDogTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIndhblhMIik7CisJaWYgKGkpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gaTsKKwl9CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9TQkVfV0FOWEwxMDA6IHBvcnRzID0gMTsgYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDIwMDogcG9ydHMgPSAyOyBicmVhazsKKwlkZWZhdWx0OiBwb3J0cyA9IDQ7CisJfQorCisJYWxsb2Nfc2l6ZSA9IHNpemVvZihjYXJkX3QpICsgcG9ydHMgKiBzaXplb2YocG9ydF90KTsKKwljYXJkID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FuWEwgJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltZW1zZXQoY2FyZCwgMCwgYWxsb2Nfc2l6ZSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJY2FyZC0+cGRldiA9IHBkZXY7CisKKwljYXJkLT5zdGF0dXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YoY2FyZF9zdGF0dXNfdCksCisJCQkJCSAgICAmY2FyZC0+c3RhdHVzX2FkZHJlc3MpOworCWlmIChjYXJkLT5zdGF0dXMgPT0gTlVMTCkgeworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworI2lmZGVmIERFQlVHX1BDSQorCXByaW50ayhLRVJOX0RFQlVHICJ3YW5YTCAlczogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSByZXR1cm5lZCBtZW1vcnkiCisJICAgICAgICIgYXQgMHglTFhcbiIsIHBjaV9uYW1lKHBkZXYpLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNhcmQtPnN0YXR1c19hZGRyZXNzKTsKKyNlbmRpZgorCisJLyogRklYTUUgd2hlbiBQQ0kvRE1BIHN1YnN5c3RlbXMgYXJlIGZpeGVkLgorCSAgIFdlIHNldCBib3RoIGRtYV9tYXNrIGFuZCBjb25zaXN0ZW50X2RtYV9tYXNrIGJhY2sgdG8gMzIgYml0cworCSAgIHRvIGluZGljYXRlIHRoZSBjYXJkIGNhbiBkbyAzMi1iaXQgRE1BIGFkZHJlc3NpbmcgKi8KKwlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkYpIHx8CisJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTDogTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHNldCB1cCBQTFggbWFwcGluZyAqLworCXBseF9waHkgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJY2FyZC0+cGx4ID0gaW9yZW1hcF9ub2NhY2hlKHBseF9waHksIDB4NzApOworCisjaWYgUkVTRVRfV0hJTEVfTE9BRElORworCXdhbnhsX3Jlc2V0KGNhcmQpOworI2VuZGlmCisKKwl0aW1lb3V0ID0gamlmZmllcyArIDIwICogSFo7CisJd2hpbGUgKChzdGF0ID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMCkpICE9IDApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKHRpbWVvdXQsIGppZmZpZXMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogdGltZW91dCB3YWl0aW5nIGZvciIKKwkJCSAgICAgICAiIFBVVFMgdG8gY29tcGxldGVcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlzd2l0Y2goc3RhdCAmIDB4QzApIHsKKwkJY2FzZSAweDAwOgkvKiBobW0gLSBQVVRTIGNvbXBsZXRlZCB3aXRoIG5vbi16ZXJvIGNvZGU/ICovCisJCWNhc2UgMHg4MDoJLyogUFVUUyBzdGlsbCB0ZXN0aW5nIHRoZSBoYXJkd2FyZSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiBQVVRTIHRlc3QgMHglWCIKKwkJCSAgICAgICAiIGZhaWxlZFxuIiwgcGNpX25hbWUocGRldiksIHN0YXQgJiAweDMwKTsKKwkJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKworCS8qIGdldCBvbi1ib2FyZCBtZW1vcnkgc2l6ZSAoUFVUUyBkZXRlY3RzIG5vIG1vcmUgdGhhbiA0IE1CKSAqLworCXJhbXNpemUgPSByZWFkbChjYXJkLT5wbHggKyBQTFhfTUFJTEJPWF8yKSAmIE1CWDJfTUVNU1pfTUFTSzsKKworCS8qIHNldCB1cCBvbi1ib2FyZCBSQU0gbWFwcGluZyAqLworCW1lbV9waHkgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisKKworCS8qIHNhbml0eSBjaGVjayB0aGUgYm9hcmQncyByZXBvcnRlZCBtZW1vcnkgc2l6ZSAqLworCWlmIChyYW1zaXplIDwgQlVGRkVSU19BRERSICsKKwkgICAgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIEJVRkZFUl9MRU5HVEggKiBwb3J0cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogbm8gZW5vdWdoIG9uLWJvYXJkIFJBTSIKKwkJICAgICAgICIgKCV1IGJ5dGVzIGRldGVjdGVkLCAldSBieXRlcyByZXF1aXJlZClcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcmFtc2l6ZSwgQlVGRkVSU19BRERSICsKKwkJICAgICAgIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogcG9ydHMpOworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHdhbnhsX3B1dHNfY29tbWFuZChjYXJkLCBNQlgxX0NNRF9CU1dBUCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHVuYWJsZSB0byBTZXQgQnl0ZSBTd2FwIgorCQkgICAgICAgIiBNb2RlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfTEVOR1RIOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoQlVGRkVSX0xFTkdUSCk7CisJCWNhcmQtPnJ4X3NrYnNbaV0gPSBza2I7CisJCWlmIChza2IpCisJCQljYXJkLT5zdGF0dXMtPnJ4X2Rlc2NzW2ldLmFkZHJlc3MgPQorCQkJCXBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgIEJVRkZFUl9MRU5HVEgsCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKworCW1lbSA9IGlvcmVtYXBfbm9jYWNoZShtZW1fcGh5LCBQRE1fT0ZGU0VUICsgc2l6ZW9mKGZpcm13YXJlKSk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihmaXJtd2FyZSk7IGkgKz0gNCkKKwkJd3JpdGVsKGh0b25sKCoodTMyKikoZmlybXdhcmUgKyBpKSksIG1lbSArIFBETV9PRkZTRVQgKyBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKQorCQl3cml0ZWwoY2FyZC0+c3RhdHVzX2FkZHJlc3MgKworCQkgICAgICAgKHZvaWQgKikmY2FyZC0+c3RhdHVzLT5wb3J0X3N0YXR1c1tpXSAtCisJCSAgICAgICAodm9pZCAqKWNhcmQtPnN0YXR1cywgbWVtICsgUERNX09GRlNFVCArIDQgKyBpICogNCk7CisJd3JpdGVsKGNhcmQtPnN0YXR1c19hZGRyZXNzLCBtZW0gKyBQRE1fT0ZGU0VUICsgMjApOworCXdyaXRlbChQRE1fT0ZGU0VULCBtZW0pOworCWlvdW5tYXAobWVtKTsKKworCXdyaXRlbCgwLCBjYXJkLT5wbHggKyBQTFhfTUFJTEJPWF81KTsKKworCWlmICh3YW54bF9wdXRzX2NvbW1hbmQoY2FyZCwgTUJYMV9DTURfQUJPUlRKKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogdW5hYmxlIHRvIEFib3J0IGFuZCBKdW1wXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3RhdCA9IDA7CisJdGltZW91dCA9IGppZmZpZXMgKyA1ICogSFo7CisJZG8geworCQlpZiAoKHN0YXQgPSByZWFkbChjYXJkLT5wbHggKyBQTFhfTUFJTEJPWF81KSkgIT0gMCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX13aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlpZiAoIXN0YXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHRpbWVvdXQgd2hpbGUgaW5pdGlhbGl6aW5nIGNhcmQiCisJCSAgICAgICAiZmlybXdhcmVcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2lmIERFVEVDVF9SQU0KKwlyYW1zaXplID0gc3RhdDsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAid2FuWEwgJXM6IGF0IDB4JVgsICV1IEtCIG9mIFJBTSBhdCAweCVYLCBpcnEgJXVcbiIsCisJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwbHhfcGh5LCByYW1zaXplIC8gMTAyNCwgbWVtX3BoeSwgcGRldi0+aXJxKTsKKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHdhbnhsX2ludHIsIFNBX1NISVJRLCAid2FuWEwiLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogY291bGQgbm90IGFsbG9jYXRlIElSUSVpLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEpOworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2FyZC0+aXJxID0gcGRldi0+aXJxOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspIHsKKwkJaGRsY19kZXZpY2UgKmhkbGM7CisJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tpXTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2hkbGNkZXYocG9ydCk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gYWxsb2NhdGUiCisJCQkgICAgICAgIiBtZW1vcnlcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlwb3J0LT5kZXYgPSBkZXY7CisJCWhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSA1MDsKKwkJZGV2LT5kb19pb2N0bCA9IHdhbnhsX2lvY3RsOworCQlkZXYtPm9wZW4gPSB3YW54bF9vcGVuOworCQlkZXYtPnN0b3AgPSB3YW54bF9jbG9zZTsKKwkJaGRsYy0+YXR0YWNoID0gd2FueGxfYXR0YWNoOworCQloZGxjLT54bWl0ID0gd2FueGxfeG1pdDsKKwkJZGV2LT5nZXRfc3RhdHMgPSB3YW54bF9nZXRfc3RhdHM7CisJCXBvcnQtPmNhcmQgPSBjYXJkOworCQlwb3J0LT5ub2RlID0gaTsKKwkJZ2V0X3N0YXR1cyhwb3J0KS0+Y2xvY2tpbmcgPSBDTE9DS19FWFQ7CisJCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyIKKwkJCSAgICAgICAiIGRldmljZVxuIiwgcGNpX25hbWUocGRldikpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWNhcmQtPm5fcG9ydHMrKzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJ3YW5YTCAlczogcG9ydCIsIHBjaV9uYW1lKHBkZXYpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKKwkJcHJpbnRrKCIlcyAjJWk6ICVzIiwgaSA/ICIsIiA6ICIiLCBpLAorCQkgICAgICAgY2FyZC0+cG9ydHNbaV0uZGV2LT5uYW1lKTsKKwlwcmludGsoIlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKKwkJd2FueGxfY2FibGVfaW50cigmY2FyZC0+cG9ydHNbaV0pOyAvKiBnZXQgY2FycmllciBzdGF0dXMgZXRjLiovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHdhbnhsX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9TQkUsIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMTAwLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TQkUsIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMjAwLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TQkUsIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMNDAwLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgd2FueGxfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAid2FuWEwiLAorCS5pZF90YWJsZQk9IHdhbnhsX3BjaV90YmwsCisJLnByb2JlCQk9IHdhbnhsX3BjaV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IHdhbnhsX3BjaV9yZW1vdmVfb25lLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB3YW54bF9pbml0X21vZHVsZSh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJndhbnhsX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2FueGxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJndhbnhsX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNCRSBJbmMuIHdhblhMIHNlcmlhbCBwb3J0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdhbnhsX3BjaV90YmwpOworCittb2R1bGVfaW5pdCh3YW54bF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh3YW54bF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FueGwuaCBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODY1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vd2FueGwuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIHdhblhMIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqIGRlZmluaXRpb25zIGNvbW1vbiB0byBob3N0IGRyaXZlciBhbmQgY2FyZCBmaXJtd2FyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2RlZmluZSBSRVNFVF9XSElMRV9MT0FESU5HIDAKKworLyogeW91IG11c3QgcmVidWlsZCB0aGUgZmlybXdhcmUgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgaXMgY2hhbmdlZCAqLworI2RlZmluZSBERVRFQ1RfUkFNIDAJCS8qIG5lZWRlZCBmb3IgPiA0TUIgUkFNLCAxNiBNQiBtYXhpbXVtICovCisjZGVmaW5lIFFVSUNDX01FTUNQWV9VU0VTX1BMWCAxCS8qIG11c3QgYmUgdXNlZCBpZiB0aGUgaG9zdCBoYXMgPiAyNTYgTUIgUkFNICovCisKKworI2RlZmluZSBTVEFUVVNfQ0FCTEVfVjM1CTIKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX1gyMQkzCisjZGVmaW5lIFNUQVRVU19DQUJMRV9WMjQJNAorI2RlZmluZSBTVEFUVVNfQ0FCTEVfRUlBNTMwCTUKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0lOVkFMSUQJNgorI2RlZmluZSBTVEFUVVNfQ0FCTEVfTk9ORQk3CisKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0RDRQkweDgwMDAKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0RTUgkweDAwMTAKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0RDRAkweDAwMDgKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX1BNX1NISUZUCTUKKworI2RlZmluZSBQRE1fT0ZGU0VUIDB4MTAwMAorCisjZGVmaW5lIFRYX0JVRkZFUlMgMTAJCS8qIHBlciBwb3J0ICovCisjZGVmaW5lIFJYX0JVRkZFUlMgMzAKKyNkZWZpbmUgUlhfUVVFVUVfTEVOR1RIIDQwCS8qIGNhcmQtPmhvc3QgcXVldWUgbGVuZ3RoIC0gcGVyIGNhcmQgKi8KKworI2RlZmluZSBQQUNLRVRfRU1QVFkJCTB4MDAKKyNkZWZpbmUgUEFDS0VUX0ZVTEwJCTB4MTAKKyNkZWZpbmUgUEFDS0VUX1NFTlQJCTB4MjAgLyogVFggb25seSAqLworI2RlZmluZSBQQUNLRVRfVU5ERVJSVU4JCTB4MzAgLyogVFggb25seSAqLworI2RlZmluZSBQQUNLRVRfUE9SVF9NQVNLCTB4MDMgLyogUlggb25seSAqLworCisvKiBiaXQgbnVtYmVycyBpbiBQTFg5MDYwIGRvb3JiZWxsIHJlZ2lzdGVycyAqLworI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfVFhfMAkJMCAvKiBwYWNrZXQgc2VudCBieSB0aGUgY2FyZCAqLworI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfVFhfMQkJMQorI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfVFhfMgkJMgorI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfVFhfMwkJMworI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfUlgJCTQKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzAJNSAvKiBjYWJsZS9QTS9ldGMuIGNoYW5nZWQgKi8KKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzEJNgorI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMgk3CisjZGVmaW5lIERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8zCTgKKworI2RlZmluZSBET09SQkVMTF9UT19DQVJEX09QRU5fMAkJMAorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX09QRU5fMQkJMQorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX09QRU5fMgkJMgorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX09QRU5fMwkJMworI2RlZmluZSBET09SQkVMTF9UT19DQVJEX0NMT1NFXzAJNAorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX0NMT1NFXzEJNQorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX0NMT1NFXzIJNgorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX0NMT1NFXzMJNworI2RlZmluZSBET09SQkVMTF9UT19DQVJEX1RYXzAJCTggLyogb3V0Ym91bmQgcGFja2V0IHF1ZXVlZCAqLworI2RlZmluZSBET09SQkVMTF9UT19DQVJEX1RYXzEJCTkKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8yCQkxMAorI2RlZmluZSBET09SQkVMTF9UT19DQVJEX1RYXzMJCTExCisKKy8qIGZpcm13YXJlLW9ubHkgc3RhdHVzIGJpdHMsIHN0YXJ0aW5nIGZyb20gbGFzdCBET09SQkVMTF9UT19DQVJEICsgMSAqLworI2RlZmluZSBUQVNLX1NDQ18wCQkJMTIKKyNkZWZpbmUgVEFTS19TQ0NfMQkJCTEzCisjZGVmaW5lIFRBU0tfU0NDXzIJCQkxNAorI2RlZmluZSBUQVNLX1NDQ18zCQkJMTUKKworI2RlZmluZSBBTElHTjMyKHgpICgoKHgpICsgMykgJiAweEZGRkZGRkZDKQorI2RlZmluZSBCVUZGRVJfTEVOR1RICUFMSUdOMzIoSERMQ19NQVhfTVJVICsgNCkgLyogNCBieXRlcyBmb3IgMzItYml0IENSQyAqLworCisvKiBBZGRyZXNzIG9mIFRYIGFuZCBSWCBidWZmZXJzIGluIDY4MzYwIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgQlVGRkVSU19BRERSCTB4NDAwMAkvKiAxNiBLQiAqLworCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgUExYX09GRlNFVAkJMAorI2Vsc2UKKyNkZWZpbmUgUExYX09GRlNFVAkJUExYICsgMHg4MAorI2VuZGlmCisKKyNkZWZpbmUgUExYX01BSUxCT1hfMAkJKFBMWF9PRkZTRVQgKyAweDQwKQorI2RlZmluZSBQTFhfTUFJTEJPWF8xCQkoUExYX09GRlNFVCArIDB4NDQpCisjZGVmaW5lIFBMWF9NQUlMQk9YXzIJCShQTFhfT0ZGU0VUICsgMHg0OCkKKyNkZWZpbmUgUExYX01BSUxCT1hfMwkJKFBMWF9PRkZTRVQgKyAweDRDKQorI2RlZmluZSBQTFhfTUFJTEJPWF80CQkoUExYX09GRlNFVCArIDB4NTApCisjZGVmaW5lIFBMWF9NQUlMQk9YXzUJCShQTFhfT0ZGU0VUICsgMHg1NCkKKyNkZWZpbmUgUExYX01BSUxCT1hfNgkJKFBMWF9PRkZTRVQgKyAweDU4KQorI2RlZmluZSBQTFhfTUFJTEJPWF83CQkoUExYX09GRlNFVCArIDB4NUMpCisjZGVmaW5lIFBMWF9ET09SQkVMTF9UT19DQVJECShQTFhfT0ZGU0VUICsgMHg2MCkKKyNkZWZpbmUgUExYX0RPT1JCRUxMX0ZST01fQ0FSRAkoUExYX09GRlNFVCArIDB4NjQpCisjZGVmaW5lIFBMWF9JTlRFUlJVUFRfQ1MJKFBMWF9PRkZTRVQgKyAweDY4KQorI2RlZmluZSBQTFhfQ09OVFJPTAkJKFBMWF9PRkZTRVQgKyAweDZDKQorCisjaWZkZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBQTFhfRE1BXzBfTU9ERQkJKFBMWCArIDB4MTAwKQorI2RlZmluZSBQTFhfRE1BXzBfUENJCQkoUExYICsgMHgxMDQpCisjZGVmaW5lIFBMWF9ETUFfMF9MT0NBTAkJKFBMWCArIDB4MTA4KQorI2RlZmluZSBQTFhfRE1BXzBfTEVOR1RICShQTFggKyAweDEwQykKKyNkZWZpbmUgUExYX0RNQV8wX0RFU0MJCShQTFggKyAweDExMCkKKyNkZWZpbmUgUExYX0RNQV8xX01PREUJCShQTFggKyAweDExNCkKKyNkZWZpbmUgUExYX0RNQV8xX1BDSQkJKFBMWCArIDB4MTE4KQorI2RlZmluZSBQTFhfRE1BXzFfTE9DQUwJCShQTFggKyAweDExQykKKyNkZWZpbmUgUExYX0RNQV8xX0xFTkdUSAkoUExYICsgMHgxMjApCisjZGVmaW5lIFBMWF9ETUFfMV9ERVNDCQkoUExYICsgMHgxMjQpCisjZGVmaW5lIFBMWF9ETUFfQ01EX1NUUwkJKFBMWCArIDB4MTI4KQorI2RlZmluZSBQTFhfRE1BX0FSQklUUl8wCShQTFggKyAweDEyQykKKyNkZWZpbmUgUExYX0RNQV9BUkJJVFJfMQkoUExYICsgMHgxMzApCisjZW5kaWYKKworI2RlZmluZSBERVNDX0xFTkdUSCAxMgorCisvKiBvZmZzZXRzIGZyb20gc3RhcnQgb2Ygc3RhdHVzX3QgKi8KKy8qIGNhcmQgdG8gaG9zdCAqLworI2RlZmluZSBTVEFUVVNfT1BFTgkJMAorI2RlZmluZSBTVEFUVVNfQ0FCTEUJCShTVEFUVVNfT1BFTiArIDQpCisjZGVmaW5lIFNUQVRVU19SWF9PVkVSUlVOUwkoU1RBVFVTX0NBQkxFICsgNCkKKyNkZWZpbmUgU1RBVFVTX1JYX0ZSQU1FX0VSUk9SUwkoU1RBVFVTX1JYX09WRVJSVU5TICsgNCkKKworLyogaG9zdCB0byBjYXJkICovCisjZGVmaW5lIFNUQVRVU19QQVJJVFkJCShTVEFUVVNfUlhfRlJBTUVfRVJST1JTICsgNCkKKyNkZWZpbmUgU1RBVFVTX0VOQ09ESU5HCQkoU1RBVFVTX1BBUklUWSArIDQpCisjZGVmaW5lIFNUQVRVU19DTE9DS0lORwkJKFNUQVRVU19FTkNPRElORyArIDQpCisjZGVmaW5lIFNUQVRVU19UWF9ERVNDUwkJKFNUQVRVU19DTE9DS0lORyArIDQpCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdTMyIHN0YXQ7CisJdTMyIGFkZHJlc3M7CQkvKiBQQ0kgYWRkcmVzcyAqLworCXZvbGF0aWxlIHUzMiBsZW5ndGg7Cit9ZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IHsKKy8vIENhcmQgdG8gaG9zdAorCXZvbGF0aWxlIHUzMiBvcGVuOworCXZvbGF0aWxlIHUzMiBjYWJsZTsKKwl2b2xhdGlsZSB1MzIgcnhfb3ZlcnJ1bnM7CisJdm9sYXRpbGUgdTMyIHJ4X2ZyYW1lX2Vycm9yczsKKworLy8gSG9zdCB0byBjYXJkCisJdTMyIHBhcml0eTsKKwl1MzIgZW5jb2Rpbmc7CisJdTMyIGNsb2NraW5nOworCWRlc2NfdCB0eF9kZXNjc1tUWF9CVUZGRVJTXTsKK31wb3J0X3N0YXR1c190OworCisjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsZncuUyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bGZ3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhYWUyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bGZ3LlMKQEAgLTAsMCArMSw4OTUgQEAKKy5wc2l6ZSAwCisvKgorICB3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgIGNhcmQgZmlybXdhcmUgcGFydAorCisgIENvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisKKworCisJRFBSQU0gQkRzOgorCTB4MDAwIC0gMHgwNTAgVFgjMAkweDA1MCAtIDB4MTQwIFJYIzAKKwkweDE0MCAtIDB4MTkwIFRYIzEJMHgxOTAgLSAweDI4MCBSWCMxCisJMHgyODAgLSAweDJEMCBUWCMyCTB4MkQwIC0gMHgzQzAgUlgjMgorCTB4M0MwIC0gMHg0MTAgVFgjMwkweDQxMCAtIDB4NTAwIFJYIzMKKworCisJMDAwIDVGRiAxNTM2IEJ5dGVzIER1YWwtUG9ydCBSQU0gVXNlciBEYXRhIC8gQkRzCisJNjAwIDZGRiAyNTYgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBVc2VyIERhdGEgLyBCRHMKKwk3MDAgN0ZGIDI1NiBCeXRlcyBEdWFsLVBvcnQgUkFNIFVzZXIgRGF0YSAvIEJEcworCUMwMCBDQkYgMTkyIEJ5dGVzIER1YWwtUG9ydCBSQU0gUGFyYW1ldGVyIFJBTSBQYWdlIDEKKwlEMDAgREJGIDE5MiBCeXRlcyBEdWFsLVBvcnQgUkFNIFBhcmFtZXRlciBSQU0gUGFnZSAyCisJRTAwIEVCRiAxOTIgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBQYXJhbWV0ZXIgUkFNIFBhZ2UgMworCUYwMCBGQkYgMTkyIEJ5dGVzIER1YWwtUG9ydCBSQU0gUGFyYW1ldGVyIFJBTSBQYWdlIDQKKworCWxvY2FsIGludGVycnVwdHMJCSAgICBsZXZlbAorCU5NSQkJCQkJNworCVBJVCB0aW1lciwgQ1BNIChSWC9UWCBjb21wbGV0ZSkJCTQKKwlQQ0k5MDYwCURNQSBhbmQgUENJIGRvb3JiZWxscwkJMworCUNhYmxlIC0gbm90IHVzZWQJCQkxCisqLworCisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorI2luY2x1ZGUgIndhbnhsLmgiCisKKy8qIG1lbW9yeSBhZGRyZXNzZXMgYW5kIG9mZnNldHMgKi8KKworTUFYX1JBTV9TSVpFCT0gMTYgKiAxMDI0ICogMTAyNAkvLyBtYXggUkFNIHN1cHBvcnRlZCBieSBoYXJkd2FyZQorCitQQ0k5MDYwX1ZFQ1RPUgk9IDB4MDAwMDAwNkMKK0NQTV9JUlFfQkFTRQk9IDB4NDAKK0VSUk9SX1ZFQ1RPUgk9IENQTV9JUlFfQkFTRSAqIDQKK1NDQzFfVkVDVE9SCT0gKENQTV9JUlFfQkFTRSArIDB4MUUpICogNAorU0NDMl9WRUNUT1IJPSAoQ1BNX0lSUV9CQVNFICsgMHgxRCkgKiA0CitTQ0MzX1ZFQ1RPUgk9IChDUE1fSVJRX0JBU0UgKyAweDFDKSAqIDQKK1NDQzRfVkVDVE9SCT0gKENQTV9JUlFfQkFTRSArIDB4MUIpICogNAorQ1BNX0lSUV9MRVZFTAk9IDQKK1RJTUVSX0lSUQk9IDEyOAorVElNRVJfSVJRX0xFVkVMID0gNAorUElUUl9DT05TVAk9IDB4MTAwICsgMTYJCS8vIDEgSHogdGltZXIKKworTUJBUgkJPSAweDAwMDNGRjAwCisKK1ZBTFVFX1dJTkRPVwk9IDB4NDAwMDAwMDAKK09SREVSX1dJTkRPVwk9IDB4QzAwMDAwMDAKKworUExYCQk9IDB4RkZGOTAwMDAKKworQ1NSQQkJPSAweEZGRkIwMDAwCitDU1JCCQk9IDB4RkZGQjAwMDIKK0NTUkMJCT0gMHhGRkZCMDAwNAorQ1NSRAkJPSAweEZGRkIwMDA2CitTVEFUVVNfQ0FCTEVfTEwJCT0gMHgyMDAwCitTVEFUVVNfQ0FCTEVfRFRSCT0gMHgxMDAwCisKK0RQUkJBU0UJCT0gMHhGRkZDMDAwMAorCitTQ0MxX0JBU0UJPSBEUFJCQVNFICsgMHhDMDAKK01JU0NfQkFTRQk9IERQUkJBU0UgKyAweENCMAorU0NDMl9CQVNFCT0gRFBSQkFTRSArIDB4RDAwCitTQ0MzX0JBU0UJPSBEUFJCQVNFICsgMHhFMDAKK1NDQzRfQkFTRQk9IERQUkJBU0UgKyAweEYwMAorCisvLyBvZmZzZXQgZnJvbSBTQ0N4X0JBU0UKKy8vIFNDQ194QkFTRSBjb250YWluIG9mZnNldHMgZnJvbSBEUFJCQVNFIGFuZCBtdXN0IGJlIGRpdmlzaWJsZSBieSA4CitTQ0NfUkJBU0UJPSAwCQkvLyAxNi1iaXQgUnhCRCBiYXNlIGFkZHJlc3MKK1NDQ19UQkFTRQk9IDIJCS8vIDE2LWJpdCBUeEJEIGJhc2UgYWRkcmVzcworU0NDX1JGQ1IJPSA0CQkvLyA4LWJpdCBSeCBmdW5jdGlvbiBjb2RlCitTQ0NfVEZDUgk9IDUJCS8vIDgtYml0IFR4IGZ1bmN0aW9uIGNvZGUKK1NDQ19NUkJMUgk9IDYJCS8vIDE2LWJpdCBtYXhpbXVtIFJ4IGJ1ZmZlciBsZW5ndGgKK1NDQ19DX01BU0sJPSAweDM0CQkvLyAzMi1iaXQgQ1JDIGNvbnN0YW50CitTQ0NfQ19QUkVTCT0gMHgzOAkJLy8gMzItYml0IENSQyBwcmVzZXQKK1NDQ19NRkxSCT0gMHg0NgkJLy8gMTYtYml0IG1heCBSeCBmcmFtZSBsZW5ndGggKHdpdGhvdXQgZmxhZ3MpCisKK1JFR0JBU0UJCT0gRFBSQkFTRSArIDB4MTAwMAorUElDUgkJPSBSRUdCQVNFICsgMHgwMjYJLy8gMTYtYml0IHBlcmlvZGljIGlycSBjb250cm9sCitQSVRSCQk9IFJFR0JBU0UgKyAweDAyQQkvLyAxNi1iaXQgcGVyaW9kaWMgaXJxIHRpbWluZworT1IxCQk9IFJFR0JBU0UgKyAweDA2NAkvLyAzMi1iaXQgUkFNIGJhbmsgIzEgb3B0aW9ucworQ0lDUgkJPSBSRUdCQVNFICsgMHg1NDAJLy8gMzIoMjQpLWJpdCBDUCBpbnRlcnJ1cHQgY29uZmlnCitDSU1SCQk9IFJFR0JBU0UgKyAweDU0OAkvLyAzMi1iaXQgQ1AgaW50ZXJydXB0IG1hc2sKK0NJU1IJCT0gUkVHQkFTRSArIDB4NTRDCS8vIDMyLWJpdCBDUCBpbnRlcnJ1cHRzIGluLXNlcnZpY2UKK1BBRElSCQk9IFJFR0JBU0UgKyAweDU1MAkvLyAxNi1iaXQgUG9ydEEgZGF0YSBkaXJlY3Rpb24gYml0bWFwCitQQVBBUgkJPSBSRUdCQVNFICsgMHg1NTIJLy8gMTYtYml0IFBvcnRBIHBpbiBhc3NpZ25tZW50IGJpdG1hcAorUEFPRFIJCT0gUkVHQkFTRSArIDB4NTU0CS8vIDE2LWJpdCBQb3J0QSBvcGVuIGRyYWluIGJpdG1hcAorUEFEQVQJCT0gUkVHQkFTRSArIDB4NTU2CS8vIDE2LWJpdCBQb3J0QSBkYXRhIHJlZ2lzdGVyCisKK1BDRElSCQk9IFJFR0JBU0UgKyAweDU2MAkvLyAxNi1iaXQgUG9ydEMgZGF0YSBkaXJlY3Rpb24gYml0bWFwCitQQ1BBUgkJPSBSRUdCQVNFICsgMHg1NjIJLy8gMTYtYml0IFBvcnRDIHBpbiBhc3NpZ25tZW50IGJpdG1hcAorUENTTwkJPSBSRUdCQVNFICsgMHg1NjQJLy8gMTYtYml0IFBvcnRDIHNwZWNpYWwgb3B0aW9ucworUENEQVQJCT0gUkVHQkFTRSArIDB4NTY2CS8vIDE2LWJpdCBQb3J0QyBkYXRhIHJlZ2lzdGVyCitQQ0lOVAkJPSBSRUdCQVNFICsgMHg1NjgJLy8gMTYtYml0IFBvcnRDIGludGVycnVwdCBjb250cm9sCitDUgkJPSBSRUdCQVNFICsgMHg1QzAJLy8gMTYtYml0IENvbW1hbmQgcmVnaXN0ZXIKKworU0NDMV9SRUdTCT0gUkVHQkFTRSArIDB4NjAwCitTQ0MyX1JFR1MJPSBSRUdCQVNFICsgMHg2MjAKK1NDQzNfUkVHUwk9IFJFR0JBU0UgKyAweDY0MAorU0NDNF9SRUdTCT0gUkVHQkFTRSArIDB4NjYwCitTSUNSCQk9IFJFR0JBU0UgKyAweDZFQwkvLyAzMi1iaXQgU0kgY2xvY2sgcm91dGUKKworLy8gb2Zmc2V0IGZyb20gU0NDeF9SRUdTCitTQ0NfR1NNUl9MCT0gMHgwMAkvLyAzMiBiaXRzCitTQ0NfR1NNUl9ICT0gMHgwNAkvLyAzMiBiaXRzCitTQ0NfUFNNUgk9IDB4MDgJLy8gMTYgYml0cworU0NDX1RPRFIJPSAweDBDCS8vIDE2IGJpdHMKK1NDQ19EU1IJCT0gMHgwRQkvLyAxNiBiaXRzCitTQ0NfU0NDRQk9IDB4MTAJLy8gMTYgYml0cworU0NDX1NDQ00JPSAweDE0CS8vIDE2IGJpdHMKK1NDQ19TQ0NTCT0gMHgxNwkvLyA4IGJpdHMKKworI2lmIFFVSUNDX01FTUNQWV9VU0VTX1BMWAorCS5tYWNybyBtZW1jcHlfZnJvbV9wY2kgc3JjLCBkZXN0LCBsZW4gLy8gbGVuIG11c3QgYmUgPCA4IE1CCisJYWRkbCAjMywgXGxlbgorCWFuZGwgIzB4RkZGRkZGRkMsIFxsZW4JCS8vIGFsd2F5cyBjb3B5IG4gKiA0IGJ5dGVzCisJbW92ZWwgXHNyYywgUExYX0RNQV8wX1BDSQorCW1vdmVsIFxkZXN0LCBQTFhfRE1BXzBfTE9DQUwKKwltb3ZlbCBcbGVuLCBQTFhfRE1BXzBfTEVOR1RICisJbW92ZWwgIzB4MDEwMywgUExYX0RNQV9DTURfU1RTCS8vIHN0YXJ0IGNoYW5uZWwgMCB0cmFuc2ZlcgorCWJzciBtZW1jcHlfZnJvbV9wY2lfcnVuCisJLmVuZG0KKworCS5tYWNybyBtZW1jcHlfdG9fcGNpIHNyYywgZGVzdCwgbGVuCisJYWRkbCAjMywgXGxlbgorCWFuZGwgIzB4RkZGRkZGRkMsIFxsZW4JCS8vIGFsd2F5cyBjb3B5IG4gKiA0IGJ5dGVzCisJbW92ZWwgXHNyYywgUExYX0RNQV8xX0xPQ0FMCisJbW92ZWwgXGRlc3QsIFBMWF9ETUFfMV9QQ0kKKwltb3ZlbCBcbGVuLCBQTFhfRE1BXzFfTEVOR1RICisJbW92ZWwgIzB4MDMwMSwgUExYX0RNQV9DTURfU1RTCS8vIHN0YXJ0IGNoYW5uZWwgMSB0cmFuc2ZlcgorCWJzciBtZW1jcHlfdG9fcGNpX3J1bgorCS5lbmRtCisKKyNlbHNlCisKKwkubWFjcm8gbWVtY3B5IHNyYywgZGVzdCwgbGVuCS8vIGxlbiBtdXN0IGJlIDwgNjU1MzYgYnl0ZXMKKwltb3ZlbCAlZDcsIC0oJXNwKQkJLy8gc3JjIGFuZCBkZXN0IG11c3QgYmUgPCAyNTYgTUIKKwltb3ZlbCBcbGVuLCAlZDcJCQkvLyBiaXRzIDAgYW5kIDEKKwlsc3JsICMyLCBcbGVuCisJYW5kbCBcbGVuLCBcbGVuCisJYmVxIDk5ZgkJCQkvLyBvbmx5IDAgLSAzIGJ5dGVzCisJc3VibCAjMSwgXGxlbgkJCS8vIGZvciBkYmYKKzk4Ogltb3ZlbCAoXHNyYykrLCAoXGRlc3QpKworCWRiZncgXGxlbiwgOThiCis5OToJbW92ZWwgJWQ3LCBcbGVuCisJYnRzdGwgIzEsIFxsZW4KKwliZXEgOTlmCisJbW92ZXcgKFxzcmMpKywgKFxkZXN0KSsKKzk5OglidHN0bCAjMCwgXGxlbgorCWJlcSA5OWYKKwltb3ZlYiAoXHNyYykrLCAoXGRlc3QpKworOTk6CisJbW92ZWwgKCVzcCkrLCAlZDcKKwkuZW5kbQorCisJLm1hY3JvIG1lbWNweV9mcm9tX3BjaSBzcmMsIGRlc3QsIGxlbgorCWFkZGwgI1ZBTFVFX1dJTkRPVywgXHNyYworCW1lbWNweSBcc3JjLCBcZGVzdCwgXGxlbgorCS5lbmRtCisKKwkubWFjcm8gbWVtY3B5X3RvX3BjaSBzcmMsIGRlc3QsIGxlbgorCWFkZGwgI1ZBTFVFX1dJTkRPVywgXGRlc3QKKwltZW1jcHkgXHNyYywgXGRlc3QsIFxsZW4KKwkuZW5kbQorI2VuZGlmCisKKworCS5tYWNybyB3YWl0X2Zvcl9jb21tYW5kCis5OToJYnRzdGwgIzAsIENSCisJYm5lIDk5YgorCS5lbmRtCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY2FyZCBpbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqLworCS50ZXh0CisJLmdsb2JhbCBfc3RhcnQKK19zdGFydDoJYnJhIGluaXQKKworCS5vcmcgX3N0YXJ0ICsgNAorY2hfc3RhdHVzX2FkZHI6CS5sb25nIDAsIDAsIDAsIDAKK3J4X2Rlc2NzX2FkZHI6CS5sb25nIDAKKworaW5pdDoKKyNpZiBERVRFQ1RfUkFNCisJbW92ZWwgT1IxLCAlZDAKKwlhbmRsICMweEYwMDAwN0ZGLCAlZDAJCS8vIG1hc2sgQU14eCBiaXRzCisJb3JsICMweEZGRkY4MDAgJiB+KE1BWF9SQU1fU0laRSAtIDEpLCAlZDAgLy8gdXBkYXRlIFJBTSBiYW5rIHNpemUKKwltb3ZlbCAlZDAsIE9SMQorI2VuZGlmCisKKwlhZGRsICNWQUxVRV9XSU5ET1csIHJ4X2Rlc2NzX2FkZHIgLy8gUENJIGFkZHJlc3NlcyBvZiBzaGFyZWQgZGF0YQorCWNscmwgJWQwCQkJLy8gRDAgPSA0ICogcG9ydAoraW5pdF8xOgl0c3RsIGNoX3N0YXR1c19hZGRyKCVkMCkKKwliZXEgaW5pdF8yCisJYWRkbCAjVkFMVUVfV0lORE9XLCBjaF9zdGF0dXNfYWRkciglZDApCitpbml0XzI6CWFkZGwgIzQsICVkMAorCWNtcGwgIzQgKiA0LCAlZDAKKwlibmUgaW5pdF8xCisKKwltb3ZlbCAjcGNpOTA2MF9pbnRlcnJ1cHQsIFBDSTkwNjBfVkVDVE9SCisJbW92ZWwgI2Vycm9yX2ludGVycnVwdCwgRVJST1JfVkVDVE9SCisJbW92ZWwgI3BvcnRfaW50ZXJydXB0XzEsIFNDQzFfVkVDVE9SCisJbW92ZWwgI3BvcnRfaW50ZXJydXB0XzIsIFNDQzJfVkVDVE9SCisJbW92ZWwgI3BvcnRfaW50ZXJydXB0XzMsIFNDQzNfVkVDVE9SCisJbW92ZWwgI3BvcnRfaW50ZXJydXB0XzQsIFNDQzRfVkVDVE9SCisJbW92ZWwgI3RpbWVyX2ludGVycnVwdCwgVElNRVJfSVJRICogNAorCisJbW92ZWwgIzB4NzgwMDAwMDAsIENJTVIJCS8vIG9ubHkgU0NDeCBJUlFzIGZyb20gQ1BNCisJbW92ZXcgIyhUSU1FUl9JUlFfTEVWRUwgPDwgOCkgKyBUSU1FUl9JUlEsIFBJQ1IJLy8gaW50ZXJydXB0IGZyb20gUElUCisJbW92ZXcgI1BJVFJfQ09OU1QsIFBJVFIKKworCS8vIFNDQzE9U0NDYSBTQ0MyPVNDQ2IgU0NDMz1TQ0NjIFNDQzQ9U0NDZCBwcmlvPTQgSFA9LTEgSVJRPTY0LTc5CisJbW92ZWwgIzB4RDQxRjQwICsgKENQTV9JUlFfTEVWRUwgPDwgMTMpLCBDSUNSCisJbW92ZWwgIzB4NTQzLCBQTFhfRE1BXzBfTU9ERQkvLyAzMi1iaXQsIFJlYWR5LCBCdXJzdCwgSVJRCisJbW92ZWwgIzB4NTQzLCBQTFhfRE1BXzFfTU9ERQorCW1vdmVsICMweDAsIFBMWF9ETUFfMF9ERVNDCS8vIGZyb20gUENJIHRvIGxvY2FsCisJbW92ZWwgIzB4OCwgUExYX0RNQV8xX0RFU0MJLy8gZnJvbSBsb2NhbCB0byBQQ0kKKwltb3ZlbCAjMHgxMDEsIFBMWF9ETUFfQ01EX1NUUwkvLyBlbmFibGUgYm90aCBETUEgY2hhbm5lbHMKKwkvLyBlbmFibGUgbG9jYWwgSVJRLCBETUEsIGRvb3JiZWxscyBhbmQgUENJIElSUQorCW9ybCAjMHgwMDBGMDMwMCwgUExYX0lOVEVSUlVQVF9DUworCisjaWYgREVURUNUX1JBTQorCWJzciByYW1fdGVzdAorI2Vsc2UKKwltb3ZlbCAjMSwgUExYX01BSUxCT1hfNQkJLy8gbm9uLXplcm8gdmFsdWUgPSBpbml0IGNvbXBsZXRlCisjZW5kaWYKKwlic3IgY2hlY2tfY3NyCisKKwltb3ZldyAjMHhGRkZGLCBQQVBBUgkJLy8gYWxsIHBpbnMgYXJlIGNsb2Nrcy9kYXRhCisJY2xydyBQQURJUgkJCS8vIGZpcnN0IGZ1bmN0aW9uCisJY2xydyBQQ1NPCQkJLy8gQ0QgYW5kIENUUyBhbHdheXMgYWN0aXZlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBtYWluIGxvb3AgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21haW46CW1vdmVsIGNoYW5uZWxfc3RhdHMsICVkNwkvLyBENyA9IGRvb3JiZWxsICsgaXJxIHN0YXR1cworCWNscmwgY2hhbm5lbF9zdGF0cworCisJdHN0bCAlZDcKKwlibmUgbWFpbl8xCisJLy8gbm90aGluZyB0byBkbyAtIHdhaXQgZm9yIG5leHQgZXZlbnQKKwlzdG9wICMweDIyMDAJCQkvLyBzdXBlcnZpc29yICsgSVJRIGxldmVsIDIKKwltb3ZldyAjMHgyNzAwLCAlc3IJCS8vIGRpc2FibGUgSVJRcyBhZ2FpbgorCWJyYSBtYWluCisKK21haW5fMToJY2xybCAlZDAJCQkvLyBEMCA9IDQgKiBwb3J0CisJY2xybCAlZDYJCQkvLyBENiA9IGRvb3JiZWxsIHRvIGhvc3QgdmFsdWUKKworbWFpbl9sOiBidHN0bCAjRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wLCAlZDcKKwliZXEgbWFpbl9vcAorCWJjbHJsICNET09SQkVMTF9UT19DQVJEX09QRU5fMCwgJWQ3IC8vIGluIGNhc2UgYm90aCBiaXRzIGFyZSBzZXQKKwlic3IgY2xvc2VfcG9ydAorbWFpbl9vcDoKKwlidHN0bCAjRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAsICVkNworCWJlcSBtYWluX2NsCisJYnNyIG9wZW5fcG9ydAorbWFpbl9jbDoKKwlidHN0bCAjRE9PUkJFTExfVE9fQ0FSRF9UWF8wLCAlZDcKKwliZXEgbWFpbl90eGVuZAorCWJzciB0eAorbWFpbl90eGVuZDoKKwlidHN0bCAjVEFTS19TQ0NfMCwgJWQ3CisJYmVxIG1haW5fbmV4dAorCWJzciB0eF9lbmQKKwlic3IgcngKKworbWFpbl9uZXh0OgorCWxzcmwgIzEsICVkNwkJCS8vIHBvcnQgc3RhdHVzIGZvciBuZXh0IHBvcnQKKwlhZGRsICM0LCAlZDAJCQkvLyBEMCA9IDQgKiBuZXh0IHBvcnQKKwljbXBsICM0ICogNCwgJWQwCisJYm5lIG1haW5fbAorCW1vdmVsICVkNiwgUExYX0RPT1JCRUxMX0ZST01fQ0FSRCAvLyBzaWduYWwgdGhlIGhvc3QKKwlicmEgbWFpbgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogb3BlbiBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitvcGVuX3BvcnQ6CQkJCS8vIEQwID0gNCAqIHBvcnQsIEQ2ID0gZG9vcmJlbGwgdG8gaG9zdAorCW1vdmVsIGNoX3N0YXR1c19hZGRyKCVkMCksICVhMAkvLyBBMCA9IHBvcnQgc3RhdHVzIGFkZHJlc3MKKwl0c3RsIFNUQVRVU19PUEVOKCVhMCkKKwlibmUgb3Blbl9wb3J0X3JldAkJLy8gcG9ydCBhbHJlYWR5IG9wZW4KKwltb3ZlbCAjMSwgU1RBVFVTX09QRU4oJWEwKQkvLyBjb25maXJtIHRoZSBwb3J0IGlzIG9wZW4KKy8vIHNldHVwIEJEcworCWNscmwgdHhfaW4oJWQwKQorCWNscmwgdHhfb3V0KCVkMCkKKwljbHJsIHR4X2NvdW50KCVkMCkKKwljbHJsIHJ4X2luKCVkMCkKKworCW1vdmVsIFNJQ1IsICVkMQkJCS8vIEQxID0gY2xvY2sgc2V0dGluZ3MgaW4gU0lDUgorCWFuZGwgY2xvY2tpbmdfbWFzayglZDApLCAlZDEKKwljbXBsICNDTE9DS19UWEZST01SWCwgU1RBVFVTX0NMT0NLSU5HKCVhMCkKKwlibmUgb3Blbl9wb3J0X2Nsb2NrX2V4dAorCW9ybCBjbG9ja2luZ190eGZyb21yeCglZDApLCAlZDEKKwlicmEgb3Blbl9wb3J0X3NldF9jbG9jaworCitvcGVuX3BvcnRfY2xvY2tfZXh0OgorCW9ybCBjbG9ja2luZ19leHQoJWQwKSwgJWQxCitvcGVuX3BvcnRfc2V0X2Nsb2NrOgorCW1vdmVsICVkMSwgU0lDUgkJCS8vIHVwZGF0ZSBjbG9jayBzZXR0aW5ncyBpbiBTSUNSCisKKwlvcncgI1NUQVRVU19DQUJMRV9EVFIsIGNzcl9vdXRwdXQoJWQwKQkvLyBEVFIgb24KKwlic3IgY2hlY2tfY3NyCQkJLy8gY2FsbCB3aXRoIGRpc2FibGVkIHRpbWVyIGludGVycnVwdAorCisvLyBTZXR1cCBUWCBkZXNjcmlwdG9ycworCW1vdmVsIGZpcnN0X2J1ZmZlciglZDApLCAlZDEJLy8gRDEgPSBzdGFydGluZyBidWZmZXIgYWRkcmVzcworCW1vdmVsIHR4X2ZpcnN0X2JkKCVkMCksICVhMQkvLyBBMSA9IHN0YXJ0aW5nIFRYIEJEIGFkZHJlc3MKKwltb3ZlbCAjVFhfQlVGRkVSUyAtIDIsICVkMgkvLyBEMiA9IFRYX0JVRkZFUlMgLSAxIGNvdW50ZXIKKwltb3ZlbCAjMHgxODAwMDAwMCwgJWQzCQkvLyBEMyA9IGluaXRpYWwgVFggQkQgZmxhZ3M6IEludCArIExhc3QKKwljbXBsICNQQVJJVFlfTk9ORSwgU1RBVFVTX1BBUklUWSglYTApCisJYmVxIG9wZW5fcG9ydF90eF9sb29wCisJYnNldGwgIzI2LCAlZDMJCQkvLyBUWCBCRCBmbGFnOiBUcmFuc21pdCBDUkMKK29wZW5fcG9ydF90eF9sb29wOgorCW1vdmVsICVkMywgKCVhMSkrCQkvLyBUWCBmbGFncyArIGxlbmd0aAorCW1vdmVsICVkMSwgKCVhMSkrCQkvLyBidWZmZXIgYWRkcmVzcworCWFkZGwgI0JVRkZFUl9MRU5HVEgsICVkMQorCWRiZncgJWQyLCBvcGVuX3BvcnRfdHhfbG9vcAorCisJYnNldGwgIzI5LCAlZDMJCQkvLyBUWCBCRCBmbGFnOiBXcmFwIChsYXN0IEJEKQorCW1vdmVsICVkMywgKCVhMSkrCQkvLyBGaW5hbCBUWCBmbGFncyArIGxlbmd0aAorCW1vdmVsICVkMSwgKCVhMSkrCQkvLyBidWZmZXIgYWRkcmVzcworCisvLyBTZXR1cCBSWCBkZXNjcmlwdG9ycwkJCS8vIEExID0gc3RhcnRpbmcgUlggQkQgYWRkcmVzcworCW1vdmVsICNSWF9CVUZGRVJTIC0gMiwgJWQyCS8vIEQyID0gUlhfQlVGRkVSUyAtIDEgY291bnRlcgorb3Blbl9wb3J0X3J4X2xvb3A6CisJbW92ZWwgIzB4OTAwMDAwMDAsICglYTEpKwkvLyBSWCBmbGFncyArIGxlbmd0aAorCW1vdmVsICVkMSwgKCVhMSkrCQkvLyBidWZmZXIgYWRkcmVzcworCWFkZGwgI0JVRkZFUl9MRU5HVEgsICVkMQorCWRiZncgJWQyLCBvcGVuX3BvcnRfcnhfbG9vcAorCisJbW92ZWwgIzB4QjAwMDAwMDAsICglYTEpKwkvLyBGaW5hbCBSWCBmbGFncyArIGxlbmd0aAorCW1vdmVsICVkMSwgKCVhMSkrCQkvLyBidWZmZXIgYWRkcmVzcworCisvLyBTZXR1cCBwb3J0IHBhcmFtZXRlcnMKKwltb3ZlbCBzY2NfYmFzZV9hZGRyKCVkMCksICVhMQkvLyBBMSA9IFNDQ19CQVNFIGFkZHJlc3MKKwltb3ZlbCBzY2NfcmVnX2FkZHIoJWQwKSwgJWEyCS8vIEEyID0gU0NDX1JFR1MgYWRkcmVzcworCisJbW92ZWwgIzB4RkZGRiwgU0NDX1NDQ0UoJWEyKQkvLyBjbGVhciBzdGF0dXMgYml0cworCW1vdmVsICMweDAwMDAsIFNDQ19TQ0NNKCVhMikJLy8gaW50ZXJydXB0IG1hc2sKKworCW1vdmVsIHR4X2ZpcnN0X2JkKCVkMCksICVkMQorCW1vdmV3ICVkMSwgU0NDX1RCQVNFKCVhMSkJLy8gRDEgPSBvZmZzZXQgb2YgZmlyc3QgVHhCRAorCWFkZGwgI1RYX0JVRkZFUlMgKiA4LCAlZDEKKwltb3ZldyAlZDEsIFNDQ19SQkFTRSglYTEpCS8vIEQxID0gb2Zmc2V0IG9mIGZpcnN0IFJ4QkQKKwltb3ZlYiAjMHg4LCBTQ0NfUkZDUiglYTEpCS8vIEludGVsIG1vZGUsIDEwMDAKKwltb3ZlYiAjMHg4LCBTQ0NfVEZDUiglYTEpCisKKy8vIFBhcml0eSBzZXR0aW5ncworCWNtcGwgI1BBUklUWV9DUkMxNl9QUjFfQ0NJVFQsIFNUQVRVU19QQVJJVFkoJWEwKQorCWJuZSBvcGVuX3BvcnRfcGFyaXR5XzEKKwljbHJ3IFNDQ19QU01SKCVhMikJCS8vIENSQzE2LUNDSVRUCisJbW92ZWwgIzB4RjBCOCwgU0NDX0NfTUFTSyglYTEpCisJbW92ZWwgIzB4RkZGRiwgU0NDX0NfUFJFUyglYTEpCisJbW92ZXcgI0hETENfTUFYX01SVSArIDIsIFNDQ19NRkxSKCVhMSkgLy8gMiBieXRlcyBmb3IgQ1JDCisJbW92ZXcgIzIsIHBhcml0eV9ieXRlcyglZDApCisJYnJhIG9wZW5fcG9ydF8yCisKK29wZW5fcG9ydF9wYXJpdHlfMToKKwljbXBsICNQQVJJVFlfQ1JDMzJfUFIxX0NDSVRULCBTVEFUVVNfUEFSSVRZKCVhMCkKKwlibmUgb3Blbl9wb3J0X3Bhcml0eV8yCisJbW92ZXcgIzB4MDgwMCwgU0NDX1BTTVIoJWEyKQkvLyBDUkMzMi1DQ0lUVAorCW1vdmVsICMweERFQkIyMEUzLCBTQ0NfQ19NQVNLKCVhMSkKKwltb3ZlbCAjMHhGRkZGRkZGRiwgU0NDX0NfUFJFUyglYTEpCisJbW92ZXcgI0hETENfTUFYX01SVSArIDQsIFNDQ19NRkxSKCVhMSkgLy8gNCBieXRlcyBmb3IgQ1JDCisJbW92ZXcgIzQsIHBhcml0eV9ieXRlcyglZDApCisJYnJhIG9wZW5fcG9ydF8yCisKK29wZW5fcG9ydF9wYXJpdHlfMjoKKwljbXBsICNQQVJJVFlfQ1JDMTZfUFIwX0NDSVRULCBTVEFUVVNfUEFSSVRZKCVhMCkKKwlibmUgb3Blbl9wb3J0X3Bhcml0eV8zCisJY2xydyBTQ0NfUFNNUiglYTIpCQkvLyBDUkMxNi1DQ0lUVCBwcmVzZXQgMAorCW1vdmVsICMweEYwQjgsIFNDQ19DX01BU0soJWExKQorCWNscmwgU0NDX0NfUFJFUyglYTEpCisJbW92ZXcgI0hETENfTUFYX01SVSArIDIsIFNDQ19NRkxSKCVhMSkgLy8gMiBieXRlcyBmb3IgQ1JDCisJbW92ZXcgIzIsIHBhcml0eV9ieXRlcyglZDApCisJYnJhIG9wZW5fcG9ydF8yCisKK29wZW5fcG9ydF9wYXJpdHlfMzoKKwljbXBsICNQQVJJVFlfQ1JDMzJfUFIwX0NDSVRULCBTVEFUVVNfUEFSSVRZKCVhMCkKKwlibmUgb3Blbl9wb3J0X3Bhcml0eV80CisJbW92ZXcgIzB4MDgwMCwgU0NDX1BTTVIoJWEyKQkvLyBDUkMzMi1DQ0lUVCBwcmVzZXQgMAorCW1vdmVsICMweERFQkIyMEUzLCBTQ0NfQ19NQVNLKCVhMSkKKwljbHJsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyA0LCBTQ0NfTUZMUiglYTEpIC8vIDQgYnl0ZXMgZm9yIENSQworCW1vdmV3ICM0LCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzQ6CisJY2xydyBTQ0NfUFNNUiglYTIpCQkvLyBubyBwYXJpdHkKKwltb3ZlbCAjMHhGMEI4LCBTQ0NfQ19NQVNLKCVhMSkKKwltb3ZlbCAjMHhGRkZGLCBTQ0NfQ19QUkVTKCVhMSkKKwltb3ZldyAjSERMQ19NQVhfTVJVLCBTQ0NfTUZMUiglYTEpIC8vIDAgYnl0ZXMgZm9yIENSQworCWNscncgcGFyaXR5X2J5dGVzKCVkMCkKKworb3Blbl9wb3J0XzI6CisJbW92ZWwgIzB4MDAwMDAwMDMsIFNDQ19HU01SX0goJWEyKSAvLyBSVFNNCisJY21wbCAjRU5DT0RJTkdfTlJaSSwgU1RBVFVTX0VOQ09ESU5HKCVhMCkKKwlibmUgb3Blbl9wb3J0X25yegorCW1vdmVsICMweDEwMDQwOTAwLCBTQ0NfR1NNUl9MKCVhMikgLy8gTlJaSTogVENJIFRlbmQgUkVDTitURU5DPTEKKwlicmEgb3Blbl9wb3J0XzMKKworb3Blbl9wb3J0X25yejoKKwltb3ZlbCAjMHgxMDA0MDAwMCwgU0NDX0dTTVJfTCglYTIpIC8vIE5SWjogVENJIFRlbmQgUkVDTitURU5DPTAKK29wZW5fcG9ydF8zOgorCW1vdmV3ICNCVUZGRVJfTEVOR1RILCBTQ0NfTVJCTFIoJWExKQorCW1vdmVsICVkMCwgJWQxCisJbHNsbCAjNCwgJWQxCQkJLy8gRDEgYml0cyA3IGFuZCA2ID0gcG9ydAorCW9ybCAjMSwgJWQxCisJbW92ZXcgJWQxLCBDUgkJCS8vIEluaXQgU0NDIFJYIGFuZCBUWCBwYXJhbXMKKwl3YWl0X2Zvcl9jb21tYW5kCisKKwkvLyBUQ0kgVGVuZCBFTlIgRU5UCisJbW92ZXcgIzB4MDAxRiwgU0NDX1NDQ00oJWEyKQkvLyBUWEUgUlhGIEJTWSBUWEIgUlhCIGludGVycnVwdHMKKwlvcmwgIzB4MDAwMDAwMzAsIFNDQ19HU01SX0woJWEyKSAvLyBlbmFibGUgU0NDCitvcGVuX3BvcnRfcmV0OgorCXJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY2xvc2UgcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjbG9zZV9wb3J0OgkJCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKKwltb3ZlbCBzY2NfcmVnX2FkZHIoJWQwKSwgJWEwCS8vIEEwID0gU0NDX1JFR1MgYWRkcmVzcworCWNscncgU0NDX1NDQ00oJWEwKQkJLy8gbm8gU0NDIGludGVycnVwdHMKKwlhbmRsICMweEZGRkZGRkNGLCBTQ0NfR1NNUl9MKCVhMCkgLy8gRGlzYWJsZSBFTlQgYW5kIEVOUgorCisJYW5kdyAjflNUQVRVU19DQUJMRV9EVFIsIGNzcl9vdXRwdXQoJWQwKSAvLyBEVFIgb2ZmCisJYnNyIGNoZWNrX2NzcgkJCS8vIGNhbGwgd2l0aCBkaXNhYmxlZCB0aW1lciBpbnRlcnJ1cHQKKworCW1vdmVsIGNoX3N0YXR1c19hZGRyKCVkMCksICVkMQorCWNscmwgU1RBVFVTX09QRU4oJWQxKQkJLy8gY29uZmlybSB0aGUgcG9ydCBpcyBjbG9zZWQKKwlydHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRyYW5zbWl0IHBhY2tldCAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIHF1ZXVlIHBhY2tldHMgZm9yIHRyYW5zbWlzc2lvbgordHg6CQkJCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKKwljbXBsICNUWF9CVUZGRVJTLCB0eF9jb3VudCglZDApCisJYmVxIHR4X3JldAkJCS8vIGFsbCBEQidzID0gZGVzY3MgaW4gdXNlCisKKwltb3ZlbCB0eF9vdXQoJWQwKSwgJWQxCisJbW92ZWwgJWQxLCAlZDIJCQkvLyBEMSA9IEQyID0gdHhfb3V0IEJEIyA9IGRlc2MjCisJbXVsdWwgI0RFU0NfTEVOR1RILCAlZDIJCS8vIEQyID0gVFggZGVzYyBvZmZzZXQKKwlhZGRsIGNoX3N0YXR1c19hZGRyKCVkMCksICVkMgorCWFkZGwgI1NUQVRVU19UWF9ERVNDUywgJWQyCS8vIEQyID0gVFggZGVzYyBhZGRyZXNzCisJY21wbCAjUEFDS0VUX0ZVTEwsICglZDIpCS8vIGRlc2Mgc3RhdHVzCisJYm5lIHR4X3JldAorCisvLyBxdWV1ZSBpdAorCW1vdmVsIDQoJWQyKSwgJWEwCQkvLyBQQ0kgYWRkcmVzcworCWxzbGwgIzMsICVkMQkJCS8vIEJEIGlzIDgtYnl0ZXMgbG9uZworCWFkZGwgdHhfZmlyc3RfYmQoJWQwKSwgJWQxCS8vIEQxID0gY3VycmVudCB0eF9vdXQgQkQgYWRkcgorCisJbW92ZWwgNCglZDEpLCAlYTEJCS8vIEExID0gZGVzdCBhZGRyZXNzCisJbW92ZWwgOCglZDIpLCAlZDIJCS8vIEQyID0gbGVuZ3RoCisJbW92ZXcgJWQyLCAyKCVkMSkJCS8vIGxlbmd0aCBpbnRvIEJECisJbWVtY3B5X2Zyb21fcGNpICVhMCwgJWExLCAlZDIKKwlic2V0bCAjMzEsICglZDEpCQkvLyBDUCBnbyBhaGVhZAorCisvLyB1cGRhdGUgdHhfb3V0IGFuZCB0eF9jb3VudAorCW1vdmVsIHR4X291dCglZDApLCAlZDEKKwlhZGRsICMxLCAlZDEKKwljbXBsICNUWF9CVUZGRVJTLCAlZDEKKwlibmUgdHhfMQorCWNscmwgJWQxCit0eF8xOgltb3ZlbCAlZDEsIHR4X291dCglZDApCisKKwlhZGRsICMxLCB0eF9jb3VudCglZDApCisJYnJhIHR4CisKK3R4X3JldDogcnRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwYWNrZXQgcmVjZWl2ZWQgKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFNlcnZpY2UgcmVjZWl2ZSBidWZmZXJzCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKK3J4Ogltb3ZlbCByeF9pbiglZDApLCAlZDEJCS8vIEQxID0gcnhfaW4gQkQjCisJbHNsbCAjMywgJWQxCQkJLy8gQkQgaXMgOC1ieXRlcyBsb25nCisJYWRkbCByeF9maXJzdF9iZCglZDApLCAlZDEJLy8gRDEgPSBjdXJyZW50IHJ4X2luIEJEIGFkZHJlc3MKKwltb3ZldyAoJWQxKSwgJWQyCQkvLyBEMiA9IFJYIEJEIGZsYWdzCisJYnRzdGwgIzE1LCAlZDIKKwlibmUgcnhfcmV0CQkJLy8gQkQgc3RpbGwgZW1wdHkKKworCWJ0c3RsICMxLCAlZDIKKwlibmUgcnhfb3ZlcnJ1bgorCisJdHN0dyBwYXJpdHlfYnl0ZXMoJWQwKQorCWJuZSByeF9wYXJpdHkKKwliY2xybCAjMiwgJWQyCQkJLy8gZG8gbm90IHRlc3QgZm9yIENSQyBlcnJvcnMKK3J4X3Bhcml0eToKKwlhbmR3ICMweDBDQkMsICVkMgkJLy8gbWFzayBzdGF0dXMgYml0cworCWNtcHcgIzB4MEMwMCwgJWQyCQkvLyBjb3JyZWN0IGZyYW1lCisJYm5lIHJ4X2JhZF9mcmFtZQorCWNscmwgJWQzCisJbW92ZXcgMiglZDEpLCAlZDMKKwlzdWJ3IHBhcml0eV9ieXRlcyglZDApLCAlZDMJLy8gRDMgPSBwYWNrZXQgbGVuZ3RoCisJY21wdyAjSERMQ19NQVhfTVJVLCAlZDMKKwliZ3QgcnhfYmFkX2ZyYW1lCisKK3J4X2dvb2RfZnJhbWU6CisJbW92ZWwgcnhfb3V0LCAlZDIKKwltdWx1bCAjREVTQ19MRU5HVEgsICVkMgorCWFkZGwgcnhfZGVzY3NfYWRkciwgJWQyCQkvLyBEMiA9IFJYIGRlc2MgYWRkcmVzcworCWNtcGwgI1BBQ0tFVF9FTVBUWSwgKCVkMikJLy8gZGVzYyBzdGF0CisJYm5lIHJ4X292ZXJydW4KKworCW1vdmVsICVkMywgOCglZDIpCisJbW92ZWwgNCglZDEpLCAlYTAJCS8vIEEwID0gc291cmNlIGFkZHJlc3MKKwltb3ZlbCA0KCVkMiksICVhMQorCXRzdGwgJWExCisJYmVxIHJ4X2lnbm9yZV9kYXRhCisJbWVtY3B5X3RvX3BjaSAlYTAsICVhMSwgJWQzCityeF9pZ25vcmVfZGF0YToKKwltb3ZlbCBwYWNrZXRfZnVsbCglZDApLCAoJWQyKQkvLyB1cGRhdGUgZGVzYyBzdGF0CisKKy8vIHVwZGF0ZSBENiBhbmQgcnhfb3V0CisJYnNldGwgI0RPT1JCRUxMX0ZST01fQ0FSRF9SWCwgJWQ2IC8vIHNpZ25hbCBob3N0IHRoYXQgUlggY29tcGxldGVkCisJbW92ZWwgcnhfb3V0LCAlZDIKKwlhZGRsICMxLCAlZDIKKwljbXBsICNSWF9RVUVVRV9MRU5HVEgsICVkMgorCWJuZSByeF8xCisJY2xybCAlZDIKK3J4XzE6CW1vdmVsICVkMiwgcnhfb3V0CisKK3J4X2ZyZWVfYmQ6CisJYW5kdyAjMHhGMDAwLCAoJWQxKQkJLy8gY2xlYXIgQ00gYW5kIGVycm9yIGJpdHMKKwlic2V0bCAjMzEsICglZDEpCQkvLyBmcmVlIEJECisvLyB1cGRhdGUgcnhfaW4KKwltb3ZlbCByeF9pbiglZDApLCAlZDEKKwlhZGRsICMxLCAlZDEKKwljbXBsICNSWF9CVUZGRVJTLCAlZDEKKwlibmUgcnhfMgorCWNscmwgJWQxCityeF8yOgltb3ZlbCAlZDEsIHJ4X2luKCVkMCkKKwlicmEgcngKKworcnhfb3ZlcnJ1bjoKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDIKKwlhZGRsICMxLCBTVEFUVVNfUlhfT1ZFUlJVTlMoJWQyKQorCWJyYSByeF9mcmVlX2JkCisKK3J4X2JhZF9mcmFtZToKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDIKKwlhZGRsICMxLCBTVEFUVVNfUlhfRlJBTUVfRVJST1JTKCVkMikKKwlicmEgcnhfZnJlZV9iZAorCityeF9yZXQ6IHJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcGFja2V0IHRyYW5zbWl0dGVkICoqKioqKioqKioqKioqKioqKioqLworCisvLyBTZXJ2aWNlIHRyYW5zbWl0IGJ1ZmZlcnMJCS8vIEQwID0gNCAqIHBvcnQsIEQ2ID0gZG9vcmJlbGwgdG8gaG9zdAordHhfZW5kOgl0c3RsIHR4X2NvdW50KCVkMCkKKwliZXEgdHhfZW5kX3JldAkJCS8vIFRYIGJ1ZmZlcnMgYWxyZWFkeSBlbXB0eQorCisJbW92ZWwgdHhfaW4oJWQwKSwgJWQxCisJbW92ZWwgJWQxLCAlZDIJCQkvLyBEMSA9IEQyID0gdHhfaW4gQkQjID0gZGVzYyMKKwlsc2xsICMzLCAlZDEJCQkvLyBCRCBpcyA4LWJ5dGVzIGxvbmcKKwlhZGRsIHR4X2ZpcnN0X2JkKCVkMCksICVkMQkvLyBEMSA9IGN1cnJlbnQgdHhfaW4gQkQgYWRkcmVzcworCW1vdmV3ICglZDEpLCAlZDMJCS8vIEQzID0gVFggQkQgZmxhZ3MKKwlidHN0bCAjMTUsICVkMworCWJuZSB0eF9lbmRfcmV0CQkJLy8gQkQgc3RpbGwgYmVpbmcgdHJhbnNtaXR0ZWQKKworLy8gdXBkYXRlIEQ2LCB0eF9pbiBhbmQgdHhfY291bnQKKwlvcmwgYmVsbF90eCglZDApLCAlZDYJCS8vIHNpZ25hbCBob3N0IHRoYXQgVFggZGVzYyBmcmVlZAorCXN1YmwgIzEsIHR4X2NvdW50KCVkMCkKKwltb3ZlbCB0eF9pbiglZDApLCAlZDEKKwlhZGRsICMxLCAlZDEKKwljbXBsICNUWF9CVUZGRVJTLCAlZDEKKwlibmUgdHhfZW5kXzEKKwljbHJsICVkMQordHhfZW5kXzE6CisJbW92ZWwgJWQxLCB0eF9pbiglZDApCisKKy8vIGZyZWUgaG9zdCdzIGRlc2NyaXB0b3IKKwltdWx1bCAjREVTQ19MRU5HVEgsICVkMgkJLy8gRDIgPSBUWCBkZXNjIG9mZnNldAorCWFkZGwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWQyCisJYWRkbCAjU1RBVFVTX1RYX0RFU0NTLCAlZDIJLy8gRDIgPSBUWCBkZXNjIGFkZHJlc3MKKwlidHN0bCAjMSwgJWQzCisJYm5lIHR4X2VuZF91bmRlcnJ1bgorCW1vdmVsICNQQUNLRVRfU0VOVCwgKCVkMikKKwlicmEgdHhfZW5kCisKK3R4X2VuZF91bmRlcnJ1bjoKKwltb3ZlbCAjUEFDS0VUX1VOREVSUlVOLCAoJWQyKQorCWJyYSB0eF9lbmQKKwordHhfZW5kX3JldDogcnRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQTFggUENJOTA2MCBETUEgbWVtY3B5ICoqKioqKioqKioqKioqKiovCisKKyNpZiBRVUlDQ19NRU1DUFlfVVNFU19QTFgKKy8vIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKK21lbWNweV9mcm9tX3BjaV9ydW46CisJbW92ZWwgJWQwLCAtKCVzcCkKKwltb3ZldyAlc3IsIC0oJXNwKQorbWVtY3B5XzE6CisJbW92ZWwgUExYX0RNQV9DTURfU1RTLCAlZDAJLy8gZG8gbm90IGJ0c3QgUExYIHJlZ2lzdGVyIGRpcmVjdGx5CisJYnRzdGwgIzQsICVkMAkJCS8vIHRyYW5zZmVyIGRvbmU/CisJYm5lIG1lbWNweV9lbmQKKwlzdG9wICMweDIyMDAJCQkvLyBlbmFibGUgUENJOTA2MCBpbnRlcnJ1cHRzCisJbW92ZXcgIzB4MjcwMCwgJXNyCQkvLyBkaXNhYmxlIGludGVycnVwdHMgYWdhaW4KKwlicmEgbWVtY3B5XzEKKworbWVtY3B5X3RvX3BjaV9ydW46CisJbW92ZWwgJWQwLCAtKCVzcCkKKwltb3ZldyAlc3IsIC0oJXNwKQorbWVtY3B5XzI6CisJbW92ZWwgUExYX0RNQV9DTURfU1RTLCAlZDAJLy8gZG8gbm90IGJ0c3QgUExYIHJlZ2lzdGVyIGRpcmVjdGx5CisJYnRzdGwgIzEyLCAlZDAJCQkvLyB0cmFuc2ZlciBkb25lPworCWJuZSBtZW1jcHlfZW5kCisJc3RvcCAjMHgyMjAwCQkJLy8gZW5hYmxlIFBDSTkwNjAgaW50ZXJydXB0cworCW1vdmV3ICMweDI3MDAsICVzcgkJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluCisJYnJhIG1lbWNweV8yCisKK21lbWNweV9lbmQ6CisJbW92ZXcgKCVzcCkrLCAlc3IKKwltb3ZlbCAoJXNwKSssICVkMAorCXJ0cworI2VuZGlmCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBMWCBQQ0k5MDYwIGludGVycnVwdCAqKioqKioqKioqKioqKioqKi8KKworcGNpOTA2MF9pbnRlcnJ1cHQ6CisJbW92ZWwgJWQwLCAtKCVzcCkKKworCW1vdmVsIFBMWF9ET09SQkVMTF9UT19DQVJELCAlZDAKKwltb3ZlbCAlZDAsIFBMWF9ET09SQkVMTF9UT19DQVJECS8vIGNvbmZpcm0gYWxsIHJlcXVlc3RzCisJb3JsICVkMCwgY2hhbm5lbF9zdGF0cworCisJbW92ZWwgIzB4MDkwOSwgUExYX0RNQV9DTURfU1RTCS8vIGNsZWFyIERNQSBjaCAjMCBhbmQgIzEgaW50ZXJydXB0cworCisJbW92ZWwgKCVzcCkrLCAlZDAKKwlydGUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQ0MgaW50ZXJydXB0cyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BvcnRfaW50ZXJydXB0XzE6CisJb3JsICMwLCBTQ0MxX1JFR1MgKyBTQ0NfU0NDRTsgLy8gY29uZmlybSBTQ0MgZXZlbnRzCisJb3JsICMxIDw8IFRBU0tfU0NDXzAsIGNoYW5uZWxfc3RhdHMKKwltb3ZlbCAjMHg0MDAwMDAwMCwgQ0lTUgorCXJ0ZQorCitwb3J0X2ludGVycnVwdF8yOgorCW9ybCAjMCwgU0NDMl9SRUdTICsgU0NDX1NDQ0U7IC8vIGNvbmZpcm0gU0NDIGV2ZW50cworCW9ybCAjMSA8PCBUQVNLX1NDQ18xLCBjaGFubmVsX3N0YXRzCisJbW92ZWwgIzB4MjAwMDAwMDAsIENJU1IKKwlydGUKKworcG9ydF9pbnRlcnJ1cHRfMzoKKwlvcmwgIzAsIFNDQzNfUkVHUyArIFNDQ19TQ0NFOyAvLyBjb25maXJtIFNDQyBldmVudHMKKwlvcmwgIzEgPDwgVEFTS19TQ0NfMiwgY2hhbm5lbF9zdGF0cworCW1vdmVsICMweDEwMDAwMDAwLCBDSVNSCisJcnRlCisKK3BvcnRfaW50ZXJydXB0XzQ6CisJb3JsICMwLCBTQ0M0X1JFR1MgKyBTQ0NfU0NDRTsgLy8gY29uZmlybSBTQ0MgZXZlbnRzCisJb3JsICMxIDw8IFRBU0tfU0NDXzMsIGNoYW5uZWxfc3RhdHMKKwltb3ZlbCAjMHgwODAwMDAwMCwgQ0lTUgorCXJ0ZQorCitlcnJvcl9pbnRlcnJ1cHQ6CisJcnRlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjYWJsZSBhbmQgUE0gcm91dGluZSAqKioqKioqKioqKioqKioqKiovCisvLyBtb2RpZmllZCByZWdpc3RlcnM6IG5vbmUKK2NoZWNrX2NzcjoKKwltb3ZlbCAlZDAsIC0oJXNwKQorCW1vdmVsICVkMSwgLSglc3ApCisJbW92ZWwgJWQyLCAtKCVzcCkKKwltb3ZlbCAlYTAsIC0oJXNwKQorCW1vdmVsICVhMSwgLSglc3ApCisKKwljbHJsICVkMAkJCS8vIEQwID0gNCAqIHBvcnQKKwltb3ZlbCAjQ1NSQSwgJWEwCQkvLyBBMCA9IENTUiBhZGRyZXNzCisKK2NoZWNrX2Nzcl9sb29wOgorCW1vdmV3ICglYTApLCAlZDEJCS8vIEQxID0gQ1NSIGlucHV0IGJpdHMKKwlhbmRsICMweEU3LCAlZDEJCQkvLyBQTSBhbmQgY2FibGUgc2Vuc2UgYml0cyAobm8gRENFIGJpdCkKKwljbXB3ICNTVEFUVVNfQ0FCTEVfVjM1ICogKDEgKyAxIDw8IFNUQVRVU19DQUJMRV9QTV9TSElGVCksICVkMQorCWJuZSBjaGVja19jc3JfMQorCW1vdmV3ICMweDBFMDgsICVkMQorCWJyYSBjaGVja19jc3JfdmFsaWQKKworY2hlY2tfY3NyXzE6CisJY21wdyAjU1RBVFVTX0NBQkxFX1gyMSAqICgxICsgMSA8PCBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpLCAlZDEKKwlibmUgY2hlY2tfY3NyXzIKKwltb3ZldyAjMHgwNDA4LCAlZDEKKwlicmEgY2hlY2tfY3NyX3ZhbGlkCisKK2NoZWNrX2Nzcl8yOgorCWNtcHcgI1NUQVRVU19DQUJMRV9WMjQgKiAoMSArIDEgPDwgU1RBVFVTX0NBQkxFX1BNX1NISUZUKSwgJWQxCisJYm5lIGNoZWNrX2Nzcl8zCisJbW92ZXcgIzB4MDIwOCwgJWQxCisJYnJhIGNoZWNrX2Nzcl92YWxpZAorCitjaGVja19jc3JfMzoKKwljbXB3ICNTVEFUVVNfQ0FCTEVfRUlBNTMwICogKDEgKyAxIDw8IFNUQVRVU19DQUJMRV9QTV9TSElGVCksICVkMQorCWJuZSBjaGVja19jc3JfZGlzYWJsZQorCW1vdmV3ICMweDBEMDgsICVkMQorCWJyYSBjaGVja19jc3JfdmFsaWQKKworY2hlY2tfY3NyX2Rpc2FibGU6CisJbW92ZXcgIzB4MDAwOCwgJWQxCQkvLyBEMSA9IGRpc2FibGUgZXZlcnl0aGluZworCW1vdmV3ICMweDgwRTcsICVkMgkJLy8gRDIgPSBpbnB1dCBtYXNrOiBpZ25vcmUgRFNSCisJYnJhIGNoZWNrX2Nzcl93cml0ZQorCitjaGVja19jc3JfdmFsaWQ6CQkJLy8gRDEgPSBtb2RlIGFuZCBJUlEgYml0cworCW1vdmV3IGNzcl9vdXRwdXQoJWQwKSwgJWQyCisJYW5kdyAjMHgzMDAwLCAlZDIJCS8vIEQyID0gcmVxdWVzdGVkIExMIGFuZCBEVFIgYml0cworCW9ydyAlZDIsICVkMQkJCS8vIEQxID0gYWxsIHJlcXVlc3RlZCBvdXRwdXQgYml0cworCW1vdmV3ICMweDgwRkYsICVkMgkJLy8gRDIgPSBpbnB1dCBtYXNrOiBpbmNsdWRlIERTUgorCitjaGVja19jc3Jfd3JpdGU6CisJY21wdyBvbGRfY3NyX291dHB1dCglZDApLCAlZDEKKwliZXEgY2hlY2tfY3NyX2lucHV0CisJbW92ZXcgJWQxLCBvbGRfY3NyX291dHB1dCglZDApCisJbW92ZXcgJWQxLCAoJWEwKQkJLy8gV3JpdGUgQ1NSIG91dHB1dCBiaXRzCisKK2NoZWNrX2Nzcl9pbnB1dDoKKwltb3ZldyAoUENEQVQpLCAlZDEKKwlhbmR3IGRjZF9tYXNrKCVkMCksICVkMQorCWJlcSBjaGVja19jc3JfZGNkX29uCQkvLyBEQ0QgYW5kIENUUyBzaWduYWxzIGFyZSBuZWdhdGVkCisJbW92ZXcgKCVhMCksICVkMQkJLy8gRDEgPSBDU1IgaW5wdXQgYml0cworCWFuZHcgI35TVEFUVVNfQ0FCTEVfRENELCAlZDEJLy8gRENEIG9mZgorCWJyYSBjaGVja19jc3JfcHJldmlvdXMKKworY2hlY2tfY3NyX2RjZF9vbjoKKwltb3ZldyAoJWEwKSwgJWQxCQkvLyBEMSA9IENTUiBpbnB1dCBiaXRzCisJb3J3ICNTVEFUVVNfQ0FCTEVfRENELCAlZDEJLy8gRENEIG9uCitjaGVja19jc3JfcHJldmlvdXM6CisJYW5kdyAlZDIsICVkMQkJCS8vIGlucHV0IG1hc2sKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlYTEKKwljbXBsIFNUQVRVU19DQUJMRSglYTEpLCAlZDEJLy8gY2hlY2sgZm9yIGNoYW5nZQorCWJlcSBjaGVja19jc3JfbmV4dAorCW1vdmVsICVkMSwgU1RBVFVTX0NBQkxFKCVhMSkJLy8gdXBkYXRlIHN0YXR1cworCW1vdmVsIGJlbGxfY2FibGUoJWQwKSwgUExYX0RPT1JCRUxMX0ZST01fQ0FSRAkvLyBzaWduYWwgdGhlIGhvc3QKKworY2hlY2tfY3NyX25leHQ6CisJYWRkbCAjMiwgJWEwCQkJLy8gbmV4dCBDU1IgcmVnaXN0ZXIKKwlhZGRsICM0LCAlZDAJCQkvLyBEMCA9IDQgKiBuZXh0IHBvcnQKKwljbXBsICM0ICogNCwgJWQwCisJYm5lIGNoZWNrX2Nzcl9sb29wCisKKwltb3ZlbCAoJXNwKSssICVhMQorCW1vdmVsICglc3ApKywgJWEwCisJbW92ZWwgKCVzcCkrLCAlZDIKKwltb3ZlbCAoJXNwKSssICVkMQorCW1vdmVsICglc3ApKywgJWQwCisJcnRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0aW1lciBpbnRlcnJ1cHQgKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RpbWVyX2ludGVycnVwdDoKKwlic3IgY2hlY2tfY3NyCisJcnRlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSQU0gc2l6aW5nIGFuZCB0ZXN0ICoqKioqKioqKioqKioqKioqKiovCisjaWYgREVURUNUX1JBTQorcmFtX3Rlc3Q6CisJbW92ZWwgIzB4MTIzNDU2NzgsICVkMQkJLy8gRDEgPSB0ZXN0IHZhbHVlCisJbW92ZWwgJWQxLCAoMTI4ICogMTAyNCAtIDQpCisJbW92ZWwgIzEyOCAqIDEwMjQsICVkMAkJLy8gRDAgPSBSQU0gc2l6ZSB0ZXN0ZWQKK3JhbV90ZXN0X3NpemU6CisJY21wbCAjTUFYX1JBTV9TSVpFLCAlZDAKKwliZXEgcmFtX3Rlc3Rfc2l6ZV9mb3VuZAorCW1vdmVsICVkMCwgJWEwCisJYWRkbCAjMTI4ICogMTAyNCAtIDQsICVhMAorCWNtcGwgKCVhMCksICVkMQorCWJlcSByYW1fdGVzdF9zaXplX2NoZWNrCityYW1fdGVzdF9uZXh0X3NpemU6CisJbHNsbCAjMSwgJWQwCisJYnJhIHJhbV90ZXN0X3NpemUKKworcmFtX3Rlc3Rfc2l6ZV9jaGVjazoKKwllb3JsICMweEZGRkZGRkZGLCAlZDEKKwltb3ZlbCAlZDEsICgxMjggKiAxMDI0IC0gNCkKKwljbXBsICglYTApLCAlZDEKKwlibmUgcmFtX3Rlc3RfbmV4dF9zaXplCisKK3JhbV90ZXN0X3NpemVfZm91bmQ6CQkJLy8gRDAgPSBSQU0gc2l6ZQorCW1vdmVsICVkMCwgJWEwCQkJLy8gQTAgPSBmaWxsIHB0cgorCXN1YmwgI2Zpcm13YXJlX2VuZCArIDQsICVkMAorCWxzcmwgIzIsICVkMAorCW1vdmVsICVkMCwgJWQxCQkJLy8gRDEgPSBEQmYgY291bnRlcgorcmFtX3Rlc3RfZmlsbDoKKwltb3ZlbCAlYTAsIC0oJWEwKQorCWRiZncgJWQxLCByYW1fdGVzdF9maWxsCisJc3VibCAjMHgxMDAwMCwgJWQxCisJY21wbCAjMHhGRkZGRkZGRiwgJWQxCisJYm5lIHJhbV90ZXN0X2ZpbGwKKworcmFtX3Rlc3RfbG9vcDoJCQkJLy8gRDAgPSBEQmYgY291bnRlcgorCWNtcGwgKCVhMCkrLCAlYTAKKwlkYm5ldyAlZDAsIHJhbV90ZXN0X2xvb3AKKwlibmUgcmFtX3Rlc3RfZm91bmRfYmFkCisJc3VibCAjMHgxMDAwMCwgJWQwCisJY21wbCAjMHhGRkZGRkZGRiwgJWQwCisJYm5lIHJhbV90ZXN0X2xvb3AKKwlicmEgcmFtX3Rlc3RfYWxsX29rCisKK3JhbV90ZXN0X2ZvdW5kX2JhZDoKKwlzdWJsICM0LCAlYTAKK3JhbV90ZXN0X2FsbF9vazoKKwltb3ZlbCAlYTAsIFBMWF9NQUlMQk9YXzUKKwlydHMKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzY2NfcmVnX2FkZHI6CisJLmxvbmcgU0NDMV9SRUdTLCBTQ0MyX1JFR1MsIFNDQzNfUkVHUywgU0NDNF9SRUdTCitzY2NfYmFzZV9hZGRyOgorCS5sb25nIFNDQzFfQkFTRSwgU0NDMl9CQVNFLCBTQ0MzX0JBU0UsIFNDQzRfQkFTRQorCit0eF9maXJzdF9iZDoKKwkubG9uZyBEUFJCQVNFCisJLmxvbmcgRFBSQkFTRSArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiA4CisJLmxvbmcgRFBSQkFTRSArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiA4ICogMgorCS5sb25nIERQUkJBU0UgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOCAqIDMKKworcnhfZmlyc3RfYmQ6CisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4CisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4ICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDgKKwkubG9uZyBEUFJCQVNFICsgVFhfQlVGRkVSUyAqIDggKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOCAqIDIKKwkubG9uZyBEUFJCQVNFICsgVFhfQlVGRkVSUyAqIDggKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOCAqIDMKKworZmlyc3RfYnVmZmVyOgorCS5sb25nIEJVRkZFUlNfQUREUgorCS5sb25nIEJVRkZFUlNfQUREUiArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RICisJLmxvbmcgQlVGRkVSU19BRERSICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIEJVRkZFUl9MRU5HVEggKiAyCisJLmxvbmcgQlVGRkVSU19BRERSICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIEJVRkZFUl9MRU5HVEggKiAzCisKK2JlbGxfdHg6CisJLmxvbmcgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfVFhfMCwgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfVFhfMQorCS5sb25nIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzIsIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzMKKworYmVsbF9jYWJsZToKKwkubG9uZyAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8wLCAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8xCisJLmxvbmcgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMiwgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMworCitwYWNrZXRfZnVsbDoKKwkubG9uZyBQQUNLRVRfRlVMTCwgUEFDS0VUX0ZVTEwgKyAxLCBQQUNLRVRfRlVMTCArIDIsIFBBQ0tFVF9GVUxMICsgMworCitjbG9ja2luZ19leHQ6CisJLmxvbmcgMHgwMDAwMDAyQywgMHgwMDAwM0UwMCwgMHgwMDJDMDAwMCwgMHgzRTAwMDAwMAorY2xvY2tpbmdfdHhmcm9tcng6CisJLmxvbmcgMHgwMDAwMDAyRCwgMHgwMDAwM0YwMCwgMHgwMDJEMDAwMCwgMHgzRjAwMDAwMAorY2xvY2tpbmdfbWFzazoKKwkubG9uZyAweDAwMDAwMEZGLCAweDAwMDBGRjAwLCAweDAwRkYwMDAwLCAweEZGMDAwMDAwCitkY2RfbWFzazoKKwkud29yZCAweDAyMCwgMCwgMHgwODAsIDAsIDB4MjAwLCAwLCAweDgwMAorCisJLmFzY2lpICJ3YW5YTCBmaXJtd2FyZVxuIgorCS5hc2NpeiAiQ29weXJpZ2h0IChDKSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+XG4iCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJLmFsaWduIDQKK2NoYW5uZWxfc3RhdHM6CS5sb25nIDAKKwordHhfaW46CQkubG9uZyAwLCAwLCAwLCAwCS8vIHRyYW5zbWl0dGVkCit0eF9vdXQ6CQkubG9uZyAwLCAwLCAwLCAwCS8vIHJlY2VpdmVkIGZyb20gaG9zdCBmb3IgdHJhbnNtaXNzaW9uCit0eF9jb3VudDoJLmxvbmcgMCwgMCwgMCwgMAkvLyBjdXJyZW50bHkgaW4gdHJhbnNtaXQgcXVldWUKKworcnhfaW46CQkubG9uZyAwLCAwLCAwLCAwCS8vIHJlY2VpdmVkIGZyb20gcG9ydAorcnhfb3V0OgkJLmxvbmcgMAkJCS8vIHRyYW5zbWl0dGVkIHRvIGhvc3QKK3Bhcml0eV9ieXRlczoJLndvcmQgMCwgMCwgMCwgMCwgMCwgMCwgMCAvLyBvbmx5IDQgd29yZHMgYXJlIHVzZWQKKworY3NyX291dHB1dDoJLndvcmQgMAorb2xkX2Nzcl9vdXRwdXQ6CS53b3JkIDAsIDAsIDAsIDAsIDAsIDAsIDAKKwkJLmFsaWduIDQKK2Zpcm13YXJlX2VuZDoJCQkJLy8gbXVzdCBiZSBkd29yZC1hbGlnbmVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5pbmNfc2hpcHBlZCBiL2RyaXZlcnMvbmV0L3dhbi93YW54bGZ3LmluY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGE2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5pbmNfc2hpcHBlZApAQCAtMCwwICsxLDE1OCBAQAorc3RhdGljIHU4IGZpcm13YXJlW109eworMHg2MCwweDAwLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LDB4QjksMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4MTQsMHg0MiwweDgwLDB4NEEsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDY3LDB4MDAsMHgwMCwweDBFLAorMHgwNiwweEIwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg1OCwweDgwLDB4MEMsMHg4MCwKKzB4MDAsMHgwMCwweDAwLDB4MTAsMHg2NiwweDAwLDB4RkYsMHhERSwweDIxLDB4RkMsMHgwMCwweDAwLDB4MTYsMHhCQywweDAwLDB4NkMsCisweDIxLDB4RkMsMHgwMCwweDAwLDB4MTcsMHg1RSwweDAxLDB4MDAsMHgyMSwweEZDLDB4MDAsMHgwMCwweDE2LDB4REUsMHgwMSwweDc4LAorMHgyMSwweEZDLDB4MDAsMHgwMCwweDE2LDB4RkUsMHgwMSwweDc0LDB4MjEsMHhGQywweDAwLDB4MDAsMHgxNywweDFFLDB4MDEsMHg3MCwKKzB4MjEsMHhGQywweDAwLDB4MDAsMHgxNywweDNFLDB4MDEsMHg2QywweDIxLDB4RkMsMHgwMCwweDAwLDB4MTgsMHg0QywweDAyLDB4MDAsCisweDIzLDB4RkMsMHg3OCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDQ4LDB4MzMsMHhGQywweDA0LDB4ODAsMHhGRiwweEZDLAorMHgxMCwweDI2LDB4MzMsMHhGQywweDAxLDB4MTAsMHhGRiwweEZDLDB4MTAsMHgyQSwweDIzLDB4RkMsMHgwMCwweEQ0LDB4OUYsMHg0MCwKKzB4RkYsMHhGQywweDE1LDB4NDAsMHgyMywweEZDLDB4MDAsMHgwMCwweDA1LDB4NDMsMHhGRiwweEY5LDB4MDEsMHgwMCwweDIzLDB4RkMsCisweDAwLDB4MDAsMHgwNSwweDQzLDB4RkYsMHhGOSwweDAxLDB4MTQsMHgyMywweEZDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEY5LAorMHgwMSwweDEwLDB4MjMsMHhGQywweDAwLDB4MDAsMHgwMCwweDA4LDB4RkYsMHhGOSwweDAxLDB4MjQsMHgyMywweEZDLDB4MDAsMHgwMCwKKzB4MDEsMHgwMSwweEZGLDB4RjksMHgwMSwweDI4LDB4MDAsMHhCOSwweDAwLDB4MEYsMHgwMywweDAwLDB4RkYsMHhGOSwweDAwLDB4RTgsCisweDIzLDB4RkMsMHgwMCwweDAwLDB4MDAsMHgwMSwweEZGLDB4RjksMHgwMCwweEQ0LDB4NjEsMHgwMCwweDA2LDB4NzQsMHgzMywweEZDLAorMHhGRiwweEZGLDB4RkYsMHhGQywweDE1LDB4NTIsMHg0MiwweDc5LDB4RkYsMHhGQywweDE1LDB4NTAsMHg0MiwweDc5LDB4RkYsMHhGQywKKzB4MTUsMHg2NCwweDJFLDB4M0EsMHgwOCwweDUwLDB4NDIsMHhCOSwweDAwLDB4MDAsMHgxOSwweDU0LDB4NEEsMHg4NywweDY2LDB4MDAsCisweDAwLDB4MEUsMHg0RSwweDcyLDB4MjIsMHgwMCwweDQ2LDB4RkMsMHgyNywweDAwLDB4NjAsMHgwMCwweEZGLDB4RTYsMHg0MiwweDgwLAorMHg0MiwweDg2LDB4MDgsMHgwNywweDAwLDB4MDQsMHg2NywweDAwLDB4MDAsMHgwQSwweDA4LDB4ODcsMHgwMCwweDAwLDB4NjEsMHgwMCwKKzB4MDIsMHhBMCwweDA4LDB4MDcsMHgwMCwweDAwLDB4NjcsMHgwMCwweDAwLDB4MDYsMHg2MSwweDAwLDB4MDAsMHgzNiwweDA4LDB4MDcsCisweDAwLDB4MDgsMHg2NywweDAwLDB4MDAsMHgwNiwweDYxLDB4MDAsMHgwMiwweEI4LDB4MDgsMHgwNywweDAwLDB4MEMsMHg2NywweDAwLAorMHgwMCwweDBBLDB4NjEsMHgwMCwweDA0LDB4OTQsMHg2MSwweDAwLDB4MDMsMHg2MCwweEUyLDB4OEYsMHg1OCwweDgwLDB4MEMsMHg4MCwKKzB4MDAsMHgwMCwweDAwLDB4MTAsMHg2NiwweDAwLDB4RkYsMHhCQywweDIzLDB4QzYsMHhGRiwweEY5LDB4MDAsMHhFNCwweDYwLDB4MDAsCisweEZGLDB4OTIsMHgyMCwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NEEsMHhBOCwweDAwLDB4MDAsMHg2NiwweDAwLAorMHgwMiwweDRFLDB4MjEsMHg3QywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDQyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwKKzB4MTksMHg1OCwweDQyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NjgsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDE5LDB4NzgsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDg4LDB4MjIsMHgzOSwweEZGLDB4RkMsMHgxNiwweEVDLAorMHhDMiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEYyLDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgxOCwKKzB4NjYsMHgwMCwweDAwLDB4MEUsMHg4MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEUyLDB4NjAsMHgwMCwweDAwLDB4MEEsCisweDgyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4RDIsMHgyMywweEMxLDB4RkYsMHhGQywweDE2LDB4RUMsMHgwMCwweDcwLAorMHgxMCwweDAwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFBLDB4NjEsMHgwMCwweDA1LDB4NzYsMHgyMiwweDMwLDB4MDksMHhCMCwKKzB4MDAsMHgwMCwweDE4LDB4OTIsMHgyMiwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDcyLDB4NzQsMHgwOCwweDI2LDB4M0MsCisweDE4LDB4MDAsMHgwMCwweDAwLDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgxMCwweDY3LDB4MDAsMHgwMCwweDA2LAorMHgwOCwweEMzLDB4MDAsMHgxQSwweDIyLDB4QzMsMHgyMiwweEMxLDB4MDYsMHg4MSwweDAwLDB4MDAsMHgwNSwweEZDLDB4NTEsMHhDQSwKKzB4RkYsMHhGNCwweDA4LDB4QzMsMHgwMCwweDFELDB4MjIsMHhDMywweDIyLDB4QzEsMHg3NCwweDFDLDB4MjIsMHhGQywweDkwLDB4MDAsCisweDAwLDB4MDAsMHgyMiwweEMxLDB4MDYsMHg4MSwweDAwLDB4MDAsMHgwNSwweEZDLDB4NTEsMHhDQSwweEZGLDB4RjAsMHgyMiwweEZDLAorMHhCMCwweDAwLDB4MDAsMHgwMCwweDIyLDB4QzEsMHgyMiwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDYyLDB4MjQsMHg3MCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDUyLDB4MjUsMHg3QywweDAwLDB4MDAsMHhGRiwweEZGLDB4MDAsMHgxMCwweDI1LDB4N0MsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4NzIsMHgzMywweDQxLAorMHgwMCwweDAyLDB4MDYsMHg4MSwweDAwLDB4MDAsMHgwMCwweDUwLDB4MzMsMHg0MSwweDAwLDB4MDAsMHgxMywweDdDLDB4MDAsMHgwOCwKKzB4MDAsMHgwNCwweDEzLDB4N0MsMHgwMCwweDA4LDB4MDAsMHgwNSwweDBDLDB4QTgsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MTAsCisweDY2LDB4MDAsMHgwMCwweDJBLDB4NDIsMHg2QSwweDAwLDB4MDgsMHgyMywweDdDLDB4MDAsMHgwMCwweEYwLDB4QjgsMHgwMCwweDM0LAorMHgyMywweDdDLDB4MDAsMHgwMCwweEZGLDB4RkYsMHgwMCwweDM4LDB4MzMsMHg3QywweDA1LDB4RkEsMHgwMCwweDQ2LDB4MzEsMHhCQywKKzB4MDAsMHgwMiwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDYwLDB4MDAsMHgwMCwweEJDLDB4MEMsMHhBOCwweDAwLDB4MDAsCisweDAwLDB4MDcsMHgwMCwweDEwLDB4NjYsMHgwMCwweDAwLDB4MkMsMHgzNSwweDdDLDB4MDgsMHgwMCwweDAwLDB4MDgsMHgyMywweDdDLAorMHhERSwweEJCLDB4MjAsMHhFMywweDAwLDB4MzQsMHgyMywweDdDLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweDM4LDB4MzMsMHg3QywKKzB4MDUsMHhGQywweDAwLDB4NDYsMHgzMSwweEJDLDB4MDAsMHgwNCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDYwLDB4MDAsCisweDAwLDB4ODYsMHgwQywweEE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDEwLDB4NjYsMHgwMCwweDAwLDB4MjYsMHg0MiwweDZBLAorMHgwMCwweDA4LDB4MjMsMHg3QywweDAwLDB4MDAsMHhGMCwweEI4LDB4MDAsMHgzNCwweDQyLDB4QTksMHgwMCwweDM4LDB4MzMsMHg3QywKKzB4MDUsMHhGQSwweDAwLDB4NDYsMHgzMSwweEJDLDB4MDAsMHgwMiwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDYwLDB4MDAsCisweDAwLDB4NTYsMHgwQywweEE4LDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDEwLDB4NjYsMHgwMCwweDAwLDB4MjgsMHgzNSwweDdDLAorMHgwOCwweDAwLDB4MDAsMHgwOCwweDIzLDB4N0MsMHhERSwweEJCLDB4MjAsMHhFMywweDAwLDB4MzQsMHg0MiwweEE5LDB4MDAsMHgzOCwKKzB4MzMsMHg3QywweDA1LDB4RkMsMHgwMCwweDQ2LDB4MzEsMHhCQywweDAwLDB4MDQsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsCisweDYwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHg2QSwweDAwLDB4MDgsMHgyMywweDdDLDB4MDAsMHgwMCwweEYwLDB4QjgsMHgwMCwweDM0LAorMHgyMywweDdDLDB4MDAsMHgwMCwweEZGLDB4RkYsMHgwMCwweDM4LDB4MzMsMHg3QywweDA1LDB4RjgsMHgwMCwweDQ2LDB4NDIsMHg3MCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLDB4MjUsMHg3QywweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwNCwweDBDLDB4QTgsCisweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgxNCwweDY2LDB4MDAsMHgwMCwweDBFLDB4MjUsMHg3QywweDEwLDB4MDQsMHgwOSwweDAwLAorMHgwMCwweDAwLDB4NjAsMHgwMCwweDAwLDB4MEEsMHgyNSwweDdDLDB4MTAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzMsMHg3QywKKzB4MDUsMHhGQywweDAwLDB4MDYsMHgyMiwweDAwLDB4RTksMHg4OSwweDAwLDB4ODEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDMzLDB4QzEsCisweEZGLDB4RkMsMHgxNSwweEMwLDB4MDgsMHgzOSwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHhDMCwweDY2LDB4MDAsMHhGRiwweEY2LAorMHgzNSwweDdDLDB4MDAsMHgxRiwweDAwLDB4MTQsMHgwMCwweEFBLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4NEUsMHg3NSwKKzB4MjAsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg1MiwweDQyLDB4NjgsMHgwMCwweDE0LDB4MDIsMHhBOCwweEZGLDB4RkYsCisweEZGLDB4Q0YsMHgwMCwweDAwLDB4MDIsMHg3MCwweEVGLDB4RkYsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4QUEsMHg2MSwweDAwLAorMHgwMywweDcwLDB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDQyLDB4QjAsMHgxOSwweDkwLDB4NEUsMHg3NSwKKzB4MEMsMHhCMCwweDAwLDB4MDAsMHgwMCwweDBBLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDc4LDB4NjcsMHgwMCwweDAwLDB4QTgsCisweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NjgsMHgyNCwweDAxLDB4NEMsMHgzQywweDIwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDBDLDB4RDQsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDA2LDB4ODIsMHgwMCwweDAwLDB4MDAsMHgxQywKKzB4MEMsMHhCMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MjksMHg5MCwweDY2LDB4MDAsMHgwMCwweDdDLDB4MjAsMHg3MCwweDI5LDB4QTAsCisweDAwLDB4MDQsMHhFNywweDg5LDB4RDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg3MiwweDIyLDB4NzAsMHgxOSwweEEwLAorMHgwMCwweDA0LDB4MjQsMHgzMCwweDI5LDB4QTAsMHgwMCwweDA4LDB4MzEsMHg4MiwweDE5LDB4QTAsMHgwMCwweDAyLDB4NTYsMHg4MiwKKzB4MDIsMHg4MiwweEZGLDB4RkYsMHhGRiwweEZDLDB4MjMsMHhDOCwweEZGLDB4RjksMHgwMSwweDA0LDB4MjMsMHhDOSwweEZGLDB4RjksCisweDAxLDB4MDgsMHgyMywweEMyLDB4RkYsMHhGOSwweDAxLDB4MEMsMHgyMywweEZDLDB4MDAsMHgwMCwweDAxLDB4MDMsMHhGRiwweEY5LAorMHgwMSwweDI4LDB4NjEsMHgwMCwweDAxLDB4RjYsMHgwOCwweEYwLDB4MDAsMHgxRiwweDE5LDB4OTAsMHgyMiwweDMwLDB4MDksMHhCMCwKKzB4MDAsMHgwMCwweDE5LDB4NjgsMHg1MiwweDgxLDB4MEMsMHg4MSwweDAwLDB4MDAsMHgwMCwweDBBLDB4NjYsMHgwMCwweDAwLDB4MDQsCisweDQyLDB4ODEsMHgyMSwweDgxLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDY4LDB4NTIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLAorMHgxOSwweDc4LDB4NjAsMHgwMCwweEZGLDB4NEMsMHg0RSwweDc1LDB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwKKzB4RTcsMHg4OSwweEQyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4ODIsMHgzNCwweDMwLDB4MTksMHg5MCwweDA4LDB4MDIsCisweDAwLDB4MEYsMHg2NiwweDAwLDB4MDEsMHgxMiwweDA4LDB4MDIsMHgwMCwweDAxLDB4NjYsMHgwMCwweDAwLDB4RTYsMHg0QSwweDcwLAorMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2NiwweDAwLDB4MDAsMHgwNiwweDA4LDB4ODIsMHgwMCwweDAyLDB4MDIsMHg0MiwKKzB4MEMsMHhCQywweDBDLDB4NDIsMHgwQywweDAwLDB4NjYsMHgwMCwweDAwLDB4REMsMHg0MiwweDgzLDB4MzYsMHgzMCwweDE5LDB4QTAsCisweDAwLDB4MDIsMHg5NiwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLDB4MEMsMHg0MywweDA1LDB4RjgsMHg2RSwweDAwLAorMHgwMCwweEM0LDB4MjQsMHgzQSwweDA0LDB4ODQsMHg0QywweDNDLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4RDQsMHhCQSwKKzB4RkEsMHhGNCwweDBDLDB4QjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI5LDB4OTAsMHg2NiwweDAwLDB4MDAsMHg5NiwweDIxLDB4ODMsCisweDI5LDB4QTAsMHgwMCwweDA4LDB4MjAsMHg3MCwweDE5LDB4QTAsMHgwMCwweDA0LDB4MjIsMHg3MCwweDI5LDB4QTAsMHgwMCwweDA0LAorMHg0QSwweDg5LDB4NjcsMHgwMCwweDAwLDB4MkEsMHg1NiwweDgzLDB4MDIsMHg4MywweEZGLDB4RkYsMHhGRiwweEZDLDB4MjMsMHhDOCwKKzB4RkYsMHhGOSwweDAxLDB4MUMsMHgyMywweEM5LDB4RkYsMHhGOSwweDAxLDB4MTgsMHgyMywweEMzLDB4RkYsMHhGOSwweDAxLDB4MjAsCisweDIzLDB4RkMsMHgwMCwweDAwLDB4MDMsMHgwMSwweEZGLDB4RjksMHgwMSwweDI4LDB4NjEsMHgwMCwweDAxLDB4MkMsMHgyMSwweEIwLAorMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4QzIsMHgyOSwweDkwLDB4MDgsMHhDNiwweDAwLDB4MDQsMHgyNCwweDNBLDB4MDQsMHgxQSwKKzB4NTIsMHg4MiwweDBDLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgyOCwweDY2LDB4MDAsMHgwMCwweDA0LDB4NDIsMHg4MiwweDIzLDB4QzIsCisweDAwLDB4MDAsMHgxOSwweDk4LDB4MDIsMHg3MCwweEYwLDB4MDAsMHgxOSwweDkwLDB4MDgsMHhGMCwweDAwLDB4MUYsMHgxOSwweDkwLAorMHgyMiwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDg4LDB4NTIsMHg4MSwweDBDLDB4ODEsMHgwMCwweDAwLDB4MDAsMHgxRSwKKzB4NjYsMHgwMCwweDAwLDB4MDQsMHg0MiwweDgxLDB4MjEsMHg4MSwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwweDYwLDB4MDAsCisweEZFLDB4RjgsMHgyNCwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NTIsMHhCMCwweDI5LDB4QTAsMHgwMCwweDA4LAorMHg2MCwweDAwLDB4RkYsMHhDMiwweDI0LDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg1MiwweEIwLDB4MjksMHhBMCwKKzB4MDAsMHgwQywweDYwLDB4MDAsMHhGRiwweEIwLDB4NEUsMHg3NSwweDRBLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NzgsCisweDY3LDB4MDAsMHgwMCwweDg2LDB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg1OCwweDI0LDB4MDEsMHhFNywweDg5LAorMHhEMiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDcyLDB4MzYsMHgzMCwweDE5LDB4OTAsMHgwOCwweDAzLDB4MDAsMHgwRiwKKzB4NjYsMHgwMCwweDAwLDB4NjYsMHg4QywweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEEyLDB4NTMsMHhCMCwweDA5LDB4QjAsCisweDAwLDB4MDAsMHgxOSwweDc4LDB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg1OCwweDUyLDB4ODEsMHgwQywweDgxLAorMHgwMCwweDAwLDB4MDAsMHgwQSwweDY2LDB4MDAsMHgwMCwweDA0LDB4NDIsMHg4MSwweDIxLDB4ODEsMHgwOSwweEIwLDB4MDAsMHgwMCwKKzB4MTksMHg1OCwweDRDLDB4M0MsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHhENCwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDEwLDB4MDQsMHgwNiwweDgyLDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwOCwweDAzLDB4MDAsMHgwMSwweDY2LDB4MDAsMHgwMCwweDBFLAorMHgyMSwweEJDLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgyOSwweDkwLDB4NjAsMHgwMCwweEZGLDB4N0UsMHgyMSwweEJDLDB4MDAsMHgwMCwKKzB4MDAsMHgzMCwweDI5LDB4OTAsMHg2MCwweDAwLDB4RkYsMHg3MiwweDRFLDB4NzUsMHgyRiwweDAwLDB4NDAsMHhFNywweDIwLDB4MzksCisweEZGLDB4RjksMHgwMSwweDI4LDB4MDgsMHgwMCwweDAwLDB4MDQsMHg2NiwweDAwLDB4MDAsMHgyQywweDRFLDB4NzIsMHgyMiwweDAwLAorMHg0NiwweEZDLDB4MjcsMHgwMCwweDYwLDB4MDAsMHhGRiwweEU4LDB4MkYsMHgwMCwweDQwLDB4RTcsMHgyMCwweDM5LDB4RkYsMHhGOSwKKzB4MDEsMHgyOCwweDA4LDB4MDAsMHgwMCwweDBDLDB4NjYsMHgwMCwweDAwLDB4MEUsMHg0RSwweDcyLDB4MjIsMHgwMCwweDQ2LDB4RkMsCisweDI3LDB4MDAsMHg2MCwweDAwLDB4RkYsMHhFOCwweDQ2LDB4REYsMHgyMCwweDFGLDB4NEUsMHg3NSwweDJGLDB4MDAsMHgyMCwweDM5LAorMHhGRiwweEY5LDB4MDAsMHhFMCwweDIzLDB4QzAsMHhGRiwweEY5LDB4MDAsMHhFMCwweDgxLDB4QjksMHgwMCwweDAwLDB4MTksMHg1NCwKKzB4MjMsMHhGQywweDAwLDB4MDAsMHgwOSwweDA5LDB4RkYsMHhGOSwweDAxLDB4MjgsMHgyMCwweDFGLDB4NEUsMHg3MywweDAwLDB4QjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE2LDB4MTAsMHgwMCwweEI5LDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLAorMHgxOSwweDU0LDB4MjMsMHhGQywweDQwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4NEMsMHg0RSwweDczLDB4MDAsMHhCOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTYsMHgzMCwweDAwLDB4QjksMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsCisweDE5LDB4NTQsMHgyMywweEZDLDB4MjAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHg0QywweDRFLDB4NzMsMHgwMCwweEI5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNiwweDUwLDB4MDAsMHhCOSwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwKKzB4MTksMHg1NCwweDIzLDB4RkMsMHgxMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDRDLDB4NEUsMHg3MywweDAwLDB4QjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE2LDB4NzAsMHgwMCwweEI5LDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLAorMHgxOSwweDU0LDB4MjMsMHhGQywweDA4LDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4NEMsMHg0RSwweDczLDB4NEUsMHg3MywKKzB4MkYsMHgwMCwweDJGLDB4MDEsMHgyRiwweDAyLDB4MkYsMHgwOCwweDJGLDB4MDksMHg0MiwweDgwLDB4MjAsMHg3QywweEZGLDB4RkIsCisweDAwLDB4MDAsMHgzMiwweDEwLDB4MDIsMHg4MSwweDAwLDB4MDAsMHgwMCwweEU3LDB4MEMsMHg0MSwweDAwLDB4NDIsMHg2NiwweDAwLAorMHgwMCwweDBBLDB4MzIsMHgzQywweDBFLDB4MDgsMHg2MCwweDAwLDB4MDAsMHgzRSwweDBDLDB4NDEsMHgwMCwweDYzLDB4NjYsMHgwMCwKKzB4MDAsMHgwQSwweDMyLDB4M0MsMHgwNCwweDA4LDB4NjAsMHgwMCwweDAwLDB4MkUsMHgwQywweDQxLDB4MDAsMHg4NCwweDY2LDB4MDAsCisweDAwLDB4MEEsMHgzMiwweDNDLDB4MDIsMHgwOCwweDYwLDB4MDAsMHgwMCwweDFFLDB4MEMsMHg0MSwweDAwLDB4QTUsMHg2NiwweDAwLAorMHgwMCwweDBBLDB4MzIsMHgzQywweDBELDB4MDgsMHg2MCwweDAwLDB4MDAsMHgwRSwweDMyLDB4M0MsMHgwMCwweDA4LDB4MzQsMHgzQywKKzB4ODAsMHhFNywweDYwLDB4MDAsMHgwMCwweDE0LDB4MzQsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHhBQSwweDAyLDB4NDIsCisweDMwLDB4MDAsMHg4MiwweDQyLDB4MzQsMHgzQywweDgwLDB4RkYsMHhCMiwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFDLAorMHg2NywweDAwLDB4MDAsMHgwQywweDMxLDB4ODEsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4QUMsMHgzMCwweDgxLDB4MzIsMHgzOSwKKzB4RkYsMHhGQywweDE1LDB4NjYsMHhDMiwweDcwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDAyLDB4NjcsMHgwMCwweDAwLDB4MEMsCisweDMyLDB4MTAsMHgwMiwweDQxLDB4RkYsMHhGNywweDYwLDB4MDAsMHgwMCwweDA4LDB4MzIsMHgxMCwweDAwLDB4NDEsMHgwMCwweDA4LAorMHhDMiwweDQyLDB4MjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweEIyLDB4QTksMHgwMCwweDA0LDB4NjcsMHgwMCwKKzB4MDAsMHgxMiwweDIzLDB4NDEsMHgwMCwweDA0LDB4MjMsMHhGMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhCMiwweEZGLDB4RjksCisweDAwLDB4RTQsMHg1NCwweDg4LDB4NTgsMHg4MCwweDBDLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDY2LDB4MDAsMHhGRiwweDM0LAorMHgyMiwweDVGLDB4MjAsMHg1RiwweDI0LDB4MUYsMHgyMiwweDFGLDB4MjAsMHgxRiwweDRFLDB4NzUsMHg2MSwweDAwLDB4RkYsMHgxMiwKKzB4NEUsMHg3MywweEZGLDB4RkMsMHgxNiwweDAwLDB4RkYsMHhGQywweDE2LDB4MjAsMHhGRiwweEZDLDB4MTYsMHg0MCwweEZGLDB4RkMsCisweDE2LDB4NjAsMHhGRiwweEZDLDB4MEMsMHgwMCwweEZGLDB4RkMsMHgwRCwweDAwLDB4RkYsMHhGQywweDBFLDB4MDAsMHhGRiwweEZDLAorMHgwRiwweDAwLDB4RkYsMHhGQywweDAwLDB4MDAsMHhGRiwweEZDLDB4MDEsMHg0MCwweEZGLDB4RkMsMHgwMiwweDgwLDB4RkYsMHhGQywKKzB4MDMsMHhDMCwweEZGLDB4RkMsMHgwMCwweDUwLDB4RkYsMHhGQywweDAxLDB4OTAsMHhGRiwweEZDLDB4MDIsMHhEMCwweEZGLDB4RkMsCisweDA0LDB4MTAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDEsMHgyRiwweDYwLDB4MDAsMHgwMiwweDFFLDB4QzAsMHgwMCwweDAzLAorMHgwRSwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwKKzB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsCisweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDExLDB4MDAsMHgwMCwweDAwLDB4MTIsMHgwMCwweDAwLAorMHgwMCwweDEzLDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwMCwweDAwLDB4M0UsMHgwMCwweDAwLDB4MkMsMHgwMCwweDAwLDB4M0UsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJELDB4MDAsMHgwMCwweDNGLDB4MDAsMHgwMCwweDJELDB4MDAsMHgwMCwweDNGLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGRiwweDAwLDB4MDAsMHhGRiwweDAwLDB4MDAsMHhGRiwweDAwLDB4MDAsMHhGRiwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwKKzB4NzcsMHg2MSwweDZFLDB4NTgsMHg0QywweDIwLDB4NjYsMHg2OSwweDcyLDB4NkQsMHg3NywweDYxLDB4NzIsMHg2NSwweDBBLDB4NDMsCisweDZGLDB4NzAsMHg3OSwweDcyLDB4NjksMHg2NywweDY4LDB4NzQsMHgyMCwweDI4LDB4NDMsMHgyOSwweDIwLDB4MzIsMHgzMCwweDMwLAorMHgzMywweDIwLDB4NEIsMHg3MiwweDdBLDB4NzksMHg3MywweDdBLDB4NzQsMHg2RiwweDY2LDB4MjAsMHg0OCwweDYxLDB4NkMsMHg2MSwKKzB4NzMsMHg2MSwweDIwLDB4M0MsMHg2QiwweDY4LDB4NjMsMHg0MCwweDcwLDB4NkQsMHgyRSwweDc3LDB4NjEsMHg3NywweDJFLDB4NzAsCisweDZDLDB4M0UsMHgwQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWNmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCkBAIC0wLDAgKzEsODQ0IEBACisvKgorICoJVGhpbmdzIHRvIHNvcnQgb3V0OgorICoKKyAqCW8JdGJ1c3kgaGFuZGxpbmcKKyAqCW8JYWxsb3cgdXNlcnMgdG8gc2V0IHRoZSBwYXJhbWV0ZXJzCisgKglvCXN5bmMvYXN5bmMgc3dpdGNoaW5nID8KKyAqCisgKglOb3RlOiBUaGlzIGRvZXMgX25vdF8gaW1wbGVtZW50IENDSVRUIFguMjUgYXN5bmNocm9ub3VzIGZyYW1pbmcKKyAqCXJlY29tbWVuZGF0aW9ucy4gSXRzIHByaW1hcmlseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gSWYgeW91IHdhbnRlZAorICoJdG8gZG8gQ0NJVFQgdGhlbiBpbiB0aGVvcnkgYWxsIHlvdSBuZWVkIGlzIHRvIG5pY2sgdGhlIEhETEMgYXN5bmMKKyAqCWNoZWNrc3VtIHJvdXRpbmVzIGZyb20gcHBwLmMKKyAqICAgICAgQ2hhbmdlczoKKyAqCisgKgkyMDAwLTEwLTI5CUhlbm5lciBFaXNlbglsYXBiX2RhdGFfaW5kaWNhdGlvbigpIHJldHVybiBzdGF0dXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC94MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgIngyNV9hc3kuaCIKKworI2luY2x1ZGUgPG5ldC94MjVkZXZpY2UuaD4KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoqeDI1X2FzeV9kZXZzOworc3RhdGljIGludCB4MjVfYXN5X21heGRldiA9IFNMX05SVU5JVDsKKworbW9kdWxlX3BhcmFtKHgyNV9hc3lfbWF4ZGV2LCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHgyNV9hc3lfZXNjKHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pOworc3RhdGljIHZvaWQgeDI1X2FzeV91bmVzYyhzdHJ1Y3QgeDI1X2FzeSAqc2wsIHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCB4MjVfYXN5X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBGaW5kIGEgZnJlZSBYLjI1IGNoYW5uZWwsIGFuZCBsaW5rIGluIHRoaXMgYHR0eScgbGluZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgeDI1X2FzeSAqeDI1X2FzeV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB4MjVfYXN5ICpzbDsKKwlpbnQgaTsKKworCWlmICh4MjVfYXN5X2RldnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CS8qIE1hc3RlciBhcnJheSBtaXNzaW5nICEgKi8KKworCWZvciAoaSA9IDA7IGkgPCB4MjVfYXN5X21heGRldjsgaSsrKSB7CisJCWRldiA9IHgyNV9hc3lfZGV2c1tpXTsKKworCQkvKiBOb3QgYWxsb2NhdGVkID8gKi8KKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2wgPSBkZXYtPnByaXY7CisJCS8qIE5vdCBpbiB1c2UgPyAqLworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKSkKKwkJCXJldHVybiBzbDsKKwl9CisKKworCS8qIFNvcnJ5LCB0b28gbWFueSwgYWxsIHNsb3RzIGluIHVzZSAqLworCWlmIChpID49IHgyNV9hc3lfbWF4ZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIElmIG5vIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUsIGFsbG9jYXRlIG9uZSAqLworCWlmICghZGV2KSB7CisJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJCXNwcmludGYobmFtZSwgIngyNWFzeSVkIiwgaSk7CisKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgeDI1X2FzeSksCisJCQkJICAgbmFtZSwgeDI1X2FzeV9zZXR1cCk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogSW5pdGlhbGl6ZSBjaGFubmVsIGNvbnRyb2wgZGF0YSAqLworCQlzbCA9IGRldi0+cHJpdjsKKwkJZGV2LT5iYXNlX2FkZHIgICAgPSBpOworCisJCS8qIHJlZ2lzdGVyIGRldmljZSBzbyB0aGF0IGl0IGNhbiBiZSBpZmNvbmZpZydlZCAgICAgICAqLworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJLyogKFJlLSlTZXQgdGhlIElOVVNFIGJpdC4gICBWZXJ5IEltcG9ydGFudCEgKi8KKwkJCXNldF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKTsKKwkJCXgyNV9hc3lfZGV2c1tpXSA9IGRldjsKKwkJCXJldHVybiBzbDsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygieDI1X2FzeV9hbGxvYygpIC0gcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbHVyZS5cbiIpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBGcmVlIGFuIFguMjUgY2hhbm5lbC4gKi8KK3N0YXRpYyB2b2lkIHgyNV9hc3lfZnJlZShzdHJ1Y3QgeDI1X2FzeSAqc2wpCit7CisJLyogRnJlZSBhbGwgWC4yNSBmcmFtZSBidWZmZXJzLiAqLworCWlmIChzbC0+cmJ1ZmYpICB7CisJCWtmcmVlKHNsLT5yYnVmZik7CisJfQorCXNsLT5yYnVmZiA9IE5VTEw7CisJaWYgKHNsLT54YnVmZikgIHsKKwkJa2ZyZWUoc2wtPnhidWZmKTsKKwl9CisJc2wtPnhidWZmID0gTlVMTDsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncykpIHsKKwkJcHJpbnRrKCIlczogeDI1X2FzeV9mcmVlIGZvciBhbHJlYWR5IGZyZWUgdW5pdC5cbiIsIHNsLT5kZXYtPm5hbWUpOworCX0KK30KKworc3RhdGljIGludCB4MjVfYXN5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld210dSkKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciAqeGJ1ZmYsICpyYnVmZjsKKwlpbnQgbGVuID0gMiogbmV3bXR1OworCisJeGJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jIChsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwlyYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MgKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCisJaWYgKHhidWZmID09IE5VTEwgfHwgcmJ1ZmYgPT0gTlVMTCkgIAorCXsKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdyb3cgWC4yNSBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAoeGJ1ZmYgIT0gTlVMTCkgIAorCQkJa2ZyZWUoeGJ1ZmYpOworCQlpZiAocmJ1ZmYgIT0gTlVMTCkgIAorCQkJa2ZyZWUocmJ1ZmYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwl4YnVmZiAgICA9IHhjaGcoJnNsLT54YnVmZiwgeGJ1ZmYpOworCWlmIChzbC0+eGxlZnQpICB7CisJCWlmIChzbC0+eGxlZnQgPD0gbGVuKSAgeworCQkJbWVtY3B5KHNsLT54YnVmZiwgc2wtPnhoZWFkLCBzbC0+eGxlZnQpOworCQl9IGVsc2UgIHsKKwkJCXNsLT54bGVmdCA9IDA7CisJCQlzbC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCXNsLT54aGVhZCA9IHNsLT54YnVmZjsKKworCXJidWZmCSA9IHhjaGcoJnNsLT5yYnVmZiwgcmJ1ZmYpOworCWlmIChzbC0+cmNvdW50KSAgeworCQlpZiAoc2wtPnJjb3VudCA8PSBsZW4pIHsKKwkJCW1lbWNweShzbC0+cmJ1ZmYsIHJidWZmLCBzbC0+cmNvdW50KTsKKwkJfSBlbHNlICB7CisJCQlzbC0+cmNvdW50ID0gMDsKKwkJCXNsLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJc2V0X2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpOworCQl9CisJfQorCisJZGV2LT5tdHUgICAgPSBuZXdtdHU7CisJc2wtPmJ1ZmZzaXplID0gbGVuOworCisJc3Bpbl91bmxvY2tfYmgoJnNsLT5sb2NrKTsKKworCWlmICh4YnVmZiAhPSBOVUxMKSAKKwkJa2ZyZWUoeGJ1ZmYpOworCWlmIChyYnVmZiAhPSBOVUxMKQorCQlrZnJlZShyYnVmZik7CisJcmV0dXJuIDA7Cit9CisKKworLyogU2V0IHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMsIGhlbmNlIHRoZSBBU00uICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4MjVfYXN5X2xvY2soc3RydWN0IHgyNV9hc3kgKnNsKQoreworCW5ldGlmX3N0b3BfcXVldWUoc2wtPmRldik7Cit9CisKKworLyogQ2xlYXIgdGhlICJzZW5kaW5nIiBmbGFnLiAgVGhpcyBtdXN0IGJlIGF0b21pYywgaGVuY2UgdGhlIEFTTS4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHgyNV9hc3lfdW5sb2NrKHN0cnVjdCB4MjVfYXN5ICpzbCkKK3sKKwluZXRpZl93YWtlX3F1ZXVlKHNsLT5kZXYpOworfQorCisvKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBJUCBkYXRhZ3JhbSB0byB0aGUgSVAgbGF5ZXIuICovCisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfYnVtcChzdHJ1Y3QgeDI1X2FzeSAqc2wpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisJaW50IGVycjsKKworCWNvdW50ID0gc2wtPnJjb3VudDsKKwlzbC0+c3RhdHMucnhfYnl0ZXMrPWNvdW50OworCQorCXNrYiA9IGRldl9hbGxvY19za2IoY291bnQrMSk7CisJaWYgKHNrYiA9PSBOVUxMKSAgCisJeworCQlwcmludGsoIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgc2wtPmRldi0+bmFtZSk7CisJCXNsLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiX3B1c2goc2tiLDEpOwkvKiBMQVBCIGludGVybmFsIGNvbnRyb2wgKi8KKwltZW1jcHkoc2tiX3B1dChza2IsY291bnQpLCBzbC0+cmJ1ZmYsIGNvdW50KTsKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBzbC0+ZGV2KTsKKwlpZigoZXJyPWxhcGJfZGF0YV9yZWNlaXZlZChza2ItPmRldiwgc2tiKSkhPUxBUEJfT0spCisJeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIngyNV9hc3k6IGRhdGEgcmVjZWl2ZWQgZXJyIC0gJWRcbiIsZXJyKTsKKwl9CisJZWxzZQorCXsKKwkJbmV0aWZfcngoc2tiKTsKKwkJc2wtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCXNsLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJfQorfQorCisvKiBFbmNhcHN1bGF0ZSBvbmUgSVAgZGF0YWdyYW0gYW5kIHN0dWZmIGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgdm9pZCB4MjVfYXN5X2VuY2FwcyhzdHJ1Y3QgeDI1X2FzeSAqc2wsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBhY3R1YWwsIGNvdW50LCBtdHUgPSBzbC0+ZGV2LT5tdHU7CisKKwlpZiAobGVuID4gbXR1KSAKKwl7CQkvKiBTaWdoLCBzaG91bGRuJ3Qgb2NjdXIgQlVUIC4uLiAqLworCQlsZW4gPSBtdHU7CisJCXByaW50ayAoIiVzOiB0cnVuY2F0aW5nIG92ZXJzaXplZCB0cmFuc21pdCBwYWNrZXQhXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJc2wtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJeDI1X2FzeV91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJcCA9IGljcDsKKwljb3VudCA9IHgyNV9hc3lfZXNjKHAsICh1bnNpZ25lZCBjaGFyICopIHNsLT54YnVmZiwgbGVuKTsKKworCS8qIE9yZGVyIG9mIG5leHQgdHdvIGxpbmVzIGlzICp2ZXJ5KiBpbXBvcnRhbnQuCisJICogV2hlbiB3ZSBhcmUgc2VuZGluZyBhIGxpdHRsZSBhbW91bnQgb2YgZGF0YSwKKwkgKiB0aGUgdHJhbnNmZXIgbWF5IGJlIGNvbXBsZXRlZCBpbnNpZGUgZHJpdmVyLndyaXRlKCkKKwkgKiByb3V0aW5lLCBiZWNhdXNlIGl0J3MgcnVubmluZyB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKwkgKiBJbiB0aGlzIGNhc2Ugd2UgKm5ldmVyKiBnb3QgV1JJVEVfV0FLRVVQIGV2ZW50LAorCSAqIGlmIHdlIGRpZCBub3QgcmVxdWVzdCBpdCBiZWZvcmUgd3JpdGUgb3BlcmF0aW9uLgorCSAqICAgICAgIDE0IE9jdCAxOTk0ICBEbWl0cnkgR29yb2RjaGFuaW4uCisJICovCisJc2wtPnR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJYWN0dWFsID0gc2wtPnR0eS0+ZHJpdmVyLT53cml0ZShzbC0+dHR5LCBzbC0+eGJ1ZmYsIGNvdW50KTsKKwlzbC0+eGxlZnQgPSBjb3VudCAtIGFjdHVhbDsKKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmYgKyBhY3R1YWw7CisJLyogVlNWICovCisJY2xlYXJfYml0KFNMRl9PVVRXQUlULCAmc2wtPmZsYWdzKTsJLyogcmVzZXQgb3V0ZmlsbCBmbGFnICovCit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLiAgSWYgd2UgaGF2ZQorICogbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICovCitzdGF0aWMgdm9pZCB4MjVfYXN5X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBhY3R1YWw7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5ICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBYMjVfQVNZX01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKQorCQlyZXR1cm47CisKKwlpZiAoc2wtPnhsZWZ0IDw9IDApICAKKwl7CisJCS8qIE5vdyBzZXJpYWwgYnVmZmVyIGlzIGFsbW9zdCBmcmVlICYgd2UgY2FuIHN0YXJ0CisJCSAqIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldCAqLworCQlzbC0+c3RhdHMudHhfcGFja2V0cysrOworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJeDI1X2FzeV91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgc2wtPnhoZWFkLCBzbC0+eGxlZnQpOworCXNsLT54bGVmdCAtPSBhY3R1YWw7CisJc2wtPnhoZWFkICs9IGFjdHVhbDsKK30KKworc3RhdGljIHZvaWQgeDI1X2FzeV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKworCXNwaW5fbG9jaygmc2wtPmxvY2spOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyogTWF5IGJlIHdlIG11c3QgY2hlY2sgdHJhbnNtaXR0ZXIgdGltZW91dCBoZXJlID8KKwkJICogICAgICAxNCBPY3QgMTk5NCBEbWl0cnkgR29yb2RjaGFuaW4uCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIChzbC0+dHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcihzbC0+dHR5KSB8fCBzbC0+eGxlZnQpID8KKwkJICAgICAgICJiYWQgbGluZSBxdWFsaXR5IiA6ICJkcml2ZXIgZXJyb3IiKTsKKwkJc2wtPnhsZWZ0ID0gMDsKKwkJc2wtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQl4MjVfYXN5X3VubG9jayhzbCk7CisJfQorCXNwaW5fdW5sb2NrKCZzbC0+bG9jayk7Cit9CisKKy8qIEVuY2Fwc3VsYXRlIGFuIElQIGRhdGFncmFtIGFuZCBraWNrIGl0IGludG8gYSBUVFkgcXVldWUuICovCisKK3N0YXRpYyBpbnQgeDI1X2FzeV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKwlpbnQgZXJyOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKSB7CisJCXByaW50aygiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJCisJc3dpdGNoKHNrYi0+ZGF0YVswXSkKKwl7CisJCWNhc2UgMHgwMDpicmVhazsKKwkJY2FzZSAweDAxOiAvKiBDb25uZWN0aW9uIHJlcXVlc3QgLi4gZG8gbm90aGluZyAqLworCQkJaWYoKGVycj1sYXBiX2Nvbm5lY3RfcmVxdWVzdChkZXYpKSE9TEFQQl9PSykKKwkJCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IGxhcGJfY29ubmVjdF9yZXF1ZXN0IGVycm9yIC0gJWRcbiIsIGVycik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQljYXNlIDB4MDI6IC8qIERpc2Nvbm5lY3QgcmVxdWVzdCAuLiBkbyBub3RoaW5nIC0gaGFuZyB1cCA/PyAqLworCQkJaWYoKGVycj1sYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdChkZXYpKSE9TEFQQl9PSykKKwkJCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IGxhcGJfZGlzY29ubmVjdF9yZXF1ZXN0IGVycm9yIC0gJWRcbiIsIGVycik7CisJCWRlZmF1bHQ6CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAgMDsKKwl9CisJc2tiX3B1bGwoc2tiLDEpOwkvKiBSZW1vdmUgY29udHJvbCBieXRlICovCisJLyoKKwkgKiBJZiB3ZSBhcmUgYnVzeSBhbHJlYWR5LSB0b28gYmFkLiAgV2Ugb3VnaHQgdG8gYmUgYWJsZQorCSAqIHRvIHF1ZXVlIHRoaW5ncyBhdCB0aGlzIHBvaW50LCB0byBhbGxvdyBmb3IgYSBsaXR0bGUKKwkgKiBmcmFtZSBidWZmZXIuICBPaCB3ZWxsLi4uCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJIGhhdGUgcXVldWVzIGluIFguMjUgZHJpdmVyLiBNYXkgYmUgaXQncyBlZmZpY2llbnQsCisJICogYnV0IGZvciBtZSBsYXRlbmN5IGlzIG1vcmUgaW1wb3J0YW50LiA7KQorCSAqIFNvLCBubyBxdWV1ZXMgIQorCSAqICAgICAgICAxNCBPY3QgMTk5NCAgRG1pdHJ5IEdvcm9kY2hhbmluLgorCSAqLworCQorCWlmKChlcnI9bGFwYl9kYXRhX3JlcXVlc3QoZGV2LHNrYikpIT1MQVBCX09LKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2RhdGFfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKglMQVBCIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICovCisKKy8qCisgKglDYWxsZWQgd2hlbiBJIGZyYW1lIGRhdGEgYXJyaXZlcy4gV2UgZGlkIHRoZSB3b3JrIGFib3ZlIC0gdGhyb3cgaXQKKyAqCWF0IHRoZSBuZXQgbGF5ZXIuCisgKi8KKyAgCitzdGF0aWMgaW50IHgyNV9hc3lfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXJldHVybiBuZXRpZl9yeChza2IpOworfQorCisvKgorICoJRGF0YSBoYXMgZW1lcmdlZCBmcm9tIHRoZSBMQVBCIHByb3RvY29sIG1hY2hpbmUuIFdlIGRvbid0IGhhbmRsZQorICoJYnVzeSBjYXNlcyB0b28gd2VsbC4gSXRzIHRyaWNreSB0byBzZWUgaG93IHRvIGRvIHRoaXMgbmljZWx5IC0KKyAqCXBlcmhhcHMgbGFwYiBzaG91bGQgYWxsb3cgdXMgdG8gYm91bmNlIHRoaXMgPworICovCisgCitzdGF0aWMgdm9pZCB4MjVfYXN5X2RhdGFfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2w9ZGV2LT5wcml2OworCQorCXNwaW5fbG9jaygmc2wtPmxvY2spOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHNsLT5kZXYpIHx8IHNsLT50dHkgPT0gTlVMTCkKKwl7CisJCXNwaW5fdW5sb2NrKCZzbC0+bG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogdGJ1c3kgZHJvcFxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCS8qIFdlIHdlcmUgbm90IGJ1c3ksIHNvIHdlIGFyZSBub3cuLi4gOi0pICovCisJaWYgKHNrYiAhPSBOVUxMKSAKKwl7CisJCXgyNV9hc3lfbG9jayhzbCk7CisJCXNsLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisJCXgyNV9hc3lfZW5jYXBzKHNsLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCisvKgorICoJTEFQQiBjb25uZWN0aW9uIGVzdGFibGlzaC9kb3duIGluZm9ybWF0aW9uLgorICovCisgCitzdGF0aWMgdm9pZCB4MjVfYXN5X2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gMHgwMTsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIHNsLT5kZXYpOworCW5ldGlmX3J4KHNrYik7CisJc2wtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfZGlzY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFzb24pCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKDEpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwdHIgID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSAweDAyOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgc2wtPmRldik7CisJbmV0aWZfcngoc2tiKTsKKwlzbC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworc3RhdGljIHN0cnVjdCBsYXBiX3JlZ2lzdGVyX3N0cnVjdCB4MjVfYXN5X2NhbGxiYWNrcyA9IHsKKwkuY29ubmVjdF9jb25maXJtYXRpb24gPSB4MjVfYXN5X2Nvbm5lY3RlZCwKKwkuY29ubmVjdF9pbmRpY2F0aW9uID0geDI1X2FzeV9jb25uZWN0ZWQsCisJLmRpc2Nvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2FzeV9kaXNjb25uZWN0ZWQsCisJLmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IHgyNV9hc3lfZGlzY29ubmVjdGVkLAorCS5kYXRhX2luZGljYXRpb24gPSB4MjVfYXN5X2RhdGFfaW5kaWNhdGlvbiwKKwkuZGF0YV90cmFuc21pdCA9IHgyNV9hc3lfZGF0YV90cmFuc21pdCwKKworfTsKKworCisvKiBPcGVuIHRoZSBsb3ctbGV2ZWwgcGFydCBvZiB0aGUgWC4yNSBjaGFubmVsLiBFYXN5ISAqLworc3RhdGljIGludCB4MjVfYXN5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBlcnI7CisKKwlpZiAoc2wtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIFguMjUgZnJhbWUgYnVmZmVyczoKKwkgKgorCSAqIHJidWZmCVJlY2VpdmUgYnVmZmVyLgorCSAqIHhidWZmCVRyYW5zbWl0IGJ1ZmZlci4KKwkgKi8KKworCWxlbiA9IGRldi0+bXR1ICogMjsKKworCXNsLT5yYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKHNsLT5yYnVmZiA9PSBOVUxMKSAgIHsKKwkJZ290byBub3JidWZmOworCX0KKwlzbC0+eGJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCWlmIChzbC0+eGJ1ZmYgPT0gTlVMTCkgICB7CisJCWdvdG8gbm94YnVmZjsKKwl9CisKKwlzbC0+YnVmZnNpemUgPSBsZW47CisJc2wtPnJjb3VudCAgID0gMDsKKwlzbC0+eGxlZnQgICAgPSAwOworCXNsLT5mbGFncyAgICY9ICgxIDw8IFNMRl9JTlVTRSk7ICAgICAgLyogQ2xlYXIgRVNDQVBFICYgRVJST1IgZmxhZ3MgKi8KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQkKKwkvKgorCSAqCU5vdyBhdHRhY2ggTEFQQgorCSAqLworCWlmKChlcnI9bGFwYl9yZWdpc3RlcihkZXYsICZ4MjVfYXN5X2NhbGxiYWNrcykpPT1MQVBCX09LKQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFudXAgKi8KKwlrZnJlZShzbC0+eGJ1ZmYpOworbm94YnVmZjoKKwlrZnJlZShzbC0+cmJ1ZmYpOworbm9yYnVmZjoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKiBDbG9zZSB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIFguMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgeDI1X2FzeV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmc2wtPmxvY2spOworCWlmIChzbC0+dHR5KSAKKwkJc2wtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNsLT5yY291bnQgPSAwOworCXNsLT54bGVmdCAgPSAwOworCWlmKChlcnI9bGFwYl91bnJlZ2lzdGVyKGRldikpIT1MQVBCX09LKQorCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3lfY2xvc2U6IGxhcGJfdW5yZWdpc3RlciBlcnJvciAtJWRcbiIsZXJyKTsKKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHgyNV9hc3lfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCit9CisKKy8qCisgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgorICogYSBibG9jayBvZiBYLjI1IGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCisgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHgyNV9hc3lfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5ICopIHR0eS0+ZGlzY19kYXRhOworCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gWDI1X0FTWV9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkKKwkJcmV0dXJuOworCisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGZwICYmICpmcCsrKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIHsKKwkJCQlzbC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQl9CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJeDI1X2FzeV91bmVzYyhzbCwgKmNwKyspOworCX0KK30KKworLyoKKyAqIE9wZW4gdGhlIGhpZ2gtbGV2ZWwgcGFydCBvZiB0aGUgWC4yNSBjaGFubmVsLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFRUWSBtb2R1bGUgd2hlbiB0aGUKKyAqIFguMjUgbGluZSBkaXNjaXBsaW5lIGlzIGNhbGxlZCBmb3IuICBCZWNhdXNlIHdlIGFyZQorICogc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLCB3ZSBvbmx5IGhhdmUgdG8gbGluayBpdCB0bworICogYSBmcmVlIFguMjUgY2hhbm5lbC4uLgorICovCisKK3N0YXRpYyBpbnQgeDI1X2FzeV9vcGVuX3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKwlpbnQgZXJyOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhbHJlYWR5IGNvbm5lY3RlZC4gKi8KKwlpZiAoc2wgJiYgc2wtPm1hZ2ljID09IFgyNV9BU1lfTUFHSUMpIHsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogT0suICBGaW5kIGEgZnJlZSBYLjI1IGNoYW5uZWwgdG8gdXNlLiAqLworCWlmICgoc2wgPSB4MjVfYXN5X2FsbG9jKCkpID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTkZJTEU7CisJfQorCisJc2wtPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IHNsOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKSAgeworCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJfQorCWlmICh0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcikgIHsKKwkJdHR5LT5sZGlzYy5mbHVzaF9idWZmZXIodHR5KTsKKwl9CisKKwkvKiBSZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwlzbC0+ZGV2LT50eXBlID0gQVJQSFJEX1gyNTsKKwkKKwkvKiBQZXJmb3JtIHRoZSBsb3ctbGV2ZWwgWC4yNSBhc3luYyBpbml0ICovCisJaWYgKChlcnIgPSB4MjVfYXN5X29wZW4oc2wtPmRldikpKQorCQlyZXR1cm4gZXJyOworCisJLyogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuICovCisJcmV0dXJuIHNsLT5kZXYtPmJhc2VfYWRkcjsKK30KKworCisvKgorICogQ2xvc2UgZG93biBhbiBYLjI1IGNoYW5uZWwuCisgKiBUaGlzIG1lYW5zIGZsdXNoaW5nIG91dCBhbnkgcGVuZGluZyBxdWV1ZXMsIGFuZCB0aGVuIHJlc3RvcmluZyB0aGUKKyAqIFRUWSBsaW5lIGRpc2NpcGxpbmUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIGl0IGdvdCBob29rZWQgdG8gWC4yNQorICogKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4KKyAqLworc3RhdGljIHZvaWQgeDI1X2FzeV9jbG9zZV90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFgyNV9BU1lfTUFHSUMpCisJCXJldHVybjsKKworCWlmIChzbC0+ZGV2LT5mbGFncyAmIElGRl9VUCkKKwl7CisJCSh2b2lkKSBkZXZfY2xvc2Uoc2wtPmRldik7CisJfQorCisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCXNsLT50dHkgPSBOVUxMOworCXgyNV9hc3lfZnJlZShzbCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4MjVfYXN5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisKKwlyZXR1cm4gJnNsLT5zdGF0czsKK30KKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCQkJU1RBTkRBUkQgWC4yNSBFTkNBUFNVTEFUSU9OCQkgIAkgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCB4MjVfYXN5X2VzYyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjOworCisJLyoKKwkgKiBTZW5kIGFuIGluaXRpYWwgRU5EIGNoYXJhY3RlciB0byBmbHVzaCBvdXQgYW55CisJICogZGF0YSB0aGF0IG1heSBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSByZWNlaXZlcgorCSAqIGR1ZSB0byBsaW5lIG5vaXNlLgorCSAqLworCisJKnB0cisrID0gWDI1X0VORDsJLyogU2VuZCAxMDExMTExMCBiaXQgc2VxICovCisKKwkvKgorCSAqIEZvciBlYWNoIGJ5dGUgaW4gdGhlIHBhY2tldCwgc2VuZCB0aGUgYXBwcm9wcmlhdGUKKwkgKiBjaGFyYWN0ZXIgc2VxdWVuY2UsIGFjY29yZGluZyB0byB0aGUgWC4yNSBwcm90b2NvbC4KKwkgKi8KKworCXdoaWxlIChsZW4tLSA+IDApIAorCXsKKwkJc3dpdGNoKGMgPSAqcysrKSAKKwkJeworCQkJY2FzZSBYMjVfRU5EOgorCQkJCSpwdHIrKyA9IFgyNV9FU0M7CisJCQkJKnB0cisrID0gWDI1X0VTQ0FQRShYMjVfRU5EKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWDI1X0VTQzoKKwkJCQkqcHRyKysgPSBYMjVfRVNDOworCQkJCSpwdHIrKyA9IFgyNV9FU0NBUEUoWDI1X0VTQyk7CisJCQkJYnJlYWs7CisJCQkgZGVmYXVsdDoKKwkJCQkqcHRyKysgPSBjOworCQkJCWJyZWFrOworCQl9CisJfQorCSpwdHIrKyA9IFgyNV9FTkQ7CisJcmV0dXJuIChwdHIgLSBkKTsKK30KKworc3RhdGljIHZvaWQgeDI1X2FzeV91bmVzYyhzdHJ1Y3QgeDI1X2FzeSAqc2wsIHVuc2lnbmVkIGNoYXIgcykKK3sKKworCXN3aXRjaChzKSAKKwl7CisJCWNhc2UgWDI1X0VORDoKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykgJiYgKHNsLT5yY291bnQgPiAyKSkgIAorCQkJeworCQkJCXgyNV9hc3lfYnVtcChzbCk7CisJCQl9CisJCQljbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncyk7CisJCQlzbC0+cmNvdW50ID0gMDsKKwkJCXJldHVybjsKKworCQljYXNlIFgyNV9FU0M6CisJCQlzZXRfYml0KFNMRl9FU0NBUEUsICZzbC0+ZmxhZ3MpOworCQkJcmV0dXJuOworCQkJCisJCWNhc2UgWDI1X0VTQ0FQRShYMjVfRVNDKToKKwkJY2FzZSBYMjVfRVNDQVBFKFgyNV9FTkQpOgorCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKSkKKwkJCQlzID0gWDI1X1VORVNDQVBFKHMpOworCQkJYnJlYWs7CisJfQorCWlmICghdGVzdF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIAorCXsKKwkJaWYgKHNsLT5yY291bnQgPCBzbC0+YnVmZnNpemUpICAKKwkJeworCQkJc2wtPnJidWZmW3NsLT5yY291bnQrK10gPSBzOworCQkJcmV0dXJuOworCQl9CisJCXNsLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQlzZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncyk7CisJfQorfQorCisKKy8qIFBlcmZvcm0gSS9PIGNvbnRyb2wgb24gYW4gYWN0aXZlIFguMjUgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgeDI1X2FzeV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5ICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBYMjVfQVNZX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHSUZOQU1FOgorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgc2wtPmRldi0+bmFtZSwKKwkJCQkJc3RybGVuKHNsLT5kZXYtPm5hbWUpICsgMSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTSU9DU0lGSFdBRERSOgorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQgKi8KKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJcmV0dXJuIG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IHgyNV9hc3lfb3Blbl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCWlmKHNsLT50dHk9PU5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXNlIHRoZSBYLjI1IGRyaXZlci4gIENhbGxlZCBieSB0aGUgZGV2aWNlIGluaXQgY29kZSAqLworc3RhdGljIHZvaWQgeDI1X2FzeV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IGRldi0+cHJpdjsKKworCXNsLT5tYWdpYyAgPSBYMjVfQVNZX01BR0lDOworCXNsLT5kZXYJICAgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNsLT5sb2NrKTsKKwlzZXRfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncyk7CisKKwkvKgorCSAqCUZpbmlzaCBzZXR0aW5nIHVwIHRoZSBERVZJQ0UgaW5mby4gCisJICovCisJIAorCWRldi0+bXR1CQk9IFNMX01UVTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHgyNV9hc3lfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0geDI1X2FzeV90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWioyMDsKKwlkZXYtPm9wZW4JCT0geDI1X2FzeV9vcGVuX2RldjsKKwlkZXYtPnN0b3AJCT0geDI1X2FzeV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwkgICAgICAgID0geDI1X2FzeV9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IHgyNV9hc3lfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CisJZGV2LT5hZGRyX2xlbgkJPSAwOworCWRldi0+dHlwZQkJPSBBUlBIUkRfWDI1OworCWRldi0+dHhfcXVldWVfbGVuCT0gMTA7CisKKwkvKiBOZXctc3R5bGUgZmxhZ3MuICovCisJZGV2LT5mbGFncwkJPSBJRkZfTk9BUlA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIHgyNV9sZGlzYyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm1hZ2ljCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQkJPSAiWC4yNSIsCisJLm9wZW4JCT0geDI1X2FzeV9vcGVuX3R0eSwKKwkuY2xvc2UJCT0geDI1X2FzeV9jbG9zZV90dHksCisJLmlvY3RsCQk9IHgyNV9hc3lfaW9jdGwsCisJLnJlY2VpdmVfYnVmCT0geDI1X2FzeV9yZWNlaXZlX2J1ZiwKKwkucmVjZWl2ZV9yb29tCT0geDI1X2FzeV9yZWNlaXZlX3Jvb20sCisJLndyaXRlX3dha2V1cAk9IHgyNV9hc3lfd3JpdGVfd2FrZXVwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF94MjVfYXN5KHZvaWQpCit7CisJaWYgKHgyNV9hc3lfbWF4ZGV2IDwgNCkKKwkJeDI1X2FzeV9tYXhkZXYgPSA0OyAvKiBTYW5pdHkgKi8KKworCXByaW50ayhLRVJOX0lORk8gIlguMjUgYXN5bmM6IHZlcnNpb24gMC4wMCBBTFBIQSAiCisJCQkiKGR5bmFtaWMgY2hhbm5lbHMsIG1heD0lZCkuXG4iLCB4MjVfYXN5X21heGRldiApOworCisJeDI1X2FzeV9kZXZzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKikqeDI1X2FzeV9tYXhkZXYsIAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICgheDI1X2FzeV9kZXZzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlgyNSBhc3luYzogQ2FuJ3QgYWxsb2NhdGUgeDI1X2FzeV9jdHJsc1tdICIKKwkJCQkiYXJyYXkhIFVhYXJnaCEgKC0+IE5vIFguMjUgYXZhaWxhYmxlKVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoeDI1X2FzeV9kZXZzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKikqeDI1X2FzeV9tYXhkZXYpOyAKKworCXJldHVybiB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9YMjUsICZ4MjVfbGRpc2MpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3gyNV9hc3kodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHgyNV9hc3lfbWF4ZGV2OyBpKyspIHsKKwkJZGV2ID0geDI1X2FzeV9kZXZzW2ldOworCQlpZiAoZGV2KSB7CisJCQlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisKKwkJCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCQkJaWYgKHNsLT50dHkpIAorCQkJCXR0eV9oYW5ndXAoc2wtPnR0eSk7CisKKwkJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCQkvKgorCQkJICogVlNWID0gaWYgZGV2LT5zdGFydD09MCwgdGhlbiBkZXZpY2UKKwkJCSAqIHVucmVnaXN0ZXJlZCB3aGlsZSBjbG9zZSBwcm9jLgorCQkJICovCisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KKworCWtmcmVlKHgyNV9hc3lfZGV2cyk7CisJdHR5X3JlZ2lzdGVyX2xkaXNjKE5fWDI1LCBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF94MjVfYXN5KTsKK21vZHVsZV9leGl0KGV4aXRfeDI1X2FzeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5oIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc3MDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIF9MSU5VWF9YMjVfQVNZX0gKKyNkZWZpbmUgX0xJTlVYX1gyNV9BU1lfSAorCisvKiBYLjI1IGFzeSBjb25maWd1cmF0aW9uLiAqLworI2RlZmluZSBTTF9OUlVOSVQJMjU2CQkvKiBNQVggbnVtYmVyIG9mIFguMjUgY2hhbm5lbHM7CisJCQkJCSAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aAorCQkJCQkgICBpbnNtb2QgLW94MjVfYXN5X21heGRldj1ubm4JKi8KKyNkZWZpbmUgU0xfTVRVCQkyNTYJCisKKy8qIFgyNSBhc3luYyBwcm90b2NvbCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBYMjVfRU5EICAgICAgICAgMHg3RQkJLyogaW5kaWNhdGVzIGVuZCBvZiBmcmFtZQkqLworI2RlZmluZSBYMjVfRVNDICAgICAgICAgMHg3RAkJLyogaW5kaWNhdGVzIGJ5dGUgc3R1ZmZpbmcJKi8KKyNkZWZpbmUgWDI1X0VTQ0FQRSh4KQkoKHgpXjB4MjApCisjZGVmaW5lIFgyNV9VTkVTQ0FQRSh4KQkoKHgpXjB4MjApCisKKworc3RydWN0IHgyNV9hc3kgeworICBpbnQJCQltYWdpYzsKKworICAvKiBWYXJpb3VzIGZpZWxkcy4gKi8KKyAgc3BpbmxvY2tfdAkJbG9jazsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsJCS8qIHB0ciB0byBUVFkgc3RydWN0dXJlCQkqLworICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwkJLyogZWFzeSBmb3IgaW50ciBoYW5kbGluZwkqLworCisgIC8qIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLiAqLworICB1bnNpZ25lZCBjaGFyCQkqcmJ1ZmY7CQkvKiByZWNlaXZlciBidWZmZXIJCSovCisgIGludCAgICAgICAgICAgICAgICAgICByY291bnQ7ICAgICAgICAgLyogcmVjZWl2ZWQgY2hhcnMgY291bnRlciAgICAgICAqLworICB1bnNpZ25lZCBjaGFyCQkqeGJ1ZmY7CQkvKiB0cmFuc21pdHRlciBidWZmZXIJCSovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAqeGhlYWQ7ICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgdG8gWE1JVCAqLworICBpbnQgICAgICAgICAgICAgICAgICAgeGxlZnQ7ICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKworICAvKiBYLjI1IGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworICBpbnQgICAgICAgICAgICAgICAgICAgYnVmZnNpemU7ICAgICAgIC8qIE1heCBidWZmZXJzIHNpemVzICAgICAgICAgICAgKi8KKworICB1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIEZsYWcgdmFsdWVzLyBtb2RlIGV0YwkqLworI2RlZmluZSBTTEZfSU5VU0UJMAkJLyogQ2hhbm5lbCBpbiB1c2UgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTEZfRVNDQVBFCTEgICAgICAgICAgICAgICAvKiBFU0MgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNMRl9FUlJPUgkyICAgICAgICAgICAgICAgLyogUGFyaXR5LCBldGMuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBTTEZfT1VUV0FJVAk0CQkvKiBXYWl0aW5nIGZvciBvdXRwdXQJCSovCit9OworCisKKworI2RlZmluZSBYMjVfQVNZX01BR0lDIDB4NTMwMworCitleHRlcm4gaW50IHgyNV9hc3lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2VuZGlmCS8qIF9MSU5VWF9YMjVfQVNZLkggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE0OGYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCkBAIC0wLDAgKzEsMTg1MSBAQAorLyoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk4IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkoYykgQ29weXJpZ2h0IDIwMDAsIDIwMDEgUmVkIEhhdCBJbmMKKyAqCisgKglEZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlciB3YXMgZnVuZGVkIGJ5IEVxdWlpbmV0IEx0ZAorICoJCQlodHRwOi8vd3d3LmVxdWlpbmV0LmNvbQorICoKKyAqCUNoYW5nZUxvZzoKKyAqCisgKglBc3luY2hyb25vdXMgbW9kZSBkcm9wcGVkIGZvciAyLjIuIEZvciAyLjUgd2Ugd2lsbCBhdHRlbXB0IHRoZQorICoJdW5pZmljYXRpb24gb2YgYWxsIHRoZSBaODV4MzAgYXN5bmNocm9ub3VzIGRyaXZlcnMgZm9yIHJlYWwuCisgKgorICoJRE1BIG5vdyB1c2VzIGdldF9mcmVlX3BhZ2UgYXMga21hbGxvYyBidWZmZXJzIG1heSBzcGFuIGEgNjRLIAorICoJYm91bmRhcnkuCisgKgorICoJTW9kaWZpZWQgZm9yIFNNUCBzYWZldHkgYW5kIFNNUCBsb2NraW5nIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJUGVyZm9ybWFuY2UKKyAqCisgKglaODUyMzA6CisgKglOb24gRE1BIHlvdSB3YW50IGEgNDg2RFg1MCBvciBiZXR0ZXIgdG8gZG8gNjRLYml0cy4gOTYwMCBiYXVkCisgKglYLjI1IGlzIG5vdCB1bnJlYWxpc3RpYyBvbiBhbGwgbWFjaGluZXMuIERNQSBtb2RlIGNhbiBpbiB0aGVvcnkKKyAqCWhhbmRsZSBUMS9FMSBxdWl0ZSBuaWNlbHkuIEluIHByYWN0aWNlIHRoZSBsaW1pdCBzZWVtcyB0byBiZSBhYm91dAorICoJNTEyS2JpdC0+MU1iaXQgZGVwZW5kaW5nIG9uIG1vdGhlcmJvYXJkLgorICoKKyAqCVo4NUMzMDoKKyAqCTY0SyB3aWxsIHRha2UgRE1BLCA5NjAwIGJhdWQgWC4yNSBzaG91bGQgYmUgb2suCisgKgorICoJWjg1MzA6CisgKglTeW5jaHJvbm91cyBtb2RlIHdpdGhvdXQgRE1BIGlzIHVubGlrZWx5IHRvIHBhc3MgYWJvdXQgMjQwMCBiYXVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNkZWZpbmUgUlRfTE9DSworI2RlZmluZSBSVF9VTkxPQ0sKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlICJ6ODUyMzAuaCIKKworCisvKioKKyAqCXo4NTMwX3JlYWRfcG9ydCAtIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbnRlcmZhY2UgZnVuY3Rpb24KKyAqCUBwOiBwb3J0IHRvIHJlYWQKKyAqCisgKglQcm92aWRlZCBwb3J0IGFjY2VzcyBtZXRob2RzLiBUaGUgQ29tdHJvbCBTVjExIHJlcXVpcmVzIG5vIGRlbGF5cworICoJYmV0d2VlbiBhY2Nlc3NlcyBhbmQgdXNlcyBQQyBJL08uIFNvbWUgZHJpdmVycyBtYXkgbmVlZCBhIDV1UyBkZWxheQorICoJCisgKglJbiB0aGUgbG9uZ2VyIHRlcm0gdGhpcyBzaG91bGQgYmVjb21lIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworICoJc2VjdGlvbiBzbyB0aGF0IHRoaXMgY2FuIGJlY29tZSBhIGdlbmVyaWMgZHJpdmVyIGludGVyZmFjZSBmb3IgYWxsCisgKglwbGF0Zm9ybXMuIEZvciBub3cgd2Ugb25seSBoYW5kbGUgUEMgSS9PIHBvcnRzIHdpdGggb3Igd2l0aG91dCB0aGUKKyAqCWRyZWFkIDV1UyBzYW5pdHkgZGVsYXkuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGhvbGQgc3VmZmljaWVudCBsb2NrcyB0byBhdm9pZCB2aW9sYXRpbmcgdGhlIGhvcnJpYmxlCisgKgk1dVMgZGVsYXkgcnVsZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB6ODUzMF9yZWFkX3BvcnQodW5zaWduZWQgbG9uZyBwKQoreworCXU4IHI9aW5iKFo4NTMwX1BPUlRfT0YocCkpOworCWlmKHAmWjg1MzBfUE9SVF9TTEVFUCkJLyogZ2NjIHNob3VsZCBmaWd1cmUgdGhpcyBvdXQgZWZmaWNpZW50bHkgISAqLworCQl1ZGVsYXkoNSk7CisJcmV0dXJuIHI7Cit9CisKKy8qKgorICoJejg1MzBfd3JpdGVfcG9ydCAtIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbnRlcmZhY2UgZnVuY3Rpb24KKyAqCUBwOiBwb3J0IHRvIHdyaXRlCisgKglAZDogdmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSBhIHZhbHVlIHRvIGEgcG9ydCB3aXRoIGRlbGF5cyBpZiBuZWVkIGJlLiBOb3RlIHRoYXQgdGhlCisgKgljYWxsZXIgbXVzdCBob2xkIGxvY2tzIHRvIGF2b2lkIHJlYWQvd3JpdGVzIGZyb20gb3RoZXIgY29udGV4dHMKKyAqCXZpb2xhdGluZyB0aGUgNXVTIHJ1bGUKKyAqCisgKglJbiB0aGUgbG9uZ2VyIHRlcm0gdGhpcyBzaG91bGQgYmVjb21lIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworICoJc2VjdGlvbiBzbyB0aGF0IHRoaXMgY2FuIGJlY29tZSBhIGdlbmVyaWMgZHJpdmVyIGludGVyZmFjZSBmb3IgYWxsCisgKglwbGF0Zm9ybXMuIEZvciBub3cgd2Ugb25seSBoYW5kbGUgUEMgSS9PIHBvcnRzIHdpdGggb3Igd2l0aG91dCB0aGUKKyAqCWRyZWFkIDV1UyBzYW5pdHkgZGVsYXkuCisgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgejg1MzBfd3JpdGVfcG9ydCh1bnNpZ25lZCBsb25nIHAsIHU4IGQpCit7CisJb3V0YihkLFo4NTMwX1BPUlRfT0YocCkpOworCWlmKHAmWjg1MzBfUE9SVF9TTEVFUCkKKwkJdWRlbGF5KDUpOworfQorCisKKworc3RhdGljIHZvaWQgejg1MzBfcnhfZG9uZShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYyk7CitzdGF0aWMgdm9pZCB6ODUzMF90eF9kb25lKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKTsKKworCisvKioKKyAqCXJlYWRfenNyZWcgLSBSZWFkIGEgcmVnaXN0ZXIgZnJvbSBhIFo4NTIzMCAKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIHJlYWQgZnJvbSAoMiBwZXIgY2hpcCkKKyAqCUByZWc6IFJlZ2lzdGVyIHRvIHJlYWQKKyAqCUZJWE1FOiBVc2UgYSBzcGlubG9jay4KKyAqCQorICoJTW9zdCBvZiB0aGUgWjg1MzAgcmVnaXN0ZXJzIGFyZSBpbmRleGVkIG9mZiB0aGUgY29udHJvbCByZWdpc3RlcnMuCisgKglBIHJlYWQgaXMgZG9uZSBieSB3cml0aW5nIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGFuZCByZWFkaW5nIHRoZQorICoJcmVnaXN0ZXIgYmFjay4gIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBsb2NrCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdTggcmVhZF96c3JlZyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggcmVnKQoreworCWlmKHJlZykKKwkJejg1MzBfd3JpdGVfcG9ydChjLT5jdHJsaW8sIHJlZyk7CisJcmV0dXJuIHo4NTMwX3JlYWRfcG9ydChjLT5jdHJsaW8pOworfQorCisvKioKKyAqCXJlYWRfenNkYXRhIC0gUmVhZCB0aGUgZGF0YSBwb3J0IG9mIGEgWjg1MzAgY2hhbm5lbAorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsIHRvIHJlYWQgdGhlIGRhdGEgcG9ydCBmcm9tCisgKgorICoJVGhlIGRhdGEgcG9ydCBwcm92aWRlcyBmYXN0IGFjY2VzcyB0byBzb21lIHRoaW5ncy4gV2Ugc3RpbGwKKyAqCWhhdmUgYWxsIHRoZSA1dVMgZGVsYXlzIHRvIHdvcnJ5IGFib3V0LgorICovCisKK3N0YXRpYyBpbmxpbmUgdTggcmVhZF96c2RhdGEoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdTggcjsKKwlyPXo4NTMwX3JlYWRfcG9ydChjLT5kYXRhaW8pOworCXJldHVybiByOworfQorCisvKioKKyAqCXdyaXRlX3pzcmVnIC0gV3JpdGUgdG8gYSBaODUzMCBjaGFubmVsIHJlZ2lzdGVyCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwKKyAqCUByZWc6IFJlZ2lzdGVyIG51bWJlcgorICoJQHZhbDogVmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSBhIHZhbHVlIHRvIGFuIGluZGV4ZWQgcmVnaXN0ZXIuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBsb2NrCisgKgl0byBob25vdXIgdGhlIGlycml0YXRpbmcgZGVsYXkgcnVsZXMuIFdlIGtub3cgYWJvdXQgcmVnaXN0ZXIgMAorICoJYmVpbmcgZmFzdCB0byBhY2Nlc3MuCisgKgorICogICAgICBBc3N1bWVzIGMtPmxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3pzcmVnKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpZihyZWcpCisJCXo4NTMwX3dyaXRlX3BvcnQoYy0+Y3RybGlvLCByZWcpOworCXo4NTMwX3dyaXRlX3BvcnQoYy0+Y3RybGlvLCB2YWwpOworCit9CisKKy8qKgorICoJd3JpdGVfenNjdHJsIC0gV3JpdGUgdG8gYSBaODUzMCBjb250cm9sIHJlZ2lzdGVyCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwKKyAqCUB2YWw6IFZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgZGlyZWN0bHkgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgb24gdGhlIFo4NTMwCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3pzY3RybChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggdmFsKQoreworCXo4NTMwX3dyaXRlX3BvcnQoYy0+Y3RybGlvLCB2YWwpOworfQorCisvKioKKyAqCXdyaXRlX3pzZGF0YSAtIFdyaXRlIHRvIGEgWjg1MzAgY29udHJvbCByZWdpc3RlcgorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsCisgKglAdmFsOiBWYWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlIGRpcmVjdGx5IHRvIHRoZSBkYXRhIHJlZ2lzdGVyIG9uIHRoZSBaODUzMAorICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3pzZGF0YShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggdmFsKQoreworCXo4NTMwX3dyaXRlX3BvcnQoYy0+ZGF0YWlvLCB2YWwpOworfQorCisvKgorICoJUmVnaXN0ZXIgbG9hZGluZyBwYXJhbWV0ZXJzIGZvciBhIGRlYWQgcG9ydAorICovCisgCit1OCB6ODUzMF9kZWFkX3BvcnRbXT0KK3sKKwkyNTUKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfZGVhZF9wb3J0KTsKKworLyoKKyAqCVJlZ2lzdGVyIGxvYWRpbmcgcGFyYW1ldGVycyBmb3IgY3VycmVudGx5IHN1cHBvcnRlZCBjaXJjdWl0IHR5cGVzCisgKi8KKworCisvKgorICoJRGF0YSBjbG9ja2VkIGJ5IHRlbGNvIGVuZC4gVGhpcyBpcyB0aGUgY29ycmVjdCBkYXRhIGZvciB0aGUgVUsKKyAqCSJraWxvc3RyZWFtIiBzZXJ2aWNlLCBhbmQgbW9zdCBvdGhlciBzaW1pbGFyIHNlcnZpY2VzLgorICovCisgCit1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1bXT0KK3sKKwk0LAlTWU5DX0VOQUJ8U0RMQ3xYMUNMSywKKwkyLAkwLAkvKiBObyB2ZWN0b3IgKi8KKwkxLAkwLAorCTMsCUVOVF9ITXxSeENSQ19FTkFCfFJ4OCwKKwk1LAlUeENSQ19FTkFCfFJUU3xUeEVOQUJ8VHg4fERUUiwKKwk5LAkwLAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJNiwJMHhGRiwKKwk3LAlGTEFHLAorCTEwLAlBQlVOREVSfE5SWnxDUkNQUywvKk1BUktJRExFID8/Ki8KKwkxMSwJVENUUnhDUCwKKwkxNCwJRElTRFBMTCwKKwkxNSwJRENESUV8U1lOQ0lFfENUU0lFfFR4VUlFfEJSS0lFLAorCTEsCUVYVF9JTlRfRU5BQnxUeElOVF9FTkFCfElOVF9BTExfUngsCisJOSwJTlZ8TUlFfE5PUkVTRVQsCisJMjU1Cit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX2hkbGNfa2lsb3N0cmVhbSk7CisKKy8qCisgKglBcyBhYm92ZSBidXQgZm9yIGVuaGFuY2VkIGNoaXBzLgorICovCisgCit1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzBbXT0KK3sKKwk0LAlTWU5DX0VOQUJ8U0RMQ3xYMUNMSywKKwkyLAkwLAkvKiBObyB2ZWN0b3IgKi8KKwkxLAkwLAorCTMsCUVOVF9ITXxSeENSQ19FTkFCfFJ4OCwKKwk1LAlUeENSQ19FTkFCfFJUU3xUeEVOQUJ8VHg4fERUUiwKKwk5LAkwLAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJNiwJMHhGRiwKKwk3LAlGTEFHLAorCTEwLAlBQlVOREVSfE5SWnxDUkNQUywJLyogTUFSS0lETEU/PyAqLworCTExLAlUQ1RSeENQLAorCTE0LAlESVNEUExMLAorCTE1LAlEQ0RJRXxTWU5DSUV8Q1RTSUV8VHhVSUV8QlJLSUUsCisJMSwJRVhUX0lOVF9FTkFCfFR4SU5UX0VOQUJ8SU5UX0FMTF9SeCwKKwk5LAlOVnxNSUV8Tk9SRVNFVCwKKwkyMywJMywJCS8qIEV4dGVuZGVkIG1vZGUgQVVUTyBUWCBhbmQgRU9NKi8KKwkKKwkyNTUKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfaGRsY19raWxvc3RyZWFtXzg1MjMwKTsKKworLyoqCisgKgl6ODUzMF9mbHVzaF9maWZvIC0gRmx1c2ggb24gY2hpcCBSWCBGSUZPCisgKglAYzogQ2hhbm5lbCB0byBmbHVzaAorICoKKyAqCUZsdXNoIHRoZSByZWNlaXZlIEZJRk8uIFRoZXJlIGlzIG5vIHNwZWNpZmljIG9wdGlvbiBmb3IgdGhpcywgd2UgCisgKglibGluZGx5IHJlYWQgYnl0ZXMgYW5kIGRpc2NhcmQgdGhlbS4gUmVhZGluZyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEKKyAqCWlzIGhhcm1sZXNzLiBUaGUgODUzMCBoYXMgYSA0IGJ5dGUgRklGTywgdGhlIDg1MjMwIGhhcyA4IGJ5dGVzLgorICoJCisgKglBbGwgbG9ja2luZyBpcyBoYW5kbGVkIGZvciB0aGUgY2FsbGVyLiBPbiByZXR1cm4gZGF0YSBtYXkgc3RpbGwgYmUKKyAqCXByZXNlbnQgaWYgaXQgYXJyaXZlZCBkdXJpbmcgdGhlIGZsdXNoLgorICovCisgCitzdGF0aWMgdm9pZCB6ODUzMF9mbHVzaF9maWZvKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXJlYWRfenNyZWcoYywgUjEpOworCXJlYWRfenNyZWcoYywgUjEpOworCXJlYWRfenNyZWcoYywgUjEpOworCXJlYWRfenNyZWcoYywgUjEpOworCWlmKGMtPmRldi0+dHlwZT09Wjg1MjMwKQorCXsKKwkJcmVhZF96c3JlZyhjLCBSMSk7CisJCXJlYWRfenNyZWcoYywgUjEpOworCQlyZWFkX3pzcmVnKGMsIFIxKTsKKwkJcmVhZF96c3JlZyhjLCBSMSk7CisJfQorfQkKKworLyoqCisgKgl6ODUzMF9ydHNkdHIgLSBDb250cm9sIHRoZSBvdXRnb2luZyBEVFMvUlRTIGxpbmUKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBjb250cm9sOworICoJQHNldDogMSB0byBzZXQsIDAgdG8gY2xlYXIKKyAqCisgKglTZXRzIG9yIGNsZWFycyBEVFIvUlRTIG9uIHRoZSByZXF1ZXN0ZWQgbGluZS4gQWxsIGxvY2tpbmcgaXMgaGFuZGxlZAorICoJYnkgdGhlIGNhbGxlci4gRm9yIG5vdyB3ZSBhc3N1bWUgYWxsIGJvYXJkcyB1c2UgdGhlIGFjdHVhbCBSVFMvRFRSCisgKglvbiB0aGUgY2hpcC4gQXBwYXJlbnRseSBvbmUgb3IgdHdvIGRvbid0LiBXZSdsbCBzY3JlYW0gYWJvdXQgdGhlbQorICoJbGF0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgejg1MzBfcnRzZHRyKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBpbnQgc2V0KQoreworCWlmIChzZXQpCisJCWMtPnJlZ3NbNV0gfD0gKFJUUyB8IERUUik7CisJZWxzZQorCQljLT5yZWdzWzVdICY9IH4oUlRTIHwgRFRSKTsKKwl3cml0ZV96c3JlZyhjLCBSNSwgYy0+cmVnc1s1XSk7Cit9CisKKy8qKgorICoJejg1MzBfcnggLSBIYW5kbGUgYSBQSU8gcmVjZWl2ZSBldmVudAorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gcHJvY2VzcworICoKKyAqCVJlY2VpdmUgaGFuZGxlciBmb3IgcmVjZWl2aW5nIGluIFBJTyBtb2RlLiBUaGlzIGlzIG11Y2ggbGlrZSB0aGUgCisgKglhc3luYyBvbmUgYnV0IG5vdCBxdWl0ZSB0aGUgc2FtZSBvciBhcyBjb21wbGV4CisgKgorICoJTm90ZTogSXRzIGludGVuZGVkIHRoYXQgdGhpcyBoYW5kbGVyIGNhbiBlYXNpbHkgYmUgc2VwYXJhdGVkIGZyb20KKyAqCXRoZSBtYWluIGNvZGUgdG8gcnVuIHJlYWx0aW1lLiBUaGF0J2xsIGJlIG5lZWRlZCBmb3Igc29tZSBtYWNoaW5lcworICoJKGVnIHRvIGV2ZXIgY2xvY2sgNjRrYml0cyBvbiBhIHNwYXJjIDspKS4KKyAqCisgKglUaGUgUlRfTE9DSyBtYWNyb3MgZG9uJ3QgZG8gYW55dGhpbmcgbm93LiBLZWVwIHRoZSBjb2RlIGNvdmVyZWQKKyAqCWJ5IHRoZW0gYXMgc2hvcnQgYXMgcG9zc2libGUgaW4gYWxsIGNpcmN1bXN0YW5jZXMgLSBjbG9ja3MgY29zdAorICoJYmF1ZC4gVGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXRvbWljIHcuci50LiB0bworICoJb3RoZXIgY29kZSAtIHRoaXMgaXMgdHJ1ZSBpbiB0aGUgUlQgY2FzZSB0b28uCisgKgorICoJV2Ugb25seSBjb3ZlciB0aGUgc3luYyBjYXNlcyBmb3IgdGhpcy4gSWYgeW91IHdhbnQgMk1iaXQgYXN5bmMKKyAqCWRvIGl0IHlvdXJzZWxmIGJ1dCBjb25zaWRlciBtZWRpY2FsIGFzc2lzdGFuY2UgZmlyc3QuIFRoaXMgbm9uIERNQSAKKyAqCXN5bmNocm9ub3VzIG1vZGUgaXMgcG9ydGFibGUgY29kZS4gVGhlIERNQSBtb2RlIGFzc3VtZXMgUENJIGxpa2UgCisgKglJU0EgRE1BCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIGRldmljZSBsb2NrIGhlbGQKKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfcngoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdTggY2gsc3RhdDsKKwlzcGluX2xvY2soYy0+bG9jayk7CisgCisJd2hpbGUoMSkKKwl7CisJCS8qIEZJRk8gZW1wdHkgPyAqLworCQlpZighKHJlYWRfenNyZWcoYywgUjApJjEpKQorCQkJYnJlYWs7CisJCWNoPXJlYWRfenNkYXRhKGMpOworCQlzdGF0PXJlYWRfenNyZWcoYywgUjEpOworCQorCQkvKgorCQkgKglPdmVycnVuID8KKwkJICovCisJCWlmKGMtPmNvdW50IDwgYy0+bWF4KQorCQl7CisJCQkqYy0+ZHB0cisrPWNoOworCQkJYy0+Y291bnQrKzsKKwkJfQorCisJCWlmKHN0YXQmRU5EX0ZSKQorCQl7CisJCQorCQkJLyoKKwkJCSAqCUVycm9yID8KKwkJCSAqLworCQkJaWYoc3RhdCYoUnhfT1ZSfENSQ19FUlIpKQorCQkJeworCQkJCS8qIFJld2luZCB0aGUgYnVmZmVyIGFuZCByZXR1cm4gKi8KKwkJCQlpZihjLT5za2IpCisJCQkJCWMtPmRwdHI9Yy0+c2tiLT5kYXRhOworCQkJCWMtPmNvdW50PTA7CisJCQkJaWYoc3RhdCZSeF9PVlIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3ZlcnJ1blxuIiwgYy0+ZGV2LT5uYW1lKTsKKwkJCQkJYy0+cnhfb3ZlcnJ1bisrOworCQkJCX0KKwkJCQlpZihzdGF0JkNSQ19FUlIpCisJCQkJeworCQkJCQljLT5yeF9jcmNfZXJyKys7CisJCQkJCS8qIHByaW50aygiY3JjIGVycm9yXG4iKTsgKi8KKwkJCQl9CisJCQkJLyogU2hvdmUgdGhlIGZyYW1lIHVwc3RyZWFtICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyoKKwkJCQkgKglEcm9wIHRoZSBsb2NrIGZvciBSWCBwcm9jZXNzaW5nLCBvcgorCQkgCQkgKgl0aGVyZSBhcmUgZGVhZGxvY2tzCisJCSAJCSAqLworCQkJCXo4NTMwX3J4X2RvbmUoYyk7CisJCQkJd3JpdGVfenNjdHJsKGMsIFJFU19SeF9DUkMpOworCQkJfQorCQl9CisJfQorCS8qCisJICoJQ2xlYXIgaXJxCisJICovCisJd3JpdGVfenNjdHJsKGMsIEVSUl9SRVMpOworCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOworCXNwaW5fdW5sb2NrKGMtPmxvY2spOworfQorCisKKy8qKgorICoJejg1MzBfdHggLSBIYW5kbGUgYSBQSU8gdHJhbnNtaXQgZXZlbnQKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIHByb2Nlc3MKKyAqCisgKglaODUzMCB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIFBJTyBtb2RlLiBUaGUgYmFzaWMKKyAqCWlkZWEgaXMgdG8gYXR0ZW1wdCB0byBrZWVwIHRoZSBGSUZPIGZlZC4gV2UgZmlsbCBhcyBtYW55IGJ5dGVzCisgKglpbiBhcyBwb3NzaWJsZSwgaXRzIHF1aXRlIHBvc3NpYmxlIHRoYXQgd2Ugd29uJ3Qga2VlcCB1cCB3aXRoIHRoZQorICoJZGF0YSByYXRlIG90aGVyd2lzZS4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfdHgoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJc3Bpbl9sb2NrKGMtPmxvY2spOworCXdoaWxlKGMtPnR4Y291bnQpIHsKKwkJLyogRklGTyBmdWxsID8gKi8KKwkJaWYoIShyZWFkX3pzcmVnKGMsIFIwKSY0KSkKKwkJCWJyZWFrOworCQljLT50eGNvdW50LS07CisJCS8qCisJCSAqCVNob3ZlbCBvdXQgdGhlIGJ5dGUKKwkJICovCisJCXdyaXRlX3pzcmVnKGMsIFI4LCAqYy0+dHhfcHRyKyspOworCQl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKKwkJLyogV2UgYXJlIGFib3V0IHRvIHVuZGVyZmxvdyAqLworCQlpZihjLT50eGNvdW50PT0wKQorCQl7CisJCQl3cml0ZV96c2N0cmwoYywgUkVTX0VPTV9MKTsKKwkJCXdyaXRlX3pzcmVnKGMsIFIxMCwgYy0+cmVnc1sxMF0mfkFCVU5ERVIpOworCQl9CisJfQorCisJCisJLyoKKwkgKglFbmQgb2YgZnJhbWUgVFggLSBmaXJlIGFub3RoZXIgb25lCisJICovCisJIAorCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfUCk7CisKKwl6ODUzMF90eF9kb25lKGMpOwkgCisJd3JpdGVfenNjdHJsKGMsIFJFU19IX0lVUyk7CisJc3Bpbl91bmxvY2soYy0+bG9jayk7Cit9CisKKy8qKgorICoJejg1MzBfc3RhdHVzIC0gSGFuZGxlIGEgUElPIHN0YXR1cyBleGNlcHRpb24KKyAqCUBjaGFuOiBaODUzMCBjaGFubmVsIHRvIHByb2Nlc3MKKyAqCisgKglBIHN0YXR1cyBldmVudCBvY2N1cnJlZCBpbiBQSU8gc3luY2hyb25vdXMgbW9kZS4gVGhlcmUgYXJlIHNldmVyYWwKKyAqCXJlYXNvbnMgdGhlIGNoaXAgd2lsbCBib3RoZXIgdXMgaGVyZS4gQSB0cmFuc21pdCB1bmRlcnJ1biBtZWFucyB3ZQorICoJZmFpbGVkIHRvIGZlZWQgdGhlIGNoaXAgZmFzdCBlbm91Z2ggYW5kIGp1c3QgYnJva2UgYSBwYWNrZXQuIEEgRENECisgKgljaGFuZ2UgaXMgYSBsaW5lIHVwIG9yIGRvd24uIFdlIGNvbW11bmljYXRlIHRoYXQgYmFjayB0byB0aGUgcHJvdG9jb2wKKyAqCWxheWVyIGZvciBzeW5jaHJvbm91cyBQUFAgdG8gcmVuZWdvdGlhdGUuCisgKi8KKworc3RhdGljIHZvaWQgejg1MzBfc3RhdHVzKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuKQoreworCXU4IHN0YXR1cywgYWx0ZXJlZDsKKworCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKKwlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMCk7CisJYWx0ZXJlZD1jaGFuLT5zdGF0dXNec3RhdHVzOworCQorCWNoYW4tPnN0YXR1cz1zdGF0dXM7CisJCisJaWYoc3RhdHVzJlR4RU9NKQorCXsKKy8qCQlwcmludGsoIiVzOiBUeCB1bmRlcnJ1bi5cbiIsIGNoYW4tPmRldi0+bmFtZSk7ICovCisJCWNoYW4tPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXdyaXRlX3pzY3RybChjaGFuLCBFUlJfUkVTKTsKKwkJejg1MzBfdHhfZG9uZShjaGFuKTsKKwl9CisJCQorCWlmKGFsdGVyZWQmY2hhbi0+ZGNkY2hlY2spCisJeworCQlpZihzdGF0dXMmY2hhbi0+ZGNkY2hlY2spCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgcmFpc2VkXG4iLCBjaGFuLT5kZXYtPm5hbWUpOworCQkJd3JpdGVfenNyZWcoY2hhbiwgUjMsIGNoYW4tPnJlZ3NbM118UnhFTkFCTEUpOworCQkJaWYoY2hhbi0+bmV0ZGV2aWNlICYmCisJCQkgICAgKChjaGFuLT5uZXRkZXZpY2UtPnR5cGUgPT0gQVJQSFJEX0hETEMpIHx8CisJCQkgICAgKGNoYW4tPm5ldGRldmljZS0+dHlwZSA9PSBBUlBIUkRfUFBQKSkpCisJCQkJc3BwcF9yZW9wZW4oY2hhbi0+bmV0ZGV2aWNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgbG9zdFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdJn5SeEVOQUJMRSk7CisJCQl6ODUzMF9mbHVzaF9maWZvKGNoYW4pOworCQl9CisJCQorCX0JCisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19FWFRfSU5UKTsKKwl3cml0ZV96c2N0cmwoY2hhbiwgUkVTX0hfSVVTKTsKKwlzcGluX3VubG9jayhjaGFuLT5sb2NrKTsKK30KKworc3RydWN0IHo4NTMwX2lycWhhbmRsZXIgejg1MzBfc3luYz0KK3sKKwl6ODUzMF9yeCwKKwl6ODUzMF90eCwKKwl6ODUzMF9zdGF0dXMKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luYyk7CisKKy8qKgorICoJejg1MzBfZG1hX3J4IC0gSGFuZGxlIGEgRE1BIFJYIGV2ZW50CisgKglAY2hhbjogQ2hhbm5lbCB0byBoYW5kbGUKKyAqCisgKglOb24gYnVzIG1hc3RlcmluZyBETUEgaW50ZXJmYWNlcyBmb3IgdGhlIFo4eDMwIGRldmljZXMuIFRoaXMKKyAqCWlzIHJlYWxseSBwcmV0dHkgUEMgc3BlY2lmaWMuIFRoZSBETUEgbW9kZSBtZWFucyB0aGF0IG1vc3QgcmVjZWl2ZQorICoJZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBETUEgaGFyZHdhcmUuIFdlIGdldCBhIGtpY2sgaGVyZSBvbmx5IGlmCisgKglhIGZyYW1lIGVuZGVkLgorICovCisgCitzdGF0aWMgdm9pZCB6ODUzMF9kbWFfcngoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmNoYW4pCit7CisJc3Bpbl9sb2NrKGNoYW4tPmxvY2spOworCWlmKGNoYW4tPnJ4ZG1hX29uKQorCXsKKwkJLyogU3BlY2lhbCBjb25kaXRpb24gY2hlY2sgb25seSAqLworCQl1OCBzdGF0dXM7CisJCisJCXJlYWRfenNyZWcoY2hhbiwgUjcpOworCQlyZWFkX3pzcmVnKGNoYW4sIFI2KTsKKwkJCisJCXN0YXR1cz1yZWFkX3pzcmVnKGNoYW4sIFIxKTsKKwkKKwkJaWYoc3RhdHVzJkVORF9GUikKKwkJeworCQkJejg1MzBfcnhfZG9uZShjaGFuKTsJLyogRmlyZSB1cCB0aGUgbmV4dCBvbmUgKi8KKwkJfQkJCisJCXdyaXRlX3pzY3RybChjaGFuLCBFUlJfUkVTKTsKKwkJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7CisJfQorCWVsc2UKKwl7CisJCS8qIERNQSBpcyBvZmYgcmlnaHQgbm93LCBkcmFpbiB0aGUgc2xvdyB3YXkgKi8KKwkJejg1MzBfcngoY2hhbik7CisJfQkKKwlzcGluX3VubG9jayhjaGFuLT5sb2NrKTsKK30KKworLyoqCisgKgl6ODUzMF9kbWFfdHggLSBIYW5kbGUgYSBETUEgVFggZXZlbnQKKyAqCUBjaGFuOglUaGUgWjg1MzAgY2hhbm5lbCB0byBoYW5kbGUKKyAqCisgKglXZSBoYXZlIHJlY2VpdmVkIGFuIGludGVycnVwdCB3aGlsZSBkb2luZyBETUEgdHJhbnNtaXNzaW9ucy4gSXQKKyAqCXNob3VsZG4ndCBoYXBwZW4uIFNjcmVhbSBsb3VkbHkgaWYgaXQgZG9lcy4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZG1hX3R4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuKQoreworCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKKwlpZighY2hhbi0+ZG1hX3R4KQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSGV5IHdobyB0dXJuZWQgdGhlIERNQSBvZmY/XG4iKTsKKwkJejg1MzBfdHgoY2hhbik7CisJCXJldHVybjsKKwl9CisJLyogVGhpcyBzaG91bGRudCBvY2N1ciBpbiBETUEgbW9kZSAqLworCXByaW50ayhLRVJOX0VSUiAiRE1BIHR4IC0gYm9ndXMgZXZlbnQhXG4iKTsKKwl6ODUzMF90eChjaGFuKTsKKwlzcGluX3VubG9jayhjaGFuLT5sb2NrKTsKK30KKworLyoqCisgKgl6ODUzMF9kbWFfc3RhdHVzIC0gSGFuZGxlIGEgRE1BIHN0YXR1cyBleGNlcHRpb24KKyAqCUBjaGFuOiBaODUzMCBjaGFubmVsIHRvIHByb2Nlc3MKKyAqCQorICoJQSBzdGF0dXMgZXZlbnQgb2NjdXJyZWQgb24gdGhlIFo4NTMwLiBXZSByZWNlaXZlIHRoZXNlIGZvciB0d28gcmVhc29ucworICoJd2hlbiBpbiBETUEgbW9kZS4gRmlyc3RseSBpZiB3ZSBmaW5pc2hlZCBhIHBhY2tldCB0cmFuc2ZlciB3ZSBnZXQgb25lCisgKglhbmQga2ljayB0aGUgbmV4dCBwYWNrZXQgb3V0LiBTZWNvbmRseSB3ZSBtYXkgc2VlIGEgRENEIGNoYW5nZSBhbmQKKyAqCWhhdmUgdG8gcG9rZSB0aGUgcHJvdG9jb2wgbGF5ZXIuCisgKgorICovCisgCitzdGF0aWMgdm9pZCB6ODUzMF9kbWFfc3RhdHVzKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuKQoreworCXU4IHN0YXR1cywgYWx0ZXJlZDsKKworCXN0YXR1cz1yZWFkX3pzcmVnKGNoYW4sIFIwKTsKKwlhbHRlcmVkPWNoYW4tPnN0YXR1c15zdGF0dXM7CisJCisJY2hhbi0+c3RhdHVzPXN0YXR1czsKKworCisJaWYoY2hhbi0+ZG1hX3R4KQorCXsKKwkJaWYoc3RhdHVzJlR4RU9NKQorCQl7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCWRpc2FibGVfZG1hKGNoYW4tPnR4ZG1hKTsKKwkJCWNsZWFyX2RtYV9mZihjaGFuLT50eGRtYSk7CQorCQkJY2hhbi0+dHhkbWFfb249MDsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkJejg1MzBfdHhfZG9uZShjaGFuKTsKKwkJfQorCX0KKworCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKKwlpZihhbHRlcmVkJmNoYW4tPmRjZGNoZWNrKQorCXsKKwkJaWYoc3RhdHVzJmNoYW4tPmRjZGNoZWNrKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIHJhaXNlZFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdfFJ4RU5BQkxFKTsKKwkJCWlmKGNoYW4tPm5ldGRldmljZSAmJgorCQkJICAgICgoY2hhbi0+bmV0ZGV2aWNlLT50eXBlID09IEFSUEhSRF9IRExDKSB8fAorCQkJICAgIChjaGFuLT5uZXRkZXZpY2UtPnR5cGUgPT0gQVJQSFJEX1BQUCkpKQorCQkJCXNwcHBfcmVvcGVuKGNoYW4tPm5ldGRldmljZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczpEQ0QgbG9zdFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdJn5SeEVOQUJMRSk7CisJCQl6ODUzMF9mbHVzaF9maWZvKGNoYW4pOworCQl9CisJfQkKKworCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7CisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX2RtYV9zeW5jPQoreworCXo4NTMwX2RtYV9yeCwKKwl6ODUzMF9kbWFfdHgsCisJejg1MzBfZG1hX3N0YXR1cworfTsKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9kbWFfc3luYyk7CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX3R4ZG1hX3N5bmM9Cit7CisJejg1MzBfcngsCisJejg1MzBfZG1hX3R4LAorCXo4NTMwX2RtYV9zdGF0dXMKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfdHhkbWFfc3luYyk7CisKKy8qKgorICoJejg1MzBfcnhfY2xlYXIgLSBIYW5kbGUgUlggZXZlbnRzIGZyb20gYSBzdG9wcGVkIGNoaXAKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIHNodXQgdXAKKyAqCisgKglSZWNlaXZlIGludGVycnVwdCB2ZWN0b3JzIGZvciBhIFo4NTMwIHRoYXQgaXMgaW4gJ3BhcmtlZCcgbW9kZS4KKyAqCUZvciBtYWNoaW5lcyB3aXRoIFBDSSBaODV4MzAgY2FyZHMsIG9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzCisgKgkoZWcgdGhlIE1hY0lJKSB3ZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2Ugb3IgZGllLgorICovCisKKworc3RhdGljIHZvaWQgejg1MzBfcnhfY2xlYXIoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJLyoKKwkgKglEYXRhIGFuZCBzdGF0dXMgYnl0ZXMKKwkgKi8KKwl1OCBzdGF0OworCisJcmVhZF96c2RhdGEoYyk7CisJc3RhdD1yZWFkX3pzcmVnKGMsIFIxKTsKKwkKKwlpZihzdGF0JkVORF9GUikKKwkJd3JpdGVfenNjdHJsKGMsIFJFU19SeF9DUkMpOworCS8qCisJICoJQ2xlYXIgaXJxCisJICovCisJd3JpdGVfenNjdHJsKGMsIEVSUl9SRVMpOworCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOworfQorCisvKioKKyAqCXo4NTMwX3R4X2NsZWFyIC0gSGFuZGxlIFRYIGV2ZW50cyBmcm9tIGEgc3RvcHBlZCBjaGlwCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBzaHV0IHVwCisgKgorICoJVHJhbnNtaXQgaW50ZXJydXB0IHZlY3RvcnMgZm9yIGEgWjg1MzAgdGhhdCBpcyBpbiAncGFya2VkJyBtb2RlLgorICoJRm9yIG1hY2hpbmVzIHdpdGggUENJIFo4NXgzMCBjYXJkcywgb3IgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMKKyAqCShlZyB0aGUgTWFjSUkpIHdlIG11c3QgY2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSBvciBkaWUuCisgKi8KKworc3RhdGljIHZvaWQgejg1MzBfdHhfY2xlYXIoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJd3JpdGVfenNjdHJsKGMsIFJFU19UeF9QKTsKKwl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKK30KKworLyoqCisgKgl6ODUzMF9zdGF0dXNfY2xlYXIgLSBIYW5kbGUgc3RhdHVzIGV2ZW50cyBmcm9tIGEgc3RvcHBlZCBjaGlwCisgKglAY2hhbjogWjg1MzAgY2hhbm5lbCB0byBzaHV0IHVwCisgKgorICoJU3RhdHVzIGludGVycnVwdCB2ZWN0b3JzIGZvciBhIFo4NTMwIHRoYXQgaXMgaW4gJ3BhcmtlZCcgbW9kZS4KKyAqCUZvciBtYWNoaW5lcyB3aXRoIFBDSSBaODV4MzAgY2FyZHMsIG9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzCisgKgkoZWcgdGhlIE1hY0lJKSB3ZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2Ugb3IgZGllLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3N0YXR1c19jbGVhcihzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwl1OCBzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMCk7CisJaWYoc3RhdHVzJlR4RU9NKQorCQl3cml0ZV96c2N0cmwoY2hhbiwgRVJSX1JFUyk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19FWFRfSU5UKTsKKwl3cml0ZV96c2N0cmwoY2hhbiwgUkVTX0hfSVVTKTsKK30KKworc3RydWN0IHo4NTMwX2lycWhhbmRsZXIgejg1MzBfbm9wPQoreworCXo4NTMwX3J4X2NsZWFyLAorCXo4NTMwX3R4X2NsZWFyLAorCXo4NTMwX3N0YXR1c19jbGVhcgorfTsKKworCitFWFBPUlRfU1lNQk9MKHo4NTMwX25vcCk7CisKKy8qKgorICoJejg1MzBfaW50ZXJydXB0IC0gSGFuZGxlIGFuIGludGVycnVwdCBmcm9tIGEgWjg1MzAKKyAqCUBpcnE6IAlJbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOiBUaGUgWjg1MzAgZGV2aWNlIHRoYXQgaXMgaW50ZXJydXB0aW5nLgorICoJQHJlZ3M6IHVudXNlZAorICoKKyAqCUEgWjg1WzJdMzAgZGV2aWNlIGhhcyBzdHVjayBpdHMgaGFuZCBpbiB0aGUgYWlyIGZvciBhdHRlbnRpb24uCisgKglXZSBzY2FuIGJvdGggdGhlIGNoYW5uZWxzIG9uIHRoZSBjaGlwIGZvciBldmVudHMgYW5kIHRoZW4gY2FsbAorICoJdGhlIGNoYW5uZWwgc3BlY2lmaWMgY2FsbCBiYWNrcyBmb3IgZWFjaCBjaGFubmVsIHRoYXQgaGFzIGV2ZW50cy4KKyAqCVdlIGhhdmUgdG8gdXNlIGNhbGxiYWNrIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZSB0d28gY2hhbm5lbHMgY2FuIGJlCisgKglpbiBkaWZmZXJlbnQgbW9kZXMuCisgKgorICoJTG9ja2luZyBpcyBkb25lIGZvciB0aGUgaGFuZGxlcnMuIE5vdGUgdGhhdCBsb2NraW5nIGlzIGRvbmUKKyAqCWF0IHRoZSBjaGlwIGxldmVsICh0aGUgNXVTIGRlbGF5IGlzc3VlIGlzIHBlciBjaGlwIG5vdCBwZXIKKyAqCWNoYW5uZWwpLiBjLT5sb2NrIGZvciBib3RoIGNoYW5uZWxzIHBvaW50cyB0byBkZXYtPmxvY2sKKyAqLworCitpcnFyZXR1cm5fdCB6ODUzMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgejg1MzBfZGV2ICpkZXY9ZGV2X2lkOworCXU4IGludHI7CisJc3RhdGljIHZvbGF0aWxlIGludCBsb2NrZXI9MDsKKwlpbnQgd29yaz0wOworCXN0cnVjdCB6ODUzMF9pcnFoYW5kbGVyICppcnFzOworCQorCWlmKGxvY2tlcikKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSVJRIHJlLWVudGVyXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlsb2NrZXI9MTsKKworCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKKworCXdoaWxlKCsrd29yazw1MDAwKQorCXsKKworCQlpbnRyID0gcmVhZF96c3JlZygmZGV2LT5jaGFuQSwgUjMpOworCQlpZighKGludHIgJiAoQ0hBUnhJUHxDSEFUeElQfENIQUVYVHxDSEJSeElQfENIQlR4SVB8Q0hCRVhUKSkpCisJCQlicmVhazsKKwkKKwkJLyogVGhpcyBob2xkcyB0aGUgSVJRIHN0YXR1cy4gT24gdGhlIDg1MzAgeW91IG11c3QgcmVhZCBpdCBmcm9tIGNoYW4gCisJCSAgIEEgZXZlbiB0aG91Z2ggaXQgYXBwbGllcyB0byB0aGUgd2hvbGUgY2hpcCAqLworCQkKKwkJLyogTm93IHdhbGsgdGhlIGNoaXAgYW5kIHNlZSB3aGF0IGl0IGlzIHdhbnRpbmcgLSBpdCBtYXkgYmUKKwkJICAgYW4gSVJRIGZvciBzb21lb25lIGVsc2UgcmVtZW1iZXIgKi8KKwkJICAgCisJCWlycXM9ZGV2LT5jaGFuQS5pcnFzOworCisJCWlmKGludHIgJiAoQ0hBUnhJUHxDSEFUeElQfENIQUVYVCkpCisJCXsKKwkJCWlmKGludHImQ0hBUnhJUCkKKwkJCQlpcnFzLT5yeCgmZGV2LT5jaGFuQSk7CisJCQlpZihpbnRyJkNIQVR4SVApCisJCQkJaXJxcy0+dHgoJmRldi0+Y2hhbkEpOworCQkJaWYoaW50ciZDSEFFWFQpCisJCQkJaXJxcy0+c3RhdHVzKCZkZXYtPmNoYW5BKTsKKwkJfQorCisJCWlycXM9ZGV2LT5jaGFuQi5pcnFzOworCisJCWlmKGludHIgJiAoQ0hCUnhJUHxDSEJUeElQfENIQkVYVCkpCisJCXsKKwkJCWlmKGludHImQ0hCUnhJUCkKKwkJCQlpcnFzLT5yeCgmZGV2LT5jaGFuQik7CisJCQlpZihpbnRyJkNIQlR4SVApCisJCQkJaXJxcy0+dHgoJmRldi0+Y2hhbkIpOworCQkJaWYoaW50ciZDSEJFWFQpCisJCQkJaXJxcy0+c3RhdHVzKCZkZXYtPmNoYW5CKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKKwlpZih3b3JrPT01MDAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcnJ1cHQgamFtbWVkIC0gYWJvcnQoMHglWCkhXG4iLCBkZXYtPm5hbWUsIGludHIpOworCS8qIE9rIGFsbCBkb25lICovCisJbG9ja2VyPTA7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX2ludGVycnVwdCk7CisKK3N0YXRpYyBjaGFyIHJlZ19pbml0WzE2XT0KK3sKKwkwLDAsMCwwLAorCTAsMCwwLDAsCisJMCwwLDAsMCwKKwkweDU1LDAsMCwwCit9OworCisKKy8qKgorICoJejg1MzBfc3luY19vcGVuIC0gT3BlbiBhIFo4NTMwIGNoYW5uZWwgZm9yIFBJTworICoJQGRldjoJVGhlIG5ldHdvcmsgaW50ZXJmYWNlIHdlIGFyZSB1c2luZworICoJQGM6CVRoZSBaODUzMCBjaGFubmVsIHRvIG9wZW4gaW4gc3luY2hyb25vdXMgUElPIG1vZGUKKyAqCisgKglTd2l0Y2ggYSBaODUzMCBpbnRvIHN5bmNocm9ub3VzIG1vZGUgd2l0aG91dCBETUEgYXNzaXN0LiBXZQorICoJcmFpc2UgdGhlIFJUUy9EVFIgYW5kIGNvbW1lbmNlIG5ldHdvcmsgb3BlcmF0aW9uLgorICovCisgCitpbnQgejg1MzBfc3luY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBmbGFncyk7CisKKwljLT5zeW5jID0gMTsKKwljLT5tdHUgPSBkZXYtPm10dSs2NDsKKwljLT5jb3VudCA9IDA7CisJYy0+c2tiID0gTlVMTDsKKwljLT5za2IyID0gTlVMTDsKKwljLT5pcnFzID0gJno4NTMwX3N5bmM7CisKKwkvKiBUaGlzIGxvYWRzIHRoZSBkb3VibGUgYnVmZmVyIHVwICovCisJejg1MzBfcnhfZG9uZShjKTsJLyogTG9hZCB0aGUgZnJhbWUgcmluZyAqLworCXo4NTMwX3J4X2RvbmUoYyk7CS8qIExvYWQgdGhlIGJhY2t1cCBmcmFtZSAqLworCXo4NTMwX3J0c2R0cihjLDEpOworCWMtPmRtYV90eCA9IDA7CisJYy0+cmVnc1tSMV18PVR4SU5UX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM118UnhFTkFCTEUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zeW5jX29wZW4pOworCisvKioKKyAqCXo4NTMwX3N5bmNfY2xvc2UgLSBDbG9zZSBhIFBJTyBaODUzMCBjaGFubmVsCisgKglAZGV2OiBOZXR3b3JrIGRldmljZSB0byBjbG9zZQorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gZGlzYXNzb2NpYXRlIGFuZCBtb3ZlIHRvIGlkbGUKKyAqCisgKglDbG9zZSBkb3duIGEgWjg1MzAgaW50ZXJmYWNlIGFuZCBzd2l0Y2ggaXRzIGludGVycnVwdCBoYW5kbGVycworICoJdG8gZGlzY2FyZCBmdXR1cmUgZXZlbnRzLgorICovCisgCitpbnQgejg1MzBfc3luY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwl1OCBjaGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBmbGFncyk7CisJYy0+aXJxcyA9ICZ6ODUzMF9ub3A7CisJYy0+bWF4ID0gMDsKKwljLT5zeW5jID0gMDsKKwkKKwljaGs9cmVhZF96c3JlZyhjLFIwKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM10pOworCXo4NTMwX3J0c2R0cihjLDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luY19jbG9zZSk7CisKKy8qKgorICoJejg1MzBfc3luY19kbWFfb3BlbiAtIE9wZW4gYSBaODUzMCBmb3IgRE1BIEkvTworICoJQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRvIGF0dGFjaAorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsIHRvIGNvbmZpZ3VyZSBpbiBzeW5jIERNQSBtb2RlLgorICoKKyAqCVNldCB1cCBhIFo4NXgzMCBkZXZpY2UgZm9yIHN5bmNocm9ub3VzIERNQSBpbiBib3RoIGRpcmVjdGlvbnMuIFR3bworICoJSVNBIERNQSBjaGFubmVscyBtdXN0IGJlIGF2YWlsYWJsZSBmb3IgdGhpcyB0byB3b3JrLiBXZSBhc3N1bWUgSVNBCisgKglETUEgZHJpdmVuIEkvTyBhbmQgUEMgbGltaXRzIG9uIGFjY2Vzcy4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdW5zaWduZWQgbG9uZyBjZmxhZ3MsIGRmbGFnczsKKwkKKwljLT5zeW5jID0gMTsKKwljLT5tdHUgPSBkZXYtPm10dSs2NDsKKwljLT5jb3VudCA9IDA7CisJYy0+c2tiID0gTlVMTDsKKwljLT5za2IyID0gTlVMTDsKKwkvKgorCSAqCUxvYWQgdGhlIERNQSBpbnRlcmZhY2VzIHVwCisJICovCisJYy0+cnhkbWFfb24gPSAwOworCWMtPnR4ZG1hX29uID0gMDsKKwkKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBETUEgZmxpcCBidWZmZXJzLiBMaW1pdCBieSBwYWdlIHNpemUuCisJICoJRXZlcnlvbmUgcnVucyAxNTAwIG10dSBvciBsZXNzIG9uIHdhbiBsaW5rcyBzbyB0aGlzCisJICoJc2hvdWxkIGJlIGZpbmUuCisJICovCisJIAorCWlmKGMtPm10dSAgPiBQQUdFX1NJWkUvMikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwkgCisJYy0+cnhfYnVmWzBdPSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYoYy0+cnhfYnVmWzBdPT1OVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisJYy0+cnhfYnVmWzFdPWMtPnJ4X2J1ZlswXStQQUdFX1NJWkUvMjsKKwkKKwljLT50eF9kbWFfYnVmWzBdPSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYoYy0+dHhfZG1hX2J1ZlswXT09TlVMTCkKKwl7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljLT5yeF9idWZbMF0pOworCQljLT5yeF9idWZbMF09TlVMTDsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwljLT50eF9kbWFfYnVmWzFdPWMtPnR4X2RtYV9idWZbMF0rUEFHRV9TSVpFLzI7CisKKwljLT50eF9kbWFfdXNlZD0wOworCWMtPmRtYV90eCA9IDE7CisJYy0+ZG1hX251bT0wOworCWMtPmRtYV9yZWFkeT0xOworCQorCS8qCisJICoJRW5hYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKGMtPmxvY2ssIGNmbGFncyk7CisJIAorCS8qCisJICoJVFggRE1BIHZpYSBESVIvUkVRCisJICovCisJIAorCWMtPnJlZ3NbUjE0XXw9IERUUlJFUTsKKwl3cml0ZV96c3JlZyhjLCBSMTQsIGMtPnJlZ3NbUjE0XSk7ICAgICAKKworCWMtPnJlZ3NbUjFdJj0gflR4SU5UX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwkKKwkvKgorCSAqCVJYIERNQSB2aWEgVy9SZXEKKwkgKi8JIAorCisJYy0+cmVnc1tSMV18PSBXVF9GTl9SRFlGTjsKKwljLT5yZWdzW1IxXXw9IFdUX1JEWV9SVDsKKwljLT5yZWdzW1IxXXw9IElOVF9FUlJfUng7CisJYy0+cmVnc1tSMV0mPSB+VHhJTlRfRU5BQjsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCWMtPnJlZ3NbUjFdfD0gV1RfUkRZX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsgICAgICAgICAgICAKKwkKKwkvKgorCSAqCURNQSBpbnRlcnJ1cHRzCisJICovCisJIAorCS8qCisJICoJU2V0IHVwIHRoZSBETUEgY29uZmlndXJhdGlvbgorCSAqLwkKKwkgCisJZGZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJIAorCWRpc2FibGVfZG1hKGMtPnJ4ZG1hKTsKKwljbGVhcl9kbWFfZmYoYy0+cnhkbWEpOworCXNldF9kbWFfbW9kZShjLT5yeGRtYSwgRE1BX01PREVfUkVBRHwweDEwKTsKKwlzZXRfZG1hX2FkZHIoYy0+cnhkbWEsIHZpcnRfdG9fYnVzKGMtPnJ4X2J1ZlswXSkpOworCXNldF9kbWFfY291bnQoYy0+cnhkbWEsIGMtPm10dSk7CisJZW5hYmxlX2RtYShjLT5yeGRtYSk7CisKKwlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnR4ZG1hKTsKKwlzZXRfZG1hX21vZGUoYy0+dHhkbWEsIERNQV9NT0RFX1dSSVRFKTsKKwlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJCisJcmVsZWFzZV9kbWFfbG9jayhkZmxhZ3MpOworCQorCS8qCisJICoJU2VsZWN0IHRoZSBETUEgaW50ZXJydXB0IGhhbmRsZXJzCisJICovCisKKwljLT5yeGRtYV9vbiA9IDE7CisJYy0+dHhkbWFfb24gPSAxOworCWMtPnR4X2RtYV91c2VkID0gMTsKKwkgCisJYy0+aXJxcyA9ICZ6ODUzMF9kbWFfc3luYzsKKwl6ODUzMF9ydHNkdHIoYywxKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM118UnhFTkFCTEUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBjZmxhZ3MpOworCQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfZG1hX29wZW4pOworCisvKioKKyAqCXo4NTMwX3N5bmNfZG1hX2Nsb3NlIC0gQ2xvc2UgZG93biBETUEgSS9PCisgKglAZGV2OiBOZXR3b3JrIGRldmljZSB0byBkZXRhY2gKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIG1vdmUgaW50byBkaXNjYXJkIG1vZGUKKyAqCisgKglTaHV0IGRvd24gYSBETUEgbW9kZSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuIEhhbHQgdGhlIERNQSwgYW5kCisgKglmcmVlIHRoZSBidWZmZXJzLgorICovCisgCitpbnQgejg1MzBfc3luY19kbWFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdTggY2hrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJYy0+aXJxcyA9ICZ6ODUzMF9ub3A7CisJYy0+bWF4ID0gMDsKKwljLT5zeW5jID0gMDsKKwkKKwkvKgorCSAqCURpc2FibGUgdGhlIFBDIERNQSBjaGFubmVscworCSAqLworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7IAorCWRpc2FibGVfZG1hKGMtPnJ4ZG1hKTsKKwljbGVhcl9kbWFfZmYoYy0+cnhkbWEpOworCQorCWMtPnJ4ZG1hX29uID0gMDsKKwkKKwlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnR4ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwljLT50eGRtYV9vbiA9IDA7CisJYy0+dHhfZG1hX3VzZWQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKglEaXNhYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKwkgCisJYy0+cmVnc1tSMV0mPSB+V1RfUkRZX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsgICAgICAgICAgICAKKwljLT5yZWdzW1IxXSY9IH4oV1RfUkRZX1JUfFdUX0ZOX1JEWUZOfElOVF9FUlJfUngpOworCWMtPnJlZ3NbUjFdfD0gSU5UX0FMTF9SeDsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCWMtPnJlZ3NbUjE0XSY9IH5EVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgIAorCQorCWlmKGMtPnJ4X2J1ZlswXSkKKwl7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljLT5yeF9idWZbMF0pOworCQljLT5yeF9idWZbMF09TlVMTDsKKwl9CisJaWYoYy0+dHhfZG1hX2J1ZlswXSkKKwl7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgIGxvbmcpYy0+dHhfZG1hX2J1ZlswXSk7CisJCWMtPnR4X2RtYV9idWZbMF09TlVMTDsKKwl9CisJY2hrPXJlYWRfenNyZWcoYyxSMCk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdKTsKKwl6ODUzMF9ydHNkdHIoYywwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luY19kbWFfY2xvc2UpOworCisvKioKKyAqCXo4NTMwX3N5bmNfdHhkbWFfb3BlbiAtIE9wZW4gYSBaODUzMCBmb3IgVFggZHJpdmVuIERNQQorICoJQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRvIGF0dGFjaAorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsIHRvIGNvbmZpZ3VyZSBpbiBzeW5jIERNQSBtb2RlLgorICoKKyAqCVNldCB1cCBhIFo4NXgzMCBkZXZpY2UgZm9yIHN5bmNocm9ub3VzIERNQSB0cmFubWlzc2lvbi4gT25lCisgKglJU0EgRE1BIGNoYW5uZWwgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoaXMgdG8gd29yay4gVGhlIHJlY2VpdmUKKyAqCXNpZGUgaXMgcnVuIGluIFBJTyBtb2RlLCBidXQgdGhlbiBpdCBoYXMgdGhlIGJpZ2dlciBGSUZPLgorICovCisKK2ludCB6ODUzMF9zeW5jX3R4ZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdW5zaWduZWQgbG9uZyBjZmxhZ3MsIGRmbGFnczsKKworCXByaW50aygiT3BlbmluZyBzeW5jIGludGVyZmFjZSBmb3IgVFgtRE1BXG4iKTsKKwljLT5zeW5jID0gMTsKKwljLT5tdHUgPSBkZXYtPm10dSs2NDsKKwljLT5jb3VudCA9IDA7CisJYy0+c2tiID0gTlVMTDsKKwljLT5za2IyID0gTlVMTDsKKwkKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBETUEgZmxpcCBidWZmZXJzLiBMaW1pdCBieSBwYWdlIHNpemUuCisJICoJRXZlcnlvbmUgcnVucyAxNTAwIG10dSBvciBsZXNzIG9uIHdhbiBsaW5rcyBzbyB0aGlzCisJICoJc2hvdWxkIGJlIGZpbmUuCisJICovCisJIAorCWlmKGMtPm10dSAgPiBQQUdFX1NJWkUvMikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwkgCisJYy0+dHhfZG1hX2J1ZlswXT0odm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmKGMtPnR4X2RtYV9idWZbMF09PU5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWMtPnR4X2RtYV9idWZbMV0gPSBjLT50eF9kbWFfYnVmWzBdICsgUEFHRV9TSVpFLzI7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKGMtPmxvY2ssIGNmbGFncyk7CisKKwkvKgorCSAqCUxvYWQgdGhlIFBJTyByZWNlaXZlIHJpbmcKKwkgKi8KKworCXo4NTMwX3J4X2RvbmUoYyk7CisJejg1MzBfcnhfZG9uZShjKTsKKworIAkvKgorCSAqCUxvYWQgdGhlIERNQSBpbnRlcmZhY2VzIHVwCisJICovCisKKwljLT5yeGRtYV9vbiA9IDA7CisJYy0+dHhkbWFfb24gPSAwOworCQorCWMtPnR4X2RtYV91c2VkPTA7CisJYy0+ZG1hX251bT0wOworCWMtPmRtYV9yZWFkeT0xOworCWMtPmRtYV90eCA9IDE7CisKKyAJLyoKKwkgKglFbmFibGUgRE1BIGNvbnRyb2wgbW9kZQorCSAqLworCisgCS8qCisJICoJVFggRE1BIHZpYSBESVIvUkVRCisgCSAqLworCWMtPnJlZ3NbUjE0XXw9IERUUlJFUTsKKwl3cml0ZV96c3JlZyhjLCBSMTQsIGMtPnJlZ3NbUjE0XSk7ICAgICAKKwkKKwljLT5yZWdzW1IxXSY9IH5UeElOVF9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJCisJLyoKKwkgKglTZXQgdXAgdGhlIERNQSBjb25maWd1cmF0aW9uCisJICovCQorCSAKKwlkZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJc2V0X2RtYV9tb2RlKGMtPnR4ZG1hLCBETUFfTU9ERV9XUklURSk7CisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCisJcmVsZWFzZV9kbWFfbG9jayhkZmxhZ3MpOworCQorCS8qCisJICoJU2VsZWN0IHRoZSBETUEgaW50ZXJydXB0IGhhbmRsZXJzCisJICovCisKKwljLT5yeGRtYV9vbiA9IDA7CisJYy0+dHhkbWFfb24gPSAxOworCWMtPnR4X2RtYV91c2VkID0gMTsKKwkgCisJYy0+aXJxcyA9ICZ6ODUzMF90eGRtYV9zeW5jOworCXo4NTMwX3J0c2R0cihjLDEpOworCXdyaXRlX3pzcmVnKGMsIFIzLCBjLT5yZWdzW1IzXXxSeEVOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBjZmxhZ3MpOworCQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfdHhkbWFfb3Blbik7CisKKy8qKgorICoJejg1MzBfc3luY190eGRtYV9jbG9zZSAtIENsb3NlIGRvd24gYSBUWCBkcml2ZW4gRE1BIGNoYW5uZWwKKyAqCUBkZXY6IE5ldHdvcmsgZGV2aWNlIHRvIGRldGFjaAorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gbW92ZSBpbnRvIGRpc2NhcmQgbW9kZQorICoKKyAqCVNodXQgZG93biBhIERNQS9QSU8gc3BsaXQgbW9kZSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuIEhhbHQgdGhlIERNQSwgCisgKglhbmQgIGZyZWUgdGhlIGJ1ZmZlcnMuCisgKi8KKworaW50IHo4NTMwX3N5bmNfdHhkbWFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdW5zaWduZWQgbG9uZyBkZmxhZ3MsIGNmbGFnczsKKwl1OCBjaGs7CisKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBjZmxhZ3MpOworCQorCWMtPmlycXMgPSAmejg1MzBfbm9wOworCWMtPm1heCA9IDA7CisJYy0+c3luYyA9IDA7CisJCisJLyoKKwkgKglEaXNhYmxlIHRoZSBQQyBETUEgY2hhbm5lbHMKKwkgKi8KKwkgCisJZGZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKworCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKwljbGVhcl9kbWFfZmYoYy0+dHhkbWEpOworCWMtPnR4ZG1hX29uID0gMDsKKwljLT50eF9kbWFfdXNlZCA9IDA7CisKKwlyZWxlYXNlX2RtYV9sb2NrKGRmbGFncyk7CisKKwkvKgorCSAqCURpc2FibGUgRE1BIGNvbnRyb2wgbW9kZQorCSAqLworCSAKKwljLT5yZWdzW1IxXSY9IH5XVF9SRFlfRU5BQjsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOyAgICAgICAgICAgIAorCWMtPnJlZ3NbUjFdJj0gfihXVF9SRFlfUlR8V1RfRk5fUkRZRk58SU5UX0VSUl9SeCk7CisJYy0+cmVnc1tSMV18PSBJTlRfQUxMX1J4OworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJYy0+cmVnc1tSMTRdJj0gfkRUUlJFUTsKKwl3cml0ZV96c3JlZyhjLCBSMTQsIGMtPnJlZ3NbUjE0XSk7ICAgCisJCisJaWYoYy0+dHhfZG1hX2J1ZlswXSkKKwl7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljLT50eF9kbWFfYnVmWzBdKTsKKwkJYy0+dHhfZG1hX2J1ZlswXT1OVUxMOworCX0KKwljaGs9cmVhZF96c3JlZyhjLFIwKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM10pOworCXo4NTMwX3J0c2R0cihjLDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBjZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luY190eGRtYV9jbG9zZSk7CisKKworLyoKKyAqCU5hbWUgc3RyaW5ncyBmb3IgWjg1MzAgY2hpcHMuIFNHSSBjbGFpbSB0byBoYXZlIGEgMTMwLCBaaWxvZyBkZW55CisgKglpdCBleGlzdHMuLi4KKyAqLworIAorc3RhdGljIGNoYXIgKno4NTMwX3R5cGVfbmFtZVtdPXsKKwkiWjg1MzAiLAorCSJaODVDMzAiLAorCSJaODUyMzAiCit9OworCisvKioKKyAqCXo4NTMwX2Rlc2NyaWJlIC0gVW5pZm9ybWx5IGRlc2NyaWJlIGEgWjg1MzAgcG9ydAorICoJQGRldjogWjg1MzAgZGV2aWNlIHRvIGRlc2NyaWJlCisgKglAbWFwcGluZzogc3RyaW5nIGhvbGRpbmcgbWFwcGluZyB0eXBlIChlZyAiSS9PIiBvciAiTWVtIikKKyAqCUBpbzogdGhlIHBvcnQgdmFsdWUgaW4gcXVlc3Rpb24KKyAqCisgKglEZXNjcmliZSBhIFo4NTMwIGluIGEgc3RhbmRhcmQgZm9ybWF0LiBXZSBtdXN0IHBhc3MgdGhlIEkvTyBhcworICoJdGhlIHBvcnQgb2Zmc2V0IGlzbnQgcHJlZGljdGFibGUuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBmdW5jdGlvbgorICoJaXMgdG8gdHJ5IGFuZCBnZXQgYSBjb21tb24gZm9ybWF0IG9mIHJlcG9ydC4KKyAqLworCit2b2lkIHo4NTMwX2Rlc2NyaWJlKHN0cnVjdCB6ODUzMF9kZXYgKmRldiwgY2hhciAqbWFwcGluZywgdW5zaWduZWQgbG9uZyBpbykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZm91bmQgYXQgJXMgMHglbFgsIElSUSAlZC5cbiIsCisJCWRldi0+bmFtZSwgCisJCXo4NTMwX3R5cGVfbmFtZVtkZXYtPnR5cGVdLAorCQltYXBwaW5nLAorCQlaODUzMF9QT1JUX09GKGlvKSwKKwkJZGV2LT5pcnEpOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX2Rlc2NyaWJlKTsKKworLyoKKyAqCUxvY2tlZCBvcGVyYXRpb24gcGFydCBvZiB0aGUgejg1MzAgaW5pdCBjb2RlCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3o4NTMwX2luaXQoc3RydWN0IHo4NTMwX2RldiAqZGV2KQoreworCS8qIE5PUCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIGZpcnN0IC0gd2UgbWlnaHQgZ2V0IGEKKwkgICBmbG9hdGluZyBJUlEgdHJhbnNpdGlvbiB3aGVuIHdlIHJlc2V0IHRoZSBjaGlwICovCisJZGV2LT5jaGFuQS5pcnFzPSZ6ODUzMF9ub3A7CisJZGV2LT5jaGFuQi5pcnFzPSZ6ODUzMF9ub3A7CisJZGV2LT5jaGFuQS5kY2RjaGVjaz1EQ0Q7CisJZGV2LT5jaGFuQi5kY2RjaGVjaz1EQ0Q7CisKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCXdyaXRlX3pzcmVnKCZkZXYtPmNoYW5BLCBSOSwgMHhDMCk7CisJdWRlbGF5KDIwMCk7CisJLyogTm93IGNoZWNrIGl0cyB2YWxpZCAqLworCXdyaXRlX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIsIDB4QUEpOworCWlmKHJlYWRfenNyZWcoJmRldi0+Y2hhbkEsIFIxMikhPTB4QUEpCisJCXJldHVybiAtRU5PREVWOworCXdyaXRlX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIsIDB4NTUpOworCWlmKHJlYWRfenNyZWcoJmRldi0+Y2hhbkEsIFIxMikhPTB4NTUpCisJCXJldHVybiAtRU5PREVWOworCQkKKwlkZXYtPnR5cGU9Wjg1MzA7CisJCisJLyoKKwkgKglTZWUgdGhlIGFwcGxpY2F0aW9uIG5vdGUuCisJICovCisJIAorCXdyaXRlX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTUsIDB4MDEpOworCQorCS8qCisJICoJSWYgd2UgY2FuIHNldCB0aGUgbG93IGJpdCBvZiBSMTUgdGhlbgorCSAqCXRoZSBjaGlwIGlzIGVuaGFuY2VkLgorCSAqLworCSAKKwlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTUpPT0weDAxKQorCXsKKwkJLyogVGhpcyBDMzAgdmVyc3VzIDIzMCBkZXRlY3QgaXMgZnJvbSBLbGF1cyBLdWRpZWxrYSdzIGRtYXNjYyAqLworCQkvKiBQdXQgYSBjaGFyIGluIHRoZSBmaWZvICovCisJCXdyaXRlX3pzcmVnKCZkZXYtPmNoYW5BLCBSOCwgMCk7CisJCWlmKHJlYWRfenNyZWcoJmRldi0+Y2hhbkEsIFIwKSZUeF9CVUZfRU1QKQorCQkJZGV2LT50eXBlID0gWjg1MjMwOwkvKiBIYXMgYSBGSUZPICovCisJCWVsc2UKKwkJCWRldi0+dHlwZSA9IFo4NUMzMDsJLyogWjg1QzMwLCAxIGJ5dGUgRklGTyAqLworCX0KKwkJCisJLyoKKwkgKglUaGUgY29kZSBhc3N1bWVzIFI3JyBhbmQgZnJpZW5kcyBhcmUKKwkgKglvZmYuIFVzZSB3cml0ZV96c2V4dCgpIGZvciB0aGVzZSBhbmQga2VlcAorCSAqCXRoaXMgYml0IGNsZWFyLgorCSAqLworCSAKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjE1LCAwKTsKKwkJCisJLyoKKwkgKglBdCB0aGlzIHBvaW50IGl0IGxvb2tzIGxpa2UgdGhlIGNoaXAgaXMgYmVoYXZpbmcKKwkgKi8KKwkgCisJbWVtY3B5KGRldi0+Y2hhbkEucmVncywgcmVnX2luaXQsIDE2KTsKKwltZW1jcHkoZGV2LT5jaGFuQi5yZWdzLCByZWdfaW5pdCAsMTYpOworCQorCXJldHVybiAwOworfQorCisvKioKKyAqCXo4NTMwX2luaXQgLSBJbml0aWFsaXNlIGEgWjg1MzAgZGV2aWNlCisgKglAZGV2OiBaODUzMCBkZXZpY2UgdG8gaW5pdGlhbGlzZS4KKyAqCisgKglDb25maWd1cmUgdXAgYSBaODUzMC9aODVDMzAgb3IgWjg1MjMwIGNoaXAuIFdlIGNoZWNrIHRoZSBkZXZpY2UKKyAqCWlzIHByZXNlbnQsIGlkZW50aWZ5IHRoZSB0eXBlIGFuZCB0aGVuIHByb2dyYW0gaXQgdG8gaG9wZWZ1bGx5CisgKglrZWVwIHF1aXRlIGFuZCBiZWhhdmUuIFRoaXMgbWF0dGVycyBhIGxvdCwgYSBaODUzMCBpbiB0aGUgd3JvbmcKKyAqCXN0YXRlIHdpbGwgc29tZXRpbWVzIGdldCBpbnRvIHN0dXBpZCBtb2RlcyBnZW5lcmF0aW5nIDEwS2h6CisgKglpbnRlcnJ1cHQgc3RyZWFtcyBhbmQgdGhlIGxpa2UuCisgKgorICoJV2Ugc2V0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB1cCB0byBkaXNjYXJkIGFueSBldmVudHMsIGluIGNhc2UKKyAqCXdlIGdldCB0aGVtIGR1cmluZyByZXNldCBvciBzZXRwLgorICoKKyAqCVJldHVybiAwIGZvciBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRpbmcgdGhlIHByb2JsZW0KKyAqCWluIGVycm5vIGZvcm0uCisgKi8KKworaW50IHo4NTMwX2luaXQoc3RydWN0IHo4NTMwX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIFNldCB1cCB0aGUgY2hpcCBsZXZlbCBsb2NrICovCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CisJZGV2LT5jaGFuQS5sb2NrID0gJmRldi0+bG9jazsKKwlkZXYtPmNoYW5CLmxvY2sgPSAmZGV2LT5sb2NrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCXJldCA9IGRvX3o4NTMwX2luaXQoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9pbml0KTsKKworLyoqCisgKgl6ODUzMF9zaHV0ZG93biAtIFNodXRkb3duIGEgWjg1MzAgZGV2aWNlCisgKglAZGV2OiBUaGUgWjg1MzAgY2hpcCB0byBzaHV0ZG93bgorICoKKyAqCVdlIHNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIHRvIHNpbGVuY2UgYW55IGludGVycnVwdHMuIFdlIHRoZW4gCisgKglyZXNldCB0aGUgY2hpcCBhbmQgd2FpdCAxMDB1UyB0byBiZSBzdXJlIHRoZSByZXNldCBjb21wbGV0ZWQuIEp1c3QKKyAqCWluIGNhc2UgdGhlIGNhbGxlciB0aGVuIHRyaWVzIHRvIGRvIHN0dWZmLgorICoKKyAqCVRoaXMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGxvY2sgaGVsZAorICovCisgCitpbnQgejg1MzBfc2h1dGRvd24oc3RydWN0IHo4NTMwX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlkZXYtPmNoYW5BLmlycXM9Jno4NTMwX25vcDsKKwlkZXYtPmNoYW5CLmlycXM9Jno4NTMwX25vcDsKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjksIDB4QzApOworCS8qIFdlIG11c3QgbG9jayB0aGUgdWRlbGF5LCB0aGUgY2hpcCBpcyBvZmZsaW1pdHMgaGVyZSAqLworCXVkZWxheSgxMDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3NodXRkb3duKTsKKworLyoqCisgKgl6ODUzMF9jaGFubmVsX2xvYWQgLSBMb2FkIGNoYW5uZWwgZGF0YQorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gY29uZmlndXJlCisgKglAcnRhYmxlOiB0YWJsZSBvZiByZWdpc3RlciwgdmFsdWUgcGFpcnMKKyAqCUZJWE1FOiBpb2N0bCB0byBhbGxvdyB1c2VyIHVwbG9hZGVkIHRhYmxlcworICoKKyAqCUxvYWQgYSBaODUzMCBjaGFubmVsIHVwIGZyb20gdGhlIHN5c3RlbSBkYXRhLiBXZSB1c2UgKzE2IHRvIAorICoJaW5kaWNhdGUgdGhlICJwcmltZSIgcmVnaXN0ZXJzLiBUaGUgdmFsdWUgMjU1IHRlcm1pbmF0ZXMgdGhlCisgKgl0YWJsZS4KKyAqLworCitpbnQgejg1MzBfY2hhbm5lbF9sb2FkKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCB1OCAqcnRhYmxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSgqcnRhYmxlIT0yNTUpCisJeworCQlpbnQgcmVnPSpydGFibGUrKzsKKwkJaWYocmVnPjB4MEYpCisJCQl3cml0ZV96c3JlZyhjLCBSMTUsIGMtPnJlZ3NbMTVdfDEpOworCQl3cml0ZV96c3JlZyhjLCByZWcmMHgwRiwgKnJ0YWJsZSk7CisJCWlmKHJlZz4weDBGKQorCQkJd3JpdGVfenNyZWcoYywgUjE1LCBjLT5yZWdzWzE1XSZ+MSk7CisJCWMtPnJlZ3NbcmVnXT0qcnRhYmxlKys7CisJfQorCWMtPnJ4X2Z1bmN0aW9uPXo4NTMwX251bGxfcng7CisJYy0+c2tiPU5VTEw7CisJYy0+dHhfc2tiPU5VTEw7CisJYy0+dHhfbmV4dF9za2I9TlVMTDsKKwljLT5tdHU9MTUwMDsKKwljLT5tYXg9MDsKKwljLT5jb3VudD0wOworCWMtPnN0YXR1cz1yZWFkX3pzcmVnKGMsIFIwKTsKKwljLT5zeW5jPTE7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdfFJ4RU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX2NoYW5uZWxfbG9hZCk7CisKKworLyoqCisgKgl6ODUzMF90eF9iZWdpbiAtIEJlZ2luIHBhY2tldCB0cmFuc21pc3Npb24KKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBraWNrCisgKgorICoJVGhpcyBpcyB0aGUgc3BlZWQgc2Vuc2l0aXZlIHNpZGUgb2YgdHJhbnNtaXNzaW9uLiBJZiB3ZSBhcmUgY2FsbGVkCisgKglhbmQgbm8gYnVmZmVyIGlzIGJlaW5nIHRyYW5zbWl0dGVkIHdlIGNvbW1lbmNlIHRoZSBuZXh0IGJ1ZmZlci4gSWYKKyAqCW5vdGhpbmcgaXMgcXVldWVkIHdlIGlkbGUgdGhlIHN5bmMuIAorICoKKyAqCU5vdGU6IFdlIGFyZSBoYW5kbGluZyB0aGlzIGNvZGUgcGF0aCBpbiB0aGUgaW50ZXJydXB0IHBhdGgsIGtlZXAgaXQKKyAqCWZhc3Qgb3IgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbi4KKyAqCisgKglDYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3R4X2JlZ2luKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYoYy0+dHhfc2tiKQorCQlyZXR1cm47CisJCQorCWMtPnR4X3NrYj1jLT50eF9uZXh0X3NrYjsKKwljLT50eF9uZXh0X3NrYj1OVUxMOworCWMtPnR4X3B0cj1jLT50eF9uZXh0X3B0cjsKKwkKKwlpZihjLT50eF9za2I9PU5VTEwpCisJeworCQkvKiBJZGxlIG9uICovCisJCWlmKGMtPmRtYV90eCkKKwkJeworCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKwkJCS8qCisJCQkgKglDaGVjayBpZiB3ZSBjcmFwcGVkIG91dC4KKwkJCSAqLworCQkJaWYoZ2V0X2RtYV9yZXNpZHVlKGMtPnR4ZG1hKSkKKwkJCXsKKwkJCQljLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQkJYy0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQl9CisJCWMtPnR4Y291bnQ9MDsKKwl9CisJZWxzZQorCXsKKwkJYy0+dHhjb3VudD1jLT50eF9za2ItPmxlbjsKKwkJCisJCQorCQlpZihjLT5kbWFfdHgpCisJCXsKKwkJCS8qCisJCQkgKglGSVhNRS4gRE1BIGlzIGJyb2tlbiBmb3IgdGhlIG9yaWdpbmFsIDg1MzAsCisJCQkgKglvbiB0aGUgb2xkZXIgcGFydHMgd2UgbmVlZCB0byBzZXQgYSBmbGFnIGFuZAorCQkJICoJd2FpdCBmb3IgYSBmdXJ0aGVyIFRYIGludGVycnVwdCB0byBmaXJlIHRoaXMKKwkJCSAqCXN0YWdlIG9mZgkKKwkJCSAqLworCQkJIAorCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKworCQkJLyoKKwkJCSAqCVRoZXNlIHR3byBhcmUgbmVlZGVkIGJ5IHRoZSA4NTMwLzg1QzMwCisJCQkgKglhbmQgbXVzdCBiZSBpc3N1ZWQgd2hlbiBpZGxpbmcuCisJCQkgKi8KKwkJCSAKKwkJCWlmKGMtPmRldi0+dHlwZSE9Wjg1MjMwKQorCQkJeworCQkJCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfQ1JDKTsKKwkJCQl3cml0ZV96c2N0cmwoYywgUkVTX0VPTV9MKTsKKwkJCX0JCisJCQl3cml0ZV96c3JlZyhjLCBSMTAsIGMtPnJlZ3NbMTBdJn5BQlVOREVSKTsKKwkJCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJCQlzZXRfZG1hX2FkZHIoYy0+dHhkbWEsIHZpcnRfdG9fYnVzKGMtPnR4X3B0cikpOworCQkJc2V0X2RtYV9jb3VudChjLT50eGRtYSwgYy0+dHhjb3VudCk7CisJCQllbmFibGVfZG1hKGMtPnR4ZG1hKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkJd3JpdGVfenNjdHJsKGMsIFJFU19FT01fTCk7CisJCQl3cml0ZV96c3JlZyhjLCBSNSwgYy0+cmVnc1tSNV18VHhFTkFCKTsKKwkJfQorCQllbHNlCisJCXsKKworCQkJLyogQUJVTkRFUiBvZmYgKi8KKwkJCXdyaXRlX3pzcmVnKGMsIFIxMCwgYy0+cmVnc1sxMF0pOworCQkJd3JpdGVfenNjdHJsKGMsIFJFU19UeF9DUkMpOworCQorCQkJd2hpbGUoYy0+dHhjb3VudCAmJiAocmVhZF96c3JlZyhjLFIwKSZUeF9CVUZfRU1QKSkKKwkJCXsJCQorCQkJCXdyaXRlX3pzcmVnKGMsIFI4LCAqYy0+dHhfcHRyKyspOworCQkJCWMtPnR4Y291bnQtLTsKKwkJCX0KKworCQl9CisJfQorCS8qCisJICoJU2luY2Ugd2UgZW1wdGllZCB0eF9za2Igd2UgY2FuIGFzayBmb3IgbW9yZQorCSAqLworCW5ldGlmX3dha2VfcXVldWUoYy0+bmV0ZGV2aWNlKTsKK30KKworLyoqCisgKgl6ODUzMF90eF9kb25lIC0gVFggY29tcGxldGUgY2FsbGJhY2sKKyAqCUBjOiBUaGUgY2hhbm5lbCB0aGF0IGNvbXBsZXRlZCBhIHRyYW5zbWl0LgorICoKKyAqCVRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgY29tcGxldGUgYSBwYWNrZXQgc2VuZC4gV2Ugd2FrZSB0aGUgcXVldWUsCisgKglzdGFydCB0aGUgbmV4dCBwYWNrZXQgZ29pbmcgYW5kIHRoZW4gZnJlZSB0aGUgYnVmZmVyIG9mIHRoZSBleGlzdGluZworICoJcGFja2V0LiBUaGlzIGNvZGUgaXMgZmFpcmx5IHRpbWluZyBzZW5zaXRpdmUuCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIHJlZ2lzdGVyIGxvY2sgaGVsZC4KKyAqLyAKKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3R4X2RvbmUoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIEFjdHVhbGx5IHRoaXMgY2FuIGhhcHBlbi4qLworCWlmKGMtPnR4X3NrYj09TlVMTCkKKwkJcmV0dXJuOworCisJc2tiPWMtPnR4X3NrYjsKKwljLT50eF9za2I9TlVMTDsKKwl6ODUzMF90eF9iZWdpbihjKTsKKwljLT5zdGF0cy50eF9wYWNrZXRzKys7CisJYy0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Cit9CisKKy8qKgorICoJejg1MzBfbnVsbF9yeCAtIERpc2NhcmQgYSBwYWNrZXQKKyAqCUBjOiBUaGUgY2hhbm5lbCB0aGUgcGFja2V0IGFycml2ZWQgb24KKyAqCUBza2I6IFRoZSBidWZmZXIKKyAqCisgKglXZSBwb2ludCB0aGUgcmVjZWl2ZSBoYW5kbGVyIGF0IHRoaXMgZnVuY3Rpb24gd2hlbiBpZGxlLiBJbnN0ZWFkCisgKglvZiBzeW5jcHBwIHByb2Nlc3NpbmcgdGhlIGZyYW1lcyB3ZSBnZXQgdG8gdGhyb3cgdGhlbSBhd2F5LgorICovCisgCit2b2lkIHo4NTMwX251bGxfcngoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9udWxsX3J4KTsKKworLyoqCisgKgl6ODUzMF9yeF9kb25lIC0gUmVjZWl2ZSBjb21wbGV0aW9uIGNhbGxiYWNrCisgKglAYzogVGhlIGNoYW5uZWwgdGhhdCBjb21wbGV0ZWQgYSByZWNlaXZlCisgKgorICoJQSBuZXcgcGFja2V0IGlzIGNvbXBsZXRlLiBPdXIgZ29hbCBoZXJlIGlzIHRvIGdldCBiYWNrIGludG8gcmVjZWl2ZQorICoJbW9kZSBhcyBmYXN0IGFzIHBvc3NpYmxlLiBPbiB0aGUgWjg1MjMwIHdlIGNvdWxkIGNoYW5nZSB0byB1c2luZworICoJRVNDQyBtb2RlLCBidXQgb24gdGhlIG9sZGVyIGNoaXBzIHdlIGhhdmUgbm8gY2hvaWNlLiBXZSBmbGlwIHRvIHRoZQorICoJbmV3IGJ1ZmZlciBpbW1lZGlhdGVseSBpbiBETUEgbW9kZSBzbyB0aGF0IHRoZSBETUEgb2YgdGhlIG5leHQKKyAqCWZyYW1lIGNhbiBvY2N1ciB3aGlsZSB3ZSBhcmUgY29weWluZyB0aGUgcHJldmlvdXMgYnVmZmVyIHRvIGFuIHNrX2J1ZmYKKyAqCisgKglDYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3J4X2RvbmUoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY3Q7CisJCisJLyoKKwkgKglJcyBvdXIgcmVjZWl2ZSBlbmdpbmUgaW4gRE1BIG1vZGUKKwkgKi8KKwkgCisJaWYoYy0+cnhkbWFfb24pCisJeworCQkvKgorCQkgKglTYXZlIHRoZSByZWFkeSBzdGF0ZSBhbmQgdGhlIGJ1ZmZlciBjdXJyZW50bHkKKwkJICoJYmVpbmcgdXNlZCBhcyB0aGUgRE1BIHRhcmdldAorCQkgKi8KKwkJIAorCQlpbnQgcmVhZHk9Yy0+ZG1hX3JlYWR5OworCQl1bnNpZ25lZCBjaGFyICpyeGI9Yy0+cnhfYnVmW2MtPmRtYV9udW1dOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkKKwkJLyoKKwkJICoJQ29tcGxldGUgdGhpcyBETUEuIE5lY2Nlc3NhcnkgdG8gZmluZCB0aGUgbGVuZ3RoCisJCSAqLwkJCisJCSAKKwkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCisJCWRpc2FibGVfZG1hKGMtPnJ4ZG1hKTsKKwkJY2xlYXJfZG1hX2ZmKGMtPnJ4ZG1hKTsKKwkJYy0+cnhkbWFfb249MDsKKwkJY3Q9Yy0+bXR1LWdldF9kbWFfcmVzaWR1ZShjLT5yeGRtYSk7CisJCWlmKGN0PDApCisJCQljdD0yOwkvKiBTaGl0IGhhcHBlbnMuLiAqLworCQljLT5kbWFfcmVhZHk9MDsKKwkJCisJCS8qCisJCSAqCU5vcm1hbCBjYXNlOiB0aGUgb3RoZXIgc2xvdCBpcyBmcmVlLCBzdGFydCB0aGUgbmV4dCBETUEKKwkJICoJaW50byBpdCBpbW1lZGlhdGVseS4KKwkJICovCisJCSAKKwkJaWYocmVhZHkpCisJCXsKKwkJCWMtPmRtYV9udW1ePTE7CisJCQlzZXRfZG1hX21vZGUoYy0+cnhkbWEsIERNQV9NT0RFX1JFQUR8MHgxMCk7CisJCQlzZXRfZG1hX2FkZHIoYy0+cnhkbWEsIHZpcnRfdG9fYnVzKGMtPnJ4X2J1ZltjLT5kbWFfbnVtXSkpOworCQkJc2V0X2RtYV9jb3VudChjLT5yeGRtYSwgYy0+bXR1KTsKKwkJCWMtPnJ4ZG1hX29uID0gMTsKKwkJCWVuYWJsZV9kbWEoYy0+cnhkbWEpOworCQkJLyogU3RvcCBhbnkgZnJhbWVzIHRoYXQgd2UgbWlzc2VkIHRoZSBoZWFkIG9mIAorCQkJICAgZnJvbSBwYXNzaW5nICovCisJCQl3cml0ZV96c3JlZyhjLCBSMCwgUkVTX1J4X0NSQyk7CisJCX0KKwkJZWxzZQorCQkJLyogQ2FuJ3Qgb2NjdXIgYXMgd2UgZG9udCByZWVuYWJsZSB0aGUgRE1BIGlycSB1bnRpbAorCQkJICAgYWZ0ZXIgdGhlIGZsaXAgaXMgZG9uZSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERNQSBmbGlwIG92ZXJydW4hXG4iLCBjLT5uZXRkZXZpY2UtPm5hbWUpOworCQkJCisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkKKwkJLyoKKwkJICoJU2hvdmUgdGhlIG9sZCBidWZmZXIgaW50byBhbiBza19idWZmLiBXZSBjYW4ndCBETUEKKwkJICoJZGlyZWN0bHkgaW50byBvbmUgb24gYSBQQyAtIGl0IG1pZ2h0IGJlIGFib3ZlIHRoZSAxNk1iCisJCSAqCWJvdW5kYXJ5LiBPcHRpbWlzYXRpb24gLSB3ZSBjb3VsZCBjaGVjayB0byBzZWUgaWYgd2UKKwkJICoJY2FuIGF2b2lkIHRoZSBjb3B5LiBPcHRpbWlzYXRpb24gMiAtIG1ha2UgdGhlIG1lbWNweQorCQkgKglhIGNvcHljaGVja3N1bS4KKwkJICovCisJCSAKKwkJc2tiPWRldl9hbGxvY19za2IoY3QpOworCQlpZihza2I9PU5VTEwpCisJCXsKKwkJCWMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZS5cbiIsIGMtPm5ldGRldmljZS0+bmFtZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlza2JfcHV0KHNrYiwgY3QpOworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcnhiLCBjdCk7CisJCQljLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQljLT5zdGF0cy5yeF9ieXRlcys9Y3Q7CisJCX0KKwkJYy0+ZG1hX3JlYWR5PTE7CisJfQorCWVsc2UKKwl7CisJCVJUX0xPQ0s7CQorCQlza2I9Yy0+c2tiOworCQkKKwkJLyoKKwkJICoJVGhlIGdhbWUgd2UgcGxheSBmb3Igbm9uIERNQSBpcyBzaW1pbGFyLiBXZSB3YW50IHRvCisJCSAqCWdldCB0aGUgY29udHJvbGxlciBzZXQgdXAgZm9yIHRoZSBuZXh0IHBhY2tldCBhcyBmYXN0CisJCSAqCWFzIHBvc3NpYmxlLiBXZSBwb3RlbnRpYWxseSBvbmx5IGhhdmUgb25lIGJ5dGUgKyB0aGUKKwkJICoJZmlmbyBsZW5ndGggZm9yIHRoaXMuIFRodXMgd2Ugd2FudCB0byBmbGlwIHRvIHRoZSBuZXcKKwkJICoJYnVmZmVyIGFuZCB0aGVuIG1lc3MgYXJvdW5kIGNvcHlpbmcgYW5kIGFsbG9jYXRpbmcKKwkJICoJdGhpbmdzLiBGb3IgdGhlIGN1cnJlbnQgY2FzZSBpdCBkb2Vzbid0IG1hdHRlciBidXQKKwkJICoJaWYgeW91IGJ1aWxkIGEgc3lzdGVtIHdoZXJlIHRoZSBzeW5jIGlycSBpc250IGJsb2NrZWQKKwkJICoJYnkgdGhlIGtlcm5lbCBJUlEgZGlzYWJsZSB0aGVuIHlvdSBuZWVkIG9ubHkgYmxvY2sgdGhlCisJCSAqCXN5bmMgSVJRIGZvciB0aGUgUlRfTE9DSyBhcmVhLgorCQkgKgkKKwkJICovCisJCWN0PWMtPmNvdW50OworCQkKKwkJYy0+c2tiID0gYy0+c2tiMjsKKwkJYy0+Y291bnQgPSAwOworCQljLT5tYXggPSBjLT5tdHU7CisJCWlmKGMtPnNrYikKKwkJeworCQkJYy0+ZHB0ciA9IGMtPnNrYi0+ZGF0YTsKKwkJCWMtPm1heCA9IGMtPm10dTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWMtPmNvdW50PSAwOworCQkJYy0+bWF4ID0gMDsKKwkJfQorCQlSVF9VTkxPQ0s7CisKKwkJYy0+c2tiMiA9IGRldl9hbGxvY19za2IoYy0+bXR1KTsKKwkJaWYoYy0+c2tiMj09TlVMTCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZS5cbiIsCisJCQkJYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJZWxzZQorCQl7CisJCQlza2JfcHV0KGMtPnNrYjIsYy0+bXR1KTsKKwkJfQorCQljLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWMtPnN0YXRzLnJ4X2J5dGVzKz1jdDsKKwkJCisJfQorCS8qCisJICoJSWYgd2UgcmVjZWl2ZWQgYSBmcmFtZSB3ZSBtdXN0IG5vdyBwcm9jZXNzIGl0LgorCSAqLworCWlmKHNrYikKKwl7CisJCXNrYl90cmltKHNrYiwgY3QpOworCQljLT5yeF9mdW5jdGlvbihjLHNrYik7CisJfQorCWVsc2UKKwl7CisJCWMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTG9zdCBhIGZyYW1lXG4iLCBjLT5uZXRkZXZpY2UtPm5hbWUpOworCX0KK30KKworLyoqCisgKglzcGFuc19ib3VuZGFyeSAtIENoZWNrIGEgcGFja2V0IGNhbiBiZSBJU0EgRE1BJ2QKKyAqCUBza2I6IFRoZSBidWZmZXIgdG8gY2hlY2sKKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciBjcm9zcyBhIERNQSBib3VuZGFyeSBvbiBhIFBDLiBUaGUgcG9vcgorICoJdGhpbmcgY2FuIG9ubHkgRE1BIHdpdGhpbiBhIDY0SyBibG9jayBub3QgYWNyb3NzIHRoZSBlZGdlcyBvZiBpdC4KKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgc3BhbnNfYm91bmRhcnkoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBsb25nIGE9KHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhOworCWFePShhK3NrYi0+bGVuKTsKKwlpZihhJjB4MDAwMTAwMDApCS8qIElmIHRoZSA2NEsgYml0IGlzIGRpZmZlcmVudC4uICovCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKioKKyAqCXo4NTMwX3F1ZXVlX3htaXQgLSBRdWV1ZSBhIHBhY2tldAorICoJQGM6IFRoZSBjaGFubmVsIHRvIHVzZQorICoJQHNrYjogVGhlIHBhY2tldCB0byBraWNrIGRvd24gdGhlIGNoYW5uZWwKKyAqCisgKglRdWV1ZSBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uLiBCZWNhdXNlIHdlIGhhdmUgcmF0aGVyCisgKgloYXJkIHRvIGhpdCBpbnRlcnJ1cHQgbGF0ZW5jaWVzIGZvciB0aGUgWjg1MjMwIHBlciBwYWNrZXQgCisgKglldmVuIGluIERNQSBtb2RlIHdlIGRvIHRoZSBmbGlwIHRvIERNQSBidWZmZXIgaWYgbmVlZGVkIGhlcmUKKyAqCW5vdCBpbiB0aGUgSVJRLgorICoKKyAqCUNhbGxlZCBmcm9tIHRoZSBuZXR3b3JrIGNvZGUuIFRoZSBsb2NrIGlzIG5vdCBoZWxkIGF0IHRoaXMgCisgKglwb2ludC4KKyAqLworCitpbnQgejg1MzBfcXVldWVfeG1pdChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCW5ldGlmX3N0b3BfcXVldWUoYy0+bmV0ZGV2aWNlKTsKKwlpZihjLT50eF9uZXh0X3NrYikKKwl7CisJCXJldHVybiAxOworCX0KKwkKKwkvKiBQQyBTUEVDSUZJQyAtIERNQSBsaW1pdHMgKi8KKwkKKwkvKgorCSAqCUlmIHdlIHdpbGwgRE1BIHRoZSB0cmFuc21pdCBhbmQgaXRzIGdvbmUgb3ZlciB0aGUgSVNBIGJ1cworCSAqCWxpbWl0LCB0aGVuIGNvcHkgdG8gdGhlIGZsaXAgYnVmZmVyCisJICovCisJIAorCWlmKGMtPmRtYV90eCAmJiAoKHVuc2lnbmVkIGxvbmcpKHZpcnRfdG9fYnVzKHNrYi0+ZGF0YStza2ItPmxlbikpPj0xNioxMDI0KjEwMjQgfHwgc3BhbnNfYm91bmRhcnkoc2tiKSkpCisJeworCQkvKiAKKwkJICoJU2VuZCB0aGUgZmxpcCBidWZmZXIsIGFuZCBmbGlwIHRoZSBmbGlwcHkgYml0LgorCQkgKglXZSBkb24ndCBjYXJlIHdoaWNoIGlzIHVzZWQgd2hlbiBqdXN0IHNvIGxvbmcgYXMKKwkJICoJd2UgbmV2ZXIgdXNlIHRoZSBzYW1lIGJ1ZmZlciB0d2ljZSBpbiBhIHJvdy4gU2luY2UKKwkJICoJb25seSBvbmUgYnVmZmVyIGNhbiBiZSBnb2luZyBvdXQgYXQgYSB0aW1lIHRoZSBvdGhlcgorCQkgKgloYXMgdG8gYmUgc2FmZS4KKwkJICovCisJCWMtPnR4X25leHRfcHRyPWMtPnR4X2RtYV9idWZbYy0+dHhfZG1hX3VzZWRdOworCQljLT50eF9kbWFfdXNlZF49MTsJLyogRmxpcCB0ZW1wIGJ1ZmZlciAqLworCQltZW1jcHkoYy0+dHhfbmV4dF9wdHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCX0KKwllbHNlCisJCWMtPnR4X25leHRfcHRyPXNrYi0+ZGF0YTsJCisJUlRfTE9DSzsKKwljLT50eF9uZXh0X3NrYj1za2I7CisJUlRfVU5MT0NLOworCQorCXNwaW5fbG9ja19pcnFzYXZlKGMtPmxvY2ssIGZsYWdzKTsKKwl6ODUzMF90eF9iZWdpbihjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGMtPmxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9xdWV1ZV94bWl0KTsKKworLyoqCisgKgl6ODUzMF9nZXRfc3RhdHMgLSBHZXQgbmV0d29yayBzdGF0aXN0aWNzCisgKglAYzogVGhlIGNoYW5uZWwgdG8gdXNlCisgKgorICoJR2V0IHRoZSBzdGF0aXN0aWNzIGJsb2NrLiBXZSBrZWVwIHRoZSBzdGF0aXN0aWNzIGluIHNvZnR3YXJlIGFzCisgKgl0aGUgY2hpcCBkb2Vzbid0IGRvIGl0IGZvciB1cy4KKyAqCisgKglMb2NraW5nIGlzIGlnbm9yZWQgaGVyZSAtIHdlIGNvdWxkIGxvY2sgZm9yIGEgY29weSBidXQgaXRzCisgKglub3QgbGlrZWx5IHRvIGJlIHRoYXQgYmlnIGFuIGlzc3VlCisgKi8KKyAKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp6ODUzMF9nZXRfc3RhdHMoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJcmV0dXJuICZjLT5zdGF0czsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9nZXRfc3RhdHMpOworCisvKgorICoJTW9kdWxlIHN1cHBvcnQKKyAqLworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiR2VuZXJpYyBaODVDMzAvWjg1MjMwIGludGVyZmFjZSBkcml2ZXIgdjAuMDJcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHo4NTIzMF9pbml0X2RyaXZlcih2b2lkKQoreworCXByaW50ayhiYW5uZXIpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoejg1MjMwX2luaXRfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IHo4NTIzMF9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworfQorbW9kdWxlX2V4aXQoejg1MjMwX2NsZWFudXBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlo4NXgzMCBzeW5jaHJvbm91cyBkcml2ZXIgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTUzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKglEZXNjcmlwdGlvbiBvZiBaODUzMCBaODVDMzAgYW5kIFo4NTIzMCBjb21tdW5pY2F0aW9ucyBjaGlwcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaWZuZGVmIF9aODUzMF9ICisjZGVmaW5lIF9aODUzMF9ICisKKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworLyogQ29udmVyc2lvbiByb3V0aW5lcyB0by9mcm9tIGJyZyB0aW1lIGNvbnN0YW50cyBmcm9tL3RvIGJpdHMKKyAqIHBlciBzZWNvbmQuCisgKi8KKyNkZWZpbmUgQlJHX1RPX0JQUyhicmcsIGZyZXEpICgoZnJlcSkgLyAyIC8gKChicmcpICsgMikpCisjZGVmaW5lIEJQU19UT19CUkcoYnBzLCBmcmVxKSAoKCgoZnJlcSkgKyAoYnBzKSkgLyAoMiAqIChicHMpKSkgLSAyKQorCisvKiBUaGUgWmlsb2cgcmVnaXN0ZXIgc2V0ICovCisKKyNkZWZpbmUJRkxBRwkweDdlCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJUjAJMAkJLyogUmVnaXN0ZXIgc2VsZWN0cyAqLworI2RlZmluZQlSMQkxCisjZGVmaW5lCVIyCTIKKyNkZWZpbmUJUjMJMworI2RlZmluZQlSNAk0CisjZGVmaW5lCVI1CTUKKyNkZWZpbmUJUjYJNgorI2RlZmluZQlSNwk3CisjZGVmaW5lCVI4CTgKKyNkZWZpbmUJUjkJOQorI2RlZmluZQlSMTAJMTAKKyNkZWZpbmUJUjExCTExCisjZGVmaW5lCVIxMgkxMgorI2RlZmluZQlSMTMJMTMKKyNkZWZpbmUJUjE0CTE0CisjZGVmaW5lCVIxNQkxNQorCisjZGVmaW5lIFJQUklNRQkxNgkJLyogSW5kaWNhdGUgYSBwcmltZSByZWdpc3RlciBhY2Nlc3Mgb24gMjMwICovCisKKyNkZWZpbmUJTlVMTENPREUJMAkvKiBOdWxsIENvZGUgKi8KKyNkZWZpbmUJUE9JTlRfSElHSAkweDgJLyogU2VsZWN0IHVwcGVyIGhhbGYgb2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCVJFU19FWFRfSU5UCTB4MTAJLyogUmVzZXQgRXh0LiBTdGF0dXMgSW50ZXJydXB0cyAqLworI2RlZmluZQlTRU5EX0FCT1JUCTB4MTgJLyogSERMQyBBYm9ydCAqLworI2RlZmluZQlSRVNfUnhJTlRfRkMJMHgyMAkvKiBSZXNldCBSeElOVCBvbiBGaXJzdCBDaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUkVTX1R4X1AJMHgyOAkvKiBSZXNldCBUeElOVCBQZW5kaW5nICovCisjZGVmaW5lCUVSUl9SRVMJCTB4MzAJLyogRXJyb3IgUmVzZXQgKi8KKyNkZWZpbmUJUkVTX0hfSVVTCTB4MzgJLyogUmVzZXQgaGlnaGVzdCBJVVMgKi8KKworI2RlZmluZQlSRVNfUnhfQ1JDCTB4NDAJLyogUmVzZXQgUnggQ1JDIENoZWNrZXIgKi8KKyNkZWZpbmUJUkVTX1R4X0NSQwkweDgwCS8qIFJlc2V0IFR4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19FT01fTAkweEMwCS8qIFJlc2V0IEVPTSBsYXRjaCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJRVhUX0lOVF9FTkFCCTB4MQkvKiBFeHQgSW50IEVuYWJsZSAqLworI2RlZmluZQlUeElOVF9FTkFCCTB4MgkvKiBUeCBJbnQgRW5hYmxlICovCisjZGVmaW5lCVBBUl9TUEVDCTB4NAkvKiBQYXJpdHkgaXMgc3BlY2lhbCBjb25kaXRpb24gKi8KKworI2RlZmluZQlSeElOVF9ESVNBQgkwCS8qIFJ4IEludCBEaXNhYmxlICovCisjZGVmaW5lCVJ4SU5UX0ZDRVJSCTB4OAkvKiBSeCBJbnQgb24gRmlyc3QgQ2hhcmFjdGVyIE9ubHkgb3IgRXJyb3IgKi8KKyNkZWZpbmUJSU5UX0FMTF9SeAkweDEwCS8qIEludCBvbiBhbGwgUnggQ2hhcmFjdGVycyBvciBlcnJvciAqLworI2RlZmluZQlJTlRfRVJSX1J4CTB4MTgJLyogSW50IG9uIGVycm9yIG9ubHkgKi8KKworI2RlZmluZQlXVF9SRFlfUlQJMHgyMAkvKiBXYWl0L1JlYWR5IG9uIFIvVCAqLworI2RlZmluZQlXVF9GTl9SRFlGTgkweDQwCS8qIFdhaXQvRk4vUmVhZHkgRk4gKi8KKyNkZWZpbmUJV1RfUkRZX0VOQUIJMHg4MAkvKiBXYWl0L1JlYWR5IEVuYWJsZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAjMiAoSW50ZXJydXB0IFZlY3RvcikgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMyAqLworCisjZGVmaW5lCVJ4RU5BQkxFCTB4MQkvKiBSeCBFbmFibGUgKi8KKyNkZWZpbmUJU1lOQ19MX0lOSAkweDIJLyogU3luYyBDaGFyYWN0ZXIgTG9hZCBJbmhpYml0ICovCisjZGVmaW5lCUFERF9TTQkJMHg0CS8qIEFkZHJlc3MgU2VhcmNoIE1vZGUgKFNETEMpICovCisjZGVmaW5lCVJ4Q1JDX0VOQUIJMHg4CS8qIFJ4IENSQyBFbmFibGUgKi8KKyNkZWZpbmUJRU5UX0hNCQkweDEwCS8qIEVudGVyIEh1bnQgTW9kZSAqLworI2RlZmluZQlBVVRPX0VOQUIJMHgyMAkvKiBBdXRvIEVuYWJsZXMgKi8KKyNkZWZpbmUJUng1CQkweDAJLyogUnggNSBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDcJCTB4NDAJLyogUnggNyBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDYJCTB4ODAJLyogUnggNiBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDgJCTB4YzAJLyogUnggOCBCaXRzL0NoYXJhY3RlciAqLworCisvKiBXcml0ZSBSZWdpc3RlciA0ICovCisKKyNkZWZpbmUJUEFSX0VOQQkJMHgxCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUJUEFSX0VWRU4JMHgyCS8qIFBhcml0eSBFdmVuL09kZCogKi8KKworI2RlZmluZQlTWU5DX0VOQUIJMAkvKiBTeW5jIE1vZGVzIEVuYWJsZSAqLworI2RlZmluZQlTQjEJCTB4NAkvKiAxIHN0b3AgYml0L2NoYXIgKi8KKyNkZWZpbmUJU0IxNQkJMHg4CS8qIDEuNSBzdG9wIGJpdHMvY2hhciAqLworI2RlZmluZQlTQjIJCTB4YwkvKiAyIHN0b3AgYml0cy9jaGFyICovCisKKyNkZWZpbmUJTU9OU1lOQwkJMAkvKiA4IEJpdCBTeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlCSVNZTkMJCTB4MTAJLyogMTYgYml0IHN5bmMgY2hhcmFjdGVyICovCisjZGVmaW5lCVNETEMJCTB4MjAJLyogU0RMQyBNb2RlICgwMTExMTExMCBTeW5jIEZsYWcpICovCisjZGVmaW5lCUVYVFNZTkMJCTB4MzAJLyogRXh0ZXJuYWwgU3luYyBNb2RlICovCisKKyNkZWZpbmUJWDFDTEsJCTB4MAkvKiB4MSBjbG9jayBtb2RlICovCisjZGVmaW5lCVgxNkNMSwkJMHg0MAkvKiB4MTYgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMzJDTEsJCTB4ODAJLyogeDMyIGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDY0Q0xLCQkweEMwCS8qIHg2NCBjbG9jayBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDUgKi8KKworI2RlZmluZQlUeENSQ19FTkFCCTB4MQkvKiBUeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCVJUUwkJMHgyCS8qIFJUUyAqLworI2RlZmluZQlTRExDX0NSQwkweDQJLyogU0RMQy9DUkMtMTYgKi8KKyNkZWZpbmUJVHhFTkFCCQkweDgJLyogVHggRW5hYmxlICovCisjZGVmaW5lCVNORF9CUksJCTB4MTAJLyogU2VuZCBCcmVhayAqLworI2RlZmluZQlUeDUJCTB4MAkvKiBUeCA1IGJpdHMgKG9yIGxlc3MpL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDcJCTB4MjAJLyogVHggNyBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDYJCTB4NDAJLyogVHggNiBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDgJCTB4NjAJLyogVHggOCBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlEVFIJCTB4ODAJLyogRFRSICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDYgKFN5bmMgYml0cyAwLTcvU0RMQyBBZGRyZXNzIEZpZWxkKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA3IChTeW5jIGJpdHMgOC0xNS9TRExDIDAxMTExMTEwKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA4ICh0cmFuc21pdCBidWZmZXIpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDkgKE1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCkgKi8KKyNkZWZpbmUJVklTCTEJLyogVmVjdG9yIEluY2x1ZGVzIFN0YXR1cyAqLworI2RlZmluZQlOVgkyCS8qIE5vIFZlY3RvciAqLworI2RlZmluZQlETEMJNAkvKiBEaXNhYmxlIExvd2VyIENoYWluICovCisjZGVmaW5lCU1JRQk4CS8qIE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVNUQVRISQkweDEwCS8qIFN0YXR1cyBoaWdoICovCisjZGVmaW5lCU5PUkVTRVQJMAkvKiBObyByZXNldCBvbiB3cml0ZSB0byBSOSAqLworI2RlZmluZQlDSFJCCTB4NDAJLyogUmVzZXQgY2hhbm5lbCBCICovCisjZGVmaW5lCUNIUkEJMHg4MAkvKiBSZXNldCBjaGFubmVsIEEgKi8KKyNkZWZpbmUJRkhXUkVTCTB4YzAJLyogRm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTAgKG1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCSVQ2CTEJLyogNiBiaXQvOGJpdCBzeW5jICovCisjZGVmaW5lCUxPT1BNT0RFIDIJLyogU0RMQyBMb29wIG1vZGUgKi8KKyNkZWZpbmUJQUJVTkRFUgk0CS8qIEFib3J0L2ZsYWcgb24gU0RMQyB4bWl0IHVuZGVycnVuICovCisjZGVmaW5lCU1BUktJRExFIDgJLyogTWFyay9mbGFnIG9uIGlkbGUgKi8KKyNkZWZpbmUJR0FPUAkweDEwCS8qIEdvIGFjdGl2ZSBvbiBwb2xsICovCisjZGVmaW5lCU5SWgkwCS8qIE5SWiBtb2RlICovCisjZGVmaW5lCU5SWkkJMHgyMAkvKiBOUlpJIG1vZGUgKi8KKyNkZWZpbmUJRk0xCTB4NDAJLyogRk0xICh0cmFuc2l0aW9uID0gMSkgKi8KKyNkZWZpbmUJRk0wCTB4NjAJLyogRk0wICh0cmFuc2l0aW9uID0gMCkgKi8KKyNkZWZpbmUJQ1JDUFMJMHg4MAkvKiBDUkMgUHJlc2V0IEkvTyAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMSAoQ2xvY2sgTW9kZSBjb250cm9sKSAqLworI2RlZmluZQlUUnhDWFQJMAkvKiBUUnhDID0gWHRhbCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q1RDCTEJLyogVFJ4QyA9IFRyYW5zbWl0IGNsb2NrICovCisjZGVmaW5lCVRSeENCUgkyCS8qIFRSeEMgPSBCUiBHZW5lcmF0b3IgT3V0cHV0ICovCisjZGVmaW5lCVRSeENEUAkzCS8qIFRSeEMgPSBEUExMIG91dHB1dCAqLworI2RlZmluZQlUUnhDT0kJNAkvKiBUUnhDIE8vSSAqLworI2RlZmluZQlUQ1JUeENQCTAJLyogVHJhbnNtaXQgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlUQ1RSeENQCTgJLyogVHJhbnNtaXQgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlUQ0JSCTB4MTAJLyogVHJhbnNtaXQgY2xvY2sgPSBCUiBHZW5lcmF0b3Igb3V0cHV0ICovCisjZGVmaW5lCVRDRFBMTAkweDE4CS8qIFRyYW5zbWl0IGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUkNSVHhDUAkwCS8qIFJlY2VpdmUgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlSQ1RSeENQCTB4MjAJLyogUmVjZWl2ZSBjbG9jayA9IFRSeEMgcGluICovCisjZGVmaW5lCVJDQlIJMHg0MAkvKiBSZWNlaXZlIGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlSQ0RQTEwJMHg2MAkvKiBSZWNlaXZlIGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUlR4Q1gJMHg4MAkvKiBSVHhDIFh0YWwvTm8gWHRhbCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgdGltZSBjb25zdGFudCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTQgKE1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCUkVOQUJMCTEJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBlbmFibGUgKi8KKyNkZWZpbmUJQlJTUkMJMgkvKiBCYXVkIHJhdGUgZ2VuZXJhdG9yIHNvdXJjZSAqLworI2RlZmluZQlEVFJSRVEJNAkvKiBEVFIvUmVxdWVzdCBmdW5jdGlvbiAqLworI2RlZmluZQlBVVRPRUNITyA4CS8qIEF1dG8gRWNobyAqLworI2RlZmluZQlMT09QQkFLCTB4MTAJLyogTG9jYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUJU0VBUkNICTB4MjAJLyogRW50ZXIgc2VhcmNoIG1vZGUgKi8KKyNkZWZpbmUJUk1DCTB4NDAJLyogUmVzZXQgbWlzc2luZyBjbG9jayAqLworI2RlZmluZQlESVNEUExMCTB4NjAJLyogRGlzYWJsZSBEUExMICovCisjZGVmaW5lCVNTQlIJMHg4MAkvKiBTZXQgRFBMTCBzb3VyY2UgPSBCUiBnZW5lcmF0b3IgKi8KKyNkZWZpbmUJU1NSVHhDCTB4YTAJLyogU2V0IERQTEwgc291cmNlID0gUlR4QyAqLworI2RlZmluZQlTRk1NCTB4YzAJLyogU2V0IEZNIG1vZGUgKi8KKyNkZWZpbmUJU05SWkkJMHhlMAkvKiBTZXQgTlJaSSBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE1IChleHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lIFBSSU1FCTEJLyogUjUnIGV0YyByZWdpc3RlciBhY2Nlc3MgKFo4NUMzMC8yMzAgb25seSkgKi8KKyNkZWZpbmUJWkNJRQkyCS8qIFplcm8gY291bnQgSUUgKi8KKyNkZWZpbmUgRklGT0UJNAkvKiBaODUyMzAgb25seSAqLworI2RlZmluZQlEQ0RJRQk4CS8qIERDRCBJRSAqLworI2RlZmluZQlTWU5DSUUJMHgxMAkvKiBTeW5jL2h1bnQgSUUgKi8KKyNkZWZpbmUJQ1RTSUUJMHgyMAkvKiBDVFMgSUUgKi8KKyNkZWZpbmUJVHhVSUUJMHg0MAkvKiBUeCBVbmRlcnJ1bi9FT00gSUUgKi8KKyNkZWZpbmUJQlJLSUUJMHg4MAkvKiBCcmVhay9BYm9ydCBJRSAqLworCisKKy8qIFJlYWQgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlSeF9DSF9BVgkweDEJLyogUnggQ2hhcmFjdGVyIEF2YWlsYWJsZSAqLworI2RlZmluZQlaQ09VTlQJCTB4MgkvKiBaZXJvIGNvdW50ICovCisjZGVmaW5lCVR4X0JVRl9FTVAJMHg0CS8qIFR4IEJ1ZmZlciBlbXB0eSAqLworI2RlZmluZQlEQ0QJCTB4OAkvKiBEQ0QgKi8KKyNkZWZpbmUJU1lOQ19IVU5UCTB4MTAJLyogU3luYy9odW50ICovCisjZGVmaW5lCUNUUwkJMHgyMAkvKiBDVFMgKi8KKyNkZWZpbmUJVHhFT00JCTB4NDAJLyogVHggdW5kZXJydW4gKi8KKyNkZWZpbmUJQlJLX0FCUlQJMHg4MAkvKiBCcmVhay9BYm9ydCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJQUxMX1NOVAkJMHgxCS8qIEFsbCBzZW50ICovCisvKiBSZXNpZHVlIERhdGEgZm9yIDggUnggYml0cy9jaGFyIHByb2dyYW1tZWQgKi8KKyNkZWZpbmUJUkVTMwkJMHg4CS8qIDAvMyAqLworI2RlZmluZQlSRVM0CQkweDQJLyogMC80ICovCisjZGVmaW5lCVJFUzUJCTB4YwkvKiAwLzUgKi8KKyNkZWZpbmUJUkVTNgkJMHgyCS8qIDAvNiAqLworI2RlZmluZQlSRVM3CQkweGEJLyogMC83ICovCisjZGVmaW5lCVJFUzgJCTB4NgkvKiAwLzggKi8KKyNkZWZpbmUJUkVTMTgJCTB4ZQkvKiAxLzggKi8KKyNkZWZpbmUJUkVTMjgJCTB4MAkvKiAyLzggKi8KKy8qIFNwZWNpYWwgUnggQ29uZGl0aW9uIEludGVycnVwdHMgKi8KKyNkZWZpbmUJUEFSX0VSUgkJMHgxMAkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJUnhfT1ZSCQkweDIwCS8qIFJ4IE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUJQ1JDX0VSUgkJMHg0MAkvKiBDUkMvRnJhbWluZyBFcnJvciAqLworI2RlZmluZQlFTkRfRlIJCTB4ODAJLyogRW5kIG9mIEZyYW1lIChTRExDKSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDIgKGNoYW5uZWwgYiBvbmx5KSAtIEludGVycnVwdCB2ZWN0b3IgKi8KKworLyogUmVhZCBSZWdpc3RlciAzIChpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikgY2ggYSBvbmx5ICovCisjZGVmaW5lCUNIQkVYVAkweDEJCS8qIENoYW5uZWwgQiBFeHQvU3RhdCBJUCAqLworI2RlZmluZQlDSEJUeElQCTB4MgkJLyogQ2hhbm5lbCBCIFR4IElQICovCisjZGVmaW5lCUNIQlJ4SVAJMHg0CQkvKiBDaGFubmVsIEIgUnggSVAgKi8KKyNkZWZpbmUJQ0hBRVhUCTB4OAkJLyogQ2hhbm5lbCBBIEV4dC9TdGF0IElQICovCisjZGVmaW5lCUNIQVR4SVAJMHgxMAkJLyogQ2hhbm5lbCBBIFR4IElQICovCisjZGVmaW5lCUNIQVJ4SVAJMHgyMAkJLyogQ2hhbm5lbCBBIFJ4IElQICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgOCAocmVjZWl2ZSBkYXRhIHJlZ2lzdGVyKSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEwICAobWlzYyBzdGF0dXMgYml0cykgKi8KKyNkZWZpbmUJT05MT09QCTIJCS8qIE9uIGxvb3AgKi8KKyNkZWZpbmUJTE9PUFNFTkQgMHgxMAkJLyogTG9vcCBzZW5kaW5nICovCisjZGVmaW5lCUNMSzJNSVMJMHg0MAkJLyogVHdvIGNsb2NrcyBtaXNzaW5nICovCisjZGVmaW5lCUNMSzFNSVMJMHg4MAkJLyogT25lIGNsb2NrIG1pc3NpbmcgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTUgKHZhbHVlIG9mIFdSIDE1KSAqLworCisKKy8qCisgKglJbnRlcnJ1cHQgaGFuZGxpbmcgZnVuY3Rpb25zIGZvciB0aGlzIFNDQworICovCisKK3N0cnVjdCB6ODUzMF9jaGFubmVsOworIAorc3RydWN0IHo4NTMwX2lycWhhbmRsZXIKK3sKKwl2b2lkICgqcngpKHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworCXZvaWQgKCp0eCkoc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CisJdm9pZCAoKnN0YXR1cykoc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7Cit9OworCisvKgorICoJQSBjaGFubmVsIG9mIHRoZSBaODUzMAorICovCisKK3N0cnVjdCB6ODUzMF9jaGFubmVsCit7CisJc3RydWN0CQl6ODUzMF9pcnFoYW5kbGVyICppcnFzOwkJLyogSVJRIGhhbmRsZXJzICovCisJLyoKKwkgKglTeW5jaHJvbm91cworCSAqLworCXUxNgkJY291bnQ7CQkvKiBCdXllcyByZWNlaXZlZCAqLworCXUxNgkJbWF4OwkJLyogTW9zdCB3ZSBjYW4gcmVjZWl2ZSB0aGlzIGZyYW1lICovCisJdTE2CQltdHU7CQkvKiBNVFUgb2YgdGhlIGRldmljZSAqLworCXU4CQkqZHB0cjsJCS8qIFBvaW50ZXIgaW50byByeCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwkJLyogQnVmZmVyIGRwdHIgcG9pbnRzIGludG8gKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiMjsJCS8qIFBlbmRpbmcgYnVmZmVyICovCisJdTgJCXN0YXR1czsJCS8qIEN1cnJlbnQgRENEICovCisJdTgJCWRjZGNoZWNrOwkvKiB3aGljaCBiaXQgdG8gY2hlY2sgZm9yIGxpbmUgKi8KKwl1OAkJc3luYzsJCS8qIFNldCBpZiBpbiBzeW5jIG1vZGUgKi8KKworCXU4CQlyZWdzWzMyXTsJLyogUmVnaXN0ZXIgbWFwIGZvciB0aGUgY2hpcCAqLworCXU4CQlwZW5kcmVnc1szMl07CS8qIFBlbmRpbmcgcmVnaXN0ZXIgdmFsdWVzICovCisJCisJc3RydWN0IHNrX2J1ZmYgCSp0eF9za2I7CS8qIEJ1ZmZlciBiZWluZyB0cmFuc21pdHRlZCAqLworCXN0cnVjdCBza19idWZmICAqdHhfbmV4dF9za2I7CS8qIE5leHQgdHJhbnNtaXQgYnVmZmVyICovCisJdTgJCSp0eF9wdHI7CS8qIEJ5dGUgcG9pbnRlciBpbnRvIHRoZSBidWZmZXIgKi8KKwl1OAkJKnR4X25leHRfcHRyOwkvKiBOZXh0IHBvaW50ZXIgdG8gdXNlICovCisJdTgJCSp0eF9kbWFfYnVmWzJdOwkvKiBUWCBmbGlwIGJ1ZmZlcnMgZm9yIERNQSAqLworCXU4CQl0eF9kbWFfdXNlZDsJLyogRmxpcCBidWZmZXIgdXNhZ2UgdG9nZ2xlciAqLworCXUxNgkJdHhjb3VudDsJLyogQ291bnQgb2YgYnl0ZXMgdG8gdHJhbnNtaXQgKi8KKwkKKwl2b2lkCQkoKnJ4X2Z1bmN0aW9uKShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwkKKwkvKgorCSAqCVN5bmMgRE1BCisJICovCisJCisJdTgJCXJ4ZG1hOwkJLyogRE1BIGNoYW5uZWxzICovCisJdTgJCXR4ZG1hOwkJCisJdTgJCXJ4ZG1hX29uOwkvKiBETUEgYWN0aXZlIGlmIGZsYWcgc2V0ICovCisJdTgJCXR4ZG1hX29uOworCXU4CQlkbWFfbnVtOwkvKiBCdWZmZXIgd2UgYXJlIERNQWluZyBpbnRvICovCisJdTgJCWRtYV9yZWFkeTsJLyogSXMgdGhlIG90aGVyIGJ1ZmZlciBmcmVlICovCisJdTgJCWRtYV90eDsJCS8qIFRYIGlzIHRvIHVzZSBETUEgKi8KKwl1OAkJKnJ4X2J1ZlsyXTsJLyogVGhlIGZsaXAgYnVmZmVycyAqLworCQorCS8qCisJICoJU3lzdGVtCisJICovCisJIAorCXN0cnVjdCB6ODUzMF9kZXYgKmRldjsJCS8qIFo4NTIzMCBjaGlwIGluc3RhbmNlIHdlIGFyZSBmcm9tICovCisJdW5zaWduZWQgbG9uZwljdHJsaW87CQkvKiBJL08gcG9ydHMgKi8KKwl1bnNpZ25lZCBsb25nCWRhdGFpbzsKKworCS8qCisJICoJRm9yIFBDIHdlIGVuY29kZSB0aGlzIHdheS4KKwkgKi8JCisjZGVmaW5lIFo4NTMwX1BPUlRfU0xFRVAJMHg4MDAwMDAwMAorI2RlZmluZSBaODUzMF9QT1JUX09GKHgpCSgoeCkmMHhGRkZGKQorCisJdTMyCQlyeF9vdmVycnVuOwkJLyogT3ZlcnJ1bnMgLSBub3QgZG9uZSB5ZXQgKi8KKwl1MzIJCXJ4X2NyY19lcnI7CisKKwkvKgorCSAqCUJvdW5kIGRldmljZSBwb2ludGVycworCSAqLworCisJdm9pZAkJKnByaXZhdGU7CS8qIEZvciBvdXIgb3duZXIgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2aWNlOwkvKiBOZXR3b3JrIGxheWVyIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBOZXR3b3JrIGxheWVyIHN0YXRpc3RpY3MgKi8KKworCS8qCisJICoJQXN5bmMgZmVhdHVyZXMKKwkgKi8KKworCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OwkJLyogQXR0YWNoZWQgdGVybWluYWwgKi8KKwlpbnQJCQlsaW5lOwkJLyogTWlub3IgbnVtYmVyICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwkvKiBUYXNrcyB3YWl0aW5nIHRvIG9wZW4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwkvKiBhbmQgZm9yIGNsb3NlIHRvIGVuZCAqLworCXVuc2lnbmVkIGxvbmcJCWV2ZW50OwkJLyogUGVuZGluZyBldmVudHMgKi8KKwlpbnQJCQlmZGNvdW50OyAgICAJLyogIyBvZiBmZCBvbiBkZXZpY2UgKi8KKwlpbnQJCQlibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCWludAkJCXhfY2hhcjsJCS8qIFhPTi9YT0YgY2hhciAqLworCXVuc2lnbmVkIGNoYXIgCQkqeG1pdF9idWY7CS8qIFRyYW5zbWl0IHBvaW50ZXIgKi8KKwlpbnQJCQl4bWl0X2hlYWQ7CS8qIFRyYW5zbWl0IHJpbmcgKi8KKwlpbnQJCQl4bWl0X3RhaWw7CisJaW50CQkJeG1pdF9jbnQ7CisJaW50CQkJZmxhZ3M7CQorCWludAkJCXRpbWVvdXQ7CisJaW50CQkJeG1pdF9maWZvX3NpemU7CS8qIFRyYW5zbWl0IEZJRk8gaW5mbyAqLworCisJaW50CQkJY2xvc2VfZGVsYXk7CS8qIERvIHdlIHdhaXQgZm9yIGRyYWluIG9uIGNsb3NlID8gKi8KKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OworCisJLyogV2UgbmVlZCB0byBrbm93IHRoZSBjdXJyZW50IGNsb2NrIGRpdmlzb3IKKwkgKiB0byByZWFkIHRoZSBicHMgcmF0ZSB0aGUgY2hpcCBoYXMgY3VycmVudGx5CisJICogbG9hZGVkLgorCSAqLworCisJdW5zaWduZWQgY2hhcgkJY2xrX2Rpdmlzb3I7ICAvKiBNYXkgYmUgMSwgMTYsIDMyLCBvciA2NCAqLworCWludAkJCXpzX2JhdWQ7CisKKwlpbnQJCQltYWdpYzsKKwlpbnQJCQliYXVkX2Jhc2U7CQkvKiBCYXVkIHBhcmFtZXRlcnMgKi8KKwlpbnQJCQljdXN0b21fZGl2aXNvcjsKKworCisJdW5zaWduZWQgY2hhcgkJdHhfYWN0aXZlOyAvKiBjaGFyYWN0ZXIgaXMgYmVpbmcgeG1pdHRlZCAqLworCXVuc2lnbmVkIGNoYXIJCXR4X3N0b3BwZWQ7IC8qIG91dHB1dCBpcyBzdXNwZW5kZWQgKi8KKworCXNwaW5sb2NrX3QJCSpsb2NrOwkgIC8qIERldmljciBsb2NrICovCit9OwkKKworLyoKKyAqCUVhY2ggWjg1M3gwIGRldmljZS4KKyAqLwkKKyAKK3N0cnVjdCB6ODUzMF9kZXYKK3sKKwljaGFyICpuYW1lOwkvKiBEZXZpY2UgaW5zdGFuY2UgbmFtZSAqLworCXN0cnVjdCB6ODUzMF9jaGFubmVsIGNoYW5BOwkvKiBTQ0MgY2hhbm5lbCBBICovCisJc3RydWN0IHo4NTMwX2NoYW5uZWwgY2hhbkI7CS8qIFNDQyBjaGFubmVsIEIgKi8KKwlpbnQgdHlwZTsKKyNkZWZpbmUgWjg1MzAJMAkvKiBOTU9TIGRpbm9zYXVyICovCQorI2RlZmluZSBaODVDMzAJMQkvKiBDTU9TIC0gYmV0dGVyICovCisjZGVmaW5lIFo4NTIzMAkyCS8qIENNT1Mgd2l0aCByZWFsIEZJRk8gKi8KKwlpbnQgaXJxOwkvKiBJbnRlcnJ1cHQgZm9yIHRoZSBkZXZpY2UgKi8KKwlpbnQgYWN0aXZlOwkvKiBTb2Z0IGludGVycnVwdCBlbmFibGUgLSB0aGUgTWFjIGRvZXNuJ3QgCisJCQkgICBhbHdheXMgaGF2ZSBhIGhhcmQgZGlzYWJsZSBvbiBpdHMgODUzMHMuLi4gKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCisKKy8qCisgKglGdW5jdGlvbnMKKyAqLworIAorZXh0ZXJuIHU4IHo4NTMwX2RlYWRfcG9ydFtdOworZXh0ZXJuIHU4IHo4NTMwX2hkbGNfa2lsb3N0cmVhbV84NTIzMFtdOworZXh0ZXJuIHU4IHo4NTMwX2hkbGNfa2lsb3N0cmVhbVtdOworZXh0ZXJuIGlycXJldHVybl90IHo4NTMwX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCB6ODUzMF9kZXNjcmliZShzdHJ1Y3Qgejg1MzBfZGV2ICosIGNoYXIgKm1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgaW8pOworZXh0ZXJuIGludCB6ODUzMF9pbml0KHN0cnVjdCB6ODUzMF9kZXYgKik7CitleHRlcm4gaW50IHo4NTMwX3NodXRkb3duKHN0cnVjdCB6ODUzMF9kZXYgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgejg1MzBfc3luY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgejg1MzBfc3luY19kbWFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgejg1MzBfc3luY19kbWFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfdHhkbWFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgejg1MzBfc3luY190eGRtYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgejg1MzBfY2hhbm5lbF9sb2FkKHN0cnVjdCB6ODUzMF9jaGFubmVsICosIHU4ICopOworZXh0ZXJuIGludCB6ODUzMF9xdWV1ZV94bWl0KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqejg1MzBfZ2V0X3N0YXRzKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKTsKK2V4dGVybiB2b2lkIHo4NTMwX251bGxfcngoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpOworCisKKy8qCisgKglTdGFuZGFyZCBpbnRlcnJ1cHQgdmVjdG9yIHNldHMKKyAqLworIAorZXh0ZXJuIHN0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX3N5bmMsIHo4NTMwX2FzeW5jLCB6ODUzMF9ub3A7CisKKy8qCisgKglBc3luY2hyb25vdXMgSW50ZXJmYWNpbmcKKyAqLworCisjZGVmaW5lIFNFUklBTF9NQUdJQyAweDUzMDEKKworLyoKKyAqIFRoZSBzaXplIG9mIHRoZSBzZXJpYWwgeG1pdCBidWZmZXIgaXMgMSBwYWdlLCBvciA0MDk2IGJ5dGVzCisgKi8KKworI2RlZmluZSBTRVJJQUxfWE1JVF9TSVpFIDQwOTYKKyNkZWZpbmUgV0FLRVVQX0NIQVJTCTI1NgorCisvKgorICogRXZlbnRzIGFyZSB1c2VkIHRvIHNjaGVkdWxlIHRoaW5ncyB0byBoYXBwZW4gYXQgdGltZXItaW50ZXJydXB0CisgKiB0aW1lLCBpbnN0ZWFkIG9mIGF0IHJzIGludGVycnVwdCB0aW1lLgorICovCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkwCisKKy8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwvY2hyX2Rydi9zZXJpYWwuYyAqLworI2RlZmluZSBaSUxPR19JTklUSUFMSVpFRAkweDgwMDAwMDAwIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBaSUxPR19DQUxMT1VUX0FDVElWRQkweDQwMDAwMDAwIC8qIENhbGwgb3V0IGRldmljZSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgWklMT0dfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwIC8qIE5vcm1hbCBkZXZpY2UgaXMgYWN0aXZlICovCisjZGVmaW5lIFpJTE9HX0JPT1RfQVVUT0NPTkYJMHgxMDAwMDAwMCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCisjZGVmaW5lIFpJTE9HX0NMT1NJTkcJCTB4MDgwMDAwMDAgLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLworI2RlZmluZSBaSUxPR19DVFNfRkxPVwkJMHgwNDAwMDAwMCAvKiBEbyBDVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFpJTE9HX0NIRUNLX0NECQkweDAyMDAwMDAwIC8qIGkuZS4sIENMT0NBTCAqLworCisjZW5kaWYgLyogIShfWjg1MzBfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dkLmMgYi9kcml2ZXJzL25ldC93ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDVkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93ZC5jCkBAIC0wLDAgKzEsNTU5IEBACisvKiB3ZC5jOiBBIFdEODB4MyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGlzIGEgZHJpdmVyIGZvciBXRDgwMDMgYW5kIFdEODAxMyAiY29tcGF0aWJsZSIgZXRoZXJjYXJkcy4KKworCVRoYW5rcyB0byBSdXNzIE5lbHNvbiAobmVsc29uQGNybnd5ci5jb20pIGZvciBsb2FuaW5nIG1lIGEgV0Q4MDEzLgorCisJQ2hhbmdlbG9nOgorCisJUGF1bCBHb3J0bWFrZXIJOiBtdWx0aXBsZSBjYXJkIHN1cHBvcnQgZm9yIG1vZHVsZSB1c2Vycywgc3VwcG9ydAorCQkJICBmb3Igbm9uLXN0YW5kYXJkIG1lbW9yeSBzaXplcy4KKworCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJ3ZC5jOnYxLjEwIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAid2QiCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHdkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9Cit7MHgzMDAsIDB4MjgwLCAweDM4MCwgMHgyNDAsIDB9OworCitzdGF0aWMgaW50IHdkX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCB3ZF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgd2RfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHdkX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQkJaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCB3ZF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCB3ZF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIGludCB3ZF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworDAorI2RlZmluZSBXRF9TVEFSVF9QRwkJMHgwMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBXRDAzX1NUT1BfUEcJMHgyMAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBXRDEzX1NUT1BfUEcJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCisjZGVmaW5lIFdEX0NNRFJFRwkJMAkJLyogT2Zmc2V0IHRvIEFTSUMgY29tbWFuZCByZWdpc3Rlci4gKi8KKyNkZWZpbmUJIFdEX1JFU0VUCQkweDgwCS8qIEJvYXJkIHJlc2V0LCBpbiBXRF9DTURSRUcuICovCisjZGVmaW5lCSBXRF9NRU1FTkIJCTB4NDAJLyogRW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworI2RlZmluZSBXRF9DTURSRUc1CQk1CQkvKiBPZmZzZXQgdG8gMTYtYml0LW9ubHkgQVNJQyByZWdpc3RlciA1LiAqLworI2RlZmluZQkgSVNBMTYJCQkweDgwCS8qIEVuYWJsZSAxNiBiaXQgYWNjZXNzIGZyb20gdGhlIElTQSBidXMuICovCisjZGVmaW5lCSBOSUMxNgkJCTB4NDAJLyogRW5hYmxlIDE2IGJpdCBhY2Nlc3MgZnJvbSB0aGUgODM5MC4gKi8KKyNkZWZpbmUgV0RfTklDX09GRlNFVAkxNgkJLyogT2Zmc2V0IHRvIHRoZSA4MzkwIGZyb20gdGhlIGJhc2VfYWRkci4gKi8KKyNkZWZpbmUgV0RfSU9fRVhURU5UCTMyCisKKwwKKy8qCVByb2JlIGZvciB0aGUgV0Q4MDAzIGFuZCBXRDgwMTMuICBUaGVzZSBjYXJkcyBoYXZlIHRoZSBzdGF0aW9uCisJYWRkcmVzcyBQUk9NIGF0IEkvTyBwb3J0cyA8YmFzZT4rOCB0byA8YmFzZT4rMTMsIHdpdGggYSBjaGVja3N1bQorCWZvbGxvd2luZy4gQSBTb3VuZGJsYXN0ZXIgY2FuIGhhdmUgdGhlIHNhbWUgY2hlY2tzdW0gYXMgYW4gV0RldGhlcmNhcmQsCisJc28gd2UgaGF2ZSBhbiBleHRyYSBleGNsdXNpb25hcnkgY2hlY2sgZm9yIGl0LgorCisJVGhlIHdkX3Byb2JlMSgpIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIGNhcmQgYW5kIGZpbGxzIHRoZQorCXN0YXRpb24gYWRkcmVzcyBmaWVsZC4gKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fd2RfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKwlpbnQgbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisJaW50IG1lbV9lbmQgPSBkZXYtPm1lbV9lbmQ7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpIHsJLyogQ2hlY2sgYSB1c2VyIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJciA9IHJlcXVlc3RfcmVnaW9uKGJhc2VfYWRkciwgV0RfSU9fRVhURU5ULCAid2QtcHJvYmUiKTsKKwkJaWYgKCByID09IE5VTEwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpID0gd2RfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwkJaWYgKGkgIT0gMCkgIAorCQkJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBXRF9JT19FWFRFTlQpOworCQllbHNlCisJCQlyLT5uYW1lID0gZGV2LT5uYW1lOworCQlyZXR1cm4gaTsKKwl9CisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IHdkX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJaW50IGlvYWRkciA9IHdkX3BvcnRsaXN0W2ldOworCQlyID0gcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBXRF9JT19FWFRFTlQsICJ3ZC1wcm9iZSIpOworCQlpZiAociA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmICh3ZF9wcm9iZTEoZGV2LCBpb2FkZHIpID09IDApIHsKKwkJCXItPm5hbWUgPSBkZXYtPm5hbWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFdEX0lPX0VYVEVOVCk7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwkJZGV2LT5tZW1fZW5kID0gbWVtX2VuZDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VULCBXRF9JT19FWFRFTlQpOworCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB3ZF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fd2RfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHdkX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpOworCWludCBjaGVja3N1bSA9IDA7CisJaW50IGFuY2llbnQgPSAwOwkJCS8qIEFuIG9sZCBjYXJkIHdpdGhvdXQgY29uZmlnIHJlZ2lzdGVycy4gKi8KKwlpbnQgd29yZDE2ID0gMDsJCQkJLyogMCA9IDggYml0LCAxID0gMTYgYml0ICovCisJY29uc3QgY2hhciAqbW9kZWxfbmFtZTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY2hlY2tzdW0gKz0gaW5iKGlvYWRkciArIDggKyBpKTsKKwlpZiAoaW5iKGlvYWRkciArIDgpID09IDB4ZmYgCS8qIEV4dHJhIGNoZWNrIHRvIGF2b2lkIHNvdW5kY2FyZC4gKi8KKwkJfHwgaW5iKGlvYWRkciArIDkpID09IDB4ZmYKKwkJfHwgKGNoZWNrc3VtICYgMHhmZikgIT0gMHhGRikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayBmb3Igc2VtaS12YWxpZCBtZW1fc3RhcnQvZW5kIHZhbHVlcyBpZiBzdXBwbGllZC4gKi8KKwlpZiAoKGRldi0+bWVtX3N0YXJ0ICUgMHgyMDAwKSB8fCAoZGV2LT5tZW1fZW5kICUgMHgyMDAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3ZC5jOiB1c2VyIHN1cHBsaWVkIG1lbV9zdGFydCBvciBtZW1fZW5kIG5vdCBvbiA4a0IgYm91bmRhcnkgLSBpZ25vcmVkLlxuIik7CisJCWRldi0+bWVtX3N0YXJ0ID0gMDsKKwkJZGV2LT5tZW1fZW5kID0gMDsKKwl9CisKKwlpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiBXRDgweDMgYXQgJSMzeCwiLCBkZXYtPm5hbWUsIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIDggKyBpKSk7CisKKwkvKiBUaGUgZm9sbG93aW5nIFB1cmVEYXRhIHByb2JlIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5CisJICAgTWlrZSBKYWdkaXMgPGphZ2d5QHB1cnBsZXQuZGVtb24uY28udWs+LiBQdXJlZGF0YSBkb2VzIHNvZnR3YXJlCisJICAgY29uZmlndXJhdGlvbiBkaWZmZXJlbnRseSBmcm9tIG90aGVycyBzbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGVtLgorCSAgIFRoaXMgZGV0ZWN0cyBhbiA4IGJpdCwgMTYgYml0IG9yIGR1bWIgKFRvc2hpYmEsIGp1bXBlcmVkKSBjYXJkLgorCSAgICovCisJaWYgKGluYihpb2FkZHIrMCkgPT0gJ1AnICYmIGluYihpb2FkZHIrMSkgPT0gJ0QnKSB7CisJCXVuc2lnbmVkIGNoYXIgcmVnNSA9IGluYihpb2FkZHIrNSk7CisKKwkJc3dpdGNoIChpbmIoaW9hZGRyKzIpKSB7CisJCWNhc2UgMHgwMzogd29yZDE2ID0gMDsgbW9kZWxfbmFtZSA9ICJQREk4MDIzLTgiOwlicmVhazsKKwkJY2FzZSAweDA1OiB3b3JkMTYgPSAwOyBtb2RlbF9uYW1lID0gIlBEVUM4MDIzIjsJYnJlYWs7CisJCWNhc2UgMHgwYTogd29yZDE2ID0gMTsgbW9kZWxfbmFtZSA9ICJQREk4MDIzLTE2IjsgYnJlYWs7CisJCQkvKiBFaXRoZXIgMHgwMSAoZHVtYikgb3IgdGhleSd2ZSByZWxlYXNlZCBhIG5ldyB2ZXJzaW9uLiAqLworCQlkZWZhdWx0Ogkgd29yZDE2ID0gMDsgbW9kZWxfbmFtZSA9ICJQREk4MDIzIjsJYnJlYWs7CisJCX0KKwkJZGV2LT5tZW1fc3RhcnQgPSAoKHJlZzUgJiAweDFjKSArIDB4YzApIDw8IDEyOworCQlkZXYtPmlycSA9IChyZWc1ICYgMHhlMCkgPT0gMHhlMCA/IDEwIDogKHJlZzUgPj4gNSkgKyAxOworCX0gZWxzZSB7CQkJCQkJCQkvKiBFbmQgb2YgUHVyZURhdGEgcHJvYmUgKi8KKwkJLyogVGhpcyBtZXRob2Qgb2YgY2hlY2tpbmcgZm9yIGEgMTYtYml0IGJvYXJkIGlzIGJvcnJvd2VkIGZyb20gdGhlCisJCSAgIHdlLmMgZHJpdmVyLiAgQSBzaW1wbGVyIG1ldGhvZCBpcyBqdXN0IHRvIGxvb2sgaW4gQVNJQyByZWcuIDB4MDMuCisJCSAgIEknbSBjb21wYXJpbmcgdGhlIHR3byBtZXRob2QgaW4gYWxwaGEgdGVzdCB0byBtYWtlIGNlcnRhaW4gdGhleQorCQkgICByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LiAqLworCQkvKiBDaGVjayBmb3IgdGhlIG9sZCA4IGJpdCBib2FyZCAtIGl0IGhhcyByZWdpc3RlciAwLzggYWxpYXNpbmcuCisJCSAgIERvIE5PVCBjaGVjayBpPj02IGhlcmUgLS0gaXQgaGFuZ3MgdGhlIG9sZCA4MDAzIGJvYXJkcyEgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWlmIChpbmIoaW9hZGRyK2kpICE9IGluYihpb2FkZHIrOCtpKSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPj0gNikgeworCQkJYW5jaWVudCA9IDE7CisJCQltb2RlbF9uYW1lID0gIldEODAwMy1vbGQiOworCQkJd29yZDE2ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWludCB0bXAgPSBpbmIoaW9hZGRyKzEpOyAvKiBmaWRkbGUgd2l0aCAxNmJpdCBiaXQgKi8KKwkJCW91dGIoIHRtcCBeIDB4MDEsIGlvYWRkcisxICk7IC8qIGF0dGVtcHQgdG8gY2xlYXIgMTZiaXQgYml0ICovCisJCQlpZiAoKChpbmIoIGlvYWRkcisxKSAmIDB4MDEpID09IDB4MDEpIC8qIEEgMTYgYml0IGNhcmQgKi8KKwkJCQkmJiAodG1wICYgMHgwMSkgPT0gMHgwMQkpIHsJCQkJLyogSW4gYSAxNiBzbG90LiAqLworCQkJCWludCBhc2ljX3JlZzUgPSBpbmIoaW9hZGRyK1dEX0NNRFJFRzUpOworCQkJCS8qIE1hZ2ljIHRvIHNldCBBU0lDIHRvIHdvcmQtd2lkZSBtb2RlLiAqLworCQkJCW91dGIoIE5JQzE2IHwgKGFzaWNfcmVnNSYweDFmKSwgaW9hZGRyK1dEX0NNRFJFRzUpOworCQkJCW91dGIodG1wLCBpb2FkZHIrMSk7CisJCQkJbW9kZWxfbmFtZSA9ICJXRDgwMTMiOworCQkJCXdvcmQxNiA9IDE7CQkvKiBXZSBoYXZlIGEgMTZiaXQgYm9hcmQgaGVyZSEgKi8KKwkJCX0gZWxzZSB7CisJCQkJbW9kZWxfbmFtZSA9ICJXRDgwMDMiOworCQkJCXdvcmQxNiA9IDA7CisJCQl9CisJCQlvdXRiKHRtcCwgaW9hZGRyKzEpOwkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgcmVnMSB2YWx1ZS4gKi8KKwkJfQorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCWlmICggIWFuY2llbnQgJiYgKGluYihpb2FkZHIrMSkgJiAweDAxKSAhPSAod29yZDE2ICYgMHgwMSkpCisJCQlwcmludGsoIlxuV0Q4MD8zOiBCdXMgd2lkdGggY29uZmxpY3QsICVkIChwcm9iZSkgIT0gJWQgKHJlZyByZXBvcnQpLiIsCisJCQkJICAgd29yZDE2ID8gMTYgOiA4LCAoaW5iKGlvYWRkcisxKSAmIDB4MDEpID8gMTYgOiA4KTsKKyNlbmRpZgorCX0KKworI2lmIGRlZmluZWQoV0RfU0hNRU0pICYmIFdEX1NITUVNID4gMHg4MDAwMAorCS8qIEFsbG93IGEgY29tcGlsZS10aW1lIG92ZXJyaWRlLgkgKi8KKwlkZXYtPm1lbV9zdGFydCA9IFdEX1NITUVNOworI2Vsc2UKKwlpZiAoZGV2LT5tZW1fc3RhcnQgPT0gMCkgeworCQkvKiBTYW5pdHkgYW5kIG9sZCA4MDAzIGNoZWNrICovCisJCWludCByZWcwID0gaW5iKGlvYWRkcik7CisJCWlmIChyZWcwID09IDB4ZmYgfHwgcmVnMCA9PSAwKSB7CisJCQkvKiBGdXR1cmUgcGxhbjogdGhpcyBjb3VsZCBjaGVjayBhIGZldyBsaWtlbHkgbG9jYXRpb25zIGZpcnN0LiAqLworCQkJZGV2LT5tZW1fc3RhcnQgPSAweGQwMDAwOworCQkJcHJpbnRrKCIgYXNzaWduaW5nIGFkZHJlc3MgJSNseCIsIGRldi0+bWVtX3N0YXJ0KTsKKwkJfSBlbHNlIHsKKwkJCWludCBoaWdoX2FkZHJfYml0cyA9IGluYihpb2FkZHIrV0RfQ01EUkVHNSkgJiAweDFmOworCQkJLyogU29tZSBib2FyZHMgZG9uJ3QgaGF2ZSB0aGUgcmVnaXN0ZXIgNSAtLSBpdCByZXR1cm5zIDB4ZmYuICovCisJCQlpZiAoaGlnaF9hZGRyX2JpdHMgPT0gMHgxZiB8fCB3b3JkMTYgPT0gMCkKKwkJCQloaWdoX2FkZHJfYml0cyA9IDB4MDE7CisJCQlkZXYtPm1lbV9zdGFydCA9ICgocmVnMCYweDNmKSA8PCAxMykgKyAoaGlnaF9hZGRyX2JpdHMgPDwgMTkpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBUaGUgODM5MCBpc24ndCBhdCB0aGUgYmFzZSBhZGRyZXNzIC0tIHRoZSBBU0lDIHJlZ3MgYXJlIHRoZXJlISAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyK1dEX05JQ19PRkZTRVQ7CisKKwlpZiAoZGV2LT5pcnEgPCAyKSB7CisJCWludCBpcnFtYXBbXSA9IHs5LDMsNSw3LDEwLDExLDE1LDR9OworCQlpbnQgcmVnMSA9IGluYihpb2FkZHIrMSk7CisJCWludCByZWc0ID0gaW5iKGlvYWRkcis0KTsKKwkJaWYgKGFuY2llbnQgfHwgcmVnMSA9PSAweGZmKSB7CS8qIEFjayEhIE5vIHdheSB0byByZWFkIHRoZSBJUlEhICovCisJCQlzaG9ydCBuaWNfYWRkciA9IGlvYWRkcitXRF9OSUNfT0ZGU0VUOworCQkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQkJLyogV2UgaGF2ZSBhbiBvbGQtc3R5bGUgZXRoZXJjYXJkIHRoYXQgZG9lc24ndCByZXBvcnQgaXRzIElSUQorCQkJICAgbGluZS4gIERvIGF1dG9pcnEgdG8gZmluZCB0aGUgSVJRIGxpbmUuIE5vdGUgdGhhdCB0aGlzIElTIE5PVAorCQkJICAgYSByZWxpYWJsZSB3YXkgdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQuICovCisJCQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9TVE9QLCBuaWNfYWRkcik7CisJCQlvdXRiKDB4MDAsIG5pY19hZGRyK0VOMF9JTVIpOwkvKiBEaXNhYmxlIGFsbCBpbnRycy4gKi8KKwkJCQorCQkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJCW91dGJfcCgweGZmLCBuaWNfYWRkciArIEVOMF9JTVIpOwkvKiBFbmFibGUgYWxsIGludGVycnVwdHMuICovCisJCQlvdXRiX3AoMHgwMCwgbmljX2FkZHIgKyBFTjBfUkNOVExPKTsKKwkJCW91dGJfcCgweDAwLCBuaWNfYWRkciArIEVOMF9SQ05USEkpOworCQkJb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2FkZHIpOyAvKiBUcmlnZ2VyIGl0Li4uICovCisJCQltZGVsYXkoMjApOworCQkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJCQorCQkJb3V0Yl9wKDB4MDAsIG5pY19hZGRyK0VOMF9JTVIpOwkvKiBNYXNrIGFsbCBpbnRycy4gYWdhaW4uICovCisKKwkJCWlmIChlaV9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKCIgYXV0b2lycSBpcyAlZCIsIGRldi0+aXJxKTsKKwkJCWlmIChkZXYtPmlycSA8IDIpCisJCQkJZGV2LT5pcnEgPSB3b3JkMTYgPyAxMCA6IDU7CisJCX0gZWxzZQorCQkJZGV2LT5pcnEgPSBpcnFtYXBbKChyZWc0ID4+IDUpICYgMHgwMykgKyAocmVnMSAmIDB4MDQpXTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpCQkvKiBGaXh1cCBib2dvc2l0eTogSVJRMiBpcyByZWFsbHkgSVJROSAqLworCQlkZXYtPmlycSA9IDk7CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSB3ZSBjYW5ub3QKKwkgICBzaGFyZSBhbmQgdGhlIGJvYXJkIHdpbGwgdXN1YWxseSBiZSBlbmFibGVkLiAqLworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoaSkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiBpOworCX0KKworCS8qIE9LLCB3ZXJlIGFyZSBjZXJ0YWluIHRoaXMgaXMgZ29pbmcgdG8gd29yay4gIFNldHVwIHRoZSBkZXZpY2UuICovCisJZWlfc3RhdHVzLm5hbWUgPSBtb2RlbF9uYW1lOworCWVpX3N0YXR1cy53b3JkMTYgPSB3b3JkMTY7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBXRF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IFdEX1NUQVJUX1BHICsgVFhfUEFHRVM7CisKKwkvKiBEb24ndCBtYXAgaW4gdGhlIHNoYXJlZCBtZW1vcnkgdW50aWwgdGhlIGJvYXJkIGlzIGFjdHVhbGx5IG9wZW5lZC4gKi8KKworCS8qIFNvbWUgY2FyZHMgKGVnIFdEODAwM0VCVCkgY2FuIGJlIGp1bXBlcmVkIGZvciBtb3JlICgzMmshKSBtZW1vcnkuICovCisJaWYgKGRldi0+bWVtX2VuZCAhPSAwKSB7CisJCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSAoZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQpLzI1NjsKKwkJZWlfc3RhdHVzLnByaXYgPSBkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydDsKKwl9IGVsc2UgeworCQllaV9zdGF0dXMuc3RvcF9wYWdlID0gd29yZDE2ID8gV0QxM19TVE9QX1BHIDogV0QwM19TVE9QX1BHOworCQlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIChlaV9zdGF0dXMuc3RvcF9wYWdlIC0gV0RfU1RBUlRfUEcpKjI1NjsKKwkJZWlfc3RhdHVzLnByaXYgPSAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFdEX1NUQVJUX1BHKSoyNTY7CisJfQorCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIGVpX3N0YXR1cy5wcml2KTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaW50aygiICVzLCBJUlEgJWQsIHNoYXJlZCBtZW1vcnkgYXQgJSNseC0lI2x4LlxuIiwKKwkJICAgbW9kZWxfbmFtZSwgZGV2LT5pcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSk7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZ3ZF9yZXNldF84MzkwOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZ3ZF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJndkX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJndkX2dldF84MzkwX2hkcjsKKwlkZXYtPm9wZW4gPSAmd2Rfb3BlbjsKKwlkZXYtPnN0b3AgPSAmd2RfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCisjaWYgMQorCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiBzb2Z0Y29uZmlnIGNhcmRzIC0tIE0uVSAqLworCS8qIC4uIGJ1dCBwb3NzaWJseSBwb3RlbnRpYWxseSB1bnNhZmUgLSBEb25hbGQgKi8KKwlpZiAoaW5iKGlvYWRkcisxNCkgJiAweDIwKQorCQlvdXRiKGluYihpb2FkZHIrNCl8MHg4MCwgaW9hZGRyKzQpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2Rfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKworICAvKiBNYXAgaW4gdGhlIHNoYXJlZCBtZW1vcnkuIEFsd2F5cyBzZXQgcmVnaXN0ZXIgMCBsYXN0IHRvIHJlbWFpbgorCSBjb21wYXRpYmxlIHdpdGggdmVyeSBvbGQgYm9hcmRzLiAqLworICBlaV9zdGF0dXMucmVnMCA9ICgoZGV2LT5tZW1fc3RhcnQ+PjEzKSAmIDB4M2YpIHwgV0RfTUVNRU5COworICBlaV9zdGF0dXMucmVnNSA9ICgoZGV2LT5tZW1fc3RhcnQ+PjE5KSAmIDB4MWYpIHwgTklDMTY7CisKKyAgaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJICBvdXRiKGVpX3N0YXR1cy5yZWc1LCBpb2FkZHIrV0RfQ01EUkVHNSk7CisgIG91dGIoZWlfc3RhdHVzLnJlZzAsIGlvYWRkcik7IC8qIFdEX0NNRFJFRyAqLworCisgIGVpX29wZW4oZGV2KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3ZF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHdkX2NtZF9wb3J0ID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKworCW91dGIoV0RfUkVTRVQsIHdkX2NtZF9wb3J0KTsKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0dGluZyB0aGUgV0Q4MHgzIHQ9JWx1Li4uIiwgamlmZmllcyk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKworCS8qIFNldCB1cCB0aGUgQVNJQyByZWdpc3RlcnMsIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCB0aGVtLiAqLworCW91dGIoKCgoZGV2LT5tZW1fc3RhcnQ+PjEzKSAmIDB4M2YpfFdEX01FTUVOQiksIHdkX2NtZF9wb3J0KTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJb3V0YihOSUMxNiB8ICgoZGV2LT5tZW1fc3RhcnQ+PjE5KSAmIDB4MWYpLCB3ZF9jbWRfcG9ydCtXRF9DTURSRUc1KTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygicmVzZXQgZG9uZVxuIik7CisJcmV0dXJuOworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZAord2RfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisKKwlpbnQgd2RfY21kcmVnID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKwl2b2lkIF9faW9tZW0gKmhkcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoKHJpbmdfcGFnZSAtIFdEX1NUQVJUX1BHKTw8OCk7CisKKwkvKiBXZSdsbCBhbHdheXMgZ2V0IGEgNCBieXRlIGhlYWRlciByZWFkIGZvbGxvd2VkIGJ5IGEgcGFja2V0IHJlYWQsIHNvCisJICAgd2UgZW5hYmxlIDE2IGJpdCBtb2RlIGJlZm9yZSB0aGUgaGVhZGVyLCBhbmQgZGlzYWJsZSBhZnRlciB0aGUgYm9keS4gKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJb3V0YihJU0ExNiB8IGVpX3N0YXR1cy5yZWc1LCB3ZF9jbWRyZWcrV0RfQ01EUkVHNSk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiBPZmZpY2lhbGx5IHRoaXMgaXMgd2hhdCB3ZSBhcmUgZG9pbmcsIGJ1dCB0aGUgcmVhZGwoKSBpcyBmYXN0ZXIgKi8KKwkvKiB1bmZvcnR1bmF0ZWx5IGl0IGlzbid0IGVuZGlhbiBhd2FyZSBvZiB0aGUgc3RydWN0ICAgICAgICAgICAgICAgKi8KKwltZW1jcHlfZnJvbWlvKGhkciwgaGRyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKwloZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7CisjZWxzZQorCSgodW5zaWduZWQgaW50KiloZHIpWzBdID0gcmVhZGwoaGRyX3N0YXJ0KTsKKyNlbmRpZgorfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0IGFyZSBlYXN5IG9uIHNoYXJlZCBtZW1vcnkgZXRoZXJjYXJkcywgYW5kIHRyaXZpYWwKKyAgIG9uIHRoZSBXZXN0ZXJuIGRpZ2l0YWwgY2FyZCB3aGVyZSB0aGVyZSBpcyBubyBjaG9pY2Ugb2YgaG93IHRvIGRvIGl0LgorICAgVGhlIG9ubHkgY29tcGxpY2F0aW9ucyBhcmUgdGhhdCB0aGUgcmluZyBidWZmZXIgd3JhcHMsIGFuZCBuZWVkIHRvIG1hcAorICAgc3dpdGNoIGJldHdlZW4gOC0gYW5kIDE2LWJpdCBtb2Rlcy4gKi8KKworc3RhdGljIHZvaWQKK3dkX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCWludCB3ZF9jbWRyZWcgPSBkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQ7IC8qIFdEX0NNRFJFRyAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmluZ19vZmZzZXQgLSAoV0RfU1RBUlRfUEc8PDgpOworCXZvaWQgX19pb21lbSAqeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyBvZmZzZXQ7CisKKwlpZiAob2Zmc2V0ICsgY291bnQgPiBlaV9zdGF0dXMucHJpdikgeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnByaXYgLSBvZmZzZXQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB4ZmVyX3N0YXJ0LCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBlaV9zdGF0dXMubWVtICsgVFhfUEFHRVMgKiAyNTYsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCisJCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCB4ZmVyX3N0YXJ0LCBjb3VudCwgMCk7CisJfQorCisJLyogVHVybiBvZmYgMTYgYml0IGFjY2VzcyBzbyB0aGF0IHJlYm9vdCB3b3Jrcy4JIElTQSBicmFpbi1kYW1hZ2UgKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJb3V0YihlaV9zdGF0dXMucmVnNSwgd2RfY21kcmVnK1dEX0NNRFJFRzUpOworfQorCitzdGF0aWMgdm9pZAord2RfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCWludCBzdGFydF9wYWdlKQoreworCWludCB3ZF9jbWRyZWcgPSBkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQ7IC8qIFdEX0NNRFJFRyAqLworCXZvaWQgX19pb21lbSAqc2htZW0gPSBlaV9zdGF0dXMubWVtICsgKChzdGFydF9wYWdlIC0gV0RfU1RBUlRfUEcpPDw4KTsKKworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKwkJLyogVHVybiBvbiBhbmQgb2ZmIDE2IGJpdCBhY2Nlc3Mgc28gdGhhdCByZWJvb3Qgd29ya3MuICovCisJCW91dGIoSVNBMTYgfCBlaV9zdGF0dXMucmVnNSwgd2RfY21kcmVnK1dEX0NNRFJFRzUpOworCQltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7CisJCW91dGIoZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZytXRF9DTURSRUc1KTsKKwl9IGVsc2UKKwkJbWVtY3B5X3RvaW8oc2htZW0sIGJ1ZiwgY291bnQpOworfQorCisKK3N0YXRpYyBpbnQKK3dkX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHdkX2NtZHJlZyA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisJZWlfY2xvc2UoZGV2KTsKKworCS8qIENoYW5nZSBmcm9tIDE2LWJpdCB0byA4LWJpdCBzaGFyZWQgbWVtb3J5IHNvIHJlYm9vdCB3b3Jrcy4gKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJb3V0YihlaV9zdGF0dXMucmVnNSwgd2RfY21kcmVnICsgV0RfQ01EUkVHNSApOworCisJLyogQW5kIGRpc2FibGUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisJb3V0YihlaV9zdGF0dXMucmVnMCAmIH5XRF9NRU1FTkIsIHdkX2NtZHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworDAorI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfV0RfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIHdkIGNhcmRzIHBlciBtb2R1bGUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkW01BWF9XRF9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9XRF9DQVJEU107CitzdGF0aWMgaW50IGlycVtNQVhfV0RfQ0FSRFNdOworc3RhdGljIGludCBtZW1bTUFYX1dEX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtX2VuZFtNQVhfV0RfQ0FSRFNdOwkvKiBmb3Igbm9uIHN0ZC4gbWVtIHNpemUgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtX2VuZCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIChpZ25vcmVkIGZvciBQdXJlRGF0YSBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbSwgIm1lbW9yeSBiYXNlIGFkZHJlc3MoZXMpKGlnbm9yZWQgZm9yIFB1cmVEYXRhIGJvYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtX2VuZCwgIm1lbW9yeSBlbmQgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVNBIFdlc3Rlcm4gRGlnaXRhbCB3ZDgwMDMvd2Q4MDEzIDsgU01DIEVsaXRlLCBFbGl0ZTE2IGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGlzIGlzIHNldCB1cCBzbyB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0b3Byb2JlIHRha2VzIHBsYWNlIHBlciBjYWxsLgorSVNBIGRldmljZSBhdXRvcHJvYmVzIG9uIGEgcnVubmluZyBtYWNoaW5lIGFyZSBub3QgcmVjb21tZW5kZWQuICovCitpbnQKK2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgdGhpc19kZXYsIGZvdW5kID0gMDsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9XRF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAid2QuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fZW5kID0gbWVtX2VuZFt0aGlzX2Rldl07CisJCWlmIChkb193ZF9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X3dkW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2QuYzogTm8gd2Q4MHgzIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfV0RfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl93ZFt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFhMTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMCwwICsxLDM2NSBAQAorIworIyBXaXJlbGVzcyBMQU4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCitjb25maWcgTkVUX1JBRElPCisJYm9vbCAiV2lyZWxlc3MgTEFOIGRyaXZlcnMgKG5vbi1oYW1yYWRpbykgJiBXaXJlbGVzcyBFeHRlbnNpb25zIgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHdpcmVsZXNzIExBTnMgYW5kIGV2ZXJ5dGhpbmcgaGF2aW5nIHRvIGRvIHdpdGggcmFkaW8sCisJICBidXQgbm90IHdpdGggYW1hdGV1ciByYWRpbyBvciBGTSBicm9hZGNhc3RpbmcuCisKKwkgIFNheWluZyBZIGhlcmUgYWxzbyBlbmFibGVzIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIChjcmVhdGVzCisJICAvcHJvYy9uZXQvd2lyZWxlc3MgYW5kIGVuYWJsZXMgaXdjb25maWcgYWNjZXNzKS4gVGhlIFdpcmVsZXNzCisJICBFeHRlbnNpb24gaXMgYSBnZW5lcmljIEFQSSBhbGxvd2luZyBhIGRyaXZlciB0byBleHBvc2UgdG8gdGhlIHVzZXIKKwkgIHNwYWNlIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXRpc3RpY3Mgc3BlY2lmaWMgdG8gY29tbW9uIFdpcmVsZXNzIExBTnMuCisJICBUaGUgYmVhdXR5IG9mIGl0IGlzIHRoYXQgYSBzaW5nbGUgc2V0IG9mIHRvb2wgY2FuIHN1cHBvcnQgYWxsIHRoZQorCSAgdmFyaWF0aW9ucyBvZiBXaXJlbGVzcyBMQU5zLCByZWdhcmRsZXNzIG9mIHRoZWlyIHR5cGUgKGFzIGxvbmcgYXMKKwkgIHRoZSBkcml2ZXIgc3VwcG9ydHMgV2lyZWxlc3MgRXh0ZW5zaW9uKS4gQW5vdGhlciBhZHZhbnRhZ2UgaXMgdGhhdAorCSAgdGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgY2hhbmdlZCBvbiB0aGUgZmx5IHdpdGhvdXQgcmVzdGFydGluZyB0aGUKKwkgIGRyaXZlciAob3IgTGludXgpLiBJZiB5b3Ugd2lzaCB0byB1c2UgV2lyZWxlc3MgRXh0ZW5zaW9ucyB3aXRoCisJICB3aXJlbGVzcyBQQ01DSUEgKFBDLSkgY2FyZHMsIHlvdSBuZWVkIHRvIHNheSBZIGhlcmU7IHlvdSBjYW4gZmV0Y2gKKwkgIHRoZSB0b29scyBmcm9tCisJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KKworCSAgU29tZSB1c2VyLWxldmVsIGRyaXZlcnMgZm9yIHNjYXJhYiBkZXZpY2VzIHdoaWNoIGRvbid0IHJlcXVpcmUKKwkgIHNwZWNpYWwga2VybmVsIHN1cHBvcnQgYXJlIGF2YWlsYWJsZSBmcm9tCisJICA8ZnRwOi8vc2hhZG93LmNhYmkubmV0L3B1Yi9MaW51eC8+LgorCisjIE5vdGUgOiB0aGUgY2FyZHMgYXJlIG9ic29sZXRlIChjYW4ndCBidXkgdGhlbSBhbnltb3JlKSwgYnV0IHRoZSBkcml2ZXJzCisjIGFyZSBub3QsIGFzIHBlb3BsZSBhcmUgc3RpbGwgdXNpbmcgdGhlbS4uLgorY29tbWVudCAiT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElORVQgfHwgSVNBIHx8IFBDTUNJQSkKKworY29uZmlnIFNUUklQCisJdHJpc3RhdGUgIlNUUklQIChNZXRyaWNvbSBzdGFybW9kZSByYWRpbyBJUCkiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSU5FVAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGlmIHlvdSBoYXZlIGEgTWV0cmljb20gcmFkaW8gYW5kIGludGVuZCB0byB1c2UgU3Rhcm1vZGUgUmFkaW8KKwkgIElQLiBTVFJJUCBpcyBhIHJhZGlvIHByb3RvY29sIGRldmVsb3BlZCBmb3IgdGhlIE1vc3F1aXRvTmV0IHByb2plY3QKKwkgIChvbiB0aGUgV1dXIGF0IDxodHRwOi8vbW9zcXVpdG9uZXQuc3RhbmZvcmQuZWR1Lz4pIHRvIHNlbmQgSW50ZXJuZXQKKwkgIHRyYWZmaWMgdXNpbmcgTWV0cmljb20gcmFkaW9zLiAgTWV0cmljb20gcmFkaW9zIGFyZSBzbWFsbCwgYmF0dGVyeQorCSAgcG93ZXJlZCwgMTAwa2JpdC9zZWMgcGFja2V0IHJhZGlvIHRyYW5zY2VpdmVycywgYWJvdXQgdGhlIHNpemUgYW5kCisJICB3ZWlnaHQgb2YgYSBjZWxsdWxhciB0ZWxlcGhvbmUuIChZb3UgbWF5IGFsc28gaGF2ZSBoZWFyZCB0aGVtIGNhbGxlZAorCSAgIk1ldHJpY29tIG1vZGVtcyIgYnV0IHdlIGF2b2lkIHRoZSB0ZXJtICJtb2RlbSIgYmVjYXVzZSBpdCBtaXNsZWFkcworCSAgbWFueSBwZW9wbGUgaW50byB0aGlua2luZyB0aGF0IHlvdSBjYW4gcGx1ZyBhIE1ldHJpY29tIG1vZGVtIGludG8gYQorCSAgcGhvbmUgbGluZSBhbmQgdXNlIGl0IGFzIGEgbW9kZW0uKQorCisJICBZb3UgY2FuIHVzZSBTVFJJUCBvbiBhbnkgTGludXggbWFjaGluZSB3aXRoIGEgc2VyaWFsIHBvcnQsIGFsdGhvdWdoCisJICBpdCBpcyBvYnZpb3VzbHkgbW9zdCB1c2VmdWwgZm9yIHBlb3BsZSB3aXRoIGxhcHRvcCBjb21wdXRlcnMuIElmIHlvdQorCSAgdGhpbmsgeW91IG1pZ2h0IGdldCBhIE1ldHJpY29tIHJhZGlvIGluIHRoZSBmdXR1cmUsIHRoZXJlIGlzIG5vIGhhcm0KKwkgIGluIHNheWluZyBZIHRvIFNUUklQIG5vdywgZXhjZXB0IHRoYXQgaXQgbWFrZXMgdGhlIGtlcm5lbCBhIGJpdAorCSAgYmlnZ2VyLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHN0cmlwLgorCitjb25maWcgQVJMQU4KKwl0cmlzdGF0ZSAiQWlyb25ldCBBcmxhbiA2NTUgJiBJQzIyMDAgRFMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBJU0EgJiYgITY0QklUCisJLS0taGVscC0tLQorCSAgQWlyb25ldCBtYWtlcyBBcmxhbiwgYSBjbGFzcyBvZiB3aXJlbGVzcyBMQU4gYWRhcHRlcnMuIFRoZXNlIHVzZSB0aGUKKwkgIHd3dy5UZWx4b24uY29tIGNoaXAsIHdoaWNoIGlzIGFsc28gdXNlZCBvbiBzZXZlcmFsIHNpbWlsYXIgY2FyZHMuCisJICBUaGlzIGRyaXZlciBpcyB0ZXN0ZWQgb24gdGhlIDY1NSBhbmQgSUMyMjAwIHNlcmllcyBjYXJkcy4gTG9vayBhdAorCSAgPGh0dHA6Ly93d3cueWxlbnVybWUuZWUvfmVsbWVyLzY1NS8+IGZvciB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLgorCisJICBUaGUgZHJpdmVyIGlzIGJ1aWx0IGFzIHR3byBtb2R1bGVzLCBhcmxhbiBhbmQgYXJsYW4tcHJvYy4gVGhlIGxhdHRlcgorCSAgaXMgdGhlIC9wcm9jIGludGVyZmFjZSBhbmQgaXMgbm90IG5lZWRlZCBtb3N0IG9mIHRpbWUuCisKKwkgIE9uIHNvbWUgY29tcHV0ZXJzIHRoZSBjYXJkIGVuZHMgdXAgaW4gbm9uLXZhbGlkIHN0YXRlIGFmdGVyIHNvbWUKKwkgIHRpbWUuIFVzZSBhIHBpbmctcmVzZXQgc2NyaXB0IHRvIGNsZWFyIGl0LgorCitjb25maWcgV0FWRUxBTgorCXRyaXN0YXRlICJBVCZUL0x1Y2VudCBvbGQgV2F2ZUxBTiAmIERFQyBSb2FtQWJvdXQgRFMgSVNBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBCisJLS0taGVscC0tLQorCSAgVGhlIEx1Y2VudCBXYXZlTEFOIChmb3JtZXJseSBOQ1IgYW5kIEFUJlQ7IG9yIERFQyBSb2FtQWJvdXQgRFMpIGlzCisJICBhIFJhZGlvIExBTiAod2lyZWxlc3MgRXRoZXJuZXQtbGlrZSBMb2NhbCBBcmVhIE5ldHdvcmspIHVzaW5nIHRoZQorCSAgcmFkaW8gZnJlcXVlbmNpZXMgOTAwIE1IeiBhbmQgMi40IEdIei4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydCB0aGUgSVNBIHZlcnNpb24gb2YgdGhlIFdhdmVMQU4gY2FyZC4gIEEgc2VwYXJhdGUKKwkgIGRyaXZlciBmb3IgdGhlIFBDTUNJQSAoUEMtY2FyZCkgaGFyZHdhcmUgaXMgYXZhaWxhYmxlIGluIERhdmlkCisJICBIaW5kcycgcGNtY2lhLWNzIHBhY2thZ2UgKHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+CisJICBmb3IgbG9jYXRpb24pLgorCisJICBJZiB5b3Ugd2FudCB0byB1c2UgYW4gSVNBIFdhdmVMQU4gY2FyZCB1bmRlciBMaW51eCwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFNvbWUgbW9yZSBzcGVjaWZpYworCSAgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2F2ZWxhbi50eHQ+IGFuZCBpbiB0aGUgc291cmNlIGNvZGUKKwkgIDxmaWxlOmRyaXZlcnMvbmV0L3dhdmVsYW4ucC5oPi4KKworCSAgWW91IHdpbGwgYWxzbyBuZWVkIHRoZSB3aXJlbGVzcyB0b29scyBwYWNrYWdlIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KKwkgIFBsZWFzZSByZWFkIHRoZSBtYW4gcGFnZXMgY29udGFpbmVkIHRoZXJlaW4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHdhdmVsYW4uCisKK2NvbmZpZyBQQ01DSUFfV0FWRUxBTgorCXRyaXN0YXRlICJBVCZUL0x1Y2VudCBvbGQgV2F2ZUxBTiBQY21jaWEgd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEFUJlQvTHVjZW50IFdhdmVsYW4gUENNQ0lBCisJICAoUEMtY2FyZCkgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuICBUaGlzCisJICBkcml2ZXIgaXMgZm9yIHRoZSBub24tSUVFRS04MDIuMTEgV2F2ZWxhbiBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgd2F2ZWxhbl9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfTkVUV0FWRQorCXRyaXN0YXRlICJYaXJjb20gTmV0d2F2ZSBBaXJTdXJmZXIgUGNtY2lhIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgUENNQ0lBIChQQy1jYXJkKQorCSAgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIG5ldHdhdmVfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb21tZW50ICJXaXJlbGVzcyA4MDIuMTEgRnJlcXVlbmN5IEhvcHBpbmcgY2FyZHMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKworY29uZmlnIFBDTUNJQV9SQVlDUworCXRyaXN0YXRlICJBdmlhdG9yL1JheXRoZW9uIDIuNE1IeiB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gQXZpYXRvci9SYXl0aGVvbiBQQ01DSUEKKwkgIChQQy1jYXJkKSB3aXJlbGVzcyBFdGhlcm5ldCBuZXR3b3JraW5nIGNhcmQgdG8geW91ciBjb21wdXRlci4KKwkgIFBsZWFzZSByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9yYXlfY3MudHh0PiBmb3IKKwkgIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHJheV9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIldpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJU0EgfHwgUENJIHx8IFBQQ19QTUFDIHx8IFBDTUNJQSkKKworY29uZmlnIEFJUk8KKwl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBJU0EgYW5kIFBDSSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBJU0EgJiYgKFBDSSB8fCBCUk9LRU4pCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIHRvIHN1cHBvcnQgQ2lzY28vQWlyb25ldCBJU0EgYW5kCisJICBQQ0kgODAyLjExIHdpcmVsZXNzIGNhcmRzLgorCSAgSXQgc3VwcG9ydHMgdGhlIG5ldyA4MDIuMTFiIGNhcmRzIGZyb20gQ2lzY28gKENpc2NvIDM0WCwgQ2lzY28gMzVYCisJICAtIHdpdGggb3Igd2l0aG91dCBlbmNyeXB0aW9uKSBhcyB3ZWxsIGFzIGNhcmQgYmVmb3JlIHRoZSBDaXNjbworCSAgYXF1aXNpdGlvbiAoQWlyb25ldCA0NTAwLCBBaXJvbmV0IDQ4MDAsIEFpcm9uZXQgNDgwMEIpLgorCisJICBUaGlzIGRyaXZlciBzdXBwb3J0IGJvdGggdGhlIHN0YW5kYXJkIExpbnV4IFdpcmVsZXNzIEV4dGVuc2lvbnMKKwkgIGFuZCBDaXNjbyBwcm9wcmlldGFyeSBBUEksIHNvIGJvdGggdGhlIExpbnV4IFdpcmVsZXNzIFRvb2xzIGFuZCB0aGUKKwkgIENpc2NvIExpbnV4IHV0aWxpdGllcyBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGNhcmQuCisKKwkgIFRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGFuZCB3aWxsIGJlIG5hbWVkICJhaXJvIi4KKworY29uZmlnIEhFUk1FUworCXRyaXN0YXRlICJIZXJtZXMgY2hpcHNldCA4MDIuMTFiIHN1cHBvcnQgKE9yaW5vY28vUHJpc20yL1N5bWJvbCkiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKFBQQ19QTUFDIHx8IFBDSSB8fCBQQ01DSUEpCisJLS0taGVscC0tLQorCSAgQSBkcml2ZXIgZm9yIDgwMi4xMWIgd2lyZWxlc3MgY2FyZHMgYmFzZWQgYmFzZWQgb24gdGhlICJIZXJtZXMiIG9yCisJICBJbnRlcnNpbCBIRkEzODR4IChQcmlzbSAyKSBNQUMgY29udHJvbGxlci4gIFRoaXMgaW5jbHVkZXMgdGhlIHZhc3QKKwkgIG1ham9yaXR5IG9mIHRoZSBQQ01DSUEgODAyLjExYiBjYXJkcyAod2hpY2ggYXJlIG5lYXJseSBhbGwgcmViYWRnZXMpCisJICAtIGV4Y2VwdCBmb3IgdGhlIENpc2NvL0Fpcm9uZXQgY2FyZHMuICBDYXJkcyBzdXBwb3J0ZWQgaW5jbHVkZSB0aGUKKwkgIEFwcGxlIEFpcnBvcnQgKG5vdCBhIFBDTUNJQSBjYXJkKSwgV2F2ZWxhbklFRUUvT3Jpbm9jbywKKwkgIENhYmxldHJvbi9FbnRlcmFTeXMgUm9hbWFib3V0LCBFTFNBIEFpckxhbmNlciwgTUVMQ08gQnVmZmFsbywgQXZheWEsCisJICBJQk0gSGlnaCBSYXRlIFdpcmVsZXNzLCBGYXJyYWxvbiBTeXlsaW5lLCBTYW1zdW5nIE1hZ2ljTEFOLCBOZXRnZWFyCisJICBNQTQwMSwgTGlua1N5cyBXUEMtMTEsIEQtTGluayBEV0wtNjUwLCAzQ29tIEFpckNvbm5lY3QsIEludGVsCisJICBQUk8vV2lyZWxlc3MsIGFuZCBTeW1ib2wgU3BlY3RydW0yNCBIaWdoIFJhdGUgYW1vbmdzdCBvdGhlcnMuCisKKwkgIFRoaXMgb3B0aW9uIGluY2x1ZGVzIHRoZSBndXRzIG9mIHRoZSBkcml2ZXIsIGJ1dCBpbiBvcmRlciB0bworCSAgYWN0dWFsbHkgdXNlIGEgY2FyZCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQQorCSAgSGVybWVzIGNhcmRzLCBQTFg5MDUyIGJhc2VkIFBDSSBhZGFwdG9ycyBvciB0aGUgQXBwbGUgQWlycG9ydCBiZWxvdy4KKworCSAgWW91IHdpbGwgYWxzbyB2ZXJ5IGxpa2VseSBhbHNvIG5lZWQgdGhlIFdpcmVsZXNzIFRvb2xzIGluIG9yZGVyIHRvCisJICBjb25maWd1cmUgeW91ciBjYXJkIGFuZCB0aGF0IC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMgd29ya3MgOgorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4KKworY29uZmlnIEFQUExFX0FJUlBPUlQKKwl0cmlzdGF0ZSAiQXBwbGUgQWlycG9ydCBzdXBwb3J0IChidWlsdC1pbikiCisJZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBIRVJNRVMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEFpcnBvcnQgODAyLjExYiB3aXJlbGVzcyBFdGhlcm5ldCBoYXJkd2FyZQorCSAgYnVpbHQgaW50byB0aGUgTWFjaW50b3NoIGlCb29rIGFuZCBvdGhlciByZWNlbnQgUG93ZXJQQy1iYXNlZAorCSAgTWFjaW50b3NoIG1hY2hpbmVzLiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgTHVjZW50IE9yaW5vY28gY2FyZCB3aXRoIAorCSAgYSBub24tc3RhbmRhcmQgaW50ZXJmYWNlCisKK2NvbmZpZyBQTFhfSEVSTUVTCisJdHJpc3RhdGUgIkhlcm1lcyBpbiBQTFg5MDUyIGJhc2VkIFBDSSBhZGFwdG9yIHN1cHBvcnQgKE5ldGdlYXIgTUEzMDEgZXRjLikgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEgY2FyZHMgc3VwcG9ydGVkIGJ5IHRoZSAiSGVybWVzIiAoYWthCisJICBvcmlub2NvKSBkcml2ZXIgd2hlbiB1c2VkIGluIFBMWDkwNTIgYmFzZWQgUENJIGFkYXB0b3JzLiAgVGhlc2UKKwkgIGFkYXB0b3JzIGFyZSBub3QgYSBmdWxsIFBDTUNJQSBjb250cm9sbGVyIGJ1dCBhY3QgYXMgYSBtb3JlIGxpbWl0ZWQKKwkgIFBDSSA8LT4gUENNQ0lBIGJyaWRnZS4gIFNldmVyYWwgdmVuZG9ycyBzZWxsIHN1Y2ggYWRhcHRvcnMgc28gdGhhdAorCSAgODAyLjExYiBQQ01DSUEgY2FyZHMgY2FuIGJlIHVzZWQgaW4gZGVza3RvcCBtYWNoaW5lcy4gIFRoZSBOZXRnZWFyCisJICBNQTMwMSBpcyBzdWNoIGFuIGFkYXB0b3IuCisKKwkgIFN1cHBvcnQgZm9yIHRoZXNlIGFkYXB0b3JzIGlzIHNvIGZhciBzdGlsbCBpbmNvbXBsZXRlIGFuZCBidWdneS4KKwkgIFlvdSBoYXZlIGJlZW4gd2FybmVkLgorCitjb25maWcgVE1EX0hFUk1FUworCXRyaXN0YXRlICJIZXJtZXMgaW4gVE1ENzE2MCBiYXNlZCBQQ0kgYWRhcHRvciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBIGNhcmRzIHN1cHBvcnRlZCBieSB0aGUgIkhlcm1lcyIgKGFrYQorCSAgb3Jpbm9jbykgZHJpdmVyIHdoZW4gdXNlZCBpbiBUTUQ3MTYwIGJhc2VkIFBDSSBhZGFwdG9ycy4gIFRoZXNlCisJICBhZGFwdG9ycyBhcmUgbm90IGEgZnVsbCBQQ01DSUEgY29udHJvbGxlciBidXQgYWN0IGFzIGEgbW9yZSBsaW1pdGVkCisJICBQQ0kgPC0+IFBDTUNJQSBicmlkZ2UuICBTZXZlcmFsIHZlbmRvcnMgc2VsbCBzdWNoIGFkYXB0b3JzIHNvIHRoYXQKKwkgIDgwMi4xMWIgUENNQ0lBIGNhcmRzIGNhbiBiZSB1c2VkIGluIGRlc2t0b3AgbWFjaGluZXMuCisKKwkgIFN1cHBvcnQgZm9yIHRoZXNlIGFkYXB0b3JzIGlzIHNvIGZhciBzdGlsbCBpbmNvbXBsZXRlIGFuZCBidWdneS4KKwkgIFlvdSBoYXZlIGJlZW4gd2FybmVkLgorCitjb25maWcgUENJX0hFUk1FUworCXRyaXN0YXRlICJQcmlzbSAyLjUgUENJIDgwMi4xMWIgYWRhcHRvciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSA4MDIuMTFiIHdpcmVsZXNzIE5JQ3MgYmFzZWQgb24KKwkgIHRoZSBQcmlzbSAyLjUgY2hpcHNldC4gIFRoZXNlIGFyZSB0cnVlIFBDSSBjYXJkcywgbm90IHRoZSA4MDIuMTFiCisJICBQQ01DSUEgY2FyZHMgYnVuZGxlZCB3aXRoIFBDSTwtPlBDTUNJQSBhZGFwdG9ycyB3aGljaCBhcmUgYWxzbworCSAgY29tbW9uLiAgU29tZSBvZiB0aGUgYnVpbHQtaW4gd2lyZWxlc3MgYWRhcHRvcnMgaW4gbGFwdG9wcyBhcmUgb2YKKwkgIHRoaXMgdmFyaWV0eS4KKworY29uZmlnIEFUTUVMCisgICAgICB0cmlzdGF0ZSAiQXRtZWwgYXQ3NmM1MHggY2hpcHNldCAgODAyLjExYiBzdXBwb3J0IgorICAgICAgZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgRVhQRVJJTUVOVEFMCisgICAgICBzZWxlY3QgRldfTE9BREVSCisgICAgICBzZWxlY3QgQ1JDMzIKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgIEEgZHJpdmVyIDgwMi4xMWIgd2lyZWxlc3MgY2FyZHMgYmFzZWQgb24gdGhlIEF0bWVsIGZhc3Qtdm5ldAorICAgICAgICBjaGlwcy4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgc3RhbmRhcmQgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucy4gCisgCisgICAgICAgIE1hbnkgIGNhcmRzIGJhc2VkIG9uIHRoaXMgY2hpcHNldCBkbyBub3QgaGF2ZSBmbGFzaCBtZW1vcnkKKyAgICAgICAgYW5kIG5lZWQgdGhlaXIgZmlybXdhcmUgbG9hZGVkIGF0IHN0YXJ0LXVwLiBJZiB5b3VycyBpcyAKKyAgICAgICAgb25lIG9mIHRoZXNlLCB5b3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUgYSBmaXJtd2FyZSBpbWFnZQorICAgICAgICB0byBiZSBsb2FkZWQgaW50byB0aGUgY2FyZCBieSB0aGUgZHJpdmVyLiBUaGUgQXRtZWwKKyAgICAgICAgZmlybXdhcmUgcGFja2FnZSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCisgICAgICAgIDxodHRwOi8vd3d3LnRoZWtlbGxleXMub3JnLnVrL2F0bWVsPgorCitjb25maWcgUENJX0FUTUVMCisgICAgICB0cmlzdGF0ZSAiQXRtZWwgYXQ3NmM1MDYgUENJIGNhcmRzIgorICAgICAgZGVwZW5kcyBvbiBBVE1FTCAmJiBQQ0kKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ0kgYW5kIG1pbmktUENJIGNhcmRzIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIEF0bWVsIGF0NzZjNTA2IGNoaXAuCisKKyMgSWYgUGNtY2lhIGlzIGNvbXBpbGVkIGluLCBvZmZlciBQY21jaWEgY2FyZHMuLi4KK2NvbW1lbnQgIldpcmVsZXNzIDgwMi4xMWIgUGNtY2lhL0NhcmRidXMgY2FyZHMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKworY29uZmlnIFBDTUNJQV9IRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIFBDTUNJQSBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBICYmIEhFUk1FUworCS0tLWhlbHAtLS0KKwkgIEEgZHJpdmVyIGZvciAiSGVybWVzIiBjaGlwc2V0IGJhc2VkIFBDTUNJQSB3aXJlbGVzcyBhZGFwdG9ycywgc3VjaAorCSAgYXMgdGhlIEx1Y2VudCBXYXZlbGFuSUVFRS9Pcmlub2NvIGNhcmRzIGFuZCB0aGVpciBPRU0gKENhYmxldHJvbi8KKwkgIEVudGVyYVN5cyBSb2FtQWJvdXQgODAyLjExLCBFTFNBIEFpcmxhbmNlciwgTWVsY28gQnVmZmFsbyBhbmQKKwkgIG90aGVycykuICBJdCBzaG91bGQgYWxzbyBiZSB1c2FibGUgb24gdmFyaW91cyBQcmlzbSBJSSBiYXNlZCBjYXJkcworCSAgc3VjaCBhcyB0aGUgTGlua3N5cywgRC1MaW5rIGFuZCBGYXJhbGxvbiBTa3lsaW5lLiAgSXQgc2hvdWxkIGFsc28KKwkgIHdvcmsgb24gU3ltYm9sIGNhcmRzIHN1Y2ggYXMgdGhlIDNDb20gQWlyQ29ubmVjdCBhbmQgRXJpY3Nzb24gV0xBTi4KKworCSAgVG8gdXNlIHlvdXIgUEMtY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIERhdmlkCisJICBIaW5kcycgcGNtY2lhLWNzIHBhY2thZ2UgKHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+CisJICBmb3IgbG9jYXRpb24pLiAgWW91IGFsc28gd2FudCB0byBjaGVjayBvdXQgdGhlIFBDTUNJQS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFlvdSB3aWxsIGFsc28gdmVyeSBsaWtlbHkgYWxzbyBuZWVkIHRoZSBXaXJlbGVzcyBUb29scyBpbiBvcmRlciB0bworCSAgY29uZmlndXJlIHlvdXIgY2FyZCBhbmQgdGhhdCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIHdvcmtzOgorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisKK2NvbmZpZyBBSVJPX0NTCisJdHJpc3RhdGUgIkNpc2NvL0Fpcm9uZXQgMzRYLzM1WC80NTAwLzQ4MDAgUENNQ0lBIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlciB0byBzdXBwb3J0IENpc2NvL0Fpcm9uZXQgUENNQ0lBCisJICA4MDIuMTEgd2lyZWxlc3MgY2FyZHMuICBUaGlzIGRyaXZlciBpcyB0aGUgc2FtZSBhcyB0aGUgQWlyb25ldAorCSAgZHJpdmVyIHBhcnQgb2YgdGhlIExpbnV4IFBjbWNpYSBwYWNrYWdlLgorCSAgSXQgc3VwcG9ydHMgdGhlIG5ldyA4MDIuMTFiIGNhcmRzIGZyb20gQ2lzY28gKENpc2NvIDM0WCwgQ2lzY28gMzVYCisJICAtIHdpdGggb3Igd2l0aG91dCBlbmNyeXB0aW9uKSBhcyB3ZWxsIGFzIGNhcmQgYmVmb3JlIHRoZSBDaXNjbworCSAgYXF1aXNpdGlvbiAoQWlyb25ldCA0NTAwLCBBaXJvbmV0IDQ4MDAsIEFpcm9uZXQgNDgwMEIpLiBJdCBhbHNvCisJICBzdXBwb3J0cyBPRU0gb2YgQ2lzY28gc3VjaCBhcyB0aGUgREVMTCBUcnVlTW9iaWxlIDQ4MDAgYW5kIFhpcmNvbQorCSAgODAyLjExYiBjYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydCBib3RoIHRoZSBzdGFuZGFyZCBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zCisJICBhbmQgQ2lzY28gcHJvcHJpZXRhcnkgQVBJLCBzbyBib3RoIHRoZSBMaW51eCBXaXJlbGVzcyBUb29scyBhbmQgdGhlCisJICBDaXNjbyBMaW51eCB1dGlsaXRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjYXJkLgorCisJICBUbyB1c2UgeW91ciBQQy1jYXJkcywgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20gRGF2aWQKKwkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KKwkgIGZvciBsb2NhdGlvbikuICBZb3UgYWxzbyB3YW50IHRvIGNoZWNrIG91dCB0aGUgUENNQ0lBLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworY29uZmlnIFBDTUNJQV9BVE1FTAorCXRyaXN0YXRlICJBdG1lbCBhdDc2YzUwMi9hdDc2YzUwNCBQQ01DSUEgY2FyZHMiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgQVRNRUwgJiYgUENNQ0lBCisJc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEgY2FyZHMgY29udGFpbmluZyB0aGUKKwkgIEF0bWVsIGF0NzZjNTAyIGFuZCBhdDc2YzUwNCBjaGlwcy4KKworY29uZmlnIFBDTUNJQV9XTDM1MDEKKyAgICAgIHRyaXN0YXRlICJQbGFuZXQgV0wzNTAxIFBDTUNJQSBjYXJkcyIKKyAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTCAmJiBQQ01DSUEKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBBIGRyaXZlciBmb3IgV0wzNTAxIFBDTUNJQSA4MDIuMTEgd2lyZWxlc3MgY2FyZHMgbWFkZSBieSBQbGFuZXQuCisJIEl0IGhhcyBiYXNpYyBzdXBwb3J0IGZvciBMaW51eCB3aXJlbGVzcyBleHRlbnNpb25zIGFuZCBpbml0aWFsCisJIG1pY3JvIHN1cHBvcnQgZm9yIGV0aHRvb2wuCisKK2NvbW1lbnQgIlByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENJCitjb25maWcgUFJJU001NAorCXRyaXN0YXRlICdJbnRlcnNpbCBQcmlzbSBHVC9EdWV0dGUvSW5kaWdvIFBDSS9DYXJkYnVzJyAKKwlkZXBlbmRzIG9uIFBDSSAmJiBORVRfUkFESU8gJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZXX0xPQURFUgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBQQ0kgYW5kIENhcmRidXMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBjaGlwc2V0IGJhc2VkIGNhcmRzOgorCisJICBJU0wzODgwIC0gUHJpc20gR1QgICAgICAgICAgICA4MDIuMTEgYi9nCisJICBJU0wzODc3IC0gUHJpc20gSW5kaWdvICAgICAgICA4MDIuMTEgYQorCSAgSVNMMzg5MCAtIFByaXNtIER1ZXR0ZSAgICAgICAgODAyLjExIGEvYi9nCisJICAKKwkgIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhcmRzIHZpc2l0IDxodHRwOi8vcHJpc201NC5vcmc+LgorCSAgSGVyZSBpcyB0aGUgbGF0ZXN0IGNvbmZpcm1lZCBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkczoKKworCSAgM2NvbSBPZmZpY2VDb25uZWN0IDExZyBDYXJkYnVzIENhcmQgYWthIDNDUldFMTU0RzcyCisJICBBbGxuZXQgQUxMMDI3MSBQQ0kgQ2FyZAorCSAgQ29tcGV4IFdMNTRHIENhcmRidXMgQ2FyZAorCSAgQ29yZWdhIENHLVdMQ0I1NEdUIENhcmRidXMgQ2FyZAorCSAgRC1MaW5rIEFpciBQbHVzIFh0cmVtZSBHIEExIENhcmRidXMgQ2FyZCBha2EgRFdMLWc2NTAKKwkgIEktTyBEYXRhIFdOLUc1NC9DQiBDYXJkYnVzIENhcmQKKwkgIEtvYmlzaGkgWEctMzAwIGFrYSBaLUNvbSBDYXJkYnVzIENhcmQKKwkgIE5ldGdlYXIgV0c1MTEgQ2FyZGJ1cyBDYXJkCisJICBPdmlzbGluayBXTC01NDAwUENJIFBDSSBDYXJkCisJICBQZWFiaXJkIFdMRy1QQ0kgUENJIENhcmQKKwkgIFNpdGVjb20gV0wtMTAwaSBDYXJkYnVzIENhcmQKKwkgIFNpdGVjb20gV0wtMTEwaSBQQ0kgQ2FyZAorCSAgU01DMjgwMlcgLSAgICBFWiBDb25uZWN0IGcgMi40R0h6IDU0IE1icHMgV2lyZWxlc3MgUENJIENhcmQKKwkgIFNNQzI4MzVXIC0gICAgRVogQ29ubmVjdCBnIDIuNEdIeiA1NCBNYnBzIFdpcmVsZXNzIENhcmRidXMgQ2FyZAorCSAgU01DMjgzNVctVjIgLSBFWiBDb25uZWN0IGcgMi40R0h6IDU0IE1icHMgV2lyZWxlc3MgQ2FyZGJ1cyBDYXJkCisJICBaLUNvbSBYRy05MDAgUENJIENhcmQKKwkgIFp5eGVsIEctMTAwIENhcmRidXMgQ2FyZAorCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgbmVlZCBhIGZpcm13YXJlIGZpbGUgYXMgd2VsbC4KKwkgIFlvdSB3aWxsIG5lZWQgdG8gY29weSB0aGlzIHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUvaXNsMzg5MC4KKwkgIFlvdSBjYW4gZ2V0IHRoaXMgbm9uLUdQTCdkIGZpcm13YXJlIGZpbGUgZnJvbSB0aGUgUHJpc201NCBwcm9qZWN0IHBhZ2U6CisJICA8aHR0cDovL3ByaXNtNTQub3JnPgorCSAgWW91IHdpbGwgYWxzbyBuZWVkIHRoZSAvZXRjL2hvdHBsdWcvZmlybXdhcmUuYWdlbnQgc2NyaXB0IGZyb20KKwkgIGEgY3VycmVudCBob3RwbHVnIHBhY2thZ2UuCisKKwkgIE5vdGU6IFlvdSBuZWVkIGEgbW90aGVyYm9hcmQgd2l0aCBETUEgc3VwcG9ydCB0byB1c2UgYW55IG9mIHRoZXNlIGNhcmRzIAorCSAgCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCksCisJICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcHJpc201NC5rby4KKworIyB5ZXMsIHRoaXMgd29ya3MgZXZlbiB3aGVuIG5vIGRyaXZlcnMgYXJlIHNlbGVjdGVkCitjb25maWcgTkVUX1dJUkVMRVNTCisJYm9vbAorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJU0EgfHwgUENJIHx8IFBQQ19QTUFDIHx8IFBDTUNJQSkKKwlkZWZhdWx0IHkKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODc4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggV2lyZWxlc3MgbmV0d29yayBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1NUUklQKSArPSBzdHJpcC5vCitvYmotJChDT05GSUdfQVJMQU4pICs9IGFybGFuLm8gCisKK2FybGFuLW9ianMgOj0gYXJsYW4tbWFpbi5vIGFybGFuLXByb2MubworCisjIE9ic29sZXRlIGNhcmRzCitvYmotJChDT05GSUdfV0FWRUxBTikJCSs9IHdhdmVsYW4ubworb2JqLSQoQ09ORklHX1BDTUNJQV9ORVRXQVZFKQkrPSBuZXR3YXZlX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfV0FWRUxBTikJKz0gd2F2ZWxhbl9jcy5vCisKK29iai0kKENPTkZJR19IRVJNRVMpCQkrPSBvcmlub2NvLm8gaGVybWVzLm8KK29iai0kKENPTkZJR19QQ01DSUFfSEVSTUVTKQkrPSBvcmlub2NvX2NzLm8KK29iai0kKENPTkZJR19BUFBMRV9BSVJQT1JUKQkrPSBhaXJwb3J0Lm8KK29iai0kKENPTkZJR19QTFhfSEVSTUVTKQkrPSBvcmlub2NvX3BseC5vCitvYmotJChDT05GSUdfUENJX0hFUk1FUykJKz0gb3Jpbm9jb19wY2kubworb2JqLSQoQ09ORklHX1RNRF9IRVJNRVMpCSs9IG9yaW5vY29fdG1kLm8KKworb2JqLSQoQ09ORklHX0FJUk8pCQkrPSBhaXJvLm8KK29iai0kKENPTkZJR19BSVJPX0NTKQkJKz0gYWlyb19jcy5vIGFpcm8ubworCitvYmotJChDT05GSUdfQVRNRUwpICAgICAgICAgICAgICs9IGF0bWVsLm8KK29iai0kKENPTkZJR19QQ0lfQVRNRUwpICAgICAgICAgKz0gYXRtZWxfcGNpLm8gCitvYmotJChDT05GSUdfUENNQ0lBX0FUTUVMKSAgICAgICs9IGF0bWVsX2NzLm8KKworb2JqLSQoQ09ORklHX1BSSVNNNTQpCQkrPSBwcmlzbTU0LworCisjIDE2LWJpdCB3aXJlbGVzcyBQQ01DSUEgY2xpZW50IGRyaXZlcnMKK29iai0kKENPTkZJR19QQ01DSUFfUkFZQ1MpCSs9IHJheV9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1dMMzUwMSkJKz0gd2wzNTAxX2NzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL1JFQURNRSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzI3NGJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvUkVBRE1FCkBAIC0wLDAgKzEsMjUgQEAKKwlSRUFETUUKKwktLS0tLS0KKworCVRoaXMgZGlyZWN0b3J5IGlzIG1vc3RseSBmb3IgV2lyZWxlc3MgTEFOIGRyaXZlcnMsIGluIHRoZWlyCit2YXJpb3VzIGluY2FybmF0aW9ucyAoSVNBLCBQQ0ksIFBjbWNpYS4uLikuCisJVGhpcyBzZXBhcmF0ZSBkaXJlY3RvcnkgaXMgbmVlZGVkIGJlY2F1c2UgYSBsb3Qgb2YgZHJpdmVyIHdvcmsKK29uIGRpZmZlcmVudCBidXMgKHR5cGljYWxseSBQQ0kgKyBQY21jaWEpIGFuZCBzaGFyZSA5NSUgb2YgdGhlCitjb2RlLiBUaGlzIGFsbG93IHRoZSBjb2RlIGFuZCB0aGUgY29uZmlnIG9wdGlvbnMgdG8gYmUgaW4gb25lIHNpbmdsZQorcGxhY2UgaW5zdGVhZCBvZiBzY2F0dGVyZWQgYWxsIG92ZXIgdGhlIGRyaXZlciB0cmVlLCB3aGljaCBpcyBuZXZlcgorMTAwJSBzYXRpc2ZhY3RvcnkuCisKKwlOb3RlIDogaWYgeW91IHdhbnQgbW9yZSBpbmZvIG9uIHRoZSB0b3BpYyBvZiBXaXJlbGVzcyBMQU5zLAoreW91IGFyZSBraW5kbHkgaW52aXRlZCB0byBoYXZlIGEgbG9vayBhdCB0aGUgV2lyZWxlc3MgSG93dG8gOgorCQlodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4LworCVNvbWUgV2lyZWxlc3MgTEFOIGRyaXZlcnMsIGxpa2Ugb3Jpbm9jb19jcywgcmVxdWlyZSB0aGUgdXNlIG9mCitXaXJlbGVzcyBUb29scyB0byBiZSBjb25maWd1cmVkIDoKKwkJaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sCisKKwlTcGVjaWFsIG5vdGVzIGZvciBkaXN0cmlidXRpb24gbWFpbnRhaW5lcnMgOgorCTEpIHd2bGFuX2NzIHdpbGwgYmUgZGlzY29udGludWVkIHNvb24gaW4gZmF2b3Igb2Ygb3Jpbm9jb19jcworCTIpIFBsZWFzZSBhZGQgV2lyZWxlc3MgVG9vbHMgc3VwcG9ydCBpbiB5b3VyIHNjcmlwdHMKKworCUhhdmUgZnVuLi4uCisKKwlKZWFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5OTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtMCwwICsxLDc2NjcgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWlyb25ldCBkcml2ZXIgZm9yIDQ1MDAgYW5kIDQ4MDAgc2VyaWVzIGNhcmRzCisKKyAgICBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgYm90aCB0aGUgR1BMIHZlcnNpb24gMiBhbmQgQlNEIGxpY2Vuc2VzLgorICAgIEVpdGhlciBsaWNlbnNlIG1heSBiZSB1c2VkLiAgVGhlIHJlc3BlY3RpdmUgbGljZW5zZXMgYXJlIGZvdW5kIGF0CisgICAgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBieSBCZW5qYW1pbiBSZWVkIDxicmVlZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgaW5jbHVkaW5nIHBvcnRpb25zIG9mIHdoaWNoIGNvbWUgZnJvbSB0aGUgQWlyb25ldCBQQzQ1MDAKKyAgICBEZXZlbG9wZXIncyBSZWZlcmVuY2UgTWFudWFsIGFuZCB1c2VkIHdpdGggcGVybWlzc2lvbi4gIENvcHlyaWdodAorICAgIChDKSAxOTk5IEJlbmphbWluIFJlZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgUGVybWlzc2lvbiB0byB1c2UKKyAgICBjb2RlIGluIHRoZSBEZXZlbG9wZXIncyBtYW51YWwgd2FzIGdyYW50ZWQgZm9yIHRoaXMgZHJpdmVyIGJ5CisgICAgQWlyb25ldC4gIE1ham9yIGNvZGUgY29udHJpYnV0aW9ucyB3ZXJlIHJlY2VpdmVkIGZyb20gSmF2aWVyIEFjaGlyaWNhCisgICAgPGFjaGlyaWNhQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4gYW5kIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4uCisgICAgQ29kZSB3YXMgYWxzbyBpbnRlZ3JhdGVkIGZyb20gdGhlIENpc2NvIEFpcm9uZXQgZHJpdmVyIGZvciBMaW51eC4KKyAgICBTdXBwb3J0IGZvciBNUEkzNTAgY2FyZHMgd2FzIGFkZGVkIGJ5IEZhYnJpY2UgQmVsbGV0CisgICAgPGZhYnJpY2VAYmVsbGV0LmluZm8+LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYXJkX2lkc1tdID0geworCXsgMHgxNGI5LCAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweDQ1MDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IDB4MTRiOSwgMHg0ODAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweDAzNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4MDM1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHg1MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweGE1MDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNhcmRfaWRzKTsKKworc3RhdGljIGludCBhaXJvX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIGFpcm9fcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgYWlyb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKTsKK3N0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFpcm9fZHJpdmVyID0geworCS5uYW1lICAgICA9ICJhaXJvIiwKKwkuaWRfdGFibGUgPSBjYXJkX2lkcywKKwkucHJvYmUgICAgPSBhaXJvX3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhaXJvX3BjaV9yZW1vdmUpLAorCS5zdXNwZW5kICA9IGFpcm9fcGNpX3N1c3BlbmQsCisJLnJlc3VtZSAgID0gYWlyb19wY2lfcmVzdW1lLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKy8qIEluY2x1ZGUgV2lyZWxlc3MgRXh0ZW5zaW9uIGRlZmluaXRpb24gYW5kIGNoZWNrIHZlcnNpb24gLSBKZWFuIElJICovCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIE5ldyBkcml2ZXIgQVBJCisKKyNkZWZpbmUgQ0lTQ09fRVhUCQkvLyBlbmFibGUgQ2lzY28gZXh0ZW5zaW9ucworI2lmZGVmIENJU0NPX0VYVAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjZW5kaWYKKworLyogU3VwcG9ydCBDaXNjbyBNSUMgZmVhdHVyZSAqLworI2RlZmluZSBNSUNTVVBQT1JUCisKKyNpZiBkZWZpbmVkKE1JQ1NVUFBPUlQpICYmICFkZWZpbmVkKENPTkZJR19DUllQVE8pCisjd2FybmluZyBNSUMgc3VwcG9ydCByZXF1aXJlcyBDcnlwdG8gQVBJCisjdW5kZWYgTUlDU1VQUE9SVAorI2VuZGlmCisKKy8qIEhhY2sgdG8gZG8gc29tZSBwb3dlciBzYXZpbmcgKi8KKyNkZWZpbmUgUE9XRVJfT05fRE9XTgorCisvKiBBcyB5b3UgY2FuIHNlZSB0aGlzIGxpc3QgaXMgSFVHSCEKKyAgIEkgcmVhbGx5IGRvbid0IGtub3cgd2hhdCBhIGxvdCBvZiB0aGVzZSBjb3VudHMgYXJlIGFib3V0LCBidXQgdGhleQorICAgYXJlIGFsbCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuICBJZiB0aGUgSUdOTEFCRUwgbWFjcm8gaXMgcHV0IGluCisgICBpbmZyb250IG9mIHRoZSBsYWJlbCwgdGhhdCBzdGF0aXN0aWMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QKKyAgIG9mIHN0YXRpc3RpY3MgaW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gKi8KKworI2RlZmluZSBJR05MQUJFTChjb21tZW50KSBOVUxMCitzdGF0aWMgY2hhciAqc3RhdHNMYWJlbHNbXSA9IHsKKwkiUnhPdmVycnVuIiwKKwlJR05MQUJFTCgiUnhQbGNwQ3JjRXJyIiksCisJSUdOTEFCRUwoIlJ4UGxjcEZvcm1hdEVyciIpLAorCUlHTkxBQkVMKCJSeFBsY3BMZW5ndGhFcnIiKSwKKwkiUnhNYWNDcmNFcnIiLAorCSJSeE1hY0NyY09rIiwKKwkiUnhXZXBFcnIiLAorCSJSeFdlcE9rIiwKKwkiUmV0cnlMb25nIiwKKwkiUmV0cnlTaG9ydCIsCisJIk1heFJldHJpZXMiLAorCSJOb0FjayIsCisJIk5vQ3RzIiwKKwkiUnhBY2siLAorCSJSeEN0cyIsCisJIlR4QWNrIiwKKwkiVHhSdHMiLAorCSJUeEN0cyIsCisJIlR4TWMiLAorCSJUeEJjIiwKKwkiVHhVY0ZyYWdzIiwKKwkiVHhVY1BhY2tldHMiLAorCSJUeEJlYWNvbiIsCisJIlJ4QmVhY29uIiwKKwkiVHhTaW5Db2xsIiwKKwkiVHhNdWxDb2xsIiwKKwkiRGVmZXJzTm8iLAorCSJEZWZlcnNQcm90IiwKKwkiRGVmZXJzRW5neSIsCisJIkR1cEZyYW0iLAorCSJSeEZyYWdEaXNjIiwKKwkiVHhBZ2VkIiwKKwkiUnhBZ2VkIiwKKwkiTG9zdFN5bmMtTWF4UmV0cnkiLAorCSJMb3N0U3luYy1NaXNzZWRCZWFjb25zIiwKKwkiTG9zdFN5bmMtQXJsRXhjZWVkZWQiLAorCSJMb3N0U3luYy1EZWF1dGgiLAorCSJMb3N0U3luYy1EaXNhc3NvY2VkIiwKKwkiTG9zdFN5bmMtVHNmVGltaW5nIiwKKwkiSG9zdFR4TWMiLAorCSJIb3N0VHhCYyIsCisJIkhvc3RUeFVjIiwKKwkiSG9zdFR4RmFpbCIsCisJIkhvc3RSeE1jIiwKKwkiSG9zdFJ4QmMiLAorCSJIb3N0UnhVYyIsCisJIkhvc3RSeERpc2NhcmQiLAorCUlHTkxBQkVMKCJIbWFjVHhNYyIpLAorCUlHTkxBQkVMKCJIbWFjVHhCYyIpLAorCUlHTkxBQkVMKCJIbWFjVHhVYyIpLAorCUlHTkxBQkVMKCJIbWFjVHhGYWlsIiksCisJSUdOTEFCRUwoIkhtYWNSeE1jIiksCisJSUdOTEFCRUwoIkhtYWNSeEJjIiksCisJSUdOTEFCRUwoIkhtYWNSeFVjIiksCisJSUdOTEFCRUwoIkhtYWNSeERpc2NhcmQiKSwKKwlJR05MQUJFTCgiSG1hY1J4QWNjZXB0ZWQiKSwKKwkiU3NpZE1pc21hdGNoIiwKKwkiQXBNaXNtYXRjaCIsCisJIlJhdGVzTWlzbWF0Y2giLAorCSJBdXRoUmVqZWN0IiwKKwkiQXV0aFRpbWVvdXQiLAorCSJBc3NvY1JlamVjdCIsCisJIkFzc29jVGltZW91dCIsCisJSUdOTEFCRUwoIlJlYXNvbk91dHNpZGVUYWJsZSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czIiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMyIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM0IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czUiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNiIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM3IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czgiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzOSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxMCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxMSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxMiIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxMyIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxNCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxNSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxNiIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxNyIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxOCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMxOSIpLAorCSJSeE1hbiIsCisJIlR4TWFuIiwKKwkiUnhSZWZyZXNoIiwKKwkiVHhSZWZyZXNoIiwKKwkiUnhQb2xsIiwKKwkiVHhQb2xsIiwKKwkiSG9zdFJldHJpZXMiLAorCSJMb3N0U3luYy1Ib3N0UmVxIiwKKwkiSG9zdFR4Qnl0ZXMiLAorCSJIb3N0UnhCeXRlcyIsCisJIkVsYXBzZWRVc2VjIiwKKwkiRWxhcHNlZFNlYyIsCisJIkxvc3RTeW5jQmV0dGVyQVAiLAorCSJQcml2YWN5TWlzbWF0Y2giLAorCSJKYW1tZWQiLAorCSJEaXNjUnhOb3RXZXBwZWQiLAorCSJQaHlFbGVNaXNtYXRjaCIsCisJKGNoYXIqKS0xIH07CisjaWZuZGVmIFJVTl9BVAorI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMrKHgpKQorI2VuZGlmCisKKworLyogVGhlc2UgdmFyaWFibGVzIGFyZSBmb3IgaW5zbW9kLCBzaW5jZSBpdCBzZWVtcyB0aGF0IHRoZSByYXRlcworICAgY2FuIG9ubHkgYmUgc2V0IGluIHNldHVwX2NhcmQuICBSYXRlcyBzaG91bGQgYmUgYSBjb21tYSBzZXBhcmF0ZWQKKyAgIChubyBzcGFjZXMpIGxpc3Qgb2YgcmF0ZXMgKHVwIHRvIDgpLiAqLworCitzdGF0aWMgaW50IHJhdGVzWzhdOworc3RhdGljIGludCBiYXNpY19yYXRlOworc3RhdGljIGNoYXIgKnNzaWRzWzNdOworCitzdGF0aWMgaW50IGlvWzRdOworc3RhdGljIGludCBpcnFbNF07CisKK3N0YXRpYworaW50IG1heGVuY3J5cHQgLyogPSAwICovOyAvKiBUaGUgaGlnaGVzdCByYXRlIHRoYXQgdGhlIGNhcmQgY2FuIGVuY3J5cHQgYXQuCisJCSAgICAgICAwIG1lYW5zIG5vIGxpbWl0LiAgRm9yIG9sZCBjYXJkcyB0aGlzIHdhcyA0ICovCisKK3N0YXRpYyBpbnQgYXV0b193ZXAgLyogPSAwICovOyAvKiBJZiBzZXQsIGl0IHRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlIHdlcCBtb2RlICovCitzdGF0aWMgaW50IGF1eF9iYXAgLyogPSAwICovOyAvKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBhdXggcG9ydHMgYXJlIG5lZWRlZCB0byByZWFkCisJCSAgICB0aGUgYmFwLCBuZWVkZWQgb24gc29tZSBvbGRlciBjYXJkcyBhbmQgYnVzZXMuICovCitzdGF0aWMgaW50IGFkaG9jOworCitzdGF0aWMgaW50IHByb2JlID0gMTsKKworc3RhdGljIGludCBwcm9jX3VpZCAvKiA9IDAgKi87CisKK3N0YXRpYyBpbnQgcHJvY19naWQgLyogPSAwICovOworCitzdGF0aWMgaW50IGFpcm9fcGVybSA9IDA1NTU7CisKK3N0YXRpYyBpbnQgcHJvY19wZXJtID0gMDY0NDsKKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gUmVlZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBDaXNjby9BaXJvbmV0IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBcCisgICAgICAgICAgICAgICAgICAgY2FyZHMuICBEaXJlY3Qgc3VwcG9ydCBmb3IgSVNBL1BDSS9NUEkgY2FyZHMgYW5kIHN1cHBvcnQgXAorCQkgICBmb3IgUENNQ0lBIHdoZW4gdXNlZCB3aXRoIGFpcm9fY3MuIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQWlyb25ldCA0NTAwLCA0ODAwIGFuZCBDaXNjbyAzNDAvMzUwIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGJhc2ljX3JhdGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmF0ZXMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3NpZHMsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShhdXRvX3dlcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b193ZXAsICJJZiBub24temVybywgdGhlIGRyaXZlciB3aWxsIGtlZXAgbG9vcGluZyB0aHJvdWdoIFwKK3RoZSBhdXRoZW50aWNhdGlvbiBvcHRpb25zIHVudGlsIGFuIGFzc29jaWF0aW9uIGlzIG1hZGUuICBUaGUgdmFsdWUgb2YgXAorYXV0b193ZXAgaXMgbnVtYmVyIG9mIHRoZSB3ZXAga2V5cyB0byBjaGVjay4gIEEgdmFsdWUgb2YgMiB3aWxsIHRyeSB1c2luZyBcCit0aGUga2V5IGF0IGluZGV4IDAgYW5kIGluZGV4IDEuIik7Cittb2R1bGVfcGFyYW0oYXV4X2JhcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV4X2JhcCwgIklmIG5vbi16ZXJvLCB0aGUgZHJpdmVyIHdpbGwgc3dpdGNoIGludG8gYSBtb2RlIFwKK3RoYW4gc2VlbXMgdG8gd29yayBiZXR0ZXIgZm9yIG9sZGVyIGNhcmRzIHdpdGggc29tZSBvbGRlciBidXNlcy4gIEJlZm9yZSBcCitzd2l0Y2hpbmcgaXQgY2hlY2tzIHRoYXQgdGhlIHN3aXRjaCBpcyBuZWVkZWQuIik7Cittb2R1bGVfcGFyYW0obWF4ZW5jcnlwdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4ZW5jcnlwdCwgIlRoZSBtYXhpbXVtIHNwZWVkIHRoYXQgdGhlIGNhcmQgY2FuIGRvIFwKK2VuY3J5cHRpb24uICBVbml0cyBhcmUgaW4gNTEya2JzLiAgWmVybyAoZGVmYXVsdCkgbWVhbnMgdGhlcmUgaXMgbm8gbGltaXQuIFwKK09sZGVyIGNhcmRzIHVzZWQgdG8gYmUgbGltaXRlZCB0byAybWJzICg0KS4iKTsKK21vZHVsZV9wYXJhbShhZGhvYywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWRob2MsICJJZiBub24temVybywgdGhlIGNhcmQgd2lsbCBzdGFydCBpbiBhZGhvYyBtb2RlLiIpOworbW9kdWxlX3BhcmFtKHByb2JlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcm9iZSwgIklmIHplcm8sIHRoZSBkcml2ZXIgd29uJ3Qgc3RhcnQgdGhlIGNhcmQuIik7CisKK21vZHVsZV9wYXJhbShwcm9jX3VpZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvY191aWQsICJUaGUgdWlkIHRoYXQgdGhlIC9wcm9jIGZpbGVzIHdpbGwgYmVsb25nIHRvLiIpOworbW9kdWxlX3BhcmFtKHByb2NfZ2lkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcm9jX2dpZCwgIlRoZSBnaWQgdGhhdCB0aGUgL3Byb2MgZmlsZXMgd2lsbCBiZWxvbmcgdG8uIik7Cittb2R1bGVfcGFyYW0oYWlyb19wZXJtLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaXJvX3Blcm0sICJUaGUgcGVybWlzc2lvbiBiaXRzIG9mIC9wcm9jL1tkcml2ZXIvXWFpcm9uZXQuIik7Cittb2R1bGVfcGFyYW0ocHJvY19wZXJtLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcm9jX3Blcm0sICJUaGUgcGVybWlzc2lvbiBiaXRzIG9mIHRoZSBmaWxlcyBpbiAvcHJvYyIpOworCisvKiBUaGlzIGlzIGEga2luZCBvZiBzbG9wcHkgaGFjayB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiB0byBPVVQ0NTAwIGFuZAorICAgSU40NTAwLiAgSSB3b3VsZCBiZSBleHRyZW1lbHkgaW50ZXJlc3RlZCBpbiB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoaXMKKyAgIGRvZXNuJ3Qgd29yayB0aG91Z2ghISEgKi8KK3N0YXRpYyBpbnQgZG84Yml0SU8gPSAwOworCisvKiBSZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgU1VDQ0VTUyAwCisjZGVmaW5lIEVSUk9SIC0xCisjZGVmaW5lIE5PX1BBQ0tFVCAtMgorCisvKiBDb21tYW5kcyAqLworI2RlZmluZSBOT1AyCQkweDAwMDAKKyNkZWZpbmUgTUFDX0VOQUJMRQkweDAwMDEKKyNkZWZpbmUgTUFDX0RJU0FCTEUJMHgwMDAyCisjZGVmaW5lIENNRF9MT1NFX1NZTkMJMHgwMDAzIC8qIE5vdCBzdXJlIHdoYXQgdGhpcyBkb2VzLi4uICovCisjZGVmaW5lIENNRF9TT0ZUUkVTRVQJMHgwMDA0CisjZGVmaW5lIEhPU1RTTEVFUAkweDAwMDUKKyNkZWZpbmUgQ01EX01BR0lDX1BLVAkweDAwMDYKKyNkZWZpbmUgQ01EX1NFVFdBS0VNQVNLCTB4MDAwNworI2RlZmluZSBDTURfUkVBRENGRwkweDAwMDgKKyNkZWZpbmUgQ01EX1NFVE1PREUJMHgwMDA5CisjZGVmaW5lIENNRF9BTExPQ0FURVRYCTB4MDAwYQorI2RlZmluZSBDTURfVFJBTlNNSVQJMHgwMDBiCisjZGVmaW5lIENNRF9ERUFMTE9DQVRFVFggMHgwMDBjCisjZGVmaW5lIE5PUAkJMHgwMDEwCisjZGVmaW5lIENNRF9XT1JLQVJPVU5ECTB4MDAxMQorI2RlZmluZSBDTURfQUxMT0NBVEVBVVggMHgwMDIwCisjZGVmaW5lIENNRF9BQ0NFU1MJMHgwMDIxCisjZGVmaW5lIENNRF9QQ0lCQVAJMHgwMDIyCisjZGVmaW5lIENNRF9QQ0lBVVgJMHgwMDIzCisjZGVmaW5lIENNRF9BTExPQ0JVRgkweDAwMjgKKyNkZWZpbmUgQ01EX0dFVFRMVgkweDAwMjkKKyNkZWZpbmUgQ01EX1BVVFRMVgkweDAwMmEKKyNkZWZpbmUgQ01EX0RFTFRMVgkweDAwMmIKKyNkZWZpbmUgQ01EX0ZJTkRORVhUVExWCTB4MDAyYworI2RlZmluZSBDTURfUFNQTk9ERVMJMHgwMDMwCisjZGVmaW5lIENNRF9TRVRDVwkweDAwMzEgICAgCisjZGVmaW5lIENNRF9TRVRQQ0YJMHgwMDMyICAgIAorI2RlZmluZSBDTURfU0VUUEhZUkVHCTB4MDAzZQorI2RlZmluZSBDTURfVFhURVNUCTB4MDAzZgorI2RlZmluZSBNQUNfRU5BQkxFVFgJMHgwMTAxCisjZGVmaW5lIENNRF9MSVNUQlNTCTB4MDEwMworI2RlZmluZSBDTURfU0FWRUNGRwkweDAxMDgKKyNkZWZpbmUgQ01EX0VOQUJMRUFVWAkweDAxMTEKKyNkZWZpbmUgQ01EX1dSSVRFUklECTB4MDEyMQorI2RlZmluZSBDTURfVVNFUFNQTk9ERVMJMHgwMTMwCisjZGVmaW5lIE1BQ19FTkFCTEVSWAkweDAyMDEKKworLyogQ29tbWFuZCBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfUVVBTElGIDB4MDAKKyNkZWZpbmUgRVJST1JfSUxMQ01EIDB4MDEKKyNkZWZpbmUgRVJST1JfSUxMRk1UIDB4MDIKKyNkZWZpbmUgRVJST1JfSU5WRklEIDB4MDMKKyNkZWZpbmUgRVJST1JfSU5WUklEIDB4MDQKKyNkZWZpbmUgRVJST1JfTEFSR0UgMHgwNQorI2RlZmluZSBFUlJPUl9ORElTQUJMIDB4MDYKKyNkZWZpbmUgRVJST1JfQUxMT0NCU1kgMHgwNworI2RlZmluZSBFUlJPUl9OT1JEIDB4MEIKKyNkZWZpbmUgRVJST1JfTk9XUiAweDBDCisjZGVmaW5lIEVSUk9SX0lOVkZJRFRYIDB4MEQKKyNkZWZpbmUgRVJST1JfVEVTVEFDVCAweDBFCisjZGVmaW5lIEVSUk9SX1RBR05GTkQgMHgxMgorI2RlZmluZSBFUlJPUl9ERUNPREUgMHgyMAorI2RlZmluZSBFUlJPUl9ERVNDVU5BViAweDIxCisjZGVmaW5lIEVSUk9SX0JBRExFTiAweDIyCisjZGVmaW5lIEVSUk9SX01PREUgMHg4MAorI2RlZmluZSBFUlJPUl9IT1AgMHg4MQorI2RlZmluZSBFUlJPUl9CSU5URVIgMHg4MgorI2RlZmluZSBFUlJPUl9SWE1PREUgMHg4MworI2RlZmluZSBFUlJPUl9NQUNBRERSIDB4ODQKKyNkZWZpbmUgRVJST1JfUkFURVMgMHg4NQorI2RlZmluZSBFUlJPUl9PUkRFUiAweDg2CisjZGVmaW5lIEVSUk9SX1NDQU4gMHg4NworI2RlZmluZSBFUlJPUl9BVVRIIDB4ODgKKyNkZWZpbmUgRVJST1JfUFNNT0RFIDB4ODkKKyNkZWZpbmUgRVJST1JfUlRZUEUgMHg4QQorI2RlZmluZSBFUlJPUl9ESVZFUiAweDhCCisjZGVmaW5lIEVSUk9SX1NTSUQgMHg4QworI2RlZmluZSBFUlJPUl9BUExJU1QgMHg4RAorI2RlZmluZSBFUlJPUl9BVVRPV0FLRSAweDhFCisjZGVmaW5lIEVSUk9SX0xFQVAgMHg4RgorCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ09NTUFORCAweDAwCisjZGVmaW5lIFBBUkFNMCAweDAyCisjZGVmaW5lIFBBUkFNMSAweDA0CisjZGVmaW5lIFBBUkFNMiAweDA2CisjZGVmaW5lIFNUQVRVUyAweDA4CisjZGVmaW5lIFJFU1AwIDB4MGEKKyNkZWZpbmUgUkVTUDEgMHgwYworI2RlZmluZSBSRVNQMiAweDBlCisjZGVmaW5lIExJTktTVEFUIDB4MTAKKyNkZWZpbmUgU0VMRUNUMCAweDE4CisjZGVmaW5lIE9GRlNFVDAgMHgxYworI2RlZmluZSBSWEZJRCAweDIwCisjZGVmaW5lIFRYQUxMT0NGSUQgMHgyMgorI2RlZmluZSBUWENPTVBMRklEIDB4MjQKKyNkZWZpbmUgREFUQTAgMHgzNgorI2RlZmluZSBFVlNUQVQgMHgzMAorI2RlZmluZSBFVklOVEVOIDB4MzIKKyNkZWZpbmUgRVZBQ0sgMHgzNAorI2RlZmluZSBTV1MwIDB4MjgKKyNkZWZpbmUgU1dTMSAweDJhCisjZGVmaW5lIFNXUzIgMHgyYworI2RlZmluZSBTV1MzIDB4MmUKKyNkZWZpbmUgQVVYUEFHRSAweDNBCisjZGVmaW5lIEFVWE9GRiAweDNDCisjZGVmaW5lIEFVWERBVEEgMHgzRQorCisjZGVmaW5lIEZJRF9UWCAxCisjZGVmaW5lIEZJRF9SWCAyCisvKiBPZmZzZXQgaW50byBhdXggbWVtb3J5IGZvciBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBBVVhfT0ZGU0VUIDB4ODAwCisvKiBTaXplIG9mIGFsbG9jYXRlZCBwYWNrZXRzICovCisjZGVmaW5lIFBLVFNJWkUgMTg0MAorI2RlZmluZSBSSURTSVpFIDIwNDgKKy8qIFNpemUgb2YgdGhlIHRyYW5zbWl0IHF1ZXVlICovCisjZGVmaW5lIE1BWFRYUSA2NAorCisvKiBCQVAgc2VsZWN0b3JzICovCisjZGVmaW5lIEJBUDAgMCAvLyBVc2VkIGZvciByZWNlaXZpbmcgcGFja2V0cworI2RlZmluZSBCQVAxIDIgLy8gVXNlZCBmb3IgeG1pdGluZyBwYWNrZXRzIGFuZCB3b3JraW5nIHdpdGggUklEUworCisvKiBGbGFncyAqLworI2RlZmluZSBDT01NQU5EX0JVU1kgMHg4MDAwCisKKyNkZWZpbmUgQkFQX0JVU1kgMHg4MDAwCisjZGVmaW5lIEJBUF9FUlIgMHg0MDAwCisjZGVmaW5lIEJBUF9ET05FIDB4MjAwMAorCisjZGVmaW5lIFBST01JU0MgMHhmZmZmCisjZGVmaW5lIE5PUFJPTUlTQyAweDAwMDAKKworI2RlZmluZSBFVl9DTUQgMHgxMAorI2RlZmluZSBFVl9DTEVBUkNPTU1BTkRCVVNZIDB4NDAwMAorI2RlZmluZSBFVl9SWCAweDAxCisjZGVmaW5lIEVWX1RYIDB4MDIKKyNkZWZpbmUgRVZfVFhFWEMgMHgwNAorI2RlZmluZSBFVl9BTExPQyAweDA4CisjZGVmaW5lIEVWX0xJTksgMHg4MAorI2RlZmluZSBFVl9BV0FLRSAweDEwMAorI2RlZmluZSBFVl9UWENQWSAweDQwMAorI2RlZmluZSBFVl9VTktOT1dOIDB4ODAwCisjZGVmaW5lIEVWX01JQyAweDEwMDAgLyogTWVzc2FnZSBJbnRlZ3JpdHkgQ2hlY2sgSW50ZXJydXB0ICovCisjZGVmaW5lIEVWX0FXQUtFTiAweDIwMDAKKyNkZWZpbmUgU1RBVFVTX0lOVFMgKEVWX0FXQUtFfEVWX0xJTkt8RVZfVFhFWEN8RVZfVFh8RVZfVFhDUFl8RVZfUlh8RVZfTUlDKQorCisjaWZkZWYgQ0hFQ0tfVU5LTk9XTl9JTlRTCisjZGVmaW5lIElHTk9SRV9JTlRTICggRVZfQ01EIHwgRVZfVU5LTk9XTikKKyNlbHNlCisjZGVmaW5lIElHTk9SRV9JTlRTICh+U1RBVFVTX0lOVFMpCisjZW5kaWYKKworLyogUklEIFRZUEVTICovCisjZGVmaW5lIFJJRF9SVyAweDIwCisKKy8qIFRoZSBSSURzICovCisjZGVmaW5lIFJJRF9DQVBBQklMSVRJRVMgMHhGRjAwCisjZGVmaW5lIFJJRF9BUElORk8gICAgIDB4RkYwMQorI2RlZmluZSBSSURfUkFESU9JTkZPICAweEZGMDIKKyNkZWZpbmUgUklEX1VOS05PV04zICAgMHhGRjAzCisjZGVmaW5lIFJJRF9SU1NJICAgICAgIDB4RkYwNAorI2RlZmluZSBSSURfQ09ORklHICAgICAweEZGMTAKKyNkZWZpbmUgUklEX1NTSUQgICAgICAgMHhGRjExCisjZGVmaW5lIFJJRF9BUExJU1QgICAgIDB4RkYxMgorI2RlZmluZSBSSURfRFJWTkFNRSAgICAweEZGMTMKKyNkZWZpbmUgUklEX0VUSEVSRU5DQVAgMHhGRjE0CisjZGVmaW5lIFJJRF9XRVBfVEVNUCAgIDB4RkYxNQorI2RlZmluZSBSSURfV0VQX1BFUk0gICAweEZGMTYKKyNkZWZpbmUgUklEX01PRFVMQVRJT04gMHhGRjE3CisjZGVmaW5lIFJJRF9PUFRJT05TICAgIDB4RkYxOAorI2RlZmluZSBSSURfQUNUVUFMQ09ORklHIDB4RkYyMCAvKnJlYWRvbmx5Ki8KKyNkZWZpbmUgUklEX0ZBQ1RPUllDT05GSUcgMHhGRjIxCisjZGVmaW5lIFJJRF9VTktOT1dOMjIgIDB4RkYyMgorI2RlZmluZSBSSURfTEVBUFVTRVJOQU1FIDB4RkYyMworI2RlZmluZSBSSURfTEVBUFBBU1NXT1JEIDB4RkYyNAorI2RlZmluZSBSSURfU1RBVFVTICAgICAweEZGNTAKKyNkZWZpbmUgUklEX0JFQUNPTl9IU1QgMHhGRjUxCisjZGVmaW5lIFJJRF9CVVNZX0hTVCAgIDB4RkY1MgorI2RlZmluZSBSSURfUkVUUklFU19IU1QgMHhGRjUzCisjZGVmaW5lIFJJRF9VTktOT1dONTQgIDB4RkY1NAorI2RlZmluZSBSSURfVU5LTk9XTjU1ICAweEZGNTUKKyNkZWZpbmUgUklEX1VOS05PV041NiAgMHhGRjU2CisjZGVmaW5lIFJJRF9NSUMgICAgICAgIDB4RkY1NworI2RlZmluZSBSSURfU1RBVFMxNiAgICAweEZGNjAKKyNkZWZpbmUgUklEX1NUQVRTMTZERUxUQSAweEZGNjEKKyNkZWZpbmUgUklEX1NUQVRTMTZERUxUQUNMRUFSIDB4RkY2MgorI2RlZmluZSBSSURfU1RBVFMgICAgICAweEZGNjgKKyNkZWZpbmUgUklEX1NUQVRTREVMVEEgMHhGRjY5CisjZGVmaW5lIFJJRF9TVEFUU0RFTFRBQ0xFQVIgMHhGRjZBCisjZGVmaW5lIFJJRF9FQ0hPVEVTVF9SSUQgMHhGRjcwCisjZGVmaW5lIFJJRF9FQ0hPVEVTVF9SRVNVTFRTIDB4RkY3MQorI2RlZmluZSBSSURfQlNTTElTVEZJUlNUIDB4RkY3MgorI2RlZmluZSBSSURfQlNTTElTVE5FWFQgIDB4RkY3MworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGNtZDsKKwl1MTYgcGFybTA7CisJdTE2IHBhcm0xOworCXUxNiBwYXJtMjsKK30gQ21kOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHN0YXR1czsKKwl1MTYgcnNwMDsKKwl1MTYgcnNwMTsKKwl1MTYgcnNwMjsKK30gUmVzcDsKKworLyoKKyAqIFJpZHMgYW5kIGVuZGlhbi1uZXNzOiAgVGhlIFJpZHMgd2lsbCBhbHdheXMgYmUgaW4gY3B1IGVuZGlhbiwgc2luY2UKKyAqIHRoaXMgYWxsIHRoZSBwYXRjaGVzIGZyb20gdGhlIGJpZy1lbmRpYW4gZ3V5cyBlbmQgdXAgZG9pbmcgdGhhdC4KKyAqIHNvIGFsbCByaWQgYWNjZXNzIHNob3VsZCB1c2UgdGhlIHJlYWQvd3JpdGVYWFhSaWQgcm91dGluZXMuCisgKi8KKworLyogVGhpcyBpcyByZWR1bmRhbnQgZm9yIHg4NiBhcmNocywgYnV0IGl0IHNlZW1zIG5lY2Vzc2FyeSBmb3IgQVJNICovCisjcHJhZ21hIHBhY2soMSkKKworLyogVGhpcyBzdHJ1Y3R1cmUgY2FtZSBmcm9tIGFuIGVtYWlsIHNlbnQgdG8gbWUgZnJvbSBhbiBlbmdpbmVlciBhdAorICAgYWlyb25ldCBmb3IgaW5jbHVzaW9uIGludG8gdGhpcyBkcml2ZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXUxNiBraW5kZXg7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYga2xlbjsKKwl1OCBrZXlbMTZdOworfSBXZXBLZXlSaWQ7CisKKy8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIGZyb20gdGhlIEFpcm9uZXQncyBQQzQ1MDAgRGV2ZWxvcGVycyBNYW51YWwgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXU4IHNzaWRbMzJdOworfSBTc2lkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwlTc2lkIHNzaWRzWzNdOworfSBTc2lkUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHUxNiBsZW47CisgICAgICAgIHUxNiBtb2R1bGF0aW9uOworI2RlZmluZSBNT0RfREVGQVVMVCAwCisjZGVmaW5lIE1PRF9DQ0sgMQorI2RlZmluZSBNT0RfTU9LIDIKK30gTW9kdWxhdGlvblJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47IC8qIHNpemVvZihDb25maWdSaWQpICovCisJdTE2IG9wbW9kZTsgLyogb3BlcmF0aW5nIG1vZGUgKi8KKyNkZWZpbmUgTU9ERV9TVEFfSUJTUyAwCisjZGVmaW5lIE1PREVfU1RBX0VTUyAxCisjZGVmaW5lIE1PREVfQVAgMgorI2RlZmluZSBNT0RFX0FQX1JQVFIgMworI2RlZmluZSBNT0RFX0VUSEVSTkVUX0hPU1QgKDA8PDgpIC8qIHJ4IHBheWxvYWRzIGNvbnZlcnRlZCAqLworI2RlZmluZSBNT0RFX0xMQ19IT1NUICgxPDw4KSAvKiByeCBwYXlsb2FkcyBsZWZ0IGFzIGlzICovCisjZGVmaW5lIE1PREVfQUlST05FVF9FWFRFTkQgKDE8PDkpIC8qIGVuYWJsZSBBaXJvbmV0IGV4dGVuc3Rpb25zICovCisjZGVmaW5lIE1PREVfQVBfSU5URVJGQUNFICgxPDwxMCkgLyogZW5hYmxlIGFwIGludGVyZmFjZSBleHRlbnNpb25zICovCisjZGVmaW5lIE1PREVfQU5URU5OQV9BTElHTiAoMTw8MTEpIC8qIGVuYWJsZSBhbnRlbm5hIGFsaWdubWVudCAqLworI2RlZmluZSBNT0RFX0VUSEVSX0xMQyAoMTw8MTIpIC8qIGVuYWJsZSBldGhlcm5ldCBMTEMgKi8KKyNkZWZpbmUgTU9ERV9MRUFGX05PREUgKDE8PDEzKSAvKiBlbmFibGUgbGVhZiBub2RlIGJyaWRnZSAqLworI2RlZmluZSBNT0RFX0NGX1BPTExBQkxFICgxPDwxNCkgLyogZW5hYmxlIENGIHBvbGxhYmxlICovCisjZGVmaW5lIE1PREVfTUlDICgxPDwxNSkgLyogZW5hYmxlIE1JQyAqLworCXUxNiBybW9kZTsgLyogcmVjZWl2ZSBtb2RlICovCisjZGVmaW5lIFJYTU9ERV9CQ19NQ19BRERSIDAKKyNkZWZpbmUgUlhNT0RFX0JDX0FERFIgMSAvKiBpZ25vcmUgbXVsdGljYXN0cyAqLworI2RlZmluZSBSWE1PREVfQUREUiAyIC8qIGlnbm9yZSBtdWx0aWNhc3QgYW5kIGJyb2FkY2FzdCAqLworI2RlZmluZSBSWE1PREVfUkZNT04gMyAvKiB3aXJlbGVzcyBtb25pdG9yIG1vZGUgKi8KKyNkZWZpbmUgUlhNT0RFX1JGTU9OX0FOWUJTUyA0CisjZGVmaW5lIFJYTU9ERV9MQU5NT04gNSAvKiBsYW4gc3R5bGUgbW9uaXRvciAtLSBkYXRhIHBhY2tldHMgb25seSAqLworI2RlZmluZSBSWE1PREVfRElTQUJMRV84MDJfM19IRUFERVIgKDE8PDgpIC8qIGRpc2FibGVzIDgwMi4zIGhlYWRlciBvbiByeCAqLworI2RlZmluZSBSWE1PREVfTk9STUFMSVpFRF9SU1NJICgxPDw5KSAvKiByZXR1cm4gbm9ybWFsaXplZCBSU1NJICovCisJdTE2IGZyYWdUaHJlc2g7CisJdTE2IHJ0c1RocmVzOworCXU4IG1hY0FkZHJbRVRIX0FMRU5dOworCXU4IHJhdGVzWzhdOworCXUxNiBzaG9ydFJldHJ5TGltaXQ7CisJdTE2IGxvbmdSZXRyeUxpbWl0OworCXUxNiB0eExpZmV0aW1lOyAvKiBpbiBrdXNlYyAqLworCXUxNiByeExpZmV0aW1lOyAvKiBpbiBrdXNlYyAqLworCXUxNiBzdGF0aW9uYXJ5OworCXUxNiBvcmRlcmluZzsKKwl1MTYgdTE2ZGV2aWNlVHlwZTsgLyogZm9yIG92ZXJyaWRpbmcgZGV2aWNlIHR5cGUgKi8KKwl1MTYgY2ZwUmF0ZTsKKwl1MTYgY2ZwRHVyYXRpb247CisJdTE2IF9yZXNlcnZlZDFbM107CisJLyotLS0tLS0tLS0tIFNjYW5uaW5nL0Fzc29jaWF0aW5nIC0tLS0tLS0tLS0qLworCXUxNiBzY2FuTW9kZTsKKyNkZWZpbmUgU0NBTk1PREVfQUNUSVZFIDAKKyNkZWZpbmUgU0NBTk1PREVfUEFTU0lWRSAxCisjZGVmaW5lIFNDQU5NT0RFX0FJUk9TQ0FOIDIKKwl1MTYgcHJvYmVEZWxheTsgLyogaW4ga3VzZWMgKi8KKwl1MTYgcHJvYmVFbmVyZ3lUaW1lb3V0OyAvKiBpbiBrdXNlYyAqLworICAgICAgICB1MTYgcHJvYmVSZXNwb25zZVRpbWVvdXQ7CisJdTE2IGJlYWNvbkxpc3RlblRpbWVvdXQ7CisJdTE2IGpvaW5OZXRUaW1lb3V0OworCXUxNiBhdXRoVGltZW91dDsKKwl1MTYgYXV0aFR5cGU7CisjZGVmaW5lIEFVVEhfT1BFTiAweDEKKyNkZWZpbmUgQVVUSF9FTkNSWVBUIDB4MTAxCisjZGVmaW5lIEFVVEhfU0hBUkVES0VZIDB4MTAyCisjZGVmaW5lIEFVVEhfQUxMT1dfVU5FTkNSWVBURUQgMHgyMDAKKwl1MTYgYXNzb2NpYXRpb25UaW1lb3V0OworCXUxNiBzcGVjaWZpZWRBcFRpbWVvdXQ7CisJdTE2IG9mZmxpbmVTY2FuSW50ZXJ2YWw7CisJdTE2IG9mZmxpbmVTY2FuRHVyYXRpb247CisJdTE2IGxpbmtMb3NzRGVsYXk7CisJdTE2IG1heEJlYWNvbkxvc3RUaW1lOworCXUxNiByZWZyZXNoSW50ZXJ2YWw7CisjZGVmaW5lIERJU0FCTEVfUkVGUkVTSCAweEZGRkYKKwl1MTYgX3Jlc2VydmVkMWFbMV07CisJLyotLS0tLS0tLS0tIFBvd2VyIHNhdmUgb3BlcmF0aW9uIC0tLS0tLS0tLS0qLworCXUxNiBwb3dlclNhdmVNb2RlOworI2RlZmluZSBQT1dFUlNBVkVfQ0FNIDAKKyNkZWZpbmUgUE9XRVJTQVZFX1BTUCAxCisjZGVmaW5lIFBPV0VSU0FWRV9QU1BDQU0gMgorCXUxNiBzbGVlcEZvckR0aW1zOworCXUxNiBsaXN0ZW5JbnRlcnZhbDsKKwl1MTYgZmFzdExpc3RlbkludGVydmFsOworCXUxNiBsaXN0ZW5EZWNheTsKKwl1MTYgZmFzdExpc3RlbkRlbGF5OworCXUxNiBfcmVzZXJ2ZWQyWzJdOworCS8qLS0tLS0tLS0tLSBBcC9JYnNzIGNvbmZpZyBpdGVtcyAtLS0tLS0tLS0tKi8KKwl1MTYgYmVhY29uUGVyaW9kOworCXUxNiBhdGltRHVyYXRpb247CisJdTE2IGhvcFBlcmlvZDsKKwl1MTYgY2hhbm5lbFNldDsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgZHRpbVBlcmlvZDsKKwl1MTYgYnJpZGdlRGlzdGFuY2U7CisJdTE2IHJhZGlvSUQ7CisJLyotLS0tLS0tLS0tIFJhZGlvIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLSovCisJdTE2IHJhZGlvVHlwZTsKKyNkZWZpbmUgUkFESU9UWVBFX0RFRkFVTFQgMAorI2RlZmluZSBSQURJT1RZUEVfODAyXzExIDEKKyNkZWZpbmUgUkFESU9UWVBFX0xFR0FDWSAyCisJdTggcnhEaXZlcnNpdHk7CisJdTggdHhEaXZlcnNpdHk7CisJdTE2IHR4UG93ZXI7CisjZGVmaW5lIFRYUE9XRVJfREVGQVVMVCAwCisJdTE2IHJzc2lUaHJlc2hvbGQ7CisjZGVmaW5lIFJTU0lfREVGQVVMVCAwCisgICAgICAgIHUxNiBtb2R1bGF0aW9uOworI2RlZmluZSBQUkVBTUJMRV9BVVRPIDAKKyNkZWZpbmUgUFJFQU1CTEVfTE9ORyAxCisjZGVmaW5lIFBSRUFNQkxFX1NIT1JUIDIKKwl1MTYgcHJlYW1ibGU7CisJdTE2IGhvbWVQcm9kdWN0OworCXUxNiByYWRpb1NwZWNpZmljOworCS8qLS0tLS0tLS0tLSBBaXJvbmV0IEV4dGVuc2lvbnMgLS0tLS0tLS0tLSovCisJdTggbm9kZU5hbWVbMTZdOworCXUxNiBhcmxUaHJlc2hvbGQ7CisJdTE2IGFybERlY2F5OworCXUxNiBhcmxEZWxheTsKKwl1MTYgX3Jlc2VydmVkNFsxXTsKKwkvKi0tLS0tLS0tLS0gQWlyb25ldCBFeHRlbnNpb25zIC0tLS0tLS0tLS0qLworCXU4IG1hZ2ljQWN0aW9uOworI2RlZmluZSBNQUdJQ19BQ1RJT05fU1RTQ0hHIDEKKyNkZWZpbmUgTUFHSUNfQUNUSU9OX1JFU1VNRSAyCisjZGVmaW5lIE1BR0lDX0lHTk9SRV9NQ0FTVCAoMTw8OCkKKyNkZWZpbmUgTUFHSUNfSUdOT1JFX0JDQVNUICgxPDw5KQorI2RlZmluZSBNQUdJQ19TV0lUQ0hfVE9fUFNQICgwPDwxMCkKKyNkZWZpbmUgTUFHSUNfU1RBWV9JTl9DQU0gKDE8PDEwKQorCXU4IG1hZ2ljQ29udHJvbDsKKwl1MTYgYXV0b1dha2U7Cit9IENvbmZpZ1JpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgbW9kZTsKKwl1MTYgZXJyb3JDb2RlOworCXUxNiBzaWdRdWFsaXR5OworCXUxNiBTU0lEbGVuOworCWNoYXIgU1NJRFszMl07CisJY2hhciBhcE5hbWVbMTZdOworCXU4IGJzc2lkWzRdW0VUSF9BTEVOXTsKKwl1MTYgYmVhY29uUGVyaW9kOworCXUxNiBkaW1QZXJpb2Q7CisJdTE2IGF0aW1EdXJhdGlvbjsKKwl1MTYgaG9wUGVyaW9kOworCXUxNiBjaGFubmVsU2V0OworCXUxNiBjaGFubmVsOworCXUxNiBob3BzVG9CYWNrYm9uZTsKKwl1MTYgYXBUb3RhbExvYWQ7CisJdTE2IGdlbmVyYXRlZExvYWQ7CisJdTE2IGFjY3VtdWxhdGVkQXJsOworCXUxNiBzaWduYWxRdWFsaXR5OworCXUxNiBjdXJyZW50WG1pdFJhdGU7CisJdTE2IGFwRGV2RXh0ZW5zaW9uczsKKwl1MTYgbm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoOworCXUxNiBzaG9ydFByZWFtYmxlOworCXU4IGFwSVBbNF07CisJdTggbm9pc2VQZXJjZW50OyAvKiBOb2lzZSBwZXJjZW50IGluIGxhc3Qgc2Vjb25kICovCisJdTggbm9pc2VkQm07IC8qIE5vaXNlIGRCbSBpbiBsYXN0IHNlY29uZCAqLworCXU4IG5vaXNlQXZlUGVyY2VudDsgLyogTm9pc2UgcGVyY2VudCBpbiBsYXN0IG1pbnV0ZSAqLworCXU4IG5vaXNlQXZlZEJtOyAvKiBOb2lzZSBkQm0gaW4gbGFzdCBtaW51dGUgKi8KKwl1OCBub2lzZU1heFBlcmNlbnQ7IC8qIEhpZ2hlc3Qgbm9pc2UgcGVyY2VudCBpbiBsYXN0IG1pbnV0ZSAqLworCXU4IG5vaXNlTWF4ZEJtOyAvKiBIaWdoZXN0IG5vaXNlIGRibSBpbiBsYXN0IG1pbnV0ZSAqLworCXUxNiBsb2FkOworCXU4IGNhcnJpZXJbNF07CisJdTE2IGFzc29jU3RhdHVzOworI2RlZmluZSBTVEFUX05PUEFDS0VUUyAwCisjZGVmaW5lIFNUQVRfTk9DQVJSSUVSU0VUIDEwCisjZGVmaW5lIFNUQVRfR09UQ0FSUklFUlNFVCAxMQorI2RlZmluZSBTVEFUX1dST05HU1NJRCAyMAorI2RlZmluZSBTVEFUX0JBRENIQU5ORUwgMjUKKyNkZWZpbmUgU1RBVF9CQURCSVRSQVRFUyAzMAorI2RlZmluZSBTVEFUX0JBRFBSSVZBQ1kgMzUKKyNkZWZpbmUgU1RBVF9BUEZPVU5EIDQwCisjZGVmaW5lIFNUQVRfQVBSRUpFQ1RFRCA1MAorI2RlZmluZSBTVEFUX0FVVEhFTlRJQ0FUSU5HIDYwCisjZGVmaW5lIFNUQVRfREVBVVRIRU5USUNBVEVEIDYxCisjZGVmaW5lIFNUQVRfQVVUSFRJTUVPVVQgNjIKKyNkZWZpbmUgU1RBVF9BU1NPQ0lBVElORyA3MAorI2RlZmluZSBTVEFUX0RFQVNTT0NJQVRFRCA3MQorI2RlZmluZSBTVEFUX0FTU09DVElNRU9VVCA3MgorI2RlZmluZSBTVEFUX05PVEFJUk9BUCA3MworI2RlZmluZSBTVEFUX0FTU09DSUFURUQgODAKKyNkZWZpbmUgU1RBVF9MRUFQSU5HIDkwCisjZGVmaW5lIFNUQVRfTEVBUEZBSUxFRCA5MQorI2RlZmluZSBTVEFUX0xFQVBUSU1FRE9VVCA5MgorI2RlZmluZSBTVEFUX0xFQVBDT01QTEVURSA5MworfSBTdGF0dXNSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXUxNiBzcGFjZXI7CisJdTMyIHZhbHNbMTAwXTsKK30gU3RhdHNSaWQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTggYXBbNF1bRVRIX0FMRU5dOworfSBBUExpc3RSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCWNoYXIgb3VpWzNdOworCWNoYXIgemVybzsKKwl1MTYgcHJvZE51bTsKKwljaGFyIG1hbk5hbWVbMzJdOworCWNoYXIgcHJvZE5hbWVbMTZdOworCWNoYXIgcHJvZFZlcls4XTsKKwljaGFyIGZhY3RvcnlBZGRyW0VUSF9BTEVOXTsKKwljaGFyIGFpcm9uZXRBZGRyW0VUSF9BTEVOXTsKKwl1MTYgcmFkaW9UeXBlOworCXUxNiBjb3VudHJ5OworCWNoYXIgY2FsbGlkW0VUSF9BTEVOXTsKKwljaGFyIHN1cHBvcnRlZFJhdGVzWzhdOworCWNoYXIgcnhEaXZlcnNpdHk7CisJY2hhciB0eERpdmVyc2l0eTsKKwl1MTYgdHhQb3dlckxldmVsc1s4XTsKKwl1MTYgaGFyZFZlcjsKKwl1MTYgaGFyZENhcDsKKwl1MTYgdGVtcFJhbmdlOworCXUxNiBzb2Z0VmVyOworCXUxNiBzb2Z0U3ViVmVyOworCXUxNiBpbnRlcmZhY2VWZXI7CisJdTE2IHNvZnRDYXA7CisJdTE2IGJvb3RCbG9ja1ZlcjsKKwl1MTYgcmVxdWlyZWRIYXJkOworCXUxNiBleHRTb2Z0Q2FwOworfSBDYXBhYmlsaXR5UmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHUxNiBsZW47CisgIHUxNiBpbmRleDsgLyogRmlyc3QgaXMgMCBhbmQgMHhmZmZmIG1lYW5zIGVuZCBvZiBsaXN0ICovCisjZGVmaW5lIFJBRElPX0ZIIDEgLyogRnJlcXVlbmN5IGhvcHBpbmcgcmFkaW8gdHlwZSAqLworI2RlZmluZSBSQURJT19EUyAyIC8qIERpcmVjdCBzZXF1ZW5jZSByYWRpbyB0eXBlICovCisjZGVmaW5lIFJBRElPX1RNQSA0IC8qIFByb3ByaWV0YXJ5IHJhZGlvIHVzZWQgaW4gb2xkIGNhcmRzICgyNTAwKSAqLworICB1MTYgcmFkaW9UeXBlOworICB1OCBic3NpZFtFVEhfQUxFTl07IC8qIE1hYyBhZGRyZXNzIG9mIHRoZSBCU1MgKi8KKyAgdTggemVybzsKKyAgdTggc3NpZExlbjsKKyAgdTggc3NpZFszMl07CisgIHUxNiByc3NpOworI2RlZmluZSBDQVBfRVNTICgxPDwwKQorI2RlZmluZSBDQVBfSUJTUyAoMTw8MSkKKyNkZWZpbmUgQ0FQX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIENBUF9TSE9SVEhEUiAoMTw8NSkKKyAgdTE2IGNhcDsKKyAgdTE2IGJlYWNvbkludGVydmFsOworICB1OCByYXRlc1s4XTsgLyogU2FtZSBhcyByYXRlcyBmb3IgY29uZmlnIHJpZCAqLworICBzdHJ1Y3QgeyAvKiBGb3IgZnJlcXVlbmN5IGhvcHBpbmcgb25seSAqLworICAgIHUxNiBkd2VsbDsKKyAgICB1OCBob3BTZXQ7CisgICAgdTggaG9wUGF0dGVybjsKKyAgICB1OCBob3BJbmRleDsKKyAgICB1OCBmaWxsOworICB9IGZoOworICB1MTYgZHNDaGFubmVsOworICB1MTYgYXRpbVdpbmRvdzsKK30gQlNTTGlzdFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1OCByc3NpcGN0OworICB1OCByc3NpZEJtOworfSB0ZHNSc3NpRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdTE2IGxlbjsKKyAgdGRzUnNzaUVudHJ5IHhbMjU2XTsKK30gdGRzUnNzaVJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTE2IHN0YXRlOworCXUxNiBtdWx0aWNhc3RWYWxpZDsKKwl1OCAgbXVsdGljYXN0WzE2XTsKKwl1MTYgdW5pY2FzdFZhbGlkOworCXU4ICB1bmljYXN0WzE2XTsKK30gTUlDUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHR5cGVsZW47CisKKwl1bmlvbiB7CisJICAgIHU4IHNuYXBbOF07CisJICAgIHN0cnVjdCB7CisJCXU4IGRzYXA7CisJCXU4IHNzYXA7CisJCXU4IGNvbnRyb2w7CisJCXU4IG9yZ2NvZGVbM107CisJCXU4IGZpZWxkdHlwZVsyXTsKKwkgICAgfSBsbGM7CisJfSB1OworCXUzMiBtaWM7CisJdTMyIHNlcTsKK30gTUlDQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZGFbRVRIX0FMRU5dOworCXU4IHNhW0VUSF9BTEVOXTsKK30gZXRoZXJIZWFkOworCisjcHJhZ21hIHBhY2soKQorCisjZGVmaW5lIFRYQ1RMX1RYT0sgKDE8PDEpIC8qIHJlcG9ydCBpZiB0eCBpcyBvayAqLworI2RlZmluZSBUWENUTF9UWEVYICgxPDwyKSAvKiByZXBvcnQgaWYgdHggZmFpbHMgKi8KKyNkZWZpbmUgVFhDVExfODAyXzMgKDA8PDMpIC8qIDgwMi4zIHBhY2tldCAqLworI2RlZmluZSBUWENUTF84MDJfMTEgKDE8PDMpIC8qIDgwMi4xMSBtYWMgcGFja2V0ICovCisjZGVmaW5lIFRYQ1RMX0VUSEVSTkVUICgwPDw0KSAvKiBwYXlsb2FkIGhhcyBldGhlcnR5cGUgKi8KKyNkZWZpbmUgVFhDVExfTExDICgxPDw0KSAvKiBwYXlsb2FkIGlzIGxsYyAqLworI2RlZmluZSBUWENUTF9SRUxFQVNFICgwPDw1KSAvKiByZWxlYXNlIGFmdGVyIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgVFhDVExfTk9SRUxFQVNFICgxPDw1KSAvKiBvbiBjb21wbGV0aW9uIHJldHVybnMgdG8gaG9zdCAqLworCisjZGVmaW5lIEJVU1lfRklEIDB4MTAwMDAKKworI2lmZGVmIENJU0NPX0VYVAorI2RlZmluZSBBSVJPTUFHSUMJMHhhNTVhCisvKiBXYXJuaW5nIDogU0lPQ0RFVlBSSVZBVEUgbWF5IGRpc2FwZWFyIGR1cmluZyAyLjUuWCAtIEplYW4gSUkgKi8KKyNpZmRlZiBTSU9DSVdGSVJTVFBSSVYKKyNpZmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBBSVJPT0xESU9DVEwJU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgQUlST09MRElESUZDIAlBSVJPT0xESU9DVEwgKyAxCisjZW5kaWYgLyogU0lPQ0RFVlBSSVZBVEUgKi8KKyNlbHNlIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYgU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKy8qIFRoaXMgbWF5IGJlIHdyb25nLiBXaGVuIHVzaW5nIHRoZSBuZXcgU0lPQ0lXRklSU1RQUklWIHJhbmdlLCB3ZSBwcm9iYWJseQorICogc2hvdWxkIHVzZSBvbmx5ICJHRVQiIGlvY3RscyAobGFzdCBiaXQgc2V0IHRvIDEpLiAiU0VUIiBpb2N0bHMgYXJlIHJvb3QKKyAqIG9ubHkgYW5kIGRvbid0IHJldHVybiB0aGUgbW9kaWZpZWQgc3RydWN0IGlmcmVxIHRvIHRoZSBhcHBsaWNhdGlvbiB3aGljaAorICogaXMgdXN1YWxseSBhIHByb2JsZW0uIC0gSmVhbiBJSSAqLworI2RlZmluZSBBSVJPSU9DVEwJU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIEFJUk9JRElGQyAJQUlST0lPQ1RMICsgMQorCisvKiBJb2N0bCBjb25zdGFudHMgdG8gYmUgdXNlZCBpbiBhaXJvX2lvY3RsLmNvbW1hbmQgKi8KKworI2RlZmluZQlBSVJPR0NBUCAgCQkwCS8vIENhcGFiaWxpdHkgcmlkCisjZGVmaW5lIEFJUk9HQ0ZHCQkxICAgICAgIC8vIFVTRUQgQSBMT1QKKyNkZWZpbmUgQUlST0dTTElTVAkJMgkvLyBTeXN0ZW0gSUQgbGlzdAorI2RlZmluZSBBSVJPR1ZMSVNUCQkzICAgICAgIC8vIExpc3Qgb2Ygc3BlY2lmaWVkIEFQJ3MKKyNkZWZpbmUgQUlST0dEUlZOQU0JCTQJLy8gIE5PVFVTRUQKKyNkZWZpbmUgQUlST0dFSFRFTkMJCTUJLy8gTk9UVVNFRAorI2RlZmluZSBBSVJPR1dFUEtUTVAJCTYKKyNkZWZpbmUgQUlST0dXRVBLTlYJCTcKKyNkZWZpbmUgQUlST0dTVEFUCQk4CisjZGVmaW5lIEFJUk9HU1RBVFNDMzIJCTkKKyNkZWZpbmUgQUlST0dTVEFUU0QzMgkJMTAKKyNkZWZpbmUgQUlST0dNSUNSSUQJCTExCisjZGVmaW5lIEFJUk9HTUlDU1RBVFMJCTEyCisjZGVmaW5lIEFJUk9HRkxBR1MJCTEzCisjZGVmaW5lIEFJUk9HSUQJCQkxNAorI2RlZmluZSBBSVJPUlJJRAkJMTUKKyNkZWZpbmUgQUlST1JTV1ZFUlNJT04JCTE3CisKKy8qIExlYXZlIGdhcCBvZiA0MCBjb21tYW5kcyBhZnRlciBBSVJPR1NUQVRTRDMyIGZvciBmdXR1cmUgKi8KKworI2RlZmluZSBBSVJPUENBUCAgICAgICAgICAgICAgIAlBSVJPR1NUQVRTRDMyICsgNDAKKyNkZWZpbmUgQUlST1BWTElTVCAgICAgICAgICAgICAgQUlST1BDQVAgICAgICArIDEKKyNkZWZpbmUgQUlST1BTTElTVAkJQUlST1BWTElTVCAgICArIDEKKyNkZWZpbmUgQUlST1BDRkcJCUFJUk9QU0xJU1QgICAgKyAxCisjZGVmaW5lIEFJUk9QU0lEUwkJQUlST1BDRkcgICAgICArIDEKKyNkZWZpbmUgQUlST1BBUExJU1QJCUFJUk9QU0lEUyAgICAgKyAxCisjZGVmaW5lIEFJUk9QTUFDT04JCUFJUk9QQVBMSVNUICAgKyAxCS8qIEVuYWJsZSBtYWMgICovCisjZGVmaW5lIEFJUk9QTUFDT0ZGCQlBSVJPUE1BQ09OICAgICsgMSAJLyogRGlzYWJsZSBtYWMgKi8KKyNkZWZpbmUgQUlST1BTVENMUgkJQUlST1BNQUNPRkYgICArIDEKKyNkZWZpbmUgQUlST1BXRVBLRVkJCUFJUk9QU1RDTFIgICAgKyAxCisjZGVmaW5lIEFJUk9QV0VQS0VZTlYJCUFJUk9QV0VQS0VZICAgKyAxCisjZGVmaW5lIEFJUk9QTEVBUFBXRCAgICAgICAgICAgIEFJUk9QV0VQS0VZTlYgKyAxCisjZGVmaW5lIEFJUk9QTEVBUFVTUiAgICAgICAgICAgIEFJUk9QTEVBUFBXRCAgKyAxCisKKy8qIEZsYXNoIGNvZGVzICovCisKKyNkZWZpbmUgQUlST0ZMU0hSU1QJICAgICAgIEFJUk9QV0VQS0VZTlYgICsgNDAKKyNkZWZpbmUgQUlST0ZMU0hHQ0hSICAgICAgICAgICBBSVJPRkxTSFJTVCAgICArIDEKKyNkZWZpbmUgQUlST0ZMU0hTVEZMICAgICAgICAgICBBSVJPRkxTSEdDSFIgICArIDEKKyNkZWZpbmUgQUlST0ZMU0hQQ0hSICAgICAgICAgICBBSVJPRkxTSFNURkwgICArIDEKKyNkZWZpbmUgQUlST0ZMUFVUQlVGICAgICAgICAgICBBSVJPRkxTSFBDSFIgICArIDEKKyNkZWZpbmUgQUlST1JFU1RBUlQgICAgICAgICAgICBBSVJPRkxQVVRCVUYgICArIDEKKworI2RlZmluZSBGTEFTSFNJWkUJMzI3NjgKKyNkZWZpbmUgQVVYTUVNU0laRQkoMjU2ICogMTAyNCkKKwordHlwZWRlZiBzdHJ1Y3QgYWlyb25ldF9pb2N0bCB7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsJCS8vIFdoYXQgdG8gZG8KKwl1bnNpZ25lZCBzaG9ydCBsZW47CQkvLyBMZW4gb2YgZGF0YQorCXVuc2lnbmVkIHNob3J0IHJpZG51bTsJCS8vIHJpZCBudW1iZXIKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqZGF0YTsJLy8gZC1kYXRhCit9IGFpcm9uZXRfaW9jdGw7CisKK3N0YXRpYyBjaGFyICpzd3ZlcnNpb24gPSAiMi4xIjsKKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKworI2RlZmluZSBOVU1fTU9EVUxFUyAgICAgICAyCisjZGVmaW5lIE1JQ19NU0dMRU5fTUFYICAgIDI0MDAKKyNkZWZpbmUgRU1NSDMyX01TR0xFTl9NQVggTUlDX01TR0xFTl9NQVgKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiAgIHNpemU7ICAgICAgICAgICAgLy8gc2l6ZQorCXU4ICAgIGVuYWJsZWQ7ICAgICAgICAgLy8gTUlDIGVuYWJsZWQgb3Igbm90CisJdTMyICAgcnhTdWNjZXNzOyAgICAgICAvLyBzdWNjZXNzZnVsIHBhY2tldHMgcmVjZWl2ZWQKKwl1MzIgICByeEluY29ycmVjdE1JQzsgIC8vIHBrdHMgZHJvcHBlZCBkdWUgdG8gaW5jb3JyZWN0IE1JQyBjb21wYXJpc29uCisJdTMyICAgcnhOb3RNSUNlZDsgICAgICAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIG5vdCBiZWluZyBNSUMnZAorCXUzMiAgIHJ4TUlDUGx1bW1lZDsgICAgLy8gcGt0cyBkcm9wcGVkIGR1ZSB0byBub3QgaGF2aW5nIGEgTUlDIHBsdW1tZWQKKwl1MzIgICByeFdyb25nU2VxdWVuY2U7IC8vIHBrdHMgZHJvcHBlZCBkdWUgdG8gc2VxdWVuY2UgbnVtYmVyIHZpb2xhdGlvbgorCXUzMiAgIHJlc2VydmVbMzJdOworfSBtaWNfc3RhdGlzdGljczsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjb2VmZlsoKEVNTUgzMl9NU0dMRU5fTUFYKSszKT4+Ml07CisJdTY0IGFjY3VtOwkvLyBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkKKwlpbnQgcG9zaXRpb247CS8vIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlCisJdW5pb24geworCQl1OCAgZDhbNF07CisJCXUzMiBkMzI7CisJfSBwYXJ0OwkvLyBzYXZlcyBwYXJ0aWFsIG1lc3NhZ2Ugd29yZCBhY3Jvc3MgdXBkYXRlKCkgY2FsbHMKK30gZW1taDMyX2NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwllbW1oMzJfY29udGV4dCBzZWVkOwkgICAgLy8gQ29udGV4dCAtIHRoZSBzZWVkCisJdTMyCQkgcng7CSAgICAvLyBSZWNlaXZlZCBzZXF1ZW5jZSBudW1iZXIKKwl1MzIJCSB0eDsJICAgIC8vIFR4IHNlcXVlbmNlIG51bWJlcgorCXUzMgkJIHdpbmRvdzsgICAgLy8gU3RhcnQgb2Ygd2luZG93CisJdTgJCSB2YWxpZDsJICAgIC8vIEZsYWcgdG8gc2F5IGlmIGNvbnRleHQgaXMgdmFsaWQgb3Igbm90CisJdTgJCSBrZXlbMTZdOworfSBtaWNjbnR4OworCit0eXBlZGVmIHN0cnVjdCB7CisJbWljY250eCBtQ3R4OwkJLy8gTXVsdGljYXN0IGNvbnRleHQKKwltaWNjbnR4IHVDdHg7CQkvLyBVbmljYXN0IGNvbnRleHQKK30gbWljX21vZHVsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgcmlkOiAxNjsKKwl1bnNpZ25lZCBpbnQgIGxlbjogMTU7CisJdW5zaWduZWQgaW50ICB2YWxpZDogMTsKKwlkbWFfYWRkcl90IGhvc3RfYWRkcjsKK30gUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICBvZmZzZXQ6IDE1OworCXVuc2lnbmVkIGludCAgZW9jOiAxOworCXVuc2lnbmVkIGludCAgbGVuOiAxNTsKKwl1bnNpZ25lZCBpbnQgIHZhbGlkOiAxOworCWRtYV9hZGRyX3QgaG9zdF9hZGRyOworfSBUeEZpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgY3RsOiAxNTsKKwl1bnNpZ25lZCBpbnQgIHJkeTogMTsKKwl1bnNpZ25lZCBpbnQgIGxlbjogMTU7CisJdW5zaWduZWQgaW50ICB2YWxpZDogMTsKKwlkbWFfYWRkcl90IGhvc3RfYWRkcjsKK30gUnhGaWQ7CisKKy8qCisgKiBIb3N0IHJlY2VpdmUgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpjYXJkX3JhbV9vZmY7IC8qIG9mZnNldCBpbnRvIGNhcmQgbWVtb3J5IG9mIHRoZQorCQkJCQkJZGVzYyAqLworCVJ4RmlkICAgICAgICAgcnhfZGVzYzsJCSAgICAgLyogY2FyZCByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwljaGFyICAgICAgICAgICp2aXJ0dWFsX2hvc3RfYWRkcjsgICAgLyogdmlydHVhbCBhZGRyZXNzIG9mIGhvc3QgcmVjZWl2ZQorCQkJCQkgICAgICAgIGJ1ZmZlciAqLworCWludCAgICAgICAgICAgcGVuZGluZzsKK30gSG9zdFJ4RGVzYzsKKworLyoKKyAqIEhvc3QgdHJhbnNtaXQgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpjYXJkX3JhbV9vZmY7CSAgICAgLyogb2Zmc2V0IGludG8gY2FyZCBtZW1vcnkgb2YgdGhlCisJCQkJCQlkZXNjICovCisJVHhGaWQgICAgICAgICB0eF9kZXNjOwkJICAgICAvKiBjYXJkIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwljaGFyICAgICAgICAgICp2aXJ0dWFsX2hvc3RfYWRkcjsgICAgLyogdmlydHVhbCBhZGRyZXNzIG9mIGhvc3QgcmVjZWl2ZQorCQkJCQkgICAgICAgIGJ1ZmZlciAqLworCWludCAgICAgICAgICAgcGVuZGluZzsKK30gSG9zdFR4RGVzYzsKKworLyoKKyAqIEhvc3QgUklEIGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqY2FyZF9yYW1fb2ZmOyAgICAgIC8qIG9mZnNldCBpbnRvIGNhcmQgbWVtb3J5IG9mIHRoZQorCQkJCQkgICAgIGRlc2NyaXB0b3IgKi8KKwlSaWQgICAgICAgICAgIHJpZF9kZXNjOwkJICAvKiBjYXJkIFJJRCBkZXNjcmlwdG9yICovCisJY2hhciAgICAgICAgICAqdmlydHVhbF9ob3N0X2FkZHI7IC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBob3N0IHJlY2VpdmUKKwkJCQkJICAgICBidWZmZXIgKi8KK30gSG9zdFJpZERlc2M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgc3cwOworCXUxNiBzdzE7CisJdTE2IHN0YXR1czsKKwl1MTYgbGVuOworI2RlZmluZSBIT1NUX1NFVCAoMSA8PCAwKQorI2RlZmluZSBIT1NUX0lOVF9UWCAoMSA8PCAxKSAvKiBJbnRlcnJ1cHQgb24gc3VjY2Vzc2Z1bCBUWCAqLworI2RlZmluZSBIT1NUX0lOVF9UWEVSUiAoMSA8PCAyKSAvKiBJbnRlcnJ1cHQgb24gdW5zZWNjZXNzZnVsIFRYICovCisjZGVmaW5lIEhPU1RfTENDX1BBWUxPQUQgKDEgPDwgNCkgLyogTExDIHBheWxvYWQsIDAgPSBFdGhlcnR5cGUgKi8KKyNkZWZpbmUgSE9TVF9ET05UX1JMU0UgKDEgPDwgNSkgLyogRG9uJ3QgcmVsZWFzZSBidWZmZXIgd2hlbiBkb25lICovCisjZGVmaW5lIEhPU1RfRE9OVF9SRVRSWSAoMSA8PCA2KSAvKiBEb24ndCByZXRyeSB0cmFzbWl0ICovCisjZGVmaW5lIEhPU1RfQ0xSX0FJRCAoMSA8PCA3KSAvKiBjbGVhciBBSUQgZmFpbHVyZSAqLworI2RlZmluZSBIT1NUX1JUUyAoMSA8PCA5KSAvKiBGb3JjZSBSVFMgdXNlICovCisjZGVmaW5lIEhPU1RfU0hPUlQgKDEgPDwgMTApIC8qIERvIHNob3J0IHByZWFtYmxlICovCisJdTE2IGN0bDsKKwl1MTYgYWlkOworCXUxNiByZXRyaWVzOworCXUxNiBmaWxsOworfSBUeEN0bEhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1MTYgY3RsOworICAgICAgICB1MTYgZHVyYXRpb247CisgICAgICAgIGNoYXIgYWRkcjFbNl07CisgICAgICAgIGNoYXIgYWRkcjJbNl07CisgICAgICAgIGNoYXIgYWRkcjNbNl07CisgICAgICAgIHUxNiBzZXE7CisgICAgICAgIGNoYXIgYWRkcjRbNl07Cit9IFdpZmlIZHI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCVR4Q3RsSGRyIGN0bGhkcjsKKwl1MTYgZmlsbDE7CisJdTE2IGZpbGwyOworCVdpZmlIZHIgd2lmaWhkcjsKKwl1MTYgZ2FwbGVuOworCXUxNiBzdGF0dXM7Cit9IFdpZmlDdGxIZHI7CisKK1dpZmlDdGxIZHIgd2lmaWN0bGhkcjgwMjMgPSB7CisJLmN0bGhkciA9IHsKKwkJLmN0bAk9IEhPU1RfRE9OVF9STFNFLAorCX0KK307CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8vIEZyZXF1ZW5jeSBsaXN0IChtYXAgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMpCitzdGF0aWMgY29uc3QgbG9uZyBmcmVxdWVuY3lfbGlzdFtdID0geyAyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAorCQkJCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQgfTsKKworLy8gQSBmZXcgZGV0YWlscyBuZWVkZWQgZm9yIFdFUCAoV2lyZWxlc3MgRXF1aXZhbGVudCBQcml2YWN5KQorI2RlZmluZSBNQVhfS0VZX1NJWkUgMTMJCQkvLyAxMjggKD8pIGJpdHMKKyNkZWZpbmUgTUlOX0tFWV9TSVpFICA1CQkJLy8gNDAgYml0cyBSQzQgLSBXRVAKK3R5cGVkZWYgc3RydWN0IHdlcF9rZXlfdCB7CisJdTE2CWxlbjsKKwl1OAlrZXlbMTZdOwkvKiA0MC1iaXQgYW5kIDEwNC1iaXQga2V5cyAqLworfSB3ZXBfa2V5X3Q7CisKKy8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNpZm5kZWYgSVdfRU5DT0RFX05PS0VZCisjZGVmaW5lIElXX0VOQ09ERV9OT0tFWSAgICAgICAgIDB4MDgwMCAgLyogS2V5IGlzIHdyaXRlIG9ubHksIHNvIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIElXX0VOQ09ERV9NT0RFICAoSVdfRU5DT0RFX0RJU0FCTEVEIHwgSVdfRU5DT0RFX1JFU1RSSUNURUQgfCBJV19FTkNPREVfT1BFTikKKyNlbmRpZiAvKiBJV19FTkNPREVfTk9LRVkgKi8KKworLyogTGlzdCBvZiBXaXJlbGVzcyBIYW5kbGVycyAobmV3IEFQSSkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJYWlyb19oYW5kbGVyX2RlZjsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gImFpcm8uYyAwLjYgKEJlbiBSZWVkICYgSmF2aWVyIEFjaGlyaWNhKSI7CisKK3N0cnVjdCBhaXJvX2luZm87CisKK3N0YXRpYyBpbnQgZ2V0X2RlY191MTYoIGNoYXIgKmJ1ZmZlciwgaW50ICpzdGFydCwgaW50IGxpbWl0ICk7CitzdGF0aWMgdm9pZCBPVVQ0NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByZWdpc3RlciwgdTE2IHZhbHVlICk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgSU40NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByZWdpc3RlciApOworc3RhdGljIHUxNiBzZXR1cF9jYXJkKHN0cnVjdCBhaXJvX2luZm8qLCB1OCAqbWFjLCBpbnQgbG9jayk7CitzdGF0aWMgaW50IGVuYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBSZXNwICpyc3AsIGludCBsb2NrICk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spOworc3RhdGljIHZvaWQgZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGFpcm9faW5mbyopOworc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKK3N0YXRpYyB1MTYgaXNzdWVjb21tYW5kKHN0cnVjdCBhaXJvX2luZm8qLCBDbWQgKnBDbWQsIFJlc3AgKnBSc3ApOworc3RhdGljIGludCBiYXBfc2V0dXAoc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIHUxNiBvZmZzZXQsIGludCB3aGljaGJhcCk7CitzdGF0aWMgaW50IGF1eF9iYXBfcmVhZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2ICpwdTE2RHN0LCBpbnQgYnl0ZWxlbiwKKwkJCWludCB3aGljaGJhcCk7CitzdGF0aWMgaW50IGZhc3RfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQkgaW50IHdoaWNoYmFwKTsKK3N0YXRpYyBpbnQgYmFwX3dyaXRlKHN0cnVjdCBhaXJvX2luZm8qLCBjb25zdCB1MTYgKnB1MTZTcmMsIGludCBieXRlbGVuLAorCQkgICAgIGludCB3aGljaGJhcCk7CitzdGF0aWMgaW50IFBDNDUwMF9hY2Nlc3NyaWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIHUxNiBhY2NtZCk7CitzdGF0aWMgaW50IFBDNDUwMF9yZWFkcmlkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCB2b2lkICpwQnVmLCBpbnQgbGVuLCBpbnQgbG9jayk7CitzdGF0aWMgaW50IFBDNDUwMF93cml0ZXJpZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgY29uc3Qgdm9pZAorCQkJICAgKnBCdWYsIGludCBsZW4sIGludCBsb2NrKTsKK3N0YXRpYyBpbnQgZG9fd3JpdGVyaWQoIHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCBjb25zdCB2b2lkICpyaWRfZGF0YSwKKwkJCWludCBsZW4sIGludCBkdW1teSApOworc3RhdGljIHUxNiB0cmFuc21pdF9hbGxvY2F0ZShzdHJ1Y3QgYWlyb19pbmZvKiwgaW50IGxlblBheWxvYWQsIGludCByYXcpOworc3RhdGljIGludCB0cmFuc21pdF84MDJfM19wYWNrZXQoc3RydWN0IGFpcm9faW5mbyosIGludCBsZW4sIGNoYXIgKnBQYWNrZXQpOworc3RhdGljIGludCB0cmFuc21pdF84MDJfMTFfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8qLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KTsKKworc3RhdGljIGludCBtcGlfc2VuZF9wYWNrZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbXBpX3VubWFwX2NhcmQoc3RydWN0IHBjaV9kZXYgKnBjaSk7CitzdGF0aWMgdm9pZCBtcGlfcmVjZWl2ZV84MDJfMyhzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgdm9pZCBtcGlfcmVjZWl2ZV84MDJfMTEoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIGludCB3YWl0YnVzeSAoc3RydWN0IGFpcm9faW5mbyAqYWkpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWlyb19pbnRlcnJ1cHQoIGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MKKwkJCSAgICAqcmVncyk7CitzdGF0aWMgaW50IGFpcm9fdGhyZWFkKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgdGltZXJfZnVuYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBhaXJvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworI2lmZGVmIFdJUkVMRVNTX0VYVAorc3RydWN0IGl3X3N0YXRpc3RpY3MgKmFpcm9fZ2V0X3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyAoc3RydWN0IGFpcm9faW5mbyAqbG9jYWwpOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworI2lmZGVmIENJU0NPX0VYVAorc3RhdGljIGludCByZWFkcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKTsKK3N0YXRpYyBpbnQgd3JpdGVyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApOworaW50IGZsYXNoY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKTsKKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKyNpZmRlZiBNSUNTVVBQT1JUCitzdGF0aWMgdm9pZCBtaWNpbml0KHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgbWljc2V0dXAoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIGludCBlbmNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgZXRoZXJIZWFkICpwUGFja2V0LCBNSUNCdWZmZXIgKmJ1ZmZlciwgaW50IGxlbik7CitzdGF0aWMgaW50IGRlY2Fwc3VsYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBNSUNCdWZmZXIgKm1pYywgZXRoZXJIZWFkICpwUGFja2V0LCB1MTYgcGF5TGVuKTsKKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2VuZGlmCisKK3N0cnVjdCBhaXJvX2luZm8geworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAgICpkZXY7CisJLyogTm90ZSwgd2UgY2FuIGhhdmUgTUFYX0ZJRFMgb3V0c3RhbmRpbmcuICBGSURzIGFyZSAxNi1iaXRzLCBzbyB3ZQorCSAgIHVzZSB0aGUgaGlnaCBiaXQgdG8gbWFyayB3aGV0aGVyIGl0IGlzIGluIHVzZS4gKi8KKyNkZWZpbmUgTUFYX0ZJRFMgNgorI2RlZmluZSBNUElfTUFYX0ZJRFMgMQorCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZHNbTUFYX0ZJRFNdOworCUNvbmZpZ1JpZCBjb25maWc7CisJY2hhciBrZXlpbmRleDsgLy8gVXNlZCB3aXRoIGF1dG8gd2VwCisJY2hhciBkZWZpbmRleDsgLy8gVXNlZCB3aXRoIGF1dG8gd2VwCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5OworICAgICAgICBzcGlubG9ja190IGF1eF9sb2NrOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBGTEFHX1BST01JU0MJOAkvKiBJRkZfUFJPTUlTQyAweDEwMCAtIGluY2x1ZGUvbGludXgvaWYuaCAqLworI2RlZmluZSBGTEFHX1JBRElPX09GRgkwCS8qIFVzZXIgZGlzYWJsaW5nIG9mIE1BQyAqLworI2RlZmluZSBGTEFHX1JBRElPX0RPV04JMQkvKiBpZnVwL2lmZG93biBkaXNhYmxpbmcgb2YgTUFDICovCisjZGVmaW5lIEZMQUdfUkFESU9fTUFTSyAweDAzCisjZGVmaW5lIEZMQUdfRU5BQkxFRAkyCisjZGVmaW5lIEZMQUdfQURIT0MJMwkvKiBOZWVkZWQgYnkgTUlDICovCisjZGVmaW5lIEZMQUdfTUlDX0NBUEFCTEUgNAorI2RlZmluZSBGTEFHX1VQREFURV9NVUxUSSA1CisjZGVmaW5lIEZMQUdfVVBEQVRFX1VOSSA2CisjZGVmaW5lIEZMQUdfODAyXzExCTcKKyNkZWZpbmUgRkxBR19QRU5ESU5HX1hNSVQgOQorI2RlZmluZSBGTEFHX1BFTkRJTkdfWE1JVDExIDEwCisjZGVmaW5lIEZMQUdfTVBJCTExCisjZGVmaW5lIEZMQUdfUkVHSVNURVJFRAkxMgorI2RlZmluZSBGTEFHX0NPTU1JVAkxMworI2RlZmluZSBGTEFHX1JFU0VUCTE0CisjZGVmaW5lIEZMQUdfRkxBU0hJTkcJMTUKKyNkZWZpbmUgSk9CX01BU0sJMHgxZmYwMDAwCisjZGVmaW5lIEpPQl9ESUUJCTE2CisjZGVmaW5lIEpPQl9YTUlUCTE3CisjZGVmaW5lIEpPQl9YTUlUMTEJMTgKKyNkZWZpbmUgSk9CX1NUQVRTCTE5CisjZGVmaW5lIEpPQl9QUk9NSVNDCTIwCisjZGVmaW5lIEpPQl9NSUMJCTIxCisjZGVmaW5lIEpPQl9FVkVOVAkyMgorI2RlZmluZSBKT0JfQVVUT1dFUAkyMworI2RlZmluZSBKT0JfV1NUQVRTCTI0CisJaW50ICgqYmFwX3JlYWQpKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgKnB1MTZEc3QsIGludCBieXRlbGVuLAorCQkJaW50IHdoaWNoYmFwKTsKKwl1bnNpZ25lZCBzaG9ydCAqZmxhc2g7CisJdGRzUnNzaUVudHJ5ICpyc3NpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwlwaWRfdCB0aHJfcGlkOworCXdhaXRfcXVldWVfaGVhZF90IHRocl93YWl0OworCXN0cnVjdCBjb21wbGV0aW9uIHRocl9leGl0ZWQ7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzOworCXN0cnVjdCB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBmaWQ7CisJfSB4bWl0LCB4bWl0MTE7CisJc3RydWN0IG5ldF9kZXZpY2UgKndpZmlkZXY7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisJc3RydWN0IGl3X3N0YXRpc3RpY3MJd3N0YXRzOwkJLy8gd2lyZWxlc3Mgc3RhdHMKKwl1bnNpZ25lZCBsb25nCQlzY2FuX3RpbWVzdGFtcDsJLyogVGltZSBzdGFydGVkIHRvIHNjYW4gKi8KKwlzdHJ1Y3QgaXdfc3B5X2RhdGEJc3B5X2RhdGE7CisJc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisjaWZkZWYgTUlDU1VQUE9SVAorCS8qIE1JQyBzdHVmZiAqLworCXN0cnVjdCBjcnlwdG9fdGZtCSp0Zm07CisJbWljX21vZHVsZQkJbW9kWzJdOworCW1pY19zdGF0aXN0aWNzCQltaWNzdGF0czsKKyNlbmRpZgorCUhvc3RSeERlc2MgcnhmaWRzW01QSV9NQVhfRklEU107IC8vIHJ4L3R4L2NvbmZpZyBNUEkzNTAgZGVzY3JpcHRvcnMKKwlIb3N0VHhEZXNjIHR4Zmlkc1tNUElfTUFYX0ZJRFNdOworCUhvc3RSaWREZXNjIGNvbmZpZ19kZXNjOworCXVuc2lnbmVkIGxvbmcgcmlkYnVzOyAvLyBwaHlzIGFkZHIgb2YgY29uZmlnX2Rlc2MKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4cTsvLyB0eCBxdWV1ZSB1c2VkIGJ5IG1waTM1MCBjb2RlCisJc3RydWN0IHBjaV9kZXYgICAgICAgICAgKnBjaTsKKwl1bnNpZ25lZCBjaGFyCQlfX2lvbWVtICpwY2ltZW07CisJdW5zaWduZWQgY2hhcgkJX19pb21lbSAqcGNpYXV4OworCXVuc2lnbmVkIGNoYXIJCSpzaGFyZWQ7CisJZG1hX2FkZHJfdAkJc2hhcmVkX2RtYTsKKwlpbnQJCQlwb3dlcjsKKwlTc2lkUmlkCQkJKlNTSUQ7CisJQVBMaXN0UmlkCQkqQVBMaXN0OworI2RlZmluZQlQQ0lfU0hBUkVEX0xFTgkJMipNUElfTUFYX0ZJRFMqUEtUU0laRStSSURTSVpFCisJY2hhcgkJCXByb2NfbmFtZVtJRk5BTVNJWl07Cit9OworCitzdGF0aWMgaW5saW5lIGludCBiYXBfcmVhZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2ICpwdTE2RHN0LCBpbnQgYnl0ZWxlbiwKKwkJCSAgIGludCB3aGljaGJhcCkgeworCXJldHVybiBhaS0+YmFwX3JlYWQoYWksIHB1MTZEc3QsIGJ5dGVsZW4sIHdoaWNoYmFwKTsKK30KKworc3RhdGljIGludCBzZXR1cF9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApOworc3RhdGljIGludCB0YWtlZG93bl9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ICk7CisKKyNpZmRlZiBNSUNTVVBQT1JUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlDIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGludCBSeFNlcVZhbGlkIChzdHJ1Y3QgYWlyb19pbmZvICphaSxtaWNjbnR4ICpjb250ZXh0LGludCBtY2FzdCx1MzIgbWljU2VxKTsKK3N0YXRpYyB2b2lkIE1vdmVXaW5kb3cobWljY250eCAqY29udGV4dCwgdTMyIG1pY1NlcSk7Cit2b2lkIGVtbWgzMl9zZXRzZWVkKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcGtleSwgaW50IGtleWxlbiwgc3RydWN0IGNyeXB0b190Zm0gKik7Cit2b2lkIGVtbWgzMl9pbml0KGVtbWgzMl9jb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgZW1taDMyX3VwZGF0ZShlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBPY3RldHMsIGludCBsZW4pOwordm9pZCBlbW1oMzJfZmluYWwoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4IGRpZ2VzdFs0XSk7CisKKy8qIG1pY2luaXQgLSBJbml0aWFsaXplIG1pYyBzZWVkICovCisKK3N0YXRpYyB2b2lkIG1pY2luaXQoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJTUlDUmlkIG1pY19yaWQ7CisKKwljbGVhcl9iaXQoSk9CX01JQywgJmFpLT5mbGFncyk7CisJUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9NSUMsICZtaWNfcmlkLCBzaXplb2YobWljX3JpZCksIDApOworCXVwKCZhaS0+c2VtKTsKKworCWFpLT5taWNzdGF0cy5lbmFibGVkID0gKG1pY19yaWQuc3RhdGUgJiAweDAwRkYpID8gMSA6IDA7CisKKwlpZiAoYWktPm1pY3N0YXRzLmVuYWJsZWQpIHsKKwkJLyogS2V5IG11c3QgYmUgdmFsaWQgYW5kIGRpZmZlcmVudCAqLworCQlpZiAobWljX3JpZC5tdWx0aWNhc3RWYWxpZCAmJiAoIWFpLT5tb2RbMF0ubUN0eC52YWxpZCB8fAorCQkgICAgKG1lbWNtcCAoYWktPm1vZFswXS5tQ3R4LmtleSwgbWljX3JpZC5tdWx0aWNhc3QsCisJCQkgICAgIHNpemVvZihhaS0+bW9kWzBdLm1DdHgua2V5KSkgIT0gMCkpKSB7CisJCQkvKiBBZ2UgY3VycmVudCBtaWMgQ29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzFdLm1DdHgsJmFpLT5tb2RbMF0ubUN0eCxzaXplb2YobWljY250eCkpOworCQkJLyogSW5pdGlhbGl6ZSBuZXcgY29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzBdLm1DdHgua2V5LG1pY19yaWQubXVsdGljYXN0LHNpemVvZihtaWNfcmlkLm11bHRpY2FzdCkpOworCQkJYWktPm1vZFswXS5tQ3R4LndpbmRvdyAgPSAzMzsgLy9XaW5kb3cgYWx3YXlzIHBvaW50cyB0byB0aGUgbWlkZGxlCisJCQlhaS0+bW9kWzBdLm1DdHgucnggICAgICA9IDA7ICAvL1J4IFNlcXVlbmNlIG51bWJlcnMKKwkJCWFpLT5tb2RbMF0ubUN0eC50eCAgICAgID0gMDsgIC8vVHggc2VxdWVuY2UgbnVtYmVycworCQkJYWktPm1vZFswXS5tQ3R4LnZhbGlkICAgPSAxOyAgLy9LZXkgaXMgbm93IHZhbGlkCisgIAorCQkJLyogR2l2ZSBrZXkgdG8gbWljIHNlZWQgKi8KKwkJCWVtbWgzMl9zZXRzZWVkKCZhaS0+bW9kWzBdLm1DdHguc2VlZCxtaWNfcmlkLm11bHRpY2FzdCxzaXplb2YobWljX3JpZC5tdWx0aWNhc3QpLCBhaS0+dGZtKTsKKwkJfQorCisJCS8qIEtleSBtdXN0IGJlIHZhbGlkIGFuZCBkaWZmZXJlbnQgKi8KKwkJaWYgKG1pY19yaWQudW5pY2FzdFZhbGlkICYmICghYWktPm1vZFswXS51Q3R4LnZhbGlkIHx8IAorCQkgICAgKG1lbWNtcChhaS0+bW9kWzBdLnVDdHgua2V5LCBtaWNfcmlkLnVuaWNhc3QsCisJCQkgICAgc2l6ZW9mKGFpLT5tb2RbMF0udUN0eC5rZXkpKSAhPSAwKSkpIHsKKwkJCS8qIEFnZSBjdXJyZW50IG1pYyBDb250ZXh0ICovCisJCQltZW1jcHkoJmFpLT5tb2RbMV0udUN0eCwmYWktPm1vZFswXS51Q3R4LHNpemVvZihtaWNjbnR4KSk7CisJCQkvKiBJbml0aWFsaXplIG5ldyBjb250ZXh0ICovCisJCQltZW1jcHkoJmFpLT5tb2RbMF0udUN0eC5rZXksbWljX3JpZC51bmljYXN0LHNpemVvZihtaWNfcmlkLnVuaWNhc3QpKTsKKwkKKwkJCWFpLT5tb2RbMF0udUN0eC53aW5kb3cgID0gMzM7IC8vV2luZG93IGFsd2F5cyBwb2ludHMgdG8gdGhlIG1pZGRsZQorCQkJYWktPm1vZFswXS51Q3R4LnJ4ICAgICAgPSAwOyAgLy9SeCBTZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLnVDdHgudHggICAgICA9IDA7ICAvL1R4IHNlcXVlbmNlIG51bWJlcnMKKwkJCWFpLT5tb2RbMF0udUN0eC52YWxpZCAgID0gMTsgIC8vS2V5IGlzIG5vdyB2YWxpZAorCQorCQkJLy9HaXZlIGtleSB0byBtaWMgc2VlZAorCQkJZW1taDMyX3NldHNlZWQoJmFpLT5tb2RbMF0udUN0eC5zZWVkLCBtaWNfcmlkLnVuaWNhc3QsIHNpemVvZihtaWNfcmlkLnVuaWNhc3QpLCBhaS0+dGZtKTsKKwkJfQorCX0gZWxzZSB7CisgICAgICAvKiBTbyBuZXh0IHRpbWUgd2UgaGF2ZSBhIHZhbGlkIGtleSBhbmQgbWljIGlzIGVuYWJsZWQsIHdlIHdpbGwgdXBkYXRlCisgICAgICAgKiB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIHRoZSBrZXkgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLgorICAgICAgICovCisJCWFpLT5tb2RbMF0udUN0eC52YWxpZCA9IDA7CisJCWFpLT5tb2RbMF0ubUN0eC52YWxpZCA9IDA7CisJfQorfQorCisvKiBtaWNzZXR1cCAtIEdldCByZWFkeSBmb3IgYnVzaW5lc3MgKi8KKworc3RhdGljIGludCBtaWNzZXR1cChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCWludCBpOworCisJaWYgKGFpLT50Zm0gPT0gTlVMTCkKKwkgICAgICAgIGFpLT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhZXMiLCAwKTsKKworICAgICAgICBpZiAoYWktPnRmbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yIEFFU1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SOworICAgICAgICB9CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9NT0RVTEVTOyBpKyspIHsKKwkJbWVtc2V0KCZhaS0+bW9kW2ldLm1DdHgsMCxzaXplb2YobWljY250eCkpOworCQltZW1zZXQoJmFpLT5tb2RbaV0udUN0eCwwLHNpemVvZihtaWNjbnR4KSk7CisJfQorCXJldHVybiBTVUNDRVNTOworfQorCitjaGFyIG1pY3NuYXBbXT0gezB4QUEsMHhBQSwweDAzLDB4MDAsMHg0MCwweDk2LDB4MDAsMHgwMn07CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXNjcmlwdGlvbjogTWljIGEgcGFja2V0CisgKiAgICAKKyAqICAgICAgSW5wdXRzOiBldGhlckhlYWQgKiBwb2ludGVyIHRvIGFuIDgwMi4zIGZyYW1lCisgKiAgICAKKyAqICAgICBSZXR1cm5zOiBCT09MRUFOIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KKyAqICAgICAgICAgICAgIFBhY2tldFR4TGVuIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBtaWMnZCBwYWNrZXRzIHNpemUuCisgKgorICogICAgQ2F2ZWF0czogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBidWZmZXIgd2lsbCBhbHJlYWR5CisgKiAgICAgICAgICAgICBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGxhcmdldHMgbWljIG1lc3NhZ2UgcG9zc2libGUuCisgKiAgICAgICAgICAgIChObyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIGhlcmUpLgorICogIAorICogICAgQXV0aG9yOiBzYnJhbmVreSAoMTAvMTUvMDEpCisgKiAgICBNZXJjaWxlc3MgaGFja3MgYnkgcndpbGNoZXIgKDEvMTQvMDIpCisgKi8KKworc3RhdGljIGludCBlbmNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSAsZXRoZXJIZWFkICpmcmFtZSwgTUlDQnVmZmVyICptaWMsIGludCBwYXlMZW4pCit7CisJbWljY250eCAgICpjb250ZXh0OworCisJLy8gRGV0ZXJtaW5lIGNvcnJlY3QgY29udGV4dAorCS8vIElmIG5vdCBhZGhvYywgYWx3YXlzIHVzZSB1bmljYXN0IGtleQorCisJaWYgKHRlc3RfYml0KEZMQUdfQURIT0MsICZhaS0+ZmxhZ3MpICYmIChmcmFtZS0+ZGFbMF0gJiAweDEpKQorCQljb250ZXh0ID0gJmFpLT5tb2RbMF0ubUN0eDsKKwllbHNlCisJCWNvbnRleHQgPSAmYWktPm1vZFswXS51Q3R4OworICAKKwlpZiAoIWNvbnRleHQtPnZhbGlkKQorCQlyZXR1cm4gRVJST1I7CisKKwltaWMtPnR5cGVsZW4gPSBodG9ucyhwYXlMZW4gKyAxNik7IC8vTGVuZ3RoIG9mIE1pYydkIHBhY2tldAorCisJbWVtY3B5KCZtaWMtPnUuc25hcCwgbWljc25hcCwgc2l6ZW9mKG1pY3NuYXApKTsgLy8gQWRkIFNuYXAKKworCS8vIEFkZCBUeCBzZXF1ZW5jZQorCW1pYy0+c2VxID0gaHRvbmwoY29udGV4dC0+dHgpOworCWNvbnRleHQtPnR4ICs9IDI7CisKKwllbW1oMzJfaW5pdCgmY29udGV4dC0+c2VlZCk7IC8vIE1pYyB0aGUgcGFja2V0CisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCxmcmFtZS0+ZGEsRVRIX0FMRU4gKiAyKTsgLy8gREEsU0EKKwllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCh1OCopJm1pYy0+dHlwZWxlbiwxMCk7IC8vIFR5cGUvTGVuZ3RoIGFuZCBTbmFwCisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwodTgqKSZtaWMtPnNlcSxzaXplb2YobWljLT5zZXEpKTsgLy9TRVEKKwllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLGZyYW1lLT5kYSArIEVUSF9BTEVOICogMixwYXlMZW4pOyAvL3BheWxvYWQKKwllbW1oMzJfZmluYWwoJmNvbnRleHQtPnNlZWQsICh1OCopJm1pYy0+bWljKTsKKworCS8qICAgIE5ldyBUeXBlL2xlbmd0aCA/Pz8/Pz8/Pz8/ICovCisJbWljLT50eXBlbGVuID0gMDsgLy9MZXQgTklDIGtub3cgaXQgY291bGQgYmUgYW4gb3ZlcnNpemVkIHBhY2tldAorCXJldHVybiBTVUNDRVNTOworfQorCit0eXBlZGVmIGVudW0geworICAgIE5PTkUsCisgICAgTk9NSUMsCisgICAgTk9NSUNQTFVNTUVELAorICAgIFNFUVVFTkNFLAorICAgIElOQ09SUkVDVE1JQywKK30gbWljX2Vycm9yOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIERlc2NyaXB0aW9uOiBEZWNhcHN1bGF0ZXMgYSBNSUMnZCBwYWNrZXQgYW5kIHJldHVybnMgdGhlIDgwMi4zIHBhY2tldAorICogICAgICAgICAgICAgICAocmVtb3ZlcyB0aGUgTUlDIHN0dWZmKSBpZiBwYWNrZXQgaXMgYSB2YWxpZCBwYWNrZXQuCisgKiAgICAgIAorICogICAgICAgSW5wdXRzOiBldGhlckhlYWQgIHBvaW50ZXIgdG8gdGhlIDgwMi4zIHBhY2tldCAgICAgICAgICAgICAKKyAqICAgICAKKyAqICAgICAgUmV0dXJuczogQk9PTEVBTiAtIFRSVUUgaWYgcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIG90aGVyd2lzZSBGQUxTRQorICogICAgIAorICogICAgICBBdXRob3I6IHNicmFuZWt5ICgxMC8xNS8wMSkKKyAqICAgIE1lcmNpbGVzcyBoYWNrcyBieSByd2lsY2hlciAoMS8xNC8wMikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBkZWNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgTUlDQnVmZmVyICptaWMsIGV0aGVySGVhZCAqZXRoLCB1MTYgcGF5TGVuKQoreworCWludCAgICAgIGk7CisJdTMyICAgICAgbWljU0VROworCW1pY2NudHggICpjb250ZXh0OworCXU4ICAgICAgIGRpZ2VzdFs0XTsKKwltaWNfZXJyb3IgbWljRXJyb3IgPSBOT05FOworCisJLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBhIE1pYydkIHBhY2tldAorCisJaWYgKCFhaS0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkvL05vIE1pYyBzZXQgb3IgTWljIE9GRiBidXQgd2UgcmVjZWl2ZWQgYSBNSUMnZCBwYWNrZXQuCisJCWlmIChtZW1jbXAgKCh1OCopZXRoICsgMTQsIG1pY3NuYXAsIHNpemVvZihtaWNzbmFwKSkgPT0gMCkgeworCQkJYWktPm1pY3N0YXRzLnJ4TUlDUGx1bW1lZCsrOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCWlmIChudG9ocyhtaWMtPnR5cGVsZW4pID09IDB4ODg4RSkKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwlpZiAobWVtY21wIChtaWMtPnUuc25hcCwgbWljc25hcCwgc2l6ZW9mKG1pY3NuYXApKSAhPSAwKSB7CisJICAgIC8vIE1pYyBlbmFibGVkIGJ1dCBwYWNrZXQgaXNuJ3QgTWljJ2QKKwkJYWktPm1pY3N0YXRzLnJ4TUlDUGx1bW1lZCsrOworCSAgICAJcmV0dXJuIEVSUk9SOworCX0KKworCW1pY1NFUSA9IG50b2hsKG1pYy0+c2VxKTsgICAgICAgICAgICAvL3N0b3JlIFNFUSBhcyBDUFUgb3JkZXIKKworCS8vQXQgdGhpcyBwb2ludCB3ZSBhIGhhdmUgYSBtaWMnZCBwYWNrZXQgYW5kIG1pYyBpcyBlbmFibGVkCisJLy9Ob3cgZG8gdGhlIG1pYyBlcnJvciBjaGVja2luZy4KKworCS8vUmVjZWl2ZSBzZXEgbXVzdCBiZSBvZGQKKwlpZiAoIChtaWNTRVEgJiAxKSA9PSAwICkgeworCQlhaS0+bWljc3RhdHMucnhXcm9uZ1NlcXVlbmNlKys7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX01PRFVMRVM7IGkrKykgeworCQlpbnQgbWNhc3QgPSBldGgtPmRhWzBdICYgMTsKKwkJLy9EZXRlcm1pbmUgcHJvcGVyIGNvbnRleHQgCisJCWNvbnRleHQgPSBtY2FzdCA/ICZhaS0+bW9kW2ldLm1DdHggOiAmYWktPm1vZFtpXS51Q3R4OworCQorCQkvL01ha2Ugc3VyZSBjb250ZXh0IGlzIHZhbGlkCisJCWlmICghY29udGV4dC0+dmFsaWQpIHsKKwkJCWlmIChpID09IDApCisJCQkJbWljRXJyb3IgPSBOT01JQ1BMVU1NRUQ7CisJCQljb250aW51ZTsgICAgICAgICAgICAgICAgCisJCX0KKwkgICAgICAgCS8vRGVNaWMgaXQgCisKKwkJaWYgKCFtaWMtPnR5cGVsZW4pCisJCQltaWMtPnR5cGVsZW4gPSBodG9ucyhwYXlMZW4gKyBzaXplb2YoTUlDQnVmZmVyKSAtIDIpOworCQorCQllbW1oMzJfaW5pdCgmY29udGV4dC0+c2VlZCk7CisJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsIGV0aC0+ZGEsIEVUSF9BTEVOKjIpOyAKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgKHU4ICopJm1pYy0+dHlwZWxlbiwgc2l6ZW9mKG1pYy0+dHlwZWxlbikrc2l6ZW9mKG1pYy0+dS5zbmFwKSk7IAorCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCAodTggKikmbWljLT5zZXEsc2l6ZW9mKG1pYy0+c2VxKSk7CQorCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCBldGgtPmRhICsgRVRIX0FMRU4qMixwYXlMZW4pOwkKKwkJLy9DYWxjdWxhdGUgTUlDCisJCWVtbWgzMl9maW5hbCgmY29udGV4dC0+c2VlZCwgZGlnZXN0KTsKKwkKKwkJaWYgKG1lbWNtcChkaWdlc3QsICZtaWMtPm1pYywgNCkpIHsgLy9NYWtlIHN1cmUgdGhlIG1pY3MgbWF0Y2gKKwkJICAvL0ludmFsaWQgTWljCisJCQlpZiAoaSA9PSAwKQorCQkJCW1pY0Vycm9yID0gSU5DT1JSRUNUTUlDOworCQkJY29udGludWU7CisJCX0KKworCQkvL0NoZWNrIFNlcXVlbmNlIG51bWJlciBpZiBtaWNzIHBhc3MKKwkJaWYgKFJ4U2VxVmFsaWQoYWksIGNvbnRleHQsIG1jYXN0LCBtaWNTRVEpID09IFNVQ0NFU1MpIHsKKwkJCWFpLT5taWNzdGF0cy5yeFN1Y2Nlc3MrKzsKKwkJCXJldHVybiBTVUNDRVNTOworCQl9CisJCWlmIChpID09IDApCisJCQltaWNFcnJvciA9IFNFUVVFTkNFOworCX0KKworCS8vIFVwZGF0ZSBzdGF0aXN0aWNzCisJc3dpdGNoIChtaWNFcnJvcikgeworCQljYXNlIE5PTUlDUExVTU1FRDogYWktPm1pY3N0YXRzLnJ4TUlDUGx1bW1lZCsrOyAgIGJyZWFrOworCQljYXNlIFNFUVVFTkNFOiAgICBhaS0+bWljc3RhdHMucnhXcm9uZ1NlcXVlbmNlKys7IGJyZWFrOworCQljYXNlIElOQ09SUkVDVE1JQzogYWktPm1pY3N0YXRzLnJ4SW5jb3JyZWN0TUlDKys7IGJyZWFrOworCQljYXNlIE5PTkU6ICBicmVhazsKKwkJY2FzZSBOT01JQzogYnJlYWs7CisJfQorCXJldHVybiBFUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlc2NyaXB0aW9uOiAgQ2hlY2tzIHRoZSBSeCBTZXEgbnVtYmVyIHRvIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZAorICogICAgICAgICAgICAgICBhbmQgaGFzbid0IGFscmVhZHkgYmVlbiByZWNlaXZlZAorICogICAKKyAqICAgICBJbnB1dHM6IG1pY2NudHggLSBtaWMgY29udGV4dCB0byBjaGVjayBzZXEgYWdhaW5zdAorICogICAgICAgICAgICAgbWljU2VxICAtIHRoZSBNaWMgc2VxIG51bWJlcgorICogICAKKyAqICAgIFJldHVybnM6IFRSVUUgaWYgdmFsaWQgb3RoZXJ3aXNlIEZBTFNFLiAKKyAqCisgKiAgICBBdXRob3I6IHNicmFuZWt5ICgxMC8xNS8wMSkKKyAqICAgIE1lcmNpbGVzcyBoYWNrcyBieSByd2lsY2hlciAoMS8xNC8wMikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBSeFNlcVZhbGlkIChzdHJ1Y3QgYWlyb19pbmZvICphaSxtaWNjbnR4ICpjb250ZXh0LGludCBtY2FzdCx1MzIgbWljU2VxKQoreworCXUzMiBzZXEsaW5kZXg7CisKKwkvL0FsbG93IGZvciB0aGUgYXAgYmVpbmcgcmVib290ZWQgLSBpZiBpdCBpcyB0aGVuIHVzZSB0aGUgbmV4dCAKKwkvL3NlcXVlbmNlIG51bWJlciBvZiB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgLSBtaWdodCBnbyBiYWNrd2FyZHMKKworCWlmIChtY2FzdCkgeworCQlpZiAodGVzdF9iaXQoRkxBR19VUERBVEVfTVVMVEksICZhaS0+ZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQgKEZMQUdfVVBEQVRFX01VTFRJLCAmYWktPmZsYWdzKTsKKwkJCWNvbnRleHQtPndpbmRvdyA9IChtaWNTZXEgPiAzMykgPyBtaWNTZXEgOiAzMzsKKwkJCWNvbnRleHQtPnJ4ICAgICA9IDA7ICAgICAgICAvLyBSZXNldCByeAorCQl9CisJfSBlbHNlIGlmICh0ZXN0X2JpdChGTEFHX1VQREFURV9VTkksICZhaS0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdCAoRkxBR19VUERBVEVfVU5JLCAmYWktPmZsYWdzKTsKKwkJY29udGV4dC0+d2luZG93ID0gKG1pY1NlcSA+IDMzKSA/IG1pY1NlcSA6IDMzOyAvLyBNb3ZlIHdpbmRvdworCQljb250ZXh0LT5yeCAgICAgPSAwOyAgICAgICAgLy8gUmVzZXQgcngKKwl9CisKKwkvL01ha2Ugc2VxdWVuY2UgbnVtYmVyIHJlbGF0aXZlIHRvIFNUQVJUIG9mIHdpbmRvdworCXNlcSA9IG1pY1NlcSAtIChjb250ZXh0LT53aW5kb3cgLSAzMyk7CisKKwkvL1RvbyBvbGQgb2YgYSBTRVEgbnVtYmVyIHRvIGNoZWNrLgorCWlmICgoczMyKXNlcSA8IDApCisJCXJldHVybiBFUlJPUjsKKyAgICAKKwlpZiAoIHNlcSA+IDY0ICkgeworCQkvL1dpbmRvdyBpcyBpbmZpbml0ZSBmb3J3YXJkCisJCU1vdmVXaW5kb3coY29udGV4dCxtaWNTZXEpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvLyBXZSBhcmUgaW4gdGhlIHdpbmRvdy4gTm93IGNoZWNrIHRoZSBjb250ZXh0IHJ4IGJpdCB0byBzZWUgaWYgaXQgd2FzIGFscmVhZHkgc2VudAorCXNlcSA+Pj0gMTsgICAgICAgICAvL2RpdmlkZSBieSAyIGJlY2F1c2Ugd2Ugb25seSBoYXZlIG9kZCBudW1iZXJzCisJaW5kZXggPSAxIDw8IHNlcTsgIC8vR2V0IGFuIGluZGV4IG51bWJlcgorCisJaWYgKCEoY29udGV4dC0+cnggJiBpbmRleCkpIHsKKwkJLy9taWNTRVEgZmFsbHMgaW5zaWRlIHRoZSB3aW5kb3cuCisJCS8vQWRkIHNlcWVuY2UgbnVtYmVyIHRvIHRoZSBsaXN0IG9mIHJlY2VpdmVkIG51bWJlcnMuCisJCWNvbnRleHQtPnJ4IHw9IGluZGV4OworCisJCU1vdmVXaW5kb3coY29udGV4dCxtaWNTZXEpOworCisJCXJldHVybiBTVUNDRVNTOworCX0KKwlyZXR1cm4gRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkIE1vdmVXaW5kb3cobWljY250eCAqY29udGV4dCwgdTMyIG1pY1NlcSkKK3sKKwl1MzIgc2hpZnQ7CisKKwkvL01vdmUgd2luZG93IGlmIHNlcSBncmVhdGVyIHRoYW4gdGhlIG1pZGRsZSBvZiB0aGUgd2luZG93CisJaWYgKG1pY1NlcSA+IGNvbnRleHQtPndpbmRvdykgeworCQlzaGlmdCA9IChtaWNTZXEgLSBjb250ZXh0LT53aW5kb3cpID4+IDE7CisgICAgCisJCSAgICAvL1NoaWZ0IG91dCBvbGQKKwkJaWYgKHNoaWZ0IDwgMzIpCisJCQljb250ZXh0LT5yeCA+Pj0gc2hpZnQ7CisJCWVsc2UKKwkJCWNvbnRleHQtPnJ4ID0gMDsKKworCQljb250ZXh0LT53aW5kb3cgPSBtaWNTZXE7ICAgICAgLy9Nb3ZlIHdpbmRvdworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PSBFTU1IIFJPVVRJTkVTICA9PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBtaWMgYWNjdW11bGF0ZSAqLworI2RlZmluZSBNSUNfQUNDVU0odmFsKQlcCisJY29udGV4dC0+YWNjdW0gKz0gKHU2NCkodmFsKSAqIGNvbnRleHQtPmNvZWZmW2NvZWZmX3Bvc2l0aW9uKytdOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBhZXNfY291bnRlclsxNl07CisKKy8qIGV4cGFuZCB0aGUga2V5IHRvIGZpbGwgdGhlIE1NSCBjb2VmZmljaWVudCBhcnJheSAqLwordm9pZCBlbW1oMzJfc2V0c2VlZChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBrZXksIGludCBrZXlsZW4sIHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisgIC8qIHRha2UgdGhlIGtleWluZyBtYXRlcmlhbCwgZXhwYW5kIGlmIG5lY2Vzc2FyeSwgdHJ1bmNhdGUgYXQgMTYtYnl0ZXMgKi8KKyAgLyogcnVuIHRocm91Z2ggQUVTIGNvdW50ZXIgbW9kZSB0byBnZW5lcmF0ZSBjb250ZXh0LT5jb2VmZltdICovCisgIAorCWludCBpLGo7CisJdTMyIGNvdW50ZXI7CisJdTggKmNpcGhlciwgcGxhaW5bMTZdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKKworCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwgcGtleSwgMTYpOworCWNvdW50ZXIgPSAwOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGNvbnRleHQtPmNvZWZmKS9zaXplb2YoY29udGV4dC0+Y29lZmZbMF0pKTsgKSB7CisJCWFlc19jb3VudGVyWzE1XSA9ICh1OCkoY291bnRlciA+PiAwKTsKKwkJYWVzX2NvdW50ZXJbMTRdID0gKHU4KShjb3VudGVyID4+IDgpOworCQlhZXNfY291bnRlclsxM10gPSAodTgpKGNvdW50ZXIgPj4gMTYpOworCQlhZXNfY291bnRlclsxMl0gPSAodTgpKGNvdW50ZXIgPj4gMjQpOworCQljb3VudGVyKys7CisJCW1lbWNweSAocGxhaW4sIGFlc19jb3VudGVyLCAxNik7CisJCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGxhaW4pOworCQlzZ1swXS5vZmZzZXQgPSAoKGxvbmcpIHBsYWluICYgflBBR0VfTUFTSyk7CisJCXNnWzBdLmxlbmd0aCA9IDE2OworCQljcnlwdG9fY2lwaGVyX2VuY3J5cHQodGZtLCBzZywgc2csIDE2KTsKKwkJY2lwaGVyID0ga21hcChzZ1swXS5wYWdlKSArIHNnWzBdLm9mZnNldDsKKwkJZm9yIChqPTA7IChqPDE2KSAmJiAoaTwgKHNpemVvZihjb250ZXh0LT5jb2VmZikvc2l6ZW9mKGNvbnRleHQtPmNvZWZmWzBdKSkpOyApIHsKKwkJCWNvbnRleHQtPmNvZWZmW2krK10gPSBudG9obCgqKHUzMiAqKSZjaXBoZXJbal0pOworCQkJaiArPSA0OworCQl9CisJfQorfQorCisvKiBwcmVwYXJlIGZvciBjYWxjdWxhdGlvbiBvZiBhIG5ldyBtaWMgKi8KK3ZvaWQgZW1taDMyX2luaXQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQpCit7CisJLyogcHJlcGFyZSBmb3IgbmV3IG1pYyBjYWxjdWxhdGlvbiAqLworCWNvbnRleHQtPmFjY3VtID0gMDsKKwljb250ZXh0LT5wb3NpdGlvbiA9IDA7Cit9CisKKy8qIGFkZCBzb21lIGJ5dGVzIHRvIHRoZSBtaWMgY2FsY3VsYXRpb24gKi8KK3ZvaWQgZW1taDMyX3VwZGF0ZShlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBPY3RldHMsIGludCBsZW4pCit7CisJaW50CWNvZWZmX3Bvc2l0aW9uLCBieXRlX3Bvc2l0aW9uOworICAKKwlpZiAobGVuID09IDApIHJldHVybjsKKyAgCisJY29lZmZfcG9zaXRpb24gPSBjb250ZXh0LT5wb3NpdGlvbiA+PiAyOworICAKKwkvKiBkZWFsIHdpdGggcGFydGlhbCAzMi1iaXQgd29yZCBsZWZ0IG92ZXIgZnJvbSBsYXN0IHVwZGF0ZSAqLworCWJ5dGVfcG9zaXRpb24gPSBjb250ZXh0LT5wb3NpdGlvbiAmIDM7CisJaWYgKGJ5dGVfcG9zaXRpb24pIHsKKwkJLyogaGF2ZSBhIHBhcnRpYWwgd29yZCBpbiBwYXJ0IHRvIGRlYWwgd2l0aCAqLworCQlkbyB7CisJCQlpZiAobGVuID09IDApIHJldHVybjsKKwkJCWNvbnRleHQtPnBhcnQuZDhbYnl0ZV9wb3NpdGlvbisrXSA9ICpwT2N0ZXRzKys7CisJCQljb250ZXh0LT5wb3NpdGlvbisrOworCQkJbGVuLS07CisJCX0gd2hpbGUgKGJ5dGVfcG9zaXRpb24gPCA0KTsKKwkJTUlDX0FDQ1VNKGh0b25sKGNvbnRleHQtPnBhcnQuZDMyKSk7CisJfQorCisJLyogZGVhbCB3aXRoIGZ1bGwgMzItYml0IHdvcmRzICovCisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCU1JQ19BQ0NVTShodG9ubCgqKHUzMiAqKXBPY3RldHMpKTsKKwkJY29udGV4dC0+cG9zaXRpb24gKz0gNDsKKwkJcE9jdGV0cyArPSA0OworCQlsZW4gLT0gNDsKKwl9CisKKwkvKiBkZWFsIHdpdGggcGFydGlhbCAzMi1iaXQgd29yZCB0aGF0IHdpbGwgYmUgbGVmdCBvdmVyIGZyb20gdGhpcyB1cGRhdGUgKi8KKwlieXRlX3Bvc2l0aW9uID0gMDsKKwl3aGlsZSAobGVuID4gMCkgeworCQljb250ZXh0LT5wYXJ0LmQ4W2J5dGVfcG9zaXRpb24rK10gPSAqcE9jdGV0cysrOworCQljb250ZXh0LT5wb3NpdGlvbisrOworCQlsZW4tLTsKKwl9Cit9CisKKy8qIG1hc2sgdXNlZCB0byB6ZXJvIGVtcHR5IGJ5dGVzIGZvciBmaW5hbCBwYXJ0aWFsIHdvcmQgKi8KK3N0YXRpYyB1MzIgbWFzazMyWzRdID0geyAweDAwMDAwMDAwTCwgMHhGRjAwMDAwMEwsIDB4RkZGRjAwMDBMLCAweEZGRkZGRjAwTCB9OworCisvKiBjYWxjdWxhdGUgdGhlIG1pYyAqLwordm9pZCBlbW1oMzJfZmluYWwoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4IGRpZ2VzdFs0XSkKK3sKKwlpbnQJY29lZmZfcG9zaXRpb24sIGJ5dGVfcG9zaXRpb247CisJdTMyCXZhbDsKKyAgCisJdTY0IHN1bSwgdXRtcDsKKwlzNjQgc3RtcDsKKworCWNvZWZmX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gPj4gMjsKKyAgCisJLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgbGVmdCBvdmVyIGZyb20gbGFzdCB1cGRhdGUgKi8KKwlieXRlX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gJiAzOworCWlmIChieXRlX3Bvc2l0aW9uKSB7CisJCS8qIGhhdmUgYSBwYXJ0aWFsIHdvcmQgaW4gcGFydCB0byBkZWFsIHdpdGggKi8KKwkJdmFsID0gaHRvbmwoY29udGV4dC0+cGFydC5kMzIpOworCQlNSUNfQUNDVU0odmFsICYgbWFzazMyW2J5dGVfcG9zaXRpb25dKTsJLyogemVybyBlbXB0eSBieXRlcyAqLworCX0KKworCS8qIHJlZHVjZSB0aGUgYWNjdW11bGF0ZWQgdTY0IHRvIGEgMzItYml0IE1JQyAqLworCXN1bSA9IGNvbnRleHQtPmFjY3VtOworCXN0bXAgPSAoc3VtICAmIDB4ZmZmZmZmZmZMTCkgLSAoKHN1bSA+PiAzMikgICogMTUpOworCXV0bXAgPSAoc3RtcCAmIDB4ZmZmZmZmZmZMTCkgLSAoKHN0bXAgPj4gMzIpICogMTUpOworCXN1bSA9IHV0bXAgJiAweGZmZmZmZmZmTEw7CisJaWYgKHV0bXAgPiAweDEwMDAwMDAwZkxMKQorCQlzdW0gLT0gMTU7CisKKwl2YWwgPSAodTMyKXN1bTsKKwlkaWdlc3RbMF0gPSAodmFsPj4yNCkgJiAweEZGOworCWRpZ2VzdFsxXSA9ICh2YWw+PjE2KSAmIDB4RkY7CisJZGlnZXN0WzJdID0gKHZhbD4+OCkgJiAweEZGOworCWRpZ2VzdFszXSA9IHZhbCAmIDB4RkY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCByZWFkQlNTTGlzdFJpZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGZpcnN0LAorCQkgICAgICBCU1NMaXN0UmlkICpsaXN0KSB7CisJaW50IHJjOworCQkJQ21kIGNtZDsKKwkJCVJlc3AgcnNwOworCisJaWYgKGZpcnN0ID09IDEpIHsKKwkJCWlmIChhaS0+ZmxhZ3MgJiBGTEFHX1JBRElPX01BU0spIHJldHVybiAtRU5FVERPV047CisJCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQkJY21kLmNtZD1DTURfTElTVEJTUzsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCQkJdXAoJmFpLT5zZW0pOworCQkJLyogTGV0IHRoZSBjb21tYW5kIHRha2UgZWZmZWN0ICovCisJCQlhaS0+dGFzayA9IGN1cnJlbnQ7CisJCQlzc2xlZXAoMyk7CisJCQlhaS0+dGFzayA9IE5VTEw7CisJCX0KKwlyYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBmaXJzdCA/IFJJRF9CU1NMSVNURklSU1QgOiBSSURfQlNTTElTVE5FWFQsCisJCQkgICAgbGlzdCwgc2l6ZW9mKCpsaXN0KSwgMSk7CisKKwlsaXN0LT5sZW4gPSBsZTE2X3RvX2NwdShsaXN0LT5sZW4pOworCWxpc3QtPmluZGV4ID0gbGUxNl90b19jcHUobGlzdC0+aW5kZXgpOworCWxpc3QtPnJhZGlvVHlwZSA9IGxlMTZfdG9fY3B1KGxpc3QtPnJhZGlvVHlwZSk7CisJbGlzdC0+Y2FwID0gbGUxNl90b19jcHUobGlzdC0+Y2FwKTsKKwlsaXN0LT5iZWFjb25JbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGxpc3QtPmJlYWNvbkludGVydmFsKTsKKwlsaXN0LT5maC5kd2VsbCA9IGxlMTZfdG9fY3B1KGxpc3QtPmZoLmR3ZWxsKTsKKwlsaXN0LT5kc0NoYW5uZWwgPSBsZTE2X3RvX2NwdShsaXN0LT5kc0NoYW5uZWwpOworCWxpc3QtPmF0aW1XaW5kb3cgPSBsZTE2X3RvX2NwdShsaXN0LT5hdGltV2luZG93KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcmVhZFdlcEtleVJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBXZXBLZXlSaWQgKndrciwgaW50IHRlbXAsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIHRlbXAgPyBSSURfV0VQX1RFTVAgOiBSSURfV0VQX1BFUk0sCisJCQkJd2tyLCBzaXplb2YoKndrciksIGxvY2spOworCisJd2tyLT5sZW4gPSBsZTE2X3RvX2NwdSh3a3ItPmxlbik7CisJd2tyLT5raW5kZXggPSBsZTE2X3RvX2NwdSh3a3ItPmtpbmRleCk7CisJd2tyLT5rbGVuID0gbGUxNl90b19jcHUod2tyLT5rbGVuKTsKKwlyZXR1cm4gcmM7Cit9CisvKiBJbiB0aGUgd3JpdGVYWFhSaWQgcm91dGluZXMgd2UgY29weSB0aGUgcmlkcyBzbyB0aGF0IHdlIGRvbid0IHNjcmV3dXAKKyAqIHRoZSBvcmlnaW5hbHMgd2hlbiB3ZSBlbmRpYW4gdGhlbS4uLiAqLworc3RhdGljIGludCB3cml0ZVdlcEtleVJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBXZXBLZXlSaWQgKnB3a3IsIGludCBwZXJtLCBpbnQgbG9jaykgeworCWludCByYzsKKwlXZXBLZXlSaWQgd2tyID0gKnB3a3I7CisKKwl3a3IubGVuID0gY3B1X3RvX2xlMTYod2tyLmxlbik7CisJd2tyLmtpbmRleCA9IGNwdV90b19sZTE2KHdrci5raW5kZXgpOworCXdrci5rbGVuID0gY3B1X3RvX2xlMTYod2tyLmtsZW4pOworCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCBSSURfV0VQX1RFTVAsICZ3a3IsIHNpemVvZih3a3IpLCBsb2NrKTsKKwlpZiAocmMhPVNVQ0NFU1MpIHByaW50ayhLRVJOX0VSUiAiYWlybzogIFdFUF9URU1QIHNldCAleFxuIiwgcmMpOworCWlmIChwZXJtKSB7CisJCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCBSSURfV0VQX1BFUk0sICZ3a3IsIHNpemVvZih3a3IpLCBsb2NrKTsKKwkJaWYgKHJjIT1TVUNDRVNTKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBXRVBfUEVSTSBzZXQgJXhcbiIsIHJjKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcmVhZFNzaWRSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgU3NpZFJpZCAqc3NpZHIpIHsKKwlpbnQgaTsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX1NTSUQsIHNzaWRyLCBzaXplb2YoKnNzaWRyKSwgMSk7CisKKwlzc2lkci0+bGVuID0gbGUxNl90b19jcHUoc3NpZHItPmxlbik7CisJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXNzaWRyLT5zc2lkc1tpXS5sZW4gPSBsZTE2X3RvX2NwdShzc2lkci0+c3NpZHNbaV0ubGVuKTsKKwl9CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCB3cml0ZVNzaWRSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgU3NpZFJpZCAqcHNzaWRyLCBpbnQgbG9jaykgeworCWludCByYzsKKwlpbnQgaTsKKwlTc2lkUmlkIHNzaWRyID0gKnBzc2lkcjsKKworCXNzaWRyLmxlbiA9IGNwdV90b19sZTE2KHNzaWRyLmxlbik7CisJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXNzaWRyLnNzaWRzW2ldLmxlbiA9IGNwdV90b19sZTE2KHNzaWRyLnNzaWRzW2ldLmxlbik7CisJfQorCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCBSSURfU1NJRCwgJnNzaWRyLCBzaXplb2Yoc3NpZHIpLCBsb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRDb25maWdSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJdTE2ICpzOworCUNvbmZpZ1JpZCBjZmc7CisKKwlpZiAoYWktPmNvbmZpZy5sZW4pCisJCXJldHVybiBTVUNDRVNTOworCisJcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX0FDVFVBTENPTkZJRywgJmNmZywgc2l6ZW9mKGNmZyksIGxvY2spOworCWlmIChyYyAhPSBTVUNDRVNTKQorCQlyZXR1cm4gcmM7CisKKwlmb3IocyA9ICZjZmcubGVuOyBzIDw9ICZjZmcucnRzVGhyZXM7IHMrKykgKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisKKwlmb3IocyA9ICZjZmcuc2hvcnRSZXRyeUxpbWl0OyBzIDw9ICZjZmcucmFkaW9UeXBlOyBzKyspCisJCSpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmY2ZnLnR4UG93ZXI7IHMgPD0gJmNmZy5yYWRpb1NwZWNpZmljOyBzKyspCisJCSpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmY2ZnLmFybFRocmVzaG9sZDsgcyA8PSAmY2ZnLl9yZXNlcnZlZDRbMF07IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlmb3IocyA9ICZjZmcuYXV0b1dha2U7IHMgPD0gJmNmZy5hdXRvV2FrZTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWFpLT5jb25maWcgPSBjZmc7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tUaHJvdHRsZShzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCWludCBpOworLyogT2xkIGhhcmR3YXJlIGhhZCBhIGxpbWl0IG9uIGVuY3J5cHRpb24gc3BlZWQgKi8KKwlpZiAoYWktPmNvbmZpZy5hdXRoVHlwZSAhPSBBVVRIX09QRU4gJiYgbWF4ZW5jcnlwdCkgeworCQlmb3IoaT0wOyBpPDg7IGkrKykgeworCQkJaWYgKGFpLT5jb25maWcucmF0ZXNbaV0gPiBtYXhlbmNyeXB0KSB7CisJCQkJYWktPmNvbmZpZy5yYXRlc1tpXSA9IDA7CisJCQl9CisJCX0KKwl9Cit9CitzdGF0aWMgaW50IHdyaXRlQ29uZmlnUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIGludCBsb2NrKSB7CisJdTE2ICpzOworCUNvbmZpZ1JpZCBjZmdyOworCisJaWYgKCF0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCWNsZWFyX2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCWNsZWFyX2JpdCAoRkxBR19SRVNFVCwgJmFpLT5mbGFncyk7CisJY2hlY2tUaHJvdHRsZShhaSk7CisJY2ZnciA9IGFpLT5jb25maWc7CisKKwlpZiAoKGNmZ3Iub3Btb2RlICYgMHhGRikgPT0gTU9ERV9TVEFfSUJTUykKKwkJc2V0X2JpdChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKworCWZvcihzID0gJmNmZ3IubGVuOyBzIDw9ICZjZmdyLnJ0c1RocmVzOyBzKyspICpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2Znci5zaG9ydFJldHJ5TGltaXQ7IHMgPD0gJmNmZ3IucmFkaW9UeXBlOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2Znci50eFBvd2VyOyBzIDw9ICZjZmdyLnJhZGlvU3BlY2lmaWM7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlmb3IocyA9ICZjZmdyLmFybFRocmVzaG9sZDsgcyA8PSAmY2Znci5fcmVzZXJ2ZWQ0WzBdOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2Znci5hdXRvV2FrZTsgcyA8PSAmY2Znci5hdXRvV2FrZTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCXJldHVybiBQQzQ1MDBfd3JpdGVyaWQoIGFpLCBSSURfQ09ORklHLCAmY2Znciwgc2l6ZW9mKGNmZ3IpLCBsb2NrKTsKK30KK3N0YXRpYyBpbnQgcmVhZFN0YXR1c1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBTdGF0dXNSaWQgKnN0YXRyLCBpbnQgbG9jaykgeworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfU1RBVFVTLCBzdGF0ciwgc2l6ZW9mKCpzdGF0ciksIGxvY2spOworCXUxNiAqczsKKworCXN0YXRyLT5sZW4gPSBsZTE2X3RvX2NwdShzdGF0ci0+bGVuKTsKKwlmb3IocyA9ICZzdGF0ci0+bW9kZTsgcyA8PSAmc3RhdHItPlNTSURsZW47IHMrKykgKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisKKwlmb3IocyA9ICZzdGF0ci0+YmVhY29uUGVyaW9kOyBzIDw9ICZzdGF0ci0+c2hvcnRQcmVhbWJsZTsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKwlzdGF0ci0+bG9hZCA9IGxlMTZfdG9fY3B1KHN0YXRyLT5sb2FkKTsKKwlzdGF0ci0+YXNzb2NTdGF0dXMgPSBsZTE2X3RvX2NwdShzdGF0ci0+YXNzb2NTdGF0dXMpOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgcmVhZEFQTGlzdFJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBBUExpc3RSaWQgKmFwbHIpIHsKKwlpbnQgcmMgPSAgUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9BUExJU1QsIGFwbHIsIHNpemVvZigqYXBsciksIDEpOworCWFwbHItPmxlbiA9IGxlMTZfdG9fY3B1KGFwbHItPmxlbik7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCB3cml0ZUFQTGlzdFJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBBUExpc3RSaWQgKmFwbHIsIGludCBsb2NrKSB7CisJaW50IHJjOworCWFwbHItPmxlbiA9IGNwdV90b19sZTE2KGFwbHItPmxlbik7CisJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIFJJRF9BUExJU1QsIGFwbHIsIHNpemVvZigqYXBsciksIGxvY2spOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgcmVhZENhcGFiaWxpdHlSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgQ2FwYWJpbGl0eVJpZCAqY2FwciwgaW50IGxvY2spIHsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX0NBUEFCSUxJVElFUywgY2Fwciwgc2l6ZW9mKCpjYXByKSwgbG9jayk7CisJdTE2ICpzOworCisJY2Fwci0+bGVuID0gbGUxNl90b19jcHUoY2Fwci0+bGVuKTsKKwljYXByLT5wcm9kTnVtID0gbGUxNl90b19jcHUoY2Fwci0+cHJvZE51bSk7CisJY2Fwci0+cmFkaW9UeXBlID0gbGUxNl90b19jcHUoY2Fwci0+cmFkaW9UeXBlKTsKKwljYXByLT5jb3VudHJ5ID0gbGUxNl90b19jcHUoY2Fwci0+Y291bnRyeSk7CisJZm9yKHMgPSAmY2Fwci0+dHhQb3dlckxldmVsc1swXTsgcyA8PSAmY2Fwci0+cmVxdWlyZWRIYXJkOyBzKyspCisJCSpzID0gbGUxNl90b19jcHUoKnMpOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgcmVhZFN0YXRzUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFN0YXRzUmlkICpzciwgaW50IHJpZCwgaW50IGxvY2spIHsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgcmlkLCBzciwgc2l6ZW9mKCpzciksIGxvY2spOworCXUzMiAqaTsKKworCXNyLT5sZW4gPSBsZTE2X3RvX2NwdShzci0+bGVuKTsKKwlmb3IoaSA9ICZzci0+dmFsc1swXTsgaSA8PSAmc3ItPnZhbHNbOTldOyBpKyspICppID0gbGUzMl90b19jcHUoKmkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhaXJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmluZm8gPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKwlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmluZm8tPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNhcmQgaXMgY29uZmlndXJlZC4KKwkgKiBXaXJlbGVzcyBFeHRlbnNpb25zIG1heSBwb3N0cG9uZSBjb25maWcgY2hhbmdlcyB1bnRpbCB0aGUgY2FyZAorCSAqIGlzIG9wZW4gKHRvIHBpcGVsaW5lIGNoYW5nZXMgYW5kIHNwZWVkLXVwIGNhcmQgc2V0dXApLiBJZgorCSAqIHRob3NlIGNoYW5nZXMgYXJlIG5vdCB5ZXQgY29tbWl0ZWQsIGRvIGl0IG5vdyAtIEplYW4gSUkgKi8KKwlpZiAodGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmaW5mby0+ZmxhZ3MpKSB7CisJCWRpc2FibGVfTUFDKGluZm8sIDEpOworCQl3cml0ZUNvbmZpZ1JpZChpbmZvLCAxKTsKKwl9CisKKwlpZiAoaW5mby0+d2lmaWRldiAhPSBkZXYpIHsKKwkJLyogUG93ZXIgb24gdGhlIE1BQyBjb250cm9sbGVyICh3aGljaCBtYXkgaGF2ZSBiZWVuIGRpc2FibGVkKSAqLworCQljbGVhcl9iaXQoRkxBR19SQURJT19ET1dOLCAmaW5mby0+ZmxhZ3MpOworCQllbmFibGVfaW50ZXJydXB0cyhpbmZvKTsKKwl9CisJZW5hYmxlX01BQyhpbmZvLCAmcnNwLCAxKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCWludCBucGFja3MsIHBlbmRpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogJXM6IHNrYj09TlVMTFxuIixfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMDsKKwl9CisJbnBhY2tzID0gc2tiX3F1ZXVlX2xlbiAoJmFpLT50eHEpOworCisJaWYgKG5wYWNrcyA+PSBNQVhUWFEgLSAxKSB7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCWlmIChucGFja3MgPiBNQVhUWFEpIHsKKwkJCWFpLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc2tiX3F1ZXVlX3RhaWwgKCZhaS0+dHhxLCBza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWktPmF1eF9sb2NrLCBmbGFncyk7CisJc2tiX3F1ZXVlX3RhaWwgKCZhaS0+dHhxLCBza2IpOworCXBlbmRpbmcgPSB0ZXN0X2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFpLT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWktPmF1eF9sb2NrLGZsYWdzKTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCisJaWYgKHBlbmRpbmcgPT0gMCkgeworCQlzZXRfYml0KEZMQUdfUEVORElOR19YTUlULCAmYWktPmZsYWdzKTsKKwkJbXBpX3NlbmRfcGFja2V0IChkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEBtcGlfc2VuZF9wYWNrZXQKKyAqCisgKiBBdHRlbXB0IHRvIHRyYW5zbWl0IGEgcGFja2V0LiBDYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0CisgKiBvciB0cmFuc21pdCAuIHJldHVybiBudW1iZXIgb2YgcGFja2V0cyB3ZSB0cmllZCB0byBzZW5kCisgKi8KKworc3RhdGljIGludCBtcGlfc2VuZF9wYWNrZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJczE2IGxlbiwgKnBheWxvYWRMZW47CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJdTggKnNlbmRidWY7CisKKwkvKiBnZXQgYSBwYWNrZXQgdG8gc2VuZCAqLworCisJaWYgKChza2IgPSBza2JfZGVxdWV1ZSgmYWktPnR4cSkpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkJImFpcm86ICVzOiBEZXF1ZXVlJ2QgemVybyBpbiBzZW5kX3BhY2tldCgpXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2hlY2sgbWluIGxlbmd0aCovCisJbGVuID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJYnVmZmVyID0gc2tiLT5kYXRhOworCisJYWktPnR4Zmlkc1swXS50eF9kZXNjLm9mZnNldCA9IDA7CisJYWktPnR4Zmlkc1swXS50eF9kZXNjLnZhbGlkID0gMTsKKwlhaS0+dHhmaWRzWzBdLnR4X2Rlc2MuZW9jID0gMTsKKwlhaS0+dHhmaWRzWzBdLnR4X2Rlc2MubGVuID1sZW4rc2l6ZW9mKFdpZmlIZHIpOworCisvKgorICogTWFnaWMsIHRoZSBjYXJkcyBmaXJtd2FyZSBuZWVkcyBhIGxlbmd0aCBjb3VudCAoMiBieXRlcykgaW4gdGhlIGhvc3QgYnVmZmVyCisgKiByaWdodCBhZnRlciAgVFhGSURfSERSLlRoZSBUWEZJRF9IRFIgY29udGFpbnMgdGhlIHN0YXR1cyBzaG9ydCBzbyBwYXlsb2FkbGVuCisgKiBpcyBpbW1lZGlhdGx5IGFmdGVyIGl0LiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHxUWEZJREhEUitTVEFUVVN8UEFZTE9BRExFTnw4MDIuM0hEUnxQQUNLRVREQVRBfAorICogICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworCW1lbWNweSgoY2hhciAqKWFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIsCisJCShjaGFyICopJndpZmljdGxoZHI4MDIzLCBzaXplb2Yod2lmaWN0bGhkcjgwMjMpKTsKKworCXBheWxvYWRMZW4gPSAoczE2ICopKGFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIgKworCQlzaXplb2Yod2lmaWN0bGhkcjgwMjMpKTsKKwlzZW5kYnVmID0gYWktPnR4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArCisJCXNpemVvZih3aWZpY3RsaGRyODAyMykgKyAyIDsKKworCS8qCisJICogRmlybXdhcmUgYXV0b21hdGljbHkgcHV0cyA4MDIgaGVhZGVyIG9uIHNvCisJICogd2UgZG9uJ3QgbmVlZCB0byBhY2NvdW50IGZvciBpdCBpbiB0aGUgbGVuZ3RoCisJICovCisjaWZkZWYgTUlDU1VQUE9SVAorCWlmICh0ZXN0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYWktPmZsYWdzKSAmJiBhaS0+bWljc3RhdHMuZW5hYmxlZCAmJgorCQkobnRvaHMoKCh1MTYgKilidWZmZXIpWzZdKSAhPSAweDg4OEUpKSB7CisJCU1JQ0J1ZmZlciBwTWljOworCisJCWlmIChlbmNhcHN1bGF0ZShhaSwgKGV0aGVySGVhZCAqKWJ1ZmZlciwgJnBNaWMsIGxlbiAtIHNpemVvZihldGhlckhlYWQpKSAhPSBTVUNDRVNTKQorCQkJcmV0dXJuIEVSUk9SOworCisJCSpwYXlsb2FkTGVuID0gY3B1X3RvX2xlMTYobGVuLXNpemVvZihldGhlckhlYWQpK3NpemVvZihwTWljKSk7CisJCWFpLT50eGZpZHNbMF0udHhfZGVzYy5sZW4gKz0gc2l6ZW9mKHBNaWMpOworCQkvKiBjb3B5IGRhdGEgaW50byBhaXJvIGRtYSBidWZmZXIgKi8KKwkJbWVtY3B5IChzZW5kYnVmLCBidWZmZXIsIHNpemVvZihldGhlckhlYWQpKTsKKwkJYnVmZmVyICs9IHNpemVvZihldGhlckhlYWQpOworCQlzZW5kYnVmICs9IHNpemVvZihldGhlckhlYWQpOworCQltZW1jcHkgKHNlbmRidWYsICZwTWljLCBzaXplb2YocE1pYykpOworCQlzZW5kYnVmICs9IHNpemVvZihwTWljKTsKKwkJbWVtY3B5IChzZW5kYnVmLCBidWZmZXIsIGxlbiAtIHNpemVvZihldGhlckhlYWQpKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJKnBheWxvYWRMZW4gPSBjcHVfdG9fbGUxNihsZW4gLSBzaXplb2YoZXRoZXJIZWFkKSk7CisKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkJLyogY29weSBkYXRhIGludG8gYWlybyBkbWEgYnVmZmVyICovCisJCW1lbWNweShzZW5kYnVmLCBidWZmZXIsIGxlbik7CisJfQorCisJbWVtY3B5X3RvaW8oYWktPnR4Zmlkc1swXS5jYXJkX3JhbV9vZmYsCisJCSZhaS0+dHhmaWRzWzBdLnR4X2Rlc2MsIHNpemVvZihUeEZpZCkpOworCisJT1VUNDUwMChhaSwgRVZBQ0ssIDgpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3R4X2Vycm9yKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MzIgZmlkKQoreworCXUxNiBzdGF0dXM7CisKKwlpZiAoZmlkIDwgMCkKKwkJc3RhdHVzID0gKChXaWZpQ3RsSGRyICopYWktPnR4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciktPmN0bGhkci5zdGF0dXM7CisJZWxzZSB7CisJCWlmIChiYXBfc2V0dXAoYWksIGFpLT5maWRzW2ZpZF0gJiAweGZmZmYsIDQsIEJBUDApICE9IFNVQ0NFU1MpCisJCQlyZXR1cm47CisJCWJhcF9yZWFkKGFpLCAmc3RhdHVzLCAyLCBCQVAwKTsKKwl9CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiAyKSAvKiBUb28gbWFueSByZXRyaWVzICovCisJCWFpLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgNCkgLyogVHJhbnNtaXQgbGlmZXRpbWUgZXhjZWVkZWQgKi8KKwkJYWktPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDgpIC8qIEFpZCBmYWlsICovCisJCXsgfQorCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgMHgxMCkgLyogTUFDIGRpc2FibGVkICovCisJCWFpLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgMHgyMCkgLyogQXNzb2NpYXRpb24gbG9zdCAqLworCQl7IH0KKwkvKiBXZSBwcm9kdWNlIGEgVFhEUk9QIGV2ZW50IG9ubHkgZm9yIHJldHJ5IG9yIGxpZmV0aW1lCisJICogZXhjZWVkZWQsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHN0YXR1cyB0aGF0IHJlYWxseSBtZWFuCisJICogdGhhdCB0aGlzIHBhcnRpY3VsYXIgbm9kZSB3ZW50IGF3YXkuCisJICogT3RoZXIgZXJyb3JzIG1lYW5zIHRoYXQgKndlKiBzY3Jld2VkIHVwLiAtIEplYW4gSUkgKi8KKwlpZiAoKGxlMTZfdG9fY3B1KHN0YXR1cykgJiAyKSB8fAorCSAgICAgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiA0KSkgeworCQl1bmlvbiBpd3JlcV9kYXRhCXdycXU7CisJCWNoYXIganVua1sweDE4XTsKKworCQkvKiBGYXN0ZXIgdG8gc2tpcCBvdmVyIHVzZWxlc3MgZGF0YSB0aGFuIHRvIGRvCisJCSAqIGFub3RoZXIgYmFwX3NldHVwKCkuIFdlIGFyZSBhdCBvZmZzZXQgMHg2IGFuZAorCQkgKiBuZWVkIHRvIGdvIHRvIDB4MTggYW5kIHJlYWQgNiBieXRlcyAtIEplYW4gSUkgKi8KKwkJYmFwX3JlYWQoYWksICh1MTYgKikganVuaywgMHgxOCwgQkFQMCk7CisKKwkJLyogQ29weSA4MDIuMTEgZGVzdCBhZGRyZXNzLgorCQkgKiBXZSB1c2UgdGhlIDgwMi4xMSBoZWFkZXIgYmVjYXVzZSB0aGUgZnJhbWUgbWF5CisJCSAqIG5vdCBiZSA4MDIuMyBvciBtYXkgYmUgbWFuZ2xlZC4uLgorCQkgKiBJbiBBZC1Ib2MgbW9kZSwgaXQgd2lsbCBiZSB0aGUgbm9kZSBhZGRyZXNzLgorCQkgKiBJbiBtYW5hZ2VkIG1vZGUsIGl0IHdpbGwgYmUgbW9zdCBsaWtlbHkgdGhlIEFQIGFkZHIKKwkJICogVXNlciBzcGFjZSB3aWxsIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgaXQgdG8KKwkJICogd2hhdGV2ZXIgaXQgbmVlZHMgKElQIGFkZHJlc3Mgb3IgZWxzZSkuCisJCSAqIC0gSmVhbiBJSSAqLworCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsIGp1bmsgKyAweDEyLCBFVEhfQUxFTik7CisJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoYWktPmRldiwgSVdFVlRYRFJPUCwgJndycXUsIE5VTEwpOworCX0KK30KKworc3RhdGljIHZvaWQgYWlyb19lbmRfeG1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJdTE2IHN0YXR1czsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWlyb19pbmZvICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT54bWl0LnNrYjsKKwlpbnQgZmlkID0gcHJpdi0+eG1pdC5maWQ7CisJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKKworCWNsZWFyX2JpdChKT0JfWE1JVCwgJnByaXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZwcml2LT5mbGFncyk7CisJc3RhdHVzID0gdHJhbnNtaXRfODAyXzNfcGFja2V0IChwcml2LCBmaWRzW2ZpZF0sIHNrYi0+ZGF0YSk7CisJdXAoJnByaXYtPnNlbSk7CisKKwlpID0gMDsKKwlpZiAoIHN0YXR1cyA9PSBTVUNDRVNTICkgeworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJZm9yICg7IGkgPCBNQVhfRklEUyAvIDIgJiYgKHByaXYtPmZpZHNbaV0gJiAweGZmZmYwMDAwKTsgaSsrKTsKKwl9IGVsc2UgeworCQlwcml2LT5maWRzW2ZpZF0gJj0gMHhmZmZmOworCQlwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCWlmIChpIDwgTUFYX0ZJRFMgLyAyKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGFpcm9fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJczE2IGxlbjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYWlyb19pbmZvICpwcml2ID0gZGV2LT5wcml2OworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwlpZiAoIHNrYiA9PSBOVUxMICkgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiAgc2tiID09IE5VTEwhISFcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmluZCBhIHZhY2FudCBGSUQgKi8KKwlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFMgLyAyICYmIChmaWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyApOworCWZvciggaiA9IGkgKyAxOyBqIDwgTUFYX0ZJRFMgLyAyICYmIChmaWRzW2pdICYgMHhmZmZmMDAwMCk7IGorKyApOworCisJaWYgKCBqID49IE1BWF9GSURTIC8gMiApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCWlmIChpID09IE1BWF9GSURTIC8gMikgeworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIGNoZWNrIG1pbiBsZW5ndGgqLworCWxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworICAgICAgICAvKiBNYXJrIGZpZCBhcyB1c2VkICYgc2F2ZSBsZW5ndGggZm9yIGxhdGVyICovCisJZmlkc1tpXSB8PSAobGVuIDw8IDE2KTsKKwlwcml2LT54bWl0LnNrYiA9IHNrYjsKKwlwcml2LT54bWl0LmZpZCA9IGk7CisJaWYgKGRvd25fdHJ5bG9jaygmcHJpdi0+c2VtKSAhPSAwKSB7CisJCXNldF9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZwcml2LT5mbGFncyk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2V0X2JpdChKT0JfWE1JVCwgJnByaXYtPmZsYWdzKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT50aHJfd2FpdCk7CisJfSBlbHNlCisJCWFpcm9fZW5kX3htaXQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWlyb19lbmRfeG1pdDExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl1MTYgc3RhdHVzOworCWludCBpOworCXN0cnVjdCBhaXJvX2luZm8gKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnhtaXQxMS5za2I7CisJaW50IGZpZCA9IHByaXYtPnhtaXQxMS5maWQ7CisJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKKworCWNsZWFyX2JpdChKT0JfWE1JVDExLCAmcHJpdi0+ZmxhZ3MpOworCWNsZWFyX2JpdChGTEFHX1BFTkRJTkdfWE1JVDExLCAmcHJpdi0+ZmxhZ3MpOworCXN0YXR1cyA9IHRyYW5zbWl0XzgwMl8xMV9wYWNrZXQgKHByaXYsIGZpZHNbZmlkXSwgc2tiLT5kYXRhKTsKKwl1cCgmcHJpdi0+c2VtKTsKKworCWkgPSBNQVhfRklEUyAvIDI7CisJaWYgKCBzdGF0dXMgPT0gU1VDQ0VTUyApIHsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWZvciAoOyBpIDwgTUFYX0ZJRFMgJiYgKHByaXYtPmZpZHNbaV0gJiAweGZmZmYwMDAwKTsgaSsrKTsKKwl9IGVsc2UgeworCQlwcml2LT5maWRzW2ZpZF0gJj0gMHhmZmZmOworCQlwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCWlmIChpIDwgTUFYX0ZJRFMpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19zdGFydF94bWl0MTEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXMxNiBsZW47CisJaW50IGksIGo7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIgKmZpZHMgPSBwcml2LT5maWRzOworCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmcHJpdi0+ZmxhZ3MpKSB7CisJCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgZm9yIE1QSTM1MCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKCBza2IgPT0gTlVMTCApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogIHNrYiA9PSBOVUxMISEhXG4iICk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgYSB2YWNhbnQgRklEICovCisJZm9yKCBpID0gTUFYX0ZJRFMgLyAyOyBpIDwgTUFYX0ZJRFMgJiYgKGZpZHNbaV0gJiAweGZmZmYwMDAwKTsgaSsrICk7CisJZm9yKCBqID0gaSArIDE7IGogPCBNQVhfRklEUyAmJiAoZmlkc1tqXSAmIDB4ZmZmZjAwMDApOyBqKysgKTsKKworCWlmICggaiA+PSBNQVhfRklEUyApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCWlmIChpID09IE1BWF9GSURTKSB7CisJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJLyogY2hlY2sgbWluIGxlbmd0aCovCisJbGVuID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisgICAgICAgIC8qIE1hcmsgZmlkIGFzIHVzZWQgJiBzYXZlIGxlbmd0aCBmb3IgbGF0ZXIgKi8KKwlmaWRzW2ldIHw9IChsZW4gPDwgMTYpOworCXByaXYtPnhtaXQxMS5za2IgPSBza2I7CisJcHJpdi0+eG1pdDExLmZpZCA9IGk7CisJaWYgKGRvd25fdHJ5bG9jaygmcHJpdi0+c2VtKSAhPSAwKSB7CisJCXNldF9iaXQoRkxBR19QRU5ESU5HX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzZXRfYml0KEpPQl9YTUlUMTEsICZwcml2LT5mbGFncyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+dGhyX3dhaXQpOworCX0gZWxzZQorCQlhaXJvX2VuZF94bWl0MTEoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWlyb19yZWFkX3N0YXRzKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJU3RhdHNSaWQgc3RhdHNfcmlkOworCXUzMiAqdmFscyA9IHN0YXRzX3JpZC52YWxzOworCisJY2xlYXJfYml0KEpPQl9TVEFUUywgJmFpLT5mbGFncyk7CisJaWYgKGFpLT5wb3dlcikgeworCQl1cCgmYWktPnNlbSk7CisJCXJldHVybjsKKwl9CisJcmVhZFN0YXRzUmlkKGFpLCAmc3RhdHNfcmlkLCBSSURfU1RBVFMsIDApOworCXVwKCZhaS0+c2VtKTsKKworCWFpLT5zdGF0cy5yeF9wYWNrZXRzID0gdmFsc1s0M10gKyB2YWxzWzQ0XSArIHZhbHNbNDVdOworCWFpLT5zdGF0cy50eF9wYWNrZXRzID0gdmFsc1szOV0gKyB2YWxzWzQwXSArIHZhbHNbNDFdOworCWFpLT5zdGF0cy5yeF9ieXRlcyA9IHZhbHNbOTJdOworCWFpLT5zdGF0cy50eF9ieXRlcyA9IHZhbHNbOTFdOworCWFpLT5zdGF0cy5yeF9lcnJvcnMgPSB2YWxzWzBdICsgdmFsc1syXSArIHZhbHNbM10gKyB2YWxzWzRdOworCWFpLT5zdGF0cy50eF9lcnJvcnMgPSB2YWxzWzQyXSArIGFpLT5zdGF0cy50eF9maWZvX2Vycm9yczsKKwlhaS0+c3RhdHMubXVsdGljYXN0ID0gdmFsc1s0M107CisJYWktPnN0YXRzLmNvbGxpc2lvbnMgPSB2YWxzWzg5XTsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwlhaS0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHZhbHNbM107CisJYWktPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSB2YWxzWzRdOworCWFpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSB2YWxzWzJdOworCWFpLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHZhbHNbMF07Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphaXJvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gIGRldi0+cHJpdjsKKworCWlmICghdGVzdF9iaXQoSk9CX1NUQVRTLCAmbG9jYWwtPmZsYWdzKSkgeworCQkvKiBHZXQgc3RhdHMgb3V0IG9mIHRoZSBjYXJkIGlmIGF2YWlsYWJsZSAqLworCQlpZiAoZG93bl90cnlsb2NrKCZsb2NhbC0+c2VtKSAhPSAwKSB7CisJCQlzZXRfYml0KEpPQl9TVEFUUywgJmxvY2FsLT5mbGFncyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvY2FsLT50aHJfd2FpdCk7CisJCX0gZWxzZQorCQkJYWlyb19yZWFkX3N0YXRzKGxvY2FsKTsKKwl9CisKKwlyZXR1cm4gJmxvY2FsLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgYWlyb19zZXRfcHJvbWlzYyhzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5jbWQ9Q01EX1NFVE1PREU7CisJY2xlYXJfYml0KEpPQl9QUk9NSVNDLCAmYWktPmZsYWdzKTsKKwljbWQucGFybTA9KGFpLT5mbGFncyZJRkZfUFJPTUlTQykgPyBQUk9NSVNDIDogTk9QUk9NSVNDOworCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJdXAoJmFpLT5zZW0pOworfQorCitzdGF0aWMgdm9pZCBhaXJvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAoKGRldi0+ZmxhZ3MgXiBhaS0+ZmxhZ3MpICYgSUZGX1BST01JU0MpIHsKKwkJY2hhbmdlX2JpdChGTEFHX1BST01JU0MsICZhaS0+ZmxhZ3MpOworCQlpZiAoZG93bl90cnlsb2NrKCZhaS0+c2VtKSAhPSAwKSB7CisJCQlzZXRfYml0KEpPQl9QUk9NSVNDLCAmYWktPmZsYWdzKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWktPnRocl93YWl0KTsKKwkJfSBlbHNlCisJCQlhaXJvX3NldF9wcm9taXNjKGFpKTsKKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKXx8ZGV2LT5tY19jb3VudD4wKSB7CisJCS8qIFR1cm4gb24gbXVsdGljYXN0LiAgKFNob3VsZCBiZSBhbHJlYWR5IHNldHVwLi4uKSAqLworCX0KK30KKworc3RhdGljIGludCBhaXJvX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJUmVzcCByc3A7CisKKwlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKKwltZW1jcHkgKGFpLT5jb25maWcubWFjQWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCWRpc2FibGVfTUFDKGFpLCAxKTsKKwl3cml0ZUNvbmZpZ1JpZCAoYWksIDEpOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCW1lbWNweSAoYWktPmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCWlmIChhaS0+d2lmaWRldikKKwkJbWVtY3B5IChhaS0+d2lmaWRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpcm9fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAyNDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYWlyb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoYWktPndpZmlkZXYgIT0gZGV2KSB7CisjaWZkZWYgUE9XRVJfT05fRE9XTgorCQkvKiBTaHV0IHBvd2VyIHRvIHRoZSBjYXJkLiBUaGUgaWRlYSBpcyB0aGF0IHRoZSB1c2VyIGNhbiBzYXZlCisJCSAqIHBvd2VyIHdoZW4gaGUgZG9lc24ndCBuZWVkIHRoZSBjYXJkIHdpdGggImlmY29uZmlnIGRvd24iLgorCQkgKiBUaGF0J3MgdGhlIG1ldGhvZCB0aGF0IGlzIG1vc3QgZnJpZW5kbHkgdG93YXJkcyB0aGUgbmV0d29yaworCQkgKiBzdGFjayAoaS5lLiB0aGUgbmV0d29yayBzdGFjayB3b24ndCB0cnkgdG8gYnJvYWRjYXN0CisJCSAqIGFueXRoaW5nIG9uIHRoZSBpbnRlcmZhY2UgYW5kIHJvdXRlcyBhcmUgZ29uZS4gSmVhbiBJSSAqLworCQlzZXRfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CisJCWRpc2FibGVfTUFDKGFpLCAxKTsKKyNlbmRpZgorCQlkaXNhYmxlX2ludGVycnVwdHMoIGFpICk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWxfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCBzdG9wX2Fpcm9fY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyZWVyZXMgKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJc2V0X2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOworCWRpc2FibGVfTUFDKGFpLCAxKTsKKwlkaXNhYmxlX2ludGVycnVwdHMoYWkpOworCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CisJdGFrZWRvd25fcHJvY19lbnRyeSggZGV2LCBhaSApOworCWlmICh0ZXN0X2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKKwkJaWYgKGFpLT53aWZpZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihhaS0+d2lmaWRldik7CisJCQlmcmVlX25ldGRldihhaS0+d2lmaWRldik7CisJCQlhaS0+d2lmaWRldiA9IE5VTEw7CisJCX0KKwkJY2xlYXJfYml0KEZMQUdfUkVHSVNURVJFRCwgJmFpLT5mbGFncyk7CisJfQorCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5mbGFncyk7CisJa2lsbF9wcm9jKGFpLT50aHJfcGlkLCBTSUdURVJNLCAxKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhaS0+dGhyX2V4aXRlZCk7CisKKwkvKgorCSAqIENsZWFuIG91dCB0eCBxdWV1ZQorCSAqLworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncykgJiYgc2tiX3F1ZXVlX2xlbiAoJmFpLT50eHEpID4gMCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkJZm9yICg7KHNrYiA9IHNrYl9kZXF1ZXVlKCZhaS0+dHhxKSk7KQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCWlmIChhaS0+Zmxhc2gpCisJCWtmcmVlKGFpLT5mbGFzaCk7CisJaWYgKGFpLT5yc3NpKQorCQlrZnJlZShhaS0+cnNzaSk7CisJaWYgKGFpLT5BUExpc3QpCisJCWtmcmVlKGFpLT5BUExpc3QpOworCWlmIChhaS0+U1NJRCkKKwkJa2ZyZWUoYWktPlNTSUQpOworCWlmIChmcmVlcmVzKSB7CisJCS8qIFBDTUNJQSBmcmVlcyB0aGlzIHN0dWZmLCBzbyBvbmx5IGZvciBQQ0kgYW5kIElTQSAqLworCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOworCQlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpKSB7CisJCQlpZiAoYWktPnBjaSkKKwkJCQltcGlfdW5tYXBfY2FyZChhaS0+cGNpKTsKKwkJCWlmIChhaS0+cGNpbWVtKQorCQkJCWlvdW5tYXAoYWktPnBjaW1lbSk7CisJCQlpZiAoYWktPnBjaWF1eCkKKwkJCQlpb3VubWFwKGFpLT5wY2lhdXgpOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhaS0+cGNpLCBQQ0lfU0hBUkVEX0xFTiwKKwkJCQlhaS0+c2hhcmVkLCBhaS0+c2hhcmVkX2RtYSk7CisJCX0KKyAgICAgICAgfQorI2lmZGVmIE1JQ1NVUFBPUlQKKwlpZiAoYWktPnRmbSkKKwkJY3J5cHRvX2ZyZWVfdGZtKGFpLT50Zm0pOworI2VuZGlmCisJZGVsX2Fpcm9fZGV2KCBkZXYgKTsKKwlmcmVlX25ldGRldiggZGV2ICk7Cit9CisKK0VYUE9SVF9TWU1CT0woc3RvcF9haXJvX2NhcmQpOworCitzdGF0aWMgaW50IGFkZF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xsX2hlYWRlcl9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcikKK3sKKwltZW1jcHkoaGFkZHIsIHNrYi0+bWFjLnJhdyArIDEwLCBFVEhfQUxFTik7CisJcmV0dXJuIEVUSF9BTEVOOworfQorCitzdGF0aWMgdm9pZCBtcGlfdW5tYXBfY2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CisJdW5zaWduZWQgbG9uZyBtZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwY2ksIDEpOworCXVuc2lnbmVkIGxvbmcgYXV4X3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJdW5zaWduZWQgbG9uZyBhdXhfbGVuID0gQVVYTUVNU0laRTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuIHNldHVwIC4KKyAqICBSdW4gYXQgaW5zbW9kIHRpbWUgb3IgYWZ0ZXIgcmVzZXQgIHdoZW4gdGhlIGRlY3JpcHRvcnMKKyAqICBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgLiBSZXR1cm5zIDAgaWYgYWxsIGlzIHdlbGwgbnoKKyAqICBvdGhlcndpc2UgLiBEb2VzIG5vdCBhbGxvY2F0ZSBtZW1vcnkgYnV0IHNldHMgdXAgY2FyZAorICogIHVzaW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgaW50IG1waV9pbml0X2Rlc2NyaXB0b3JzIChzdHJ1Y3QgYWlyb19pbmZvICphaSkKK3sKKwlDbWQgY21kOworCVJlc3AgcnNwOworCWludCBpOworCWludCByYyA9IFNVQ0NFU1M7CisKKwkvKiBBbGxvYyAgY2FyZCBSWCBkZXNjcmlwdG9ycyAqLworCW5ldGlmX3N0b3BfcXVldWUoYWktPmRldik7CisKKwltZW1zZXQoJnJzcCwwLHNpemVvZihyc3ApKTsKKwltZW1zZXQoJmNtZCwwLHNpemVvZihjbWQpKTsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVBVVg7CisJY21kLnBhcm0wID0gRklEX1JYOworCWNtZC5wYXJtMSA9IChhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiAtIGFpLT5wY2lhdXgpOworCWNtZC5wYXJtMiA9IE1QSV9NQVhfRklEUzsKKwlyYz1pc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGFsbG9jYXRlIFJYIEZJRFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlmb3IgKGk9MDsgaTxNUElfTUFYX0ZJRFM7IGkrKykgeworCQltZW1jcHlfdG9pbyhhaS0+cnhmaWRzW2ldLmNhcmRfcmFtX29mZiwKKwkJCSZhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MsIHNpemVvZihSeEZpZCkpOworCX0KKworCS8qIEFsbG9jIGNhcmQgVFggZGVzY3JpcHRvcnMgKi8KKworCW1lbXNldCgmcnNwLDAsc2l6ZW9mKHJzcCkpOworCW1lbXNldCgmY21kLDAsc2l6ZW9mKGNtZCkpOworCisJY21kLmNtZCA9IENNRF9BTExPQ0FURUFVWDsKKwljbWQucGFybTAgPSBGSURfVFg7CisJY21kLnBhcm0xID0gKGFpLT50eGZpZHNbMF0uY2FyZF9yYW1fb2ZmIC0gYWktPnBjaWF1eCk7CisJY21kLnBhcm0yID0gTVBJX01BWF9GSURTOworCisJZm9yIChpPTA7IGk8TVBJX01BWF9GSURTOyBpKyspIHsKKwkJYWktPnR4Zmlkc1tpXS50eF9kZXNjLnZhbGlkID0gMTsKKwkJbWVtY3B5X3RvaW8oYWktPnR4Zmlkc1tpXS5jYXJkX3JhbV9vZmYsCisJCQkmYWktPnR4Zmlkc1tpXS50eF9kZXNjLCBzaXplb2YoVHhGaWQpKTsKKwl9CisJYWktPnR4Zmlkc1tpLTFdLnR4X2Rlc2MuZW9jID0gMTsgLyogTGFzdCBkZXNjcmlwdG9yIGhhcyBFT0Mgc2V0ICovCisKKwlyYz1pc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGFsbG9jYXRlIFRYIEZJRFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBBbGxvYyBjYXJkIFJpZCBkZXNjcmlwdG9yICovCisJbWVtc2V0KCZyc3AsMCxzaXplb2YocnNwKSk7CisJbWVtc2V0KCZjbWQsMCxzaXplb2YoY21kKSk7CisKKwljbWQuY21kID0gQ01EX0FMTE9DQVRFQVVYOworCWNtZC5wYXJtMCA9IFJJRF9SVzsKKwljbWQucGFybTEgPSAoYWktPmNvbmZpZ19kZXNjLmNhcmRfcmFtX29mZiAtIGFpLT5wY2lhdXgpOworCWNtZC5wYXJtMiA9IDE7IC8qIE1hZ2ljIG51bWJlci4uLiAqLworCXJjPWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgYWxsb2NhdGUgUklEXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW1lbWNweV90b2lvKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYsCisJCSZhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MsIHNpemVvZihSaWQpKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFdlIGFyZSBzZXR0aW5nIHVwIHRocmVlIHRoaW5ncyBoZXJlOgorICogMSkgTWFwIEFVWCBtZW1vcnkgZm9yIGRlc2NyaXB0b3JzOiBSaWQsIFR4RmlkLCBvciBSeEZpZC4KKyAqIDIpIE1hcCBQQ0kgbWVtb3J5IGZvciBpc3N1ZWluZyBjb21tYW5kcy4KKyAqIDMpIEFsbG9jYXRlIG1lbW9yeSAoc2hhcmVkKSB0byBzZW5kIGFuZCByZWNlaXZlIGV0aGVybmV0IGZyYW1lcy4KKyAqLworc3RhdGljIGludCBtcGlfbWFwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0LCBtZW1fbGVuLCBhdXhfc3RhcnQsIGF1eF9sZW47CisJaW50IHJjID0gLTE7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqYnVzYWRkcm9mZiwqdnBhY2tvZmY7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpwY2lhZGRyb2ZmOworCisJbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CisJbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAxKTsKKwlhdXhfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKKwlhdXhfbGVuID0gQVVYTUVNU0laRTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbiwgbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSBmb3IgJXNcbiIsCisJCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbiwgbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSBmb3IgJXNcbiIsCisJCSAgICAgICAoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuLCBuYW1lKTsKKwkJZ290byBmcmVlX3JlZ2lvbjE7CisJfQorCisJYWktPnBjaW1lbSA9IGlvcmVtYXAobWVtX3N0YXJ0LCBtZW1fbGVuKTsKKwlpZiAoIWFpLT5wY2ltZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXNcbiIsCisJCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwkJZ290byBmcmVlX3JlZ2lvbjI7CisJfQorCWFpLT5wY2lhdXggPSBpb3JlbWFwKGF1eF9zdGFydCwgYXV4X2xlbik7CisJaWYgKCFhaS0+cGNpYXV4KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJCWdvdG8gZnJlZV9tZW1tYXA7CisJfQorCisJLyogUmVzZXJ2ZSBQS1RTSVpFIGZvciBlYWNoIGZpZCBhbmQgMksgZm9yIHRoZSBSaWRzICovCisJYWktPnNoYXJlZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sICZhaS0+c2hhcmVkX2RtYSk7CisJaWYgKCFhaS0+c2hhcmVkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgYWxsb2NfY29uc2lzdGVudCAlZFxuIiwKKwkJICAgICAgIFBDSV9TSEFSRURfTEVOKTsKKwkJZ290byBmcmVlX2F1eG1hcDsKKwl9CisKKwkvKgorCSAqIFNldHVwIGRlc2NyaXB0b3IgUlgsIFRYLCBDT05GSUcKKwkgKi8KKwlidXNhZGRyb2ZmID0gKHVuc2lnbmVkIGNoYXIgKilhaS0+c2hhcmVkX2RtYTsKKwlwY2lhZGRyb2ZmID0gYWktPnBjaWF1eCArIEFVWF9PRkZTRVQ7CisJdnBhY2tvZmYgICA9IGFpLT5zaGFyZWQ7CisKKwkvKiBSWCBkZXNjcmlwdG9yIHNldHVwICovCisJZm9yKGkgPSAwOyBpIDwgTVBJX01BWF9GSURTOyBpKyspIHsKKwkJYWktPnJ4Zmlkc1tpXS5wZW5kaW5nID0gMDsKKwkJYWktPnJ4Zmlkc1tpXS5jYXJkX3JhbV9vZmYgPSBwY2lhZGRyb2ZmOworCQlhaS0+cnhmaWRzW2ldLnZpcnR1YWxfaG9zdF9hZGRyID0gdnBhY2tvZmY7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy5ob3N0X2FkZHIgPSAoZG1hX2FkZHJfdCkgYnVzYWRkcm9mZjsKKwkJYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLmxlbiA9IFBLVFNJWkU7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy5yZHkgPSAwOworCisJCXBjaWFkZHJvZmYgKz0gc2l6ZW9mKFJ4RmlkKTsKKwkJYnVzYWRkcm9mZiArPSBQS1RTSVpFOworCQl2cGFja29mZiAgICs9IFBLVFNJWkU7CisJfQorCisJLyogVFggZGVzY3JpcHRvciBzZXR1cCAqLworCWZvcihpID0gMDsgaSA8IE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCWFpLT50eGZpZHNbaV0uY2FyZF9yYW1fb2ZmID0gcGNpYWRkcm9mZjsKKwkJYWktPnR4Zmlkc1tpXS52aXJ0dWFsX2hvc3RfYWRkciA9IHZwYWNrb2ZmOworCQlhaS0+dHhmaWRzW2ldLnR4X2Rlc2MudmFsaWQgPSAxOworCQlhaS0+dHhmaWRzW2ldLnR4X2Rlc2MuaG9zdF9hZGRyID0gKGRtYV9hZGRyX3QpIGJ1c2FkZHJvZmY7CisJCW1lbWNweShhaS0+dHhmaWRzW2ldLnZpcnR1YWxfaG9zdF9hZGRyLAorCQkJJndpZmljdGxoZHI4MDIzLCBzaXplb2Yod2lmaWN0bGhkcjgwMjMpKTsKKworCQlwY2lhZGRyb2ZmICs9IHNpemVvZihUeEZpZCk7CisJCWJ1c2FkZHJvZmYgKz0gUEtUU0laRTsKKwkJdnBhY2tvZmYgICArPSBQS1RTSVpFOworCX0KKwlhaS0+dHhmaWRzW2ktMV0udHhfZGVzYy5lb2MgPSAxOyAvKiBMYXN0IGRlc2NyaXB0b3IgaGFzIEVPQyBzZXQgKi8KKworCS8qIFJpZCBkZXNjcmlwdG9yIHNldHVwICovCisJYWktPmNvbmZpZ19kZXNjLmNhcmRfcmFtX29mZiA9IHBjaWFkZHJvZmY7CisJYWktPmNvbmZpZ19kZXNjLnZpcnR1YWxfaG9zdF9hZGRyID0gdnBhY2tvZmY7CisJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmhvc3RfYWRkciA9IChkbWFfYWRkcl90KSBidXNhZGRyb2ZmOworCWFpLT5yaWRidXMgPSAoZG1hX2FkZHJfdClidXNhZGRyb2ZmOworCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5yaWQgPSAwOworCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5sZW4gPSBSSURTSVpFOworCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy52YWxpZCA9IDE7CisJcGNpYWRkcm9mZiArPSBzaXplb2YoUmlkKTsKKwlidXNhZGRyb2ZmICs9IFJJRFNJWkU7CisJdnBhY2tvZmYgICArPSBSSURTSVpFOworCisJLyogVGVsbCBjYXJkIGFib3V0IGRlc2NyaXB0b3JzICovCisJaWYgKG1waV9pbml0X2Rlc2NyaXB0b3JzIChhaSkgIT0gU1VDQ0VTUykKKwkJZ290byBmcmVlX3NoYXJlZDsKKworCXJldHVybiAwOworIGZyZWVfc2hhcmVkOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOworIGZyZWVfYXV4bWFwOgorCWlvdW5tYXAoYWktPnBjaWF1eCk7CisgZnJlZV9tZW1tYXA6CisJaW91bm1hcChhaS0+cGNpbWVtKTsKKyBmcmVlX3JlZ2lvbjI6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbik7CisgZnJlZV9yZWdpb24xOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4pOworIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHdpZmlfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPmhhcmRfaGVhZGVyICAgICAgICA9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciAgICAgPSBOVUxMOworCWRldi0+aGFyZF9oZWFkZXJfY2FjaGUgID0gTlVMTDsKKwlkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGU9IE5VTEw7CisKKwlkZXYtPmhhcmRfaGVhZGVyX3BhcnNlICA9IHdsbF9oZWFkZXJfcGFyc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYWlyb19zdGFydF94bWl0MTE7CisJZGV2LT5nZXRfc3RhdHMgPSAmYWlyb19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYWlyb19zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5kb19pb2N0bCA9ICZhaXJvX2lvY3RsOworI2lmZGVmIFdJUkVMRVNTX0VYVAorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmYWlyb19oYW5kbGVyX2RlZjsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKwlkZXYtPmNoYW5nZV9tdHUgPSAmYWlyb19jaGFuZ2VfbXR1OworCWRldi0+b3BlbiA9ICZhaXJvX29wZW47CisJZGV2LT5zdG9wID0gJmFpcm9fY2xvc2U7CisKKwlkZXYtPnR5cGUgICAgICAgICAgICAgICA9IEFSUEhSRF9JRUVFODAyMTE7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gICAgPSBFVEhfSExFTjsKKwlkZXYtPm10dSAgICAgICAgICAgICAgICA9IDIzMTI7CisJZGV2LT5hZGRyX2xlbiAgICAgICAgICAgPSBFVEhfQUxFTjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgICAgICA9IDEwMDsgCisKKwltZW1zZXQoZGV2LT5icm9hZGNhc3QsMHhGRiwgRVRIX0FMRU4pOworCisJZGV2LT5mbGFncyAgICAgICAgICAgICAgPSBJRkZfQlJPQURDQVNUfElGRl9NVUxUSUNBU1Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF93aWZpZGV2KHN0cnVjdCBhaXJvX2luZm8gKmFpLAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX25ldGRldigwLCAid2lmaSVkIiwgd2lmaV9zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCWRldi0+cHJpdiA9IGV0aGRldi0+cHJpdjsKKwlkZXYtPmlycSA9IGV0aGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyID0gZXRoZGV2LT5iYXNlX2FkZHI7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisJZGV2LT53aXJlbGVzc19kYXRhID0gZXRoZGV2LT53aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBldGhkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyPDApIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkZXY7Cit9CisKK2ludCByZXNldF9jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICwgaW50IGxvY2spIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCWlmIChsb2NrICYmIGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiAtMTsKKwl3YWl0YnVzeSAoYWkpOworCU9VVDQ1MDAoYWksQ09NTUFORCxDTURfU09GVFJFU0VUKTsKKwltc2xlZXAoMjAwKTsKKwl3YWl0YnVzeSAoYWkpOworCW1zbGVlcCgyMDApOworCWlmIChsb2NrKQorCQl1cCgmYWktPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpfaW5pdF9haXJvX2NhcmQoIHVuc2lnbmVkIHNob3J0IGlycSwgaW50IHBvcnQsCisJCQkJICAgIGludCBpc19wY21jaWEsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRtZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhaXJvX2luZm8gKmFpOworCWludCBpLCByYzsKKworCS8qIENyZWF0ZSB0aGUgbmV0d29yayBkZXZpY2Ugb2JqZWN0LiAqLworICAgICAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmFpKSk7CisgICAgICAgIGlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGFsbG9jX2V0aGVyZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBnZXQgbmFtZSFcbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwlhaSA9IGRldi0+cHJpdjsKKwlhaS0+d2lmaWRldiA9IE5VTEw7CisJYWktPmZsYWdzID0gMDsKKwlpZiAocGNpICYmIChwY2ktPmRldmljZSA9PSAweDUwMDAgfHwgcGNpLT5kZXZpY2UgPT0gMHhhNTA0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYWlybzogRm91bmQgYW4gTVBJMzUwIGNhcmRcbiIpOworCQlzZXRfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKTsKKwl9CisgICAgICAgIGFpLT5kZXYgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJmFpLT5hdXhfbG9jayk7CisJc2VtYV9pbml0KCZhaS0+c2VtLCAxKTsKKwlhaS0+Y29uZmlnLmxlbiA9IDA7CisJYWktPnBjaSA9IHBjaTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkICgmYWktPnRocl93YWl0KTsKKwlpbml0X2NvbXBsZXRpb24gKCZhaS0+dGhyX2V4aXRlZCk7CisJYWktPnRocl9waWQgPSBrZXJuZWxfdGhyZWFkKGFpcm9fdGhyZWFkLCBkZXYsIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOworCWlmIChhaS0+dGhyX3BpZCA8IDApCisJCWdvdG8gZXJyX291dF9mcmVlOworI2lmZGVmIE1JQ1NVUFBPUlQKKwlhaS0+dGZtID0gTlVMTDsKKyNlbmRpZgorCXJjID0gYWRkX2Fpcm9fZGV2KCBkZXYgKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF90aHI7CisKKwkvKiBUaGUgQWlyby1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlza2JfcXVldWVfaGVhZF9pbml0ICgmYWktPnR4cSk7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJm1waV9zdGFydF94bWl0OworCX0gZWxzZQorCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhaXJvX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmYWlyb19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYWlyb19zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYWlyb19zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5kb19pb2N0bCA9ICZhaXJvX2lvY3RsOworI2lmZGVmIFdJUkVMRVNTX0VYVAorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmYWlyb19oYW5kbGVyX2RlZjsKKwlhaS0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZhaS0+c3B5X2RhdGE7CisJZGV2LT53aXJlbGVzc19kYXRhID0gJmFpLT53aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCWRldi0+Y2hhbmdlX210dSA9ICZhaXJvX2NoYW5nZV9tdHU7CisJZGV2LT5vcGVuID0gJmFpcm9fb3BlbjsKKwlkZXYtPnN0b3AgPSAmYWlyb19jbG9zZTsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IHBvcnQ7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsIGRtZGV2KTsKKworCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlyZXNldF9jYXJkIChkZXYsIDEpOworCisJcmMgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIGFpcm9faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYgKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiByZWdpc3RlciBpbnRlcnJ1cHQgJWQgZmFpbGVkLCByYyAlZFxuIiwgaXJxLCByYyApOworCQlnb3RvIGVycl9vdXRfdW5saW5rOworCX0KKwlpZiAoIWlzX3BjbWNpYSkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQsIGRldi0+bmFtZSApKSB7CisJCQlyYyA9IC1FQlVTWTsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgcmVxdWVzdCByZWdpb25cbiIpOworCQkJZ290byBlcnJfb3V0X2lycTsKKwkJfQorCX0KKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlpZiAobXBpX21hcF9jYXJkKGFpLCBwY2ksIGRldi0+bmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGQgbm90IG1hcCBtZW1vcnlcbiIpOworCQkJZ290byBlcnJfb3V0X3JlczsKKwkJfQorCX0KKworCWlmIChwcm9iZSkgeworCQlpZiAoIHNldHVwX2NhcmQoIGFpLCBkZXYtPmRldl9hZGRyLCAxICkgIT0gU1VDQ0VTUyApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgImFpcm86IE1BQyBjb3VsZCBub3QgYmUgZW5hYmxlZFxuIiApOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X21hcDsKKwkJfQorCX0gZWxzZSBpZiAoIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCWFpLT5iYXBfcmVhZCA9IGZhc3RfYmFwX3JlYWQ7CisJCXNldF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncyk7CisJfQorCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCByZWdpc3Rlcl9uZXRkZXZcbiIpOworCQlnb3RvIGVycl9vdXRfbWFwOworCX0KKwlhaS0+d2lmaWRldiA9IGluaXRfd2lmaWRldihhaSwgZGV2KTsKKworCXNldF9iaXQoRkxBR19SRUdJU1RFUkVELCZhaS0+ZmxhZ3MpOworCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiBNQUMgZW5hYmxlZCAlcyAleDoleDoleDoleDoleDoleFxuIiwKKwkJZGV2LT5uYW1lLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdICk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgdHJhbnNtaXQgYnVmZmVycyAqLworCWlmIChwcm9iZSAmJiAhdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkKKwkJCWFpLT5maWRzW2ldID0gdHJhbnNtaXRfYWxsb2NhdGUoYWksMjMxMixpPj1NQVhfRklEUy8yKTsKKworCXNldHVwX3Byb2NfZW50cnkoIGRldiwgZGV2LT5wcml2ICk7IC8qIFhYWCBjaGVjayBmb3IgZmFpbHVyZSAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXJldHVybiBkZXY7CisKK2Vycl9vdXRfbWFwOgorCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSAmJiBwY2kpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCBhaS0+c2hhcmVkLCBhaS0+c2hhcmVkX2RtYSk7CisJCWlvdW5tYXAoYWktPnBjaWF1eCk7CisJCWlvdW5tYXAoYWktPnBjaW1lbSk7CisJCW1waV91bm1hcF9jYXJkKGFpLT5wY2kpOworCX0KK2Vycl9vdXRfcmVzOgorCWlmICghaXNfcGNtY2lhKQorCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOworZXJyX291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfb3V0X3VubGluazoKKwlkZWxfYWlyb19kZXYoZGV2KTsKK2Vycl9vdXRfdGhyOgorCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5mbGFncyk7CisJa2lsbF9wcm9jKGFpLT50aHJfcGlkLCBTSUdURVJNLCAxKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhaS0+dGhyX2V4aXRlZCk7CitlcnJfb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfYWlyb19jYXJkKCB1bnNpZ25lZCBzaG9ydCBpcnEsIGludCBwb3J0LCBpbnQgaXNfcGNtY2lhLAorCQkJCSAgc3RydWN0IGRldmljZSAqZG1kZXYpCit7CisJcmV0dXJuIF9pbml0X2Fpcm9fY2FyZCAoIGlycSwgcG9ydCwgaXNfcGNtY2lhLCBOVUxMLCBkbWRldik7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5pdF9haXJvX2NhcmQpOworCitzdGF0aWMgaW50IHdhaXRidXN5IChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCWludCBkZWxheSA9IDA7CisJd2hpbGUgKChJTjQ1MDAgKGFpLCBDT01NQU5EKSAmIENPTU1BTkRfQlVTWSkgJiAoZGVsYXkgPCAxMDAwMCkpIHsKKwkJdWRlbGF5ICgxMCk7CisJCWlmICgoKytkZWxheSAlIDIwKSA9PSAwKQorCQkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NMRUFSQ09NTUFOREJVU1kpOworCX0KKwlyZXR1cm4gZGVsYXkgPCAxMDAwMDsKK30KKworaW50IHJlc2V0X2Fpcm9fY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJaW50IGk7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAocmVzZXRfY2FyZCAoZGV2LCAxKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCBzZXR1cF9jYXJkKGFpLCBkZXYtPmRldl9hZGRyLCAxICkgIT0gU1VDQ0VTUyApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogTUFDIGNvdWxkIG5vdCBiZSBlbmFibGVkXG4iICk7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRrKCBLRVJOX0lORk8gImFpcm86IE1BQyBlbmFibGVkICVzICV4OiV4OiV4OiV4OiV4OiV4XG4iLCBkZXYtPm5hbWUsCisJCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJLyogQWxsb2NhdGUgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgaWYgbmVlZGVkICovCisJaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTOyBpKysgKQorCQkJYWktPmZpZHNbaV0gPSB0cmFuc21pdF9hbGxvY2F0ZSAoYWksMjMxMixpPj1NQVhfRklEUy8yKTsKKworCWVuYWJsZV9pbnRlcnJ1cHRzKCBhaSApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChyZXNldF9haXJvX2NhcmQpOworCitzdGF0aWMgdm9pZCBhaXJvX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsKKworCWNsZWFyX2JpdChKT0JfRVZFTlQsICZhaS0+ZmxhZ3MpOworCVBDNDUwMF9yZWFkcmlkKGFpLCBSSURfU1RBVFVTLCAmc3RhdHVzX3JpZCwgc2l6ZW9mKHN0YXR1c19yaWQpLCAwKTsKKwl1cCgmYWktPnNlbSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJd3JxdS5kYXRhLmZsYWdzID0gMDsKKwltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHN0YXR1c19yaWQuYnNzaWRbMF0sIEVUSF9BTEVOKTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGFpcm9fdGhyZWFkKHZvaWQgKmRhdGEpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgbG9ja2VkOworCQorCWRhZW1vbml6ZSgiJXMiLCBkZXYtPm5hbWUpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCXdoaWxlKDEpIHsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKworCQkvKiBtYWtlIHN3c3VzcCBoYXBweSB3aXRoIG91ciB0aHJlYWQgKi8KKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCisJCWlmICh0ZXN0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKSkKKwkJCWJyZWFrOworCisJCWlmIChhaS0+ZmxhZ3MgJiBKT0JfTUFTSykgeworCQkJbG9ja2VkID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKTsKKwkJfSBlbHNlIHsKKwkJCXdhaXRfcXVldWVfdCB3YWl0OworCisJCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJCQlhZGRfd2FpdF9xdWV1ZSgmYWktPnRocl93YWl0LCAmd2FpdCk7CisJCQlmb3IgKDs7KSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlpZiAoYWktPmZsYWdzICYgSk9CX01BU0spCisJCQkJCWJyZWFrOworCQkJCWlmIChhaS0+ZXhwaXJlcykgeworCQkJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLGFpLT5leHBpcmVzKSl7CisJCQkJCQlzZXRfYml0KEpPQl9BVVRPV0VQLCZhaS0+ZmxhZ3MpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJc2NoZWR1bGVfdGltZW91dChhaS0+ZXhwaXJlcyAtIGppZmZpZXMpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlzY2hlZHVsZSgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZhaS0+dGhyX3dhaXQsICZ3YWl0KTsKKwkJCWxvY2tlZCA9IDE7CisJCX0KKworCQlpZiAobG9ja2VkKQorCQkJY29udGludWU7CisKKwkJaWYgKHRlc3RfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpKSB7CisJCQl1cCgmYWktPnNlbSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhaS0+cG93ZXIgfHwgdGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpIHsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEpPQl9YTUlULCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fZW5kX3htaXQoZGV2KTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX1hNSVQxMSwgJmFpLT5mbGFncykpCisJCQlhaXJvX2VuZF94bWl0MTEoZGV2KTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX1NUQVRTLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fcmVhZF9zdGF0cyhhaSk7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9XU1RBVFMsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzKGFpKTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX1BST01JU0MsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19zZXRfcHJvbWlzYyhhaSk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfTUlDLCAmYWktPmZsYWdzKSkKKwkJCW1pY2luaXQoYWkpOworI2VuZGlmCisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9FVkVOVCwgJmFpLT5mbGFncykpCisJCQlhaXJvX3NlbmRfZXZlbnQoZGV2KTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX0FVVE9XRVAsICZhaS0+ZmxhZ3MpKQorCQkJdGltZXJfZnVuYyhkZXYpOworCX0KKwljb21wbGV0ZV9hbmRfZXhpdCAoJmFpLT50aHJfZXhpdGVkLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFpcm9faW50ZXJydXB0ICggaW50IGlycSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJdTE2IHN0YXR1czsKKwl1MTYgZmlkOworCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OworCXUxNiBzYXZlZEludGVycnVwdHMgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJZm9yICg7OykgeworCQlzdGF0dXMgPSBJTjQ1MDAoIGFwcml2LCBFVlNUQVQgKTsKKwkJaWYgKCAhKHN0YXR1cyAmIFNUQVRVU19JTlRTKSB8fCBzdGF0dXMgPT0gMHhmZmZmICkgYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKCBzdGF0dXMgJiBFVl9BV0FLRSApIHsKKwkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfQVdBS0UgKTsKKwkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfQVdBS0UgKTsKKwkJfQorCisJCWlmICghc2F2ZWRJbnRlcnJ1cHRzKSB7CisJCQlzYXZlZEludGVycnVwdHMgPSBJTjQ1MDAoIGFwcml2LCBFVklOVEVOICk7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZJTlRFTiwgMCApOworCQl9CisKKwkJaWYgKCBzdGF0dXMgJiBFVl9NSUMgKSB7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX01JQyApOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJCWlmICh0ZXN0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCXNldF9iaXQoSk9CX01JQywgJmFwcml2LT5mbGFncyk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcHJpdi0+dGhyX3dhaXQpOworCQkJfQorI2VuZGlmCisJCX0KKwkJaWYgKCBzdGF0dXMgJiBFVl9MSU5LICkgeworCQkJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCQkJLyogVGhlIGxpbmsgc3RhdHVzIGhhcyBjaGFuZ2VkLCBpZiB5b3Ugd2FudCB0byBwdXQgYQorCQkJICAgbW9uaXRvciBob29rIGluLCBkbyBpdCBoZXJlLiAgKFJlbWVtYmVyIHRoYXQKKwkJCSAgIGludGVycnVwdHMgYXJlIHN0aWxsIGRpc2FibGVkISkKKwkJCSovCisJCQl1MTYgbmV3U3RhdHVzID0gSU40NTAwKGFwcml2LCBMSU5LU1RBVCk7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX0xJTkspOworCQkJLyogSGVyZSBpcyB3aGF0IG5ld1N0YXR1cyBtZWFuczogKi8KKyNkZWZpbmUgTk9CRUFDT04gMHg4MDAwIC8qIExvc3Mgb2Ygc3luYyAtIG1pc3NlZCBiZWFjb25zICovCisjZGVmaW5lIE1BWFJFVFJJRVMgMHg4MDAxIC8qIExvc3Mgb2Ygc3luYyAtIG1heCByZXRyaWVzICovCisjZGVmaW5lIE1BWEFSTCAweDgwMDIgLyogTG9zcyBvZiBzeW5jIC0gYXZlcmFnZSByZXRyeSBsZXZlbCBleGNlZWRlZCovCisjZGVmaW5lIEZPUkNFTE9TUyAweDgwMDMgLyogTG9zcyBvZiBzeW5jIC0gaG9zdCByZXF1ZXN0ICovCisjZGVmaW5lIFRTRlNZTkMgMHg4MDA0IC8qIExvc3Mgb2Ygc3luYyAtIFRTRiBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgREVBVVRIIDB4ODEwMCAvKiBEZWF1dGhlbnRpY2F0aW9uIChsb3cgYnl0ZSBpcyByZWFzb24gY29kZSkgKi8KKyNkZWZpbmUgRElTQVNTIDB4ODIwMCAvKiBEaXNhc3NvY2lhdGlvbiAobG93IGJ5dGUgaXMgcmVhc29uIGNvZGUpICovCisjZGVmaW5lIEFTU0ZBSUwgMHg4NDAwIC8qIEFzc29jaWF0aW9uIGZhaWx1cmUgKGxvdyBieXRlIGlzIHJlYXNvbgorCQkJICBjb2RlKSAqLworI2RlZmluZSBBVVRIRkFJTCAweDAzMDAgLyogQXV0aGVudGljYXRpb24gZmFpbHVyZSAobG93IGJ5dGUgaXMgcmVhc29uCisJCQkgICBjb2RlKSAqLworI2RlZmluZSBBU1NPQ0lBVEVEIDB4MDQwMCAvKiBBc3NvY2F0aWVkICovCisjZGVmaW5lIFJDX1JFU0VSVkVEIDAgLyogUmVzZXJ2ZWQgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUgUkNfTk9SRUFTT04gMSAvKiBVbnNwZWNpZmllZCByZWFzb24gKi8KKyNkZWZpbmUgUkNfQVVUSElOViAyIC8qIFByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGludmFsaWQgKi8KKyNkZWZpbmUgUkNfREVBVVRIIDMgLyogRGVhdXRoZW50aWNhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzCisJCSAgICAgICBsZWF2aW5nICovCisjZGVmaW5lIFJDX05PQUNUIDQgLyogRGlzYXNzb2NpYXRlZCBkdWUgdG8gaW5hY3Rpdml0eSAqLworI2RlZmluZSBSQ19NQVhMT0FEIDUgLyogRGlzYXNzb2NpYXRlZCBiZWNhdXNlIEFQIGlzIHVuYWJsZSB0byBoYW5kbGUKKwkJCWFsbCBjdXJyZW50bHkgYXNzb2NpYXRlZCBzdGF0aW9ucyAqLworI2RlZmluZSBSQ19CQURDTEFTUzIgNiAvKiBDbGFzcyAyIGZyYW1lIHJlY2VpdmVkIGZyb20KKwkJCSAgbm9uLUF1dGhlbnRpY2F0ZWQgc3RhdGlvbiAqLworI2RlZmluZSBSQ19CQURDTEFTUzMgNyAvKiBDbGFzcyAzIGZyYW1lIHJlY2VpdmVkIGZyb20KKwkJCSAgbm9uLUFzc29jaWF0ZWQgc3RhdGlvbiAqLworI2RlZmluZSBSQ19TVEFUTEVBVkUgOCAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzCisJCQkgIGxlYXZpbmcgQlNTICovCisjZGVmaW5lIFJDX05PQVVUSCA5IC8qIFN0YXRpb24gcmVxdWVzdGluZyAoUmUpQXNzb2NpYXRpb24gaXMgbm90CisJCSAgICAgICBBdXRoZW50aWNhdGVkIHdpdGggdGhlIHJlc3BvbmRpbmcgc3RhdGlvbiAqLworCQkJaWYgKG5ld1N0YXR1cyAhPSBBU1NPQ0lBVEVEKSB7CisJCQkJaWYgKGF1dG9fd2VwICYmICFhcHJpdi0+ZXhwaXJlcykgeworCQkJCQlhcHJpdi0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcHJpdi0+dGhyX3dhaXQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gYXByaXYtPnRhc2s7CisJCQkJaWYgKGF1dG9fd2VwKQorCQkJCQlhcHJpdi0+ZXhwaXJlcyA9IDA7CisJCQkJaWYgKHRhc2spCisJCQkJCXdha2VfdXBfcHJvY2VzcyAodGFzayk7CisJCQkJc2V0X2JpdChGTEFHX1VQREFURV9VTkksICZhcHJpdi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoRkxBR19VUERBVEVfTVVMVEksICZhcHJpdi0+ZmxhZ3MpOworCQkJfQorCQkJLyogUXVlc3Rpb24gOiBpcyBBU1NPQ0lBVEVEIHRoZSBvbmx5IHN0YXR1cworCQkJICogdGhhdCBpcyB2YWxpZCA/IFdlIHdhbnQgdG8gY2F0Y2ggaGFuZG92ZXIKKwkJCSAqIGFuZCByZWFzc29jaWF0aW9ucyBhcyB2YWxpZCBzdGF0dXMKKwkJCSAqIEplYW4gSUkgKi8KKwkJCWlmKG5ld1N0YXR1cyA9PSBBU1NPQ0lBVEVEKSB7CisJCQkJaWYgKGFwcml2LT5zY2FuX3RpbWVzdGFtcCkgeworCQkJCQkvKiBTZW5kIGFuIGVtcHR5IGV2ZW50IHRvIHVzZXIgc3BhY2UuCisJCQkJCSAqIFdlIGRvbid0IHNlbmQgdGhlIHJlY2VpdmVkIGRhdGEgb24KKwkJCQkJICogdGhlIGV2ZW50IGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZQorCQkJCQkgKiB1cyB0byBkbyBjb21wbGV4IHRyYW5zY29kaW5nLCBhbmQKKwkJCQkJICogd2Ugd2FudCB0byBtaW5pbWlzZSB0aGUgd29yayBkb25lIGluCisJCQkJCSAqIHRoZSBpcnEgaGFuZGxlci4gVXNlIGEgcmVxdWVzdCB0bworCQkJCQkgKiBleHRyYWN0IHRoZSBkYXRhIC0gSmVhbiBJSSAqLworCQkJCQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJd3JxdS5kYXRhLmZsYWdzID0gMDsKKwkJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CisJCQkJCWFwcml2LT5zY2FuX3RpbWVzdGFtcCA9IDA7CisJCQkJfQorCQkJCWlmIChkb3duX3RyeWxvY2soJmFwcml2LT5zZW0pICE9IDApIHsKKwkJCQkJc2V0X2JpdChKT0JfRVZFTlQsICZhcHJpdi0+ZmxhZ3MpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwcml2LT50aHJfd2FpdCk7CisJCQkJfSBlbHNlCisJCQkJCWFpcm9fc2VuZF9ldmVudChkZXYpOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsICdcMCcsIEVUSF9BTEVOKTsKKwkJCQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJCQkJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdBUCwgJndycXUsTlVMTCk7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY2VpdmUgKi8KKwkJaWYgKCBzdGF0dXMgJiBFVl9SWCAgKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkJCXUxNiBmYywgbGVuLCBoZHJsZW4gPSAwOworI3ByYWdtYSBwYWNrKDEpCisJCQlzdHJ1Y3QgeworCQkJCXUxNiBzdGF0dXMsIGxlbjsKKwkJCQl1OCByc3NpWzJdOworCQkJCXU4IHJhdGU7CisJCQkJdTggZnJlcTsKKwkJCQl1MTYgdG1wWzRdOworCQkJfSBoZHI7CisjcHJhZ21hIHBhY2soKQorCQkJdTE2IGdhcDsKKwkJCXUxNiB0bXBidWZbNF07CisJCQl1MTYgKmJ1ZmZlcjsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkKKwkJCQkJbXBpX3JlY2VpdmVfODAyXzExKGFwcml2KTsKKwkJCQllbHNlCisJCQkJCW1waV9yZWNlaXZlXzgwMl8zKGFwcml2KTsKKwkJCQlPVVQ0NTAwKGFwcml2LCBFVkFDSywgRVZfUlgpOworCQkJCWdvdG8gZXhpdHJ4OworCQkJfQorCisJCQlmaWQgPSBJTjQ1MDAoIGFwcml2LCBSWEZJRCApOworCisJCQkvKiBHZXQgdGhlIHBhY2tldCBsZW5ndGggKi8KKwkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQliYXBfc2V0dXAgKGFwcml2LCBmaWQsIDQsIEJBUDApOworCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopJmhkciwgc2l6ZW9mKGhkciksIEJBUDApOworCQkJCS8qIEJhZCBDUkMuIElnbm9yZSBwYWNrZXQgKi8KKwkJCQlpZiAobGUxNl90b19jcHUoaGRyLnN0YXR1cykgJiAyKQorCQkJCQloZHIubGVuID0gMDsKKwkJCQlpZiAoYXByaXYtPndpZmlkZXYgPT0gTlVMTCkKKwkJCQkJaGRyLmxlbiA9IDA7CisJCQl9IGVsc2UgeworCQkJCWJhcF9zZXR1cCAoYXByaXYsIGZpZCwgMHgzNiwgQkFQMCk7CisJCQkJYmFwX3JlYWQgKGFwcml2LCAodTE2KikmaGRyLmxlbiwgMiwgQkFQMCk7CisJCQl9CisJCQlsZW4gPSBsZTE2X3RvX2NwdShoZHIubGVuKTsKKworCQkJaWYgKGxlbiA+IDIzMTIpIHsKKwkJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCYWQgc2l6ZSAlZFxuIiwgbGVuICk7CisJCQkJZ290byBiYWRyeDsKKwkJCX0KKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlnb3RvIGJhZHJ4OworCisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJYmFwX3JlYWQgKGFwcml2LCAodTE2KikmZmMsIHNpemVvZihmYyksIEJBUDApOworCQkJCWZjID0gbGUxNl90b19jcHUoZmMpOworCQkJCXN3aXRjaCAoZmMgJiAweGMpIHsKKwkJCQkJY2FzZSA0OgorCQkJCQkJaWYgKChmYyAmIDB4ZTApID09IDB4YzApCisJCQkJCQkJaGRybGVuID0gMTA7CisJCQkJCQllbHNlCisJCQkJCQkJaGRybGVuID0gMTY7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA4OgorCQkJCQkJaWYgKChmYyYweDMwMCk9PTB4MzAwKXsKKwkJCQkJCQloZHJsZW4gPSAzMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWhkcmxlbiA9IDI0OworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWhkcmxlbiA9IEVUSF9BTEVOICogMjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYiggbGVuICsgaGRybGVuICsgMiArIDIgKTsKKwkJCWlmICggIXNrYiApIHsKKwkJCQlhcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWdvdG8gYmFkcng7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiBUaGlzIHdheSB0aGUgSVAgaGVhZGVyIGlzIGFsaWduZWQgKi8KKwkJCWJ1ZmZlciA9ICh1MTYqKXNrYl9wdXQgKHNrYiwgbGVuICsgaGRybGVuKTsKKwkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQlidWZmZXJbMF0gPSBmYzsKKwkJCQliYXBfcmVhZCAoYXByaXYsIGJ1ZmZlciArIDEsIGhkcmxlbiAtIDIsIEJBUDApOworCQkJCWlmIChoZHJsZW4gPT0gMjQpCisJCQkJCWJhcF9yZWFkIChhcHJpdiwgdG1wYnVmLCA2LCBCQVAwKTsKKworCQkJCWJhcF9yZWFkIChhcHJpdiwgJmdhcCwgc2l6ZW9mKGdhcCksIEJBUDApOworCQkJCWdhcCA9IGxlMTZfdG9fY3B1KGdhcCk7CisJCQkJaWYgKGdhcCkgeworCQkJCQlpZiAoZ2FwIDw9IDgpCisJCQkJCQliYXBfcmVhZCAoYXByaXYsIHRtcGJ1ZiwgZ2FwLCBCQVAwKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBnYXBsZW4gdG9vIGJpZy4gUHJvYmxlbXMgd2lsbCBmb2xsb3cuLi5cbiIpOworCQkJCX0KKwkJCQliYXBfcmVhZCAoYXByaXYsIGJ1ZmZlciArIGhkcmxlbi8yLCBsZW4sIEJBUDApOworCQkJfSBlbHNlIHsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCQkJTUlDQnVmZmVyIG1pY2J1ZjsKKyNlbmRpZgorCQkJCWJhcF9yZWFkIChhcHJpdiwgYnVmZmVyLCBFVEhfQUxFTioyLCBCQVAwKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCQkJaWYgKGFwcml2LT5taWNzdGF0cy5lbmFibGVkKSB7CisJCQkJCWJhcF9yZWFkIChhcHJpdiwodTE2KikmbWljYnVmLHNpemVvZihtaWNidWYpLEJBUDApOworCQkJCQlpZiAobnRvaHMobWljYnVmLnR5cGVsZW4pID4gMHgwNURDKQorCQkJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCAweDQ0LCBCQVAwKTsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAobGVuIDw9IHNpemVvZihtaWNidWYpKQorCQkJCQkJCWdvdG8gYmFkbWljOworCisJCQkJCQlsZW4gLT0gc2l6ZW9mKG1pY2J1Zik7CisJCQkJCQlza2JfdHJpbSAoc2tiLCBsZW4gKyBoZHJsZW4pOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJYmFwX3JlYWQoYXByaXYsYnVmZmVyK0VUSF9BTEVOLGxlbixCQVAwKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCQkJaWYgKGRlY2Fwc3VsYXRlKGFwcml2LCZtaWNidWYsKGV0aGVySGVhZCopYnVmZmVyLGxlbikpIHsKK2JhZG1pYzoKKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisjZWxzZQorCQkJCWlmICgwKSB7CisjZW5kaWYKK2JhZHJ4OgorCQkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX1JYKTsKKwkJCQkJZ290byBleGl0cng7CisJCQkJfQorCQkJfQorI2lmZGVmIFdJUkVMRVNTX1NQWQorCQkJaWYgKGFwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQkJCWNoYXIgKnNhOworCQkJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJCQkvKiBQcmVwYXJlIHNweSBkYXRhIDogYWRkciArIHF1YWwgKi8KKwkJCQlpZiAoIXRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCQlzYSA9IChjaGFyKilidWZmZXIgKyA2OworCQkJCQliYXBfc2V0dXAgKGFwcml2LCBmaWQsIDgsIEJBUDApOworCQkJCQliYXBfcmVhZCAoYXByaXYsICh1MTYqKWhkci5yc3NpLCAyLCBCQVAwKTsKKwkJCQl9IGVsc2UKKwkJCQkJc2EgPSAoY2hhciopYnVmZmVyICsgMTA7CisJCQkJd3N0YXRzLnF1YWwgPSBoZHIucnNzaVswXTsKKwkJCQlpZiAoYXByaXYtPnJzc2kpCisJCQkJCXdzdGF0cy5sZXZlbCA9IDB4MTAwIC0gYXByaXYtPnJzc2lbaGRyLnJzc2lbMV1dLnJzc2lkQm07CisJCQkJZWxzZQorCQkJCQl3c3RhdHMubGV2ZWwgPSAoaGRyLnJzc2lbMV0gKyAzMjEpIC8gMjsKKwkJCQl3c3RhdHMudXBkYXRlZCA9IDM7CQorCQkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQkJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBzYSwgJndzdGF0cyk7CisJCQl9CisjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX1JYKTsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkJCQlza2ItPmRldiA9IGFwcml2LT53aWZpZGV2OworCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CisJCQl9IGVsc2UgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCX0KKwkJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQkJbmV0aWZfcngoIHNrYiApOworCQl9CitleGl0cng6CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIGEgcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkICovCisJCWlmICggIHN0YXR1cyAmICggRVZfVFh8RVZfVFhDUFl8RVZfVFhFWEMgKSApIHsKKwkJCWludCBpOworCQkJaW50IGxlbiA9IDA7CisJCQlpbnQgaW5kZXggPSAtMTsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJCWlmIChzdGF0dXMgJiBFVl9UWEVYQykKKwkJCQkJZ2V0X3R4X2Vycm9yKGFwcml2LCAtMSk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwcml2LT5hdXhfbG9jaywgZmxhZ3MpOworCQkJCWlmIChza2JfcXVldWVfbGVuICgmYXByaXYtPnR4cSkpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXByaXYtPmF1eF9sb2NrLGZsYWdzKTsKKwkJCQkJbXBpX3NlbmRfcGFja2V0IChkZXYpOworCQkJCX0gZWxzZSB7CisJCQkJCWNsZWFyX2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFwcml2LT5mbGFncyk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcml2LT5hdXhfbG9jayxmbGFncyk7CisJCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQkJfQorCQkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywKKwkJCQkJc3RhdHVzICYgKEVWX1RYfEVWX1RYQ1BZfEVWX1RYRVhDKSk7CisJCQkJZ290byBleGl0dHg7CisJCQl9CisKKwkJCWZpZCA9IElONDUwMChhcHJpdiwgVFhDT01QTEZJRCk7CisKKwkJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkgeworCQkJCWlmICggKCBhcHJpdi0+Zmlkc1tpXSAmIDB4ZmZmZiApID09IGZpZCApIHsKKwkJCQkJbGVuID0gYXByaXYtPmZpZHNbaV0gPj4gMTY7CisJCQkJCWluZGV4ID0gaTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCQlpZiAoc3RhdHVzICYgRVZfVFhFWEMpCisJCQkJCWdldF90eF9lcnJvcihhcHJpdiwgaW5kZXgpOworCQkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgc3RhdHVzICYgKEVWX1RYIHwgRVZfVFhFWEMpKTsKKwkJCQkvKiBTZXQgdXAgdG8gYmUgdXNlZCBhZ2FpbiAqLworCQkJCWFwcml2LT5maWRzW2luZGV4XSAmPSAweGZmZmY7CisJCQkJaWYgKGluZGV4IDwgTUFYX0ZJRFMgLyAyKSB7CisJCQkJCWlmICghdGVzdF9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhcHJpdi0+ZmxhZ3MpKQorCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghdGVzdF9iaXQoRkxBR19QRU5ESU5HX1hNSVQxMSwgJmFwcml2LT5mbGFncykpCisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGFwcml2LT53aWZpZGV2KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgc3RhdHVzICYgKEVWX1RYIHwgRVZfVFhDUFkgfCBFVl9UWEVYQykpOworCQkJCXByaW50ayggS0VSTl9FUlIgImFpcm86IFVuYWxsb2NhdGVkIEZJRCB3YXMgdXNlZCB0byB4bWl0XG4iICk7CisJCQl9CisJCX0KK2V4aXR0eDoKKwkJaWYgKCBzdGF0dXMgJiB+U1RBVFVTX0lOVFMgJiB+SUdOT1JFX0lOVFMgKQorCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgImFpcm86IEdvdCB3ZWlyZCBzdGF0dXMgJXhcbiIsCisJCQkJc3RhdHVzICYgflNUQVRVU19JTlRTICYgfklHTk9SRV9JTlRTICk7CisJfQorCisJaWYgKHNhdmVkSW50ZXJydXB0cykKKwkJT1VUNDUwMCggYXByaXYsIEVWSU5URU4sIHNhdmVkSW50ZXJydXB0cyApOworCisJLyogZG9uZS4uICovCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiAgUm91dGluZXMgdG8gdGFsayB0byB0aGUgY2FyZAorICovCisKKy8qCisgKiAgVGhpcyB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgNDUwMCwgaGVuY2UgdGhlIG5hbWUKKyAqICBOT1RFOiAgSWYgdXNlIHdpdGggOGJpdCBtb2RlIGFuZCBTTVAgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiEKKyAqICAgICAgICAgV2h5IHdvdWxkIHNvbWUgb25lIGRvIDggYml0IElPIGluIGFuIFNNUCBtYWNoaW5lPyE/CisgKi8KK3N0YXRpYyB2b2lkIE9VVDQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmVnLCB1MTYgdmFsICkgeworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJcmVnIDw8PSAxOworCWlmICggIWRvOGJpdElPICkKKwkJb3V0dyggdmFsLCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKTsKKwllbHNlIHsKKwkJb3V0YiggdmFsICYgMHhmZiwgYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJCW91dGIoIHZhbCA+PiA4LCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKyAxICk7CisJfQorfQorCitzdGF0aWMgdTE2IElONDUwMCggc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByZWcgKSB7CisJdW5zaWduZWQgc2hvcnQgcmM7CisKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCXJlZyA8PD0gMTsKKwlpZiAoICFkbzhiaXRJTyApCisJCXJjID0gaW53KCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKTsKKwllbHNlIHsKKwkJcmMgPSBpbmIoIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyApOworCQlyYyArPSAoKGludClpbmIoIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyArIDEgKSkgPDwgODsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBSZXNwICpyc3AsIGludCBsb2NrICkgeworCWludCByYzsKKyAgICAgICAgQ21kIGNtZDsKKworCS8qIEZMQUdfUkFESU9fT0ZGIDogUmFkaW8gZGlzYWJsZWQgdmlhIC9wcm9jIG9yIFdpcmVsZXNzIEV4dGVuc2lvbnMKKwkgKiBGTEFHX1JBRElPX0RPV04gOiBSYWRpbyBkaXNhYmxlZCB2aWEgImlmY29uZmlnIGV0aFggZG93biIKKwkgKiBOb3RlIDogd2UgY291bGQgdHJ5IHRvIHVzZSAhbmV0aWZfcnVubmluZyhkZXYpIGluIGVuYWJsZV9NQUMoKQorCSAqIGluc3RlYWQgb2YgdGhpcyBmbGFnLCBidXQgSSBkb24ndCB0cnVzdCBpdCAqd2l0aGluKiB0aGUKKwkgKiBvcGVuL2Nsb3NlIGZ1bmN0aW9ucywgYW5kIHRlc3RpbmcgYm90aCBmbGFncyB0b2dldGhlciBpcworCSAqICJjaGVhcGVyIiAtIEplYW4gSUkgKi8KKwlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gU1VDQ0VTUzsKKworCWlmIChsb2NrICYmIGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoIXRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykpIHsKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmNtZCA9IE1BQ19FTkFCTEU7CisJCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCByc3ApOworCQlpZiAocmMgPT0gU1VDQ0VTUykKKwkJCXNldF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKTsKKwl9IGVsc2UKKwkJcmMgPSBTVUNDRVNTOworCisJaWYgKGxvY2spCisJICAgIHVwKCZhaS0+c2VtKTsKKworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGVuYWJsZSBNQUMsIGVycj0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXyxyYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrICkgeworICAgICAgICBDbWQgY21kOworCVJlc3AgcnNwOworCisJaWYgKGxvY2sgJiYgZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykpIHsKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmNtZCA9IE1BQ19ESVNBQkxFOyAvLyBkaXNhYmxlIGluIGNhc2UgYWxyZWFkeSBlbmFibGVkCisJCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJCWNsZWFyX2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpOworCX0KKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfaW50ZXJydXB0cyggc3RydWN0IGFpcm9faW5mbyAqYWkgKSB7CisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCisJT1VUNDUwMCggYWksIEVWSU5URU4sIFNUQVRVU19JTlRTICk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50ZXJydXB0cyggc3RydWN0IGFpcm9faW5mbyAqYWkgKSB7CisJT1VUNDUwMCggYWksIEVWSU5URU4sIDAgKTsKK30KKworc3RhdGljIHZvaWQgbXBpX3JlY2VpdmVfODAyXzMoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJUnhGaWQgcnhkOworCWludCBsZW4gPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJY2hhciAqYnVmZmVyOworI2lmZGVmIE1JQ1NVUFBPUlQKKwlpbnQgb2ZmID0gMDsKKwlNSUNCdWZmZXIgbWljYnVmOworI2VuZGlmCisKKwltZW1jcHlfZnJvbWlvKCZyeGQsIGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmLCBzaXplb2YocnhkKSk7CisJLyogTWFrZSBzdXJlIHdlIGdvdCBzb21ldGhpbmcgKi8KKwlpZiAocnhkLnJkeSAmJiByeGQudmFsaWQgPT0gMCkgeworCQlsZW4gPSByeGQubGVuICsgMTI7CisJCWlmIChsZW4gPCAxMiB8fCBsZW4gPiAyMDQ4KQorCQkJZ290byBiYWRyeDsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisJCWlmICghc2tiKSB7CisJCQlhaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBiYWRyeDsKKwkJfQorCQlidWZmZXIgPSBza2JfcHV0KHNrYixsZW4pOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJbWVtY3B5KGJ1ZmZlciwgYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciwgRVRIX0FMRU4gKiAyKTsKKwkJaWYgKGFpLT5taWNzdGF0cy5lbmFibGVkKSB7CisJCQltZW1jcHkoJm1pY2J1ZiwKKwkJCQlhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyICsgRVRIX0FMRU4gKiAyLAorCQkJCXNpemVvZihtaWNidWYpKTsKKwkJCWlmIChudG9ocyhtaWNidWYudHlwZWxlbikgPD0gMHgwNURDKSB7CisJCQkJaWYgKGxlbiA8PSBzaXplb2YobWljYnVmKSArIEVUSF9BTEVOICogMikKKwkJCQkJZ290byBiYWRtaWM7CisKKwkJCQlvZmYgPSBzaXplb2YobWljYnVmKTsKKwkJCQlza2JfdHJpbSAoc2tiLCBsZW4gLSBvZmYpOworCQkJfQorCQl9CisJCW1lbWNweShidWZmZXIgKyBFVEhfQUxFTiAqIDIsCisJCQlhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyICsgRVRIX0FMRU4gKiAyICsgb2ZmLAorCQkJbGVuIC0gRVRIX0FMRU4gKiAyIC0gb2ZmKTsKKwkJaWYgKGRlY2Fwc3VsYXRlIChhaSwgJm1pY2J1ZiwgKGV0aGVySGVhZCopYnVmZmVyLCBsZW4gLSBvZmYgLSBFVEhfQUxFTiAqIDIpKSB7CitiYWRtaWM6CisJCQlkZXZfa2ZyZWVfc2tiX2lycSAoc2tiKTsKKwkJCWdvdG8gYmFkcng7CisJCX0KKyNlbHNlCisJCW1lbWNweShidWZmZXIsIGFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIsIGxlbik7CisjZW5kaWYKKyNpZmRlZiBXSVJFTEVTU19TUFkKKwkJaWYgKGFpLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQkJY2hhciAqc2E7CisJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQkvKiBQcmVwYXJlIHNweSBkYXRhIDogYWRkciArIHF1YWwgKi8KKwkJCXNhID0gYnVmZmVyICsgRVRIX0FMRU47CisJCQl3c3RhdHMucXVhbCA9IDA7IC8qIFhYWCBXaGVyZSBkbyBJIGdldCB0aGF0IGluZm8gZnJvbSA/Pz8gKi8KKwkJCXdzdGF0cy5sZXZlbCA9IDA7CisJCQl3c3RhdHMudXBkYXRlZCA9IDA7CisJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJCXdpcmVsZXNzX3NweV91cGRhdGUoYWktPmRldiwgc2EsICZ3c3RhdHMpOworCQl9CisjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCisKKwkJc2tiLT5kZXYgPSBhaS0+ZGV2OworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFpLT5kZXYpOworCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJfQorYmFkcng6CisJaWYgKHJ4ZC52YWxpZCA9PSAwKSB7CisJCXJ4ZC52YWxpZCA9IDE7CisJCXJ4ZC5yZHkgPSAwOworCQlyeGQubGVuID0gUEtUU0laRTsKKwkJbWVtY3B5X3RvaW8oYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsICZyeGQsIHNpemVvZihyeGQpKTsKKwl9Cit9CisKK3ZvaWQgbXBpX3JlY2VpdmVfODAyXzExIChzdHJ1Y3QgYWlyb19pbmZvICphaSkKK3sKKwlSeEZpZCByeGQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IGZjLCBsZW4sIGhkcmxlbiA9IDA7CisjcHJhZ21hIHBhY2soMSkKKwlzdHJ1Y3QgeworCQl1MTYgc3RhdHVzLCBsZW47CisJCXU4IHJzc2lbMl07CisJCXU4IHJhdGU7CisJCXU4IGZyZXE7CisJCXUxNiB0bXBbNF07CisJfSBoZHI7CisjcHJhZ21hIHBhY2soKQorCXUxNiBnYXA7CisJdTE2ICpidWZmZXI7CisJY2hhciAqcHRyID0gYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkcis0OworCisJbWVtY3B5X2Zyb21pbygmcnhkLCBhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiwgc2l6ZW9mKHJ4ZCkpOworCW1lbWNweSAoKGNoYXIgKikmaGRyLCBwdHIsIHNpemVvZihoZHIpKTsKKwlwdHIgKz0gc2l6ZW9mKGhkcik7CisJLyogQmFkIENSQy4gSWdub3JlIHBhY2tldCAqLworCWlmIChsZTE2X3RvX2NwdShoZHIuc3RhdHVzKSAmIDIpCisJCWhkci5sZW4gPSAwOworCWlmIChhaS0+d2lmaWRldiA9PSBOVUxMKQorCQloZHIubGVuID0gMDsKKwlsZW4gPSBsZTE2X3RvX2NwdShoZHIubGVuKTsKKwlpZiAobGVuID4gMjMxMikgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCYWQgc2l6ZSAlZFxuIiwgbGVuICk7CisJCWdvdG8gYmFkcng7CisJfQorCWlmIChsZW4gPT0gMCkKKwkJZ290byBiYWRyeDsKKworCW1lbWNweSAoKGNoYXIgKikmZmMsIHB0ciwgc2l6ZW9mKGZjKSk7CisJZmMgPSBsZTE2X3RvX2NwdShmYyk7CisJc3dpdGNoIChmYyAmIDB4YykgeworCQljYXNlIDQ6CisJCQlpZiAoKGZjICYgMHhlMCkgPT0gMHhjMCkKKwkJCQloZHJsZW4gPSAxMDsKKwkJCWVsc2UKKwkJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlpZiAoKGZjJjB4MzAwKT09MHgzMDApeworCQkJCWhkcmxlbiA9IDMwOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMjQ7CisJfQorCisJc2tiID0gZGV2X2FsbG9jX3NrYiggbGVuICsgaGRybGVuICsgMiApOworCWlmICggIXNrYiApIHsKKwkJYWktPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZ290byBiYWRyeDsKKwl9CisJYnVmZmVyID0gKHUxNiopc2tiX3B1dCAoc2tiLCBsZW4gKyBoZHJsZW4pOworCW1lbWNweSAoKGNoYXIgKilidWZmZXIsIHB0ciwgaGRybGVuKTsKKwlwdHIgKz0gaGRybGVuOworCWlmIChoZHJsZW4gPT0gMjQpCisJCXB0ciArPSA2OworCW1lbWNweSAoKGNoYXIgKikmZ2FwLCBwdHIsIHNpemVvZihnYXApKTsKKwlwdHIgKz0gc2l6ZW9mKGdhcCk7CisJZ2FwID0gbGUxNl90b19jcHUoZ2FwKTsKKwlpZiAoZ2FwKSB7CisJCWlmIChnYXAgPD0gOCkKKwkJCXB0ciArPSBnYXA7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICJhaXJvOiBnYXBsZW4gdG9vIGJpZy4gUHJvYmxlbXMgd2lsbCBmb2xsb3cuLi5cbiIpOworCX0KKwltZW1jcHkgKChjaGFyICopYnVmZmVyICsgaGRybGVuLCBwdHIsIGxlbik7CisJcHRyICs9IGxlbjsKKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJICAvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCWlmIChhaS0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJY2hhciAqc2E7CisJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJLyogUHJlcGFyZSBzcHkgZGF0YSA6IGFkZHIgKyBxdWFsICovCisJCXNhID0gKGNoYXIqKWJ1ZmZlciArIDEwOworCQl3c3RhdHMucXVhbCA9IGhkci5yc3NpWzBdOworCQlpZiAoYWktPnJzc2kpCisJCQl3c3RhdHMubGV2ZWwgPSAweDEwMCAtIGFpLT5yc3NpW2hkci5yc3NpWzFdXS5yc3NpZEJtOworCQllbHNlCisJCQl3c3RhdHMubGV2ZWwgPSAoaGRyLnJzc2lbMV0gKyAzMjEpIC8gMjsKKwkJd3N0YXRzLnVwZGF0ZWQgPSAzOworCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShhaS0+ZGV2LCBzYSwgJndzdGF0cyk7CisJfQorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwlza2ItPmRldiA9IGFpLT53aWZpZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwluZXRpZl9yeCggc2tiICk7CitiYWRyeDoKKwlpZiAocnhkLnZhbGlkID09IDApIHsKKwkJcnhkLnZhbGlkID0gMTsKKwkJcnhkLnJkeSA9IDA7CisJCXJ4ZC5sZW4gPSBQS1RTSVpFOworCQltZW1jcHlfdG9pbyhhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiwgJnJ4ZCwgc2l6ZW9mKHJ4ZCkpOworCX0KK30KKworc3RhdGljIHUxNiBzZXR1cF9jYXJkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1OCAqbWFjLCBpbnQgbG9jaykKK3sKKwlDbWQgY21kOworCVJlc3AgcnNwOworCWludCBzdGF0dXM7CisJaW50IGk7CisJU3NpZFJpZCBteVNzaWQ7CisJdTE2IGxhc3RpbmRleDsKKwlXZXBLZXlSaWQgd2tyOworCWludCByYzsKKworCW1lbXNldCggJm15U3NpZCwgMCwgc2l6ZW9mKCBteVNzaWQgKSApOworCWlmIChhaS0+Zmxhc2gpIHsKKwkJa2ZyZWUgKGFpLT5mbGFzaCk7CisJCWFpLT5mbGFzaCA9IE5VTEw7CisJfQorCisJLyogVGhlIE5PUCBpcyB0aGUgZmlyc3Qgc3RlcCBpbiBnZXR0aW5nIHRoZSBjYXJkIGdvaW5nICovCisJY21kLmNtZCA9IE5PUDsKKwljbWQucGFybTAgPSBjbWQucGFybTEgPSBjbWQucGFybTIgPSAwOworCWlmIChsb2NrICYmIGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiBFUlJPUjsKKwlpZiAoIGlzc3VlY29tbWFuZCggYWksICZjbWQsICZyc3AgKSAhPSBTVUNDRVNTICkgeworCQlpZiAobG9jaykKKwkJCXVwKCZhaS0+c2VtKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKwlkaXNhYmxlX01BQyggYWksIDApOworCisJLy8gTGV0J3MgZmlndXJlIG91dCBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgQVVYIHBvcnQKKwlpZiAoIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCWNtZC5jbWQgPSBDTURfRU5BQkxFQVVYOworCQlpZiAoaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKSAhPSBTVUNDRVNTKSB7CisJCQlpZiAobG9jaykKKwkJCQl1cCgmYWktPnNlbSk7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IEVycm9yIGNoZWNraW5nIGZvciBBVVggcG9ydFxuIik7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJaWYgKCFhdXhfYmFwIHx8IHJzcC5zdGF0dXMgJiAweGZmMDApIHsKKwkJCWFpLT5iYXBfcmVhZCA9IGZhc3RfYmFwX3JlYWQ7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYWlybzogRG9pbmcgZmFzdCBiYXBfcmVhZHNcbiIpOworCQl9IGVsc2UgeworCQkJYWktPmJhcF9yZWFkID0gYXV4X2JhcF9yZWFkOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImFpcm86IERvaW5nIEFVWCBiYXBfcmVhZHNcbiIpOworCQl9CisJfQorCWlmIChsb2NrKQorCQl1cCgmYWktPnNlbSk7CisJaWYgKGFpLT5jb25maWcubGVuID09IDApIHsKKwkJdGRzUnNzaVJpZCByc3NpX3JpZDsKKwkJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOworCisJCWlmIChhaS0+QVBMaXN0KSB7CisJCQlrZnJlZShhaS0+QVBMaXN0KTsKKwkJCWFpLT5BUExpc3QgPSBOVUxMOworCQl9CisJCWlmIChhaS0+U1NJRCkgeworCQkJa2ZyZWUoYWktPlNTSUQpOworCQkJYWktPlNTSUQgPSBOVUxMOworCQl9CisJCS8vIGdlbmVyYWwgY29uZmlndXJhdGlvbiAocmVhZC9tb2RpZnkvd3JpdGUpCisJCXN0YXR1cyA9IHJlYWRDb25maWdSaWQoYWksIGxvY2spOworCQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOworCisJCXN0YXR1cyA9IHJlYWRDYXBhYmlsaXR5UmlkKGFpLCAmY2FwX3JpZCwgbG9jayk7CisJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisKKwkJc3RhdHVzID0gUEM0NTAwX3JlYWRyaWQoYWksUklEX1JTU0ksJnJzc2lfcmlkLHNpemVvZihyc3NpX3JpZCksbG9jayk7CisJCWlmICggc3RhdHVzID09IFNVQ0NFU1MgKSB7CisJCQlpZiAoYWktPnJzc2kgfHwgKGFpLT5yc3NpID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwpKSAhPSBOVUxMKQorCQkJCW1lbWNweShhaS0+cnNzaSwgKHU4KikmcnNzaV9yaWQgKyAyLCA1MTIpOworCQl9CisJCWVsc2UgeworCQkJaWYgKGFpLT5yc3NpKSB7CisJCQkJa2ZyZWUoYWktPnJzc2kpOworCQkJCWFpLT5yc3NpID0gTlVMTDsKKwkJCX0KKwkJCWlmIChjYXBfcmlkLnNvZnRDYXAgJiA4KQorCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX05PUk1BTElaRURfUlNTSTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaXJvOiB1bmtub3duIHJlY2VpdmVkIHNpZ25hbCBsZXZlbCBzY2FsZVxuIik7CisJCX0KKwkJYWktPmNvbmZpZy5vcG1vZGUgPSBhZGhvYyA/IE1PREVfU1RBX0lCU1MgOiBNT0RFX1NUQV9FU1M7CisJCWFpLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX09QRU47CisJCWFpLT5jb25maWcubW9kdWxhdGlvbiA9IE1PRF9DQ0s7CisKKyNpZmRlZiBNSUNTVVBQT1JUCisJCWlmICgoY2FwX3JpZC5sZW4+PXNpemVvZihjYXBfcmlkKSkgJiYgKGNhcF9yaWQuZXh0U29mdENhcCYxKSAmJgorCQkgICAgKG1pY3NldHVwKGFpKSA9PSBTVUNDRVNTKSkgeworCQkJYWktPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9NSUM7CisJCQlzZXRfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpOworCQl9CisjZW5kaWYKKworCQkvKiBTYXZlIG9mZiB0aGUgTUFDICovCisJCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQkJbWFjW2ldID0gYWktPmNvbmZpZy5tYWNBZGRyW2ldOworCQl9CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgaW5zbW9kIGNvbmZpZ3VyZWQKKwkJICAgcmF0ZXMgdG8gYWRkICovCisJCWlmICggcmF0ZXNbMF0gKSB7CisJCQlpbnQgaSA9IDA7CisJCQltZW1zZXQoYWktPmNvbmZpZy5yYXRlcywwLHNpemVvZihhaS0+Y29uZmlnLnJhdGVzKSk7CisJCQlmb3IoIGkgPSAwOyBpIDwgOCAmJiByYXRlc1tpXTsgaSsrICkgeworCQkJCWFpLT5jb25maWcucmF0ZXNbaV0gPSByYXRlc1tpXTsKKwkJCX0KKwkJfQorCQlpZiAoIGJhc2ljX3JhdGUgPiAwICkgeworCQkJaW50IGk7CisJCQlmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkgeworCQkJCWlmICggYWktPmNvbmZpZy5yYXRlc1tpXSA9PSBiYXNpY19yYXRlIHx8CisJCQkJICAgICAhYWktPmNvbmZpZy5yYXRlcyApIHsKKwkJCQkJYWktPmNvbmZpZy5yYXRlc1tpXSA9IGJhc2ljX3JhdGUgfCAweDgwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCX0KKworCS8qIFNldHVwIHRoZSBTU0lEcyBpZiBwcmVzZW50ICovCisJaWYgKCBzc2lkc1swXSApIHsKKwkJaW50IGk7CisJCWZvciggaSA9IDA7IGkgPCAzICYmIHNzaWRzW2ldOyBpKysgKSB7CisJCQlteVNzaWQuc3NpZHNbaV0ubGVuID0gc3RybGVuKHNzaWRzW2ldKTsKKwkJCWlmICggbXlTc2lkLnNzaWRzW2ldLmxlbiA+IDMyICkKKwkJCQlteVNzaWQuc3NpZHNbaV0ubGVuID0gMzI7CisJCQltZW1jcHkobXlTc2lkLnNzaWRzW2ldLnNzaWQsIHNzaWRzW2ldLAorCQkJICAgICAgIG15U3NpZC5zc2lkc1tpXS5sZW4pOworCQl9CisJCW15U3NpZC5sZW4gPSBzaXplb2YobXlTc2lkKTsKKwl9CisKKwlzdGF0dXMgPSB3cml0ZUNvbmZpZ1JpZChhaSwgbG9jayk7CisJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKKworCS8qIFNldCB1cCB0aGUgU1NJRCBsaXN0ICovCisJaWYgKCBzc2lkc1swXSApIHsKKwkJc3RhdHVzID0gd3JpdGVTc2lkUmlkKGFpLCAmbXlTc2lkLCBsb2NrKTsKKwkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKKwl9CisKKwlzdGF0dXMgPSBlbmFibGVfTUFDKGFpLCAmcnNwLCBsb2NrKTsKKwlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTIHx8IChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86IEJhZCBNQUMgZW5hYmxlIHJlYXNvbiA9ICV4LCByaWQgPSAleCwgb2Zmc2V0ID0gJWRcbiIsIHJzcC5yc3AwLCByc3AucnNwMSwgcnNwLnJzcDIgKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCS8qIEdyYWIgdGhlIGluaXRpYWwgd2VwIGtleSwgd2UgZ290dGEgc2F2ZSBpdCBmb3IgYXV0b193ZXAgKi8KKwlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDEsIGxvY2spOworCWlmIChyYyA9PSBTVUNDRVNTKSBkbyB7CisJCWxhc3RpbmRleCA9IHdrci5raW5kZXg7CisJCWlmICh3a3Iua2luZGV4ID09IDB4ZmZmZikgeworCQkJYWktPmRlZmluZGV4ID0gd2tyLm1hY1swXTsKKwkJfQorCQlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDAsIGxvY2spOworCX0gd2hpbGUobGFzdGluZGV4ICE9IHdrci5raW5kZXgpOworCisJaWYgKGF1dG9fd2VwKSB7CisJCWFpLT5leHBpcmVzID0gUlVOX0FUKDMqSFopOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyB1MTYgaXNzdWVjb21tYW5kKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBDbWQgKnBDbWQsIFJlc3AgKnBSc3ApIHsKKyAgICAgICAgLy8gSW0gcmVhbGx5IHBhcmFub2lkIGFib3V0IGxldHRpbmcgaXQgcnVuIGZvcmV2ZXIhCisJaW50IG1heF90cmllcyA9IDYwMDAwMDsKKworCWlmIChJTjQ1MDAoYWksIEVWU1RBVCkgJiBFVl9DTUQpCisJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTUQpOworCisJT1VUNDUwMChhaSwgUEFSQU0wLCBwQ21kLT5wYXJtMCk7CisJT1VUNDUwMChhaSwgUEFSQU0xLCBwQ21kLT5wYXJtMSk7CisJT1VUNDUwMChhaSwgUEFSQU0yLCBwQ21kLT5wYXJtMik7CisJT1VUNDUwMChhaSwgQ09NTUFORCwgcENtZC0+Y21kKTsKKworCXdoaWxlIChtYXhfdHJpZXMtLSAmJiAoSU40NTAwKGFpLCBFVlNUQVQpICYgRVZfQ01EKSA9PSAwKSB7CisJCWlmICgoSU40NTAwKGFpLCBDT01NQU5EKSkgPT0gcENtZC0+Y21kKQorCQkJLy8gUEM0NTAwIGRpZG4ndCBub3RpY2UgY29tbWFuZCwgdHJ5IGFnYWluCisJCQlPVVQ0NTAwKGFpLCBDT01NQU5ELCBwQ21kLT5jbWQpOworCQlpZiAoIWluX2F0b21pYygpICYmIChtYXhfdHJpZXMgJiAyNTUpID09IDApCisJCQlzY2hlZHVsZSgpOworCX0KKworCWlmICggbWF4X3RyaWVzID09IC0xICkgeworCQlwcmludGsoIEtFUk5fRVJSCisJCQkiYWlybzogTWF4IHRyaWVzIGV4Y2VlZGVkIHdoZW4gaXNzdWVpbmcgY29tbWFuZFxuIiApOworCQlpZiAoSU40NTAwKGFpLCBDT01NQU5EKSAmIENPTU1BTkRfQlVTWSkKKwkJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTEVBUkNPTU1BTkRCVVNZKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCS8vIGNvbW1hbmQgY29tcGxldGVkCisJcFJzcC0+c3RhdHVzID0gSU40NTAwKGFpLCBTVEFUVVMpOworCXBSc3AtPnJzcDAgPSBJTjQ1MDAoYWksIFJFU1AwKTsKKwlwUnNwLT5yc3AxID0gSU40NTAwKGFpLCBSRVNQMSk7CisJcFJzcC0+cnNwMiA9IElONDUwMChhaSwgUkVTUDIpOworCWlmICgocFJzcC0+c3RhdHVzICYgMHhmZjAwKSE9MCAmJiBwQ21kLT5jbWQgIT0gQ01EX1NPRlRSRVNFVCkgeworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBjbWQ9ICV4XG4iLCBwQ21kLT5jbWQpOworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBzdGF0dXM9ICV4XG4iLCBwUnNwLT5zdGF0dXMpOworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBSc3AwPSAleFxuIiwgcFJzcC0+cnNwMCk7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IFJzcDE9ICV4XG4iLCBwUnNwLT5yc3AxKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogUnNwMj0gJXhcbiIsIHBSc3AtPnJzcDIpOworCX0KKworCS8vIGNsZWFyIHN0dWNrIGNvbW1hbmQgYnVzeSBpZiBuZWNlc3NhcnkKKwlpZiAoSU40NTAwKGFpLCBDT01NQU5EKSAmIENPTU1BTkRfQlVTWSkgeworCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ0xFQVJDT01NQU5EQlVTWSk7CisJfQorCS8vIGFja25vd2xlZGdlIHByb2Nlc3NpbmcgdGhlIHN0YXR1cy9yZXNwb25zZQorCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTUQpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qIFNldHMgdXAgdGhlIGJhcCB0byBzdGFydCBleGNoYW5nZSBkYXRhLiAgd2hpY2hiYXAgc2hvdWxkCisgKiBiZSBvbmUgb2YgdGhlIEJBUDAgb3IgQkFQMSBkZWZpbmVzLiAgTG9ja3Mgc2hvdWxkIGJlIGhlbGQgYmVmb3JlCisgKiBjYWxsaW5nISAqLworc3RhdGljIGludCBiYXBfc2V0dXAoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsIHUxNiBvZmZzZXQsIGludCB3aGljaGJhcCApCit7CisJaW50IHRpbWVvdXQgPSA1MDsKKwlpbnQgbWF4X3RyaWVzID0gMzsKKworCU9VVDQ1MDAoYWksIFNFTEVDVDArd2hpY2hiYXAsIHJpZCk7CisJT1VUNDUwMChhaSwgT0ZGU0VUMCt3aGljaGJhcCwgb2Zmc2V0KTsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3RhdHVzID0gSU40NTAwKGFpLCBPRkZTRVQwK3doaWNoYmFwKTsKKwkJaWYgKHN0YXR1cyAmIEJBUF9CVVNZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzbid0IHJlYWxseSBhIHRpbWVvdXQsIGJ1dCBpdHMga2luZGEKKwkJCSAgIGNsb3NlICovCisJCQlpZiAodGltZW91dC0tKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAoIHN0YXR1cyAmIEJBUF9FUlIgKSB7CisJCQkvKiBpbnZhbGlkIHJpZCBvciBvZmZzZXQgKi8KKwkJCXByaW50ayggS0VSTl9FUlIgImFpcm86IEJBUCBlcnJvciAleCAlZFxuIiwKKwkJCQlzdGF0dXMsIHdoaWNoYmFwICk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgQkFQX0RPTkUpIHsgLy8gc3VjY2VzcworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKwkJaWYgKCAhKG1heF90cmllcy0tKSApIHsKKwkJCXByaW50ayggS0VSTl9FUlIKKwkJCQkiYWlybzogQkFQIHNldHVwIGVycm9yIHRvbyBtYW55IHJldHJpZXNcbiIgKTsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQkvLyAtLSBQQzQ1MDAgbWlzc2VkIGl0LCB0cnkgYWdhaW4KKwkJT1VUNDUwMChhaSwgU0VMRUNUMCt3aGljaGJhcCwgcmlkKTsKKwkJT1VUNDUwMChhaSwgT0ZGU0VUMCt3aGljaGJhcCwgb2Zmc2V0KTsKKwkJdGltZW91dCA9IDUwOworCX0KK30KKworLyogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IGF1eF9iYXBfcmVhZC4gIFRoaXMgYXV4IGZ1bmN0aW9uIGFuZCB0aGUKKyAgIGZvbGxvd2luZyB1c2UgY29uY2VwdHMgbm90IGRvY3VtZW50ZWQgaW4gdGhlIGRldmVsb3BlcnMgZ3VpZGUuICBJCisgICBnb3QgdGhlbSBmcm9tIGEgcGF0Y2ggZ2l2ZW4gdG8gbXkgYnkgQWlyb25ldCAqLworc3RhdGljIHUxNiBhdXhfc2V0dXAoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiBwYWdlLAorCQkgICAgIHUxNiBvZmZzZXQsIHUxNiAqbGVuKQoreworCXUxNiBuZXh0OworCisJT1VUNDUwMChhaSwgQVVYUEFHRSwgcGFnZSk7CisJT1VUNDUwMChhaSwgQVVYT0ZGLCAwKTsKKwluZXh0ID0gSU40NTAwKGFpLCBBVVhEQVRBKTsKKwkqbGVuID0gSU40NTAwKGFpLCBBVVhEQVRBKSYweGZmOworCWlmIChvZmZzZXQgIT0gNCkgT1VUNDUwMChhaSwgQVVYT0ZGLCBvZmZzZXQpOworCXJldHVybiBuZXh0OworfQorCisvKiByZXF1aXJlcyBjYWxsIHRvIGJhcF9zZXR1cCgpIGZpcnN0ICovCitzdGF0aWMgaW50IGF1eF9iYXBfcmVhZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2ICpwdTE2RHN0LAorCQkJaW50IGJ5dGVsZW4sIGludCB3aGljaGJhcCkKK3sKKwl1MTYgbGVuOworCXUxNiBwYWdlOworCXUxNiBvZmZzZXQ7CisJdTE2IG5leHQ7CisJaW50IHdvcmRzOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWktPmF1eF9sb2NrLCBmbGFncyk7CisJcGFnZSA9IElONDUwMChhaSwgU1dTMCt3aGljaGJhcCk7CisJb2Zmc2V0ID0gSU40NTAwKGFpLCBTV1MyK3doaWNoYmFwKTsKKwluZXh0ID0gYXV4X3NldHVwKGFpLCBwYWdlLCBvZmZzZXQsICZsZW4pOworCXdvcmRzID0gKGJ5dGVsZW4rMSk+PjE7CisKKwlmb3IgKGk9MDsgaTx3b3JkczspIHsKKwkJaW50IGNvdW50OworCQljb3VudCA9IChsZW4+PjEpIDwgKHdvcmRzLWkpID8gKGxlbj4+MSkgOiAod29yZHMtaSk7CisJCWlmICggIWRvOGJpdElPICkKKwkJCWluc3coIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwKKwkJCSAgICAgIHB1MTZEc3QraSxjb3VudCApOworCQllbHNlCisJCQlpbnNiKCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsCisJCQkgICAgICBwdTE2RHN0K2ksIGNvdW50IDw8IDEgKTsKKwkJaSArPSBjb3VudDsKKwkJaWYgKGk8d29yZHMpIHsKKwkJCW5leHQgPSBhdXhfc2V0dXAoYWksIG5leHQsIDQsICZsZW4pOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFpLT5hdXhfbG9jaywgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworfQorCisKKy8qIHJlcXVpcmVzIGNhbGwgdG8gYmFwX3NldHVwKCkgZmlyc3QgKi8KK3N0YXRpYyBpbnQgZmFzdF9iYXBfcmVhZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2ICpwdTE2RHN0LAorCQkJIGludCBieXRlbGVuLCBpbnQgd2hpY2hiYXApCit7CisJYnl0ZWxlbiA9IChieXRlbGVuICsgMSkgJiAofjEpOyAvLyByb3VuZCB1cCB0byBldmVuIHZhbHVlCisJaWYgKCAhZG84Yml0SU8gKQorCQlpbnN3KCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsIHB1MTZEc3QsIGJ5dGVsZW4+PjEgKTsKKwllbHNlCisJCWluc2IoIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwgcHUxNkRzdCwgYnl0ZWxlbiApOworCXJldHVybiBTVUNDRVNTOworfQorCisvKiByZXF1aXJlcyBjYWxsIHRvIGJhcF9zZXR1cCgpIGZpcnN0ICovCitzdGF0aWMgaW50IGJhcF93cml0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgY29uc3QgdTE2ICpwdTE2U3JjLAorCQkgICAgIGludCBieXRlbGVuLCBpbnQgd2hpY2hiYXApCit7CisJYnl0ZWxlbiA9IChieXRlbGVuICsgMSkgJiAofjEpOyAvLyByb3VuZCB1cCB0byBldmVuIHZhbHVlCisJaWYgKCAhZG84Yml0SU8gKQorCQlvdXRzdyggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLAorCQkgICAgICAgcHUxNlNyYywgYnl0ZWxlbj4+MSApOworCWVsc2UKKwkJb3V0c2IoIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwgcHUxNlNyYywgYnl0ZWxlbiApOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IFBDNDUwMF9hY2Nlc3NyaWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsIHUxNiBhY2NtZCkKK3sKKwlDbWQgY21kOyAvKiBmb3IgaXNzdWluZyBjb21tYW5kcyAqLworCVJlc3AgcnNwOyAvKiByZXNwb25zZSBmcm9tIGNvbW1hbmRzICovCisJdTE2IHN0YXR1czsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZCA9IGFjY21kOworCWNtZC5wYXJtMCA9IHJpZDsKKwlzdGF0dXMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIHN0YXR1czsKKwlpZiAoIChyc3Auc3RhdHVzICYgMHg3RjAwKSAhPSAwKSB7CisJCXJldHVybiAoYWNjbWQgPDwgOCkgKyAocnNwLnJzcDAgJiAweEZGKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qICBOb3RlLCB0aGF0IHdlIGFyZSB1c2luZyBCQVAxIHdoaWNoIGlzIGFsc28gdXNlZCBieSB0cmFuc21pdCwgc28KKyAqICB3ZSBtdXN0IGdldCBhIGxvY2suICovCitzdGF0aWMgaW50IFBDNDUwMF9yZWFkcmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCB2b2lkICpwQnVmLCBpbnQgbGVuLCBpbnQgbG9jaykKK3sKKwl1MTYgc3RhdHVzOworICAgICAgICBpbnQgcmMgPSBTVUNDRVNTOworCisJaWYgKGxvY2spIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCQlyZXR1cm4gRVJST1I7CisJfQorCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlDbWQgY21kOworCQlSZXNwIHJzcDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQltZW1zZXQoJnJzcCwgMCwgc2l6ZW9mKHJzcCkpOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MudmFsaWQgPSAxOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MubGVuID0gUklEU0laRTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnJpZCA9IDA7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5ob3N0X2FkZHIgPSBhaS0+cmlkYnVzOworCisJCWNtZC5jbWQgPSBDTURfQUNDRVNTOworCQljbWQucGFybTAgPSByaWQ7CisKKwkJbWVtY3B5X3RvaW8oYWktPmNvbmZpZ19kZXNjLmNhcmRfcmFtX29mZiwKKwkJCSZhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MsIHNpemVvZihSaWQpKTsKKworCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisKKwkJaWYgKHJzcC5zdGF0dXMgJiAweDdmMDApCisJCQlyYyA9IHJzcC5yc3AwOworCQlpZiAoIXJjKQorCQkJbWVtY3B5KHBCdWYsIGFpLT5jb25maWdfZGVzYy52aXJ0dWFsX2hvc3RfYWRkciwgbGVuKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCWlmICgoc3RhdHVzID0gUEM0NTAwX2FjY2Vzc3JpZChhaSwgcmlkLCBDTURfQUNDRVNTKSkhPVNVQ0NFU1MpIHsKKwkgICAgICAgICAgICAgICAgcmMgPSBzdGF0dXM7CisJICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKwkgICAgICAgIH0KKwkJaWYgKGJhcF9zZXR1cChhaSwgcmlkLCAwLCBCQVAxKSAhPSBTVUNDRVNTKSB7CisJCQlyYyA9IEVSUk9SOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCS8vIHJlYWQgdGhlIHJpZCBsZW5ndGggZmllbGQKKwkJYmFwX3JlYWQoYWksIHBCdWYsIDIsIEJBUDEpOworCQkvLyBsZW5ndGggZm9yIHJlbWFpbmluZyBwYXJ0IG9mIHJpZAorCQlsZW4gPSBtaW4obGVuLCAoaW50KWxlMTZfdG9fY3B1KCoodTE2KilwQnVmKSkgLSAyOworCisJCWlmICggbGVuIDw9IDIgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSCisJCQkiYWlybzogUmlkICV4IGhhcyBhIGxlbmd0aCBvZiAlZCB3aGljaCBpcyB0b28gc2hvcnRcbiIsCisJCQkJKGludClyaWQsIChpbnQpbGVuICk7CisJCQlyYyA9IEVSUk9SOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJCX0KKwkJLy8gcmVhZCByZW1haW5kZXIgb2YgdGhlIHJpZAorCQlyYyA9IGJhcF9yZWFkKGFpLCAoKHUxNiopcEJ1ZikrMSwgbGVuLCBCQVAxKTsKKwl9Citkb25lOgorCWlmIChsb2NrKQorCQl1cCgmYWktPnNlbSk7CisJcmV0dXJuIHJjOworfQorCisvKiAgTm90ZSwgdGhhdCB3ZSBhcmUgdXNpbmcgQkFQMSB3aGljaCBpcyBhbHNvIHVzZWQgYnkgdHJhbnNtaXQsIHNvCisgKiAgbWFrZSBzdXJlIHRoaXMgaXNudCBjYWxsZWQgd2hlbiBhIHRyYW5zbWl0IGlzIGhhcHBlbmluZyAqLworc3RhdGljIGludCBQQzQ1MDBfd3JpdGVyaWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsCisJCQkgICBjb25zdCB2b2lkICpwQnVmLCBpbnQgbGVuLCBpbnQgbG9jaykKK3sKKwl1MTYgc3RhdHVzOworCWludCByYyA9IFNVQ0NFU1M7CisKKwkqKHUxNiopcEJ1ZiA9IGNwdV90b19sZTE2KCh1MTYpbGVuKTsKKworCWlmIChsb2NrKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQkJcmV0dXJuIEVSUk9SOworCX0KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJQ21kIGNtZDsKKwkJUmVzcCByc3A7CisKKwkJaWYgKHRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykpCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IE1BQyBzaG91bGQgYmUgZGlzYWJsZWQgKHJpZD0lMDR4KVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHJpZCk7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCW1lbXNldCgmcnNwLCAwLCBzaXplb2YocnNwKSk7CisKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmxlbiA9ICooKHUxNiAqKXBCdWYpOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MucmlkID0gMDsKKworCQljbWQuY21kID0gQ01EX1dSSVRFUklEOworCQljbWQucGFybTAgPSByaWQ7CisKKwkJbWVtY3B5X3RvaW8oYWktPmNvbmZpZ19kZXNjLmNhcmRfcmFtX29mZiwKKwkJCSZhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MsIHNpemVvZihSaWQpKTsKKworCQlpZiAobGVuIDwgNCB8fCBsZW4gPiAyMDQ3KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsZW49JWRcbiIsX19GVU5DVElPTl9fLGxlbik7CisJCQlyYyA9IC0xOworCQl9IGVsc2UgeworCQkJbWVtY3B5KChjaGFyICopYWktPmNvbmZpZ19kZXNjLnZpcnR1YWxfaG9zdF9hZGRyLAorCQkJCXBCdWYsIGxlbik7CisKKwkJCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJCWlmICgocmMgJiAweGZmMDApICE9IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXcml0ZSByaWQgRXJyb3IgJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXyxyYyk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ21kPSUwNHhcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sY21kLmNtZCk7CisJCQl9CisKKwkJCWlmICgocnNwLnN0YXR1cyAmIDB4N2YwMCkpCisJCQkJcmMgPSByc3AucnNwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8vIC0tLSBmaXJzdCBhY2Nlc3Mgc28gdGhhdCB3ZSBjYW4gd3JpdGUgdGhlIHJpZCBkYXRhCisJCWlmICggKHN0YXR1cyA9IFBDNDUwMF9hY2Nlc3NyaWQoYWksIHJpZCwgQ01EX0FDQ0VTUykpICE9IDApIHsKKwkgICAgICAgICAgICAgICAgcmMgPSBzdGF0dXM7CisJICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKwkgICAgICAgIH0KKwkJLy8gLS0tIG5vdyB3cml0ZSB0aGUgcmlkIGRhdGEKKwkJaWYgKGJhcF9zZXR1cChhaSwgcmlkLCAwLCBCQVAxKSAhPSBTVUNDRVNTKSB7CisJICAgICAgICAgICAgICAgIHJjID0gRVJST1I7CisJICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKwkgICAgICAgIH0KKwkJYmFwX3dyaXRlKGFpLCBwQnVmLCBsZW4sIEJBUDEpOworCQkvLyAtLS1ub3cgY29tbWl0IHRoZSByaWQgZGF0YQorCQlyYyA9IFBDNDUwMF9hY2Nlc3NyaWQoYWksIHJpZCwgMHgxMDB8Q01EX0FDQ0VTUyk7CisJfQorZG9uZToKKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qIEFsbG9jYXRlcyBhIEZJRCB0byBiZSB1c2VkIGZvciB0cmFuc21pdHRpbmcgcGFja2V0cy4gIFdlIG9ubHkgdXNlCisgICBvbmUgZm9yIG5vdy4gKi8KK3N0YXRpYyB1MTYgdHJhbnNtaXRfYWxsb2NhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsZW5QYXlsb2FkLCBpbnQgcmF3KQoreworCXVuc2lnbmVkIGludCBsb29wID0gMzAwMDsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCXUxNiB0eEZpZDsKKwl1MTYgdHhDb250cm9sOworCisJY21kLmNtZCA9IENNRF9BTExPQ0FURVRYOworCWNtZC5wYXJtMCA9IGxlblBheWxvYWQ7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiBFUlJPUjsKKwlpZiAoaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKSAhPSBTVUNDRVNTKSB7CisJCXR4RmlkID0gRVJST1I7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgeworCQl0eEZpZCA9IEVSUk9SOworCQlnb3RvIGRvbmU7CisJfQorCS8qIHdhaXQgZm9yIHRoZSBhbGxvY2F0ZSBldmVudC9pbmRpY2F0aW9uCisJICogSXQgbWFrZXMgbWUga2luZCBvZiBuZXJ2b3VzIHRoYXQgdGhpcyBjYW4ganVzdCBzaXQgaGVyZSBhbmQgc3BpbiwKKwkgKiBidXQgaW4gcHJhY3RpY2UgaXQgb25seSBsb29wcyBsaWtlIGZvdXIgdGltZXMuICovCisJd2hpbGUgKCgoSU40NTAwKGFpLCBFVlNUQVQpICYgRVZfQUxMT0MpID09IDApICYmIC0tbG9vcCk7CisJaWYgKCFsb29wKSB7CisJCXR4RmlkID0gRVJST1I7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyBnZXQgdGhlIGFsbG9jYXRlZCBmaWQgYW5kIGFja25vd2xlZGdlCisJdHhGaWQgPSBJTjQ1MDAoYWksIFRYQUxMT0NGSUQpOworCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9BTExPQyk7CisKKwkvKiAgVGhlIENBUkQgaXMgcHJldHR5IGNvb2wgc2luY2UgaXQgY29udmVydHMgdGhlIGV0aGVybmV0IHBhY2tldAorCSAqICBpbnRvIDgwMi4xMS4gIEFsc28gbm90ZSB0aGF0IHdlIGRvbid0IHJlbGVhc2UgdGhlIEZJRCBzaW5jZSB3ZQorCSAqICB3aWxsIGJlIHVzaW5nIHRoZSBzYW1lIG9uZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAqLworCS8qICBXZSBvbmx5IGhhdmUgdG8gc2V0dXAgdGhlIGNvbnRyb2wgb25jZSBzaW5jZSB3ZSBhcmUgbm90CisJICogIHJlbGVhc2luZyB0aGUgZmlkLiAqLworCWlmIChyYXcpCisJCXR4Q29udHJvbCA9IGNwdV90b19sZTE2KFRYQ1RMX1RYT0sgfCBUWENUTF9UWEVYIHwgVFhDVExfODAyXzExCisJCQl8IFRYQ1RMX0VUSEVSTkVUIHwgVFhDVExfTk9SRUxFQVNFKTsKKwllbHNlCisJCXR4Q29udHJvbCA9IGNwdV90b19sZTE2KFRYQ1RMX1RYT0sgfCBUWENUTF9UWEVYIHwgVFhDVExfODAyXzMKKwkJCXwgVFhDVExfRVRIRVJORVQgfCBUWENUTF9OT1JFTEVBU0UpOworCWlmIChiYXBfc2V0dXAoYWksIHR4RmlkLCAweDAwMDgsIEJBUDEpICE9IFNVQ0NFU1MpCisJCXR4RmlkID0gRVJST1I7CisJZWxzZQorCQliYXBfd3JpdGUoYWksICZ0eENvbnRyb2wsIHNpemVvZih0eENvbnRyb2wpLCBCQVAxKTsKKworZG9uZToKKwl1cCgmYWktPnNlbSk7CisKKwlyZXR1cm4gdHhGaWQ7Cit9CisKKy8qIEluIGdlbmVyYWwgQkFQMSBpcyBkZWRpY2F0ZWQgdG8gdHJhbnNtaXRpbmcgcGFja2V0cy4gIEhvd2V2ZXIsCisgICBzaW5jZSB3ZSBuZWVkIGEgQkFQIHdoZW4gYWNjZXNzaW5nIFJJRHMsIHdlIGFsc28gdXNlIEJBUDEgZm9yIHRoYXQuCisgICBNYWtlIHN1cmUgdGhlIEJBUDEgc3BpbmxvY2sgaXMgaGVsZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiAqLworc3RhdGljIGludCB0cmFuc21pdF84MDJfM19wYWNrZXQoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsZW4sIGNoYXIgKnBQYWNrZXQpCit7CisJdTE2IHBheWxvYWRMZW47CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgbWljbGVuID0gMDsKKwl1MTYgdHhGaWQgPSBsZW47CisJTUlDQnVmZmVyIHBNaWM7CisKKwlsZW4gPj49IDE2OworCisJaWYgKGxlbiA8PSBFVEhfQUxFTiAqIDIpIHsKKwkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIlNob3J0IHBhY2tldCAlZFxuIiwgbGVuICk7CisJCXJldHVybiBFUlJPUjsKKwl9CisJbGVuIC09IEVUSF9BTEVOICogMjsKKworI2lmZGVmIE1JQ1NVUFBPUlQKKwlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFpLT5mbGFncykgJiYgYWktPm1pY3N0YXRzLmVuYWJsZWQgJiYgCisJICAgIChudG9ocygoKHUxNiAqKXBQYWNrZXQpWzZdKSAhPSAweDg4OEUpKSB7CisJCWlmIChlbmNhcHN1bGF0ZShhaSwoZXRoZXJIZWFkICopcFBhY2tldCwmcE1pYyxsZW4pICE9IFNVQ0NFU1MpCisJCQlyZXR1cm4gRVJST1I7CisJCW1pY2xlbiA9IHNpemVvZihwTWljKTsKKwl9CisjZW5kaWYKKworCS8vIHBhY2tldCBpcyBkZXN0aW5hdGlvbls2XSwgc291cmNlWzZdLCBwYXlsb2FkW2xlbi0xMl0KKwkvLyB3cml0ZSB0aGUgcGF5bG9hZCBsZW5ndGggYW5kIGRzdC9zcmMvcGF5bG9hZAorCWlmIChiYXBfc2V0dXAoYWksIHR4RmlkLCAweDAwMzYsIEJBUDEpICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwkvKiBUaGUgaGFyZHdhcmUgYWRkcmVzc2VzIGFyZW4ndCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIHBheWxvYWQsIHNvCisJICogd2UgaGF2ZSB0byBzdWJ0cmFjdCB0aGUgMTIgYnl0ZXMgZm9yIHRoZSBhZGRyZXNzZXMgb2ZmICovCisJcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbiArIG1pY2xlbik7CisJYmFwX3dyaXRlKGFpLCAmcGF5bG9hZExlbiwgc2l6ZW9mKHBheWxvYWRMZW4pLEJBUDEpOworCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopcFBhY2tldCwgc2l6ZW9mKGV0aGVySGVhZCksIEJBUDEpOworCWlmIChtaWNsZW4pCisJCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopJnBNaWMsIG1pY2xlbiwgQkFQMSk7CisJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KikocFBhY2tldCArIHNpemVvZihldGhlckhlYWQpKSwgbGVuLCBCQVAxKTsKKwkvLyBpc3N1ZSB0aGUgdHJhbnNtaXQgY29tbWFuZAorCW1lbXNldCggJmNtZCwgMCwgc2l6ZW9mKCBjbWQgKSApOworCWNtZC5jbWQgPSBDTURfVFJBTlNNSVQ7CisJY21kLnBhcm0wID0gdHhGaWQ7CisJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCWlmICggKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHJldHVybiBFUlJPUjsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB0cmFuc21pdF84MDJfMTFfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KQoreworCXUxNiBmYywgcGF5bG9hZExlbjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCWludCBoZHJsZW47CisJc3RydWN0IHsKKwkJdTggYWRkcjRbRVRIX0FMRU5dOworCQl1MTYgZ2FwbGVuOworCQl1OCBnYXBbNl07CisJfSBnYXA7CisJdTE2IHR4RmlkID0gbGVuOworCWxlbiA+Pj0gMTY7CisJZ2FwLmdhcGxlbiA9IDY7CisKKwlmYyA9IGxlMTZfdG9fY3B1KCooY29uc3QgdTE2KilwUGFja2V0KTsKKwlzd2l0Y2ggKGZjICYgMHhjKSB7CisJCWNhc2UgNDoKKwkJCWlmICgoZmMgJiAweGUwKSA9PSAweGMwKQorCQkJCWhkcmxlbiA9IDEwOworCQkJZWxzZQorCQkJCWhkcmxlbiA9IDE2OworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWlmICgoZmMmMHgzMDApPT0weDMwMCl7CisJCQkJaGRybGVuID0gMzA7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAyNDsKKwl9CisKKwlpZiAobGVuIDwgaGRybGVuKSB7CisJCXByaW50ayggS0VSTl9XQVJOSU5HICJTaG9ydCBwYWNrZXQgJWRcbiIsIGxlbiApOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJLyogcGFja2V0IGlzIDgwMi4xMSBoZWFkZXIgKyAgcGF5bG9hZAorCSAqIHdyaXRlIHRoZSBwYXlsb2FkIGxlbmd0aCBhbmQgZHN0L3NyYy9wYXlsb2FkICovCisJaWYgKGJhcF9zZXR1cChhaSwgdHhGaWQsIDYsIEJBUDEpICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwkvKiBUaGUgODAyLjExIGhlYWRlciBhcmVuJ3QgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBzbworCSAqIHdlIGhhdmUgdG8gc3VidHJhY3QgdGhlIGhlYWRlciBieXRlcyBvZmYgKi8KKwlwYXlsb2FkTGVuID0gY3B1X3RvX2xlMTYobGVuLWhkcmxlbik7CisJYmFwX3dyaXRlKGFpLCAmcGF5bG9hZExlbiwgc2l6ZW9mKHBheWxvYWRMZW4pLEJBUDEpOworCWlmIChiYXBfc2V0dXAoYWksIHR4RmlkLCAweDAwMTQsIEJBUDEpICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKXBQYWNrZXQsIGhkcmxlbiwgQkFQMSk7CisJYmFwX3dyaXRlKGFpLCBoZHJsZW4gPT0gMzAgPworCQkoY29uc3QgdTE2KikmZ2FwLmdhcGxlbiA6IChjb25zdCB1MTYqKSZnYXAsIDM4IC0gaGRybGVuLCBCQVAxKTsKKworCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopKHBQYWNrZXQgKyBoZHJsZW4pLCBsZW4gLSBoZHJsZW4sIEJBUDEpOworCS8vIGlzc3VlIHRoZSB0cmFuc21pdCBjb21tYW5kCisJbWVtc2V0KCAmY21kLCAwLCBzaXplb2YoIGNtZCApICk7CisJY21kLmNtZCA9IENNRF9UUkFOU01JVDsKKwljbWQucGFybTAgPSB0eEZpZDsKKwlpZiAoaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJaWYgKCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgcmV0dXJuIEVSUk9SOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogIFRoaXMgaXMgdGhlIHByb2NfZnMgcm91dGluZXMuICBJdCBpcyBhIGJpdCBtZXNzaWVyIHRoYW4gSSB3b3VsZAorICogIGxpa2UhICBGZWVsIGZyZWUgdG8gY2xlYW4gaXQgdXAhCisgKi8KKworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkKCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgc2l6ZV90IGxlbiwKKwkJCSAgbG9mZl90ICpvZmZzZXQpOworCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICBzaXplX3QgbGVuLAorCQkJICAgbG9mZl90ICpvZmZzZXQgKTsKK3N0YXRpYyBpbnQgcHJvY19jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKKworc3RhdGljIGludCBwcm9jX3N0YXRzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2Nfc3RhdHNkZWx0YV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX3N0YXR1c19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX1NTSURfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19BUExpc3Rfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19CU1NMaXN0X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfY29uZmlnX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2Nfd2Vwa2V5X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3RhdHNkZWx0YV9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS5vcGVuCQk9IHByb2Nfc3RhdHNkZWx0YV9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zdGF0c19vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS5vcGVuCQk9IHByb2Nfc3RhdHNfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3RhdHVzX29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLm9wZW4JCT0gcHJvY19zdGF0dXNfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfU1NJRF9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2NfU1NJRF9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19CU1NMaXN0X29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfd3JpdGUsCisJLm9wZW4JCT0gcHJvY19CU1NMaXN0X29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX0FQTGlzdF9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2NfQVBMaXN0X29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NvbmZpZ19vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2NfY29uZmlnX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3dlcGtleV9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2Nfd2Vwa2V5X29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphaXJvX2VudHJ5OworCitzdHJ1Y3QgcHJvY19kYXRhIHsKKwlpbnQgcmVsZWFzZV9idWZmZXI7CisJaW50IHJlYWRsZW47CisJY2hhciAqcmJ1ZmZlcjsKKwlpbnQgd3JpdGVsZW47CisJaW50IG1heHdyaXRlbGVuOworCWNoYXIgKndidWZmZXI7CisJdm9pZCAoKm9uX2Nsb3NlKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworfTsKKworI2lmbmRlZiBTRVRQUk9DX09QUworI2RlZmluZSBTRVRQUk9DX09QUyhlbnRyeSwgb3BzKSAoZW50cnkpLT5wcm9jX2ZvcHMgPSAmKG9wcykKKyNlbmRpZgorCitzdGF0aWMgaW50IHNldHVwX3Byb2NfZW50cnkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBhaXJvX2luZm8gKmFwcml2ICkgeworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisJLyogRmlyc3Qgc2V0dXAgdGhlIGRldmljZSBkaXJlY3RvcnkgKi8KKwlzdHJjcHkoYXByaXYtPnByb2NfbmFtZSxkZXYtPm5hbWUpOworCWFwcml2LT5wcm9jX2VudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoYXByaXYtPnByb2NfbmFtZSwKKwkJCQkJICAgICAgU19JRkRJUnxhaXJvX3Blcm0sCisJCQkJCSAgICAgIGFpcm9fZW50cnkpOworICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT5naWQgPSBwcm9jX2dpZDsKKyAgICAgICAgYXByaXYtPnByb2NfZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkvKiBTZXR1cCB0aGUgU3RhdHNEZWx0YSAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXRzRGVsdGEiLAorCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0c2RlbHRhX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgU3RhdHMgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0cyIsCisJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXRzX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgU3RhdHVzICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHVzIiwKKwkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfc3RhdHVzX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgQ29uZmlnICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiQ29uZmlnIiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19jb25maWdfb3BzKTsKKworCS8qIFNldHVwIHRoZSBTU0lEICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU1NJRCIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfU1NJRF9vcHMpOworCisJLyogU2V0dXAgdGhlIEFQTGlzdCAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkFQTGlzdCIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfQVBMaXN0X29wcyk7CisKKwkvKiBTZXR1cCB0aGUgQlNTTGlzdCAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkJTU0xpc3QiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19CU1NMaXN0X29wcyk7CisKKwkvKiBTZXR1cCB0aGUgV2VwS2V5ICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiV2VwS2V5IiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY193ZXBrZXlfb3BzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRha2Vkb3duX3Byb2NfZW50cnkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgKSB7CisJaWYgKCAhYXByaXYtPnByb2NfZW50cnktPm5hbWVsZW4gKSByZXR1cm4gMDsKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHMiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHNEZWx0YSIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJTdGF0dXMiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiQ29uZmlnIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlNTSUQiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiQVBMaXN0IixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkJTU0xpc3QiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiV2VwS2V5IixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoYXByaXYtPnByb2NfbmFtZSxhaXJvX2VudHJ5KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBXaGF0IHdlIHdhbnQgZnJvbSB0aGUgcHJvY19mcyBpcyB0byBiZSBhYmxlIHRvIGVmZmljaWVudGx5IHJlYWQKKyAqICBhbmQgd3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBUbyBkbyB0aGlzLCB3ZSB3YW50IHRvIHJlYWQgdGhlCisgKiAgY29uZmlndXJhdGlvbiB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZCBhbmQgd3JpdGUgaXQgd2hlbiB0aGUgZmlsZSBpcworICogIGNsb3NlZC4gIFNvIGJhc2ljYWxseSB3ZSBhbGxvY2F0ZSBhIHJlYWQgYnVmZmVyIGF0IG9wZW4gYW5kIGZpbGwgaXQKKyAqICB3aXRoIGRhdGEsIGFuZCBhbGxvY2F0ZSBhIHdyaXRlIGJ1ZmZlciBhbmQgcmVhZCBpdCBhdCBjbG9zZS4KKyAqLworCisvKgorICogIFRoZSByZWFkIHJvdXRpbmUgaXMgZ2VuZXJpYywgaXQgcmVsaWVzIG9uIHRoZSBwcmVhbGxvY2F0ZWQgcmJ1ZmZlcgorICogIHRvIHN1cHBseSB0aGUgZGF0YS4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkKCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgc2l6ZV90IGxlbiwKKwkJCSAgbG9mZl90ICpvZmZzZXQgKQoreworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCXN0cnVjdCBwcm9jX2RhdGEgKnByaXYgPSAoc3RydWN0IHByb2NfZGF0YSopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcml2LT5yYnVmZmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9zID49IHByaXYtPnJlYWRsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPiBwcml2LT5yZWFkbGVuIC0gcG9zKQorCQlsZW4gPSBwcml2LT5yZWFkbGVuIC0gcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBwcml2LT5yYnVmZmVyICsgcG9zLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqb2Zmc2V0ID0gcG9zICsgbGVuOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiAgVGhlIHdyaXRlIHJvdXRpbmUgaXMgZ2VuZXJpYywgaXQgZmlsbHMgaW4gYSBwcmVhbGxvY2F0ZWQgcmJ1ZmZlcgorICogIHRvIHN1cHBseSB0aGUgZGF0YS4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqb2Zmc2V0ICkKK3sKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKwlzdHJ1Y3QgcHJvY19kYXRhICpwcml2ID0gKHN0cnVjdCBwcm9jX2RhdGEqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghcHJpdi0+d2J1ZmZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBwcml2LT5tYXh3cml0ZWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA+IHByaXYtPm1heHdyaXRlbGVuIC0gcG9zKQorCQlsZW4gPSBwcml2LT5tYXh3cml0ZWxlbiAtIHBvczsKKwlpZiAoY29weV9mcm9tX3VzZXIocHJpdi0+d2J1ZmZlciArIHBvcywgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIHBvcyArIGxlbiA+IHByaXYtPndyaXRlbGVuICkKKwkJcHJpdi0+d3JpdGVsZW4gPSBsZW4gKyBmaWxlLT5mX3BvczsKKwkqb2Zmc2V0ID0gcG9zICsgbGVuOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0dXNfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOworCWludCBpOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAyMDQ4LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlYWRTdGF0dXNSaWQoYXByaXYsICZzdGF0dXNfcmlkLCAxKTsKKwlyZWFkQ2FwYWJpbGl0eVJpZChhcHJpdiwgJmNhcF9yaWQsIDEpOworCisgICAgICAgIGkgPSBzcHJpbnRmKGRhdGEtPnJidWZmZXIsICJTdGF0dXM6ICVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMSA/ICJDRkcgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDIgPyAiQUNUICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDEwID8gIlNZTiAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgyMCA/ICJMTksgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4NDAgPyAiTEVBUCAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHg4MCA/ICJQUklWICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDEwMCA/ICJLRVkgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4MjAwID8gIldFUCAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHg4MDAwID8gIkVSUiAiOiAiIik7CisJc3ByaW50ZiggZGF0YS0+cmJ1ZmZlcitpLCAiTW9kZTogJXhcbiIKKwkJICJTaWduYWwgU3RyZW5ndGg6ICVkXG4iCisJCSAiU2lnbmFsIFF1YWxpdHk6ICVkXG4iCisJCSAiU1NJRDogJS0uKnNcbiIKKwkJICJBUDogJS0uMTZzXG4iCisJCSAiRnJlcTogJWRcbiIKKwkJICJCaXRSYXRlOiAlZG1ic1xuIgorCQkgIkRyaXZlciBWZXJzaW9uOiAlc1xuIgorCQkgIkRldmljZTogJXNcbk1hbnVmYWN0dXJlcjogJXNcbkZpcm13YXJlIFZlcnNpb246ICVzXG4iCisJCSAiUmFkaW8gdHlwZTogJXhcbkNvdW50cnk6ICV4XG5IYXJkd2FyZSBWZXJzaW9uOiAleFxuIgorCQkgIlNvZnR3YXJlIFZlcnNpb246ICV4XG5Tb2Z0d2FyZSBTdWJ2ZXJzaW9uOiAleFxuIgorCQkgIkJvb3QgYmxvY2sgdmVyc2lvbjogJXhcbiIsCisJCSAoaW50KXN0YXR1c19yaWQubW9kZSwKKwkJIChpbnQpc3RhdHVzX3JpZC5ub3JtYWxpemVkU2lnbmFsU3RyZW5ndGgsCisJCSAoaW50KXN0YXR1c19yaWQuc2lnbmFsUXVhbGl0eSwKKwkJIChpbnQpc3RhdHVzX3JpZC5TU0lEbGVuLAorCQkgc3RhdHVzX3JpZC5TU0lELAorCQkgc3RhdHVzX3JpZC5hcE5hbWUsCisJCSAoaW50KXN0YXR1c19yaWQuY2hhbm5lbCwKKwkJIChpbnQpc3RhdHVzX3JpZC5jdXJyZW50WG1pdFJhdGUvMiwKKwkJIHZlcnNpb24sCisJCSBjYXBfcmlkLnByb2ROYW1lLAorCQkgY2FwX3JpZC5tYW5OYW1lLAorCQkgY2FwX3JpZC5wcm9kVmVyLAorCQkgY2FwX3JpZC5yYWRpb1R5cGUsCisJCSBjYXBfcmlkLmNvdW50cnksCisJCSBjYXBfcmlkLmhhcmRWZXIsCisJCSAoaW50KWNhcF9yaWQuc29mdFZlciwKKwkJIChpbnQpY2FwX3JpZC5zb2Z0U3ViVmVyLAorCQkgKGludCljYXBfcmlkLmJvb3RCbG9ja1ZlciApOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX3N0YXRzX3JpZF9vcGVuKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBmaWxlKiwgdTE2KTsKK3N0YXRpYyBpbnQgcHJvY19zdGF0c2RlbHRhX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlICkgeworCWlmIChmaWxlLT5mX21vZGUmRk1PREVfV1JJVEUpIHsKKwkJcmV0dXJuIHByb2Nfc3RhdHNfcmlkX29wZW4oaW5vZGUsIGZpbGUsIFJJRF9TVEFUU0RFTFRBQ0xFQVIpOworCX0KKwlyZXR1cm4gcHJvY19zdGF0c19yaWRfb3Blbihpbm9kZSwgZmlsZSwgUklEX1NUQVRTREVMVEEpOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHNfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJcmV0dXJuIHByb2Nfc3RhdHNfcmlkX29wZW4oaW5vZGUsIGZpbGUsIFJJRF9TVEFUUyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19yaWRfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1MTYgcmlkICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OworCVN0YXRzUmlkIHN0YXRzOworCWludCBpLCBqOworCXUzMiAqdmFscyA9IHN0YXRzLnZhbHM7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDQwOTYsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVhZFN0YXRzUmlkKGFwcml2LCAmc3RhdHMsIHJpZCwgMSk7CisKKyAgICAgICAgaiA9IDA7CisJZm9yKGk9MDsgc3RhdHNMYWJlbHNbaV0hPShjaGFyICopLTEgJiYKKwkJICAgIGkqNDxzdGF0cy5sZW47IGkrKyl7CisJCWlmICghc3RhdHNMYWJlbHNbaV0pIGNvbnRpbnVlOworCQlpZiAoaitzdHJsZW4oc3RhdHNMYWJlbHNbaV0pKzE2PjQwOTYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiYWlybzogUG90ZW50aWFsbHkgZGlzYXN0ZXJvdXMgYnVmZmVyIG92ZXJmbG93IGF2ZXJ0ZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWorPXNwcmludGYoZGF0YS0+cmJ1ZmZlcitqLCAiJXM6ICV1XG4iLCBzdGF0c0xhYmVsc1tpXSwgdmFsc1tpXSk7CisJfQorCWlmIChpKjQ+PXN0YXRzLmxlbil7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJhaXJvOiBHb3QgYSBzaG9ydCByaWRcbiIpOworCX0KKwlkYXRhLT5yZWFkbGVuID0gajsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZGVjX3UxNiggY2hhciAqYnVmZmVyLCBpbnQgKnN0YXJ0LCBpbnQgbGltaXQgKSB7CisJdTE2IHZhbHVlOworCWludCB2YWxpZCA9IDA7CisJZm9yKCB2YWx1ZSA9IDA7IGJ1ZmZlclsqc3RhcnRdID49ICcwJyAmJgorCQkgICAgIGJ1ZmZlclsqc3RhcnRdIDw9ICc5JyAmJgorCQkgICAgICpzdGFydCA8IGxpbWl0OyAoKnN0YXJ0KSsrICkgeworCQl2YWxpZCA9IDE7CisJCXZhbHVlICo9IDEwOworCQl2YWx1ZSArPSBidWZmZXJbKnN0YXJ0XSAtICcwJzsKKwl9CisJaWYgKCAhdmFsaWQgKSByZXR1cm4gLTE7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IGFpcm9fY29uZmlnX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgdm9pZCAqendycSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKTsKKworc3RhdGljIHZvaWQgcHJvY19jb25maWdfb25fY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWNoYXIgKmxpbmU7CisKKwlpZiAoICFkYXRhLT53cml0ZWxlbiApIHJldHVybjsKKworCXJlYWRDb25maWdSaWQoYWksIDEpOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKworCWxpbmUgPSBkYXRhLT53YnVmZmVyOworCXdoaWxlKCBsaW5lWzBdICkgeworLyoqKiBNb2RlIHByb2Nlc3NpbmcgKi8KKwkJaWYgKCAhc3RybmNtcCggbGluZSwgIk1vZGU6ICIsIDYgKSApIHsKKwkJCWxpbmUgKz0gNjsKKwkJCWlmICgoYWktPmNvbmZpZy5ybW9kZSAmIDB4ZmYpID49IFJYTU9ERV9SRk1PTikKKwkJCQkJc2V0X2JpdCAoRkxBR19SRVNFVCwgJmFpLT5mbGFncyk7CisJCQlhaS0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWNsZWFyX2JpdCAoRkxBR184MDJfMTEsICZhaS0+ZmxhZ3MpOworCQkJYWktPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJYWktPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX0FDVElWRTsKKwkJCWlmICggbGluZVswXSA9PSAnYScgKSB7CisJCQkJYWktPmNvbmZpZy5vcG1vZGUgfD0gMDsKKwkJCX0gZWxzZSB7CisJCQkJYWktPmNvbmZpZy5vcG1vZGUgfD0gMTsKKwkJCQlpZiAoIGxpbmVbMF0gPT0gJ3InICkgeworCQkJCQlhaS0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9SRk1PTiB8IFJYTU9ERV9ESVNBQkxFXzgwMl8zX0hFQURFUjsKKwkJCQkJYWktPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX1BBU1NJVkU7CisJCQkJCXNldF9iaXQgKEZMQUdfODAyXzExLCAmYWktPmZsYWdzKTsKKwkJCQl9IGVsc2UgaWYgKCBsaW5lWzBdID09ICd5JyApIHsKKwkJCQkJYWktPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfUkZNT05fQU5ZQlNTIHwgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSOworCQkJCQlhaS0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfUEFTU0lWRTsKKwkJCQkJc2V0X2JpdCAoRkxBR184MDJfMTEsICZhaS0+ZmxhZ3MpOworCQkJCX0gZWxzZSBpZiAoIGxpbmVbMF0gPT0gJ2wnICkKKwkJCQkJYWktPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfTEFOTU9OOworCQkJfQorCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9CisKKy8qKiogUmFkaW8gc3RhdHVzICovCisJCWVsc2UgaWYgKCFzdHJuY21wKGxpbmUsIlJhZGlvOiAiLCA3KSkgeworCQkJbGluZSArPSA3OworCQkJaWYgKCFzdHJuY21wKGxpbmUsIm9mZiIsMykpIHsKKwkJCQlzZXRfYml0IChGTEFHX1JBRElPX09GRiwgJmFpLT5mbGFncyk7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2JpdCAoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpOworCQkJfQorCQl9CisvKioqIE5vZGVOYW1lIHByb2Nlc3NpbmcgKi8KKwkJZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiTm9kZU5hbWU6ICIsIDEwICkgKSB7CisJCQlpbnQgajsKKworCQkJbGluZSArPSAxMDsKKwkJCW1lbXNldCggYWktPmNvbmZpZy5ub2RlTmFtZSwgMCwgMTYgKTsKKy8qIERvIHRoZSBuYW1lLCBhc3N1bWUgYSBzcGFjZSBiZXR3ZWVuIHRoZSBtb2RlIGFuZCBub2RlIG5hbWUgKi8KKwkJCWZvciggaiA9IDA7IGogPCAxNiAmJiBsaW5lW2pdICE9ICdcbic7IGorKyApIHsKKwkJCQlhaS0+Y29uZmlnLm5vZGVOYW1lW2pdID0gbGluZVtqXTsKKwkJCX0KKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfQorCisvKioqIFBvd2VyTW9kZSBwcm9jZXNzaW5nICovCisJCWVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlBvd2VyTW9kZTogIiwgMTEgKSApIHsKKwkJCWxpbmUgKz0gMTE7CisJCQlpZiAoICFzdHJuY21wKCBsaW5lLCAiUFNQQ0FNIiwgNiApICkgeworCQkJCWFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9QU1BDQU07CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJQU1AiLCAzICkgKSB7CisJCQkJYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX1BTUDsKKwkJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQl9IGVsc2UgeworCQkJCWFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9DQU07CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIkRhdGFSYXRlczogIiwgMTEgKSApIHsKKwkJCWludCB2LCBpID0gMCwgayA9IDA7IC8qIGkgaXMgaW5kZXggaW50byBsaW5lLAorCQkJCQkJayBpcyBpbmRleCB0byByYXRlcyAqLworCisJCQlsaW5lICs9IDExOworCQkJd2hpbGUoKHYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgMykpIT0tMSkgeworCQkJCWFpLT5jb25maWcucmF0ZXNbaysrXSA9ICh1OCl2OworCQkJCWxpbmUgKz0gaSArIDE7CisJCQkJaSA9IDA7CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiQ2hhbm5lbDogIiwgOSApICkgeworCQkJaW50IHYsIGkgPSAwOworCQkJbGluZSArPSA5OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCBpKzMpOworCQkJaWYgKCB2ICE9IC0xICkgeworCQkJCWFpLT5jb25maWcuY2hhbm5lbFNldCA9ICh1MTYpdjsKKwkJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiWG1pdFBvd2VyOiAiLCAxMSApICkgeworCQkJaW50IHYsIGkgPSAwOworCQkJbGluZSArPSAxMTsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgaSszKTsKKwkJCWlmICggdiAhPSAtMSApIHsKKwkJCQlhaS0+Y29uZmlnLnR4UG93ZXIgPSAodTE2KXY7CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIldFUDogIiwgNSApICkgeworCQkJbGluZSArPSA1OworCQkJc3dpdGNoKCBsaW5lWzBdICkgeworCQkJY2FzZSAncyc6CisJCQkJYWktPmNvbmZpZy5hdXRoVHlwZSA9ICh1MTYpQVVUSF9TSEFSRURLRVk7CisJCQkJYnJlYWs7CisJCQljYXNlICdlJzoKKwkJCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gKHUxNilBVVRIX0VOQ1JZUFQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWFpLT5jb25maWcuYXV0aFR5cGUgPSAodTE2KUFVVEhfT1BFTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJMb25nUmV0cnlMaW1pdDogIiwgMTYgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNjsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgMyk7CisJCQl2ID0gKHY8MCkgPyAwIDogKCh2PjI1NSkgPyAyNTUgOiB2KTsKKwkJCWFpLT5jb25maWcubG9uZ1JldHJ5TGltaXQgPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiU2hvcnRSZXRyeUxpbWl0OiAiLCAxNyApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE3OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCAzKTsKKwkJCXYgPSAodjwwKSA/IDAgOiAoKHY+MjU1KSA/IDI1NSA6IHYpOworCQkJYWktPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQgPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUlRTVGhyZXNob2xkOiAiLCAxNCApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE0OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCA0KTsKKwkJCXYgPSAodjwwKSA/IDAgOiAoKHY+MjMxMikgPyAyMzEyIDogdik7CisJCQlhaS0+Y29uZmlnLnJ0c1RocmVzID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlRYTVNEVUxpZmV0aW1lOiAiLCAxNiApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE2OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCA1KTsKKwkJCXYgPSAodjwwKSA/IDAgOiB2OworCQkJYWktPmNvbmZpZy50eExpZmV0aW1lID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlJYTVNEVUxpZmV0aW1lOiAiLCAxNiApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE2OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCA1KTsKKwkJCXYgPSAodjwwKSA/IDAgOiB2OworCQkJYWktPmNvbmZpZy5yeExpZmV0aW1lID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlRYRGl2ZXJzaXR5OiAiLCAxMyApICkgeworCQkJYWktPmNvbmZpZy50eERpdmVyc2l0eSA9CisJCQkJKGxpbmVbMTNdPT0nbCcpID8gMSA6CisJCQkJKChsaW5lWzEzXT09J3InKT8gMjogMyk7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUlhEaXZlcnNpdHk6ICIsIDEzICkgKSB7CisJCQlhaS0+Y29uZmlnLnJ4RGl2ZXJzaXR5ID0KKwkJCQkobGluZVsxM109PSdsJykgPyAxIDoKKwkJCQkoKGxpbmVbMTNdPT0ncicpPyAyOiAzKTsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJGcmFnVGhyZXNob2xkOiAiLCAxNSApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE1OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCA0KTsKKwkJCXYgPSAodjwyNTYpID8gMjU2IDogKCh2PjIzMTIpID8gMjMxMiA6IHYpOworCQkJdiA9IHYgJiAweGZmZmU7IC8qIE1ha2Ugc3VyZSBpdHMgZXZlbiAqLworCQkJYWktPmNvbmZpZy5mcmFnVGhyZXNoID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJNb2R1bGF0aW9uOiAiLCAxMikpIHsKKwkJCWxpbmUgKz0gMTI7CisJCQlzd2l0Y2goKmxpbmUpIHsKKwkJCWNhc2UgJ2QnOiAgYWktPmNvbmZpZy5tb2R1bGF0aW9uPU1PRF9ERUZBVUxUOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCQljYXNlICdjJzogIGFpLT5jb25maWcubW9kdWxhdGlvbj1NT0RfQ0NLOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCQljYXNlICdtJzogIGFpLT5jb25maWcubW9kdWxhdGlvbj1NT0RfTU9LOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayggS0VSTl9XQVJOSU5HICJhaXJvOiBVbmtub3duIG1vZHVsYXRpb25cbiIgKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiUHJlYW1ibGU6ICIsIDEwKSkgeworCQkJbGluZSArPSAxMDsKKwkJCXN3aXRjaCgqbGluZSkgeworCQkJY2FzZSAnYSc6IGFpLT5jb25maWcucHJlYW1ibGU9UFJFQU1CTEVfQVVUTzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAnbCc6IGFpLT5jb25maWcucHJlYW1ibGU9UFJFQU1CTEVfTE9ORzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAncyc6IGFpLT5jb25maWcucHJlYW1ibGU9UFJFQU1CTEVfU0hPUlQ7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJICAgICAgICBkZWZhdWx0OiBwcmludGsoS0VSTl9XQVJOSU5HICJhaXJvOiBVbmtub3duIHByZWFtYmxlXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayggS0VSTl9XQVJOSU5HICJDb3VsZG4ndCBmaWd1cmUgb3V0ICVzXG4iLCBsaW5lICk7CisJCX0KKwkJd2hpbGUoIGxpbmVbMF0gJiYgbGluZVswXSAhPSAnXG4nICkgbGluZSsrOworCQlpZiAoIGxpbmVbMF0gKSBsaW5lKys7CisJfQorCWFpcm9fY29uZmlnX2NvbW1pdChkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgY2hhciAqZ2V0X3Jtb2RlKHUxNiBtb2RlKSB7CisgICAgICAgIHN3aXRjaChtb2RlJjB4ZmYpIHsKKyAgICAgICAgY2FzZSBSWE1PREVfUkZNT046ICByZXR1cm4gInJmbW9uIjsKKyAgICAgICAgY2FzZSBSWE1PREVfUkZNT05fQU5ZQlNTOiAgcmV0dXJuICJ5bmEgKGFueSkgYnNzIHJmbW9uIjsKKyAgICAgICAgY2FzZSBSWE1PREVfTEFOTU9OOiAgcmV0dXJuICJsYW5tb24iOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiRVNTIjsKK30KKworc3RhdGljIGludCBwcm9jX2NvbmZpZ19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMjA0OCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggMjA0OCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChkYXRhLT5yYnVmZmVyKTsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGRhdGEtPndidWZmZXIsIDAsIDIwNDggKTsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDIwNDg7CisJZGF0YS0+b25fY2xvc2UgPSBwcm9jX2NvbmZpZ19vbl9jbG9zZTsKKworCXJlYWRDb25maWdSaWQoYWksIDEpOworCisJaSA9IHNwcmludGYoIGRhdGEtPnJidWZmZXIsCisJCSAgICAgIk1vZGU6ICVzXG4iCisJCSAgICAgIlJhZGlvOiAlc1xuIgorCQkgICAgICJOb2RlTmFtZTogJS0xNnNcbiIKKwkJICAgICAiUG93ZXJNb2RlOiAlc1xuIgorCQkgICAgICJEYXRhUmF0ZXM6ICVkICVkICVkICVkICVkICVkICVkICVkXG4iCisJCSAgICAgIkNoYW5uZWw6ICVkXG4iCisJCSAgICAgIlhtaXRQb3dlcjogJWRcbiIsCisJCSAgICAgKGFpLT5jb25maWcub3Btb2RlICYgMHhGRikgPT0gMCA/ICJhZGhvYyIgOgorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDEgPyBnZXRfcm1vZGUoYWktPmNvbmZpZy5ybW9kZSk6CisJCSAgICAgKGFpLT5jb25maWcub3Btb2RlICYgMHhGRikgPT0gMiA/ICJBUCIgOgorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDMgPyAiQVAgUlBUUiIgOiAiRXJyb3IiLAorCQkgICAgIHRlc3RfYml0KEZMQUdfUkFESU9fT0ZGLCAmYWktPmZsYWdzKSA/ICJvZmYiIDogIm9uIiwKKwkJICAgICBhaS0+Y29uZmlnLm5vZGVOYW1lLAorCQkgICAgIGFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9PSAwID8gIkNBTSIgOgorCQkgICAgIGFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9PSAxID8gIlBTUCIgOgorCQkgICAgIGFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9PSAyID8gIlBTUENBTSIgOiAiRXJyb3IiLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1swXSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbMV0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzJdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1szXSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbNF0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzVdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1s2XSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbN10sCisJCSAgICAgKGludClhaS0+Y29uZmlnLmNoYW5uZWxTZXQsCisJCSAgICAgKGludClhaS0+Y29uZmlnLnR4UG93ZXIKKwkJKTsKKwlzcHJpbnRmKCBkYXRhLT5yYnVmZmVyICsgaSwKKwkJICJMb25nUmV0cnlMaW1pdDogJWRcbiIKKwkJICJTaG9ydFJldHJ5TGltaXQ6ICVkXG4iCisJCSAiUlRTVGhyZXNob2xkOiAlZFxuIgorCQkgIlRYTVNEVUxpZmV0aW1lOiAlZFxuIgorCQkgIlJYTVNEVUxpZmV0aW1lOiAlZFxuIgorCQkgIlRYRGl2ZXJzaXR5OiAlc1xuIgorCQkgIlJYRGl2ZXJzaXR5OiAlc1xuIgorCQkgIkZyYWdUaHJlc2hvbGQ6ICVkXG4iCisJCSAiV0VQOiAlc1xuIgorCQkgIk1vZHVsYXRpb246ICVzXG4iCisJCSAiUHJlYW1ibGU6ICVzXG4iLAorCQkgKGludClhaS0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0LAorCQkgKGludClhaS0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCwKKwkJIChpbnQpYWktPmNvbmZpZy5ydHNUaHJlcywKKwkJIChpbnQpYWktPmNvbmZpZy50eExpZmV0aW1lLAorCQkgKGludClhaS0+Y29uZmlnLnJ4TGlmZXRpbWUsCisJCSBhaS0+Y29uZmlnLnR4RGl2ZXJzaXR5ID09IDEgPyAibGVmdCIgOgorCQkgYWktPmNvbmZpZy50eERpdmVyc2l0eSA9PSAyID8gInJpZ2h0IiA6ICJib3RoIiwKKwkJIGFpLT5jb25maWcucnhEaXZlcnNpdHkgPT0gMSA/ICJsZWZ0IiA6CisJCSBhaS0+Y29uZmlnLnJ4RGl2ZXJzaXR5ID09IDIgPyAicmlnaHQiIDogImJvdGgiLAorCQkgKGludClhaS0+Y29uZmlnLmZyYWdUaHJlc2gsCisJCSBhaS0+Y29uZmlnLmF1dGhUeXBlID09IEFVVEhfRU5DUllQVCA/ICJlbmNyeXB0IiA6CisJCSBhaS0+Y29uZmlnLmF1dGhUeXBlID09IEFVVEhfU0hBUkVES0VZID8gInNoYXJlZCIgOiAib3BlbiIsCisJCSBhaS0+Y29uZmlnLm1vZHVsYXRpb24gPT0gMCA/ICJkZWZhdWx0IiA6CisJCSBhaS0+Y29uZmlnLm1vZHVsYXRpb24gPT0gTU9EX0NDSyA/ICJjY2siIDoKKwkJIGFpLT5jb25maWcubW9kdWxhdGlvbiA9PSBNT0RfTU9LID8gIm1vayIgOiAiZXJyb3IiLAorCQkgYWktPmNvbmZpZy5wcmVhbWJsZSA9PSBQUkVBTUJMRV9BVVRPID8gImF1dG8iIDoKKwkJIGFpLT5jb25maWcucHJlYW1ibGUgPT0gUFJFQU1CTEVfTE9ORyA/ICJsb25nIiA6CisJCSBhaS0+Y29uZmlnLnByZWFtYmxlID09IFBSRUFNQkxFX1NIT1JUID8gInNob3J0IiA6ICJlcnJvciIKKwkJKTsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfU1NJRF9vbl9jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlTc2lkUmlkIFNTSURfcmlkOworCVJlc3AgcnNwOworCWludCBpOworCWludCBvZmZzZXQgPSAwOworCisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwltZW1zZXQoICZTU0lEX3JpZCwgMCwgc2l6ZW9mKCBTU0lEX3JpZCApICk7CisKKwlmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkgeworCQlpbnQgajsKKwkJZm9yKCBqID0gMDsgaitvZmZzZXQgPCBkYXRhLT53cml0ZWxlbiAmJiBqIDwgMzIgJiYKKwkJCSAgICAgZGF0YS0+d2J1ZmZlcltvZmZzZXQral0gIT0gJ1xuJzsgaisrICkgeworCQkJU1NJRF9yaWQuc3NpZHNbaV0uc3NpZFtqXSA9IGRhdGEtPndidWZmZXJbb2Zmc2V0K2pdOworCQl9CisJCWlmICggaiA9PSAwICkgYnJlYWs7CisJCVNTSURfcmlkLnNzaWRzW2ldLmxlbiA9IGo7CisJCW9mZnNldCArPSBqOworCQl3aGlsZSggZGF0YS0+d2J1ZmZlcltvZmZzZXRdICE9ICdcbicgJiYKKwkJICAgICAgIG9mZnNldCA8IGRhdGEtPndyaXRlbGVuICkgb2Zmc2V0Kys7CisJCW9mZnNldCsrOworCX0KKwlpZiAoaSkKKwkJU1NJRF9yaWQubGVuID0gc2l6ZW9mKFNTSURfcmlkKTsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJd3JpdGVTc2lkUmlkKGFpLCAmU1NJRF9yaWQsIDEpOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworfQorCitpbmxpbmUgc3RhdGljIHU4IGhleFZhbChjaGFyIGMpIHsKKwlpZiAoYz49JzAnICYmIGM8PSc5JykgcmV0dXJuIGMgLT0gJzAnOworCWlmIChjPj0nYScgJiYgYzw9J2YnKSByZXR1cm4gYyAtPSAnYSctMTA7CisJaWYgKGM+PSdBJyAmJiBjPD0nRicpIHJldHVybiBjIC09ICdBJy0xMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY19BUExpc3Rfb25fY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7CisJUmVzcCByc3A7CisJaW50IGk7CisKKwlpZiAoICFkYXRhLT53cml0ZWxlbiApIHJldHVybjsKKworCW1lbXNldCggJkFQTGlzdF9yaWQsIDAsIHNpemVvZihBUExpc3RfcmlkKSApOworCUFQTGlzdF9yaWQubGVuID0gc2l6ZW9mKEFQTGlzdF9yaWQpOworCisJZm9yKCBpID0gMDsgaSA8IDQgJiYgZGF0YS0+d3JpdGVsZW4gPj0gKGkrMSkqNiozOyBpKysgKSB7CisJCWludCBqOworCQlmb3IoIGogPSAwOyBqIDwgNiozICYmIGRhdGEtPndidWZmZXJbaitpKjYqM107IGorKyApIHsKKwkJCXN3aXRjaChqJTMpIHsKKwkJCWNhc2UgMDoKKwkJCQlBUExpc3RfcmlkLmFwW2ldW2ovM109CisJCQkJCWhleFZhbChkYXRhLT53YnVmZmVyW2oraSo2KjNdKTw8NDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlBUExpc3RfcmlkLmFwW2ldW2ovM118PQorCQkJCQloZXhWYWwoZGF0YS0+d2J1ZmZlcltqK2kqNiozXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZGlzYWJsZV9NQUMoYWksIDEpOworCXdyaXRlQVBMaXN0UmlkKGFpLCAmQVBMaXN0X3JpZCwgMSk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd3JhcHMgUEM0NTAwX3dyaXRlcmlkIHdpdGggYSBNQUMgZGlzYWJsZSAqLworc3RhdGljIGludCBkb193cml0ZXJpZCggc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsIGNvbnN0IHZvaWQgKnJpZF9kYXRhLAorCQkJaW50IGxlbiwgaW50IGR1bW15ICkgeworCWludCByYzsKKwlSZXNwIHJzcDsKKworCWRpc2FibGVfTUFDKGFpLCAxKTsKKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgcmlkLCByaWRfZGF0YSwgbGVuLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGF0IHRoZSBpbmRleC4gIElmIGluZGV4ID09IDB4ZmZmZgorICogdGhlIGluZGV4IG9mIHRoZSB0cmFuc21pdCBrZXkgaXMgcmV0dXJuZWQuICBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QsCisgKiAtMSB3aWxsIGJlIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IGdldF93ZXBfa2V5KHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgaW5kZXgpIHsKKwlXZXBLZXlSaWQgd2tyOworCWludCByYzsKKwl1MTYgbGFzdGluZGV4OworCisJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCAxKTsKKwlpZiAocmMgPT0gU1VDQ0VTUykgZG8geworCQlsYXN0aW5kZXggPSB3a3Iua2luZGV4OworCQlpZiAod2tyLmtpbmRleCA9PSBpbmRleCkgeworCQkJaWYgKGluZGV4ID09IDB4ZmZmZikgeworCQkJCXJldHVybiB3a3IubWFjWzBdOworCQkJfQorCQkJcmV0dXJuIHdrci5rbGVuOworCQl9CisJCXJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDAsIDEpOworCX0gd2hpbGUobGFzdGluZGV4ICE9IHdrci5raW5kZXgpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZXRfd2VwX2tleShzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IGluZGV4LAorCQkgICAgICAgY29uc3QgY2hhciAqa2V5LCB1MTYga2V5bGVuLCBpbnQgcGVybSwgaW50IGxvY2sgKSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFjYWRkcltFVEhfQUxFTl0gPSB7IDB4MDEsIDAsIDAsIDAsIDAsIDAgfTsKKwlXZXBLZXlSaWQgd2tyOworCVJlc3AgcnNwOworCisJbWVtc2V0KCZ3a3IsIDAsIHNpemVvZih3a3IpKTsKKwlpZiAoa2V5bGVuID09IDApIHsKKy8vIFdlIGFyZSBzZWxlY3Rpbmcgd2hpY2gga2V5IHRvIHVzZQorCQl3a3IubGVuID0gc2l6ZW9mKHdrcik7CisJCXdrci5raW5kZXggPSAweGZmZmY7CisJCXdrci5tYWNbMF0gPSAoY2hhcilpbmRleDsKKwkJaWYgKHBlcm0pIHByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgdHJhbnNtaXQga2V5IHRvICVkXG4iLCBpbmRleCk7CisJCWlmIChwZXJtKSBhaS0+ZGVmaW5kZXggPSAoY2hhcilpbmRleDsKKwl9IGVsc2UgeworLy8gV2UgYXJlIGFjdHVhbGx5IHNldHRpbmcgdGhlIGtleQorCQl3a3IubGVuID0gc2l6ZW9mKHdrcik7CisJCXdrci5raW5kZXggPSBpbmRleDsKKwkJd2tyLmtsZW4gPSBrZXlsZW47CisJCW1lbWNweSggd2tyLmtleSwga2V5LCBrZXlsZW4gKTsKKwkJbWVtY3B5KCB3a3IubWFjLCBtYWNhZGRyLCBFVEhfQUxFTiApOworCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIGtleSAlZFxuIiwgaW5kZXgpOworCX0KKworCWRpc2FibGVfTUFDKGFpLCBsb2NrKTsKKwl3cml0ZVdlcEtleVJpZChhaSwgJndrciwgcGVybSwgbG9jayk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nfd2Vwa2V5X29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyIGtleVsxNl07CisJdTE2IGluZGV4ID0gMDsKKwlpbnQgaiA9IDA7CisKKwltZW1zZXQoa2V5LCAwLCBzaXplb2Yoa2V5KSk7CisKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwlpZiAoZGF0YS0+d2J1ZmZlclswXSA+PSAnMCcgJiYgZGF0YS0+d2J1ZmZlclswXSA8PSAnMycgJiYKKwkgICAgKGRhdGEtPndidWZmZXJbMV0gPT0gJyAnIHx8IGRhdGEtPndidWZmZXJbMV0gPT0gJ1xuJykpIHsKKwkJaW5kZXggPSBkYXRhLT53YnVmZmVyWzBdIC0gJzAnOworCQlpZiAoZGF0YS0+d2J1ZmZlclsxXSA9PSAnXG4nKSB7CisJCQlzZXRfd2VwX2tleShhaSwgaW5kZXgsIE5VTEwsIDAsIDEsIDEpOworCQkJcmV0dXJuOworCQl9CisJCWogPSAyOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIFdlcEtleSBwYXNzZWQgaW52YWxpZCBrZXkgaW5kZXhcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yKCBpID0gMDsgaSA8IDE2KjMgJiYgZGF0YS0+d2J1ZmZlcltpK2pdOyBpKysgKSB7CisJCXN3aXRjaChpJTMpIHsKKwkJY2FzZSAwOgorCQkJa2V5W2kvM10gPSBoZXhWYWwoZGF0YS0+d2J1ZmZlcltpK2pdKTw8NDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlrZXlbaS8zXSB8PSBoZXhWYWwoZGF0YS0+d2J1ZmZlcltpK2pdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF93ZXBfa2V5KGFpLCBpbmRleCwga2V5LCBpLzMsIDEsIDEpOworfQorCitzdGF0aWMgaW50IHByb2Nfd2Vwa2V5X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWNoYXIgKnB0cjsKKwlXZXBLZXlSaWQgd2tyOworCXUxNiBsYXN0aW5kZXg7CisJaW50IGo9MDsKKwlpbnQgcmM7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJbWVtc2V0KCZ3a3IsIDAsIHNpemVvZih3a3IpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMTgwLCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZGF0YS0+cmJ1ZmZlciwgMCwgMTgwKTsKKwlkYXRhLT53cml0ZWxlbiA9IDA7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSA4MDsKKwlpZiAoKGRhdGEtPndidWZmZXIgPSBrbWFsbG9jKCA4MCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChkYXRhLT5yYnVmZmVyKTsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGRhdGEtPndidWZmZXIsIDAsIDgwICk7CisJZGF0YS0+b25fY2xvc2UgPSBwcm9jX3dlcGtleV9vbl9jbG9zZTsKKworCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJc3RyY3B5KHB0ciwgIk5vIHdlcCBrZXlzXG4iKTsKKwlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDEsIDEpOworCWlmIChyYyA9PSBTVUNDRVNTKSBkbyB7CisJCWxhc3RpbmRleCA9IHdrci5raW5kZXg7CisJCWlmICh3a3Iua2luZGV4ID09IDB4ZmZmZikgeworCQkJaiArPSBzcHJpbnRmKHB0citqLCAiVHgga2V5ID0gJWRcbiIsCisJCQkJICAgICAoaW50KXdrci5tYWNbMF0pOworCQl9IGVsc2UgeworCQkJaiArPSBzcHJpbnRmKHB0citqLCAiS2V5ICVkIHNldCB3aXRoIGxlbmd0aCA9ICVkXG4iLAorCQkJCSAgICAgKGludCl3a3Iua2luZGV4LCAoaW50KXdrci5rbGVuKTsKKwkJfQorCQlyZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCAxKTsKKwl9IHdoaWxlKChsYXN0aW5kZXggIT0gd2tyLmtpbmRleCkgJiYgKGogPCAxODAtMzApKTsKKworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX1NTSURfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisJY2hhciAqcHRyOworCVNzaWRSaWQgU1NJRF9yaWQ7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gMzMqMzsKKwlpZiAoKGRhdGEtPndidWZmZXIgPSBrbWFsbG9jKCAzMyozLCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGRhdGEtPnJidWZmZXIpOworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZGF0YS0+d2J1ZmZlciwgMCwgMzMqMyApOworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY19TU0lEX29uX2Nsb3NlOworCisJcmVhZFNzaWRSaWQoYWksICZTU0lEX3JpZCk7CisJcHRyID0gZGF0YS0+cmJ1ZmZlcjsKKwlmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkgeworCQlpbnQgajsKKwkJaWYgKCAhU1NJRF9yaWQuc3NpZHNbaV0ubGVuICkgYnJlYWs7CisJCWZvciggaiA9IDA7IGogPCAzMiAmJgorCQkJICAgICBqIDwgU1NJRF9yaWQuc3NpZHNbaV0ubGVuICYmCisJCQkgICAgIFNTSURfcmlkLnNzaWRzW2ldLnNzaWRbal07IGorKyApIHsKKwkJCSpwdHIrKyA9IFNTSURfcmlkLnNzaWRzW2ldLnNzaWRbal07CisJCX0KKwkJKnB0cisrID0gJ1xuJzsKKwl9CisJKnB0ciA9ICdcMCc7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfQVBMaXN0X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBpOworCWNoYXIgKnB0cjsKKwlBUExpc3RSaWQgQVBMaXN0X3JpZDsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMTA0LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYXRhLT53cml0ZWxlbiA9IDA7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSA0KjYqMzsKKwlpZiAoKGRhdGEtPndidWZmZXIgPSBrbWFsbG9jKCBkYXRhLT5tYXh3cml0ZWxlbiwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChkYXRhLT5yYnVmZmVyKTsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGRhdGEtPndidWZmZXIsIDAsIGRhdGEtPm1heHdyaXRlbGVuICk7CisJZGF0YS0+b25fY2xvc2UgPSBwcm9jX0FQTGlzdF9vbl9jbG9zZTsKKworCXJlYWRBUExpc3RSaWQoYWksICZBUExpc3RfcmlkKTsKKwlwdHIgPSBkYXRhLT5yYnVmZmVyOworCWZvciggaSA9IDA7IGkgPCA0OyBpKysgKSB7CisvLyBXZSBlbmQgd2hlbiB3ZSBmaW5kIGEgemVybyBNQUMKKwkJaWYgKCAhKihpbnQqKUFQTGlzdF9yaWQuYXBbaV0gJiYKKwkJICAgICAhKihpbnQqKSZBUExpc3RfcmlkLmFwW2ldWzJdKSBicmVhazsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzBdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVsxXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bMl0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzNdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVs0XSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bNV0pOworCX0KKwlpZiAoaT09MCkgcHRyICs9IHNwcmludGYocHRyLCAiTm90IHVzaW5nIHNwZWNpZmljIEFQc1xuIik7CisKKwkqcHRyID0gJ1wwJzsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19CU1NMaXN0X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWNoYXIgKnB0cjsKKwlCU1NMaXN0UmlkIEJTU0xpc3RfcmlkOworCWludCByYzsKKwkvKiBJZiBkb0xvc2VTeW5jIGlzIG5vdCAxLCB3ZSB3b24ndCBkbyBhIExvc2UgU3luYyAqLworCWludCBkb0xvc2VTeW5jID0gLTE7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwMjQsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRhdGEtPndyaXRlbGVuID0gMDsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDA7CisJZGF0YS0+d2J1ZmZlciA9IE5VTEw7CisJZGF0YS0+b25fY2xvc2UgPSBOVUxMOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlDbWQgY21kOworCQkJUmVzcCByc3A7CisKKwkJCWlmIChhaS0+ZmxhZ3MgJiBGTEFHX1JBRElPX01BU0spIHJldHVybiAtRU5FVERPV047CisJCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQkJY21kLmNtZD1DTURfTElTVEJTUzsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCQkJdXAoJmFpLT5zZW0pOworCQkJZGF0YS0+cmVhZGxlbiA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkb0xvc2VTeW5jID0gMTsKKwl9CisJcHRyID0gZGF0YS0+cmJ1ZmZlcjsKKwkvKiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgdGhlcmUgYXJlIGNvbmN1cnJlbnQgb3BlbnMuCisgICAgICAgICAgIFNpbmNlIGl0IGlzIGEgcmFyZSBjb25kaXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGl0LCBvdGhlcndpc2UKKyAgICAgICAgICAgd2UgaGF2ZSB0byBhZGQgYSBzcGluIGxvY2suLi4gKi8KKwlyYyA9IHJlYWRCU1NMaXN0UmlkKGFpLCBkb0xvc2VTeW5jLCAmQlNTTGlzdF9yaWQpOworCXdoaWxlKHJjID09IDAgJiYgQlNTTGlzdF9yaWQuaW5kZXggIT0gMHhmZmZmKSB7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICUqcyByc3NpID0gJWQiLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbMF0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFsxXSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzJdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbM10sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFs0XSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzVdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuc3NpZExlbiwKKwkJCQlCU1NMaXN0X3JpZC5zc2lkLAorCQkJCShpbnQpQlNTTGlzdF9yaWQucnNzaSk7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiBjaGFubmVsID0gJWQgJXMgJXMgJXMgJXNcbiIsCisJCQkJKGludClCU1NMaXN0X3JpZC5kc0NoYW5uZWwsCisJCQkJQlNTTGlzdF9yaWQuY2FwICYgQ0FQX0VTUyA/ICJFU1MiIDogIiIsCisJCQkJQlNTTGlzdF9yaWQuY2FwICYgQ0FQX0lCU1MgPyAiYWRob2MiIDogIiIsCisJCQkJQlNTTGlzdF9yaWQuY2FwICYgQ0FQX1BSSVZBQ1kgPyAid2VwIiA6ICIiLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9TSE9SVEhEUiA/ICJzaG9ydGhkciIgOiAiIik7CisJCXJjID0gcmVhZEJTU0xpc3RSaWQoYWksIDAsICZCU1NMaXN0X3JpZCk7CisJfQorCSpwdHIgPSAnXDAnOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApCit7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICggZGF0YS0+b25fY2xvc2UgIT0gTlVMTCApIGRhdGEtPm9uX2Nsb3NlKCBpbm9kZSwgZmlsZSApOworCWlmICggZGF0YS0+cmJ1ZmZlciApIGtmcmVlKCBkYXRhLT5yYnVmZmVyICk7CisJaWYgKCBkYXRhLT53YnVmZmVyICkga2ZyZWUoIGRhdGEtPndidWZmZXIgKTsKKwlrZnJlZSggZGF0YSApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2VfbGlzdCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICpuZXh0OworfSAqYWlyb19kZXZpY2VzOworCisvKiBTaW5jZSB0aGUgY2FyZCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRvIHRoZSByaWdodCBXRVAgbW9kZSwKKyAgIHdlIHdpbGwgbWFrZSBpdCBkbyBpdC4gIElmIHRoZSBjYXJkIGlzbid0IGFzc29jaWF0ZWQsIGV2ZXJ5IHNlY3Mgd2UKKyAgIHdpbGwgc3dpdGNoIFdFUCBtb2RlcyB0byBzZWUgaWYgdGhhdCB3aWxsIGhlbHAuICBJZiB0aGUgY2FyZCBpcworICAgYXNzb2NpYXRlZCB3ZSB3aWxsIGNoZWNrIGV2ZXJ5IG1pbnV0ZSB0byBzZWUgaWYgYW55dGhpbmcgaGFzCisgICBjaGFuZ2VkLiAqLworc3RhdGljIHZvaWQgdGltZXJfZnVuYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworLyogV2UgZG9uJ3QgaGF2ZSBhIGxpbmsgc28gdHJ5IGNoYW5naW5nIHRoZSBhdXRodHlwZSAqLworCXJlYWRDb25maWdSaWQoYXByaXYsIDApOworCWRpc2FibGVfTUFDKGFwcml2LCAwKTsKKwlzd2l0Y2goYXByaXYtPmNvbmZpZy5hdXRoVHlwZSkgeworCQljYXNlIEFVVEhfRU5DUllQVDoKKy8qIFNvIGRyb3AgdG8gT1BFTiAqLworCQkJYXByaXYtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfT1BFTjsKKwkJCWJyZWFrOworCQljYXNlIEFVVEhfU0hBUkVES0VZOgorCQkJaWYgKGFwcml2LT5rZXlpbmRleCA8IGF1dG9fd2VwKSB7CisJCQkJc2V0X3dlcF9rZXkoYXByaXYsIGFwcml2LT5rZXlpbmRleCwgTlVMTCwgMCwgMCwgMCk7CisJCQkJYXByaXYtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfU0hBUkVES0VZOworCQkJCWFwcml2LT5rZXlpbmRleCsrOworCQkJfSBlbHNlIHsKKwkJCSAgICAgICAgLyogRHJvcCB0byBFTkNSWVBUICovCisJCQkJYXByaXYtPmtleWluZGV4ID0gMDsKKwkJCQlzZXRfd2VwX2tleShhcHJpdiwgYXByaXYtPmRlZmluZGV4LCBOVUxMLCAwLCAwLCAwKTsKKwkJCQlhcHJpdi0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9FTkNSWVBUOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6ICAvKiBXZSdsbCBlc2NhbGF0ZSB0byBTSEFSRURLRVkgKi8KKwkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX1NIQVJFREtFWTsKKwl9CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhcHJpdi0+ZmxhZ3MpOworCXdyaXRlQ29uZmlnUmlkKGFwcml2LCAwKTsKKwllbmFibGVfTUFDKGFwcml2LCAmcnNwLCAwKTsKKwl1cCgmYXByaXYtPnNlbSk7CisKKy8qIFNjaGVkdWxlIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbmdlIHdvcmtlZCAqLworCWNsZWFyX2JpdChKT0JfQVVUT1dFUCwgJmFwcml2LT5mbGFncyk7CisJYXByaXYtPmV4cGlyZXMgPSBSVU5fQVQoSFoqMyk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgeworCXN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgKm5vZGUgPSBrbWFsbG9jKCBzaXplb2YoICpub2RlICksIEdGUF9LRVJORUwgKTsKKwlpZiAoICFub2RlICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub2RlLT5kZXYgPSBkZXY7CisJbm9kZS0+bmV4dCA9IGFpcm9fZGV2aWNlczsKKwlhaXJvX2RldmljZXMgPSBub2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICoqcCA9ICZhaXJvX2RldmljZXM7CisJd2hpbGUoICpwICYmICggKCpwKS0+ZGV2ICE9IGRldiApICkKKwkJcCA9ICYoKnApLT5uZXh0OworCWlmICggKnAgJiYgKCpwKS0+ZGV2ID09IGRldiApCisJCSpwID0gKCpwKS0+bmV4dDsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFpcm9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwZGV2LT5kZXZpY2UgPT0gMHg1MDAwIHx8IHBkZXYtPmRldmljZSA9PSAweGE1MDQpCisJCQlkZXYgPSBfaW5pdF9haXJvX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMCwgcGRldiwgJnBkZXYtPmRldik7CisJZWxzZQorCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMl0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWlyb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworfQorCitzdGF0aWMgaW50IGFpcm9fcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisKKwlpZiAoKGFpLT5BUExpc3QgPT0gTlVMTCkgJiYKKwkJKGFpLT5BUExpc3QgPSBrbWFsbG9jKHNpemVvZihBUExpc3RSaWQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChhaS0+U1NJRCA9PSBOVUxMKSAmJgorCQkoYWktPlNTSUQgPSBrbWFsbG9jKHNpemVvZihTc2lkUmlkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJlYWRBUExpc3RSaWQoYWksIGFpLT5BUExpc3QpOworCXJlYWRTc2lkUmlkKGFpLCBhaS0+U1NJRCk7CisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkvKiB0aGUgbG9jayB3aWxsIGJlIHJlbGVhc2VkIGF0IHRoZSBlbmQgb2YgdGhlIHJlc3VtZSBjYWxsYmFjayAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkaXNhYmxlX01BQyhhaSwgMCk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWFpLT5wb3dlciA9IHN0YXRlOworCWNtZC5jbWQ9SE9TVFNMRUVQOworCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgc3RhdGUsIDEpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBhaXJvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIGFpLT5wb3dlciwgMCk7CisKKwlpZiAoYWktPnBvd2VyID4gMSkgeworCQlyZXNldF9jYXJkKGRldiwgMCk7CisJCW1waV9pbml0X2Rlc2NyaXB0b3JzKGFpKTsKKwkJc2V0dXBfY2FyZChhaSwgZGV2LT5kZXZfYWRkciwgMCk7CisJCWNsZWFyX2JpdChGTEFHX1JBRElPX09GRiwgJmFpLT5mbGFncyk7CisJCWNsZWFyX2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFpLT5mbGFncyk7CisJfSBlbHNlIHsKKwkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0FXQUtFTik7CisJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9BV0FLRU4pOworCQltc2xlZXAoMTAwKTsKKwl9CisKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJZGlzYWJsZV9NQUMoYWksIDApOworICAgICAgICBtc2xlZXAoMjAwKTsKKwlpZiAoYWktPlNTSUQpIHsKKwkJd3JpdGVTc2lkUmlkKGFpLCBhaS0+U1NJRCwgMCk7CisJCWtmcmVlKGFpLT5TU0lEKTsKKwkJYWktPlNTSUQgPSBOVUxMOworCX0KKwlpZiAoYWktPkFQTGlzdCkgeworCQl3cml0ZUFQTGlzdFJpZChhaSwgYWktPkFQTGlzdCwgMCk7CisJCWtmcmVlKGFpLT5BUExpc3QpOworCQlhaS0+QVBMaXN0ID0gTlVMTDsKKwl9CisJd3JpdGVDb25maWdSaWQoYWksIDApOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDApOworCWFpLT5wb3dlciA9IDA7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwllbmFibGVfaW50ZXJydXB0cyhhaSk7CisJdXAoJmFpLT5zZW0pOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFpcm9faW5pdF9tb2R1bGUoIHZvaWQgKQoreworCWludCBpLCBoYXZlX2lzYV9kZXYgPSAwOworCisJYWlyb19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhaXJvbmV0IiwKKwkJCQkgICAgICAgU19JRkRJUiB8IGFpcm9fcGVybSwKKwkJCQkgICAgICAgcHJvY19yb290X2RyaXZlcik7CisgICAgICAgIGFpcm9fZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBhaXJvX2VudHJ5LT5naWQgPSBwcm9jX2dpZDsKKworCWZvciggaSA9IDA7IGkgPCA0ICYmIGlvW2ldICYmIGlycVtpXTsgaSsrICkgeworCQlwcmludGsoIEtFUk5fSU5GTworCQkJImFpcm86ICBUcnlpbmcgdG8gY29uZmlndXJlIElTQSBhZGFwdGVyIGF0IGlycT0lZCBpbz0weCV4XG4iLAorCQkJaXJxW2ldLCBpb1tpXSApOworCQlpZiAoaW5pdF9haXJvX2NhcmQoIGlycVtpXSwgaW9baV0sIDAsIE5VTEwgKSkKKwkJCWhhdmVfaXNhX2RldiA9IDE7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiAgUHJvYmluZyBmb3IgUENJIGFkYXB0ZXJzXG4iICk7CisJcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiAgRmluaXNoZWQgcHJvYmluZyBmb3IgUENJIGFkYXB0ZXJzXG4iICk7CisjZW5kaWYKKworCS8qIEFsd2F5cyBleGl0IHdpdGggc3VjY2VzcywgYXMgd2UgYXJlIGEgbGlicmFyeSBtb2R1bGUKKwkgKiBhcyB3ZWxsIGFzIGEgZHJpdmVyIG1vZHVsZQorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWlyb19jbGVhbnVwX21vZHVsZSggdm9pZCApCit7CisJd2hpbGUoIGFpcm9fZGV2aWNlcyApIHsKKwkJcHJpbnRrKCBLRVJOX0lORk8gImFpcm86IFVucmVnaXN0ZXJpbmcgJXNcbiIsIGFpcm9fZGV2aWNlcy0+ZGV2LT5uYW1lICk7CisJCXN0b3BfYWlyb19jYXJkKCBhaXJvX2RldmljZXMtPmRldiwgMSApOworCX0KKyNpZmRlZiBDT05GSUdfUENJCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhaXJvX2RyaXZlcik7CisjZW5kaWYKKwlyZW1vdmVfcHJvY19lbnRyeSgiYWlyb25ldCIsIHByb2Nfcm9vdF9kcml2ZXIpOworfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvKgorICogSW5pdGlhbCBXaXJlbGVzcyBFeHRlbnNpb24gY29kZSBmb3IgQWlyb25ldCBkcml2ZXIgYnkgOgorICoJSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiAtIEhQTCAtIDE3IE5vdmVtYmVyIDAwCisgKiBDb252ZXJzaW9uIHRvIG5ldyBkcml2ZXIgQVBJIGJ5IDoKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gLSBIUEwgLSAyNiBNYXJjaCAwMgorICogSmF2aWVyIGFsc28gZGlkIGEgZ29vZCBhbW91bnQgb2Ygd29yayBoZXJlLCBhZGRpbmcgc29tZSBuZXcgZXh0ZW5zaW9ucworICogYW5kIGZpeGluZyBteSBjb2RlLiBMZXQncyBqdXN0IHNheSB0aGF0IHdpdGhvdXQgaGltIHRoaXMgY29kZSBqdXN0CisgKiB3b3VsZCBub3Qgd29yayBhdCBhbGwuLi4gLSBKZWFuIElJCisgKi8KKworc3RhdGljIGludCBhaXJvX2dldF9xdWFsaXR5IChTdGF0dXNSaWQgKnN0YXR1c19yaWQsIENhcGFiaWxpdHlSaWQgKmNhcF9yaWQpCit7CisJaW50IHF1YWxpdHkgPSAwOworCisJaWYgKChzdGF0dXNfcmlkLT5tb2RlICYgMHgzZikgPT0gMHgzZiAmJiAoY2FwX3JpZC0+aGFyZENhcCAmIDgpKSB7CisJCWlmIChtZW1jbXAoY2FwX3JpZC0+cHJvZE5hbWUsICIzNTAiLCAzKSkKKwkJCWlmIChzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5ID4gMHgyMCkKKwkJCQlxdWFsaXR5ID0gMDsKKwkJCWVsc2UKKwkJCQlxdWFsaXR5ID0gMHgyMCAtIHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHk7CisJCWVsc2UKKwkJCWlmIChzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5ID4gMHhiMCkKKwkJCQlxdWFsaXR5ID0gMDsKKwkJCWVsc2UgaWYgKHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHkgPCAweDEwKQorCQkJCXF1YWxpdHkgPSAweGEwOworCQkJZWxzZQorCQkJCXF1YWxpdHkgPSAweGIwIC0gc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eTsKKwl9CisJcmV0dXJuIHF1YWxpdHk7Cit9CisKKyNkZWZpbmUgYWlyb19nZXRfbWF4X3F1YWxpdHkoY2FwX3JpZCkgKG1lbWNtcCgoY2FwX3JpZCktPnByb2ROYW1lLCAiMzUwIiwgMykgPyAweDIwIDogMHhhMCkKKyNkZWZpbmUgYWlyb19nZXRfYXZnX3F1YWxpdHkoY2FwX3JpZCkgKG1lbWNtcCgoY2FwX3JpZCktPnByb2ROYW1lLCAiMzUwIiwgMykgPyAweDEwIDogMHg1MCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHByb3RvY29sIG5hbWUKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBjaGFyICpjd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cmNweShjd3JxLCAiSUVFRSA4MDIuMTEtRFMiKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCisJLyogSWYgc2V0dGluZyBieSBmcmVxdWVuY3ksIGNvbnZlcnQgdG8gYSBjaGFubmVsICovCisJaWYoKGZ3cnEtPmUgPT0gMSkgJiYKKwkgICAoZndycS0+bSA+PSAoaW50KSAyLjQxMmU4KSAmJgorCSAgIChmd3JxLT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJaW50IGMgPSAwOworCQl3aGlsZSgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdFtjXSkpCisJCQljKys7CisJCS8qIEhhY2sgdG8gZmFsbCB0aHJvdWdoLi4uICovCisJCWZ3cnEtPmUgPSAwOworCQlmd3JxLT5tID0gYyArIDE7CisJfQorCS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKwlpZigoZndycS0+bSA+IDEwMDApIHx8IChmd3JxLT5lID4gMCkpCisJCXJjID0gLUVPUE5PVFNVUFA7CisJZWxzZSB7CisJCWludCBjaGFubmVsID0gZndycS0+bTsKKwkJLyogV2Ugc2hvdWxkIGRvIGEgYmV0dGVyIGNoZWNrIHRoYW4gdGhhdCwKKwkJICogYmFzZWQgb24gdGhlIGNhcmQgY2FwYWJpbGl0eSAhISEgKi8KKwkJaWYoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE2KSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBOZXcgY2hhbm5lbCB2YWx1ZSBvZiAlZCBpcyBpbnZhbGlkIVxuIiwgZGV2LT5uYW1lLCBmd3JxLT5tKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCQkJLyogWWVzICEgV2UgY2FuIHNldCBpdCAhISEgKi8KKwkJCWxvY2FsLT5jb25maWcuY2hhbm5lbFNldCA9ICh1MTYpKGNoYW5uZWwgLSAxKTsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJaWYgKChsb2NhbC0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IE1PREVfU1RBX0VTUykKKwkJc3RhdHVzX3JpZC5jaGFubmVsID0gbG9jYWwtPmNvbmZpZy5jaGFubmVsU2V0OworCWVsc2UKKwkJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCisjaWZkZWYgV0VYVF9VU0VDSEFOTkVMUworCWZ3cnEtPm0gPSAoKGludClzdGF0dXNfcmlkLmNoYW5uZWwpICsgMTsKKwlmd3JxLT5lID0gMDsKKyNlbHNlCisJeworCQlpbnQgZiA9IChpbnQpc3RhdHVzX3JpZC5jaGFubmVsOworCQlmd3JxLT5tID0gZnJlcXVlbmN5X2xpc3RbZl0gKiAxMDAwMDA7CisJCWZ3cnEtPmUgPSAxOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEVTU0lECisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKwlTc2lkUmlkIFNTSURfcmlkOwkJLyogU1NJRHMgKi8KKworCS8qIFJlbG9hZCB0aGUgbGlzdCBvZiBjdXJyZW50IFNTSUQgKi8KKwlyZWFkU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkKTsKKworCS8qIENoZWNrIGlmIHdlIGFza2VkIGZvciBgYW55JyAqLworCWlmKGR3cnEtPmZsYWdzID09IDApIHsKKwkJLyogSnVzdCBzZW5kIGFuIGVtcHR5IFNTSUQgbGlzdCAqLworCQltZW1zZXQoJlNTSURfcmlkLCAwLCBzaXplb2YoU1NJRF9yaWQpKTsKKwl9IGVsc2UgeworCQlpbnQJaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJCWlmKGR3cnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKzEpIHsKKwkJCXJldHVybiAtRTJCSUcgOworCQl9CisJCS8qIENoZWNrIGlmIGluZGV4IGlzIHZhbGlkICovCisJCWlmKChpbmRleCA8IDApIHx8IChpbmRleCA+PSA0KSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBTZXQgdGhlIFNTSUQgKi8KKwkJbWVtc2V0KFNTSURfcmlkLnNzaWRzW2luZGV4XS5zc2lkLCAwLAorCQkgICAgICAgc2l6ZW9mKFNTSURfcmlkLnNzaWRzW2luZGV4XS5zc2lkKSk7CisJCW1lbWNweShTU0lEX3JpZC5zc2lkc1tpbmRleF0uc3NpZCwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJCVNTSURfcmlkLnNzaWRzW2luZGV4XS5sZW4gPSBkd3JxLT5sZW5ndGggLSAxOworCX0KKwlTU0lEX3JpZC5sZW4gPSBzaXplb2YoU1NJRF9yaWQpOworCS8qIFdyaXRlIGl0IHRvIHRoZSBjYXJkICovCisJZGlzYWJsZV9NQUMobG9jYWwsIDEpOworCXdyaXRlU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkLCAxKTsKKwllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFU1NJRAorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisKKwlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisKKwkvKiBOb3RlIDogaWYgZHdycS0+ZmxhZ3MgIT0gMCwgd2Ugc2hvdWxkCisJICogZ2V0IHRoZSByZWxldmFudCBTU0lEIGZyb20gdGhlIFNTSUQgbGlzdC4uLiAqLworCisJLyogR2V0IHRoZSBjdXJyZW50IFNTSUQgKi8KKwltZW1jcHkoZXh0cmEsIHN0YXR1c19yaWQuU1NJRCwgc3RhdHVzX3JpZC5TU0lEbGVuKTsKKwlleHRyYVtzdGF0dXNfcmlkLlNTSURsZW5dID0gJ1wwJzsKKwkvKiBJZiBub25lLCB3ZSBtYXkgd2FudCB0byBnZXQgdGhlIG9uZSB0aGF0IHdhcyBzZXQgKi8KKworCS8qIFB1c2ggaXQgb3V0ICEgKi8KKwlkd3JxLT5sZW5ndGggPSBzdGF0dXNfcmlkLlNTSURsZW4gKyAxOworCWR3cnEtPmZsYWdzID0gMTsgLyogYWN0aXZlICovCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmNhc3RbRVRIX0FMRU5dID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisKKwlpZiAoYXdycS0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAoIW1lbWNtcChiY2FzdCwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pKSB7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCWNtZC5jbWQ9Q01EX0xPU0VfU1lOQzsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbG9jYWwtPnNlbSkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlpc3N1ZWNvbW1hbmQobG9jYWwsICZjbWQsICZyc3ApOworCQl1cCgmbG9jYWwtPnNlbSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZBUExpc3RfcmlkLCAwLCBzaXplb2YoQVBMaXN0X3JpZCkpOworCQlBUExpc3RfcmlkLmxlbiA9IHNpemVvZihBUExpc3RfcmlkKTsKKwkJbWVtY3B5KEFQTGlzdF9yaWQuYXBbMF0sIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkJZGlzYWJsZV9NQUMobG9jYWwsIDEpOworCQl3cml0ZUFQTGlzdFJpZChsb2NhbCwgJkFQTGlzdF9yaWQsIDEpOworCQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEFQIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBhaXJvX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworCS8qIFRlbnRhdGl2ZS4gVGhpcyBzZWVtcyB0byB3b3JrLCB3b3csIEknbSBsdWNreSAhISEgKi8KKwltZW1jcHkoYXdycS0+c2FfZGF0YSwgc3RhdHVzX3JpZC5ic3NpZFswXSwgRVRIX0FMRU4pOworCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBOaWNrbmFtZQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KKwlpZihkd3JxLT5sZW5ndGggPiAxNiArIDEpIHsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJbWVtc2V0KGxvY2FsLT5jb25maWcubm9kZU5hbWUsIDAsIHNpemVvZihsb2NhbC0+Y29uZmlnLm5vZGVOYW1lKSk7CisJbWVtY3B5KGxvY2FsLT5jb25maWcubm9kZU5hbWUsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5pY2tuYW1lCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJc3RybmNweShleHRyYSwgbG9jYWwtPmNvbmZpZy5ub2RlTmFtZSwgMTYpOworCWV4dHJhWzE2XSA9ICdcMCc7CisJZHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgQml0LVJhdGUKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKwl1OAlicmF0ZSA9IDA7CisJaW50CWk7CisKKwkvKiBGaXJzdCA6IGdldCBhIHZhbGlkIGJpdCByYXRlIHZhbHVlICovCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKworCS8qIFdoaWNoIHR5cGUgb2YgdmFsdWUgPyAqLworCWlmKCh2d3JxLT52YWx1ZSA8IDgpICYmICh2d3JxLT52YWx1ZSA+PSAwKSkgeworCQkvKiBTZXR0aW5nIGJ5IHJhdGUgaW5kZXggKi8KKwkJLyogRmluZCB2YWx1ZSBpbiB0aGUgbWFnaWMgcmF0ZSB0YWJsZSAqLworCQlicmF0ZSA9IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbdndycS0+dmFsdWVdOworCX0gZWxzZSB7CisJCS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IHZhbHVlICovCisJCXU4CW5vcm12YWx1ZSA9ICh1OCkgKHZ3cnEtPnZhbHVlLzUwMDAwMCk7CisKKwkJLyogQ2hlY2sgaWYgcmF0ZSBpcyB2YWxpZCAqLworCQlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQkJaWYobm9ybXZhbHVlID09IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaV0pIHsKKwkJCQlicmF0ZSA9IG5vcm12YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKiAtMSBkZXNpZ25lZCB0aGUgbWF4IHJhdGUgKG1vc3RseSBhdXRvIG1vZGUpICovCisJaWYodndycS0+dmFsdWUgPT0gLTEpIHsKKwkJLyogR2V0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZSByYXRlICovCisJCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCQlpZihjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaSAhPSAwKQorCQkJYnJhdGUgPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2kgLSAxXTsKKwl9CisJLyogQ2hlY2sgdGhhdCBpdCBpcyB2YWxpZCAqLworCWlmKGJyYXRlID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJLyogTm93LCBjaGVjayBpZiB3ZSB3YW50IGEgZml4ZWQgb3IgYXV0byB2YWx1ZSAqLworCWlmKHZ3cnEtPmZpeGVkID09IDApIHsKKwkJLyogRmlsbCBhbGwgdGhlIHJhdGVzIHVwIHRvIHRoaXMgbWF4IHJhdGUgKi8KKwkJbWVtc2V0KGxvY2FsLT5jb25maWcucmF0ZXMsIDAsIDgpOworCQlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQkJbG9jYWwtPmNvbmZpZy5yYXRlc1tpXSA9IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaV07CisJCQlpZihsb2NhbC0+Y29uZmlnLnJhdGVzW2ldID09IGJyYXRlKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogRml4ZWQgbW9kZSAqLworCQkvKiBPbmUgcmF0ZSwgZml4ZWQgKi8KKwkJbWVtc2V0KGxvY2FsLT5jb25maWcucmF0ZXMsIDAsIDgpOworCQlsb2NhbC0+Y29uZmlnLnJhdGVzWzBdID0gYnJhdGU7CisJfQorCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEJpdC1SYXRlCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCisJdndycS0+dmFsdWUgPSBzdGF0dXNfcmlkLmN1cnJlbnRYbWl0UmF0ZSAqIDUwMDAwMDsKKwkvKiBJZiBtb3JlIHRoYW4gb25lIHJhdGUsIHNldCBhdXRvICovCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+Zml4ZWQgPSAobG9jYWwtPmNvbmZpZy5yYXRlc1sxXSA9PSAwKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBSVFMgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IHJ0aHIgPSB2d3JxLT52YWx1ZTsKKworCWlmKHZ3cnEtPmRpc2FibGVkKQorCQlydGhyID0gMjMxMjsKKwlpZigocnRociA8IDApIHx8IChydGhyID4gMjMxMikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWxvY2FsLT5jb25maWcucnRzVGhyZXMgPSBydGhyOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFJUUyB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPnZhbHVlID0gbG9jYWwtPmNvbmZpZy5ydHNUaHJlczsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA+PSAyMzEyKTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgRnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IGZ0aHIgPSB2d3JxLT52YWx1ZTsKKworCWlmKHZ3cnEtPmRpc2FibGVkKQorCQlmdGhyID0gMjMxMjsKKwlpZigoZnRociA8IDI1NikgfHwgKGZ0aHIgPiAyMzEyKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZnRociAmPSB+MHgxOwkvKiBHZXQgYW4gZXZlbiB2YWx1ZSAtIGlzIGl0IHJlYWxseSBuZWVkZWQgPz8/ICovCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJbG9jYWwtPmNvbmZpZy5mcmFnVGhyZXNoID0gKHUxNilmdGhyOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+dmFsdWUgPSBsb2NhbC0+Y29uZmlnLmZyYWdUaHJlc2g7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjMxMik7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE1vZGUgb2YgT3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgX191MzIgKnV3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IHJlc2V0ID0gMDsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4ZmYpID49IFJYTU9ERV9SRk1PTikKKwkJcmVzZXQgPSAxOworCisJc3dpdGNoKCp1d3JxKSB7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfU1RBX0lCU1M7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX1NUQV9FU1M7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfTUFTVEVSOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9BUDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX0FDVElWRTsKKwkJCWNsZWFyX2JpdCAoRkxBR184MDJfMTEsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9SRVBFQVQ6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX0FQX1JQVFI7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfU1RBX0VTUzsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfUkZNT04gfCBSWE1PREVfRElTQUJMRV84MDJfM19IRUFERVI7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfUEFTU0lWRTsKKwkJCXNldF9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZXNldCkKKwkJc2V0X2JpdCAoRkxBR19SRVNFVCwgJmxvY2FsLT5mbGFncyk7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgTW9kZSBvZiBPcGVyYXRpb24KKyAqLworc3RhdGljIGludCBhaXJvX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBfX3UzMiAqdXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIElmIG5vdCBtYW5hZ2VkLCBhc3N1bWUgaXQncyBhZC1ob2MgKi8KKwlzd2l0Y2ggKGxvY2FsLT5jb25maWcub3Btb2RlICYgMHhGRikgeworCQljYXNlIE1PREVfU1RBX0VTUzoKKwkJCSp1d3JxID0gSVdfTU9ERV9JTkZSQTsKKwkJCWJyZWFrOworCQljYXNlIE1PREVfQVA6CisJCQkqdXdycSA9IElXX01PREVfTUFTVEVSOworCQkJYnJlYWs7CisJCWNhc2UgTU9ERV9BUF9SUFRSOgorCQkJKnV3cnEgPSBJV19NT0RFX1JFUEVBVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKnV3cnEgPSBJV19NT0RFX0FESE9DOworCX0KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFbmNyeXB0aW9uIEtleQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisKKwkvKiBJcyBXRVAgc3VwcG9ydGVkID8gKi8KKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDEpOworCS8qIE9sZGVyIGZpcm13YXJlIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLi4uCisJaWYoIShjYXBfcmlkLnNvZnRDYXAgJiAyKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfSAqLworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCisJLyogQmFzaWMgY2hlY2tpbmc6IGRvIHdlIGhhdmUgYSBrZXkgdG8gc2V0ID8KKwkgKiBOb3RlIDogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KKwkgKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gY2hlY2sgYSBrZXkgc2l6ZSA9PSAwIGluc3RlYWQuCisJICogTmV3IHZlcnNpb24gb2YgaXdjb25maWcgcHJvcGVybHkgc2V0IHRoZSBJV19FTkNPREVfTk9LRVkgZmxhZworCSAqIHdoZW4gbm8ga2V5IGlzIHByZXNlbnQgKG9ubHkgY2hhbmdlIGZsYWdzKSwgYnV0IG9sZGVyIHZlcnNpb25zCisJICogZG9uJ3QgZG8gaXQuIC0gSmVhbiBJSSAqLworCWlmIChkd3JxLT5sZW5ndGggPiAwKSB7CisJCXdlcF9rZXlfdCBrZXk7CisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpbnQgY3VycmVudF9pbmRleCA9IGdldF93ZXBfa2V5KGxvY2FsLCAweGZmZmYpOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChkd3JxLT5sZW5ndGggPiBNQVhfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIHRoZSBpbmRleCAobm9uZSAtPiB1c2UgY3VycmVudCkgKi8KKwkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSAoKGNhcF9yaWQuc29mdENhcCAmIDB4ODApID8gNDoxKSkpCisJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisJCS8qIFNldCB0aGUgbGVuZ3RoICovCisJCWlmIChkd3JxLT5sZW5ndGggPiBNSU5fS0VZX1NJWkUpCisJCQlrZXkubGVuID0gTUFYX0tFWV9TSVpFOworCQllbHNlCisJCQlpZiAoZHdycS0+bGVuZ3RoID4gMCkKKwkJCQlrZXkubGVuID0gTUlOX0tFWV9TSVpFOworCQkJZWxzZQorCQkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJCWtleS5sZW4gPSAwOworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ2xlYW51cCAqLworCQkJbWVtc2V0KGtleS5rZXksIDAsIE1BWF9LRVlfU0laRSk7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJbWVtY3B5KGtleS5rZXksIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCQkJLyogU2VuZCB0aGUga2V5IHRvIHRoZSBjYXJkICovCisJCQlzZXRfd2VwX2tleShsb2NhbCwgaW5kZXgsIGtleS5rZXksIGtleS5sZW4sIDEsIDEpOworCQl9CisJCS8qIFdFIHNwZWNpZnkgdGhhdCBpZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24KKwkJICogc2hvdWxkIGJlIGVuYWJsZWQgKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKQorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MgKi8KKwkJaWYoKGluZGV4ID09IGN1cnJlbnRfaW5kZXgpICYmIChrZXkubGVuID4gMCkgJiYKKwkJICAgKGxvY2FsLT5jb25maWcuYXV0aFR5cGUgPT0gQVVUSF9PUEVOKSkgeworCQkJbG9jYWwtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfRU5DUllQVDsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8ICgoY2FwX3JpZC5zb2Z0Q2FwICYgMHg4MCk/NDoxKSkpIHsKKwkJCXNldF93ZXBfa2V5KGxvY2FsLCBpbmRleCwgTlVMTCwgMCwgMSwgMSk7CisJCX0gZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJfQorCS8qIFJlYWQgdGhlIGZsYWdzICovCisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX09QRU47CS8vIGRpc2FibGUgZW5jcnlwdGlvbgorCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX1NIQVJFREtFWTsJLy8gT25seSBCb3RoCisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikKKwkJbG9jYWwtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfRU5DUllQVDsJLy8gT25seSBXZXAKKwkvKiBDb21taXQgdGhlIGNoYW5nZXMgdG8gZmxhZ3MgaWYgbmVlZGVkICovCisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEVuY3J5cHRpb24gS2V5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKworCS8qIElzIGl0IHN1cHBvcnRlZCA/ICovCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKwlpZighKGNhcF9yaWQuc29mdENhcCAmIDIpKSB7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJLyogQ2hlY2sgZW5jcnlwdGlvbiBtb2RlICovCisJc3dpdGNoKGxvY2FsLT5jb25maWcuYXV0aFR5cGUpCXsKKwkJY2FzZSBBVVRIX0VOQ1JZUFQ6CisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9PUEVOOworCQkJYnJlYWs7CisJCWNhc2UgQVVUSF9TSEFSRURLRVk6CisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgQVVUSF9PUEVOOgorCQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwl9CisJLyogV2UgY2FuJ3QgcmV0dXJuIHRoZSBrZXksIHNvIHNldCB0aGUgcHJvcGVyIGZsYWcgYW5kIHJldHVybiB6ZXJvICovCisJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworCW1lbXNldChleHRyYSwgMCwgMTYpOworCisJLyogV2hpY2gga2V5IGRvIHdlIHdhbnQgPyAtMSAtPiB0eCBpbmRleCAqLworCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gKChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKSA/IDQgOiAxKSkpCisJCWluZGV4ID0gZ2V0X3dlcF9rZXkobG9jYWwsIDB4ZmZmZik7CisJZHdycS0+ZmxhZ3MgfD0gaW5kZXggKyAxOworCS8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwlkd3JxLT5sZW5ndGggPSBnZXRfd2VwX2tleShsb2NhbCwgaW5kZXgpOworCWlmIChkd3JxLT5sZW5ndGggPiAxNikgeworCQlkd3JxLT5sZW5ndGg9MDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFR4LVBvd2VyCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCWludCBpOworCWludCByYyA9IC1FSU5WQUw7CisKKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDEpOworCisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCXNldF9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmbG9jYWwtPmZsYWdzKTsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCX0KKwlpZiAodndycS0+ZmxhZ3MgIT0gSVdfVFhQT1dfTVdBVFQpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNsZWFyX2JpdCAoRkxBR19SQURJT19PRkYsICZsb2NhbC0+ZmxhZ3MpOworCWZvciAoaSA9IDA7IGNhcF9yaWQudHhQb3dlckxldmVsc1tpXSAmJiAoaSA8IDgpOyBpKyspCisJCWlmICgodndycS0+dmFsdWU9PWNhcF9yaWQudHhQb3dlckxldmVsc1tpXSkpIHsKKwkJCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCQkJbG9jYWwtPmNvbmZpZy50eFBvd2VyID0gdndycS0+dmFsdWU7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCQlyYyA9IC1FSU5QUk9HUkVTUzsJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFR4LVBvd2VyCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPnZhbHVlID0gbG9jYWwtPmNvbmZpZy50eFBvd2VyOworCXZ3cnEtPmZpeGVkID0gMTsJLyogTm8gcG93ZXIgY29udHJvbCAqLworCXZ3cnEtPmRpc2FibGVkID0gdGVzdF9iaXQoRkxBR19SQURJT19PRkYsICZsb2NhbC0+ZmxhZ3MpOworCXZ3cnEtPmZsYWdzID0gSVdfVFhQT1dfTVdBVFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgUmV0cnkgbGltaXRzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJaWYodndycS0+ZGlzYWJsZWQpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWlmKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElNSVQpIHsKKwkJaWYodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpCisJCQlsb2NhbC0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUlOKQorCQkJbG9jYWwtPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSB7CisJCQkvKiBObyBtb2RpZmllciA6IHNldCBib3RoICovCisJCQlsb2NhbC0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0ID0gdndycS0+dmFsdWU7CisJCQlsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQl9CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmMgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJfQorCWlmKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUpIHsKKwkJbG9jYWwtPmNvbmZpZy50eExpZmV0aW1lID0gdndycS0+dmFsdWUgLyAxMDI0OworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCXJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFJldHJ5IGxpbWl0cworICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwl2d3JxLT5kaXNhYmxlZCA9IDA7ICAgICAgLyogQ2FuJ3QgYmUgZGlzYWJsZWQgKi8KKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIE5vdGUgOiBieSBkZWZhdWx0LCBkaXNwbGF5IHRoZSBtaW4gcmV0cnkgbnVtYmVyICovCisJaWYoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0gSVdfUkVUUllfTElGRVRJTUUpIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcudHhMaWZldGltZSAqIDEwMjQ7CisJfSBlbHNlIGlmKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcubG9uZ1JldHJ5TGltaXQ7CisJfSBlbHNlIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0OworCQlpZigoaW50KWxvY2FsLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ICE9IChpbnQpbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdCkKKwkJCXZ3cnEtPmZsYWdzIHw9IElXX1JFVFJZX01JTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcmFuZ2UgaW5mbworICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKwlpbnQJCWk7CisJaW50CQlrOworCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKworCWR3cnEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IDE0OworCS8qIFNob3VsZCBiZSBiYXNlZCBvbiBjYXBfcmlkLmNvdW50cnkgdG8gZ2l2ZSBvbmx5CisJICogd2hhdCB0aGUgY3VycmVudCBjYXJkIHN1cHBvcnQgKi8KKwlrID0gMDsKKwlmb3IoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisJCXJhbmdlLT5mcmVxW2tdLmkgPSBpICsgMTsgLyogTGlzdCBpbmRleCAqLworCQlyYW5nZS0+ZnJlcVtrXS5tID0gZnJlcXVlbmN5X2xpc3RbaV0gKiAxMDAwMDA7CisJCXJhbmdlLT5mcmVxW2srK10uZSA9IDE7CS8qIFZhbHVlcyBpbiB0YWJsZSBpbiBNSHogLT4gKiAxMF41ICogMTAgKi8KKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBrOworCisJLyogSHVtLi4uIFNob3VsZCBwdXQgdGhlIHJpZ2h0IHZhbHVlcyB0aGVyZSAqLworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gYWlyb19nZXRfbWF4X3F1YWxpdHkoJmNhcF9yaWQpOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDB4MTAwIC0gMTIwOwkvKiAtMTIwIGRCbSAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gNjU1MzU7CisKKwlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaV0gKiA1MDAwMDA7CisJCWlmKHJhbmdlLT5iaXRyYXRlW2ldID09IDApCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGk7CisKKwkvKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0CisJICogaW4gYml0L3MgdGhhdCB3ZSBjYW4gZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlLgorCSAqIE1heSBiZSB1c2UgZm9yIFFvUyBzdHVmZi4uLiBKZWFuIElJICovCisJaWYoaSA+IDIpCisJCXJhbmdlLT50aHJvdWdocHV0ID0gNTAwMCAqIDEwMDA7CisJZWxzZQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDE1MDAgKiAxMDAwOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjMxMjsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjMxMjsKKworCWlmKGNhcF9yaWQuc29mdENhcCAmIDIpIHsKKwkJLy8gV0VQOiBSQzQgNDAgYml0cworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJCS8vIFJDNCB+MTI4IGJpdHMKKwkJaWYgKGNhcF9yaWQuc29mdENhcCAmIDB4MTAwKSB7CisJCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCQkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJCX0gZWxzZQorCQkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gKGNhcF9yaWQuc29mdENhcCAmIDB4ODApID8gNCA6IDE7CisJfSBlbHNlIHsKKwkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDA7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMDsKKwl9CisJcmFuZ2UtPm1pbl9wbXAgPSAwOworCXJhbmdlLT5tYXhfcG1wID0gNTAwMDAwMDsJLyogNSBzZWNzICovCisJcmFuZ2UtPm1pbl9wbXQgPSAwOworCXJhbmdlLT5tYXhfcG10ID0gNjU1MzUgKiAxMDI0OwkvKiA/Pz8gKi8KKwlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX0FMTF9SOworCisJLyogVHJhbnNtaXQgUG93ZXIgLSB2YWx1ZXMgYXJlIGluIG1XICovCisJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJcmFuZ2UtPnR4cG93ZXJbaV0gPSBjYXBfcmlkLnR4UG93ZXJMZXZlbHNbaV07CisJCWlmKHJhbmdlLT50eHBvd2VyW2ldID09IDApCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV90eHBvd2VyID0gaTsKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfTVdBVFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTI7CisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMTsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CisJcmFuZ2UtPm1pbl9yX3RpbWUgPSAxMDI0OworCXJhbmdlLT5tYXhfcl90aW1lID0gNjU1MzUgKiAxMDI0OworCS8qIEV4cGVyaW1lbnRhbCBtZWFzdXJlbWVudHMgLSBib3VuZGFyeSAxMS81LjUgTWIvcyAqLworCS8qIE5vdGUgOiB3aXRoIG9yIHdpdGhvdXQgdGhlIChsb2NhbC0+cnNzaSksIHJlc3VsdHMKKwkgKiBhcmUgc29tZXdoYXQgZGlmZmVyZW50LiAtIEplYW4gSUkgKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IGFpcm9fZ2V0X2F2Z19xdWFsaXR5KCZjYXBfcmlkKTsKKwlpZiAobG9jYWwtPnJzc2kpCisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE4NjsJLyogLTcwIGRCbSAqLworCWVsc2UKKwkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTc2OwkvKiAtODAgZEJtICovCisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKKworCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdUSFJTUFkpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVs0XSA9IElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWVFhEUk9QKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgUG93ZXIgTWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhGRikgPj0gUlhNT0RFX1JGTU9OKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfQ0FNOworCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4RkYwMDsKKwkJbG9jYWwtPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfQkNfTUNfQUREUjsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCX0KKwlpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQlsb2NhbC0+Y29uZmlnLmZhc3RMaXN0ZW5EZWxheSA9ICh2d3JxLT52YWx1ZSArIDUwMCkgLyAxMDI0OworCQlsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQQ0FNOworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJfSBlbHNlIGlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9QRVJJT0QpIHsKKwkJbG9jYWwtPmNvbmZpZy5mYXN0TGlzdGVuSW50ZXJ2YWwgPSBsb2NhbC0+Y29uZmlnLmxpc3RlbkludGVydmFsID0gKHZ3cnEtPnZhbHVlICsgNTAwKSAvIDEwMjQ7CisJCWxvY2FsLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9QU1BDQU07CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwl9CisJc3dpdGNoICh2d3JxLT5mbGFncyAmIElXX1BPV0VSX01PREUpIHsKKwkJY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6CisJCQlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweEZGKSA+PSBSWE1PREVfUkZNT04pIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfQUREUjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BPV0VSX0FMTF9SOgorCQkJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhGRikgPj0gUlhNT0RFX1JGTU9OKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0JDX01DX0FERFI7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCWNhc2UgSVdfUE9XRVJfT046CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwkvLyBOb3RlIDogd2UgbWF5IHdhbnQgdG8gZmFjdG9yIGxvY2FsLT5uZWVkX2NvbW1pdCBoZXJlCisJLy8gTm90ZTIgOiBtYXkgYWxzbyB3YW50IHRvIGZhY3RvciBSWE1PREVfUkZNT04gdGVzdAorCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFBvd2VyIE1hbmFnZW1lbnQKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBtb2RlOworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJbW9kZSA9IGxvY2FsLT5jb25maWcucG93ZXJTYXZlTW9kZTsKKwlpZiAoKHZ3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gUE9XRVJTQVZFX0NBTSkpKQorCQlyZXR1cm4gMDsKKwlpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQl2d3JxLT52YWx1ZSA9IChpbnQpbG9jYWwtPmNvbmZpZy5mYXN0TGlzdGVuRGVsYXkgKiAxMDI0OworCQl2d3JxLT5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJfSBlbHNlIHsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkludGVydmFsICogMTAyNDsKKwkJdndycS0+ZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJfQorCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID09IFJYTU9ERV9BRERSKQorCQl2d3JxLT5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisJZWxzZQorCQl2d3JxLT5mbGFncyB8PSBJV19QT1dFUl9BTExfUjsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBTZW5zaXRpdml0eQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWxvY2FsLT5jb25maWcucnNzaVRocmVzaG9sZCA9IHZ3cnEtPmRpc2FibGVkID8gUlNTSV9ERUZBVUxUIDogdndycS0+dmFsdWU7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgU2Vuc2l0aXZpdHkKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcucnNzaVRocmVzaG9sZDsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA9PSAwKTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgTGlzdAorICogTm90ZSA6IHRoaXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBJV1NDQU4KKyAqLworc3RhdGljIGludCBhaXJvX2dldF9hcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlCU1NMaXN0UmlkIEJTU0xpc3Q7CisJaW50IGk7CisJaW50IGxvc2VTeW5jID0gY2FwYWJsZShDQVBfTkVUX0FETUlOKSA/IDE6IC0xOworCisJZm9yIChpID0gMDsgaSA8IElXX01BWF9BUDsgaSsrKSB7CisJCWlmIChyZWFkQlNTTGlzdFJpZChsb2NhbCwgbG9zZVN5bmMsICZCU1NMaXN0KSkKKwkJCWJyZWFrOworCQlsb3NlU3luYyA9IDA7CisJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIEJTU0xpc3QuYnNzaWQsIEVUSF9BTEVOKTsKKwkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCWlmIChsb2NhbC0+cnNzaSkKKwkJCXF1YWxbaV0ubGV2ZWwgPSAweDEwMCAtIGxvY2FsLT5yc3NpW0JTU0xpc3QucnNzaV0ucnNzaWRCbTsKKwkJZWxzZQorCQkJcXVhbFtpXS5sZXZlbCA9IChCU1NMaXN0LnJzc2kgKyAzMjEpIC8gMjsKKwkJcXVhbFtpXS5xdWFsID0gcXVhbFtpXS5ub2lzZSA9IDA7CisJCXF1YWxbaV0udXBkYXRlZCA9IDI7CisJCWlmIChCU1NMaXN0LmluZGV4ID09IDB4ZmZmZikKKwkJCWJyZWFrOworCX0KKwlpZiAoIWkpIHsKKwkJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisJCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgbWluKElXX01BWF9BUCwgNCkgJiYKKwkJCSAgICAgKHN0YXR1c19yaWQuYnNzaWRbaV1bMF0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVsxXQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzJdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bM10KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVs0XQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzVdKSE9MHhmZiAmJgorCQkJICAgICAoc3RhdHVzX3JpZC5ic3NpZFtpXVswXQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzFdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bMl0KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVszXQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzRdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bNV0pOworCQkgICAgIGkrKykgeworCQkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwKKwkJCSAgICAgICBzdGF0dXNfcmlkLmJzc2lkW2ldLCBFVEhfQUxFTik7CisJCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJfQorCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzID0gMTsgLyogU2hvdWxkIGJlIGRlZmluZSdkICovCisJCW1lbWNweShleHRyYSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKmksCisJCSAgICAgICAmcXVhbCwgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkqaSk7CisJfQorCWR3cnEtPmxlbmd0aCA9IGk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBJbml0aWF0ZSBTY2FuCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisKKwkvKiBOb3RlIDogeW91IG1heSBoYXZlIHJlYWxpc2VkIHRoYXQsIGFzIHRoaXMgaXMgYSBTRVQgb3BlcmF0aW9uLAorCSAqIHRoaXMgaXMgcHJpdmlsZWdlZCBhbmQgdGhlcmVmb3JlIGEgbm9ybWFsIHVzZXIgY2FuJ3QKKwkgKiBwZXJmb3JtIHNjYW5uaW5nLgorCSAqIFRoaXMgaXMgbm90IGFuIGVycm9yLCB3aGlsZSB0aGUgZGV2aWNlIHBlcmZvcm0gc2Nhbm5pbmcsCisJICogdHJhZmZpYyBkb2Vzbid0IGZsb3csIHNvIGl0J3MgYSBwZXJmZWN0IERvUy4uLgorCSAqIEplYW4gSUkgKi8KKwlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gLUVORVRET1dOOworCisJLyogSW5pdGlhdGUgYSBzY2FuIGNvbW1hbmQgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5jbWQ9Q01EX0xJU1RCU1M7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlhaS0+c2Nhbl90aW1lc3RhbXAgPSBqaWZmaWVzOworCXVwKCZhaS0+c2VtKTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIGp1c3QgcmV0dXJuIHRvIHRoZSB1c2VyLiAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2xhdGUgc2NhbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIGNhcmQgdG8gYSBjYXJkIGluZGVwZW5kZW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSQorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmFpcm9fdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJY2hhciAqY3VycmVudF9ldiwKKwkJCQkJY2hhciAqZW5kX2J1ZiwKKwkJCQkJQlNTTGlzdFJpZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfZXZlbnQJCWl3ZTsJCS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKwl1MTYJCQljYXBhYmlsaXRpZXM7CisJY2hhciAqCQkJY3VycmVudF92YWw7CS8qIEZvciByYXRlcyAqLworCWludAkJCWk7CisKKwkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBsaXN0LT5ic3NpZCwgRVRIX0FMRU4pOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkvKiBPdGhlciBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwlpd2UudS5kYXRhLmxlbmd0aCA9IGxpc3QtPnNzaWRMZW47CisJaWYoaXdlLnUuZGF0YS5sZW5ndGggPiAzMikKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAzMjsKKwlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBsaXN0LT5zc2lkKTsKKworCS8qIEFkZCBtb2RlICovCisJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCWNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGxpc3QtPmNhcCk7CisJaWYoY2FwYWJpbGl0aWVzICYgKENBUF9FU1MgfCBDQVBfSUJTUykpIHsKKwkJaWYoY2FwYWJpbGl0aWVzICYgQ0FQX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJfQorCisJLyogQWRkIGZyZXF1ZW5jeSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwlpd2UudS5mcmVxLm0gPSBsZTE2X3RvX2NwdShsaXN0LT5kc0NoYW5uZWwpOworCWl3ZS51LmZyZXEubSA9IGZyZXF1ZW5jeV9saXN0W2l3ZS51LmZyZXEubV0gKiAxMDAwMDA7CisJaXdlLnUuZnJlcS5lID0gMTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCisJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwlpZiAoYWktPnJzc2kpCisJCWl3ZS51LnF1YWwubGV2ZWwgPSAweDEwMCAtIGFpLT5yc3NpW2xpc3QtPnJzc2ldLnJzc2lkQm07CisJZWxzZQorCQlpd2UudS5xdWFsLmxldmVsID0gKGxpc3QtPnJzc2kgKyAzMjEpIC8gMjsKKwlpd2UudS5xdWFsLm5vaXNlID0gMDsKKwlpd2UudS5xdWFsLnF1YWwgPSAwOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKwkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJaWYoY2FwYWJpbGl0aWVzICYgQ0FQX1BSSVZBQ1kpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBsaXN0LT5zc2lkKTsKKworCS8qIFJhdGUgOiBzdHVmZmluZyBtdWx0aXBsZSB2YWx1ZXMgaW4gYSBzaW5nbGUgZXZlbnQgcmVxdWlyZSBhIGJpdAorCSAqIG1vcmUgb2YgbWFnaWMgLSBKZWFuIElJICovCisJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKworCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KKwlpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJLyogTWF4IDggdmFsdWVzICovCisJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJLyogTlVMTCB0ZXJtaW5hdGVkICovCisJCWlmKGxpc3QtPnJhdGVzW2ldID09IDApCisJCQlicmVhazsKKwkJLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKwkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgobGlzdC0+cmF0ZXNbaV0gJiAweDdmKSAqIDUwMDAwMCk7CisJCS8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KKwkJY3VycmVudF92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShjdXJyZW50X2V2LCBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKwl9CisJLyogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50ICovCisJaWYoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQljdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisKKwkvKiBUaGUgb3RoZXIgZGF0YSBpbiB0aGUgc2NhbiByZXN1bHQgYXJlIG5vdCByZWFsbHkKKwkgKiBpbnRlcmVzdGluZywgc28gZm9yIG5vdyBkcm9wIGl0IC0gSmVhbiBJSSAqLworCXJldHVybiBjdXJyZW50X2V2OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IFJlYWQgU2NhbiBSZXN1bHRzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCUJTU0xpc3RSaWQgQlNTTGlzdDsKKwlpbnQgcmM7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworCisJLyogV2hlbiB3ZSBhcmUgYXNzb2NpYXRlZCBhZ2FpbiwgdGhlIHNjYW4gaGFzIHN1cmVseSBmaW5pc2hlZC4KKwkgKiBKdXN0IGluIGNhc2UsIGxldCdzIG1ha2Ugc3VyZSBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBzaW5jZQorCSAqIHdlIHN0YXJ0ZWQgdGhlIHNjYW4uIC0gSmF2aWVyICovCisJaWYoYWktPnNjYW5fdGltZXN0YW1wICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsYWktPnNjYW5fdGltZXN0YW1wKzMqSFopKSB7CisJCS8qIEltcG9ydGFudCBub3RlIDogd2UgZG9uJ3Qgd2FudCB0byBibG9jayB0aGUgY2FsbGVyCisJCSAqIHVudGlsIHJlc3VsdHMgYXJlIHJlYWR5IGZvciB2YXJpb3VzIHJlYXNvbnMuCisJCSAqIEZpcnN0LCBtYW5hZ2luZyB3YWl0IHF1ZXVlcyBpcyBjb21wbGV4IGFuZCByYWN5CisJCSAqICh0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGNhbGxlcnMpLgorCQkgKiBTZWNvbmQsIHdlIGdyYWIgc29tZSBydG5ldGxpbmsgbG9jayBiZWZvcmUgY29tbWluZworCQkgKiBoZXJlIChpbiBkZXZfaW9jdGwoKSkuCisJCSAqIFRoaXJkLCB0aGUgY2FsbGVyIGNhbiB3YWl0IG9uIHRoZSBXaXJlbGVzcyBFdmVudAorCQkgKiAtIEplYW4gSUkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWFpLT5zY2FuX3RpbWVzdGFtcCA9IDA7CisKKwkvKiBUaGVyZSdzIG9ubHkgYSByYWNlIHdpdGggcHJvY19CU1NMaXN0X29wZW4oKSwgYnV0IGl0cworCSAqIGNvbnNlcXVlbmNlcyBhcmUgYmVnbmlnbi4gU28gSSBkb24ndCBib3RoZXIgZml4aW5nIGl0IC0gSmF2aWVyICovCisKKwkvKiBUcnkgdG8gcmVhZCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIHNjYW4gcmVzdWx0ICovCisJcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX0JTU0xJU1RGSVJTVCwgJkJTU0xpc3QsIHNpemVvZihCU1NMaXN0KSwgMSk7CisJaWYoKHJjKSB8fCAoQlNTTGlzdC5pbmRleCA9PSAweGZmZmYpKSB7CisJCS8qIENsaWVudCBlcnJvciwgbm8gc2NhbiByZXN1bHRzLi4uCisJCSAqIFRoZSBjYWxsZXIgbmVlZCB0byByZXN0YXJ0IHRoZSBzY2FuLiAqLworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCisJLyogUmVhZCBhbmQgcGFyc2UgYWxsIGVudHJpZXMgKi8KKwl3aGlsZSgoIXJjKSAmJiAoQlNTTGlzdC5pbmRleCAhPSAweGZmZmYpKSB7CisJCS8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgdGhpcyBlbnRyeSAqLworCQljdXJyZW50X2V2ID0gYWlyb190cmFuc2xhdGVfc2NhbihkZXYsIGN1cnJlbnRfZXYsCisJCQkJCQkgZXh0cmEgKyBkd3JxLT5sZW5ndGgsCisJCQkJCQkgJkJTU0xpc3QpOworCisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIHNwYWNlIGZvciBvbmUgbW9yZSBlbnRyeSAqLworCQlpZigoZXh0cmEgKyBkd3JxLT5sZW5ndGggLSBjdXJyZW50X2V2KSA8PSBJV19FVl9BRERSX0xFTikgeworCQkJLyogQXNrIHVzZXIgc3BhY2UgdG8gdHJ5IGFnYWluIHdpdGggYSBiaWdnZXIgYnVmZmVyICovCisJCQlyZXR1cm4gLUUyQklHOworCQl9CisKKwkJLyogUmVhZCBuZXh0IGVudHJ5ICovCisJCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9CU1NMSVNUTkVYVCwKKwkJCQkgICAgJkJTU0xpc3QsIHNpemVvZihCU1NMaXN0KSwgMSk7CisJfQorCS8qIExlbmd0aCBvZiBkYXRhICovCisJZHdycS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJZHdycS0+ZmxhZ3MgPSAwOwkvKiB0b2RvICovCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENvbW1pdCBoYW5kbGVyIDogY2FsbGVkIGFmdGVyIGEgYnVuY2ggb2YgU0VUIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCBhaXJvX2NvbmZpZ19jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCS8qIE5VTEwgKi8KKwkJCSAgICAgIHZvaWQgKnp3cnEsCQkJLyogTlVMTCAqLworCQkJICAgICAgY2hhciAqZXh0cmEpCQkJLyogTlVMTCAqLworeworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisJaWYgKCF0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCS8qIFNvbWUgb2YgdGhlICJTRVQiIGZ1bmN0aW9uIG1heSBoYXZlIG1vZGlmaWVkIHNvbWUgb2YgdGhlCisJICogcGFyYW1ldGVycy4gSXQncyBub3cgdGltZSB0byBjb21taXQgdGhlbSBpbiB0aGUgY2FyZCAqLworCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwlpZiAodGVzdF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpKSB7CisJCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCQlTc2lkUmlkIFNTSURfcmlkOworCisJCXJlYWRBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkKTsKKwkJcmVhZFNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCk7CisJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmbG9jYWwtPmZsYWdzKSkKKwkJCXNldHVwX2NhcmQobG9jYWwsIGRldi0+ZGV2X2FkZHIsIDEgKTsKKwkJZWxzZQorCQkJcmVzZXRfYWlyb19jYXJkKGRldik7CisJCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwkJd3JpdGVTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQsIDEpOworCQl3cml0ZUFQTGlzdFJpZChsb2NhbCwgJkFQTGlzdF9yaWQsIDEpOworCX0KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl3cml0ZUNvbmZpZ1JpZChsb2NhbCwgMCk7CisJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMCk7CisJaWYgKHRlc3RfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKSkKKwkJYWlyb19zZXRfcHJvbWlzYyhsb2NhbCk7CisJZWxzZQorCQl1cCgmbG9jYWwtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycworICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIGFpcm9fcHJpdmF0ZV9hcmdzW10gPSB7CisvKnsgY21kLCAgICAgICAgIHNldF9hcmdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXJncywgbmFtZSB9ICovCisgIHsgQUlST0lPQ1RMLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IHNpemVvZiAoYWlyb25ldF9pb2N0bCksCisgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCAyMDQ3LCAiYWlyb2lvY3RsIiB9LAorICB7IEFJUk9JRElGQywgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2YgKGFpcm9uZXRfaW9jdGwpLAorICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiYWlyb2lkaWZjIiB9LAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWFpcm9faGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgYWlyb19jb25maWdfY29tbWl0LAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfZnJlcSwJCS8qIFNJT0NTSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9tb2RlLAkJLyogU0lPQ1NJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfbW9kZSwJCS8qIFNJT0NHSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9zZW5zLAkJLyogU0lPQ0dJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcmFuZ2UsCQkvKiBTSU9DR0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1NUQVRTICovCisJaXdfaGFuZGxlcl9zZXRfc3B5LAkJCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCQkJLyogU0lPQ0dJV1NQWSAqLworCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJCQkvKiBTSU9DU0lXVEhSU1BZICovCisJaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkJCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3dhcCwJCS8qIFNJT0NHSVdBUCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfYXBsaXN0LAkJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9zY2FuLAkJLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfc2NhbiwJCS8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2Vzc2lkLAkJLyogU0lPQ0dJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X25pY2ssCQkvKiBTSU9DU0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfbmljaywJCS8qIFNJT0NHSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3JhdGUsCQkvKiBTSU9DU0lXUkFURSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9yYXRlLAkJLyogU0lPQ0dJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfcnRzLAkJLyogU0lPQ1NJV1JUUyAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9ydHMsCQkvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2ZyYWcsCQkvKiBTSU9DU0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9mcmFnLAkJLyogU0lPQ0dJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfdHhwb3csCQkvKiBTSU9DU0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfdHhwb3csCQkvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfcmV0cnksCQkvKiBTSU9DU0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcmV0cnksCQkvKiBTSU9DR0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3Bvd2VyLAkJLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3Bvd2VyLAkJLyogU0lPQ0dJV1BPV0VSICovCit9OworCisvKiBOb3RlIDogZG9uJ3QgZGVzY3JpYmUgQUlST0lESUZDIGFuZCBBSVJPT0xESURJRkMgaW4gaGVyZS4KKyAqIFdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZSBvZiB0aGUgaW9jdGwgY29kZSwgYmVjYXVzZSB0aG9zZSBjYW4ndCBiZQorICogd29uJ3Qgd29yayB0aGUgaXdfaGFuZGxlciBjb2RlIChiZWNhdXNlIHRoZXkgc2ltdWx0YW5lb3VzbHkgcmVhZAorICogYW5kIHdyaXRlIGRhdGEgYW5kIGl3X2hhbmRsZXIgY2FuJ3QgZG8gdGhhdCkuCisgKiBOb3RlIHRoYXQgaXQncyBwZXJmZWN0bHkgbGVnYWwgdG8gcmVhZC93cml0ZSBvbiBhIHNpbmdsZSBpb2N0bCBjb21tYW5kLAorICogeW91IGp1c3QgY2FuJ3QgdXNlIGl3cHJpdiBhbmQgbmVlZCB0byBmb3JjZSBpdCB2aWEgdGhlIGlvY3RsIGhhbmRsZXIuCisgKiBKZWFuIElJICovCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJYWlyb19wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCWFpcm9faGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2YoYWlyb19oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKGFpcm9fcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YoYWlyb19wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSBhaXJvX2hhbmRsZXIsCisJLnByaXZhdGUJPSBhaXJvX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gYWlyb19wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IGFpcm9fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCisvKgorICogVGhpcyBkZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIHBhcnQgb2YgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMKKyAqIE5vdGUgOiBpcnEgYW5kIHNwaW5sb2NrIHByb3RlY3Rpb24gd2lsbCBvY2N1ciBpbiB0aGUgc3Vicm91dGluZXMKKyAqCisgKiBUT0RPIDoKKyAqCW8gQ2hlY2sgaW5wdXQgdmFsdWUgbW9yZSBjYXJlZnVsbHkgYW5kIGZpbGwgY29ycmVjdCB2YWx1ZXMgaW4gcmFuZ2UKKyAqCW8gVGVzdCBhbmQgc2hha2VvdXQgdGhlIGJ1Z3MgKGlmIGFueSkKKyAqCisgKiBKZWFuIElJCisgKgorICogSmF2aWVyIEFjaGlyaWNhIGRpZCBhIGdyZWF0IGpvYiBvZiBtZXJnaW5nIGNvZGUgZnJvbSB0aGUgdW5uYW1lZCBDSVNDTworICogZGV2ZWxvcGVyIHRoYXQgYWRkZWQgc3VwcG9ydCBmb3IgZmxhc2hpbmcgdGhlIGNhcmQuCisgKi8KK3N0YXRpYyBpbnQgYWlyb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSAoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdjsKKworCWlmIChhaS0+cG93ZXIpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjbWQpIHsKKyNpZmRlZiBDSVNDT19FWFQKKwljYXNlIEFJUk9JRElGQzoKKyNpZmRlZiBBSVJPT0xESURJRkMKKwljYXNlIEFJUk9PTERJRElGQzoKKyNlbmRpZgorCXsKKwkJaW50IHZhbCA9IEFJUk9NQUdJQzsKKwkJYWlyb25ldF9pb2N0bCBjb207CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29tLHJxLT5pZnJfZGF0YSxzaXplb2YoY29tKSkpCisJCQlyYyA9IC1FRkFVTFQ7CisJCWVsc2UgaWYgKGNvcHlfdG9fdXNlcihjb20uZGF0YSwoY2hhciAqKSZ2YWwsc2l6ZW9mKHZhbCkpKQorCQkJcmMgPSAtRUZBVUxUOworCX0KKwlicmVhazsKKworCWNhc2UgQUlST0lPQ1RMOgorI2lmZGVmIEFJUk9PTERJT0NUTAorCWNhc2UgQUlST09MRElPQ1RMOgorI2VuZGlmCisJCS8qIEdldCB0aGUgY29tbWFuZCBzdHJ1Y3QgYW5kIGhhbmQgaXQgb2ZmIGZvciBldmFsdWF0aW9uIGJ5CisJCSAqIHRoZSBwcm9wZXIgc3ViZnVuY3Rpb24KKwkJICovCisJeworCQlhaXJvbmV0X2lvY3RsIGNvbTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb20scnEtPmlmcl9kYXRhLHNpemVvZihjb20pKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXBhcmF0ZSBSL1cgZnVuY3Rpb25zIGJyYWNrZXQgbGVnYWxpdHkgaGVyZQorCQkgKi8KKwkJaWYgKCBjb20uY29tbWFuZCA9PSBBSVJPUlNXVkVSU0lPTiApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoY29tLmRhdGEsIHN3dmVyc2lvbiwgc2l6ZW9mKHN3dmVyc2lvbikpKQorCQkJCXJjID0gLUVGQVVMVDsKKwkJCWVsc2UKKwkJCQlyYyA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIGNvbS5jb21tYW5kIDw9IEFJUk9SUklEKQorCQkJcmMgPSByZWFkcmlkcyhkZXYsJmNvbSk7CisJCWVsc2UgaWYgKCBjb20uY29tbWFuZCA+PSBBSVJPUENBUCAmJiBjb20uY29tbWFuZCA8PSAoQUlST1BMRUFQVVNSKzIpICkKKwkJCXJjID0gd3JpdGVyaWRzKGRldiwmY29tKTsKKwkJZWxzZSBpZiAoIGNvbS5jb21tYW5kID49IEFJUk9GTFNIUlNUICYmIGNvbS5jb21tYW5kIDw9IEFJUk9SRVNUQVJUICkKKwkJCXJjID0gZmxhc2hjYXJkKGRldiwmY29tKTsKKwkJZWxzZQorCQkJcmMgPSAtRUlOVkFMOyAgICAgIC8qIEJhZCBjb21tYW5kIGluIGlvY3RsICovCisJfQorCWJyZWFrOworI2VuZGlmIC8qIENJU0NPX0VYVCAqLworCisJLy8gQWxsIG90aGVyIGNhbGxzIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQKKwlkZWZhdWx0OgorCQlyYyA9IC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8qCisgKiBHZXQgdGhlIFdpcmVsZXNzIHN0YXRzIG91dCBvZiB0aGUgZHJpdmVyCisgKiBOb3RlIDogaXJxIGFuZCBzcGlubG9jayBwcm90ZWN0aW9uIHdpbGwgb2NjdXIgaW4gdGhlIHN1YnJvdXRpbmVzCisgKgorICogVE9ETyA6CisgKglvIENoZWNrIGlmIHdvcmsgaW4gQWQtSG9jIG1vZGUgKG90aGVyd2lzZSwgdXNlIFNQWSwgYXMgaW4gd3ZsYW5fY3MpCisgKgorICogSmVhbgorICovCitzdGF0aWMgdm9pZCBhaXJvX3JlYWRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IGFpcm9faW5mbyAqbG9jYWwpCit7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CisJU3RhdHNSaWQgc3RhdHNfcmlkOworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKKwl1MzIgKnZhbHMgPSBzdGF0c19yaWQudmFsczsKKworCS8qIEdldCBzdGF0cyBvdXQgb2YgdGhlIGNhcmQgKi8KKwljbGVhcl9iaXQoSk9CX1dTVEFUUywgJmxvY2FsLT5mbGFncyk7CisJaWYgKGxvY2FsLT5wb3dlcikgeworCQl1cCgmbG9jYWwtPnNlbSk7CisJCXJldHVybjsKKwl9CisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAwKTsKKwlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMCk7CisJcmVhZFN0YXRzUmlkKGxvY2FsLCAmc3RhdHNfcmlkLCBSSURfU1RBVFMsIDApOworCXVwKCZsb2NhbC0+c2VtKTsKKworCS8qIFRoZSBzdGF0dXMgKi8KKwlsb2NhbC0+d3N0YXRzLnN0YXR1cyA9IHN0YXR1c19yaWQubW9kZTsKKworCS8qIFNpZ25hbCBxdWFsaXR5IGFuZCBjby4gQnV0IHdoZXJlIGlzIHRoZSBub2lzZSBsZXZlbCA/Pz8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwucXVhbCA9IGFpcm9fZ2V0X3F1YWxpdHkoJnN0YXR1c19yaWQsICZjYXBfcmlkKTsKKwlpZiAobG9jYWwtPnJzc2kpCisJCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IDB4MTAwIC0gbG9jYWwtPnJzc2lbc3RhdHVzX3JpZC5zaWdRdWFsaXR5XS5yc3NpZEJtOworCWVsc2UKKwkJbG9jYWwtPndzdGF0cy5xdWFsLmxldmVsID0gKHN0YXR1c19yaWQubm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoICsgMzIxKSAvIDI7CisJaWYgKHN0YXR1c19yaWQubGVuID49IDEyNCkgeworCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAyNTYgLSBzdGF0dXNfcmlkLm5vaXNlZEJtOworCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDc7CisJfSBlbHNlIHsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gMDsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSAzOworCX0KKworCS8qIFBhY2tldHMgZGlzY2FyZGVkIGluIHRoZSB3aXJlbGVzcyBhZGFwdGVyIGR1ZSB0byB3aXJlbGVzcworCSAqIHNwZWNpZmljIHByb2JsZW1zICovCisJbG9jYWwtPndzdGF0cy5kaXNjYXJkLm53aWQgPSB2YWxzWzU2XSArIHZhbHNbNTddICsgdmFsc1s1OF07LyogU1NJRCBNaXNtYXRjaCAqLworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5jb2RlID0gdmFsc1s2XTsvKiBSeFdlcEVyciAqLworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5mcmFnbWVudCA9IHZhbHNbMzBdOworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzID0gdmFsc1sxMF07CisJbG9jYWwtPndzdGF0cy5kaXNjYXJkLm1pc2MgPSB2YWxzWzFdICsgdmFsc1szMl07CisJbG9jYWwtPndzdGF0cy5taXNzLmJlYWNvbiA9IHZhbHNbMzRdOworfQorCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9ICBkZXYtPnByaXY7CisKKwlpZiAoIXRlc3RfYml0KEpPQl9XU1RBVFMsICZsb2NhbC0+ZmxhZ3MpKSB7CisJCS8qIEdldCBzdGF0cyBvdXQgb2YgdGhlIGNhcmQgaWYgYXZhaWxhYmxlICovCisJCWlmIChkb3duX3RyeWxvY2soJmxvY2FsLT5zZW0pICE9IDApIHsKKwkJCXNldF9iaXQoSk9CX1dTVEFUUywgJmxvY2FsLT5mbGFncyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvY2FsLT50aHJfd2FpdCk7CisJCX0gZWxzZQorCQkJYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzKGxvY2FsKTsKKwl9CisKKwlyZXR1cm4gJmxvY2FsLT53c3RhdHM7Cit9CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisKKyNpZmRlZiBDSVNDT19FWFQKKy8qCisgKiBUaGlzIGp1c3QgdHJhbnNsYXRlcyBmcm9tIGRyaXZlciBJT0NUTCBjb2RlcyB0byB0aGUgY29tbWFuZCBjb2RlcyB0bworICogZmVlZCB0byB0aGUgcmFkaW8ncyBob3N0IGludGVyZmFjZS4gVGhpbmdzIGNhbiBiZSBhZGRlZC9kZWxldGVkCisgKiBhcyBuZWVkZWQuICBUaGlzIHJlcHJlc2VudHMgdGhlIFJFQUQgc2lkZSBvZiBjb250cm9sIEkvTyB0bworICogdGhlIGNhcmQKKyAqLworc3RhdGljIGludCByZWFkcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKSB7CisJdW5zaWduZWQgc2hvcnQgcmlkY29kZTsKKwl1bnNpZ25lZCBjaGFyICppb2J1ZjsKKwlpbnQgbGVuOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaChjb21wLT5jb21tYW5kKQorCXsKKwljYXNlIEFJUk9HQ0FQOiAgICAgIHJpZGNvZGUgPSBSSURfQ0FQQUJJTElUSUVTOyBicmVhazsKKwljYXNlIEFJUk9HQ0ZHOiAgICAgIHJpZGNvZGUgPSBSSURfQ09ORklHOworCQlpZiAodGVzdF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpKSB7CisJCQlkaXNhYmxlX01BQyAoYWksIDEpOworCQkJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKKwkJCWVuYWJsZV9NQUMgKGFpLCAmcnNwLCAxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFJUk9HU0xJU1Q6ICAgIHJpZGNvZGUgPSBSSURfU1NJRDsgICAgICAgICBicmVhazsKKwljYXNlIEFJUk9HVkxJU1Q6ICAgIHJpZGNvZGUgPSBSSURfQVBMSVNUOyAgICAgICBicmVhazsKKwljYXNlIEFJUk9HRFJWTkFNOiAgIHJpZGNvZGUgPSBSSURfRFJWTkFNRTsgICAgICBicmVhazsKKwljYXNlIEFJUk9HRUhURU5DOiAgIHJpZGNvZGUgPSBSSURfRVRIRVJFTkNBUDsgICBicmVhazsKKwljYXNlIEFJUk9HV0VQS1RNUDogIHJpZGNvZGUgPSBSSURfV0VQX1RFTVA7CisJCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gcmVhZCBXRVAga2V5cyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlicmVhazsKKwljYXNlIEFJUk9HV0VQS05WOiAgIHJpZGNvZGUgPSBSSURfV0VQX1BFUk07CisJCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gcmVhZCBXRVAga2V5cyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlicmVhazsKKwljYXNlIEFJUk9HU1RBVDogICAgIHJpZGNvZGUgPSBSSURfU1RBVFVTOyAgICAgICBicmVhazsKKwljYXNlIEFJUk9HU1RBVFNEMzI6IHJpZGNvZGUgPSBSSURfU1RBVFNERUxUQTsgICBicmVhazsKKwljYXNlIEFJUk9HU1RBVFNDMzI6IHJpZGNvZGUgPSBSSURfU1RBVFM7ICAgICAgICBicmVhazsKKyNpZmRlZiBNSUNTVVBQT1JUCisJY2FzZSBBSVJPR01JQ1NUQVRTOgorCQlpZiAoY29weV90b191c2VyKGNvbXAtPmRhdGEsICZhaS0+bWljc3RhdHMsCisJCQkJIG1pbigoaW50KWNvbXAtPmxlbiwoaW50KXNpemVvZihhaS0+bWljc3RhdHMpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwljYXNlIEFJUk9SUklEOiAgICAgIHJpZGNvZGUgPSBjb21wLT5yaWRudW07ICAgICBicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKChpb2J1ZiA9IGttYWxsb2MoUklEU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJUEM0NTAwX3JlYWRyaWQoYWkscmlkY29kZSxpb2J1ZixSSURTSVpFLCAxKTsKKwkvKiBnZXQgdGhlIGNvdW50IG9mIGJ5dGVzIGluIHRoZSByaWQgIGRvY3Mgc2F5IDFzdCAyIGJ5dGVzIGlzIGl0LgorCSAqIHRoZW4gcmV0dXJuIGl0IHRvIHRoZSB1c2VyCisJICogOS8yMi8yMDAwIEhvbm9yIHVzZXIgZ2l2ZW4gbGVuZ3RoCisJICovCisJbGVuID0gY29tcC0+bGVuOworCisJaWYgKGNvcHlfdG9fdXNlcihjb21wLT5kYXRhLCBpb2J1ZiwgbWluKGxlbiwgKGludClSSURTSVpFKSkpIHsKKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWtmcmVlIChpb2J1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEYW5nZXIgV2lsbCBSb2JpbnNvbiB3cml0ZSB0aGUgcmlkcyBoZXJlCisgKi8KKworc3RhdGljIGludCB3cml0ZXJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCkgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCAgcmlkY29kZTsKKyNpZmRlZiBNSUNTVVBQT1JUCisgICAgICAgIGludCAgZW5hYmxlZDsKKyNlbmRpZgorCVJlc3AgICAgICByc3A7CisJc3RhdGljIGludCAoKiB3cml0ZXIpKHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CisJdW5zaWduZWQgY2hhciAqaW9idWY7CisKKwkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHdyaXRlIFJJRHMgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCisJCXJldHVybiAtRUlPOworCisJcmlkY29kZSA9IDA7CisJd3JpdGVyID0gZG9fd3JpdGVyaWQ7CisKKwlzd2l0Y2goY29tcC0+Y29tbWFuZCkKKwl7CisJY2FzZSBBSVJPUFNJRFM6ICAgICByaWRjb2RlID0gUklEX1NTSUQ7ICAgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPUENBUDogICAgICByaWRjb2RlID0gUklEX0NBUEFCSUxJVElFUzsgYnJlYWs7CisJY2FzZSBBSVJPUEFQTElTVDogICByaWRjb2RlID0gUklEX0FQTElTVDsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPUENGRzogYWktPmNvbmZpZy5sZW4gPSAwOworCQkJICAgIGNsZWFyX2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQkgICAgcmlkY29kZSA9IFJJRF9DT05GSUc7ICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BXRVBLRVlOVjogcmlkY29kZSA9IFJJRF9XRVBfUEVSTTsgICAgIGJyZWFrOworCWNhc2UgQUlST1BMRUFQVVNSOiAgcmlkY29kZSA9IFJJRF9MRUFQVVNFUk5BTUU7IGJyZWFrOworCWNhc2UgQUlST1BMRUFQUFdEOiAgcmlkY29kZSA9IFJJRF9MRUFQUEFTU1dPUkQ7IGJyZWFrOworCWNhc2UgQUlST1BXRVBLRVk6ICAgcmlkY29kZSA9IFJJRF9XRVBfVEVNUDsgd3JpdGVyID0gUEM0NTAwX3dyaXRlcmlkOworCQlicmVhazsKKwljYXNlIEFJUk9QTEVBUFVTUisxOiByaWRjb2RlID0gMHhGRjJBOyAgICAgICAgICBicmVhazsKKwljYXNlIEFJUk9QTEVBUFVTUisyOiByaWRjb2RlID0gMHhGRjJCOyAgICAgICAgICBicmVhazsKKworCQkvKiB0aGlzIGlzIG5vdCByZWFsbHkgYSByaWQgYnV0IGEgY29tbWFuZCBnaXZlbiB0byB0aGUgY2FyZAorCQkgKiBzYW1lIHdpdGggTUFDIG9mZgorCQkgKi8KKwljYXNlIEFJUk9QTUFDT046CisJCWlmIChlbmFibGVfTUFDKGFpLCAmcnNwLCAxKSAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAwOworCisJCS8qCisJCSAqIEV2aWRlbnRseSB0aGlzIGNvZGUgaW4gdGhlIGFpcm8gZHJpdmVyIGRvZXMgbm90IGdldCBhIHN5bWJvbAorCQkgKiBhcyBkaXNhYmxlX01BQy4gaXQncyBwcm9iYWJseSBzbyBzaG9ydCB0aGUgY29tcGlsZXIgZG9lcyBub3QgZ2VuIG9uZS4KKwkJICovCisJY2FzZSBBSVJPUE1BQ09GRjoKKwkJZGlzYWJsZV9NQUMoYWksIDEpOworCQlyZXR1cm4gMDsKKworCQkvKiBUaGlzIGNvbW1hbmQgbWVyZWx5IGNsZWFycyB0aGUgY291bnRzIGRvZXMgbm90IGFjdHVhbGx5IHN0b3JlIGFueSBkYXRhCisJCSAqIG9ubHkgcmVhZHMgcmlkLiBCdXQgYXMgaXQgY2hhbmdlcyB0aGUgY2FyZHMgc3RhdGUsIEkgcHV0IGl0IGluIHRoZQorCQkgKiB3cml0ZXJpZCByb3V0aW5lcy4KKwkJICovCisJY2FzZSBBSVJPUFNUQ0xSOgorCQlpZiAoKGlvYnVmID0ga21hbGxvYyhSSURTSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCVBDNDUwMF9yZWFkcmlkKGFpLFJJRF9TVEFUU0RFTFRBQ0xFQVIsaW9idWYsUklEU0laRSwgMSk7CisKKyNpZmRlZiBNSUNTVVBQT1JUCisJCWVuYWJsZWQgPSBhaS0+bWljc3RhdHMuZW5hYmxlZDsKKwkJbWVtc2V0KCZhaS0+bWljc3RhdHMsMCxzaXplb2YoYWktPm1pY3N0YXRzKSk7CisJCWFpLT5taWNzdGF0cy5lbmFibGVkID0gZW5hYmxlZDsKKyNlbmRpZgorCisJCWlmIChjb3B5X3RvX3VzZXIoY29tcC0+ZGF0YSwgaW9idWYsCisJCQkJIG1pbigoaW50KWNvbXAtPmxlbiwgKGludClSSURTSVpFKSkpIHsKKwkJCWtmcmVlIChpb2J1Zik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlrZnJlZSAoaW9idWYpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsJLyogQmxhcmchICovCisJfQorCWlmKGNvbXAtPmxlbiA+IFJJRFNJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChpb2J1ZiA9IGttYWxsb2MoUklEU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGlvYnVmLGNvbXAtPmRhdGEsY29tcC0+bGVuKSkgeworCQlrZnJlZSAoaW9idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY29tcC0+Y29tbWFuZCA9PSBBSVJPUENGRykgeworCQlDb25maWdSaWQgKmNmZyA9IChDb25maWdSaWQgKilpb2J1ZjsKKworCQlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFpLT5mbGFncykpCisJCQljZmctPm9wbW9kZSB8PSBNT0RFX01JQzsKKworCQlpZiAoKGNmZy0+b3Btb2RlICYgMHhGRikgPT0gTU9ERV9TVEFfSUJTUykKKwkJCXNldF9iaXQgKEZMQUdfQURIT0MsICZhaS0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQgKEZMQUdfQURIT0MsICZhaS0+ZmxhZ3MpOworCX0KKworCWlmKCgqd3JpdGVyKShhaSwgcmlkY29kZSwgaW9idWYsY29tcC0+bGVuLDEpKSB7CisJCWtmcmVlIChpb2J1Zik7CisJCXJldHVybiAtRUlPOworCX0KKwlrZnJlZSAoaW9idWYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFuY2lsbGFyeSBmbGFzaCAvIG1vZCBmdW5jdGlvbnMgbXVjaCBibGFjayBtYWdpYyBsdXJrZXMgaGVyZSAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIEZsYXNoIGNvbW1hbmQgc3dpdGNoIHRhYmxlCisgKi8KKworaW50IGZsYXNoY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKSB7CisJaW50IHo7CisJaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKik7CisJaW50IHNldGZsYXNobW9kZShzdHJ1Y3QgYWlyb19pbmZvICopOworCWludCBmbGFzaGdjaGFyKHN0cnVjdCBhaXJvX2luZm8gKixpbnQsaW50KTsKKwlpbnQgZmxhc2hwY2hhcihzdHJ1Y3QgYWlyb19pbmZvICosaW50LGludCk7CisJaW50IGZsYXNocHV0YnVmKHN0cnVjdCBhaXJvX2luZm8gKik7CisJaW50IGZsYXNocmVzdGFydChzdHJ1Y3QgYWlyb19pbmZvICosc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKwkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIG1vZGlmeSBmbGFzaCAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaChjb21wLT5jb21tYW5kKQorCXsKKwljYXNlIEFJUk9GTFNIUlNUOgorCQlyZXR1cm4gY21kcmVzZXQoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpOworCisJY2FzZSBBSVJPRkxTSFNURkw6CisJCWlmICghKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KS0+Zmxhc2ggJiYKKwkJCSgoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpLT5mbGFzaCA9IGttYWxsb2MgKEZMQVNIU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIHNldGZsYXNobW9kZSgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdik7CisKKwljYXNlIEFJUk9GTFNIR0NIUjogLyogR2V0IGNoYXIgZnJvbSBhdXggKi8KKwkJaWYoY29tcC0+bGVuICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmeixjb21wLT5kYXRhLGNvbXAtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIGZsYXNoZ2NoYXIoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYseiw4MDAwKTsKKworCWNhc2UgQUlST0ZMU0hQQ0hSOiAvKiBTZW5kIGNoYXIgdG8gY2FyZC4gKi8KKwkJaWYoY29tcC0+bGVuICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmeixjb21wLT5kYXRhLGNvbXAtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIGZsYXNocGNoYXIoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYseiw4MDAwKTsKKworCWNhc2UgQUlST0ZMUFVUQlVGOiAvKiBTZW5kIDMyayB0byBjYXJkICovCisJCWlmICghKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KS0+Zmxhc2gpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYoY29tcC0+bGVuID4gRkxBU0hTSVpFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKGNvcHlfZnJvbV91c2VyKCgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoLGNvbXAtPmRhdGEsY29tcC0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWZsYXNocHV0YnVmKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEFJUk9SRVNUQVJUOgorCQlpZihmbGFzaHJlc3RhcnQoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYsZGV2KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNkZWZpbmUgRkxBU0hfQ09NTUFORCAgMHg3ZTdlCisKKy8qCisgKiBTVEVQIDEpCisgKiBEaXNhYmxlIE1BQyBhbmQgZG8gc29mdCByZXNldCBvbgorICogY2FyZC4KKyAqLworCitpbnQgY21kcmVzZXQoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisKKwlpZighd2FpdGJ1c3kgKGFpKSl7CisJCXByaW50ayhLRVJOX0lORk8gIldhaXRidXN5IGhhbmcgYmVmb3JlIFJFU0VUXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlPVVQ0NTAwKGFpLENPTU1BTkQsQ01EX1NPRlRSRVNFVCk7CisKKwlzc2xlZXAoMSk7CQkJLyogV0FTIDYwMCAxMi83LzAwICovCisKKwlpZighd2FpdGJ1c3kgKGFpKSl7CisJCXByaW50ayhLRVJOX0lORk8gIldhaXRidXN5IGhhbmcgQUZURVIgUkVTRVRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU1RFUCAyKQorICogUHV0IHRoZSBjYXJkIGluIGxlZ2VuZGFyeSBmbGFzaAorICogbW9kZQorICovCisKK2ludCBzZXRmbGFzaG1vZGUgKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJc2V0X2JpdCAoRkxBR19GTEFTSElORywgJmFpLT5mbGFncyk7CisKKwlPVVQ0NTAwKGFpLCBTV1MwLCBGTEFTSF9DT01NQU5EKTsKKwlPVVQ0NTAwKGFpLCBTV1MxLCBGTEFTSF9DT01NQU5EKTsKKwlpZiAocHJvYmUpIHsKKwkJT1VUNDUwMChhaSwgU1dTMCwgRkxBU0hfQ09NTUFORCk7CisJCU9VVDQ1MDAoYWksIENPTU1BTkQsMHgxMCk7CisJfSBlbHNlIHsKKwkJT1VUNDUwMChhaSwgU1dTMiwgRkxBU0hfQ09NTUFORCk7CisJCU9VVDQ1MDAoYWksIFNXUzMsIEZMQVNIX0NPTU1BTkQpOworCQlPVVQ0NTAwKGFpLCBDT01NQU5ELDApOworCX0KKwltc2xlZXAoNTAwKTsJCS8qIDUwMG1zIGRlbGF5ICovCisKKwlpZighd2FpdGJ1c3koYWkpKSB7CisJCWNsZWFyX2JpdCAoRkxBR19GTEFTSElORywgJmFpLT5mbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gIldhaXRidXN5IGhhbmcgYWZ0ZXIgc2V0Zmxhc2ggbW9kZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUHV0IGNoYXJhY3RlciB0byBTV1MwIHdhaXQgZm9yIGR3ZWxsdGltZQorICogeCA1MHVzIGZvciAgZWNobyAuCisgKi8KKworaW50IGZsYXNocGNoYXIoc3RydWN0IGFpcm9faW5mbyAqYWksaW50IGJ5dGUsaW50IGR3ZWxsdGltZSkgeworCWludCBlY2hvOworCWludCB3YWl0dGltZTsKKworCWJ5dGUgfD0gMHg4MDAwOworCisJaWYoZHdlbGx0aW1lID09IDAgKQorCQlkd2VsbHRpbWUgPSAyMDA7CisKKwl3YWl0dGltZT1kd2VsbHRpbWU7CisKKwkvKiBXYWl0IGZvciBidXN5IGJpdCBkMTUgdG8gZ28gZmFsc2UgaW5kaWNhdGluZyBidWZmZXIgZW1wdHkgKi8KKwl3aGlsZSAoKElONDUwMCAoYWksIFNXUzApICYgMHg4MDAwKSAmJiB3YWl0dGltZSA+IDApIHsKKwkJdWRlbGF5ICg1MCk7CisJCXdhaXR0aW1lIC09IDUwOworCX0KKworCS8qIHRpbWVvdXQgZm9yIGJ1c3kgY2xlYXIgd2FpdCAqLworCWlmKHdhaXR0aW1lIDw9IDAgKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmxhc2ggcHV0Y2hhciBidXN5d2FpdCB0aW1lb3V0ISBcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFBvcnQgaXMgY2xlYXIgbm93IHdyaXRlIGJ5dGUgYW5kIHdhaXQgZm9yIGl0IHRvIGVjaG8gYmFjayAqLworCWRvIHsKKwkJT1VUNDUwMChhaSxTV1MwLGJ5dGUpOworCQl1ZGVsYXkoNTApOworCQlkd2VsbHRpbWUgLT0gNTA7CisJCWVjaG8gPSBJTjQ1MDAoYWksU1dTMSk7CisJfSB3aGlsZSAoZHdlbGx0aW1lID49IDAgJiYgZWNobyAhPSBieXRlKTsKKworCU9VVDQ1MDAoYWksU1dTMSwwKTsKKworCXJldHVybiAoZWNobyA9PSBieXRlKSA/IDAgOiAtRUlPOworfQorCisvKgorICogR2V0IGEgY2hhcmFjdGVyIGZyb20gdGhlIGNhcmQgbWF0Y2hpbmcgbWF0Y2hieXRlCisgKiBTdGVwIDMpCisgKi8KK2ludCBmbGFzaGdjaGFyKHN0cnVjdCBhaXJvX2luZm8gKmFpLGludCBtYXRjaGJ5dGUsaW50IGR3ZWxsdGltZSl7CisJaW50ICAgICAgICAgICByY2hhcjsKKwl1bnNpZ25lZCBjaGFyIHJieXRlPTA7CisKKwlkbyB7CisJCXJjaGFyID0gSU40NTAwKGFpLFNXUzEpOworCisJCWlmKGR3ZWxsdGltZSAmJiAhKDB4ODAwMCAmIHJjaGFyKSl7CisJCQlkd2VsbHRpbWUgLT0gMTA7CisJCQltZGVsYXkoMTApOworCQkJY29udGludWU7CisJCX0KKwkJcmJ5dGUgPSAweGZmICYgcmNoYXI7CisKKwkJaWYoIChyYnl0ZSA9PSBtYXRjaGJ5dGUpICYmICgweDgwMDAgJiByY2hhcikgKXsKKwkJCU9VVDQ1MDAoYWksU1dTMSwwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmKCByYnl0ZSA9PSAweDgxIHx8IHJieXRlID09IDB4ODIgfHwgcmJ5dGUgPT0gMHg4MyB8fCByYnl0ZSA9PSAweDFhIHx8IDB4ZmZmZiA9PSByY2hhcikKKwkJCWJyZWFrOworCQlPVVQ0NTAwKGFpLFNXUzEsMCk7CisKKwl9d2hpbGUoZHdlbGx0aW1lID4gMCk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBUcmFuc2ZlciAzMmsgb2YgZmlybXdhcmUgZGF0YSBmcm9tIHVzZXIgYnVmZmVyIHRvIG91ciBidWZmZXIgYW5kCisgKiBzZW5kIHRvIHRoZSBjYXJkCisgKi8KKworaW50IGZsYXNocHV0YnVmKHN0cnVjdCBhaXJvX2luZm8gKmFpKXsKKwlpbnQgICAgICAgICAgICBud29yZHM7CisKKwkvKiBXcml0ZSBzdHVmZiAqLworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJbWVtY3B5X3RvaW8oYWktPnBjaWF1eCArIDB4ODAwMCwgYWktPmZsYXNoLCBGTEFTSFNJWkUpOworCWVsc2UgeworCQlPVVQ0NTAwKGFpLEFVWFBBR0UsMHgxMDApOworCQlPVVQ0NTAwKGFpLEFVWE9GRiwwKTsKKworCQlmb3IobndvcmRzPTA7bndvcmRzICE9IEZMQVNIU0laRSAvIDI7bndvcmRzKyspeworCQkJT1VUNDUwMChhaSxBVVhEQVRBLGFpLT5mbGFzaFtud29yZHNdICYgMHhmZmZmKTsKKwkJfQorCX0KKwlPVVQ0NTAwKGFpLFNXUzAsMHg4MDAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICoKKyAqLworaW50IGZsYXNocmVzdGFydChzdHJ1Y3QgYWlyb19pbmZvICphaSxzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KXsKKwlpbnQgICAgaSxzdGF0dXM7CisKKwlzc2xlZXAoMSk7CQkJLyogQWRkZWQgMTIvNy8wMCAqLworCWNsZWFyX2JpdCAoRkxBR19GTEFTSElORywgJmFpLT5mbGFncyk7CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSkgeworCQlzdGF0dXMgPSBtcGlfaW5pdF9kZXNjcmlwdG9ycyhhaSk7CisJCWlmIChzdGF0dXMgIT0gU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCXN0YXR1cyA9IHNldHVwX2NhcmQoYWksIGRldi0+ZGV2X2FkZHIsIDEpOworCisJaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTOyBpKysgKSB7CisJCQlhaS0+Zmlkc1tpXSA9IHRyYW5zbWl0X2FsbG9jYXRlCisJCQkJKCBhaSwgMjMxMiwgaSA+PSBNQVhfRklEUyAvIDIgKTsKKwkJfQorCisJc3NsZWVwKDEpOwkJCS8qIEFkZGVkIDEyLzcvMDAgKi8KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIENJU0NPX0VYVCAqLworCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgICAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgSW4gYWRkaXRpb246CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAgICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAgICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgICBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgICAgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgICAgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCittb2R1bGVfaW5pdChhaXJvX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFpcm9fY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjUzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWlyb25ldCBkcml2ZXIgZm9yIDQ1MDAgYW5kIDQ4MDAgc2VyaWVzIGNhcmRzCisKKyAgICBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgYm90aCB0aGUgR1BMIHZlcnNpb24gMiBhbmQgQlNEIGxpY2Vuc2VzLgorICAgIEVpdGhlciBsaWNlbnNlIG1heSBiZSB1c2VkLiAgVGhlIHJlc3BlY3RpdmUgbGljZW5zZXMgYXJlIGZvdW5kIGF0CisgICAgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBieSBCZW5qYW1pbiBSZWVkIDxicmVlZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgaW5jbHVkaW5nIHBvcnRpb25zIG9mIHdoaWNoIGNvbWUgZnJvbSB0aGUgQWlyb25ldCBQQzQ1MDAKKyAgICBEZXZlbG9wZXIncyBSZWZlcmVuY2UgTWFudWFsIGFuZCB1c2VkIHdpdGggcGVybWlzc2lvbi4gIENvcHlyaWdodAorICAgIChDKSAxOTk5IEJlbmphbWluIFJlZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgUGVybWlzc2lvbiB0byB1c2UKKyAgICBjb2RlIGluIHRoZSBEZXZlbG9wZXIncyBtYW51YWwgd2FzIGdyYW50ZWQgZm9yIHRoaXMgZHJpdmVyIGJ5CisgICAgQWlyb25ldC4KKworICAgIEluIGFkZGl0aW9uIHRoaXMgbW9kdWxlIHdhcyBkZXJpdmVkIGZyb20gZHVtbXlfY3MuCisgICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIGR1bW15X2NzIGlzIERhdmlkIEEuIEhpbmRzCisgICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXworI2luY2x1ZGUgPHBjbWNpYS9rX2NvbXBhdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICAgQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAgIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICIkUmV2aXNpb246IDEuMiAkIjsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBSZWVkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIENpc2NvL0Fpcm9uZXQgODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IFwKKyAgICAgICAgICAgICAgICAgICBjYXJkcy4gIFRoaXMgaXMgdGhlIG1vZHVsZSB0aGF0IGxpbmtzIHRoZSBQQ01DSUEgY2FyZCBcCisJCSAgIHdpdGggdGhlIGFpcm8gbW9kdWxlLiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkFpcm9uZXQgNDUwMCwgNDgwMCBhbmQgQ2lzY28gMzQwIFBDTUNJQSBjYXJkcyIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLgorICAgSXQgd2lsbCBiZSBjYWxsZWQgYnkgQ2FyZCBTZXJ2aWNlcyB3aGVuIGFuIGFwcHJvcHJpYXRlIGNhcmQgc3RhdHVzCisgICBldmVudCBpcyByZWNlaXZlZC4gIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUKKyAgIHVzZWQgdG8gY29uZmlndXJlIG9yIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQKKyAgIGluc2VydGlvbiBhbmQgZWplY3Rpb24gZXZlbnRzLiAgVGhleSBhcmUgaW52b2tlZCBmcm9tIHRoZSBhaXJvX2NzCisgICBldmVudCBoYW5kbGVyLiAKKyovCisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2Fpcm9fY2FyZCggaW50LCBpbnQsIGludCwgc3RydWN0IGRldmljZSAqICk7Cit2b2lkIHN0b3BfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKK2ludCByZXNldF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKworc3RhdGljIHZvaWQgYWlyb19jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBhaXJvX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGFpcm9fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworLyoKKyAgIFRoZSBhdHRhY2goKSBhbmQgZGV0YWNoKCkgZW50cnkgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveQorICAgImluc3RhbmNlcyIgb2YgdGhlIGRyaXZlciwgd2hlcmUgZWFjaCBpbnN0YW5jZSByZXByZXNlbnRzIGV2ZXJ5dGhpbmcKKyAgIG5lZWRlZCB0byBtYW5hZ2Ugb25lIGFjdHVhbCBQQ01DSUEgY2FyZC4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICphaXJvX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGFpcm9fZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qCisgICBZb3UnbGwgYWxzbyBuZWVkIHRvIHByb3RvdHlwZSBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgIGJlIHVzZWQgdG8gdGFsayB0byB5b3VyIGRldmljZS4gIFNlZSAncGNtZW1fY3MnIGZvciBhIGdvb2QgZXhhbXBsZQorICAgb2YgYSBmdWxseSBzZWxmLXN1ZmZpY2llbnQgZHJpdmVyOyB0aGUgb3RoZXIgZHJpdmVycyByZWx5IG1vcmUgb3IKKyAgIGxlc3Mgb24gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KKyovCisKKy8qCisgICBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICAgZGF0YWJhc2UuCisqLworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJhaXJvX2NzIjsKKworLyoKKyAgIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlICBhaXJvbmV0IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisKKyAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICAgbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CisKKy8qCisgICBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKworICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICAgb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICAgbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgc2hvdWxkbid0IGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKworICAgSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIHByb3ZpZGUgYSBmbGFnIHRvIGluZGljYXRlIGlmIGEgZGV2aWNlIGlzCisgICAic3RvcHBlZCIgZHVlIHRvIGEgcG93ZXIgbWFuYWdlbWVudCBldmVudCwgb3IgY2FyZCBlamVjdGlvbi4gIFRoZQorICAgZGV2aWNlIElPIHJvdXRpbmVzIGNhbiB1c2UgYSBmbGFnIGxpa2UgdGhpcyB0byB0aHJvdHRsZSBJTyB0byBhCisgICBjYXJkIHRoYXQgaXMgbm90IHJlYWR5IHRvIGFjY2VwdCBpdC4KKyovCisgICAKK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CisJZGV2X25vZGVfdAlub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OworfSBsb2NhbF9pbmZvX3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYWlyb19hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLgorICAKKyAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICphaXJvX2F0dGFjaCh2b2lkKQoreworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0OworCQorCURFQlVHKDAsICJhaXJvX2F0dGFjaCgpXG4iKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisJbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlyb19jczogbm8gbWVtb3J5IGZvciBuZXcgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKwkKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOworCQorCS8qCisJICBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbiBnbyBoZXJlLiAgSW4gdGhpcworCSAgY2xpZW50LCB3ZSBhc3N1bWUgdmVyeSBsaXR0bGUsIGFuZCByZWx5IG9uIHRoZSBDSVMgZm9yIGFsbW9zdAorCSAgZXZlcnl0aGluZy4gIEluIG1vc3QgY2xpZW50cywgbWFueSBkZXRhaWxzIChpLmUuLCBudW1iZXIsIHNpemVzLAorCSAgYW5kIGF0dHJpYnV0ZXMgb2YgSU8gd2luZG93cykgYXJlIGZpeGVkIGJ5IHRoZSBuYXR1cmUgb2YgdGhlCisJICBkZXZpY2UsIGFuZCBjYW4gYmUgaGFyZC13aXJlZCBoZXJlLgorCSovCisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKwlsaW5rLT5jb25mLlZjYyA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCQorCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCisJbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvY2FsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlyb19jczogbm8gbWVtb3J5IGZvciBuZXcgZGV2aWNlXG4iKTsKKwkJa2ZyZWUgKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGxvY2FsLCAwLCBzaXplb2YobG9jYWxfaW5mb190KSk7CisJbGluay0+cHJpdiA9IGxvY2FsOworCQorCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYWlyb19ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJYWlyb19kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlyZXR1cm4gbGluazsKK30gLyogYWlyb19hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGFpcm9fZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCQorCURFQlVHKDAsICJhaXJvX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisJCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworCWlmICgqbGlua3AgPT0gTlVMTCkKKwkJcmV0dXJuOworCQorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCWFpcm9fcmVsZWFzZShsaW5rKTsKKwkKKwlpZiAoICgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiApIHsKKwkJc3RvcF9haXJvX2NhcmQoICgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiwgMCApOworCX0KKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSBOVUxMOyAgIAorCQorCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCQorCQorCQorCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJaWYgKGxpbmstPnByaXYpIHsKKwkJa2ZyZWUobGluay0+cHJpdik7CisJfQorCWtmcmVlKGxpbmspOworCQorfSAvKiBhaXJvX2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIGFpcm9fY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhaXJvX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCWNsaWVudF9oYW5kbGVfdCBoYW5kbGU7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCWxvY2FsX2luZm9fdCAqZGV2OworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwl3aW5fcmVxX3QgcmVxOworCW1lbXJlcV90IG1hcDsKKwkKKwloYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisJZGV2ID0gbGluay0+cHJpdjsKKworCURFQlVHKDAsICJhaXJvX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisJCisJLyoKKwkgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorCSAgcmVnaXN0ZXJzLgorCSovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCQorCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKwkKKwkvKgorCSAgSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cmllcywKKwkgIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKKwkgIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywgYW5kIGludGVycnVwdCBzZXR0aW5ncy4KKwkgIAorCSAgV2UgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FyZCB0byBiZSBjb25maWd1cmVkOiB3ZSB1c2UKKwkgIGp1c3QgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQ0lTLiAgSW4gYW4gaWRlYWwgd29ybGQsCisJICB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzIGEgY29tcGxldGUKKwkgIGFuZCBhY2N1cmF0ZSBDSVMuICBJbiBwcmFjdGljZSwgYSBkcml2ZXIgdXN1YWxseSAia25vd3MiIG1vc3Qgb2YKKwkgIHRoZXNlIHRoaW5ncyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIENJUywgYW5kIG1vc3QgY2xpZW50IGRyaXZlcnMKKwkgIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KKwkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKKwkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQkKKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKSBkZmx0ID0gKmNmZzsKKwkJaWYgKGNmZy0+aW5kZXggPT0gMCkgZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKwkJCisJCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLworCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisJCX0KKwkJCisJCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCQkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WY2MgPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCWVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WY2MgPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCQorCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQljZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCQorCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKwkJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKQorCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKwkJCisJCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgeworCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOworCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7CisJCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJfQorCQl9CisJCQorCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pICE9IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCQorCQkvKgorCQkgIE5vdyBzZXQgdXAgYSBjb21tb24gbWVtb3J5IHdpbmRvdywgaWYgbmVlZGVkLiAgVGhlcmUgaXMgcm9vbQorCQkgIGluIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSBmb3Igb25lIG1lbW9yeSB3aW5kb3cgaGFuZGxlLAorCQkgIGJ1dCBpZiB0aGUgYmFzZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBzYXZlZCwgb3IgaWYgbXVsdGlwbGUKKwkJICB3aW5kb3dzIGFyZSBuZWVkZWQsIHRoZSBpbmZvIHNob3VsZCBnbyBpbiB0aGUgcHJpdmF0ZSBkYXRhCisJCSAgc3RydWN0dXJlIGZvciB0aGlzIGRldmljZS4KKwkJICAKKwkJICBOb3RlIHRoYXQgdGhlIG1lbW9yeSB3aW5kb3cgYmFzZSBpcyBhIHBoeXNpY2FsIGFkZHJlc3MsIGFuZAorCQkgIG5lZWRzIHRvIGJlIG1hcHBlZCB0byB2aXJ0dWFsIHNwYWNlIHdpdGggaW9yZW1hcCgpIGJlZm9yZSBpdAorCQkgIGlzIHVzZWQuCisJCSovCisJCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0Lm1lbS5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9tZW1fdCAqbWVtID0KKwkJCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC5tZW07CisJCQlyZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKKwkJCXJlcS5CYXNlID0gbWVtLT53aW5bMF0uaG9zdF9hZGRyOworCQkJcmVxLlNpemUgPSBtZW0tPndpblswXS5sZW47CisJCQlyZXEuQWNjZXNzU3BlZWQgPSAwOworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCW1hcC5QYWdlID0gMDsgbWFwLkNhcmRPZmZzZXQgPSBtZW0tPndpblswXS5jYXJkX2FkZHI7CisJCQlpZiAocGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtYXApICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQl9CisJCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KKwkJYnJlYWs7CisJCQorCW5leHRfZW50cnk6CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCQorICAgIC8qCisgICAgICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCisgICAgICBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUKKyAgICAgIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuCisgICAgKi8KKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQorCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisJCisJLyoKKwkgIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCisJICBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgorCSovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IAorCQlpbml0X2Fpcm9fY2FyZCggbGluay0+aXJxLkFzc2lnbmVkSVJRLAorCQkJCWxpbmstPmlvLkJhc2VQb3J0MSwgMSwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSApOworCWlmICghKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2KSBnb3RvIGNzX2ZhaWxlZDsKKwkKKwkvKgorCSAgQXQgdGhpcyBwb2ludCwgdGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlKHMpIG5lZWQgdG8gYmUKKwkgIGluaXRpYWxpemVkIGFuZCBhcnJhbmdlZCBpbiBhIGxpbmtlZCBsaXN0IGF0IGxpbmstPmRldi4KKwkqLworCXN0cmNweShkZXYtPm5vZGUuZGV2X25hbWUsICgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2Rldi0+bmFtZSApOworCWRldi0+bm9kZS5tYWpvciA9IGRldi0+bm9kZS5taW5vciA9IDA7CisJbGluay0+ZGV2ID0gJmRldi0+bm9kZTsKKwkKKwkvKiBGaW5hbGx5LCByZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGluZGV4IDB4JTAyeDogVmNjICVkLiVkIiwKKwkgICAgICAgZGV2LT5ub2RlLmRldl9uYW1lLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAorCSAgICAgICBsaW5rLT5jb25mLlZjYy8xMCwgbGluay0+Y29uZi5WY2MlMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpCisJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEvMTAsIGxpbmstPmNvbmYuVnBwMSUxMCk7CisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CisJaWYgKGxpbmstPndpbikKKwkJcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCByZXEuQmFzZSwKKwkJICAgICAgIHJlcS5CYXNlK3JlcS5TaXplLTEpOworCXByaW50aygiXG4iKTsKKwkKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCXJldHVybjsKKwkKKyBjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJYWlyb19yZWxlYXNlKGxpbmspOworCQorfSAvKiBhaXJvX2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBhaXJvX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlCisgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhaXJvX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlERUJVRygwLCAiYWlyb19yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKwkKKwkvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworCWxpbmstPmRldiA9IE5VTEw7CisJCisJLyoKKwkgIEluIGEgbm9ybWFsIGRyaXZlciwgYWRkaXRpb25hbCBjb2RlIG1heSBiZSBuZWVkZWQgdG8gcmVsZWFzZQorCSAgb3RoZXIga2VybmVsIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UuIAorCSovCisJCisJLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworCWlmIChsaW5rLT53aW4pCisJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKworICBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYQorICBwcml2YXRlIGZsYWcgdG8gYmxvY2sgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoaXMgZGV2aWNlLiAgQWxsIHRoZQorICBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnCisgIHRvIG1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYWlyb19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGxpbmstPnByaXY7CisJCisJREVCVUcoMSwgImFpcm9fZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCQorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJCWFpcm9fcmVsZWFzZShsaW5rKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJYWlyb19jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobG9jYWwtPmV0aF9kZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCXJlc2V0X2Fpcm9fY2FyZChsb2NhbC0+ZXRoX2Rldik7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9IC8qIGFpcm9fZXZlbnQgKi8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGFpcm9fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiYWlyb19jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGFpcm9fYXR0YWNoLAorCS5kZXRhY2gJCT0gYWlyb19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IGFpcm9fY3NfaW5pdCh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZhaXJvX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fY3NfY2xlYW51cCh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIEluIGFkZGl0aW9uOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbi4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICAgIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICAgIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAKKyovCisKK21vZHVsZV9pbml0KGFpcm9fY3NfaW5pdCk7Cittb2R1bGVfZXhpdChhaXJvX2NzX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGMyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qIGFpcnBvcnQuYworICoKKyAqIEEgZHJpdmVyIGZvciAiSGVybWVzIiBjaGlwc2V0IGJhc2VkIEFwcGxlIEFpcnBvcnQgd2lyZWxlc3MKKyAqIGNhcmQuCisgKgorICogQ29weXJpZ2h0IG5vdGljZSAmIHJlbGVhc2Ugbm90ZXMgaW4gZmlsZSBvcmlub2NvLmMKKyAqIAorICogTm90ZSBzcGVjaWZpYyB0byBhaXJwb3J0IHN0dWI6CisgKiAKKyAqICAwLjA1IDogZmlyc3QgdmVyc2lvbiBvZiB0aGUgbmV3IHNwbGl0IGRyaXZlcgorICogIDAuMDYgOiBmaXggcG9zc2libGUgaGFuZyBvbiBwb3dlcnVwLCBhZGQgc2xlZXAgc3VwcG9ydAorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFpcnBvcnQiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisjZGVmaW5lIEFJUlBPUlRfSU9fTEVOCSgweDEwMDApCS8qIG9uZSBwYWdlICovCisKK3N0cnVjdCBhaXJwb3J0IHsKKwlzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2OworCXZvaWQgX19pb21lbSAqdmFkZHI7CisJaW50IGlycV9yZXF1ZXN0ZWQ7CisJaW50IG5kZXZfcmVnaXN0ZXJlZDsKK307CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFpcnBvcnQgZW50ZXJpbmcgc2xlZXAgbW9kZVxuIiwgZGV2LT5uYW1lKTsKKworCWVyciA9IG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaHdfdW5hdmFpbGFibGUgb24gUEJPT0tfU0xFRVBfTk9XXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUEJPT0tfU0xFRVBfTk9XOiBFcnJvciAlZCBkb3duaW5nIGludGVyZmFjZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWlycG9ydF9yZXN1bWUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogQWlycG9ydCB3YWtpbmcgdXBcbiIsIGRldi0+bmFtZSk7CisKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDEpOworCW1zbGVlcCgyMDApOworCisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwllcnIgPSBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmUtaW5pdGlhbGl6aW5nIGZpcm13YXJlIG9uIFBCT09LX1dBS0VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCisJaWYgKHByaXYtPm9wZW4gJiYgKCEgcHJpdi0+aHdfdW5hdmFpbGFibGUpKSB7CisJCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmVzdGFydGluZyBjYXJkIG9uIFBCT09LX1dBS0VcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCX0KKworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfZGV0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWlycG9ydCAqY2FyZCA9IHByaXYtPmNhcmQ7CisKKwlpZiAoY2FyZC0+bmRldl9yZWdpc3RlcmVkKQorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWNhcmQtPm5kZXZfcmVnaXN0ZXJlZCA9IDA7CisKKwlpZiAoY2FyZC0+aXJxX3JlcXVlc3RlZCkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJY2FyZC0+aXJxX3JlcXVlc3RlZCA9IDA7CisKKwlpZiAoY2FyZC0+dmFkZHIpCisJCWlvdW5tYXAoY2FyZC0+dmFkZHIpOworCWNhcmQtPnZhZGRyID0gTlVMTDsKKworCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2UobWRldiwgMCk7CisKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDApOworCXNzbGVlcCgxKTsKKworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlycG9ydF9oYXJkX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJLyogSXQgd291bGQgYmUgbmljZSB0byBwb3dlciBjeWNsZSB0aGUgQWlycG9ydCBmb3IgYSByZWFsIGhhcmQKKwkgKiByZXNldCwgYnV0IGZvciBzb21lIHJlYXNvbiBhbHRob3VnaCBpdCBhcHBlYXJzIHRvCisJICogcmUtaW5pdGlhbGl6ZSBwcm9wZXJseSwgaXQgZmFsbHMgaW4gYSBzY3JlYW1pbmcgaGVhcAorCSAqIHNob3J0bHkgYWZ0ZXJ3YXJkcy4gKi8KKyNpZiAwCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7CisJc3RydWN0IGFpcnBvcnQgKmNhcmQgPSBwcml2LT5jYXJkOworCisJLyogVml0YWxseSBpbXBvcnRhbnQuICBJZiB3ZSBkb24ndCBkbyB0aGlzIGl0IHNlZW1zIHdlIGdldCBhbgorCSAqIGludGVycnVwdCBzb21ld2hlcmUgZHVyaW5nIHRoZSBwb3dlciBjeWNsZSwgc2luY2UKKwkgKiBod191bmF2YWlsYWJsZSBpcyBhbHJlYWR5IHNldCBpdCBkb2Vzbid0IGdldCBBQ0tlZCwgd2UgZ2V0CisJICogaW50byBhbiBpbnRlcnJ1cHQgbG9vcCBhbmQgdGhlIHRoZSBQTVUgZGVjaWRlcyB0byB0dXJuIHVzCisJICogb2ZmLiAqLworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShjYXJkLT5tZGV2KSwgMCwgMCk7CisJc3NsZWVwKDEpOworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShjYXJkLT5tZGV2KSwgMCwgMSk7CisJc3NsZWVwKDEpOworCisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJc3NsZWVwKDEpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWlycG9ydF9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFpcnBvcnQgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJaGVybWVzX3QgKmh3OworCisJaWYgKG1hY2lvX3Jlc291cmNlX2NvdW50KG1kZXYpIDwgMSB8fCBtYWNpb19pcnFfY291bnQobWRldikgPCAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIldyb25nIGludGVycnVwdC9hZGRyZXNzZXMgaW4gT0YgdHJlZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCBhaXJwb3J0X2hhcmRfcmVzZXQpOworCWlmICghIGRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2FyZCA9IHByaXYtPmNhcmQ7CisKKwlodyA9ICZwcml2LT5odzsKKwljYXJkLT5tZGV2ID0gbWRldjsKKworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlKG1kZXYsIDAsICJhaXJwb3J0IikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuJ3QgcmVxdWVzdCBJTyByZXNvdXJjZSAhXG4iKTsKKwkJZnJlZV9vcmlub2NvZGV2KGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJm1kZXYtPm9mZGV2LmRldik7CisKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBkZXYpOworCisJLyogU2V0dXAgaW50ZXJydXB0cyAmIGJhc2UgYWRkcmVzcyAqLworCWRldi0+aXJxID0gbWFjaW9faXJxKG1kZXYsIDApOworCXBoeXNfYWRkciA9IG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApOyAgLyogUGh5c2ljYWwgYWRkcmVzcyAqLworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiUGh5c2ljYWwgYWRkcmVzcyAlbHhcbiIsIHBoeXNfYWRkcik7CisJZGV2LT5iYXNlX2FkZHIgPSBwaHlzX2FkZHI7CisJY2FyZC0+dmFkZHIgPSBpb3JlbWFwKHBoeXNfYWRkciwgQUlSUE9SVF9JT19MRU4pOworCWlmICghY2FyZC0+dmFkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWhlcm1lc19zdHJ1Y3RfaW5pdChodywgY2FyZC0+dmFkZHIsIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HKTsKKwkJCisJLyogUG93ZXIgdXAgY2FyZCAqLworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgMCwgMSk7CisJc3NsZWVwKDEpOworCisJLyogUmVzZXQgaXQgYmVmb3JlIHdlIGdldCB0aGUgaW50ZXJydXB0ICovCisJaGVybWVzX2luaXQoaHcpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBvcmlub2NvX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkbid0IGdldCBJUlEgJWRcbiIsIGRldi0+aXJxKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWNhcmQtPmlycV9yZXF1ZXN0ZWQgPSAxOworCisJLyogVGVsbCB0aGUgc3RhY2sgd2UgZXhpc3QgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJDYXJkIHJlZ2lzdGVyZWQgZm9yIGludGVyZmFjZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwljYXJkLT5uZGV2X3JlZ2lzdGVyZWQgPSAxOworCXJldHVybiAwOworIGZhaWxlZDoKKwlhaXJwb3J0X2RldGFjaChtZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30JCQkJLyogYWlycG9ydF9hdHRhY2ggKi8KKworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4pIjsKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgQXBwbGUgQWlycG9ydCB3aXJlbGVzcyBjYXJkLiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCitzdGF0aWMgc3RydWN0IG9mX21hdGNoIGFpcnBvcnRfbWF0Y2hbXSA9IAoreworCXsKKwkubmFtZSAJCT0gInJhZGlvIiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgYWlycG9ydF9kcml2ZXIgPSAKK3sKKwkubmFtZSAJCT0gRFJJVkVSX05BTUUsCisJLm1hdGNoX3RhYmxlCT0gYWlycG9ydF9tYXRjaCwKKwkucHJvYmUJCT0gYWlycG9ydF9hdHRhY2gsCisJLnJlbW92ZQkJPSBhaXJwb3J0X2RldGFjaCwKKwkuc3VzcGVuZAk9IGFpcnBvcnRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFpcnBvcnRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfYWlycG9ydCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisKKwlyZXR1cm4gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZhaXJwb3J0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9haXJwb3J0KHZvaWQpCit7CisJcmV0dXJuIG1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZhaXJwb3J0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYWlycG9ydCk7Cittb2R1bGVfZXhpdChleGl0X2FpcnBvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzA0YzZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCkBAIC0wLDAgKzEsMTg5NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgQ3VsbGVuIEplbm5pbmdzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IEVsbWVyIEpvYW5kaXUsIGVsbWVyQHlsZW51cm1lLmVlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcworICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIEFybGFuIDY1NSBjYXJkIG1hZGUgYnkgQWlyb25ldAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJhcmxhbi5oIgorCisjaWYgQklUU19QRVJfTE9ORyAhPSAzMgorIyAgZXJyb3IgRklYTUU6IHRoaXMgZHJpdmVyIHJlcXVpcmVzIGEgMzItYml0IHBsYXRmb3JtCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKmFybGFuX3ZlcnNpb24gPSAiQy5KZW5uaWdzIDk3ICYgRWxtZXIuSm9hbmRpQHV0LmVlICBPY3QnOTgsIGh0dHA6Ly93d3cueWxlbnVybWUuZWUvfmVsbWVyLzY1NS8iOworCitzdHJ1Y3QgbmV0X2RldmljZSAqYXJsYW5fZGV2aWNlW01BWF9BUkxBTlNdOworCitzdGF0aWMgaW50IFNJRCA9IFNJRFVOS05PV047CitzdGF0aWMgaW50IHJhZGlvTm9kZUlkID0gcmFkaW9Ob2RlSWRVTktOT1dOOworc3RhdGljIGNoYXIgZW5jcnlwdGlvbktleVsxMl0gPSB7J2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCd9OworaW50IGFybGFuX2RlYnVnID0gZGVidWdVTktOT1dOOworc3RhdGljIGludCBzcHJlYWRpbmdDb2RlID0gc3ByZWFkaW5nQ29kZVVOS05PV047CitzdGF0aWMgaW50IGNoYW5uZWxOdW1iZXIgPSBjaGFubmVsTnVtYmVyVU5LTk9XTjsKK3N0YXRpYyBpbnQgY2hhbm5lbFNldCA9IGNoYW5uZWxTZXRVTktOT1dOOworc3RhdGljIGludCBzeXN0ZW1JZCA9IHN5c3RlbUlkVU5LTk9XTjsKK3N0YXRpYyBpbnQgcmVnaXN0cmF0aW9uTW9kZSA9IHJlZ2lzdHJhdGlvbk1vZGVVTktOT1dOOworc3RhdGljIGludCBrZXlTdGFydDsKK3N0YXRpYyBpbnQgdHhfZGVsYXlfbXM7CitzdGF0aWMgaW50IHJldHJpZXMgPSA1Oworc3RhdGljIGludCB0eF9xdWV1ZV9sZW4gPSAxOworc3RhdGljIGludCBhcmxhbl9FRVBST01fYmFkOworCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCisKK3N0YXRpYyBpbnQgYXJsYW5fZW50cnlfZGVidWc7CitzdGF0aWMgaW50IGFybGFuX2V4aXRfZGVidWc7CitzdGF0aWMgaW50IHRlc3RNZW1vcnkgPSB0ZXN0TWVtb3J5VU5LTk9XTjsKK3N0YXRpYyBpbnQgaXJxID0gaXJxVU5LTk9XTjsKK3N0YXRpYyBpbnQgdHhTY3JhbWJsZWQgPSAxOworc3RhdGljIGludCBtZGVidWc7CisKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHRlc3RNZW1vcnksIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYXJsYW5fZW50cnlfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYXJsYW5fZXhpdF9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eFNjcmFtYmxlZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiKHVudXNlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0ModGVzdE1lbW9yeSwgIih1bnVzZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1kZWJ1ZywgIkFybGFuIG11bHRpY2FzdCBkZWJ1Z2dpbmcgKDAtMSkiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oYXJsYW5fZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3ByZWFkaW5nQ29kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjaGFubmVsTnVtYmVyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNoYW5uZWxTZXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3lzdGVtSWQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmVnaXN0cmF0aW9uTW9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyYWRpb05vZGVJZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShTSUQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oa2V5U3RhcnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhfZGVsYXlfbXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmV0cmllcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eF9xdWV1ZV9sZW4sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYXJsYW5fRUVQUk9NX2JhZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZGVidWcsICJBcmxhbiBkZWJ1ZyBlbmFibGUgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MocmV0cmllcywgIkFybGFuIG1heGltdW0gcGFja2V0IHJldHJhbnNtaXNpb25zIik7CisjaWZkZWYgQVJMQU5fRU5UUllfRVhJVF9ERUJVR0dJTkcKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2V4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZXhpdCBkZWJ1Z2dpbmciKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQgZGVidWdnaW5nIik7CisjZWxzZQorTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9kZWJ1ZywgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9leGl0X2RlYnVnLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLCAiKGlnbm9yZWQpIik7CisjZW5kaWYKKworc3RydWN0IGFybGFuX2NvbmZfc3RydSBhcmxhbl9jb25mW01BWF9BUkxBTlNdOworc3RhdGljIGludCBhcmxhbnNfZm91bmQ7CisKK3N0YXRpYyAgaW50IAlhcmxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBpbnQgCWFybGFuX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBpcnFyZXR1cm5fdCBhcmxhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgIGludCAJYXJsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKKwkJYXJsYW5fc3RhdGlzdGljcwkJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICB2b2lkIAlhcmxhbl9zZXRfbXVsdGljYXN0CQkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgIGludCAJYXJsYW5faHdfdHgJCQkoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgY2hhciAqYnVmLCBpbnQgbGVuZ3RoICk7CitzdGF0aWMgIGludAlhcmxhbl9od19jb25maWcJCQkoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworc3RhdGljICB2b2lkIAlhcmxhbl90eF9kb25lX2ludGVycnVwdAkJKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgc3RhdHVzKTsKK3N0YXRpYyAgdm9pZAlhcmxhbl9yeF9pbnRlcnJ1cHQJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdV9jaGFyIHJ4U3RhdHVzLCB1X3Nob3J0LCB1X3Nob3J0KTsKK3N0YXRpYyAgdm9pZAlhcmxhbl9wcm9jZXNzX2ludGVycnVwdAkJKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYwl2b2lkCWFybGFuX3R4X3RpbWVvdXQJCShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGlubGluZSBsb25nIHVzMnRpY2tzKGludCB1cykKK3sKKwlyZXR1cm4gdXMgKiAoMTAwMDAwMCAvIEhaKTsKK30KKworCisjaWZkZWYgQVJMQU5fRU5UUllfRVhJVF9ERUJVR0dJTkcKKyNkZWZpbmUgQVJMQU5fREVCVUdfRU5UUlkobmFtZSkgXAorCXtcCisJc3RydWN0IHRpbWV2YWwgdGltZXY7XAorCWRvX2dldHRpbWVvZmRheSgmdGltZXYpO1wKKwkJaWYgKGFybGFuX2VudHJ5X2RlYnVnIHx8IGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnKVwKKwkJCXByaW50aygiLS0tPj4+IiBuYW1lICIgJWxkICIgIlxuIiwoKGxvbmcgaW50KSB0aW1ldi50dl9zZWMgKiAxMDAwMDAwICsgdGltZXYudHZfdXNlYykpO1wKKwl9CisjZGVmaW5lIEFSTEFOX0RFQlVHX0VYSVQobmFtZSkgXAorCXtcCisJc3RydWN0IHRpbWV2YWwgdGltZXY7XAorCWRvX2dldHRpbWVvZmRheSgmdGltZXYpO1wKKwkJaWYgKGFybGFuX2V4aXRfZGVidWcgfHwgYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcpXAorCQkJcHJpbnRrKCI8PDwtLS0iIG5hbWUgIiAlbGQgIiAiXG4iLCgobG9uZyBpbnQpIHRpbWV2LnR2X3NlYyAqIDEwMDAwMDAgKyB0aW1ldi50dl91c2VjKSApO1wKKwl9CisjZWxzZQorI2RlZmluZSBBUkxBTl9ERUJVR19FTlRSWShuYW1lKQorI2RlZmluZSBBUkxBTl9ERUJVR19FWElUKG5hbWUpCisjZW5kaWYKKworCisjZGVmaW5lIGFybGFuX2ludGVycnVwdF9hY2soZGV2KVwKKyAgICAgICAgY2xlYXJDbGVhckludGVycnVwdChkZXYpO1wKKyAgICAgICAgc2V0Q2xlYXJJbnRlcnJ1cHQoZGV2KTsKKworc3RhdGljIGlubGluZSBpbnQgYXJsYW5fZHJvcF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmIChwcml2LT5Db25mLT50eF9kZWxheV9tcykKKwl7CisJCXByaXYtPnR4X2RvbmVfZGVsYXllZCA9IGppZmZpZXMgKyBwcml2LT5Db25mLT50eF9kZWxheV9tcyAqIEhaIC8gMTAwMCArIDE7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1RYOworCQlUWEhFQUQoZGV2KS5vZmZzZXQgPSAwOworCQlUWFRBSUwoZGV2KS5vZmZzZXQgPSAwOworCQlwcml2LT50eExhc3QgPSAwOworCQlwcml2LT5iYWQgPSAwOworCQlpZiAoIXByaXYtPnVuZGVyX3Jlc2V0ICYmICFwcml2LT51bmRlcl9jb25maWcpCisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KKwlyZXR1cm4gMTsKK30KKworCitpbnQgYXJsYW5fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZF9wKQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCWludCB1ZGVsYXllZCA9IDA7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fY29tbWFuZCIpOworCisJaWYgKHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCkKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKworCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NIQUlOX0xPQ0tTKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYXJsYW5fY29tbWFuZCwgJWx4IGNvbW1hbmRCeXRlICV4IHdhaXRpbmcgJWx4IGluY29taW5nICV4IFxuIiwKKwkJamlmZmllcywgUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSwKKwkJICAgICAgIHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrLCBjb21tYW5kX3ApOworCisJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gY29tbWFuZF9wOworCisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SRVNFVCkKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+bGFzdFJlc2V0ICsgNSAqIEhaKSkKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1JFU0VUOworCisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9JTlRfQUNLKQorCXsKKwkJYXJsYW5faW50ZXJydXB0X2FjayhkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9JTlRfQUNLOworCX0KKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0lOVF9FTkFCTEUpCisJeworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRTsKKwl9CisKKwkvKiBDYXJkIGFjY2VzcyBzZXJpYWxpemluZyBsb2NrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGNhcmRzIHN0YXR1cyBhbmQgd2FpdGluZyAqLworCisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgKEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyB8IEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpKQorCXsKKwkJd2hpbGUgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgKEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyB8IEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpKQorCQl7CisJCQlpZiAoUkVBRFNITUIoYXJsYW4tPnJlc2V0RmxhZykgfHwKKwkJCQlSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpKQkvKiB8fCAKKwkJCQkJCQkJICAgKHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIEFSTEFOX0FDQ0VTUykpCisJCQkJCQkJCSAqLworCQkJCXVkZWxheSg0MCk7CisJCQllbHNlCisJCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfihBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cgfCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKTsKKworCQkJdWRlbGF5ZWQrKzsKKworCQkJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKQorCQkJeworCQkJCWlmICh1ZGVsYXllZCAqIDQwID4gMTAwMDAwMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbG9uZyB3YWl0IHRvbyBsb25nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9SRVNFVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKQorCQkJeworCQkJCWlmICh1ZGVsYXllZCAqIDQwID4gMTAwMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgc2hvcnQgd2FpdCB0b28gbG9uZyBcbiIsIGRldi0+bmFtZSk7CisJCQkJCWdvdG8gYmFkX2VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaSA9IDA7CisJCXdoaWxlICgoUkVBRFNITUIoYXJsYW4tPnJlc2V0RmxhZykgfHwKKwkJCVJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSkpICYmCisJCQljb25mLT5wcmVfQ29tbWFuZF9XYWl0ID4gKGkrKykgKiAxMCkKKwkJCXVkZWxheSgxMCk7CisKKworCQlpZiAoKFJFQURTSE1CKGFybGFuLT5yZXNldEZsYWcpIHx8CisJCQlSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpKSAmJgorCQkJIShwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpKQorCQl7CisJCQlnb3RvIGNhcmRfYnVzeV9lbmQ7CisJCX0KKwl9CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SRVNFVCkKKwkJcHJpdi0+dW5kZXJfcmVzZXQgPSAxOworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfQ09ORikKKwkJcHJpdi0+dW5kZXJfY29uZmlnID0gMTsKKworCS8qIElzc3VpbmcgY29tbWFuZCAqLworCWFybGFuX2xvY2tfY2FyZF9hY2Nlc3MoZGV2KTsKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1BPV0VSVVApCisJeworCS8vICAgICBpZiAocmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgKEFSTEFOX0FDQ0VTUyAmJiBBUkxBTl9QT1dFUikpCisJCXNldFBvd2VyT24oZGV2KTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9QT1dFUlVQOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JFU0VUOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDEwOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfQUNUSVZBVEUpCisJeworCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fQUNUSVZBVEUpOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0FDVElWQVRFOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDEwOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUlhfQUJPUlQpCisJeworCQlpZiAocHJpdi0+cnhfY29tbWFuZF9naXZlbikKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX1JYX0FCT1JUKTsKKwkJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJCXByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCQl9CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1JYX0FCT1JUOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfVFhfQUJPUlQpCisJeworCQlpZiAocHJpdi0+dHhfY29tbWFuZF9naXZlbikKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX1RYX0FCT1JUKTsKKwkJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCQl9CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1RYX0FCT1JUOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpCisJeworCQlwcml2LT51bmRlcl9yZXNldD0xOworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwkJaWYgKHByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gfHwgcHJpdi0+cnhfY29tbWFuZF9naXZlbikKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVzZXQgdW5kZXIgdHggb3IgcnggY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfUkVTRVQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEb2luZyBjaGlwIHJlc2V0XG4iLCBkZXYtPm5hbWUpOworCQlwcml2LT5sYXN0UmVzZXQgPSBqaWZmaWVzOworCQlXUklURVNITShhcmxhbi0+Y29tbWFuZEJ5dGUsIDAsIHVfY2hhcik7CisJCS8qIGhvbGQgY2FyZCBpbiByZXNldCBzdGF0ZSAqLworCQlzZXRIYXJkd2FyZVJlc2V0KGRldik7CisJCS8qIHNldCByZXNldCBmbGFnIGFuZCB0aGVuIHJlbGVhc2UgcmVzZXQgKi8KKwkJV1JJVEVTSE0oYXJsYW4tPnJlc2V0RmxhZywgMHhmZiwgdV9jaGFyKTsKKwkJY2xlYXJDaGFubmVsQXR0ZW50aW9uKGRldik7CisJCWNsZWFySGFyZHdhcmVSZXNldChkZXYpOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDQ7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1JFU0VUOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9SQUNLOworLy8JCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEU7IAorLy8JCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfUlg7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9JTlRfUkFDSykKKwl7CisJCWNsZWFySGFyZHdhcmVSZXNldChkZXYpOworCQljbGVhckNsZWFySW50ZXJydXB0KGRldik7CisJCXNldENsZWFySW50ZXJydXB0KGRldik7CisJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9JTlRfUkFDSzsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9DT05GOworCQlwcml2LT51bmRlcl9jb25maWcgPSAxOworCQlwcml2LT51bmRlcl9yZXNldCA9IDA7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9JTlRfUkVOQUJMRSkKKwl7CisJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9JTlRfUkVOQUJMRTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0NPTkYpCisJeworCQlpZiAocHJpdi0+dHhfY29tbWFuZF9naXZlbiB8fCBwcml2LT5yeF9jb21tYW5kX2dpdmVuKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXNldCB1bmRlciB0eCBvciByeCBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlhcmxhbl9kcm9wX3R4KGRldik7CisJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQlhcmxhbl9od19jb25maWcoZGV2KTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9DT05GOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDEwOworLy8JCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfSU5UX1JBQ0s7ICAgCisvLwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFOyAKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9DT05GX1dBSVQ7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9DT05GX1dBSVQpCisJeworCQlpZiAoUkVBRFNITUIoYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnKSAhPSAwICYmCisJCQlSRUFEU0hNQihhcmxhbi0+ZGlhZ25vc3RpY0luZm8pID09IDB4ZmYpCisJCXsKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0NPTkZfV0FJVDsKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfUlg7CisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSOworCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKwkJCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCQkJcHJpdi0+dW5kZXJfY29uZmlnID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19USU1JTkcpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJjb25maWd1cmUgZGVsYXllZCBcbiIpOworCQl9CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SWCkKKwl7CisJCWlmICghcmVnaXN0cmF0aW9uQmFkKGRldikpCisJCXsKKwkJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCAwLCAweGYpOworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX0lOVCB8IEFSTEFOX0NPTV9SWF9FTkFCTEUpOworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyWzBdLCBjb25mLT5yeFBhcmFtZXRlcik7CisJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQlwcml2LT5yeF9jb21tYW5kX2dpdmVuID0gMDsgLy8gbW5qYWgsIGJhZAorCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUlg7CisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQl9CisJCWVsc2UKKwkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDI7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9UQlVTWV9DTEVBUikKKwl7CisJCWlmICggIXJlZ2lzdHJhdGlvbkJhZChkZXYpICYmCisJCSAgICAgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fCAhbmV0aWZfcnVubmluZyhkZXYpKSApCisJCQl7CisJCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfVEJVU1lfQ0xFQVI7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCX0KKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1RYKQorCXsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopICZwcml2LT50eF9jb21tYW5kX2dpdmVuKSkKKwkJeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgCisJCQkJICAgICAgIHByaXYtPnR4X2xhc3Rfc2VudCArIHVzMnRpY2tzKGNvbmYtPnJ4X3R3ZWFrMSkpCisJCQkgICAgfHwgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQkJICAgcHJpdi0+bGFzdF9yeF9pbnRfYWNrX3RpbWUgKyB1czJ0aWNrcyhjb25mLT5yeF90d2VhazIpKSkKKwkJCXsKKwkJCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJCQltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsIDAsIDB4Zik7CisJCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX1RYX0VOQUJMRSB8IEFSTEFOX0NPTV9JTlQpOworCQkJCW1lbWNweV90b2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCAmVFhMQVNUKGRldiksIDE0KTsKKy8vCQkJCWZvciAoIGk9MSA7IGkgPCAxNSA7IGkrKykgcHJpbnRrKCIlMDJ4OiIsUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXJbaV0pKTsKKwkJCQlwcml2LT50eF9sYXN0X3NlbnQgPSBqaWZmaWVzOworCQkJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMTsKKwkJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UWDsKKwkJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCQkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJCQl9CisJCX0gCisJCWVsc2UgaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0hBSU5fTE9DS1MpCisJCQlwcmludGsoS0VSTl9FUlIgInR4IGNvbW1hbmQgd2hlbiB0eCBjaGFpbiBsb2NrZWQgXG4iKTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX05PT1BJTlQpCisJeworCQl7CisJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fTk9QIHwgQVJMQU5fQ09NX0lOVCk7CisJCX0KKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9OT09QSU5UOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDM7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9OT09QKQorCXsKKwkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX05PUCk7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfTk9PUDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAzOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfU0xPV19QT0xMKQorCXsKKwkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX0dPVE9fU0xPV19QT0xMKTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9TTE9XX1BPTEw7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMzsKKwl9IAorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04pCisJeworCQlzZXRQb3dlck9mZihkZXYpOworCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DQVJEX1NUQVRFKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFybGFuIEdvaW5nIFN0YW5kYnlcbiIsIGRldi0+bmFtZSk7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1BPV0VSRE9XTjsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMyAqIEhaOworCX0KKwlhcmxhbl91bmxvY2tfY2FyZF9hY2Nlc3MoZGV2KTsKKwlmb3IgKGkgPSAwOyBSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpICYmIGkgPCAyMDsgaSsrKQorCQl1ZGVsYXkoMTApOworCWlmIChSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpKQorCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DQVJEX1NUQVRFKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYXJkIGJ1c3kgbGVhdmluZyBjb21tYW5kICVseFxuIiwgcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2spOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NvbW1hbmQiKTsKKwlwcml2LT5sYXN0X2NvbW1hbmRfYnVmZl9mcmVlX3RpbWUgPSBqaWZmaWVzOworCXJldHVybiAwOworCitjYXJkX2J1c3lfZW5kOgorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmxhc3RfY29tbWFuZF9idWZmX2ZyZWVfdGltZSArIEhaKSkKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQ7CisKKwlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DQVJEX1NUQVRFKQorCQlwcmludGsoS0VSTl9FUlIgIiVzIGFybGFuX2NvbW1hbmQgY2FyZCBidXN5IGVuZCBcbiIsIGRldi0+bmFtZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NvbW1hbmQiKTsKKwlyZXR1cm4gMTsKKworYmFkX2VuZDoKKwlwcmludGsoS0VSTl9FUlIgIiVzIGFybGFuX2NvbW1hbmQgYmFkIGVuZCBcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY29tbWFuZCIpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJsYW5fY29tbWFuZF9wcm9jZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IHRpbWVzID0gMDsKKwl3aGlsZSAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiYgdGltZXMgPCA4KQorCXsKKwkJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrKQorCQl7CisJCQlpZiAoYXJsYW5fY29tbWFuZChkZXYsIDApKQorCQkJCWJyZWFrOworCQkJdGltZXMrKzsKKwkJfQorCQkvKiBpZiBsb25nIGNvbW1hbmQsIHdlIHdvbid0IHJlcGVhdCB0cnlpbmcgKi8gOworCQlpZiAocHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID4gMSkKKwkJCWJyZWFrOworCQl0aW1lcysrOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYXJsYW5fcmV0cmFuc21pdF9ub3coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9yZXRyYW5zbWl0X25vdyIpOworCWlmIChUWExBU1QoZGV2KS5vZmZzZXQgPT0gMCkKKwl7CisJCWlmIChUWEhFQUQoZGV2KS5vZmZzZXQpCisJCXsKKwkJCXByaXYtPnR4TGFzdCA9IDA7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoS0VSTl9ERUJVRyAiVFggYnVmZiBzd2l0Y2ggdG8gaGVhZCBcbiIpOworCisJCX0KKwkJZWxzZSBpZiAoVFhUQUlMKGRldikub2Zmc2V0KQorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoS0VSTl9ERUJVRyAiVFggYnVmZiBzd2l0Y2ggdG8gdGFpbCBcbiIpOworCQkJcHJpdi0+dHhMYXN0ID0gMTsKKwkJfQorCQllbHNlCisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoS0VSTl9FUlIgIlJlVHJhbnNtaXQgYnVmZiBlbXB0eSIpOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQlyZXR1cm47CisKKwl9CisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfVFgpOworCisJcHJpdi0+Q29uZi0+ZHJpdmVyUmV0cmFuc21pc3Npb25zKys7CisJcHJpdi0+cmV0cmFuc21pc3Npb25zKys7CisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoIlJldHJhbnNtaXQgJWQgYnl0ZXMgXG4iLCBUWExBU1QoZGV2KS5sZW5ndGgpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcmV0cmFuc21pdF9ub3ciKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGFybGFuX3JlZ2lzdHJhdGlvbl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYmhfbWFya19uZWVkZWQgPSAwOworCWludCBuZXh0X3RpY2sgPSAxOworCWxvbmcgbG9zdFRpbWUgPSAoKGxvbmcpamlmZmllcyAtIChsb25nKXByaXYtPnJlZ2lzdHJhdGlvbkxhc3RTZWVuKQorCQkJKiAoMTAwMC9IWik7CisKKwlpZiAocmVnaXN0cmF0aW9uQmFkKGRldikpCisJeworCQlwcml2LT5yZWdpc3RyYXRpb25Mb3N0Q291bnQrKzsKKwkJaWYgKGxvc3RUaW1lID4gNzAwMCAmJiBsb3N0VGltZSA8IDcyMDApCisJCXsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXMgcmVnaXN0cmF0aW9uIExvc3QgXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCWlmIChsb3N0VGltZSAvIHByaXYtPnJlUmVnaXN0ZXJFeHAgPiAyMDAwKQorCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYpOworCQlpZiAobG9zdFRpbWUgLyAocHJpdi0+cmVSZWdpc3RlckV4cCkgPiAzNTAwKQorCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsKKwkJaWYgKHByaXYtPnJlUmVnaXN0ZXJFeHAgPCA0MDApCisJCQlwcml2LT5yZVJlZ2lzdGVyRXhwICs9IDI7CisJCWlmIChsb3N0VGltZSA+IDcyMDApCisJCXsKKwkJCW5leHRfdGljayA9IEhaOworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocHJpdi0+Q29uZi0+cmVnaXN0cmF0aW9uTW9kZSAmJiBsb3N0VGltZSA+IDEwMDAwICYmCisJCQlwcml2LT5yZWdpc3RyYXRpb25Mb3N0Q291bnQpCisJCXsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXMgcmVnaXN0cmF0aW9uIGlzIGJhY2sgYWZ0ZXIgJWxkIG1pbGxpc2Vjb25kc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxvc3RUaW1lKTsKKwkJfQorCQlwcml2LT5yZWdpc3RyYXRpb25MYXN0U2VlbiA9IGppZmZpZXM7CisJCXByaXYtPnJlZ2lzdHJhdGlvbkxvc3RDb3VudCA9IDA7CisJCXByaXYtPnJlUmVnaXN0ZXJFeHAgPSAxOworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSApCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWlmICh0aW1lX2FmdGVyKHByaXYtPnR4X2xhc3Rfc2VudCxwcml2LT50eF9sYXN0X2NsZWFyZWQpICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPnR4X2xhc3Rfc2VudCAqIDUqSFopICl7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOwkJCisJCQlwcml2LT50eF9sYXN0X2NsZWFyZWQgPSBqaWZmaWVzOworCQl9CisJfQorCisKKwlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpICYmIHByaXYtPlJlVHJhbnNtaXRSZXF1ZXN0ZWQpCisJeworCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJcHJpbnRrKEtFUk5fRVJSICJSZXRyYW5zbWl0IGZyb20gdGltZXIgXG4iKTsKKwkJcHJpdi0+UmVUcmFuc21pdFJlcXVlc3RlZCA9IDA7CisJCWFybGFuX3JldHJhbnNtaXRfbm93KGRldik7CisJfQorCWlmICghcmVnaXN0cmF0aW9uQmFkKGRldikgJiYKKwkJdGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT50eF9kb25lX2RlbGF5ZWQpICYmCisJCXByaXYtPnR4X2RvbmVfZGVsYXllZCAhPSAwKQorCXsKKwkJVFhMQVNUKGRldikub2Zmc2V0ID0gMDsKKwkJaWYgKHByaXYtPnR4TGFzdCkKKwkJCXByaXYtPnR4TGFzdCA9IDA7CisJCWVsc2UgaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJCXByaXYtPnR4TGFzdCA9IDE7CisJCWlmIChUWExBU1QoZGV2KS5vZmZzZXQpCisJCXsKKwkJCWFybGFuX3JldHJhbnNtaXRfbm93KGRldik7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCQlpZiAoIShUWEhFQUQoZGV2KS5vZmZzZXQgJiYgVFhUQUlMKGRldikub2Zmc2V0KSkKKwkJeworCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJfQorCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgPSAwOworCQliaF9tYXJrX25lZWRlZCA9IDE7CisJfQorCWlmIChiaF9tYXJrX25lZWRlZCkKKwl7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfQorCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KGRldik7CisKKwlpZiAobmV4dF90aWNrIDwgcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsKQorCQluZXh0X3RpY2sgPSBwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWw7CisKKwlwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKworCWFkZF90aW1lcigmcHJpdi0+dGltZXIpOworfQorCisKKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKworc3RhdGljIHZvaWQgYXJsYW5fcHJpbnRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsaW5lKQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCXVfY2hhciBob3N0Y3B1TG9jaywgbGFuY3B1TG9jaywgY29udHJvbFJlZ2lzdGVyLCBjbnRybFJlZ0ltYWdlLAorCQl0eFN0YXR1cywgcnhTdGF0dXMsIGludGVycnVwdEluUHJvZ3Jlc3MsIGNvbW1hbmRCeXRlOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJpbnRfcmVnaXN0ZXJzIik7CisJUkVBRFNITShpbnRlcnJ1cHRJblByb2dyZXNzLCBhcmxhbi0+aW50ZXJydXB0SW5Qcm9ncmVzcywgdV9jaGFyKTsKKwlSRUFEU0hNKGhvc3RjcHVMb2NrLCBhcmxhbi0+aG9zdGNwdUxvY2ssIHVfY2hhcik7CisJUkVBRFNITShsYW5jcHVMb2NrLCBhcmxhbi0+bGFuY3B1TG9jaywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbnRyb2xSZWdpc3RlciwgYXJsYW4tPmNvbnRyb2xSZWdpc3RlciwgdV9jaGFyKTsKKwlSRUFEU0hNKGNudHJsUmVnSW1hZ2UsIGFybGFuLT5jbnRybFJlZ0ltYWdlLCB1X2NoYXIpOworCVJFQURTSE0odHhTdGF0dXMsIGFybGFuLT50eFN0YXR1cywgdV9jaGFyKTsKKwlSRUFEU0hNKHJ4U3RhdHVzLCBhcmxhbi0+cnhTdGF0dXMsIHVfY2hhcik7CisJUkVBRFNITShjb21tYW5kQnl0ZSwgYXJsYW4tPmNvbW1hbmRCeXRlLCB1X2NoYXIpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAibGluZSAlMDRkIElQICUwMnggSEwgJTAyeCBMTCAlMDJ4IENCICUwMnggQ1IgJTAyeCBDUkkgJTAyeCBUWCAlMDJ4IFJYICUwMnhcbiIsCisJCWxpbmUsIGludGVycnVwdEluUHJvZ3Jlc3MsIGhvc3RjcHVMb2NrLCBsYW5jcHVMb2NrLCBjb21tYW5kQnl0ZSwKKwkJY29udHJvbFJlZ2lzdGVyLCBjbnRybFJlZ0ltYWdlLCB0eFN0YXR1cywgcnhTdGF0dXMpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcHJpbnRfcmVnaXN0ZXJzIik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IGFybGFuX2h3X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCisJaW50IHRhaWxTdGFydHMgPSAweDgwMDsKKwlpbnQgaGVhZEVuZHMgPSAweDA7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9od190eCIpOworCWlmIChUWEhFQUQoZGV2KS5vZmZzZXQpCisJCWhlYWRFbmRzID0gKCgoVFhIRUFEKGRldikub2Zmc2V0ICsgVFhIRUFEKGRldikubGVuZ3RoIC0gb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikpIC8gNjQpICsgMSkgKiA2NDsKKwlpZiAoVFhUQUlMKGRldikub2Zmc2V0KQorCQl0YWlsU3RhcnRzID0gMHg4MDAgLSAoKChUWFRBSUwoZGV2KS5vZmZzZXQgLSBvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHR4QnVmZmVyKSkgLyA2NCkgKyAyKSAqIDY0OworCisKKwlpZiAoIVRYSEVBRChkZXYpLm9mZnNldCAmJiBsZW5ndGggPCB0YWlsU3RhcnRzKQorCXsKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiVFhIRUFEIGluc2VydCwgdGFpbFN0YXJ0ICVkXG4iLCB0YWlsU3RhcnRzKTsKKworCQlUWEhFQUQoZGV2KS5vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcik7CisJCVRYSEVBRChkZXYpLmxlbmd0aCA9IGxlbmd0aCAtIEFSTEFOX0ZBS0VfSERSX0xFTjsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCVRYSEVBRChkZXYpLmRlc3RbaV0gPSBidWZbaV07CisJCVRYSEVBRChkZXYpLmNsZWFyID0gY29uZi0+dHhDbGVhcjsKKwkJVFhIRUFEKGRldikucmV0cmllcyA9IGNvbmYtPnR4UmV0cmllczsJLyogMCBpcyB1c2UgZGVmYXVsdCAqLworCQlUWEhFQUQoZGV2KS5yb3V0aW5nID0gY29uZi0+dHhSb3V0aW5nOworCQlUWEhFQUQoZGV2KS5zY3JhbWJsZWQgPSBjb25mLT50eFNjcmFtYmxlZDsKKwkJbWVtY3B5X3RvaW8oKGNoYXIgX19pb21lbSAqKWFybGFuICsgVFhIRUFEKGRldikub2Zmc2V0LCBidWYgKyBBUkxBTl9GQUtFX0hEUl9MRU4sIFRYSEVBRChkZXYpLmxlbmd0aCk7CisJfQorCWVsc2UgaWYgKCFUWFRBSUwoZGV2KS5vZmZzZXQgJiYgbGVuZ3RoIDwgKDB4ODAwIC0gaGVhZEVuZHMpKQorCXsKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiVFhUQUlMIGluc2VydCwgaGVhZEVuZCAlZFxuIiwgaGVhZEVuZHMpOworCisJCVRYVEFJTChkZXYpLm9mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHR4QnVmZmVyKSArIDB4ODAwIC0gKGxlbmd0aCAvIDY0ICsgMikgKiA2NDsKKwkJVFhUQUlMKGRldikubGVuZ3RoID0gbGVuZ3RoIC0gQVJMQU5fRkFLRV9IRFJfTEVOOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVFhUQUlMKGRldikuZGVzdFtpXSA9IGJ1ZltpXTsKKwkJVFhUQUlMKGRldikuY2xlYXIgPSBjb25mLT50eENsZWFyOworCQlUWFRBSUwoZGV2KS5yZXRyaWVzID0gY29uZi0+dHhSZXRyaWVzOworCQlUWFRBSUwoZGV2KS5yb3V0aW5nID0gY29uZi0+dHhSb3V0aW5nOworCQlUWFRBSUwoZGV2KS5zY3JhbWJsZWQgPSBjb25mLT50eFNjcmFtYmxlZDsKKwkJbWVtY3B5X3RvaW8oKChjaGFyIF9faW9tZW0gKilhcmxhbiArIFRYVEFJTChkZXYpLm9mZnNldCksIGJ1ZiArIEFSTEFOX0ZBS0VfSERSX0xFTiwgVFhUQUlMKGRldikubGVuZ3RoKTsKKwl9CisJZWxzZQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiVFggVEFJTCAmIEhFQUQgZnVsbCwgcmV0dXJuLCB0YWlsU3RhcnQgJWQgaGVhZEVuZCAlZFxuIiwgdGFpbFN0YXJ0cywgaGVhZEVuZHMpOworCQlyZXR1cm4gLTE7CisJfQorCXByaXYtPm91dF9ieXRlcyArPSBsZW5ndGg7CisJcHJpdi0+b3V0X2J5dGVzMTAgKz0gbGVuZ3RoOworCWlmIChjb25mLT5tZWFzdXJlX3JhdGUgPCAxKQorCQljb25mLT5tZWFzdXJlX3JhdGUgPSAxOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPm91dF90aW1lICsgY29uZi0+bWVhc3VyZV9yYXRlICogSFopKQorCXsKKwkJY29uZi0+b3V0X3NwZWVkID0gcHJpdi0+b3V0X2J5dGVzIC8gY29uZi0+bWVhc3VyZV9yYXRlOworCQlwcml2LT5vdXRfYnl0ZXMgPSAwOworCQlwcml2LT5vdXRfdGltZSA9IGppZmZpZXM7CisJfQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPm91dF90aW1lMTAgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiAxMCpIWikpCisJeworCQljb25mLT5vdXRfc3BlZWQxMCA9IHByaXYtPm91dF9ieXRlczEwIC8gKDEwICogY29uZi0+bWVhc3VyZV9yYXRlKTsKKwkJcHJpdi0+b3V0X2J5dGVzMTAgPSAwOworCQlwcml2LT5vdXRfdGltZTEwID0gamlmZmllczsKKwl9CisJaWYgKFRYSEVBRChkZXYpLm9mZnNldCAmJiBUWFRBSUwoZGV2KS5vZmZzZXQpCisJeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCisJSUZERUJVRyhBUkxBTl9ERUJVR19IRUFERVJfRFVNUCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgVHJhbnNtaXQgdCAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBmICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IFxuIiwgZGV2LT5uYW1lLAorCQkgICAodW5zaWduZWQgY2hhcikgYnVmWzBdLCAodW5zaWduZWQgY2hhcikgYnVmWzFdLCAodW5zaWduZWQgY2hhcikgYnVmWzJdLCAodW5zaWduZWQgY2hhcikgYnVmWzNdLAorCQkgICAodW5zaWduZWQgY2hhcikgYnVmWzRdLCAodW5zaWduZWQgY2hhcikgYnVmWzVdLCAodW5zaWduZWQgY2hhcikgYnVmWzZdLCAodW5zaWduZWQgY2hhcikgYnVmWzddLAorCQkgICAodW5zaWduZWQgY2hhcikgYnVmWzhdLCAodW5zaWduZWQgY2hhcikgYnVmWzldLCAodW5zaWduZWQgY2hhcikgYnVmWzEwXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsxMV0pOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fRVJSICJUWCBjb21tYW5kIHByZXBhcmUgZm9yIGJ1ZmZlciAlZFxuIiwgcHJpdi0+dHhMYXN0KTsKKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1RYKTsKKworCXByaXYtPnR4X2xhc3Rfc2VudCA9IGppZmZpZXM7CisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoIiVzIFRYIFF1ZWQgJWQgYnl0ZXMgXG4iLCBkZXYtPm5hbWUsIGxlbmd0aCk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9od190eCIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcmxhbl9od19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9od19jb25maWciKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXMgYXJsYW4gY29uZmlndXJlIGNhbGxlZCBcbiIsIGRldi0+bmFtZSk7CisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCXByaW50ayhLRVJOX05PVElDRSAiYXJsYW4gY29uZmlndXJlIHdpdGggZWVwcm9tIGJhZCBvcHRpb24gXG4iKTsKKworCisJV1JJVEVTSE0oYXJsYW4tPnNwcmVhZGluZ0NvZGUsIGNvbmYtPnNwcmVhZGluZ0NvZGUsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWxTZXQsIGNvbmYtPmNoYW5uZWxTZXQsIHVfY2hhcik7CisKKwlpZiAoYXJsYW5fRUVQUk9NX2JhZCkKKwkJV1JJVEVTSE0oYXJsYW4tPmRlZmF1bHRDaGFubmVsU2V0LCBjb25mLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWxOdW1iZXIsIGNvbmYtPmNoYW5uZWxOdW1iZXIsIHVfY2hhcik7CisKKwlXUklURVNITShhcmxhbi0+c2NyYW1ibGluZ0Rpc2FibGUsIGNvbmYtPnNjcmFtYmxpbmdEaXNhYmxlLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT50eEF0dGVudWF0aW9uLCBjb25mLT50eEF0dGVudWF0aW9uLCB1X2NoYXIpOworCisJV1JJVEVTSE0oYXJsYW4tPnN5c3RlbUlkLCBjb25mLT5zeXN0ZW1JZCwgdV9pbnQpOworCisJV1JJVEVTSE0oYXJsYW4tPm1heFJldHJpZXMsIGNvbmYtPm1heFJldHJpZXMsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnJlY2VpdmVNb2RlLCBjb25mLT5yZWNlaXZlTW9kZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cHJpb3JpdHksIGNvbmYtPnByaW9yaXR5LCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5yb290T3JSZXBlYXRlciwgY29uZi0+cm9vdE9yUmVwZWF0ZXIsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPlNJRCwgY29uZi0+U0lELCB1X2ludCk7CisKKwlXUklURVNITShhcmxhbi0+cmVnaXN0cmF0aW9uTW9kZSwgY29uZi0+cmVnaXN0cmF0aW9uTW9kZSwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5yZWdpc3RyYXRpb25GaWxsLCBjb25mLT5yZWdpc3RyYXRpb25GaWxsLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5sb2NhbFRhbGtBZGRyZXNzLCBjb25mLT5sb2NhbFRhbGtBZGRyZXNzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jb2RlRm9ybWF0LCBjb25mLT5jb2RlRm9ybWF0LCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5udW1DaGFubmVscywgY29uZi0+bnVtQ2hhbm5lbHMsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWwxLCBjb25mLT5jaGFubmVsMSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbDIsIGNvbmYtPmNoYW5uZWwyLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsMywgY29uZi0+Y2hhbm5lbDMsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWw0LCBjb25mLT5jaGFubmVsNCwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cmFkaW9Ob2RlSWQsIGNvbmYtPnJhZGlvTm9kZUlkLCB1X3Nob3J0KTsKKwlXUklURVNITShhcmxhbi0+U0lELCBjb25mLT5TSUQsIHVfaW50KTsKKwlXUklURVNITShhcmxhbi0+d2FpdFRpbWUsIGNvbmYtPndhaXRUaW1lLCB1X3Nob3J0KTsKKwlXUklURVNITShhcmxhbi0+bFBhcmFtZXRlciwgY29uZi0+bFBhcmFtZXRlciwgdV9zaG9ydCk7CisJbWVtY3B5X3RvaW8oJihhcmxhbi0+XzE1KSwgJihjb25mLT5fMTUpLCAzKTsKKwlXUklURVNITShhcmxhbi0+XzE1LCBjb25mLT5fMTUsIHVfc2hvcnQpOworCVdSSVRFU0hNKGFybGFuLT5oZWFkZXJTaXplLCBjb25mLT5oZWFkZXJTaXplLCB1X3Nob3J0KTsKKwlpZiAoYXJsYW5fRUVQUk9NX2JhZCkKKwkJV1JJVEVTSE0oYXJsYW4tPmhhcmR3YXJlVHlwZSwgY29uZi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5yYWRpb1R5cGUsIGNvbmYtPnJhZGlvVHlwZSwgdV9jaGFyKTsKKwlpZiAoYXJsYW5fRUVQUk9NX2JhZCkKKwkJV1JJVEVTSE0oYXJsYW4tPnJhZGlvTW9kdWxlLCBjb25mLT5yYWRpb1R5cGUsIHVfY2hhcik7CisKKwltZW1jcHlfdG9pbyhhcmxhbi0+ZW5jcnlwdGlvbktleSArIGtleVN0YXJ0LCBlbmNyeXB0aW9uS2V5LCA4KTsKKwltZW1jcHlfdG9pbyhhcmxhbi0+bmFtZSwgY29uZi0+c2l0ZU5hbWUsIDE2KTsKKworCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9JTlQgfCBBUkxBTl9DT01fQ09ORik7CS8qIGRvIGNvbmZpZ3VyZSAqLworCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgMCwgMHhmKTsJLyogMHhmICovCisJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyICsgMSwgMCwgMik7CisJaWYgKGNvbmYtPndyaXRlRUVQUk9NKQorCXsKKwkJICBtZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsIGNvbmYtPndyaXRlRUVQUk9NLCAxKTsKKy8vCQljb25mLT53cml0ZUVFUFJPTT0wOworCX0KKwlpZiAoY29uZi0+cmVnaXN0cmF0aW9uTW9kZSAmJiBjb25mLT5yZWdpc3RyYXRpb25JbnRlcnJ1cHRzKQorCQltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIgKyAzLCAxLCAxKTsKKwllbHNlCisJCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciArIDMsIDAsIDEpOworCisJcHJpdi0+aXJxX3Rlc3RfZG9uZSA9IDA7CisKKwlpZiAoY29uZi0+dHhfcXVldWVfbGVuKQorCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IGNvbmYtPnR4X3F1ZXVlX2xlbjsKKwl1ZGVsYXkoMTAwKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2h3X2NvbmZpZyIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5fcmVhZF9jYXJkX2NvbmZpZ3VyYXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2NoYXIgdGx4NDE1OworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uIik7CisKKwlpZiAocmFkaW9Ob2RlSWQgPT0gcmFkaW9Ob2RlSWRVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5yYWRpb05vZGVJZCwgYXJsYW4tPnJhZGlvTm9kZUlkLCB1X3Nob3J0KTsKKwl9CisJZWxzZQorCQljb25mLT5yYWRpb05vZGVJZCA9IHJhZGlvTm9kZUlkOworCQkKKwlpZiAoU0lEID09IFNJRFVOS05PV04pCisJeworCQlSRUFEU0hNKGNvbmYtPlNJRCwgYXJsYW4tPlNJRCwgdV9pbnQpOworCX0KKwllbHNlIGNvbmYtPlNJRCA9IFNJRDsKKwkJCisJaWYgKHNwcmVhZGluZ0NvZGUgPT0gc3ByZWFkaW5nQ29kZVVOS05PV04pCisJeworCQkgIFJFQURTSE0oY29uZi0+c3ByZWFkaW5nQ29kZSwgYXJsYW4tPnNwcmVhZGluZ0NvZGUsIHVfY2hhcik7CisJfQorCWVsc2UKKwkJY29uZi0+c3ByZWFkaW5nQ29kZSA9IHNwcmVhZGluZ0NvZGU7CisJCQorCWlmIChjaGFubmVsU2V0ID09IGNoYW5uZWxTZXRVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5jaGFubmVsU2V0LCBhcmxhbi0+Y2hhbm5lbFNldCwgdV9jaGFyKTsKKwl9CisJZWxzZSBjb25mLT5jaGFubmVsU2V0ID0gY2hhbm5lbFNldDsKKworCWlmIChjaGFubmVsTnVtYmVyID09IGNoYW5uZWxOdW1iZXJVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5jaGFubmVsTnVtYmVyLCBhcmxhbi0+Y2hhbm5lbE51bWJlciwgdV9jaGFyKTsKKwl9CisJZWxzZSBjb25mLT5jaGFubmVsTnVtYmVyID0gY2hhbm5lbE51bWJlcjsKKwkKKwlSRUFEU0hNKGNvbmYtPnNjcmFtYmxpbmdEaXNhYmxlLCBhcmxhbi0+c2NyYW1ibGluZ0Rpc2FibGUsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT50eEF0dGVudWF0aW9uLCBhcmxhbi0+dHhBdHRlbnVhdGlvbiwgdV9jaGFyKTsKKwkKKwlpZiAoc3lzdGVtSWQgPT0gc3lzdGVtSWRVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5zeXN0ZW1JZCwgYXJsYW4tPnN5c3RlbUlkLCB1X2ludCk7CisJfSAKKwllbHNlIGNvbmYtPnN5c3RlbUlkID0gc3lzdGVtSWQ7CisJCisJUkVBRFNITShjb25mLT5tYXhEYXRhZ3JhbVNpemUsIGFybGFuLT5tYXhEYXRhZ3JhbVNpemUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+bWF4RnJhbWVTaXplLCBhcmxhbi0+bWF4RnJhbWVTaXplLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPm1heFJldHJpZXMsIGFybGFuLT5tYXhSZXRyaWVzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+cmVjZWl2ZU1vZGUsIGFybGFuLT5yZWNlaXZlTW9kZSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnByaW9yaXR5LCBhcmxhbi0+cHJpb3JpdHksIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5yb290T3JSZXBlYXRlciwgYXJsYW4tPnJvb3RPclJlcGVhdGVyLCB1X2NoYXIpOworCisJaWYgKFNJRCA9PSBTSURVTktOT1dOKQorCXsKKwkJICBSRUFEU0hNKGNvbmYtPlNJRCwgYXJsYW4tPlNJRCwgdV9pbnQpOworCX0KKwllbHNlIGNvbmYtPlNJRCA9IFNJRDsKKwkKKwlpZiAocmVnaXN0cmF0aW9uTW9kZSA9PSByZWdpc3RyYXRpb25Nb2RlVU5LTk9XTikKKwl7CisJCSAgUkVBRFNITShjb25mLT5yZWdpc3RyYXRpb25Nb2RlLCBhcmxhbi0+cmVnaXN0cmF0aW9uTW9kZSwgdV9jaGFyKTsKKwl9CisJZWxzZSBjb25mLT5yZWdpc3RyYXRpb25Nb2RlID0gcmVnaXN0cmF0aW9uTW9kZTsKKwkKKwlSRUFEU0hNKGNvbmYtPnJlZ2lzdHJhdGlvbkZpbGwsIGFybGFuLT5yZWdpc3RyYXRpb25GaWxsLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+bG9jYWxUYWxrQWRkcmVzcywgYXJsYW4tPmxvY2FsVGFsa0FkZHJlc3MsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jb2RlRm9ybWF0LCBhcmxhbi0+Y29kZUZvcm1hdCwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPm51bUNoYW5uZWxzLCBhcmxhbi0+bnVtQ2hhbm5lbHMsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jaGFubmVsMSwgYXJsYW4tPmNoYW5uZWwxLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDIsIGFybGFuLT5jaGFubmVsMiwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNoYW5uZWwzLCBhcmxhbi0+Y2hhbm5lbDMsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jaGFubmVsNCwgYXJsYW4tPmNoYW5uZWw0LCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+d2FpdFRpbWUsIGFybGFuLT53YWl0VGltZSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5sUGFyYW1ldGVyLCBhcmxhbi0+bFBhcmFtZXRlciwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5fMTUsIGFybGFuLT5fMTUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+aGVhZGVyU2l6ZSwgYXJsYW4tPmhlYWRlclNpemUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+aGFyZHdhcmVUeXBlLCBhcmxhbi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+cmFkaW9UeXBlLCBhcmxhbi0+cmFkaW9Nb2R1bGUsIHVfY2hhcik7CisJCisJaWYgKGNvbmYtPnJhZGlvVHlwZSA9PSAwKQorCQljb25mLT5yYWRpb1R5cGUgPSAweGM7CisKKwlXUklURVNITShhcmxhbi0+Y29uZmlnU3RhdHVzLCAweEE1LCB1X2NoYXIpOworCVJFQURTSE0odGx4NDE1LCBhcmxhbi0+Y29uZmlnU3RhdHVzLCB1X2NoYXIpOworCQorCWlmICh0bHg0MTUgIT0gMHhBNSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdGx4NDE1IGNoaXAgXG4iLCBkZXYtPm5hbWUpOworCQorCWNvbmYtPnR4Q2xlYXIgPSAwOworCWNvbmYtPnR4UmV0cmllcyA9IDE7CisJY29uZi0+dHhSb3V0aW5nID0gMTsKKwljb25mLT50eFNjcmFtYmxlZCA9IDA7CisJY29uZi0+cnhQYXJhbWV0ZXIgPSAxOworCWNvbmYtPnR4VGltZW91dE1zID0gNDAwMDsKKwljb25mLT53YWl0Q2FyZFRpbWVvdXQgPSAxMDAwMDA7CisJY29uZi0+cmVjZWl2ZU1vZGUgPSBBUkxBTl9SQ1ZfQ0xFQU47CisJbWVtY3B5X2Zyb21pbyhjb25mLT5zaXRlTmFtZSwgYXJsYW4tPm5hbWUsIDE2KTsKKwljb25mLT5zaXRlTmFtZVsxNl0gPSAnXDAnOworCWNvbmYtPnJldHJpZXMgPSByZXRyaWVzOworCWNvbmYtPnR4X2RlbGF5X21zID0gdHhfZGVsYXlfbXM7CisJY29uZi0+UmVUcmFuc21pdFBhY2tldE1heFNpemUgPSAyMDA7CisJY29uZi0+d2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplID0gMjAwOworCWNvbmYtPnR4QWNrVGltZW91dE1zID0gOTAwOworCWNvbmYtPmZhc3RSZVRyYW5zQ291bnQgPSAzOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcmVhZF9jYXJkX2NvbmZpZ3VyYXRpb24iKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGFzdEZvdW5kQXQgPSAweGJlMDAwOworCisKKy8qCisgKiBUaGlzIGlzIHRoZSByZWFsIHByb2JlIHJvdXRpbmUuIExpbnV4IGhhcyBhIGhpc3Rvcnkgb2YgZnJpZW5kbHkgZGV2aWNlCisgKiBwcm9iZXMgb24gdGhlIElTQSBidXMuIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICogdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgQVJMQU5fU0hNRU1fU0laRQkweDIwMDAKK3N0YXRpYyBpbnQgX19pbml0IGFybGFuX2NoZWNrX2ZpbmdlcnByaW50KHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwcm9iZVRleHRbXSA9ICJURUxFU1lTVEVNIFNMVyBJTkMuICAgIEFSTEFOIFwwIjsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSAoc3RydWN0IGFybGFuX3NobWVtICopIG1lbWFkZHI7CisJdW5zaWduZWQgbG9uZyBwYWRkciA9IHZpcnRfdG9fcGh5cygodm9pZCAqKSBtZW1hZGRyKTsKKwljaGFyIHRlbXBCdWZbNDldOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2NoZWNrX2ZpbmdlcnByaW50Iik7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwYWRkciwgQVJMQU5fU0hNRU1fU0laRSwgImFybGFuIikpIHsKKwkJLy8gcHJpbnRrKEtFUk5fV0FSTklORyAiYXJsYW46IG1lbW9yeSByZWdpb24gJWx4IGV4Y2x1ZGVkIGZyb20gcHJvYmluZyBcbiIscGFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1jcHlfZnJvbWlvKHRlbXBCdWYsIGFybGFuLT50ZXh0UmVnaW9uLCAyOSk7CisJdGVtcEJ1ZlszMF0gPSAwOworCisJLyogY2hlY2sgZm9yIGNhcmQgYXQgdGhpcyBhZGRyZXNzICovCisJaWYgKDAgIT0gc3RybmNtcCh0ZW1wQnVmLCBwcm9iZVRleHQsIDI5KSl7CisgCQlyZWxlYXNlX21lbV9yZWdpb24ocGFkZHIsIEFSTEFOX1NITUVNX1NJWkUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKy8vICAgcHJpbnRrKEtFUk5fSU5GTyAiYXJsYW4gZm91bmQgYXQgMHgleCBcbiIsbWVtYWRkcik7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY2hlY2tfZmluZ2VycHJpbnQiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2NoYW5nZV9tdHUiKTsKKwlpZiAobmV3X210dSA+IDIwMzIpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAobmV3X210dSA8IDI1NikKKwkJbmV3X210dSA9IDI1NjsJLyogY2FyZHMgYm9vayBzdWdnZXN0cyAxNjAwICovCisJY29uZi0+bWF4RGF0YWdyYW1TaXplID0gbmV3X210dTsKKwljb25mLT5tYXhGcmFtZVNpemUgPSBuZXdfbXR1ICsgNDg7CisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfQ09ORik7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBtdHUgY2hhbmdlZCB0byAlZCBcbiIsIGRldi0+bmFtZSwgbmV3X210dSk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jaGFuZ2VfbXR1Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmxhbl9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9tYWNfYWRkciIpOworCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fbWFjX2FkZHIiKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IGFybGFuX3NldHVwX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtKQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9zZXR1cF9kZXZpY2UiKTsKKworCWFwLT5jb25mID0gKHN0cnVjdCBhcmxhbl9zaG1lbSAqKShhcCsxKTsKKworCWRldi0+dHhfcXVldWVfbGVuID0gdHhfcXVldWVfbGVuOworCWRldi0+b3BlbiA9IGFybGFuX29wZW47CisJZGV2LT5zdG9wID0gYXJsYW5fY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhcmxhbl90eDsKKwlkZXYtPmdldF9zdGF0cyA9IGFybGFuX3N0YXRpc3RpY3M7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBhcmxhbl9zZXRfbXVsdGljYXN0OworCWRldi0+Y2hhbmdlX210dSA9IGFybGFuX2NoYW5nZV9tdHU7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhcmxhbl9tYWNfYWRkcjsKKwlkZXYtPnR4X3RpbWVvdXQgPSBhcmxhbl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAzKkhaOworCQorCWFwLT5pcnFfdGVzdF9kb25lID0gMDsKKwlhcC0+Q29uZiA9ICZhcmxhbl9jb25mW251bV07CisKKwlhcC0+Q29uZi0+cHJlX0NvbW1hbmRfV2FpdCA9IDQwOworCWFwLT5Db25mLT5yeF90d2VhazEgPSAzMDsKKwlhcC0+Q29uZi0+cnhfdHdlYWsyID0gMDsKKworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlyZWxlYXNlX21lbV9yZWdpb24odmlydF90b19waHlzKCh2b2lkICopIGRldi0+bWVtX3N0YXJ0KSwgCisJCQkgICBBUkxBTl9TSE1FTV9TSVpFKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYXJsYW5fZGV2aWNlW251bV0gPSBkZXY7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fc2V0dXBfZGV2aWNlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFybGFuX3Byb2JlX2hlcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJICAgdW5zaWduZWQgbG9uZyBtZW1hZGRyKQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJvYmVfaGVyZSIpOworCisJaWYgKGFybGFuX2NoZWNrX2ZpbmdlcnByaW50KG1lbWFkZHIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEFybGFuIGZvdW5kIGF0ICV4LCBcbiAiLCBkZXYtPm5hbWUsIAorCSAgICAgICAoaW50KSB2aXJ0X3RvX3BoeXMoKHZvaWQqKW1lbWFkZHIpKTsKKworCWFwLT5jYXJkID0gKHZvaWQgKikgbWVtYWRkcjsKKwlkZXYtPm1lbV9zdGFydCA9IG1lbWFkZHI7CisJZGV2LT5tZW1fZW5kID0gbWVtYWRkciArIEFSTEFOX1NITUVNX1NJWkUtMTsKKworCWlmIChkZXYtPmlycSA8IDIpCisJeworCQlSRUFEU0hNKGRldi0+aXJxLCBhcC0+Y2FyZC0+aXJxTGV2ZWwsIHVfY2hhcik7CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQorCQlkZXYtPmlycSA9IDk7CisKKwlhcmxhbl9yZWFkX2NhcmRfY29uZmlndXJhdGlvbihkZXYpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcHJvYmVfaGVyZSIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCWludCByZXQgPSAwOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX29wZW4iKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYXJsYW5faW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIC5cbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKworCXByaXYtPmJhZCA9IDA7CisJcHJpdi0+bGFzdFJlc2V0ID0gMDsKKwlwcml2LT5yZXNldCA9IDA7CisJbWVtY3B5X2Zyb21pbyhkZXYtPmRldl9hZGRyLCBhcmxhbi0+bGFuQ2FyZE5vZGVJZCwgNik7CisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCA2KTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IHR4X3F1ZXVlX2xlbjsKKwlwcml2LT5pbnRlcnJ1cHRfcHJvY2Vzc2luZ19hY3RpdmUgPSAwOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50ID0gMDsKKwlwcml2LT5yZWdpc3RyYXRpb25MYXN0U2VlbiA9IGppZmZpZXM7CisJcHJpdi0+dHhMYXN0ID0gMDsKKwlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwlwcml2LT5yeF9jb21tYW5kX2dpdmVuID0gMDsKKwkKKwlwcml2LT5yZVJlZ2lzdGVyRXhwID0gMTsKKwlwcml2LT50eF9sYXN0X3NlbnQgPSBqaWZmaWVzIC0gMTsKKwlwcml2LT50eF9sYXN0X2NsZWFyZWQgPSBqaWZmaWVzOworCXByaXYtPkNvbmYtPndyaXRlRUVQUk9NID0gMDsKKwlwcml2LT5Db25mLT5yZWdpc3RyYXRpb25JbnRlcnJ1cHRzID0gMTsKKworCWluaXRfdGltZXIoJnByaXYtPnRpbWVyKTsKKwlwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTA7CisJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmYXJsYW5fcmVnaXN0cmF0aW9uX3RpbWVyOwkvKiB0aW1lciBoYW5kbGVyICovCisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9QT1dFUlVQIHwgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKTsKKwltZGVsYXkoMjAwKTsKKwlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX29wZW4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhcmxhbl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX0VSUiAiJXM6IGFybGFuIHRyYW5zbWl0IHRpbWVkIG91dCwga2VybmVsIGRlY2lkZWRcbiIsIGRldi0+bmFtZSk7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsKKwkvLyBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkvLyBuZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworCitzdGF0aWMgaW50IGFybGFuX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl90eCIpOworCQorCWxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCWJ1ZiA9IHNrYi0+ZGF0YTsKKworCWlmIChsZW5ndGggKyAweDEyID4gMHg4MDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUWCBSSU5HIG92ZXJmbG93IFxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJfQorCisJaWYgKGFybGFuX2h3X3R4KGRldiwgYnVmLCBsZW5ndGgpID09IC0xKQorCQlnb3RvIGJhZF9lbmQ7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KGRldik7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fdHgiKTsKKwlyZXR1cm4gMDsKKworYmFkX2VuZDoKKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fdHgiKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBEb05vdFJlVHJhbnNtaXRDcmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKFRYTEFTVChkZXYpLmxlbmd0aCA8IHByaXYtPkNvbmYtPlJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBEb05vdFdhaXRSZVRyYW5zbWl0Q3JhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChUWExBU1QoZGV2KS5sZW5ndGggPCBwcml2LT5Db25mLT53YWl0UmVUcmFuc21pdFBhY2tldE1heFNpemUpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJsYW5fcXVldWVfcmV0cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0Iik7CisKKwlpZiAoRG9Ob3RXYWl0UmVUcmFuc21pdENyYXAoZGV2KSkKKwl7CisJCSAgYXJsYW5fZHJvcF90eChkZXYpOworCX0gZWxzZQorCQlwcml2LT5SZVRyYW5zbWl0UmVxdWVzdGVkKys7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBSZXRyeU9yRmFpbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJSZXRyeU9yRmFpbCIpOworCisJaWYgKHByaXYtPnJldHJhbnNtaXNzaW9ucyA+IHByaXYtPkNvbmYtPnJldHJpZXMgfHwKKwkgICAgRG9Ob3RSZVRyYW5zbWl0Q3JhcChkZXYpKQorCXsKKwkJYXJsYW5fZHJvcF90eChkZXYpOworCX0KKwllbHNlIGlmIChwcml2LT5iYWQgPD0gcHJpdi0+Q29uZi0+ZmFzdFJlVHJhbnNDb3VudCkKKwl7CisJCWFybGFuX3JldHJhbnNtaXRfbm93KGRldik7CisJfQorCWVsc2UgYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCisJQVJMQU5fREVCVUdfRVhJVCgiUmV0cnlPckZhaWwiKTsKK30KKworCitzdGF0aWMgdm9pZCBhcmxhbl90eF9kb25lX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl90eF9kb25lX2ludGVycnVwdCIpOworCisJcHJpdi0+dHhfbGFzdF9jbGVhcmVkID0gamlmZmllczsKKwlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwlzd2l0Y2ggKHN0YXR1cykKKwl7CisJCWNhc2UgMToKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IE9LXG4iKTsKKwkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPmJhZCA9IDA7CisJCQlwcml2LT5yZXNldCA9IDA7CisJCQlwcml2LT5yZXRyYW5zbWlzc2lvbnMgPSAwOworCQkJaWYgKHByaXYtPkNvbmYtPnR4X2RlbGF5X21zKQorCQkJeworCQkJCXByaXYtPnR4X2RvbmVfZGVsYXllZCA9IGppZmZpZXMgKyAocHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMgKiBIWikgLyAxMDAwICsgMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlUWExBU1QoZGV2KS5vZmZzZXQgPSAwOworCQkJCWlmIChwcml2LT50eExhc3QpCisJCQkJCXByaXYtPnR4TGFzdCA9IDA7CisJCQkJZWxzZSBpZiAoVFhUQUlMKGRldikub2Zmc2V0KQorCQkJCQlwcml2LT50eExhc3QgPSAxOworCQkJCWlmIChUWExBU1QoZGV2KS5vZmZzZXQpCisJCQkJeworCQkJCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCQkJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCQl9CisJCQkJaWYgKCFUWEhFQUQoZGV2KS5vZmZzZXQgfHwgIVRYVEFJTChkZXYpLm9mZnNldCkKKwkJCQl7CisJCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSAyOgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgdGltZWQgb3V0XG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJLy9hcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCQlSZXRyeU9yRmFpbChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgMzoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IG1heCByZXRyaWVzXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJLy9hcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCQlSZXRyeU9yRmFpbChkZXYpOworCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSA0OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgYWJvcnRlZFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJCS8vUmV0cnlPckZhaWwoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDU6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBub3QgcmVnaXN0ZXJlZFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCS8vZGVidWc9MTAxOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgNjoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBkZXN0aW5hdGlvbiBmdWxsXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJLy9hcmxhbl9kcm9wX3R4KGRldik7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA3OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgdW5rbm93biBhY2tcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDA7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisJCQorCQljYXNlIDg6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBkZXN0IG1haWwgYm94IGZ1bGxcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDA7CisJCQkvL2FybGFuX2Ryb3BfdHgoZGV2KTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDk6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCByb290IGRlc3Qgbm90IHJlZy5cbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDE7CisJCQkvL2FybGFuX2Ryb3BfdHgoZGV2KTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgImFybGFuIGludHI6IHRyYW5zbWl0IHN0YXR1cyB1bmtub3duXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAxOworCQkJYXJsYW5fZHJvcF90eChkZXYpOworCQl9CisJfQorCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQiKTsKK30KKworCitzdGF0aWMgdm9pZCBhcmxhbl9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIHJ4U3RhdHVzLCB1X3Nob3J0IHJ4T2Zmc2V0LCB1X3Nob3J0IHBrdF9sZW4pCit7CisJY2hhciAqc2tidG1wOworCWludCBpID0gMDsKKworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcnhfaW50ZXJydXB0Iik7CisJLy8gYnkgc3BlYywgICBub3QgICAgICAgICAgICAgICAgV1JJVEVTSE1CKGFybGFuLT5yeFN0YXR1cywweDAwKTsKKwkvLyBwcm9oaWJpdGVkIGhlcmUgICAgICAgICAgICAgIGFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1JYKTsKKworCWlmIChwa3RfbGVuIDwgMTAgfHwgcGt0X2xlbiA+IDIwNDgpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZ290IHRvbyBzaG9ydCBvciBsb25nIHBhY2tldCwgbGVuICVkIFxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocnhPZmZzZXQgKyBwa3RfbGVuID4gMHgyMDAwKQorCXsKKwkJcHJpbnRrKCIlczogZ290IHRvbyBsb25nIHBhY2tldCwgbGVuICVkIG9mZnNldCAleFxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuLCByeE9mZnNldCk7CisJCXJldHVybjsKKwl9CisJcHJpdi0+aW5fYnl0ZXMgKz0gcGt0X2xlbjsKKwlwcml2LT5pbl9ieXRlczEwICs9IHBrdF9sZW47CisJaWYgKGNvbmYtPm1lYXN1cmVfcmF0ZSA8IDEpCisJCWNvbmYtPm1lYXN1cmVfcmF0ZSA9IDE7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+aW5fdGltZSArIGNvbmYtPm1lYXN1cmVfcmF0ZSAqIEhaKSkKKwl7CisJCWNvbmYtPmluX3NwZWVkID0gcHJpdi0+aW5fYnl0ZXMgLyBjb25mLT5tZWFzdXJlX3JhdGU7CisJCXByaXYtPmluX2J5dGVzID0gMDsKKwkJcHJpdi0+aW5fdGltZSA9IGppZmZpZXM7CisJfQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmluX3RpbWUxMCArIGNvbmYtPm1lYXN1cmVfcmF0ZSAqIDEwKkhaKSkKKwl7CisJCWNvbmYtPmluX3NwZWVkMTAgPSBwcml2LT5pbl9ieXRlczEwIC8gKDEwICogY29uZi0+bWVhc3VyZV9yYXRlKTsKKwkJcHJpdi0+aW5fYnl0ZXMxMCA9IDA7CisJCXByaXYtPmluX3RpbWUxMCA9IGppZmZpZXM7CisJfQorCURFQlVHU0hNKDEsICJhcmxhbiByY3YgcGt0IHJ4U3RhdHVzPSAlZCAiLCBhcmxhbi0+cnhTdGF0dXMsIHVfY2hhcik7CisJc3dpdGNoIChyeFN0YXR1cykKKwl7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCXsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJREVCVUdTSE0oNTAsICJhcmxhbiByZWN2IHBrdCBvZmZzPSVkXG4iLCBhcmxhbi0+cnhPZmZzZXQsIHVfc2hvcnQpOworCQkJREVCVUdTSE0oMSwgImFybGFuIHJ4RnJtVHlwZSA9ICVkIFxuIiwgYXJsYW4tPnJ4RnJtVHlwZSwgdV9jaGFyKTsKKwkJCURFQlVHU0hNKDEsIEtFUk5fSU5GTyAiYXJsYW4gcnggc2NyYW1ibGVkID0gJWQgXG4iLCBhcmxhbi0+c2NyYW1ibGVkLCB1X2NoYXIpOworCisJCQkvKiBoZXJlIHdlIGRvIG11bHRpY2FzdCBmaWx0ZXJpbmcgdG8gYXZvaWQgc2xvdyA4LWJpdCBtZW1jb3B5ICovCisjaWZkZWYgQVJMQU5fTVVMVElDQVNUCisJCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJgorCQkJCSEoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJgorCQkJCWRldi0+bWNfbGlzdCkKKwkJCXsKKwkJCQljaGFyIGh3X2RzdF9hZGRyWzZdOworCQkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCQkJCWludCBpOworCisJCQkJbWVtY3B5X2Zyb21pbyhod19kc3RfYWRkciwgYXJsYW4tPnVsdGltYXRlRGVzdEFkZHJlc3MsIDYpOworCQkJCWlmIChod19kc3RfYWRkclswXSA9PSAweDAxKQorCQkJCXsKKwkJCQkJaWYgKG1kZWJ1ZykKKwkJCQkJCWlmIChod19kc3RfYWRkclsxXSA9PSAweDAwKQorCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbWNhc3QgMHgwMTAwIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWVsc2UgaWYgKGh3X2RzdF9hZGRyWzFdID09IDB4NDApCisJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBtL2JjYXN0IDB4MDE0MCBcbiIsIGRldi0+bmFtZSk7CisJCQkJCXdoaWxlIChkbWkpCisJCQkJCXsJCQkJCQkJaWYgKGRtaS0+ZG1pX2FkZHJsZW4gPT0gNikKKwkJCQkJCXsKKwkJCQkJCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19IRUFERVJfRFVNUCkKKwkJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBtY2wgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggXG4iLCBkZXYtPm5hbWUsCisJCQkJCQkJCQkJIGRtaS0+ZG1pX2FkZHJbMF0sIGRtaS0+ZG1pX2FkZHJbMV0sIGRtaS0+ZG1pX2FkZHJbMl0sCisJCQkJCQkJCQkJIGRtaS0+ZG1pX2FkZHJbM10sIGRtaS0+ZG1pX2FkZHJbNF0sIGRtaS0+ZG1pX2FkZHJbNV0pOworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQkJCQkJCWlmIChkbWktPmRtaV9hZGRyW2ldICE9IGh3X2RzdF9hZGRyW2ldKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJaWYgKGkgPT0gNikKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBtdWx0aWNhc3QgYWRkcmVzcyBsZW5ndGggZ2l2ZW4uXG4iLCBkZXYtPm5hbWUpOworCQkJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJCQl9CisJCQkJCS8qIHdlIHJlYWNoIGhlcmUgaWYgbXVsdGljYXN0IGZpbHRlcmluZyBpcyBvbiBhbmQgcGFja2V0IAorCQkJCQkgKiBpcyBtdWx0aWNhc3QgYW5kIG5vdCBmb3IgcmVjZWl2ZSAqLworCQkJCQlnb3RvIGVuZF9vZl9pbnRlcnJ1cHQ7CisJCQkJfQorCQkJfQorI2VuZGlmCQkJCS8vIEFSTEFOX01VTFRJQ0FTVAorCQkJLyogbXVsdGljYXN0IGZpbHRlcmluZyBlbmRzIGhlcmUgKi8KKwkJCXBrdF9sZW4gKz0gQVJMQU5fRkFLRV9IRFJfTEVOOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA0KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2J0bXAgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisKKwkJCW1lbWNweV9mcm9taW8oc2tidG1wICsgQVJMQU5fRkFLRV9IRFJfTEVOLCAoKGNoYXIgX19pb21lbSAqKSBhcmxhbikgKyByeE9mZnNldCwgcGt0X2xlbiAtIEFSTEFOX0ZBS0VfSERSX0xFTik7CisJCQltZW1jcHlfZnJvbWlvKHNrYnRtcCwgYXJsYW4tPnVsdGltYXRlRGVzdEFkZHJlc3MsIDYpOworCQkJbWVtY3B5X2Zyb21pbyhza2J0bXAgKyA2LCBhcmxhbi0+cnhTcmMsIDYpOworCQkJV1JJVEVTSE1CKGFybGFuLT5yeFN0YXR1cywgMHgwMCk7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCQl7CisJCQkJY2hhciBpbW1lZERlc3RBZGRyZXNzWzZdOworCQkJCWNoYXIgaW1tZWRTcmNBZGRyZXNzWzZdOworCQkJCW1lbWNweV9mcm9taW8oaW1tZWREZXN0QWRkcmVzcywgYXJsYW4tPmltbWVkRGVzdEFkZHJlc3MsIDYpOworCQkJCW1lbWNweV9mcm9taW8oaW1tZWRTcmNBZGRyZXNzLCBhcmxhbi0+aW1tZWRTcmNBZGRyZXNzLCA2KTsKKworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIHQgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggZiAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBpbWQgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggaW1zICUyeDolMng6JTJ4OiUyeDolMng6JTJ4XG4iLCBkZXYtPm5hbWUsCisJCQkJCSh1bnNpZ25lZCBjaGFyKSBza2J0bXBbMF0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbMV0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbMl0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbM10sCisJCQkJCSh1bnNpZ25lZCBjaGFyKSBza2J0bXBbNF0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbNV0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbNl0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbN10sCisJCQkJCSh1bnNpZ25lZCBjaGFyKSBza2J0bXBbOF0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbOV0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbMTBdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzExXSwKKwkJCQkJaW1tZWREZXN0QWRkcmVzc1swXSwgaW1tZWREZXN0QWRkcmVzc1sxXSwgaW1tZWREZXN0QWRkcmVzc1syXSwKKwkJCQkJaW1tZWREZXN0QWRkcmVzc1szXSwgaW1tZWREZXN0QWRkcmVzc1s0XSwgaW1tZWREZXN0QWRkcmVzc1s1XSwKKwkJCQkJaW1tZWRTcmNBZGRyZXNzWzBdLCBpbW1lZFNyY0FkZHJlc3NbMV0sIGltbWVkU3JjQWRkcmVzc1syXSwKKwkJCQkJaW1tZWRTcmNBZGRyZXNzWzNdLCBpbW1lZFNyY0FkZHJlc3NbNF0sIGltbWVkU3JjQWRkcmVzc1s1XSk7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19IRUFERVJfRFVNUCkKKwkJCQlpZiAoc2tiLT5wcm90b2NvbCAhPSAweDYwOCAmJiBza2ItPnByb3RvY29sICE9IDB4OCkKKwkJCQl7CisJCQkJCWZvciAoaSA9IDA7IGkgPD0gMjI7IGkrKykKKwkJCQkJCXByaW50aygiJTAyeDoiLCAodV9jaGFyKSBza2J0bXBbaSArIDEyXSk7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJsYW4ga2VybmVsIHBrdCB0eXBlIHRyYW5zICV4IFxuIiwgc2tiLT5wcm90b2NvbCk7CisJCQkJfQorCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYXJsYW4gaW50cjogcmVjZWl2ZWQgdW5rbm93biBzdGF0dXNcbiIpOworCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJYnJlYWs7CisJfQorCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3J4X2ludGVycnVwdCIpOworfQorCitzdGF0aWMgdm9pZCBhcmxhbl9wcm9jZXNzX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXVfY2hhciByeFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT5yeFN0YXR1cyk7CisJdV9jaGFyIHR4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnR4U3RhdHVzKTsKKwl1X3Nob3J0IHJ4T2Zmc2V0ID0gUkVBRFNITVMoYXJsYW4tPnJ4T2Zmc2V0KTsKKwl1X3Nob3J0IHBrdF9sZW4gPSBSRUFEU0hNUyhhcmxhbi0+cnhMZW5ndGgpOworCWludCBpbnRlcnJ1cHRfY291bnQgPSAwOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3Byb2Nlc3NfaW50ZXJydXB0Iik7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmcHJpdi0+aW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlKSkKKwl7CisJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NIQUlOX0xPQ0tTKQorCQkJcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgY2hhaW4gcmVlbnRlcmluZyBcbiIpOworCQlnb3RvIGVuZF9pbnRfcHJvY2VzczsKKwl9CisJd2hpbGUgKChyeFN0YXR1cyB8fCB0eFN0YXR1cyB8fCBwcml2LT5pbnRlcnJ1cHRfYWNrX3JlcXVlc3RlZCkKKwkJCSYmIChpbnRlcnJ1cHRfY291bnQgPCA1KSkKKwl7CisJCWlmIChyeFN0YXR1cykKKwkJCXByaXYtPmxhc3RfcnhfaW50X2Fja190aW1lID0gamlmZmllczsKKworCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9JTlRfQUNLKTsKKwkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRSk7CisJCQorCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0lOVEVSUlVQVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICBnb3QgSVJRIHJ4ICV4IHR4ICV4IGNvbW0gJXggcnhPZmYgJXggcnhMZW4gJXggXG4iLAorCQkJCQlkZXYtPm5hbWUsIHJ4U3RhdHVzLCB0eFN0YXR1cywgUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSwKKwkJCQkJcnhPZmZzZXQsIHBrdF9sZW4pOworCisJCWlmIChyeFN0YXR1cyA9PSAwICYmIHR4U3RhdHVzID09IDApCisJCXsKKwkJCWlmIChwcml2LT5pcnFfdGVzdF9kb25lKQorCQkJeworCQkJCWlmICghcmVnaXN0cmF0aW9uQmFkKGRldikpCisJCQkJCUlGREVCVUcoQVJMQU5fREVCVUdfSU5URVJSVVBUKSBwcmludGsoS0VSTl9FUlIgIiVzIHVua25vd24gaW50ZXJydXB0KG5vcD8gcmVnTG9zdCA/KSByZWFzb24gdHggJWQgcnggJWQgIiwKKwkJCQkJCQkJCQkgICAgZGV2LT5uYW1lLCB0eFN0YXR1cywgcnhTdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0lOVEVSUlVQVCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgaXJxICQlZCB0ZXN0IE9LIFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwkJCX0KKwkJCXByaXYtPmludGVycnVwdF9hY2tfcmVxdWVzdGVkID0gMDsKKwkJCWdvdG8gZW5kczsKKwkJfQorCQlpZiAodHhTdGF0dXMgIT0gMCkKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT50eFN0YXR1cywgMHgwMCk7CisJCQlhcmxhbl90eF9kb25lX2ludGVycnVwdChkZXYsIHR4U3RhdHVzKTsKKwkJCWdvdG8gZW5kczsKKwkJfQorCQlpZiAocnhTdGF0dXMgPT0gMSB8fCByeFN0YXR1cyA9PSAyKQorCQl7CQkvKiBhIHBhY2tldCB3YWl0aW5nICovCisJCQlhcmxhbl9yeF9pbnRlcnJ1cHQoZGV2LCByeFN0YXR1cywgcnhPZmZzZXQsIHBrdF9sZW4pOworCQkJZ290byBlbmRzOworCQl9CisJCWlmIChyeFN0YXR1cyA+IDIgJiYgcnhTdGF0dXMgPCAweGZmKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPnJ4U3RhdHVzLCAweDAwKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgdW5rbm93biByeFN0YXR1cyByZWFzb24gdHggJWQgcnggJWQgIiwKKwkJCQlkZXYtPm5hbWUsIHR4U3RhdHVzLCByeFN0YXR1cyk7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHJ4U3RhdHVzID09IDB4ZmYpCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsIDB4MDApOworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUlgpOworCQkJaWYgKHJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCWlmICghcmVnaXN0cmF0aW9uQmFkKGRldikpCisJCQl7CisJCQkJcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4gPSBqaWZmaWVzOworCQkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmICFwcml2LT51bmRlcl9yZXNldCAmJiAhcHJpdi0+dW5kZXJfY29uZmlnKQorCQkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCQkJZ290byBlbmRzOworCQl9CitlbmRzOgorCisJCWFybGFuX2NvbW1hbmRfcHJvY2VzcyhkZXYpOworCisJCXJ4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnJ4U3RhdHVzKTsKKwkJdHhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+dHhTdGF0dXMpOworCQlyeE9mZnNldCA9IFJFQURTSE1TKGFybGFuLT5yeE9mZnNldCk7CisJCXBrdF9sZW4gPSBSRUFEU0hNUyhhcmxhbi0+cnhMZW5ndGgpOworCisKKwkJcHJpdi0+aXJxX3Rlc3RfZG9uZSA9IDE7CisKKwkJaW50ZXJydXB0X2NvdW50Kys7CisJfQorCXByaXYtPmludGVycnVwdF9wcm9jZXNzaW5nX2FjdGl2ZSA9IDA7CisKK2VuZF9pbnRfcHJvY2VzczoKKwlhcmxhbl9jb21tYW5kX3Byb2Nlc3MoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3Byb2Nlc3NfaW50ZXJydXB0Iik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJsYW5faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwl1X2NoYXIgcnhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+cnhTdGF0dXMpOworCXVfY2hhciB0eFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT50eFN0YXR1cyk7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5faW50ZXJydXB0Iik7CisKKworCWlmICghcnhTdGF0dXMgJiYgIXR4U3RhdHVzKQorCQlwcml2LT5pbnRlcnJ1cHRfYWNrX3JlcXVlc3RlZCsrOworCisJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoZGV2KTsKKwkKKwlwcml2LT5pcnFfdGVzdF9kb25lID0gMTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2ludGVycnVwdCIpOworCXJldHVybiBJUlFfSEFORExFRDsKKworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fY2xvc2UiKTsKKworCWRlbF90aW1lcl9zeW5jKCZwcml2LT50aW1lcik7CisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04pOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19TVEFSVFVQKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBDbG9zaW5nIGRldmljZVxuIiwgZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2Nsb3NlIik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKK3N0YXRpYyBsb25nIGFsaWduTG9uZyh2b2xhdGlsZSB1X2NoYXIgKiBwdHIpCit7CisJbG9uZyByZXQ7CisJbWVtY3B5X2Zyb21pbygmcmV0LCAodm9pZCAqKSBwdHIsIDQpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmxhbl9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9zdGF0aXN0aWNzIik7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KKworCVJFQURTSE0ocHJpdi0+c3RhdHMuY29sbGlzaW9ucywgYXJsYW4tPm51bVJlVHJhbnNtaXNzaW9ucywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycywgYXJsYW4tPm51bUNSQ0Vycm9ycywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfZHJvcHBlZCwgYXJsYW4tPm51bUZyYW1lc0Rpc2NhcmRlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfZmlmb19lcnJvcnMsIGFybGFuLT5udW1SWEJ1ZmZlck92ZXJmbG93cywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzLCBhcmxhbi0+bnVtUmVjZWl2ZUZyYW1lc0xvc3QsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzLCBhcmxhbi0+bnVtUlhPdmVycnVucywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfcGFja2V0cywgYXJsYW4tPm51bURhdGFncmFtc1JlY2VpdmVkLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycywgYXJsYW4tPm51bUFib3J0RXJyb3JzLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycywgYXJsYW4tPm51bVN0YXR1c1RpbWVvdXRzLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF9kcm9wcGVkLCBhcmxhbi0+bnVtRGF0YWdyYW1zRGlzY2FyZGVkLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycywgYXJsYW4tPm51bVRYVW5kZXJydW5zLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF9wYWNrZXRzLCBhcmxhbi0+bnVtRGF0YWdyYW1zVHJhbnNtaXR0ZWQsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMsIGFybGFuLT5udW1Ib2xkT2ZmcywgdV9pbnQpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fc3RhdGlzdGljcyIpOworCisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBhcmxhbl9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisJaW50IGJvYXJkX2NvbmZfbmVlZGVkID0gMDsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3NldF9tdWx0aWNhc3QiKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJeworCQl1bnNpZ25lZCBjaGFyIHJlY01vZGU7CisJCVJFQURTSE0ocmVjTW9kZSwgYXJsYW4tPnJlY2VpdmVNb2RlLCB1X2NoYXIpOworCQljb25mLT5yZWNlaXZlTW9kZSA9IChBUkxBTl9SQ1ZfUFJPTUlTQyB8IEFSTEFOX1JDVl9DT05UUk9MKTsKKwkJaWYgKGNvbmYtPnJlY2VpdmVNb2RlICE9IHJlY01vZGUpCisJCQlib2FyZF9jb25mX25lZWRlZCA9IDE7CisJfQorCWVsc2UKKwl7CisJCS8qIHR1cm4gb2ZmIHByb21pc2N1b3VzIG1vZGUgICovCisJCXVuc2lnbmVkIGNoYXIgcmVjTW9kZTsKKwkJUkVBRFNITShyZWNNb2RlLCBhcmxhbi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJCWNvbmYtPnJlY2VpdmVNb2RlID0gQVJMQU5fUkNWX0NMRUFOIHwgQVJMQU5fUkNWX0NPTlRST0w7CisJCWlmIChjb25mLT5yZWNlaXZlTW9kZSAhPSByZWNNb2RlKQorCQkJYm9hcmRfY29uZl9uZWVkZWQgPSAxOworCX0KKwlpZiAoYm9hcmRfY29uZl9uZWVkZWQpCisJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NPTkYpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fc2V0X211bHRpY2FzdCIpOworfQorCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGFybGFuX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKwlpbnQgbTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcm9iZSIpOworCisJaWYgKGFybGFuc19mb3VuZCA9PSBNQVhfQVJMQU5TKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCS8qIAorCSAqIFJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIGRhdGEgYW5kIGEgY29weSBvZiB0aGUgc2hhcmVkIG1lbW9yeQorCSAqIHRoYXQgaXMgdXNlZCBieSB0aGUgL3Byb2MgaW50ZXJmYWNlLgorCSAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSkKKwkJCSAgICAgKyBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJCQorCQlpZiAoZGV2LT5tZW1fc3RhcnQpIHsKKwkJCWlmIChhcmxhbl9wcm9iZV9oZXJlKGRldiwgZGV2LT5tZW1fc3RhcnQpID09IDApCisJCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gbm90X2ZvdW5kOworCQl9CisJCQkKKwl9CisKKworCWZvciAobSA9IChpbnQpcGh5c190b192aXJ0KGxhc3RGb3VuZEF0KSArIEFSTEFOX1NITUVNX1NJWkU7IAorCSAgICAgbSA8PSAoaW50KXBoeXNfdG9fdmlydCgweERFMDAwKTsgCisJICAgICBtICs9IEFSTEFOX1NITUVNX1NJWkUpCisJeworCQlpZiAoYXJsYW5fcHJvYmVfaGVyZShkZXYsIG0pID09IDApCisJCXsKKwkJCWxhc3RGb3VuZEF0ID0gKGludCl2aXJ0X3RvX3BoeXMoKHZvaWQqKW0pOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCWlmIChsYXN0Rm91bmRBdCA9PSAweGJlMDAwKQorCQlwcmludGsoS0VSTl9FUlIgImFybGFuOiBObyBBcmxhbiBkZXZpY2VzIGZvdW5kIFxuIik7CisKKyBub3RfZm91bmQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworIGZvdW5kOgorCWVyciA9IGFybGFuX3NldHVwX2RldmljZShkZXYsIGFybGFuc19mb3VuZCk7CisJaWYgKGVycikKKwkJZGV2ID0gRVJSX1BUUihlcnIpOworCWVsc2UgaWYgKCFhcmxhbnNfZm91bmQrKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXJsYW4gZHJpdmVyICVzXG4iLCBhcmxhbl92ZXJzaW9uKTsKKworCXJldHVybiBkZXY7Cit9CisKKyNpZmRlZiAgTU9EVUxFCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiaW5pdF9tb2R1bGUiKTsKKworCWlmIChjaGFubmVsU2V0ICE9IGNoYW5uZWxTZXRVTktOT1dOIHx8IGNoYW5uZWxOdW1iZXIgIT0gY2hhbm5lbE51bWJlclVOS05PV04gfHwgc3lzdGVtSWQgIT0gc3lzdGVtSWRVTktOT1dOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJMQU5TOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFybGFuX3Byb2JlKGkpOworCisJCWlmIChJU19FUlIoZGV2KSkgCisJCQlyZXR1cm4gUFRSX0VSUihkZXYpOworCX0KKwlpbml0X2FybGFuX3Byb2MoKTsKKwlwcmludGsoS0VSTl9JTkZPICJBcmxhbiBkcml2ZXIgJXNcbiIsIGFybGFuX3ZlcnNpb24pOworCUFSTEFOX0RFQlVHX0VYSVQoImluaXRfbW9kdWxlIik7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJQVJMQU5fREVCVUdfRU5UUlkoImNsZWFudXBfbW9kdWxlIik7CisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX1NIVVRET1dOKQorCQlwcmludGsoS0VSTl9JTkZPICJhcmxhbjogdW5sb2FkaW5nIG1vZHVsZVxuIik7CisKKwljbGVhbnVwX2FybGFuX3Byb2MoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJMQU5TOyBpKyspCisJeworCQlkZXYgPSBhcmxhbl9kZXZpY2VbaV07CisJCWlmIChkZXYpIHsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1BPV0VSRE9XTiApOworCisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHZpcnRfdG9fcGh5cygodm9pZCAqKSBkZXYtPm1lbV9zdGFydCksIAorCQkJCQkgICBBUkxBTl9TSE1FTV9TSVpFKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlhcmxhbl9kZXZpY2VbaV0gPSBOVUxMOworCQl9CisJfQorCisJQVJMQU5fREVCVUdfRVhJVCgiY2xlYW51cF9tb2R1bGUiKTsKK30KKworCisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLXByb2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNjYTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tcHJvYy5jCkBAIC0wLDAgKzEsMTI2MiBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImFybGFuLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKy8qIHZvaWQgZW5hYmxlUmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKyovCisKKworCisjZGVmaW5lIEFSTEFOX1NUUl9TSVpFIAkweDJmZjAKKyNkZWZpbmUgREVWX0FSTEFOX0lORk8gCTEKKyNkZWZpbmUgREVWX0FSTEFOIAkxCisjZGVmaW5lIFNBUkxHKHR5cGUsdmFyKSB7XAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4JXhcbiIsICN2YXIsIFJFQURTSE1CKHByaXZhLT5jYXJkLT52YXIpKTsJXAorCX0KKworI2RlZmluZSBTQVJMQk4odHlwZSx2YXIsbm4pIHtcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlc1x0PVx0MHgiLCN2YXIpO1wKKwlmb3IgKGk9MDsgaSA8IG5uOyBpKysgKSBwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiUwMngiLFJFQURTSE1CKHByaXZhLT5jYXJkLT52YXJbaV0pKTtcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICJcbiIpOwlcCisJfQorCisjZGVmaW5lIFNBUkxCTnBsbih0eXBlLHZhcixubikge1wKKwlmb3IgKGk9MDsgaSA8IG5uOyBpKysgKSBwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiUwMngiLFJFQURTSE1CKHByaXZhLT5jYXJkLT52YXJbaV0pKTtcCisJfQorCisjZGVmaW5lIFNBUkxTVFIodmFyLG5uKSB7XAorCWNoYXIgdG1wU3RyWzQwMF07XAorCWludCAgdG1wTG4gPSBubjtcCisJaWYgKG5uID4gMzk5ICkgdG1wTG4gPSAzOTk7IFwKKwltZW1jcHkodG1wU3RyLChjaGFyICopIHByaXZhLT5jb25mLT52YXIsdG1wTG4pO1wKKwl0bXBTdHJbdG1wTG5dID0gMDsgXAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdCVzIFxuIiwjdmFyLHByaXZhLT5jb25mLT52YXIpO1wKKwl9CisKKyNkZWZpbmUgU0FSTFVDKHZhcikgIAlTQVJMRyh1X2NoYXIsIHZhcikKKyNkZWZpbmUgU0FSTFVDTih2YXIsbm4pIFNBUkxCTih1X2NoYXIsdmFyLCBubikKKyNkZWZpbmUgU0FSTFVTKHZhcikJU0FSTEcodV9zaG9ydCwgdmFyKQorI2RlZmluZSBTQVJMVVNOKHZhcixubikJU0FSTEJOKHVfc2hvcnQsdmFyLCBubikKKyNkZWZpbmUgU0FSTFVJKHZhcikJU0FSTEcodV9pbnQsIHZhcikKKworI2RlZmluZSBTQVJMVVNBKHZhcikge1wKKwl1X3Nob3J0IHRtcFZhcjtcCisJbWVtY3B5KCZ0bXBWYXIsIChzaG9ydCAqKSBwcml2YS0+Y29uZi0+dmFyLDIpOyBcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlc1x0PVx0MHgleFxuIiwjdmFyLCB0bXBWYXIpO1wKK30KKworI2RlZmluZSBTQVJMVUlBKHZhcikge1wKKwl1X2ludCB0bXBWYXI7XAorCW1lbWNweSgmdG1wVmFyLCAoaW50KiApcHJpdmEtPmNvbmYtPnZhciw0KTsgXAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4JXhcbiIsI3ZhciwgdG1wVmFyKTtcCit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmFybGFuX2RpYWdub3N0aWNfaW5mb19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXVfY2hhciBkaWFnbm9zdGljSW5mbzsKKworCVJFQURTSE0oZGlhZ25vc3RpY0luZm8sIGFybGFuLT5kaWFnbm9zdGljSW5mbywgdV9jaGFyKTsKKworCXN3aXRjaCAoZGlhZ25vc3RpY0luZm8pCisJeworCQljYXNlIDB4RkY6CisJCQlyZXR1cm4gIkRpYWdub3N0aWMgaW5mbyBpcyBPSyI7CisJCWNhc2UgMHhGRToKKwkJCXJldHVybiAiRVJST1IgRVBST00gQ2hlY2tzdW0gZXJyb3IgIjsKKwkJY2FzZSAweEZEOgorCQkJcmV0dXJuICJFUlJPUiBMb2NhbCBSYW0gVGVzdCBGYWlsZWQgIjsKKwkJY2FzZSAweEZDOgorCQkJcmV0dXJuICJFUlJPUiBTQ0MgZmFpbHVyZSAiOworCQljYXNlIDB4RkI6CisJCQlyZXR1cm4gIkVSUk9SIEJhY2tCb25lIGZhaWx1cmUgIjsKKwkJY2FzZSAweEZBOgorCQkJcmV0dXJuICJFUlJPUiB0cmFuc2NlaXZlciBub3QgZm91bmQgIjsKKwkJY2FzZSAweEY5OgorCQkJcmV0dXJuICJFUlJPUiBubyBtb3JlIGFkZHJlc3Mgc3BhY2UgIjsKKwkJY2FzZSAweEY4OgorCQkJcmV0dXJuICJFUlJPUiBDaGVja3N1bSBlcnJvciAgIjsKKwkJY2FzZSAweEY3OgorCQkJcmV0dXJuICJFUlJPUiBNaXNzaW5nIFNTIENvZGUiOworCQljYXNlIDB4RjY6CisJCQlyZXR1cm4gIkVSUk9SIEludmFsaWQgY29uZmlnIGZvcm1hdCI7CisJCWNhc2UgMHhGNToKKwkJCXJldHVybiAiRVJST1IgUmVzZXJ2ZWQgZXJyb3Jjb2RlIEY1IjsKKwkJY2FzZSAweEY0OgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIHNwcmVhZGluZyBjb2RlL2NoYW5uZWwgbnVtYmVyIjsKKwkJY2FzZSAweEYzOgorCQkJcmV0dXJuICJFUlJPUiBMb2FkIENvZGUgRXJyb3IiOworCQljYXNlIDB4RjI6CisJCQlyZXR1cm4gIkVSUk9SIFJlc2VydmVyIGVycm9yY29kZSBGMiAiOworCQljYXNlIDB4RjE6CisJCQlyZXR1cm4gIkVSUk9SIEludmFsaWQgY29tbWFuZCByZWNlaXZlYyBieSBMQU4gY2FyZCAiOworCQljYXNlIDB4RjA6CisJCQlyZXR1cm4gIkVSUk9SIEludmFsaWQgcGFyYW1ldGVyIGZvdW5kIGluIGNvbW1hbmQgIjsKKwkJY2FzZSAweEVGOgorCQkJcmV0dXJuICJFUlJPUiBPbi1jaGlwIHRpbWVyIGZhaWx1cmUgIjsKKwkJY2FzZSAweEVFOgorCQkJcmV0dXJuICJFUlJPUiBUNDEwIHRpbWVyIGZhaWx1cmUgIjsKKwkJY2FzZSAweEVEOgorCQkJcmV0dXJuICJFUlJPUiBUb28gTWFueSBUeEVuYWJsZSBjb21tYW5kcyAiOworCQljYXNlIDB4RUM6CisJCQlyZXR1cm4gIkVSUk9SIEVFUFJPTSBlcnJvciBvbiByYWRpbyBtb2R1bGUgIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiRVJST1IgdW5rbm93biBEaWFnbm9zdGljIGluZm8gcmVwbHkgY29kZSAiOworCSAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXJsYW5faGFyZHdhcmVfdHlwZV9zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2NoYXIgaGFyZHdhcmVUeXBlOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisJUkVBRFNITShoYXJkd2FyZVR5cGUsIGFybGFuLT5oYXJkd2FyZVR5cGUsIHVfY2hhcik7CisJc3dpdGNoIChoYXJkd2FyZVR5cGUpCisJeworCQljYXNlIDB4MDA6CisJCQlyZXR1cm4gInR5cGUgQTQ1MCI7CisJCWNhc2UgMHgwMToKKwkJCXJldHVybiAidHlwZSBBNjUwICI7CisJCWNhc2UgMHgwNDoKKwkJCXJldHVybiAidHlwZSBUTUEgY29wcm9jIjsKKwkJY2FzZSAweDBEOgorCQkJcmV0dXJuICJ0eXBlIEE2NTBFICI7CisJCWNhc2UgMHgxODoKKwkJCXJldHVybiAidHlwZSBUTUEgY29wcm9jIEF1c3RyYWxpYW4iOworCQljYXNlIDB4MTk6CisJCQlyZXR1cm4gInR5cGUgQTY1MEEgIjsKKwkJY2FzZSAweDI2OgorCQkJcmV0dXJuICJ0eXBlIFRNQSBjb3Byb2MgRXVyb3BlYW4iOworCQljYXNlIDB4MkU6CisJCQlyZXR1cm4gInR5cGUgQTY1NSAiOworCQljYXNlIDB4MkY6CisJCQlyZXR1cm4gInR5cGUgQTY1NUEgIjsKKwkJY2FzZSAweDMwOgorCQkJcmV0dXJuICJ0eXBlIEE2NTVFICI7CisJCWNhc2UgMHgwQjoKKwkJCXJldHVybiAidHlwZSBBNjcwICI7CisJCWNhc2UgMHgwQzoKKwkJCXJldHVybiAidHlwZSBBNjcwRSAiOworCQljYXNlIDB4MkQ6CisJCQlyZXR1cm4gInR5cGUgQTY3MEEgIjsKKwkJY2FzZSAweDBGOgorCQkJcmV0dXJuICJ0eXBlIEE0MTFUIjsKKwkJY2FzZSAweDE2OgorCQkJcmV0dXJuICJ0eXBlIEE0MTFUQSI7CisJCWNhc2UgMHgxQjoKKwkJCXJldHVybiAidHlwZSBBNDQwVCI7CisJCWNhc2UgMHgxQzoKKwkJCXJldHVybiAidHlwZSBBNDEyVCI7CisJCWNhc2UgMHgxRToKKwkJCXJldHVybiAidHlwZSBBNDEyVEEiOworCQljYXNlIDB4MjI6CisJCQlyZXR1cm4gInR5cGUgQTQxMVRFIjsKKwkJY2FzZSAweDI0OgorCQkJcmV0dXJuICJ0eXBlIEE0MTJURSI7CisJCWNhc2UgMHgyNzoKKwkJCXJldHVybiAidHlwZSBBNjcxVCAiOworCQljYXNlIDB4Mjk6CisJCQlyZXR1cm4gInR5cGUgQTY3MVRBICI7CisJCWNhc2UgMHgyQjoKKwkJCXJldHVybiAidHlwZSBBNjcxVEUgIjsKKwkJY2FzZSAweDMxOgorCQkJcmV0dXJuICJ0eXBlIEE0MTVUICI7CisJCWNhc2UgMHgzMzoKKwkJCXJldHVybiAidHlwZSBBNDE1VEEgIjsKKwkJY2FzZSAweDM1OgorCQkJcmV0dXJuICJ0eXBlIEE0MTVURSAiOworCQljYXNlIDB4Mzc6CisJCQlyZXR1cm4gInR5cGUgQTY3MiI7CisJCWNhc2UgMHgzOToKKwkJCXJldHVybiAidHlwZSBBNjcyQSAiOworCQljYXNlIDB4M0I6CisJCQlyZXR1cm4gInR5cGUgQTY3MlQiOworCQljYXNlIDB4NkI6CisJCQlyZXR1cm4gInR5cGUgSUMyMjAwIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidHlwZSBBNjcyVCI7CisJfQorfQorI2lmZGVmIEFSTEFOX0RFQlVHR0lORworc3RhdGljIHZvaWQgYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJdV9jaGFyIGRpYWdub3N0aWNJbmZvOworCXVfc2hvcnQgZGlhZ25vc3RpY09mZnNldDsKKwl1X2NoYXIgaGFyZHdhcmVUeXBlOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisJLy8gIEFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcmludF9kaWFnbm9zdGljX2luZm8iKTsKKworCWlmIChSRUFEU0hNQihhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcpID09IDApCisJCXByaW50aygiQXJsYW46IENhcmQgTk9UIGNvbmZpZ3VyZWRcbiIpOworCWVsc2UKKwkJcHJpbnRrKCJBcmxhbjogQ2FyZCBpcyBjb25maWd1cmVkXG4iKTsKKworCVJFQURTSE0oZGlhZ25vc3RpY0luZm8sIGFybGFuLT5kaWFnbm9zdGljSW5mbywgdV9jaGFyKTsKKwlSRUFEU0hNKGRpYWdub3N0aWNPZmZzZXQsIGFybGFuLT5kaWFnbm9zdGljT2Zmc2V0LCB1X3Nob3J0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBhcmxhbl9kaWFnbm9zdGljX2luZm9fc3RyaW5nKGRldikpOworCisJaWYgKGRpYWdub3N0aWNJbmZvICE9IDB4ZmYpCisJCXByaW50aygiJXMgYXJsYW46IERpYWdub3N0aWMgT2Zmc2V0ICVkIFxuIiwgZGV2LT5uYW1lLCBkaWFnbm9zdGljT2Zmc2V0KTsKKworCXByaW50aygiYXJsYW46IExBTiBDT0RFIElEID0gIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJREVCVUdTSE0oMSwgIiUwM2Q6IiwgYXJsYW4tPmxhbkNhcmROb2RlSWRbaV0sIHVfY2hhcik7CisJcHJpbnRrKCJcbiIpOworCisJcHJpbnRrKCJhcmxhbjogQXJsYW4gQnJvYWRDYXN0IGFkZHJlc3MgID0gIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJREVCVUdTSE0oMSwgIiUwM2Q6IiwgYXJsYW4tPmJyb2FkY2FzdEFkZHJlc3NbaV0sIHVfY2hhcik7CisJcHJpbnRrKCJcbiIpOworCisJUkVBRFNITShoYXJkd2FyZVR5cGUsIGFybGFuLT5oYXJkd2FyZVR5cGUsIHVfY2hhcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGFybGFuX2hhcmR3YXJlX3R5cGVfc3RyaW5nKGRldikpOworCisKKwlERUJVR1NITSgxLCAiYXJsYW46IGNoYW5uZWxOdW1iZXI9JWRcbiIsIGFybGFuLT5jaGFubmVsTnVtYmVyLCB1X2NoYXIpOworCURFQlVHU0hNKDEsICJhcmxhbjogY2hhbm5lbFNldD0lZFxuIiwgYXJsYW4tPmNoYW5uZWxTZXQsIHVfY2hhcik7CisJREVCVUdTSE0oMSwgImFybGFuOiBzcHJlYWRpbmdDb2RlPSVkXG4iLCBhcmxhbi0+c3ByZWFkaW5nQ29kZSwgdV9jaGFyKTsKKwlERUJVR1NITSgxLCAiYXJsYW46IHJhZGlvTm9kZUlkPSVkXG4iLCBhcmxhbi0+cmFkaW9Ob2RlSWQsIHVfc2hvcnQpOworCURFQlVHU0hNKDEsICJhcmxhbjogU0lECT0lZFxuIiwgYXJsYW4tPlNJRCwgdV9zaG9ydCk7CisJREVCVUdTSE0oMSwgImFybGFuOiByeE9mZnNldD0lZFxuIiwgYXJsYW4tPnJ4T2Zmc2V0LCB1X3Nob3J0KTsKKworCURFQlVHU0hNKDEsICJhcmxhbjogcmVnaXN0cmF0aW9uIG1vZGUgaXMgJWRcbiIsIGFybGFuLT5yZWdpc3RyYXRpb25Nb2RlLCB1X2NoYXIpOworCisJcHJpbnRrKCJhcmxhbjogbmFtZT0gIik7CisJSUZERUJVRygxKQorCQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJY2hhciBjOworCQlSRUFEU0hNKGMsIGFybGFuLT5uYW1lW2ldLCBjaGFyKTsKKwkJaWYgKGMpCisJCQlwcmludGsoIiVjIiwgYyk7CisJfQorCXByaW50aygiXG4iKTsKKworLy8gICBBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9wcmludF9kaWFnbm9zdGljX2luZm8iKTsKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioJCVRFU1QgCU1FTU9SWQkqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBhcmxhbl9od190ZXN0X21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfY2hhciAqcHRyOworCWludCBpOworCWludCBtZW1sZW4gPSBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSAtIDB4RjsJLyogYXZvaWQgY29udHJvbCByZWdpc3RlciAqLworCXZvbGF0aWxlIGNoYXIgKmFybGFuX21lbSA9IChjaGFyICopIChkZXYtPm1lbV9zdGFydCk7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJY2hhciBwYXR0ZXJuOworCisJcHRyID0gTlVMTDsKKworCS8qIGhvbGQgY2FyZCBpbiByZXNldCBzdGF0ZSAqLworCXNldEhhcmR3YXJlUmVzZXQoZGV2KTsKKworCS8qIHRlc3QgbWVtb3J5ICovCisJcGF0dGVybiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1lbWxlbjsgaSsrKQorCQlXUklURVNITShhcmxhbl9tZW1baV0sICgodV9jaGFyKSBwYXR0ZXJuKyspLCB1X2NoYXIpOworCisJcGF0dGVybiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1lbWxlbjsgaSsrKQorCXsKKwkJY2hhciByZXM7CisJCVJFQURTSE0ocmVzLCBhcmxhbl9tZW1baV0sIGNoYXIpOworCQlpZiAocmVzICE9IHBhdHRlcm4rKykKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJBcmxhbiBkcml2ZXIgbWVtb3J5IHRlc3QgMSBmYWlsZWQgXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwkJV1JJVEVTSE0oYXJsYW5fbWVtW2ldLCB+KHBhdHRlcm4rKyksIGNoYXIpOworCisJcGF0dGVybiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1lbWxlbjsgaSsrKQorCXsKKwkJY2hhciByZXM7CisJCVJFQURTSE0ocmVzLCBhcmxhbl9tZW1baV0sIGNoYXIpOworCQlpZiAocmVzICE9IH4ocGF0dGVybisrKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJBcmxhbiBkcml2ZXIgbWVtb3J5IHRlc3QgMiBmYWlsZWQgXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIHplcm8gbWVtb3J5ICovCisJZm9yIChpID0gMDsgaSA8IG1lbWxlbjsgaSsrKQorCQlXUklURVNITShhcmxhbl9tZW1baV0sIDB4MDAsIGNoYXIpOworCisJSUZERUJVRygxKSBwcmludGsoS0VSTl9JTkZPICJBcmxhbjogbWVtb3J5IHRlc3RzIG9rXG4iKTsKKworCS8qIHNldCByZXNldCBmbGFnIGFuZCB0aGVuIHJlbGVhc2UgcmVzZXQgKi8KKwlXUklURVNITShhcmxhbi0+cmVzZXRGbGFnLCAweGZmLCB1X2NoYXIpOworCisJY2xlYXJDaGFubmVsQXR0ZW50aW9uKGRldik7CisJY2xlYXJIYXJkd2FyZVJlc2V0KGRldik7CisKKwkvKiB3YWl0IGZvciByZXNldCBmbGFnIHRvIGJlY29tZSB6ZXJvLCB3ZSdsbCB3YWl0IGZvciB0d28gc2Vjb25kcyAqLworCWlmIChhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgYXJsYW46IGZhaWxlZCB0byBjb21lIGJhY2sgZnJvbSBtZW1vcnkgdGVzdFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmxhbl9zZXR1cF9jYXJkX2J5X2Jvb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2NoYXIgaXJxTGV2ZWwsIGNvbmZpZ3VyZWRTdGF0dXNGbGFnOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisvLwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc2V0dXBfY2FyZCIpOworCisJUkVBRFNITShjb25maWd1cmVkU3RhdHVzRmxhZywgYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnLCB1X2NoYXIpOworCisJSUZERUJVRygxMCkKKwlpZiAoY29uZmlndXJlZFN0YXR1c0ZsYWcgIT0gMCkKKwkJSUZERUJVRygxMCkgcHJpbnRrKCJhcmxhbjogQ0FSRCBJUyBDT05GSUdVUkVEXG4iKTsKKwllbHNlCisJCUlGREVCVUcoMTApIHByaW50aygiYXJsYW46IGNhcmQgaXMgTk9UIGNvbmZpZ3VyZWRcbiIpOworCisJaWYgKHRlc3RNZW1vcnkgfHwgKFJFQURTSE1CKGFybGFuLT5kaWFnbm9zdGljSW5mbykgIT0gMHhmZikpCisJCWlmIChhcmxhbl9od190ZXN0X21lbW9yeShkZXYpKQorCQkJcmV0dXJuIC0xOworCisJREVCVUdTSE0oNCwgImFybGFuIGNvbmZpZ3VyZWRTdGF0dXMgPSAlZCBcbiIsIGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZywgdV9jaGFyKTsKKwlERUJVR1NITSg0LCAiYXJsYW4gZHJpdmVyIGRpYWdub3N0aWM6IDB4JTJ4XG4iLCBhcmxhbi0+ZGlhZ25vc3RpY0luZm8sIHVfY2hhcik7CisKKwkvKiBpc3N1ZSBub3AgY29tbWFuZCAtIG5vIGludGVycnVwdCAqLworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX05PT1ApOworCWlmIChhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9XQUlUX05PVykgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJSUZERUJVRyg1MCkgcHJpbnRrKCIxc3QgTm9vcCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgISFcbiIpOworCisJLyogdHJ5IHRvIHR1cm4gb24gdGhlIGFybGFuIGludGVycnVwdHMgKi8KKwljbGVhckNsZWFySW50ZXJydXB0KGRldik7CisJc2V0Q2xlYXJJbnRlcnJ1cHQoZGV2KTsKKwlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKworCS8qIGlzc3VlIG5vcCBjb21tYW5kIC0gd2l0aCBpbnRlcnJ1cHQgKi8KKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX05PT1BJTlQpOworCWlmIChhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9XQUlUX05PVykgIT0gMCkKKwkJcmV0dXJuIC0xOworCisKKwlJRkRFQlVHKDUwKSBwcmludGsoIjJuZCBOb29wIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCAhIVxuIik7CisKKwlSRUFEU0hNKGlycUxldmVsLCBhcmxhbi0+aXJxTGV2ZWwsIHVfY2hhcikKKwkKKwlpZiAoaXJxTGV2ZWwgIT0gZGV2LT5pcnEpCisJeworCQlJRkRFQlVHKDEpIHByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuIGRpcCBzd2l0Y2hlcyBzZXQgaXJxIHRvICVkXG4iLCBpcnFMZXZlbCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRldmljZSBkcml2ZXIgaXJxIHNldCB0byAlZCAtIGRvZXMgbm90IG1hdGNoXG4iLCBkZXYtPmlycSk7CisJCWRldi0+aXJxID0gaXJxTGV2ZWw7CisJfQorCWVsc2UKKwkJSUZERUJVRygyKSBwcmludGsoImlycSBsZXZlbCBpcyBPS1xuIik7CisKKworCUlGREVCVUcoMykgYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvKGRldik7CisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DT05GKTsKKworCVJFQURTSE0oY29uZmlndXJlZFN0YXR1c0ZsYWcsIGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZywgdV9jaGFyKTsKKwlpZiAoY29uZmlndXJlZFN0YXR1c0ZsYWcgPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuIGNvbmZpZ3VyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cpOworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1JYKTsKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBhcmxhbiBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgYXJsYW5fdmVyc2lvbik7CisKKy8vCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3NldHVwX2NhcmQiKTsKKworCXJldHVybiAwOwkJLyogbm8gZXJyb3JzICovCit9CisjZW5kaWYKKworI2lmZGVmIEFSTEFOX1BST0NfSU5URVJGQUNFCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCitzdGF0aWMgY2hhciBhcmxhbl9kcml2ZV9pbmZvW0FSTEFOX1NUUl9TSVpFXSA9ICJBNjU1XG5cMCI7CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8oY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlwb3MgPSAwOworCWlmICh3cml0ZSkKKwl7CisJCXByaW50aygid3JpcnRlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJcHJpbnRrKCJhZGkgJXggXG4iLCBhcmxhbl9kcml2ZV9pbmZvW2ldKTsKKwl9CisJaWYgKGN0bC0+cHJvY25hbWUgPT0gTlVMTCB8fCBhcmxhbl9kcml2ZV9pbmZvID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgcHJvY25hbWUgaXMgTlVMTCBpbiBzeXNjdGxfdGFibGUgb3IgYXJsYW5fZHJpdmVfaW5mbyBpcyBOVUxMIFxuIGF0IGFybGFuIG1vZHVsZVxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGRldm51bSA8IDAgfHwgZGV2bnVtID4gTUFYX0FSTEFOUyAtIDEpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0b28gc3RyYW5nZSBkZXZudW0gaW4gcHJvY2ZzIHBhcnNlXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCWlmIChjdGwtPnByb2NuYW1lKQorCQkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIlx0JXNcblxuIiwgY3RsLT5wcm9jbmFtZSk7CisJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQlnb3RvIGZpbmFsOworCX0KKwllbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJZGV2ID0gYXJsYW5fZGV2aWNlW2Rldm51bV07CisKKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCisJcG9zID0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvLCAiQXJsYW4gIGluZm8gXG4iKTsKKwkvKiBIZWFkZXIgU2lnbmF0dXJlICovCisJU0FSTFNUUih0ZXh0UmVnaW9uLCA0OCk7CisJU0FSTFVDKHJlc2V0RmxhZyk7CisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgImRpYWdub3N0aWNJbmZvXHQ9XHQlcyBcbiIsIGFybGFuX2RpYWdub3N0aWNfaW5mb19zdHJpbmcoZGV2KSk7CisJU0FSTFVDKGRpYWdub3N0aWNJbmZvKTsKKwlTQVJMVVMoZGlhZ25vc3RpY09mZnNldCk7CisJU0FSTFVDTihfMSwgMTIpOworCVNBUkxVQ04obGFuQ2FyZE5vZGVJZCwgNik7CisJU0FSTFVDTihicm9hZGNhc3RBZGRyZXNzLCA2KTsKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiaGFyZHdhcmVUeXBlID1cdCAgJXMgXG4iLCBhcmxhbl9oYXJkd2FyZV90eXBlX3N0cmluZyhkZXYpKTsKKwlTQVJMVUMoaGFyZHdhcmVUeXBlKTsKKwlTQVJMVUMobWFqb3JIYXJkd2FyZVZlcnNpb24pOworCVNBUkxVQyhtaW5vckhhcmR3YXJlVmVyc2lvbik7CisJU0FSTFVDKHJhZGlvTW9kdWxlKTsKKwlTQVJMVUMoZGVmYXVsdENoYW5uZWxTZXQpOworCVNBUkxVQ04oXzIsIDQ3KTsKKworCS8qIENvbnRyb2wvU3RhdHVzIEJsb2NrIC0gMHgwMDgwICovCisJU0FSTFVDKGludGVycnVwdEluUHJvZ3Jlc3MpOworCVNBUkxVQyhjbnRybFJlZ0ltYWdlKTsKKworCVNBUkxVQ04oXzMsIDE0KTsKKwlTQVJMVUMoY29tbWFuZEJ5dGUpOworCVNBUkxVQ04oY29tbWFuZFBhcmFtZXRlciwgMTUpOworCisJLyogUmVjZWl2ZSBTdGF0dXMgLSAweDAwYTAgKi8KKwlTQVJMVUMocnhTdGF0dXMpOworCVNBUkxVQyhyeEZybVR5cGUpOworCVNBUkxVUyhyeE9mZnNldCk7CisJU0FSTFVTKHJ4TGVuZ3RoKTsKKwlTQVJMVUNOKHJ4U3JjLCA2KTsKKwlTQVJMVUMocnhCcm9hZGNhc3RGbGFnKTsKKwlTQVJMVUMocnhRdWFsaXR5KTsKKwlTQVJMVUMoc2NyYW1ibGVkKTsKKwlTQVJMVUNOKF80LCAxKTsKKworCS8qIFRyYW5zbWl0IFN0YXR1cyAtIDB4MDBiMCAqLworCVNBUkxVQyh0eFN0YXR1cyk7CisJU0FSTFVDKHR4QWNrUXVhbGl0eSk7CisJU0FSTFVDKG51bVJldHJpZXMpOworCVNBUkxVQ04oXzUsIDE0KTsKKwlTQVJMVUNOKHJlZ2lzdGVyZWRSb3V0ZXIsIDYpOworCVNBUkxVQ04oYmFja2JvbmVSb3V0ZXIsIDYpOworCVNBUkxVQyhyZWdpc3RyYXRpb25TdGF0dXMpOworCVNBUkxVQyhjb25maWd1cmVkU3RhdHVzRmxhZyk7CisJU0FSTFVDTihfNiwgMSk7CisJU0FSTFVDTih1bHRpbWF0ZURlc3RBZGRyZXNzLCA2KTsKKwlTQVJMVUNOKGltbWVkRGVzdEFkZHJlc3MsIDYpOworCVNBUkxVQ04oaW1tZWRTcmNBZGRyZXNzLCA2KTsKKwlTQVJMVVMocnhTZXF1ZW5jZU51bWJlcik7CisJU0FSTFVDKGFzc2lnbmVkTG9jYWx0YWxrQWRkcmVzcyk7CisJU0FSTFVDTihfNywgMjcpOworCisJLyogU3lzdGVtIFBhcmFtZXRlciBCbG9jayAqLworCisJLyogLSBEcml2ZXIgUGFyYW1ldGVycyAoTm92ZWxsIFNwZWNpZmljKSAqLworCisJU0FSTFVTKHR4VGltZW91dCk7CisJU0FSTFVTKHRyYW5zcG9ydFRpbWUpOworCVNBUkxVQ04oXzgsIDQpOworCisJLyogLSBDb25maWd1cmF0aW9uIFBhcmFtZXRlcnMgKi8KKwlTQVJMVUMoaXJxTGV2ZWwpOworCVNBUkxVQyhzcHJlYWRpbmdDb2RlKTsKKwlTQVJMVUMoY2hhbm5lbFNldCk7CisJU0FSTFVDKGNoYW5uZWxOdW1iZXIpOworCVNBUkxVUyhyYWRpb05vZGVJZCk7CisJU0FSTFVDTihfOSwgMik7CisJU0FSTFVDKHNjcmFtYmxpbmdEaXNhYmxlKTsKKwlTQVJMVUMocmFkaW9UeXBlKTsKKwlTQVJMVVMocm91dGVySWQpOworCVNBUkxVQ04oXzEwLCA5KTsKKwlTQVJMVUModHhBdHRlbnVhdGlvbik7CisJU0FSTFVJQShzeXN0ZW1JZCk7CisJU0FSTFVTKGdsb2JhbENoZWNrc3VtKTsKKwlTQVJMVUNOKF8xMSwgNCk7CisJU0FSTFVTKG1heERhdGFncmFtU2l6ZSk7CisJU0FSTFVTKG1heEZyYW1lU2l6ZSk7CisJU0FSTFVDKG1heFJldHJpZXMpOworCVNBUkxVQyhyZWNlaXZlTW9kZSk7CisJU0FSTFVDKHByaW9yaXR5KTsKKwlTQVJMVUMocm9vdE9yUmVwZWF0ZXIpOworCVNBUkxVQ04oc3BlY2lmaWVkUm91dGVyLCA2KTsKKwlTQVJMVVMoZmFzdFBvbGxQZXJpb2QpOworCVNBUkxVQyhwb2xsRGVjYXkpOworCVNBUkxVU0EoZmFzdFBvbGxEZWxheSk7CisJU0FSTFVDKGFybFRocmVzaG9sZCk7CisJU0FSTFVDKGFybERlY2F5KTsKKwlTQVJMVUNOKF8xMiwgMSk7CisJU0FSTFVTKHNwZWNSb3V0ZXJUaW1lb3V0KTsKKwlTQVJMVUNOKF8xMywgNSk7CisKKwkvKiBTY3JhbWJsZWQgQXJlYSAqLworCVNBUkxVSUEoU0lEKTsKKwlTQVJMVUNOKGVuY3J5cHRpb25LZXksIDEyKTsKKwlTQVJMVUlBKF8xNCk7CisJU0FSTFVTQSh3YWl0VGltZSk7CisJU0FSTFVTQShsUGFyYW1ldGVyKTsKKwlTQVJMVUNOKF8xNSwgMyk7CisJU0FSTFVTKGhlYWRlclNpemUpOworCVNBUkxVUyhzZWN0aW9uQ2hlY2tzdW0pOworCisJU0FSTFVDKHJlZ2lzdHJhdGlvbk1vZGUpOworCVNBUkxVQyhyZWdpc3RyYXRpb25GaWxsKTsKKwlTQVJMVVMocG9sbFBlcmlvZCk7CisJU0FSTFVTKHJlZnJlc2hQZXJpb2QpOworCVNBUkxTVFIobmFtZSwgMTYpOworCVNBUkxVQ04oTklELCA2KTsKKwlTQVJMVUMobG9jYWxUYWxrQWRkcmVzcyk7CisJU0FSTFVDKGNvZGVGb3JtYXQpOworCVNBUkxVQyhudW1DaGFubmVscyk7CisJU0FSTFVDKGNoYW5uZWwxKTsKKwlTQVJMVUMoY2hhbm5lbDIpOworCVNBUkxVQyhjaGFubmVsMyk7CisJU0FSTFVDKGNoYW5uZWw0KTsKKwlTQVJMVUNOKFNTQ29kZSwgNTkpOworCisvKiAgICAgIFNBUkxVQ04oIF8xNiwgMHgxNDApOworICovCisJLyogU3RhdGlzdGljcyBCbG9jayAtIDB4MDMwMCAqLworCVNBUkxVQyhob3N0Y3B1TG9jayk7CisJU0FSTFVDKGxhbmNwdUxvY2spOworCVNBUkxVQ04ocmVzZXRUaW1lLCAxOCk7CisJU0FSTFVJQShudW1EYXRhZ3JhbXNUcmFuc21pdHRlZCk7CisJU0FSTFVJQShudW1SZVRyYW5zbWlzc2lvbnMpOworCVNBUkxVSUEobnVtRnJhbWVzRGlzY2FyZGVkKTsKKwlTQVJMVUlBKG51bURhdGFncmFtc1JlY2VpdmVkKTsKKwlTQVJMVUlBKG51bUR1cGxpY2F0ZVJlY2VpdmVkRnJhbWVzKTsKKwlTQVJMVUlBKG51bURhdGFncmFtc0Rpc2NhcmRlZCk7CisJU0FSTFVTKG1heE51bVJlVHJhbnNtaXREYXRhZ3JhbSk7CisJU0FSTFVTKG1heE51bVJlVHJhbnNtaXRGcmFtZXMpOworCVNBUkxVUyhtYXhOdW1Db25zZWN1dGl2ZUR1cGxpY2F0ZUZyYW1lcyk7CisJLyogbWlzYWxpZ25lZCBoZXJlIHNvIHdlIGhhdmUgdG8gZ28gdG8gY2hhcmFjdGVycyAqLworCVNBUkxVSUEobnVtQnl0ZXNUcmFuc21pdHRlZCk7CisJU0FSTFVJQShudW1CeXRlc1JlY2VpdmVkKTsKKwlTQVJMVUlBKG51bUNSQ0Vycm9ycyk7CisJU0FSTFVJQShudW1MZW5ndGhFcnJvcnMpOworCVNBUkxVSUEobnVtQWJvcnRFcnJvcnMpOworCVNBUkxVSUEobnVtVFhVbmRlcnJ1bnMpOworCVNBUkxVSUEobnVtUlhPdmVycnVucyk7CisJU0FSTFVJQShudW1Ib2xkT2Zmcyk7CisJU0FSTFVJQShudW1GcmFtZXNUcmFuc21pdHRlZCk7CisJU0FSTFVJQShudW1GcmFtZXNSZWNlaXZlZCk7CisJU0FSTFVJQShudW1SZWNlaXZlRnJhbWVzTG9zdCk7CisJU0FSTFVJQShudW1SWEJ1ZmZlck92ZXJmbG93cyk7CisJU0FSTFVJQShudW1GcmFtZXNEaXNjYXJkZWRBZGRyTWlzbWF0Y2gpOworCVNBUkxVSUEobnVtRnJhbWVzRGlzY2FyZGVkU0lETWlzbWF0Y2gpOworCVNBUkxVSUEobnVtUG9sbHNUcmFuc21pc3R0ZWQpOworCVNBUkxVSUEobnVtUG9sbEFja25vd2xlZGdlcyk7CisJU0FSTFVJQShudW1TdGF0dXNUaW1lb3V0cyk7CisJU0FSTFVJQShudW1OQUNLUmVjZWl2ZWQpOworCVNBUkxVUyhhdXhDbWQpOworCVNBUkxVQ04oZHVtcFB0ciwgNCk7CisJU0FSTFVDKGR1bXBWYWwpOworCVNBUkxVQyh3aXJlVGVzdCk7CisJCisJLyogbmV4dCA0IHNlZW1zIHRvbyBsb25nIGZvciBwcm9jZnMsIG92ZXIgc2luZ2xlIHBhZ2UgPworCVNBUkxVQ04oIF8xNywgMHg4Nik7CisJU0FSTFVDTiggdHhCdWZmZXIsIDB4ODAwKTsKKwlTQVJMVUNOKCByeEJ1ZmZlciwgIDB4ODAwKTsgCisJU0FSTFVDTiggXzE4LCAweDBiZmYpOworCSAqLworCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgInJ4UmluZ1x0PVx0MHgiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHg1MDsgaSsrKQorCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiJTAyeCIsICgoY2hhciAqKSBwcml2YS0+Y29uZilbcHJpdmEtPmNvbmYtPnJ4T2Zmc2V0ICsgaV0pOworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJcbiIpOworCisJU0FSTFVDKGNvbmZpZ1N0YXR1cyk7CisJU0FSTFVDKF8yMik7CisJU0FSTFVDKHByb2dJT0N0cmwpOworCVNBUkxVQyhzaGFyZU1CYXNlKTsKKwlTQVJMVUMoY29udHJvbFJlZ2lzdGVyKTsKKworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICIgdG90YWwgJWQgY2hhcnNcbiIsIHBvcyk7CisJaWYgKGN0bCkKKwkJaWYgKGN0bC0+cHJvY25hbWUpCisJCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiIGRyaXZlciBuYW1lIDogJXNcbiIsIGN0bC0+cHJvY25hbWUpOworZmluYWw6CisJKmxlbnAgPSBwb3M7CisKKwlpZiAoIXdyaXRlKQorCQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWVsc2UKKwl7CisJCSpsZW5wID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcmV0djsKK30KKworCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvMTYxNzE5KGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxVQ04oXzE2LCAweEMwKTsKKwlTQVJMVUNOKF8xNywgMHg2QSk7CisJU0FSTFVDTihfMTgsIDE0KTsKKwlTQVJMVUNOKF8xOSwgMHg4Nik7CisJU0FSTFVDTihfMjEsIDB4M2ZkKTsKKworZmluYWw6CisJKmxlbnAgPSBwb3M7CisJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcmV0djsKK30KKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mb3R4UmluZyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCisJcG9zID0gMDsKKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJICBwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJICBnb3RvIGZpbmFsOworCX0KKwllbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJU0FSTEJOcGxuKHVfY2hhciwgdHhCdWZmZXIsIDB4ODAwKTsKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKworCXBvcyA9IDA7CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCSAgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCSAgZ290byBmaW5hbDsKKwl9IGVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlTQVJMQk5wbG4odV9jaGFyLCByeEJ1ZmZlciwgMHg4MDApOworZmluYWw6CisJKmxlbnAgPSBwb3M7CisJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcmV0djsKK30KKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbzE4KGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKworCXBvcyA9IDA7CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQlnb3RvIGZpbmFsOworCX0KKwllbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJU0FSTEJOcGxuKHVfY2hhciwgXzE4LCAweDgwMCk7CisKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKKworI2VuZGlmCQkJCS8qICNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QICovCisKKworc3RhdGljIGNoYXIgY29uZl9yZXNldF9yZXN1bHRbMjAwXTsKKworc3RhdGljIGludCBhcmxhbl9jb25maWd1cmUoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBwb3MgPSAwOworCWludCBkZXZudW0gPSBjdGwtPnByb2NuYW1lWzZdIC0gJzAnOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2OworCisJaWYgKGRldm51bSA8IDAgfHwgZGV2bnVtID4gTUFYX0FSTEFOUyAtIDEpCisJeworCQkgIHByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBzdHJhbmdlIGRldm51bSBpbiBwcm9jZnMgcGFyc2VcbiAiKTsKKwkJICByZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGFybGFuX2RldmljZVtkZXZudW1dICE9IE5VTEwpCisJeworCQkgIHByaXYgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKworCQkgIGFybGFuX2NvbW1hbmQoYXJsYW5fZGV2aWNlW2Rldm51bV0sIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYpOworCX0KKwllbHNlCisJCXJldHVybiAtMTsKKworCSpsZW5wID0gcG9zOworCXJldHVybiBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX3Jlc2V0KGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdjsKKworCWlmIChkZXZudW0gPCAwIHx8IGRldm51bSA+IE1BWF9BUkxBTlMgLSAxKQorCXsKKwkJICBwcmludGsoS0VSTl9XQVJOSU5HICJ0b28gc3RyYW5nZSBkZXZudW0gaW4gcHJvY2ZzIHBhcnNlXG4gIik7CisJCSAgcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSAhPSBOVUxMKQorCXsKKwkJcHJpdiA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCQlhcmxhbl9jb21tYW5kKGFybGFuX2RldmljZVtkZXZudW1dLCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworCSpsZW5wID0gcG9zICsgMzsKKwlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworfQorCisKKy8qIFBsYWNlIGZpbGVzIGluIC9wcm9jL3N5cy9kZXYvYXJsYW4gKi8KKyNkZWZpbmUgQ1RCTE4obnVtLGNhcmQsbmFtKSBcCisgICAgICAgIHsgLmN0bF9uYW1lID0gbnVtLFwKKyAgICAgICAgICAucHJvY25hbWUgPSAjbmFtLFwKKyAgICAgICAgICAuZGF0YSA9ICYoYXJsYW5fY29uZltjYXJkXS5uYW0pLFwKKyAgICAgICAgICAubWF4bGVuID0gc2l6ZW9mKGludCksIC5tb2RlID0gMDYwMCwgLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjfQorI2lmZGVmIEFSTEFOX0RFQlVHR0lORworCisjZGVmaW5lIEFSTEFOX1BST0NfREVCVUdfRU5UUklFUyBcCisgICAgICAgIHsgLmN0bF9uYW1lID0gNDgsIC5wcm9jbmFtZSA9ICJlbnRyeV9leGl0X2RlYnVnIixcCisgICAgICAgICAgLmRhdGEgPSAmYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsXAorICAgICAgICAgIC5tYXhsZW4gPSBzaXplb2YoaW50KSwgLm1vZGUgPSAwNjAwLCAucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWN9LFwKKwl7IC5jdGxfbmFtZSA9IDQ5LCAucHJvY25hbWUgPSAiZGVidWciLCAuZGF0YSA9ICZhcmxhbl9kZWJ1ZyxcCisgICAgICAgICAgLm1heGxlbiA9IHNpemVvZihpbnQpLCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY30sCisjZWxzZSAKKyNkZWZpbmUgQVJMQU5fUFJPQ19ERUJVR19FTlRSSUVTCisjZW5kaWYKKworI2RlZmluZSBBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoY2FyZE5vKVwKKwlDVEJMTigxLGNhcmRObyxzcHJlYWRpbmdDb2RlKSxcCisJQ1RCTE4oMixjYXJkTm8sIGNoYW5uZWxOdW1iZXIpLFwKKwlDVEJMTigzLGNhcmRObywgc2NyYW1ibGluZ0Rpc2FibGUpLFwKKwlDVEJMTig0LGNhcmRObywgdHhBdHRlbnVhdGlvbiksXAorCUNUQkxOKDUsY2FyZE5vLCBzeXN0ZW1JZCksIFwKKwlDVEJMTig2LGNhcmRObywgbWF4RGF0YWdyYW1TaXplKSxcCisJQ1RCTE4oNyxjYXJkTm8sIG1heEZyYW1lU2l6ZSksXAorCUNUQkxOKDgsY2FyZE5vLCBtYXhSZXRyaWVzKSxcCisJQ1RCTE4oOSxjYXJkTm8sIHJlY2VpdmVNb2RlKSxcCisJQ1RCTE4oMTAsY2FyZE5vLCBwcmlvcml0eSksXAorCUNUQkxOKDExLGNhcmRObywgcm9vdE9yUmVwZWF0ZXIpLFwKKwlDVEJMTigxMixjYXJkTm8sIFNJRCksXAorCUNUQkxOKDEzLGNhcmRObywgcmVnaXN0cmF0aW9uTW9kZSksXAorCUNUQkxOKDE0LGNhcmRObywgcmVnaXN0cmF0aW9uRmlsbCksXAorCUNUQkxOKDE1LGNhcmRObywgbG9jYWxUYWxrQWRkcmVzcyksXAorCUNUQkxOKDE2LGNhcmRObywgY29kZUZvcm1hdCksXAorCUNUQkxOKDE3LGNhcmRObywgbnVtQ2hhbm5lbHMpLFwKKwlDVEJMTigxOCxjYXJkTm8sIGNoYW5uZWwxKSxcCisJQ1RCTE4oMTksY2FyZE5vLCBjaGFubmVsMiksXAorCUNUQkxOKDIwLGNhcmRObywgY2hhbm5lbDMpLFwKKwlDVEJMTigyMSxjYXJkTm8sIGNoYW5uZWw0KSxcCisJQ1RCTE4oMjIsY2FyZE5vLCB0eENsZWFyKSxcCisJQ1RCTE4oMjMsY2FyZE5vLCB0eFJldHJpZXMpLFwKKwlDVEJMTigyNCxjYXJkTm8sIHR4Um91dGluZyksXAorCUNUQkxOKDI1LGNhcmRObywgdHhTY3JhbWJsZWQpLFwKKwlDVEJMTigyNixjYXJkTm8sIHJ4UGFyYW1ldGVyKSxcCisJQ1RCTE4oMjcsY2FyZE5vLCB0eFRpbWVvdXRNcyksXAorCUNUQkxOKDI4LGNhcmRObywgd2FpdENhcmRUaW1lb3V0KSxcCisJQ1RCTE4oMjksY2FyZE5vLCBjaGFubmVsU2V0KSwgXAorCXsuY3RsX25hbWUgPSAzMCwgLnByb2NuYW1lID0gIm5hbWUiLFwKKwkgLmRhdGEgPSBhcmxhbl9jb25mW2NhcmROb10uc2l0ZU5hbWUsXAorCSAubWF4bGVuID0gMTYsIC5tb2RlID0gMDYwMCwgLnByb2NfaGFuZGxlciA9ICZwcm9jX2Rvc3RyaW5nfSxcCisJQ1RCTE4oMzEsY2FyZE5vLHdhaXRUaW1lKSxcCisJQ1RCTE4oMzIsY2FyZE5vLGxQYXJhbWV0ZXIpLFwKKwlDVEJMTigzMyxjYXJkTm8sXzE1KSxcCisJQ1RCTE4oMzQsY2FyZE5vLGhlYWRlclNpemUpLFwKKwlDVEJMTigzNixjYXJkTm8sdHhfZGVsYXlfbXMpLFwKKwlDVEJMTigzNyxjYXJkTm8scmV0cmllcyksXAorCUNUQkxOKDM4LGNhcmRObyxSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSksXAorCUNUQkxOKDM5LGNhcmRObyx3YWl0UmVUcmFuc21pdFBhY2tldE1heFNpemUpLFwKKwlDVEJMTig0MCxjYXJkTm8sZmFzdFJlVHJhbnNDb3VudCksXAorCUNUQkxOKDQxLGNhcmRObyxkcml2ZXJSZXRyYW5zbWlzc2lvbnMpLFwKKwlDVEJMTig0MixjYXJkTm8sdHhBY2tUaW1lb3V0TXMpLFwKKwlDVEJMTig0MyxjYXJkTm8scmVnaXN0cmF0aW9uSW50ZXJydXB0cyksXAorCUNUQkxOKDQ0LGNhcmRObyxoYXJkd2FyZVR5cGUpLFwKKwlDVEJMTig0NSxjYXJkTm8scmFkaW9UeXBlKSxcCisJQ1RCTE4oNDYsY2FyZE5vLHdyaXRlRUVQUk9NKSxcCisJQ1RCTE4oNDcsY2FyZE5vLHdyaXRlUmFkaW9UeXBlKSxcCisJQVJMQU5fUFJPQ19ERUJVR19FTlRSSUVTXAorCUNUQkxOKDUwLGNhcmRObyxpbl9zcGVlZCksXAorCUNUQkxOKDUxLGNhcmRObyxvdXRfc3BlZWQpLFwKKwlDVEJMTig1MixjYXJkTm8saW5fc3BlZWQxMCksXAorCUNUQkxOKDUzLGNhcmRObyxvdXRfc3BlZWQxMCksXAorCUNUQkxOKDU0LGNhcmRObyxpbl9zcGVlZF9tYXgpLFwKKwlDVEJMTig1NSxjYXJkTm8sb3V0X3NwZWVkX21heCksXAorCUNUQkxOKDU2LGNhcmRObyxtZWFzdXJlX3JhdGUpLFwKKwlDVEJMTig1NyxjYXJkTm8scHJlX0NvbW1hbmRfV2FpdCksXAorCUNUQkxOKDU4LGNhcmRObyxyeF90d2VhazEpLFwKKwlDVEJMTig1OSxjYXJkTm8scnhfdHdlYWsyKSxcCisJQ1RCTE4oNjAsY2FyZE5vLHR4X3F1ZXVlX2xlbiksXAorCisKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9jb25mX3RhYmxlMFtdID0KK3sKKwlBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoMCkKKworI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKwl7CisJCS5jdGxfbmFtZQk9IDE1MCwKKwkJLnByb2NuYW1lCT0gImFybGFuMC10eFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3R4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUxLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXJ4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvcnhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTIsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtMTgiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTMsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtcmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTYxNzE5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtc2htLWNweSIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvLAorCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IDE1NSwKKwkJLnByb2NuYW1lCT0gImNvbmZpZzAiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX2NvbmZpZ3VyZQorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTYsCisJCS5wcm9jbmFtZQk9ICJyZXNldDAiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9yZXNldCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX2NvbmZfdGFibGUxW10gPQoreworCisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDEpCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMS1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4xLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4xLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4xLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWcxIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NiwKKwkJLnByb2NuYW1lCT0gInJlc2V0MSIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX3Jlc2V0LAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTJbXSA9Cit7CisKKwlBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoMikKKworI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKwl7CisJCS5jdGxfbmFtZQk9IDE1MCwKKwkJLnByb2NuYW1lCT0gImFybGFuMi10eFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3R4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUxLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXJ4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvcnhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTIsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItMTgiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTMsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItcmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTYxNzE5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItc2htLWNweSIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvLAorCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IDE1NSwKKwkJLnByb2NuYW1lCT0gImNvbmZpZzIiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX2NvbmZpZ3VyZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQyIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9jb25mX3RhYmxlM1tdID0KK3sKKworCUFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTCgzKQorCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCXsKKwkJLmN0bF9uYW1lCT0gMTUwLAorCQkucHJvY25hbWUJPSAiYXJsYW4zLXR4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvdHhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTEsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtcnhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MiwKKwkJLnByb2NuYW1lCT0gImFybGFuMy0xOCIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MywKKwkJLnByb2NuYW1lCT0gImFybGFuMy1yaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xNjE3MTksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuMy1zaG0tY3B5IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8sCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gMTU1LAorCQkucHJvY25hbWUJPSAiY29uZmlnMyIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fY29uZmlndXJlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTYsCisJCS5wcm9jbmFtZQk9ICJyZXNldDMiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9yZXNldCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl90YWJsZVtdID0KK3sKKwl7CisJCS5jdGxfbmFtZQk9IDAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA2MDAsCisJCS5jaGlsZAkJPSBhcmxhbl9jb25mX3RhYmxlMCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMCwKKwkJLnByb2NuYW1lCT0gImFybGFuMSIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDYwMCwKKwkJLmNoaWxkCQk9IGFybGFuX2NvbmZfdGFibGUxLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4yIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTIsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA2MDAsCisJCS5jaGlsZAkJPSBhcmxhbl9jb25mX3RhYmxlMywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisjZWxzZQorCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3RhYmxlW01BWF9BUkxBTlMgKyAxXSA9Cit7CisJeyAuY3RsX25hbWUgPSAwIH0KK307CisjZW5kaWYKKyNlbHNlCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fdGFibGVbTUFYX0FSTEFOUyArIDFdID0KK3sKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZgorCisKKy8vIHN0YXRpYyBpbnQgbW10dSA9IDEyMzQ7CisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fcm9vdF90YWJsZVtdID0KK3sKKwl7CisJCS5jdGxfbmFtZQk9IDI1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gYXJsYW5fdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworLyogTWFrZSBzdXJlIHRoYXQgL3Byb2Mvc3lzL2RldiBpcyB0aGVyZSAqLworLy9zdGF0aWMgY3RsX3RhYmxlIGFybGFuX2RldmljZV9yb290X3RhYmxlW10gPQorLy97CisvLwl7Q1RMX0RFViwgImRldiIsIE5VTEwsIDAsIDA1NTUsIGFybGFuX3Jvb3RfdGFibGV9LAorLy8JezB9CisvL307CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyOworCitpbnQgX19pbml0IGluaXRfYXJsYW5fcHJvYyh2b2lkKQoreworCisJaW50IGkgPSAwOworCWlmIChhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlcikKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9BUkxBTlMgJiYgYXJsYW5fZGV2aWNlW2ldOyBpKyspCisJCWFybGFuX3RhYmxlW2ldLmN0bF9uYW1lID0gaSArIDE7CisJYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoYXJsYW5fcm9vdF90YWJsZSwgMCk7CisJaWYgKCFhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlcikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7CisKK30KKwordm9pZCBfX2V4aXQgY2xlYW51cF9hcmxhbl9wcm9jKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIpOworCWFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyID0gTlVMTDsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE2ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4uaApAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgQ3VsbGVuIEplbm5pbmdzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IEVsbWVyLkpvYW5kaUB1dC5lZSwgKzM3LTI1NS0xMzUwMAkKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4JLyogRm9yIHRoZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4gKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogRm9yIEFSUEhSRF9FVEhFUiAqLworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisKKy8vI2RlZmluZSBBUkxBTl9ERUJVR0dJTkcgMQorCisjZGVmaW5lIEFSTEFOX1BST0NfSU5URVJGQUNFCisjZGVmaW5lIE1BWF9BUkxBTlMgNCAvKiBub3QgbW9yZSB0aGFuIDQgISAqLworI2RlZmluZSBBUkxBTl9QUk9DX1NITV9EVU1QIC8qIHNob3dzIGFsbCBjYXJkIHJlZ2lzdGVycywgbWFrZXMgZHJpdmVyIHdheSBsYXJnZXIgKi8KKworI2RlZmluZSBBUkxBTl9NQVhfTVVMVElDQVNUX0FERFJTIDE2CisjZGVmaW5lIEFSTEFOX1JDVl9DTEVBTiAJMAorI2RlZmluZSBBUkxBTl9SQ1ZfUFJPTUlTQyAxCisjZGVmaW5lIEFSTEFOX1JDVl9DT05UUk9MIDIKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitleHRlcm4gaW50IGluaXRfYXJsYW5fcHJvYyh2b2lkKTsKK2V4dGVybiB2b2lkIGNsZWFudXBfYXJsYW5fcHJvYyh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGluaXRfYXJsYW5fcHJvYygpCSh7IDA7IH0pCisjZGVmaW5lIGNsZWFudXBfYXJsYW5fcHJvYygpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFybGFuX2RldmljZVtNQVhfQVJMQU5TXTsKK2V4dGVybiBpbnQJYXJsYW5fZGVidWc7CitleHRlcm4gaW50CWFybGFuX2VudHJ5X2RlYnVnOworZXh0ZXJuIGludAlhcmxhbl9leGl0X2RlYnVnOworZXh0ZXJuIGludAl0ZXN0TWVtb3J5OworZXh0ZXJuIGludCAgICAgYXJsYW5fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IGNvbW1hbmQpOworIAorI2RlZmluZSBTSURVTktOT1dOIC0xCisjZGVmaW5lIHJhZGlvTm9kZUlkVU5LTk9XTiAtMQorI2RlZmluZSBpcnFVTktOT1dOIDAKKyNkZWZpbmUgZGVidWdVTktOT1dOIDAKKyNkZWZpbmUgdGVzdE1lbW9yeVVOS05PV04gMQorI2RlZmluZSBzcHJlYWRpbmdDb2RlVU5LTk9XTiAwCisjZGVmaW5lIGNoYW5uZWxOdW1iZXJVTktOT1dOIDAKKyNkZWZpbmUgY2hhbm5lbFNldFVOS05PV04gMAorI2RlZmluZSBzeXN0ZW1JZFVOS05PV04gLTEKKyNkZWZpbmUgcmVnaXN0cmF0aW9uTW9kZVVOS05PV04gLTEKKworCisjZGVmaW5lIElGREVCVUcoIEwgKSBpZiAoIChMKSAmIGFybGFuX2RlYnVnICkgCisjZGVmaW5lIEFSTEFOX0ZBS0VfSERSX0xFTiAxMiAKKworI2lmZGVmIEFSTEFOX0RFQlVHR0lORworCSNkZWZpbmUgREVCVUcgMQorCSNkZWZpbmUgQVJMQU5fRU5UUllfRVhJVF9ERUJVR0dJTkcgMQorCSNkZWZpbmUgQVJMQU5fREVCVUcoYSxiKSBwcmludGsoS0VSTl9ERUJVRyBhLCBiKQorI2Vsc2UKKwkjZGVmaW5lIEFSTEFOX0RFQlVHKGEsYikgCisjZW5kaWYKKworI2RlZmluZSBBUkxBTl9TSE1FTV9TSVpFCTB4MjAwMAorCitzdHJ1Y3QgYXJsYW5fc2htZW0KK3sKKyAgICAgIC8qIEhlYWRlciBTaWduYXR1cmUgKi8gCisgICAgICB2b2xhdGlsZQljaGFyIHRleHRSZWdpb25bNDhdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlc2V0RmxhZzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciAgZGlhZ25vc3RpY0luZm87CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGRpYWdub3N0aWNPZmZzZXQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzFbMTJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxhbkNhcmROb2RlSWRbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgYnJvYWRjYXN0QWRkcmVzc1s2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBoYXJkd2FyZVR5cGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbWFqb3JIYXJkd2FyZVZlcnNpb247CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbWlub3JIYXJkd2FyZVZlcnNpb247CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmFkaW9Nb2R1bGU7Ly8gc2hvd3MgRUVQUk9NLCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCAweDExMQorICAgICAgdm9sYXRpbGUJdV9jaGFyIGRlZmF1bHRDaGFubmVsU2V0OyAvLyBzaG93cyBFRVByb20sIGNhbiBiZSBvdmVycmlpZGVuIGF0IDB4MTBBCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzJbNDddOworICAgICAgCisgICAgICAvKiBDb250cm9sL1N0YXR1cyBCbG9jayAtIDB4MDA4MCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGludGVycnVwdEluUHJvZ3Jlc3M7IC8qIG5vdCB1c2VkIGJ5IGxhbmNwdSAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNudHJsUmVnSW1hZ2U7IC8qIG5vdCB1c2VkIGJ5IGxhbmNwdSAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8zWzEzXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBkdW1wQnl0ZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb21tYW5kQnl0ZTsgLyogbm9uLXplcm8gPSBhY3RpdmUgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb21tYW5kUGFyYW1ldGVyWzE1XTsKKworICAgICAgLyogUmVjZWl2ZSBTdGF0dXMgLSAweDAwYTAgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeFN0YXR1czsgLyogMS0gZGF0YSwgMi1jb250cm9sLCAweGZmIC0gcmVnaXN0ciBjaGFuZ2UgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeEZybVR5cGU7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJ4T2Zmc2V0OworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByeExlbmd0aDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeFNyY1s2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeEJyb2FkY2FzdEZsYWc7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhRdWFsaXR5OworICAgICAgdm9sYXRpbGUJdV9jaGFyIHNjcmFtYmxlZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfNFsxXTsKKyAgICAgIAorICAgICAgLyogVHJhbnNtaXQgU3RhdHVzIC0gMHgwMGIwICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhTdGF0dXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhBY2tRdWFsaXR5OworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJldHJpZXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzVbMTRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdGVyZWRSb3V0ZXJbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgYmFja2JvbmVSb3V0ZXJbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVnaXN0cmF0aW9uU3RhdHVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvbmZpZ3VyZWRTdGF0dXNGbGFnOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF82WzFdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHVsdGltYXRlRGVzdEFkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgaW1tZWREZXN0QWRkcmVzc1s2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpbW1lZFNyY0FkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJ4U2VxdWVuY2VOdW1iZXI7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgYXNzaWduZWRMb2NhbHRhbGtBZGRyZXNzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF83WzI3XTsKKworICAgICAgLyogU3lzdGVtIFBhcmFtZXRlciBCbG9jayAqLworCisgICAgICAvKiAtIERyaXZlciBQYXJhbWV0ZXJzIChOb3ZlbGwgU3BlY2lmaWMpICovCisKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgdHhUaW1lb3V0OworICAgICAgdm9sYXRpbGUJdV9zaG9ydCB0cmFuc3BvcnRUaW1lOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF84WzRdOworCisgICAgICAvKiAtIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVycyAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGlycUxldmVsOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHNwcmVhZGluZ0NvZGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbFNldDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsTnVtYmVyOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByYWRpb05vZGVJZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfOVsyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzY3JhbWJsaW5nRGlzYWJsZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByYWRpb1R5cGU7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJvdXRlcklkOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xMFs5XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB0eEF0dGVudWF0aW9uOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHN5c3RlbUlkWzRdOyAKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgZ2xvYmFsQ2hlY2tzdW07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzExWzRdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhEYXRhZ3JhbVNpemU7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heEZyYW1lU2l6ZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBtYXhSZXRyaWVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlY2VpdmVNb2RlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHByaW9yaXR5OworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJvb3RPclJlcGVhdGVyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHNwZWNpZmllZFJvdXRlcls2XTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgZmFzdFBvbGxQZXJpb2Q7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcG9sbERlY2F5OworICAgICAgdm9sYXRpbGUJdV9jaGFyIGZhc3RQb2xsRGVsYXlbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgYXJsVGhyZXNob2xkOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGFybERlY2F5OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xMlsxXTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgc3BlY1JvdXRlclRpbWVvdXQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzEzWzVdOworCisgICAgICAvKiBTY3JhbWJsZWQgQXJlYSAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIFNJRFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBlbmNyeXB0aW9uS2V5WzEyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTRbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgd2FpdFRpbWVbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbFBhcmFtZXRlclsyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTVbM107CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGhlYWRlclNpemU7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHNlY3Rpb25DaGVja3N1bTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdHJhdGlvbk1vZGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVnaXN0cmF0aW9uRmlsbDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcG9sbFBlcmlvZDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcmVmcmVzaFBlcmlvZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBuYW1lWzE2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBOSURbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbG9jYWxUYWxrQWRkcmVzczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb2RlRm9ybWF0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUNoYW5uZWxzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWwxOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWwyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWwzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWw0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIFNTQ29kZVs1OV07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTZbMHhDMF07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGF1eENtZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciAgZHVtcFB0cls0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBkdW1wVmFsOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xN1sweDZBXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB3aXJlVGVzdDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMThbMTRdOworCisgICAgICAvKiBTdGF0aXN0aWNzIEJsb2NrIC0gMHgwMzAwICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgaG9zdGNwdUxvY2s7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbGFuY3B1TG9jazsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZXNldFRpbWVbMThdOworICAgICAgCisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRGF0YWdyYW1zVHJhbnNtaXR0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUmVUcmFuc21pc3Npb25zWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc0Rpc2NhcmRlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1EYXRhZ3JhbXNSZWNlaXZlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1EdXBsaWNhdGVSZWNlaXZlZEZyYW1lc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1EYXRhZ3JhbXNEaXNjYXJkZWRbNF07CisgICAgICAKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4TnVtUmVUcmFuc21pdERhdGFncmFtOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhOdW1SZVRyYW5zbWl0RnJhbWVzOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhOdW1Db25zZWN1dGl2ZUR1cGxpY2F0ZUZyYW1lczsKKyAgICAgIC8qIG1pc2FsaWduZWQgaGVyZSBzbyB3ZSBoYXZlIHRvIGdvIHRvIGNoYXJhY3RlcnMgKi8KKyAgICAgCisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQnl0ZXNUcmFuc21pdHRlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1CeXRlc1JlY2VpdmVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUNSQ0Vycm9yc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1MZW5ndGhFcnJvcnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQWJvcnRFcnJvcnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtVFhVbmRlcnJ1bnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUlhPdmVycnVuc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1Ib2xkT2Zmc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNUcmFuc21pdHRlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNSZWNlaXZlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SZWNlaXZlRnJhbWVzTG9zdFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SWEJ1ZmZlck92ZXJmbG93c1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNEaXNjYXJkZWRBZGRyTWlzbWF0Y2hbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzRGlzY2FyZGVkU0lETWlzbWF0Y2hbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUG9sbHNUcmFuc21pc3R0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUG9sbEFja25vd2xlZGdlc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1TdGF0dXNUaW1lb3V0c1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1OQUNLUmVjZWl2ZWRbNF07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTlbMHg4Nl07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB0eEJ1ZmZlclsweDgwMF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhCdWZmZXJbMHg4MDBdOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzIwWzB4ODAwXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMjFbMHgzZmJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvbmZpZ1N0YXR1czsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMjI7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcHJvZ0lPQ3RybDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzaGFyZU1CYXNlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvbnRyb2xSZWdpc3RlcjsKK307CisKK3N0cnVjdCBhcmxhbl9jb25mX3N0cnUgeworICAgICAgaW50IHNwcmVhZGluZ0NvZGU7CisgICAgICBpbnQgY2hhbm5lbFNldDsKKyAgICAgIGludCBjaGFubmVsTnVtYmVyOworICAgICAgaW50IHNjcmFtYmxpbmdEaXNhYmxlOworICAgICAgaW50IHR4QXR0ZW51YXRpb247CisgICAgICBpbnQgc3lzdGVtSWQ7IAorICAgICAgaW50IG1heERhdGFncmFtU2l6ZTsKKyAgICAgIGludCBtYXhGcmFtZVNpemU7CisgICAgICBpbnQgbWF4UmV0cmllczsKKyAgICAgIGludCByZWNlaXZlTW9kZTsKKyAgICAgIGludCBwcmlvcml0eTsKKyAgICAgIGludCByb290T3JSZXBlYXRlcjsKKyAgICAgIGludCBTSUQ7CisgICAgICBpbnQgcmFkaW9Ob2RlSWQ7CisgICAgICBpbnQgcmVnaXN0cmF0aW9uTW9kZTsKKyAgICAgIGludCByZWdpc3RyYXRpb25GaWxsOworICAgICAgaW50IGxvY2FsVGFsa0FkZHJlc3M7CisgICAgICBpbnQgY29kZUZvcm1hdDsKKyAgICAgIGludCBudW1DaGFubmVsczsKKyAgICAgIGludCBjaGFubmVsMTsKKyAgICAgIGludCBjaGFubmVsMjsKKyAgICAgIGludCBjaGFubmVsMzsKKyAgICAgIGludCBjaGFubmVsNDsKKyAgICAgIGludCB0eENsZWFyOworICAgICAgaW50IHR4UmV0cmllczsKKyAgICAgIGludCB0eFJvdXRpbmc7CisgICAgICBpbnQgdHhTY3JhbWJsZWQ7CisgICAgICBpbnQgcnhQYXJhbWV0ZXI7CisgICAgICBpbnQgdHhUaW1lb3V0TXM7CisgICAgICBpbnQgdHhBY2tUaW1lb3V0TXM7CisgICAgICBpbnQgd2FpdENhcmRUaW1lb3V0OworICAgICAgaW50CXdhaXRUaW1lOworICAgICAgaW50CWxQYXJhbWV0ZXI7CisgICAgICBpbnQJXzE1OworICAgICAgaW50CWhlYWRlclNpemU7CisgICAgICBpbnQgcmV0cmllczsKKyAgICAgIGludCB0eF9kZWxheV9tczsKKyAgICAgIGludCB3YWl0UmVUcmFuc21pdFBhY2tldE1heFNpemU7CisgICAgICBpbnQgUmVUcmFuc21pdFBhY2tldE1heFNpemU7CisgICAgICBpbnQgZmFzdFJlVHJhbnNDb3VudDsKKyAgICAgIGludCBkcml2ZXJSZXRyYW5zbWlzc2lvbnM7CisgICAgICBpbnQgcmVnaXN0cmF0aW9uSW50ZXJydXB0czsKKyAgICAgIGludCBoYXJkd2FyZVR5cGU7CisgICAgICBpbnQgcmFkaW9UeXBlOworICAgICAgaW50IHdyaXRlUmFkaW9UeXBlOworICAgICAgaW50IHdyaXRlRUVQUk9NOworICAgICAgY2hhciBzaXRlTmFtZVsxN107CisgICAgICBpbnQgbWVhc3VyZV9yYXRlOworICAgICAgaW50IGluX3NwZWVkOworICAgICAgaW50IG91dF9zcGVlZDsKKyAgICAgIGludCBpbl9zcGVlZDEwOworICAgICAgaW50IG91dF9zcGVlZDEwOworICAgICAgaW50IGluX3NwZWVkX21heDsKKyAgICAgIGludCBvdXRfc3BlZWRfbWF4OworICAgICAgaW50IHByZV9Db21tYW5kX1dhaXQ7CisgICAgICBpbnQgcnhfdHdlYWsxOworICAgICAgaW50IHJ4X3R3ZWFrMjsKKyAgICAgIGludCB0eF9xdWV1ZV9sZW47Cit9OworCitleHRlcm4gc3RydWN0IGFybGFuX2NvbmZfc3RydSBhcmxhbl9jb25mW01BWF9BUkxBTlNdOworCitzdHJ1Y3QgVHhQYXJhbQoreworICAgICAgdm9sYXRpbGUJc2hvcnQgCQlvZmZzZXQ7CisgICAgICB2b2xhdGlsZSAJc2hvcnQgCQlsZW5ndGg7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgCQlkZXN0WzZdOworICAgICAgdm9sYXRpbGUJdW5zaWduZWQJY2hhciBjbGVhcjsKKyAgICAgIHZvbGF0aWxlCXVuc2lnbmVkCWNoYXIgcmV0cmllczsKKyAgICAgIHZvbGF0aWxlCXVuc2lnbmVkCWNoYXIgcm91dGluZzsKKyAgICAgIHZvbGF0aWxlCXVuc2lnbmVkCWNoYXIgc2NyYW1ibGVkOworfTsKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgMgorLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSB7CisgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICAgIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICogY2FyZDsKKyAgICAgIHN0cnVjdCBhcmxhbl9zaG1lbSAqIGNvbmY7CisKKyAgICAgIHN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKiBDb25mOwkgICAgIAorICAgICAgaW50CWJhZDsKKyAgICAgIGludCAJcmVzZXQ7CisgICAgICB1bnNpZ25lZCBsb25nIGxhc3RSZXNldDsKKyAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdHhfZGVsYXlfdGltZXI7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0eF9yZXRyeV90aW1lcjsKKyAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHJ4X2NoZWNrX3RpbWVyOworCisgICAgICBpbnQgcmVnaXN0cmF0aW9uTG9zdENvdW50OworICAgICAgaW50IHJlUmVnaXN0ZXJFeHA7CisgICAgICBpbnQgaXJxX3Rlc3RfZG9uZTsKKworICAgICAgc3RydWN0IFR4UGFyYW0gdHhSaW5nW1RYX1JJTkdfU0laRV07CisgICAgICBjaGFyIHJlVHJhbnNtaXRCdWZmWzB4ODAwXTsKKyAgICAgIGludCB0eExhc3Q7CisgICAgICB1bnNpZ25lZCBSZVRyYW5zbWl0UmVxdWVzdGVkOworICAgICAgdW5zaWduZWQgbG9uZyB0eF9kb25lX2RlbGF5ZWQ7CisgICAgICB1bnNpZ25lZCBsb25nIHJlZ2lzdHJhdGlvbkxhc3RTZWVuOworCisgICAgICB1bnNpZ25lZCBsb25nCXR4X2xhc3Rfc2VudDsKKyAgICAgIHVuc2lnbmVkIGxvbmcJdHhfbGFzdF9jbGVhcmVkOworICAgICAgdW5zaWduZWQgbG9uZwlyZXRyYW5zbWlzc2lvbnM7CisgICAgICB1bnNpZ25lZCBsb25nIAlpbnRlcnJ1cHRfYWNrX3JlcXVlc3RlZDsKKyAgICAgIHNwaW5sb2NrX3QJbG9jazsKKyAgICAgIHVuc2lnbmVkIGxvbmcJd2FpdGluZ19jb21tYW5kX21hc2s7CisgICAgICB1bnNpZ25lZCBsb25nIAljYXJkX3BvbGxpbmdfaW50ZXJ2YWw7CisgICAgICB1bnNpZ25lZCBsb25nIAlsYXN0X2NvbW1hbmRfYnVmZl9mcmVlX3RpbWU7CisKKyAgICAgIGludCAJCXVuZGVyX3Jlc2V0OworICAgICAgaW50IAkJdW5kZXJfY29uZmlnOworICAgICAgaW50IAkJcnhfY29tbWFuZF9naXZlbjsKKyAgICAgIGludAkgCXR4X2NvbW1hbmRfZ2l2ZW47CisgICAgICB1bnNpZ25lZCAgbG9uZwlpbnRlcnJ1cHRfcHJvY2Vzc2luZ19hY3RpdmU7CisgICAgICB1bnNpZ25lZCBsb25nCWxhc3RfcnhfaW50X2Fja190aW1lOworICAgICAgdW5zaWduZWQgbG9uZwlpbl9ieXRlczsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCW91dF9ieXRlczsKKyAgICAgIHVuc2lnbmVkIGxvbmcJaW5fdGltZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcJb3V0X3RpbWU7CisgICAgICB1bnNpZ25lZCBsb25nCWluX3RpbWUxMDsKKyAgICAgIHVuc2lnbmVkIGxvbmcJb3V0X3RpbWUxMDsKKyAgICAgIHVuc2lnbmVkIGxvbmcJaW5fYnl0ZXMxMDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCW91dF9ieXRlczEwOworICAgICAgaW50CWluaXRfZXRoZXJkZXZfYWxsb2M7Cit9OworCisKKworI2RlZmluZSBBUkxBTl9DTEVBUgkJMHgwMAorI2RlZmluZSBBUkxBTl9SRVNFVCAJCTB4MDEKKyNkZWZpbmUgQVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04gMHgwMgorI2RlZmluZSBBUkxBTl9JTlRFUlJVUFRfRU5BQkxFIAkweDA0CisjZGVmaW5lIEFSTEFOX0NMRUFSX0lOVEVSUlVQVCAJMHgwOAorI2RlZmluZSBBUkxBTl9QT1dFUiAJCTB4NDAKKyNkZWZpbmUgQVJMQU5fQUNDRVNTCQkweDgwCisKKyNkZWZpbmUgQVJMQU5fQ09NX0NPTkYgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBUkxBTl9DT01fUlhfRU5BQkxFICAgICAgICAgICAweDAzCisjZGVmaW5lIEFSTEFOX0NPTV9SWF9BQk9SVCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVJMQU5fQ09NX1RYX0VOQUJMRSAgICAgICAgICAgMHgwNQorI2RlZmluZSBBUkxBTl9DT01fVFhfQUJPUlQgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFSTEFOX0NPTV9OT1AJCSAgICAgIDB4MDcKKyNkZWZpbmUgQVJMQU5fQ09NX1NUQU5EQlkgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBUkxBTl9DT01fQUNUSVZBVEUgICAgICAgICAgICAweDA5CisjZGVmaW5lIEFSTEFOX0NPTV9HT1RPX1NMT1dfUE9MTCAgICAgIDB4MGEKKyNkZWZpbmUgQVJMQU5fQ09NX0lOVCAgICAgICAgICAgICAgICAgMHg4MAorCisKKyNkZWZpbmUgVFhMQVNUKGRldikgKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+dHhSaW5nWygoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+dHhMYXN0XSkKKyNkZWZpbmUgVFhIRUFEKGRldikgKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+dHhSaW5nWzBdKQorI2RlZmluZSBUWFRBSUwoZGV2KSAoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT50eFJpbmdbMV0pCisKKyNkZWZpbmUgVFhCdWZmU3RhcnQoZGV2KSBvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHR4QnVmZmVyKQorI2RlZmluZSBUWEJ1ZmZFbmQoZGV2KSBvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHh4QnVmZmVyKQorIAorI2RlZmluZSBSRUFEU0hNKHRvLGZyb20sYXR5cGUpIHtcCisJYXR5cGUgdG1wO1wKKwltZW1jcHlfZnJvbWlvKCYodG1wKSwmKGZyb20pLHNpemVvZihhdHlwZSkpO1wKKwl0byA9IHRtcDtcCisJfQorCisjZGVmaW5lIFJFQURTSE1FTShmcm9tLGF0eXBlKVwKKwlhdHlwZSBmcm9tOyBcCisJUkVBRFNITShmcm9tLCBhcmxhbi0+ZnJvbSwgYXR5cGUpOworCisjZGVmaW5lIFdSSVRFU0hNKHRvLGZyb20sYXR5cGUpIFwKKwl7IGF0eXBlIHRtcFNITSA9IGZyb207XAorCW1lbWNweV90b2lvKCYodG8pLCZ0bXBTSE0sc2l6ZW9mKGF0eXBlKSk7XAorCX0KKworI2RlZmluZSBERUJVR1NITShsZXZlbFNITSxzdHJpbmdTSE0sc3R1ZmYsYXR5cGUpIFwKKwl7CWF0eXBlIHRtcFNITTsgXAorCQltZW1jcHlfZnJvbWlvKCZ0bXBTSE0sJihzdHVmZiksc2l6ZW9mKGF0eXBlKSk7XAorCQlJRkRFQlVHKGxldmVsU0hNKSBwcmludGsoc3RyaW5nU0hNLHRtcFNITSk7XAorCX0KKworI2RlZmluZSBXUklURVNITUIodG8sIHZhbCkgXAorCXdyaXRlYih2YWwsJih0bykpCisjZGVmaW5lIFJFQURTSE1CKHRvKSBcCisJcmVhZGIoJih0bykpCisjZGVmaW5lIFdSSVRFU0hNUyh0bywgdmFsKSBcCisJd3JpdGV3KHZhbCwmKHRvKSkKKyNkZWZpbmUgUkVBRFNITVModG8pIFwKKwlyZWFkdygmKHRvKSkKKyNkZWZpbmUgV1JJVEVTSE1JKHRvLCB2YWwpIFwKKwl3cml0ZWwodmFsLCYodG8pKQorI2RlZmluZSBSRUFEU0hNSSh0bykgXAorCXJlYWRsKCYodG8pKQorCisKKworCisKKyNkZWZpbmUgcmVnaXN0cmF0aW9uQmFkKGRldilcCisgICAoICggICBSRUFEU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPnJlZ2lzdHJhdGlvbk1vZGUpICAgID4gMCkgJiYgXAorICAgICAoICAgUkVBRFNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5yZWdpc3RyYXRpb25TdGF0dXMpID09IDApICAgICkKKworCisjZGVmaW5lIHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KVwKKyAJUkVBRFNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5jbnRybFJlZ0ltYWdlKQorCisjZGVmaW5lIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldiwgdil7XAorICAgV1JJVEVTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+Y250cmxSZWdJbWFnZQksKCh2KSAmMHhGKSApO1wKKyAgIFdSSVRFU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPmNvbnRyb2xSZWdpc3RlcgksKHYpIAkpO30KKworCisjZGVmaW5lIGFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KSB7XAorICAgaW50IGNyOyAgIFwKKyAgIFwKKyAgIGNyID0gcmVhZENvbnRyb2xSZWdpc3RlcihkZXYpO1wKKyAgIGlmIChjciAmIEFSTEFOX0NIQU5ORUxfQVRURU5USU9OKXsgXAorICAgICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LCAoY3IgJiB+QVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04pKTtcCisgICB9ZWxzZSAgXAorICAgICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LCAoY3IgfCBBUkxBTl9DSEFOTkVMX0FUVEVOVElPTikpO1wKK30KKworI2RlZmluZSBjbGVhckNoYW5uZWxBdHRlbnRpb24oZGV2KXsgXAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9DSEFOTkVMX0FUVEVOVElPTik7fQorI2RlZmluZSBzZXRIYXJkd2FyZVJlc2V0KGRldikge1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCBBUkxBTl9SRVNFVCk7fQorI2RlZmluZSBjbGVhckhhcmR3YXJlUmVzZXQoZGV2KSB7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9SRVNFVCk7fQorI2RlZmluZSBzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgQVJMQU5fSU5URVJSVVBUX0VOQUJMRSkgIDt9CisjZGVmaW5lIGNsZWFySW50ZXJydXB0RW5hYmxlKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9JTlRFUlJVUFRfRU5BQkxFKSAgO30KKyNkZWZpbmUgc2V0Q2xlYXJJbnRlcnJ1cHQoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgQVJMQU5fQ0xFQVJfSU5URVJSVVBUKSAgIDt9CisjZGVmaW5lIGNsZWFyQ2xlYXJJbnRlcnJ1cHQoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX0NMRUFSX0lOVEVSUlVQVCk7fQorI2RlZmluZSBzZXRQb3dlck9mZihkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCAoQVJMQU5fUE9XRVIgJiYgQVJMQU5fQUNDRVNTKSk7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9BQ0NFU1MpO30KKyNkZWZpbmUgc2V0UG93ZXJPbihkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+KEFSTEFOX1BPV0VSKSk7ICAgfQorI2RlZmluZSBhcmxhbl9sb2NrX2NhcmRfYWNjZXNzKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9BQ0NFU1MpO30KKyNkZWZpbmUgYXJsYW5fdW5sb2NrX2NhcmRfYWNjZXNzKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX0FDQ0VTUyApOyB9ICAKKworCisKKworI2RlZmluZSBBUkxBTl9DT01NQU5EX1JYCQkweDAwMDAwMQorI2RlZmluZSBBUkxBTl9DT01NQU5EX05PT1AJCTB4MDAwMDAyCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfTk9PUElOVAkJMHgwMDAwMDQKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9UWAkJMHgwMDAwMDgKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9DT05GCQkweDAwMDAxMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1JFU0VUCQkweDAwMDAyMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1RYX0FCT1JUCQkweDAwMDA0MAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1JYX0FCT1JUCQkweDAwMDA4MAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1BPV0VSRE9XTgkJMHgwMDAxMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9QT1dFUlVQCQkweDAwMDIwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1NMT1dfUE9MTCAJMHgwMDA0MDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9BQ1RJVkFURSAJCTB4MDAwODAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfSU5UX0FDSwkJMHgwMDEwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFCTB4MDAyMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cJCTB4MDA0MDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVwkweDAwODAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1NUQU5EQlkJCTB4MDEwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfSU5UX1JBQ0sJCTB4MDIwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEUJMHgwNDAwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9DT05GX1dBSVQJCTB4MDgwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfVEJVU1lfQ0xFQVIJMHgxMDAwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfQ09ORgkoQVJMQU5fQ09NTUFORF9UWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX1JYX0FCT1JUXAorCQkJCQl8IEFSTEFOX0NPTU1BTkRfQ09ORikKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQgICAoQVJMQU5fQ09NTUFORF9UWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX1JYX0FCT1JUXAorCQkJCQl8IEFSTEFOX0NPTU1BTkRfUkVTRVQpCisKKworIAorI2RlZmluZSBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUwkJMHgwMDAwMQorI2RlZmluZSBBUkxBTl9ERUJVR19SRVNFVAkJMHgwMDAwMgorI2RlZmluZSBBUkxBTl9ERUJVR19USU1JTkcJCTB4MDAwMDQKKyNkZWZpbmUgQVJMQU5fREVCVUdfQ0FSRF9TVEFURQkJMHgwMDAwOAorI2RlZmluZSBBUkxBTl9ERUJVR19UWF9DSEFJTgkJMHgwMDAxMAorI2RlZmluZSBBUkxBTl9ERUJVR19NVUxUSUNBU1QJCTB4MDAwMjAKKyNkZWZpbmUgQVJMQU5fREVCVUdfSEVBREVSX0RVTVAJCTB4MDAwNDAKKyNkZWZpbmUgQVJMQU5fREVCVUdfSU5URVJSVVBUCQkweDAwMDgwCisjZGVmaW5lIEFSTEFOX0RFQlVHX1NUQVJUVVAJCTB4MDAxMDAKKyNkZWZpbmUgQVJMQU5fREVCVUdfU0hVVERPV04JCTB4MDAyMDAKKyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTdkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCkBAIC0wLDAgKzEsNDI3MiBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgIENvcHlyaWdodCAyMDAwLTIwMDEgQVRNRUwgQ29ycG9yYXRpb24uCisgICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDQgU2ltb24gS2VsbGV5LgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgZnJvbSB2ZXJzaW9uIDIuMS4xIG9mIHRoZSBBdG1lbCBkcml2ZXJzLCAKKyAgICByZWxlYXNlZCBieSBBdG1lbCBjb3JwLiB1bmRlciB0aGUgR1BMIGluIERlY2VtYmVyIDIwMDIuIEl0IGFsc28gCisgICAgaW5jbHVkZXMgY29kZSBmcm9tIHRoZSBMaW51eCBhaXJvbmV0IGRyaXZlcnMgKEMpIEJlbmphbWluIFJlZWQsIAorICAgIGFuZCB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UsIChDKSBEYXZpZCBIaW5kcyBhbmQgdGhlIExpbnV4IHdpcmVsZXNzCisgICAgZXh0ZW5zaW9ucywgKEMpIEplYW4gVG91cnJpbGhlcy4KKworICAgIFRoZSBmaXJtd2FyZSBtb2R1bGUgZm9yIHJlYWRpbmcgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkIGNvbWVzIGZyb20KKyAgICBuZXQucnVzc290dG8uQXRtZWxNQUNGVywgd3JpdHRlbiBieSBNYXR0aGV3IFQuIFJ1c3NvdHRvIGFuZCBjb3B5cmlnaHQKKyAgICBieSBoaW0uIG5ldC5ydXNzb3R0by5BdG1lbE1BQ0ZXIGlzIHVzZWQgdW5kZXIgdGhlIEdQTCBsaWNlbnNlIHZlcnNpb24gMi4KKyAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1vZHVsZSBpbiBiaW5hcnkgZm9ybSBhbmQsIHVuZGVyIHRoZSB0ZXJtcworICAgIG9mIHRoZSBHUEwsIGluIHNvdXJjZSBmb3JtLiBUaGUgc291cmNlIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbCB3aXJlbGVzcyBsYW4gZHJpdmVyczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIEZvciBhbGwgcXVlcmllcyBhYm91dCB0aGlzIGNvZGUsIHBsZWFzZSBjb250YWN0IHRoZSBjdXJyZW50IGF1dGhvciwgCisgICAgU2ltb24gS2VsbGV5IDxzaW1vbkB0aGVrZWxsZXlzLm9yZy51az4gYW5kIG5vdCBBdG1lbCBDb3Jwb3JhdGlvbi4KKworICAgIENyZWRpdCBpcyBkdWUgdG8gSFAgVUsgYW5kIENhbWJyaWRnZSBPbmxpbmUgU3lzdGVtcyBMdGQgZm9yIHN1cHBseWluZworICAgIGhhcmR3YXJlIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKyNpbmNsdWRlICJhdG1lbC5oIgorCisjZGVmaW5lIERSSVZFUl9NQUpPUiAwCisjZGVmaW5lIERSSVZFUl9NSU5PUiA5NgorCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBLZWxsZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQXRtZWwgYXQ3NmM1MHggODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IGNhcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkF0bWVsIGF0NzZjNTB4IHdpcmVsZXNzIGNhcmRzIik7CisKKy8qIFRoZSBuYW1lIG9mIHRoZSBmaXJtd2FyZSBmaWxlIHRvIGJlIGxvYWRlZCAKKyAgIG92ZXItcmlkZXMgYW55IGF1dG9tYXRpYyBzZWxlY3Rpb24gKi8KK3N0YXRpYyBjaGFyICpmaXJtd2FyZSA9IE5VTEw7Cittb2R1bGVfcGFyYW0oZmlybXdhcmUsIGNoYXJwLCAwKTsKKworLyogdGFibGUgb2YgZmlybXdhcmUgZmlsZSBuYW1lcyAqLworc3RhdGljIHN0cnVjdCB7IAorCUF0bWVsRldUeXBlIGZ3X3R5cGU7CisJY29uc3QgY2hhciAqZndfZmlsZTsKKwljb25zdCBjaGFyICpmd19maWxlX2V4dDsKK30gZndfdGFibGVbXSA9IHsKKwl7IEFUTUVMX0ZXX1RZUEVfNTAyLCAgICAgICJhdG1lbF9hdDc2YzUwMiIsICAgICAgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTAyRCwgICAgICJhdG1lbF9hdDc2YzUwMmQiLCAgICAgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTAyRSwgICAgICJhdG1lbF9hdDc2YzUwMmUiLCAgICAgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTAyXzNDT00sICJhdG1lbF9hdDc2YzUwMl8zY29tIiwgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTA0LCAgICAgICJhdG1lbF9hdDc2YzUwNCIsICAgICAgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTA0XzI5NTgsICJhdG1lbF9hdDc2YzUwNF8yOTU4IiwgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTA0QV8yOTU4LCJhdG1lbF9hdDc2YzUwNGFfMjk1OCIsImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfNTA2LCAgICAgICJhdG1lbF9hdDc2YzUwNiIsICAgICAgImJpbiIgfSwKKwl7IEFUTUVMX0ZXX1RZUEVfTk9ORSwgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIE5VTEwgfQorfTsKKworI2RlZmluZSBNQVhfU1NJRF9MRU5HVEggMzIKKyNkZWZpbmUgTUdNVF9KSUZGSUVTICgyNTYgKiBIWiAvIDEwMCkKKworI2RlZmluZSBNQVhfQlNTX0VOVFJJRVMJNjQJCisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBHQ1IgIDB4MDAgICAgLy8gICAgICAoU0lSMCkgIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICAgICAgCisjZGVmaW5lIEJTUiAgMHgwMiAgICAvLyAgICAgIChTSVIxKSAgQmFuayBTd2l0Y2hpbmcgU2VsZWN0IFJlZ2lzdGVyIAorI2RlZmluZSBBUiAgIDB4MDQKKyNkZWZpbmUgRFIgICAweDA4CisjZGVmaW5lIE1SMSAgMHgxMiAgICAvLyAgICAgIE1pcnJvciBSZWdpc3RlciAxICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIE1SMiAgMHgxNCAgICAvLyAgICAgIE1pcnJvciBSZWdpc3RlciAyICAKKyNkZWZpbmUgTVIzICAweDE2ICAgIC8vICAgICAgTWlycm9yIFJlZ2lzdGVyIDMgIAorI2RlZmluZSBNUjQgIDB4MTggICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgNCAgIAorCisjZGVmaW5lIEdQUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBHUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgR1BSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisvLworLy8gQ29uc3RhbnRzIGZvciB0aGUgR0NSIHJlZ2lzdGVyLgorLy8KKyNkZWZpbmUgR0NSX1JFTUFQICAgICAweDA0MDAgICAgICAgICAgLy8gUmVtYXAgaW50ZXJuYWwgU1JBTSB0byAwCisjZGVmaW5lIEdDUl9TV1JFUyAgICAgMHgwMDgwICAgICAgICAgIC8vIEJJVSByZXNldCAoQVJNIGFuZCBQQUkgYXJlIE5PVCByZXNldCkgCisjZGVmaW5lIEdDUl9DT1JFUyAgICAgMHgwMDYwICAgICAgICAgIC8vIENvcmUgUmVzZXQgKEFSTSBhbmQgUEFJIGFyZSByZXNldCkKKyNkZWZpbmUgR0NSX0VOSU5UICAgICAweDAwMDIgICAgICAgICAgLy8gRW5hYmxlIEludGVycnVwdHMgICAgCisjZGVmaW5lIEdDUl9BQ0tJTlQgICAgMHgwMDA4ICAgICAgICAgIC8vIEFja25vd2xlZGdlIEludGVycnVwdHMKKworI2RlZmluZSBCU1NfU1JBTSAgICAgIDB4MDIwMCAgICAgICAgICAvLyBBTUJBIG1vZHVsZSBzZWxlY3Rpb24gLS0+IFNSQU0KKyNkZWZpbmUgQlNTX0lSQU0gICAgICAweDAxMDAgICAgICAgICAgLy8gQU1CQSBtb2R1bGUgc2VsZWN0aW9uIC0tPiBJUkFNCisvLworLy8gQ29uc3RhbnRzIGZvciB0aGUgTVIgcmVnaXN0ZXJzLgorLy8KKyNkZWZpbmUgTUFDX0lOSVRfQ09NUExFVEUgICAgICAgMHgwMDAxICAgICAgICAvLyBNQUMgaW5pdCBoYXMgYmVlbiBjb21wbGV0ZWQKKyNkZWZpbmUgTUFDX0JPT1RfQ09NUExFVEUgICAgICAgMHgwMDEwICAgICAgICAvLyBNQUMgYm9vdCBoYXMgYmVlbiBjb21wbGV0ZWQKKyNkZWZpbmUgTUFDX0lOSVRfT0sgICAgICAgICAgICAgMHgwMDAyICAgICAgICAvLyBNQUMgYm9vdCBoYXMgYmVlbiBjb21wbGV0ZWQKKworI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVFVRVNUICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9SRUFTU19SRVFVRVNUICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX1JFQVNTX1JFU1BPTlNFICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUHJvYmVSZXF1ZXN0ICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9Qcm9iZVJlc3BvbnNlICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0JFQUNPTiAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfQVRJTSAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9ESVNBU1NPU0lBVElPTiAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0F1dGhlbnRpY2F0aW9uICAgICAgICAgICAgICAweEIwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfRGVhdXRoZW50aWNhdGlvbiAgICAweEMwCisKKyNkZWZpbmUgQzgwMjExX01HTVRfQUFOX09QRU5TWVNURU0gICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBDODAyMTFfTUdNVF9BQU5fU0hBUkVES0VZICAgICAgICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9FU1MgICAgICAgICAgICAgIDB4MDAwMSAgLy8gc2VlIDgwMi4xMSBwLjU4CisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfSUJTUyAgICAgICAgICAgICAweDAwMDIgIC8vICAgICAgLSAiIC0KKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9DRlBvbGxhYmxlICAgICAgIDB4MDAwNCAgLy8gICAgICAtICIgLQorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0NGUG9sbFJlcXVlc3QgICAgMHgwMDA4ICAvLyAgICAgIC0gIiAtCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfUHJpdmFjeSAgICAgICAgICAweDAwMTAgIC8vICAgICAgLSAiIC0KKworI2RlZmluZSBDODAyMTFfTUdNVF9TQ19TdWNjZXNzICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19VbnNwZWNpZmllZCAgICAgICAgICAgICAgMQorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19TdXBwb3J0Q2FwYWJpbGl0aWVzICAgICAgMTAKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfUmVhc3NEZW5pZWQgICAgICAgICAgICAgIDExCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZCAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19BdXRoQWxnTm90U3VwcG9ydGVkICAgICAgMTMKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aFRyYW5zU2VxTnVtRXJyb3IgICAgIDE0CisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0F1dGhSZWplY3RDaGFsbGVuZ2UgICAgICAxNQorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19BdXRoUmVqZWN0VGltZW91dCAgICAgICAgMTYKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXNzRGVuaWVkSGFuZGxlQVAgICAgICAgIDE3CisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZEJTU1JhdGUgICAgICAgICAxOAorCisjZGVmaW5lIEM4MDIxMV9NR01UX0VsZW1lbnRJRF9TU0lEICAgICAgICAgICAgICAwCisjZGVmaW5lIEM4MDIxMV9NR01UX0VsZW1lbnRJRF9TdXBwb3J0ZWRSYXRlcyAgICAxCisjZGVmaW5lIEM4MDIxMV9NR01UX0VsZW1lbnRJRF9DaGFsbGVuZ2VUZXh0ICAgICAxNgorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1Nob3J0UHJlYW1ibGUgICAgMHgwMDIwCisKKyNkZWZpbmUgTUlCX01BWF9EQVRBX0JZVEVTICAgIDIxMgorI2RlZmluZSBNSUJfSEVBREVSX1NJWkUgICAgICAgNCAgICAvKiBmaXJzdCBmb3VyIGZpZWxkcyAqLworCitzdHJ1Y3QgZ2V0X3NldF9taWIgeworICAgICAgICB1OCB0eXBlOworICAgICAgICB1OCBzaXplOworICAgICAgICB1OCBpbmRleDsKKyAgICAgICAgdTggcmVzZXJ2ZWQ7CisgICAgICAgIHU4IGRhdGFbTUlCX01BWF9EQVRBX0JZVEVTXTsKK307CisKK3N0cnVjdCByeF9kZXNjIHsKKyAgICAgICAgdTMyICAgICAgICAgIE5leHQ7CisgICAgICAgIHUxNiAgICAgICAgICBNc2R1UG9zOworICAgICAgICB1MTYgICAgICAgICAgTXNkdVNpemU7CisJCisgICAgICAgIHU4ICAgICAgICAgICBTdGF0ZTsKKyAgICAgICAgdTggICAgICAgICAgIFN0YXR1czsKKyAgICAgICAgdTggICAgICAgICAgIFJhdGU7CisgICAgICAgIHU4ICAgICAgICAgICBSc3NpOworICAgICAgICB1OCAgICAgICAgICAgTGlua1F1YWxpdHk7CisgICAgICAgIHU4ICAgICAgICAgICBQcmVhbWJsZVR5cGU7CisgICAgICAgIHUxNiAgICAgICAgICBEdXJhdGlvbjsKKyAgICAgICAgdTMyICAgICAgICAgIFJ4VGltZTsKKworfTsKKworI2RlZmluZSBSWF9ERVNDX0ZMQUdfVkFMSUQgICAgICAgMHg4MAorI2RlZmluZSBSWF9ERVNDX0ZMQUdfQ09OU1VNRUQgICAgMHg0MAorI2RlZmluZSBSWF9ERVNDX0ZMQUdfSURMRSAgICAgICAgMHgwMAorCisjZGVmaW5lIFJYX1NUQVRVU19TVUNDRVNTICAgICAgICAweDAwCisKKyNkZWZpbmUgUlhfREVTQ19NU0RVX1BPU19PRkZTRVQgICAgICA0CisjZGVmaW5lIFJYX0RFU0NfTVNEVV9TSVpFX09GRlNFVCAgICAgNgorI2RlZmluZSBSWF9ERVNDX0ZMQUdTX09GRlNFVCAgICAgICAgIDgKKyNkZWZpbmUgUlhfREVTQ19TVEFUVVNfT0ZGU0VUICAgICAgICA5CisjZGVmaW5lIFJYX0RFU0NfUlNTSV9PRkZTRVQgICAgICAgICAgMTEKKyNkZWZpbmUgUlhfREVTQ19MSU5LX1FVQUxJVFlfT0ZGU0VUICAxMgorI2RlZmluZSBSWF9ERVNDX1BSRUFNQkxFX1RZUEVfT0ZGU0VUIDEzCisjZGVmaW5lIFJYX0RFU0NfRFVSQVRJT05fT0ZGU0VUICAgICAgMTQKKyNkZWZpbmUgUlhfREVTQ19SWF9USU1FX09GRlNFVCAgICAgICAxNgorCisKK3N0cnVjdCB0eF9kZXNjIHsKKwl1MzIgICAgICAgTmV4dERlc2NyaXB0b3I7CisJdTE2ICAgICAgIFR4U3RhcnRPZkZyYW1lOworCXUxNiAgICAgICBUeExlbmd0aDsKKwkKKwl1OCAgICAgICAgVHhTdGF0ZTsKKwl1OCAgICAgICAgVHhTdGF0dXM7CisJdTggICAgICAgIFJldHJ5Q291bnQ7CisJCisJdTggICAgICAgIFR4UmF0ZTsKKworCXU4ICAgICAgICBLZXlJbmRleDsKKwl1OCAgICAgICAgQ2hpcGVyVHlwZTsKKwl1OCAgICAgICAgQ2hpcHJlTGVuZ3RoOworICAgICAgICB1OCAgICAgICAgUmVzZXJ2ZWQxOworCisJdTggICAgICAgIFJlc2VydmVkOworCXU4ICAgICAgICBQYWNrZXRUeXBlOworCXUxNiAgICAgICBIb3N0VHhMZW5ndGg7CisJCit9OworCisKKyNkZWZpbmUgVFhfREVTQ19ORVhUX09GRlNFVCAgICAgICAgICAwCisjZGVmaW5lIFRYX0RFU0NfUE9TX09GRlNFVCAgICAgICAgICAgNAorI2RlZmluZSBUWF9ERVNDX1NJWkVfT0ZGU0VUICAgICAgICAgIDYKKyNkZWZpbmUgVFhfREVTQ19GTEFHU19PRkZTRVQgICAgICAgICA4CisjZGVmaW5lIFRYX0RFU0NfU1RBVFVTX09GRlNFVCAgICAgICAgOQorI2RlZmluZSBUWF9ERVNDX1JFVFJZX09GRlNFVCAgICAgICAgIDEwCisjZGVmaW5lIFRYX0RFU0NfUkFURV9PRkZTRVQgICAgICAgICAgMTEKKyNkZWZpbmUgVFhfREVTQ19LRVlfSU5ERVhfT0ZGU0VUICAgICAxMgorI2RlZmluZSBUWF9ERVNDX0NJUEhFUl9UWVBFX09GRlNFVCAgIDEzCisjZGVmaW5lIFRYX0RFU0NfQ0lQSEVSX0xFTkdUSF9PRkZTRVQgMTQKKyNkZWZpbmUgVFhfREVTQ19QQUNLRVRfVFlQRV9PRkZTRVQgICAxNworI2RlZmluZSBUWF9ERVNDX0hPU1RfTEVOR1RIX09GRlNFVCAgIDE4CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBIb3N0LU1BQyBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBUWF9TVEFUVVNfU1VDQ0VTUyAgICAgICAweDAwCisKKyNkZWZpbmUgVFhfRklSTV9PV04gICAgICAgICAgICAgMHg4MAorI2RlZmluZSBUWF9ET05FICAgICAgICAgICAgICAgICAweDQwCisKKworI2RlZmluZSBUWF9FUlJPUiAgICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgVFhfUEFDS0VUX1RZUEVfREFUQSAgICAgMHgwMQorI2RlZmluZSBUWF9QQUNLRVRfVFlQRV9NR01UICAgICAweDAyCisKKyNkZWZpbmUgSVNSX0VNUFRZICAgICAgICAgICAgICAgMHgwMCAgICAgICAgLy8gbm8gYml0cyBzZXQgaW4gSVNSCisjZGVmaW5lIElTUl9UeENPTVBMRVRFICAgICAgICAgIDB4MDEgICAgICAgIC8vIHBhY2tldCB0cmFuc21pdHRlZAorI2RlZmluZSBJU1JfUnhDT01QTEVURSAgICAgICAgICAweDAyICAgICAgICAvLyBwYWNrZXQgcmVjZWl2ZWQKKyNkZWZpbmUgSVNSX1J4RlJBTUVMT1NUICAgICAgICAgMHgwNCAgICAgICAgLy8gUnggRnJhbWUgbG9zdAorI2RlZmluZSBJU1JfRkFUQUxfRVJST1IgICAgICAgICAweDA4ICAgICAgICAvLyBGYXRhbCBlcnJvcgorI2RlZmluZSBJU1JfQ09NTUFORF9DT01QTEVURSAgICAweDEwICAgICAgICAvLyBjb21tYW5kIGNvbXBsZXRlZAorI2RlZmluZSBJU1JfT1VUX09GX1JBTkdFICAgICAgICAweDIwICAgICAgICAvLyBjb21tYW5kIGNvbXBsZXRlZAorI2RlZmluZSBJU1JfSUJTU19NRVJHRSAgICAgICAgICAweDQwICAgICAgICAvLyAoNC4xLjIuMzApOiBJQlNTIG1lcmdlCisjZGVmaW5lIElTUl9HRU5FUklDX0lSUSAgICAgICAgIDB4ODAgICAgICAgICAgICAgICAgCisKKworI2RlZmluZSBMb2NhbF9NaWJfVHlwZSAgICAgICAgICAweDAxCisjZGVmaW5lIE1hY19BZGRyZXNzX01pYl9UeXBlICAgIDB4MDIKKyNkZWZpbmUgTWFjX01pYl9UeXBlICAgICAgICAgICAgMHgwMworI2RlZmluZSBTdGF0aXN0aWNzX01pYl9UeXBlICAgICAweDA0CisjZGVmaW5lIE1hY19NZ210X01pYl9UeXBlICAgICAgIDB4MDUKKyNkZWZpbmUgTWFjX1dlcF9NaWJfVHlwZSAgICAgICAgMHgwNgorI2RlZmluZSBQaHlfTWliX1R5cGUgICAgICAgICAgICAweDA3CisjZGVmaW5lIE11bHRpX0RvbWFpbl9NSUIgICAgICAgIDB4MDgKKworI2RlZmluZSBNQUNfTUdNVF9NSUJfQ1VSX0JTU0lEX1BPUyAgICAgICAgICAgIDE0CisjZGVmaW5lIE1BQ19NSUJfRlJBR19USFJFU0hPTERfUE9TICAgICAgICAgICAgOAorI2RlZmluZSBNQUNfTUlCX1JUU19USFJFU0hPTERfUE9TICAgICAgICAgICAgIDEwCisjZGVmaW5lIE1BQ19NSUJfU0hPUlRfUkVUUllfUE9TICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUFDX01JQl9MT05HX1JFVFJZX1BPUyAgICAgICAgICAgICAgICAxNworI2RlZmluZSBNQUNfTUlCX1NIT1JUX1JFVFJZX0xJTUlUX1BPUyAgICAgICAgIDE2CisjZGVmaW5lIE1BQ19NR01UX01JQl9CRUFDT05fUEVSX1BPUyAgICAgICAgICAgMAorI2RlZmluZSBNQUNfTUdNVF9NSUJfU1RBVElPTl9JRF9QT1MgICAgICAgICAgIDYKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0NVUl9QUklWQUNZX1BPUyAgICAgICAgICAxMQorI2RlZmluZSBNQUNfTUdNVF9NSUJfQ1VSX0JTU0lEX1BPUyAgICAgICAgICAgIDE0CisjZGVmaW5lIE1BQ19NR01UX01JQl9QU19NT0RFX1BPUyAgICAgICAgICAgICAgNTMKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MgICAgICA1NAorI2RlZmluZSBNQUNfTUdNVF9NSUJfTVVMVElfRE9NQUlOX0lNUExFTUVOVEVEIDU2CisjZGVmaW5lIE1BQ19NR01UX01JQl9NVUxUSV9ET01BSU5fRU5BQkxFRCAgICAgNTcKKyNkZWZpbmUgUEhZX01JQl9DSEFOTkVMX1BPUyAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBQSFlfTUlCX1JBVEVfU0VUX1BPUyAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFBIWV9NSUJfUkVHX0RPTUFJTl9QT1MgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgTE9DQUxfTUlCX0FVVE9fVFhfUkFURV9QT1MgICAgICAgICAgICAzCisjZGVmaW5lIExPQ0FMX01JQl9TU0lEX1NJWkUgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMT0NBTF9NSUJfVFhfUFJPTUlTQ1VPVVNfUE9TICAgICAgICAgIDYKKyNkZWZpbmUgTE9DQUxfTUlCX1RYX01HTVRfUkFURV9QT1MgICAgICAgICAgICA3CisjZGVmaW5lIExPQ0FMX01JQl9UWF9DT05UUk9MX1JBVEVfUE9TICAgICAgICAgOAorI2RlZmluZSBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTUFDX0FERFJfTUlCX01BQ19BRERSX1BPUyAgICAgICAgICAgICAwCisKKworI2RlZmluZSAgICAgICAgIENNRF9TZXRfTUlCX1ZhcnMgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBDTURfR2V0X01JQl9WYXJzICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICAgICAgICAgQ01EX1NjYW4gICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSAgICAgICAgIENNRF9Kb2luICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBDTURfU3RhcnQgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lICAgICAgICAgQ01EX0VuYWJsZVJhZGlvICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgICAgICAgIENNRF9EaXNhYmxlUmFkaW8gICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgICAgICAgICBDTURfU2l0ZVN1cnZleSAgICAgICAgICAgICAgICAweDBCCisKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfQ09NUExFVEUgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19VTktOT1dOICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICAgICAgMHgwMworI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRCAweDA0CisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19USU1FX09VVCAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0lOX1BST0dSRVNTICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfUkVKRUNURURfUkFESU9fT0ZGICAgICAweDA5CisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19IT1NUX0VSUk9SICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgMHhGRQorCisKKyNkZWZpbmUgQ01EX0JMT0NLX0NPTU1BTkRfT0ZGU0VUICAgICAgICAwCisjZGVmaW5lIENNRF9CTE9DS19TVEFUVVNfT0ZGU0VUICAgICAgICAgMQorI2RlZmluZSBDTURfQkxPQ0tfUEFSQU1FVEVSU19PRkZTRVQgICAgIDQKKworI2RlZmluZSBTQ0FOX09QVElPTlNfU0lURV9TVVJWRVkgICAgICAgIDB4ODAKKworI2RlZmluZSBNR01UX0ZSQU1FX0JPRFlfT0ZGU0VUCQkyNAorI2RlZmluZSBNQVhfQVVUSEVOVElDQVRJT05fUkVUUklFUwkzCisjZGVmaW5lIE1BWF9BU1NPQ0lBVElPTl9SRVRSSUVTIAkzCisKKyNkZWZpbmUgQVVUSEVOVElDQVRJT05fUkVTUE9OU0VfVElNRV9PVVQgIDEwMDAKKworI2RlZmluZSBNQVhfV0lSRUxFU1NfQk9EWSAgMjMxNiAvKiBtdHUgaXMgMjMxMiwgQ1JDIGlzIDQgKi8KKyNkZWZpbmUgTE9PUF9SRVRSWV9MSU1JVCAgIDUwMDAwMAorCisjZGVmaW5lIEFDVElWRV9NT0RFIAkxCisjZGVmaW5lIFBTX01PREUgCTIKKworI2RlZmluZSBNQVhfRU5DUllQVElPTl9LRVlTIDQKKyNkZWZpbmUgTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUgNDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyA4MDIuMTEgcmVsYXRlZCBkZWZpbml0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vCisvLyBSZWd1bGF0b3J5IERvbWFpbnMKKy8vCisKKyNkZWZpbmUgUkVHX0RPTUFJTl9GQ0MJCTB4MTAJLy9DaGFubmVscwkxLTExCVVTQQorI2RlZmluZSBSRUdfRE9NQUlOX0RPQwkJMHgyMAkvL0NoYW5uZWwJMS0xMQlDYW5hZGEKKyNkZWZpbmUgUkVHX0RPTUFJTl9FVFNJCQkweDMwCS8vQ2hhbm5lbAkxLTEzCUV1cm9wZSAoZXggU3BhaW4vRnJhbmNlKQorI2RlZmluZSBSRUdfRE9NQUlOX1NQQUlOCTB4MzEJLy9DaGFubmVsCTEwLTExCVNwYWluCisjZGVmaW5lIFJFR19ET01BSU5fRlJBTkNFCTB4MzIJLy9DaGFubmVsCTEwLTEzCUZyYW5jZQorI2RlZmluZSBSRUdfRE9NQUlOX01LSwkJMHg0MAkvL0NoYW5uZWwJMTQJSmFwYW4KKyNkZWZpbmUgUkVHX0RPTUFJTl9NS0sxCQkweDQxCS8vQ2hhbm5lbAkxLTE0CUphcGFuKE1LSzEpCisjZGVmaW5lIFJFR19ET01BSU5fSVNSQUVMCTB4NTAJLy9DaGFubmVsCTMtOQlJU1JBRUwKKworI2RlZmluZSBCU1NfVFlQRV9BRF9IT0MgCTEKKyNkZWZpbmUgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUgMgorCisjZGVmaW5lIFNDQU5fVFlQRV9BQ1RJVkUJMAorI2RlZmluZSBTQ0FOX1RZUEVfUEFTU0lWRQkxCisKKyNkZWZpbmUgTE9OR19QUkVBTUJMRQkJMAorI2RlZmluZSBTSE9SVF9QUkVBTUJMRQkJMQorI2RlZmluZSBBVVRPX1BSRUFNQkxFCQkyCisKKyNkZWZpbmUgREFUQV9GUkFNRV9XU19IRUFERVJfU0laRSAgIDMwCisKKy8qIHByb21pc2N1b3VzIG1vZGUgY29udHJvbCAqLyAKKyNkZWZpbmUgUFJPTV9NT0RFX09GRgkJCTB4MAorI2RlZmluZSBQUk9NX01PREVfVU5LTk9XTgkJMHgxCisjZGVmaW5lIFBST01fTU9ERV9DUkNfRkFJTEVECQkweDIKKyNkZWZpbmUgUFJPTV9NT0RFX0RVUExJQ0FURUQJCTB4NAorI2RlZmluZSBQUk9NX01PREVfTUdNVAkJCTB4OAorI2RlZmluZSBQUk9NX01PREVfQ1RSTAkJCTB4MTAKKyNkZWZpbmUgUFJPTV9NT0RFX0JBRF9QUk9UT0NPTAkJMHgyMAorCisKKyNkZWZpbmUgSUZBQ0VfSU5UX1NUQVRVU19PRkZTRVQgCTAKKyNkZWZpbmUgSUZBQ0VfSU5UX01BU0tfT0ZGU0VUCQkxCisjZGVmaW5lIElGQUNFX0xPQ0tPVVRfSE9TVF9PRkZTRVQJMgorI2RlZmluZSBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQJMworI2RlZmluZSBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUCQkyOAorI2RlZmluZSBJRkFDRV9NQUNfU1RBVF9PRkZTRVQJCTMwCisjZGVmaW5lIElGQUNFX0dFTkVSSUNfSU5UX1RZUEVfT0ZGU0VUCTMyCisKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX05PTkUgICAgIDAgCisjZGVmaW5lIENJUEhFUl9TVUlURV9XRVBfNjQgICAxCisjZGVmaW5lIENJUEhFUl9TVUlURV9US0lQICAgICAyCisjZGVmaW5lIENJUEhFUl9TVUlURV9BRVMgICAgICAzCisjZGVmaW5lIENJUEhFUl9TVUlURV9DQ1ggICAgICA0CisjZGVmaW5lIENJUEhFUl9TVUlURV9XRVBfMTI4ICA1CisKKy8vCisvLyBJRkFDRSBNQUNST1MgJiBkZWZpbml0aW9ucworLy8KKy8vCisKKy8vIEZ1bmNDdHJsIGZpZWxkOiAKKy8vCisjZGVmaW5lIEZVTkNfQ1RSTF9UeEVOQUJMRQkJMHgxMAorI2RlZmluZSBGVU5DX0NUUkxfUnhFTkFCTEUJCTB4MjAKKyNkZWZpbmUgRlVOQ19DVFJMX0lOSVRfQ09NUExFVEUgCTB4MDEKKworLyogQSBzdHViIGZpcm13YXJlIGltYWdlIHdoaWNoIHJlYWRzIHRoZSBNQUMgYWRkcmVzcyBmcm9tIE5WUkFNIG9uIHRoZSBjYXJkLgorICAgRm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBhbmQgc291cmNlIHNlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gKi8KK3N0YXRpYyB1OCBtYWNfcmVhZGVyW10gPSB7CisJMHgwNiwweDAwLDB4MDAsMHhlYSwweDA0LDB4MDAsMHgwMCwweGVhLDB4MDMsMHgwMCwweDAwLDB4ZWEsMHgwMiwweDAwLDB4MDAsMHhlYSwKKwkweDAxLDB4MDAsMHgwMCwweGVhLDB4MDAsMHgwMCwweDAwLDB4ZWEsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGZlLDB4ZmYsMHhmZiwweGVhLAorCTB4ZDMsMHgwMCwweGEwLDB4ZTMsMHgwMCwweGYwLDB4MjEsMHhlMSwweDBlLDB4MDQsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsCisJMHg4MSwweDExLDB4YTAsMHhlMSwweDAwLDB4MTAsMHg4MSwweGUzLDB4MDAsMHgxMCwweDgwLDB4ZTUsMHgxYywweDEwLDB4OTAsMHhlNSwKKwkweDEwLDB4MTAsMHhjMSwweGUzLDB4MWMsMHgxMCwweDgwLDB4ZTUsMHgwMSwweDEwLDB4YTAsMHhlMywweDA4LDB4MTAsMHg4MCwweGU1LAorCTB4MDIsMHgwMywweGEwLDB4ZTMsMHgwMCwweDEwLDB4YTAsMHhlMywweGIwLDB4MTAsMHhjMCwweGUxLDB4YjQsMHgxMCwweGMwLDB4ZTEsCisJMHhiOCwweDEwLDB4YzAsMHhlMSwweGJjLDB4MTAsMHhjMCwweGUxLDB4NTYsMHhkYywweGEwLDB4ZTMsMHgyMSwweDAwLDB4MDAsMHhlYiwKKwkweDBhLDB4MDAsMHhhMCwweGUzLDB4MWEsMHgwMCwweDAwLDB4ZWIsMHgxMCwweDAwLDB4MDAsMHhlYiwweDA3LDB4MDAsMHgwMCwweGViLAorCTB4MDIsMHgwMywweGEwLDB4ZTMsMHgwMiwweDE0LDB4YTAsMHhlMywweGI0LDB4MTAsMHhjMCwweGUxLDB4NGMsMHgxMCwweDlmLDB4ZTUsCisJMHhiYywweDEwLDB4YzAsMHhlMSwweDEwLDB4MTAsMHhhMCwweGUzLDB4YjgsMHgxMCwweGMwLDB4ZTEsMHhmZSwweGZmLDB4ZmYsMHhlYSwKKwkweDAwLDB4NDAsMHgyZCwweGU5LDB4MDAsMHgyMCwweGEwLDB4ZTMsMHgwMiwweDNjLDB4YTAsMHhlMywweDAwLDB4MTAsMHhhMCwweGUzLAorCTB4MjgsMHgwMCwweDlmLDB4ZTUsMHgzNywweDAwLDB4MDAsMHhlYiwweDAwLDB4NDAsMHhiZCwweGU4LDB4MWUsMHhmZiwweDJmLDB4ZTEsCisJMHgwMCwweDQwLDB4MmQsMHhlOSwweDEyLDB4MmUsMHhhMCwweGUzLDB4MDYsMHgzMCwweGEwLDB4ZTMsMHgwMCwweDEwLDB4YTAsMHhlMywKKwkweDAyLDB4MDQsMHhhMCwweGUzLDB4MmYsMHgwMCwweDAwLDB4ZWIsMHgwMCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLAorCTB4MDAsMHgwMiwweDAwLDB4MDIsMHg4MCwweDAxLDB4OTAsMHhlMCwweDAxLDB4MDAsMHgwMCwweDBhLDB4MDEsMHgwMCwweDUwLDB4ZTIsCisJMHhmYywweGZmLDB4ZmYsMHhlYSwweDFlLDB4ZmYsMHgyZiwweGUxLDB4ODAsMHgxMCwweGEwLDB4ZTMsMHhmMywweDA2LDB4YTAsMHhlMywKKwkweDAwLDB4MTAsMHg4MCwweGU1LDB4MDAsMHgxMCwweGEwLDB4ZTMsMHgwMCwweDEwLDB4ODAsMHhlNSwweDAxLDB4MTAsMHhhMCwweGUzLAorCTB4MDQsMHgxMCwweDgwLDB4ZTUsMHgwMCwweDEwLDB4ODAsMHhlNSwweDBlLDB4MzQsMHhhMCwweGUzLDB4MWMsMHgxMCwweDkzLDB4ZTUsCisJMHgwMiwweDFhLDB4ODEsMHhlMywweDFjLDB4MTAsMHg4MywweGU1LDB4NTgsMHgxMSwweDlmLDB4ZTUsMHgzMCwweDEwLDB4ODAsMHhlNSwKKwkweDU0LDB4MTEsMHg5ZiwweGU1LDB4MzQsMHgxMCwweDgwLDB4ZTUsMHgzOCwweDEwLDB4ODAsMHhlNSwweDNjLDB4MTAsMHg4MCwweGU1LAorCTB4MTAsMHgxMCwweDkwLDB4ZTUsMHgwOCwweDAwLDB4OTAsMHhlNSwweDFlLDB4ZmYsMHgyZiwweGUxLDB4ZjMsMHgxNiwweGEwLDB4ZTMsCisJMHgwOCwweDAwLDB4OTEsMHhlNSwweDA1LDB4MDAsMHhhMCwweGUzLDB4MGMsMHgwMCwweDgxLDB4ZTUsMHgxMCwweDAwLDB4OTEsMHhlNSwKKwkweDAyLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MGEsMHhmZiwweDAwLDB4YTAsMHhlMywweDBjLDB4MDAsMHg4MSwweGU1LAorCTB4MTAsMHgwMCwweDkxLDB4ZTUsMHgwMiwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHgwMCwweDkxLDB4ZTUsCisJMHgxMCwweDAwLDB4OTEsMHhlNSwweDAxLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwOCwweDAwLDB4OTEsMHhlNSwKKwkweGZmLDB4MDAsMHgwMCwweGUyLDB4MWUsMHhmZiwweDJmLDB4ZTEsMHgzMCwweDQwLDB4MmQsMHhlOSwweDAwLDB4NTAsMHhhMCwweGUxLAorCTB4MDMsMHg0MCwweGEwLDB4ZTEsMHhhMiwweDAyLDB4YTAsMHhlMSwweDA4LDB4MDAsMHgwMCwweGUyLDB4MDMsMHgwMCwweDgwLDB4ZTIsCisJMHhkOCwweDEwLDB4OWYsMHhlNSwweDAwLDB4MDAsMHhjMSwweGU1LDB4MDEsMHgyMCwweGMxLDB4ZTUsMHhlMiwweGZmLDB4ZmYsMHhlYiwKKwkweDAxLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MWEsMHgxNCwweDAwLDB4YTAsMHhlMywweGM0LDB4ZmYsMHhmZiwweGViLAorCTB4MDQsMHgyMCwweGEwLDB4ZTEsMHgwNSwweDEwLDB4YTAsMHhlMSwweDAyLDB4MDAsMHhhMCwweGUzLDB4MDEsMHgwMCwweDAwLDB4ZWIsCisJMHgzMCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLDB4NzAsMHg0MCwweDJkLDB4ZTksMHhmMywweDQ2LDB4YTAsMHhlMywKKwkweDAwLDB4MzAsMHhhMCwweGUzLDB4MDAsMHgwMCwweDUwLDB4ZTMsMHgwOCwweDAwLDB4MDAsMHg5YSwweDhjLDB4NTAsMHg5ZiwweGU1LAorCTB4MDMsMHg2MCwweGQ1LDB4ZTcsMHgwYywweDYwLDB4ODQsMHhlNSwweDEwLDB4NjAsMHg5NCwweGU1LDB4MDIsMHgwMCwweDE2LDB4ZTMsCisJMHhmYywweGZmLDB4ZmYsMHgwYSwweDAxLDB4MzAsMHg4MywweGUyLDB4MDAsMHgwMCwweDUzLDB4ZTEsMHhmNywweGZmLDB4ZmYsMHgzYSwKKwkweGZmLDB4MzAsMHhhMCwweGUzLDB4MGMsMHgzMCwweDg0LDB4ZTUsMHgwOCwweDAwLDB4OTQsMHhlNSwweDEwLDB4MDAsMHg5NCwweGU1LAorCTB4MDEsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgwYSwweDA4LDB4MDAsMHg5NCwweGU1LDB4MDAsMHgwMCwweGEwLDB4ZTMsCisJMHgwMCwweDAwLDB4NTIsMHhlMywweDBiLDB4MDAsMHgwMCwweDlhLDB4MTAsMHg1MCwweDk0LDB4ZTUsMHgwMiwweDAwLDB4MTUsMHhlMywKKwkweGZjLDB4ZmYsMHhmZiwweDBhLDB4MGMsMHgzMCwweDg0LDB4ZTUsMHgxMCwweDUwLDB4OTQsMHhlNSwweDAxLDB4MDAsMHgxNSwweGUzLAorCTB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwOCwweDUwLDB4OTQsMHhlNSwweDAxLDB4NTAsMHhjMSwweGU0LDB4MDEsMHgwMCwweDgwLDB4ZTIsCisJMHgwMiwweDAwLDB4NTAsMHhlMSwweGYzLDB4ZmYsMHhmZiwweDNhLDB4YzgsMHgwMCwweGEwLDB4ZTMsMHg5OCwweGZmLDB4ZmYsMHhlYiwKKwkweDcwLDB4NDAsMHhiZCwweGU4LDB4MWUsMHhmZiwweDJmLDB4ZTEsMHgwMSwweDBjLDB4MDAsMHgwMiwweDAxLDB4MDIsMHgwMCwweDAyLAorCTB4MDAsMHgwMSwweDAwLDB4MDIKK307CisKK3N0cnVjdCBhdG1lbF9wcml2YXRlIHsKKwl2b2lkICpjYXJkOyAvKiBCdXMgZGVwZW5kZW50IHN0dWN0dXJlIHZhcmllcyBmb3IgUENjYXJkICovCisJaW50ICgqcHJlc2VudF9jYWxsYmFjaykodm9pZCAqKTsgLyogQW5kIGNhbGxiYWNrIHdoaWNoIHVzZXMgaXQgKi8KKwljaGFyIGZpcm13YXJlX2lkWzMyXTsKKwlBdG1lbEZXVHlwZSBmaXJtd2FyZV90eXBlOworCXU4ICpmaXJtd2FyZTsKKwlpbnQgZmlybXdhcmVfbGVuZ3RoOworCXN0cnVjdCB0aW1lcl9saXN0IG1hbmFnZW1lbnRfdGltZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpzeXNfZGV2OworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsJLy8gZGV2aWNlIHN0YXRzCisJc3BpbmxvY2tfdCBpcnFsb2NrLCB0aW1lcmxvY2s7CS8vIHNwaW5sb2NrcworCWVudW0geyBCVVNfVFlQRV9QQ0NBUkQsIEJVU19UWVBFX1BDSSB9IGJ1c190eXBlOworCWVudW0geyAKKwkJQ0FSRF9UWVBFX1BBUkFMTEVMX0ZMQVNILCAKKwkJQ0FSRF9UWVBFX1NQSV9GTEFTSCwKKwkJQ0FSRF9UWVBFX0VFUFJPTSAKKwl9IGNhcmRfdHlwZTsKKwlpbnQgZG9fcnhfY3JjOyAvKiBJZiB3ZSBuZWVkIHRvIENSQyBpbmNvbWluZyBwYWNrZXRzICovCisJaW50IHByb2JlX2NyYzsgLyogc2V0IGlmIHdlIGRvbid0IHlldCBrbm93ICovCisJaW50IGNyY19va19jbnQsIGNyY19rb19jbnQ7IC8qIGNvdW50ZXJzIGZvciBwcm9iaW5nICovCisJdTE2IHJ4X2Rlc2NfaGVhZDsKKwl1MTYgdHhfZGVzY19mcmVlLCB0eF9kZXNjX2hlYWQsIHR4X2Rlc2NfdGFpbCwgdHhfZGVzY19wcmV2aW91czsKKwl1MTYgdHhfZnJlZV9tZW0sIHR4X2J1ZmZfaGVhZCwgdHhfYnVmZl90YWlsOworCQorCXUxNiBmcmFnX3NlcSwgZnJhZ19sZW4sIGZyYWdfbm87CisJdTggZnJhZ19zb3VyY2VbNl07IAorCQorCXU4IHdlcF9pc19vbiwgZGVmYXVsdF9rZXksIGV4Y2x1ZGVfdW5lbmNyeXB0ZWQsIGVuY3J5cHRpb25fbGV2ZWw7CisJdTggZ3JvdXBfY2lwaGVyX3N1aXRlLCBwYWlyd2lzZV9jaXBoZXJfc3VpdGU7CisJdTggd2VwX2tleXNbTUFYX0VOQ1JZUFRJT05fS0VZU11bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkVdOworCWludCB3ZXBfa2V5X2xlbltNQVhfRU5DUllQVElPTl9LRVlTXTsgCisJaW50IHVzZV93cGEsIHJhZGlvX29uX2Jyb2tlbjsgLyogZmlybXdhcmUgZGVwZW5kZW50IHN0dWZmLiAqLworCisJdTE2IGhvc3RfaW5mb19iYXNlOworCXN0cnVjdCBob3N0X2luZm9fc3RydWN0IHsgCisJCS8qIE5CIHRoaXMgaXMgbWF0Y2hlZCB0byB0aGUgaGFyZHdhcmUsIGRvbid0IGNoYW5nZS4gKi8KKwkJdTggdm9sYXRpbGUgaW50X3N0YXR1czsKKwkJdTggdm9sYXRpbGUgaW50X21hc2s7CisJCXU4IHZvbGF0aWxlIGxvY2tvdXRfaG9zdDsKKwkJdTggdm9sYXRpbGUgbG9ja291dF9tYWM7CisKKwkJdTE2IHR4X2J1ZmZfcG9zOworCQl1MTYgdHhfYnVmZl9zaXplOworCQl1MTYgdHhfZGVzY19wb3M7CisJCXUxNiB0eF9kZXNjX2NvdW50OworCisJCXUxNiByeF9idWZmX3BvczsKKwkJdTE2IHJ4X2J1ZmZfc2l6ZTsKKwkJdTE2IHJ4X2Rlc2NfcG9zOworCQl1MTYgcnhfZGVzY19jb3VudDsKKwkJCisJCXUxNiBidWlsZF92ZXJzaW9uOworCQl1MTYgY29tbWFuZF9wb3M7IAkKKwkJCisJCXUxNiBtYWpvcl92ZXJzaW9uOworCQl1MTYgbWlub3JfdmVyc2lvbjsKKwkJCisJCXUxNiBmdW5jX2N0cmw7CisJCXUxNiBtYWNfc3RhdHVzOworCQl1MTYgZ2VuZXJpY19JUlFfdHlwZTsKKwkJdTggIHJlc2VydmVkWzJdOworCX0gaG9zdF9pbmZvOworCisJZW51bSB7IAorCQlTVEFUSU9OX1NUQVRFX1NDQU5OSU5HLAorCQlTVEFUSU9OX1NUQVRFX0pPSU5OSU5HLAorCQlTVEFUSU9OX1NUQVRFX0FVVEhFTlRJQ0FUSU5HLAorCQlTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HLAorCQlTVEFUSU9OX1NUQVRFX1JFQURZLAorCQlTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcsCisJCVNUQVRJT05fU1RBVEVfRE9XTiwKKwkJU1RBVElPTl9TVEFURV9NR01UX0VSUk9SCisJfSBzdGF0aW9uX3N0YXRlOworCQorCWludCBvcGVyYXRpbmdfbW9kZSwgcG93ZXJfbW9kZTsKKwl0aW1lX3QgbGFzdF9xdWFsOworCWludCBiZWFjb25zX3RoaXNfc2VjOworCWludCBjaGFubmVsOworCWludCByZWdfZG9tYWluLCBjb25maWdfcmVnX2RvbWFpbjsKKwlpbnQgdHhfcmF0ZTsKKwlpbnQgYXV0b190eF9yYXRlOworCWludCBydHNfdGhyZXNob2xkOworCWludCBmcmFnX3RocmVzaG9sZDsKKwlpbnQgbG9uZ19yZXRyeSwgc2hvcnRfcmV0cnk7CisJaW50IHByZWFtYmxlOworCWludCBkZWZhdWx0X2JlYWNvbl9wZXJpb2QsIGJlYWNvbl9wZXJpb2QsIGxpc3Rlbl9pbnRlcnZhbDsKKwlpbnQgQ3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSwgRXhwZWN0ZWRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW07CQorCWludCBBdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCwgQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQsIFJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQ7CisJZW51bSB7CisJCVNJVEVfU1VSVkVZX0lETEUsCisJCVNJVEVfU1VSVkVZX0lOX1BST0dSRVNTLAorCQlTSVRFX1NVUlZFWV9DT01QTEVURUQgCisJfSBzaXRlX3N1cnZleV9zdGF0ZTsKKwl0aW1lX3QgbGFzdF9zdXJ2ZXk7CisKKwlpbnQgc3RhdGlvbl93YXNfYXNzb2NpYXRlZCwgc3RhdGlvbl9pc19hc3NvY2lhdGVkOworCWludCBmYXN0X3NjYW47CisJCQkJCisJc3RydWN0IGJzc19pbmZvIHsKKwkJaW50IGNoYW5uZWw7CisJCWludCBTU0lEc2l6ZTsKKwkJaW50IFJTU0k7CisJCWludCBVc2luZ1dFUDsKKwkJaW50IHByZWFtYmxlOworCQlpbnQgYmVhY29uX3BlcmlvZDsKKwkJaW50IEJTU3R5cGU7CisJCXU4IEJTU0lEWzZdOworCQl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF07CisJfSBCU1NpbmZvW01BWF9CU1NfRU5UUklFU107CisJaW50IEJTU19saXN0X2VudHJpZXMsIGN1cnJlbnRfQlNTOworCWludCBjb25uZWN0X3RvX2FueV9CU1M7IAorCWludCBTU0lEX3NpemUsIG5ld19TU0lEX3NpemU7CisJdTggQ3VycmVudEJTU0lEWzZdLCBCU1NJRFs2XTsKKwl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF0sIG5ld19TU0lEW01BWF9TU0lEX0xFTkdUSF07CisJdTY0IGxhc3RfYmVhY29uX3RpbWVzdGFtcDsKKwl1OCByeF9idWZbTUFYX1dJUkVMRVNTX0JPRFldOworCQorfTsKKworc3RhdGljIHU4IGF0bWVsX2Jhc2ljX3JhdGVzWzRdID0gezB4ODIsMHg4NCwweDBiLDB4MTZ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgcmVnX2RvbWFpbjsKKwlpbnQgbWluLCBtYXg7CisJY2hhciAqbmFtZTsgCit9IGNoYW5uZWxfdGFibGVbXSA9IHsgeyBSRUdfRE9NQUlOX0ZDQywgMSwgMTEsICJVU0EiIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9ET0MsIDEsIDExLCAiQ2FuYWRhIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fRVRTSSwgMSwgMTMsICJFdXJvcGUiIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9TUEFJTiwgMTAsIDExLCAiU3BhaW4iIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9GUkFOQ0UsIDEwLCAxMywgIkZyYW5jZSIgfSwgCisJCSAgICAgIHsgUkVHX0RPTUFJTl9NS0ssIDE0LCAxNCwgIk1LSyIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX01LSzEsIDEsIDE0LCAiTUtLMSIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX0lTUkFFTCwgMywgOSwgIklzcmFlbCJ9IH07CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3dwYV9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOworc3RhdGljIGludCBhdG1lbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGVzdCwgdW5zaWduZWQgY2hhciAqc3JjLCB1MTYgbGVuKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2NvcHlfdG9faG9zdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1MTYgc3JjLCB1MTYgbGVuKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9nY3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG1hc2spOworc3RhdGljIHZvaWQgYXRtZWxfY2xlYXJfZ2NyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBtYXNrKTsKK3N0YXRpYyBpbnQgYXRtZWxfbG9ja19tYWMoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOworc3RhdGljIHZvaWQgYXRtZWxfd21lbTMyKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zLCB1MzIgZGF0YSk7CitzdGF0aWMgdm9pZCBhdG1lbF9jb21tYW5kX2lycShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgaW50IGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjaGFubmVsKTsKK3N0YXRpYyB2b2lkIGF0bWVsX21hbmFnZW1lbnRfZnJhbWUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLCAKKwkJCQkgICB1MTYgZnJhbWVfbGVuLCB1OCByc3NpKTsKK3N0YXRpYyB2b2lkIGF0bWVsX21hbmFnZW1lbnRfdGltZXIodV9sb25nIGEpOworc3RhdGljIHZvaWQgYXRtZWxfc2VuZF9jb21tYW5kKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY29tbWFuZCwgdm9pZCAqY21kLCBpbnQgY21kX3NpemUpOworc3RhdGljIGludCBhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorCQkJCQkgICAgdTggKmJvZHksIGludCBib2R5X2xlbik7CisKK3N0YXRpYyB1OCBhdG1lbF9nZXRfbWliOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgpOworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWIxNihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHUxNiBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2dldF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NjYW4oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBzcGVjaWZpY19zc2lkKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2pvaW5fYnNzKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgYnNzX2luZGV4KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3Ntb290aF9xdWFsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3dyaXRlQVIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRhdGEpOworc3RhdGljIGludCBwcm9iZV9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByZXNldF9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2VudGVyX3N0YXRlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgbmV3X3N0YXRlKTsKK2ludCBhdG1lbF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfaGkoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIHByaXYtPmhvc3RfaW5mb19iYXNlICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF9jbyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IG9mZnNldCkKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLmNvbW1hbmRfcG9zICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF9yeChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IG9mZnNldCwgdTE2ICBkZXNjKQoreworCXJldHVybiBwcml2LT5ob3N0X2luZm8ucnhfZGVzY19wb3MgKyAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqIGRlc2MpICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF90eChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IG9mZnNldCwgdTE2ICBkZXNjKQoreworCXJldHVybiBwcml2LT5ob3N0X2luZm8udHhfZGVzY19wb3MgKyAoc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIGRlc2MpICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHU4IGF0bWVsX3JlYWQ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF93cml0ZTgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9mZnNldCwgdTggZGF0YSkKK3sKKwlvdXRiKGRhdGEsIGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfcmVhZDE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF93cml0ZTE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBkYXRhKQoreworCW91dHcoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGF0bWVsX3JtZW04KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zKQoreworCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlyZXR1cm4gYXRtZWxfcmVhZDgocHJpdi0+ZGV2LCBEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF93bWVtOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTE2IGRhdGEpCit7CisJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCWF0bWVsX3dyaXRlOChwcml2LT5kZXYsIERSLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfcm1lbTE2KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zKQoreworICAgICAgIAlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJcmV0dXJuIGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIERSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX3dtZW0xNihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTE2IGRhdGEpCit7CisgICAgICAgCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgRFIsIGRhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIGF0bWVsX2hhbmRsZXJfZGVmOworCitzdGF0aWMgdm9pZCB0eF9kb25lX2lycShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IAorCSAgICAgYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpID09IFRYX0RPTkUgJiYKKwkJICAgICBpIDwgcHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfY291bnQ7CisJICAgICBpKyspIHsKKwkJCisJCXU4IHN0YXR1cyA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU1RBVFVTX09GRlNFVCwgcHJpdi0+dHhfZGVzY19oZWFkKSk7CisJCXUxNiBtc2R1X3NpemUgPSBhdG1lbF9ybWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19TSVpFX09GRlNFVCwgcHJpdi0+dHhfZGVzY19oZWFkKSk7CisJCXU4IHR5cGUgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1BBQ0tFVF9UWVBFX09GRlNFVCwgcHJpdi0+dHhfZGVzY19oZWFkKSk7CisKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCksIDApOworCisJCXByaXYtPnR4X2ZyZWVfbWVtICs9IG1zZHVfc2l6ZTsKKwkJcHJpdi0+dHhfZGVzY19mcmVlKys7CisKKwkJaWYgKHByaXYtPnR4X2J1ZmZfaGVhZCArIG1zZHVfc2l6ZSA+IChwcml2LT5ob3N0X2luZm8udHhfYnVmZl9wb3MgKyBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9zaXplKSkKKwkJCXByaXYtPnR4X2J1ZmZfaGVhZCA9IDA7CisJCWVsc2UKKwkJCXByaXYtPnR4X2J1ZmZfaGVhZCArPSBtc2R1X3NpemU7CisJCQkKKwkJaWYgKHByaXYtPnR4X2Rlc2NfaGVhZCA8IChwcml2LT5ob3N0X2luZm8udHhfZGVzY19jb3VudCAtIDEpKQorCQkJcHJpdi0+dHhfZGVzY19oZWFkKysgOwkJCQkJCisJCWVsc2UKKwkJCXByaXYtPnR4X2Rlc2NfaGVhZCA9IDA7CisJCQorCQlpZiAodHlwZSA9PSBUWF9QQUNLRVRfVFlQRV9EQVRBKSB7CisJCQlpZiAoc3RhdHVzID09IFRYX1NUQVRVU19TVUNDRVNTKQorCQkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWVsc2UgCisJCQkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MTYgZmluZF90eF9idWZmKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgbGVuKQoreworCXUxNiBib3R0b21fZnJlZSA9IHByaXYtPmhvc3RfaW5mby50eF9idWZmX3NpemUgLSBwcml2LT50eF9idWZmX3RhaWw7CisKKwlpZiAocHJpdi0+dHhfZGVzY19mcmVlID09IDMgfHwgcHJpdi0+dHhfZnJlZV9tZW0gPCBsZW4pIAorCQlyZXR1cm4gMDsKKwkKKwlpZiAoYm90dG9tX2ZyZWUgPj0gbGVuKQorCQlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfcG9zICsgcHJpdi0+dHhfYnVmZl90YWlsOworCQorCWlmIChwcml2LT50eF9mcmVlX21lbSAtIGJvdHRvbV9mcmVlID49IGxlbikgeworCQlwcml2LT50eF9idWZmX3RhaWwgPSAwOworCQlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfcG9zOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHhfdXBkYXRlX2Rlc2NyaXB0b3Ioc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBpc19iY2FzdCwgdTE2IGxlbiwgdTE2IGJ1ZmYsIHU4IHR5cGUpCit7CisJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUE9TX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgYnVmZik7CisJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU0laRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIGxlbik7CisJaWYgKCFwcml2LT51c2Vfd3BhKQorCQlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19IT1NUX0xFTkdUSF9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIGxlbik7CisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QQUNLRVRfVFlQRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIHR5cGUpOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUkFURV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIHByaXYtPnR4X3JhdGUpOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUkVUUllfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCAwKTsKKwlpZiAocHJpdi0+dXNlX3dwYSkgeworCQlpbnQgY2lwaGVyX3R5cGUsIGNpcGhlcl9sZW5ndGg7CisJCWlmIChpc19iY2FzdCkgeworCQkJY2lwaGVyX3R5cGUgPSBwcml2LT5ncm91cF9jaXBoZXJfc3VpdGU7CisJCQlpZiAoY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF82NCB8fCAKKwkJCSAgICBjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzEyOCApCisJCQkJY2lwaGVyX2xlbmd0aCA9IDg7CisJCQllbHNlIGlmIChjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfVEtJUCkKKwkJCQljaXBoZXJfbGVuZ3RoID0gMTI7CisJCQllbHNlIGlmIChwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF82NCB8fAorCQkJCSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF8xMjgpIHsKKwkJCQljaXBoZXJfdHlwZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwkJCQljaXBoZXJfbGVuZ3RoID0gODsKKwkJCX0gZWxzZSB7CisJCQkJY2lwaGVyX3R5cGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwkJCQljaXBoZXJfbGVuZ3RoID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNpcGhlcl90eXBlID0gcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlOworCQkJaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwgCisJCQkgICAgY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF8xMjggKQorCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJZWxzZSBpZiAoY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1RLSVApCisJCQkJY2lwaGVyX2xlbmd0aCA9IDEyOworCQkJZWxzZSBpZiAocHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwKKwkJCQkgcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfMTI4KSB7CisJCQkJY2lwaGVyX3R5cGUgPSBwcml2LT5ncm91cF9jaXBoZXJfc3VpdGU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDg7CisJCQl9IGVsc2UgeworCQkJCWNpcGhlcl90eXBlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDA7CisJCQl9CisJCX0KKwkJCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfQ0lQSEVSX1RZUEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLAorCQkJICAgIGNpcGhlcl90eXBlKTsJCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfQ0lQSEVSX0xFTkdUSF9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksCisJCQkgICAgY2lwaGVyX2xlbmd0aCk7CisJfQorCWF0bWVsX3dtZW0zMihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX05FWFRfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCAweDgwMDAwMDAwTCk7CisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIFRYX0ZJUk1fT1dOKTsKKwlpZiAocHJpdi0+dHhfZGVzY19wcmV2aW91cyAhPSBwcml2LT50eF9kZXNjX3RhaWwpCisJCWF0bWVsX3dtZW0zMihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX05FWFRfT0ZGU0VULCBwcml2LT50eF9kZXNjX3ByZXZpb3VzKSwgMCk7CisJcHJpdi0+dHhfZGVzY19wcmV2aW91cyA9IHByaXYtPnR4X2Rlc2NfdGFpbDsKKwlpZiAocHJpdi0+dHhfZGVzY190YWlsIDwgKHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50IC0xICkpCisJCXByaXYtPnR4X2Rlc2NfdGFpbCsrOworCWVsc2UKKwkJcHJpdi0+dHhfZGVzY190YWlsID0gMDsKKwlwcml2LT50eF9kZXNjX2ZyZWUtLTsKKwlwcml2LT50eF9mcmVlX21lbSAtPSBsZW47CisKK30KKworc3RhdGljIGludCBzdGFydF90eCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBidWZmLCBmcmFtZV9jdGwsIGxlbiA9IChFVEhfWkxFTiA8IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJdTggU05BUF9SRkMxMDI0WzZdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworIAorCWlmIChwcml2LT5jYXJkICYmIHByaXYtPnByZXNlbnRfY2FsbGJhY2sgJiYgCisJICAgICEoKnByaXYtPnByZXNlbnRfY2FsbGJhY2spKHByaXYtPmNhcmQpKSB7CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSAhPSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBmaXJzdCBlbnN1cmUgdGhlIHRpbWVyIGZ1bmMgY2Fubm90IHJ1biAqLworCXNwaW5fbG9ja19iaCgmcHJpdi0+dGltZXJsb2NrKTsgCisJLyogdGhlbiBzdG9wIHRoZSBoYXJkd2FyZSBJU1IgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOyAKKwkvKiBuYiBkb2luZyB0aGUgYWJvdmUgaW4gdGhlIG9wcG9zaXRlIG9yZGVyIHdpbGwgZGVhZGxvY2sgKi8KKwkKKwkvKiBUaGUgV2lyZWxlc3MgSGVhZGVyIGlzIDMwIGJ5dGVzLiBJbiB0aGUgRXRoZXJuZXQgcGFja2V0IHdlICJjdXQiIHRoZQorCSAgIDEyIGZpcnN0IGJ5dGVzIChjb250YWluaW5nIERBL1NBKSBhbmQgcHV0IHRoZW0gaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBvZgorCSAgIHRoZSBXaXJlbGVzcyBIZWFkZXIuIFRodXMgdGhlIHBhY2tldCBsZW5ndGggaXMgdGhlbiB0aGUgaW5pdGlhbCArIDE4ICgrMzAtMTIpICovCisJCisJaWYgKCEoYnVmZiA9IGZpbmRfdHhfYnVmZihwcml2LCBsZW4gKyAxOCkpKSB7CisJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19iaCgmcHJpdi0+dGltZXJsb2NrKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJCisJZnJhbWVfY3RsID0gSUVFRTgwMl8xMV9GVFlQRV9EQVRBOworCWhlYWRlci5kdXJhdGlvbl9pZCA9IDA7CisJaGVhZGVyLnNlcV9jdGwgPSAwOworCWlmIChwcml2LT53ZXBfaXNfb24pCisJCWZyYW1lX2N0bCB8PSBJRUVFODAyXzExX0ZDVExfV0VQOworCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBza2ItPmRhdGEsIDYpOworCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBwcml2LT5CU1NJRCwgNik7CisJfSBlbHNlIHsKKwkJZnJhbWVfY3RsIHw9IElFRUU4MDJfMTFfRkNUTF9UT0RTOworCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIGRldi0+ZGV2X2FkZHIsIDYpOworCQltZW1jcHkoJmhlYWRlci5hZGRyMywgc2tiLT5kYXRhLCA2KTsKKwl9CisJCisJaWYgKHByaXYtPnVzZV93cGEpCisJCW1lbWNweSgmaGVhZGVyLmFkZHI0LCBTTkFQX1JGQzEwMjQsIDYpOworCisJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZyYW1lX2N0bCk7CisJLyogQ29weSB0aGUgd2lyZWxlc3MgaGVhZGVyIGludG8gdGhlIGNhcmQgKi8KKwlhdG1lbF9jb3B5X3RvX2NhcmQoZGV2LCBidWZmLCAodW5zaWduZWQgY2hhciAqKSZoZWFkZXIsIERBVEFfRlJBTUVfV1NfSEVBREVSX1NJWkUpOworCS8qIENvcHkgdGhlIHBhY2tldCBzYW5zIGl0cyA4MDIuMyBoZWFkZXIgYWRkcmVzc2VzIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCAqLworCWF0bWVsX2NvcHlfdG9fY2FyZChkZXYsIGJ1ZmYgKyBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFLCBza2ItPmRhdGEgKyAxMiwgbGVuIC0gMTIpOworCXByaXYtPnR4X2J1ZmZfdGFpbCArPSBsZW4gLSAxMiArIERBVEFfRlJBTUVfV1NfSEVBREVSX1NJWkU7CisJCisJLyogbG93IGJpdCBvZiBmaXJzdCBieXRlIG9mIGRlc3RpbmF0aW9uIHRlbGxzIHVzIGlmIGJyb2FkY2FzdCAqLworCXR4X3VwZGF0ZV9kZXNjcmlwdG9yKHByaXYsICooc2tiLT5kYXRhKSAmIDB4MDEsIGxlbiArIDE4LCBidWZmLCBUWF9QQUNLRVRfVFlQRV9EQVRBKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50aW1lcmxvY2spOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIAorCQkJCQkgICAgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsCisJCQkJCSAgICB1OCAqYm9keSwgaW50IGJvZHlfbGVuKQoreworCXUxNiBidWZmOworCWludCBsZW4gPSAgTUdNVF9GUkFNRV9CT0RZX09GRlNFVCArIGJvZHlfbGVuOworCQorCWlmICghKGJ1ZmYgPSBmaW5kX3R4X2J1ZmYocHJpdiwgbGVuKSkpIAorCQlyZXR1cm47CisKKwlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCBidWZmLCAodTggKiloZWFkZXIsIE1HTVRfRlJBTUVfQk9EWV9PRkZTRVQpOworCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIGJ1ZmYgKyBNR01UX0ZSQU1FX0JPRFlfT0ZGU0VULCBib2R5LCBib2R5X2xlbik7CisJcHJpdi0+dHhfYnVmZl90YWlsICs9IGxlbjsKKwl0eF91cGRhdGVfZGVzY3JpcHRvcihwcml2LCBoZWFkZXItPmFkZHIxWzBdICYgMHgwMSwgbGVuLCBidWZmLCBUWF9QQUNLRVRfVFlQRV9NR01UKTsKK30KKwkKK3N0YXRpYyB2b2lkIGZhc3RfcnhfcGF0aChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkJIHUxNiBtc2R1X3NpemUsIHUxNiByeF9wYWNrZXRfbG9jLCB1MzIgY3JjKQoreworCS8qIGZhc3QgcGF0aDogdW5mcmFnbWVudGVkIHBhY2tldCBjb3B5IGRpcmVjdGx5IGludG8gc2tidWYgKi8KKwl1OCBtYWM0WzZdOyAKKwlzdHJ1Y3Qgc2tfYnVmZiAJKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpza2JwOworCQorCS8qIGdldCB0aGUgZmluYWwsIG1hYyA0IGhlYWRlciBmaWVsZCwgdGhpcyB0ZWxscyB1cyBlbmNhcHN1bGF0aW9uICovCisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgbWFjNCwgcnhfcGFja2V0X2xvYyArIDI0LCA2KTsKKwltc2R1X3NpemUgLT0gNjsKKwkKKwlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCWNyYyA9IGNyYzMyX2xlKGNyYywgbWFjNCwgNik7CisJCW1zZHVfc2l6ZSAtPSA0OworCX0KKwkKKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKG1zZHVfc2l6ZSArIDE0KSkpIHsKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwlza2JwID0gc2tiX3B1dChza2IsIG1zZHVfc2l6ZSArIDEyKTsKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCBza2JwICsgMTIsIHJ4X3BhY2tldF9sb2MgKyAzMCwgbXNkdV9zaXplKTsKKwkKKwlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCXUzMiBuZXRjcmM7CisJCWNyYyA9IGNyYzMyX2xlKGNyYywgc2ticCArIDEyLCBtc2R1X3NpemUpOworCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodm9pZCAqKSZuZXRjcmMsIHJ4X3BhY2tldF9sb2MgKyAzMCArIG1zZHVfc2l6ZSwgNCk7CisJCWlmICgoY3JjIF4gMHhmZmZmZmZmZikgIT0gbmV0Y3JjKSB7CisJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJbWVtY3B5KHNrYnAsIGhlYWRlci0+YWRkcjEsIDYpOyAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMpIAorCQltZW1jcHkoJnNrYnBbNl0sIGhlYWRlci0+YWRkcjMsIDYpOworCWVsc2UKKwkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIyLCA2KTsgLyogc291cmNlIGFkZHJlc3MgKi8KKwkKKwlwcml2LT5kZXYtPmxhc3Rfcng9amlmZmllczsKKwlza2ItPmRldiA9IHByaXYtPmRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2LT5kZXYpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJCisJbmV0aWZfcngoc2tiKTsKKwlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSAxMiArIG1zZHVfc2l6ZTsKKwlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Cit9CisKKy8qIFRlc3QgdG8gc2VlIGlmIHRoZSBwYWNrZXQgaW4gY2FyZCBtZW1vcnkgYXQgcGFja2V0X2xvYyBoYXMgYSB2YWxpZCBDUkMKKyAgIEl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgdGhpcyBpcyBzbG93OiBpdCBpcyBvbmx5IHVzZWQgdG8gcHJvYmxlIHRoZSBmaXJzdCBmZXcgcGFja2V0cy4gKi8KK3N0YXRpYyBpbnQgcHJvYmVfY3JjKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcGFja2V0X2xvYywgdTE2IG1zZHVfc2l6ZSkKK3sKKwlpbnQgaSA9IG1zZHVfc2l6ZSAtIDQ7CisJdTMyIG5ldGNyYywgY3JjID0gMHhmZmZmZmZmZjsKKworCWlmIChtc2R1X3NpemUgPCA0KQorCQlyZXR1cm4gMDsKKworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcGFja2V0X2xvYyArIGksIDQpOworCQorCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwYWNrZXRfbG9jKTsKKwl3aGlsZSAoaS0tKSB7CisJCXU4IG9jdGV0ID0gYXRtZWxfcmVhZDgocHJpdi0+ZGV2LCBEUik7CisJCWNyYyA9IGNyYzMyX2xlKGNyYywgJm9jdGV0LCAxKTsKKwl9CisKKwlyZXR1cm4gKGNyYyBeIDB4ZmZmZmZmZmYpID09IG5ldGNyYzsKK30KKworc3RhdGljIHZvaWQgZnJhZ19yeF9wYXRoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCisJCQkgdTE2IG1zZHVfc2l6ZSwgdTE2IHJ4X3BhY2tldF9sb2MsIHUzMiBjcmMsIHUxNiBzZXFfbm8sIHU4IGZyYWdfbm8sIGludCBtb3JlX2ZyYWdzKQoreworCXU4IG1hYzRbNl07IAorCXU4IHNvdXJjZVs2XTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMpIAorCQltZW1jcHkoc291cmNlLCBoZWFkZXItPmFkZHIzLCA2KTsKKwllbHNlCisJCW1lbWNweShzb3VyY2UsIGhlYWRlci0+YWRkcjIsIDYpOyAKKwkKKwlyeF9wYWNrZXRfbG9jICs9IDI0OyAvKiBza2lwIGhlYWRlciAqLworCQorCWlmIChwcml2LT5kb19yeF9jcmMpCisJCW1zZHVfc2l6ZSAtPSA0OworCisJaWYgKGZyYWdfbm8gPT0gMCkgeyAvKiBmaXJzdCBmcmFnbWVudCAqLworCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCBtYWM0LCByeF9wYWNrZXRfbG9jLCA2KTsKKwkJbXNkdV9zaXplIC09IDY7CisJCXJ4X3BhY2tldF9sb2MgKz0gNjsKKworCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSAKKwkJCWNyYyA9IGNyYzMyX2xlKGNyYywgbWFjNCwgNik7CisJICAgICAgIAorCQlwcml2LT5mcmFnX3NlcSA9IHNlcV9ubzsKKwkJcHJpdi0+ZnJhZ19ubyA9IDE7CisJCXByaXYtPmZyYWdfbGVuID0gbXNkdV9zaXplOworCQltZW1jcHkocHJpdi0+ZnJhZ19zb3VyY2UsIHNvdXJjZSwgNik7IAorCQltZW1jcHkoJnByaXYtPnJ4X2J1Zls2XSwgc291cmNlLCA2KTsKKwkJbWVtY3B5KHByaXYtPnJ4X2J1ZiwgaGVhZGVyLT5hZGRyMSwgNik7CisJCQkJCisJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICZwcml2LT5yeF9idWZbMTJdLCByeF9wYWNrZXRfbG9jLCBtc2R1X3NpemUpOworCisJCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJCXUzMiBuZXRjcmM7CisJCQljcmMgPSBjcmMzMl9sZShjcmMsICZwcml2LT5yeF9idWZbMTJdLCBtc2R1X3NpemUpOworCQkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCByeF9wYWNrZXRfbG9jICsgbXNkdV9zaXplLCA0KTsKKwkJCWlmICgoY3JjIF4gMHhmZmZmZmZmZikgIT0gbmV0Y3JjKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgNik7CisJCQl9CisJCX0KKwkJCisJfSBlbHNlIGlmIChwcml2LT5mcmFnX25vID09IGZyYWdfbm8gJiYKKwkJICAgcHJpdi0+ZnJhZ19zZXEgPT0gc2VxX25vICYmCisJCSAgIG1lbWNtcChwcml2LT5mcmFnX3NvdXJjZSwgc291cmNlLCA2KSA9PSAwKSB7CisJCQorCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAmcHJpdi0+cnhfYnVmWzEyICsgcHJpdi0+ZnJhZ19sZW5dLCAKKwkJCQkgICByeF9wYWNrZXRfbG9jLCBtc2R1X3NpemUpOworCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQl1MzIgbmV0Y3JjOworCQkJY3JjID0gY3JjMzJfbGUoY3JjLCAKKwkJCQkgICAgICAgJnByaXYtPnJ4X2J1ZlsxMiArIHByaXYtPmZyYWdfbGVuXSwgCisJCQkJICAgICAgIG1zZHVfc2l6ZSk7CisJCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodm9pZCAqKSZuZXRjcmMsIHJ4X3BhY2tldF9sb2MgKyBtc2R1X3NpemUsIDQpOworCQkJaWYgKChjcmMgXiAweGZmZmZmZmZmKSAhPSBuZXRjcmMpIHsKKwkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCA2KTsKKwkJCQltb3JlX2ZyYWdzID0gMTsgLyogZG9uJ3Qgc2VuZCBicm9rZW4gYXNzZW1ibHkgKi8KKwkJCX0KKwkJfQorCQkKKwkJcHJpdi0+ZnJhZ19sZW4gKz0gbXNkdV9zaXplOworCQlwcml2LT5mcmFnX25vKys7CisKKwkJaWYgKCFtb3JlX2ZyYWdzKSB7IC8qIGxhc3Qgb25lICovCisJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihwcml2LT5mcmFnX2xlbiArIDE0KSkpIHsKKwkJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9IGVsc2UgeworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwcml2LT5mcmFnX2xlbiArIDEyKSwgCisJCQkJICAgICAgIHByaXYtPnJ4X2J1ZiwKKwkJCQkgICAgICAgcHJpdi0+ZnJhZ19sZW4gKyAxMik7CisJCQkJcHJpdi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlza2ItPmRldiA9IHByaXYtPmRldjsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2LT5kZXYpOworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJCisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwcml2LT5mcmFnX2xlbiArIDEyOworCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCX0KKwkJfQorCQkKKwl9IGVsc2UKKwkJcHJpdi0+d3N0YXRzLmRpc2NhcmQuZnJhZ21lbnQrKzsKK30KKwkJCitzdGF0aWMgdm9pZCByeF9kb25lX2lycShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCQorCWZvciAoaSA9IDA7IAorCSAgICAgYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpID09IFJYX0RFU0NfRkxBR19WQUxJRCAmJgorCQkgICAgIGkgPCBwcml2LT5ob3N0X2luZm8ucnhfZGVzY19jb3VudDsKKwkgICAgIGkrKykgeworCQkJCQorCQl1MTYgbXNkdV9zaXplLCByeF9wYWNrZXRfbG9jLCBmcmFtZV9jdGwsIHNlcV9jb250cm9sOworCQl1OCBzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX1NUQVRVU19PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpOworCQl1MzIgY3JjID0gMHhmZmZmZmZmZjsKKwkJCisJCWlmIChzdGF0dXMgIT0gUlhfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChzdGF0dXMgPT0gMHhjMSkgLyogZGV0ZXJtaW5lZCBieSBleHBlcmltZW50ICovCisJCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQubndpZCsrOworCQkJZWxzZQorCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCW1zZHVfc2l6ZSA9IGF0bWVsX3JtZW0xNihwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX01TRFVfU0laRV9PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpOworCQlyeF9wYWNrZXRfbG9jID0gYXRtZWxfcm1lbTE2KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfTVNEVV9QT1NfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKTsKKwkJCisJCWlmIChtc2R1X3NpemUgPCAzMCkgeworCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7IAorCQkJZ290byBuZXh0OworCQl9CisJCQorCQkvKiBHZXQgaGVhZGVyIGFzIGZhciBhcyBlbmQgb2Ygc2VxX2N0bCAqLworCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAoY2hhciAqKSZoZWFkZXIsIHJ4X3BhY2tldF9sb2MsIDI0KTsKKwkJZnJhbWVfY3RsID0gbGUxNl90b19jcHUoaGVhZGVyLmZyYW1lX2N0bCk7CisJCXNlcV9jb250cm9sID0gbGUxNl90b19jcHUoaGVhZGVyLnNlcV9jdGwpOworCisJCS8qIHByb2JlIGZvciBDUkMgdXNlIGhlcmUgaWYgbmVlZGVkICBvbmNlIGZpdmUgcGFja2V0cyBoYXZlIGFycml2ZWQgd2l0aAorCQkgICB0aGUgc2FtZSBjcmMgc3RhdHVzLCB3ZSBhc3N1bWUgd2Uga25vdyB3aGF0J3MgaGFwcGVuaW5nIGFuZCBzdG9wIHByb2JpbmcgKi8KKwkJaWYgKHByaXYtPnByb2JlX2NyYykgeworCQkJaWYgKCFwcml2LT53ZXBfaXNfb24gfHwgIShmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfV0VQKSkgeworCQkJCXByaXYtPmRvX3J4X2NyYyA9IHByb2JlX2NyYyhwcml2LCByeF9wYWNrZXRfbG9jLCBtc2R1X3NpemUpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5kb19yeF9jcmMgPSBwcm9iZV9jcmMocHJpdiwgcnhfcGFja2V0X2xvYyArIDI0LCBtc2R1X3NpemUgLSAyNCk7CisJCQl9CisJCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQkJaWYgKHByaXYtPmNyY19va19jbnQrKyA+IDUpCisJCQkJCXByaXYtPnByb2JlX2NyYyA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChwcml2LT5jcmNfa29fY250KysgPiA1KQorCQkJCQlwcml2LT5wcm9iZV9jcmMgPSAwOworCQkJfQorCQl9CisJCSAgICAKKwkJLyogZG9uJ3QgQ1JDIGhlYWRlciB3aGVuIFdFUCBpbiB1c2UgKi8KKwkJaWYgKHByaXYtPmRvX3J4X2NyYyAmJiAoIXByaXYtPndlcF9pc19vbiB8fCAhKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9XRVApKSkgeworCQkJY3JjID0gY3JjMzJfbGUoMHhmZmZmZmZmZiwgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLCAyNCk7CisJCX0KKwkJbXNkdV9zaXplIC09IDI0OyAvKiBoZWFkZXIgKi8KKworCQlpZiAoKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMl8xMV9GVFlQRV9EQVRBKSB7IAorCQkJCisJCQlpbnQgbW9yZV9mcmFnbWVudHMgPSBmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfTU9SRUZSQUdTOworCQkJdTggcGFja2V0X2ZyYWdtZW50X25vID0gc2VxX2NvbnRyb2wgJiBJRUVFODAyXzExX1NDVExfRlJBRzsKKwkJCXUxNiBwYWNrZXRfc2VxdWVuY2Vfbm8gPSAoc2VxX2NvbnRyb2wgJiBJRUVFODAyXzExX1NDVExfU0VRKSA+PiA0OworCQkJCisJCQlpZiAoIW1vcmVfZnJhZ21lbnRzICYmIHBhY2tldF9mcmFnbWVudF9ubyA9PSAwICkgeworCQkJCWZhc3RfcnhfcGF0aChwcml2LCAmaGVhZGVyLCBtc2R1X3NpemUsIHJ4X3BhY2tldF9sb2MsIGNyYyk7CisJCQl9IGVsc2UgeworCQkJCWZyYWdfcnhfcGF0aChwcml2LCAmaGVhZGVyLCBtc2R1X3NpemUsIHJ4X3BhY2tldF9sb2MsIGNyYywKKwkJCQkJICAgICBwYWNrZXRfc2VxdWVuY2Vfbm8sIHBhY2tldF9mcmFnbWVudF9ubywgbW9yZV9mcmFnbWVudHMpOworCQkJfQorCQl9CisJCQorCQlpZiAoKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMl8xMV9GVFlQRV9NR01UKSB7CisJCQkvKiBjb3B5IHJlc3Qgb2YgcGFja2V0IGludG8gYnVmZmVyICovCisJCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodW5zaWduZWQgY2hhciAqKSZwcml2LT5yeF9idWYsIHJ4X3BhY2tldF9sb2MgKyAyNCwgbXNkdV9zaXplKTsKKwkJCQorCQkJLyogd2UgdXNlIHRoZSBzYW1lIGJ1ZmZlciBmb3IgZnJhZyByZWFzc2VtYmx5IGFuZCBjb250cm9sIHBhY2tldHMgKi8KKwkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgNik7CisJCQkKKwkJCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJCQkvKiBsYXN0IDQgb2N0ZXRzIGlzIGNyYyAqLworCQkJCW1zZHVfc2l6ZSAtPSA0OworCQkJCWNyYyA9IGNyYzMyX2xlKGNyYywgKHVuc2lnbmVkIGNoYXIgKikmcHJpdi0+cnhfYnVmLCBtc2R1X3NpemUpOworCQkJCWlmICgoY3JjIF4gMHhmZmZmZmZmZikgIT0gKCooKHUzMiAqKSZwcml2LT5yeF9idWZbbXNkdV9zaXplXSkpKSB7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKworCQkJYXRtZWxfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCBtc2R1X3NpemUsCisJCQkJCSAgICAgICBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX1JTU0lfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKSk7CisJCX0gCisKKwluZXh0OgorCQkvKiByZWxlYXNlIGRlc2NyaXB0b3IgKi8KKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCksIFJYX0RFU0NfRkxBR19DT05TVU1FRCk7ICAKKwkJCisJCWlmIChwcml2LT5yeF9kZXNjX2hlYWQgPCAocHJpdi0+aG9zdF9pbmZvLnJ4X2Rlc2NfY291bnQgLSAxKSkKKwkJCXByaXYtPnJ4X2Rlc2NfaGVhZCsrOwkJCQkJCisJCWVsc2UKKwkJCXByaXYtPnJ4X2Rlc2NfaGVhZCA9IDA7CisJfQorfQkKKworc3RhdGljIGlycXJldHVybl90IHNlcnZpY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGlzcjsKKwlpbnQgaSA9IC0xOworCXN0YXRpYyB1OCBpcnFfb3JkZXJbXSA9IHsgCisJCUlTUl9PVVRfT0ZfUkFOR0UsCisJCUlTUl9SeENPTVBMRVRFLAorCQlJU1JfVHhDT01QTEVURSwKKwkJSVNSX1J4RlJBTUVMT1NULAorCQlJU1JfRkFUQUxfRVJST1IsCisJCUlTUl9DT01NQU5EX0NPTVBMRVRFLAorCQlJU1JfSUJTU19NRVJHRSwKKwkJSVNSX0dFTkVSSUNfSVJRCisJfTsKKwkJCisKKwlpZiAocHJpdi0+Y2FyZCAmJiBwcml2LT5wcmVzZW50X2NhbGxiYWNrICYmIAorCSAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogSW4gdGhpcyBzdGF0ZSB1cHBlci1sZXZlbCBjb2RlIGFzc3VtZXMgaXQgY2FuIG1lc3Mgd2l0aAorCSAgIHRoZSBjYXJkIHVuaGFtcGVyZWQgYnkgaW50ZXJydXB0cyB3aGljaCBtYXkgY2hhbmdlIHJlZ2lzdGVyIHN0YXRlLgorCSAgIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgY2FyZCBzaG91bGRuJ3QgZ2VuZXJhdGUgaW50ZXJydXB0cworCSAgIHRoZSBpbnR1cnJ1cHQgbGluZSBtYXkgYmUgc2hhcmVkLiBUaGlzIGFsbG93cyBjYXJkIHNldHVwIAorCSAgIHRvIGdvIG9uIHdpdGhvdXQgZGlzYWJsaW5nIGludGVycnVwdHMgZm9yIGEgbG9uZyB0aW1lLiAqLworCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfRE9XTikKKwkJcmV0dXJuIElSUV9OT05FOworICAgICAJCisJYXRtZWxfY2xlYXJfZ2NyKGRldiwgR0NSX0VOSU5UKTsgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwl3aGlsZSAoMSkgeworCQlpZiAoIWF0bWVsX2xvY2tfbWFjKHByaXYpKSB7CisJCQkvKiBmYWlsZWQgdG8gY29udGFjdCBjYXJkICovCisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCB0byBjb250YWN0IE1BQy5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJCisJCWlzciA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0lOVF9TVEFUVVNfT0ZGU0VUKSk7CisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDApOworCQkKKwkJaWYgKCFpc3IpIHsKKwkJCWF0bWVsX3NldF9nY3IoZGV2LCBHQ1JfRU5JTlQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQkJcmV0dXJuIGkgPT0gLTEgPyBJUlFfTk9ORSA6IElSUV9IQU5ETEVEOworCQl9CisJCQorCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX0FDS0lOVCk7IC8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCQkKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihpcnFfb3JkZXIpL3NpemVvZih1OCk7IGkrKykKKwkJCWlmIChpc3IgJiBpcnFfb3JkZXJbaV0pCisJCQkJYnJlYWs7CisJCQorCQlpZiAoIWF0bWVsX2xvY2tfbWFjKHByaXYpKSB7CisJCQkvKiBmYWlsZWQgdG8gY29udGFjdCBjYXJkICovCisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCB0byBjb250YWN0IE1BQy5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJCisJCWlzciA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0lOVF9TVEFUVVNfT0ZGU0VUKSk7CisJCWlzciBePSBpcnFfb3JkZXJbaV07CisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0lOVF9TVEFUVVNfT0ZGU0VUKSwgaXNyKTsKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUKSwgMCk7CisJCQorCQlzd2l0Y2ggKGlycV9vcmRlcltpXSkgeworCQkJCisJCWNhc2UgSVNSX09VVF9PRl9SQU5HRTogCisJCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJiAKKwkJCSAgICBwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElTUl9SeEZSQU1FTE9TVDoKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLm1pc2MrKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElTUl9SeENPTVBMRVRFOgorCQkJcnhfZG9uZV9pcnEocHJpdik7IAorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBJU1JfVHhDT01QTEVURToKKwkJCXR4X2RvbmVfaXJxKHByaXYpOyAKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSVNSX0ZBVEFMX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAqKiogRkFUQUwgZXJyb3IgaW50ZXJydXB0ICoqKlxuIiwgZGV2LT5uYW1lKTsKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIElTUl9DT01NQU5EX0NPTVBMRVRFOiAKKwkJCWF0bWVsX2NvbW1hbmRfaXJxKHByaXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJU1JfSUJTU19NRVJHRToKKwkJCWF0bWVsX2dldF9taWIocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9DVVJfQlNTSURfUE9TLCAKKwkJCQkgICAgICBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQkJLyogVGhlIFdQQSBzdHVmZiBjYXJlcyBhYm91dCB0aGUgY3VycmVudCBBUCBhZGRyZXNzICovCisJCQlpZiAocHJpdi0+dXNlX3dwYSkKKwkJCQlidWlsZF93cGFfbWliKHByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgSVNSX0dFTkVSSUNfSVJROgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdlbmVyaWNfaXJxIHJlY2VpdmVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQkKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0bWVsX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICphdG1lbF9nZXRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogdXBkYXRlIHRoZSBsaW5rIHF1YWxpdHkgaGVyZSBpbiBjYXNlIHdlIGFyZSBzZWVpbmcgbm8gYmVhY29ucyAKKwkgICBhdCBhbGwgdG8gZHJpdmUgdGhlIHByb2Nlc3MgKi8KKwlhdG1lbF9zbW9vdGhfcXVhbChwcml2KTsKKwkKKwlwcml2LT53c3RhdHMuc3RhdHVzID0gcHJpdi0+c3RhdGlvbl9zdGF0ZTsKKworCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlICE9IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgPSAwOworCQkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgPSAwOworCQkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IChJV19RVUFMX1FVQUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTEVWRUxfSU5WQUxJRCk7CisJCX0KKwkJcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOworCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwl9IGVsc2UgeworCQkvKiBRdWFsaXR5IGxldmVscyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpbiBhZC1ob2MgbW9kZSwKKwkJICAgYmVjYXVzZSB3ZSBjYW4gJ2hlYXInIG1vcmUgdGhhdCBvbmUgcmVtb3RlIHN0YXRpb24uICovCisJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgPSAwOworCQlwcml2LT53c3RhdHMucXVhbC5sZXZlbAk9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlCT0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElECisJCQkJCXwgSVdfUVVBTF9MRVZFTF9JTlZBTElECisJCQkJCXwgSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCQlwcml2LT53c3RhdHMubWlzcy5iZWFjb24gPSAwOworCX0KKwkKKwlyZXR1cm4gKCZwcml2LT53c3RhdHMpOworfQorCitzdGF0aWMgaW50IGF0bWVsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisgICAgICAgIGlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IDIzMTIpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBkZXYtPm10dSA9IG5ld19tdHU7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisgICAgICAgIAorICAgICAgICBtZW1jcHkgKGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiBhdG1lbF9vcGVuKGRldik7Cit9CisKK0VYUE9SVF9TWU1CT0woYXRtZWxfb3Blbik7CisKK2ludCBhdG1lbF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaSwgY2hhbm5lbDsKKworCS8qIGFueSBzY2hlZHVsZWQgdGltZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhbmQgbWlnaHQgc2NyZXcgdGhpbmdzIHVwLi4gKi8KKwlkZWxfdGltZXJfc3luYygmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJCisJLyogSW50ZXJydXB0cyB3aWxsIG5vdCB0b3VjaCB0aGUgY2FyZCBvbmNlIGluIHRoaXMgc3RhdGUuLi4gKi8KKwlwcml2LT5zdGF0aW9uX3N0YXRlID0gU1RBVElPTl9TVEFURV9ET1dOOworCisJaWYgKHByaXYtPm5ld19TU0lEX3NpemUpIHsKKwkJbWVtY3B5KHByaXYtPlNTSUQsIHByaXYtPm5ld19TU0lELCBwcml2LT5uZXdfU1NJRF9zaXplKTsKKwkJcHJpdi0+U1NJRF9zaXplID0gcHJpdi0+bmV3X1NTSURfc2l6ZTsKKwkJcHJpdi0+bmV3X1NTSURfc2l6ZSA9IDA7CisJfQorCXByaXYtPkJTU19saXN0X2VudHJpZXMgPSAwOworCisJcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCXByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwlwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwlwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gMHgwMDAxOworCXByaXYtPkV4cGVjdGVkQXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gMHgwMDAyOworCisJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9JRExFOworCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisKKwlpZiAoIXJlc2V0X2F0bWVsX2NhcmQoZGV2KSkgCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKHByaXYtPmNvbmZpZ19yZWdfZG9tYWluKSB7CisJCXByaXYtPnJlZ19kb21haW4gPSBwcml2LT5jb25maWdfcmVnX2RvbWFpbjsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TLCBwcml2LT5yZWdfZG9tYWluKTsKKwl9IGVsc2UgeworCQlwcml2LT5yZWdfZG9tYWluID0gYXRtZWxfZ2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKSkgeworCQkJcHJpdi0+cmVnX2RvbWFpbiA9IFJFR19ET01BSU5fTUtLMTsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmFpbGVkIHRvIGdldCByZWd1bGF0b3J5IGRvbWFpbjogYXNzdW1pbmcgTUtLMS5cbiIsIGRldi0+bmFtZSk7CisJCX0gCisJfQorCQorCWlmICgoY2hhbm5lbCA9IGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwocHJpdiwgcHJpdi0+Y2hhbm5lbCkpKQorCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKworCS8qIHRoaXMgbW92ZXMgc3RhdGlvbl9zdGF0ZSBvbi4uLi4gKi8gCisJYXRtZWxfc2Nhbihwcml2LCAxKTsJCisKKwlhdG1lbF9zZXRfZ2NyKHByaXYtPmRldiwgR0NSX0VOSU5UKTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCQorCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfRE9XTik7CisJCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY2hhbm5lbCkKK3sKKwkvKiBjaGVjayB0aGF0IGNoYW5uZWwgaXMgT0ssIGlmIHNvIHJldHVybiB6ZXJvLAorCSAgIGVsc2UgcmV0dXJuIHN1aXRhYmxlIGRlZmF1bHQgY2hhbm5lbCAqLworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CisJCQlpZiAoY2hhbm5lbCA+PSBjaGFubmVsX3RhYmxlW2ldLm1pbiAmJgorCQkJICAgIGNoYW5uZWwgPD0gY2hhbm5lbF90YWJsZVtpXS5tYXgpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIGNoYW5uZWxfdGFibGVbaV0ubWluOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfcHJvY19vdXRwdXQgKGNoYXIgKmJ1Ziwgc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisJY2hhciAqcCA9IGJ1ZjsKKwljaGFyICpzLCAqciwgKmM7CisJCisJcCArPSBzcHJpbnRmKHAsICJEcml2ZXIgdmVyc2lvbjpcdFx0JWQuJWRcbiIsIERSSVZFUl9NQUpPUiwgRFJJVkVSX01JTk9SKTsKKwkKKwlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSAhPSBTVEFUSU9OX1NUQVRFX0RPV04pIHsKKwkJcCArPSBzcHJpbnRmKHAsICJGaXJtd2FyZSB2ZXJzaW9uOlx0JWQuJWQgYnVpbGQgJWRcbkZpcm13YXJlIGxvY2F0aW9uOlx0IiwgCisJCQkgICAgIHByaXYtPmhvc3RfaW5mby5tYWpvcl92ZXJzaW9uLAorCQkJICAgICBwcml2LT5ob3N0X2luZm8ubWlub3JfdmVyc2lvbiwKKwkJCSAgICAgcHJpdi0+aG9zdF9pbmZvLmJ1aWxkX3ZlcnNpb24pOworCQkKKwkJaWYgKHByaXYtPmNhcmRfdHlwZSAhPSBDQVJEX1RZUEVfRUVQUk9NKSAKKwkJCXAgKz0gc3ByaW50ZihwLCAib24gY2FyZFxuIik7CisJCWVsc2UgaWYgKHByaXYtPmZpcm13YXJlKSAKKwkJCXAgKz0gc3ByaW50ZihwLCAiJXMgbG9hZGVkIGJ5IGhvc3RcbiIsIHByaXYtPmZpcm13YXJlX2lkKTsKKwkJZWxzZQorCQkJcCArPSBzcHJpbnRmKHAsICIlcyBsb2FkZWQgYnkgaG90cGx1Z1xuIiwgcHJpdi0+ZmlybXdhcmVfaWQpOworCQkKKwkJc3dpdGNoKHByaXYtPmNhcmRfdHlwZSkgeworCQljYXNlIENBUkRfVFlQRV9QQVJBTExFTF9GTEFTSDogYyA9ICJQYXJhbGxlbCBmbGFzaCI7IGJyZWFrOworCQljYXNlIENBUkRfVFlQRV9TUElfRkxBU0g6IGMgPSAiU1BJIGZsYXNoXG4iOyBicmVhazsKKwkJY2FzZSBDQVJEX1RZUEVfRUVQUk9NOiBjID0gIkVFUFJPTSI7IGJyZWFrOworCQlkZWZhdWx0OiBjID0gIjx1bmtub3duPiI7CisJCX0KKworCQkKKwkJciA9ICI8dW5rbm93bj4iOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKQorCQkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKQorCQkJCXIgPSBjaGFubmVsX3RhYmxlW2ldLm5hbWU7CisJCQorCQlwICs9IHNwcmludGYocCwgIk1BQyBtZW1vcnkgdHlwZTpcdCVzXG4iLCBjKTsKKwkJcCArPSBzcHJpbnRmKHAsICJSZWd1bGF0b3J5IGRvbWFpbjpcdCVzXG4iLCByKTsKKwkJcCArPSBzcHJpbnRmKHAsICJIb3N0IENSQyBjaGVja2luZzpcdCVzXG4iLCAKKwkJCSAgICAgcHJpdi0+ZG9fcnhfY3JjID8gIk9uIiA6ICJPZmYiKTsKKwkJcCArPSBzcHJpbnRmKHAsICJXUEEtY2FwYWJsZSBmaXJtd2FyZTpcdCVzXG4iLAorCQkJICAgICBwcml2LT51c2Vfd3BhID8gIlllcyIgOiAiTm8iKTsKKwl9CisJCisJc3dpdGNoKHByaXYtPnN0YXRpb25fc3RhdGUpIHsKKwljYXNlIFNUQVRJT05fU1RBVEVfU0NBTk5JTkc6IHMgPSAiU2Nhbm5pbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfSk9JTk5JTkc6IHMgPSAiSm9pbmluZyI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORzogcyA9ICJBdXRoZW50aWNhdGluZyI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORzogcyA9ICJBc3NvY2lhdGluZyI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9SRUFEWTogcyA9ICJSZWFkeSI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HOiBzID0gIlJlYXNzb2NpYXRpbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUjogcyA9ICJNYW5hZ2VtZW50IGVycm9yIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX0RPV046IHMgPSAiRG93biI7IGJyZWFrOworCWRlZmF1bHQ6IHMgPSAiPHVua25vd24+IjsKKwl9CisgICAgICAKKwlwICs9IHNwcmludGYocCwgIkN1cnJlbnQgc3RhdGU6XHRcdCVzXG4iLCBzKTsKKwlyZXR1cm4gIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBkYXRhOworCWludCBsZW4gPSBhdG1lbF9wcm9jX291dHB1dCAocGFnZSwgcHJpdik7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7CisgICAgICAgIGlmIChsZW48MCkgbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfYXRtZWxfY2FyZCggdW5zaWduZWQgc2hvcnQgaXJxLCBpbnQgcG9ydCwgY29uc3QgQXRtZWxGV1R5cGUgZndfdHlwZSwgIAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpzeXNfZGV2LCBpbnQgKCpjYXJkX3ByZXNlbnQpKHZvaWQgKiksIHZvaWQgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdjsKKwlpbnQgcmM7CisKKwkvKiBDcmVhdGUgdGhlIG5ldHdvcmsgZGV2aWNlIG9iamVjdC4gKi8KKyAgICAgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpwcml2KSk7CisgICAgICAgIGlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWw6ICBDb3VsZG4ndCBhbGxvY19ldGhlcmRldlxuIik7CisJCXJldHVybiBOVUxMOworICAgICAgICB9CisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG1lbDogIENvdWxkbid0IGdldCBuYW1lIVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPmRldiA9IGRldjsKKwlwcml2LT5zeXNfZGV2ID0gc3lzX2RldjsKKwlwcml2LT5wcmVzZW50X2NhbGxiYWNrID0gY2FyZF9wcmVzZW50OworCXByaXYtPmNhcmQgPSBjYXJkOworCXByaXYtPmZpcm13YXJlID0gTlVMTDsKKwlwcml2LT5maXJtd2FyZV9pZFswXSA9ICdcMCc7CisJcHJpdi0+ZmlybXdhcmVfdHlwZSA9IGZ3X3R5cGU7CisJaWYgKGZpcm13YXJlKSAvKiBtb2R1bGUgcGFyYW1ldGVyICovCisJCXN0cmNweShwcml2LT5maXJtd2FyZV9pZCwgZmlybXdhcmUpOworCXByaXYtPmJ1c190eXBlID0gY2FyZF9wcmVzZW50ID8gQlVTX1RZUEVfUENDQVJEIDogQlVTX1RZUEVfUENJOworCXByaXYtPnN0YXRpb25fc3RhdGUgPSBTVEFUSU9OX1NUQVRFX0RPV047CisJcHJpdi0+ZG9fcnhfY3JjID0gMDsKKwkvKiBGb3IgUENNQ0lBIGNhcmRzLCBzb21lIGNoaXBzIG5lZWQgQ1JDLCBzb21lIGRvbid0CisJICAgc28gd2UgaGF2ZSB0byBwcm9iZS4gKi8KKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSB7CisJCXByaXYtPnByb2JlX2NyYyA9IDE7CisJCXByaXYtPmNyY19va19jbnQgPSBwcml2LT5jcmNfa29fY250ID0gMDsKKwl9IGVsc2UKKwkJcHJpdi0+cHJvYmVfY3JjID0gMDsKKwltZW1zZXQoJnByaXYtPnN0YXRzLCAwLCBzaXplb2YocHJpdi0+c3RhdHMpKTsKKwltZW1zZXQoJnByaXYtPndzdGF0cywgMCwgc2l6ZW9mKHByaXYtPndzdGF0cykpOworCXByaXYtPmxhc3RfcXVhbCA9IGppZmZpZXM7CisJcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gMDsKKwltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIHNpemVvZihwcml2LT5mcmFnX3NvdXJjZSkpOworCW1lbXNldChwcml2LT5CU1NJRCwgMCwgNik7CisJcHJpdi0+Q3VycmVudEJTU0lEWzBdID0gMHhGRjsgLyogSW5pdGlhbGl6ZSB0byBzb21ldGhpbmcgaW52YWxpZC4uLi4gKi8KKwlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMDsKKwkKKwlwcml2LT5sYXN0X3N1cnZleSA9IGppZmZpZXM7CisJcHJpdi0+cHJlYW1ibGUgPSBMT05HX1BSRUFNQkxFOworCXByaXYtPm9wZXJhdGluZ19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwlwcml2LT5jb25uZWN0X3RvX2FueV9CU1MgPSAwOworCXByaXYtPmNvbmZpZ19yZWdfZG9tYWluID0gMDsKKwlwcml2LT5yZWdfZG9tYWluID0gMDsKKwlwcml2LT50eF9yYXRlID0gMzsKKwlwcml2LT5hdXRvX3R4X3JhdGUgPSAxOworCXByaXYtPmNoYW5uZWwgPSA0OworCXByaXYtPnBvd2VyX21vZGUgPSAwOworCXByaXYtPlNTSURbMF0gPSAnXDAnOworCXByaXYtPlNTSURfc2l6ZSA9IDA7CisJcHJpdi0+bmV3X1NTSURfc2l6ZSA9IDA7CisJcHJpdi0+ZnJhZ190aHJlc2hvbGQgPSAyMzQ2OworCXByaXYtPnJ0c190aHJlc2hvbGQgPSAyMzQ3OworCXByaXYtPnNob3J0X3JldHJ5ID0gNzsKKwlwcml2LT5sb25nX3JldHJ5ID0gNDsKKworCXByaXYtPndlcF9pc19vbiA9IDA7CisJcHJpdi0+ZGVmYXVsdF9rZXkgPSAwOworCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAwOworCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAwOworCXByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9OT05FOworCXByaXYtPnVzZV93cGEgPSAwOworCW1lbXNldChwcml2LT53ZXBfa2V5cywgMCwgc2l6ZW9mKHByaXYtPndlcF9rZXlzKSk7CisJbWVtc2V0KHByaXYtPndlcF9rZXlfbGVuLCAwLCBzaXplb2YocHJpdi0+d2VwX2tleV9sZW4pKTsKKworCXByaXYtPmRlZmF1bHRfYmVhY29uX3BlcmlvZCA9IHByaXYtPmJlYWNvbl9wZXJpb2QgPSAxMDA7CisJcHJpdi0+bGlzdGVuX2ludGVydmFsID0gMTsKKworCWluaXRfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5pcnFsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dGltZXJsb2NrKTsKKwlwcml2LT5tYW5hZ2VtZW50X3RpbWVyLmZ1bmN0aW9uID0gYXRtZWxfbWFuYWdlbWVudF90aW1lcjsKKwlwcml2LT5tYW5hZ2VtZW50X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCQorCWRldi0+b3BlbiA9IGF0bWVsX29wZW47CisJZGV2LT5zdG9wID0gYXRtZWxfY2xvc2U7CisJZGV2LT5jaGFuZ2VfbXR1ID0gYXRtZWxfY2hhbmdlX210dTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGF0bWVsX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHN0YXJ0X3R4OworCWRldi0+Z2V0X3N0YXRzID0gYXRtZWxfZ2V0X3N0YXRzOworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gYXRtZWxfZ2V0X3dpcmVsZXNzX3N0YXRzOworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJmF0bWVsX2hhbmRsZXJfZGVmOworCWRldi0+ZG9faW9jdGwgPSBhdG1lbF9pb2N0bDsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IHBvcnQ7CisJCisJU0VUX05FVERFVl9ERVYoZGV2LCBzeXNfZGV2KTsKKwkKKwlpZiAoKHJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNlcnZpY2VfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3RlciBpbnRlcnJ1cHQgJWQgZmFpbGVkLCByYyAlZFxuIiwgZGV2LT5uYW1lLCBpcnEsIHJjICk7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0kgJiYKKwkgICAgIXJlcXVlc3RfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQsIGRldi0+bmFtZSApKSB7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCQorCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfb3V0X3JlczsKKwkKKwlpZiAoIXByb2JlX2F0bWVsX2NhcmQoZGV2KSl7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCQorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9hdG1lbCIsIDAsIE5VTEwsIGF0bWVsX3JlYWRfcHJvYywgcHJpdik7CQorCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBhdDc2YzUweCB3aXJlbGVzcy4gVmVyc2lvbiAlZC4lZCBzaW1vbkB0aGVrZWxsZXlzLm9yZy51a1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBEUklWRVJfTUFKT1IsIERSSVZFUl9NSU5PUik7CisJCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXJldHVybiBkZXY7CisJCisgZXJyX291dF9yZXM6CisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDSSkKKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKKyBlcnJfb3V0X2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyBlcnJfb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTChpbml0X2F0bWVsX2NhcmQpOworCit2b2lkIHN0b3BfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJlZXJlcykKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCQorCS8qIHB1dCBhIGJyaWNrIG9uIGl0Li4uICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwkKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL2F0bWVsIiwgTlVMTCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaWYgKHByaXYtPmZpcm13YXJlKQorCQlrZnJlZShwcml2LT5maXJtd2FyZSk7CisJaWYgKGZyZWVyZXMpIHsKKwkJLyogUENNQ0lBIGZyZWVzIHRoaXMgc3R1ZmYsIHNvIG9ubHkgZm9yIFBDSSAqLworCSAgICAgICAgcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDY0KTsKKyAgICAgICAgfQorCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK0VYUE9SVF9TWU1CT0woc3RvcF9hdG1lbF9jYXJkKTsKKworc3RhdGljIGludCBhdG1lbF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBDaGVjayBpZiB3ZSBhc2tlZCBmb3IgYGFueScgKi8KKwlpZihkd3JxLT5mbGFncyA9PSAwKSB7CisJCXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUyA9IDE7CisJfSBlbHNlIHsKKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisKKwkJcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTID0gMDsKKwkJCisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IE1BWF9TU0lEX0xFTkdUSCArIDEpCisJCQkgcmV0dXJuIC1FMkJJRyA7CisJCWlmIChpbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQorCQltZW1jcHkocHJpdi0+bmV3X1NTSUQsIGV4dHJhLCBkd3JxLT5sZW5ndGggLSAxKTsKKwkJcHJpdi0+bmV3X1NTSURfc2l6ZSA9IGR3cnEtPmxlbmd0aCAtIDE7CisJfQorCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgU1NJRCAqLworCWlmIChwcml2LT5uZXdfU1NJRF9zaXplICE9IDApIHsKKwkJbWVtY3B5KGV4dHJhLCBwcml2LT5uZXdfU1NJRCwgcHJpdi0+bmV3X1NTSURfc2l6ZSk7CisJCWV4dHJhW3ByaXYtPm5ld19TU0lEX3NpemVdID0gJ1wwJzsKKwkJZHdycS0+bGVuZ3RoID0gcHJpdi0+bmV3X1NTSURfc2l6ZSArIDE7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGV4dHJhLCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCQlleHRyYVtwcml2LT5TU0lEX3NpemVdID0gJ1wwJzsKKwkJZHdycS0+bGVuZ3RoID0gcHJpdi0+U1NJRF9zaXplICsgMTsKKwl9CisJCisJZHdycS0+ZmxhZ3MgPSAhcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTOyAvKiBhY3RpdmUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBzb2NrYWRkciAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEJhc2ljIGNoZWNraW5nOiBkbyB3ZSBoYXZlIGEga2V5IHRvIHNldCA/CisJICogTm90ZSA6IHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIGEga2V5IHNpemUgPT0gMCBpbnN0ZWFkLgorCSAqIE5ldyB2ZXJzaW9uIG9mIGl3Y29uZmlnIHByb3Blcmx5IHNldCB0aGUgSVdfRU5DT0RFX05PS0VZIGZsYWcKKwkgKiB3aGVuIG5vIGtleSBpcyBwcmVzZW50IChvbmx5IGNoYW5nZSBmbGFncyksIGJ1dCBvbGRlciB2ZXJzaW9ucworCSAqIGRvbid0IGRvIGl0LiAtIEplYW4gSUkgKi8KKwlpZiAoZHdycS0+bGVuZ3RoID4gMCkgeworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaW50IGN1cnJlbnRfaW5kZXggPSBwcml2LT5kZWZhdWx0X2tleTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gMTMpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIHRoZSBpbmRleCAobm9uZSAtPiB1c2UgY3VycmVudCkgKi8KKwkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSA0KQorCQkJaW5kZXggPSBjdXJyZW50X2luZGV4OworCQllbHNlCisJCQlwcml2LT5kZWZhdWx0X2tleSA9IGluZGV4OworCQkvKiBTZXQgdGhlIGxlbmd0aCAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gNSkKKwkJCXByaXYtPndlcF9rZXlfbGVuW2luZGV4XSA9IDEzOworCQllbHNlCisJCQlpZiAoZHdycS0+bGVuZ3RoID4gMCkKKwkJCQlwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPSA1OworCQkJZWxzZQorCQkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJCXByaXYtPndlcF9rZXlfbGVuW2luZGV4XSA9IDA7CisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDbGVhbnVwICovCisJCQltZW1zZXQocHJpdi0+d2VwX2tleXNbaW5kZXhdLCAwLCAxMyk7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2luZGV4XSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJCX0KKwkJLyogV0Ugc3BlY2lmeSB0aGF0IGlmIGEgdmFsaWQga2V5IGlzIHNldCwgZW5jcnlwdGlvbgorCQkgKiBzaG91bGQgYmUgZW5hYmxlZCAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpCisJCSAqIFRoaXMgaXMgYWxzbyBob3cgIml3Y29uZmlnIGV0aFgga2V5IG9uIiB3b3JrcyAqLworCQlpZiAoaW5kZXggPT0gY3VycmVudF9pbmRleCAmJiAKKwkJICAgIHByaXYtPndlcF9rZXlfbGVuW2luZGV4XSA+IDApIHsKKwkJCXByaXYtPndlcF9pc19vbiA9IDE7CisJCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMTsKKwkJCWlmIChwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPiA1KSB7CisJCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF82NDsKKwkJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CisJCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKCBpbmRleD49MCAmJiBpbmRleCA8IDQgKSB7CisJCQlwcml2LT5kZWZhdWx0X2tleSA9IGluZGV4OworCQl9IGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCX0KKwkvKiBSZWFkIHRoZSBmbGFncyAqLworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCXByaXYtPndlcF9pc19vbiA9IDA7CisJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAwOyAJCisJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9OT05FOworCX0gZWxzZSB7CisJCXByaXYtPndlcF9pc19vbiA9IDE7CisJCWlmIChwcml2LT53ZXBfa2V5X2xlbltwcml2LT5kZWZhdWx0X2tleV0gPiA1KSB7CisJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzEyODsKKwkJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAyOworCQl9IGVsc2UgeworCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF82NDsKKwkJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAxOworCQl9CisJfQorCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAxOworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAwOworCQorCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKworc3RhdGljIGludCBhdG1lbF9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQorCWlmICghcHJpdi0+d2VwX2lzX29uKQorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwllbHNlIGlmIChwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkKQorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCWVsc2UKKwkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfT1BFTjsKKwkJCisJCS8qIFdoaWNoIGtleSBkbyB3ZSB3YW50ID8gLTEgLT4gdHggaW5kZXggKi8KKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IDQpCisJCWluZGV4ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisJZHdycS0+ZmxhZ3MgfD0gaW5kZXggKyAxOworCS8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwlkd3JxLT5sZW5ndGggPSBwcml2LT53ZXBfa2V5X2xlbltpbmRleF07CisJaWYgKGR3cnEtPmxlbmd0aCA+IDE2KSB7CisJCWR3cnEtPmxlbmd0aD0wOworCX0gZWxzZSB7CisJCW1lbXNldChleHRyYSwgMCwgMTYpOworCQltZW1jcHkoZXh0cmEsIHByaXYtPndlcF9rZXlzW2luZGV4XSwgZHdycS0+bGVuZ3RoKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgY2hhciAqY3dycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KGN3cnEsICJJRUVFIDgwMi4xMS1EUyIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmICh2d3JxLT5maXhlZCA9PSAwKSB7CisJCXByaXYtPnR4X3JhdGUgPSAzOworCQlwcml2LT5hdXRvX3R4X3JhdGUgPSAxOworCX0gZWxzZSB7CisJCXByaXYtPmF1dG9fdHhfcmF0ZSA9IDA7CisJCQorCQkvKiBXaGljaCB0eXBlIG9mIHZhbHVlID8gKi8KKwkJaWYoKHZ3cnEtPnZhbHVlIDwgNCkgJiYgKHZ3cnEtPnZhbHVlID49IDApKSB7CisJCQkvKiBTZXR0aW5nIGJ5IHJhdGUgaW5kZXggKi8KKwkJcHJpdi0+dHhfcmF0ZSA9IHZ3cnEtPnZhbHVlOworCQl9IGVsc2UgeworCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSB2YWx1ZSAqLworCQkJc3dpdGNoICh2d3JxLT52YWx1ZSkgeworCQkJY2FzZSAgMTAwMDAwMDogcHJpdi0+dHhfcmF0ZSA9IDA7IGJyZWFrOworCQkJY2FzZSAgMjAwMDAwMDogcHJpdi0+dHhfcmF0ZSA9IDE7IGJyZWFrOworCQkJY2FzZSAgNTUwMDAwMDogcHJpdi0+dHhfcmF0ZSA9IDI7IGJyZWFrOworCQkJY2FzZSAxMTAwMDAwMDogcHJpdi0+dHhfcmF0ZSA9IDM7IGJyZWFrOworCQkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIF9fdTMyICp1d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKnV3cnEgIT0gSVdfTU9ERV9BREhPQyAmJiAqdXdycSAhPSBJV19NT0RFX0lORlJBKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYtPm9wZXJhdGluZ19tb2RlID0gKnV3cnE7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsgIAorfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIF9fdTMyICp1d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJKnV3cnEgPSBwcml2LT5vcGVyYXRpbmdfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5hdXRvX3R4X3JhdGUpIHsKKwkJdndycS0+Zml4ZWQgPSAwOworCQl2d3JxLT52YWx1ZSA9IDExMDAwMDAwOworCX0gZWxzZSB7CisJCXZ3cnEtPmZpeGVkID0gMTsKKwkJc3dpdGNoKHByaXYtPnR4X3JhdGUpIHsKKwkJY2FzZSAwOiB2d3JxLT52YWx1ZSA9ICAxMDAwMDAwOyBicmVhazsKKwkJY2FzZSAxOiB2d3JxLT52YWx1ZSA9ICAyMDAwMDAwOyBicmVhazsKKwkJY2FzZSAyOiB2d3JxLT52YWx1ZSA9ICA1NTAwMDAwOyBicmVhazsKKwkJY2FzZSAzOiB2d3JxLT52YWx1ZSA9IDExMDAwMDAwOyBicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+cG93ZXJfbW9kZSA9IHZ3cnEtPmRpc2FibGVkID8gMCA6IDE7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdndycS0+ZGlzYWJsZWQgPSBwcml2LT5wb3dlcl9tb2RlID8gMCA6IDE7CisJdndycS0+ZmxhZ3MgPSBJV19QT1dFUl9PTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYoIXZ3cnEtPmRpc2FibGVkICYmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSkgeworCQlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkKKwkJCXByaXYtPmxvbmdfcmV0cnkgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSBpZiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NSU4pCisJCQlwcml2LT5zaG9ydF9yZXRyeSA9IHZ3cnEtPnZhbHVlOworCQllbHNlIHsKKwkJCS8qIE5vIG1vZGlmaWVyIDogc2V0IGJvdGggKi8KKwkJCXByaXYtPmxvbmdfcmV0cnkgPSB2d3JxLT52YWx1ZTsKKwkJCXByaXYtPnNob3J0X3JldHJ5ID0gdndycS0+dmFsdWU7CisJCX0KKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCQorCX0KKwkgICAKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwl2d3JxLT5kaXNhYmxlZCA9IDA7ICAgICAgLyogQ2FuJ3QgYmUgZGlzYWJsZWQgKi8KKworCS8qIE5vdGUgOiBieSBkZWZhdWx0LCBkaXNwbGF5IHRoZSBtaW4gcmV0cnkgbnVtYmVyICovCisJaWYoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKSkgeworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCQl2d3JxLT52YWx1ZSA9IHByaXYtPmxvbmdfcmV0cnk7CisJfSBlbHNlIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwkJdndycS0+dmFsdWUgPSBwcml2LT5zaG9ydF9yZXRyeTsKKwkJaWYocHJpdi0+bG9uZ19yZXRyeSAhPSBwcml2LT5zaG9ydF9yZXRyeSkKKwkJCXZ3cnEtPmZsYWdzIHw9IElXX1JFVFJZX01JTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBydGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJcnRociA9IDIzNDc7CisJaWYoKHJ0aHIgPCAwKSB8fCAocnRociA+IDIzNDcpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcml2LT5ydHNfdGhyZXNob2xkID0gcnRocjsKKwkKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJdndycS0+dmFsdWUgPSBwcml2LT5ydHNfdGhyZXNob2xkOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID49IDIzNDcpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBmdGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJZnRociA9IDIzNDY7CisJaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjM0NikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZ0aHIgJj0gfjB4MTsJLyogR2V0IGFuIGV2ZW4gdmFsdWUgLSBpcyBpdCByZWFsbHkgbmVlZGVkID8/PyAqLworCXByaXYtPmZyYWdfdGhyZXNob2xkID0gZnRocjsKKwkKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdndycS0+dmFsdWUgPSBwcml2LT5mcmFnX3RocmVzaG9sZDsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA+PSAyMzQ2KTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGxvbmcgZnJlcXVlbmN5X2xpc3RbXSA9IHsgMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKKwkJCQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0IH07CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmMgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJCisJLyogSWYgc2V0dGluZyBieSBmcmVxdWVuY3ksIGNvbnZlcnQgdG8gYSBjaGFubmVsICovCisJaWYoKGZ3cnEtPmUgPT0gMSkgJiYKKwkgICAoZndycS0+bSA+PSAoaW50KSAyNDEyMDAwMDApICYmCisJICAgKGZ3cnEtPm0gPD0gKGludCkgMjQ4NzAwMDAwKSkgeworCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCWludCBjID0gMDsKKwkJd2hpbGUoKGMgPCAxNCkgJiYgKGYgIT0gZnJlcXVlbmN5X2xpc3RbY10pKQorCQkJYysrOworCQkvKiBIYWNrIHRvIGZhbGwgdGhyb3VnaC4uLiAqLworCQlmd3JxLT5lID0gMDsKKwkJZndycS0+bSA9IGMgKyAxOworCX0KKwkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJaWYoKGZ3cnEtPm0gPiAxMDAwKSB8fCAoZndycS0+ZSA+IDApKQorCQlyYyA9IC1FT1BOT1RTVVBQOworCWVsc2UgeworCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CisJCWlmIChhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHByaXYsIGNoYW5uZWwpID09IDApIHsKKwkJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlOVkFMOworCQl9IAorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZ3cnEtPm0gPSBwcml2LT5jaGFubmVsOworCWZ3cnEtPmUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBOb3RlIDogeW91IG1heSBoYXZlIHJlYWxpc2VkIHRoYXQsIGFzIHRoaXMgaXMgYSBTRVQgb3BlcmF0aW9uLAorCSAqIHRoaXMgaXMgcHJpdmlsZWdlZCBhbmQgdGhlcmVmb3JlIGEgbm9ybWFsIHVzZXIgY2FuJ3QKKwkgKiBwZXJmb3JtIHNjYW5uaW5nLgorCSAqIFRoaXMgaXMgbm90IGFuIGVycm9yLCB3aGlsZSB0aGUgZGV2aWNlIHBlcmZvcm0gc2Nhbm5pbmcsCisJICogdHJhZmZpYyBkb2Vzbid0IGZsb3csIHNvIGl0J3MgYSBwZXJmZWN0IERvUy4uLgorCSAqIEplYW4gSUkgKi8KKwkKKwlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0RPV04pCisJCXJldHVybiAtRUFHQUlOOworCisJLyogVGltZW91dCBvbGQgc3VydmV5cy4gKi8KKwlpZiAoKGppZmZpZXMgLSBwcml2LT5sYXN0X3N1cnZleSkgPiAoMjAgKiBIWikpCisJCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfSURMRTsKKwlwcml2LT5sYXN0X3N1cnZleSA9IGppZmZpZXM7CisKKwkvKiBJbml0aWF0ZSBhIHNjYW4gY29tbWFuZCAqLworCWlmIChwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9PSBTSVRFX1NVUlZFWV9JTl9QUk9HUkVTUykKKwkJcmV0dXJuIC1FQlVTWTsKKwkJCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCisJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9JTl9QUk9HUkVTUzsKKwlwcml2LT5mYXN0X3NjYW4gPSAwOworCWF0bWVsX3NjYW4ocHJpdiwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKwlzdHJ1Y3QgaXdfZXZlbnQJaXdlOworCQorCWlmIChwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSAhPSBTSVRFX1NVUlZFWV9DT01QTEVURUQpCisJCXJldHVybiAtRUFHQUlOOworCQorCWZvcihpPTA7IGk8cHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSB7IAorCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgcHJpdi0+QlNTaW5mb1tpXS5CU1NJRCwgNik7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworCQlpd2UudS5kYXRhLmxlbmd0aCA9ICBwcml2LT5CU1NpbmZvW2ldLlNTSURzaXplOworCQlpZiAoaXdlLnUuZGF0YS5sZW5ndGggPiAzMikKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBwcml2LT5CU1NpbmZvW2ldLlNTSUQpOworCQkKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpd2UudS5tb2RlID0gcHJpdi0+QlNTaW5mb1tpXS5CU1N0eXBlOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJCisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaXdlLnUuZnJlcS5tID0gcHJpdi0+QlNTaW5mb1tpXS5jaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisJCQorCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKHByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgTlVMTCk7CisJCQorCX0KKworCS8qIExlbmd0aCBvZiBkYXRhICovCisJZHdycS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJZHdycS0+ZmxhZ3MgPSAwOyAgIAorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlpbnQgayxpLGo7CisKKwlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOworCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IDA7CisJZm9yIChqID0gMDsgaiA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGorKykKKwkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtqXS5yZWdfZG9tYWluKSB7CisJCQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gY2hhbm5lbF90YWJsZVtqXS5tYXggLSBjaGFubmVsX3RhYmxlW2pdLm1pbiArIDE7CisJCQlicmVhazsKKwkJfQorCWlmIChyYW5nZS0+bnVtX2NoYW5uZWxzICE9IDApIHsKKwkJZm9yKGsgPSAwLCBpID0gY2hhbm5lbF90YWJsZVtqXS5taW47IGkgPD0gY2hhbm5lbF90YWJsZVtqXS5tYXg7IGkrKykgeworCQkJcmFuZ2UtPmZyZXFba10uaSA9IGk7IC8qIExpc3QgaW5kZXggKi8KKwkJCXJhbmdlLT5mcmVxW2tdLm0gPSBmcmVxdWVuY3lfbGlzdFtpLTFdICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbaysrXS5lID0gMTsJLyogVmFsdWVzIGluIHRhYmxlIGluIE1IeiAtPiAqIDEwXjUgKiAxMCAqLworCQl9CisJCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gazsKKwl9CisJCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMTAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDUwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDUwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAwOworCisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAgMTAwMDAwMDsKKwlyYW5nZS0+Yml0cmF0ZVsxXSA9ICAyMDAwMDAwOworCXJhbmdlLT5iaXRyYXRlWzJdID0gIDU1MDAwMDA7CisJcmFuZ2UtPmJpdHJhdGVbM10gPSAxMTAwMDAwMDsKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gNDsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDQ7CisJCisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX09OOworCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9PTjsKKwlyYW5nZS0+cG1fY2FwYSA9IDA7CisJCisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSAwOworCXJhbmdlLT5taW5fcmV0cnkgPSAxOworCXJhbmdlLT5tYXhfcmV0cnkgPSA2NTUzNTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBzb2NrYWRkciAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IHU4IGJjYXN0W10gPSB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmIChtZW1jbXAoYmNhc3QsIGF3cnEtPnNhX2RhdGEsIDYpID09IDApIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwkKKwlmb3IoaT0wOyBpPHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgeworCQlpZiAobWVtY21wKHByaXYtPkJTU2luZm9baV0uQlNTSUQsIGF3cnEtPnNhX2RhdGEsIDYpID09IDApIHsKKwkJCWlmICghcHJpdi0+d2VwX2lzX29uICYmIHByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSBpZiAgKHByaXYtPndlcF9pc19vbiAmJiAhcHJpdi0+QlNTaW5mb1tpXS5Vc2luZ1dFUCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBpKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJCQorCXJldHVybiAtRUlOVkFMOworfQorCQorc3RhdGljIGludCBhdG1lbF9jb25maWdfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywJLyogTlVMTCAqLworCQkJICAgICAgIHZvaWQgKnp3cnEsCQkJLyogTlVMTCAqLworCQkJICAgICAgIGNoYXIgKmV4dHJhKQkJCS8qIE5VTEwgKi8KK3sKKwlyZXR1cm4gYXRtZWxfb3BlbihkZXYpOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJYXRtZWxfaGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgYXRtZWxfY29uZmlnX2NvbW1pdCwJLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfbmFtZSwgICAgCS8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXTldJRCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfZnJlcSwJCS8qIFNJT0NTSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9mcmVxLAkJLyogU0lPQ0dJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X21vZGUsCQkvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfbW9kZSwJCS8qIFNJT0NHSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgCS8qIFNJT0NTSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAJCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9yYW5nZSwgICAgICAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1NQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF93YXAsCQkvKiBTSU9DU0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3dhcCwJCS8qIFNJT0NHSVdBUCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgCQkvKiBTSU9DR0lXQVBMSVNUICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9zY2FuLAkJLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3NjYW4sCQkvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfZXNzaWQsCQkvKiBTSU9DU0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2Vzc2lkLAkJLyogU0lPQ0dJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgCQkvKiBTSU9DU0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgCQkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfcmF0ZSwJCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9yYXRlLAkJLyogU0lPQ0dJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3J0cywJCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3J0cywJCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2ZyYWcsCQkvKiBTSU9DU0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZnJhZywJCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgCQkvKiBTSU9DU0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgCQkvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3JldHJ5LAkJLyogU0lPQ1NJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9yZXRyeSwJCS8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfcG93ZXIsCQkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3Bvd2VyLAkJLyogU0lPQ0dJV1BPV0VSICovCit9OworCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQlhdG1lbF9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICovCit9OworCit0eXBlZGVmIHN0cnVjdCBhdG1lbF9wcml2X2lvY3RsIHsKKwljaGFyIGlkWzMyXTsKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqZGF0YTsJCQorCXVuc2lnbmVkIHNob3J0IGxlbjsJCQorfSBhdG1lbF9wcml2X2lvY3RsOworCisJCisjZGVmaW5lIEFUTUVMRldMIFNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBBVE1FTElESUZDIEFUTUVMRldMICsgMQorI2RlZmluZSBBVE1FTFJEIEFUTUVMRldMICsgMgorI2RlZmluZSBBVE1FTE1BR0lDIDB4NTE4MDcgCisjZGVmaW5lIFJFR0RPTUFJTlNaIDIwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIGF0bWVsX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IEFUTUVMRldMLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IHNpemVvZiAoYXRtZWxfcHJpdl9pb2N0bCksIElXX1BSSVZfVFlQRV9OT05FLCAiYXRtZWxmd2wiIH0sCisgIHsgQVRNRUxJRElGQywgSVdfUFJJVl9UWVBFX05PTkUsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiYXRtZWxpZGlmYyIgfSwKKyAgeyBBVE1FTFJELCBJV19QUklWX1RZUEVfQ0hBUiB8IFJFR0RPTUFJTlNaLCBJV19QUklWX1RZUEVfTk9ORSwgInJlZ2RvbWFpbiIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJYXRtZWxfaGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2YoYXRtZWxfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZihhdG1lbF9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwgCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksIAorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIGF0bWVsX2hhbmRsZXIsCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9wcml2YXRlX2hhbmRsZXIsIAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBhdG1lbF9wcml2YXRlX2FyZ3MKK307CisKK3N0YXRpYyBpbnQgYXRtZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlhdG1lbF9wcml2X2lvY3RsIGNvbTsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJdW5zaWduZWQgY2hhciAqbmV3X2Zpcm13YXJlOworCWNoYXIgZG9tYWluW1JFR0RPTUFJTlNaKzFdOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHSVdQUklWOgorCQlpZih3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCQkvKiBTZXQgdGhlIG51bWJlciBvZiBpb2N0bCBhdmFpbGFibGUgKi8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3MpIC8gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJnc1swXSk7CisJCQkKKwkJCS8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgKHVfY2hhciAqKSBhdG1lbF9wcml2YXRlX2FyZ3MsCisJCQkJCSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKSkpCisJCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBVE1FTElESUZDOgorCQl3cnEtPnUucGFyYW0udmFsdWUgPSBBVE1FTE1BR0lDOwkJCisJCWJyZWFrOworCQorCWNhc2UgQVRNRUxGV0w6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29tLCBycS0+aWZyX2RhdGEsIHNpemVvZihjb20pKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJjID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShuZXdfZmlybXdhcmUgPSBrbWFsbG9jKGNvbS5sZW4sIEdGUF9LRVJORUwpKSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIobmV3X2Zpcm13YXJlLCBjb20uZGF0YSwgY29tLmxlbikpIHsKKwkJCWtmcmVlKG5ld19maXJtd2FyZSk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwcml2LT5maXJtd2FyZSkKKwkJCWtmcmVlKHByaXYtPmZpcm13YXJlKTsKKwkJCisJCXByaXYtPmZpcm13YXJlID0gbmV3X2Zpcm13YXJlOworCQlwcml2LT5maXJtd2FyZV9sZW5ndGggPSBjb20ubGVuOworCQlzdHJuY3B5KHByaXYtPmZpcm13YXJlX2lkLCBjb20uaWQsIDMxKTsKKwkJcHJpdi0+ZmlybXdhcmVfaWRbMzFdID0gJ1wwJzsKKwkJYnJlYWs7CisKKwljYXNlIEFUTUVMUkQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcihkb21haW4sIHJxLT5pZnJfZGF0YSwgUkVHRE9NQUlOU1opKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyYyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJZG9tYWluW1JFR0RPTUFJTlNaXSA9IDA7CisJCXJjID0gLUVJTlZBTDsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykgeworCQkJLyogc3RyY2FzZWNtcCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJyYXJ5ICovCisJCQljaGFyICphID0gY2hhbm5lbF90YWJsZVtpXS5uYW1lOworCQkJY2hhciAqYiA9IGRvbWFpbjsKKwkJCXdoaWxlICgqYSkgeworCQkJCWNoYXIgYzEgPSAqYSsrOworCQkJCWNoYXIgYzIgPSAqYisrOworCQkJCWlmICh0b2xvd2VyKGMxKSAhPSB0b2xvd2VyKGMyKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoISphICYmICEqYikgeworCQkJCXByaXYtPmNvbmZpZ19yZWdfZG9tYWluID0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluOworCQkJCXJjID0gMDsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJjID09IDAgJiYgIHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9ET1dOKQorCQkJcmMgPSBhdG1lbF9vcGVuKGRldik7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlyYyA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBhdXRoX2JvZHkgeworCXUxNiBhbGc7CisJdTE2IHRyYW5zX3NlcTsKKwl1MTYgc3RhdHVzOworCXU4IGVsX2lkOworCXU4IGNoYWxsX3RleHRfbGVuOworCXU4IGNoYWxsX3RleHRbMjUzXTsKK307IAorCitzdGF0aWMgdm9pZCBhdG1lbF9lbnRlcl9zdGF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IG5ld19zdGF0ZSkKK3sKKwlpbnQgb2xkX3N0YXRlID0gcHJpdi0+c3RhdGlvbl9zdGF0ZTsKKwkJCisJaWYgKG5ld19zdGF0ZSA9PSBvbGRfc3RhdGUpCisJCXJldHVybjsKKwkKKwlwcml2LT5zdGF0aW9uX3N0YXRlID0gbmV3X3N0YXRlOworCQkKKwlpZiAobmV3X3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+ZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5kZXYpOworCX0KKworCWlmIChvbGRfc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5kZXYpOworCQlpZiAobmV0aWZfcnVubmluZyhwcml2LT5kZXYpKQorCQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5kZXYpOworCQlwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2NhbihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IHNwZWNpZmljX3NzaWQpCit7CisJc3RydWN0IHsKKwkJdTggQlNTSURbNl07CisJCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXTsKKwkJdTggc2Nhbl90eXBlOworCQl1OCBjaGFubmVsOworCQl1MTYgQlNTX3R5cGU7CisJCXUxNiBtaW5fY2hhbm5lbF90aW1lOworCQl1MTYgbWF4X2NoYW5uZWxfdGltZTsKKwkJdTggb3B0aW9uczsKKwkJdTggU1NJRF9zaXplOworCX0gY21kOworCQorCW1lbXNldChjbWQuQlNTSUQsIDB4ZmYsIDYpOworCisJaWYgKHByaXYtPmZhc3Rfc2NhbikgeworCQljbWQuU1NJRF9zaXplID0gcHJpdi0+U1NJRF9zaXplOworCQltZW1jcHkoY21kLlNTSUQsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJCWNtZC5taW5fY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYoMTApOworCQljbWQubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDUwKTsKKwl9IGVsc2UgeworCQlwcml2LT5CU1NfbGlzdF9lbnRyaWVzID0gMDsKKwkJY21kLlNTSURfc2l6ZSA9IDA7CisJCWNtZC5taW5fY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYoMTApOworCQljbWQubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDEyMCk7CisJfQorCQorCWNtZC5vcHRpb25zID0gMDsKKwkKKwlpZiAoIXNwZWNpZmljX3NzaWQpCisJCWNtZC5vcHRpb25zIHw9IFNDQU5fT1BUSU9OU19TSVRFX1NVUlZFWTsKKwkKKwljbWQuY2hhbm5lbCA9IChwcml2LT5jaGFubmVsICYgMHg3Zik7IAorCWNtZC5zY2FuX3R5cGUgPSBTQ0FOX1RZUEVfQUNUSVZFOworCWNtZC5CU1NfdHlwZSA9IGNwdV90b19sZTE2KHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MgPyAKKwkJQlNTX1RZUEVfQURfSE9DIDogQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQorCWF0bWVsX3NlbmRfY29tbWFuZChwcml2LCBDTURfU2NhbiwgJmNtZCwgc2l6ZW9mKGNtZCkpOworCisJLyogVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgYWxsIGhhcmR3YXJlIGFjY2VzcyB0byBhdm9pZCBiZWluZyBtZXNzZWQgdXAKKwkgICBieSBzdHVmZiBoYXBwZW5pbmcgaW4gaW50ZXJydXB0IGNvbnRleHQgYWZ0ZXIgd2UgbGVhdmUgU1RBVEVfRE9XTiAqLworCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfU0NBTk5JTkcpOworfQorCitzdGF0aWMgdm9pZCBqb2luKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgeworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCQl1OCBCU1NfdHlwZTsgLyogdGhpcyBpcyBhIHNob3J0IGluIGEgc2NhbiBjb21tYW5kIC0gd2VpcmQgKi8KKwkJdTggY2hhbm5lbDsKKwkJdTE2IHRpbWVvdXQ7CisJCXU4IFNTSURfc2l6ZTsKKwkJdTggcmVzZXJ2ZWQ7CisJfSBjbWQ7CisKKwljbWQuU1NJRF9zaXplID0gcHJpdi0+U1NJRF9zaXplOworCW1lbWNweShjbWQuU1NJRCwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwltZW1jcHkoY21kLkJTU0lELCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCWNtZC5jaGFubmVsID0gKHByaXYtPmNoYW5uZWwgJiAweDdmKTsKKwljbWQuQlNTX3R5cGUgPSB0eXBlOworCWNtZC50aW1lb3V0ID0gY3B1X3RvX2xlMTYoMjAwMCk7CisKKyAJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIENNRF9Kb2luLCAmY21kLCBzaXplb2YoY21kKSk7Cit9CisKKworc3RhdGljIHZvaWQgc3RhcnQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCB0eXBlKQoreworCXN0cnVjdCB7CisJCXU4IEJTU0lEWzZdOworCQl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IEJTU190eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXU4IGNoYW5uZWw7CisJCXU4IFNTSURfc2l6ZTsKKwkJdTggcmVzZXJ2ZWRbM107CisJfSBjbWQ7CisKKwljbWQuU1NJRF9zaXplID0gcHJpdi0+U1NJRF9zaXplOworCW1lbWNweShjbWQuU1NJRCwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwltZW1jcHkoY21kLkJTU0lELCBwcml2LT5CU1NJRCwgNik7CisJY21kLkJTU190eXBlID0gdHlwZTsKKwljbWQuY2hhbm5lbCA9IChwcml2LT5jaGFubmVsICYgMHg3Zik7CisKKwlhdG1lbF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EX1N0YXJ0LCAmY21kLCBzaXplb2YoY21kKSk7IAorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfYmVhY29uX3Byb2JlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgY2FwYWJpbGl0eSwgdTggY2hhbm5lbCkKK3sKKwlpbnQgcmVqb2luID0gMDsKKwlpbnQgbmV3ID0gY2FwYWJpbGl0eSAgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1Nob3J0UHJlYW1ibGUgPyAKKwkJU0hPUlRfUFJFQU1CTEUgOiBMT05HX1BSRUFNQkxFOworCisJaWYgKHByaXYtPnByZWFtYmxlICE9IG5ldykgeworCQlwcml2LT5wcmVhbWJsZSA9IG5ldzsKKwkJcmVqb2luID0gMTsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsIExPQ0FMX01JQl9QUkVBTUJMRV9UWVBFLCBuZXcpOworCX0KKwkJCisJaWYgKHByaXYtPmNoYW5uZWwgIT0gY2hhbm5lbCkgeworCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKwkJcmVqb2luID0gMTsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX0NIQU5ORUxfUE9TLCBjaGFubmVsKTsKKwl9CisJCisJaWYgKHJlam9pbikgeworCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkJCisJCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQkJam9pbihwcml2LCBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJCWVsc2UgCisJCQlqb2luKHByaXYsIEJTU19UWVBFX0FEX0hPQyk7CisJfSAKK30KKworIAorc3RhdGljIHZvaWQgc2VuZF9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hhbGxlbmdlX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXN0cnVjdCBhdXRoX2JvZHkgYXV0aDsKKwkKKwloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMl8xMV9GVFlQRV9NR01UIHwgSUVFRTgwMl8xMV9TVFlQRV9BVVRIKTsgCisJaGVhZGVyLmR1cmF0aW9uX2lkCT0gY3B1X3RvX2xlMTYoMHg4MDAwKTsJCisJaGVhZGVyLnNlcV9jdGwgPSAwOworCW1lbWNweShoZWFkZXIuYWRkcjEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJbWVtY3B5KGhlYWRlci5hZGRyMiwgcHJpdi0+ZGV2LT5kZXZfYWRkciwgNik7CisJbWVtY3B5KGhlYWRlci5hZGRyMywgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkKKwlpZiAocHJpdi0+d2VwX2lzX29uKSB7CisJCWF1dGguYWxnID0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQUFOX1NIQVJFREtFWSk7IAorCQkvKiBubyBXRVAgZm9yIGF1dGhlbnRpY2F0aW9uIGZyYW1lcyB3aXRoIFRyU2VxTm8gMSAqLworCQlpZiAocHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSAhPSAxKQorCQkJaGVhZGVyLmZyYW1lX2N0bCB8PSAgY3B1X3RvX2xlMTYoSUVFRTgwMl8xMV9GQ1RMX1dFUCk7IAorCX0gZWxzZSB7CisJCWF1dGguYWxnID0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQUFOX09QRU5TWVNURU0pOworCX0KKworCWF1dGguc3RhdHVzID0gMDsKKwlhdXRoLnRyYW5zX3NlcSA9IGNwdV90b19sZTE2KHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0pOworCXByaXYtPkV4cGVjdGVkQXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSsxOyAKKwlwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtICs9IDI7CisJCisJaWYgKGNoYWxsZW5nZV9sZW4gIT0gMCkJeworCQlhdXRoLmVsX2lkID0gMTY7IC8qIGNoYWxsZW5nZV90ZXh0ICovCisJCWF1dGguY2hhbGxfdGV4dF9sZW4gPSBjaGFsbGVuZ2VfbGVuOworCQltZW1jcHkoYXV0aC5jaGFsbF90ZXh0LCBjaGFsbGVuZ2UsIGNoYWxsZW5nZV9sZW4pOworCQlhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHByaXYsICZoZWFkZXIsICh1OCAqKSZhdXRoLCA4ICsgY2hhbGxlbmdlX2xlbik7CisJfSBlbHNlIHsKKwkJYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCAodTggKikmYXV0aCwgNik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3Qoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBpc19yZWFzc29jKQoreworCXU4ICpzc2lkX2VsX3A7CisJaW50IGJvZHlzaXplOworCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJc3RydWN0IGFzc19yZXFfZm9ybWF0IHsKKwkJdTE2IGNhcGFiaWxpdHk7CisJCXUxNiBsaXN0ZW5faW50ZXJ2YWw7IAorCQl1OCBhcFs2XTsgLyogbm90aGluZyBhZnRlciBoZXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgKi8KKwkJdTggc3NpZF9lbF9pZDsKKwkJdTggc3NpZF9sZW47CisJCXU4IHNzaWRbTUFYX1NTSURfTEVOR1RIXTsKKwkJdTggc3VwX3JhdGVzX2VsX2lkOworCQl1OCBzdXBfcmF0ZXNfbGVuOworCQl1OCByYXRlc1s0XTsKKwl9IGJvZHk7CisJCQorCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyXzExX0ZUWVBFX01HTVQgfCAKKwkJKGlzX3JlYXNzb2MgPyBJRUVFODAyXzExX1NUWVBFX1JFQVNTT0NfUkVRIDogSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVEpKTsKKwloZWFkZXIuZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOworCWhlYWRlci5zZXFfY3RsID0gMDsKKworCW1lbWNweShoZWFkZXIuYWRkcjEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7IAorCW1lbWNweShoZWFkZXIuYWRkcjIsIHByaXYtPmRldi0+ZGV2X2FkZHIsIDYpOworCW1lbWNweShoZWFkZXIuYWRkcjMsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7IAorCisJYm9keS5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQ0FQQUJJTElUWV9FU1MpOworCWlmIChwcml2LT53ZXBfaXNfb24pCisJCWJvZHkuY2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9DQVBBQklMSVRZX1ByaXZhY3kpOworCWlmIChwcml2LT5wcmVhbWJsZSA9PSBTSE9SVF9QUkVBTUJMRSkKKwkJYm9keS5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfU2hvcnRQcmVhbWJsZSk7CisKKwlib2R5Lmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KHByaXYtPmxpc3Rlbl9pbnRlcnZhbCAqIHByaXYtPmJlYWNvbl9wZXJpb2QpOworCQorCS8qIGN1cnJlbnQgQVAgYWRkcmVzcyAtIG9ubHkgaW4gcmVhc3NvYyBmcmFtZSAqLworCWlmIChpc19yZWFzc29jKSB7CisJCW1lbWNweShib2R5LmFwLCAgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkJc3NpZF9lbF9wID0gKHU4ICopJmJvZHkuc3NpZF9lbF9pZDsKKwkJYm9keXNpemUgPSAxOCArIHByaXYtPlNTSURfc2l6ZTsKKwl9IGVsc2UgeworCQlzc2lkX2VsX3AgPSAodTggKikmYm9keS5hcFswXTsKKwkJYm9keXNpemUgPSAxMiArIHByaXYtPlNTSURfc2l6ZTsKKwl9CisJCQorCXNzaWRfZWxfcFswXT0gQzgwMjExX01HTVRfRWxlbWVudElEX1NTSUQ7CisJc3NpZF9lbF9wWzFdID0gcHJpdi0+U1NJRF9zaXplOworCW1lbWNweShzc2lkX2VsX3AgKyAyLCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCXNzaWRfZWxfcFsyICsgcHJpdi0+U1NJRF9zaXplXSA9IEM4MDIxMV9NR01UX0VsZW1lbnRJRF9TdXBwb3J0ZWRSYXRlczsKKwlzc2lkX2VsX3BbMyArIHByaXYtPlNTSURfc2l6ZV0gPSA0OyAvKiBsZW4gb2Ygc3Vwb3J0ZWQgcmF0ZXMgKi8KKwltZW1jcHkoc3NpZF9lbF9wICsgNCArIHByaXYtPlNTSURfc2l6ZSwgYXRtZWxfYmFzaWNfcmF0ZXMsIDQpOworCisJYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCAodm9pZCAqKSZib2R5LCBib2R5c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZnJhbWVfZnJvbV9jdXJyZW50X2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIpCit7CisJaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMpCisJCXJldHVybiBtZW1jbXAoaGVhZGVyLT5hZGRyMywgcHJpdi0+Q3VycmVudEJTU0lELCA2KSA9PSAwOworCWVsc2UKKwkJcmV0dXJuIG1lbWNtcChoZWFkZXItPmFkZHIyLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgcmV0cmlldmVfYnNzKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCWludCBtYXhfcnNzaSA9IC0xMjg7CisJaW50IG1heF9pbmRleCA9IC0xOworCQorCWlmIChwcml2LT5CU1NfbGlzdF9lbnRyaWVzID09IDApCisJCXJldHVybiAtMTsKKwkJCQorCWlmIChwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJLyogU2VsZWN0IGEgQlNTIHdpdGggdGhlIG1heC1SU1NJIGJ1dCBvZiB0aGUgc2FtZSB0eXBlIGFuZCBvZiB0aGUgc2FtZSBXRVAgbW9kZQorCQkgICBhbmQgdGhhdCBpdCBpcyBub3QgbWFya2VkIGFzICdiYWQnIChpLmUuIHdlIGhhZCBwcmV2aW91c2x5IGZhaWxlZCB0byBjb25uZWN0IHRvCisJCSAgIHRoaXMgQlNTIHdpdGggdGhlIHNldHRpbmdzIHRoYXQgd2UgY3VycmVudGx5IHVzZSkgKi8KKwkJcHJpdi0+Y3VycmVudF9CU1MgPSAwOworCQlmb3IoaT0wOyBpPHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgeyAKKwkJCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBwcml2LT5CU1NpbmZvW2ldLkJTU3R5cGUgJiYKKwkJCSAgICAoKCFwcml2LT53ZXBfaXNfb24gJiYgIXByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApIHx8IAorCQkJICAgICAocHJpdi0+d2VwX2lzX29uICYmIHByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApKSAmJgorCQkJICAgICEocHJpdi0+QlNTaW5mb1tpXS5jaGFubmVsICYgMHg4MCkpIHsKKwkJCQltYXhfcnNzaSA9IHByaXYtPkJTU2luZm9baV0uUlNTSTsKKwkJCQlwcml2LT5jdXJyZW50X0JTUyA9IG1heF9pbmRleCA9IGk7CisJCQl9CisJCQkKKwkJfQorCQlyZXR1cm4gbWF4X2luZGV4OworCX0KKwkJCisJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKHByaXYtPlNTSURfc2l6ZSA9PSBwcml2LT5CU1NpbmZvW2ldLlNTSURzaXplICYmCisJCSAgICBtZW1jbXAocHJpdi0+U1NJRCwgcHJpdi0+QlNTaW5mb1tpXS5TU0lELCBwcml2LT5TU0lEX3NpemUpID09IDAgJiYKKwkJICAgIHByaXYtPm9wZXJhdGluZ19tb2RlID09IHByaXYtPkJTU2luZm9baV0uQlNTdHlwZSAmJgorCQkgICAgYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChwcml2LCBwcml2LT5CU1NpbmZvW2ldLmNoYW5uZWwpID09IDApIHsKKwkJCWlmIChwcml2LT5CU1NpbmZvW2ldLlJTU0kgPj0gbWF4X3Jzc2kpIHsKKwkJCQltYXhfcnNzaSA9IHByaXYtPkJTU2luZm9baV0uUlNTSTsKKwkJCQltYXhfaW5kZXggPSBpOworCQkJfQorCQl9CisJfQorCXJldHVybiBtYXhfaW5kZXg7Cit9CisKKworc3RhdGljIHZvaWQgc3RvcmVfYnNzX2luZm8oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorCQkJICAgdTE2IGNhcGFiaWxpdHksIHUxNiBiZWFjb25fcGVyaW9kLCB1OCBjaGFubmVsLCB1OCByc3NpLCAKKwkJCSAgIHU4IHNzaWRfbGVuLCB1OCAqc3NpZCwgaW50IGlzX2JlYWNvbikKK3sKKwl1OCAqYnNzID0gY2FwYWJpbGl0eSAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTID8gaGVhZGVyLT5hZGRyMiA6IGhlYWRlci0+YWRkcjM7CisJaW50IGksIGluZGV4OworCQkKKwlmb3IgKGluZGV4ID0gLTEsIGkgPSAwOyBpIDwgcHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSAKKwkJaWYgKG1lbWNtcChic3MsIHByaXYtPkJTU2luZm9baV0uQlNTSUQsIDYpID09IDApIAorCQkJaW5kZXggPSBpOworCisgICAgICAgIC8qIElmIHdlIHByb2Nlc3MgYSBwcm9iZSBhbmQgYW4gZW50cnkgZnJvbSB0aGlzIEJTUyBleGlzdHMgCisJICAgd2Ugd2lsbCB1cGRhdGUgdGhlIEJTUyBlbnRyeSB3aXRoIHRoZSBpbmZvIGZyb20gdGhpcyBCU1MuCisJICAgSWYgd2UgcHJvY2VzcyBhIGJlYWNvbiB3ZSB3aWxsIG9ubHkgdXBkYXRlIFJTU0kgKi8KKworCWlmIChpbmRleCA9PSAtMSkgeworCQlpZiAocHJpdi0+QlNTX2xpc3RfZW50cmllcyA9PSBNQVhfQlNTX0VOVFJJRVMpCisJCQlyZXR1cm47CisJCWluZGV4ID0gcHJpdi0+QlNTX2xpc3RfZW50cmllcysrOworCQltZW1jcHkocHJpdi0+QlNTaW5mb1tpbmRleF0uQlNTSUQsIGJzcywgNik7CisJCXByaXYtPkJTU2luZm9baW5kZXhdLlJTU0kgPSByc3NpOworCX0gZWxzZSB7CisJCWlmIChyc3NpID4gcHJpdi0+QlNTaW5mb1tpbmRleF0uUlNTSSkKKwkJCXByaXYtPkJTU2luZm9baW5kZXhdLlJTU0kgPSByc3NpOworCQlpZiAoaXNfYmVhY29uKQorCQkJcmV0dXJuOworCX0KKworCXByaXYtPkJTU2luZm9baW5kZXhdLmNoYW5uZWwgPSBjaGFubmVsOworCXByaXYtPkJTU2luZm9baW5kZXhdLmJlYWNvbl9wZXJpb2QgPSBiZWFjb25fcGVyaW9kOworCXByaXYtPkJTU2luZm9baW5kZXhdLlVzaW5nV0VQID0gY2FwYWJpbGl0eSAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfUHJpdmFjeTsKKwltZW1jcHkocHJpdi0+QlNTaW5mb1tpbmRleF0uU1NJRCwgc3NpZCwgc3NpZF9sZW4pOworCXByaXYtPkJTU2luZm9baW5kZXhdLlNTSURzaXplID0gc3NpZF9sZW47CisKKwlpZiAoY2FwYWJpbGl0eSAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfSUJTUykKKwkJcHJpdi0+QlNTaW5mb1tpbmRleF0uQlNTdHlwZSA9IElXX01PREVfQURIT0M7CisJZWxzZSBpZiAoY2FwYWJpbGl0eSAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTKQorCQlwcml2LT5CU1NpbmZvW2luZGV4XS5CU1N0eXBlID1JV19NT0RFX0lORlJBOworCQorCXByaXYtPkJTU2luZm9baW5kZXhdLnByZWFtYmxlID0gY2FwYWJpbGl0eSAgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1Nob3J0UHJlYW1ibGUgPyAKKwkJU0hPUlRfUFJFQU1CTEUgOiBMT05HX1BSRUFNQkxFOworfQorCitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBmcmFtZV9sZW4pCit7CisJc3RydWN0IGF1dGhfYm9keSAqYXV0aCA9IChzdHJ1Y3QgYXV0aF9ib2R5ICopcHJpdi0+cnhfYnVmOworCXUxNiBzdGF0dXMgPSBsZTE2X3RvX2NwdShhdXRoLT5zdGF0dXMpOworCXUxNiB0cmFuc19zZXFfbm8gPSBsZTE2X3RvX2NwdShhdXRoLT50cmFuc19zZXEpOworCQorCWlmIChzdGF0dXMgPT0gQzgwMjExX01HTVRfU0NfU3VjY2VzcyAmJiAhcHJpdi0+d2VwX2lzX29uKSB7IAorCQkvKiBubyBXRVAgKi8KKwkJaWYgKHByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQpIHsKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORyk7CisJCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HKTsKKwkJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAwKTsKKwkJCXJldHVybjsKKwkJfSAKKwl9CisJCQorCWlmIChzdGF0dXMgPT0gQzgwMjExX01HTVRfU0NfU3VjY2VzcyAmJiBwcml2LT53ZXBfaXNfb24pIHsgCisJCS8qIFdFUCAqLworCQlpZiAodHJhbnNfc2VxX25vICE9IHByaXYtPkV4cGVjdGVkQXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtKQorCQkJcmV0dXJuOworCQkJCQorCQlpZiAodHJhbnNfc2VxX25vID09IDB4MDAwMiAmJgorCQkgICAgYXV0aC0+ZWxfaWQgPT0gQzgwMjExX01HTVRfRWxlbWVudElEX0NoYWxsZW5nZVRleHQpIHsKKwkJCXNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChwcml2LCBhdXRoLT5jaGFsbF90ZXh0LCBhdXRoLT5jaGFsbF90ZXh0X2xlbik7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICh0cmFuc19zZXFfbm8gPT0gMHgwMDA0KSB7CisJCQlpZihwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkKSB7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HKTsKKwkJCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HKTsKKwkJCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJCQkJcmV0dXJuOworCQkJfSAKKwkJfQorCX0JCQkKKwkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX0F1dGhBbGdOb3RTdXBwb3J0ZWQgJiYgcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTKSB7CisJCWludCBic3NfaW5kZXg7CisJCQorCQlwcml2LT5CU1NpbmZvWyhpbnQpKHByaXYtPmN1cnJlbnRfQlNTKV0uY2hhbm5lbCB8PSAweDgwOworCQkKKwkJaWYgKChic3NfaW5kZXggID0gcmV0cmlldmVfYnNzKHByaXYpKSAhPSAtMSkgeworCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgYnNzX2luZGV4KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwkKKwlwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKK30KKworc3RhdGljIHZvaWQgYXNzb2NpYXRlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgZnJhbWVfbGVuLCB1MTYgc3VidHlwZSkKK3sKKwlzdHJ1Y3QgYXNzX3Jlc3BfZm9ybWF0IHsKKwkJdTE2IGNhcGFiaWxpdHk7CisJCXUxNiBzdGF0dXM7CisJCXUxNiBhc3NfaWQ7CisJCXU4IGVsX2lkOworCQl1OCBsZW5ndGg7CisJCXU4IHJhdGVzWzRdOworCX0gKmFzc19yZXNwID0gKHN0cnVjdCBhc3NfcmVzcF9mb3JtYXQgKilwcml2LT5yeF9idWY7CisJCisgICAgICAgCXUxNiBzdGF0dXMgPSBsZTE2X3RvX2NwdShhc3NfcmVzcC0+c3RhdHVzKTsKKwl1MTYgYXNzX2lkID0gbGUxNl90b19jcHUoYXNzX3Jlc3AtPmFzc19pZCk7CisgICAJdTE2IHJhdGVzX2xlbiA9IGFzc19yZXNwLT5sZW5ndGggPiA0ID8gNCA6IGFzc19yZXNwLT5sZW5ndGg7CisJCisJaWYgKGZyYW1lX2xlbiA8IDggKyByYXRlc19sZW4pCisJCXJldHVybjsKKwkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MpIHsKKwkJaWYgKHN1YnR5cGUgPT0gQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVTUE9OU0UpCisJCQlwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCWVsc2UKKwkJCXByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkKKwkJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfU1RBVElPTl9JRF9QT1MsIGFzc19pZCAmIDB4M2ZmZik7CisJCWF0bWVsX3NldF9taWIocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JBVEVfU0VUX1BPUywgYXNzX3Jlc3AtPnJhdGVzLCByYXRlc19sZW4pOworCQlpZiAocHJpdi0+cG93ZXJfbW9kZSA9PSAwKSB7CisJCQlwcml2LT5saXN0ZW5faW50ZXJ2YWwgPSAxOworCQkJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9QU19NT0RFX1BPUywgIEFDVElWRV9NT0RFKTsKKwkJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MsIDEpOworCQl9IGVsc2UgeworCQkJcHJpdi0+bGlzdGVuX2ludGVydmFsID0gMjsKKwkJCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsICBQU19NT0RFKTsKKwkJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MsIDIpOworCQl9CisJCQorCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAxOworCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMTsKKwkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHN1YnR5cGUgPT0gQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVTUE9OU0UgJiYKKwkgICAgc3RhdHVzICE9IEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZEJTU1JhdGUgJiYKKwkgICAgc3RhdHVzICE9IEM4MDIxMV9NR01UX1NDX1N1cHBvcnRDYXBhYmlsaXRpZXMgJiYKKwkgICAgcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPCBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQltb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQlwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJCXJldHVybjsKKwl9CisJCQorCWlmIChzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVTUE9OU0UgJiYKKwkgICAgc3RhdHVzICE9IEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZEJTU1JhdGUgJiYKKwkgICAgc3RhdHVzICE9IEM4MDIxMV9NR01UX1NDX1N1cHBvcnRDYXBhYmlsaXRpZXMgJiYKKwkgICAgcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPCBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQltb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQlwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAxKTsKKwkJcmV0dXJuOworCX0KKwkKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCAgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQorCWlmKHByaXYtPmNvbm5lY3RfdG9fYW55X0JTUykgeworCQlpbnQgYnNzX2luZGV4OworCQlwcml2LT5CU1NpbmZvWyhpbnQpKHByaXYtPmN1cnJlbnRfQlNTKV0uY2hhbm5lbCB8PSAweDgwOworCQkKKwkJaWYgKChic3NfaW5kZXggPSByZXRyaWV2ZV9ic3MocHJpdikpICE9IC0xKSAKKwkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCQorCX0KK30KKwordm9pZCBhdG1lbF9qb2luX2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGJzc19pbmRleCkKK3sKKwlzdHJ1Y3QgYnNzX2luZm8gKmJzcyA9ICAmcHJpdi0+QlNTaW5mb1tic3NfaW5kZXhdOworCisJbWVtY3B5KHByaXYtPkN1cnJlbnRCU1NJRCwgYnNzLT5CU1NJRCwgNik7CisJbWVtY3B5KHByaXYtPlNTSUQsIGJzcy0+U1NJRCwgcHJpdi0+U1NJRF9zaXplID0gYnNzLT5TU0lEc2l6ZSk7CisKKwkvKiBUaGUgV1BBIHN0dWZmIGNhcmVzIGFib3V0IHRoZSBjdXJyZW50IEFQIGFkZHJlc3MgKi8KKwlpZiAocHJpdi0+dXNlX3dwYSkKKwkJYnVpbGRfd3BhX21pYihwcml2KTsKKwkKKwkvKiBXaGVuIHN3aXRjaGluZyB0byBBZEhvYyB0dXJuIE9GRiBQb3dlciBTYXZlIGlmIG5lZWRlZCAqLworCisJaWYgKGJzcy0+QlNTdHlwZSA9PSBJV19NT0RFX0FESE9DICYmCisJICAgIHByaXYtPm9wZXJhdGluZ19tb2RlICE9IElXX01PREVfQURIT0MgJiYKKwkgICAgcHJpdi0+cG93ZXJfbW9kZSkgeworCQlwcml2LT5wb3dlcl9tb2RlID0gMDsKKwkJcHJpdi0+bGlzdGVuX2ludGVydmFsID0gMTsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9QU19NT0RFX1BPUywgIEFDVElWRV9NT0RFKTsKKwkJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUywgMSk7CisJfQorCQkKKwlwcml2LT5vcGVyYXRpbmdfbW9kZSA9IGJzcy0+QlNTdHlwZTsKKwlwcml2LT5jaGFubmVsID0gYnNzLT5jaGFubmVsICYgMHg3ZjsgCQorCXByaXYtPmJlYWNvbl9wZXJpb2QgPSBic3MtPmJlYWNvbl9wZXJpb2Q7CisJCisJaWYgKHByaXYtPnByZWFtYmxlICE9IGJzcy0+cHJlYW1ibGUpIHsKKwkJcHJpdi0+cHJlYW1ibGUgPSBic3MtPnByZWFtYmxlOworCQlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgTE9DQUxfTUlCX1BSRUFNQkxFX1RZUEUsIGJzcy0+cHJlYW1ibGUpOworCX0KKwkKKwlpZiAoIXByaXYtPndlcF9pc19vbiAmJiBic3MtPlVzaW5nV0VQKSB7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCXJldHVybjsKKwl9CisJCQorCWlmIChwcml2LT53ZXBfaXNfb24gJiYgIWJzcy0+VXNpbmdXRVApIHsKKwkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJcmV0dXJuOworCX0KKworCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfSk9JTk5JTkcpOworCQorCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQlqb2luKHByaXYsIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwllbHNlIAorCQlqb2luKHByaXYsIEJTU19UWVBFX0FEX0hPQyk7Cit9CisKKworc3RhdGljIHZvaWQgcmVzdGFydF9zZWFyY2goc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGJzc19pbmRleDsKKwkKKwlpZiAoIXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUykgeworCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCX0gZWxzZSB7CisJCXByaXYtPkJTU2luZm9bKGludCkocHJpdi0+Y3VycmVudF9CU1MpXS5jaGFubmVsIHw9IDB4ODA7CisJCQorCQlpZiAoKGJzc19pbmRleCA9IHJldHJpZXZlX2Jzcyhwcml2KSkgIT0gLTEpIAorCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgYnNzX2luZGV4KTsKKwkJZWxzZQorCQkJYXRtZWxfc2Nhbihwcml2LCAwKTsKKwkJCisJfSAKK30JCisKK3N0YXRpYyB2b2lkIHNtb290aF9yc3NpKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCByc3NpKQoreworCXU4IG9sZCA9IHByaXYtPndzdGF0cy5xdWFsLmxldmVsOworCXU4IG1heF9yc3NpID0gNDI7IC8qIDUwMi1ybWZkLXJldmQgbWF4IGJ5IGV4cGVyaW1lbnQsIGRlZmF1bHQgZm9yIG5vdyAqLworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJCWNhc2UgQVRNRUxfRldfVFlQRV81MDJFOgorCQkJbWF4X3Jzc2kgPSA2MzsgLyogNTAyLXJtZmQtcmV2ZSBtYXggYnkgZXhwZXJpbWVudCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyc3NpID0gcnNzaSAqIDEwMCAvIG1heF9yc3NpOworCWlmKChyc3NpICsgb2xkKSAlIDIpCisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gICgocnNzaSArIG9sZCkvMikgKyAxOworCWVsc2UKKwkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgPSAgKChyc3NpICsgb2xkKS8yKTsJCQorCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9MRVZFTF9VUERBVEVEOworCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfTEVWRUxfSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc21vb3RoX3F1YWwoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lX2RpZmYgPSAoamlmZmllcyAtIHByaXYtPmxhc3RfcXVhbCkvSFo7CisJd2hpbGUgKHRpbWVfZGlmZi0tKSB7CisJCXByaXYtPmxhc3RfcXVhbCArPSBIWjsKKwkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IHByaXYtPndzdGF0cy5xdWFsLnF1YWwvMjsKKwkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCArPSAKKwkJCXByaXYtPmJlYWNvbnNfdGhpc19zZWMgKiBwcml2LT5iZWFjb25fcGVyaW9kICogKHByaXYtPndzdGF0cy5xdWFsLmxldmVsICsgMTAwKSAvIDQwMDA7CisJCXByaXYtPmJlYWNvbnNfdGhpc19zZWMgPSAwOworCX0KKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9VUERBVEVEOworCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfUVVBTF9JTlZBTElEOworfQorCisvKiBkZWFscyB3aXRoIGluY29taW5nIG1hbmFnbWVudCBmcmFtZXMuICovCitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCisJCSAgICAgIHUxNiBmcmFtZV9sZW4sIHU4IHJzc2kpCit7CisJdTE2IHN1YnR5cGU7CisJCisJc3dpdGNoIChzdWJ0eXBlID0gbGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpICYgSUVFRTgwMl8xMV9GQ1RMX1NUWVBFKSB7CisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0JFQUNPTiA6CisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX1Byb2JlUmVzcG9uc2U6CisJCQorCQkvKiBiZWFjb24gZnJhbWUgaGFzIG11bHRpcGxlIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMgLQorCQkgICBuZXZlciBsZXQgYW4gZW5naW5lZXIgbG9vc2Ugd2l0aCBhIGRhdGEgc3RydWN0dXJlIGRlc2lnbi4gKi8KKwkJeworCQkJc3RydWN0IGJlYWNvbl9mb3JtYXQgeworCQkJCXU2NCB0aW1lc3RhbXA7CisJCQkJdTE2IGludGVydmFsOworCQkJCXUxNiBjYXBhYmlsaXR5OworCQkJCXU4IHNzaWRfZWxfaWQ7CisJCQkJdTggc3NpZF9sZW5ndGg7CisJCQkJLyogc3NpZCBoZXJlICovCisJCQkJdTggcmF0ZXNfZWxfaWQ7CisJCQkJdTggcmF0ZXNfbGVuZ3RoOworCQkJCS8qIHJhdGVzIGhlcmUgKi8KKwkJCQl1OCBkc19lbF9pZDsKKwkJCQl1OCBkc19sZW5ndGg7CisJCQkJLyogZHMgaGVyZSAqLworCQkJfSAqYmVhY29uID0gKHN0cnVjdCBiZWFjb25fZm9ybWF0ICopcHJpdi0+cnhfYnVmOworCQkJCisJCQl1OCBjaGFubmVsLCByYXRlc19sZW5ndGgsIHNzaWRfbGVuZ3RoOworCQkJdTY0IHRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KGJlYWNvbi0+dGltZXN0YW1wKTsKKwkJCXUxNiBiZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiZWFjb24tPmludGVydmFsKTsKKwkJCXUxNiBjYXBhYmlsaXR5ID0gbGUxNl90b19jcHUoYmVhY29uLT5jYXBhYmlsaXR5KTsKKwkJCXU4ICpiZWFjb25wID0gcHJpdi0+cnhfYnVmOworCQkJc3NpZF9sZW5ndGggPSBiZWFjb24tPnNzaWRfbGVuZ3RoOworCQkJLyogdGhpcyBibG93cyBjaHVua3MuICovCisJCQlpZiAoZnJhbWVfbGVuIDwgMTQgfHwgZnJhbWVfbGVuIDwgc3NpZF9sZW5ndGggKyAxNSkgCisJCQkJcmV0dXJuOworCQkJcmF0ZXNfbGVuZ3RoID0gYmVhY29ucFtiZWFjb24tPnNzaWRfbGVuZ3RoICsgMTVdOworCQkJaWYgKGZyYW1lX2xlbiA8IHNzaWRfbGVuZ3RoICsgcmF0ZXNfbGVuZ3RoICsgMTgpCisJCQkJcmV0dXJuOworCQkJaWYgKHNzaWRfbGVuZ3RoID4gIE1BWF9TU0lEX0xFTkdUSCkKKwkJCQlyZXR1cm47CisJCQljaGFubmVsID0gYmVhY29ucFtzc2lkX2xlbmd0aCArIHJhdGVzX2xlbmd0aCArIDE4XTsKKwkJICAgICAgIAorCQkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQkJCXNtb290aF9yc3NpKHByaXYsIHJzc2kpOworCQkJCWlmIChpc19mcmFtZV9mcm9tX2N1cnJlbnRfYnNzKHByaXYsIGhlYWRlcikpIHsgCisJCQkJCXByaXYtPmJlYWNvbnNfdGhpc19zZWMrKzsKKwkJCQkJYXRtZWxfc21vb3RoX3F1YWwocHJpdik7CisJCQkJCWlmIChwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXApIHsKKwkJCQkJCS8qIE5vdGUgdHJ1bmNhdGUgdGhpcyB0byAzMiBiaXRzIC0ga2VybmVsIGNhbid0IGRpdmlkZSBhIGxvbmcgbG9uZyAqLworCQkJCQkJdTMyIGJlYWNvbl9kZWxheSA9IHRpbWVzdGFtcCAtIHByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcDsKKwkJCQkJCWludCBiZWFjb25zID0gYmVhY29uX2RlbGF5IC8gKGJlYWNvbl9pbnRlcnZhbCAqIDEwMDApOworCQkJCQkJaWYgKGJlYWNvbnMgPiAxKQorCQkJCQkJCXByaXYtPndzdGF0cy5taXNzLmJlYWNvbiArPSBiZWFjb25zIC0gMTsKKwkJCQkJfQorCQkJCQlwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCQkJCWhhbmRsZV9iZWFjb25fcHJvYmUocHJpdiwgY2FwYWJpbGl0eSwgY2hhbm5lbCk7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1NDQU5OSU5HICkgCisJCQkJc3RvcmVfYnNzX2luZm8ocHJpdiwgaGVhZGVyLCBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGNoYW5uZWwsCisJCQkJCSAgICAgICByc3NpLCBzc2lkX2xlbmd0aCwgJmJlYWNvbi0+cmF0ZXNfZWxfaWQsCisJCQkJCSAgICAgICBzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfQkVBQ09OKSA7CisJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9BdXRoZW50aWNhdGlvbjoKKworCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0FVVEhFTlRJQ0FUSU5HKQorCQkJYXV0aGVudGljYXRlKHByaXYsIGZyYW1lX2xlbik7CisJCisJCWJyZWFrOworCQkKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFOgorCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9SRUFTU19SRVNQT05TRToKKwkJCisJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkcgfHwgCisJCSAgICBwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORykKKwkJCWFzc29jaWF0ZShwcml2LCBmcmFtZV9sZW4sIHN1YnR5cGUpOworCQkKKwkJYnJlYWs7CisKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfRElTQVNTT1NJQVRJT046CisJCWlmIChwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgJiYgCisJCSAgICBwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmIAorCQkgICAgaXNfZnJhbWVfZnJvbV9jdXJyZW50X2Jzcyhwcml2LCBoZWFkZXIpKSB7CisJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMDsKKwkJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCQkKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfSk9JTk5JTkcpOworCQkJam9pbihwcml2LCBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJCX0KKwkJCisJCWJyZWFrOworCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0RlYXV0aGVudGljYXRpb246CisJCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCSAgICBpc19mcmFtZV9mcm9tX2N1cnJlbnRfYnNzKHByaXYsIGhlYWRlcikpIHsKKwkJCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSAwOworCisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQl9CisJCQorCQlicmVhazsKKwl9Cit9CisKKy8qIHJ1biB3aGVuIHRpbWVyIGV4cGlyZXMgKi8KK3N0YXRpYyB2b2lkIGF0bWVsX21hbmFnZW1lbnRfdGltZXIodV9sb25nIGEpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgYTsKKyAgc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAKKyAgLyogQ2hlY2sgaWYgdGhlIGNhcmQgaGFzIGJlZW4geWFua2VkLiAqLworICBpZiAocHJpdi0+Y2FyZCAmJiBwcml2LT5wcmVzZW50X2NhbGxiYWNrICYmIAorICAgICAgISgqcHJpdi0+cHJlc2VudF9jYWxsYmFjaykocHJpdi0+Y2FyZCkpCisJICByZXR1cm47CisgIAorICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCisgIHN3aXRjaCAocHJpdi0+c3RhdGlvbl9zdGF0ZSkgeworCSAgCisgIGNhc2UgU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORzoKKwkgIGlmIChwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA+PSBNQVhfQVVUSEVOVElDQVRJT05fUkVUUklFUykgeworCQkgIGF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCSAgcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJICBwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCSAgcmVzdGFydF9zZWFyY2gocHJpdik7CisJICB9IGVsc2UgeworCQkgIHByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCSAgcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMTsKKwkJICBtb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQkgIHNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChwcml2LCBOVUxMLCAwKTsKKwkgIH0KKwkgIAorCSAgYnJlYWs7CisKKyAgY2FzZSBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HOgorCSAgaWYgKHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID09IE1BWF9BU1NPQ0lBVElPTl9SRVRSSUVTKSB7CisJCSAgYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJICBwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJICByZXN0YXJ0X3NlYXJjaChwcml2KTsKKwkgIH0gZWxzZSB7CisJCSAgcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJICBtb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQkgIHNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAwKTsKKwkgIH0KKworCSAgYnJlYWs7CisJCSAgCisgIGNhc2UgU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HOgkKKwkgIGlmIChwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID09IE1BWF9BU1NPQ0lBVElPTl9SRVRSSUVTKSB7CisJCSAgYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJICBwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkgIHByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkgIHJlc3RhcnRfc2VhcmNoKHByaXYpOworCSAgfSBlbHNlIHsKKwkJICBwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCSAgbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJICBzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMSk7CisJICB9CisKKwkgIGJyZWFrOworICAKKyAgZGVmYXVsdDoKKwkgIGJyZWFrOworICB9CisgIAorICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7Cit9CisgIAorc3RhdGljIHZvaWQgYXRtZWxfY29tbWFuZF9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJdTggc3RhdHVzID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1NUQVRVU19PRkZTRVQpKTsKKwl1OCBjb21tYW5kID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX0NPTU1BTkRfT0ZGU0VUKSk7CisJaW50IGZhc3Rfc2NhbjsKKwkKKwlpZiAoc3RhdHVzID09IENNRF9TVEFUVVNfSURMRSB8fCAKKwkgICAgc3RhdHVzID09IENNRF9TVEFUVVNfSU5fUFJPR1JFU1MpCisJCXJldHVybjsKKworCXN3aXRjaCAoY29tbWFuZCl7CisKKwljYXNlIENNRF9TdGFydDoKKwkJaWYgKHN0YXR1cyA9PSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkOworCQkJYXRtZWxfZ2V0X21pYihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MsCisJCQkJICAgICAgKHU4ICopcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCQl9CQkJCisJCWJyZWFrOworCQkKKwljYXNlIENNRF9TY2FuOgorCQlmYXN0X3NjYW4gPSBwcml2LT5mYXN0X3NjYW47CisJCXByaXYtPmZhc3Rfc2NhbiA9IDA7CisJCQorCQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCX0gZWxzZSB7CisJCQlpbnQgYnNzX2luZGV4ID0gcmV0cmlldmVfYnNzKHByaXYpOworCQkJaWYgKGJzc19pbmRleCAhPSAtMSkgeworCQkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCQl9IGVsc2UgaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MgJiYgCisJCQkJICAgcHJpdi0+U1NJRF9zaXplICE9IDApIHsKKwkJCQlzdGFydChwcml2LCBCU1NfVFlQRV9BRF9IT0MpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5mYXN0X3NjYW4gPSAhZmFzdF9zY2FuOworCQkJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCQl9CisJCQlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0NPTVBMRVRFRDsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBDTURfU2l0ZVN1cnZleToKKwkJcHJpdi0+ZmFzdF9zY2FuID0gMDsKKwkJCisJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCXJldHVybjsKKwkJCisJCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfQ09NUExFVEVEOworCQlpZiAocHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkKSB7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQURZKTsJCQkJCisJCX0gZWxzZSB7CisJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTURfSm9pbjoKKwkJaWYgKHN0YXR1cyA9PSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSBwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQ7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0FVVEhFTlRJQ0FUSU5HKTsKKwkJCQkKKwkJCQltb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQkJCXByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSAweDAwMDE7CisJCQkJc2VuZF9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0KHByaXYsIE5VTEwsIDApOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQkKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfd2FrZXVwX2Zpcm13YXJlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBob3N0X2luZm9fc3RydWN0ICppZmFjZSA9ICZwcml2LT5ob3N0X2luZm87CisJdTE2IG1yMSwgbXIzOworCWludCBpOworCisJaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEX1RZUEVfU1BJX0ZMQVNIKQorCQlhdG1lbF9zZXRfZ2NyKHByaXYtPmRldiwgR0NSX1JFTUFQKTsKKwkKKwkvKiB3YWtlIHVwIG9uLWJvYXJkIHByb2Nlc3NvciAqLworCWF0bWVsX2NsZWFyX2djcihwcml2LT5kZXYsIDB4MDA0MCk7CisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEJTUiwgQlNTX1NSQU0pOworCQorCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gQ0FSRF9UWVBFX1NQSV9GTEFTSCkKKwkJbWRlbGF5KDEwMCk7CisKKwkvKiBhbmQgd2FpdCBmb3IgaXQgKi8KKwlmb3IgKGkgPSAgTE9PUF9SRVRSWV9MSU1JVDsgaTsgaS0tKSB7CisJCW1yMSA9IGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMSk7CisJCW1yMyA9IGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMyk7CisJCQorCQlpZiAobXIzICYgTUFDX0JPT1RfQ09NUExFVEUpIAorCQkJYnJlYWs7CisJCWlmIChtcjEgJiBNQUNfQk9PVF9DT01QTEVURSAmJgorCQkgICAgcHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgdG8gYm9vdC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwkJCisJaWYgKChwcml2LT5ob3N0X2luZm9fYmFzZSA9IGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMikpID09IDB4ZmZmZikgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGNhcmQgbWlzc2luZy5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBub3cgY2hlY2sgZm9yIGNvbXBsZXRpb24gb2YgTUFDIGluaXRpYWxpemF0aW9uIHRocm91Z2ggIAorCSAgIHRoZSBGdW5DdHJsIGZpZWxkIG9mIHRoZSBJRkFDRSwgcG9sbCBNUjEgdG8gZGV0ZWN0IGNvbXBsZXRpb24gb2YJICAKKwkgICBNQUMgaW5pdGlhbGl6YXRpb24sIGNoZWNrIGNvbXBsZXRpb24gc3RhdHVzLCBzZXQgaW50ZXJydXB0IG1hc2ssICAKKwkgICBlbmFibGVzIGludGVycnVwdHMgYW5kIGNhbGxzIFR4IGFuZCBSeCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8gIAorCQorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpLCBGVU5DX0NUUkxfSU5JVF9DT01QTEVURSk7CisJCisJZm9yIChpID0gIExPT1BfUkVUUllfTElNSVQ7IGk7IGktLSkgeworCQltcjEgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjEpOworCQltcjMgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjMpOworCQkKKwkJaWYgKG1yMyAmIE1BQ19JTklUX0NPTVBMRVRFKSAKKwkJCWJyZWFrOworCQlpZiAobXIxICYgTUFDX0lOSVRfQ09NUExFVEUgJiYKKwkJICAgIHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkKKwkJCWJyZWFrOworCX0KKwkKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUFDIGZhaWxlZCB0byBpbml0aWFsaXNlLlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIENoZWNrIGZvciBNQUNfSU5JVF9PSyBvbmx5IG9uIHRoZSByZWdpc3RlciB0aGF0IHRoZSBNQUNfSU5JVF9PSyB3YXMgc2V0ICovCisJaWYgKChtcjMgJiBNQUNfSU5JVF9DT01QTEVURSkgJiYKKwkgICAgIShhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjMpICYgTUFDX0lOSVRfT0spKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUFDIGZhaWxlZCBNUjMgc2VsZi10ZXN0LlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgobXIxICYgTUFDX0lOSVRfQ09NUExFVEUpICYmCisJICAgICEoYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIxKSAmIE1BQ19JTklUX09LKSkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgTVIxIHNlbGYtdGVzdC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh1bnNpZ25lZCBjaGFyICopaWZhY2UsIAorCQkJICAgcHJpdi0+aG9zdF9pbmZvX2Jhc2UsIHNpemVvZigqaWZhY2UpKTsKKyAgICAgICAgCisJaWZhY2UtPnR4X2J1ZmZfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnR4X2J1ZmZfcG9zKTsKKwlpZmFjZS0+dHhfYnVmZl9zaXplID0gbGUxNl90b19jcHUoaWZhY2UtPnR4X2J1ZmZfc2l6ZSk7CisJaWZhY2UtPnR4X2Rlc2NfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnR4X2Rlc2NfcG9zKTsKKwlpZmFjZS0+dHhfZGVzY19jb3VudCA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9kZXNjX2NvdW50KTsKKwlpZmFjZS0+cnhfYnVmZl9wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+cnhfYnVmZl9wb3MpOworCWlmYWNlLT5yeF9idWZmX3NpemUgPSBsZTE2X3RvX2NwdShpZmFjZS0+cnhfYnVmZl9zaXplKTsKKwlpZmFjZS0+cnhfZGVzY19wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+cnhfZGVzY19wb3MpOworCWlmYWNlLT5yeF9kZXNjX2NvdW50ID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2Rlc2NfY291bnQpOworCWlmYWNlLT5idWlsZF92ZXJzaW9uID0gbGUxNl90b19jcHUoaWZhY2UtPmJ1aWxkX3ZlcnNpb24pOworCWlmYWNlLT5jb21tYW5kX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT5jb21tYW5kX3Bvcyk7CisJaWZhY2UtPm1ham9yX3ZlcnNpb24gPSBsZTE2X3RvX2NwdShpZmFjZS0+bWFqb3JfdmVyc2lvbik7CisJaWZhY2UtPm1pbm9yX3ZlcnNpb24gPSBsZTE2X3RvX2NwdShpZmFjZS0+bWlub3JfdmVyc2lvbik7CisJaWZhY2UtPmZ1bmNfY3RybCA9IGxlMTZfdG9fY3B1KGlmYWNlLT5mdW5jX2N0cmwpOworCWlmYWNlLT5tYWNfc3RhdHVzID0gbGUxNl90b19jcHUoaWZhY2UtPm1hY19zdGF0dXMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGRldGVybWluZSB0eXBlIG9mIG1lbW9yeSBhbmQgTUFDIGFkZHJlc3MgKi8KK3N0YXRpYyBpbnQgcHJvYmVfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByYyA9IDA7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCSAKKwkvKiByZXNldCBwY2NhcmQgKi8KKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwkKKwlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNDApOworCW1kZWxheSg1MDApOworCQorCWlmIChhdG1lbF9yZWFkMTYoZGV2LCBNUjIpID09IDApIHsKKwkJLyogTm8gc3RvcmVkIGZpcm13YXJlIHNvIGxvYWQgYSBzbWFsbCBzdHViIHdoaWNoIGp1c3QgCisJCSAgIHRlbGxzIHVzIHRoZSBNQUMgYWRkcmVzcyAqLworCQlpbnQgaTsKKwkJcHJpdi0+Y2FyZF90eXBlID0gQ0FSRF9UWVBFX0VFUFJPTTsKKwkJYXRtZWxfd3JpdGUxNihkZXYsIEJTUiwgQlNTX0lSQU0pOworCQlhdG1lbF9jb3B5X3RvX2NhcmQoZGV2LCAwLCBtYWNfcmVhZGVyLCBzaXplb2YobWFjX3JlYWRlcikpOworCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX1JFTUFQKTsKKwkJYXRtZWxfY2xlYXJfZ2NyKHByaXYtPmRldiwgMHgwMDQwKTsKKwkJYXRtZWxfd3JpdGUxNihkZXYsIEJTUiwgQlNTX1NSQU0pOworCQlmb3IgKGkgPSAgTE9PUF9SRVRSWV9MSU1JVDsgaTsgaS0tKSAKKwkJCWlmIChhdG1lbF9yZWFkMTYoZGV2LCBNUjMpICYgTUFDX0JPT1RfQ09NUExFVEUpCisJCQkJYnJlYWs7CisJCWlmIChpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUFDIGZhaWxlZCB0byBib290IE1BQyBhZGRyZXNzIHJlYWRlci5cbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlhdG1lbF9jb3B5X3RvX2hvc3QoZGV2LCBkZXYtPmRldl9hZGRyLCBhdG1lbF9yZWFkMTYoZGV2LCBNUjIpLCA2KTsKKwkJCS8qIGdvdCBhZGRyZXNzLCBub3cgc3F1YXNoIGl0IGFnYWluIHVudGlsIHRoZSBuZXR3b3JrCisJCQkgICBpbnRlcmZhY2UgaXMgb3BlbmVkICovCisJCQlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwkJCXJjID0gMTsKKwkJfQorCX0gZWxzZSBpZiAoYXRtZWxfcmVhZDE2KGRldiwgTVI0KSA9PSAwKSB7CisJCS8qIE1hYyBhZGRyZXNzIGVhc3kgaW4gdGhpcyBjYXNlLiAqLworCQlwcml2LT5jYXJkX3R5cGUgPSBDQVJEX1RZUEVfUEFSQUxMRUxfRkxBU0g7CisJCWF0bWVsX3dyaXRlMTYoZGV2LCAgQlNSLCAxKTsJCisJCWF0bWVsX2NvcHlfdG9faG9zdChkZXYsIGRldi0+ZGV2X2FkZHIsIDB4YzAwMCwgNik7CisJCWF0bWVsX3dyaXRlMTYoZGV2LCAgQlNSLCAweDIwMCk7CisJCXJjID0gMTsKKwl9IGVsc2UgeworCQkvKiBTdGFuZGFyZCBmaXJtd2FyZSBpbiBmbGFzaCwgYm9vdCBpdCB1cCBhbmQgYXNrCisJCSAgIGZvciB0aGUgTWFjIEFkZHJlc3MgKi8KKwkJcHJpdi0+Y2FyZF90eXBlID0gQ0FSRF9UWVBFX1NQSV9GTEFTSDsKKwkJaWYgKGF0bWVsX3dha2V1cF9maXJtd2FyZShwcml2KSkgeworCQkJYXRtZWxfZ2V0X21pYihwcml2LCBNYWNfQWRkcmVzc19NaWJfVHlwZSwgMCwgZGV2LT5kZXZfYWRkciwgNik7CisJCQkKKwkJCS8qIGdvdCBhZGRyZXNzLCBub3cgc3F1YXNoIGl0IGFnYWluIHVudGlsIHRoZSBuZXR3b3JrCisJCQkgICBpbnRlcmZhY2UgaXMgb3BlbmVkICovCisJCQlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwkJCXJjID0gMTsKKwkJfQorCX0KKwkKKwlpZiAocmMpIHsKKwkJaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gMHhGRikgeworCQkJdTggZGVmYXVsdF9tYWNbXSA9IHsweDAwLDB4MDQsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAqKiogSW52YWxpZCBNQUMgYWRkcmVzcy4gVVBHUkFERSBGaXJtd2FyZSAqKioqXG4iLCBkZXYtPm5hbWUpOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGRlZmF1bHRfbWFjLCA2KTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDIGFkZHJlc3MgJS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4OiUuMnhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSApOworCQkKKwl9CisJCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBidWlsZF93ZXBfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQorLyogTW92ZSB0aGUgZW5jeXB0aW9uIGluZm9ybWF0aW9uIG9uIHRoZSBNSUIgc3RydWN0dXJlLgorICAgVGhpcyByb3V0aW5lIGlzIGZvciB0aGUgcHJlLVdQQSBmaXJtd2FyZTogbGF0ZXIgZmlybXdhcmUgaGFzCisgICBhIGRpZmZlcmVudCBmb3JtYXQgTUlCIGFuZCBhIGRpZmZlcmVudCByb3V0aW5lLiAqLworeworCXN0cnVjdCB7IC8qIE5CIHRoaXMgaXMgbWF0Y2hlZCB0byB0aGUgaGFyZHdhcmUsIGRvbid0IGNoYW5nZS4gKi8KKwkJdTggd2VwX2lzX29uOyAgICAgICAgICAgICAgICAgCisJCXU4IGRlZmF1bHRfa2V5OyAvKiAwLi4zICovCisJCXU4IHJlc2VydmVkOworCQl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOworCQkKKwkJdTMyIFdFUElDVl9lcnJvcl9jb3VudDsKKwkJdTMyIFdFUF9leGNsdWRlZF9jb3VudDsKKwkJCisJCXU4IHdlcF9rZXlzW01BWF9FTkNSWVBUSU9OX0tFWVNdWzEzXTsKKyAJCXU4IGVuY3J5cHRpb25fbGV2ZWw7IC8qIDAsIDEsIDIgKi8KKwkJdTggcmVzZXJ2ZWQyWzNdOyAKKwl9IG1pYjsKKwlpbnQgaTsKKworCW1pYi53ZXBfaXNfb24gPSBwcml2LT53ZXBfaXNfb247CisJaWYgKHByaXYtPndlcF9pc19vbikgeworCQlpZiAocHJpdi0+d2VwX2tleV9sZW5bcHJpdi0+ZGVmYXVsdF9rZXldID4gNSkKKwkJCW1pYi5lbmNyeXB0aW9uX2xldmVsID0gMjsKKwkJZWxzZQorCQkJbWliLmVuY3J5cHRpb25fbGV2ZWwgPSAxOwkKKwl9IGVsc2UgeworCQltaWIuZW5jcnlwdGlvbl9sZXZlbCA9IDA7CisJfQorCisJbWliLmRlZmF1bHRfa2V5ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisJbWliLmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSBwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkOworCQorCWZvcihpID0gMDsgaSA8IE1BWF9FTkNSWVBUSU9OX0tFWVM7ICBpKyspCisJCW1lbWNweShtaWIud2VwX2tleXNbaV0sIHByaXYtPndlcF9rZXlzW2ldLCAxMyk7CisJCQorCWF0bWVsX3NldF9taWIocHJpdiwgTWFjX1dlcF9NaWJfVHlwZSwgMCwgKHU4ICopJm1pYiwgc2l6ZW9mKG1pYikpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF93cGFfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCS8qIFRoaXMgaXMgZm9yIHRoZSBsYXRlciAoV1BBIGVuYWJsZWQpIGZpcm13YXJlLiAqLwkgICAKKworCXN0cnVjdCB7IC8qIE5CIHRoaXMgaXMgbWF0Y2hlZCB0byB0aGUgaGFyZHdhcmUsIGRvbid0IGNoYW5nZS4gKi8KKwkJdTggY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW01BWF9FTkNSWVBUSU9OX0tFWVNdW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFXTsKKwkJdTggcmVjZWl2ZXJfYWRkcmVzc1s2XTsKKwkJdTggd2VwX2lzX29uOyAgICAgICAgICAgICAgICAgCisJCXU4IGRlZmF1bHRfa2V5OyAvKiAwLi4zICovCisJCXU4IGdyb3VwX2tleTsKKwkJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwkJdTggZW5jcnlwdGlvbl90eXBlOworCQl1OCByZXNlcnZlZDsKKwkJCisJCXUzMiBXRVBJQ1ZfZXJyb3JfY291bnQ7CisJCXUzMiBXRVBfZXhjbHVkZWRfY291bnQ7CisJCQorCQl1OCBrZXlfUlNDWzRdWzhdOworCX0gbWliOworCQorCWludCBpOworCisJbWliLndlcF9pc19vbiA9IHByaXYtPndlcF9pc19vbjsKKwltaWIuZXhjbHVkZV91bmVuY3J5cHRlZCA9IHByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJbWVtY3B5KG1pYi5yZWNlaXZlcl9hZGRyZXNzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQorCS8qIHplcm8gYWxsIHRoZSBrZXlzIGJlZm9yZSBhZGRpbmcgaW4gdmFsaWQgb25lcy4gKi8KKwltZW1zZXQobWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZSwgMCwgc2l6ZW9mKG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWUpKTsKKwkKKwlpZiAocHJpdi0+d2VwX2lzX29uKSB7CisJCS8qIFRoZXJlJ3MgYSBjb21tZW50IGluIHRoZSBBdG1lbCBjb2RlIHRvIHRoZSBlZmZlY3QgdGhhdCB0aGlzIGlzIG9ubHkgdmFsaWQKKwkJICAgd2hlbiBzdGlsbCB1c2luZyBXRVAsIGl0IG1heSBuZWVkIHRvIGJlIHNldCB0byBzb21ldGhpbmcgdG8gdXNlIFdQQSAqLworCQltZW1zZXQobWliLmtleV9SU0MsIDAsIHNpemVvZihtaWIua2V5X1JTQykpOworCQkKKwkJbWliLmRlZmF1bHRfa2V5ID0gbWliLmdyb3VwX2tleSA9IDI1NTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9FTkNSWVBUSU9OX0tFWVM7IGkrKykgeworCQkJaWYgKHByaXYtPndlcF9rZXlfbGVuW2ldID4gMCkgeworCQkJCW1lbWNweShtaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldLCBwcml2LT53ZXBfa2V5c1tpXSwgTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUpOworCQkJCWlmIChpID09IHByaXYtPmRlZmF1bHRfa2V5KSB7CisJCQkJCW1pYi5kZWZhdWx0X2tleSA9IGk7CisJCQkJCW1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV1bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUtMV0gPSA3OworCQkJCQltaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTJdID0gcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlOyAKKwkJCQl9IGVsc2UgeworCQkJCQltaWIuZ3JvdXBfa2V5ID0gaTsKKwkJCQkJcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlID0gcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlOworCQkJCSAgICAgICAgbWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRS0xXSA9IDE7CisJCQkJCW1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV1bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUtMl0gPSBwcml2LT5ncm91cF9jaXBoZXJfc3VpdGU7CQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobWliLmRlZmF1bHRfa2V5ID09IDI1NSkKKwkJCW1pYi5kZWZhdWx0X2tleSA9IG1pYi5ncm91cF9rZXkgIT0gMjU1ID8gbWliLmdyb3VwX2tleSA6IDA7CisJCWlmIChtaWIuZ3JvdXBfa2V5ID09IDI1NSkKKwkJCW1pYi5ncm91cF9rZXkgPSBtaWIuZGVmYXVsdF9rZXk7CisJCQorCX0KKwkKKwlhdG1lbF9zZXRfbWliKHByaXYsIE1hY19XZXBfTWliX1R5cGUsIDAsICh1OCAqKSZtaWIsIHNpemVvZihtaWIpKTsKK30KKwkJCQkJCitzdGF0aWMgaW50IHJlc2V0X2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJLyogZG8gZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gd2FrZSB1cCB0aGUgaGFyZHdhcmUsIGluY2x1ZGluZworCSAgIHdhaXRpbmcgZm9yIHRoZSBsaWdodG5pbmcgc3RyaWtlIGFuZCB0aHJvd2luZyB0aGUga25pZmUgc3dpdGNoLi4uLgorCisJICAgc2V0IGFsbCB0aGUgTWliIHZhbHVlcyB3aGljaCBtYXR0ZXIgaW4gdGhlIGNhcmQgdG8gbWF0Y2ggCisJICAgdGhlaXIgc2V0dGluZ3MgaW4gdGhlIGF0bWVsX3ByaXZhdGUgc3RydWN0dXJlLiBTb21lIG9mIHRoZXNlCisJICAgY2FuIGJlIGFsdGVyZWQgb24gdGhlIGZseSwgYnV0IG1hbnkgKFdFUCwgaW5mcmFzdHVjdHVyZSBvciBhZC1ob2MpCisJICAgY2FuIG9ubHkgYmUgY2hhbmdlZCBieSB0ZWFyaW5nIGRvd24gdGhlIHdvcmxkIGFuZCBjb21pbmcgYmFjayB0aHJvdWdoCisJICAgaGVyZS4KKworCSAgIFRoaXMgcm91dGluZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXNpbmcgc29tZSAKKwkgICBoYXJkd2FyZS1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIGF0bWVsX3ByaXZhdGUgc3RydWN0dXJlLCAKKwkgICBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoZSBmaXJtd2FyZSdzIGhvc3RpbmZvIHN0dWN0dXJlCisJICAgd2hpY2ggaXMgdGhlIHJvdXRlIGludG8gdGhlIHJlc3Qgb2YgdGhlIGZpcm1hcmUgZGF0YXN0cnVjdHVyZXMuICovCisKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTggY29uZmlndXJhdGlvbjsKKwkKKwkvKiBkYXRhIHRvIGFkZCB0byB0aGUgZmlybXdhcmUgbmFtZXMsIGluIHByaW9yaXR5IG9yZGVyCisJICAgdGhpcyBpbXBsZW1lbmVudHMgZmlybXdhcmUgdmVyc2lvbmluZyAqLworCQorCXN0YXRpYyBjaGFyICpmaXJtd2FyZV9tb2RpZmllcltdID0geworCQkiLXdwYSIsCisJCSIiLAorCQlOVUxMCisJfTsKKwkJCisJLyogcmVzZXQgcGNjYXJkICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBHQ1IsIDB4MDA2MCk7CisJCQorCS8qIHN0b3AgY2FyZCAsIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBHQ1IsIDB4MDA0MCk7CisJCQorCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gQ0FSRF9UWVBFX0VFUFJPTSkgeworCQkvKiBjb3B5IGluIGZpcm13YXJlIGlmIG5lZWRlZCAqLworCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKKwkJdW5zaWduZWQgY2hhciAqZnc7CisJCWludCBsZW4gPSBwcml2LT5maXJtd2FyZV9sZW5ndGg7CisJCWlmICghKGZ3ID0gcHJpdi0+ZmlybXdhcmUpKSB7CisJCQlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBBVE1FTF9GV19UWVBFX05PTkUpIHsKKwkJCQlpZiAoc3RybGVuKHByaXYtPmZpcm13YXJlX2lkKSA9PSAwKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICIlczogY2FyZCB0eXBlIGlzIHVua25vd246IGFzc3VtaW5nIGF0NzZjNTAyIGZpcm13YXJlIGlzIE9LLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICIlczogaWYgbm90LCB1c2UgdGhlIGZpcm13YXJlPSBtb2R1bGUgcGFyYW1ldGVyLlxuIiwgCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlzdHJjcHkocHJpdi0+ZmlybXdhcmVfaWQsICJhdG1lbF9hdDc2YzUwMi5iaW4iKTsKKwkJCQl9CisJCQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwcml2LT5maXJtd2FyZV9pZCwgcHJpdi0+c3lzX2RldikgIT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJCQkJICAgICAgICIlczogZmlybXdhcmUgJXMgaXMgbWlzc2luZywgY2Fubm90IGNvbnRpbnVlLlxuIiwgCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmZpcm13YXJlX2lkKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpbnQgZndfaW5kZXggPSAwOworCQkJCWludCBzdWNjZXNzID0gMDsKKworCQkJCS8qIGdldCBmaXJtd2FyZSBmaWxlbmFtZSBlbnRyeSBiYXNlZCBvbiBmaXJtd2FyZSB0eXBlIElEICovCisJCQkJd2hpbGUgKGZ3X3RhYmxlW2Z3X2luZGV4XS5md190eXBlICE9IHByaXYtPmZpcm13YXJlX3R5cGUKKwkJCQkJCSYmIGZ3X3RhYmxlW2Z3X2luZGV4XS5md190eXBlICE9IEFUTUVMX0ZXX1RZUEVfTk9ORSkKKwkJCQkJZndfaW5kZXgrKzsKKwkJCQkKKwkJCQkvKiBjb25zdHJ1Y3QgdGhlIGFjdHVhbCBmaXJtd2FyZSBmaWxlIG5hbWUgKi8KKwkJCQlpZiAoZndfdGFibGVbZndfaW5kZXhdLmZ3X3R5cGUgIT0gQVRNRUxfRldfVFlQRV9OT05FKSB7CisJCQkJCWludCBpOworCQkJCQlmb3IgKGkgPSAwOyBmaXJtd2FyZV9tb2RpZmllcltpXTsgaSsrKSB7CisJCQkJCQlzbnByaW50Zihwcml2LT5maXJtd2FyZV9pZCwgMzIsICIlcyVzLiVzIiwgZndfdGFibGVbZndfaW5kZXhdLmZ3X2ZpbGUsCisJCQkJCQkJZmlybXdhcmVfbW9kaWZpZXJbaV0sIGZ3X3RhYmxlW2Z3X2luZGV4XS5md19maWxlX2V4dCk7CisJCQkJCQlwcml2LT5maXJtd2FyZV9pZFszMV0gPSAnXDAnOworCQkJCQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwcml2LT5maXJtd2FyZV9pZCwgcHJpdi0+c3lzX2RldikgPT0gMCkgeworCQkJCQkJCXN1Y2Nlc3MgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICghc3VjY2VzcykgeworCQkJCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJCQkJICAgICAgICIlczogZmlybXdhcmUgJXMgaXMgbWlzc2luZywgY2Fubm90IHN0YXJ0LlxuIiwgCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmZpcm13YXJlX2lkKTsKKwkJCQkJcHJpdi0+ZmlybXdhcmVfaWRbMF0gPSAnXDAnOworCQkJCQlyZXR1cm4gMDsJCisJCQkJfQorCQkJfQorCQkJCisJCQlmdyA9IGZ3X2VudHJ5LT5kYXRhOworCQkJbGVuID0gZndfZW50cnktPnNpemU7CisJCX0KKwkJCisJICAgICAgICBpZiAobGVuIDw9IDB4NjAwMCkgeworCQkJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEJTUiwgQlNTX0lSQU0pOworCQkJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgMCwgZncsIGxlbik7CisJCQlhdG1lbF9zZXRfZ2NyKHByaXYtPmRldiwgR0NSX1JFTUFQKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlbWFwICovIAorCQkJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9SRU1BUCk7CisJCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgQlNSLCBCU1NfSVJBTSk7CisJCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCAwLCBmdywgMHg2MDAwKTsKKwkJCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIDB4MmZmKTsKKwkJCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIDB4ODAwMCwgJmZ3WzB4NjAwMF0sIGxlbiAtIDB4NjAwMCk7CisJCX0KKworCQlpZiAoZndfZW50cnkpCisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwl9CisKKwlpZiAoIWF0bWVsX3dha2V1cF9maXJtd2FyZShwcml2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayB0aGUgdmVyc2lvbiBhbmQgc2V0IHRoZSBjb3JyZWN0IGZsYWcgZm9yIHdwYSBzdHVmZiwKKwkgICBvbGQgYW5kIG5ldyBmaXJtd2FyZSBpcyBpbmNvbXBhdGlibGUuCisJICAgVGhlIHByZS13cGEgM2NvbSBmaXJtd2FyZSByZXBvcnRzIG1ham9yIHZlcnNpb24gNSwKKwkgICB0aGUgd3BhIDNjb20gZmlybXdhcmUgaXMgbWFqb3IgdmVyc2lvbiA0IGFuZCBkb2Vzbid0IG5lZWQKKwkgICB0aGUgM2NvbSBicm9rZW4tbmVzcyBmaWx0ZXIuICovCisJcHJpdi0+dXNlX3dwYSA9IChwcml2LT5ob3N0X2luZm8ubWFqb3JfdmVyc2lvbiA9PSA0KTsKKwlwcml2LT5yYWRpb19vbl9icm9rZW4gPSAocHJpdi0+aG9zdF9pbmZvLm1ham9yX3ZlcnNpb24gPT0gNSk7CisJCisgICAgICAgIC8qIHVubWFzayBhbGwgaXJxIHNvdXJjZXMgKi8KKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfTUFTS19PRkZTRVQpLCAweGZmKTsKKwkKKwkvKiBpbnQgVHggc3lzdGVtIGFuZCBlbmFibGUgVHggKi8KKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0ZMQUdTX09GRlNFVCwgMCksIDApOworCWF0bWVsX3dtZW0zMihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX05FWFRfT0ZGU0VULCAwKSwgMHg4MDAwMDAwMEwpOworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1BPU19PRkZTRVQsIDApLCAwKTsKKwlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19TSVpFX09GRlNFVCwgMCksIDApOworCisJcHJpdi0+dHhfZGVzY19mcmVlID0gcHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfY291bnQ7CQkKKwlwcml2LT50eF9kZXNjX2hlYWQgPSAwOwkJCQkJCQkJCQorCXByaXYtPnR4X2Rlc2NfdGFpbCA9IDA7CQkJCQkJCQkJCisJcHJpdi0+dHhfZGVzY19wcmV2aW91cyA9IDA7CisJcHJpdi0+dHhfZnJlZV9tZW0gPSBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9zaXplOworCXByaXYtPnR4X2J1ZmZfaGVhZCA9IDA7CQorCXByaXYtPnR4X2J1ZmZfdGFpbCA9IDA7CQorCQkKKwljb25maWd1cmF0aW9uID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCkpOyAKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSwgCisJCQkJICAgY29uZmlndXJhdGlvbiB8IEZVTkNfQ1RSTF9UeEVOQUJMRSk7CisKKwkvKiBpbml0IFJ4IHN5c3RlbSBhbmQgZW5hYmxlICovCisJcHJpdi0+cnhfZGVzY19oZWFkID0gMDsKKwkKKwljb25maWd1cmF0aW9uID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCkpOyAKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSwgCisJCQkJICAgY29uZmlndXJhdGlvbiB8IEZVTkNfQ1RSTF9SeEVOQUJMRSk7CisJCQkKKwlpZiAoIXByaXYtPnJhZGlvX29uX2Jyb2tlbikgeworCQlpZiAoYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX0VuYWJsZVJhZGlvLCBOVUxMLCAwKSA9PSAKKwkJICAgIENNRF9TVEFUVVNfUkVKRUNURURfUkFESU9fT0ZGKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJICAgICAgICIlczogY2Fubm90IHR1cm4gdGhlIHJhZGlvIG9uLiAoSGV5IHJhZGlvLCB5b3UncmUgYmVhdXRpZnVsISlcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCQl9CisJfQorCQorCS8qIHNldCB1cCBlbm91Z2ggTUlCIHZhbHVlcyB0byBydW4uICovCisJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsIExPQ0FMX01JQl9BVVRPX1RYX1JBVEVfUE9TLCBwcml2LT5hdXRvX3R4X3JhdGUpOworCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCAgTE9DQUxfTUlCX1RYX1BST01JU0NVT1VTX1BPUywgIFBST01fTU9ERV9PRkYpOworCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWliX1R5cGUsIE1BQ19NSUJfUlRTX1RIUkVTSE9MRF9QT1MsIHByaXYtPnJ0c190aHJlc2hvbGQpOworCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWliX1R5cGUsIE1BQ19NSUJfRlJBR19USFJFU0hPTERfUE9TLCBwcml2LT5mcmFnX3RocmVzaG9sZCk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX1NIT1JUX1JFVFJZX1BPUywgcHJpdi0+c2hvcnRfcmV0cnkpOworCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NaWJfVHlwZSwgTUFDX01JQl9MT05HX1JFVFJZX1BPUywgcHJpdi0+bG9uZ19yZXRyeSk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsIExPQ0FMX01JQl9QUkVBTUJMRV9UWVBFLCBwcml2LT5wcmVhbWJsZSk7CisJYXRtZWxfc2V0X21pYihwcml2LCBNYWNfQWRkcmVzc19NaWJfVHlwZSwgTUFDX0FERFJfTUlCX01BQ19BRERSX1BPUywgCisJCSAgICAgIHByaXYtPmRldi0+ZGV2X2FkZHIsIDYpOworCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsIEFDVElWRV9NT0RFKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAxKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9CRUFDT05fUEVSX1BPUywgcHJpdi0+ZGVmYXVsdF9iZWFjb25fcGVyaW9kKTsKKwlhdG1lbF9zZXRfbWliKHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SQVRFX1NFVF9QT1MsIGF0bWVsX2Jhc2ljX3JhdGVzLCA0KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0NVUl9QUklWQUNZX1BPUywgcHJpdi0+d2VwX2lzX29uKTsKKwlpZiAocHJpdi0+dXNlX3dwYSkKKwkJYnVpbGRfd3BhX21pYihwcml2KTsKKwllbHNlCisJCWJ1aWxkX3dlcF9taWIocHJpdik7CisJCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NlbmRfY29tbWFuZChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKQoreworCWlmIChjbWQpCisJCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCksIAorCQkJCSAgIGNtZCwgY21kX3NpemUpOworCQorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19DT01NQU5EX09GRlNFVCksIGNvbW1hbmQpOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19TVEFUVVNfT0ZGU0VUKSwgMCk7Cit9CisJCitzdGF0aWMgaW50IGF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY29tbWFuZCwgdm9pZCAqY21kLCBpbnQgY21kX3NpemUpCit7CisJaW50IGksIHN0YXR1czsKKwkKKwlhdG1lbF9zZW5kX2NvbW1hbmQocHJpdiwgY29tbWFuZCwgY21kLCBjbWRfc2l6ZSk7CisJCisJZm9yIChpID0gNTAwMDsgaTsgaS0tKSB7CisJCXN0YXR1cyA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19TVEFUVVNfT0ZGU0VUKSk7CisJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JRExFICYmIAorCQkgICAgc3RhdHVzICE9IENNRF9TVEFUVVNfSU5fUFJPR1JFU1MpCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisJCisJaWYgKGkgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCB0byBjb250YWN0IE1BQy5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXN0YXR1cyA9ICBDTURfU1RBVFVTX0hPU1RfRVJST1I7CisJfSBlbHNlIHsgCisJCWlmIChjb21tYW5kICE9IENNRF9FbmFibGVSYWRpbykKKwkJCXN0YXR1cyA9IENNRF9TVEFUVVNfQ09NUExFVEU7CisJfQorCQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1OCBhdG1lbF9nZXRfbWliOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgpCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSAxOworCW0uaW5kZXggPSBpbmRleDsKKworCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9HZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyAxKTsKKwlyZXR1cm4gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1BBUkFNRVRFUlNfT0ZGU0VUICsgTUlCX0hFQURFUl9TSVpFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWI4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IDE7CisJbS5pbmRleCA9IGluZGV4OworCW0uZGF0YVswXSA9IGRhdGE7CisKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfU2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWIxNihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHUxNiBkYXRhKQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gMjsKKwltLmluZGV4ID0gaW5kZXg7CisJbS5kYXRhWzBdID0gZGF0YTsKKwltLmRhdGFbMV0gPSBkYXRhID4+IDg7CisKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfU2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgMik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gZGF0YV9sZW47CisJbS5pbmRleCA9IGluZGV4OworCisJaWYgKGRhdGFfbGVuID4gTUlCX01BWF9EQVRBX0JZVEVTKQorCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1JQiBidWZmZXIgdG9vIHNtYWxsLlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkKKwltZW1jcHkobS5kYXRhLCBkYXRhLCBkYXRhX2xlbik7CisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX1NldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIGRhdGFfbGVuKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfZ2V0X21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSBkYXRhX2xlbjsKKwltLmluZGV4ID0gaW5kZXg7CisJCisJaWYgKGRhdGFfbGVuID4gTUlCX01BWF9EQVRBX0JZVEVTKQorCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1JQiBidWZmZXIgdG9vIHNtYWxsLlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfR2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgZGF0YV9sZW4pOworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIGRhdGEsIAorCQkJICAgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1BBUkFNRVRFUlNfT0ZGU0VUICsgTUlCX0hFQURFUl9TSVpFKSwgZGF0YV9sZW4pOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF93cml0ZUFSKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkYXRhKQoreworCWludCBpOworCW91dHcoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBBUik7CisJLyogQWRkcmVzcyByZWdpc3RlciBhcHBlYXJzIHRvIG5lZWQgc29tZSBjb252aW5jaW5nLi4uLi4gKi8KKwlmb3IgKGkgPSAwOyBkYXRhICE9IGludyhkZXYtPmJhc2VfYWRkciArIEFSKSAmJiBpPDEwOyBpKyspCisJCW91dHcoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBBUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGVzdCwgdW5zaWduZWQgY2hhciAqc3JjLCB1MTYgbGVuKQoreworCWludCBpOworCWF0bWVsX3dyaXRlQVIoZGV2LCBkZXN0KTsKKwlpZiAoZGVzdCAlIDIpIHsKKwkJYXRtZWxfd3JpdGU4KGRldiwgRFIsICpzcmMpOworCQlzcmMrKzsgbGVuLS07CisJfQorCWZvciAoaSA9IGxlbjsgaSA+IDEgOyBpIC09IDIpIHsKKwkJdTggbGIgPSAqc3JjKys7CisJCXU4IGhiID0gKnNyYysrOworCQlhdG1lbF93cml0ZTE2KGRldiwgRFIsIGxiIHwgKGhiIDw8IDgpKTsKKwl9CisJaWYgKGkpCisJCWF0bWVsX3dyaXRlOChkZXYsIERSLCAqc3JjKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfY29weV90b19ob3N0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHUxNiBzcmMsIHUxNiBsZW4pCit7CisJaW50IGk7CisJYXRtZWxfd3JpdGVBUihkZXYsIHNyYyk7CisJaWYgKHNyYyAlIDIpIHsKKwkJKmRlc3QgPSBhdG1lbF9yZWFkOChkZXYsIERSKTsKKwkJZGVzdCsrOyBsZW4tLTsKKwl9CisJZm9yIChpID0gbGVuOyBpID4gMSA7IGkgLT0gMikgeworCQl1MTYgaHcgPSBhdG1lbF9yZWFkMTYoZGV2LCBEUik7CisJCSpkZXN0KysgPSBodzsKKwkJKmRlc3QrKyA9IGh3ID4+IDg7CisJfQorCWlmIChpKQorCQkqZGVzdCA9IGF0bWVsX3JlYWQ4KGRldiwgRFIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfZ2NyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBtYXNrKQoreworCW91dHcoaW53KGRldi0+YmFzZV9hZGRyICsgR0NSKSB8IG1hc2ssIGRldi0+YmFzZV9hZGRyICsgR0NSKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfY2xlYXJfZ2NyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBtYXNrKQoreworCW91dHcoaW53KGRldi0+YmFzZV9hZGRyICsgR0NSKSAmIH5tYXNrLCBkZXYtPmJhc2VfYWRkciArIEdDUik7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfbG9ja19tYWMoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGksIGogPSAyMDsKKyByZXRyeToKKwlmb3IgKGkgPSA1MDAwOyBpOyBpLS0pIHsKKwkJaWYgKCFhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX0hPU1RfT0ZGU0VUKSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisJCisJaWYgKCFpKSByZXR1cm4gMDsgLyogdGltZWQgb3V0ICovCisJCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUKSwgMSk7CisJaWYgKGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfSE9TVF9PRkZTRVQpKSkgeworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQpLCAwKTsKKwkJaWYgKCFqLS0pIHJldHVybiAwOyAvKiB0aW1lZCBvdXQgKi8KKwkJZ290byByZXRyeTsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3dtZW0zMihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTMyIGRhdGEpCit7CisgICAgICAgCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgRFIsIGRhdGEpOyAvKiBjYXJkIGlzIGxpdHRsZS1lbmRpYW4gKi8KKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgRFIsIGRhdGEgPj4gMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlcmUgZm9sbG93cyB0aGUgc291cmNlIGZvcm0gb2YgdGhlIE1BQyBhZGRyZXNzIHJlYWRpbmcgZmlybXdhcmUgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgMAorCisvKiBDb3B5cmlnaHQgMjAwMyBNYXR0aGV3IFQuIFJ1c3NvdHRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnV0IGRlcml2ZWQgZnJvbSB0aGUgQXRtZWwgNzZDNTAyIGZpcm13YXJlIHdyaXR0ZW4gYnkgQXRtZWwgYW5kICAgICAgICAgKi8KKy8qIGluY2x1ZGVkIGluICJhdG1lbCB3aXJlbGVzcyBsYW4gZHJpdmVycyIgcGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZXQucnVzc290dG8uQXRtZWxNQUNGVywgaGVyZXRvIHJlZmVycmVkIHRvCisgICAgYXMgQXRtZWxNQUNGVworCisgICAgQXRtZWxNQUNGVyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgIEF0bWVsTUFDRlcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsTUFDRlc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGZpcm13YXJlIHNob3VsZCB3b3JrIG9uIHRoZSA3NkM1MDIgUkZNRCwgUkZNRF9ELCBhbmQgUkZNRF9FICAgICAgICAqLworLyogSXQgd2lsbCBwcm9iYWJseSB3b3JrIG9uIHRoZSA3NkM1MDQgYW5kIDc2QzUwMiBSRk1EXzNDT00gICAgICAgICAgICAgICAgKi8KKy8qIEl0IG9ubHkgd29ya3Mgb24gU1BJIEVFUFJPTSB2ZXJzaW9ucyBvZiB0aGUgY2FyZC4gICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFRoaXMgZmlybXdhcmUgaW5pdGlhbGl6ZXMgdGhlIFNQSSBjb250cm9sbGVyIGFuZCBjbG9jaywgcmVhZHMgdGhlIE1BQyAgICovCisvKiBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTSBpbnRvIFNSQU0sIGFuZCBwdXRzIHRoZSBTUkFNIG9mZnNldCBvZiB0aGUgTUFDICAqLworLyogYWRkcmVzcyBpbiBNUjIsIGFuZCBzZXRzIE1SMyB0byAweDEwIHRvIGluZGljYXRlIGl0IGlzIGRvbmUgICAgICAgICAgICAgKi8KKy8qIEl0IGFsc28gcHV0cyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIEVFUFJPTSBpbiBTUkFNIHdpdGggdGhlIG9mZnNldCBpbiAgICovCisvKiBNUjQsIGZvciBpbnZlc3RpZ2F0aW9uYWwgcHVycG9zZXMgKG1heWJlIHdlIGNhbiBkZXRlcm1pbmUgY2hpcCB0eXBlICAgICAqLworLyogZnJvbSB0aGF0PykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCS5vcmcgMAorICAgIC5zZXQgTVJCQVNFLCAweDgwMDAwMDAKKwkuc2V0IENQU1JfSU5JVElBTCwgMHhEMyAvKiBJUlEvRklRIGRpc2FibGVkLCBBUk0gbW9kZSwgU3VwZXJ2aXNvciBzdGF0ZSAqLworCS5zZXQgQ1BTUl9VU0VSLCAweEQxIC8qIElSUS9GSVEgZGlzYWJsZWQsIEFSTSBtb2RlLCBVU0VSIHN0YXRlICovCisJLnNldCBTUkFNX0JBU0UsICAweDAyMDAwMDAwCisJLnNldCBTUF9CQVNFLCAgICAweDBGMzAwMDAwCisJLnNldCBVTktfQkFTRSwgICAweDBGMDAwMDAwIC8qIFNvbWUgaW50ZXJuYWwgZGV2aWNlLCBidXQgd2hpY2ggb25lPyAqLworCS5zZXQgU1BJX0NHRU5fQkFTRSwgIDB4MEUwMDAwMDAgLyogU29tZSBpbnRlcm5hbCBkZXZpY2UsIGJ1dCB3aGljaCBvbmU/ICovCisJLnNldCBVTkszX0JBU0UsICAweDAyMDE0MDAwIC8qIFNvbWUgaW50ZXJuYWwgZGV2aWNlLCBidXQgd2hpY2ggb25lPyAqLworCS5zZXQgU1RBQ0tfQkFTRSwgMHg1NjAwCisJLnNldCBTUF9TUiwgMHgxMAorCS5zZXQgU1BfVERSRSwgMiAvKiBzdGF0dXMgcmVnaXN0ZXIgYml0IC0tIFREUiBlbXB0eSAqLworCS5zZXQgU1BfUkRSRiwgMSAvKiBzdGF0dXMgcmVnaXN0ZXIgYml0IC0tIFJEUiBmdWxsICovCisJLnNldCBTUF9TV1JTVCwgMHg4MAorCS5zZXQgU1BfU1BJRU4sIDB4MQorCS5zZXQgU1BfQ1IsIDAgICAvKiBjb250cm9sIHJlZ2lzdGVyICovCisJLnNldCBTUF9NUiwgNCAgIC8qIG1vZGUgcmVnaXN0ZXIgKi8KKwkuc2V0IFNQX1JEUiwgMHgwOCAvKiBSZWFkIERhdGEgUmVnaXN0ZXIgKi8KKwkuc2V0IFNQX1REUiwgMHgwQyAvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCisJLnNldCBTUF9DU1IwLCAweDMwIC8qIGNoaXAgc2VsZWN0IHJlZ2lzdGVycyAqLworCS5zZXQgU1BfQ1NSMSwgMHgzNAorCS5zZXQgU1BfQ1NSMiwgMHgzOAorCS5zZXQgU1BfQ1NSMywgMHgzQworCS5zZXQgTlZSQU1fQ01EX1JEU1IsIDUgLyogcmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkuc2V0IE5WUkFNX0NNRF9SRUFELCAzIC8qIHJlYWQgZGF0YSAqLworCS5zZXQgTlZSQU1fU1JfUkRZLCAxIC8qIFJEWSBiaXQuICBUaGlzIGJpdCBpcyBpbnZlcnRlZCAqLworCS5zZXQgU1BJXzhDTE9DS1MsIDB4RkYgLyogV3JpdGluZyB0aGlzIHRvIHRoZSBURFIgZG9lc24ndCBkbyBhbnl0aGluZyB0byB0aGUKKwkJCQkgIHNlcmlhbCBvdXRwdXQsIHNpbmNlIFNPIGlzIG5vcm1hbGx5IGhpZ2guICBCdXQgaXQKKwkJCQkgIGRvZXMgY2F1c2UgOCBjbG9jayBjeWNsZXMgYW5kIHRodXMgOCBiaXRzIHRvIGJlCisJCQkJICBjbG9ja2VkIGluIHRvIHRoZSBjaGlwLiAgU2VlIEF0bWVsJ3MgU1BJCisJCQkJICBjb250cm9sbGVyIChlLmcuIEFUOTFNNTU4MDApIHRpbWluZyBhbmQgNEsgCisJCQkJICBTUEkgRUVQUk9NIG1hbnVhbHMgKi8KKwkJCQkgCisJLnNldCBOVlJBTV9TQ1JBVENILCAweDAyMDAwMTAwICAvKiBhcmJpdHJhcnkgYXJlYSBmb3Igc2NyYXRjaHBhZCBtZW1vcnkgKi8KKwkuc2V0IE5WUkFNX0lNQUdFLCAweDAyMDAwMjAwCisJLnNldCBOVlJBTV9MRU5HVEgsIDB4MDIwMAorCS5zZXQgTUFDX0FERFJFU1NfTUlCLCBTUkFNX0JBU0UKKwkuc2V0IE1BQ19BRERSRVNTX0xFTkdUSCwgNgorICAgICAgICAuc2V0IE1BQ19CT09UX0ZMQUcsIDB4MTAKKwkuc2V0IE1SMSwgMAorCS5zZXQgTVIyLCA0CisJLnNldCBNUjMsIDgKKwkuc2V0IE1SNCwgMHhDCitSRVNFVF9WRUNUT1I6CisgICAgICAgIGIgUkVTRVRfSEFORExFUgorVU5ERUZfVkVDVE9SOiAgCisgICAgICAgIGIgSEFMVDEKK1NXSV9WRUNUT1I6ICAgICAgICAgICAgCisgICAgICAgIGIgSEFMVDEKK0lBQk9SVF9WRUNUT1I6IAorICAgICAgICBiIEhBTFQxCitEQUJPUlRfVkVDVE9SOiAgICAgICAgIAorUkVTRVJWRURfVkVDVE9SOiAgICAKKyAgICAgICAgYiBIQUxUMQorSVJRX1ZFQ1RPUjogICAgCisgICAgICAgIGIgSEFMVDEKK0ZJUV9WRUNUT1I6ICAgIAorCWIgSEFMVDEKK0hBTFQxOgliIEhBTFQxCitSRVNFVF9IQU5ETEVSOgorCW1vdiAgICAgcjAsICNDUFNSX0lOSVRJQUwKKwltc3IJQ1BTUl9jLCByMAkvKiBUaGlzIGlzIHByb2JhYmx5IHVubmVjZXNzYXJ5ICovCisJCQkKKy8qIEknbSBndWVzc2luZyB0aGlzIGlzIGluaXRpYWxpemluZyBjbG9jayBnZW5lcmF0b3IgZWxlY3Ryb25pY3MgZm9yIFNQSSAqLworCWxkcglyMCwgPVNQSV9DR0VOX0JBU0UKKwltb3YJcjEsICMwCisJbW92CXIxLCByMSwgbHNsICMzCisJb3JyCXIxLHIxLCAjMAorCXN0cglyMSwgW3IwXQorCWxkcglyMSwgW3IwLCAjMjhdCisJYmljCXIxLCByMSwgIzE2CisJc3RyCXIxLCBbcjAsICMyOF0KKwltb3YJcjEsICMxCisJc3RyCXIxLCBbcjAsICM4XQorCQorCWxkcglyMCwgPU1SQkFTRQorCW1vdglyMSwgIzAKKwlzdHJoCXIxLCBbcjAsICNNUjFdCisJc3RyaAlyMSwgW3IwLCAjTVIyXQorCXN0cmgJcjEsIFtyMCwgI01SM10KKwlzdHJoCXIxLCBbcjAsICNNUjRdCisKKwltb3YJc3AsICNTVEFDS19CQVNFCisJYmwJU1BfSU5JVAorCW1vdglyMCwgIzEwCisJYmwJREVMQVk5CisJYmwJR0VUX01BQ19BRERSCisJYmwJR0VUX1dIT0xFX05WUkFNCisJbGRyCXIwLCA9TVJCQVNFCisJbGRyCXIxLCA9TUFDX0FERFJFU1NfTUlCCisJc3RyaAlyMSwgW3IwLCAjTVIyXQorCWxkcglyMSwgPU5WUkFNX0lNQUdFCisJc3RyaAlyMSwgW3IwLCAjTVI0XQorCW1vdglyMSwgI01BQ19CT09UX0ZMQUcKKwlzdHJoCXIxLCBbcjAsICNNUjNdCitIQUxUMjoJYiBIQUxUMgorLmZ1bmMgR2V0X1dob2xlX05WUkFNLCBHRVRfV0hPTEVfTlZSQU0KK0dFVF9XSE9MRV9OVlJBTToKKwlzdG1kYglzcCEsIHtscn0KKwltb3YJcjIsICMwIC8qIDB0aCBieXRlcyBvZiBOVlJBTSAqLworCW1vdglyMywgI05WUkFNX0xFTkdUSAorCW1vdglyMSwgIzAJCS8qIG5vdCB1c2VkIGluIHJvdXRpbmUgKi8KKwlsZHIJcjAsID1OVlJBTV9JTUFHRQorCWJsCU5WUkFNX1hGRVIKKwlsZG1pYQlzcCEsIHtscn0KKwlieAlscgorLmVuZGZ1bmMKKwkKKy5mdW5jIEdldF9NQUNfQWRkciwgR0VUX01BQ19BRERSCitHRVRfTUFDX0FERFI6CisJc3RtZGIJc3AhLCB7bHJ9CisJbW92CXIyLCAjMHgxMjAJLyogYWRkcmVzcyBvZiBNQUMgQWRkcmVzcyB3aXRoaW4gTlZSQU0gKi8KKwltb3YJcjMsICNNQUNfQUREUkVTU19MRU5HVEgKKwltb3YJcjEsICMwCQkvKiBub3QgdXNlZCBpbiByb3V0aW5lICovCisJbGRyCXIwLCA9TUFDX0FERFJFU1NfTUlCCisJYmwJTlZSQU1fWEZFUgorCWxkbWlhCXNwISwge2xyfQorCWJ4CWxyCisuZW5kZnVuYworLmx0b3JnCisuZnVuYyBEZWxheTksIERFTEFZOQorREVMQVk5OgorCWFkZHMJcjAsIHIwLCByMCwgTFNMICMzICAgLyogcjAgPSByMCAqIDkgKi8KK0RFTEFZTE9PUDoJCisJYmVxCURFTEFZOV9kb25lCisJc3VicwlyMCwgcjAsICMxCisJYglERUxBWUxPT1AKK0RFTEFZOV9kb25lOgkKKwlieAlscgorLmVuZGZ1bmMJCisKKy5mdW5jIFNQX0luaXQsIFNQX0lOSVQKK1NQX0lOSVQ6CisJbW92CXIxLCAjU1BfU1dSU1QKKwlsZHIJcjAsID1TUF9CQVNFCisJc3RyCXIxLCBbcjAsICNTUF9DUl0gLyogcmVzZXQgdGhlIFNQSSAqLworCW1vdglyMSwgIzAKKwlzdHIJcjEsIFtyMCwgI1NQX0NSXSAvKiByZWxlYXNlIFNQSSBmcm9tIHJlc2V0IHN0YXRlICovCisJbW92CXIxLCAjU1BfU1BJRU4KKwlzdHIJcjEsIFtyMCwgI1NQX01SXSAvKiBzZXQgdGhlIFNQSSB0byBNQVNURVIgbW9kZSovCisJc3RyCXIxLCBbcjAsICNTUF9DUl0gLyogZW5hYmxlIHRoZSBTUEkgKi8KKworLyogIE15IGd1ZXNzIHdvdWxkIGJlIHRoaXMgdHVybnMgb24gdGhlIFNQSSBjbG9jayAqLworCWxkcglyMywgPVNQSV9DR0VOX0JBU0UKKwlsZHIJcjEsIFtyMywgIzI4XQorCW9ycglyMSwgcjEsICMweDIwMDAKKwlzdHIJcjEsIFtyMywgIzI4XQorCisJbGRyCXIxLCA9MHgyMDAwYzAxCisJc3RyCXIxLCBbcjAsICNTUF9DU1IwXQorCWxkcglyMSwgPTB4MjAwMDIwMQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSMV0KKwlzdHIJcjEsIFtyMCwgI1NQX0NTUjJdCisJc3RyCXIxLCBbcjAsICNTUF9DU1IzXQorCWxkcglyMSwgW3IwLCAjU1BfU1JdCisJbGRyCXIwLCBbcjAsICNTUF9SRFJdCisJYngJbHIKKy5lbmRmdW5jCisuZnVuYyBOVlJBTV9Jbml0LCBOVlJBTV9JTklUCQorTlZSQU1fSU5JVDoKKwlsZHIJcjEsID1TUF9CQVNFCisJbGRyCXIwLCBbcjEsICNTUF9SRFJdCisJbW92CXIwLCAjTlZSQU1fQ01EX1JEU1IKKwlzdHIJcjAsIFtyMSwgI1NQX1REUl0KK1NQX2xvb3AxOgkKKwlsZHIJcjAsIFtyMSwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1REUkUKKwliZXEJU1BfbG9vcDEKKworCW1vdglyMCwgI1NQSV84Q0xPQ0tTCisJc3RyCXIwLCBbcjEsICNTUF9URFJdIAorU1BfbG9vcDI6CQorCWxkcglyMCwgW3IxLCAjU1BfU1JdCisJdHN0CXIwLCAjU1BfVERSRQorCWJlcQlTUF9sb29wMgorCisJbGRyCXIwLCBbcjEsICNTUF9SRFJdCitTUF9sb29wMzoJCisJbGRyCXIwLCBbcjEsICNTUF9TUl0KKwl0c3QJcjAsICNTUF9SRFJGCisJYmVxCVNQX2xvb3AzCisKKwlsZHIJcjAsIFtyMSwgI1NQX1JEUl0KKwlhbmQJcjAsIHIwLCAjMjU1CisJYngJbHIKKy5lbmRmdW5jCisJCisuZnVuYyBOVlJBTV9YZmVyLCBOVlJBTV9YRkVSCisJLyogcjAgPSBkZXN0IGFkZHJlc3MgKi8KKwkvKiByMSA9IG5vdCB1c2VkICovCisJLyogcjIgPSBzcmMgYWRkcmVzcyB3aXRoaW4gTlZSQU0gKi8KKwkvKiByMyA9IGxlbmd0aCAqLworTlZSQU1fWEZFUjoKKwlzdG1kYglzcCEsIHtyNCwgcjUsIGxyfQorCW1vdglyNSwgcjAJCS8qIHNhdmUgcjAgKGRlc3QgYWRkcmVzcykgKi8KKwltb3YJcjQsIHIzCQkvKiBzYXZlIHIzIChsZW5ndGgpICovCisJbW92CXIwLCByMiwgTFNSICM1IC8qICBTUEkgbWVtb3JpZXMgcHV0IEE4IGluIHRoZSBjb21tYW5kIGZpZWxkICovCisJYW5kCXIwLCByMCwgIzgKKwlhZGQJcjAsIHIwLCAjTlZSQU1fQ01EX1JFQUQgCisJbGRyCXIxLCA9TlZSQU1fU0NSQVRDSAorCXN0cmIJcjAsIFtyMSwgIzBdCS8qIHNhdmUgY29tbWFuZCBpbiBOVlJBTV9TQ1JBVENIWzBdICovCisJc3RyYglyMiwgW3IxLCAjMV0gICAgLyogc2F2ZSBsb3cgYnl0ZSBvZiBzb3VyY2UgYWRkcmVzcyBpbiBOVlJBTV9TQ1JBVENIWzFdICovCitfbG9jYWwxOgkKKwlibAlOVlJBTV9JTklUCisJdHN0CXIwLCAjTlZSQU1fU1JfUkRZCisJYm5lCV9sb2NhbDEKKwltb3YJcjAsICMyMAorCWJsCURFTEFZOQorCW1vdglyMiwgcjQJCS8qIGxlbmd0aCAqLworCW1vdglyMSwgcjUJCS8qIGRlc3QgYWRkcmVzcyAqLworCW1vdglyMCwgIzIJCS8qIGJ5dGVzIHRvIHRyYW5zZmVyIGluIGNvbW1hbmQgKi8KKwlibAlOVlJBTV9YRkVSMgorCWxkbWlhCXNwISwge3I0LCByNSwgbHJ9CisJYngJbHIKKy5lbmRmdW5jCisKKy5mdW5jIE5WUkFNX1hmZXIyLCBOVlJBTV9YRkVSMgorTlZSQU1fWEZFUjI6CisJc3RtZGIJc3AhLCB7cjQsIHI1LCByNiwgbHJ9CisJbGRyCXI0LCA9U1BfQkFTRQorCW1vdglyMywgIzAKKwljbXAJcjAsICMwCisJYmxzCV9sb2NhbDIKKwlsZHIJcjUsID1OVlJBTV9TQ1JBVENICitfbG9jYWw0OgkKKwlsZHJiCXI2LCBbcjUsIHIzXQorCXN0cglyNiwgW3I0LCAjU1BfVERSXQorX2xvY2FsMzoKKwlsZHIJcjYsIFtyNCwgI1NQX1NSXQorCXRzdAlyNiwgI1NQX1REUkUKKwliZXEJX2xvY2FsMworCWFkZAlyMywgcjMsICMxCisJY21wCXIzLCByMCAvKiByMCBpcyAjIG9mIGJ5dGVzIHRvIHNlbmQgb3V0IChjb21tYW5kK2FkZHIpICovCisJYmxvCV9sb2NhbDQKK19sb2NhbDI6CisJbW92CXIzLCAjU1BJXzhDTE9DS1MKKwlzdHIJcjMsIFtyNCwgI1NQX1REUl0KKwlsZHIJcjAsIFtyNCwgI1NQX1JEUl0KK19sb2NhbDU6CQorCWxkcglyMCwgW3I0LCAjU1BfU1JdCisJdHN0CXIwLCAjU1BfUkRSRgorCWJlcQlfbG9jYWw1CisJbGRyCXIwLCBbcjQsICNTUF9SRFJdIC8qIHdoYXQncyB0aGlzIGJ5dGU/ICBJdCdzIHRoZSBieXRlIHJlYWQgd2hpbGUgd3JpdGluZyB0aGUgVERSIC0tIG5vbnNlbnNlLCBiZWNhdXNlIHRoZSBOVlJBTSBkb2Vzbid0IHJlYWQgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUgKi8KKwltb3YJcjAsICMwCisJY21wCXIyLCAjMCAgLyogcjIgaXMgIyBvZiBieXRlcyB0byBjb3B5IGluICovCisJYmxzCV9sb2NhbDYKK19sb2NhbDc6CQorCWxkcglyNSwgW3I0LCAjU1BfU1JdCisJdHN0CXI1LCAjU1BfVERSRQorCWJlcQlfbG9jYWw3CisJc3RyCXIzLCBbcjQsICNTUF9URFJdICAvKiByMyBoYXMgU1BJXzhDTE9DS1MgKi8KK19sb2NhbDg6CQorCWxkcglyNSwgW3I0LCAjU1BfU1JdCisJdHN0CXI1LCAjU1BfUkRSRgorCWJlcQlfbG9jYWw4CisJbGRyCXI1LCBbcjQsICNTUF9SRFJdIC8qIGJ1dCBkaWRuJ3Qgd2UgcmVhZCB0aGlzIGJ5dGUgYWJvdmU/ICovCisJc3RyYglyNSwgW3IxXSwgIzEgLyogcG9zdGluZGV4ZWQgKi8KKwlhZGQJcjAsIHIwLCAjMQorCWNtcAlyMCwgcjIKKwlibG8JX2xvY2FsNyAvKiBzaW5jZSB3ZSBkb24ndCBzZW5kIGFub3RoZXIgYWRkcmVzcywgdGhlIE5WUkFNIG11c3QgYmUgY2FwYWJsZSBvZiBzZXF1ZW50aWFsIHJlYWRzICovCitfbG9jYWw2OgorCW1vdglyMCwgIzIwMAorCWJsCURFTEFZOQorCWxkbWlhCXNwISwge3I0LCByNSwgcjYsIGxyfQorCWJ4CWxyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTAwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBEcml2ZXIgZm9yIEF0bWVsIGF0NzZjNTAyIGF0NzZjNTA0IGFuZCBhdDc2YzUwNiB3aXJlbGVzcyBjYXJkcy4KKworICAgICAgICAgQ29weXJpZ2h0IDIwMDUgRGFuIFdpbGxpYW1zIGFuZCBSZWQgSGF0LCBJbmMuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQVRNRUxfSAorI2RlZmluZSBfQVRNRUxfSAorCit0eXBlZGVmIGVudW0geworCUFUTUVMX0ZXX1RZUEVfTk9ORSA9IDAsCisJQVRNRUxfRldfVFlQRV81MDIsCisJQVRNRUxfRldfVFlQRV81MDJELAorCUFUTUVMX0ZXX1RZUEVfNTAyRSwKKwlBVE1FTF9GV19UWVBFXzUwMl8zQ09NLAorCUFUTUVMX0ZXX1RZUEVfNTA0LAorCUFUTUVMX0ZXX1RZUEVfNTA0XzI5NTgsCisJQVRNRUxfRldfVFlQRV81MDRBXzI5NTgsCisJQVRNRUxfRldfVFlQRV81MDYKK30gQXRtZWxGV1R5cGU7CisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2F0bWVsX2NhcmQodW5zaWduZWQgc2hvcnQsIGludCwgY29uc3QgQXRtZWxGV1R5cGUsIHN0cnVjdCBkZXZpY2UgKiwgCisJCQkJICAgIGludCAoKnByZXNlbnRfZnVuYykodm9pZCAqKSwgdm9pZCAqICk7Cit2b2lkIHN0b3BfYXRtZWxfY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50ICk7CitpbnQgYXRtZWxfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWI1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCkBAIC0wLDAgKzEsNzA4IEBACisvKioqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgRHJpdmVyIGZvciBBdG1lbCBhdDc2YzUwMiBhdDc2YzUwNCBhbmQgYXQ3NmM1MDYgd2lyZWxlc3MgY2FyZHMuCisKKyAgICAgICAgQ29weXJpZ2h0IDIwMDAtMjAwMSBBVE1FTCBDb3Jwb3JhdGlvbi4KKyAgICAgICAgQ29weXJpZ2h0IDIwMDMgU2ltb24gS2VsbGV5LgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgZnJvbSB2ZXJzaW9uIDIuMS4xIG9mIHRoZSBBdG1lbCBkcml2ZXJzLCAKKyAgICByZWxlYXNlZCBieSBBdG1lbCBjb3JwLiB1bmRlciB0aGUgR1BMIGluIERlY2VtYmVyIDIwMDIuIEl0IGFsc28gCisgICAgaW5jbHVkZXMgY29kZSBmcm9tIHRoZSBMaW51eCBhaXJvbmV0IGRyaXZlcnMgKEMpIEJlbmphbWluIFJlZWQsIAorICAgIGFuZCB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UsIChDKSBEYXZpZCBIaW5kcy4gCisKKyAgICBGb3IgYWxsIHF1ZXJpZXMgYWJvdXQgdGhpcyBjb2RlLCBwbGVhc2UgY29udGFjdCB0aGUgY3VycmVudCBhdXRob3IsIAorICAgIFNpbW9uIEtlbGxleSA8c2ltb25AdGhla2VsbGV5cy5vcmcudWs+IGFuZCBub3QgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXworI2luY2x1ZGUgPHBjbWNpYS9rX2NvbXBhdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImF0bWVsLmgiCisKKy8qCisgICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICAgeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAgIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgICBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisqLworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gIiRSZXZpc2lvbjogMS4yICQiOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK01PRFVMRV9BVVRIT1IoIlNpbW9uIEtlbGxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBBdG1lbCBhdDc2YzUweCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgY2FyZHMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQXRtZWwgYXQ3NmM1MHggUENNQ0lBIGNhcmRzIik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICAgVGhlIGV2ZW50KCkgZnVuY3Rpb24gaXMgdGhpcyBkcml2ZXIncyBDYXJkIFNlcnZpY2VzIGV2ZW50IGhhbmRsZXIuCisgICBJdCB3aWxsIGJlIGNhbGxlZCBieSBDYXJkIFNlcnZpY2VzIHdoZW4gYW4gYXBwcm9wcmlhdGUgY2FyZCBzdGF0dXMKKyAgIGV2ZW50IGlzIHJlY2VpdmVkLiAgVGhlIGNvbmZpZygpIGFuZCByZWxlYXNlKCkgZW50cnkgcG9pbnRzIGFyZQorICAgdXNlZCB0byBjb25maWd1cmUgb3IgcmVsZWFzZSBhIHNvY2tldCwgaW4gcmVzcG9uc2UgdG8gY2FyZAorICAgaW5zZXJ0aW9uIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5IGFyZSBpbnZva2VkIGZyb20gdGhlIGF0bWVsX2NzCisgICBldmVudCBoYW5kbGVyLiAKKyovCisKK3N0YXRpYyB2b2lkIGF0bWVsX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGF0bWVsX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgICBUaGUgYXR0YWNoKCkgYW5kIGRldGFjaCgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIGRlc3Ryb3kKKyAgICJpbnN0YW5jZXMiIG9mIHRoZSBkcml2ZXIsIHdoZXJlIGVhY2ggaW5zdGFuY2UgcmVwcmVzZW50cyBldmVyeXRoaW5nCisgICBuZWVkZWQgdG8gbWFuYWdlIG9uZSBhY3R1YWwgUENNQ0lBIGNhcmQuCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYXRtZWxfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgYXRtZWxfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qCisgICBZb3UnbGwgYWxzbyBuZWVkIHRvIHByb3RvdHlwZSBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgIGJlIHVzZWQgdG8gdGFsayB0byB5b3VyIGRldmljZS4gIFNlZSAncGNtZW1fY3MnIGZvciBhIGdvb2QgZXhhbXBsZQorICAgb2YgYSBmdWxseSBzZWxmLXN1ZmZpY2llbnQgZHJpdmVyOyB0aGUgb3RoZXIgZHJpdmVycyByZWx5IG1vcmUgb3IKKyAgIGxlc3Mgb24gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KKyovCisKKy8qCisgICBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICAgZGF0YWJhc2UuCisqLworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJhdG1lbF9jcyI7CisKKy8qCisgICBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSAgYXRtZWxuZXQgZGV2aWNlLiAgRWFjaCBhY3R1YWwKKyAgIFBDTUNJQSBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQKKyAgIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKworICAgWW91IG1heSBub3Qgd2FudCB0byB1c2UgYSBsaW5rZWQgbGlzdCBmb3IgdGhpcyAtLSBmb3IgZXhhbXBsZSwgdGhlCisgICBtZW1vcnkgY2FyZCBkcml2ZXIgdXNlcyBhbiBhcnJheSBvZiBkZXZfbGlua190IHBvaW50ZXJzLCB3aGVyZSBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IGluZGV4LgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyoKKyAgIEEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3IgbW9zdCB0aGluZ3MgdGhhdCBhcmUgbmVlZGVkCisgICB0byBrZWVwIHRyYWNrIG9mIGEgc29ja2V0LCBidXQgdGhlcmUgd2lsbCB1c3VhbGx5IGJlIHNvbWUgZGV2aWNlCisgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGFsc28gbmVlZHMgdG8gYmUga2VwdCB0cmFjayBvZi4gIFRoZQorICAgJ3ByaXYnIHBvaW50ZXIgaW4gYSBkZXZfbGlua190IHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBwb2ludCB0bworICAgYSBkZXZpY2Utc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgbGlrZSB0aGlzLgorCisgICBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCisgICBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgorICAgZXhhbXBsZSwgZXRoZXJuZXQgY2FyZHMsIG1vZGVtcykuICBJbiBvdGhlciBjYXNlcywgdGhlcmUgbWF5IGJlCisgICBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCisgICBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CisgICBpbiBhIGxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHRoZSAnZGV2JyBmaWVsZCBvZiBhIGRldl9saW5rX3QKKyAgIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAorICAgYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBzaG91bGRuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorCisgICBJbiB0aGlzIGNhc2UsIHdlIGFsc28gcHJvdmlkZSBhIGZsYWcgdG8gaW5kaWNhdGUgaWYgYSBkZXZpY2UgaXMKKyAgICJzdG9wcGVkIiBkdWUgdG8gYSBwb3dlciBtYW5hZ2VtZW50IGV2ZW50LCBvciBjYXJkIGVqZWN0aW9uLiAgVGhlCisgICBkZXZpY2UgSU8gcm91dGluZXMgY2FuIHVzZSBhIGZsYWcgbGlrZSB0aGlzIHRvIHRocm90dGxlIElPIHRvIGEKKyAgIGNhcmQgdGhhdCBpcyBub3QgcmVhZHkgdG8gYWNjZXB0IGl0LgorKi8KKyAgIAordHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKwlkZXZfbm9kZV90CW5vZGU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmV0aF9kZXY7Cit9IGxvY2FsX2luZm9fdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBhdG1lbF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLgorICAKKyAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICphdG1lbF9hdHRhY2godm9pZCkKK3sKKwljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKwlkZXZfbGlua190ICpsaW5rOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IHJldDsKKwkKKwlERUJVRygwLCAiYXRtZWxfYXR0YWNoKClcbiIpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKwlsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG1lbF9jczogbm8gbWVtb3J5IGZvciBuZXcgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKwkKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOworCQorCS8qCisJICBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbiBnbyBoZXJlLiAgSW4gdGhpcworCSAgY2xpZW50LCB3ZSBhc3N1bWUgdmVyeSBsaXR0bGUsIGFuZCByZWx5IG9uIHRoZSBDSVMgZm9yIGFsbW9zdAorCSAgZXZlcnl0aGluZy4gIEluIG1vc3QgY2xpZW50cywgbWFueSBkZXRhaWxzIChpLmUuLCBudW1iZXIsIHNpemVzLAorCSAgYW5kIGF0dHJpYnV0ZXMgb2YgSU8gd2luZG93cykgYXJlIGZpeGVkIGJ5IHRoZSBuYXR1cmUgb2YgdGhlCisJICBkZXZpY2UsIGFuZCBjYW4gYmUgaGFyZC13aXJlZCBoZXJlLgorCSovCisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKwlsaW5rLT5jb25mLlZjYyA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCQorCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCisJbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvY2FsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCWtmcmVlIChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOworCWxpbmstPnByaXYgPSBsb2NhbDsKKwkKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF0bWVsX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gMCkgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlhdG1lbF9kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlyZXR1cm4gbGluazsKK30gLyogYXRtZWxfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhdG1lbF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisJCisJREVCVUcoMCwgImF0bWVsX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisJCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworCWlmICgqbGlua3AgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJYXRtZWxfcmVsZWFzZShsaW5rKTsKKwkJCisJLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWlmIChsaW5rLT5wcml2KQorCQlrZnJlZShsaW5rLT5wcml2KTsKKwlrZnJlZShsaW5rKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBhdG1lbF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKKy8qIENhbGwtYmFjayBmdW5jdGlvbiB0byBpbnRlcnJvZ2F0ZSBQQ01DSUEtc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgIGFib3V0IHRoZSBjdXJyZW50IGV4aXN0YW5jZSBvZiB0aGUgY2FyZCAqLworc3RhdGljIGludCBjYXJkX3ByZXNlbnQodm9pZCAqYXJnKQoreyAKKwlkZXZfbGlua190ICpsaW5rID0gKGRldl9saW5rX3QgKilhcmc7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX1NVU1BFTkQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpCisJCXJldHVybiAxOworCQorCXJldHVybiAwOworfQorCisvKiBsaXN0IG9mIGNhcmRzIHdlIGtub3cgYWJvdXQgYW5kIHRoZWlyIGZpcm13YXJlIHJlcXVpcmVtZW50cy4KKyAgIEdvIGVpdGhlciBieSBNYW5maWQgb3IgdmVyc2lvbiBzdHJpbmdzLgorICAgQ2FyZHMgbm90IGluIHRoaXMgbGlzdCB3aWxsIG5lZWQgYSBmaXJtd2FyZSBwYXJhbWV0ZXIgdG8gdGhlIG1vZHVsZQorICAgaW4gYWxsIHByb2JhYmlsaXR5LiBOb3RlIHRoYXQgdGhlIFNNQyAyNjMyIFYyIGFuZCBWMyBoYXZlIHRoZSBzYW1lCisgICBtYW5maWRzLCBzbyB3ZSBpZ25vcmUgdGhvc2UgYW5kIHVzZSB0aGUgdmVyc2lvbjEgc3RyaW5ncy4gKi8KKworc3RhdGljIHN0cnVjdCB7IAorCWludCBtYW5mLCBjYXJkOworCWNoYXIgKnZlcjE7CisJQXRtZWxGV1R5cGUgZmlybXdhcmU7CisJY2hhciAqbmFtZTsKK30gY2FyZF90YWJsZVtdID0geworCXsgMCwgMCwgIldMQU4vODAyLjExYiBQQyBDQVJEIiwgQVRNRUxfRldfVFlQRV81MDJELCAiQWN0aW9udGVjIDgwMkNBVDEiIH0sICAKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwMkFSIiwgQVRNRUxfRldfVFlQRV81MDIsICJOb05hbWUtUkZNRCIgfSwgCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDJBUl9EIiwgQVRNRUxfRldfVFlQRV81MDJELCAiTm9OYW1lLXJldkQiIH0sIAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTAyQVJfRSIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIk5vTmFtZS1yZXZFIiB9LAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTA0IiwgQVRNRUxfRldfVFlQRV81MDQsICJOb05hbWUtNTA0IiB9LAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTA0QSIsIEFUTUVMX0ZXX1RZUEVfNTA0QV8yOTU4LCAiTm9OYW1lLTUwNGEtMjk1OCIgfSwKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwNF9SIiwgQVRNRUxfRldfVFlQRV81MDRfMjk1OCwgIk5vTmFtZS01MDQtMjk1OCIgfSwKKwl7IE1BTkZJRF8zQ09NLCAweDA2MjAsIE5VTEwsIEFUTUVMX0ZXX1RZUEVfNTAyXzNDT00sICIzY29tIDNDUldFNjIwOTJCIiB9LCAKKwl7IE1BTkZJRF8zQ09NLCAweDA2OTYsIE5VTEwsIEFUTUVMX0ZXX1RZUEVfNTAyXzNDT00sICIzY29tIDNDUlNIUFcxOTYiIH0sIAorCXsgMCwgMCwgIlNNQy8yNjMyVy1WMiIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiU01DIDI2MzJXLVYyIiB9LAorCXsgMCwgMCwgIlNNQy8yNjMyVyIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIlNNQyAyNjMyVy1WMyIgfSwKKwl7IDB4ZDYwMSwgMHgwMDA3LCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMiwgIlNpdGVjb20gV0xBTi0wMTEiIH0sIAorCXsgMHgwMWJmLCAweDMzMDIsIE5VTEwsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIkJlbGtpbiBGNUQ2MDIwLVYyIiB9LCAKKwl7IDAsIDAsICJCVC9Wb3lhZ2VyIDEwMjAgTGFwdG9wIEFkYXB0ZXIiLCBBVE1FTF9GV19UWVBFXzUwMiwgIkJUIFZveWFnZXIgMTAyMCIgfSwKKwl7IDAsIDAsICJJRUVFIDgwMi4xMWIvV2lyZWxlc3MgTEFOIFBDIENhcmQiLCBBVE1FTF9GV19UWVBFXzUwMiwgIlNpZW1lbnMgR2lnYXNldCBQQyBDYXJkIElJIiB9LAorCXsgMCwgMCwgIkNOZXQvQ05XTEMgMTFNYnBzIFdpcmVsZXNzIFBDIENhcmQgVi01IiwgQVRNRUxfRldfVFlQRV81MDJFLCAiQ05ldCBDTldMQy04MTFBUkwiIH0sCisJeyAwLCAwLCAiV2lyZWxlc3MvUENfQ0FSRCIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIlBsYW5ldCBXTC0zNTUyIiB9LAorCXsgMCwgMCwgIk9FTS8xMU1icHMgV2lyZWxlc3MgTEFOIFBDIENhcmQgVi0zIiwgQVRNRUxfRldfVFlQRV81MDIsICJPRU0gMTFNYnBzIFdMQU4gUENNQ0lBIENhcmQiIH0sCisJeyAwLCAwLCAiMTFXQVZFLzExV1A2MTFBTC1FIiwgQVRNRUxfRldfVFlQRV81MDJFLCAiMTFXQVZFIFdhdmVCdWRkeSIgfSwKKwl7IDAsIDAsICJMRy9MVzIxMDBOIiwgQVRNRUxfRldfVFlQRV81MDJFLCAiTEcgTFcyMTAwTiAxMU1icHMgV0xBTiBQQ01DSUEgQ2FyZCIgfSwKK307CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCWNsaWVudF9oYW5kbGVfdCBoYW5kbGU7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCWxvY2FsX2luZm9fdCAqZGV2OworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwlpbnQgY2FyZF9pbmRleCA9IC0xLCBkb25lID0gMDsKKwkKKwloYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisJZGV2ID0gbGluay0+cHJpdjsKKworCURFQlVHKDAsICJhdG1lbF9jb25maWcoMHglcClcbiIsIGxpbmspOworCQorCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gMCkgeworCQlpbnQgaTsKKwkJY2lzdHBsX21hbmZpZF90ICptYW5maWQ7CisJCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJCW1hbmZpZCA9ICYocGFyc2UubWFuZmlkKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjYXJkX3RhYmxlKS9zaXplb2YoY2FyZF90YWJsZVswXSk7IGkrKykgeworCQkJaWYgKCFjYXJkX3RhYmxlW2ldLnZlcjEgJiYKKwkJCSAgICBtYW5maWQtPm1hbmYgPT0gY2FyZF90YWJsZVtpXS5tYW5mICYmCisJCQkgICAgbWFuZmlkLT5jYXJkID09IGNhcmRfdGFibGVbaV0uY2FyZCkgeworCQkJCWNhcmRfaW5kZXggPSBpOworCQkJCWRvbmUgPSAxOworCQkJfQorCQl9CisJfQorCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKwlpZiAoIWRvbmUgJiYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IDApKSB7CisJCWludCBpLCBqLCBrOworCQljaXN0cGxfdmVyc18xX3QgKnZlcjE7CisJCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJCXZlcjEgPSAmKHBhcnNlLnZlcnNpb25fMSk7CisJCQorCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNhcmRfdGFibGUpL3NpemVvZihjYXJkX3RhYmxlWzBdKTsgaSsrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgdmVyMS0+bnM7IGorKykgeworCQkJCWNoYXIgKnAgPSBjYXJkX3RhYmxlW2ldLnZlcjE7CisJCQkJY2hhciAqcSA9ICZ2ZXIxLT5zdHJbdmVyMS0+b2ZzW2pdXTsKKwkJCQlpZiAoIXApCisJCQkJCWdvdG8gbWlzbWF0Y2g7CisJCQkJZm9yIChrID0gMDsgayA8IGo7IGsrKykgeworCQkJCQl3aGlsZSAoKCpwICE9ICdcMCcpICYmICgqcCAhPSAnLycpKSBwKys7CisJCQkJCWlmICgqcCA9PSAnXDAnKSB7CisJCQkJCQlpZiAoKnEgIT0gJ1wwJykKKwkJCQkJCQlnb3RvIG1pc21hdGNoOworCQkJCQl9IGVsc2UgeworCQkJCQkJcCsrOworCQkJCQl9CisJCQkJfQorCQkJCXdoaWxlKCgqcSAhPSAnXDAnKSAmJiAoKnAgIT0gJ1wwJykgJiYgCisJCQkJICAgICAgKCpwICE9ICcvJykgJiYgKCpwID09ICpxKSkgcCsrLCBxKys7CisJCQkJaWYgKCgoKnAgIT0gJ1wwJykgJiYgKnAgIT0gJy8nKSB8fCAqcSAhPSAnXDAnKQorCQkJCQlnb3RvIG1pc21hdGNoOworCQkJfQorCQkJY2FyZF9pbmRleCA9IGk7CisJCQlicmVhazsJLyogZG9uZSAqLworCQkJCisJCW1pc21hdGNoOgorCQkJaiA9IDA7IC8qIGR1bW15IHN0bXQgdG8gc2h1dCB1cCBjb21waWxlciAqLworCQl9CisJfQkJCisKKwkvKgorCSAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCisJICByZWdpc3RlcnMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCQorCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKwkKKwkvKgorCSAgSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cmllcywKKwkgIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKKwkgIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywgYW5kIGludGVycnVwdCBzZXR0aW5ncy4KKwkgIAorCSAgV2UgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FyZCB0byBiZSBjb25maWd1cmVkOiB3ZSB1c2UKKwkgIGp1c3QgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQ0lTLiAgSW4gYW4gaWRlYWwgd29ybGQsCisJICB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzIGEgY29tcGxldGUKKwkgIGFuZCBhY2N1cmF0ZSBDSVMuICBJbiBwcmFjdGljZSwgYSBkcml2ZXIgdXN1YWxseSAia25vd3MiIG1vc3Qgb2YKKwkgIHRoZXNlIHRoaW5ncyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIENJUywgYW5kIG1vc3QgY2xpZW50IGRyaXZlcnMKKwkgIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KKwkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKKwkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQkKKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKSBkZmx0ID0gKmNmZzsKKwkJaWYgKGNmZy0+aW5kZXggPT0gMCkgZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKwkJCisJCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLworCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisJCX0KKwkJCisJCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCQkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WY2MgPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCWVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WY2MgPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCQorCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQljZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCQorCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKwkJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKQorCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKwkJCisJCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgeworCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOworCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7CisJCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJfQorCQl9CisJCQorCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pICE9IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisKKwkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCQlicmVhazsKKwkJCisJbmV4dF9lbnRyeToKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl9CisJCisJLyoKKwkgIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEKKwkgIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZQorCSAgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKwkqLworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKwkKKwkvKgorCSAgVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKwkgIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUKKwkgIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuCisJKi8KKwlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisJCisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0FMRVJUIAorCQkgICAgICAgImF0bWVsOiBjYW5ub3QgYXNzaWduIElSUTogY2hlY2sgdGhhdCBDT05GSUdfSVNBIGlzIHNldCBpbiBrZXJuZWwgY29uZmlnLiIpOworCQlnb3RvIGNzX2ZhaWxlZDsKKwl9CisgICAgICAgCisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0gCisJCWluaXRfYXRtZWxfY2FyZChsaW5rLT5pcnEuQXNzaWduZWRJUlEsCisJCQkJbGluay0+aW8uQmFzZVBvcnQxLAorCQkJCWNhcmRfaW5kZXggPT0gLTEgPyBBVE1FTF9GV19UWVBFX05PTkUgOiAgY2FyZF90YWJsZVtjYXJkX2luZGV4XS5maXJtd2FyZSwKKwkJCQkmaGFuZGxlX3RvX2RldihoYW5kbGUpLAorCQkJCWNhcmRfcHJlc2VudCwgCisJCQkJbGluayk7CisJaWYgKCEoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYpIAorCQlnb3RvIGNzX2ZhaWxlZDsKKwkKKwkvKgorCSAgQXQgdGhpcyBwb2ludCwgdGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlKHMpIG5lZWQgdG8gYmUKKwkgIGluaXRpYWxpemVkIGFuZCBhcnJhbmdlZCBpbiBhIGxpbmtlZCBsaXN0IGF0IGxpbmstPmRldi4KKwkqLworCXN0cmNweShkZXYtPm5vZGUuZGV2X25hbWUsICgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2Rldi0+bmFtZSApOworCWRldi0+bm9kZS5tYWpvciA9IGRldi0+bm9kZS5taW5vciA9IDA7CisJbGluay0+ZGV2ID0gJmRldi0+bm9kZTsKKwkKKwkvKiBGaW5hbGx5LCByZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzJXNpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGRldi0+bm9kZS5kZXZfbmFtZSwKKwkgICAgICAgY2FyZF9pbmRleCA9PSAtMSA/ICIiIDogIGNhcmRfdGFibGVbY2FyZF9pbmRleF0ubmFtZSwKKwkgICAgICAgY2FyZF9pbmRleCA9PSAtMSA/ICIiIDogIiAiLAorCSAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAorCSAgICAgICBsaW5rLT5jb25mLlZjYy8xMCwgbGluay0+Y29uZi5WY2MlMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpCisJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEvMTAsIGxpbmstPmNvbmYuVnBwMSUxMCk7CisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CisJcHJpbnRrKCJcbiIpOworCQorCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisJcmV0dXJuOworCQorIGNzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKwlhdG1lbF9yZWxlYXNlKGxpbmspOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBhdG1lbF9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXRtZWxfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXY7CisJCQorCURFQlVHKDAsICJhdG1lbF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKwkKKwkvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworCWxpbmstPmRldiA9IE5VTEw7CisJCisJaWYgKGRldikgCisJCXN0b3BfYXRtZWxfY2FyZChkZXYsIDApOworCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IE5VTEw7IAorCQorCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuCisKKyAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEKKyAgcHJpdmF0ZSBmbGFnIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUKKyAgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZworICB0byBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGF0bWVsX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gbGluay0+cHJpdjsKKwkKKwlERUJVRygxLCAiYXRtZWxfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCQorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJCWF0bWVsX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCWF0bWVsX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJYXRtZWxfb3Blbihsb2NhbC0+ZXRoX2Rldik7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9IC8qIGF0bWVsX2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGF0bWVsX2RyaXZlciA9IHsKKyAgICAgICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5kcnYgICAgICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgID0gImF0bWVsX2NzIiwKKyAgICAgICAgfSwKKyAgICAgICAgLmF0dGFjaCAgICAgICAgID0gYXRtZWxfYXR0YWNoLAorICAgICAgICAuZGV0YWNoICAgICAgICAgPSBhdG1lbF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IGF0bWVsX2NzX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmF0bWVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NzX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIEluIGFkZGl0aW9uOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbi4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICAgIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICAgIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAKKyovCisKK21vZHVsZV9pbml0KGF0bWVsX2NzX2luaXQpOworbW9kdWxlX2V4aXQoYXRtZWxfY3NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjAwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9wY2kuYwpAQCAtMCwwICsxLDg5IEBACisvKioqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgRHJpdmVyIGZvciBBdG1lbCBhdDc2YzUwMiBhdDc2YzUwNCBhbmQgYXQ3NmM1MDYgd2lyZWxlc3MgY2FyZHMuCisKKyAgICAgICAgIENvcHlyaWdodCAyMDA0IFNpbW9uIEtlbGxleS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbCB3aXJlbGVzcyBsYW4gZHJpdmVyczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJhdG1lbC5oIgorCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBLZWxsZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQXRtZWwgYXQ3NmM1MHggODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IGNhcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkF0bWVsIGF0NzZjNTA2IFBDSSB3aXJlbGVzcyBjYXJkcyIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKKwl7IDB4MTExNCwgMHgwNTA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2FyZF9pZHMpOworCitzdGF0aWMgaW50IGF0bWVsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdG1lbF9kcml2ZXIgPSB7CisJLm5hbWUgICAgID0gImF0bWVsIiwKKwkuaWRfdGFibGUgPSBjYXJkX2lkcywKKwkucHJvYmUgICAgPSBhdG1lbF9wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYXRtZWxfcGNpX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bWVsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCQorCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCisJZGV2ID0gaW5pdF9hdG1lbF9jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQsIAorCQkJICAgICAgQVRNRUxfRldfVFlQRV81MDYsCisJCQkgICAgICAmcGRldi0+ZGV2LCBOVUxMLCBOVUxMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdG1lbF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0b3BfYXRtZWxfY2FyZChwY2lfZ2V0X2RydmRhdGEocGRldiksIDEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmF0bWVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdG1lbF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXRtZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXRtZWxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXRtZWxfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMzZDBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmMKQEAgLTAsMCArMSw1NTQgQEAKKy8qIGhlcm1lcy5jCisgKgorICogRHJpdmVyIGNvcmUgZm9yIHRoZSAiSGVybWVzIiB3aXJlbGVzcyBNQUMgY29udHJvbGxlciwgYXMgdXNlZCBpbgorICogdGhlIEx1Y2VudCBPcmlub2NvIGFuZCBDYWJsZXRyb24gUm9hbUFib3V0IGNhcmRzLiBJdCBzaG91bGQgYWxzbworICogd29yayBvbiB0aGUgaGZhMzg0MSBhbmQgaGZhMzg0MiBNQUMgY29udHJvbGxlciBjaGlwcyB1c2VkIGluIHRoZQorICogUHJpc20gSUkgY2hpcHNldHMuCisgKgorICogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBkcml2ZXIsIGp1c3QgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lcyBmb3IKKyAqIHRoZSBNQUMgY29udHJvbGxlciBpdHNlbGYuCisgKgorICogQmFzZWQgb24gdGhlIHByaXNtMiBkcml2ZXIgZnJvbSBBYnNvbHV0ZSBWYWx1ZSBTeXN0ZW1zJyBsaW51eC13bGFuCisgKiBwcm9qZWN0LCB0aGUgTGludXggd3ZsYW5fY3MgZHJpdmVyLCBMdWNlbnQncyBIQ0YtTGlnaHQKKyAqICh3dmxhbl9oY2YuYykgbGlicmFyeSwgYW5kIHRoZSBOZXRCU0Qgd2lyZWxlc3MgZHJpdmVyIChpbiBubworICogcGFydGljdWxhciBvcmRlcikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCBEYXZpZCBHaWJzb24sIExpbnV4Y2FyZSBBdXN0cmFsaWEuCisgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDEtMjAwMy4KKyAqIAorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkxvdy1sZXZlbCBkcml2ZXIgaGVscGVyIGZvciBMdWNlbnQgSGVybWVzIGNoaXBzZXQgYW5kIFByaXNtIElJIEhGQTM4NHggd2lyZWxlc3MgTUFDIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+IgorCSIgJiBEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+Iik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKy8qIFRoZXNlIGFyZSBtYXhpbXVtIHRpbWVvdXRzLiBNb3N0IG9mdGVuLCBjYXJkIHdpbCByZWFjdCBtdWNoIGZhc3RlciAqLworI2RlZmluZSBDTURfQlVTWV9USU1FT1VUICgxMDApIC8qIEluIGl0ZXJhdGlvbnMgb2YgfjF1cyAqLworI2RlZmluZSBDTURfSU5JVF9USU1FT1VUICg1MDAwMCkgLyogaW4gaXRlcmF0aW9ucyBvZiB+MTB1cyAqLworI2RlZmluZSBDTURfQ09NUExfVElNRU9VVCAoMjAwMDApIC8qIGluIGl0ZXJhdGlvbnMgb2YgfjEwdXMgKi8KKyNkZWZpbmUgQUxMT0NfQ09NUExfVElNRU9VVCAoMTAwMCkgLyogaW4gaXRlcmF0aW9ucyBvZiB+MTB1cyAqLworCisvKgorICogRGVidWdnaW5nIGhlbHBlcnMKKyAqLworCisjZGVmaW5lIERNU0coc3R1ZmYuLi4pIGRvIHtwcmludGsoS0VSTl9ERUJVRyAiaGVybWVzIEAgJXA6ICIgLCBody0+aW9iYXNlKTsgXAorCQkJcHJpbnRrKHN0dWZmKTt9IHdoaWxlICgwKQorCisjdW5kZWYgSEVSTUVTX0RFQlVHCisjaWZkZWYgSEVSTUVTX0RFQlVHCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgREVCVUcobHZsLCBzdHVmZi4uLikgaWYgKCAobHZsKSA8PSBIRVJNRVNfREVCVUcpIERNU0coc3R1ZmYpCisKKyNlbHNlIC8qICEgSEVSTUVTX0RFQlVHICovCisKKyNkZWZpbmUgREVCVUcobHZsLCBzdHVmZi4uLikgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogISBIRVJNRVNfREVCVUcgKi8KKworCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KKworLyogSXNzdWUgYSBjb21tYW5kIHRvIHRoZSBjaGlwLiBXYWl0aW5nIGZvciBpdCB0byBjb21wbGV0ZSBpcyB0aGUgY2FsbGVyJ3MKKyAgIHByb2JsZW0uCisKKyAgIFJldHVybnMgLUVCVVNZIGlmIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIGJ1c3ksIDAgb24gc3VjY2Vzcy4KKworICAgQ2FsbGFibGUgZnJvbSBhbnkgY29udGV4dC4KKyovCitzdGF0aWMgaW50IGhlcm1lc19pc3N1ZV9jbWQoaGVybWVzX3QgKmh3LCB1MTYgY21kLCB1MTYgcGFyYW0wKQoreworCWludCBrID0gQ01EX0JVU1lfVElNRU9VVDsKKwl1MTYgcmVnOworCisJLyogRmlyc3Qgd2FpdCBmb3IgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8gdW5idXN5ICovCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl3aGlsZSAoIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpICYmIGsgKSB7CisJCWstLTsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCX0KKwlpZiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBBUkFNMiwgMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBBUkFNMSwgMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBBUkFNMCwgcGFyYW0wKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgQ01ELCBjbWQpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAqLworCit2b2lkIGhlcm1lc19zdHJ1Y3RfaW5pdChoZXJtZXNfdCAqaHcsIHZvaWQgX19pb21lbSAqYWRkcmVzcywgaW50IHJlZ19zcGFjaW5nKQoreworCWh3LT5pb2Jhc2UgPSBhZGRyZXNzOworCWh3LT5yZWdfc3BhY2luZyA9IHJlZ19zcGFjaW5nOworCWh3LT5pbnRlbiA9IDB4MDsKKworI2lmZGVmIEhFUk1FU19ERUJVR19CVUZGRVIKKwlody0+ZGJ1ZnAgPSAwOworCW1lbXNldCgmaHctPmRidWYsIDB4ZmYsIHNpemVvZihody0+ZGJ1ZikpOworCW1lbXNldCgmaHctPnByb2ZpbGUsIDAsIHNpemVvZihody0+cHJvZmlsZSkpOworI2VuZGlmCit9CisKK2ludCBoZXJtZXNfaW5pdChoZXJtZXNfdCAqaHcpCit7CisJdTE2IHN0YXR1cywgcmVnOworCWludCBlcnIgPSAwOworCWludCBrOworCisJLyogV2UgZG9uJ3Qgd2FudCB0byBiZSBpbnRlcnJ1cHRlZCB3aGlsZSByZXNldHRpbmcgdGhlIGNoaXBzZXQgKi8KKwlody0+aW50ZW4gPSAweDA7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIElOVEVOLCAwKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4ZmZmZik7CisKKwkvKiBOb3JtYWxseSBpdCdzIGEgImNhbid0IGhhcHBlbiIgZm9yIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHRvCisgICAgICAgICAgIGJlIGJ1c3kgd2hlbiB3ZSBnbyB0byBpc3N1ZSBhIGNvbW1hbmQgYmVjYXVzZSB3ZSBhcmUKKyAgICAgICAgICAgc2VyaWFsaXppbmcgYWxsIGNvbW1hbmRzLiAgSG93ZXZlciB3ZSB3YW50IHRvIGhhdmUgc29tZQorICAgICAgICAgICBjaGFuY2Ugb2YgcmVzZXR0aW5nIHRoZSBjYXJkIGV2ZW4gaWYgaXQgZ2V0cyBpbnRvIGEgc3R1cGlkCisgICAgICAgICAgIHN0YXRlLCBzbyB3ZSBhY3R1YWxseSB3YWl0IHRvIHNlZSBpZiB0aGUgY29tbWFuZCByZWdpc3RlcgorICAgICAgICAgICB3aWxsIHVuYnVzeSBpdHNlbGYgaGVyZS4gKi8KKwlrID0gQ01EX0JVU1lfVElNRU9VVDsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlIChrICYmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpKSB7CisJCWlmIChyZWcgPT0gMHhmZmZmKSAvKiBTcGVjaWFsIGNhc2UgLSB0aGUgY2FyZCBoYXMgcHJvYmFibHkgYmVlbiByZW1vdmVkLAorCQkJCSAgICAgIHNvIGRvbid0IHdhaXQgZm9yIHRoZSB0aW1lb3V0ICovCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisJCisJLyogTm8gbmVlZCB0byBleHBsaWNpdGx5IGhhbmRsZSB0aGUgdGltZW91dCAtIGlmIHdlJ3ZlIHRpbWVkCisJICAgb3V0IGhlcm1lc19pc3N1ZV9jbWQoKSB3aWxsIHByb2JhYmx5IHJldHVybiAtRUJVU1kgYmVsb3cgKi8KKworCS8qIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwgRVZTVEFUIG1heSBjb250YWluCisJICAgb2Jzb2xldGUgZXZlbnQgb2NjdXJyZW5jZSBpbmZvcm1hdGlvbi4gIFdlIGhhdmUgdG8gYWNrbm93bGVkZ2UKKwkgICBpdCBieSB3cml0aW5nIEVWQUNLLiAqLworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCByZWcpOworCisJLyogV2UgZG9uJ3QgdXNlIGhlcm1lc19kb2NtZF93YWl0IGhlcmUsIGJlY2F1c2UgdGhlIHJlc2V0IHdpcGVzCisJICAgdGhlIG1hZ2ljIGNvbnN0YW50IGluIFNXU1VQUE9SVDAgYXdheSwgYW5kIGl0IGdldHMgY29uZnVzZWQgKi8KKwllcnIgPSBoZXJtZXNfaXNzdWVfY21kKGh3LCBIRVJNRVNfQ01EX0lOSVQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWsgPSBDTURfSU5JVF9USU1FT1VUOworCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwl9CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgU1dTVVBQT1JUMCwgSEVSTUVTX01BR0lDKTsKKworCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgeworCQlERUJVRygwLCAiaGVybWVzIEAgMHgleDogQ2FyZCByZW1vdmVkIGR1cmluZyByZXNldC5cbiIsCisJCSAgICAgICBody0+aW9iYXNlKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCQkKKwlpZiAoISAocmVnICYgSEVSTUVTX0VWX0NNRCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogIiAKKwkJICAgICAgICJUaW1lb3V0IHdhaXRpbmcgZm9yIGNhcmQgdG8gcmVzZXQgKHJlZz0weCUwNHgpIVxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UsIHJlZyk7CisJCWVyciA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFNUQVRVUyk7CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIEhFUk1FU19FVl9DTUQpOworCisJaWYgKHN0YXR1cyAmIEhFUk1FU19TVEFUVVNfUkVTVUxUKQorCQllcnIgPSAtRUlPOworCisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIElzc3VlIGEgY29tbWFuZCB0byB0aGUgY2hpcCwgYW5kIChidXN5ISkgd2FpdCBmb3IgaXQgdG8KKyAqIGNvbXBsZXRlLgorICoKKyAqIFJldHVybnM6IDwgMCBvbiBpbnRlcm5hbCBlcnJvciwgMCBvbiBzdWNjZXNzLCA+IDAgb24gZXJyb3IgcmV0dXJuZWQgYnkgdGhlIGZpcm13YXJlCisgKgorICogQ2FsbGFibGUgZnJvbSBhbnkgY29udGV4dCwgYnV0IGxvY2tpbmcgaXMgeW91ciBwcm9ibGVtLiAqLworaW50IGhlcm1lc19kb2NtZF93YWl0KGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLAorCQkgICAgICBzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlICpyZXNwKQoreworCWludCBlcnI7CisJaW50IGs7CisJdTE2IHJlZzsKKwl1MTYgc3RhdHVzOworCisJZXJyID0gaGVybWVzX2lzc3VlX2NtZChodywgY21kLCBwYXJtMCk7CisJaWYgKGVycikgeworCQlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICIKKwkJCQkgICAgICAgIkNhcmQgcmVtb3ZlZCB3aGlsZSBpc3N1aW5nIGNvbW1hbmQgIgorCQkJCSAgICAgICAiMHglMDR4LlxuIiwgaHctPmlvYmFzZSwgY21kKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCX0gZWxzZSAKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogIgorCQkJCSAgICAgICAiRXJyb3IgJWQgaXNzdWluZyBjb21tYW5kIDB4JTA0eC5cbiIsCisJCQkJICAgICAgIGh3LT5pb2Jhc2UsIGVyciwgY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlrID0gQ01EX0NPTVBMX1RJTUVPVVQ7CisJd2hpbGUgKCAoISAocmVnICYgSEVSTUVTX0VWX0NNRCkpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMTApOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCX0KKworCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogQ2FyZCByZW1vdmVkICIKKwkJICAgICAgICJ3aGlsZSB3YWl0aW5nIGZvciBjb21tYW5kIDB4JTA0eCBjb21wbGV0aW9uLlxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UsIGNtZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwkJCisJaWYgKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6IFRpbWVvdXQgd2FpdGluZyBmb3IgIgorCQkgICAgICAgImNvbW1hbmQgMHglMDR4IGNvbXBsZXRpb24uXG4iLCBody0+aW9iYXNlLCBjbWQpOworCQllcnIgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBTVEFUVVMpOworCWlmIChyZXNwKSB7CisJCXJlc3AtPnN0YXR1cyA9IHN0YXR1czsKKwkJcmVzcC0+cmVzcDAgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSRVNQMCk7CisJCXJlc3AtPnJlc3AxID0gaGVybWVzX3JlYWRfcmVnbihodywgUkVTUDEpOworCQlyZXNwLT5yZXNwMiA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJFU1AyKTsKKwl9CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIEhFUk1FU19FVl9DTUQpOworCisJaWYgKHN0YXR1cyAmIEhFUk1FU19TVEFUVVNfUkVTVUxUKQorCQllcnIgPSAtRUlPOworCisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK2ludCBoZXJtZXNfYWxsb2NhdGUoaGVybWVzX3QgKmh3LCB1MTYgc2l6ZSwgdTE2ICpmaWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGs7CisJdTE2IHJlZzsKKwkKKwlpZiAoIChzaXplIDwgSEVSTUVTX0FMTE9DX0xFTl9NSU4pIHx8IChzaXplID4gSEVSTUVTX0FMTE9DX0xFTl9NQVgpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9BTExPQywgc2l6ZSwgTlVMTCk7CisJaWYgKGVycikgeworCQlyZXR1cm4gZXJyOworCX0KKworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJayA9IEFMTE9DX0NPTVBMX1RJTUVPVVQ7CisJd2hpbGUgKCAoISAocmVnICYgSEVSTUVTX0VWX0FMTE9DKSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxMCk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJfQorCQorCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogIgorCQkgICAgICAgIkNhcmQgcmVtb3ZlZCB3YWl0aW5nIGZvciBmcmFtZSBhbGxvY2F0aW9uLlxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCQorCWlmICghIChyZWcgJiBIRVJNRVNfRVZfQUxMT0MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIKKwkJICAgICAgICJUaW1lb3V0IHdhaXRpbmcgZm9yIGZyYW1lIGFsbG9jYXRpb25cbiIsCisJCSAgICAgICBody0+aW9iYXNlKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJKmZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEFMTE9DRklEKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIEhFUk1FU19FVl9BTExPQyk7CisJCisJcmV0dXJuIDA7Cit9CisKKworLyogU2V0IHVwIGEgQkFQIHRvIHJlYWQgYSBwYXJ0aWN1bGFyIGNodW5rIG9mIGRhdGEgZnJvbSBjYXJkJ3MgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIFJldHVybnM6IDwgMCBvbiBpbnRlcm5hbCBmYWlsdXJlIChlcnJubyksIDAgb24gc3VjY2VzcywgPjAgb24gZXJyb3IKKyAqIGZyb20gZmlybXdhcmUKKyAqCisgKiBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0ICovCitzdGF0aWMgaW50IGhlcm1lc19iYXBfc2VlayhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiBpZCwgdTE2IG9mZnNldCkKK3sKKwlpbnQgc3JlZyA9IGJhcCA/IEhFUk1FU19TRUxFQ1QxIDogSEVSTUVTX1NFTEVDVDA7CisJaW50IG9yZWcgPSBiYXAgPyBIRVJNRVNfT0ZGU0VUMSA6IEhFUk1FU19PRkZTRVQwOworCWludCBrOworCXUxNiByZWc7CisKKwkvKiBQYXJhbm9pYS4uICovCisJaWYgKCAob2Zmc2V0ID4gSEVSTUVTX0JBUF9PRkZTRVRfTUFYKSB8fCAob2Zmc2V0ICUgMikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWsgPSBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVDsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9yZWcpOworCXdoaWxlICgocmVnICYgSEVSTUVTX09GRlNFVF9CVVNZKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9yZWcpOworCX0KKworI2lmZGVmIEhFUk1FU19ERUJVR19CVUZGRVIKKwlody0+cHJvZmlsZVtIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCAtIGtdKys7CisKKwlpZiAoayA8IEhFUk1FU19CQVBfQlVTWV9USU1FT1VUKSB7CisJCXN0cnVjdCBoZXJtZXNfZGVidWdfZW50cnkgKmUgPSAKKwkJCSZody0+ZGJ1ZlsoaHctPmRidWZwKyspICUgSEVSTUVTX0RFQlVHX0JVRlNJWkVdOworCQllLT5iYXAgPSBiYXA7CisJCWUtPmlkID0gaWQ7CisJCWUtPm9mZnNldCA9IG9mZnNldDsKKwkJZS0+Y3ljbGVzID0gSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQgLSBrOworCX0KKyNlbmRpZgorCisJaWYgKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkvKiBOb3cgd2UgYWN0dWFsbHkgc2V0IHVwIHRoZSB0cmFuc2ZlciAqLworCWhlcm1lc193cml0ZV9yZWcoaHcsIHNyZWcsIGlkKTsKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBvcmVnLCBvZmZzZXQpOworCisJLyogV2FpdCBmb3IgdGhlIEJBUCB0byBiZSByZWFkeSAqLworCWsgPSBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVDsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9yZWcpOworCXdoaWxlICggKHJlZyAmIChIRVJNRVNfT0ZGU0VUX0JVU1kgfCBIRVJNRVNfT0ZGU0VUX0VSUikpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZyhodywgb3JlZyk7CisJfQorCisJaWYgKHJlZyAhPSBvZmZzZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogQkFQJWQgb2Zmc2V0ICVzOiAiCisJCSAgICAgICAicmVnPTB4JXggaWQ9MHgleCBvZmZzZXQ9MHgleFxuIiwgaHctPmlvYmFzZSwgYmFwLAorCQkgICAgICAgKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkgPyAidGltZW91dCIgOiAiZXJyb3IiLAorCQkgICAgICAgcmVnLCBpZCwgb2Zmc2V0KTsKKworCQlpZiAocmVnICYgSEVSTUVTX09GRlNFVF9CVVNZKSB7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCXJldHVybiAtRUlPOwkJLyogZXJyb3Igb3Igd3Jvbmcgb2Zmc2V0ICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIGNoaXAncyBidWZmZXIsIHZpYSB0aGUKKyAqIEJBUC4gU3luY2hyb25pemF0aW9uL3NlcmlhbGl6YXRpb24gaXMgdGhlIGNhbGxlcidzIHByb2JsZW0uICBsZW4KKyAqIG11c3QgYmUgZXZlbi4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZmFpbHVyZSAoZXJybm8pLCAwIG9uIHN1Y2Nlc3MsID4gMCBvbiBlcnJvciBmcm9tIGZpcm13YXJlCisgKi8KK2ludCBoZXJtZXNfYmFwX3ByZWFkKGhlcm1lc190ICpodywgaW50IGJhcCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCSAgICAgdTE2IGlkLCB1MTYgb2Zmc2V0KQoreworCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOworCWludCBlcnIgPSAwOworCisJaWYgKCAobGVuIDwgMCkgfHwgKGxlbiAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgaWQsIG9mZnNldCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBBY3R1YWxseSBkbyB0aGUgdHJhbnNmZXIgKi8KKwloZXJtZXNfcmVhZF93b3JkcyhodywgZHJlZywgYnVmLCBsZW4vMik7CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyogV3JpdGUgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBjaGlwJ3MgYnVmZmVyLCB2aWEgdGhlCisgKiBCQVAuIFN5bmNocm9uaXphdGlvbi9zZXJpYWxpemF0aW9uIGlzIHRoZSBjYWxsZXIncyBwcm9ibGVtLiBsZW4KKyAqIG11c3QgYmUgZXZlbi4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZmFpbHVyZSAoZXJybm8pLCAwIG9uIHN1Y2Nlc3MsID4gMCBvbiBlcnJvciBmcm9tIGZpcm13YXJlCisgKi8KK2ludCBoZXJtZXNfYmFwX3B3cml0ZShoZXJtZXNfdCAqaHcsIGludCBiYXAsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkgICAgICB1MTYgaWQsIHUxNiBvZmZzZXQpCit7CisJaW50IGRyZWcgPSBiYXAgPyBIRVJNRVNfREFUQTEgOiBIRVJNRVNfREFUQTA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIChsZW4gPCAwKSB8fCAobGVuICUgMikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19iYXBfc2VlayhodywgYmFwLCBpZCwgb2Zmc2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwkKKwkvKiBBY3R1YWxseSBkbyB0aGUgdHJhbnNmZXIgKi8KKwloZXJtZXNfd3JpdGVfd29yZHMoaHcsIGRyZWcsIGJ1ZiwgbGVuLzIpOworCisgb3V0OgkKKwlyZXR1cm4gZXJyOworfQorCisvKiBSZWFkIGEgTGVuZ3RoLVR5cGUtVmFsdWUgcmVjb3JkIGZyb20gdGhlIGNhcmQuCisgKgorICogSWYgbGVuZ3RoIGlzIE5VTEwsIHdlIGlnbm9yZSB0aGUgbGVuZ3RoIHJlYWQgZnJvbSB0aGUgY2FyZCwgYW5kCisgKiByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIHJlZ2FyZGxlc3MuIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugc29tZSBvZgorICogdGhlIGNvbmZpZ3VyYXRpb24gcmVjb3JkcyBhcHBlYXIgdG8gaGF2ZSBpbmNvcnJlY3QgbGVuZ3RocyBpbgorICogcHJhY3RpY2UuCisgKgorICogQ2FsbGFibGUgZnJvbSB1c2VyIG9yIGJoIGNvbnRleHQuICAqLworaW50IGhlcm1lc19yZWFkX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHVuc2lnbmVkIGJ1ZnNpemUsCisJCSAgICB1MTYgKmxlbmd0aCwgdm9pZCAqYnVmKQoreworCWludCBlcnIgPSAwOworCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOworCXUxNiBybGVuZ3RoLCBydHlwZTsKKwl1bnNpZ25lZCBud29yZHM7CisKKwlpZiAoIChidWZzaXplIDwgMCkgfHwgKGJ1ZnNpemUgJSAyKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfQUNDRVNTLCByaWQsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgcmlkLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmxlbmd0aCA9IGhlcm1lc19yZWFkX3JlZyhodywgZHJlZyk7CisKKwlpZiAoISBybGVuZ3RoKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlydHlwZSA9IGhlcm1lc19yZWFkX3JlZyhodywgZHJlZyk7CisKKwlpZiAobGVuZ3RoKQorCQkqbGVuZ3RoID0gcmxlbmd0aDsKKworCWlmIChydHlwZSAhPSByaWQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAlcygpOiAiCisJCSAgICAgICAicmlkICgweCUwNHgpIGRvZXMgbm90IG1hdGNoIHR5cGUgKDB4JTA0eClcbiIsCisJCSAgICAgICBody0+aW9iYXNlLCBfX0ZVTkNUSU9OX18sIHJpZCwgcnR5cGUpOworCWlmIChIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKHJsZW5ndGgpID4gYnVmc2l6ZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICIKKwkJICAgICAgICJUcnVuY2F0aW5nIExUViByZWNvcmQgZnJvbSAlZCB0byAlZCBieXRlcy4gIgorCQkgICAgICAgIihyaWQ9MHglMDR4LCBsZW49MHglMDR4KVxuIiwgaHctPmlvYmFzZSwKKwkJICAgICAgIEhFUk1FU19SRUNMRU5fVE9fQllURVMocmxlbmd0aCksIGJ1ZnNpemUsIHJpZCwgcmxlbmd0aCk7CisKKwlud29yZHMgPSBtaW4oKHVuc2lnbmVkKXJsZW5ndGggLSAxLCBidWZzaXplIC8gMik7CisJaGVybWVzX3JlYWRfd29yZHMoaHcsIGRyZWcsIGJ1ZiwgbndvcmRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgaGVybWVzX3dyaXRlX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIAorCQkgICAgIHUxNiBsZW5ndGgsIGNvbnN0IHZvaWQgKnZhbHVlKQoreworCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGNvdW50OworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19iYXBfc2VlayhodywgYmFwLCByaWQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBkcmVnLCBsZW5ndGgpOworCWhlcm1lc193cml0ZV9yZWcoaHcsIGRyZWcsIHJpZCk7CisKKwljb3VudCA9IGxlbmd0aCAtIDE7CisKKwloZXJtZXNfd3JpdGVfd29yZHMoaHcsIGRyZWcsIHZhbHVlLCBjb3VudCk7CisKKwllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9BQ0NFU1MgfCBIRVJNRVNfQ01EX1dSSVRFLCAKKwkJCQlyaWQsIE5VTEwpOworCisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTChoZXJtZXNfc3RydWN0X2luaXQpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19kb2NtZF93YWl0KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX2FsbG9jYXRlKTsKKworRVhQT1JUX1NZTUJPTChoZXJtZXNfYmFwX3ByZWFkKTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX2JhcF9wd3JpdGUpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfcmVhZF9sdHYpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfd3JpdGVfbHR2KTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9oZXJtZXModm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaGVybWVzKHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaGVybWVzKTsKK21vZHVsZV9leGl0KGV4aXRfaGVybWVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5ZTg3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCkBAIC0wLDAgKzEsNDgxIEBACisvKiBoZXJtZXMuaAorICoKKyAqIERyaXZlciBjb3JlIGZvciB0aGUgIkhlcm1lcyIgd2lyZWxlc3MgTUFDIGNvbnRyb2xsZXIsIGFzIHVzZWQgaW4KKyAqIHRoZSBMdWNlbnQgT3Jpbm9jbyBhbmQgQ2FibGV0cm9uIFJvYW1BYm91dCBjYXJkcy4gSXQgc2hvdWxkIGFsc28KKyAqIHdvcmsgb24gdGhlIGhmYTM4NDEgYW5kIGhmYTM4NDIgTUFDIGNvbnRyb2xsZXIgY2hpcHMgdXNlZCBpbiB0aGUKKyAqIFByaXNtIEkgJiBJSSBjaGlwc2V0cy4KKyAqCisgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGRyaXZlciwganVzdCBsb3ctbGV2ZWwgYWNjZXNzIHJvdXRpbmVzIGZvcgorICogdGhlIE1BQyBjb250cm9sbGVyIGl0c2VsZi4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcHJpc20yIGRyaXZlciBmcm9tIEFic29sdXRlIFZhbHVlIFN5c3RlbXMnIGxpbnV4LXdsYW4KKyAqIHByb2plY3QsIHRoZSBMaW51eCB3dmxhbl9jcyBkcml2ZXIsIEx1Y2VudCdzIEhDRi1MaWdodAorICogKHd2bGFuX2hjZi5jKSBsaWJyYXJ5LCBhbmQgdGhlIE5ldEJTRCB3aXJlbGVzcyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCBEYXZpZCBHaWJzb24sIExpbnV4Y2FyZSBBdXN0cmFsaWEuCisgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDEtMjAwMy4KKyAqCisgKiBQb3J0aW9ucyB0YWtlbiBmcm9tIGhmYTM4NHguaCwgQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgR1BMLCB2ZXJzaW9uIDIuCisgKi8KKworI2lmbmRlZiBfSEVSTUVTX0gKKyNkZWZpbmUgX0hFUk1FU19ICisKKy8qIE5vdGVzIG9uIGxvY2tpbmc6CisgKgorICogQXMgYSBtb2R1bGUgb2YgbG93IGxldmVsIGhhcmR3YXJlIGFjY2VzcyByb3V0aW5lcywgdGhlcmUgaXMgbm8KKyAqIGxvY2tpbmcuIFVzZXJzIG9mIHRoaXMgbW9kdWxlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGV5IHNlcmlhbGl6ZQorICogYWNjZXNzIHRvIHRoZSBoZXJtZXNfdCBzdHJ1Y3R1cmUsIGFuZCB0byB0aGUgaGFyZHdhcmUKKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogTGltaXRzIGFuZCBjb25zdGFudHMKKyAqLworI2RlZmluZQkJSEVSTUVTX0FMTE9DX0xFTl9NSU4JCSg0KQorI2RlZmluZQkJSEVSTUVTX0FMTE9DX0xFTl9NQVgJCSgyNDAwKQorI2RlZmluZQkJSEVSTUVTX0xUVl9MRU5fTUFYCQkoMzQpCisjZGVmaW5lCQlIRVJNRVNfQkFQX0RBVEFMRU5fTUFYCQkoNDA5NikKKyNkZWZpbmUJCUhFUk1FU19CQVBfT0ZGU0VUX01BWAkJKDQwOTYpCisjZGVmaW5lCQlIRVJNRVNfUE9SVElEX01BWAkJKDcpCisjZGVmaW5lCQlIRVJNRVNfTlVNUE9SVFNfTUFYCQkoSEVSTUVTX1BPUlRJRF9NQVgrMSkKKyNkZWZpbmUJCUhFUk1FU19QRFJfTEVOX01BWAkJKDI2MCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhFUk1FU19QREFfUkVDU19NQVgJCSgyMDApCS8qIGEgZ3Vlc3MgKi8KKyNkZWZpbmUJCUhFUk1FU19QREFfTEVOX01BWAkJKDEwMjQpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRVJNRVNfU0NBTlJFU1VMVF9NQVgJCSgzNSkKKyNkZWZpbmUJCUhFUk1FU19DSElORk9SRVNVTFRfTUFYCQkoOCkKKyNkZWZpbmUJCUhFUk1FU19NQVhfTVVMVElDQVNUCQkoMTYpCisjZGVmaW5lCQlIRVJNRVNfTUFHSUMJCQkoMHg3ZDFmKQorCisvKgorICogSGVybWVzIHJlZ2lzdGVyIG9mZnNldHMKKyAqLworI2RlZmluZQkJSEVSTUVTX0NNRAkJCSgweDAwKQorI2RlZmluZQkJSEVSTUVTX1BBUkFNMAkJCSgweDAyKQorI2RlZmluZQkJSEVSTUVTX1BBUkFNMQkJCSgweDA0KQorI2RlZmluZQkJSEVSTUVTX1BBUkFNMgkJCSgweDA2KQorI2RlZmluZQkJSEVSTUVTX1NUQVRVUwkJCSgweDA4KQorI2RlZmluZQkJSEVSTUVTX1JFU1AwCQkJKDB4MEEpCisjZGVmaW5lCQlIRVJNRVNfUkVTUDEJCQkoMHgwQykKKyNkZWZpbmUJCUhFUk1FU19SRVNQMgkJCSgweDBFKQorI2RlZmluZQkJSEVSTUVTX0lORk9GSUQJCQkoMHgxMCkKKyNkZWZpbmUJCUhFUk1FU19SWEZJRAkJCSgweDIwKQorI2RlZmluZQkJSEVSTUVTX0FMTE9DRklECQkJKDB4MjIpCisjZGVmaW5lCQlIRVJNRVNfVFhDT01QTEZJRAkJKDB4MjQpCisjZGVmaW5lCQlIRVJNRVNfU0VMRUNUMAkJCSgweDE4KQorI2RlZmluZQkJSEVSTUVTX09GRlNFVDAJCQkoMHgxQykKKyNkZWZpbmUJCUhFUk1FU19EQVRBMAkJCSgweDM2KQorI2RlZmluZQkJSEVSTUVTX1NFTEVDVDEJCQkoMHgxQSkKKyNkZWZpbmUJCUhFUk1FU19PRkZTRVQxCQkJKDB4MUUpCisjZGVmaW5lCQlIRVJNRVNfREFUQTEJCQkoMHgzOCkKKyNkZWZpbmUJCUhFUk1FU19FVlNUQVQJCQkoMHgzMCkKKyNkZWZpbmUJCUhFUk1FU19JTlRFTgkJCSgweDMyKQorI2RlZmluZQkJSEVSTUVTX0VWQUNLCQkJKDB4MzQpCisjZGVmaW5lCQlIRVJNRVNfQ09OVFJPTAkJCSgweDE0KQorI2RlZmluZQkJSEVSTUVTX1NXU1VQUE9SVDAJCSgweDI4KQorI2RlZmluZQkJSEVSTUVTX1NXU1VQUE9SVDEJCSgweDJBKQorI2RlZmluZQkJSEVSTUVTX1NXU1VQUE9SVDIJCSgweDJDKQorI2RlZmluZQkJSEVSTUVTX0FVWFBBR0UJCQkoMHgzQSkKKyNkZWZpbmUJCUhFUk1FU19BVVhPRkZTRVQJCSgweDNDKQorI2RlZmluZQkJSEVSTUVTX0FVWERBVEEJCQkoMHgzRSkKKworLyoKKyAqIENNRCByZWdpc3RlciBiaXRtYXNrcworICovCisjZGVmaW5lCQlIRVJNRVNfQ01EX0JVU1kJCQkoMHg4MDAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9BSU5GTwkJKDB4N2YwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfTUFDUE9SVAkJKDB4MDcwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfUkVDTAkJCSgweDAxMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1dSSVRFCQkoMHgwMTAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9QUk9HTU9ERQkJKDB4MDMwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfQ01EQ09ERQkJKDB4MDAzZikKKworLyoKKyAqIFNUQVRVUyByZWdpc3RlciBiaXRtYXNrcworICovCisjZGVmaW5lCQlIRVJNRVNfU1RBVFVTX1JFU1VMVAkJKDB4N2YwMCkKKyNkZWZpbmUJCUhFUk1FU19TVEFUVVNfQ01EQ09ERQkJKDB4MDAzZikKKworLyoKKyAqIE9GRlNFVCByZWdpc3RlciBiaXRtYXNrcworICovCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUX0JVU1kJCSgweDgwMDApCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUX0VSUgkJKDB4NDAwMCkKKyNkZWZpbmUJCUhFUk1FU19PRkZTRVRfREFUQU9GRgkJKDB4MGZmZSkKKworLyoKKyAqIEV2ZW50IHJlZ2lzdGVyIGJpdG1hc2tzIChJTlRFTiwgRVZTVEFULCBFVkFDSykKKyAqLworI2RlZmluZQkJSEVSTUVTX0VWX1RJQ0sJCQkoMHg4MDAwKQorI2RlZmluZQkJSEVSTUVTX0VWX1dURVJSCQkJKDB4NDAwMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9JTkZEUk9QCQkoMHgyMDAwKQorI2RlZmluZQkJSEVSTUVTX0VWX0lORk8JCQkoMHgwMDgwKQorI2RlZmluZQkJSEVSTUVTX0VWX0RUSU0JCQkoMHgwMDIwKQorI2RlZmluZQkJSEVSTUVTX0VWX0NNRAkJCSgweDAwMTApCisjZGVmaW5lCQlIRVJNRVNfRVZfQUxMT0MJCQkoMHgwMDA4KQorI2RlZmluZQkJSEVSTUVTX0VWX1RYRVhDCQkJKDB4MDAwNCkKKyNkZWZpbmUJCUhFUk1FU19FVl9UWAkJCSgweDAwMDIpCisjZGVmaW5lCQlIRVJNRVNfRVZfUlgJCQkoMHgwMDAxKQorCisvKgorICogQ29tbWFuZCBjb2RlcworICovCisvKi0tLSBDb250cm9sbGVyIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEVSTUVTX0NNRF9JTklUCQkJKDB4MDAwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfRU5BQkxFCQkoMHgwMDAxKQorI2RlZmluZQkJSEVSTUVTX0NNRF9ESVNBQkxFCQkoMHgwMDAyKQorI2RlZmluZQkJSEVSTUVTX0NNRF9ESUFHCQkJKDB4MDAwMykKKworLyotLS0gQnVmZmVyIE1nbXQgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfQUxMT0MJCSgweDAwMEEpCisjZGVmaW5lCQlIRVJNRVNfQ01EX1RYCQkJKDB4MDAwQikKKworLyotLS0gUmVndWxhdGUgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfTk9USUZZCQkoMHgwMDEwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9JTlFVSVJFCQkoMHgwMDExKQorCisvKi0tLSBDb25maWd1cmUgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEVSTUVTX0NNRF9BQ0NFU1MJCSgweDAwMjEpCisjZGVmaW5lCQlIRVJNRVNfQ01EX0RPV05MRAkJKDB4MDAyMikKKworLyotLS0gU2VyaWFsIEkvTyBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfUkVBRE1JRgkJKDB4MDAzMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfV1JJVEVNSUYJCSgweDAwMzEpCisKKy8qLS0tIERlYnVnZ2luZyBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIAlIRVJNRVNfQ01EX1RFU1QJCQkoMHgwMDM4KQorCisKKy8qIFRlc3QgY29tbWFuZCBhcmd1bWVudHMgKi8KKyNkZWZpbmUJCUhFUk1FU19URVNUX1NFVF9DSEFOTkVMCQkweDA4MDAKKyNkZWZpbmUJCUhFUk1FU19URVNUX01PTklUT1IJCTB4MGIwMAorI2RlZmluZQkJSEVSTUVTX1RFU1RfU1RPUAkJMHgwZjAwCisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUJCUhFUk1FU19BVVRIX09QRU4JCTEKKyNkZWZpbmUJCUhFUk1FU19BVVRIX1NIQVJFRF9LRVkJCTIKKworLyogV0VQIHNldHRpbmdzICovCisjZGVmaW5lCQlIRVJNRVNfV0VQX1BSSVZBQ1lfSU5WT0tFRAkweDAwMDEKKyNkZWZpbmUJCUhFUk1FU19XRVBfRVhDTF9VTkVOQ1JZUFRFRAkweDAwMDIKKyNkZWZpbmUJCUhFUk1FU19XRVBfSE9TVF9FTkNSWVBUCQkweDAwMTAKKyNkZWZpbmUJCUhFUk1FU19XRVBfSE9TVF9ERUNSWVBUCQkweDAwODAKKworLyogU3ltYm9sIGhvc3RzY2FuIG9wdGlvbnMgKi8KKyNkZWZpbmUJCUhFUk1FU19IT1NUU0NBTl9TWU1CT0xfNVNFQwkweDAwMDEKKyNkZWZpbmUJCUhFUk1FU19IT1NUU0NBTl9TWU1CT0xfT05DRQkweDAwMDIKKyNkZWZpbmUJCUhFUk1FU19IT1NUU0NBTl9TWU1CT0xfUEFTU0lWRQkweDAwNDAKKyNkZWZpbmUJCUhFUk1FU19IT1NUU0NBTl9TWU1CT0xfQkNBU1QJMHgwMDgwCisKKy8qCisgKiBGcmFtZSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMKKyAqLworCisjZGVmaW5lIEhFUk1FU19ERVNDUklQVE9SX09GRlNFVAkwCisjZGVmaW5lIEhFUk1FU184MDJfMTFfT0ZGU0VUCQkoMTQpCisjZGVmaW5lIEhFUk1FU184MDJfM19PRkZTRVQJCSgxNCszMikKKyNkZWZpbmUgSEVSTUVTXzgwMl8yX09GRlNFVAkJKDE0KzMyKzE0KQorCisjZGVmaW5lIEhFUk1FU19SWFNUQVRfRVJSCQkoMHgwMDAzKQorI2RlZmluZQlIRVJNRVNfUlhTVEFUX0JBRENSQwkJKDB4MDAwMSkKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9VTkRFQ1JZUFRBQkxFCSgweDAwMDIpCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfTUFDUE9SVAkJKDB4MDcwMCkKKyNkZWZpbmUgSEVSTUVTX1JYU1RBVF9QQ0YJCSgweDEwMDApCS8qIEZyYW1lIHdhcyByZWNlaXZlZCBpbiBDRiBwZXJpb2QgKi8KKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9NU0dUWVBFCQkoMHhFMDAwKQorI2RlZmluZQlIRVJNRVNfUlhTVEFUXzEwNDIJCSgweDIwMDApCS8qIFJGQy0xMDQyIGZyYW1lICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfVFVOTkVMCQkoMHg0MDAwKQkvKiBicmlkZ2UtdHVubmVsIGVuY29kZWQgZnJhbWUgKi8KKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9XTVAJCSgweDYwMDApCS8qIFdhdmVsYW4tSUkgTWFuYWdlbWVudCBQcm90b2NvbCBmcmFtZSAqLworCitzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3IgeworCXUxNiBzdGF0dXM7CisJdTE2IHJlc2VydmVkMTsKKwl1MTYgcmVzZXJ2ZWQyOworCXUzMiBzd19zdXBwb3J0OworCXU4IHJldHJ5X2NvdW50OworCXU4IHR4X3JhdGU7CisJdTE2IHR4X2NvbnRyb2w7CQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSEVSTUVTX1RYU1RBVF9SRVRSWUVSUgkJKDB4MDAwMSkKKyNkZWZpbmUgSEVSTUVTX1RYU1RBVF9BR0VERVJSCQkoMHgwMDAyKQorI2RlZmluZSBIRVJNRVNfVFhTVEFUX0RJU0NPTgkJKDB4MDAwNCkKKyNkZWZpbmUgSEVSTUVTX1RYU1RBVF9GT1JNRVJSCQkoMHgwMDA4KQorCisjZGVmaW5lIEhFUk1FU19UWENUUkxfVFhfT0sJCSgweDAwMDIpCS8qID8/IGludGVycnVwdCBvbiBUeCBjb21wbGV0ZSAqLworI2RlZmluZSBIRVJNRVNfVFhDVFJMX1RYX0VYCQkoMHgwMDA0KQkvKiA/PyBpbnRlcnJ1cHQgb24gVHggZXhjZXB0aW9uICovCisjZGVmaW5lIEhFUk1FU19UWENUUkxfODAyXzExCQkoMHgwMDA4KQkvKiBXZSBzdXBwbHkgODAyLjExIGhlYWRlciAqLworI2RlZmluZSBIRVJNRVNfVFhDVFJMX0FMVF9SVFJZCQkoMHgwMDIwKQorCisvKiBJbnF1aXJ5IGNvbnN0YW50cyBhbmQgZGF0YSB0eXBlcyAqLworCisjZGVmaW5lIEhFUk1FU19JTlFfVEFMTElFUwkJKDB4RjEwMCkKKyNkZWZpbmUgSEVSTUVTX0lOUV9TQ0FOCQkJKDB4RjEwMSkKKyNkZWZpbmUgSEVSTUVTX0lOUV9DSEFOTkVMSU5GTwkJKDB4RjEwMikKKyNkZWZpbmUgSEVSTUVTX0lOUV9IT1NUU0NBTgkJKDB4RjEwMykKKyNkZWZpbmUgSEVSTUVTX0lOUV9IT1NUU0NBTl9TWU1CT0wJKDB4RjEwNCkKKyNkZWZpbmUgSEVSTUVTX0lOUV9MSU5LU1RBVFVTCQkoMHhGMjAwKQorI2RlZmluZSBIRVJNRVNfSU5RX1NFQ19TVEFUX0FHRVJFCSgweEYyMDIpCisKK3N0cnVjdCBoZXJtZXNfdGFsbGllc19mcmFtZSB7CisJdTE2IFR4VW5pY2FzdEZyYW1lczsKKwl1MTYgVHhNdWx0aWNhc3RGcmFtZXM7CisJdTE2IFR4RnJhZ21lbnRzOworCXUxNiBUeFVuaWNhc3RPY3RldHM7CisJdTE2IFR4TXVsdGljYXN0T2N0ZXRzOworCXUxNiBUeERlZmVycmVkVHJhbnNtaXNzaW9uczsKKwl1MTYgVHhTaW5nbGVSZXRyeUZyYW1lczsKKwl1MTYgVHhNdWx0aXBsZVJldHJ5RnJhbWVzOworCXUxNiBUeFJldHJ5TGltaXRFeGNlZWRlZDsKKwl1MTYgVHhEaXNjYXJkczsKKwl1MTYgUnhVbmljYXN0RnJhbWVzOworCXUxNiBSeE11bHRpY2FzdEZyYW1lczsKKwl1MTYgUnhGcmFnbWVudHM7CisJdTE2IFJ4VW5pY2FzdE9jdGV0czsKKwl1MTYgUnhNdWx0aWNhc3RPY3RldHM7CisJdTE2IFJ4RkNTRXJyb3JzOworCXUxNiBSeERpc2NhcmRzX05vQnVmZmVyOworCXUxNiBUeERpc2NhcmRzV3JvbmdTQTsKKwl1MTYgUnhXRVBVbmRlY3J5cHRhYmxlOworCXUxNiBSeE1zZ0luTXNnRnJhZ21lbnRzOworCXUxNiBSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOworCS8qIFRob3NlIGxhc3QgYXJlIHByb2JhYmx5IG5vdCBhdmFpbGFibGUgaW4gdmVyeSBvbGQgZmlybXdhcmVzICovCisJdTE2IFJ4RGlzY2FyZHNfV0VQSUNWRXJyb3I7CisJdTE2IFJ4RGlzY2FyZHNfV0VQRXhjbHVkZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogR3JhYmJlZCBmcm9tIHdsYW4tbmcgLSBUaGFua3MgTWFyay4uLiAtIEplYW4gSUkKKyAqIFRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHNjYW4gaW5xdWlyeSBjb21tYW5kICovCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBpbmZvIGFib3V0IGFuIEFjY2VzcyBQb2ludCAqLworc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbyB7CisJdTE2IGNoYW5uZWw7CQkvKiBDaGFubmVsIHdoZXJlIHRoZSBBUCBzaXRzICovCisJdTE2IG5vaXNlOwkJLyogTm9pc2UgbGV2ZWwgKi8KKwl1MTYgbGV2ZWw7CQkvKiBTaWduYWwgbGV2ZWwgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIE1BQyBhZGRyZXNzIG9mIHRoZSBBY2Nlc3MgUG9pbnQgKi8KKwl1MTYgYmVhY29uX2ludGVydjsJLyogQmVhY29uIGludGVydmFsICovCisJdTE2IGNhcGFiaWxpdGllczsJLyogQ2FwYWJpbGl0aWVzICovCisJdTE2IGVzc2lkX2xlbjsJCS8qIEVTU0lEIGxlbmd0aCAqLworCXU4IGVzc2lkWzMyXTsJCS8qIEVTU0lEIG9mIHRoZSBuZXR3b3JrICovCisJdTggcmF0ZXNbMTBdOwkJLyogQml0IHJhdGUgc3VwcG9ydGVkICovCisJdTE2IHByb2JlcmVzcF9yYXRlOwkvKiBEYXRhIHJhdGUgb2YgdGhlIHJlc3BvbnNlIGZyYW1lICovCisJdTE2IGF0aW07CQkvKiBBVElNIHdpbmRvdyB0aW1lLCBLdXMgKGhvc3RzY2FuIG9ubHkpICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogU2FtZSBzdHVmZiBmb3IgdGhlIEx1Y2VudC9BZ2VyZSBjYXJkLgorICogVGhhbmtzIHRvIGgxa2FyaSA8aDFrYXJpIEFUIGRhY2hiMGRlbi5jb20+IC0gSmVhbiBJSSAqLworc3RydWN0IGFnZXJlX3NjYW5fYXBpbmZvIHsKKwl1MTYgY2hhbm5lbDsJCS8qIENoYW5uZWwgd2hlcmUgdGhlIEFQIHNpdHMgKi8KKwl1MTYgbm9pc2U7CQkvKiBOb2lzZSBsZXZlbCAqLworCXUxNiBsZXZlbDsJCS8qIFNpZ25hbCBsZXZlbCAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogTUFDIGFkZHJlc3Mgb2YgdGhlIEFjY2VzcyBQb2ludCAqLworCXUxNiBiZWFjb25faW50ZXJ2OwkvKiBCZWFjb24gaW50ZXJ2YWwgKi8KKwl1MTYgY2FwYWJpbGl0aWVzOwkvKiBDYXBhYmlsaXRpZXMgKi8KKwkvKiBiaXRzOiAwLWVzcywgMS1pYnNzLCA0LXByaXZhY3kgW3dlcF0gKi8KKwl1MTYgZXNzaWRfbGVuOwkJLyogRVNTSUQgbGVuZ3RoICovCisJdTggZXNzaWRbMzJdOwkJLyogRVNTSUQgb2YgdGhlIG5ldHdvcmsgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBNb3VzdGFmYTogU2NhbiBzdHJ1Y3R1cmUgZm9yIFN5bWJvbCBjYXJkcyAqLworc3RydWN0IHN5bWJvbF9zY2FuX2FwaW5mbyB7CisJdTggY2hhbm5lbDsJCS8qIENoYW5uZWwgd2hlcmUgdGhlIEFQIHNpdHMgKi8KKwl1OCB1bmtub3duMTsJCS8qIDggaW4gMi45eCBhbmQgMy45eCBmL3csIDAgb3RoZXJ3aXNlICovCisJdTE2IG5vaXNlOwkJLyogTm9pc2UgbGV2ZWwgKi8KKwl1MTYgbGV2ZWw7CQkvKiBTaWduYWwgbGV2ZWwgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIE1BQyBhZGRyZXNzIG9mIHRoZSBBY2Nlc3MgUG9pbnQgKi8KKwl1MTYgYmVhY29uX2ludGVydjsJLyogQmVhY29uIGludGVydmFsICovCisJdTE2IGNhcGFiaWxpdGllczsJLyogQ2FwYWJpbGl0aWVzICovCisJLyogYml0czogMC1lc3MsIDEtaWJzcywgNC1wcml2YWN5IFt3ZXBdICovCisJdTE2IGVzc2lkX2xlbjsJCS8qIEVTU0lEIGxlbmd0aCAqLworCXU4IGVzc2lkWzMyXTsJCS8qIEVTU0lEIG9mIHRoZSBuZXR3b3JrICovCisgICAgCXUxNiByYXRlc1s1XTsJCS8qIEJpdCByYXRlIHN1cHBvcnRlZCAqLworCXUxNiBiYXNpY19yYXRlczsJLyogQmFzaWMgcmF0ZXMgYml0bWFzayAqLworCXU4IHVua25vd24yWzZdOwkJLyogQWx3YXlzIEZGOkZGOkZGOkZGOjAwOjAwICovCisJdTggdW5rbm93bjNbOF07CQkvKiBBbHdheXMgMCwgYXBwZWFyZWQgaW4gZi93IDMuOTEtNjggKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCit1bmlvbiBoZXJtZXNfc2Nhbl9pbmZvIHsKKwlzdHJ1Y3QgYWdlcmVfc2Nhbl9hcGluZm8JYTsKKwlzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvCXA7CisJc3RydWN0IHN5bWJvbF9zY2FuX2FwaW5mbwlzOworfTsKKworI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19OT1RfQ09OTkVDVEVEICAgKDB4MDAwMCkgIAorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfRElTQ09OTkVDVEVEICAgICgweDAwMDIpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0FQX0NIQU5HRSAgICAgICAoMHgwMDAzKQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BUF9PVVRfT0ZfUkFOR0UgKDB4MDAwNCkKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0UgICAgICgweDAwMDUpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0FTU09DX0ZBSUxFRCAgICAoMHgwMDA2KQorICAKK3N0cnVjdCBoZXJtZXNfbGlua3N0YXR1cyB7CisJdTE2IGxpbmtzdGF0dXM7ICAgICAgICAgLyogTGluayBzdGF0dXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlIHsKKwl1MTYgc3RhdHVzLCByZXNwMCwgcmVzcDEsIHJlc3AyOworfTsKKworLyogIklEIiBzdHJ1Y3R1cmUgLSB1c2VkIGZvciBFU1NJRCBhbmQgc3RhdGlvbiBuaWNrbmFtZSAqLworc3RydWN0IGhlcm1lc19pZHN0cmluZyB7CisJdTE2IGxlbjsKKwl1MTYgdmFsWzE2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGVybWVzX211bHRpY2FzdCB7CisJdTggYWRkcltIRVJNRVNfTUFYX01VTFRJQ0FTVF1bRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8vICNkZWZpbmUgSEVSTUVTX0RFQlVHX0JVRkZFUiAxCisjZGVmaW5lIEhFUk1FU19ERUJVR19CVUZTSVpFIDQwOTYKK3N0cnVjdCBoZXJtZXNfZGVidWdfZW50cnkgeworCWludCBiYXA7CisJdTE2IGlkLCBvZmZzZXQ7CisJaW50IGN5Y2xlczsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIFRpbWVvdXRzICovCisjZGVmaW5lIEhFUk1FU19CQVBfQlVTWV9USU1FT1VUICgxMDAwMCkgLyogSW4gaXRlcmF0aW9ucyBvZiB+MXVzICovCisKKy8qIEJhc2ljIGNvbnRyb2wgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBoZXJtZXMgeworCXZvaWQgX19pb21lbSAqaW9iYXNlOworCWludCByZWdfc3BhY2luZzsKKyNkZWZpbmUgSEVSTUVTXzE2QklUX1JFR1NQQUNJTkcJMAorI2RlZmluZSBIRVJNRVNfMzJCSVRfUkVHU1BBQ0lORwkxCisKKwl1MTYgaW50ZW47IC8qIFdoaWNoIGludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQ/ICovCisKKyNpZmRlZiBIRVJNRVNfREVCVUdfQlVGRkVSCisJc3RydWN0IGhlcm1lc19kZWJ1Z19lbnRyeSBkYnVmW0hFUk1FU19ERUJVR19CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIGRidWZwOworCXVuc2lnbmVkIGxvbmcgcHJvZmlsZVtIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCsxXTsKKyNlbmRpZgorfSBoZXJtZXNfdDsKKworLyogUmVnaXN0ZXIgYWNjZXNzIGNvbnZlbmllbmNlIG1hY3JvcyAqLworI2RlZmluZSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9mZikgXAorCShpb3JlYWQxNigoaHcpLT5pb2Jhc2UgKyAoIChvZmYpIDw8IChodyktPnJlZ19zcGFjaW5nICkpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnKGh3LCBvZmYsIHZhbCkgXAorCShpb3dyaXRlMTYoKHZhbCksIChodyktPmlvYmFzZSArICgob2ZmKSA8PCAoaHcpLT5yZWdfc3BhY2luZykpKQorI2RlZmluZSBoZXJtZXNfcmVhZF9yZWduKGh3LCBuYW1lKSBoZXJtZXNfcmVhZF9yZWcoKGh3KSwgSEVSTUVTXyMjbmFtZSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX3JlZ24oaHcsIG5hbWUsIHZhbCkgaGVybWVzX3dyaXRlX3JlZygoaHcpLCBIRVJNRVNfIyNuYW1lLCAodmFsKSkKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwordm9pZCBoZXJtZXNfc3RydWN0X2luaXQoaGVybWVzX3QgKmh3LCB2b2lkIF9faW9tZW0gKmFkZHJlc3MsIGludCByZWdfc3BhY2luZyk7CitpbnQgaGVybWVzX2luaXQoaGVybWVzX3QgKmh3KTsKK2ludCBoZXJtZXNfZG9jbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwKKwkJICAgICAgc3RydWN0IGhlcm1lc19yZXNwb25zZSAqcmVzcCk7CitpbnQgaGVybWVzX2FsbG9jYXRlKGhlcm1lc190ICpodywgdTE2IHNpemUsIHUxNiAqZmlkKTsKKworaW50IGhlcm1lc19iYXBfcHJlYWQoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwKKwkJICAgICAgIHUxNiBpZCwgdTE2IG9mZnNldCk7CitpbnQgaGVybWVzX2JhcF9wd3JpdGUoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwKKwkJCXUxNiBpZCwgdTE2IG9mZnNldCk7CitpbnQgaGVybWVzX3JlYWRfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgdW5zaWduZWQgYnVmbGVuLAorCQkgICAgdTE2ICpsZW5ndGgsIHZvaWQgKmJ1Zik7CitpbnQgaGVybWVzX3dyaXRlX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsCisJCSAgICAgIHUxNiBsZW5ndGgsIGNvbnN0IHZvaWQgKnZhbHVlKTsKKworLyogSW5saW5lIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcHJlc2VudChoZXJtZXNfdCAqaHcpCit7CisJcmV0dXJuIGhlcm1lc19yZWFkX3JlZ24oaHcsIFNXU1VQUE9SVDApID09IEhFUk1FU19NQUdJQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhlcm1lc19zZXRfaXJxbWFzayhoZXJtZXNfdCAqaHcsIHUxNiBldmVudHMpCit7CisJaHctPmludGVuID0gZXZlbnRzOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBJTlRFTiwgZXZlbnRzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX2VuYWJsZV9wb3J0KGhlcm1lc190ICpodywgaW50IHBvcnQpCit7CisJcmV0dXJuIGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0VOQUJMRSB8IChwb3J0IDw8IDgpLAorCQkJCSAwLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX2Rpc2FibGVfcG9ydChoZXJtZXNfdCAqaHcsIGludCBwb3J0KQoreworCXJldHVybiBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9ESVNBQkxFIHwgKHBvcnQgPDwgOCksIAorCQkJCSAwLCBOVUxMKTsKK30KKworLyogSW5pdGlhdGUgYW4gSU5RVUlSRSBjb21tYW5kICh0YWxsaWVzIG9yIHNjYW4pLiAgVGhlIHJlc3VsdCB3aWxsIGNvbWUgYXMgYW4KKyAqIGluZm9ybWF0aW9uIGZyYW1lIGluIF9fb3Jpbm9jb19ldl9pbmZvKCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19pbnF1aXJlKGhlcm1lc190ICpodywgdTE2IHJpZCkKK3sKKwlyZXR1cm4gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfSU5RVUlSRSwgcmlkLCBOVUxMKTsKK30KKworI2RlZmluZSBIRVJNRVNfQllURVNfVE9fUkVDTEVOKG4pICggKCgobikrMSkvMikgKyAxICkKKyNkZWZpbmUgSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhuKSAoICgobiktMSkgKiAyICkKKworLyogTm90ZSB0aGF0IGZvciB0aGUgbmV4dCB0d28sIHRoZSBjb3VudCBpcyBpbiAxNi1iaXQgd29yZHMsIG5vdCBieXRlcyAqLworc3RhdGljIGlubGluZSB2b2lkIGhlcm1lc19yZWFkX3dvcmRzKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgb2ZmLCB2b2lkICpidWYsIHVuc2lnbmVkIGNvdW50KQoreworCW9mZiA9IG9mZiA8PCBody0+cmVnX3NwYWNpbmc7CisJaW9yZWFkMTZfcmVwKGh3LT5pb2Jhc2UgKyBvZmYsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGVybWVzX3dyaXRlX3dvcmRzKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgb2ZmLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGNvdW50KQoreworCW9mZiA9IG9mZiA8PCBody0+cmVnX3NwYWNpbmc7CisJaW93cml0ZTE2X3JlcChody0+aW9iYXNlICsgb2ZmLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhlcm1lc19jbGVhcl93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwgdW5zaWduZWQgY291bnQpCit7CisJdW5zaWduZWQgaTsKKworCW9mZiA9IG9mZiA8PCBody0+cmVnX3NwYWNpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaW93cml0ZTE2KDAsIGh3LT5pb2Jhc2UgKyBvZmYpOworfQorCisjZGVmaW5lIEhFUk1FU19SRUFEX1JFQ09SRChodywgYmFwLCByaWQsIGJ1ZikgXAorCShoZXJtZXNfcmVhZF9sdHYoKGh3KSwoYmFwKSwocmlkKSwgc2l6ZW9mKCpidWYpLCBOVUxMLCAoYnVmKSkpCisjZGVmaW5lIEhFUk1FU19XUklURV9SRUNPUkQoaHcsIGJhcCwgcmlkLCBidWYpIFwKKwkoaGVybWVzX3dyaXRlX2x0digoaHcpLChiYXApLChyaWQpLEhFUk1FU19CWVRFU19UT19SRUNMRU4oc2l6ZW9mKCpidWYpKSwoYnVmKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19yZWFkX3dvcmRyZWMoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1MTYgKndvcmQpCit7CisJdTE2IHJlYzsKKwlpbnQgZXJyOworCisJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBiYXAsIHJpZCwgJnJlYyk7CisJKndvcmQgPSBsZTE2X3RvX2NwdShyZWMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc193cml0ZV93b3JkcmVjKGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgdTE2IHdvcmQpCit7CisJdTE2IHJlYyA9IGNwdV90b19sZTE2KHdvcmQpOworCXJldHVybiBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBiYXAsIHJpZCwgJnJlYyk7Cit9CisKKyNlbHNlIC8qICEgX19LRVJORUxfXyAqLworCisvKiBUaGVzZSBhcmUgcHJvdmlkZWQgZm9yIHRoZSBiZW5lZml0IG9mIHVzZXJzcGFjZSBkcml2ZXJzIGFuZCB0ZXN0aW5nIHByb2dyYW1zCisgICB3aGljaCB1c2UgaW9wZXJtKCkgb3IgaW9wbCgpICovCisKKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnKGJhc2UsIG9mZikgKGludygoYmFzZSkgKyAob2ZmKSkpCisjZGVmaW5lIGhlcm1lc193cml0ZV9yZWcoYmFzZSwgb2ZmLCB2YWwpIChvdXR3KCh2YWwpLCAoYmFzZSkgKyAob2ZmKSkpCisKKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnbihiYXNlLCBuYW1lKSAoaGVybWVzX3JlYWRfcmVnKChiYXNlKSwgSEVSTUVTXyMjbmFtZSkpCisjZGVmaW5lIGhlcm1lc193cml0ZV9yZWduKGJhc2UsIG5hbWUsIHZhbCkgKGhlcm1lc193cml0ZV9yZWcoKGJhc2UpLCBIRVJNRVNfIyNuYW1lLCAodmFsKSkpCisKKy8qIE5vdGUgdGhhdCBmb3IgdGhlIG5leHQgdHdvLCB0aGUgY291bnQgaXMgaW4gMTYtYml0IHdvcmRzLCBub3QgYnl0ZXMgKi8KKyNkZWZpbmUgaGVybWVzX3JlYWRfZGF0YShiYXNlLCBvZmYsIGJ1ZiwgY291bnQpIChpbnN3KChiYXNlKSArIChvZmYpLCAoYnVmKSwgKGNvdW50KSkpCisjZGVmaW5lIGhlcm1lc193cml0ZV9kYXRhKGJhc2UsIG9mZiwgYnVmLCBjb3VudCkgKG91dHN3KChiYXNlKSArIChvZmYpLCAoYnVmKSwgKGNvdW50KSkpCisKKyNlbmRpZiAvKiAhIF9fS0VSTkVMX18gKi8KKworI2VuZGlmICAvKiBfSEVSTUVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19yaWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19yaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ2YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzX3JpZC5oCkBAIC0wLDAgKzEsMTQ4IEBACisjaWZuZGVmIF9IRVJNRVNfUklEX0gKKyNkZWZpbmUgX0hFUk1FU19SSURfSAorCisvKgorICogQ29uZmlndXJhdGlvbiBSSURzCisgKi8KKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQT1JUVFlQRQkJCTB4RkMwMAorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTk1BQ0FERFIJCTB4RkMwMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFU0lSRURTU0lECQkweEZDMDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05DSEFOTkVMCQkweEZDMDMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05TU0lECQkJMHhGQzA0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOQVRJTVdJTkRPVwkJMHhGQzA1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GU1lTVEVNU0NBTEUJCTB4RkMwNgorI2RlZmluZSBIRVJNRVNfUklEX0NORk1BWERBVEFMRU4JCTB4RkMwNworI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1MJCTB4RkMwOAorI2RlZmluZSBIRVJNRVNfUklEX0NORlBNRU5BQkxFRAkJCTB4RkMwOQorI2RlZmluZSBIRVJNRVNfUklEX0NORlBNRVBTCQkJMHhGQzBBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUkVDRUlWRQkJMHhGQzBCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFYU0xFRVBEVVJBVElPTgkJMHhGQzBDCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OCTB4RkMwRAorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTk5BTUUJCQkweEZDMEUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05EVElNUEVSSU9ECQkweEZDMTAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTMQkJMHhGQzExCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzIJCTB4RkMxMgorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1MzCQkweEZDMTMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTNAkJMHhGQzE0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzUJCTB4RkMxNQorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1M2CQkweEZDMTYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNVUxUSUNBU1RQTUJVRkZFUklORwkweEZDMTcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRVBFTkFCTEVEX0FHRVJFCQkweEZDMjAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTl9BR0VSRQkweEZDMjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNQU5EQVRPUllCU1NJRF9TWU1CT0wJMHhGQzIxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQREVGQVVMVEtFWUlECQkweEZDMjMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMAkJMHhGQzI0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTEJCTB4RkMyNQorI2RlZmluZSBIRVJNRVNfUklEX0NORk1XT1JPQlVTVF9BR0VSRQkJMHhGQzI1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTIJCTB4RkMyNgorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkzCQkweEZDMjcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRVBGTEFHU19JTlRFUlNJTAkJMHhGQzI4CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQS0VZTUFQUElOR1RBQkxFCTB4RkMyOQorI2RlZmluZSBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OCQkweEZDMkEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNQVhBU1NPQ1NUQQkJMHhGQzJCCisjZGVmaW5lCUhFUk1FU19SSURfQ05GS0VZTEVOR1RIX1NZTUJPTAkJMHhGQzJCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GVFhDT05UUk9MCQkJMHhGQzJDCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUk9BTUlOR01PREUJCTB4RkMyRAorI2RlZmluZSBIRVJNRVNfUklEX0NORkhPU1RBVVRIRU5USUNBVElPTgkweEZDMkUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSQ1ZDUkNFUlJPUgkJMHhGQzMwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTU1MSUZFCQkJMHhGQzMxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQUxUUkVUUllDT1VOVAkJMHhGQzMyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQkVBQ09OSU5UCQkJMHhGQzMzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVBQQ0ZJTkZPCQkJMHhGQzM0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GU1RBUENGSU5GTwkJMHhGQzM1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUFJJT1JJVFlRVVNBR0UJCTB4RkMzNworI2RlZmluZSBIRVJNRVNfUklEX0NORlRJTUNUUkwJCQkweEZDNDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUSElSVFkyVEFMTFkJCTB4RkM0MgorI2RlZmluZSBIRVJNRVNfUklEX0NORkVOSFNFQ1VSSVRZCQkweEZDNDMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZHUk9VUEFERFJFU1NFUwkJMHhGQzgwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQ1JFQVRFSUJTUwkJMHhGQzgxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRAkweEZDODIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQJCTB4RkM4MworI2RlZmluZSBIRVJNRVNfUklEX0NORlRYUkFURUNPTlRST0wJCTB4RkM4NAorI2RlZmluZSBIRVJNRVNfUklEX0NORlBST01JU0NVT1VTTU9ERQkJMHhGQzg1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GQkFTSUNSQVRFU19TWU1CT0wJCTB4RkM4QQorI2RlZmluZSBIRVJNRVNfUklEX0NORlBSRUFNQkxFX1NZTUJPTAkJMHhGQzhDCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDAJMHhGQzkwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDEJMHhGQzkxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDIJMHhGQzkyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDMJMHhGQzkzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDQJMHhGQzk0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDUJMHhGQzk1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRDYJMHhGQzk2CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xEMAkJMHhGQzk3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xEMQkJMHhGQzk4CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xEMgkJMHhGQzk5CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xEMwkJMHhGQzlBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xENAkJMHhGQzlCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xENQkJMHhGQzlDCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xENgkJMHhGQzlECisjZGVmaW5lIEhFUk1FU19SSURfQ05GSE9TVFNDQU5fU1lNQk9MCQkweEZDQUIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTSE9SVFBSRUFNQkxFCQkweEZDQjAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRVBLRVlTX0FHRVJFCQkweEZDQjAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZFWENMVURFTE9OR1BSRUFNQkxFCTB4RkNCMQorI2RlZmluZSBIRVJNRVNfUklEX0NORlRYS0VZX0FHRVJFCQkweEZDQjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTlJTUFRPCTB4RkNCMgorI2RlZmluZSBIRVJNRVNfUklEX0NORlNDQU5TU0lEX0FHRVJFCQkweEZDQjIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZCQVNJQ1JBVEVTCQkweEZDQjMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTVVBQT1JURURSQVRFUwkJMHhGQ0I0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GVElDS1RJTUUJCQkweEZDRTAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTQ0FOUkVRVUVTVAkJMHhGQ0UxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GSk9JTlJFUVVFU1QJCTB4RkNFMgorI2RlZmluZSBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FURVNUQVRJT04JMHhGQ0UzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQ0hBTk5FTElORk9SRVFVRVNUCTB4RkNFNAorI2RlZmluZSBIRVJNRVNfUklEX0NORkhPU1RTQ0FOCQkJMHhGQ0U1CisKKy8qCisgKiBJbmZvcm1hdGlvbiBSSURzCisgKi8KKyNkZWZpbmUgSEVSTUVTX1JJRF9NQVhMT0FEVElNRQkJCTB4RkQwMAorI2RlZmluZSBIRVJNRVNfUklEX0RPV05MT0FEQlVGRkVSCQkweEZEMDEKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUklJRAkJCTB4RkQwMgorI2RlZmluZSBIRVJNRVNfUklEX1BSSVNVUFJBTkdFCQkJMHhGRDAzCisjZGVmaW5lIEhFUk1FU19SSURfQ0ZJQUNUUkFOR0VTCQkJMHhGRDA0CisjZGVmaW5lIEhFUk1FU19SSURfTklDU0VSTlVNCQkJMHhGRDBBCisjZGVmaW5lIEhFUk1FU19SSURfTklDSUQJCQkweEZEMEIKKyNkZWZpbmUgSEVSTUVTX1JJRF9NRklTVVBSQU5HRQkJCTB4RkQwQworI2RlZmluZSBIRVJNRVNfUklEX0NGSVNVUFJBTkdFCQkJMHhGRDBECisjZGVmaW5lIEhFUk1FU19SSURfQ0hBTk5FTExJU1QJCQkweEZEMTAKKyNkZWZpbmUgSEVSTUVTX1JJRF9SRUdVTEFUT1JZRE9NQUlOUwkJMHhGRDExCisjZGVmaW5lIEhFUk1FU19SSURfVEVNUFRZUEUJCQkweEZEMTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DSVMJCQkJMHhGRDEzCisjZGVmaW5lIEhFUk1FU19SSURfU1RBSUQJCQkweEZEMjAKKyNkZWZpbmUgSEVSTUVTX1JJRF9TVEFTVVBSQU5HRQkJCTB4RkQyMQorI2RlZmluZSBIRVJNRVNfUklEX01GSUFDVFJBTkdFUwkJCTB4RkQyMgorI2RlZmluZSBIRVJNRVNfUklEX0NGSUFDVFJBTkdFUzIJCTB4RkQyMworI2RlZmluZSBIRVJNRVNfUklEX1NFQ09OREFSWVZFUlNJT05fU1lNQk9MCTB4RkQyNAorI2RlZmluZSBIRVJNRVNfUklEX1BPUlRTVEFUVVMJCQkweEZENDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UU1NJRAkJCTB4RkQ0MQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRCU1NJRAkJCTB4RkQ0MgorI2RlZmluZSBIRVJNRVNfUklEX0NPTU1TUVVBTElUWQkJCTB4RkQ0MworI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUJCTB4RkQ0NAorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRCRUFDT05JTlRFUlZBTAkweEZENDUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UU0NBTEVUSFJFU0hPTERTCTB4RkQ0NgorI2RlZmluZSBIRVJNRVNfUklEX1BST1RPQ09MUlNQVElNRQkJMHhGRDQ3CisjZGVmaW5lIEhFUk1FU19SSURfU0hPUlRSRVRSWUxJTUlUCQkweEZENDgKKyNkZWZpbmUgSEVSTUVTX1JJRF9MT05HUkVUUllMSU1JVAkJMHhGRDQ5CisjZGVmaW5lIEhFUk1FU19SSURfTUFYVFJBTlNNSVRMSUZFVElNRQkJMHhGRDRBCisjZGVmaW5lIEhFUk1FU19SSURfTUFYUkVDRUlWRUxJRkVUSU1FCQkweEZENEIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRlBPTExBQkxFCQkJMHhGRDRDCisjZGVmaW5lIEhFUk1FU19SSURfQVVUSEVOVElDQVRJT05BTEdPUklUSE1TCTB4RkQ0RAorI2RlZmluZSBIRVJNRVNfUklEX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRAkweEZENEYKKyNkZWZpbmUgSEVSTUVTX1JJRF9EQk1DT01NU1FVQUxJVFlfSU5URVJTSUwJMHhGRDUxCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTEJCTB4RkQ4MAorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUyCQkweEZEODEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFMwkJMHhGRDgyCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTQJCTB4RkQ4MworI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEU1CQkweEZEODQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFNgkJMHhGRDg1CisjZGVmaW5lIEhFUk1FU19SSURfT1dOTUFDQUREUgkJCTB4RkQ4NgorI2RlZmluZSBIRVJNRVNfUklEX1NDQU5SRVNVTFRTVEFCTEUJCTB4RkQ4OAorI2RlZmluZSBIRVJNRVNfUklEX1BIWVRZUEUJCQkweEZEQzAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UQ0hBTk5FTAkJMHhGREMxCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFBPV0VSU1RBVEUJCTB4RkRDMgorI2RlZmluZSBIRVJNRVNfUklEX0NDQU1PREUJCQkweEZEQzMKKyNkZWZpbmUgSEVSTUVTX1JJRF9TVVBQT1JURUREQVRBUkFURVMJCTB4RkRDNgorI2RlZmluZSBIRVJNRVNfUklEX0JVSUxEU0VRCQkJMHhGRkZFCisjZGVmaW5lIEhFUk1FU19SSURfRldJRAkJCQkweEZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1ODYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1ODYuaApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIEludGVsIDgyNTg2IElFRUUgODAyLjMgRXRoZXJuZXQgTEFOIENvcHJvY2Vzc29yLgorICoKKyAqIFNlZToKKyAqCUludGVsIE1pY3JvY29tbXVuaWNhdGlvbnMgMTk5MQorICoJcDEtMSB0byBwMS0zNworICoJSW50ZWwgb3JkZXIgTm8uIDIzMTY1OAorICoJSVNCTiAxLTU1NTEyLTExOS01CisgKgorICogICAgIFVuZm9ydHVuYXRlbHksIHRoZSBhYm92ZSBjaGFwdGVyIG1lbnRpb25zIG5laXRoZXIKKyAqIHRoZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApIG5vciB0aGUKKyAqIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKSwKKyAqIHNvIHdlIHByb2JhYmx5IG5lZWQgdG8gbG9vayBlbHNld2hlcmUgZm9yIHRoZQorICogd2hvbGUgc3RvcnkgLS0gc29tZSByZWNvbW1lbmQgdGhlICJJbnRlbCBMQU4KKyAqIENvbXBvbmVudHMgbWFudWFsIiBidXQgSSBoYXZlIG5laXRoZXIgYSBjb3B5CisgKiBub3IgYSBmdWxsIHJlZmVyZW5jZS4gIEJ1dCAiZWxzZXdoZXJlIiBtYXkgYmUKKyAqIGluIHRoZSBzYW1lIHB1YmxpY2F0aW9uLi4uCisgKiAgICAgVGhlIGRlc2NyaXB0aW9uIG9mIGEgbGF0ZXIgZGV2aWNlLCB0aGUKKyAqICI4MjU5NkNBIEhpZ2gtUGVyZm9ybWFuY2UgMzItQml0IExvY2FsIEFyZWEgTmV0d29yaworICogQ29wcm9jZXNzb3IiLCAoaWJpZC4gcDEtMzggdG8gcDEtMTA5KSBkb2VzIG1lbnRpb24KKyAqIHRoZSBTQ1AgYW5kIElTQ1AgYW5kIGFsc28gaGFzIGFuIGk4MjU4NiBjb21wYXRpYmlsaXR5CisgKiBtb2RlLiAgRXZlbiBtb3JlIHVzZWZ1bCBpcyAiQVAtMjM1IEFuIDgyNTg2IERhdGEgTGluaworICogRHJpdmVyIiAoaWJpZC4gcDEtMzM3IHRvIHAxLTQxNykuCisgKi8KKworI2RlZmluZQlJODI1ODZfTUVNWgkoNjQgKiAxMDI0KQorCisjZGVmaW5lCUk4MjU4Nl9TQ1BfQUREUgkoSTgyNTg2X01FTVogLSBzaXplb2Yoc2NwX3QpKQorCisjZGVmaW5lCUFERFJfTEVOCTYKKyNkZWZpbmUJSTgyNTg2TlVMTAkweEZGRkYKKworI2RlZmluZQl0b2ZmKHQscCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKCh0ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworLyoKKyAqIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKFNDUCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNjcF90CXNjcF90Oworc3RydWN0IHNjcF90Cit7CisJdW5zaWduZWQgc2hvcnQJc2NwX3N5c2J1czsJLyogODI1ODYgYnVzIHdpZHRoOgkqLworI2RlZmluZQkJU0NQX1NZXzE2QkJVUwkoMHgwIDw8IDApCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUJCVNDUF9TWV84QkJVUwkoMHgxIDw8IDApCS8qICA4IGJpdHMuICovCisJdW5zaWduZWQgc2hvcnQJc2NwX2p1bmtbMl07CS8qIFVudXNlZCAqLworCXVuc2lnbmVkIHNob3J0CXNjcF9pc2NwbDsJLyogbG93ZXIgMTYgYml0cyBvZiBJU0NQX0FERFIgKi8KKwl1bnNpZ25lZCBzaG9ydAlzY3BfaXNjcGg7CS8qIHVwcGVyIDE2IGJpdHMgb2YgSVNDUF9BRERSICovCit9OworCisvKgorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApLgorICovCit0eXBlZGVmIHN0cnVjdCBpc2NwX3QJaXNjcF90Oworc3RydWN0IGlzY3BfdAoreworCXVuc2lnbmVkIHNob3J0CWlzY3BfYnVzeTsJLyogc2V0IGJ5IENQVSBiZWZvcmUgZmlyc3QgQ0EsCSovCisJCQkJCS8qIGNsZWFyZWQgYnkgODI1ODYgYWZ0ZXIgcmVhZC4JKi8KKwl1bnNpZ25lZCBzaG9ydAlpc2NwX29mZnNldDsJLyogb2Zmc2V0IG9mIFNDQgkJKi8KKwl1bnNpZ25lZCBzaG9ydAlpc2NwX2Jhc2VsOwkvKiBiYXNlIG9mIFNDQgkJCSovCisJdW5zaWduZWQgc2hvcnQJaXNjcF9iYXNlaDsJLyogICIJCQkJKi8KK307CisKKy8qCisgKiBTeXN0ZW0gQ29udHJvbCBCbG9jayAoU0NCKS4KKyAqCVRoZSA4MjU4NiB3cml0ZXMgaXRzIHN0YXR1cyB0byBzY2Jfc3RhdHVzIGFuZCB0aGVuCisgKglyYWlzZXMgYW4gaW50ZXJydXB0IHRvIGFsZXJ0IHRoZSBDUFUuCisgKglUaGUgQ1BVIHdyaXRlcyBhIGNvbW1hbmQgdG8gc2NiX2NvbW1hbmQgYW5kCisgKgl0aGVuIGlzc3VlcyBhIENoYW5uZWwgQXR0ZW50aW9uIChDQSkgdG8gYWxlcnQgdGhlIDgyNTg2LgorICovCit0eXBlZGVmIHN0cnVjdCBzY2JfdAlzY2JfdDsKK3N0cnVjdCBzY2JfdAoreworCXVuc2lnbmVkIHNob3J0CXNjYl9zdGF0dXM7CS8qIFN0YXR1cyBvZiA4MjU4NgkJKi8KKyNkZWZpbmUJCVNDQl9TVF9JTlQJKDB4RiA8PCAxMikJLyogU29tZSBvZjoJCSovCisjZGVmaW5lCQlTQ0JfU1RfQ1gJKDB4MSA8PCAxNSkJLyogQ21kIGNvbXBsZXRlZAkqLworI2RlZmluZQkJU0NCX1NUX0ZSCSgweDEgPDwgMTQpCS8qIEZyYW1lIHJlY2VpdmVkCSovCisjZGVmaW5lCQlTQ0JfU1RfQ05BCSgweDEgPDwgMTMpCS8qIENtZCB1bml0IG5vdCBhY3RpdmUJKi8KKyNkZWZpbmUJCVNDQl9TVF9STlIJKDB4MSA8PCAxMikJLyogUmN2IHVuaXQgbm90IHJlYWR5CSovCisjZGVmaW5lCQlTQ0JfU1RfSlVOSzAJKDB4MSA8PCAxMSkJLyogMAkJCSovCisjZGVmaW5lCQlTQ0JfU1RfQ1VTCSgweDcgPDwgIDgpCS8qIENtZCB1bml0IHN0YXR1cwkqLworI2RlZmluZQkJCVNDQl9TVF9DVVNfSURMRQkoMCA8PCA4KQkvKiBJZGxlCQkqLworI2RlZmluZQkJCVNDQl9TVF9DVVNfU1VTUAkoMSA8PCA4KQkvKiBTdXNwZW5kZWQJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfQ1VTX0FDVFYJKDIgPDwgOCkJLyogQWN0aXZlCSovCisjZGVmaW5lCQlTQ0JfU1RfSlVOSzEJKDB4MSA8PCAgNykJLyogMAkJCSovCisjZGVmaW5lCQlTQ0JfU1RfUlVTCSgweDcgPDwgIDQpCS8qIFJjdiB1bml0IHN0YXR1cwkqLworI2RlZmluZQkJCVNDQl9TVF9SVVNfSURMRQkoMCA8PCA0KQkvKiBJZGxlCQkqLworI2RlZmluZQkJCVNDQl9TVF9SVVNfU1VTUAkoMSA8PCA0KQkvKiBTdXNwZW5kZWQJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX05SRVMJKDIgPDwgNCkJLyogTm8gcmVzb3VyY2VzCSovCisjZGVmaW5lCQkJU0NCX1NUX1JVU19SRFkJKDQgPDwgNCkJLyogUmVhZHkJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfY29tbWFuZDsJLyogTmV4dCBjb21tYW5kCQkJKi8KKyNkZWZpbmUJCVNDQl9DTURfQUNLX0NYCSgweDEgPDwgMTUpCS8qIEFjayBjbWQgY29tcGxldGlvbgkqLworI2RlZmluZQkJU0NCX0NNRF9BQ0tfRlIJKDB4MSA8PCAxNCkJLyogQWNrIGZyYW1lIHJlY2VpdmVkCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19DTkEJKDB4MSA8PCAxMykJLyogQWNrIENVIG5vdCBhY3RpdmUJKi8KKyNkZWZpbmUJCVNDQl9DTURfQUNLX1JOUgkoMHgxIDw8IDEyKQkvKiBBY2sgUlUgbm90IHJlYWR5CSovCisjZGVmaW5lCQlTQ0JfQ01EX0pVTktYCSgweDEgPDwgMTEpCS8qIFVudXNlZAkJKi8KKyNkZWZpbmUJCVNDQl9DTURfQ1VDCSgweDcgPDwgIDgpCS8qIENvbW1hbmQgVW5pdCBjb21tYW5kCSovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfTk9QCSgwIDw8IDgpCS8qIE5vcAkJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX0NVQ19HTwkoMSA8PCA4KQkvKiBTdGFydCBjYmxfb2Zmc2V0ICovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfUkVTCSgyIDw8IDgpCS8qIFJlc3VtZSBleGVjdXRpb24gKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX0NVQ19TVVMJKDMgPDwgOCkJLyogU3VzcGVuZCAgICIJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX0NVQ19BQlQJKDQgPDwgOCkJLyogQWJvcnQgICAgICIJKi8KKyNkZWZpbmUJCVNDQl9DTURfUkVTRVQJKDB4MSA8PCAgNykJLyogUmVzZXQgY2hpcCAoaGFyZHdhcmUpICovCisjZGVmaW5lCQlTQ0JfQ01EX1JVQwkoMHg3IDw8ICA0KQkvKiBSZWNlaXZlIFVuaXQgY29tbWFuZAkqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX05PUAkoMCA8PCA0KQkvKiBOb3AJCSovCisjZGVmaW5lCQkJU0NCX0NNRF9SVUNfR08JKDEgPDwgNCkJLyogU3RhcnQgcmZhX29mZnNldCAqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX1JFUwkoMiA8PCA0KQkvKiBSZXN1bWUgcmVjZXB0aW9uICovCisjZGVmaW5lCQkJU0NCX0NNRF9SVUNfU1VTCSgzIDw8IDQpCS8qIFN1c3BlbmQgICAiCSovCisjZGVmaW5lCQkJU0NCX0NNRF9SVUNfQUJUCSg0IDw8IDQpCS8qIEFib3J0ICAgICAiCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2NibF9vZmZzZXQ7CS8qIE9mZnNldCBvZiBmaXJzdCBjb21tYW5kIHVuaXQJKi8KKwkJCQkJLyogQWN0aW9uIENvbW1hbmQJCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX3JmYV9vZmZzZXQ7CS8qIE9mZnNldCBvZiBmaXJzdCBSZWNlaXZlCSovCisJCQkJCS8qIEZyYW1lIERlc2NyaXB0b3IgaW4gdGhlCSovCisJCQkJCS8qIFJlY2VpdmUgRnJhbWUgQXJlYQkJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfY3JjZXJyczsJLyogUHJvcGVybHkgYWxpZ25lZCBmcmFtZXMJKi8KKwkJCQkJLyogcmVjZWl2ZWQgd2l0aCBhIENSQyBlcnJvcgkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9hbG5lcnJzOwkvKiBNaXNhbGlnbmVkIGZyYW1lcyByZWNlaXZlZAkqLworCQkJCQkvKiB3aXRoIGEgQ1JDIGVycm9yCQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9yc2NlcnJzOwkvKiBGcmFtZXMgbG9zdCBkdWUgdG8gbm8gc3BhY2UJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2Jfb3ZybmVycnM7CS8qIEZyYW1lcyBsb3N0IGR1ZSB0byBzbG93IGJ1cwkqLworfTsKKworI2RlZmluZQlzY2JvZmYocCxmKSAJdG9mZihzY2JfdCwgcCwgZikKKworLyoKKyAqIFRoZSBlaWdodCBBY3Rpb24gQ29tbWFuZHMuCisgKi8KK3R5cGVkZWYgZW51bSBhY21kX2UJYWNtZF9lOworZW51bSBhY21kX2UKK3sKKwlhY21kX25vcAk9IDAsCS8qIERvIG5vdGhpbmcJCQkJKi8KKwlhY21kX2lhX3NldHVwCT0gMSwJLyogTG9hZCBhbiAoZXRoZXJuZXQpIGFkZHJlc3MgaW50byB0aGUJKi8KKwkJCQkvKiA4MjU4NgkJCQkqLworCWFjbWRfY29uZmlndXJlCT0gMiwJLyogVXBkYXRlIHRoZSA4MjU4NiBvcGVyYXRpbmcgcGFyYW1ldGVycyAqLworCWFjbWRfbWNfc2V0dXAJPSAzLAkvKiBMb2FkIGEgbGlzdCBvZiAoZXRoZXJuZXQpIG11bHRpY2FzdAkqLworCQkJCS8qIGFkZHJlc3NlcyBpbnRvIHRoZSA4MjU4NgkJKi8KKwlhY21kX3RyYW5zbWl0CT0gNCwJLyogVHJhbnNtaXQgYSBmcmFtZQkJCSovCisJYWNtZF90ZHIJPSA1LAkvKiBQZXJmb3JtIGEgVGltZSBEb21haW4gUmVmbGVjdG9tZXRlcgkqLworCQkJCS8qIHRlc3Qgb24gdGhlIHNlcmlhbCBsaW5rCQkqLworCWFjbWRfZHVtcAk9IDYsCS8qIENvcHkgODI1ODYgcmVnaXN0ZXJzIHRvIG1lbW9yeQkqLworCWFjbWRfZGlhZ25vc2UJPSA3LAkvKiBSdW4gYW4gaW50ZXJuYWwgc2VsZiB0ZXN0CQkqLworfTsKKworLyoKKyAqIEdlbmVyaWMgQWN0aW9uIENvbW1hbmQgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBhY2hfdAlhY2hfdDsKK3N0cnVjdCBhY2hfdAoreworCXVuc2lnbmVkIHNob3J0CWFjX3N0YXR1czsJCS8qIENvbW1hbmQgc3RhdHVzOgkqLworI2RlZmluZQkJQUNfU0ZMRF9DCSgweDEgPDwgMTUpCS8qIENvbW1hbmQgY29tcGxldGVkCSovCisjZGVmaW5lCQlBQ19TRkxEX0IJKDB4MSA8PCAxNCkJLyogQnVzeSBleGVjdXRpbmcJKi8KKyNkZWZpbmUJCUFDX1NGTERfT0sJKDB4MSA8PCAxMykJLyogQ29tcGxldGVkIGVycm9yIGZyZWUJKi8KKyNkZWZpbmUJCUFDX1NGTERfQQkoMHgxIDw8IDEyKQkvKiBDb21tYW5kIGFib3J0ZWQJKi8KKyNkZWZpbmUJCUFDX1NGTERfRkFJTAkoMHgxIDw8IDExKQkvKiBTZWxmdGVzdCBmYWlsZWQJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzEwCSgweDEgPDwgMTApCS8qIE5vIGNhcnJpZXIgc2Vuc2UJKi8KKwkJCQkJCS8qIGR1cmluZyB0cmFuc21pc3Npb24JKi8KKyNkZWZpbmUJCUFDX1NGTERfUzkJKDB4MSA8PCAgOSkJLyogVHggdW5zdWNjZXNzZnVsOgkqLworCQkJCQkJLyogKHN0b3BwZWQpIGxvc3QgQ1RTCSovCisjZGVmaW5lCQlBQ19TRkxEX1M4CSgweDEgPDwgIDgpCS8qIFR4IHVuc3VjY2Vzc2Z1bDoJKi8KKwkJCQkJCS8qIChzdG9wcGVkKSBzbG93IERNQQkqLworI2RlZmluZQkJQUNfU0ZMRF9TNwkoMHgxIDw8ICA3KQkvKiBUeCBkZWZlcnJlZDoJCSovCisJCQkJCQkvKiBvdGhlciBsaW5rIHRyYWZmaWMJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzYJKDB4MSA8PCAgNikJLyogSGVhcnQgQmVhdDogY29sbGlzaW9uICovCisJCQkJCQkvKiBkZXRlY3QgYWZ0ZXIgbGFzdCB0eAkqLworI2RlZmluZQkJQUNfU0ZMRF9TNQkoMHgxIDw8ICA1KQkvKiBUeCBzdG9wcGVkOgkJKi8KKwkJCQkJCS8qIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zCSovCisjZGVmaW5lCQlBQ19TRkxEX01BWENPTAkoMHhGIDw8ICAwKQkvKiBDb2xsaXNpb24gY291bnQgIAkqLworCXVuc2lnbmVkIHNob3J0CWFjX2NvbW1hbmQ7CQkvKiBDb21tYW5kIHNwZWNpZmllcjoJKi8KKyNkZWZpbmUJCUFDX0NGTERfRUwJKDB4MSA8PCAxNSkJLyogRW5kIG9mIGNvbW1hbmQgbGlzdAkqLworI2RlZmluZQkJQUNfQ0ZMRF9TCSgweDEgPDwgMTQpCS8qIFN1c3BlbmQgb24gY29tcGxldGlvbiAqLworI2RlZmluZQkJQUNfQ0ZMRF9JCSgweDEgPDwgMTMpCS8qIEludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lCQlBQ19DRkxEX0NNRAkoMHg3IDw8ICAwKQkvKiBhY21kX2UJCSovCisJdW5zaWduZWQgc2hvcnQJYWNfbGluazsJCS8qIE5leHQgQWN0aW9uIENvbW1hbmQJKi8KK307CisKKyNkZWZpbmUJYWNvZmYocCxmKSAJdG9mZihhY2hfdCwgcCwgZikKKworLyoKKyAqIFRoZSBOb3AgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX25vcF90CWFjX25vcF90Oworc3RydWN0IGFjX25vcF90Cit7CisJYWNoX3QJbm9wX2g7Cit9OworCisvKgorICogVGhlIElBLVNldHVwIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19pYXNfdAlhY19pYXNfdDsKK3N0cnVjdCBhY19pYXNfdAoreworCWFjaF90CQlpYXNfaDsKKwl1bnNpZ25lZCBjaGFyCWlhc19hZGRyW0FERFJfTEVOXTsgLyogVGhlIChldGhlcm5ldCkgYWRkcmVzcwkqLworfTsKKworLyoKKyAqIFRoZSBDb25maWd1cmUgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX2NmZ190CWFjX2NmZ190Oworc3RydWN0IGFjX2NmZ190Cit7CisJYWNoX3QJCWNmZ19oOworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGVfY250OwkvKiBTaXplIGZvbGwgZGF0YTogNC0xMgkqLworI2RlZmluZQlBQ19DRkdfQllURV9DTlQodikJKCgodikgJiAweEYpIDw8IDApCisJdW5zaWduZWQgY2hhcgljZmdfZmlmb2xpbTsJLyogRklGTyB0aHJlc2hvbGQJKi8KKyNkZWZpbmUJQUNfQ0ZHX0ZJRk9MSU0odikJKCgodikgJiAweEYpIDw8IDApCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTg7CisjZGVmaW5lCUFDX0NGR19TQVZfQkYodikgCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBTYXZlIHJ4ZCBiYWQgZnJhbWVzCSovCisjZGVmaW5lCUFDX0NGR19TUkRZKHYpIAkJKCgodikgJiAweDEpIDw8IDYpCS8qIFNSRFkvQVJEWSBwaW4gbWVhbnMJKi8KKwkJCQkJCQkvKiBleHRlcm5hbCBzeW5jLgkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGU5OworI2RlZmluZQlBQ19DRkdfRUxQQkNLKHYpCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBFeHRlcm5hbCBsb29wYmFjawkqLworI2RlZmluZQlBQ19DRkdfSUxQQkNLKHYpCSgoKHYpICYgMHgxKSA8PCA2KQkvKiBJbnRlcm5hbCBsb29wYmFjawkqLworI2RlZmluZQlBQ19DRkdfUFJFTEVOKHYpCSgoKHYpICYgMHgzKSA8PCA0KQkvKiBQcmVhbWJsZSBsZW5ndGgJKi8KKyNkZWZpbmUJCUFDX0NGR19QTEVOXzIJCTAJCS8qICAyIGJ5dGVzCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl80CQkxCQkvKiAgNCBieXRlcwkqLworI2RlZmluZQkJQUNfQ0ZHX1BMRU5fOAkJMgkJLyogIDggYnl0ZXMJKi8KKyNkZWZpbmUJCUFDX0NGR19QTEVOXzE2CQkzCQkvKiAxNiBieXRlcwkqLworI2RlZmluZQlBQ19DRkdfQUxPQyh2KQkJKCgodikgJiAweDEpIDw8IDMpCS8qIEFkZHIvbGVuIGRhdGEgaXMJKi8KKwkJCQkJCQkvKiBleHBsaWNpdCBpbiBidWZmZXJzCSovCisjZGVmaW5lCUFDX0NGR19BRERSTEVOKHYpCSgoKHYpICYgMHg3KSA8PCAwKQkvKiBCeXRlcyBwZXIgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGUxMDsKKyNkZWZpbmUJQUNfQ0ZHX0JPRk1FVCh2KQkoKCh2KSAmIDB4MSkgPDwgNykJLyogVXNlIGFsdGVybmF0ZSBleHBvLgkqLworCQkJCQkJCS8qIGJhY2tvZmYgbWV0aG9kCSovCisjZGVmaW5lCUFDX0NGR19BQ1IodikJCSgoKHYpICYgMHg3KSA8PCA0KQkvKiBBY2NlbGVyYXRlZCBjb250LiByZXMuICovCisjZGVmaW5lCUFDX0NGR19MSU5QUklPKHYpCSgoKHYpICYgMHg3KSA8PCAwKQkvKiBMaW5lYXIgcHJpb3JpdHkJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19pZnM7CS8qIEludGVyZnJhbWUgc3BhY2luZwkJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19zbG90bDsJLyogU2xvdCB0aW1lIChsb3cgYnl0ZSkJCSovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTEzOworI2RlZmluZQlBQ19DRkdfUkVUUllOVU0odikJKCgodikgJiAweEYpIDw8IDQpCS8qIE1heC4gY29sbGlzaW9uIHJldHJ5CSovCisjZGVmaW5lCUFDX0NGR19TTFRUTUhJKHYpCSgoKHYpICYgMHg3KSA8PCAwKQkvKiBTbG90IHRpbWUgKGhpZ2ggYml0cykgKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlMTQ7CisjZGVmaW5lCUFDX0NGR19GTEdQQUQodikJKCgodikgJiAweDEpIDw8IDcpCS8qIFBhZCB3aXRoIEhETEMgZmxhZ3MJKi8KKyNkZWZpbmUJQUNfQ0ZHX0JUU1RGKHYpCQkoKCh2KSAmIDB4MSkgPDwgNikJLyogRG8gSERMQyBiaXRzdHVmZmluZwkqLworI2RlZmluZQlBQ19DRkdfQ1JDMTYodikJCSgoKHYpICYgMHgxKSA8PCA1KQkvKiAxNiBiaXQgQ0NJVFQgQ1JDCSovCisjZGVmaW5lCUFDX0NGR19OQ1JDKHYpCQkoKCh2KSAmIDB4MSkgPDwgNCkJLyogSW5zZXJ0IG5vIENSQwkqLworI2RlZmluZQlBQ19DRkdfVE5DUlModikJCSgoKHYpICYgMHgxKSA8PCAzKQkvKiBUeCBldmVuIGlmIG5vIGNhcnJpZXIgKi8KKyNkZWZpbmUJQUNfQ0ZHX01BTkNIKHYpCQkoKCh2KSAmIDB4MSkgPDwgMikJLyogTWFuY2hlc3RlciBjb2RpbmcJKi8KKyNkZWZpbmUJQUNfQ0ZHX0JDRElTKHYpCQkoKCh2KSAmIDB4MSkgPDwgMSkJLyogRGlzYWJsZSBicm9hZGNhc3QJKi8KKyNkZWZpbmUJQUNfQ0ZHX1BSTSh2KQkJKCgodikgJiAweDEpIDw8IDApCS8qIFByb21pc2N1b3VzIG1vZGUJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlMTU7CisjZGVmaW5lCUFDX0NGR19JQ0RTKHYpCQkoKCh2KSAmIDB4MSkgPDwgNykJLyogSW50ZXJuYWwgY29sbGlzaW9uCSovCisJCQkJCQkJLyogZGV0ZWN0IHNvdXJjZQkqLworI2RlZmluZQlBQ19DRkdfQ0RURih2KQkJKCgodikgJiAweDcpIDw8IDQpCS8qIENvbGxpc2lvbiBkZXRlY3QJKi8KKwkJCQkJCQkvKiBmaWx0ZXIgaW4gYml0IHRpbWVzCSovCisjZGVmaW5lCUFDX0NGR19JQ1NTKHYpCQkoKCh2KSAmIDB4MSkgPDwgMykJLyogSW50ZXJuYWwgY2FycmllcgkqLworCQkJCQkJCS8qIHNlbnNlIHNvdXJjZQkJKi8KKyNkZWZpbmUJQUNfQ0ZHX0NTVEYodikJCSgoKHYpICYgMHg3KSA8PCAwKQkvKiBDYXJyaWVyIHNlbnNlCSovCisJCQkJCQkJLyogZmlsdGVyIGluIGJpdCB0aW1lcwkqLworCXVuc2lnbmVkIHNob3J0CWNmZ19taW5fZnJtX2xlbjsKKyNkZWZpbmUJQUNfQ0ZHX01ORlJNKHYpCQkoKCh2KSAmIDB4RkYpIDw8IDApCS8qIE1pbi4gYnl0ZXMvZnJhbWUgKDw9IDI1NSkgKi8KK307CisKKy8qCisgKiBUaGUgTUMtU2V0dXAgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX21jc190CWFjX21jc190Oworc3RydWN0IGFjX21jc190Cit7CisJYWNoX3QJCW1jc19oOworCXVuc2lnbmVkIHNob3J0CW1jc19jbnQ7CS8qIE5vLiBvZiBieXRlcyBvZiBNQyBhZGRyZXNzZXMJKi8KKyNpZiAwCisJdW5zaWduZWQgY2hhcgltY3NfZGF0YVtBRERSX0xFTl07IC8qIFRoZSBmaXJzdCBNQyBhZGRyZXNzIC4uCSovCisJLi4uCisjZW5kaWYKK307CisKKyNkZWZpbmUgSTgyNTg2X01BWF9NVUxUSUNBU1RfQUREUkVTU0VTCTEyOAkvKiBIYXJkd2FyZSBoYXNoZWQgZmlsdGVyICovCisKKy8qCisgKiBUaGUgVHJhbnNtaXQgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX3R4X3QJYWNfdHhfdDsKK3N0cnVjdCBhY190eF90Cit7CisJYWNoX3QJCXR4X2g7CisJdW5zaWduZWQgc2hvcnQJdHhfdGJkX29mZnNldDsJLyogQWRkcmVzcyBvZiBsaXN0IG9mIGJ1ZmZlcnMuCSovCisjaWYJMAorTGludXggcGFja2V0cyBhcmUgcGFzc2VkIGRvd24gd2l0aCB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKK2FuZCBsZW5ndGgvdHlwZSBmaWVsZCBhbHJlYWR5IHByZXBlbmRlZCB0byB0aGUgZGF0YSwKK3NvIHdlIGRvIG5vdCBuZWVkIHRvIGluc2VydCBpdC4gIENvbnNpc3RlbnQgd2l0aCB0aGlzCit3ZSBtdXN0IGFsc28gc2V0IHRoZSBBQ19DRkdfQUxPQyguLikgZmxhZyBkdXJpbmcgdGhlCithY19jZmdfdCBhY3Rpb24gY29tbWFuZC4KKwl1bnNpZ25lZCBjaGFyCXR4X2FkZHJbQUREUl9MRU5dOyAvKiBUaGUgZnJhbWUgZGVzdC4gYWRkcmVzcwkqLworCXVuc2lnbmVkIHNob3J0CXR4X2xlbmd0aDsJLyogVGhlIGZyYW1lIGxlbmd0aAkJKi8KKyNlbmRpZgkvKiAwICovCit9OworCisvKgorICogVGhlIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0ZXIgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX3Rkcl90CWFjX3Rkcl90Oworc3RydWN0IGFjX3Rkcl90Cit7CisJYWNoX3QJCXRkcl9oOworCXVuc2lnbmVkIHNob3J0CXRkcl9yZXN1bHQ7CS8qIFJlc3VsdC4JKi8KKyNkZWZpbmUJCUFDX1REUl9MTktfT0sJKDB4MSA8PCAxNSkJLyogTm8gbGluayBwcm9ibGVtCSovCisjZGVmaW5lCQlBQ19URFJfWENWUl9QUkIJKDB4MSA8PCAxNCkJLyogVHhjdnIgY2FibGUgcHJvYmxlbQkqLworI2RlZmluZQkJQUNfVERSX0VUX09QTgkoMHgxIDw8IDEzKQkvKiBPcGVuIG9uIHRoZSBsaW5rCSovCisjZGVmaW5lCQlBQ19URFJfRVRfU1JUCSgweDEgPDwgMTIpCS8qIFNob3J0IG9uIHRoZSBsaW5rCSovCisjZGVmaW5lCQlBQ19URFJfVElNRQkoMHg3RkYgPDwgMCkJLyogRGlzdGFuY2UgdG8gcHJvYmxlbQkqLworCQkJCQkJLyogc2l0ZQlpbiB0cmFuc21pdAkqLworCQkJCQkJLyogY2xvY2sgY3ljbGVzCQkqLworfTsKKworLyoKKyAqIFRoZSBEdW1wIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19kbXBfdAlhY19kbXBfdDsKK3N0cnVjdCBhY19kbXBfdAoreworCWFjaF90CQlkbXBfaDsKKwl1bnNpZ25lZCBzaG9ydAlkbXBfb2Zmc2V0OwkvKiBSZXN1bHQuCSovCit9OworCisvKgorICogU2l6ZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBkdW1wIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUJRFVNUEJZVEVTCTE3MAorCisvKgorICogVGhlIERpYWdub3NlIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19kZ25fdAlhY19kZ25fdDsKK3N0cnVjdCBhY19kZ25fdAoreworCWFjaF90CQlkZ25faDsKK307CisKKy8qCisgKiBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciAoVEJEKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdGJkX3QJdGJkX3Q7CitzdHJ1Y3QgdGJkX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAl0YmRfc3RhdHVzOwkJLyogV3JpdHRlbiBieSB0aGUgQ1BVCSovCisjZGVmaW5lCQlUQkRfU1RBVFVTX0VPRgkoMHgxIDw8IDE1KQkvKiBUaGlzIFRCRCBpcyB0aGUJKi8KKwkJCQkJCS8qIGxhc3QgZm9yIHRoaXMgZnJhbWUJKi8KKyNkZWZpbmUJCVRCRF9TVEFUVVNfQUNOVAkoMHgzRkZGIDw8IDApCS8qIEFjdHVhbCBjb3VudCBvZiBkYXRhCSovCisJCQkJCQkvKiBieXRlcyBpbiB0aGlzIGJ1ZmZlcgkqLworCXVuc2lnbmVkIHNob3J0CXRiZF9uZXh0X2JkX29mZnNldDsJLyogTmV4dCBpbiBsaXN0CQkqLworCXVuc2lnbmVkIHNob3J0CXRiZF9idWZsOwkJLyogQnVmZmVyIGFkZHJlc3MgKGxvdykJKi8KKwl1bnNpZ25lZCBzaG9ydAl0YmRfYnVmaDsJCS8qICAgICIJICAgICAiCShoaWdoKQkqLworfTsKKworLyoKKyAqIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgKFJCRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHJiZF90CXJiZF90Oworc3RydWN0IHJiZF90Cit7CisJdW5zaWduZWQgc2hvcnQJcmJkX3N0YXR1czsJCS8qIFdyaXR0ZW4gYnkgdGhlIDgyNTg2CSovCisjZGVmaW5lCQlSQkRfU1RBVFVTX0VPRgkoMHgxIDw8IDE1KQkvKiBUaGlzIFJCRCBpcyB0aGUJKi8KKwkJCQkJCS8qIGxhc3QgZm9yIHRoaXMgZnJhbWUJKi8KKyNkZWZpbmUJCVJCRF9TVEFUVVNfRgkoMHgxIDw8IDE0KQkvKiBBQ05UIGZpZWxkIGlzIHZhbGlkCSovCisjZGVmaW5lCQlSQkRfU1RBVFVTX0FDTlQJKDB4M0ZGRiA8PCAwKQkvKiBBY3R1YWwgbm8uIG9mIGRhdGEJKi8KKwkJCQkJCS8qIGJ5dGVzIGluIHRoaXMgYnVmZmVyCSovCisJdW5zaWduZWQgc2hvcnQJcmJkX25leHRfcmJkX29mZnNldDsJLyogTmV4dCByYmQgaW4gbGlzdAkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9idWZsOwkJLyogRGF0YSBwb2ludGVyIChsb3cpCSovCisJdW5zaWduZWQgc2hvcnQJcmJkX2J1Zmg7CQkvKiAgIgkgICAiICAgIChoaWdoKQkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9lbF9zaXplOwkJLyogRUwrRGF0YSBidWYuIHNpemUJKi8KKyNkZWZpbmUJCVJCRF9FTAkoMHgxIDw8IDE1KQkJLyogVGhpcyBCRCBpcyB0aGUJKi8KKwkJCQkJCS8qIGxhc3QgaW4gdGhlIGxpc3QJKi8KKyNkZWZpbmUJCVJCRF9TSVpFICgweDNGRkYgPDwgMCkJCS8qIE5vLiBvZiBieXRlcyB0aGUJKi8KKwkJCQkJCS8qIGJ1ZmZlciBjYW4gaG9sZAkqLworfTsKKworI2RlZmluZQlyYmRvZmYocCxmKSAJdG9mZihyYmRfdCwgcCwgZikKKworLyoKKyAqIEZyYW1lIERlc2NyaXB0b3IgKEZEKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZmRfdAlmZF90Oworc3RydWN0IGZkX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlmZF9zdGF0dXM7CQkvKiBXcml0dGVuIGJ5IHRoZSA4MjU4NgkqLworI2RlZmluZQkJRkRfU1RBVFVTX0MJKDB4MSA8PCAxNSkJLyogQ29tcGxldGVkIHN0b3JpbmcgZnJhbWUgKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19CCSgweDEgPDwgMTQpCS8qIEZEIHdhcyBjb25zdW1lZCBieSBSVSAqLworI2RlZmluZQkJRkRfU1RBVFVTX09LCSgweDEgPDwgMTMpCS8qIEZyYW1lIHJ4ZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TMTEJKDB4MSA8PCAxMSkJLyogQ1JDIGVycm9yCQkqLworI2RlZmluZQkJRkRfU1RBVFVTX1MxMAkoMHgxIDw8IDEwKQkvKiBBbGlnbm1lbnQgZXJyb3IJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TOQkoMHgxIDw8ICA5KQkvKiBSYW4gb3V0IG9mIHJlc291cmNlcwkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M4CSgweDEgPDwgIDgpCS8qIFJ4IERNQSBvdmVycnVuCSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzcJKDB4MSA8PCAgNykJLyogRnJhbWUgdG9vIHNob3J0CSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzYJKDB4MSA8PCAgNikJLyogTm8gRU9GIGZsYWcJCSovCisJdW5zaWduZWQgc2hvcnQJZmRfY29tbWFuZDsJCS8qIENvbW1hbmQJCSovCisjZGVmaW5lCQlGRF9DT01NQU5EX0VMCSgweDEgPDwgMTUpCS8qIExhc3QgRkQgaW4gbGlzdAkqLworI2RlZmluZQkJRkRfQ09NTUFORF9TCSgweDEgPDwgMTQpCS8qIFN1c3BlbmQgUlUgYWZ0ZXIgcngJKi8KKwl1bnNpZ25lZCBzaG9ydAlmZF9saW5rX29mZnNldDsJCS8qIE5leHQgRkQJCSovCisJdW5zaWduZWQgc2hvcnQJZmRfcmJkX29mZnNldDsJCS8qIEZpcnN0IFJCRCAoZGF0YSkJKi8KKwkJCQkJCS8qIFByZXBhcmVkIGJ5IENQVSwJKi8KKwkJCQkJCS8qIHVwZGF0ZWQgYnkgODI1ODYJKi8KKyNpZgkwCitJIHRoaW5rIHRoZSByZXN0IGlzIHVudXNlZCBzaW5jZSB3ZQoraGF2ZSBzZXQgQUNfQ0ZHX0FMT0MoLi4pLiAgSG93ZXZlciwganVzdAoraW4gY2FzZSwgd2UgbGVhdmUgdGhlIHNwYWNlLgorI2VuZGlmCS8qIDAgKi8KKwl1bnNpZ25lZCBjaGFyCWZkX2Rlc3RbQUREUl9MRU5dOwkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzCSovCisJCQkJCQkvKiBXcml0dGVuIGJ5IDgyNTg2CSovCisJdW5zaWduZWQgY2hhcglmZF9zcmNbQUREUl9MRU5dOwkvKiBTb3VyY2UgYWRkcmVzcwkqLworCQkJCQkJLyogV3JpdHRlbiBieSA4MjU4NgkqLworCXVuc2lnbmVkIHNob3J0CWZkX2xlbmd0aDsJCS8qIEZyYW1lIGxlbmd0aCBvciB0eXBlCSovCisJCQkJCQkvKiBXcml0dGVuIGJ5IDgyNTg2CSovCit9OworCisjZGVmaW5lCWZkb2ZmKHAsZikgCXRvZmYoZmRfdCwgcCwgZikKKworLyoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB3YXZlbGFuLmMuCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU5My5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTkzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhY2I4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU5My5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIEludGVsIDgyNTkzIENTTUEvQ0QgQ29yZSBMQU4gQ29udHJvbGxlcgorICogVGhlIGRlZmluaXRpb25zIGFyZSB0YWtlbiBmcm9tIHRoZSAxOTkyIHVzZXJzIG1hbnVhbCB3aXRoIEludGVsCisgKiBvcmRlciBudW1iZXIgMjk3MTI1LTAwMS4KKyAqCisgKiAvdXNyL3NyYy9wYy9SQ1MvaTgyNTkzLmgsdiAxLjEgMTk5Ni8wNy8xNyAxNToyMzoxMiByb290IEV4cAorICoKKyAqIENvcHlyaWdodCAxOTk0LCBBbmRlcnMgS2xlbWV0cyA8a2xlbWV0c0BpdC5rdGguc2U+CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIGZvciBub25jb21tZXJjaWFsIHB1cnBvc2VzCisgKiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHJldGFpbmVkLgorICogCisgKiBISVNUT1JZCisgKiBpODI1OTMuaCx2CisgKiBSZXZpc2lvbiAxLjEgIDE5OTYvMDcvMTcgMTU6MjM6MTIgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTUvMDQvMDUgIDE1OjEzOjU4ICBhZGoKKyAqIEluaXRpYWwgYWxwaGEgcmVsZWFzZQorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8wNi8xNiAgMjM6NTc6MzEgIGtsZW1ldHMKKyAqIE1pcnJvcmVkIGFsbCB0aGUgZmllbGRzIGluIHRoZSBjb25maWd1cmF0aW9uIGJsb2NrLgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wNi8wMiAgMjA6MjU6MzQgIGtsZW1ldHMKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKgorICovCisjaWZuZGVmCV9JODI1OTNfSAorI2RlZmluZQlfSTgyNTkzX0gKKworLyogSW50ZWwgODI1OTMgQ1NNQS9DRCBDb3JlIExBTiBDb250cm9sbGVyICovCisKKy8qIFBvcnQgMCBDb21tYW5kIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKy8qIEV4ZWN1dGlvbiBvcGVyYXRpb25zICovCisjZGVmaW5lIE9QMF9OT1AJCQkwCS8qIENITkwgPSAwICovCisjZGVmaW5lIE9QMF9TV0lUX1RPX1BPUlRfMQkwCS8qIENITkwgPSAxICovCisjZGVmaW5lIE9QMF9JQV9TRVRVUAkJMQorI2RlZmluZSBPUDBfQ09ORklHVVJFCQkyCisjZGVmaW5lIE9QMF9NQ19TRVRVUAkJMworI2RlZmluZSBPUDBfVFJBTlNNSVQJCTQKKyNkZWZpbmUgT1AwX1REUgkJCTUKKyNkZWZpbmUgT1AwX0RVTVAJCTYKKyNkZWZpbmUgT1AwX0RJQUdOT1NFCQk3CisjZGVmaW5lIE9QMF9UUkFOU01JVF9OT19DUkMJOQorI2RlZmluZSBPUDBfUkVUUkFOU01JVAkJMTIKKyNkZWZpbmUgT1AwX0FCT1JUCQkxMworLyogUmVjZXB0aW9uIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgT1AwX1JDVl9FTkFCTEUJCTgKKyNkZWZpbmUgT1AwX1JDVl9ESVNBQkxFCQkxMAorI2RlZmluZSBPUDBfU1RPUF9SQ1YJCTExCisvKiBTdGF0dXMgcG9pbnRlciBjb250cm9sIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgT1AwX0ZJWF9QVFIJCTE1CS8qIENITkwgPSAxICovCisjZGVmaW5lIE9QMF9STFNfUFRSCQkxNQkvKiBDSE5MID0gMCAqLworI2RlZmluZSBPUDBfUkVTRVQJCTE0CisKKyNkZWZpbmUgQ1IwX0NITkwJCSgxIDw8IDQpCS8qIDA9Q2hhbm5lbCAwLCAxPUNoYW5uZWwgMSAqLworI2RlZmluZSBDUjBfU1RBVFVTXzAJCTB4MDAKKyNkZWZpbmUgQ1IwX1NUQVRVU18xCQkweDIwCisjZGVmaW5lIENSMF9TVEFUVVNfMgkJMHg0MAorI2RlZmluZSBDUjBfU1RBVFVTXzMJCTB4NjAKKyNkZWZpbmUgQ1IwX0lOVF9BQ0sJCSgxIDw8IDcpCS8qIDA9Tm8gYWNrLCAxPWFja25vd2xlZGdlICovCisKKy8qIFBvcnQgMCBTdGF0dXMgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBTUjBfTk9fUkVTVUxUCQkwCQkvKiBkdW1teSAqLworI2RlZmluZSBTUjBfRVZFTlRfTUFTSwkJMHgwZgorI2RlZmluZSBTUjBfSUFfU0VUVVBfRE9ORQkxCisjZGVmaW5lIFNSMF9DT05GSUdVUkVfRE9ORQkyCisjZGVmaW5lIFNSMF9NQ19TRVRVUF9ET05FCTMKKyNkZWZpbmUgU1IwX1RSQU5TTUlUX0RPTkUJNAorI2RlZmluZSBTUjBfVERSX0RPTkUJCTUKKyNkZWZpbmUgU1IwX0RVTVBfRE9ORQkJNgorI2RlZmluZSBTUjBfRElBR05PU0VfUEFTU0VECTcKKyNkZWZpbmUgU1IwX1RSQU5TTUlUX05PX0NSQ19ET05FIDkKKyNkZWZpbmUgU1IwX1JFVFJBTlNNSVRfRE9ORQkxMgorI2RlZmluZSBTUjBfRVhFQ1VUSU9OX0FCT1JURUQJMTMKKyNkZWZpbmUgU1IwX0VORF9PRl9GUkFNRQk4CisjZGVmaW5lIFNSMF9SRUNFUFRJT05fQUJPUlRFRAkxMAorI2RlZmluZSBTUjBfRElBR05PU0VfRkFJTEVECTE1CisjZGVmaW5lIFNSMF9TVE9QX1JFR19ISVQJMTEKKworI2RlZmluZSBTUjBfQ0hOTAkJKDEgPDwgNCkKKyNkZWZpbmUgU1IwX0VYRUNVVElPTgkJKDEgPDwgNSkKKyNkZWZpbmUgU1IwX1JFQ0VQVElPTgkJKDEgPDwgNikKKyNkZWZpbmUgU1IwX0lOVEVSUlVQVAkJKDEgPDwgNykKKyNkZWZpbmUgU1IwX0JPVEhfUlhfVFgJCShTUjBfRVhFQ1VUSU9OIHwgU1IwX1JFQ0VQVElPTikKKworI2RlZmluZSBTUjNfRVhFQ19TVEFURV9NQVNLCTB4MDMKKyNkZWZpbmUgU1IzX0VYRUNfSURMRQkJMAorI2RlZmluZSBTUjNfVFhfQUJPUlRfSU5fUFJPR1JFU1MgMQorI2RlZmluZSBTUjNfRVhFQ19BQ1RJVkUJCTIKKyNkZWZpbmUgU1IzX0FCT1JUX0lOX1BST0dSRVNTCTMKKyNkZWZpbmUgU1IzX0VYRUNfQ0hOTAkJKDEgPDwgMikKKyNkZWZpbmUgU1IzX1NUUF9PTl9OT19SU1JDCSgxIDw8IDMpCisjZGVmaW5lIFNSM19SQ1ZJTkdfTk9fUlNSQwkoMSA8PCA0KQorI2RlZmluZSBTUjNfUkNWX1NUQVRFX01BU0sJMHg2MAorI2RlZmluZSBTUjNfUkNWX0lETEUJCTB4MDAKKyNkZWZpbmUgU1IzX1JDVl9SRUFEWQkJMHgyMAorI2RlZmluZSBTUjNfUkNWX0FDVElWRQkJMHg0MAorI2RlZmluZSBTUjNfUkNWX1NUT1BfSU5fUFJPRwkweDYwCisjZGVmaW5lIFNSM19SQ1ZfQ0hOTAkJKDEgPDwgNykKKworLyogUG9ydCAxIENvbW1hbmQgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBPUDFfTk9QCQkJMAorI2RlZmluZSBPUDFfU1dJVF9UT19QT1JUXzAJMQorI2RlZmluZSBPUDFfSU5UX0RJU0FCTEUJCTIKKyNkZWZpbmUgT1AxX0lOVF9FTkFCTEUJCTMKKyNkZWZpbmUgT1AxX1NFVF9UUwkJNQorI2RlZmluZSBPUDFfUlNUX1RTCQk3CisjZGVmaW5lIE9QMV9QT1dFUl9ET1dOCQk4CisjZGVmaW5lIE9QMV9SRVNFVF9SSU5HX01OR01UCTExCisjZGVmaW5lIE9QMV9SRVNFVAkJMTQKKyNkZWZpbmUgT1AxX1NFTF9SU1QJCTE1CisKKyNkZWZpbmUgQ1IxX1NUQVRVU180CQkweDAwCisjZGVmaW5lIENSMV9TVEFUVVNfNQkJMHgyMAorI2RlZmluZSBDUjFfU1RBVFVTXzYJCTB4NDAKKyNkZWZpbmUgQ1IxX1NUT1BfUkVHX1VQREFURQkoMSA8PCA3KQorCisvKiBSZWNlaXZlIGZyYW1lIHN0YXR1cyBiaXRzICovCisKKyNkZWZpbmUJUlhfUkNMRAkJCSgxIDw8IDApCisjZGVmaW5lIFJYX0lBX01BVENICQkoMSA8PCAxKQorI2RlZmluZQlSWF9OT19BRF9NQVRDSAkJKDEgPDwgMikKKyNkZWZpbmUgUlhfTk9fU0ZECQkoMSA8PCAzKQorI2RlZmluZSBSWF9TUlRfRlJNCQkoMSA8PCA3KQorI2RlZmluZSBSWF9PVlJSVU4JCSgxIDw8IDgpCisjZGVmaW5lIFJYX0FMR19FUlIJCSgxIDw8IDEwKQorI2RlZmluZSBSWF9DUkNfRVJSCQkoMSA8PCAxMSkKKyNkZWZpbmUgUlhfTEVOX0VSUgkJKDEgPDwgMTIpCisjZGVmaW5lIFJYX1JDVl9PSwkJKDEgPDwgMTMpCisjZGVmaW5lIFJYX1RZUF9MRU4JCSgxIDw8IDE1KQorCisvKiBUcmFuc21pdCBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFRYX05DT0xfTUFTSwkJMHgwZgorI2RlZmluZSBUWF9GUlRMCQkJKDEgPDwgNCkKKyNkZWZpbmUgVFhfTUFYX0NPTAkJKDEgPDwgNSkKKyNkZWZpbmUgVFhfSFJUX0JFQVQJCSgxIDw8IDYpCisjZGVmaW5lIFRYX0RFRkVSCQkoMSA8PCA3KQorI2RlZmluZSBUWF9VTkRfUlVOCQkoMSA8PCA4KQorI2RlZmluZSBUWF9MT1NUX0NUUwkJKDEgPDwgOSkKKyNkZWZpbmUgVFhfTE9TVF9DUlMJCSgxIDw8IDEwKQorI2RlZmluZSBUWF9MVENPTAkJKDEgPDwgMTEpCisjZGVmaW5lIFRYX09LCQkJKDEgPDwgMTMpCisjZGVmaW5lIFRYX0NPTEwJCQkoMSA8PCAxNSkKKworc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrIHsKKyAgdV9jaGFyIGZpZm9fbGltaXQgOiA0LAorICAJIGZvcmduZXNpICAgOiAxLAorICAJIGZpZm9fMzIgICAgOiAxLAorICAJIGQ2bW9kICAgICAgOiAxLAorICAJIHRocm90dGxlX2VuYiA6IDE7CisgIHVfY2hhciB0aHJvdHRsZSAgIDogNiwKKwkgY250cnhpbnQgICA6IDEsCisJIGNvbnRpbgkgICAgOiAxOworICB1X2NoYXIgYWRkcl9sZW4gICA6IDMsCisgIAkgYWNsb2MgCSAgICA6IDEsCisgCSBwcmVhbWJfbGVuIDogMiwKKyAgCSBsb29wYmFjayAgIDogMjsKKyAgdV9jaGFyIGxpbl9wcmlvICAgOiAzLAorCSB0Ym9mc3RvcCAgIDogMSwKKwkgZXhwX3ByaW8gICA6IDMsCisJIGJvZl9tZXQgICAgOiAxOworICB1X2NoYXIJICAgIDogNCwKKwkgaWZybV9zcGMgICA6IDQ7CisgIHVfY2hhcgkgICAgOiA1LAorCSBzbG90dGltX2xvdyA6IDM7CisgIHVfY2hhciBzbG90dGltX2hpIDogMywKKwkJICAgIDogMSwKKwkgbWF4X3JldHIgICA6IDQ7CisgIHVfY2hhciBwcm1pc2MgICAgIDogMSwKKwkgYmNfZGlzICAgICA6IDEsCisgIAkJICAgIDogMSwKKwkgY3JzXzEJICAgIDogMSwKKwkgbm9jcmNfaW5zICA6IDEsCisJIGNyY18xNjMyICAgOiAxLAorICAJIAkgICAgOiAxLAorICAJIGNyc19jZHQgICAgOiAxOworICB1X2NoYXIgY3NfZmlsdGVyICA6IDMsCisJIGNyc19zcmMgICAgOiAxLAorCSBjZF9maWx0ZXIgIDogMywKKwkJICAgIDogMTsKKyAgdV9jaGFyCSAgICA6IDIsCisgIAkgbWluX2ZyX2xlbiA6IDY7CisgIHVfY2hhciBsbmdfdHlwICAgIDogMSwKKwkgbG5nX2ZsZCAgICA6IDEsCisJIHJ4Y3JjX3hmICAgOiAxLAorCSBhcnR4CSAgICA6IDEsCisJIHNhcmVjCSAgICA6IDEsCisJIHR4X2phYmJlciAgOiAxLAkvKiB3aHkgaXMgdGhpcyBjYWxsZWQgbWF4X2xlbiBpbiB0aGUgbWFudWFsPyAqLworCSBoYXNoXzEJICAgIDogMSwKKyAgCSBsYnBrcG9sICAgIDogMTsKKyAgdV9jaGFyCSAgICA6IDYsCisgIAkgZmR4CSAgICA6IDEsCisgIAkgIAkgICAgOiAxOworICB1X2NoYXIgZHVtbXlfNiAgICA6IDYsCS8qIHN1cHBvc2VkIHRvIGJlIG9uZXMgKi8KKyAgCSBtdWx0X2lhICAgIDogMSwKKyAgCSBkaXNfYm9mICAgIDogMTsKKyAgdV9jaGFyIGR1bW15XzEgICAgOiAxLAkvKiBzdXBwb3NlZCB0byBiZSBvbmUgKi8KKwkgdHhfaWZzX3JldHJpZyA6IDIsCisJIG1jX2FsbCAgICAgOiAxLAorCSByY3ZfbW9uICAgIDogMiwKKwkgZnJhZ19hY3B0ICA6IDEsCisgIAkgdHN0cnR0cnMgICA6IDE7CisgIHVfY2hhciBmcmV0eAkgICAgOiAxLAorCSBydW50X2VvcCAgIDogMSwKKwkgaHdfc3dfcGluICA6IDEsCisJIGJpZ19lbmRuICAgOiAxLAorCSBzeW5jcnFzICAgIDogMSwKKwkgc3R0bGVuICAgICA6IDEsCisJIHR4X2VvcCAgICAgOiAxLAorICAJIHJ4X2VvcAkgICAgOiAxOworICB1X2NoYXIgcmJ1Zl9zaXplICA6IDUsCisJIHJjdnN0b3AgICAgOiAxLAorICAJIAkgICAgOiAyOworfTsKKworI2RlZmluZSBJODI1OTNfTUFYX01VTFRJQ0FTVF9BRERSRVNTRVMJMTI4CS8qIEhhcmR3YXJlIGhhc2hlZCBmaWx0ZXIgKi8KKworI2VuZGlmIC8qIF9JODI1OTNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaWVlZTgwMl8xMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaWVlZTgwMl8xMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZGQ1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pZWVlODAyXzExLmgKQEAgLTAsMCArMSw3OCBAQAorI2lmbmRlZiBfSUVFRTgwMl8xMV9ICisjZGVmaW5lIF9JRUVFODAyXzExX0gKKworI2RlZmluZSBJRUVFODAyXzExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworCisKKyNkZWZpbmUgSUVFRTgwMl8xMV9ITEVOCQkJMzAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GUkFNRV9MRU4JCShJRUVFODAyXzExX0RBVEFfTEVOICsgSUVFRTgwMl8xMV9ITEVOKQorCitzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyXzExX0ZDVExfVkVSUwkJMHgwMDAyCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9UT0RTCQkweDAxMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9NT1JFREFUQQkweDIwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMl8xMV9GVFlQRV9NR01UCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyXzExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVNTT0NfUkVRCTB4MDAwMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1JFQVNTT0NfUkVTUAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9CRUFDT04JCTB4MDA4MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FVVEgJCTB4MDBCMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisKKy8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ1RTCQkweDAwQzAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkVOREFDSwkweDAwRjAKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorCisjZGVmaW5lIElFRUU4MDJfMTFfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMl8xMV9TQ1RMX1NFUQkJMHhGRkYwCisKKyNlbmRpZiAvKiBfSUVFRTgwMl8xMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMjQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwpAQCAtMCwwICsxLDE3MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbmV0d2F2ZV9jcy5jCisgKiBWZXJzaW9uOiAgICAgICAwLjQuMQorICogRGVzY3JpcHRpb246ICAgTmV0d2F2ZSBBaXJTdXJmZXIgV2lyZWxlc3MgTEFOIFBDIENhcmQgZHJpdmVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3JzOiAgICAgICBKb2huIE1hcmt1cyBCavhybmRhbGVuIDxqb2hubUBjcy51aXQubm8+CisgKiAgICAgICAgICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgICAgICAgICAgICBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDcmVhdGVkIGF0OiAgICBBIGxvbmcgdGltZSBhZ28hCisgKiBNb2RpZmllZCBhdDogICBNb24gTm92IDEwIDExOjU0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NyBVbml2ZXJzaXR5IG9mIFRyb21z+CwgTm9yd2F5CisgKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqCisgKiAgIDA4LU5vdi05NyAxNToxNDo0NyAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KKyAqICAgIC0gRml4ZWQgc29tZSBidWdzIGluIG5ldHdhdmVfcnggYW5kIGNsZWFuZWQgaXQgdXAgYSBiaXQuIAorICogICAgICAoT25lIG9mIHRoZSBidWdzIHdvdWxkIGhhdmUgZGVzdHJveWVkIHBhY2tldHMgd2hlbiByZWNlaXZpbmcKKyAqICAgICAgbXVsdGlwbGUgcGFja2V0cyBwZXIgaW50ZXJydXB0KS4gCisgKiAgICAtIENsZWFuZWQgdXAgcGFydHMgb2YgbmV3YXZlX2h3X3htaXQuIAorICogICAgLSBBIGZldyBnZW5lcmFsIGNsZWFudXBzLiAKKyAqICAgMjQtT2N0LTk3IDEzOjE3OjM2ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgLSBGaXhlZCBuZXR3YXZlX3J4IHJlY2VpdmUgZnVuY3Rpb24gKGdvdCB1cGRhdGVkIGRvY3MpCisgKiAgIE90aGVyczoKKyAqICAgIC0gQ2hhbmdlZCBuYW1lIGZyb20geGlyY253IHRvIG5ldHdhdmUsIHRha2UgYSBsb29rIGF0IAorICogICAgICBodHRwOi8vd3d3Lm5ldHdhdmUtd2lyZWxlc3MuY29tCisgKiAgICAtIFNvbWUgcmVvcmdhbml6aW5nIG9mIHRoZSBjb2RlCisgKiAgICAtIFJlbW92ZWQgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdHJhbnNtaXQKKyAqICAgICAgZnVuY3Rpb24KKyAqICAgIC0gU3RhcnRlZCB0byBhZGQgd2lyZWxlc3MgZXh0ZW5zaW9ucywgYnV0IHN0aWxsIG5lZWRzIHNvbWUgY29kaW5nCisgKiAgICAtIEFkZGVkIHdhdGNoZG9nIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgdHJhbnNtaXNzaW9uIHRpbWVvdXRzIAorICogICAgICAoaG9wZWZ1bGx5IHRoaXMgd29ya3MgYmV0dGVyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUbyBoYXZlIHN0YXRpc3RpY3MgKGp1c3QgcGFja2V0cyBzZW50KSBkZWZpbmUgdGhpcyAqLworI3VuZGVmIE5FVFdBVkVfU1RBVFMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaWZkZWYgQ09ORklHX05FVF9SQURJTworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDEyICovCisjZW5kaWYKKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvbWVtX29wLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjZGVmaW5lIE5FVFdBVkVfUkVHT0ZGICAgICAgICAgMHg4MDAwCisvKiBUaGUgTmV0d2F2ZSBJTyByZWdpc3RlcnMsIG9mZnNldHMgdG8gaW9iYXNlICovCisjZGVmaW5lIE5FVFdBVkVfUkVHX0NPUiAgICAgICAgMHgwCisjZGVmaW5lIE5FVFdBVkVfUkVHX0NDU1IgICAgICAgMHgyCisjZGVmaW5lIE5FVFdBVkVfUkVHX0FTUiAgICAgICAgMHg0CisjZGVmaW5lIE5FVFdBVkVfUkVHX0lNUiAgICAgICAgMHhhCisjZGVmaW5lIE5FVFdBVkVfUkVHX1BNUiAgICAgICAgMHhjCisjZGVmaW5lIE5FVFdBVkVfUkVHX0lPTE9XICAgICAgMHg2CisjZGVmaW5lIE5FVFdBVkVfUkVHX0lPSEkgICAgICAgMHg3CisjZGVmaW5lIE5FVFdBVkVfUkVHX0lPQ09OVFJPTCAgMHg4CisjZGVmaW5lIE5FVFdBVkVfUkVHX0RBVEEgICAgICAgMHhmCisvKiBUaGUgTmV0d2F2ZSBFeHRlbmRlZCBJTyByZWdpc3RlcnMsIG9mZnNldHMgdG8gUmFtQmFzZSAqLworI2RlZmluZSBORVRXQVZFX0VSRUdfQVNDQyAgICAgIDB4MTE0CisjZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSICAgICAgMHgxMjAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1JTRVJXICAgICAweDEyNAorI2RlZmluZSBORVRXQVZFX0VSRUdfVFNFUiAgICAgIDB4MTMwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19UU0VSVyAgICAgMHgxMzQKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0NCICAgICAgICAweDEwMAorI2RlZmluZSBORVRXQVZFX0VSRUdfU1BDUSAgICAgIDB4MTU0CisjZGVmaW5lIE5FVFdBVkVfRVJFR19TUFUgICAgICAgMHgxNTUKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0xJRiAgICAgICAweDE0ZQorI2RlZmluZSBORVRXQVZFX0VSRUdfSVNQTFEgICAgIDB4MTU2CisjZGVmaW5lIE5FVFdBVkVfRVJFR19ISEMgICAgICAgMHgxNTgKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX05JICAgICAgICAweDE2ZQorI2RlZmluZSBORVRXQVZFX0VSRUdfTUhTICAgICAgIDB4MTZiCisjZGVmaW5lIE5FVFdBVkVfRVJFR19URFAgICAgICAgMHgxNDAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1JEUCAgICAgICAweDE1MAorI2RlZmluZSBORVRXQVZFX0VSRUdfUEEgICAgICAgIDB4MTYwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19FQyAgICAgICAgMHgxODAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0NSQlAgICAgICAweDE3YQorI2RlZmluZSBORVRXQVZFX0VSRUdfQVJXICAgICAgIDB4MTY2CisKKy8qCisgKiBDb21tYW5kcyB1c2VkIGluIHRoZSBleHRlbmRlZCBjb21tYW5kIGJ1ZmZlcgorICogTkVUV0FWRV9FUkVHX0NCICgweDEwMC0weDEwRikgCisgKi8KKyNkZWZpbmUgTkVUV0FWRV9DTURfTk9QICAgICAgICAweDAwCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NSQyAgICAgICAgMHgwMQorI2RlZmluZSBORVRXQVZFX0NNRF9TVEMgICAgICAgIDB4MDIKKyNkZWZpbmUgTkVUV0FWRV9DTURfQU1BICAgICAgICAweDAzCisjZGVmaW5lIE5FVFdBVkVfQ01EX0RNQSAgICAgICAgMHgwNAorI2RlZmluZSBORVRXQVZFX0NNRF9TQU1BICAgICAgIDB4MDUKKyNkZWZpbmUgTkVUV0FWRV9DTURfRVIgICAgICAgICAweDA2CisjZGVmaW5lIE5FVFdBVkVfQ01EX0RSICAgICAgICAgMHgwNworI2RlZmluZSBORVRXQVZFX0NNRF9UTCAgICAgICAgIDB4MDgKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1JQICAgICAgICAweDA5CisjZGVmaW5lIE5FVFdBVkVfQ01EX1NTSyAgICAgICAgMHgwYQorI2RlZmluZSBORVRXQVZFX0NNRF9TTUQgICAgICAgIDB4MGIKKyNkZWZpbmUgTkVUV0FWRV9DTURfU0FQRCAgICAgICAweDBjCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NTUyAgICAgICAgMHgxMQorLyogRW5kIG9mIENvbW1hbmQgbWFya2VyICovCisjZGVmaW5lIE5FVFdBVkVfQ01EX0VPQyAgICAgICAgMHgwMAorCisvKiBBU1IgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBORVRXQVZFX0FTUl9SWFJEWSAgIDB4ODAKKyNkZWZpbmUgTkVUV0FWRV9BU1JfVFhCQSAgICAweDAxCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKCgzMipIWikvMTAwKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltckNvbmZSRlUxID0gMHgxMDsgLyogUkZVIGludGVycnVwdCBtYXNrLCBrZWVwIGhpZ2ggKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1yQ29uZklFTkEgPSAweDAyOyAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY29yQ29uZklFTkEgICA9IDB4MDE7IC8qIEludGVycnVwdCBlbmFibGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY29yQ29uZkxWTFJFUSA9IDB4NDA7IC8qIEtlZXAgaGlnaCAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZlJ4RW5hICA9IDB4ODA7IC8qIFJlY2VpdmUgRW5hYmxlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZk1BQyAgICA9IDB4MjA7IC8qIE1BQyBob3N0IHJlY2VpdmUgbW9kZSovIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZQcm8gICAgPSAweDEwOyAvKiBQcm9taXNjdW91cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZBTVAgICAgPSAweDA4OyAvKiBBY2NlcHQgTXVsdGljYXN0IFBhY2tldHMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mQmNhc3QgID0gMHgwNDsgLyogQWNjZXB0IEJyb2FkY2FzdCBQYWNrZXRzICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mVHhFbmEgID0gMHg4MDsgLyogVHJhbnNtaXQgRW5hYmxlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZk1BQyAgICA9IDB4MjA7IC8qIEhvc3Qgc2VuZHMgTUFDIG1vZGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mRVVEICAgID0gMHgxMDsgLyogRW5hYmxlIFVuaS1EYXRhIHBhY2tldHMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mS2V5ICAgID0gMHgwMjsgLyogU2NyYW1ibGUgZGF0YSBwYWNrZXRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZkxvb3AgICA9IDB4MDE7IC8qIExvb3BiYWNrIG1vZGUgKi8KKworLyoKKyAgIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisibmV0d2F2ZV9jcy5jIDAuMy4wIFRodSBKdWwgMTcgMTQ6MzY6MDIgMTk5NyAoSm9obiBNYXJrdXMgQmr4cm5kYWxlbilcbiI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gIm5ldHdhdmVfY3MiOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJyAqLworCisvKiBDaG9vc2UgdGhlIGRvbWFpbiwgZGVmYXVsdCBpcyAweDEwMCAqLworc3RhdGljIHVfaW50ICBkb21haW4gPSAweDEwMDsKKworLyogU2NyYW1ibGUga2V5LCByYW5nZSBmcm9tIDB4MCB0byAweGZmZmYuICAKKyAqIDB4MCBpcyBubyBzY3JhbWJsaW5nLiAKKyAqLworc3RhdGljIHVfaW50ICBzY3JhbWJsZV9rZXkgPSAweDA7CisKKy8qIFNoYXJlZCBtZW1vcnkgc3BlZWQsIGluIG5zLiBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCAKKyAqIHRoZSBjYXJkIHNob3VsZCBub3QgYmUgcmVhZCBmYXN0ZXIgdGhhbiBldmVyeSA0MDBucy4gCisgKiBUaGlzIHRpbWluZyBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIEhCQS4gSWYgaXQgYmVjb21lcyBhIAorICogcHJvYmxlbSwgdHJ5IHNldHRpbmcgbWVtX3NwZWVkIHRvIDQwMC4gCisgKi8KK3N0YXRpYyBpbnQgbWVtX3NwZWVkOworCittb2R1bGVfcGFyYW0oZG9tYWluLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNjcmFtYmxlX2tleSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtZW1fc3BlZWQsIGludCwgMCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQQ01DSUEgKENhcmQgU2VydmljZXMpIHJlbGF0ZWQgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7ICAgICAvKiBDYXJkIHJlbW92YWwgKi8KK3N0YXRpYyBpbnQgIG5ldHdhdmVfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCAKKwkJCQkJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyB2b2lkIG5ldHdhdmVfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICphcmcpOyAvKiBSdW5zIGFmdGVyIGNhcmQgCisJCQkJCQkJCQkJCQkJICAgaW5zZXJ0aW9uICovCitzdGF0aWMgZGV2X2xpbmtfdCAqbmV0d2F2ZV9hdHRhY2godm9pZCk7ICAgICAvKiBDcmVhdGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKGRldl9saW5rX3QgKik7ICAgIC8qIERlc3Ryb3kgaW5zdGFuY2UgKi8KKworLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9iYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSk7CitzdGF0aWMgdm9pZCBuZXR3YXZlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBNaXNjIGRldmljZSBzdHVmZiAqLworc3RhdGljIGludCBuZXR3YXZlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7ICAvKiBPcGVuIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgLyogQ2xvc2UgdGhlIGRldmljZSAqLworCisvKiBQYWNrZXQgdHJhbnNtaXNzaW9uIGFuZCBQYWNrZXQgcmVjZXB0aW9uICovCitzdGF0aWMgaW50IG5ldHdhdmVfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldHdhdmVfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbnRlcnJ1cHQgcm91dGluZXMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG5ldHdhdmVfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIFN0YXRpc3RpY3MgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBpbnQgbmV0d2F2ZV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICAgQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgc2tlbGV0b24gZGV2aWNlLiAgRWFjaCBhY3R1YWwKKyAgIFBDTUNJQSBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQKKyAgIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKworICAgWW91IG1heSBub3Qgd2FudCB0byB1c2UgYSBsaW5rZWQgbGlzdCBmb3IgdGhpcyAtLSBmb3IgZXhhbXBsZSwgdGhlCisgICBtZW1vcnkgY2FyZCBkcml2ZXIgdXNlcyBhbiBhcnJheSBvZiBkZXZfbGlua190IHBvaW50ZXJzLCB3aGVyZSBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IGluZGV4LgorKi8KK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyoKKyAgIEEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3IgbW9zdCB0aGluZ3MgdGhhdCBhcmUgbmVlZGVkCisgICB0byBrZWVwIHRyYWNrIG9mIGEgc29ja2V0LCBidXQgdGhlcmUgd2lsbCB1c3VhbGx5IGJlIHNvbWUgZGV2aWNlCisgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGFsc28gbmVlZHMgdG8gYmUga2VwdCB0cmFjayBvZi4gIFRoZQorICAgJ3ByaXYnIHBvaW50ZXIgaW4gYSBkZXZfbGlua190IHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBwb2ludCB0bworICAgYSBkZXZpY2Utc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgbGlrZSB0aGlzLgorCisgICBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCisgICBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgorICAgZXhhbXBsZSwgZXRoZXJuZXQgY2FyZHMsIG1vZGVtcykuICBJbiBvdGhlciBjYXNlcywgdGhlcmUgbWF5IGJlCisgICBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCisgICBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CisgICBpbiBhIGxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHRoZSAnZGV2JyBmaWVsZCBvZiBhIGRldl9saW5rX3QKKyAgIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAorICAgYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBjYW4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisqLworCisjaWYgV0lSRUxFU1NfRVhUIDw9IDEyCisvKiBXaXJlbGVzcyBleHRlbnNpb25zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworLyogUGFydCBvZiBpd19oYW5kbGVyIHByb3RvdHlwZSB3ZSBuZWVkICovCitzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCit7CisJX191MTYJCWNtZDsJCS8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCisJX191MTYJCWZsYWdzOwkJLyogTW9yZSB0byBjb21lIDstKSAqLworfTsKKworLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSBKZWFuIElJCisgKiBJZiB0aGUgbmV3IHdpcmVsZXNzIGRldmljZSBwcml2YXRlIGlvY3RsIHJhbmdlIGlzIG5vdCBkZWZpbmVkLAorICogZGVmYXVsdCB0byBzdGFuZGFyZCBkZXZpY2UgcHJpdmF0ZSBpb2N0bCByYW5nZSAqLworI2lmbmRlZiBTSU9DSVdGSVJTVFBSSVYKKyNkZWZpbmUgU0lPQ0lXRklSU1RQUklWCVNJT0NERVZQUklWQVRFCisjZW5kaWYgLyogU0lPQ0lXRklSU1RQUklWICovCisKKyNlbHNlCS8qIFdJUkVMRVNTX0VYVCA8PSAxMiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZgluZXR3YXZlX2hhbmRsZXJfZGVmOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA8PSAxMiAqLworCisjZGVmaW5lIFNJT0NHSVBTTkFQCVNJT0NJV0ZJUlNUUFJJVgkrIDEJLyogU2l0ZSBTdXJ2ZXkgU25hcHNob3QgKi8KKworI2RlZmluZSBNQVhfRVNBIDEwCisKK3R5cGVkZWYgc3RydWN0IG5ldF9hZGRyIHsKKyAgICB1X2NoYXIgYWRkcjQ4WzZdOworfSBuZXRfYWRkcjsKKworc3RydWN0IHNpdGVfc3VydmV5IHsKKyAgICB1X3Nob3J0IGxlbmd0aDsKKyAgICB1X2NoYXIgIHN0cnVjdF9yZXZpc2lvbjsKKyAgICB1X2NoYXIgIHJvYW1pbmdfc3RhdGU7CisJCisgICAgdV9jaGFyICBzcF9leGlzdHNGbGFnOworICAgIHVfY2hhciAgc3BfbGlua19xdWFsaXR5OworICAgIHVfY2hhciAgc3BfbWF4X2xpbmtfcXVhbGl0eTsKKyAgICB1X2NoYXIgIGxpbmtRdWFsaXR5R29vZEZhaXJCb3VuZGFyeTsKKyAgICB1X2NoYXIgIGxpbmtRdWFsaXR5RmFpclBvb3JCb3VuZGFyeTsKKyAgICB1X2NoYXIgIHNwX3V0aWxpemF0aW9uOworICAgIHVfY2hhciAgc3BfZ29vZG5lc3M7CisgICAgdV9jaGFyICBzcF9ob3RoZWFkY291bnQ7CisgICAgdV9jaGFyICByb2FtaW5nX2NvbmRpdGlvbjsKKwkKKyAgICBuZXRfYWRkciBzcDsKKyAgICB1X2NoYXIgICBudW1BUHM7CisgICAgbmV0X2FkZHIgbmVhckJ5QWNjZXNzUG9pbnRzW01BWF9FU0FdOworfTsJCisgICAKK3R5cGVkZWYgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSB7CisgICAgZGV2X2xpbmtfdCBsaW5rOworICAgIHNwaW5sb2NrX3QJc3BpbmxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIChTTVApICovCisgICAgZGV2X25vZGVfdCBub2RlOworICAgIHVfY2hhciAgICAgX19pb21lbSAqcmFtQmFzZTsKKyAgICBpbnQgICAgICAgIHRpbWVvdXRDb3VudGVyOworICAgIGludCAgICAgICAgbGFzdEV4ZWM7CisgICAgc3RydWN0IHRpbWVyX2xpc3QgICAgICB3YXRjaGRvZzsJLyogVG8gYXZvaWQgYmxvY2tpbmcgc3RhdGUgKi8KKyAgICBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkgICAgIG5zczsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgIGl3X3N0YXRzOyAgICAvKiBXaXJlbGVzcyBzdGF0cyAqLworI2VuZGlmCit9IG5ldHdhdmVfcHJpdmF0ZTsKKworI2lmZGVmIE5FVFdBVkVfU1RBVFMKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworLyoKKyAqIFRoZSBOZXR3YXZlIGNhcmQgaXMgbGl0dGxlLWVuZGlhbiwgc28gd29uJ3Qgd29yayBmb3IgYmlnIGVuZGlhbgorICogc3lzdGVtcy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfdWludDE2KHVfY2hhciBfX2lvbWVtICpzdGFkZHIpIAoreworICAgIHJldHVybiByZWFkdyhzdGFkZHIpOyAvKiBSZXR1cm4gb25seSAxNiBiaXRzICovCit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgZ2V0X2ludDE2KHVfY2hhciBfX2lvbWVtICogc3RhZGRyKQoreworICAgIHJldHVybiByZWFkdyhzdGFkZHIpOworfQorCisvKiAKKyAqIFdhaXQgdW50aWwgdGhlIFdPQyAoV3JpdGUgT3BlcmF0aW9uIENvbXBsZXRlKSBiaXQgaW4gdGhlIAorICogQVNSIChBZGFwdGVyIFN0YXR1cyBSZWdpc3RlcikgaXMgYXNzZXJ0ZWQuIAorICogVGhpcyBzaG91bGQgaGF2ZSBhYm9ydGVkIGlmIGl0IHRha2VzIHRvbyBsb25nIHRpbWUuIAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9XT0ModW5zaWduZWQgaW50IGlvYmFzZSkKK3sKKyAgICAvKiBTcGluIGxvY2sgKi8KKyAgICB3aGlsZSAoKGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpICYgMHg4KSAhPSAweDgpIDsgCit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKK3N0YXRpYyB2b2lkIG5ldHdhdmVfc25hcHNob3QobmV0d2F2ZV9wcml2YXRlICpwcml2LCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSwgCisJCQkgICAgIGtpb19hZGRyX3QgaW9iYXNlKSB7CisgICAgdV9zaG9ydCByZXN1bHRCdWZmZXI7CisKKyAgICAvKiBpZiB0aW1lIHNpbmNlIGxhc3Qgc25hcHNob3QgaXMgPiAxIHNlYy4gKDEwMCBqaWZmaWVzPykgIHRoZW4gdGFrZSAKKyAgICAgKiBuZXcgc25hcHNob3QsIGVsc2UgcmV0dXJuIGNhY2hlZCBkYXRhLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCByYXRlLiAgCisgICAgICovCisgICAgaWYgKCBqaWZmaWVzIC0gcHJpdi0+bGFzdEV4ZWMgPiAxMDApIHsgCisJLyogVGFrZSBzaXRlIHN1cnZleSAgc25hcHNob3QgKi8gCisJLypwcmludGsoIEtFUk5fREVCVUcgIlRha2luZyBuZXcgc25hcHNob3QuICVsZFxuIiwgamlmZmllcyAtCisJICBwcml2LT5sYXN0RXhlYyk7ICovCisJd2FpdF9XT0MoaW9iYXNlKTsgCisJd3JpdGViKE5FVFdBVkVfQ01EX1NTUywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOyAKKwl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7IAorCXdhaXRfV09DKGlvYmFzZSk7IAorCisJLyogR2V0IHJlc3VsdCBhbmQgY29weSB0byBjYWNoICovIAorCXJlc3VsdEJ1ZmZlciA9IHJlYWR3KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ1JCUCk7IAorCWNvcHlfZnJvbV9wYyggJnByaXYtPm5zcywgcmFtQmFzZStyZXN1bHRCdWZmZXIsIAorCQkgICAgICBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSk7IAorICAgIH0gCit9CisjZW5kaWYKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzIChkZXYpCisgKgorICogICAgV2lyZWxlc3MgZXh0ZW5zaW9ucyBzdGF0aXN0aWNzCisgKgorICovCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKm5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CQorICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzOworCQorICAgIHdzdGF0cyA9ICZwcml2LT5pd19zdGF0czsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCQorICAgIG5ldHdhdmVfc25hcHNob3QoIHByaXYsIHJhbUJhc2UsIGlvYmFzZSk7CisKKyAgICB3c3RhdHMtPnN0YXR1cyA9IHByaXYtPm5zcy5yb2FtaW5nX3N0YXRlOworICAgIHdzdGF0cy0+cXVhbC5xdWFsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSk7IAorICAgIHdzdGF0cy0+cXVhbC5sZXZlbCA9IHJlYWRiKCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0lTUExRKTsKKyAgICB3c3RhdHMtPnF1YWwubm9pc2UgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpICYgMHgzZjsKKyAgICB3c3RhdHMtPmRpc2NhcmQubndpZCA9IDBMOworICAgIHdzdGF0cy0+ZGlzY2FyZC5jb2RlID0gMEw7CisgICAgd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSAwTDsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisgICAgcmV0dXJuICZwcml2LT5pd19zdGF0czsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9hdHRhY2ggKHZvaWQpCisgKgorICogICAgIENyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEgCisgKiAgICAgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIENhcmQgCisgKiAgICAgU2VydmljZXMuCisgKgorICogICAgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICogICAgIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiAgICAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICpuZXR3YXZlX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXY7CisgICAgaW50IHJldDsKKyAgICAKKyAgICBERUJVRygwLCAibmV0d2F2ZV9hdHRhY2goKVxuIik7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobmV0d2F2ZV9wcml2YXRlKSk7CisgICAgaWYgKCFkZXYpCisJcmV0dXJuIE5VTEw7CisgICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZwcml2LT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKyAgICAvKiBsaW5rLT5pby5OdW1Qb3J0czIgPSAxNjsgCisgICAgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7ICovCisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSA1OworICAgIAorICAgIC8qIEludGVycnVwdCBzZXR1cCAqLworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZuZXR3YXZlX2ludGVycnVwdDsKKyAgICAKKyAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKyAgICAvKiBOZXR3YXZlIHByaXZhdGUgc3RydWN0IGluaXQuIGxpbmsvZGV2L25vZGUgYWxyZWFkeSB0YWtlbiBjYXJlIG9mLAorICAgICAqIG90aGVyIHN0dWZmIHplcm8nZCAtIEplYW4gSUkgKi8KKyAgICBzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3BpbmxvY2spOworCisgICAgLyogTmV0d2F2ZSBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJm5ldHdhdmVfc3RhcnRfeG1pdDsKKyAgICBkZXYtPmdldF9zdGF0cyAgPSAmbmV0d2F2ZV9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworICAgIC8qIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgICBkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0czsKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJm5ldHdhdmVfaGFuZGxlcl9kZWY7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyAgICBkZXYtPmRvX2lvY3RsID0gJm5ldHdhdmVfaW9jdGw7CisKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSAmbmV0d2F2ZV93YXRjaGRvZzsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworICAgIGRldi0+b3BlbiA9ICZuZXR3YXZlX29wZW47CisgICAgZGV2LT5zdG9wID0gJm5ldHdhdmVfY2xvc2U7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIAorICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbmV0d2F2ZV9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCW5ldHdhdmVfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiBuZXR3YXZlX2F0dGFjaCAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9kZXRhY2ggKGxpbmspCisgKgorICogICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAqICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICogICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAqICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygwLCAibmV0d2F2ZV9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAKKyAgICAvKgorCSAgSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgY29uZmlndXJlZCBhbmQgYWN0aXZlLCB3ZSB3b24ndAorCSAgYWN0dWFsbHkgZGVsZXRlIGl0IHlldC4gIEluc3RlYWQsIGl0IGlzIG1hcmtlZCBzbyB0aGF0IHdoZW4KKwkgIHRoZSByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorCSAgZGV0YWNoKCkuCisJKi8KKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCW5ldHdhdmVfcmVsZWFzZShsaW5rKTsKKwkKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKyAgICAgIHsKKwlERUJVRygxLCAibmV0d2F2ZV9jczogZGV0YWNoIGZhaWwsICclcycgbm90IGluIGxpc3RcbiIsCisJICAgICAgbGluay0+ZGV2LT5kZXZfbmFtZSk7CisJcmV0dXJuOworICAgICAgfQorCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBpZiAobGluay0+ZGV2KSAKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgCit9IC8qIG5ldHdhdmVfZGV0YWNoICovCisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHByb3RvY29sIG5hbWUKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cmNweSh3cnF1LT5uYW1lLCAiTmV0d2F2ZSIpOworCXJldHVybiAwOworfQorCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBOZXR3b3JrIElECisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9zZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJaWYoIXdycXUtPm53aWQuZGlzYWJsZWQpIHsKKwkgICAgZG9tYWluID0gd3JxdS0+bndpZC52YWx1ZTsKKyNlbHNlCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwlpZih3cnF1LT5ud2lkLm9uKSB7CisJICAgIGRvbWFpbiA9IHdycXUtPm53aWQubndpZDsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJICAgIHByaW50ayggS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIAorCQkgICAgKGRvbWFpbiA+PiA4KSAmIDB4MDEsIGRvbWFpbiAmIDB4ZmYpOworCSAgICB3YWl0X1dPQyhpb2Jhc2UpOworCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfU01ELCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisJICAgIHdyaXRlYiggZG9tYWluICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCSAgICB3cml0ZWIoKGRvbWFpbiA+PjggKSAmIDB4MDEscmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQisyKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCX0KKworCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgTmV0d29yayBJRAorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisjaWYgV0lSRUxFU1NfRVhUID4gOAorCXdycXUtPm53aWQudmFsdWUgPSBkb21haW47CisJd3JxdS0+bndpZC5kaXNhYmxlZCA9IDA7CisJd3JxdS0+bndpZC5maXhlZCA9IDE7CisjZWxzZQkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJd3JxdS0+bndpZC5ud2lkID0gZG9tYWluOworCXdycXUtPm53aWQub24gPSAxOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCXJldHVybiAwOworfQorCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzY3JhbWJsZSBrZXkKKyAqLworc3RhdGljIGludCBuZXR3YXZlX3NldF9zY3JhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCQljaGFyICprZXkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisJc2NyYW1ibGVfa2V5ID0gKGtleVswXSA8PCA4KSB8IGtleVsxXTsKKwl3YWl0X1dPQyhpb2Jhc2UpOworCXdyaXRlYihORVRXQVZFX0NNRF9TU0ssIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKwl3cml0ZWIoc2NyYW1ibGVfa2V5ICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCXdyaXRlYigoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisKKwkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHNjcmFtYmxlIGtleQorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3NjcmFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJCWNoYXIgKmtleSkKK3sKKwlrZXlbMV0gPSBzY3JhbWJsZV9rZXkgJiAweGZmOworCWtleVswXSA9IChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZjsKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKKwl3cnF1LT5lbmNvZGluZy5sZW5ndGggPSAyOworI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCXdycXUtPmVuY29kaW5nLm1ldGhvZCA9IDE7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlpZihkb21haW4gJiAweDEwMCkKKwkJd3JxdS0+bW9kZSA9IElXX01PREVfSU5GUkE7CisJZWxzZQorCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BREhPQzsKKworCXJldHVybiAwOworfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcmFuZ2UgaW5mbworICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisKKwkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMAorCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsJLyogTm90aGluZyBmb3IgdXMgaW4gdjEwIGFuZCB2MTEgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLworCQkgICAKKwkvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdCAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gNDUwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4MDFGRjsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisJCSAgIAorCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAyNTU7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMjU1OworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CisJCSAgIAorI2lmIFdJUkVMRVNTX0VYVCA+IDcKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDI7CQkvKiAxNiBiaXRzIHNjcmFtYmxpbmcgKi8KKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgc25hcHNob3QKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9zbmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIFRha2Ugc25hcHNob3Qgb2YgZW52aXJvbm1lbnQgKi8KKwluZXR3YXZlX3NuYXBzaG90KCBwcml2LCByYW1CYXNlLCBpb2Jhc2UpOworCXdycXUtPmRhdGEubGVuZ3RoID0gcHJpdi0+bnNzLmxlbmd0aDsKKwltZW1jcHkoZXh0cmEsICh1X2NoYXIgKikgJnByaXYtPm5zcywgc2l6ZW9mKCBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpKTsKKworCXByaXYtPmxhc3RFeGVjID0gamlmZmllczsKKworCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqICAgICBUaGlzIGlzIHRoZSBzdHVmZiB0aGF0IGFyZSB0cmVhdGVkIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zIChpd2NvbmZpZykKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBuZXR3YXZlX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IFNJT0NHSVBTTkFQLCAwLCAKKyAgICBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IHNpemVvZihzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpLCAKKyAgICAiZ2V0c2l0ZXN1cnZleSIgfSwKK307CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJbmV0d2F2ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NTSVdOQU1FICovCisJbmV0d2F2ZV9nZXRfbmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCisJbmV0d2F2ZV9zZXRfbndpZCwJCS8qIFNJT0NTSVdOV0lEICovCisJbmV0d2F2ZV9nZXRfbndpZCwJCS8qIFNJT0NHSVdOV0lEICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSRVEgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJFUSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdNT0RFICovCisJbmV0d2F2ZV9nZXRfbW9kZSwJCS8qIFNJT0NHSVdNT0RFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLworCW5ldHdhdmVfZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTUFkgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1BZICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV05JQ0tOICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV05JQ0tOICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSQVRFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkFHICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JFVFJZICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1JFVFJZICovCisJbmV0d2F2ZV9zZXRfc2NyYW1ibGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJbmV0d2F2ZV9nZXRfc2NyYW1ibGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJbmV0d2F2ZV9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICovCisJbmV0d2F2ZV9nZXRfc25hcCwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDEgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJbmV0d2F2ZV9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihuZXR3YXZlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfaGFuZGxlciwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBuZXR3YXZlX3ByaXZhdGVfYXJncywKK307CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICAgUGVyZm9ybSBpb2N0bCA6IGNvbmZpZyAmIGluZm8gc3R1ZmYKKyAqICAgICBUaGlzIGlzIHRoZSBzdHVmZiB0aGF0IGFyZSB0cmVhdGVkIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zIChpd2NvbmZpZykKKyAqCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAvKiBpb2N0bCBkZXZpY2UgKi8KKwkJCSBzdHJ1Y3QgaWZyZXEgKnJxLAkgLyogRGF0YSBwYXNzZWQgKi8KKwkJCSBpbnQJY21kKQkgICAgIC8qIElvY3RsIG51bWJlciAqLworeworICAgIGludAkJCXJldCA9IDA7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgV0lSRUxFU1NfRVhUIDw9IDEyCisgICAgc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworI2VuZGlmCisjZW5kaWYKKwkKKyAgICBERUJVRygwLCAiJXM6IC0+bmV0d2F2ZV9pb2N0bChjbWQ9MHglWClcbiIsIGRldi0+bmFtZSwgY21kKTsKKwkKKyAgICAvKiBMb29rIHdoYXQgaXMgdGhlIHJlcXVlc3QgKi8KKyAgICBzd2l0Y2goY21kKSB7CisJLyogLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgV0lSRUxFU1NfRVhUIDw9IDEyCisgICAgY2FzZSBTSU9DR0lXTkFNRToKKwluZXR3YXZlX2dldF9uYW1lKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKKwlicmVhazsKKyAgICBjYXNlIFNJT0NTSVdOV0lEOgorCXJldCA9IG5ldHdhdmVfc2V0X253aWQoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworICAgIGNhc2UgU0lPQ0dJV05XSUQ6CisJcmV0ID0gbmV0d2F2ZV9nZXRfbndpZChkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CisJYnJlYWs7CisjaWYgV0lSRUxFU1NfRVhUID4gOAkvKiBOb3RlIDogVGhlIEFQSSBkaWQgY2hhbmdlLi4uICovCisgICAgY2FzZSBTSU9DR0lXRU5DT0RFOgorCS8qIEdldCBzY3JhbWJsZSBrZXkgKi8KKwlpZih3cnEtPnUuZW5jb2RpbmcucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwkgIHsKKwkgICAgY2hhcglrZXlbMl07CisJICAgIHJldCA9IG5ldHdhdmVfZ2V0X3NjcmFtYmxlKGRldiwgTlVMTCwgJih3cnEtPnUpLCBrZXkpOworCSAgICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmVuY29kaW5nLnBvaW50ZXIsIGtleSwgMikpCisJICAgICAgcmV0ID0gLUVGQVVMVDsKKwkgIH0KKwlicmVhazsKKyAgICBjYXNlIFNJT0NTSVdFTkNPREU6CisJLyogU2V0ICBzY3JhbWJsZSBrZXkgKi8KKwlpZih3cnEtPnUuZW5jb2RpbmcucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwkgIHsKKwkgICAgY2hhcglrZXlbMl07CisJICAgIGlmKGNvcHlfZnJvbV91c2VyKGtleSwgd3JxLT51LmVuY29kaW5nLnBvaW50ZXIsIDIpKQorCSAgICAgIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICByZXQgPSBuZXR3YXZlX3NldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwga2V5KTsKKwkgIH0KKwlicmVhazsKKyAgICBjYXNlIFNJT0NHSVdNT0RFOgorCS8qIE1vZGUgb2Ygb3BlcmF0aW9uICovCisJcmV0ID0gbmV0d2F2ZV9nZXRfbW9kZShkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CisJYnJlYWs7CisjZWxzZSAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisgICAgY2FzZSBTSU9DR0lXRU5DT0RFOgorCS8qIEdldCBzY3JhbWJsZSBrZXkgKi8KKwlyZXQgPSBuZXR3YXZlX2dldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwKKwkJCQkgICAoY2hhciAqKSAmd3JxLT51LmVuY29kaW5nLmNvZGUpOworCWJyZWFrOworICAgIGNhc2UgU0lPQ1NJV0VOQ09ERToKKwkvKiBTZXQgIHNjcmFtYmxlIGtleSAqLworCXJldCA9IG5ldHdhdmVfc2V0X3NjcmFtYmxlKGRldiwgTlVMTCwgJih3cnEtPnUpLAorCQkJCSAgIChjaGFyICopICZ3cnEtPnUuZW5jb2RpbmcuY29kZSk7CisJYnJlYWs7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworICAgY2FzZSBTSU9DR0lXUkFOR0U6CisgICAgICAgLyogQmFzaWMgY2hlY2tpbmcuLi4gKi8KKyAgICAgICBpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSB7CisgICAgICAgICAgIHN0cnVjdCBpd19yYW5nZSByYW5nZTsKKwkgICByZXQgPSBuZXR3YXZlX2dldF9yYW5nZShkZXYsIE5VTEwsICYod3JxLT51KSwgKGNoYXIgKikgJnJhbmdlKTsKKwkgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZyYW5nZSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSkpCisJICAgICAgIHJldCA9IC1FRkFVTFQ7CisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lPQ0dJV1BSSVY6CisJLyogQmFzaWMgY2hlY2tpbmcuLi4gKi8KKwlpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSB7CisJICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLworCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3MpIC8gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzWzBdKTsKKwkJCQorCSAgICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgICAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICAgKHVfY2hhciAqKSBuZXR3YXZlX3ByaXZhdGVfYXJncywKKwkJCSAgICBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3MpKSkKKwkgICAgICByZXQgPSAtRUZBVUxUOworCX0gCisJYnJlYWs7CisgICAgY2FzZSBTSU9DR0lQU05BUDoKKwlpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSB7CisJICAgIGNoYXIgYnVmZmVyW3NpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KV07CisJICAgIHJldCA9IG5ldHdhdmVfZ2V0X3NuYXAoZGV2LCBOVUxMLCAmKHdycS0+dSksIGJ1ZmZlcik7CisJICAgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgCisJCQkgICAgYnVmZmVyLAorCQkJICAgIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSkpCisJICAgICAgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIGJ1ZmZlciFcbiIpOworCQlicmVhazsKKwkgICAgICB9CisJfQorCWJyZWFrOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA8PSAxMiAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworICAgIGRlZmF1bHQ6CisJcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgfQorCQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3BjbWNpYV9jb25maWcgKGxpbmspCisgKgorICogICAgIG5ldHdhdmVfcGNtY2lhX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiAKKyAqICAgICBldmVudCBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAqICAgICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uIAorICoKKyAqLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIG5ldHdhdmVfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKSB7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgaSwgaiwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBOVUxMOworCisgICAgREVCVUcoMCwgIm5ldHdhdmVfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICAvKgorICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCisgICAgICByZWdpc3RlcnMuCisgICAgKi8KKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qCisgICAgICogIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuCisgICAgICogIElmIHlvdSB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0bworICAgICAqICBwaWNrIGFkZHJlc3NlcyAtLSBzZWUgdGhlIHNlcmlhbCBkcml2ZXIgZm9yIGFuIGV4YW1wbGUuCisgICAgICovCisgICAgZm9yIChpID0gaiA9IDB4MDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKKwlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAorICAgICAqICBhY3R1YWxseSBhc3NpZ24gYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCisgICAgICovCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworCisgICAgLyoKKyAgICAgKiAgVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKyAgICAgKiAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgICovCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworCisgICAgLyoKKyAgICAgKiAgQWxsb2NhdGUgYSAzMksgbWVtb3J5IHdpbmRvdy4gIE5vdGUgdGhhdCB0aGUgZGV2X2xpbmtfdAorICAgICAqICBzdHJ1Y3R1cmUgcHJvdmlkZXMgc3BhY2UgZm9yIG9uZSB3aW5kb3cgaGFuZGxlIC0tIGlmIHlvdXIKKyAgICAgKiAgZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICAgICAqICB0aGUgaGFuZGxlcyBpbiB5b3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGRldi0+cHJpdi4KKyAgICAgKi8KKyAgICBERUJVRygxLCAiU2V0dGluZyBtZW0gc3BlZWQgb2YgJWRcbiIsIG1lbV9zcGVlZCk7CisKKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0NNfFdJTl9FTkFCTEU7CisgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDB4ODAwMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSBtZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4MjAwMDA7IG1lbS5QYWdlID0gMDsgCisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKworICAgIC8qIFN0b3JlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29tbW9uIHdpbmRvdyBmcmFtZSAqLworICAgIHJhbUJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCAweDgwMDApOworICAgIHByaXYtPnJhbUJhc2UgPSByYW1CYXNlOworCisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KHByaXYtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgICAgbGluay0+ZGV2ID0gJnByaXYtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKworICAgIC8qIFJlc2V0IGNhcmQgYmVmb3JlIHJlYWRpbmcgcGh5c2ljYWwgYWRkcmVzcyAqLworICAgIG5ldHdhdmVfZG9yZXNldChkZXYtPmJhc2VfYWRkciwgcmFtQmFzZSk7CisKKyAgICAvKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzIGFuZCBmaWxsIGluIHRoZSBOZXR3YXZlIHJlZ2lzdGVycy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKwlkZXYtPmRldl9hZGRyW2ldID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19QQSArIGkpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldHdhdmU6IHBvcnQgJSMzbHgsIGlycSAlZCwgbWVtICVseCBpZCAiCisJICAgIiVjJWMsIGh3X2FkZHIgIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCisJICAgKHVfbG9uZykgcmFtQmFzZSwgKGludCkgcmVhZGIocmFtQmFzZStORVRXQVZFX0VSRUdfTkkpLAorCSAgIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKzEpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworCisgICAgLyogZ2V0IHJldmlzaW9uIHdvcmRzICovCisgICAgcHJpbnRrKEtFUk5fREVCVUcgIk5ldHdhdmVfcmVzZXQ6IHJldmlzaW9uICUwNHggJTA0eFxuIiwgCisJICAgZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FSVyksCisJICAgZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FSVysyKSk7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgbmV0d2F2ZV9yZWxlYXNlKGxpbmspOworfSAvKiBuZXR3YXZlX3BjbWNpYV9jb25maWcgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfcmVsZWFzZSAoYXJnKQorICoKKyAqICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBuZXR3YXZlX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICogICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworICAgIGlmIChsaW5rLT53aW4pIHsKKwlpb3VubWFwKHByaXYtPnJhbUJhc2UpOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIH0KKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2V2ZW50IChldmVudCwgcHJpb3JpdHksIGFyZ3MpCisgKgorICogICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgKiAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICogICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAqICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisgKgorICogICAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEgZmxhZworICogICAgdG8gYmxvY2sgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoaXMgZGV2aWNlLiAgQWxsIHRoZSBmdW5jdGlvbnMgdGhhdAorICogICAgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUKKyAqICAgIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgKgorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJCisgICAgREVCVUcoMSwgIm5ldHdhdmVfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEU6CisJREVCVUcoMCwgIm5ldHdhdmVfY3M6IHJlZ2lzdHJhdGlvbiBjb21wbGV0ZVxuIik7CisJYnJlYWs7CisKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIG5ldHdhdmVfcmVsZWFzZShsaW5rKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwluZXR3YXZlX3BjbWNpYV9jb25maWcoIGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJbmV0d2F2ZV9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBuZXR3YXZlX2V2ZW50ICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2RvcmVzZXQgKGlvQmFzZSwgcmFtQmFzZSkKKyAqCisgKiAgICBQcm9wZXIgaGFyZHdhcmUgcmVzZXQgb2YgdGhlIGNhcmQuCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZG9yZXNldChraW9fYWRkcl90IGlvQmFzZSwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UpCit7CisgICAgLyogUmVzZXQgY2FyZCAqLworICAgIHdhaXRfV09DKGlvQmFzZSk7CisgICAgb3V0YigweDgwLCBpb0Jhc2UgKyBORVRXQVZFX1JFR19QTVIpOworICAgIHdyaXRlYigweDA4LCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FTQ0MpOyAvKiBCaXQgMyBpcyBXT0MgKi8KKyAgICBvdXRiKDB4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsgLyogcmVsZWFzZSByZXNldCAqLworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9yZXNldCAoZGV2KQorICoKKyAqICAgIFJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgbmV0d2F2ZSByZWdpc3RlcnMgCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIC8qIHVfY2hhciBzdGF0ZTsgKi8KKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMCwgIm5ldHdhdmVfcmVzZXQ6IERvbmUgd2l0aCBoYXJkd2FyZSByZXNldFxuIik7CisKKyAgICBwcml2LT50aW1lb3V0Q291bnRlciA9IDA7CisKKyAgICAvKiBSZXNldCBjYXJkICovCisgICAgbmV0d2F2ZV9kb3Jlc2V0KGlvYmFzZSwgcmFtQmFzZSk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfcmVzZXQ6IERvbmUgd2l0aCBoYXJkd2FyZSByZXNldFxuIik7CisJCisgICAgLyogV3JpdGUgYSBOT1AgdG8gY2hlY2sgdGhlIGNhcmQgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9OT1AsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJCisgICAgLyogU2V0IHJlY2VpdmUgY29uZiAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihyeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0LCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIAorICAgIC8qIFNldCB0cmFuc21pdCBjb25mICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1RDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKHR4Q29uZlR4RW5hLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIAorICAgIC8qIE5vdyBzZXQgdGhlIE1VIERvbWFpbiAqLworICAgIHByaW50ayhLRVJOX0RFQlVHICJTZXR0aW5nIGRvbWFpbiB0byAweCV4JTAyeFxuIiwgKGRvbWFpbiA+PiA4KSAmIDB4MDEsIGRvbWFpbiAmIDB4ZmYpOworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NNRCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihkb21haW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKChkb21haW4+PjgpICYgMHgwMSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKwkKKyAgICAvKiBTZXQgc2NyYW1ibGUga2V5ICovCisgICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgc2NyYW1ibGUga2V5IHRvIDB4JXhcbiIsIHNjcmFtYmxlX2tleSk7CisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCisgICAgLyogRW5hYmxlIGludGVycnVwdHMsIGJpdCA0IGhpZ2ggdG8ga2VlcCB1bnVzZWQKKyAgICAgKiBzb3VyY2UgZnJvbSBpbnRlcnJ1cHRpbmcgdXMsIGJpdCAyIGhpZ2ggdG8gCisgICAgICogc2V0IGludGVycnVwdCBlbmFibGUsIDU2NyB0byBlbmFibGUgVHhETiwgCisgICAgICogUnhFcnIgYW5kIFJ4UmR5CisgICAgICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICBvdXRiKGltckNvbmZJRU5BK2ltckNvbmZSRlUxLCBpb2Jhc2UgKyBORVRXQVZFX1JFR19JTVIpOworCisgICAgLyogSGVudCA0IGJ5dGVzIGZyYSAweDE3MC4gU2thbCB2YWVyZSAwYSwyOSw4OCwzNgorICAgICAqIHdhaXRXT0MKKyAgICAgKiBza3JpdiA4MCB0aWwgZDAwMDozNjg4CisgICAgICogc2pla2sgb20gZGV0IGJsZSA4MAorICAgICAqLworICAgIAorICAgIC8qIEVuYWJsZSBSZWNlaXZlciAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VSLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCQorICAgIC8qIFNldCB0aGUgSUVOQSBiaXQgaW4gQ09SICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICBvdXRiKGNvckNvbmZJRU5BICsgY29yQ29uZkxWTFJFUSwgaW9iYXNlICsgTkVUV0FWRV9SRUdfQ09SKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfaHdfeG1pdCAoZGF0YSwgbGVuLCBkZXYpICAgIAorICovCitzdGF0aWMgaW50IG5ldHdhdmVfaHdfeG1pdCh1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgbGVuLAorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldikgeworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdW5zaWduZWQgaW50IFR4RnJlZUxpc3QsCisJICAgICAgICAgY3VyQnVmZiwKKwkgICAgICAgICBNYXhEYXRhLCAKKyAgICAgICAgICAgICAgICAgRGF0YU9mZnNldDsKKyAgICBpbnQgdG1wY291bnQ7IAorCQorICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIF9faW9tZW0gKiByYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICBpZiAoKGluYihpb2Jhc2UrTkVUV0FWRV9SRUdfQVNSKSAmIE5FVFdBVkVfQVNSX1RYQkEpID09IDApIHsKKwkvKiBObyBidWZmZXJzIGF2YWlsYWJsZSAqLworCXByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX2h3X3htaXQ6ICVzIC0gbm8geG1pdCBidWZmZXJzIGF2YWlsYWJsZS5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBwcml2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKyAgICBERUJVRygzLCAiVHJhbnNtaXR0aW5nIHdpdGggU1BDUSAleCBTUFUgJXggTElGICV4IElTUExRICV4XG4iLAorCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKKwkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSwKKwkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTElGKSwKKwkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpKTsKKworICAgIC8qIE5vdyB0cnkgdG8gaW5zZXJ0IGl0IGludG8gdGhlIGFkYXB0ZXJzIGZyZWUgbWVtb3J5ICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICBUeEZyZWVMaXN0ID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1REUCk7CisgICAgTWF4RGF0YSAgICA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFArMik7CisgICAgRGF0YU9mZnNldCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFArNCk7CisJCisgICAgREVCVUcoMywgIlR4RnJlZUxpc3QgJXgsIE1heERhdGEgJXgsIERhdGFPZmZzZXQgJXhcbiIsCisJICBUeEZyZWVMaXN0LCBNYXhEYXRhLCBEYXRhT2Zmc2V0KTsKKworICAgIC8qIENvcHkgcGFja2V0IHRvIHRoZSBhZGFwdGVyIGZyYWdtZW50IGJ1ZmZlcnMgKi8KKyAgICBjdXJCdWZmID0gVHhGcmVlTGlzdDsgCisgICAgdG1wY291bnQgPSAwOyAKKyAgICB3aGlsZSAodG1wY291bnQgPCBsZW4pIHsKKwlpbnQgdG1wbGVuID0gbGVuIC0gdG1wY291bnQ7IAorCWNvcHlfdG9fcGMocmFtQmFzZSArIGN1ckJ1ZmYgKyBEYXRhT2Zmc2V0LCBkYXRhICsgdG1wY291bnQsIAorCQkgICAodG1wbGVuIDwgTWF4RGF0YSkgPyB0bXBsZW4gOiBNYXhEYXRhKTsKKwl0bXBjb3VudCArPSBNYXhEYXRhOworCQkJCisJLyogQWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLworCWN1ckJ1ZmYgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmKTsKKyAgICB9CisgICAgCisgICAgLyogTm93IGlzc3VlIHRyYW5zbWl0IGxpc3QgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9UTCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihsZW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKChsZW4+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0d2F2ZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwkvKiBUaGlzIGZsYWcgaW5kaWNhdGUgdGhhdCB0aGUgaGFyZHdhcmUgY2FuJ3QgcGVyZm9ybSBhIHRyYW5zbWlzc2lvbi4KKwkgKiBUaGVvcml0aWNhbGx5LCBORVQzIGNoZWNrIGl0IGJlZm9yZSBzZW5kaW5nIGEgcGFja2V0IHRvIHRoZSBkcml2ZXIsCisJICogYnV0IGluIGZhY3QgaXQgbmV2ZXIgZG8gdGhhdCBhbmQgcG9vbCBjb250aW51b3VzbHkuCisJICogQXMgdGhlIHdhdGNoZG9nIHdpbGwgYWJvcnQgdG9vIGxvbmcgdHJhbnNtaXNzaW9ucywgd2UgYXJlIHF1aXRlIHNhZmUuLi4KKwkgKi8KKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHsKKwlzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwl1bnNpZ25lZCBjaGFyKiBidWYgPSBza2ItPmRhdGE7CisJCisJaWYgKG5ldHdhdmVfaHdfeG1pdCggYnVmLCBsZW5ndGgsIGRldikgPT0gMSkgeworCSAgICAvKiBTb21lIGVycm9yLCBsZXQncyBtYWtlIHRoZW0gY2FsbCB1cyBhbm90aGVyIHRpbWU/ICovCisJICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIH0KKyAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9IC8qIG5ldHdhdmVfc3RhcnRfeG1pdCAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgTmV0d2F2ZSBjYXJkLiBUaGlzCisgKiAgICByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKKyAqCSAgMS4gQSBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKgkgIDIuIEEgcGFja2V0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB0cmFuc2ZlcnJlZCBhbmQgdGhlIHVuaXQgaXMKKyAqCSAgICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCisgKgkgIDMuIEEgY29tbWFuZCBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KKyAqLworc3RhdGljIGlycXJldHVybl90IG5ldHdhdmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAga2lvX2FkZHJfdCBpb2Jhc2U7CisgICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2U7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKyAgICBzdHJ1Y3QgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJnByaXYtPmxpbms7CisgICAgaW50IGk7CisgICAgCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCXJldHVybiBJUlFfTk9ORTsKKyAgICAKKyAgICBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICByYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKwkKKyAgICAvKiBOb3cgZmluZCB3aGF0IGNhdXNlZCB0aGUgaW50ZXJydXB0LCBjaGVjayB3aGlsZSBpbnRlcnJ1cHRzIHJlYWR5ICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwl1X2NoYXIgc3RhdHVzOworCQkKKwl3YWl0X1dPQyhpb2Jhc2UpOwkKKwlpZiAoIShpbmIoaW9iYXNlK05FVFdBVkVfUkVHX0NDU1IpICYgMHgwMikpCisJICAgIGJyZWFrOyAvKiBOb25lIG9mIHRoZSBpbnRlcnJ1cHQgc291cmNlcyBhc3NlcnRlZCAobm9ybWFsIGV4aXQpICovCisJCisgICAgICAgIHN0YXR1cyA9IGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpOworCQkKKwlpZiAoIURFVl9PSyhsaW5rKSkgeworCSAgICBERUJVRygxLCAibmV0d2F2ZV9pbnRlcnJ1cHQ6IEludGVycnVwdCB3aXRoIHN0YXR1cyAweCV4ICIKKwkJICAiZnJvbSByZW1vdmVkIG9yIHN1c3BlbmRlZCBjYXJkIVxuIiwgc3RhdHVzKTsKKwkgICAgYnJlYWs7CisJfQorCQkKKwkvKiBSeFJkeSAqLworCWlmIChzdGF0dXMgJiAweDgwKSB7CisJICAgIG5ldHdhdmVfcngoZGV2KTsKKwkgICAgLyogd2FpdF9XT0MoaW9iYXNlKTsgKi8KKwkgICAgLyogUnhSZHkgY2Fubm90IGJlIHJlc2V0IGRpcmVjdGx5IGJ5IHRoZSBob3N0ICovCisJfQorCS8qIFJ4RXJyICovCisJaWYgKHN0YXR1cyAmIDB4NDApIHsKKwkgICAgdV9jaGFyIHJzZXI7CisJCQkKKwkgICAgcnNlciA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUik7CQkJCisJICAgIAorCSAgICBpZiAocnNlciAmIDB4MDQpIHsKKwkJKytwcml2LT5zdGF0cy5yeF9kcm9wcGVkOyAKKwkJKytwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzOworCSAgICB9CisJICAgIGlmIChyc2VyICYgMHgwMikKKwkJKytwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CisJCQkKKwkgICAgLyogQ2xlYXIgdGhlIFJ4RXJyIGJpdCBpbiBSU0VSLiBSU0VSKzQgaXMgdGhlCisJICAgICAqIHdyaXRlIHBhcnQuIEFsc28gY2xlYXIgdGhlIFJ4Q1JDICgweDA0KSBhbmQgCisJICAgICAqIFJ4QmlnICgweDAyKSBiaXRzIGlmIHByZXNlbnQgKi8KKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKDB4NDAgfCAocnNlciAmIDB4MDYpLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIgKyA0KTsKKworCSAgICAvKiBXcml0ZSBiaXQgNiBoaWdoIHRvIEFTQ0MgdG8gY2xlYXIgUnhFcnIgaW4gQVNSLAorCSAgICAgKiBXT0MgbXVzdCBiZSBzZXQgZmlyc3QhIAorCSAgICAgKi8KKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKDB4NDAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVNDQyk7CisKKwkgICAgLyogUmVtZW1iZXIgdG8gY291bnQgdXAgcHJpdi0+c3RhdHMgb24gZXJyb3IgcGFja2V0cyAqLworCSAgICArK3ByaXYtPnN0YXRzLnJ4X2Vycm9yczsKKwl9CisJLyogVHhETiAqLworCWlmIChzdGF0dXMgJiAweDIwKSB7CisJICAgIGludCB0eFN0YXR1czsKKworCSAgICB0eFN0YXR1cyA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUik7CisJICAgIERFQlVHKDMsICJUcmFuc21pdCBkb25lLiBUU0VSID0gJXggaWQgJXhcbiIsIAorCQkgIHR4U3RhdHVzLCByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIgKyAxKSk7CisJICAgIAorCSAgICBpZiAodHhTdGF0dXMgJiAweDIwKSB7CisJCS8qIFRyYW5zbWl0dGluZyB3YXMgb2theSwgY2xlYXIgYml0cyAqLworCQl3YWl0X1dPQyhpb2Jhc2UpOworCQl3cml0ZWIoMHgyZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSICsgNCk7CisJCSsrcHJpdi0+c3RhdHMudHhfcGFja2V0czsKKwkgICAgfQorCQkJCisJICAgIGlmICh0eFN0YXR1cyAmIDB4ZDApIHsKKwkJaWYgKHR4U3RhdHVzICYgMHg4MCkgeworCQkgICAgKytwcml2LT5zdGF0cy5jb2xsaXNpb25zOyAvKiBCZWNhdXNlIG9mIC9wcm9jL25ldC9kZXYqLworCQkgICAgLyogKytwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsgKi8KKwkJICAgIC8qIHByaW50aygiQ29sbGlzaW9uLiAlbGRcbiIsIGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0KTsgKi8KKwkJfQorCQlpZiAodHhTdGF0dXMgJiAweDQwKSAKKwkJICAgICsrcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnM7CisJCS8qIDB4ODAgVHhHVSBUcmFuc21pdCBnaXZldXAgLSBuaW5lIHRpbWVzIGFuZCBubyBsdWNrCisJCSAqIDB4NDAgVHhOT0FQIE5vIGFjY2VzcyBwb2ludC4gRGlzY2FyZGVkIHBhY2tldC4KKwkJICogMHgxMCBUeEVyciBUcmFuc21pdCBlcnJvci4gQWx3YXlzIHNldCB3aGVuIAorCQkgKiAgICAgIFR4R1UgYW5kIFR4Tk9BUCBpcyBzZXQuIChUaG9zZSBhcmUgdGhlIG9ubHkgb25lcworCQkgKiAgICAgIHRvIHNldCBUeEVycikuCisJCSAqLworCQlERUJVRygzLCAibmV0d2F2ZV9pbnRlcnJ1cHQ6IFR4RE4gd2l0aCBlcnJvciBzdGF0dXMgJXhcbiIsIAorCQkgICAgICB0eFN0YXR1cyk7CisJCQorCQkvKiBDbGVhciBvdXQgVHhHVSwgVHhOT0FQLCBUeEVyciBhbmQgVHhUcnlzICovCisJCXdhaXRfV09DKGlvYmFzZSk7CisJCXdyaXRlYigweGRmICYgdHhTdGF0dXMsIHJhbUJhc2UrTkVUV0FWRV9FUkVHX1RTRVIrNCk7CisJCSsrcHJpdi0+c3RhdHMudHhfZXJyb3JzOworCSAgICB9CisJICAgIERFQlVHKDMsICJOZXcgc3RhdHVzIGlzIFRTRVIgJXggQVNSICV4XG4iLAorCQkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiksCisJCSAgaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUikpOworCisJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJLyogVHhCQSwgdGhpcyB3b3VsZCB0cmlnZ2VyIG9uIGFsbCBlcnJvciBwYWNrZXRzIHJlY2VpdmVkICovCisJLyogaWYgKHN0YXR1cyAmIDB4MDEpIHsKKwkgICBERUJVRyg0LCAiVHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUsICV4XG4iLCBzdGF0dXMpOworCSAgIH0KKwkgICAqLworICAgIH0KKyAgICAvKiBIYW5kbGVkIGlmIHdlIGxvb3BlZCBhdCBsZWFzdCBvbmUgdGltZSAtIEplYW4gSUkgKi8KKyAgICByZXR1cm4gSVJRX1JFVFZBTChpKTsKK30gLyogbmV0d2F2ZV9pbnRlcnJ1cHQgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfd2F0Y2hkb2cgKGEpCisgKgorICogICAgV2F0Y2hkb2cgOiB3aGVuIHdlIHN0YXJ0IGEgdHJhbnNtaXNzaW9uLCB3ZSBzZXQgYSB0aW1lciBpbiB0aGUKKyAqICAgIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGUsIHRoaXMgdGltZXIgaXMgZGlzYWJsZWQuIElmCisgKiAgICBpdCBleHBpcmUsIHdlIHJlc2V0IHRoZSBjYXJkLgorICoKKyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisKKyAgICBERUJVRygxLCAiJXM6IG5ldHdhdmVfd2F0Y2hkb2c6IHdhdGNoZG9nIHRpbWVyIGV4cGlyZWRcbiIsIGRldi0+bmFtZSk7CisgICAgbmV0d2F2ZV9yZXNldChkZXYpOworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30gLyogbmV0d2F2ZV93YXRjaGRvZyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgdXBkYXRlX3N0YXRzKGRldik7CisKKyAgICBERUJVRygyLCAibmV0d2F2ZTogU1BDUSAleCBTUFUgJXggTElGICV4IElTUExRICV4IE1IUyAleCByeHR4ICV4IgorCSAgIiAleCB0eCAleCAleCAleCAleFxuIiwgCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19MSUYpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX01IUyksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHhlKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweGYpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MTgpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MTkpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MWEpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MWIpKTsKKworICAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgLy91bnNpZ25lZCBsb25nIGZsYWdzOworLyogICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7ICovCisKKyAgICAvL3NwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisvKiAgICBwcml2LT5zdGF0cy5yeF9wYWNrZXRzID0gcmVhZGIocHJpdi0+cmFtQmFzZSArIDB4MThlKTsgCisgICAgcHJpdi0+c3RhdHMudHhfcGFja2V0cyA9IHJlYWRiKHByaXYtPnJhbUJhc2UgKyAweDE4Zik7ICovCisKKyAgICAvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbmV0d2F2ZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9jaGFyIHJ4U3RhdHVzOworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCBjdXJCdWZmZXIsCisJCXJjdkxpc3Q7CisgICAgaW50IHJjdkxlbjsKKyAgICBpbnQgdG1wY291bnQgPSAwOworICAgIGludCBkYXRhQ291bnQsIGRhdGFPZmZzZXQ7CisgICAgaW50IGk7CisgICAgdV9jaGFyICpwdHI7CisJCisgICAgREVCVUcoMywgInhpbndfcng6IFJlY2VpdmluZyAuLi4gXG4iKTsKKworICAgIC8qIFJlY2VpdmUgbWF4IDEwIHBhY2tldHMgZm9yIG5vdy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCS8qIEFueSBwYWNrZXRzPyAqLworCXdhaXRfV09DKGlvYmFzZSk7CisJcnhTdGF0dXMgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIpOwkJCisJaWYgKCAhKCByeFN0YXR1cyAmIDB4ODApKSAvKiBObyBtb3JlIHBhY2tldHMgKi8KKwkgICAgYnJlYWs7CisJCQorCS8qIENoZWNrIGlmIG11bHRpY2FzdC9icm9hZGNhc3Qgb3Igb3RoZXIgKi8KKwkvKiBtdWx0aWNhc3QgPSAocnhTdGF0dXMgJiAweDIwKTsgICovCisJCQorCS8qIFRoZSByZWNlaXZlIGxpc3QgcG9pbnRlciBhbmQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOworCXJjdkxlbiAgPSBnZXRfaW50MTYoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUkRQKTsKKwlyY3ZMaXN0ID0gZ2V0X3VpbnQxNiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SRFAgKyAyKTsKKwkJCisJaWYgKHJjdkxlbiA8IDApIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfcng6IFJlY2VpdmUgcGFja2V0IHdpdGggbGVuICVkXG4iLCAKKwkJICAgcmN2TGVuKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCQkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJjdkxlbis1KTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkgICAgREVCVUcoMSwgIm5ldHdhdmVfcng6IENvdWxkIG5vdCBhbGxvY2F0ZSBhbiBza19idWZmIG9mICIKKwkJICAibGVuZ3RoICVkXG4iLCByY3ZMZW4pOworCSAgICArK3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAorCSAgICAvKiBUZWxsIHRoZSBhZGFwdGVyIHRvIHNraXAgdGhlIHBhY2tldCAqLworCSAgICB3YWl0X1dPQyhpb2Jhc2UpOworCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JQLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisJICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJc2tiX3Jlc2VydmUoIHNrYiwgMik7ICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlICovCisJc2tiX3B1dCggc2tiLCByY3ZMZW4pOworCXNrYi0+ZGV2ID0gZGV2OworCisJLyogQ29weSBwYWNrZXQgZnJhZ21lbnRzIHRvIHRoZSBza2IgZGF0YSBhcmVhICovCisJcHRyID0gKHVfY2hhciopIHNrYi0+ZGF0YTsKKwljdXJCdWZmZXIgPSByY3ZMaXN0OworCXRtcGNvdW50ID0gMDsgCisJd2hpbGUgKCB0bXBjb3VudCA8IHJjdkxlbikgeworCSAgICAvKiBHZXQgbGVuZ3RoIGFuZCBvZmZzZXQgb2YgY3VycmVudCBidWZmZXIgKi8KKwkgICAgZGF0YUNvdW50ICA9IGdldF91aW50MTYoIHJhbUJhc2UrY3VyQnVmZmVyKzIpOworCSAgICBkYXRhT2Zmc2V0ID0gZ2V0X3VpbnQxNiggcmFtQmFzZStjdXJCdWZmZXIrNCk7CisJCQorCSAgICBjb3B5X2Zyb21fcGMoIHB0ciArIHRtcGNvdW50LAorCQkJICByYW1CYXNlK2N1ckJ1ZmZlcitkYXRhT2Zmc2V0LCBkYXRhQ291bnQpOworCisJICAgIHRtcGNvdW50ICs9IGRhdGFDb3VudDsKKwkJCisJICAgIC8qIFBvaW50IHRvIG5leHQgYnVmZmVyICovCisJICAgIGN1ckJ1ZmZlciA9IGdldF91aW50MTYocmFtQmFzZSArIGN1ckJ1ZmZlcik7CisJfQorCQorCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkvKiBRdWV1ZSBwYWNrZXQgZm9yIG5ldHdvcmsgbGF5ZXIgKi8KKwluZXRpZl9yeChza2IpOworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcmN2TGVuOworCisJLyogR290IHRoZSBwYWNrZXQsIHRlbGwgdGhlIGFkYXB0ZXIgdG8gc2tpcCBpdCAqLworCXdhaXRfV09DKGlvYmFzZSk7CisJd3JpdGViKE5FVFdBVkVfQ01EX1NSUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwlERUJVRygzLCAiUGFja2V0IHJlY2VwdGlvbiBva1xuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJnByaXYtPmxpbms7CisKKyAgICBERUJVRygxLCAibmV0d2F2ZV9vcGVuOiBzdGFydGluZy5cbiIpOworICAgIAorICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgbGluay0+b3BlbisrOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICBuZXR3YXZlX3Jlc2V0KGRldik7CisJCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0d2F2ZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJnByaXYtPmxpbms7CisKKyAgICBERUJVRygxLCAibmV0d2F2ZV9jbG9zZTogZmluaXNoaW5nLlxuIik7CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBuZXR3YXZlX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIm5ldHdhdmVfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBuZXR3YXZlX2F0dGFjaCwKKwkuZGV0YWNoCQk9IG5ldHdhdmVfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9uZXR3YXZlX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmV0d2F2ZV9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmbmV0d2F2ZV9kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9uZXR3YXZlX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfbmV0d2F2ZV9jcyk7CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworICAgYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIF9faW9tZW0gKiByYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICB1X2NoYXIgIHJjdk1vZGUgPSAwOworICAgCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKHBjX2RlYnVnID4gMikgeworCXN0YXRpYyBpbnQgb2xkOworCWlmIChvbGQgIT0gZGV2LT5tY19jb3VudCkgeworCSAgICBvbGQgPSBkZXYtPm1jX2NvdW50OworCSAgICBERUJVRygwLCAiJXM6IHNldHRpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAorCQkgIGRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisJfQorICAgIH0KKyNlbmRpZgorCQorICAgIGlmIChkZXYtPm1jX2NvdW50IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCS8qIE11bHRpY2FzdCBNb2RlICovCisJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CisgICAgfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkvKiBQcm9taXNjb3VzIG1vZGUgKi8KKwlyY3ZNb2RlID0gcnhDb25mUnhFbmEgKyByeENvbmZQcm8gKyByeENvbmZBTVAgKyByeENvbmZCY2FzdDsKKyAgICB9IGVsc2UgeworCS8qIE5vcm1hbCBtb2RlICovCisJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mQmNhc3Q7CisgICAgfQorCQorICAgIC8qIHByaW50aygibmV0d2F2ZSBzZXRfbXVsdGljYXN0X2xpc3Q6IHJjdk1vZGUgdG8gJXhcbiIsIHJjdk1vZGUpOyovCisgICAgLyogTm93IHNldCByZWNlaXZlIG1vZGUgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIocmN2TW9kZSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2EzMjQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCkBAIC0wLDAgKzEsNDI0MyBAQAorLyogb3Jpbm9jby5jIC0gKGZvcm1lcmx5IGtub3duIGFzIGRsZHdkX2NzLmMgYW5kIG9yaW5vY29fY3MuYykKKyAqCisgKiBBIGRyaXZlciBmb3IgSGVybWVzIG9yIFByaXNtIDIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MKKyAqIGFkYXB0b3JzLCB3aXRoIEx1Y2VudC9BZ2VyZSwgSW50ZXJzaWwgb3IgU3ltYm9sIGZpcm13YXJlLgorICoKKyAqIEN1cnJlbnQgbWFpbnRhaW5lcnMgKGFzIG9mIDI5IFNlcHRlbWJlciAyMDAzKSBhcmU6CisgKiAJUGF2ZWwgUm9za2luIDxwcm9za2kgQVQgZ251Lm9yZz4KKyAqIGFuZAlEYXZpZCBHaWJzb24gPGhlcm1lcyBBVCBnaWJzb24uZHJvcGJlYXIuaWQuYXU+CisgKgorICogKEMpIENvcHlyaWdodCBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbiAyMDAxLTIwMDMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICoJV2l0aCBzb21lIGhlbHAgZnJvbSA6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSmVhbiBUb3VycmlsaGVzLCBIUCBMYWJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQmVuamFtaW4gSGVycmVuc2NobWlkdAorICoKKyAqIEJhc2VkIG9uIGR1bW15X2NzLmMgMS4yNyAyMDAwLzA2LzEyIDIxOjI3OjI1CisgKgorICogUG9ydGlvbnMgYmFzZWQgb24gd3ZsYW5fY3MuYyAxLjAuNiwgQ29weXJpZ2h0IEFuZHJlYXMgTmV1aGF1cyA8YW5keQorICogQVQgZmFzdGEuZmgtZG9ydG11bmQuZGU+CisgKiAgICAgIGh0dHA6Ly93d3cuc3R1ZC5maC1kb3J0bXVuZC5kZS9+YW5keS93dmxhbi8KKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgKiA8ZGFoaW5kcyBBVCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZAorICogQS4gSGluZHMgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMKKyAqIFJlc2VydmVkLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4gICovCisKKy8qCisgKiB2MC4wMSAtPiB2MC4wMiAtIDIxLzMvMjAwMSAtIEplYW4gSUkKKyAqCW8gQWxsb3cgdG8gdXNlIHJlZ3VsYXIgZXRoWCBkZXZpY2UgbmFtZSBpbnN0ZWFkIG9mIGRsZHdkWAorICoJbyBXYXJuaW5nIG9uIElCU1Mgd2l0aCBFU1NJRD1hbnkgZm9yIGZpcm13YXJlIDYuMDYKKyAqCW8gUHV0IHByb3BlciByYW5nZS50aHJvdWdocHV0IHZhbHVlcyAob3B0aW1pc3RpYykKKyAqCW8gSVdTUFkgc3VwcG9ydCAoSU9DVEwgYW5kIHN0YXQgZ2F0aGVyIGluIFJ4IHBhdGgpCisgKglvIEFsbG93IHNldHRpbmcgZnJlcXVlbmN5IGluIEFkLUhvYyBtb2RlCisgKglvIERpc2FibGUgV0VQIHNldHRpbmcgaWYgIWhhc193ZXAgdG8gd29yayBvbiBvbGQgZmlybXdhcmUKKyAqCW8gRml4IHR4cG93ZXIgcmFuZ2UKKyAqCW8gU3RhcnQgYWRkaW5nIHN1cHBvcnQgZm9yIFNhbXN1bmcvQ29tcGFxIGZpcm13YXJlCisgKgorICogdjAuMDIgLT4gdjAuMDMgLSAyMy8zLzIwMDEgLSBKZWFuIElJCisgKglvIFN0YXJ0IGFkZGluZyBTeW1ib2wgc3VwcG9ydCAtIG5lZWQgdG8gY2hlY2sgYWxsIHRoYXQKKyAqCW8gRml4IFByaXNtMi9TeW1ib2wgV0VQIHRvIGFjY2VwdCAxMjggYml0cyBrZXlzCisgKglvIEFkZCBTeW1ib2wgV0VQIChhZGQgYXV0aGVudGljYXRpb24gdHlwZSkKKyAqCW8gQWRkIFByaXNtMi9TeW1ib2wgcmF0ZQorICoJbyBBZGQgUE0gdGltZW91dCAoaG9sZG92ZXIgZHVyYXRpb24pCisgKglvIEVuYWJsZSAiaXdjb25maWcgZXRoMCBrZXkgb2ZmIiBhbmQgZnJpZW5kcyAodG9nZ2xlIGZsYWdzKQorICoJbyBFbmFibGUgIml3Y29uZmlnIGV0aDAgcG93ZXIgdW5pY2FzdC9hbGwiICh0b2dnbGUgZmxhZ3MpCisgKglvIFRyeSB3aXRoIGFuIEludGVsIGNhcmQuIEl0IHJlcG9ydCBmaXJtd2FyZSAxLjAxLCBiZWhhdmUgbGlrZQorICoJICBhbiBhbnRpcXVhdGVkIGZpcm13YXJlLCBob3dldmVyIG9uIHdpbmRvd3MgaXQgc2F5cyAyLjAwLiBZdWNrICEKKyAqCW8gV29ya2Fyb3VuZCBmaXJtd2FyZSBidWcgaW4gYWxsb2NhdGUgYnVmZmVyIChJbnRlbCAxLjAxKQorICoJbyBGaW5pc2ggZXh0ZXJuYWwgcmVuYW1pbmcgdG8gb3Jpbm9jby4uLgorICoJbyBUZXN0aW5nIHdpdGggdmFyaW91cyBXYXZlbGFuIGZpcm13YXJlcworICoKKyAqIHYwLjAzIC0+IHYwLjA0IC0gMzAvMy8yMDAxIC0gSmVhbiBJSQorICoJbyBVcGRhdGUgdG8gV2lyZWxlc3MgMTEgLT4gYWRkIHJldHJ5IGxpbWl0L2xpZmV0aW1lIHN1cHBvcnQKKyAqCW8gVGVzdGVkIHdpdGggYSBELUxpbmsgRFdMIDY1MCBjYXJkLCBmaWxsIGluIGZpcm13YXJlIHN1cHBvcnQKKyAqCW8gV2FybmluZyBvbiBWY2MgbWlzbWF0Y2ggKEQtTGluayAzLjN2IGNhcmQgaW4gTHVjZW50IDV2IG9ubHkgc2xvdCkKKyAqCW8gRml4ZWQgdGhlIFByaXNtMiBXRVAgYnVncyB0aGF0IEkgaW50cm9kdWNlZCBpbiB2MC4wMyA6LSgKKyAqCSAgSXQgd29ya3Mgb24gRC1MaW5rICpvbmx5KiBhZnRlciBhIHRjcGR1bXAuIFdlaXJkLi4uCisgKgkgIEFuZCBzdGlsbCBkb2Vzbid0IHdvcmsgb24gSW50ZWwgY2FyZC4gR3JycnIuLi4KKyAqCW8gVXBkYXRlIHRoZSBtb2RlIGFmdGVyIGEgc2V0cG9ydDMKKyAqCW8gQWRkIHByZWFtYmxlIHNldHRpbmcgZm9yIFN5bWJvbCBjYXJkcyAobm90IHlldCBlbmFibGVkKQorICoJbyBEb24ndCBjb21wbGFpbiBhcyBtdWNoIGFib3V0IFN5bWJvbCBjYXJkcy4uLgorICoKKyAqIHYwLjA0IC0+IHYwLjA0YiAtIDIyLzQvMjAwMSAtIERhdmlkIEdpYnNvbgorICogICAgICBvIFJlbW92ZWQgdGhlICdldGgnIHBhcmFtZXRlciAtIGFsd2F5cyB1c2UgZXRoWFggYXMgdGhlCisgKiAgICAgICAgaW50ZXJmYWNlIG5hbWUgaW5zdGVhZCBvZiBkbGR3ZFhYLiAgVGhlIG90aGVyIHdhcyByYWN5CisgKiAgICAgICAgYW55d2F5LgorICoJbyBDbGVhbiB1cCBSSUQgZGVmaW5pdGlvbnMgaW4gaGVybWVzLmgsIG90aGVyIGNsZWFudXBzCisgKgorICogdjAuMDRiIC0+IHYwLjA0YyAtIDI0LzQvMjAwMSAtIEplYW4gSUkKKyAqCW8gVGltIEh1cmxleSA8dGltc3RlciBBVCBzZWlraS5ibGl6dGVjaC5jb20+IHJlcG9ydGVkIGEgRC1MaW5rIGNhcmQKKyAqCSAgd2l0aCB2ZW5kb3IgMDIgYW5kIGZpcm13YXJlIDAuMDguIEFkZGVkIGluIHRoZSBjYXBhYmlsaXRpZXMuLi4KKyAqCW8gVGVzdGVkIEx1Y2VudCBmaXJtd2FyZSA3LjI4LCBldmVyeXRoaW5nIHdvcmtzLi4uCisgKgorICogdjAuMDRjIC0+IHYwLjA1IC0gMy81LzIwMDEgLSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0CisgKglvIFNwaW4tb2ZmIFBjbWNpYSBjb2RlLiBUaGlzIGZpbGUgaXMgcmVuYW1lZCBvcmlub2NvLmMsCisgKgkgIGFuZCBvcmlub2NvX2NzLmMgbm93IGNvbnRhaW5zIG9ubHkgdGhlIFBjbWNpYSBzcGVjaWZpYyBzdHVmZgorICoJbyBBZGQgQWlycG9ydCBkcml2ZXIgc3VwcG9ydCBvbiB0b3Agb2Ygb3Jpbm9jby5jIChzZWUgYWlycG9ydC5jKQorICoKKyAqIHYwLjA1IC0+IHYwLjA1YSAtIDQvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBSZXZlcnQgdG8gb2xkIFBjbWNpYSBjb2RlIHRvIGZpeCBicmVha2FnZSBvZiBCZW4ncyBjaGFuZ2VzLi4uCisgKgorICogdjAuMDVhIC0+IHYwLjA1YiAtIDQvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBhZGQgbW9kdWxlIHBhcmFtZXRlciAnaWdub3JlX2Npc192Y2MnIGZvciBELUxpbmsgQCA1VgorICoJbyBELUxpbmsgZmlybXdhcmUgZG9lc24ndCBzdXBwb3J0IG11bHRpY2FzdC4gV2UganVzdCBwcmludCBhIGZldworICoJICBlcnJvciBtZXNzYWdlcywgYnV0IG90aGVyd2lzZSBldmVyeXRoaW5nIHdvcmtzLi4uCisgKglvIEZvciBEYXZpZCA6IHNldC9nZXRwb3J0MyB3b3JrcyBmaW5lLCBqdXN0IHVwZ3JhZGUgaXdwcml2Li4uCisgKgorICogdjAuMDViIC0+IHYwLjA1YyAtIDUvNS8yMDAxIC0gQmVuamFtaW4gSGVycmVuc2NobWlkdAorICoJbyBBZGFwdCBhaXJwb3J0LmMgdG8gbGF0ZXN0IGNoYW5nZXMgaW4gb3Jpbm9jby5jCisgKglvIFJlbW92ZSBkZWZlcnJlZCBwb3dlciBlbmFibGluZyBjb2RlCisgKgorICogdjAuMDVjIC0+IHYwLjA1ZCAtIDUvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBXb3JrYXJvdW5kIHRvIFNOQVAgZGVjYXBzdWxhdGUgZnJhbWUgZnJvbSBMaW5rc3lzIEFQCisgKgkgIG9yaWdpbmFsIHBhdGNoIGZyb20gOiBEb25nIExpdSA8ZGxpdSBBVCByZXNlYXJjaC5iZWxsLWxhYnMuY29tPgorICoJICAobm90ZSA6IHRoZSBtZW1jbXAgYnVnIHdhcyBtaW5lIC0gZml4ZWQpCisgKglvIFJlbW92ZSBzZXRfcmV0cnkgc3R1ZmYsIG5vIGZpcm13YXJlIHN1cHBvcnQgaXQgKGJsb2F0LS0pLgorICoKKyAqIHYwLjA1ZCAtPiB2MC4wNiAtIDI1LzUvMjAwMSAtIEplYW4gSUkKKyAqCQlPcmlnaW5hbCBwYXRjaCBmcm9tICJIb25nIExpbiIgPGFsaW4gQVQgcmVkaGF0LmNvbT4sCisgKgkJIklhbiBLaW5uZXIiIDxpa2lubmVyIEFUIHJlZGhhdC5jb20+CisgKgkJYW5kICJEYXZpZCBTbWl0aCIgPGRzbWl0aCBBVCByZWRoYXQuY29tPgorICoJbyBJbml0IG9mIHByaXYtPnR4X3JhdGVfY3RybCBpbiBmaXJtd2FyZSBzcGVjaWZpYyBzZWN0aW9uLgorICoJbyBQcmlzbTIvU3ltYm9sIHJhdGUsIHVwdG8gc2hvdWxkIGJlIDB4RiBhbmQgbm90IDB4MTUuIERvaCAhCisgKglvIFNwZWN0cnVtIGNhcmQgYWx3YXlzIG5lZWQgY29yX3Jlc2V0IChmb3IgZXZlcnkgcmVzZXQpCisgKglvIEZpeCBjb3JfcmVzZXQgdG8gbm90IGxvc2UgYml0IDcgaW4gdGhlIHJlZ2lzdGVyCisgKglvIGZsdXNoX3N0YWxlX2xpbmtzIHRvIHJlbW92ZSB6b21iaWUgUGNtY2lhIGluc3RhbmNlcworICoJbyBBY2sgcHJldmlvdXMgaGVybWVzIGV2ZW50IGJlZm9yZSByZXNldAorICoJCU1lICh3aXRoIG15IGxpdHRsZSBoYW5kcykKKyAqCW8gQWxsb3cgb3Jpbm9jby5jIHRvIGNhbGwgY29yX3Jlc2V0IHZpYSBwcml2LT5jYXJkX3Jlc2V0X2hhbmRsZXIKKyAqCW8gQWRkIHByaXYtPm5lZWRfY2FyZF9yZXNldCB0byB0b2dnbGUgdGhpcyBmZWF0dXJlCisgKglvIEZpeCB2YXJpb3VzIGJ1Z2xldHMgd2hlbiBzZXR0aW5nIFdFUCBpbiBTeW1ib2wgZmlybXdhcmUKKyAqCSAgTm93LCBlbmNyeXB0aW9uIGlzIGZ1bGx5IGZ1bmN0aW9uYWwgb24gU3ltYm9sIGNhcmRzLiBZb3VwaSAhCisgKgorICogdjAuMDYgLT4gdjAuMDZiIC0gMjUvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBJQlNTIG9uIFN5bWJvbCB1c2UgcG9ydF9tb2RlID0gNC4gUGxlYXNlIGRvbid0IGFzay4uLgorICoKKyAqIHYwLjA2YiAtPiB2MC4wNmMgLSAyOS81LzIwMDEgLSBKZWFuIElJCisgKglvIFNob3cgZmlyc3Qgc3B5IGFkZHJlc3MgaW4gL3Byb2MvbmV0L3dpcmVsZXNzIGZvciBJQlNTIG1vZGUgYXMgd2VsbAorICoKKyAqIHYwLjA2YyAtPiB2MC4wNmQgLSA2LzcvMjAwMSAtIERhdmlkIEdpYnNvbgorICogICAgICBvIENoYW5nZSBhIGJ1bmNoIG9mIEtFUk5fSU5GTyBtZXNzYWdlcyB0byBLRVJOX0RFQlVHLCBhcyBwZXIgTGludXMnCisgKiAgICAgICAgd2lzaGVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgorICoJbyBSZW1vdmVkIGJvZ3VzIG1lc3NhZ2Ugb24gQ1JDIGVycm9yLgorICoJbyBNZXJnZWQgZml4ZXMgZm9yIHYwLjA4IFByaXNtIDIgZmlybXdhcmUgZnJvbSBXaWxsaWFtIFdhZ2hvcm4KKyAqCSAgPHdpbGx3YWdob3JuIEFUIHlhaG9vLmNvLnVrPgorICoJbyBTbGlnaHQgY2xlYW51cC9yZS1hcnJhbmdlbWVudCBvZiBmaXJtd2FyZSBkZXRlY3Rpb24gY29kZS4KKyAqCisgKiB2MC4wNmQgLT4gdjAuMDZlIC0gMS84LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVtb3ZlZCBzb21lIHJlZHVuZGFudCBnbG9iYWwgaW5pdGlhbGl6ZXJzIChvcmlub2NvX2NzLmMpLgorICoJbyBBZGRlZCBzb21lIG1vZHVsZSBtZXRhZGF0YQorICoKKyAqIHYwLjA2ZSAtPiB2MC4wNmYgLSAxNC84LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gV29yZGluZyBmaXggdG8gbGljZW5zZQorICoJbyBBZGRlZCBhICd1c2VfYWx0ZXJuYXRlX2VuY2FwcycgbW9kdWxlIHBhcmFtZXRlciBmb3IgQVBzIHdoaWNoIG5lZWQgYW4KKyAqCSAgb3VpIG9mIDAwOjAwOjAwLiAgV2UgcmVhbGx5IG5lZWQgYSBiZXR0ZXIgd2F5IG9mIGhhbmRsaW5nIHRoaXMsIGJ1dAorICoJICB0aGUgbW9kdWxlIGZsYWcgaXMgYmV0dGVyIHRoYW4gbm90aGluZyBmb3Igbm93LgorICoKKyAqIHYwLjA2ZiAtPiB2MC4wNyAtIDIwLzgvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBSZW1vdmVkIEJBUCBlcnJvciByZXRyaWVzIGZyb20gaGVybWVzX2JhcF9zZWVrKCkuICBGb3IgVHggd2Ugbm93CisgKgkgIGxldCB0aGUgdXBwZXIgbGF5ZXJzIGhhbmRsZSB0aGUgcmV0cnksIHdlIHJldHJ5IGV4cGxpY2l0bHkgaW4gdGhlCisgKgkgIFJ4IHBhdGgsIGJ1dCBkb24ndCBtYWtlIGFzIG11Y2ggbm9pc2UgYWJvdXQgaXQuCisgKglvIEZpcm13YXJlIGRldGVjdGlvbiBjbGVhbnVwcy4KKyAqCisgKiB2MC4wNyAtPiB2MC4wN2EgLSAxLzEwLzMwMDEgLSBKZWFuIElJCisgKglvIEFkZCBjb2RlIHRvIHJlYWQgU3ltYm9sIGZpcm13YXJlIHJldmlzaW9uLCBpbnNwaXJlZCBieSBsYXRlc3QgY29kZQorICoJICBpbiBTcGVjdHJ1bTI0IGJ5IExlZSBKb2huIEtleXNlci1BbGxlbiAtIFRoYW5rcyBMZWUgIQorICoJbyBUaGFua3MgdG8gSmFyZWQgVmFsZW50aW5lIDxoaWRkZW4gQVQgeG1pc3Npb24uY29tPiBmb3IgInByb3ZpZGluZyIgbWUKKyAqCSAgYSAzQ29tIGNhcmQgd2l0aCBhIHJlY2VudCBmaXJtd2FyZSwgZmlsbCBvdXQgU3ltYm9sIGZpcm13YXJlCisgKgkgIGNhcGFiaWxpdGllcyBvZiBsYXRlc3QgcmV2ICgyLjIwKSwgYXMgd2VsbCBhcyBvbGRlciBTeW1ib2wgY2FyZHMuCisgKglvIERpc2FibGUgUG93ZXIgTWFuYWdlbWVudCBpbiBuZXdlciBTeW1ib2wgZmlybXdhcmUsIHRoZSBBUEkgCisgKgkgIGhhcyBjaGFuZ2VkIChkb2N1bWVudGF0aW9uIG5lZWRlZCkuCisgKgorICogdjAuMDdhIC0+IHYwLjA4IC0gMy8xMC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIEZpeGVkIGEgcG9zc2libGUgYnVmZmVyIG92ZXJydW4gZm91bmQgYnkgdGhlIFN0YW5mb3JkIGNoZWNrZXIgKGluCisgKgkgIGRsZHdkX2lvY3RsX3NldGl3ZW5jb2RlKCkpLiAgQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QgYW55d2F5LCBzbyBub3QKKyAqCSAgYSBiaWcgcHJvYmxlbS4KKyAqCW8gVHVybmVkIGhhc19iaWdfd2VwIG9uIGZvciBJbnRlcnNpbCBjYXJkcy4gIFRoYXQncyBub3QgdHJ1ZSBmb3IgYWxsIG9mCisgKgkgIHRoZW0gYnV0IHdlIHNob3VsZCBhdCBsZWFzdCBsZXQgdGhlIGNhcGFibGUgb25lcyB0cnkuCisgKglvIFdhaXQgZm9yIEJVU1kgdG8gY2xlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBoZXJtZXNfYmFwX3NlZWsoKS4gIEkKKyAqCSAgcmVhbGl6ZWQgdGhhdCBteSBhc3N1bXB0aW9uIHRoYXQgdGhlIGRyaXZlcidzIHNlcmlhbGl6YXRpb24KKyAqCSAgd291bGQgcHJldmVudCB0aGUgQkFQIGJlaW5nIGJ1c3kgb24gZW50cnkgd2FzIHBvc3NpYmx5IGZhbHNlLCBiZWNhdXNlCisgKgkgIHRoaW5ncyBvdGhlciB0aGFuIHNlZWtzIG1heSBtYWtlIHRoZSBCQVAgYnVzeS4KKyAqCW8gVXNlICJhbHRlcm5hdGUiIChvdWkgMDA6MDA6MDApIGVuY2Fwc3VsYXRpb24gYnkgZGVmYXVsdC4KKyAqCSAgU2V0dGluZyB1c2Vfb2xkX2VuY2FwcyB3aWxsIG1pbWljIHRoZSBvbGQgYmVoYXZpb3VyLCBidXQgSSB0aGluayB3ZQorICoJICB3aWxsIGJlIGFibGUgdG8gZWxpbWluYXRlIHRoaXMuCisgKglvIERvbid0IHRyeSB0byBtYWtlIF9faW5pdGRhdGEgY29uc3QgKHRoZSB2ZXJzaW9uIHN0cmluZykuICBUaGlzIGNhbid0CisgKgkgIHdvcmsgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBfX2luaXRkYXRhIHNlY3Rpb25pbmcgd29ya3MuCisgKglvIEFkZGVkIE1PRFVMRV9MSUNFTlNFIHRhZ3MuCisgKglvIFN1cHBvcnQgZm9yIFBMWCAodHJhbnNwYXJlbnQgUENNQ0lBLT5QQ0kgYnJpZGdlKSBjYXJkcy4KKyAqCW8gQ2hhbmdlZCB0byB1c2luZyB0aGUgbmV3IHR5cGUtZmFzY2lzdCBtaW4vbWF4LgorICoKKyAqIHYwLjA4IC0+IHYwLjA4YSAtIDkvMTAvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBJbnNlcnRlZCBzb21lIG1pc3NpbmcgYWNrbm93bGVkZ2VtZW50cy9pbmZvIGludG8gdGhlIENoYW5nZWxvZy4KKyAqCW8gRml4ZWQgc29tZSBidWdzIGluIHRoZSBub3JtYWxpemF0aW9uIG9mIHNpZ25hbCBsZXZlbCByZXBvcnRpbmcuCisgKglvIEZpeGVkIGJhZCBidWcgaW4gV0VQIGtleSBoYW5kbGluZyBvbiBJbnRlcnNpbCBhbmQgU3ltYm9sIGZpcm13YXJlLAorICoJICB3aGljaCBsZWQgdG8gYW4gaW5zdGFudCBjcmFzaCBvbiBiaWctZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqIHYwLjA4YSAtPiB2MC4wOGIgLSAyMC8xMS8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIExvdHMgb2YgY2xlYW51cCBhbmQgYnVnZml4ZXMgaW4gb3Jpbm9jb19wbHguYworICoJbyBDbGVhbnVwIHRvIGhhbmRsaW5nIG9mIFR4IHJhdGUgc2V0dGluZy4KKyAqCW8gUmVtb3ZlZCBzdXBwb3J0IGZvciBvbGQgZW5jYXBzdWxhdGlvbiBtZXRob2QuCisgKglvIFJlbW92ZWQgb2xkICJkbGR3ZCIgbmFtZXMuCisgKglvIFNwbGl0IFJJRCBjb25zdGFudHMgaW50byBhIG5ldyBmaWxlIGhlcm1lc19yaWQuaAorICoJbyBSZW5hbWVkIFJJRCBjb25zdGFudHMgdG8gbWF0Y2ggbGludXgtd2xhbi1uZyBhbmQgcHJpc20yLm8KKyAqCW8gQnVnZml4ZXMgaW4gaGVybWVzLmMKKyAqCW8gUG9rZSB0aGUgUExYJ3MgSU5UQ1NSIHJlZ2lzdGVyLCBzbyBpdCBhY3R1YWxseSBzdGFydHMKKyAqCSAgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzLiAgVGhlc2UgY2FyZHMgbWlnaHQgYWN0dWFsbHkgd29yayBub3cuCisgKglvIFVwZGF0ZSB0byB3aXJlbGVzcyBleHRlbnNpb25zIHYxMiAoSmVhbiBJSSkKKyAqCW8gU3VwcG9ydCBmb3IgdGFsbGllcyBhbmQgaW5xdWlyZSBjb21tYW5kIChKZWFuIElJKQorICoJbyBBaXJwb3J0IHVwZGF0ZXMgZm9yIG5ld2VyIFBQQyBrZXJuZWxzIChCZW5IKQorICoKKyAqIHYwLjA4YiAtPiB2MC4wOSAtIDIxLzEyLzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gU29tZSBuZXcgUENJIElEcyBmb3IgUExYIGNhcmRzLgorICoJbyBSZW1vdmVkIGJyb2tlbiBhdHRlbXB0IHRvIGRvIEFMTE1VTFRJIHJlY2VwdGlvbi4gIEp1c3QgdXNlCisgKgkgIHByb21pc2N1b3VzIG1vZGUgaW5zdGVhZAorICoJbyBQcmVsaW1pbmFyeSB3b3JrIGZvciBsaXN0LUFQIChKZWFuIElJKQorICoJbyBBaXJwb3J0IHVwZGF0ZXMgZnJvbSAoQmVuSCkKKyAqCW8gRWxpbWluYXRlZCByYWN5IGh3X3JlYWR5IHN0dWZmCisgKglvIEZpeGVkIGdlbmVyYXRpb24gb2YgZmFrZSBldmVudHMgaW4gaXJxIGhhbmRsZXIuICBUaGlzIHNob3VsZAorICoJICBmaW5hbGx5IGtpbGwgdGhlIEVJTyBwcm9ibGVtcyAoSmVhbiBJSSAmIGRnaWJzb24pCisgKglvIEZpeGVkIGJyZWFrYWdlIG9mIGJpdHJhdGUgc2V0L2dldCBvbiBBZ2VyZSBmaXJtd2FyZSAoSmVhbiBJSSkKKyAqCisgKiB2MC4wOSAtPiB2MC4wOWEgLSAyLzEvMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBGaXhlZCBzdHVwaWQgbWlzdGFrZSBpbiBtdWx0aWNhc3QgbGlzdCBoYW5kbGluZywgdHJpZ2dlcmluZworICoJICBhIEJVRygpCisgKgorICogdjAuMDlhIC0+IHYwLjA5YiAtIDE2LzEvMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBGaXhlZCBldmVuIHN0dXBpZGVyIG1pc3Rha2UgaW4gbmV3IGludGVycnVwdCBoYW5kbGluZywgd2hpY2gKKyAqCSAgc2VyaW91c2x5IGJyb2tlIHRoaW5ncyBvbiBiaWctZW5kaWFuIG1hY2hpbmVzLgorICoJbyBSZW1vdmVkIGEgYnVuY2ggb2YgcmVkdW5kYW50IGluY2x1ZGVzIGFuZCBleHBvcnRzLgorICoJbyBSZW1vdmVkIGEgcmVkdW5kYW50IE1PRF97SU5DLERFQ31fVVNFX0NPVU5UIHBhaXIgaW4gYWlycG9ydC5jCisgKglvIERvbid0IGF0dGVtcHQgdG8gZG8gaGFyZHdhcmUgbGV2ZWwgbXVsdGljYXN0IHJlY2VwdGlvbiBvbgorICoJICBJbnRlcnNpbCBmaXJtd2FyZSwganVzdCBnbyBwcm9taXNjIGluc3RlYWQuCisgKglvIFR5cG8gZml4ZWQgaW4gaGVybWVzX2lzc3VlX2NtZCgpCisgKglvIEVsaW1pbmF0ZWQgV0lSRUxFU1NfU1BZICNpZmRlZnMKKyAqCW8gU3RhdHVzIGNvZGUgcmVwb3J0ZWQgb24gVHggZXhjZXB0aW9ucworICoJbyBNb3ZlZCBuZXRpZl93YWtlX3F1ZXVlKCkgZnJvbSBBTExPQyBpbnRlcnJ1cHRzIHRvIFRYIGFuZCBUWEVYQworICoJICBpbnRlcnJ1cHRzLCB3aGljaCBzaG91bGQgZml4IHRoZSB0aW1lb3V0cyB3ZSdyZSBzZWVpbmcuCisgKgorICogdjAuMDliIC0+IHYwLjEwIC0gMjUgRmViIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVtb3ZlZCBuZXN0ZWQgc3RydWN0dXJlcyB1c2VkIGZvciBoZWFkZXIgcGFyc2luZywgc28gdGhlCisgKgkgIGRyaXZlciBzaG91bGQgbm93IHdvcmsgd2l0aG91dCBoYWNrZXJ5IG9uIEFSTQorICoJbyBGaXggZm9yIFdFUCBoYW5kbGluZyBvbiBJbnRlcnNpbCAoSGF3ayBOZXd0b24pCisgKglvIEVsaW1pbmF0ZWQgdGhlIC9wcm9jL2hlcm1lcy9ldGhYWC9yZWdzIGRlYnVnZ2luZyBmaWxlLiAgSXQKKyAqCSAgd2FzIG5ldmVyIHZlcnkgdXNlZnVsLgorICoJbyBNYWtlIFJ4IGVycm9ycyBsZXNzIG5vaXN5LgorICoKKyAqIHYwLjEwIC0+IHYwLjExIC0gNSBBcHIgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBMYWlkIHRoZSBncm91bmR3b3JrIGluIGhlcm1lcy5bY2hdIGZvciBkZXZpY2VzIHdoaWNoIG1hcAorICoJICBpbnRvIFBDSSBtZW1vcnkgc3BhY2UgcmF0aGVyIHRoYW4gSU8gc3BhY2UuCisgKglvIEZpeGVkIGJ1ZyBpbiBtdWx0aWNhc3QgaGFuZGxpbmcgKGNsZWFyZWQgbXVsdGljYXN0IGxpc3Qgd2hlbgorICoJICBsZWF2aW5nIHByb21pc2N1b3VzIG1vZGUpLgorICoJbyBSZWxlZ2F0ZWQgVHggZXJyb3IgbWVzc2FnZXMgdG8gZGVidWcuCisgKglvIENsZWFuZWQgdXAgLyBjb3JyZWN0ZWQgaGFuZGxpbmcgb2YgYWxsb2NhdGlvbiBsZW5ndGhzLgorICoJbyBTZXQgT1dOU1NJRCBpbiBJQlNTIG1vZGUgZm9yIFdpblhQIGludGVyb3BlcmFiaWxpdHkgKGppbWMpLgorICoJbyBDaGFuZ2UgdG8gdXNpbmcgYWxsb2NfZXRoZXJkZXYoKSBmb3Igc3RydWN0dXJlIGFsbG9jYXRpb25zLiAKKyAqCW8gQ2hlY2sgZm9yIGFuZCBkcm9wIHVuZGVyc2l6ZWQgcGFja2V0cy4KKyAqCW8gRml4ZWQgYSByYWNlIGluIHN0b3BwaW5nL3dha2luZyB0aGUgcXVldWUuICBUaGlzIHNob3VsZCBmaXgKKyAqCSAgdGhlIHRpbWVvdXQgcHJvYmxlbXMgKFBhdmVsIFJvc2tpbikKKyAqCW8gUmV2ZXJ0ZWQgdG8gbmV0aWZfd2FrZV9xdWV1ZSgpIG9uIHRoZSBBTExPQyBldmVudC4KKyAqCW8gRml4ZXMgZm9yIHJlY2VudCBTeW1ib2wgZmlybXdhcmVzIHdoaWNoIGxhY2sgQVAgZGVuc2l0eQorICoJICAoUGF2ZWwgUm9za2luKS4KKyAqCisgKiB2MC4xMSAtPiB2MC4xMWEgLSAyOSBBcHIgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBIYW5kbGUgZGlmZmVyZW50IHJlZ2lzdGVyIHNwYWNpbmcsIG5lY2Vzc2FyeSBmb3IgUHJpc20gMi41CisgKgkgIFBDSSBhZGFwdG9ycyAoU3RldmUgSGlsbCkuCisgKglvIENsZWFuZWQgdXAgaW5pdGlhbGl6YXRpb24gb2YgY2FyZCBzdHJ1Y3R1cmVzIGluIG9yaW5vY29fY3MKKyAqCSAgYW5kIGFpcnBvcnQuICBSZW1vdmVkIGNhcmQtPnByaXYgZmllbGQuCisgKglvIE1ha2UgcmVzcG9uc2Ugc3RydWN0dXJlIG9wdGlvbmFsIGZvciBoZXJtZXNfZG9jbWRfd2FpdCgpCisgKgkgIFBhdmVsIFJvc2tpbikKKyAqCW8gQWRkZWQgUENJIGlkIGZvciBOb3J0ZWwgZW1vYmlsaXR5IHRvIG9yaW5vY29fcGx4LmMuCisgKglvIENsZWFudXAgdG8gaGFuZGxpbmcgb2YgU3ltYm9sJ3MgYWxsb2NhdGlvbiBidWcuIChQYXZlbCBSb3NraW4pCisgKglvIENsZWFudXBzIHRvIGZpcm13YXJlIGNhcGFiaWxpdHkgZGV0ZWN0aW9uLgorICoJbyBBcnJhbmdlIGZvciBvcmlub2NvX3BjaS5jIHRvIG92ZXJyaWRlIGZpcm13YXJlIGRldGVjdGlvbi4KKyAqCSAgV2Ugc2hvdWxkIGJlIGFibGUgdG8gc3VwcG9ydCB0aGUgUENJIEludGVyc2lsIGNhcmRzIG5vdy4KKyAqCW8gQ2xlYW51cCBoYW5kbGluZyBvZiByZXNldF9jb3IgYW5kIGhhcmRfcmVzZXQgKFBhdmVsIFJvc2tpbikuCisgKglvIFJlbW92ZSBlcnJvbmVvdXMgdXNlIG9mIFVTRVJfQkFQIGluIHRoZSBUeEV4YyBoYW5kbGVyIChKb3VuaQorICoJICBNYWxpbmVuKS4KKyAqCW8gTWFrZWZpbGUgY2hhbmdlcyBmb3IgYmV0dGVyIGludGVncmF0aW9uIGludG8gRGF2aWQgSGluZHMKKyAqCSAgcGNtY2lhLWNzIHBhY2thZ2UuCisgKgorICogdjAuMTFhIC0+IHYwLjExYiAtIDEgTWF5IDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gQmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiBvcmlub2NvX3BseF9pbml0X29uZSgpCisgKglvIEZpeGVkIG11bHRpcGxlIGJhZCBrZnJlZSgpIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGUKKyAqCSAgYWxsb2Nfb3Jpbm9jb2RldigpIGNoYW5nZXMuCisgKgorICogdjAuMTFiIC0+IHYwLjEyIC0gMTkgSnVuIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gU3VwcG9ydCBjaGFuZ2luZyB0aGUgTUFDIGFkZHJlc3MuCisgKglvIENvcnJlY3QgZGlzcGxheSBvZiBJbnRlcnNpbCBmaXJtd2FyZSByZXZpc2lvbiBudW1iZXJzLgorICoJbyBFbnRpcmVseSByZXZpc2VkIGxvY2tpbmcgc2NoZW1lLiAgU2hvdWxkIGJlIGJvdGggc2ltcGxlciBhbmQKKyAqCSAgIGJldHRlci4KKyAqCW8gTWVyZ2VkIHNvbWUgY29tbW9uIGNvZGUgaW4gb3Jpbm9jb19wbHgsIG9yaW5vY29fcGNpIGFuZAorICoJICBhaXJwb3J0IGJ5IGNyZWF0aW5nIG9yaW5vY29fZGVmYXVsdF97b3BlbixzdG9wLHJlc2V0fSgpCisgKgkgIHdoaWNoIGFyZSB1c2VkIGFzIHRoZSBkZXYtPm9wZW4sIGRldi0+c3RvcCwgcHJpdi0+cmVzZXQKKyAqCSAgY2FsbGJhY2tzIGlmIG5vbmUgYXJlIHNwZWNpZmllZCB3aGVuIGFsbG9jX29yaW5vY29kZXYoKSBpcworICoJICBjYWxsZWQuCisgKglvIFJlbW92ZWQgb3Jpbm9jb19wbHhfaW50ZXJydXB0KCkgYW5kIG9yaW5vY29fcGNpX2ludGVycnVwdCgpLgorICoJICBUaGV5IGRpZG4ndCBkbyBhbnl0aGluZy4KKyAqCisgKiB2MC4xMiAtPiB2MC4xMmEgLSA0IEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFNvbWUgcmVhcnJhbmdlbWVudCBvZiBjb2RlLgorICoJbyBOdW1lcm91cyBmaXh1cHMgdG8gbG9ja2luZyBhbmQgcmVzdCBoYW5kbGluZywgcGFydGljdWxhcmx5CisgKgkgIGZvciBQQ01DSUEuCisgKglvIFRoaXMgYWxsb3dzIG9wZW4gYW5kIHN0b3AgbmV0X2RldmljZSBtZXRob2RzIHRvIGJlIGluCisgKgkgIG9yaW5vY28uYyBub3csIHJhdGhlciB0aGFuIGluIHRoZSBpbml0IG1vZHVsZXMuCisgKglvIEluIG9yaW5vY29fY3MuYyBsaW5rLT5wcml2IG5vdyBwb2ludHMgdG8gdGhlIHN0cnVjdAorICoJICBuZXRfZGV2aWNlIG5vdCB0byB0aGUgc3RydWN0IG9yaW5vY29fcHJpdmF0ZS4KKyAqCW8gQWRkZWQgYSBjaGVjayBmb3IgdW5kZXJzaXplZCBTTkFQIGZyYW1lcywgd2hpY2ggY291bGQgY2F1c2UKKyAqCSAgY3Jhc2hlcy4KKyAqCisgKiB2MC4xMmEgLT4gdjAuMTJiIC0gMTEgSnVsIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4IGh3LT5udW1faW5pdCB0ZXN0aW5nIGNvZGUsIHNvIG51bV9pbml0IGlzIGFjdHVhbGx5CisgKgkgIGluY3JlbWVudGVkLgorICoJbyBGaXggdmVyeSBzdHVwaWQgYnVnIGluIG9yaW5vY29fY3Mgd2hpY2ggYnJva2UgY29tcGlsZSB3aXRoCisgKgkgIENPTkZJR19TTVAuCisgKglvIFNxdWFzaGVkIGEgd2FybmluZy4KKyAqCisgKiB2MC4xMmIgLT4gdjAuMTJjIC0gMjYgSnVsIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gQ2hhbmdlIHRvIEM5WCBzdHlsZSBkZXNpZ25hdGVkIGluaXRpYWxpemVycy4KKyAqCW8gQWRkIHN1cHBvcnQgZm9yIDNDb20gQWlyQ29ubmVjdCBQQ0kuCisgKglvIE5vIGxvbmdlciBpZ25vcmUgdGhlIGhhcmRfcmVzZXQgYXJndW1lbnQgdG8KKyAqCSAgYWxsb2Nfb3Jpbm9jb2RldigpLiAgT29wcy4KKyAqCisgKiB2MC4xMmMgLT4gdjAuMTNiZXRhMSAtIDEzIFNlcCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFJldmVydCB0aGUgYnJva2VuIDAuMTIqIGxvY2tpbmcgc2NoZW1lIGFuZCBnbyB0byBhIG5ldyB5ZXQKKyAqCSAgc2ltcGxlciBzY2hlbWUuCisgKglvIERvIGZpcm13YXJlIHJlc2V0cyBvbmx5IGluIG9yaW5vY29faW5pdCgpIGFuZCB3aGVuIHdha2luZworICoJICB0aGUgY2FyZCBmcm9tIGhhcmQgc2xlZXAuCisgKgorICogdjAuMTNiZXRhMSAtPiB2MC4xMyAtIDI3IFNlcCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFJlLWludHJvZHVjZWQgZnVsbCByZXNldHMgKHZpYSBzY2hlZHVsZV90YXNrKCkpIG9uIFR4CisgKgkgIHRpbWVvdXQuCisgKgorICogdjAuMTMgLT4gdjAuMTNhIC0gMzAgU2VwIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gTWlub3IgY2xlYW51cHMgdG8gaW5mbyBmcmFtZSBoYW5kbGluZy4gIEFkZCBiYXNpYyBzdXBwb3J0CisgKgkgIGZvciBsaW5rc3RhdHVzIGluZm8gZnJhbWVzLgorICoJbyBJbmNsdWRlIHJlcXVpcmVkIGtlcm5lbCBoZWFkZXJzIGluIG9yaW5vY28uaCwgdG8gYXZvaWQKKyAqCSAgY29tcGlsZSBwcm9ibGVtcy4KKyAqCisgKiB2MC4xM2EgLT4gdjAuMTNiIC0gMTAgRmViIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gSW1wbGVtZW50ZWQgaGFyZCByZXNldCBmb3IgQWlycG9ydCBjYXJkcworICoJbyBFeHBlcmltZW50YWwgc3VzcGVuZC9yZXN1bWUgaW1wbGVtZW50YXRpb24gZm9yIG9yaW5vY29fcGNpCisgKglvIEFib2xpc2hlZCAvcHJvYyBkZWJ1Z2dpbmcgc3VwcG9ydCwgcmVwbGFjZWQgd2l0aCBhIGRlYnVnZ2luZworICoJICBpd3ByaXYuICBOb3cgaXQncyB1Z2x5IGFuZCBzaW1wbGUgaW5zdGVhZCBvZiB1Z2x5IGFuZCBjb21wbGV4LgorICoJbyBCdWdmaXggaW4gaGVybWVzLmMgaWYgdGhlIGZpcm13YXJlIHJldHVybmVkIGEgcmVjb3JkIGxlbmd0aAorICoJICBvZiAwLCB3ZSBjb3VsZCBnbyBjbG9iYmVyaW5nIG1lbW9yeS4KKyAqCW8gQnVnZml4IGluIG9yaW5vY29fc3RvcCgpIC0gaXQgdXNlZCB0byBmYWlsIGlmIGh3X3VuYXZhaWxhYmxlCisgKgkgIHdhcyBzZXQsIHdoaWNoIHdhcyB1c3VhbGx5IHRydWUgb24gUENNQ0lBIGhvdCByZW1vdmVzLgorICogCW8gVHJhY2sgTElOS1NUQVRVUyBtZXNzYWdlcywgc2lsZW50bHkgZHJvcCBUeCBwYWNrZXRzIGJlZm9yZQorICogCSAgd2UgYXJlIGNvbm5lY3RlZCAoYXZvaWRzIGNvbmZ1c2luZyB0aGUgZmlybXdhcmUpLCBhbmQgb25seQorICogCSAgZ2l2ZSBMSU5LU1RBVFVTIHByaW50aygpcyBpZiB0aGUgc3RhdHVzIGhhcyBjaGFuZ2VkLgorICoKKyAqIHYwLjEzYiAtPiB2MC4xM2MgLSAxMSBNYXIgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBDbGVhbnVwOiB1c2UgZGV2IGluc3RlYWQgb2YgcHJpdiBpbiB2YXJpb3VzIHBsYWNlcy4KKyAqCW8gQnVnIGZpeDogRG9uJ3QgUmVsZWFzZUNvbmZpZ3VyYXRpb24gb24gUkVTRVRfUEhZU0lDQUwgZXZlbnQKKyAqCSAgaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIChkcml2ZXIgaW5pdGlhdGVkKSBoYXJkIHJlc2V0LgorICoJbyBCdWcgZml4OiBFVEhfWkxFTiBpcyBzdXBwb3NlZCB0byBpbmNsdWRlIHRoZSBoZWFkZXIKKyAqCSAgKERpb255c3VzIEJsYXpha2lzICYgTWFuaXNoIEthcmlyKQorICoJbyBDb252ZXJ0IHRvIHVzaW5nIHdvcmtxdWV1ZXMgaW5zdGVhZCBvZiB0YXNrcXVldWVzIChhbmQKKyAqCSAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbWFjcm9zIGZvciBwcmUgMi41LjQxIGtlcm5lbHMpLgorICoJbyBEcm9wIHJlZHVuZGFudCAoSSB0aGluay4uLikgTU9EX3tJTkMsREVDfV9VU0VfQ09VTlQgaW4KKyAqCSAgYWlycG9ydC5jCisgKglvIE5ldyBvcmlub2NvX3RtZC5jIGluaXQgbW9kdWxlIGZyb20gSm9lcmcgRG9yY2hhaW4gZm9yCisgKgkgIFRNRDcxNjAgYmFzZWQgUENJIHRvIFBDTUNJQSBicmlkZ2VzIChzaW1pbGFyIHRvCisgKgkgIG9yaW5vY29fcGx4LmMpLgorICoKKyAqIHYwLjEzYyAtPiB2MC4xM2QgLSAyMiBBcHIgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBNYWtlIGh3X3VuYXZhaWxhYmxlIGEgY291bnRlciwgcmF0aGVyIHRoYW4ganVzdCBhIGZsYWcsIHRoaXMKKyAqCSAgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIHNvbWUgcmFjZXMgKHN1Y2ggYXMgYSBjYXJkIGJlaW5nCisgKgkgIHJlbW92ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcmlub2NvX3Jlc2V0KCkuCisgKglvIFJlc3RvcmUgUmVsZWFzZS9SZXF1ZXN0Q29uZmlndXJhdGlvbiBpbiB0aGUgUENNQ0lBIGV2ZW50IGhhbmRsZXIKKyAqCSAgd2hlbiBkZWFsaW5nIHdpdGggYSBkcml2ZXIgaW5pdGlhdGVkIGhhcmQgcmVzZXQuICBUaGlzIGlzCisgKgkgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGhhbmdzIGR1ZSB0byBhIHNwdXJpb3VzIGludGVycnVwdCB3aGlsZQorICoJICB0aGUgcmVzZXQgaXMgaW4gcHJvZ3Jlc3MuCisgKglvIENsZWFyIHRoZSA4MDIuMTEgaGVhZGVyIHdoZW4gdHJhbnNtaXR0aW5nLCBldmVuIHRob3VnaCB3ZQorICoJICBkb24ndCB1c2UgaXQuICBUaGlzIGZpeGVzIGEgbG9uZyBzdGFuZGluZyBidWcgb24gc29tZQorICoJICBmaXJtd2FyZXMsIHdoaWNoIHNlZW0gdG8gZ2V0IGNvbmZ1c2VkIGlmIHRoYXQgaXNuJ3QgZG9uZS4KKyAqCW8gQmUgbGVzcyBlYWdlciB0byBkZS1lbmNhcHN1bGF0ZSBTTkFQIGZyYW1lcywgb25seSBkbyBzbyBpZgorICoJICB0aGUgT1VJIGlzIDAwOjAwOjAwIG9yIDAwOjAwOmY4LCBsZWF2ZSBvdGhlcnMgYWxvbmUuICBUaGUgb2xkCisgKgkgIGJlaGF2aW91ciBicm9rZSBDRFAgKENpc2NvIERpc2NvdmVyeSBQcm90b2NvbCkuCisgKglvIFVzZSBkZXYgaW5zdGVhZCBvZiBwcml2IGZvciBmcmVlX2lycSgpIGFzIHdlbGwgYXMKKyAqCSAgcmVxdWVzdF9pcnEoKSAob29wcykuCisgKglvIEF0dGVtcHQgdG8gcmVzZXQgcmF0aGVyIHRoYW4gZ2l2aW5nIHVwIGlmIHdlIGdldCB0b28gbWFueQorICoJICBJUlFzLgorICoJbyBDaGFuZ2VkIHNlbWFudGljcyBvZiBfX29yaW5vY29fZG93bigpIHNvIGl0IGNhbiBiZSBjYWxsZWQKKyAqCSAgc2FmZWx5IHdpdGggaHdfdW5hdmFpbGFibGUgc2V0LiAgSXQgYWxzbyBub3cgY2xlYXJzIHRoZQorICoJICBsaW5rc3RhdHVzIChzaW5jZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlYXNzb2NpYXRlKS4KKyAqCisgKiB2MC4xM2QgLT4gdjAuMTNlIC0gMTIgTWF5IDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gU3VwcG9ydCBmb3IgcG9zdC0yLjUuNjggcmV0dXJuIHZhbHVlcyBmcm9tIGlycSBoYW5kbGVyLgorICoJbyBGaXhlZCBidWcgd2hlcmUgdW5kZXJsZW5ndGggcGFja2V0cyB3b3VsZCBiZSBkb3VibGUgY291bnRlZAorICoJICBpbiB0aGUgcnhfZHJvcHBlZCBzdGF0aXN0aWNzLgorICoJbyBQcm92aWRlZCBhIG1vZHVsZSBwYXJhbWV0ZXIgdG8gc3VwcHJlc3MgbGlua3N0YXR1cyBtZXNzYWdlcy4KKyAqCisgKiB2MC4xM2UgLT4gdjAuMTRhbHBoYTEgLSAzMCBTZXAgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBSZXBsYWNlZCBwcml2LT5jb25uZWN0ZWQgbG9naWMgd2l0aCBuZXRpZl9jYXJyaWVyX29uL29mZigpCisgKgkgIGNhbGxzLgorICoJbyBSZW1vdmUgaGFzX2lic3NfYW55IGFuZCBuZXZlciBzZXQgdGhlIENSRUFURUlCU1MgUklEIHdoZW4KKyAqCSAgdGhlIEVTU0lEIGlzIGVtcHR5LiAgVG9vIG1hbnkgZmlybXdhcmVzIGJyZWFrIGlmIHdlIGRvLgorICoJbyAyLjYgbWVyZ2VzOiBSZXBsYWNlIHBkZXYtPnNsb3RfbmFtZSB3aXRoIHBjaV9uYW1lKCksIHJlbW92ZQorICoJICBfX2RldmluaXRkYXRhIGZyb20gUENJIElEIHRhYmxlcywgdXNlIGZyZWVfbmV0ZGV2KCkuCisgKglvIEVuYWJsZWQgc2hhcmVkLWtleSBhdXRoZW50aWNhdGlvbiBmb3IgQWdlcmUgZmlybXdhcmUgKGZyb20KKyAqCSAgUm9iZXJ0IEouIE1vb3JlIDxSb2JlcnQuSi5Nb29yZSBBVCBhbGxhbmJhbmsuY29tPgorICoJbyBNb3ZlIG5ldGlmX3dha2VfcXVldWUoKSAoYmFjaykgdG8gdGhlIFR4IGNvbXBsZXRpb24gZnJvbSB0aGUKKyAqCSAgQUxMT0MgZXZlbnQuICBUaGlzIHNlZW1zIHRvIHByZXZlbnQvbWl0aWdhdGUgdGhlIHJvbGxpbmcKKyAqCSAgZXJyb3IgLTExMCBwcm9ibGVtcyBhdCBsZWFzdCBvbiBzb21lIEludGVyc2lsIGZpcm13YXJlcy4KKyAqCSAgVGhlb3JldGljYWxseSByZWR1Y2VzIHBlcmZvcm1hbmNlLCBidXQgSSBjYW4ndCBtZWFzdXJlIGl0LgorICoJICBQYXRjaCBmcm9tIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlIEFUIHNhbWJhLm9yZz4KKyAqCisgKiB2MC4xNGFscGhhMSAtPiB2MC4xNGFscGhhMiAtIDIwIE9jdCAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIENvcnJlY3RseSB0dXJuIG9mZiBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uIHdoZW4gcmVxdWVzdGVkCisgKgkgIChidWdmaXggZnJvbSBSb2JlcnQgSi4gTW9vcmUpLgorICoJbyBDb3JyZWN0IGFpcnBvcnQgc2xlZXAgaW50ZXJmYWNlcyBmb3IgY3VycmVudCAyLjYga2VybmVscy4KKyAqCW8gQWRkIGNvZGUgZm9yIGtleSBjaGFuZ2Ugd2l0aG91dCBkaXNhYmxpbmcvZW5hYmxpbmcgdGhlIE1BQworICoJICBwb3J0LiAgVGhpcyBpcyBzdXBwb3NlZCB0byBhbGxvdyA4MDIuMXggdG8gd29yayBzYW5lbHksIGJ1dAorICoJICBkb2Vzbid0IHNlZW0gdG8geWV0LgorICoKKyAqIFRPRE8KKyAqCW8gTmV3IHdpcmVsZXNzIGV4dGVuc2lvbnMgQVBJIChwYXRjaCBmcm9tIE1vdXN0YWZhCisgKgkgIFlvdXNzZWYsIHVwZGF0ZWQgYnkgSmltIENhcnRlciBhbmQgUGF2ZWwgUm9za2luKS4KKyAqCW8gSGFuZGxlIGRlLWVuY2Fwc3VsYXRpb24gd2l0aGluIG5ldHdvcmsgbGF5ZXIsIHByb3ZpZGUgODAyLjExCisgKgkgIGhlYWRlcnMgKHBhdGNoIGZyb20gVGhvbWFzICdEZW50JyBNaXJsYWNoZXIpCisgKglvIFJGIG1vbml0b3IgbW9kZSBzdXBwb3J0CisgKglvIEZpeCBwb3NzaWJsZSByYWNlcyBpbiBTUFkgaGFuZGxpbmcuCisgKglvIERpc2Nvbm5lY3Qgd2lyZWxlc3MgZXh0ZW5zaW9ucyBmcm9tIGZ1bmRhbWVudGFsIGNvbmZpZ3VyYXRpb24uCisgKglvIChtYXliZSkgU29mdHdhcmUgV0VQIHN1cHBvcnQgKHBhdGNoIGZyb20gU3Rhbm8gTWVkdW5hKS4KKyAqCW8gKG1heWJlKSBVc2UgbXVsdGlwbGUgVHggYnVmZmVycyAtIGRyaXZlciBoYW5kbGluZyBxdWV1ZQorICoJICByYXRoZXIgdGhhbiBmaXJtd2FyZS4KKyAqLworCisvKiBMb2NraW5nIGFuZCBzeW5jaHJvbml6YXRpb246CisgKgorICogVGhlIGJhc2ljIHByaW5jaXBsZSBpcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgc2VyaWFsaXplZCB0aHJvdWdoIGEKKyAqIHNpbmdsZSBzcGlubG9jaywgcHJpdi0+bG9jay4gIFRoZSBsb2NrIGlzIHVzZWQgaW4gdXNlciwgYmggYW5kIGlycQorICogY29udGV4dCwgc28gd2hlbiB0YWtlbiBvdXRzaWRlIGhhcmRpcnEgY29udGV4dCBpdCBzaG91bGQgYWx3YXlzIGJlCisgKiB0YWtlbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaGUgbG9jayBwcm90ZWN0cyBib3RoIHRoZQorICogaGFyZHdhcmUgYW5kIHRoZSBzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlLgorICoKKyAqIEFub3RoZXIgZmxhZywgcHJpdi0+aHdfdW5hdmFpbGFibGUgaW5kaWNhdGVzIHRoYXQgdGhlIGhhcmR3YXJlIGlzCisgKiB1bmF2YWlsYWJsZSBmb3IgYW4gZXh0ZW5kZWQgcGVyaW9kIG9mIHRpbWUgKGUuZy4gc3VzcGVuZGVkLCBvciBpbgorICogdGhlIG1pZGRsZSBvZiBhIGhhcmQgcmVzZXQpLiAgVGhpcyBmbGFnIGlzIHByb3RlY3RlZCBieSB0aGUKKyAqIHNwaW5sb2NrLiAgQWxsIGNvZGUgd2hpY2ggdG91Y2hlcyB0aGUgaGFyZHdhcmUgc2hvdWxkIGNoZWNrIHRoZQorICogZmxhZyBhZnRlciB0YWtpbmcgdGhlIGxvY2ssIGFuZCBpZiBpdCBpcyBzZXQsIGdpdmUgdXAgb24gd2hhdGV2ZXIKKyAqIHRoZXkgYXJlIGRvaW5nIGFuZCBkcm9wIHRoZSBsb2NrIGFnYWluLiAgVGhlIG9yaW5vY29fbG9jaygpCisgKiBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgKGl0IHVubG9ja3MgYW5kIHJldHVybnMgLUVCVVNZIGlmCisgKiBod191bmF2YWlsYWJsZSBpcyBub24temVybykuCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jbyIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisjaW5jbHVkZSAiaGVybWVzX3JpZC5oIgorI2luY2x1ZGUgIm9yaW5vY28uaCIKKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0FVVEhPUigiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gJiBEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgTHVjZW50IE9yaW5vY28sIFByaXNtIElJIGJhc2VkIGFuZCBzaW1pbGFyIHdpcmVsZXNzIGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKy8qIExldmVsIG9mIGRlYnVnZ2luZy4gVXNlZCBpbiB0aGUgbWFjcm9zIGluIG9yaW5vY28uaCAqLworI2lmZGVmIE9SSU5PQ09fREVCVUcKK2ludCBvcmlub2NvX2RlYnVnID0gT1JJTk9DT19ERUJVRzsKK21vZHVsZV9wYXJhbShvcmlub2NvX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhvcmlub2NvX2RlYnVnLCAiRGVidWcgbGV2ZWwiKTsKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19kZWJ1Zyk7CisjZW5kaWYKKworc3RhdGljIGludCBzdXBwcmVzc19saW5rc3RhdHVzOyAvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShzdXBwcmVzc19saW5rc3RhdHVzLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3VwcHJlc3NfbGlua3N0YXR1cywgIkRvbid0IGxvZyBsaW5rIHN0YXR1cyBjaGFuZ2VzIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uIGFuZCBjb21wYXRpYmlsaXR5IHN0dWZmICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2UgZG8gdGhpcyB0aGlzIHdheSB0byBhdm9pZCBpZmRlZnMgaW4gdGhlIGFjdHVhbCBjb2RlICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFNQWV9OVU1CRVIocHJpdikJKHByaXYtPnNweV9udW1iZXIpCisjZWxzZQorI2RlZmluZSBTUFlfTlVNQkVSKHByaXYpCTAKKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgY29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9SSU5PQ09fTUlOX01UVQkJMjU2CisjZGVmaW5lIE9SSU5PQ09fTUFYX01UVQkJKElFRUU4MDJfMTFfREFUQV9MRU4gLSBFTkNBUFNfT1ZFUkhFQUQpCisKKyNkZWZpbmUgU1lNQk9MX01BWF9WRVJfTEVOCSgxNCkKKyNkZWZpbmUgVVNFUl9CQVAJCTAKKyNkZWZpbmUgSVJRX0JBUAkJCTEKKyNkZWZpbmUgTUFYX0lSUUxPT1BTX1BFUl9JUlEJMTAKKyNkZWZpbmUgTUFYX0lSUUxPT1BTX1BFUl9KSUZGWQkoMjAwMDAvSFopIC8qIEJhc2VkIG9uIGEgZ3Vlc3RpbWF0ZSBvZgorCQkJCQkgICAgKiBob3cgbWFueSBldmVudHMgdGhlCisJCQkJCSAgICAqIGRldmljZSBjb3VsZAorCQkJCQkgICAgKiBsZWdpdGltYXRlbHkgZ2VuZXJhdGUgKi8KKyNkZWZpbmUgU01BTExfS0VZX1NJWkUJCTUKKyNkZWZpbmUgTEFSR0VfS0VZX1NJWkUJCTEzCisjZGVmaW5lIFRYX05JQ0JVRl9TSVpFX0JVRwkxNTg1CQkvKiBCdWcgaW4gU3ltYm9sIGZpcm13YXJlICovCisKKyNkZWZpbmUgRFVNTVlfRklECQkweEZGRkYKKworLyojZGVmaW5lIE1BWF9NVUxUSUNBU1QocHJpdikJKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9BR0VSRSA/IFwKKyAgSEVSTUVTX01BWF9NVUxUSUNBU1QgOiAwKSovCisjZGVmaW5lIE1BWF9NVUxUSUNBU1QocHJpdikJKEhFUk1FU19NQVhfTVVMVElDQVNUKQorCisjZGVmaW5lIE9SSU5PQ09fSU5URU4JIAkoSEVSTUVTX0VWX1JYIHwgSEVSTUVTX0VWX0FMTE9DIFwKKwkJCQkgfCBIRVJNRVNfRVZfVFggfCBIRVJNRVNfRVZfVFhFWEMgXAorCQkJCSB8IEhFUk1FU19FVl9XVEVSUiB8IEhFUk1FU19FVl9JTkZPIFwKKwkJCQkgfCBIRVJNRVNfRVZfSU5GRFJPUCApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERhdGEgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGZyZXF1ZW5jeSBvZiBlYWNoIGNoYW5uZWwgaW4gTUh6ICovCitzdGF0aWMgY29uc3QgbG9uZyBjaGFubmVsX2ZyZXF1ZW5jeVtdID0geworCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NAorfTsKKyNkZWZpbmUgTlVNX0NIQU5ORUxTIEFSUkFZX1NJWkUoY2hhbm5lbF9mcmVxdWVuY3kpCisKKy8qIFRoaXMgdGFibGVzIGdpdmVzIHRoZSBhY3R1YWwgbWVhbmluZ3Mgb2YgdGhlIGJpdHJhdGUgSURzIHJldHVybmVkCisgKiBieSB0aGUgZmlybXdhcmUuICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYml0cmF0ZTsgLyogaW4gMTAwcyBvZiBraWxvYml0cyAqLworCWludCBhdXRvbWF0aWM7CisJdTE2IGFnZXJlX3R4cmF0ZWN0cmw7CisJdTE2IGludGVyc2lsX3R4cmF0ZWN0cmw7Cit9IGJpdHJhdGVfdGFibGVbXSA9IHsKKwl7MTEwLCAxLCAgMywgMTV9LCAvKiBFbnRyeSAwIGlzIHRoZSBkZWZhdWx0ICovCisJezEwLCAgMCwgIDEsICAxfSwKKwl7MTAsICAxLCAgMSwgIDF9LAorCXsyMCwgIDAsICAyLCAgMn0sCisJezIwLCAgMSwgIDYsICAzfSwKKwl7NTUsICAwLCAgNCwgIDR9LAorCXs1NSwgIDEsICA3LCAgN30sCisJezExMCwgMCwgIDUsICA4fSwKK307CisjZGVmaW5lIEJJVFJBVEVfVEFCTEVfU0laRSBBUlJBWV9TSVpFKGJpdHJhdGVfdGFibGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERhdGEgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGhlYWRlcl9zdHJ1Y3QgeworCS8qIDgwMi4zICovCisJdTggZGVzdFtFVEhfQUxFTl07CisJdTggc3JjW0VUSF9BTEVOXTsKKwl1MTYgbGVuOworCS8qIDgwMi4yICovCisJdTggZHNhcDsKKwl1OCBzc2FwOworCXU4IGN0cmw7CisJLyogU05BUCAqLworCXU4IG91aVszXTsKKwl1MTYgZXRoZXJ0eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIDgwMi4yIExMQy9TTkFQIGhlYWRlciB1c2VkIGZvciBFdGhlcm5ldCBlbmNhcHN1bGF0aW9uIG92ZXIgODAyLjExICovCit1OCBlbmNhcHNfaGRyW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisKKyNkZWZpbmUgRU5DQVBTX09WRVJIRUFECQkoc2l6ZW9mKGVuY2Fwc19oZHIpICsgMikKKworc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yIHsKKwl1MTYgc3RhdHVzOworCXUzMiB0aW1lOworCXU4IHNpbGVuY2U7CisJdTggc2lnbmFsOworCXU4IHJhdGU7CisJdTggcnhmbG93OworCXUzMiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgX19vcmlub2NvX3Byb2dyYW1fcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9yaW5vY29fZGVidWdfZHVtcF9yZWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG9ydF90eXBlKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJc3dpdGNoIChwcml2LT5pd19tb2RlKSB7CisJY2FzZSBJV19NT0RFX0lORlJBOgorCQlwcml2LT5wb3J0X3R5cGUgPSAxOworCQlwcml2LT5jcmVhdGVpYnNzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQlpZiAocHJpdi0+cHJlZmVyX3BvcnQzKSB7CisJCQlwcml2LT5wb3J0X3R5cGUgPSAzOworCQkJcHJpdi0+Y3JlYXRlaWJzcyA9IDA7CisJCX0gZWxzZSB7CisJCQlwcml2LT5wb3J0X3R5cGUgPSBwcml2LT5pYnNzX3BvcnQ7CisJCQlwcml2LT5jcmVhdGVpYnNzID0gMTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHByaXYtPml3X21vZGUgaW4gc2V0X3BvcnRfdHlwZSgpXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgbWV0aG9kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgb3Jpbm9jb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKworCWlmICghIGVycikKKwkJcHJpdi0+b3BlbiA9IDE7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG9yaW5vY29fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJLyogV2UgbXVzdG4ndCB1c2Ugb3Jpbm9jb19sb2NrKCkgaGVyZSwgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlCisJICAgYWJsZSB0byBjbG9zZSB0aGUgaW50ZXJmYWNlIGV2ZW4gaWYgaHdfdW5hdmFpbGFibGUgaXMgc2V0CisJICAgKGUuZy4gYXMgd2UncmUgcmVsZWFzZWQgYWZ0ZXIgYSBQQyBDYXJkIHJlbW92YWwpICovCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlwcml2LT5vcGVuID0gMDsKKworCWVyciA9IF9fb3Jpbm9jb19kb3duKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpvcmlub2NvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqb3Jpbm9jb19nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZwcml2LT53c3RhdHM7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdldF93aXJlbGVzc19zdGF0cygpIGNhbGxlZCB3aGlsZSBkZXZpY2Ugbm90IHByZXNlbnRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsgLyogRklYTUU6IENhbiB3ZSBkbyBiZXR0ZXIgdGhhbiB0aGlzPyAqLworCX0KKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsgIC8qIEZJWE1FOiBFcmcsIHdlJ3ZlIGJlZW4gc2lnbmFsbGVkLCBob3cKKwkJCSAgICAgICAqIGRvIHdlIHByb3BhZ2F0ZSB0aGlzIGJhY2sgdXA/ICovCisKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCW1lbXNldCgmd3N0YXRzLT5xdWFsLCAwLCBzaXplb2Yod3N0YXRzLT5xdWFsKSk7CisJCS8qIElmIGEgc3B5IGFkZHJlc3MgaXMgZGVmaW5lZCwgd2UgcmVwb3J0IHN0YXRzIG9mIHRoZQorCQkgKiBmaXJzdCBzcHkgYWRkcmVzcyAtIEplYW4gSUkgKi8KKwkJaWYgKFNQWV9OVU1CRVIocHJpdikpIHsKKwkJCXdzdGF0cy0+cXVhbC5xdWFsID0gcHJpdi0+c3B5X3N0YXRbMF0ucXVhbDsKKwkJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IHByaXYtPnNweV9zdGF0WzBdLmxldmVsOworCQkJd3N0YXRzLT5xdWFsLm5vaXNlID0gcHJpdi0+c3B5X3N0YXRbMF0ubm9pc2U7CisJCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IHByaXYtPnNweV9zdGF0WzBdLnVwZGF0ZWQ7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgeworCQkJdTE2IHF1YWwsIHNpZ25hbCwgbm9pc2U7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGNxOworCisJCWVyciA9IEhFUk1FU19SRUFEX1JFQ09SRChodywgVVNFUl9CQVAsCisJCQkJCSBIRVJNRVNfUklEX0NPTU1TUVVBTElUWSwgJmNxKTsKKwkJCisJCXdzdGF0cy0+cXVhbC5xdWFsID0gKGludClsZTE2X3RvX2NwdShjcS5xdWFsKTsKKwkJd3N0YXRzLT5xdWFsLmxldmVsID0gKGludClsZTE2X3RvX2NwdShjcS5zaWduYWwpIC0gMHg5NTsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gKGludClsZTE2X3RvX2NwdShjcS5ub2lzZSkgLSAweDk1OworCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IDc7CisJfQorCisJLyogV2UgY2FuJ3QgcmVhbGx5IHdhaXQgZm9yIHRoZSB0YWxsaWVzIGlucXVpcnkgY29tbWFuZCB0bworCSAqIGNvbXBsZXRlLCBzbyB3ZSBqdXN0IHVzZSB0aGUgcHJldmlvdXMgcmVzdWx0cyBhbmQgdHJpZ2dlcgorCSAqIGEgbmV3IHRhbGxpZXMgaW5xdWlyeSBjb21tYW5kIGZvciBuZXh0IHRpbWUgLSBKZWFuIElJICovCisJLyogRklYTUU6IFdlJ3JlIGluIHVzZXIgY29udGV4dCAoSSB0aGluaz8pLCBzbyB3ZSBzaG91bGQganVzdAorICAgICAgICAgICB3YWl0IGZvciB0aGUgdGFsbGllcyB0byBjb21lIHRocm91Z2ggKi8KKwllcnIgPSBoZXJtZXNfaW5xdWlyZShodywgSEVSTUVTX0lOUV9UQUxMSUVTKTsKKyAgICAgICAgICAgICAgIAorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gTlVMTDsKKwkJCisJcmV0dXJuIHdzdGF0czsKK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdCgpICIKKwkJICAgICAgICJjYWxsZWQgd2hlbiBod191bmF2YWlsYWJsZVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCV9fb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG9yaW5vY29fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICggKG5ld19tdHUgPCBPUklOT0NPX01JTl9NVFUpIHx8IChuZXdfbXR1ID4gT1JJTk9DT19NQVhfTVRVKSApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCAobmV3X210dSArIEVOQ0FQU19PVkVSSEVBRCArIElFRUU4MDJfMTFfSExFTikgPgorCSAgICAgKHByaXYtPm5pY2J1Zl9zaXplIC0gRVRIX0hMRU4pICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVHggcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29feG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IHR4ZmlkID0gcHJpdi0+dHhmaWQ7CisJY2hhciAqcDsKKwlzdHJ1Y3QgZXRoaGRyICplaDsKKwlpbnQgbGVuLCBkYXRhX2xlbiwgZGF0YV9vZmY7CisJc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIGRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwlpZiAoISBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggb24gc3RvcHBlZCBkZXZpY2UhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHdoaWxlIHRyYW5zbWl0dGVyIGJ1c3khXG4iLCAKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9yaW5vY29feG1pdCgpIGNhbGxlZCB3aGlsZSBod191bmF2YWlsYWJsZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCEgbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCS8qIE9vcHMsIHRoZSBmaXJtd2FyZSBoYXNuJ3QgZXN0YWJsaXNoZWQgYSBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldCAodGhpcyBzZWVtcyB0byBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICBzYWZlc3QgYXBwcm9hY2gpLiAqLworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMZW5ndGggb2YgdGhlIHBhY2tldCBib2R5ICovCisJLyogRklYTUU6IHdoYXQgaWYgdGhlIHNrYiBpcyBzbWFsbGVyIHRoYW4gdGhpcz8gKi8KKwlsZW4gPSBtYXhfdChpbnQsc2tiLT5sZW4gLSBFVEhfSExFTiwgRVRIX1pMRU4gLSBFVEhfSExFTik7CisKKwllaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCisJbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworIAlkZXNjLnR4X2NvbnRyb2wgPSBjcHVfdG9fbGUxNihIRVJNRVNfVFhDVFJMX1RYX09LIHwgSEVSTUVTX1RYQ1RSTF9UWF9FWCk7CisJZXJyID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCAmZGVzYywgc2l6ZW9mKGRlc2MpLCB0eGZpZCwgMCk7CisJaWYgKGVycikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgd3JpdGluZyBUeCBkZXNjcmlwdG9yICIKKwkJCSAgICAgICAidG8gQkFQXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENsZWFyIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBkYXRhIGxlbmd0aCBmaWVsZHMgLSBzb21lCisJICogZmlybXdhcmVzIChlLmcuIEx1Y2VudC9BZ2VyZSA4Lnh4KSBhcHBlYXIgdG8gZ2V0IGNvbmZ1c2VkCisJICogaWYgdGhpcyBpc24ndCBkb25lLiAqLworCWhlcm1lc19jbGVhcl93b3JkcyhodywgSEVSTUVTX0RBVEEwLAorCQkJICAgSEVSTUVTXzgwMl8zX09GRlNFVCAtIEhFUk1FU184MDJfMTFfT0ZGU0VUKTsKKworCS8qIEVuY2Fwc3VsYXRlIEV0aGVybmV0LUlJIGZyYW1lcyAqLworCWlmIChudG9ocyhlaC0+aF9wcm90bykgPiBFVEhfREFUQV9MRU4pIHsgLyogRXRoZXJuZXQtSUkgZnJhbWUgKi8KKwkJc3RydWN0IGhlYWRlcl9zdHJ1Y3QgaGRyOworCQlkYXRhX2xlbiA9IGxlbjsKKwkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUICsgc2l6ZW9mKGhkcik7CisJCXAgPSBza2ItPmRhdGEgKyBFVEhfSExFTjsKKworCQkvKiA4MDIuMyBoZWFkZXIgKi8KKwkJbWVtY3B5KGhkci5kZXN0LCBlaC0+aF9kZXN0LCBFVEhfQUxFTik7CisJCW1lbWNweShoZHIuc3JjLCBlaC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKKwkJaGRyLmxlbiA9IGh0b25zKGRhdGFfbGVuICsgRU5DQVBTX09WRVJIRUFEKTsKKwkJCisJCS8qIDgwMi4yIGhlYWRlciAqLworCQltZW1jcHkoJmhkci5kc2FwLCAmZW5jYXBzX2hkciwgc2l6ZW9mKGVuY2Fwc19oZHIpKTsKKwkJCQorCQloZHIuZXRoZXJ0eXBlID0gZWgtPmhfcHJvdG87CisJCWVyciAgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsICZoZHIsIHNpemVvZihoZHIpLAorCQkJCQkgdHhmaWQsIEhFUk1FU184MDJfM19PRkZTRVQpOworCQlpZiAoZXJyKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgcGFja2V0ICIKKwkJCQkgICAgICAgImhlYWRlciB0byBCQVBcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7IC8qIElFRUUgODAyLjMgZnJhbWUgKi8KKwkJZGF0YV9sZW4gPSBsZW4gKyBFVEhfSExFTjsKKwkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUOworCQlwID0gc2tiLT5kYXRhOworCX0KKworCS8qIFJvdW5kIHVwIGZvciBvZGQgbGVuZ3RoIHBhY2tldHMgKi8KKwllcnIgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsIHAsIEFMSUdOKGRhdGFfbGVuLCAyKSwKKwkJCQl0eGZpZCwgZGF0YV9vZmYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgd3JpdGluZyBwYWNrZXQgdG8gQkFQXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBGaW5hbGx5LCB3ZSBhY3R1YWxseSBpbml0aWF0ZSB0aGUgc2VuZCAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX1RYIHwgSEVSTUVTX0NNRF9SRUNMLAorCQkJCXR4ZmlkLCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJZ290byBmYWlsOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXN0YXRzLT50eF9ieXRlcyArPSBkYXRhX29mZiArIGRhdGFfbGVuOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworIGZhaWw6CisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBBTExPQ0ZJRCk7CisKKwlpZiAoZmlkICE9IHByaXYtPnR4ZmlkKSB7CisJCWlmIChmaWQgIT0gRFVNTVlfRklEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFsbG9jYXRlIGV2ZW50IG9uIHVuZXhwZWN0ZWQgZmlkICglMDRYKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGZpZCk7CisJCXJldHVybjsKKwl9CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgQUxMT0NGSUQsIERVTU1ZX0ZJRCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBUWENPTVBMRklELCBEVU1NWV9GSUQpOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfdHhleGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwl1MTYgZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgVFhDT01QTEZJRCk7CisJc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIGRlc2M7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZmlkID09IERVTU1ZX0ZJRCkKKwkJcmV0dXJuOyAvKiBOb3RoaW5nJ3MgcmVhbGx5IGhhcHBlbmVkICovCisKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmZGVzYywgc2l6ZW9mKGRlc2MpLCBmaWQsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byByZWFkIGRlc2NyaXB0b3Igb24gVHggZXJyb3IgIgorCQkgICAgICAgIihGSUQ9JTA0WCBlcnJvciAlZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGZpZCwgZXJyKTsKKwl9IGVsc2UgeworCQlERUJVRygxLCAiJXM6IFR4IGVycm9yLCBzdGF0dXMgJWRcbiIsCisJCSAgICAgIGRldi0+bmFtZSwgbGUxNl90b19jcHUoZGVzYy5zdGF0dXMpKTsKKwl9CisJCisJc3RhdHMtPnR4X2Vycm9ycysrOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBUWENPTVBMRklELCBEVU1NWV9GSUQpOworfQorCitzdGF0aWMgdm9pZCBvcmlub2NvX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHggdGltZW91dCEgIgorCSAgICAgICAiQUxMT0NGSUQ9JTA0eCwgVFhDT01QTEZJRD0lMDR4LCBFVlNUQVQ9JTA0eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBoZXJtZXNfcmVhZF9yZWduKGh3LCBBTExPQ0ZJRCksCisJICAgICAgIGhlcm1lc19yZWFkX3JlZ24oaHcsIFRYQ09NUExGSUQpLCBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpKTsKKworCXN0YXRzLT50eF9lcnJvcnMrKzsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSeCBwYXRoIChkYXRhIGZyYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERvZXMgdGhlIGZyYW1lIGhhdmUgYSBTTkFQIGhlYWRlciBpbmRpY2F0aW5nIGl0IHNob3VsZCBiZQorICogZGUtZW5jYXBzdWxhdGVkIHRvIEV0aGVybmV0LUlJPyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfZXRoZXJzbmFwKHZvaWQgKl9oZHIpCit7CisJdTggKmhkciA9IF9oZHI7CisKKwkvKiBXZSBkZS1lbmNhcHN1bGF0ZSBhbGwgcGFja2V0cyB3aGljaCwgYSkgaGF2ZSBTTkFQIGhlYWRlcnMKKwkgKiAoaS5lLiBTU0FQPURTQVA9MHhhYSBhbmQgQ1RSTD0weDMgaW4gdGhlIDgwMi4yIExMQyBoZWFkZXIKKwkgKiBhbmQgd2hlcmUgYikgdGhlIE9VSSBvZiB0aGUgU05BUCBoZWFkZXIgaXMgMDA6MDA6MDAgb3IKKwkgKiAwMDowMDpmOCAtIHdlIG5lZWQgYm90aCBiZWNhdXNlIGRpZmZlcmVudCBBUHMgYXBwZWFyIHRvIHVzZQorCSAqIGRpZmZlcmVudCBPVUlzIGZvciBzb21lIHJlYXNvbiAqLworCXJldHVybiAobWVtY21wKGhkciwgJmVuY2Fwc19oZHIsIDUpID09IDApCisJCSYmICggKGhkcls1XSA9PSAweDAwKSB8fCAoaGRyWzVdID09IDB4ZjgpICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcmlub2NvX3NweV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICptYWMsCisJCQkJICAgICAgaW50IGxldmVsLCBpbnQgbm9pc2UpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBHYXRoZXIgd2lyZWxlc3Mgc3B5IHN0YXRpc3RpY3M6IGZvciBlYWNoIHBhY2tldCwgY29tcGFyZSB0aGUKKwkgKiBzb3VyY2UgYWRkcmVzcyB3aXRoIG91dCBsaXN0LCBhbmQgaWYgbWF0Y2gsIGdldCB0aGUgc3RhdHMuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c3B5X251bWJlcjsgaSsrKQorCQlpZiAoIW1lbWNtcChtYWMsIHByaXYtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpIHsKKwkJCXByaXYtPnNweV9zdGF0W2ldLmxldmVsID0gbGV2ZWwgLSAweDk1OworCQkJcHJpdi0+c3B5X3N0YXRbaV0ubm9pc2UgPSBub2lzZSAtIDB4OTU7CisJCQlwcml2LT5zcHlfc3RhdFtpXS5xdWFsID0gKGxldmVsID4gbm9pc2UpID8gKGxldmVsIC0gbm9pc2UpIDogMDsKKwkJCXByaXYtPnNweV9zdGF0W2ldLnVwZGF0ZWQgPSA3OworCQl9Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fc3RhdF9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFVzaW5nIHNweSBzdXBwb3J0IHdpdGggbG90cyBvZiBSeCBwYWNrZXRzLCBsaWtlIGluIGFuCisJICogaW5mcmFzdHJ1Y3R1cmUgKEFQKSwgd2lsbCByZWFsbHkgc2xvdyBkb3duIGV2ZXJ5dGhpbmcsIGJlY2F1c2UKKwkgKiB0aGUgTUFDIGFkZHJlc3MgbXVzdCBiZSBjb21wYXJlZCB0byBlYWNoIGVudHJ5IG9mIHRoZSBzcHkgbGlzdC4KKwkgKiBJZiB0aGUgdXNlciByZWFsbHkgYXNrcyBmb3IgaXQgKHNldCBzb21lIGFkZHJlc3MgaW4gdGhlCisJICogc3B5IGxpc3QpLCB3ZSBkbyBpdCwgYnV0IGhlIHdpbGwgcGF5IHRoZSBwcmljZS4KKwkgKiBOb3RlIHRoYXQgdG8gZ2V0IGhlcmUsIHlvdSBuZWVkIGJvdGggV0lSRUxFU1NfU1BZCisJICogY29tcGlsZWQgaW4gQU5EIHNvbWUgYWRkcmVzc2VzIGluIHRoZSBsaXN0ICEhIQorCSAqLworCS8qIE5vdGUgOiBnY2Mgd2lsbCBvcHRpbWlzZSB0aGUgd2hvbGUgc2VjdGlvbiBhd2F5IGlmCisJICogV0lSRUxFU1NfU1BZIGlzIG5vdCBkZWZpbmVkLi4uIC0gSmVhbiBJSSAqLworCWlmIChTUFlfTlVNQkVSKHByaXYpKSB7CisJCW9yaW5vY29fc3B5X2dhdGhlcihkZXYsIHNrYi0+bWFjLnJhdyArIEVUSF9BTEVOLAorCQkJCSAgIGRlc2MtPnNpZ25hbCwgZGVzYy0+c2lsZW5jZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgcnhmaWQsIHN0YXR1czsKKwlpbnQgbGVuZ3RoLCBkYXRhX2xlbiwgZGF0YV9vZmY7CisJY2hhciAqcDsKKwlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgZGVzYzsKKwlzdHJ1Y3QgaGVhZGVyX3N0cnVjdCBoZHI7CisJc3RydWN0IGV0aGhkciAqZWg7CisJaW50IGVycjsKKworCXJ4ZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgUlhGSUQpOworCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwKKwkJCSAgICAgICByeGZpZCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIFJ4IGRlc2NyaXB0b3IuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlzdGF0dXMgPSBsZTE2X3RvX2NwdShkZXNjLnN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9FUlIpIHsKKwkJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfVU5ERUNSWVBUQUJMRSkgeworCQkJd3N0YXRzLT5kaXNjYXJkLmNvZGUrKzsKKwkJCURFQlVHKDEsICIlczogVW5kZWNyeXB0YWJsZSBmcmFtZSBvbiBSeC4gRnJhbWUgZHJvcHBlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCQlERUJVRygxLCAiJXM6IEJhZCBDUkMgb24gUnguIEZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZ290byBkcm9wOworCX0KKworCS8qIEZvciBub3cgd2UgaWdub3JlIHRoZSA4MDIuMTEgaGVhZGVyIGNvbXBsZXRlbHksIGFzc3VtaW5nCisgICAgICAgICAgIHRoYXQgdGhlIGNhcmQncyBmaXJtd2FyZSBoYXMgaGFuZGxlZCBhbnl0aGluZyB2aXRhbCAqLworCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmhkciwgc2l6ZW9mKGhkciksCisJCQkgICAgICAgcnhmaWQsIEhFUk1FU184MDJfM19PRkZTRVQpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBmcmFtZSBoZWFkZXIuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlsZW5ndGggPSBudG9ocyhoZHIubGVuKTsKKwkKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKGxlbmd0aCA8IDMpIHsgLyogTm8gZm9yIGV2ZW4gYW4gODAyLjIgTExDIGhlYWRlciAqLworCQkvKiBBdCBsZWFzdCBvbiBTeW1ib2wgZmlybXdhcmUgd2l0aCBQQ0Ygd2UgZ2V0IHF1aXRlIGEKKyAgICAgICAgICAgICAgICAgICBsb3Qgb2YgdGhlc2UgbGVnaXRpbWF0ZWx5IC0gUG9sbCBmcmFtZXMgd2l0aCBubworICAgICAgICAgICAgICAgICAgIGRhdGEuICovCisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCWdvdG8gZHJvcDsKKwl9CisJaWYgKGxlbmd0aCA+IElFRUU4MDJfMTFfREFUQV9MRU4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBmcmFtZSByZWNlaXZlZCAoJWQgYnl0ZXMpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsZW5ndGgpOworCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBXZSBuZWVkIHNwYWNlIGZvciB0aGUgcGFja2V0IGRhdGEgaXRzZWxmLCBwbHVzIGFuIGV0aGVybmV0CisJICAgaGVhZGVyLCBwbHVzIDIgYnl0ZXMgc28gd2UgY2FuIGFsaWduIHRoZSBJUCBoZWFkZXIgb24gYQorCSAgIDMyYml0IGJvdW5kYXJ5LCBwbHVzIDEgYnl0ZSBzbyB3ZSBjYW4gcmVhZCBpbiBvZGQgbGVuZ3RoCisJICAgcGFja2V0cyBmcm9tIHRoZSBjYXJkLCB3aGljaCBoYXMgYW4gSU8gZ3JhbnVsYXJpdHkgb2YgMTYKKwkgICBiaXRzICovICAKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCtFVEhfSExFTisyKzEpOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvY2F0ZSBza2IgZm9yIFJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBkcm9wOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIFRoaXMgd2F5IHRoZSBJUCBoZWFkZXIgaXMgYWxpZ25lZCAqLworCisJLyogSGFuZGxlIGRlY2Fwc3VsYXRpb24KKwkgKiBJbiBtb3N0IGNhc2VzLCB0aGUgZmlybXdhcmUgdGVsbCB1cyBhYm91dCBTTkFQIGZyYW1lcy4KKwkgKiBGb3Igc29tZSByZWFzb24sIHRoZSBTTkFQIGZyYW1lcyBzZW50IGJ5IExpbmtTeXMgQVBzCisJICogYXJlIG5vdCBwcm9wZXJseSByZWNvZ25pc2VkIGJ5IG1vc3QgZmlybXdhcmVzLgorCSAqIFNvLCBjaGVjayBvdXJzZWx2ZXMgKi8KKwlpZiAoKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01TR1RZUEUpID09IEhFUk1FU19SWFNUQVRfMTA0MikgfHwKKwkgICAgKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01TR1RZUEUpID09IEhFUk1FU19SWFNUQVRfVFVOTkVMKSB8fAorCSAgICBpc19ldGhlcnNuYXAoJmhkcikpIHsKKwkJLyogVGhlc2UgaW5kaWNhdGUgYSBTTkFQIHdpdGhpbiA4MDIuMiBMTEMgd2l0aGluCisJCSAgIDgwMi4xMSBmcmFtZSB3aGljaCB3ZSdsbCBuZWVkIHRvIGRlLWVuY2Fwc3VsYXRlIHRvCisJCSAgIHRoZSBvcmlnaW5hbCBFdGhlcm5ldElJIGZyYW1lLiAqLworCisJCWlmIChsZW5ndGggPCBFTkNBUFNfT1ZFUkhFQUQpIHsgLyogTm8gcm9vbSBmb3IgZnVsbCBMTEMrU05BUCAqLworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCS8qIFJlbW92ZSBTTkFQIGhlYWRlciwgcmVjb25zdHJ1Y3QgRXRoZXJuZXRJSSBmcmFtZSAqLworCQlkYXRhX2xlbiA9IGxlbmd0aCAtIEVOQ0FQU19PVkVSSEVBRDsKKwkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUICsgc2l6ZW9mKGhkcik7CisKKwkJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYl9wdXQoc2tiLCBFVEhfSExFTik7CisKKwkJbWVtY3B5KGVoLCAmaGRyLCAyICogRVRIX0FMRU4pOworCQllaC0+aF9wcm90byA9IGhkci5ldGhlcnR5cGU7CisJfSBlbHNlIHsKKwkJLyogQWxsIG90aGVyIGNhc2VzIGluZGljYXRlIGEgZ2VudWluZSA4MDIuMyBmcmFtZS4gIE5vCisJCSAgIGRlY2Fwc3VsYXRpb24gbmVlZGVkLiAgV2UganVzdCB0aHJvdyB0aGUgd2hvbGUKKwkJICAgdGhpbmcgaW4sIGFuZCBob3BlIHRoZSBwcm90b2NvbCBsYXllciBjYW4gZGVhbCB3aXRoCisJCSAgIGl0IGFzIDgwMi4zICovCisJCWRhdGFfbGVuID0gbGVuZ3RoOworCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQ7CisJCS8qIEZJWE1FOiB3ZSByZS1yZWFkIGZyb20gdGhlIGNhcmQgZGF0YSB3ZSBhbHJlYWR5IHJlYWQgaGVyZSAqLworCX0KKworCXAgPSBza2JfcHV0KHNrYiwgZGF0YV9sZW4pOworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsIHAsIEFMSUdOKGRhdGFfbGVuLCAyKSwKKwkJCSAgICAgICByeGZpZCwgZGF0YV9vZmYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBmcmFtZS4gIgorCQkgICAgICAgIkZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZ290byBkcm9wOworCX0KKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCisJLyogUHJvY2VzcyB0aGUgd2lyZWxlc3Mgc3RhdHMgaWYgbmVlZGVkICovCisJb3Jpbm9jb19zdGF0X2dhdGhlcihkZXYsIHNrYiwgJmRlc2MpOworCisJLyogUGFzcyB0aGUgcGFja2V0IHRvIHRoZSBuZXR3b3JraW5nIHN0YWNrICovCisJbmV0aWZfcngoc2tiKTsKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBsZW5ndGg7CisKKwlyZXR1cm47CisKKyBkcm9wOgkKKwlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJ4IHBhdGggKGluZm8gZnJhbWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgcHJpbnRfbGlua3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgc3RhdHVzKQoreworCWNoYXIgKiBzOworCisJaWYgKHN1cHByZXNzX2xpbmtzdGF0dXMpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19OT1RfQ09OTkVDVEVEOgorCQlzID0gIk5vdCBDb25uZWN0ZWQiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0NPTk5FQ1RFRDoKKwkJcyA9ICJDb25uZWN0ZWQiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0RJU0NPTk5FQ1RFRDoKKwkJcyA9ICJEaXNjb25uZWN0ZWQiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0FQX0NIQU5HRToKKwkJcyA9ICJBUCBDaGFuZ2VkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19BUF9PVVRfT0ZfUkFOR0U6CisJCXMgPSAiQVAgT3V0IG9mIFJhbmdlIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19BUF9JTl9SQU5HRToKKwkJcyA9ICJBUCBJbiBSYW5nZSI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVNTT0NfRkFJTEVEOgorCQlzID0gIkFzc29jaWF0aW9uIEZhaWxlZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXMgPSAiVU5LTk9XTiI7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBOZXcgbGluayBzdGF0dXM6ICVzICglMDR4KVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBzLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGluZm9maWQ7CisJc3RydWN0IHsKKwkJdTE2IGxlbjsKKwkJdTE2IHR5cGU7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW5mbzsKKwlpbnQgbGVuLCB0eXBlOworCWludCBlcnI7CisKKwkvKiBUaGlzIGlzIGFuIGFuc3dlciB0byBhbiBJTlFVSVJFIGNvbW1hbmQgdGhhdCB3ZSBkaWQgZWFybGllciwKKwkgKiBvciBhbiBpbmZvcm1hdGlvbiAiZXZlbnQiIGdlbmVyYXRlZCBieSB0aGUgY2FyZAorCSAqIFRoZSBjb250cm9sbGVyIHJldHVybiB0byB1cyBhIHBzZXVkbyBmcmFtZSBjb250YWluaW5nCisJICogdGhlIGluZm9ybWF0aW9uIGluIHF1ZXN0aW9uIC0gSmVhbiBJSSAqLworCWluZm9maWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBJTkZPRklEKTsKKworCS8qIFJlYWQgdGhlIGluZm8gZnJhbWUgaGVhZGVyIC0gZG9uJ3QgdHJ5IHRvbyBoYXJkICovCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmluZm8sIHNpemVvZihpbmZvKSwKKwkJCSAgICAgICBpbmZvZmlkLCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgaW5mbyBmcmFtZS4gIgorCQkgICAgICAgIkZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybjsKKwl9CisJCisJbGVuID0gSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhsZTE2X3RvX2NwdShpbmZvLmxlbikpOworCXR5cGUgPSBsZTE2X3RvX2NwdShpbmZvLnR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBIRVJNRVNfSU5RX1RBTExJRVM6IHsKKwkJc3RydWN0IGhlcm1lc190YWxsaWVzX2ZyYW1lIHRhbGxpZXM7CisJCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCQkKKwkJaWYgKGxlbiA+IHNpemVvZih0YWxsaWVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRhbGxpZXMgZnJhbWUgdG9vIGxvbmcgKCVkIGJ5dGVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxlbik7CisJCQlsZW4gPSBzaXplb2YodGFsbGllcyk7CisJCX0KKwkJCisJCS8qIFJlYWQgZGlyZWN0bHkgdGhlIGRhdGEgKG5vIHNlZWspICovCisJCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfREFUQTEsICh2b2lkICopICZ0YWxsaWVzLAorCQkJCSAgbGVuIC8gMik7IC8qIEZJWE1FOiBibGVjaCEgKi8KKwkJCisJCS8qIEluY3JlbWVudCBvdXIgdmFyaW91cyBjb3VudGVycyAqLworCQkvKiB3c3RhdHMtPmRpc2NhcmQubndpZCAtIG5vIHdyb25nIEJTU0lEIHN0dWZmICovCisJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlICs9CisJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4V0VQVW5kZWNyeXB0YWJsZSk7CisJCWlmIChsZW4gPT0gc2l6ZW9mKHRhbGxpZXMpKSAgCisJCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPQorCQkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuUnhEaXNjYXJkc19XRVBJQ1ZFcnJvcikgKworCQkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuUnhEaXNjYXJkc19XRVBFeGNsdWRlZCk7CisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9CisJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlR4RGlzY2FyZHNXcm9uZ1NBKTsKKwkJd3N0YXRzLT5kaXNjYXJkLmZyYWdtZW50ICs9CisJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4TXNnSW5CYWRNc2dGcmFnbWVudHMpOworCQl3c3RhdHMtPmRpc2NhcmQucmV0cmllcyArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5UeFJldHJ5TGltaXRFeGNlZWRlZCk7CisJCS8qIHdzdGF0cy0+bWlzcy5iZWFjb24gLSBubyBtYXRjaCAqLworCX0KKwlicmVhazsKKwljYXNlIEhFUk1FU19JTlFfTElOS1NUQVRVUzogeworCQlzdHJ1Y3QgaGVybWVzX2xpbmtzdGF0dXMgbGlua3N0YXR1czsKKwkJdTE2IG5ld3N0YXR1czsKKwkJaW50IGNvbm5lY3RlZDsKKworCQlpZiAobGVuICE9IHNpemVvZihsaW5rc3RhdHVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuZXhwZWN0ZWQgc2l6ZSBmb3IgbGlua3N0YXR1cyBmcmFtZSAoJWQgYnl0ZXMpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGVybWVzX3JlYWRfd29yZHMoaHcsIEhFUk1FU19EQVRBMSwgKHZvaWQgKikgJmxpbmtzdGF0dXMsCisJCQkJICBsZW4gLyAyKTsKKwkJbmV3c3RhdHVzID0gbGUxNl90b19jcHUobGlua3N0YXR1cy5saW5rc3RhdHVzKTsKKworCQljb25uZWN0ZWQgPSAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0NPTk5FQ1RFRCkKKwkJCXx8IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQVBfQ0hBTkdFKQorCQkJfHwgKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19BUF9JTl9SQU5HRSk7CisKKwkJaWYgKGNvbm5lY3RlZCkKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCQlpZiAobmV3c3RhdHVzICE9IHByaXYtPmxhc3RfbGlua3N0YXR1cykKKwkJCXByaW50X2xpbmtzdGF0dXMoZGV2LCBuZXdzdGF0dXMpOworCisJCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IG5ld3N0YXR1czsKKwl9CisJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVbmtub3duIGluZm9ybWF0aW9uIGZyYW1lIHJlY2VpdmVkOiAiCisJCSAgICAgICAidHlwZSAweCUwNHgsIGxlbmd0aCAlZFxuIiwgZGV2LT5uYW1lLCB0eXBlLCBsZW4pOworCQkvKiBXZSBkb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBhYm91dCBpdCAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9pbmZkcm9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluZm9ybWF0aW9uIGZyYW1lIGxvc3QuXG4iLCBkZXYtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcm5hbCBoYXJkd2FyZSBjb250cm9sIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBfX29yaW5vY29fdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCisJZXJyID0gX19vcmlub2NvX3Byb2dyYW1fcmlkcyhkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgY29uZmlndXJpbmcgY2FyZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBGaXJlIHRoaW5ncyB1cCBhZ2FpbiAqLworCWhlcm1lc19zZXRfaXJxbWFzayhodywgT1JJTk9DT19JTlRFTik7CisJZXJyID0gaGVybWVzX2VuYWJsZV9wb3J0KGh3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGVuYWJsaW5nIE1BQyBwb3J0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9fb3Jpbm9jb19kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSB7CisJCWlmICghIHByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCkgeworCQkJZXJyID0gaGVybWVzX2Rpc2FibGVfcG9ydChodywgMCk7CisJCQlpZiAoZXJyKSB7CisJCQkJLyogU29tZSBmaXJtd2FyZXMgKGUuZy4gSW50ZXJzaWwgMS4zLngpIHNlZW0KKwkJCQkgKiB0byBoYXZlIHByb2JsZW1zIGRpc2FibGluZyB0aGUgcG9ydCwgb2gKKwkJCQkgKiB3ZWxsLCB0b28gYmFkLiAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciAlZCBkaXNhYmxpbmcgTUFDIHBvcnRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCQlwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQgPSAxOworCQkJfQorCQl9CisJCWhlcm1lc19zZXRfaXJxbWFzayhodywgMCk7CisJCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgMHhmZmZmKTsKKwl9CisJCisJLyogZmlybXdhcmUgd2lsbCBoYXZlIHRvIHJlYXNzb2NpYXRlICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKworCWVyciA9IGhlcm1lc19pbml0KGh3KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwlpZiAoZXJyID09IC1FSU8pIHsKKwkJLyogVHJ5IHdvcmthcm91bmQgZm9yIG9sZCBTeW1ib2wgZmlybXdhcmUgYnVnICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmaXJtd2FyZSBBTExPQyBidWcgZGV0ZWN0ZWQgIgorCQkgICAgICAgIihvbGQgU3ltYm9sIGZpcm13YXJlPykuIFRyeWluZyB0byB3b3JrIGFyb3VuZC4uLiAiLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCisJCXByaXYtPm5pY2J1Zl9zaXplID0gVFhfTklDQlVGX1NJWkVfQlVHOworCQllcnIgPSBoZXJtZXNfYWxsb2NhdGUoaHcsIHByaXYtPm5pY2J1Zl9zaXplLCAmcHJpdi0+dHhmaWQpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKCJmYWlsZWQhXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJvay5cbiIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19vcmlub2NvX2h3X3NldF9iaXRyYXRlKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCisJaWYgKHByaXYtPmJpdHJhdGVtb2RlID49IEJJVFJBVEVfVEFCTEVfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCVUc6IEludmFsaWQgYml0cmF0ZSBtb2RlICVkXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgcHJpdi0+Yml0cmF0ZW1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MLAorCQkJCQkgICBiaXRyYXRlX3RhYmxlW3ByaXYtPmJpdHJhdGVtb2RlXS5hZ2VyZV90eHJhdGVjdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MLAorCQkJCQkgICBiaXRyYXRlX3RhYmxlW3ByaXYtPmJpdHJhdGVtb2RlXS5pbnRlcnNpbF90eHJhdGVjdHJsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogQ2hhbmdlIHRoZSBXRVAga2V5cyBhbmQvb3IgdGhlIGN1cnJlbnQga2V5cy4gIENhbiBiZSBjYWxsZWQKKyAqIGVpdGhlciBmcm9tIF9fb3Jpbm9jb19od19zZXR1cF93ZXAoKSBvciBkaXJlY3RseSBmcm9tCisgKiBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKCkuICBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgYXNzb2NpYXRpb24KKyAqIHdpdGggdGhlIEFQIGlzIG5vdCBicm9rZW4gKGlmIHRoZSBmaXJtd2FyZSBjYW4gaGFuZGxlIGl0KSwKKyAqIHdoaWNoIGlzIG5lZWRlZCBmb3IgODAyLjF4IGltcGxlbWVudGF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgX19vcmlub2NvX2h3X3NldHVwX3dlcGtleXMoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6CisJCWVyciA9IEhFUk1FU19XUklURV9SRUNPUkQoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GV0VQS0VZU19BR0VSRSwKKwkJCQkJICAmcHJpdi0+a2V5cyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GVFhLRVlfQUdFUkUsCisJCQkJCSAgIHByaXYtPnR4X2tleSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJeworCQkJaW50IGtleWxlbjsKKwkJCWludCBpOworCisJCQkvKiBGb3JjZSB1bmlmb3JtIGtleSBsZW5ndGggdG8gd29yayBhcm91bmQgZmlybXdhcmUgYnVncyAqLworCQkJa2V5bGVuID0gbGUxNl90b19jcHUocHJpdi0+a2V5c1twcml2LT50eF9rZXldLmxlbik7CisJCQkKKwkJCWlmIChrZXlsZW4gPiBMQVJHRV9LRVlfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJVRzogS2V5ICVkIGhhcyBvdmVyc2l6ZSBsZW5ndGggJWQuXG4iLAorCQkJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBwcml2LT50eF9rZXksIGtleWxlbik7CisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCX0KKworCQkJLyogV3JpdGUgYWxsIDQga2V5cyAqLworCQkJZm9yKGkgPSAwOyBpIDwgT1JJTk9DT19NQVhfS0VZUzsgaSsrKSB7CisJCQkJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsCisJCQkJCQkgICAgICAgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMCArIGksCisJCQkJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihrZXlsZW4pLAorCQkJCQkJICAgICAgIHByaXYtPmtleXNbaV0uZGF0YSk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KKworCQkJLyogV3JpdGUgdGhlIGluZGV4IG9mIHRoZSBrZXkgdXNlZCBpbiB0cmFuc21pc3Npb24gKi8KKwkJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgIEhFUk1FU19SSURfQ05GV0VQREVGQVVMVEtFWUlELAorCQkJCQkJICAgcHJpdi0+dHhfa2V5KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0dXBfd2VwKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCWludCBtYXN0ZXJfd2VwX2ZsYWc7CisJaW50IGF1dGhfZmxhZzsKKworCWlmIChwcml2LT53ZXBfb24pCisJCV9fb3Jpbm9jb19od19zZXR1cF93ZXBrZXlzKHByaXYpOworCisJaWYgKHByaXYtPndlcF9yZXN0cmljdCkKKwkJYXV0aF9mbGFnID0gSEVSTUVTX0FVVEhfU0hBUkVEX0tFWTsKKwllbHNlCisJCWF1dGhfZmxhZyA9IEhFUk1FU19BVVRIX09QRU47CisKKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6IC8qIEFnZXJlIHN0eWxlIFdFUCAqLworCQlpZiAocHJpdi0+d2VwX29uKSB7CisJCQkvKiBFbmFibGUgdGhlIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24uICovCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0FHRVJFLAorCQkJCQkJICAgYXV0aF9mbGFnKTsKKwkJfQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GV0VQRU5BQkxFRF9BR0VSRSwKKwkJCQkJICAgcHJpdi0+d2VwX29uKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOiAvKiBJbnRlcnNpbCBzdHlsZSBXRVAgKi8KKwljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOiAvKiBTeW1ib2wgc3R5bGUgV0VQICovCisJCWlmIChwcml2LT53ZXBfb24pIHsKKwkJCWlmIChwcml2LT53ZXBfcmVzdHJpY3QgfHwKKwkJCSAgICAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX1NZTUJPTCkpCisJCQkJbWFzdGVyX3dlcF9mbGFnID0gSEVSTUVTX1dFUF9QUklWQUNZX0lOVk9LRUQgfAorCQkJCQkJICBIRVJNRVNfV0VQX0VYQ0xfVU5FTkNSWVBURUQ7CisJCQllbHNlCisJCQkJbWFzdGVyX3dlcF9mbGFnID0gSEVSTUVTX1dFUF9QUklWQUNZX0lOVk9LRUQ7CisKKwkJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT04sCisJCQkJCQkgICBhdXRoX2ZsYWcpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UKKwkJCW1hc3Rlcl93ZXBfZmxhZyA9IDA7CisKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQkJbWFzdGVyX3dlcF9mbGFnIHw9IEhFUk1FU19XRVBfSE9TVF9ERUNSWVBUOworCisJCS8qIE1hc3RlciBXRVAgc2V0dGluZyA6IG9uL29mZiAqLworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GV0VQRkxBR1NfSU5URVJTSUwsCisJCQkJCSAgIG1hc3Rlcl93ZXBfZmxhZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwkKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBpZGJ1ZjsKKworCS8qIFNldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05NQUNBRERSLAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oRVRIX0FMRU4pLCBkZXYtPmRldl9hZGRyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgTUFDIGFkZHJlc3NcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IHVwIHRoZSBsaW5rIG1vZGUgKi8KKwllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUE9SVFRZUEUsCisJCQkJICAgcHJpdi0+cG9ydF90eXBlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgcG9ydCB0eXBlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvKiBTZXQgdGhlIGNoYW5uZWwvZnJlcXVlbmN5ICovCisJaWYgKHByaXYtPmNoYW5uZWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENoYW5uZWwgaXMgMCBpbiBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKClcbiIsIGRldi0+bmFtZSk7CisJCWlmIChwcml2LT5jcmVhdGVpYnNzKQorCQkJcHJpdi0+Y2hhbm5lbCA9IDEwOworCX0KKwllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOQ0hBTk5FTCwKKwkJCQkgICBwcml2LT5jaGFubmVsKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgY2hhbm5lbFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocHJpdi0+aGFzX2lic3MpIHsKKwkJdTE2IGNyZWF0ZWlic3M7CisKKwkJaWYgKChzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkgPT0gMCkgJiYgKHByaXYtPmNyZWF0ZWlic3MpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBmaXJtd2FyZSByZXF1aXJlcyBhbiAiCisJCQkgICAgICAgIkVTU0lEIGluIElCU1MtQWQtSG9jIG1vZGUuXG4iLCBkZXYtPm5hbWUpOworCQkJLyogV2l0aCB3dmxhbl9jcywgaW4gdGhpcyBjYXNlLCB3ZSB3b3VsZCBjcmFzaC4KKwkJCSAqIGhvcGVmdWxseSwgdGhpcyBkcml2ZXIgd2lsbCBiZWhhdmUgYmV0dGVyLi4uCisJCQkgKiBKZWFuIElJICovCisJCQljcmVhdGVpYnNzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZWlic3MgPSBwcml2LT5jcmVhdGVpYnNzOworCQl9CisJCQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GQ1JFQVRFSUJTUywKKwkJCQkJICAgY3JlYXRlaWJzcyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgQ1JFQVRFSUJTU1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogU2V0IHRoZSBkZXNpcmVkIEVTU0lEICovCisJaWRidWYubGVuID0gY3B1X3RvX2xlMTYoc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpKTsKKwltZW1jcHkoJmlkYnVmLnZhbCwgcHJpdi0+ZGVzaXJlZF9lc3NpZCwgc2l6ZW9mKGlkYnVmLnZhbCkpOworCS8qIFdpblhQIHdhbnRzIHBhcnRuZXIgdG8gY29uZmlndXJlIE9XTlNTSUQgZXZlbiBpbiBJQlNTIG1vZGUuIChqaW1jKSAqLworCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTlNTSUQsCisJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkrMiksCisJCQkgICAgICAgJmlkYnVmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgT1dOU1NJRFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GREVTSVJFRFNTSUQsCisJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkrMiksCisJCQkgICAgICAgJmlkYnVmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgREVTSVJFRFNTSURcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IHRoZSBzdGF0aW9uIG5hbWUgKi8KKwlpZGJ1Zi5sZW4gPSBjcHVfdG9fbGUxNihzdHJsZW4ocHJpdi0+bmljaykpOworCW1lbWNweSgmaWRidWYudmFsLCBwcml2LT5uaWNrLCBzaXplb2YoaWRidWYudmFsKSk7CisJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTkFNRSwKKwkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5uaWNrKSsyKSwKKwkJCSAgICAgICAmaWRidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBuaWNrbmFtZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgQVAgZGVuc2l0eSAqLworCWlmIChwcml2LT5oYXNfc2Vuc2l0aXZpdHkpIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlNZU1RFTVNDQUxFLAorCQkJCQkgICBwcml2LT5hcF9kZW5zaXR5KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yICVkIHNldHRpbmcgU1lTVEVNU0NBTEUuICAiCisJCQkgICAgICAgIkRpc2FibGluZyBzZW5zaXRpdml0eSBjb250cm9sXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKworCQkJcHJpdi0+aGFzX3NlbnNpdGl2aXR5ID0gMDsKKwkJfQorCX0KKworCS8qIFNldCBSVFMgdGhyZXNob2xkICovCisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRCwKKwkJCQkgICBwcml2LT5ydHNfdGhyZXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgUlRTIHRocmVzaG9sZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgb3IgTVdPIHJvYnVzdG5lc3MgKi8KKwlpZiAocHJpdi0+aGFzX213bykKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORk1XT1JPQlVTVF9BR0VSRSwKKwkJCQkJICAgcHJpdi0+bXdvX3JvYnVzdCk7CisJZWxzZQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRCwKKwkJCQkJICAgcHJpdi0+ZnJhZ190aHJlc2gpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBmcmFnbWVudGF0aW9uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCBiaXRyYXRlICovCisJZXJyID0gX19vcmlub2NvX2h3X3NldF9iaXRyYXRlKHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBiaXRyYXRlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCBwb3dlciBtYW5hZ2VtZW50ICovCisJaWYgKHByaXYtPmhhc19wbSkgeworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUE1FTkFCTEVELAorCQkJCQkgICBwcml2LT5wbV9vbik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgdXAgUE1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZNVUxUSUNBU1RSRUNFSVZFLAorCQkJCQkgICBwcml2LT5wbV9tY2FzdCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgdXAgUE1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GTUFYU0xFRVBEVVJBVElPTiwKKwkJCQkJICAgcHJpdi0+cG1fcGVyaW9kKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyB1cCBQTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04sCisJCQkJCSAgIHByaXYtPnBtX3RpbWVvdXQpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgcHJlYW1ibGUgLSBvbmx5IGZvciBTeW1ib2wgc28gZmFyLi4uICovCisJaWYgKHByaXYtPmhhc19wcmVhbWJsZSkgeworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUFJFQU1CTEVfU1lNQk9MLAorCQkJCQkgICBwcml2LT5wcmVhbWJsZSk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgcHJlYW1ibGVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIFNldCB1cCBlbmNyeXB0aW9uICovCisJaWYgKHByaXYtPmhhc193ZXApIHsKKwkJZXJyID0gX19vcmlub2NvX2h3X3NldHVwX3dlcChwcml2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgYWN0aXZhdGluZyBXRVBcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIFNldCBwcm9taXNjdWl0eSAvIG11bHRpY2FzdCovCisJcHJpdi0+cHJvbWlzY3VvdXMgPSAwOworCXByaXYtPm1jX2NvdW50ID0gMDsKKwlfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KGRldik7IC8qIEZJWE1FOiB3aGF0IGFib3V0IHRoZSB4bWl0X2xvY2sgKi8KKworCXJldHVybiAwOworfQorCisvKiBGSVhNRTogcmV0dXJuIGludD8gKi8KK3N0YXRpYyB2b2lkCitfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCWludCBwcm9taXNjLCBtY19jb3VudDsKKworCS8qIFRoZSBIZXJtZXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW4gYWxsbXVsdGkgbW9kZSwgc28gd2UgZ28KKwkgKiBpbnRvIHByb21pc2N1b3VzIG1vZGUgYW5kIGxldCB0aGUgdXBwZXIgbGV2ZWxzIGRlYWwuICovCisJaWYgKCAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkgICAgIChkZXYtPm1jX2NvdW50ID4gTUFYX01VTFRJQ0FTVChwcml2KSkgKSB7CisJCXByb21pc2MgPSAxOworCQltY19jb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJcHJvbWlzYyA9IDA7CisJCW1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKwl9CisKKwlpZiAocHJvbWlzYyAhPSBwcml2LT5wcm9taXNjdW91cykgeworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUFJPTUlTQ1VPVVNNT0RFLAorCQkJCQkgICBwcm9taXNjKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBQUk9NSVNDVU9VU01PREUgdG8gMS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQl9IGVsc2UgCisJCQlwcml2LT5wcm9taXNjdW91cyA9IHByb21pc2M7CisJfQorCisJaWYgKCEgcHJvbWlzYyAmJiAobWNfY291bnQgfHwgcHJpdi0+bWNfY291bnQpICkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKnAgPSBkZXYtPm1jX2xpc3Q7CisJCXN0cnVjdCBoZXJtZXNfbXVsdGljYXN0IG1jbGlzdDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG1jX2NvdW50OyBpKyspIHsKKwkJCS8qIHBhcmFub2lhOiBpcyBsaXN0IHNob3J0ZXIgdGhhbiBtY19jb3VudD8gKi8KKwkJCUJVR19PTighIHApOworCQkJLyogcGFyYW5vaWE6IGJhZCBhZGRyZXNzIHNpemUgaW4gbGlzdD8gKi8KKwkJCUJVR19PTihwLT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTik7CisJCQkKKwkJCW1lbWNweShtY2xpc3QuYWRkcltpXSwgcC0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKwkJCXAgPSBwLT5uZXh0OworCQl9CisJCQorCQlpZiAocCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNdWx0aWNhc3QgbGlzdCBpcyAiCisJCQkgICAgICAgImxvbmdlciB0aGFuIG1jX2NvdW50XG4iLCBkZXYtPm5hbWUpOworCisJCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkdST1VQQUREUkVTU0VTLAorCQkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKHByaXYtPm1jX2NvdW50ICogRVRIX0FMRU4pLAorCQkJCSAgICAgICAmbWNsaXN0KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgbXVsdGljYXN0IGxpc3QuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJZWxzZQorCQkJcHJpdi0+bWNfY291bnQgPSBtY19jb3VudDsKKwl9CisKKwkvKiBTaW5jZSB3ZSBjYW4gc2V0IHRoZSBwcm9taXNjdW91cyBmbGFnIHdoZW4gaXQgd2Fzbid0IGFza2VkCisJICAgZm9yLCBtYWtlIHN1cmUgdGhlIG5ldF9kZXZpY2Uga25vd3MgYWJvdXQgaXQuICovCisJaWYgKHByaXYtPnByb21pc2N1b3VzKQorCQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCWVsc2UKKwkJZGV2LT5mbGFncyAmPSB+SUZGX1BST01JU0M7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19yZWNvbmZpZ3VyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlpZiAocHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0KSB7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkJCisJZXJyID0gaGVybWVzX2Rpc2FibGVfcG9ydChodywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGRpc2FibGUgcG9ydCB3aGlsZSByZWNvbmZpZ3VyaW5nIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIHJlY29uZmlndXJlIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZXJtZXNfZW5hYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBlbmFibGUgcG9ydCB3aGlsZSByZWNvbmZpZ3VyaW5nIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXR0aW5nIGluc3RlYWQuLi5cbiIsIGRldi0+bmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQllcnIgPSAwOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKKworfQorCisvKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb250ZXh0LCB3aXRob3V0IGxvY2tzIGhlbGQgLSB1c2UKKyAqIHNjaGVkdWxlX3dvcmsoKSAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJLyogV2hlbiB0aGUgaGFyZHdhcmUgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4sIHdoYXRldmVyCisJCSAqIGRldGVjdHMgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmUtaW5pdGlhbGl6aW5nCisJCSAqIGl0LiBTbyBubyBuZWVkIGZvciBhbnl0aGluZyBmdXJ0aGVyICovCisJCXJldHVybjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFNodXQgb2ZmIGludGVycnVwdHMuICBEZXBlbmRpbmcgb24gd2hhdCBzdGF0ZSB0aGUgaGFyZHdhcmUKKwkgKiBpcyBpbiwgdGhpcyBtaWdodCBub3Qgd29yaywgYnV0IHdlJ2xsIHRyeSBhbnl3YXkgKi8KKwloZXJtZXNfc2V0X2lycW1hc2soaHcsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgMHhmZmZmKTsKKworCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOyAvKiBmaXJtd2FyZSB3aWxsIGhhdmUgdG8gcmVhc3NvY2lhdGUgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChwcml2LT5oYXJkX3Jlc2V0KQorCQllcnIgPSAoKnByaXYtPmhhcmRfcmVzZXQpKHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Jpbm9jb19yZXNldDogRXJyb3IgJWQgIgorCQkgICAgICAgInBlcmZvcm1pbmcgIGhhcmQgcmVzZXRcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJLyogRklYTUU6IHNodXRkb3duIG9mIHNvbWUgc29ydCAqLworCQlyZXR1cm47CisJfQorCisJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9yaW5vY29fcmVzZXQ6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOyAvKiBUaGlzIGhhcyB0byBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQgKi8KKworCXByaXYtPmh3X3VuYXZhaWxhYmxlLS07CisKKwkvKiBwcml2LT5vcGVuIG9yIHByaXYtPmh3X3VuYXZhaWxhYmxlIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGlsZQorCSAqIHdlIGRyb3BwZWQgdGhlIGxvY2sgKi8KKwlpZiAocHJpdi0+b3BlbiAmJiAoISBwcml2LT5od191bmF2YWlsYWJsZSkpIHsKKwkJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9yaW5vY29fcmVzZXQ6IEVycm9yICVkIHJlZW5hYmxpbmcgY2FyZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCX0gZWxzZQorCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfdGljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUSUNLXG4iLCBkZXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfd3RlcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCS8qIFRoaXMgc2VlbXMgdG8gaGFwcGVuIGEgZmFpciBiaXQgdW5kZXIgbG9hZCwgYnV0IGlnbm9yaW5nIGl0CisJICAgc2VlbXMgdG8gd29yayBmaW5lLi4uKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1BQyBjb250cm9sbGVyIGVycm9yIChXVEVSUikuIElnbm9yaW5nLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKK30KKworaXJxcmV0dXJuX3Qgb3Jpbm9jb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgY291bnQgPSBNQVhfSVJRTE9PUFNfUEVSX0lSUTsKKwl1MTYgZXZzdGF0LCBldmVudHM7CisJLyogVGhlc2UgYXJlIHVzZWQgdG8gZGV0ZWN0IGEgcnVuYXdheSBpbnRlcnJ1cHQgc2l0dWF0aW9uICovCisJLyogSWYgd2UgZ2V0IG1vcmUgdGhhbiBNQVhfSVJRTE9PUFNfUEVSX0pJRkZZIGl0ZXJhdGlvbnMgaW4gYSBqaWZmeSwKKwkgKiB3ZSBwYW5pYyBhbmQgc2h1dCBkb3duIHRoZSBoYXJkd2FyZSAqLworCXN0YXRpYyBpbnQgbGFzdF9pcnFfamlmZnkgPSAwOyAvKiBqaWZmaWVzIHZhbHVlIHRoZSBsYXN0IHRpbWUKKwkJCQkJKiB3ZSB3ZXJlIGNhbGxlZCAqLworCXN0YXRpYyBpbnQgbG9vcHNfdGhpc19qaWZmeSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKSB7CisJCS8qIElmIGh3IGlzIHVuYXZhaWxhYmxlIC0gd2UgZG9uJ3Qga25vdyBpZiB0aGUgaXJxIHdhcworCQkgKiBmb3IgdXMgb3Igbm90ICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlldnN0YXQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWV2ZW50cyA9IGV2c3RhdCAmIGh3LT5pbnRlbjsKKwlpZiAoISBldmVudHMpIHsKKwkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwkKKwlpZiAoamlmZmllcyAhPSBsYXN0X2lycV9qaWZmeSkKKwkJbG9vcHNfdGhpc19qaWZmeSA9IDA7CisJbGFzdF9pcnFfamlmZnkgPSBqaWZmaWVzOworCisJd2hpbGUgKGV2ZW50cyAmJiBjb3VudC0tKSB7CisJCWlmICgrK2xvb3BzX3RoaXNfamlmZnkgPiBNQVhfSVJRTE9PUFNfUEVSX0pJRkZZKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSVJRIGhhbmRsZXIgaXMgbG9vcGluZyB0b28gIgorCQkJICAgICAgICJtdWNoISBSZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZvciBub3cgKi8KKwkJCWhlcm1lc19zZXRfaXJxbWFzayhodywgMCk7CisJCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ2hlY2sgdGhlIGNhcmQgaGFzbid0IGJlZW4gcmVtb3ZlZCAqLworCQlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJCURFQlVHKDAsICJvcmlub2NvX2ludGVycnVwdCgpOiBjYXJkIHJlbW92ZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX1RJQ0spCisJCQlfX29yaW5vY29fZXZfdGljayhkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9XVEVSUikKKwkJCV9fb3Jpbm9jb19ldl93dGVycihkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9JTkZEUk9QKQorCQkJX19vcmlub2NvX2V2X2luZmRyb3AoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfSU5GTykKKwkJCV9fb3Jpbm9jb19ldl9pbmZvKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX1JYKQorCQkJX19vcmlub2NvX2V2X3J4KGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX1RYRVhDKQorCQkJX19vcmlub2NvX2V2X3R4ZXhjKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX1RYKQorCQkJX19vcmlub2NvX2V2X3R4KGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX0FMTE9DKQorCQkJX19vcmlub2NvX2V2X2FsbG9jKGRldiwgaHcpOworCQkKKwkJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBldmVudHMpOworCisJCWV2c3RhdCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJCWV2ZW50cyA9IGV2c3RhdCAmIGh3LT5pbnRlbjsKKwl9OworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGNvbXBfaWQgeworCXUxNiBpZCwgdmFyaWFudCwgbWFqb3IsIG1pbm9yOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgZnd0eXBlX3QgZGV0ZXJtaW5lX2Zpcm13YXJlX3R5cGUoc3RydWN0IGNvbXBfaWQgKm5pY19pZCkKK3sKKwlpZiAobmljX2lkLT5pZCA8IDB4ODAwMCkKKwkJcmV0dXJuIEZJUk1XQVJFX1RZUEVfQUdFUkU7CisJZWxzZSBpZiAobmljX2lkLT5pZCA9PSAweDgwMDAgJiYgbmljX2lkLT5tYWpvciA9PSAwKQorCQlyZXR1cm4gRklSTVdBUkVfVFlQRV9TWU1CT0w7CisJZWxzZQorCQlyZXR1cm4gRklSTVdBUkVfVFlQRV9JTlRFUlNJTDsKK30KKworLyogU2V0IHByaXYtPmZpcm13YXJlIHR5cGUsIGRldGVybWluZSBmaXJtd2FyZSBwcm9wZXJ0aWVzICovCitzdGF0aWMgaW50IGRldGVybWluZV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCXN0cnVjdCBjb21wX2lkIG5pY19pZCwgc3RhX2lkOworCXVuc2lnbmVkIGludCBmaXJtdmVyOworCWNoYXIgdG1wW1NZTUJPTF9NQVhfVkVSX0xFTisxXTsKKworCS8qIEdldCB0aGUgaGFyZHdhcmUgdmVyc2lvbiAqLworCWVyciA9IEhFUk1FU19SRUFEX1JFQ09SRChodywgVVNFUl9CQVAsIEhFUk1FU19SSURfTklDSUQsICZuaWNfaWQpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlYWQgaGFyZHdhcmUgaWRlbnRpdHk6IGVycm9yICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWxlMTZfdG9fY3B1cygmbmljX2lkLmlkKTsKKwlsZTE2X3RvX2NwdXMoJm5pY19pZC52YXJpYW50KTsKKwlsZTE2X3RvX2NwdXMoJm5pY19pZC5tYWpvcik7CisJbGUxNl90b19jcHVzKCZuaWNfaWQubWlub3IpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogSGFyZHdhcmUgaWRlbnRpdHkgJTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBuaWNfaWQuaWQsIG5pY19pZC52YXJpYW50LAorCSAgICAgICBuaWNfaWQubWFqb3IsIG5pY19pZC5taW5vcik7CisKKwlwcml2LT5maXJtd2FyZV90eXBlID0gZGV0ZXJtaW5lX2Zpcm13YXJlX3R5cGUoJm5pY19pZCk7CisKKwkvKiBHZXQgdGhlIGZpcm13YXJlIHZlcnNpb24gKi8KKwllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX1NUQUlELCAmc3RhX2lkKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWFkIHN0YXRpb24gaWRlbnRpdHk6IGVycm9yICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWxlMTZfdG9fY3B1cygmc3RhX2lkLmlkKTsKKwlsZTE2X3RvX2NwdXMoJnN0YV9pZC52YXJpYW50KTsKKwlsZTE2X3RvX2NwdXMoJnN0YV9pZC5tYWpvcik7CisJbGUxNl90b19jcHVzKCZzdGFfaWQubWlub3IpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogU3RhdGlvbiBpZGVudGl0eSAgJTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBzdGFfaWQuaWQsIHN0YV9pZC52YXJpYW50LAorCSAgICAgICBzdGFfaWQubWFqb3IsIHN0YV9pZC5taW5vcik7CisKKwlzd2l0Y2ggKHN0YV9pZC5pZCkgeworCWNhc2UgMHgxNToKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUHJpbWFyeSBmaXJtd2FyZSBpcyBhY3RpdmVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIDB4MTRiOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUZXJ0aWFyeSBmaXJtd2FyZSBpcyBhY3RpdmVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIDB4MWY6CS8qIEludGVyc2lsLCBBZ2VyZSwgU3ltYm9sIFNwZWN0cnVtMjQgKi8KKwljYXNlIDB4MjE6CS8qIFN5bWJvbCBTcGVjdHJ1bTI0IFRyaWxvZ3kgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5rbm93biBzdGF0aW9uIElELCBwbGVhc2UgcmVwb3J0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJLyogRGVmYXVsdCBjYXBhYmlsaXRpZXMgKi8KKwlwcml2LT5oYXNfc2Vuc2l0aXZpdHkgPSAxOworCXByaXYtPmhhc19td28gPSAwOworCXByaXYtPmhhc19wcmVhbWJsZSA9IDA7CisJcHJpdi0+aGFzX3BvcnQzID0gMTsKKwlwcml2LT5oYXNfaWJzcyA9IDE7CisJcHJpdi0+aGFzX3dlcCA9IDA7CisJcHJpdi0+aGFzX2JpZ193ZXAgPSAwOworCisJLyogRGV0ZXJtaW5lIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBmaXJtd2FyZSB2ZXJzaW9uICovCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQkvKiBMdWNlbnQgV2F2ZWxhbiBJRUVFLCBMdWNlbnQgT3Jpbm9jbywgQ2FibGV0cm9uIFJvYW1BYm91dCwKKwkJICAgRUxTQSwgTWVsY28sIEhQLCBJQk0sIERlbGwgMTE1MCwgQ29tcGFxIDExMC8yMTAgKi8KKwkJc25wcmludGYocHJpdi0+ZndfbmFtZSwgc2l6ZW9mKHByaXYtPmZ3X25hbWUpIC0gMSwKKwkJCSAiTHVjZW50L0FnZXJlICVkLiUwMmQiLCBzdGFfaWQubWFqb3IsIHN0YV9pZC5taW5vcik7CisKKwkJZmlybXZlciA9ICgodW5zaWduZWQgbG9uZylzdGFfaWQubWFqb3IgPDwgMTYpIHwgc3RhX2lkLm1pbm9yOworCisJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHg2MDAwNik7CisJCXByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDQwMDIwKTsKKwkJcHJpdi0+aGFzX2JpZ193ZXAgPSAxOyAvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyAtIGhvdyBkbyB3ZSB0ZWxsCisJCQkJCSAgR29sZCBjYXJkcyBmcm9tIHRoZSBvdGhlcnM/ICovCisJCXByaXYtPmhhc19td28gPSAoZmlybXZlciA+PSAweDYwMDAwKTsKKwkJcHJpdi0+aGFzX3BtID0gKGZpcm12ZXIgPj0gMHg0MDAyMCk7IC8qIERvbid0IHdvcmsgaW4gNy41MiA/ICovCisJCXByaXYtPmlic3NfcG9ydCA9IDE7CisKKwkJLyogVGVzdGVkIHdpdGggQWdlcmUgZmlybXdhcmUgOgorCQkgKgkxLjE2IDsgNC4wOCA7IDQuNTIgOyA2LjA0IDsgNi4xNiA7IDcuMjggPT4gSmVhbiBJSQorCQkgKiBUZXN0ZWQgQ2FibGVUcm9uIGZpcm13YXJlIDogNC4zMiA9PiBBbnRvbiAqLworCQlicmVhazsKKwljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOgorCQkvKiBTeW1ib2wgLCAzQ29tIEFpckNvbm5lY3QsIEludGVsLCBFcmljc3NvbiBXTEFOICovCisJCS8qIEludGVsIE1BQyA6IDAwOjAyOkIzOiogKi8KKwkJLyogM0NvbSBNQUMgOiAwMDo1MDpEQToqICovCisJCW1lbXNldCh0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJLyogR2V0IHRoZSBTeW1ib2wgZmlybXdhcmUgdmVyc2lvbiAqLworCQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLAorCQkJCSAgICAgIEhFUk1FU19SSURfU0VDT05EQVJZVkVSU0lPTl9TWU1CT0wsCisJCQkJICAgICAgU1lNQk9MX01BWF9WRVJfTEVOLCBOVUxMLCAmdG1wKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogRXJyb3IgJWQgcmVhZGluZyBTeW1ib2wgZmlybXdhcmUgaW5mby4gV2lsZGx5IGd1ZXNzaW5nIGNhcGFiaWxpdGllcy4uLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlmaXJtdmVyID0gMDsKKwkJCXRtcFswXSA9ICdcMCc7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgZmlybXdhcmUgcmV2aXNpb24gaXMgYSBzdHJpbmcsIHRoZSBmb3JtYXQgaXMKKwkJCSAqIHNvbWV0aGluZyBsaWtlIDogIlYyLjIwLTAxIi4KKwkJCSAqIFF1aWNrIGFuZCBkaXJ0eSBwYXJzaW5nLi4uIC0gSmVhbiBJSQorCQkJICovCisJCQlmaXJtdmVyID0gKCh0bXBbMV0gLSAnMCcpIDw8IDE2KSB8ICgodG1wWzNdIC0gJzAnKSA8PCAxMikKKwkJCQl8ICgodG1wWzRdIC0gJzAnKSA8PCA4KSB8ICgodG1wWzZdIC0gJzAnKSA8PCA0KQorCQkJCXwgKHRtcFs3XSAtICcwJyk7CisKKwkJCXRtcFtTWU1CT0xfTUFYX1ZFUl9MRU5dID0gJ1wwJzsKKwkJfQorCisJCXNucHJpbnRmKHByaXYtPmZ3X25hbWUsIHNpemVvZihwcml2LT5md19uYW1lKSAtIDEsCisJCQkgIlN5bWJvbCAlcyIsIHRtcCk7CisKKwkJcHJpdi0+aGFzX2lic3MgPSAoZmlybXZlciA+PSAweDIwMDAwKTsKKwkJcHJpdi0+aGFzX3dlcCA9IChmaXJtdmVyID49IDB4MTUwMTIpOworCQlwcml2LT5oYXNfYmlnX3dlcCA9IChmaXJtdmVyID49IDB4MjAwMDApOworCQlwcml2LT5oYXNfcG0gPSAoZmlybXZlciA+PSAweDIwMDAwICYmIGZpcm12ZXIgPCAweDIyMDAwKSB8fCAKKwkJCSAgICAgICAoZmlybXZlciA+PSAweDI5MDAwICYmIGZpcm12ZXIgPCAweDMwMDAwKSB8fAorCQkJICAgICAgIGZpcm12ZXIgPj0gMHgzMTAwMDsKKwkJcHJpdi0+aGFzX3ByZWFtYmxlID0gKGZpcm12ZXIgPj0gMHgyMDAwMCk7CisJCXByaXYtPmlic3NfcG9ydCA9IDQ7CisJCS8qIFRlc3RlZCB3aXRoIEludGVsIGZpcm13YXJlIDogMHgyMDAxNSA9PiBKZWFuIElJICovCisJCS8qIFRlc3RlZCB3aXRoIDNDb20gZmlybXdhcmUgOiAweDE1MDEyICYgMHgyMjAwMSA9PiBKZWFuIElJICovCisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwkJLyogRC1MaW5rLCBMaW5rc3lzLCBBZHRyb24sIFpvb21BaXIsIGFuZCBtYW55IG90aGVycy4uLgorCQkgKiBTYW1zdW5nLCBDb21wYXEgMTAwLzIwMCBhbmQgUHJveGltIGFyZSBzbGlnaHRseQorCQkgKiBkaWZmZXJlbnQgYW5kIGxlc3Mgd2VsbCB0ZXN0ZWQgKi8KKwkJLyogRC1MaW5rIE1BQyA6IDAwOjQwOjA1OiogKi8KKwkJLyogQWRkdHJvbiBNQUMgOiAwMDo5MDpEMToqICovCisJCXNucHJpbnRmKHByaXYtPmZ3X25hbWUsIHNpemVvZihwcml2LT5md19uYW1lKSAtIDEsCisJCQkgIkludGVyc2lsICVkLiVkLiVkIiwgc3RhX2lkLm1ham9yLCBzdGFfaWQubWlub3IsCisJCQkgc3RhX2lkLnZhcmlhbnQpOworCisJCWZpcm12ZXIgPSAoKHVuc2lnbmVkIGxvbmcpc3RhX2lkLm1ham9yIDw8IDE2KSB8CisJCQkoKHVuc2lnbmVkIGxvbmcpc3RhX2lkLm1pbm9yIDw8IDgpIHwgc3RhX2lkLnZhcmlhbnQ7CisKKwkJcHJpdi0+aGFzX2lic3MgPSAoZmlybXZlciA+PSAweDAwMDcwMCk7IC8qIEZJWE1FICovCisJCXByaXYtPmhhc19iaWdfd2VwID0gcHJpdi0+aGFzX3dlcCA9IChmaXJtdmVyID49IDB4MDAwODAwKTsKKwkJcHJpdi0+aGFzX3BtID0gKGZpcm12ZXIgPj0gMHgwMDA3MDApOworCisJCWlmIChmaXJtdmVyID49IDB4MDAwODAwKQorCQkJcHJpdi0+aWJzc19wb3J0ID0gMDsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBJbnRlcnNpbCBmaXJtd2FyZSBlYXJsaWVyICIKKwkJCSAgICAgICAidGhhbiB2MC44LnggLSBzZXZlcmFsIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXByaXYtPmlic3NfcG9ydCA9IDE7CisJCX0KKwkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICIlczogRmlybXdhcmUgZGV0ZXJtaW5lZCBhcyAlc1xuIiwgZGV2LT5uYW1lLAorCSAgICAgICBwcml2LT5md19uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIG5pY2tidWY7CisJdTE2IHJlY2xlbjsKKwlpbnQgbGVuOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCS8qIE5vIG5lZWQgdG8gbG9jaywgdGhlIGh3X3VuYXZhaWxhYmxlIGZsYWcgaXMgYWxyZWFkeSBzZXQgaW4KKwkgKiBhbGxvY19vcmlub2NvZGV2KCkgKi8KKwlwcml2LT5uaWNidWZfc2l6ZSA9IElFRUU4MDJfMTFfRlJBTUVfTEVOICsgRVRIX0hMRU47CisKKwkvKiBJbml0aWFsaXplIHRoZSBmaXJtd2FyZSAqLworCWVyciA9IGhlcm1lc19pbml0KGh3KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGluaXRpYWxpemUgZmlybXdhcmUgKGVyciA9ICVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gZGV0ZXJtaW5lX2Zpcm13YXJlKGRldik7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluY29tcGF0aWJsZSBmaXJtd2FyZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHJpdi0+aGFzX3BvcnQzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFkLWhvYyBkZW1vIG1vZGUgc3VwcG9ydGVkXG4iLCBkZXYtPm5hbWUpOworCWlmIChwcml2LT5oYXNfaWJzcykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJRUVFIHN0YW5kYXJkIElCU1MgYWQtaG9jIG1vZGUgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwlpZiAocHJpdi0+aGFzX3dlcCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdFUCBzdXBwb3J0ZWQsICIsIGRldi0+bmFtZSk7CisJCWlmIChwcml2LT5oYXNfYmlnX3dlcCkKKwkJCXByaW50aygiMTA0LWJpdCBrZXlcbiIpOworCQllbHNlCisJCQlwcmludGsoIjQwLWJpdCBrZXlcbiIpOworCX0KKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk1BQ0FERFIsCisJCQkgICAgICBFVEhfQUxFTiwgTlVMTCwgZGV2LT5kZXZfYWRkcik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3MhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNQUMgYWRkcmVzcyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIEdldCB0aGUgc3RhdGlvbiBuYW1lICovCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05OQU1FLAorCQkJICAgICAgc2l6ZW9mKG5pY2tidWYpLCAmcmVjbGVuLCAmbmlja2J1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBzdGF0aW9uIG5hbWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKG5pY2tidWYubGVuKQorCQlsZW4gPSBtaW4oSVdfRVNTSURfTUFYX1NJWkUsIChpbnQpbGUxNl90b19jcHUobmlja2J1Zi5sZW4pKTsKKwllbHNlCisJCWxlbiA9IG1pbihJV19FU1NJRF9NQVhfU0laRSwgMiAqIHJlY2xlbik7CisJbWVtY3B5KHByaXYtPm5pY2ssICZuaWNrYnVmLnZhbCwgbGVuKTsKKwlwcml2LT5uaWNrW2xlbl0gPSAnXDAnOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTdGF0aW9uIG5hbWUgXCIlc1wiXG4iLCBkZXYtPm5hbWUsIHByaXYtPm5pY2spOworCisJLyogR2V0IGFsbG93ZWQgY2hhbm5lbHMgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DSEFOTkVMTElTVCwKKwkJCQkgICZwcml2LT5jaGFubmVsX21hc2spOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgY2hhbm5lbCBsaXN0IVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdldCBpbml0aWFsIEFQIGRlbnNpdHkgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRSwKKwkJCQkgICZwcml2LT5hcF9kZW5zaXR5KTsKKwlpZiAoZXJyIHx8IHByaXYtPmFwX2RlbnNpdHkgPCAxIHx8IHByaXYtPmFwX2RlbnNpdHkgPiAzKSB7CisJCXByaXYtPmhhc19zZW5zaXRpdml0eSA9IDA7CisJfQorCisJLyogR2V0IGluaXRpYWwgUlRTIHRocmVzaG9sZCAqLworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRCwKKwkJCQkgICZwcml2LT5ydHNfdGhyZXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIFJUUyB0aHJlc2hvbGQhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogR2V0IGluaXRpYWwgZnJhZ21lbnRhdGlvbiBzZXR0aW5ncyAqLworCWlmIChwcml2LT5oYXNfbXdvKQorCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORk1XT1JPQlVTVF9BR0VSRSwKKwkJCQkJICAmcHJpdi0+bXdvX3JvYnVzdCk7CisJZWxzZQorCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJCQkgICZwcml2LT5mcmFnX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBmcmFnbWVudGF0aW9uIHNldHRpbmdzIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFBvd2VyIG1hbmFnZW1lbnQgc2V0dXAgKi8KKwlpZiAocHJpdi0+aGFzX3BtKSB7CisJCXByaXYtPnBtX29uID0gMDsKKwkJcHJpdi0+cG1fbWNhc3QgPSAxOworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sCisJCQkJCSAgJnByaXYtPnBtX3BlcmlvZCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIHBvd2VyIG1hbmFnZW1lbnQgcGVyaW9kIVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04sCisJCQkJCSAgJnByaXYtPnBtX3RpbWVvdXQpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBwb3dlciBtYW5hZ2VtZW50IHRpbWVvdXQhXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIFByZWFtYmxlIHNldHVwICovCisJaWYgKHByaXYtPmhhc19wcmVhbWJsZSkgeworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORlBSRUFNQkxFX1NZTUJPTCwKKwkJCQkJICAmcHJpdi0+cHJlYW1ibGUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCQkKKwkvKiBTZXQgdXAgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCS8qIEJ5IGRlZmF1bHQgdXNlIElFRUUvSUJTUyBhZC1ob2MgbW9kZSBpZiB3ZSBoYXZlIGl0ICovCisJcHJpdi0+cHJlZmVyX3BvcnQzID0gcHJpdi0+aGFzX3BvcnQzICYmICghIHByaXYtPmhhc19pYnNzKTsKKwlzZXRfcG9ydF90eXBlKHByaXYpOworCXByaXYtPmNoYW5uZWwgPSAxMDsgLyogZGVmYXVsdCBjaGFubmVsLCBtb3JlLW9yLWxlc3MgYXJiaXRyYXJ5ICovCisKKwlwcml2LT5wcm9taXNjdW91cyA9IDA7CisJcHJpdi0+d2VwX29uID0gMDsKKwlwcml2LT50eF9rZXkgPSAwOworCisJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwlpZiAoZXJyID09IC1FSU8pIHsKKwkJLyogVHJ5IHdvcmthcm91bmQgZm9yIG9sZCBTeW1ib2wgZmlybXdhcmUgYnVnICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmaXJtd2FyZSBBTExPQyBidWcgZGV0ZWN0ZWQgIgorCQkgICAgICAgIihvbGQgU3ltYm9sIGZpcm13YXJlPykuIFRyeWluZyB0byB3b3JrIGFyb3VuZC4uLiAiLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCisJCXByaXYtPm5pY2J1Zl9zaXplID0gVFhfTklDQlVGX1NJWkVfQlVHOworCQllcnIgPSBoZXJtZXNfYWxsb2NhdGUoaHcsIHByaXYtPm5pY2J1Zl9zaXplLCAmcHJpdi0+dHhmaWQpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKCJmYWlsZWQhXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJvay5cbiIpOworCX0KKwlpZiAoZXJyKSB7CisJCXByaW50aygiJXM6IEVycm9yICVkIGFsbG9jYXRpbmcgVHggYnVmZmVyXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE1ha2UgdGhlIGhhcmR3YXJlIGF2YWlsYWJsZSwgYXMgbG9uZyBhcyBpdCBoYXNuJ3QgYmVlbgorCSAqIHJlbW92ZWQgZWxzZXdoZXJlIChlLmcuIGJ5IFBDTUNJQSBob3QgdW5wbHVnKSAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCXByaXYtPmh3X3VuYXZhaWxhYmxlLS07CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVhZHlcbiIsIGRldi0+bmFtZSk7CisKKyBvdXQ6CisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19vcmlub2NvZGV2KGludCBzaXplb2ZfY2FyZCwKKwkJCQkgICAgaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSkgKyBzaXplb2ZfY2FyZCk7CisJaWYgKCEgZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5uZGV2ID0gZGV2OworCWlmIChzaXplb2ZfY2FyZCkKKwkJcHJpdi0+Y2FyZCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5ldGRldl9wcml2KGRldikKKwkJCQkgICAgICArIHNpemVvZihzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlKSk7CisJZWxzZQorCQlwcml2LT5jYXJkID0gTlVMTDsKKworCS8qIFNldHVwIC8gb3ZlcnJpZGUgbmV0X2RldmljZSBmaWVsZHMgKi8KKwlkZXYtPmluaXQgPSBvcmlub2NvX2luaXQ7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBvcmlub2NvX3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gb3Jpbm9jb190eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsgLyogMSBzZWNvbmQgdGltZW91dCAqLworCWRldi0+Z2V0X3N0YXRzID0gb3Jpbm9jb19nZXRfc3RhdHM7CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBvcmlub2NvX2dldF93aXJlbGVzc19zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gb3Jpbm9jb19pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBvcmlub2NvX2NoYW5nZV9tdHU7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBvcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdDsKKwkvKiB3ZSB1c2UgdGhlIGRlZmF1bHQgZXRoX21hY19hZGRyIGZvciBzZXR0aW5nIHRoZSBNQUMgYWRkciAqLworCisJLyogU2V0IHVwIGRlZmF1bHQgY2FsbGJhY2tzICovCisJZGV2LT5vcGVuID0gb3Jpbm9jb19vcGVuOworCWRldi0+c3RvcCA9IG9yaW5vY29fc3RvcDsKKwlwcml2LT5oYXJkX3Jlc2V0ID0gaGFyZF9yZXNldDsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5vcGVuID0gMDsKKwlwcml2LT5od191bmF2YWlsYWJsZSA9IDE7IC8qIG9yaW5vY29faW5pdCgpIG11c3QgY2xlYXIgdGhpcworCQkJCSAgICogYmVmb3JlIGFueXRoaW5nIGVsc2UgdG91Y2hlcyB0aGUKKwkJCQkgICAqIGhhcmR3YXJlICovCisJSU5JVF9XT1JLKCZwcml2LT5yZXNldF93b3JrLCAodm9pZCAoKikodm9pZCAqKSlvcmlub2NvX3Jlc2V0LCBkZXYpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSAweGZmZmY7CisKKwlyZXR1cm4gZGV2OworCit9CisKK3ZvaWQgZnJlZV9vcmlub2NvZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Jzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJY2hhciBidWZbRVRIX0FMRU5dKQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRCU1NJRCwKKwkJCSAgICAgIEVUSF9BTEVOLCBOVUxMLCBidWYpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19od19nZXRfZXNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50ICphY3RpdmUsCisJCQkJY2hhciBidWZbSVdfRVNTSURfTUFYX1NJWkUrMV0pCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgZXNzaWRidWY7CisJY2hhciAqcCA9IChjaGFyICopKCZlc3NpZGJ1Zi52YWwpOworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSA+IDApIHsKKwkJLyogV2UgcmVhZCB0aGUgZGVzaXJlZCBTU0lEIGZyb20gdGhlIGhhcmR3YXJlIHJhdGhlcgorCQkgICB0aGFuIGZyb20gcHJpdi0+ZGVzaXJlZF9lc3NpZCwganVzdCBpbiBjYXNlIHRoZQorCQkgICBmaXJtd2FyZSBpcyBhbGxvd2VkIHRvIGNoYW5nZSBpdCBvbiB1cy4gSSdtIG5vdAorCQkgICBzdXJlIGFib3V0IHRoaXMgKi8KKwkJLyogTXkgZ3Vlc3MgaXMgdGhhdCB0aGUgT1dOU1NJRCBzaG91bGQgYWx3YXlzIGJlIHdoYXRldmVyCisJCSAqIHdlIHNldCB0byB0aGUgY2FyZCwgd2hlcmVhcyBDVVJSRU5UX1NTSUQgaXMgdGhlIG9uZSB0aGF0CisJCSAqIG1heSBjaGFuZ2UuLi4gLSBKZWFuIElJICovCisJCXUxNiByaWQ7CisKKwkJKmFjdGl2ZSA9IDE7CisKKwkJcmlkID0gKHByaXYtPnBvcnRfdHlwZSA9PSAzKSA/IEhFUk1FU19SSURfQ05GT1dOU1NJRCA6CisJCQlIRVJNRVNfUklEX0NORkRFU0lSRURTU0lEOworCQkKKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgcmlkLCBzaXplb2YoZXNzaWRidWYpLAorCQkJCSAgICAgIE5VTEwsICZlc3NpZGJ1Zik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxfdW5sb2NrOworCX0gZWxzZSB7CisJCSphY3RpdmUgPSAwOworCisJCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVFNTSUQsCisJCQkJICAgICAgc2l6ZW9mKGVzc2lkYnVmKSwgTlVMTCwgJmVzc2lkYnVmKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbF91bmxvY2s7CisJfQorCisJbGVuID0gbGUxNl90b19jcHUoZXNzaWRidWYubGVuKTsKKworCW1lbXNldChidWYsIDAsIElXX0VTU0lEX01BWF9TSVpFKzEpOworCW1lbWNweShidWYsIHAsIGxlbik7CisJYnVmW2xlbl0gPSAnXDAnOworCisgZmFpbF91bmxvY2s6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7ICAgICAgIAorfQorCitzdGF0aWMgbG9uZyBvcmlub2NvX2h3X2dldF9mcmVxKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJCisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiBjaGFubmVsOworCWxvbmcgZnJlcSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCQorCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRDSEFOTkVMLCAmY2hhbm5lbCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBJbnRlcnNpbCBmaXJtd2FyZSAxLjMuNSByZXR1cm5zIDAgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCAoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gTlVNX0NIQU5ORUxTKSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENoYW5uZWwgb3V0IG9mIHJhbmdlICglZCkhXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgY2hhbm5lbCk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisKKwl9CisJZnJlcSA9IGNoYW5uZWxfZnJlcXVlbmN5W2NoYW5uZWwtMV0gKiAxMDAwMDA7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIgPiAwKQorCQllcnIgPSAtRUJVU1k7CisJcmV0dXJuIGVyciA/IGVyciA6IGZyZXE7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19od19nZXRfYml0cmF0ZWxpc3Qoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgICBpbnQgKm51bXJhdGVzLCBzMzIgKnJhdGVzLCBpbnQgbWF4KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIGxpc3Q7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopJmxpc3QudmFsOworCWludCBlcnIgPSAwOworCWludCBudW07CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9TVVBQT1JURUREQVRBUkFURVMsCisJCQkgICAgICBzaXplb2YobGlzdCksIE5VTEwsICZsaXN0KTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwkKKwludW0gPSBsZTE2X3RvX2NwdShsaXN0Lmxlbik7CisJKm51bXJhdGVzID0gbnVtOworCW51bSA9IG1pbihudW0sIG1heCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJcmF0ZXNbaV0gPSAocFtpXSAmIDB4N2YpICogNTAwMDAwOyAvKiBjb252ZXJ0IHRvIGJwcyAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0aXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbW9kZTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgcmFuZ2U7CisJaW50IG51bXJhdGVzOworCWludCBpLCBrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBycnEtPnBvaW50ZXIsIHNpemVvZihyYW5nZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJycS0+bGVuZ3RoID0gc2l6ZW9mKHJhbmdlKTsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbW9kZSA9IHByaXYtPml3X21vZGU7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOworCisJLyogTXVjaCBvZiB0aGlzIHNoYW1lbGVzc2x5IHRha2VuIGZyb20gd3ZsYW5fY3MuYy4gTm8gaWRlYQorCSAqIHdoYXQgaXQgYWxsIG1lYW5zIC1kZ2lic29uICovCisJcmFuZ2Uud2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS53ZV92ZXJzaW9uX3NvdXJjZSA9IDExOworCisJcmFuZ2UubWluX253aWQgPSByYW5nZS5tYXhfbndpZCA9IDA7IC8qIFdlIGRvbid0IHVzZSBud2lkcyAqLworCisJLyogU2V0IGF2YWlsYWJsZSBjaGFubmVscy9mcmVxdWVuY2llcyAqLworCXJhbmdlLm51bV9jaGFubmVscyA9IE5VTV9DSEFOTkVMUzsKKwlrID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IGkpKSB7CisJCQlyYW5nZS5mcmVxW2tdLmkgPSBpICsgMTsKKwkJCXJhbmdlLmZyZXFba10ubSA9IGNoYW5uZWxfZnJlcXVlbmN5W2ldICogMTAwMDAwOworCQkJcmFuZ2UuZnJlcVtrXS5lID0gMTsKKwkJCWsrKzsKKwkJfQorCQkKKwkJaWYgKGsgPj0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLm51bV9mcmVxdWVuY3kgPSBrOworCisJcmFuZ2Uuc2Vuc2l0aXZpdHkgPSAzOworCisJaWYgKChtb2RlID09IElXX01PREVfQURIT0MpICYmIChwcml2LT5zcHlfbnVtYmVyID09IDApKXsKKwkJLyogUXVhbGl0eSBzdGF0cyBtZWFuaW5nbGVzcyBpbiBhZC1ob2MgbW9kZSAqLworCQlyYW5nZS5tYXhfcXVhbC5xdWFsID0gMDsKKwkJcmFuZ2UubWF4X3F1YWwubGV2ZWwgPSAwOworCQlyYW5nZS5tYXhfcXVhbC5ub2lzZSA9IDA7CisJCXJhbmdlLmF2Z19xdWFsLnF1YWwgPSAwOworCQlyYW5nZS5hdmdfcXVhbC5sZXZlbCA9IDA7CisJCXJhbmdlLmF2Z19xdWFsLm5vaXNlID0gMDsKKwl9IGVsc2UgeworCQlyYW5nZS5tYXhfcXVhbC5xdWFsID0gMHg4YiAtIDB4MmY7CisJCXJhbmdlLm1heF9xdWFsLmxldmVsID0gMHgyZiAtIDB4OTUgLSAxOworCQlyYW5nZS5tYXhfcXVhbC5ub2lzZSA9IDB4MmYgLSAweDk1IC0gMTsKKwkJLyogTmVlZCB0byBnZXQgYmV0dGVyIHZhbHVlcyAqLworCQlyYW5nZS5hdmdfcXVhbC5xdWFsID0gMHgyNDsKKwkJcmFuZ2UuYXZnX3F1YWwubGV2ZWwgPSAweEMyOworCQlyYW5nZS5hdmdfcXVhbC5ub2lzZSA9IDB4OUU7CisJfQorCisJZXJyID0gb3Jpbm9jb19od19nZXRfYml0cmF0ZWxpc3QocHJpdiwgJm51bXJhdGVzLAorCQkJCQkgcmFuZ2UuYml0cmF0ZSwgSVdfTUFYX0JJVFJBVEVTKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJhbmdlLm51bV9iaXRyYXRlcyA9IG51bXJhdGVzOworCQorCS8qIFNldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBtYXggVENQIHRocm91Z2hwdXQgaW4gYml0L3MgdGhhdCB3ZSBjYW4KKwkgKiBleHBlY3QgdXNpbmcgdGhpcyBpbnRlcmZhY2UuIE1heSBiZSB1c2UgZm9yIFFvUyBzdHVmZi4uLgorCSAqIEplYW4gSUkgKi8KKwlpZihudW1yYXRlcyA+IDIpCisJCXJhbmdlLnRocm91Z2hwdXQgPSA1ICogMTAwMCAqIDEwMDA7CS8qIH41IE1iL3MgKi8KKwllbHNlCisJCXJhbmdlLnRocm91Z2hwdXQgPSAxLjUgKiAxMDAwICogMTAwMDsJLyogfjEuNSBNYi9zICovCisKKwlyYW5nZS5taW5fcnRzID0gMDsKKwlyYW5nZS5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS5tYXhfZnJhZyA9IDIzNDY7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAocHJpdi0+aGFzX3dlcCkgeworCQlyYW5nZS5tYXhfZW5jb2RpbmdfdG9rZW5zID0gT1JJTk9DT19NQVhfS0VZUzsKKworCQlyYW5nZS5lbmNvZGluZ19zaXplWzBdID0gU01BTExfS0VZX1NJWkU7CisJCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDE7CisKKwkJaWYgKHByaXYtPmhhc19iaWdfd2VwKSB7CisJCQlyYW5nZS5lbmNvZGluZ19zaXplWzFdID0gTEFSR0VfS0VZX1NJWkU7CisJCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCQl9CisJfSBlbHNlIHsKKwkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMDsKKwkJcmFuZ2UubWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCQorCXJhbmdlLm1pbl9wbXAgPSAwOworCXJhbmdlLm1heF9wbXAgPSA2NTUzNTAwMDsKKwlyYW5nZS5taW5fcG10ID0gMDsKKwlyYW5nZS5tYXhfcG10ID0gNjU1MzUgKiAxMDAwOwkvKiA/Pz8gKi8KKwlyYW5nZS5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJcmFuZ2UucG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX1VOSUNBU1RfUjsKKworCXJhbmdlLm51bV90eHBvd2VyID0gMTsKKwlyYW5nZS50eHBvd2VyWzBdID0gMTU7IC8qIDE1ZEJtICovCisJcmFuZ2UudHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJcmFuZ2UucmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UucmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS5yX3RpbWVfZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS5taW5fcmV0cnkgPSAwOworCXJhbmdlLm1heF9yZXRyeSA9IDY1NTM1OwkvKiA/Pz8gKi8KKwlyYW5nZS5taW5fcl90aW1lID0gMDsKKwlyYW5nZS5tYXhfcl90aW1lID0gNjU1MzUgKiAxMDAwOwkvKiA/Pz8gKi8KKworCWlmIChjb3B5X3RvX3VzZXIocnJxLT5wb2ludGVyLCAmcmFuZ2UsIHNpemVvZihyYW5nZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0aXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwlpbnQgc2V0aW5kZXggPSBwcml2LT50eF9rZXk7CisJaW50IGVuYWJsZSA9IHByaXYtPndlcF9vbjsKKwlpbnQgcmVzdHJpY3RlZCA9IHByaXYtPndlcF9yZXN0cmljdDsKKwl1MTYgeGxlbiA9IDA7CisJaW50IGVyciA9IDA7CisJY2hhciBrZXlidWZbT1JJTk9DT19NQVhfS0VZX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISBwcml2LT5oYXNfd2VwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoZXJxLT5wb2ludGVyKSB7CisJCS8qIFdlIGFjdHVhbGx5IGhhdmUgYSBrZXkgdG8gc2V0IC0gY2hlY2sgaXRzIGxlbmd0aCAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBMQVJHRV9LRVlfU0laRSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJaWYgKCAoZXJxLT5sZW5ndGggPiBTTUFMTF9LRVlfU0laRSkgJiYgIXByaXYtPmhhc19iaWdfd2VwICkKKwkJCXJldHVybiAtRTJCSUc7CisJCQorCQlpZiAoY29weV9mcm9tX3VzZXIoa2V5YnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGVycS0+cG9pbnRlcikgeworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKQorCQkJaW5kZXggPSBwcml2LT50eF9rZXk7CisKKwkJLyogQWRqdXN0IGtleSBsZW5ndGggdG8gYSBzdXBwb3J0ZWQgdmFsdWUgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gU01BTExfS0VZX1NJWkUpIHsKKwkJCXhsZW4gPSBMQVJHRV9LRVlfU0laRTsKKwkJfSBlbHNlIGlmIChlcnEtPmxlbmd0aCA+IDApIHsKKwkJCXhsZW4gPSBTTUFMTF9LRVlfU0laRTsKKwkJfSBlbHNlCisJCQl4bGVuID0gMDsKKworCQkvKiBTd2l0Y2ggb24gV0VQIGlmIG9mZiAqLworCQlpZiAoKCFlbmFibGUpICYmICh4bGVuID4gMCkpIHsKKwkJCXNldGluZGV4ID0gaW5kZXg7CisJCQllbmFibGUgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW1wb3J0YW50IG5vdGUgOiBpZiB0aGUgdXNlciBkbyAiaXdjb25maWcgZXRoMCBlbmMgb2ZmIiwKKwkJICogd2Ugd2lsbCBhcnJpdmUgdGhlcmUgd2l0aCBhbiBpbmRleCBvZiAtMS4gVGhpcyBpcyB2YWxpZAorCQkgKiBidXQgbmVlZCB0byBiZSB0YWtlbiBjYXJlIG9mZi4uLiBKZWFuIElJICovCisJCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gT1JJTk9DT19NQVhfS0VZUykpIHsKKwkJCWlmKChpbmRleCAhPSAtMSkgfHwgKGVycS0+ZmxhZ3MgPT0gMCkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU2V0IHRoZSBpbmRleCA6IENoZWNrIHRoYXQgdGhlIGtleSBpcyB2YWxpZCAqLworCQkJaWYocHJpdi0+a2V5c1tpbmRleF0ubGVuID09IDApIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc2V0aW5kZXggPSBpbmRleDsKKwkJfQorCX0KKworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCQllbmFibGUgPSAwOworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCXJlc3RyaWN0ZWQgPSAwOworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCXJlc3RyaWN0ZWQgPSAxOworCisJaWYgKGVycS0+cG9pbnRlcikgeworCQlwcml2LT5rZXlzW2luZGV4XS5sZW4gPSBjcHVfdG9fbGUxNih4bGVuKTsKKwkJbWVtc2V0KHByaXYtPmtleXNbaW5kZXhdLmRhdGEsIDAsCisJCSAgICAgICBzaXplb2YocHJpdi0+a2V5c1tpbmRleF0uZGF0YSkpOworCQltZW1jcHkocHJpdi0+a2V5c1tpbmRleF0uZGF0YSwga2V5YnVmLCBlcnEtPmxlbmd0aCk7CisJfQorCXByaXYtPnR4X2tleSA9IHNldGluZGV4OworCisJLyogVHJ5IGZhc3Qga2V5IGNoYW5nZSBpZiBjb25uZWN0ZWQgYW5kIG9ubHkga2V5cyBhcmUgY2hhbmdlZCAqLworCWlmIChwcml2LT53ZXBfb24gJiYgZW5hYmxlICYmIChwcml2LT53ZXBfcmVzdHJpY3QgPT0gcmVzdHJpY3RlZCkgJiYKKwkgICAgbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWVyciA9IF9fb3Jpbm9jb19od19zZXR1cF93ZXBrZXlzKHByaXYpOworCQkvKiBObyBuZWVkIHRvIGNvbW1pdCBpZiBzdWNjZXNzZnVsICovCisJCWdvdG8gb3V0OworCX0KKworCXByaXYtPndlcF9vbiA9IGVuYWJsZTsKKwlwcml2LT53ZXBfcmVzdHJpY3QgPSByZXN0cmljdGVkOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwl1MTYgeGxlbiA9IDA7CisJY2hhciBrZXlidWZbT1JJTk9DT19NQVhfS0VZX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISBwcml2LT5oYXNfd2VwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gT1JJTk9DT19NQVhfS0VZUykpCisJCWluZGV4ID0gcHJpdi0+dHhfa2V5OworCisJZXJxLT5mbGFncyA9IDA7CisJaWYgKCEgcHJpdi0+d2VwX29uKQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwllcnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKworCWlmIChwcml2LT53ZXBfcmVzdHJpY3QpCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCisJeGxlbiA9IGxlMTZfdG9fY3B1KHByaXYtPmtleXNbaW5kZXhdLmxlbik7CisKKwllcnEtPmxlbmd0aCA9IHhsZW47CisKKwltZW1jcHkoa2V5YnVmLCBwcml2LT5rZXlzW2luZGV4XS5kYXRhLCBPUklOT0NPX01BWF9LRVlfU0laRSk7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVycS0+cG9pbnRlcikgeworCQlpZiAoY29weV90b191c2VyKGVycS0+cG9pbnRlciwga2V5YnVmLCB4bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTm90ZSA6IEVTU0lEIGlzIGlnbm9yZWQgaW4gQWQtSG9jIGRlbW8gbW9kZSwgYnV0IHdlIGNhbiBzZXQgaXQKKwkgKiBhbnl3YXkuLi4gLSBKZWFuIElJICovCisKKwltZW1zZXQoJmVzc2lkYnVmLCAwLCBzaXplb2YoZXNzaWRidWYpKTsKKworCWlmIChlcnEtPmZsYWdzKSB7CisJCWlmIChlcnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQkJcmV0dXJuIC1FMkJJRzsKKwkJCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZXNzaWRidWYsIGVycS0+cG9pbnRlciwgZXJxLT5sZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZXNzaWRidWZbZXJxLT5sZW5ndGhdID0gJ1wwJzsKKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShwcml2LT5kZXNpcmVkX2Vzc2lkLCBlc3NpZGJ1Ziwgc2l6ZW9mKHByaXYtPmRlc2lyZWRfZXNzaWQpKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJaW50IGFjdGl2ZTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXJyID0gb3Jpbm9jb19od19nZXRfZXNzaWQocHJpdiwgJmFjdGl2ZSwgZXNzaWRidWYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCW1lbWNweShlc3NpZGJ1ZiwgcHJpdi0+ZGVzaXJlZF9lc3NpZCwgc2l6ZW9mKGVzc2lkYnVmKSk7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJfQorCisJZXJxLT5mbGFncyA9IDE7CisJZXJxLT5sZW5ndGggPSBzdHJsZW4oZXNzaWRidWYpICsgMTsKKwlpZiAoZXJxLT5wb2ludGVyKQorCQlpZiAoY29weV90b191c2VyKGVycS0+cG9pbnRlciwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIG5pY2tidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChucnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUUyQklHOworCisJbWVtc2V0KG5pY2tidWYsIDAsIHNpemVvZihuaWNrYnVmKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIobmlja2J1ZiwgbnJxLT5wb2ludGVyLCBucnEtPmxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbmlja2J1ZltucnEtPmxlbmd0aF0gPSAnXDAnOworCQorCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KHByaXYtPm5pY2ssIG5pY2tidWYsIHNpemVvZihwcml2LT5uaWNrKSk7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRuaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqbnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgbmlja2J1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkobmlja2J1ZiwgcHJpdi0+bmljaywgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCW5ycS0+bGVuZ3RoID0gc3RybGVuKG5pY2tidWYpKzE7CisKKwlpZiAoY29weV90b191c2VyKG5ycS0+cG9pbnRlciwgbmlja2J1Ziwgc2l6ZW9mKG5pY2tidWYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X2ZyZXEgKmZycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY2hhbiA9IC0xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBXZSBjYW4gb25seSB1c2UgdGhpcyBpbiBBZC1Ib2MgZGVtbyBtb2RlIHRvIHNldCB0aGUgb3BlcmF0aW5nCisJICogZnJlcXVlbmN5LCBvciBpbiBJQlNTIG1vZGUgdG8gc2V0IHRoZSBmcmVxdWVuY3kgd2hlcmUgdGhlIElCU1MKKwkgKiB3aWxsIGJlIGNyZWF0ZWQgLSBKZWFuIElJICovCisJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCAoZnJxLT5lID09IDApICYmIChmcnEtPm0gPD0gMTAwMCkgKSB7CisJCS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKwkJY2hhbiA9IGZycS0+bTsKKwl9IGVsc2UgeworCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgKi8KKwkJaW50IG11bHQgPSAxOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgKDYgLSBmcnEtPmUpOyBpKyspCisJCQltdWx0ICo9IDEwOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykKKwkJCWlmIChmcnEtPm0gPT0gKGNoYW5uZWxfZnJlcXVlbmN5W2ldICogbXVsdCkpCisJCQkJY2hhbiA9IGkrMTsKKwl9CisKKwlpZiAoIChjaGFuIDwgMSkgfHwgKGNoYW4gPiBOVU1fQ0hBTk5FTFMpIHx8CisJICAgICAhIChwcml2LT5jaGFubmVsX21hc2sgJiAoMSA8PCAoY2hhbi0xKSkgKSApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJcHJpdi0+Y2hhbm5lbCA9IGNoYW47CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnNycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJdTE2IHZhbDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXByaXYtPmhhc19zZW5zaXRpdml0eSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJICBIRVJNRVNfUklEX0NORlNZU1RFTVNDQUxFLCAmdmFsKTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNycS0+dmFsdWUgPSB2YWw7CisJc3JxLT5maXhlZCA9IDA7IC8qIGF1dG8gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnNycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdmFsID0gc3JxLT52YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2LT5oYXNfc2Vuc2l0aXZpdHkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICgodmFsIDwgMSkgfHwgKHZhbCA+IDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwcml2LT5hcF9kZW5zaXR5ID0gdmFsOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdmFsID0gcnJxLT52YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJycS0+ZGlzYWJsZWQpCisJCXZhbCA9IDIzNDc7CisKKwlpZiAoICh2YWwgPCAwKSB8fCAodmFsID4gMjM0NykgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcHJpdi0+cnRzX3RocmVzaCA9IHZhbDsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqZnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwcml2LT5oYXNfbXdvKSB7CisJCWlmIChmcnEtPmRpc2FibGVkKQorCQkJcHJpdi0+bXdvX3JvYnVzdCA9IDA7CisJCWVsc2UgeworCQkJaWYgKGZycS0+Zml4ZWQpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZpeGVkIGZyYWdtZW50YXRpb24gaXMgIgorCQkJCSAgICAgICAibm90IHN1cHBvcnRlZCBvbiB0aGlzIGZpcm13YXJlLiAiCisJCQkJICAgICAgICJVc2luZyBNV08gcm9idXN0IGluc3RlYWQuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpdi0+bXdvX3JvYnVzdCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZnJxLT5kaXNhYmxlZCkKKwkJCXByaXYtPmZyYWdfdGhyZXNoID0gMjM0NjsKKwkJZWxzZSB7CisJCQlpZiAoIChmcnEtPnZhbHVlIDwgMjU2KSB8fCAoZnJxLT52YWx1ZSA+IDIzNDYpICkKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCXByaXYtPmZyYWdfdGhyZXNoID0gZnJxLT52YWx1ZSAmIH4weDE7IC8qIG11c3QgYmUgZXZlbiAqLworCQl9CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqZnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwlpZiAocHJpdi0+aGFzX213bykgeworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORk1XT1JPQlVTVF9BR0VSRSwKKwkJCQkJICAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXZhbCA9IDA7CisKKwkJZnJxLT52YWx1ZSA9IHZhbCA/IDIzNDcgOiAwOworCQlmcnEtPmRpc2FibGVkID0gISB2YWw7CisJCWZycS0+Zml4ZWQgPSAwOworCX0gZWxzZSB7CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsCisJCQkJCSAgJnZhbCk7CisJCWlmIChlcnIpCisJCQl2YWwgPSAwOworCisJCWZycS0+dmFsdWUgPSB2YWw7CisJCWZycS0+ZGlzYWJsZWQgPSAodmFsID49IDIzNDYpOworCQlmcnEtPmZpeGVkID0gMTsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCWludCByYXRlbW9kZSA9IC0xOworCWludCBiaXRyYXRlOyAvKiAxMDBzIG9mIGtpbG9iaXRzICovCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkvKiBBcyB0aGUgdXNlciBzcGFjZSBkb2Vzbid0IGtub3cgb3VyIGhpZ2hlc3QgcmF0ZSwgaXQgdXNlcyAtMQorCSAqIHRvIGFzayB1cyB0byBzZXQgdGhlIGhpZ2hlc3QgcmF0ZS4gIFRlc3QgaXQgdXNpbmcgIml3Y29uZmlnCisJICogZXRoWCByYXRlIGF1dG8iIC0gSmVhbiBJSSAqLworCWlmIChycnEtPnZhbHVlID09IC0xKQorCQliaXRyYXRlID0gMTEwOworCWVsc2UgeworCQlpZiAocnJxLT52YWx1ZSAlIDEwMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQliaXRyYXRlID0gcnJxLT52YWx1ZSAvIDEwMDAwMDsKKwl9CisKKwlpZiAoIChiaXRyYXRlICE9IDEwKSAmJiAoYml0cmF0ZSAhPSAyMCkgJiYKKwkgICAgIChiaXRyYXRlICE9IDU1KSAmJiAoYml0cmF0ZSAhPSAxMTApICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQklUUkFURV9UQUJMRV9TSVpFOyBpKyspCisJCWlmICggKGJpdHJhdGVfdGFibGVbaV0uYml0cmF0ZSA9PSBiaXRyYXRlKSAmJgorCQkgICAgIChiaXRyYXRlX3RhYmxlW2ldLmF1dG9tYXRpYyA9PSAhIHJycS0+Zml4ZWQpICkgeworCQkJcmF0ZW1vZGUgPSBpOworCQkJYnJlYWs7CisJCX0KKwkKKwlpZiAocmF0ZW1vZGUgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJcHJpdi0+Yml0cmF0ZW1vZGUgPSByYXRlbW9kZTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCWludCByYXRlbW9kZTsKKwlpbnQgaTsKKwl1MTYgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJhdGVtb2RlID0gcHJpdi0+Yml0cmF0ZW1vZGU7CisKKwlCVUdfT04oKHJhdGVtb2RlIDwgMCkgfHwgKHJhdGVtb2RlID49IEJJVFJBVEVfVEFCTEVfU0laRSkpOworCisJcnJxLT52YWx1ZSA9IGJpdHJhdGVfdGFibGVbcmF0ZW1vZGVdLmJpdHJhdGUgKiAxMDAwMDA7CisJcnJxLT5maXhlZCA9ICEgYml0cmF0ZV90YWJsZVtyYXRlbW9kZV0uYXV0b21hdGljOworCXJycS0+ZGlzYWJsZWQgPSAwOworCisJLyogSWYgdGhlIGludGVyZmFjZSBpcyBydW5uaW5nIHdlIHRyeSB0byBmaW5kIG1vcmUgYWJvdXQgdGhlCisJICAgY3VycmVudCBtb2RlICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCQorCQlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwkJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOiAvKiBMdWNlbnQgc3R5bGUgcmF0ZSAqLworCQkJLyogTm90ZSA6IGluIEx1Y2VudCBmaXJtd2FyZSwgdGhlIHJldHVybiB2YWx1ZSBvZgorCQkJICogSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFIGlzIHRoZSBiaXRyYXRlIGluIE1iL3MsCisJCQkgKiBhbmQgdGhlcmVmb3JlIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gdGhlCisJCQkgKiBlbmNvZGluZyBvZiBIRVJNRVNfUklEX0NORlRYUkFURUNPTlRST0wuCisJCQkgKiBEb24ndCBmb3JnZXQgdGhhdCA2TWIvcyBpcyByZWFsbHkgNS41TWIvcyAqLworCQkJaWYgKHZhbCA9PSA2KQorCQkJCXJycS0+dmFsdWUgPSA1NTAwMDAwOworCQkJZWxzZQorCQkJCXJycS0+dmFsdWUgPSB2YWwgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDogLyogSW50ZXJzaWwgc3R5bGUgcmF0ZSAqLworCQljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOiAvKiBTeW1ib2wgc3R5bGUgcmF0ZSAqLworCQkJZm9yIChpID0gMDsgaSA8IEJJVFJBVEVfVEFCTEVfU0laRTsgaSsrKQorCQkJCWlmIChiaXRyYXRlX3RhYmxlW2ldLmludGVyc2lsX3R4cmF0ZWN0cmwgPT0gdmFsKSB7CisJCQkJCXJhdGVtb2RlID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKGkgPj0gQklUUkFURV9UQUJMRV9TSVpFKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgYml0cmF0ZSAoMHglMDRoeClcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgdmFsKTsKKworCQkJcnJxLT52YWx1ZSA9IGJpdHJhdGVfdGFibGVbcmF0ZW1vZGVdLmJpdHJhdGUgKiAxMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpwcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHBycS0+ZGlzYWJsZWQpIHsKKwkJcHJpdi0+cG1fb24gPSAwOworCX0gZWxzZSB7CisJCXN3aXRjaCAocHJxLT5mbGFncyAmIElXX1BPV0VSX01PREUpIHsKKwkJY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6CisJCQlwcml2LT5wbV9tY2FzdCA9IDA7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJCXByaXYtPnBtX21jYXN0ID0gMTsKKwkJCXByaXYtPnBtX29uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BPV0VSX09OOgorCQkJLyogTm8gZmxhZ3MgOiBidXQgd2UgbWF5IGhhdmUgYSB2YWx1ZSAtIEplYW4gSUkgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCQorCQlpZiAocHJxLT5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJCXByaXYtPnBtX29uID0gMTsKKwkJCXByaXYtPnBtX3RpbWVvdXQgPSBwcnEtPnZhbHVlIC8gMTAwMDsKKwkJfQorCQlpZiAocHJxLT5mbGFncyAmIElXX1BPV0VSX1BFUklPRCkgeworCQkJcHJpdi0+cG1fb24gPSAxOworCQkJcHJpdi0+cG1fcGVyaW9kID0gcHJxLT52YWx1ZSAvIDEwMDA7CisJCX0KKwkJLyogSXQncyB2YWxpZCB0byBub3QgaGF2ZSBhIHZhbHVlIGlmIHdlIGFyZSBqdXN0IHRvZ2dsaW5nCisJCSAqIHRoZSBmbGFncy4uLiBKZWFuIElJICovCisJCWlmKCFwcml2LT5wbV9vbikgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CQkJCisJfQorCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpwcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiBlbmFibGUsIHBlcmlvZCwgdGltZW91dCwgbWNhc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCQorCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlBNRU5BQkxFRCwgJmVuYWJsZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkgIEhFUk1FU19SSURfQ05GTUFYU0xFRVBEVVJBVElPTiwgJnBlcmlvZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04sICZ0aW1lb3V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk1VTFRJQ0FTVFJFQ0VJVkUsICZtY2FzdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlwcnEtPmRpc2FibGVkID0gIWVuYWJsZTsKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgcGVyaW9kICovCisJaWYgKChwcnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQlwcnEtPmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcHJxLT52YWx1ZSA9IHRpbWVvdXQgKiAxMDAwOworCX0gZWxzZSB7CisJCXBycS0+ZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXBycS0+dmFsdWUgPSBwZXJpb2QgKiAxMDAwOworCX0KKwlpZiAobWNhc3QpCisJCXBycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisJZWxzZQorCQlwcnEtPmZsYWdzIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHJldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgc2hvcnRfbGltaXQsIGxvbmdfbGltaXQsIGxpZmV0aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9TSE9SVFJFVFJZTElNSVQsCisJCQkJICAmc2hvcnRfbGltaXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfTE9OR1JFVFJZTElNSVQsCisJCQkJICAmbG9uZ19saW1pdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9NQVhUUkFOU01JVExJRkVUSU1FLAorCQkJCSAgJmxpZmV0aW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJycS0+ZGlzYWJsZWQgPSAwOwkJLyogQ2FuJ3QgYmUgZGlzYWJsZWQgKi8KKworCS8qIE5vdGUgOiBieSBkZWZhdWx0LCBkaXNwbGF5IHRoZSByZXRyeSBudW1iZXIgKi8KKwlpZiAoKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PSBJV19SRVRSWV9MSUZFVElNRSkgeworCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJCXJycS0+dmFsdWUgPSBsaWZldGltZSAqIDEwMDA7CS8qID8/PyAqLworCX0gZWxzZSB7CisJCS8qIEJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIG1pbiBudW1iZXIgKi8KKwkJaWYgKChycnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKSkgeworCQkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCQkJcnJxLT52YWx1ZSA9IGxvbmdfbGltaXQ7CisJCX0gZWxzZSB7CisJCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCQlycnEtPnZhbHVlID0gc2hvcnRfbGltaXQ7CisJCQlpZihzaG9ydF9saW1pdCAhPSBsb25nX2xpbWl0KQorCQkJCXJycS0+ZmxhZ3MgfD0gSVdfUkVUUllfTUlOOworCQl9CisJfQorCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlwcml2LT5pYnNzX3BvcnQgPSB2YWwgOworCisJLyogQWN0dWFsbHkgdXBkYXRlIHRoZSBtb2RlIHdlIGFyZSB1c2luZyAqLworCXNldF9wb3J0X3R5cGUocHJpdik7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0aWJzc3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJKnZhbCA9IHByaXYtPmlic3NfcG9ydDsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOiAvKiBUcnkgdG8gZG8gSUVFRSBhZC1ob2MgbW9kZSAqLworCQlpZiAoISBwcml2LT5oYXNfaWJzcykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXByaXYtPnByZWZlcl9wb3J0MyA9IDA7CisJCQkKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8qIFRyeSB0byBkbyBMdWNlbnQgcHJvcHJpZXRhcnkgYWQtaG9jIG1vZGUgKi8KKwkJaWYgKCEgcHJpdi0+aGFzX3BvcnQzKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+cHJlZmVyX3BvcnQzID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmICghIGVycikKKwkJLyogQWN0dWFsbHkgdXBkYXRlIHRoZSBtb2RlIHdlIGFyZSB1c2luZyAqLworCQlzZXRfcG9ydF90eXBlKHByaXYpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkqdmFsID0gcHJpdi0+cHJlZmVyX3BvcnQzOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNweSBpcyB1c2VkIGZvciBsaW5rIHF1YWxpdHkvc3RyZW5ndGggbWVhc3VyZW1lbnRzIGluIEFkLUhvYyBtb2RlCisgKiBKZWFuIElJICovCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0c3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqc3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciBhZGRyZXNzW0lXX01BWF9TUFldOworCWludCBudW1iZXIgPSBzcnEtPmxlbmd0aDsKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgKi8KKwlpZiAobnVtYmVyID4gSVdfTUFYX1NQWSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCS8qIEdldCB0aGUgZGF0YSBpbiB0aGUgZHJpdmVyICovCisJaWYgKHNycS0+cG9pbnRlcikgeworCQlpZiAoY29weV9mcm9tX3VzZXIoYWRkcmVzcywgc3JxLT5wb2ludGVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIE1ha2Ugc3VyZSBub2JvZHkgbWVzcyB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hpbGUgd2UgZG8gKi8KKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIG9yaW5vY29fbG9jaygpIGRvZXNuJ3QgZGlzYWJsZSBpbnRlcnJ1cHRzLCBzbyBtYWtlIHN1cmUgdGhlCisJICogaW50ZXJydXB0IHJ4IHBhdGggZG9uJ3QgZ2V0IGNvbmZ1c2VkIHdoaWxlIHdlIGNvcHkgKi8KKwlwcml2LT5zcHlfbnVtYmVyID0gMDsKKworCWlmIChudW1iZXIgPiAwKSB7CisJCS8qIEV4dHJhY3QgdGhlIGFkZHJlc3NlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCisJCQltZW1jcHkocHJpdi0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCS8qIFJlc2V0IHN0YXRzICovCisJCW1lbXNldChwcml2LT5zcHlfc3RhdCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKKwkJLyogU2V0IG51bWJlciBvZiBhZGRyZXNzZXMgKi8KKwkJcHJpdi0+c3B5X251bWJlciA9IG51bWJlcjsKKwl9CisKKwkvKiBOb3csIGxldCB0aGUgb3RoZXJzIHBsYXkgKi8KKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnNycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcmVzc1tJV19NQVhfU1BZXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBzcHlfc3RhdFtJV19NQVhfU1BZXTsKKwlpbnQgbnVtYmVyOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW51bWJlciA9IHByaXYtPnNweV9udW1iZXI7CisJaWYgKChudW1iZXIgPiAwKSAmJiAoc3JxLT5wb2ludGVyKSkgeworCQkvKiBDcmVhdGUgYWRkcmVzcyBzdHJ1Y3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CisJCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBwcml2LT5zcHlfYWRkcmVzc1tpXSwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CisJCX0KKwkJLyogQ29weSBzdGF0cyAqLworCQkvKiBJbiB0aGVvcnksIHdlIHNob3VsZCBkaXNhYmxlIGlycXMgd2hpbGUgY29weWluZyB0aGUgc3RhdHMKKwkJICogYmVjYXVzZSB0aGUgcnggcGF0aCBtaWdodCB1cGRhdGUgaXQgaW4gdGhlIG1pZGRsZS4uLgorCQkgKiBCYWgsIHdobyBjYXJlID8gLSBKZWFuIElJICovCisJCW1lbWNweSgmc3B5X3N0YXQsIHByaXYtPnNweV9zdGF0LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9TUFkpOworCQlmb3IgKGk9MDsgaSA8IG51bWJlcjsgaSsrKQorCQkJcHJpdi0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDA7CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCS8qIFB1c2ggc3R1ZmYgdG8gdXNlciBzcGFjZSAqLworCXNycS0+bGVuZ3RoID0gbnVtYmVyOworCWlmKGNvcHlfdG9fdXNlcihzcnEtPnBvaW50ZXIsIGFkZHJlc3MsCisJCQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBudW1iZXIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZihjb3B5X3RvX3VzZXIoc3JxLT5wb2ludGVyICsgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKm51bWJlciksCisJCQkmc3B5X3N0YXQsIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBudW1iZXIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citvcmlub2NvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CisJaW50IGVyciA9IDA7CisJaW50IHRtcDsKKwlpbnQgY2hhbmdlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwkvKiBJbiB0aGVvcnksIHdlIGNvdWxkIGFsbG93IG1vc3Qgb2YgdGhlIHRoZSBTRVQgc3R1ZmYgdG8gYmUKKwkgKiBkb25lLiBJbiBwcmFjdGljZSwgdGhlIGxhcHNlIG9mIHRpbWUgYXQgc3RhcnR1cCB3aGVuIHRoZQorCSAqIGNhcmQgaXMgbm90IHJlYWR5IGlzIHZlcnkgc2hvcnQsIHNvIHdoeSBib3RoZXIuLi4gIE5vdGUKKwkgKiB0aGF0IG5ldGlmX2RldmljZV9wcmVzZW50IGlzIGRpZmZlcmVudCBmcm9tIHVwL2Rvd24KKwkgKiAoaWZjb25maWcpLCB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IHlldCB1cCwgaXQgaXMgdXN1YWxseQorCSAqIGFscmVhZHkgcmVhZHkuLi4gIEplYW4gSUkgKi8KKwlpZiAoISBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lXTkFNRToKKwkJc3RyY3B5KHdycS0+dS5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU0lPQ0dJV0FQOgorCQl3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCWVyciA9IG9yaW5vY29faHdfZ2V0X2Jzc2lkKHByaXYsIHdycS0+dS5hcF9hZGRyLnNhX2RhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1JBTkdFOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2UoZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV01PREU6CisJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJc3dpdGNoICh3cnEtPnUubW9kZSkgeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlpZiAoISAocHJpdi0+aGFzX2lic3MgfHwgcHJpdi0+aGFzX3BvcnQzKSApCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVsc2UgeworCQkJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0FESE9DOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQljaGFuZ2VkID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X3BvcnRfdHlwZShwcml2KTsKKwkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdNT0RFOgorCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXdycS0+dS5tb2RlID0gcHJpdi0+aXdfbW9kZTsKKwkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdFTkNPREU6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0aXdlbmNvZGUoZGV2LCAmd3JxLT51LmVuY29kaW5nKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRU5DT0RFOgorCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUoZGV2LCAmd3JxLT51LmVuY29kaW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdFU1NJRDoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRlc3NpZChkZXYsICZ3cnEtPnUuZXNzaWQpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdFU1NJRDoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChkZXYsICZ3cnEtPnUuZXNzaWQpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV05JQ0tOOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldG5pY2soZGV2LCAmd3JxLT51LmRhdGEpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdOSUNLTjoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRuaWNrKGRldiwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdGUkVROgorCQl0bXAgPSBvcmlub2NvX2h3X2dldF9mcmVxKHByaXYpOworCQlpZiAodG1wIDwgMCkgeworCQkJZXJyID0gdG1wOworCQl9IGVsc2UgeworCQkJd3JxLT51LmZyZXEubSA9IHRtcDsKKwkJCXdycS0+dS5mcmVxLmUgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRlJFUToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRmcmVxKGRldiwgJndycS0+dS5mcmVxKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXU0VOUzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRzZW5zKGRldiwgJndycS0+dS5zZW5zKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdTRU5TOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHNlbnMoZGV2LCAmd3JxLT51LnNlbnMpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSVFM6CisJCXdycS0+dS5ydHMudmFsdWUgPSBwcml2LT5ydHNfdGhyZXNoOworCQl3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMjM0Nyk7CisJCXdycS0+dS5ydHMuZml4ZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1JUUzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRydHMoZGV2LCAmd3JxLT51LnJ0cyk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV0ZSQUc6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhkZXYsICZ3cnEtPnUuZnJhZyk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV0ZSQUc6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhkZXYsICZ3cnEtPnUuZnJhZyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXUkFURToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRyYXRlKGRldiwgJndycS0+dS5iaXRyYXRlKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUkFURToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRyYXRlKGRldiwgJndycS0+dS5iaXRyYXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdQT1dFUjoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRwb3dlcihkZXYsICZ3cnEtPnUucG93ZXIpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdQT1dFUjoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRwb3dlcihkZXYsICZ3cnEtPnUucG93ZXIpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1RYUE9XOgorCQkvKiBUaGUgY2FyZCBvbmx5IHN1cHBvcnRzIG9uZSB0eCBwb3dlciwgc28gdGhpcyBpcyBlYXN5ICovCisJCXdycS0+dS50eHBvd2VyLnZhbHVlID0gMTU7IC8qIGRCbSAqLworCQl3cnEtPnUudHhwb3dlci5maXhlZCA9IDE7CisJCXdycS0+dS50eHBvd2VyLmRpc2FibGVkID0gMDsKKwkJd3JxLT51LnR4cG93ZXIuZmxhZ3MgPSBJV19UWFBPV19EQk07CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXUkVUUlk6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1JFVFJZOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHJldHJ5KGRldiwgJndycS0+dS5yZXRyeSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXU1BZOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHNweShkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXU1BZOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHNweShkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUFJJVjoKKwkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpIHsKKwkJCXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgwLCAwLCAwLCAiZm9yY2VfcmVzZXQiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDEsIDAsIDAsICJjYXJkX3Jlc2V0IiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgyLAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAwLCAic2V0X3BvcnQzIiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgzLCAwLAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAiZ2V0X3BvcnQzIiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg0LAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAwLCAic2V0X3ByZWFtYmxlIiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg1LCAwLAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAiZ2V0X3ByZWFtYmxlIiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg2LAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAwLCAic2V0X2lic3Nwb3J0IiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHg3LCAwLAorCQkJCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJCQkJICAiZ2V0X2lic3Nwb3J0IiB9LAorCQkJCXsgU0lPQ0lXTEFTVFBSSVYsIDAsIDAsICJkdW1wX3JlY3MiIH0sCisJCQl9OworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwkgICAgICAgCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDA6IC8qIGZvcmNlX3Jlc2V0ICovCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDE6IC8qIGNhcmRfcmVzZXQgKi8KKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRm9yY2Ugc2NoZWR1bGluZyByZXNldCFcbiIsIGRldi0+bmFtZSk7CisKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDI6IC8qIHNldF9wb3J0MyAqLworCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cG9ydDMoZGV2LCB3cnEpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MzogLyogZ2V0X3BvcnQzICovCisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cG9ydDMoZGV2LCB3cnEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg0OiAvKiBzZXRfcHJlYW1ibGUgKi8KKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQkvKiA4MDIuMTFiIGhhcyByZWNlbnRseSBkZWZpbmVkIHNvbWUgc2hvcnQgcHJlYW1ibGUuCisJCSAqIEJhc2ljYWxseSwgdGhlIFBoeSBoZWFkZXIgaGFzIGJlZW4gcmVkdWNlZCBpbiBzaXplLgorCQkgKiBUaGlzIGluY3JlYXNlIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IGF0IGhpZ2ggcmF0ZXMKKwkJICogKHRoZSBwcmVhbWJsZSBpcyB0cmFuc21pdHRlZCBhdCAxTWIvcyksIHVuZm9ydHVuYXRlbHkKKwkJICogdGhpcyBnaXZlIGNvbXBhdGliaWxpdHkgdHJvdWJsZXMuLi4gLSBKZWFuIElJICovCisJCWlmKHByaXYtPmhhc19wcmVhbWJsZSkgeworCQkJaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKworCQkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWlmICh2YWwpCisJCQkJcHJpdi0+cHJlYW1ibGUgPSAxOworCQkJZWxzZQorCQkJCXByaXYtPnByZWFtYmxlID0gMDsKKwkJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCQljaGFuZ2VkID0gMTsKKwkJfSBlbHNlCisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NTogLyogZ2V0X3ByZWFtYmxlICovCisJCWlmKHByaXYtPmhhc19wcmVhbWJsZSkgeworCQkJaW50ICp2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisKKwkJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQkqdmFsID0gcHJpdi0+cHJlYW1ibGU7CisJCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQl9IGVsc2UKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NjogLyogc2V0X2lic3Nwb3J0ICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRpYnNzcG9ydChkZXYsIHdycSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg3OiAvKiBnZXRfaWJzc3BvcnQgKi8KKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRpYnNzcG9ydChkZXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdMQVNUUFJJVjoKKwkJZXJyID0gb3Jpbm9jb19kZWJ1Z19kdW1wX3JlY3MoZGV2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBkdW1wIHJlY29yZHMgKCVkKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWJyZWFrOworCisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJaWYgKCEgZXJyICYmIGNoYW5nZWQgJiYgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWVyciA9IG9yaW5vY29fcmVjb25maWd1cmUoZGV2KTsKKwl9CQkKKworCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCB7CisJdTE2IHJpZDsKKwljaGFyICpuYW1lOworCWludCBkaXNwbGF5dHlwZTsKKyNkZWZpbmUgRElTUExBWV9XT1JEUwkwCisjZGVmaW5lIERJU1BMQVlfQllURVMJMQorI2RlZmluZSBESVNQTEFZX1NUUklORwkyCisjZGVmaW5lIERJU1BMQVlfWFNUUklORwkzCit9IHJlY29yZF90YWJsZVtdID0geworI2RlZmluZSBERUJVR19SRUMobmFtZSx0eXBlKSB7IEhFUk1FU19SSURfIyNuYW1lLCAjbmFtZSwgRElTUExBWV8jI3R5cGUgfQorCURFQlVHX1JFQyhDTkZQT1JUVFlQRSxXT1JEUyksCisJREVCVUdfUkVDKENORk9XTk1BQ0FERFIsQllURVMpLAorCURFQlVHX1JFQyhDTkZERVNJUkVEU1NJRCxTVFJJTkcpLAorCURFQlVHX1JFQyhDTkZPV05DSEFOTkVMLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GT1dOU1NJRCxTVFJJTkcpLAorCURFQlVHX1JFQyhDTkZPV05BVElNV0lORE9XLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU1lTVEVNU0NBTEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQVhEQVRBTEVOLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUE1FTkFCTEVELFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUE1FUFMsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNVUxUSUNBU1RSRUNFSVZFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTUFYU0xFRVBEVVJBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORlBNSE9MRE9WRVJEVVJBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORk9XTk5BTUUsU1RSSU5HKSwKKwlERUJVR19SRUMoQ05GT1dORFRJTVBFUklPRCxXT1JEUyksCisJREVCVUdfUkVDKENORk1VTFRJQ0FTVFBNQlVGRkVSSU5HLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQRU5BQkxFRF9BR0VSRSxXT1JEUyksCisJREVCVUdfUkVDKENORk1BTkRBVE9SWUJTU0lEX1NZTUJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORldFUERFRkFVTFRLRVlJRCxXT1JEUyksCisJREVCVUdfUkVDKENORkRFRkFVTFRLRVkwLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GREVGQVVMVEtFWTEsQllURVMpLAorCURFQlVHX1JFQyhDTkZNV09ST0JVU1RfQUdFUkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMixCWVRFUyksCisJREVCVUdfUkVDKENORkRFRkFVTFRLRVkzLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GV0VQRkxBR1NfSU5URVJTSUwsV09SRFMpLAorCURFQlVHX1JFQyhDTkZXRVBLRVlNQVBQSU5HVEFCTEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBVVRIRU5USUNBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORk1BWEFTU09DU1RBLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GS0VZTEVOR1RIX1NZTUJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORlRYQ09OVFJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORlJPQU1JTkdNT0RFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GSE9TVEFVVEhFTlRJQ0FUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUkNWQ1JDRVJST1IsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNTUxJRkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBTFRSRVRSWUNPVU5ULFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQkVBQ09OSU5ULFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQVBQQ0ZJTkZPLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU1RBUENGSU5GTyxXT1JEUyksCisJREVCVUdfUkVDKENORlBSSU9SSVRZUVVTQUdFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVElNQ1RSTCxXT1JEUyksCisJREVCVUdfUkVDKENORlRISVJUWTJUQUxMWSxXT1JEUyksCisJREVCVUdfUkVDKENORkVOSFNFQ1VSSVRZLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GR1JPVVBBRERSRVNTRVMsQllURVMpLAorCURFQlVHX1JFQyhDTkZDUkVBVEVJQlNTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRCxXT1JEUyksCisJREVCVUdfUkVDKENORlJUU1RIUkVTSE9MRCxXT1JEUyksCisJREVCVUdfUkVDKENORlRYUkFURUNPTlRST0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZQUk9NSVNDVU9VU01PREUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZCQVNJQ1JBVEVTX1NZTUJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORlBSRUFNQkxFX1NZTUJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORlNIT1JUUFJFQU1CTEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZXRVBLRVlTX0FHRVJFLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GRVhDTFVERUxPTkdQUkVBTUJMRSxXT1JEUyksCisJREVCVUdfUkVDKENORlRYS0VZX0FHRVJFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQVVUSEVOVElDQVRJT05SU1BUTyxXT1JEUyksCisJREVCVUdfUkVDKENORkJBU0lDUkFURVMsV09SRFMpLAorCURFQlVHX1JFQyhDTkZTVVBQT1JURURSQVRFUyxXT1JEUyksCisJREVCVUdfUkVDKENORlRJQ0tUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU0NBTlJFUVVFU1QsV09SRFMpLAorCURFQlVHX1JFQyhDTkZKT0lOUkVRVUVTVCxXT1JEUyksCisJREVCVUdfUkVDKENORkFVVEhFTlRJQ0FURVNUQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZDSEFOTkVMSU5GT1JFUVVFU1QsV09SRFMpLAorCURFQlVHX1JFQyhNQVhMT0FEVElNRSxXT1JEUyksCisJREVCVUdfUkVDKERPV05MT0FEQlVGRkVSLFdPUkRTKSwKKwlERUJVR19SRUMoUFJJSUQsV09SRFMpLAorCURFQlVHX1JFQyhQUklTVVBSQU5HRSxXT1JEUyksCisJREVCVUdfUkVDKENGSUFDVFJBTkdFUyxXT1JEUyksCisJREVCVUdfUkVDKE5JQ1NFUk5VTSxYU1RSSU5HKSwKKwlERUJVR19SRUMoTklDSUQsV09SRFMpLAorCURFQlVHX1JFQyhNRklTVVBSQU5HRSxXT1JEUyksCisJREVCVUdfUkVDKENGSVNVUFJBTkdFLFdPUkRTKSwKKwlERUJVR19SRUMoQ0hBTk5FTExJU1QsV09SRFMpLAorCURFQlVHX1JFQyhSRUdVTEFUT1JZRE9NQUlOUyxXT1JEUyksCisJREVCVUdfUkVDKFRFTVBUWVBFLFdPUkRTKSwKKy8qICAJREVCVUdfUkVDKENJUyxCWVRFUyksICovCisJREVCVUdfUkVDKFNUQUlELFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVFNTSUQsU1RSSU5HKSwKKwlERUJVR19SRUMoQ1VSUkVOVEJTU0lELEJZVEVTKSwKKwlERUJVR19SRUMoQ09NTVNRVUFMSVRZLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVFRYUkFURSxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRCRUFDT05JTlRFUlZBTCxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRTQ0FMRVRIUkVTSE9MRFMsV09SRFMpLAorCURFQlVHX1JFQyhQUk9UT0NPTFJTUFRJTUUsV09SRFMpLAorCURFQlVHX1JFQyhTSE9SVFJFVFJZTElNSVQsV09SRFMpLAorCURFQlVHX1JFQyhMT05HUkVUUllMSU1JVCxXT1JEUyksCisJREVCVUdfUkVDKE1BWFRSQU5TTUlUTElGRVRJTUUsV09SRFMpLAorCURFQlVHX1JFQyhNQVhSRUNFSVZFTElGRVRJTUUsV09SRFMpLAorCURFQlVHX1JFQyhDRlBPTExBQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQVVUSEVOVElDQVRJT05BTEdPUklUSE1TLFdPUkRTKSwKKwlERUJVR19SRUMoUFJJVkFDWU9QVElPTklNUExFTUVOVEVELFdPUkRTKSwKKwlERUJVR19SRUMoT1dOTUFDQUREUixCWVRFUyksCisJREVCVUdfUkVDKFNDQU5SRVNVTFRTVEFCTEUsV09SRFMpLAorCURFQlVHX1JFQyhQSFlUWVBFLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVENIQU5ORUwsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UUE9XRVJTVEFURSxXT1JEUyksCisJREVCVUdfUkVDKENDQU1PREUsV09SRFMpLAorCURFQlVHX1JFQyhTVVBQT1JURUREQVRBUkFURVMsV09SRFMpLAorCURFQlVHX1JFQyhCVUlMRFNFUSxCWVRFUyksCisJREVCVUdfUkVDKEZXSUQsWFNUUklORykKKyN1bmRlZiBERUJVR19SRUMKK307CisKKyNkZWZpbmUgREVCVUdfTFRWX1NJWkUJCTEyOAorCitzdGF0aWMgaW50IG9yaW5vY29fZGVidWdfZHVtcF9yZWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXU4ICp2YWw4OworCXUxNiAqdmFsMTY7CisJaW50IGksajsKKwl1MTYgbGVuZ3RoOworCWludCBlcnI7CisKKwkvKiBJJ20gbm90IHN1cmU6IHdlIG1pZ2h0IGhhdmUgYSBsb2NrIGhlcmUsIHNvIHdlJ2QgYmV0dGVyIGdvCisgICAgICAgICAgIGF0b21pYywganVzdCBpbiBjYXNlLiAqLworCXZhbDggPSBrbWFsbG9jKERFQlVHX0xUVl9TSVpFICsgMiwgR0ZQX0FUT01JQyk7CisJaWYgKCEgdmFsOCkKKwkJcmV0dXJuIC1FTk9NRU07CisJdmFsMTYgPSAodTE2ICopdmFsODsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlY29yZF90YWJsZSk7IGkrKykgeworCQl1MTYgcmlkID0gcmVjb3JkX3RhYmxlW2ldLnJpZDsKKwkJaW50IGxlbjsKKworCQltZW1zZXQodmFsOCwgMCwgREVCVUdfTFRWX1NJWkUgKyAyKTsKKworCQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCByaWQsIERFQlVHX0xUVl9TSVpFLAorCQkJCSAgICAgICZsZW5ndGgsIHZhbDgpOworCQlpZiAoZXJyKSB7CisJCQlERUJVRygwLCAiRXJyb3IgJWQgcmVhZGluZyBSSUQgMHglMDR4XG4iLCBlcnIsIHJpZCk7CisJCQljb250aW51ZTsKKwkJfQorCQl2YWwxNiA9ICh1MTYgKil2YWw4OworCQlpZiAobGVuZ3RoID09IDApCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiJS0xNXMgKDB4JTA0eCk6IGxlbmd0aD0lZCAoJWQgYnl0ZXMpXHR2YWx1ZT0iLAorCQkgICAgICAgcmVjb3JkX3RhYmxlW2ldLm5hbWUsCisJCSAgICAgICByaWQsIGxlbmd0aCwgKGxlbmd0aC0xKSoyKTsKKwkJbGVuID0gbWluKCgoaW50KWxlbmd0aC0xKSoyLCBERUJVR19MVFZfU0laRSk7CisKKwkJc3dpdGNoIChyZWNvcmRfdGFibGVbaV0uZGlzcGxheXR5cGUpIHsKKwkJY2FzZSBESVNQTEFZX1dPUkRTOgorCQkJZm9yIChqID0gMDsgaiA8IGxlbiAvIDI7IGorKykKKwkJCQlwcmludGsoIiUwNFgtIiwgbGUxNl90b19jcHUodmFsMTZbal0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElTUExBWV9CWVRFUzoKKwkJZGVmYXVsdDoKKwkJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKwkJCQlwcmludGsoIiUwMlg6IiwgdmFsOFtqXSk7CisJCQlicmVhazsKKworCQljYXNlIERJU1BMQVlfU1RSSU5HOgorCQkJbGVuID0gbWluKGxlbiwgbGUxNl90b19jcHUodmFsMTZbMF0pKzIpOworCQkJdmFsOFtsZW5dID0gJ1wwJzsKKwkJCXByaW50aygiXCIlc1wiIiwgKGNoYXIgKikmdmFsMTZbMV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBESVNQTEFZX1hTVFJJTkc6CisJCQlwcmludGsoIiclcyciLCAoY2hhciAqKXZhbDgpOworCQl9CisKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWtmcmVlKHZhbDgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKK3N0YXRpYyB2b2lkIHNob3dfcnhfZnJhbWUoc3RydWN0IG9yaW5vY29fcnhmcmFtZV9oZHIgKmZyYW1lKQoreworCXByaW50ayhLRVJOX0RFQlVHICJSWCBkZXNjcmlwdG9yOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc3RhdHVzICAgICAgPSAweCUwNHhcbiIsIGZyYW1lLT5kZXNjLnN0YXR1cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgdGltZSAgICAgICAgPSAweCUwOHhcbiIsIGZyYW1lLT5kZXNjLnRpbWUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHNpbGVuY2UgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+ZGVzYy5zaWxlbmNlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzaWduYWwgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPmRlc2Muc2lnbmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICByYXRlICAgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPmRlc2MucmF0ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgcnhmbG93ICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnJ4Zmxvdyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgcmVzZXJ2ZWQgICAgPSAweCUwOHhcbiIsIGZyYW1lLT5kZXNjLnJlc2VydmVkKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJRUVFIDgwMi4xMSBoZWFkZXI6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBmcmFtZV9jdGwgICA9IDB4JTA0eFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5mcmFtZV9jdGwpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGR1cmF0aW9uX2lkID0gMHglMDR4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmR1cmF0aW9uX2lkKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBhZGRyMSAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIxWzBdLCBmcmFtZS0+cDgwMjExLmFkZHIxWzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIxWzJdLCBmcmFtZS0+cDgwMjExLmFkZHIxWzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIxWzRdLCBmcmFtZS0+cDgwMjExLmFkZHIxWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBhZGRyMiAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIyWzBdLCBmcmFtZS0+cDgwMjExLmFkZHIyWzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIyWzJdLCBmcmFtZS0+cDgwMjExLmFkZHIyWzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIyWzRdLCBmcmFtZS0+cDgwMjExLmFkZHIyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBhZGRyMyAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIzWzBdLCBmcmFtZS0+cDgwMjExLmFkZHIzWzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIzWzJdLCBmcmFtZS0+cDgwMjExLmFkZHIzWzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHIzWzRdLCBmcmFtZS0+cDgwMjExLmFkZHIzWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzZXFfY3RsICAgICA9IDB4JTA0eFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5zZXFfY3RsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBhZGRyNCAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHI0WzBdLCBmcmFtZS0+cDgwMjExLmFkZHI0WzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHI0WzJdLCBmcmFtZS0+cDgwMjExLmFkZHI0WzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmFkZHI0WzRdLCBmcmFtZS0+cDgwMjExLmFkZHI0WzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBkYXRhX2xlbiAgICA9IDB4JTA0eFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5kYXRhX2xlbik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSUVFRSA4MDIuMyBoZWFkZXI6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBkZXN0ICAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9kZXN0WzBdLCBmcmFtZS0+cDgwMjMuaF9kZXN0WzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9kZXN0WzJdLCBmcmFtZS0+cDgwMjMuaF9kZXN0WzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9kZXN0WzRdLCBmcmFtZS0+cDgwMjMuaF9kZXN0WzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzcmMgICAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbMF0sIGZyYW1lLT5wODAyMy5oX3NvdXJjZVsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfc291cmNlWzJdLCBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbM10sCisJICAgICAgIGZyYW1lLT5wODAyMy5oX3NvdXJjZVs0XSwgZnJhbWUtPnA4MDIzLmhfc291cmNlWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBsZW4gICAgICAgICA9IDB4JTA0eFxuIiwgZnJhbWUtPnA4MDIzLmhfcHJvdG8pOworCisJcHJpbnRrKEtFUk5fREVCVUcgIklFRUUgODAyLjIgTExDL1NOQVAgaGVhZGVyOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgRFNBUCAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5wODAyMi5kc2FwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBTU0FQICAgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPnA4MDIyLnNzYXApOworCXByaW50ayhLRVJOX0RFQlVHICIgIGN0cmwgICAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+cDgwMjIuY3RybCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1VJICAgICAgICAgPSAlMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIyLm91aVswXSwgZnJhbWUtPnA4MDIyLm91aVsxXSwgZnJhbWUtPnA4MDIyLm91aVsyXSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZXRoZXJ0eXBlICA9IDB4JTA0eFxuIiwgZnJhbWUtPmV0aGVydHlwZSk7Cit9CisjZW5kaWYgLyogMCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0VYUE9SVF9TWU1CT0woYWxsb2Nfb3Jpbm9jb2Rldik7CitFWFBPUlRfU1lNQk9MKGZyZWVfb3Jpbm9jb2Rldik7CisKK0VYUE9SVF9TWU1CT0woX19vcmlub2NvX3VwKTsKK0VYUE9SVF9TWU1CT0woX19vcmlub2NvX2Rvd24pOworRVhQT1JUX1NZTUJPTChvcmlub2NvX3N0b3ApOworRVhQT1JUX1NZTUJPTChvcmlub2NvX3JlaW5pdF9maXJtd2FyZSk7CisKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19pbnRlcnJ1cHQpOworCisvKiBDYW4ndCBiZSBkZWNsYXJlZCAiY29uc3QiIG9yIHRoZSB3aG9sZSBfX2luaXRkYXRhIHNlY3Rpb24gd2lsbAorICogYmVjb21lIGNvbnN0ICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4sICIKKwkiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIGV0IGFsKSI7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3Jpbm9jbyh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X29yaW5vY28odm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoaW5pdF9vcmlub2NvKTsKK21vZHVsZV9leGl0KGV4aXRfb3Jpbm9jbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlNDJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaApAQCAtMCwwICsxLDE1MyBAQAorLyogb3Jpbm9jby5oCisgKiAKKyAqIENvbW1vbiBkZWZpbml0aW9ucyB0byBhbGwgcGllY2VzIG9mIHRoZSB2YXJpb3VzIG9yaW5vY28KKyAqIGRyaXZlcnMKKyAqLworCisjaWZuZGVmIF9PUklOT0NPX0gKKyNkZWZpbmUgX09SSU5PQ09fSAorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjE0YWxwaGEyIgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisKKy8qIFRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyAqLworLy8jZGVmaW5lIE9SSU5PQ09fREVCVUcJCTMKKworI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisKKyNkZWZpbmUgT1JJTk9DT19NQVhfS0VZX1NJWkUJMTQKKyNkZWZpbmUgT1JJTk9DT19NQVhfS0VZUwk0CisKK3N0cnVjdCBvcmlub2NvX2tleSB7CisJdTE2IGxlbjsJLyogYWx3YXlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuICovCisJY2hhciBkYXRhW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCit0eXBlZGVmIGVudW0geworCUZJUk1XQVJFX1RZUEVfQUdFUkUsCisJRklSTVdBUkVfVFlQRV9JTlRFUlNJTCwKKwlGSVJNV0FSRV9UWVBFX1NZTUJPTAorfSBmd3R5cGVfdDsKKworc3RydWN0IG9yaW5vY29fcHJpdmF0ZSB7CisJdm9pZCAqY2FyZDsJLyogUG9pbnRlciB0byBjYXJkIGRlcGVuZGVudCBzdHJ1Y3R1cmUgKi8KKwlpbnQgKCpoYXJkX3Jlc2V0KShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICopOworCisJLyogU3luY2hyb25pc2F0aW9uIHN0dWZmICovCisJc3BpbmxvY2tfdCBsb2NrOworCWludCBod191bmF2YWlsYWJsZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKKworCS8qIGRyaXZlciBzdGF0ZSAqLworCWludCBvcGVuOworCXUxNiBsYXN0X2xpbmtzdGF0dXM7CisKKwkvKiBOZXQgZGV2aWNlIHN0dWZmICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCisJLyogSGFyZHdhcmUgY29udHJvbCB2YXJpYWJsZXMgKi8KKwloZXJtZXNfdCBodzsKKwl1MTYgdHhmaWQ7CisKKwkvKiBDYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlL2Zpcm13YXJlICovCisJZnd0eXBlX3QgZmlybXdhcmVfdHlwZTsKKwljaGFyIGZ3X25hbWVbMzJdOworCWludCBpYnNzX3BvcnQ7CisJaW50IG5pY2J1Zl9zaXplOworCXUxNiBjaGFubmVsX21hc2s7CisKKwkvKiBCb29sZWFuIGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIGludCBoYXNfaWJzczoxOworCXVuc2lnbmVkIGludCBoYXNfcG9ydDM6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3dlcDoxOworCXVuc2lnbmVkIGludCBoYXNfYmlnX3dlcDoxOworCXVuc2lnbmVkIGludCBoYXNfbXdvOjE7CisJdW5zaWduZWQgaW50IGhhc19wbToxOworCXVuc2lnbmVkIGludCBoYXNfcHJlYW1ibGU6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3NlbnNpdGl2aXR5OjE7CisJdW5zaWduZWQgaW50IGJyb2tlbl9kaXNhYmxlcG9ydDoxOworCisJLyogQ29uZmlndXJhdGlvbiBwYXJhbWF0ZXJzICovCisJdTMyIGl3X21vZGU7CisJaW50IHByZWZlcl9wb3J0MzsKKwl1MTYgd2VwX29uLCB3ZXBfcmVzdHJpY3QsIHR4X2tleTsKKwlzdHJ1Y3Qgb3Jpbm9jb19rZXkga2V5c1tPUklOT0NPX01BWF9LRVlTXTsKKwlpbnQgYml0cmF0ZW1vZGU7CisgCWNoYXIgbmlja1tJV19FU1NJRF9NQVhfU0laRSsxXTsKKwljaGFyIGRlc2lyZWRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdTE2IGZyYWdfdGhyZXNoLCBtd29fcm9idXN0OworCXUxNiBjaGFubmVsOworCXUxNiBhcF9kZW5zaXR5LCBydHNfdGhyZXNoOworCXUxNiBwbV9vbiwgcG1fbWNhc3QsIHBtX3BlcmlvZCwgcG1fdGltZW91dDsKKwl1MTYgcHJlYW1ibGU7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisJaW50CQkJc3B5X251bWJlcjsKKwl1X2NoYXIJCQlzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07CisJc3RydWN0IGl3X3F1YWxpdHkJc3B5X3N0YXRbSVdfTUFYX1NQWV07CisjZW5kaWYKKworCS8qIENvbmZpZ3VyYXRpb24gZGVwZW5kZW50IHZhcmlhYmxlcyAqLworCWludCBwb3J0X3R5cGUsIGNyZWF0ZWlic3M7CisJaW50IHByb21pc2N1b3VzLCBtY19jb3VudDsKK307CisKKyNpZmRlZiBPUklOT0NPX0RFQlVHCitleHRlcm4gaW50IG9yaW5vY29fZGVidWc7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgaWYgKG9yaW5vY29fZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCS8qIE9SSU5PQ09fREVCVUcgKi8KKworI2RlZmluZSBUUkFDRV9FTlRFUihkZXZuYW1lKSBERUJVRygyLCAiJXM6IC0+ICVzKClcbiIsIGRldm5hbWUsIF9fRlVOQ1RJT05fXyk7CisjZGVmaW5lIFRSQUNFX0VYSVQoZGV2bmFtZSkgIERFQlVHKDIsICIlczogPC0gJXMoKVxuIiwgZGV2bmFtZSwgX19GVU5DVElPTl9fKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXhwb3J0ZWQgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX29yaW5vY29kZXYoaW50IHNpemVvZl9jYXJkLAorCQkJCQkgICBpbnQgKCpoYXJkX3Jlc2V0KShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICopKTsKK2V4dGVybiB2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgX19vcmlub2NvX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBfX29yaW5vY29fZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgb3Jpbm9jb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpcnFyZXR1cm5fdCBvcmlub2NvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgZnVuY3Rpb25zICptdXN0KiBiZSBpbmxpbmUgb3IgdGhleSB3aWxsIGJyZWFrIGhvcnJpYmx5IG9uCisgKiBTUEFSQywgZHVlIHRvIGl0cyB3ZWlyZCBzZW1hbnRpY3MgZm9yIHNhdmUvcmVzdG9yZSBmbGFncy4gZXh0ZXJuCisgKiBpbmxpbmUgc2hvdWxkIHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIGxpbmtpbmcgb3IgbW9kdWxlIGZyb20KKyAqIGxvYWRpbmcgaWYgdGhleSBhcmUgbm90IGlubGluZWQuICovCitleHRlcm4gaW5saW5lIGludCBvcmlub2NvX2xvY2soc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgKmZsYWdzKTsKKwlpZiAocHJpdi0+aHdfdW5hdmFpbGFibGUpIHsKKwkJREVCVUcoMSwgIm9yaW5vY29fbG9jaygpIGNhbGxlZCB3aXRoIGh3X3VuYXZhaWxhYmxlIChkZXY9JXApXG4iLAorCQkgICAgICAgcHJpdi0+bmRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssICpmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgb3Jpbm9jb191bmxvY2soc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssICpmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBfT1JJTk9DT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhODIyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtMCwwICsxLDYzNiBAQAorLyogb3Jpbm9jb19jcy5jIChmb3JtZXJseSBrbm93biBhcyBkbGR3ZF9jcy5jKQorICoKKyAqIEEgZHJpdmVyIGZvciAiSGVybWVzIiBjaGlwc2V0IGJhc2VkIFBDTUNJQSB3aXJlbGVzcyBhZGFwdG9ycywgc3VjaAorICogYXMgdGhlIEx1Y2VudCBXYXZlbGFuSUVFRS9Pcmlub2NvIGNhcmRzIGFuZCB0aGVpciBPRU0gKENhYmxldHJvbi8KKyAqIEVudGVyYVN5cyBSb2FtQWJvdXQgODAyLjExLCBFTFNBIEFpcmxhbmNlciwgTWVsY28gQnVmZmFsbyBhbmQgb3RoZXJzKS4KKyAqIEl0IHNob3VsZCBhbHNvIGJlIHVzYWJsZSBvbiB2YXJpb3VzIFByaXNtIElJIGJhc2VkIGNhcmRzIHN1Y2ggYXMgdGhlCisgKiBMaW5rc3lzLCBELUxpbmsgYW5kIEZhcmFsbG9uIFNreWxpbmUuIEl0IHNob3VsZCBhbHNvIHdvcmsgb24gU3ltYm9sCisgKiBjYXJkcyBzdWNoIGFzIHRoZSAzQ29tIEFpckNvbm5lY3QgYW5kIEVyaWNzc29uIFdMQU4uCisgKiAKKyAqIENvcHlyaWdodCBub3RpY2UgJiByZWxlYXNlIG5vdGVzIGluIGZpbGUgb3Jpbm9jby5jCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jb19jcyIKKyNkZWZpbmUgUEZYIERSSVZFUl9OQU1FICI6ICIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmICBfX0lOX1BDTUNJQV9QQUNLQUdFX18KKyNpbmNsdWRlIDxwY21jaWEva19jb21wYXQuaD4KKyNlbmRpZiAvKiBfX0lOX1BDTUNJQV9QQUNLQUdFX18gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm9yaW5vY28uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIHN0dWZmCQkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgUENNQ0lBIEx1Y2VudCBPcmlub2NvLCBQcmlzbSBJSSBiYXNlZCBhbmQgc2ltaWxhciB3aXJlbGVzcyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCisvKiBTb21lIEQtTGluayBjYXJkcyBoYXZlIGJ1Z2d5IENJUy4gVGhleSBkbyB3b3JrIGF0IDV2IHByb3Blcmx5LCBidXQKKyAqIGRvbid0IGhhdmUgYW55IENJUyBlbnRyeSBmb3IgaXQuIFRoaXMgd29ya2Fyb3VuZCBpdC4uLiAqLworc3RhdGljIGludCBpZ25vcmVfY2lzX3ZjYzsgLyogPSAwICovCittb2R1bGVfcGFyYW0oaWdub3JlX2Npc192Y2MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9jaXNfdmNjLCAiQWxsb3cgdm9sdGFnZSBtaXNtYXRjaCBiZXR3ZWVuIGNhcmQgYW5kIHNvY2tldCIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWdpYyBjb25zdGFudHMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKKyAqIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZAorICogY29uZmlndXJhdGlvbiBkYXRhYmFzZS4KKyAqLworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSBEUklWRVJfTkFNRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGF0YSBzdHJ1Y3R1cmVzCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBDTUNJQSBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24gKGdvZXMgaW4gdGhlIGNhcmQgZmllbGQgb2YKKyAqIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKi8KK3N0cnVjdCBvcmlub2NvX3BjY2FyZCB7CisJZGV2X2xpbmtfdCBsaW5rOworCWRldl9ub2RlX3Qgbm9kZTsKKworCS8qIFVzZWQgdG8gaGFuZGxlIGhhcmQgcmVzZXQgKi8KKwkvKiB5dWNrLCB3ZSBuZWVkIHRoaXMgaGFjayB0byB3b3JrIGFyb3VuZCB0aGUgaW5zYW5pdHkgb2YgdGhlCisgICAgICAgICAqIFBDTUNJQSBsYXllciAqLworCXVuc2lnbmVkIGxvbmcgaGFyZF9yZXNldF9pbl9wcm9ncmVzczsgCit9OworCisvKgorICogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgZGV2aWNlLiAgRWFjaCBhY3R1YWwgUENNQ0lBCisgKiBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQgYnkgb25lCisgKiBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OyAvKiA9IE5VTEwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gcHJvdG90eXBlcwkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZXZpY2UgbWV0aG9kcyAqLworc3RhdGljIGludCBvcmlub2NvX2NzX2hhcmRfcmVzZXQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdik7CisKKy8qIFBDTUNJQSBndW1wZiAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19jc19jb25maWcoZGV2X2xpbmtfdCAqIGxpbmspOworc3RhdGljIHZvaWQgb3Jpbm9jb19jc19yZWxlYXNlKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyBpbnQgb3Jpbm9jb19jc19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICogYXJncyk7CisKK3N0YXRpYyBkZXZfbGlua190ICpvcmlub2NvX2NzX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBtZXRob2RzICAgICAJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorb3Jpbm9jb19jc19oYXJkX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwlkZXZfbGlua190ICpsaW5rID0gJmNhcmQtPmxpbms7CisJaW50IGVycjsKKworCS8qIFdlIG5lZWQgYXRvbWljIG9wcyBoZXJlLCBiZWNhdXNlIHdlJ3JlIG5vdCBob2xkaW5nIHRoZSBsb2NrICovCisJc2V0X2JpdCgwLCAmY2FyZC0+aGFyZF9yZXNldF9pbl9wcm9ncmVzcyk7CisKKwllcnIgPSBwY21jaWFfcmVzZXRfY2FyZChsaW5rLT5oYW5kbGUsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltc2xlZXAoMTAwKTsKKwljbGVhcl9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDTUNJQSBzdHVmZiAgICAgCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEKKyAqIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiBTZXJ2aWNlcy4KKyAqIAorICogVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgKiBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYSBjYXJkCisgKiBpbnNlcnRpb24gZXZlbnQuICAqLworc3RhdGljIGRldl9saW5rX3QgKgorb3Jpbm9jb19jc19hdHRhY2godm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkOworCWRldl9saW5rX3QgKmxpbms7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJaW50IHJldDsKKworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgb3Jpbm9jb19jc19oYXJkX3Jlc2V0KTsKKwlpZiAoISBkZXYpCisJCXJldHVybiBOVUxMOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCisJLyogTGluayBib3RoIHN0cnVjdHVyZXMgdG9nZXRoZXIgKi8KKwlsaW5rID0gJmNhcmQtPmxpbms7CisJbGluay0+cHJpdiA9IGRldjsKKworCS8qIEludGVycnVwdCBzZXR1cCAqLworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKwlsaW5rLT5pcnEuSGFuZGxlciA9IG9yaW5vY29faW50ZXJydXB0OworCWxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsgCisKKwkvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbiBnbyBoZXJlLiAgSW4gdGhpcworCSAqIGNsaWVudCwgd2UgYXNzdW1lIHZlcnkgbGl0dGxlLCBhbmQgcmVseSBvbiB0aGUgQ0lTIGZvcgorCSAqIGFsbW9zdCBldmVyeXRoaW5nLiAgSW4gbW9zdCBjbGllbnRzLCBtYW55IGRldGFpbHMgKGkuZS4sCisJICogbnVtYmVyLCBzaXplcywgYW5kIGF0dHJpYnV0ZXMgb2YgSU8gd2luZG93cykgYXJlIGZpeGVkIGJ5CisJICogdGhlIG5hdHVyZSBvZiB0aGUgZGV2aWNlLCBhbmQgY2FuIGJlIGhhcmQtd2lyZWQgaGVyZS4gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSAwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJLyogRklYTUU6IG5lZWQgYSBsb2NrPyAqLworCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCA9IGxpbms7CisKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZvcmlub2NvX2NzX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsgLyogRklYTUU6IHdoYXQgZG9lcyB0aGlzIG1lYW4/ICovCisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlvcmlub2NvX2NzX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxpbms7Cit9CQkJCS8qIG9yaW5vY29fY3NfYXR0YWNoICovCisKKy8qCisgKiBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZCB3aXRoCisgKiBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMKKyAqIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBkZXZpY2UKKyAqIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZCBvcmlub2NvX2NzX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKQorCQkJYnJlYWs7CisKKwlCVUdfT04oKmxpbmtwID09IE5VTEwpOworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJb3Jpbm9jb19jc19yZWxlYXNlKGxpbmspOworCisJLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIGZyZWUgaXQgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCURFQlVHKDAsIFBGWCAiZGV0YWNoOiBsaW5rPSVwIGxpbmstPmRldj0lcFxuIiwgbGluaywgbGluay0+ZGV2KTsKKwlpZiAobGluay0+ZGV2KSB7CisJCURFQlVHKDAsIFBGWCAiQWJvdXQgdG8gdW5yZWdpc3RlciBuZXQgZGV2aWNlICVwXG4iLAorCQkgICAgICBkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCX0KKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKK30JCQkJLyogb3Jpbm9jb19jc19kZXRhY2ggKi8KKworLyoKKyAqIG9yaW5vY29fY3NfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OCisgKiBldmVudCBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAqIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIGRvIHsgXAorCQlsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCitvcmlub2NvX2NzX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGxhc3RfZm4sIGxhc3RfcmV0OworCXVfY2hhciBidWZbNjRdOworCWNvbmZpZ19pbmZvX3QgY29uZjsKKwljaXNpbmZvX3QgaW5mbzsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJdm9pZCBfX2lvbWVtICptZW07CisKKwlDU19DSEVDSyhWYWxpZGF0ZUNJUywgcGNtY2lhX3ZhbGlkYXRlX2NpcyhoYW5kbGUsICZpbmZvKSk7CisKKwkvKgorCSAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMKKwkgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKwkgKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKwkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLworCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAorCQkgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmY29uZikpOworCWxpbmstPmNvbmYuVmNjID0gY29uZi5WY2M7CisKKwkvKgorCSAqIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlCisJICogZW50cmllcywgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkCisJICogY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywKKwkgKiBhbmQgaW50ZXJydXB0IHNldHRpbmdzLgorCSAqCisJICogV2UgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FyZCB0byBiZSBjb25maWd1cmVkOiB3ZQorCSAqIHVzZSBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsCisJICogd29ybGQsIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMKKwkgKiBhIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZSBDSVMuICBJbiBwcmFjdGljZSwgYSBkcml2ZXIgdXN1YWxseQorCSAqICJrbm93cyIgbW9zdCBvZiB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsCisJICogYW5kIG1vc3QgY2xpZW50IGRyaXZlcnMgd2lsbCBvbmx5IHVzZSB0aGUgQ0lTIHRvIGZpbGwgaW4KKwkgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgLmluZGV4ID0gMCB9OworCisJCWlmICggKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCkKKwkJICAgIHx8IChwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkpCisJCQlnb3RvIG5leHRfZW50cnk7CisKKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQorCQkJZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCisJCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLworCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisJCX0KKworCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkJLyogTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCkgeworCQkJCURFQlVHKDIsICJvcmlub2NvX2NzX2NvbmZpZzogVmNjIG1pc21hdGNoIChjb25mLlZjYyA9ICVkLCBDSVMgPSAlZClcbiIsICBjb25mLlZjYywgY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOworCQkJCWlmICghaWdub3JlX2Npc192Y2MpCisJCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCX0KKwkJfSBlbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCQlERUJVRygyLCAib3Jpbm9jb19jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgQ0lTID0gJWQpXG4iLCAgY29uZi5WY2MsIGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKTsKKwkJCQlpZighaWdub3JlX2Npc192Y2MpCisJCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCX0KKwkJfQorCisJCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkgICAgY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQllbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7CisJCQljaXN0cGxfaW9fdCAqaW8gPQorCQkJICAgIChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPQorCQkJCSAgICBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KKwkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9CisJCQkgICAgaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9CisJCQkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKworCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKworCisJCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KKworCQlicmVhazsKKwkJCisJbmV4dF9lbnRyeToKKwkJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpOworCQlpZiAobGFzdF9yZXQgID09IENTX05PX01PUkVfSVRFTVMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkdldE5leHRUdXBsZSgpOiBObyBtYXRjaGluZyAiCisJCQkgICAgICAgIkNJUyBjb25maWd1cmF0aW9uLiAgTWF5YmUgeW91IG5lZWQgdGhlICIKKwkJCSAgICAgICAiaWdub3JlX2Npc192Y2M9MSBwYXJhbWV0ZXIuXG4iKTsKKwkJCWdvdG8gY3NfZmFpbGVkOworCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbgorCSAqIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YKKwkgKiB0aGUgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKwkgKi8KKwlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisKKwkvKiBXZSBpbml0aWFsaXplIHRoZSBoZXJtZXMgc3RydWN0dXJlIGJlZm9yZSBjb21wbGV0aW5nIFBDTUNJQQorCSAqIGNvbmZpZ3VyYXRpb24ganVzdCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzCisJICogY2FsbGVkLiAqLworCW1lbSA9IGlvcG9ydF9tYXAobGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5OdW1Qb3J0czEpOworCWlmICghbWVtKQorCQlnb3RvIGNzX2ZhaWxlZDsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdChodywgbWVtLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisKKwkvKgorCSAqIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAqIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuCisJICovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sCisJCSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCS8qIE9rLCB3ZSBoYXZlIHRoZSBjb25maWd1cmF0aW9uLCBwcmVwYXJlIHRvIHJlZ2lzdGVyIHRoZSBuZXRkZXYgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJY2FyZC0+bm9kZS5tYWpvciA9IGNhcmQtPm5vZGUubWlub3IgPSAwOworCisJU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKwkvKiBUZWxsIHRoZSBzdGFjayB3ZSBleGlzdCAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkcyB0byBiZQorCSAqIGluaXRpYWxpemVkIGFuZCBhcnJhbmdlZCBpbiBhIGxpbmtlZCBsaXN0IGF0IGxpbmstPmRldi4gKi8KKwlzdHJjcHkoY2FyZC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKwlsaW5rLT5kZXYgPSAmY2FyZC0+bm9kZTsgLyogbGluay0+ZGV2IGJlaW5nIG5vbi1OVUxMIGlzIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldF9kZXZpY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKwkvKiBGaW5hbGx5LCByZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGRldi0+bmFtZSwgbGluay0+Y29uZi5Db25maWdJbmRleCwKKwkgICAgICAgbGluay0+Y29uZi5WY2MgLyAxMCwgbGluay0+Y29uZi5WY2MgJSAxMCk7CisJaWYgKGxpbmstPmNvbmYuVnBwMSkKKwkJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwMSAvIDEwLAorCQkgICAgICAgbGluay0+Y29uZi5WcHAxICUgMTApOworCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMikKKwkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyICsgbGluay0+aW8uTnVtUG9ydHMyIC0gMSk7CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuOworCisgY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCisgZmFpbGVkOgorCW9yaW5vY29fY3NfcmVsZWFzZShsaW5rKTsKK30JCQkJLyogb3Jpbm9jb19jc19jb25maWcgKi8KKworLyoKKyAqIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBvcmlub2NvX2NzX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlCisgKiBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAqIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZAorb3Jpbm9jb19jc19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFdlJ3JlIGNvbW1pdHRlZCB0byB0YWtpbmcgdGhlIGRldmljZSBhd2F5IG5vdywgc28gbWFyayB0aGUKKwkgKiBoYXJkd2FyZSBhcyB1bmF2YWlsYWJsZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRKQorCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKwlpZiAocHJpdi0+aHcuaW9iYXNlKQorCQlpb3BvcnRfdW5tYXAocHJpdi0+aHcuaW9iYXNlKTsKK30JCQkJLyogb3Jpbm9jb19jc19yZWxlYXNlICovCisKKy8qCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIgc3R1ZmYKKyAqIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKyAqLworc3RhdGljIGludAorb3Jpbm9jb19jc19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJb3Jpbm9jb19jc19jb25maWcobGluayk7CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJLyogTWFyayB0aGUgZGV2aWNlIGFzIHN0b3BwZWQsIHRvIGJsb2NrIElPIHVudGlsIGxhdGVyICovCisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCS8qIFRoaXMgaXMgcHJvYmFibHkgcmFjeSwgYnV0IEkgY2FuJ3QgdGhpbmsgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYmV0dGVyIHdheSwgc2hvcnQgb2YgcmV3cml0aW5nIHRoZSBQQ01DSUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyIHRvIG5vdCBzdWNrIDotKCAqLworCQkJaWYgKCEgdGVzdF9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQkJCWVyciA9IF9fb3Jpbm9jb19kb3duKGRldik7CisJCQkJaWYgKGVycikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzOiBFcnJvciAlZCBkb3duaW5nIGludGVyZmFjZVxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwKKwkJCQkJICAgICAgIGV2ZW50ID09IENTX0VWRU5UX1BNX1NVU1BFTkQgPyAiU1VTUEVORCIgOiAiUkVTRVRfUEhZU0lDQUwiLAorCQkJCQkgICAgICAgZXJyKTsKKwkJCQkKKwkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQkvKiBGSVhNRTogc2hvdWxkIHdlIGRvdWJsZSBjaGVjayB0aGF0IHRoaXMgaXMKKwkJCSAqIHRoZSBzYW1lIGNhcmQgYXMgd2UgaGFkIGJlZm9yZSAqLworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKworCQkJaWYgKCEgdGVzdF9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpKSB7CisJCQkJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZVxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQkJCisJCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQkJCXByaXYtPmh3X3VuYXZhaWxhYmxlLS07CisJCQkJCisJCQkJaWYgKHByaXYtPm9wZW4gJiYgISBwcml2LT5od191bmF2YWlsYWJsZSkgeworCQkJCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJCQkJaWYgKGVycikKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc3RhcnRpbmcgY2FyZFxuIiwKKwkJCQkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQkJCQorCQkJCX0KKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQkJCQkvKiBvcmlub2NvX2NzX2V2ZW50ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbgkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENhbid0IGJlIGRlY2xhcmVkICJjb25zdCIgb3IgdGhlIHdob2xlIF9faW5pdGRhdGEgc2VjdGlvbiB3aWxsCisgKiBiZWNvbWUgY29uc3QgKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwgIgorCSJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiwgZXQgYWwpIjsKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG9yaW5vY29fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwl9LAorCS5hdHRhY2gJCT0gb3Jpbm9jb19jc19hdHRhY2gsCisJLmRldGFjaAkJPSBvcmlub2NvX2NzX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X29yaW5vY29fY3Modm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X29yaW5vY29fY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3Jpbm9jb19jcyk7Cittb2R1bGVfZXhpdChleGl0X29yaW5vY29fY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzMGQzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBvcmlub2NvX3BjaS5jCisgKiAKKyAqIERyaXZlciBmb3IgUHJpc20gSUkgZGV2aWNlcyB0aGF0IGhhdmUgYSBkaXJlY3QgUENJIGludGVyZmFjZQorICogKGkuZS4sIG5vdCBpbiBhIFBjbWNpYSBvciBQTFggYnJpZGdlKQorICoKKyAqIFNwZWNpZmljYWxseSBoZXJlIHdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIExpbmtzeXMgV01QMTEKKyAqCisgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgorICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+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+IDE2ICovCisKKwlpbnQgbW9uaXRvcl90eXBlOyAvKiBBUlBIUkRfSUVFRTgwMjExIG9yIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gKi8KKworCXN0cnVjdCBpc2xwY2lfYWNsIGFjbDsKKworCS8qIFBDSSBidXMgYWxsb2NhdGlvbiAmIGNvbmZpZ3VyYXRpb24gbWVtYmVycyAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBQQ0kgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisJY2hhciBmaXJtd2FyZVszM107CisKKwl2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlOwkvKiBpb3JlbWFwcGVkIGRldmljZSBiYXNlIGFkZHJlc3MgKi8KKworCS8qIGNvbnNpc3RlbnQgRE1BIHJlZ2lvbiAqLworCXZvaWQgKmRyaXZlcl9tZW1fYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZGV2aWNlX2hvc3RfYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAoYnVzIGFkZHJlc3MpICovCisJZG1hX2FkZHJfdCBkZXZpY2VfcHNtX2J1ZmZlcjsJLyogaG9zdCBtZW1vcnkgZm9yIFBTTSBidWZmZXJpbmcgKGJ1cyBhZGRyZXNzKSAqLworCisJLyogb3VyIG5ldHdvcmtfZGV2aWNlIHN0cnVjdHVyZSAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKworCS8qIGRldmljZSBxdWV1ZSBpbnRlcmZhY2UgbWVtYmVycyAqLworCXN0cnVjdCBpc2wzOHh4X2NiICpjb250cm9sX2Jsb2NrOwkvKiBkZXZpY2UgY29udHJvbCBibG9jayAKKwkJCQkJCQkgICAoPT0gZHJpdmVyX21lbV9hZGRyZXNzISkgKi8KKworCS8qIEVhY2ggcXVldWUgaGFzIHRocmVlIGluZGV4ZXM6CisJICogICBmcmVlL2luZGV4X21nbXQvZGF0YV9yeC90eCAoY2FsbGVkIGluZGV4LCBzZWUgYmVsb3cpLAorCSAqICAgZHJpdmVyX2N1cnJfZnJhZywgYW5kIGRldmljZV9jdXJyX2ZyYWcgKGluIHRoZSBjb250cm9sIGJsb2NrKQorCSAqIEFsbCBpbmRleGVzIGFyZSBldmVyLWluY3JlYXNpbmcsIGJ1dCBpbnRlcnByZXRlZCBtb2R1bG8gdGhlCisJICogZGV2aWNlIHF1ZXVlIHNpemUgd2hlbiB1c2VkLgorCSAqICAgaW5kZXggPD0gZGV2aWNlX2N1cnJfZnJhZyA8PSBkcml2ZXJfY3Vycl9mcmFnICBhdCBhbGwgdGltZXMKKwkgKiBGb3IgcnggcXVldWVzLCBbaW5kZXgsIGRldmljZV9jdXJyX2ZyYWcpIGNvbnRhaW5zIGZyYWdtZW50cworCSAqIHRoYXQgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG5lZWRzIHRvIGhhbmRsZSAob3duZWQgYnkgZHJpdmVyKS4KKwkgKiBbZGV2aWNlX2N1cnJfZnJhZywgZHJpdmVyX2N1cnJfZnJhZykgaXMgdGhlIGZyZWUgc3BhY2UgaW4gdGhlCisJICogcnggcXVldWUsIHdhaXRpbmcgZm9yIGRhdGEgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRvIHRoZSBkZXZpY2UgdGhhdCBtb3JlCisJICogYnVmZmVycyBhcmUgYXZhaWxhYmxlLgorCSAqIElmIGRldmljZV9jdXJyX2ZyYWcgPT0gZHJpdmVyX2N1cnJfZnJhZywgbm8gbW9yZSByeCBidWZmZXJzIGFyZQorCSAqIGF2YWlsYWJsZSwgYW5kIHRoZSByeCBETUEgZW5naW5lIG9mIHRoZSBkZXZpY2UgaXMgaGFsdGVkLgorCSAqIEZvciB0eCBxdWV1ZXMsIFtpbmRleCwgZGV2aWNlX2N1cnJfZnJhZykgY29udGFpbnMgZnJhZ21lbnRzCisJICogd2hlcmUgdHggaXMgZG9uZTsgdGhleSBuZWVkIHRvIGJlIGZyZWVkIChvd25lZCBieSBkcml2ZXIpLgorCSAqIFtkZXZpY2VfY3Vycl9mcmFnLCBkcml2ZXJfY3Vycl9mcmFnKSBjb250YWlucyB0aGUgZnJhbWVzCisJICogdGhhdCBhcmUgYmVpbmcgdHJhbnNmZXJyZWQgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRoYXQgbW9yZSB0eCB3b3JrCisJICogbmVlZHMgdG8gYmUgZG9uZS4KKwkgKi8KKwl1MzIgaW5kZXhfbWdtdF9yeDsgICAgICAgICAgICAgIC8qIHJlYWwgaW5kZXggbWdtdCByeCBxdWV1ZSAqLworCXUzMiBpbmRleF9tZ210X3R4OyAgICAgICAgICAgICAgLyogcmVhZCBpbmRleCBtZ210IHR4IHF1ZXVlICovCisJdTMyIGZyZWVfZGF0YV9yeDsJLyogZnJlZSBwb2ludGVyIGRhdGEgcnggcXVldWUgKi8KKwl1MzIgZnJlZV9kYXRhX3R4OwkvKiBmcmVlIHBvaW50ZXIgZGF0YSB0eCBxdWV1ZSAqLworCXUzMiBkYXRhX2xvd190eF9mdWxsOwkvKiBmdWxsIGRldGVjdGVkIGZsYWcgKi8KKworCS8qIGZyYW1lIG1lbW9yeSBidWZmZXJzIGZvciB0aGUgZGV2aWNlIHF1ZXVlcyAqLworCXN0cnVjdCBpc2xwY2lfbWVtYnVmIG1nbXRfdHhbSVNMMzhYWF9DQl9NR01UX1FTSVpFXTsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBtZ210X3J4W0lTTDM4WFhfQ0JfTUdNVF9RU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFfbG93X3R4W0lTTDM4WFhfQ0JfVFhfUVNJWkVdOworCXN0cnVjdCBza19idWZmICpkYXRhX2xvd19yeFtJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfdHhfYWRkcmVzc1tJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfcnhfYWRkcmVzc1tJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKworCS8qIGRyaXZlciBuZXR3b3JrIGludGVyZmFjZSBtZW1iZXJzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdGlzdGljczsKKworCS8qIHdhaXQgZm9yIGEgcmVzZXQgaW50ZXJydXB0ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfZG9uZTsKKworCS8qIHVzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgbWdtdF9zZW07IC8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gbWFpbGJveCBhbmQgd3F1ZXVlICovCisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKm1nbXRfcmVjZWl2ZWQ7CSAgLyogbWJveCBmb3IgaW5jb21pbmcgZnJhbWUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBtZ210X3dxdWV1ZTsgICAgICAgICAgICAvKiB3YWl0cXVldWUgZm9yIG1ib3ggKi8KKworCS8qIHN0YXRlIG1hY2hpbmUgKi8KKwlpc2xwY2lfc3RhdGVfdCBzdGF0ZTsKKwlpbnQgc3RhdGVfb2ZmOwkJLyogZW51bWVyYXRpb24gb2Ygb2ZmLXN0YXRlLCBpZiAwIHRoZW4KKwkJCQkgKiB3ZSdyZSBub3QgaW4gYW55IG9mZi1zdGF0ZSAqLworCisJLyogV1BBIHN0dWZmICovCisJaW50IHdwYTsgLyogV1BBIG1vZGUgZW5hYmxlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYnNzX3dwYV9saXN0OworCWludCBudW1fYnNzX3dwYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdwYV9zZW07CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKKwlpbnQgcmVzZXRfdGFza19wZW5kaW5nOworfSBpc2xwY2lfcHJpdmF0ZTsKKworc3RhdGljIGlubGluZSBpc2xwY2lfc3RhdGVfdAoraXNscGNpX2dldF9zdGF0ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBsb2NrICovCisJcmV0dXJuIHByaXYtPnN0YXRlOworCS8qIHVubG9jayAqLworfQorCitpc2xwY2lfc3RhdGVfdCBpc2xwY2lfc2V0X3N0YXRlKGlzbHBjaV9wcml2YXRlICpwcml2LCBpc2xwY2lfc3RhdGVfdCBuZXdfc3RhdGUpOworCisjZGVmaW5lIElTTFBDSV9UWF9USU1FT1VUICAgICAgICAgICAgICAgKDIqSFopCisKK2lycXJldHVybl90IGlzbHBjaV9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCitpbnQgcHJpc201NF9wb3N0X3NldHVwKGlzbHBjaV9wcml2YXRlICosIGludCk7CitpbnQgaXNscGNpX3Jlc2V0KGlzbHBjaV9wcml2YXRlICosIGludCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXNscGNpX3RyaWdnZXIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaXNsMzh4eF90cmlnZ2VyX2RldmljZShpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID09IFBSVl9TVEFURV9TTEVFUCwKKwkJCSAgICAgICBwcml2LT5kZXZpY2VfYmFzZSk7Cit9CisKK2ludCBpc2xwY2lfZnJlZV9tZW1vcnkoaXNscGNpX3ByaXZhdGUgKik7CitzdHJ1Y3QgbmV0X2RldmljZSAqaXNscGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICopOworI2VuZGlmCQkJCS8qIF9JU0xQQ0lfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MmU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBOZXR3b3JrIEludGVyZmFjZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2lzbHBjaV9ldGhfY2xlYW51cF90cmFuc21pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICBpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgaW5kZXg7CisKKwkvKiBjb21wYXJlIHRoZSBjb250cm9sIGJsb2NrIHJlYWQgcG9pbnRlciB3aXRoIHRoZSBmcmVlIHBvaW50ZXIgKi8KKwl3aGlsZSAocHJpdi0+ZnJlZV9kYXRhX3R4ICE9CisJICAgICAgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPgorCQkJICAgZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX0RBVEFfTFFdKSkgeworCQkvKiByZWFkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZnJhZ21lbnQgdG8gYmUgZnJlZWQgKi8KKwkJaW5kZXggPSBwcml2LT5mcmVlX2RhdGFfdHggJSBJU0wzOFhYX0NCX1RYX1FTSVpFOworCisJCS8qIGNoZWNrIGZvciBob2xlcyBpbiB0aGUgYXJyYXlzIGNhdXNlZCBieSBtdWx0aSBmcmFnbWVudCBmcmFtZXMgCisJCSAqIHNlYXJjaGluZyBmb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSAqLworCQlpZiAocHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSAhPSAoZG1hX2FkZHJfdCkgTlVMTCkgeworCQkJLyogZW50cnkgaXMgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZQorCQkJICogZnJlZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgdW5tYXAgcGNpIG1lbW9yeSAqLworCQkJc2tiID0gcHJpdi0+ZGF0YV9sb3dfdHhbaW5kZXhdOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICJjbGVhbnVwIHNrYiAlcCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgdHJ1ZXNpemUgJXVcbiAiLAorCQkJICAgICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBwcml2LT5wY2lfbWFwX3R4X2FkZHJlc3NbaW5kZXhdLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwkJLyogaW5jcmVtZW50IHRoZSBmcmVlIGRhdGEgbG93IHF1ZXVlIHBvaW50ZXIgKi8KKwkJcHJpdi0+ZnJlZV9kYXRhX3R4Kys7CisJfQorfQorCitpbnQKK2lzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgaW5kZXg7CisJZG1hX2FkZHJfdCBwY2lfbWFwX2FkZHJlc3M7CisJaW50IGZyYW1lX3NpemU7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZ21lbnQ7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCWludCBuZXdza2Jfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB3ZHNfbWFjWzZdOworCXUzMiBjdXJyX2ZyYWc7CisJaW50IGVyciA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3RyYW5zbWl0IFxuIik7CisjZW5kaWYKKworCS8qIGxvY2sgdGhlIGRyaXZlciBjb2RlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBmcmFnbWVudHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBmcmFtZSAqLworCisJZnJhbWVfc2l6ZSA9IHNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCWlmIChpbml0X3dkcykKKwkJZnJhbWVfc2l6ZSArPSA2OworCisJLyogY2hlY2sgd2hldGhlciB0aGUgZGVzdGluYXRpb24gcXVldWUgaGFzIGVub3VnaCBmcmFnbWVudHMgZm9yIHRoZSBmcmFtZSAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfREFUQV9MUV0pOworCWlmICh1bmxpa2VseShjdXJyX2ZyYWcgLSBwcml2LT5mcmVlX2RhdGFfdHggPj0gSVNMMzhYWF9DQl9UWF9RU0laRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgZGV2aWNlIHF1ZXVlIGZ1bGwgd2hlbiBhd2FrZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCQlpc2wzOHh4X3czMl9mbHVzaChwcml2LT5kZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1VQREFURSwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBDaGVjayBhbGlnbm1lbnQgYW5kIFdEUyBmcmFtZSBmb3JtYXR0aW5nLiBUaGUgc3RhcnQgb2YgdGhlIHBhY2tldCBzaG91bGQKKwkgKiBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBJZiBXRFMgaXMgZW5hYmxlZCBhZGQgYW5vdGhlciA2IGJ5dGVzCisJICogYW5kIGFkZCBXRFMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworCWlmIChsaWtlbHkoKChsb25nKSBza2ItPmRhdGEgJiAweDAzKSB8IGluaXRfd2RzKSkgeworCQkvKiBnZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQgYW5kIHJlLWFsbGlnbiAqLworCQlvZmZzZXQgPSAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMzsKKwkJb2Zmc2V0ICs9IGluaXRfd2RzID8gNiA6IDA7CisKKwkJLyogY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBza2IgY2FuIGJlIHVzZWQgICovCisJCWlmICghc2tiX2Nsb25lZChza2IpICYmIChza2JfdGFpbHJvb20oc2tiKSA+PSBvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBjaGFyICpzcmMgPSBza2ItPmRhdGE7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAic2tiIG9mZnNldCAlaSB3ZHMgJWlcbiIsIG9mZnNldCwKKwkJCSAgICAgIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQkvKiBhbGlnbiB0aGUgYnVmZmVyIG9uIDQtYnl0ZSBib3VuZGFyeSAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCQlpZiAoaW5pdF93ZHMpIHsKKwkJCQkvKiB3ZHMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBhZGRyZXNzIGZpZWxkIG9mIDYgYnl0ZXMgKi8KKwkJCQlza2JfcHV0KHNrYiwgNik7CisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCQkJCXByaW50aygiaXNscGNpX2V0aF90cmFuc21pdDp3ZHNfbWFjXG4iKTsKKyNlbmRpZgorCQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgNiwgc3JjLCBza2ItPmxlbik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgd2RzX21hYywgNik7CisJCQl9IGVsc2UgeworCQkJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuKTsKKwkJCX0KKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJtZW1tb3ZlICVwICVwICVpIFxuIiwgc2tiLT5kYXRhLAorCQkJICAgICAgc3JjLCBza2ItPmxlbik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCW5ld3NrYiA9CisJCQkgICAgZGV2X2FsbG9jX3NrYihpbml0X3dkcyA/IHNrYi0+bGVuICsgNiA6IHNrYi0+bGVuKTsKKwkJCWlmICh1bmxpa2VseShuZXdza2IgPT0gTlVMTCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgc2tiXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZHJvcF9mcmVlOworCQkJfQorCQkJbmV3c2tiX29mZnNldCA9ICg0IC0gKGxvbmcpIG5ld3NrYi0+ZGF0YSkgJiAweDAzOworCisJCQkvKiBDaGVjayBpZiBuZXdza2ItPmRhdGEgaXMgYWxpZ25lZCAqLworCQkJaWYgKG5ld3NrYl9vZmZzZXQpCisJCQkJc2tiX3Jlc2VydmUobmV3c2tiLCBuZXdza2Jfb2Zmc2V0KTsKKworCQkJc2tiX3B1dChuZXdza2IsIGluaXRfd2RzID8gc2tiLT5sZW4gKyA2IDogc2tiLT5sZW4pOworCQkJaWYgKGluaXRfd2RzKSB7CisJCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIDYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHdkc19tYWMsIDYpOworI2lmZGVmIElTTFBDSV9FVEhfREVCVUcKKwkJCQlwcmludGsoImlzbHBjaV9ldGhfdHJhbnNtaXQ6d2RzX21hY1xuIik7CisjZW5kaWYKKwkJCX0gZWxzZQorCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIm1lbWNweSAlcCAlcCAlaSB3ZHMgJWlcbiIsCisJCQkgICAgICBuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQluZXdza2ItPmRldiA9IHNrYi0+ZGV2OworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gbmV3c2tiOworCQl9CisJfQorCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0JVRkZFUl9DT05URU5UUywgIlxudHggJXAgIiwgc2tiLT5kYXRhKTsKKwlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogbWFwIHRoZSBza2IgYnVmZmVyIHRvIHBjaSBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb24gKi8KKwlwY2lfbWFwX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgKHZvaWQgKikgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmICh1bmxpa2VseShwY2lfbWFwX2FkZHJlc3MgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgYnVmZmVyIHRvIFBDSVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCisJCWVyciA9IC1FSU87CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBQbGFjZSB0aGUgZnJhZ21lbnQgaW4gdGhlIGNvbnRyb2wgYmxvY2sgc3RydWN0dXJlLiAqLworCWluZGV4ID0gY3Vycl9mcmFnICUgSVNMMzhYWF9DQl9UWF9RU0laRTsKKwlmcmFnbWVudCA9ICZjYi0+dHhfZGF0YV9sb3dbaW5kZXhdOworCisJcHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSA9IHBjaV9tYXBfYWRkcmVzczsKKwkvKiBzdG9yZSB0aGUgc2tiIGFkZHJlc3MgZm9yIGZ1dHVyZSBmcmVlaW5nICAqLworCXByaXYtPmRhdGFfbG93X3R4W2luZGV4XSA9IHNrYjsKKwkvKiBzZXQgdGhlIHByb3BlciBmcmFnbWVudCBzdGFydCBhZGRyZXNzIGFuZCBzaXplIGluZm9ybWF0aW9uICovCisJZnJhZ21lbnQtPnNpemUgPSBjcHVfdG9fbGUxNihmcmFtZV9zaXplKTsKKwlmcmFnbWVudC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsJLyogc2V0IHRvIDEgaWYgbW9yZSBmcmFnbWVudHMgKi8KKwlmcmFnbWVudC0+YWRkcmVzcyA9IGNwdV90b19sZTMyKHBjaV9tYXBfYWRkcmVzcyk7CisJY3Vycl9mcmFnKys7CisKKwkvKiBUaGUgZnJhZ21lbnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUgYmVlbgorCSAqIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0byBkZXZpY2UuICovCisJd21iKCk7CisJY2ItPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9UWF9EQVRBX0xRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyk7CisKKwlpZiAoY3Vycl9mcmFnIC0gcHJpdi0+ZnJlZV9kYXRhX3R4ICsgSVNMMzhYWF9NSU5fUVRIUkVTSE9MRAorCSAgICA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpIHsKKwkJLyogc3RvcCBzZW5kcyBmcm9tIHVwcGVyIGxheWVycyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHNldCB0aGUgZnVsbCBmbGFnIGZvciB0aGUgdHJhbnNtaXNzaW9uIHF1ZXVlICovCisJCXByaXYtPmRhdGFfbG93X3R4X2Z1bGwgPSAxOworCX0KKworCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCWlzbHBjaV90cmlnZ2VyKHByaXYpOworCisJLyogdW5sb2NrIHRoZSBkcml2ZXIgY29kZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBzZXQgdGhlIHRyYW5zbWlzc2lvbiB0aW1lICovCisJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByaXYtPnN0YXRpc3RpY3MudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRpc3RpY3MudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlyZXR1cm4gMDsKKworICAgICAgZHJvcF9mcmVlOgorCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gTlVMTDsKKworCXByaXYtPnN0YXRpc3RpY3MudHhfZHJvcHBlZCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzbHBjaV9tb25pdG9yX3J4KGlzbHBjaV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYikKK3sKKwkvKiBUaGUgY2FyZCByZXBvcnRzIGZ1bGwgODAyLjExIHBhY2tldHMgYnV0IHdpdGggYSAyMCBieXRlcworCSAqIGhlYWRlciBhbmQgd2l0aG91dCB0aGUgRkNTLiBCdXQgdGhlcmUgYSBpcyBhIGJpdCB0aGF0CisJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVkIDotKSAqLworCXN0cnVjdCByZm1vbl9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgcmZtb25faGVhZGVyICopICgqc2tiKS0+ZGF0YTsKKwlpZiAoaGRyLT5mbGFncyAmIDB4MDEpCisJCS8qIFRoaXMgb25lIGlzIGJhZC4gRHJvcCBpdCAhICovCisJCXJldHVybiAtMTsKKwlpZiAocHJpdi0+bmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSB7CisJCXN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgKmF2czsKKwkJLyogZXh0cmFjdCB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBoZWFkZXIgKi8KKwkJdTMyIGNsb2NrID0gbGUzMl90b19jcHUoaGRyLT5jbG9jayk7CisJCXU4IHJhdGUgPSBoZHItPnJhdGU7CisJCXUxNiBmcmVxID0gbGUxNl90b19jcHUoaGRyLT5mcmVxKTsKKwkJdTggcnNzaSA9IGhkci0+cnNzaTsKKworCQlza2JfcHVsbCgqc2tiLCBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpKTsKKworCQlpZiAoc2tiX2hlYWRyb29tKCpza2IpIDwgc2l6ZW9mIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZCgqc2tiLAorCQkJCQkJCQkgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJCSBhdnNfODAyMTFfMV9oZWFkZXIpLAorCQkJCQkJCQkgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoKnNrYik7CisJCQkJKnNrYiA9IG5ld3NrYjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtMTsKKwkJCS8qIFRoaXMgYmVoYXZpb3IgaXMgbm90IHZlcnkgc3VidGlsZS4uLiAqLworCQl9CisKKwkJLyogbWFrZSByb29tIGZvciB0aGUgbmV3IGhlYWRlciBhbmQgZmlsbCBpdC4gKi8KKwkJYXZzID0KKwkJICAgIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyICopIHNrYl9wdXNoKCpza2IsCisJCQkJCQkJICAgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJICAgYXZzXzgwMjExXzFfaGVhZGVyKSk7CisJCQorCQlhdnMtPnZlcnNpb24gPSBjcHVfdG9fYmUzMihQODAyMTFDQVBUVVJFX1ZFUlNJT04pOworCQlhdnMtPmxlbmd0aCA9IGNwdV90b19iZTMyKHNpemVvZiAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlcikpOworCQlhdnMtPm1hY3RpbWUgPSBjcHVfdG9fYmU2NChsZTY0X3RvX2NwdShjbG9jaykpOworCQlhdnMtPmhvc3R0aW1lID0gY3B1X3RvX2JlNjQoamlmZmllcyk7CisJCWF2cy0+cGh5dHlwZSA9IGNwdV90b19iZTMyKDYpOwkvKk9GRE06IDYgZm9yIChnKSwgOCBmb3IgKGEpICovCisJCWF2cy0+Y2hhbm5lbCA9IGNwdV90b19iZTMyKGNoYW5uZWxfb2ZfZnJlcShmcmVxKSk7CisJCWF2cy0+ZGF0YXJhdGUgPSBjcHVfdG9fYmUzMihyYXRlICogNSk7CisJCWF2cy0+YW50ZW5uYSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5wcmlvcml0eSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5zc2lfdHlwZSA9IGNwdV90b19iZTMyKDMpOwkvKjI6IGRCbSwgMzogcmF3IFJTU0kgKi8KKwkJYXZzLT5zc2lfc2lnbmFsID0gY3B1X3RvX2JlMzIocnNzaSAmIDB4N2YpOworCQlhdnMtPnNzaV9ub2lzZSA9IGNwdV90b19iZTMyKHByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLm5vaXNlKTsJLypiZXR0ZXIgdGhhbiAndW5kZWZpbmVkJywgSSBhc3N1bWUgKi8KKwkJYXZzLT5wcmVhbWJsZSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5lbmNvZGluZyA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwl9IGVsc2UKKwkJc2tiX3B1bGwoKnNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CisKKwkoKnNrYiktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCSgqc2tiKS0+bWFjLnJhdyA9ICgqc2tiKS0+ZGF0YTsKKwkoKnNrYiktPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKworCXJldHVybiAwOworfQorCitpbnQKK2lzbHBjaV9ldGhfcmVjZWl2ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPm5kZXY7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBzaXplOworCXUzMiBpbmRleCwgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKnNyYzsKKwlpbnQgZGlzY2FyZCA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3JlY2VpdmUgXG4iKTsKKyNlbmRpZgorCisJLyogdGhlIGRldmljZSBoYXMgd3JpdHRlbiBhbiBFdGhlcm5ldCBmcmFtZSBpbiB0aGUgZGF0YSBhcmVhCisJICogb2YgdGhlIHNrX2J1ZmYgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RydWN0dXJlLCBkbyBpdCBub3cgKi8KKwlpbmRleCA9IHByaXYtPmZyZWVfZGF0YV9yeCAlIElTTDM4WFhfQ0JfUlhfUVNJWkU7CisJc2l6ZSA9IGxlMTZfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5zaXplKTsKKwlza2IgPSBwcml2LT5kYXRhX2xvd19yeFtpbmRleF07CisJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKQorCQkgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzKSAtCisJCSAgKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YSkgJiAzOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsCisJICAgICAgImZycS0+YWRkciAleCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgb2Zmc2V0ICV1IHRydWVzaXplICV1XG4gIiwKKwkgICAgICBjb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1twcml2LT5mcmVlX2RhdGFfcnhdLmFkZHJlc3MsIHNrYi0+ZGF0YSwKKwkgICAgICBza2ItPmxlbiwgb2Zmc2V0LCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJLyogZGVsZXRlIHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHNrYiAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKKwkJCSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdLAorCQkJIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIHVwZGF0ZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgYWxsaWduIHRoZSBidWZmZXIgKi8KKwlza2JfcHV0KHNrYiwgc2l6ZSk7CisJaWYgKG9mZnNldCkgeworCQkvKiBzaGlmdCB0aGUgYnVmZmVyIGFsbG9jYXRpb24gb2Zmc2V0IGJ5dGVzIHRvIGdldCB0aGUgcmlnaHQgZnJhbWUgKi8KKwkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJc2tiX3B1dChza2IsIDIpOworCX0KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGNoZWNrIHdoZXRoZXIgV0RTIGlzIGVuYWJsZWQgYW5kIHdoZXRoZXIgdGhlIGRhdGEgZnJhbWUgaXMgYSBXRFMgZnJhbWUgKi8KKworCWlmIChpbml0X3dkcykgeworCQkvKiBXRFMgZW5hYmxlZCwgY2hlY2sgZm9yIHRoZSB3ZHMgYWRkcmVzcyBvbiB0aGUgZmlyc3QgNiBieXRlcyBvZiB0aGUgYnVmZmVyICovCisJCXNyYyA9IHNrYi0+ZGF0YSArIDY7CisJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuIC0gNik7CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA2KTsKKwl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJGcmFnbWVudCBzaXplICVpIGluIHNrYiBhdCAlcFxuIiwgc2l6ZSwgc2tiKTsKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJTa2IgZGF0YSBhdCAlcCwgbGVuZ3RoICVpXG4iLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGRvIHNvbWUgYWRkaXRpb25hbCBza19idWZmIGFuZCBuZXR3b3JrIGxheWVyIHBhcmFtZXRlcnMgKi8KKwlza2ItPmRldiA9IG5kZXY7CisKKwkvKiB0YWtlIGNhcmUgb2YgbW9uaXRvciBtb2RlIGFuZCBzcHkgbW9uaXRvcmluZy4gKi8KKwlpZiAodW5saWtlbHkocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpKQorCQlkaXNjYXJkID0gaXNscGNpX21vbml0b3JfcngocHJpdiwgJnNrYik7CisJZWxzZSB7CisJCWlmICh1bmxpa2VseShza2ItPmRhdGFbMiAqIEVUSF9BTEVOXSA9PSAwKSkgeworCQkJLyogVGhlIHBhY2tldCBoYXMgYSByeF9hbm5leC4gUmVhZCBpdCBmb3Igc3B5IG1vbml0b3JpbmcsIFRoZW4KKwkJCSAqIHJlbW92ZSBpdCwgd2hpbGUga2VlcGluZyB0aGUgMiBsZWFkaW5nIE1BQyBhZGRyLgorCQkJICovCisJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQlzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyICphbm5leCA9CisJCQkgICAgKHN0cnVjdCByeF9hbm5leF9oZWFkZXIgKikgc2tiLT5kYXRhOworCQkJd3N0YXRzLmxldmVsID0gYW5uZXgtPnJmbW9uLnJzc2k7CisJCQkvKiBUaGUgbm9pc2UgdmFsdWUgY2FuIGJlIGEgYml0IG91dGRhdGVkIGlmIG5vYm9keSdzIAorCQkJICogcmVhZGluZyB3aXJlbGVzcyBzdGF0cy4uLiAqLworCQkJd3N0YXRzLm5vaXNlID0gcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CisJCQl3c3RhdHMucXVhbCA9IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZTsKKwkJCXdzdGF0cy51cGRhdGVkID0gMHgwNzsKKwkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShuZGV2LCBhbm5leC0+YWRkcjIsICZ3c3RhdHMpOworCisJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSwKKwkJCSAgICAgICBza2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJCQlza2JfcHVsbChza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOworCQl9CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCX0KKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9ieXRlcyArPSBzaXplOworCisJLyogZGVsaXZlciB0aGUgc2tiIHRvIHRoZSBuZXR3b3JrIGxheWVyICovCisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCXByaW50aworCSAgICAoImlzbHBjaV9ldGhfcmVjZWl2ZTpuZXRpZl9yeCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWFxuIiwKKwkgICAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwKKwkgICAgIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdKTsKKyNlbmRpZgorCWlmICh1bmxpa2VseShkaXNjYXJkKSkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlza2IgPSBOVUxMOworCX0gZWxzZQorCQluZXRpZl9yeChza2IpOworCisJLyogaW5jcmVtZW50IHRoZSByZWFkIGluZGV4IGZvciB0aGUgcnggZGF0YSBsb3cgcXVldWUgKi8KKwlwcml2LT5mcmVlX2RhdGFfcngrKzsKKworCS8qIGFkZCBvbmUgb3IgbW9yZSBza19idWZmIHN0cnVjdHVyZXMgKi8KKwl3aGlsZSAoaW5kZXggPQorCSAgICAgICBsZTMyX3RvX2NwdShjb250cm9sX2Jsb2NrLT4KKwkJCSAgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSksCisJICAgICAgIGluZGV4IC0gcHJpdi0+ZnJlZV9kYXRhX3J4IDwgSVNMMzhYWF9DQl9SWF9RU0laRSkgeworCQkvKiBhbGxvY2F0ZSBhbiBza19idWZmIGZvciByZWNlaXZlZCBkYXRhIGZyYW1lcyBzdG9yYWdlCisJCSAqIGluY2x1ZGUgYW55IHJlcXVpcmVkIGFsbGlnbm1lbnQgb3BlcmF0aW9ucyAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMik7CisJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJCS8qIGVycm9yIGFsbG9jYXRpbmcgYW4gc2tfYnVmZiBzdHJ1Y3R1cmUgZWxlbWVudHMgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsICJFcnJvciBhbGxvY2F0aW5nIHNrYiBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCS8qIHN0b3JlIHRoZSBuZXcgc2tiIHN0cnVjdHVyZSBwb2ludGVyICovCisJCWluZGV4ID0gaW5kZXggJSBJU0wzOFhYX0NCX1JYX1FTSVpFOworCQlwcml2LT5kYXRhX2xvd19yeFtpbmRleF0gPSBza2I7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCSAgICAgICJuZXcgYWxsb2Mgc2tiICVwIHNrYi0+ZGF0YSAlcCBza2ItPmxlbiAldSBpbmRleCAldSB0cnVlc2l6ZSAldVxuICIsCisJCSAgICAgIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgaW5kZXgsIHNrYi0+dHJ1ZXNpemUpOworI2VuZGlmCisKKwkJLyogc2V0IHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgZm9yIHByb3BlciBQQ0kgYnVzIG9wZXJhdGlvbiAqLworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsICh2b2lkICopIHNrYi0+ZGF0YSwKKwkJCQkgICBNQVhfRlJBR01FTlRfU0laRV9SWCArIDIsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tpbmRleF0gPT0gKGRtYV9hZGRyX3QpIE5VTEwpKSB7CisJCQkvKiBlcnJvciBtYXBwaW5nIHRoZSBidWZmZXIgdG8gZGV2aWNlIGFjY2Vzc2FibGUgbWVtb3J5IGFkZHJlc3MgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsCisJCQkgICAgICAiRXJyb3IgbWFwcGluZyBETUEgYWRkcmVzc1xuIik7CisKKwkJCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKChzdHJ1Y3Qgc2tfYnVmZiAqKSBza2IpOworCQkJc2tiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgZnJhZ21lbnQgYWRkcmVzcyAqLworCQljb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1tpbmRleF0uYWRkcmVzcyA9IGNwdV90b19sZTMyKCh1MzIpCisJCQkJCQkJCQlwcml2LT4KKwkJCQkJCQkJCXBjaV9tYXBfcnhfYWRkcmVzcworCQkJCQkJCQkJW2luZGV4XSk7CisJCXdtYigpOworCisJCS8qIGluY3JlbWVudCB0aGUgZHJpdmVyIHJlYWQgcG9pbnRlciAqLworCQlhZGRfbGUzMnAoKHUzMiAqKSAmY29udHJvbF9ibG9jay0+CisJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSwgMSk7CisJfQorCisJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCisJaXNscGNpX3RyaWdnZXIocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSAoaXNscGNpX3ByaXZhdGUgKikgZGF0YTsKKwlpc2xwY2lfcmVzZXQocHJpdiwgMSk7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKKwlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworfQorCit2b2lkCitpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdGlzdGljcyA9ICZwcml2LT5zdGF0aXN0aWNzOworCisJLyogaW5jcmVtZW50IHRoZSB0cmFuc21pdCBlcnJvciBjb3VudGVyICovCisJc3RhdGlzdGljcy0+dHhfZXJyb3JzKys7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHhfdGltZW91dCIsIG5kZXYtPm5hbWUpOworCWlmICghcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nKSB7CisJCXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJCXByaW50aygiLCBzY2hlZHVsaW5nIGEgcmVzZXQiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfdGFzayk7CisJfQorCXByaW50aygiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5ZDdhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfSVNMUENJX0VUSF9ICisjZGVmaW5lIF9JU0xQQ0lfRVRIX0gKKworI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorCitzdHJ1Y3QgcmZtb25faGVhZGVyIHsKKwl1MTYgdW5rMDsJCS8qID0gMHgwMDAwICovCisJdTE2IGxlbmd0aDsJCS8qID0gMHgxNDAwICovCisJdTMyIGNsb2NrOwkJLyogMU1IeiBjbG9jayAqLworCXU4IGZsYWdzOworCXU4IHVuazE7CisJdTggcmF0ZTsKKwl1OCB1bmsyOworCXUxNiBmcmVxOworCXUxNiB1bmszOworCXU4IHJzc2k7CisJdTggcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyIHsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXN0cnVjdCByZm1vbl9oZWFkZXIgcmZtb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogd2xhbi1uZyAoYW5kIGhvcGVmdWxseSBvdGhlcnMpIEFWUyBoZWFkZXIsIHZlcnNpb24gb25lLiAgRmllbGRzIGluCisgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIFA4MDIxMUNBUFRVUkVfVkVSU0lPTiAweDgwMjExMDAxCisKK3N0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgeworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ2NF90IG1hY3RpbWU7CisJdWludDY0X3QgaG9zdHRpbWU7CisJdWludDMyX3QgcGh5dHlwZTsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGRhdGFyYXRlOworCXVpbnQzMl90IGFudGVubmE7CisJdWludDMyX3QgcHJpb3JpdHk7CisJdWludDMyX3Qgc3NpX3R5cGU7CisJaW50MzJfdCBzc2lfc2lnbmFsOworCWludDMyX3Qgc3NpX25vaXNlOworCXVpbnQzMl90IHByZWFtYmxlOworCXVpbnQzMl90IGVuY29kaW5nOworfTsKKwordm9pZCBpc2xwY2lfZXRoX2NsZWFudXBfdHJhbnNtaXQoaXNscGNpX3ByaXZhdGUgKiwgaXNsMzh4eF9jb250cm9sX2Jsb2NrICopOworaW50IGlzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgaXNscGNpX2V0aF9yZWNlaXZlKGlzbHBjaV9wcml2YXRlICopOwordm9pZCBpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSh2b2lkICpkYXRhKTsKKworI2VuZGlmCQkJCS8qIF9JU0xfR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAvKiBGb3IgX19pbml0LCBfX2V4aXQgKi8KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIJCS8qIGZvciBwY19kZWJ1ZyAqLworI2luY2x1ZGUgImlzbF9vaWQuaCIKKworI2RlZmluZSBEUlZfTkFNRQkicHJpc201NCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMiIKKworTU9EVUxFX0FVVEhPUigiW0ludGVyc2lsXSBSLkJhc3RpbmdzIGFuZCBXLlRlcm1vcnNodWl6ZW4sIFRoZSBwcmlzbTU0Lm9yZyBEZXZlbG9wbWVudCBUZWFtIDxwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgUHJpc201NCA4MDIuMTEgV2lyZWxlc3MgTEFOIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludAlpbml0X3BjaXRtID0gMDsKK21vZHVsZV9wYXJhbShpbml0X3BjaXRtLCBpbnQsIDApOworCisvKiBJbiB0aGlzIG9yZGVyOiB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBzdWJkZXZpY2UsIGNsYXNzLCBjbGFzc19tYXNrLAorICogZHJpdmVyX2RhdGEgCisgKiBJZiB5b3UgaGF2ZSBhbiB1cGRhdGUgZm9yIHRoaXMgcGxlYXNlIGNvbnRhY3QgcHJpc201NC1kZXZlbEBwcmlzbTU0Lm9yZyAKKyAqIFRoZSBsYXRlc3QgbGlzdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3ByaXNtNTQub3JnL3N1cHBvcnRlZF9jYXJkcy5waHAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTU0X2lkX3RibFtdID0geworCS8qIEludGVyc2lsIFBSSVNNIER1ZXR0ZS9QcmlzbSBHVCBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMjYwLCAweDM4OTAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogM0NPTSAzQ1JXRTE1NEc3MiBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMGI3LCAweDYwMDEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogSW50ZXJzaWwgUFJJU00gSW5kaWdvIFdpcmVsZXNzIExBTiBhZGFwdGVyICovCisJeworCSAweDEyNjAsIDB4Mzg3NywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgMCwgMCwgMAorCX0sCisKKwkvKiBJbnRlcnNpbCBQUklTTSBKYXZlbGluL1hib3cgV2lyZWxlc3MgTEFOIGFkYXB0ZXIgKi8KKwl7CisJIDB4MTI2MCwgMHgzODg2LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAwLCAwLCAwCisJfSwKKworCS8qIEVuZCBvZiBsaXN0ICovCisJezAsMCwwLDAsMCwwLDB9Cit9OworCisvKiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIEhvdHBsdWcgZmFjaWxpdGllcyBvZiB0aGUga2VybmVsICovCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcHJpc201NF9pZF90YmwpOworCitzdGF0aWMgaW50IHByaXNtNTRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBwcmlzbTU0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgcHJpc201NF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICosIHUzMiBzdGF0ZSk7CitzdGF0aWMgaW50IHByaXNtNTRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJpc201NF9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBwcmlzbTU0X2lkX3RibCwKKwkucHJvYmUgPSBwcmlzbTU0X3Byb2JlLAorCS5yZW1vdmUgPSBwcmlzbTU0X3JlbW92ZSwKKwkuc3VzcGVuZCA9IHByaXNtNTRfc3VzcGVuZCwKKwkucmVzdW1lID0gcHJpc201NF9yZXN1bWUsCisJLyogLmVuYWJsZV93YWtlIDsgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHlldCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitwcmlzbTU0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJdTggbGF0ZW5jeV90bXI7CisJdTMyIG1lbV9hZGRyOworCWlzbHBjaV9wcml2YXRlICpwcml2OworCWludCBydmFsdWU7CisKKwkvKiBFbmFibGUgdGhlIHBjaSBkZXZpY2UgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iLCBEUlZfTkFNRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGxhdGVuY3kgdGltZXIgaXMgc2V0IGNvcnJlY3RseSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0ZW5jeV90bXIpOworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAibGF0ZW5jeSB0aW1lcjogJXhcbiIsIGxhdGVuY3lfdG1yKTsKKyNlbmRpZgorCWlmIChsYXRlbmN5X3RtciA8IFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX01JTikgeworCQkvKiBzZXQgdGhlIGxhdGVuY3kgdGltZXIgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJCSAgICAgIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCk7CisJfQorCisJLyogZW5hYmxlIFBDSSBETUEgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzMi1iaXQgUENJIERNQSBub3Qgc3VwcG9ydGVkIiwgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9kaXNhYmxlX2RldmljZTsKKyAgICAgICAgfQorCisJLyogMHg0MCBpcyB0aGUgcHJvZ3JhbW1hYmxlIHRpbWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzcG9uc2UgdGltZW91dCAoVFJEWV9USU1FT1VUKQorCSAqIDB4NDEgaXMgdGhlIHByb2dyYW1tYWJsZSB0aW1lciB0byBjb25maWd1cmUgdGhlIHJldHJ5IHRpbWVvdXQgKFJFVFJZX1RJTUVPVVQpCisJICogCVRoZSBSRVRSWV9USU1FT1VUIGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgcmV0cmllcyB0aGF0IHRoZSBjb3JlLCBhcyBhCisJICogCU1hc3Rlciwgd2lsbCBwZXJmb3JtIGJlZm9yZSBhYmFuZG9uaW5nIGEgY3ljbGUuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorCSAqIAlSRVRSWV9USU1FT1VUIGlzIDB4ODAsIHdoaWNoIGZhciBleGNlZWRzIHRoZSBQQ0kgMi4xIHJlcXVpcmVtZW50IGZvciBuZXcKKwkgKiAJZGV2aWNlcy4gQSB3cml0ZSBvZiB6ZXJvIHRvIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyIGRpc2FibGVzIHRoaXMKKwkgKiAJZnVuY3Rpb24gdG8gYWxsb3cgdXNlIHdpdGggYW55IG5vbi1jb21wbGlhbnQgbGVnYWN5IGRldmljZXMgdGhhdCBtYXkKKwkgKiAJZXhlY3V0ZSBtb3JlIHJldHJpZXMuCisJICoKKwkgKiAJV3JpdGluZyB6ZXJvIHRvIGJvdGggdGhlc2UgdHdvIHJlZ2lzdGVycyB3aWxsIGRpc2FibGUgYm90aCB0aW1lb3V0cyBhbmQKKwkgKiAJKmNhbiogc29sdmUgcHJvYmxlbXMgY2F1c2VkIGJ5IGRldmljZXMgdGhhdCBhcmUgc2xvdyB0byByZXNwb25kLgorCSAqCU1ha2UgdGhpcyBjb25maWd1cmFibGUgLSBNU1cKKwkgKi8KKwlpZiAoIGluaXRfcGNpdG0gPj0gMCApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsICh1OClpbml0X3BjaXRtKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsICh1OClpbml0X3BjaXRtKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgVFJEWS9SRVRSWSB1bmNoYW5nZWRcbiIpOworCX0KKworCS8qIHJlcXVlc3QgdGhlIHBjaSBkZXZpY2UgSS9PIHJlZ2lvbnMgKi8KKwlydmFsdWUgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocnZhbHVlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbHVyZSAocmM9JWQpXG4iLAorCQkgICAgICAgRFJWX05BTUUsIHJ2YWx1ZSk7CisJCWdvdG8gZG9fcGNpX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBtZW1vcnkgd2luZG93IGlzIGluZGVlZCBzZXQgKi8KKwlydmFsdWUgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmbWVtX2FkZHIpOworCWlmIChydmFsdWUgfHwgIW1lbV9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBkZXZpY2UgbWVtb3J5IHJlZ2lvbiBub3QgY29uZmlndXJlZDsgZml4IHlvdXIgQklPUyBvciBDYXJkQnVzIGJyaWRnZS9kcml2ZXJzXG4iLAorCQkgICAgICAgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJLyogZW5hYmxlIFBDSSBidXMtbWFzdGVyaW5nICovCisJREVCVUcoU0hPV19UUkFDSU5HLCAiJXM6IHBjaV9zZXRfbWFzdGVyKHBkZXYpXG4iLCBEUlZfTkFNRSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBlbmFibGUgTVdJICovCisJcGNpX3NldF9td2kocGRldik7CisKKwkvKiBzZXR1cCB0aGUgbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIGFuZCBpdHMgc3RydWN0dXJlICovCisJaWYgKCEobmRldiA9IGlzbHBjaV9zZXR1cChwZGV2KSkpIHsKKwkJLyogZXJyb3IgY29uZmlndXJpbmcgdGhlIGRyaXZlciBhcyBhIG5ldHdvcmsgZGV2aWNlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgbmV0d29yayBkZXZpY2VcbiIsCisJCSAgICAgICBEUlZfTkFNRSk7CisJCWdvdG8gZG9fcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7IC8qIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGJvb3QgKi8KKworCS8qIGNhcmQgaXMgaW4gdW5rbm93biBzdGF0ZSB5ZXQsIG1pZ2h0IGhhdmUgc29tZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KKwlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CisKKwkvKiByZXF1ZXN0IGZvciB0aGUgaW50ZXJydXB0IGJlZm9yZSB1cGxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJcnZhbHVlID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmaXNscGNpX2ludGVycnVwdCwKKwkJCSAgICAgU0FfU0hJUlEsIG5kZXYtPm5hbWUsIHByaXYpOworCisJaWYgKHJ2YWx1ZSkgeworCQkvKiBlcnJvciwgY291bGQgbm90IGhvb2sgdGhlIGhhbmRsZXIgdG8gdGhlIGlycSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgaW5zdGFsbCBJUlEgaGFuZGxlclxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGRvX3VucmVnaXN0ZXJfbmV0ZGV2OworCX0KKworCS8qIGZpcm13YXJlIHVwbG9hZCBpcyB0cmlnZ2VyZWQgaW4gaXNscGNpX29wZW4gKi8KKworCXJldHVybiAwOworCisgICAgICBkb191bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworICAgICAgZG9fcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworICAgICAgZG9fcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc2V0IGJ5IGNsZWFudXBfbW9kdWxlICovCitzdGF0aWMgdm9sYXRpbGUgaW50IF9faW5fY2xlYW51cF9tb2R1bGUgPSAwOworCisvKiB0aGlzIG9uZSByZW1vdmVzIG9uZSghISkgaW5zdGFuY2Ugb25seSAqLwordm9pZAorcHJpc201NF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZGV2ID8gbmV0ZGV2X3ByaXYobmRldikgOiBOVUxMOworCUJVR19PTighcHJpdik7CisKKwlpZiAoIV9faW5fY2xlYW51cF9tb2R1bGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3QgdW5wbHVnIGRldGVjdGVkXG4iLCBuZGV2LT5uYW1lKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlbW92aW5nIGRldmljZVxuIiwgbmRldi0+bmFtZSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKworCS8qIGZyZWUgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfT0ZGKSB7CisJCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwkJLyogVGhpcyBiZWxsb3cgY2F1c2VzIGEgbG9ja3VwIGF0IHJtbW9kIHRpbWUuIEl0IG1pZ2h0IGJlCisJCSAqIGJlY2F1c2Ugc29tZSBpbnRlcnJ1cHRzIHN0aWxsIGxpbmdlciBhZnRlciBybW1vZCB0aW1lLCAKKwkJICogc2VlIGJ1ZyAjMTcgKi8KKwkJLyogcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAzKTsqLwkvKiB0cnkgdG8gcG93ZXItb2ZmICovCisJfQorCisJZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKKworCS8qIGZyZWUgdGhlIFBDSSBtZW1vcnkgYW5kIHVubWFwIHRoZSByZW1hcHBlZCBwYWdlICovCisJaXNscGNpX2ZyZWVfbWVtb3J5KHByaXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworaW50CitwcmlzbTU0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGdvdCBzdXNwZW5kIHJlcXVlc3QgKHN0YXRlICVkKVxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwgc3RhdGUpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwkvKiB0ZWxsIHRoZSBkZXZpY2Ugbm90IHRvIHRyaWdnZXIgaW50ZXJydXB0cyBmb3Igbm93Li4uICovCisJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCisJLyogZnJvbSBub3cgb24gYXNzdW1lIHRoZSBoYXJkd2FyZSB3YXMgYWxyZWFkeSBwb3dlcmVkIGRvd24KKwkgICBhbmQgZG9uJ3QgdG91Y2ggaXQgYW55bW9yZSAqLworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX09GRik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitwcmlzbTU0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ290IHJlc3VtZSByZXF1ZXN0XG4iLCBuZGV2LT5uYW1lKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogYWxyaWdodCBsZXQncyBnbyBpbnRvIHRoZSBQUkVCT09UIHN0YXRlICovCisJaXNscGNpX3Jlc2V0KHByaXYsIDEpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorcHJpc201NF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkxvYWRlZCAlcyBkcml2ZXIsIHZlcnNpb24gJXNcbiIsCisJICAgICAgIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CisKKwlfX2J1Z19vbl93cm9uZ19zdHJ1Y3Rfc2l6ZXMgKCk7CisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTU0X2RyaXZlcik7Cit9CisKKy8qIGJ5IHRoZSB0aW1lIHByaXNtNTRfbW9kdWxlX2V4aXQoKSB0ZXJtaW5hdGVzLCBhcyBhIHBvc3Rjb25kaXRpb24KKyAqIGFsbCBpbnN0YW5jZXMgd2lsbCBoYXZlIGJlZW4gZGVzdHJveWVkIGJ5IGNhbGxzIHRvCisgKiBwcmlzbTU0X3JlbW92ZSgpICovCitzdGF0aWMgdm9pZCBfX2V4aXQKK3ByaXNtNTRfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc201NF9kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkZWQgJXMgZHJpdmVyXG4iLCBEUlZfTkFNRSk7CisKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMDsKK30KKworLyogcmVnaXN0ZXIgZW50cnkgcG9pbnRzICovCittb2R1bGVfaW5pdChwcmlzbTU0X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHByaXNtNTRfbW9kdWxlX2V4aXQpOworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAyMDA0IEplbnMgTWF1cmVyIDxKZW5zLk1hdXJlckBnbXgubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIJCS8qIGFkZGl0aW9uYWwgdHlwZXMgYW5kIGRlZnMgZm9yIGlzbDM4eHggZncgKi8KKyNpbmNsdWRlICJpc2xfaW9jdGwuaCIKKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb24gc2VjdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBjX2RlYnVnID0gVkVSQk9TRTsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERyaXZlciBnZW5lcmFsIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCit2b2lkCitkaXNwbGF5X2J1ZmZlcihjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJaWYgKChwY19kZWJ1ZyAmIFNIT1dfQlVGRkVSX0NPTlRFTlRTKSA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlwcmludGsoIlslMDJ4XSIsICpidWZmZXIgJiAyNTUpOworCQlsZW5ndGgtLTsKKwkJYnVmZmVyKys7CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFF1ZXVlIGhhbmRsaW5nIGZvciBtYW5hZ2VtZW50IGZyYW1lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFBJTUZPUiBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK3BpbWZvcl9lbmNvZGVfaGVhZGVyKGludCBvcGVyYXRpb24sIHUzMiBvaWQsIHUzMiBsZW5ndGgsIHBpbWZvcl9oZWFkZXJfdCAqaCkKK3sKKwloLT52ZXJzaW9uID0gUElNRk9SX1ZFUlNJT047CisJaC0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCWgtPmRldmljZV9pZCA9IFBJTUZPUl9ERVZfSURfTUhMSV9NSUI7CisJaC0+ZmxhZ3MgPSAwOworCWgtPm9pZCA9IGNwdV90b19iZTMyKG9pZCk7CisJaC0+bGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBhbmFseXplIGEgUElNRk9SIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyLgorICovCitzdGF0aWMgcGltZm9yX2hlYWRlcl90ICoKK3BpbWZvcl9kZWNvZGVfaGVhZGVyKHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcGltZm9yX2hlYWRlcl90ICpoID0gZGF0YTsKKworCXdoaWxlICgodm9pZCAqKSBoIDwgZGF0YSArIGxlbikgeworCQlpZiAoaC0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19MSVRUTEVfRU5ESUFOKSB7CisJCQlsZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQlsZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQliZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQliZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0KKwkJaWYgKGgtPm9pZCAhPSBPSURfSU5MX1RVTk5FTCkKKwkJCXJldHVybiBoOworCQloKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRmlsbCB0aGUgcmVjZWl2ZSBxdWV1ZSBmb3IgbWFuYWdlbWVudCBmcmFtZXMgd2l0aCBmcmVzaCBidWZmZXJzLgorICovCitpbnQKK2lzbHBjaV9tZ210X3J4X2ZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnIgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSk7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWdtdF9yeF9maWxsIFxuIik7CisjZW5kaWYKKworCXdoaWxlIChjdXJyIC0gcHJpdi0+aW5kZXhfbWdtdF9yeCA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRSkgeworCQl1MzIgaW5kZXggPSBjdXJyICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnID0gJmNiLT5yeF9kYXRhX21nbXRbaW5kZXhdOworCisJCWlmIChidWYtPm1lbSA9PSBOVUxMKSB7CisJCQlidWYtPm1lbSA9IGttYWxsb2MoTUdNVF9GUkFNRV9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghYnVmLT5tZW0pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1hbmFnZW1lbnQgZnJhbWUuXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJ1Zi0+c2l6ZSA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCQlpZiAoYnVmLT5wY2lfYWRkciA9PSAwKSB7CisJCQlidWYtPnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLT5tZW0sCisJCQkJCQkgICAgICAgTUdNVF9GUkFNRV9TSVpFLAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlpZiAoIWJ1Zi0+cGNpX2FkZHIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJGYWlsZWQgdG8gbWFrZSBtZW1vcnkgRE1BJ2FibGVcbi4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCisJCS8qIGJlIHNhZmU6IGFsd2F5cyByZXNldCBjb250cm9sIGJsb2NrIGluZm9ybWF0aW9uICovCisJCWZyYWctPnNpemUgPSBjcHVfdG9fbGUxNihNR01UX0ZSQU1FX1NJWkUpOworCQlmcmFnLT5mbGFncyA9IDA7CisJCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYtPnBjaV9hZGRyKTsKKwkJY3VycisrOworCisJCS8qIFRoZSBmcmFnbWVudCBhZGRyZXNzIGluIHRoZSBjb250cm9sIGJsb2NrIG11c3QgaGF2ZQorCQkgKiBiZWVuIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0bworCQkgKiBkZXZpY2UgKi8KKwkJd21iKCk7CisJCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0gY3B1X3RvX2xlMzIoY3Vycik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuZCB0cmFuc21pdCBhIG1hbmFnZW1lbnQgZnJhbWUgdXNpbmcgIm9wZXJhdGlvbiIgYW5kICJvaWQiLAorICogd2l0aCBhcmd1bWVudHMgZGF0YS9sZW5ndGguCisgKiBXZSBlaXRoZXIgcmV0dXJuIGFuIGVycm9yIGFuZCBmcmVlIHRoZSBmcmFtZSwgb3Igd2UgcmV0dXJuIDAgYW5kCisgKiBpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoKSBmcmVlcyB0aGUgZnJhbWUgaW4gdGhlIHR4LWRvbmUKKyAqIGludGVycnVwdC4KKyAqLworc3RhdGljIGludAoraXNscGNpX21ndF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG9wZXJhdGlvbiwgdW5zaWduZWQgbG9uZyBvaWQsCisJCSAgICB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl2b2lkICpwOworCWludCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZzsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBidWY7CisJdTMyIGN1cnJfZnJhZzsKKwlpbnQgaW5kZXg7CisJaW50IGZyYWdfbGVuID0gbGVuZ3RoICsgUElNRk9SX0hFQURFUl9TSVpFOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1nbXQgZnJhbWUgdG9vIGxhcmdlICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgZnJhZ19sZW4pOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IC1FTk9NRU07CisJcCA9IGJ1Zi5tZW0gPSBrbWFsbG9jKGZyYWdfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWdtdCBmcmFtZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yOworCX0KKwlidWYuc2l6ZSA9IGZyYWdfbGVuOworCisJLyogY3JlYXRlIHRoZSBoZWFkZXIgZGlyZWN0bHkgaW4gdGhlIGZyYWdtZW50IGRhdGEgYXJlYSAqLworCXBpbWZvcl9lbmNvZGVfaGVhZGVyKG9wZXJhdGlvbiwgb2lkLCBsZW5ndGgsIChwaW1mb3JfaGVhZGVyX3QgKikgcCk7CisJcCArPSBQSU1GT1JfSEVBREVSX1NJWkU7CisKKwlpZiAoZGF0YSkKKwkJbWVtY3B5KHAsIGRhdGEsIGxlbmd0aCk7CisJZWxzZQorCQltZW1zZXQocCwgMCwgbGVuZ3RoKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJeworCQlwaW1mb3JfaGVhZGVyX3QgKmggPSBidWYubWVtOworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJQSU1GT1I6IG9wICVpLCBvaWQgMHglMDhseCwgZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAweCV4IFxuIiwKKwkJICAgICAgaC0+b3BlcmF0aW9uLCBvaWQsIGgtPmRldmljZV9pZCwgaC0+ZmxhZ3MsIGxlbmd0aCk7CisKKwkJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKwkJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgaCwgc2l6ZW9mIChwaW1mb3JfaGVhZGVyX3QpKTsKKwkJZGlzcGxheV9idWZmZXIocCwgbGVuZ3RoKTsKKwl9CisjZW5kaWYKKworCWVyciA9IC1FTk9NRU07CisJYnVmLnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLm1lbSwgZnJhZ19sZW4sCisJCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKCFidWYucGNpX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgUENJIG1lbW9yeSBmb3IgbWdtdFxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJLyogUHJvdGVjdCB0aGUgY29udHJvbCBibG9jayBtb2RpZmljYXRpb25zIGFnYWluc3QgaW50ZXJydXB0cy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJaWYgKGN1cnJfZnJhZyAtIHByaXYtPmluZGV4X21nbXRfdHggPj0gSVNMMzhYWF9DQl9NR01UX1FTSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZ210IHR4IHF1ZXVlIGlzIHN0aWxsIGZ1bGxcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJLyogY29tbWl0IHRoZSBmcmFtZSB0byB0aGUgdHggZGV2aWNlIHF1ZXVlICovCisJaW5kZXggPSBjdXJyX2ZyYWcgJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJcHJpdi0+bWdtdF90eFtpbmRleF0gPSBidWY7CisJZnJhZyA9ICZjYi0+dHhfZGF0YV9tZ210W2luZGV4XTsKKwlmcmFnLT5zaXplID0gY3B1X3RvX2xlMTYoZnJhZ19sZW4pOworCWZyYWctPmZsYWdzID0gMDsJLyogZm9yIGFueSBvdGhlciB0aGFuIHRoZSBsYXN0IGZyYWdtZW50LCBzZXQgdG8gMSAqLworCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYucGNpX2FkZHIpOworCisJLyogVGhlIGZyYWdtZW50IGFkZHJlc3MgaW4gdGhlIGNvbnRyb2wgYmxvY2sgbXVzdCBoYXZlCisJICogYmVlbiB3cml0dGVuIGJlZm9yZSBhbm5vdW5jaW5nIHRoZSBmcmFtZSBidWZmZXIgdG8KKwkgKiBkZXZpY2UgKi8KKwl3bWIoKTsKKwljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgKi8KKwlpc2xwY2lfdHJpZ2dlcihwcml2KTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyb3JfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisgICAgICBlcnJvcl9mcmVlOgorCWtmcmVlKGJ1Zi5tZW0pOworICAgICAgZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlY2VpdmUgYSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gdGhlIGRldmljZS4KKyAqIFRoaXMgY2FuIGJlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdHJhcHMsIGFuZCBhdCBtb3N0IG9uZSByZXNwb25zZQorICogZnJhbWUgZm9yIGEgcHJldmlvdXMgcmVxdWVzdCBzZW50IHZpYSBpc2xwY2lfbWd0X3RyYW5zbWl0KCkuCisgKi8KK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgY3Vycl9mcmFnOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF9yZWNlaXZlIFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgaW50ZXJydXB0LCBkZXRlcm1pbmUgZnJhZ21lbnQgcmFuZ2UgdG8KKwkgKiBwcm9jZXNzLiAgVGhpcyBhdm9pZHMgYW4gZW5kbGVzcyBsb29wIChpLmUuIGxvY2t1cCkgaWYKKwkgKiBmcmFtZXMgY29tZSBpbiBmYXN0ZXIgdGhhbiB3ZSBjYW4gcHJvY2VzcyB0aGVtLiAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdKTsKKwliYXJyaWVyKCk7CisKKwlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF9yeCA8IGN1cnJfZnJhZzsgcHJpdi0+aW5kZXhfbWdtdF9yeCsrKSB7CisJCXBpbWZvcl9oZWFkZXJfdCAqaGVhZGVyOworCQl1MzIgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3J4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQl1MTYgZnJhZ19sZW47CisJCWludCBzaXplOworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJLyogSSBoYXZlIG5vIGlkZWEgKGFuZCBubyBkb2N1bWVudGF0aW9uKSBpZiBmbGFncyAhPSAwCisJCSAqIGlzIHBvc3NpYmxlLiAgRHJvcCB0aGUgZnJhbWUsIHJldXNlIHRoZSBidWZmZXIuICovCisJCWlmIChsZTE2X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210W2luZGV4XS5mbGFncykgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gZmxhZ3MgMHglMDR4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsCisJCQkgICAgICAgbGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0uZmxhZ3MpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBvbmx5IHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcihzKSBoZXJlLiAqLworCQlmcmFnX2xlbiA9IGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhdLnNpemUpOworCisJCS8qCisJCSAqIFdlIGFwcGVhciB0byBoYXZlIG5vIHdheSB0byB0ZWxsIHRoZSBkZXZpY2UgdGhlCisJCSAqIHNpemUgb2YgYSByZWNlaXZlIGJ1ZmZlci4gIFRodXMsIGlmIHRoaXMgY2hlY2sKKwkJICogdHJpZ2dlcnMsIHdlIGxpa2VseSBoYXZlIGtlcm5lbCBoZWFwIGNvcnJ1cHRpb24uICovCisJCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCW5kZXYtPm5hbWUsIGZyYWdfbGVuLCBmcmFnX2xlbik7CisJCQlmcmFnX2xlbiA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCisJCS8qIEVuc3VyZSB0aGUgcmVzdWx0cyBvZiBkZXZpY2UgRE1BIGFyZSB2aXNpYmxlIHRvIHRoZSBDUFUuICovCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wZGV2LCBidWYtPnBjaV9hZGRyLAorCQkJCQkgICAgYnVmLT5zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIFBlcmZvcm0gZW5kaWFuZXNzIGNvbnZlcnNpb24gZm9yIFBJTUZPUiBoZWFkZXIgaW4tcGxhY2UuICovCisJCWhlYWRlciA9IHBpbWZvcl9kZWNvZGVfaGVhZGVyKGJ1Zi0+bWVtLCBmcmFnX2xlbik7CisJCWlmICghaGVhZGVyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gUElNRk9SIGhlYWRlciBmb3VuZFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBJRCBmcm9tIHRoZSBQSU1GT1IgcGFja2V0IHJlY2VpdmVkIGZyb20KKwkJICogdGhlIE1WQyBpcyBhbHdheXMgMC4gIFdlIGZvcndhcmQgYSBzZW5zaWJsZSBkZXZpY2VfaWQuCisJCSAqIE5vdCB0aGF0IGFueW9uZSB1cHN0cmVhbSB3b3VsZCBjYXJlLi4uICovCisJCWhlYWRlci0+ZGV2aWNlX2lkID0gcHJpdi0+bmRldi0+aWZpbmRleDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfUElNRk9SX0ZSQU1FUywKKwkJICAgICAgIlBJTUZPUjogb3AgJWksIG9pZCAweCUwOHgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggMHgleCBcbiIsCisJCSAgICAgIGhlYWRlci0+b3BlcmF0aW9uLCBoZWFkZXItPm9pZCwgaGVhZGVyLT5kZXZpY2VfaWQsCisJCSAgICAgIGhlYWRlci0+ZmxhZ3MsIGhlYWRlci0+bGVuZ3RoKTsKKworCQkvKiBkaXNwbGF5IHRoZSBidWZmZXIgY29udGVudHMgZm9yIGRlYnVnZ2luZyAqLworCQlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBoZWFkZXIsIFBJTUZPUl9IRUFERVJfU0laRSk7CisJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRlciArIFBJTUZPUl9IRUFERVJfU0laRSwKKwkJCSAgICAgICBoZWFkZXItPmxlbmd0aCk7CisjZW5kaWYKKworCQkvKiBub2JvZHkgc2VuZHMgdGhlc2UgKi8KKwkJaWYgKGhlYWRlci0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19BUFBMSUNfT1JJR0lOKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogZXJyYW50IFBJTUZPUiBhcHBsaWNhdGlvbiBmcmFtZVxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGV0ZXJtaW5lIGZyYW1lIHNpemUsIHNraXBwaW5nIE9JRF9JTkxfVFVOTkVMIGhlYWRlcnMuICovCisJCXNpemUgPSBQSU1GT1JfSEVBREVSX1NJWkUgKyBoZWFkZXItPmxlbmd0aDsKKwkJZnJhbWUgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUpICsgc2l6ZSwKKwkJCQlHRlBfQVRPTUlDKTsKKwkJaWYgKCFmcmFtZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogT3V0IG9mIG1lbW9yeSwgY2Fubm90IGhhbmRsZSBvaWQgMHglMDh4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsIGhlYWRlci0+b2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyYW1lLT5uZGV2ID0gbmRldjsKKwkJbWVtY3B5KCZmcmFtZS0+YnVmLCBoZWFkZXIsIHNpemUpOworCQlmcmFtZS0+aGVhZGVyID0gKHBpbWZvcl9oZWFkZXJfdCAqKSBmcmFtZS0+YnVmOworCQlmcmFtZS0+ZGF0YSA9IGZyYW1lLT5idWYgKyBQSU1GT1JfSEVBREVSX1NJWkU7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJmcmFtZTogaGVhZGVyOiAlcCwgZGF0YTogJXAsIHNpemU6ICVkXG4iLAorCQkgICAgICBmcmFtZS0+aGVhZGVyLCBmcmFtZS0+ZGF0YSwgc2l6ZSk7CisjZW5kaWYKKworCQlpZiAoaGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX1RSQVApIHsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiVFJBUDogb2lkIDB4JXgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggJWlcbiIsCisJCQkgICAgICAgaGVhZGVyLT5vaWQsIGhlYWRlci0+ZGV2aWNlX2lkLCBoZWFkZXItPmZsYWdzLAorCQkJICAgICAgIGhlYWRlci0+bGVuZ3RoKTsKKyNlbmRpZgorCisJCQkvKiBDcmVhdGUgd29yayB0byBoYW5kbGUgdHJhcCBvdXQgb2YgaW50ZXJydXB0CisJCQkgKiBjb250ZXh0LiAqLworCQkJSU5JVF9XT1JLKCZmcmFtZS0+d3MsIHByaXNtNTRfcHJvY2Vzc190cmFwLCBmcmFtZSk7CisJCQlzY2hlZHVsZV93b3JrKCZmcmFtZS0+d3MpOworCisJCX0gZWxzZSB7CisJCQkvKiBTaWduYWwgdGhlIG9uZSB3YWl0aW5nIHByb2Nlc3MgdGhhdCBhIHJlc3BvbnNlCisJCQkgKiBoYXMgYmVlbiByZWNlaXZlZC4gKi8KKwkJCWlmICgoZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBmcmFtZSkpICE9IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICIlczogbWdtdCByZXNwb25zZSBub3QgY29sbGVjdGVkXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIldha2UgdXAgTWdtdCBRdWV1ZVxuIik7CisjZW5kaWYKKwkJCXdha2VfdXAoJnByaXYtPm1nbXRfd3F1ZXVlKTsKKwkJfQorCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbGVhbnVwIHRoZSB0cmFuc21pdCBxdWV1ZSBieSBmcmVlaW5nIGFsbCBmcmFtZXMgaGFuZGxlZCBieSB0aGUgZGV2aWNlLgorICovCit2b2lkCitpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnJfZnJhZzsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgY2xlYW51cCwgZGV0ZXJtaW5lIGZyYWdtZW50IHJhbmdlIHRvCisJICogcHJvY2Vzcy4gIFRoaXMgYXZvaWRzIGFuIGVuZGxlc3MgbG9vcCAoaS5lLiBsb2NrdXApIGlmCisJICogdGhlIGRldmljZSBiZWNhbWUgY29uZnVzZWQsIGluY3JlbWVudGluZyBkZXZpY2VfY3Vycl9mcmFnCisJICogcmFwaWRseS4gKi8KKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJYmFycmllcigpOworCisJZm9yICg7IHByaXYtPmluZGV4X21nbXRfdHggPCBjdXJyX2ZyYWc7IHByaXYtPmluZGV4X21nbXRfdHgrKykgeworCQlpbnQgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3R4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfdHhbaW5kZXhdOworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsIGJ1Zi0+c2l6ZSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1Zi0+cGNpX2FkZHIgPSAwOworCQlrZnJlZShidWYtPm1lbSk7CisJCWJ1Zi0+bWVtID0gTlVMTDsKKwkJYnVmLT5zaXplID0gMDsKKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIG9uZSByZXF1ZXN0LXJlc3BvbnNlIHRyYW5zYWN0aW9uIHRvIHRoZSBkZXZpY2UuCisgKi8KK2ludAoraXNscGNpX21ndF90cmFuc2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJICAgICAgIGludCBvcGVyYXRpb24sIHVuc2lnbmVkIGxvbmcgb2lkLAorCQkgICAgICAgdm9pZCAqc2VuZGRhdGEsIGludCBzZW5kbGVuLAorCQkgICAgICAgc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKipyZWN2ZnJhbWUpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljb25zdCBsb25nIHdhaXRfY3ljbGVfamlmZmllcyA9IChJU0wzOFhYX1dBSVRfQ1lDTEUgKiAxMCAqIEhaKSAvIDEwMDA7CisJbG9uZyB0aW1lb3V0X2xlZnQgPSBJU0wzOFhYX01BWF9XQUlUX0NZQ0xFUyAqIHdhaXRfY3ljbGVfamlmZmllczsKKwlpbnQgZXJyOworCURFRklORV9XQUlUKHdhaXQpOworCisJKnJlY3ZmcmFtZSA9IE5VTEw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tZ210X3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWVyciA9IGlzbHBjaV9tZ3RfdHJhbnNtaXQobmRldiwgb3BlcmF0aW9uLCBvaWQsIHNlbmRkYXRhLCBzZW5kbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FVElNRURPVVQ7CisJd2hpbGUgKHRpbWVvdXRfbGVmdCA+IDApIHsKKwkJaW50IHRpbWVsZWZ0OworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQod2FpdF9jeWNsZV9qaWZmaWVzKTsKKwkJZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBOVUxMKTsKKwkJaWYgKGZyYW1lKSB7CisJCQlpZiAoZnJhbWUtPmhlYWRlci0+b2lkID09IG9pZCkgeworCQkJCSpyZWN2ZnJhbWUgPSBmcmFtZTsKKwkJCQllcnIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IGV4cGVjdGluZyBvaWQgMHgleCwgcmVjZWl2ZWQgMHgleC5cbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpIG9pZCwKKwkJCQkgICAgICAgZnJhbWUtPmhlYWRlci0+b2lkKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQkJZnJhbWUgPSBOVUxMOworCQkJfQorCQl9CisJCWlmICh0aW1lbGVmdCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlICVsdSwgIgorCQkJCSJ0cmlnZ2VyaW5nIGRldmljZVxuIiwKKwkJCQluZGV2LT5uYW1lLCB0aW1lb3V0X2xlZnQpOworCQkJaXNscGNpX3RyaWdnZXIocHJpdik7CisJCX0KKwkJdGltZW91dF9sZWZ0ICs9IHRpbWVsZWZ0IC0gd2FpdF9jeWNsZV9qaWZmaWVzOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlXG4iLAorCSAgICAgICBuZGV2LT5uYW1lKTsKKworCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8gICAgIAorIG91dDoKKwlmaW5pc2hfd2FpdCgmcHJpdi0+bWdtdF93cXVldWUsICZ3YWl0KTsKKwl1cCgmcHJpdi0+bWdtdF9zZW0pOworCXJldHVybiBlcnI7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4MmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xQQ0lfTUdUX0gKKyNkZWZpbmUgX0lTTFBDSV9NR1RfSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworLyoKKyAqICBGdW5jdGlvbiBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgS19ERUJVRyhmLCBtLCBhcmdzLi4uKSBkbyB7IGlmKGYgJiBtKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUJVRyhmLCBhcmdzLi4uKSBLX0RFQlVHKGYsIHBjX2RlYnVnLCBhcmdzKQorCitleHRlcm4gaW50IHBjX2RlYnVnOworI2RlZmluZSBpbml0X3dkcyAwCS8qIGhlbHAgY29tcGlsZXIgb3B0aW1pemUgYXdheSBkZWFkIGNvZGUgKi8KKworCisvKiBHZW5lcmFsIGRyaXZlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9NSU4gCQkweDQwCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCAJCTB4NTAKKworLyogRGVidWdnaW5nIHZlcmJvc2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0hPV19OT1RISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAJLyogb3ZlcnJ1bGVzIGV2ZXJ5dGhpbmcgKi8KKyNkZWZpbmUgU0hPV19BTllUSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgU0hPV19FUlJPUl9NRVNTQUdFUyAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0hPV19UUkFQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0hPV19GVU5DVElPTl9DQUxMUyAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0hPV19UUkFDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0hPV19RVUVVRV9JTkRFWEVTICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU0hPV19QSU1GT1JfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0hPV19CVUZGRVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVkVSQk9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworLyogRGVmYXVsdCBjYXJkIGRlZmluaXRpb25zICovCisjZGVmaW5lIENBUkRfREVGQVVMVF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENBUkRfREVGQVVMVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICBJTkxfTU9ERV9DTElFTlQKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0lXX01PREUJCQlJV19NT0RFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9CU1NUWVBFICAgICAgICAgICAgICAgICAgICBET1QxMV9CU1NUWVBFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9DTElFTlRfU1NJRAkJIiIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0FQX1NTSUQJCQkiZGVmYXVsdCIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTEgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV8xIgorI2RlZmluZSBDQVJEX0RFRkFVTFRfS0VZMiAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfa2V5XzIiCisjZGVmaW5lIENBUkRfREVGQVVMVF9LRVkzICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9rZXlfMyIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTQgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV80IgorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0VQICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfRklMVEVSICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0RTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZQlDQVJEX0RFRkFVTFRfQVVUSEVOICAgICAgICAgICAgICAgICAgICAgRE9UMTFfQVVUSF9PUworI2RlZmluZQlDQVJEX0RFRkFVTFRfRE9UMVgJCQkwCisjZGVmaW5lIENBUkRfREVGQVVMVF9NTE1FX01PREUJCQlET1QxMV9NTE1FX0FVVE8KKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0NPTkZPUk1BTkNFICAgICAgICAgICAgICAgIE9JRF9JTkxfQ09ORk9STUFOQ0VfTk9ORQorI2RlZmluZSBDQVJEX0RFRkFVTFRfUFJPRklMRQkJCURPVDExX1BST0ZJTEVfTUlYRURfR19XSUZJCisjZGVmaW5lIENBUkRfREVGQVVMVF9NQVhGUkFNRUJVUlNUCQlET1QxMV9NQVhGUkFNRUJVUlNUX01JWEVEX1NBRkUKKworLyogUElNRk9SIHBhY2thZ2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUElNRk9SX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBQSU1GT1JfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUElNRk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX09QX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUElNRk9SX09QX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUElNRk9SX09QX1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUElNRk9SX09QX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgIDUJLyogdGlsbCAyNTUgKi8KKyNkZWZpbmUgUElNRk9SX0RFVl9JRF9NSExJX01JQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX0ZMQUdfQVBQTElDX09SSUdJTiAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUElNRk9SX0ZMQUdfTElUVExFX0VORElBTiAgICAgICAgICAgICAgIDB4MDIKKworc3RhdGljIGlubGluZSB2b2lkCithZGRfbGUzMnAodTMyICogbGVfbnVtYmVyLCB1MzIgYWRkKQoreworCSpsZV9udW1iZXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdXAobGVfbnVtYmVyKSArIGFkZCk7Cit9CisKK3ZvaWQgZGlzcGxheV9idWZmZXIoY2hhciAqLCBpbnQpOworCisvKgorICogIFR5cGUgZGVmaW5pdGlvbiBzZWN0aW9uCisgKgorICogIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyBvbmx5IHRoZSBoZWFkZXIgYWxsb3dpbmcgY29weWxlc3MKKyAqICBmcmFtZSBoYW5kbGluZworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdmVyc2lvbjsKKwl1OCBvcGVyYXRpb247CisJdTMyIG9pZDsKKwl1OCBkZXZpY2VfaWQ7CisJdTggZmxhZ3M7CisJdTMyIGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCitwaW1mb3JfaGVhZGVyX3Q7CisKKy8qIEEgcmVjZWl2ZWQgYW5kIGludGVycnVwdC1wcm9jZXNzZWQgbWFuYWdlbWVudCBmcmFtZSwgZWl0aGVyIGZvcgorICogc2NoZWR1bGVfd29yayhwcmlzbTU0X3Byb2Nlc3NfdHJhcCkgb3IgZm9yIHByaXYtPm1nbXRfcmVjZWl2ZWQsCisgKiBwcm9jZXNzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbigpLiAqLworc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OyAgICAgIC8qIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UgKi8KKwlwaW1mb3JfaGVhZGVyX3QgKmhlYWRlcjsgICAgICAvKiBwYXlsb2FkIGhlYWRlciwgcG9pbnRzIGludG8gYnVmICovCisJdm9pZCAqZGF0YTsJCSAgICAgIC8qIHBheWxvYWQgZXggaGVhZGVyLCBwb2ludHMgaW50byBidWYgKi8KKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHdzOwkgICAgICAvKiBhcmd1bWVudCBmb3Igc2NoZWR1bGVfd29yaygpICovCisJY2hhciBidWZbMF07CQkgICAgICAvKiBmcmFnbWVudCBidWZmZXIgKi8KK307CisKK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWdtdF9yeF9maWxsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKwordm9pZAoraXNscGNpX21ndF9jbGVhbnVwX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3BlcmF0aW9uLCB1bnNpZ25lZCBsb25nIG9pZCwKKwkJICAgICAgIHZvaWQgKnNlbmRkYXRhLCBpbnQgc2VuZGxlbiwKKwkJICAgICAgIHN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICoqcmVjdmZyYW1lKTsKKworc3RhdGljIGlubGluZSB2b2lkCitpc2xwY2lfbWd0X3JlbGVhc2Uoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKmZyYW1lKQoreworICAgICAgICBrZnJlZShmcmFtZSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfSVNMUENJX01HVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTIzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwpAQCAtMCwwICsxLDkwNyBAQAorLyogICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisjaW5jbHVkZSAiaXNsX2lvY3RsLmgiCisKKy8qIHRvIGNvbnZlcnQgYmV0d2VlbiBjaGFubmVsIGFuZCBmcmVxICovCitzdGF0aWMgY29uc3QgaW50IGZyZXF1ZW5jeV9saXN0X2JnW10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsCisJMjQzNywgMjQ0MiwgMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NAorfTsKKworaW50CitjaGFubmVsX29mX2ZyZXEoaW50IGYpCit7CisJaW50IGMgPSAwOworCisJaWYgKChmID49IDI0MTIpICYmIChmIDw9IDI0ODQpKSB7CisJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tjXSkpCisJCQljKys7CisJCXJldHVybiAoYyA+PSAxNCkgPyAwIDogKytjOworCX0gZWxzZSBpZiAoKGYgPj0gKGludCkgNTAwMCkgJiYgKGYgPD0gKGludCkgNjAwMCkpIHsKKwkJcmV0dXJuICggKGYgLSA1MDAwKSAvIDUgKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQpIFtuYW1lXSA9IHtvaWQsIDAsIHNpemVvZihzKSwgdH0KKyNkZWZpbmUgT0lEX1NUUlVDVF9DKG5hbWUsb2lkLHMsdCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQgfCBPSURfRkxBR19DQUNIRUQpCisjZGVmaW5lIE9JRF9VMzIobmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1UzMl9DKG5hbWUsb2lkKSBPSURfU1RSVUNUX0MobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1NUUlVDVF9NTE1FKG5hbWUsb2lkKSBPSURfU1RSVUNUKG5hbWUsb2lkLHN0cnVjdCBvYmpfbWxtZSxPSURfVFlQRV9NTE1FKQorI2RlZmluZSBPSURfU1RSVUNUX01MTUVFWChuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzdHJ1Y3Qgb2JqX21sbWVleCxPSURfVFlQRV9NTE1FRVgpCisKKyNkZWZpbmUgT0lEX1VOS05PV04obmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsMCwwKQorCitzdHJ1Y3Qgb2lkX3QgaXNsX29pZFtdID0geworCU9JRF9TVFJVQ1QoR0VOX09JRF9NQUNBRERSRVNTLCAweDAwMDAwMDAwLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMihHRU5fT0lEX0xJTktTVEFURSwgMHgwMDAwMDAwMSksCisJT0lEX1VOS05PV04oR0VOX09JRF9XQVRDSERPRywgMHgwMDAwMDAwMiksCisJT0lEX1VOS05PV04oR0VOX09JRF9NSUJPUCwgMHgwMDAwMDAwMyksCisJT0lEX1VOS05PV04oR0VOX09JRF9PUFRJT05TLCAweDAwMDAwMDA0KSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX0xFRENPTkZJRywgMHgwMDAwMDAwNSksCisKKwkvKiA4MDIuMTEgKi8KKwlPSURfVTMyX0MoRE9UMTFfT0lEX0JTU1RZUEUsIDB4MTAwMDAwMDApLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfQlNTSUQsIDB4MTAwMDAwMDEsIHU4WzZdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRCwgMHgxMDAwMDAwMiwgc3RydWN0IG9ial9zc2lkLAorCQkgICAgIE9JRF9UWVBFX1NTSUQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NUQVRFLCAweDEwMDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BSUQsIDB4MTAwMDAwMDQpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0NPVU5UUllTVFJJTkcsIDB4MTAwMDAwMDUsIHU4WzRdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRE9WRVJSSURFLCAweDEwMDAwMDA2LCBzdHJ1Y3Qgb2JqX3NzaWQsCisJCSAgICAgT0lEX1RZUEVfU1NJRCksCisKKwlPSURfVTMyKERPVDExX09JRF9NRURJVU1MSU1JVCwgMHgxMTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9CRUFDT05QRVJJT0QsIDB4MTEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0RUSU1QRVJJT0QsIDB4MTEwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FUSU1XSU5ET1csIDB4MTEwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0xJU1RFTklOVEVSVkFMLCAweDExMDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9DRlBQRVJJT0QsIDB4MTEwMDAwMDUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NGUERVUkFUSU9OLCAweDExMDAwMDA2KSwKKworCU9JRF9VMzJfQyhET1QxMV9PSURfQVVUSEVOQUJMRSwgMHgxMjAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMHgxMjAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9FWFVORU5DUllQVEVELCAweDEyMDAwMDAyKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0RFRktFWUlELCAweDEyMDAwMDAzKSwKKwlbRE9UMTFfT0lEX0RFRktFWVhdID0gezB4MTIwMDAwMDQsIDMsIHNpemVvZiAoc3RydWN0IG9ial9rZXkpLAorCQkJICAgICAgIE9JRF9GTEFHX0NBQ0hFRCB8IE9JRF9UWVBFX0tFWX0sCS8qIERPVDExX09JRF9ERUZLRVkxLC4uLkRPVDExX09JRF9ERUZLRVk0ICovCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1NUQUtFWSwgMHgxMjAwMDAwOCksCisJT0lEX1UzMihET1QxMV9PSURfUkVLRVlUSFJFU0hPTEQsIDB4MTIwMDAwMDkpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9TVEFTQywgMHgxMjAwMDAwYSksCisKKwlPSURfVTMyKERPVDExX09JRF9QUklWVFhSRUpFQ1RFRCwgMHgxYTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYUExBSU4sIDB4MWEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BSSVZSWEZBSUxFRCwgMHgxYTAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYTk9LRVksIDB4MWEwMDAwMDMpLAorCisJT0lEX1UzMl9DKERPVDExX09JRF9SVFNUSFJFU0gsIDB4MTMwMDAwMDApLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRlJBR1RIUkVTSCwgMHgxMzAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9TSE9SVFJFVFJJRVMsIDB4MTMwMDAwMDIpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTE9OR1JFVFJJRVMsIDB4MTMwMDAwMDMpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTUFYVFhMSUZFVElNRSwgMHgxMzAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTUFYUlhMSUZFVElNRSwgMHgxMzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQVVUSFJFU1BUSU1FT1VULCAweDEzMDAwMDA2KSwKKwlPSURfVTMyKERPVDExX09JRF9BU1NPQ1JFU1BUSU1FT1VULCAweDEzMDAwMDA3KSwKKworCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9UQUJMRSwgMHgxZDAwMDAwMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NUUkxfVEFCTEUsIDB4MWQwMDAwMDEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9SRVRSRUFULCAweDFkMDAwMDAyKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfUFJPR1JFU1MsIDB4MWQwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FMT0ZUX0ZJWEVEUkFURSwgMHgxZDAwMDAwNCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1JTU0lHUkFQSCwgMHgxZDAwMDAwNSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NPTkZJRywgMHgxZDAwMDAwNiksCisKKwlbRE9UMTFfT0lEX1ZEQ0ZYXSA9IHsweDFiMDAwMDAwLCA3LCAwLCAwfSwKKwlPSURfVTMyKERPVDExX09JRF9NQVhGUkFNRUJVUlNULCAweDFiMDAwMDA4KSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX1BTTSwgMHgxNDAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0FNVElNRU9VVCwgMHgxNDAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfUkVDRUlWRURUSU1TLCAweDE0MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9ST0FNUFJFRkVSRU5DRSwgMHgxNDAwMDAwMyksCisKKwlPSURfVTMyKERPVDExX09JRF9CUklER0VMT0NBTCwgMHgxNTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UUywgMHgxNTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsIDB4MTUwMDAwMDIpLAorCVtET1QxMV9PSURfQ0xJRU5UWF0gPSB7MHgxNTAwMDAwMywgMjAwNiwgMCwgMH0sCS8qIERPVDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCisKKwlPSURfU1RSVUNUKERPVDExX09JRF9DTElFTlRGSU5ELCAweDE1MDAwN0RCLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfV0RTTElOS0FERCwgMHgxNTAwMDdEQywgdThbNl0sIE9JRF9UWVBFX0FERFIpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1dEU0xJTktSRU1PVkUsIDB4MTUwMDA3REQsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9FQVBBVVRIU1RBLCAweDE1MDAwN0RFLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfRUFQVU5BVVRIU1RBLCAweDE1MDAwN0RGLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMl9DKERPVDExX09JRF9ET1QxWEVOQUJMRSwgMHgxNTAwMDdFMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX01JQ0ZBSUxVUkUsIDB4MTUwMDA3RTEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9SRUtFWUlORElDQVRFLCAweDE1MDAwN0UyKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWFNVQ0NFU1NGVUwsIDB4MTYwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWE9ORVJFVFJZLCAweDE2MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9NUERVVFhNVUxUSVBMRVJFVFJJRVMsIDB4MTYwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwgMHgxNjAwMDAwMyksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYRFVQUywgMHgxNjAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfUlRTU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNiksCisJT0lEX1UzMihET1QxMV9PSURfUlRTRkFJTEVELCAweDE2MDAwMDA3KSwKKwlPSURfVTMyKERPVDExX09JRF9BQ0tGQUlMRUQsIDB4MTYwMDAwMDgpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FUkVDRUlWRVMsIDB4MTYwMDAwMDkpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FRVJST1JTLCAweDE2MDAwMDBBKSwKKwlPSURfVTMyKERPVDExX09JRF9GUkFNRUFCT1JUUywgMHgxNjAwMDAwQiksCisJT0lEX1UzMihET1QxMV9PSURfRlJBTUVBQk9SVFNQSFksIDB4MTYwMDAwMEMpLAorCisJT0lEX1UzMihET1QxMV9PSURfU0xPVFRJTUUsIDB4MTcwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NXTUlOLCAweDE3MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9DV01BWCwgMHgxNzAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfQUNLV0lORE9XLCAweDE3MDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BTlRFTk5BUlgsIDB4MTcwMDAwMDQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FOVEVOTkFUWCwgMHgxNzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQU5URU5OQURJVkVSU0lUWSwgMHgxNzAwMDAwNiksCisJT0lEX1UzMl9DKERPVDExX09JRF9DSEFOTkVMLCAweDE3MDAwMDA3KSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAweDE3MDAwMDA4KSwKKwlPSURfVTMyKERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTLCAweDE3MDAwMDA5KSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9SQVRFUywgMHgxNzAwMDAwQSwgdThbSVdNQVhfQklUUkFURVMgKyAxXSwKKwkJICAgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVELCAweDE3MDAwMDBCKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFLCAweDE3MDAwMDBDKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfUlNTSVZFQ1RPUiwgMHgxNzAwMDAwRCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX09VVFBVVFBPV0VSVEFCTEUsIDB4MTcwMDAwMEUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX09VVFBVVFBPV0VSLCAweDE3MDAwMDBGKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9TVVBQT1JURURSQVRFUywgMHgxNzAwMDAxMCwKKwkJICAgdThbSVdNQVhfQklUUkFURVMgKyAxXSwgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0ZSRVFVRU5DWSwgMHgxNzAwMDAxMSksCisJW0RPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFU10gPQorCSAgICB7MHgxNzAwMDAxMiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzKQorCSAgICAgKyBzaXplb2YgKHUxNikgKiBJV01BWF9GUkVRLCBPSURfVFlQRV9GUkVRVUVOQ0lFU30sCisKKwlPSURfVTMyKERPVDExX09JRF9OT0lTRUZMT09SLCAweDE3MDAwMDEzKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9GUkVRVUVOQ1lBQ1RJVklUWSwgMHgxNzAwMDAxNCwgdThbSVdNQVhfRlJFUSArIDFdLAorCQkgICBPSURfVFlQRV9SQVcpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9JUUNBTElCUkFUSU9OVEFCTEUsIDB4MTcwMDAwMTUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sIDB4MTcwMDAwMTYpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NMT1RTRVRUSU5HUywgMHgxNzAwMDAxNyksCisJT0lEX1UzMihET1QxMV9PSURfTk9ORVJQVElNRU9VVCwgMHgxNzAwMDAxOCksCisJT0lEX1UzMihET1QxMV9PSURfUFJPRklMRVMsIDB4MTcwMDAwMTkpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsIDB4MTcwMDAwMjAsCisJCSAgIHU4W0lXTUFYX0JJVFJBVEVTICsgMV0sIE9JRF9UWVBFX1JBVyksCisKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFLCAweDE4MDAwMDAwKSwKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURSwgMHgxODAwMDAwMSksCisJT0lEX1NUUlVDVF9NTE1FKERPVDExX09JRF9ESVNBU1NPQ0lBVEUsIDB4MTgwMDAwMDIpLAorCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9PSURfQVNTT0NJQVRFLCAweDE4MDAwMDAzKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfU0NBTiwgMHgxODAwMDAwNCksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0JFQUNPTiwgMHgxODAwMDAwNSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1BST0JFLCAweDE4MDAwMDA2KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfREVBVVRIRU5USUNBVEVFWCwgMHgxODAwMDAwNyksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURUVYLCAweDE4MDAwMDA4KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfRElTQVNTT0NJQVRFRVgsIDB4MTgwMDAwMDkpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9BU1NPQ0lBVEVFWCwgMHgxODAwMDAwQSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1JFQVNTT0NJQVRFLCAweDE4MDAwMDBCKSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUkVBU1NPQ0lBVEVFWCwgMHgxODAwMDAwQyksCisKKwlPSURfVTMyKERPVDExX09JRF9OT05FUlBTVEFUVVMsIDB4MUUwMDAwMDApLAorCisJT0lEX1UzMihET1QxMV9PSURfU1RBVElNRU9VVCwgMHgxOTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAweDE5MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9CU1NUSU1FT1VULCAweDE5MDAwMDAyKSwKKwlbRE9UMTFfT0lEX0FUVEFDSE1FTlRdID0gezB4MTkwMDAwMDMsIDAsCisJCXNpemVvZihzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQpLCBPSURfVFlQRV9BVFRBQ0h9LAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfUFNNQlVGRkVSLCAweDE5MDAwMDA0LCBzdHJ1Y3Qgb2JqX2J1ZmZlciwKKwkJICAgICBPSURfVFlQRV9CVUZGRVIpLAorCisJT0lEX1UzMihET1QxMV9PSURfQlNTUywgMHgxQzAwMDAwMCksCisJW0RPVDExX09JRF9CU1NYXSA9IHsweDFDMDAwMDAxLCA2Mywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcyksCisJCQkgICAgT0lEX1RZUEVfQlNTfSwJLypET1QxMV9PSURfQlNTMSwuLi4sRE9UMTFfT0lEX0JTUzY0ICovCisJT0lEX1NUUlVDVChET1QxMV9PSURfQlNTRklORCwgMHgxQzAwMDA0Miwgc3RydWN0IG9ial9ic3MsIE9JRF9UWVBFX0JTUyksCisJW0RPVDExX09JRF9CU1NMSVNUXSA9IHsweDFDMDAwMDQzLCAwLCBzaXplb2YgKHN0cnVjdAorCQkJCQkJICAgICAgb2JqX2Jzc2xpc3QpICsKKwkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBvYmpfYnNzW0lXTUFYX0JTU10pLAorCQkJICAgICAgIE9JRF9UWVBFX0JTU0xJU1R9LAorCisJT0lEX1VOS05PV04oT0lEX0lOTF9UVU5ORUwsIDB4RkYwMjAwMDApLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfTUVNQUREUiwgMHhGRjAyMDAwMSksCisJT0lEX1VOS05PV04oT0lEX0lOTF9NRU1PUlksIDB4RkYwMjAwMDIpLAorCU9JRF9VMzJfQyhPSURfSU5MX01PREUsIDB4RkYwMjAwMDMpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX05SLCAweEZGMDIwMDA0KSwKKwlPSURfU1RSVUNUKE9JRF9JTkxfVkVSU0lPTiwgMHhGRjAyMDAwNSwgdThbOF0sIE9JRF9UWVBFX1JBVyksCisJT0lEX1VOS05PV04oT0lEX0lOTF9JTlRFUkZBQ0VfSUQsIDB4RkYwMjAwMDYpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX0lELCAweEZGMDIwMDA3KSwKKwlPSURfVTMyX0MoT0lEX0lOTF9DT05GSUcsIDB4RkYwMjAwMDgpLAorCU9JRF9VMzJfQyhPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgMHhGRjAyMDAwQyksCisJT0lEX1UzMihPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgMHhGRjAyMDAwRCksCisJT0lEX1UzMl9DKE9JRF9JTkxfT1VUUFVUUE9XRVIsIDB4RkYwMjAwMEYpLAorCit9OworCitpbnQKK21ndF9pbml0KGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJcHJpdi0+bWliID0ga21hbGxvYyhPSURfTlVNX0xBU1QgKiBzaXplb2YgKHZvaWQgKiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+bWliKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwcml2LT5taWIsIDAsIE9JRF9OVU1fTEFTVCAqIHNpemVvZiAodm9pZCAqKSk7CisKKwkvKiBBbGxvYyB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspIHsKKwkJaWYgKGlzbF9vaWRbaV0uZmxhZ3MgJiBPSURfRkxBR19DQUNIRUQpIHsKKwkJCXByaXYtPm1pYltpXSA9IGttYWxsb2MoaXNsX29pZFtpXS5zaXplICoKKwkJCQkJICAgICAgIChpc2xfb2lkW2ldLnJhbmdlICsgMSksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcHJpdi0+bWliW2ldKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtc2V0KHByaXYtPm1pYltpXSwgMCwKKwkJCSAgICAgICBpc2xfb2lkW2ldLnNpemUgKiAoaXNsX29pZFtpXS5yYW5nZSArIDEpKTsKKwkJfSBlbHNlCisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCX0KKworCWluaXRfcndzZW0oJnByaXYtPm1pYl9zZW0pOworCXByaXNtNTRfbWliX2luaXQocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbWd0X2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJaWYgKCFwcml2LT5taWIpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspCisJCWlmIChwcml2LT5taWJbaV0pIHsKKwkJCWtmcmVlKHByaXYtPm1pYltpXSk7CisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCQl9CisJa2ZyZWUocHJpdi0+bWliKTsKKwlwcml2LT5taWIgPSBOVUxMOworfQorCit2b2lkCittZ3RfbGVfdG9fY3B1KGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0lEX1RZUEVfVTMyOgorCQkqKHUzMiAqKSBkYXRhID0gbGUzMl90b19jcHUoKih1MzIgKikgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlVGRkVSOnsKKwkJCXN0cnVjdCBvYmpfYnVmZmVyICpidWZmID0gZGF0YTsKKwkJCWJ1ZmYtPnNpemUgPSBsZTMyX3RvX2NwdShidWZmLT5zaXplKTsKKwkJCWJ1ZmYtPmFkZHIgPSBsZTMyX3RvX2NwdShidWZmLT5hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9CU1M6eworCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9IGRhdGE7CisJCQlic3MtPmFnZSA9IGxlMTZfdG9fY3B1KGJzcy0+YWdlKTsKKwkJCWJzcy0+Y2hhbm5lbCA9IGxlMTZfdG9fY3B1KGJzcy0+Y2hhbm5lbCk7CisJCQlic3MtPmNhcGluZm8gPSBsZTE2X3RvX2NwdShic3MtPmNhcGluZm8pOworCQkJYnNzLT5yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+cmF0ZXMpOworCQkJYnNzLT5iYXNpY19yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+YmFzaWNfcmF0ZXMpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTU0xJU1Q6eworCQkJc3RydWN0IG9ial9ic3NsaXN0ICpsaXN0ID0gZGF0YTsKKwkJCWludCBpOworCQkJbGlzdC0+bnIgPSBsZTMyX3RvX2NwdShsaXN0LT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJCQltZ3RfbGVfdG9fY3B1KE9JRF9UWVBFX0JTUywgJmxpc3QtPmJzc2xpc3RbaV0pOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0ZSRVFVRU5DSUVTOnsKKwkJCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMgKmZyZXEgPSBkYXRhOworCQkJaW50IGk7CisJCQlmcmVxLT5uciA9IGxlMTZfdG9fY3B1KGZyZXEtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5ucjsgaSsrKQorCQkJCWZyZXEtPm1oeltpXSA9IGxlMTZfdG9fY3B1KGZyZXEtPm1oeltpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfTUxNRTp7CisJCQlzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FRVg6eworCQkJc3RydWN0IG9ial9tbG1lZXggKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCW1sbWUtPnNpemUgPSBsZTE2X3RvX2NwdShtbG1lLT5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9BVFRBQ0g6eworCQkJc3RydWN0IG9ial9hdHRhY2htZW50ICphdHRhY2ggPSBkYXRhOworCQkJYXR0YWNoLT5pZCA9IGxlMTZfdG9fY3B1KGF0dGFjaC0+aWQpOworCQkJYXR0YWNoLT5zaXplID0gbGUxNl90b19jcHUoYXR0YWNoLT5zaXplKTs7IAorCQkJYnJlYWs7CisJfQorCWNhc2UgT0lEX1RZUEVfU1NJRDoKKwljYXNlIE9JRF9UWVBFX0tFWToKKwljYXNlIE9JRF9UWVBFX0FERFI6CisJY2FzZSBPSURfVFlQRV9SQVc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIHZvaWQKK21ndF9jcHVfdG9fbGUoaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPSURfVFlQRV9VMzI6CisJCSoodTMyICopIGRhdGEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSBkYXRhOworCQkJYnVmZi0+c2l6ZSA9IGNwdV90b19sZTMyKGJ1ZmYtPnNpemUpOworCQkJYnVmZi0+YWRkciA9IGNwdV90b19sZTMyKGJ1ZmYtPmFkZHIpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gZGF0YTsKKwkJCWJzcy0+YWdlID0gY3B1X3RvX2xlMTYoYnNzLT5hZ2UpOworCQkJYnNzLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoYnNzLT5jaGFubmVsKTsKKwkJCWJzcy0+Y2FwaW5mbyA9IGNwdV90b19sZTE2KGJzcy0+Y2FwaW5mbyk7CisJCQlic3MtPnJhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5yYXRlcyk7CisJCQlic3MtPmJhc2ljX3JhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5iYXNpY19yYXRlcyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSBkYXRhOworCQkJaW50IGk7CisJCQlsaXN0LT5uciA9IGNwdV90b19sZTMyKGxpc3QtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCW1ndF9jcHVfdG9fbGUoT0lEX1RZUEVfQlNTLCAmbGlzdC0+YnNzbGlzdFtpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfRlJFUVVFTkNJRVM6eworCQkJc3RydWN0IG9ial9mcmVxdWVuY2llcyAqZnJlcSA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWZyZXEtPm5yID0gY3B1X3RvX2xlMTYoZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJZnJlcS0+bWh6W2ldID0gY3B1X3RvX2xlMTYoZnJlcS0+bWh6W2ldKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FOnsKKwkJCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJbWxtZS0+c2l6ZSA9IGNwdV90b19sZTE2KG1sbWUtPnNpemUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IGRhdGE7CisJCQlhdHRhY2gtPmlkID0gY3B1X3RvX2xlMTYoYXR0YWNoLT5pZCk7CisJCQlhdHRhY2gtPnNpemUgPSBjcHVfdG9fbGUxNihhdHRhY2gtPnNpemUpOzsgCisJCQlicmVhazsKKwl9CisJY2FzZSBPSURfVFlQRV9TU0lEOgorCWNhc2UgT0lEX1RZUEVfS0VZOgorCWNhc2UgT0lEX1RZUEVfQUREUjoKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKiBOb3RlIDogZGF0YSBpcyBtb2RpZmllZCBkdXJpbmcgdGhpcyBmdW5jdGlvbiAqLworCitpbnQKK21ndF9zZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisJaW50IHJlc3BvbnNlX29wID0gUElNRk9SX09QX0VSUk9SOworCWludCBkbGVuOworCXZvaWQgKmNhY2hlLCAqX2RhdGEgPSBkYXRhOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IChjYWNoZSA/IGV4dHJhICogZGxlbiA6IDApOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkICsgZXh0cmE7CisKKwlpZiAoX2RhdGEgPT0gTlVMTCkKKwkJLyogd2UgYXJlIHJlcXVlc3RlZCB0byByZS1zZXQgYSBjYWNoZWQgdmFsdWUgKi8KKwkJX2RhdGEgPSBjYWNoZTsKKwllbHNlCisJCW1ndF9jcHVfdG9fbGUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIF9kYXRhKTsKKwkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdG8gdGhlIGNhY2hlLCB3ZSBkb24ndCB3YW50IGFueW9uZSB0byByZWFkCisJICogaXQgLT4gYWNxdWlyZSB3cml0ZSBsb2NrLgorCSAqIEVsc2Ugd2UgY291bGQgYWNxdWlyZSBhIHJlYWQgbG9jayB0byBiZSBzdXJlIHdlIGRvbid0IGJvdGhlciB0aGUKKwkgKiBjb21taXQgcHJvY2VzcyAod2hpY2ggdGFrZXMgYSB3cml0ZSBsb2NrKS4gQnV0IEknbSBub3Qgc3VyZSBpZiBpdCdzCisJICogbmVlZGVkLgorCSAqLworCWlmIChjYWNoZSkKKwkJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgX2RhdGEsIGRsZW4sICZyZXNwb25zZSk7CisJCWlmICghcmV0KSB7CisJCQlyZXNwb25zZV9vcCA9IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbjsKKwkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCX0KKwkJaWYgKHJldCB8fCByZXNwb25zZV9vcCA9PSBQSU1GT1JfT1BfRVJST1IpCisJCQlyZXQgPSAtRUlPOworCX0gZWxzZSBpZiAoIWNhY2hlKQorCQlyZXQgPSAtRUlPOworCisJaWYgKGNhY2hlKSB7CisJCWlmICghcmV0ICYmIGRhdGEpCisJCQltZW1jcHkoY2FjaGUsIF9kYXRhLCBkbGVuKTsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCX0KKworCS8qIHJlLXNldCBnaXZlbiBkYXRhIHRvIHdoYXQgaXQgd2FzICovCisJaWYgKGRhdGEpCisJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm9uZSBvZiB0aGVzZSBhcmUgY2FjaGVkICovCitpbnQKK21ndF9zZXRfdmFybGVuKGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhLCBpbnQgZXh0cmFfbGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisJaW50IGRsZW47CisJdTMyIG9pZDsKKworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkOworCisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgZGF0YSwgZGxlbiArIGV4dHJhX2xlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlc3BvbnNlX29wID0gcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIAorCQlyZXQgPSAtRUlPOworCisJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KKwlpZiAoZGF0YSkKKwkJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK21ndF9nZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhLAorCQl1bmlvbiBvaWRfcmVzX3QgKnJlcykKK3sKKworCWludCByZXQgPSAtRUlPOworCWludCByZXNsZW4gPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisKKwlpbnQgZGxlbjsKKwl2b2lkICpjYWNoZSwgKl9yZXMgPSBOVUxMOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJcmVzLT5wdHIgPSBOVUxMOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IGNhY2hlID8gZXh0cmEgKiBkbGVuIDogMDsKKwlvaWQgPSBpc2xfb2lkW25dLm9pZCArIGV4dHJhOworCXJlc2xlbiA9IGRsZW47CisKKwlpZiAoY2FjaGUpCisJCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCQkgICAgIG9pZCwgZGF0YSwgZGxlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UgfHwKKwkJICAgIHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJX3JlcyA9IHJlc3BvbnNlLT5kYXRhOworCQkJcmVzbGVuID0gcmVzcG9uc2UtPmhlYWRlci0+bGVuZ3RoOworCQl9CisJfSBlbHNlIGlmIChjYWNoZSkgeworCQlfcmVzID0gY2FjaGU7CisJCXJldCA9IDA7CisJfQorCWlmICgoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpID09IE9JRF9UWVBFX1UzMikKKwkJcmVzLT51ID0gcmV0ID8gMCA6IGxlMzJfdG9fY3B1KCoodTMyICopIF9yZXMpOworCWVsc2UgeworCQlyZXMtPnB0ciA9IGttYWxsb2MocmVzbGVuLCBHRlBfS0VSTkVMKTsKKwkJQlVHX09OKHJlcy0+cHRyID09IE5VTEwpOworCQlpZiAocmV0KQorCQkJbWVtc2V0KHJlcy0+cHRyLCAwLCByZXNsZW4pOworCQllbHNlIHsKKwkJCW1lbWNweShyZXMtPnB0ciwgX3JlcywgcmVzbGVuKTsKKwkJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsCisJCQkJICAgICAgcmVzLT5wdHIpOworCQl9CisJfQorCWlmIChjYWNoZSkKKwkJdXBfcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAocmVzcG9uc2UgJiYgIXJldCkKKwkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKworCWlmIChyZXNsZW4gPiBpc2xfb2lkW25dLnNpemUpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAibWd0X2dldF9yZXF1ZXN0KDB4JXgpOiByZWNlaXZlZCBkYXRhIGxlbmd0aCB3YXMgYmlnZ2VyICIKKwkJICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCA+ICVkKS4gTWVtb3J5IGlzIHByb2JhYmx5IGNvcnJ1cHRlZC4uLiIsCisJCSAgICAgICBvaWQsIHJlc2xlbiwgaXNsX29pZFtuXS5zaXplKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGxvY2sgb3V0c2lkZSAqLworaW50CittZ3RfY29tbWl0X2xpc3QoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90ICpsLCBpbnQgbikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqcmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXN0cnVjdCBvaWRfdCAqdCA9ICYoaXNsX29pZFtsW2ldXSk7CisJCXZvaWQgKmRhdGEgPSBwcml2LT5taWJbbFtpXV07CisJCWludCBqID0gMDsKKwkJdTMyIG9pZCA9IHQtPm9pZDsKKwkJQlVHX09OKGRhdGEgPT0gTlVMTCk7CisJCXdoaWxlIChqIDw9IHQtPnJhbmdlKSB7CisJCQlpbnQgciA9IGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX1NFVCwKKwkJCQkJCSAgICAgIG9pZCwgZGF0YSwgdC0+c2l6ZSwKKwkJCQkJCSAgICAgICZyZXNwb25zZSk7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQlyIHw9IChyZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX0VSUk9SKTsKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJfQorCQkJaWYgKHIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X2NvbW1pdF9saXN0OiBmYWlsdXJlLiAiCisJCQkJCSJvaWQ9JTA4eCBlcnI9JWRcbiIsCisJCQkJCXByaXYtPm5kZXYtPm5hbWUsIG9pZCwgcik7CisJCQlyZXQgfD0gcjsKKwkJCWorKzsKKwkJCW9pZCsrOworCQkJZGF0YSArPSB0LT5zaXplOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIExvY2sgb3V0c2lkZSAqLworCit2b2lkCittZ3Rfc2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKworCW1lbWNweShwcml2LT5taWJbbl0sIGRhdGEsIGlzbF9vaWRbbl0uc2l6ZSk7CisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgcHJpdi0+bWliW25dKTsKK30KKwordm9pZAorbWd0X2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3Qgbiwgdm9pZCAqcmVzKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKwlCVUdfT04ocmVzID09IE5VTEwpOworCisJbWVtY3B5KHJlcywgcHJpdi0+bWliW25dLCBpc2xfb2lkW25dLnNpemUpOworCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIHJlcyk7Cit9CisKKy8qIENvbW1pdHMgdGhlIGNhY2hlLiBMb2NrIG91dHNpZGUuICovCisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDFbXSA9IHsKKwlPSURfSU5MX0NPTkZJRywKKwlPSURfSU5MX01PREUsCisJRE9UMTFfT0lEX0JTU1RZUEUsCisJRE9UMTFfT0lEX0NIQU5ORUwsCisJRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwKK307CisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDJbXSA9IHsKKwlET1QxMV9PSURfU1NJRCwKKwlET1QxMV9PSURfUFNNQlVGRkVSLAorCURPVDExX09JRF9BVVRIRU5BQkxFLAorCURPVDExX09JRF9QUklWQUNZSU5WT0tFRCwKKwlET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwKKwlET1QxMV9PSURfREVGS0VZWCwJLyogTVVMVElQTEUgKi8KKwlET1QxMV9PSURfREVGS0VZSUQsCisJRE9UMTFfT0lEX0RPVDFYRU5BQkxFLAorCU9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLAorCS8qIERvIG5vdCBpbml0aWFsaXplIHRoaXMgLSBmdyA8IDEuMC40LjMgcmVqZWN0cyBpdAorCU9JRF9JTkxfT1VUUFVUUE9XRVIsCisJKi8KK307CisKKy8qIHVwZGF0ZSB0aGUgTUFDIGFkZHIuICovCitzdGF0aWMgaW50CittZ3RfdXBkYXRlX2FkZHIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlczsKKwlpbnQgcmV0OworCisJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCSAgICAgaXNsX29pZFtHRU5fT0lEX01BQ0FERFJFU1NdLm9pZCwgTlVMTCwKKwkJCQkgICAgIGlzbF9vaWRbR0VOX09JRF9NQUNBRERSRVNTXS5zaXplLCAmcmVzKTsKKworCWlmICgocmV0ID09IDApICYmIHJlcyAmJiAocmVzLT5oZWFkZXItPm9wZXJhdGlvbiAhPSBQSU1GT1JfT1BfRVJST1IpKQorCQltZW1jcHkocHJpdi0+bmRldi0+ZGV2X2FkZHIsIHJlcy0+ZGF0YSwgNik7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmIChyZXMpCisJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXMpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X3VwZGF0ZV9hZGRyOiBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFZFQ19TSVpFKGEpIChzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKQorCitpbnQKK21ndF9jb21taXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJ2YWx1ZTsKKwl1MzIgdTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJcnZhbHVlID0gbWd0X2NvbW1pdF9saXN0KHByaXYsIGNvbW1pdF9wYXJ0MSwgVkVDX1NJWkUoY29tbWl0X3BhcnQxKSk7CisKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpCisJCXJ2YWx1ZSB8PSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgY29tbWl0X3BhcnQyLCBWRUNfU0laRShjb21taXRfcGFydDIpKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJcnZhbHVlIHw9IG1ndF91cGRhdGVfYWRkcihwcml2KTsKKworCWlmIChydmFsdWUpIHsKKwkJLyogc29tZSByZXF1ZXN0IGhhdmUgZmFpbGVkLiBUaGUgZGV2aWNlIG1pZ2h0IGJlIGluIGFuCisJCSAgIGluY29oZXJlbnQgc3RhdGUuIFdlIHNob3VsZCByZXNldCBpdCAhICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWd0X2NvbW1pdDogZmFpbHVyZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJfQorCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgT0lEcyBuZWVkIHRvIGJlICJ1bmxhdGNoZWQiOgorICoKKyAqIE1FRElVTUxJTUlULEJFQUNPTlBFUklPRCxEVElNUEVSSU9ELEFUSU1XSU5ET1csTElTVEVOSU5URVJWQUwKKyAqIEZSRVFVRU5DWSxFWFRFTkRFRFJBVEVTLgorICoKKyAqIFRoZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZXQgRVNTSUQuIE5vdGUgdGhvdWdoIHRoYXQgdGhleSBtYXkgZ2V0IAorICogdW5sYXRjaCBiZWZvcmUgdGhvdWdoIGJ5IHNldHRpbmcgYW5vdGhlciBPSUQuICovCisjaWYgMAordm9pZAorbWd0X3VubGF0Y2hfYWxsKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXUzMiB1OworCWludCBydmFsdWUgPSAwOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkKKwkJcmV0dXJuOworCisJdSA9IERPVDExX09JRF9TU0lEOworCXJ2YWx1ZSA9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJLyogTmVjZXNzYXJ5IGlmIGluIE1BTlVBTCBSVU4gbW9kZT8gKi8KKyNpZiAwCisJdSA9IE9JRF9JTkxfTU9ERTsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBET1QxMV9PSURfTUxNRUFVVE9MRVZFTDsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisjZW5kaWYKKworCWlmIChydmFsdWUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5sYXRjaGluZyBPSURzIGZhaWxlZFxuIiwgcHJpdi0+bmRldi0+bmFtZSk7Cit9CisjZW5kaWYKKworLyogVGhpcyB3aWxsIHRlbGwgeW91IGlmIHlvdSBhcmUgYWxsb3dlZCB0byBhbnN3ZXIgYSBtbG1lKGV4KSByZXF1ZXN0IC4qLworCitpbnQKK21ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgbWxtZWF1dG9sZXZlbDsKKwkvKiBBY3F1aXJlIGEgcmVhZCBsb2NrIGJlY2F1c2UgaWYgd2UgYXJlIGluIGEgbW9kZSBjaGFuZ2UsIGl0J3MKKwkgKiBwb3NzaWJsZSB0byBhbnN3ZXIgdHJ1ZSwgd2hpbGUgdGhlIGNhcmQgaXMgbGVhdmluZyBtYXN0ZXIgdG8gbWFuYWdlZAorCSAqIG1vZGUuIEFuc3dlcmluZyB0byBhIG1sbWUgaW4gdGhpcyBzaXR1YXRpb24gY291bGQgaGFuZyB0aGUgY2FyZC4KKwkgKi8KKwlkb3duX3JlYWQoJnByaXYtPm1pYl9zZW0pOworCW1sbWVhdXRvbGV2ZWwgPQorCSAgICBsZTMyX3RvX2NwdSgqKHUzMiAqKSBwcml2LT5taWJbRE9UMTFfT0lEX01MTUVBVVRPTEVWRUxdKTsKKwl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCShtbG1lYXV0b2xldmVsID49IERPVDExX01MTUVfSU5URVJNRURJQVRFKSk7Cit9CisKK2VudW0gb2lkX251bV90CittZ3Rfb2lkdG9udW0odTMyIG9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPSURfTlVNX0xBU1Q7IGkrKykKKwkJaWYgKGlzbF9vaWRbaV0ub2lkID09IG9pZCkKKwkJCXJldHVybiBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvb2tpbmcgZm9yIGFuIHVua25vd24gb2lkIDB4JXgiLCBvaWQpOworCisJcmV0dXJuIE9JRF9OVU1fTEFTVDsKK30KKworaW50CittZ3RfcmVzcG9uc2VfdG9fc3RyKGVudW0gb2lkX251bV90IG4sIHVuaW9uIG9pZF9yZXNfdCAqciwgY2hhciAqc3RyKQoreworCXN3aXRjaCAoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpIHsKKwljYXNlIE9JRF9UWVBFX1UzMjoKKwkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgIiV1XG4iLCByLT51KTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkic2l6ZT0ldVxuYWRkcj0weCVYXG4iLCBidWZmLT5zaXplLAorCQkJCQlidWZmLT5hZGRyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSJiYXNpY19yYXRlcz0weCVYXG4iLCBic3MtPmFnZSwKKwkJCQkJYnNzLT5jaGFubmVsLCBic3MtPmNhcGluZm8sCisJCQkJCWJzcy0+cmF0ZXMsIGJzcy0+YmFzaWNfcmF0ZXMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSByLT5wdHI7CisJCQlpbnQgaSwgazsKKwkJCWsgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgbGlzdC0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQkJayArPSBzbnByaW50ZihzdHIgKyBrLCBQUklWX1NUUl9TSVpFIC0gaywKKwkJCQkJICAgICAgImJzc1sldV0gOiBcbmFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkgICAgICAiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSAgICAgICJiYXNpY19yYXRlcz0weCVYXG4iLAorCQkJCQkgICAgICBpLCBsaXN0LT5ic3NsaXN0W2ldLmFnZSwKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5jaGFubmVsLAorCQkJCQkgICAgICBsaXN0LT5ic3NsaXN0W2ldLmNhcGluZm8sCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0ucmF0ZXMsCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0uYmFzaWNfcmF0ZXMpOworCQkJcmV0dXJuIGs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9GUkVRVUVOQ0lFUzp7CisJCQlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxID0gci0+cHRyOworCQkJaW50IGksIHQ7CisJCQlwcmludGsoIm5yIDogJXVcbiIsIGZyZXEtPm5yKTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIm1oelsldV09JXVcbiIsIGksIGZyZXEtPm1oeltpXSk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUU6eworCQkJc3RydWN0IG9ial9tbG1lICptbG1lID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPTB4JVhcbnN0YXRlPTB4JVhcbmNvZGU9MHglWFxuIiwKKwkJCQkJbWxtZS0+aWQsIG1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0weCVYXG5zdGF0ZT0weCVYXG4iCisJCQkJCSJjb2RlPTB4JVhcbnNpemU9MHglWFxuIiwgbWxtZS0+aWQsCisJCQkJCW1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlLCBtbG1lLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0lZFxuc2l6ZT0lZFxuIiwKKwkJCQkJYXR0YWNoLT5pZCwKKwkJCQkJYXR0YWNoLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1NTSUQ6eworCQkJc3RydWN0IG9ial9zc2lkICpzc2lkID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImxlbmd0aD0ldVxub2N0ZXRzPSUuKnNcbiIsCisJCQkJCXNzaWQtPmxlbmd0aCwgc3NpZC0+bGVuZ3RoLAorCQkJCQlzc2lkLT5vY3RldHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfS0VZOnsKKwkJCXN0cnVjdCBvYmpfa2V5ICprZXkgPSByLT5wdHI7CisJCQlpbnQgdCwgaTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJICAgICAidHlwZT0weCVYXG5sZW5ndGg9MHglWFxua2V5PTB4IiwKKwkJCQkgICAgIGtleS0+dHlwZSwga2V5LT5sZW5ndGgpOworCQkJZm9yIChpID0gMDsgaSA8IGtleS0+bGVuZ3RoOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIiUwMlg6Iiwga2V5LT5rZXlbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwljYXNlIE9JRF9UWVBFX0FERFI6eworCQkJdW5zaWduZWQgY2hhciAqYnVmZiA9IHItPnB0cjsKKwkJCWludCB0LCBpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgImhleCBkYXRhPSIpOworCQkJZm9yIChpID0gMDsgaSA8IGlzbF9vaWRbbl0uc2l6ZTsgaSsrKQorCQkJCXQgKz0gc25wcmludGYoc3RyICsgdCwgUFJJVl9TVFJfU0laRSAtIHQsCisJCQkJCSAgICAgICIlMDJYOiIsIGJ1ZmZbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzhhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMyBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWYgIWRlZmluZWQoX09JRF9NR1RfSCkKKyNkZWZpbmUgX09JRF9NR1RfSAorCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKworZXh0ZXJuIHN0cnVjdCBvaWRfdCBpc2xfb2lkW107CisKK2ludCBtZ3RfaW5pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKwordm9pZCBtZ3RfY2xlYW4oaXNscGNpX3ByaXZhdGUgKik7CisKKy8qIEkgZG9uJ3Qga25vdyB3aGVyZSB0byBwdXQgdGhlc2UgMiAqLworZXh0ZXJuIGNvbnN0IGludCBmcmVxdWVuY3lfbGlzdF9hW107CitpbnQgY2hhbm5lbF9vZl9mcmVxKGludCk7CisKK3ZvaWQgbWd0X2xlX3RvX2NwdShpbnQsIHZvaWQgKik7CisKK2ludCBtZ3Rfc2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqKTsKK2ludCBtZ3Rfc2V0X3Zhcmxlbihpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqLCBpbnQpOworCisKK2ludCBtZ3RfZ2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqLAorCQkgICAgdW5pb24gb2lkX3Jlc190ICopOworCitpbnQgbWd0X2NvbW1pdF9saXN0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90ICosIGludCk7CisKK3ZvaWQgbWd0X3NldChpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqKTsKKwordm9pZCBtZ3RfZ2V0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICopOworCitpbnQgbWd0X2NvbW1pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKworaW50IG1ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqKTsKKworZW51bSBvaWRfbnVtX3QgbWd0X29pZHRvbnVtKHUzMiBvaWQpOworCitpbnQgbWd0X3Jlc3BvbnNlX3RvX3N0cihlbnVtIG9pZF9udW1fdCwgdW5pb24gb2lkX3Jlc190ICosIGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiAhZGVmaW5lZChfT0lEX01HVF9IKSAqLworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaApAQCAtMCwwICsxLDQ0IEBACisvKiAgCisgKiAgKEMpIDIwMDQgTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworLyogIAorICoJQ29tcGF0aWJpbGl0eSBoZWFkZXIgZmlsZSB0byBhaWQgc3VwcG9ydCBvZiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zCisgKi8KKworI2lmZGVmIFBSSVNNNTRfQ09NUEFUMjQKKyNpbmNsdWRlICJwcmlzbWNvbXBhdDI0LmgiCisjZWxzZQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCisKKyNpZm5kZWYgX1BSSVNNX0NPTVBBVF9ICisjZGVmaW5lIF9QUklTTV9DT01QQVRfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpZm5kZWYgX19pb21lbQorI2RlZmluZSBfX2lvbWVtCisjZW5kaWYKKworI2RlZmluZSBQUklTTV9GV19QREVWCQkmcHJpdi0+cGRldi0+ZGV2CisKKyNlbmRpZgkJCQkvKiBfUFJJU01fQ09NUEFUX0ggKi8KKyNlbmRpZgkJCQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWJkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMCwwICsxLDI5NTcgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBICBQQ01DSUEgY2xpZW50IGRyaXZlciBmb3IgdGhlIFJheWxpbmsgd2lyZWxlc3MgTEFOIGNhcmQuCisgKiBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgbW9kdWxlIHdhcyB0aGUgc2tlbGV0b24uYyBpbiB0aGUKKyAqIFBDTUNJQSAyLjkuMTIgcGFja2FnZSB3cml0dGVuIGJ5IERhdmlkIEhpbmRzLCBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggIENvcmV5IFRob21hcyAoY29yZXlAd29ybGQuc3RkLmNvbSkKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9ubHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIENoYW5nZXM6CisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAwOC8wOC8yMDAwCisgKiAtIHJlb3JnYW5pemUga21hbGxvY3MgaW4gcmF5X2F0dGFjaCwgY2hlY2tpbmcgYWxsIGZvciBmYWlsdXJlCisgKiAgIGFuZCByZWxlYXNpbmcgdGhlIHByZXZpb3VzIGFsbG9jYXRpb25zIGlmIG9uZSBmYWlscworICoKKyAqIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+IC0gMDcvMTAvMjAwMworICogLSBBdWRpdCBjb3B5X3RvX3VzZXIgaW4gaW9jdGwoU0lPQ0dJV0VTU0lEKQorICogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFdhcm5pbmcgOiB0aGVzZSBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLi4uICovCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogRW5hYmxlIHNweWluZyBhZGRyZXNzZXMgKi8KKy8qIERlZmluaXRpb25zIHdlIG5lZWQgZm9yIHNweSAqLwordHlwZWRlZiBzdHJ1Y3QgaXdfc3RhdGlzdGljcwlpd19zdGF0czsKK3R5cGVkZWYgc3RydWN0IGl3X3F1YWxpdHkJaXdfcXVhbDsKK3R5cGVkZWYgdV9jaGFyCW1hY19hZGRyW0VUSF9BTEVOXTsJLyogSGFyZHdhcmUgYWRkcmVzcyAqLworCisjaW5jbHVkZSAicmF5Y3RsLmgiCisjaW5jbHVkZSAicmF5X2NzLmgiCisKKy8qIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisKKyNpZmRlZiBSQVlMSU5LX0RFQlVHCisjZGVmaW5lIFBDTUNJQV9ERUJVRyBSQVlMSU5LX0RFQlVHCisjZW5kaWYKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcmF5X2RlYnVnOworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKy8qICNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7ICovCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhhcmdzKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKy8qKiBQcm90b3R5cGVzIGJhc2VkIG9uIFBDTUNJQSBza2VsZXRvbiBkcml2ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJheV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCByYXlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgcmF5X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgcmF5X2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKiogUHJvdG90eXBlcyBpbmRpY2F0ZWQgYnkgZGV2aWNlIHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmF5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmF5X2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByYXlfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbnQgcmF5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJheV91cGRhdGVfbXVsdGlfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWxsKTsKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSk7CitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCitzdGF0aWMgaXdfc3RhdHMgKiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKy8qKioqKiBQcm90b3R5cGVzIGZvciByYXlsaW5rIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYXNjX3RvX2ludChjaGFyIGEpOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKTsKK3N0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZV90aW1lb3V0KHVfbG9uZyk7CitzdGF0aWMgaW50IGdldF9mcmVlX2NjcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcihjaGFyICppbl9zdHIsIFVDSEFSICpvdXQpOworc3RhdGljIGludCByYXlfaHdfeG1pdCh1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgbGVuLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBVQ0hBUiB0eXBlKTsKK3N0YXRpYyBpbnQgcmF5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGludGVycnVwdF9lY2YocmF5X2Rldl90ICpsb2NhbCwgaW50IGNjcyk7CitzdGF0aWMgdm9pZCByYXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX3Bhcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgVUNIQVIgb2JqaWQsIFVDSEFSICp2YWx1ZSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCB2ZXJpZnlfZGxfc3RhcnR1cCh1X2xvbmcpOworCisvKiBQcm90b3R5cGVzIGZvciBpbnRlcnJwdCB0aW1lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90IHJheV9pbnRlcnJ1cHQgKGludCByZWcsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgY2xlYXJfaW50ZXJydXB0KHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgcnhfZGVhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBrdF9hZGRyLCBpbnQgcnhfbGVuKTsKK3N0YXRpYyBpbnQgY29weV9mcm9tX3J4X2J1ZmYocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBwa3RfYWRkciwgaW50IGxlbik7CitzdGF0aWMgdm9pZCByYXlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZnJhZ19jaGFpbihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MpOworc3RhdGljIHZvaWQgcnhfYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwa3RfYWRkciwgaW50IHJ4X2xlbik7CitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKTsKK3N0YXRpYyB2b2lkIGFzc29jaWF0ZShyYXlfZGV2X3QgKmxvY2FsKTsKKworLyogQ2FyZCBjb21tYW5kIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbF9zdGFydHVwX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBsb2NhbCk7CitzdGF0aWMgdm9pZCBzdGFydF9uZXQodV9sb25nIGxvY2FsKTsKKy8qIHZvaWQgc3RhcnRfbmV0KHJheV9kZXZfdCAqbG9jYWwpOyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIEFESE9DPTAsIEluZnJhc3RydWN0dXJlPTEgKi8KK3N0YXRpYyBpbnQgbmV0X3R5cGUgPSBBREhPQzsKKworLyogSG9wIGR3ZWxsIHRpbWUgaW4gS3VzICgxMDI0IHVzIHVuaXRzIGRlZmluZWQgYnkgODAyLjExKSAqLworc3RhdGljIGludCBob3BfZHdlbGwgPSAxMjg7CisKKy8qIEJlYWNvbiBwZXJpb2QgaW4gS3VzICovCitzdGF0aWMgaW50IGJlYWNvbl9wZXJpb2QgPSAyNTY7CisKKy8qIHBvd2VyIHNhdmUgbW9kZSAoMCA9IG9mZiwgMSA9IHNhdmUgcG93ZXIpICovCitzdGF0aWMgaW50IHBzbTsKKworLyogU3RyaW5nIGZvciBuZXR3b3JrJ3MgRXh0ZW5kZWQgU2VydmljZSBTZXQgSUQuIDMyIENoYXJhY3RlcnMgbWF4ICovCitzdGF0aWMgY2hhciAqZXNzaWQ7CisKKy8qIERlZmF1bHQgdG8gZW5jYXBzdWxhdGlvbiB1bmxlc3MgdHJhbnNsYXRpb24gcmVxdWVzdGVkICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZSA9IDE7CisKK3N0YXRpYyBpbnQgY291bnRyeSA9IFVTQTsKKworc3RhdGljIGludCBzbmlmZmVyOworCitzdGF0aWMgaW50IGJjOworCisvKiA0OCBiaXQgcGh5c2ljYWwgY2FyZCBhZGRyZXNzIGlmIG92ZXJyaWRpbmcgY2FyZCdzIHJlYWwgcGh5c2ljYWwKKyAqIGFkZHJlc3MgaXMgcmVxdWlyZWQuICBTaW5jZSBJRUVFIDgwMi4xMSBhZGRyZXNzZXMgYXJlIDQ4IGJpdHMKKyAqIGxpa2UgZXRoZXJuZXQsIGFuIGludCBjYW4ndCBiZSB1c2VkLCBzbyBhIHN0cmluZyBpcyB1c2VkLiBUbworICogYWxsb3cgdXNlIG9mIGFkZHJlc3NlcyBzdGFydGluZyB3aXRoIGEgZGVjaW1hbCBkaWdpdCwgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlciBhbmQgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIGxldHRlciBpcworICogZm9sbG93ZWQgYnkgdXAgdG8gMTIgaGV4IGRpZ2l0cyB3aGljaCBhcmUgdGhlIGFkZHJlc3MuICBJZiBsZXNzCisgKiB0aGFuIDEyIGRpZ2l0cyBhcmUgdXNlZCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBsZWZ0IGZpbGxlZCB3aXRoIDAncy4KKyAqIE5vdGUgdGhhdCBiaXQgMCBvZiB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnJvYWRjYXN0IGJpdCwgYW5kIGV2aWwKKyAqIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBpdCBpcyBub3QgMCBpbiBhIGNhcmQgYWRkcmVzcy4KKyAqLworc3RhdGljIGNoYXIgKnBoeV9hZGRyID0gTlVMTDsKKworCisvKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICAgZGF0YWJhc2UuCisqLworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicmF5X2NzIjsKKworLyogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgcmF5IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyogQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisqLworc3RhdGljIHVuc2lnbmVkIGludCByYXlfbWVtX3NwZWVkID0gNTAwOworCitNT0RVTEVfQVVUSE9SKCJDb3JleSBUaG9tYXMgPGNvcmV5QHdvcmxkLnN0ZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJheWxpbmsvV2ViR2VhciB3aXJlbGVzcyBMQU4gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShuZXRfdHlwZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShob3BfZHdlbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmVhY29uX3BlcmlvZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwc20sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZXNzaWQsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbSh0cmFuc2xhdGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY291bnRyeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbmlmZmVyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJjLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHBoeV9hZGRyLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0ocmF5X21lbV9zcGVlZCwgaW50LCAwKTsKKworc3RhdGljIFVDSEFSIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtc1tdID0geworICAgIDAsICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRob2Mgc3RhdGlvbiAqLworICAgJ0wnLCdJJywnTicsJ1UnLCdYJywgMCwgIDAsICAwLCAgLyogMzIgY2hhciBFU1NJRCAqLworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0aXZlIHNjYW4sIENBIE1vZGUgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgICAgICAgIC8qIE5vIGRlZmF1bHQgTUFDIGFkZHIgICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBGcmFnIHRocmVzaG9sZCAqLworICAgIDB4MDAsIDB4ODAsICAgICAgICAgICAgICAgICAgICAgLyogSG9wIHRpbWUgMTI4IEt1cyovCisgICAgMHgwMSwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kIDI1NiBLdXMgKi8KKyAgICAweDAxLCAweDA3LCAweGEzLCAgICAgICAgICAgICAgIC8qIERUSU0sIHJldHJpZXMsIGFjayB0aW1lb3V0Ki8KKyAgICAweDFkLCAweDgyLCAweDRlLCAgICAgICAgICAgICAgIC8qIFNJRlMsIERJRlMsIFBJRlMgKi8KKyAgICAweDdmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICAweDA0LCAweGUyLCAweDM4LCAweEE0LCAgICAgICAgIC8qIHNjYW5fZHdlbGwsIG1heF9zY2FuX2R3ZWxsICovCisgICAgMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NvYyByZXNwIHRpbWVvdXQgdGhyZXNoICovCisgICAgMHgwOCwgMHgwMiwgMHgwOCwgICAgICAgICAgICAgICAvKiBhZGhvYywgaW5mcmEsIHN1cGVyIGN5Y2xlIG1heCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9taXNjdW91cyBtb2RlICovCisgICAgMHgwYywgMHgwYmQsICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgd29yZCAqLworICAgIDB4MzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdCB0aW1lICovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGYsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4MDAsIDB4M2YsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4ICovCisgICAgMHgwMCwgMHgwZiwgICAgICAgICAgICAgICAgICAgICAvKiBDVyBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb3cgYnJvYWRjYXN0IFNTSUQgcHJvYmUgcmVzcCAqLworICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpdmFjeSBtdXN0IHN0YXJ0LCBjYW4gam9pbiAqLworICAgIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgLyogYmFzaWMgcmF0ZSBzZXQgKi8KK307CisKK3N0YXRpYyBVQ0hBUiBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXNbXSA9IHsKKyAgICAwLCAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkaG9jIHN0YXRpb24gKi8KKyAgICdMJywnSScsJ04nLCdVJywnWCcsIDAsICAwLCAgMCwgIC8qIDMyIGNoYXIgRVNTSUQgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdGl2ZSBzY2FuLCBDQSBNb2RlICovCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgICAgICAgICAvKiBObyBkZWZhdWx0IE1BQyBhZGRyICAqLworICAgIDB4N2YsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogRnJhZyB0aHJlc2hvbGQgKi8KKyAgICAweDAyLCAweDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIEhvcCB0aW1lICovCisgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kICovCisgICAgMHgwMSwgMHgwNywgMHhhMywgICAgICAgICAgICAgICAvKiBEVElNLCByZXRyaWVzLCBhY2sgdGltZW91dCovCisgICAgMHgxZCwgMHg4MiwgMHhjZSwgICAgICAgICAgICAgICAvKiBTSUZTLCBESUZTLCBQSUZTICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBSVFMgdGhyZXNob2xkICovCisgICAgMHhmYiwgMHgxZSwgMHhjNywgMHg1YywgICAgICAgICAvKiBzY2FuX2R3ZWxsLCBtYXhfc2Nhbl9kd2VsbCAqLworICAgIDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXNzb2MgcmVzcCB0aW1lb3V0IHRocmVzaCAqLworICAgIDB4MDQsIDB4MDIsIDB4NCwgICAgICAgICAgICAgICAgLyogYWRob2MsIGluZnJhLCBzdXBlciBjeWNsZSBtYXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvbWlzY3VvdXMgbW9kZSAqLworICAgIDB4MGMsIDB4MGJkLCAgICAgICAgICAgICAgICAgICAgLyogVW5pcXVlIHdvcmQgKi8KKyAgICAweDRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNsb3QgdGltZSAoVEJEIHNlZW1zIHdyb25nKSovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGUsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4M2YsIDB4MGYsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4LCBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCovCit9OworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZXRoMl9sbGNbXSA9IHsweGFhLCAweGFhLCAzLCAwLCAwLCAwfTsKKworc3RhdGljIGNoYXIgaG9wX3BhdHRlcm5fbGVuZ3RoW10gPSB7IDEsCisJICAgICBVU0FfSE9QX01PRCwgICAgICAgICAgICAgRVVST1BFX0hPUF9NT0QsCisJICAgICBKQVBBTl9IT1BfTU9ELCAgICAgICAgICAgS09SRUFfSE9QX01PRCwKKwkgICAgIFNQQUlOX0hPUF9NT0QsICAgICAgICAgICBGUkFOQ0VfSE9QX01PRCwKKwkgICAgIElTUkFFTF9IT1BfTU9ELCAgICAgICAgICBBVVNUUkFMSUFfSE9QX01PRCwKKwkgICAgIEpBUEFOX1RFU1RfSE9QX01PRAorfTsKKworc3RhdGljIGNoYXIgcmNzaWRbXSA9ICJSYXlsaW5rL1dlYkdlYXIgd2lyZWxlc3MgTEFOIC0gQ29yZXkgPFRob21hcyBjb3JleUB3b3JsZC5zdGQuY29tPiI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisgICAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAgICBjYXJkIGluc2VydGlvbiBldmVudC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpCit7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIGludCByZXQ7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgICAgbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisKKyAgICBpZiAoIWxpbmspCisJICAgIHJldHVybiBOVUxMOworCisgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YocmF5X2Rldl90KSk7CisKKyAgICBpZiAoIWRldikKKwkgICAgZ290byBmYWlsX2FsbG9jX2RldjsKKworICAgIGxvY2FsID0gZGV2LT5wcml2OworCisgICAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nLiBOb25lIHVzZWQgaGVyZSAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDA7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAuIEZvciBQQ01DSUEsIGRyaXZlciB0YWtlcyB3aGF0J3MgZ2l2ZW4gKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmcmF5X2ludGVycnVwdDsKKworICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxpbmstPnByaXYgPSBkZXY7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIAorICAgIGxvY2FsLT5maW5kZXIgPSBsaW5rOworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfSU5TRVJURUQ7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIGxvY2FsLT5udW1fbXVsdGkgPSAwOworICAgIERFQlVHKDIsInJheV9hdHRhY2ggbGluayA9ICVwLCAgZGV2ID0gJXAsICBsb2NhbCA9ICVwLCBpbnRyID0gJXBcbiIsCisgICAgICAgICAgbGluayxkZXYsbG9jYWwsJnJheV9pbnRlcnJ1cHQpOworCisgICAgLyogUmF5bGluayBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcmF5X2Rldl9zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZyYXlfZGV2X2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyAgPSAmcmF5X2dldF9zdGF0czsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnJheV9kZXZfaW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisjaWYgV0lSRUxFU1NfRVhUID4gNwkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworICAgIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcmF5X2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgREVCVUcoMiwicmF5X2NzIHJheV9hdHRhY2ggY2FsbGluZyBldGhlcl9zZXR1cC4pXG4iKTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5pbml0ID0gJnJheV9kZXZfaW5pdDsKKyAgICBkZXYtPm9wZW4gPSAmcmF5X29wZW47CisgICAgZGV2LT5zdG9wID0gJnJheV9kZXZfY2xvc2U7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKyAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZyYXlfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoLi4uKVxuIik7CisKKyAgICBpbml0X3RpbWVyKCZsb2NhbC0+dGltZXIpOworCisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50aygicmF5X2NzIHJheV9hdHRhY2ggUmVnaXN0ZXJDbGllbnQgdW5oYXBweSAtIGRldGFjaGluZ1xuIik7CisgICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICAgIHJheV9kZXRhY2gobGluayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBlbmRpbmdcbiIpOworICAgIHJldHVybiBsaW5rOworCitmYWlsX2FsbG9jX2RldjoKKyAgICBrZnJlZShsaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKK30gLyogcmF5X2F0dGFjaCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMSwgInJheV9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKyAgICAgICAgaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICAgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisgICAgICB0aGUgcmVsZWFzZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhhdCB3aWxsIHRyaWdnZXIgYSBwcm9wZXIKKyAgICAgIGRldGFjaCgpLgorICAgICovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgcmF5X3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorICAgICAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGlmIChsaW5rLT5wcml2KSB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWlmIChsaW5rLT5kZXYpIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgfQorICAgIGtmcmVlKGxpbmspOworICAgIERFQlVHKDIsInJheV9jcyByYXlfZGV0YWNoIGVuZGluZ1xuIik7Cit9IC8qIHJheV9kZXRhY2ggKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfY29uZmlnKCkgaXMgcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1BWF9UVVBMRV9TSVpFIDEyOAorc3RhdGljIHZvaWQgcmF5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBsYXN0X2ZuID0gMCwgbGFzdF9yZXQgPSAwOworICAgIGludCBpOworICAgIHVfY2hhciBidWZbTUFYX1RVUExFX1NJWkVdOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsaW5rLT5wcml2OworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisgICAgREVCVUcoMSwgInJheV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uIHJlZ3MgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gTUFYX1RVUExFX1NJWkU7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBEZXRlcm1pbmUgY2FyZCB0eXBlIGFuZCBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgYnVmWzBdID0gYnVmW01BWF9UVVBMRV9TSVpFIC0gMV0gPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBNQVhfVFVQTEVfU0laRTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDI7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKworICAgIGZvciAoaT0wOyBpPHR1cGxlLlR1cGxlRGF0YUxlbiAtIDQ7IGkrKykgCisgICAgICAgIGlmIChidWZbaV0gPT0gMCkgYnVmW2ldID0gJyAnOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBEZXRlY3RlZDogJXNcbiIsYnVmKTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICovCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIAorICAgIC8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKy8qKiogU2V0IHVwIDMyayB3aW5kb3cgZm9yIHNoYXJlZCBtZW1vcnkgKHRyYW5zbWl0IGFuZCBjb250cm9sKSAqKioqKioqKioqKiovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84IHwgV0lOX01FTU9SWV9UWVBFX0NNIHwgV0lOX0VOQUJMRSB8IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSAweDgwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gcmF5X21lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgwMDAwOyBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKyAgICBsb2NhbC0+c3JhbSA9IGlvcmVtYXAocmVxLkJhc2UscmVxLlNpemUpOworCisvKioqIFNldCB1cCAxNmsgd2luZG93IGZvciBzaGFyZWQgbWVtb3J5IChyZWNlaXZlIGJ1ZmZlcikgKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9DTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHg0MDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+cm1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4ODAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPnJtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPnJtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworLyoqKiBTZXQgdXAgd2luZG93IGZvciBhdHRyaWJ1dGUgbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9BTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHgxMDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+YW1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4MDAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPmFtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPmFtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworICAgIERFQlVHKDMsInJheV9jb25maWcgc3JhbT0lcFxuIixsb2NhbC0+c3JhbSk7CisgICAgREVCVUcoMywicmF5X2NvbmZpZyBybWVtPSVwXG4iLGxvY2FsLT5ybWVtKTsKKyAgICBERUJVRygzLCJyYXlfY29uZmlnIGFtZW09JXBcbiIsbG9jYWwtPmFtZW0pOworICAgIGlmIChyYXlfaW5pdChkZXYpIDwgMCkgeworICAgICAgICByYXlfcmVsZWFzZShsaW5rKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcHJpbnRrKCJyYXlfY29uZmlnIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyY3B5KGxvY2FsLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIGxpbmstPmRldiA9ICZsb2NhbC0+bm9kZTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJheUxpbmssIGlycSAlZCwgaHdfYWRkciAiLAorICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworICAgIHJheV9yZWxlYXNlKGxpbmspOworfSAvKiByYXlfY29uZmlnICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjcyBfX2lvbWVtICpjY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5zcmFtICsgQ0NTX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJjcyBfX2lvbWVtICpyY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgbG9va3Mgbm9uc2Vuc2ljYWwsIHNpbmNlIHRoZXJlIGlzIGEgc2VwYXJhdGUKKwkgKiBSQ1NfQkFTRS4gQnV0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAic3RydWN0IHJjcyIKKwkgKiBhbmQgYSAic3RydWN0IGNjcyIgZW5kcyB1cCBiZWluZyBpbiB0aGUgX2luZGV4XyBvZmYKKwkgKiB0aGUgYmFzZSwgc28gdGhlIGJhc2UgcG9pbnRlciBpcyB0aGUgc2FtZSBmb3IgYm90aAorCSAqIGNjcy9yY3MuCisJICovCisJcmV0dXJuIGRldi0+c3JhbSArIENDU19CQVNFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGk7CisgICAgVUNIQVIgKnA7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIERFQlVHKDEsICJyYXlfaW5pdCgweCVwKVxuIiwgZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygwLCJyYXlfaW5pdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+bmV0X3R5cGUgPSBuZXRfdHlwZTsKKyAgICBsb2NhbC0+c3RhX3R5cGUgPSBUWVBFX1NUQTsKKworICAgIC8qIENvcHkgdGhlIHN0YXJ0dXAgcmVzdWx0cyB0byBsb2NhbCBtZW1vcnkgKi8KKyAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+c3RhcnR1cF9yZXMsIGxvY2FsLT5zcmFtICsgRUNGX1RPX0hPU1RfQkFTRSxcCisgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhcnR1cF9yZXNfNikpOworCisgICAgLyogQ2hlY2sgUG93ZXIgdXAgdGVzdCBzdGF0dXMgYW5kIGdldCBtYWMgYWRkcmVzcyBmcm9tIGNhcmQgKi8KKyAgICBpZiAobG9jYWwtPnN0YXJ0dXBfcmVzLnN0YXJ0dXBfd29yZCAhPSAweDgwKSB7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2luaXQgRVJST1IgY2FyZCBzdGF0dXMgPSAlMnhcbiIsCisgICAgICAgICAgIGxvY2FsLT5zdGFydHVwX3Jlcy5zdGFydHVwX3dvcmQpOworICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0lOSVRfRVJST1I7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+ZndfdmVyID0gbG9jYWwtPnN0YXJ0dXBfcmVzLmZpcm13YXJlX3ZlcnNpb25bMF07CisgICAgbG9jYWwtPmZ3X2JsZCA9IGxvY2FsLT5zdGFydHVwX3Jlcy5maXJtd2FyZV92ZXJzaW9uWzFdOworICAgIGxvY2FsLT5md192YXIgPSBsb2NhbC0+c3RhcnR1cF9yZXMuZmlybXdhcmVfdmVyc2lvblsyXTsKKyAgICBERUJVRygxLCJyYXlfaW5pdCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkIFxuIixsb2NhbC0+ZndfdmVyLCBsb2NhbC0+ZndfYmxkKTsKKworICAgIGxvY2FsLT50aWJfbGVuZ3RoID0gMHgyMDsKKyAgICBpZiAoKGxvY2FsLT5md192ZXIgPT0gNSkgJiYgKGxvY2FsLT5md19ibGQgPj0gMzApKQorICAgICAgICBsb2NhbC0+dGliX2xlbmd0aCA9IGxvY2FsLT5zdGFydHVwX3Jlcy50aWJfbGVuZ3RoOworICAgIERFQlVHKDIsInJheV9pbml0IHRpYl9sZW5ndGggPSAweCUwMnhcbiIsIGxvY2FsLT50aWJfbGVuZ3RoKTsKKyAgICAvKiBJbml0aWFsaXplIENDUydzIHRvIGJ1ZmZlciBmcmVlIHN0YXRlICovCisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKTsKKyAgICBmb3IgKGk9MDsgIGk8TlVNQkVSX09GX0NDUzsgIGkrKykgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBpbml0X3N0YXJ0dXBfcGFyYW1zKGxvY2FsKTsKKworICAgIC8qIGNvcHkgbWFjIGFkZHJlc3MgdG8gc3RhcnR1cCBwYXJhbWV0ZXJzICovCisgICAgaWYgKHBhcnNlX2FkZHIocGh5X2FkZHIsIGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHAgPSBsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtY3B5KCZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwKKyAgICAgICAgICAgICAgICZsb2NhbC0+c3RhcnR1cF9yZXMuc3RhdGlvbl9hZGRyLCBBRERSTEVOKTsKKyAgICAgICAgcCA9IGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyOworICAgIH0KKworICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7IC8qIENsZWFyIGFueSBpbnRlcnJ1cHQgZnJvbSB0aGUgY2FyZCAqLworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVdBSVRJTkdfUEFSQU07CisgICAgREVCVUcoMiwicmF5X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2luaXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyB0byB0aGUgY2FyZCBhbmQgY29tbWFuZCBpdCB0byByZWFkIHRoZW0gICAgICAgKi8KK3N0YXRpYyBpbnQgZGxfc3RhcnR1cF9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwiZGxfc3RhcnR1cF9wYXJhbXMgZW50ZXJlZFxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGRsX3N0YXJ0dXBfcGFyYW1zIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICAvKiBDb3B5IHBhcmFtZXRlcnMgdG8gaG9zdCB0byBFQ0YgYXJlYSAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpIAorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjQsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zKSk7CisgICAgZWxzZQorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjUsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAKKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuIC0xOworICAgIGxvY2FsLT5kbF9wYXJhbV9jY3MgPSBjY3NpbmRleDsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgd3JpdGViKENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUywgJnBjY3MtPmNtZCk7CisgICAgREVCVUcoMiwiZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnQgY2NzaW5kZXggPSAlZFxuIiwgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXkgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAiRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ETF9QQVJBTTsKKyAgICAvKiBTdGFydCBrZXJuZWwgdGltZXIgdG8gd2FpdCBmb3IgZGwgc3RhcnR1cCB0byBjb21wbGV0ZS4gKi8KKyAgICBsb2NhbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yOworICAgIGxvY2FsLT50aW1lci5kYXRhID0gKGxvbmcpbG9jYWw7CisgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJnZlcmlmeV9kbF9zdGFydHVwOworICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICBERUJVRygyLCJyYXlfY3MgZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnRlZCB0aW1lciBmb3IgdmVyaWZ5X2RsX3N0YXJ0dXBcbiIpOworICAgIHJldHVybiAwOworfSAvKiBkbF9zdGFydHVwX3BhcmFtcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIGludCBpOyAKKworICAgIGlmIChjb3VudHJ5ID4gSkFQQU5fVEVTVCkgY291bnRyeSA9IFVTQTsKKyAgICBlbHNlCisgICAgICAgIGlmIChjb3VudHJ5IDwgVVNBKSBjb3VudHJ5ID0gVVNBOworICAgIC8qIHN0cnVjdHVyZSBmb3IgaG9wIHRpbWUgYW5kIGJlYWNvbiBwZXJpb2QgaXMgZGVmaW5lZCBoZXJlIHVzaW5nIAorICAgICAqIE5ldyA4MDIuMTFENi4xIGZvcm1hdC4gIENhcmQgZmlybXdhcmUgaXMgc3RpbGwgdXNpbmcgb2xkIGZvcm1hdAorICAgICAqIHVudGlsIHZlcnNpb24gNi4KKyAgICAgKiAgICBCZWZvcmUgICAgICAgICAgICAgICAgICAgIEFmdGVyCisgICAgICogICAgYV9ob3BfdGltZSBtcyBieXRlICAgICAgICBhX2hvcF90aW1lIG1zIGJ5dGUKKyAgICAgKiAgICBhX2hvcF90aW1lIDJzIGJ5dGUgICAgICAgIGFfaG9wX3RpbWUgbHMgYnl0ZQorICAgICAqICAgIGFfaG9wX3RpbWUgbHMgYnl0ZSAgICAgICAgYV9iZWFjb25fcGVyaW9kIG1zIGJ5dGUKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgICAgICAgICAgIGFfYmVhY29uX3BlcmlvZCBscyBieXRlCisgICAgICoKKyAgICAgKiAgICBhX2hvcF90aW1lID0gdVMgICAgICAgICAgIGFfaG9wX3RpbWUgPSBLdVMKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgPSBob3BzICAgIGFfYmVhY29uX3BlcmlvZCA9IEt1UworICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjRtcyA9IDAxMDAwMCAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpICB7CisgICAgICAgIG1lbWNweSgoVUNIQVIgKikmbG9jYWwtPnNwYXJtLmI0LCBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXMsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcykpOworICAgICAgICAvKiBUcmFuc2xhdGUgc2FuZSBrdXMgaW5wdXQgdmFsdWVzIHRvIG9sZCBidWlsZCA0LzUgZm9ybWF0ICovCisgICAgICAgIC8qIGkgPSBob3AgdGltZSBpbiB1UyB0cnVuY2F0ZWQgdG8gMyBieXRlcyAqLworICAgICAgICBpID0gKGhvcF9kd2VsbCAqIDEwMjQpICYgMHhmZmZmZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF90aW1lWzBdID0gKGkgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfaG9wX3RpbWVbMV0gPSAoaSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2JlYWNvbl9wZXJpb2RbMF0gPSAwOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9iZWFjb25fcGVyaW9kWzFdID0KKyAgICAgICAgICAgICgoYmVhY29uX3BlcmlvZC9ob3BfZHdlbGwpIC0gMSkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV0gLSAxOworICAgICAgICBpZiAoYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2Fja190aW1lb3V0ID0gMHg1MDsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX3NpZnMgPSAweDNmOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAvKiBWZXJzaW9uIDUgdXNlcyByZWFsIGt1cyB2YWx1ZXMgKi8KKyAgICAgICAgbWVtY3B5KChVQ0hBUiAqKSZsb2NhbC0+c3Bhcm0uYjUsIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtcywgCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMF0gPSAoaG9wX2R3ZWxsID4+IDgpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMV0gPSBob3BfZHdlbGwgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzBdID0gKGJlYWNvbl9wZXJpb2QgPj4gOCkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzFdID0gYmVhY29uX3BlcmlvZCAmIDB4ZmY7CisgICAgICAgIGlmIChwc20pCisgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9wb3dlcl9tZ3Rfc3RhdGUgPSAxOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07CisgICAgfQorICAgIAorICAgIGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9IG5ldF90eXBlICYgMHgwMTsKKyAgICBsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzID0gVFlQRV9TVEE7CisKKyAgICBpZiAoZXNzaWQgIT0gTlVMTCkKKyAgICAgICAgc3RybmNweShsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCwgZXNzaWQsIEVTU0lEX1NJWkUpOworfSAvKiBpbml0X3N0YXJ0dXBfcGFyYW1zICovIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgdmVyaWZ5X2RsX3N0YXJ0dXAodV9sb25nIGRhdGEpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkYXRhOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGxvY2FsLT5kbF9wYXJhbV9jY3M7CisgICAgVUNIQVIgc3RhdHVzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIHZlcmlmeV9kbF9zdGFydHVwIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAyKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInZlcmlmeV9kbF9zdGFydHVwIHBhcmFtZXRlcnMgc2VudCB2aWEgY2NzICVkOlxuIiwKKyAgICAgICAgICAgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgICAgIGZvciAoaT0wOyBpPHNpemVvZihzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMpOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50aygiICUyeCIsICh1bnNpZ25lZCBpbnQpIHJlYWRiKGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSArIGkpKTsKKyAgICAgICAgfQorICAgIHByaW50aygiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHJlYWRiKCZwY2NzLT5idWZmZXJfc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzIT0gQ0NTX0JVRkZFUl9GUkVFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRG93bmxvYWQgc3RhcnR1cCBwYXJhbXMgZmFpbGVkLiAgU3RhdHVzID0gJWRcbiIsCisgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9PSBBREhPQykKKyAgICAgICAgc3RhcnRfbmV0KCh1X2xvbmcpbG9jYWwpOworICAgIGVsc2UKKyAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisKKyAgICByZXR1cm47Cit9IC8qIGVuZCB2ZXJpZnlfZGxfc3RhcnR1cCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29tbWFuZCBjYXJkIHRvIHN0YXJ0IGEgbmV0d29yayAqLworc3RhdGljIHZvaWQgc3RhcnRfbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGNjc2luZGV4OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBzdGFydF9uZXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIEZpbGwgaW4gdGhlIENDUyBmaWVsZHMgZm9yIHRoZSBFQ0YgKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKSByZXR1cm47CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfU1RBUlRfTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuc3RhcnRfbmV0d29yay51cGRhdGVfcGFyYW0pOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IHN0YXJ0IG5ldCBmYWlsZWQgLSBjYXJkIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ET0lOR19BQ1E7CisgICAgcmV0dXJuOworfSAvKiBlbmQgc3RhcnRfbmV0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb21tYW5kIGNhcmQgdG8gam9pbiBhIG5ldHdvcmsgKi8KK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGpvaW5fbmV0IC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuOworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX0pPSU5fTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLnVwZGF0ZV9wYXJhbSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLm5ldF9pbml0aWF0ZWQpOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IGpvaW4gbmV0IGZhaWxlZCAtIGNhcmQgbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgcmF5X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsgCisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCisgICAgaW91bm1hcChsb2NhbC0+c3JhbSk7CisgICAgaW91bm1hcChsb2NhbC0+cm1lbSk7CisgICAgaW91bm1hcChsb2NhbC0+YW1lbSk7CisgICAgLyogRG8gYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworICAgIGkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoIGkgIT0gQ1NfU1VDQ0VTUyApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobGluay0+d2luKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5hbWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5hbWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5ybWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5ybWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUNvbmZpZ3VyYXRpb24gcmV0ID0gJXhcbiIsaSk7CisgICAgaSA9IHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUlSUSByZXQgPSAleFxuIixpKTsKKworICAgIERFQlVHKDIsInJheV9yZWxlYXNlIGVuZGluZ1xuIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAgICB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgICAgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUKKyAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCByYXlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBERUJVRygxLCAicmF5X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICAgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworICAgICAgICByYXlfY29uZmlnKGxpbmspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikKKyAgICAgICAgICAgIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKyAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworICAgICAgICAgICAgICAgIHJheV9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworICAgIERFQlVHKDIsInJheV9ldmVudCBlbmRpbmdcbiIpOworfSAvKiByYXlfZXZlbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCByYXlfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBSQVlfSU1NRURJQVRFX0lOSVQKKyAgICBpbnQgaTsKKyNlbmRpZgkvKiBSQVlfSU1NRURJQVRFX0lOSVQgKi8KKyAgICByYXlfZGV2X3QgKmxvY2FsID0gZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwicmF5X2Rldl9pbml0KGRldj0lcClcbiIsZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2lmZGVmIFJBWV9JTU1FRElBVEVfSU5JVAorICAgIC8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyAqLworICAgIGlmICggKGkgPSBkbF9zdGFydHVwX3BhcmFtcyhkZXYpKSA8IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfZGV2X2luaXQgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAicmV0dXJucyAweCV4XG4iLGkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2Vsc2UJLyogUkFZX0lNTUVESUFURV9JTklUICovCisgICAgLyogUG9zdHBvbmUgdGhlIGNhcmQgaW5pdCBzbyB0aGF0IHdlIGNhbiBzdGlsbCBjb25maWd1cmUgdGhlIGNhcmQsCisgICAgICogZm9yIGV4YW1wbGUgdXNpbmcgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMuIFRoZSBpbml0IHdpbGwgaGFwcGVuCisgICAgICogaW4gcmF5X29wZW4oKSAtIEplYW4gSUkgKi8KKyAgICBERUJVRygxLCJyYXlfZGV2X2luaXQ6IHBvc3Rwb25pbmcgY2FyZCBpbml0IHRvIHJheV9vcGVuKCkgOyBTdGF0dXMgPSAlZFxuIiwKKwkgIGxvY2FsLT5jYXJkX3N0YXR1cyk7CisjZW5kaWYJLyogUkFZX0lNTUVESUFURV9JTklUICovCisKKyAgICAvKiBjb3B5IG1hYyBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyB0byBsaW51eCBkZXZpY2UgKi8KKyAgICBtZW1jcHkoJmRldi0+ZGV2X2FkZHIsICZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwgQUREUkxFTik7CisgICAgbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CisKKyAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICAvKiBEdW1teSByb3V0aW5lIHRvIHNhdGlzZnkgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIERFQlVHKDEsInJheV9kZXZfY29uZmlnKGRldj0lcCxpZm1hcD0lcClcbiIsZGV2LG1hcCk7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9jb25maWcgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X3N0YXJ0X3htaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIERFQlVHKDMsInJheV9kZXZfc3RhcnRfeG1pdChza2I9JXAsIGRldj0lcClcbiIsc2tiLGRldik7CisgICAgaWYgKGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9PSBORUVEX1RPX0FVVEgpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cbiIpOworICAgICAgICBpZiAoIWJ1aWxkX2F1dGhfZnJhbWUgKGxvY2FsLCBsb2NhbC0+YXV0aF9pZCwgT1BFTl9BVVRIX1JFUVVFU1QpKSB7CisgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBBVVRIRU5USUNBVEVEOworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVuZ3RoIDwgRVRIX1pMRU4pCisgICAgeworICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJCXJldHVybiAwOworICAgIAlsZW5ndGggPSBFVEhfWkxFTjsKKyAgICB9CisgICAgc3dpdGNoIChyYXlfaHdfeG1pdCggc2tiLT5kYXRhLCBsZW5ndGgsIGRldiwgREFUQV9UWVBFKSkgeworICAgICAgICBjYXNlIFhNSVRfTk9fQ0NTOgorICAgICAgICBjYXNlIFhNSVRfTkVFRF9BVVRIOgorCSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBYTUlUX05PX0lOVFI6CisgICAgICAgIGNhc2UgWE1JVF9NU0dfQkFEOgorICAgICAgICBjYXNlIFhNSVRfT0s6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2Rldl9zdGFydF94bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIAorICAgICAgICAgICAgICAgIFVDSEFSIG1zZ190eXBlKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgaW50IG9mZnNldDsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBQQyBzcGFjZSAqLworICAgIHNob3J0IGludCBhZGRyOyAgICAgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBjYXJkIHNwYWNlICovCisgICAgCisgICAgREVCVUcoMywicmF5X2h3X3htaXQoZGF0YT0lcCwgbGVuPSVkLCBkZXY9JXApXG4iLGRhdGEsbGVuLGRldik7CisgICAgaWYgKGxlbiArIFRYX0hFQURFUl9MRU5HVEggPiBUWF9CVUZfU0laRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJheV9od194bWl0IHBhY2tldCB0b28gbGFyZ2U6ICVkIGJ5dGVzXG4iLGxlbik7CisgICAgICAgIHJldHVybiBYTUlUX01TR19CQUQ7CisgICAgfQorCXN3aXRjaCAoY2NzaW5kZXggPSBnZXRfZnJlZV90eF9jY3MobG9jYWwpKSB7CisJY2FzZSBFQ0NTQlVTWToKKwkJREVCVUcoMiwicmF5X2h3X3htaXQgdHhfY2NzIHRhYmxlIGJ1c3lcbiIpOworCWNhc2UgRUNDU0ZVTEw6CisgICAgICAgIERFQlVHKDIsInJheV9od194bWl0IE5vIGZyZWUgdHggY2NzXG4iKTsKKwljYXNlIEVDQVJER09ORToKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHJldHVybiBYTUlUX05PX0NDUzsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisgICAgYWRkciA9IFRYX0JVRl9CQVNFICsgKGNjc2luZGV4IDw8IDExKTsKKworICAgIGlmIChtc2dfdHlwZSA9PSBEQVRBX1RZUEUpIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICB9CisKKyAgICBwdHggPSBsb2NhbC0+c3JhbSArIGFkZHI7CisKKyAgICByYXlfYnVpbGRfaGVhZGVyKGxvY2FsLCBwdHgsIG1zZ190eXBlLCBkYXRhKTsKKyAgICBpZiAodHJhbnNsYXRlKSB7CisgICAgICAgIG9mZnNldCA9IHRyYW5zbGF0ZV9mcmFtZShsb2NhbCwgcHR4LCBkYXRhLCBsZW4pOworICAgIH0KKyAgICBlbHNlIHsgLyogRW5jYXBzdWxhdGUgZnJhbWUgKi8KKyAgICAgICAgLyogVEJEIFRJQiBsZW5ndGggd2lsbCBtb3ZlIGFkZHJlc3Mgb2YgcHR4LT52YXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhLCBsZW4pOworICAgICAgICBvZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIGZpbGwgaW4gdGhlIENDUyAqLworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICBsZW4gKz0gVFhfSEVBREVSX0xFTkdUSCArIG9mZnNldDsKKyAgICB3cml0ZWIoQ0NTX1RYX1JFUVVFU1QsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihhZGRyID4+IDgsICZwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0clswXSk7CisgICAgd3JpdGViKGxvY2FsLT50aWJfbGVuZ3RoLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9wdHJbMV0pOworICAgIHdyaXRlYihsZW4gPj4gOCwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzBdKTsKKyAgICB3cml0ZWIobGVuICYgMHhmZiwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzFdKTsKKy8qIFRCRCBzdGlsbCBuZWVkIHBzbV9jYW0/ICovCisgICAgd3JpdGViKFBTTV9DQU0sICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworICAgIHdyaXRlYihsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X3JhdGUpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QuYW50ZW5uYSk7CisgICAgREVCVUcoMywicmF5X2h3X3htaXQgZGVmYXVsdF90eF9yYXRlID0gMHgleFxuIixcCisgICAgICAgICAgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygyLCJyYXlfaHdfeG1pdCBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKy8qIFRCRCB2ZXJ5IGluZWZmaWNpZW50IHRvIGNvcHkgcGFja2V0IHRvIGJ1ZmZlciwgYW5kIHRoZW4gbm90CisgICBzZW5kIGl0LCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIHF1ZXVlIHRoZSBtZXNzYWdlcyBhbmQgdGhhdAorICAgd29uJ3QgYmUgZG9uZSBmb3IgYSB3aGlsZS4gIE1heWJlIHNldCB0YnVzeSB1bnRpbCBhIENDUyBpcyBmcmVlPworKi8KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gWE1JVF9OT19JTlRSOworICAgIH0KKyAgICByZXR1cm4gWE1JVF9PSzsKK30gLyogZW5kIHJheV9od194bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9mcmFtZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJvdG8gPSAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9wcm90bzsKKyAgICBpZiAobnRvaHMocHJvdG8pID49IDE1MzYpIHsgLyogRElYIElJIGV0aGVybmV0IGZyYW1lICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgRElYIElJXG4iKTsKKyAgICAgICAgLyogQ29weSBMTEMgaGVhZGVyIHRvIGNhcmQgYnVmZmVyICovCisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZXRoMl9sbGMsIHNpemVvZihldGgyX2xsYykpOworICAgICAgICBtZW1jcHlfdG9pbyggKCh2b2lkIF9faW9tZW0gKikmcHR4LT52YXIpICsgc2l6ZW9mKGV0aDJfbGxjKSwgKFVDSEFSICopJnByb3RvLCAyKTsKKyAgICAgICAgaWYgKChwcm90byA9PSAweGYzODApIHx8IChwcm90byA9PSAweDM3ODEpKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzZWxlY3RpdmUgdHJhbnNsYXRpb24gdGFibGUsIG9ubHkgMiBlbnRyaWVzICovCisgICAgICAgICAgICB3cml0ZWIoMHhmOCwgJigoc3RydWN0IHNuYXBoZHJfdCBfX2lvbWVtICopcHR4LT52YXIpLT5vcmdbM10pOworICAgICAgICB9CisgICAgICAgIC8qIENvcHkgYm9keSBvZiBldGhlcm5ldCBwYWNrZXQgd2l0aG91dCBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oKHZvaWQgX19pb21lbSAqKSZwdHgtPnZhciArIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSwgXAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgIHJldHVybiAoaW50KSBzaXplb2Yoc3RydWN0IHNuYXBoZHJfdCkgLSBFVEhfSExFTjsKKyAgICB9CisgICAgZWxzZSB7IC8qIGFscmVhZHkgIDgwMiB0eXBlLCBhbmQgcHJvdG8gaXMgbGVuZ3RoICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgODAyXG4iKTsKKyAgICAgICAgaWYgKHByb3RvID09IDB4ZmZmZikgeyAvKiBldmlsIG5ldHdhcmUgSVBYIDgwMi4zIHdpdGhvdXQgTExDICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgZXZpbCBJUFhcbiIpOworICAgICAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgICAgICB9CisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZGF0YSArIEVUSF9ITEVOLCAgbGVuIC0gRVRIX0hMRU4pOworICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgIH0KKyAgICAvKiBUQkQgZG8gb3RoZXIgZnJhbWUgdHlwZXMgKi8KK30gLyogZW5kIHRyYW5zbGF0ZV9mcmFtZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgbXNnX3R5cGUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisvKioqIElFRUUgODAyLjExIEFkZHJlc3MgZmllbGQgYXNzaWdubWVudHMgKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgIFRPRFMgRlJPTURTICAgYWRkcl8xICAgICBhZGRyXzIgICAgICAgICAgYWRkcl8zICAgYWRkcl80CitBZGhvYyAgICAgICAgICAgMCAgICAwICAgICAgICBkZXN0ICAgICAgIHNyYyAodGVybWluYWwpICBCU1NJRCAgICBOL0EKK0FQIHRvIFRlcm1pbmFsICAwICAgIDEgICAgICAgIGRlc3QgICAgICAgQVAoQlNTSUQpICAgICAgIHNvdXJjZSAgIE4vQQorVGVybWluYWwgdG8gQVAgIDEgICAgMCAgICAgICAgQVAoQlNTSUQpICBzcmMgKHRlcm1pbmFsKSAgZGVzdCAgICAgTi9BCitBUCB0byBBUCAgICAgICAgMSAgICAxICAgICAgICBkZXN0IEFQICAgIHNyYyBBUCAgICAgICAgICBkZXN0ICAgICBzb3VyY2UgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGxvY2FsLT5uZXRfdHlwZSA9PSBBREhPQykgeyAgIAorICAgICAgICB3cml0ZWIoMCwgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKyAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8xLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCAyICogQUREUkxFTik7CisgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisgICAgfQorICAgIGVsc2UgLyogaW5mcmFzdHJ1Y3R1cmUgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZWIoRkMyX0ZST01fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX2Rlc3QsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCBsb2NhbC0+YnNzX2lkLCA2KTsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgKChzdHJ1Y3QgZXRoaGRyICopZGF0YSktPmhfc291cmNlLCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFRlcm1pbmFsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlYihGQzJfVE9fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGxvY2FsLT5ic3NfaWQsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9zb3VyY2UsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgIH0KK30gLyogZW5kIGVuY2Fwc3VsYXRlX2ZyYW1lICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJyYXlfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHJheV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGVyciA9IDA7CisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgIHN0cnVjdCBzb2NrYWRkcglhZGRyZXNzW0lXX01BWF9TUFldOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9pb2N0bCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgREVCVUcoMiwicmF5X2NzIElPQ1RMIGRldj0lcCwgaWZyPSVwLCBjbWQgPSAweCV4XG4iLGRldixpZnIsY21kKTsKKyAgICAvKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCAqLworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIEdldCBuYW1lICovCisgICAgY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLUZIIik7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCisgICAgY2FzZSBTSU9DR0lXRlJFUToKKyAgICAgIHdycS0+dS5mcmVxLm0gPSBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybjsKKyAgICAgIHdycS0+dS5mcmVxLmUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBmcmVxdWVuY3kvY2hhbm5lbCAqLworICAgIGNhc2UgU0lPQ1NJV0ZSRVE6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgIGlmICgod3JxLT51LmZyZXEubSA+IFVTQV9IT1BfTU9EKSB8fCAod3JxLT51LmZyZXEuZSA+IDApKQorCWVyciA9IC1FT1BOT1RTVVBQOworICAgICAgZWxzZQorCSAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm4gPSB3cnEtPnUuZnJlcS5tOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCBjdXJyZW50IG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DR0lXRVNTSUQ6CisgICAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICBjaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJICAvKiBHZXQgdGhlIGVzc2lkIHRoYXQgd2FzIHNldCAqLworCSAgbWVtY3B5KGVzc2lkLCBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwKKwkJIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CisKKwkgIC8qIFB1c2ggaXQgb3V0ICEgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihlc3NpZCkgKyAxOworCSAgd3JxLT51LmRhdGEuZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKwkgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZXNzaWQsIHNpemVvZihlc3NpZCkpKQorCQkgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBkZXNpcmVkIG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DU0lXRVNTSUQ6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICAgIGNoYXIJY2FyZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCSAgICAKKwkgICAgLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJICAgIGlmKHdycS0+dS5kYXRhLmZsYWdzID09IDApCisJICAgIHsKKwkJLyogQ29yZXkgOiBjYW4geW91IGRvIHRoYXQgPyAqLworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZih3cnEtPnUuZGF0YS5sZW5ndGggPgorCQkgICBJV19FU1NJRF9NQVhfU0laRSArIDEpCisJCXsKKwkJICAgIGVyciA9IC1FMkJJRzsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihjYXJkX2Vzc2lkLAorCQkJCSAgIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJICAgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNhcmRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCQkvKiBTZXQgdGhlIEVTU0lEIGluIHRoZSBjYXJkICovCisJCW1lbWNweShsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgY2FyZF9lc3NpZCwKKwkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgICAgfQorCX0KKwlicmVhazsKKworICAgICAgLyogR2V0IGN1cnJlbnQgQWNjZXNzIFBvaW50IChCU1NJRCBpbiBvdXIgY2FzZSkgKi8KKyAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgIG1lbWNweSh3cnEtPnUuYXBfYWRkci5zYV9kYXRhLCBsb2NhbC0+YnNzX2lkLCBFVEhfQUxFTik7CisgICAgICB3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IGJpdC1yYXRlICovCisgICAgY2FzZSBTSU9DR0lXUkFURToKKyAgICAgIGlmKGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID09IDMpCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSAyMDAwMDAwOwkJLyogSHVtLi4uICovCisgICAgICBlbHNlCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSAqIDUwMDAwMDsKKyAgICAgIHdycS0+dS5iaXRyYXRlLmZpeGVkID0gMDsJCS8qIFdlIGFyZSBpbiBhdXRvIG1vZGUgKi8KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGRlc2lyZWQgYml0LXJhdGUgKi8KKyAgICBjYXNlIFNJT0NTSVdSQVRFOgorICAgICAgLyogQ2hlY2sgaWYgcmF0ZSBpcyBpbiByYW5nZSAqLworICAgICAgaWYoKHdycS0+dS5iaXRyYXRlLnZhbHVlICE9IDEwMDAwMDApICYmCisJICh3cnEtPnUuYml0cmF0ZS52YWx1ZSAhPSAyMDAwMDAwKSkKKwl7CisJICBlcnIgPSAtRUlOVkFMOworCSAgYnJlYWs7CisJfQorICAgICAgLyogSGFjayBmb3IgMS41IE1iL3MgaW5zdGVhZCBvZiAyIE1iL3MgKi8KKyAgICAgIGlmKChsb2NhbC0+ZndfdmVyID09IDB4NTUpICYmCQkvKiBQbGVhc2UgY2hlY2sgKi8KKwkgKHdycS0+dS5iaXRyYXRlLnZhbHVlID09IDIwMDAwMDApKQorCWxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID0gMzsKKyAgICAgIGVsc2UKKwlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IHdycS0+dS5iaXRyYXRlLnZhbHVlLzUwMDAwMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRTIHRocmVzaG9sZCAqLworICAgIGNhc2UgU0lPQ0dJV1JUUzoKKyAgICAgIHdycS0+dS5ydHMudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA8PCA4KQorCSsgbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXTsKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisgICAgICB3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMzI3NjcpOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgICAgIHdycS0+dS5ydHMuZml4ZWQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBSVFMgdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXUlRTOgorICAgIHsKKwlpbnQgcnRociA9IHdycS0+dS5ydHMudmFsdWU7CisKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworCS8qIGlmKHdycS0+dS5ydHMuZml4ZWQgPT0gMCkgd2Ugc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5ydHMuZGlzYWJsZWQpCisJICAgIHJ0aHIgPSAzMjc2NzsKKwllbHNlCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIC8qIFdoYXQncyB0aGUgbWF4IHBhY2tldCBzaXplID8/PyAqLworCSAgICB7CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCSAgICB9CisJbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA9IChydGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzFdID0gcnRociAmIDB4RkY7CisgICAgfQorICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBjYXNlIFNJT0NHSVdGUkFHOgorICAgICAgd3JxLT51LmZyYWcudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMF0gPDwgOCkKKwkrIGxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzFdOworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKyAgICAgIHdycS0+dS5mcmFnLmRpc2FibGVkID0gKHdycS0+dS5mcmFnLnZhbHVlID09IDMyNzY3KTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisgICAgICB3cnEtPnUuZnJhZy5maXhlZCA9IDE7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXRlJBRzoKKyAgICB7CisJaW50IGZ0aHIgPSB3cnEtPnUuZnJhZy52YWx1ZTsKKworICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCisJeworCSAgZXJyID0gLUVCVVNZOworCSAgYnJlYWs7CisJfQorCisJLyogaWYod3JxLT51LmZyYWcuZml4ZWQgPT0gMCkgc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5mcmFnLmRpc2FibGVkKQorCSAgICBmdGhyID0gMzI3Njc7CisJZWxzZQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwkgICAgaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjM0NykpIC8qIFRvIGNoZWNrIG91dCAhICovCisJICAgIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJICAgIH0KKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFswXSA9IChmdGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFsxXSA9IGZ0aHIgJiAweEZGOworICAgIH0KKyAgICBicmVhazsKKworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA4CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLworICAgIGNhc2UgU0lPQ0dJV01PREU6CisgICAgICBpZihsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUpCisJd3JxLT51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworICAgICAgZWxzZQorCXdycS0+dS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyAgICBjYXNlIFNJT0NTSVdNT0RFOgorICAgIHsKKwljaGFyIGNhcmRfbW9kZSA9IDE7CisJCisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlzd2l0Y2ggKHdycS0+dS5tb2RlKQorCXsKKwljYXNlIElXX01PREVfQURIT0M6CisJICAgIGNhcmRfbW9kZSA9IDA7CisJICAgIC8vIEZhbGwgdGhyb3VnaAorCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkgICAgbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID0gY2FyZF9tb2RlOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBlcnIgPSAtRUlOVkFMOworCX0KKyAgICB9CisgICAgYnJlYWs7CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIElXU1BZIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKiBEZWZpbmUgdGhlIHJhbmdlICh2YXJpYXRpb25zKSBvZiBhYm92ZSBwYXJhbWV0ZXJzICovCisgICAgY2FzZSBTSU9DR0lXUkFOR0U6CisgICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcmFuZ2UJcmFuZ2U7CisJICBtZW1zZXQoKGNoYXIgKikgJnJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkgIC8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKwkgIC8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJICByYW5nZS53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgcmFuZ2Uud2VfdmVyc2lvbl9zb3VyY2UgPSA5OworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCisKKwkgIC8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisJICByYW5nZS50aHJvdWdocHV0ID0gMS4xICogMTAwMCAqIDEwMDA7CS8qIFB1dCB0aGUgcmlnaHQgbnVtYmVyIGhlcmUgKi8KKwkgIHJhbmdlLm51bV9jaGFubmVscyA9IGhvcF9wYXR0ZXJuX2xlbmd0aFsoaW50KWNvdW50cnldOyAKKwkgIHJhbmdlLm51bV9mcmVxdWVuY3kgPSAwOworCSAgcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7CisJICByYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDI1NTsJLyogV2hhdCdzIHRoZSBjb3JyZWN0IHZhbHVlID8gKi8KKwkgIHJhbmdlLm1heF9xdWFsLm5vaXNlID0gMjU1OwkvKiBJZGVtICovCisJICByYW5nZS5udW1fYml0cmF0ZXMgPSAyOworCSAgcmFuZ2UuYml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLworCSAgcmFuZ2UuYml0cmF0ZVsxXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCisJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKSkKKwkgICAgZXJyID0gLUVGQVVMVDsKKwl9CisgICAgICBicmVhazsKKworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgICAgLyogU2V0IGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBjYXNlIFNJT0NTSVdTUFk6CisgICAgICAvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgaWYod3JxLT51LmRhdGEubGVuZ3RoID4gSVdfTUFYX1NQWSkKKwl7CisJICBlcnIgPSAtRTJCSUc7CisJICBicmVhazsKKwl9CisgICAgICBsb2NhbC0+c3B5X251bWJlciA9IHdycS0+dS5kYXRhLmxlbmd0aDsKKworICAgICAgLyogSWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzZXMgdG8gY29weSAqLworICAgICAgaWYobG9jYWwtPnNweV9udW1iZXIgPiAwKQorCXsKKwkgIGludAkJCWk7CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBkcml2ZXIgKi8KKwkgIGlmKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIG1lbWNweShsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwgRVRIX0FMRU4pOworCisJICAvKiBSZXNldCBzdHJ1Y3R1cmUuLi4gKi8KKwkgIG1lbXNldChsb2NhbC0+c3B5X3N0YXQsIDB4MDAsIHNpemVvZihpd19xdWFsKSAqIElXX01BWF9TUFkpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCSAgcHJpbnRrKEtFUk5fREVCVUcgIlNldFNweSAtIFNldCBvZiBuZXcgYWRkcmVzc2VzIGlzIDpcbiIpOworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMF0sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVsxXSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzJdLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bM10sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVs0XSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzVdKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCB0aGUgc3B5IGxpc3QgYW5kIHNweSBzdGF0cyAqLworICAgIGNhc2UgU0lPQ0dJV1NQWToKKyAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gbG9jYWwtPnNweV9udW1iZXI7CisKKyAgICAgIC8qIElmIHRoZSB1c2VyIHdhbnQgdG8gaGF2ZSB0aGUgYWRkcmVzc2VzIGJhY2suLi4gKi8KKyAgICAgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmICh3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSkKKwl7CisJICBpbnQJCQlpOworCisJICAvKiBDb3B5IGFkZHJlc3NlcyBmcm9tIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIHsKKwkgICAgICBtZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKTsKKwkgICAgICBhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkgICAgfQorCisJICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBhZGRyZXNzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKSAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIgKworCQkgICAgICAgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbG9jYWwtPnNweV9udW1iZXIpLAorCQkgICAgICAgbG9jYWwtPnNweV9zdGF0LCBzaXplb2YoaXdfcXVhbCkgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgwOworCX0JLyogaWYocG9pbnRlciAhPSBOVUxMKSAqLworCisgICAgICBicmVhazsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmIFNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKyNkZWZpbmUgU0lPQ1NJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWCQkvKiBTZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTSU9DR0lQQ09VTlRSWQlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBjb3VudHJ5IGNvZGUgKi8KKyAgICBjYXNlIFNJT0NTSVBGUkFNSU5HOgorICAgICAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCS8qIEZvciBwcml2YXRlIElPQ1RMcywgd2UgbmVlZCB0byBjaGVjayBwZXJtaXNzaW9ucyAqLworCXsKKwkgIGVyciA9IC1FUEVSTTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHRyYW5zbGF0ZSA9ICood3JxLT51Lm5hbWUpOwkvKiBTZXQgZnJhbWluZyBtb2RlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBGUkFNSU5HOgorICAgICAgKih3cnEtPnUubmFtZSkgPSB0cmFuc2xhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBDT1VOVFJZOgorICAgICAgKih3cnEtPnUubmFtZSkgPSBjb3VudHJ5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXUFJJVjoKKyAgICAgIC8qIEV4cG9ydCBvdXIgInByaXZhdGUiIGludGVyY2FjZSAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcHJpdl9hcmdzCXByaXZbXSA9CisJICB7CS8qIGNtZCwJCXNldF9hcmdzLAlnZXRfYXJncywJbmFtZSAqLworCSAgICB7IFNJT0NTSVBGUkFNSU5HLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZnJhbWluZyIgfSwKKwkgICAgeyBTSU9DR0lQRlJBTUlORywgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2ZyYW1pbmciIH0sCisJICAgIHsgU0lPQ0dJUENPVU5UUlksIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9jb3VudHJ5IiB9LAorCSAgfTsKKwkgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLworCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gMzsKKwkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICh1X2NoYXIgKikgcHJpdiwKKwkJICAgICAgIHNpemVvZihwcml2KSkpCisJICAgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9kZXZfaW9jdGwgY21kID0gMHgleFxuIiwgY21kKTsKKyAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfSAvKiBlbmQgcmF5X2Rldl9pb2N0bCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KK3N0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIHJheV9kZXZfdCAqCWxvY2FsID0gKHJheV9kZXZfdCAqKSBkZXYtPnByaXY7CisgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworCisgIGlmKGxvY2FsID09IChyYXlfZGV2X3QgKikgTlVMTCkKKyAgICByZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisKKyAgbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmIChsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPT0gMCkpCisgICAgeworICAgICAgLyogR2V0IGl0IGZyb20gdGhlIGZpcnN0IG5vZGUgaW4gc3B5IGxpc3QgKi8KKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gbG9jYWwtPnNweV9zdGF0WzBdLnF1YWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubGV2ZWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubm9pc2U7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IGxvY2FsLT5zcHlfc3RhdFswXS51cGRhdGVkOworICAgIH0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKworICBpZigobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSByZWFkYigmcC0+cnhub2lzZSk7CisgICAgbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gNDsKKyAgfQorCisgIHJldHVybiAmbG9jYWwtPndzdGF0czsKK30gLyogZW5kIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X29wZW4oJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKCFERVZfT0sobGluaykpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKGxpbmstPm9wZW4gPT0gMCkgbG9jYWwtPm51bV9tdWx0aSA9IDA7CisgICAgbGluay0+b3BlbisrOworCisgICAgLyogSWYgdGhlIGNhcmQgaXMgbm90IHN0YXJ0ZWQsIHRpbWUgdG8gc3RhcnQgaXQgISAtIEplYW4gSUkgKi8KKyAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgPT0gQ0FSRF9BV0FJVElOR19QQVJBTSkgeworCWludCBpOworCisJREVCVUcoMSwicmF5X29wZW46IGRvaW5nIGluaXQgbm93ICFcbiIpOworCisJLyogRG93bmxvYWQgc3RhcnR1cCBwYXJhbWV0ZXJzICovCisJaWYgKCAoaSA9IGRsX3N0YXJ0dXBfcGFyYW1zKGRldikpIDwgMCkKKwkgIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2Rldl9pbml0IGRsX3N0YXJ0dXBfcGFyYW1zIGZhaWxlZCAtICIKKwkJICAgInJldHVybnMgMHgleFxuIixpKTsKKwkgICAgcmV0dXJuIC0xOworCSAgfQorICAgICB9CisKKyAgICBpZiAoc25pZmZlcikgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGVsc2UgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgREVCVUcoMiwicmF5X29wZW4gZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIHJheV9vcGVuICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBkZXZfbGlua190ICpsaW5rOworCisgICAgREVCVUcoMSwgInJheV9kZXZfY2xvc2UoJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogSW4gaGVyZSwgd2Ugc2hvdWxkIHN0b3AgdGhlIGhhcmR3YXJlIChzdG9wIGNhcmQgZnJvbSBiZWVpbmcgYWN0aXZlKQorICAgICAqIGFuZCBzZXQgbG9jYWwtPmNhcmRfc3RhdHVzIHRvIENBUkRfQVdBSVRJTkdfUEFSQU0sIHNvIHRoYXQgd2hpbGUgdGhlCisgICAgICogY2FyZCBpcyBjbG9zZWQgd2UgY2FuIGNoYWdlIGl0cyBjb25maWd1cmF0aW9uLgorICAgICAqIFByb2JhYmx5IGFsc28gbmVlZCBhIENPUiByZXNldCB0byBnZXQgc2FuZSBzdGF0ZSAtIEplYW4gSUkgKi8KKworICAgIHJldHVybiAwOworfSAvKiBlbmQgcmF5X2Rldl9jbG9zZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBERUJVRygxLCJyYXlfcmVzZXQgZW50ZXJlZFxuIik7CisgICAgcmV0dXJuOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ2F1c2UgYSBmaXJtd2FyZSBpbnRlcnJ1cHQgaWYgaXQgaXMgcmVhZHkgZm9yIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIG5vbnplcm8gaWYgbm90IHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBpbnRlcnJ1cHRfZWNmKHJheV9kZXZfdCAqbG9jYWwsIGludCBjY3MpCit7CisgICAgaW50IGkgPSA1MDsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBERUJVRygyLCJpbnRlcnJ1cHRfZWNmKGxvY2FsPSVwLCBjY3MgPSAweCV4XG4iLGxvY2FsLGNjcyk7CisKKyAgICB3aGlsZSAoIGkgJiYgCisgICAgICAgICAgICAocmVhZGIobG9jYWwtPmFtZW0gKyBDSVNfT0ZGU0VUICsgRUNGX0lOVFJfT0ZGU0VUKSAmIEVDRl9JTlRSX1NFVCkpCisgICAgICAgIGktLTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIGNhcmQgbm90IHJlYWR5IGZvciBpbnRlcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCS8qIEZpbGwgdGhlIG1haWxib3gsIHRoZW4ga2ljayB0aGUgY2FyZCAqLworICAgIHdyaXRlYihjY3MsIGxvY2FsLT5zcmFtICsgU0NCX0JBU0UpOworICAgIHdyaXRlYihFQ0ZfSU5UUl9TRVQsIGxvY2FsLT5hbWVtICsgQ0lTX09GRlNFVCArIEVDRl9JTlRSX09GRlNFVCk7CisgICAgcmV0dXJuIDA7Cit9IC8qIGludGVycnVwdF9lY2YgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEdldCBuZXh0IGZyZWUgdHJhbnNtaXQgQ0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiAtIGluZGV4IG9mIGN1cnJlbnQgdHggY2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzID0gY2NzX2Jhc2UobG9jYWwpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGdldF9mcmVlX3R4X2NjcyAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiBFQ0FSREdPTkU7CisgICAgfQorCisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPnR4X2Njc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdHhfY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpPTA7IGkgPCBOVU1CRVJfT0ZfVFhfQ0NTOyBpKyspIHsKKyAgICAgICAgaWYgKHJlYWRiKCYocGNjcytpKS0+YnVmZmVyX3N0YXR1cykgPT0gQ0NTX0JVRkZFUl9GUkVFKSB7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9CVVNZLCAmKHBjY3MraSktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICAgICAgd3JpdGViKENDU19FTkRfTElTVCwgJihwY2NzK2kpLT5saW5rKTsKKwkJCWxvY2FsLT50eF9jY3NfbG9jayA9IDA7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKwlsb2NhbC0+dHhfY2NzX2xvY2sgPSAwOworICAgIERFQlVHKDIsInJheV9jcyBFUlJPUiBubyBmcmVlIHR4IENDUyBmb3IgcmF5bGluayBjYXJkXG4iKTsKKyAgICByZXR1cm4gRUNDU0ZVTEw7Cit9IC8qIGdldF9mcmVlX3R4X2NjcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogR2V0IG5leHQgZnJlZSBDQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIC0gaW5kZXggb2YgY3VycmVudCBjY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBnZXRfZnJlZV9jY3MocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3MgPSBjY3NfYmFzZShsb2NhbCk7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgZ2V0X2ZyZWVfY2NzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQVJER09ORTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPmNjc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpID0gTlVNQkVSX09GX1RYX0NDUzsgaSA8IE5VTUJFUl9PRl9DQ1M7IGkrKykgeworICAgICAgICBpZiAocmVhZGIoJihwY2NzK2kpLT5idWZmZXJfc3RhdHVzKSA9PSBDQ1NfQlVGRkVSX0ZSRUUpIHsKKyAgICAgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0JVU1ksICYocGNjcytpKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0VORF9MSVNULCAmKHBjY3MraSktPmxpbmspOworCQkJbG9jYWwtPmNjc19sb2NrID0gMDsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCWxvY2FsLT5jY3NfbG9jayA9IDA7CisgICAgREVCVUcoMSwicmF5X2NzIEVSUk9SIG5vIGZyZWUgQ0NTIGZvciByYXlsaW5rIGNhcmRcbiIpOworICAgIHJldHVybiBFQ0NTRlVMTDsKK30gLyogZ2V0X2ZyZWVfY2NzICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGVfdGltZW91dCh1X2xvbmcgZGF0YSkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRhdGE7CisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBBdXRoZW50aWNhdGlvbiB3aXRoIGFjY2VzcyBwb2ludCBmYWlsZWQiCisgICAgICAgIiAtIHRpbWVvdXRcbiIpOworICAgIGpvaW5fbmV0KCh1X2xvbmcpbG9jYWwpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSkKK3sKKyAgICBpZiAoYSA8ICcwJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICc5JykgcmV0dXJuIChhIC0gJzAnKTsKKyAgICBpZiAoYSA8ICdBJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICdGJykgcmV0dXJuICgxMCArIGEgLSAnQScpOworICAgIGlmIChhIDwgJ2EnKSByZXR1cm4gLTE7CisgICAgaWYgKGEgPD0gJ2YnKSByZXR1cm4gKDEwICsgYSAtICdhJyk7CisgICAgcmV0dXJuIC0xOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBwYXJzZV9hZGRyKGNoYXIgKmluX3N0ciwgVUNIQVIgKm91dCkKK3sKKyAgICBpbnQgbGVuOworICAgIGludCBpLGosazsKKyAgICBpbnQgc3RhdHVzOworICAgIAorICAgIGlmIChpbl9zdHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKChsZW4gPSBzdHJsZW4oaW5fc3RyKSkgPCAyKSByZXR1cm4gMDsKKyAgICBtZW1zZXQob3V0LCAwLCBBRERSTEVOKTsKKworICAgIHN0YXR1cyA9IDE7CisgICAgaiA9IGxlbiAtIDE7CisgICAgaWYgKGogPiAxMikgaiA9IDEyOworICAgIGkgPSA1OworICAgIAorICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIGlmICgoayA9IGFzY190b19pbnQoaW5fc3RyW2otLV0pKSAhPSAtMSkgb3V0W2ldID0gazsKKyAgICAgICAgZWxzZSByZXR1cm4gMDsKKworICAgICAgICBpZiAoaiA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKChrID0gYXNjX3RvX2ludChpbl9zdHJbai0tXSkpICE9IC0xKSBvdXRbaV0gKz0gayA8PCA0OworICAgICAgICBlbHNlIHJldHVybiAwOworICAgICAgICBpZiAoIWktLSkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJheV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBuZXRfZGV2aWNlX3N0YXRzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuICZsb2NhbC0+c3RhdHM7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSBudG9ocyhyZWFkYigmcC0+bXJ4X292ZXJmbG93KSk7CisgICAgICAgIHdyaXRlYigwLCZwLT5tcnhfb3ZlcmZsb3cpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KTsKKyAgICB9CisgICAgaWYgKHJlYWRiKCZwLT5tcnhfY2hlY2tzdW1fZXJyb3JfZm9yX2hvc3QpKQorICAgIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPm1yeF9jaGVja3N1bV9lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X2NoZWNrc3VtX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPm1yeF9jaGVja3N1bV9lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+cnhfaGVjX2Vycm9yX2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPnJ4X2hlY19lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+cnhfaGVjX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPnJ4X2hlY19lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIHJldHVybiAmbG9jYWwtPnN0YXRzOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3VwZGF0ZV9wYXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFVDSEFSIG9iamlkLCBVQ0hBUiAqdmFsdWUsIGludCBsZW4pCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGNjc2luZGV4OworICAgIGludCBpOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfcGFybSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X3VwZGF0ZV9wYXJtIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9QQVJBTVMsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihvYmppZCwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ub2JqZWN0X2lkKTsKKyAgICB3cml0ZWIoMSwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ubnVtYmVyX29iamVjdHMpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICB3cml0ZWIodmFsdWVbaV0sIGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSk7CisgICAgfQorICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIGFzc29jaWF0ZSBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICB9Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX211bHRpX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFsbCkKK3sKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgKipkbWlwOworICAgIGludCBjY3NpbmRleDsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGkgPSAwOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHZvaWQgX19pb21lbSAqcCA9IGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRTsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfbXVsdGlfbGlzdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgICAgREVCVUcoMiwicmF5X3VwZGF0ZV9tdWx0aV9saXN0KCVwKVxuIixkZXYpOworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApCisgICAgeworICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCwgJnBjY3MtPmNtZCk7CisKKyAgICBpZiAoYWxsKSB7CisgICAgICAgIHdyaXRlYigweGZmLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgbG9jYWwtPm51bV9tdWx0aSA9IDB4ZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDb3B5IHRoZSBrZXJuZWwncyBsaXN0IG9mIE1DIGFkZHJlc3NlcyB0byBjYXJkICovCisgICAgICAgIGZvciAoZG1pcD0mZGV2LT5tY19saXN0OyAoZG1pPSpkbWlwKSE9TlVMTDsgZG1pcD0mZG1pLT5uZXh0KSB7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIGFkZCBhZGRyICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixkbWktPmRtaV9hZGRyWzBdLGRtaS0+ZG1pX2FkZHJbMV0sZG1pLT5kbWlfYWRkclsyXSxkbWktPmRtaV9hZGRyWzNdLGRtaS0+ZG1pX2FkZHJbNF0sZG1pLT5kbWlfYWRkcls1XSk7CisgICAgICAgICAgICBwICs9IEVUSF9BTEVOOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gMjU2L0FERFJMRU4pIGkgPSAyNTYvQUREUkxFTjsKKyAgICAgICAgd3JpdGViKChVQ0hBUilpLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHVwZGF0ZV9tdWx0aSAlZCBhZGRyZXNzZXMgaW4gbGlzdFxuIiwgaSk7CisgICAgICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgICAgICBsb2NhbC0+bnVtX211bHRpID0gaTsKKyAgICB9CisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdXBkYXRlX211bHRpIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KK30gLyogZW5kIHJheV91cGRhdGVfbXVsdGlfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgVUNIQVIgcHJvbWlzYzsKKworICAgIERFQlVHKDIsInJheV9jcyBzZXRfbXVsdGljYXN0X2xpc3QoJXApXG4iLGRldik7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPT0gMCkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIHNldF9tdWx0aWNhc3RfbGlzdCBwcm9taXNjIG9uXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAxOworICAgICAgICAgICAgcHJvbWlzYyA9IDE7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9PSAxKSB7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2V0X211bHRpY2FzdF9saXN0IHByb21pc2Mgb2ZmXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAwOworICAgICAgICAgICAgcHJvbWlzYyA9IDA7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDEpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+bnVtX211bHRpICE9IGRldi0+bWNfY291bnQpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDApOworICAgIH0KK30gLyogZW5kIHNldF9tdWx0aWNhc3RfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWxsIHJvdXRpbmVzIGJlbG93IGhlcmUgYXJlIHJ1biBhdCBpbnRlcnJ1cHQgdGltZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpcnFyZXR1cm5fdCByYXlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3M7CisgICAgVUNIQVIgcmNzaW5kZXg7CisgICAgVUNIQVIgdG1wOworICAgIFVDSEFSIGNtZDsKKyAgICBVQ0hBUiBzdGF0dXM7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIC8qIE5vdGUgdGhhdCB3ZSB3YW50IGludGVycnVwdHMgd2l0aCBkZXYtPnN0YXJ0ID09IDAgKi8KKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBERUJVRyg0LCJyYXlfY3M6IGludGVycnVwdCBmb3IgKmRldj0lcFxuIixkZXYpOworCisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGxpbmsgPSAoZGV2X2xpbmtfdCAqKWxvY2FsLT5maW5kZXI7CisgICAgaWYgKCAhIChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSB8fCBsaW5rLT5zdGF0ZSAmIERFVl9TVVNQRU5EICkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IGZyb20gZGV2aWNlIG5vdCBwcmVzZW50IG9yIHN1c3BlbmRlZC5cbiIpOworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorICAgIHJjc2luZGV4ID0gcmVhZGIoJigoc3RydWN0IHNjYiBfX2lvbWVtICopKGxvY2FsLT5zcmFtKSktPnJjc19pbmRleCk7CisKKyAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgYmFkIHJjc2luZGV4ID0gMHgleFxuIixyY3NpbmRleCk7CisgICAgICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICB9CisgICAgaWYgKHJjc2luZGV4IDwgTlVNQkVSX09GX0NDUykgLyogSWYgaXQncyBhIHJldHVybmVkIENDUyAqLworICAgIHsKKyAgICAgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIHJjc2luZGV4OworICAgICAgICBjbWQgPSByZWFkYigmcGNjcy0+Y21kKTsKKyAgICAgICAgc3RhdHVzID0gcmVhZGIoJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBzd2l0Y2ggKGNtZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUzogLyogSGFwcGVucyBpbiBmaXJtd2FyZSBzb21lZGF5ICovCisgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgT0tcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgZmFpbFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BBUkFNUzoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBkb25lXG4iKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSByZWFkYigmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBmYWlsZWQgLSByZWFzb24gJWRcbiIsdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19SRVBPUlRfUEFSQU1TOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCByZXBvcnQgcGFyYW1zIGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVDogLyogTm90ZSB0aGF0IHRoaXMgQ0NTIGlzbid0IHJldHVybmVkICovCisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IENDUyBVcGRhdGUgTXVsdGljYXN0IExpc3QgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BPV0VSX1NBVklOR1NfTU9ERToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBvd2VyIHNhdmUgbW9kZSBkb25lXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9ORVRXT1JLOgorICAgICAgICBjYXNlIENDU19KT0lOX05FVFdPUks6CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRiKCZwY2NzLT52YXIuc3RhcnRfbmV0d29yay5uZXRfaW5pdGlhdGVkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgc3RhcnRlZFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2N1cnJlbnRfZXNzX2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgam9pbmVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLHBjY3MtPnZhci5zdGFydF9uZXR3b3JrLmJzc2lkLEFERFJMRU4pOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAzOworICAgICAgICAgICAgICAgIGVsc2UgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsubmV0X2RlZmF1bHRfdHhfcmF0ZSk7CisgICAgICAgICAgICAgICAgbG9jYWwtPmVuY3J5cHRpb24gPSByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsuZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyICYmIChsb2NhbC0+bmV0X3R5cGUgPT0gSU5GUkEpCisgICAgICAgICAgICAgICAgICAgICYmICEobG9jYWwtPnNwYXJtLmI0LmFfYWN0aW5nX2FzX2FwX3N0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BQ1FfQ09NUExFVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9GQUlMRUQ7CisKKyAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqNTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZGF0YSA9IChsb25nKWxvY2FsOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX1NUQVJUX05FVFdPUkspIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCBuZXR3b3JrIFwiJXNcIiBzdGFydCBmYWlsZWRcbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZzdGFydF9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW50ZXJydXB0IG5ldHdvcmsgXCIlc1wiIGpvaW4gZmFpbGVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9BU1NPQ0lBVElPTjoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FTU09DX0NPTVBMRVRFOworICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBhc3NvY2lhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgYXNzb2NpYXRpb24gZmFpbGVkLFxuIik7CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BU1NPQ19GQUlMRUQ7CisgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVFhfUkVRVUVTVDoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBERUJVRygzLCJyYXlfY3MgaW50ZXJydXB0IHR4IHJlcXVlc3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCB0eCByZXF1ZXN0IGZhaWxlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVEVTVF9NRU1PUlk6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IG1lbSB0ZXN0IGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1NIVVRET1dOOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBVbmV4cGVjdGVkIENDUyByZXR1cm5lZCAtIFNodXRkb3duXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19EVU1QX01FTU9SWToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgZHVtcCBtZW1vcnkgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfU1RBUlRfVElNRVI6CisgICAgICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IERJTkcgLSByYXlsaW5rIHRpbWVyIGV4cGlyZWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IFVuZXhwZWN0ZWQgQ0NTIDB4JXggcmV0dXJuZWQgMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgY21kKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcGNjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorICAgIGVsc2UgLyogSXQncyBhbiBSQ1MgKi8KKyAgICB7CisgICAgICAgIHByY3MgPSByY3NfYmFzZShsb2NhbCkgKyByY3NpbmRleDsKKyAgICAKKyAgICAgICAgc3dpdGNoIChyZWFkYigmcHJjcy0+aW50ZXJydXB0X2lkKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBST0NFU1NfUlhfUEFDS0VUOgorICAgICAgICAgICAgcmF5X3J4KGRldiwgbG9jYWwsIHByY3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVKT0lOX05FVF9DT01QTEVURToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgcmVqb2luIG5ldCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9DT01QTEVURTsKKyAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gY2xlYXIgdHggYnVmZmVycyBDQ1Mncz8gKi8KKyAgICAgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9uZXR3b3JrX3R5cGUgPT0gQURIT0MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLCBwcmNzLT52YXIucmVqb2luX25ldF9jb21wbGV0ZS5ic3NpZCwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIG5ldyBCU1NJRCA9ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFswXSwgbG9jYWwtPmJzc19pZFsxXSwgbG9jYWwtPmJzc19pZFsyXSxcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFszXSwgbG9jYWwtPmJzc19pZFs0XSwgbG9jYWwtPmJzc19pZFs1XSk7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyKSBhdXRoZW50aWNhdGUobG9jYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUk9BTUlOR19JTklUSUFURUQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IHJvYW1pbmcgaW5pdGlhdGVkXG4iKTsgCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpBUEFOX0NBTExfU0lHTl9SWEQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGphcGFuIGNhbGwgc2lnbiByeFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBVbmV4cGVjdGVkIGludGVycnVwdCBmb3IgUkNTIDB4JXggY21kID0gMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgKHVuc2lnbmVkIGludCkgcmVhZGIoJnByY3MtPmludGVycnVwdF9pZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnByY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBjbGVhcl9pbnRlcnJ1cHQobG9jYWwpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogcmF5X2ludGVycnVwdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcykKK3sKKyAgICBpbnQgcnhfbGVuOworICAgIHVuc2lnbmVkIGludCBwa3RfYWRkcjsKKyAgICB2b2lkIF9faW9tZW0gKnBtc2c7CisgICAgREVCVUcoNCwicmF5X3J4IHByb2Nlc3MgcnggcGFja2V0XG4iKTsKKworICAgIC8qIENhbGN1bGF0ZSBhZGRyZXNzIG9mIHBhY2tldCB3aXRoaW4gUnggYnVmZmVyICovCisgICAgcGt0X2FkZHIgPSAoKHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfcHRyWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMV0pKSAmIFJYX0JVRkZfRU5EOworICAgIC8qIExlbmd0aCBvZiBmaXJzdCBwYWNrZXQgZnJhZ21lbnQgKi8KKyAgICByeF9sZW4gPSAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMF0pIDw8IDgpCisgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworCisgICAgbG9jYWwtPmxhc3RfcnNsID0gcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfc2lnX2xldik7CisgICAgcG1zZyA9IGxvY2FsLT5ybWVtICsgcGt0X2FkZHI7CisgICAgc3dpdGNoKHJlYWRiKHBtc2cpKQorICAgIHsKKyAgICBjYXNlIERBVEFfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGRhdGEgdHlwZVxuIik7CisgICAgICAgIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVVRIRU5USUNfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGF1dGhlbnRpYyB0eXBlXG4iKTsKKyAgICAgICAgaWYgKHNuaWZmZXIpIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgZWxzZSByeF9hdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFQVVUSEVOVElDX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBkZWF1dGggdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisgICAgICAgIGVsc2UgcnhfZGVhdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5VTExfTVNHX1RZUEU6CisgICAgICAgIERFQlVHKDMsInJheV9jcyByeCBOVUxMIG1zZ1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkVBQ09OX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBiZWFjb24gdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisKKyAgICAgICAgY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIChVQ0hBUiAqKSZsb2NhbC0+bGFzdF9iY24sIHBrdF9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfbGVuIDwgc2l6ZW9mKHN0cnVjdCBiZWFjb25fcngpID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X2xlbiA6IHNpemVvZihzdHJ1Y3QgYmVhY29uX3J4KSk7CisKKwlsb2NhbC0+YmVhY29uX3J4ZWQgPSAxOworICAgICAgICAvKiBHZXQgdGhlIHN0YXRpc3RpY3Mgc28gdGhlIGNhcmQgY291bnRlcnMgbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmF5X2dldF9zdGF0cyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHVua25vd24gcGt0IHR5cGUgJTJ4XG4iLCAodW5zaWduZWQgaW50KSByZWFkYihwbXNnKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworfSAvKiBlbmQgcmF5X3J4ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKQoreworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgIHN0cnVjdCByY3MgX19pb21lbSAqcHJjc2xpbmsgPSBwcmNzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgVUNIQVIgKnJ4X3B0cjsKKyAgICBpbnQgdG90YWxfbGVuOworICAgIGludCB0bXA7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50IHNpZ2xldiA9IGxvY2FsLT5sYXN0X3JzbDsKKyAgICB1X2NoYXIgbGlua3NyY2FkZHJbRVRIX0FMRU5dOwkvKiBPdGhlciBlbmQgb2YgdGhlIHdpcmVsZXNzIGxpbmsgKi8KKyNlbmRpZgorCisgICAgaWYgKCFzbmlmZmVyKSB7CisgICAgICAgIGlmICh0cmFuc2xhdGUpIHsKKy8qIFRCRCBsZW5ndGggbmVlZHMgZml4aW5nIGZvciB0cmFuc2xhdGVkIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludmFsaWQgcGFja2V0IGxlbmd0aCAlZCByZWNlaXZlZCBcbiIscnhfbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBlbmNhcHN1bGF0ZWQgZXRoZXJuZXQgKi8geworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkIHJlY2VpdmVkIFxuIixyeF9sZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBERUJVRyg0LCJyYXlfY3MgcnhfZGF0YSBwYWNrZXRcbiIpOworICAgIC8qIElmIGZyYWdtZW50ZWQgcGFja2V0LCB2ZXJpZnkgc2l6ZXMgb2YgZnJhZ21lbnRzIGFkZCB1cCAqLworICAgIGlmIChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeCdlZCBmcmFnbWVudFxuIik7CisgICAgICAgIHRtcCA9IChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC50b3RhbHBhY2tldGxlbmd0aFswXSkgPDwgOCkKKyAgICAgICAgICAgICsgIHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnRvdGFscGFja2V0bGVuZ3RoWzFdKTsKKyAgICAgICAgdG90YWxfbGVuID0gdG1wOworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRtcCAtPSAocmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworICAgICAgICAgICAgaWYgKHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSA9PSAweEZGCisgICAgICAgICAgICAgICAgfHwgdG1wIDwgMCkgYnJlYWs7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT5saW5rX2ZpZWxkKTsKKyAgICAgICAgfSB3aGlsZSAoMSk7CisKKyAgICAgICAgaWYgKHRtcCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyByeF9kYXRhIGZyYWdtZW50IGxlbmd0aHMgZG9uJ3QgYWRkIHVwXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICAgICAgcmVsZWFzZV9mcmFnX2NoYWluKGxvY2FsLCBwcmNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgLyogU2luZ2xlIHVuZnJhZ21lbnRlZCBwYWNrZXQgKi8KKyAgICAgICAgdG90YWxfbGVuID0gcnhfbGVuOworICAgIH0KKworICAgIHNrYiA9IGRldl9hbGxvY19za2IoIHRvdGFsX2xlbis1ICk7CisgICAgaWYgKHNrYiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHJ4X2RhdGEgY291bGQgbm90IGFsbG9jYXRlIHNrYlxuIik7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikKKyAgICAgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tiX3Jlc2VydmUoIHNrYiwgMik7ICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAoVEJEIGNoZWNrIHRoaXMpKi8KKyAgICBza2ItPmRldiA9IGRldjsKKworICAgIERFQlVHKDQsInJheV9jcyByeF9kYXRhIHRvdGFsX2xlbiA9ICV4LCByeF9sZW4gPSAleFxuIix0b3RhbF9sZW4scnhfbGVuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBSZXNlcnZlIGVub3VnaCByb29tIGZvciB0aGUgd2hvbGUgZGFtbiBwYWNrZXQuICovCisgICAgcnhfcHRyID0gc2tiX3B1dCggc2tiLCB0b3RhbF9sZW4pOworICAgIC8qIENvcHkgdGhlIHdob2xlIHBhY2tldCB0byBza19idWZmICovCisgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyICYgUlhfQlVGRl9FTkQsIHJ4X2xlbik7CisgICAgLyogR2V0IHNvdXJjZSBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgbWVtY3B5KGxpbmtzcmNhZGRyLCAoKHN0cnVjdCBtYWNfaGVhZGVyICopc2tiLT5kYXRhKS0+YWRkcl8yLCBFVEhfQUxFTik7CisjZW5kaWYKKyAgICAvKiBOb3csIGRlYWwgd2l0aCBlbmNhcHN1bGF0aW9uL3RyYW5zbGF0aW9uL3NuaWZmZXIgKi8KKyAgICBpZiAoIXNuaWZmZXIpIHsKKyAgICAgICAgaWYgKCF0cmFuc2xhdGUpIHsgCisgICAgICAgICAgICAvKiBFbmNhcHN1bGF0ZWQgZXRoZXJuZXQsIHNvIGp1c3QgbG9wIG9mZiA4MDIuMTEgTUFDIGhlYWRlciAqLworLyogVEJEIHJlc2VydmUgICAgICAgICAgICBza2JfcmVzZXJ2ZSggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7ICovCisgICAgICAgICAgICBza2JfcHVsbCggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEbyB0cmFuc2xhdGlvbiAqLworICAgICAgICAgICAgdW50cmFuc2xhdGUobG9jYWwsIHNrYiwgdG90YWxfbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsgIC8qIHNuaWZmZXIgbW9kZSwgc28ganVzdCBwYXNzIHdob2xlIHBhY2tldCAqLyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBOb3cgcGljayB1cCB0aGUgcmVzdCBvZiB0aGUgZnJhZ21lbnRzIGlmIGFueSAqLworICAgIHRtcCA9IDE3OyAKKyAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikgeworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9kYXRhIGluIGZyYWdtZW50IGxvb3BcbiIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgICAgICAgICAgcnhfbGVuID0gKCggcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzFdKSkKKyAgICAgICAgICAgICAgICAmIFJYX0JVRkZfRU5EOworICAgICAgICAgICAgcGt0X2FkZHIgPSAoKCByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX3B0clsxXSkpCisgICAgICAgICAgICAgICAgJiBSWF9CVUZGX0VORDsKKworICAgICAgICAgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyLCByeF9sZW4pOworCisgICAgICAgIH0gd2hpbGUgKHRtcC0tICYmIAorICAgICAgICAgICAgICAgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRik7CisgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgfQorCisgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworICAgIG5ldGlmX3J4KHNrYik7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICBsb2NhbC0+c3RhdHMucnhfcGFja2V0cysrOworICAgIGxvY2FsLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RhbF9sZW47CisKKyAgICAvKiBHYXRoZXIgc2lnbmFsIHN0cmVuZ3RoIHBlciBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgLyogRm9yIHRoZSBBY2Nlc3MgUG9pbnQgb3IgdGhlIG5vZGUgaGF2aW5nIHN0YXJ0ZWQgdGhlIGFkLWhvYyBuZXQKKyAgICAgKiBub3RlIDogYWQtaG9jIHdvcmsgb25seSBpbiBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLCBidXQgd2UKKyAgICAgKiBrbHVkZ2UgaW4gcmF5X2dldF93aXJlbGVzc19zdGF0cy4uLiAqLworICAgIGlmKCFtZW1jbXAobGlua3NyY2FkZHIsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKSkKKyAgICAgIHsKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCS8qbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBzaWdsZXY7CisJLypsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDB4MjsKKyAgICAgIH0KKyAgICAvKiBOb3csIGZvciB0aGUgYWRkcmVzc2VzIGluIHRoZSBzcHkgbGlzdCAqLworICAgIHsKKyAgICAgIGludAlpOworICAgICAgLyogTG9vayBhbGwgYWRkcmVzc2VzICovCisgICAgICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQorCS8qIElmIG1hdGNoICovCisJaWYoIW1lbWNtcChsaW5rc3JjYWRkciwgbG9jYWwtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpCisJICB7CisJICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLnF1YWwgPSBub25lID8gKi8KKwkgICAgbG9jYWwtPnNweV9zdGF0W2ldLmxldmVsID0gc2lnbGV2OworCSAgICAvKmxvY2FsLT5zcHlfc3RhdFtpXS5ub2lzZSA9IG5vbmUgPyAqLworCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDB4MjsKKwkgIH0KKyAgICB9CisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCit9IC8qIGVuZCByeF9kYXRhICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworICAgIHNuYXBoZHJfdCAqcHNuYXAgPSAoc25hcGhkcl90ICopKHNrYi0+ZGF0YSArIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICBzdHJ1Y3QgbWFjX2hlYWRlciAqcG1hYyA9IChzdHJ1Y3QgbWFjX2hlYWRlciAqKXNrYi0+ZGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlID0gKih1bnNpZ25lZCBzaG9ydCAqKXBzbmFwLT5ldGhlcnR5cGU7CisgICAgdW5zaWduZWQgaW50IHhzYXAgPSAqKHVuc2lnbmVkIGludCAqKXBzbmFwICYgMHgwMGZmZmZmZjsKKyAgICB1bnNpZ25lZCBpbnQgb3JnID0gKCoodW5zaWduZWQgaW50ICopcHNuYXAtPm9yZykgJiAweDAwZmZmZmZmOworICAgIGludCBkZWx0YTsKKyAgICBzdHJ1Y3QgZXRoaGRyICpwZXRoOworICAgIFVDSEFSIHNyY2FkZHJbQUREUkxFTl07CisgICAgVUNIQVIgZGVzdGFkZHJbQUREUkxFTl07CisKKyAgICBpZiAocG1hYy0+ZnJhbWVfY3RsXzIgJiBGQzJfRlJPTV9EUykgeworCWlmIChwbWFjLT5mcmFtZV9jdGxfMiAmIEZDMl9UT19EUykgeyAvKiBBUCB0byBBUCAqLworCSAgICBtZW1jcHkoZGVzdGFkZHIsIHBtYWMtPmFkZHJfMywgQUREUkxFTik7CisJICAgIG1lbWNweShzcmNhZGRyLCAoKHVuc2lnbmVkIGNoYXIgKilwbWFjLT5hZGRyXzMpICsgQUREUkxFTiwgQUREUkxFTik7CisJfSBlbHNlIHsgLyogQVAgdG8gdGVybWluYWwgKi8KKwkgICAgbWVtY3B5KGRlc3RhZGRyLCBwbWFjLT5hZGRyXzEsIEFERFJMRU4pOworCSAgICBtZW1jcHkoc3JjYWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsgCisJfQorICAgIH0gZWxzZSB7IC8qIFRlcm1pbmFsIHRvIEFQICovCisJaWYgKHBtYWMtPmZyYW1lX2N0bF8yICYgRkMyX1RPX0RTKSB7CisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0gZWxzZSB7IC8qIEFkaG9jICovCisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8xLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0KKyAgICB9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBiZWZvcmUgdW50cmFuc2xhdGUiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykgCisgICAgICAgIHByaW50aygiJTAyeCAiLHNrYi0+ZGF0YVtpXSk7CisgICAgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAidHlwZSA9ICUwOHgsIHhzYXAgPSAlMDh4LCBvcmcgPSAlMDh4XG4iLAorICAgICAgICAgICB0eXBlLHhzYXAsb3JnKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidW50cmFuc2xhdGUgc2tiLT5kYXRhID0gJXBcbiIsc2tiLT5kYXRhKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggeHNhcCAhPSBTTkFQX0lEKSB7CisgICAgICAgIC8qIG5vdCBhIHNuYXAgdHlwZSBzbyBsZWF2ZSBpdCBhbG9uZSAqLworICAgICAgICBERUJVRygzLCJyYXlfY3MgdW50cmFuc2xhdGUgTk9UIFNOQVAgJXhcbiIsICoodW5zaWduZWQgaW50ICopcHNuYXAgJiAweDAwZmZmZmZmKTsKKworICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgfQorICAgIGVsc2UgeyAvKiBJdHMgYSBTTkFQICovCisgICAgICAgIGlmIChvcmcgPT0gQlJJREdFX0VOQ0FQKSB7IC8qIEV0aGVySUkgYW5kIG51a2UgdGhlIExMQyAgKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHVudHJhbnNsYXRlIEJyaWRnZSBlbmNhcFxuIik7CisgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIAorICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBzbmFwaGRyX3QpIC0gRVRIX0hMRU47CisgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgcGV0aC0+aF9wcm90byA9IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAob3JnID09IFJGQzEwNDJfRU5DQVApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJBWV9JUFhfVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIEFQUExFQVJQX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgSVBYL0FBUlBcbiIpOworICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgZGVmYXVsdFxuIik7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSAtIEVUSF9ITEVOOworICAgICAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgICAgICBwZXRoLT5oX3Byb3RvID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJyYXlfY3MgdW50cmFuc2xhdGUgdmVyeSBjb25mdXNlZCBieSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggLSBFVEhfSExFTjsKKyAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLyogVEJEIHJlc2VydmUgIHNrYl9yZXNlcnZlKHNrYiwgZGVsdGEpOyAqLworICAgIHNrYl9wdWxsKHNrYiwgZGVsdGEpOworICAgIERFQlVHKDMsInVudHJhbnNsYXRlIGFmdGVyIHNrYl9wdWxsKCVkKSwgc2tiLT5kYXRhID0gJXBcbiIsZGVsdGEsc2tiLT5kYXRhKTsKKyAgICBtZW1jcHkocGV0aC0+aF9kZXN0LCBkZXN0YWRkciwgQUREUkxFTik7CisgICAgbWVtY3B5KHBldGgtPmhfc291cmNlLCBzcmNhZGRyLCBBRERSTEVOKTsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBhZnRlciB1bnRyYW5zbGF0ZToiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykKKyAgICAgICAgcHJpbnRrKCIlMDJ4ICIsc2tiLT5kYXRhW2ldKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgfQorI2VuZGlmCit9IC8qIGVuZCB1bnRyYW5zbGF0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgcmVjZWl2ZSBidWZmZXIgdG8gUEMgbWVtb3J5LgorICogZGVzdCAgICAgPSBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIFBDIG1lbW9yeQorICogcGt0X2FkZHIgPSBzb3VyY2UgYWRkcmVzcyBpbiByZWNlaXZlIGJ1ZmZlcgorICogbGVuICAgICAgPSBsZW5ndGggb2YgcGFja2V0IHRvIGNvcHkKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fcnhfYnVmZihyYXlfZGV2X3QgKmxvY2FsLCBVQ0hBUiAqZGVzdCwgaW50IHBrdF9hZGRyLCBpbnQgbGVuZ3RoKQoreworICAgIGludCB3cmFwX2J5dGVzID0gKHBrdF9hZGRyICsgbGVuZ3RoKSAtIChSWF9CVUZGX0VORCArIDEpOworICAgIGlmICh3cmFwX2J5dGVzIDw9IDApCisgICAgeworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QsbG9jYWwtPnJtZW0gKyBwa3RfYWRkcixsZW5ndGgpOworICAgIH0KKyAgICBlbHNlIC8qIFBhY2tldCB3cmFwcGVkIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIHsKKyAgICAgICAgbWVtY3B5X2Zyb21pbyhkZXN0LGxvY2FsLT5ybWVtK3BrdF9hZGRyLGxlbmd0aCAtIHdyYXBfYnl0ZXMpOworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QgKyBsZW5ndGggLSB3cmFwX2J5dGVzLCBsb2NhbC0+cm1lbSwgd3JhcF9ieXRlcyk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByZWxlYXNlX2ZyYWdfY2hhaW4ocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICogcHJjcykKK3sKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3NsaW5rID0gcHJjczsKKyAgICBpbnQgdG1wID0gMTc7CisgICAgdW5zaWduZWQgcmNzaW5kZXggPSByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KTsKKworICAgIHdoaWxlICh0bXAtLSkgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBiYWQgcmNzaW5kZXggPSAweCV4XG4iLHJjc2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICB9ICAgCisgICAgICAgIHByY3NsaW5rID0gcmNzX2Jhc2UobG9jYWwpICsgcmNzaW5kZXg7CisgICAgICAgIHJjc2luZGV4ID0gcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgIH0KKyAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgREVCVUcoMCwicmF5X2NzIFN0YXJ0aW5nIGF1dGhlbnRpY2F0aW9uLlxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGF1dGhlbnRpY2F0ZSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgaWYgKGJ1aWxkX2F1dGhfZnJhbWUobG9jYWwsIGxvY2FsLT5ic3NfaWQsIE9QRU5fQVVUSF9SRVFVRVNUKSkgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmYXV0aGVudGljYXRlX3RpbWVvdXQ7CisgICAgfQorICAgIGxvY2FsLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaKjI7CisgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVdBSVRJTkdfUkVTUE9OU0U7Cit9IC8qIGVuZCBhdXRoZW50aWNhdGUgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJ4X2F1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisgICAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyAgICAKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisKKyAgICBjb3B5X2Zyb21fcnhfYnVmZihsb2NhbCwgYnVmZiwgcGt0X2FkZHIsIHJ4X2xlbiAmIDB4ZmYpOworICAgIC8qIGlmIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IGF1dGhlbnRpY2F0ZWQgKi8KKyAgICBpZiAobG9jYWwtPnNwYXJtLmI0LmFfbmV0d29ya190eXBlID09IEFESE9DKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9hdXRoIHZhcj0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG1zZy0+dmFyWzBdLG1zZy0+dmFyWzFdLG1zZy0+dmFyWzJdLG1zZy0+dmFyWzNdLG1zZy0+dmFyWzRdLG1zZy0+dmFyWzVdKTsKKyAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVzcG9uc2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZF9hdXRoX2ZyYW1lIChsb2NhbCwgbXNnLT5tYWMuYWRkcl8yLCBPUEVOX0FVVEhfUkVTUE9OU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBORUVEX1RPX0FVVEg7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobG9jYWwtPmF1dGhfaWQsIG1zZy0+bWFjLmFkZHJfMiwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIEluZnJhc3RydWN0dXJlIG5ldHdvcmsgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPT0gQVdBSVRJTkdfUkVTUE9OU0UpIHsKKyAgICAgICAgICAgIC8qIFZlcmlmeSBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZSAjMiBhbmQgc3VjY2VzcyAqLworICAgICAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1zZy0+dmFyWzNdIHwgbXNnLT52YXJbNF0pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMSwiQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVVUSF9DT01QTEVURTsKKyAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsIkF1dGhlbnRpY2F0aW9uIHJlZnVzZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FVVEhfUkVGVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9IFVOQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30gLyogZW5kIHJ4X2F1dGhlbnRpY2F0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXNzb2NpYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGludCBjY3NpbmRleDsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgYXNzb2NpYXRlIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKy8qIFRCRCBzaG91bGQgbmV2ZXIgYmUgaGVyZSBidXQuLi4gd2hhdCBpZiB3ZSBhcmU/ICovCisgICAgICAgIERFQlVHKDEsInJheV9jcyBhc3NvY2lhdGUgLSBObyBmcmVlIGNjc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgREVCVUcoMSwicmF5X2NzIFN0YXJ0aW5nIGFzc29jaWF0aW9uIHdpdGggYWNjZXNzIHBvaW50XG4iKTsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19TVEFSVF9BU1NPQ0lBVElPTiwgJnBjY3MtPmNtZCk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgYXNzb2NpYXRlIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworCisgICAgICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMjsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJmpvaW5fbmV0OworICAgICAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVNTT0NfRkFJTEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghc25pZmZlcikgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworfSAvKiBlbmQgYXNzb2NpYXRlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kZWF1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisvKiAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyovCisgICAgREVCVUcoMCwiRGVhdXRoZW50aWNhdGlvbiBmcmFtZSByZWNlaXZlZFxuIik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIC8qIE5lZWQgdG8gcmVhdXRoZW50aWNhdGUgb3IgcmVqb2luIGRlcGVuZGluZyBvbiByZWFzb24gY29kZSAqLworLyogIGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCBidWZmLCBwa3RfYWRkciwgcnhfbGVuICYgMHhmZik7CisgKi8KK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGNsZWFyX2ludGVycnVwdChyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIHdyaXRlYigwLCBsb2NhbC0+YW1lbSArIENJU19PRkZTRVQgKyBIQ1NfSU5UUl9PRkZTRVQpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjZGVmaW5lIE1BWERBVEEgKFBBR0VfU0laRSAtIDgwKQorCitzdGF0aWMgY2hhciAqY2FyZF9zdGF0dXNbXSA9IHsKKyAgICAiQ2FyZCBpbnNlcnRlZCAtIHVuaW5pdGlhbGl6ZWQiLCAgICAgLyogMCAqLworICAgICJDYXJkIG5vdCBkb3dubG9hZGVkIiwgICAgICAgICAgICAgICAvKiAxICovCisgICAgIldhaXRpbmcgZm9yIGRvd25sb2FkIHBhcmFtZXRlcnMiLCAgIC8qIDIgKi8KKyAgICAiQ2FyZCBkb2luZyBhY3F1aXNpdGlvbiIsICAgICAgICAgICAgLyogMyAqLworICAgICJBY3F1aXNpdGlvbiBjb21wbGV0ZSIsICAgICAgICAgICAgICAvKiA0ICovCisgICAgIkF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIiwgICAgICAgICAgIC8qIDUgKi8KKyAgICAiQXNzb2NpYXRpb24gY29tcGxldGUiLCAgICAgICAgICAgICAgLyogNiAqLworICAgICI/Pz8iLCAiPz8/IiwgIj8/PyIsICI/Pz8iLCAgICAgICAgICAvKiA3IDggOSAxMCB1bmRlZmluZWQgKi8KKyAgICAiQ2FyZCBpbml0IGVycm9yIiwgICAgICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgICAiRG93bmxvYWQgcGFyYW1ldGVycyBlcnJvciIsICAgICAgICAgLyogMTIgKi8KKyAgICAiPz8/IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICAiQWNxdWlzaXRpb24gZmFpbGVkIiwgICAgICAgICAgICAgICAgLyogMTQgKi8KKyAgICAiQXV0aGVudGljYXRpb24gcmVmdXNlZCIsICAgICAgICAgICAgLyogMTUgKi8KKyAgICAiQXNzb2NpYXRpb24gZmFpbGVkIiAgICAgICAgICAgICAgICAgLyogMTYgKi8KK307CisKK3N0YXRpYyBjaGFyICpuZXR0eXBlW10gPSB7IkFkaG9jIiwgIkluZnJhICJ9Oworc3RhdGljIGNoYXIgKmZyYW1pbmdbXSA9IHsiRW5jYXBzdWxhdGlvbiIsICJUcmFuc2xhdGlvbiJ9Cis7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9jc19wcm9jX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKy8qIFByaW50IGN1cnJlbnQgdmFsdWVzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHZpYSBvdGhlciBtZWFucworICogZWcgaWZjb25maWcgCisgKi8KKyAgICBpbnQgaTsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgcmF5X2Rldl90ICpsb2NhbDsKKyAgICBVQ0hBUiAqcDsKKyAgICBzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqcGZoOworICAgIFVDSEFSIGNbMzNdOworCisgICAgbGluayA9IGRldl9saXN0OworICAgIGlmICghbGluaykKKyAgICAJcmV0dXJuIDA7CisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbGluay0+cHJpdjsKKyAgICBpZiAoIWRldikKKyAgICAJcmV0dXJuIDA7CisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGlmICghbG9jYWwpCisgICAgCXJldHVybiAwOworCisgICAgbGVuID0gMDsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlJheWxpbmsgV2lyZWxlc3MgTEFOIGRyaXZlciBzdGF0dXNcbiIpOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCByY3NpZCk7CisgICAgLyogYnVpbGQgNCBkb2VzIG5vdCByZXBvcnQgdmVyc2lvbiwgYW5kIGZpZWxkIGlzIDB4NTUgYWZ0ZXIgbWVtdGVzdCAqLworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZpcm13YXJlIHZlcnNpb24gICAgID0gIik7CisgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiNCAtIFVzZSBkdW1wX2NpcyBmb3IgbW9yZSBkZXRhaWxzXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUyZC4lMDJkLiUwMmRcbiIsCisgICAgICAgICAgICAgICAgICAgbG9jYWwtPmZ3X3ZlciwgbG9jYWwtPmZ3X2JsZCwgbG9jYWwtPmZ3X3Zhcik7CisKKyAgICBmb3IgKGk9MDsgaTwzMjsgaSsrKSBjW2ldID0gbG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWRbaV07CisgICAgY1szMl0gPSAwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzIG5ldHdvcmsgRVNTSUQgPSBcIiVzXCJcbiIsIAorICAgICAgICAgICAgICAgICAgIG5ldHR5cGVbbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlXSwgYyk7CisKKyAgICBwID0gbG9jYWwtPmJzc19pZDsKKyAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sIAorICAgICAgICAgICAgICAgICAgICJCU1NJRCAgICAgICAgICAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgIHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNvdW50cnkgY29kZSAgICAgICAgID0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJfY291bnRyeV9jb2RlKTsKKworICAgIGkgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisgICAgaWYgKGkgPCAwKSBpID0gMTA7CisgICAgaWYgKGkgPiAxNikgaSA9IDEwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNhcmQgc3RhdHVzICAgICAgICAgID0gJXNcbiIsIGNhcmRfc3RhdHVzW2ldKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZyYW1pbmcgbW9kZSAgICAgICAgID0gJXNcbiIsZnJhbWluZ1t0cmFuc2xhdGVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkxhc3QgcGt0IHNpZ25hbCBsdmwgID0gJWRcbiIsIGxvY2FsLT5sYXN0X3JzbCk7CisKKyAgICBpZiAobG9jYWwtPmJlYWNvbl9yeGVkKSB7CisJLyogUHVsbCBzb21lIGZpZWxkcyBvdXQgb2YgbGFzdCBiZWFjb24gcmVjZWl2ZWQgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJCZWFjb24gSW50ZXJ2YWwgICAgICA9ICVkIEt1c1xuIiwgCisJCSAgICAgICBsb2NhbC0+bGFzdF9iY24uYmVhY29uX2ludHZsWzBdCisJCSAgICAgICArIDI1NiAqIGxvY2FsLT5sYXN0X2Jjbi5iZWFjb25faW50dmxbMV0pOworICAgIAorICAgIHAgPSBsb2NhbC0+bGFzdF9iY24uZWxlbWVudHM7CisgICAgaWYgKHBbMF0gPT0gQ19FU1NJRF9FTEVNRU5UX0lEKSBwICs9IHBbMV0gKyAyOworICAgIGVsc2UgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJQYXJzZSBiZWFjb24gZmFpbGVkIGF0IGVzc2lkIGVsZW1lbnQgaWQgPSAlZFxuIixwWzBdKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBpZiAocFswXSA9PSBDX1NVUFBPUlRFRF9SQVRFU19FTEVNRU5UX0lEKSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlN1cHBvcnRlZCByYXRlIGNvZGVzID0gIik7CisgICAgICAgIGZvciAoaT0yOyBpPHBbMV0gKyAyOyBpKyspIAorICAgICAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiMHglMDJ4ICIsIHBbaV0pOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworICAgICAgICBwICs9IHBbMV0gKyAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUGFyc2UgYmVhY29uIGZhaWxlZCBhdCByYXRlcyBlbGVtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKwlpZiAocFswXSA9PSBDX0ZIX1BBUkFNX1NFVF9FTEVNRU5UX0lEKSB7CisJICAgIHBmaCA9IChzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqKXA7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBkd2VsbCAgICAgICAgICAgID0gJWQgS3VzXG4iLAorCQkJICAgcGZoLT5kd2VsbF90aW1lWzBdICsgMjU2ICogcGZoLT5kd2VsbF90aW1lWzFdKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIHNldCAgICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX3NldCk7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBwYXR0ZXJuICAgICAgICAgID0gJWQgXG4iLCBwZmgtPmhvcF9wYXR0ZXJuKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIGluZGV4ICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX2luZGV4KTsKKwkgICAgcCArPSBwWzFdICsgMjsKKwl9CisJZWxzZSB7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlBhcnNlIGJlYWNvbiBmYWlsZWQgYXQgRkggcGFyYW0gZWxlbWVudFxuIik7CisJICAgIHJldHVybiBsZW47CisJfQorICAgIH0gZWxzZSB7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTm8gYmVhY29ucyByZWNlaXZlZFxuIik7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKQoreworICAgIGludCBhZGRyOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsKKyAgICBpbnQgY2NzaW5kZXg7CisKKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX3R4X2Njcyhsb2NhbCkpIDwgMCkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBzZW5kIGF1dGhlbnRpY2F0ZSAtIE5vIGZyZWUgdHggY2NzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKworICAgIC8qIEFkZHJlc3MgaW4gY2FyZCBzcGFjZSAqLworICAgIGFkZHIgPSBUWF9CVUZfQkFTRSArIChjY3NpbmRleCA8PCAxMSk7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19UWF9SRVFVRVNULCAmcGNjcy0+Y21kKTsKKyAgICB3cml0ZWIoYWRkciA+PiA4LCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0cik7CisgICAgd3JpdGViKDB4MjAsIHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfcHRyICsgMSk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCLCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX2xlbmd0aCk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCLHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoICsgMSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworCisgICAgcHR4ID0gbG9jYWwtPnNyYW0gKyBhZGRyOworICAgIC8qIGZpbGwgaW4gdGhlIG1hYyBoZWFkZXIgKi8KKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgQVVUSEVOVElDX1RZUEUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisgICAgd3JpdGViKDAsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisKKyAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGRlc3QsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMiwgbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHIsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisKKyAgICAvKiBGaWxsIGluIG1zZyBib2R5IHdpdGggcHJvdG9jb2wgMDAgMDAsIHNlcXVlbmNlIDAxIDAwICxzdGF0dXMgMDAgMDAgKi8KKyAgICBtZW1zZXRfaW8ocHR4LT52YXIsIDAsIDYpOworICAgIHdyaXRlYihhdXRoX3R5cGUgJiAweGZmLCBwdHgtPnZhciArIDIpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2VuZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBFbmQgYnVpbGRfYXV0aF9mcmFtZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkIHJheWNzX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBlbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZW50cnkpIHsKKwkJZW50cnktPndyaXRlX3Byb2MgPSB3OworCQllbnRyeS0+ZGF0YSA9IGRhdGE7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2Vzc2lkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjaGFyIHByb2NfZXNzaWRbMzNdOworCWludCBsZW4gPSBjb3VudDsKKworCWlmIChsZW4gPiAzMikKKwkJbGVuID0gMzI7CisJbWVtc2V0KHByb2NfZXNzaWQsIDAsIDMzKTsKKwlpZiAoY29weV9mcm9tX3VzZXIocHJvY19lc3NpZCwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwllc3NpZCA9IHByb2NfZXNzaWQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdyaXRlX2ludChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgY2hhciBwcm9jX251bWJlclsxMF07CisJY2hhciAqcDsKKwlpbnQgbnIsIGxlbjsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID4gOSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKHByb2NfbnVtYmVyLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcCA9IHByb2NfbnVtYmVyOworCW5yID0gMDsKKwlsZW4gPSBjb3VudDsKKwlkbyB7CisJCXVuc2lnbmVkIGludCBjID0gKnAgLSAnMCc7CisJCWlmIChjID4gOSkKKwkJCXJldHVybiAtRUlOVkFMOworCQluciA9IG5yKjEwICsgYzsKKwkJcCsrOworCX0gd2hpbGUgKC0tbGVuKTsKKwkqKGludCAqKWRhdGEgPSBucjsKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHJheV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJyYXlfY3MiLAorCX0sCisJLmF0dGFjaAkJPSByYXlfYXR0YWNoLAorCS5kZXRhY2gJCT0gcmF5X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmF5X2NzKHZvaWQpCit7CisgICAgaW50IHJjOworICAgIAorICAgIERFQlVHKDEsICIlc1xuIiwgcmNzaWQpOworICAgIHJjID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgREVCVUcoMSwgInJheWxpbmsgaW5pdF9tb2R1bGUgcmVnaXN0ZXJfcGNtY2lhX2RyaXZlciByZXR1cm5zIDB4JXhcbiIscmMpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICBwcm9jX21rZGlyKCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisKKyAgICBjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3JheV9jcyIsIDAsIE5VTEwsICZyYXlfY3NfcHJvY19yZWFkKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9lc3NpZCIsIHdyaXRlX2Vzc2lkLCBOVUxMKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIHdyaXRlX2ludCwgJm5ldF90eXBlKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy90cmFuc2xhdGUiLCB3cml0ZV9pbnQsICZ0cmFuc2xhdGUpOworI2VuZGlmCisgICAgaWYgKHRyYW5zbGF0ZSAhPSAwKSB0cmFuc2xhdGUgPSAxOworICAgIHJldHVybiAwOworfSAvKiBpbml0X3JheV9jcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JheV9jcyh2b2lkKQoreworICAgIERFQlVHKDAsICJyYXlfY3M6IGNsZWFudXBfbW9kdWxlXG4iKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvcmF5X2NzIiwgTlVMTCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvZXNzaWQiLCBOVUxMKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3RyYW5zbGF0ZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisjZW5kaWYKKworICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfSAvKiBleGl0X3JheV9jcyAqLworCittb2R1bGVfaW5pdChpbml0X3JheV9jcyk7Cittb2R1bGVfZXhpdChleGl0X3JheV9jcyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIFJheXRoZW9uIHdpcmVsZXNzIExBTiBQQ01DSUEgY2FyZCBkcml2ZXIgZm9yIExpbnV4IAorICAgQSAgUENNQ0lBIGNsaWVudCBkcml2ZXIgZm9yIHRoZSBSYXlsaW5rIHdpcmVsZXNzIG5ldHdvcmsgY2FyZAorICAgV3JpdHRlbiBieSBDb3JleSBUaG9tYXMKKyovCisKKyNpZm5kZWYgUkFZTElOS19ICisKK3N0cnVjdCBiZWFjb25fcnggeworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHRpbV9lbGVtZW50KV07Cit9OworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBnZXRfZnJlZXssX3R4fV9jY3MgKi8KKyNkZWZpbmUgRUNDU0ZVTEwgICgtMSkKKyNkZWZpbmUgRUNDU0JVU1kgICgtMikKKyNkZWZpbmUgRUNBUkRHT05FICgtMykKKwordHlwZWRlZiBzdHJ1Y3QgcmF5X2Rldl90IHsKKyAgICBpbnQgY2FyZF9zdGF0dXM7CisgICAgaW50IGF1dGhlbnRpY2F0aW9uX3N0YXRlOworICAgIGRldl9ub2RlX3QgIG5vZGU7CisgICAgd2luZG93X2hhbmRsZV90IGFtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIGF0dHJpYnV0ZSBtZW1vcnkgICovCisgICAgd2luZG93X2hhbmRsZV90IHJtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIHJ4IGJ1ZmZlciBvbiBjYXJkICovCisgICAgdm9pZCBfX2lvbWVtICpzcmFtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHNoYXJlZCBSQU0gICAgICovCisgICAgdm9pZCBfX2lvbWVtICphbWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXR0cmlidXRlIG1lbSB3aW5kb3cgICAgICAgICovCisgICAgdm9pZCBfX2lvbWVtICpybWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBidWZmZXIgd2luZG93ICAgICAgICovCisgICAgZGV2X2xpbmtfdCAqZmluZGVyOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byBkZXZfbGlua190IGZvciBjYXJkICAgICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisgICAgbG9uZyB0eF9jY3NfbG9jazsKKyAgICBsb25nIGNjc19sb2NrOworICAgIGludCAgIGRsX3BhcmFtX2NjczsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcyBiNDsKKyAgICAgICAgc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zIGI1OworICAgIH0gc3Bhcm07CisgICAgaW50IHRpbWVvdXRfZmxhZzsKKyAgICBVQ0hBUiBzdXBwb3J0ZWRfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBzdHJ1Y3Qgc3RhcnR1cF9yZXNfNiBzdGFydHVwX3JlczsKKyAgICBpbnQgbnVtX211bHRpOworICAgIC8qIE5ldHdvcmsgcGFyYW1ldGVycyBmcm9tIHN0YXJ0L2pvaW4gKi8KKyAgICBVQ0hBUiBic3NfaWRbNl07CisgICAgVUNIQVIgYXV0aF9pZFs2XTsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgICBVQ0hBUiBuZXRfdHlwZTsKKyAgICBVQ0hBUiBzdGFfdHlwZTsKKyAgICBVQ0hBUiBmd192ZXI7CisgICAgVUNIQVIgZndfYmxkOworICAgIFVDSEFSIGZ3X3ZhcjsKKyAgICBVQ0hBUiBBU0lDX3ZlcnNpb247CisgICAgVUNIQVIgYXNzb2NfaWRbMl07CisgICAgVUNIQVIgdGliX2xlbmd0aDsKKyAgICBVQ0hBUiBsYXN0X3JzbDsKKyAgICBpbnQgYmVhY29uX3J4ZWQ7CisgICAgc3RydWN0IGJlYWNvbl9yeCBsYXN0X2JjbjsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcyBzcGVjaWZpYyBzdGF0cyAqLworI2VuZGlmCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50CQlzcHlfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBtYWNfYWRkcglzcHlfYWRkcmVzc1tJV19NQVhfU1BZICsgMV07CS8qIFRoZSBhZGRyZXNzZXMgdG8gc3B5ICovCisgICAgaXdfcXVhbAlzcHlfc3RhdFtJV19NQVhfU1BZICsgMV07CS8qIFN0YXRpc3RpY3MgZ2F0aGVyZWQgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworfSByYXlfZGV2X3Q7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBSQVlMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5Y3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCkBAIC0wLDAgKzEsNzMyIEBACisjaWZuZGVmIFJBWUxJTktfSAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7CisKKy8qKioqKiogSUVFRSA4MDIuMTEgY29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUREUkxFTiAgICAgICAgICAgNgorLyogRnJhbWUgY29udHJvbCAxIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUFJPVE9DT0xfVkVSICAgICAgMHgwMAorI2RlZmluZSBEQVRBX1RZUEUgICAgICAgICAweDA4CisjZGVmaW5lIEFTU09DX1JFUV9UWVBFICAgIDB4MDAKKyNkZWZpbmUgQVNTT0NfUkVTUF9UWVBFICAgMHgxMAorI2RlZmluZSBSRUFTU09DX1JFUV9UWVBFICAweDIwCisjZGVmaW5lIFJFQVNTT0NfUkVTUF9UWVBFIDB4MzAKKyNkZWZpbmUgTlVMTF9NU0dfVFlQRSAgICAgMHg0OAorI2RlZmluZSBCRUFDT05fVFlQRSAgICAgICAweDgwCisjZGVmaW5lIERJU0FTU09DX1RZUEUgICAgIDB4QTAKKyNkZWZpbmUgUFNQT0xMX1RZUEUgICAgICAgMHhBNAorI2RlZmluZSBBVVRIRU5USUNfVFlQRSAgICAweEIwCisjZGVmaW5lIERFQVVUSEVOVElDX1RZUEUgIDB4QzAKKy8qIEZyYW1lIGNvbnRyb2wgMiBiaXQgZmllbGRzICovCisjZGVmaW5lIEZDMl9UT19EUyAgICAgICAgIDB4MDEKKyNkZWZpbmUgRkMyX0ZST01fRFMgICAgICAgMHgwMgorI2RlZmluZSBGQzJfTU9SRV9GUkFHICAgICAweDA0CisjZGVmaW5lIEZDMl9SRVRSWSAgICAgICAgIDB4MDgKKyNkZWZpbmUgRkMyX1BTTSAgICAgICAgICAgMHgxMAorI2RlZmluZSBGQzJfTU9SRV9EQVRBICAgICAweDIwCisjZGVmaW5lIEZDMl9XRVAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRkMyX09SREVSICAgICAgICAgMHg4MAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogODAyLjExIGVsZW1lbnQgSUQncyBhbmQgbGVuZ3RocyAqLworI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfRVNTICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX0lCU1MgICAgICAgICAgICAweDAyCisjZGVmaW5lIENfQlBfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAgICAgMHgwNAorI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUIDB4MDgKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX1BSSVZBQ1kgICAgICAgICAweDEwCisKKyNkZWZpbmUgQ19FU1NJRF9FTEVNRU5UX0lEICAgICAgICAgICAgICAgMAorI2RlZmluZSBDX0VTU0lEX0VMRU1FTlRfTUFYX0xFTkdUSCAgICAgICAzMgorCisjZGVmaW5lIENfU1VQUE9SVEVEX1JBVEVTX0VMRU1FTlRfSUQgICAgIDEKKyNkZWZpbmUgQ19TVVBQT1JURURfUkFURVNfRUxFTUVOVF9MRU5HVEggMgorCisjZGVmaW5lIENfRkhfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDIKKyNkZWZpbmUgQ19GSF9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNQorCisjZGVmaW5lIENfQ0ZfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDQKKyNkZWZpbmUgQ19DRl9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNgorCisjZGVmaW5lIENfVElNX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ19USU1fQklUTUFQX0xFTkdUSCAgICAgICAgICAgIDI1MQorI2RlZmluZSBDX1RJTV9CTUNBU1RfQklUICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgQ19JQlNTX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDX0lCU1NfRUxFTUVOVF9MRU5HVEggICAgICAgICAgICAyCisKKyNkZWZpbmUgQ19KQVBBTl9DQUxMX1NJR05fRUxFTUVOVF9JRCAgICA1MQorI2RlZmluZSBDX0pBUEFOX0NBTExfU0lHTl9FTEVNRU5UX0xOR1RIIDEyCisKKyNkZWZpbmUgQ19ESVNBU1NPQ19SRUFTT05fQ09ERV9MRU4gICAgICAgMgorI2RlZmluZSBDX0RJU0FTU09DX1JFQVNPTl9DT0RFX0RFRkFVTFQgICA4CisKKyNkZWZpbmUgQ19DUkNfTEVOICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDX05VTV9TVVBQT1JURURfUkFURVMgICAgICAgICAgICA4IAorLyoqKioqKiBJRUVFIDgwMi4xMSBtYWMgaGVhZGVyIGZvciB0eXBlIGRhdGEgcGFja2V0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG1hY19oZWFkZXIgeworICBVQ0hBUiBmcmFtZV9jdGxfMTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBVQ0hBUiBmcmFtZV9jdGxfMjsKKyAgVUNIQVIgZHVyYXRpb25fbHNiOworICBVQ0hBUiBkdXJhdGlvbl9tc2I7CisgIFVDSEFSIGFkZHJfMVtBRERSTEVOXTsKKyAgVUNIQVIgYWRkcl8yW0FERFJMRU5dOworICBVQ0hBUiBhZGRyXzNbQUREUkxFTl07CisgIFVDSEFSIHNlcV9mcmFnX251bVsyXTsKKy8qICBVQ0hBUiBhZGRyXzRbQUREUkxFTl07ICovLyogb25seSBwcmVzZW50IGZvciBBUCB0byBBUCAoVE8gRFMgYW5kIEZST00gRFMgKi8KK307CisvKioqKioqIElFRUUgODAyLjExIGZyYW1lIGVsZW1lbnQgc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZXNzaWRfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB0ZXh0W0NfRVNTSURfRUxFTUVOVF9NQVhfTEVOR1RIXTsKK307CitzdHJ1Y3QgcmF0ZXNfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB2YWx1ZVs4XTsKK307CitzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkd2VsbF90aW1lWzJdOworICBVQ0hBUiBob3Bfc2V0OworICBVQ0hBUiBob3BfcGF0dGVybjsKKyAgVUNIQVIgaG9wX2luZGV4OworfTsKK3N0cnVjdCB0aW1fZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkdGltX2NvdW50OworICBVQ0hBUiBkdGltX3BlcmlvZDsgICAgCisgIFVDSEFSIGJpdG1hcF9jb250cm9sOworICBVQ0hBUiB0aW1bQ19USU1fQklUTUFQX0xFTkdUSF07Cit9Oworc3RydWN0IGlic3NfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBhdGltX3dpbmRvd1syXTsKK307CitzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX2VsZW1lbnQKK3sKKyAgVUNIQVIgaWQ7CisgIFVDSEFSIGxlbmd0aDsKKyAgVUNIQVIgY2FsbF9zaWduWzEyXTsKK307CisvKioqKioqIEJlYWNvbiBtZXNzYWdlIHN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAuZWxlbWVudHMgaXMgYSBsYXJnZSBsdW1wIG9mIG1heCBzaXplIGJlY2F1c2UgZWxlbWVudHMgYXJlIHZhcmlhYmxlIHNpemUgICovCitzdHJ1Y3QgaW5mcmFfYmVhY29uCit7CisgICAgVUNIQVIgdGltZXN0YW1wWzhdOworICAgIFVDSEFSIGJlYWNvbl9pbnR2bFsyXTsKKyAgICBVQ0hBUiBjYXBhYmlsaXR5WzJdOworICAgIFVDSEFSIGVsZW1lbnRzW3NpemVvZihzdHJ1Y3QgZXNzaWRfZWxlbWVudCkgCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgcmF0ZXNfZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBmcmVxX2hvcF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBqYXBhbl9jYWxsX3NpZ25fZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCB0aW1fZWxlbWVudCldOworfTsKK3N0cnVjdCBhZGhvY19iZWFjb24KK3sKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGlic3NfZWxlbWVudCldOworfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICNkZWZpbmUgQ19NQUNfSERSXzJfV0VQIDB4NDAgKi8KKy8qIFRYL1JYIENDUyBjb25zdGFudHMgKi8KKyNkZWZpbmUgVFhfSEVBREVSX0xFTkdUSCAweDFDCisjZGVmaW5lIFJYX01BQ19IRUFERVJfTEVOR1RIIDB4MTgKKyNkZWZpbmUgVFhfQVVUSEVOVElDQVRFX0xFTkdUSCAoVFhfSEVBREVSX0xFTkdUSCArIDYpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIID4+IDgpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIIChUWF9IRUFERVJfTEVOR1RIICsgMikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIX01TQiAoVFhfQVVUSEVOVElDQVRFX0xFTkdUSCA+PiA4KQorI2RlZmluZSBUWF9ERUFVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgRkNTX0xFTiAgICAgICAgICAgNAorCisjZGVmaW5lIEFESE9DICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElORlJBICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgVFlQRV9TVEEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9BUCAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVNTSVZFX1NDQU4gICAgICAgICAgMQorI2RlZmluZSBBQ1RJVkVfU0NBTiAgICAgICAgICAgMQorCisjZGVmaW5lIFBTTV9DQU0gICAgICAgICAgICAgICAwCisKKy8qIENvdW50cnkgY29kZXMgKi8KKyNkZWZpbmUgVVNBICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRVVST1BFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSkFQQU4gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgS09SRUEgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU1BBSU4gICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRlJBTkNFICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSVNSQUVMICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVVTVFJBTElBICAgICAgICAgICAgIDgKKyNkZWZpbmUgSkFQQU5fVEVTVCAgICAgICAgICAgIDkKKworLyogSG9wIHBhdHRlcm4gbGVuZ3RocyAqLworI2RlZmluZSBVU0FfSE9QX01PRCAgICAgICAgICA3OSAKKyNkZWZpbmUgRVVST1BFX0hPUF9NT0QgICAgICAgNzkgCisjZGVmaW5lIEpBUEFOX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIEtPUkVBX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIFNQQUlOX0hPUF9NT0QgICAgICAgIDI3CisjZGVmaW5lIEZSQU5DRV9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIElTUkFFTF9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIEFVU1RSQUxJQV9IT1BfTU9EICAgIDQ3CisjZGVmaW5lIEpBUEFOX1RFU1RfSE9QX01PRCAgIDIzCisKKyNkZWZpbmUgRVNTSURfU0laRSAgICAgICAgICAgMzIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ0lTIFJlZ2lzdGVyIENvbnN0YW50cyAqLworI2RlZmluZSBDSVNfT0ZGU0VUICAgICAgICAgICAgIDB4MGYwMAorLyogQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIgKDB4MEYwMCkgKi8KKyNkZWZpbmUgQ09SX09GRlNFVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENPUl9TT0ZUX1JFU0VUICAgICAgICAgMHg4MAorI2RlZmluZSBDT1JfTEVWRUxfSVJRICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ09SX0NPTkZJR19OVU0gICAgICAgICAweDAxCisjZGVmaW5lIENPUl9ERUZBVUxUICAgICAgICAgICAgKENPUl9MRVZFTF9JUlEgfCBDT1JfQ09ORklHX05VTSkKKworLyogQ2FyZCBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKDB4MEYwMSkgKi8KKyNkZWZpbmUgQ0NTUl9PRkZTRVQgICAgICAgICAgICAweDAxCisjZGVmaW5lIENDU1JfSE9TVF9JTlRSX1BFTkRJTkcgMHgwMQorI2RlZmluZSBDQ1NSX1BPV0VSX0RPV04gICAgICAgIDB4MDQKKworLyogSENTIEludGVycnVwdCBSZWdpc3RlciAoMHgwRjA1KSAqLworI2RlZmluZSBIQ1NfSU5UUl9PRkZTRVQgICAgICAgIDB4MDUKKy8qICNkZWZpbmUgSENTX0lOVFJfT0ZGU0VUICAgICAgICAweDBBICovCisjZGVmaW5lIEhDU19JTlRSX0NMRUFSICAgICAgICAgMHgwMAorCisvKiBFQ0YgSW50ZXJydXB0IFJlZ2lzdGVyICgweDBGMDYpICovCisjZGVmaW5lIEVDRl9JTlRSX09GRlNFVCAgICAgICAgMHgwNgorLyogI2RlZmluZSBFQ0ZfSU5UUl9PRkZTRVQgICAgICAgIDB4MEMgKi8KKyNkZWZpbmUgRUNGX0lOVFJfU0VUICAgICAgICAgICAweDAxCisKKy8qIEF1dGhvcml6YXRpb24gUmVnaXN0ZXIgMCAoMHgwRjA4KSAqLworI2RlZmluZSBBVVRIXzBfT04gICAgICAgICAgICAgIDB4NTcKKworLyogQXV0aG9yaXphdGlvbiBSZWdpc3RlciAxICgweDBGMDkpICovCisjZGVmaW5lIEFVVEhfMV9PTiAgICAgICAgICAgICAgMHg4MgorCisvKiBQcm9ncmFtIE1vZGUgUmVnaXN0ZXIgKDB4MEYwQSkgKi8KKyNkZWZpbmUgUEMyUE0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDMkNBTCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQQzJNTFNFICAgICAgICAgICAgICAgIDB4MjAKKworLyogUEMgVGVzdCBNb2RlIFJlZ2lzdGVyICgweDBGMEIpICovCisjZGVmaW5lIFBDX1RFU1RfTU9ERSAgICAgICAgICAgMHgwOAorCisvKiBGcmVxdWVuY3kgQ29udHJvbCBXb3JkICgweDBGMTApICovCisvKiBSYW5nZSAweDAyIC0gMHhBNiAqLworCisvKiBUZXN0IE1vZGUgQ29udHJvbCAxLTQgKDB4MEYxNCAtIDB4MEYxNykgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNoYXJlZCBSQU0gQXJlYSAqLworI2RlZmluZSBTQ0JfQkFTRSAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTVEFUVVNfQkFTRSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBIT1NUX1RPX0VDRl9CQVNFICAgICAgIDB4MDIwMAorI2RlZmluZSBFQ0ZfVE9fSE9TVF9CQVNFICAgICAgIDB4MDMwMAorI2RlZmluZSBDQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBSQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJTkZSQV9USU1fQkFTRSAgICAgICAgIDB4MEMwMAorI2RlZmluZSBTU0lEX0xJU1RfQkFTRSAgICAgICAgIDB4MEQwMAorI2RlZmluZSBUWF9CVUZfQkFTRSAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBSWF9CVUZfQkFTRSAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIE5VTUJFUl9PRl9DQ1MgICAgNjQKKyNkZWZpbmUgTlVNQkVSX09GX1JDUyAgICA2NAorLyojZGVmaW5lIE5VTUJFUl9PRl9UWF9DQ1MgMTQgKi8KKyNkZWZpbmUgTlVNQkVSX09GX1RYX0NDUyAxNAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICAgICAgKDIwNDggLSBzaXplb2Yoc3RydWN0IHR4X21zZykpCisjZGVmaW5lIFJYX0JVRkZfRU5EICAgICAgMHgzRkZGCisvKiBWYWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgKi8KKyNkZWZpbmUgQ0NTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgQ0NTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfQ09NUExFVEUgIDIKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfRkFJTEVEICAgIDMKKworLyogVmFsdWVzIGZvciBjbWQgKi8KKyNkZWZpbmUgQ0NTX0RPV05MT0FEX1NUQVJUVVBfUEFSQU1TICAgIDEKKyNkZWZpbmUgQ0NTX1VQREFURV9QQVJBTVMgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0NTX1JFUE9SVF9QQVJBTVMgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCAgICAgIDQKKyNkZWZpbmUgQ0NTX1VQREFURV9QT1dFUl9TQVZJTkdTX01PREUgIDUKKyNkZWZpbmUgQ0NTX1NUQVJUX05FVFdPUksgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0NTX0pPSU5fTkVUV09SSyAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQ0NTX1NUQVJUX0FTU09DSUFUSU9OICAgICAgICAgIDgKKyNkZWZpbmUgQ0NTX1RYX1JFUVVFU1QgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQ0NTX1RFU1RfTUVNT1JZICAgICAgICAgICAgICAweGEKKyNkZWZpbmUgQ0NTX1NIVVRET1dOICAgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgQ0NTX0RVTVBfTUVNT1JZICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgQ0NTX1NUQVJUX1RJTUVSICAgICAgICAgICAgICAweGUKKyNkZWZpbmUgQ0NTX0xBU1RfQ01EICAgICAgICAgICAgICAgICBDQ1NfU1RBUlRfVElNRVIKKworLyogVmFsdWVzIGZvciBsaW5rIGZpZWxkICovCisjZGVmaW5lIENDU19FTkRfTElTVCAgICAgICAgICAgICAgICAgMHhmZgorCisvKiB2YWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgZmllbGQgKi8KKyNkZWZpbmUgUkNTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgUkNTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgUkNTX0NPTVBMRVRFICAgICAgICAgIDIKKyNkZWZpbmUgUkNTX0ZBSUxFRCAgICAgICAgICAgIDMKKyNkZWZpbmUgUkNTX0JVRkZFUl9SRUxFQVNFICAgIDB4RkYKKworLyogdmFsdWVzIGZvciBpbnRlcnJ1cHRfaWQgZmllbGQgKi8KKyNkZWZpbmUgUFJPQ0VTU19SWF9QQUNLRVQgICAgICAgICAgIDB4ODAgLyogKi8KKyNkZWZpbmUgUkVKT0lOX05FVF9DT01QTEVURSAgICAgICAgIDB4ODEgLyogUkNTIElEOiBSZWpvaW4gTmV0IENvbXBsZXRlICovCisjZGVmaW5lIFJPQU1JTkdfSU5JVElBVEVEICAgICAgICAgICAweDgyIC8qIFJDUyBJRDogUm9hbWluZyBJbml0aWF0ZWQgICAqLworI2RlZmluZSBKQVBBTl9DQUxMX1NJR05fUlhEICAgICAgICAgMHg4MyAvKiBSQ1MgSUQ6IE5ldyBKYXBhbiBDYWxsIFNpZ24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IHR5cGVzIGZvciBkdW1wIG1lbW9yeSBjb21tYW5kICovCisjZGVmaW5lIENfTUVNX1BST0cgIDAKKyNkZWZpbmUgQ19NRU1fWERBVEEgMQorI2RlZmluZSBDX01FTV9TRlIgICAyCisjZGVmaW5lIENfTUVNX0lEQVRBIDMKKworLyoqKiBSZXR1cm4gdmFsdWVzIGZvciBod194bWl0ICoqKioqKioqKiovCisjZGVmaW5lIFhNSVRfT0sgICAgICAgICgwKQorI2RlZmluZSBYTUlUX01TR19CQUQgICAoLTEpCisjZGVmaW5lIFhNSVRfTk9fQ0NTICAgICgtMikKKyNkZWZpbmUgWE1JVF9OT19JTlRSICAgKC0zKQorI2RlZmluZSBYTUlUX05FRURfQVVUSCAoLTQpCisKKy8qKiogVmFsdWVzIGZvciBjYXJkIHN0YXR1cyAqLworI2RlZmluZSBDQVJEX0lOU0VSVEVEICAgICAgICgwKQorCisjZGVmaW5lIENBUkRfQVdBSVRJTkdfUEFSQU0gKDEpCisjZGVmaW5lIENBUkRfSU5JVF9FUlJPUiAgICAgKDExKQorCisjZGVmaW5lIENBUkRfRExfUEFSQU0gICAgICAgKDIpCisjZGVmaW5lIENBUkRfRExfUEFSQU1fRVJST1IgKDEyKQorCisjZGVmaW5lIENBUkRfRE9JTkdfQUNRICAgICAgKDMpCisKKyNkZWZpbmUgQ0FSRF9BQ1FfQ09NUExFVEUgICAoNCkKKyNkZWZpbmUgQ0FSRF9BQ1FfRkFJTEVEICAgICAoMTQpCisKKyNkZWZpbmUgQ0FSRF9BVVRIX0NPTVBMRVRFICAoNSkKKyNkZWZpbmUgQ0FSRF9BVVRIX1JFRlVTRUQgICAoMTUpCisKKyNkZWZpbmUgQ0FSRF9BU1NPQ19DT01QTEVURSAoNikKKyNkZWZpbmUgQ0FSRF9BU1NPQ19GQUlMRUQgICAoMTYpCisKKy8qKiogVmFsdWVzIGZvciBhdXRoZW50aWNhdGlvbl9zdGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVU5BVVRIRU5USUNBVEVEICAgICAoMCkKKyNkZWZpbmUgQVdBSVRJTkdfUkVTUE9OU0UgICAoMSkKKyNkZWZpbmUgQVVUSEVOVElDQVRFRCAgICAgICAoMikKKyNkZWZpbmUgTkVFRF9UT19BVVRIICAgICAgICAoMykKKworLyoqKiBWYWx1ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPUEVOX0FVVEhfUkVRVUVTVCAgICgxKQorI2RlZmluZSBPUEVOX0FVVEhfUkVTUE9OU0UgICgyKQorI2RlZmluZSBCUk9BRENBU1RfREVBVVRIICAgICgweGMwKQorLyoqKiBWYWx1ZXMgZm9yIHRpbWVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUT0RPX05PVEhJTkcgICAgICAgICAgICAgICgwKQorI2RlZmluZSBUT0RPX1ZFUklGWV9ETF9TVEFSVCAgICAgICgtMSkKKyNkZWZpbmUgVE9ET19TVEFSVF9ORVQgICAgICAgICAgICAoLTIpCisjZGVmaW5lIFRPRE9fSk9JTl9ORVQgICAgICAgICAgICAgKC0zKQorI2RlZmluZSBUT0RPX0FVVEhFTlRJQ0FURV9USU1FT1VUICgtNCkKKyNkZWZpbmUgVE9ET19TRU5EX0NDUyAgICAgICAgICAgICAoLTUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQYXJhbWV0ZXIgcGFzc2luZyBzdHJ1Y3R1cmUgZm9yIHVwZGF0ZS9yZXBvcnQgcGFyYW1ldGVyIENDUydzICovCitzdHJ1Y3Qgb2JqZWN0X2lkIHsKKyAgICB2b2lkICAgICAgICAgICpvYmplY3RfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIG9iamVjdF9sZW5ndGg7Cit9OworCisjZGVmaW5lIE9CSklEX25ldHdvcmtfdHlwZSAgICAgICAgICAgIDAKKyNkZWZpbmUgT0JKSURfYWN0aW5nX2FzX2FwX3N0YXR1cyAgICAgMQorI2RlZmluZSBPQkpJRF9jdXJyZW50X2Vzc19pZCAgICAgICAgICAyCisjZGVmaW5lIE9CSklEX3NjYW5uaW5nX21vZGUgICAgICAgICAgIDMKKyNkZWZpbmUgT0JKSURfcG93ZXJfbWd0X3N0YXRlICAgICAgICAgNAorI2RlZmluZSBPQkpJRF9tYWNfYWRkcmVzcyAgICAgICAgICAgICA1CisjZGVmaW5lIE9CSklEX2ZyYWdfdGhyZXNob2xkICAgICAgICAgIDYKKyNkZWZpbmUgT0JKSURfaG9wX3RpbWUgICAgICAgICAgICAgICAgNworI2RlZmluZSBPQkpJRF9iZWFjb25fcGVyaW9kICAgICAgICAgICA4CisjZGVmaW5lIE9CSklEX2R0aW1fcGVyaW9kICAgICAgICAgICAgIDkKKyNkZWZpbmUgT0JKSURfcmV0cnlfbWF4ICAgICAgICAgICAgICAxMAorI2RlZmluZSBPQkpJRF9hY2tfdGltZW91dCAgICAgICAgICAgIDExCisjZGVmaW5lIE9CSklEX3NpZnMgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgT0JKSURfZGlmcyAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBPQkpJRF9waWZzICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE9CSklEX3J0c190aHJlc2hvbGQgICAgICAgICAgMTUKKyNkZWZpbmUgT0JKSURfc2Nhbl9kd2VsbF90aW1lICAgICAgICAxNgorI2RlZmluZSBPQkpJRF9tYXhfc2Nhbl9kd2VsbF90aW1lICAgIDE3CisjZGVmaW5lIE9CSklEX2Fzc29jX3Jlc3BfdGltZW91dCAgICAgMTgKKyNkZWZpbmUgT0JKSURfYWRob2Nfc2Nhbl9jeWNsZV9tYXggICAxOQorI2RlZmluZSBPQkpJRF9pbmZyYV9zY2FuX2N5Y2xlX21heCAgIDIwCisjZGVmaW5lIE9CSklEX2luZnJhX3N1cGVyX2N5Y2xlX21heCAgMjEKKyNkZWZpbmUgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSAgICAgICAyMgorI2RlZmluZSBPQkpJRF91bmlxdWVfd29yZCAgICAgICAgICAgIDIzCisjZGVmaW5lIE9CSklEX3Nsb3RfdGltZSAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgT0JKSURfcm9hbWluZ19sb3dfc25yICAgICAgICAyNQorI2RlZmluZSBPQkpJRF9sb3dfc25yX2NvdW50X3RocmVzaCAgIDI2CisjZGVmaW5lIE9CSklEX2luZnJhX21pc3NlZF9iY24gICAgICAgMjcKKyNkZWZpbmUgT0JKSURfYWRob2NfbWlzc2VkX2JjbiAgICAgICAyOAorI2RlZmluZSBPQkpJRF9jdXJyX2NvdW50cnlfY29kZSAgICAgIDI5CisjZGVmaW5lIE9CSklEX2hvcF9wYXR0ZXJuICAgICAgICAgICAgMzAKKyNkZWZpbmUgT0JKSURfcmVzZXJ2ZWQgICAgICAgICAgICAgICAzMQorI2RlZmluZSBPQkpJRF9jd19tYXhfbXNiICAgICAgICAgICAgIDMyCisjZGVmaW5lIE9CSklEX2N3X21pbl9tc2IgICAgICAgICAgICAgMzMKKyNkZWZpbmUgT0JKSURfbm9pc2VfZmlsdGVyX2dhaW4gICAgICAzNAorI2RlZmluZSBPQkpJRF9ub2lzZV9saW1pdF9vZmZzZXQgICAgIDM1CisjZGVmaW5lIE9CSklEX2RldF9yc3NpX3RocmVzaF9vZmZzZXQgMzYKKyNkZWZpbmUgT0JKSURfbWVkX2J1c3lfdGhyZXNoX29mZnNldCAzNworI2RlZmluZSBPQkpJRF9kZXRfc3luY190aHJlc2ggICAgICAgIDM4CisjZGVmaW5lIE9CSklEX3Rlc3RfbW9kZSAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgT0JKSURfdGVzdF9taW5fY2hhbl9udW0gICAgICA0MAorI2RlZmluZSBPQkpJRF90ZXN0X21heF9jaGFuX251bSAgICAgIDQxCisjZGVmaW5lIE9CSklEX2FsbG93X2JjYXN0X0lEX3ByYnJzcCAgNDIKKyNkZWZpbmUgT0JKSURfcHJpdmFjeV9tdXN0X3N0YXJ0ICAgICA0MworI2RlZmluZSBPQkpJRF9wcml2YWN5X2Nhbl9qb2luICAgICAgIDQ0CisjZGVmaW5lIE9CSklEX2Jhc2ljX3JhdGVfc2V0ICAgICAgICAgNDUKKworLyoqKiogQ29uZmlndXJhdGlvbi9TdGF0dXMvQ29udHJvbCBBcmVhICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpIEFyZWEKKyAqICAgIExvY2F0ZWQgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMAorICovCitzdHJ1Y3Qgc2NiIHsKKyAgICBVQ0hBUiBjY3NfaW5kZXg7CisgICAgVUNIQVIgcmNzX2luZGV4OworfTsKKworLyoqKioqKiBTdGF0dXMgYXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDAxMDAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXR1cyB7CisgICAgVUNIQVIgbXJ4X292ZXJmbG93X2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgbXJ4X2NoZWNrc3VtX2Vycm9yX2Zvcl9ob3N0OyAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcnhfaGVjX2Vycm9yX2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcmVzZXJ2ZWQxOworICAgIHNob3J0IG1yeF9vdmVyZmxvdzsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBvdmVyZmxvdyAgICAqLworICAgIHNob3J0IG1yeF9jaGVja3N1bV9lcnJvcjsgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBDUkMgZXJyb3IgICAqLworICAgIHNob3J0IHJ4X2hlY19lcnJvcjsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcyBvbiBtYWMgaGVhZGVyIENSQyBlcnJvciAqLworICAgIFVDSEFSIHJ4bm9pc2U7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIFJTTCBtZWFzdXJlbWVudCAgICAgICAgICAqLworfTsKKworLyoqKioqKiBIb3N0LXRvLUVDRiBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgyMDAgKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGhvc3RfdG9fZWNmX2FyZWEgeworICAgIAorfTsKKworLyoqKioqKiBFQ0YtdG8tSG9zdCBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwMzAwICoqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXJ0dXBfcmVzXzUxOCB7CisgICAgVUNIQVIgc3RhcnR1cF93b3JkOworICAgIFVDSEFSIHN0YXRpb25fYWRkcltBRERSTEVOXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBlY2Zfc3BhcmVbN107CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKK307CisKK3N0cnVjdCBzdGFydHVwX3Jlc182IHsKKyAgICBVQ0hBUiBzdGFydHVwX3dvcmQ7CisgICAgVUNIQVIgc3RhdGlvbl9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIHN1cHBfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBmaXJtd2FyZV92ZXJzaW9uWzNdOworICAgIFVDSEFSIGFzaWNfdmVyc2lvbjsKKyAgICBVQ0hBUiB0aWJfbGVuZ3RoOworfTsKKworc3RydWN0IHN0YXJ0X2pvaW5fbmV0X3BhcmFtcyB7CisgICAgVUNIQVIgbmV0X3R5cGU7CisgICAgVUNIQVIgc3NpZFtFU1NJRF9TSVpFXTsKKyAgICBVQ0hBUiByZXNlcnZlZDsKKyAgICBVQ0hBUiBwcml2YWN5X2Nhbl9qb2luOworfTsKKworLyoqKioqKiBDb21tYW5kIENvbnRyb2wgU3RydWN0dXJlIGFyZWEgYXQgU2hhcmVkIHJhbSBvZmZzZXQgMHgwNDAwICoqKioqKioqKioqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChjY3MudmFyKSAqLworc3RydWN0IHVwZGF0ZV9wYXJhbV9jbWQgeworICAgIFVDSEFSIG9iamVjdF9pZDsKKyAgICBVQ0hBUiBudW1iZXJfb2JqZWN0czsKKyAgICBVQ0hBUiBmYWlsdXJlX2NhdXNlOworfTsKK3N0cnVjdCByZXBvcnRfcGFyYW1fY21kIHsKKyAgICBVQ0hBUiBvYmplY3RfaWQ7CisgICAgVUNIQVIgbnVtYmVyX29iamVjdHM7CisgICAgVUNIQVIgZmFpbHVyZV9jYXVzZTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHN0YXJ0X25ldHdvcmtfY21kIHsKKyAgICBVQ0hBUiB1cGRhdGVfcGFyYW07CisgICAgVUNIQVIgYnNzaWRbQUREUkxFTl07CisgICAgVUNIQVIgbmV0X2luaXRpYXRlZDsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247Cit9Oworc3RydWN0IGpvaW5fbmV0d29ya19jbWQgeworICAgIFVDSEFSIHVwZGF0ZV9wYXJhbTsKKyAgICBVQ0hBUiBic3NpZFtBRERSTEVOXTsKKyAgICBVQ0hBUiBuZXRfaW5pdGlhdGVkOworICAgIFVDSEFSIG5ldF9kZWZhdWx0X3R4X3JhdGU7CisgICAgVUNIQVIgZW5jcnlwdGlvbjsKK307CitzdHJ1Y3QgdHhfcmVxdWVzdGVkX2NtZCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgaG9zdF9yZXNlcnZlZFsyXTsKKyAgICBVQ0hBUiByZXNlcnZlZFszXTsKKyAgICBVQ0hBUiB0eF9yYXRlOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIGFudGVubmE7Cit9Oworc3RydWN0IHR4X3JlcXVlc3RlZF9jbWRfNCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgZGVzdF9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIHN0YXRpb25faWQ7Cit9Oworc3RydWN0IG1lbW9yeV9kdW1wX2NtZCB7CisgICAgVUNIQVIgbWVtb3J5X3R5cGU7CisgICAgVUNIQVIgbWVtb3J5X3B0clsyXTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHVwZGF0ZV9hc3NvY2lhdGlvbl9jbWQgeworICAgIFVDSEFSIHN0YXR1czsKKyAgICBVQ0hBUiBhaWRbMl07Cit9Oworc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCB7CisgICAgVUNIQVIgZHVyYXRpb25bMl07Cit9OworCitzdHJ1Y3QgY2NzIHsKKyAgICBVQ0hBUiBidWZmZXJfc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogMCA9IGJ1ZmZlciBmcmVlLCAxID0gYnVmZmVyIGJ1c3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9IGNvbW1hbmQgY29tcGxldGUsIDMgPSBmYWlsZWQgKi8KKyAgICBVQ0hBUiBjbWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0byBFQ0YgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBsaW5rOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IENDUywgRkY9ZW5kIG9mIGxpc3QgKi8KKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciByZXNlcnZlZFsxM107CisgICAgICAgIHN0cnVjdCB1cGRhdGVfcGFyYW1fY21kIHVwZGF0ZV9wYXJhbTsKKyAgICAgICAgc3RydWN0IHJlcG9ydF9wYXJhbV9jbWQgcmVwb3J0X3BhcmFtOworICAgICAgICBVQ0hBUiBudW1tdWx0aWNhc3Q7CisgICAgICAgIFVDSEFSIG1vZGU7CisgICAgICAgIHN0cnVjdCBzdGFydF9uZXR3b3JrX2NtZCBzdGFydF9uZXR3b3JrOworICAgICAgICBzdHJ1Y3Qgam9pbl9uZXR3b3JrX2NtZCBqb2luX25ldHdvcms7CisgICAgICAgIHN0cnVjdCB0eF9yZXF1ZXN0ZWRfY21kIHR4X3JlcXVlc3Q7CisgICAgICAgIHN0cnVjdCBtZW1vcnlfZHVtcF9jbWQgbWVtb3J5X2R1bXA7CisgICAgICAgIHN0cnVjdCB1cGRhdGVfYXNzb2NpYXRpb25fY21kIHVwZGF0ZV9hc3NvYzsKKyAgICAgICAgc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCBzdGFydF90aW1lcjsKKyAgICB9IHZhcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRyYW5zbWl0IGJ1ZmZlciBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgdGliX3N0cnVjdHVyZSB7CisgICAgVUNIQVIgY2NzX2luZGV4OworICAgIFVDSEFSIHBzbTsKKyAgICBVQ0hBUiBwYXNzX2ZhaWw7CisgICAgVUNIQVIgcmV0cnlfY291bnQ7CisgICAgVUNIQVIgbWF4X3JldHJpZXM7CisgICAgVUNIQVIgZnJhZ3NfcmVtYWluaW5nOworICAgIFVDSEFSIG5vX3JiOworICAgIFVDSEFSIHJ0c19yZXFkOworICAgIFVDSEFSIGNzbWFfdHhfY250cmxfMjsKKyAgICBVQ0hBUiBzaWZzX3R4X2NudHJsXzI7CisgICAgVUNIQVIgdHhfZG1hX2FkZHJfMVsyXTsKKyAgICBVQ0hBUiB0eF9kbWFfYWRkcl8yWzJdOworICAgIFVDSEFSIHZhcl9kdXJfMm1oelsyXTsKKyAgICBVQ0hBUiB2YXJfZHVyXzFtaHpbMl07CisgICAgVUNIQVIgbWF4X2R1cl8ybWh6WzJdOworICAgIFVDSEFSIG1heF9kdXJfMW1oelsyXTsKKyAgICBVQ0hBUiBoZHJfbGVuOworICAgIFVDSEFSIG1heF9mcmFnX2xlblsyXTsKKyAgICBVQ0hBUiB2YXJfbGVuWzJdOworICAgIFVDSEFSIHBoeV9oZHJfNDsKKyAgICBVQ0hBUiBtYWNfaGRyXzE7CisgICAgVUNIQVIgbWFjX2hkcl8yOworICAgIFVDSEFSIHNpZFsyXTsKK307CisKK3N0cnVjdCBwaHlfaGVhZGVyIHsKKyAgICBVQ0hBUiBzZmRbMl07CisgICAgVUNIQVIgaGRyXzM7CisgICAgVUNIQVIgaGRyXzQ7Cit9Oworc3RydWN0IHJ4X21zZyB7CisgICAgc3RydWN0IG1hY19oZWFkZXIgbWFjOworICAgIFVDSEFSICB2YXJbMV07Cit9OworCitzdHJ1Y3QgdHhfbXNnIHsKKyAgICBzdHJ1Y3QgdGliX3N0cnVjdHVyZSB0aWI7CisgICAgc3RydWN0IHBoeV9oZWFkZXIgcGh5OworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiAgdmFyWzFdOworfTsKKworLyoqKioqKiBFQ0YgUmVjZWl2ZSBDb250cm9sIFN0dWN0dXJlIChSQ1MpIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwODAwICAqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChyY3MudmFyKSAqLworc3RydWN0IHJ4X3BhY2tldF9jbWQgeworICAgIFVDSEFSIHJ4X2RhdGFfcHRyWzJdOworICAgIFVDSEFSIHJ4X2RhdGFfbGVuZ3RoWzJdOworICAgIFVDSEFSIHJ4X3NpZ19sZXY7CisgICAgVUNIQVIgbmV4dF9mcmFnX3Jjc19pbmRleDsKKyAgICBVQ0hBUiB0b3RhbHBhY2tldGxlbmd0aFsyXTsKK307CitzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgeworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIGJzc2lkW0FERFJMRU5dOworfTsKK3N0cnVjdCBqYXBhbl9jYWxsX3NpZ25fcnhkIHsKKyAgICBVQ0hBUiByeGRfY2FsbF9zaWduWzhdOworICAgIFVDSEFSIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IHJjcyB7CisgICAgVUNIQVIgYnVmZmVyX3N0YXR1czsKKyAgICBVQ0hBUiBpbnRlcnJ1cHRfaWQ7CisgICAgVUNIQVIgbGlua19maWVsZDsKKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgVUNIQVIgcmVzZXJ2ZWRbMTNdOyAKKyAgICAgICAgc3RydWN0IHJ4X3BhY2tldF9jbWQgcnhfcGFja2V0OworICAgICAgICBzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgcmVqb2luX25ldF9jb21wbGV0ZTsKKyAgICAgICAgc3RydWN0IGphcGFuX2NhbGxfc2lnbl9yeGQgamFwYW5fY2FsbF9zaWduOworICAgIH0gdmFyOworfTsKKworLyoqKioqKiBTdGFydHVwIHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGZvciBib3RoIHZlcnNpb25zIG9mIGZpcm13YXJlICoqKioqKioqKioqLworc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zIHsKKyAgICBVQ0hBUiBhX25ldHdvcmtfdHlwZTsgICAgICAgICAgICAgICAgLyogQ19BREhPQywgQ19JTkZSQSAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FjdGluZ19hc19hcF9zdGF0dXM7ICAgICAgICAgLyogQ19UWVBFX1NUQSwgQ19UWVBFX0FQICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJlbnRfZXNzX2lkW0VTU0lEX1NJWkVdOyAgLyogTnVsbCB0ZXJtaW5hdGVkIHVubGVzcyAzMiBsb25nICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5uaW5nX21vZGU7ICAgICAgICAgICAgICAgLyogcGFzc2l2ZSAwLCBhY3RpdmUgMSAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Bvd2VyX21ndF9zdGF0ZTsgICAgICAgICAgICAgLyogQ0FNIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21hY19hZGRyW0FERFJMRU5dOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2ZyYWdfdGhyZXNob2xkWzJdOyAgICAgICAgICAgLyogNTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF90aW1lWzJdOyAgICAgICAgICAgICAgICAgLyogMTZrICogMioqbiwgbj0wLTQgaW4gS3VzICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2JlYWNvbl9wZXJpb2RbMl07ICAgICAgICAgICAgLyogbiAqIGFfaG9wX3RpbWUgIGluIEt1cyAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2R0aW1fcGVyaW9kOyAgICAgICAgICAgICAgICAgLyogaW4gYmVhY29ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JldHJ5X21heDsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3BpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3J0c190aHJlc2hvbGRbMl07ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5fZHdlbGxfdGltZVsyXTsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21heF9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fzc29jX3Jlc3BfdGltZW91dF90aHJlc2g7ICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3N1cGVyX3NjYW5fY3ljbGVfbWF4OyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Byb21pc2N1b3VzX21vZGU7ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3VuaXF1ZV93b3JkWzJdOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Nsb3RfdGltZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JvYW1pbmdfbG93X3Nucl90aHJlc2g7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2xvd19zbnJfY291bnRfdGhyZXNoOyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJfY291bnRyeV9jb2RlOyAgICAgICAgICAgLyogQ19VU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuX2xlbmd0aDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIFVDSEFSIGFfY3dfbWF4OyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3dfbWluOyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfZmlsdGVyX2dhaW47ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfbGltaXRfb2Zmc2V0OyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3Jzc2lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWVkX2J1c3lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3N5bmNfdGhyZXNoOyAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tb2RlOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9taW5fY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tYXhfY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcnhfdHhfZGVsYXk7ICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3VycmVudF9ic3NfaWRbQUREUkxFTl07ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3NldDsgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKK3N0cnVjdCBiNV9zdGFydHVwX3BhcmFtcyB7CisgICAgVUNIQVIgYV9uZXR3b3JrX3R5cGU7ICAgICAgICAgICAgICAgIC8qIENfQURIT0MsIENfSU5GUkEgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY3RpbmdfYXNfYXBfc3RhdHVzOyAgICAgICAgIC8qIENfVFlQRV9TVEEsIENfVFlQRV9BUCAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyZW50X2Vzc19pZFtFU1NJRF9TSVpFXTsgIC8qIE51bGwgdGVybWluYXRlZCB1bmxlc3MgMzIgbG9uZyAgICovCisgICAgVUNIQVIgYV9zY2FubmluZ19tb2RlOyAgICAgICAgICAgICAgIC8qIHBhc3NpdmUgMCwgYWN0aXZlIDEgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wb3dlcl9tZ3Rfc3RhdGU7ICAgICAgICAgICAgIC8qIENBTSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYWNfYWRkcltBRERSTEVOXTsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9mcmFnX3RocmVzaG9sZFsyXTsgICAgICAgICAgIC8qIDUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfdGltZVsyXTsgICAgICAgICAgICAgICAgIC8qIDE2ayAqIDIqKm4sIG49MC00IGluIEt1cyAgICAgICAgICovCisgICAgVUNIQVIgYV9iZWFjb25fcGVyaW9kWzJdOyAgICAgICAgICAgIC8qIG4gKiBhX2hvcF90aW1lICBpbiBLdXMgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kdGltX3BlcmlvZDsgICAgICAgICAgICAgICAgIC8qIGluIGJlYWNvbnMgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yZXRyeV9tYXg7ICAgICAgICAgICAgICAgICAgIC8qIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY2tfdGltZW91dDsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9waWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ydHNfdGhyZXNob2xkWzJdOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYXhfc2Nhbl9kd2VsbF90aW1lWzJdOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hc3NvY19yZXNwX3RpbWVvdXRfdGhyZXNoOyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zdXBlcl9zY2FuX2N5Y2xlX21heDsgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wcm9taXNjdW91c19tb2RlOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV91bmlxdWVfd29yZFsyXTsgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zbG90X3RpbWU7ICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yb2FtaW5nX2xvd19zbnJfdGhyZXNoOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9sb3dfc25yX2NvdW50X3RocmVzaDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyX2NvdW50cnlfY29kZTsgICAgICAgICAgIC8qIENfVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybjsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybl9sZW5ndGg7ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBiNCAtIGI1IGRpZmZlcmVuY2VzIHN0YXJ0IGhlcmUgKi8KKyAgICBVQ0hBUiBhX2N3X21heFsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N3X21pblsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2ZpbHRlcl9nYWluOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2xpbWl0X29mZnNldDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9yc3NpX3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21lZF9idXN5X3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9zeW5jX3RocmVzaDsgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbW9kZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWluX2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWF4X2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FsbG93X2JjYXN0X1NTSURfcHJvYmVfcnNwOworICAgIFVDSEFSIGFfcHJpdmFjeV9tdXN0X3N0YXJ0OworICAgIFVDSEFSIGFfcHJpdmFjeV9jYW5fam9pbjsKKyAgICBVQ0hBUiBhX2Jhc2ljX3JhdGVfc2V0WzhdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSQVlfSU9DR19QQVJNUyAoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIFJBWV9JT0NTX1BBUk1TIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFJBWV9ET19DTUQgICAgIChTSU9DREVWUFJJVkFURSArIDIpCisKKy8qKioqKiogZXRoZXJuZXQgPC0+IDgwMi4xMSB0cmFuc2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHNuYXBoZHJfdAoreworICBVQ0hBUiAgIGRzYXA7CisgIFVDSEFSICAgc3NhcDsKKyAgVUNIQVIgICBjdHJsOworICBVQ0hBUiAgIG9yZ1szXTsKKyAgVUNIQVIgICBldGhlcnR5cGVbMl07Cit9IHNuYXBoZHJfdDsKKworI2RlZmluZSBCUklER0VfRU5DQVAgIDB4ZjgwMDAwCisjZGVmaW5lIFJGQzEwNDJfRU5DQVAgMAorI2RlZmluZSBTTkFQX0lEICAgICAgIDB4MDAwM2FhYWEKKyNkZWZpbmUgUkFZX0lQWF9UWVBFICAweDgxMzcKKyNkZWZpbmUgQVBQTEVBUlBfVFlQRSAweDgwZjMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiAjaWZuZGVmIFJBWUxJTktfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4Y2YyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCkBAIC0wLDAgKzEsMjg0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk2IFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiBUaGUgTGVsYW5kIFN0YW5mb3JkCisgKiBKdW5pb3IgVW5pdmVyc2l0eS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CisgKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLiAgU3RhbmZvcmQgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBzdHJpcC5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgU3Rhcm1vZGUgUmFkaW8gSVAgKFNUUklQKQorICoJCWZvciBrZXJuZWwtYmFzZWQgZGV2aWNlcyBsaWtlIFRUWS4gIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhCisgKgkJcmF3IFRUWSwgYW5kIHRoZSBrZXJuZWwncyBJTkVUIHByb3RvY29sIGxheWVycyAodmlhIERESSkuCisgKgorICogVmVyc2lvbjoJQCgjKXN0cmlwLmMJMS4zCUp1bHkgMTk5NworICoKKyAqIEF1dGhvcjoJU3R1YXJ0IENoZXNoaXJlIDxjaGVzaGlyZUBjcy5zdGFuZm9yZC5lZHU+CisgKgorICogRml4ZXM6CXYwLjkgMTJ0aCBGZWIgMTk5NiAoU0MpCisgKgkJTmV3IGJ5dGUgc3R1ZmZpbmcgKDIrNiBydW4tbGVuZ3RoIGVuY29kaW5nKQorICoJCU5ldyB3YXRjaGRvZyB0aW1lciB0YXNrCisgKgkJTmV3IFByb3RvY29sIGtleSAoU0lQMCkKKyAqCQkKKyAqCQl2MC45LjEgM3JkIE1hcmNoIDE5OTYgKFNDKQorICoJCUNoYW5nZWQgdG8gZHluYW1pYyBkZXZpY2UgYWxsb2NhdGlvbiAtLSBubyBtb3JlIGNvbXBpbGUKKyAqCQl0aW1lIChvciBib290IHRpbWUpIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgU1RSSVAgZGV2aWNlcy4KKyAqCQkKKyAqCQl2MC45LjIgMTN0aCBNYXJjaCAxOTk2IChTQykKKyAqCQlVc2VzIGFycCBjYWNoZSBsb29rdXBzIChidXQgZG9lc24ndCBzZW5kIGFycCBwYWNrZXRzIHlldCkKKyAqCQkKKyAqCQl2MC45LjMgMTd0aCBBcHJpbCAxOTk2IChTQykKKyAqCQlGaXhlZCBidWcgd2hlcmUgU1RSX0VSUk9SIGZsYWcgd2FzIGdldHRpbmcgc2V0IHVubmVjY2Vzc2FyaWx5CisgKgkJKGNhdXNpbmcgb3RoZXJ3aXNlIGdvb2QgcGFja2V0cyB0byBiZSB1bm5lY2Nlc3NhcmlseSBkcm9wcGVkKQorICoJCQorICoJCXYwLjkuNCAyN3RoIEFwcmlsIDE5OTYgKFNDKQorICoJCUZpcnN0IGF0dGVtcHQgYXQgdXNpbmcgIiZDT01NQU5EIiBTdGFybW9kZSBBVCBjb21tYW5kcworICoJCQorICoJCXYwLjkuNSAyOXRoIE1heSAxOTk2IChTQykKKyAqCQlGaXJzdCBhdHRlbXB0IGF0IHNlbmRpbmcgKHVuaWNhc3QpIEFSUCBwYWNrZXRzCisgKgkJCisgKgkJdjAuOS42IDV0aCBKdW5lIDE5OTYgKEVsbGlvdCkKKyAqCQlQdXQgIm1lc3NhZ2UgbGV2ZWwiIHRhZ3MgaW4gZXZlcnkgInByaW50ayIgc3RhdGVtZW50CisgKgkJCisgKgkJdjAuOS43IDEzdGggSnVuZSAxOTk2IChsYWlrKQorICoJCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSAvcHJvYyBmcworICoKKyAqICAgICAgICAgICAgICB2MC45LjggSnVseSAxOTk2IChNZW1hKQorICogICAgICAgICAgICAgIEFkZGVkIHBhY2tldCBsb2dnaW5nCisgKgorICogICAgICAgICAgICAgIHYxLjAgTm92ZW1iZXIgMTk5NiAoU0MpCisgKiAgICAgICAgICAgICAgRml4ZWQgKHNldmVyZSkgbWVtb3J5IGxlYWtzIGluIHRoZSAvcHJvYyBmcyBjb2RlCisgKiAgICAgICAgICAgICAgRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIHRoZSBsb2dnaW5nIGNvZGUKKyAqCisgKiAgICAgICAgICAgICAgdjEuMSBKYW51YXJ5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIERlbGV0ZWQgcGFja2V0IGxvZ2dpbmcgKHVzZSB0Y3BkdW1wIGluc3RlYWQpCisgKiAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgTWV0cmljb20gRmlybXdhcmUgdjIwNCBmZWF0dXJlcworICogICAgICAgICAgICAgIChsaWtlIG1lc3NhZ2UgY2hlY2tzdW1zKQorICoKKyAqICAgICAgICAgICAgICB2MS4yIEphbnVhcnkgMTk5NyAoU0MpCisgKiAgICAgICAgICAgICAgUHV0IHBvcnRhYmxlcyBsaXN0IGJhY2sgaW4KKyAqCisgKiAgICAgICAgICAgICAgdjEuMyBKdWx5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIE1hZGUgU1RSSVAgZHJpdmVyIHNldCB0aGUgcmFkaW8ncyBiYXVkIHJhdGUgYXV0b21hdGljYWxseS4KKyAqICAgICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJpbHkgdG8gbWFudWFsbHkgc2V0IHRoZSByYWRpbydzCisgKiAgICAgICAgICAgICAgcmF0ZSBwZXJtYW5lbnRseSB0byAxMTUyMDAgLS0gdGhlIGRyaXZlciBoYW5kbGVzIHNldHRpbmcKKyAqICAgICAgICAgICAgICB0aGUgcmF0ZSBhdXRvbWF0aWNhbGx5LgorICovCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFLU1PRFVMQVIiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFIjsKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tMRV9USU1FUlMgMAorI2RlZmluZSBFWFRfQ09VTlRFUlMgMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIZWFkZXIgZmlsZXMJCQkJCQkJCSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyMgaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9zdHJpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVc2VmdWwgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJCQkJCSovCisKKy8qCisgKiBBIE1ldHJpY29tS2V5IGlkZW50aWZpZXMgdGhlIHByb3RvY29sIGJlaW5nIGNhcnJpZWQgaW5zaWRlIGEgTWV0cmljb20KKyAqIFN0YXJtb2RlIHBhY2tldC4KKyAqLworCit0eXBlZGVmIHVuaW9uIHsKKwlfX3U4IGNbNF07CisJX191MzIgbDsKK30gTWV0cmljb21LZXk7CisKKy8qCisgKiBBbiBJUCBhZGRyZXNzIGNhbiBiZSB2aWV3ZWQgYXMgZm91ciBieXRlcyBpbiBtZW1vcnkgKHdoaWNoIGlzIHdoYXQgaXQgaXMpIG9yIGFzCisgKiBhIHNpbmdsZSAzMi1iaXQgbG9uZyAod2hpY2ggaXMgY29udmVuaWVudCBmb3IgYXNzaWdubWVudCwgZXF1YWxpdHkgdGVzdGluZyBldGMuKQorICovCisKK3R5cGVkZWYgdW5pb24geworCV9fdTggYls0XTsKKwlfX3UzMiBsOworfSBJUGFkZHI7CisKKy8qCisgKiBBIE1ldHJpY29tQWRkcmVzc1N0cmluZyBpcyB1c2VkIHRvIGhvbGQgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YKKyAqIGEgTWV0cmljb20gYWRkcmVzcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX191OCBjWzI0XTsKK30gTWV0cmljb21BZGRyZXNzU3RyaW5nOworCisvKiBFbmNhcHN1bGF0aW9uIGNhbiBleHBhbmQgcGFja2V0IG9mIHNpemUgeCB0byA2NS82NHggKyAxCisgKiBTZW50IHBhY2tldCBsb29rcyBsaWtlICI8Q1I+KjxhZGRyZXNzPio8a2V5PjxlbmNhcHMgcGF5bG9hZD48Q1I+IgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAxIDEgICAxLTE4ICAxICA0ICAgICAgICAgPyAgICAgICAgIDEKKyAqIGVnLiAgICAgICAgICAgICAgICAgICAgIDxDUj4qMDAwMC0xMjM0KlNJUDA8ZW5jYXBzIHBheWxvYWQ+PENSPgorICogV2UgYWxsb3cgMzEgYnl0ZXMgZm9yIHRoZSBzdGFycywgdGhlIGtleSwgdGhlIGFkZHJlc3MgYW5kIHRoZSA8Q1I+cworICovCisjZGVmaW5lIFNUUklQX0VOQ0FQX1NJWkUoWCkgKDMyICsgKFgpKjY1TC82NEwpCisKKy8qCisgKiBBIFNUUklQX0hlYWRlciBpcyBuZXZlciByZWFsbHkgc2VudCBvdmVyIHRoZSByYWRpbywgYnV0IG1ha2luZyBhIGR1bW15CisgKiBoZWFkZXIgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIGtlcm5lbCB0aGF0IGxvb2tzIGxpa2UgYW4gRXRoZXJuZXQKKyAqIGhlYWRlciBtYWtlcyBjZXJ0YWluIG90aGVyIHNvZnR3YXJlIGhhcHBpZXIuIEZvciBleGFtcGxlLCB0Y3BkdW1wCisgKiBhbHJlYWR5IHVuZGVyc3RhbmRzIEV0aGVybmV0IGhlYWRlcnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCU1ldHJpY29tQWRkcmVzcyBkc3RfYWRkcjsJLyogRGVzdGluYXRpb24gYWRkcmVzcywgZS5nLiAiMDAwMC0xMjM0IiAgICovCisJTWV0cmljb21BZGRyZXNzIHNyY19hZGRyOwkvKiBTb3VyY2UgYWRkcmVzcywgZS5nLiAiMDAwMC01Njc4IiAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm90b2NvbDsJLyogVGhlIHByb3RvY29sIHR5cGUsIHVzaW5nIEV0aGVybmV0IGNvZGVzICovCit9IFNUUklQX0hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgY1s2MF07Cit9IE1ldHJpY29tTm9kZTsKKworI2RlZmluZSBOT0RFX1RBQkxFX1NJWkUgMzIKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7CisJaW50IG51bV9ub2RlczsKKwlNZXRyaWNvbU5vZGUgbm9kZVtOT0RFX1RBQkxFX1NJWkVdOworfSBNZXRyaWNvbU5vZGVUYWJsZTsKKworZW51bSB7IEZBTFNFID0gMCwgVFJVRSA9IDEgfTsKKworLyoKKyAqIEhvbGRzIHRoZSByYWRpbydzIGZpcm13YXJlIHZlcnNpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbNTBdOworfSBGaXJtd2FyZVZlcnNpb247CisKKy8qCisgKiBIb2xkcyB0aGUgcmFkaW8ncyBzZXJpYWwgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzE4XTsKK30gU2VyaWFsTnVtYmVyOworCisvKgorICogSG9sZHMgdGhlIHJhZGlvJ3MgYmF0dGVyeSB2b2x0YWdlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzExXTsKK30gQmF0dGVyeVZvbHRhZ2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbOF07Cit9IGNoYXI4OworCitlbnVtIHsKKwlOb1N0cnVjdHVyZSA9IDAsCS8qIFJlYWxseSBvbGQgZmlybXdhcmUgKi8KKwlTdHJ1Y3R1cmVkTWVzc2FnZXMgPSAxLAkvKiBQYXJzYWJsZSBBVCByZXNwb25zZSBtc2dzICovCisJQ2hlY2tzdW1tZWRNZXNzYWdlcyA9IDIJLyogUGFyc2FibGUgQVQgcmVzcG9uc2UgbXNncyB3aXRoIGNoZWNrc3VtcyAqLworfSBGaXJtd2FyZUxldmVsOworCitzdHJ1Y3Qgc3RyaXAgeworCWludCBtYWdpYzsKKwkvKgorCSAqIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLgorCSAqLworCisJdW5zaWduZWQgY2hhciAqcnhfYnVmZjsJLyogYnVmZmVyIGZvciByZWNlaXZlZCBJUCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpzeF9idWZmOwkvKiBidWZmZXIgZm9yIHJlY2VpdmVkIHNlcmlhbCBkYXRhICovCisJaW50IHN4X2NvdW50OwkJLyogcmVjZWl2ZWQgc2VyaWFsIGRhdGEgY291bnRlciAqLworCWludCBzeF9zaXplOwkJLyogU2VyaWFsIGJ1ZmZlciBzaXplICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZmY7CS8qIHRyYW5zbWl0dGVyIGJ1ZmZlciAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9oZWFkOwkvKiBwb2ludGVyIHRvIG5leHQgYnl0ZSB0byBYTUlUICovCisJaW50IHR4X2xlZnQ7CQkvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisJaW50IHR4X3NpemU7CQkvKiBTZXJpYWwgYnVmZmVyIHNpemUgICAgICAgICAgICovCisKKwkvKgorCSAqIFNUUklQIGludGVyZmFjZSBzdGF0aXN0aWNzLgorCSAqLworCisJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOwkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwkvKiBvdXRib3VuZCBmcmFtZXMgY291bnRlciAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIFBhcml0eSwgZXRjLiBlcnJvcnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogTm8gbWVtb3J5IGZvciBza2IgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfb3Zlcl9lcnJvcnM7CS8qIEZyYW1lIGJpZ2dlciB0aGVuIFNUUklQIGJ1Zi4gKi8KKworCXVuc2lnbmVkIGxvbmcgcHBzX3RpbWVyOwkvKiBUaW1lciB0byBkZXRlcm1pbmUgcHBzICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQ7CS8qIENvdW50ZXIgdG8gZGV0ZXJtaW5lIHBwcyAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLworCXVuc2lnbmVkIGxvbmcgc3hfcHBzX2NvdW50OwkvKiBDb3VudGVyIHRvIGRldGVybWluZSBwcHMgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwczsJLyogcnggcGFja2V0cyBwZXIgc2Vjb25kICogOCAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHM7CS8qIHR4IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICAgKi8KKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzOwkvKiBzZW50IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICovCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3NieXRlczsJLyogdG90IGJ5dGVzIHRocnUgc2VyaWFsIGkvZiAqLworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzOwkvKiB0b3QgYnl0ZXMgdGhydSBzZXJpYWwgaS9mICovCisJdW5zaWduZWQgbG9uZyByeF9lYnl0ZXM7CS8qIHRvdCBzdGF0L2VyciBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzOwkvKiB0b3Qgc3RhdC9lcnIgYnl0ZXMgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBJbnRlcm5hbCB2YXJpYWJsZXMuCisJICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkICBsaXN0OwkJLyogTGlua2VkIGxpc3Qgb2YgZGV2aWNlcyAqLworCisJaW50IGRpc2NhcmQ7CQkJLyogU2V0IGlmIHNlcmlhbCBlcnJvciAgICAgICAgICAqLworCWludCB3b3JraW5nOwkJCS8qIElzIHJhZGlvIHdvcmtpbmcgY29ycmVjdGx5PyAgKi8KKwlpbnQgZmlybXdhcmVfbGV2ZWw7CQkvKiBNZXNzYWdlIHN0cnVjdHVyaW5nIGxldmVsICAgICovCisJaW50IG5leHRfY29tbWFuZDsJCS8qIE5leHQgcGVyaW9kaWMgY29tbWFuZCAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcl9iYXVkOwkJLyogVGhlIHVzZXItc2VsZWN0ZWQgYmF1ZCByYXRlICAqLworCWludCBtdHU7CQkJLyogT3VyIG10dSAodG8gc3BvdCBjaGFuZ2VzISkgICAqLworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZTsJCS8qIE5leHQgdGltZSB0byB0ZXN0IHRoZSByYWRpbyAgKi8KKwlsb25nIHdhdGNoZG9nX2RvcmVzZXQ7CQkvKiBUaW1lIHRvIGRvIG5leHQgcmVzZXQgICAgICAgICovCisJbG9uZyBncmF0dWl0b3VzX2FycDsJCS8qIFRpbWUgdG8gc2VuZCBuZXh0IEFSUCByZWZyZXNoICovCisJbG9uZyBhcnBfaW50ZXJ2YWw7CQkvKiBOZXh0IEFSUCBpbnRlcnZhbCAgICAgICAgICAgICovCisJc3RydWN0IHRpbWVyX2xpc3QgaWRsZV90aW1lcjsJLyogRm9yIHBlcmlvZGljIHdha2V1cCBjYWxscyAgICAqLworCU1ldHJpY29tQWRkcmVzcyB0cnVlX2Rldl9hZGRyOwkvKiBUcnVlIGFkZHJlc3Mgb2YgcmFkaW8gICAgICAgICovCisJaW50IG1hbnVhbF9kZXZfYWRkcjsJCS8qIEhhY2s6IFNlZSBub3RlIGJlbG93ICAgICAgICAgKi8KKworCUZpcm13YXJlVmVyc2lvbiBmaXJtd2FyZV92ZXJzaW9uOwkvKiBUaGUgcmFkaW8ncyBmaXJtd2FyZSB2ZXJzaW9uICovCisJU2VyaWFsTnVtYmVyIHNlcmlhbF9udW1iZXI7CS8qIFRoZSByYWRpbydzIHNlcmlhbCBudW1iZXIgICAgKi8KKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2U7CS8qIFRoZSByYWRpbydzIGJhdHRlcnkgdm9sdGFnZSAgKi8KKworCS8qCisJICogT3RoZXIgdXNlZnVsIHN0cnVjdHVyZXMuCisJICovCisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiBPdXIgZGV2aWNlIHN0cnVjdHVyZSAgICAgICAgICovCisKKwkvKgorCSAqIE5laWdoYm91ciByYWRpbyByZWNvcmRzCisJICovCisKKwlNZXRyaWNvbU5vZGVUYWJsZSBwb3J0YWJsZXM7CisJTWV0cmljb21Ob2RlVGFibGUgcG9sZXRvcHM7Cit9OworCisvKgorICogTm90ZTogbWFudWFsX2Rldl9hZGRyIGhhY2sKKyAqIAorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiBhIE1ldHJpY29tIHJhZGlvLAorICogb3IgdG8gc2VuZCBwYWNrZXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZCBoYXJkd2FyZSBzb3VyY2UgYWRkcmVzcywgdGh1cworICogdHJ5aW5nIHRvIG1hbnVhbGx5IHNldCBhIGhhcmR3YXJlIHNvdXJjZSBhZGRyZXNzIGlzIGEgcXVlc3Rpb25hYmxlCisgKiB0aGluZyB0byBkby4gIEhvd2V2ZXIsIGlmIHRoZSB1c2VyICpkb2VzKiBtYW51YWxseSBzZXQgdGhlIGhhcmR3YXJlCisgKiBzb3VyY2UgYWRkcmVzcyBvZiBhIFNUUklQIGludGVyZmFjZSwgdGhlbiB0aGUga2VybmVsIHdpbGwgYmVsaWV2ZSBpdCwKKyAqIGFuZCB1c2UgaXQgaW4gY2VydGFpbiBwbGFjZXMuIEZvciBleGFtcGxlLCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBsaXN0ZWQKKyAqIGJ5IGlmY29uZmlnIHdpbGwgYmUgdGhlIG1hbnVhbCBhZGRyZXNzLCBub3QgdGhlIHRydWUgb25lLgorICogKEJvdGggYWRkcmVzc2VzIGFyZSBsaXN0ZWQgaW4gL3Byb2MvbmV0L3N0cmlwLikKKyAqIEFsc28sIEFSUCBwYWNrZXRzIHdpbGwgYmUgc2VudCBvdXQgZ2l2aW5nIHRoZSB1c2VyLXNwZWNpZmllZCBhZGRyZXNzIGFzCisgKiB0aGUgc291cmNlIGFkZHJlc3MsIG5vdCB0aGUgcmVhbCBhZGRyZXNzLiBUaGlzIGlzIGRhbmdlcm91cywgYmVjYXVzZQorICogaXQgbWVhbnMgeW91IHdvbid0IHJlY2VpdmUgYW55IHJlcGxpZXMgLS0gdGhlIEFSUCByZXBsaWVzIHdpbGwgZ28gdG8KKyAqIHRoZSBzcGVjaWZpZWQgYWRkcmVzcywgd2hpY2ggd2lsbCBiZSBzb21lIG90aGVyIHJhZGlvLiBUaGUgY2FzZSB3aGVyZQorICogdGhpcyBpcyB1c2VmdWwgaXMgd2hlbiB0aGF0IG90aGVyIHJhZGlvIGlzIGFsc28gY29ubmVjdGVkIHRvIHRoZSBzYW1lCisgKiBtYWNoaW5lLiBUaGlzIGFsbG93cyB5b3UgdG8gY29ubmVjdCBhIHBhaXIgb2YgcmFkaW9zIHRvIG9uZSBtYWNoaW5lLAorICogYW5kIHRvIHVzZSBvbmUgZXhjbHVzaXZlbHkgZm9yIGluYm91bmQgdHJhZmZpYywgYW5kIHRoZSBvdGhlcgorICogZXhjbHVzaXZlbHkgZm9yIG91dGJvdW5kIHRyYWZmaWMuIFByZXR0eSBuZWF0LCBodWg/CisgKiAKKyAqIEhlcmUncyB0aGUgZnVsbCBwcm9jZWR1cmUgdG8gc2V0IHRoaXMgdXA6CisgKiAKKyAqIDEuICJzbGF0dGFjaCIgdHdvIGludGVyZmFjZXMsIGUuZy4gc3QwIGZvciBvdXRnb2luZyBwYWNrZXRzLAorICogICAgYW5kIHN0MSBmb3IgaW5jb21pbmcgcGFja2V0cworICogCisgKiAyLiAiaWZjb25maWciIHN0MCAob3V0Ym91bmQgcmFkaW8pIHRvIGhhdmUgdGhlIGhhcmR3YXJlIGFkZHJlc3MKKyAqICAgIHdoaWNoIGlzIHRoZSByZWFsIGhhcmR3YXJlIGFkZHJlc3Mgb2Ygc3QxIChpbmJvdW5kIHJhZGlvKS4KKyAqICAgIE5vdyB3aGVuIGl0IHNlbmRzIG91dCBwYWNrZXRzLCBpdCB3aWxsIG1hc3F1ZXJhZGUgYXMgc3QxLCBhbmQKKyAqICAgIHJlcGxpZXMgd2lsbCBiZSBzZW50IHRvIHRoYXQgcmFkaW8sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LgorICogCisgKiAzLiBTZXQgdGhlIHJvdXRlIHRhYmxlIGVudHJ5ICgicm91dGUgYWRkIGRlZmF1bHQgLi4uIiBvcgorICogICAgInJvdXRlIGFkZCAtbmV0IC4uLiIsIGFzIGFwcHJvcHJpYXRlKSB0byBzZW5kIHBhY2tldHMgdmlhIHRoZSBzdDAKKyAqICAgIGludGVyZmFjZSAob3V0Ym91bmQgcmFkaW8pLiBEbyBub3QgYWRkIGFueSByb3V0ZSB3aGljaCBzZW5kcyBwYWNrZXRzCisgKiAgICBvdXQgdmlhIHRoZSBzdDEgaW50ZXJmYWNlIC0tIHRoYXQgcmFkaW8gaXMgZm9yIGluYm91bmQgdHJhZmZpYyBvbmx5LgorICogCisgKiA0LiAiaWZjb25maWciIHN0MSAoaW5ib3VuZCByYWRpbykgdG8gaGF2ZSBoYXJkd2FyZSBhZGRyZXNzIHplcm8uCisgKiAgICBUaGlzIHRlbGxzIHRoZSBTVFJJUCBkcml2ZXIgdG8gInNodXQgZG93biIgdGhhdCBpbnRlcmZhY2UgYW5kIG5vdAorICogICAgc2VuZCBhbnkgcGFja2V0cyB0aHJvdWdoIGl0LiBJbiBwYXJ0aWN1bGFyLCBpdCBzdG9wcyBzZW5kaW5nIHRoZQorICogICAgcGVyaW9kaWMgZ3JhdHVpdG91cyBBUlAgcGFja2V0cyB0aGF0IGEgU1RSSVAgaW50ZXJmYWNlIG5vcm1hbGx5IHNlbmRzLgorICogICAgQWxzbywgd2hlbiBwYWNrZXRzIGFycml2ZSBvbiB0aGF0IGludGVyZmFjZSwgaXQgd2lsbCBzZWFyY2ggdGhlCisgKiAgICBpbnRlcmZhY2UgbGlzdCB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBpbnRlcmZhY2Ugd2hvJ3MgbWFudWFsCisgKiAgICBoYXJkd2FyZSBhZGRyZXNzIG1hdGNoZXMgaXRzIG93biByZWFsIGFkZHJlc3MgKGkuZS4gc3QwIGluIHRoaXMKKyAqICAgIGV4YW1wbGUpIGFuZCBpZiBzbyBpdCB3aWxsIHRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgc2tidWZmIHRvCisgKiAgICB0aGF0IGludGVyZmFjZSwgc28gdGhhdCBpdCBsb29rcyB0byB0aGUga2VybmVsIGFzIGlmIHRoZSBwYWNrZXQKKyAqICAgIGFycml2ZWQgb24gdGhhdCBpbnRlcmZhY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiB0aGUKKyAqICAgIGtlcm5lbCBzZW5kcyBhbiBBUlAgcGFja2V0IG9uIHN0MCwgaXQgZXhwZWN0cyB0byBnZXQgYSByZXBseSBvbgorICogICAgc3QwLCBhbmQgaWYgaXQgc2VlcyB0aGUgcmVwbHkgY29tZSBmcm9tIHN0MSB0aGVuIGl0IHdpbGwgaWdub3JlCisgKiAgICBpdCAodG8gYmUgYWNjdXJhdGUsIGl0IHB1dHMgdGhlIGVudHJ5IGluIHRoZSBBUlAgdGFibGUsIGJ1dAorICogICAgbGFiZWxsZWQgaW4gc3VjaCBhIHdheSB0aGF0IHN0MCBjYW4ndCB1c2UgaXQpLgorICogCisgKiBUaGFua3MgdG8gUGV0cm9zIE1hbmlhdGlzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgaWRlYSBvZiBzcGxpdHRpbmcKKyAqIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNlcywgd2hpY2ggdHVybmVkCisgKiBvdXQgdG8gYmUgcmVhbGx5IGVhc3kgdG8gaW1wbGVtZW50LCBldmVuIGlmIGl0IGlzIGEgYml0IG9mIGEgaGFjay4KKyAqIAorICogSGF2aW5nIHNldCBhIG1hbnVhbCBhZGRyZXNzIG9uIGFuIGludGVyZmFjZSwgeW91IGNhbiByZXN0b3JlIGl0CisgKiB0byBhdXRvbWF0aWMgb3BlcmF0aW9uICh3aGVyZSB0aGUgYWRkcmVzcyBpcyBhdXRvbWF0aWNhbGx5IGtlcHQKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSByYWRpbykgYnkgc2V0dGluZyBhIG1hbnVhbAorICogYWRkcmVzcyBvZiBhbGwgb25lcywgZS5nLiAiaWZjb25maWcgc3QwIGh3IHN0cmlwIEZGRkZGRkZGRkZGRiIKKyAqIFRoaXMgJ3R1cm5zIG9mZicgbWFudWFsIG92ZXJyaWRlIG1vZGUgZm9yIHRoZSBkZXZpY2UgYWRkcmVzcy4KKyAqIAorICogTm90ZTogVGhlIElFRUUgODAyIGhlYWRlcnMgcmVwb3J0ZWQgaW4gdGNwZHVtcCB3aWxsIHNob3cgdGhlICpyZWFsKgorICogcmFkaW8gYWRkcmVzc2VzIHRoZSBwYWNrZXRzIHdlcmUgc2VudCBhbmQgcmVjZWl2ZWQgZnJvbSwgc28gdGhhdCB5b3UKKyAqIGNhbiBzZWUgd2hhdCBpcyByZWFsbHkgZ29pbmcgb24gd2l0aCBwYWNrZXRzLCBhbmQgd2hpY2ggaW50ZXJmYWNlcworICogdGhleSBhcmUgcmVhbGx5IGdvaW5nIHRocm91Z2guCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29uc3RhbnRzCQkJCQkJCQkqLworCisvKgorICogQ29tbWFuZFN0cmluZzEgd29ya3Mgb24gYWxsIHJhZGlvcworICogT3RoZXIgQ29tbWFuZFN0cmluZ3MgYXJlIG9ubHkgdXNlZCB3aXRoIGZpcm13YXJlIHRoYXQgcHJvdmlkZXMgc3RydWN0dXJlZCByZXNwb25zZXMuCisgKiAKKyAqIGF0czMxOT0xIEVuYWJsZXMgSW5mbyBtZXNzYWdlIGZvciBub2RlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zCisgKiBhdHMzMTk9MiBFbmFibGVzIEluZm8gbWVzc2FnZSBmb3IgYSBuZXcgYmVzdCBub2RlCisgKiBhdHMzMTk9NCBFbmFibGVzIGNoZWNrc3VtcworICogYXRzMzE5PTggRW5hYmxlcyBBQ0sgbWVzc2FnZXMKKyAqLworCitzdGF0aWMgY29uc3QgaW50IE1heENvbW1hbmRTdHJpbmdMZW5ndGggPSAzMjsKK3N0YXRpYyBjb25zdCBpbnQgQ29tcGF0aWJpbGl0eUNvbW1hbmQgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nMFtdID0gIiomQ09NTUFORCpBVFMzMTk9NyI7CS8qIFR1cm4gb24gY2hlY2tzdW1zICYgaW5mbyBtZXNzYWdlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgQ29tbWFuZFN0cmluZzFbXSA9ICIqJkNPTU1BTkQqQVRTMzA1PyI7CS8qIFF1ZXJ5IHJhZGlvIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmcyW10gPSAiKiZDT01NQU5EKkFUUzMyNT8iOwkvKiBRdWVyeSBiYXR0ZXJ5IHZvbHRhZ2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmczW10gPSAiKiZDT01NQU5EKkFUUzMwMD8iOwkvKiBRdWVyeSB2ZXJzaW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNFtdID0gIiomQ09NTUFORCpBVFMzMTE/IjsJLyogUXVlcnkgcG9sZXRvcCBsaXN0ICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNVtdID0gIiomQ09NTUFORCpBVH5MQSI7CQkvKiBRdWVyeSBwb3J0YWJsZXMgbGlzdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlsb25nIGxlbmd0aDsKK30gU3RyaW5nRGVzY3JpcHRvcjsKKworc3RhdGljIGNvbnN0IFN0cmluZ0Rlc2NyaXB0b3IgQ29tbWFuZFN0cmluZ1tdID0geworCXtDb21tYW5kU3RyaW5nMCwgc2l6ZW9mKENvbW1hbmRTdHJpbmcwKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMSwgc2l6ZW9mKENvbW1hbmRTdHJpbmcxKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMiwgc2l6ZW9mKENvbW1hbmRTdHJpbmcyKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMywgc2l6ZW9mKENvbW1hbmRTdHJpbmczKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNCwgc2l6ZW9mKENvbW1hbmRTdHJpbmc0KSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNSwgc2l6ZW9mKENvbW1hbmRTdHJpbmc1KSAtIDF9Cit9OworCisjZGVmaW5lIEdPVF9BTExfUkFESU9fSU5GTyhTKSAgICAgIFwKKyAgICAoKFMpLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gJiYgXAorICAgICAoUyktPmJhdHRlcnlfdm9sdGFnZS5jWzBdICAmJiBcCisgICAgIG1lbWNtcCgmKFMpLT50cnVlX2Rldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywgc2l6ZW9mKHplcm9fYWRkcmVzcykpKQorCitzdGF0aWMgY29uc3QgY2hhciBoZXh0YWJsZVsxNl0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKK3N0YXRpYyBjb25zdCBNZXRyaWNvbUFkZHJlc3MgemVyb19hZGRyZXNzOworc3RhdGljIGNvbnN0IE1ldHJpY29tQWRkcmVzcyBicm9hZGNhc3RfYWRkcmVzcyA9CisgICAgeyB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn0gfTsKKworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IFNJUDBLZXkgPSB7ICJTSVAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFSUDBLZXkgPSB7ICJBUlAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFUUl9LZXkgPSB7ICJBVFIgIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFDS19LZXkgPSB7ICJBQ0tfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IElORl9LZXkgPSB7ICJJTkZfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEVSUl9LZXkgPSB7ICJFUlJfIiB9OworCitzdGF0aWMgY29uc3QgbG9uZyBNYXhBUlBJbnRlcnZhbCA9IDYwICogSFo7CS8qIE9uZSBtaW51dGUgKi8KKworLyoKKyAqIE1heGltdW0gU3Rhcm1vZGUgcGFja2V0IGxlbmd0aCBpcyAxMTgzIGJ5dGVzLiBBbGxvd2luZyA0IGJ5dGVzIGZvcgorICogcHJvdG9jb2wga2V5LCA0IGJ5dGVzIGZvciBjaGVja3N1bSwgb25lIGJ5dGUgZm9yIENSLCBhbmQgNjUvNjQgZXhwYW5zaW9uCisgKiBmb3IgU1RSSVAgZW5jb2RpbmcsIHRoYXQgdHJhbnNsYXRlcyB0byBhIG1heGltdW0gcGF5bG9hZCBNVFUgb2YgMTE1NS4KKyAqIE5vdGU6IEEgc3RhbmRhcmQgTkZTIDFLIGRhdGEgcGFja2V0IGlzIGEgdG90YWwgb2YgMHg0ODAgKDExNTIpIGJ5dGVzCisgKiBsb25nLCBpbmNsdWRpbmcgSVAgaGVhZGVyLCBVRFAgaGVhZGVyLCBhbmQgTkZTIGhlYWRlci4gU2V0dGluZyB0aGUgU1RSSVAKKyAqIE1UVSB0byAxMTUyIGFsbG93cyB1cyB0byBzZW5kIGRlZmF1bHQgc2l6ZWQgTkZTIHBhY2tldHMgd2l0aG91dCBmcmFnbWVudGF0aW9uLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFYX1NFTkRfTVRVID0gMTE1MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVhfUkVDVl9NVFUgPSAxNTAwOwkvKiBIb3BpbmcgZm9yIEV0aGVybmV0IHNpemVkIHBhY2tldHMgaW4gdGhlIGZ1dHVyZSEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBERUZBVUxUX1NUUklQX01UVSA9IDExNTI7CitzdGF0aWMgY29uc3QgaW50IFNUUklQX01BR0lDID0gMHg1MzAzOworc3RhdGljIGNvbnN0IGxvbmcgTG9uZ1RpbWUgPSAweDdGRkZGRkZGOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFsIHZhcmlhYmxlcwkJCQkJCQkqLworCitzdGF0aWMgTElTVF9IRUFEKHN0cmlwX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzdHJpcF9sb2NrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hY3JvcwkJCQkJCQkJKi8KKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBiZWdpbnMgd2l0aCBwcmVmaXggUCAqLworI2RlZmluZSBoYXNfcHJlZml4KFQsTCxQKSAoKChMKSA+PSBzaXplb2YoUCktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUCksIHNpemVvZihQKS0xKSkKKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBvZiBsZW5ndGggTCBpcyBlcXVhbCB0byBzdHJpbmcgUyAqLworI2RlZmluZSB0ZXh0X2VxdWFsKFQsTCxTKSAoKChMKSA9PSBzaXplb2YoUyktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUyksIHNpemVvZihTKS0xKSkKKworI2RlZmluZSBSRUFESEVYKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKFgpPj0nYScgJiYgKFgpPD0nZicgPyAoWCktJ2EnKzEwIDogICBcCisgICAgICAgICAgICAgICAgICAgIChYKT49J0EnICYmIChYKTw9J0YnID8gKFgpLSdBJysxMCA6IDAgKQorCisjZGVmaW5lIFJFQURIRVgxNihYKSAoKF9fdTE2KShSRUFESEVYKFgpKSkKKworI2RlZmluZSBSRUFEREVDKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAwKQorCisjZGVmaW5lIEFSUkFZX0VORChYKSAoJigoWClbQVJSQVlfU0laRShYKV0pKQorCisjZGVmaW5lIEpJRkZJRV9UT19TRUMoWCkgKChYKSAvIEhaKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgYXJwX3F1ZXJ5KHVuc2lnbmVkIGNoYXIgKmhhZGRyLCB1MzIgcGFkZHIsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaGJvcl9lbnRyeTsKKworCW5laWdoYm9yX2VudHJ5ID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmcGFkZHIsIGRldik7CisKKwlpZiAobmVpZ2hib3JfZW50cnkgIT0gTlVMTCkgeworCQluZWlnaGJvcl9lbnRyeS0+dXNlZCA9IGppZmZpZXM7CisJCWlmIChuZWlnaGJvcl9lbnRyeS0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSB7CisJCQltZW1jcHkoaGFkZHIsIG5laWdoYm9yX2VudHJ5LT5oYSwgZGV2LT5hZGRyX2xlbik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRHVtcERhdGEoY2hhciAqbXNnLCBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsCisJCSAgICAgX191OCAqIGVuZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IE1BWF9EdW1wRGF0YSA9IDgwOworCV9fdTggcGt0X3RleHRbTUFYX0R1bXBEYXRhXSwgKnAgPSBwa3RfdGV4dDsKKworCSpwKysgPSAnXCInOworCisJd2hpbGUgKHB0ciA8IGVuZCAmJiBwIDwgJnBrdF90ZXh0W01BWF9EdW1wRGF0YSAtIDRdKSB7CisJCWlmICgqcHRyID09ICdcXCcpIHsKKwkJCSpwKysgPSAnXFwnOworCQkJKnArKyA9ICdcXCc7CisJCX0gZWxzZSB7CisJCQlpZiAoKnB0ciA+PSAzMiAmJiAqcHRyIDw9IDEyNikgeworCQkJCSpwKysgPSAqcHRyOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKHAsICJcXCUwMlgiLCAqcHRyKTsKKwkJCQlwICs9IDM7CisJCQl9CisJCX0KKwkJcHRyKys7CisJfQorCisJaWYgKHB0ciA9PSBlbmQpCisJCSpwKysgPSAnXCInOworCSpwKysgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICUtMTNzJXNcbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgbXNnLCBwa3RfdGV4dCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJ5dGUgc3R1ZmZpbmcvdW5zdHVmZmluZyByb3V0aW5lcwkJCQkJKi8KKworLyogU3R1ZmZpbmcgc2NoZW1lOgorICogMDAgICAgVW51c2VkIChyZXNlcnZlZCBjaGFyYWN0ZXIpCisgKiAwMS0zRiBSdW4gb2YgMi02NCBkaWZmZXJlbnQgY2hhcmFjdGVycworICogNDAtN0YgUnVuIG9mIDEtNjQgZGlmZmVyZW50IGNoYXJhY3RlcnMgcGx1cyBhIHNpbmdsZSB6ZXJvIGF0IHRoZSBlbmQKKyAqIDgwLUJGIFJ1biBvZiAxLTY0IG9mIHRoZSBzYW1lIGNoYXJhY3RlcgorICogQzAtRkYgUnVuIG9mIDEtNjQgemVyb2VzIChBU0NJSSAwKQorICovCisKK3R5cGVkZWYgZW51bSB7CisJU3R1ZmZfRGlmZiA9IDB4MDAsCisJU3R1ZmZfRGlmZlplcm8gPSAweDQwLAorCVN0dWZmX1NhbWUgPSAweDgwLAorCVN0dWZmX1plcm8gPSAweEMwLAorCVN0dWZmX05vQ29kZSA9IDB4RkYsCS8qIFNwZWNpYWwgY29kZSwgbWVhbmluZyBubyBjb2RlIHNlbGVjdGVkICovCisKKwlTdHVmZl9Db2RlTWFzayA9IDB4QzAsCisJU3R1ZmZfQ291bnRNYXNrID0gMHgzRiwKKwlTdHVmZl9NYXhDb3VudCA9IDB4M0YsCisJU3R1ZmZfTWFnaWMgPSAweDBECS8qIFRoZSB2YWx1ZSB3ZSBhcmUgZWxpbWluYXRpbmcgKi8KK30gU3R1ZmZpbmdDb2RlOworCisvKiBTdHVmZkRhdGEgZW5jb2RlcyB0aGUgZGF0YSBzdGFydGluZyBhdCAic3JjIiBmb3IgImxlbmd0aCIgYnl0ZXMuCisgKiBJdCB3cml0ZXMgaXQgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5ICJkc3QiICh3aGljaCBtdXN0IGJlIGF0IGxlYXN0CisgKiBhcyBsb25nIGFzIDEgKyA2NS82NCBvZiB0aGUgaW5wdXQgbGVuZ3RoKS4gVGhlIG91dHB1dCBtYXkgYmUgdXAgdG8gMS42JQorICogbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGZvciBwYXRob2xvZ2ljYWwgaW5wdXQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgc21hbGxlci4KKyAqIFN0dWZmRGF0YSByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGRzdCBwb2ludGVyIGFzIGl0cyByZXN1bHQuCisgKiAiY29kZV9wdHJfcHRyIiBwb2ludHMgdG8gYSAiX191OCAqIiB3aGljaCBpcyB1c2VkIHRvIGhvbGQgZW5jb2Rpbmcgc3RhdGUKKyAqIGJldHdlZW4gY2FsbHMsIGFsbG93aW5nIGFuIGVuY29kZWQgcGFja2V0IHRvIGJlIGluY3JlbWVudGFsbHkgYnVpbHQgdXAKKyAqIGZyb20gc21hbGwgcGFydHMuIE9uIHRoZSBmaXJzdCBjYWxsLCB0aGUgIl9fdTggKiIgcG9pbnRlZCB0byBzaG91bGQgYmUKKyAqIGluaXRpYWxpemVkIHRvIE5VTEw7IGJldHdlZW4gc3Vic2VxdWVudCBjYWxscyB0aGUgY2FsbGluZyByb3V0aW5lIHNob3VsZAorICogbGVhdmUgdGhlIHZhbHVlIGFsb25lIGFuZCBzaW1wbHkgcGFzcyBpdCBiYWNrIHVuY2hhbmdlZCBzbyB0aGF0IHRoZQorICogZW5jb2RlciBjYW4gcmVjb3ZlciBpdHMgY3VycmVudCBzdGF0ZS4KKyAqLworCisjZGVmaW5lIFN0dWZmRGF0YV9GaW5pc2hCbG9jayhYKSBcCisoKmNvZGVfcHRyID0gKFgpIF4gU3R1ZmZfTWFnaWMsIGNvZGUgPSBTdHVmZl9Ob0NvZGUpCisKK3N0YXRpYyBfX3U4ICpTdHVmZkRhdGEoX191OCAqIHNyYywgX191MzIgbGVuZ3RoLCBfX3U4ICogZHN0LAorCQkgICAgICAgX191OCAqKiBjb2RlX3B0cl9wdHIpCit7CisJX191OCAqZW5kID0gc3JjICsgbGVuZ3RoOworCV9fdTggKmNvZGVfcHRyID0gKmNvZGVfcHRyX3B0cjsKKwlfX3U4IGNvZGUgPSBTdHVmZl9Ob0NvZGUsIGNvdW50ID0gMDsKKworCWlmICghbGVuZ3RoKQorCQlyZXR1cm4gKGRzdCk7CisKKwlpZiAoY29kZV9wdHIpIHsKKwkJLyoKKwkJICogUmVjb3ZlciBzdGF0ZSBmcm9tIGxhc3QgY2FsbCwgaWYgYXBwbGljYWJsZQorCQkgKi8KKwkJY29kZSA9ICgqY29kZV9wdHIgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzazsKKwkJY291bnQgPSAoKmNvZGVfcHRyIF4gU3R1ZmZfTWFnaWMpICYgU3R1ZmZfQ291bnRNYXNrOworCX0KKworCXdoaWxlIChzcmMgPCBlbmQpIHsKKwkJc3dpdGNoIChjb2RlKSB7CisJCQkvKiBTdHVmZl9Ob0NvZGU6IElmIG5vIGN1cnJlbnQgY29kZSwgc2VsZWN0IG9uZSAqLworCQljYXNlIFN0dWZmX05vQ29kZToKKwkJCS8qIFJlY29yZCB3aGVyZSB3ZSdyZSBnb2luZyB0byBwdXQgdGhpcyBjb2RlICovCisJCQljb2RlX3B0ciA9IGRzdCsrOworCQkJY291bnQgPSAwOwkvKiBSZXNldCB0aGUgY291bnQgKHplcm8gbWVhbnMgb25lIGluc3RhbmNlKSAqLworCQkJLyogVGVudGF0aXZlbHkgc3RhcnQgYSBuZXcgYmxvY2sgKi8KKwkJCWlmICgqc3JjID09IDApIHsKKwkJCQljb2RlID0gU3R1ZmZfWmVybzsKKwkJCQlzcmMrKzsKKwkJCX0gZWxzZSB7CisJCQkJY29kZSA9IFN0dWZmX1NhbWU7CisJCQkJKmRzdCsrID0gKnNyYysrIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQkvKiBOb3RlOiBXZSBvcHRpbWlzdGljYWxseSBhc3N1bWUgcnVuIG9mIHNhbWUgLS0gKi8KKwkJCS8qIHdoaWNoIHdpbGwgYmUgZml4ZWQgbGF0ZXIgaW4gU3R1ZmZfU2FtZSAqLworCQkJLyogaWYgaXQgdHVybnMgb3V0IG5vdCB0byBiZSB0cnVlLiAqLworCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1plcm86IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgemVybyBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfWmVybzoKKwkJCS8qIElmIGFub3RoZXIgemVybywgY291bnQgaXQsIGVsc2UgZmluaXNoIHRoaXMgY29kZSBibG9jayAqLworCQkJaWYgKCpzcmMgPT0gMCkgeworCQkJCWNvdW50Kys7CisJCQkJc3JjKys7CisJCQl9IGVsc2UgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9aZXJvICsgY291bnQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1NhbWU6IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfU2FtZToKKwkJCS8qIElmIGFub3RoZXIgb25lIHRoZSBzYW1lLCBjb3VudCBpdCAqLworCQkJaWYgKCgqc3JjIF4gU3R1ZmZfTWFnaWMpID09IGNvZGVfcHRyWzFdKSB7CisJCQkJY291bnQrKzsKKwkJCQlzcmMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGVsc2UsIHRoaXMgYnl0ZSBkb2VzIG5vdCBtYXRjaCB0aGlzIGJsb2NrLiAqLworCQkJLyogSWYgd2UgYWxyZWFkeSBoYXZlIHR3byBvciBtb3JlIGJ5dGVzIGVuY29kZWQsIGZpbmlzaCB0aGlzIGNvZGUgYmxvY2sgKi8KKwkJCWlmIChjb3VudCkgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9TYW1lICsgY291bnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSwgd2Ugb25seSBoYXZlIG9uZSBzbyBmYXIsIHNvIHN3aXRjaCB0byBTdHVmZl9EaWZmIGNvZGUgKi8KKwkJCWNvZGUgPSBTdHVmZl9EaWZmOworCQkJLyogYW5kIGZhbGwgdGhyb3VnaCB0byBTdHVmZl9EaWZmIGNhc2UgYmVsb3cKKwkJCSAqIE5vdGUgY3VubmluZyBjbGV2ZXJuZXNzIGhlcmU6IGNhc2UgU3R1ZmZfRGlmZiBjb21wYXJlcyAKKwkJCSAqIHRoZSBjdXJyZW50IGNoYXJhY3RlciB3aXRoIHRoZSBwcmV2aW91cyB0d28gdG8gc2VlIGlmIGl0CisJCQkgKiBoYXMgYSBydW4gb2YgdGhyZWUgdGhlIHNhbWUuIFdvbid0IHRoaXMgYmUgYW4gZXJyb3IgaWYKKwkJCSAqIHRoZXJlIGFyZW4ndCB0d28gcHJldmlvdXMgY2hhcmFjdGVycyBzdG9yZWQgdG8gY29tcGFyZSB3aXRoPworCQkJICogTm8uIEJlY2F1c2Ugd2Uga25vdyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgKm5vdCogdGhlIHNhbWUKKwkJCSAqIGFzIHRoZSBwcmV2aW91cyBvbmUsIHRoZSBmaXJzdCB0ZXN0IGJlbG93IHdpbGwgbmVjZXNzYXJpbHkKKwkJCSAqIGZhaWwgYW5kIHRoZSBzZW5kIGhhbGYgb2YgdGhlICJpZiIgd29uJ3QgYmUgZXhlY3V0ZWQuCisJCQkgKi8KKworCQkJLyogU3R1ZmZfRGlmZjogV2UgaGF2ZSBhdCBsZWFzdCB0d28gKmRpZmZlcmVudCogYnl0ZXMgZW5jb2RlZCAqLworCQljYXNlIFN0dWZmX0RpZmY6CisJCQkvKiBJZiB0aGlzIGlzIGEgemVybywgbXVzdCBlbmNvZGUgYSBTdHVmZl9EaWZmWmVybywgYW5kIGJlZ2luIGEgbmV3IGJsb2NrICovCisJCQlpZiAoKnNyYyA9PSAwKSB7CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFN0dWZmX0RpZmZaZXJvICsKKwkJCQkJCSAgICAgIGNvdW50KTsKKwkJCX0KKwkJCS8qIGVsc2UsIGlmIHdlIGhhdmUgdGhyZWUgaW4gYSByb3csIGl0IGlzIHdvcnRoIHN0YXJ0aW5nIGEgU3R1ZmZfU2FtZSBibG9jayAqLworCQkJZWxzZSBpZiAoKCpzcmMgXiBTdHVmZl9NYWdpYykgPT0gZHN0Wy0xXQorCQkJCSAmJiBkc3RbLTFdID09IGRzdFstMl0pIHsKKwkJCQkvKiBCYWNrIG9mZiB0aGUgbGFzdCB0d28gY2hhcmFjdGVycyB3ZSBlbmNvZGVkICovCisJCQkJY29kZSArPSBjb3VudCAtIDI7CisJCQkJLyogTm90ZTogIlN0dWZmX0RpZmYgKyAwIiBpcyBhbiBpbGxlZ2FsIGNvZGUgKi8KKwkJCQlpZiAoY29kZSA9PSBTdHVmZl9EaWZmICsgMCkgeworCQkJCQljb2RlID0gU3R1ZmZfU2FtZSArIDA7CisJCQkJfQorCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhjb2RlKTsKKwkJCQljb2RlX3B0ciA9IGRzdCAtIDI7CisJCQkJLyogZHN0Wy0xXSBhbHJlYWR5IGhvbGRzIHRoZSBjb3JyZWN0IHZhbHVlICovCisJCQkJY291bnQgPSAyOwkvKiAyIG1lYW5zIHRocmVlIGJ5dGVzIGVuY29kZWQgKi8KKwkJCQljb2RlID0gU3R1ZmZfU2FtZTsKKwkJCX0KKwkJCS8qIGVsc2UsIGFub3RoZXIgZGlmZmVyZW50IGJ5dGUsIHNvIGFkZCBpdCB0byB0aGUgYmxvY2sgKi8KKwkJCWVsc2UgeworCQkJCSpkc3QrKyA9ICpzcmMgXiBTdHVmZl9NYWdpYzsKKwkJCQljb3VudCsrOworCQkJfQorCQkJc3JjKys7CS8qIENvbnN1bWUgdGhlIGJ5dGUgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3VudCA9PSBTdHVmZl9NYXhDb3VudCkgeworCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJCX0KKwl9CisJaWYgKGNvZGUgPT0gU3R1ZmZfTm9Db2RlKSB7CisJCSpjb2RlX3B0cl9wdHIgPSBOVUxMOworCX0gZWxzZSB7CisJCSpjb2RlX3B0cl9wdHIgPSBjb2RlX3B0cjsKKwkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJfQorCXJldHVybiAoZHN0KTsKK30KKworLyoKKyAqIFVuU3R1ZmZEYXRhIGRlY29kZXMgdGhlIGRhdGEgYXQgInNyYyIsIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgImVuZCIuCisgKiBJdCB3cml0ZXMgdGhlIGRlY29kZWQgZGF0YSBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSAiZHN0IiwgdXAgdG8gYQorICogbWF4aW11bSBvZiAiZHN0X2xlbmd0aCIsIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgInNyYyIgc28gdGhhdCBhCisgKiBmb2xsb3ctb24gY2FsbCBjYW4gcmVhZCBtb3JlIGRhdGEsIGNvbnRpbnVpbmcgZnJvbSB3aGVyZSB0aGUgZmlyc3QgbGVmdCBvZmYuCisgKiAKKyAqIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiByZXN1bHRzOgorICogMS4gVGhlIHNvdXJjZSBkYXRhIHJ1bnMgb3V0IGJlZm9yZSBleHRyYWN0aW5nICJkc3RfbGVuZ3RoIiBieXRlczoKKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLgorICogMi4gVGhlIHNvdXJjZSBkYXRhIHByb2R1Y2VzIGV4YWN0bHkgImRzdF9sZW5ndGgiIGJ5dGVzOgorICogICAgVW5TdHVmZkRhdGEgcmV0dXJucyBuZXdfc3JjID0gZW5kIHRvIGluZGljYXRlIHRoYXQgYWxsIGJ5dGVzIHdlcmUgY29uc3VtZWQuCisgKiAzLiAiZHN0X2xlbmd0aCIgYnl0ZXMgYXJlIGV4dHJhY3RlZCwgd2l0aCBtb3JlIHJlbWFpbmluZy4KKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgbmV3X3NyYyA8IGVuZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBtb3JlIGJ5dGVzCisgKiAgICB0byBiZSByZWFkLgorICogCisgKiBOb3RlOiBUaGUgZGVjb2RpbmcgbWF5IGJlIGRlc3RydWN0aXZlLCBpbiB0aGF0IGl0IG1heSBhbHRlciB0aGUgc291cmNlCisgKiBkYXRhIGluIHRoZSBwcm9jZXNzIG9mIGRlY29kaW5nIGl0ICh0aGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBhIGZvbGxvdy1vbgorICogY2FsbCB0byByZXN1bWUgY29ycmVjdGx5KS4KKyAqLworCitzdGF0aWMgX191OCAqVW5TdHVmZkRhdGEoX191OCAqIHNyYywgX191OCAqIGVuZCwgX191OCAqIGRzdCwKKwkJCSBfX3UzMiBkc3RfbGVuZ3RoKQoreworCV9fdTggKmRzdF9lbmQgPSBkc3QgKyBkc3RfbGVuZ3RoOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghc3JjIHx8ICFlbmQgfHwgIWRzdCB8fCAhZHN0X2xlbmd0aCkKKwkJcmV0dXJuIChOVUxMKTsKKwl3aGlsZSAoc3JjIDwgZW5kICYmIGRzdCA8IGRzdF9lbmQpIHsKKwkJaW50IGNvdW50ID0gKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db3VudE1hc2s7CisJCXN3aXRjaCAoKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzaykgeworCQljYXNlIFN0dWZmX0RpZmY6CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJc3JjICs9IDE7CisJCQllbHNlIHsKKwkJCQlpZiAoY291bnQgPT0gMCkKKwkJCQkJKnNyYyA9IFN0dWZmX1NhbWUgXiBTdHVmZl9NYWdpYzsKKwkJCQllbHNlCisJCQkJCSpzcmMgPQorCQkJCQkgICAgKFN0dWZmX0RpZmYgKworCQkJCQkgICAgIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU3R1ZmZfRGlmZlplcm86CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJKnNyYyA9IFN0dWZmX1plcm8gXiBTdHVmZl9NYWdpYzsKKwkJCWVsc2UKKwkJCQkqc3JjID0KKwkJCQkgICAgKFN0dWZmX0RpZmZaZXJvICsgY291bnQpIF4gU3R1ZmZfTWFnaWM7CisJCQlicmVhazsKKwkJY2FzZSBTdHVmZl9TYW1lOgorCQkJaWYgKHNyYyArIDEgPj0gZW5kKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlkbyB7CisJCQkJKmRzdCsrID0gc3JjWzFdIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQl3aGlsZSAoLS1jb3VudCA+PSAwICYmIGRzdCA8IGRzdF9lbmQpOworCQkJaWYgKGNvdW50IDwgMCkKKwkJCQlzcmMgKz0gMjsKKwkJCWVsc2UKKwkJCQkqc3JjID0gKFN0dWZmX1NhbWUgKyBjb3VudCkgXiBTdHVmZl9NYWdpYzsKKwkJCWJyZWFrOworCQljYXNlIFN0dWZmX1plcm86CisJCQlkbyB7CisJCQkJKmRzdCsrID0gMDsKKwkJCX0KKwkJCXdoaWxlICgtLWNvdW50ID49IDAgJiYgZHN0IDwgZHN0X2VuZCk7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCXNyYyArPSAxOworCQkJZWxzZQorCQkJCSpzcmMgPSAoU3R1ZmZfWmVybyArIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRzdCA8IGRzdF9lbmQpCisJCXJldHVybiAoTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gKHNyYyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdlbmVyYWwgcm91dGluZXMgZm9yIFNUUklQCQkJCQkJKi8KKworLyoKKyAqIGdldF9iYXVkIHJldHVybnMgdGhlIGN1cnJlbnQgYmF1ZCByYXRlLCBhcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluCisgKiB0ZXJtYml0cy5oCisgKiBJZiB0aGUgdXNlciBoYXMgaXNzdWVkIGEgYmF1ZCByYXRlIG92ZXJyaWRlIHVzaW5nIHRoZSAnc2V0c2VyaWFsJyBjb21tYW5kCisgKiBhbmQgdGhlIGxvZ2ljYWwgY3VycmVudCByYXRlIGlzIHNldCB0byAzOC40LCB0aGVuIHRoZSB0cnVlIGJhdWQgcmF0ZQorICogY3VycmVudGx5IGluIGVmZmVjdCAoNTcuNiBvciAxMTUuMikgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2JhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm4gKDApOworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCAmJiB0dHktPmRyaXZlcl9kYXRhKSB7CisJCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPQorCQkgICAgKHN0cnVjdCBhc3luY19zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQlyZXR1cm4gKEI1NzYwMCk7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCXJldHVybiAoQjExNTIwMCk7CisJfQorCXJldHVybiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOworfQorCisvKgorICogc2V0X2JhdWQgc2V0cyB0aGUgYmF1ZCByYXRlIHRvIHRoZSByYXRlIGRlZmluZWQgYnkgYmF1ZGNvZGUKKyAqIE5vdGU6IFRoZSByYXRlIEIzODQwMCBzaG91bGQgYmUgYXZvaWRlZCwgYmVjYXVzZSB0aGUgdXNlciBtYXkgaGF2ZQorICogaXNzdWVkIGEgJ3NldHNlcmlhbCcgc3BlZWQgb3ZlcnJpZGUgdG8gbWFwIHRoYXQgdG8gYSBkaWZmZXJlbnQgc3BlZWQuCisgKiBXZSBjb3VsZCBhY2hpZXZlIGEgdHJ1ZSByYXRlIG9mIDM4NDAwIGlmIHdlIG5lZWRlZCB0byBieSBjYW5jZWxsaW5nCisgKiBhbnkgdXNlciBzcGVlZCBvdmVycmlkZSB0aGF0IGlzIGluIHBsYWNlLCBidXQgdGhhdCBtaWdodCBhbm5veSB0aGUKKyAqIHVzZXIsIHNvIGl0IGlzIHNpbXBsZXN0IHRvIGp1c3QgYXZvaWQgdXNpbmcgMzg0MDAuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBiYXVkY29kZSkKK3sKKwlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVEOwkvKiBDbGVhciB0aGUgb2xkIGJhdWQgc2V0dGluZyAqLworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSBiYXVkY29kZTsJLyogU2V0IHRoZSBuZXcgYmF1ZCBzZXR0aW5nICovCisJdHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKHR0eSwgJm9sZF90ZXJtaW9zKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBNZXRyaWNvbSBBZGRyZXNzLgorICovCisKKyNkZWZpbmUgSVNfUkFESU9fQUREUkVTUyhwKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbMF0pICYmIGlzZGlnaXQoKHApWzFdKSAmJiBpc2RpZ2l0KChwKVsyXSkgJiYgaXNkaWdpdCgocClbM10pICYmIFwKKyAgKHApWzRdID09ICctJyAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbNV0pICYmIGlzZGlnaXQoKHApWzZdKSAmJiBpc2RpZ2l0KChwKVs3XSkgJiYgaXNkaWdpdCgocClbOF0pICAgICkKKworc3RhdGljIGludCBzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcyhNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLCBfX3U4ICogcCkKK3sKKwlpZiAoIUlTX1JBRElPX0FERFJFU1MocCkpCisJCXJldHVybiAoMSk7CisJYWRkci0+Y1swXSA9IDA7CisJYWRkci0+Y1sxXSA9IDA7CisJYWRkci0+Y1syXSA9IFJFQURIRVgocFswXSkgPDwgNCB8IFJFQURIRVgocFsxXSk7CisJYWRkci0+Y1szXSA9IFJFQURIRVgocFsyXSkgPDwgNCB8IFJFQURIRVgocFszXSk7CisJYWRkci0+Y1s0XSA9IFJFQURIRVgocFs1XSkgPDwgNCB8IFJFQURIRVgocFs2XSk7CisJYWRkci0+Y1s1XSA9IFJFQURIRVgocFs3XSkgPDwgNCB8IFJFQURIRVgocFs4XSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBNZXRyaWNvbSBBZGRyZXNzIHRvIGEgc3RyaW5nLgorICovCisKK3N0YXRpYyBfX3U4ICpyYWRpb19hZGRyZXNzX3RvX3N0cmluZyhjb25zdCBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLAorCQkJCSAgICAgTWV0cmljb21BZGRyZXNzU3RyaW5nICogcCkKK3sKKwlzcHJpbnRmKHAtPmMsICIlMDJYJTAyWC0lMDJYJTAyWCIsIGFkZHItPmNbMl0sIGFkZHItPmNbM10sCisJCWFkZHItPmNbNF0sIGFkZHItPmNbNV0pOworCXJldHVybiAocC0+Yyk7Cit9CisKKy8qCisgKiBOb3RlOiBNdXN0IG1ha2Ugc3VyZSBzeF9zaXplIGlzIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIHN0dWZmZWQKKyAqIE1BWF9SRUNWX01UVSBwYWNrZXQuIEFkZGl0aW9uYWxseSwgd2UgYWxzbyB3YW50IHRvIGVuc3VyZSB0aGF0IGl0J3MKKyAqIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIGxhcmdlIHJhZGlvIG5laWdoYm91ciBsaXN0IChjdXJyZW50bHkgNEspLgorICovCisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYnVmZmVycyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIGludCBtdHUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0cmlwX2luZm8tPmRldjsKKwlpbnQgc3hfc2l6ZSA9IG1heF90KGludCwgU1RSSVBfRU5DQVBfU0laRShNQVhfUkVDVl9NVFUpLCA0MDk2KTsKKwlpbnQgdHhfc2l6ZSA9IFNUUklQX0VOQ0FQX1NJWkUobXR1KSArIE1heENvbW1hbmRTdHJpbmdMZW5ndGg7CisJX191OCAqciA9IGttYWxsb2MoTUFYX1JFQ1ZfTVRVLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICpzID0ga21hbGxvYyhzeF9zaXplLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICp0ID0ga21hbGxvYyh0eF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAociAmJiBzICYmIHQpIHsKKwkJc3RyaXBfaW5mby0+cnhfYnVmZiA9IHI7CisJCXN0cmlwX2luZm8tPnN4X2J1ZmYgPSBzOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gdDsKKwkJc3RyaXBfaW5mby0+c3hfc2l6ZSA9IHN4X3NpemU7CisJCXN0cmlwX2luZm8tPnR4X3NpemUgPSB0eF9zaXplOworCQlzdHJpcF9pbmZvLT5tdHUgPSBkZXYtPm10dSA9IG10dTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKHIpCisJCWtmcmVlKHIpOworCWlmIChzKQorCQlrZnJlZShzKTsKKwlpZiAodCkKKwkJa2ZyZWUodCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIE1UVSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBJUCBsYXllci4gCisgKiBXZSBjb3VsZCBiZSBpbgorICogYW4gdXBjYWxsIGZyb20gdGhlIHR0eSBkcml2ZXIsIG9yIGluIGFuIGlwIHBhY2tldCBxdWV1ZS4KKyAqLworc3RhdGljIGludCBzdHJpcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG9sZF9tdHUgPSBzdHJpcF9pbmZvLT5tdHU7CisJdW5zaWduZWQgY2hhciAqb3JidWZmID0gc3RyaXBfaW5mby0+cnhfYnVmZjsKKwl1bnNpZ25lZCBjaGFyICpvc2J1ZmYgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCXVuc2lnbmVkIGNoYXIgKm90YnVmZiA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisKKwlpZiAobmV3X210dSA+IE1BWF9TRU5EX01UVSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogTVRVIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2FibGUgKCVkKSwgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBNQVhfU0VORF9NVFUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBuZXdfbXR1KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ3JvdyBzdHJpcCBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCkgeworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPD0gc3RyaXBfaW5mby0+c3hfc2l6ZSkKKwkJCW1lbWNweShzdHJpcF9pbmZvLT5zeF9idWZmLCBvc2J1ZmYsCisJCQkgICAgICAgc3RyaXBfaW5mby0+c3hfY291bnQpOworCQllbHNlIHsKKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzKys7CisJCX0KKwl9CisKKwlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCkgeworCQlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCA8PSBzdHJpcF9pbmZvLT50eF9zaXplKQorCQkJbWVtY3B5KHN0cmlwX2luZm8tPnR4X2J1ZmYsIHN0cmlwX2luZm8tPnR4X2hlYWQsCisJCQkgICAgICAgc3RyaXBfaW5mby0+dHhfbGVmdCk7CisJCWVsc2UgeworCQkJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisJCQlzdHJpcF9pbmZvLT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RyaXAgTVRVIGNoYW5nZWQgZm9tICVkIHRvICVkLlxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBvbGRfbXR1LCBzdHJpcF9pbmZvLT5tdHUpOworCisJaWYgKG9yYnVmZikKKwkJa2ZyZWUob3JidWZmKTsKKwlpZiAob3NidWZmKQorCQlrZnJlZShvc2J1ZmYpOworCWlmIChvdGJ1ZmYpCisJCWtmcmVlKG90YnVmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfdW5sb2NrKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwkvKgorCSAqIFNldCB0aGUgdGltZXIgdG8gZ28gb2ZmIGluIG9uZSBzZWNvbmQuCisJICovCisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsKKwlhZGRfdGltZXIoJnN0cmlwX2luZm8tPmlkbGVfdGltZXIpOworCW5ldGlmX3dha2VfcXVldWUoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisKKy8qCisgKiBJZiB0aGUgdGltZSBpcyBpbiB0aGUgbmVhciBmdXR1cmUsIHRpbWVfZGVsdGEgcHJpbnRzIHRoZSBudW1iZXIgb2YKKyAqIHNlY29uZHMgdG8gZ28gaW50byB0aGUgYnVmZmVyIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgdGltZSBpcyBub3QgaW4gdGhlIG5lYXIgZnV0dXJlLCBpdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZQorICogc3RyaW5nICJOb3Qgc2NoZWR1bGVkIiBUaGUgYnVmZmVyIG11c3QgYmUgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUKKyAqIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIgcGx1cyA5IGNoYXJhY3RlcyBmb3IgdGhlICIgc2Vjb25kcyIKKyAqIGFuZCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNoYXIgKnRpbWVfZGVsdGEoY2hhciBidWZmZXJbXSwgbG9uZyB0aW1lKQoreworCXRpbWUgLT0gamlmZmllczsKKwlpZiAodGltZSA+IExvbmdUaW1lIC8gMikKKwkJcmV0dXJuICgiTm90IHNjaGVkdWxlZCIpOworCWlmICh0aW1lIDwgMCkKKwkJdGltZSA9IDA7CS8qIERvbid0IHByaW50IG5lZ2F0aXZlIHRpbWVzICovCisJc3ByaW50ZihidWZmZXIsICIlbGQgc2Vjb25kcyIsIHRpbWUgLyBIWik7CisJcmV0dXJuIChidWZmZXIpOworfQorCisvKiBnZXQgTnRoIGVsZW1lbnQgb2YgdGhlIGxpbmtlZCBsaXN0ICovCitzdGF0aWMgc3RydWN0IHN0cmlwICpzdHJpcF9nZXRfaWR4KGxvZmZfdCBwb3MpIAoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9yY3UobCwgJnN0cmlwX2xpc3QpIHsKKwkJaWYgKHBvcyA9PSBpKQorCQkJcmV0dXJuIGxpc3RfZW50cnkobCwgc3RydWN0IHN0cmlwLCBsaXN0KTsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnN0cmlwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmN1X3JlYWRfbG9jaygpOworCXJldHVybiAqcG9zID8gc3RyaXBfZ2V0X2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpzdHJpcF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgc3RyaXAgKnM7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gc3RyaXBfZ2V0X2lkeCgxKTsKKworCXMgPSB2OworCWwgPSAmcy0+bGlzdDsKKwlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdShsLCAmc3RyaXBfbGlzdCkgeworCQlyZXR1cm4gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmlwX3NlcV9uZWlnaGJvdXJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJICAgY29uc3QgTWV0cmljb21Ob2RlVGFibGUgKiB0YWJsZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCS8qIFdlIHdyYXAgdGhpcyBpbiBhIGRvL3doaWxlIGxvb3AsIHNvIGlmIHRoZSB0YWJsZSBjaGFuZ2VzICovCisJLyogd2hpbGUgd2UncmUgcmVhZGluZyBpdCwgd2UganVzdCBnbyBhcm91bmQgYW5kIHRyeSBhZ2Fpbi4gKi8KKwlzdHJ1Y3QgdGltZXZhbCB0OworCisJZG8geworCQlpbnQgaTsKKwkJdCA9IHRhYmxlLT50aW1lc3RhbXA7CisJCWlmICh0YWJsZS0+bnVtX25vZGVzKQorCQkJc2VxX3ByaW50ZihzZXEsICJcbiAlc1xuIiwgdGl0bGUpOworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9ub2RlczsgaSsrKSB7CisJCQlNZXRyaWNvbU5vZGUgbm9kZTsKKworCQkJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCW5vZGUgPSB0YWJsZS0+bm9kZVtpXTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAlc1xuIiwgbm9kZS5jKTsKKwkJfQorCX0gd2hpbGUgKHRhYmxlLT50aW1lc3RhbXAudHZfc2VjICE9IHQudHZfc2VjCisJCSB8fCB0YWJsZS0+dGltZXN0YW1wLnR2X3VzZWMgIT0gdC50dl91c2VjKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJpbnRzIHJhZGlvIHN0YXR1cyBpbmZvcm1hdGlvbiB2aWEgdGhlIHNlcV9maWxlCisgKiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHRha2VzIGNhcmUgb2YgYnVmZmVyIHNpemUgYW5kIG92ZXIKKyAqIHJ1biBpc3N1ZXMuIAorICoKKyAqIFRoZSBidWZmZXIgaW4gc2VxX2ZpbGUgaXMgUEFHRVNJWkUgKDRLKSAKKyAqIHNvIHRoaXMgcm91dGluZSBzaG91bGQgbmV2ZXIgcHJpbnQgbW9yZSBvciBpdCB3aWxsIGdldCB0cnVuY2F0ZWQuCisgKiBXaXRoIHRoZSBtYXhpbXVtIG9mIDMyIHBvcnRhYmxlcyBhbmQgMzIgcG9sZXRvcHMKKyAqIHJlcG9ydGVkLCB0aGUgcm91dGluZSBvdXRwdXRzIDMxMDcgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBzdHJpcF9zZXFfc3RhdHVzX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIAorCQkJCSAgY29uc3Qgc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCWNoYXIgdGVtcFszMl07CisJTWV0cmljb21BZGRyZXNzU3RyaW5nIGFkZHJfc3RyaW5nOworCisJLyogRmlyc3QsIHdlIG11c3QgY29weSBhbGwgb2Ygb3VyIGRhdGEgdG8gYSBzYWZlIHBsYWNlLCAqLworCS8qIGluIGNhc2UgYSBzZXJpYWwgaW50ZXJydXB0IGNvbWVzIGluIGFuZCBjaGFuZ2VzIGl0LiAgKi8KKwlpbnQgdHhfbGVmdCA9IHN0cmlwX2luZm8tPnR4X2xlZnQ7CisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwcyA9IHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzOworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHMgPSBzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwczsKKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzID0gc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHM7CisJaW50IHdvcmtpbmcgPSBzdHJpcF9pbmZvLT53b3JraW5nOworCWludCBmaXJtd2FyZV9sZXZlbCA9IHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsOworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZSA9IHN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmU7CisJbG9uZyB3YXRjaGRvZ19kb3Jlc2V0ID0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldDsKKwlsb25nIGdyYXR1aXRvdXNfYXJwID0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnA7CisJbG9uZyBhcnBfaW50ZXJ2YWwgPSBzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWw7CisJRmlybXdhcmVWZXJzaW9uIGZpcm13YXJlX3ZlcnNpb24gPSBzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uOworCVNlcmlhbE51bWJlciBzZXJpYWxfbnVtYmVyID0gc3RyaXBfaW5mby0+c2VyaWFsX251bWJlcjsKKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2UgPSBzdHJpcF9pbmZvLT5iYXR0ZXJ5X3ZvbHRhZ2U7CisJY2hhciAqaWZfbmFtZSA9IHN0cmlwX2luZm8tPmRldi0+bmFtZTsKKwlNZXRyaWNvbUFkZHJlc3MgdHJ1ZV9kZXZfYWRkciA9IHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHI7CisJTWV0cmljb21BZGRyZXNzIGRldl9kZXZfYWRkciA9CisJICAgICooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHI7CisJaW50IG1hbnVhbF9kZXZfYWRkciA9IHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcjsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzID0gc3RyaXBfaW5mby0+cnhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9ieXRlcyA9IHN0cmlwX2luZm8tPnR4X2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfcmJ5dGVzID0gc3RyaXBfaW5mby0+cnhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfcmJ5dGVzID0gc3RyaXBfaW5mby0+dHhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfc2J5dGVzID0gc3RyaXBfaW5mby0+cnhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzID0gc3RyaXBfaW5mby0+dHhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfZWJ5dGVzID0gc3RyaXBfaW5mby0+cnhfZWJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzID0gc3RyaXBfaW5mby0+dHhfZWJ5dGVzOworI2VuZGlmCisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuSW50ZXJmYWNlIG5hbWVcdFx0JXNcbiIsIGlmX25hbWUpOworCXNlcV9wcmludGYoc2VxLCAiIFJhZGlvIHdvcmtpbmc6XHRcdCVzXG4iLCB3b3JraW5nID8gIlllcyIgOiAiTm8iKTsKKwlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmdHJ1ZV9kZXZfYWRkciwgJmFkZHJfc3RyaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBSYWRpbyBhZGRyZXNzOlx0XHQlc1xuIiwgYWRkcl9zdHJpbmcuYyk7CisJaWYgKG1hbnVhbF9kZXZfYWRkcikgeworCQlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmZGV2X2Rldl9hZGRyLCAmYWRkcl9zdHJpbmcpOworCQlzZXFfcHJpbnRmKHNlcSwgIiBEZXZpY2UgYWRkcmVzczpcdCVzXG4iLCBhZGRyX3N0cmluZy5jKTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICIgRmlybXdhcmUgdmVyc2lvbjpcdCVzIiwgIXdvcmtpbmcgPyAiVW5rbm93biIgOgorCQkgICAgICFmaXJtd2FyZV9sZXZlbCA/ICJTaG91bGQgYmUgdXBncmFkZWQiIDoKKwkJICAgICBmaXJtd2FyZV92ZXJzaW9uLmMpOworCWlmIChmaXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAoQ2hlY2tzdW1zIEVuYWJsZWQpIik7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCXNlcV9wcmludGYoc2VxLCAiIFNlcmlhbCBudW1iZXI6XHRcdCVzXG4iLCBzZXJpYWxfbnVtYmVyLmMpOworCXNlcV9wcmludGYoc2VxLCAiIEJhdHRlcnkgdm9sdGFnZTpcdCVzXG4iLCBiYXR0ZXJ5X3ZvbHRhZ2UuYyk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcXVldWUgKGJ5dGVzKTolZFxuIiwgdHhfbGVmdCk7CisJc2VxX3ByaW50ZihzZXEsICIgUmVjZWl2ZSBwYWNrZXQgcmF0ZTogICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHJ4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcGFja2V0IHJhdGU6ICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHR4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgU2VudCBwYWNrZXQgcmF0ZTogICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHN4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgTmV4dCB3YXRjaGRvZyBwcm9iZTpcdCVzXG4iLAorCQkgICAgIHRpbWVfZGVsdGEodGVtcCwgd2F0Y2hkb2dfZG9wcm9iZSkpOworCXNlcV9wcmludGYoc2VxLCAiIE5leHQgd2F0Y2hkb2cgcmVzZXQ6XHQlc1xuIiwKKwkJICAgICB0aW1lX2RlbHRhKHRlbXAsIHdhdGNoZG9nX2RvcmVzZXQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBOZXh0IGdyYXR1aXRvdXMgQVJQOlx0Iik7CisKKwlpZiAoIW1lbWNtcAorCSAgICAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJICAgICBzaXplb2YoemVyb19hZGRyZXNzKSkpCisJCXNlcV9wcmludGYoc2VxLCAiRGlzYWJsZWRcbiIpOworCWVsc2UgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCB0aW1lX2RlbHRhKHRlbXAsIGdyYXR1aXRvdXNfYXJwKSk7CisJCXNlcV9wcmludGYoc2VxLCAiIE5leHQgQVJQIGludGVydmFsOlx0JWxkIHNlY29uZHNcbiIsCisJCQkgICAgIEpJRkZJRV9UT19TRUMoYXJwX2ludGVydmFsKSk7CisJfQorCisJaWYgKHdvcmtpbmcpIHsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiBUb3RhbCBieXRlczogICAgICAgICBcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfYnl0ZXMsIHR4X2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgcmFkaW86ICAgICAgICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3JieXRlcywgdHhfcmJ5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgc2VyaWFsIHBvcnQ6ICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3NieXRlcywgdHhfc2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgVG90YWwgc3RhdC9lcnIgYnl0ZXM6XHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X2VieXRlcywgdHhfZWJ5dGVzKTsKKyNlbmRpZgorCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb2xldG9wcywKKwkJCQkJIlBvbGV0b3BzOiIpOworCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsCisJCQkJCSJQb3J0YWJsZXM6Iik7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRzIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTVFJJUCBkcml2ZXIgdGhyb3VnaAorICogdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCitzdGF0aWMgaW50IHN0cmlwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJzdHJpcF92ZXJzaW9uOiAlc1xuIiwgU3RyaXBWZXJzaW9uKTsKKwllbHNlCisJCXN0cmlwX3NlcV9zdGF0dXNfaW5mbyhzZXEsIChjb25zdCBzdHJ1Y3Qgc3RyaXAgKil2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHN0cmlwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gc3RyaXBfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHN0cmlwX3NlcV9uZXh0LAorCS5zdG9wICA9IHN0cmlwX3NlcV9zdG9wLAorCS5zaG93ICA9IHN0cmlwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBzdHJpcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnN0cmlwX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdHJpcF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBzdHJpcF9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZGluZyByb3V0aW5lcwkJCQkJCQkqLworCitzdGF0aWMgdm9pZCBSZXNldFJhZGlvKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gc3RyaXBfaW5mby0+dHR5OworCXN0YXRpYyBjb25zdCBjaGFyIGluaXRbXSA9ICJhdGUwcTFkdCoqc3Rhcm1vZGVccioqIjsKKwlTdHJpbmdEZXNjcmlwdG9yIHMgPSB7IGluaXQsIHNpemVvZihpbml0KSAtIDEgfTsKKworCS8qIAorCSAqIElmIHRoZSByYWRpbyBpc24ndCB3b3JraW5nIGFueW1vcmUsCisJICogd2Ugc2hvdWxkIGNsZWFyIHRoZSBvbGQgc3RhdHVzIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyByZXNwb25zZTogUmVzZXR0aW5nIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPmJhdHRlcnlfdm9sdGFnZS5jWzBdID0gJ1wwJzsKKwkJc3RyaXBfaW5mby0+cG9ydGFibGVzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9ydGFibGVzLnRpbWVzdGFtcCk7CisJCXN0cmlwX2luZm8tPnBvbGV0b3BzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9sZXRvcHMudGltZXN0YW1wKTsKKwl9CisKKwlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ID0gMDsKKwlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gMDsKKwlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IDA7CisJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAwOworCisJLyogTWFyayByYWRpbyBhZGRyZXNzIGFzIHVua25vd24gKi8KKwkqKE1ldHJpY29tQWRkcmVzcyAqKSAmIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIgPSB6ZXJvX2FkZHJlc3M7CisJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCSooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIgPQorCQkgICAgemVyb19hZGRyZXNzOworCXN0cmlwX2luZm8tPndvcmtpbmcgPSBGQUxTRTsKKwlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IE5vU3RydWN0dXJlOworCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Jlc2V0ID0gamlmZmllcyArIDEgKiBIWjsKKworCS8qIElmIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIGJhdWQgcmF0ZSBhYm92ZSAzOC40IHNlZSB3aGF0IG1hZ2ljIHdlIGhhdmUgdG8gZG8gKi8KKwlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID4gQjM4NDAwKSB7CisJCS8qCisJCSAqIFN1YnRsZSBzdHVmZjogUGF5IGF0dGVudGlvbiA6LSkKKwkJICogSWYgdGhlIHNlcmlhbCBwb3J0IGlzIGN1cnJlbnRseSBhdCB0aGUgdXNlcidzIHNlbGVjdGVkICg+MzguNCkgcmF0ZSwKKwkJICogdGhlbiB3ZSB0ZW1wb3JhcmlseSBzd2l0Y2ggdG8gMTkuMiBhbmQgaXNzdWUgdGhlIEFUUzMwNCBjb21tYW5kCisJCSAqIHRvIHRlbGwgdGhlIHJhZGlvIHRvIHN3aXRjaCB0byB0aGUgdXNlcidzIHNlbGVjdGVkIHJhdGUuCisJCSAqIElmIHRoZSBzZXJpYWwgcG9ydCBpcyBub3QgY3VycmVudGx5IGF0IHRoYXQgcmF0ZSwgdGhhdCBtZWFucyB3ZSBqdXN0CisJCSAqIGlzc3VlZCB0aGUgQVRTMzA0IGNvbW1hbmQgbGFzdCB0aW1lIHRocm91Z2gsIHNvIHRoaXMgdGltZSB3ZSByZXN0b3JlCisJCSAqIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgcmF0ZSBhbmQgaXNzdWUgdGhlIG5vcm1hbCBzdGFybW9kZSByZXNldCBzdHJpbmcuCisJCSAqLworCQlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID09IGdldF9iYXVkKHR0eSkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIwW10gPSAiYXRlMHExczMwND01NzYwMFxyIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIxW10gPSAiYXRlMHExczMwND0xMTUyMDBcciI7CisJCQlzdGF0aWMgY29uc3QgU3RyaW5nRGVzY3JpcHRvciBiYXVkc3RyaW5nWzJdID0KKwkJCSAgICB7IHtiMCwgc2l6ZW9mKGIwKSAtIDF9CisJCQksIHtiMSwgc2l6ZW9mKGIxKSAtIDF9CisJCQl9OworCQkJc2V0X2JhdWQodHR5LCBCMTkyMDApOworCQkJaWYgKHN0cmlwX2luZm8tPnVzZXJfYmF1ZCA9PSBCNTc2MDApCisJCQkJcyA9IGJhdWRzdHJpbmdbMF07CisJCQllbHNlIGlmIChzdHJpcF9pbmZvLT51c2VyX2JhdWQgPT0gQjExNTIwMCkKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsKKwkJCWVsc2UKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsJLyogRm9yIG5vdyAqLworCQl9IGVsc2UKKwkJCXNldF9iYXVkKHR0eSwgc3RyaXBfaW5mby0+dXNlcl9iYXVkKTsKKwl9CisKKwl0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzLnN0cmluZywgcy5sZW5ndGgpOworI2lmZGVmIEVYVF9DT1VOVEVSUworCXN0cmlwX2luZm8tPnR4X2VieXRlcyArPSBzLmxlbmd0aDsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF93cml0ZV9zb21lX21vcmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMgfHwKKwkgICAgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHN0cmlwX2luZm8tPnR4X2xlZnQgPiAwKSB7CisJCWludCBudW1fd3JpdHRlbiA9CisJCSAgICB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzdHJpcF9pbmZvLT50eF9oZWFkLAorCQkJCSAgICAgIHN0cmlwX2luZm8tPnR4X2xlZnQpOworCQlzdHJpcF9pbmZvLT50eF9sZWZ0IC09IG51bV93cml0dGVuOworCQlzdHJpcF9pbmZvLT50eF9oZWFkICs9IG51bV93cml0dGVuOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT50eF9zYnl0ZXMgKz0gbnVtX3dyaXR0ZW47CisjZW5kaWYKKwl9IGVsc2UgewkJLyogRWxzZSBzdGFydCB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJc3RyaXBfdW5sb2NrKHN0cmlwX2luZm8pOworCX0KK30KKworc3RhdGljIF9fdTggKmFkZF9jaGVja3N1bShfX3U4ICogYnVmZmVyLCBfX3U4ICogZW5kKQoreworCV9fdTE2IHN1bSA9IDA7CisJX191OCAqcCA9IGJ1ZmZlcjsKKwl3aGlsZSAocCA8IGVuZCkKKwkJc3VtICs9ICpwKys7CisJZW5kWzNdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzJdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzFdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzBdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlyZXR1cm4gKGVuZCArIDQpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RyaXBfbWFrZV9wYWNrZXQodW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCQlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCAqcHRyID0gYnVmZmVyOworCV9fdTggKnN0dWZmc3RhdGUgPSBOVUxMOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2ItPmRhdGE7CisJTWV0cmljb21BZGRyZXNzIGhhZGRyID0gaGVhZGVyLT5kc3RfYWRkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW4gLSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwlNZXRyaWNvbUtleSBrZXk7CisKKwkvKkhleER1bXAoInN0cmlwX21ha2VfcGFja2V0Iiwgc3RyaXBfaW5mbywgc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBza2ItPmxlbik7ICovCisKKwlpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCWtleSA9IFNJUDBLZXk7CisJZWxzZSBpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKQorCQlrZXkgPSBBUlAwS2V5OworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogc3RyaXBfbWFrZV9wYWNrZXQ6IFVua25vd24gcGFja2V0IHR5cGUgMHglMDRYXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBudG9ocyhoZWFkZXItPnByb3RvY29sKSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJaWYgKGxlbiA+IHN0cmlwX2luZm8tPm10dSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRHJvcHBpbmcgb3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGxlbik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBzZW5kaW5nIHRvIG91cnNlbHZlcywgZGlzY2FyZCB0aGUgcGFja2V0LgorCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJICovCisJaWYgKCFtZW1jbXAoaGFkZHIuYywgc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkci5jLCBzaXplb2YoaGFkZHIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEcm9wcGluZyBwYWNrZXQgYWRkcmVzc2VkIHRvIHNlbGZcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIGJyb2FkY2FzdCBwYWNrZXQsIHNlbmQgaXQgdG8gb3VyIGRlc2lnbmF0ZWQgTWV0cmljb20KKwkgKiAnYnJvYWRjYXN0IGh1YicgcmFkaW8gKEZpcnN0IGJ5dGUgb2YgYWRkcmVzcyBiZWluZyAweEZGIG1lYW5zIGJyb2FkY2FzdCkKKwkgKi8KKwlpZiAoaGFkZHIuY1swXSA9PSAweEZGKSB7CisJCXUzMiBicmQgPSAwOworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldiA9PSBOVUxMKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChpbl9kZXYtPmlmYV9saXN0KQorCQkJYnJkID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2Jyb2FkY2FzdDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJLyogYXJwX3F1ZXJ5IHJldHVybnMgMSBpZiBpdCBzdWNjZWVkcyBpbiBsb29raW5nIHVwIHRoZSBhZGRyZXNzLCAwIGlmIGl0IGZhaWxzICovCisJCWlmICghYXJwX3F1ZXJ5KGhhZGRyLmMsIGJyZCwgc3RyaXBfaW5mby0+ZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gc2VuZCBwYWNrZXQgKG5vIGJyb2FkY2FzdCBodWIgY29uZmlndXJlZClcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgYXJlIHRoZSBicm9hZGNhc3QgaHViLCBkb24ndCBib3RoZXIgc2VuZGluZyB0byBvdXJzZWx2ZXMuCisJCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJCSAqLworCQlpZiAoIW1lbWNtcAorCQkgICAgKGhhZGRyLmMsIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgc2l6ZW9mKGhhZGRyKSkpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCSpwdHIrKyA9IDB4MEQ7CisJKnB0cisrID0gJyonOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbMl0gPj4gNF07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1syXSAmIDB4Rl07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1szXSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzNdICYgMHhGXTsKKwkqcHRyKysgPSAnLSc7CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1s0XSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzRdICYgMHhGXTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzVdID4+IDRdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbNV0gJiAweEZdOworCSpwdHIrKyA9ICcqJzsKKwkqcHRyKysgPSBrZXkuY1swXTsKKwkqcHRyKysgPSBrZXkuY1sxXTsKKwkqcHRyKysgPSBrZXkuY1syXTsKKwkqcHRyKysgPSBrZXkuY1szXTsKKworCXB0ciA9CisJICAgIFN0dWZmRGF0YShza2ItPmRhdGEgKyBzaXplb2YoU1RSSVBfSGVhZGVyKSwgbGVuLCBwdHIsCisJCSAgICAgICZzdHVmZnN0YXRlKTsKKworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlwdHIgPSBhZGRfY2hlY2tzdW0oYnVmZmVyICsgMSwgcHRyKTsKKworCSpwdHIrKyA9IDB4MEQ7CisJcmV0dXJuIChwdHIpOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF9zZW5kKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlNZXRyaWNvbUFkZHJlc3MgaGFkZHI7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlpbnQgZG9yZXNldCA9IChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldCA+PSAwOworCWludCBkb3Byb2JlID0gKGxvbmcpIGppZmZpZXMgLSBzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID49IDAKKwkgICAgJiYgIWRvcmVzZXQ7CisJdTMyIGFkZHIsIGJyZDsKKworCS8qCisJICogMS4gSWYgd2UgaGF2ZSBhIHBhY2tldCwgZW5jYXBzdWxhdGUgaXQgYW5kIHB1dCBpdCBpbiB0aGUgYnVmZmVyCisJICovCisJaWYgKHNrYikgeworCQljaGFyICpuZXdwdHIgPSBzdHJpcF9tYWtlX3BhY2tldChwdHIsIHN0cmlwX2luZm8sIHNrYik7CisJCXN0cmlwX2luZm8tPnR4X3Bwc19jb3VudCsrOworCQlpZiAoIW5ld3B0cikKKwkJCXN0cmlwX2luZm8tPnR4X2Ryb3BwZWQrKzsKKwkJZWxzZSB7CisJCQlwdHIgPSBuZXdwdHI7CisJCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQrKzsKKwkJCXN0cmlwX2luZm8tPnR4X3BhY2tldHMrKzsJLyogQ291bnQgYW5vdGhlciBzdWNjZXNzZnVsIHBhY2tldCAqLworI2lmZGVmIEVYVF9DT1VOVEVSUworCQkJc3RyaXBfaW5mby0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdHJpcF9pbmZvLT50eF9yYnl0ZXMgKz0gcHRyIC0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKyNlbmRpZgorCQkJLypEdW1wRGF0YSgiU2VuZGluZzoiLCBzdHJpcF9pbmZvLCBzdHJpcF9pbmZvLT50eF9idWZmLCBwdHIpOyAqLworCQkJLypIZXhEdW1wKCJTZW5kaW5nIiwgc3RyaXBfaW5mbywgc3RyaXBfaW5mby0+dHhfYnVmZiwgcHRyKTsgKi8KKwkJfQorCX0KKworCS8qCisJICogMi4gSWYgaXQgaXMgdGltZSBmb3IgYW5vdGhlciB0aWNrbGUsIHRhY2sgaXQgb24sIGFmdGVyIHRoZSBwYWNrZXQKKwkgKi8KKwlpZiAoZG9wcm9iZSkgeworCQlTdHJpbmdEZXNjcmlwdG9yIHRzID0gQ29tbWFuZFN0cmluZ1tzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmRdOworI2lmIFRJQ0tMRV9USU1FUlMKKwkJeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIioqKiogU2VuZGluZyB0aWNrbGUgc3RyaW5nICVkICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPm5leHRfY29tbWFuZCwgdHYudHZfc2VjICUgMTAwLAorCQkJICAgICAgIHR2LnR2X3VzZWMpOworCQl9CisjZW5kaWYKKwkJaWYgKHB0ciA9PSBzdHJpcF9pbmZvLT50eF9idWZmKQorCQkJKnB0cisrID0gMHgwRDsKKworCQkqcHRyKysgPSAnKic7CS8qIEZpcnN0IHNlbmQgIioqIiB0byBwcm92b2tlIGFuIGVycm9yIG1lc3NhZ2UgKi8KKwkJKnB0cisrID0gJyonOworCisJCS8qIFRoZW4gYWRkIHRoZSBjb21tYW5kICovCisJCW1lbWNweShwdHIsIHRzLnN0cmluZywgdHMubGVuZ3RoKTsKKworCQkvKiBBZGQgYSBjaGVja3N1bSA/ICovCisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA8IENoZWNrc3VtbWVkTWVzc2FnZXMpCisJCQlwdHIgKz0gdHMubGVuZ3RoOworCQllbHNlCisJCQlwdHIgPSBhZGRfY2hlY2tzdW0ocHRyLCBwdHIgKyB0cy5sZW5ndGgpOworCisJCSpwdHIrKyA9IDB4MEQ7CS8qIFRlcm1pbmF0ZSB0aGUgY29tbWFuZCB3aXRoIGEgPENSPiAqLworCisJCS8qIEN5Y2xlIHRvIG5leHQgcGVyaW9kaWMgY29tbWFuZD8gKi8KKwkJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID49IFN0cnVjdHVyZWRNZXNzYWdlcykKKwkJCWlmICgrK3N0cmlwX2luZm8tPm5leHRfY29tbWFuZCA+PQorCQkJICAgIEFSUkFZX1NJWkUoQ29tbWFuZFN0cmluZykpCisJCQkJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gMDsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc3RyaXBfaW5mby0+dHhfZWJ5dGVzICs9IHRzLmxlbmd0aDsKKyNlbmRpZgorCQlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID0gamlmZmllcyArIDEwICogSFo7CisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgMSAqIEhaOworCQkvKnByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0aW5lIHJhZGlvIHRlc3QuXG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOyAqLworCX0KKworCS8qCisJICogMy4gU2V0IHVwIHRoZSBzdHJpcF9pbmZvIHJlYWR5IHRvIHNlbmQgdGhlIGRhdGEgKGlmIGFueSkuCisJICovCisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IHB0ciAtIHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCS8qCisJICogNC4gRGVidWdnaW5nIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgb3ZlcmZsb3dpbmcgdGhlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoc3RyaXBfaW5mby0+dHhfc2l6ZSAtIHN0cmlwX2luZm8tPnR4X2xlZnQgPCAyMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU2VuZGluZyU1ZCBieXRlczslNWQgYnl0ZXMgZnJlZS5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHN0cmlwX2luZm8tPnR4X2xlZnQsCisJCSAgICAgICBzdHJpcF9pbmZvLT50eF9zaXplIC0gc3RyaXBfaW5mby0+dHhfbGVmdCk7CisKKwkvKgorCSAqIDUuIElmIHdhdGNoZG9nIGhhcyBleHBpcmVkLCByZXNldCB0aGUgcmFkaW8uIE5vdGU6IGlmIHRoZXJlJ3MgZGF0YSB3YWl0aW5nIGluCisJICogdGhlIGJ1ZmZlciwgc3RyaXBfd3JpdGVfc29tZV9tb3JlIHdpbGwgc2VuZCBpdCBhZnRlciB0aGUgcmVzZXQgaGFzIGZpbmlzaGVkCisJICovCisJaWYgKGRvcmVzZXQpIHsKKwkJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgxKSB7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCQlicmQgPSBhZGRyID0gMDsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldikgeworCQkJaWYgKGluX2Rldi0+aWZhX2xpc3QpIHsKKwkJCQlicmQgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYnJvYWRjYXN0OworCQkJCWFkZHIgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisKKwkvKgorCSAqIDYuIElmIGl0IGlzIHRpbWUgZm9yIGEgcGVyaW9kaWMgQVJQLCBxdWV1ZSBvbmUgdXAgdG8gYmUgc2VudC4KKwkgKiBXZSBvbmx5IGRvIHRoaXMgaWY6CisJICogIDEuIFRoZSByYWRpbyBpcyB3b3JraW5nCisJICogIDIuIEl0J3MgdGltZSB0byBzZW5kIGFub3RoZXIgcGVyaW9kaWMgQVJQCisJICogIDMuIFdlIHJlYWxseSBrbm93IHdoYXQgb3VyIGFkZHJlc3MgaXMgKGFuZCBpdCBpcyBub3QgbWFudWFsbHkgc2V0IHRvIHplcm8pCisJICogIDQuIFdlIGhhdmUgYSBkZXNpZ25hdGVkIGJyb2FkY2FzdCBhZGRyZXNzIGNvbmZpZ3VyZWQKKwkgKiBJZiB3ZSBxdWV1ZSB1cCBhbiBBUlAgcGFja2V0IHdoZW4gd2UgZG9uJ3QgaGF2ZSBhIGRlc2lnbmF0ZWQgYnJvYWRjYXN0CisJICogYWRkcmVzcyBjb25maWd1cmVkLCB0aGVuIHRoZSBwYWNrZXQgd2lsbCBqdXN0IGhhdmUgdG8gYmUgZGlzY2FyZGVkIGluCisJICogc3RyaXBfbWFrZV9wYWNrZXQuIFRoaXMgaXMgbm90IGZhdGFsLCBidXQgaXQgY2F1c2VzIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGNwZHVtcC4gdGNwZHVtcCB3aWxsIHJlcG9ydCB0aGF0IHBlcmlvZGljIEFQUnMgYXJlCisJICogYmVpbmcgc2VudCwgd2hlbiBpbiBmYWN0IHRoZXkgYXJlIG5vdCwgYmVjYXVzZSB0aGV5IGFyZSBhbGwgYmVpbmcgZHJvcHBlZAorCSAqIGluIHRoZSBzdHJpcF9tYWtlX3BhY2tldCByb3V0aW5lLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nCisJICAgICYmIChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnAgPj0gMAorCSAgICAmJiBtZW1jbXAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKQorCSAgICAmJiBhcnBfcXVlcnkoaGFkZHIuYywgYnJkLCBzdHJpcF9pbmZvLT5kZXYpKSB7CisJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgZ3JhdHVpdG91cyBBUlAgd2l0aCBpbnRlcnZhbCAlbGRcbiIsCisJCSAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsIC8gSFopOyAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9CisJCSAgICBqaWZmaWVzICsgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgKj0gMjsKKwkJaWYgKHN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA+IE1heEFSUEludGVydmFsKQorCQkJc3RyaXBfaW5mby0+YXJwX2ludGVydmFsID0gTWF4QVJQSW50ZXJ2YWw7CisJCWlmIChhZGRyKQorCQkJYXJwX3NlbmQoQVJQT1BfUkVQTFksIEVUSF9QX0FSUCwgYWRkciwJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgQVJQIHBhY2tldCBpcyBvdXIgYWRkcmVzcyAqLworCQkJCSBzdHJpcF9pbmZvLT5kZXYsCS8qIERldmljZSB0byBzZW5kIHBhY2tldCBvbiAqLworCQkJCSBhZGRyLAkvKiBTb3VyY2UgSVAgYWRkcmVzcyB0aGlzIEFSUCBwYWNrZXQgY29tZXMgZnJvbSAqLworCQkJCSBOVUxMLAkvKiBEZXN0aW5hdGlvbiBIVyBhZGRyZXNzIGlzIE5VTEwgKGJyb2FkY2FzdCBpdCkgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwJLyogU291cmNlIEhXIGFkZHJlc3MgaXMgb3VyIEhXIGFkZHJlc3MgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkcik7CS8qIFRhcmdldCBIVyBhZGRyZXNzIGlzIG91ciBIVyBhZGRyZXNzIChyZWR1bmRhbnQpICovCisJfQorCisJLyoKKwkgKiA3LiBBbGwgcmVhZHkuIFN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKwkgKi8KKwlzdHJpcF93cml0ZV9zb21lX21vcmUoc3RyaXBfaW5mby0+dHR5KTsKK30KKworLyogRW5jYXBzdWxhdGUgYSBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIGludCBzdHJpcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gKDEpOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisKKworCWlmIChqaWZmaWVzIC0gc3RyaXBfaW5mby0+cHBzX3RpbWVyID4gSFopIHsKKwkJdW5zaWduZWQgbG9uZyB0ID0gamlmZmllcyAtIHN0cmlwX2luZm8tPnBwc190aW1lcjsKKwkJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+cnhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyB0eF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyBzeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+c3hfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKworCQlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCQlzdHJpcF9pbmZvLT5yeF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT50eF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCisJCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gKHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzICsgcnhfcHBzX2NvdW50ICsgMSkgLyAyOworCQlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IChzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyArIHR4X3Bwc19jb3VudCArIDEpIC8gMjsKKwkJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAoc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgKyBzeF9wcHNfY291bnQgKyAxKSAvIDI7CisKKwkJaWYgKHJ4X3Bwc19jb3VudCAvIDggPj0gMTApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogV0FSTklORzogUmVjZWl2aW5nICVsZCBwYWNrZXRzIHBlciBzZWNvbmQuXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcnhfcHBzX2NvdW50IC8gOCk7CisJCWlmICh0eF9wcHNfY291bnQgLyA4ID49IDEwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IFR4ICAgICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kLlxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHR4X3Bwc19jb3VudCAvIDgpOworCQlpZiAoc3hfcHBzX2NvdW50IC8gOCA+PSAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBTZW5kaW5nICAgJWxkIHBhY2tldHMgcGVyIHNlY29uZC5cbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzeF9wcHNfY291bnQgLyA4KTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfc2VuZChzdHJpcF9pbmZvLCBza2IpOworCisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogSWRsZVRhc2sgcGVyaW9kaWNhbGx5IGNhbGxzIHN0cmlwX3htaXQsIHNvIGV2ZW4gd2hlbiB3ZSBoYXZlIG5vIElQIHBhY2tldHMKKyAqIHRvIHNlbmQgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgcHJvY2Vzc2luZyBzdGlsbCBnZXRzCisgKiBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSByYWRpbyBzdGF5cyBpbiBTdGFybW9kZQorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX0lkbGVUYXNrKHVuc2lnbmVkIGxvbmcgcGFyYW1ldGVyKQoreworCXN0cmlwX3htaXQoTlVMTCwgKHN0cnVjdCBuZXRfZGV2aWNlICopIHBhcmFtZXRlcik7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIE1BQyBoZWFkZXIgZm9yIGFuIGFyYml0cmFyeSBwcm90b2NvbCBsYXllcgorICoKKyAqIHNhZGRyIT1OVUxMICAgICAgICBtZWFucyB1c2UgdGhpcyBzcGVjaWZpYyBhZGRyZXNzIChuL2EgZm9yIE1ldHJpY29tKQorICogc2FkZHI9PU5VTEwgICAgICAgIG1lYW5zIHVzZSBkZWZhdWx0IGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHIhPU5VTEwgICAgICAgIG1lYW5zIHVzZSB0aGlzIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIGRhZGRyPT1OVUxMICAgICAgICBtZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFsb25lCisgKiAgICAgICAgICAgICAgICAgKGUuZy4gdW5yZXNvbHZlZCBhcnAgLS0ga2VybmVsIHdpbGwgY2FsbAorICogICAgICAgICAgICAgICAgIHJlYnVpbGRfaGVhZGVyIGxhdGVyIHRvIGZpbGwgaW4gdGhlIGFkZHJlc3MpCisgKi8KKworc3RhdGljIGludCBzdHJpcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCXVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2JfcHVzaChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX2hlYWRlciAweCUwNFggJXNcbiIsIGRldi0+bmFtZSwgdHlwZSwKKwkgICB0eXBlID09IEVUSF9QX0lQID8gIklQIiA6IHR5cGUgPT0gRVRIX1BfQVJQID8gIkFSUCIgOiAiIik7ICovCisKKwloZWFkZXItPnNyY19hZGRyID0gc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkcjsKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnModHlwZSk7CisKKwkvKkhleER1bXAoInN0cmlwX2hlYWRlciIsIG5ldGRldl9wcml2KGRldiksIHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgc2tiLT5sZW4pOyAqLworCisJaWYgKCFkYWRkcikKKwkJcmV0dXJuICgtZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJaGVhZGVyLT5kc3RfYWRkciA9ICooTWV0cmljb21BZGRyZXNzICopIGRhZGRyOworCXJldHVybiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworfQorCisvKgorICogUmVidWlsZCB0aGUgTUFDIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQCisgKiAob3IgaW4gZnV0dXJlIG90aGVyIGFkZHJlc3MgcmVzb2x1dGlvbikgaGFzIGNvbXBsZXRlZCBvbiB0aGlzCisgKiBza19idWZmLiBXZSBub3cgbGV0IEFSUCBmaWxsIGluIHRoZSBvdGhlciBmaWVsZHMuCisgKiBJIHRoaW5rIHRoaXMgc2hvdWxkIHJldHVybiB6ZXJvIGlmIHBhY2tldCBpcyByZWFkeSB0byBzZW5kLAorICogb3Igbm9uLXplcm8gaWYgaXQgbmVlZHMgbW9yZSB0aW1lIHRvIGRvIGFuIGFkZHJlc3MgbG9va3VwCisgKi8KKworc3RhdGljIGludCBzdHJpcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJU1RSSVBfSGVhZGVyICpoZWFkZXIgPSAoU1RSSVBfSGVhZGVyICopIHNrYi0+ZGF0YTsKKworCS8qIEFycCBmaW5kIHJldHVybnMgemVybyBpZiBpZiBrbm93cyB0aGUgYWRkcmVzcywgKi8KKwkvKiBvciBpZiBpdCBkb2Vzbid0IGtub3cgdGhlIGFkZHJlc3MgaXQgc2VuZHMgYW4gQVJQIHBhY2tldCBhbmQgcmV0dXJucyBub24temVybyAqLworCXJldHVybiBhcnBfZmluZChoZWFkZXItPmRzdF9hZGRyLmMsIHNrYikgPyAxIDogMDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2aW5nIHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDB4MTAwMDA7CQkvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzAwPyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gdmVyc2lvbiBhbmQgc2VyaWFsIG51bWJlci4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3JhZGlvX3ZlcnNpb24oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCV9fdTggKnAsICp2YWx1ZV9iZWdpbiwgKnZhbHVlX2VuZDsKKwlpbnQgbGVuOworCisJLyogRGV0ZXJtaW5lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwYXlsb2FkICovCisJcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAxMCkKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCXArKzsKKwl2YWx1ZV9iZWdpbiA9IHA7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGVuZCBvZiBsaW5lICovCisJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gMTApCisJCXArKzsKKwlpZiAocCA+PSBlbmQpCisJCXJldHVybjsKKwl2YWx1ZV9lbmQgPSBwOworCXArKzsKKworCWxlbiA9IHZhbHVlX2VuZCAtIHZhbHVlX2JlZ2luOworCWxlbiA9IG1pbl90KGludCwgbGVuLCBzaXplb2YoRmlybXdhcmVWZXJzaW9uKSAtIDEpOworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIEZpcm13YXJlOiAlLipzXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBsZW4sIHZhbHVlX2JlZ2luKTsKKwlzcHJpbnRmKHN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uYywgIiUuKnMiLCBsZW4sIHZhbHVlX2JlZ2luKTsKKworCS8qIExvb2sgZm9yIHRoZSBmaXJzdCBjb2xvbiAqLworCXdoaWxlIChwIDwgZW5kICYmICpwICE9ICc6JykKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCS8qIFNraXAgb3ZlciB0aGUgc3BhY2UgKi8KKwlwICs9IDI7CisJbGVuID0gc2l6ZW9mKFNlcmlhbE51bWJlcikgLSAxOworCWlmIChwICsgbGVuIDw9IGVuZCkgeworCQlzcHJpbnRmKHN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuYywgIiUuKnMiLCBsZW4sIHApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHNlcmlhbCBudW1iZXIgc2hvcnRlciAoJXpkKSB0aGFuIGV4cGVjdGVkICglZClcbiIsCisJCSAgICAgICBlbmQgLSBwLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzI1PyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gYmF0dGVyeSB2b2x0YWdlLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmFkaW9fdm9sdGFnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNpemVvZihCYXR0ZXJ5Vm9sdGFnZSkgLSAxOworCWlmIChwdHIgKyBsZW4gPD0gZW5kKSB7CisJCXNwcmludGYoc3RyaXBfaW5mby0+YmF0dGVyeV92b2x0YWdlLmMsICIlLipzIiwgbGVuLCBwdHIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHZvbHRhZ2Ugc3RyaW5nIHNob3J0ZXIgKCV6ZCkgdGhhbiBleHBlY3RlZCAoJWQpXG4iLAorCQkgICAgICAgZW5kIC0gcHRyLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZXMgdG8gdGhlIEFUfkxBIGFuZCBBVFMzMTEgY29tbWFuZHMsCisgKiB3aGljaCBsaXN0IHRoZSByYWRpbydzIG5laWdoYm91cnMuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYWRpb19uZWlnaGJvdXJzKE1ldHJpY29tTm9kZVRhYmxlICogdGFibGUsIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJdGFibGUtPm51bV9ub2RlcyA9IDA7CisJd2hpbGUgKHB0ciA8IGVuZCAmJiB0YWJsZS0+bnVtX25vZGVzIDwgTk9ERV9UQUJMRV9TSVpFKSB7CisJCU1ldHJpY29tTm9kZSAqbm9kZSA9ICZ0YWJsZS0+bm9kZVt0YWJsZS0+bnVtX25vZGVzKytdOworCQljaGFyICpkc3QgPSBub2RlLT5jLCAqbGltaXQgPSBkc3QgKyBzaXplb2YoKm5vZGUpIC0gMTsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyIDw9IDMyKQorCQkJcHRyKys7CisJCXdoaWxlIChwdHIgPCBlbmQgJiYgZHN0IDwgbGltaXQgJiYgKnB0ciAhPSAxMCkKKwkJCSpkc3QrKyA9ICpwdHIrKzsKKwkJKmRzdCsrID0gMDsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiBwdHJbLTFdICE9IDEwKQorCQkJcHRyKys7CisJfQorCWRvX2dldHRpbWVvZmRheSgmdGFibGUtPnRpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JhZGlvX2FkZHJlc3Moc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcCkKK3sKKwlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKworCWlmIChzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcygmYWRkciwgcCkpCisJCXJldHVybiAoMSk7CisKKwkvKiBTZWUgaWYgb3VyIHJhZGlvIGFkZHJlc3MgaGFzIGNoYW5nZWQgKi8KKwlpZiAobWVtY21wKHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgYWRkci5jLCBzaXplb2YoYWRkcikpKSB7CisJCU1ldHJpY29tQWRkcmVzc1N0cmluZyBhZGRyX3N0cmluZzsKKwkJcmFkaW9fYWRkcmVzc190b19zdHJpbmcoJmFkZHIsICZhZGRyX3N0cmluZyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyBhZGRyZXNzID0gJXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGFkZHJfc3RyaW5nLmMpOworCQlzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyID0gYWRkcjsKKwkJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCQkqKE1ldHJpY29tQWRkcmVzcyAqKSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyID0KKwkJCSAgICBhZGRyOworCQkvKiBHaXZlIHRoZSByYWRpbyBhIGZldyBzZWNvbmRzIHRvIGdldCBpdHMgaGVhZCBzdHJhaWdodCwgdGhlbiBzZW5kIGFuIGFycCAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9IGppZmZpZXMgKyAxNSAqIEhaOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgPSAxICogSFo7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwID0gc3RyaXBfaW5mby0+c3hfYnVmZjsKKwlfX3U4ICplbmQgPSBzdHJpcF9pbmZvLT5zeF9idWZmICsgc3RyaXBfaW5mby0+c3hfY291bnQgLSA0OworCXVfc2hvcnQgc3VtID0KKwkgICAgKFJFQURIRVgxNihlbmRbMF0pIDw8IDEyKSB8IChSRUFESEVYMTYoZW5kWzFdKSA8PCA4KSB8CisJICAgIChSRUFESEVYMTYoZW5kWzJdKSA8PCA0KSB8IChSRUFESEVYMTYoZW5kWzNdKSk7CisJd2hpbGUgKHAgPCBlbmQpCisJCXN1bSAtPSAqcCsrOworCWlmIChzdW0gPT0gMCAmJiBzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBTdHJ1Y3R1cmVkTWVzc2FnZXMpIHsKKwkJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBDaGVja3N1bW1lZE1lc3NhZ2VzOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gcHJvdmlkZXMgbWVzc2FnZSBjaGVja3N1bXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKwlyZXR1cm4gKHN1bSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycihjaGFyICptc2csIHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlEdW1wRGF0YShtc2csIHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwlzdHJpcF9pbmZvLT5yeF9lcnJvcnMrKzsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycl9NZXNzYWdlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHNlbmRlcm5hbWUsCisJCQkgICAgY29uc3QgX191OCAqIG1zZywgdV9sb25nIGxlbikKK3sKKwlpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMSIpKSB7CS8qIE5vdCBpbiBTdGFyTW9kZSEgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gJXMgaXMgbm90IGluIFN0YXJNb2RlXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzZW5kZXJuYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDAyIikpIHsJLyogUmVtYXAgaGFuZGxlICovCisJCS8qIFdlIGlnbm9yZSAiUmVtYXAgaGFuZGxlIiBtZXNzYWdlcyBmb3Igbm93ICovCisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMyIpKSB7CS8qIENhbid0IHJlc29sdmUgbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXN0aW5hdGlvbiByYWRpbyBuYW1lIGlzIHVua25vd25cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDQiKSkgewkvKiBOYW1lIHRvbyBzbWFsbCBvciBtaXNzaW5nICovCisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgTG9uZ1RpbWU7CisjaWYgVElDS0xFX1RJTUVSUworCQl7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIqKioqIEdvdCBFUlJfMDA0IHJlc3BvbnNlICAgICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJCX0KKyNlbmRpZgorCQlpZiAoIXN0cmlwX2luZm8tPndvcmtpbmcpIHsKKwkJCXN0cmlwX2luZm8tPndvcmtpbmcgPSBUUlVFOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIG5vdyBpbiBzdGFybW9kZVxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMganVzdCBlbnRlcmVkIGEgd29ya2luZyBzdGF0ZSwgd2Ugc2hvdWxkIGRvIG91ciBmaXJzdAorCQkJICogcHJvYmUgQVNBUCwgc28gdGhhdCB3ZSBmaW5kIG91dCBvdXIgcmFkaW8gYWRkcmVzcyBldGMuIHdpdGhvdXQgZGVsYXkuCisJCQkgKi8KKwkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBOb1N0cnVjdHVyZSAmJiBzZW5kZXJuYW1lKSB7CisJCQlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IFN0cnVjdHVyZWRNZXNzYWdlczsKKwkJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IDA7CS8qIFRyeSB0byBlbmFibGUgY2hlY2tzdW1zIEFTQVAgKi8KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IFJhZGlvIHByb3ZpZGVzIHN0cnVjdHVyZWQgbWVzc2FnZXNcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJfQorCQlpZiAoc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPj0gU3RydWN0dXJlZE1lc3NhZ2VzKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGhhcyBhIHZhbGlkIGNoZWNrc3VtIG9uIHRoZSBlbmQsIHRoZW4gdGhlIGNhbGwgdG8gdmVyaWZ5X2NoZWNrc3VtCisJCQkgKiB3aWxsIGVsZXZhdGUgdGhlIGZpcm13YXJlX2xldmVsIHRvIENoZWNrc3VtbWVkTWVzc2FnZXMgZm9yIHVzLiAoVGhlIGFjdHVhbCByZXR1cm4KKwkJCSAqIGNvZGUgZnJvbSB2ZXJpZnlfY2hlY2tzdW0gaXMgaWdub3JlZCBoZXJlLikKKwkJCSAqLworCQkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMgc3RydWN0dXJlZCBtZXNzYWdlcyBidXQgd2UgZG9uJ3QgeWV0IGhhdmUgYWxsIG91ciBpbmZvcm1hdGlvbiBhYm91dCBpdCwKKwkJCSAqIHdlIHNob3VsZCBkbyBwcm9iZXMgd2l0aG91dCBkZWxheSwgdW50aWwgd2UgaGF2ZSBnYXRoZXJlZCBhbGwgdGhlIGluZm9ybWF0aW9uCisJCQkgKi8KKwkJCWlmICghR09UX0FMTF9SQURJT19JTkZPKHN0cmlwX2luZm8pKQorCQkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwNSIpKQkvKiBCYWQgY291bnQgc3BlY2lmaWNhdGlvbiAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA2IikpCS8qIEhlYWRlciB0b28gYmlnICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDciKSkgewkvKiBCb2R5IHRvbyBiaWcgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IhIFBhY2tldCBzaXplIHRvbyBiaWcgZm9yIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwOCIpKSB7CS8qIEJhZCBjaGFyYWN0ZXIgaW4gbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBSYWRpbyBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA5IikpCS8qIE5vIGNvdW50IG9yIGxpbmUgdGVybWluYXRvciAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDEwIikpCS8qIEludmFsaWQgY2hlY2tzdW0gKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMSIpKQkvKiBDaGVja3N1bSBkaWRuJ3QgbWF0Y2ggKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMiIpKQkvKiBGYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0ICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UKKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwKKwkJCQlfX3U4ICogZW5kKQoreworCXVfbG9uZyBsZW47CisJX191OCAqcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiBwWy0xXSAhPSAxMCkKKwkJcCsrOwkJLyogU2tpcCBwYXN0IGZpcnN0IG5ld2xpbmUgY2hhcmFjdGVyICovCisJLyogTm93IHB0ciBwb2ludHMgdG8gdGhlIEFUIGNvbW1hbmQsIGFuZCBwIHBvaW50cyB0byB0aGUgdGV4dCBvZiB0aGUgcmVzcG9uc2UuICovCisJbGVuID0gcCAtIHB0cjsKKworI2lmIFRJQ0tMRV9USU1FUlMKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKioqKiBHb3QgQVQgcmVzcG9uc2UgJS43cyAgICAgIGF0ICUwMmQuJTA2ZFxuIiwKKwkJICAgICAgIHB0ciwgdHYudHZfc2VjICUgMTAwLCB0di50dl91c2VjKTsKKwl9CisjZW5kaWYKKworCWlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzAwPyIpKQorCQlnZXRfcmFkaW9fdmVyc2lvbihzdHJpcF9pbmZvLCBwLCBlbmQpOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMDU/IikpCisJCWdldF9yYWRpb19hZGRyZXNzKHN0cmlwX2luZm8sIHApOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMTE/IikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb2xldG9wcywgcCwgZW5kKTsKKwllbHNlIGlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzE5PTciKSkKKwkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMjU/IikpCisJCWdldF9yYWRpb192b2x0YWdlKHN0cmlwX2luZm8sIHAsIGVuZCk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUfkxBIikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsIHAsIGVuZCk7CisJZWxzZQorCQlSZWN2RXJyKCJVbmtub3duIEFUIFJlc3BvbnNlOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FDSyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJLyogQ3VycmVudGx5IHdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggQUNLcyBmcm9tIHRoZSByYWRpbyAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0luZm8oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCWlmIChwdHIgKyAxNiA+IGVuZCkKKwkJUmVjdkVycigiQmFkIEluZm8gTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9zdHJpcF9kZXYoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCS8qIElmIG91ciBoYXJkd2FyZSBhZGRyZXNzIGlzICptYW51YWxseSBzZXQqIHRvIHplcm8sIGFuZCB3ZSBrbm93IG91ciAqLworCS8qIHJlYWwgcmFkaW8gaGFyZHdhcmUgYWRkcmVzcywgdHJ5IHRvIGZpbmQgYW5vdGhlciBzdHJpcCBkZXZpY2UgdGhhdCBoYXMgYmVlbiAqLworCS8qIG1hbnVhbGx5IHNldCB0byB0aGF0IGFkZHJlc3MgdGhhdCB3ZSBjYW4gJ3RyYW5zZmVyIG93bmVyc2hpcCcgb2YgdGhpcyBwYWNrZXQgdG8gICovCisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkciAmJgorCSAgICAhbWVtY21wKHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIsIHplcm9fYWRkcmVzcy5jLAorCQkgICAgc2l6ZW9mKHplcm9fYWRkcmVzcykpCisJICAgICYmIG1lbWNtcCgmc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlyZWFkX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCQlkZXYgPSBkZXZfYmFzZTsKKwkJd2hpbGUgKGRldikgeworCQkJaWYgKGRldi0+dHlwZSA9PSBzdHJpcF9pbmZvLT5kZXYtPnR5cGUgJiYKKwkJCSAgICAhbWVtY21wKGRldi0+ZGV2X2FkZHIsCisJCQkJICAgICZzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyLAorCQkJCSAgICBzaXplb2YoTWV0cmljb21BZGRyZXNzKSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlczogVHJhbnNmZXJyZWQgcGFja2V0IG93bmVyc2hpcCB0byAlcy5cbiIsCisJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKKwkJCQlyZWFkX3VubG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CisJCQkJcmV0dXJuIChkZXYpOworCQkJfQorCQkJZGV2ID0gZGV2LT5uZXh0OworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKwl9CisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYpOworfQorCisvKgorICogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgZGF0YWdyYW0gdG8gdGhlIG5leHQgbGF5ZXIuCisgKi8KKworc3RhdGljIHZvaWQgZGVsaXZlcl9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBTVFJJUF9IZWFkZXIgKiBoZWFkZXIsCisJCQkgICBfX3UxNiBwYWNrZXRsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKFNUUklQX0hlYWRlcikgKyBwYWNrZXRsZW4pOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKFNUUklQX0hlYWRlcikpLCBoZWFkZXIsCisJCSAgICAgICBzaXplb2YoU1RSSVBfSGVhZGVyKSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0bGVuKSwgc3RyaXBfaW5mby0+cnhfYnVmZiwKKwkJICAgICAgIHBhY2tldGxlbik7CisJCXNrYi0+ZGV2ID0gZ2V0X3N0cmlwX2RldihzdHJpcF9pbmZvKTsKKwkJc2tiLT5wcm90b2NvbCA9IGhlYWRlci0+cHJvdG9jb2w7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCQkvKiBIYXZpbmcgcHV0IGEgZmFrZSBoZWFkZXIgb24gdGhlIGZyb250IG9mIHRoZSBza19idWZmIGZvciB0aGUgKi8KKwkJLyogYmVuZWZpdCBvZiB0b29scyBsaWtlIHRjcGR1bXAsIHNrYl9wdWxsIG5vdyAnY29uc3VtZXMnIHRoYXQgICovCisJCS8qIGZha2UgaGVhZGVyIGJlZm9yZSB3ZSBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIuICAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCQkvKiBGaW5hbGx5LCBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIgKGUuZy4gSVAgb3IgQVJQLCBldGMuKSAqLworCQlzdHJpcF9pbmZvLT5yeF9wYWNrZXRzKys7CisJCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCsrOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT5yeF9ieXRlcyArPSBwYWNrZXRsZW47CisjZW5kaWYKKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19JUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgU1RSSVBfSGVhZGVyICogaGVhZGVyLCBfX3U4ICogcHRyLAorCQkJICAgICAgX191OCAqIGVuZCkKK3sKKwlfX3UxNiBwYWNrZXRsZW47CisKKwkvKiBEZWNvZGUgc3RhcnQgb2YgdGhlIElQIHBhY2tldCBoZWFkZXIgKi8KKwlwdHIgPSBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiwgNCk7CisJaWYgKCFwdHIpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJcGFja2V0bGVuID0gKChfX3UxNikgc3RyaXBfaW5mby0+cnhfYnVmZlsyXSA8PCA4KSB8IHN0cmlwX2luZm8tPnJ4X2J1ZmZbM107CisKKwlpZiAocGFja2V0bGVuID4gTUFYX1JFQ1ZfTVRVKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgSVAgcGFja2V0OiAlZCBieXRlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290ICVkIGJ5dGUgSVAgcGFja2V0XG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBJUCBwYWNrZXQgKi8KKwlwdHIgPQorCSAgICBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiArIDQsIHBhY2tldGxlbiAtIDQpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIklQIFBhY2tldCB0b28gc2hvcnQiLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwdHIgPCBlbmQpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJZGVsaXZlcl9wYWNrZXQoc3RyaXBfaW5mbywgaGVhZGVyLCBwYWNrZXRsZW4pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FSUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgIFNUUklQX0hlYWRlciAqIGhlYWRlciwgX191OCAqIHB0ciwKKwkJCSAgICAgICBfX3U4ICogZW5kKQoreworCV9fdTE2IHBhY2tldGxlbjsKKwlzdHJ1Y3QgYXJwaGRyICphcnBoZHIgPSAoc3RydWN0IGFycGhkciAqKSBzdHJpcF9pbmZvLT5yeF9idWZmOworCisJLyogRGVjb2RlIHN0YXJ0IG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0gVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYsIDgpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIkFSUCBQYWNrZXQgdG9vIHNob3J0Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlwYWNrZXRsZW4gPSA4ICsgKGFycGhkci0+YXJfaGxuICsgYXJwaGRyLT5hcl9wbG4pICogMjsKKworCWlmIChwYWNrZXRsZW4gPiBNQVhfUkVDVl9NVFUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgQVJQIHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7CisJCXN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvdCAlZCBieXRlIEFSUCAlc1xuIiwKKwkgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbiwKKwkgICBudG9ocyhhcnBoZHItPmFyX29wKSA9PSBBUlBPUF9SRVFVRVNUID8gInJlcXVlc3QiIDogInJlcGx5Iik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0KKwkgICAgVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYgKyA4LCBwYWNrZXRsZW4gLSA4KTsKKwlpZiAoIXB0cikgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciA8IGVuZCkgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKworCWRlbGl2ZXJfcGFja2V0KHN0cmlwX2luZm8sIGhlYWRlciwgcGFja2V0bGVuKTsKK30KKworLyoKKyAqIHByb2Nlc3NfdGV4dF9tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpbyB0aGF0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhICcqJyBjaGFyYWN0ZXIuIEFsbCBub3JtYWwKKyAqIFN0YXJtb2RlIGNvbW11bmljYXRpb24gbWVzc2FnZXMgd2l0aCB0aGUgcmFkaW8gYmVnaW4gd2l0aCBhICcqJywKKyAqIHNvIGFueSB0ZXh0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGVzIGEgc2VyaWFsIHBvcnQgZXJyb3IsIGEgcmFkaW8gdGhhdAorICogaXMgaW4gSGF5ZXMgY29tbWFuZCBtb2RlIGluc3RlYWQgb2YgU3Rhcm1vZGUsIG9yIGEgcmFkaW8gd2l0aCByZWFsbHkKKyAqIG9sZCBmaXJtd2FyZSB0aGF0IGRvZXNuJ3QgZnJhbWUgaXRzIFN0YXJtb2RlIHJlc3BvbnNlcyBwcm9wZXJseS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc190ZXh0X21lc3NhZ2Uoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCV9fdTggKm1zZyA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJaW50IGxlbiA9IHN0cmlwX2luZm8tPnN4X2NvdW50OworCisJLyogQ2hlY2sgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBvdXIgcmFkaW8gbmFtZSAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAgKi8KKwlpZiAobGVuID09IDkgJiYgZ2V0X3JhZGlvX2FkZHJlc3Moc3RyaXBfaW5mbywgbXNnKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAodGV4dF9lcXVhbChtc2csIGxlbiwgIk9LIikpCisJCXJldHVybjsJCS8qIElnbm9yZSAnT0snIHJlc3BvbnNlcyBmcm9tIHByaW9yIGNvbW1hbmRzICovCisJaWYgKHRleHRfZXF1YWwobXNnLCBsZW4sICJFUlJPUiIpKQorCQlyZXR1cm47CQkvKiBJZ25vcmUgJ0VSUk9SJyBtZXNzYWdlcyAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiYXRlMHExIikpCisJCXJldHVybjsJCS8qIElnbm9yZSBjaGFyYWN0ZXIgZWNobyBiYWNrIGZyb20gdGhlIHJhZGlvICovCisKKwkvKiBDYXRjaCBvdGhlciBlcnJvciBtZXNzYWdlcyAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiRVJSXyIpKSB7CisJCVJlY3ZFcnJfTWVzc2FnZShzdHJpcF9pbmZvLCBOVUxMLCAmbXNnWzRdLCBsZW4gLSA0KTsKKwkJcmV0dXJuOworCX0KKworCVJlY3ZFcnIoIk5vIGluaXRpYWwgKiIsIHN0cmlwX2luZm8pOworfQorCisvKgorICogcHJvY2Vzc19tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpby4gSWYgdGhlIHJhZGlvIGlzIG5vdCBpbiBTdGFybW9kZSBvciBoYXMgb2xkIGZpcm13YXJlLAorICogaXQgbWF5IGJlIGEgbGluZSBvZiB0ZXh0IGluIHJlc3BvbnNlIHRvIGFuIEFUIGNvbW1hbmQuIElkZWFsbHksIHdpdGgKKyAqIGEgY3VycmVudCByYWRpbyB0aGF0J3MgcHJvcGVybHkgaW4gU3Rhcm1vZGUsIGFsbCBkYXRhIHJlY2VpdmVkIHNob3VsZAorICogYmUgcHJvcGVybHkgZnJhbWVkIGFuZCBjaGVja3N1bW1lZCByYWRpbyBtZXNzYWdlIGJsb2NrcywgY29udGFpbmluZworICogZWl0aGVyIGEgc3Rhcm1vZGUgcGFja2V0LCBvciBhIG90aGVyIGNvbW11bmljYXRpb24gZnJvbSB0aGUgcmFkaW8KKyAqIGZpcm13YXJlLCBsaWtlICJJTkZfIiBJbmZvIG1lc3NhZ2VzIGFuZCAmQ09NTUFORCByZXNwb25zZXMuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVzc2FnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJU1RSSVBfSGVhZGVyIGhlYWRlciA9IHsgemVyb19hZGRyZXNzLCB6ZXJvX2FkZHJlc3MsIDAgfTsKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlfX3U4IHNlbmRlcm5hbWVbMzJdLCAqc3B0ciA9IHNlbmRlcm5hbWU7CisJTWV0cmljb21LZXkga2V5OworCisJLypIZXhEdW1wKCJSZWNlaXZpbmciLCBzdHJpcF9pbmZvLCBwdHIsIGVuZCk7ICovCisKKwkvKiBDaGVjayBmb3Igc3RhcnQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCB0aGVuIHNraXAgb3ZlciBpdCAqLworCWlmICgqcHRyID09ICcqJykKKwkJcHRyKys7CisJZWxzZSB7CisJCXByb2Nlc3NfdGV4dF9tZXNzYWdlKHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJLyogQ29weSBvdXQgdGhlIHJldHVybiBhZGRyZXNzICovCisJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyICE9ICcqJworCSAgICAgICAmJiBzcHRyIDwgQVJSQVlfRU5EKHNlbmRlcm5hbWUpIC0gMSkKKwkJKnNwdHIrKyA9ICpwdHIrKzsKKwkqc3B0ciA9IDA7CQkvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc2VuZGVyIG5hbWUgKi8KKworCS8qIENoZWNrIGZvciBlbmQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCBza2lwIG92ZXIgaXQgKi8KKwlpZiAocHRyID49IGVuZCB8fCAqcHRyICE9ICcqJykgeworCQlSZWN2RXJyKCJObyBzZWNvbmQgKiIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCXB0cisrOwkJCS8qIFNraXAgdGhlIHNlY29uZCAnKicgKi8KKworCS8qIElmIHRoZSBzZW5kZXIgbmFtZSBpcyAiJkNPTU1BTkQiLCBpZ25vcmUgdGhpcyAncGFja2V0JyAgICAgICAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmICghc3RyY21wKHNlbmRlcm5hbWUsICImQ09NTUFORCIpKSB7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID0gTm9TdHJ1Y3R1cmU7CisJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciArIDQgPiBlbmQpIHsKKwkJUmVjdkVycigiTm8gcHJvdG8ga2V5Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIHByb3RvY29sIGtleSBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCWtleS5jWzBdID0gKnB0cisrOworCWtleS5jWzFdID0gKnB0cisrOworCWtleS5jWzJdID0gKnB0cisrOworCWtleS5jWzNdID0gKnB0cisrOworCisJLyogSWYgd2UncmUgdXNpbmcgY2hlY2tzdW1zLCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCAqLworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKSB7CisJCWVuZCAtPSA0OwkvKiBDaG9wIHRoZSBsYXN0IGZvdXIgYnl0ZXMgb2ZmIHRoZSBwYWNrZXQgKHRoZXkncmUgdGhlIGNoZWNrc3VtKSAqLworCQlpZiAocHRyID4gZW5kKSB7CisJCQlSZWN2RXJyKCJNaXNzaW5nIENoZWNrc3VtIiwgc3RyaXBfaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCF2ZXJpZnlfY2hlY2tzdW0oc3RyaXBfaW5mbykpIHsKKwkJCVJlY3ZFcnIoIkJhZCBDaGVja3N1bSIsIHN0cmlwX2luZm8pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290IHBhY2tldCBmcm9tIFwiJXNcIi5cbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc2VuZGVybmFtZSk7ICovCisKKwkvKgorCSAqIEZpbGwgaW4gKHBzZXVkbykgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgaW4gdGhlIHBhY2tldC4KKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgb3VyIGFkZHJlc3MgKHRoZSByYWRpbyBkb2VzIG5vdAorCSAqIHRlbGwgdXMgdGhpcykuIElmIHRoZSByYWRpbyBzdXBwbGllcyBhIHNvdXJjZSBhZGRyZXNzLCB0aGVuIHdlIHVzZSBpdC4KKwkgKi8KKwloZWFkZXIuZHN0X2FkZHIgPSBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXN0cmluZ190b19yYWRpb19hZGRyZXNzKCZoZWFkZXIuc3JjX2FkZHIsIHNlbmRlcm5hbWUpOworCisjaWZkZWYgRVhUX0NPVU5URVJTCisJaWYgKGtleS5sID09IFNJUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFSUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBBVFJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFDS19LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IElORl9LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBFUlJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCX0gZWxzZQorCQlSZWN2RXJyKCJVbnJlY29nbml6ZWQgcHJvdG9jb2wga2V5Iiwgc3RyaXBfaW5mbyk7CisjZWxzZQorCWlmIChrZXkubCA9PSBTSVAwS2V5LmwpCisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBUlAwS2V5LmwpCisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gQVRSX0tleS5sKQorCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBQ0tfS2V5LmwpCisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBJTkZfS2V5LmwpCisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gRVJSX0tleS5sKQorCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCWVsc2UKKwkJUmVjdkVycigiVW5yZWNvZ25pemVkIHByb3RvY29sIGtleSIsIHN0cmlwX2luZm8pOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFRZRVJST1IoWCkgKChYKSA9PSBUVFlfQlJFQUsgICA/ICJCcmVhayIgICAgICAgICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfRlJBTUUgICA/ICJGcmFtaW5nIEVycm9yIiAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfUEFSSVRZICA/ICJQYXJpdHkgRXJyb3IiICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfT1ZFUlJVTiA/ICJIYXJkd2FyZSBPdmVycnVuIiA6ICJVbmtub3duIEVycm9yIikKKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIFNUUklQIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCisgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCSAgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IGNwICsgY291bnQ7CisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMKKwkgICAgfHwgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKyNpZiAwCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIqKioqIHN0cmlwX3JlY2VpdmVfYnVmOiAlM2QgYnl0ZXMgYXQgJTAyZC4lMDZkXG4iLAorCQkgICAgICAgY291bnQsIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwlzdHJpcF9pbmZvLT5yeF9zYnl0ZXMgKz0gY291bnQ7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KKwl3aGlsZSAoY3AgPCBlbmQpIHsKKwkJaWYgKGZwICYmICpmcCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBvbiBzZXJpYWwgcG9ydFxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIFRUWUVSUk9SKCpmcCkpOworCQlpZiAoZnAgJiYgKmZwKysgJiYgIXN0cmlwX2luZm8tPmRpc2NhcmQpIHsJLyogSWYgdGhlcmUncyBhIHNlcmlhbCBlcnJvciwgcmVjb3JkIGl0ICovCisJCQkvKiBJZiB3ZSBoYXZlIHNvbWUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLCBkaXNjYXJkIHRoZW0gKi8KKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X2Vycm9ycysrOworCQl9CisKKwkJLyogTGVhZGluZyBjb250cm9sIGNoYXJhY3RlcnMgKENSLCBOTCwgVGFiLCBldGMuKSBhcmUgaWdub3JlZCAqLworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPiAwIHx8ICpjcCA+PSAnICcpIHsKKwkJCWlmICgqY3AgPT0gMHgwRCkgewkvKiBJZiBlbmQgb2YgcGFja2V0LCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0ICovCisJCQkJaWYgKHN0cmlwX2luZm8tPnN4X2NvdW50ID4gMzAwMCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBDdXQgYSAlZCBieXRlIHBhY2tldCAoJXpkIGJ5dGVzIHJlbWFpbmluZyklc1xuIiwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50LAorCQkJCQkgICAgICAgZW5kIC0gY3AgLSAxLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+CisJCQkJCSAgICAgICBkaXNjYXJkID8gIiAoZGlzY2FyZGVkKSIgOgorCQkJCQkgICAgICAgIiIpOworCQkJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA+CisJCQkJICAgIHN0cmlwX2luZm8tPnN4X3NpemUpIHsKKwkJCQkJc3RyaXBfaW5mby0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBzeF9idWZmIG92ZXJmbG93ICglZCBieXRlcyB0b3RhbClcbiIsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5zeF9jb3VudCk7CisJCQkJfSBlbHNlIGlmIChzdHJpcF9pbmZvLT5kaXNjYXJkKQorCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IERpc2NhcmRpbmcgYmFkIHBhY2tldCAoJWQvJWQpXG4iLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGlzY2FyZCwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50KTsKKwkJCQllbHNlCisJCQkJCXByb2Nlc3NfbWVzc2FnZShzdHJpcF9pbmZvKTsKKwkJCQlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwkJCQlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSBidWZmZXIgKi8KKwkJCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPAorCQkJCSAgICBzdHJpcF9pbmZvLT5zeF9zaXplKQorCQkJCQlzdHJpcF9pbmZvLT5zeF9idWZmW3N0cmlwX2luZm8tPgorCQkJCQkJCSAgICBzeF9jb3VudF0gPQorCQkJCQkgICAgKmNwOworCQkJCXN0cmlwX2luZm8tPnN4X2NvdW50Kys7CisJCQl9CisJCX0KKwkJY3ArKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsIGNvbnRyb2wgcm91dGluZXMJCQkJCQkqLworCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcmVzcyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkgICBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyKQoreworCS8qCisJICogV2UncmUgdXNpbmcgYSBtYW51YWxseSBzcGVjaWZpZWQgYWRkcmVzcyBpZiB0aGUgYWRkcmVzcyBpcyBzZXQKKwkgKiB0byBhbnl0aGluZyBvdGhlciB0aGFuIGFsbCBvbmVzLiBTZXR0aW5nIHRoZSBhZGRyZXNzIHRvIGFsbCBvbmVzCisJICogZGlzYWJsZXMgbWFudWFsIG1vZGUgYW5kIGdvZXMgYmFjayB0byBhdXRvbWF0aWMgYWRkcmVzcyBkZXRlcm1pbmF0aW9uCisJICogKHRyYWNraW5nIHRoZSB0cnVlIGFkZHJlc3MgdGhhdCB0aGUgcmFkaW8gaGFzKS4KKwkgKi8KKwlzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIgPQorCSAgICBtZW1jbXAoYWRkci0+YywgYnJvYWRjYXN0X2FkZHJlc3MuYywKKwkJICAgc2l6ZW9mKGJyb2FkY2FzdF9hZGRyZXNzKSk7CisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcikKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9ICphZGRyOworCWVsc2UKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9CisJCSAgICBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmlwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX3NldF9kZXZfbWFjX2FkZHJlc3MgY2FsbGVkXG4iLCBkZXYtPm5hbWUpOworCXNldF9tYWNfYWRkcmVzcyhzdHJpcF9pbmZvLCAoTWV0cmljb21BZGRyZXNzICopIHNhLT5zYV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnJ4X3BhY2tldHM7CisJc3RhdHMudHhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnR4X3BhY2tldHM7CisJc3RhdHMucnhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnR4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZXJyb3JzID0gc3RyaXBfaW5mby0+dHhfZXJyb3JzOworCXN0YXRzLnJ4X2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X2Vycm9yczsKKwlzdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzOworCXJldHVybiAoJnN0YXRzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogT3BlbmluZyBhbmQgY2xvc2luZwkJCQkJCQkqLworCisvKgorICogSGVyZSdzIHRoZSBvcmRlciB0aGluZ3MgaGFwcGVuOgorICogV2hlbiB0aGUgdXNlciBydW5zICJzbGF0dGFjaCAtcCBzdHJpcCAuLi4iCisgKiAgMS4gVGhlIFRUWSBtb2R1bGUgY2FsbHMgc3RyaXBfb3BlbgorICogIDIuIHN0cmlwX29wZW4gY2FsbHMgc3RyaXBfYWxsb2MKKyAqICAzLiAgICAgICAgICAgICAgICAgIHN0cmlwX2FsbG9jIGNhbGxzIHJlZ2lzdGVyX25ldGRldgorICogIDQuICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfbmV0ZGV2IGNhbGxzIHN0cmlwX2Rldl9pbml0CisgKiAgNS4gdGhlbiBzdHJpcF9vcGVuIGZpbmlzaGVzIHNldHRpbmcgdXAgdGhlIHN0cmlwX2luZm8KKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IHVwIGFkZHJlc3MgbmV0bWFzayAuLi4iCisgKiAgNi4gc3RyaXBfb3Blbl9sb3cgZ2V0cyBjYWxsZWQKKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IGRvd24iCisgKiAgNy4gc3RyaXBfY2xvc2VfbG93IGdldHMgY2FsbGVkCisgKgorICogV2hlbiB0aGUgdXNlciBraWxscyB0aGUgc2xhdHRhY2ggcHJvY2VzcworICogIDguIHN0cmlwX2Nsb3NlIGdldHMgY2FsbGVkCisgKiAgOS4gc3RyaXBfY2xvc2UgY2FsbHMgZGV2X2Nsb3NlCisgKiAxMC4gaWYgdGhlIGRldmljZSBpcyBzdGlsbCB1cCwgdGhlbiBkZXZfY2xvc2UgY2FsbHMgc3RyaXBfY2xvc2VfbG93CisgKiAxMS4gc3RyaXBfY2xvc2UgY2FsbHMgc3RyaXBfZnJlZQorICovCisKKy8qIE9wZW4gdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBTVFJJUCBjaGFubmVsLiBFYXN5ISAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW5fbG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzdHJpcF9pbmZvLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBkZXYtPm10dSkpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisKKwlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwlzdHJpcF9pbmZvLT53b3JraW5nID0gRkFMU0U7CisJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBOb1N0cnVjdHVyZTsKKwlzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmQgPSBDb21wYXRpYmlsaXR5Q29tbWFuZDsKKwlzdHJpcF9pbmZvLT51c2VyX2JhdWQgPSBnZXRfYmF1ZChzdHJpcF9pbmZvLT50dHkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBSYWRpby5cbiIsCisJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSAqIEhaOworCWFkZF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIENsb3NlIHRoZSBsb3ctbGV2ZWwgcGFydCBvZiB0aGUgU1RSSVAgY2hhbm5lbC4gRWFzeSEKKyAqLworCitzdGF0aWMgaW50IHN0cmlwX2Nsb3NlX2xvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc3RyaXBfaW5mby0+dHR5ID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIEZyZWUgYWxsIFNUUklQIGZyYW1lIGJ1ZmZlcnMuCisJICovCisJaWYgKHN0cmlwX2luZm8tPnJ4X2J1ZmYpIHsKKwkJa2ZyZWUoc3RyaXBfaW5mby0+cnhfYnVmZik7CisJCXN0cmlwX2luZm8tPnJ4X2J1ZmYgPSBOVUxMOworCX0KKwlpZiAoc3RyaXBfaW5mby0+c3hfYnVmZikgeworCQlrZnJlZShzdHJpcF9pbmZvLT5zeF9idWZmKTsKKwkJc3RyaXBfaW5mby0+c3hfYnVmZiA9IE5VTEw7CisJfQorCWlmIChzdHJpcF9pbmZvLT50eF9idWZmKSB7CisJCWtmcmVlKHN0cmlwX2luZm8tPnR4X2J1ZmYpOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gTlVMTDsKKwl9CisJZGVsX3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgRERJIHdoZW4gdGhlCisgKiAoZHluYW1pY2FsbHkgYXNzaWduZWQpIGRldmljZSBpcyByZWdpc3RlcmVkCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uCisJICovCisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gMDsKKwlkZXYtPmxhc3RfcnggPSAwOworCWRldi0+dHhfcXVldWVfbGVuID0gMzA7CS8qIERyb3AgYWZ0ZXIgMzAgZnJhbWVzIHF1ZXVlZCAqLworCisJZGV2LT5mbGFncyA9IDA7CisJZGV2LT5tdHUgPSBERUZBVUxUX1NUUklQX01UVTsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfTUVUUklDT007CS8qIGR0YW5nICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwkvKgorCSAqICBkZXYtPnByaXYgICAgICAgICAgICAgQWxyZWFkeSBob2xkcyBhIHBvaW50ZXIgdG8gb3VyIHN0cnVjdCBzdHJpcAorCSAqLworCisJKihNZXRyaWNvbUFkZHJlc3MgKikgJiBkZXYtPmJyb2FkY2FzdCA9IGJyb2FkY2FzdF9hZGRyZXNzOworCWRldi0+ZGV2X2FkZHJbMF0gPSAwOworCWRldi0+YWRkcl9sZW4gPSBzaXplb2YoTWV0cmljb21BZGRyZXNzKTsKKworCS8qCisJICogUG9pbnRlcnMgdG8gaW50ZXJmYWNlIHNlcnZpY2Ugcm91dGluZXMuCisJICovCisKKwlkZXYtPm9wZW4gPSBzdHJpcF9vcGVuX2xvdzsKKwlkZXYtPnN0b3AgPSBzdHJpcF9jbG9zZV9sb3c7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdHJpcF94bWl0OworCWRldi0+aGFyZF9oZWFkZXIgPSBzdHJpcF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IHN0cmlwX3JlYnVpbGRfaGVhZGVyOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gc3RyaXBfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzID0gc3RyaXBfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IHN0cmlwX2NoYW5nZV9tdHU7Cit9CisKKy8qCisgKiBGcmVlIGEgU1RSSVAgY2hhbm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9mcmVlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWxpc3RfZGVsX3JjdSgmc3RyaXBfaW5mby0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfaW5mby0+bWFnaWMgPSAwOworCisJZnJlZV9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisvKgorICogQWxsb2NhdGUgYSBuZXcgZnJlZSBTVFJJUCBjaGFubmVsCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbzsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHN0cmlwKSwgInN0JWQiLAorCQkJICAgc3RyaXBfZGV2X3NldHVwKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsJLyogSWYgbm8gbW9yZSBtZW1vcnksIHJldHVybiAqLworCisKKwlzdHJpcF9pbmZvID0gZGV2LT5wcml2OworCXN0cmlwX2luZm8tPmRldiA9IGRldjsKKworCXN0cmlwX2luZm8tPm1hZ2ljID0gU1RSSVBfTUFHSUM7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKworCXN0cmlwX2luZm8tPmdyYXR1aXRvdXNfYXJwID0gamlmZmllcyArIExvbmdUaW1lOworCXN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA9IDA7CisJaW5pdF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5kYXRhID0gKGxvbmcpIGRldjsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmZ1bmN0aW9uID0gc3RyaXBfSWRsZVRhc2s7CisKKworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisgcmVzY2FuOgorCS8qCisJICogU2VhcmNoIHRoZSBsaXN0IHRvIGZpbmQgd2hlcmUgdG8gcHV0IG91ciBuZXcgZW50cnkKKwkgKiAoYW5kIGluIHRoZSBwcm9jZXNzIGRlY2lkZSB3aGF0IGNoYW5uZWwgbnVtYmVyIGl0IGlzCisJICogZ29pbmcgdG8gYmUpCisJICovCisJbGlzdF9mb3JfZWFjaChuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBobGlzdF9lbnRyeShuLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCisJCWlmIChzLT5kZXYtPmJhc2VfYWRkciA9PSBkZXYtPmJhc2VfYWRkcikgeworCQkJKytkZXYtPmJhc2VfYWRkcjsKKwkJCWdvdG8gcmVzY2FuOworCQl9CisJfQorCisJc3ByaW50ZihkZXYtPm5hbWUsICJzdCVsZCIsIGRldi0+YmFzZV9hZGRyKTsKKworCWxpc3RfYWRkX3RhaWxfcmN1KCZzdHJpcF9pbmZvLT5saXN0LCAmc3RyaXBfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcmV0dXJuIHN0cmlwX2luZm87Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFNUUklQIGNoYW5uZWwuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZQorICogU1RSSVAgbGluZSBkaXNjaXBsaW5lIGlzIGNhbGxlZCBmb3IuICBCZWNhdXNlIHdlIGFyZQorICogc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLCB3ZSBvbmx5IGhhdmUgdG8gbGluayBpdCB0bworICogYSBmcmVlIFNUUklQIGNoYW5uZWwuLi4KKyAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLgorCSAqLworCisJaWYgKHN0cmlwX2luZm8gJiYgc3RyaXBfaW5mby0+bWFnaWMgPT0gU1RSSVBfTUFHSUMpCisJCXJldHVybiAtRUVYSVNUOworCisJLyoKKwkgKiBPSy4gIEZpbmQgYSBmcmVlIFNUUklQIGNoYW5uZWwgdG8gdXNlLgorCSAqLworCWlmICgoc3RyaXBfaW5mbyA9IHN0cmlwX2FsbG9jKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5GSUxFOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgbmV3bHkgY3JlYXRlZCBkZXZpY2Ugc28gaXQgY2FuIGJlIGlmY29uZmlnJ2QKKwkgKiBzdHJpcF9kZXZfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QKKwkgKi8KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RyaXA6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZC5cbiIpOworCQlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCQlyZXR1cm4gLUVORklMRTsKKwl9CisKKwlzdHJpcF9pbmZvLT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBzdHJpcF9pbmZvOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKgorCSAqIFJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncworCSAqLworCisJc3RyaXBfaW5mby0+ZGV2LT50eXBlID0gQVJQSFJEX01FVFJJQ09NOwkvKiBkdGFuZyAqLworCisJLyoKKwkgKiBTZXQgdHR5IG9wdGlvbnMKKwkgKi8KKworCXR0eS0+dGVybWlvcy0+Y19pZmxhZyB8PSBJR05CUksgfCBJR05QQVI7CS8qIElnbm9yZSBicmVha3MgYW5kIHBhcml0eSBlcnJvcnMuICovCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IENMT0NBTDsJLyogSWdub3JlIG1vZGVtIGNvbnRyb2wgc2lnbmFscy4gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkhVUENMOwkvKiBEb24ndCBjbG9zZSBvbiBodXAgKi8KKworCXByaW50ayhLRVJOX0lORk8gIlNUUklQOiBkZXZpY2UgXCIlc1wiIGFjdGl2YXRlZFxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKworCS8qCisJICogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuCisJICovCisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYtPmJhc2VfYWRkcik7Cit9CisKKy8qCisgKiBDbG9zZSBkb3duIGEgU1RSSVAgY2hhbm5lbC4KKyAqIFRoaXMgbWVhbnMgZmx1c2hpbmcgb3V0IGFueSBwZW5kaW5nIHF1ZXVlcywgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZQorICogVFRZIGxpbmUgZGlzY2lwbGluZSB0byB3aGF0IGl0IHdhcyBiZWZvcmUgaXQgZ290IGhvb2tlZCB0byBTVFJJUAorICogKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKgorCSAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuCisJICovCisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMpCisJCXJldHVybjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHN0cmlwX2luZm8tPmRldik7CisKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKwlwcmludGsoS0VSTl9JTkZPICJTVFJJUDogZGV2aWNlIFwiJXNcIiBjbG9zZWQgZG93blxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGVyZm9ybSBJL08gY29udHJvbCBjYWxscyBvbiBhbiBhY3RpdmUgU1RSSVAgY2hhbm5lbC4JCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLgorCSAqLworCisJaWYgKCFzdHJpcF9pbmZvIHx8IHN0cmlwX2luZm8tPm1hZ2ljICE9IFNUUklQX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJaWYoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RybGVuKHN0cmlwX2luZm8tPmRldi0+bmFtZSkgKyAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNJT0NTSUZIV0FERFI6CisJeworCQlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKwkJLy9wcmludGsoS0VSTl9JTkZPICIlczogU0lPQ1NJRkhXQUREUlxuIiwgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJaWYoY29weV9mcm9tX3VzZXIoJmFkZHIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihNZXRyaWNvbUFkZHJlc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gc2V0X21hY19hZGRyZXNzKHN0cmlwX2luZm8sICZhZGRyKTsKKwl9CisJLyoKKwkgKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQlyZXR1cm4gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24JCQkJCQkJKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Mgc3RyaXBfbGRpc2MgPSB7CisJLm1hZ2ljID0gVFRZX0xESVNDX01BR0lDLAorCS5uYW1lID0gInN0cmlwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHN0cmlwX29wZW4sCisJLmNsb3NlID0gc3RyaXBfY2xvc2UsCisJLmlvY3RsID0gc3RyaXBfaW9jdGwsCisJLnJlY2VpdmVfYnVmID0gc3RyaXBfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbSA9IHN0cmlwX3JlY2VpdmVfcm9vbSwKKwkud3JpdGVfd2FrZXVwID0gc3RyaXBfd3JpdGVfc29tZV9tb3JlLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFNUUklQIGRyaXZlci4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgYm9vdCB0aW1lLCB0byBib290c3RyYXAgdGhlIG11bHRpLWNoYW5uZWwKKyAqIFNUUklQIGRyaXZlcgorICovCisKK3N0YXRpYyBjaGFyIHNpZ25vbltdIF9faW5pdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IFZlcnNpb24gJXMgKHVubGltaXRlZCBjaGFubmVscylcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmlwX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhzaWdub24sIFN0cmlwVmVyc2lvbik7CisKKwkKKwkvKgorCSAqIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0CisJICovCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TVFJJUCwgJnN0cmlwX2xkaXNjKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLAorCQkgICAgICAgc3RhdHVzKTsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIHN0YXR1cyBmaWxlIHdpdGggL3Byb2MKKwkgKi8KKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgic3RyaXAiLCBTX0lGUkVHIHwgU19JUlVHTywgJnN0cmlwX3NlcV9mb3BzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK21vZHVsZV9pbml0KHN0cmlwX2luaXRfZHJpdmVyKTsKKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbm9mZltdIF9fZXhpdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IE1vZHVsZSBVbmxvYWRlZFxuIjsKKworc3RhdGljIHZvaWQgX19leGl0IHN0cmlwX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwqbjsKKworCS8qIG1vZHVsZSByZWYgY291bnQgcnVsZXMgYXNzdXJlIHRoYXQgYWxsIGVudHJpZXMgYXJlIHVucmVnaXN0ZXJlZCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzdHJpcCwgbGlzdCk7CisJCXN0cmlwX2ZyZWUocyk7CisJfQorCisJLyogVW5yZWdpc3RlciB3aXRoIHRoZSAvcHJvYy9uZXQgZmlsZSBoZXJlLiAqLworCXByb2NfbmV0X3JlbW92ZSgic3RyaXAiKTsKKworCWlmICgoaSA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NUUklQLCBOVUxMKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsIGkpOworCisJcHJpbnRrKHNpZ25vZmYpOworfQorCittb2R1bGVfZXhpdChzdHJpcF9leGl0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlN0dWFydCBDaGVzaGlyZSA8Y2hlc2hpcmVAY3Muc3RhbmZvcmQuZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFybW9kZSBSYWRpbyBJUCAoU1RSSVApIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlN0YXJtb2RlIFJhZGlvIElQIChTVFJJUCkgbW9kZW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0CkBAIC0wLDAgKzEsMTUgQEAKKwlXaXJlbGVzcyBUb2RvCisJLS0tLS0tLS0tLS0tLQorCisxKSBCcmluZyBvdGhlciBrZXJuZWwgV2lyZWxlc3MgTEFOIGRyaXZlcnMgaGVyZQorCUNvbXBsZXRlZAorCisyKSBCcmluZyBuZXcgV2lyZWxlc3MgTEFOIGRyaXZlciBub3QgeWV0IGluIHRoZSBrZXJuZWwgdGhlcmUKKwlTZWUgbXkgd2ViIHBhZ2UgZm9yIGRldGFpbHMKKwlJbiBwYXJ0aWN1bGFyIDogSG9zdEFQCisKKzMpIE1pc2MKKwlvIE1hcmsgd2F2ZWxhbiwgd2F2ZWxhbl9jcywgbmV0d2F2ZV9jcyBkcml2ZXJzIGFzIG9ic29sZXRlCisJbyBNYXliZSBhcmxhbi5jLCByYXlfY3MuYyBhbmQgc3RyaXAuYyBhbHNvIGRlc2VydmUgdG8gYmUgb2Jzb2xldGUKKworCUplYW4gSUkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVlMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCkBAIC0wLDAgKzEsNDQ1MiBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cyAoYWxzbyBzZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUpLgorICogU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqCisgKgorICogQVQmVCBHSVMgKG5lZSBOQ1IpIFdhdmVMQU4gY2FyZDoKKyAqCUFuIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIKKyAqCWNvbnRyb2xsZWQgYnkgYW4gSW50ZWwgODI1ODYgY29wcm9jZXNzb3IuCisgKi8KKworI2luY2x1ZGUgIndhdmVsYW4ucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqIChXYXZlTEFOIG1vZGVtIG9yIGk4MjU4NikKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIGlycSBudW1iZXIgdG8gUFNBIGlycSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHU4IHd2X2lycV90b19wc2EoaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTkVMUyhpcnF2YWxzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXJxdmFsc1tpcnFdOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIFBTQSBpcnEgcGFyYW1ldGVyIHRvIGlycSBudW1iZXIgCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHd2X3BzYV90b19pcnEodTggaXJxdmFsKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5FTFMoaXJxdmFscyk7IGlycSsrKQorCQlpZiAoaXJxdmFsc1tpcnFdID09IGlycXZhbCkKKwkJCXJldHVybiBpcnE7CisKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBTVFJVQ1RfQ0hFQ0sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTYW5pdHkgcm91dGluZSB0byB2ZXJpZnkgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIFdhdmVMQU4gaW50ZXJmYWNlCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgY2hhciAqd3Zfc3RydWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworCVNDKHBzYV90LCBQU0FfU0laRSwgInBzYV90Iik7CisJU0MobW13X3QsIE1NV19TSVpFLCAibW13X3QiKTsKKwlTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCVNDKGhhX3QsIEhBX1NJWkUsICJoYV90Iik7CisKKyN1bmRlZglTQworCisJcmV0dXJuICgoY2hhciAqKSBOVUxMKTsKK30JCQkJLyogd3Zfc3RydWN0X2NoZWNrICovCisjZW5kaWYJCQkJLyogU1RSVUNUX0NIRUNLICovCisKKy8qKioqKioqKioqKioqKioqKioqKiogSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVc2VmdWwgc3Vicm91dGluZXMgdG8gbWFuYWdlIHRoZSBXYXZlTEFOIElTQSBpbnRlcmZhY2UKKyAqCisgKiBPbmUgbWFqb3IgZGlmZmVyZW5jZSB3aXRoIHRoZSBQQ01DSUEgaGFyZHdhcmUgKGV4Y2VwdCB0aGUgcG9ydCBtYXBwaW5nKQorICogaXMgdGhhdCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHN0YXRlIG9mIHRoZSBIb3N0IENvbnRyb2wgUmVnaXN0ZXIKKyAqIGJlY2F1c2Ugb2YgdGhlIGludGVycnVwdCBlbmFibGUgJiBidXMgc2l6ZSBmbGFncy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHUxNiBoYXNyX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJcmV0dXJuIChpbncoSEFTUihpb2FkZHIpKSk7Cit9CQkJCS8qIGhhc3JfcmVhZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJb3V0dyhoYWNyLCBIQUNSKGlvYWRkcikpOworfQkJCQkvKiBoYWNyX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKKyAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZV9zbG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjcik7CisJLyogZGVsYXkgbWlnaHQgb25seSBiZSBuZWVkZWQgc29tZXRpbWVzICovCisJbWRlbGF5KDEpOworfQkJCQkvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgY2hhbm5lbCBhdHRlbnRpb24gYml0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NoYW5fYXR0bih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IgfCBIQUNSX0NBKTsKK30JCQkJLyogc2V0X2NoYW5fYXR0biAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVzZXQsIGFuZCB0aGVuIHNldCBob3N0IGFkYXB0b3IgaW50byBkZWZhdWx0IG1vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9oYWNyX3Jlc2V0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWhhY3Jfd3JpdGVfc2xvdyhpb2FkZHIsIEhBQ1JfUkVTRVQpOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBIQUNSX0RFRkFVTFQpOworfQkJCQkvKiB3dl9oYWNyX3Jlc2V0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgdGhlIEkvTyB0cmFuc2ZlciBvdmVyIHRoZSBJU0EgYnVzIHRvIDgtYml0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzE2X29mZih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjciAmPSB+SEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgSS9PIHRyYW5zZmVyIG92ZXIgdGhlIElTQSBidXMgdG8gOC1iaXQgbW9kZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfMTZfb24odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworCWhhY3IgfD0gSEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vbiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl84MjU4Nl9zdG9wKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlscC0+aGFjciAmPSB+SEFDUl9JTlRST047CisJaGFjcl93cml0ZShpb2FkZHIsIGxwLT5oYWNyKTsKK30JCQkJLyogd3ZfaW50c19vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW50c19vbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWxwLT5oYWNyIHw9IEhBQ1JfSU5UUk9OOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBscC0+aGFjcik7Cit9CQkJCS8qIHd2X2ludHNfb24gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIG1vZGVtIG9mIHRoZSBXYXZlTEFOCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIFBTQS4KKyAqLworc3RhdGljIHZvaWQgcHNhX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyLCBpbnQgbywJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgICAgIHU4ICogYiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogc2l6ZSB0byByZWFkICovCisJd3ZfMTZfb2ZmKGlvYWRkciwgaGFjcik7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlvdXR3KG8sIFBJT1IyKGlvYWRkcikpOworCQlvKys7CisJCSpiKysgPSBpbmIoUElPUDIoaW9hZGRyKSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHBzYV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IsIGludCBvLAkvKiBPZmZzZXQgaW4gUFNBICovCisJCSAgICAgIHU4ICogYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworCWludCBjb3VudCA9IDA7CisKKwl3dl8xNl9vZmYoaW9hZGRyLCBoYWNyKTsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCW91dHcobywgUElPUjIoaW9hZGRyKSk7CisJCW8rKzsKKworCQlvdXRiKCpiLCBQSU9QMihpb2FkZHIpKTsKKwkJYisrOworCisJCS8qIFdhaXQgZm9yIHRoZSBtZW1vcnkgdG8gZmluaXNoIGl0cyB3cml0ZSBjeWNsZSAqLworCQljb3VudCA9IDA7CisJCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYKKwkJICAgICAgIChoYXNyX3JlYWQoaW9hZGRyKSAmIEhBU1JfUFNBX0JVU1kpKSBtZGVsYXkoMSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgaW5saW5lIHUxNiBwc2FfY3JjKHU4ICogcHNhLAkvKiBUaGUgUFNBICovCisJCQkgICAgICBpbnQgc2l6ZSkKK3sJCQkJLyogTnVtYmVyIG9mIHNob3J0IGZvciBDUkMgKi8KKwlpbnQgYnl0ZV9jbnQ7CQkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKwl1MTYgY3JjX2J5dGVzID0gMDsJLyogRGF0YSBpbiB0aGUgUFNBICovCisJaW50IGJpdF9jbnQ7CQkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisJZm9yIChieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKykgeworCQljcmNfYnl0ZXMgXj0gcHNhW2J5dGVfY250XTsJLyogSXRzIGFuIHhvciAqLworCisJCWZvciAoYml0X2NudCA9IDE7IGJpdF9jbnQgPCA5OyBiaXRfY250KyspIHsKKwkJCWlmIChjcmNfYnl0ZXMgJiAweDAwMDEpCisJCQkJY3JjX2J5dGVzID0gKGNyY19ieXRlcyA+PiAxKSBeIDB4QTAwMTsKKwkJCWVsc2UKKwkJCQljcmNfYnl0ZXMgPj49IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gY3JjX2J5dGVzOworfQkJCQkvKiBwc2FfY3JjICovCisjZW5kaWYJCQkJLyogU0VUX1BTQV9DUkMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlIFdhdmVsYW4ncyBQU0EKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3BzYV9jaGVja3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisJcHNhX3QgcHNhOworCXUxNiBjcmM7CisKKwkvKiByZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBoYWNyLCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKwkvKiB1cGRhdGUgdGhlIGNoZWNrc3VtICovCisJY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgICAgICBzaXplb2YocHNhKSAtIHNpemVvZihwc2EucHNhX2NyY1swXSkgLQorCQkgICAgICBzaXplb2YocHNhLnBzYV9jcmNbMV0pCisJCSAgICAgIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworCXBzYS5wc2FfY3JjWzFdID0gKGNyYyAmIDB4RkYwMCkgPj4gODsKKworCS8qIFdyaXRlIGl0ICEgKi8KKwlwc2Ffd3JpdGUoaW9hZGRyLCBoYWNyLCAoY2hhciAqKSAmcHNhLnBzYV9jcmMgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX2NyYywgMik7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcHNhLnBzYV9jcmNbMF0sIHBzYS5wc2FfY3JjWzFdKTsKKworCS8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKwljcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCSAgICAgIHNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJaWYgKGNyYyAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCQkJCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKyNlbmRpZgkJCQkvKiBTRVRfUFNBX0NSQyAqLworfQkJCQkvKiB1cGRhdGVfcHNhX2NoZWNrc3VtICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSAxIGJ5dGUgdG8gdGhlIE1NQy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19vdXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvLCB1OCBkKQoreworCWludCBjb3VudCA9IDA7CisKKwkvKiBXYWl0IGZvciBNTUMgdG8gZ28gaWRsZSAqLworCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYgKGludyhIQVNSKGlvYWRkcikpICYgSEFTUl9NTUNfQlVTWSkpCisJCXVkZWxheSgxMCk7CisKKwlvdXR3KCh1MTYpICgoKHUxNikgZCA8PCA4KSB8IChvIDw8IDEpIHwgMSksIE1NQ1IoaW9hZGRyKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHdyaXRlIGJ5dGVzIHRvIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBXZSBzdGFydCBhdCB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfd3JpdGUodW5zaWduZWQgbG9uZyBpb2FkZHIsIHU4IG8sIHU4ICogYiwgaW50IG4pCit7CisJbyArPSBuOworCWIgKz0gbjsKKworCXdoaWxlIChuLS0gPiAwKQorCQltbWNfb3V0KGlvYWRkciwgLS1vLCAqKC0tYikpOworfQkJCQkvKiBtbWNfd3JpdGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYSBieXRlIGZyb20gdGhlIE1NQy4KKyAqIE9wdGltaXNlZCB2ZXJzaW9uIGZvciAxIGJ5dGUsIGF2b2lkIHVzaW5nIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSB1OCBtbWNfaW4odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvKQoreworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvdW50KysgPCAxMDApICYmIChpbncoSEFTUihpb2FkZHIpKSAmIEhBU1JfTU1DX0JVU1kpKQorCQl1ZGVsYXkoMTApOworCW91dHcobyA8PCAxLCBNTUNSKGlvYWRkcikpOworCisJd2hpbGUgKChjb3VudCsrIDwgMTAwKSAmJiAoaW53KEhBU1IoaW9hZGRyKSkgJiBIQVNSX01NQ19CVVNZKSkKKwkJdWRlbGF5KDEwKTsKKwlyZXR1cm4gKHU4KSAoaW53KE1NQ1IoaW9hZGRyKSkgPj4gOCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsaWNhdGVkIGJ5IGEgbGFjayBvZiBhZGRyZXNzIGxpbmVzLAorICogd2hpY2ggcHJldmVudHMgZGVjb2Rpbmcgb2YgdGhlIGxvdy1vcmRlciBiaXQuCisgKiAoY29kZSBoYXMganVzdCBiZWVuIG1vdmVkIGluIHRoZSBhYm92ZSBmdW5jdGlvbikKKyAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1OCBvLCB1OCAqIGIsIGludCBuKQoreworCW8gKz0gbjsKKwliICs9IG47CisKKwl3aGlsZSAobi0tID4gMCkKKwkJKigtLWIpID0gbW1jX2luKGlvYWRkciwgLS1vKTsKK30JCQkJLyogbW1jX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB0aGUgdHlwZSBvZiBlbmNyeXB0aW9uIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbW1jX2VuY3IodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CQkJCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJaW50IHRlbXA7CisKKwl0ZW1wID0gbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kZXNfYXZhaWwpKTsKKwlpZiAoKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9ERVMpICYmICh0ZW1wICE9IE1NUl9ERVNfQVZBSUxfQUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gdGVtcDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdhaXQgZm9yIHRoZSBmcmVxdWVuY3kgRUVQUk9NIHRvIGNvbXBsZXRlIGEgY29tbWFuZC4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmVlX3dhaXQodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJCQkgICAgaW50IGRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCQkgICAgaW50IG51bWJlcikKK3sJCQkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworCWludCBjb3VudCA9IDA7CQkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworCXdoaWxlICgoY291bnQrKyA8IG51bWJlcikgJiYKKwkgICAgICAgKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKwkJTU1SX0ZFRV9TVEFUVVNfQlVTWSkpIHVkZWxheShkZWxheSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRVBST00gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICovCitzdGF0aWMgdm9pZCBmZWVfcmVhZCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICB1MTYgbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSAgICAgdTE2ICogYiwJLyogZGF0YSBidWZmZXIgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKwkvKiBXcml0ZSB0aGUgYWRkcmVzcyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworCS8qIExvb3Agb24gYWxsIGJ1ZmZlciAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCS8qIFdyaXRlIHRoZSByZWFkIGNvbW1hbmQgKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQpOworCisJCS8qIFdhaXQgdW50aWwgRUVQUk9NIGlzIHJlYWR5IChzaG91bGQgYmUgcXVpY2spLiAqLworCQlmZWVfd2FpdChpb2FkZHIsIDEwLCAxMDApOworCisJCS8qIFJlYWQgdGhlIHZhbHVlLiAqLworCQkqLS1iID0gKChtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJCQltbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisJfQorfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBGcmVxdWVuY3kgRUVQUk9NIChmcmVxdWVuY3kgc2VsZWN0IGNhcmRzKS4KKyAqIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGJlY2F1c2UgdGhlIGZyZXF1ZW5jeSBFRVBST00gaGFzIHRvCisgKiBiZSB1bnByb3RlY3RlZCBhbmQgdGhlIHdyaXRlIGVuYWJsZWQuCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGZlZV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICAgdTE2IG8sCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgICAgICB1MTYgKiBiLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhLiAqLworCisjaWZkZWYgRUVQUk9NX0lTX1BST1RFQ1RFRAkvKiBkaXNhYmxlZCAqLworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKwkvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJSRUFEKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBSZWFkIHRoZSBwcm90ZWN0ZWQgcmVnaXN0ZXIuICovCisJcHJpbnRrKCJQcm90ZWN0ZWQgMjogICUwMlgtJTAyWFxuIiwKKwkgICAgICAgbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJICAgICAgIG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyNlbmRpZgkJCQkvKiBET0VTTlRfU0VFTV9UT19XT1JLICovCisKKwkvKiBFbmFibGUgcHJvdGVjdGVkIHJlZ2lzdGVyLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBVbnByb3RlY3QgYXJlYS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUldSSVRFKTsKKyNpZmRlZiBET0VTTlRfU0VFTV9UT19XT1JLCS8qIGRpc2FibGVkICovCisJLyogb3IgdXNlOiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCQkJCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisjZW5kaWYJCQkJLyogRUVQUk9NX0lTX1BST1RFQ1RFRCAqLworCisJLyogV3JpdGUgZW5hYmxlLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBXcml0ZSB0aGUgRUVQUk9NIGFkZHJlc3MuICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBvICsgbiAtIDEpOworCisJLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJLyogV3JpdGUgdGhlIHZhbHVlLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9sKSwgKmIgJiAweEZGKTsKKworCQkvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZC4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworCQkvKiBXYXZlTEFOIGRvY3VtZW50YXRpb24gc2F5cyB0byB3YWl0IGF0IGxlYXN0IDEwIG1zIGZvciBFRUJVU1kgPSAwICovCisJCW1kZWxheSgxMCk7CisJCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisJfQorCisJLyogV3JpdGUgZGlzYWJsZS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9EUyk7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisJLyogUmVwcm90ZWN0IEVFUFJPTS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MDApOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKyNlbmRpZgkJCQkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCit9CisjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSTgyNTg2IFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIG9uLWJvYXJkIFJBTS4KKyAqIFdoeSBkb2VzIGlubGluaW5nIHRoaXMgZnVuY3Rpb24gbWFrZSBpdCBmYWlsPworICovCitzdGF0aWMgLyppbmxpbmUgKi8gdm9pZCBvYnJhbV9yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAorCQkJCSAgIHUxNiBvLCB1OCAqIGIsIGludCBuKQoreworCW91dHcobywgUElPUjEoaW9hZGRyKSk7CisJaW5zdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIHRvIHRoZSBvbi1ib2FyZCBSQU0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvYnJhbV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4ICogYiwgaW50IG4pCit7CisJb3V0dyhvLCBQSU9SMShpb2FkZHIpKTsKKwlvdXRzdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEFja25vd2xlZGdlIHRoZSByZWFkaW5nIG9mIHRoZSBzdGF0dXMgaXNzdWVkIGJ5IHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWludCBpOworCisJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2Jfc3RhdHVzKSwKKwkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCXNjYl9jcyAmPSBTQ0JfU1RfSU5UOworCisJaWYgKHNjYl9jcyA9PSAwKQorCQlyZXR1cm47CisKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKwkJaWYgKHNjYl9jcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoaSA8PSAwKQorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2X2FjaygpOiBib2FyZCBub3QgYWNjZXB0aW5nIGNvbW1hbmQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IGNoYW5uZWwgYXR0ZW50aW9uIGJpdCBhbmQgYnVzeSB3YWl0IHVudGlsIGNvbW1hbmQgaGFzCisgKiBjb21wbGV0ZWQsIHRoZW4gYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjb25zdCBjaGFyICpzdHIpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNjYl9jbWQ7CisJYWNoX3QgY2I7CisJaW50IGk7CisKKwlzY2JfY21kID0gU0NCX0NNRF9DVUMgJiBTQ0JfQ01EX0NVQ19HTzsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NtZCwgc2l6ZW9mKHNjYl9jbWQpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwKKwkJCSAgIHNpemVvZihjYikpOworCQlpZiAoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9DKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKwlpZiAoaSA8PSAwIHx8ICEoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9PSykpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RyLCBjYi5hY19zdGF0dXMpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwkJd3Zfc2NiX3Nob3coaW9hZGRyKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQWNrIHRoZSBzdGF0dXMgKi8KKwl3dl9hY2soZGV2KTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJhdGlvbiBjb21tYW5kcyBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIENoZWNrIGlmIGRvbmUsIGFuZCBpZiBPSy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIG5ldF9sb2NhbCAqIGxwKQoreworCXVuc2lnbmVkIHNob3J0IG1jc19hZGRyOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlpbnQgcmV0OworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2NvbmZpZ19jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwltY3NfYWRkciA9IGxwLT50eF9maXJzdF9pbl91c2UgKyBzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpCisJICAgICsgc2l6ZW9mKHRiZF90KSArIHNpemVvZihhY19jZmdfdCkgKyBzaXplb2YoYWNfaWFzX3QpOworCisJLyogUmVhZCB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgKHNldCBtYyBsaXN0KS4gKi8KKwlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYobWNzX2FkZHIsIGFjX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9DKSA9PSAwKQorCQlyZXQgPSAwOwkvKiBOb3QgcmVhZHkgdG8gYmUgc2NyYXBwZWQgKi8KKwllbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IGlhc19hZGRyOworCisJCS8qIENoZWNrIG1jX2NvbmZpZyBjb21tYW5kICovCisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBzZXRfbXVsdGljYXN0X2FkZHJlc3MgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCQkvKiBjaGVjayBpYS1jb25maWcgY29tbWFuZCAqLworCQlpYXNfYWRkciA9IG1jc19hZGRyIC0gc2l6ZW9mKGFjX2lhc190KTsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGlhc19hZGRyLCBhY19zdGF0dXMpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCQlpZiAoKHN0YXR1cyAmIEFDX1NGTERfT0spICE9IEFDX1NGTERfT0spCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiB3dl9jb25maWdfY29tcGxldGUoKTogc2V0X01BQ19hZGRyZXNzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwkJLyogQ2hlY2sgY29uZmlnIGNvbW1hbmQuICovCisJCWNmZ19hZGRyID0gaWFzX2FkZHIgLSBzaXplb2YoYWNfY2ZnX3QpOworCQlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYoY2ZnX2FkZHIsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBjb25maWd1cmUgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgkvKiBERUJVR19DT05GSUdfRVJST1IgKi8KKworCQlyZXQgPSAxOwkvKiBSZWFkeSB0byBiZSBzY3JhcHBlZCAqLworCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb25maWdfY29tcGxldGUoKSAtICVkXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29tbWFuZCBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIFJlY2xhaW0gYXMgbWFueSBmcmVlZCB0eCBidWZmZXJzIGFzIHdlIGNhbi4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbnQgd3ZfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBuZXRfbG9jYWwgKiBscCkKK3sKKwlpbnQgbnJlYXBlZCA9IDA7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfY29tcGxldGUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBhbGwgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwl3aGlsZSAobHAtPnR4X2ZpcnN0X2luX3VzZSAhPSBJODI1ODZOVUxMKSB7CisJCXVuc2lnbmVkIHNob3J0IHR4X3N0YXR1czsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCB0cmFuc21pdCBidWZmZXIgKi8KKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGxwLT50eF9maXJzdF9pbl91c2UsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmdHhfc3RhdHVzLAorCQkJICAgc2l6ZW9mKHR4X3N0YXR1cykpOworCisJCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCQlpZiAoKHR4X3N0YXR1cyAmIEFDX1NGTERfQykgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWlmICghd3ZfY29uZmlnX2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCkpCisJCQkJYnJlYWs7CS8qIE5vdCBjb21wbGV0ZWQgKi8KKworCQkvKiBXZSBub3cgcmVtb3ZlIHRoaXMgYnVmZmVyICovCisJCW5yZWFwZWQrKzsKKwkJLS1scC0+dHhfbl9pbl91c2U7CisKKy8qCitpZiAobHAtPnR4X25faW5fdXNlID4gMCkKKwlwcmludGsoIiVjIiwgIjAxMjM0NTY3ODlhYmNkZWZnaGlqayJbbHAtPnR4X25faW5fdXNlXSk7CisqLworCisJCS8qIFdhcyBpdCB0aGUgbGFzdCBvbmU/ICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkKKwkJCWxwLT50eF9maXJzdF9pbl91c2UgPSBJODI1ODZOVUxMOworCQllbHNlIHsKKwkJCS8qIE5leHQgb25lIGluIHRoZSBjaGFpbiAqLworCQkJbHAtPnR4X2ZpcnN0X2luX3VzZSArPSBUWEJMT0NLWjsKKwkJCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID49CisJCQkgICAgT0ZGU0VUX0NVICsKKwkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWikgbHAtPnR4X2ZpcnN0X2luX3VzZSAtPQorCQkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwkJfQorCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdywgY2hlY2sgc3RhdHVzIG9mIHRoZSBmaW5pc2hlZCBjb21tYW5kICovCisJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX09LKSB7CisJCQlpbnQgbmNvbGxpc2lvbnM7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluY29sbGlzaW9ucyA9IHR4X3N0YXR1cyAmIEFDX1NGTERfTUFYQ09MOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gbmNvbGxpc2lvbnM7CisjaWZkZWYgREVCVUdfVFhfSU5GTworCQkJaWYgKG5jb2xsaXNpb25zID4gMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCBhZnRlciAlZCBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuY29sbGlzaW9ucyk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1MxMCkgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiBubyBDUy5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1M5KSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGxvc3QgQ1RTLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfUzgpIHsKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9jb21wbGV0ZSgpOiB0eCBlcnJvcjogc2xvdyBETUEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNikgeworCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGhlYXJ0IGJlYXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNSkgeworCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiB0b28gbWFueSBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQl9CisKKyNpZmRlZiBERUJVR19UWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCwgdHhfc3RhdHVzIDB4JTA0eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2NvbXBsZXRlKCk6IHJlYXBlZCAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbnJlYXBlZCk7CisjZW5kaWYKKworCS8qCisJICogSW5mb3JtIHVwcGVyIGxheWVycy4KKwkgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIG5yZWFwZWQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTg2LCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0LgorICogQmVjYXVzZSB3dl84MjU4Nl9jb25maWcgdXNlcyBhIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmUgbGVmdCwgc28gd2UgZG8gaXQgbm93CisgKiBvciBpbiB3YXZlbGFuX3BhY2tldF94bWl0KCkgKEkgY2FuJ3QgZmluZCBhbnkgYmV0dGVyIHBsYWNlLAorICogd2F2ZWxhbl9pbnRlcnJ1cHQgaXMgbm90IGFuIG9wdGlvbiksIHNvIHlvdSBtYXkgZXhwZXJpZW5jZQorICogZGVsYXlzIHNvbWV0aW1lcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQXJtIHRoZSBmbGFnLCB3aWxsIGJlIGNsZWFyZCBpbiB3dl84MjU4Nl9jb25maWcoKSAqLworCWxwLT5yZWNvbmZpZ184MjU4NiA9IDE7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKwlpZigobmV0aWZfcnVubmluZyhkZXYpKSAmJiAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQkvKiBNYXkgZmFpbCAqLworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCWVsc2UgeworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X3JlY29uZmlnKCk6IGRlbGF5ZWQgKHN0YXRlID0gJWxYKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUpOworI2VuZGlmCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgaW4gdGhlIGNvZGUgdG8gc2hvdyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nLgorICogTW9zdCBvZiB0aGUgdGltZSwgaXQgZHVtcHMgdGhlIGNvbnRlbnRzIG9mIGhhcmR3YXJlIHN0cnVjdHVyZXMuCisgKi8KKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYS4KKyAqLworc3RhdGljIHZvaWQgd3ZfcHNhX3Nob3cocHNhX3QgKiBwKQoreworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIFBTQSBjb250ZW50czogIyMjIyNcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfaW9fYmFzZV9hZGRyXzE6IDB4JTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX2lvX2Jhc2VfYWRkcl8xLAorCSAgICAgICBwLT5wc2FfaW9fYmFzZV9hZGRyXzIsCisJICAgICAgIHAtPnBzYV9pb19iYXNlX2FkZHJfMywgcC0+cHNhX2lvX2Jhc2VfYWRkcl80KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3JlbV9ib290X2FkZHJfMTogMHglMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMSwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMiwgcC0+cHNhX3JlbV9ib290X2FkZHJfMyk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworCXByaW50aygicHNhX2ludF9yZXFfbm86ICVkXG4iLCBwLT5wc2FfaW50X3JlcV9ubyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbMF0sIHAtPnBzYV91bnVzZWQwWzFdLCBwLT5wc2FfdW51c2VkMFsyXSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbM10sIHAtPnBzYV91bnVzZWQwWzRdLCBwLT5wc2FfdW51c2VkMFs1XSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbNl0pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJICAgICAgIHAtPnBzYV91bml2X21hY19hZGRyWzJdLCBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgICAgICAgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX2xvY2FsX21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMF0sIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsxXSwKKwkgICAgICAgcC0+cHNhX2xvY2FsX21hY19hZGRyWzJdLCBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbM10sCisJICAgICAgIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls0XSwgcC0+cHNhX2xvY2FsX21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3VuaXZfbG9jYWxfc2VsOiAlZCwgIiwKKwkgICAgICAgcC0+cHNhX3VuaXZfbG9jYWxfc2VsKTsKKwlwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisJcHJpbnRrKCJwc2FfdGhyX3ByZV9zZXQ6IDB4JTAyeFxuIiwgcC0+cHNhX3Rocl9wcmVfc2V0KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2ZlYXR1cmVfc2VsZWN0L2RlY2F5X3BybTogMHglMDJ4LCAiLAorCSAgICAgICBwLT5wc2FfZmVhdHVyZV9zZWxlY3QpOworCXByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3F1YWxpdHlfdGhyOiAweCUwMngsICIsIHAtPnBzYV9xdWFsaXR5X3Rocik7CisJcHJpbnRrKCJwc2FfbW9kX2RlbGF5OiAweCUwMnhcbiIsIHAtPnBzYV9tb2RfZGVsYXkpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sCisJICAgICAgIHAtPnBzYV9ud2lkWzFdKTsKKwlwcmludGsoInBzYV9ud2lkX3NlbGVjdDogJWRcbiIsIHAtPnBzYV9ud2lkX3NlbGVjdCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9lbmNyeXB0aW9uX3NlbGVjdDogJWQsICIsCisJICAgICAgIHAtPnBzYV9lbmNyeXB0aW9uX3NlbGVjdCk7CisJcHJpbnRrCisJICAgICgicHNhX2VuY3J5cHRpb25fa2V5W106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVswXSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzFdLAorCSAgICAgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLCBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJICAgICBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNF0sIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs1XSwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs2XSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzddKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2RhdGFidXNfd2lkdGg6ICVkXG4iLCBwLT5wc2FfZGF0YWJ1c193aWR0aCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJICAgICAgIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworCXByaW50aworCSAgICAoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgcC0+cHNhX2NhbGxfY29kZVswXSwgcC0+cHNhX2NhbGxfY29kZVsxXSwgcC0+cHNhX2NhbGxfY29kZVsyXSwKKwkgICAgIHAtPnBzYV9jYWxsX2NvZGVbM10sIHAtPnBzYV9jYWxsX2NvZGVbNF0sIHAtPnBzYV9jYWxsX2NvZGVbNV0sCisJICAgICBwLT5wc2FfY2FsbF9jb2RlWzZdLCBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVzZXJ2ZWRbXTogJTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3Jlc2VydmVkWzBdLAorCSAgICAgICBwLT5wc2FfcmVzZXJ2ZWRbMV0sIHAtPnBzYV9yZXNlcnZlZFsyXSwgcC0+cHNhX3Jlc2VydmVkWzNdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfY29uZl9zdGF0dXM6ICVkLCAiLCBwLT5wc2FfY29uZl9zdGF0dXMpOworCXByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisJcHJpbnRrKCJwc2FfY3JjX3N0YXR1czogMHglMDJ4XG4iLCBwLT5wc2FfY3JjX3N0YXR1cyk7Cit9CQkJCS8qIHd2X3BzYV9zaG93ICovCisjZW5kaWYJCQkJLyogREVCVUdfUFNBX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX01NQ19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCB3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwltbXJfdCBtOworCisJLyogQmFzaWMgY2hlY2sgKi8KKwlpZiAoaGFzcl9yZWFkKGlvYWRkcikgJiBIQVNSX05PX0NMSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlYWQgdGhlIG1tYyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCW1tY19yZWFkKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAkJLyogaWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJbHAtPndzdGF0cy5kaXNjYXJkLm53aWQgKz0KKwkgICAgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbDsKKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgKi8KKworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJtbWNfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIG0ubW1yX3VudXNlZDBbMF0sIG0ubW1yX3VudXNlZDBbMV0sIG0ubW1yX3VudXNlZDBbMl0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbM10sIG0ubW1yX3VudXNlZDBbNF0sIG0ubW1yX3VudXNlZDBbNV0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbNl0sIG0ubW1yX3VudXNlZDBbN10pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkVuY3J5cHRpb24gYWxnb3JpdGhtOiAlMDJYIC0gU3RhdHVzOiAlMDJYXG4iLAorCSAgICAgICBtLm1tcl9kZXNfYXZhaWwsIG0ubW1yX2Rlc19zdGF0dXMpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisJcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgbS5tbXJfdW51c2VkMVswXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsxXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsyXSwgbS5tbXJfdW51c2VkMVszXSwgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJCQkJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiZGNlX3N0YXR1czogMHgleCBbJXMlcyVzJXNdXG4iLAorCSAgICAgICBtLm1tcl9kY2Vfc3RhdHVzLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/CisJICAgICAgICJlbmVyZ3kgZGV0ZWN0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgICAgICAgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19UWF9CVVNZKSA/CisJICAgICAgICJ0cmFuc21pdHRlciBvbiwiIDogIiIsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0pCUl9FWFBJUkVEKSA/CisJICAgICAgICJqYWJiZXIgdGltZXIgZXhwaXJlZCwiIDogIiIpOworCXByaW50ayhLRVJOX0RFQlVHICJEc3AgSUQ6ICUwMlhcbiIsIG0ubW1yX2RzcF9pZCk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSAgICAgICBtLm1tcl91bnVzZWQyWzBdLCBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICIjIGNvcnJlY3RfbndpZDogJWQsICMgd3JvbmdfbndpZDogJWRcbiIsCisJICAgICAgIChtLm1tcl9jb3JyZWN0X253aWRfaCA8PCA4KSB8IG0ubW1yX2NvcnJlY3RfbndpZF9sLAorCSAgICAgICAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidGhyX3ByZV9zZXQ6IDB4JXggW2N1cnJlbnQgc2lnbmFsICVzXVxuIiwKKwkgICAgICAgbS5tbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVQsCisJICAgICAgIChtLgorCQltbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVRfQ1VSKSA/ICJhYm92ZSIgOgorCSAgICAgICAiYmVsb3ciKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic2lnbmFsX2x2bDogJWQgWyVzXSwgIiwKKwkgICAgICAgbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPyAibmV3IG1zZyIgOgorCSAgICAgICAibm8gbmV3IG1zZyIpOworCXByaW50aygic2lsZW5jZV9sdmw6ICVkIFslc10sICIsCisJICAgICAgIG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA/ICJ1cGRhdGUgZG9uZSIgOgorCSAgICAgICAibm8gbmV3IHVwZGF0ZSIpOworCXByaW50aygic2dubF9xdWFsOiAweCV4IFslc11cbiIsIG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUwsCisJICAgICAgIChtLgorCQltbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTF9BTlQpID8gIkFudGVubmEgMSIgOgorCSAgICAgICAiQW50ZW5uYSAwIik7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d19pZF9sOiAleFxuIiwgbS5tbXJfbmV0d19pZF9sKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworfQkJCQkvKiB3dl9tbWNfc2hvdyAqLworI2VuZGlmCQkJCS8qIERFQlVHX01NQ19TSE9XICovCisKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9zY2Jfc2hvdyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzY2JfdCBzY2I7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX1NDQiwgKHVuc2lnbmVkIGNoYXIgKikgJnNjYiwKKwkJICAgc2l6ZW9mKHNjYikpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIFdhdmVMQU4gc3lzdGVtIGNvbnRyb2wgYmxvY2s6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzdGF0dXM6ICIpOworCXByaW50aygic3RhdCAweCV4WyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgKFNDQl9TVF9DWCB8IFNDQl9TVF9GUiB8IFNDQl9TVF9DTkEgfAorCQkJICAgICAgU0NCX1NUX1JOUikpID4+IDEyLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgU0NCX1NUX0NYKSA/ICJjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LCIgOgorCSAgICAgICAiIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0ZSKSA/ICJmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfQ05BKSA/ICJjb21tYW5kIHVuaXQgbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfUk5SKSA/ICJyZWNlaXZpbmcgdW5pdCBub3QgcmVhZHksIiA6CisJICAgICAgICIiKTsKKwlwcmludGsoImN1cyAweCV4WyVzJXMlc10gIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPj4gOCwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfSURMRSkgPyAiaWRsZSIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfU1VTUCkgPyAic3VzcGVuZGVkIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPT0KKwkJU0NCX1NUX0NVU19BQ1RWKSA/ICJhY3RpdmUiIDogIiIpOworCXByaW50aygicnVzIDB4JXhbJXMlcyVzJXNdXG4iLCAoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19JRExFKSA/ICJpZGxlIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19TVVNQKSA/ICJzdXNwZW5kZWQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA9PQorCQlTQ0JfU1RfUlVTX05SRVMpID8gIm5vIHJlc291cmNlcyIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9SVVMpID09CisJCVNDQl9TVF9SVVNfUkRZKSA/ICJyZWFkeSIgOiAiIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tbWFuZDogIik7CisJcHJpbnRrKCJhY2sgMHgleFslcyVzJXMlc10gIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiAoU0NCX0NNRF9BQ0tfQ1ggfCBTQ0JfQ01EX0FDS19GUiB8CisJCQkgICAgICAgU0NCX0NNRF9BQ0tfQ05BIHwgU0NCX0NNRF9BQ0tfUk5SKSkgPj4gMTIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ1gpID8gImFjayBjbWQgY29tcGxldGlvbiwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfRlIpID8gImFjayBmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ05BKSA/ICJhY2sgQ1Ugbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfUk5SKSA/ICJhY2sgUlUgbm90IHJlYWR5LCIgOiAiIik7CisJcHJpbnRrKCJjdWMgMHgleFslcyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID4+IDgsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX05PUCkgPyAibm9wIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19HTykgPyAic3RhcnQgY2JsX29mZnNldCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0NVQykgPT0KKwkJU0NCX0NNRF9DVUNfUkVTKSA/ICJyZXN1bWUgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19TVVMpID8gInN1c3BlbmQgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19BQlQpID8gImFib3J0IGV4ZWN1dGlvbiIgOiAiIik7CisJcHJpbnRrKCJydWMgMHgleFslcyVzJXMlcyVzXVxuIiwKKwkgICAgICAgKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19OT1ApID8gIm5vcCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfR08pID8gInN0YXJ0IHJmYV9vZmZzZXQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9SVUMpID09CisJCVNDQl9DTURfUlVDX1JFUykgPyAicmVzdW1lIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfU1VTKSA/ICJzdXNwZW5kIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfQUJUKSA/ICJhYm9ydCByZWNlcHRpb24iIDogIiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNibF9vZmZzZXQgMHgleCAiLCBzY2Iuc2NiX2NibF9vZmZzZXQpOworCXByaW50aygicmZhX29mZnNldCAweCV4XG4iLCBzY2Iuc2NiX3JmYV9vZmZzZXQpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNyY2VycnMgJWQgIiwgc2NiLnNjYl9jcmNlcnJzKTsKKwlwcmludGsoImFsbmVycnMgJWQgIiwgc2NiLnNjYl9hbG5lcnJzKTsKKwlwcmludGsoInJzY2VycnMgJWQgIiwgc2NiLnNjYl9yc2NlcnJzKTsKKwlwcmludGsoIm92cm5lcnJzICVkXG4iLCBzY2Iuc2NiX292cm5lcnJzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBpODI1ODYncyByZWNlaXZlIHVuaXQuCisgKi8KK3N0YXRpYyB2b2lkIHd2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJLyogbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OyAqLworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IHJlY2VpdmVyIHVuaXQgc3RhdHVzOiAjIyMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJ1OiIpOworCS8qCisJICogTm90IGltcGxlbWVudGVkIHlldAorCSAqLworCXByaW50aygiXG4iKTsKK30JCQkJLyogd3ZfcnVfc2hvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzcGxheSBpbmZvIGFib3V0IG9uZSBjb250cm9sIGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9jdV9zaG93X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgbmV0X2xvY2FsICogbHAsIGludCBpLCB1MTYgcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwlhY190eF90IGFjdHg7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50aygiJWQ6IDB4JXg6IiwgaSwgcCk7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgcCwgKHVuc2lnbmVkIGNoYXIgKikgJmFjdHgsIHNpemVvZihhY3R4KSk7CisJcHJpbnRrKCIgc3RhdHVzPTB4JXgsIiwgYWN0eC50eF9oLmFjX3N0YXR1cyk7CisJcHJpbnRrKCIgY29tbWFuZD0weCV4LCIsIGFjdHgudHhfaC5hY19jb21tYW5kKTsKKworCS8qCisJICAgeworCSAgIHRiZF90ICAgICAgdGJkOworCisJICAgb2JyYW1fcmVhZChpb2FkZHIsIGFjdHgudHhfdGJkX29mZnNldCwgKHVuc2lnbmVkIGNoYXIgKikmdGJkLCBzaXplb2YodGJkKSk7CisJICAgcHJpbnRrKCIgdGJkX3N0YXR1cz0weCV4LCIsIHRiZC50YmRfc3RhdHVzKTsKKwkgICB9CisJICovCisKKwlwcmludGsoInwiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHN0YXR1cyBvZiB0aGUgY29tbWFuZCB1bml0IG9mIHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2N1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBpOworCXUxNiBwOworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IGNvbW1hbmQgdW5pdCBzdGF0dXM6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHKTsKKwlmb3IgKGkgPSAwLCBwID0gbHAtPnR4X2ZpcnN0X2luX3VzZTsgaSA8IE5UWEJMT0NLUzsgaSsrKSB7CisJCXd2X2N1X3Nob3dfb25lKGRldiwgbHAsIGksIHApOworCisJCXAgKz0gVFhCTE9DS1o7CisJCWlmIChwID49IE9GRlNFVF9DVSArIE5UWEJMT0NLUyAqIFRYQkxPQ0taKQorCQkJcCAtPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCQkJCS8qIERFQlVHX0k4MjU4Nl9TSE9XICovCisKKyNpZmRlZiBERUJVR19ERVZJQ0VfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCB3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiZGV2OiIpOworCXByaW50aygiIHN0YXRlPSVsWCwiLCBkZXYtPnN0YXRlKTsKKwlwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisJcHJpbnRrKCIgZmxhZ3M9MHgleCwiLCBkZXYtPmZsYWdzKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2Rldl9zaG93ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgV2F2ZUxBTiBQQ01DSUEgZGV2aWNlIGRyaXZlcidzCisgKiBwcml2YXRlIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCB3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHA7CisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvY2FsOiIpOworCXByaW50aygiIHR4X25faW5fdXNlPSVkLCIsIGxwLT50eF9uX2luX3VzZSk7CisJcHJpbnRrKCIgaGFjcj0weCV4LCIsIGxwLT5oYWNyKTsKKwlwcmludGsoIiByeF9oZWFkPTB4JXgsIiwgbHAtPnJ4X2hlYWQpOworCXByaW50aygiIHJ4X2xhc3Q9MHgleCwiLCBscC0+cnhfbGFzdCk7CisJcHJpbnRrKCIgdHhfZmlyc3RfZnJlZT0weCV4LCIsIGxwLT50eF9maXJzdF9mcmVlKTsKKwlwcmludGsoIiB0eF9maXJzdF9pbl91c2U9MHgleCwiLCBscC0+dHhfZmlyc3RfaW5fdXNlKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2xvY2FsX3Nob3cgKi8KKyNlbmRpZgkJCQkvKiBERUJVR19ERVZJQ0VfU0hPVyAqLworCisjaWYgZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRHVtcCBwYWNrZXQgaGVhZGVyIChhbmQgY29udGVudCBpZiBuZWNlc3NhcnkpIG9uIHRoZSBzY3JlZW4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X3BhY2tldF9pbmZvKHU4ICogcCwJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkJCQkgIGludCBsZW5ndGgsCS8qIExlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJCQkJICBjaGFyICptc2cxLAkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkJCQkgIGNoYXIgKm1zZzIpCit7CQkJCS8qIE5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCisJaW50IGk7CisJaW50IG1heGk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IGRlc3QgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxlbmd0aCAlZFxuIiwKKwkgICAgICAgbXNnMSwgbXNnMiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IHNyYyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCwgdHlwZSAweCUwMlglMDJYXG4iLAorCSAgICAgICBtc2cxLCBtc2cyLCBwWzZdLCBwWzddLCBwWzhdLCBwWzldLCBwWzEwXSwgcFsxMV0sIHBbMTJdLAorCSAgICAgICBwWzEzXSk7CisKKyNpZmRlZiBERUJVR19QQUNLRVRfRFVNUAorCisJcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworCWlmICgobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKwkJbWF4aSA9IERFQlVHX1BBQ0tFVF9EVU1QOworCWZvciAoaSA9IDE0OyBpIDwgbWF4aTsgaSsrKQorCQlpZiAocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisJCQlwcmludGsoIiAlYyIsIHBbaV0pOworCQllbHNlCisJCQlwcmludGsoIiUwMlgiLCBwW2ldKTsKKwlpZiAobWF4aSA8IGxlbmd0aCkKKwkJcHJpbnRrKCIuLiIpOworCXByaW50aygiXCJcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCQkJCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwLgorICogVGhlcmUgYXJlIGxvdHMgb2YgZmxhZ3MgZm9yIGNvbmZpZ3VyaW5nIGl0IHRvIHlvdXIgbGlraW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlwc2FfdCBwc2E7CisJaW50IGk7CisKKwkvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKwl3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisJd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCisJd3ZfY3Vfc2hvdyhkZXYpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19CQVNJQ19TSE9XCisJLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmLiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU4gYXQgJSN4LCIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0FWRUxBTl9BRERSX1NJWkU7IGkrKykKKwkJcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIsIElSUSAlZCIsIGRldi0+aXJxKTsKKworCS8qIFByaW50IGN1cnJlbnQgbmV0d29yayBJRC4gKi8KKwlpZiAocHNhLnBzYV9ud2lkX3NlbGVjdCkKKwkJcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sCisJCSAgICAgICBwc2EucHNhX253aWRbMV0pOworCWVsc2UKKwkJcHJpbnRrKCIsIG53aWQgb2ZmIik7CisKKwkvKiBJZiAyLjAwIGNhcmQgKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgZnJlcTsKKworCQkvKiBBc2sgdGhlIEVFUFJPTSB0byByZWFkIHRoZSBmcmVxdWVuY3kgZnJvbSB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCAmZnJlcSwgMSk7CisKKwkJLyogUHJpbnQgZnJlcXVlbmN5ICovCisJCXByaW50aygiLCAyLjAwLCAlbGQiLCAoZnJlcSA+PiA2KSArIDI0MDBMKTsKKworCQkvKiBIYWNrISAqLworCQlpZiAoZnJlcSAmIDB4MjApCisJCQlwcmludGsoIi41Iik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIsIFBDIik7CisJCXN3aXRjaCAocHNhLnBzYV9jb21wX251bWJlcikgeworCQljYXNlIFBTQV9DT01QX1BDX0FUXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19BVF8yNDAwOgorCQkJcHJpbnRrKCItQVQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDX01DXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19NQ18yNDAwOgorCQkJcHJpbnRrKCItTUMiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDTUNJQV85MTU6CisJCQlwcmludGsoIk1DSUEiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCI/Iik7CisJCX0KKwkJcHJpbnRrKCIsICIpOworCQlzd2l0Y2ggKHBzYS5wc2Ffc3ViYmFuZCkgeworCQljYXNlIFBTQV9TVUJCQU5EXzkxNToKKwkJCXByaW50aygiOTE1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDI1OgorCQkJcHJpbnRrKCIyNDI1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCQkJcHJpbnRrKCIyNDYwIik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDg0OgorCQkJcHJpbnRrKCIyNDg0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDMwXzU6CisJCQlwcmludGsoIjI0MzAuNSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIj8iKTsKKwkJfQorCX0KKworCXByaW50aygiIE1IelxuIik7CisjZW5kaWYJCQkJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisJLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorfQkJCQkvKiB3dl9pbml0X2luZm8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBJT0NUTCwgU1RBVFMgJiBSRUNPTkZJRyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2UgZm91bmQgaGVyZSByb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYnkgTGludXggb24gZGlmZmVyZW50CisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IEV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzICp3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gKCYoKG5ldF9sb2NhbCAqKSBkZXYtPnByaXYpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKwkvKiBBcmUgd2UgYXNraW5nIGZvciBwcm9taXNjdW91cyBtb2RlLAorCSAqIG9yIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzICh3ZSBkb24ndCBoYXZlIHRoYXQhKQorCSAqIG9yIHRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgZm9yIHRoZSBoYXJkd2FyZSBmaWx0ZXI/ICovCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8CisJICAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAoZGV2LT5tY19jb3VudCA+IEk4MjU4Nl9NQVhfTVVMVElDQVNUX0FERFJFU1NFUykpIHsKKwkJLyoKKwkJICogRW5hYmxlIHByb21pc2N1b3VzIG1vZGU6IHJlY2VpdmUgYWxsIHBhY2tldHMuCisJCSAqLworCQlpZiAoIWxwLT5wcm9taXNjdW91cykgeworCQkJbHAtPnByb21pc2N1b3VzID0gMTsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisKKwkJCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGF0IHdlIGFyZSBkb2luZyBhIHJlYWxseSBiYWQgam9iLiAqLworCQkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJfQorCX0gZWxzZQorCQkvKiBBcmUgdGhlcmUgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBzZW5kPyAqLworCWlmIChkZXYtPm1jX2xpc3QgIT0gKHN0cnVjdCBkZXZfbWNfbGlzdCAqKSBOVUxMKSB7CisJCS8qCisJCSAqIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgYnV0IHJlY2VpdmUgYWxsIHBhY2tldHMKKwkJICogaW4gbXVsdGljYXN0IGxpc3QKKwkJICovCisjaWZkZWYgTVVMVElDQVNUX0FWT0lECisJCWlmIChscC0+cHJvbWlzY3VvdXMgfHwgKGRldi0+bWNfY291bnQgIT0gbHAtPm1jX2NvdW50KSkKKyNlbmRpZgorCQl7CisJCQlscC0+cHJvbWlzY3VvdXMgPSAwOworCQkJbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCQkJd3ZfODI1ODZfcmVjb25maWcoZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkJICogY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0LgorCQkgKi8KKwkJaWYgKGxwLT5wcm9taXNjdW91cyB8fCBscC0+bWNfY291bnQgPT0gMCkgeworCQkJbHAtPnByb21pc2N1b3VzID0gMDsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LgorICogKE5vdGUgOiBpdCB3YXMgYSBuaWNlIHdheSB0byB0ZXN0IHRoZSByZWNvbmZpZ3VyZSBzdHVmZi4uLikKKyAqLworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworc3RhdGljIGludCB3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKm1hYyA9IGFkZHI7CisKKwkvKiBDb3B5IHRoZSBhZGRyZXNzLiAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworCS8qIFJlY29uZmlndXJlIHRoZSBiZWFzdC4gKi8KKwl3dl84MjU4Nl9yZWNvbmZpZyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogU0VUX01BQ19BRERSRVNTICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJCS8qIGlmIHdpcmVsZXNzIGV4dGVuc2lvbnMgZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBjYXBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pb2N0bCkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICBpd19mcmVxICogZnJlcXVlbmN5KQoreworCWNvbnN0IGludCBCQU5EX05VTSA9IDEwOwkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlsb25nIGZyZXEgPSAwTDsJCS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiAqLworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlpbnQgaTsKKyNlbmRpZgorCisJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgKi8KKwkvKiBUaGVvcmV0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKwkgKiB0aGUgdHdvIGxpbWl0cyB3aXRoIGEgMC41IE1IeiBwcmVjaXNpb24uIEluIHByYWN0aWNlLAorCSAqIEkgZG9uJ3Qgd2FudCB5b3UgdG8gaGF2ZSB0cm91YmxlIHdpdGggbG9jYWwgcmVndWxhdGlvbnMuCisJICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMSkgJiYKKwkgICAgKGZyZXF1ZW5jeS0+bSA+PSAoaW50KSAyLjQxMmU4KQorCSAgICAmJiAoZnJlcXVlbmN5LT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCWZyZXEgPSAoKGZyZXF1ZW5jeS0+bSAvIDEwMDAwKSAtIDI0MDAwTCkgLyA1OworCX0KKworCS8qIFNldHRpbmcgYnkgY2hhbm5lbCAoc2FtZSBhcyB3ZnJlcXNlbCkgKi8KKwkvKiBXYXJuaW5nOiBlYWNoIGNoYW5uZWwgaXMgMjIgTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisJICogd2lsbCBpbnRlcmZlcmUuICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYgKGZyZXF1ZW5jeS0+bSA8IEJBTkRfTlVNKSkgeworCQkvKiBHZXQgZnJlcXVlbmN5IG9mZnNldC4gKi8KKwkJZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZC4gKi8KKwlpZiAoZnJlcSAhPSAwTCkgeworCQl1MTYgdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworCisJCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDcxLCB0YWJsZSwgMTApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCB0YWJsZVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgdG8gc2VlIHdoZXRoZXIgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkLiAqLworCQlpZiAoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJCSAgICAgICgxIDw8ICgoZnJlcSAtIDI0KSAlIDE2KSkpKSByZXR1cm4gLUVJTlZBTDsJLyogbm90IGFsbG93ZWQgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpZiB3ZSBnZXQgYSB1c2FibGUgZnJlcXVlbmN5ICovCisJaWYgKGZyZXEgIT0gMEwpIHsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYVsxNl07CisJCXVuc2lnbmVkIHNob3J0IGRhY1syXTsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYV92ZXJpZnlbMTZdOworCQl1bnNpZ25lZCBzaG9ydCBkYWNfdmVyaWZ5WzJdOworCQkvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisJCSAqIFNlZSBBVCZUIFdhdmVMQU4gRGF0YSBNYW51YWwsIFJFRiA0MDctMDI0Njg5L0UsIHBhZ2UgMy04CisJCSAqIGFuZCBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkuICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKwkJaW50IHBvd2VyX2JhbmQgPSAwOwkvKiBTZWxlY3RlZCBiYW5kICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2FkanVzdDsJLyogQ29ycmVjdCB2YWx1ZSAqLworCisJCS8qIFNlYXJjaCBmb3IgdGhlIGdhaW4uICovCisJCXBvd2VyX2JhbmQgPSAwOworCQl3aGlsZSAoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkJICAgICAgIChwb3dlcl9saW1pdFsrK3Bvd2VyX2JhbmRdICE9IDApKTsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4MDAsIGFyZWEsIDE2KTsKKworCQkvKiBSZWFkIHRoZSBEQUMuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBSZWFkIHRoZSBuZXcgcG93ZXIgYWRqdXN0IHZhbHVlLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NkIgLSAocG93ZXJfYmFuZCA+PiAxKSwgJnBvd2VyX2FkanVzdCwKKwkJCSAxKTsKKwkJaWYgKHBvd2VyX2JhbmQgJiAweDEpCisJCQlwb3dlcl9hZGp1c3QgPj49IDg7CisJCWVsc2UKKwkJCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU4gRUVQUk9NIERBQzogJTA0WCAlMDRYXG4iLAorCQkgICAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKwkJLyogRnJlcXVlbmN5IG9mZnNldCAoZm9yIGluZm8gb25seSkgKi8KKwkJYXJlYVswXSA9ICgoZnJlcSA8PCA1KSAmIDB4RkZFMCkgfCAoYXJlYVswXSAmIDB4MUYpOworCisJCS8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVszXSA9IChmcmVxID4+IDEpICsgMjQwMEwgLSAzNTJMOworCQlhcmVhWzJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworCQkvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVsxM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMOworCQlhcmVhWzEyXSA9ICgoZnJlcSAmIDB4MSkgPDwgNCkgfCAoYXJlYVsyXSAmIDB4RkZFRik7CisKKwkJLyogT3RoZXIgcGFydHMgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuICovCisKKwkJLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDLiAqLworCQlkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisJCWRhY1swXSA9ICgocG93ZXJfYWRqdXN0ICYgMHgxKSA8PCA0KSB8IChkYWNbMF0gJiAweEZGRUYpOworCisJCS8qIFdyaXRlIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfd3JpdGUoaW9hZGRyLCAweDAwLCBhcmVhLCAxNik7CisKKwkJLyogV3JpdGUgdGhlIERBQy4gKi8KKwkJZmVlX3dyaXRlKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIHdyaXRpbmcgb2YgdGhlIEVFUFJPTSB3ZW50IE9LLiAqLworCisJCS8qIFJlcmVhZCB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCBhcmVhX3ZlcmlmeSwgMTYpOworCisJCS8qIFJlcmVhZCB0aGUgREFDLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NjAsIGRhY192ZXJpZnksIDIpOworCisJCS8qIENvbXBhcmUuICovCisJCWlmIChtZW1jbXAoYXJlYSwgYXJlYV92ZXJpZnksIDE2ICogMikgfHwKKwkJICAgIG1lbWNtcChkYWMsIGRhY192ZXJpZnksIDIgKiAyKSkgeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIldhdmVMQU46IHd2X3NldF9mcmVxdWVuY3k6IHVuYWJsZSB0byB3cml0ZSBuZXcgZnJlcXVlbmN5IHRvIEVFUFJPTSg/KS5cbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKworCQkvKiBXZSBtdXN0IGRvd25sb2FkIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyB0byB0aGUKKwkJICogc3ludGhlc2l6ZXJzIChmcm9tIHRoZSBFRVBST00gLSBhcmVhIDEpCisJCSAqIE5vdGU6IGFzIHRoZSBFRVBST00gaXMgYXV0b21hdGljYWxseSBkZWNyZW1lbnRlZCwgd2Ugc2V0IHRoZSBlbmQKKwkJICogaWYgdGhlIGFyZWEuLi4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDBGKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRCk7CisKKwkJLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQuICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisJCS8qIFdlIG11c3Qgbm93IGRvd25sb2FkIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgKGdhaW4pIHRvCisJCSAqIHRoZSBzeW50aGVzaXplcnMgKGZyb20gdGhlIEVFUFJPTSAtIGFyZWEgNyAtIERBQykuICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHg2MSk7CisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkJCU1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQpOworCisJCS8qIFdhaXQgZm9yIHRoZSBkb3dubG9hZCB0byBmaW5pc2guICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQkvKiBWZXJpZmljYXRpb24gb2Ygd2hhdCB3ZSBoYXZlIGRvbmUgKi8KKworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhX3ZlcmlmeVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOIEVFUFJPTSBEQUM6ICAlMDRYICUwNFhcbiIsCisJCSAgICAgICBkYWNfdmVyaWZ5WzBdLCBkYWNfdmVyaWZ5WzFdKTsKKyNlbmRpZgorCisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFoLCBuZXZlciBnZXQgdGhlcmUuLi4gKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdpdmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzLgorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9mcmVxdWVuY3lfbGlzdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICAgaXdfZnJlcSAqIGxpc3QsCS8qIExpc3Qgb2YgZnJlcXVlbmNpZXMgdG8gZmlsbCAqLworCQkJCSAgICBpbnQgbWF4KQorewkJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBmcmVxdWVuY2llcyAqLworCXUxNiB0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisJbG9uZyBmcmVxID0gMEw7CQkvKiBvZmZzZXQgdG8gMi40IEdIeiBpbiAuNSBNSHogKyAxMiBNSHogKi8KKwlpbnQgaTsJCQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKwlpbnQgYyA9IDA7CQkvKiBDaGFubmVsIG51bWJlciAqLworCisJLyogUmVhZCB0aGUgZnJlcXVlbmN5IHRhYmxlLiAqLworCWZlZV9yZWFkKGlvYWRkciwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8gLCB0YWJsZSwgMTApOworCisJLyogQ2hlY2sgYWxsIGZyZXF1ZW5jaWVzLiAqLworCWkgPSAwOworCWZvciAoZnJlcSA9IDA7IGZyZXEgPCAxNTA7IGZyZXErKykKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisJCWlmICh0YWJsZVs5IC0gKGZyZXEgLyAxNildICYgKDEgPDwgKGZyZXEgJSAxNikpKSB7CisJCQkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJCQl3aGlsZSAoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJCQkgICAgICAgKGMgPCBORUxTKGNoYW5uZWxfYmFuZHMpKSkKKwkJCQljKys7CisJCQlsaXN0W2ldLmkgPSBjOwkvKiBTZXQgdGhlIGxpc3QgaW5kZXggKi8KKworCQkJLyogcHV0IGluIHRoZSBsaXN0ICovCisJCQlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJCQlsaXN0W2krK10uZSA9IDE7CisKKwkJCS8qIENoZWNrIG51bWJlci4gKi8KKwkJCWlmIChpID49IG1heCkKKwkJCQlyZXR1cm4gKGkpOworCQl9CisKKwlyZXR1cm4gKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiAgZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXIgbGlzdCwgYW5kIGlmIHRoZXkgbWF0Y2gsIGdldCB0aGUgc3RhdGlzdGljcy4KKyAqIFNvcnJ5LCBidXQgdGhpcyBmdW5jdGlvbiByZWFsbHkgbmVlZHMgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bF9zcHlfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LAorCQkJCSB1OCAqCW1hYywJLyogTUFDIGFkZHJlc3MgKi8KKwkJCQkgdTggKglzdGF0cykJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KK3sKKwlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisKKwl3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKwl3c3RhdHMubGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy5ub2lzZSA9IHN0YXRzWzFdICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy51cGRhdGVkID0gMHg3OworCisJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIG1hYywgJndzdGF0cyk7Cit9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisKKyNpZmRlZiBISVNUT0dSQU0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBoaXN0b2dyYW0gb2YgdGhlIHNpZ25hbCBsZXZlbC4KKyAqIEFzIHRoZSBub2lzZSBpcyBxdWl0ZSBjb25zdGFudCwgaXQncyBsaWtlIGRvaW5nIGl0IG9uIHRoZSBTTlIuCisgKiBXZSBoYXZlIGRlZmluZWQgYSBzZXQgb2YgaW50ZXJ2YWwgKGxwLT5oaXNfcmFuZ2UpLCBhbmQgZWFjaCB0aW1lCisgKiB0aGUgbGV2ZWwgZ29lcyBpbiB0aGF0IGludGVydmFsLCB3ZSBpbmNyZW1lbnQgdGhlIGNvdW50IChscC0+aGlzX3N1bSkuCisgKiBXaXRoIHRoaXMgaGlzdG9ncmFtIHlvdSBtYXkgZGV0ZWN0IGlmIG9uZSBXYXZlTEFOIGlzIHJlYWxseSB3ZWFrLAorICogb3IgeW91IG1heSBhbHNvIGNhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsZXZlbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX2hpc19nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHU4ICogc3RhdHMpCit7CQkJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXU4IGxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKwlpbnQgaTsKKworCS8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwuICovCisJaSA9IDA7CisJd2hpbGUgKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpCisJICAgICAgICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKTsKKworCS8qIEluY3JlbWVudCBpbnRlcnZhbCBjb3VudGVyLiAqLworCShscC0+aGlzX3N1bVtpXSkrKzsKK30KKyNlbmRpZiAvKiBISVNUT0dSQU0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICJXYXZlTEFOIik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE5XSUQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopIHBzYS5wc2FfbndpZCAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisKKwkJLyogU2V0IE5XSUQgaW4gbW1jLiAqLworCQltLncubW13X25ldHdfaWRfbCA9IHBzYS5wc2FfbndpZFsxXTsKKwkJbS53Lm1td19uZXR3X2lkX2ggPSBwc2EucHNhX253aWRbMF07CisJCW1tY193cml0ZShpb2FkZHIsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19sb29wdF9zZWwpLCAweDAwKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIHBzYS4gKi8KKwkJcHNhLnBzYV9ud2lkX3NlbGVjdCA9IDB4MDA7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwKKwkJCU1NV19MT09QVF9TRUxfRElTX05XSUQpOworCX0KKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5XSUQgCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBOV0lELiAqLworCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCSAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKwl3cnF1LT5ud2lkLnZhbHVlID0gKHBzYS5wc2FfbndpZFswXSA8PCA4KSArIHBzYS5wc2FfbndpZFsxXTsKKwl3cnF1LT5ud2lkLmRpc2FibGVkID0gIShwc2EucHNhX253aWRfc2VsZWN0KTsKKwl3cnF1LT5ud2lkLmZpeGVkID0gMTsJLyogU3VwZXJmbHVvdXMgKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGlvYWRkciwgJih3cnF1LT5mcmVxKSk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4KKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHgwMCwgJmZyZXEsIDEpOworCQl3cnF1LT5mcmVxLm0gPSAoKGZyZXEgPj4gNSkgKiA1ICsgMjQwMDBMKSAqIDEwMDAwOworCQl3cnF1LT5mcmVxLmUgPSAxOworCX0gZWxzZSB7CisJCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogU2V0IHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJLyogV2Ugc2hvdWxkIGNvbXBsYWluIGxvdWRseSBpZiB3cnF1LT5zZW5zLmZpeGVkID0gMCwgYmVjYXVzZSB3ZQorCSAqIGNhbid0IHNldCBhdXRvIG1vZGUuLi4gKi8KKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gd3JxdS0+c2Vucy52YWx1ZSAmIDB4M0Y7CisJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfdGhyX3ByZV9zZXQpLAorCQlwc2EucHNhX3Rocl9wcmVfc2V0KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0IC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwl3cnF1LT5zZW5zLnZhbHVlID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGVuY3J5cHRpb24ga2V5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwc2FfdCBwc2E7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgY2FwYWJsZSBvZiBlbmNyeXB0aW9uICovCisJaWYgKCFtbWNfZW5jcihpb2FkZHIpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDggKyAxKTsKKworCQkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9rZXkpLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX2tleSwgOCk7CisJCX0KKworCQkvKiBkaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksIDApOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBDaGVjayBpZiBlbmNyeXB0aW9uIGlzIGF2YWlsYWJsZSAqLworCWlmICghbW1jX2VuY3IoaW9hZGRyKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLAorCQkJIChjaGFyICopICZwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0IC0KKwkJCSAoY2hhciAqKSAmcHNhLAorCQkJICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkgcHNhX2VuY3J5cHRpb25fc2VsZWN0LCAxICsgOCk7CisKKwkJLyogZW5jcnlwdGlvbiBpcyBlbmFibGVkID8gKi8KKwkJaWYgKHBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QpCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworCQllbHNlCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgfD0gbW1jX2VuY3IoaW9hZGRyKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIFNldCBhbGwgdGhlIGluZm8gd2UgZG9uJ3QgY2FyZSBvciBkb24ndCBrbm93IGFib3V0IHRvIHplcm8gKi8KKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsKKworCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0LiAgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDEuNiAqIDEwMDAgKiAxMDAwOwkvKiBkb24ndCBhcmd1ZSBvbiB0aGlzICEgKi8KKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHhGRkZGOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMHgzRjsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gTU1SX1NJR05BTF9MVkw7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gTU1SX1NJTEVOQ0VfTFZMOworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gTU1SX1NHTkxfUVVBTDsgLyogQWx3YXlzIG1heCAqLworCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgZm9yIHRob3NlIHR3byAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDMwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDg7CisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDIpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soMHg4QjA0KSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChpb2FkZHIsIHJhbmdlLT5mcmVxLAorCQkJCQkJCUlXX01BWF9GUkVRVUVOQ0lFUyk7CisJfSBlbHNlCisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisKKwkvKiBFbmNyeXB0aW9uIHN1cHBvcnRlZCA/ICovCisJaWYgKG1tY19lbmNyKGlvYWRkcikpIHsKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA4OwkvKiBERVMgPSA2NCBiaXRzIGtleSAqLworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAxOwkvKiBPbmx5IG9uZSBrZXkgcG9zc2libGUgKi8KKwl9IGVsc2UgeworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMDsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdNT0RFICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV01PREUgKi8KKwl3YXZlbGFuX3NldF9zZW5zLAkJLyogU0lPQ1NJV1NFTlMgKi8KKwl3YXZlbGFuX2dldF9zZW5zLAkJLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwl3YXZlbGFuX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlpd19oYW5kbGVyX3NldF9zcHksCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJLyogU0lPQ0dJV1NQWSAqLworCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCQkvKiBTSU9DR0lXVEhSU1BZICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCS8qIEJ1bW1lciAhIFdoeSB0aG9zZSBhcmUgb25seSBhdCB0aGUgZW5kID8/PyAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgSElTVE9HUkFNCisJd2F2ZWxhbl9zZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAyICovCisJd2F2ZWxhbl9nZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAzICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyB3YXZlbGFuX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IFNJT0NTSVBRVEhSLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRxdWFsdGhyIiB9LAorICB7IFNJT0NHSVBRVEhSLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRxdWFsdGhyIiB9LAorICB7IFNJT0NTSVBISVNUTywgSVdfUFJJVl9UWVBFX0JZVEUgfCAxNiwgICAgICAgICAgICAgICAgICAgIDAsICJzZXRoaXN0byIgfSwKKyAgeyBTSU9DR0lQSElTVE8sIDAsICAgICAgICAgICAgICAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LCAiZ2V0aGlzdG8iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCXdhdmVsYW5faGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2Yod2F2ZWxhbl9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSB3YXZlbGFuX2hhbmRsZXIsCisJLnByaXZhdGUJPSB3YXZlbGFuX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gd2F2ZWxhbl9wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB3aXJlbGVzcyBzdGF0aXN0aWNzLgorICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcworICovCitzdGF0aWMgaXdfc3RhdHMgKndhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCW1tcl90IG07CisJaXdfc3RhdHMgKndzdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgKi8KKwlpZiAobHAgPT0gKG5ldF9sb2NhbCAqKSBOVUxMKQorCQlyZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwl3c3RhdHMgPSAmbHAtPndzdGF0czsKKworCS8qIEdldCBkYXRhIGZyb20gdGhlIG1tYy4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kY2Vfc3RhdHVzKSwgJm0ubW1yX2RjZV9zdGF0dXMsIDEpOworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl93cm9uZ19ud2lkX2wpLCAmbS5tbXJfd3JvbmdfbndpZF9sLAorCQkgMik7CisJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX3Rocl9wcmVfc2V0KSwgJm0ubW1yX3Rocl9wcmVfc2V0LAorCQkgNCk7CisKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworCS8qIENvcHkgZGF0YSB0byB3aXJlbGVzcyBzdHVmZi4gKi8KKwl3c3RhdHMtPnN0YXR1cyA9IG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVUzsKKwl3c3RhdHMtPnF1YWwucXVhbCA9IG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUw7CisJd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy0+cXVhbC5ub2lzZSA9IG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gKCgobS4gbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPj4gNykgCisJCQl8ICgobS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMX1ZBTElEKSA+PiA2KSAKKwkJCXwgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworCXdzdGF0cy0+ZGlzY2FyZC5ud2lkICs9IChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2w7CisJd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKKwl3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCQkJCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWxzIHdpdGggcmVjZWl2aW5nIHRoZSBwYWNrZXRzLgorICogVGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMgYW4gaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaGFzIGJlZW4KKyAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhbmQgY2FsbHMgdGhpcyBwYXJ0LgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgYWN0dWFsIGNvcHlpbmcgb2YgZGF0YSAoaW5jbHVkaW5nIHRoZSBFdGhlcm5ldAorICogaGVhZGVyIHN0cnVjdHVyZSkgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkIHRvIGFuIHNrX2J1ZmYgY2hhaW4gdGhhdAorICogd2lsbCBiZSBwYXNzZWQgdXAgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGxheWVyLiBOT1RFOiB3ZQorICogY3VycmVudGx5IGRvbid0IGhhbmRsZSB0cmFpbGVyIHByb3RvY29scyAobmVpdGhlciBkb2VzIHRoZSByZXN0IG9mCisgKiB0aGUgbmV0d29yayBpbnRlcmZhY2UpLCBzbyBpZiB0aGF0IGlzIG5lZWRlZCwgaXQgd2lsbCAoYXQgbGVhc3QgaW4KKyAqIHBhcnQpIGJlIGFkZGVkIGhlcmUuICBUaGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmUgcmluZyBidWZmZXIgYXJlCisgKiBjb3BpZWQgdG8gYSBtZXNzYWdlIGNoYWluIHRoYXQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlIGtlcm5lbC4KKyAqCisgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIuCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdTE2IGJ1Zl9vZmYsIGludCBza3NpemUpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBidWZfb2ZmLCBza3NpemUpOworI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBkYXRhICovCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSkpID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSBOVUxMKSB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBjb3VsZCBub3QgYWxsb2Nfc2tiKCVkLCBHRlBfQVRPTUlDKS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYi0+ZGV2ID0gZGV2OworCisJLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIuICovCisJb2JyYW1fcmVhZChpb2FkZHIsIGJ1Zl9vZmYsIHNrYl9wdXQoc2tiLCBza3NpemUpLCBza3NpemUpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJCQkJLyogREVCVUdfUlhfSU5GTyAqLworCisJLyogU3RhdGlzdGljcy1nYXRoZXJpbmcgYW5kIGFzc29jaWF0ZWQgc3R1ZmYuCisJICogSXQgc2VlbSBhIGJpdCBtZXNzeSB3aXRoIGFsbCB0aGUgZGVmaW5lLCBidXQgaXQncyByZWFsbHkKKwkgKiBzaW1wbGUuLi4gKi8KKwlpZiAoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCQkgICAobHAtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworI2lmZGVmIEhJU1RPR1JBTQorCQkgICAobHAtPmhpc19udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIEhJU1RPR1JBTSAqLworCQkgICAwKSB7CisJCXU4IHN0YXRzWzNdOwkvKiBzaWduYWwgbGV2ZWwsIG5vaXNlIGxldmVsLCBzaWduYWwgcXVhbGl0eSAqLworCisJCS8qIFJlYWQgc2lnbmFsIGxldmVsLCBzaWxlbmNlIGxldmVsIGFuZCBzaWduYWwgcXVhbGl0eSBieXRlcyAqLworCQkvKiBOb3RlOiBpbiB0aGUgUENNQ0lBIGhhcmR3YXJlLCB0aGVzZSBhcmUgcGFydCBvZiB0aGUgZnJhbWUuCisJCSAqIEl0IHNlZW1zIHRoYXQgZm9yIHRoZSBJU0EgaGFyZHdhcmUsIGl0J3Mgbm93aGVyZSB0byBiZQorCQkgKiBmb3VuZCBpbiB0aGUgZnJhbWUsIHNvIEknbSBvYmxpZ2VkIHRvIGRvIHRoaXMgKGl0IGhhcyBhCisJCSAqIHNpZGUgZWZmZWN0IG9uIC9wcm9jL25ldC93aXJlbGVzcykuCisJCSAqIEFueSBpZGVhcz8KKwkJICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCQltbWNfcmVhZChpb2FkZHIsIG1tcm9mZigwLCBtbXJfc2lnbmFsX2x2bCksIHN0YXRzLCAzKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMCk7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X3BhY2tldF9yZWFkKCk6IFNpZ25hbCBsZXZlbCAlZC82MywgU2lsZW5jZSBsZXZlbCAlZC82Mywgc2lnbmFsIHF1YWxpdHkgJWQvMTZcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXRzWzBdICYgMHgzRiwgc3RhdHNbMV0gJiAweDNGLAorCQkgICAgICAgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisJCS8qIFNweWluZyBzdHVmZiAqLworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQorCQl3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsCisJCQkgICAgICBzdGF0cyk7CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisJCXdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYgLyogSElTVE9HUkFNICovCisJfQorCisJLyoKKwkgKiBIYW5kIHRoZSBwYWNrZXQgdG8gdGhlIG5ldHdvcmsgbW9kdWxlLgorCSAqLworCW5ldGlmX3J4KHNrYik7CisKKwkvKiBLZWVwIHN0YXRpc3RpY3MgdXAgdG8gZGF0ZSAqLworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tzaXplOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNmZXIgYXMgbWFueSBwYWNrZXRzIGFzIHdlIGNhbgorICogZnJvbSB0aGUgZGV2aWNlIFJBTS4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCWludCBucmVhcGVkID0gMDsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBlYWNoIHJlY2VpdmVkIHBhY2tldC4gKi8KKwlmb3IgKDs7KSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBscC0+cnhfaGVhZCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLAorCQkJICAgc2l6ZW9mKGZkKSk7CisKKwkJLyogTm90ZSBhYm91dCB0aGUgc3RhdHVzIDoKKwkJICogSXQgc3RhcnQgdXAgdG8gYmUgMCAodGhlIHZhbHVlIHdlIHNldCkuIFRoZW4sIHdoZW4gdGhlIFJVCisJCSAqIGdyYWIgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciByZWNlcHRpb24sIGl0IHNldHMgdGhlCisJCSAqIEZEX1NUQVRVU19CIGZsYWcuIFdoZW4gdGhlIFJVIGhhcyBmaW5pc2hlZCByZWNlaXZpbmcgdGhlCisJCSAqIGZyYW1lLCBpdCBjbGVhcnMgRkRfU1RBVFVTX0IsIHNldCBGRF9TVEFUVVNfQyB0byBpbmRpY2F0ZQorCQkgKiBjb21wbGV0aW9uIGFuZCBzZXQgdGhlIG90aGVyIGZsYWdzIHRvIGluZGljYXRlIHRoZSBldmVudHVhbAorCQkgKiBlcnJvcnMuIEZEX1NUQVRVU19PSyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjZXB0aW9uIHdhcyBPSy4KKwkJICovCisKKwkJLyogSWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGNvbXBsZXRlLCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZC4gKi8KKwkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfQykgIT0gRkRfU1RBVFVTX0MpCisJCQlicmVhazsJLyogVGhpcyBpcyBob3cgd2UgZXhpdCB0aGUgbG9vcC4gKi8KKworCQlucmVhcGVkKys7CisKKwkJLyogQ2hlY2sgd2hldGhlciBmcmFtZSB3YXMgY29ycmVjdGx5IHJlY2VpdmVkLiAqLworCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19PSykgPT0gRkRfU1RBVFVTX09LKSB7CisJCQkvKiBEb2VzIHRoZSBmcmFtZSBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZGF0YT8gIExldCdzIGNoZWNrLiAqLworCQkJaWYgKGZkLmZkX3JiZF9vZmZzZXQgIT0gSTgyNTg2TlVMTCkgeworCQkJCS8qIFJlYWQgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJCQlvYnJhbV9yZWFkKGlvYWRkciwgZmQuZmRfcmJkX29mZnNldCwKKwkJCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwKKwkJCQkJICAgc2l6ZW9mKHJiZCkpOworCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19FT0YpICE9CisJCQkJICAgIFJCRF9TVEFUVVNfRU9GKSBwcmludGsoS0VSTl9JTkZPCisJCQkJCQkJICAgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRU9GIGZsYWcuXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSk7CisKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19GKSAhPQorCQkJCSAgICBSQkRfU1RBVFVTX0YpIHByaW50ayhLRVJOX0lORk8KKwkJCQkJCQkgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRiBmbGFnLlxuIiwKKwkJCQkJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgkJCQkvKiBERUJVR19SWF9FUlJPUiAqLworCisJCQkJLyogUmVhZCB0aGUgcGFja2V0IGFuZCB0cmFuc21pdCB0byBMaW51eCAqLworCQkJCXd2X3BhY2tldF9yZWFkKGRldiwgcmJkLnJiZF9idWZsLAorCQkJCQkgICAgICAgcmJkLgorCQkJCQkgICAgICAgcmJkX3N0YXR1cyAmCisJCQkJCSAgICAgICBSQkRfU1RBVFVTX0FDTlQpOworCQkJfQorI2lmZGVmIERFQlVHX1JYX0VSUk9SCisJCQllbHNlCS8qIGlmIGZyYW1lIGhhcyBubyBkYXRhICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXM6IHd2X3JlY2VpdmUoKTogZnJhbWUgaGFzIG5vIGRhdGEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0gZWxzZSB7CS8qIElmIHJlY2VwdGlvbiB3YXMgbm8gc3VjY2Vzc2Z1bCAqLworCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSBub3QgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5ICglWCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZmQuZmRfc3RhdHVzKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M2KSAhPSAwKQorCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IG5vIEVPRiBmbGFnLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TNykgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSB0b28gc2hvcnQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M4KSAhPSAwKSB7CisJCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiByeCBETUEgb3ZlcnJ1bi5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzkpICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IHJhbiBvdXQgb2YgcmVzb3VyY2VzLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TMTApICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBhbGlnbm1lbnQgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1MxMSkgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBDUkMgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKworCQlmZC5mZF9zdGF0dXMgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9zdGF0dXMpLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopICZmZC5mZF9zdGF0dXMsCisJCQkgICAgc2l6ZW9mKGZkLmZkX3N0YXR1cykpOworCisJCWZkLmZkX2NvbW1hbmQgPSBGRF9DT01NQU5EX0VMOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWZkLmZkX2NvbW1hbmQgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9sYXN0LCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWxwLT5yeF9sYXN0ID0gbHAtPnJ4X2hlYWQ7CisJCWxwLT5yeF9oZWFkID0gZmQuZmRfbGlua19vZmZzZXQ7CisJfQkJCS8qIGZvcig7OykgLT4gbG9vcCBvbiBhbGwgZnJhbWVzICovCisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X3JlY2VpdmUoKTogcmVhcGVkICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBucmVhcGVkKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbHMgd2l0aCBzZW5kaW5nIHBhY2tldHMgdGhyb3VnaCB0aGUgV2F2ZUxBTi4KKyAqCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGFuZCBtZW1vcnkKKyAqIGxvY2F0aW9ucyBvbiB0aGUgV2F2ZUxBTiBjYXJkIGFuZCBzdGFydHMgdGhlIGNhcmQgb2ZmIG9uCisgKiB0aGUgdHJhbnNtaXQuCisgKgorICogVGhlIHByaW5jaXBsZToKKyAqIEVhY2ggYmxvY2sgY29udGFpbnMgYSB0cmFuc21pdCBjb21tYW5kLCBhIE5PUCBjb21tYW5kLAorICogYSB0cmFuc21pdCBibG9jayBkZXNjcmlwdG9yIGFuZCBhIGJ1ZmZlci4KKyAqIFRoZSBDVSByZWFkIHRoZSB0cmFuc21pdCBibG9jayB3aGljaCBwb2ludCB0byB0aGUgdGJkLAorICogcmVhZCB0aGUgdGJkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICogV2hlbiBpdCBoYXMgZmluaXNoIHdpdGggaXQsIGl0IGdvZXMgdG8gdGhlIG5leHQgY29tbWFuZAorICogd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIE5PUC4gVGhlIE5PUCBwb2ludHMgb24gaXRzZWxmLAorICogc28gdGhlIENVIHN0b3AgaGVyZS4KKyAqIFdoZW4gd2UgYWRkIHRoZSBuZXh0IGJsb2NrLCB3ZSBtb2RpZnkgdGhlIHByZXZpb3VzIG5vcAorICogdG8gbWFrZSBpdCBwb2ludCBvbiB0aGUgbmV3IHR4IGNvbW1hbmQuCisgKiBTaW1wbGUsIGlzbid0IGl0ID8KKyAqCisgKiAoY2FsbGVkIGluIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3ZfcGFja2V0X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB2b2lkICpidWYsIHNob3J0IGxlbmd0aCkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCB0eGJsb2NrOworCXVuc2lnbmVkIHNob3J0IHR4cHJlZDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9hZGRyOworCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCXVuc2lnbmVkIHNob3J0IHRiZF9hZGRyOworCXVuc2lnbmVkIHNob3J0IGJ1Zl9hZGRyOworCWFjX3R4X3QgdHg7CisJYWNfbm9wX3Qgbm9wOworCXRiZF90IHRiZDsKKwlpbnQgY2xlbiA9IGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGFja2V0X3dyaXRlKCVkKVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBsZW5ndGgpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9wYWNrZXRfd3JpdGUoKTogVHggcXVldWUgZnVsbC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIG5leHQgYmxvY2sgYW5kIHByZXZpb3VzIGJsb2NrLiAqLworCXR4YmxvY2sgPSBscC0+dHhfZmlyc3RfZnJlZTsKKwl0eHByZWQgPSB0eGJsb2NrIC0gVFhCTE9DS1o7CisJaWYgKHR4cHJlZCA8IE9GRlNFVF9DVSkKKwkJdHhwcmVkICs9IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCWxwLT50eF9maXJzdF9mcmVlICs9IFRYQkxPQ0taOworCWlmIChscC0+dHhfZmlyc3RfZnJlZSA+PSBPRkZTRVRfQ1UgKyBOVFhCTE9DS1MgKiBUWEJMT0NLWikKKwkJbHAtPnR4X2ZpcnN0X2ZyZWUgLT0gTlRYQkxPQ0tTICogVFhCTE9DS1o7CisKKwlscC0+dHhfbl9pbl91c2UrKzsKKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYmxvY2suICovCisJdHhfYWRkciA9IHR4YmxvY2s7CisJbm9wX2FkZHIgPSB0eF9hZGRyICsgc2l6ZW9mKHR4KTsKKwl0YmRfYWRkciA9IG5vcF9hZGRyICsgc2l6ZW9mKG5vcCk7CisJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJLyoKKwkgKiBUcmFuc21pdCBjb21tYW5kCisJICovCisJdHgudHhfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY190eF90LCB0eF9hZGRyLCB0eF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmdHgudHhfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2YodHgudHhfaC5hY19zdGF0dXMpKTsKKworCS8qCisJICogTk9QIGNvbW1hbmQKKwkgKi8KKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX25vcF90LCBub3BfYWRkciwgbm9wX2guYWNfbGluayksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX2xpbmssCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX2xpbmspKTsKKworCS8qCisJICogVHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IKKwkgKi8KKwl0YmQudGJkX3N0YXR1cyA9IFRCRF9TVEFUVVNfRU9GIHwgKFRCRF9TVEFUVVNfQUNOVCAmIGNsZW4pOworCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCXRiZC50YmRfYnVmbCA9IGJ1Zl9hZGRyOworCXRiZC50YmRfYnVmaCA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwgc2l6ZW9mKHRiZCkpOworCisJLyoKKwkgKiBEYXRhCisJICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBidWZfYWRkciwgYnVmLCBsZW5ndGgpOworCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhpcyB0eGJsb2NrLgorCSAqLworCW5vcF9hZGRyID0gdHhwcmVkICsgc2l6ZW9mKHR4KTsKKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gdHhibG9jazsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyB3aWxsIGtlZXAgcXVpZXQgZm9yIGEgd2hpbGUgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZS4gKi8KKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisJaWYgKGxwLT50eF9maXJzdF9pbl91c2UgPT0gSTgyNTg2TlVMTCkKKwkJbHAtPnR4X2ZpcnN0X2luX3VzZSA9IHR4YmxvY2s7CisKKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisjaWZkZWYgREVCVUdfVFhfSU5GTworCXd2X3BhY2tldF9pbmZvKCh1OCAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLAorCQkgICAgICAgInd2X3BhY2tldF93cml0ZSIpOworI2VuZGlmCQkJCS8qIERFQlVHX1RYX0lORk8gKi8KKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHNlbmQgYSBwYWNrZXQgKE5FVDMgY2FsbGJhY2spCisgKiBJbiB0aGlzIHJvdXRpbmUsIHdlIGNoZWNrIGlmIHRoZSBoYXJ3YXJlIGlzIHJlYWR5IHRvIGFjY2VwdAorICogdGhlIHBhY2tldC4gIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiAgVGhlbiB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0LgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3BhY2tldF94bWl0KDB4JVgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCkgc2tiKTsKKyNlbmRpZgorCisJLyoKKwkgKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisJICogSW4gb3RoZXIgd29yZHMsIHByZXZlbnQgcmVlbnRlcmluZyB0aGlzIHJvdXRpbmUuCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogSWYgc29tZWJvZHkgaGFzIGFza2VkIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyLCAKKwkgKiB3ZSBjYW4gZG8gaXQgbm93LgorCSAqLworCWlmIChscC0+cmVjb25maWdfODI1ODYpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCS8qIENoZWNrIHRoYXQgd2UgY2FuIGNvbnRpbnVlICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPT0gKE5UWEJMT0NLUyAtIDEpKQorCQkJcmV0dXJuIDE7CisJfQorI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJaWYgKHNrYi0+bmV4dCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2tiIGhhcyBuZXh0XG4iKTsKKyNlbmRpZgorCisJLyogRG8gd2UgbmVlZCBzb21lIHBhZGRpbmc/ICovCisJLyogTm90ZSA6IG9uIHdpcmVsZXNzIHRoZSBwcm9wYWdhdGlvbiB0aW1lIGlzIGluIHRoZSBvcmRlciBvZiAxdXMsCisJICogYW5kIHdlIGRvbid0IGhhdmUgdGhlIEV0aGVybmV0IHNwZWNpZmljIHJlcXVpcmVtZW50IG9mIGJlZWluZworCSAqIGFibGUgdG8gZGV0ZWN0IGNvbGxpc2lvbnMsIHRoZXJlZm9yZSBpbiB0aGVvcnkgd2UgZG9uJ3QgcmVhbGx5CisJICogbmVlZCB0byBwYWQuIEplYW4gSUkgKi8KKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworCS8qIFdyaXRlIHBhY2tldCBvbiB0aGUgY2FyZCAqLworCWlmKHd2X3BhY2tldF93cml0ZShkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKQorCQlyZXR1cm4gMTsJLyogV2UgZmFpbGVkICovCisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3BhY2tldF94bWl0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRvZXMgdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBpbml0aWFsaXplIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXBzYV90IHBzYTsKKwltbXdfdCBtOworCWludCBjb25maWd1cmVkOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgVVNFX1BTQV9DT05GSUcKKwljb25maWd1cmVkID0gcHNhLnBzYV9jb25mX3N0YXR1cyAmIDE7CisjZWxzZQorCWNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKwkvKiBJcyB0aGUgUFNBIGlzIG5vdCBjb25maWd1cmVkICovCisJaWYgKCFjb25maWd1cmVkKSB7CisJCS8qIFVzZXIgd2lsbCBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBOV0lEIGxhdGVyICh3aXRoIGl3Y29uZmlnKS4gKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gMDsKKwkJcHNhLnBzYV9ud2lkWzFdID0gMDsKKworCQkvKiBubyBOV0lEIGNoZWNraW5nIHNpbmNlIE5XSUQgaXMgbm90IHNldCAqLworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworCQkvKiBEaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisKKwkJLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlczoKKwkJICogMHgwNCBmb3IgQVQsCisJCSAqIDB4MDEgZm9yIE1DQSwKKwkJICogMHgwNCBmb3IgUENNQ0lBIGFuZCAyLjAwIGNhcmQgKEFUJlQgNDA3LTAyNDY4OS9FIGRvY3VtZW50KQorCQkgKi8KKwkJaWYgKHBzYS5wc2FfY29tcF9udW1iZXIgJiAxKQorCQkJcHNhLnBzYV90aHJfcHJlX3NldCA9IDB4MDE7CisJCWVsc2UKKwkJCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSAweDA0OworCQlwc2EucHNhX3F1YWxpdHlfdGhyID0gMHgwMzsKKworCQkvKiBJdCBpcyBjb25maWd1cmVkICovCisJCXBzYS5wc2FfY29uZl9zdGF0dXMgfD0gMTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisJCS8qIFdyaXRlIHRoZSBwc2EuICovCisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSBwc2EucHNhX253aWQsIDQpOworCQlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopICZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfY29uZl9zdGF0dXMsIDEpOworCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgbHAtPmhhY3IpOworI2VuZGlmCisJfQorCisJLyogWmVybyB0aGUgbW1jIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoJm0sIDB4MDAsIHNpemVvZihtKSk7CisKKwkvKiBDb3B5IFBTQSBpbmZvIHRvIHRoZSBtbWMuICovCisJbS5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCW0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKworCWlmIChwc2EucHNhX253aWRfc2VsZWN0ICYgMSkKKwkJbS5tbXdfbG9vcHRfc2VsID0gMHgwMDsKKwllbHNlCisJCW0ubW13X2xvb3B0X3NlbCA9IE1NV19MT09QVF9TRUxfRElTX05XSUQ7CisKKwltZW1jcHkoJm0ubW13X2VuY3Jfa2V5LCAmcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwKKwkgICAgICAgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKwlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJbS5tbXdfZW5jcl9lbmFibGUgPQorCQkgICAgTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREU7CisJZWxzZQorCQltLm1td19lbmNyX2VuYWJsZSA9IDA7CisKKwltLm1td190aHJfcHJlX3NldCA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCW0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKwkvKgorCSAqIFNldCBkZWZhdWx0IG1vZGVtIGNvbnRyb2wgcGFyYW1ldGVycy4KKwkgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKwkgKi8KKwltLm1td19qYWJiZXJfZW5hYmxlID0gMHgwMTsKKwltLm1td19mcmVlemUgPSAwOworCW0ubW13X2FudGVuX3NlbCA9IE1NV19BTlRFTl9TRUxfQUxHX0VOOworCW0ubW13X2lmcyA9IDB4MjA7CisJbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKwltLm1td19qYW1fdGltZSA9IDB4Mzg7CisKKwltLm1td19kZXNfaW9faW52ZXJ0ID0gMDsKKwltLm1td19kZWNheV9wcm0gPSAwOworCW0ubW13X2RlY2F5X3VwZGF0X3BybSA9IDA7CisKKwkvKiBXcml0ZSBhbGwgaW5mbyB0byBNTUMuICovCisJbW1jX3dyaXRlKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydHMgdGhlIG1vZGVtIG9mIHRoZSAyLjAwIGZyZXF1ZW5jeQorCSAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uICBJdCdzIG5vdCBzdHJpY3RseSBuZWVkZWQgZm9yIHRoZQorCSAqIGZvbGxvd2luZyBib290cy4KKwkgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKwkgKiBJJ3ZlIGNsZWFuZWQgaXQgdXAgYSBiaXQgYW5kIGFkZGVkIGRvY3VtZW50YXRpb24uCisJICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorCSAqLworCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkKKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJLyogTm90ZTogV0ZSRVFTRUwgdmVyaWZpZXMgdGhhdCBpdCBpcyBhYmxlIHRvIHJlYWQgYSBzZW5zaWJsZQorCSAqIGZyZXF1ZW5jeSBmcm9tIEVFUFJPTSAoYWRkcmVzcyAweDAwKSBhbmQgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorCSAqIGlzIDB4QSAoWGlsaW54IHZlcnNpb24pIG9yIDB4QiAoQXJpYWRuZSB2ZXJzaW9uKS4KKwkgKiBNeSB0ZXN0IGlzIG1vcmUgY3J1ZGUgYnV0IGRvZXMgd29yay4gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisJCSAqIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSAxKQorCQkgKiBOb3RlOiBhcyB0aGUgRUVQUk9NIGlzIGF1dG9tYXRpY2FsbHkgZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisJCSAqIGlmIHRoZSBhcmVhLi4uICovCisJCW0ubW13X2ZlZV9hZGRyID0gMHgwRjsKKwkJbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworCQltbWNfd3JpdGUoaW9hZGRyLCAoY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwgLSAoY2hhciAqKSAmbSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworCQkvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZC4gKi8KKwkJZmVlX3dhaXQoaW9hZGRyLCAxMDAsIDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkvKiBUaGUgZnJlcXVlbmN5IHdhcyBpbiB0aGUgbGFzdCB3b3JkIGRvd25sb2FkZWQuICovCisJCW1tY19yZWFkKGlvYWRkciwgKGNoYXIgKikgJm0ubW13X2ZlZV9kYXRhX2wgLSAoY2hhciAqKSAmbSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2RhdGFfbCwgMik7CisKKwkJLyogUHJpbnQgc29tZSBpbmZvIGZvciB0aGUgdXNlci4gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogV2F2ZUxBTiAyLjAwIHJlY29nbmlzZWQgKGZyZXF1ZW5jeSBzZWxlY3QpLiAgQ3VycmVudCBmcmVxdWVuY3kgPSAlbGRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICAoKG0uCisJCQkgbW13X2ZlZV9kYXRhX2ggPDwgNCkgfCAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKgorCQkgICAgICAgNSAvIDIgKyAyNDAwMEwpOworI2VuZGlmCisKKwkJLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKwkJICogdGhlIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSA3IC0gREFDKS4gKi8KKwkJbS5tbXdfZmVlX2FkZHIgPSAweDYxOworCQltLm1td19mZWVfY3RybCA9IE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQ7CisJCW1tY193cml0ZShpb2FkZHIsIChjaGFyICopICZtLm1td19mZWVfY3RybCAtIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwsIDIpOworCisJCS8qIFdhaXQgdW50aWwgdGhlIGRvd25sb2FkIGlzIGZpbmlzaGVkLiAqLworCX0KKwkvKiBpZiAyLjAwIGNhcmQgKi8KKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfbW1jX2luaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uc3RydWN0IHRoZSBmZCBhbmQgcmJkIHN0cnVjdHVyZXMuCisgKiBTdGFydCB0aGUgcmVjZWl2ZSB1bml0LgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9ydV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCXUxNiByeDsKKwl1MTYgcnhfbmV4dDsKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9zdGF0dXMpLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJaWYgKChzY2JfY3MgJiBTQ0JfU1RfUlVTKSA9PSBTQ0JfU1RfUlVTX1JEWSkKKwkJcmV0dXJuIDA7CisKKwlscC0+cnhfaGVhZCA9IE9GRlNFVF9SVTsKKworCWZvciAoaSA9IDAsIHJ4ID0gbHAtPnJ4X2hlYWQ7IGkgPCBOUlhCTE9DS1M7IGkrKywgcnggPSByeF9uZXh0KSB7CisJCXJ4X25leHQgPQorCQkgICAgKGkgPT0gTlJYQkxPQ0tTIC0gMSkgPyBscC0+cnhfaGVhZCA6IHJ4ICsgUlhCTE9DS1o7CisKKwkJZmQuZmRfc3RhdHVzID0gMDsKKwkJZmQuZmRfY29tbWFuZCA9IChpID09IE5SWEJMT0NLUyAtIDEpID8gRkRfQ09NTUFORF9FTCA6IDA7CisJCWZkLmZkX2xpbmtfb2Zmc2V0ID0gcnhfbmV4dDsKKwkJZmQuZmRfcmJkX29mZnNldCA9IHJ4ICsgc2l6ZW9mKGZkKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLCBzaXplb2YoZmQpKTsKKworCQlyYmQucmJkX3N0YXR1cyA9IDA7CisJCXJiZC5yYmRfbmV4dF9yYmRfb2Zmc2V0ID0gSTgyNTg2TlVMTDsKKwkJcmJkLnJiZF9idWZsID0gcnggKyBzaXplb2YoZmQpICsgc2l6ZW9mKHJiZCk7CisJCXJiZC5yYmRfYnVmaCA9IDA7CisJCXJiZC5yYmRfZWxfc2l6ZSA9IFJCRF9FTCB8IChSQkRfU0laRSAmIE1BWERBVEFaKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCArIHNpemVvZihmZCksCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwgc2l6ZW9mKHJiZCkpOworCisJCWxwLT5yeF9sYXN0ID0gcng7CisJfQorCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3JmYV9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmxwLT5yeF9oZWFkLCBzaXplb2YobHAtPnJ4X2hlYWQpKTsKKworCXNjYl9jcyA9IFNDQl9DTURfUlVDX0dPOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCQlpZiAoc2NiX2NzID09IDApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX3J1X3N0YXJ0KCk6IGJvYXJkIG5vdCBhY2NlcHRpbmcgY29tbWFuZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHRyYW5zbWl0IGJsb2Nrcy4KKyAqIFN0YXJ0IHRoZSBjb21tYW5kIHVuaXQgZXhlY3V0aW5nIHRoZSBOT1AKKyAqIHNlbGYtbG9vcCBvZiB0aGUgZmlyc3QgdHJhbnNtaXQgYmxvY2suCisgKgorICogSGVyZSB3ZSBjcmVhdGUgdGhlIGxpc3Qgb2Ygc2VuZCBidWZmZXJzIHVzZWQgdG8gdHJhbnNtaXQgcGFja2V0cworICogYmV0d2VlbiB0aGUgUEMgYW5kIHRoZSBjb21tYW5kIHVuaXQuIEZvciBlYWNoIGJ1ZmZlciwgd2UgY3JlYXRlIGEKKyAqIGJ1ZmZlciBkZXNjcmlwdG9yIChwb2ludGluZyBvbiB0aGUgYnVmZmVyKSwgYSB0cmFuc21pdCBjb21tYW5kCisgKiAocG9pbnRpbmcgdG8gdGhlIGJ1ZmZlciBkZXNjcmlwdG9yKSBhbmQgYSBOT1AgY29tbWFuZC4KKyAqIFRoZSB0cmFuc21pdCBjb21tYW5kIGlzIGxpbmtlZCB0byB0aGUgTk9QLCBhbmQgdGhlIE5PUCB0byBpdHNlbGYuCisgKiBXaGVuIHdlIHdpbGwgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcgdGhlIHRyYW5zbWl0IGNvbW1hbmQsIHdlIHdpbGwKKyAqIHRoZW4gbG9vcCBvbiB0aGUgTk9QLiBCeSByZWxlYXNpbmcgdGhlIE5PUCBsaW5rIHRvIGEgbmV3IGNvbW1hbmQsCisgKiB3ZSBtYXkgc2VuZCBhbm90aGVyIGJ1ZmZlci4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X2N1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCXUxNiB0eGJsb2NrOworCXUxNiBmaXJzdF9ub3A7CisJdTE2IHNjYl9jczsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9jdV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscC0+dHhfZmlyc3RfZnJlZSA9IE9GRlNFVF9DVTsKKwlscC0+dHhfZmlyc3RfaW5fdXNlID0gSTgyNTg2TlVMTDsKKworCWZvciAoaSA9IDAsIHR4YmxvY2sgPSBPRkZTRVRfQ1U7CisJICAgICBpIDwgTlRYQkxPQ0tTOyBpKyssIHR4YmxvY2sgKz0gVFhCTE9DS1opIHsKKwkJYWNfdHhfdCB0eDsKKwkJYWNfbm9wX3Qgbm9wOworCQl0YmRfdCB0YmQ7CisJCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCQl1bnNpZ25lZCBzaG9ydCB0YmRfYWRkcjsKKwkJdW5zaWduZWQgc2hvcnQgYnVmX2FkZHI7CisKKwkJdHhfYWRkciA9IHR4YmxvY2s7CisJCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJCXRiZF9hZGRyID0gbm9wX2FkZHIgKyBzaXplb2Yobm9wKTsKKwkJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJCXR4LnR4X2guYWNfc3RhdHVzID0gMDsKKwkJdHgudHhfaC5hY19jb21tYW5kID0gYWNtZF90cmFuc21pdCB8IEFDX0NGTERfSTsKKwkJdHgudHhfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCXR4LnR4X3RiZF9vZmZzZXQgPSB0YmRfYWRkcjsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0eF9hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmdHgsCisJCQkgICAgc2l6ZW9mKHR4KSk7CisKKwkJbm9wLm5vcF9oLmFjX3N0YXR1cyA9IDA7CisJCW5vcC5ub3BfaC5hY19jb21tYW5kID0gYWNtZF9ub3A7CisJCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgbm9wX2FkZHIsICh1bnNpZ25lZCBjaGFyICopICZub3AsCisJCQkgICAgc2l6ZW9mKG5vcCkpOworCisJCXRiZC50YmRfc3RhdHVzID0gVEJEX1NUQVRVU19FT0Y7CisJCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCQl0YmQudGJkX2J1ZmwgPSBidWZfYWRkcjsKKwkJdGJkLnRiZF9idWZoID0gMDsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwKKwkJCSAgICBzaXplb2YodGJkKSk7CisJfQorCisJZmlyc3Rfbm9wID0KKwkgICAgT0ZGU0VUX0NVICsgKE5UWEJMT0NLUyAtIDEpICogVFhCTE9DS1ogKyBzaXplb2YoYWNfdHhfdCk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NibF9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmZpcnN0X25vcCwgc2l6ZW9mKGZpcnN0X25vcCkpOworCisJc2NiX2NzID0gU0NCX0NNRF9DVUNfR087CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJCWlmIChzY2JfY3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPD0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY3Vfc3RhcnQoKTogYm9hcmQgbm90IGFjY2VwdGluZyBjb21tYW5kLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCWxwLT50eF9uX2luX3VzZSA9IDA7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfY3Vfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOIAorICogY29udHJvbGxlciAoaTgyNTg2KS4KKyAqCisgKiBJdCBpbml0aWFsaXNlcyB0aGUgc2NwLCBpc2NwIGFuZCBzY2Igc3RydWN0dXJlCisgKiBUaGUgZmlyc3QgdHdvIGFyZSBqdXN0IHBvaW50ZXJzIHRvIHRoZSBuZXh0LgorICogVGhlIGxhc3Qgb25lIGlzIHVzZWQgZm9yIGJhc2ljIGNvbmZpZ3VyYXRpb24gYW5kIGZvciBiYXNpYworICogY29tbXVuaWNhdGlvbiAoaW50ZXJydXB0IHN0YXR1cykuCisgKgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl84MjU4Nl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzY3BfdCBzY3A7CQkvKiBzeXN0ZW0gY29uZmlndXJhdGlvbiBwb2ludGVyICovCisJaXNjcF90IGlzY3A7CQkvKiBpbnRlcm1lZGlhdGUgc2NwICovCisJc2NiX3Qgc2NiOwkJLyogc3lzdGVtIGNvbnRyb2wgYmxvY2sgKi8KKwlhY2hfdCBjYjsJCS8qIEFjdGlvbiBjb21tYW5kIGhlYWRlciAqLworCXU4IHplcm9lc1s1MTJdOworCWludCBpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgdGhlIG9uYm9hcmQgUkFNLgorCSAqLworCW1lbXNldCgmemVyb2VzWzBdLCAweDAwLCBzaXplb2YoemVyb2VzKSk7CisJZm9yIChpID0gMDsgaSA8IEk4MjU4Nl9NRU1aOyBpICs9IHNpemVvZih6ZXJvZXMpKQorCQlvYnJhbV93cml0ZShpb2FkZHIsIGksICZ6ZXJvZXNbMF0sIHNpemVvZih6ZXJvZXMpKTsKKworCS8qCisJICogQ29uc3RydWN0IHRoZSBjb21tYW5kIHVuaXQgc3RydWN0dXJlczoKKwkgKiBzY3AsIGlzY3AsIHNjYiwgY2IuCisJICovCisJbWVtc2V0KCZzY3AsIDB4MDAsIHNpemVvZihzY3ApKTsKKwlzY3Auc2NwX3N5c2J1cyA9IFNDUF9TWV8xNkJCVVM7CisJc2NwLnNjcF9pc2NwbCA9IE9GRlNFVF9JU0NQOworCW9icmFtX3dyaXRlKGlvYWRkciwgT0ZGU0VUX1NDUCwgKHVuc2lnbmVkIGNoYXIgKikgJnNjcCwKKwkJICAgIHNpemVvZihzY3ApKTsKKworCW1lbXNldCgmaXNjcCwgMHgwMCwgc2l6ZW9mKGlzY3ApKTsKKwlpc2NwLmlzY3BfYnVzeSA9IDE7CisJaXNjcC5pc2NwX29mZnNldCA9IE9GRlNFVF9TQ0I7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfSVNDUCwgKHVuc2lnbmVkIGNoYXIgKikgJmlzY3AsCisJCSAgICBzaXplb2YoaXNjcCkpOworCisJLyogT3VyIGZpcnN0IGNvbW1hbmQgaXMgdG8gcmVzZXQgdGhlIGk4MjU4Ni4gKi8KKwltZW1zZXQoJnNjYiwgMHgwMCwgc2l6ZW9mKHNjYikpOworCXNjYi5zY2JfY29tbWFuZCA9IFNDQl9DTURfUkVTRVQ7CisJc2NiLnNjYl9jYmxfb2Zmc2V0ID0gT0ZGU0VUX0NVOworCXNjYi5zY2JfcmZhX29mZnNldCA9IE9GRlNFVF9SVTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIE9GRlNFVF9TQ0IsICh1bnNpZ25lZCBjaGFyICopICZzY2IsCisJCSAgICBzaXplb2Yoc2NiKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0lTQ1AsICh1bnNpZ25lZCBjaGFyICopICZpc2NwLAorCQkJICAgc2l6ZW9mKGlzY3ApKTsKKworCQlpZiAoaXNjcC5pc2NwX2J1c3kgPT0gKHVuc2lnbmVkIHNob3J0KSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA8PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd3ZfODI1ODZfc3RhcnQoKTogaXNjcF9idXN5IHRpbWVvdXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgY29tbWFuZCBjb21wbGV0aW9uLiAqLworCWZvciAoaSA9IDE1OyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfU0NCLCAodW5zaWduZWQgY2hhciAqKSAmc2NiLAorCQkJICAgc2l6ZW9mKHNjYikpOworCisJCWlmIChzY2Iuc2NiX3N0YXR1cyA9PSAoU0NCX1NUX0NYIHwgU0NCX1NUX0NOQSkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBzdGF0dXM6IGV4cGVjdGVkIDB4JTAyeCwgZ290IDB4JTAyeC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIFNDQl9TVF9DWCB8IFNDQl9TVF9DTkEsIHNjYi5zY2Jfc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJd3ZfYWNrKGRldik7CisKKwkvKiBTZXQgdGhlIGFjdGlvbiBjb21tYW5kIGhlYWRlci4gKi8KKwltZW1zZXQoJmNiLCAweDAwLCBzaXplb2YoY2IpKTsKKwljYi5hY19jb21tYW5kID0gQUNfQ0ZMRF9FTCB8IChBQ19DRkxEX0NNRCAmIGFjbWRfZGlhZ25vc2UpOworCWNiLmFjX2xpbmsgPSBPRkZTRVRfQ1U7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwgc2l6ZW9mKGNiKSk7CisKKwlpZiAod3Zfc3luY2hyb25vdXNfY21kKGRldiwgImRpYWcoKSIpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0NVLCAodW5zaWduZWQgY2hhciAqKSAmY2IsIHNpemVvZihjYikpOworCWlmIChjYi5hY19zdGF0dXMgJiBBQ19TRkxEX0ZBSUwpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBpODI1ODYgU2VsZiBUZXN0IGZhaWxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwl3dl9zY2Jfc2hvdyhpb2FkZHIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfODI1ODZfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOCisgKiBjb250cm9sbGVyIChpODI1ODYpLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhIHZpb2xlbnQgaGFjay4gV2UgdXNlIHRoZSBmaXJzdCBmcmVlIHRyYW5zbWl0IGJsb2NrCisgKiB0byBtYWtlIG91ciBjb25maWd1cmF0aW9uLiBJbiB0aGUgYnVmZmVyIGFyZWEsIHdlIGNyZWF0ZSB0aGUgdGhyZWUKKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgKGxpbmtlZCkuIFdlIG1ha2UgdGhlIHByZXZpb3VzIE5PUCBwb2ludCB0bworICogdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGluc3RlYWQgb2YgdGhlIHR4IGNvbW1hbmQuIEFmdGVyLCB3ZSBnbworICogYXMgdXN1YWwgdG8gdGhlIE5PUCBjb21tYW5kLgorICogTm90ZSB0aGF0IG9ubHkgdGhlIGxhc3QgY29tbWFuZCAobWNfc2V0KSB3aWxsIGdlbmVyYXRlIGFuIGludGVycnVwdC4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCksIHd2XzgyNTg2X3JlY29uZmlnKCksIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIHZvaWQgd3ZfODI1ODZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IHR4YmxvY2s7CisJdW5zaWduZWQgc2hvcnQgdHhwcmVkOworCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbm9wX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdGJkX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgaWFzX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CisJYWNfdHhfdCB0eDsKKwlhY19ub3BfdCBub3A7CisJYWNfY2ZnX3QgY2ZnOwkJLyogQ29uZmlndXJlIGFjdGlvbiAqLworCWFjX2lhc190IGlhczsJCS8qIElBLXNldHVwIGFjdGlvbiAqLworCWFjX21jc190IG1jczsJCS8qIE11bHRpY2FzdCBzZXR1cCAqLworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPICIlczogd3ZfODI1ODZfY29uZmlnKCk6IFR4IHF1ZXVlIGZ1bGwuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJLyogQ2FsY3VsYXRlIGFkZHJlc3NlcyBvZiBuZXh0IGJsb2NrIGFuZCBwcmV2aW91cyBibG9jay4gKi8KKwl0eGJsb2NrID0gbHAtPnR4X2ZpcnN0X2ZyZWU7CisJdHhwcmVkID0gdHhibG9jayAtIFRYQkxPQ0taOworCWlmICh0eHByZWQgPCBPRkZTRVRfQ1UpCisJCXR4cHJlZCArPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwlscC0+dHhfZmlyc3RfZnJlZSArPSBUWEJMT0NLWjsKKwlpZiAobHAtPnR4X2ZpcnN0X2ZyZWUgPj0gT0ZGU0VUX0NVICsgTlRYQkxPQ0tTICogVFhCTE9DS1opCisJCWxwLT50eF9maXJzdF9mcmVlIC09IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCisJbHAtPnR4X25faW5fdXNlKys7CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGJsb2NrLiAqLworCXR4X2FkZHIgPSB0eGJsb2NrOworCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJdGJkX2FkZHIgPSBub3BfYWRkciArIHNpemVvZihub3ApOworCWNmZ19hZGRyID0gdGJkX2FkZHIgKyBzaXplb2YodGJkX3QpOwkvKiBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLworCWlhc19hZGRyID0gY2ZnX2FkZHIgKyBzaXplb2YoY2ZnKTsKKwltY3NfYWRkciA9IGlhc19hZGRyICsgc2l6ZW9mKGlhcyk7CisKKwkvKgorCSAqIFRyYW5zbWl0IGNvbW1hbmQKKwkgKi8KKwl0eC50eF9oLmFjX3N0YXR1cyA9IDB4RkZGRjsJLyogRmFrZSBjb21wbGV0aW9uIHZhbHVlICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX3R4X3QsIHR4X2FkZHIsIHR4X2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZ0eC50eF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZih0eC50eF9oLmFjX3N0YXR1cykpOworCisJLyoKKwkgKiBOT1AgY29tbWFuZAorCSAqLworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogQ3JlYXRlIGEgY29uZmlndXJlIGFjdGlvbi4gKi8KKwltZW1zZXQoJmNmZywgMHgwMCwgc2l6ZW9mKGNmZykpOworCisJLyoKKwkgKiBGb3IgTGludXggd2UgaW52ZXJ0IEFDX0NGR19BTE9DKCkgc28gYXMgdG8gY29uZm9ybQorCSAqIHRvIHRoZSB3YXkgdGhhdCBuZXQgcGFja2V0cyByZWFjaCB1cyBmcm9tIGFib3ZlLgorCSAqIChTZWUgYWxzbyBhY190eF90LikKKwkgKgorCSAqIFVwZGF0ZWQgZnJvbSBXYXZlbGFuIE1hbnVhbCBXQ0lOMDg1QgorCSAqLworCWNmZy5jZmdfYnl0ZV9jbnQgPQorCSAgICBBQ19DRkdfQllURV9DTlQoc2l6ZW9mKGFjX2NmZ190KSAtIHNpemVvZihhY2hfdCkpOworCWNmZy5jZmdfZmlmb2xpbSA9IEFDX0NGR19GSUZPTElNKDQpOworCWNmZy5jZmdfYnl0ZTggPSBBQ19DRkdfU0FWX0JGKDEpIHwgQUNfQ0ZHX1NSRFkoMCk7CisJY2ZnLmNmZ19ieXRlOSA9IEFDX0NGR19FTFBCQ0soMCkgfAorCSAgICBBQ19DRkdfSUxQQkNLKDApIHwKKwkgICAgQUNfQ0ZHX1BSRUxFTihBQ19DRkdfUExFTl8yKSB8CisJICAgIEFDX0NGR19BTE9DKDEpIHwgQUNfQ0ZHX0FERFJMRU4oV0FWRUxBTl9BRERSX1NJWkUpOworCWNmZy5jZmdfYnl0ZTEwID0gQUNfQ0ZHX0JPRk1FVCgxKSB8CisJICAgIEFDX0NGR19BQ1IoNikgfCBBQ19DRkdfTElOUFJJTygwKTsKKwljZmcuY2ZnX2lmcyA9IDB4MjA7CisJY2ZnLmNmZ19zbG90bCA9IDB4MEM7CisJY2ZnLmNmZ19ieXRlMTMgPSBBQ19DRkdfUkVUUllOVU0oMTUpIHwgQUNfQ0ZHX1NMVFRNSEkoMCk7CisJY2ZnLmNmZ19ieXRlMTQgPSBBQ19DRkdfRkxHUEFEKDApIHwKKwkgICAgQUNfQ0ZHX0JUU1RGKDApIHwKKwkgICAgQUNfQ0ZHX0NSQzE2KDApIHwKKwkgICAgQUNfQ0ZHX05DUkMoMCkgfAorCSAgICBBQ19DRkdfVE5DUlMoMSkgfAorCSAgICBBQ19DRkdfTUFOQ0goMCkgfAorCSAgICBBQ19DRkdfQkNESVMoMCkgfCBBQ19DRkdfUFJNKGxwLT5wcm9taXNjdW91cyk7CisJY2ZnLmNmZ19ieXRlMTUgPSBBQ19DRkdfSUNEUygwKSB8CisJICAgIEFDX0NGR19DRFRGKDApIHwgQUNfQ0ZHX0lDU1MoMCkgfCBBQ19DRkdfQ1NURigwKTsKKy8qCisgIGNmZy5jZmdfbWluX2ZybV9sZW4gPSBBQ19DRkdfTU5GUk0oNjQpOworKi8KKwljZmcuY2ZnX21pbl9mcm1fbGVuID0gQUNfQ0ZHX01ORlJNKDgpOworCisJY2ZnLmNmZ19oLmFjX2NvbW1hbmQgPSAoQUNfQ0ZMRF9DTUQgJiBhY21kX2NvbmZpZ3VyZSk7CisJY2ZnLmNmZ19oLmFjX2xpbmsgPSBpYXNfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIGNmZ19hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmY2ZnLCBzaXplb2YoY2ZnKSk7CisKKwkvKiBTZXQgdXAgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtc2V0KCZpYXMsIDB4MDAsIHNpemVvZihpYXMpKTsKKwlpYXMuaWFzX2guYWNfY29tbWFuZCA9IChBQ19DRkxEX0NNRCAmIGFjbWRfaWFfc2V0dXApOworCWlhcy5pYXNfaC5hY19saW5rID0gbWNzX2FkZHI7CisJbWVtY3B5KCZpYXMuaWFzX2FkZHJbMF0sICh1bnNpZ25lZCBjaGFyICopICZkZXYtPmRldl9hZGRyWzBdLAorCSAgICAgICBzaXplb2YoaWFzLmlhc19hZGRyKSk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBpYXNfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJmlhcywgc2l6ZW9mKGlhcykpOworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgRXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCW1lbXNldCgmbWNzLCAweDAwLCBzaXplb2YobWNzKSk7CisJbWNzLm1jc19oLmFjX2NvbW1hbmQgPSBBQ19DRkxEX0kgfCAoQUNfQ0ZMRF9DTUQgJiBhY21kX21jX3NldHVwKTsKKwltY3MubWNzX2guYWNfbGluayA9IG5vcF9hZGRyOworCW1jcy5tY3NfY250ID0gV0FWRUxBTl9BRERSX1NJWkUgKiBscC0+bWNfY291bnQ7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBtY3NfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJm1jcywgc2l6ZW9mKG1jcykpOworCisJLyogQW55IGFkZHJlc3MgdG8gc2V0PyAqLworCWlmIChscC0+bWNfY291bnQpIHsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KQorCQkJb3V0c3coUElPUDEoaW9hZGRyKSwgKHUxNiAqKSBkbWktPmRtaV9hZGRyLAorCQkJICAgICAgV0FWRUxBTl9BRERSX1NJWkUgPj4gMSk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9jb25maWcoKTogc2V0ICVkIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+bWNfY291bnQpOworCQlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwKKwkJCSAgICAgICBkbWktPmRtaV9hZGRyWzJdLCBkbWktPmRtaV9hZGRyWzNdLAorCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNF0sIGRtaS0+ZG1pX2FkZHJbNV0pOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCisJICovCisJbm9wX2FkZHIgPSB0eHByZWQgKyBzaXplb2YodHgpOworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBjZmdfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogSm9iIGRvbmUsIGNsZWFyIHRoZSBmbGFnICovCisJbHAtPnJlY29uZmlnXzgyNTg2ID0gMDsKKworCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID09IEk4MjU4Nk5VTEwpCisJCWxwLT50eF9maXJzdF9pbl91c2UgPSB0eGJsb2NrOworCisJaWYgKGxwLT50eF9uX2luX3VzZSA9PSAoTlRYQkxPQ0tTIC0gMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl84MjU4Nl9jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lLCBjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpLCBncmFjZWZ1bGx5IHN0b3BzIHRoZSAKKyAqIFdhdmVMQU4gY29udHJvbGxlciAoaTgyNTg2KS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NtZDsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl84MjU4Nl9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFN1c3BlbmQgYm90aCBjb21tYW5kIHVuaXQgYW5kIHJlY2VpdmUgdW5pdC4gKi8KKwlzY2JfY21kID0KKwkgICAgKFNDQl9DTURfQ1VDICYgU0NCX0NNRF9DVUNfU1VTKSB8IChTQ0JfQ01EX1JVQyAmCisJCQkJCSAgICAgICBTQ0JfQ01EX1JVQ19TVVMpOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY21kLCBzaXplb2Yoc2NiX2NtZCkpOworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBObyBtb3JlIGludGVycnVwdHMgKi8KKwl3dl9pbnRzX29mZihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTg2X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVG90YWxseSByZXNldCB0aGUgV2F2ZUxBTiBhbmQgcmVzdGFydCBpdC4KKyAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAqCTEuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTIuIEluaXRpYWxpemUgdGhlIHJhZGlvIG1vZGVtICh1c2luZyB3dl9tbWNfaW5pdCkKKyAqCTMuIFJlc2V0ICYgQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU4Nl9zdGFydCkKKyAqCTQuIFN0YXJ0IHRoZSBMQU4gY29udHJvbGxlcidzIGNvbW1hbmQgdW5pdAorICoJNS4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCksIHdhdmVsYW5fd2F0Y2hkb2coKSAmIHdhdmVsYW5fb3BlbigpKQorICovCitzdGF0aWMgaW50IHd2X2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2h3X3Jlc2V0KGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKwkvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJlc2V0cyBkb25lLiAqLworCWxwLT5ucmVzZXRzKys7CisKKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisJbHAtPmhhY3IgPSBIQUNSX0RFRkFVTFQ7CisKKwlpZiAoKHd2X21tY19pbml0KGRldikgPCAwKSB8fCAod3ZfODI1ODZfc3RhcnQoZGV2KSA8IDApKQorCQlyZXR1cm4gLTE7CisKKwkvKiBFbmFibGUgdGhlIGNhcmQgdG8gc2VuZCBpbnRlcnJ1cHRzLiAqLworCXd2X2ludHNfb24oZGV2KTsKKworCS8qIFN0YXJ0IGNhcmQgZnVuY3Rpb25zICovCisJaWYgKHd2X2N1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXR1cCB0aGUgY29udHJvbGxlciBhbmQgcGFyYW1ldGVycyAqLworCXd2XzgyNTg2X2NvbmZpZyhkZXYpOworCisJLyogRmluaXNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgcmVjZWl2ZSB1bml0ICovCisJaWYgKHd2X3J1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBXYXZlTEFOIGF0IHRoZSBzcGVjaWZpYyBiYXNlIGFkZHJlc3MuCisgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIHJlYWRzIHRoZSBNQUMgYWRkcmVzcy4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wcm9iZSgpIGFuZCBpbml0X21vZHVsZSgpKQorICovCitzdGF0aWMgaW50IHd2X2NoZWNrX2lvYWRkcih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggKiBtYWMpCit7CisJaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCisKKwkvKiBDaGVjayBpZiB0aGUgYmFzZSBhZGRyZXNzIGlmIGF2YWlsYWJsZS4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpLCAid2F2ZWxhbiBwcm9iZSIpKQorCQlyZXR1cm4gLUVCVVNZOwkJLyogaW9hZGRyIGFscmVhZHkgdXNlZCAqLworCisJLyogUmVzZXQgaG9zdCBpbnRlcmZhY2UgKi8KKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisKKwkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhLiAqLworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX3VuaXZfbWFjX2FkZHIpLAorCQkgbWFjLCA2KTsKKworCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpKTsKKworCS8qCisJICogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgYWRkcmVzcyBmb3IgdGhlIG1hbnVmYWN0dXJlcidzIGNvZGUuCisJICogTm90ZTogaWYgdGhpcyBjYW4ndCBmaW5kIHlvdXIgV2F2ZUxBTiBjYXJkLCB5b3UndmUgZ290IGEKKwkgKiBub24tTkNSL0FUJlQvTHVjZW50IElTQSBjYXJkLiAgU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWwgb24KKwkgKiBob3cgdG8gY29uZmlndXJlIHlvdXIgY2FyZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpOyBpKyspCisJCWlmICgobWFjWzBdID09IE1BQ19BRERSRVNTRVNbaV1bMF0pICYmCisJCSAgICAobWFjWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisJCSAgICAobWFjWzJdID09IE1BQ19BRERSRVNTRVNbaV1bMl0pKQorCQkJcmV0dXJuIDA7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIldhdmVMQU4gKDB4JTNYKTogeW91ciBNQUMgYWRkcmVzcyBtaWdodCBiZSAlMDJYOiUwMlg6JTAyWC5cbiIsCisJICAgICAgIGlvYWRkciwgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSk7CisjZW5kaWYKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUlJVUFQgSEFORExJTkcgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBXYXZlTEFOIGNhcmQuIFRoaXMKKyAqIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2F2ZWxhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCW5ldF9sb2NhbCAqbHA7CisJdTE2IGhhc3I7CisJdTE2IHN0YXR1czsKKwl1MTYgYWNrX2NtZDsKKworCWRldiA9IGRldl9pZDsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKi8KKwlpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogUHJldmVudCByZWVudHJhbmN5LiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSB3ZSBtYXkgaGF2ZQorCSAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYWNxdWlyaW5nCisJICogdGhlIHNwaW5sb2NrLiAqLworCXNwaW5fbG9jaygmbHAtPnNwaW5sb2NrKTsKKworCS8qIFdlIGFsd2F5cyBoYWQgc3B1cmlvdXMgaW50ZXJydXB0cyBhdCBzdGFydHVwLCBidXQgbGF0ZWx5IEkKKwkgKiBzYXcgdGhlbSBjb21taW5nICpiZXR3ZWVuKiB0aGUgcmVxdWVzdF9pcnEoKSBhbmQgdGhlCisJICogc3Bpbl9sb2NrX2lycXNhdmUoKSBpbiB3YXZlbGFuX29wZW4oKSwgc28gdGhlIHNwaW5sb2NrCisJICogcHJvdGVjdGlvbiBpcyBubyBlbm91Z2guCisJICogU28sIHdlIGFsc28gY2hlY2sgbHAtPmhhY3IgdGhhdCB3aWxsIHRlbGwgdXMgaXMgd2UgZW5hYmxlZAorCSAqIGlycXMgb3Igbm90IChzZWUgd3ZfaW50c19vbigpKS4KKwkgKiBXZSBjYW4ndCB1c2UgbmV0aWZfcnVubmluZyhkZXYpIGJlY2F1c2Ugd2UgZGVwZW5kIG9uIHRoZQorCSAqIHByb3BlciBwcm9jZXNzaW5nIG9mIHRoZSBpcnEgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY29uZmlnLiAqLworCisJLyogV2hpY2ggaW50ZXJydXB0IGl0IGlzID8gKi8KKwloYXNyID0gaGFzcl9yZWFkKGlvYWRkcik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBoYXNyIDB4JTA0eDsgaGFjciAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGhhc3IsIGxwLT5oYWNyKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgbW9kZW0gaW50ZXJydXB0ICovCisJaWYgKChoYXNyICYgSEFTUl9NTUNfSU5UUikgJiYgKGxwLT5oYWNyICYgSEFDUl9NTUNfSU5UX0VOQUJMRSkpIHsKKwkJdTggZGNlX3N0YXR1czsKKworCQkvKgorCQkgKiBJbnRlcnJ1cHQgZnJvbSB0aGUgbW9kZW0gbWFuYWdlbWVudCBjb250cm9sbGVyLgorCQkgKiBUaGlzIHdpbGwgY2xlYXIgaXQgLS0gaWdub3JlZCBmb3Igbm93LgorCQkgKi8KKwkJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmZGNlX3N0YXR1cywKKwkJCSBzaXplb2YoZGNlX3N0YXR1cykpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogdW5leHBlY3RlZCBtbWMgaW50ZXJydXB0OiBzdGF0dXMgMHglMDR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGNlX3N0YXR1cyk7CisjZW5kaWYKKwl9CisKKwkvKiBDaGVjayBpZiBub3QgY29udHJvbGxlciBpbnRlcnJ1cHQgKi8KKwlpZiAoKChoYXNyICYgSEFTUl84MjU4Nl9JTlRSKSA9PSAwKSB8fAorCSAgICAoKGxwLT5oYWNyICYgSEFDUl84MjU4Nl9JTlRfRU5BQkxFKSA9PSAwKSkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IGludGVycnVwdCBub3QgY29taW5nIGZyb20gaTgyNTg2IC0gaGFzciAweCUwNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBoYXNyKTsKKyNlbmRpZgorCQlzcGluX3VubG9jayAoJmxwLT5zcGlubG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZWFkIGludGVycnVwdCBkYXRhLiAqLworCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qCisJICogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdChzKS4KKwkgKi8KKwlhY2tfY21kID0gc3RhdHVzICYgU0NCX1NUX0lOVDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmYWNrX2NtZCwgc2l6ZW9mKGFja19jbWQpKTsKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHN0YXR1cyAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKworCS8qIENvbW1hbmQgY29tcGxldGVkLiAqLworCWlmICgoc3RhdHVzICYgU0NCX1NUX0NYKSA9PSBTQ0JfU1RfQ1gpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBjb21tYW5kIGNvbXBsZXRlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCk7CisJfQorCisJLyogRnJhbWUgcmVjZWl2ZWQuICovCisJaWYgKChzdGF0dXMgJiBTQ0JfU1RfRlIpID09IFNDQl9TVF9GUikgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHJlY2VpdmVkIHBhY2tldC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X3JlY2VpdmUoZGV2KTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQgdW5pdC4gKi8KKwlpZiAoKChzdGF0dXMgJiBTQ0JfU1RfQ05BKSA9PSBTQ0JfU1RfQ05BKSB8fAorCSAgICAoKChzdGF0dXMgJiBTQ0JfU1RfQ1VTKSAhPSBTQ0JfU1RfQ1VTX0FDVFYpICYmCisJICAgICAobmV0aWZfcnVubmluZyhkZXYpKSkpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBDVSBpbmFjdGl2ZSAtLSByZXN0YXJ0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl3dl9od19yZXNldChkZXYpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCB1bml0LiAqLworCWlmICgoKHN0YXR1cyAmIFNDQl9TVF9STlIpID09IFNDQl9TVF9STlIpIHx8CisJICAgICgoKHN0YXR1cyAmIFNDQl9TVF9SVVMpICE9IFNDQl9TVF9SVVNfUkRZKSAmJgorCSAgICAgKG5ldGlmX3J1bm5pbmcoZGV2KSkpKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogUlUgbm90IHJlYWR5IC0tIHJlc3RhcnRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2h3X3Jlc2V0KGRldik7CisJfQorCisJLyogUmVsZWFzZSBzcGlubG9jayAqLworCXNwaW5fdW5sb2NrICgmbHAtPnNwaW5sb2NrKTsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworCW5ldF9sb2NhbCAqCWxwID0gKG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1X2xvbmcJCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CW5yZWFwZWQ7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwlwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgdGhhdCB3ZSBjYW1lIGhlcmUgZm9yIHNvbWV0aGluZyAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkgeworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogVHJ5IHRvIHNlZSBpZiBzb21lIGJ1ZmZlcnMgYXJlIG5vdCBmcmVlIChpbiBjYXNlIHdlIG1pc3NlZAorCSAqIGFuIGludGVycnVwdCAqLworCW5yZWFwZWQgPSB3dl9jb21wbGV0ZShkZXYsIGlvYWRkciwgbHApOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogJWQgcmVhcGVkLCAlZCByZW1haW4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5yZWFwZWQsIGxwLT50eF9uX2luX3VzZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisJeworCQlwc2FfdCBwc2E7CisJCXBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCQl3dl9wc2Ffc2hvdygmcHNhKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBERUJVR19NTUNfU0hPVworCXd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworCXd2X2N1X3Nob3coZGV2KTsKKyNlbmRpZgorCisJLyogSWYgbm8gYnVmZmVyIGhhcyBiZWVuIGZyZWVkICovCisJaWYgKG5yZWFwZWQgPT0gMCkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogY2xlYW51cCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfaHdfcmVzZXQoZGV2KTsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBzb21lIGZyZWUgVHggYnVmZmVyIDstKSAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPCBOVFhCTE9DS1MgLSAxKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEhlcmUgYXJlIHRoZSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBMaW51eCBuZXR3b3JraW5nIGNvZGUgKE5FVDMpCisgKiBmb3IgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyYXRpb24gYW5kIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgCisgKiBXYXZlTEFOIElTQSBoYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJlIGFuZCBzdGFydCB1cCB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgIm9wZW5zIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKglscCA9IChuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fb3BlbihkZXY9MHgleClcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCisJLyogQ2hlY2sgaXJxICovCisJaWYgKGRldi0+aXJxID09IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhdmVsYW5fb3BlbigpOiBubyBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmd2F2ZWxhbl9pbnRlcnJ1cHQsIDAsICJXYXZlTEFOIiwgZGV2KSAhPSAwKSAKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXZlbGFuX29wZW4oKTogaW52YWxpZCBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlpZiAod3ZfaHdfcmVzZXQoZGV2KSAhPSAtMSkgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fb3BlbigpOiBpbXBvc3NpYmxlIHRvIHN0YXJ0IHRoZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fb3BlbigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0IGRvd24gdGhlIFdhdmVMQU4gSVNBIGNhcmQuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJjbG9zZXMiIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3dl84MjU4Nl9zdG9wKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJvYmUgYW4gSS9PIGFkZHJlc3MsIGFuZCBpZiB0aGUgV2F2ZUxBTiBpcyB0aGVyZSBjb25maWd1cmUgdGhlCisgKiBkZXZpY2Ugc3RydWN0dXJlCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fcHJvYmUoKSBhbmQgdmlhIGluaXRfbW9kdWxlKCkpLgorICovCitzdGF0aWMgaW50IF9faW5pdCB3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBpb2FkZHIpCit7CisJdTggaXJxX21hc2s7CisJaW50IGlycTsKKwluZXRfbG9jYWwgKmxwOworCW1hY19hZGRyIG1hYzsKKwlpbnQgZXJyOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSwgIndhdmVsYW4iKSkKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCisJZXJyID0gd3ZfY2hlY2tfaW9hZGRyKGlvYWRkciwgbWFjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMsIDYpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2NvbmZpZyhkZXY9MHgleCwgaW9hZGRyPTB4JWx4KVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KSBkZXYsIGlvYWRkcik7CisjZW5kaWYKKworCS8qIENoZWNrIElSUSBhcmd1bWVudCBvbiBjb21tYW5kIGxpbmUuICovCisJaWYgKGRldi0+aXJxICE9IDApIHsKKwkJaXJxX21hc2sgPSB3dl9pcnFfdG9fcHNhKGRldi0+aXJxKTsKKworCQlpZiAoaXJxX21hc2sgPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogd2F2ZWxhbl9jb25maWcoKTogaW52YWxpZCBJUlEgJWQgaWdub3JlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisjZW5kaWYKKwkJCWRldi0+aXJxID0gMDsKKwkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNoYW5naW5nIElSUSB0byAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKyNlbmRpZgorCQkJcHNhX3dyaXRlKGlvYWRkciwgSEFDUl9ERUZBVUxULAorCQkJCSAgcHNhb2ZmKDAsIHBzYV9pbnRfcmVxX25vKSwgJmlycV9tYXNrLCAxKTsKKwkJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgSEFDUl9ERUZBVUxUKTsKKwkJCXd2X2hhY3JfcmVzZXQoaW9hZGRyKTsKKwkJfQorCX0KKworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX2ludF9yZXFfbm8pLAorCQkgJmlycV9tYXNrLCAxKTsKKwlpZiAoKGlycSA9IHd2X3BzYV90b19pcnEoaXJxX21hc2spKSA9PSAtMSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNvdWxkIG5vdCB3YXZlbGFuX21hcF9pcnEoJWQpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaXJxX21hc2spOworI2VuZGlmCisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+aXJxID0gaXJxOworCisJZGV2LT5tZW1fc3RhcnQgPSAweDAwMDA7CisJZGV2LT5tZW1fZW5kID0gMHgwMDAwOworCWRldi0+aWZfcG9ydCA9IDA7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBzdHJ1Y3R1cmVzICovCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKG5ldF9sb2NhbCkpOworCWxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwkvKiBCYWNrIGxpbmsgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPmRldiA9IGRldjsKKwkvKiBBZGQgdGhlIGRldmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rZWQgbGlzdC4gKi8KKwlscC0+bmV4dCA9IHdhdmVsYW5fbGlzdDsKKwl3YXZlbGFuX2xpc3QgPSBscDsKKworCWxwLT5oYWNyID0gSEFDUl9ERUZBVUxUOworCisJLyogTXVsdGljYXN0IHN0dWZmICovCisJbHAtPnByb21pc2N1b3VzID0gMDsKKwlscC0+bWNfY291bnQgPSAwOworCisJLyogSW5pdCBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZscC0+c3BpbmxvY2spOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IHdhdmVsYW5fb3BlbjsKKwlkZXYtPnN0b3AgPSB3YXZlbGFuX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gd2F2ZWxhbl9wYWNrZXRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHdhdmVsYW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gJndhdmVsYW5fd2F0Y2hkb2c7CisgICAgICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JPSBXQVRDSERPR19KSUZGSUVTOworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJndhdmVsYW5fc2V0X21hY19hZGRyZXNzOworI2VuZGlmCQkJCS8qIFNFVF9NQUNfQUREUkVTUyAqLworCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3RzIGluIHRoZSBrZXJuZWwgKi8KKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJndhdmVsYW5faGFuZGxlcl9kZWY7CisJbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZgorCisJZGV2LT5tdHUgPSBXQVZFTEFOX01UVTsKKworCS8qIERpc3BsYXkgbmljZSBpbmZvcm1hdGlvbi4gKi8KKwl3dl9pbml0X2luZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSk7CisJcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUuICBSZXR1cm4gJzAnIGlmZiBvbmUgCisgKiBleGlzdHMuICBUaGVyZSBzZWVtIHRvIGJlIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbnMgb2YKKyAqIHRoZSBpbml0aWFsIHZhbHVlIG9mIGRldi0+YmFzZV9hZGRyLgorICogV2UgZm9sbG93IHRoZSBleGFtcGxlIGluIGRyaXZlcnMvbmV0L25lLmMuCisgKiAoY2FsbGVkIGluICJTcGFjZS5jIikKKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNob3J0IGJhc2VfYWRkcjsKKwlpbnQgZGVmX2lycTsKKwlpbnQgaTsKKwlpbnQgciA9IDA7CisKKyNpZmRlZglTVFJVQ1RfQ0hFQ0sKKwlpZiAod3Zfc3RydWN0X2NoZWNrKCkgIT0gKGNoYXIgKikgTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHdhdmVsYW5fcHJvYmUoKTogc3RydWN0dXJlL2NvbXBpbGVyIGJvdGNoOiBcIiVzXCJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHd2X3N0cnVjdF9jaGVjaygpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2VuZGlmCQkJCS8qIFNUUlVDVF9DSEVDSyAqLworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWRlZl9pcnEgPSBkZXYtPmlycTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiAtPndhdmVsYW5fcHJvYmUoZGV2PSVwIChiYXNlX2FkZHI9MHgleCkpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldiwgKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKwkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJaWYgKGJhc2VfYWRkciA8IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiB3YXZlbGFuX3Byb2JlKCk6IGludmFsaWQgYmFzZSBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyID0gLUVOWElPOworCX0gZWxzZSBpZiAoYmFzZV9hZGRyID4gMHgxMDApIHsgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyID0gd2F2ZWxhbl9jb25maWcoZGV2LCBiYXNlX2FkZHIpOworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCWlmIChyICE9IDApCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd2F2ZWxhbl9wcm9iZSgpOiBubyBkZXZpY2UgYXQgc3BlY2lmaWVkIGJhc2UgYWRkcmVzcyAoMHglWCkgb3IgYWRkcmVzcyBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGJhc2VfYWRkcik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3Byb2JlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9IGVsc2UgeyAvKiBTY2FuIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgb2YgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykgeworCQkJZGV2LT5pcnEgPSBkZWZfaXJxOworCQkJaWYgKHdhdmVsYW5fY29uZmlnKGRldiwgaW9iYXNlW2ldKSA9PSAwKSB7CisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IDwtd2F2ZWxhbl9wcm9iZSgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gTkVMUyhpb2Jhc2UpKQorCQkJciA9IC1FTk9ERVY7CisJfQorCWlmIChyKSAKKwkJZ290byBvdXQ7CisJciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIHNpemVvZihoYV90KSk7CisJd2F2ZWxhbl9saXN0ID0gd2F2ZWxhbl9saXN0LT5uZXh0Oworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTU9EVUxFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNb2R1bGUgZW50cnkgcG9pbnQ6IGluc2VydGlvbiBhbmQgcmVtb3ZhbAorICovCisKKyNpZmRlZglNT0RVTEUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBJbnNlcnRpb24gb2YgdGhlIG1vZHVsZQorICogSSdtIG5vdyBxdWl0ZSBwcm91ZCBvZiB0aGUgbXVsdGktZGV2aWNlIHN1cHBvcnQuCisgKi8KK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQgPSAtRUlPOwkJLyogUmV0dXJuIGVycm9yIGlmIG5vIGNhcmRzIGZvdW5kICovCisJaW50IGk7CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiLT4gaW5pdF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCS8qIElmIHByb2JpbmcgaXMgYXNrZWQgKi8KKwlpZiAoaW9bMF0gPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2F2ZUxBTiBpbml0X21vZHVsZSgpOiBkb2luZyBkZXZpY2UgcHJvYmluZyAoYmFkICEpXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwZWNpZnkgYmFzZSBhZGRyZXNzZXMgd2hpbGUgbG9hZGluZyBtb2R1bGUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbVxuIik7CisjZW5kaWYKKworCQkvKiBDb3B5IHRoZSBiYXNpYyBzZXQgb2YgYWRkcmVzcyB0byBiZSBwcm9iZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykKKwkJCWlvW2ldID0gaW9iYXNlW2ldOworCX0KKworCisJLyogTG9vcCBvbiBhbGwgcG9zc2libGUgYmFzZSBhZGRyZXNzZXMuICovCisJaSA9IC0xOworCXdoaWxlICgoaW9bKytpXSAhPSAwKSAmJiAoaSA8IE5FTFMoaW8pKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlpZiAobmFtZVtpXSkKKwkJCXN0cmNweShkZXYtPm5hbWUsIG5hbWVbaV0pOwkvKiBDb3B5IG5hbWUgKi8KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1tpXTsKKwkJZGV2LT5pcnEgPSBpcnFbaV07CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGF0IHRoaXMgYmFzZSBhZGRyZXNzLiAqLworCQlpZiAod2F2ZWxhbl9jb25maWcoZGV2LCBpb1tpXSkgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgc2l6ZW9mKGhhX3QpKTsKKwkJCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoIXdhdmVsYW5fbGlzdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhdmVMQU4gaW5pdF9tb2R1bGUoKTogbm8gZGV2aWNlIGZvdW5kXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIjwtIGluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlbW92YWwgb2YgdGhlIG1vZHVsZQorICovCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIi0+IGNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwkvKiBMb29wIG9uIGFsbCBkZXZpY2VzIGFuZCByZWxlYXNlIHRoZW0uICovCisJd2hpbGUgKHdhdmVsYW5fbGlzdCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2F2ZWxhbl9saXN0LT5kZXY7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBjbGVhbnVwX21vZHVsZSgpOiByZW1vdmluZyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBzaXplb2YoaGFfdCkpOworCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0gY2xlYW51cF9tb2R1bGUoKVxuIik7CisjZW5kaWYKK30KKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKSwKKyAqCUxvZWtlIEJyZWRlcnZlbGQgKExvZWtlLkJyZWRlcnZlbGRAVXRyZWNodC5OQ1IuY29tKSwKKyAqCUFuZGVycyBLbGVtZXRzIChrbGVtZXRzQGl0Lmt0aC5zZSksCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiAod0BzdGllci5rb2VuaWcucnUpLAorICoJTWFyYyBNZWVydGVucyAoTWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20pLAorICoJUGF1bGluZSBNaWRkZWxpbmsgKG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubCksCisgKglSb2JlcnQgTW9ycmlzIChydG1AZGFzLmhhcnZhcmQuZWR1KSwKKyAqCUplYW4gVG91cnJpbGhlcyAoanRAaHBsYi5ocGwuaHAuY29tKSwKKyAqCUdpcmlzaCBXZWxsaW5nICh3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHUpLAorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWxhbiBDb3ggKGFsYW5AcmVkaGF0LmNvbSksCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy51c3lkLmVkdS5hdSksCisgKglNYXR0aGV3IEdlaWVyIChtYXR0aGV3QGNzLnVzeWQuZWR1LmF1KSwKKyAqCVJlbW8gZGkgR2lvdmFubmkgKHJlbW9AY3MudXN5ZC5lZHUuYXUpLAorICoJRWNraGFyZCBHcmFoIChncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlKSwKKyAqCVZpcHVsIEd1cHRhICh2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHUpLAorICoJTWFyayBIYWdhbiAobWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTSksCisgKglUaW0gTmljaG9sc29uICh0aW1AY3MudXN5ZC5lZHUuYXUpLAorICoJSWFuIFBhcmtpbiAoaWFuQGNzLnVzeWQuZWR1LmF1KSwKKyAqCUpvaG4gUm9zZW5iZXJnIChqb2huckBjcy51c3lkLmVkdS5hdSksCisgKglHZW9yZ2UgUm9zc2kgKGdlb3JnZUBwaG0uZ292LmF1KSwKKyAqCUFydGh1ciBTY290dCAoYXJ0aHVyQGNzLnVzeWQuZWR1LmF1KSwKKyAqCVBldGVyIFN0b3JleSwKKyAqIGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIHVwZGF0ZXMsIGNvbW1lbnRzIHRvOgorICoKKyAqIEJydWNlIEphbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYWlsOiAgYnJ1Y2VAY3MudXN5ZC5lZHUuYXUKKyAqIEJhc3NlciBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgICAgICAgICAgIFBob25lOiAgKzYxLTItOTM1MS0zNDIzCisgKiBVbml2ZXJzaXR5IG9mIFN5ZG5leSwgTi5TLlcuLCAyMDA2LCBBVVNUUkFMSUEgICBGYXg6ICAgICs2MS0yLTkzNTEtMzgzOAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNzJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uaApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cy4gU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4gTm90ZSB0aGF0CisgKiB0aGUgV2F2ZUxBTiBJU0EgaW5jbHVkZXMgYSBpODI1ODYgY29udHJvbGxlciAoc2VlIGRlZmluaXRpb25zIGluCisgKiBmaWxlIGk4MjU4Ni5oKS4KKyAqCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIElTQSBoYXJkd2FyZSBhbmQgdGhlIFBDTUNJQSBvbmUgaXMKKyAqIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyIChpODI1ODYgaW5zdGVhZCBvZiBpODI1OTMpLgorICogVGhlIGk4MjU4NiBhbGxvd3MgbXVsdGlwbGUgdHJhbnNtaXQgYnVmZmVycy4gIFRoZSBQU0EgbmVlZHMgdG8gYmUgYWNjZXNzZWQKKyAqIHRocm91Z2ggdGhlIGhvc3QgaW50ZXJmYWNlLgorICovCisKKyNpZm5kZWYgX1dBVkVMQU5fSAorI2RlZmluZQlfV0FWRUxBTl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUdJQyBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGV0ZWN0aW9uIG9mIHRoZSBXYXZlTEFOIGNhcmQgaXMgZG9uZSBieSByZWFkaW5nIHRoZSBNQUMKKyAqIGFkZHJlc3MgZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuICBJZiB5b3UgaGF2ZSBhIG5vbi1BVCZUCisgKiBwcm9kdWN0IChPRU0sIGxpa2UgREVDIFJvYW1BYm91dCwgRGlnaXRhbCBPY2Vhbiwgb3IgRXBzb24pLAorICogeW91IG1pZ2h0IG5lZWQgdG8gbW9kaWZ5IHRoaXMgcGFydCB0byBhY2NvbW1vZGF0ZSB5b3VyIGhhcmR3YXJlLgorICovCitzdGF0aWMgY29uc3QgY2hhcglNQUNfQUREUkVTU0VTW11bM10gPQoreworICB7IDB4MDgsIDB4MDAsIDB4MEUgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoc3RhbmRhcmQpICYgREVDIFJvYW1BYm91dCAqLworICB7IDB4MDgsIDB4MDAsIDB4NkEgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoYWx0ZXJuYXRlKSAqLworICB7IDB4MDAsIDB4MDAsIDB4RTEgfSwJCS8qIEhpdGFjaGkgV2F2ZWxhbiAqLworICB7IDB4MDAsIDB4NjAsIDB4MUQgfQkJLyogTHVjZW50IFdhdmVsYW4gKGFub3RoZXIgb25lKSAqLworICAvKiBBZGQgeW91ciBjYXJkIGhlcmUgYW5kIHNlbmQgbWUgdGhlIHBhdGNoISAqLworfTsKKworI2RlZmluZSBXQVZFTEFOX0FERFJfU0laRQk2CS8qIFNpemUgb2YgYSBNQUMgYWRkcmVzcyAqLworCisjZGVmaW5lIFdBVkVMQU5fTVRVCQkxNTAwCS8qIE1heGltdW0gc2l6ZSBvZiBXYXZlTEFOIHBhY2tldCAqLworCisjZGVmaW5lCU1BWERBVEFaCQkoV0FWRUxBTl9BRERSX1NJWkUgKyBXQVZFTEFOX0FERFJfU0laRSArIDIgKyBXQVZFTEFOX01UVSkKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGNvbnN0IHNob3J0CWNoYW5uZWxfYmFuZHNbXSA9IHsgMHgzMCwgMHg1OCwgMHg2NCwgMHg3QSwgMHg4MCwgMHhBOCwKKwkJCQkgICAgMHhEMCwgMHhGMCwgMHhGOCwgMHgxNTAgfTsKKworLyogRnJlcXVlbmNpZXMgb2YgdGhlIDEuMCBtb2RlbSAoZml4ZWQgZnJlcXVlbmNpZXMpLgorICogVXNlIHRvIG1hcCB0aGUgUFNBIGBzdWJiYW5kJyB0byBhIGZyZXF1ZW5jeQorICogTm90ZSA6IGFsbCBmcmVxdWVuY2llcyBhcGFydCBmcm9tIHRoZSBmaXJzdCBvbmUgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IDEwCisgKi8KK3N0YXRpYyBjb25zdCBpbnQJZml4ZWRfYmFuZHNbXSA9IHsgOTE1ZTYsIDIuNDI1ZTgsIDIuNDZlOCwgMi40ODRlOCwgMi40MzA1ZTggfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUEMgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIb3N0IEFkYXB0b3Igc3RydWN0dXJlLgorICogKGJhc2UgaXMgYm9hcmQgcG9ydCBhZGRyZXNzKS4KKyAqLwordHlwZWRlZiB1bmlvbiBoYWNzX3UJaGFjc191OwordW5pb24gaGFjc191Cit7CisJdW5zaWduZWQgc2hvcnQJaHVfY29tbWFuZDsJCS8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBQ1JfUkVTRVQJCTB4MDAwMQkvKiBSZXNldCBib2FyZCAqLworI2RlZmluZQkJSEFDUl9DQQkJCTB4MDAwMgkvKiBTZXQgQ2hhbm5lbCBBdHRlbnRpb24gZm9yIDgyNTg2ICovCisjZGVmaW5lCQlIQUNSXzE2QklUUwkJMHgwMDA0CS8qIDE2LWJpdCBvcGVyYXRpb24gKDAgPT4gOGJpdHMpICovCisjZGVmaW5lCQlIQUNSX09VVDAJCTB4MDAwOAkvKiBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0IHBpbiAwICovCisJCQkJCQkvKiBub3QgdXNlZCAtIG11c3QgYmUgMSAqLworI2RlZmluZQkJSEFDUl9PVVQxCQkweDAwMTAJLyogR2VuZXJhbCBwdXJwb3NlIG91dHB1dCBwaW4gMSAqLworCQkJCQkJLyogbm90IHVzZWQgLSBtdXN0IGJlIDEgKi8KKyNkZWZpbmUJCUhBQ1JfODI1ODZfSU5UX0VOQUJMRQkweDAwMjAJLyogRW5hYmxlIDgyNTg2IGludGVycnVwdHMgKi8KKyNkZWZpbmUJCUhBQ1JfTU1DX0lOVF9FTkFCTEUJMHgwMDQwCS8qIEVuYWJsZSBNTUMgaW50ZXJydXB0cyAqLworI2RlZmluZQkJSEFDUl9JTlRSX0NMUl9FTkFCTEUJMHgwMDgwCS8qIEVuYWJsZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQvY2xlYXIgKi8KKwl1bnNpZ25lZCBzaG9ydAlodV9zdGF0dXM7CQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBU1JfODI1ODZfSU5UUgkJMHgwMDAxCS8qIEludGVycnVwdCByZXF1ZXN0IGZyb20gODI1ODYgKi8KKyNkZWZpbmUJCUhBU1JfTU1DX0lOVFIJCTB4MDAwMgkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBmcm9tIE1NQyAqLworI2RlZmluZQkJSEFTUl9NTUNfQlVTWQkJMHgwMDA0CS8qIE1NQyBidXN5IGluZGljYXRpb24gKi8KKyNkZWZpbmUJCUhBU1JfUFNBX0JVU1kJCTB4MDAwOAkvKiBMQU4gcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYSBidXN5ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBoYV90CWhhX3Q7CitzdHJ1Y3QgaGFfdAoreworCWhhY3NfdQkJaGFfY3M7CQkvKiBDb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIAkJaGFfY29tbWFuZAloYV9jcy5odV9jb21tYW5kCisjZGVmaW5lIAkJaGFfc3RhdHVzCWhhX2NzLmh1X3N0YXR1cworCXVuc2lnbmVkIHNob3J0CWhhX21tY3I7CS8qIE1vZGVtIE1hbmFnZW1lbnQgQ3RybCBSZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3IwOwkvKiBQcm9ncmFtIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIFBvcnQgMCAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3AwOwkvKiBQcm9ncmFtIEkvTyBQb3J0IDAgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9yMTsJLyogUHJvZ3JhbSBJL08gQWRkcmVzcyBSZWdpc3RlciBQb3J0IDEgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9wMTsJLyogUHJvZ3JhbSBJL08gUG9ydCAxICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcjI7CS8qIFByb2dyYW0gSS9PIEFkZHJlc3MgUmVnaXN0ZXIgUG9ydCAyICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcDI7CS8qIFByb2dyYW0gSS9PIFBvcnQgMiAqLworfTsKKworI2RlZmluZSBIQV9TSVpFCQkxNgorCisjZGVmaW5lCWhvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChoYV90ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKyNkZWZpbmUJSEFDUihwKQkJaG9mZihwLCBoYV9jb21tYW5kKQorI2RlZmluZQlIQVNSKHApCQlob2ZmKHAsIGhhX3N0YXR1cykKKyNkZWZpbmUJTU1DUihwKQkJaG9mZihwLCBoYV9tbWNyKQorI2RlZmluZQlQSU9SMChwKQlob2ZmKHAsIGhhX3Bpb3IwKQorI2RlZmluZQlQSU9QMChwKQlob2ZmKHAsIGhhX3Bpb3AwKQorI2RlZmluZQlQSU9SMShwKQlob2ZmKHAsIGhhX3Bpb3IxKQorI2RlZmluZQlQSU9QMShwKQlob2ZmKHAsIGhhX3Bpb3AxKQorI2RlZmluZQlQSU9SMihwKQlob2ZmKHAsIGhhX3Bpb3IyKQorI2RlZmluZQlQSU9QMihwKQlob2ZmKHAsIGhhX3Bpb3AyKQorCisvKgorICogUHJvZ3JhbSBJL08gTW9kZSBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU1RBVElDX1BJTwkJMAkvKiBNb2RlIDE6IHN0YXRpYyBtb2RlICovCisJCQkJCS8qIFJBTSBhY2Nlc3MgPz8/ICovCisjZGVmaW5lIEFVVE9JTkNSX1BJTwkJMQkvKiBNb2RlIDI6IGF1dG8gaW5jcmVtZW50IG1vZGUgKi8KKwkJCQkJLyogUkFNIGFjY2VzcyA/Pz8gKi8KKyNkZWZpbmUgQVVUT0RFQ1JfUElPCQkyCS8qIE1vZGUgMzogYXV0byBkZWNyZW1lbnQgbW9kZSAqLworCQkJCQkvKiBSQU0gYWNjZXNzID8/PyAqLworI2RlZmluZSBQQVJBTV9BQ0NFU1NfUElPCTMJLyogTW9kZSA0OiBMQU4gcGFyYW1ldGVyIGFjY2VzcyBtb2RlICovCisJCQkJCS8qIFBhcmFtZXRlciBhY2Nlc3MuICovCisjZGVmaW5lIFBJT19NQVNLCQkzCS8qIHJlZ2lzdGVyIG1hc2sgKi8KKyNkZWZpbmUgUElPTShjbWQscGlvbm8pCQkoKHVfc2hvcnQpY21kIDw8IDEwIDw8IChwaW9ubyAqIDIpKQorCisjZGVmaW5lCUhBQ1JfREVGQVVMVAkJKEhBQ1JfT1VUMCB8IEhBQ1JfT1VUMSB8IEhBQ1JfMTZCSVRTIHwgUElPTShTVEFUSUNfUElPLCAwKSB8IFBJT00oQVVUT0lOQ1JfUElPLCAxKSB8IFBJT00oUEFSQU1fQUNDRVNTX1BJTywgMikpCisjZGVmaW5lCUhBQ1JfSU5UUk9OCQkoSEFDUl84MjU4Nl9JTlRfRU5BQkxFIHwgSEFDUl9NTUNfSU5UX0VOQUJMRSB8IEhBQ1JfSU5UUl9DTFJfRU5BQkxFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogTUVNT1JZIExBWU9VVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE9uYm9hcmQgNjQgayBSQU0gbGF5b3V0LgorICogKE9mZnNldHMgZnJvbSAweDAwMDAuKQorICovCisjZGVmaW5lIE9GRlNFVF9SVQkJMHgwMDAwCQkvKiA3NSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9DVQkJMHhDMDAwCQkvKiAyNSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9TQ0IJCShPRkZTRVRfSVNDUCAtIHNpemVvZihzY2JfdCkpCisjZGVmaW5lIE9GRlNFVF9JU0NQCQkoT0ZGU0VUX1NDUCAtIHNpemVvZihpc2NwX3QpKQorI2RlZmluZSBPRkZTRVRfU0NQCQlJODI1ODZfU0NQX0FERFIKKworI2RlZmluZQlSWEJMT0NLWgkJKHNpemVvZihmZF90KSArIHNpemVvZihyYmRfdCkgKyBNQVhEQVRBWikKKyNkZWZpbmUJVFhCTE9DS1oJCShzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpICsgc2l6ZW9mKHRiZF90KSArIE1BWERBVEFaKQorCisjZGVmaW5lCU5SWEJMT0NLUwkJKChPRkZTRVRfQ1UgLSBPRkZTRVRfUlUpIC8gUlhCTE9DS1opCisjZGVmaW5lCU5UWEJMT0NLUwkJKChPRkZTRVRfU0NCIC0gT0ZGU0VUX0NVKSAvIFRYQkxPQ0taKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMTsJLyogWzB4MDBdIEJhc2UgYWRkcmVzcyAxID8/PyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMjsJLyogWzB4MDFdIEJhc2UgYWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8zOwkvKiBbMHgwMl0gQmFzZSBhZGRyZXNzIDMgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzQ7CS8qIFsweDAzXSBCYXNlIGFkZHJlc3MgNCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzE7CS8qIFsweDA0XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDEgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8yOwkvKiBbMHgwNV0gUmVtb3RlIEJvb3QgQWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMzsJLyogWzB4MDZdIFJlbW90ZSBCb290IEFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ob2xpX3BhcmFtczsJLyogWzB4MDddIEhPc3QgTGFuIEludGVyZmFjZSAoSE9MSSkgUGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pbnRfcmVxX25vOwkJLyogWzB4MDhdIEludGVycnVwdCBSZXF1ZXN0IExpbmUgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW51c2VkMFs3XTsJCS8qIFsweDA5LTB4MEZdIHVudXNlZCAqLworCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxMC0weDE1XSBVbml2ZXJzYWwgKGZhY3RvcnkpIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2xvY2FsX21hY19hZGRyW1dBVkVMQU5fQUREUl9TSVpFXTsJLyogWzB4MTYtMUJdIExvY2FsIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbG9jYWxfc2VsOwkvKiBbMHgxQ10gVW5pdmVyc2FsIExvY2FsIFNlbGVjdGlvbiAqLworI2RlZmluZQkJUFNBX1VOSVZFUlNBTAkwCQkvKiBVbml2ZXJzYWwgKGZhY3RvcnkpICovCisjZGVmaW5lCQlQU0FfTE9DQUwJMQkJLyogTG9jYWwgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29tcF9udW1iZXI7CS8qIFsweDFEXSBDb21wYXRpYmlsaXR5IE51bWJlcjoJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF85MTUJMCAJLyogUEMtQVQgOTE1IE1IeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19NQ185MTUJMSAJLyogUEMtTUMgOTE1IE1IegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX0FUXzI0MDAJMiAJLyogUEMtQVQgMi40IEdIegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ01DSUFfOTE1CTQgCS8qIFBDTUNJQSA5MTUgTUh6IG9yIDIuMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV90aHJfcHJlX3NldDsJLyogWzB4MUVdIE1vZGVtIFRocmVzaG9sZCBQcmVzZXQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZmVhdHVyZV9zZWxlY3Q7CS8qIFsweDFGXSBDYWxsIGNvZGUgcmVxdWlyZWQgKDE9b24pICovCisjZGVmaW5lCQlQU0FfRkVBVFVSRV9DQUxMX0NPREUJMHgwMSAJLyogQ2FsbCBjb2RlIHJlcXVpcmVkIChKYXBhbikgKi8KKyAgdW5zaWduZWQgY2hhcglwc2Ffc3ViYmFuZDsJCS8qIFsweDIwXSBTdWJiYW5kCSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzkxNQkJMAkvKiA5MTUgTUh6IG9yIDIuMCAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQyNQkxCS8qIDI0MjUgTUh6CSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkgICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDg0CTMJLyogMjQ4NCBNSHoJICAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQzMF81CTQJLyogMjQzMC41IE1IegkgICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ICg/KSAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24vT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbi9PZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKyNkZWZpbmUJUFNBX1NJWkUJNjQKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCisgKiBXYXJuaW5nOiAgb25seSBldmVuIGFkZHJlc3NlcyBhcmUgdXNlZC4gKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIEVuYWJsZSBvciBkaXNhYmxlIGVuY3J5cHRpb24uICovCisjZGVmaW5lCU1NV19FTkNSX0VOQUJMRV9NT0RFCTB4MDIJLyogbW9kZSBvZiBzZWN1cml0eSBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX0VOCTB4MDEJLyogRW5hYmxlIHNlY3VyaXR5IG9wdGlvbi4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZXNfaW9faW52ZXJ0OwkvKiBlbmNyeXB0aW9uIG9wdGlvbiAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9SRVMJMHgwRgkvKiByZXNlcnZlZCAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9DVFJMCTB4RjAJLyogY29udHJvbCAoPykgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2xvb3B0X3NlbDsJCS8qIGxvb3B0ZXN0IHNlbGVjdGlvbiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0RJU19OV0lECTB4NDAJLyogRGlzYWJsZSBOV0lEIGZpbHRlcmluZy4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBBY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdC4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MUwkweDEwCS8qIGxvb3B0ZXN0LCBubyBjb2xsaXNpb24gYXZvaWRhbmNlICovCisjZGVmaW5lIE1NV19MT09QVF9TRUxfTFQzQQkweDA4CS8qIGxvb3B0ZXN0IDNhICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQgkweDA0CS8qIGxvb3B0ZXN0IDNiICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQwkweDAyCS8qIGxvb3B0ZXN0IDNjICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzRAkweDAxCS8qIGxvb3B0ZXN0IDNkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phYmJlcl9lbmFibGU7CS8qIGphYmJlciB0aW1lciBlbmFibGUgKi8KKyAgLyogQWJvcnQgdHJhbnNtaXNzaW9ucyA+IDIwMCBtcyAqLworICB1bnNpZ25lZCBjaGFyCW1td19mcmVlemU7CQkvKiBmcmVlemUgb3IgdW5mcmVlemUgc2lnbmFsIGxldmVsICovCisgIC8qIDAgOiBzaWduYWwgbGV2ZWwgJiBxdWFsIHVwZGF0ZWQgZm9yIGV2ZXJ5IG5ldyBtZXNzYWdlLCAxIDogZnJvemVuICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2FudGVuX3NlbDsJCS8qIGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lIE1NV19BTlRFTl9TRUxfU0VMCTB4MDEJLyogZGlyZWN0IGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lCU1NV19BTlRFTl9TRUxfQUxHX0VOCTB4MDIJLyogYW50ZW5uYSBzZWxlY3Rpb24gYWxnby4gZW5hYmxlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2lmczsJCS8qIGludGVyIGZyYW1lIHNwYWNpbmcgKi8KKyAgLyogbWluIHRpbWUgYmV0d2VlbiB0cmFuc21pc3Npb24gaW4gYml0IHBlcmlvZHMgKC41IHVzKSAtIGJpdCAwIGlnbm9yZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kX2RlbGF5OwkgCS8qIG1vZGVtIGRlbGF5IChzeW5jaHJvKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19qYW1fdGltZTsJCS8qIGphbW1pbmcgdGltZSAoYWZ0ZXIgY29sbGlzaW9uKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQyWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHNpZ25hbCA8IHRoaXMgdmFsdWUgKDQpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2RlY2F5X3BybTsJCS8qIGRlY2F5IHBhcmFtZXRlcnMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfdXBkYXRfcHJtOwkvKiBkZWNheSB1cGRhdGUgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19xdWFsaXR5X3RocjsJLyogcXVhbGl0eSAoei1xdW90aWVudCkgdGhyZXNob2xkICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHF1YWxpdHkgPCB0aGlzIHZhbHVlICgzKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19uZXR3X2lkX2w7CQkvKiBOV0lEIGxvdyBvcmRlciBieXRlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfaDsJCS8qIE5XSUQgaGlnaCBvcmRlciBieXRlICovCisgIC8qIE5ldHdvcmsgSUQgb3IgRG9tYWluIDogY3JlYXRlIHZpcnR1YWwgbmV0IG9uIHRoZSBhaXIgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X21vZGVfc2VsZWN0OwkvKiBmb3IgYW5hbG9nIHRlc3RzIChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkM1sxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfY3RybDsJCS8qIGZyZXF1ZW5jeSBFRVBST00gY29udHJvbCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJFCTB4MTAJLyogRW5hYmxlIHByb3RlY3RlZCBpbnN0cnVjdGlvbnMuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9EV0xECTB4MDgJLyogRG93bmxvYWQgRUVQUk9NIHRvIG1tYy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFUFJPTSBjb21tYW5kczogICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUkFMTAkweDA0CS8qIFdyaXRlIGRhdGEgdG8gYWxsIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dEUwkweDA0CS8qIFdyaXRlIGRpc2FibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSUkVBRAkweDE2CS8qIFJlYWQgYWRkciBmcm9tIHByb3RlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSRU4JMHgxNAkvKiBQcm90ZWN0IHJlZ2lzdGVyIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJDTEVBUgkweDE3CS8qIFVucHJvdGVjdCBhbGwgcmVnaXN0ZXJzLiAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHJlc3MgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGUgUFJEUyBjb21tYW5kOiAgaXQncyBpcnJldmVyc2libGUhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRVBST00gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbC4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX09GRlNFVAkweDBGCS8qIE9mZnNldCBpbiBjaGFubmVsIGRhdGEgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0VOCQkweEMwCS8qIEZFRV9DVFJMIGVuYWJsZSBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9EUwkJMHgwMAkvKiBGRUVfQ1RSTCBkaXNhYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0FMTAkweDQwCS8qIEZFRV9DVFJMIGFsbCBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9DTEVBUgkweEZGCS8qIEZFRV9DVFJMIGNsZWFyIG9wZXJhdGlvbnMgKi8KKworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9sOwkJLyogV3JpdGUgZGF0YSB0byBFRVBST00uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2g7CQkvKiBoaWdoIG9jdGV0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2V4dF9hbnQ7CQkvKiBTZXR0aW5nIGZvciBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEFOVAkweDAxCS8qIFNlbGVjdCBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX1BPTAkJMHgwMgkvKiBQb2xhcml0eSBvZiB0aGUgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JTlRFUk5BTAkweDAwCS8qIEludGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfRVhURVJOQUwJMHgwMwkvKiBFeHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0lRX1RFU1QJMHgxQwkvKiBJUSB0ZXN0IHBhdHRlcm4gKHNldCB0byAwKSAqLworfTsKKworI2RlZmluZQlNTVdfU0laRQkzNworCisjZGVmaW5lCW1td29mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKG1td190ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIElEIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9oOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChoaWdoKSAqLworICAvKiBXYXJuaW5nOiAgcmVhZCBoaWdoLW9yZGVyIG9jdGV0IGZpcnN0ISAqLworICB1bnNpZ25lZCBjaGFyCW1tcl93cm9uZ19ud2lkX2w7CS8qICMgb2Ygd3JvbmcgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEcyByeGQgKGhpZ2gpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisjZGVmaW5lCU1NUl9USFJfUFJFX1NFVAkJMHgzRgkJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVRfQ1VSCTB4ODAJCS8qIEN1cnJlbnQgc2lnbmFsIGFib3ZlIGl0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NpZ25hbF9sdmw7CQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkwJCTB4M0YJCS8qIHNpZ25hbCBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lHTkFMX0xWTF9WQUxJRAkweDgwCQkvKiBVcGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWxlbmNlX2x2bDsJLyogc2lsZW5jZSBsZXZlbCAobm9pc2UpICovCisjZGVmaW5lCU1NUl9TSUxFTkNFX0xWTAkJMHgzRgkJLyogc2lsZW5jZSBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2dubF9xdWFsOwkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTAkJMHgwRgkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTF9BTlQJMHg4MAkJLyogY3VycmVudCBhbnRlbm5hIHVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfbmV0d19pZF9sOwkJLyogTldJRCBsb3cgb3JkZXIgYnl0ZSAoPykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkM1szXTsJCS8qIHVudXNlZCAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX3N0YXR1czsJCS8qIFN0YXR1cyBvZiBmcmVxdWVuY3kgRUVQUk9NICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0lECTB4RjAJCS8qIE1vZGVtIHJldmlzaW9uIElEICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0RXTEQJMHgwOAkJLyogRG93bmxvYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfQlVTWQkweDA0CQkvKiBFRVBST00gYnVzeSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQ0WzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2w7CQkvKiBSZWFkIGRhdGEgZnJvbSBFRVBST00gKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX2RhdGFfaDsJCS8qIFJlYWQgZGF0YSBmcm9tIEVFUFJPTSAoaGlnaCkgKi8KK307CisKKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworI2RlZmluZQltbXJvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXJfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fSCAqLworCisvKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZAorICogYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHdhdmVsYW4uYy4KKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmZjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKglXYXZlTEFOIElTQSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZQorICogV2F2ZUxBTiBJU0EgZHJpdmVyLiAgVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBpbiB3YXZlbGFuLmMhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX1BfSAorI2RlZmluZSBXQVZFTEFOX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBMaW51eCBpbnRlcmZhY2UgdG8gdGhlIFdhdmVMQU4gSVNBIGhhcmR3YXJlLgorICogVGhlIFdhdmVMQU4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVMQU5zIGFyZSBhbHNvIGRpc3RyaWJ1dGVkIGJ5IERFQyAoUm9hbUFib3V0IERTKSBhbmQgRGlnaXRhbCBPY2Vhbi4KKyAqCisgKiBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBORVQzIEhPV1RPLgorICogSWYgeW91IHdhbnQgdG8gZXhwbG9pdCB0aGUgbWFueSBvdGhlciBmdW5jdGlvbmFsaXRpZXMsIHJlYWQgdGhlIGNvbW1lbnRzCisgKiBpbiB0aGUgY29kZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGUgKHNlZSBiZWxvdykuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQRUNJRklDIE5PVEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdlYiBwYWdlCisgKiAtLS0tLS0tLQorICoJSSB0cnkgdG8gbWFpbnRhaW4gYSB3ZWIgcGFnZSB3aXRoIHRoZSBXaXJlbGVzcyBMQU4gSG93dG8gYXQgOgorICoJICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvV2F2ZWxhbi5odG1sCisgKgorICogU01QCisgKiAtLS0KKyAqCVdlIG5vdyBhcmUgU01QIGNvbXBsaWFudCAoSSBldmVudHVhbGx5IGZpeGVkIHRoZSByZW1haW5pbmcgYnVncykuCisgKglUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGR1YWwgUDYtMTUwIGFuZCBzdXJ2aXZlZCBteSB1c3VhbAorICoJc2V0IG9mIHRvcnR1cmUgdGVzdHMuCisgKglBbnl3YXksIEkgc3BlbnQgZW5vdWdoIHRpbWUgY2hhc2luZyBpbnRlcnJ1cHQgcmUtZW50cmFuY3kgZHVyaW5nCisgKgllcnJvcnMgb3IgcmVjb25maWd1cmUsIGFuZCBJIGRlc2lnbmVkIHRoZSBsb2NrZWQvdW5sb2NrZWQgc2VjdGlvbnMKKyAqCW9mIHRoZSBkcml2ZXIgd2l0aCBncmVhdCBjYXJlLCBhbmQgd2l0aCB0aGUgcmVjZW50IGFkZGl0aW9uIG9mCisgKgl0aGUgc3BpbmxvY2sgKHRoYW5rcyB0byB0aGUgbmV3IEFQSSksIHdlIHNob3VsZCBiZSBxdWl0ZSBjbG9zZSB0bworICoJdGhlIHRydXRoLgorICoJVGhlIFNNUC9JUlEgbG9ja2luZyBpcyBxdWl0ZSBjb2Fyc2UgYW5kIGNvbnNlcnZhdGl2ZSAoaS5lLiBub3QgZmFzdCksCisgKglidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAoZXNwZWNpYWxseSBhdCAyIE1iL3MgOy0pLgorICoKKyAqCUkgaGF2ZSBhbHNvIGxvb2tlZCBpbnRvIGRpc2FibGluZyBvbmx5IG91ciBpbnRlcnJ1cHQgb24gdGhlIGNhcmQKKyAqCSh2aWEgSEFDUikgaW5zdGVhZCBvZiBhbGwgaW50ZXJydXB0cyBpbiB0aGUgcHJvY2Vzc29yICh2aWEgY2xpKSwKKyAqCXNvIHRoYXQgb3RoZXIgZHJpdmVyIGFyZSBub3QgaW1wYWN0ZWQsIGFuZCBpdCBsb29rIGxpa2UgaXQncworICoJcG9zc2libGUsIGJ1dCBpdCdzIHZlcnkgdHJpY2t5IHRvIGRvIHJpZ2h0IChmdWxsIG9mIHJhY2VzKS4gQXMKKyAqCXRoZSBnYWluIHdvdWxkIGJlIG1vc3RseSBmb3IgU01QIHN5c3RlbXMsIGl0IGNhbiB3YWl0Li4uCisgKgorICogRGVidWdnaW5nIGFuZCBvcHRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVlvdSB3aWxsIGZpbmQgYmVsb3cgYSBzZXQgb2YgJyNkZWZpbmUiIGFsbG93aW5nIGEgdmVyeSBmaW5lIGNvbnRyb2wKKyAqCW9uIHRoZSBkcml2ZXIgYmVoYXZpb3VyIGFuZCB0aGUgZGVidWcgbWVzc2FnZXMgcHJpbnRlZC4KKyAqCVRoZSBtYWluIG9wdGlvbnMgYXJlIDoKKyAqCW8gU0VUX1BTQV9DUkMsIHRvIGhhdmUgeW91ciBjYXJkIGNvcnJlY3RseSByZWNvZ25pc2VkIGJ5CisgKgkgIGFuIGFjY2VzcyBwb2ludCBhbmQgdGhlIFBvaW50LXRvLVBvaW50IGRpYWdub3N0aWMgdG9vbC4KKyAqCW8gVVNFX1BTQV9DT05GSUcsIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBQU0EgKEVFcHJvbSkKKyAqCSAgKG90aGVyd2lzZSB3ZSBhbHdheXMgc3RhcnQgYWZyZXNoIHdpdGggc29tZSBkZWZhdWx0cykKKyAqCisgKiB3YXZlbGFuLm8gaXMgdG9vIGRhcm5lZCBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhhdCdzIHRydWUhICBUaGVyZSBpcyBhIHZlcnkgc2ltcGxlIHdheSB0byByZWR1Y2UgdGhlIGRyaXZlcgorICoJb2JqZWN0IGJ5IDMzJSEgIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZToKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBmb3IgdGhlIFdhdmVMQU4gY2hlY2tzIHRoYXQgdGhlIGZpcnN0IHRocmVlCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiAgVGhpcyB0eXBlIG9mCisgKglkZXRlY3Rpb24gd29ya3Mgd2VsbCBmb3IgQVQmVCBjYXJkcyAoYmVjYXVzZSB0aGUgQVQmVCBjb2RlIGlzCisgKgloYXJkY29kZWQgaW4gd2F2ZWxhbi5oKSwgYnV0IG9mIGNvdXJzZSB3aWxsIGZhaWwgZm9yIG90aGVyCisgKgltYW51ZmFjdHVyZXJzLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIFdhdmVMQU4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0OgorICoJMSkgR2V0IHlvdXIgTUFDIGFkZHJlc3MKKyAqCQlhKSBXaXRoIHlvdXIgY2FyZCB1dGlsaXRpZXMgKHdmcmVxc2VsLCBpbnN0Y29uZiwgZXRjLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXI6CisgKgkJCW8gY29tcGlsZSB0aGUga2VybmVsIHdpdGggREVCVUdfQ09ORklHX0lORk8gZW5hYmxlZAorICoJCQlvIEJvb3QgYW5kIGxvb2sgdGhlIGNhcmQgbWVzc2FnZXMKKyAqCTIpIFNldCB5b3VyIE1BQyBjb2RlICgzIG9jdGV0cykgaW4gTUFDX0FERFJFU1NFU1tdWzNdICh3YXZlbGFuLmgpCisgKgkzKSBDb21waWxlIGFuZCB2ZXJpZnkKKyAqCTQpIFNlbmQgbWUgdGhlIE1BQyBjb2RlLiAgSSB3aWxsIGluY2x1ZGUgaXQgaW4gdGhlIG5leHQgdmVyc2lvbi4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBkcml2ZXIgaXMgdGhlIGZpcnN0IHRvIHN1cHBvcnQgIndpcmVsZXNzIGV4dGVuc2lvbnMiLgorICogVGhpcyBzZXQgb2YgZXh0ZW5zaW9ucyBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSB0byBjb250cm9sIHRoZSB3aXJlbGVzcworICogY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBoYXJkd2FyZS4gIEFwcGxpY2F0aW9ucyBzdWNoIGFzIG1vYmlsZSBJUCBtYXkKKyAqIHRha2UgYWR2YW50YWdlIG9mIGl0LgorICoKKyAqIFlvdSB3aWxsIG5lZWQgdG8gZW5hYmxlIHRoZSBDT05GSUdfTkVUX1JBRElPIGRlZmluZSBpbiB0aGUga2VybmVsCisgKiBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAodGhpcyBpcyB0aGUgb25lCisgKiBnaXZpbmcgYWNjZXNzIHRvIHRoZSByYWRpbyBuZXR3b3JrIGRldmljZSBjaG9pY2UpLgorICoKKyAqIEl0IG1pZ2h0IGFsc28gYmUgYSBnb29kIGlkZWEgYXMgd2VsbCB0byBmZXRjaCB0aGUgd2lyZWxlc3MgdG9vbHMgdG8KKyAqIGNvbmZpZ3VyZSB0aGUgZGV2aWNlIGFuZCBwbGF5IGEgYml0LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklMRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHdhdmVsYW4uYzoJCWFjdHVhbCBjb2RlIGZvciB0aGUgZHJpdmVyOiAgQyBmdW5jdGlvbnMKKyAqCisgKiB3YXZlbGFuLnAuaDoJCXByaXZhdGUgaGVhZGVyOiAgbG9jYWwgdHlwZXMgYW5kIHZhcmlhYmxlcyBmb3IgZHJpdmVyCisgKgorICogd2F2ZWxhbi5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIGhhcmR3YXJlIGludGVyZmFjZSBhbmQgc3RydWN0cworICoKKyAqIGk4MjU4Ni5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElTVE9SWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGlzIGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkcml2ZXJzJyBoZWFkZXJzLiBJdCBtYXkgbm90IGJlCisgKiBhY2N1cmF0ZSwgYW5kIEkgZ3VhcmFudGVlIG9ubHkgbXkgYmVzdCBlZmZvcnQuCisgKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVMQU4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyB0aGUgaGlzdG9yeSBvZgorICogdGhlIFdhdmVMQU4gaXRzZWxmIChOQ1IgLT4gQVQmVCAtPiBMdWNlbnQpLgorICoKKyAqIEl0IGFsbCBzdGFydGVkIHdpdGggQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdT4KKyAqIHdyaXRpbmcgYSBXYXZlTEFOIElTQSBkcml2ZXIgZm9yIHRoZSBNYWNoIG1pY3Jva2VybmVsLiAgR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmaWVkIHRoaXMgZm9yIHRoZSBQQ01DSUEgaGFyZHdhcmUuCisgKiAKKyAqIFJvYmVydCBNb3JyaXMgPHJ0bUBkYXMuaGFydmFyZC5lZHU+IHBvcnRlZCB0aGVzZSB0d28gZHJpdmVycyB0byBCU0RJCisgKiBhbmQgYWRkZWQgc3BlY2lmaWMgUENNQ0lBIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNEKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnRlZCBib3RoIEJTREkgZHJpdmVycyB0byBGcmVlQlNELgorICoKKyAqIEJydWNlIEphbnNvbiA8YnJ1Y2VAY3MudXN5ZC5lZHUuYXU+IHBvcnRlZCB0aGUgQlNESSBJU0EgZHJpdmVyIHRvIExpbnV4LgorICoKKyAqIEFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+IHN0YXJ0ZWQgdG8gbW9kaWZ5IEJydWNlJ3MgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCB0aGlzIHdvcmsuCisgKiBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4gcGF0Y2hlZCB0aGUgZHJpdmVyIHRvIHN0YXJ0CisgKiAyLjAwIGNhcmRzIGNvcnJlY3RseSAoMi40IEdIeiB3aXRoIGZyZXF1ZW5jeSBzZWxlY3Rpb24pLgorICogRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBpbnRlZ3JhdGVkIHRoZSB3aG9sZSBpbiBoaXMKKyAqIFBDTUNJQSBwYWNrYWdlIChhbmQgYnVnIGNvcnJlY3Rpb25zKS4KKyAqCisgKiBJIChKZWFuIFRvdXJyaWxoZXMgLSBqdEBocGxiLmhwbC5ocC5jb20pIHRoZW4gc3RhcnRlZCB0byBtYWtlIHNvbWUKKyAqIHBhdGNoZXMgdG8gdGhlIFBDTUNJQSBkcml2ZXIuICBMYXRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiAgVGhlbiwgSSBkaWQgdGhlIHNhbWUgdG8gdGhlIFBDTUNJQSBkcml2ZXIsIGFuZCBkaWQgc29tZQorICogcmVvcmdhbmlzYXRpb24uICBGaW5hbGx5LCBJIGNhbWUgYmFjayB0byB0aGUgSVNBIGRyaXZlciB0bworICogdXBncmFkZSBpdCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgUENNQ0lBIG9uZSBhbmQgcmVvcmdhbmlzZQorICogdGhlIGNvZGUuCisgKiBMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4gZnJvbSBMdWNlbnQgaGFzIGdpdmVuIG1lCisgKiBtdWNoIG5lZWRlZCBpbmZvcm1hdGlvbiBvbiB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4KKyAqLworCisvKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0cyBhbmQgbGl0ZXJhdHVyZSBtZW50aW9uIG90aGVycycgbmFtZXMgYW5kCisgKiBjcmVkaXRzLiAgSSBkb24ndCBrbm93IHdoYXQgdGhlaXIgcGFydCBpbiB0aGlzIGRldmVsb3BtZW50IHdhcy4KKyAqLworCisvKiBCeSB0aGUgd2F5LCBmb3IgdGhlIGNvcHlyaWdodCBhbmQgbGVnYWwgc3R1ZmY6CisgKiBhbG1vc3QgZXZlcnlib2R5IHdyb3RlIGNvZGUgdW5kZXIgdGhlIEdOVSBvciBCU0QgbGljZW5zZSAob3Igc2ltaWxhciksCisgKiBhbmQgd2FudCB0aGVpciBvcmlnaW5hbCBjb3B5cmlnaHQgdG8gcmVtYWluIHNvbWV3aGVyZSBpbiB0aGUKKyAqIGNvZGUgKGZvciBteXNlbGYsIEkgZ28gd2l0aCB0aGUgR1BMKS4KKyAqIE5vYm9keSB3YW50cyB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUkVESVRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSA8YmFrcmVAcGF1bC5ydXRnZXJzLmVkdT4sCisgKglEb25hbGQgQmVja2VyIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+LAorICoJTG9la2UgQnJlZGVydmVsZCA8TG9la2UuQnJlZGVydmVsZEBVdHJlY2h0Lk5DUi5jb20+LAorICoJQnJlbnQgRWxwaGljayA8YmVscGhpY2tAdXdhdGVybG9vLmNhPiwKKyAqCUFuZGVycyBLbGVtZXRzIDxrbGVtZXRzQGl0Lmt0aC5zZT4sCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiA8d0BzdGllci5rb2VuaWcucnU+LAorICoJTWFyYyBNZWVydGVucyA8TWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20+LAorICoJUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4sCisgKglSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyA8d2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqCUNsYXJrIFdvb2R3b3J0aCA8Y2xhcmtAaGl3YXkxLmV4aXQxMDkuY29tPgorICoJWW9uZ2d1YW5nIFpoYW5nIDx5Z3pAaXNsLmhybC5oYWMuY29tPgorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIDxqYWExMDFAc3lzZW5nLmFudS5lZHUuYXU+LAorICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gPGFsbGFuY0Bjcy51c3lkLmVkdS5hdT4sCisgKglNYXR0aGV3IEdlaWVyIDxtYXR0aGV3QGNzLnVzeWQuZWR1LmF1PiwKKyAqCVJlbW8gZGkgR2lvdmFubmkgPHJlbW9AY3MudXN5ZC5lZHUuYXU+LAorICoJRWNraGFyZCBHcmFoIDxncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlPiwKKyAqCVZpcHVsIEd1cHRhIDx2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHU+LAorICoJTWFyayBIYWdhbiA8bWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTT4sCisgKglUaW0gTmljaG9sc29uIDx0aW1AY3MudXN5ZC5lZHUuYXU+LAorICoJSWFuIFBhcmtpbiA8aWFuQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUpvaG4gUm9zZW5iZXJnIDxqb2huckBjcy51c3lkLmVkdS5hdT4sCisgKglHZW9yZ2UgUm9zc2kgPGdlb3JnZUBwaG0uZ292LmF1PiwKKyAqCUFydGh1ciBTY290dCA8YXJ0aHVyQGNzLnVzeWQuZWR1LmF1PiwKKyAqCVN0YW5pc2xhdiBTaW55YWdpbiA8c3Rhc0Bpc2YucnU+CisgKglhbmQgUGV0ZXIgU3RvcmV5IGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogQWRkaXRpb25hbCBDcmVkaXRzOgorICoKKyAqCU15IGRldmVsb3BtZW50IGhhcyBiZWVuIGRvbmUgaW5pdGlhbGx5IHVuZGVyIERlYmlhbiAxLjEgKExpbnV4IDIuMC54KQorICoJYW5kIG5vdwl1bmRlciBEZWJpYW4gMi4yLCBpbml0aWFsbHkgd2l0aCBhbiBIUCBWZWN0cmEgWFAvNjAsIGFuZCBub3cKKyAqCWFuIEhQIFZlY3RyYSBYUC85MC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50OgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaXJzdCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIGNyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuLnAuaCkKKyAqCS0gcmVvcmdhbmlzZWQgZGVidWcgbWVzc2FnZXMKKyAqCS0gbW9yZSBjb21tZW50cywgaGlzdG9yeSwgZXRjLgorICoJLSBtbWNfaW5pdDogIGNvbmZpZ3VyZSB0aGUgUFNBIGlmIG5vdCBkb25lCisgKgktIG1tY19pbml0OiAgY29ycmVjdCBkZWZhdWx0IHZhbHVlIG9mIGxldmVsIHRocmVzaG9sZCBmb3IgUENNQ0lBCisgKgktIG1tY19pbml0OiAgMi4wMCBkZXRlY3Rpb24gYmV0dGVyIGNvZGUgZm9yIDIuMDAgaW5pdGlhbGl6YXRpb24KKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBJUlEgc2V0dGluZyAobm90ZTogIHRoaXMgc2V0dGluZyBpcyBwZXJtYW5lbnQpCisgKgktIHdhdGNoZG9nOiAgY2hhbmdlIHN0cmF0ZWd5IChhbmQgc29sdmUgbW9kdWxlIHJlbW92YWwgcHJvYmxlbXMpCisgKgktIGFkZCB3aXJlbGVzcyBleHRlbnNpb25zIChpb2N0bCBhbmQgZ2V0X3dpcmVsZXNzX3N0YXRzKQorICoJICBnZXQvc2V0IG53aWQvZnJlcXVlbmN5IG9uIGZseSwgaW5mbyBmb3IgL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIG1vcmUgd2lyZWxlc3MgZXh0ZW5zaW9uczogIFNFVFNQWSBhbmQgR0VUU1BZCisgKgktIG1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoJLSBwcml2YXRlIGlvY3RsIHRvIHNldC9nZXQgcXVhbGl0eSBhbmQgbGV2ZWwgdGhyZXNob2xkLCBoaXN0b2dyYW0KKyAqCS0gcmVtb3ZlIC9wcm9jL25ldC93YXZlbGFuCisgKgktIHN1cHByZXNzIHVzZWxlc3Mgc3R1ZmYgZnJvbSBscCAobmV0X2xvY2FsKQorICoJLSBrZXJuZWwgMi4xIHN1cHBvcnQgKGNvcHlfdG8vZnJvbV91c2VyIGluc3RlYWQgb2YgbWVtY3B5X3RvL2Zyb21mcykKKyAqCS0gYWRkIG1lc3NhZ2UgbGV2ZWwgKGRlYnVnIHN0dWZmIGluIC92YXIvYWRtL2RlYnVnIGFuZCBlcnJvcnMgbm90CisgKgkgIGRpc3BsYXllZCBhdCBjb25zb2xlIGFuZCBzdGlsbCBpbiAvdmFyL2FkbS9tZXNzYWdlcykKKyAqCS0gbXVsdGkgZGV2aWNlIHN1cHBvcnQKKyAqCS0gc3RhcnQgZml4aW5nIHRoZSBwcm9iZSAoaW5pdCBjb2RlKQorICoJLSBtb3JlIGlubGluZXMKKyAqCS0gbWFuIHBhZ2UKKyAqCS0gbWFueSBvdGhlciBtaW5vciBkZXRhaWxzIGFuZCBjbGVhbnVwcworICoKKyAqIENoYW5nZXMgbWFkZSBpbiBzZWNvbmQgcHJlLXJlbGVhc2U6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjbGVhbiB1cCBpbml0IGNvZGUgKHByb2JlIGFuZCBtb2R1bGUgaW5pdCkKKyAqCS0gYmV0dGVyIG11bHRpcGxlIGRldmljZSBzdXBwb3J0IChtb2R1bGUpCisgKgktIG5hbWUgYXNzaWdubWVudCAobW9kdWxlKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYmUgbW9yZSBjb25zZXJ2YXRpdmUgb24gdGltZXJzCisgKgktIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG11bHRpY2FzdCAoSSBzdGlsbCBsYWNrIHNvbWUgZGV0YWlscykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZm91cnRoIHByZS1yZWxlYXNlOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IChyZXZpc2l0ZWQgYW5kIGZpbmlzaGVkKQorICoJLSBhdm9pZCByZXNldCBpbiBzZXRfbXVsdGljYXN0X2xpc3QgKGEgcmVhbGx5IGJpZyBoYWNrKQorICoJICBpZiBzb21lYm9keSBjb3VsZCBhcHBseSB0aGlzIGNvZGUgZm9yIG90aGVyIGk4MjU4NiBiYXNlZCBkcml2ZXJzCisgKgktIHNoYXJlIG9uYm9hcmQgbWVtb3J5IDc1JSBSVSBhbmQgMjUlIENVIChpbnN0ZWFkIG9mIDUwLzUwKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjEuMTU6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjaGFuZ2UgdGhlIGRldGVjdGlvbiBjb2RlIGZvciBtdWx0aSBtYW51ZmFjdHVyZXIgY29kZSBzdXBwb3J0CisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4xNzoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHVwZGF0ZSB0byB3aXJlbGVzcyBleHRlbnNpb25zIGNoYW5nZXMKKyAqCS0gc2lsbHkgYnVnIGluIGNhcmQgaW5pdGlhbCBjb25maWd1cmF0aW9uIChwc2FfY29uZl9zdGF0dXMpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4yNyAmIDIuMC4zMDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHNtYWxsIGJ1ZyBpbiBkZWJ1ZyBjb2RlIChwcm9iYWJseSBub3QgdGhlIGxhc3Qgb25lLi4uKQorICoJLSByZW1vdmUgZXh0ZXJuIGtleXdvcmQgZm9yIHdhdmVsYW5fcHJvYmUoKQorICoJLSBsZXZlbCB0aHJlc2hvbGQgaXMgbm93IGEgc3RhbmRhcmQgd2lyZWxlc3MgZXh0ZW5zaW9uICh2ZXJzaW9uIDQgISkKKyAqCS0gbW9kdWxlcyBwYXJhbWV0ZXJzIHR5cGVzIChuZXcgbW9kdWxlIGludGVyZmFjZSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4xLjM2OgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYnl0ZSBjb3VudCBzdGF0cyAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIHJlbW92ZSBkZXZfdGludCBzdHVmZiAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIGVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCEpCisgKgktICdpb2FkZHInIHRvICd1X2xvbmcnIGZvciB0aGUgQWxwaGEgKHRoYW5rcyB0byBTdGFuaXNsYXYgU2lueWFnaW4pCisgKgorICogT3RoZXIgY2hhbmdlcyAobm90IGJ5IG1lKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNwZWxsaW5nIGFuZCBncmFtYXIgInJlY3RpZmljYXRpb24iLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzcgJiAyLjIuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCBzdGF0dXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIFNldCBQU0EgQ1JDIHRvIG1ha2UgUHRQIGRpYWdub3N0aWMgdG9vbCBoYXBweSAoQm9iIEdyYXkpCisgKgktIE1vZHVsZSBpbml0IGNvZGUgZG9uJ3QgZmFpbCBpZiB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgY2FyZCBpbgorICoJICB0aGUgYWRkcmVzcyBsaXN0IChLYXJsaXMgUGVpc2VuaWVrcykKKyAqCS0gTWlzc2luZyBwYXJlbnRoZXNpcyAoQ2hyaXN0b3BoZXIgUGV0ZXJzb24pCisgKgktIENvcnJlY3QgaTgyNTg2IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoJLSBFbmNyeXB0aW9uIGluaXRpYWxpc2F0aW9uIGJ1ZyAoUm9iZXJ0IE1jQ29ybWFjaykKKyAqCS0gTmV3IG1hYyBhZGRyZXNzZXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2JlCisgKgktIEluY3JlYXNlIHdhdGNoZG9nIGZvciBidXN5IGVudmlyb25tZW50cworICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzggJiAyLjIuNyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCB0aGUgcmVjZXB0aW9uIGxvZ2ljIHRvIGJldHRlciByZXBvcnQgZXJyb3JzIGFuZCBhdm9pZAorICoJICBzZW5kaW5nIGJvZ3VzIHBhY2tldCB1cCB0aGUgc3RhY2sKKyAqCS0gRGVsYXkgUlUgY29uZmlnIHRvIGF2b2lkIGNvcnJ1cHRpbmcgZmlyc3QgcmVjZWl2ZWQgcGFja2V0CisgKgktIENoYW5nZSBjb25maWcgY29tcGxldGlvbiBjb2RlICh0byBhY3R1YWxseSBjaGVjayBzb21ldGhpbmcpCisgKgktIEF2b2lkIHJlYWRpbmcgb3V0IG9mIGJvdW5kIGluIHNrYnVmIHRvIHRyYW5zbWl0CisgKgktIFJlY3RpZnkgYSBsb3Qgb2YgKHVzZWxlc3MpIGRlYnVnZ2luZyBjb2RlCisgKgktIENoYW5nZSB0aGUgd2F5IHRvIGAjaWZkZWYgU0VUX1BTQV9DUkMnCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xMSAmIDIuMy4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIENoYW5nZSBlLW1haWwgYW5kIHdlYiBwYWdlIGFkZHJlc3NlcworICoJLSBXYXRjaGRvZyB0aW1lciBpcyBub3cgY29ycmVjdGx5IGV4cHJlc3NlZCBpbiBIWiwgbm90IGluIGppZmZpZXMKKyAqCS0gQWRkIGNoYW5uZWwgbnVtYmVyIHRvIHRoZSBsaXN0IG9mIGZyZXF1ZW5jaWVzIGluIHJhbmdlCisgKgktIEFkZCB0aGUgKHNob3J0KSBsaXN0IG9mIGJpdC1yYXRlcyBpbiByYW5nZQorICoJLSBEZXZlbG9wcCBhIG5ldyBzZW5zaXRpdml0eS4uLiAoc2Vucy52YWx1ZSAmIHNlbnMuZml4ZWQpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xNCAmIDIuMy4yMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCBjaGVjayBmb3Igcm9vdCBwZXJtaXNzaW9uIChicmVhayBpbnN0ZWFkIG9mIGV4aXQpCisgKgktIE5ldyBud2lkICYgZW5jb2Rpbmcgc2V0dGluZyAoV2lyZWxlc3MgRXh0ZW5zaW9uIDkpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMy40OSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEluZGVudGF0aW9uIHJlZm9ybWF0aW5nIChBbGFuKQorICoJLSBVcGRhdGUgdG8gbmV3IG5ldHdvcmsgQVBJIChzb2Z0bmV0IC0gMi4zLjQzKSA6CisgKgkJbyByZXBsYWNlIGRldi0+dGJ1c3kgKEFsYW4pCisgKgkJbyByZXBsYWNlIGRldi0+dHN0YXJ0IChBbGFuKQorICoJCW8gcmVtb3ZlIGRldi0+aW50ZXJydXB0IChBbGFuKQorICoJCW8gYWRkIFNNUCBsb2NraW5nIHZpYSBzcGlubG9jayBpbiBzcGx4eCAobWUpCisgKgkJbyBhZGQgc3BpbmxvY2sgaW4gaW50ZXJydXB0IGhhbmRsZXIgKG1lKQorICoJCW8gdXNlIGtlcm5lbCB3YXRjaGRvZyBpbnN0ZWFkIG9mIG91cnMgKG1lKQorICoJCW8gaW5jcmVhc2Ugd2F0Y2hkb2cgdGltZW91dCAoa2VybmVsIGlzIG1vcmUgc2Vuc2l0aXZlKSAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIEZpeHVwIGEgcG90ZW50aWFsIGdvdGNoYSB3aGVuIHJlY29uZmlndXJpbmcgYW5kIHRoaWdodGVuIGEgYml0CisgKgkJdGhlIGludGVyYWN0aW9ucyB3aXRoIFR4IHF1ZXVlLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjQuMCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IHNwaW5sb2NrIHN0dXBpZCBidWdzIHRoYXQgSSBsZWZ0IGluLiBUaGUgZHJpdmVyIGlzIG5vdyBTTVAKKyAqCQljb21wbGlhbnQgYW5kIGRvZXNuJ3QgbG9ja3VwIGF0IHN0YXJ0dXAuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuNS4yIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBVc2UgbmV3IGRyaXZlciBBUEkgZm9yIFdpcmVsZXNzIEV4dGVuc2lvbnMgOgorICoJCW8gZ290IHJpZCBvZiB3YXZlbGFuX2lvY3RsKCkKKyAqCQlvIHVzZSBhIGJ1bmNoIG9mIGl3X2hhbmRsZXIgaW5zdGVhZAorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjUuMzUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTZXQgZGV2LT50cmFuc19zdGFydCB0byBhdm9pZCBmaWxsaW5nIHRoZSBsb2dzCisgKgktIEhhbmRsZSBiZXR0ZXIgc3B1cmlvdXMvYm9ndXMgaW50ZXJydXB0CisgKgktIEF2b2lkIGRlYWRsb2NrcyBpbiBtbWNfb3V0KCkvbW1jX2luKCkKKyAqCisgKiBXaXNoZXMgJiBkcmVhbXM6CisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgktIHJvYW1pbmcgKHNlZSBQY21jaWEgZHJpdmVyKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZQk8bGludXgva2VybmVsLmg+CisjaW5jbHVkZQk8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlCTxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUJPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZQk8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZQk8bGludXgvc3RhdC5oPgorI2luY2x1ZGUJPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUJPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUJPGxpbnV4L2luLmg+CisjaW5jbHVkZQk8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZQk8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlCTxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlCTxhc20vc3lzdGVtLmg+CisjaW5jbHVkZQk8YXNtL2lvLmg+CisjaW5jbHVkZQk8YXNtL2RtYS5oPgorI2luY2x1ZGUJPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZQk8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlCTxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlCTxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUJPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUJPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlCTxsaW51eC90aW1lci5oPgorI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBXaXJlbGVzcyBleHRlbnNpb25zICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIFdpcmVsZXNzIGhhbmRsZXJzICovCisKKy8qIFdhdmVMQU4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZQkiaTgyNTg2LmgiCisjaW5jbHVkZQkid2F2ZWxhbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRFJJVkVSIE9QVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYCNkZWZpbmUnIG9yIGAjdW5kZWYnIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIKKyAqIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworI3VuZGVmIFNFVF9QU0FfQ1JDCQkvKiBDYWxjdWxhdGUgYW5kIHNldCB0aGUgQ1JDIG9uIFBTQSAoc2xvd2VyKSAqLworI2RlZmluZSBVU0VfUFNBX0NPTkZJRwkJLyogVXNlIGluZm8gZnJvbSB0aGUgUFNBLiAqLworI3VuZGVmIFNUUlVDVF9DSEVDSwkJLyogVmVyaWZ5IHBhZGRpbmcgb2Ygc3RydWN0dXJlcy4gKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpLiAqLworI3VuZGVmIFNFVF9NQUNfQUREUkVTUwkJLyogRXhwZXJpbWVudGFsICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9ucyBleGlzdCBpbiB0aGUga2VybmVsICovCisvKiBXYXJuaW5nOiAgdGhpcyBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLiAqLworI2RlZmluZSBXSVJFTEVTU19TUFkJCS8qIEVuYWJsZSBzcHlpbmcgYWRkcmVzc2VzLiAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWduYWwgbGV2ZWwuICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBERUJVRyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBERUJVR19NT0RVTEVfVFJBQ0UJLyogbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsICovCisjdW5kZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UJLyogY2FsbHMgbWFkZSBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQkvKiBjYWxscyB0byBoYW5kbGVyICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX0lORk8JLyogdHlwZSBvZiBpbnRlcnJ1cHQgYW5kIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucy4gKi8KKyN1bmRlZiBERUJVR19DT05GSUdfSU5GTwkvKiB3aGF0J3MgZ29pbmcgb24gKi8KKyNkZWZpbmUgREVCVUdfQ09ORklHX0VSUk9SCS8qIGVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisKKyN1bmRlZiBERUJVR19QQUNLRVRfRFVNUAkvKiBEdW1wIHBhY2tldCBvbiB0aGUgc2NyZWVuIGlmIGRlZmluZWQgdG8gMzIuICovCisjdW5kZWYgREVCVUdfSU9DVExfVFJBQ0UJLyogbWlzYy4gY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIHZhcmlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSU9DVExfRVJST1IJLyogd2hhdCdzIGdvaW5nIHdyb25nICovCisjZGVmaW5lIERFQlVHX0JBU0lDX1NIT1cJLyogU2hvdyBiYXNpYyBzdGFydHVwIGluZm8uICovCisjdW5kZWYgREVCVUdfVkVSU0lPTl9TSE9XCS8qIFByaW50IHZlcnNpb24gaW5mby4gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBQU0EgdG8gc2NyZWVuLiAqLworI3VuZGVmIERFQlVHX01NQ19TSE9XCQkvKiBEdW1wIG1tYyB0byBzY3JlZW4uICovCisjdW5kZWYgREVCVUdfU0hPV19VTlVTRUQJLyogU2hvdyB1bnVzZWQgZmllbGRzIHRvby4gKi8KKyN1bmRlZiBERUJVR19JODI1ODZfU0hPVwkvKiBTaG93IGk4MjU4NiBzdGF0dXMuICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCitzdGF0aWMgY29uc3QgY2hhcgkqdmVyc2lvbgk9ICJ3YXZlbGFuLmMgOiB2MjQgKFNNUCArIHdpcmVsZXNzIGV4dGVuc2lvbnMpIDExLzEyLzAxXG4iOworI2VuZGlmCisKKy8qIFdhdGNoZG9nIHRlbXBvcmlzYXRpb24gKi8KKyNkZWZpbmUJV0FUQ0hET0dfSklGRklFUwkoNTEyKkhaLzEwMCkKKworLyogTWFjcm8gdG8gZ2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgKi8KKyNkZWZpbmUJTkVMUyhhKQkJCQkoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAyCS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcHMgZGF0YSBpbiB0d28gc3RydWN0dXJlczogICJkZXZpY2UiCisgKiBrZWVwcyB0aGUgZ2VuZXJpYyBkYXRhIChzYW1lIGZvcm1hdCBmb3IgZXZlcnlib2R5KSBhbmQgIm5ldF9sb2NhbCIga2VlcHMKKyAqIGFkZGl0aW9uYWwgc3BlY2lmaWMgZGF0YS4KKyAqIE5vdGUgdGhhdCBzb21lIG9mIHRoaXMgc3BlY2lmaWMgZGF0YSBpcyBpbiBmYWN0IGdlbmVyaWMgKGVuX3N0YXRzLCBmb3IKKyAqIGV4YW1wbGUpLgorICovCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisgIG5ldF9sb2NhbCAqCW5leHQ7CQkvKiBsaW5rZWQgbGlzdCBvZiB0aGUgZGV2aWNlcyAqLworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsJCS8qIHJldmVyc2UgbGluayAqLworICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICBlbl9zdGF0cwlzdGF0czsJCS8qIEV0aGVybmV0IGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgIGludAkJbnJlc2V0czsJLyogbnVtYmVyIG9mIGhhcmR3YXJlIHJlc2V0cyAqLworICB1X2NoYXIJcmVjb25maWdfODI1ODY7CS8qIFdlIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIuICovCisgIHVfY2hhcglwcm9taXNjdW91czsJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworICBpbnQJCW1jX2NvdW50OwkvKiBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICB1X3Nob3J0CWhhY3I7CQkvKiBjdXJyZW50IGhvc3QgaW50ZXJmYWNlIHN0YXRlICovCisKKyAgaW50CQl0eF9uX2luX3VzZTsKKyAgdV9zaG9ydAlyeF9oZWFkOworICB1X3Nob3J0CXJ4X2xhc3Q7CisgIHVfc2hvcnQJdHhfZmlyc3RfZnJlZTsKKyAgdV9zaG9ydAl0eF9maXJzdF9pbl91c2U7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworCisgIHN0cnVjdCBpd19zcHlfZGF0YQlzcHlfZGF0YTsKKyAgc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworI2lmZGVmIEhJU1RPR1JBTQorICBpbnQJCWhpc19udW1iZXI7CQkvKiBudW1iZXIgb2YgaW50ZXJ2YWxzICovCisgIHVfY2hhcgloaXNfcmFuZ2VbMTZdOwkJLyogYm91bmRhcmllcyBvZiBpbnRlcnZhbCBdbi0xOyBuXSAqLworICB1X2xvbmcJaGlzX3N1bVsxNl07CQkvKiBzdW0gaW4gaW50ZXJ2YWwgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUlTQy4gU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdV9jaGFyCisJd3ZfaXJxX3RvX3BzYShpbnQpOworc3RhdGljIGludAorCXd2X3BzYV90b19pcnEodV9jaGFyKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdV9zaG9ydAkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZTogIGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlOiAgYmFzZSBhZGRyZXNzICovCisJCSAgIHVfc2hvcnQpLAkvKiBkYXRhICovCisJaGFjcl93cml0ZV9zbG93KHVfbG9uZywKKwkJICAgdV9zaG9ydCksCisJc2V0X2NoYW5fYXR0bih1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgICAgICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfaGFjcl9yZXNldCh1X2xvbmcpLAkvKiBpb2FkZHIgKi8KKwl3dl8xNl9vZmYodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfMTZfb24odV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJIHVfc2hvcnQpLAkvKiBoYWNyICAgKi8KKwl3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwl3dl9pbnRzX29uKHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0gTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKKwlwc2FfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuICovCisJCSB1X3Nob3J0LAkvKiBoYWNyICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUodV9sb25nLCAJLyogV3JpdGUgdG8gdGhlIFBTQS4gKi8KKwkJICB1X3Nob3J0LAkvKiBoYWNyICovCisJCSAgaW50LAkJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgIHVfY2hhciAqLAkvKiBidWZmZXIgaW4gbWVtb3J5ICovCisJCSAgaW50KTsJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCW1tY19vdXQodV9sb25nLAkJLyogV3JpdGUgMSBieXRlIHRvIHRoZSBNb2RlbSBNYW5hZyBDb250cm9sLiAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQy4gKi8KKwkJICB1X2NoYXIsCisJCSAgdV9jaGFyICosCisJCSAgaW50KTsKK3N0YXRpYyBpbmxpbmUgdV9jaGFyCQkvKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuICovCisJbW1jX2luKHVfbG9uZywKKwkgICAgICAgdV9zaG9ydCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfcmVhZCh1X2xvbmcsCS8qIFJlYWQgbiBieXRlcyBmcm9tIHRoZSBNTUMuICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVQUk9NOiAgYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBiYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogdGltZSB0byB3YWl0ICovCitzdGF0aWMgdm9pZAorCWZlZV9yZWFkKHVfbG9uZywJLyogUmVhZCB0aGUgZnJlcXVlbmN5IEVFUFJPTTogIGJhc2UgYWRkcmVzcyAqLworCQkgdV9zaG9ydCwJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSB1X3Nob3J0ICosCS8qIGRhdGEgYnVmZmVyICovCisJCSBpbnQpOwkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJODI1ODYgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyAvKmlubGluZSovIHZvaWQKKwlvYnJhbV9yZWFkKHVfbG9uZywJLyogaW9hZGRyICovCisJCSAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgdV9jaGFyICosCS8qIGIgKi8KKwkJICAgaW50KTsJLyogbiAqLworc3RhdGljIGlubGluZSB2b2lkCisJb2JyYW1fd3JpdGUodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgIHVfY2hhciAqLAkvKiBiICovCisJCSAgICBpbnQpOwkvKiBuICovCitzdGF0aWMgdm9pZAorCXd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkgICBjb25zdCBjaGFyICopLAorCXd2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJICAgdV9sb25nLAorCQkJICAgbmV0X2xvY2FsICopOworc3RhdGljIGludAorCXd2X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCSAgICB1X2xvbmcsCisJCSAgICBuZXRfbG9jYWwgKik7CitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl84MjU4Nl9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworc3RhdGljIHZvaWQKKwl3dl9zY2Jfc2hvdyh1bnNpZ25lZCBzaG9ydCk7CisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X2luaXRfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogZGlzcGxheSBzdGFydHVwIGluZm8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwsIFNUQVRTICYgUkVDT05GSUcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGVuX3N0YXRzCSoKKwl3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogR2l2ZSBzdGF0cyAvcHJvYy9uZXQvZGV2ICovCitzdGF0aWMgaXdfc3RhdHMgKgorCXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lLiAqLworCQkgICAgICAgdV9zaG9ydCwKKwkJICAgICAgIGludCksCisJd3ZfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVhZCBhbGwgcGFja2V0cyB3YWl0aW5nLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBXcml0ZSBhIHBhY2tldCB0byB0aGUgVHggYnVmZmVyLiAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldC4gKi8KKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIEluaXRpYWxpemUgdGhlIG1vZGVtLiAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdGFydCB0aGUgaTgyNTg2IHJlY2VpdmVyIHVuaXQuICovCisJd3ZfY3Vfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIFN0YXJ0IHRoZSBpODI1ODYgY29tbWFuZCB1bml0LiAqLworCXd2XzgyNTg2X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTg2LiAqLworc3RhdGljIHZvaWQKKwl3dl84MjU4Nl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTg2LiAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQKKwl3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogUmVzZXQgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJd3ZfY2hlY2tfaW9hZGRyKHVfbG9uZywJCS8qIGlvYWRkciAqLworCQkJdV9jaGFyICopOwkvKiBtYWMgYWRkcmVzcyAocmVhZCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIEhBTkRMSU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorCXdhdmVsYW5faW50ZXJydXB0KGludCwJCS8qIGludGVycnVwdCBoYW5kbGVyICovCisJCQkgIHZvaWQgKiwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZAorCXdhdmVsYW5fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIHRyYW5zbWlzc2lvbiB3YXRjaGRvZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBPcGVuIHRoZSBkZXZpY2UuICovCisJd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogQ2xvc2UgdGhlIGRldmljZS4gKi8KKwl3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCk7LyogQ29uZmlndXJlIG9uZSBkZXZpY2UuICovCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKndhdmVsYW5fcHJvYmUoaW50IHVuaXQpOwkvKiBTZWUgU3BhY2UuYy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBXYXZlTEFOIGRyaXZlcnMKKyAqIEl0IGlzIHVzZSB0byB2ZXJpZnkgdGhhdCB3ZSBkb24ndCByZXVzZSB0aGUgc2FtZSBiYXNlIGFkZHJlc3MKKyAqIGZvciB0d28gZGlmZmVyZW50IGRyaXZlcnMgYW5kIHRvIGNsZWFuIHVwIHdoZW4gcmVtb3ZpbmcgdGhlIG1vZHVsZS4KKyAqLworc3RhdGljIG5ldF9sb2NhbCAqCXdhdmVsYW5fbGlzdAk9IChuZXRfbG9jYWwgKikgTlVMTDsKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgdGhlIFBTQSB2YWx1ZSB0byBJUlEgbnVtYmVyCisgKiBhbmQgdmljZSB2ZXJzYS4KKyAqLworc3RhdGljIHVfY2hhcglpcnF2YWxzW10JPQoreworCSAgIDAsICAgIDAsICAgIDAsIDB4MDEsCisJMHgwMiwgMHgwNCwgICAgMCwgMHgwOCwKKwkgICAwLCAgICAwLCAweDEwLCAweDIwLAorCTB4NDAsICAgIDAsICAgIDAsIDB4ODAsCit9OworCisvKgorICogVGFibGUgb2YgdGhlIGF2YWlsYWJsZSBJL08gYWRkcmVzc2VzIChiYXNlIGFkZHJlc3NlcykgZm9yIFdhdmVMQU4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYmFzZVtdCT0KK3sKKyNpZgkwCisgIC8qIExlYXZlIG91dCAweDNDMCBmb3Igbm93IC0tIHNlZW1zIHRvIGNsYXNoIHdpdGggc29tZSB2aWRlbworICAgKiBjb250cm9sbGVycy4KKyAgICogTGVhdmUgb3V0IHRoZSBvdGhlcnMgdG9vIC0tIHdlIHdpbGwgYWx3YXlzIHVzZSAweDM5MCBhbmQgbGVhdmUKKyAgICogMHgzMDAgZm9yIHRoZSBFdGhlcm5ldCBkZXZpY2UuCisgICAqIEplYW4gSUk6ICAweDNFMCBpcyBmaW5lIGFzIHdlbGwuCisgICAqLworICAweDMwMCwgMHgzOTAsIDB4M0UwLCAweDNDMAorI2VuZGlmCS8qIDAgKi8KKyAgMHgzOTAsIDB4M0UwCit9OworCisjaWZkZWYJTU9EVUxFCisvKiBQYXJhbWV0ZXJzIHNldCBieSBpbnNtb2QgKi8KK3N0YXRpYyBpbnQJaW9bNF07CitzdGF0aWMgaW50CWlycVs0XTsKK3N0YXRpYyBjaGFyCSpuYW1lWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShuYW1lLCBjaGFycCwgTlVMTCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJXYXZlTEFOIEkvTyBiYXNlIGFkZHJlc3MoZXMpLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIldhdmVMQU4gSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyhuYW1lLCAiV2F2ZUxBTiBpbnRlcmZhY2UgbmVtZShzKSIpOworI2VuZGlmCS8qIE1PRFVMRSAqLworCisjZW5kaWYJLyogV0FWRUxBTl9QX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgzMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0wLDAgKzEsNDkxNCBAQAorLyoKKyAqCVdhdmVsYW4gUGNtY2lhIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93LiBTZWUgd2F2ZWxhbl9jcy5wLmggZm9yIGRldGFpbHMuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBBbnRob255IEQuIEpvc2VwaCdzIGNvZGUgYW5kIGFsbCB0aGUgY2hhbmdlcyBoZXJlCisgKiBhcmUgYWxzbyB1bmRlciB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGJlbG93LgorICoKKyAqIFRoaXMgY29kZSBzdXBwb3J0cyB2ZXJzaW9uIDIuMDAgb2YgV2F2ZUxBTi9QQ01DSUEgY2FyZHMgKDIuNEdIeiksIGFuZAorICogY2FuIHdvcmsgb24gTGludXggMi4wLjM2IHdpdGggc3VwcG9ydCBvZiBEYXZpZCBIaW5kcycgUENNQ0lBIENhcmQgU2VydmljZXMKKyAqCisgKiBKb2UgRmlubmV5IChqb2VAY29tcC5sYW5jcy5hYy51aykgYXQgTGFuY2FzdGVyIFVuaXZlcnNpdHkgaW4gVUsgYWRkZWQKKyAqIGNyaXRpY2FsIGNvZGUgaW4gdGhlIHJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICoKKyAqIFRoYW5rcyB0byBBbGFuIENveCBhbmQgQnJ1Y2UgSmFuc29uIGZvciB0aGVpciBhZHZpY2UuCisgKgorICoJLS0gWXVuemhvdSBMaSAoc2NpcDQxNjZAbnVzLnNnKQorICoKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCisgKiBSb2FtaW5nIHN1cHBvcnQgYWRkZWQgMDcvMjIvOTggYnkgSnVzdGluIFNlZ2VyIChqc2VnZXJAbWVkaWEubWl0LmVkdSkKKyAqIGJhc2VkIG9uIHBhdGNoIGJ5IEpvZSBGaW5uZXkgZnJvbSBMYW5jYXN0ZXIgVW5pdmVyc2l0eS4KKyNlbmRpZgorICoKKyAqIEx1Y2VudCAoZm9ybWVybHkgQVQmVCBHSVMsIGZvcm1lcmx5IE5DUikgV2F2ZUxBTiBQQ01DSUEgY2FyZDogQW4KKyAqIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIgY29udHJvbGxlZCBieSBhbiBJbnRlbCA4MjU5MyBjb3Byb2Nlc3Nvci4KKyAqCisgKiAgIEEgbm9uLXNoYXJlZCBtZW1vcnkgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXgKKyAqCisgKiBJU0EgdmVyc2lvbiBtb2RpZmllZCB0byBzdXBwb3J0IFBDTUNJQSBieSBBbnRob255IEpvc2VwaCAoYWRqQGxjcy5taXQuZWR1KQorICoKKyAqCisgKiBKb3NlcGggTydTdWxsaXZhbiAmIEpvaG4gTGFuZ2ZvcmQgKGpvc3VsbHZuQGNzLmNtdS5lZHUgJiBqY2xAY3MuY211LmVkdSkKKyAqCisgKiBBcHIgMiAnOTggIG1hZGUgY2hhbmdlcyB0byBicmluZyB0aGUgaTgyNTkzIGNvbnRyb2wvaW50IGhhbmRsaW5nIGluIGxpbmUKKyAqICAgICAgICAgICAgIHdpdGggb2ZmaWNhbCBzcGVjcy4uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAxOTk1CisgKiAgIEFudGhvbnkgRC4gSm9zZXBoCisgKiAgIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgcHJvZ3JhbQorICogICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorICogICB0aGF0IHRoaXMgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcworICogICBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQKKyAqICAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorICogICBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbgorICogICBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCBjb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gaXMKKyAqICAgYnkgcGVybWlzc2lvbiBvZiBNLkkuVC4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqICAgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvLQorICogICB2aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKi8KKworLyogRG8gKk5PVCogYWRkIG90aGVyIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIHdyb25nIC0gSmVhbiBJSSAqLworI2luY2x1ZGUgIndhdmVsYW5fY3MucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqICh3YXZlbGFuIG1vZGVtIG9yIGk4MjU5MykKKyAqLworCisjaWZkZWYgU1RSVUNUX0NIRUNLCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2FuaXR5IHJvdXRpbmUgdG8gdmVyaWZ5IHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBXYXZlTEFOIGludGVyZmFjZQorICogc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGNoYXIgKgord3Zfc3RydWN0dWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworICBTQyhwc2FfdCwgUFNBX1NJWkUsICJwc2FfdCIpOworICBTQyhtbXdfdCwgTU1XX1NJWkUsICJtbXdfdCIpOworICBTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCisjdW5kZWYJU0MKKworICByZXR1cm4oKGNoYXIgKikgTlVMTCk7Cit9IC8qIHd2X3N0cnVjdHVjdF9jaGVjayAqLworI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyAqLworCisvKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgbW9kZW0gb2YgdGhlIHdhdmVsYW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgoraGFzcl9yZWFkKHVfbG9uZwliYXNlKQoreworICByZXR1cm4oaW5iKEhBU1IoYmFzZSkpKTsKK30gLyogaGFzcl9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFjcl93cml0ZSh1X2xvbmcJYmFzZSwKKwkgICB1X2NoYXIJaGFjcikKK3sKKyAgb3V0YihoYWNyLCBIQUNSKGJhc2UpKTsKK30gLyogaGFjcl93cml0ZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLiBJbmNsdWRlIGEgZGVsYXkgZm9yCisgKiB0aG9zZSB0aW1lcyB3aGVuIGl0IGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitoYWNyX3dyaXRlX3Nsb3codV9sb25nCWJhc2UsCisJCXVfY2hhcgloYWNyKQoreworICBoYWNyX3dyaXRlKGJhc2UsIGhhY3IpOworICAvKiBkZWxheSBtaWdodCBvbmx5IGJlIG5lZWRlZCBzb21ldGltZXMgKi8KKyAgbWRlbGF5KDEpOworfSAvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkCitwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgaW50CQlvLAkvKiBvZmZzZXQgaW4gUFNBICovCisJIHVfY2hhciAqCWIsCS8qIGJ1ZmZlciB0byBmaWxsICovCisJIGludAkJbikJLyogc2l6ZSB0byByZWFkICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAqYisrID0gcmVhZGIocHRyKTsKKyAgICAgIC8qIER1ZSB0byBhIGxhY2sgb2YgYWRkcmVzcyBkZWNvZGUgcGlucywgdGhlIFdhdmVMQU4gUENNQ0lBIGNhcmQKKyAgICAgICAqIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBldmVuIG1lbW9yeSBhZGRyZXNzZXMuIFRoYXQgbWVhbnMgdGhlCisgICAgICAgKiBpbmNyZW1lbnQgaGVyZSBNVVNUIGJlIHR3by4KKyAgICAgICAqIEJlY2F1c2Ugb2YgdGhhdCwgd2UgY2FuJ3QgdXNlIG1lbWNweV9mcm9taW8oKS4uLgorICAgICAgICovCisgICAgICBwdHIgKz0gMjsKKyAgICB9Cit9IC8qIHBzYV9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0aGUgUGFyYW10ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQKK3BzYV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgIGludAkJbywJLyogT2Zmc2V0IGluIHBzYSAqLworCSAgdV9jaGFyICoJYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCSAgaW50CQluKQkvKiBMZW5ndGggb2YgYnVmZmVyICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisgIGludAkJY291bnQgPSAwOworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgLyogQXMgdGhlcmUgc2VlbSB0byBoYXZlIG5vIGZsYWcgUFNBX0JVU1kgYXMgaW4gdGhlIElTQSBtb2RlbCwgd2UgYXJlCisgICAqIG9ibGlnZSB0byB2ZXJpZnkgdGhpcyBhZGRyZXNzIHRvIGtub3cgd2hlbiB0aGUgUFNBIGlzIHJlYWR5Li4uICovCisgIHZvbGF0aWxlIHVfY2hhciBfX2lvbWVtICp2ZXJpZnkgPSBscC0+bWVtICsgUFNBX0FERFIgKworICAgIChwc2FvZmYoMCwgcHNhX2NvbXBfbnVtYmVyKSA8PCAxKTsKKworICAvKiBBdXRob3JpemUgd3JpdHRpbmcgdG8gUFNBICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfUk9NX1dFTik7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiB3cml0ZSB0byBQU0EgKi8KKyAgICAgIHdyaXRlYigqYisrLCBwdHIpOworICAgICAgcHRyICs9IDI7CisKKyAgICAgIC8qIEkgZG9uJ3QgaGF2ZSB0aGUgc3BlYywgc28gSSBkb24ndCBrbm93IHdoYXQgdGhlIGNvcnJlY3QKKyAgICAgICAqIHNlcXVlbmNlIHRvIHdyaXRlIGlzLiBUaGlzIGhhY2sgc2VlbSB0byB3b3JrIGZvciBtZS4uLiAqLworICAgICAgY291bnQgPSAwOworICAgICAgd2hpbGUoKHJlYWRiKHZlcmlmeSkgIT0gUFNBX0NPTVBfUENNQ0lBXzkxNSkgJiYgKGNvdW50KysgPCAxMDApKQorCW1kZWxheSgxKTsKKyAgICB9CisKKyAgLyogUHV0IHRoZSBob3N0IGludGVyZmFjZSBiYWNrIGluIHN0YW5kYXJkIHN0YXRlICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKK30gLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgdV9zaG9ydAorcHNhX2NyYyh1bnNpZ25lZCBjaGFyICoJcHNhLAkvKiBUaGUgUFNBICovCisJaW50CQlzaXplKQkvKiBOdW1iZXIgb2Ygc2hvcnQgZm9yIENSQyAqLworeworICBpbnQJCWJ5dGVfY250OwkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKyAgdV9zaG9ydAljcmNfYnl0ZXMgPSAwOwkvKiBEYXRhIGluIHRoZSBQU0EgKi8KKyAgaW50CQliaXRfY250OwkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisgIGZvcihieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKyApCisgICAgeworICAgICAgY3JjX2J5dGVzIF49IHBzYVtieXRlX2NudF07CS8qIEl0cyBhbiB4b3IgKi8KKworICAgICAgZm9yKGJpdF9jbnQgPSAxOyBiaXRfY250IDwgOTsgYml0X2NudCsrICkKKwl7CisJICBpZihjcmNfYnl0ZXMgJiAweDAwMDEpCisJICAgIGNyY19ieXRlcyA9IChjcmNfYnl0ZXMgPj4gMSkgXiAweEEwMDE7CisJICBlbHNlCisJICAgIGNyY19ieXRlcyA+Pj0gMSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGNyY19ieXRlczsKK30gLyogcHNhX2NyYyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB1cGRhdGUgdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZSBXYXZlbGFuJ3MgUFNBCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfcHNhX2NoZWNrc3VtKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisgIHBzYV90CQlwc2E7CisgIHVfc2hvcnQJY3JjOworCisgIC8qIHJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyAgLyogdXBkYXRlIHRoZSBjaGVja3N1bSAqLworICBjcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCXNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjWzBdKSAtIHNpemVvZihwc2EucHNhX2NyY1sxXSkKKwkJLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworICBwc2EucHNhX2NyY1sxXSA9IChjcmMgJiAweEZGMDApID4+IDg7CisKKyAgLyogV3JpdGUgaXQgISAqLworICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NyYyAtIChjaGFyICopJnBzYSwKKwkgICAgKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9jcmMsIDIpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBwcmludGsgKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisgICAgICAgICAgZGV2LT5uYW1lLCBwc2EucHNhX2NyY1swXSwgcHNhLnBzYV9jcmNbMV0pOworCisgIC8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKyAgY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgc2l6ZW9mKHBzYSkgLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgaWYoY3JjICE9IDApCisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYgLyogREVCVUdfSU9DVExfSU5GTyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCit9IC8qIHVwZGF0ZV9wc2FfY2hlY2tzdW0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19vdXQodV9sb25nCQliYXNlLAorCXVfc2hvcnQJCW8sCisJdV9jaGFyCQlkKQoreworICBpbnQgY291bnQgPSAwOworCisgIC8qIFdhaXQgZm9yIE1NQyB0byBnbyBpZGxlICovCisgIHdoaWxlKChjb3VudCsrIDwgMTAwKSAmJiAoaW5iKEhBU1IoYmFzZSkpICYgSEFTUl9NTUlfQlVTWSkpCisgICAgdWRlbGF5KDEwKTsKKworICBvdXRiKCh1X2NoYXIpKChvIDw8IDEpIHwgTU1SX01NSV9XUiksIE1NUihiYXNlKSk7CisgIG91dGIoZCwgTU1EKGJhc2UpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFdlIHN0YXJ0IGJ5IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSAhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbW1jX3dyaXRlKHVfbG9uZwliYXNlLAorCSAgdV9jaGFyCW8sCisJICB1X2NoYXIgKgliLAorCSAgaW50CQluKQoreworICBvICs9IG47CisgIGIgKz0gbjsKKworICB3aGlsZShuLS0gPiAwICkKKyAgICBtbWNfb3V0KGJhc2UsIC0tbywgKigtLWIpKTsKK30gLyogbW1jX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuCisgKiBPcHRpbWlzZWQgdmVyc2lvbiBmb3IgMSBieXRlLCBhdm9pZCB1c2luZyBtZW1vcnkuLi4KKyAqLworc3RhdGljIGlubGluZSB1X2NoYXIKK21tY19pbih1X2xvbmcJYmFzZSwKKyAgICAgICB1X3Nob3J0CW8pCit7CisgIGludCBjb3VudCA9IDA7CisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICBvdXRiKG8gPDwgMSwgTU1SKGJhc2UpKTsJCS8qIFNldCB0aGUgcmVhZCBhZGRyZXNzICovCisKKyAgb3V0YigwLCBNTUQoYmFzZSkpOwkJCS8qIFJlcXVpcmVkIGR1bW15IHdyaXRlICovCisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICByZXR1cm4gKHVfY2hhcikgKGluYihNTUQoYmFzZSkpKTsJLyogTm93IGRvIHRoZSBhY3R1YWwgcmVhZCAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byByZWFkIGJ5dGVzIGZyb20gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBjb21wbGljYXRlZCBieSBhIGxhY2sgb2YgYWRkcmVzcyBsaW5lcywKKyAqIHdoaWNoIHByZXZlbnRzIGRlY29kaW5nIG9mIHRoZSBsb3ctb3JkZXIgYml0LgorICogKGNvZGUgaGFzIGp1c3QgYmVlbiBtb3ZlZCBpbiB0aGUgYWJvdmUgZnVuY3Rpb24pCisgKiBXZSBzdGFydCBieSB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUgIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19yZWFkKHVfbG9uZwkJYmFzZSwKKwkgdV9jaGFyCQlvLAorCSB1X2NoYXIgKgliLAorCSBpbnQJCW4pCit7CisgIG8gKz0gbjsKKyAgYiArPSBuOworCisgIHdoaWxlKG4tLSA+IDApCisgICAgKigtLWIpID0gbW1jX2luKGJhc2UsIC0tbyk7Cit9IC8qIG1tY19yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgdGhlIHR5cGUgb2YgZW5jcnlwdGlvbiBhdmFpbGFibGUuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK21tY19lbmNyKHVfbG9uZwkJYmFzZSkJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KK3sKKyAgaW50CXRlbXA7CisKKyAgdGVtcCA9IG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2Rlc19hdmFpbCkpOworICBpZigodGVtcCAhPSBNTVJfREVTX0FWQUlMX0RFUykgJiYgKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9BRVMpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIHRlbXA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYWl0IGZvciB0aGUgZnJlcXVlbmN5IEVFcHJvbSB0byBjb21wbGV0ZSBhIGNvbW1hbmQuLi4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmVlX3dhaXQodV9sb25nCQliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCSBpbnQJCWRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJIGludAkJbnVtYmVyKQkvKiBOdW1iZXIgb2YgdGltZSB0byB3YWl0ICovCit7CisgIGludAkJY291bnQgPSAwOwkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworICB3aGlsZSgoY291bnQrKyA8IG51bWJlcikgJiYKKwkobW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpCisgICAgdWRlbGF5KGRlbGF5KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgRnJlcXVlbmN5IEVFcHJvbSAoZnJlcXVlbmN5IHNlbGVjdCBjYXJkcykuCisgKi8KK3N0YXRpYyB2b2lkCitmZWVfcmVhZCh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJIHVfc2hvcnQgKgliLAkvKiBkYXRhIGJ1ZmZlciAqLworCSBpbnQJCW4pCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KK3sKKyAgYiArPSBuOwkJLyogUG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgYXJlYSAqLworCisgIC8qIFdyaXRlIHRoZSBhZGRyZXNzICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuIC0gMSk7CisKKyAgLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisgIHdoaWxlKG4tLSA+IDApCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIHJlYWQgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1JFQUQpOworCisgICAgICAvKiBXYWl0IHVudGlsIEVFcHJvbSBpcyByZWFkeSAoc2hvdWxkIGJlIHF1aWNrICEpICovCisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAgICAgLyogUmVhZCB0aGUgdmFsdWUgKi8KKyAgICAgICotLWIgPSAoKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJICAgICAgbW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyAgICB9Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRXByb20gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICogVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGUgZnJlcXVlbmN5IGVlcHJvbSBoYXMgdG8KKyAqIGJlIHVucHJvdGVjdGVkIGFuZCB0aGUgd3JpdGUgZW5hYmxlZC4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQKK2ZlZV93cml0ZSh1X2xvbmcJYmFzZSwJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkgIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJICB1X3Nob3J0ICoJYiwJLyogZGF0YSBidWZmZXIgKi8KKwkgIGludAkJbikJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworeworICBiICs9IG47CQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisjaWZkZWYgRE9FU05UX1NFRU1fVE9fV09SSwkvKiBkaXNhYmxlZCAqLworICAvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUlJFQUQpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFJlYWQgdGhlIHByb3RlY3RlZCByZWdpc3RlciAqLworICBwcmludGsoIlByb3RlY3RlZCAyIDogJTAyWC0lMDJYXG4iLAorCSBtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJIG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisjZW5kaWYJLyogRE9FU05UX1NFRU1fVE9fV09SSyAqLworCisgIC8qIEVuYWJsZSBwcm90ZWN0ZWQgcmVnaXN0ZXIgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSRU4pOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFVucHJvdGVjdCBhcmVhICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKyAgLyogT3IgdXNlIDogKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyNlbmRpZgkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCisKKyAgLyogV3JpdGUgZW5hYmxlICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9FTik7CisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAvKiBXcml0ZSB0aGUgRUVwcm9tIGFkZHJlc3MgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworICAvKiBMb29wIG9uIGFsbCBidWZmZXIgKi8KKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2wpLCAqYiAmIDB4RkYpOworCisgICAgICAvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworICAgICAgLyogV2F2ZWxhbiBkb2Mgc2F5cyA6IHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIEVFQlVTWSA9IDAgKi8KKyAgICAgIG1kZWxheSgxMCk7CisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyAgICB9CisKKyAgLyogV3JpdGUgZGlzYWJsZSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRFMpOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworI2lmZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZGlzYWJsZWQgKi8KKyAgLyogUmVwcm90ZWN0IEVFcHJvbSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDAwKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworI2VuZGlmCS8qIEVFUFJPTV9JU19QUk9URUNURUQgKi8KK30KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgKi8KKworLyoqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nIHJvdXRpbmVzLi4uICoqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSB3YXZlbGFuX2NzLmggKi8KKwordW5zaWduZWQgY2hhciBXQVZFTEFOX0JFQUNPTl9BRERSRVNTW109IHsweDA5LDB4MDAsMHgwZSwweDIwLDB4MDMsMHgwMH07CisgIAordm9pZCB3dl9yb2FtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbmV0X2xvY2FsICAqbHA9IG5ldGRldl9wcml2KGRldik7CisKKyAgLyogRG8gbm90IHJlbW92ZSB0aGlzIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhcm5pbmcsIHlvdSBoYXZlIGVuYWJsZWQgcm9hbWluZyBvbiIKKwkgIiBkZXZpY2UgJXMgIVxuIiwgZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIlJvYW1pbmcgaXMgY3VycmVudGx5IGFuIGV4cGVyaW1lbnRhbCB1bnN1cHBvcnRlZCBmZWF0dXJlIgorCSAiIG9mIHRoZSBXYXZlbGFuIGRyaXZlci5cbiIpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIkl0IG1heSB3b3JrLCBidXQgbWF5IGFsc28gbWFrZSB0aGUgZHJpdmVyIGJlaGF2ZSBpbiIKKwkgIiBlcnJhdGljIHdheXMgb3IgY3Jhc2guXG4iKTsKKworICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ9TlVMTDsgICAgICAgICAgIC8qIEluaXRpYWxpc2UgV2F2ZVBvaW50IHRhYmxlICovCisgIGxwLT53YXZlcG9pbnRfdGFibGUubnVtX3dhdmVwb2ludHM9MDsKKyAgbHAtPndhdmVwb2ludF90YWJsZS5sb2NrZWQ9MDsKKyAgbHAtPmN1cnJfcG9pbnQ9TlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBkZWZhdWx0IFdhdmVQb2ludCAqLworICBscC0+Y2VsbF9zZWFyY2g9MDsKKyAgCisgIGxwLT5jZWxsX3RpbWVyLmRhdGE9KGxvbmcpbHA7ICAgICAgICAgICAgICAgLyogU3RhcnQgY2VsbCBleHBpcnkgdGltZXIgKi8KKyAgbHAtPmNlbGxfdGltZXIuZnVuY3Rpb249d2xfY2VsbF9leHBpcnk7CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworICAKKyAgd3ZfbndpZF9maWx0ZXIoTldJRF9QUk9NSVNDLGxwKSA7ICAgIC8qIEVudGVyIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSAqLworICAvKiB0byBidWlsZCB1cCBhIGdvb2QgV2F2ZVBvaW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUuLi4gKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFJvYW1pbmcgZW5hYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKK30KKyAKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIHdhdmVwb2ludF9oaXN0b3J5ICpwdHIsKm9sZF9wdHI7CisgIG5ldF9sb2NhbCAqbHA9IG5ldGRldl9wcml2KGRldik7CisgIAorICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogUm9hbWluZyBEaXNhYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKKyAgCisgIC8qIEZpeG1lIDogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgdGhlIHRpbWVyIGV4aXN0IGJlZm9yZSBkZWxldGluZyBpdCAqLworICBkZWxfdGltZXIoJmxwLT5jZWxsX3RpbWVyKTsgICAgICAgICAgLyogUmVtb3ZlIGNlbGwgZXhwaXJ5IHRpbWVyICAgICAgICovCisgIHB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7ICAgICAgICAvKiBDbGVhciBkZXZpY2UncyBXYXZlUG9pbnQgdGFibGUgKi8KKyAgd2hpbGUocHRyIT1OVUxMKQorICAgIHsKKyAgICAgIG9sZF9wdHI9cHRyOworICAgICAgcHRyPXB0ci0+bmV4dDsJCisgICAgICB3bF9kZWxfd2F2ZXBvaW50KG9sZF9wdHIsbHApOwkKKyAgICB9Cit9CisKKy8qIEVuYWJsZS9EaXNhYmxlIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhIGdpdmVuIGRldmljZSAqLwordm9pZCB3dl9ud2lkX2ZpbHRlcih1bnNpZ25lZCBjaGFyIG1vZGUsIG5ldF9sb2NhbCAqbHApCit7CisgIG1tX3QgICAgICAgICAgICAgICAgICBtOworICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisgIAorI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRworICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogTldJRCBwcm9taXNjICVzLCBkZXZpY2UgJXNcbiIsKG1vZGU9PU5XSURfUFJPTUlTQykgPyAib24iIDogIm9mZiIsIGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgCisgIG0udy5tbXdfbG9vcHRfc2VsID0gKG1vZGU9PU5XSURfUFJPTUlTQykgPyBNTVdfTE9PUFRfU0VMX0RJU19OV0lEIDogMHgwMDsKKyAgbW1jX3dyaXRlKGxwLT5kZXYtPmJhc2VfYWRkciwgKGNoYXIgKikmbS53Lm1td19sb29wdF9zZWwgLSAoY2hhciAqKSZtLCAodW5zaWduZWQgY2hhciAqKSZtLncubW13X2xvb3B0X3NlbCwgMSk7CisgIAorICBpZihtb2RlPT1OV0lEX1BST01JU0MpCisgICAgbHAtPmNlbGxfc2VhcmNoPTE7CisgIGVsc2UKKyAgICBscC0+Y2VsbF9zZWFyY2g9MDsKKworICAvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyogRmluZCBhIHJlY29yZCBpbiB0aGUgV2F2ZVBvaW50IHRhYmxlIG1hdGNoaW5nIGEgZ2l2ZW4gTldJRCAqLword2F2ZXBvaW50X2hpc3RvcnkgKndsX3JvYW1fY2hlY2sodW5zaWduZWQgc2hvcnQgbndpZCwgbmV0X2xvY2FsICpscCkKK3sKKyAgd2F2ZXBvaW50X2hpc3RvcnkJKnB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7CisgIAorICB3aGlsZShwdHIhPU5VTEwpeworICAgIGlmKHB0ci0+bndpZD09bndpZCkKKyAgICAgIHJldHVybiBwdHI7CQorICAgIHB0cj1wdHItPm5leHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyB3YXZlcG9pbnQgdGFibGUgZW50cnkgKi8KK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwqIGxwKQoreworICB3YXZlcG9pbnRfaGlzdG9yeSAqbmV3X3dhdmVwb2ludDsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRwkKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IE5ldyBXYXZlcG9pbnQsIE5XSUQ6JS40WFxuIixud2lkKTsKKyNlbmRpZgorICAKKyAgaWYobHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cz09TUFYX1dBVkVQT0lOVFMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50PSh3YXZlcG9pbnRfaGlzdG9yeSAqKSBrbWFsbG9jKHNpemVvZih3YXZlcG9pbnRfaGlzdG9yeSksR0ZQX0FUT01JQyk7CisgIGlmKG5ld193YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50LT5ud2lkPW53aWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgV2F2ZVBvaW50cyBOV0lEICovCisgIG5ld193YXZlcG9pbnQtPmF2ZXJhZ2VfZmFzdD0wOyAgICAgICAgICAgICAgICAgICAgLyogUnVubmluZyBBdmVyYWdlcy4uKi8KKyAgbmV3X3dhdmVwb2ludC0+YXZlcmFnZV9zbG93PTA7CisgIG5ld193YXZlcG9pbnQtPnF1YWxwdHI9MDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHJpbmdidWZmZXIgKi8KKyAgbmV3X3dhdmVwb2ludC0+bGFzdF9zZXE9c2VxLTE7ICAgICAgICAgICAgICAgIC8qIExhc3Qgc2VxdWVuY2Ugbm8uc2VlbiAqLworICBtZW1zZXQobmV3X3dhdmVwb2ludC0+c2lncXVhbCwwLFdBVkVQT0lOVF9ISVNUT1JZKTsvKiBFbXB0eSByaW5nYnVmZmVyICovCisgIAorICBuZXdfd2F2ZXBvaW50LT5uZXh0PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsvKiBBZGQgdG8gd2F2ZXBvaW50IHRhYmxlICovCisgIG5ld193YXZlcG9pbnQtPnByZXY9TlVMTDsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCE9TlVMTCkKKyAgICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQtPnByZXY9bmV3X3dhdmVwb2ludDsKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD1uZXdfd2F2ZXBvaW50OworICAKKyAgbHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cysrOyAgICAgLyogbm8uIG9mIHZpc2libGUgd2F2ZXBvaW50cyAqLworICAKKyAgcmV0dXJuIG5ld193YXZlcG9pbnQ7Cit9CisKKy8qIFJlbW92ZSBhIHdhdmVwb2ludCBlbnRyeSBmcm9tIFdhdmVQb2ludCB0YWJsZSAqLwordm9pZCB3bF9kZWxfd2F2ZXBvaW50KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKQoreworICBpZih3YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuOworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQ9PXdhdmVwb2ludCkKKyAgICBscC0+Y3Vycl9wb2ludD1OVUxMOworICAKKyAgaWYod2F2ZXBvaW50LT5wcmV2IT1OVUxMKQorICAgIHdhdmVwb2ludC0+cHJldi0+bmV4dD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBpZih3YXZlcG9pbnQtPm5leHQhPU5VTEwpCisgICAgd2F2ZXBvaW50LT5uZXh0LT5wcmV2PXdhdmVwb2ludC0+cHJldjsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD09d2F2ZXBvaW50KQorICAgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBscC0+d2F2ZXBvaW50X3RhYmxlLm51bV93YXZlcG9pbnRzLS07CisgIGtmcmVlKHdhdmVwb2ludCk7Cit9CisKKy8qIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIC0gY2hlY2tzIFdhdmVQb2ludCB0YWJsZSBmb3Igc3RhbGUgZW50cmllcyAqLyAKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKQoreworICBuZXRfbG9jYWwgKmxwPShuZXRfbG9jYWwgKilkYXRhOworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCwqb2xkX3BvaW50OworICAKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBXYXZlcG9pbnQgdGltZW91dCwgZGV2ICVzXG4iLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICBpZihscC0+d2F2ZXBvaW50X3RhYmxlLmxvY2tlZCkKKyAgICB7CisjaWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHID4gMQorICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFdhdmVwb2ludCB0YWJsZSBsb2NrZWQuLi5cbiIpOworI2VuZGlmCisgICAgICAKKyAgICAgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcysxOyAvKiBJZiB0YWJsZSBpbiB1c2UsIGNvbWUgYmFjayBsYXRlciAqLworICAgICAgYWRkX3RpbWVyKCZscC0+Y2VsbF90aW1lcik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgd2hpbGUod2F2ZXBvaW50IT1OVUxMKQorICAgIHsKKyAgICAgIGlmKHRpbWVfYWZ0ZXIoamlmZmllcywgd2F2ZXBvaW50LT5sYXN0X3NlZW4gKyBDRUxMX1RJTUVPVVQpKQorCXsKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcKKwkgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBCeWUgYnllICUuNFhcbiIsd2F2ZXBvaW50LT5ud2lkKTsKKyNlbmRpZgorCSAgCisJICBvbGRfcG9pbnQ9d2F2ZXBvaW50OworCSAgd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKwkgIHdsX2RlbF93YXZlcG9pbnQob2xkX3BvaW50LGxwKTsKKwl9CisgICAgICBlbHNlCisJd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKyAgICB9CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworfQorCisvKiBVcGRhdGUgU05SIGhpc3Rvcnkgb2YgYSB3YXZlcG9pbnQgKi8KK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSkJCit7CisgIGludCBpPTAsbnVtX21pc3NlZD0wLHB0cj0wOworICBpbnQgYXZlcmFnZV9mYXN0PTAsYXZlcmFnZV9zbG93PTA7CisgIAorICBudW1fbWlzc2VkPShzZXEtd2F2ZXBvaW50LT5sYXN0X3NlcSklV0FWRVBPSU5UX0hJU1RPUlk7LyogSGF2ZSB3ZSBtaXNzZWQKKwkJCQkJCQkgICAgYW55IGJlYWNvbnM/ICovCisgIGlmKG51bV9taXNzZWQpCisgICAgZm9yKGk9MDtpPG51bV9taXNzZWQ7aSsrKQorICAgICAgeworCXdhdmVwb2ludC0+c2lncXVhbFt3YXZlcG9pbnQtPnF1YWxwdHIrK109MDsgLyogSWYgc28sIGVudGVyIHRoZW0gYXMgMCdzICovCisJd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7ICAgIC8qIGluIHRoZSByaW5nYnVmZmVyLiAqLworICAgICAgfQorICB3YXZlcG9pbnQtPmxhc3Rfc2Vlbj1qaWZmaWVzOyAgICAgICAgICAgICAgICAgLyogQWRkIGJlYWNvbiB0byBoaXN0b3J5ICovCisgIHdhdmVwb2ludC0+bGFzdF9zZXE9c2VxOwkKKyAgd2F2ZXBvaW50LT5zaWdxdWFsW3dhdmVwb2ludC0+cXVhbHB0cisrXT1zaWdxdWFsOyAgICAgICAgICAKKyAgd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgIHB0cj0od2F2ZXBvaW50LT5xdWFscHRyLVdBVkVQT0lOVF9GQVNUX0hJU1RPUlkrV0FWRVBPSU5UX0hJU1RPUlkpJVdBVkVQT0lOVF9ISVNUT1JZOworICAKKyAgZm9yKGk9MDtpPFdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aSsrKSAgICAgICAvKiBVcGRhdGUgcnVubmluZyBhdmVyYWdlcyAqLworICAgIHsKKyAgICAgIGF2ZXJhZ2VfZmFzdCs9d2F2ZXBvaW50LT5zaWdxdWFsW3B0cisrXTsKKyAgICAgIHB0ciAlPVdBVkVQT0lOVF9ISVNUT1JZOworICAgIH0KKyAgCisgIGF2ZXJhZ2Vfc2xvdz1hdmVyYWdlX2Zhc3Q7CisgIGZvcihpPVdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aTxXQVZFUE9JTlRfSElTVE9SWTtpKyspCisgICAgeworICAgICAgYXZlcmFnZV9zbG93Kz13YXZlcG9pbnQtPnNpZ3F1YWxbcHRyKytdOworICAgICAgcHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgICAgfQorICAKKyAgd2F2ZXBvaW50LT5hdmVyYWdlX2Zhc3Q9YXZlcmFnZV9mYXN0L1dBVkVQT0lOVF9GQVNUX0hJU1RPUlk7CisgIHdhdmVwb2ludC0+YXZlcmFnZV9zbG93PWF2ZXJhZ2Vfc2xvdy9XQVZFUE9JTlRfSElTVE9SWTsJCit9CisKKy8qIFBlcmZvcm0gYSBoYW5kb3ZlciB0byBhIG5ldyBXYXZlUG9pbnQgKi8KK3ZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKQoreworICBraW9fYWRkcl90CQliYXNlID0gbHAtPmRldi0+YmFzZV9hZGRyOworICBtbV90ICAgICAgICAgICAgICAgICAgbTsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIGZsYWdzOworCisgIGlmKHdhdmVwb2ludD09bHAtPmN1cnJfcG9pbnQpICAgICAgICAgIC8qIFNhbml0eSBjaGVjay4uLiAqLworICAgIHsKKyAgICAgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBEb2luZyBoYW5kb3ZlciB0byAlLjRYLCBkZXYgJXNcbiIsd2F2ZXBvaW50LT5ud2lkLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgCQorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBtLncubW13X25ldHdfaWRfbCA9IHdhdmVwb2ludC0+bndpZCAmIDB4RkY7CisgIG0udy5tbXdfbmV0d19pZF9oID0gKHdhdmVwb2ludC0+bndpZCAmIDB4RkYwMCkgPj4gODsKKyAgCisgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLncubW13X25ldHdfaWRfbCAtIChjaGFyICopJm0sICh1bnNpZ25lZCBjaGFyICopJm0udy5tbXdfbmV0d19pZF9sLCAyKTsKKyAgCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICBscC0+Y3Vycl9wb2ludD13YXZlcG9pbnQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIGEgV2F2ZVBvaW50IGJlYWNvbiBpcyByZWNlaXZlZCAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX3JvYW1fZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogIGRldiwKKwkJCQkgIHVfY2hhciAqICBoZHIsICAgLyogQmVhY29uIGhlYWRlciAqLworCQkJCSAgdV9jaGFyICogIHN0YXRzKSAvKiBTTlIsIFNpZ25hbCBxdWFsaXR5IAorCQkJCQkJICAgICAgb2YgcGFja2V0ICovCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKiloZHI7IC8qIFJjdmQuIEJlYWNvbiAqLworICB1bnNpZ25lZCBzaG9ydCBud2lkPW50b2hzKGJlYWNvbi0+bndpZCk7ICAKKyAgdW5zaWduZWQgc2hvcnQgc2lncXVhbD1zdGF0c1syXSAmIE1NUl9TR05MX1FVQUw7ICAgLyogU05SIG9mIGJlYWNvbiAqLworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PU5VTEw7ICAgICAgICAgICAgICAgIC8qIFdhdmVQb2ludCB0YWJsZSBlbnRyeSAqLworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsgICAgICAgICAgICAgIC8qIERldmljZSBpbmZvICovCisKKyNpZmRlZiBJX05FRURfVEhJU19GRUFUVVJFCisgIC8qIFNvbWUgcGVvcGxlIGRvbid0IG5lZWQgdGhpcywgc29tZSBvdGhlciBtYXkgbmVlZCBpdCAqLworICBud2lkPW53aWRebnRvaHMoYmVhY29uLT5kb21haW5faWQpOworI2VuZGlmCisKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBiZWFjb24sIGRldiAlczpcbiIsZGV2LT5uYW1lKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRvbWFpbjogJS40WCBOV0lEOiAlLjRYIFNpZ1F1YWw9JWRcbiIsbnRvaHMoYmVhY29uLT5kb21haW5faWQpLG53aWQsc2lncXVhbCk7CisjZW5kaWYKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDxNdXRleD4gKi8KKyAgCisgIHdhdmVwb2ludD13bF9yb2FtX2NoZWNrKG53aWQsbHApOyAgICAgICAgICAgIC8qIEZpbmQgV2F2ZVBvaW50IHRhYmxlIGVudHJ5ICovCisgIGlmKHdhdmVwb2ludD09TlVMTCkgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vIGVudHJ5LCBDcmVhdGUgYSBuZXcgb25lLi4uICovCisgICAgeworICAgICAgd2F2ZXBvaW50PXdsX25ld193YXZlcG9pbnQobndpZCxiZWFjb24tPnNlcSxscCk7CisgICAgICBpZih3YXZlcG9pbnQ9PU5VTEwpCisJZ290byBvdXQ7CisgICAgfQorICBpZihscC0+Y3Vycl9wb2ludD09TlVMTCkgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgb25seSBXYXZlUG9pbnQsICovCisgICAgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnQsIGxwKTsJICAgICAgICAgLyogSnVtcCBvbiBpdCEgKi8KKyAgCisgIHdsX3VwZGF0ZV9oaXN0b3J5KHdhdmVwb2ludCwgc2lncXVhbCwgYmVhY29uLT5zZXEpOyAvKiBVcGRhdGUgU05SIGhpc3RvcnkKKwkJCQkJCQkgc3RhdHMuICovCisgIAorICBpZihscC0+Y3Vycl9wb2ludC0+YXZlcmFnZV9zbG93IDwgU0VBUkNIX1RIUkVTSF9MT1cpIC8qIElmIG91ciBjdXJyZW50ICovCisgICAgaWYoIWxwLT5jZWxsX3NlYXJjaCkgICAgICAgICAgICAgICAgICAvKiBXYXZlUG9pbnQgaXMgZ2V0dGluZyBmYWludCwgKi8KKyAgICAgIHd2X253aWRfZmlsdGVyKE5XSURfUFJPTUlTQyxscCk7ICAgIC8qIHN0YXJ0IGxvb2tpbmcgZm9yIGEgbmV3IG9uZSAqLworICAKKyAgaWYod2F2ZXBvaW50LT5hdmVyYWdlX3Nsb3cgPiAKKyAgICAgbHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyArIFdBVkVMQU5fUk9BTUlOR19ERUxUQSkKKyAgICB3dl9yb2FtX2hhbmRvdmVyKHdhdmVwb2ludCwgbHApOyAgIC8qIEhhbmRvdmVyIHRvIGEgYmV0dGVyIFdhdmVQb2ludCAqLworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyA+IFNFQVJDSF9USFJFU0hfSElHSCkgLyogSWYgb3VyIFNOUiBpcyAqLworICAgIGlmKGxwLT5jZWxsX3NlYXJjaCkgIC8qIGdldHRpbmcgYmV0dGVyLCBkcm9wIG91dCBvZiBjZWxsIHNlYXJjaCBtb2RlICovCisgICAgICB3dl9ud2lkX2ZpbHRlcighTldJRF9QUk9NSVNDLGxwKTsKKyAgCitvdXQ6CisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogPC9NVVRFWD4gICA6LSkgKi8KK30KKworLyogVGVzdCB0aGlzIE1BQyBmcmFtZSBhIFdhdmVQb2ludCBiZWFjb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IFdBVkVMQU5fQkVBQ09OKHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKilkYXRhOworICBzdGF0aWMgd2F2ZXBvaW50X2JlYWNvbiBiZWFjb25fdGVtcGxhdGU9ezB4YWEsMHhhYSwweDAzLDB4MDgsMHgwMCwweDBlLDB4MjAsMHgwMywweDAwfTsKKyAgCisgIGlmKG1lbWNtcChiZWFjb24sJmJlYWNvbl90ZW1wbGF0ZSw5KT09MCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEk4MjU5MyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBzeW5jaHJvbm91c2x5IHNlbmQgYSBjb21tYW5kIHRvIHRoZSBpODI1OTMgY2hpcC4gCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3dyaXRlKCksIHd2X3J1X3N0b3AoKSwgd3ZfcnVfc3RhcnQoKSwKKyAqICB3dl84MjU5M19jb25maWcoKSAmIHd2X2RpYWcoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSAgICAgY2hhciAqCXN0ciwKKwkgICAgIGludAljbWQsCisJICAgICBpbnQJcmVzdWx0KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlzdGF0dXM7CisgIGludAkJd2FpdF9jb21wbGV0ZWQ7CisgIGxvbmcJCXNwaW47CisKKyAgLyogU3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAoaWYgYW55KSAqLworICBzcGluID0gMTAwMDsKKyAgZG8KKyAgICB7CisgICAgICAvKiBUaW1lIGNhbGlicmF0aW9uIG9mIHRoZSBsb29wICovCisgICAgICB1ZGVsYXkoMTApOworCisgICAgICAvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19FWEVDX1NUQVRFX01BU0spICE9IFNSM19FWEVDX0lETEUpICYmIChzcGluLS0gPiAwKSk7CisKKyAgLyogSWYgdGhlIGludGVycnVwdCBoYXNuJ3QgYmUgcG9zdGVkICovCisgIGlmKHNwaW4gPD0gMCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQgKHByZXZpb3VzIGNvbW1hbmQpLCBzdGF0dXMgMHglMDJ4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICAvKiBJc3N1ZSB0aGUgY29tbWFuZCB0byB0aGUgY29udHJvbGxlciAqLworICBvdXRiKGNtZCwgTENDUihiYXNlKSk7CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgcmVzdWx0IG9mIHRoZSBjb21tYW5kCisgICAqIE5vdGUgOiB0aGlzIG1lYW4gdGhhdCB0aGUgaXJxIGhhbmRsZXIgd2lsbCBkZWFsIHdpdGggdGhhdCAqLworICBpZihyZXN1bHQgPT0gU1IwX05PX1JFU1VMVCkKKyAgICByZXR1cm4oVFJVRSk7CisKKyAgLyogV2UgYXJlIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAqLworICB3YWl0X2NvbXBsZXRlZCA9IFRSVUU7CisKKyAgLyogQnVzeSB3YWl0IHdoaWxlIHRoZSBMQU4gY29udHJvbGxlciBleGVjdXRlcyB0aGUgY29tbWFuZC4gKi8KKyAgc3BpbiA9IDEwMDA7CisgIGRvCisgICAgeworICAgICAgLyogVGltZSBjYWxpYnJhdGlvbiBvZiB0aGUgbG9vcCAqLworICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgLyogUmVhZCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyICovCisgICAgICBvdXRiKENSMF9TVEFUVVNfMCB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCisgICAgICAvKiBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW50ZXJydXB0IHBvc3RlZCAqLworICAgICAgaWYoKHN0YXR1cyAmIFNSMF9JTlRFUlJVUFQpKQorCXsKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKworCSAgLyogQ2hlY2sgaWYgaW50ZXJydXB0IGlzIGEgY29tbWFuZCBjb21wbGV0aW9uICovCisJICBpZigoKHN0YXR1cyAmIFNSMF9CT1RIX1JYX1RYKSAhPSBTUjBfQk9USF9SWF9UWCkgJiYKKwkgICAgICgoc3RhdHVzICYgU1IwX0JPVEhfUlhfVFgpICE9IDB4MCkgJiYKKwkgICAgICEoc3RhdHVzICYgU1IwX1JFQ0VQVElPTikpCisJICAgIHsKKwkgICAgICAvKiBTaWduYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJICAgICAgd2FpdF9jb21wbGV0ZWQgPSBGQUxTRTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm90ZSA6IFJ4IGludGVycnVwdHMgd2lsbCBiZSBoYW5kbGVkIGxhdGVyLCBiZWNhdXNlIHdlIGNhbgorCSAgICAgICAqIGhhbmRsZSBtdWx0aXBsZSBSeCBwYWNrZXRzIGF0IG9uY2UgKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogbm90IG91ciBpbnRlcnJ1cHRcbiIpOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSh3YWl0X2NvbXBsZXRlZCAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIElmIHRoZSBpbnRlcnJ1cHQgaGFzbid0IGJlIHBvc3RlZCAqLworICBpZih3YWl0X2NvbXBsZXRlZCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQsIHN0YXR1cyAweCUwMnhcbiIsCisJICAgICBzdHIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoZSByZXR1cm4gY29kZSByZXR1cm5lZCBieSB0aGUgY2FyZCAoc2VlIGFib3ZlKSBhZ2FpbnN0CisgICAqIHRoZSBleHBlY3RlZCByZXR1cm4gY29kZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyICovCisgIGlmKChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgIT0gcmVzdWx0KQorICAgIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogJXMgZmFpbGVkLCBzdGF0dXMgPSAweCV4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICByZXR1cm4oVFJVRSk7Cit9IC8qIHd2XzgyNTkzX2NtZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSA1OTMgb3AtY29kZSBudW1iZXIgNywgYW5kIG9idGFpbnMgdGhlIGRpYWdub3NlCisgKiBzdGF0dXMgZm9yIHRoZSBXYXZlTEFOLgorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgaW50CQlyZXQgPSBGQUxTRTsKKworICBpZih3dl84MjU5M19jbWQoZGV2LCAid3ZfZGlhZygpOiBkaWFnbm9zZSIsCisJCSAgT1AwX0RJQUdOT1NFLCBTUjBfRElBR05PU0VfUEFTU0VEKSkKKyAgICByZXQgPSBUUlVFOworCisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworICBwcmludGsoS0VSTl9JTkZPICJ3YXZlbGFuX2NzOiBpODI1OTMgU2VsZiBUZXN0IGZhaWxlZCFcbiIpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfSAvKiB3dl9kaWFnICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgbGVuIGJ5dGVzIGZyb20gdGhlIGk4MjU5MydzIHJpbmcgYnVmZmVyLCBzdGFydGluZyBhdAorICogY2hpcCBhZGRyZXNzIGFkZHIuIFRoZSByZXN1bHRzIHJlYWQgZnJvbSB0aGUgY2hpcCBhcmUgc3RvcmVkIGluIGJ1Zi4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFkZHJlc3MgdG8gdXNlIGZvciBuZXh0IHRoZSBjYWxsLgorICovCitzdGF0aWMgaW50CityZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICBpbnQJYWRkciwKKwkgICAgIGNoYXIgKglidWYsCisJICAgICBpbnQJbGVuKQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlyaW5nX3B0ciA9IGFkZHI7CisgIGludAkJY2h1bmtfbGVuOworICBjaGFyICoJYnVmX3B0ciA9IGJ1ZjsKKworICAvKiBHZXQgYWxsIHRoZSBidWZmZXIgKi8KKyAgd2hpbGUobGVuID4gMCkKKyAgICB7CisgICAgICAvKiBQb3NpdGlvbiB0aGUgUHJvZ3JhbSBJL08gUmVnaXN0ZXIgYXQgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIG91dGIocmluZ19wdHIgJiAweGZmLCBQSU9STChiYXNlKSk7CisgICAgICBvdXRiKCgocmluZ19wdHIgPj4gOCkgJiBQSU9SSF9NQVNLKSwgUElPUkgoYmFzZSkpOworCisgICAgICAvKiBGaXJzdCwgZGV0ZXJtaW5lIGhvdyBtdWNoIHdlIGNhbiByZWFkIHdpdGhvdXQgd3JhcHBpbmcgYXJvdW5kIHRoZQorCSByaW5nIGJ1ZmZlciAqLworICAgICAgaWYoKGFkZHIgKyBsZW4pIDwgKFJYX0JBU0UgKyBSWF9TSVpFKSkKKwljaHVua19sZW4gPSBsZW47CisgICAgICBlbHNlCisJY2h1bmtfbGVuID0gUlhfQkFTRSArIFJYX1NJWkUgLSBhZGRyOworICAgICAgaW5zYihQSU9QKGJhc2UpLCBidWZfcHRyLCBjaHVua19sZW4pOworICAgICAgYnVmX3B0ciArPSBjaHVua19sZW47CisgICAgICBsZW4gLT0gY2h1bmtfbGVuOworICAgICAgcmluZ19wdHIgPSAocmluZ19wdHIgLSBSWF9CQVNFICsgY2h1bmtfbGVuKSAlIFJYX1NJWkUgKyBSWF9CQVNFOworICAgIH0KKyAgcmV0dXJuKHJpbmdfcHRyKTsKK30gLyogcmVhZF9yaW5nYnVmICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTkzLCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0Li4uCisgKiBCZWNhdXNlIHd2XzgyNTkzX2NvbmZpZyB1c2UgdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyB0cmFuc21pc3Npb24sIHNvIHdlIGRvIGl0IG5vdworICogb3IgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpIChJIGNhbid0IGZpbmQgYW55IGJldHRlciBwbGFjZSwKKyAqIHdhdmVsYW5faW50ZXJydXB0IGlzIG5vdCBhbiBvcHRpb24uLi4pLCBzbyB5b3UgbWF5IGV4cGVyaWVuY2UKKyAqIHNvbWUgZGVsYXkgc29tZXRpbWUuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl84MjU5M19yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCQlsaW5rID0gbHAtPmxpbms7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisgIC8qIEFybSB0aGUgZmxhZywgd2lsbCBiZSBjbGVhcmQgaW4gd3ZfODI1OTNfY29uZmlnKCkgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gVFJVRTsKKworICAvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKyAgaWYoKGxpbmstPm9wZW4pICYmIChuZXRpZl9ydW5uaW5nKGRldikpICYmICEobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgd3ZfODI1OTNfY29uZmlnKGRldik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICIlczogd3ZfODI1OTNfcmVjb25maWcoKTogZGVsYXllZCAoc3RhdGUgPSAlbFgsIGxpbmsgPSAlZClcbiIsCisJICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUsIGxpbmstPm9wZW4pOworI2VuZGlmCisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lcyBhcmUgdXNlZCBpbiB0aGUgY29kZSB0byBzaG93IGRlYnVnIGluZm9ybWF0aW9ucy4KKyAqIE1vc3Qgb2YgdGhlIHRpbWUsIGl0IGR1bXAgdGhlIGNvbnRlbnQgb2YgaGFyZHdhcmUgc3RydWN0dXJlcy4uLgorICovCisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgY29udGVudHMgb2YgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wc2Ffc2hvdyhwc2FfdCAqCXApCit7CisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIHBzYSBjb250ZW50czogIyMjIyNcbiIpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2lvX2Jhc2VfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfMSwKKwkgcC0+cHNhX2lvX2Jhc2VfYWRkcl8yLAorCSBwLT5wc2FfaW9fYmFzZV9hZGRyXzMsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfNCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVtX2Jvb3RfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYXG4iLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8xLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8yLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8zKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworICBwcmludGsoInBzYV9pbnRfcmVxX25vOiAlZFxuIiwgcC0+cHNhX2ludF9yZXFfbm8pOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfdW51c2VkMFswXSwKKwkgcC0+cHNhX3VudXNlZDBbMV0sCisJIHAtPnBzYV91bnVzZWQwWzJdLAorCSBwLT5wc2FfdW51c2VkMFszXSwKKwkgcC0+cHNhX3VudXNlZDBbNF0sCisJIHAtPnBzYV91bnVzZWQwWzVdLAorCSBwLT5wc2FfdW51c2VkMFs2XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzJdLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9sb2NhbF9tYWNfYWRkcltdOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzBdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsyXSwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzNdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls1XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW5pdl9sb2NhbF9zZWw6ICVkLCAiLCBwLT5wc2FfdW5pdl9sb2NhbF9zZWwpOworICBwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisgIHByaW50aygicHNhX3Rocl9wcmVfc2V0OiAweCUwMnhcbiIsIHAtPnBzYV90aHJfcHJlX3NldCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZmVhdHVyZV9zZWxlY3QvZGVjYXlfcHJtOiAweCUwMngsICIsCisJIHAtPnBzYV9mZWF0dXJlX3NlbGVjdCk7CisgIHByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9xdWFsaXR5X3RocjogMHglMDJ4LCAiLCBwLT5wc2FfcXVhbGl0eV90aHIpOworICBwcmludGsoInBzYV9tb2RfZGVsYXk6IDB4JTAyeFxuIiwgcC0+cHNhX21vZF9kZWxheSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sIHAtPnBzYV9ud2lkWzFdKTsKKyAgcHJpbnRrKCJwc2FfbndpZF9zZWxlY3Q6ICVkXG4iLCBwLT5wc2FfbndpZF9zZWxlY3QpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2VuY3J5cHRpb25fc2VsZWN0OiAlZCwgIiwgcC0+cHNhX2VuY3J5cHRpb25fc2VsZWN0KTsKKyAgcHJpbnRrKCJwc2FfZW5jcnlwdGlvbl9rZXlbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMF0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVsxXSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs0XSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzVdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNl0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs3XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZGF0YWJ1c193aWR0aDogJWRcbiIsIHAtPnBzYV9kYXRhYnVzX3dpZHRoKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworICBwcmludGsoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfY2FsbF9jb2RlWzBdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzFdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzJdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzNdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzRdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzVdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzZdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAicHNhX3Jlc2VydmVkW106ICUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIHAtPnBzYV9yZXNlcnZlZFswXSwKKwkgcC0+cHNhX3Jlc2VydmVkWzFdLAorCSBwLT5wc2FfcmVzZXJ2ZWRbMl0sCisJIHAtPnBzYV9yZXNlcnZlZFszXSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jb25mX3N0YXR1czogJWQsICIsIHAtPnBzYV9jb25mX3N0YXR1cyk7CisgIHByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisgIHByaW50aygicHNhX2NyY19zdGF0dXM6IDB4JTAyeFxuIiwgcC0+cHNhX2NyY19zdGF0dXMpOworfSAvKiB3dl9wc2Ffc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX1BTQV9TSE9XICovCisKKyNpZmRlZiBERUJVR19NTUNfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgdG8gYmUgY29tcGxldGVkLi4uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgbW1yX3QJCW07CisKKyAgLyogQmFzaWMgY2hlY2sgKi8KKyAgaWYoaGFzcl9yZWFkKGJhc2UpICYgSEFTUl9OT19DTEspCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCSAgICAgZGV2LT5uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIFJlYWQgdGhlIG1tYyAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMSk7CisgIG1tY19yZWFkKGJhc2UsIDAsICh1X2NoYXIgKikmbSwgc2l6ZW9mKG0pKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIC8qIERvbid0IGZvcmdldCB0byB1cGRhdGUgc3RhdGlzdGljcyAqLworICBscC0+d3N0YXRzLmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQwWzBdLAorCSBtLm1tcl91bnVzZWQwWzFdLAorCSBtLm1tcl91bnVzZWQwWzJdLAorCSBtLm1tcl91bnVzZWQwWzNdLAorCSBtLm1tcl91bnVzZWQwWzRdLAorCSBtLm1tcl91bnVzZWQwWzVdLAorCSBtLm1tcl91bnVzZWQwWzZdLAorCSBtLm1tcl91bnVzZWQwWzddKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiRW5jcnlwdGlvbiBhbGdvcnl0aG06ICUwMlggLSBTdGF0dXM6ICUwMlhcbiIsCisJIG0ubW1yX2Rlc19hdmFpbCwgbS5tbXJfZGVzX3N0YXR1cyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKyAgcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgbS5tbXJfdW51c2VkMVswXSwKKwkgbS5tbXJfdW51c2VkMVsxXSwKKwkgbS5tbXJfdW51c2VkMVsyXSwKKwkgbS5tbXJfdW51c2VkMVszXSwKKwkgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgImRjZV9zdGF0dXM6IDB4JXggWyVzJXMlcyVzXVxuIiwKKwkgbS5tbXJfZGNlX3N0YXR1cywKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/ICJlbmVyZ3kgZGV0ZWN0ZWQsIjoiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kpID8gInRyYW5zbWl0dGVyIG9uLCIgOiAiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19KQlJfRVhQSVJFRCkgPworCSAiamFiYmVyIHRpbWVyIGV4cGlyZWQsIiA6ICIiKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRzcCBJRDogJTAyWFxuIiwKKwkgbS5tbXJfZHNwX2lkKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQyWzBdLAorCSBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiIyBjb3JyZWN0X253aWQ6ICVkLCAjIHdyb25nX253aWQ6ICVkXG4iLAorCSAobS5tbXJfY29ycmVjdF9ud2lkX2ggPDwgOCkgfCBtLm1tcl9jb3JyZWN0X253aWRfbCwKKwkgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJ0aHJfcHJlX3NldDogMHgleCBbY3VycmVudCBzaWduYWwgJXNdXG4iLAorCSBtLm1tcl90aHJfcHJlX3NldCAmIE1NUl9USFJfUFJFX1NFVCwKKwkgKG0ubW1yX3Rocl9wcmVfc2V0ICYgTU1SX1RIUl9QUkVfU0VUX0NVUikgPyAiYWJvdmUiIDogImJlbG93Iik7CisgIHByaW50ayhLRVJOX0RFQlVHICJzaWduYWxfbHZsOiAlZCBbJXNdLCAiLAorCSBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkwsCisJIChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID8gIm5ldyBtc2ciIDogIm5vIG5ldyBtc2ciKTsKKyAgcHJpbnRrKCJzaWxlbmNlX2x2bDogJWQgWyVzXSwgIiwgbS5tbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkwsCisJIChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPyAidXBkYXRlIGRvbmUiIDogIm5vIG5ldyB1cGRhdGUiKTsKKyAgcHJpbnRrKCJzZ25sX3F1YWw6IDB4JXggWyVzXVxuIiwgbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTCwKKwkgKG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUxfQU5UKSA/ICJBbnRlbm5hIDEiIDogIkFudGVubmEgMCIpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3X2lkX2w6ICV4XG4iLCBtLm1tcl9uZXR3X2lkX2wpOworI2VuZGlmCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCit9IC8qIHd2X21tY19zaG93ICovCisjZW5kaWYJLyogREVCVUdfTU1DX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIGk4MjU5MydzIHJlY2VpdmUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQKK3d2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIGk4MjU5MyByZWNlaXZlciBzdGF0dXM6ICMjIyMjXG4iKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInJ1OiByZnAgJWQgc3RvcCAlZCIsIGxwLT5yZnAsIGxwLT5zdG9wKTsKKyAgLyoKKyAgICogTm90IGltcGxlbWVudGVkIHlldC4uLgorICAgKi8KKyAgcHJpbnRrKCJcbiIpOworfSAvKiB3dl9ydV9zaG93ICovCisjZW5kaWYJLyogREVCVUdfSTgyNTkzX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0RFVklDRV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIFdhdmVMQU4gUENNQ0lBIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRldjoiKTsKKyAgcHJpbnRrKCIgc3RhdGU9JWxYLCIsIGRldi0+c3RhdGUpOworICBwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisgIHByaW50aygiIGZsYWdzPTB4JXgsIiwgZGV2LT5mbGFncyk7CisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfZGV2X3Nob3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyJ3MKKyAqIHByaXZhdGUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICBwcmludGsoS0VSTl9ERUJVRyAibG9jYWw6Iik7CisgIC8qCisgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuLi4KKyAgICovCisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfbG9jYWxfc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX0RFVklDRV9TSE9XICovCisKKyNpZiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEdW1wIHBhY2tldCBoZWFkZXIgKGFuZCBjb250ZW50IGlmIG5lY2Vzc2FyeSkgb24gdGhlIHNjcmVlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF9pbmZvKHVfY2hhciAqCQlwLAkJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkgICAgICAgaW50CQlsZW5ndGgsCQkvKiBMZW5ndGggb2YgdGhlIHBhY2tldCAqLworCSAgICAgICBjaGFyICoJCW1zZzEsCQkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkgICAgICAgY2hhciAqCQltc2cyKQkJLyogTmFtZSBvZiB0aGUgZnVuY3Rpb24gKi8KK3sKKyAgaW50CQlpOworICBpbnQJCW1heGk7CisKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcygpOiBkZXN0ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCBsZW5ndGggJWRcbiIsCisJIG1zZzEsIG1zZzIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIGxlbmd0aCk7CisgIHByaW50ayhLRVJOX0RFQlVHICIlczogJXMoKTogc3JjICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCB0eXBlIDB4JTAyWCUwMlhcbiIsCisJIG1zZzEsIG1zZzIsIHBbNl0sIHBbN10sIHBbOF0sIHBbOV0sIHBbMTBdLCBwWzExXSwgcFsxMl0sIHBbMTNdKTsKKworI2lmZGVmIERFQlVHX1BBQ0tFVF9EVU1QCisKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworICBpZigobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKyAgICBtYXhpID0gREVCVUdfUEFDS0VUX0RVTVA7CisgIGZvcihpID0gMTQ7IGkgPCBtYXhpOyBpKyspCisgICAgaWYocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisgICAgICBwcmludGsoIiAlYyIsIHBbaV0pOworICAgIGVsc2UKKyAgICAgIHByaW50aygiJTAyWCIsIHBbaV0pOworICBpZihtYXhpIDwgbGVuZ3RoKQorICAgIHByaW50aygiLi4iKTsKKyAgcHJpbnRrKCJcIlxuIik7CisgIHByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwCisgKiBUaGVyZSAgaXMgYSBsb3Qgb2YgZmxhZyB0byBjb25maWd1cmUgaXQgYXQgeW91ciB3aWxsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgaW50CQlpOworCisgIC8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworICB3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JBU0lDX1NIT1cKKyAgLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU46IHBvcnQgJSNseCwgaXJxICVkLCBod19hZGRyIiwKKwkgZGV2LT5uYW1lLCBiYXNlLCBkZXYtPmlycSk7CisgIGZvcihpID0gMDsgaSA8IFdBVkVMQU5fQUREUl9TSVpFOyBpKyspCisgICAgcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKyAgLyogUHJpbnQgY3VycmVudCBuZXR3b3JrIGlkICovCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QpCisgICAgcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sIHBzYS5wc2FfbndpZFsxXSk7CisgIGVsc2UKKyAgICBwcmludGsoIiwgbndpZCBvZmYiKTsKKworICAvKiBJZiAyLjAwIGNhcmQgKi8KKyAgaWYoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorICAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWZyZXE7CisKKyAgICAgIC8qIEFzayB0aGUgRUVwcm9tIHRvIHJlYWQgdGhlIGZyZXF1ZW5jeSBmcm9tIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwIC8qIDFzdCBhcmVhIC0gZnJlcXVlbmN5Li4uICovLAorCSAgICAgICAmZnJlcSwgMSk7CisKKyAgICAgIC8qIFByaW50IGZyZXF1ZW5jeSAqLworICAgICAgcHJpbnRrKCIsIDIuMDAsICVsZCIsIChmcmVxID4+IDYpICsgMjQwMEwpOworCisgICAgICAvKiBIYWNrICEhISAqLworICAgICAgaWYoZnJlcSAmIDB4MjApCisJcHJpbnRrKCIuNSIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50aygiLCBQQ01DSUEsICIpOworICAgICAgc3dpdGNoIChwc2EucHNhX3N1YmJhbmQpCisJeworCWNhc2UgUFNBX1NVQkJBTkRfOTE1OgorCSAgcHJpbnRrKCI5MTUiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQyNToKKwkgIHByaW50aygiMjQyNSIpOworCSAgYnJlYWs7CisJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCSAgcHJpbnRrKCIyNDYwIik7CisJICBicmVhazsKKwljYXNlIFBTQV9TVUJCQU5EXzI0ODQ6CisJICBwcmludGsoIjI0ODQiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQzMF81OgorCSAgcHJpbnRrKCIyNDMwLjUiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGsoInVua25vd24iKTsKKwl9CisgICAgfQorCisgIHByaW50aygiIE1IelxuIik7CisjZW5kaWYJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisgIC8qIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOworI2VuZGlmCit9IC8qIHd2X2luaXRfaW5mbyAqLworCisvKioqKioqKioqKioqKioqKioqKioqIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBXZSBmb3VuZCBoZXJlIHJvdXRpbmVzIHRoYXQgYXJlIGNhbGxlZCBieSBMaW51eCBvbiBkaWZmZXJlbnRzCisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IGV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzCSoKK3dhdmVsYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgcmV0dXJuKCYoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkCit3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKyAgaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cy4KKyAgICAgICAqLworICAgICAgaWYoIWxwLT5wcm9taXNjdW91cykKKwl7CisJICBscC0+cHJvbWlzY3VvdXMgPSAxOworCSAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICBscC0+bWNfY291bnQgPSAwOworCisJICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCisJICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogSWYgYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMKKyAgICAgKiBvciB0b28gbXVjaCBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvciB0aGUgaGFyZHdhcmUgZmlsdGVyICovCisgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisgICAgICAgKGRldi0+bWNfY291bnQgPiBJODI1OTNfTUFYX01VTFRJQ0FTVF9BRERSRVNTRVMpKQorICAgICAgeworCS8qCisJICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgYWN0aXZlIHRoZSBhbGwgbXVsdGljYXN0IG1vZGUKKwkgKi8KKwlpZighbHAtPmFsbG11bHRpY2FzdCkKKwkgIHsKKwkgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgbHAtPmFsbG11bHRpY2FzdCA9IDE7CisJICAgIGxwLT5tY19jb3VudCA9IDA7CisKKwkgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworCSAgICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgICBkZXYtPmZsYWdzIHw9IElGRl9BTExNVUxUSTsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICAvKiBJZiB0aGVyZSBpcyBzb21lIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gc2VuZCAqLworICAgICAgaWYoZGV2LT5tY19saXN0ICE9IChzdHJ1Y3QgZGV2X21jX2xpc3QgKikgTlVMTCkKKwl7CisJICAvKgorCSAgICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgcmVjZWl2ZSBhbGwgcGFja2V0cworCSAgICogaW4gbXVsdGljYXN0IGxpc3QKKwkgICAqLworI2lmZGVmIE1VTFRJQ0FTVF9BVk9JRAorCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5hbGxtdWx0aWNhc3QgfHwKKwkgICAgIChkZXYtPm1jX2NvdW50ICE9IGxwLT5tY19jb3VudCkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIGxwLT5wcm9taXNjdW91cyA9IDA7CisJICAgICAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICAgICAgbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCSAgICAgIHd2XzgyNTkzX3JlY29uZmlnKGRldik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyoKKwkgICAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkgICAqIGNsZWFyIHRoZSBtdWx0aWNhc3QgbGlzdC4KKwkgICAqLworCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5tY19jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKwkgICAgICBscC0+bWNfY291bnQgPSAwOworCisJICAgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKwkgICAgfQorCX0KKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0Li4uCisgKiAoTm90ZSA6IGl0IHdhcyBhIG5pY2Ugd2F5IHRvIHRlc3QgdGhlIHJlY29uZmlndXJlIHN0dWZmLi4uKQorICovCisjaWZkZWYgU0VUX01BQ19BRERSRVNTCitzdGF0aWMgaW50Cit3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCXZvaWQgKgkJYWRkcikKK3sKKyAgc3RydWN0IHNvY2thZGRyICoJbWFjID0gYWRkcjsKKworICAvKiBDb3B5IHRoZSBhZGRyZXNzICovCisgIG1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiBSZWNvbmZpZyB0aGUgYmVhc3QgKi8KKyAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBTRVRfTUFDX0FERFJFU1MgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4uLgorICovCitzdGF0aWMgaW5saW5lIGludAord3Zfc2V0X2ZyZXF1ZW5jeSh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJCSBpd19mcmVxICoJZnJlcXVlbmN5KQoreworICBjb25zdCBpbnQJQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCisgIGxvbmcJCWZyZXEgPSAwTDsJLyogb2Zmc2V0IHRvIDIuNCBHSHogaW4gLjUgTUh6ICovCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBpbnQJCWk7CisjZW5kaWYKKworICAvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAqLworICAvKiBUaGVvcml0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKyAgICogdGhlIHR3byBsaW1pdHMgd2l0aCBhIDAuNSBNSHogcHJlY2lzaW9uLiBJbiBwcmFjdGljZSwKKyAgICogSSBkb24ndCB3YW50IHlvdSB0byBoYXZlIHRyb3VibGUgd2l0aCBsb2NhbAorICAgKiByZWd1bGF0aW9ucy4uLiAqLworICBpZigoZnJlcXVlbmN5LT5lID09IDEpICYmCisgICAgIChmcmVxdWVuY3ktPm0gPj0gKGludCkgMi40MTJlOCkgJiYgKGZyZXF1ZW5jeS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkKKyAgICB7CisgICAgICBmcmVxID0gKChmcmVxdWVuY3ktPm0gLyAxMDAwMCkgLSAyNDAwMEwpIC8gNTsKKyAgICB9CisKKyAgLyogU2V0dGluZyBieSBjaGFubmVsIChzYW1lIGFzIHdmcmVxc2VsKSAqLworICAvKiBXYXJuaW5nIDogZWFjaCBjaGFubmVsIGlzIDIyTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisgICAqIHdpbGwgaW50ZXJmZXJlLi4uICovCisgIGlmKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYKKyAgICAgKGZyZXF1ZW5jeS0+bSA+PSAwKSAmJiAoZnJlcXVlbmN5LT5tIDwgQkFORF9OVU0pKQorICAgIHsKKyAgICAgIC8qIEdldCBmcmVxdWVuY3kgb2Zmc2V0LiAqLworICAgICAgZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworICAgIH0KKworICAvKiBWZXJpZnkgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgIGlmKGZyZXEgIT0gMEwpCisgICAgeworICAgICAgdV9zaG9ydAl0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisKKyAgICAgIC8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgICAgIHRhYmxlLCAxMCk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSB0YWJsZVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICAgIC8qIExvb2sgaW4gdGhlIHRhYmxlIGlmIHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZCAqLworICAgICAgaWYoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJICAgKDEgPDwgKChmcmVxIC0gMjQpICUgMTYpKSkpCisJcmV0dXJuIC1FSU5WQUw7CQkvKiBub3QgYWxsb3dlZCAqLworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAtRUlOVkFMOworCisgIC8qIElmIHdlIGdldCBhIHVzYWJsZSBmcmVxdWVuY3kgKi8KKyAgaWYoZnJlcSAhPSAwTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydAlhcmVhWzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY1syXTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWFyZWFfdmVyaWZ5WzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY192ZXJpZnlbMl07CisgICAgICAvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisgICAgICAgKiBzZWUgQVQmVCBXYXZlbGFuIERhdGEgTWFudWFsLCBSRUYgNDA3LTAyNDY4OS9FLCBwYWdlIDMtOAorICAgICAgICogJiBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkgKi8KKyAgICAgIHVuc2lnbmVkIHNob3J0CXBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKyAgICAgIGludAkJcG93ZXJfYmFuZCA9IDA7CQkvKiBTZWxlY3RlZCBiYW5kICovCisgICAgICB1bnNpZ25lZCBzaG9ydAlwb3dlcl9hZGp1c3Q7CQkvKiBDb3JyZWN0IHZhbHVlICovCisKKyAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGdhaW4gKi8KKyAgICAgIHBvd2VyX2JhbmQgPSAwOworICAgICAgd2hpbGUoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkgICAgKHBvd2VyX2xpbWl0WysrcG93ZXJfYmFuZF0gIT0gMCkpCisJOworCisgICAgICAvKiBSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhLCAxNik7CisKKyAgICAgIC8qIFJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjLCAyKTsKKworICAgICAgLyogUmVhZCB0aGUgbmV3IHBvd2VyIGFkanVzdCB2YWx1ZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2QiAtIChwb3dlcl9iYW5kID4+IDEpLAorCSAgICAgICAmcG93ZXJfYWRqdXN0LCAxKTsKKyAgICAgIGlmKHBvd2VyX2JhbmQgJiAweDEpCisJcG93ZXJfYWRqdXN0ID4+PSA4OworICAgICAgZWxzZQorCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVsYW4gRUVwcm9tIEFyZWEgMSA6Iik7CisgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkgIHByaW50aygiICUwNFgiLAorCQkgYXJlYVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKyAgICAgIC8qIEZyZXF1ZW5jeSBvZmZzZXQgKGZvciBpbmZvIG9ubHkuLi4pICovCisgICAgICBhcmVhWzBdID0gKChmcmVxIDw8IDUpICYgMHhGRkUwKSB8IChhcmVhWzBdICYgMHgxRik7CisKKyAgICAgIC8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMIC0gMzUyTDsKKyAgICAgIGFyZWFbMl0gPSAoKGZyZXEgJiAweDEpIDw8IDQpIHwgKGFyZWFbMl0gJiAweEZGRUYpOworCisgICAgICAvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbMTNdID0gKGZyZXEgPj4gMSkgKyAyNDAwTDsKKyAgICAgIGFyZWFbMTJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworICAgICAgLyogT3RoZXJzIHBhcnQgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuLi4gKi8KKworICAgICAgLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDICovCisgICAgICBkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisgICAgICBkYWNbMF0gPSAoKHBvd2VyX2FkanVzdCAmIDB4MSkgPDwgNCkgfCAoZGFjWzBdICYgMHhGRkVGKTsKKworICAgICAgLyogV3JpdGUgdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDAwLAorCQlhcmVhLCAxNik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBEQUMgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDYwLAorCQlkYWMsIDIpOworCisgICAgICAvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIEVFcHJvbSB3cml0dGluZyB3YXMgb2sgKi8KKworICAgICAgLyogUmVSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhX3ZlcmlmeSwgMTYpOworCisgICAgICAvKiBSZVJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjX3ZlcmlmeSwgMik7CisKKyAgICAgIC8qIENvbXBhcmUgKi8KKyAgICAgIGlmKG1lbWNtcChhcmVhLCBhcmVhX3ZlcmlmeSwgMTYgKiAyKSB8fAorCSBtZW1jbXAoZGFjLCBkYWNfdmVyaWZ5LCAyICogMikpCisJeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJICBwcmludGsoS0VSTl9JTkZPICJXYXZlbGFuOiB3dl9zZXRfZnJlcXVlbmN5IDogdW5hYmxlIHRvIHdyaXRlIG5ldyBmcmVxdWVuY3kgdG8gRUVwcm9tICg/KVxuIik7CisjZW5kaWYKKwkgIHJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKyAgICAgIC8qIFdlIG11c3QgZG93bmxvYWQgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRvIHRoZQorICAgICAgICogc3ludGhldGlzZXJzIChmcm9tIHRoZSBFRXByb20gLSBhcmVhIDEpCisgICAgICAgKiBOb3RlIDogYXMgdGhlIEVFcHJvbSBpcyBhdXRvIGRlY3JlbWVudGVkLCB3ZSBzZXQgdGhlIGVuZAorICAgICAgICogaWYgdGhlIGFyZWEuLi4gKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MEYpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4NjEpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgICAgIC8qIFZlcmlmaWNhdGlvbiBvZiB3aGF0IHdlIGhhdmUgZG9uZS4uLiAqLworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gQXJlYSAxIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSBhcmVhX3ZlcmlmeVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjX3ZlcmlmeVswXSwgZGFjX3ZlcmlmeVsxXSk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIC1FSU5WQUw7CQkvKiBCYWgsIG5ldmVyIGdldCB0aGVyZS4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2l2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2ZyZXF1ZW5jeV9saXN0KHVfbG9uZwliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkgIGl3X2ZyZXEgKglsaXN0LAkvKiBMaXN0IG9mIGZyZXF1ZW5jeSB0byBmaWxsICovCisJCSAgaW50CQltYXgpCS8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jaWVzICovCit7CisgIHVfc2hvcnQJdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworICBsb25nCQlmcmVxID0gMEw7CS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiArIDEyIE1IeiAqLworICBpbnQJCWk7CQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKyAgY29uc3QgaW50CUJBTkRfTlVNID0gMTA7CS8qIE51bWJlciBvZiBiYW5kcyAqLworICBpbnQJCWMgPSAwOwkJLyogQ2hhbm5lbCBudW1iZXIgKi8KKworICAvKiBSZWFkIHRoZSBmcmVxdWVuY3kgdGFibGUgKi8KKyAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgdGFibGUsIDEwKTsKKworICAvKiBMb29rIGFsbCBmcmVxdWVuY2llcyAqLworICBpID0gMDsKKyAgZm9yKGZyZXEgPSAwOyBmcmVxIDwgMTUwOyBmcmVxKyspCisgICAgLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgICAgaWYodGFibGVbOSAtIChmcmVxIC8gMTYpXSAmICgxIDw8IChmcmVxICUgMTYpKSkKKyAgICAgIHsKKwkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJd2hpbGUoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJICAgICAgKGMgPCBCQU5EX05VTSkpCisJICBjKys7CisJbGlzdFtpXS5pID0gYzsJLyogU2V0IHRoZSBsaXN0IGluZGV4ICovCisKKwkvKiBwdXQgaW4gdGhlIGxpc3QgKi8KKwlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJbGlzdFtpKytdLmUgPSAxOworCisJLyogQ2hlY2sgbnVtYmVyICovCisJaWYoaSA+PSBtYXgpCisJICByZXR1cm4oaSk7CisgICAgICB9CisKKyAgcmV0dXJuKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzIDogZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLi4uCisgKiBTb3JyeSwgYnV0IHRoaXMgZnVuY3Rpb24gcmVhbGx5IG5lZWQgd2lyZWxlc3MgZXh0ZW5zaW9ucy4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dsX3NweV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICAgdV9jaGFyICoJbWFjLAkJLyogTUFDIGFkZHJlc3MgKi8KKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIHN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKworICB3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLmxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgd3N0YXRzLm5vaXNlID0gc3RhdHNbMV0gJiBNTVJfU0lMRU5DRV9MVkw7CisgIHdzdGF0cy51cGRhdGVkID0gMHg3OworCisgIC8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworICB3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgbWFjLCAmd3N0YXRzKTsKK30KKyNlbmRpZgkvKiBJV19XSVJFTEVTU19TUFkgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIGFuIGhpc3RvZ3JhbSBvbiB0aGUgc2lnbmFsIGxldmVsLgorICogQXMgdGhlIG5vaXNlIGlzIHF1aXRlIGNvbnN0YW50LCBpdCdzIGxpa2UgZG9pbmcgaXQgb24gdGhlIFNOUi4KKyAqIFdlIGhhdmUgZGVmaW5lZCBhIHNldCBvZiBpbnRlcnZhbCAobHAtPmhpc19yYW5nZSksIGFuZCBlYWNoIHRpbWUKKyAqIHRoZSBsZXZlbCBnb2VzIGluIHRoYXQgaW50ZXJ2YWwsIHdlIGluY3JlbWVudCB0aGUgY291bnQgKGxwLT5oaXNfc3VtKS4KKyAqIFdpdGggdGhpcyBoaXN0b2dyYW0geW91IG1heSBkZXRlY3QgaWYgb25lIHdhdmVsYW4gaXMgcmVhbGx5IHdlYWssCisgKiBvciB5b3UgbWF5IGFsc28gY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxldmVsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord2xfaGlzX2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdV9jaGFyCWxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgaW50CQlpOworCisgIC8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwgKi8KKyAgaSA9IDA7CisgIHdoaWxlKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKQorICAgIDsKKworICAvKiBJbmNyZW1lbnQgaW50ZXJ2YWwgY291bnRlciAqLworICAobHAtPmhpc19zdW1baV0pKys7Cit9CisjZW5kaWYJLyogSElTVE9HUkFNICovCisKK3N0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybmNweShpbmZvLT5kcml2ZXIsICJ3YXZlbGFuX2NzIiwgc2l6ZW9mKGluZm8tPmRyaXZlciktMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIldhdmVMQU4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTldJRAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGRldiwKKwkJCSAgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKworCQkvKiBTZXQgTldJRCBpbiBtbWMuICovCisJCW0udy5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCQltLncubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKwkJbW1jX3dyaXRlKGJhc2UsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwgMHgwMCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBOV0lEIGluIHRoZSBwc2EuICovCisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAweDAwOworCQlwc2Ffd3JpdGUoZGV2LAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2xvb3B0X3NlbCksCisJCQlNTVdfTE9PUFRfU0VMX0RJU19OV0lEKTsKKwl9CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOV0lEIAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIE5XSUQuICovCisJcHNhX3JlYWQoZGV2LAorCQkgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisJd3JxdS0+bndpZC52YWx1ZSA9IChwc2EucHNhX253aWRbMF0gPDwgOCkgKyBwc2EucHNhX253aWRbMV07CisJd3JxdS0+bndpZC5kaXNhYmxlZCA9ICEocHNhLnBzYV9ud2lkX3NlbGVjdCk7CisJd3JxdS0+bndpZC5maXhlZCA9IDE7CS8qIFN1cGVyZmx1b3VzICovCisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGJhc2UsICYod3JxdS0+ZnJlcSkpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLgorCSAqIERvZXMgaXQgd29yayBmb3IgZXZlcnlib2R5LCBlc3BlY2lhbGx5IG9sZCBjYXJkcz8gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGJhc2UsIDB4MDAsICZmcmVxLCAxKTsKKwkJd3JxdS0+ZnJlcS5tID0gKChmcmVxID4+IDUpICogNSArIDI0MDAwTCkgKiAxMDAwMDsKKwkJd3JxdS0+ZnJlcS5lID0gMTsKKwl9IGVsc2UgeworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFNldCB0aGUgbGV2ZWwgdGhyZXNob2xkLiAqLworCS8qIFdlIHNob3VsZCBjb21wbGFpbiBsb3VkbHkgaWYgd3JxdS0+c2Vucy5maXhlZCA9IDAsIGJlY2F1c2Ugd2UKKwkgKiBjYW4ndCBzZXQgYXV0byBtb2RlLi4uICovCisJcHNhLnBzYV90aHJfcHJlX3NldCA9IHdycXUtPnNlbnMudmFsdWUgJiAweDNGOworCXBzYV93cml0ZShkZXYsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X3Rocl9wcmVfc2V0KSwKKwkJcHNhLnBzYV90aHJfcHJlX3NldCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIGxldmVsIHRocmVzaG9sZC4gKi8KKwlwc2FfcmVhZChkZXYsCisJCSAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJd3JxdS0+c2Vucy52YWx1ZSA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCXdycXUtPnNlbnMuZml4ZWQgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBzYV90IHBzYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBjYXBhYmxlIG9mIGVuY3J5cHRpb24gKi8KKwlpZiAoIW1tY19lbmNyKGJhc2UpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShkZXYsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgOCArIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShiYXNlLCBtbXdvZmYoMCwgbW13X2VuY3Jfa2V5KSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9rZXksIDgpOworCQl9CisKKwkJLyogZGlzYWJsZSBlbmNyeXB0aW9uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisJCQlwc2Ffd3JpdGUoZGV2LAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLCAwKTsKKwkJfQorCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZW5jcnlwdGlvbiBrZXkKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGVuY3J5cHRpb24gaXMgYXZhaWxhYmxlICovCisJaWYgKCFtbWNfZW5jcihiYXNlKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCSBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEgKyA4KTsKKworCQkvKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQgPyAqLworCQlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVsc2UKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl3cnF1LT5lbmNvZGluZy5mbGFncyB8PSBtbWNfZW5jcihiYXNlKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGRpc2FibGUgKi8KKwlpZih3cnF1LT5kYXRhLmZsYWdzID09IDApCisJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJZWxzZSB7CisJCWNoYXIJZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwkJY2hhciAqCWVuZHA7CisKKwkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJbWVtY3B5KGVzc2lkLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQllc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0RXNzaWQgOiBgYCVzJydcbiIsIGVzc2lkKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisKKwkJLyogQ29udmVydCB0byBhIG51bWJlciAobm90ZSA6IFdhdmVsYW4gc3BlY2lmaWMpICovCisJCWxwLT5kb21haW5faWQgPSBzaW1wbGVfc3RydG91bChlc3NpZCwgJmVuZHAsIDE2KTsKKwkJLyogSGFzIGl0IHdvcmtlZCAgPyAqLworCQlpZihlbmRwID4gZXNzaWQpCisJCQlscC0+ZmlsdGVyX2RvbWFpbnMgPSAxOworCQllbHNlIHsKKwkJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogSXMgdGhlIGRvbWFpbiBJRCBhY3RpdmUgPyAqLworCXdycXUtPmRhdGEuZmxhZ3MgPSBscC0+ZmlsdGVyX2RvbWFpbnM7CisKKwkvKiBDb3B5IERvbWFpbiBJRCBpbnRvIGEgc3RyaW5nIChXYXZlbGFuIHNwZWNpZmljKSAqLworCS8qIFNvdW5kIGNyYXp5LCBiZSB3ZSBjYW4ndCBoYXZlIGEgc25wcmludGYgaW4gdGhlIGtlcm5lbCAhISEgKi8KKwlzcHJpbnRmKGV4dHJhLCAiJWxYIiwgbHAtPmRvbWFpbl9pZCk7CisJZXh0cmFbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCS8qIFNldCB0aGUgbGVuZ3RoICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiU2V0IEFQIHRvIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVswXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzFdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbMl0sCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVszXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzRdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbNV0pOworI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwkvKiBTaG91bGQgZ2V0IHRoZSByZWFsIE1jQ295IGluc3RlYWQgb2Ygb3duIEV0aGVybmV0IGFkZHJlc3MgKi8KKwltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLCBXQVZFTEFOX0FERFJfU0laRSk7CisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIG1vZGUgKi8KKwlzd2l0Y2god3JxdS0+bW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYoZG9fcm9hbWluZykgeworCQkJd3Zfcm9hbV9jbGVhbnVwKGRldik7CisJCQlkb19yb2FtaW5nID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWlmKCFkb19yb2FtaW5nKSB7CisJCQl3dl9yb2FtX2luaXQoZGV2KTsKKwkJCWRvX3JvYW1pbmcgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlpZihkb19yb2FtaW5nKQorCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwllbHNlCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FESE9DOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisKKwkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CisKKwkvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdC4gICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSAxLjQgKiAxMDAwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4RkZGRjsKKworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBNTVJfU0dOTF9RVUFMOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IE1NUl9TSUdOQUxfTFZMOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IE1NUl9TSUxFTkNFX0xWTDsKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7IC8qIEFsd2F5cyBtYXggKi8KKwkvKiBOZWVkIHRvIGdldCBiZXR0ZXIgdmFsdWVzIGZvciB0aG9zZSB0d28gKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAzMDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSA4OworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAyMDAwMDAwOwkvKiAyIE1iL3MgKi8KKworCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX01BU0soMHg4QjAyKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSygweDhCMDYpKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChiYXNlLCByYW5nZS0+ZnJlcSwKKwkJCQkJCQlJV19NQVhfRlJFUVVFTkNJRVMpOworCX0gZWxzZQorCQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOworCisJLyogRW5jcnlwdGlvbiBzdXBwb3J0ZWQgPyAqLworCWlmIChtbWNfZW5jcihiYXNlKSkgeworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDg7CS8qIERFUyA9IDY0IGJpdHMga2V5ICovCisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoZGV2LAorCQkgIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCXBzYV9yZWFkKGRldiwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCByb2FtaW5nCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBOb3RlIDogc2hvdWxkIGNoZWNrIGlmIHVzZXIgPT0gcm9vdCAqLworCWlmKGRvX3JvYW1pbmcgJiYgKCpleHRyYSk9PTApCisJCXd2X3JvYW1fY2xlYW51cChkZXYpOworCWVsc2UgaWYoZG9fcm9hbWluZz09MCAmJiAoKmV4dHJhKSE9MCkKKwkJd3Zfcm9hbV9pbml0KGRldik7CisKKwlkb19yb2FtaW5nID0gKCpleHRyYSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwkqKGV4dHJhKSA9IGRvX3JvYW1pbmc7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3Mgd2F2ZWxhbl9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBTSU9DU0lQUVRIUiwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cXVhbHRociIgfSwKKyAgeyBTSU9DR0lQUVRIUiwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cXVhbHRociIgfSwKKyAgeyBTSU9DU0lQUk9BTSwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cm9hbSIgfSwKKyAgeyBTSU9DR0lQUk9BTSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cm9hbSIgfSwKKyAgeyBTSU9DU0lQSElTVE8sIElXX1BSSVZfVFlQRV9CWVRFIHwgMTYsICAgICAgICAgICAgICAgICAgICAwLCAic2V0aGlzdG8iIH0sCisgIHsgU0lPQ0dJUEhJU1RPLCAwLCAgICAgICAgICAgICAgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwgImdldGhpc3RvIiB9LAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworCXdhdmVsYW5fc2V0X21vZGUsCQkvKiBTSU9DU0lXTU9ERSAqLworCXdhdmVsYW5fZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXTU9ERSAqLworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCXdhdmVsYW5fc2V0X3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCXdhdmVsYW5fZ2V0X3NlbnMsCQkvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLworCXdhdmVsYW5fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCS8qIFNJT0NHSVdUSFJTUFkgKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisJd2F2ZWxhbl9zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJd2F2ZWxhbl9nZXRfd2FwLAkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCXdhdmVsYW5fc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJd2F2ZWxhbl9nZXRfZXNzaWQsCQkvKiBTSU9DR0lXRVNTSUQgKi8KKyNlbHNlCS8qIFdBVkVMQU5fUk9BTUlOR19FWFQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisJd2F2ZWxhbl9zZXRfcm9hbSwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDIgKi8KKwl3YXZlbGFuX2dldF9yb2FtLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMyAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICsgMiAqLworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDMgKi8KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKyNpZmRlZiBISVNUT0dSQU0KKwl3YXZlbGFuX3NldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDQgKi8KKwl3YXZlbGFuX2dldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDUgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJd2F2ZWxhbl9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3YXZlbGFuX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3YXZlbGFuX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IHdhdmVsYW5faGFuZGxlciwKKwkucHJpdmF0ZQk9IHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSB3YXZlbGFuX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHdpcmVsZXNzIHN0YXRpc3RpY3MKKyAqIENhbGxlZCBieSAvcHJvYy9uZXQvd2lyZWxlc3MuLi4KKyAqLworc3RhdGljIGl3X3N0YXRzICoKK3dhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIG1tcl90CQkJbTsKKyAgaXdfc3RhdHMgKgkJd3N0YXRzOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgd3N0YXRzID0gJmxwLT53c3RhdHM7CisKKyAgLyogR2V0IGRhdGEgZnJvbSB0aGUgbW1jICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworICBtbWNfcmVhZChiYXNlLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmbS5tbXJfZGNlX3N0YXR1cywgMSk7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfd3JvbmdfbndpZF9sKSwgJm0ubW1yX3dyb25nX253aWRfbCwgMik7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfdGhyX3ByZV9zZXQpLCAmbS5tbXJfdGhyX3ByZV9zZXQsIDQpOworCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworICAvKiBDb3B5IGRhdGEgdG8gd2lyZWxlc3Mgc3R1ZmYgKi8KKyAgd3N0YXRzLT5zdGF0dXMgPSBtLm1tcl9kY2Vfc3RhdHVzICYgTU1SX0RDRV9TVEFUVVM7CisgIHdzdGF0cy0+cXVhbC5xdWFsID0gbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworICB3c3RhdHMtPnF1YWwubm9pc2UgPSBtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTDsKKyAgd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSAoKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDcpIHwKKwkJCSAgKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDYpIHwKKwkJCSAgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworICB3c3RhdHMtPmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworICB3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWwgd2l0aCByZWNlaXZpbmcgdGhlIHBhY2tldHMuCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0IGFuIGludGVycnVwdCB3aGVuIGEgcGFja2V0IGhhcyBiZWVuCisgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYW5kIGNhbGxlZCB0aGlzIHBhcnQuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsY3VsYXRlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmcmFtZSBwb2ludGVkIHRvIGJ5IHRoZSByZWNlaXZlCisgKiBmcmFtZSBwb2ludGVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZnJhbWUgc2VlbSBjb3JyZWN0CisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X3N0YXJ0X29mX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkgIGludAkJcmZwLAkvKiBlbmQgb2YgZnJhbWUgKi8KKwkJICBpbnQJCXdyYXApCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworeworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlycDsKKyAgaW50CQlsZW47CisKKyAgcnAgPSAocmZwIC0gNSArIFJYX1NJWkUpICUgUlhfU0laRTsKKyAgb3V0YihycCAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKHJwID4+IDgpICYgUElPUkhfTUFTSyksIFBJT1JIKGJhc2UpKTsKKyAgbGVuID0gaW5iKFBJT1AoYmFzZSkpOworICBsZW4gfD0gaW5iKFBJT1AoYmFzZSkpIDw8IDg7CisKKyAgLyogU2FuaXR5IGNoZWNrcyBvbiBzaXplICovCisgIC8qIEZyYW1lIHRvbyBiaWcgKi8KKyAgaWYobGVuID4gTUFYREFUQVogKyAxMDApCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIGZyYW1lIHRvbyBsYXJnZSwgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorICAKKyAgLyogRnJhbWUgdG9vIHNob3J0ICovCisgIGlmKGxlbiA8IDcpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIG51bGwgZnJhbWUsIHJmcCAlZCBsZW4gMHgleFxuIiwKKwkgICAgIGRldi0+bmFtZSwgcmZwLCBsZW4pOworI2VuZGlmCisgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgCisgIC8qIFdyYXAgYXJvdW5kIGJ1ZmZlciAqLworICBpZihsZW4gPiAoKHdyYXAgLSAocmZwIC0gbGVuKSArIFJYX1NJWkUpICUgUlhfU0laRSkpCS8qIG1hZ2ljIGZvcm11bGEgISAqLworICAgIHsKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3N0YXJ0X29mX2ZyYW1lOiB3cmFwIGFyb3VuZCBidWZmZXIsIHdyYXAgJWQgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCB3cmFwLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgIHJldHVybigocnAgLSBsZW4gKyBSWF9TSVpFKSAlIFJYX1NJWkUpOworfSAvKiB3dl9zdGFydF9vZl9mcmFtZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgdGhlIGFjdHVhbCBjb3B5IG9mIGRhdGEgKGluY2x1ZGluZyB0aGUgZXRoZXJuZXQKKyAqIGhlYWRlciBzdHJ1Y3R1cmUpIGZyb20gdGhlIFdhdmVMQU4gY2FyZCB0byBhbiBza19idWZmIGNoYWluIHRoYXQKKyAqIHdpbGwgYmUgcGFzc2VkIHVwIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZSBsYXllci4gTk9URTogV2UKKyAqIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgdHJhaWxlciBwcm90b2NvbHMgKG5laXRoZXIgZG9lcyB0aGUgcmVzdCBvZgorICogdGhlIG5ldHdvcmsgaW50ZXJmYWNlKSwgc28gaWYgdGhhdCBpcyBuZWVkZWQsIGl0IHdpbGwgKGF0IGxlYXN0IGluCisgKiBwYXJ0KSBiZSBhZGRlZCBoZXJlLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlIHJpbmcgYnVmZmVyIGFyZQorICogY29waWVkIHRvIGEgbWVzc2FnZSBjaGFpbiB0aGF0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBrZXJuZWwuCisgKgorICogTm90ZTogaWYgYW55IGVycm9ycyBvY2N1ciwgdGhlIHBhY2tldCBpcyAiZHJvcHBlZCBvbiB0aGUgZmxvb3IiCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCisJICAgICAgIGludAkJZmRfcCwKKwkgICAgICAgaW50CQlza3NpemUpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHN0cnVjdCBza19idWZmICoJc2tiOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgZGV2LT5uYW1lLCBmZF9wLCBza3NpemUpOworI2VuZGlmCisKKyAgLyogQWxsb2NhdGUgc29tZSBidWZmZXIgZm9yIHRoZSBuZXcgcGFja2V0ICovCisgIGlmKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSsyKSkgPT0gKHN0cnVjdCBza19idWZmICopIE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcGFja2V0X3JlYWQoKTogY291bGQgbm90IGFsbG9jX3NrYiglZCwgR0ZQX0FUT01JQylcbiIsCisJICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKyAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAvKgorICAgICAgICogTm90IG9ubHkgZG8gd2Ugd2FudCB0byByZXR1cm4gaGVyZSwgYnV0IHdlIGFsc28gbmVlZCB0byBkcm9wIHRoZQorICAgICAgICogcGFja2V0IG9uIHRoZSBmbG9vciB0byBjbGVhciB0aGUgaW50ZXJydXB0LgorICAgICAgICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIHNrYi0+ZGV2ID0gZGV2OworCisgIHNrYl9yZXNlcnZlKHNrYiwgMik7CisgIGZkX3AgPSByZWFkX3JpbmdidWYoZGV2LCBmZF9wLCAoY2hhciAqKSBza2JfcHV0KHNrYiwgc2tzaXplKSwgc2tzaXplKTsKKyAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJLyogREVCVUdfUlhfSU5GTyAqLworICAgICAKKyAgLyogU3RhdGlzdGljcyBnYXRoZXJpbmcgJiBzdHVmZiBhc3NvY2lhdGVkLgorICAgKiBJdCBzZWVtIGEgYml0IG1lc3N5IHdpdGggYWxsIHRoZSBkZWZpbmUsIGJ1dCBpdCdzIHJlYWxseSBzaW1wbGUuLi4gKi8KKyAgaWYoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisgICAgIChscC0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisgICAgIChscC0+aGlzX251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgIChkb19yb2FtaW5nKSB8fAorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworICAgICAwKQorICAgIHsKKyAgICAgIHVfY2hhcglzdGF0c1szXTsJLyogU2lnbmFsIGxldmVsLCBOb2lzZSBsZXZlbCwgU2lnbmFsIHF1YWxpdHkgKi8KKworICAgICAgLyogcmVhZCBzaWduYWwgbGV2ZWwsIHNpbGVuY2UgbGV2ZWwgYW5kIHNpZ25hbCBxdWFsaXR5IGJ5dGVzICovCisgICAgICBmZF9wID0gcmVhZF9yaW5nYnVmKGRldiwgKGZkX3AgKyA0KSAlIFJYX1NJWkUgKyBSWF9CQVNFLAorCQkJICBzdGF0cywgMyk7CisjaWZkZWYgREVCVUdfUlhfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBTaWduYWwgbGV2ZWwgJWQvNjMsIFNpbGVuY2UgbGV2ZWwgJWQvNjMsIHNpZ25hbCBxdWFsaXR5ICVkLzE2XG4iLAorCSAgICAgZGV2LT5uYW1lLCBzdGF0c1swXSAmIDB4M0YsIHN0YXRzWzFdICYgMHgzRiwgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgICBpZihkb19yb2FtaW5nKQorCWlmKFdBVkVMQU5fQkVBQ09OKHNrYi0+ZGF0YSkpCisJICB3bF9yb2FtX2dhdGhlcihkZXYsIHNrYi0+ZGF0YSwgc3RhdHMpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCSAgCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgICB3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsIHN0YXRzKTsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKyNpZmRlZiBISVNUT0dSQU0KKyAgICAgIHdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYJLyogSElTVE9HUkFNICovCisgICAgfQorCisgIC8qCisgICAqIEhhbmQgdGhlIHBhY2tldCB0byB0aGUgTmV0d29yayBNb2R1bGUKKyAgICovCisgIG5ldGlmX3J4KHNrYik7CisKKyAgLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlICovCisgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBza3NpemU7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBpbml0aWF0ZSBhCisgKiBwYWNrZXQgdHJhbnNmZXIgZnJvbSB0aGUgY2FyZCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UgbGF5ZXIgYWJvdmUKKyAqIHRoaXMgZHJpdmVyLiAgVGhpcyByb3V0aW5lIGNoZWNrcyBpZiBhIGJ1ZmZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAqIHJlY2VpdmVkIGJ5IHRoZSBXYXZlTEFOIGNhcmQuICBJZiBzbywgdGhlIHJvdXRpbmUgd3ZfcGFja2V0X3JlYWQgaXMKKyAqIGNhbGxlZCB0byBkbyB0aGUgYWN0dWFsIHRyYW5zZmVyIG9mIHRoZSBjYXJkJ3MgZGF0YSBpbmNsdWRpbmcgdGhlCisgKiBldGhlcm5ldCBoZWFkZXIgaW50byBhIHBhY2tldCBjb25zaXN0aW5nIG9mIGFuIHNrX2J1ZmYgY2hhaW4uCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCkpCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMgYW5kIGlycSBhcmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfcGFja2V0X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgaW50CQluZXdyZnA7CisgIGludAkJcnA7CisgIGludAkJbGVuOworICBpbnQJCWZfc3RhcnQ7CisgIGludAkJc3RhdHVzOworICBpbnQJCWk1OTNfcmZwOworICBpbnQJCXN0YXRfcHRyOworICB1X2NoYXIJY1s0XTsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfcmN2KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBHZXQgdGhlIG5ldyByZWNlaXZlIGZyYW1lIHBvaW50ZXIgZnJvbSB0aGUgaTgyNTkzIGNoaXAgKi8KKyAgb3V0YihDUjBfU1RBVFVTXzIgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKyAgaTU5M19yZnAgPSBpbmIoTENTUihiYXNlKSk7CisgIGk1OTNfcmZwIHw9IGluYihMQ1NSKGJhc2UpKSA8PCA4OworICBpNTkzX3JmcCAlPSBSWF9TSVpFOworCisgIC8qIEdldCB0aGUgbmV3IHJlY2VpdmUgZnJhbWUgcG9pbnRlciBmcm9tIHRoZSBXYXZlTEFOIGNhcmQuCisgICAqIEl0IGlzIDMgYnl0ZXMgbW9yZSB0aGFuIHRoZSBpbmNyZW1lbnQgb2YgdGhlIGk4MjU5MyByZWNlaXZlCisgICAqIGZyYW1lIHBvaW50ZXIsIGZvciBlYWNoIHBhY2tldC4gVGhpcyBpcyBiZWNhdXNlIGl0IGluY2x1ZGVzIHRoZQorICAgKiAzIHJvYW1pbmcgYnl0ZXMgYWRkZWQgYnkgdGhlIG1tYy4KKyAgICovCisgIG5ld3JmcCA9IGluYihSUExMKGJhc2UpKTsKKyAgbmV3cmZwIHw9IGluYihSUExIKGJhc2UpKSA8PCA4OworICBuZXdyZnAgJT0gUlhfU0laRTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmN2KCk6IGk1OTNfcmZwICVkIHN0b3AgJWQgbmV3cmZwICVkIGxwLT5yZnAgJWRcbiIsCisJIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAvKiBJZiBubyBuZXcgZnJhbWUgcG9pbnRlci4uLiAqLworICBpZihscC0+b3ZlcnJ1bm5pbmcgfHwgbmV3cmZwID09IGxwLT5yZnApCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3BhY2tldF9yY3YoKTogbm8gbmV3IGZyYW1lOiBpNTkzX3JmcCAlZCBzdG9wICVkIG5ld3JmcCAlZCBscC0+cmZwICVkXG4iLAorCSAgIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyAgLyogUmVhZCBhbGwgZnJhbWVzIChwYWNrZXRzKSByZWNlaXZlZCAqLworICB3aGlsZShuZXdyZnAgIT0gbHAtPnJmcCkKKyAgICB7CisgICAgICAvKiBBIGZyYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBwYWNrZXQsIGZvbGxvd2VkIGJ5IGEgc3RhdHVzIHdvcmQsCisgICAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSAod29yZCkgYW5kIHRoZSBtbWMgaW5mbyAoU05SICYgcXVhbCkuCisgICAgICAgKiBJdCdzIGJlY2F1c2UgdGhlIGxlbmd0aCBpcyBhdCB0aGUgZW5kIHRoYXQgd2UgY2FuIG9ubHkgc2NhbgorICAgICAgICogZnJhbWVzIGJhY2t3YXJkLiAqLworCisgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBmcmFtZSBieSBza2lwcGluZyBiYWNrd2FyZHMgb3ZlciB0aGUgZnJhbWVzICovCisgICAgICBycCA9IG5ld3JmcDsJLyogRW5kIG9mIGxhc3QgZnJhbWUgKi8KKyAgICAgIHdoaWxlKCgoZl9zdGFydCA9IHd2X3N0YXJ0X29mX2ZyYW1lKGRldiwgcnAsIG5ld3JmcCkpICE9IGxwLT5yZnApICYmCisJICAgIChmX3N0YXJ0ICE9IC0xKSkKKwkgIHJwID0gZl9zdGFydDsKKworICAgICAgLyogSWYgd2UgaGFkIGEgcHJvYmxlbSAqLworICAgICAgaWYoZl9zdGFydCA9PSAtMSkKKwl7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkgIHByaW50ayhLRVJOX0lORk8gIndhdmVsYW5fY3M6IGNhbm5vdCBmaW5kIHN0YXJ0IG9mIGZyYW1lICIpOworCSAgcHJpbnRrKCIgaTU5M19yZnAgJWQgc3RvcCAlZCBuZXdyZnAgJWQgbHAtPnJmcCAlZFxuIiwKKwkJIGk1OTNfcmZwLCBscC0+c3RvcCwgbmV3cmZwLCBscC0+cmZwKTsKKyNlbmRpZgorCSAgbHAtPnJmcCA9IHJwOwkJLyogR2V0IHRvIHRoZSBsYXN0IHVzYWJsZSBmcmFtZSAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBmX3N0YXJ0IHBvaW50IHRvIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGZpcnN0IGZyYW1lIHJlY2VpdmVkCisgICAgICAgKiBhbmQgcnAgdG8gdGhlIGJlZ2dpbmluZyBvZiB0aGUgbmV4dCBvbmUgKi8KKworICAgICAgLyogUmVhZCBzdGF0dXMgJiBsZW5ndGggb2YgdGhlIGZyYW1lICovCisgICAgICBzdGF0X3B0ciA9IChycCAtIDcgKyBSWF9TSVpFKSAlIFJYX1NJWkU7CisgICAgICBzdGF0X3B0ciA9IHJlYWRfcmluZ2J1ZihkZXYsIHN0YXRfcHRyLCBjLCA0KTsKKyAgICAgIHN0YXR1cyA9IGNbMF0gfCAoY1sxXSA8PCA4KTsKKyAgICAgIGxlbiA9IGNbMl0gfCAoY1szXSA8PCA4KTsKKworICAgICAgLyogQ2hlY2sgc3RhdHVzICovCisgICAgICBpZigoc3RhdHVzICYgUlhfUkNWX09LKSAhPSBSWF9SQ1ZfT0spCisJeworCSAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfTk9fU0ZEKQorCSAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICBpZihzdGF0dXMgJiBSWF9DUkNfRVJSKQorCSAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfT1ZSUlVOKQorCSAgICBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKworI2lmZGVmIERFQlVHX1JYX0ZBSUwKKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfcGFja2V0X3JjdigpOiBwYWNrZXQgbm90IHJlY2VpdmVkIG9rLCBzdGF0dXMgPSAweCV4XG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCS8qIFJlYWQgdGhlIHBhY2tldCBhbmQgdHJhbnNtaXQgdG8gTGludXggKi8KKwl3dl9wYWNrZXRfcmVhZChkZXYsIGZfc3RhcnQsIGxlbiAtIDIpOworCisgICAgICAvKiBPbmUgZnJhbWUgaGFzIGJlZW4gcHJvY2Vzc2VkLCBza2lwIGl0ICovCisgICAgICBscC0+cmZwID0gcnA7CisgICAgfQorCisgIC8qCisgICAqIFVwZGF0ZSB0aGUgZnJhbWUgc3RvcCByZWdpc3RlciwgYnV0IHNldCBpdCB0byBsZXNzIHRoYW4KKyAgICogdGhlIGZ1bGwgOEsgdG8gYWxsb3cgc3BhY2UgZm9yIDMgYnl0ZXMgb2Ygc2lnbmFsIHN0cmVuZ3RoCisgICAqIHBlciBwYWNrZXQuCisgICAqLworICBscC0+c3RvcCA9IChpNTkzX3JmcCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihDUjFfU1RPUF9SRUdfVVBEQVRFIHwgKGxwLT5zdG9wID4+IFJYX1NJWkVfU0hJRlQpLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihPUDFfU1dJVF9UT19QT1JUXzAsIExDQ1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF9yY3YoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbCB3aXRoIHNlbmRpbmcgcGFja2V0IHRocm91Z2ggdGhlIHdhdmVsYW4KKyAqIFdlIGNvcHkgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBidWZmZXIgYW5kIHRoZW4gaXNzdWUgdGhlIHNlbmQKKyAqIGNvbW1hbmQgdG8gdGhlIGk4MjU5My4gVGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3aWxsIGJlCisgKiBjaGVja2VkIGluIHdhdmVsYW5faW50ZXJydXB0KCkKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYW5kIG1lbW9yeQorICogbG9jYXRpb25zIG9uIHRoZSBXYXZlTEFOIGNhcmQgYW5kIHN0YXJ0cyB0aGUgY2FyZCBvZmYgb24KKyAqIHRoZSB0cmFuc21pdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJdm9pZCAqCQlidWYsCisJCXNob3J0CQlsZW5ndGgpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisgIGludAkJCWNsZW4gPSBsZW5ndGg7CisgIHJlZ2lzdGVyIHVfc2hvcnQJeG10ZGF0YV9iYXNlID0gVFhfQkFTRTsKKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfd3JpdGUoJWQpXG4iLCBkZXYtPm5hbWUsIGxlbmd0aCk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogV3JpdGUgdGhlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlciBmb2xsb3dlZCBieSB0aGUgYnVmZmVyICovCisgIG91dGIoeG10ZGF0YV9iYXNlICYgMHhmZiwgUElPUkwoYmFzZSkpOworICBvdXRiKCgoeG10ZGF0YV9iYXNlID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihjbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGxzYiAqLworICBvdXRiKGNsZW4gPj4gOCwgUElPUChiYXNlKSk7ICAJLyogbXNiICovCisKKyAgLyogU2VuZCB0aGUgZGF0YSAqLworICBvdXRzYihQSU9QKGJhc2UpLCBidWYsIGNsZW4pOworCisgIC8qIEluZGljYXRlIGVuZCBvZiB0cmFuc21pdCBjaGFpbiAqLworICBvdXRiKE9QMF9OT1AsIFBJT1AoYmFzZSkpOworICAvKiBqb3N1bGx2bkBjcy5jbXUuZWR1OiBuZWVkIHRvIHNlbmQgYSBzZWNvbmQgTk9QIGZvciBhbGlnbm1lbnQuLi4gKi8KKyAgb3V0YihPUDBfTk9QLCBQSU9QKGJhc2UpKTsKKworICAvKiBSZXNldCB0aGUgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgLyogU2VuZCB0aGUgdHJhbnNtaXQgY29tbWFuZCAqLworICB3dl84MjU5M19jbWQoZGV2LCAid3ZfcGFja2V0X3dyaXRlKCk6IHRyYW5zbWl0IiwKKwkgICAgICAgT1AwX1RSQU5TTUlULCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIHdpbGwga2VlcCBxdWlldCBmb3IgYSB3aGlsZSAqLworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAvKiBLZWVwIHN0YXRzIHVwIHRvIGRhdGUgKi8KKyAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX1RYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oKHVfY2hhciAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3dyaXRlIik7CisjZW5kaWYJLyogREVCVUdfVFhfSU5GTyAqLworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBzZW5kIGEgcGFja2V0IChORVQzIGNhbGxiYWNrKQorICogSW4gdGhpcyByb3V0aW5lLCB3ZSBjaGVjayBpZiB0aGUgaGFyd2FyZSBpcyByZWFkeSB0byBhY2NlcHQKKyAqIHRoZSBwYWNrZXQuIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiBUaGVuLCB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0Li4uCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKglza2IsCisJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fcGFja2V0X3htaXQoMHglWClcbiIsIGRldi0+bmFtZSwKKwkgKHVuc2lnbmVkKSBza2IpOworI2VuZGlmCisKKyAgLyoKKyAgICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nIGEgcHJldmlvdXMgdHJhbnNtaXQuCisgICAqIEluIG90aGVyIHdvcmRzLCBwcmV2ZW50IHJlZW50ZXJpbmcgdGhpcyByb3V0aW5lLgorICAgKi8KKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIC8qIElmIHNvbWVib2R5IGhhcyBhc2tlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciwKKyAgICogd2UgY2FuIGRvIGl0IG5vdyAqLworICBpZihscC0+cmVjb25maWdfODI1OTMpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIHd2XzgyNTkzX2NvbmZpZyhkZXYpOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAvKiBOb3RlIDogdGhlIGNvbmZpZ3VyZSBwcm9jZWR1cmUgd2FzIHRvdGFsbHkgc3luY2hyb25vdXMsCisgICAgICAgKiBzbyB0aGUgVHggYnVmZmVyIGlzIG5vdyBmcmVlICovCisgICAgfQorCisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwlpZiAoc2tiLT5uZXh0KQorCQlwcmludGsoS0VSTl9JTkZPICJza2IgaGFzIG5leHRcbiIpOworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHNvbWUgcGFkZGluZyAqLworCS8qIE5vdGUgOiBvbiB3aXJlbGVzcyB0aGUgcHJvcGFnYXRpb24gdGltZSBpcyBpbiB0aGUgb3JkZXIgb2YgMXVzLAorCSAqIGFuZCB3ZSBkb24ndCBoYXZlIHRoZSBFdGhlcm5ldCBzcGVjaWZpYyByZXF1aXJlbWVudCBvZiBiZWVpbmcKKwkgKiBhYmxlIHRvIGRldGVjdCBjb2xsaXNpb25zLCB0aGVyZWZvcmUgaW4gdGhlb3J5IHdlIGRvbid0IHJlYWxseQorCSAqIG5lZWQgdG8gcGFkLiBKZWFuIElJICovCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKyAgd3ZfcGFja2V0X3dyaXRlKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKyAgZGV2X2tmcmVlX3NrYihza2IpOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fcGFja2V0X3htaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZG8gdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgbW13X3QJCW07CisgIGludAkJY29uZmlndXJlZDsKKyAgaW50CQlpOwkJLyogTG9vcCBjb3VudGVyICovCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisgIHBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisgIC8qCisgICAqIENoZWNrIHRoZSBmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlIE1BQyBhZGRyIGZvciB0aGUgbWFudWZhY3R1cmVyJ3MgY29kZS4KKyAgICogTm90ZTogSWYgeW91IGdldCB0aGUgZXJyb3IgbWVzc2FnZSBiZWxvdywgeW91J3ZlIGdvdCBhCisgICAqIG5vbi1OQ1IvQVQmVC9MdWNlbnQgUENNQ0lBIGNhcmRzLCBzZWUgd2F2ZWxhbl9jcy5oIGZvciBkZXRhaWwgb24KKyAgICogaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGNhcmQuLi4KKyAgICovCisgIGZvcihpID0gMDsgaSA8IChzaXplb2YoTUFDX0FERFJFU1NFUykgLyBzaXplb2YoY2hhcikgLyAzKTsgaSsrKQorICAgIGlmKChwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0gPT0gTUFDX0FERFJFU1NFU1tpXVswXSkgJiYKKyAgICAgICAocHNhLnBzYV91bml2X21hY19hZGRyWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisgICAgICAgKHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSA9PSBNQUNfQUREUkVTU0VTW2ldWzJdKSkKKyAgICAgIGJyZWFrOworCisgIC8qIElmIHdlIGhhdmUgbm90IGZvdW5kIGl0Li4uICovCisgIGlmKGkgPT0gKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd3ZfbW1jX2luaXQoKTogSW52YWxpZCBNQUMgYWRkcmVzczogJTAyWDolMDJYOiUwMlg6Li4uXG4iLAorCSAgICAgZGV2LT5uYW1lLCBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sCisJICAgICBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMV0sIHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworICBtZW1jcHkoJmRldi0+ZGV2X2FkZHJbMF0sICZwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisgIGNvbmZpZ3VyZWQgPSBwc2EucHNhX2NvbmZfc3RhdHVzICYgMTsKKyNlbHNlCisgIGNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKyAgLyogSXMgdGhlIFBTQSBpcyBub3QgY29uZmlndXJlZCAqLworICBpZighY29uZmlndXJlZCkKKyAgICB7CisgICAgICAvKiBVc2VyIHdpbGwgYmUgYWJsZSB0byBjb25maWd1cmUgTldJRCBhZnRlciAod2l0aCBpd2NvbmZpZykgKi8KKyAgICAgIHBzYS5wc2FfbndpZFswXSA9IDA7CisgICAgICBwc2EucHNhX253aWRbMV0gPSAwOworCisgICAgICAvKiBBcyBOV0lEIGlzIG5vdCBzZXQgOiBubyBOV0lEIGNoZWNraW5nICovCisgICAgICBwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworICAgICAgLyogRGlzYWJsZSBlbmNyeXB0aW9uICovCisgICAgICBwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKworICAgICAgLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlcworICAgICAgICogMHgwNCBmb3IgQVQsCisgICAgICAgKiAweDAxIGZvciBNQ0EsCisgICAgICAgKiAweDA0IGZvciBQQ01DSUEgYW5kIDIuMDAgY2FyZCAoQVQmVCA0MDctMDI0Njg5L0UgZG9jdW1lbnQpCisgICAgICAgKi8KKyAgICAgIGlmIChwc2EucHNhX2NvbXBfbnVtYmVyICYgMSkKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwMTsKKyAgICAgIGVsc2UKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwNDsKKyAgICAgIHBzYS5wc2FfcXVhbGl0eV90aHIgPSAweDAzOworCisgICAgICAvKiBJdCBpcyBjb25maWd1cmVkICovCisgICAgICBwc2EucHNhX2NvbmZfc3RhdHVzIHw9IDE7CisKKyNpZmRlZiBVU0VfUFNBX0NPTkZJRworICAgICAgLyogV3JpdGUgdGhlIHBzYSAqLworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKilwc2EucHNhX253aWQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopcHNhLnBzYV9ud2lkLCA0KTsKKyAgICAgIHBzYV93cml0ZShkZXYsIChjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopJnBzYSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisgICAgICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikmcHNhLAorCQkodW5zaWduZWQgY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzLCAxKTsKKyAgICAgIC8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworICAgICAgdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworI2VuZGlmCS8qIFVTRV9QU0FfQ09ORklHICovCisgICAgfQorCisgIC8qIFplcm8gdGhlIG1tYyBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0KCZtLCAweDAwLCBzaXplb2YobSkpOworCisgIC8qIENvcHkgUFNBIGluZm8gdG8gdGhlIG1tYyAqLworICBtLm1td19uZXR3X2lkX2wgPSBwc2EucHNhX253aWRbMV07CisgIG0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKyAgCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QgJiAxKQorICAgIG0ubW13X2xvb3B0X3NlbCA9IDB4MDA7CisgIGVsc2UKKyAgICBtLm1td19sb29wdF9zZWwgPSBNTVdfTE9PUFRfU0VMX0RJU19OV0lEOworCisgIG1lbWNweSgmbS5tbXdfZW5jcl9rZXksICZwc2EucHNhX2VuY3J5cHRpb25fa2V5LCAKKwkgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKyAgaWYocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKyAgICBtLm1td19lbmNyX2VuYWJsZSA9IE1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFOworICBlbHNlCisgICAgbS5tbXdfZW5jcl9lbmFibGUgPSAwOworCisgIG0ubW13X3Rocl9wcmVfc2V0ID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisgIG0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKyAgLyoKKyAgICogU2V0IGRlZmF1bHQgbW9kZW0gY29udHJvbCBwYXJhbWV0ZXJzLgorICAgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKyAgICovCisgIG0ubW13X2phYmJlcl9lbmFibGUgPSAweDAxOworICBtLm1td19hbnRlbl9zZWwgPSBNTVdfQU5URU5fU0VMX0FMR19FTjsKKyAgbS5tbXdfaWZzID0gMHgyMDsKKyAgbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKyAgbS5tbXdfamFtX3RpbWUgPSAweDM4OworCisgIG0ubW13X2Rlc19pb19pbnZlcnQgPSAwOworICBtLm1td19mcmVlemUgPSAwOworICBtLm1td19kZWNheV9wcm0gPSAwOworICBtLm1td19kZWNheV91cGRhdF9wcm0gPSAwOworCisgIC8qIFdyaXRlIGFsbCBpbmZvIHRvIG1tYyAqLworICBtbWNfd3JpdGUoYmFzZSwgMCwgKHVfY2hhciAqKSZtLCBzaXplb2YobSkpOworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydCB0aGUgbW9kZW0gb2YgdGhlIDIuMDAgZnJlcXVlbmN5CisgICAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uIEl0J3Mgbm90IHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlCisgICAqIGZvbGxvd2luZyBib290cy4uLgorICAgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKyAgICogSSd2ZSBjbGVhbmVkIGl0IGEgYml0IGFuZCBhZGQgZG9jdW1lbnRhdGlvbi4KKyAgICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorICAgKi8KKworICAvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKQorICAgKiAoZG9lcyBpdCB3b3JrIGZvciBldmVyeWJvZHkgPyAtIGVzcGVjaWFsbHkgb2xkIGNhcmRzLi4uKSAqLworICAvKiBOb3RlIDogV0ZSRVFTRUwgdmVyaWZ5IHRoYXQgaXQgaXMgYWJsZSB0byByZWFkIGZyb20gRUVwcm9tCisgICAqIGEgc2Vuc2libGUgZnJlcXVlbmN5IChhZGRyZXNzIDB4MDApICsgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorICAgKiBpcyAweEEgKFhpbGlueCB2ZXJzaW9uKSBvciAweEIgKEFyaWFkbmUgdmVyc2lvbikuCisgICAqIE15IHRlc3QgaXMgbW9yZSBjcnVkZSBidXQgZG8gd29yay4uLiAqLworICBpZighKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisgICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisgICAgeworICAgICAgLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisgICAgICAgKiBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgMSkKKyAgICAgICAqIE5vdGUgOiBhcyB0aGUgRUVwcm9tIGlzIGF1dG8gZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisgICAgICAgKiBpZiB0aGUgYXJlYS4uLiAqLworICAgICAgbS5tbXdfZmVlX2FkZHIgPSAweDBGOworICAgICAgbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworICAgICAgbW1jX3dyaXRlKGJhc2UsIChjaGFyICopJm0ubW13X2ZlZV9jdHJsIC0gKGNoYXIgKikmbSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmbS5tbXdfZmVlX2N0cmwsIDIpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgICAgZmVlX3dhaXQoYmFzZSwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIC8qIFRoZSBmcmVxdWVuY3kgd2FzIGluIHRoZSBsYXN0IHdvcmQgZG93bmxvYWRlZC4uLiAqLworICAgICAgbW1jX3JlYWQoYmFzZSwgKGNoYXIgKikmbS5tbXdfZmVlX2RhdGFfbCAtIChjaGFyICopJm0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9kYXRhX2wsIDIpOworCisgICAgICAvKiBQcmludCBzb21lIGluZm8gZm9yIHRoZSB1c2VyICovCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhdmVsYW4gMi4wMCByZWNvZ25pc2VkIChmcmVxdWVuY3kgc2VsZWN0KSA6IEN1cnJlbnQgZnJlcXVlbmN5ID0gJWxkXG4iLAorCSAgICAgZGV2LT5uYW1lLAorCSAgICAgKChtLm1td19mZWVfZGF0YV9oIDw8IDQpIHwKKwkgICAgICAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKiA1IC8gMiArIDI0MDAwTCk7CisjZW5kaWYKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG0ubW13X2ZlZV9hZGRyID0gMHg2MTsKKyAgICAgIG0ubW13X2ZlZV9jdHJsID0gTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRDsKKyAgICAgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLm1td19mZWVfY3RybCAtIChjaGFyICopJm0sCisJCSh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICB9CS8qIGlmIDIuMDAgY2FyZCAqLworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9tbWNfaW5pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBncmFjZWZ1bGx5IHR1cm4gb2ZmIHJlY2VwdGlvbiwgYW5kIHdhaXQgZm9yIGFueSBjb21tYW5kcworICogdG8gY29tcGxldGUuCisgKiAoY2FsbGVkIGluIHd2X3J1X3N0YXJ0KCkgYW5kIHdhdmVsYW5fY2xvc2UoKSBhbmQgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW50Cit3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1bnNpZ25lZCBsb25nCWZsYWdzOworICBpbnQJCXN0YXR1czsKKyAgaW50CQlzcGluOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRmlyc3QsIHNlbmQgdGhlIExBTiBjb250cm9sbGVyIGEgc3RvcCByZWNlaXZlIGNvbW1hbmQgKi8KKyAgd3ZfODI1OTNfY21kKGRldiwgInd2X2dyYWNlZnVsX3NodXRkb3duKCk6IHN0b3AtcmN2IiwKKwkgICAgICAgT1AwX1NUT1BfUkNWLCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBUaGVuLCBzcGluIHVudGlsIHRoZSByZWNlaXZlIHVuaXQgZ29lcyBpZGxlICovCisgIHNwaW4gPSAzMDA7CisgIGRvCisgICAgeworICAgICAgdWRlbGF5KDEwKTsKKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSykgIT0gU1IzX1JDVl9JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIE5vdywgc3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAqLworICBkbworICAgIHsKKyAgICAgIHVkZWxheSgxMCk7CisgICAgICBvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworICAgIH0KKyAgd2hpbGUoKChzdGF0dXMgJiBTUjNfRVhFQ19TVEFURV9NQVNLKSAhPSBTUjNfRVhFQ19JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gKi8KKyAgaWYoc3BpbiA8PSAwKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcnVfc3RvcCgpOiBUaGUgY2hpcCBkb2Vzbid0IHdhbnQgdG8gc3RvcC4uLlxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30gLyogd3ZfcnVfc3RvcCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgcmVjZWl2ZSB1bml0IHJ1bm5pbmcuICBGaXJzdCwgaXQgY2hlY2tzIGlmCisgKiB0aGUgY2FyZCBpcyBhY3R1YWxseSByZWFkeS4gVGhlbiB0aGUgY2FyZCBpcyBpbnN0cnVjdGVkIHRvIHJlY2VpdmUKKyAqIHBhY2tldHMgYWdhaW4uCisgKiAoY2FsbGVkIGluIHd2X2h3X3Jlc2V0KCkgJiB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGludAord3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKgorICAgKiBXZSBuZWVkIHRvIHN0YXJ0IGZyb20gYSBxdWllc2NlbnQgc3RhdGUuIFRvIGRvIHNvLCB3ZSBjb3VsZCBjaGVjaworICAgKiBpZiB0aGUgY2FyZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIGJ1dCBpbnN0ZWFkIHdlIGp1c3QgdHJ5IHRvIHNodXQKKyAgICogaXQgZG93bi4gRmlyc3QsIHdlIGRpc2FibGUgcmVjZXB0aW9uIChpbiBjYXNlIGl0IHdhcyBhbHJlYWR5IGVuYWJsZWQpLgorICAgKi8KKyAgaWYoIXd2X3J1X3N0b3AoZGV2KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY29tbWFuZCBpcyBiZWluZyBleGVjdXRlZC4gKi8KKworICAvKiBTZXQgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciBhbmQgc3RvcCBwb2ludGVyICovCisgIGxwLT5yZnAgPSAwOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKworICAvKiBSZXNldCByaW5nIG1hbmFnZW1lbnQuICBUaGlzIHNldHMgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciB0byAxICovCisgIG91dGIoT1AxX1JFU0VUX1JJTkdfTU5HTVQsIExDQ1IoYmFzZSkpOworCisjaWYgMAorICAvKiBYWFggdGhlIGk4MjU5MyBtYW51YWwgcGFnZSA2LTQgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3RvcCByZWdpc3RlcgorICAgICBzaG91bGQgYmUgc2V0IGFzIGJlbG93ICovCisgIC8qIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURXwoKFJYX1NJWkUgLSAweDQwKT4+IFJYX1NJWkVfU0hJRlQpLExDQ1IoYmFzZSkpOyovCisjZWxpZiAwCisgIC8qIGJ1dCBJIHNldCBpdCAwIGluc3RlYWQgKi8KKyAgbHAtPnN0b3AgPSAwOworI2Vsc2UKKyAgLyogYnV0IEkgc2V0IGl0IHRvIDMgYnl0ZXMgcGVyIHBhY2tldCBsZXNzIHRoYW4gOEsgKi8KKyAgbHAtPnN0b3AgPSAoMCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworI2VuZGlmCisgIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURSB8IChscC0+c3RvcCA+PiBSWF9TSVpFX1NISUZUKSwgTENDUihiYXNlKSk7CisgIG91dGIoT1AxX0lOVF9FTkFCTEUsIExDQ1IoYmFzZSkpOworICBvdXRiKE9QMV9TV0lUX1RPX1BPUlRfMCwgTENDUihiYXNlKSk7CisKKyAgLyogUmVzZXQgcmVjZWl2ZSBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfREVGQVVMVCk7CisKKyAgLyogUmVjZWl2ZSBETUEgb24gY2hhbm5lbCAxICovCisgIHd2XzgyNTkzX2NtZChkZXYsICJ3dl9ydV9zdGFydCgpOiByY3YtZW5hYmxlIiwKKwkgICAgICAgQ1IwX0NITkwgfCBPUDBfUkNWX0VOQUJMRSwgU1IwX05PX1JFU1VMVCk7CisKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB7CisgICAgaW50CXN0YXR1czsKKyAgICBpbnQJb3ByaTsKKyAgICBpbnQJc3BpbiA9IDEwMDAwOworCisgICAgLyogc3BpbiB1bnRpbCB0aGUgY2hpcCBzdGFydHMgcmVjZWl2aW5nICovCisgICAgZG8KKyAgICAgIHsKKwlvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworCXN0YXR1cyA9IGluYihMQ1NSKGJhc2UpKTsKKwlpZihzcGluLS0gPD0gMCkKKwkgIGJyZWFrOworICAgICAgfQorICAgIHdoaWxlKCgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX0FDVElWRSkgJiYKKwkgICgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX1JFQURZKSk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInJjdiBzdGF0dXMgaXMgMHgleCBbaTolZF1cbiIsCisJICAgKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSyksIGkpOworICB9CisjZW5kaWYKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcnVfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBkb2VzIGEgc3RhbmRhcmQgY29uZmlnIG9mIHRoZSBXYXZlTEFOIGNvbnRyb2xsZXIgKGk4MjU5MykuCisgKiBJbiB0aGUgSVNBIGRyaXZlciwgdGhpcyBpcyBpbnRlZ3JhdGVkIGluIHdhdmVsYW5faGFyZHdhcmVfcmVzZXQoKQorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSwgd3ZfODI1OTNfcmVjb25maWcoKSAmIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKgkJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrCWNmYmxrOworICBpbnQJCQkJcmV0ID0gVFJVRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfODI1OTNfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBDcmVhdGUgJiBmaWxsIGk4MjU5MyBjb25maWcgYmxvY2sKKyAgICoKKyAgICogTm93IGNvbmZvcm0gdG8gV2F2ZWxhbiBkb2N1bWVudCBXQ0lOMDg1QgorICAgKi8KKyAgbWVtc2V0KCZjZmJsaywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykpOworICBjZmJsay5kNm1vZCA9IEZBTFNFOyAgCS8qIFJ1biBpbiBpODI1OTMgYWR2YW5jZWQgbW9kZSAqLworICBjZmJsay5maWZvX2xpbWl0ID0gNTsgICAgICAgICAvKiA9IDU2IEIgcnggYW5kIDQwIEIgdHggZmlmbyB0aHJlc2hvbGRzICovCisgIGNmYmxrLmZvcmduZXNpID0gRkFMU0U7ICAgICAgIC8qIDA9ODJDNTAxLCAxPUFNRDc5OTJCIGNvbXBhdGliaWxpdHkgKi8KKyAgY2ZibGsuZmlmb18zMiA9IDE7CisgIGNmYmxrLnRocm90dGxlX2VuYiA9IEZBTFNFOworICBjZmJsay5jb250aW4gPSBUUlVFOyAgICAgICAgICAvKiBlbmFibGUgY29udGludW91cyBtb2RlICovCisgIGNmYmxrLmNudHJ4aW50ID0gRkFMU0U7ICAgICAgIC8qIGVuYWJsZSBjb250aW51b3VzIG1vZGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisgIGNmYmxrLmFkZHJfbGVuID0gV0FWRUxBTl9BRERSX1NJWkU7CisgIGNmYmxrLmFjbG9jID0gVFJVRTsgICAgICAgICAgIC8qIERpc2FibGUgc291cmNlIGFkZHIgaW5zZXJ0aW9uIGJ5IGk4MjU5MyAqLworICBjZmJsay5wcmVhbWJfbGVuID0gMDsgICAgICAgICAvKiAyIGJ5dGVzIHByZWFtYmxlIChTRkQpICovCisgIGNmYmxrLmxvb3BiYWNrID0gRkFMU0U7CisgIGNmYmxrLmxpbl9wcmlvID0gMDsgICAJLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmV4cF9wcmlvID0gNTsJICAgICAgICAvKiBjb25mb3JtIHRvIDgwMi4zIGJhY2tvZmYgYWxnb3JpdG0gKi8KKyAgY2ZibGsuYm9mX21ldCA9IDE7CSAgICAgICAgLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmlmcm1fc3BjID0gMHgyMDsJLyogMzIgYml0IHRpbWVzIGludGVyZnJhbWUgc3BhY2luZyAqLworICBjZmJsay5zbG90dGltX2xvdyA9IDB4MjA7CS8qIDMyIGJpdCB0aW1lcyBzbG90IHRpbWUgKi8KKyAgY2ZibGsuc2xvdHRpbV9oaSA9IDB4MDsKKyAgY2ZibGsubWF4X3JldHIgPSAxNTsKKyAgY2ZibGsucHJtaXNjID0gKChscC0+cHJvbWlzY3VvdXMpID8gVFJVRTogRkFMU0UpOwkvKiBQcm9taXNjdW91cyBtb2RlICovCisgIGNmYmxrLmJjX2RpcyA9IEZBTFNFOyAgICAgICAgIC8qIEVuYWJsZSBicm9hZGNhc3QgcmVjZXB0aW9uICovCisgIGNmYmxrLmNyc18xID0gVFJVRTsJCS8qIFRyYW5zbWl0IHdpdGhvdXQgY2FycmllciBzZW5zZSAqLworICBjZmJsay5ub2NyY19pbnMgPSBGQUxTRTsJLyogaTgyNTkzIGdlbmVyYXRlcyBDUkMgKi8JCisgIGNmYmxrLmNyY18xNjMyID0gRkFMU0U7CS8qIDMyLWJpdCBBdXRvZGluLUlJIENSQyAqLworICBjZmJsay5jcnNfY2R0ID0gRkFMU0U7CS8qIENEIG5vdCB0byBiZSBpbnRlcnByZXRlZCBhcyBDUyAqLworICBjZmJsay5jc19maWx0ZXIgPSAwOyAgCS8qIENTIGlzIHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgKi8KKyAgY2ZibGsuY3JzX3NyYyA9IEZBTFNFOwkvKiBFeHRlcm5hbCBjYXJyaWVyIHNlbnNlICovCisgIGNmYmxrLmNkX2ZpbHRlciA9IDA7ICAJLyogQ0QgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworICBjZmJsay5taW5fZnJfbGVuID0gRVRIX1pMRU4gPj4gMjsgICAgIC8qIE1pbmltdW0gZnJhbWUgbGVuZ3RoIDY0IGJ5dGVzICovCisgIGNmYmxrLmxuZ190eXAgPSBGQUxTRTsJLyogTGVuZ3RoIGZpZWxkID4gMTUwMCA9IHR5cGUgZmllbGQgKi8KKyAgY2ZibGsubG5nX2ZsZCA9IFRSVUU7IAkvKiBEaXNhYmxlIDgwMi4zIGxlbmd0aCBmaWVsZCBjaGVjayAqLworICBjZmJsay5yeGNyY194ZiA9IFRSVUU7CS8qIERvbid0IHRyYW5zZmVyIENSQyB0byBtZW1vcnkgKi8KKyAgY2ZibGsuYXJ0eCA9IFRSVUU7CQkvKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworICBjZmJsay5zYXJlYyA9IFRSVUU7CQkvKiBEaXNhYmxlIHNvdXJjZSBhZGRyIHRyaWcgb2YgQ0QgKi8KKyAgY2ZibGsudHhfamFiYmVyID0gVFJVRTsJLyogRGlzYWJsZSBqYWJiZXIgamFtIHNlcXVlbmNlICovCisgIGNmYmxrLmhhc2hfMSA9IEZBTFNFOyAJLyogVXNlIGJpdHMgMC01IGluIG1jIGFkZHJlc3MgaGFzaCAqLworICBjZmJsay5sYnBrcG9sID0gVFJVRTsgCS8qIExvb3BiYWNrIHBpbiBhY3RpdmUgaGlnaCAqLworICBjZmJsay5mZHggPSBGQUxTRTsJCS8qIERpc2FibGUgZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisgIGNmYmxrLmR1bW15XzYgPSAweDNmOyAJLyogYWxsIG9uZXMgKi8KKyAgY2ZibGsubXVsdF9pYSA9IEZBTFNFOwkvKiBObyBtdWx0aXBsZSBpbmRpdmlkdWFsIGFkZHJlc3NlcyAqLworICBjZmJsay5kaXNfYm9mID0gRkFMU0U7CS8qIERpc2FibGUgdGhlIGJhY2tvZmYgYWxnb3JpdGhtID8hICovCisgIGNmYmxrLmR1bW15XzEgPSBUUlVFOyAJLyogc2V0IHRvIDEgKi8KKyAgY2ZibGsudHhfaWZzX3JldHJpZyA9IDM7CS8qIEhtbS4uLiBEaXNhYmxlZCAqLworI2lmZGVmIE1VTFRJQ0FTVF9BTEwKKyAgY2ZibGsubWNfYWxsID0gKGxwLT5hbGxtdWx0aWNhc3QgPyBUUlVFOiBGQUxTRSk7CS8qIEFsbG93IGFsbCBtdWx0aWNhc3RzICovCisjZWxzZQorICBjZmJsay5tY19hbGwgPSBGQUxTRTsJCS8qIE5vIG11bHRpY2FzdCBhbGwgbW9kZSAqLworI2VuZGlmCisgIGNmYmxrLnJjdl9tb24gPSAwOwkJLyogTW9uaXRvciBtb2RlIGRpc2FibGVkICovCisgIGNmYmxrLmZyYWdfYWNwdCA9IFRSVUU7CS8qIERvIG5vdCBhY2NlcHQgZnJhZ21lbnRzICovCisgIGNmYmxrLnRzdHJ0dHJzID0gRkFMU0U7CS8qIE5vIHN0YXJ0IHRyYW5zbWlzc2lvbiB0aHJlc2hvbGQgKi8KKyAgY2ZibGsuZnJldHggPSBUUlVFOwkJLyogRklGTyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsuc3luY3JxcyA9IEZBTFNFOyAJLyogU3luY2hyb25vdXMgRFJRIGRlYXNzZXJ0aW9uLi4uICovCisgIGNmYmxrLnN0dGxlbiA9IFRSVUU7ICAJLyogNiBieXRlIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgY2ZibGsucnhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCByZWNlcHRpb24gKi8KKyAgY2ZibGsudHhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCB0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsucmJ1Zl9zaXplID0gUlhfU0laRT4+MTE7CS8qIFNldCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisgIGNmYmxrLnJjdnN0b3AgPSBUUlVFOyAJLyogRW5hYmxlIFJlY2VpdmUgU3RvcCBSZWdpc3RlciAqLworCisjaWZkZWYgREVCVUdfSTgyNTkzX1NIT1cKKyAgeworICAgIHVfY2hhciAqYyA9ICh1X2NoYXIgKikgJmNmYmxrOworICAgIGludCBpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiBjb25maWcgYmxvY2s6Iik7CisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jayk7IGkrKyxjKyspCisgICAgICB7CisJaWYoKGkgJSAxNikgPT0gMCkgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyk7CisJcHJpbnRrKCIlMDJ4ICIsICpjKTsKKyAgICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgIH0KKyNlbmRpZgorCisgIC8qIENvcHkgdGhlIGNvbmZpZyBibG9jayB0byB0aGUgaTgyNTkzICovCisgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKFRYX0JBU0UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spICYgMHhmZiwgUElPUChiYXNlKSk7ICAgIC8qIGxzYiAqLworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spID4+IDgsIFBJT1AoYmFzZSkpOwkvKiBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgKGNoYXIgKikgJmNmYmxrLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisKKyAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogY29uZmlndXJlIiwKKwkJICAgT1AwX0NPTkZJR1VSRSwgU1IwX0NPTkZJR1VSRV9ET05FKSkKKyAgICByZXQgPSBGQUxTRTsKKworICAvKiBJbml0aWFsaXplIGFkYXB0ZXIncyBldGhlcm5ldCBNQUMgYWRkcmVzcyAqLworICBvdXRiKFRYX0JBU0UgJiAweGZmLCBQSU9STChiYXNlKSk7CisgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihXQVZFTEFOX0FERFJfU0laRSwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgIG91dGIoMCwgUElPUChiYXNlKSk7CQkJLyogYnl0ZSBjb3VudCBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgJmRldi0+ZGV2X2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiByZXNldCB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICBpZighd3ZfODI1OTNfY21kKGRldiwgInd2XzgyNTkzX2NvbmZpZygpOiBpYS1zZXR1cCIsCisJCSAgIE9QMF9JQV9TRVRVUCwgU1IwX0lBX1NFVFVQX0RPTkUpKQorICAgIHJldCA9IEZBTFNFOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgLyogSWYgcm9hbWluZyBpcyBlbmFibGVkLCBqb2luIHRoZSAiQmVhY29uIFJlcXVlc3QiIG11bHRpY2FzdCBncm91cC4uLiAqLworICAgIC8qIEJ1dCBvbmx5IGlmIGl0J3Mgbm90IGluIHRoZXJlIGFscmVhZHkhICovCisgIGlmKGRvX3JvYW1pbmcpCisgICAgZGV2X21jX2FkZChkZXYsV0FWRUxBTl9CRUFDT05fQUREUkVTUywgV0FWRUxBTl9BRERSX1NJWkUsIDEpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisgIC8qIElmIGFueSBtdWx0aWNhc3QgYWRkcmVzcyB0byBzZXQgKi8KKyAgaWYobHAtPm1jX2NvdW50KQorICAgIHsKKyAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqCWRtaTsKKyAgICAgIGludAkJCWFkZHJzX2xlbiA9IFdBVkVMQU5fQUREUl9TSVpFICogbHAtPm1jX2NvdW50OworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaHdfY29uZmlnKCk6IHNldCAlZCBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIiwKKwkgICAgIGRldi0+bmFtZSwgbHAtPm1jX2NvdW50KTsKKyAgICAgIGZvcihkbWk9ZGV2LT5tY19saXN0OyBkbWk7IGRtaT1kbWktPm5leHQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwgZG1pLT5kbWlfYWRkclsyXSwKKwkgICAgICAgZG1pLT5kbWlfYWRkclszXSwgZG1pLT5kbWlfYWRkcls0XSwgZG1pLT5kbWlfYWRkcls1XSApOworI2VuZGlmCisKKyAgICAgIC8qIEluaXRpYWxpemUgYWRhcHRlcidzIGV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyAgICAgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgICAgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgICAgIG91dGIoYWRkcnNfbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgICAgICBvdXRiKChhZGRyc19sZW4gPj4gOCksIFBJT1AoYmFzZSkpOwkvKiBieXRlIGNvdW50IG1zYiAqLworICAgICAgZm9yKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkKKwlvdXRzYihQSU9QKGJhc2UpLCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuKTsKKworICAgICAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9UWF9ETUFfUkVTRVQpOworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICAgICAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogbWMtc2V0dXAiLAorCQkgICAgICAgT1AwX01DX1NFVFVQLCBTUjBfTUNfU0VUVVBfRE9ORSkpCisJcmV0ID0gRkFMU0U7CisgICAgICBscC0+bWNfY291bnQgPSBkZXYtPm1jX2NvdW50OwkvKiByZW1lbWJlciB0byBhdm9pZCByZXBlYXRlZCByZXNldCAqLworICAgIH0KKworICAvKiBKb2IgZG9uZSwgY2xlYXIgdGhlIGZsYWcgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gRkFMU0U7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTkzX2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCB0aGUgQWNjZXNzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIsIHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCwKKyAqIGFuZCB0aGVuIHJlLWVuYWJsZSB0aGUgY2FyZCdzIHNvZnR3YXJlLgorICoKKyAqIElmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHkgOiByZXNldCB0aGUgcGNtY2lhIGludGVyZmFjZSBvZiB0aGUKKyAqIHdhdmVsYW4uCisgKiAoY2FsbGVkIGJ5IHd2X2NvbmZpZygpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBpbnQJCWk7CisgIGNvbmZfcmVnX3QJcmVnID0geyAwLCBDU19SRUFELCBDSVNSRUdfQ09SLCAwIH07CisgIGRldl9saW5rX3QgKglsaW5rID0gKChuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+bGluazsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBpID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3BjbWNpYV9yZXNldCgpOiBDb25maWcgcmVnIGlzIDB4JXhcbiIsCisJIGRldi0+bmFtZSwgKHVfaW50KSByZWcuVmFsdWUpOworI2VuZGlmCisKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSByZWcuVmFsdWUgfCBDT1JfU1dfUkVTRVQ7CisgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSBDT1JfTEVWRUxfSVJRIHwgQ09SX0NPTkZJRzsKKyAgaSA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB3YXZlbGFuX2h3X2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSB3YXZlbGFuIGhhcmR3YXJlLgorICogTm90ZSB0aGF0IHRoZSByZWNlcHRpb24gd2lsbCBiZSBlbmFibGVkIGluIHdhdmVsYW4tPm9wZW4oKSwgc28gdGhlCisgKiBkZXZpY2UgaXMgY29uZmlndXJlZCBidXQgaWRsZS4uLgorICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorICogCTEuIEEgcGNtY2lhIHNvZnR3YXJlIHJlc2V0ICh1c2luZyB3dl9wY21jaWFfcmVzZXQoKSkKKyAqCTIuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTMuIFJlc2V0IHRoZSBMQU4gY29udHJvbGxlcgorICoJNC4gSW5pdGlhbGl6ZSB0aGUgcmFkaW8gbW9kZW0gKHVzaW5nIHd2X21tY19pbml0KQorICoJNS4gQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU5M19jb25maWcpCisgKgk2LiBQZXJmb3JtIGEgZGlhZ25vc3RpYyBvbiB0aGUgTEFOIGNvbnRyb2xsZXIKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpICYgd3ZfaHdfcmVzZXQoKSkKKyAqLworc3RhdGljIGludAord3ZfaHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworICBpbnQJCQlyZXQgPSBGQUxTRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfaHdfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIFNUUlVDVF9DSEVDSworICBpZih3dl9zdHJ1Y3R1Y3RfY2hlY2soKSAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWc6IHN0cnVjdHVyZS9jb21waWxlciBib3RjaDogXCIlc1wiXG4iLAorCSAgICAgZGV2LT5uYW1lLCB3dl9zdHJ1Y3R1Y3RfY2hlY2soKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyA9PSAxICovCisKKyAgLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KKyAgaWYod3ZfcGNtY2lhX3Jlc2V0KGRldikgPT0gRkFMU0UpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRGlzZ3Vpc2VkIGdvdG8gOy0pICovCisgIGRvCisgICAgeworICAgICAgLyogUG93ZXIgVVAgdGhlIG1vZHVsZSArIHJlc2V0IHRoZSBtb2RlbSArIHJlc2V0IGhvc3QgYWRhcHRlcgorICAgICAgICogKGluIGZhY3QsIHJlc2V0IERNQSBjaGFubmVscykgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1JFU0VUKTsKKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG1vZHVsZSBoYXMgYmVlbiBwb3dlcmVkIHVwLi4uICovCisgICAgICBpZihoYXNyX3JlYWQoYmFzZSkgJiBIQVNSX05PX0NMSykKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X2h3X2NvbmZpZygpOiBtb2RlbSBub3QgY29ubmVjdGVkIG9yIG5vdCBhIHdhdmVsYW4gY2FyZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KKyAgICAgIGlmKHd2X21tY19pbml0KGRldikgPT0gRkFMU0UpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWcoKTogQ2FuJ3QgY29uZmlndXJlIHRoZSBtb2RlbVxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogcmVzZXQgdGhlIExBTiBjb250cm9sbGVyIChpODI1OTMpICovCisgICAgICBvdXRiKE9QMF9SRVNFVCwgTENDUihiYXNlKSk7CisgICAgICBtZGVsYXkoMSk7CS8qIEEgYml0IGNydWRlICEgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTEFOIGNvbnRyb2xsZXIgKi8KKyAgICAgIGlmKHd2XzgyNTkzX2NvbmZpZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBpbml0IGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogRGlhZ25vc3RpYyAqLworICAgICAgaWYod3ZfZGlhZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBkaWFnbm9zdGljIGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogCisgICAgICAgKiBpbnNlcnQgY29kZSBmb3IgbG9vcGJhY2sgdGVzdCBoZXJlCisgICAgICAgKi8KKworICAgICAgLyogVGhlIGRldmljZSBpcyBub3cgY29uZmlndXJlZCAqLworICAgICAgbHAtPmNvbmZpZ3VyZWQgPSAxOworICAgICAgcmV0ID0gVFJVRTsKKyAgICB9CisgIHdoaWxlKDApOworCisgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9od19jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4ocmV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRvdGFsbHkgcmVzZXQgdGhlIHdhdmVsYW4gYW5kIHJlc3RhcnQgaXQuCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgKiAJMS4gQ2FsbCB3dl9od19jb25maWcoKQorICoJMi4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fZXZlbnQoKSwgd2F2ZWxhbl93YXRjaGRvZygpIGFuZCB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9od19yZXNldCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAtPm5yZXNldHMrKzsKKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICAKKyAgLyogQ2FsbCB3dl9od19jb25maWcoKSBmb3IgbW9zdCBvZiB0aGUgcmVzZXQgJiBpbml0IHN0dWZmICovCisgIGlmKHd2X2h3X2NvbmZpZyhkZXYpID09IEZBTFNFKQorICAgIHJldHVybjsKKworICAvKiBzdGFydCByZWNlaXZlIHVuaXQgKi8KKyAgd3ZfcnVfc3RhcnQoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogd3ZfcGNtY2lhX2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQKKyAqIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICoJbGluaykKK3sKKyAgY2xpZW50X2hhbmRsZV90CWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgdHVwbGVfdAkJdHVwbGU7CisgIGNpc3BhcnNlX3QJCXBhcnNlOworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBpbnQJCQlpOworICB1X2NoYXIJCWJ1Zls2NF07CisgIHdpbl9yZXFfdAkJcmVxOworICBtZW1yZXFfdAkJbWVtOworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d3ZfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICogcmVnaXN0ZXJzLgorICAgKi8KKyAgZG8KKyAgICB7CisgICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgICBpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwlicmVhazsKKyAgICAgIGkgPSBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKyAgICB9CisgIHdoaWxlKDApOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBQYXJzZVR1cGxlLCBpKTsKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICAvKiBDb25maWd1cmUgY2FyZCAqLworICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworICBkbworICAgIHsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKgorICAgICAgICogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgICAqIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KKyAgICAgICAqLworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElSUSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorICAgICAgICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgICAgKi8KKyAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIGRldl9saW5rX3QKKyAgICAgICAqIHN0cnVjdHVyZSBwcm92aWRlcyBzcGFjZSBmb3Igb25lIHdpbmRvdyBoYW5kbGUgLS0gaWYgeW91cgorICAgICAgICogZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICAgICAgICogdGhlIGhhbmRsZXMgaW4geW91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaW5rLT5wcml2LgorICAgICAgICovCisgICAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgICByZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKyAgICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgbHAtPm1lbSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICAgIGRldi0+bWVtX3N0YXJ0ID0gKHVfbG9uZylscC0+bWVtOworICAgICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyByZXEuU2l6ZTsKKworICAgICAgbWVtLkNhcmRPZmZzZXQgPSAwOyBtZW0uUGFnZSA9IDA7CisgICAgICBpID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgTWFwTWVtUGFnZSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEZlZWQgZGV2aWNlIHdpdGggdGhpcyBpbmZvLi4uICovCisgICAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAid3ZfcGNtY2lhX2NvbmZpZzogTUVNU1RBUlQgJXAgSVJRICVkIElPUE9SVCAweCV4XG4iLAorCSAgICAgbHAtPm1lbSwgZGV2LT5pcnEsICh1X2ludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKyAgICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgICBpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICBpZihpICE9IDApCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX0lORk8gInd2X3BjbWNpYV9jb25maWcoKTogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgd2hpbGUoMCk7CQkvKiBIdW1tLi4uIERpc2d1aXNlZCBnb3RvICEhISAqLworCisgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgIC8qIElmIGFueSBzdGVwIGZhaWxlZCwgcmVsZWFzZSBhbnkgcGFydGlhbGx5IGNvbmZpZ3VyZWQgc3RhdGUgKi8KKyAgaWYoaSAhPSAwKQorICAgIHsKKyAgICAgIHd2X3BjbWNpYV9yZWxlYXNlKGxpbmspOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdHJjcHkoKChuZXRfbG9jYWwgKikgbmV0ZGV2X3ByaXYoZGV2KSktPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgIGxpbmstPmRldiA9ICYoKG5ldF9sb2NhbCAqKSBuZXRkZXZfcHJpdihkZXYpKS0+bm9kZTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC13dl9wY21jaWFfY29uZmlnKClcbiIpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHd2X3BjbWNpYV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT4gd3ZfcGNtY2lhX3JlbGVhc2UoMHglcClcbiIsIGRldi0+bmFtZSwgbGluayk7CisjZW5kaWYKKworICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgIGlvdW5tYXAobHAtPm1lbSk7CisgIHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LSB3dl9wY21jaWFfcmVsZWFzZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSU5URVJSVVBUIEhBTkRMSU5HICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgV2F2ZUxBTiBjYXJkLiBUaGlzCisgKiByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKKyAqCTEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoJMi4gQSBwYWNrZXQgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgdW5pdCBpcworICoJICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCisgKgkzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAord2F2ZWxhbl9pbnRlcnJ1cHQoaW50CQlpcnEsCisJCSAgdm9pZCAqCWRldl9pZCwKKwkJICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2OworICBuZXRfbG9jYWwgKglscDsKKyAga2lvX2FkZHJfdAliYXNlOworICBpbnQJCXN0YXR1czA7CisgIHVfaW50CQl0eF9zdGF0dXM7CisKKyAgaWYgKChkZXYgPSBkZXZfaWQpID09IE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWxhbl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsCisJICAgICBpcnEpOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworICAvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKGl0IHNob3VsZCBiZSBjbGVhcmVkKSAqLworICBpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKyAgICBwcmludGsoS0VSTl9ERUJVRworCSAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCSAgIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBQcmV2ZW50IHJlZW50cmFuY3kuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIHdlIG1heSBoYXZlCisgICAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VyZW50bHkuCisgICAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYXF1aXJpbmcKKyAgICogdGhlIHNwaW5sb2NrLiAqLworICBzcGluX2xvY2soJmxwLT5zcGlubG9jayk7CisKKyAgLyogVHJlYXQgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICB3aGlsZSgxKQorICAgIHsKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIENIRUNLSU5HIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IGFuZCB2ZXJpZnkgdGhlIHZhbGlkaXR5CisgICAgICAgKi8KKyAgICAgIG91dGIoQ1IwX1NUQVRVU18wIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMwID0gaW5iKExDU1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzdGF0dXMwIDB4JXggWyVzID0+IDB4JXhdIiwgc3RhdHVzMCwgCisJICAgICAoc3RhdHVzMCZTUjBfSU5URVJSVVBUKT8iaW50Ijoibm8gaW50IixzdGF0dXMwJn5TUjBfSU5URVJSVVBUKTsKKyAgICAgIGlmKHN0YXR1czAmU1IwX0lOVEVSUlVQVCkKKwl7CisJICBwcmludGsoIiBbJXMgPT4gJWRdXG4iLCAoc3RhdHVzMCAmIFNSMF9DSE5MKSA/ICJjaG5sIiA6CisJCSAoKHN0YXR1czAgJiBTUjBfRVhFQ1VUSU9OKSA/ICJjbWQiIDoKKwkJICAoKHN0YXR1czAgJiBTUjBfUkVDRVBUSU9OKSA/ICJyZWN2IiA6ICJ1bmtub3duIikpLAorCQkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgICAgLyogUmV0dXJuIGlmIG5vIGFjdHVhbCBpbnRlcnJ1cHQgZnJvbSBpODI1OTMgKG5vcm1hbCBleGl0KSAqLworICAgICAgaWYoIShzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkpCisJYnJlYWs7CisKKyAgICAgIC8qIElmIGludGVycnVwdCBpcyBib3RoIFJ4IGFuZCBUeCBvciBub25lLi4uCisgICAgICAgKiBUaGlzIGNvZGUgaW4gZmFjdCBpcyB0aGVyZSB0byBjYXRjaCB0aGUgc3B1cmlvdXMgaW50ZXJydXB0CisgICAgICAgKiB3aGVuIHlvdSByZW1vdmUgdGhlIHdhdmVsYW4gcGNtY2lhIGNhcmQgZnJvbSB0aGUgc29ja2V0ICovCisgICAgICBpZigoKHN0YXR1czAgJiBTUjBfQk9USF9SWF9UWCkgPT0gU1IwX0JPVEhfUlhfVFgpIHx8CisJICgoc3RhdHVzMCAmIFNSMF9CT1RIX1JYX1RYKSA9PSAweDApKQorCXsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBib2d1cyBpbnRlcnJ1cHQgKG9yIGZyb20gZGVhZCBjYXJkKSA6ICVYXG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMwKTsKKyNlbmRpZgorCSAgLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBSRUNFSVZJTkcgUEFDS0VUIC0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKgorICAgICAgICogV2hlbiB0aGUgd2F2ZWxhbiBzaWduYWwgdGhlIHJlY2VwdGlvbiBvZiBhIG5ldyBwYWNrZXQsCisgICAgICAgKiB3ZSBjYWxsIHd2X3BhY2tldF9yY3YoKSB0byBjb3B5IGlmIGZyb20gdGhlIGJ1ZmZlciBhbmQKKyAgICAgICAqIHNlbmQgaXQgdG8gTkVUMworICAgICAgICovCisgICAgICBpZihzdGF0dXMwICYgU1IwX1JFQ0VQVElPTikKKwl7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHJlY2VpdmVcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCSAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1NUT1BfUkVHX0hJVCkKKwkgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcmVjZWl2ZSBidWZmZXIgb3ZlcmZsb3dcbiIsCisJCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgICAgIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICAgIGxwLT5vdmVycnVubmluZyA9IDE7CisgICAgICAJICAgIH0KKworCSAgLyogR2V0IHRoZSBwYWNrZXQgKi8KKwkgIHd2X3BhY2tldF9yY3YoZGV2KTsKKwkgIGxwLT5vdmVycnVubmluZyA9IDA7CisKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKwkgIGNvbnRpbnVlOworICAgIAl9CisKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ09NTUFORCBDT01QTEVUSU9OIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBJbnRlcnJ1cHRzIGlzc3VlZCB3aGVuIHRoZSBpODI1OTMgaGFzIGNvbXBsZXRlZCBhIGNvbW1hbmQuCisgICAgICAgKiBNb3N0IGxpa2VseSA6IHRyYW5zbWlzc2lvbiBkb25lCisgICAgICAgKi8KKworICAgICAgLyogSWYgYSB0cmFuc21pc3Npb24gaGFzIGJlZW4gZG9uZSAqLworICAgICAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1RSQU5TTUlUX0RPTkUgfHwKKwkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1JFVFJBTlNNSVRfRE9ORSB8fAorCSAoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJICBpZigoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgQ1JDLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJICAvKiBHZXQgdHJhbnNtaXNzaW9uIHN0YXR1cyAqLworCSAgdHhfc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgdHhfc3RhdHVzIHw9IChpbmIoTENTUihiYXNlKSkgPDwgOCk7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHRyYW5zbWlzc2lvbiBkb25lXG4iLAorCQkgZGV2LT5uYW1lKTsKKwkgIHsKKwkgICAgdV9pbnQJcmN2X2J5dGVzOworCSAgICB1X2NoYXIJc3RhdHVzMzsKKwkgICAgcmN2X2J5dGVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgICByY3ZfYnl0ZXMgfD0gKGluYihMQ1NSKGJhc2UpKSA8PCA4KTsKKwkgICAgc3RhdHVzMyA9IGluYihMQ1NSKGJhc2UpKTsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgInR4X3N0YXR1cyAweCUwMnggcmN2X2J5dGVzIDB4JTAyeCBzdGF0dXMzIDB4JXhcbiIsCisJCSAgIHR4X3N0YXR1cywgcmN2X2J5dGVzLCAodV9pbnQpIHN0YXR1czMpOworCSAgfQorI2VuZGlmCisJICAvKiBDaGVjayBmb3IgcG9zc2libGUgZXJyb3JzICovCisJICBpZigodHhfc3RhdHVzICYgVFhfT0spICE9IFRYX09LKQorCSAgICB7CisJICAgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfRlJUTCkKKwkJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBmcmFtZSB0b28gbG9uZ1xuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9VTkRfUlVOKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IERNQSB1bmRlcnJ1blxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9MT1NUX0NUUykKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBubyBDVFNcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX0xPU1RfQ1JTKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IG5vIGNhcnJpZXJcbiIsCisJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfSFJUX0JFQVQpCisJCXsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogaGVhcnQgYmVhdFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9ERUZFUikKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGphbW1lZFxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICAvKiBJZ25vcmUgbGF0ZSBjb2xsaXNpb25zIHNpbmNlIHRoZXkncmUgbW9yZSBsaWtlbHkgdG8gaGFwcGVuCisJICAgICAgICogaGVyZSAodGhlIFdhdmVMQU4gZGVzaWduIHByZXZlbnRzIHRoZSBMQU4gY29udHJvbGxlciBmcm9tCisJICAgICAgICogcmVjZWl2aW5nIHdoaWxlIGl0IGlzIHRyYW5zbWl0dGluZykuIFdlIHRha2UgYWN0aW9uIG9ubHkgd2hlbgorCSAgICAgICAqIHRoZSBtYXhpbXVtIHJldHJhbnNtaXQgYXR0ZW1wdHMgaXMgZXhjZWVkZWQuCisJICAgICAgICovCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfQ09MTCkKKwkJeworCQkgIGlmKHR4X3N0YXR1cyAmIFRYX01BWF9DT0wpCisJCSAgICB7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGNvbmdlc3Rpb25cbiIsCisJCQkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICAgICAgaWYoISh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spKQorCQkJeworCQkJICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAweDEwOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0JLyogaWYoISh0eF9zdGF0dXMgJiBUWF9PSykpICovCisKKwkgIGxwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spOworCSAgbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCSAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOwkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisgICAgCX0gCisgICAgICBlbHNlCS8qIGlmIGludGVycnVwdCA9IHRyYW5zbWl0IGRvbmUgb3IgcmV0cmFuc21pdCBkb25lICovCisJeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgcHJpbnRrKEtFUk5fSU5GTyAid2F2ZWxhbl9jczogdW5rbm93biBpbnRlcnJ1cHQsIHN0YXR1czAgPSAlMDJ4XG4iLAorCQkgc3RhdHVzMCk7CisjZW5kaWYKKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworICAgIAl9CisgICAgfQkvKiB3aGlsZSgxKSAqLworCisgIHNwaW5fdW5sb2NrKCZscC0+c3BpbmxvY2spOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogV2UgYWx3YXlzIHJldHVybiBJUlFfSEFORExFRCwgYmVjYXVzZSB3ZSB3aWxsIHJlY2VpdmUgZW1wdHkKKyAgICogaW50ZXJydXB0cyB1bmRlciBub3JtYWwgb3BlcmF0aW9ucy4gQW55d2F5LCBpdCBkb2Vzbid0IG1hdHRlcgorICAgKiBhcyB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIElTQSBpbnRlcnJ1cHQgdGhhdCBjYW4ndCBiZSBzaGFyZWQuCisgICAqCisgICAqIEV4cGxhbmF0aW9uIDogdW5kZXIgaGVhdnkgcmVjZWl2ZSwgdGhlIGZvbGxvd2luZyBoYXBwZW5zIDoKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgIT0gMAorICAgKiAgICAgICAtPnd2X3BhY2tldF9yY3YoKQorICAgKiAgICAoc3RhdHVzMCAmIFNSMF9JTlRFUlJVUFQpICE9IDAKKyAgICogICAgICAgLT53dl9wYWNrZXRfcmN2KCkKKyAgICogICAgKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSA9PSAwCS8vIGkuZS4gbm8gbW9yZSBldmVudAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgPT0gMAkvLyBpLmUuIGVtcHR5IGludGVycnVwdAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogSmVhbiBJSSAqLworICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIHd2X2ludGVycnVwdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICoKKyAqIE5vdGUgOiBUaGlzIHdhdGNoZG9nIGlzIG1vdmUgY2xldmVyIHRoYW4gdGhlIG9uZSBpbiB0aGUgSVNBIGRyaXZlciwKKyAqIGJlY2F1c2UgaXQgdHJ5IHRvIGFib3J0IHRoZSBjdXJyZW50IGNvbW1hbmQgYmVmb3JlIHJlc2V0aW5nCisgKiBldmVyeXRoaW5nLi4uCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQncyBhIGJpdCBzaW1wbGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8KKyAqIGRlYWwgd2l0aCB0aGUgbXVsdGlwbGUgVHggYnVmZmVycy4uLgorICovCitzdGF0aWMgdm9pZAord2F2ZWxhbl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdAkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgaW50CQkJYWJvcnRlZCA9IEZBTFNFOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICBwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBBc2sgdG8gYWJvcnQgdGhlIGN1cnJlbnQgY29tbWFuZCAqLworICBvdXRiKE9QMF9BQk9SVCwgTENDUihiYXNlKSk7CisKKyAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCAoYSBiaXQgaGFja2lzaCkgKi8KKyAgaWYod3ZfODI1OTNfY21kKGRldiwgIndhdmVsYW5fd2F0Y2hkb2coKTogYWJvcnQiLAorCQkgIE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIFNSMF9FWEVDVVRJT05fQUJPUlRFRCkpCisgICAgYWJvcnRlZCA9IFRSVUU7CisKKyAgLyogUmVsZWFzZSBzcGlubG9jayBoZXJlIHNvIHRoYXQgd3ZfaHdfcmVzZXQoKSBjYW4gZ3JhYiBpdCAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBDaGVjayBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gYWJvcnRpbmcgaXQgKi8KKyAgaWYoIWFib3J0ZWQpCisgICAgeworICAgICAgLyogSXQgc2VlbSB0aGF0IGl0IHdhc24ndCBlbm91Z2ggKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3YXZlbGFuX3dhdGNoZG9nOiBhYm9ydCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHd2X2h3X3Jlc2V0KGRldik7CisgICAgfQorCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKyAgeworICAgIHBzYV90CQlwc2E7CisgICAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisgICAgd3ZfcHNhX3Nob3coJnBzYSk7CisgIH0KKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworICAvKiBXZSBhcmUgbm8gbW9yZSB3YWl0aW5nIGZvciBzb21ldGhpbmcuLi4gKi8KKyAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSGVyZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIHBjbWNpYSBwYWNrYWdlIChjYXJkbWdyKSBhbmQKKyAqIGxpbnV4IG5ldHdvcmtpbmcgKE5FVDMpIGZvciBpbml0aWFsaXphdGlvbiwgY29uZmlndXJhdGlvbiBhbmQKKyAqIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgV2F2ZWxhbiBQY21jaWEgSGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENvbmZpZ3VyZSBhbmQgc3RhcnQgdXAgdGhlIFdhdmVMQU4gUENNQ0lBIGFkYXB0b3IuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJvcGVuIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSBscC0+bGluazsKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9vcGVuKGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKyAgLyogQ2hlY2sgaWYgdGhlIG1vZGVtIGlzIHBvd2VyZWQgdXAgKHdhdmVsYW5fY2xvc2UoKSBwb3dlciBpdCBkb3duICovCisgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorICAgIHsKKyAgICAgIC8qIFBvd2VyIHVwIChwb3dlciB1cCB0aW1lIGlzIDI1MHVzKSAqLworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHBvd2VyZWQgdXAuLi4gKi8KKyAgICAgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd2F2ZWxhbl9vcGVuKCk6IG1vZGVtIG5vdCBjb25uZWN0ZWRcbiIsCisJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJICByZXR1cm4gRkFMU0U7CisJfQorICAgIH0KKworICAvKiBTdGFydCByZWNlcHRpb24gYW5kIGRlY2xhcmUgdGhlIGRyaXZlciByZWFkeSAqLworICBpZighbHAtPmNvbmZpZ3VyZWQpCisgICAgcmV0dXJuIEZBTFNFOworICBpZighd3ZfcnVfc3RhcnQoZGV2KSkKKyAgICB3dl9od19yZXNldChkZXYpOwkJLyogSWYgcHJvYmxlbSA6IHJlc2V0ICovCisgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgLyogTWFyayB0aGUgZGV2aWNlIGFzIHVzZWQgKi8KKyAgbGluay0+b3BlbisrOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIGlmKGRvX3JvYW1pbmcpCisgICAgd3Zfcm9hbV9pbml0KGRldik7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9vcGVuKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0ZG93biB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgImNsb3NlIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBkZXZfbGlua190ICoJbGluayA9ICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmxpbms7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworICAvKiBJZiB0aGUgZGV2aWNlIGlzbid0IG9wZW4sIHRoZW4gbm90aGluZyB0byBkbyAqLworICBpZighbGluay0+b3BlbikKKyAgICB7CisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd2F2ZWxhbl9jbG9zZSgpOiBkZXZpY2Ugbm90IG9wZW5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworICAvKiBDbGVhbnVwIG9mIHJvYW1pbmcgc3R1ZmYuLi4gKi8KKyAgaWYoZG9fcm9hbWluZykKKyAgICB3dl9yb2FtX2NsZWFudXAoZGV2KTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworICBsaW5rLT5vcGVuLS07CisKKyAgLyogSWYgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudCAqLworICBpZihuZXRpZl9ydW5uaW5nKGRldikpCisgICAgeworICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgICAvKiBTdG9wIHJlY2VpdmluZyBuZXcgbWVzc2FnZXMgYW5kIHdhaXQgZW5kIG9mIHRyYW5zbWlzc2lvbiAqLworICAgICAgd3ZfcnVfc3RvcChkZXYpOworCisgICAgICAvKiBQb3dlciBkb3duIHRoZSBtb2R1bGUgKi8KKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHdhdmVsYW5fYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAqIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZSAob25lIGludGVyZmFjZSkuICBUaGUgZGV2aWNlCisgKiBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKgord2F2ZWxhbl9hdHRhY2godm9pZCkKK3sKKyAgY2xpZW50X3JlZ190CWNsaWVudF9yZWc7CS8qIFJlZ2lzdGVyIHdpdGggY2FyZG1nciAqLworICBkZXZfbGlua190ICoJbGluazsJCS8qIEluZm8gZm9yIGNhcmRtZ3IgKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBJbnRlcmZhY2UgZ2VuZXJpYyBkYXRhICovCisgIG5ldF9sb2NhbCAqCWxwOwkJLyogSW50ZXJmYWNlIHNwZWNpZmljIGRhdGEgKi8KKyAgaW50CQlyZXQ7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiLT4gd2F2ZWxhbl9hdHRhY2goKVxuIik7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworICBsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKyAgaWYgKCFsaW5rKSByZXR1cm4gTlVMTDsKKyAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworICBsaW5rLT5pby5OdW1Qb3J0czEgPSA4OworICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDM7CisKKyAgLyogSW50ZXJydXB0IHNldHVwICovCisgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgIGxpbmstPmlycS5IYW5kbGVyID0gd2F2ZWxhbl9pbnRlcnJ1cHQ7CisKKyAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgIC8qIENoYWluIGRyaXZlcnMgKi8KKyAgbGluay0+bmV4dCA9IGRldl9saXN0OworICBkZXZfbGlzdCA9IGxpbms7CisKKyAgLyogQWxsb2NhdGUgdGhlIGdlbmVyaWMgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworICBpZiAoIWRldikgeworICAgICAga2ZyZWUobGluayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBsaW5rLT5wcml2ID0gbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCisgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAvKiBJbml0IHNwZWNpZmljIGRhdGEgKi8KKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICBscC0+cmVjb25maWdfODI1OTMgPSBGQUxTRTsKKyAgbHAtPm5yZXNldHMgPSAwOworICAvKiBNdWx0aWNhc3Qgc3R1ZmYgKi8KKyAgbHAtPnByb21pc2N1b3VzID0gMDsKKyAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisgIGxwLT5tY19jb3VudCA9IDA7CisKKyAgLyogSW5pdCBzcGlubG9jayAqLworICBzcGluX2xvY2tfaW5pdCgmbHAtPnNwaW5sb2NrKTsKKworICAvKiBiYWNrIGxpbmtzICovCisgIGxwLT5saW5rID0gbGluazsKKyAgbHAtPmRldiA9IGRldjsKKworICAvKiB3YXZlbGFuIE5FVDMgY2FsbGJhY2tzICovCisgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgZGV2LT5vcGVuID0gJndhdmVsYW5fb3BlbjsKKyAgZGV2LT5zdG9wID0gJndhdmVsYW5fY2xvc2U7CisgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJndhdmVsYW5fcGFja2V0X3htaXQ7CisgIGRldi0+Z2V0X3N0YXRzID0gJndhdmVsYW5fZ2V0X3N0YXRzOworICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdDsKKyNpZmRlZiBTRVRfTUFDX0FERFJFU1MKKyAgZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmd2F2ZWxhbl9zZXRfbWFjX2FkZHJlc3M7CisjZW5kaWYJLyogU0VUX01BQ19BRERSRVNTICovCisKKyAgLyogU2V0IHRoZSB3YXRjaGRvZyB0aW1lciAqLworICBkZXYtPnR4X3RpbWVvdXQJPSAmd2F2ZWxhbl93YXRjaGRvZzsKKyAgZGV2LT53YXRjaGRvZ190aW1lbwk9IFdBVENIRE9HX0pJRkZJRVM7CisgIFNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmd2F2ZWxhbl9oYW5kbGVyX2RlZjsKKyAgbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworICAvKiBPdGhlciBzcGVjaWZpYyBkYXRhICovCisgIGRldi0+bXR1ID0gV0FWRUxBTl9NVFU7CisKKyAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gCisgICAgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFIHwKKyAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKyAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmd2F2ZWxhbl9ldmVudDsKKyAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIndhdmVsYW5fYXR0YWNoKCk6IGFsbW9zdCBkb25lLCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnRcbiIpOworI2VuZGlmCisKKyAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgIGlmKHJldCAhPSAwKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICB3YXZlbGFuX2RldGFjaChsaW5rKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LSB3YXZlbGFuX2F0dGFjaCgpXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiBsaW5rOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3dhdmVsYW5fZGV0YWNoKGRldl9saW5rX3QgKglsaW5rKQoreworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPiB3YXZlbGFuX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CisgICAqIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuIHRoZQorICAgKiByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorICAgKiBkZXRhY2goKS4KKyAgICovCisgIGlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICB7CisgICAgICAvKiBTb21lIG90aGVycyBoYXZlbid0IGRvbmUgdGhlaXIgam9iIDogZ2l2ZSB0aGVtIGFub3RoZXIgY2hhbmNlICovCisgICAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKyAgICB9CisKKyAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGlmKGxpbmstPmhhbmRsZSkKKyAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgLyogUmVtb3ZlIHRoZSBpbnRlcmZhY2UgZGF0YSBmcm9tIHRoZSBsaW5rZWQgbGlzdCAqLworICBpZihkZXZfbGlzdCA9PSBsaW5rKQorICAgIGRldl9saXN0ID0gbGluay0+bmV4dDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRldl9saW5rX3QgKglwcmV2ID0gZGV2X2xpc3Q7CisKKyAgICAgIHdoaWxlKChwcmV2ICE9IChkZXZfbGlua190ICopIE5VTEwpICYmIChwcmV2LT5uZXh0ICE9IGxpbmspKQorCXByZXYgPSBwcmV2LT5uZXh0OworCisgICAgICBpZihwcmV2ID09IChkZXZfbGlua190ICopIE5VTEwpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVsYW5fZGV0YWNoIDogQXR0ZW1wdGluZyB0byByZW1vdmUgYSBub25leGlzdGVudCBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCSAgcmV0dXJuOworCX0KKworICAgICAgcHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgfQorCisgIC8qIEZyZWUgcGllY2VzICovCisgIGlmKGxpbmstPnByaXYpCisgICAgeworICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworICAgICAgLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBrZXJuZWwgbGlzdCBvZiBldGhlcm5ldCBkZXZpY2VzICovCisgICAgICAvKiBXYXJuaW5nIDogY2FuJ3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0LCB0aW1lciBvciB3YXZlbGFuX2Nsb3NlKCkgKi8KKyAgICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgICAoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5saW5rID0gTlVMTDsKKyAgICAgICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmRldiA9IE5VTEw7CisgICAgICBmcmVlX25ldGRldihkZXYpOworICAgIH0KKyAga2ZyZWUobGluayk7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC0gd2F2ZWxhbl9kZXRhY2goKVxuIik7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmCisgKiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuIEEgQ0FSRF9SRU1PVkFMIGV2ZW50IGFsc28gc2V0cworICogc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZyB0byB0YWxrIHRvIHRoZQorICogY2FyZCBhbnkgbW9yZS4KKyAqLworc3RhdGljIGludAord2F2ZWxhbl9ldmVudChldmVudF90CQlldmVudCwJCS8qIFRoZSBldmVudCByZWNlaXZlZCAqLworCSAgICAgIGludAkJcHJpb3JpdHksCisJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICoJYXJncykKK3sKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSAoZGV2X2xpbmtfdCAqKSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPndhdmVsYW5fZXZlbnQoKTogJXNcbiIsCisJICgoZXZlbnQgPT0gQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKT8icmVnaXN0cmF0aW9uIGNvbXBsZXRlIiA6CisJICAoKGV2ZW50ID09IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkgPyAiY2FyZCByZW1vdmFsIiA6CisJICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikgPyAiY2FyZCBpbnNlcnRpb24iIDoKKwkgICAgKChldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EKSA/ICJwbSBzdXNwZW5kIiA6CisJICAgICAoKGV2ZW50ID09IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKSA/ICJwaHlzaWNhbCByZXNldCIgOgorCSAgICAgICgoZXZlbnQgPT0gQ1NfRVZFTlRfUE1fUkVTVU1FKSA/ICJwbSByZXN1bWUiIDoKKwkgICAgICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX1JFU0VUKSA/ICJjYXJkIHJlc2V0IiA6CisJCSJ1bmtub3duIikpKSkpKSkpOworI2VuZGlmCisKKyAgICBzd2l0Y2goZXZlbnQpCisgICAgICB7CisgICAgICBjYXNlIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURToKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiByZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworI2VuZGlmCisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCS8qIE91cHMgISBUaGUgY2FyZCBpcyBubyBtb3JlIHRoZXJlICovCisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgIHsKKwkgICAgLyogQWNjZXB0IG5vIG1vcmUgdHJhbnNtaXNzaW9ucyAqLworCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkgICAgLyogUmVsZWFzZSB0aGUgY2FyZCAqLworCSAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJaWYod3ZfcGNtY2lhX2NvbmZpZyhsaW5rKSAmJgorCSAgIHd2X2h3X2NvbmZpZyhkZXYpKQorCSAgd3ZfaW5pdF9pbmZvKGRldik7CisJZWxzZQorCSAgZGV2LT5pcnEgPSAwOworCWJyZWFrOworCisgICAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJLyogTkI6IHdhdmVsYW5fY2xvc2Ugd2lsbCBiZSBjYWxsZWQsIGJ1dCB0b28gbGF0ZSwgc28gd2UgYXJlCisJICogb2JsaWdlZCB0byBjbG9zZSBuaWNlbHkgdGhlIHdhdmVsYW4gaGVyZS4gRGF2aWQsIGNvdWxkIHlvdQorCSAqIGNsb3NlIHRoZSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcgdGhlbSA/IEFuZCwgYnkgdGhlIHdheSwKKwkgKiBjb3VsZCB5b3UsIG9uIHJlc3VtZSwgYWRkIGEgInJvdXRlIGFkZCAtbmV0IC4uLiIgYWZ0ZXIgdGhlCisJICogaWZjb25maWcgdXAgPyBUaGFua3MuLi4gKi8KKworCS8qIFN0b3AgcmVjZWl2aW5nIG5ldyBtZXNzYWdlcyBhbmQgd2FpdCBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisJd3ZfcnVfc3RvcChkZXYpOworCisJLyogUG93ZXIgZG93biB0aGUgbW9kdWxlICovCisJaGFjcl93cml0ZShkZXYtPmJhc2VfYWRkciwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisKKwkvKiBUaGUgY2FyZCBpcyBub3cgc3VzcGVuZGVkICovCisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgIAlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCisJICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCS8qIElmIFJFU0VUIC0+IFRydWUsIElmIFJFU1VNRSAtPiBGYWxzZSA/ICovCisJICAgICAgeworCQl3dl9od19yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgICAgfQorCSAgfQorCWJyZWFrOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LXdhdmVsYW5fZXZlbnQoKVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3YXZlbGFuX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIndhdmVsYW5fY3MiLAorCX0sCisJLmF0dGFjaAkJPSB3YXZlbGFuX2F0dGFjaCwKKwkuZGV0YWNoCQk9IHdhdmVsYW5fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfd2F2ZWxhbl9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF93YXZlbGFuX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfd2F2ZWxhbl9jcyk7Cittb2R1bGVfZXhpdChleGl0X3dhdmVsYW5fY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2ZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbml6YXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICogT3JpZ2luYWwgY29weXJpZ2h0IGZvbGxvdy4gU2VlIHdhdmVsYW5fY3MuaCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbiB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBXYXZlbGFuIGhhcmR3YXJlLiBOb3RlIHRoYXQKKyAqIHRoZSBQY21jaWEgV2F2ZWxhbiBpbmNsdWRlIGEgaTgyNTkzIGNvbnRyb2xsZXIgKHNlZSBkZWZpbml0aW9ucyBpbgorICogZmlsZSBpODI1OTMuaCkuCisgKgorICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwY21jaWEgaGFyZHdhcmUgYW5kIHRoZSBJU0Egb25lIGlzCisgKiB0aGUgRXRoZXJuZXQgQ29udHJvbGxlciAoaTgyNTkzIGluc3RlYWQgb2YgaTgyNTg2KS4gVGhlIGk4MjU5MyBhbGxvdworICogb25seSBvbmUgc2VuZCBidWZmZXIuIFRoZSBQU0EgKFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgOiBFRXByb20gZm9yCisgKiBwZXJtYW5lbnQgc3RvcmFnZSBvZiB2YXJpb3VzIGluZm8pIGlzIG1lbW9yeSBtYXBwZWQsIGJ1dCBub3QgdGhlCisgKiBNTUkgKE1vZGVtIE1hbmFnZW1lbnQgSW50ZXJmYWNlKS4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBBVCZUIEdJUyAoZm9ybWVybHkgTkNSKSBXYXZlTEFOIFBDTUNJQSBjYXJkOiAKKyAqICAgQW4gRXRoZXJuZXQtbGlrZSByYWRpbyB0cmFuc2NlaXZlciBjb250cm9sbGVkIGJ5IGFuIEludGVsIDgyNTkzCisgKiAgIGNvcHJvY2Vzc29yLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgMTk5NQorICogICBBbnRob255IEQuIEpvc2VwaAorICogICBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHByb2dyYW0KKyAqICAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyAqICAgdGhhdCB0aGlzIGNvcHlyaWdodCBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMKKyAqICAgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkCisgKiAgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKKyAqICAgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4KKyAqICAgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzCisgKiAgIGJ5IHBlcm1pc3Npb24gb2YgTS5JLlQuICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0CisgKiAgIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByby0KKyAqICAgdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIENyZWRpdHM6CisgKiAgICAgU3BlY2lhbCB0aGFua3MgdG8gSmFuIEhvb2dlbmRvb3JuIG9mIEFUJlQgR0lTIFV0cmVjaHQgZm9yCisgKiAgICAgICBwcm92aWRpbmcgZXh0cmVtZWx5IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgICBUaGlzIGRyaXZlciBpcyBiYXNlZCB1cG9uIHNldmVyYWwgb3RoZXIgZHJpdmVycywgaW4gcGFydGljdWxhcjoKKyAqICAgICAgIERhdmlkIEhpbmRzJyBMaW51eCBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgM2M1ODkgZXRoZXJuZXQgYWRhcHRlcgorICogICAgICAgQnJ1Y2UgSmFuc29uJ3MgTGludXggZHJpdmVyIGZvciB0aGUgQVQtYnVzIFdhdmVMQU4gYWRhcHRlcgorICoJIEFuZGVycyBLbGVtZXRzJyBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyIGRyaXZlcgorICogICAgICAgUm9iZXJ0IE1vcnJpcycgQlNESSBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyCisgKi8KKworI2lmbmRlZiBfV0FWRUxBTl9DU19ICisjZGVmaW5lCV9XQVZFTEFOX0NTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1BR0lDIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZGV0ZWN0aW9uIG9mIHRoZSB3YXZlbGFuIGNhcmQgaXMgbWFkZSBieSByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcworICogZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuIElmIHlvdSBoYXZlIGEgbm9uIEFUJlQgcHJvZHVjdCAoT0VNLAorICogbGlrZSBERUMgUm9hbUFib3V0LCBvciBEaWdpdGFsIE9jZWFuLCBFcHNvbiwgLi4uKSwgeW91IG11c3QgbW9kaWZ5IHRoaXMKKyAqIHBhcnQgdG8gYWNjb21tb2RhdGUgeW91ciBoYXJkd2FyZS4uLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyCU1BQ19BRERSRVNTRVNbXVszXSA9Cit7CisgIHsgMHgwOCwgMHgwMCwgMHgwRSB9LAkJLyogQVQmVCBXYXZlbGFuIChzdGFuZGFyZCkgJiBERUMgUm9hbUFib3V0ICovCisgIHsgMHgwOCwgMHgwMCwgMHg2QSB9LAkJLyogQVQmVCBXYXZlbGFuIChhbHRlcm5hdGUpICovCisgIHsgMHgwMCwgMHgwMCwgMHhFMSB9LAkJLyogSGl0YWNoaSBXYXZlbGFuICovCisgIHsgMHgwMCwgMHg2MCwgMHgxRCB9CQkvKiBMdWNlbnQgV2F2ZWxhbiAoYW5vdGhlciBvbmUpICovCisgIC8qIEFkZCB5b3VyIGNhcmQgaGVyZSBhbmQgc2VuZCBtZSB0aGUgcGF0Y2ggISAqLworfTsKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworY29uc3Qgc2hvcnQJY2hhbm5lbF9iYW5kc1tdID0geyAweDMwLCAweDU4LCAweDY0LCAweDdBLCAweDgwLCAweEE4LAorCQkJCSAgICAweEQwLCAweEYwLCAweEY4LCAweDE1MCB9OworCisvKiBGcmVxdWVuY2llcyBvZiB0aGUgMS4wIG1vZGVtIChmaXhlZCBmcmVxdWVuY2llcykuCisgKiBVc2UgdG8gbWFwIHRoZSBQU0EgYHN1YmJhbmQnIHRvIGEgZnJlcXVlbmN5CisgKiBOb3RlIDogYWxsIGZyZXF1ZW5jaWVzIGFwYXJ0IGZyb20gdGhlIGZpcnN0IG9uZSBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMTAKKyAqLworY29uc3QgaW50CWZpeGVkX2JhbmRzW10gPSB7IDkxNWU2LCAyLjQyNWU4LCAyLjQ2ZTgsIDIuNDg0ZTgsIDIuNDMwNWU4IH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQyBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2F2ZUxBTiBob3N0IGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUxDQ1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUxDU1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEFDUihiYXNlKQkoYmFzZSsweDEpCS8qIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUhBU1IoYmFzZSkJKGJhc2UrMHgxKQkvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT1JMKGJhc2UpCShiYXNlKzB4MikJLyogUHJvZ3JhbSBJL08gUmVnaXN0ZXIgTG93ICovCisjZGVmaW5lIFJQTEwoYmFzZSkJKGJhc2UrMHgyKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBMb3cgKi8KKyNkZWZpbmUgUElPUkgoYmFzZSkJKGJhc2UrMHgzKQkvKiBQcm9ncmFtIEkvTyBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIFJQTEgoYmFzZSkJKGJhc2UrMHgzKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBIaWdoICovCisjZGVmaW5lIFBJT1AoYmFzZSkJKGJhc2UrMHg0KQkvKiBQcm9ncmFtIEkvTyBQb3J0ICovCisjZGVmaW5lIE1NUihiYXNlKQkoYmFzZSsweDYpCS8qIE1NSSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1NRChiYXNlKQkoYmFzZSsweDcpCS8qIE1NSSBEYXRhIFJlZ2lzdGVyICovCisKKy8qIEhvc3QgQWRhcHRvciBDb21tYW5kIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBQ1JfTE9GCSAgKDEgPDwgMykJLyogTG9jayBPdXQgRmxhZywgdG9nZ2xlIGV2ZXJ5IDI1MG1zICovCisjZGVmaW5lIEhBQ1JfUFdSX1NUQVQJICAoMSA8PCA0KQkvKiBQb3dlciBTdGF0ZSwgMT1hY3RpdmUsIDA9c2xlZXAgKi8KKyNkZWZpbmUgSEFDUl9UWF9ETUFfUkVTRVQgKDEgPDwgNSkJLyogUmVzZXQgdHJhbnNtaXQgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUlhfRE1BX1JFU0VUICgxIDw8IDYpCS8qIFJlc2V0IHJlY2VpdmUgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUk9NX1dFTgkgICgxIDw8IDcpCS8qIEVFUFJPTSB3cml0ZSBlbmFibGVkIHdoZW4gdHJ1ZSAqLworCisjZGVmaW5lIEhBQ1JfUkVTRVQgICAgICAgICAgICAgIChIQUNSX1RYX0RNQV9SRVNFVCB8IEhBQ1JfUlhfRE1BX1JFU0VUKQorI2RlZmluZQlIQUNSX0RFRkFVTFQJCShIQUNSX1BXUl9TVEFUKQorCisvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBU1JfTU1JX0JVU1kJKDEgPDwgMikJLyogTU1JIGlzIGJ1c3kgd2hlbiB0cnVlICovCisjZGVmaW5lIEhBU1JfTE9GCSgxIDw8IDMpCS8qIExvY2sgb3V0IGZsYWcgc3RhdHVzICovCisjZGVmaW5lIEhBU1JfTk9fQ0xLCSgxIDw8IDQpCS8qIGFjdGl2ZSB3aGVuIG1vZGVtIG5vdCBjb25uZWN0ZWQgKi8KKworLyogTWlzY2VsbGFuZW91cyBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBQSU9SSF9TRUxfVFgJKDEgPDwgNSkJLyogUElPUiBwb2ludHMgdG8gMD1yeC8xPXR4IGJ1ZmZlciAqLworI2RlZmluZSBNTVJfTU1JX1dSCSgxIDw8IDApCS8qIE5leHQgTU1JIGN5Y2xlIGlzIDA9cmVhZCwgMT13cml0ZSAqLworI2RlZmluZSBQSU9SSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgUlBMSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgTU1JX0FERFJfTUFTSwkweDdlCQkvKiBCaXRzIDEtNiBvZiBNTVIgYXJlIHNpZ25pZmljYW50ICovCisKKy8qIEF0dHJpYnV0ZSBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgQ0lTX0FERFIJMHgwMDAwCQkvKiBDYXJkIEluZm9ybWF0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQU0FfQUREUgkweDBlMDAJCS8qIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgYWRkcmVzcyAqLworI2RlZmluZSBFRVBST01fQUREUgkweDEwMDAJCS8qIEVFUFJPTSBhZGRyZXNzICh1bnVzZWQgPykgKi8KKyNkZWZpbmUgQ09SX0FERFIJMHg0MDAwCQkvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciAqLworCisvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDT1JfQ09ORklHCSgxIDw8IDApCS8qIENvbmZpZyBJbmRleCwgMCB3aGVuIHVuY29uZmlndXJlZCAqLworI2RlZmluZSBDT1JfU1dfUkVTRVQJKDEgPDwgNykJLyogU29mdHdhcmUgUmVzZXQgb24gdHJ1ZSAqLworI2RlZmluZSBDT1JfTEVWRUxfSVJRCSgxIDw8IDYpCS8qIExldmVsIElSUSAqLworCisvKiBMb2NhbCBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgUlhfQkFTRQkJMHgwMDAwCQkvKiBSZWNlaXZlIG1lbW9yeSwgOCBrQiAqLworI2RlZmluZSBUWF9CQVNFCQkweDIwMDAJCS8qIFRyYW5zbWl0IG1lbW9yeSwgMiBrQiAqLworI2RlZmluZSBVTlVTRURfQkFTRQkweDI4MDAJCS8qIFVudXNlZCwgMjIga0IgKi8KKyNkZWZpbmUgUlhfU0laRQkJKFRYX0JBU0UtUlhfQkFTRSkJLyogU2l6ZSBvZiByZWNlaXZlIGFyZWEgKi8KKyNkZWZpbmUgUlhfU0laRV9TSElGVAk2CQkvKiBCaXRzIHRvIHNoaWZ0IGluIHN0b3AgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBNT0RfRU5BTCAxCisjZGVmaW5lIE1PRF9QUk9NIDIKKworLyogU2l6ZSBvZiBhIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFdBVkVMQU5fQUREUl9TSVpFCTYKKworLyogTWF4aW11bSBzaXplIG9mIFdhdmVsYW4gcGFja2V0ICovCisjZGVmaW5lIFdBVkVMQU5fTVRVCTE1MDAKKworI2RlZmluZQlNQVhEQVRBWgkJKDYgKyA2ICsgMiArIFdBVkVMQU5fTVRVKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICAvKiBGb3IgdGhlIFBDTUNJQSBBZGFwdGVyLCBsb2NhdGlvbnMgMHgwMC0weDBGIGFyZSB1bnVzZWQgYW5kIGZpeGVkIGF0IDAwICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8xOwkvKiBbMHgwMF0gQmFzZSBhZGRyZXNzIDEgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8yOwkvKiBbMHgwMV0gQmFzZSBhZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzM7CS8qIFsweDAyXSBCYXNlIGFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfNDsJLyogWzB4MDNdIEJhc2UgYWRkcmVzcyA0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMTsJLyogWzB4MDRdIFJlbW90ZSBCb290IEFkZHJlc3MgMSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzI7CS8qIFsweDA1XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8zOwkvKiBbMHgwNl0gUmVtb3RlIEJvb3QgQWRkcmVzcyAzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2hvbGlfcGFyYW1zOwkvKiBbMHgwN10gSE9zdCBMYW4gSW50ZXJmYWNlIChIT0xJKSBQYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ludF9yZXFfbm87CQkvKiBbMHgwOF0gSW50ZXJydXB0IFJlcXVlc3QgTGluZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV91bnVzZWQwWzddOwkJLyogWzB4MDktMHgwRl0gdW51c2VkICovCisKKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9tYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIFsweDEwLTB4MTVdIFVuaXZlcnNhbCAoZmFjdG9yeSkgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbG9jYWxfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxNi0xQl0gTG9jYWwgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9sb2NhbF9zZWw7CS8qIFsweDFDXSBVbml2ZXJzYWwgTG9jYWwgU2VsZWN0aW9uICovCisjZGVmaW5lCQlQU0FfVU5JVkVSU0FMCTAJCS8qIFVuaXZlcnNhbCAoZmFjdG9yeSkgKi8KKyNkZWZpbmUJCVBTQV9MT0NBTAkxCQkvKiBMb2NhbCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb21wX251bWJlcjsJLyogWzB4MURdIENvbXBhdGFiaWxpdHkgTnVtYmVyOiAqLworI2RlZmluZQkJUFNBX0NPTVBfUENfQVRfOTE1CTAgCS8qIFBDLUFUIDkxNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzkxNQkxIAkvKiBQQy1NQyA5MTUgTUh6CSovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF8yNDAwCTIgCS8qIFBDLUFUIDIuNCBHSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIegkqLworI2RlZmluZQkJUFNBX0NPTVBfUENNQ0lBXzkxNQk0IAkvKiBQQ01DSUEgOTE1IE1IeiBvciAyLjAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdGhyX3ByZV9zZXQ7CS8qIFsweDFFXSBNb2RlbSBUaHJlc2hvbGQgUHJlc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ZlYXR1cmVfc2VsZWN0OwkvKiBbMHgxRl0gQ2FsbCBjb2RlIHJlcXVpcmVkICgxPW9uKSAqLworI2RlZmluZQkJUFNBX0ZFQVRVUkVfQ0FMTF9DT0RFCTB4MDEgCS8qIENhbGwgY29kZSByZXF1aXJlZCAoSmFwYW4pICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3N1YmJhbmQ7CQkvKiBbMHgyMF0gU3ViYmFuZAkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfOTE1CQkwCS8qIDkxNSBNSHogb3IgMi4wICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDI1CTEJLyogMjQyNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQ4NAkzCS8qIDI0ODQgTUh6CSovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDMwXzUJNAkvKiAyNDMwLjUgTUh6CSovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ID8/PyAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24gT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbiBPZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlQU0FfU0laRQk2NAorCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZQorICogV2FybmluZyA6IG9ubHkgZXZlbiBhZGRyZXNzZXMgYXJlIHVzZWQgKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIGVuYWJsZS9kaXNhYmxlIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX01PREUJMHgwMgkvKiBNb2RlIG9mIHNlY3VyaXR5IG9wdGlvbiAqLworI2RlZmluZQlNTVdfRU5DUl9FTkFCTEVfRU4JMHgwMQkvKiBFbmFibGUgc2VjdXJpdHkgb3B0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDBbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVzX2lvX2ludmVydDsJLyogRW5jcnlwdGlvbiBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfUkVTCTB4MEYJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfQ1RSTAkweEYwCS8qIENvbnRyb2wgPz8/IChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMVs1XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19sb29wdF9zZWw7CQkvKiBsb29wdGVzdCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9ESVNfTldJRAkweDQwCS8qIGRpc2FibGUgTldJRCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBhY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdCAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xTCTB4MTAJLyogbG9vcHRlc3Qgdy9vIGNvbGxpc2lvbiBhdm9pZGFuY2UgKi8KKyNkZWZpbmUgTU1XX0xPT1BUX1NFTF9MVDNBCTB4MDgJLyogbG9vcHRlc3QgM2EgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNCCTB4MDQJLyogbG9vcHRlc3QgM2IgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNDCTB4MDIJLyogbG9vcHRlc3QgM2MgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNECTB4MDEJLyogbG9vcHRlc3QgM2QgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfamFiYmVyX2VuYWJsZTsJLyogamFiYmVyIHRpbWVyIGVuYWJsZSAqLworICAvKiBBYm9ydCB0cmFuc21pc3Npb25zID4gMjAwIG1zICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZyZWV6ZTsJCS8qIGZyZWV6ZSAvIHVuZnJlZWV6ZSBzaWduYWwgbGV2ZWwgKi8KKyAgLyogMCA6IHNpZ25hbCBsZXZlbCAmIHF1YWwgdXBkYXRlZCBmb3IgZXZlcnkgbmV3IG1lc3NhZ2UsIDEgOiBmcm96ZW4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfYW50ZW5fc2VsOwkJLyogYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTU1XX0FOVEVOX1NFTF9TRUwJMHgwMQkvKiBkaXJlY3QgYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0FOVEVOX1NFTF9BTEdfRU4JMHgwMgkvKiBhbnRlbm5hIHNlbGVjdGlvbiBhbGdvLiBlbmFibGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfaWZzOwkJLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICAvKiBtaW4gdGltZSBiZXR3ZWVuIHRyYW5zbWlzc2lvbiBpbiBiaXQgcGVyaW9kcyAoLjUgdXMpIC0gYml0IDAgaWdub3JlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19tb2RfZGVsYXk7CSAJLyogbW9kZW0gZGVsYXkgKHN5bmNocm8pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phbV90aW1lOwkJLyogamFtbWluZyB0aW1lIChhZnRlciBjb2xsaXNpb24pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDJbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdGhyX3ByZV9zZXQ7CS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggc2lnbmFsIDwgdGhpcyB2YWx1ZSAoNCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfcHJtOwkJLyogZGVjYXkgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZWNheV91cGRhdF9wcm07CS8qIGRlY2F5IHVwZGF0ZSBwYXJhbWV0ZXJ6ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3F1YWxpdHlfdGhyOwkvKiBxdWFsaXR5ICh6LXF1b3RpZW50KSB0aHJlc2hvbGQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggcXVhbGl0eSA8IHRoaXMgdmFsdWUgKDMpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbmV0d19pZF9oOwkJLyogTldJRCBoaWdoIG9yZGVyIGJ5dGUgKi8KKyAgLyogTmV0d29yayBJRCBvciBEb21haW4gOiBjcmVhdGUgdmlydHVhbCBuZXQgb24gdGhlIGFpciAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kZV9zZWxlY3Q7CS8qIGZvciBhbmFsb2cgdGVzdHMgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQzWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9jdHJsOwkJLyogZnJlcXVlbmN5IGVlcHJvbSBjb250cm9sICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkUJMHgxMAkvKiBFbmFibGUgcHJvdGVjdGVkIGluc3RydWN0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfRFdMRAkweDA4CS8qIERvd25sb2FkIGVlcHJvbSB0byBtbWMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFcHJvbSBjb21tYW5kcyA6ICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dSQUxMCTB4MDQJLyogV3JpdGUgZGF0YSB0byBhbGwgYWRkcmVzc2VzICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XRFMJMHgwNAkvKiBXcml0ZSBkaXNhYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUlJFQUQJMHgxNgkvKiBSZWFkIGFkZHIgZnJvbSBwcm90ZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkVOCTB4MTQJLyogUHJvdGVjdCByZWdpc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSQ0xFQVIJMHgxNwkvKiBVbnByb3RlY3QgYWxsIHJlZ2lzdGVycyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHIgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGlzIGNvbW1hbmQgKFBSRFMpIDogaXQncyBpcnJldmVyc2libGUgISEhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRXByb20gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbCAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfT0ZGU0VUCTB4MEYJLyogT2Zmc2V0IGluIGNoYW5uZWwgZGF0YSAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfRU4JCTB4QzAJLyogRkVFX0NUUkwgZW5hYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0RTCQkweDAwCS8qIEZFRV9DVFJMIGRpc2FibGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQUxMCTB4NDAJLyogRkVFX0NUUkwgYWxsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0NMRUFSCTB4RkYJLyogRkVFX0NUUkwgY2xlYXIgb3BlcmF0aW9ucyAqLworCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2w7CQkvKiBXcml0ZSBkYXRhIHRvIEVFcHJvbSAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9oOwkJLyogaGlnaCBvY3RldCAqLworICB1bnNpZ25lZCBjaGFyCW1td19leHRfYW50OwkJLyogU2V0dGluZyBmb3IgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9FWFRBTlQJMHgwMQkvKiBTZWxlY3QgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9QT0wJCTB4MDIJLyogUG9sYXJpdHkgb2YgdGhlIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfSU5URVJOQUwJMHgwMAkvKiBJbnRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEVSTkFMCTB4MDMJLyogRXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JUV9URVNUCTB4MUMJLyogSVEgdGVzdCBwYXR0ZXJuIChzZXQgdG8gMCkgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlNTVdfU0laRQkzNworCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZSAqLworI2RlZmluZQltbXdvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXdfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIGlkIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRCdzIHJ4ZCAobG93KSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9jb3JyZWN0X253aWRfaDsJLyogIyBvZiBjb3JyZWN0IE5XSUQncyByeGQgKGhpZ2gpICovCisgIC8qIFdhcm5pbmcgOiBSZWFkIGhpZ2ggb3JkZXIgb2N0ZXQgZmlyc3QgISEhICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfbDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChoaWdoKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl90aHJfcHJlX3NldDsJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVQJCTB4M0YJCS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyNkZWZpbmUJTU1SX1RIUl9QUkVfU0VUX0NVUgkweDgwCQkvKiBDdXJyZW50IHNpZ25hbCBhYm92ZSBpdCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWduYWxfbHZsOwkJLyogc2lnbmFsIGxldmVsICovCisjZGVmaW5lCU1NUl9TSUdOQUxfTFZMCQkweDNGCQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2lsZW5jZV9sdmw7CS8qIHNpbGVuY2UgbGV2ZWwgKG5vaXNlKSAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkwJCTB4M0YJCS8qIHNpbGVuY2UgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJTEVOQ0VfTFZMX1ZBTElECTB4ODAJCS8qIFVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NnbmxfcXVhbDsJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUwJCTB4MEYJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUxfQU5UCTB4ODAJCS8qIGN1cnJlbnQgYW50ZW5uYSB1c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDNbM107CQkvKiB1bnVzZWQgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9zdGF0dXM7CQkvKiBTdGF0dXMgb2YgZnJlcXVlbmN5IGVlcHJvbSAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19JRAkweEYwCQkvKiBNb2RlbSByZXZpc2lvbiBpZCAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19EV0xECTB4MDgJCS8qIERvd25sb2FkIGluIHByb2dyZXNzICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0JVU1kJMHgwNAkJLyogRUVwcm9tIGJ1c3kgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkNFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9mZWVfZGF0YV9sOwkJLyogUmVhZCBkYXRhIGZyb20gZWVwcm9tIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2g7CQkvKiBSZWFkIGRhdGEgZnJvbSBlZXByb20gKGhpZ2gpICovCit9OworCisvKiBTaXplIGZvciBzdHJ1Y3R1cmUgY2hlY2tpbmcgKGlmIHBhZGRpbmcgaXMgY29ycmVjdCkgKi8KKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJbW1yb2ZmKHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigobW1yX3QgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJlZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWluIGFsbCBkZWZpbml0aW9uIGFuZCBkZWNsYXJhdGlvbnMgbmVjZXNzYXJ5IGZvciB0aGUKKyAqIHdhdmVsYW4gcGNtY2lhIGRyaXZlci4gVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBvbiB3YXZlbGFuX2NzLmMgISEhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX0NTX1BfSAorI2RlZmluZSBXQVZFTEFOX0NTX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGRyaXZlciBwcm92aWRlIGEgTGludXggaW50ZXJmYWNlIHRvIHRoZSBXYXZlbGFuIFBjbWNpYSBoYXJkd2FyZQorICogVGhlIFdhdmVsYW4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVsYW4gYXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgREVDIChSb2FtQWJvdXQgRFMpLi4uCisgKgorICogVG8ga25vdyBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBQQ01DSUEgSE9XVE8uCisgKiBJZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBtYW55IG90aGVyIGZvbmN0aW9uYWxpdGllcywgbG9vayBjb21tZW50cworICogaW4gdGhlIGNvZGUuLi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGVzIChzZWUgYmVsb3cpLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEVDSUZJQyBOT1RFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXZWIgcGFnZQorICogLS0tLS0tLS0KKyAqCUkgdHJ5IHRvIG1haW50YWluIGEgd2ViIHBhZ2Ugd2l0aCB0aGUgV2lyZWxlc3MgTEFOIEhvd3RvIGF0IDoKKyAqCSAgICBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1dhdmVsYW4uaHRtbAorICoKKyAqIFNNUAorICogLS0tCisgKglXZSBub3cgYXJlIFNNUCBjb21wbGlhbnQgKEkgZXZlbnR1YWxseSBmaXhlZCB0aGUgcmVtYWluaW5nIGJ1Z3MpLgorICoJVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBkdWFsIFA2LTE1MCBhbmQgc3Vydml2ZWQgbXkgdXN1YWwKKyAqCXNldCBvZiB0b3J0dXJlIHRlc3RzLgorICoJQW55d2F5LCBJIHNwZW50IGVub3VnaCB0aW1lIGNoYXNpbmcgaW50ZXJydXB0IHJlLWVudHJhbmN5IGR1cmluZworICoJZXJyb3JzIG9yIHJlY29uZmlndXJlLCBhbmQgSSBkZXNpZ25lZCB0aGUgbG9ja2VkL3VubG9ja2VkIHNlY3Rpb25zCisgKglvZiB0aGUgZHJpdmVyIHdpdGggZ3JlYXQgY2FyZSwgYW5kIHdpdGggdGhlIHJlY2VudCBhZGRpdGlvbiBvZgorICoJdGhlIHNwaW5sb2NrICh0aGFua3MgdG8gdGhlIG5ldyBBUEkpLCB3ZSBzaG91bGQgYmUgcXVpdGUgY2xvc2UgdG8KKyAqCXRoZSB0cnV0aC4KKyAqCVRoZSBTTVAvSVJRIGxvY2tpbmcgaXMgcXVpdGUgY29hcnNlIGFuZCBjb25zZXJ2YXRpdmUgKGkuZS4gbm90IGZhc3QpLAorICoJYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkgKGVzcGVjaWFsbHkgYXQgMiBNYi9zIDstKS4KKyAqCisgKglJIGhhdmUgYWxzbyBsb29rZWQgaW50byBkaXNhYmxpbmcgb25seSBvdXIgaW50ZXJydXB0IG9uIHRoZSBjYXJkCisgKgkodmlhIEhBQ1IpIGluc3RlYWQgb2YgYWxsIGludGVycnVwdHMgaW4gdGhlIHByb2Nlc3NvciAodmlhIGNsaSksCisgKglzbyB0aGF0IG90aGVyIGRyaXZlciBhcmUgbm90IGltcGFjdGVkLCBhbmQgaXQgbG9vayBsaWtlIGl0J3MKKyAqCXBvc3NpYmxlLCBidXQgaXQncyB2ZXJ5IHRyaWNreSB0byBkbyByaWdodCAoZnVsbCBvZiByYWNlcykuIEFzCisgKgl0aGUgZ2FpbiB3b3VsZCBiZSBtb3N0bHkgZm9yIFNNUCBzeXN0ZW1zLCBpdCBjYW4gd2FpdC4uLgorICoKKyAqIERlYnVnZ2luZyBhbmQgb3B0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglZb3Ugd2lsbCBmaW5kIGJlbG93IGEgc2V0IG9mICcjZGVmaW5lIiBhbGxvd2luZyBhIHZlcnkgZmluZSBjb250cm9sCisgKglvbiB0aGUgZHJpdmVyIGJlaGF2aW91ciBhbmQgdGhlIGRlYnVnIG1lc3NhZ2VzIHByaW50ZWQuCisgKglUaGUgbWFpbiBvcHRpb25zIGFyZSA6CisgKglvIFdBVkVMQU5fUk9BTUlORywgZm9yIHRoZSBleHBlcmltZW50YWwgcm9hbWluZyBzdXBwb3J0LgorICoJbyBTRVRfUFNBX0NSQywgdG8gaGF2ZSB5b3VyIGNhcmQgY29ycmVjdGx5IHJlY29nbmlzZWQgYnkKKyAqCSAgYW4gYWNjZXNzIHBvaW50IGFuZCB0aGUgUG9pbnQtdG8tUG9pbnQgZGlhZ25vc3RpYyB0b29sLgorICoJbyBVU0VfUFNBX0NPTkZJRywgdG8gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIFBTQSAoRUVwcm9tKQorICoJICAob3RoZXJ3aXNlIHdlIGFsd2F5cyBzdGFydCBhZnJlc2ggd2l0aCBzb21lIGRlZmF1bHRzKQorICoKKyAqIHdhdmVsYW5fY3MubyBpcyBkYXJuIHRvbyBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoYXQncyB0cnVlICEgVGhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSB3YXkgdG8gcmVkdWNlIHRoZSBkcml2ZXIKKyAqCW9iamVjdCBieSAzMyUgKHllcyAhKS4gQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIDoKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBvZiB0aGUgd2F2ZWxhbiBjaGVjaCB0aGF0IHRoZSBmaXJzdCAzCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiBUaGlzIHR5cGUgb2YKKyAqCWRldGVjdGlvbiB3b3JrIHdlbGwgZm9yIEFUJlQgY2FyZHMgKGJlY2F1c2UgdGhlIEFUJlQgY29kZSBpcworICoJaGFyZGNvZGVkIGluIHdhdmVsYW5fY3MuaCksIGJ1dCBvZiBjb3Vyc2Ugd2lsbCBmYWlsIGZvciBvdGhlcgorICoJbWFudWZhY3R1cmVyLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIHdhdmVsYW4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0IDoKKyAqCTEpIEdldCB5b3VyIE1BQyBhZGRyZXNzCisgKgkJYSkgV2l0aCB5b3VyIGNhcmQgdXRpbGl0aWVzICh3ZnJlcXNlbCwgaW5zdGNvbmYsIC4uLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXIgOgorICoJCQlvIGNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIERFQlVHX0NPTkZJR19JTkZPIGVuYWJsZWQKKyAqCQkJbyBCb290IGFuZCBsb29rIHRoZSBjYXJkIG1lc3NhZ2VzCisgKgkyKSBTZXQgeW91ciBNQUMgY29kZSAoMyBvY3RldHMpIGluIE1BQ19BRERSRVNTRVNbXVszXSAod2F2ZWxhbl9jcy5oKQorICoJMykgQ29tcGlsZSAmIHZlcmlmeQorICoJNCkgU2VuZCBtZSB0aGUgTUFDIGNvZGUgLSBJIHdpbGwgaW5jbHVkZSBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uLi4uCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIHRoZSBmaXJzdCBvbmUgdG8gc3VwcG9ydCAid2lyZWxlc3MgZXh0ZW5zaW9ucyIuCisgKiBUaGlzIHNldCBvZiBleHRlbnNpb25zIHByb3ZpZGUgeW91IHNvbWUgd2F5IHRvIGNvbnRyb2wgdGhlIHdpcmVsZXNzCisgKiBjYXJhY3RlcmlzdGljcyBvZiB0aGUgaGFyZHdhcmUgaW4gYSBzdGFuZGFyZCB3YXkgYW5kIHN1cHBvcnQgZm9yCisgKiBhcHBsaWNhdGlvbnMgZm9yIHRha2luZyBhZHZhbnRhZ2Ugb2YgaXQgKGxpa2UgTW9iaWxlIElQKS4KKyAqCisgKiBZb3Ugd2lsbCBuZWVkIHRvIGVuYWJsZSB0aGUgQ09ORklHX05FVF9SQURJTyBkZWZpbmUgaW4gdGhlIGtlcm5lbAorICogY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKHRoaXMgaXMgdGhlIG9uZQorICogZ2l2aW5nIGFjY2VzcyB0byB0aGUgcmFkaW8gbmV0d29yayBkZXZpY2UgY2hvaWNlKS4KKyAqCisgKiBJdCBtaWdodCBhbHNvIGJlIGEgZ29vZCBpZGVhIGFzIHdlbGwgdG8gZmV0Y2ggdGhlIHdpcmVsZXNzIHRvb2xzIHRvCisgKiBjb25maWd1cmUgdGhlIGRldmljZSBhbmQgcGxheSBhIGJpdC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiB3YXZlbGFuX2NzLmMgOglUaGUgYWN0dWFsIGNvZGUgZm9yIHRoZSBkcml2ZXIgLSBDIGZ1bmN0aW9ucworICoKKyAqIHdhdmVsYW5fY3MucC5oIDoJUHJpdmF0ZSBoZWFkZXIgOiBsb2NhbCB0eXBlcyAvIHZhcnMgZm9yIHRoZSBkcml2ZXIKKyAqCisgKiB3YXZlbGFuX2NzLmggOglEZXNjcmlwdGlvbiBvZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlICYgc3RydWN0cworICoKKyAqIGk4MjU5My5oIDoJCURlc2NyaXB0aW9uIGlmIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhJU1RPUlkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVsYW4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyBoaXN0b3J5IG9mCisgKiB0aGUgV2F2ZWxhbiBpdHNlbGYgKE5DUiAtPiBBVCZUIC0+IEx1Y2VudCkuCisgKgorICogQWxsIHN0YXJ0ZWQgd2l0aCBBbmRlcnMgS2xlbWV0cyA8a2xlbWV0c0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqIHdyaXR0aW5nIGEgV2F2ZWxhbiBJU0EgZHJpdmVyIGZvciB0aGUgTUFDSCBtaWNyb2tlcm5lbC4gR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmeSB0aGlzIGZvciB0aGUgUGNtY2lhIGhhcmR3YXJlLgorICogCisgKiBSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiBwb3J0IHRoZXNlIHR3byBkcml2ZXJzIHRvIEJTREkKKyAqIGFuZCBhZGQgc3BlY2lmaWMgUGNtY2lhIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNELi4uKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnQgYm90aCBCU0RJIGRyaXZlcnMgdG8gRnJlZUJTRC4KKyAqCisgKiBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiBwb3J0IHRoZSBCU0RJIElTQSBkcml2ZXIgdG8gTGludXguCisgKgorICogQW50aG9ueSBELiBKb3NlcGggPGFkakBsY3MubWl0LmVkdT4gc3RhcnRlZCBtb2RpZnkgQnJ1Y2UgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCBpcyB3b3JrLgorICogSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+IHBhdGNoZWQgdGhlIGRyaXZlciB0byBzdGFydAorICogY29ycmVjdGx5IDIuMDAgY2FyZHMgKDIuNCBHSHogd2l0aCBmcmVxdWVuY3kgc2VsZWN0aW9uKS4KKyAqIERhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4gaW50ZWdyYXRlZCB0aGUgd2hvbGUgaW4gaGlzCisgKiBQY21jaWEgcGFja2FnZSAoKyBidWcgY29ycmVjdGlvbnMpLgorICoKKyAqIEkgKEplYW4gVG91cnJpbGhlcyAtIGp0QGhwbGIuaHBsLmhwLmNvbSkgdGhlbiBzdGFydGVkIHRvIG1ha2Ugc29tZQorICogcGF0Y2hzIHRvIHRoZSBQY21jaWEgZHJpdmVyLiBBZnRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiBOb3csIEknbSBkb2luZyB0aGUgc2FtZSB0byB0aGUgUGNtY2lhIGRyaXZlciArIHNvbWUKKyAqIHJlb3JnYW5pc2F0aW9uLgorICogTG9la2UgQnJlZGVydmVsZCA8bGJyZWRlcnZAd2F2ZWxhbi5jb20+IGZyb20gTHVjZW50IGhhcyBnaXZlbiBtZQorICogbXVjaCBuZWVkZWQgaW5mb3JtYXRpb25zIG9uIHRoZSBXYXZlbGFuIGhhcmR3YXJlLgorICovCisKKy8qIEJ5IHRoZSB3YXkgOiBmb3IgdGhlIGNvcHlyaWdodCAmIGxlZ2FsIHN0dWZmIDoKKyAqIEFsbW9zdCBldmVyeWJvZHkgd3JvdGUgY29kZSB1bmRlciBHTlUgb3IgQlNEIGxpY2Vuc2UgKG9yIGFsaWtlKSwKKyAqIGFuZCB3YW50IHRoYXQgdGhlaXIgb3JpZ2luYWwgY29weXJpZ2h0IHJlbWFpbiBzb21ld2hlcmUgaW4gdGhlCisgKiBjb2RlIChmb3IgbXlzZWxmLCBJIGdvIHdpdGggdGhlIEdQTCkuCisgKiBOb2JvZHkgd2FudCB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLi4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENSRURJVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ3JlZGl0czoKKyAqICAgIFNwZWNpYWwgdGhhbmtzIHRvIEphbiBIb29nZW5kb29ybiBvZiBBVCZUIEdJUyBVdHJlY2h0IGFuZAorICoJTG9la2UgQnJlZGVydmVsZCBvZiBMdWNlbnQgZm9yIHByb3ZpZGluZyBleHRyZW1lbHkgdXNlZnVsCisgKglpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIHVwb24gc2V2ZXJhbCBvdGhlciBkcml2ZXJzLCBpbiBwYXJ0aWN1bGFyOgorICoJRGF2aWQgSGluZHMnIExpbnV4IGRyaXZlciBmb3IgdGhlIFBDTUNJQSAzYzU4OSBldGhlcm5ldCBhZGFwdGVyCisgKglCcnVjZSBKYW5zb24ncyBMaW51eCBkcml2ZXIgZm9yIHRoZSBBVC1idXMgV2F2ZUxBTiBhZGFwdGVyCisgKglBbmRlcnMgS2xlbWV0cycgUENNQ0lBIFdhdmVMQU4gYWRhcHRlciBkcml2ZXIKKyAqCVJvYmVydCBNb3JyaXMnIEJTREkgZHJpdmVyIGZvciB0aGUgUENNQ0lBIFdhdmVMQU4gYWRhcHRlcgorICoKKyAqIEFkZGl0aW9uYWwgQ3JlZGl0czoKKyAqCisgKiAgICBUaGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCB1bmRlciBMaW51eCAxLjIuMworICoJKFNsYWNrd2FyZSAyLjAgZGlzdHJpYnV0aW9uKS4KKyAqICAgIEFuZCB0aGVuIHVuZGVyIExpbnV4IDIuMC54IChEZWJpYW4gMS4xIC0+IDIuMiAtIHBjbWNpYSAyLjguMTgrKQorICoJd2l0aCBhbiBIUCBPbW5pQm9vayA0MDAwIGFuZCB0aGVuIGEgNTUwMC4KKyAqCisgKiAgICBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24gZWl0aGVyIHdyaXR0ZW4KKyAqICAgIG9yIHN1cHBsaWVkIGJ5OgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKSwKKyAqCUppbSBCaW5rbGV5IDxqcmJAY3MucGR4LmVkdT4sCisgKglMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy5zdS5vei5hdSksCisgKglCcmVudCBFbHBoaWNrIDxiZWxwaGlja0B1d2F0ZXJsb28uY2E+LAorICoJSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+LAorICoJTWF0dGhldyBHZWllciAobWF0dGhld0Bjcy5zdS5vei5hdSksCisgKglSZW1vIGRpIEdpb3Zhbm5pIChyZW1vQGNzLnN1Lm96LmF1KSwKKyAqCU1hcmsgSGFnYW4gKG1oYWdhbkB3dGNwb3N0LmRheXRvbm9oLk5DUi5DT00pLAorICoJRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwKKyAqCUphbiBIb29nZW5kb29ybiAoYy9vIG1hcnRlaWpuQGx1Y2VudC5jb20pLAorICogICAgICBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+LAorICoJQW5kZXJzIEtsZW1ldHMgKGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdSksCisgKglZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiwKKyAqCU1hcmMgTWVlcnRlbnMgKG1tZWVydGVuc0BsdWNlbnQuY29tKSwKKyAqCUtlaXRoIE1vb3JlLAorICoJUm9iZXJ0IE1vcnJpcyAocnRtQGRhcy5oYXJ2YXJkLmVkdSksCisgKglJYW4gUGFya2luIChpYW5AY3Muc3Uub3ouYXUpLAorICoJSm9obiBSb3NlbmJlcmcgKGpvaG5yQGNzLnN1Lm96LmF1KSwKKyAqCUdlb3JnZSBSb3NzaSAoZ2VvcmdlQHBobS5nb3YuYXUpLAorICoJQXJ0aHVyIFNjb3R0IChhcnRodXJAY3Muc3Uub3ouYXUpLAorICoJU3RhbmlzbGF2IFNpbnlhZ2luIDxzdGFzQGlzZi5ydT4KKyAqCVBldGVyIFN0b3JleSwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyAod2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1KQorICoJQ2xhcmsgV29vZHdvcnRoIDxjbGFya0BoaXdheTEuZXhpdDEwOS5jb20+CisgKglZb25nZ3VhbmcgWmhhbmcgPHlnekBpc2wuaHJsLmhhYy5jb20+Li4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50IDoKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gMi44LjIyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gaW1wcm92ZWQgd3Zfc2V0X211bHRpY2FzdF9saXN0CisgKgktIGNhdGNoIHNwdXJpb3VzIGludGVycnVwdAorICoJLSBjb3JyZWN0IHJlbGVhc2Ugb2YgdGhlIGRldmljZQorICoKKyAqIENoYW5nZXMgbWFkZXMgaW4gcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIENyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuX2NzLmgpCisgKgktIFJlb3JnYW5pc2VkIGRlYnVnIG1lc3NhZ2VzCisgKgktIE1vcmUgY29tbWVudHMsIGhpc3RvcnksIC4uLgorICoJLSBDb25maWd1cmUgZWFybGllciAoaW4gImluc2VydCIgaW5zdGVhZCBvZiAib3BlbiIpCisgKiAgICAgICAgYW5kIGRvIHRoaW5ncyBvbmx5IG9uY2UKKyAqCS0gbW1jX2luaXQgOiBjb25maWd1cmUgdGhlIFBTQSBpZiBub3QgZG9uZQorICoJLSBtbWNfaW5pdCA6IDIuMDAgZGV0ZWN0aW9uIGJldHRlciBjb2RlIGZvciAyLjAwIGluaXQKKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBDb3JyZWN0IGEgSFVHRSBidWcgKHZvbGF0aWxlICYgdW5jYWxpYnJhdGVkIGJ1c3kgbG9vcCkKKyAqCSAgaW4gd3ZfODI1OTNfY21kID0+IGNvbmZpZyBzcGVlZHVwCisgKgktIFN0b3AgcmVjZWl2aW5nICYgcG93ZXIgZG93biBvbiBjbG9zZSAoYW5kIHBvd2VyIHVwIG9uIG9wZW4pCisgKgkgIHVzZSAiaWZjb25maWcgZG93biIgJiAiaWZjb25maWcgdXAgOyByb3V0ZSBhZGQgLW5ldCAuLi4iCisgKgktIFNlbmQgcGFja2V0cyA6IGFkZCB3YXRjaGRvZyBpbnN0ZWFkIG9mIHBvb2xpbmcKKyAqCS0gUmVjZWl2ZSA6IGNoZWNrIGZyYW1lIHdyYXAgYXJvdW5kICYgdHJ5IHRvIHJlY292ZXIgc29tZSBmcmFtZXMKKyAqCS0gd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QgOiBhdm9pZCByZXNldAorICoJLSBhZGQgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaW9jdGwgJiBnZXRfd2lyZWxlc3Nfc3RhdHMpCisgKgkgIGdldC9zZXQgbndpZC9mcmVxdWVuY3kgb24gZmx5LCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCS0gU3VwcHJlc3MgdXNlbGVzcyBzdHVmZiBmcm9tIGxwIChuZXRfbG9jYWwpLCBidXQgYWRkIGxpbmsKKyAqCS0gTW9yZSBpbmxpbmVzCisgKgktIExvdCBvZiBvdGhlcnMgbWlub3IgZGV0YWlscyAmIGNsZWFudXBzCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNlY29uZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBPcHRpbWlzZSB3dl84NTg5M19yZWNvbmZpZyBzdHVmZiwgZml4IHBvdGVudGlhbCBwcm9ibGVtcworICoJLSBDaGFuZ2UgZXJyb3IgdmFsdWVzIGZvciBpb2N0bAorICoJLSBOb24gYmxvY2tpbmcgd3ZfcnVfc3RvcCgpICsgY2FsbCB3dl9yZXNldCgpIGluIGNhc2Ugb2YgcHJvYmxlbXMKKyAqCS0gUmVtb3ZlIGRldmVsb3BtZW50IHByaW50ayBmcm9tIHdhdmVsYW5fd2F0Y2hkb2coKQorICoJLSBSZW1vdmUgb2YgdGhlIHdhdGNoZG9nIHRvIHdhdmVsYW5fY2xvc2UgaW5zdGVhZCBvZiB3YXZlbGFuX3JlbGVhc2UKKyAqCSAgZml4IHBvdGVudGlhbCBwcm9ibGVtcy4uLgorICoJLSBTdGFydCBkZWJ1Z2dpbmcgc3VzcGVuZCBzdHVmZiAoYnV0IGl0J3Mgc3RpbGwgYSBiaXQgd2VpcmQpCisgKgktIERlYnVnICYgb3B0aW1pemUgZHVtcCBoZWFkZXIvcGFja2V0IGluIFJ4ICYgVHggKGRlYnVnKQorICoJLSBVc2UgInJlYWRiIiBhbmQgIndyaXRlYiIgdG8gYmUga2VybmVsIDIuMSBjb21wbGlhbnQKKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIGJvZ3VzIGludGVycnVwdHMKKyAqCS0gV2lyZWxlc3MgZXh0ZW5zaW9uIDogU0VUU1BZIGFuZCBHRVRTUFkKKyAqCS0gUmVtb3ZlIG9sZCBzdHVmZiAoc3RhdHMgLSBmb3IgdGhvc2UgbmVlZGluZyBpdCwganVzdCBhc2sgbWUuLi4pCisgKgktIE1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGNsZWFudXBzICYgdHlwb3MKKyAqCS0gbW9kaWYgd2lyZWxlc3MgZXh0IChzcHkgLT4gb25seSBvbmUgcG9pbnRlcikKKyAqCS0gbmV3IHByaXZhdGUgaW9jdGwgdG8gc2V0L2dldCBxdWFsaXR5ICYgbGV2ZWwgdGhyZXNob2xkCisgKgktIEluaXQgOiBjb3JyZWN0IGRlZmF1bHQgdmFsdWUgb2YgbGV2ZWwgdGhyZXNob2xkIGZvciBwY21jaWEKKyAqCS0ga2lsbCB3YXRjaGRvZyBpbiBod19yZXNldAorICoJLSBtb3JlIDIuMSBzdXBwb3J0IChjb3B5X3RvL2Zyb21fdXNlciBpbnN0ZWFkIG9mIG1lbWNweV90by9mcm9tZnMpCisgKgktIEFkZCBtZXNzYWdlIGxldmVsIChkZWJ1ZyBzdHVmZiBpbiAvdmFyL2FkbS9kZWJ1ZyAmIGVycm9ycyBub3QKKyAqCSAgZGlzcGxheWVkIGF0IGNvbnNvbGUgYW5kIHN0aWxsIGluIC92YXIvYWRtL21lc3NhZ2VzKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmb3VydGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IHN1cHBvcnQgKHllcyAhKSB0aGFua3MgdG8gWW9uZ2d1YW5nIFpoYW5nLgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaWZ0aCByZWxlYXNlICgyLjkuMCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBSZXZpc2l0ZWQgbXVsdGljYXN0IGNvZGUgKGl0IHdhcyBtb3N0bHkgd3JvbmcpLgorICoJLSBwcm90ZWN0IGNvZGUgaW4gd3ZfODI1OTNfcmVjb25maWcgd2l0aCBkZXYtPnRidXN5IChvdXBzICEpCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNpeHRoIHJlbGVhc2UgKDIuOS4xYSkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2hhbmdlIHRoZSBkZXRlY3Rpb24gY29kZSBmb3IgbXVsdGkgbWFudWZhY3R1cmVyIGNvZGUgc3VwcG9ydAorICoJLSBDb3JyZWN0IGJ1ZyAoaGFuZyBrZXJuZWwpIGluIGluaXQgd2hlbiB3ZSB3ZXJlICJyZWplY3RpbmciIGEgY2FyZCAKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gc2V2ZW50aCByZWxlYXNlICgyLjkuMWIpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gVXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgY2hhbmdlcworICoJLSBTaWxseSBidWcgaW4gY2FyZCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKHBzYV9jb25mX3N0YXR1cykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZWlndGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTbWFsbCBidWcgaW4gZGVidWcgY29kZSAocHJvYmFibHkgbm90IHRoZSBsYXN0IG9uZS4uLikKKyAqCS0gMS4yLjEzIHN1cHBvcnQgKHRoYW5rcyB0byBDbGFyayBXb29kd29ydGgpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuOS4yYiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIExldmVsIHRocmVzaG9sZCBpcyBub3cgYSBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb24gKHZlcnNpb24gNCAhKQorICoJLSBtb2R1bGVzIHBhcmFtZXRlcnMgdHlwZXMgZm9yIGtlcm5lbCA+IDIuMS4xNworICoJLSB1cGRhdGVkIG1hbiBwYWdlCisgKgktIE90aGVycyBjbGVhbnVwIGZyb20gRGF2aWQgSGluZHMKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGJ5dGUgY291bnQgc3RhdHMgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBSZW1vdmUgZGV2X3RpbnQgc3R1ZmYgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBPdGhlcnMgY2xlYW51cCBmcm9tIERhdmlkIEhpbmRzCisgKgktIEVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCAhKQorICoJLSAnYmFzZScgdG8gJ3VfbG9uZycgZm9yIHRoZSBBbHBoYSAodGhhbmtzIHRvIFN0YW5pc2xhdiBTaW55YWdpbikKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjYgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGZpeCBidWcgOiBubyBsb25ndWVyIGRpc2FibGUgd2F0Y2hkb2cgaW4gY2FzZSBvZiBib2d1cyBpbnRlcnJ1cHQKKyAqCS0gaW5jcmVhc2UgdGltZW91dCBpbiBjb25maWcgY29kZSBmb3IgcGlja3kgaGFyZHdhcmUKKyAqCS0gbWFzayB1bnVzZWQgYml0cyBpbiBzdGF0dXMgKFdpcmVsZXNzIEV4dGVuc2lvbnMpCisgKgorICogQ2hhbmdlcyBpbnRlZ3JhdGVkIGJ5IEp1c3RpbiBTZWdlciA8anNlZ2VyQE1JVC5FRFU+ICYgRGF2aWQgSGluZHMgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUm9hbWluZyAiaGFjayIgZnJvbSBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4KKyAqCS0gUFNBIENSQyBjb2RlIGZyb20gQm9iIEdyYXkgPHJncmF5QGJhbGQuY3MuZGFydG1vdXRoLmVkdT4KKyAqCS0gQmV0dGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBpODI1OTMgY29udHJvbGxlcgorICoJICBmcm9tIEpvc2VwaCBLLiBPJ1N1bGxpdmFuIDxqb3N1bGx2bitAY3MuY211LmVkdT4KKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4wLjEwIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGVqZWN0ICJoYW5nIiBvZiB0aGUgZHJpdmVyIHVuZGVyIDIuMi5YIDoKKyAqCQlvIGNyZWF0ZSB3dl9mbHVzaF9zdGFsZV9saW5rcygpCisgKgkJbyBSZW5hbWUgd2F2ZWxhbl9yZWxlYXNlIHRvIHd2X3BjbWNpYV9yZWxlYXNlICYgbW92ZSB1cAorICoJCW8gbW92ZSB1bnJlZ2lzdGVyX25ldGRldiB0byB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyB3YXZlbGFuX3JlbGVhc2UoKSBubyBsb25nZXIgY2FsbCB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyBTdXBwcmVzcyAicmVsZWFzZSIgdGltZXIKKyAqCQlvIE90aGVyIGNsZWFudXBzICYgZml4ZXMKKyAqCS0gTmV3IE1BQyBhZGRyZXNzIGluIHRoZSBwcm9iZQorICoJLSBSZW9yZyBQU0FfQ1JDIGNvZGUgKGVuZGlhbiBuZXV0cmFsICYgY2xlYW5lcikKKyAqCS0gQ29ycmVjdCBpbml0aWFsaXNhdGlvbiBvZiB0aGUgaTgyNTkzIGZyb20gTHVjZW50IG1hbnVhbAorICoJLSBQdXQgYmFjayB0aGUgd2F0Y2hkb2csIHdpdGggbGFyZ2VyIHRpbWVvdXQKKyAqCS0gVFJBTlNNSVRfTk9fQ1JDIGlzIGEgIm5vcm1hbCIgZXJyb3IsIHNvIHJlY292ZXIgZnJvbSBpdAorICoJICBmcm9tIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QGRlbWVudGlhLm9yZz4KKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIFRYIGFuZCBSWCBub3JtYWwgZmFpbHVyZSBjb25kaXRpb25zCisgKgktICNpZmRlZiBvdXQgYWxsIHRoZSByb2FtaW5nIGNvZGUKKyAqCS0gQWRkIEVTU0lEICYgIkFQIGN1cnJlbnQgYWRkcmVzcyIgaW9jdGwgc3R1YnMKKyAqCS0gR2VuZXJhbCBjbGVhbnVwIG9mIHRoZSBjb2RlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMC4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFJlLWVuYWJsZSBjb21waWxhdGlvbiBvZiByb2FtaW5nIGNvZGUgYnkgZGVmYXVsdCwgYnV0IHdpdGgKKyAqCSAgZG9fcm9hbWluZyA9IDAKKyAqCS0gTnVrZSBgbndpZD1ud2lkXm50b2hzKGJlYWNvbi0+ZG9tYWluX2lkKScgaW4gd2xfcm9hbV9nYXRoZXIKKyAqCSAgYXQgdGhlIGRlbWFuZCBvZiBKb2huIENhcm9sIExhbmdmb3JkIDxqY2xAZ3MxNzYuc3AuY3MuY211LmVkdT4KKyAqCS0gSW50cm9kdWNlZCBXQVZFTEFOX1JPQU1JTkdfRVhUIGZvciBpbmNvbXBsZXRlIEVTU0lEIHN0dWZmLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjAuMTUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGFuZ2UgZS1tYWlsIGFuZCB3ZWIgcGFnZSBhZGRyZXNzZXMKKyAqCS0gV2F0Y2hkb2cgdGltZXIgaXMgbm93IGNvcnJlY3RseSBleHByZXNzZWQgaW4gSFosIG5vdCBpbiBqaWZmaWVzCisgKgktIEFkZCBjaGFubmVsIG51bWJlciB0byB0aGUgbGlzdCBvZiBmcmVxdWVuY2llcyBpbiByYW5nZQorICoJLSBBZGQgdGhlIChzaG9ydCkgbGlzdCBvZiBiaXQtcmF0ZXMgaW4gcmFuZ2UKKyAqCS0gRGV2ZWxvcHAgYSBuZXcgc2Vuc2l0aXZpdHkuLi4gKHNlbnMudmFsdWUgJiBzZW5zLmZpeGVkKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGNoZWNrIGZvciByb290IHBlcm1pc3Npb24gKGJyZWFrIGluc3RlYWQgb2YgZXhpdCkKKyAqCS0gTmV3IG53aWQgJiBlbmNvZGluZyBzZXR0aW5nIChXaXJlbGVzcyBFeHRlbnNpb24gOSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjEyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmV3b3JrZWQgd3ZfODI1OTNfY21kIHRvIGF2b2lkIHVzaW5nIHRoZSBJUlEgaGFuZGxlciBhbmQgZG9pbmcKKyAqCSAgdWdseSB0aGluZ3Mgd2l0aCBpbnRlcnJ1cHRzLgorICoJLSBBZGQgSVJRIHByb3RlY3Rpb24gaW4gODI1OTNfY29uZmlnL3J1X3N0YXJ0L3J1X3N0b3Avd2F0Y2hkb2cKKyAqCS0gVXBkYXRlIHRvIG5ldyBuZXR3b3JrIEFQSSAoc29mdG5ldCAtIDIuMy40MykgOgorICoJCW8gcmVwbGFjZSBkZXYtPnRidXN5IChEYXZpZCArIG1lKQorICoJCW8gcmVwbGFjZSBkZXYtPnRzdGFydCAoRGF2aWQgKyBtZSkKKyAqCQlvIHJlbW92ZSBkZXYtPmludGVycnVwdCAoRGF2aWQpCisgKgkJbyBhZGQgU01QIGxvY2tpbmcgdmlhIHNwaW5sb2NrIGluIHNwbHh4IChtZSkKKyAqCQlvIGFkZCBzcGlubG9jayBpbiBpbnRlcnJ1cHQgaGFuZGxlciAobWUpCisgKgkJbyB1c2Uga2VybmVsIHdhdGNoZG9nIGluc3RlYWQgb2Ygb3VycyAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIFJlLXN5bmMga2VybmVsL3BjbWNpYSB2ZXJzaW9ucyAobm90IG11Y2ggYWN0dWFsbHkpCisgKgktIEEgZmV3IG90aGVyIGNsZWFudXBzIChEYXZpZCAmIG1lKS4uLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMjIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGVjayB0aGF0IFNNUCB3b3JrcywgcmVtb3ZlIGFubm95aW5nIGxvZyBtZXNzYWdlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMS4yNCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCB1bmZyZXF1ZW50IGNhcmQgbG9ja3VwIHdoZW4gd2F0Y2hkb2cgd2FzIHJlc2V0aW5nIHRoZSBoYXJkd2FyZSA6CisgKgkJbyBjb250cm9sIGZpcnN0IGJ1c3kgbG9vcCBpbiB3dl84MjU5M19jbWQoKQorICoJCW8gRXh0ZW5kIHNwaW5sb2NrIHByb3RlY3Rpb24gaW4gd3ZfaHdfY29uZmlnKCkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjMzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gT3B0aW9uYWwgdXNlIG5ldyBkcml2ZXIgQVBJIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zIDoKKyAqCQlvIGdvdCByaWQgb2Ygd2F2ZWxhbl9pb2N0bCgpCisgKgkJbyB1c2UgYSBidW5jaCBvZiBpd19oYW5kbGVyIGluc3RlYWQKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4yLjEgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNldCBkZXYtPnRyYW5zX3N0YXJ0IHRvIGF2b2lkIGZpbGxpbmcgdGhlIGxvZ3MKKyAqCQkoYW5kIGdlbmVyYXRpbmcgdXNlbGVzcyBhYm9ydCBjb21tYW5kcykKKyAqCS0gQXZvaWQgZGVhZGxvY2tzIGluIG1tY19vdXQoKS9tbWNfaW4oKQorICoKKyAqIFdpc2hlcyAmIGRyZWFtczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2xlYW51cCBhbmQgaW50ZWdyYXRlIHRoZSByb2FtaW5nIGNvZGUKKyAqCSAgKHN0ZCBkZWJ1Zywgc2V0IERvbWFpbklELCBkZWNheSBhdmcgYW5kIGNvLi4uKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTGludXggaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpZmRlZiBDT05GSUdfTkVUX1JBRElPCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkJLyogTmV3IGRyaXZlciBBUEkgKi8KKyNlbmRpZgorCisvKiBQY21jaWEgaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisKKy8qIFdhdmVsYW4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAiaTgyNTkzLmgiCS8qIERlZmluaXRpb25zIGZvciB0aGUgSW50ZWwgY2hpcCAqLworCisjaW5jbHVkZSAid2F2ZWxhbl9jcy5oIgkvKiBPdGhlcnMgYml0cyBvZiB0aGUgaGFyZHdhcmUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERSSVZFUiBPUFRJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGAjZGVmaW5lJyBvciBgI3VuZGVmJyB0aGUgZm9sbG93aW5nIGNvbnN0YW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyCisgKiBvZiB0aGUgZHJpdmVyLi4uCisgKi8KKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HCQkvKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCByb2FtaW5nIGNvZGUgKi8KKyN1bmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCS8qIEVuYWJsZSByb2FtaW5nIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyN1bmRlZiBTRVRfUFNBX0NSQwkJLyogU2V0IHRoZSBDUkMgaW4gUFNBIChzbG93ZXIpICovCisjZGVmaW5lIFVTRV9QU0FfQ09ORklHCQkvKiBVc2UgaW5mbyBmcm9tIHRoZSBQU0EgKi8KKyN1bmRlZiBTVFJVQ1RfQ0hFQ0sJCS8qIFZlcmlmeSBwYWRkaW5nIG9mIHN0cnVjdHVyZXMgKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIERvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpICovCisjdW5kZWYgU0VUX01BQ19BRERSRVNTCQkvKiBFeHBlcmltZW50YWwgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworLyogV2FybmluZyA6IHRoZXNlIHN0dWZmIHdpbGwgc2xvdyBkb3duIHRoZSBkcml2ZXIuLi4gKi8KKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvKiBFbmFibGUgc3B5aW5nIGFkZHJlc3NlcyAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWcgbGV2ZWwuLi4gKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERFQlVHX01PRFVMRV9UUkFDRQkvKiBNb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKyN1bmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQkvKiBDYWxscyBtYWRlIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCS8qIENhbGxzIHRvIGhhbmRsZXIgKi8KKyN1bmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTwkvKiB0eXBlIG9mIGludGVycnVwdCAmIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19JTkZPCS8qIFdoYXQncyBnb2luZyBvbi4uLiAqLworI2RlZmluZSBERUJVR19DT05GSUdfRVJST1JTCS8qIEVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUEFDS0VUX0RVTVAJLyogRHVtcCBwYWNrZXQgb24gdGhlIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX0lPQ1RMX1RSQUNFCS8qIE1pc2MgY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIFZhcmlvdXMgZGVidWcgaW5mbyAqLworI2RlZmluZSBERUJVR19JT0NUTF9FUlJPUgkvKiBXaGF0J3MgZ29pbmcgd3JvbmcgKi8KKyNkZWZpbmUgREVCVUdfQkFTSUNfU0hPVwkvKiBTaG93IGJhc2ljIHN0YXJ0dXAgaW5mbyAqLworI3VuZGVmIERFQlVHX1ZFUlNJT05fU0hPVwkvKiBQcmludCB2ZXJzaW9uIGluZm8gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBwc2EgdG8gc2NyZWVuICovCisjdW5kZWYgREVCVUdfTU1DX1NIT1cJCS8qIER1bXAgbW1jIHRvIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX1NIT1dfVU5VU0VECS8qIFNob3cgYWxzbyB1bnVzZWQgZmllbGRzICovCisjdW5kZWYgREVCVUdfSTgyNTkzX1NIT1cJLyogU2hvdyBpODI1OTMgc3RhdHVzICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gIndhdmVsYW5fY3MuYyA6IHYyNCAoU01QICsgd2lyZWxlc3MgZXh0ZW5zaW9ucykgMTEvMS8wMlxuIjsKKyNlbmRpZgorCisvKiBXYXRjaGRvZyB0ZW1wb3Jpc2F0aW9uICovCisjZGVmaW5lCVdBVENIRE9HX0pJRkZJRVMJKDI1NipIWi8xMDApCisKKy8qIEZpeCBhIGJ1ZyBpbiBzb21lIG9sZCB3aXJlbGVzcyBleHRlbnNpb24gZGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUJMzIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DU0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMgkvKiBTZXQgcm9hbWluZyBzdGF0ZSAqLworI2RlZmluZSBTSU9DR0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMwkvKiBHZXQgcm9hbWluZyBzdGF0ZSAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA0CS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA1CS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSBhYm92ZSBpbiBvcHRpb25zICovCisKKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCSAwCS8qIDEgPSBUcmFjZSBvZiBoYW5kb3ZlciBkZWNpc2lvbnMgKi8KKwkJCQkJLyogMiA9IEluZm8gb24gZWFjaCBiZWFjb24gcmN2ZC4uLiAqLworI2RlZmluZSBNQVhfV0FWRVBPSU5UUwkJNwkvKiBNYXggdmlzaWJsZSBhdCBvbmUgdGltZSAqLworI2RlZmluZSBXQVZFUE9JTlRfSElTVE9SWQk1CS8qIFNOUiBzYW1wbGUgaGlzdG9yeSBzbG93IHNlYXJjaCAqLworI2RlZmluZSBXQVZFUE9JTlRfRkFTVF9ISVNUT1JZCTIJLyogU05SIHNhbXBsZSBoaXN0b3J5IGZhc3Qgc2VhcmNoICovCisjZGVmaW5lIFNFQVJDSF9USFJFU0hfTE9XCTEwCS8qIFNOUiB0byBlbnRlciBjZWxsIHNlYXJjaCAqLworI2RlZmluZSBTRUFSQ0hfVEhSRVNIX0hJR0gJMTMJLyogU05SIHRvIGxlYXZlIGNlbGwgc2VhcmNoICovCisjZGVmaW5lIFdBVkVMQU5fUk9BTUlOR19ERUxUQQkxCS8qIEh5c3RlcmVzaXMgdmFsdWUgKCsvLSBTTlIpICovCisjZGVmaW5lIENFTExfVElNRU9VVAkJMipIWgkvKiBpbiBqaWZmaWVzICovCisKKyNkZWZpbmUgRkFTVF9DRUxMX1NFQVJDSAkxCS8qIEJvb2xlYW4gdmFsdWVzLi4uICovCisjZGVmaW5lIE5XSURfUFJPTUlTQwkJMQkvKiBmb3IgY29kZSBjbGFyaXR5LiAqLworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfYmVhY29uCit7CisgIHVuc2lnbmVkIGNoYXIJCWRzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCXNzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCWN0cmwsCQkvKiBVbnVzZWQgKi8KKwkJCU8sVSxJLAkJLyogVW51c2VkICovCisJCQlzcGVjX2lkMSwJLyogVW51c2VkICovCisJCQlzcGVjX2lkMiwJLyogVW51c2VkICovCisJCQlwZHVfdHlwZSwJLyogVW51c2VkICovCisJCQlzZXE7CQkvKiBXYXZlUG9pbnQgYmVhY29uIHNlcXVlbmNlIG51bWJlciAqLworICB1bnNpZ25lZCBzaG9ydAlkb21haW5faWQsCS8qIFdhdmVQb2ludCBEb21haW4gSUQgKi8KKwkJCW53aWQ7CQkvKiBXYXZlUG9pbnQgTldJRCAqLworfSB3YXZlcG9pbnRfYmVhY29uOworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeQoreworICB1bnNpZ25lZCBzaG9ydAlud2lkOwkJLyogV2F2ZVBvaW50J3MgTldJRCAqLworICBpbnQJCQlhdmVyYWdlX3Nsb3c7CS8qIFNOUiBydW5uaW5nIGF2ZXJhZ2UgKi8KKyAgaW50CQkJYXZlcmFnZV9mYXN0OwkvKiBTTlIgcnVubmluZyBhdmVyYWdlICovCisgIHVuc2lnbmVkIGNoYXIJICBzaWdxdWFsW1dBVkVQT0lOVF9ISVNUT1JZXTsgLyogUmluZ2J1ZmZlciBvZiByZWNlbnQgU05SJ3MgKi8KKyAgdW5zaWduZWQgY2hhcgkJcXVhbHB0cjsJLyogSW5kZXggaW50byByaW5nYnVmZmVyICovCisgIHVuc2lnbmVkIGNoYXIJCWxhc3Rfc2VxOwkvKiBMYXN0IHNlcS4gbm8gc2VlbiBmb3IgV2F2ZVBvaW50ICovCisgIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeSAqbmV4dDsJLyogTmV4dCBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgc3RydWN0IHdhdmVwb2ludF9oaXN0b3J5ICpwcmV2OwkvKiBQcmV2aW91cyBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgdW5zaWduZWQgbG9uZwkJbGFzdF9zZWVuOwkvKiBUaW1lIG9mIGxhc3QgYmVhY29uIHJlY3ZkLCBqaWZmaWVzICovCit9IHdhdmVwb2ludF9oaXN0b3J5OworCitzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCit7CisgIHdhdmVwb2ludF9oaXN0b3J5CSpoZWFkOwkJLyogU3RhcnQgb2YgcmluZ2J1ZmZlciAqLworICBpbnQJCQludW1fd2F2ZXBvaW50czsJLyogTm8uIG9mIFdhdmVQb2ludHMgdmlzaWJsZSAqLworICB1bnNpZ25lZCBjaGFyCQlsb2NrZWQ7CQkvKiBUYWJsZSBsb2NrICovCit9OworCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcCBkYXRhIGluIHR3byBzdHJ1Y3R1cmUuICJkZXZpY2UiCisgKiBrZWVwIHRoZSBnZW5lcmljIGRhdGEgKHNhbWUgZm9ybWF0IGZvciBldmVyeWJvZHkpIGFuZCAibmV0X2xvY2FsIiBrZWVwCisgKiB0aGUgYWRkaXRpb25hbCBzcGVjaWZpYyBkYXRhLgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhpcyBzcGVjaWZpYyBkYXRhIGlzIGluIGZhY3QgZ2VuZXJpYyAoZW5fc3RhdHMsIGZvcgorICogZXhhbXBsZSkuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwKK3sKKyAgZGV2X25vZGVfdCAJbm9kZTsJCS8qID8/Pz8gV2hhdCBpcyB0aGlzIHN0dWZmID8/Pz8gKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBSZXZlcnNlIGxpbmsuLi4gKi8KKyAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgKFNNUCkgKi8KKyAgZGV2X2xpbmtfdCAqCWxpbms7CQkvKiBwY21jaWEgc3RydWN0dXJlICovCisgIGVuX3N0YXRzCXN0YXRzOwkJLyogRXRoZXJuZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKyAgaW50CQlucmVzZXRzOwkvKiBOdW1iZXIgb2YgaHcgcmVzZXRzICovCisgIHVfY2hhcgljb25maWd1cmVkOwkvKiBJZiBpdCBpcyBjb25maWd1cmVkICovCisgIHVfY2hhcglyZWNvbmZpZ184MjU5MzsJLyogTmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciAqLworICB1X2NoYXIJcHJvbWlzY3VvdXM7CS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyAgdV9jaGFyCWFsbG11bHRpY2FzdDsJLyogQWxsIE11bHRpY2FzdCBtb2RlICovCisgIGludAkJbWNfY291bnQ7CS8qIE51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisKKyAgaW50ICAgCXN0b3A7CQkvKiBDdXJyZW50IGk4MjU5MyBTdG9wIEhpdCBSZWdpc3RlciAqLworICBpbnQgICAJcmZwOwkJLyogTGFzdCBETUEgbWFjaGluZSByZWNlaXZlIHBvaW50ZXIgKi8KKyAgaW50CQlvdmVycnVubmluZzsJLyogUmVjZWl2ZXIgb3ZlcnJ1biBmbGFnICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mgc3BlY2lmaWMgc3RhdHMgKi8KKworICBzdHJ1Y3QgaXdfc3B5X2RhdGEJc3B5X2RhdGE7CisgIHN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmCisKKyNpZmRlZiBISVNUT0dSQU0KKyAgaW50CQloaXNfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGludGVydmFscyAqLworICB1X2NoYXIJaGlzX3JhbmdlWzE2XTsJCS8qIEJvdW5kYXJpZXMgb2YgaW50ZXJ2YWwgXW4tMTsgbl0gKi8KKyAgdV9sb25nCWhpc19zdW1bMTZdOwkJLyogU3VtIGluIGludGVydmFsICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIHVfbG9uZwlkb21haW5faWQ7CS8qIERvbWFpbiBJRCB3ZSBsb2NrIG9uIGZvciByb2FtaW5nICovCisgIGludAkJZmlsdGVyX2RvbWFpbnM7CS8qIENoZWNrIERvbWFpbiBJRCBvZiBiZWFjb24gZm91bmQgKi8KKyBzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCXdhdmVwb2ludF90YWJsZTsJLyogVGFibGUgb2YgdmlzaWJsZSBXYXZlUG9pbnRzKi8KKyAgd2F2ZXBvaW50X2hpc3RvcnkgKgljdXJyX3BvaW50OwkJLyogQ3VycmVudCB3YXZlcG9pbnQgKi8KKyAgaW50CQkJY2VsbF9zZWFyY2g7CQkvKiBTZWFyY2hpbmcgZm9yIG5ldyBjZWxsPyAqLworICBzdHJ1Y3QgdGltZXJfbGlzdAljZWxsX3RpbWVyOwkJLyogR2FyYmFnZSBjb2xsZWN0aW9uICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisgIHZvaWQgX19pb21lbSAqbWVtOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJPQU1JTkcgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit3YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfZGVsX3dhdmVwb2ludCh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9iZXN0X3NpZ3F1YWwoaW50IGZhc3Rfc2VhcmNoLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSk7Cit2b2lkIHd2X3JvYW1faGFuZG92ZXIod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X253aWRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgbW9kZSwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X3JvYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZSA6IGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlIDogYmFzZSBhZGRyZXNzICovCisJCSAgIHVfY2hhciksCS8qIGRhdGEgKi8KKwloYWNyX3dyaXRlX3Nsb3codV9sb25nLAorCQkgICB1X2NoYXIpOworc3RhdGljIHZvaWQKKwlwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBSZWFkIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgdG8gdGhlIFBTQSAqLworCQkgIGludCwJCS8qIE9mZnNldCBpbiBwc2EgKi8KKwkJICB1X2NoYXIgKiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgIGludCk7CQkvKiBMZW5ndGggb2YgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfb3V0KHVfbG9uZywJCS8qIFdyaXRlIDEgYnl0ZSB0byB0aGUgTW9kZW0gTWFuYWcgQ29udHJvbCAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQyAqLworCQkgIHVfY2hhciwKKwkJICB1X2NoYXIgKiwKKwkJICBpbnQpOworc3RhdGljIGlubGluZSB1X2NoYXIJCS8qIFJlYWQgMSBieXRlIGZyb20gdGhlIE1NQyAqLworCW1tY19pbih1X2xvbmcsCisJICAgICAgIHVfc2hvcnQpOworc3RhdGljIGlubGluZSB2b2lkCisJbW1jX3JlYWQodV9sb25nLAkvKiBSZWFkIG4gYnl0ZXMgZnJvbSB0aGUgTU1DICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVwcm9tIDogYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworc3RhdGljIHZvaWQKKwlmZWVfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSBFRXByb20gOiBiYXNlIGFkZHJlc3MgKi8KKwkJIHVfc2hvcnQsCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgdV9zaG9ydCAqLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgaW50KTsJCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTgyNTkzIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIHN5bmNocm9ub3VzbHkgc2VuZCBhIGNvbW1hbmQgdG8gaTgyNTkzICovIAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQsCisJCSAgICAgaW50KTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogRGlhZ25vc3RpcXVlIHRoZSBpODI1OTMgKi8KK3N0YXRpYyBpbnQKKwlyZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogUmVhZCBhIHJlY2VpdmUgYnVmZmVyICovCisJCSAgICAgaW50LAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQpOworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1OTNfcmVjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIGRpc3BsYXkgc3RhcnR1cCBpbmZvICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBlbl9zdGF0cwkqCisJd2F2ZWxhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIEdpdmUgc3RhdHMgL3Byb2MvbmV0L2RldiAqLworc3RhdGljIGl3X3N0YXRzICoKKwl3YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3RhcnRfb2ZfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogU2VlayBiZWdnaW5pbmcgb2YgY3VycmVudCBmcmFtZSAqLworCQkJICBpbnQsCS8qIGVuZCBvZiBmcmFtZSAqLworCQkJICBpbnQpOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lICovCisJCSAgICAgICBpbnQsCisJCSAgICAgICBpbnQpLAorCXd2X3BhY2tldF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlYWQgYWxsIHBhY2tldHMgd2FpdGluZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgYSBwYWNrZXQgdG8gdGhlIFR4IGJ1ZmZlciAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldCAqLworCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEFSRFdBUkUgQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogSW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KK3N0YXRpYyBpbnQKKwl3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdG9wIHRoZSBpODI1OTMgcmVjZWl2ZXIgdW5pdCAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTkzIHJlY2VpdmVyIHVuaXQgKi8KK3N0YXRpYyBpbnQKKwl3dl84MjU5M19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTkzICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BjbWNpYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQKKwl3dl9od19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlc2V0ICYgY29uZmlndXJlIHRoZSB3aG9sZSBoYXJkd2FyZSAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFNhbWUsICsgc3RhcnQgcmVjZWl2ZXIgdW5pdCAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKik7CS8qIENvbmZpZ3VyZSB0aGUgcGNtY2lhIGludGVyZmFjZSAqLworc3RhdGljIHZvaWQKKwl3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICopOy8qIFJlbW92ZSBhIGRldmljZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlRFUlJVUFQgSEFORExJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90CisJd2F2ZWxhbl9pbnRlcnJ1cHQoaW50LAkvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJICB2b2lkICosCisJCQkgIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBUcmFuc21pc3Npb24gd2F0Y2hkb2cgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludAorCXdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKSwJCS8qIE9wZW4gdGhlIGRldmljZSAqLworCXdhdmVsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENsb3NlIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBkZXZfbGlua190ICoKKwl3YXZlbGFuX2F0dGFjaCh2b2lkKTsJCS8qIENyZWF0ZSBhIG5ldyBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkCisJd2F2ZWxhbl9kZXRhY2goZGV2X2xpbmtfdCAqKTsJLyogRGVzdHJveSBhIHJlbW92ZWQgZGV2aWNlICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9ldmVudChldmVudF90LAkJLyogTWFuYWdlIHBjbWNpYSBldmVudHMgKi8KKwkJICAgICAgaW50LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJ3YXZlbGFuX2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CS8qIExpbmtlZCBsaXN0IG9mIGRldmljZXMgKi8KKworLyoKKyAqIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcKKyAqIFRoZSBleGFjdCBzeW50YXggaXMgJ2luc21vZCB3YXZlbGFuX2NzLm8gPHZhcj49PHZhbHVlPicKKyAqLworCisvKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucyAqLworc3RhdGljIGludAltZW1fc3BlZWQgPSAwOworCisvKiBOZXcgbW9kdWxlIGludGVyZmFjZSAqLworbW9kdWxlX3BhcmFtKG1lbV9zcGVlZCwgaW50LCAwKTsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORwkJLyogQ29uZGl0aW9uYWwgY29tcGlsZSwgc2VlIGFib3ZlIGluIG9wdGlvbnMgKi8KKy8qIEVuYWJsZSByb2FtaW5nIG1vZGUgPyBObyAhIFBsZWFzZSBrZWVwIHRoaXMgdG8gMCAqLworc3RhdGljIGludAlkb19yb2FtaW5nID0gMDsKK21vZHVsZV9wYXJhbShkb19yb2FtaW5nLCBib29sLCAwKTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZW5kaWYJLyogV0FWRUxBTl9DU19QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM2ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKQEAgLTAsMCArMSw2MTQgQEAKKyNpZm5kZWYgX19XTDM1MDFfSF9fCisjZGVmaW5lIF9fV0wzNTAxX0hfXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisKKy8qIGRlZmluZSBmb3IgV0xBIDIuMCAqLworI2RlZmluZSBXTDM1MDFfQkxLU1ogMjU2CisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgRFJJVkVSIGJsb2NrCisgKiBiaXRbNy01XSBpcyBibG9jayBJRDogMDAwCisgKiBiaXRbNC0wXSBpcyBzaWduYWwgSUQKKyovCitlbnVtIHdsMzUwMV9zaWduYWxzIHsKKwlXTDM1MDFfU0lHX0FMQVJNLAorCVdMMzUwMV9TSUdfTURfQ09ORklSTSwKKwlXTDM1MDFfU0lHX01EX0lORCwKKwlXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BU1NPQ19JTkQsCisJV0wzNTAxX1NJR19BVVRIX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RFQVVUSF9DT05GSVJNLAorCVdMMzUwMV9TSUdfREVBVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RJU0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQsCisJV0wzNTAxX1NJR19HRVRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0pPSU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1BXUl9NR01UX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0lORCwKKwlXTDM1MDFfU0lHX1NDQU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1NFVF9DT05GSVJNLAorCVdMMzUwMV9TSUdfU1RBUlRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNLAorCVdMMzUwMV9TSUdfU0lURV9DT05GSVJNLAorCVdMMzUwMV9TSUdfU0FWRV9DT05GSVJNLAorCVdMMzUwMV9TSUdfUkZURVNUX0NPTkZJUk0sCisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgTUxNRSBibG9jaworICogYml0WzctNV0gaXMgYmxvY2sgSUQ6IDAxMAorICogYml0WzQtMF0gaXMgc2lnbmFsIElECisgKi8KKwlXTDM1MDFfU0lHX0FTU09DX1JFUSA9IDB4MjAsCisJV0wzNTAxX1NJR19BVVRIX1JFUSwKKwlXTDM1MDFfU0lHX0RFQVVUSF9SRVEsCisJV0wzNTAxX1NJR19ESVNBU1NPQ19SRVEsCisJV0wzNTAxX1NJR19HRVRfUkVRLAorCVdMMzUwMV9TSUdfSk9JTl9SRVEsCisJV0wzNTAxX1NJR19QV1JfTUdNVF9SRVEsCisJV0wzNTAxX1NJR19SRUFTU09DX1JFUSwKKwlXTDM1MDFfU0lHX1NDQU5fUkVRLAorCVdMMzUwMV9TSUdfU0VUX1JFUSwKKwlXTDM1MDFfU0lHX1NUQVJUX1JFUSwKKwlXTDM1MDFfU0lHX01EX1JFUSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJV0wzNTAxX1NJR19TSVRFX1JFUSwKKwlXTDM1MDFfU0lHX1NBVkVfUkVRLAorCVdMMzUwMV9TSUdfUkZfVEVTVF9SRVEsCisJV0wzNTAxX1NJR19NTV9DT05GSVJNID0gMHg2MCwKKwlXTDM1MDFfU0lHX01NX0lORCwKK307CisKK2VudW0gd2wzNTAxX21pYl9hdHRyaWJzIHsKKwlXTDM1MDFfTUlCX0FUVFJfU1RBVElPTl9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfQVVUSF9BTEdPUklUSE1TLAorCVdMMzUwMV9NSUJfQVRUUl9BVVRIX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX01FRElVTV9PQ0NVUEFOQ1lfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0NGX1BPTExBQkxFLAorCVdMMzUwMV9NSUJfQVRUUl9DRlBfUEVSSU9ELAorCVdMMzUwMV9NSUJfQVRUUl9DRlBNQVhfRFVSQVRJT04sCisJV0wzNTAxX01JQl9BVFRSX0FVVEhfUkVTUF9UTU9VVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfRFRJTVMsCisJV0wzNTAxX01JQl9BVFRSX1BSSVZfT1BUX0lNUExFTUVOVEVELAorCVdMMzUwMV9NSUJfQVRUUl9QUklWX0lOVk9LRUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWVMsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWV9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HUywKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HU19MRU4sCisJV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9JQ1ZfRVJST1JfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9VTkRFQ1JZUFRBQkxFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01BQ19BRERSLAorCVdMMzUwMV9NSUJfQVRUUl9HUk9VUF9BRERSUywKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX1RIUkVTSE9MRCwKKwlXTDM1MDFfTUlCX0FUVFJfU0hPUlRfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0xPTkdfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0ZSQUdfVEhSRVNIT0xELAorCVdMMzUwMV9NSUJfQVRUUl9NQVhfVFhfTVNEVV9MSUZFVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfTUFYX1JYX0xJRkVUSU1FLAorCVdMMzUwMV9NSUJfQVRUUl9NQU5VRkFDVFVSRVJfSUQsCisJV0wzNTAxX01JQl9BVFRSX1BST0RVQ1RfSUQsCisJV0wzNTAxX01JQl9BVFRSX1RYX0ZSQUdfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJQ0FTVF9UWF9GUkFNRV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SWF9GUkFHX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9NVUxUSUNBU1RfUlhfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0ZDU19FUlJPUl9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUkVUUllfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJUExFX1JFVFJZX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SVFNfU1VDQ0VTU19DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0FDS19GQUlMVVJFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9GUkFNRV9EVVBMSUNBVEVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1BIWV9UWVBFLAorCVdMMzUwMV9NSUJfQVRUUl9SRUdfRE9NQUlOU19TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1JFR19ET01BSU4sCisJV0wzNTAxX01JQl9BVFRSX1NMT1RfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JYX1RYX1RVUk5BUk9VTkRfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUExDUF9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfVFhfU1dJVENIX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1RYX1JBTVBfT05fVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1NJRlNfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1JYX1BMQ1BfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX01BQ19QUk9DRVNTSU5HX0RFTEFZLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9SQU1QX09GRl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9QUkVBTUJMRV9MRU4sCisJV0wzNTAxX01JQl9BVFRSX1BMQ1BfSEVBREVSX0xFTiwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9EVVJBVElPTl9GQUNUT1IsCisJV0wzNTAxX01JQl9BVFRSX0FJUl9QUk9QQUdBVElPTl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9URU1QX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX0NXX01JTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ1dfTUFYLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX0RBVEFfUkFURVNfVFgsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfREFUQV9SQVRFU19SWCwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9NQVhfTEVOLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX1RYX0FOVEVOTkFTLAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1RYX0FOVEVOTkEsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfUlhfQU5URU5OQVMsCisJV0wzNTAxX01JQl9BVFRSX0RJVkVSU0lUWV9TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9ESVZFUlNJVFlfU0VMRUNUSU9OX1JTLAorCVdMMzUwMV9NSUJfQVRUUl9OUl9TVVBQT1JURURfUFdSX0xFVkVMUywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNCwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMOCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfQ0hBTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX01PREVfU1VQUE9SVEVELAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX0NDQV9NT0RFLAorCVdMMzUwMV9NSUJfQVRUUl9FRF9USFJFU0hPTEQsCisJV0wzNTAxX01JQl9BVFRSX1NJTlRIRVNJWkVSX0xPQ0tFRCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9QV1JfU1RBVEUsCisJV0wzNTAxX01JQl9BVFRSX0RPWkVfVFVSTk9OX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JDUjMzLAorCVdMMzUwMV9NSUJfQVRUUl9ERUZBVUxUX0NIQU4sCisJV0wzNTAxX01JQl9BVFRSX1NTSUQsCisJV0wzNTAxX01JQl9BVFRSX1BXUl9NR01UX0VOQUJMRSwKKwlXTDM1MDFfTUlCX0FUVFJfTkVUX0NBUEFCSUxJVFksCisJV0wzNTAxX01JQl9BVFRSX1JPVVRJTkcsCit9OworCitlbnVtIHdsMzUwMV9uZXRfdHlwZSB7CisJV0wzNTAxX05FVF9UWVBFX0lORlJBLAorCVdMMzUwMV9ORVRfVFlQRV9BREhPQywKKwlXTDM1MDFfTkVUX1RZUEVfQU5ZX0JTUywKK307CisKK2VudW0gd2wzNTAxX3NjYW5fdHlwZSB7CisJV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJV0wzNTAxX1NDQU5fVFlQRV9QQVNTSVZFLAorfTsKKworZW51bSB3bDM1MDFfdHhfcmVzdWx0IHsKKwlXTDM1MDFfVFhfUkVTVUxUX1NVQ0NFU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9OT19CU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9SRVRSWV9MSU1JVCwKK307CisKK2VudW0gd2wzNTAxX3N5c190eXBlIHsKKwlXTDM1MDFfU1lTX1RZUEVfT1BFTiwKKwlXTDM1MDFfU1lTX1RZUEVfU0hBUkVfS0VZLAorfTsKKworZW51bSB3bDM1MDFfc3RhdHVzIHsKKwlXTDM1MDFfU1RBVFVTX1NVQ0NFU1MsCisJV0wzNTAxX1NUQVRVU19JTlZBTElELAorCVdMMzUwMV9TVEFUVVNfVElNRU9VVCwKKwlXTDM1MDFfU1RBVFVTX1JFRlVTRUQsCisJV0wzNTAxX1NUQVRVU19NQU5ZX1JFUSwKKwlXTDM1MDFfU1RBVFVTX0FMUkVBRFlfQlNTLAorfTsKKworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUwkJMHgwMDAxICAvKiBzZWUgODAyLjExIHAuNTggKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9JQlNTCQkweDAwMDIgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRQkweDAwMDQgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QJMHgwMDA4ICAvKiAgICAgIC0gIiAtCSAgICovCisjZGVmaW5lIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfUFJJVkFDWQkJMHgwMDEwICAvKiAgICAgIC0gIiAtCSAgICovCisKKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9GQ0MJMHgxMAkvKiBDaGFubmVsIDEgdG8gMTEJVVNBICAgICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fRE9DCTB4MjAJLyogQ2hhbm5lbCAxIHRvIDExCUNhbmFkYSAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0VUU0kJMHgzMAkvKiBDaGFubmVsIDEgdG8gMTMJRXVyb3BlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fU1BBSU4JMHgzMQkvKiBDaGFubmVsIDEwIHRvIDExCVNwYWluICAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0ZSQU5DRQkweDMyCS8qIENoYW5uZWwgMTAgdG8gMTMJRnJhbmNlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLCTB4NDAJLyogQ2hhbm5lbCAxNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLMQkweDQxCS8qIENoYW5uZWwgMS0xNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fSVNSQUVMCTB4NTAJLyogQ2hhbm5lbCAzIC0gOQlJc3JhZWwgKi8KKworI2RlZmluZSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIDEyOCAvKiBNU0IgKi8KKworZW51bSBpd19tZ210X3JhdGVfbGFiZWxzIHsKKwlJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQgICA9IDIsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklUICAgPSA0LAorCUlXX01HTVRfUkFURV9MQUJFTF81XzVNQklUID0gMTEsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzExTUJJVCAgPSAyMiwKK307CisKK2VudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIHsKKwlJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELAkJICAvKiBTZXJ2aWNlIFNldCBJZGVudGl0eSAqLworCUlXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwlJV19NR01UX0lORk9fRUxFTUVOVF9GSF9QQVJBTUVURVJfU0VULAorCUlXX01HTVRfSU5GT19FTEVNRU5UX0RTX1BBUkFNRVRFUl9TRVQsCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfQ1NfUEFSQU1FVEVSX1NFVCwKKwlJV19NR01UX0lORk9fRUxFTUVOVF9DU19USU0sCQkgIC8qIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFwICovCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCS8qIDctMTU6IFJlc2VydmVkLCB1bnVzZWQgKi8KKwlJV19NR01UX0lORk9fRUxFTUVOVF9DSEFMTEVOR0VfVEVYVCA9IDE2LAorCS8qIDE3LTMxIFJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KKwkvKiAzMi0yNTUgUmVzZXJ2ZWQsIHVudXNlZCAqLworfTsKKworc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsgLyogb25lIG9mIGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzLAorCQkgIGJ1dCBzaXplb2YoZW51bSkgPiBzaXplb2YodTgpIDotKCAqLworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgeworCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKKwl1OCAJCQkgICAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBBY2NvcmRpbmcgdG8gODAyLjExIFdpcmVsZXNzIE5ldG93b3JzLCB0aGUgZGVmaW5pdGl2ZSBndWlkZSAtIE8nUmVpbGx5CisgKiBQZyA3NQorICovIAorI2RlZmluZSBJV19EQVRBX1JBVEVfTUFYX0xBQkVMUyA4CisKK3N0cnVjdCBpd19tZ210X2RhdGFfcnNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBkYXRhX3JhdGVfbGFiZWxzW0lXX0RBVEFfUkFURV9NQVhfTEFCRUxTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTggCQkJICAgIGNoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfY2ZfcHNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBjZnBfY291bnQ7CisJdTggCQkJICAgIGNmcF9wZXJpb2Q7CisJdTE2IAkJCSAgICBjZnBfbWF4X2R1cmF0aW9uOworCXUxNiAJCQkgICAgY2ZwX2R1cl9yZW1haW5pbmc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfaWJzc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTE2IAkJCSAgICBhdGltX3dpbmRvdzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wzNTAxX3R4X2hkciB7CisJdTE2CXR4X2NudDsKKwl1OAlzeW5jWzE2XTsKKwl1MTYJc2ZkOworCXU4CXNpZ25hbDsKKwl1OAlzZXJ2aWNlOworCXUxNglsZW47CisJdTE2CWNyYzE2OworCXUxNglmcmFtZV9jdHJsOworCXUxNglkdXJhdGlvbl9pZDsKKwl1OAlhZGRyMVtFVEhfQUxFTl07CisJdTgJYWRkcjJbRVRIX0FMRU5dOworCXU4CWFkZHIzW0VUSF9BTEVOXTsKKwl1MTYJc2VxX2N0cmw7CisJdTgJYWRkcjRbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9yeF9oZHIgeworCXUxNglyeF9uZXh0X2JsazsKKwl1MTYJcmNfbmV4dF9mcmFtZV9ibGs7CisJdTgJcnhfYmxrX2N0cmw7CisJdTgJcnhfbmV4dF9mcmFtZTsKKwl1OAlyeF9uZXh0X2ZyYW1lMTsKKwl1OAlyc3NpOworCWNoYXIJdGltZVs4XTsKKwl1OAlzaWduYWw7CisJdTgJc2VydmljZTsKKwl1MTYJbGVuOworCXUxNgljcmMxNjsKKwl1MTYJZnJhbWVfY3RybDsKKwl1MTYJZHVyYXRpb247CisJdTgJYWRkcjFbRVRIX0FMRU5dOworCXU4CWFkZHIyW0VUSF9BTEVOXTsKKwl1OAlhZGRyM1tFVEhfQUxFTl07CisJdTE2CXNlcTsKKwl1OAlhZGRyNFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIHByb2JlX2RlbGF5OworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIG9wZXJhdGlvbmFsX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfY2ZfcHNldAkgICAgY2ZfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJdGltZW91dDsKKwl1MTYJY2FwX2luZm87CisJdTE2CWxpc3Rlbl9pbnRlcnZhbDsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfYXNzb2NfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CW1hY19hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfYXV0aF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXRpbWVvdXQ7CisJdTgJbWFjX2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9hdXRoX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXN0YXR1czsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CW1pYl9hdHRyaWI7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNgltaWJfc3RhdHVzOworCXUxNgltaWJfYXR0cmliOworCXU4CW1pYl92YWx1ZVsxMDBdOworfTsKKworc3RydWN0IHdsMzUwMV9qb2luX3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICByZXNlcnZlZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgb3BlcmF0aW9uYWxfcnNldDsKKwl1MTYJCQkgICAgcmVzZXJ2ZWQyOworCXUxNgkJCSAgICB0aW1lb3V0OworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1OAkJCSAgICB0aW1lc3RhbXBbOF07CisJdTgJCQkgICAgbG9jYWxfdGltZVs4XTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIGNhcF9pbmZvOworCXU4CQkJICAgIGJzc190eXBlOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2NmX3BzZXQJICAgIGNmX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfaWJzc19wc2V0ICAgIGlic3NfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2pvaW5fY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJc3RhdHVzOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcHdyX3NhdmU7CisJdTgJd2FrZV91cDsKKwl1OAlyZWNlaXZlX2R0aW1zOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNglzdGF0dXM7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIGJzc190eXBlOworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1MTYJCQkgICAgbWluX2NoYW5fdGltZTsKKwl1MTYJCQkgICAgbWF4X2NoYW5fdGltZTsKKwl1OAkJCSAgICBjaGFuX2xpc3RbMTRdOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwllbnVtIHdsMzUwMV9zY2FuX3R5cGUJICAgIHNjYW5fdHlwZTsKK307CisKK3N0cnVjdCB3bDM1MDFfc2Nhbl9jb25maXJtIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIHJlc2VydmVkOworCXUxNgkJCSAgICBzdGF0dXM7CisJY2hhcgkJCSAgICB0aW1lc3RhbXBbOF07CisJY2hhcgkJCSAgICBsb2NhbHRpbWVbOF07CisJdTE2CQkJICAgIGJlYWNvbl9wZXJpb2Q7CisJdTE2CQkJICAgIGR0aW1fcGVyaW9kOworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1OAkJCSAgICBic3NpZFtFVEhfQUxFTl07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgIHNzaWQ7CisJc3RydWN0IGl3X21nbXRfZHNfcHNldAkgICAgZHNfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0CSAgICBjZl9wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIGJzc19iYXNpY19yc2V0OworCXU4CQkJICAgIHJzc2k7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcHJpOworCXU4CXNlcnZpY2VfY2xhc3M7CisJdTgJZGFkZHJbRVRIX0FMRU5dOworCXU4CXNhZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcmVjZXB0aW9uOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworCXU4CWRhZGRyW0VUSF9BTEVOXTsKKwl1OAlzYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX21kX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CWRhdGE7CisJdTgJc3RhdHVzOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworfTsKKworc3RydWN0IHdsMzUwMV9yZXN5bmNfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworfTsKKworLyogRGVmaW5pdGlvbnMgZm9yIHN1cHBvcnRpbmcgY2xvbmUgYWRhcHRlcnMuICovCisvKiBTeXN0ZW0gSW50ZXJmYWNlIFJlZ2lzdGVycyAoU0lSIHNwYWNlKSAqLworI2RlZmluZSBXTDM1MDFfTklDX0dDUiAoKHU4KTB4MDApCS8qIFNJUjAgLSBHZW5lcmFsIENvbmYgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19CU1MgKCh1OCkweDAxKQkvKiBTSVIxIC0gQmFuayBTd2l0Y2hpbmcgU2VsZWN0IFJlZyAqLworI2RlZmluZSBXTDM1MDFfTklDX0xNQUwgKCh1OCkweDAyKQkvKiBTSVIyIC0gTG9jYWwgTWVtIGFkZHIgUmVnIFs3OjBdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfTE1BSCAoKHU4KTB4MDMpCS8qIFNJUjMgLSBMb2NhbCBNZW0gYWRkciBSZWcgWzE0OjhdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEEgKCh1OCkweDA0KQkvKiBTSVI0IC0gSS9PIERhdGEgUG9ydCBBICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEIgKCh1OCkweDA1KQkvKiBTSVI1IC0gSS9PIERhdGEgUG9ydCBCICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEMgKCh1OCkweDA2KQkvKiBTSVI2IC0gSS9PIERhdGEgUG9ydCBDICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEQgKCh1OCkweDA3KQkvKiBTSVI3IC0gSS9PIERhdGEgUG9ydCBEICovCisKKy8qIEJpdHMgaW4gR0NSICovCisjZGVmaW5lIFdMMzUwMV9HQ1JfU1dSRVNFVCAoKHU4KTB4ODApCisjZGVmaW5lIFdMMzUwMV9HQ1JfQ09SRVNFVCAoKHU4KTB4NDApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRElTUFdETiAoKHU4KTB4MjApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNXQUlUICAoKHU4KTB4MTApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNJTlQgICAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9HQ1JfSU5UMkVDICAoKHU4KTB4MDQpCisjZGVmaW5lIFdMMzUwMV9HQ1JfRU5FQ0lOVCAoKHU4KTB4MDIpCisjZGVmaW5lIFdMMzUwMV9HQ1JfREFNICAgICAoKHU4KTB4MDEpCisKKy8qIEJpdHMgaW4gQlNTIChCYW5rIFN3aXRjaGluZyBTZWxlY3QgUmVnaXN0ZXIpICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UwICgodTgpMHgyMCkJLyogRmxhc2ggbWVtb3J5IHBhZ2UwICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UxICgodTgpMHgyOCkKKyNkZWZpbmUgV0wzNTAxX0JTU19GUEFHRTIgKCh1OCkweDMwKQorI2RlZmluZSBXTDM1MDFfQlNTX0ZQQUdFMyAoKHU4KTB4MzgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UwICgodTgpMHgwMCkJLyogU1JBTSBwYWdlMCAqLworI2RlZmluZSBXTDM1MDFfQlNTX1NQQUdFMSAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UyICgodTgpMHgxMCkKKyNkZWZpbmUgV0wzNTAxX0JTU19TUEFHRTMgKCh1OCkweDE4KQorCisvKiBEZWZpbmUgRHJpdmVyIEludGVyZmFjZSAqLworLyogUmVmZXIgSUVFRSA4MDIuMTEgKi8KKy8qIFR4IHBhY2tldCBoZWFkZXIsIGluY2x1ZGUgUExDUCBhbmQgTVBEVSAqLworLyogVHggUExDUCBIZWFkZXIgKi8KK3N0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIgeworCXU4CXN5bmNbMTZdOworCXUxNglzZmQ7CisJdTgJc2lnbmFsOworCXU4CXNlcnZpY2U7CisJdTE2CWxlbjsKKwl1MTYJY3JjMTY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHdsMzUwMV84MDIxMV90eF9oZHIgeworCXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIJcGNscF9oZHI7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyCQltYWNfaGRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgICBSZXNlcnZlIHRoZSBiZWdpbm5pbmcgVHggc3BhY2UgZm9yIGRlc2NyaXB0b3IgdXNlLgorCisgICBUeEJsb2NrT2Zmc2V0IC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogXAorCShUeEZyZWVEZXNjKQl8ICAwIHwgIDEgfCAgMiB8ICAzIHwgIFwKKwkJCXwgIDQgfCAgNSB8ICA2IHwgIDcgfCAgIHwKKwkJCXwgIDggfCAgOSB8IDEwIHwgMTEgfCAgIFRYX0RFU0MgKiAyMAorCQkJfCAxMiB8IDEzIHwgMTQgfCAxNSB8ICAgfAorCQkJfCAxNiB8IDE3IHwgMTggfCAxOSB8ICAvCisgICBUeEJ1ZmZlckJlZ2luIC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogLworICAgKFR4QnVmZmVySGVhZCkJfCAJCSAgICB8CisgICAoVHhCdWZmZXJUYWlsKQl8IAkJICAgIHwKKwkJCXwgICAgU2VuZCBCdWZmZXIgICAgfAorCQkJfCAJCSAgICB8CisJCQl8CQkgICAgfAorCQkJKi0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICBUeEJ1ZmZlckVuZCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLworCisqLworCitzdHJ1Y3Qgd2wzNTAxX2NhcmQgeworCWludAkJCQliYXNlX2FkZHI7CisJdTgJCQkJbWFjX2FkZHJbRVRIX0FMRU5dOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0OworCXN0cnVjdCB3bDM1MDFfZ2V0X2NvbmZpcm0Jc2lnX2dldF9jb25maXJtOworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfY29uZmlybQlzaWdfcHdyX21nbXRfY29uZmlybTsKKwl1MTYJCQkJdHhfYnVmZmVyX3NpemU7CisJdTE2CQkJCXR4X2J1ZmZlcl9oZWFkOworCXUxNgkJCQl0eF9idWZmZXJfdGFpbDsKKwl1MTYJCQkJdHhfYnVmZmVyX2NudDsKKwl1MTYJCQkJZXNicV9yZXFfc3RhcnQ7CisJdTE2CQkJCWVzYnFfcmVxX2VuZDsKKwl1MTYJCQkJZXNicV9yZXFfaGVhZDsKKwl1MTYJCQkJZXNicV9yZXFfdGFpbDsKKwl1MTYJCQkJZXNicV9jb25maXJtX3N0YXJ0OworCXUxNgkJCQllc2JxX2NvbmZpcm1fZW5kOworCXUxNgkJCQllc2JxX2NvbmZpcm07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgCWVzc2lkOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgIAlrZWVwX2Vzc2lkOworCXU4CQkJCWJzc2lkW0VUSF9BTEVOXTsKKwlpbnQJCQkJbmV0X3R5cGU7CisJY2hhcgkJCQluaWNrWzMyXTsKKwljaGFyCQkJCWNhcmRfbmFtZVszMl07CisJY2hhcgkJCQlmaXJtd2FyZV9kYXRlWzMyXTsKKwl1OAkJCQljaGFuOworCXU4CQkJCWNhcF9pbmZvOworCXUxNgkJCQlzdGFydF9zZWc7CisJdTE2CQkJCWJzc19jbnQ7CisJdTE2CQkJCWpvaW5fc3RhX2JzczsKKwl1OAkJCQlyc3NpOworCXU4CQkJCWFkaG9jX3RpbWVzOworCXU4CQkJCXJlZ19kb21haW47CisJdTgJCQkJdmVyc2lvblsyXTsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybQlic3Nfc2V0WzIwXTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAJc3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MJCXdzdGF0czsKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEJCXNweV9kYXRhOworCXN0cnVjdCBkZXZfbm9kZV90CQlub2RlOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMzZTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTAsMCArMSwyMjcwIEBACisvKgorICogV0wzNTAxIFdpcmVsZXNzIExBTiBQQ01DSUEgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKiBXcml0dGVuIG9yaWdpbmFsbHkgZm9yIExpbnV4IDIuMC4zMCBieSBGb3ggQ2hlbiwgbWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3CisgKiBQb3J0ZWQgdG8gMi4yLCAyLjQgJiAyLjUgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiBXaXJlbGVzcyBleHRlbnNpb25zIGluIDIuNCBieSBHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPgorICoKKyAqIFJlZmVyZW5jZXMgdXNlZCBieSBGb3ggQ2hlbiB3aGlsZSB3cml0aW5nIHRoZSBvcmlnaW5hbCBkcml2ZXIgZm9yIDIuMC4zMDoKKyAqCisgKiAgIDEuIFdMMjR4eCBwYWNrZXQgZHJpdmVycyAodG9vYXNtLmFzbSkKKyAqICAgMi4gQWNjZXNzIFBvaW50IEZpcm13YXJlIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIGZvciBJRUVFIDgwMi4xMSBTVVRSTworICogICAzLiBJRUVFIDgwMi4xMQorICogICA0LiBMaW51eCBuZXR3b3JrIGRyaXZlciAoL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQpCisgKiAgIDUuIElTQSBjYXJkIGRyaXZlciAtIHdsMjQuYworICogICA2LiBMaW51eCBQQ01DSUEgc2tlbGV0b24gZHJpdmVyIC0gc2tlbGV0b24uYworICogICA3LiBMaW51eCBQQ01DSUEgM2M1ODkgbmV0d29yayBkcml2ZXIgLSAzYzU4OV9jcy5jCisgKgorICogVGVzdGVkIHdpdGggV0wyNDAwIGZpcm13YXJlIDEuMiwgTGludXggMi4wLjMwLCBhbmQgcGNtY2lhLWNzLTIuOS4xMgorICogICAxLiBQZXJmb3JtYW5jZTogYWJvdXQgMTY1IEtieXRlcy9zZWMgaW4gVENQL0lQIHdpdGggQWQtSG9jIG1vZGUuCisgKiAgICAgIHJzaCAxOTIuMTY4LjEuMyAiZGQgaWY9L2Rldi96ZXJvIGJzPTFrIGNvdW50PTEwMDAiID4gL2Rldi9udWxsCisgKiAgICAgIChTcGVjaWZpY2F0aW9uIDJNIGJpdHMvc2VjLiBpcyBhYm91dCAyNTAgS2J5dGVzL3NlYy4sIGJ1dCB3ZSBtdXN0IGRlZHVjdAorICogICAgICAgRVRIRVIvSVAvVURQL1RDUCBoZWFkZXIsIGFuZCBhY2tub3dsZWRnZW1lbnQgb3ZlcmhlYWQpCisgKgorICogVGVzdGVkIHdpdGggUGxhbmV0IEFQIGluIDIuNC4xNywgMTg0IEtieXRlcy9zIGluIFVEUCBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlLAorICogMTczIEtieXRlcy9zIGluIFRDUC4KKyAqCisgKiBUZXN0ZWQgd2l0aCBQbGFuZXQgQVAgaW4gMi41LjczLWJrLCAyMTYgS2J5dGVzL3MgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZQorICogd2l0aCBhIFNNUCBtYWNoaW5lIChkdWFsIHBlbnRpdW0gMTAwKSwgdXNpbmcgcGt0Z2VuLCA0MzIgcHBzIChwa3Rfc2l6ZSA9IDYwKQorICovCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJ3bDM1MDEuaCIKKworI2lmbmRlZiBfX2kzODZfXworI2RlZmluZSBzbG93X2Rvd25faW8oKQorI2VuZGlmCisKKy8qIEZvciByb3VnaCBjb25zdGFudCBkZWxheSAqLworI2RlZmluZSBXTDM1MDFfTk9QTE9PUChuKSB7IGludCB4ID0gMDsgd2hpbGUgKHgrKyA8IG4pIHNsb3dfZG93bl9pbygpOyB9CisKKy8qCisgKiBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZiB5b3UgZG8gbm90CisgKiBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUgbGVmdCBvdXQuICBJZiB5b3UKKyAqIGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLQorICogYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYQorICogJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisgKi8KKyNkZWZpbmUgUENNQ0lBX0RFQlVHIDAKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKSBcCisJeyBpZiAocGNfZGVidWcgPiAobikpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7IH0KKyNlbHNlCisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgd2wzNTAxX291dGIoYSwgYikgeyBvdXRiKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0Yl9wKGEsIGIpIHsgb3V0Yl9wKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0c2IoYSwgYiwgYykgeyBvdXRzYihhLCBiLCBjKTsgc2xvd19kb3duX2lvKCk7IH0KKworI2RlZmluZSBXTDM1MDFfUkVMRUFTRV9USU1FT1VUICgyNSAqIEhaKQorI2RlZmluZSBXTDM1MDFfTUFYX0FESE9DX1RSSUVTIDE2CisKKyNkZWZpbmUgV0wzNTAxX1JFU1VNRQkwCisjZGVmaW5lIFdMMzUwMV9TVVNQRU5ECTEKKworLyoKKyAqIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLiAgSXQgd2lsbAorICogYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cyBldmVudCBpcworICogcmVjZWl2ZWQuIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjb25maWd1cmUgb3IKKyAqIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQgaW5zZXJ0aW9uIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5CisgKiBhcmUgaW52b2tlZCBmcm9tIHRoZSB3bDI0IGV2ZW50IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCB3bDM1MDFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICogZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBkZXZfaW5mb190IHdsMzUwMV9kZXZfaW5mbyA9ICJ3bDM1MDFfY3MiOworCitzdGF0aWMgaW50IHdsMzUwMV9jaGFuMmZyZXFbXSA9IHsKKwlbMF0gID0gMjQxMiwgWzFdICA9IDI0MTcsIFsyXSAgPSAyNDIyLCBbM10gID0gMjQyNywgWzRdID0gMjQzMiwKKwlbNV0gID0gMjQzNywgWzZdICA9IDI0NDIsIFs3XSAgPSAyNDQ3LCBbOF0gID0gMjQ1MiwgWzldID0gMjQ1NywKKwlbMTBdID0gMjQ2MiwgWzExXSA9IDI0NjcsIFsxMl0gPSAyNDcyLCBbMTNdID0gMjQ3NywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCByZWdfZG9tYWluOworCWludCBtaW4sIG1heCwgZGVmbHQ7Cit9IGl3X2NoYW5uZWxfdGFibGVbXSA9IHsKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9GQ0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9ET0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9FVFNJLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTMsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fU1BBSU4sCisJCS5taW4JICAgID0gMTAsCisJCS5tYXgJICAgID0gMTEsCisJCS5kZWZsdAkgICAgPSAxMCwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0ZSQU5DRSwKKwkJLm1pbgkgICAgPSAxMCwKKwkJLm1heAkgICAgPSAxMywKKwkJLmRlZmx0CSAgICA9IDEwLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fTUtLLAorCQkubWluCSAgICA9IDE0LAorCQkubWF4CSAgICA9IDE0LAorCQkuZGVmbHQJICAgID0gMTQsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9NS0sxLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTQsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fSVNSQUVMLAorCQkubWluCSAgICA9IDMsCisJCS5tYXgJICAgID0gOSwKKwkJLmRlZmx0CSAgICA9IDksCisJfSwKK307CisKKy8qKgorICogaXdfdmFsaWRfY2hhbm5lbCAtIHZhbGlkYXRlIGNoYW5uZWwgaW4gcmVndWxhdG9yeSBkb21haW4KKyAqIEByZWdfY29tYWluIC0gcmVndWxhdG9yeSBkb21haW4KKyAqIEBjaGFubmVsIC0gY2hhbm5lbCB0byB2YWxpZGF0ZQorICoKKyAqIFJldHVybnMgMCBpZiBpbnZhbGlkIGluIHRoZSBzcGVjaWZpZWQgcmVndWxhdG9yeSBkb21haW4sIG5vbi16ZXJvIGlmIHZhbGlkLgorICovCitzdGF0aWMgaW50IGl3X3ZhbGlkX2NoYW5uZWwoaW50IHJlZ19kb21haW4sIGludCBjaGFubmVsKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd19jaGFubmVsX3RhYmxlKTsgaSsrKQorCQlpZiAocmVnX2RvbWFpbiA9PSBpd19jaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pIHsKKwkJCXJjID0gY2hhbm5lbCA+PSBpd19jaGFubmVsX3RhYmxlW2ldLm1pbiAmJgorCQkJICAgICBjaGFubmVsIDw9IGl3X2NoYW5uZWxfdGFibGVbaV0ubWF4OworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXdfZGVmYXVsdF9jaGFubmVsIC0gZ2V0IGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICogQHJlZ19jb21haW4gLSByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybnMgdGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICovCitzdGF0aWMgaW50IGl3X2RlZmF1bHRfY2hhbm5lbChpbnQgcmVnX2RvbWFpbikKK3sKKwlpbnQgaSwgcmMgPSAxOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXdfY2hhbm5lbF90YWJsZSk7IGkrKykKKwkJaWYgKHJlZ19kb21haW4gPT0gaXdfY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CisJCQlyYyA9IGl3X2NoYW5uZWxfdGFibGVbaV0uZGVmbHQ7CisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIGlkLAorCQkJCSAgICAgc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICplbCwKKwkJCQkgICAgIHZvaWQgKnZhbHVlLCBpbnQgbGVuKQoreworCWVsLT5pZCAgPSBpZDsKKwllbC0+bGVuID0gbGVuOworCW1lbWNweShlbC0+ZGF0YSwgdmFsdWUsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICp0bywKKwkJCQkgICAgICBzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgKmZyb20pCit7CisJaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGZyb20tPmlkLCB0bywgZnJvbS0+ZGF0YSwgZnJvbS0+bGVuKTsKK30KKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIHdsMjQgZGV2aWNlLiAgRWFjaCBhY3R1YWwgUENNQ0lBIGNhcmQKKyAqIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQgYnkgb25lIGRldl9saW5rX3QKKyAqIHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyAqCisgKiBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUgbWVtb3J5CisgKiBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yIGRldmljZSBudW1iZXJzCisgKiBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICp3bDM1MDFfZGV2X2xpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfc3dpdGNoX3BhZ2Uoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCBwYWdlKQoreworCXdsMzUwMV9vdXRiKHBhZ2UsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKK30KKworLyoKKyAqIEdldCBFdGhlcm5ldCBNQUMgYWRkcmVzc3MuCisgKgorICogV0FSTklORzogV2Ugc3dpdGNoIHRvIEZQQUdFMCBhbmQgc3dpdGMgYmFjayBhZ2Fpbi4KKyAqICAgICAgICAgIE1ha2luZyBzdXJlIHRoZXJlIGlzIG5vIG90aGVyIFdMIGZ1bmN0aW9uIGJlZW5pbmcgY2FsbGVkIGJ5IElTUi4KKyAqLworc3RhdGljIGludCB3bDM1MDFfZ2V0X2ZsYXNoX21hY19hZGRyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlpbnQgYmFzZV9hZGRyID0gdGhpcy0+YmFzZV9hZGRyOworCisJLyogZ2V0IE1BQyBhZGRyICovCisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTMsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsgLyogQlNTICovCisJd2wzNTAxX291dGIoMHgwMCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsJLyogTE1BTCAqLworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CS8qIExNQUggKi8KKworCS8qIHdhaXQgZm9yIHJlYWRpbmcgRUVQUk9NICovCisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclswXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzFdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbMl0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclszXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzRdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbNV0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5yZWdfZG9tYWluID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKKwl3bDM1MDFfb3V0YigweDA0LCBiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUwpOworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT52ZXJzaW9uWzBdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+dmVyc2lvblsxXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKGZvciBzYWZldHkpICovCisJd2wzNTAxX3N3aXRjaF9wYWdlKHRoaXMsIFdMMzUwMV9CU1NfU1BBR0UwKTsKKworCS8qIFRoZSBNQUMgYWRkciBzaG91bGQgYmUgMDA6NjA6Li4uICovCisJcmV0dXJuIHRoaXMtPm1hY19hZGRyWzBdID09IDB4MDAgJiYgdGhpcy0+bWFjX2FkZHJbMV0gPT0gMHg2MDsKK30KKworLyoqCisgKiB3bDM1MDFfc2V0X3RvX3dsYSAtIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gUEMgdG8gY2FyZAorICogQGRlc3Q6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQHNyYzogUEMgYWRkcmVzc2luZyBzcGFjZQorICogQHNpemU6IEJ5dGVzIHRvIG1vdmUKKyAqCisgKiBNb3ZlICdzaXplJyBieXRlcyBmcm9tIFBDIHRvIGNhcmQuIChTaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQpCisgKi8KK3ZvaWQgd2wzNTAxX3NldF90b193bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgZGVzdCwgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKK3sKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgKGRlc3QgJiAweDgwMDApID8gV0wzNTAxX0JTU19TUEFHRTEgOgorCQkJCQkJICAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoZGVzdCAmIDB4ZmYsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BTCk7CisJd2wzNTAxX291dGIoKChkZXN0ID4+IDgpICYgMHg3ZiksIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisKKwkvKiByZXAgb3V0IHRvIFBvcnQgQSAqLworCXdsMzUwMV9vdXRzYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBLCBzcmMsIHNpemUpOworfQorCisvKioKKyAqIHdsMzUwMV9nZXRfZnJvbV93bGEgLSBNb3ZlICdzaXplJyBieXRlcyBmcm9tIGNhcmQgdG8gUEMKKyAqIEBzcmM6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQGRlc3Q6IFBDIGFkZHJlc3Npbmcgc3BhY2UKKyAqIEBzaXplOiBCeXRlcyB0byBtb3ZlCisgKgorICogTW92ZSAnc2l6ZScgYnl0ZXMgZnJvbSBjYXJkIHRvIFBDLiAoU2hvdWxkbid0IGJlIGludGVycnVwdGVkKQorICovCit2b2lkIHdsMzUwMV9nZXRfZnJvbV93bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgc3JjLCB2b2lkICpkZXN0LAorCQkJIGludCBzaXplKQoreworCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLworCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCAoc3JjICYgMHg4MDAwKSA/IFdMMzUwMV9CU1NfU1BBR0UxIDoKKwkJCQkJCSAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoc3JjICYgMHhmZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsKKwl3bDM1MDFfb3V0Yigoc3JjID4+IDgpICYgMHg3ZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsKKworCS8qIHJlcCBnZXQgZnJvbSBQb3J0IEEgKi8KKwlpbnNiKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEsIGRlc3QsIHNpemUpOworfQorCisvKgorICogR2V0L0FsbG9jYXRlIGEgZnJlZSBUeCBEYXRhIEJ1ZmZlcgorICoKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICB8ICAgIFBMQ1AgICAgICB8ICAgIE1BQyBIZWFkZXIgICB8ICBEU1QgIFNSQyAgICAgICAgIERhdGEgLi4uICAgICAgIHwKKyAqICB8ICAoMjQgYnl0ZXMpICB8ICAgICgzMCBieXRlcykgICB8ICAoNikgICg2KSAgKEV0aGVybmV0IFJvdyBEYXRhKSAgIHwKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBcICAgICAgICAgICAgICAgXC0gSUVFRSA4MDIuMTEgLS8gXC0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS8KKyAqICAgXC1zdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkci0tLyAgIFwtLS0tLS0tLSBFdGhlcm5ldCBGcmFtZSAtLS0tLS0tLworICoKKyAqIFJldHVybiA9IFBvc3Rpb24gaW4gQ2FyZAorICovCitzdGF0aWMgdTE2IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGxlbikKK3sKKwl1MTYgbmV4dCwgYmxrX2NudCA9IDAsIHplcm8gPSAwOworCXUxNiBmdWxsX2xlbiA9IHNpemVvZihzdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkcikgKyBsZW47CisJdTE2IHJldCA9IDA7CisKKwlpZiAoZnVsbF9sZW4gPiB0aGlzLT50eF9idWZmZXJfY250ICogMjU0KQorCQlnb3RvIG91dDsKKwlyZXQgPSB0aGlzLT50eF9idWZmZXJfaGVhZDsKKwl3aGlsZSAoZnVsbF9sZW4pIHsKKwkJaWYgKGZ1bGxfbGVuIDwgMjU0KQorCQkJZnVsbF9sZW4gPSAwOworCQllbHNlCisJCQlmdWxsX2xlbiAtPSAyNTQ7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZuZXh0LAorCQkJCSAgICBzaXplb2YobmV4dCkpOworCQlpZiAoIWZ1bGxfbGVuKQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZ6ZXJvLAorCQkJCQkgIHNpemVvZih6ZXJvKSk7CisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gbmV4dDsKKwkJYmxrX2NudCsrOworCQkvKiBpZiBidWZmZXIgaXMgbm90IGVub3VnaCAqLworCQlpZiAoIW5leHQgJiYgZnVsbF9sZW4pIHsKKwkJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcmV0OworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXRoaXMtPnR4X2J1ZmZlcl9jbnQgLT0gYmxrX2NudDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnJlZSBhbiBhbGxvY2F0ZWQgVHggQnVmZmVyLiBwdHIgbXVzdCBiZSBjb3JyZWN0IHBvc2l0aW9uLgorICovCitzdGF0aWMgdm9pZCB3bDM1MDFfZnJlZV90eF9idWZmZXIoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgcHRyKQoreworCS8qIGNoZWNrIGlmIGFsbCBzcGFjZSBpcyBub3QgZnJlZSAqLworCWlmICghdGhpcy0+dHhfYnVmZmVyX2hlYWQpCisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcHRyOworCWVsc2UKKwkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX3RhaWwsCisJCQkJICAmcHRyLCBzaXplb2YocHRyKSk7CisJd2hpbGUgKHB0cikgeworCQl1MTYgbmV4dDsKKworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgcHRyLCAmbmV4dCwgc2l6ZW9mKG5leHQpKTsKKwkJdGhpcy0+dHhfYnVmZmVyX3RhaWwgPSBwdHI7CisJCXB0ciA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IHdsMzUwMV9lc2JxX3JlcV90ZXN0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX2hlYWQgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiAqcHRyKQoreworCXUxNiB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfaGVhZCwgcHRyLCAyKTsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT5lc2JxX3JlcV9oZWFkICsgMiwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfcmVxX2hlYWQgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX2hlYWQgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZXNicV9leGVjKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdm9pZCAqc2lnLCBpbnQgc2lnX3NpemUpCit7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQl1MTYgcHRyID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgc2lnX3NpemUpOworCQlpZiAocHRyKSB7CisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsIHNpZywgc2lnX3NpemUpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJcmMgPSAwOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X21pYl92YWx1ZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4IGluZGV4LAorCQkJCXZvaWQgKmJmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgc2lnID0geworCQkuc2lnX2lkCSAgICA9IFdMMzUwMV9TSUdfR0VUX1JFUSwKKwkJLm1pYl9hdHRyaWIgPSBpbmRleCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl9zdGF0dXMgPSAyNTU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGlzLT53YWl0LAorCQkJCXRoaXMtPnNpZ19nZXRfY29uZmlybS5taWJfc3RhdHVzICE9IDI1NSk7CisJCQlpZiAoIXJjKQorCQkJCW1lbWNweShiZiwgdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl92YWx1ZSwKKwkJCQkgICAgICAgc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9wd3JfbWdtdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIGludCBzdXNwZW5kKQoreworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1BXUl9NR01UX1JFUSwKKwkJLnB3cl9zYXZlCT0gc3VzcGVuZCwKKwkJLndha2VfdXAJPSAhc3VzcGVuZCwKKwkJLnJlY2VpdmVfZHRpbXMJPSAxMCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzID0gMjU1OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhpcy0+d2FpdCwKKwkJCQl0aGlzLT5zaWdfcHdyX21nbXRfY29uZmlybS5zdGF0dXMgIT0gMjU1KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBzdGF0dXM9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICBzdXNwZW5kID8gInN1c3BlbmQiIDogInJlc3VtZSIsCisJCQkgICAgICAgdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3NlbmRfcGt0IC0gU2VuZCBhIHBhY2tldC4KKyAqIEB0aGlzIC0gY2FyZAorICoKKyAqIFNlbmQgYSBwYWNrZXQuCisgKgorICogZGF0YSA9IEV0aGVybmV0IHJhdyBmcmFtZS4gIChlLmcuIGRhdGFbMF0gLSBkYXRhWzVdIGlzIERlc3QgTUFDIEFkZHIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAtIGRhdGFbMTFdIGlzIFNyYyBNQUMgQWRkcikKKyAqIFJlZjogSUVFRSA4MDIuMTEKKyAqLworc3RhdGljIGludCB3bDM1MDFfc2VuZF9wa3Qoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqZGF0YSwgdTE2IGxlbikKK3sKKwl1MTYgYmYsIHNpZ19iZiwgbmV4dCwgdG1wbGVuLCBwa3RsZW47CisJc3RydWN0IHdsMzUwMV9tZF9yZXEgc2lnID0geworCQkuc2lnX2lkID0gV0wzNTAxX1NJR19NRF9SRVEsCisJfTsKKwl1OCAqcGRhdGEgPSAoY2hhciAqKWRhdGE7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQlzaWdfYmYgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFzaWdfYmYpCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJZ290byBvdXQ7CisJCWJmID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgbGVuICsgMjYgKyAyNCk7CisJCWlmICghYmYpIHsKKwkJCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIHNpZ19iZik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IDA7CisJCW1lbWNweSgmc2lnLmRhZGRyWzBdLCBwZGF0YSwgMTIpOworCQlwa3RsZW4gPSBsZW4gLSAxMjsKKwkJcGRhdGEgKz0gMTI7CisJCXNpZy5kYXRhID0gYmY7CisJCWlmICgoKCpwZGF0YSkgKiAyNTYgKyAoKihwZGF0YSArIDEpKSkgPiAxNTAwKSB7CisJCQl1OCBhZGRyNFtFVEhfQUxFTl0gPSB7CisJCQkJWzBdID0gMHhBQSwgWzFdID0gMHhBQSwgWzJdID0gMHgwMywgWzRdID0gMHgwMCwKKwkJCX07CisKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBhZGRyNCwgc2l6ZW9mKGFkZHI0KSk7CisJCQlzaWcuc2l6ZSA9IHBrdGxlbiArIDI0ICsgNCArIDY7CisJCQlpZiAocGt0bGVuID4gKDI1NCAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkcikpKSB7CisJCQkJdG1wbGVuID0gMjU0IC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKTsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsCisJCQkJCSAgYmYgKyAyICsgc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9IGVsc2UgeworCQkJc2lnLnNpemUgPSBwa3RsZW4gKyAyNCArIDQgLSAyOworCQkJcGRhdGEgKz0gMjsKKwkJCXBrdGxlbiAtPSAyOworCQkJaWYgKHBrdGxlbiA+ICgyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNikpIHsKKwkJCQl0bXBsZW4gPSAyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNjsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdoaWxlIChwa3RsZW4gPiAwKSB7CisJCQlpZiAocGt0bGVuID4gMjU0KSB7CisJCQkJdG1wbGVuID0gMjU0OworCQkJCXBrdGxlbiAtPSAyNTQ7CisJCQl9IGVsc2UgeworCQkJCXRtcGxlbiA9IHBrdGxlbjsKKwkJCQlwa3RsZW4gPSAwOworCQkJfQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgYmYgKyAyLCBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHNpZ19iZiwgJnNpZywgc2l6ZW9mKHNpZykpOworCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnNpZ19iZik7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9yZXN5bmMoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfcmVzeW5jX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQgPSBXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJfTsKKworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2wzNTAxX2Z3X2Jzc190eXBlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlyZXR1cm4gdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSA/IFdMMzUwMV9ORVRfVFlQRV9JTkZSQSA6CisJCQkJCQkgV0wzNTAxX05FVF9UWVBFX0FESE9DOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bDM1MDFfZndfY2FwX2luZm8oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXJldHVybiB0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0lORlJBID8gV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9FU1MgOgorCQkJCQkJIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfSUJTUzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9zY2FuKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGNoYW5fdGltZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1NDQU5fUkVRLAorCQkuc2Nhbl90eXBlCT0gV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJCS5wcm9iZV9kZWxheQk9IDB4MTAsCisJCS5taW5fY2hhbl90aW1lCT0gY2hhbl90aW1lLAorCQkubWF4X2NoYW5fdGltZQk9IGNoYW5fdGltZSwKKwkJLmJzc190eXBlCT0gd2wzNTAxX2Z3X2Jzc190eXBlKHRoaXMpLAorCX07CisKKwl0aGlzLT5ic3NfY250ID0gdGhpcy0+am9pbl9zdGFfYnNzID0gMDsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfam9pbihzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBzdGFzKQoreworCXN0cnVjdCB3bDM1MDFfam9pbl9yZXEgc2lnID0geworCQkuc2lnX2lkCQkgID0gV0wzNTAxX1NJR19KT0lOX1JFUSwKKwkJLnRpbWVvdXQJICA9IDEwLAorCQkuZHNfcHNldCA9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQgID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfRFNfUEFSQU1FVEVSX1NFVCwKKwkJCQkubGVuID0gMSwKKwkJCX0sCisJCQkuY2hhbgk9IHRoaXMtPmNoYW4sCisJCX0sCisJfTsKKworCW1lbWNweSgmc2lnLmJlYWNvbl9wZXJpb2QsICZ0aGlzLT5ic3Nfc2V0W3N0YXNdLmJlYWNvbl9wZXJpb2QsIDcyKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfc3RhcnQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJCT0gV0wzNTAxX1NJR19TVEFSVF9SRVEsCisJCS5iZWFjb25fcGVyaW9kCQk9IDQwMCwKKwkJLmR0aW1fcGVyaW9kCQk9IDEsCisJCS5kc19wc2V0ID0geworCQkJLmVsID0geworCQkJCS5pZCAgPSBJV19NR01UX0lORk9fRUxFTUVOVF9EU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gPSAxLAorCQkJfSwKKwkJCS5jaGFuCT0gdGhpcy0+Y2hhbiwKKwkJfSwKKwkJLmJzc19iYXNpY19yc2V0CT0geworCQkJLmVsID0geworCQkJCS5pZAk9IElXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwkJCQkubGVuID0gMiwKKwkJCX0sCisJCQkuZGF0YV9yYXRlX2xhYmVscyA9IHsKKwkJCQlbMF0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQsCisJCQkJWzFdID0gSVdfTUdNVF9SQVRFX0xBQkVMX01BTkRBVE9SWSB8CisJCQkJICAgICAgSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklULAorCQkJfSwKKwkJfSwKKwkJLm9wZXJhdGlvbmFsX3JzZXQJPSB7CisJCQkuZWwgPSB7CisJCQkJLmlkCT0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1VQUE9SVEVEX1JBVEVTLAorCQkJCS5sZW4gPSAyLAorCQkJfSwKKwkJCS5kYXRhX3JhdGVfbGFiZWxzID0geworCQkJCVswXSA9IElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgfAorCQkJCSAgICAgIElXX01HTVRfUkFURV9MQUJFTF8xTUJJVCwKKwkJCQlbMV0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMk1CSVQsCisJCQl9LAorCQl9LAorCQkuaWJzc19wc2V0CQk9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQJID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gICAgID0gMiwKKwkJCX0sCisJCQkuYXRpbV93aW5kb3cgPSAxMCwKKwkJfSwKKwkJLmJzc190eXBlCQk9IHdsMzUwMV9md19ic3NfdHlwZSh0aGlzKSwKKwkJLmNhcF9pbmZvCQk9IHdsMzUwMV9md19jYXBfaW5mbyh0aGlzKSwKKwl9OworCisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmc2lnLnNzaWQuZWwsICZ0aGlzLT5lc3NpZC5lbCk7CisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmdGhpcy0+a2VlcF9lc3NpZC5lbCwgJnRoaXMtPmVzc2lkLmVsKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X3NjYW5fY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBhZGRyKQoreworCXUxNiBpID0gMDsKKwlpbnQgbWF0Y2hmbGFnID0gMDsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykgeworCQlkcHJpbnRrKDMsICJzdWNjZXNzIik7CisJCWlmICgodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUykpIHx8CisJCSAgICAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BREhPQyAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0lCU1MpKSB8fAorCQkgICAgdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BVVRPKSB7CisJCQlpZiAoIXRoaXMtPmVzc2lkLmVsLmxlbikKKwkJCQltYXRjaGZsYWcgPSAxOworCQkJZWxzZSBpZiAodGhpcy0+ZXNzaWQuZWwubGVuID09IDMgJiYKKwkJCQkgIW1lbWNtcCh0aGlzLT5lc3NpZC5lc3NpZCwgIkFOWSIsIDMpKQorCQkJCW1hdGNoZmxhZyA9IDE7CisJCQllbHNlIGlmICh0aGlzLT5lc3NpZC5lbC5sZW4gIT0gc2lnLnNzaWQuZWwubGVuKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlIGlmIChtZW1jbXAodGhpcy0+ZXNzaWQuZXNzaWQsIHNpZy5zc2lkLmVzc2lkLAorCQkJCQl0aGlzLT5lc3NpZC5lbC5sZW4pKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlCisJCQkJbWF0Y2hmbGFnID0gMTsKKwkJCWlmIChtYXRjaGZsYWcpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy0+YnNzX2NudDsgaSsrKSB7CisJCQkJCWlmICghbWVtY21wKHRoaXMtPmJzc19zZXRbaV0uYnNzaWQsCisJCQkJCQkgICAgc2lnLmJzc2lkLCBFVEhfQUxFTikpIHsKKwkJCQkJCW1hdGNoZmxhZyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaGZsYWcgJiYgKGkgPCAyMCkpIHsKKwkJCQltZW1jcHkoJnRoaXMtPmJzc19zZXRbaV0uYmVhY29uX3BlcmlvZCwKKwkJCQkgICAgICAgJnNpZy5iZWFjb25fcGVyaW9kLCA3Myk7CisJCQkJdGhpcy0+YnNzX2NudCsrOworCQkJCXRoaXMtPnJzc2kgPSBzaWcucnNzaTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1RJTUVPVVQpIHsKKwkJZHByaW50aygzLCAidGltZW91dCIpOworCQl0aGlzLT5qb2luX3N0YV9ic3MgPSAwOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiB3bDM1MDFfYmxvY2tfaW50ZXJydXB0IC0gTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTy4gKGkuZS4gU1VUUk8gY2Fubm90IGludGVycnVwdCB0aGUgSE9TVCkKKyAqIFJldHVybjogMSBpZiBpbnRlcnJ1cHQgaXMgb3JpZ2luYWxseSBlbmFibGVkCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2Jsb2NrX2ludGVycnVwdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggb2xkID0gaW5iKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl1OCBuZXcgPSBvbGQgJiAofihXTDM1MDFfR0NSX0VDSU5UIHwgV0wzNTAxX0dDUl9JTlQyRUMgfAorCQkJV0wzNTAxX0dDUl9FTkVDSU5UKSk7CisKKwl3bDM1MDFfb3V0YihuZXcsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwlyZXR1cm4gb2xkICYgV0wzNTAxX0dDUl9FTkVDSU5UOworfQorCisvKioKKyAqIHdsMzUwMV91bmJsb2NrX2ludGVycnVwdCAtIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogRW5hYmxlIGludGVycnVwdCBmcm9tIFNVVFJPLiAoaS5lLiBTVVRSTyBjYW4gaW50ZXJydXB0IHRoZSBIT1NUKQorICogUmV0dXJuOiAxIGlmIGludGVycnVwdCBpcyBvcmlnaW5hbGx5IGVuYWJsZWQKKyAqLworc3RhdGljIGludCB3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IG9sZCA9IGluYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisJdTggbmV3ID0gKG9sZCAmIH4oV0wzNTAxX0dDUl9FQ0lOVCB8IFdMMzUwMV9HQ1JfSU5UMkVDKSkgfAorCQkgIFdMMzUwMV9HQ1JfRU5FQ0lOVDsKKworCXdsMzUwMV9vdXRiKG5ldywgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXJldHVybiBvbGQgJiBXTDM1MDFfR0NSX0VORUNJTlQ7Cit9CisKKy8qKgorICogd2wzNTAxX3JlY2VpdmUgLSBSZWNlaXZlIGRhdGEgZnJvbSBSZWNlaXZlIFF1ZXVlLgorICoKKyAqIFJlY2VpdmUgZGF0YSBmcm9tIFJlY2VpdmUgUXVldWUuCisgKgorICogQHRoaXM6IGNhcmQKKyAqIEBiZjogYWRkcmVzcyBvZiBob3N0CisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIuCisgKi8KK3N0YXRpYyB1MTYgd2wzNTAxX3JlY2VpdmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqYmYsIHUxNiBzaXplKQoreworCXUxNiBuZXh0X2FkZHIsIG5leHRfYWRkcjE7CisJdTggKmRhdGEgPSBiZiArIDEyOworCisJc2l6ZSAtPSAxMjsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPnN0YXJ0X3NlZyArIDIsCisJCQkgICAgJm5leHRfYWRkciwgc2l6ZW9mKG5leHRfYWRkcikpOworCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSkgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksIGRhdGEsCisJCQkJICAgIFdMMzUwMV9CTEtTWiAtCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcikpOworCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcik7CisJCWRhdGEgKz0gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKTsKKwl9IGVsc2UgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksCisJCQkJICAgIGRhdGEsIHNpemUpOworCQlzaXplID0gMDsKKwl9CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gNSkgeworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBuZXh0X2FkZHIgKyA1LCBkYXRhLAorCQkJCQkgICAgV0wzNTAxX0JMS1NaIC0gNSk7CisJCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIDU7CisJCQlkYXRhICs9IFdMMzUwMV9CTEtTWiAtIDU7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDIsICZuZXh0X2FkZHIxLAorCQkJCQkgICAgc2l6ZW9mKG5leHRfYWRkcjEpKTsKKwkJCW5leHRfYWRkciA9IG5leHRfYWRkcjE7CisJCX0gZWxzZSB7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDUsIGRhdGEsIHNpemUpOworCQkJc2l6ZSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcV9mcmVlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisJdTE2IGFkZHI7CisKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA9PSB0aGlzLT5lc2JxX3JlcV90YWlsKQorCQlnb3RvIG91dDsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX3RhaWwgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJaWYgKCEodG1wICYgMHg4MCkpCisJCWdvdG8gb3V0OworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfdGFpbCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIGFkZHIpOworCXRoaXMtPmVzYnFfcmVxX3RhaWwgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfdGFpbCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX3RhaWwgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2VzYnFfY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggdG1wOworCisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT5lc2JxX2NvbmZpcm0gKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9vbmxpbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MgTEFOIG9ubGluZS4gQlNTSUQ6ICIKKwkgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHRoaXMtPmJzc2lkWzBdLCB0aGlzLT5ic3NpZFsxXSwgdGhpcy0+YnNzaWRbMl0sCisJICAgICAgIHRoaXMtPmJzc2lkWzNdLCB0aGlzLT5ic3NpZFs0XSwgdGhpcy0+YnNzaWRbNV0pOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2VzYnFfY29uZmlybV9kb25lKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtICsgMywgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfY29uZmlybSArPSA0OworCWlmICh0aGlzLT5lc2JxX2NvbmZpcm0gPj0gdGhpcy0+ZXNicV9jb25maXJtX2VuZCkKKwkJdGhpcy0+ZXNicV9jb25maXJtID0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworfQorCitzdGF0aWMgaW50IHdsMzUwMV9tZ210X2F1dGgoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9yZXEgc2lnID0geworCQkuc2lnX2lkCSA9IFdMMzUwMV9TSUdfQVVUSF9SRVEsCisJCS50eXBlCSA9IFdMMzUwMV9TWVNfVFlQRV9PUEVOLAorCQkudGltZW91dCA9IDEwMDAsCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfYXNzb2NpYXRpb24oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXNzb2NfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJID0gV0wzNTAxX1NJR19BU1NPQ19SRVEsCisJCS50aW1lb3V0CSA9IDEwMDAsCisJCS5saXN0ZW5faW50ZXJ2YWwgPSA1LAorCQkuY2FwX2luZm8JID0gdGhpcy0+Y2FwX2luZm8sCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X2pvaW5fY29uZmlybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IHdsMzUwMV9qb2luX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPCB0aGlzLT5ic3NfY250KSB7CisJCQkJY29uc3QgaW50IGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7CisJCQkJbWVtY3B5KHRoaXMtPmJzc2lkLAorCQkJCSAgICAgICB0aGlzLT5ic3Nfc2V0W2ldLmJzc2lkLCBFVEhfQUxFTik7CisJCQkJdGhpcy0+Y2hhbiA9IHRoaXMtPmJzc19zZXRbaV0uZHNfcHNldC5jaGFuOworCQkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICAgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJCXdsMzUwMV9tZ210X2F1dGgodGhpcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb25zdCBpbnQgaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsKKworCQkJbWVtY3B5KCZ0aGlzLT5ic3NpZCwgJnRoaXMtPmJzc19zZXRbaV0uYnNzaWQsIEVUSF9BTEVOKTsKKwkJCXRoaXMtPmNoYW4gPSB0aGlzLT5ic3Nfc2V0W2ldLmRzX3BzZXQuY2hhbjsKKwkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJd2wzNTAxX29ubGluZShkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXRoaXMtPmpvaW5fc3RhX2JzcysrOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hbGFybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2lyZWxlc3MgTEFOIG9mZmxpbmVcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdsMzUwMV9tZ210X3Jlc3luYyh0aGlzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJICAgICAgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfbWRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCXdsMzUwMV9mcmVlX3R4X2J1ZmZlcih0aGlzLCBzaWcuZGF0YSk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX21kX2luZCBzaWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCByc3NpLCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IHBrdF9sZW47CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwl0aGlzLT5zdGFydF9zZWcgPSBzaWcuZGF0YTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkgICAgc2lnLmRhdGEgKyBvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciwgcnNzaSksCisJCQkgICAgJnJzc2ksIHNpemVvZihyc3NpKSk7CisJdGhpcy0+cnNzaSA9IHJzc2kgPD0gNjMgPyAocnNzaSAqIDEwMCkgLyA2NCA6IDI1NTsKKworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCSAgICBzaWcuZGF0YSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV9yeF9oZHIsIGFkZHI0KSwKKwkJCSAgICAmYWRkcjQsIHNpemVvZihhZGRyNCkpOworCWlmICghKGFkZHI0WzBdID09IDB4QUEgJiYgYWRkcjRbMV0gPT0gMHhBQSAmJgorCSAgICAgIGFkZHI0WzJdID09IDB4MDMgJiYgYWRkcjRbNF0gPT0gMHgwMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdXBwb3J0ZWQgcGFja2V0IHR5cGUhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwa3RfbGVuID0gc2lnLnNpemUgKyAxMiAtIDI0IC0gNCAtIDY7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1KTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvYyBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQl0aGlzLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZXMgYm91bmRhcmllcyAqLworCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikmc2lnLmRhZGRyLCAxMiwgMCk7CisJCXdsMzUwMV9yZWNlaXZlKHRoaXMsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJc2tiLT5wcm90b2NvbAk9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJZGV2LT5sYXN0X3J4CT0gamlmZmllczsKKwkJdGhpcy0+c3RhdHMucnhfcGFja2V0cysrOworCQl0aGlzLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJCXUxNiBhZGRyLCB2b2lkICpzaWcsIGludCBzaXplKQoreworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmdGhpcy0+c2lnX2dldF9jb25maXJtLAorCQkJICAgIHNpemVvZih0aGlzLT5zaWdfZ2V0X2NvbmZpcm0pKTsKKwl3YWtlX3VwKCZ0aGlzLT53YWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9zdGFydF9jb25maXJtX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2Fzc29jX2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJd2wzNTAxX29ubGluZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2F1dGhfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLAorCQkJCQkJIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpCisJCXdsMzUwMV9tZ210X2Fzc29jaWF0aW9uKHRoaXMpOworCWVsc2UKKwkJd2wzNTAxX21nbXRfcmVzeW5jKHRoaXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX3J4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBtb3JlcGt0czsKKwl1MTYgYWRkcjsKKwl1OCBzaWdfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJZHByaW50aygzLCAiZW50cnkiKTsKK2xvb3A6CisJbW9yZXBrdHMgPSAwOworCWlmICghd2wzNTAxX2VzYnFfY29uZmlybSh0aGlzKSkKKwkJZ290byBmcmVlOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIgKyAyLCAmc2lnX2lkLCBzaXplb2Yoc2lnX2lkKSk7CisKKwlzd2l0Y2ggKHNpZ19pZCkgeworCWNhc2UgV0wzNTAxX1NJR19ERUFVVEhfSU5EOgorCWNhc2UgV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQ6CisJY2FzZSBXTDM1MDFfU0lHX0FMQVJNOgorCQl3bDM1MDFfYWxhcm1faW50ZXJydXB0KGRldiwgdGhpcyk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19NRF9DT05GSVJNOgorCQl3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX01EX0lORDoKKwkJd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0dFVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19nZXRfY29uZmlybSwKKwkJCQkJICAgICBzaXplb2YodGhpcy0+c2lnX2dldF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19QV1JfTUdNVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLAorCQkJCQkgICAgc2l6ZW9mKHRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19TVEFSVF9DT05GSVJNOgorCQl3bDM1MDFfc3RhcnRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1NDQU5fQ09ORklSTToKKwkJd2wzNTAxX21nbXRfc2Nhbl9jb25maXJtKHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfSk9JTl9DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9qb2luX2NvbmZpcm0oZGV2LCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk06CisJCXdsMzUwMV9hc3NvY19jb25maXJtX2ludGVycnVwdChkZXYsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfQVVUSF9DT05GSVJNOgorCQl3bDM1MDFfYXV0aF9jb25maXJtX2ludGVycnVwdCh0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9yZXN5bmModGhpcyk7IC8qIEZJWE1FOiBzaG91bGQgYmUgcmVzeW5jX2NvbmZpcm0gKi8KKwkJYnJlYWs7CisJfQorCXdsMzUwMV9lc2JxX2NvbmZpcm1fZG9uZSh0aGlzKTsKKwltb3JlcGt0cyA9IDE7CisJLyogZnJlZSByZXF1ZXN0IGlmIG5lY2Vzc2FyeSAqLworZnJlZToKKwl3bDM1MDFfZXNicV9yZXFfZnJlZSh0aGlzKTsKKwlpZiAobW9yZXBrdHMpCisJCWdvdG8gbG9vcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hY2tfaW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl3bDM1MDFfb3V0YihXTDM1MDFfR0NSX0VDSU5ULCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7Cit9CisKKy8qKgorICogd2wzNTAxX2ludGVycnVwdCAtIEhhcmR3YXJlIGludGVycnVwdCBmcm9tIGNhcmQuCisgKiBAaXJxIC0gSW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZCAtIG5ldF9kZXZpY2UKKyAqIEByZWdzIC0gcmVnaXN0ZXJzCisgKgorICogV2UgbXVzdCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBibG9jayB0aGUKKyAqIGludGVycnVwdCBmcm9tIHRoZSBzYW1lIGNhcmQgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByZS1lbnRyeS4KKyAqCisgKiBCZWZvcmUgYWNjZXNzaW5nIHRoZSBDb250cm9sX1N0YXR1c19CbG9jaywgd2UgbXVzdCBsb2NrIFNVVFJPIGZpcnN0LgorICogT24gdGhlIG90aGVyIGhhbmQsIHRvIHByZXZlbnQgU1VUUk8gZnJvbSBtYWxmdW5jdGlvbmluZywgd2UgbXVzdAorICogdW5sb2NrIHRoZSBTVVRSTyBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2wzNTAxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzOworCWludCBoYW5kbGVkID0gMTsKKworCWlmICghZGV2KQorCQlnb3RvIHVua25vd247CisJdGhpcyA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2soJnRoaXMtPmxvY2spOworCXdsMzUwMV9hY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3J4X2ludGVycnVwdChkZXYpOworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlzcGluX3VubG9jaygmdGhpcy0+bG9jayk7CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit1bmtub3duOgorCWhhbmRsZWQgPSAwOworCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3Jlc2V0X2JvYXJkKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCWludCBpLCByYyA9IDA7CisKKwkvKiBDb3Jlc2V0ICovCisJd2wzNTAxX291dGJfcChXTDM1MDFfR0NSX0NPUkVTRVQsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKDAsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKFdMMzUwMV9HQ1JfQ09SRVNFVCwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCisJLyogUmVzZXQgU1JBTSAweDQ4MCB0byB6ZXJvICovCisJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKworCS8qIFN0YXJ0IHVwICovCisJd2wzNTAxX291dGJfcCgwLCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisKKwlXTDM1MDFfTk9QTE9PUCgxMDI0ICogNTApOworCisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOwkvKiBhY21lOiB3YXMgY29tbWVudGVkICovCisKKwkvKiBQb2xsaW5nIFNlbGZfVGVzdF9TdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDgwLCAmdG1wLCBzaXplb2YodG1wKSk7CisKKwkJaWYgKHRtcCA9PSAnVycpIHsKKwkJCS8qIGZpcm13YXJlIGNvbXBsZXRlIGFsbCB0ZXN0IHN1Y2Nlc3NmdWxseSAqLworCQkJdG1wID0gJ0EnOworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCVdMMzUwMV9OT1BMT09QKDEwKTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZXNldCB0aGUgYm9hcmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCXJjID0gLUVOT0RFVjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2luaXRfZmlybXdhcmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXUxNiBwdHIsIG5leHQ7CisJaW50IHJjID0gd2wzNTAxX3Jlc2V0X2JvYXJkKHRoaXMpOworCisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisJdGhpcy0+Y2FyZF9uYW1lWzBdID0gJ1wwJzsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4MWEwMCwKKwkJCSAgICB0aGlzLT5jYXJkX25hbWUsIHNpemVvZih0aGlzLT5jYXJkX25hbWUpKTsKKwl0aGlzLT5jYXJkX25hbWVbc2l6ZW9mKHRoaXMtPmNhcmRfbmFtZSkgLSAxXSA9ICdcMCc7CisJdGhpcy0+ZmlybXdhcmVfZGF0ZVswXSA9ICdcMCc7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDFhNDAsCisJCQkgICAgdGhpcy0+ZmlybXdhcmVfZGF0ZSwgc2l6ZW9mKHRoaXMtPmZpcm13YXJlX2RhdGUpKTsKKwl0aGlzLT5maXJtd2FyZV9kYXRlW3NpemVvZih0aGlzLT5maXJtd2FyZV9kYXRlKSAtIDFdID0gJ1wwJzsKKwkvKiBTd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIFJlYWQgcGFyYW1ldGVyIGZyb20gY2FyZCAqLworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0ODIsICZ0aGlzLT5lc2JxX3JlcV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4NiwgJnRoaXMtPmVzYnFfcmVxX2VuZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4OCwgJnRoaXMtPmVzYnFfY29uZmlybV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4YywgJnRoaXMtPmVzYnFfY29uZmlybV9lbmQsIDIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0OGUsICZ0aGlzLT50eF9idWZmZXJfaGVhZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ5MiwgJnRoaXMtPnR4X2J1ZmZlcl9zaXplLCAyKTsKKwl0aGlzLT5lc2JxX3JlcV90YWlsCT0gdGhpcy0+ZXNicV9yZXFfaGVhZCA9IHRoaXMtPmVzYnFfcmVxX3N0YXJ0OworCXRoaXMtPmVzYnFfcmVxX2VuZCAgICAgKz0gdGhpcy0+ZXNicV9yZXFfc3RhcnQ7CisJdGhpcy0+ZXNicV9jb25maXJtCT0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCXRoaXMtPmVzYnFfY29uZmlybV9lbmQgKz0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCS8qIEluaXRpYWwgVHggQnVmZmVyICovCisJdGhpcy0+dHhfYnVmZmVyX2NudCA9IDE7CisJcHRyID0gdGhpcy0+dHhfYnVmZmVyX2hlYWQ7CisJbmV4dCA9IHB0ciArIFdMMzUwMV9CTEtTWjsKKwl3aGlsZSAoKG5leHQgLSB0aGlzLT50eF9idWZmZXJfaGVhZCkgPCB0aGlzLT50eF9idWZmZXJfc2l6ZSkgeworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCXB0ciA9IG5leHQ7CisJCW5leHQgPSBwdHIgKyBXTDM1MDFfQkxLU1o7CisJfQorCXJjID0gMDsKKwluZXh0ID0gMDsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsICZuZXh0LCBzaXplb2YobmV4dCkpOworCXRoaXMtPnR4X2J1ZmZlcl90YWlsID0gcHRyOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkZXZfbGlua190ICpsaW5rOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGluIHdsMzUwMV9kZXZfbGlzdCAqLworCWZvciAobGluayA9IHdsMzUwMV9kZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisJCWlmIChsaW5rLT5wcml2ID09IGRldikKKwkJCWJyZWFrOworCWlmICghbGluaykKKwkJZ290byBvdXQ7CisJbGluay0+b3Blbi0tOworCisJLyogU3RvcCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KCkgZnJvbSBub3cgb24gKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisKKwkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgU1VUUk8gKi8KKwl3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCisJcmMgPSAwOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBXTDM1MDEgY2xvc2VkXG4iLCBkZXYtPm5hbWUpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3Jlc2V0IC0gUmVzZXQgdGhlIFNVVFJPLgorICogQGRldiAtIG5ldHdvcmsgZGV2aWNlCisgKgorICogSXQgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHdsMzUwMV9vcGVuKCkuIEluIGZhY3QsIHdlIG1heSBqdXN0IHdsMzUwMV9jbG9zZSgpCisgKiBhbmQgd2wzNTAxX29wZW4oKSBhZ2FpbiwgYnV0IEkgd291bGRuJ3QgbGlrZSB0byBmcmVlX2lycSgpIHdoZW4gdGhlIGRyaXZlcgorICogaXMgcnVubmluZy4gSXQgc2VlbXMgdG8gYmUgZGFuZ2Vyb3VzLgorICovCitzdGF0aWMgaW50IHdsMzUwMV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKworCWlmICh3bDM1MDFfaW5pdF9maXJtd2FyZSh0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBGaXJtd2FyZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBGcmVlIElSUSwgYW5kIG1hcmsgSVJRIGFzIHVudXNlZCAqLworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBRdWV1ZSBoYXMgdG8gYmUgc3RhcnRlZCBvbmx5IHdoZW4gdGhlIENhcmQgaXMgU3RhcnRlZAorCSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl0aGlzLT5hZGhvY190aW1lcyA9IDA7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwlkcHJpbnRrKDEsICIlczogZGV2aWNlIHJlc2V0IiwgZGV2LT5uYW1lKTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB3bDM1MDFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdGhpcy0+c3RhdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc2V0dGluZyBjYXJkIG9uIFR4IHRpbWVvdXQhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJZWxzZSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisvKgorICogUmV0dXJuIDogMCAtIE9LCisgKgkgICAgMSAtIENvdWxkIG5vdCB0cmFuc21pdCAoZGV2X3F1ZXVlX3htaXQgd2lsbCBxdWV1ZSBpdCkKKyAqCQlhbmQgdHJ5IHRvIHNlbnQgaXQgbGF0ZXIKKyAqLworc3RhdGljIGludCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVuYWJsZWQsIHJjOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwllbmFibGVkID0gd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyYyA9IHdsMzUwMV9zZW5kX3BrdCh0aGlzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoZW5hYmxlZCkKKwkJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCWlmIChyYykgeworCQkrK3RoaXMtPnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCQkrK3RoaXMtPnN0YXRzLnR4X3BhY2tldHM7CisJCXRoaXMtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlrZnJlZV9za2Ioc2tiKTsKKworCQlpZiAodGhpcy0+dHhfYnVmZmVyX2NudCA8IDIpCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRldl9saW5rX3QgKmxpbms7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgaW4gd2wzNTAxX2Rldl9saXN0ICovCisJZm9yIChsaW5rID0gd2wzNTAxX2Rldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKwkJaWYgKGxpbmstPnByaXYgPT0gZGV2KQorCQkJYnJlYWs7CisJaWYgKCFERVZfT0sobGluaykpCisJCWdvdG8gb3V0OworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlsaW5rLT5vcGVuKys7CisKKwkvKiBJbml0aWFsIFdMMzUwMSBmaXJtd2FyZSAqLworCWRwcmludGsoMSwgIiVzOiBJbml0aWFsaXplIFdMMzUwMSBmaXJtd2FyZS4uLiIsIGRldi0+bmFtZSk7CisJaWYgKHdsMzUwMV9pbml0X2Zpcm13YXJlKHRoaXMpKQorCQlnb3RvIGZhaWw7CisJLyogSW5pdGlhbCBkZXZpY2UgdmFyaWFibGVzICovCisJdGhpcy0+YWRob2NfdGltZXMgPSAwOworCS8qIEFja25vd2xlZGdlIEludGVycnVwdCwgZm9yIGNsZWFuaW5nIGxhc3Qgc3RhdGUgKi8KKwl3bDM1MDFfYWNrX2ludGVycnVwdCh0aGlzKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBjYXJkIGFmdGVyIGFsbCAqLworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwl3bDM1MDFfbWdtdF9zY2FuKHRoaXMsIDEwMCk7CisJcmMgPSAwOworCWRwcmludGsoMSwgIiVzOiBXTDM1MDEgb3BlbmVkIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBOYW1lOiAlc1xuIgorCQkJICIlczogRmlybXdhcmUgRGF0ZTogJXNcbiIsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5jYXJkX25hbWUsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5maXJtd2FyZV9kYXRlKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBmaXJtd2FyZSFcbiIsIGRldi0+bmFtZSk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bDM1MDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJcmV0dXJuICZ0aGlzLT5zdGF0czsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKndsMzUwMV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZ0aGlzLT53c3RhdHM7CisJdTMyIHZhbHVlOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUzMiAqLworCisJbWVtc2V0KHdzdGF0cywgMCwgc2l6ZW9mKCp3c3RhdHMpKTsKKwl3c3RhdHMtPnN0YXR1cyA9IG5ldGlmX3J1bm5pbmcoZGV2KTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfSUNWX0VSUk9SX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfV0VQX1VOREVDUllQVEFCTEVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9SRVRSWV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzCT0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9BQ0tfRkFJTFVSRV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0ZSQU1FX0RVUExJQ0FURV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCXJldHVybiB3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCB3bDM1MDFfZGV2X2luZm8sIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gd2wzNTAxX2dldF9kcnZpbmZvCit9OworCisvKioKKyAqIHdsMzUwMV9kZXRhY2ggLSBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIKKyAqIEBsaW5rIC0gRklMTF9JTgorICoKKyAqIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiBTZXJ2aWNlcy4gSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGZyZWVkLgorICogT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZ3bDM1MDFfZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCWlmICghKmxpbmtwKQorCQlnb3RvIG91dDsKKworCS8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QgYWN0dWFsbHkKKwkgKiBkZWxldGUgaXQgeWV0LiAgSW5zdGVhZCwgaXQgaXMgbWFya2VkIHNvIHRoYXQgd2hlbiB0aGUgcmVsZWFzZSgpCisJICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlciBkZXRhY2goKS4gKi8KKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIndsMzUwMV9jczogZGV0YWNoIHBvc3Rwb25lZCwgJyVzJyAiCisJCSAgICAgICAic3RpbGwgbG9ja2VkXG4iLCBsaW5rLT5kZXYtPmRldl9uYW1lKTsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisKKwlpZiAobGluay0+cHJpdikKKwkJZnJlZV9uZXRkZXYobGluay0+cHJpdik7CisJa2ZyZWUobGluayk7CitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RybGNweSh3cnF1LT5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiLCBzaXplb2Yod3JxdS0+bmFtZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gd3JxdS0+ZnJlcS5tOworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoaXdfdmFsaWRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluLCBjaGFubmVsKSkgeworCQl0aGlzLT5jaGFuID0gY2hhbm5lbDsKKwkJcmMgPSB3bDM1MDFfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJd3JxdS0+ZnJlcS5tID0gd2wzNTAxX2NoYW4yZnJlcVt0aGlzLT5jaGFuIC0gMV0gKiAxMDAwMDA7CisJd3JxdS0+ZnJlcS5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX0lORlJBIHx8CisJICAgIHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCSAgICB3cnF1LT5tb2RlID09IElXX01PREVfQVVUTykgeworCQlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwkJdGhpcy0+bmV0X3R5cGUgPSB3cnF1LT5tb2RlOworCQlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5tb2RlID0gdGhpcy0+bmV0X3R5cGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5zZW5zLnZhbHVlID0gdGhpcy0+cnNzaTsKKwl3cnF1LT5zZW5zLmRpc2FibGVkID0gIXdycXUtPnNlbnMudmFsdWU7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZAk9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UJPSAxOworCXJhbmdlLT50aHJvdWdocHV0CQk9IDIgKiAxMDAwICogMTAwMDsgICAgIC8qIH4yIE1iL3MgKi8KKwkvKiBGSVhNRTogc3R1ZHkgdGhlIGNvZGUgdG8gZmlsbCBpbiBtb3JlIGZpZWxkcy4uLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdGF0aWMgY29uc3QgdTggYmNhc3RbRVRIX0FMRU5dID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEZJWE1FOiB3ZSBzdXBwb3J0IG90aGVyIEFSUEhSRHMuLi4qLworCWlmICh3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCWdvdG8gb3V0OworCWlmICghbWVtY21wKGJjYXN0LCB3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQkvKiBGSVhNRTogcmVzY2FuPyAqLworCX0gZWxzZQorCQltZW1jcHkodGhpcy0+YnNzaWQsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCQkvKiBGSVhNRTogcmVzY2FuPyBkZWFzc29jICYgc2Nhbj8gKi8KKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHRoaXMtPmJzc2lkLCBFVEhfQUxFTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiB0cmlnZ2VyIHNjYW5uaW5nIHdpdGggYSByZXNldCwgeWVzLCBJJ20gbGF6eQorCSAqLworCXJldHVybiB3bDM1MDFfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWZvciAoaSA9IDA7IGkgPCB0aGlzLT5ic3NfY250OyArK2kpIHsKKwkJaXdlLmNtZAkJCT0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgdGhpcy0+YnNzX3NldFtpXS5ic3NpZCwgRVRIX0FMRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9BRERSX0xFTik7CisJCWl3ZS5jbWQJCSAgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgID0gMTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwubGVuOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLAorCQkJCQkJICB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZXNzaWQpOworCQlpd2UuY21kCSAgID0gU0lPQ0dJV01PREU7CisJCWl3ZS51Lm1vZGUgPSB0aGlzLT5ic3Nfc2V0W2ldLmJzc190eXBlOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaXdlLnUuZnJlcS5tID0gdGhpcy0+YnNzX3NldFtpXS5kc19wc2V0LmNoYW47CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmICh0aGlzLT5ic3Nfc2V0W2ldLmNhcF9pbmZvICYgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9QUklWQUNZKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIE5VTEwpOworCX0KKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJd3JxdS0+ZGF0YS5mbGFncyA9IDA7IC8qIEZJWE1FOiBzZXQgcHJvcGVybHkgdGhlc2UgZmxhZ3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5mbGFncykgeworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwKKwkJCQkJIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJfSBlbHNlIHsgLyogV2UgYWNjZXB0IGFueSBFU1NJRCAqLworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwgIkFOWSIsIDMpOworCX0KKwlyZXR1cm4gd2wzNTAxX3Jlc2V0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXdycXUtPmVzc2lkLmZsYWdzICA9IDE7CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gdGhpcy0+ZXNzaWQuZWwubGVuOworCW1lbWNweShleHRyYSwgdGhpcy0+ZXNzaWQuZXNzaWQsIHRoaXMtPmVzc2lkLmVsLmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gc2l6ZW9mKHRoaXMtPm5pY2spKQorCQlyZXR1cm4gLUUyQklHOworCXN0cmxjcHkodGhpcy0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXN0cmxjcHkoZXh0cmEsIHRoaXMtPm5pY2ssIDMyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiBoYXZlIHRvIHNlZSBmcm9tIHdoZXJlIHRvIGdldCB0aGlzIGluZm8sIHBlcmhhcHMgdGhpcyBjYXJkCisJICogd29ya3MgYXQgMSBNYml0L3MgdG9vLi4uIGZvciBub3cgbGVhdmUgYXQgMiBNYml0L3MgdGhhdCBpcyB0aGUgbW9zdAorCSAqIGNvbW1vbiB3aXRoIHRoZSBQbGFuZXQgQWNjZXNzIFBvaW50cy4gLWFjbWUKKwkgKi8KKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gMjAwMDAwMDsKKwl3cnF1LT5iaXRyYXRlLmZpeGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTE2IHRocmVzaG9sZDsgLyogc2l6ZSBjaGVja2VkOiBpdCBpcyB1MTYgKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1JUU19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+cnRzLnZhbHVlID0gdGhyZXNob2xkOworCQl3cnF1LT5ydHMuZGlzYWJsZWQgPSB0aHJlc2hvbGQgPj0gMjM0NzsKKwkJd3JxdS0+cnRzLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1MTYgdGhyZXNob2xkOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUxNiAqLworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRlJBR19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+ZnJhZy52YWx1ZSA9IHRocmVzaG9sZDsKKwkJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9IHRocmVzaG9sZCA+PSAyMzQ2OworCQl3cnF1LT5mcmFnLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUxNiB0eHBvdzsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJCQkJICAgICAgJnR4cG93LCBzaXplb2YodHhwb3cpKTsKKwlpZiAoIXJjKSB7CisJCXdycXUtPnR4cG93ZXIudmFsdWUgPSB0eHBvdzsKKwkJd3JxdS0+dHhwb3dlci5kaXNhYmxlZCA9IDA7CisJCS8qCisJCSAqIEZyb20gdGhlIE1JQiB2YWx1ZXMgSSB0aGluayB0aGlzIGNhbiBiZSBjb25maWd1cmFibGUsCisJCSAqIGFzIGl0IGxpc3RzIHNldmVyYWwgdHggcG93ZXIgbGV2ZWxzIC1hY21lCisJCSAqLworCQl3cnF1LT50eHBvd2VyLmZpeGVkID0gMDsKKwkJd3JxdS0+dHhwb3dlci5mbGFncyA9IElXX1RYUE9XX01XQVRUOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcmV0cnk7IC8qIHNpemUgY2hlY2tlZDogaXQgaXMgdTggKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfTE9OR19SRVRSWV9MSU1JVCwKKwkJCQkgICAgICAmcmV0cnksIHNpemVvZihyZXRyeSkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCWdvdG8gc2V0X3ZhbHVlOworCX0KKwlyYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9TSE9SVF9SRVRSWV9MSU1JVCwKKwkJCQkgICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUlOOworc2V0X3ZhbHVlOgorCXdycXUtPnJldHJ5LnZhbHVlID0gcmV0cnk7CisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCBpbXBsZW1lbnRlZCwgcmVzdHJpY3RlZCwga2V5c1sxMDBdLCBsZW5fa2V5cywgdG9jb3B5OworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9QUklWX09QVF9JTVBMRU1FTlRFRCwKKwkJCQkgICAgICAmaW1wbGVtZW50ZWQsIHNpemVvZihpbXBsZW1lbnRlZCkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKCFpbXBsZW1lbnRlZCkgeworCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJCQkJICAmcmVzdHJpY3RlZCwgc2l6ZW9mKHJlc3RyaWN0ZWQpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdycXUtPmVuY29kaW5nLmZsYWdzID0gcmVzdHJpY3RlZCA/IElXX0VOQ09ERV9SRVNUUklDVEVEIDoKKwkJCQkJICAgIElXX0VOQ09ERV9PUEVOOworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1NfTEVOLAorCQkJCSAgJmxlbl9rZXlzLCBzaXplb2YobGVuX2tleXMpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1MsCisJCQkJICBrZXlzLCBsZW5fa2V5cyk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl0b2NvcHkgPSBtaW5fdCh1OCwgbGVuX2tleXMsIHdycXUtPmVuY29kaW5nLmxlbmd0aCk7CisJdG9jb3B5ID0gbWluX3QodTgsIHRvY29weSwgMTAwKTsKKwl3cnF1LT5lbmNvZGluZy5sZW5ndGggPSB0b2NvcHk7CisJbWVtc2V0KGV4dHJhLCAwLCB0b2NvcHkpOworCW1lbWNweShleHRyYSwga2V5cywgdG9jb3B5KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcHdyX3N0YXRlOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1BXUl9TVEFURSwKKwkJCQkgICAgICAmcHdyX3N0YXRlLCBzaXplb2YocHdyX3N0YXRlKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9ICFwd3Jfc3RhdGU7CisJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9PTjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCXdsMzUwMV9oYW5kbGVyW10gPSB7CisJW1NJT0NHSVdOQU1FCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9uYW1lLAorCVtTSU9DU0lXRlJFUQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfZnJlcSwKKwlbU0lPQ0dJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2ZyZXEsCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX3NldF9tb2RlLAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbW9kZSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3NlbnMsCisJW1NJT0NHSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcmFuZ2UsCisJW1NJT0NTSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF9zcHksCisJW1NJT0NHSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF9zcHksCisJW1NJT0NTSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF90aHJzcHksCisJW1NJT0NHSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF90aHJzcHksCisJW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfd2FwLAorCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3dhcCwKKwlbU0lPQ1NJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X3NjYW4sCisJW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9zY2FuLAorCVtTSU9DU0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X2Vzc2lkLAorCVtTSU9DR0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2Vzc2lkLAorCVtTSU9DU0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X25pY2ssCisJW1NJT0NHSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbmljaywKKwlbU0lPQ0dJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3JhdGUsCisJW1NJT0NHSVdSVFMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQsCisJW1NJT0NHSVdGUkFHCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9mcmFnX3RocmVzaG9sZCwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF90eHBvdywKKwlbU0lPQ0dJV1JFVFJZCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9yZXRyeSwKKwlbU0lPQ0dJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfZW5jb2RlLAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bDM1MDFfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3bDM1MDFfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKil3bDM1MDFfaGFuZGxlciwKKwkuc3B5X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfY2FyZCwgc3B5X2RhdGEpLAorfTsKKworLyoqCisgKiB3bDM1MDFfYXR0YWNoIC0gY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIKKyAqCisgKiBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgKiBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgY29uZmlndXJlIHRoZQorICogY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqd2wzNTAxX2F0dGFjaCh2b2lkKQoreworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKwlsaW5rID0ga21hbGxvYyhzaXplb2YoKmxpbmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspCisJCWdvdG8gb3V0OworCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKworCS8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworCWxpbmstPmlvLk51bVBvcnRzMQk9IDE2OworCWxpbmstPmlvLkF0dHJpYnV0ZXMxCT0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+aW8uSU9BZGRyTGluZXMJPSA1OworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMJPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xCT0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gd2wzNTAxX2ludGVycnVwdDsKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMJPSBDT05GX0VOQUJMRV9JUlE7CisJbGluay0+Y29uZi5WY2MJCT0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlCT0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5Db25maWdJbmRleAk9IDE7CisJbGluay0+Y29uZi5QcmVzZW50CT0gUFJFU0VOVF9PUFRJT047CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsMzUwMV9jYXJkKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0X2xpbms7CisJZGV2LT5vcGVuCQk9IHdsMzUwMV9vcGVuOworCWRldi0+c3RvcAkJPSB3bDM1MDFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB3bDM1MDFfaGFyZF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dAkJPSB3bDM1MDFfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOworCWRldi0+Z2V0X3N0YXRzCQk9IHdsMzUwMV9nZXRfc3RhdHM7CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzOworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMJPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsMzUwMV9oYW5kbGVyX2RlZjsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbGluay0+cHJpdiA9IGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQJCSA9IHdsMzUwMV9kZXZfbGlzdDsKKwl3bDM1MDFfZGV2X2xpc3QJCSA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbwkgPSAmd2wzNTAxX2Rldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrCSA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwKKwkJCQkgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJCQkgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwKKwkJCQkgICBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gd2wzNTAxX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0KSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCXdsMzUwMV9kZXRhY2gobGluayk7CisJCWxpbmsgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gbGluazsKK291dF9saW5rOgorCWtmcmVlKGxpbmspOworCWxpbmsgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKKy8qKgorICogd2wzNTAxX2NvbmZpZyAtIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCBhbmQgbWFrZSBldGggZGV2aWNlIGF2YWlsYWJsZQorICogQGxpbmsgLSBGSUxMX0lOCisgKgorICogd2wzNTAxX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcworICogcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQorICogYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlpbnQgaSA9IDAsIGosIGxhc3RfZm4sIGxhc3RfcmV0OworCXVuc2lnbmVkIGNoYXIgYmZbNjRdOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpczsKKworCS8qIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlnIHJlZ2lzdGVycy4gKi8KKwl0dXBsZS5BdHRyaWJ1dGVzCT0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUJPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl0dXBsZS5UdXBsZURhdGEJCT0gYmY7CisJdHVwbGUuVHVwbGVEYXRhTWF4CT0gc2l6ZW9mKGJmKTsKKwl0dXBsZS5UdXBsZU9mZnNldAk9IDA7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZQk9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudAk9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworCS8qIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuICBJZiB5b3UKKwkgKiB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0byBwaWNrIGFkZHJlc3NlcyAtLQorCSAqIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4gKi8KKworCWZvciAoaiA9IDB4MjgwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCQkvKiBUaGUgJ14weDMwMCcgaXMgc28gdGhhdCB3ZSBwcm9iZSAweDMwMC0weDNmZiBmaXJzdCwgdGhlbgorCQkgKiAweDIwMC0weDJmZiwgYW5kIHNvIG9uLCBiZWNhdXNlIHRoaXMgc2VlbXMgc2FmZXIgKi8KKwkJbGluay0+aW8uQmFzZVBvcnQxID0gajsKKwkJbGluay0+aW8uQmFzZVBvcnQyID0gbGluay0+aW8uQmFzZVBvcnQxICsgMHgxMDsKKwkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseQorCSAqIGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4gKi8KKworCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwIHRoZSBJL08KKwkgKiB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuICAqLworCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ3bDM1MDFfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXRoaXMgPSBkZXYtPnByaXY7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFuZAorCSAqIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LgorCSAqLworCWxpbmstPmRldiA9ICZ0aGlzLT5ub2RlOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKwl0aGlzLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmICghd2wzNTAxX2dldF9mbGFzaF9tYWNfYWRkcih0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FudCByZWFkIE1BQyBhZGRyIGluIGZsYXNoIFJPTT9cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJc3RyY3B5KHRoaXMtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKwkvKiBwcmludCBwcm9iZSBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiB3bDM1MDEgQCAweCUzLjN4LCBJUlEgJWQsIE1BQyBhZGRyIGluIGZsYXNoIFJPTToiLAorCSAgICAgICBkZXYtPm5hbWUsIHRoaXMtPmJhc2VfYWRkciwgKGludClkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKChjaGFyICopJnRoaXMtPm1hY19hZGRyKVtpXTsKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCS8qCisJICogSW5pdGlhbGl6ZSBjYXJkIHBhcmFtZXRlcnMgLSBhZGRlZCBieSBqc3MKKwkgKi8KKwl0aGlzLT5uZXRfdHlwZQkJPSBJV19NT0RFX0lORlJBOworCXRoaXMtPmJzc19jbnQJCT0gMDsKKwl0aGlzLT5qb2luX3N0YV9ic3MJPSAwOworCXRoaXMtPmFkaG9jX3RpbWVzCT0gMDsKKwlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwgJnRoaXMtPmVzc2lkLmVsLAorCQkJCSAiQU5ZIiwgMyk7CisJdGhpcy0+Y2FyZF9uYW1lWzBdCT0gJ1wwJzsKKwl0aGlzLT5maXJtd2FyZV9kYXRlWzBdCT0gJ1wwJzsKKwl0aGlzLT5yc3NpCQk9IDI1NTsKKwl0aGlzLT5jaGFuCQk9IGl3X2RlZmF1bHRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluKTsKKwlzdHJsY3B5KHRoaXMtPm5pY2ssICJQbGFuZXQgV0wzNTAxIiwgc2l6ZW9mKHRoaXMtPm5pY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmdGhpcy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpcy0+d2FpdCk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlnb3RvIG91dDsKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKwl3bDM1MDFfcmVsZWFzZShsaW5rKTsKK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2wzNTAxX3JlbGVhc2UgLSB1bnJlZ2lzdGVyIHRoZSBuZXQsIHJlbGVhc2UgUENNQ0lBIGNvbmZpZ3VyYXRpb24KKyAqIEBhcmcgLSBsaW5rCisgKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHdsMzUwMV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlLAorICogYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvcGVuLCB0aGlzCisgKiB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwkvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworCWlmIChsaW5rLT5kZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJbGluay0+ZGV2ID0gTlVMTDsKKwl9CisKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyoqCisgKiB3bDM1MDFfZXZlbnQgLSBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlcgorICogQGV2ZW50IC0gZXZlbnQKKyAqIEBwcmkgLSBwcmlvcml0eQorICogQGFyZ3MgLSBhcmd1bWVudHMgZm9yIHRoaXMgZXZlbnQKKyAqCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlciBzdHVmZiB0byBydW4KKyAqIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiBBIENBUkRfUkVNT1ZBTCBldmVudCBhbHNvIHNldHMgc29tZSBmbGFncyB0bworICogZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAqCisgKiBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYSBmbGFnIHRvIGJsb2NrCisgKiBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZQorICogZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJd2hpbGUgKGxpbmstPm9wZW4gPiAwKQorCQkJCXdsMzUwMV9jbG9zZShkZXYpOworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJd2wzNTAxX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCXdsMzUwMV9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9TVVNQRU5EKTsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJaWYgKGxpbmstPm9wZW4pCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9SRVNVTUUpOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlpZiAobGluay0+b3BlbikgeworCQkJCXdsMzUwMV9yZXNldChkZXYpOworCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3bDM1MDFfZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcnYgICAgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJ3bDM1MDFfY3MiLAorCX0sCisJLmF0dGFjaCAgICAgICAgID0gd2wzNTAxX2F0dGFjaCwKKwkuZGV0YWNoICAgICAgICAgPSB3bDM1MDFfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2wzNTAxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2wzNTAxX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJZHByaW50aygwLCAiOiB1bmxvYWRpbmciKTsKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworCUJVR19PTih3bDM1MDFfZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KHdsMzUwMV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh3bDM1MDFfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJGb3ggQ2hlbiA8bWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3PiwgIgorCSAgICAgICJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIgorCSAgICAgICJHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGFuZXQgd2wzNTAxIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMgYi9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE5MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKQEAgLTAsMCArMSwxNDk5IEBACisvKiB5ZWxsb3dmaW4uYzogQSBQYWNrZXQgRW5naW5lcyBHLU5JQyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTctMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBQYWNrZXQgRW5naW5lcyBHLU5JQyBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBhZGFwdGVyLgorCUl0IGFsc28gc3VwcG9ydHMgdGhlIFN5bWJpb3MgTG9naWMgdmVyc2lvbiBvZiB0aGUgc2FtZSBjaGlwIGNvcmUuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsveWVsbG93ZmluLmh0bWwKKworCisJTGludXgga2VybmVsIGNoYW5nZWxvZzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJTEsxLjEuMSAoamdhcnppayk6IFBvcnQgdG8gMi40IGtlcm5lbAorCisJTEsxLjEuMiAoamdhcnppayk6CisJKiBNZXJnZSBpbiBiZWNrZXIgdmVyc2lvbiAxLjA1CisKKwlMSzEuMS4zIChqZ2FyemlrKToKKwkqIFZhcmlvdXMgY2xlYW51cHMKKwkqIFVwZGF0ZSB5ZWxsb3dmaW5fdGltZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBkdXBsZXguCisJKHN1Z2dlc3RlZCBieSBNYW5mcmVkIFNwcmF1bCkKKworCUxLMS4xLjQgKHZhbEBubXQuZWR1KToKKwkqIEZpeCB0aHJlZSBlbmRpYW4tbmVzcyBidWdzCisJKiBTdXBwb3J0IGR1YWwgZnVuY3Rpb24gU1lNNTNDODg1RSBldGhlcm5ldCBjaGlwCisJCisJTEsxLjEuNSAodmFsQG5tdC5lZHUpOgorCSogRml4IGZvcmNlZCBmdWxsLWR1cGxleCBidWcgSSBpbnRyb2R1Y2VkCisKKwlMSzEuMS42ICh2YWxAbm10LmVkdSk6CisJKiBPbmx5IHByaW50IHdhcm5pbmcgb24gdHJ1bHkgIm92ZXJzaXplZCIgcGFja2V0cworCSogRml4IHRoZW9yZXRpY2FsIGJ1ZyBvbiBnaWdhYml0IGNhcmRzIC0gcmV0dXJuIHRvIDEuMS4zIGJlaGF2aW9yCisJCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJ5ZWxsb3dmaW4iCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA1K0xLMS4xLjYiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJGZWIgMTEsIDIwMDIiCisKKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CitzdGF0aWMgaW50IG10dTsKKyNpZmRlZiBZRl9QUk9UT1RZUEUJCQkvKiBTdXBwb3J0IGZvciBwcm90b3R5cGUgaGFyZHdhcmUgZXJyYXRhLiAqLworLyogU3lzdGVtLXdpZGUgY291bnQgb2YgYm9ndXMtcnggZnJhbWVzLiAqLworc3RhdGljIGludCBib2d1c19yeDsKK3N0YXRpYyBpbnQgZG1hX2N0cmwgPSAweDAwNEEwMjYzOyAJCQkvKiBDb25zdHJhaW5lZCBieSBlcnJhdGEgKi8KK3N0YXRpYyBpbnQgZmlmb19jZmcgPSAweDAwMjA7CQkJCS8qIEJ5cGFzcyBleHRlcm5hbCBUeCBGSUZPLiAqLworI2VsaWYgZGVmaW5lZChZRl9ORVcpCQkJCQkvKiBBIGZ1dHVyZSBwZXJmZWN0IGJvYXJkIDotPi4gICovCitzdGF0aWMgaW50IGRtYV9jdHJsID0gMHgwMENBQzI3NzsJCQkvKiBPdmVycmlkZSB3aGVuIGxvYWRpbmcgbW9kdWxlISAqLworc3RhdGljIGludCBmaWZvX2NmZyA9IDB4MDAyODsKKyNlbHNlCitzdGF0aWMgaW50IGRtYV9jdHJsID0gMHgwMDRBMDI2MzsgCQkJLyogQ29uc3RyYWluZWQgYnkgZXJyYXRhICovCitzdGF0aWMgaW50IGZpZm9fY2ZnID0gMHgwMDIwOwkJCQkvKiBCeXBhc3MgZXh0ZXJuYWwgVHggRklGTy4gKi8KKyNlbmRpZgorCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxNCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBObyBtZWRpYSB0eXBlcyBhcmUgY3VycmVudGx5IGRlZmluZWQuICBUaGVzZSBleGlzdCBmb3IgZHJpdmVyCisgICBpbnRlcm9wZXJhYmlsaXR5LgorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCQkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworLyogRG8gdWdseSB3b3JrYXJvdW5kIGZvciBHWCBzZXJ2ZXIgY2hpcHNldCBlcnJhdGEuICovCitzdGF0aWMgaW50IGd4X2ZpeDsKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsb25nIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFRYX1FVRVVFX1NJWkUJMTIJCS8qIE11c3QgYmUgPiA0ICYmIDw9IFRYX1JJTkdfU0laRSAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJNjQKKyNkZWZpbmUgU1RBVFVTX1RPVEFMX1NJWkUJVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKQorI2RlZmluZSBUWF9UT1RBTF9TSVpFCQkyKlRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYykKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkJCS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKyNkZWZpbmUgeWVsbG93ZmluX2RlYnVnIGRlYnVnCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYxLjA1ICAxLzA5LzIwMDEgIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3llbGxvd2Zpbi5odG1sXG4iCitLRVJOX0lORk8gIiAgKHVub2ZmaWNpYWwgMi40LnggcG9ydCwgIiBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgRW5naW5lcyBZZWxsb3dmaW4gRy1OSUMgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdHUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZ3hfZml4LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJHLU5JQyBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MobXR1LCAiRy1OSUMgTVRVIChhbGwgYm9hcmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkctTklDIGRlYnVnIGxldmVsICgwLTcpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIkctTklDIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJHLU5JQzogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJHLU5JQyBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworTU9EVUxFX1BBUk1fREVTQyhneF9maXgsICJHLU5JQzogZW5hYmxlIEdYIHNlcnZlciBjaGlwc2V0IGJ1ZyB3b3JrYXJvdW5kICgwLTEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFBhY2tldCBFbmdpbmVzICJZZWxsb3dmaW4iIEdpZ2FiaXQKK0V0aGVybmV0IGFkYXB0ZXIuICBUaGUgRy1OSUMgNjQtYml0IFBDSSBjYXJkIGlzIHN1cHBvcnRlZCwgYXMgd2VsbCBhcyB0aGUgCitTeW1iaW9zIDUzQzg4NUUgZHVhbCBmdW5jdGlvbiBjaGlwLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworUENJIGJ1cyBkZXZpY2VzIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBzeXN0ZW0gYXQgYm9vdCB0aW1lLCBzbyBubyBqdW1wZXJzCituZWVkIHRvIGJlIHNldCBvbiB0aGUgYm9hcmQuICBUaGUgc3lzdGVtIEJJT1MgcHJlZmVyYWJseSBzaG91bGQgYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGFuIG90aGVyd2lzZSB1bnVzZWQgc3lzdGVtIElSUSBsaW5lLgorTm90ZTogS2VybmVsIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjMuNzMgZG8gbm90IHN1cHBvcnQgc2hhcmVkIFBDSQoraW50ZXJydXB0IGxpbmVzLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK1RoZSBZZWxsb3dmaW4gdXNlcyB0aGUgRGVzY3JpcHRvciBCYXNlZCBETUEgQXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBieSBBcHBsZS4KK1RoaXMgaXMgYSBkZXNjcmlwdG9yIGxpc3Qgc2NoZW1lIHNpbWlsYXIgdG8gdGhhdCB1c2VkIGJ5IHRoZSBFRVBybzEwMCBhbmQKK1R1bGlwLiAgVGhpcyBkcml2ZXIgdXNlcyB0d28gc3RhdGljYWxseSBhbGxvY2F0ZWQgZml4ZWQtc2l6ZSBkZXNjcmlwdG9yIGxpc3RzCitmb3JtZWQgaW50byByaW5ncyBieSBhIGJyYW5jaCBmcm9tIHRoZSBmaW5hbCBkZXNjcmlwdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YKK3RoZSBsaXN0LiAgVGhlIHJpbmcgc2l6ZXMgYXJlIHNldCBhdCBjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLgorCitUaGUgZHJpdmVyIGFsbG9jYXRlcyBmdWxsIGZyYW1lIHNpemUgc2tidWZmcyBmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdAorb3BlbigpIHRpbWUgYW5kIHBhc3NlcyB0aGUgc2tiLT5kYXRhIGZpZWxkIHRvIHRoZSBZZWxsb3dmaW4gYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2sgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkIHNrYnVmZi4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgRm9yIHNtYWxsIGZyYW1lcyB0aGUgY29weWluZyBjb3N0IGlzIG5lZ2xpZ2libGUgKGVzcC4gY29uc2lkZXJpbmcKK3RoYXQgd2UgYXJlIHByZS1sb2FkaW5nIHRoZSBjYWNoZSB3aXRoIGltbWVkaWF0ZWx5IHVzZWZ1bCBoZWFkZXIKK2luZm9ybWF0aW9uKS4gIEZvciBsYXJnZSBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBub24tdHJpdmlhbCwgYW5kIHRoZQorbGFyZ2VyIGNvcHkgbWlnaHQgZmx1c2ggdGhlIGNhY2hlIG9mIHVzZWZ1bCBkYXRhLgorCitJSUlDLiBTeW5jaHJvbml6YXRpb24KKworVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBvdGhlciBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAneXAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWZmIHRoZSAneXAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdAorY2xlYXJzIGJvdGggdGhlIHR4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIEtpbSBTdGVhcm5zIG9mIFBhY2tldCBFbmdpbmVzIGZvciBwcm92aWRpbmcgYSBwYWlyIG9mIEctTklDIGJvYXJkcy4KK1RoYW5rcyB0byBCcnVjZSBGYXVzdCBvZiBEaWdpdGFsc2NhcGUgZm9yIHByb3ZpZGluZyBib3RoIHRoZWlyIFNZTTUzQzg4NSBib2FyZAorYW5kIGFuIEFscGhhU3RhdGlvbiB0byB2ZXJpZnR5IHRoZSBBbHBoYSBwb3J0IQorCitJVmIuIFJlZmVyZW5jZXMKKworWWVsbG93ZmluIEVuZ2luZWVyaW5nIERlc2lnbiBTcGVjaWZpY2F0aW9uLCA0LzIzLzk3IFByZWxpbWluYXJ5L0NvbmZpZGVudGlhbAorU3ltYmlvcyBTWU01M0M4ODUgUENJLVNDU0kvRmFzdCBFdGhlcm5ldCBNdWx0aWZ1bmN0aW9uIENvbnRyb2xsZXIgUHJlbGltaW5hcnkKKyAgIERhdGEgTWFudWFsIHYzLjAKK2h0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9taXNjL05XYXkuaHRtbAoraHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvMTAwbWJwcy5odG1sCisKK0lWYy4gRXJyYXRhCisKK1NlZSBQYWNrZXQgRW5naW5lcyBjb25maWRlbnRpYWwgYXBwZW5kaXggKHByb3RvdHlwZSBjaGlwcyBvbmx5KS4KKyovCisKKwwKKworZW51bSBwY2lfaWRfZmxhZ3NfYml0cyB7CisJLyogU2V0IFBDSSBjb21tYW5kIHJlZ2lzdGVyIGJpdHMgYmVmb3JlIGNhbGxpbmcgcHJvYmUxKCkuICovCisJUENJX1VTRVNfSU89MSwgUENJX1VTRVNfTUVNPTIsIFBDSV9VU0VTX01BU1RFUj00LAorCS8qIFJlYWQgYW5kIG1hcCB0aGUgc2luZ2xlIGZvbGxvd2luZyBQQ0kgQkFSLiAqLworCVBDSV9BRERSMD0wPDw0LCBQQ0lfQUREUjE9MTw8NCwgUENJX0FERFIyPTI8PDQsIFBDSV9BRERSMz0zPDw0LAorCVBDSV9BRERSXzY0QklUUz0weDEwMCwgUENJX05PX0FDUElfV0FLRT0weDIwMCwgUENJX05PX01JTl9MQVRFTkNZPTB4NDAwLAorCVBDSV9VTlVTRURfSVJRPTB4ODAwLAorfTsKK2VudW0gY2FwYWJpbGl0eV9mbGFncyB7CisJSGFzTUlJPTEsIEZ1bGxUeFN0YXR1cz0yLCBJc0dpZ2FiaXQ9NCwgSGFzTXVsdGljYXN0QnVnPTgsIEZ1bGxSeFN0YXR1cz0xNiwKKwlIYXNNQUNBZGRyQnVnPTMyLCAvKiBPbmx5IG9uIGVhcmx5IHJldnMuICAqLworCURvbnRVc2VFZXByb209NjQsIC8qIERvbid0IHJlYWQgdGhlIE1BQyBmcm9tIHRoZSBFRVBST20uICovCit9OworLyogVGhlIFBDSSBJL08gc3BhY2UgZXh0ZW50LiAqLworI2RlZmluZSBZRUxMT1dGSU5fU0laRSAweDEwMAorI2lmZGVmIFVTRV9JT19PUFMKKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfSU8gIHwgUENJX0FERFIwKQorI2Vsc2UKKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfTUVNIHwgUENJX0FERFIxKQorI2VuZGlmCisKK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIHN0cnVjdCBtYXRjaF9pbmZvIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHBjaSwgcGNpX21hc2ssIHN1YnN5c3RlbSwgc3Vic3lzdGVtX21hc2s7CisgICAgICAgICAgICAgICAgaW50IHJldmlzaW9uLCByZXZpc2lvbl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IDggYml0cy4gKi8KKyAgICAgICAgfSBpZDsKKyAgICAgICAgZW51bSBwY2lfaWRfZmxhZ3NfYml0cyBwY2lfZmxhZ3M7CisgICAgICAgIGludCBpb19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIEkvTyByZWdpb24gY2hlY2sgb3IgaW9yZW1hcCgpLiAqLworICAgICAgICBpbnQgZHJ2X2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmVyIHVzZSwgaW50ZW5kZWQgYXMgY2FwYWJpbGl0eSBmbGFncy4gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworCXsiWWVsbG93ZmluIEctTklDIEdpZ2FiaXQgRXRoZXJuZXQiLCB7IDB4MDcwMjEwMDAsIDB4ZmZmZmZmZmZ9LAorCSBQQ0lfSU9UWVBFLCBZRUxMT1dGSU5fU0laRSwKKwkgRnVsbFR4U3RhdHVzIHwgSXNHaWdhYml0IHwgSGFzTXVsdGljYXN0QnVnIHwgSGFzTUFDQWRkckJ1ZyB8IERvbnRVc2VFZXByb219LAorCXsiU3ltYmlvcyBTWU04M0M4ODUiLCB7IDB4MDcwMTEwMDAsIDB4ZmZmZmZmZmZ9LAorCSBQQ0lfSU9UWVBFLCBZRUxMT1dGSU5fU0laRSwgSGFzTUlJIHwgRG9udFVzZUVlcHJvbSB9LAorCXtOVUxMLH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeWVsbG93ZmluX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAwMCwgMHgwNzAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDEwMDAsIDB4MDcwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgeWVsbG93ZmluX3BjaV90YmwpOworCisKKy8qIE9mZnNldHMgdG8gdGhlIFllbGxvd2ZpbiByZWdpc3RlcnMuICBWYXJpb3VzIHNpemVzIGFuZCBhbGlnbm1lbnRzLiAqLworZW51bSB5ZWxsb3dmaW5fb2Zmc2V0cyB7CisJVHhDdHJsPTB4MDAsIFR4U3RhdHVzPTB4MDQsIFR4UHRyPTB4MEMsCisJVHhJbnRyU2VsPTB4MTAsIFR4QnJhbmNoU2VsPTB4MTQsIFR4V2FpdFNlbD0weDE4LAorCVJ4Q3RybD0weDQwLCBSeFN0YXR1cz0weDQ0LCBSeFB0cj0weDRDLAorCVJ4SW50clNlbD0weDUwLCBSeEJyYW5jaFNlbD0weDU0LCBSeFdhaXRTZWw9MHg1OCwKKwlFdmVudFN0YXR1cz0weDgwLCBJbnRyRW5iPTB4ODIsIEludHJDbGVhcj0weDg0LCBJbnRyU3RhdHVzPTB4ODYsCisJQ2hpcFJldj0weDhDLCBETUFDdHJsPTB4OTAsIFR4VGhyZXNob2xkPTB4OTQsCisJQ25mZz0weEEwLCBGcmFtZUdhcDA9MHhBMiwgRnJhbWVHYXAxPTB4QTQsCisJTUlJX0NtZD0weEE2LCBNSUlfQWRkcj0weEE4LCBNSUlfV3JfRGF0YT0weEFBLCBNSUlfUmRfRGF0YT0weEFDLAorCU1JSV9TdGF0dXM9MHhBRSwKKwlSeERlcHRoPTB4QjgsIEZsb3dDdHJsPTB4QkMsCisJQWRkck1vZGU9MHhEMCwgU3RuQWRkcj0weEQyLCBIYXNoVGJsPTB4RDgsIEZJRk9jZmc9MHhGOCwKKwlFRVN0YXR1cz0weEYwLCBFRUN0cmw9MHhGMSwgRUVBZGRyPTB4RjIsIEVFUmVhZD0weEYzLCBFRVdyaXRlPTB4RjQsCisJRUVGZWF0dXJlPTB4RjUsCit9OworCisvKiBUaGUgWWVsbG93ZmluIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuCisgICBFbGVtZW50cyBhcmUgd3JpdHRlbiBhcyAzMiBiaXQgZm9yIGVuZGlhbiBwb3J0YWJpbGl0eS4gKi8KK3N0cnVjdCB5ZWxsb3dmaW5fZGVzYyB7CisJdTMyIGRiZG1hX2NtZDsKKwl1MzIgYWRkcjsKKwl1MzIgYnJhbmNoX2FkZHI7CisJdTMyIHJlc3VsdF9zdGF0dXM7Cit9OworCitzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYgdHhfZXJyczsKKwl1MTYgdHhfY250OworCXUxNiBwYXVzZWQ7CisJdTE2IHRvdGFsX3R4X2NudDsKKyNlbHNlICAvKiBMaXR0bGUgZW5kaWFuIGNoaXBzLiAqLworCXUxNiB0eF9jbnQ7CisJdTE2IHR4X2VycnM7CisJdTE2IHRvdGFsX3R4X2NudDsKKwl1MTYgcGF1c2VkOworI2VuZGlmIC8qIF9fQklHX0VORElBTiAqLworfTsKKworLyogQml0cyBpbiB5ZWxsb3dmaW5fZGVzYy5jbWQgKi8KK2VudW0gZGVzY19jbWRfYml0cyB7CisJQ01EX1RYX1BLVD0weDEwMDAwMDAwLCBDTURfUlhfQlVGPTB4MjAwMDAwMDAsIENNRF9UWFNUQVRVUz0weDMwMDAwMDAwLAorCUNNRF9OT1A9MHg2MDAwMDAwMCwgQ01EX1NUT1A9MHg3MDAwMDAwMCwKKwlCUkFOQ0hfQUxXQVlTPTB4MEMwMDAwLCBJTlRSX0FMV0FZUz0weDMwMDAwMCwgV0FJVF9BTFdBWVM9MHgwMzAwMDAsCisJQlJBTkNIX0lGVFJVRT0weDA0MDAwMCwKK307CisKKy8qIEJpdHMgaW4geWVsbG93ZmluX2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeyBSWF9FT1A9MHgwMDQwLCB9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyUnhEb25lPTB4MDEsIEludHJSeEludmFsaWQ9MHgwMiwgSW50clJ4UENJRmF1bHQ9MHgwNCxJbnRyUnhQQ0lFcnI9MHgwOCwKKwlJbnRyVHhEb25lPTB4MTAsIEludHJUeEludmFsaWQ9MHgyMCwgSW50clR4UENJRmF1bHQ9MHg0MCxJbnRyVHhQQ0lFcnI9MHg4MCwKKwlJbnRyRWFybHlSeD0weDEwMCwgSW50cldha2V1cD0weDIwMCwgfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTMxIAkvKiBSZXF1aXJlZCBhbGlnbm1lbnQgbWFzayAqLworI2RlZmluZSBNSUlfQ05UCQk0CitzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4KKwkgICBUeCByZXF1aXJlcyBhIHNlY29uZCBkZXNjcmlwdG9yIGZvciBzdGF0dXMuICovCisJc3RydWN0IHllbGxvd2Zpbl9kZXNjICpyeF9yaW5nOworCXN0cnVjdCB5ZWxsb3dmaW5fZGVzYyAqdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKworCXN0cnVjdCB0eF9zdGF0dXNfd29yZHMgKnR4X3N0YXR1czsKKwlkbWFfYWRkcl90IHR4X3N0YXR1c19kbWE7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCS8qIEZyZXF1ZW50bHkgdXNlZCBhbmQgcGFpcmVkIHZhbHVlOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJaW50IGNoaXBfaWQsIGRydl9mbGFnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwlzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzICp0eF90YWlsX2Rlc2M7CisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJaW50IHR4X3RocmVzaG9sZDsKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJCQkvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworCXVuc2lnbmVkIGludCBkdXBsZXhfbG9jazoxOworCXVuc2lnbmVkIGludCBtZWRpYWxvY2s6MTsJCQkvKiBEbyBub3Qgc2Vuc2UgbWVkaWEuICovCisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJaW50IG1paV9jbnQ7CQkJCQkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdTE2IGFkdmVydGlzaW5nOwkJCQkJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdW5zaWduZWQgY2hhciBwaHlzW01JSV9DTlRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMsIG9ubHkgZmlyc3Qgb25lIHVzZWQgKi8KKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGludCByZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeWVsbG93ZmluX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHllbGxvd2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIGludCB5ZWxsb3dmaW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnllbGxvd2Zpbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKKworc3RhdGljIGludCBfX2RldmluaXQgeWVsbG93ZmluX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICpucDsKKwlpbnQgaXJxOworCWludCBjaGlwX2lkeCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJc3RhdGljIGludCBmaW5kX2NudDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaSwgb3B0aW9uID0gZmluZF9jbnQgPCBNQVhfVU5JVFMgPyBvcHRpb25zW2ZpbmRfY250XSA6IDA7CisJaW50IGRydl9mbGFncyA9IHBjaV9pZF90YmxbY2hpcF9pZHhdLmRydl9mbGFnczsKKyAgICAgICAgdm9pZCAqcmluZ19zcGFjZTsKKyAgICAgICAgZG1hX2FkZHJfdCByaW5nX2RtYTsKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW50IGJhciA9IDA7CisjZWxzZQorCWludCBiYXIgPSAxOworI2VuZGlmCisJCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKm5wKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCXBjaV9zZXRfbWFzdGVyIChwZGV2KTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIFlFTExPV0ZJTl9TSVpFKTsKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKGRydl9mbGFncyAmIERvbnRVc2VFZXByb20pCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID0gaW9yZWFkOChpb2FkZHIgKyBTdG5BZGRyICsgaSk7CisJZWxzZSB7CisJCWludCBlZV9vZmZzZXQgPSAocmVhZF9lZXByb20oaW9hZGRyLCA2KSA9PSAweGZmID8gMHgxMDAgOiAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkX2VlcHJvbShpb2FkZHIsIGVlX29mZnNldCArIGkpOworCX0KKworCS8qIFJlc2V0IHRoZSBjaGlwLiAqLworCWlvd3JpdGUzMigweDgwMDAwMDAwLCBpb2FkZHIgKyBETUFDdHJsKTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKworCW5wLT5wY2lfZGV2ID0gcGRldjsKKwlucC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCW5wLT5kcnZfZmxhZ3MgPSBkcnZfZmxhZ3M7CisJbnAtPmJhc2UgPSBpb2FkZHI7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKwlucC0+dHhfcmluZyA9IChzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfdHg7CisJbnAtPnJ4X3JpbmcgPSAoc3RydWN0IHllbGxvd2Zpbl9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBTVEFUVVNfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF9yeDsKKwlucC0+dHhfc3RhdHVzID0gKHN0cnVjdCB0eF9zdGF0dXNfd29yZHMgKilyaW5nX3NwYWNlOworCW5wLT50eF9zdGF0dXNfZG1hID0gcmluZ19kbWE7CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKG9wdGlvbiA+IDApIHsKKwkJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJbnAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbiAmIDE1OworCQlpZiAobnAtPmRlZmF1bHRfcG9ydCkKKwkJCW5wLT5tZWRpYWxvY2sgPSAxOworCX0KKwlpZiAoZmluZF9jbnQgPCBNQVhfVU5JVFMgICYmICBmdWxsX2R1cGxleFtmaW5kX2NudF0gPiAwKQorCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCisJaWYgKG5wLT5mdWxsX2R1cGxleCkKKwkJbnAtPmR1cGxleF9sb2NrID0gMTsKKworCS8qIFRoZSBZZWxsb3dmaW4tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmeWVsbG93ZmluX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmeWVsbG93ZmluX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJnllbGxvd2Zpbl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZ5ZWxsb3dmaW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT50eF90aW1lb3V0ID0geWVsbG93ZmluX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlpZiAobXR1KQorCQlkZXYtPm10dSA9IG10dTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3N0YXR1czsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB0eXBlICU4eCBhdCAlcCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5uYW1lLAorCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDaGlwUmV2KSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCisJaWYgKG5wLT5kcnZfZmxhZ3MgJiBIYXNNSUkpIHsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCWZvciAocGh5ID0gMDsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IE1JSV9DTlQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeSwgMSk7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbnAtPmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGlvYWRkciwgcGh5LCA0KTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiMHglNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBucC0+YWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCW5wLT5taWlfY250ID0gcGh5X2lkeDsKKwl9CisKKwlmaW5kX2NudCsrOworCQorCXJldHVybiAwOworCitlcnJfb3V0X3VubWFwX3N0YXR1czoKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBTVEFUVVNfVE9UQUxfU0laRSwgbnAtPnR4X3N0YXR1cywgCisJCW5wLT50eF9zdGF0dXNfZG1hKTsKK2Vycl9vdXRfdW5tYXBfcng6CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsIG5wLT5yeF9yaW5nX2RtYSk7CitlcnJfb3V0X3VubWFwX3R4OgorICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLCBucC0+dHhfcmluZ19kbWEpOworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGJvZ3VzX2NudCA9IDEwMDAwOwkJLyogVHlwaWNhbCAzM01oejogMTA1MCB0aWNrcyAqLworCisJaW93cml0ZTgobG9jYXRpb24sIGlvYWRkciArIEVFQWRkcik7CisJaW93cml0ZTgoMHgzMCB8ICgobG9jYXRpb24gPj4gOCkgJiA3KSwgaW9hZGRyICsgRUVDdHJsKTsKKwl3aGlsZSAoKGlvcmVhZDgoaW9hZGRyICsgRUVTdGF0dXMpICYgMHg4MCkgICYmICAtLWJvZ3VzX2NudCA+IDApCisJCTsKKwlyZXR1cm4gaW9yZWFkOChpb2FkZHIgKyBFRVJlYWQpOworfQorCisvKiBNSUkgTWFuYWdlbWVuIERhdGEgSS9PIGFjY2Vzc2VzLgorICAgVGhlc2Ugcm91dGluZXMgYXNzdW1lIHRoZSBNRElPIGNvbnRyb2xsZXIgaXMgaWRsZSwgYW5kIGRvIG5vdCBleGl0IHVudGlsCisgICB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4gKi8KKworc3RhdGljIGludCBtZGlvX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKworCWlvd3JpdGUxNigocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJaW93cml0ZTE2KDEsIGlvYWRkciArIE1JSV9DbWQpOworCWZvciAoaSA9IDEwMDAwOyBpID49IDA7IGktLSkKKwkJaWYgKChpb3JlYWQxNihpb2FkZHIgKyBNSUlfU3RhdHVzKSAmIDEpID09IDApCisJCQlicmVhazsKKwlyZXR1cm4gaW9yZWFkMTYoaW9hZGRyICsgTUlJX1JkX0RhdGEpOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWlvd3JpdGUxNigocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJaW93cml0ZTE2KHZhbHVlLCBpb2FkZHIgKyBNSUlfV3JfRGF0YSk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKGlvcmVhZDE2KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybjsKK30KKworDAorc3RhdGljIGludCB5ZWxsb3dmaW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJaW50IGk7CisKKwkvKiBSZXNldCB0aGUgY2hpcC4gKi8KKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgRE1BQ3RybCk7CisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ5ZWxsb3dmaW5faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHllbGxvd2Zpbl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJeWVsbG93ZmluX2luaXRfcmluZyhkZXYpOworCisJaW93cml0ZTMyKHlwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUnhQdHIpOworCWlvd3JpdGUzMih5cC0+dHhfcmluZ19kbWEsIGlvYWRkciArIFR4UHRyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0bkFkZHIgKyBpKTsKKworCS8qIFNldCB1cCB2YXJpb3VzIGNvbmRpdGlvbiAnc2VsZWN0JyByZWdpc3RlcnMuCisJICAgVGhlcmUgYXJlIG5vIG9wdGlvbnMgaGVyZS4gKi8KKwlpb3dyaXRlMzIoMHgwMDgwMDA4MCwgaW9hZGRyICsgVHhJbnRyU2VsKTsgCS8qIEludGVycnVwdCBvbiBUeCBhYm9ydCAqLworCWlvd3JpdGUzMigweDAwODAwMDgwLCBpb2FkZHIgKyBUeEJyYW5jaFNlbCk7CS8qIEJyYW5jaCBvbiBUeCBhYm9ydCAqLworCWlvd3JpdGUzMigweDAwNDAwMDQwLCBpb2FkZHIgKyBUeFdhaXRTZWwpOyAJLyogV2FpdCBvbiBUeCBzdGF0dXMgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhJbnRyU2VsKTsJLyogSW50ZXJydXB0IG9uIFJ4IGRvbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhCcmFuY2hTZWwpOwkvKiBCcmFuY2ggb24gUnggZXJyb3IgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhXYWl0U2VsKTsJLyogV2FpdCBvbiBSeCBkb25lICovCisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVyczogd2l0aCBzbyBtYW55IHRoaXMgZXZlbnR1YWxseSB0aGlzIHdpbGwKKwkgICBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0L3ZhbHVlIGxpc3QuICovCisJaW93cml0ZTMyKGRtYV9jdHJsLCBpb2FkZHIgKyBETUFDdHJsKTsKKwlpb3dyaXRlMTYoZmlmb19jZmcsIGlvYWRkciArIEZJRk9jZmcpOworCS8qIEVuYWJsZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBmbG93IGNvbnRyb2wgZnJhbWVzLCBwZXJpb2QgMHhmZmZmLiAqLworCWlvd3JpdGUzMigweDAwMzBGRkZGLCBpb2FkZHIgKyBGbG93Q3RybCk7CisKKwl5cC0+dHhfdGhyZXNob2xkID0gMzI7CisJaW93cml0ZTMyKHlwLT50eF90aHJlc2hvbGQsIGlvYWRkciArIFR4VGhyZXNob2xkKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkKKwkJZGV2LT5pZl9wb3J0ID0geXAtPmRlZmF1bHRfcG9ydDsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBTZXR0aW5nIHRoZSBSeCBtb2RlIHdpbGwgc3RhcnQgdGhlIFJ4IHByb2Nlc3MuICovCisJaWYgKHlwLT5kcnZfZmxhZ3MgJiBJc0dpZ2FiaXQpIHsKKwkJLyogV2UgYXJlIGFsd2F5cyBpbiBmdWxsLWR1cGxleCBtb2RlIHdpdGggZ2lnYWJpdCEgKi8KKwkJeXAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaW93cml0ZTE2KDB4MDFDRiwgaW9hZGRyICsgQ25mZyk7CisJfSBlbHNlIHsKKwkJaW93cml0ZTE2KDB4MDAxOCwgaW9hZGRyICsgRnJhbWVHYXAwKTsgLyogMDA2MC80MDYwIGZvciBub24tTUlJIDEwYmFzZVQgKi8KKwkJaW93cml0ZTE2KDB4MTAxOCwgaW9hZGRyICsgRnJhbWVHYXAxKTsKKwkJaW93cml0ZTE2KDB4MTAxQyB8ICh5cC0+ZnVsbF9kdXBsZXggPyAyIDogMCksIGlvYWRkciArIENuZmcpOworCX0KKwlzZXRfcnhfbW9kZShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4ODFmZiwgaW9hZGRyICsgSW50ckVuYik7CQkJLyogU2VlIGVudW0gaW50cl9zdGF0dXNfYml0cyAqLworCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEV2ZW50U3RhdHVzKTsJCS8qIENsZWFyIG5vbi1pbnRlcnJ1cHRpbmcgZXZlbnRzICovCisJaW93cml0ZTMyKDB4ODAwMDgwMDAsIGlvYWRkciArIFJ4Q3RybCk7CQkvKiBTdGFydCBSeCBhbmQgVHggY2hhbm5lbHMuICovCisJaW93cml0ZTMyKDB4ODAwMDgwMDAsIGlvYWRkciArIFR4Q3RybCk7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgeWVsbG93ZmluX29wZW4oKS5cbiIsCisJCQkgICBkZXYtPm5hbWUpOworCX0KKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZ5cC0+dGltZXIpOworCXlwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDMqSFo7CisJeXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJeXAtPnRpbWVyLmZ1bmN0aW9uID0gJnllbGxvd2Zpbl90aW1lcjsJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmeXAtPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gdGltZXIgdGljaywgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCX0KKworCWlmICh5cC0+bWlpX2NudCkgeworCQlpbnQgYm1zciA9IG1kaW9fcmVhZChpb2FkZHIsIHlwLT5waHlzWzBdLCBNSUlfQk1TUik7CisJCWludCBscGEgPSBtZGlvX3JlYWQoaW9hZGRyLCB5cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCWludCBuZWdvdGlhdGVkID0gbHBhICYgeXAtPmFkdmVydGlzaW5nOworCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJICMlZCBzdGF0dXMgcmVnaXN0ZXIgaXMgJTQuNHgsICIKKwkJCQkgICAibGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgeXAtPnBoeXNbMF0sIGJtc3IsIGxwYSk7CisKKwkJeXAtPmZ1bGxfZHVwbGV4ID0gbWlpX2R1cGxleCh5cC0+ZHVwbGV4X2xvY2ssIG5lZ290aWF0ZWQpOworCQkJCisJCWlvd3JpdGUxNigweDEwMUMgfCAoeXAtPmZ1bGxfZHVwbGV4ID8gMiA6IDApLCBpb2FkZHIgKyBDbmZnKTsKKworCQlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykKKwkJCW5leHRfdGljayA9IDYwKkhaOworCQllbHNlCisJCQluZXh0X3RpY2sgPSAzKkhaOworCX0KKworCXlwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJnlwLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB5cC0+YmFzZTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBZZWxsb3dmaW4gdHJhbnNtaXQgdGltZWQgb3V0IGF0ICVkLyVkIFR4ICIKKwkJICAgInN0YXR1cyAlNC40eCwgUnggc3RhdHVzICU0LjR4LCByZXNldHRpbmcuLi5cbiIsCisJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgeXAtPmRpcnR5X3R4LAorCQkgICBpb3JlYWQzMihpb2FkZHIgKyBUeFN0YXR1cyksIGlvcmVhZDMyKGlvYWRkciArIFJ4U3RhdHVzKSk7CisKKwkvKiBOb3RlOiB0aGVzZSBzaG91bGQgYmUgS0VSTl9ERUJVRy4gKi8KKwlpZiAoeWVsbG93ZmluX2RlYnVnKSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIFJ4IHJpbmcgJXA6ICIsIHlwLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCB5cC0+cnhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiJLRVJOX1dBUk5JTkciICBUeCByaW5nICVwOiAiLCB5cC0+dHhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU0LjR4IC8lOC44eCIsIHlwLT50eF9zdGF0dXNbaV0udHhfZXJycywKKwkJCQkgICB5cC0+dHhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCS8qIElmIHRoZSBoYXJkd2FyZSBpcyBmb3VuZCB0byBoYW5nIHJlZ3VsYXJseSwgd2Ugd2lsbCB1cGRhdGUgdGhlIGNvZGUKKwkgICB0byByZWluaXRpYWxpemUgdGhlIGNoaXAgaGVyZS4gKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCisJLyogV2FrZSB0aGUgcG90ZW50aWFsbHktaWRsZSB0cmFuc21pdCBjaGFubmVsLiAqLworCWlvd3JpdGUzMigweDEwMDAxMDAwLCB5cC0+YmFzZSArIFR4Q3RybCk7CisJaWYgKHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPCBUWF9RVUVVRV9TSVpFKQorCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOwkJLyogVHlwaWNhbCBwYXRoICovCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl5cC0+c3RhdHMudHhfZXJyb3JzKys7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5faW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwl5cC0+dHhfZnVsbCA9IDA7CisJeXAtPmN1cl9yeCA9IHlwLT5jdXJfdHggPSAwOworCXlwLT5kaXJ0eV90eCA9IDA7CisKKwl5cC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJeXAtPnJ4X3JpbmdbaV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9SWF9CVUYgfCBJTlRSX0FMV0FZUyB8IHlwLT5yeF9idWZfc3opOworCQl5cC0+cnhfcmluZ1tpXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT5yeF9yaW5nX2RtYSArCisJCQkoKGkrMSklUlhfUklOR19TSVpFKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHlwLT5yeF9idWZfc3opOworCQl5cC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKwkJeXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LAorCQkJc2tiLT50YWlsLCB5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwl9CisJeXAtPnJ4X3JpbmdbaS0xXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJeXAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKyNkZWZpbmUgTk9fVFhTVEFUUworI2lmZGVmIE5PX1RYU1RBVFMKKwkvKiBJbiB0aGlzIG1vZGUgdGhlIFR4IHJpbmcgbmVlZHMgb25seSBhIHNpbmdsZSBkZXNjcmlwdG9yLiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQl5cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJeXAtPnR4X3JpbmdbaV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tpXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9yaW5nX2RtYSArCisJCQkoKGkrMSklVFhfUklOR19TSVpFKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCS8qIFdyYXAgcmluZyAqLworCXlwLT50eF9yaW5nWy0taV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1AgfCBCUkFOQ0hfQUxXQVlTKTsKKyNlbHNlCit7CisJaW50IGo7CisKKwkvKiBUeCByaW5nIG5lZWRzIGEgcGFpciBvZiBkZXNjcmlwdG9ycywgdGhlIHNlY29uZCBmb3IgdGhlIHN0YXR1cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaiA9IDIqaTsKKwkJeXAtPnR4X3NrYnVmZltpXSA9IDA7CisJCS8qIEJyYW5jaCBvbiBUeCBlcnJvci4gKi8KKwkJeXAtPnR4X3Jpbmdbal0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tqXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9yaW5nX2RtYSArCisJCQkoaisxKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKTsKKwkJaisrOworCQlpZiAoeXAtPmZsYWdzICYgRnVsbFR4U3RhdHVzKSB7CisJCQl5cC0+dHhfcmluZ1tqXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9UWFNUQVRVUyB8IHNpemVvZigqeXAtPnR4X3N0YXR1cykpOworCQkJeXAtPnR4X3Jpbmdbal0ucmVxdWVzdF9jbnQgPSBzaXplb2YoKnlwLT50eF9zdGF0dXMpOworCQkJeXAtPnR4X3Jpbmdbal0uYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9zdGF0dXNfZG1hICsKKwkJCQlpKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFN5bWJpb3MgY2hpcHMgd3JpdGUgb25seSB0eF9lcnJzIHdvcmQuICovCisJCQl5cC0+dHhfcmluZ1tqXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9UWFNUQVRVUyB8IElOVFJfQUxXQVlTIHwgMik7CisJCQl5cC0+dHhfcmluZ1tqXS5yZXF1ZXN0X2NudCA9IDI7CisJCQkvKiBPbSBwYWRlIHVtbW1tbS4uLiAqLworCQkJeXAtPnR4X3Jpbmdbal0uYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9zdGF0dXNfZG1hICsKKwkJCQlpKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKSArCisJCQkJJih5cC0+dHhfc3RhdHVzWzBdLnR4X2VycnMpIC0gCisJCQkJJih5cC0+dHhfc3RhdHVzWzBdKSk7CisJCX0KKwkJeXAtPnR4X3Jpbmdbal0uYnJhbmNoX2FkZHIgPSBjcHVfdG9fbGUzMih5cC0+dHhfcmluZ19kbWEgKyAKKwkJCSgoaisxKSUoMipUWF9SSU5HX1NJWkUpKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCS8qIFdyYXAgcmluZyAqLworCXlwLT50eF9yaW5nWysral0uZGJkbWFfY21kIHw9IGNwdV90b19sZTMyKEJSQU5DSF9BTFdBWVMgfCBJTlRSX0FMV0FZUyk7Cit9CisjZW5kaWYKKwl5cC0+dHhfdGFpbF9kZXNjID0gJnlwLT50eF9zdGF0dXNbMF07CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHllbGxvd2Zpbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgZW50cnk7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCS8qIE5vdGU6IE9yZGVyaW5nIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkIHdpdGggdGhlCisJICAgIm93bmVyc2hpcCIgYml0IGxhc3QsIGFuZCBvbmx5IHRoZW4gaW5jcmVtZW50IGN1cl90eC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0geXAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWlmIChneF9maXgpIHsJLyogTm90ZTogb25seSB3b3JrcyBmb3IgcGFkZGFibGUgcHJvdG9jb2xzIGUuZy4gIElQLiAqLworCQlpbnQgY2FjaGVsaW5lX2VuZCA9ICgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBza2ItPmxlbikgJSAzMjsKKwkJLyogRml4IEdYIGNoaXBzZXQgZXJyYXRhLiAqLworCQlpZiAoY2FjaGVsaW5lX2VuZCA+IDI0ICB8fCBjYWNoZWxpbmVfZW5kID09IDApIHsKKwkJCWxlbiA9IHNrYi0+bGVuICsgMzIgLSBjYWNoZWxpbmVfZW5kICsgMTsKKwkJCWlmIChsZW4gIT0gc2tiLT5sZW4pCisJCQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgbGVuKTsKKwkJfQorCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCXlwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXlwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisjaWZkZWYgTk9fVFhTVEFUUworCXlwLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoeXAtPnBjaV9kZXYsIAorCQlza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworCXlwLT50eF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID0gMDsKKwlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpIHsKKwkJLyogTmV3IHN0b3AgY29tbWFuZC4gKi8KKwkJeXAtPnR4X3JpbmdbMF0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUtMV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9UWF9QS1R8QlJBTkNIX0FMV0FZUyB8IGxlbik7CisJfSBlbHNlIHsKKwkJeXAtPnR4X3JpbmdbZW50cnkrMV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tlbnRyeV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9UWF9QS1QgfCBCUkFOQ0hfSUZUUlVFIHwgbGVuKTsKKwl9CisJeXAtPmN1cl90eCsrOworI2Vsc2UKKwl5cC0+dHhfcmluZ1tlbnRyeTw8MV0ucmVxdWVzdF9jbnQgPSBsZW47CisJeXAtPnR4X3JpbmdbZW50cnk8PDFdLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwgCisJCXNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJLyogVGhlIGlucHV0X2xhc3QgKHN0YXR1cy13cml0ZSkgY29tbWFuZCBpcyBjb25zdGFudCwgYnV0IHdlIG11c3QgCisJICAgcmV3cml0ZSB0aGUgc3Vic2VxdWVudCAnc3RvcCcgY29tbWFuZC4gKi8KKworCXlwLT5jdXJfdHgrKzsKKwl7CisJCXVuc2lnbmVkIG5leHRfZW50cnkgPSB5cC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCQl5cC0+dHhfcmluZ1tuZXh0X2VudHJ5PDwxXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJfQorCS8qIEZpbmFsIHN0ZXAgLS0gb3ZlcndyaXRlIHRoZSBvbGQgJ3N0b3AnIGNvbW1hbmQuICovCisKKwl5cC0+dHhfcmluZ1tlbnRyeTw8MV0uZGJkbWFfY21kID0KKwkJY3B1X3RvX2xlMzIoICgoZW50cnkgJSA2KSA9PSAwID8gQ01EX1RYX1BLVHxJTlRSX0FMV0FZU3xCUkFOQ0hfSUZUUlVFIDoKKwkJCQkJICBDTURfVFhfUEtUIHwgQlJBTkNIX0lGVFJVRSkgfCBsZW4pOworI2VuZGlmCisKKwkvKiBOb24teDg2IFRvZG86IGV4cGxpY2l0bHkgZmx1c2ggY2FjaGUgbGluZXMgaGVyZS4gKi8KKworCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwlpb3dyaXRlMzIoMHgxMDAwMTAwMCwgeXAtPmJhc2UgKyBUeEN0cmwpOworCisJaWYgKHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPCBUWF9RVUVVRV9TSVpFKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsJCS8qIFR5cGljYWwgcGF0aCAqLworCWVsc2UKKwkJeXAtPnR4X2Z1bGwgPSAxOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gdHJhbnNtaXQgZnJhbWUgIyVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHllbGxvd2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXA7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCQkJLyogQ2FuIG5ldmVyIG9jY3VyLiAqLworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJ5ZWxsb3dmaW5faW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorI2VuZGlmCisKKwl5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0geXAtPmJhc2U7CisJCisJc3Bpbl9sb2NrICgmeXAtPmxvY2spOworCisJZG8geworCQl1MTYgaW50cl9zdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBJbnRyQ2xlYXIpOworCisJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCisJCWlmIChpbnRyX3N0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhEb25lIHwgSW50ckVhcmx5UngpKSB7CisJCQl5ZWxsb3dmaW5fcngoZGV2KTsKKwkJCWlvd3JpdGUzMigweDEwMDAxMDAwLCBpb2FkZHIgKyBSeEN0cmwpOwkJLyogV2FrZSBSeCBlbmdpbmUuICovCisJCX0KKworI2lmZGVmIE5PX1RYU1RBVFMKKwkJZm9yICg7IHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPiAwOyB5cC0+ZGlydHlfdHgrKykgeworCQkJaW50IGVudHJ5ID0geXAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHlwLT50eF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID09IDApCisJCQkJYnJlYWs7CisJCQlza2IgPSB5cC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCXlwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQl5cC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCB5cC0+dHhfcmluZ1tlbnRyeV0uYWRkciwKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQl9CisJCWlmICh5cC0+dHhfZnVsbAorCQkJJiYgeXAtPmN1cl90eCAtIHlwLT5kaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUgLSA0KSB7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQl5cC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKyNlbHNlCisJCWlmICgoaW50cl9zdGF0dXMgJiBJbnRyVHhEb25lKSB8fCAoeXAtPnR4X3RhaWxfZGVzYy0+dHhfZXJycykpIHsKKwkJCXVuc2lnbmVkIGRpcnR5X3R4ID0geXAtPmRpcnR5X3R4OworCisJCQlmb3IgKGRpcnR5X3R4ID0geXAtPmRpcnR5X3R4OyB5cC0+Y3VyX3R4IC0gZGlydHlfdHggPiAwOworCQkJCSBkaXJ0eV90eCsrKSB7CisJCQkJLyogVG9kbzogb3B0aW1pemUgdGhpcy4gKi8KKwkJCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQl1MTYgdHhfZXJycyA9IHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnM7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDUpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggcXVldWUgJWQgY2hlY2ssIFR4IHN0YXR1cyAiCisJCQkJCQkgICAiJTQuNHggJTQuNHggJTQuNHggJTQuNHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2NudCwKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnMsCisJCQkJCQkgICB5cC0+dHhfc3RhdHVzW2VudHJ5XS50b3RhbF90eF9jbnQsCisJCQkJCQkgICB5cC0+dHhfc3RhdHVzW2VudHJ5XS5wYXVzZWQpOworI2VuZGlmCisJCQkJaWYgKHR4X2VycnMgPT0gMCkKKwkJCQkJYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKwkJCQlza2IgPSB5cC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCQlpZiAodHhfZXJycyAmIDB4RjgxMCkgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCB0eF9lcnJzKTsKKyNlbmRpZgorCQkJCQl5cC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmICh0eF9lcnJzICYgMHhGODAwKSB5cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X2VycnMgJiAweDA4MDApIHlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAodHhfZXJycyAmIDB4MjAwMCkgeXAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X2VycnMgJiAweDgwMDApIHlwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vcm1hbCB0cmFuc21pdCwgVHggc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHR4X2VycnMpOworI2VuZGlmCisJCQkJCXlwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJeXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhfZXJycyAmIDE1OworCQkJCQl5cC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCX0KKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJcGNpX3VubWFwX3NpbmdsZSh5cC0+cGNpX2RldiwgCisJCQkJCXlwLT50eF9yaW5nW2VudHJ5PDwxXS5hZGRyLCBza2ItPmxlbiwgCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSAwOworCQkJCS8qIE1hcmsgc3RhdHVzIGFzIGVtcHR5LiAqLworCQkJCXlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnMgPSAwOworCQkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmICh5cC0+Y3VyX3R4IC0gZGlydHlfdHggPiBUWF9SSU5HX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQsIGZ1bGw9JWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB5cC0+Y3VyX3R4LCB5cC0+dHhfZnVsbCk7CisJCQkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCQkJfQorI2VuZGlmCisKKwkJCWlmICh5cC0+dHhfZnVsbAorCQkJCSYmIHlwLT5jdXJfdHggLSBkaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUgLSAyKSB7CisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQkJCXlwLT50eF9mdWxsID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9CisKKwkJCXlwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJeXAtPnR4X3RhaWxfZGVzYyA9ICZ5cC0+dHhfc3RhdHVzW2RpcnR5X3R4ICUgVFhfUklOR19TSVpFXTsKKwkJfQorI2VuZGlmCisKKwkJLyogTG9nIGVycm9ycyBhbmQgb3RoZXIgdW5jb21tb24gZXZlbnRzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiAweDJlZSkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS4gKi8KKwkJCXllbGxvd2Zpbl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJCSAgICJzdGF0dXM9MHglNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisKKwlzcGluX3VubG9jayAoJnlwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYnV0IHNlcGFyYXRlZAorICAgZm9yIGNsYXJpdHkgYW5kIGJldHRlciByZWdpc3RlciBhbGxvY2F0aW9uLiAqLworc3RhdGljIGludCB5ZWxsb3dmaW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB5cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IHlwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHlwLT5jdXJfcng7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIHllbGxvd2Zpbl9yeCgpLCBlbnRyeSAlZCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZW50cnksIHlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICMlZCBkZXNjLiAlOC44eCAlOC44eCAlOC44eC5cbiIsCisJCQkgICBlbnRyeSwgeXAtPnJ4X3JpbmdbZW50cnldLmRiZG1hX2NtZCwgeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsCisJCQkgICB5cC0+cnhfcmluZ1tlbnRyeV0ucmVzdWx0X3N0YXR1cyk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHllbGxvd2Zpbl9kZXNjICpkZXNjID0gJnlwLT5yeF9yaW5nW2VudHJ5XTsKKwkJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYiA9IHlwLT5yeF9za2J1ZmZbZW50cnldOworCQlzMTYgZnJhbWVfc3RhdHVzOworCQl1MTYgZGVzY19zdGF0dXM7CisJCWludCBkYXRhX3NpemU7CisJCXU4ICpidWZfYWRkcjsKKworCQlpZighZGVzYy0+cmVzdWx0X3N0YXR1cykKKwkJCWJyZWFrOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeXAtPnBjaV9kZXYsIGRlc2MtPmFkZHIsCisJCQl5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXNjX3N0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPnJlc3VsdF9zdGF0dXMpID4+IDE2OworCQlidWZfYWRkciA9IHJ4X3NrYi0+dGFpbDsKKwkJZGF0YV9zaXplID0gKGxlMzJfdG9fY3B1KGRlc2MtPmRiZG1hX2NtZCkgLSAKKwkJCWxlMzJfdG9fY3B1KGRlc2MtPnJlc3VsdF9zdGF0dXMpKSAmIDB4ZmZmZjsKKwkJZnJhbWVfc3RhdHVzID0gbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoczE2KikmKGJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDJdKSkpOworCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIHllbGxvd2Zpbl9yeCgpIHN0YXR1cyB3YXMgJTQuNHguXG4iLAorCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoICEgKGRlc2Nfc3RhdHVzICYgUlhfRU9QKSkgeworCQkJaWYgKGRhdGFfc2l6ZSAhPSAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgc3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCIKKwkJCQkJICAgIiBzdGF0dXMgJTQuNHgsIGRhdGFfc2l6ZSAlZCFcbiIsIGRldi0+bmFtZSwgZGVzY19zdGF0dXMsIGRhdGFfc2l6ZSk7CisJCQl5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgaWYgKCh5cC0+ZHJ2X2ZsYWdzICYgSXNHaWdhYml0KSAgJiYgIChmcmFtZV9zdGF0dXMgJiAweDAwMzgpKSB7CisJCQkvKiBUaGVyZSB3YXMgYSBlcnJvci4gKi8KKwkJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIHllbGxvd2Zpbl9yeCgpIFJ4IGVycm9yIHdhcyAlNC40eC5cbiIsCisJCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCQl5cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDYwKSB5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwOCkgeXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMCkgeXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgPCAwKSB5cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgaWYgKCAhKHlwLT5kcnZfZmxhZ3MgJiBJc0dpZ2FiaXQpICAmJgorCQkJCSAgICgoYnVmX2FkZHJbZGF0YV9zaXplLTFdICYgMHg4NSkgfHwgYnVmX2FkZHJbZGF0YV9zaXplLTJdICYgMHhDMCkpIHsKKwkJCXU4IHN0YXR1czEgPSBidWZfYWRkcltkYXRhX3NpemUtMl07CisJCQl1OCBzdGF0dXMyID0gYnVmX2FkZHJbZGF0YV9zaXplLTFdOworCQkJeXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1czEgJiAweEMwKSB5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHN0YXR1czIgJiAweDAzKSB5cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMiAmIDB4MDQpIHlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMiAmIDB4ODApIHlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisjaWZkZWYgWUZfUFJPVE9UWVBFCQkvKiBTdXBwb3J0IGZvciBwcm90b3R5cGUgaGFyZHdhcmUgZXJyYXRhLiAqLworCQl9IGVsc2UgaWYgKCh5cC0+ZmxhZ3MgJiBIYXNNQUNBZGRyQnVnKSAgJiYKKwkJCW1lbWNtcChsZTMyX3RvX2NwdSh5cC0+cnhfcmluZ19kbWEgKworCQkJCWVudHJ5KnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpKSwKKwkJCQlkZXYtPmRldl9hZGRyLCA2KSAhPSAwICYmIAorCQkJbWVtY21wKGxlMzJfdG9fY3B1KHlwLT5yeF9yaW5nX2RtYSArCisJCQkJZW50cnkqc2l6ZW9mKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYykpLAorCQkJCSJcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciLCA2KSAhPSAwKSB7CisJCQlpZiAoYm9ndXNfcngrKyA9PSAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgZnJhbWUgdG8gJTIuMng6JTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkgICAiJTIuMng6JTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGJ1Zl9hZGRyWzBdLCBidWZfYWRkclsxXSwgYnVmX2FkZHJbMl0sCisJCQkJCSAgIGJ1Zl9hZGRyWzNdLCBidWZfYWRkcls0XSwgYnVmX2FkZHJbNV0pOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJaW50IHBrdF9sZW4gPSBkYXRhX3NpemUgLQorCQkJCSh5cC0+Y2hpcF9pZCA/IDcgOiA4ICsgYnVmX2FkZHJbZGF0YV9zaXplIC0gOF0pOworCQkJLyogVG8gdmVyaWZ5OiBZZWxsb3dmaW4gTGVuZ3RoIHNob3VsZCBvbWl0IHRoZSBDUkMhICovCisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgeWVsbG93ZmluX3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJCSAgICIgb2YgJWQsIGJvZ3VzX2NudCAlZC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIGRhdGFfc2l6ZSwgYm9ndXNjbnQpOworI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGp1c3QgcGFzcyB1cCB0aGUgc2tidWZmCisJCQkgICB3aXRob3V0IGNvcHlpbmcgdG8gYSBwcm9wZXJseSBzaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA+IHJ4X2NvcHlicmVhaykgeworCQkJCXNrYl9wdXQoc2tiID0gcnhfc2tiLCBwa3RfbGVuKTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCAKKwkJCQkJeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsIAorCQkJCQl5cC0+cnhfYnVmX3N6LCAKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQl5cC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOworCQkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHJ4X3NrYi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh5cC0+cGNpX2RldiwgZGVzYy0+YWRkciwKKwkJCQkJCQkJCQkJICAgeXAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXlwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl5cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK3lwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyB5cC0+Y3VyX3J4IC0geXAtPmRpcnR5X3J4ID4gMDsgeXAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSB5cC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmICh5cC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYih5cC0+cnhfYnVmX3N6KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsJCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKwkJCXlwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwKKwkJCQlza2ItPnRhaWwsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQl9CisJCXlwLT5yeF9yaW5nW2VudHJ5XS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCQlpZiAoZW50cnkgIT0gMCkKKwkJCXlwLT5yeF9yaW5nW2VudHJ5IC0gMV0uZGJkbWFfY21kID0KKwkJCQljcHVfdG9fbGUzMihDTURfUlhfQlVGIHwgSU5UUl9BTFdBWVMgfCB5cC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJeXAtPnJ4X3JpbmdbUlhfUklOR19TSVpFIC0gMV0uZGJkbWFfY21kID0KKwkJCQljcHVfdG9fbGUzMihDTURfUlhfQlVGIHwgSU5UUl9BTFdBWVMgfCBCUkFOQ0hfQUxXQVlTCisJCQkJCQkJfCB5cC0+cnhfYnVmX3N6KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeWVsbG93ZmluX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICU0LjR4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJLyogSG1tbW1tLCBpdCdzIG5vdCBjbGVhciB3aGF0IHRvIGRvIGhlcmUuICovCisJaWYgKGludHJfc3RhdHVzICYgKEludHJUeFBDSUVyciB8IEludHJUeFBDSUZhdWx0KSkKKwkJeXAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhQQ0lFcnIgfCBJbnRyUnhQQ0lGYXVsdCkpCisJCXlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKK30KKworc3RhdGljIGludCB5ZWxsb3dmaW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHlwLT5iYXNlOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgVHggJTQuNHggIgorCQkJICAgIlJ4ICU0LjR4IEludCAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDE2KGlvYWRkciArIFJ4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsICBSeCAlZCAvICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgeXAtPmRpcnR5X3R4LCB5cC0+Y3VyX3J4LCB5cC0+ZGlydHlfcngpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgUnhDdHJsKTsKKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgVHhDdHJsKTsKKworCWRlbF90aW1lcigmeXAtPnRpbWVyKTsKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44bGx4OlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXlwLT50eF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkUqMjsgaSsrKQorCQkJcHJpbnRrKCIgJWMgIyVkIGRlc2MuICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBUeFB0cikgPT0gKGxvbmcpJnlwLT50eF9yaW5nW2ldID8gJz4nIDogJyAnLAorCQkJCSAgIGksIHlwLT50eF9yaW5nW2ldLmRiZG1hX2NtZCwgeXAtPnR4X3JpbmdbaV0uYWRkciwKKwkJCQkgICB5cC0+dHhfcmluZ1tpXS5icmFuY2hfYWRkciwgeXAtPnR4X3JpbmdbaV0ucmVzdWx0X3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFR4IHN0YXR1cyAlcDpcbiIsIHlwLT50eF9zdGF0dXMpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAgICMlZCBzdGF0dXMgJTQuNHggJTQuNHggJTQuNHggJTQuNHguXG4iLAorCQkJCSAgIGksIHlwLT50eF9zdGF0dXNbaV0udHhfY250LCB5cC0+dHhfc3RhdHVzW2ldLnR4X2VycnMsCisJCQkJICAgeXAtPnR4X3N0YXR1c1tpXS50b3RhbF90eF9jbnQsIHlwLT50eF9zdGF0dXNbaV0ucGF1c2VkKTsKKworCQlwcmludGsoIlxuIktFUk5fREVCVUcgIiAgUnggcmluZyAlOC44bGx4OlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXlwLT5yeF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlYyAjJWQgZGVzYy4gJTguOHggJTguOHggJTguOHhcbiIsCisJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgUnhQdHIpID09IChsb25nKSZ5cC0+cnhfcmluZ1tpXSA/ICc+JyA6ICcgJywKKwkJCQkgICBpLCB5cC0+cnhfcmluZ1tpXS5kYmRtYV9jbWQsIHlwLT5yeF9yaW5nW2ldLmFkZHIsCisJCQkJICAgeXAtPnJ4X3JpbmdbaV0ucmVzdWx0X3N0YXR1cyk7CisJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNikgeworCQkJCWlmIChnZXRfdW5hbGlnbmVkKCh1OCopeXAtPnJ4X3JpbmdbaV0uYWRkcikgIT0gMHg2OSkgeworCQkJCQlpbnQgajsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDB4NTA7IGorKykKKwkJCQkJCXByaW50aygiICU0LjR4IiwKKwkJCQkJCQkgICBnZXRfdW5hbGlnbmVkKCgodTE2Kil5cC0+cnhfcmluZ1tpXS5hZGRyKSArIGopKTsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyBkZWJ1Z2dpbmcgb25seSAqLworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXlwLT5yeF9yaW5nW2ldLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKKwkJeXAtPnJ4X3JpbmdbaV0uYWRkciA9IDB4QkFERjAwRDA7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHlwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCWRldl9rZnJlZV9za2IoeXAtPnJ4X3NrYnVmZltpXSk7CisJCX0KKwkJeXAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoeXAtPnR4X3NrYnVmZltpXSkKKwkJCWRldl9rZnJlZV9za2IoeXAtPnR4X3NrYnVmZltpXSk7CisJCXlwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKworI2lmZGVmIFlGX1BST1RPVFlQRQkJCS8qIFN1cHBvcnQgZm9yIHByb3RvdHlwZSBoYXJkd2FyZSBlcnJhdGEuICovCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlZCAlZCBmcmFtZXMgdGhhdCB3ZSBzaG91bGQgbm90IGhhdmUuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBib2d1c19yeCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp5ZWxsb3dmaW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZ5cC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLiAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJdTE2IGNmZ192YWx1ZSA9IGlvcmVhZDE2KGlvYWRkciArIENuZmcpOworCisJLyogU3RvcCB0aGUgUnggcHJvY2VzcyB0byBjaGFuZ2UgYW55IHZhbHVlLiAqLworCWlvd3JpdGUxNihjZmdfdmFsdWUgJiB+MHgxMDAwLCBpb2FkZHIgKyBDbmZnKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQlpb3dyaXRlMTYoMHgwMDBGLCBpb2FkZHIgKyBBZGRyTW9kZSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDY0KSAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgd2VsbCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlpb3dyaXRlMTYoMHgwMDBCLCBpb2FkZHIgKyBBZGRyTW9kZSk7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID4gMCkgeyAvKiBNdXN0IHVzZSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkJaW50IGk7CisJCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJdW5zaWduZWQgaW50IGJpdDsKKworCQkJLyogRHVlIHRvIGEgYnVnIGluIHRoZSBlYXJseSBjaGlwIHZlcnNpb25zLCBtdWx0aXBsZSBmaWx0ZXIKKwkJCSAgIHNsb3RzIG11c3QgYmUgc2V0IGZvciBlYWNoIGFkZHJlc3MuICovCisJCQlpZiAoeXAtPmRydl9mbGFncyAmIEhhc011bHRpY2FzdEJ1ZykgeworCQkJCWJpdCA9IChldGhlcl9jcmNfbGUoMywgbWNsaXN0LT5kbWlfYWRkcikgPj4gMykgJiAweDNmOworCQkJCWhhc2hfdGFibGVbYml0ID4+IDRdIHw9ICgxIDw8IGJpdCk7CisJCQkJYml0ID0gKGV0aGVyX2NyY19sZSg0LCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAzKSAmIDB4M2Y7CisJCQkJaGFzaF90YWJsZVtiaXQgPj4gNF0gfD0gKDEgPDwgYml0KTsKKwkJCQliaXQgPSAoZXRoZXJfY3JjX2xlKDUsIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDMpICYgMHgzZjsKKwkJCQloYXNoX3RhYmxlW2JpdCA+PiA0XSB8PSAoMSA8PCBiaXQpOworCQkJfQorCQkJYml0ID0gKGV0aGVyX2NyY19sZSg2LCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAzKSAmIDB4M2Y7CisJCQloYXNoX3RhYmxlW2JpdCA+PiA0XSB8PSAoMSA8PCBiaXQpOworCQl9CisJCS8qIENvcHkgdGhlIGhhc2ggdGFibGUgdG8gdGhlIGNoaXAuICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlpb3dyaXRlMTYoaGFzaF90YWJsZVtpXSwgaW9hZGRyICsgSGFzaFRibCArIGkqMik7CisJCWlvd3JpdGUxNigweDAwMDMsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgewkJCQkJLyogTm9ybWFsLCB1bmljYXN0L2Jyb2FkY2FzdC1vbmx5IG1vZGUuICovCisJCWlvd3JpdGUxNigweDAwMDEsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9CisJLyogUmVzdGFydCB0aGUgUnggcHJvY2Vzcy4gKi8KKwlpb3dyaXRlMTYoY2ZnX3ZhbHVlIHwgMHgxMDAwLCBpb2FkZHIgKyBDbmZnKTsKK30KKworc3RhdGljIHZvaWQgeWVsbG93ZmluX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHllbGxvd2Zpbl9nZXRfZHJ2aW5mbworfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSBucC0+cGh5c1swXSAmIDB4MWY7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZChpb2FkZHIsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSBucC0+cGh5c1swXSkgeworCQkJdTE2IHZhbHVlID0gZGF0YS0+dmFsX2luOworCQkJc3dpdGNoIChkYXRhLT5yZWdfbnVtKSB7CisJCQljYXNlIDA6CisJCQkJLyogQ2hlY2sgZm9yIGF1dG9uZWdvdGlhdGlvbiBvbiBvciByZXNldC4gKi8KKwkJCQlucC0+bWVkaWFsb2NrID0gKHZhbHVlICYgMHg5MDAwKSA/IDAgOiAxOworCQkJCWlmIChucC0+bWVkaWFsb2NrKQorCQkJCQlucC0+ZnVsbF9kdXBsZXggPSAodmFsdWUgJiAweDAxMDApID8gMSA6IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IG5wLT5hZHZlcnRpc2luZyA9IHZhbHVlOyBicmVhazsKKwkJCX0KKwkJCS8qIFBlcmhhcHMgY2hlY2tfZHVwbGV4KGRldiksIGRlcGVuZGluZyBvbiBjaGlwIHNlbWFudGljcy4gKi8KKwkJfQorCQltZGlvX3dyaXRlKGlvYWRkciwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHllbGxvd2Zpbl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqbnA7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgU1RBVFVTX1RPVEFMX1NJWkUsIG5wLT50eF9zdGF0dXMsIAorCQlucC0+dHhfc3RhdHVzX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLCBucC0+dHhfcmluZ19kbWEpOworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgbnAtPmJhc2UpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHllbGxvd2Zpbl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0geWVsbG93ZmluX3BjaV90YmwsCisJLnByb2JlCQk9IHllbGxvd2Zpbl9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHllbGxvd2Zpbl9yZW1vdmVfb25lKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgeWVsbG93ZmluX2luaXQgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmeWVsbG93ZmluX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHllbGxvd2Zpbl9jbGVhbnVwICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnllbGxvd2Zpbl9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHllbGxvd2Zpbl9pbml0KTsKK21vZHVsZV9leGl0KHllbGxvd2Zpbl9jbGVhbnVwKTsKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIHllbGxvd2Zpbi5jIgorICogIGNvbXBpbGUtY29tbWFuZC1hbHBoYUxYOiAiZ2NjIC1ETU9EVUxFIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1jIHllbGxvd2Zpbi5jIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1tbm8tZnAtcmVncyAtV2EsLW0yMTE2NGEgLURCV1hfVVNBQkxFIC1EQldJT19FTkFCTEVEIgorICogIHNpbXBsZS1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLU82IC1jIHllbGxvd2Zpbi5jIgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvem5ldC5jIGIvZHJpdmVycy9uZXQvem5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzA0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC96bmV0LmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIHpuZXQuYzogQW4gWmVuaXRoIFotTm90ZSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworCisvKgorCVdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlci4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbS4KKwlUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgTGludXggc2tlbGV0b24gZHJpdmVyLiAgVGhlIGNvcHlyaWdodCBvZiB0aGUKKwlza2VsZXRvbiBkcml2ZXIgaXMgaGVsZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LCBhcyByZXByZXNlbnRlZAorCWJ5IERJUk5TQSwgYW5kIGl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGFua3MgdG8gTWlrZSBIb2xsaWNrIGZvciBhbHBoYSB0ZXN0aW5nIGFuZCBzdWdnZXN0aW9ucy4KKworICBSZWZlcmVuY2VzOgorCSAgIFRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4KKworCSAgIjgyNTkzIENTTUEvQ0QgQ29yZSBMQU4gQ29udHJvbGxlciIgSW50ZWwgZGF0YXNoZWV0LCAxOTkyCisJICBJbnRlbCBNaWNyb2NvbW11bmljYXRpb25zIERhdGFib29rLCBWb2wuIDEsIDE5OTAuCisgICAgQXMgdXN1YWwgd2l0aCBJbnRlbCwgdGhlIGRvY3VtZW50YXRpb24gaXMgaW5jb21wbGV0ZSBhbmQgaW5hY2N1cmF0ZS4KKwlJIGhhZCB0byByZWFkIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlciB0byBmaWd1cmUgb3V0IGhvdyB0byBhY3R1YWxseQorCXVzZSB0aGUgaTgyNTkzLCBhbmQgZ3Vlc3MgYXQgd2hhdCByZWdpc3RlciBiaXRzIG1hdGNoZWQgdGhlIGxvb3NlbHkKKwlyZWxhdGVkIGk4MjU4Ni4KKworCQkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKKwlUaGUgaTgyNTkzIHVzZWQgaW4gdGhlIFplbml0aCBaLU5vdGUgc2VyaWVzIG9wZXJhdGVzIHVzaW5nIHR3byghKSBzbGF2ZQorCURNQQljaGFubmVscywgb25lIGludGVycnVwdCwgYW5kIG9uZSA4LWJpdCBJL08gcG9ydC4KKworCVdoaWxlIHRoZXJlCXNldmVyYWwgd2F5cyB0byBjb25maWd1cmUgJzU5MyBETUEgc3lzdGVtLCBJIGNob3NlIHRoZSBvbmUKKwl0aGF0IHNlZW1lZCBjb21tZW5zdXJhdGUgd2l0aCB0aGUgaGlnaGVzdCBzeXN0ZW0gcGVyZm9ybWFuY2UgaW4gdGhlIGZhY2UKKwlvZiBtb2RlcmF0ZSBpbnRlcnJ1cHQgbGF0ZW5jeTogQm90aCBETUEgY2hhbm5lbHMgYXJlIGNvbmZpZ3VyZWQgYXMKKwlyZWNpcmN1bGF0aW5nIHJpbmcgYnVmZmVycywgd2l0aCBvbmUgY2hhbm5lbCAoIzApIGRlZGljYXRlZCB0byBSeCBhbmQKKwl0aGUgb3RoZXIgY2hhbm5lbCAoIzEpIHRvIFR4IGFuZCBjb25maWd1cmF0aW9uLiAgKE5vdGUgdGhhdCB0aGlzIGlzCisJZGlmZmVyZW50IHRoYW4gdGhlIENyeW53ciBkcml2ZXIsIHdoZXJlIHRoZSBUeCBETUEgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorCWJlZm9yZSBlYWNoIG9wZXJhdGlvbi4gIFRoYXQgYXBwcm9hY2ggc2ltcGxpZmllcyBvcGVyYXRpb24gYW5kIFR4IGVycm9yCisJcmVjb3ZlcnksIGJ1dCByZXF1aXJlcyBhZGRpdGlvbmFsIEkvTyBpbiBub3JtYWwgb3BlcmF0aW9uIGFuZCBwcmVjbHVkZXMKKwl0cmFuc21pdCBidWZmZXIJY2hhaW5pbmcuKQorCisJQm90aCByaW5ncyBhcmUgc2V0IHRvIDgxOTIgYnl0ZXMgdXNpbmcge1RYLFJYfV9SSU5HX1NJWkUuICBUaGlzIHByb3ZpZGVzCisJYSByZWFzb25hYmxlIHJpbmcgc2l6ZSBmb3IgUngsIHdoaWxlIHNpbXBsaWZ5aW5nIERNQSBidWZmZXIgYWxsb2NhdGlvbiAtLQorCURNQSBidWZmZXJzIG11c3Qgbm90IGNyb3NzIGEgMTI4SyBib3VuZGFyeS4gIChJbiB0cnV0aCB0aGUgc2l6ZSBzZWxlY3Rpb24KKwl3YXMgaW5mbHVlbmNlZCBieSBteSBsYWNrIG9mICc1OTMgZG9jdW1lbnRhdGlvbi4gIEkgdGh1cyB3YXMgY29uc3RyYWluZWQKKwl0byB1c2UgdGhlIENyeW53ciAnNTkzIGluaXRpYWxpemF0aW9uIHRhYmxlLCB3aGljaCBzZXRzIHRoZSBSeCByaW5nIHNpemUKKwl0byA4Sy4pCisKKwlEZXNwaXRlIG15IHVzdWFsIGxvdyBvcGluaW9uIGFib3V0IEludGVsLWRlc2lnbmVkIHBhcnRzLCBJIG11c3QgYWRtaXQKKwl0aGF0IHRoZSBidWxrIGRhdGEgaGFuZGxpbmcgb2YgdGhlIGk4MjU5MyBpcyBhIGdvb2QgZGVzaWduIGZvcgorCWFuIGludGVncmF0ZWQgc3lzdGVtLCBsaWtlIGEgbGFwdG9wLCB3aGVyZSB1c2luZyB0d28gc2xhdmUgRE1BIGNoYW5uZWxzCisJZG9lc24ndCBwb3NlIGEgcHJvYmxlbS4gIEkgc3RpbGwgdGFrZSBpc3N1ZSB3aXRoIHVzaW5nIG9ubHkgYSBzaW5nbGUgSS9PCisJcG9ydC4gIEluIHRoZSBzYW1lIGNvbnRyb2xsZWQgZW52aXJvbm1lbnQgdGhlcmUgYXJlIGVzc2VudGlhbGx5IG5vCisJbGltaXRhdGlvbnMgb24gSS9PIHNwYWNlLCBhbmQgdXNpbmcgbXVsdGlwbGUgbG9jYXRpb25zIHdvdWxkIGVsaW1pbmF0ZQorCXRoZQluZWVkIGZvciBtdWx0aXBsZSBvcGVyYXRpb25zIHdoZW4gbG9va2luZyBhdCBzdGF0dXMgcmVnaXN0ZXJzLAorCXNldHRpbmcgdGhlIFJ4IHJpbmcgYm91bmRhcnksIG9yIHN3aXRjaGluZyB0byBwcm9taXNjdW91cyBtb2RlLgorCisJSSBhbHNvIHF1ZXN0aW9uIFplbml0aCdzIHNlbGVjdGlvbiBvZiB0aGUgJzU5Mzogb25lIG9mIHRoZSBhZHZlcnRpc2VkCisJYWR2YW50YWdlcyBvZiBlYXJsaWVyIEludGVsIHBhcnRzIHdhcyB0aGF0IGlmIHlvdSBmaWd1cmVkIG91dCB0aGUgbWFnaWMKKwlpbml0aWFsaXphdGlvbiBpbmNhbnRhdGlvbiB5b3UgY291bGQgdXNlIHRoZSBzYW1lIHBhcnQgb24gbWFueSBkaWZmZXJlbnQKKwluZXR3b3JrIHR5cGVzLiAgWmVuaXRoJ3MgdXNlIG9mIHRoZSAiRnJpZW5kbHlOZXQiIChzaWMpIGNvbm5lY3RvciByYXRoZXIKKwl0aGFuIGFuCW9uLWJvYXJkIHRyYW5zY2VpdmVyIGxlYWRzIG1lIHRvIGJlbGlldmUgdGhhdCB0aGV5IHdlcmUgcGxhbm5pbmcKKwl0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLiAgQnV0LCB1aG1tbSwgdGhlICc1OTMgb21pdHMgYWxsIGJ1dCBldGhlcm5ldAorCWZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgc2VyaWFsIHN1YnN5c3RlbS4KKyAqLworCisvKiAxMC8yMDAyCisKKyAgIG8gUmVzdXJlY3RlZCBmb3IgTGludXggMi41KyBieSBNYXJjIFp5bmdpZXIgPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPiA6CisKKyAgIC0gUmVtb3ZlZCBzdHJhbmdlIERNQSBzbm9vcGluZyBpbiB6bmV0X3NlbnRfcGFja2V0LCB3aGljaCBsZWFkIHRvCisgICAgIFRYIGJ1ZmZlciBjb3JydXB0aW9uIG9uIG15IGxhcHRvcC4KKyAgIC0gVXNlIGluaXRfZXRoZXJkZXYgc3R1ZmYuCisgICAtIFVzZSBrbWFsbG9jLWVkIERNQSBidWZmZXJzLgorICAgLSBVc2UgYXMgZmV3IGdsb2JhbCB2YXJpYWJsZXMgYXMgcG9zc2libGUuCisgICAtIFVzZSBwcm9wZXIgcmVzb3VyY2VzIG1hbmFnZW1lbnQuCisgICAtIFVzZSB3aXJlbGVzcy9pODI1OTMuaCBhcyBtdWNoIGFzIHBvc3NpYmxlIChzdHJ1Y3R1cmUsIGNvbnN0YW50cykKKyAgIC0gQ29tcGlsZXMgYXMgbW9kdWxlIG9yIGJ1aWxkLWluLgorICAgLSBOb3cgc3Vydml2ZXMgdW5wbHVnZ2luZy9yZXBsdWdnaW5nIGNhYmxlLgorCisgICBTb21lIGNvZGUgd2FzIHRha2VuIGZyb20gd2F2ZWxhbl9jcy4KKyAgIAorICAgVGVzdGVkIG9uIGEgdmludGFnZSBaZW5pdGggWi1Ob3RlIDQzM0xucCsuIFByb2JhYmx5IGJyb2tlbiBvbgorICAgYW55dGhpbmcgZWxzZS4gVGVzdGVycyAoYW5kIGRldGFpbGVkIGJ1ZyByZXBvcnRzKSBhcmUgd2VsY29tZSA6LSkuCisKKyAgIG8gVE9ETyA6CisKKyAgIC0gUHJvcGVybHkgaGFuZGxlIG11bHRpY2FzdAorICAgLSBVbmRlcnN0YW5kIHdoeSBzb21lIHRyYWZmaWMgcGF0dGVybnMgYWRkIGEgMXMgbGF0ZW5jeS4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisvKiBUaGlzIGluY2x1ZGUgY291bGQgYmUgZWxzZXdoZXJlLCBzaW5jZSBpdCBpcyBub3Qgd2lyZWxlc3Mgc3BlY2lmaWMgKi8KKyNpbmNsdWRlICJ3aXJlbGVzcy9pODI1OTMuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiem5ldC5jOnYxLjAyIDkvMjMvOTQgYmVja2VyQHNjeWxkLmNvbVxuIjsKKworI2lmbmRlZiBaTkVUX0RFQlVHCisjZGVmaW5lIFpORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHpuZXRfZGVidWcgPSBaTkVUX0RFQlVHOworbW9kdWxlX3BhcmFtICh6bmV0X2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoem5ldF9kZWJ1ZywgIlpOZXQgZGVidWcgbGV2ZWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhlIERNQSBtb2RlcyB3ZSBuZWVkIGFyZW4ndCBpbiA8ZG1hLmg+LiAqLworI2RlZmluZSBETUFfUlhfTU9ERQkJMHgxNAkvKiBBdXRvIGluaXQsIEkvTyB0byBtZW0sICsrLCBkZW1hbmQuICovCisjZGVmaW5lIERNQV9UWF9NT0RFCQkweDE4CS8qIEF1dG8gaW5pdCwgTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgZG1hX3BhZ2VfZXEocHRyMSwgcHRyMikgKChsb25nKShwdHIxKT4+MTcgPT0gKGxvbmcpKHB0cjIpPj4xNykKKyNkZWZpbmUgUlhfQlVGX1NJWkUgODE5MgorI2RlZmluZSBUWF9CVUZfU0laRSA4MTkyCisjZGVmaW5lIERNQV9CVUZfU0laRSAoUlhfQlVGX1NJWkUgKyAxNikJLyogOGsgKyAxNiBieXRlcyBmb3IgdHJhaWxlcnMgKi8KKworI2RlZmluZSBUWF9USU1FT1VUCTEwCisKK3N0cnVjdCB6bmV0X3ByaXZhdGUgeworCWludCByeF9kbWEsIHR4X2RtYTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisJc2hvcnQgc2lhX2Jhc2UsIHNpYV9zaXplLCBpb19zaXplOworCXN0cnVjdCBpODI1OTNfY29uZl9ibG9jayBpNTkzX2luaXQ7CisJLyogVGhlIHN0YXJ0aW5nLCBjdXJyZW50LCBhbmQgZW5kIHBvaW50ZXJzIGZvciB0aGUgcGFja2V0IGJ1ZmZlcnMuICovCisJdXNob3J0ICpyeF9zdGFydCwgKnJ4X2N1ciwgKnJ4X2VuZDsKKwl1c2hvcnQgKnR4X3N0YXJ0LCAqdHhfY3VyLCAqdHhfZW5kOworCXVzaG9ydCB0eF9idWZfbGVuOwkJCS8qIFR4IGJ1ZmZlciBsZW5ndGgsIGluIHdvcmRzLiAqLworfTsKKworLyogT25seSBvbmUgY2FuIGJlIGJ1aWx0LWluOy0+ICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnpuZXRfZGV2OworCitzdHJ1Y3QgbmV0aWRibGsgeworCWNoYXIgbWFnaWNbOF07CQkvKiBUaGUgbWFnaWMgbnVtYmVyIChzdHJpbmcpICJORVRJREJMSyIgKi8KKwl1bnNpZ25lZCBjaGFyIG5ldGlkWzhdOyAvKiBUaGUgcGh5c2ljYWwgc3RhdGlvbiBhZGRyZXNzICovCisJY2hhciBuZXR0eXBlLCBnbG9iYWxvcHQ7CisJY2hhciB2ZW5kb3JbOF07CQkvKiBUaGUgbWFjaGluZSB2ZW5kb3IgYW5kIHByb2R1Y3QgbmFtZS4gKi8KKwljaGFyIHByb2R1Y3RbOF07CisJY2hhciBpcnExLCBpcnEyOwkJLyogSW50ZXJydXB0cywgb25seSBvbmUgaXMgY3VycmVudGx5IHVzZWQuCSovCisJY2hhciBkbWExLCBkbWEyOworCXNob3J0IGRtYV9tZW1fbWlzY1s4XTsJCS8qIERNQSBidWZmZXIgbG9jYXRpb25zICh1bnVzZWQgaW4gTGludXgpLiAqLworCXNob3J0IGlvYmFzZTEsIGlvc2l6ZTE7CisJc2hvcnQgaW9iYXNlMiwgaW9zaXplMjsJCS8qIFNlY29uZCBpb2Jhc2UgdW51c2VkLiAqLworCWNoYXIgZHJpdmVyX29wdGlvbnM7CQkJLyogTWlzYy4gYml0cyAqLworCWNoYXIgcGFkOworfTsKKworc3RhdGljIGludAl6bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXpuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgem5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZAl6bmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl6bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGFyZHdhcmVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdG9wX2hpdChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIHNob3J0IHJ4X3N0b3Bfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHpuZXRfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFJlcXVlc3QgbmVlZGVkIHJlc291cmNlcyAqLworc3RhdGljIGludCB6bmV0X3JlcXVlc3RfcmVzb3VyY2VzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJaWYgKHJlcXVlc3RfaXJxIChkZXYtPmlycSwgJnpuZXRfaW50ZXJydXB0LCAwLCAiWk5ldCIsIGRldikpCisJCWdvdG8gZmFpbGVkOworCWlmIChyZXF1ZXN0X2RtYSAoem5ldC0+cnhfZG1hLCAiWk5ldCByeCIpKQorCQlnb3RvIGZyZWVfaXJxOworCWlmIChyZXF1ZXN0X2RtYSAoem5ldC0+dHhfZG1hLCAiWk5ldCB0eCIpKQorCQlnb3RvIGZyZWVfcnhfZG1hOworCWlmICghcmVxdWVzdF9yZWdpb24gKHpuZXQtPnNpYV9iYXNlLCB6bmV0LT5zaWFfc2l6ZSwgIlpOZXQgU0lBIikpCisJCWdvdG8gZnJlZV90eF9kbWE7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoZGV2LT5iYXNlX2FkZHIsIHpuZXQtPmlvX3NpemUsICJaTmV0IEkvTyIpKQorCQlnb3RvIGZyZWVfc2lhOworCisJcmV0dXJuIDA7CQkJCS8qIEhhcHB5ICEgKi8KKworIGZyZWVfc2lhOgorCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOworIGZyZWVfdHhfZG1hOgorCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlmcmVlX2RtYSAoem5ldC0+dHhfZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrIChmbGFncyk7CisgZnJlZV9yeF9kbWE6CisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOworCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKKyBmcmVlX2lycToKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisgZmFpbGVkOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgem5ldF9yZWxlYXNlX3Jlc291cmNlcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQorCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOworCXJlbGVhc2VfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgem5ldC0+aW9fc2l6ZSk7CisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWZyZWVfZG1hICh6bmV0LT50eF9kbWEpOworCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOworCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7Cit9CisKKy8qIEtlZXAgdGhlIG1hZ2ljYWwgU0lBIHN0dWZmIGluIGEgc2luZ2xlIGZ1bmN0aW9uLi4uICovCitzdGF0aWMgdm9pZCB6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb24pCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyIHY7CisKKwkvKiBUdXJuIG9uL29mZiB0aGUgODI1MDEgU0lBLCB1c2luZyB6ZW5pdGgtc3BlY2lmaWMgbWFnaWMuICovCisJLyogU2VsZWN0IExBTiBjb250cm9sIHJlZ2lzdGVyICovCisJb3V0YigweDEwLCB6bmV0LT5zaWFfYmFzZSk7CisKKwlpZiAob24pCisJCXYgPSBpbmIoem5ldC0+c2lhX2Jhc2UgKyAxKSB8IDB4ODQ7CisJZWxzZQorCQl2ID0gaW5iKHpuZXQtPnNpYV9iYXNlICsgMSkgJiB+MHg4NDsKKwkJCisJb3V0Yih2LCB6bmV0LT5zaWFfYmFzZSsxKTsgLyogVHVybiBvbi9vZmYgTEFOIHBvd2VyIChiaXQgMikuICovCit9CisKKy8qIEluaXQgdGhlIGk4MjU5Mywgd2l0aCBjdXJyZW50IHByb21pc2MvbWNhc3QgY29uZmlndXJhdGlvbi4KKyAgIEFsc28gdXNlZCBmcm9tIGhhcmR3YXJlX2luaXQuICovCitzdGF0aWMgdm9pZCB6bmV0X3NldF9tdWx0aWNhc3RfbGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBpODI1OTNfY29uZl9ibG9jayAqY2ZibGsgPSAmem5ldC0+aTU5M19pbml0OworCisJbWVtc2V0KGNmYmxrLCAweDAwLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisJCisgICAgICAgIC8qIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrLiAgV2hhdCBhbiB1bmRvY3VtZW50ZWQgbmlnaHRtYXJlLgorCSAgIFRoZSBmaXJzdCBzZXQgb2YgdmFsdWVzIGFyZSB0aG9zZSBzdWdnZXN0ZWQgKHdpdGhvdXQgZXhwbGFuYXRpb24pCisJICAgZm9yIGV0aGVybmV0IGluIHRoZSBJbnRlbCA4MjU4NiBkYXRhYm9vay4gIFRoZSByZXN0IGFwcGVhciB0byBiZQorCSAgIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCBleGNlcHQgZm9yIGNyeXB0aWMgbm90ZXMgaW4gdGhlIENyeW53cgorCSAgIHBhY2tldCBkcml2ZXIuICBUaGlzIGRyaXZlciB1c2VzIHRoZSBDcnlud3IgdmFsdWVzIHZlcmJhdGltLiAqLworCisJLyogbWF6IDogUmV3cml0dGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSB3YW52ZWxhbiBpbmNsdWRlcy4KKwkgICBBdCBsZWFzdCB3ZSBoYXZlIG5hbWVzLCBub3QganVzdCBibGluZCB2YWx1ZXMgKi8KKwkKKwkvKiBCeXRlIDAgKi8KKwljZmJsay0+Zmlmb19saW1pdCA9IDEwOwkvKiA9IDE2IEIgcnggYW5kIDgwIEIgdHggZmlmbyB0aHJlc2hvbGRzICovCisJY2ZibGstPmZvcmduZXNpID0gMDsJLyogMD04MkM1MDEsIDE9QU1ENzk5MkIgY29tcGF0aWJpbGl0eSAqLworCWNmYmxrLT5maWZvXzMyID0gMTsKKwljZmJsay0+ZDZtb2QgPSAwOyAgCS8qIFJ1biBpbiBpODI1OTMgYWR2YW5jZWQgbW9kZSAqLworCWNmYmxrLT50aHJvdHRsZV9lbmIgPSAxOworCisJLyogQnl0ZSAxICovCisJY2ZibGstPnRocm90dGxlID0gODsJLyogQ29udGludW91cyB3L2ludGVycnVwdHMsIDEyOC1jbG9jayBETUEuICovCisJY2ZibGstPmNudHJ4aW50ID0gMDsJLyogZW5hYmxlIGNvbnRpbnVvdXMgbW9kZSByZWNlaXZlIGludGVycnVwdHMgKi8KKwljZmJsay0+Y29udGluID0gMTsJLyogZW5hYmxlIGNvbnRpbnVvdXMgbW9kZSAqLworCisJLyogQnl0ZSAyICovCisJY2ZibGstPmFkZHJfbGVuID0gRVRIX0FMRU47CisJY2ZibGstPmFjbG9jID0gMTsJLyogRGlzYWJsZSBzb3VyY2UgYWRkciBpbnNlcnRpb24gYnkgaTgyNTkzICovCisJY2ZibGstPnByZWFtYl9sZW4gPSAyOwkvKiA4IGJ5dGVzIHByZWFtYmxlICovCisJY2ZibGstPmxvb3BiYWNrID0gMDsJLyogTG9vcGJhY2sgb2ZmICovCisgIAorCS8qIEJ5dGUgMyAqLworCWNmYmxrLT5saW5fcHJpbyA9IDA7CS8qIERlZmF1bHQgcHJpb3JpdGllcyAmIGJhY2tvZmYgbWV0aG9kcy4gKi8KKwljZmJsay0+dGJvZnN0b3AgPSAwOworCWNmYmxrLT5leHBfcHJpbyA9IDA7CisJY2ZibGstPmJvZl9tZXQgPSAwOworICAKKwkvKiBCeXRlIDQgKi8KKwljZmJsay0+aWZybV9zcGMgPSA2OwkvKiA5NiBiaXQgdGltZXMgaW50ZXJmcmFtZSBzcGFjaW5nICovCisJCisJLyogQnl0ZSA1ICovCisJY2ZibGstPnNsb3R0aW1fbG93ID0gMDsgLyogNTEyIGJpdCB0aW1lcyBzbG90IHRpbWUgKGxvdykgKi8KKwkKKwkvKiBCeXRlIDYgKi8KKwljZmJsay0+c2xvdHRpbV9oaSA9IDI7CS8qIDUxMiBiaXQgdGltZXMgc2xvdCB0aW1lIChoaWdoKSAqLworCWNmYmxrLT5tYXhfcmV0ciA9IDE1OwkvKiAxNSBjb2xsaXNpb25zIHJldHJpZXMgKi8KKwkKKwkvKiBCeXRlIDcgKi8KKwljZmJsay0+cHJtaXNjID0gKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMSA6IDApOyAvKiBQcm9taXNjdW91cyBtb2RlICovCisJY2ZibGstPmJjX2RpcyA9IDA7CS8qIEVuYWJsZSBicm9hZGNhc3QgcmVjZXB0aW9uICovCisJY2ZibGstPmNyc18xID0gMDsJLyogRG9uJ3QgdHJhbnNtaXQgd2l0aG91dCBjYXJyaWVyIHNlbnNlICovCisJY2ZibGstPm5vY3JjX2lucyA9IDA7CS8qIGk4MjU5MyBnZW5lcmF0ZXMgQ1JDICovCisJY2ZibGstPmNyY18xNjMyID0gMDsJLyogMzItYml0IEF1dG9kaW4tSUkgQ1JDICovCisJY2ZibGstPmNyc19jZHQgPSAwOwkvKiBDRCBub3QgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgQ1MgKi8KKwkKKwkvKiBCeXRlIDggKi8KKwljZmJsay0+Y3NfZmlsdGVyID0gMDsgIAkvKiBDUyBpcyByZWNvZ25pemVkIGltbWVkaWF0ZWx5ICovCisJY2ZibGstPmNyc19zcmMgPSAwOwkvKiBFeHRlcm5hbCBjYXJyaWVyIHNlbnNlICovCisJY2ZibGstPmNkX2ZpbHRlciA9IDA7ICAJLyogQ0QgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworCQorCS8qIEJ5dGUgOSAqLworCWNmYmxrLT5taW5fZnJfbGVuID0gRVRIX1pMRU4gPj4gMjsgLyogTWluaW11bSBmcmFtZSBsZW5ndGggKi8KKwkKKwkvKiBCeXRlIEEgKi8KKwljZmJsay0+bG5nX3R5cCA9IDE7CS8qIFR5cGUvbGVuZ3RoIGNoZWNrcyBPRkYgKi8KKwljZmJsay0+bG5nX2ZsZCA9IDE7IAkvKiBEaXNhYmxlIDgwMi4zIGxlbmd0aCBmaWVsZCBjaGVjayAqLworCWNmYmxrLT5yeGNyY194ZiA9IDE7CS8qIERvbid0IHRyYW5zZmVyIENSQyB0byBtZW1vcnkgKi8KKwljZmJsay0+YXJ0eCA9IDE7CS8qIERpc2FibGUgYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovCisJY2ZibGstPnNhcmVjID0gMTsJLyogRGlzYWJsZSBzb3VyY2UgYWRkciB0cmlnIG9mIENEICovCisJY2ZibGstPnR4X2phYmJlciA9IDA7CS8qIERpc2FibGUgamFiYmVyIGphbSBzZXF1ZW5jZSAqLworCWNmYmxrLT5oYXNoXzEgPSAxOyAJLyogVXNlIGJpdHMgMC01IGluIG1jIGFkZHJlc3MgaGFzaCAqLworCWNmYmxrLT5sYnBrcG9sID0gMDsgCS8qIExvb3BiYWNrIHBpbiBhY3RpdmUgaGlnaCAqLworCQorCS8qIEJ5dGUgQiAqLworCWNmYmxrLT5mZHggPSAwOwkJLyogRGlzYWJsZSBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KKwkKKwkvKiBCeXRlIEMgKi8KKwljZmJsay0+ZHVtbXlfNiA9IDB4M2Y7IAkvKiBhbGwgb25lcywgRGVmYXVsdCBtdWx0aWNhc3QgYWRkcmVzc2VzICYgYmFja29mZi4gKi8KKwljZmJsay0+bXVsdF9pYSA9IDA7CS8qIE5vIG11bHRpcGxlIGluZGl2aWR1YWwgYWRkcmVzc2VzICovCisJY2ZibGstPmRpc19ib2YgPSAwOwkvKiBEaXNhYmxlIHRoZSBiYWNrb2ZmIGFsZ29yaXRobSA/ISAqLworCQorCS8qIEJ5dGUgRCAqLworCWNmYmxrLT5kdW1teV8xID0gMTsgCS8qIHNldCB0byAxICovCisJY2ZibGstPnR4X2lmc19yZXRyaWcgPSAzOyAvKiBIbW0uLi4gRGlzYWJsZWQgKi8KKwljZmJsay0+bWNfYWxsID0gKGRldi0+bWNfbGlzdCB8fCAoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpKTsvKiBtdWx0aWNhc3QgYWxsIG1vZGUgKi8KKwljZmJsay0+cmN2X21vbiA9IDA7CS8qIE1vbml0b3IgbW9kZSBkaXNhYmxlZCAqLworCWNmYmxrLT5mcmFnX2FjcHQgPSAwOwkvKiBEbyBub3QgYWNjZXB0IGZyYWdtZW50cyAqLworCWNmYmxrLT50c3RydHRycyA9IDA7CS8qIE5vIHN0YXJ0IHRyYW5zbWlzc2lvbiB0aHJlc2hvbGQgKi8KKwkKKwkvKiBCeXRlIEUgKi8KKwljZmJsay0+ZnJldHggPSAxOwkvKiBGSUZPIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworCWNmYmxrLT5ydW50X2VvcCA9IDA7CS8qIGRyb3AgInJ1bnQiIHBhY2tldHMgKi8KKwljZmJsay0+aHdfc3dfcGluID0gMDsJLyogPz8gKi8KKwljZmJsay0+YmlnX2VuZG4gPSAwOwkvKiBCaWcgRW5kaWFuID8gbm8uLi4gKi8KKwljZmJsay0+c3luY3JxcyA9IDE7CS8qIFN5bmNocm9ub3VzIERSUSBkZWFzc2VydGlvbi4uLiAqLworCWNmYmxrLT5zdHRsZW4gPSAxOyAgCS8qIDYgYnl0ZSBzdGF0dXMgcmVnaXN0ZXJzICovCisJY2ZibGstPnJ4X2VvcCA9IDA7ICAJLyogU2lnbmFsIEVPUCBvbiBwYWNrZXQgcmVjZXB0aW9uICovCisJY2ZibGstPnR4X2VvcCA9IDA7ICAJLyogU2lnbmFsIEVPUCBvbiBwYWNrZXQgdHJhbnNtaXNzaW9uICovCisKKwkvKiBCeXRlIEYgKi8KKwljZmJsay0+cmJ1Zl9zaXplID0gUlhfQlVGX1NJWkUgPj4gMTI7IC8qIFNldCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisJY2ZibGstPnJjdnN0b3AgPSAxOyAJLyogRW5hYmxlIFJlY2VpdmUgU3RvcCBSZWdpc3RlciAqLworCisJaWYgKHpuZXRfZGVidWcgPiAyKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBjaGFyICpjOworCisJCWZvciAoaSA9IDAsIGMgPSAoY2hhciAqKSBjZmJsazsgaSA8IHNpemVvZiAoKmNmYmxrKTsgaSsrKQorCQkJcHJpbnRrICgiJTAyWCAiLCBjW2ldKTsKKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJCisJKnpuZXQtPnR4X2N1cisrID0gc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jayk7CisJbWVtY3B5KHpuZXQtPnR4X2N1ciwgY2ZibGssIHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spKTsKKwl6bmV0LT50eF9jdXIgKz0gc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykvMjsKKwlvdXRiKE9QMF9DT05GSUdVUkUgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKworCS8qIFhYWCBGSVhNRSBtYXogOiBBZGQgbXVsdGljYXN0IGFkZHJlc3NlcyBoZXJlLCBzbyBoYXZpbmcgYQorCSAqIG11bHRpY2FzdCBhZGRyZXNzIGNvbmZpZ3VyZWQgaXNuJ3QgZXF1YWwgdG8gSUZGX0FMTE1VTFRJICovCit9CisMCisvKiBUaGUgWi1Ob3RlIHByb2JlIGlzIHByZXR0eSBlYXN5LiAgVGhlIE5FVElEQkxLIGV4aXN0cyBpbiB0aGUgc2FmZS10by1wcm9iZQorICAgQklPUyBhcmVhLiAgV2UganVzdCBzY2FuIGZvciB0aGUgc2lnbmF0dXJlLCBhbmQgcHVsbCB0aGUgdml0YWwgcGFyYW1ldGVycworICAgb3V0IG9mIHRoZSBzdHJ1Y3R1cmUuICovCisKK3N0YXRpYyBpbnQgX19pbml0IHpuZXRfcHJvYmUgKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IG5ldGlkYmxrICpuZXRpbmZvOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyICpwOworCWludCBlcnIgPSAtRU5PTUVNOworCisJLyogVGhpcyBjb2RlIHNjYW5zIHRoZSByZWdpb24gMHhmMDAwMCB0byAweGZmZmZmIGZvciBhICJORVRJREJMSyIuICovCisJZm9yKHAgPSAoY2hhciAqKXBoeXNfdG9fdmlydCgweGYwMDAwKTsgcCA8IChjaGFyICopcGh5c190b192aXJ0KDB4MTAwMDAwKTsgcCsrKQorCQlpZiAoKnAgPT0gJ04nICAmJiAgc3RybmNtcChwLCAiTkVUSURCTEsiLCA4KSA9PSAwKQorCQkJYnJlYWs7CisKKwlpZiAocCA+PSAoY2hhciAqKXBoeXNfdG9fdmlydCgweDEwMDAwMCkpIHsKKwkJaWYgKHpuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gWi1Ob3RlIGV0aGVybmV0IGFkYXB0b3IgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB6bmV0X3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSIChkZXYpOworCisJem5ldCA9IGRldi0+cHJpdjsKKworCW5ldGluZm8gPSAoc3RydWN0IG5ldGlkYmxrICopcDsKKwlkZXYtPmJhc2VfYWRkciA9IG5ldGluZm8tPmlvYmFzZTE7CisJZGV2LT5pcnEgPSBuZXRpbmZvLT5pcnExOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFpORVQgYXQgJSMzbHgsIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIGlzIGluIHRoZSAibmV0aWRibGsiIGF0IDB4MGYwMDAwLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IG5ldGluZm8tPm5ldGlkW2ldKTsKKworCXByaW50aygiLCB1c2luZyBJUlEgJWQgRE1BICVkIGFuZCAlZC5cbiIsIGRldi0+aXJxLCBuZXRpbmZvLT5kbWExLAorCSAgICAgICBuZXRpbmZvLT5kbWEyKTsKKworCWlmICh6bmV0X2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdmVuZG9yICclMTYuMTZzJyBJUlExICVkIElSUTIgJWQgRE1BMSAlZCBETUEyICVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbmV0aW5mby0+dmVuZG9yLAorCQkgICAgICAgbmV0aW5mby0+aXJxMSwgbmV0aW5mby0+aXJxMiwKKwkJICAgICAgIG5ldGluZm8tPmRtYTEsIG5ldGluZm8tPmRtYTIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW9iYXNlMSAlI3ggc2l6ZSAlZCBpb2Jhc2UyICUjeCBzaXplICVkIG5ldCB0eXBlICUyLjJ4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbmV0aW5mby0+aW9iYXNlMSwgbmV0aW5mby0+aW9zaXplMSwKKwkJICAgICAgIG5ldGluZm8tPmlvYmFzZTIsIG5ldGluZm8tPmlvc2l6ZTIsIG5ldGluZm8tPm5ldHR5cGUpOworCX0KKworCWlmICh6bmV0X2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXpuZXQtPnJ4X2RtYSA9IG5ldGluZm8tPmRtYTE7CisJem5ldC0+dHhfZG1hID0gbmV0aW5mby0+ZG1hMjsKKwlzcGluX2xvY2tfaW5pdCgmem5ldC0+bG9jayk7CisJem5ldC0+c2lhX2Jhc2UgPSAweGU2OwkvKiBNYWdpYyBhZGRyZXNzIGZvciB0aGUgODI1MDEgU0lBICovCisJem5ldC0+c2lhX3NpemUgPSAyOworCS8qIG1hejogRGVzcGl0ZSB0aGUgJzU5MyBiZWluZyBhZHZlcnRpc2VkIGFib3ZlIGFzIHVzaW5nIGEKKwkgKiBzaW5nbGUgOGJpdHMgSS9PIHBvcnQsIHRoaXMgZHJpdmVyIGRvZXMgbWFueSAxNmJpdHMKKwkgKiBhY2Nlc3MuIFNvIHNldCBpb19zaXplIGFjY29yZGluZ2x5ICovCisJem5ldC0+aW9fc2l6ZSAgPSAyOworCisJaWYgKCEoem5ldC0+cnhfc3RhcnQgPSBrbWFsbG9jIChETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkpCisJCWdvdG8gZnJlZV9kZXY7CisJaWYgKCEoem5ldC0+dHhfc3RhcnQgPSBrbWFsbG9jIChETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkpCisJCWdvdG8gZnJlZV9yeDsKKworCWlmICghZG1hX3BhZ2VfZXEgKHpuZXQtPnJ4X3N0YXJ0LCB6bmV0LT5yeF9zdGFydCArIChSWF9CVUZfU0laRS8yLTEpKSB8fAorCSAgICAhZG1hX3BhZ2VfZXEgKHpuZXQtPnR4X3N0YXJ0LCB6bmV0LT50eF9zdGFydCArIChUWF9CVUZfU0laRS8yLTEpKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAidHgvcnggY3Jvc3NpbmcgRE1BIGZyb250aWVycywgZ2l2aW5nIHVwXG4iKTsKKwkJZ290byBmcmVlX3R4OworCX0KKwkKKwl6bmV0LT5yeF9lbmQgPSB6bmV0LT5yeF9zdGFydCArIFJYX0JVRl9TSVpFLzI7CisJem5ldC0+dHhfYnVmX2xlbiA9IFRYX0JVRl9TSVpFLzI7CisJem5ldC0+dHhfZW5kID0gem5ldC0+dHhfc3RhcnQgKyB6bmV0LT50eF9idWZfbGVuOworCisJLyogVGhlIFpORVQtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmem5ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnpuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT5zdG9wID0gJnpuZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJPSBuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnpuZXRfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dCA9IHpuZXRfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfdHg7CisJem5ldF9kZXYgPSBkZXY7CisJcmV0dXJuIDA7CisKKyBmcmVlX3R4OgorCWtmcmVlKHpuZXQtPnR4X3N0YXJ0KTsKKyBmcmVlX3J4OgorCWtmcmVlKHpuZXQtPnJ4X3N0YXJ0KTsKKyBmcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKKwwKK3N0YXRpYyBpbnQgem5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKHpuZXRfZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHpuZXRfb3BlbigpIGNhbGxlZC5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBUaGVzZSBzaG91bGQgbmV2ZXIgZmFpbC4gIFlvdSBjYW4ndCBhZGQgZGV2aWNlcyB0byBhIHNlYWxlZCBib3ghICovCisJaWYgKHpuZXRfcmVxdWVzdF9yZXNvdXJjZXMgKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBvcGVuZWQgLS0gcmVzb3VyY2UgYnVzeT8hP1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChkZXYsIDEpOworCQorCS8qIEFjY29yZGluZyB0byB0aGUgQ3J5bndyIGRyaXZlciB3ZSBzaG91bGQgd2FpdCA1MCBtc2VjLiBmb3IgdGhlCisJICAgTEFOIGNsb2NrIHRvIHN0YWJpbGl6ZS4gIE15IGV4cGVyaW1lbnRzIGluZGljYXRlcyB0aGF0IHRoZSAnNTkzIGNhbgorCSAgIGJlIGluaXRpYWxpemVkIGltbWVkaWF0ZWx5LiAgVGhlIGRlbGF5IGlzIHByb2JhYmx5IG5lZWRlZCBmb3IgdGhlCisJICAgREMtdG8tREMgY29udmVydGVyIHRvIGNvbWUgdXAgdG8gZnVsbCB2b2x0YWdlLCBhbmQgZm9yIHRoZSBvc2NpbGxhdG9yCisJICAgdG8gYmUgc3BvdC1vbiBhdCAyME1oeiBiZWZvcmUgdHJhbnNtaXR0aW5nLgorCSAgIFVudGlsIHRoaXMgcHJvdmVzIHRvIGJlIGEgcHJvYmxlbSB3ZSByZWx5IG9uIHRoZSBoaWdoZXIgbGF5ZXJzIGZvciB0aGUKKwkgICBkZWxheSBhbmQgc2F2ZSBhbGxvY2F0aW5nIGEgdGltZXIgZW50cnkuICovCisKKwkvKiBtYXogOiBXZWxsLCBJJ20gZ2V0dGluZyBldmVyeSB0aW1lIHRoZSBmb2xsb3dpbmcgbWVzc2FnZQorCSAqIHdpdGhvdXQgdGhlIGRlbGF5IG9uIGEgNDg2QDMzLiBUaGlzIG1hY2hpbmUgaXMgbXVjaCB0b28KKwkgKiBmYXN0Li4uIDotKSBTbyBtYXliZSB0aGUgQ3J5bndyIGRyaXZlciB3YXNuJ3Qgd3JvbmcgYWZ0ZXIKKwkgKiBhbGwsIGV2ZW4gaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGx5IGhhcm1sZXNzIG9uIG15CisJICogc2V0dXAuICovCisJbWRlbGF5ICg1MCk7CisJCisJLyogVGhpcyBmb2xsb3dzIHRoZSBwYWNrZXQgZHJpdmVyJ3MgbGVhZCwgYW5kIGNoZWNrcyBmb3Igc3VjY2Vzcy4gKi8KKwlpZiAoaW5iKGlvYWRkcikgIT0gMHgxMCAmJiBpbmIoaW9hZGRyKSAhPSAweDAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSB0dXJuaW5nIG9uIHRoZSB0cmFuc2NlaXZlciBwb3dlci5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJaGFyZHdhcmVfaW5pdChkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgem5ldF90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1c2hvcnQgZXZlbnQsIHR4X3N0YXR1cywgcnhfb2Zmc2V0LCBzdGF0ZTsKKworCW91dGIgKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlldmVudCA9IGluYiAoaW9hZGRyKTsKKwlvdXRiIChDUjBfU1RBVFVTXzEsIGlvYWRkcik7CisJdHhfc3RhdHVzID0gaW53IChpb2FkZHIpOworCW91dGIgKENSMF9TVEFUVVNfMiwgaW9hZGRyKTsKKwlyeF9vZmZzZXQgPSBpbncgKGlvYWRkcik7CisJb3V0YiAoQ1IwX1NUQVRVU18zLCBpb2FkZHIpOworCXN0YXRlID0gaW5iIChpb2FkZHIpOworCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTAyeCAlMDR4ICUwNHggJTAyeCwiCisJICIgcmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lLCBldmVudCwgdHhfc3RhdHVzLCByeF9vZmZzZXQsIHN0YXRlKTsKKwlpZiAodHhfc3RhdHVzID09IFRYX0xPU1RfQ1JTKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFR4IGNhcnJpZXIgZXJyb3IsIGNoZWNrIHRyYW5zY2VpdmVyIGNhYmxlLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJb3V0YiAoT1AwX1JFU0VULCBpb2FkZHIpOworCWhhcmR3YXJlX2luaXQgKGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIGludCB6bmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKworCWlmICh6bmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBaTmV0X3NlbmRfcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkKKwkvKiBDaGVjayB0aGF0IHRoZSBwYXJ0IGhhc24ndCByZXNldCBpdHNlbGYsIHByb2JhYmx5IGZyb20gc3VzcGVuZC4gKi8KKwlvdXRiKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlpZiAoaW53KGlvYWRkcikgPT0gMHgwMDEwICYmCisJICAgIGludyhpb2FkZHIpID09IDB4MDAwMCAmJgorCSAgICBpbncoaW9hZGRyKSA9PSAweDAwMTApIHsKKwkJaWYgKHpuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzIDogd2FraW5nIHVwXG4iLCBkZXYtPm5hbWUpOworCQloYXJkd2FyZV9pbml0KGRldik7CisJCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMSk7CisJfQorCisJaWYgKDEpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0gKHZvaWQgKilza2ItPmRhdGE7CisJCXVzaG9ydCAqdHhfbGluayA9IHpuZXQtPnR4X2N1ciAtIDE7CisJCXVzaG9ydCBybmRfbGVuID0gKGxlbmd0aCArIDEpPj4xOworCQkKKwkJem5ldC0+c3RhdHMudHhfYnl0ZXMrPWxlbmd0aDsKKworCQlpZiAoem5ldC0+dHhfY3VyID49IHpuZXQtPnR4X2VuZCkKKwkJICB6bmV0LT50eF9jdXIgPSB6bmV0LT50eF9zdGFydDsKKwkJKnpuZXQtPnR4X2N1cisrID0gbGVuZ3RoOworCQlpZiAoem5ldC0+dHhfY3VyICsgcm5kX2xlbiArIDEgPiB6bmV0LT50eF9lbmQpIHsKKwkJCWludCBzZW1pX2NudCA9ICh6bmV0LT50eF9lbmQgLSB6bmV0LT50eF9jdXIpPDwxOyAvKiBDdnJ0IHRvIGJ5dGUgY250LiAqLworCQkJbWVtY3B5KHpuZXQtPnR4X2N1ciwgYnVmLCBzZW1pX2NudCk7CisJCQlybmRfbGVuIC09IHNlbWlfY250Pj4xOworCQkJbWVtY3B5KHpuZXQtPnR4X3N0YXJ0LCBidWYgKyBzZW1pX2NudCwgbGVuZ3RoIC0gc2VtaV9jbnQpOworCQkJem5ldC0+dHhfY3VyID0gem5ldC0+dHhfc3RhcnQgKyBybmRfbGVuOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHpuZXQtPnR4X2N1ciwgYnVmLCBza2ItPmxlbik7CisJCQl6bmV0LT50eF9jdXIgKz0gcm5kX2xlbjsKKwkJfQorCQkqem5ldC0+dHhfY3VyKysgPSAwOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ6bmV0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCSp0eF9saW5rID0gT1AwX1RSQU5TTUlUIHwgQ1IwX0NITkw7CisJCQkvKiBJcyB0aGlzIGFsd2F5cyBzYWZlIHRvIGRvPyAqLworCQkJb3V0YihPUDBfVFJBTlNNSVQgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmem5ldC0+bG9jaywgZmxhZ3MpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCQlpZiAoem5ldF9kZWJ1ZyA+IDQpCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdHRlciBxdWV1ZWQsIGxlbmd0aCAlZC5cbiIsIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwl9CisJZGV2X2tmcmVlX3NrYihza2IpOyAKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFpORVQgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgem5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCWludCBpb2FkZHI7CisJaW50IGJvZ3VzY250ID0gMjA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInpuZXRfaW50ZXJydXB0KCk6IElSUSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrICgmem5ldC0+bG9jayk7CisJCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlkbyB7CisJCXVzaG9ydCBzdGF0dXMgPSBpbmIoaW9hZGRyKTsKKwkJaWYgKHpuZXRfZGVidWcgPiA1KSB7CisJCQl1c2hvcnQgcmVzdWx0LCByeF9wdHIsIHJ1bm5pbmc7CisJCQlvdXRiKENSMF9TVEFUVVNfMSwgaW9hZGRyKTsKKwkJCXJlc3VsdCA9IGludyhpb2FkZHIpOworCQkJb3V0YihDUjBfU1RBVFVTXzIsIGlvYWRkcik7CisJCQlyeF9wdHIgPSBpbncoaW9hZGRyKTsKKwkJCW91dGIoQ1IwX1NUQVRVU18zLCBpb2FkZHIpOworCQkJcnVubmluZyA9IGluYihpb2FkZHIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlMDJ4LCAlMDR4ICUwNHggJTAyeCBzZXJpYWwgJWQuXG4iLAorCQkJCSBkZXYtPm5hbWUsIHN0YXR1cywgcmVzdWx0LCByeF9wdHIsIHJ1bm5pbmcsIGJvZ3VzY250KTsKKwkJfQorCQlpZiAoKHN0YXR1cyAmIFNSMF9JTlRFUlJVUFQpID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfRE9ORSB8fAorCQkgICAgKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfUkVUUkFOU01JVF9ET05FIHx8CisJCSAgICAoc3RhdHVzICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSkgeworCQkJaW50IHR4X3N0YXR1czsKKwkJCW91dGIoQ1IwX1NUQVRVU18xLCBpb2FkZHIpOworCQkJdHhfc3RhdHVzID0gaW53KGlvYWRkcik7CisJCQkvKiBJdCdzIHVuZG9jdW1lbnRlZCwgYnV0IHR4X3N0YXR1cyBzZWVtcyB0byBtYXRjaCB0aGUgaTgyNTg2LiAqLworCQkJaWYgKHR4X3N0YXR1cyAmIFRYX09LKSB7CisJCQkJem5ldC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCXpuZXQtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhfc3RhdHVzICYgVFhfTkNPTF9NQVNLOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHhfc3RhdHVzICYgKFRYX0xPU1RfQ1RTIHwgVFhfTE9TVF9DUlMpKQorCQkJCQl6bmV0LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUWF9VTkRfUlVOKQorCQkJCQl6bmV0LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCWlmICghKHR4X3N0YXR1cyAmIFRYX0hSVF9CRUFUKSkKKwkJCQkJem5ldC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUWF9NQVhfQ09MKQorCQkJCQl6bmV0LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCS8qIC4uLmFuZCB0aGUgY2F0Y2gtYWxsLiAqLworCQkJCWlmICgodHhfc3RhdHVzIHwgKFRYX0xPU1RfQ1JTIHwgVFhfTE9TVF9DVFMgfCBUWF9VTkRfUlVOIHwgVFhfSFJUX0JFQVQgfCBUWF9NQVhfQ09MKSkgIT0gKFRYX0xPU1RfQ1JTIHwgVFhfTE9TVF9DVFMgfCBUWF9VTkRfUlVOIHwgVFhfSFJUX0JFQVQgfCBUWF9NQVhfQ09MKSkKKwkJCQkJem5ldC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJCQkvKiBUcmFuc2NlaXZlciBtYXkgYmUgc3R1Y2sgaWYgY2FibGUKKwkJCQkgKiB3YXMgcmVtb3ZlZCB3aGlsZSBlbWl0aW5nIGEKKwkJCQkgKiBwYWNrZXQuIEZsaXAgaXQgb2ZmLCB0aGVuIG9uIHRvCisJCQkJICogcmVzZXQgaXQuIFRoaXMgaXMgdmVyeSBlbXBpcmljYWwsCisJCQkJICogYnV0IGl0IHNlZW1zIHRvIHdvcmsuICovCisJCQkJCisJCQkJem5ldF90cmFuc2NlaXZlcl9wb3dlciAoZGV2LCAwKTsKKwkJCQl6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChkZXYsIDEpOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJfQorCisJCWlmICgoc3RhdHVzICYgU1IwX1JFQ0VQVElPTikgfHwKKwkJICAgIChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1NUT1BfUkVHX0hJVCkgeworCQkJem5ldF9yeChkZXYpOworCQl9CisJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIHdlJ3ZlIGhhbmRsZWQuICovCisJCW91dGIoQ1IwX0lOVF9BQ0ssIGlvYWRkcik7CisJfSB3aGlsZSAoYm9ndXNjbnQtLSk7CisKKwlzcGluX3VubG9jayAoJnpuZXQtPmxvY2spOworCQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCB6bmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSAxOworCXNob3J0IG5leHRfZnJhbWVfZW5kX29mZnNldCA9IDA7IAkJLyogT2Zmc2V0IG9mIG5leHQgZnJhbWUgc3RhcnQuICovCisJc2hvcnQgKmN1cl9mcmFtZV9lbmQ7CisJc2hvcnQgY3VyX2ZyYW1lX2VuZF9vZmZzZXQ7CisKKwlvdXRiKENSMF9TVEFUVVNfMiwgaW9hZGRyKTsKKwljdXJfZnJhbWVfZW5kX29mZnNldCA9IGludyhpb2FkZHIpOworCisJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0ID09IHpuZXQtPnJ4X2N1ciAtIHpuZXQtPnJ4X3N0YXJ0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnRlcnJ1cHRlZCwgYnV0IG5vdGhpbmcgdG8gcmVjZWl2ZSwgb2Zmc2V0ICUwM3guXG4iLAorCQkJICAgZGV2LT5uYW1lLCBjdXJfZnJhbWVfZW5kX29mZnNldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBVc2Ugc2FtZSBtZXRob2QgYXMgdGhlIENyeW53ciBkcml2ZXI6IGNvbnN0cnVjdCBhIGZvcndhcmQgbGlzdCBpbgorCSAgIHRoZSBzYW1lIGFyZWEgb2YgdGhlIGJhY2t3YXJkcyBsaW5rcyB3ZSBub3cgaGF2ZS4gIFRoaXMgYWxsb3dzIHVzIHRvCisJICAgcGFzcyBwYWNrZXRzIHRvIHRoZSB1cHBlciBsYXllcnMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWNlaXZlZCAtLQorCSAgIGltcG9ydGFudCBmb3IgZmFzdC1wYXRoIHNlcXVlbnRpYWwgb3BlcmF0aW9ucy4gKi8KKwkgd2hpbGUgKHpuZXQtPnJ4X3N0YXJ0ICsgY3VyX2ZyYW1lX2VuZF9vZmZzZXQgIT0gem5ldC0+cnhfY3VyCisJCQkmJiArK2JvZ3VzY291bnQgPCA1KSB7CisJCXVuc2lnbmVkIHNob3J0IGhpX2NudCwgbG9fY250LCBoaV9zdGF0dXMsIGxvX3N0YXR1czsKKwkJaW50IGNvdW50LCBzdGF0dXM7CisKKwkJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0IDwgNCkgeworCQkJLyogT2ggbm8sIHdlIGhhdmUgYSBzcGVjaWFsIGNhc2U6IHRoZSBmcmFtZSB0cmFpbGVyIHdyYXBzIGFyb3VuZAorCQkJICAgdGhlIGVuZCBvZiB0aGUgcmluZyBidWZmZXIuICBXZSd2ZSBzYXZlZCBzcGFjZSBhdCB0aGUgZW5kIG9mCisJCQkgICB0aGUgcmluZyBidWZmZXIgZm9yIGp1c3QgdGhpcyBwcm9ibGVtLiAqLworCQkJbWVtY3B5KHpuZXQtPnJ4X2VuZCwgem5ldC0+cnhfc3RhcnQsIDgpOworCQkJY3VyX2ZyYW1lX2VuZF9vZmZzZXQgKz0gKFJYX0JVRl9TSVpFLzIpOworCQl9CisJCWN1cl9mcmFtZV9lbmQgPSB6bmV0LT5yeF9zdGFydCArIGN1cl9mcmFtZV9lbmRfb2Zmc2V0IC0gNDsKKworCQlsb19zdGF0dXMgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQloaV9zdGF0dXMgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQlzdGF0dXMgPSAoKGhpX3N0YXR1cyAmIDB4ZmYpIDw8IDgpICsgKGxvX3N0YXR1cyAmIDB4ZmYpOworCQlsb19jbnQgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQloaV9jbnQgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQljb3VudCA9ICgoaGlfY250ICYgMHhmZikgPDwgOCkgKyAobG9fY250ICYgMHhmZik7CisKKwkJaWYgKHpuZXRfZGVidWcgPiA1KQorCQkgIHByaW50ayhLRVJOX0RFQlVHICJDb25zdHJ1Y3RpbmcgdHJhaWxlciBhdCBsb2NhdGlvbiAlMDN4LCAlMDR4ICUwNHggJTA0eCAlMDR4IgorCQkJCSAiIGNvdW50ICUjeCBzdGF0dXMgJTA0eC5cbiIsCisJCQkJIGN1cl9mcmFtZV9lbmRfb2Zmc2V0PDwxLCBsb19zdGF0dXMsIGhpX3N0YXR1cywgbG9fY250LCBoaV9jbnQsCisJCQkJIGNvdW50LCBzdGF0dXMpOworCQljdXJfZnJhbWVfZW5kWy00XSA9IHN0YXR1czsKKwkJY3VyX2ZyYW1lX2VuZFstM10gPSBuZXh0X2ZyYW1lX2VuZF9vZmZzZXQ7CisJCWN1cl9mcmFtZV9lbmRbLTJdID0gY291bnQ7CisJCW5leHRfZnJhbWVfZW5kX29mZnNldCA9IGN1cl9mcmFtZV9lbmRfb2Zmc2V0OworCQljdXJfZnJhbWVfZW5kX29mZnNldCAtPSAoKGNvdW50ICsgMSk+PjEpICsgMzsKKwkJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0IDwgMCkKKwkJICBjdXJfZnJhbWVfZW5kX29mZnNldCArPSBSWF9CVUZfU0laRS8yOworCX07CisKKwkvKiBOb3cgc3RlcCAgZm9yd2FyZCB0aHJvdWdoIHRoZSBsaXN0LiAqLworCWRvIHsKKwkJdXNob3J0ICp0aGlzX3JmcF9wdHIgPSB6bmV0LT5yeF9zdGFydCArIG5leHRfZnJhbWVfZW5kX29mZnNldDsKKwkJaW50IHN0YXR1cyA9IHRoaXNfcmZwX3B0clstNF07CisJCWludCBwa3RfbGVuID0gdGhpc19yZnBfcHRyWy0yXTsKKwkgIAorCQlpZiAoem5ldF9kZWJ1ZyA+IDUpCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkxvb2tpbmcgYXQgdHJhaWxlciBlbmRpbmcgYXQgJTA0eCBzdGF0dXMgJTA0eCBsZW5ndGggJTAzeCIKKwkJCQkgIiBuZXh0ICUwNHguXG4iLCBuZXh0X2ZyYW1lX2VuZF9vZmZzZXQ8PDEsIHN0YXR1cywgcGt0X2xlbiwKKwkJCQkgdGhpc19yZnBfcHRyWy0zXTw8MSk7CisJCS8qIE9uY2UgYWdhaW4gd2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgaTgyNTg2IGRvY3MgYXBwbHkuICovCisJCWlmICggISAoc3RhdHVzICYgUlhfUkNWX09LKSkgeyAvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQl6bmV0LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJSKSB6bmV0LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUlhfQUxHX0VSUikgem5ldC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisjaWYgMAorCQkJaWYgKHN0YXR1cyAmIDB4MDIwMCkgem5ldC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgLyogV3JvbmcuICovCisJCQlpZiAoc3RhdHVzICYgMHgwMTAwKSB6bmV0LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworI2Vsc2UKKwkJCS8qIG1heiA6IFdpbGQgZ3Vlc3MuLi4gKi8KKwkJCWlmIChzdGF0dXMgJiBSWF9PVlJSVU4pIHpuZXQtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisjZW5kaWYKKwkJCWlmIChzdGF0dXMgJiBSWF9TUlRfRlJNKSB6bmV0LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAocGt0X2xlbiA+IDE1MzYpIHsKKwkJCXpuZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWlmICh6bmV0X2RlYnVnKQorCQkJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCXpuZXQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQlpZiAoJnpuZXQtPnJ4X2N1clsocGt0X2xlbisxKT4+MV0gPiB6bmV0LT5yeF9lbmQpIHsKKwkJCQlpbnQgc2VtaV9jbnQgPSAoem5ldC0+cnhfZW5kIC0gem5ldC0+cnhfY3VyKTw8MTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2Isc2VtaV9jbnQpLCB6bmV0LT5yeF9jdXIsIHNlbWlfY250KTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbi1zZW1pX2NudCksIHpuZXQtPnJ4X3N0YXJ0LAorCQkJCQkgICBwa3RfbGVuIC0gc2VtaV9jbnQpOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHpuZXQtPnJ4X2N1ciwgcGt0X2xlbik7CisJCQkJaWYgKHpuZXRfZGVidWcgPiA2KSB7CisJCQkJCXVuc2lnbmVkIGludCAqcGFja2V0ID0gKHVuc2lnbmVkIGludCAqKSBza2ItPmRhdGE7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJQYWNrZXQgZGF0YSBpcyAlMDh4ICUwOHggJTA4eCAlMDh4LlxuIiwgcGFja2V0WzBdLAorCQkJCQkJICAgcGFja2V0WzFdLCBwYWNrZXRbMl0sIHBhY2tldFszXSk7CisJCQkJfQorCQkgIH0KKwkJICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkgIG5ldGlmX3J4KHNrYik7CisJCSAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJICB6bmV0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCSAgem5ldC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQl6bmV0LT5yeF9jdXIgPSB0aGlzX3JmcF9wdHI7CisJCWlmICh6bmV0LT5yeF9jdXIgPj0gem5ldC0+cnhfZW5kKQorCQkJem5ldC0+cnhfY3VyIC09IFJYX0JVRl9TSVpFLzI7CisJCXVwZGF0ZV9zdG9wX2hpdChpb2FkZHIsICh6bmV0LT5yeF9jdXIgLSB6bmV0LT5yeF9zdGFydCk8PDEpOworCQluZXh0X2ZyYW1lX2VuZF9vZmZzZXQgPSB0aGlzX3JmcF9wdHJbLTNdOworCQlpZiAobmV4dF9mcmFtZV9lbmRfb2Zmc2V0ID09IDApCQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJYnJlYWs7CQkJLyogRG9uZSBmb3Igbm93ICovCisJCXRoaXNfcmZwX3B0ciA9IHpuZXQtPnJ4X3N0YXJ0ICsgbmV4dF9mcmFtZV9lbmRfb2Zmc2V0OworCX0gd2hpbGUgKC0tYm9ndXNjb3VudCk7CisKKwkvKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKKwkgICBoYXMgZG9uZSBhIG1hcmtfYmgoSU5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byB6bmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQgem5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlvdXRiKE9QMF9SRVNFVCwgaW9hZGRyKTsJCQkvKiBDTUQwX1JFU0VUICovCisKKwlpZiAoem5ldF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCS8qIFR1cm4gb2ZmIHRyYW5zY2VpdmVyIHBvd2VyLiAqLworCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMCk7CisJCisJem5ldF9yZWxlYXNlX3Jlc291cmNlcyAoZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnpuZXQtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgc3RhdCA9IGluYiAoaW9hZGRyKTsKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgZG1hX3BvcnQgPSAoKHpuZXQtPnR4X2RtYSYzKTw8MikgKyBJT19ETUEyX0JBU0U7CisJdW5zaWduZWQgYWRkciA9IGluYihkbWFfcG9ydCk7CisJc2hvcnQgcmVzaWR1ZTsKKworCWFkZHIgfD0gaW5iKGRtYV9wb3J0KSA8PCA4OworCXJlc2lkdWUgPSBnZXRfZG1hX3Jlc2lkdWUoem5ldC0+dHhfZG1hKTsKKwkJCisJaWYgKHpuZXRfZGVidWcgPiAxKSB7CisJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJTdGF0OiUwMnggQWRkcjogJTA0eCBjbnQ6JTN4XG4iLAorCQkgICAgICAgc3RhdCwgYWRkcjw8MSwgcmVzaWR1ZSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KK30KKworLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuICBXZSBoYXZlIHRvIGRvIHRoaXMgd2hlbiB0aGUgYm9hcmQgaXMgb3BlbigpZWQKKyAgIG9yIHdoZW4gd2UgY29tZSBvdXQgb2Ygc3VzcGVuZCBtb2RlLiAqLworc3RhdGljIHZvaWQgaGFyZHdhcmVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKworCXpuZXQtPnJ4X2N1ciA9IHpuZXQtPnJ4X3N0YXJ0OworCXpuZXQtPnR4X2N1ciA9IHpuZXQtPnR4X3N0YXJ0OworCisJLyogUmVzZXQgdGhlIGNoaXAsIGFuZCBzdGFydCBpdCB1cC4gKi8KKwlvdXRiKE9QMF9SRVNFVCwgaW9hZGRyKTsKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoem5ldC0+cnhfZG1hKTsgCQkvKiByZXNldCBieSBhbiBpbnRlcnJ1cHRpbmcgdGFzay4gKi8KKwljbGVhcl9kbWFfZmYoem5ldC0+cnhfZG1hKTsKKwlzZXRfZG1hX21vZGUoem5ldC0+cnhfZG1hLCBETUFfUlhfTU9ERSk7CisJc2V0X2RtYV9hZGRyKHpuZXQtPnJ4X2RtYSwgKHVuc2lnbmVkIGludCkgem5ldC0+cnhfc3RhcnQpOworCXNldF9kbWFfY291bnQoem5ldC0+cnhfZG1hLCBSWF9CVUZfU0laRSk7CisJZW5hYmxlX2RtYSh6bmV0LT5yeF9kbWEpOworCS8qIE5vdyBzZXQgdXAgdGhlIFR4IGNoYW5uZWwuICovCisJZGlzYWJsZV9kbWEoem5ldC0+dHhfZG1hKTsKKwljbGVhcl9kbWFfZmYoem5ldC0+dHhfZG1hKTsKKwlzZXRfZG1hX21vZGUoem5ldC0+dHhfZG1hLCBETUFfVFhfTU9ERSk7CisJc2V0X2RtYV9hZGRyKHpuZXQtPnR4X2RtYSwgKHVuc2lnbmVkIGludCkgem5ldC0+dHhfc3RhcnQpOworCXNldF9kbWFfY291bnQoem5ldC0+dHhfZG1hLCB6bmV0LT50eF9idWZfbGVuPDwxKTsKKwllbmFibGVfZG1hKHpuZXQtPnR4X2RtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJaWYgKHpuZXRfZGVidWcgPiAxKQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbml0aWFsaXppbmcgdGhlIGk4MjU5MywgcnggYnVmICVwIHR4IGJ1ZiAlcFxuIiwKKwkJCSBkZXYtPm5hbWUsIHpuZXQtPnJ4X3N0YXJ0LHpuZXQtPnR4X3N0YXJ0KTsKKwkvKiBEbyBhbiBlbXB0eSBjb25maWd1cmUgY29tbWFuZCwganVzdCBsaWtlIHRoZSBDcnlud3IgZHJpdmVyLiAgVGhpcworCSAgIHJlc2V0cyB0byBjaGlwIHRvIGl0cyBkZWZhdWx0IHZhbHVlcy4gKi8KKwkqem5ldC0+dHhfY3VyKysgPSAwOworCSp6bmV0LT50eF9jdXIrKyA9IDA7CisJc2hvd19kbWEoZGV2KTsKKwlvdXRiKE9QMF9DT05GSUdVUkUgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKworCXpuZXRfc2V0X211bHRpY2FzdF9saXN0IChkZXYpOworCisJKnpuZXQtPnR4X2N1cisrID0gNjsKKwltZW1jcHkoem5ldC0+dHhfY3VyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwl6bmV0LT50eF9jdXIgKz0gMzsKKwlzaG93X2RtYShkZXYpOworCW91dGIoT1AwX0lBX1NFVFVQIHwgQ1IwX0NITkwsIGlvYWRkcik7CisJc2hvd19kbWEoZGV2KTsKKworCXVwZGF0ZV9zdG9wX2hpdChpb2FkZHIsIDgxOTIpOworCWlmICh6bmV0X2RlYnVnID4gMSkgIHByaW50ayhLRVJOX0RFQlVHICJlbmFibGluZyBSeC5cbiIpOworCW91dGIoT1AwX1JDVl9FTkFCTEUsIGlvYWRkcik7CisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdG9wX2hpdChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIHNob3J0IHJ4X3N0b3Bfb2Zmc2V0KQoreworCW91dGIoT1AwX1NXSVRfVE9fUE9SVF8xIHwgQ1IwX0NITkwsIGlvYWRkcik7CisJaWYgKHpuZXRfZGVidWcgPiA1KQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIlVwZGF0aW5nIHN0b3AgaGl0IHdpdGggdmFsdWUgJTAyeC5cbiIsCisJCQkgKHJ4X3N0b3Bfb2Zmc2V0ID4+IDYpIHwgQ1IxX1NUT1BfUkVHX1VQREFURSk7CisJb3V0Yigocnhfc3RvcF9vZmZzZXQgPj4gNikgfCBDUjFfU1RPUF9SRUdfVVBEQVRFLCBpb2FkZHIpOworCW91dGIoT1AxX1NXSVRfVE9fUE9SVF8wLCBpb2FkZHIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgem5ldF9jbGVhbnVwICh2b2lkKQoreworCWlmICh6bmV0X2RldikgeworCQlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gem5ldF9kZXYtPnByaXY7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKHpuZXRfZGV2KTsKKwkJa2ZyZWUgKHpuZXQtPnJ4X3N0YXJ0KTsKKwkJa2ZyZWUgKHpuZXQtPnR4X3N0YXJ0KTsKKwkJZnJlZV9uZXRkZXYgKHpuZXRfZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0ICh6bmV0X3Byb2JlKTsKK21vZHVsZV9leGl0ICh6bmV0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvem9ycm84MzkwLmMgYi9kcml2ZXJzL25ldC96b3JybzgzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI2ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvem9ycm84MzkwLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiAgQW1pZ2EgTGludXgvbTY4ayBhbmQgTGludXgvUFBDIFpvcnJvIE5TODM5MCBFdGhlcm5ldCBEcml2ZXIKKyAqCisgKiAgKEMpIENvcHlyaWdodCAxOTk4LTIwMDAgYnkgc29tZSBFbGl0aXN0IDY4MHgwIFVzZXJzKFRNKQorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIGFsbCB0aGUgb3RoZXIgTkUyMDAwIGRyaXZlcnMgZm9yIExpbnV4CisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgQXJpYWRuZSBJSSBhbmQgWC1TdXJmIGFyZSBab3Jyby1JSSBib2FyZHMgY29udGFpbmluZyBSZWFsdGVrIFJUTDgwMTlBUworICogIEV0aGVybmV0IENvbnRyb2xsZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKworI2RlZmluZSBEUlZfTkFNRQkiem9ycm84MzkwIgorCisjZGVmaW5lIE5FX0JBU0UJCShkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECQkoMHgwMCoyKQorI2RlZmluZSBORV9EQVRBUE9SVAkoMHgxMCoyKQkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0LiAqLworI2RlZmluZSBORV9SRVNFVAkoMHgxZioyKQkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIE5FX0lPX0VYVEVOVAkoMHgyMCoyKQorCisjZGVmaW5lIE5FX0VOMF9JU1IJKDB4MDcqMikKKyNkZWZpbmUgTkVfRU4wX0RDRkcJKDB4MGUqMikKKworI2RlZmluZSBORV9FTjBfUlNBUkxPCSgweDA4KjIpCisjZGVmaW5lIE5FX0VOMF9SU0FSSEkJKDB4MDkqMikKKyNkZWZpbmUgTkVfRU4wX1JDTlRMTwkoMHgwYSoyKQorI2RlZmluZSBORV9FTjBfUlhDUgkoMHgwYyoyKQorI2RlZmluZSBORV9FTjBfVFhDUgkoMHgwZCoyKQorI2RlZmluZSBORV9FTjBfUkNOVEhJCSgweDBiKjIpCisjZGVmaW5lIE5FX0VOMF9JTVIJKDB4MGYqMikKKworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworCisjZGVmaW5lIFdPUkRTV0FQKGEpCSgoKChhKT4+OCkmMHhmZikgfCAoKGEpPDw4KSkKKworCitzdGF0aWMgc3RydWN0IGNhcmRfaW5mbyB7CisgICAgem9ycm9faWQgaWQ7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUyLCAiQXJpYWRuZSBJSSIsIDB4MDYwMCB9LAorICAgIHsgWk9SUk9fUFJPRF9JTkRJVklEVUFMX0NPTVBVVEVSU19YX1NVUkYsICJYLVN1cmYiLCAweDg2MDAgfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHpvcnJvODM5MF9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCQljb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpOworc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBib2FyZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIpOworc3RhdGljIGludCB6b3JybzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgem9ycm84MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgem9ycm84MzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgem9ycm84MzkwX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeik7CisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIHpvcnJvODM5MF96b3Jyb190YmxbXSBfX2RldmluaXRkYXRhID0geworICAgIHsgWk9SUk9fUFJPRF9WSUxMQUdFX1RST05JQ19BUklBRE5FMiwgfSwKKyAgICB7IFpPUlJPX1BST0RfSU5ESVZJRFVBTF9DT01QVVRFUlNfWF9TVVJGLCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciB6b3JybzgzOTBfZHJpdmVyID0geworICAgIC5uYW1lCT0gInpvcnJvODM5MCIsCisgICAgLmlkX3RhYmxlCT0gem9ycm84MzkwX3pvcnJvX3RibCwKKyAgICAucHJvYmUJPSB6b3JybzgzOTBfaW5pdF9vbmUsCisgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHpvcnJvODM5MF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHpvcnJvODM5MF9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCQljb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBpb2FkZHI7CisgICAgaW50IGVyciwgaTsKKworICAgIGZvciAoaSA9IEFSUkFZX1NJWkUoY2FyZHMpLTE7IGkgPj0gMDsgaS0tKQorCWlmICh6LT5pZCA9PSBjYXJkc1tpXS5pZCkKKwkgICAgYnJlYWs7CisgICAgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKyAgICBpb2FkZHIgPSBib2FyZCtjYXJkc1tpXS5vZmZzZXQ7CisgICAgZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisgICAgaWYgKCFkZXYpCisJcmV0dXJuIC1FTk9NRU07CisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKjIsIERSVl9OQU1FKSkgeworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgaWYgKChlcnIgPSB6b3JybzgzOTBfaW5pdChkZXYsIGJvYXJkLCBjYXJkc1tpXS5uYW1lLAorCQkJICAgICAgWlRXT19WQUREUihpb2FkZHIpKSkpIHsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQqMik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgICB6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB6b3JybzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyOworICAgIHVuc2lnbmVkIGNoYXIgU0FfcHJvbVszMl07CisgICAgaW50IHN0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKyAgICBzdGF0aWMgdTMyIHpvcnJvODM5MF9vZmZzZXRzWzE2XSA9IHsKKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBhLCAweDBjLCAweDBlLAorCTB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsCisgICAgfTsKKworICAgIC8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCisgICAgeworCXVuc2lnbmVkIGxvbmcgcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwl6X3dyaXRlYih6X3JlYWRiKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOworCisJd2hpbGUgKCh6X3JlYWRiKGlvYWRkciArIE5FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJICAgIGlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBub3QgZm91bmQgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJICAgIH0KKworCXpfd3JpdGViKDB4ZmYsIGlvYWRkciArIE5FX0VOMF9JU1IpOwkJLyogQWNrIGFsbCBpbnRyLiAqLworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorICAgICAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKyAgICAgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisgICAgICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKyAgICB7CisJc3RydWN0IHsKKwkgICAgdTMyIHZhbHVlOworCSAgICB1MzIgb2Zmc2V0OworCX0gcHJvZ3JhbV9zZXFbXSA9IHsKKwkgICAge0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIE5FX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCSAgICB7MHg0OCwJTkVfRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCSAgICB7MHhGRiwJTkVfRU4wX0lTUn0sCisJICAgIHtFODM5MF9SWE9GRiwgTkVfRU4wX1JYQ1J9LAkvKiAweDIwICBTZXQgdG8gbW9uaXRvciAqLworCSAgICB7RTgzOTBfVFhPRkYsIE5FX0VOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJICAgIHszMiwJTkVfRU4wX1JDTlRMT30sCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCSAgICB7MHgwMCwJTkVfRU4wX1JTQVJISX0sCisJICAgIHtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgTkVfQ01EfSwKKwl9OworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykgeworCSAgICB6X3dyaXRlYihwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKwl9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJU0FfcHJvbVtpXSA9IHpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCSh2b2lkKXpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworICAgIH0KKworICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCisgICAgel93cml0ZWIoMHg0OSwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOworICAgIHN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOworICAgIHN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIGRldi0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCisgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlaV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBEUlZfTkFNRSwgZGV2KTsKKyAgICBpZiAoaSkgcmV0dXJuIGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisjaWZkZWYgREVCVUcKKwlwcmludGsoIiAlMi4yeCIsIFNBX3Byb21baV0pOworI2VuZGlmCisJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CisgICAgfQorCisgICAgZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSAxOworCisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlICsgVFhfUEFHRVM7CisKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZ6b3JybzgzOTBfcmVzZXRfODM5MDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmem9ycm84MzkwX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmem9ycm84MzkwX2Jsb2NrX291dHB1dDsKKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnpvcnJvODM5MF9nZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLnJlZ19vZmZzZXQgPSB6b3JybzgzOTBfb2Zmc2V0czsKKyAgICBkZXYtPm9wZW4gPSAmem9ycm84MzkwX29wZW47CisgICAgZGV2LT5zdG9wID0gJnpvcnJvODM5MF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisgICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKyAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBpZiAoZXJyKSB7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworCXJldHVybiBlcnI7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgIgorCSAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgZGV2LT5uYW1lLCBuYW1lLCBib2FyZCwKKwkgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgem9ycm84MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgem9ycm84MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaWYgKGVpX2RlYnVnID4gMSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKyAgICBpZiAoZWlfZGVidWcgPiAxKQorCXByaW50ayhLRVJOX0RFQlVHICJyZXNldHRpbmcgdGhlIDgzOTAgdD0lbGQuLi5cbiIsIGppZmZpZXMpOworCisgICAgel93cml0ZWIoel9yZWFkYihORV9CQVNFICsgTkVfUkVTRVQpLCBORV9CQVNFICsgTkVfUkVTRVQpOworCisgICAgZWlfc3RhdHVzLnR4aW5nID0gMDsKKyAgICBlaV9zdGF0dXMuZG1haW5nID0gMDsKKworICAgIC8qIFRoaXMgY2hlY2sgX3Nob3VsZF9ub3RfIGJlIG5lY2Vzc2FyeSwgb21pdCBldmVudHVhbGx5LiAqLworICAgIHdoaWxlICgoel9yZWFkYihORV9CQVNFK05FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKwkgICAgYnJlYWs7CisJfQorICAgIHpfd3JpdGViKEVOSVNSX1JFU0VULCBORV9CQVNFICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgY250OworICAgIHNob3J0ICpwdHJzOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2dldF84MzkwX2hkciAiCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywKKwkgICBlaV9zdGF0dXMuaXJxbG9jayk7CisJcmV0dXJuOworICAgIH0KKworICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworICAgIHpfd3JpdGViKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisgICAgel93cml0ZWIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKyAgICB6X3dyaXRlYigwLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworICAgIHpfd3JpdGViKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKyAgICB6X3dyaXRlYihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCisgICAgcHRycyA9IChzaG9ydCopaGRyOworICAgIGZvciAoY250ID0gMDsgY250IDwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOyBjbnQrKykKKwkqcHRycysrID0gel9yZWFkdyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworCisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKworICAgIGhkci0+Y291bnQgPSBXT1JEU1dBUChoZHItPmNvdW50KTsKKworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiAgSWYgeW91CisgICBhcmUgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQsIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KKyAgIFRoZSBORXgwMDAgZG9lc24ndCBzaGFyZSB0aGUgb24tYm9hcmQgcGFja2V0IG1lbW9yeSAtLSB5b3UgaGF2ZSB0byBwdXQKKyAgIHRoZSBwYWNrZXQgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydCB1c2luZyB6X3dyaXRlYi4gKi8KKworc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKyAgICBzaG9ydCAqcHRyczsKKyAgICBpbnQgY250OworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX2lucHV0ICIKKwkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwKKwkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICB6X3dyaXRlYihjb3VudCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworICAgIHpfd3JpdGViKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICB6X3dyaXRlYihyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworICAgIHpfd3JpdGViKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgIGZvciAoY250ID0gMDsgY250IDwgKGNvdW50Pj4xKTsgY250KyspCisJKnB0cnMrKyA9IHpfcmVhZHcoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyAgICBpZiAoY291bnQgJiAweDAxKQorCWJ1Zltjb3VudC0xXSA9IHpfcmVhZGIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSAgIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworICAgIGludCBuaWNfYmFzZSA9IE5FX0JBU0U7CisgICAgdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisgICAgc2hvcnQgKnB0cnM7CisgICAgaW50IGNudDsKKworICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisgICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwljb3VudCsrOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVxuIiwgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLAorCSAgIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisgICAgel93cml0ZWIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKworICAgLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICB6X3dyaXRlYihjb3VudCA+PiA4LCAgIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisgICAgel93cml0ZWIoMHgwMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICB6X3dyaXRlYihzdGFydF9wYWdlLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworCisgICAgel93cml0ZWIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgIGZvciAoY250ID0gMDsgY250IDwgY291bnQ+PjE7IGNudCsrKQorCXpfd3JpdGV3KCpwdHJzKyssIE5FX0JBU0UrTkVfREFUQVBPUlQpOworCisgICAgZG1hX3N0YXJ0ID0gamlmZmllczsKKworICAgIHdoaWxlICgoel9yZWFkYihORV9CQVNFICsgTkVfRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCisJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQl6b3JybzgzOTBfcmVzZXRfODM5MChkZXYpOworCQlOUzgzOTBfaW5pdChkZXYsMSk7CisJCWJyZWFrOworCX0KKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB6b3JybzgzOTBfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKKworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgTkVfSU9fRVhURU5UKjIpOworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHpvcnJvODM5MF9pbml0X21vZHVsZSh2b2lkKQoreworICAgIHJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmem9ycm84MzkwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6b3JybzgzOTBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICB6b3Jyb191bnJlZ2lzdGVyX2RyaXZlcigmem9ycm84MzkwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHpvcnJvODM5MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh6b3JybzgzOTBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==